ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDQ5NGI2ZTQuLjFkMzlhNmQgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMjgxMSw4ICsyODExLDggQEAKIE46IFN0ZWxpYW4gUG9wCiBFOiBzdGVsaWFuQHBvcGllcy5uZXQKIFA6IDEwMjREL0VEQkI2MTQ3IDdCMzYgMEUwNyAwNEJDIDExREMgQTdBMCAgRDNGNyA3MTg1IDlFN0EgRURCQiA2MTQ3Ci1EOiBzb255cGksIG1leWUgZHJpdmVycywgbWN0X3UyMzIgdXNiIHNlcmlhbCBoYWNrcwotUzogUGFyaXMsIEZyYW5jZQorRDogcmFuZG9tIGtlcm5lbCBoYWNrcworUzogUGFpbXBvbnQsIEZyYW5jZQogCiBOOiBQZXRlIFBvcG92CiBFOiBwZXRlX3BvcG92QHlhaG9vLmNvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3RoZXJtYWwtbm90aWZpY2F0aW9uIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3RoZXJtYWwtbm90aWZpY2F0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjNlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvdGhlcm1hbC1ub3RpZmljYXRpb24KQEAgLTAsMCArMSw0IEBACitXaGF0OgkJQSBub3RpZmljYXRpb24gbWVjaGFuaXNtIGZvciB0aGVybWFsIHJlbGF0ZWQgZXZlbnRzCitEZXNjcmlwdGlvbjoKKwlUaGlzIGludGVyZmFjZSBlbmFibGVzIG5vdGlmaWNhdGlvbiBmb3IgdGhlcm1hbCByZWxhdGVkIGV2ZW50cy4KKwlUaGUgbm90aWZpY2F0aW9uIGlzIGluIHRoZSBmb3JtIG9mIGEgbmV0bGluayBldmVudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKaW5kZXggOWU0NTQxZC4uZWRmZjY2MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKQEAgLTI2LDMgKzI2LDEyIEBACiAJCXNjaGVkdWxlciBpcyBjaG9zZW4uIFRyaWdnZXIgc3BlY2lmaWMgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluCiAJCS9zeXMvY2xhc3MvbGVkcy88bGVkPiBvbmNlIGEgZ2l2ZW4gdHJpZ2dlciBpcyBzZWxlY3RlZC4KIAorV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9pbnZlcnRlZAorRGF0ZToJCUphbnVhcnkgMjAxMQorS2VybmVsVmVyc2lvbjoJMi42LjM4CitDb250YWN0OglSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CitEZXNjcmlwdGlvbjoKKwkJSW52ZXJ0IHRoZSBMRUQgb24vb2ZmIHN0YXRlLiBUaGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpYyB0bworCQlncGlvIGFuZCBiYWNrbGlnaHQgdHJpZ2dlcnMuIEluIGNhc2Ugb2YgdGhlIGJhY2tsaWdodCB0cmlnZ2VyLAorCQlpdCBpcyB1c2VmdWxsIHdoZW4gZHJpdmluZyBhIExFRCB3aGljaCBpcyBpbnRlbmRlZCB0byBpbmRpY2F0ZQorCQlhIGRldmljZSBpbiBhIHN0YW5kYnkgbGlrZSBzdGF0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZQppbmRleCAwNjNiZGE3Li42OThiODA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lCkBAIC0xLDQgKzEsNCBAQAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX2RwaQorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2FjdHVhbF9kcGkKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CUl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCB0aGUgZHBpIHNldHRpbmcgb2YgdGhlIG1vdXNlIHdpdGggdGhlCkBAIC0xNywxMyArMTcsMTMgQEAKIAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vZmlybXdhcmVfdmVyc2lvbgorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2Zpcm13YXJlX3ZlcnNpb24KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIHJhdyBpbnRlZ2VyIHZlcnNpb24gbnVtYmVyIG9mIHRoZQpAQCAtMzMsNyArMzMsNyBAQAogCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzgKIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV0KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi9wcm9maWxlWzEtNV0KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC00OCw3ICs0OCw3IEBACiAJCXN0b3JlZCBpbiB0aGUgcHJvZmlsZSBkb2Vzbid0IG5lZWQgdG8gZml0IHRoZSBudW1iZXIgb2YgdGhlCiAJCXN0b3JlLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSBzZXR0aW5ncyBzdG9yZWQgaW4gdGhlIG1vdXNlLgpAQCAtNTgsNyArNTgsNyBAQAogCQlUaGUgZGF0YSBoYXMgdG8gYmUgMzYgYnl0ZXMgbG9uZy4gVGhlIG1vdXNlIHdpbGwgcmVqZWN0IGludmFsaWQKIAkJZGF0YS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAxIHRvIDUuCkBAIC02Nyw3ICs2Nyw3IEBACiAJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCiAJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vdGN1CitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vdGN1CiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgIlRyYWNraW5nIENvbnRyb2wgVW5pdCIgd2hpY2ggbGV0cyB0aGUgdXNlcgpAQCAtNzgsNyArNzgsNyBAQAogCQlXcml0aW5nIDEgaW4gdGhpcyBmaWxlIHdpbGwgc3RhcnQgdGhlIGNhbGlicmF0aW9uIHdoaWNoIHRha2VzCiAJCWFyb3VuZCA2IHNlY29uZHMgdG8gY29tcGxldGUgYW5kIGFjdGl2YXRlcyB0aGUgVENVLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi93ZWlnaHQKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi93ZWlnaHQKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmVwbHVzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmMzBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpAQCAtMCwwICsxLDEwOCBAQAorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgcHJvZmlsZSBpbgorCQlyYW5nZSAwLTQuCisJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vZmlybXdhcmVfdmVyc2lvbgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSByYXcgaW50ZWdlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKwkJZmlybXdhcmUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlLiBVc2luZyB0aGUgaW50ZWdlciB2YWx1ZSBlYXNlcworCQlmdXJ0aGVyIHVzYWdlIGluIG90aGVyIHByb2dyYW1zLiBUbyByZWNlaXZlIHRoZSByZWFsIHZlcnNpb24KKwkJbnVtYmVyIHRoZSBkZWNpbWFsIHBvaW50IGhhcyB0byBiZSBzaGlmdGVkIDIgcG9zaXRpb25zIHRvIHRoZQorCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTIxIG1lYW5zIDEuMjEKKwkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9tYWNybworRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIGEgbWFjcm8gd2l0aCBtYXggNTAwIGtleS9idXR0b24gc3Ryb2tlcworCQlpbnRlcm5hbGx5LgorCQlXaGVuIHdyaXR0ZW4sIHRoaXMgZmlsZSBsZXRzIG9uZSBzZXQgdGhlIHNlcXVlbmNlIGZvciBhIHNwZWNpZmljCisJCWJ1dHRvbiBmb3IgYSBzcGVjaWZpYyBwcm9maWxlLiBCdXR0b24gYW5kIHByb2ZpbGUgbnVtYmVycyBhcmUKKwkJaW5jbHVkZWQgaW4gd3JpdHRlbiBkYXRhLiBUaGUgZGF0YSBoYXMgdG8gYmUgMjA4MiBieXRlcyBsb25nLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlX2J1dHRvbnMKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX2J1dHRvbnMgaG9sZHMgaW5mb3JtYXRpb25zIGFib3V0IGJ1dHRvbiBsYXlvdXQuCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIGxldHMgb25lIHdyaXRlIHRoZSByZXNwZWN0aXZlIHByb2ZpbGUKKwkJYnV0dG9ucyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDc3IGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucworRGF0ZToJCUF1Z3VzdCAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCisJCXByZXNzIG9mIGEgYnV0dG9uLiBBIHByb2ZpbGUgaXMgc3BsaXQgaW4gc2V0dGluZ3MgYW5kIGJ1dHRvbnMuCisJCXByb2ZpbGVfYnV0dG9ucyBob2xkcyBpbmZvcm1hdGlvbnMgYWJvdXQgYnV0dG9uIGxheW91dC4KKwkJV2hlbiByZWFkLCB0aGVzZSBmaWxlcyByZXR1cm4gdGhlIHJlc3BlY3RpdmUgcHJvZmlsZSBidXR0b25zLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA3NyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3Byb2ZpbGVfc2V0dGluZ3MKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKKwkJcHJlc3Mgb2YgYSBidXR0b24uIEEgcHJvZmlsZSBpcyBzcGxpdCBpbiBzZXR0aW5ncyBhbmQgYnV0dG9ucy4KKwkJcHJvZmlsZV9zZXR0aW5ncyBob2xkcyBpbmZvcm1hdGlvbnMgbGlrZSByZXNvbHV0aW9uLCBzZW5zaXRpdml0eQorCQlhbmQgbGlnaHQgZWZmZWN0cy4KKwkJV2hlbiB3cml0dGVuLCB0aGlzIGZpbGUgbGV0cyBvbmUgd3JpdGUgdGhlIHJlc3BlY3RpdmUgcHJvZmlsZQorCQlzZXR0aW5ncyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDQzIGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX3NldHRpbmdzIGhvbGRzIGluZm9ybWF0aW9ucyBsaWtlIHJlc29sdXRpb24sIHNlbnNpdGl2aXR5CisJCWFuZCBsaWdodCBlZmZlY3RzLgorCQlXaGVuIHJlYWQsIHRoZXNlIGZpbGVzIHJldHVybiB0aGUgcmVzcGVjdGl2ZSBwcm9maWxlIHNldHRpbmdzLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA0MyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3NlbnNvcgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgdHJhY2tpbmctIGFuZCBhIGRpc3RhbmNlLWNvbnRyb2wtdW5pdC4gVGhlc2UKKwkJY2FuIGJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhbmQgdGhlIGxpZnQtb2ZmIGRpc3RhbmNlIGNhbiBiZQorCQlzZXQuIFRoZSBkYXRhIGhhcyB0byBiZSA2IGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3N0YXJ0dXBfcHJvZmlsZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAwLTQuCisgICAgICAgICAgICAgICAgV2hlbiByZWFkLCB0aGlzIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByb2ZpbGUKKyAgICAgICAgICAgICAgICB0aGF0J3MgYWN0aXZlIHdoZW4gdGhlIG1vdXNlIGlzIHBvd2VyZWQgb24uCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCisJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vdGN1CitEYXRlOgkJT2N0b2JlciAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVdoZW4gd3JpdHRlbiBhIGNhbGlicmF0aW9uIHByb2Nlc3MgZm9yIHRoZSB0cmFja2luZyBjb250cm9sIHVuaXQKKwkJY2FuIGJlIGluaXRpYXRlZC9jYW5jZWxsZWQuCisJCVRoZSBkYXRhIGhhcyB0byBiZSAzIGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3RjdV9pbWFnZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQgdGhlIG1vdXNlIHJldHVybnMgYSAzMHgzMCBwaXhlbCBpbWFnZSBvZiB0aGUKKwkJc2FtcGxlZCB1bmRlcmdyb3VuZC4gVGhpcyB3b3JrcyBvbmx5IGluIHRoZSBjb3Vyc2Ugb2YgYQorCQljYWxpYnJhdGlvbiBwcm9jZXNzIGluaXRpYXRlZCB3aXRoIHRjdS4KKwkJVGhlIHJldHVybmVkIGRhdGEgaXMgMTAyOCBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEKaW5kZXggYWQxMTI1Yi4uMWMzN2I4MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1weXJhCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQtcHlyYQpAQCAtMSw0ICsxLDQgQEAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9jcGkKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfY3BpCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJSXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIHRoZSBjcGkgc2V0dGluZyBvZiB0aGUgbW91c2Ugd2l0aCB0aGUKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX3Byb2ZpbGUKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfcHJvZmlsZQogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUgaW4KIAkJcmFuZ2UgMC00LgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2Zpcm13YXJlX3ZlcnNpb24KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9maXJtd2FyZV92ZXJzaW9uCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgcmF3IGludGVnZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlCkBAIC0zMSw3ICszMSw3IEBACiAJCWxlZnQuIEUuZy4gYSByZXR1cm5lZCB2YWx1ZSBvZiAxMzggbWVhbnMgMS4zOAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlX3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJY29udGFpbmVkIGluIHRoZSBkYXRhLgogCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKIERhdGU6CQlBdWd1c3QgMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQpAQCAtNTYsNyArNTYsNyBAQAogCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyAxMyBieXRlcyBpbiBzaXplLgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfYnV0dG9ucworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3Byb2ZpbGVfYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC02OSw3ICs2OSw3IEBACiAJCWNvbnRhaW5lZCBpbiB0aGUgZGF0YS4KIAkJVGhpcyBmaWxlIGlzIHdyaXRlb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vcHJvZmlsZVsxLTVdX2J1dHRvbnMKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC03OSw3ICs3OSw3IEBACiAJCVRoZSByZXR1cm5lZCBkYXRhIGlzIDE5IGJ5dGVzIGluIHNpemUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L3B5cmEvcm9jY2F0cHlyYTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgcmFuZ2VzIGZyb20gMC00LgpAQCAtODcsNyArODcsNyBAQAogICAgICAgICAgICAgICAgIHRoYXQncyBhY3RpdmUgd2hlbiB0aGUgbW91c2UgaXMgcG93ZXJlZCBvbi4KIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgc2V0dGluZ3Mgc3RvcmVkIGluIHRoZSBtb3VzZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcGxhdGZvcm0taWRlYXBhZC1sYXB0b3AgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2ZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCkBAIC0wLDAgKzEsNiBAQAorV2hhdDoJCS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9pZGVhcGFkL2NhbWVyYV9wb3dlcgorRGF0ZToJCURlYyAyMDEwCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CSJJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4iCitEZXNjcmlwdGlvbjoKKwkJQ29udHJvbCB0aGUgcG93ZXIgb2YgY2FtZXJhIG1vZHVsZS4gMSBtZWFucyBvbiwgMCBtZWFucyBvZmYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbAppbmRleCAwMjBhYzgwLi42MjBlYjNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQk8dGl0bGU+RGV2aWNlIHJlYWR5IGZ1bmN0aW9uPC90aXRsZT4KIAkJPHBhcmE+CiAJCQlJZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyB0aGUgcmVhZHkgYnVzeSBwaW4gb2YgdGhlIE5BTkQgY2hpcCBjb25uZWN0ZWQgdG8gYQotCQkJR1BJTyBvciBvdGhlciBhY2Nlc2libGUgSS9PIHBpbiwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYmFjayB0aGUgc3RhdGUgb2YgdGhlCisJCQlHUElPIG9yIG90aGVyIGFjY2Vzc2libGUgSS9PIHBpbiwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgYmFjayB0aGUgc3RhdGUgb2YgdGhlCiAJCQlwaW4uIFRoZSBmdW5jdGlvbiBoYXMgbm8gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIDAsIGlmIHRoZSBkZXZpY2UgaXMgYnVzeSAoUi9CIHBpbiAKIAkJCWlzIGxvdykgYW5kIDEsIGlmIHRoZSBkZXZpY2UgaXMgcmVhZHkgKFIvQiBwaW4gaXMgaGlnaCkuCiAJCQlJZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIGRvZXMgbm90IGdpdmUgYWNjZXNzIHRvIHRoZSByZWFkeSBidXN5IHBpbiwgdGhlbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9JUE1JLnR4dCBiL0RvY3VtZW50YXRpb24vSVBNSS50eHQKaW5kZXggNjlkZDI5ZS4uYjJiZWExNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9JUE1JLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CkBAIC01MzMsNiArNTMzLDMzIEBACiBPdGhlciBQaWVjZXMKIC0tLS0tLS0tLS0tLQogCitHZXQgdGhlIGRldGFpbGVkIGluZm8gcmVsYXRlZCB3aXRoIHRoZSBJUE1JIGRldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSB1c2VycyBuZWVkIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBkZXZpY2UsIGxpa2Ugd2hlcmUKK3RoZSBhZGRyZXNzIGNhbWUgZnJvbSBvciB0aGUgcmF3IGJhc2UgZGV2aWNlIGZvciB0aGUgSVBNSSBpbnRlcmZhY2UuCitZb3UgY2FuIHVzZSB0aGUgSVBNSSBzbWlfd2F0Y2hlciB0byBjYXRjaCB0aGUgSVBNSSBpbnRlcmZhY2VzIGFzIHRoZXkKK2NvbWUgb3IgZ28sIGFuZCB0byBncmFiIHRoZSBpbmZvcm1hdGlvbiwgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uCitpcG1pX2dldF9zbWlfaW5mbygpLCB3aGljaCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCitzdHJ1Y3QgaXBtaV9zbWlfaW5mbyB7CisJZW51bSBpcG1pX2FkZHJfc3JjIGFkZHJfc3JjOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl2b2lkICphY3BpX2hhbmRsZTsKKwkJfSBhY3BpX2luZm87CisJfSBhZGRyX2luZm87Cit9OworCitDdXJyZW50bHkgc3BlY2lhbCBpbmZvIGZvciBvbmx5IGZvciBTSV9BQ1BJIGFkZHJlc3Mgc291cmNlcyBpcworcmV0dXJuZWQuICBPdGhlcnMgbWF5IGJlIGFkZGVkIGFzIG5lY2Vzc2FyeS4KKworTm90ZSB0aGF0IHRoZSBkZXYgcG9pbnRlciBpcyBpbmNsdWRlZCBpbiB0aGUgYWJvdmUgc3RydWN0dXJlLCBhbmQKK2Fzc3VtaW5nIGlwbWlfc21pX2dldF9pbmZvIHJldHVybnMgc3VjY2VzcywgeW91IG11c3QgY2FsbCBwdXRfZGV2aWNlCitvbiB0aGUgZGV2IHBvaW50ZXIuCisKKwogV2F0Y2hkb2cKIC0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS9hcGVpL291dHB1dF9mb3JtYXQudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvb3V0cHV0X2Zvcm1hdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0Njk1MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYWNwaS9hcGVpL291dHB1dF9mb3JtYXQudHh0CkBAIC0wLDAgKzEsMTIyIEBACisgICAgICAgICAgICAgICAgICAgICBBUEVJIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fgorCitBUEVJIHVzZXMgcHJpbnRrIGFzIGhhcmR3YXJlIGVycm9yIHJlcG9ydGluZyBpbnRlcmZhY2UsIHRoZSBvdXRwdXQKK2Zvcm1hdCBpcyBhcyBmb2xsb3cuCisKKzxlcnJvciByZWNvcmQ+IDo9CitBUEVJIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc3RhdHVzCitzZXZlcml0eTogPGludGVnZXI+LCA8c2V2ZXJpdHkgc3RyaW5nPgorc2VjdGlvbjogPGludGVnZXI+LCBzZXZlcml0eTogPGludGVnZXI+LCA8c2V2ZXJpdHkgc3RyaW5nPgorZmxhZ3M6IDxpbnRlZ2VyPgorPHNlY3Rpb24gZmxhZ3Mgc3RyaW5ncz4KK2ZydV9pZDogPHV1aWQgc3RyaW5nPgorZnJ1X3RleHQ6IDxzdHJpbmc+CitzZWN0aW9uX3R5cGU6IDxzZWN0aW9uIHR5cGUgc3RyaW5nPgorPHNlY3Rpb24gZGF0YT4KKworPHNldmVyaXR5IHN0cmluZz4qIDo9IHJlY292ZXJhYmxlIHwgZmF0YWwgfCBjb3JyZWN0ZWQgfCBpbmZvCisKKzxzZWN0aW9uIGZsYWdzIHN0cmluZ3M+IyA6PQorW3ByaW1hcnldWywgY29udGFpbm1lbnQgd2FybmluZ11bLCByZXNldF1bLCB0aHJlc2hvbGQgZXhjZWVkZWRdXAorWywgcmVzb3VyY2Ugbm90IGFjY2Vzc2libGVdWywgbGF0ZW50IGVycm9yXQorCis8c2VjdGlvbiB0eXBlIHN0cmluZz4gOj0gZ2VuZXJpYyBwcm9jZXNzb3IgZXJyb3IgfCBtZW1vcnkgZXJyb3IgfCBcCitQQ0llIGVycm9yIHwgdW5rbm93biwgPHV1aWQgc3RyaW5nPgorCis8c2VjdGlvbiBkYXRhPiA6PQorPGdlbmVyaWMgcHJvY2Vzc29yIHNlY3Rpb24gZGF0YT4gfCA8bWVtb3J5IHNlY3Rpb24gZGF0YT4gfCBcCis8cGNpZSBzZWN0aW9uIGRhdGE+IHwgPG51bGw+CisKKzxnZW5lcmljIHByb2Nlc3NvciBzZWN0aW9uIGRhdGE+IDo9CitbcHJvY2Vzc29yX3R5cGU6IDxpbnRlZ2VyPiwgPHByb2MgdHlwZSBzdHJpbmc+XQorW3Byb2Nlc3Nvcl9pc2E6IDxpbnRlZ2VyPiwgPHByb2MgaXNhIHN0cmluZz5dCitbZXJyb3JfdHlwZTogPGludGVnZXI+Cis8cHJvYyBlcnJvciB0eXBlIHN0cmluZ3M+XQorW29wZXJhdGlvbjogPGludGVnZXI+LCA8cHJvYyBvcGVyYXRpb24gc3RyaW5nPl0KK1tmbGFnczogPGludGVnZXI+Cis8cHJvYyBmbGFncyBzdHJpbmdzPl0KK1tsZXZlbDogPGludGVnZXI+XQorW3ZlcnNpb25faW5mbzogPGludGVnZXI+XQorW3Byb2Nlc3Nvcl9pZDogPGludGVnZXI+XQorW3RhcmdldF9hZGRyZXNzOiA8aW50ZWdlcj5dCitbcmVxdWVzdG9yX2lkOiA8aW50ZWdlcj5dCitbcmVzcG9uZGVyX2lkOiA8aW50ZWdlcj5dCitbSVA6IDxpbnRlZ2VyPl0KKworPHByb2MgdHlwZSBzdHJpbmc+KiA6PSBJQTMyL1g2NCB8IElBNjQKKworPHByb2MgaXNhIHN0cmluZz4qIDo9IElBMzIgfCBJQTY0IHwgWDY0CisKKzxwcm9jZXNzb3IgZXJyb3IgdHlwZSBzdHJpbmdzPiMgOj0KK1tjYWNoZSBlcnJvcl1bLCBUTEIgZXJyb3JdWywgYnVzIGVycm9yXVssIG1pY3JvLWFyY2hpdGVjdHVyYWwgZXJyb3JdCisKKzxwcm9jIG9wZXJhdGlvbiBzdHJpbmc+KiA6PSB1bmtub3duIG9yIGdlbmVyaWMgfCBkYXRhIHJlYWQgfCBkYXRhIHdyaXRlIHwgXAoraW5zdHJ1Y3Rpb24gZXhlY3V0aW9uCisKKzxwcm9jIGZsYWdzIHN0cmluZ3M+IyA6PQorW3Jlc3RhcnRhYmxlXVssIHByZWNpc2UgSVBdWywgb3ZlcmZsb3ddWywgY29ycmVjdGVkXQorCis8bWVtb3J5IHNlY3Rpb24gZGF0YT4gOj0KK1tlcnJvcl9zdGF0dXM6IDxpbnRlZ2VyPl0KK1twaHlzaWNhbF9hZGRyZXNzOiA8aW50ZWdlcj5dCitbcGh5c2ljYWxfYWRkcmVzc19tYXNrOiA8aW50ZWdlcj5dCitbbm9kZTogPGludGVnZXI+XQorW2NhcmQ6IDxpbnRlZ2VyPl0KK1ttb2R1bGU6IDxpbnRlZ2VyPl0KK1tiYW5rOiA8aW50ZWdlcj5dCitbZGV2aWNlOiA8aW50ZWdlcj5dCitbcm93OiA8aW50ZWdlcj5dCitbY29sdW1uOiA8aW50ZWdlcj5dCitbYml0X3Bvc2l0aW9uOiA8aW50ZWdlcj5dCitbcmVxdWVzdG9yX2lkOiA8aW50ZWdlcj5dCitbcmVzcG9uZGVyX2lkOiA8aW50ZWdlcj5dCitbdGFyZ2V0X2lkOiA8aW50ZWdlcj5dCitbZXJyb3JfdHlwZTogPGludGVnZXI+LCA8bWVtIGVycm9yIHR5cGUgc3RyaW5nPl0KKworPG1lbSBlcnJvciB0eXBlIHN0cmluZz4qIDo9Cit1bmtub3duIHwgbm8gZXJyb3IgfCBzaW5nbGUtYml0IEVDQyB8IG11bHRpLWJpdCBFQ0MgfCBcCitzaW5nbGUtc3ltYm9sIGNoaXBraWxsIEVDQyB8IG11bHRpLXN5bWJvbCBjaGlwa2lsbCBFQ0MgfCBtYXN0ZXIgYWJvcnQgfCBcCit0YXJnZXQgYWJvcnQgfCBwYXJpdHkgZXJyb3IgfCB3YXRjaGRvZyB0aW1lb3V0IHwgaW52YWxpZCBhZGRyZXNzIHwgXAorbWlycm9yIEJyb2tlbiB8IG1lbW9yeSBzcGFyaW5nIHwgc2NydWIgY29ycmVjdGVkIGVycm9yIHwgXAorc2NydWIgdW5jb3JyZWN0ZWQgZXJyb3IKKworPHBjaWUgc2VjdGlvbiBkYXRhPiA6PQorW3BvcnRfdHlwZTogPGludGVnZXI+LCA8cGNpZSBwb3J0IHR5cGUgc3RyaW5nPl0KK1t2ZXJzaW9uOiA8aW50ZWdlcj4uPGludGVnZXI+XQorW2NvbW1hbmQ6IDxpbnRlZ2VyPiwgc3RhdHVzOiA8aW50ZWdlcj5dCitbZGV2aWNlX2lkOiA8aW50ZWdlcj46PGludGVnZXI+OjxpbnRlZ2VyPi48aW50ZWdlcj4KK3Nsb3Q6IDxpbnRlZ2VyPgorc2Vjb25kYXJ5X2J1czogPGludGVnZXI+Cit2ZW5kb3JfaWQ6IDxpbnRlZ2VyPiwgZGV2aWNlX2lkOiA8aW50ZWdlcj4KK2NsYXNzX2NvZGU6IDxpbnRlZ2VyPl0KK1tzZXJpYWwgbnVtYmVyOiA8aW50ZWdlcj4sIDxpbnRlZ2VyPl0KK1ticmlkZ2U6IHNlY29uZGFyeV9zdGF0dXM6IDxpbnRlZ2VyPiwgY29udHJvbDogPGludGVnZXI+XQorCis8cGNpZSBwb3J0IHR5cGUgc3RyaW5nPiogOj0gUENJZSBlbmQgcG9pbnQgfCBsZWdhY3kgUENJIGVuZCBwb2ludCB8IFwKK3Vua25vd24gfCB1bmtub3duIHwgcm9vdCBwb3J0IHwgdXBzdHJlYW0gc3dpdGNoIHBvcnQgfCBcCitkb3duc3RyZWFtIHN3aXRjaCBwb3J0IHwgUENJZSB0byBQQ0kvUENJLVggYnJpZGdlIHwgXAorUENJL1BDSS1YIHRvIFBDSWUgYnJpZGdlIHwgcm9vdCBjb21wbGV4IGludGVncmF0ZWQgZW5kcG9pbnQgZGV2aWNlIHwgXAorcm9vdCBjb21wbGV4IGV2ZW50IGNvbGxlY3RvcgorCitXaGVyZSwgW10gZGVzaWduYXRlIGNvcnJlc3BvbmRpbmcgY29udGVudCBpcyBvcHRpb25hbAorCitBbGwgPGZpZWxkIHN0cmluZz4gZGVzY3JpcHRpb24gd2l0aCAqIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworZmllbGQ6IDxpbnRlZ2VyPiwgPGZpZWxkIHN0cmluZz4KKworV2hlcmUgdmFsdWUgb2YgPGludGVnZXI+IHNob3VsZCBiZSB0aGUgcG9zaXRpb24gb2YgInN0cmluZyIgaW4gPGZpZWxkCitzdHJpbmc+IGRlc2NyaXB0aW9uLiBPdGhlcndpc2UsIDxmaWVsZCBzdHJpbmc+IHdpbGwgYmUgInVua25vd24iLgorCitBbGwgPGZpZWxkIHN0cmluZ3M+IGRlc2NyaXB0aW9uIHdpdGggIyBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKK2ZpZWxkOiA8aW50ZWdlcj4KKzxmaWVsZCBzdHJpbmdzPgorCitXaGVyZSBlYWNoIHN0cmluZyBpbiA8ZmllbGRzIHN0cmluZ3M+IGNvcnJlc3BvbmRpbmcgdG8gb25lIHNldCBiaXQgb2YKKzxpbnRlZ2VyPi4gVGhlIGJpdCBwb3NpdGlvbiBpcyB0aGUgcG9zaXRpb24gb2YgInN0cmluZyIgaW4gPGZpZWxkCitzdHJpbmdzPiBkZXNjcmlwdGlvbi4KKworRm9yIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgZXZlcnkgZmllbGQsIHBsZWFzZSByZWZlciB0byBVRUZJCitzcGVjaWZpY2F0aW9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBzZWN0aW9uIEFwcGVuZGl4IE46IENvbW1vbgorUGxhdGZvcm0gRXJyb3IgUmVjb3JkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Jsa2lvLWNvbnRyb2xsZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Jsa2lvLWNvbnRyb2xsZXIudHh0CmluZGV4IGQ2ZGE2MTEuLjRlZDdiNWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9ibGtpby1jb250cm9sbGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvYmxraW8tY29udHJvbGxlci50eHQKQEAgLTg5LDYgKzg5LDMzIEBACiAKICBMaW1pdHMgZm9yIHdyaXRlcyBjYW4gYmUgcHV0IHVzaW5nIGJsa2lvLndyaXRlX2Jwc19kZXZpY2UgZmlsZS4KIAorSGllcmFyY2hpY2FsIENncm91cHMKKz09PT09PT09PT09PT09PT09PT09CistIEN1cnJlbnRseSBub25lIG9mIHRoZSBJTyBjb250cm9sIHBvbGljeSBzdXBwb3J0cyBoaWVyYXJoaWNhbCBncm91cHMuIEJ1dAorICBjZ3JvdXAgaW50ZXJmYWNlIGRvZXMgYWxsb3cgY3JlYXRpb24gb2YgaGllcmFyaGljYWwgY2dyb3VwcyBhbmQgaW50ZXJuYWxseQorICBJTyBwb2xpY2llcyB0cmVhdCB0aGVtIGFzIGZsYXQgaGllcmFyY2h5LgorCisgIFNvIHRoaXMgcGF0Y2ggd2lsbCBhbGxvdyBjcmVhdGlvbiBvZiBjZ3JvdXAgaGllcmFyaGN5IGJ1dCBhdCB0aGUgYmFja2VuZAorICBldmVyeXRoaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBmbGF0LiBTbyBpZiBzb21lYm9keSBjcmVhdGVkIGEgaGllcmFyY2h5IGxpa2UKKyAgYXMgZm9sbG93cy4KKworCQkJcm9vdAorCQkJLyAgXAorCQkgICAgIHRlc3QxIHRlc3QyCisJCQl8CisJCSAgICAgdGVzdDMKKworICBDRlEgYW5kIHRocm90dGxpbmcgd2lsbCBwcmFjdGljYWxseSB0cmVhdCBhbGwgZ3JvdXBzIGF0IHNhbWUgbGV2ZWwuCisKKwkJCQlwaXZvdAorCQkJICAgICAvICB8ICAgXCAgXAorCQkJcm9vdCAgdGVzdDEgdGVzdDIgIHRlc3QzCisKKyAgRG93biB0aGUgbGluZSB3ZSBjYW4gaW1wbGVtZW50IGhpZXJhcmNoaWNhbCBhY2NvdW50aW5nL2NvbnRyb2wgc3VwcG9ydAorICBhbmQgYWxzbyBpbnRyb2R1Y2UgYSBuZXcgY2dyb3VwIGZpbGUgInVzZV9oaWVyYXJjaHkiIHdoaWNoIHdpbGwgY29udHJvbAorICB3aGV0aGVyIGNncm91cCBoaWVyYXJjaHkgaXMgdmlld2VkIGFzIGZsYXQgb3IgaGllcmFyY2hpY2FsIGJ5IHRoZSBwb2xpY3kuLgorICBUaGlzIGlzIGhvdyBtZW1vcnkgY29udHJvbGxlciBhbHNvIGhhcyBpbXBsZW1lbnRlZCB0aGUgdGhpbmdzLgorCiBWYXJpb3VzIHVzZXIgdmlzaWJsZSBjb25maWcgb3B0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIENPTkZJR19CTEtfQ0dST1VQCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3VwX2V2ZW50X2xpc3RlbmVyLmMgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3VwX2V2ZW50X2xpc3RlbmVyLmMKaW5kZXggOGMyYmZjNC4uM2UwODJmOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cF9ldmVudF9saXN0ZW5lci5jCisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBfZXZlbnRfbGlzdGVuZXIuYwpAQCAtOTEsNyArOTEsNyBAQAogCiAJCWlmIChyZXQgPT0gLTEpIHsKIAkJCXBlcnJvcigiY2dyb3VwLmV2ZW50X2NvbnRyb2wgIgotCQkJCQkiaXMgbm90IGFjY2Vzc2FibGUgYW55IG1vcmUiKTsKKwkJCQkJImlzIG5vdCBhY2Nlc3NpYmxlIGFueSBtb3JlIik7CiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKaW5kZXggMTkwMDE4Yi4uNDRiOGI3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dApAQCAtMzU1LDEzICszNTUsMTMgQEAKIAogVG8gY2hhbmdlIHRoZSBzZXQgb2Ygc3Vic3lzdGVtcyBib3VuZCB0byBhIG1vdW50ZWQgaGllcmFyY2h5LCBqdXN0CiByZW1vdW50IHdpdGggZGlmZmVyZW50IG9wdGlvbnM6Ci0jIG1vdW50IC1vIHJlbW91bnQsY3B1c2V0LG5zIGhpZXIxIC9kZXYvY2dyb3VwCisjIG1vdW50IC1vIHJlbW91bnQsY3B1c2V0LGJsa2lvIGhpZXIxIC9kZXYvY2dyb3VwCiAKLU5vdyBtZW1vcnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBoaWVyYXJjaHkgYW5kIG5zIGlzIGFkZGVkLgorTm93IG1lbW9yeSBpcyByZW1vdmVkIGZyb20gdGhlIGhpZXJhcmNoeSBhbmQgYmxraW8gaXMgYWRkZWQuCiAKLU5vdGUgdGhpcyB3aWxsIGFkZCBucyB0byB0aGUgaGllcmFyY2h5IGJ1dCB3b24ndCByZW1vdmUgbWVtb3J5IG9yCitOb3RlIHRoaXMgd2lsbCBhZGQgYmxraW8gdG8gdGhlIGhpZXJhcmNoeSBidXQgd29uJ3QgcmVtb3ZlIG1lbW9yeSBvcgogY3B1c2V0LCBiZWNhdXNlIHRoZSBuZXcgb3B0aW9ucyBhcmUgYXBwZW5kZWQgdG8gdGhlIG9sZCBvbmVzOgotIyBtb3VudCAtbyByZW1vdW50LG5zIC9kZXYvY2dyb3VwCisjIG1vdW50IC1vIHJlbW91bnQsYmxraW8gL2Rldi9jZ3JvdXAKIAogVG8gU3BlY2lmeSBhIGhpZXJhcmNoeSdzIHJlbGVhc2VfYWdlbnQ6CiAjIG1vdW50IC10IGNncm91cCAtbyBjcHVzZXQscmVsZWFzZV9hZ2VudD0iL3NiaW4vY3B1c2V0X3JlbGVhc2VfYWdlbnQiIFwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1jZ190ZXN0LnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1jZ190ZXN0LnR4dAppbmRleCBiN2VlY2VjLi5mYzhmYTk3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtY2dfdGVzdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL21lbWNnX3Rlc3QudHh0CkBAIC0zOTgsNyArMzk4LDcgQEAKIAl3cml0dGVuIHRvIG1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZS4KIAogIDkuMTAgTWVtb3J5IHRocmVzaG9sZHMKLQlNZW1vcnkgY29udHJvbGVyIGltcGxlbWVudHMgbWVtb3J5IHRocmVzaG9sZHMgdXNpbmcgY2dyb3VwcyBub3RpZmljYXRpb24KKwlNZW1vcnkgY29udHJvbGxlciBpbXBsZW1lbnRzIG1lbW9yeSB0aHJlc2hvbGRzIHVzaW5nIGNncm91cHMgbm90aWZpY2F0aW9uCiAJQVBJLiBZb3UgY2FuIHVzZSBEb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3VwX2V2ZW50X2xpc3RlbmVyLmMgdG8gdGVzdAogCWl0LgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dAppbmRleCA0YTI3NmVhLi45NmI2OTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKQEAgLTM2LDYgKzM2LDEwIEBACiAKICAgICAgICAgc3VkbyBtYWtlIGluc3RhbGwKIAorVGhlIHNlbWFudGljIHBhdGNoZXMgaW4gdGhlIGtlcm5lbCB3aWxsIHdvcmsgYmVzdCB3aXRoIENvY2NpbmVsbGUgdmVyc2lvbgorMC4yLjQgb3IgbGF0ZXIuICBVc2luZyBlYXJsaWVyIHZlcnNpb25zIG1heSBpbmN1ciBzb21lIHBhcnNlIGVycm9ycyBpbiB0aGUKK3NlbWFudGljIHBhdGNoIGNvZGUsIGJ1dCBhbnkgcmVzdWx0cyB0aGF0IGFyZSBvYnRhaW5lZCBzaG91bGQgc3RpbGwgYmUKK2NvcnJlY3QuCiAKICBVc2luZyBDb2NjaW5lbGxlIG9uIHRoZSBMaW51eCBrZXJuZWwKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dAppbmRleCA1MjRkZTkyLi41OTI5M2FjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1jcnlwdC50eHQKQEAgLTgsNyArOCw3IEBACiAKIDxjaXBoZXI+CiAgICAgRW5jcnlwdGlvbiBjaXBoZXIgYW5kIGFuIG9wdGlvbmFsIElWIGdlbmVyYXRpb24gbW9kZS4KLSAgICAoSW4gZm9ybWF0IGNpcGhlci1jaGFpbm1vZGUtaXZvcHRzOml2bW9kZSkuCisgICAgKEluIGZvcm1hdCBjaXBoZXJbOmtleWNvdW50XS1jaGFpbm1vZGUtaXZvcHRzOml2bW9kZSkuCiAgICAgRXhhbXBsZXM6CiAgICAgICAgZGVzCiAgICAgICAgYWVzLWNiYy1lc3NpdjpzaGEyNTYKQEAgLTIwLDYgKzIwLDExIEBACiAgICAgS2V5IHVzZWQgZm9yIGVuY3J5cHRpb24uIEl0IGlzIGVuY29kZWQgYXMgYSBoZXhhZGVjaW1hbCBudW1iZXIuCiAgICAgWW91IGNhbiBvbmx5IHVzZSBrZXkgc2l6ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBzZWxlY3RlZCBjaXBoZXIuCiAKKzxrZXljb3VudD4KKyAgICBNdWx0aS1rZXkgY29tcGF0aWJpbGl0eSBtb2RlLiBZb3UgY2FuIGRlZmluZSA8a2V5Y291bnQ+IGtleXMgYW5kCisgICAgdGhlbiBzZWN0b3JzIGFyZSBlbmNyeXB0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG9mZnNldHMgKHNlY3RvciAwIHVzZXMga2V5MDsKKyAgICBzZWN0b3IgMSB1c2VzIGtleTEgZXRjLikuICA8a2V5Y291bnQ+IG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisKIDxpdl9vZmZzZXQ+CiAgICAgVGhlIElWIG9mZnNldCBpcyBhIHNlY3RvciBjb3VudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBzZWN0b3IgbnVtYmVyCiAgICAgYmVmb3JlIGNyZWF0aW5nIHRoZSBJVi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1yYWlkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1yYWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I2YjcwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLXJhaWQudHh0CkBAIC0wLDAgKzEsNzAgQEAKK0RldmljZS1tYXBwZXIgUkFJRCAoZG0tcmFpZCkgaXMgYSBicmlkZ2UgZnJvbSBETSB0byBNRC4gIEl0Citwcm92aWRlcyBhIHdheSB0byB1c2UgZGV2aWNlLW1hcHBlciBpbnRlcmZhY2VzIHRvIGFjY2VzcyB0aGUgTUQgUkFJRAorZHJpdmVycy4KKworQXMgd2l0aCBhbGwgZGV2aWNlLW1hcHBlciB0YXJnZXRzLCB0aGUgbm9taW5hbCBwdWJsaWMgaW50ZXJmYWNlcyBhcmUgdGhlCitjb25zdHJ1Y3RvciAoQ1RSKSB0YWJsZXMgYW5kIHRoZSBzdGF0dXMgb3V0cHV0cyAoYm90aCBTVEFUVVNUWVBFX0lORk8KK2FuZCBTVEFUVVNUWVBFX1RBQkxFKS4gIFRoZSBDVFIgdGFibGUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisxOiA8cz4gPGw+IHJhaWQgXAorMjogICAgICA8cmFpZF90eXBlPiA8I3JhaWRfcGFyYW1zPiA8cmFpZF9wYXJhbXM+IFwKKzM6ICAgICAgPCNyYWlkX2RldnM+IDxtZXRhX2RldjE+IDxkZXYxPiAuLiA8bWV0YV9kZXZOPiA8ZGV2Tj4KKworTGluZSAxIGNvbnRhaW5zIHRoZSBzdGFuZGFyZCBmaXJzdCB0aHJlZSBhcmd1bWVudHMgdG8gYW55IGRldmljZS1tYXBwZXIKK3RhcmdldCAtIHRoZSBzdGFydCwgbGVuZ3RoLCBhbmQgdGFyZ2V0IHR5cGUgZmllbGRzLiAgVGhlIHRhcmdldCB0eXBlIGluCit0aGlzIGNhc2UgaXMgInJhaWQiLgorCitMaW5lIDIgY29udGFpbnMgdGhlIGFyZ3VtZW50cyB0aGF0IGRlZmluZSB0aGUgcGFydGljdWxhciByYWlkCit0eXBlL3BlcnNvbmFsaXR5L2xldmVsLCB0aGUgcmVxdWlyZWQgYXJndW1lbnRzIGZvciB0aGF0IHJhaWQgdHlwZSwgYW5kCithbnkgb3B0aW9uYWwgYXJndW1lbnRzLiAgUG9zc2libGUgcmFpZCB0eXBlcyBpbmNsdWRlOiByYWlkNCwgcmFpZDVfbGEsCityYWlkNV9scywgcmFpZDVfcnMsIHJhaWQ2X3pyLCByYWlkNl9uciwgYW5kIHJhaWQ2X25jLiAgKHJhaWQxIGlzCitwbGFubmVkIGZvciB0aGUgZnV0dXJlLikgIFRoZSBsaXN0IG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzCitpcyB0aGUgc2FtZSBmb3IgYWxsIHRoZSBjdXJyZW50IHJhaWQgdHlwZXMuICBUaGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUKK3Bvc2l0aW9uYWwsIHdoaWxlIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBhcyBrZXkvdmFsdWUgcGFpcnMuCitUaGUgcG9zc2libGUgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93czoKKyA8Y2h1bmtfc2l6ZT4gICAgICAgICAgIENodW5rIHNpemUgaW4gc2VjdG9ycy4KKyBbW25vXXN5bmNdICAgICAgICAgICAgIEZvcmNlL1ByZXZlbnQgUkFJRCBpbml0aWFsaXphdGlvbgorIFtyZWJ1aWxkIDxpZHg+XSAgICAgICAgUmVidWlsZCB0aGUgZHJpdmUgaW5kaWNhdGVkIGJ5IHRoZSBpbmRleAorIFtkYWVtb25fc2xlZXAgPG1zPl0gICAgVGltZSBiZXR3ZWVuIGJpdG1hcCBkYWVtb24gd29yayB0byBjbGVhciBiaXRzCisgW21pbl9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dICAgICAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorIFttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgICAgIFRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KKyBbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dICAgICAgICAgICBTZWUgJy13cml0ZS1iZWhpbmQ9JyAobWFuIG1kYWRtKQorIFtzdHJpcGVfY2FjaGUgPHNlY3RvcnM+XSAgICAgICAgICAgICAgIFN0cmlwZSBjYWNoZSBzaXplIGZvciBoaWdoZXIgUkFJRHMKKworTGluZSAzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGRldmljZXMgdGhhdCBjb21wb3NlIHRoZSBhcnJheSBpbgorbWV0YWRhdGEvZGF0YSBkZXZpY2UgcGFpcnMuICBJZiB0aGUgbWV0YWRhdGEgaXMgc3RvcmVkIHNlcGFyYXRlbHksIGEgJy0nCitpcyBnaXZlbiBmb3IgdGhlIG1ldGFkYXRhIGRldmljZSBwb3NpdGlvbi4gIElmIGEgZHJpdmUgaGFzIGZhaWxlZCBvciBpcworbWlzc2luZyBhdCBjcmVhdGlvbiB0aW1lLCBhICctJyBjYW4gYmUgZ2l2ZW4gZm9yIGJvdGggdGhlIG1ldGFkYXRhIGFuZAorZGF0YSBkcml2ZXMgZm9yIGEgZ2l2ZW4gcG9zaXRpb24uCisKK05CLiBDdXJyZW50bHkgYWxsIG1ldGFkYXRhIGRldmljZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJy0nLgorCitFeGFtcGxlczoKKyMgUkFJRDQgLSA0IGRhdGEgZHJpdmVzLCAxIHBhcml0eQorIyBObyBtZXRhZGF0YSBkZXZpY2VzIHNwZWNpZmllZCB0byBob2xkIHN1cGVyYmxvY2svYml0bWFwIGluZm8KKyMgQ2h1bmsgc2l6ZSBvZiAxTWlCCisjIChMaW5lcyBzZXBhcmF0ZWQgZm9yIGVhc3kgcmVhZGluZykKKzAgMTk2MDg5MzY0OCByYWlkIFwKKyAgICAgICAgcmFpZDQgMSAyMDQ4IFwKKyAgICAgICAgNSAtIDg6MTcgLSA4OjMzIC0gODo0OSAtIDg6NjUgLSA4OjgxCisKKyMgUkFJRDQgLSA0IGRhdGEgZHJpdmVzLCAxIHBhcml0eSAobm8gbWV0YWRhdGEgZGV2aWNlcykKKyMgQ2h1bmsgc2l6ZSBvZiAxTWlCLCBmb3JjZSBSQUlEIGluaXRpYWxpemF0aW9uLAorIyAgICAgICBtaW4gcmVjb3ZlcnkgcmF0ZSBhdCAyMCBraUIvc2VjL2Rpc2sKKzAgMTk2MDg5MzY0OCByYWlkIFwKKyAgICAgICAgcmFpZDQgNCAyMDQ4IG1pbl9yZWNvdmVyeV9yYXRlIDIwIHN5bmNcCisgICAgICAgIDUgLSA4OjE3IC0gODozMyAtIDg6NDkgLSA4OjY1IC0gODo4MQorCitQZXJmb3JtaW5nIGEgJ2Rtc2V0dXAgdGFibGUnIHNob3VsZCBkaXNwbGF5IHRoZSBDVFIgdGFibGUgdXNlZCB0bworY29uc3RydWN0IHRoZSBtYXBwaW5nICh3aXRoIHBvc3NpYmxlIHJlb3JkZXJpbmcgb2Ygb3B0aW9uYWwKK3BhcmFtZXRlcnMpLgorCitQZXJmb3JtaW5nIGEgJ2Rtc2V0dXAgc3RhdHVzJyB3aWxsIHlpZWxkIGluZm9ybWF0aW9uIG9uIHRoZSBzdGF0ZSBhbmQKK2hlYWx0aCBvZiB0aGUgYXJyYXkuICBUaGUgb3V0cHV0IGlzIGFzIGZvbGxvd3M6CisxOiA8cz4gPGw+IHJhaWQgXAorMjogICAgICA8cmFpZF90eXBlPiA8I2RldmljZXM+IDwxIGhlYWx0aCBjaGFyIGZvciBlYWNoIGRldj4gPHJlc3luY19yYXRpbz4KKworTGluZSAxIGlzIHN0YW5kYXJkIERNIG91dHB1dC4gIExpbmUgMiBpcyBiZXN0IHNob3duIGJ5IGV4YW1wbGU6CisgICAgICAgIDAgMTk2MDg5MzY0OCByYWlkIHJhaWQ0IDUgQUFBQUEgMi80OTAyMjE1NjgKK0hlcmUgd2UgY2FuIHNlZSB0aGUgUkFJRCB0eXBlIGlzIHJhaWQ0LCB0aGVyZSBhcmUgNSBkZXZpY2VzIC0gYWxsIG9mCit3aGljaCBhcmUgJ0EnbGl2ZSwgYW5kIHRoZSBhcnJheSBpcyAyLzQ5MDIyMTU2OCBjb21wbGV0ZSB3aXRoIHJlY292ZXJ5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBiL0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQKaW5kZXggOTQ1ZmYzZi4uYTBiNThlMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CkBAIC0xMDQsNiArMTA0LDEzIEBACiBBcyBhbiBhZGRlZCBib251cyB5b3UgY2FuIGN1c3RvbWlzZSB0aGUgbWVzc2FnZSBjcmVhdGlvbiB0b29sYmFyIG1lbnUKIGFuZCBwdXQgdGhlICJpbnNlcnQgZmlsZSIgaWNvbiB0aGVyZS4KIAorTWFrZSB0aGUgdGhlIGNvbXBvc2VyIHdpbmRvdyB3aWRlIGVub3VnaCBzbyB0aGF0IG5vIGxpbmVzIHdyYXAuIEFzIG9mCitLTWFpbCAxLjEzLjUgKEtERSA0LjUuNCksIEtNYWlsIHdpbGwgYXBwbHkgd29yZCB3cmFwcGluZyB3aGVuIHNlbmRpbmcKK3RoZSBlbWFpbCBpZiB0aGUgbGluZXMgd3JhcCBpbiB0aGUgY29tcG9zZXIgd2luZG93LiBIYXZpbmcgd29yZCB3cmFwcGluZworZGlzYWJsZWQgaW4gdGhlIE9wdGlvbnMgbWVudSBpc24ndCBlbm91Z2guIFRodXMsIGlmIHlvdXIgcGF0Y2ggaGFzIHZlcnkKK2xvbmcgbGluZXMsIHlvdSBtdXN0IG1ha2UgdGhlIGNvbXBvc2VyIHdpbmRvdyB2ZXJ5IHdpZGUgYmVmb3JlIHNlbmRpbmcKK3RoZSBlbWFpbC4gU2VlOiBodHRwczovL2J1Z3Mua2RlLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MDM0CisKIFlvdSBjYW4gc2FmZWx5IEdQRyBzaWduIGF0dGFjaG1lbnRzLCBidXQgaW5saW5lZCB0ZXh0IGlzIHByZWZlcnJlZCBmb3IKIHBhdGNoZXMgc28gZG8gbm90IEdQRyBzaWduIHRoZW0uICBTaWduaW5nIHBhdGNoZXMgdGhhdCBoYXZlIGJlZW4gaW5zZXJ0ZWQKIGFzIGlubGluZWQgdGV4dCB3aWxsIG1ha2UgdGhlbSB0cmlja3kgdG8gZXh0cmFjdCBmcm9tIHRoZWlyIDctYml0IGVuY29kaW5nLgpAQCAtMTc5LDI2ICsxODYsOCBAQAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRodW5kZXJiaXJkIChHVUkpCiAKLUJ5IGRlZmF1bHQsIHRodW5kZXJiaXJkIGxpa2VzIHRvIG1hbmdsZSB0ZXh0LCBidXQgdGhlcmUgYXJlIHdheXMgdG8KLWNvZXJjZSBpdCBpbnRvIGJlaW5nIG5pY2UuCi0KLS0gVW5kZXIgYWNjb3VudCBzZXR0aW5ncywgY29tcG9zaXRpb24gYW5kIGFkZHJlc3NpbmcsIHVuY2hlY2sgIkNvbXBvc2UKLSAgbWVzc2FnZXMgaW4gSFRNTCBmb3JtYXQiLgotCi0tIEVkaXQgeW91ciBUaHVuZGVyYmlyZCBjb25maWcgc2V0dGluZ3MgdG8gdGVsbCBpdCBub3QgdG8gd3JhcCBsaW5lczoKLSAgICAgIHVzZXJfcHJlZigibWFpbG5ld3Mud3JhcGxlbmd0aCIsIDApOwotCi0tIEVkaXQgeW91ciBUaHVuZGVyYmlyZCBjb25maWcgc2V0dGluZ3Mgc28gdGhhdCBpdCB3b24ndCB1c2UgZm9ybWF0PWZsb3dlZDoKLSAgICAgIHVzZXJfcHJlZigibWFpbG5ld3Muc2VuZF9wbGFpbnRleHRfZmxvd2VkIiwgZmFsc2UpOwotCi0tIFlvdSBuZWVkIHRvIGdldCBUaHVuZGVyYmlyZCBpbnRvIHByZWZvcm1hdCBtb2RlOgotLiBJZiB5b3UgY29tcG9zZSBIVE1MIG1lc3NhZ2VzIGJ5IGRlZmF1bHQsIGl0J3Mgbm90IHRvbyBoYXJkLiBKdXN0IHNlbGVjdAotICAiUHJlZm9ybWF0IiBmcm9tIHRoZSBkcm9wLWRvd24gYm94IGp1c3QgdW5kZXIgdGhlIHN1YmplY3QgbGluZS4KLS4gSWYgeW91IGNvbXBvc2UgaW4gdGV4dCBieSBkZWZhdWx0LCB5b3UgaGF2ZSB0byB0ZWxsIGl0IHRvIGNvbXBvc2UgYSBuZXcKLSAgbWVzc2FnZSBpbiBIVE1MIChqdXN0IGFzIGEgb25lLW9mZiksIGFuZCB0aGVuIGZvcmNlIGl0IGZyb20gdGhlcmUgYmFjayB0bwotICB0ZXh0LCBlbHNlIGl0IHdpbGwgd3JhcCBsaW5lcy4gVG8gZG8gdGhpcywgdXNlIHNoaWZ0LWNsaWNrIG9uIHRoZSBXcml0ZQotICBpY29uIHRvIGNvbXBvc2UgdG8gZ2V0IEhUTUwgY29tcG9zZSBtb2RlLCB0aGVuIHNlbGVjdCAiUHJlZm9ybWF0IiBmcm9tCi0gIHRoZSBkcm9wLWRvd24gYm94IGp1c3QgdW5kZXIgdGhlIHN1YmplY3QgbGluZS4KK1RodW5kZXJiaXJkIGlzIGFuIE91dGxvb2sgY2xvbmUgdGhhdCBsaWtlcyB0byBtYW5nbGUgdGV4dCwgYnV0IHRoZXJlIGFyZSB3YXlzCit0byBjb2VyY2UgaXQgaW50byBiZWhhdmluZy4KIAogLSBBbGxvd3MgdXNlIG9mIGFuIGV4dGVybmFsIGVkaXRvcjoKICAgVGhlIGVhc2llc3QgdGhpbmcgdG8gZG8gd2l0aCBUaHVuZGVyYmlyZCBhbmQgcGF0Y2hlcyBpcyB0byB1c2UgYW4KQEAgLTIwOCw2ICsxOTcsMjcgQEAKICAgVmlldy0+VG9vbGJhcnMtPkN1c3RvbWl6ZS4uLiBhbmQgZmluYWxseSBqdXN0IGNsaWNrIG9uIGl0IHdoZW4gaW4gdGhlCiAgIENvbXBvc2UgZGlhbG9nLgogCitUbyBiZWF0IHNvbWUgc2Vuc2Ugb3V0IG9mIHRoZSBpbnRlcm5hbCBlZGl0b3IsIGRvIHRoaXM6CisKKy0gVW5kZXIgYWNjb3VudCBzZXR0aW5ncywgY29tcG9zaXRpb24gYW5kIGFkZHJlc3NpbmcsIHVuY2hlY2sgIkNvbXBvc2UKKyAgbWVzc2FnZXMgaW4gSFRNTCBmb3JtYXQiLgorCistIEVkaXQgeW91ciBUaHVuZGVyYmlyZCBjb25maWcgc2V0dGluZ3Mgc28gdGhhdCBpdCB3b24ndCB1c2UgZm9ybWF0PWZsb3dlZC4KKyAgR28gdG8gImVkaXQtPnByZWZlcmVuY2VzLT5hZHZhbmNlZC0+Y29uZmlnIGVkaXRvciIgdG8gYnJpbmcgdXAgdGhlCisgIHRodW5kZXJiaXJkJ3MgcmVnaXN0cnkgZWRpdG9yLCBhbmQgc2V0ICJtYWlsbmV3cy5zZW5kX3BsYWludGV4dF9mbG93ZWQiIHRvCisgICJmYWxzZSIuCisKKy0gRW5hYmxlICJwcmVmb3JtYXQiIG1vZGU6IFNoZnQtY2xpY2sgb24gdGhlIFdyaXRlIGljb24gdG8gYnJpbmcgdXAgdGhlIEhUTUwKKyAgY29tcG9zZXIsIHNlbGVjdCAiUHJlZm9ybWF0IiBmcm9tIHRoZSBkcm9wLWRvd24gYm94IGp1c3QgdW5kZXIgdGhlIHN1YmplY3QKKyAgbGluZSwgdGhlbiBjbG9zZSB0aGUgbWVzc2FnZSB3aXRob3V0IHNhdmluZy4gIChUaGlzIHNldHRpbmcgYWxzbyBhcHBsaWVzIHRvCisgIHRoZSB0ZXh0IGNvbXBvc2VyLCBidXQgdGhlIG9ubHkgY29udHJvbCBmb3IgaXQgaXMgaW4gdGhlIEhUTUwgY29tcG9zZXIuKQorCistIEluc3RhbGwgdGhlICJ0b2dnbGUgd29yZHdyYXAiIGV4dGVuc2lvbi4gIERvd25sb2FkIHRoZSBmaWxlIGZyb206CisgICAgaHR0cHM6Ly9hZGRvbnMubW96aWxsYS5vcmcvdGh1bmRlcmJpcmQvYWRkb24vMjM1MS8KKyAgVGhlbiBnbyB0byAidG9vbHMtPmFkZCBvbnMiLCBzZWxlY3QgImluc3RhbGwiIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiwKKyAgYW5kIGJyb3dzZSB0byB3aGVyZSB5b3Ugc2F2ZWQgdGhlIC54dWwgZmlsZS4gIFRoaXMgYWRkcyBhbiAiRW5hYmxlCisgIFdvcmR3cmFwIiBlbnRyeSB1bmRlciB0aGUgT3B0aW9ucyBtZW51IG9mIHRoZSBtZXNzYWdlIGNvbXBvc2VyLgorCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVGtSYXQgKEdVSSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDIyZjEwODEuLjhjNTk0YzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTE5Myw2ICsxOTMsMjAgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CUNTNTUzNS9DUzU1MzYgb2Jzb2xldGUgR1BJTyBkcml2ZXIKK1doZW46CUp1bmUgMjAxMQorRmlsZXM6CWRyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby8qCitDaGVjazoJZHJpdmVycy9zdGFnaW5nL2NzNTUzNV9ncGlvL2NzNTUzNV9ncGlvLmMKK1doeToJQSBuZXdlciBkcml2ZXIgcmVwbGFjZXMgdGhpczsgaXQgaXMgZHJpdmVycy9ncGlvL2NzNTUzNS1ncGlvLmMsIGFuZAorCWludGVncmF0ZXMgd2l0aCB0aGUgTGludXggR1BJTyBzdWJzeXN0ZW0uICBUaGUgb2xkIGRyaXZlciBoYXMgYmVlbgorCW1vdmVkIHRvIHN0YWdpbmcsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYWx0b2dldGhlciBhcm91bmQgMi42LjQwLgorCVBsZWFzZSB0ZXN0IHRoZSBuZXcgZHJpdmVyLCBhbmQgZW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgeW91CisJbmVlZCBhbmQgYW55IGJ1Z2ZpeGVzIGZyb20gdGhlIG9sZCBkcml2ZXIgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3CisJb25lLgorV2hvOglBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJcmVtb3ZlIEVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCkKIFdoZW46CUF1Z3VzdCAyMDA2CiBGaWxlczoJYXJjaC8qL2tlcm5lbC8qX2tzeW1zLmMKQEAgLTIzNCw2ICsyNDgsMTcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CUNPTkZJR19BQ1BJX1BST0NGU19QT1dFUgorV2hlbjoJMi42LjM5CitXaHk6CXN5c2ZzIEkvRiBmb3IgQUNQSSBwb3dlciBkZXZpY2VzLCBpbmNsdWRpbmcgQUMgYW5kIEJhdHRlcnksCisgICAgICAgIGhhcyBiZWVuIHdvcmtpbmcgaW4gdXBzdHJlYW0ga2VucmVsIHNpbmNlIDIuNi4yNCwgU2VwIDIwMDcuCisJSW4gMi42LjM3LCB3ZSBtYWtlIHRoZSBzeXNmcyBJL0YgYWx3YXlzIGJ1aWx0IGluIGFuZCB0aGlzIG9wdGlvbgorCWRpc2FibGVkIGJ5IGRlZmF1bHQuCisJUmVtb3ZlIHRoaXMgb3B0aW9uIGFuZCB0aGUgQUNQSSBwb3dlciBwcm9jZnMgaW50ZXJmYWNlIGluIDIuNi4zOS4KK1dobzoJWmhhbmcgUnVpIDxydWkuemhhbmdAaW50ZWwuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJL3Byb2MvYWNwaS9idXR0b24KIFdoZW46CUF1Z3VzdCAyMDA3CiBXaHk6CS9wcm9jL2FjcGkvYnV0dG9uIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGV2ZW50cyB0byB0aGUgaW5wdXQgbGF5ZXIKQEAgLTU3NiwzICs2MDEsMTMgQEAKIFdobzoJVGVqdW4gSGVvIDx0akBrZXJuZWwub3JnPgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CUxlZ2FjeSwgbm9uLXN0YW5kYXJkIGNoYXNzaXMgaW50cnVzaW9uIGRldGVjdGlvbiBpbnRlcmZhY2UuCitXaGVuOglKdW5lIDIwMTEKK1doeToJVGhlIGFkbTkyNDAsIHc4Mzc5MmQgYW5kIHc4Mzc5MyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcnMgaGF2ZQorCWxlZ2FjeSBpbnRlcmZhY2VzIGZvciBjaGFzc2lzIGludHJ1c2lvbiBkZXRlY3Rpb24uIEEgc3RhbmRhcmQKKwlpbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgdG8gZWFjaCBkcml2ZXIsIHNvIHRoZSBsZWdhY3kgaW50ZXJmYWNlCisJY2FuIGJlIHJlbW92ZWQuCitXaG86CUplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKaW5kZXggOTc3ZDg5MS4uZWY5MzQ5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwpAQCAtMzQzLDcgKzM0Myw2IEBACiAJaW50ICgqZmxfZ3JhbnQpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqLCBpbnQpOwogCXZvaWQgKCpmbF9yZWxlYXNlX3ByaXZhdGUpKHN0cnVjdCBmaWxlX2xvY2sgKik7CiAJdm9pZCAoKmZsX2JyZWFrKShzdHJ1Y3QgZmlsZV9sb2NrICopOyAvKiBicmVha19sZWFzZSBjYWxsYmFjayAqLwotCWludCAoKmZsX215bGVhc2UpKHN0cnVjdCBmaWxlX2xvY2sgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKIAlpbnQgKCpmbF9jaGFuZ2UpKHN0cnVjdCBmaWxlX2xvY2sgKiosIGludCk7CiAKIGxvY2tpbmcgcnVsZXM6CkBAIC0zNTMsNyArMzUyLDYgQEAKIGZsX2dyYW50OgkJbm8JCW5vCiBmbF9yZWxlYXNlX3ByaXZhdGU6CW1heWJlCQlubwogZmxfYnJlYWs6CQl5ZXMJCW5vCi1mbF9teWxlYXNlOgkJeWVzCQlubwogZmxfY2hhbmdlCQl5ZXMJCW5vCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBidWZmZXJfaGVhZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKaW5kZXggYWMyYTI2MS4uNmVmOGNmMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9udGZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CkBAIC00NTcsNiArNDU3LDkgQEAKIAogTm90ZSwgYSB0ZWNobmljYWwgQ2hhbmdlTG9nIGFpbWVkIGF0IGtlcm5lbCBoYWNrZXJzIGlzIGluIGZzL250ZnMvQ2hhbmdlTG9nLgogCisyLjEuMzA6CisJLSBGaXggd3JpdGV2KCkgKGl0IGtlcHQgd3JpdGluZyB0aGUgZmlyc3Qgc2VnbWVudCBvdmVyIGFuZCBvdmVyIGFnYWluCisJICBpbnN0ZWFkIG9mIG1vdmluZyBvbnRvIHN1YnNlcXVlbnQgc2VnbWVudHMpLgogMi4xLjI5OgogCS0gRml4IGEgZGVhZGxvY2sgd2hlbiBtb3VudGluZyByZWFkLXdyaXRlLgogMi4xLjI4OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nCmluZGV4IDA3YTMyYjQuLmRmYmNkMWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcKQEAgLTM2NSw4ICszNjUsOCBAQAogW3JlY29tbWVuZGVkXQogCXZmcyBub3cgdHJpZXMgdG8gZG8gcGF0aCB3YWxraW5nIGluICJyY3Utd2FsayBtb2RlIiwgd2hpY2ggYXZvaWRzCiBhdG9taWMgb3BlcmF0aW9ucyBhbmQgc2NhbGFiaWxpdHkgaGF6YXJkcyBvbiBkZW50cmllcyBhbmQgaW5vZGVzIChzZWUKLURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcGF0aC13YWxrLnR4dCkuIGRfaGFzaCBhbmQgZF9jb21wYXJlIGNoYW5nZXMgKGFib3ZlKQotYXJlIGV4YW1wbGVzIG9mIHRoZSBjaGFuZ2VzIHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcy4gRm9yIG1vcmUgY29tcGxleAorRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wYXRoLWxvb2t1cC50eHQpLiBkX2hhc2ggYW5kIGRfY29tcGFyZSBjaGFuZ2VzCisoYWJvdmUpIGFyZSBleGFtcGxlcyBvZiB0aGUgY2hhbmdlcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuIEZvciBtb3JlIGNvbXBsZXgKIGZpbGVzeXN0ZW0gY2FsbGJhY2tzLCB0aGUgdmZzIGRyb3BzIG91dCBvZiByY3Utd2FsayBtb2RlIGJlZm9yZSB0aGUgZnMgY2FsbCwgc28KIG5vIGNoYW5nZXMgYXJlIHJlcXVpcmVkIHRvIHRoZSBmaWxlc3lzdGVtLiBIb3dldmVyLCB0aGlzIGlzIGNvc3RseSBhbmQgbG9zZXMKIHRoZSBiZW5lZml0cyBvZiByY3Utd2FsayBtb2RlLiBXZSB3aWxsIGJlZ2luIHRvIGFkZCBmaWxlc3lzdGVtIGNhbGxiYWNrcyB0aGF0CkBAIC0zODMsNSArMzgzLDE0IEBACiAKIAlwZXJtaXNzaW9uIGFuZCBjaGVja19hY2wgYXJlIGlub2RlIHBlcm1pc3Npb24gY2hlY2tzIHRoYXQgYXJlIGNhbGxlZAogb24gbWFueSBvciBhbGwgZGlyZWN0b3J5IGlub2RlcyBvbiB0aGUgd2F5IGRvd24gYSBwYXRoIHdhbGsgKHRvIGNoZWNrIGZvcgotZXhlYyBwZXJtaXNzaW9uKS4gVGhlc2UgbXVzdCBub3cgYmUgcmN1LXdhbGsgYXdhcmUgKGZsYWdzICYgSVBFUk1fUkNVKS4gU2VlCi1Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgZm9yIG1vcmUgZGV0YWlscy4KK2V4ZWMgcGVybWlzc2lvbikuIFRoZXNlIG11c3Qgbm93IGJlIHJjdS13YWxrIGF3YXJlIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKS4KK1NlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAKKy0tCitbbWFuZGF0b3J5XQorCUluIC0+ZmFsbG9jYXRlKCkgeW91IG11c3QgY2hlY2sgdGhlIG1vZGUgb3B0aW9uIHBhc3NlZCBpbi4gIElmIHlvdXIKK2ZpbGVzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBob2xlIHB1bmNoaW5nIChkZWFsbG9jYXRpbmcgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiBhCitmaWxlKSB5b3UgbXVzdCByZXR1cm4gLUVPUE5PVFNVUFAgaWYgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgaXMgc2V0IGluIG1vZGUuCitDdXJyZW50bHkgeW91IGNhbiBvbmx5IGhhdmUgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgd2l0aCBGQUxMT0NfRkxfS0VFUF9TSVpFIHNldCwKK3NvIHRoZSBpX3NpemUgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hlbiBob2xlIHB1bmNoaW5nLCBldmVuIHdoZW4gcHVjaGluZyB0aGUgZW5kIG9mCithIGZpbGUgb2ZmLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggOTQ3MTIyNS4uMjNjYWU2NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0zNzUsNiArMzc1LDcgQEAKIFN3YXA6ICAgICAgICAgICAgICAgICAgMCBrQgogS2VybmVsUGFnZVNpemU6ICAgICAgICA0IGtCCiBNTVVQYWdlU2l6ZTogICAgICAgICAgIDQga0IKK0xvY2tlZDogICAgICAgICAgICAgIDM3NCBrQgogCiBUaGUgZmlyc3Qgb2YgdGhlc2UgbGluZXMgc2hvd3MgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgaXMgZGlzcGxheWVkIGZvciB0aGUKIG1hcHBpbmcgaW4gL3Byb2MvUElEL21hcHMuICBUaGUgcmVtYWluaW5nIGxpbmVzIHNob3cgdGhlIHNpemUgb2YgdGhlIG1hcHBpbmcKQEAgLTY3MCw2ICs2NzEsOCBAQAogCiA+IGNhdCAvcHJvYy9tZW1pbmZvCiAKK1RoZSAiTG9ja2VkIiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWFwcGluZyBpcyBsb2NrZWQgaW4gbWVtb3J5IG9yIG5vdC4KKwogCiBNZW1Ub3RhbDogICAgIDE2MzQ0OTcyIGtCCiBNZW1GcmVlOiAgICAgIDEzNjM0MDY0IGtCCkBAIC0xMzIwLDYgKzEzMjMsMTAgQEAKIFdyaXRpbmcgdG8gL3Byb2MvPHBpZD4vb29tX3Njb3JlX2FkaiBvciAvcHJvYy88cGlkPi9vb21fYWRqIHdpbGwgY2hhbmdlIHRoZQogb3RoZXIgd2l0aCBpdHMgc2NhbGVkIHZhbHVlLgogCitUaGUgdmFsdWUgb2YgL3Byb2MvPHBpZD4vb29tX3Njb3JlX2FkaiBtYXkgYmUgcmVkdWNlZCBubyBsb3dlciB0aGFuIHRoZSBsYXN0Cit2YWx1ZSBzZXQgYnkgYSBDQVBfU1lTX1JFU09VUkNFIHByb2Nlc3MuIFRvIHJlZHVjZSB0aGUgdmFsdWUgYW55IGxvd2VyCityZXF1aXJlcyBDQVBfU1lTX1JFU09VUkNFLgorCiBOT1RJQ0U6IC9wcm9jLzxwaWQ+L29vbV9hZGogaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLCBwbGVhc2Ugc2VlCiBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAppbmRleCBmYmIzMjRlLi5jYWU2ZDI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CkBAIC00MTUsOCArNDE1LDggQEAKICAgcGVybWlzc2lvbjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gYSBQT1NJWC1saWtlCiAgIAlmaWxlc3lzdGVtLgogCi0JTWF5IGJlIGNhbGxlZCBpbiByY3Utd2FsayBtb2RlIChmbGFncyAmIElQRVJNX1JDVSkuIElmIGluIHJjdS13YWxrCi0JbW9kZSwgdGhlIGZpbGVzeXN0ZW0gbXVzdCBjaGVjayB0aGUgcGVybWlzc2lvbiB3aXRob3V0IGJsb2NraW5nIG9yCisJTWF5IGJlIGNhbGxlZCBpbiByY3Utd2FsayBtb2RlIChmbGFncyAmIElQRVJNX0ZMQUdfUkNVKS4gSWYgaW4gcmN1LXdhbGsKKyAgICAgICAgbW9kZSwgdGhlIGZpbGVzeXN0ZW0gbXVzdCBjaGVjayB0aGUgcGVybWlzc2lvbiB3aXRob3V0IGJsb2NraW5nIG9yCiAJc3RvcmluZyB0byB0aGUgaW5vZGUuCiAKIAlJZiBhIHNpdHVhdGlvbiBpcyBlbmNvdW50ZXJlZCB0aGF0IHJjdS13YWxrIGNhbm5vdCBoYW5kbGUsIHJldHVybgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG05MjQwCmluZGV4IDJjNmYxZmUuLjM2ZThlYzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKQEAgLTE1NSw3ICsxNTUsNyBAQAogVGhlIEFETTkyNDAgcHJvdmlkZXMgYW4gaW50ZXJuYWwgb3BlbiBkcmFpbiBvbiB0aGlzIGxpbmUsIGFuZCBtYXkgb3V0cHV0CiBhIDIwIG1zIGFjdGl2ZSBsb3cgcHVsc2UgdG8gcmVzZXQgYW4gZXh0ZXJuYWwgQ2hhc3NpcyBJbnRydXNpb24gbGF0Y2guCiAKLUNsZWFyIHRoZSBDSSBsYXRjaCBieSB3cml0aW5nIHZhbHVlIDEgdG8gdGhlIHN5c2ZzIGNoYXNzaXNfY2xlYXIgZmlsZS4KK0NsZWFyIHRoZSBDSSBsYXRjaCBieSB3cml0aW5nIHZhbHVlIDAgdG8gdGhlIHN5c2ZzIGludHJ1c2lvbjBfYWxhcm0gZmlsZS4KIAogQWxhcm0gZmxhZ3MgcmVwb3J0ZWQgYXMgMTYtYml0IHdvcmQKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHM3ODI4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHM3ODI4CmluZGV4IDc1YmM0YmUuLjJiYmViZTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRzNzgyOAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Fkczc4MjgKQEAgLTksNyArOSw3IEBACiAgICAgICAgICAgICAgICBodHRwOi8vZm9jdXMudGkuY29tL2xpdC9kcy9zeW1saW5rL2Fkczc4MjgucGRmCiAKIEF1dGhvcnM6Ci0gICAgICAgIFN0ZXZlIEhhcmR5IDxzdGV2ZUBsaW51eHJlYWx0aW1lLmNvLnVrPgorICAgICAgICBTdGV2ZSBIYXJkeSA8c2hhcmR5QHJlZGhhdC5jb20+CiAKIE1vZHVsZSBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9kbWUxNzM3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9kbWUxNzM3CmluZGV4IGZjNWRmNzYuLjRkMjkzNTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZG1lMTczNworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2RtZTE3MzcKQEAgLTQyLDcgKzQyLDcgQEAKIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgY2FwYWJpbGl0aWVzIG9mIHRoZQogU01TQyBETUUxNzM3IGFuZCBBc3VzIEE4MDAwICh3aGljaCBhcmUgdGhlIHNhbWUpLCBTTVNDIFNDSDUwMjcsIFNDSDMxMXgsCiBhbmQgU0NINTEyNyBTdXBlci1JL08gY2hpcHMuIFRoZXNlIGNoaXBzIGZlYXR1cmUgbW9uaXRvcmluZyBvZiAzIHRlbXAgc2Vuc29ycwotdGVtcFsxLTNdICgyIHJlbW90ZSBkaW9kZXMgYW5kIDEgaW50ZXJuYWwpLCA3IHZvbHRhZ2VzIGluWzAtNl0gKDYgZXh0ZXJuYWwgYW5kCit0ZW1wWzEtM10gKDIgcmVtb3RlIGRpb2RlcyBhbmQgMSBpbnRlcm5hbCksIDggdm9sdGFnZXMgaW5bMC03XSAoNyBleHRlcm5hbCBhbmQKIDEgaW50ZXJuYWwpIGFuZCB1cCB0byA2IGZhbiBzcGVlZHMgZmFuWzEtNl0uIEFkZGl0aW9uYWxseSwgdGhlIGNoaXBzIGltcGxlbWVudAogdXAgdG8gNSBQV00gb3V0cHV0cyBwd21bMS0zLDUtNl0gZm9yIGNvbnRyb2xsaW5nIGZhbiBzcGVlZHMgYm90aCBtYW51YWxseSBhbmQKIGF1dG9tYXRpY2FsbHkuCkBAIC0xMDUsNiArMTA1LDcgQEAKIAlpbjQ6IFYxX0lOCQkJCTBWIC0gMS41VgogCWluNTogVlRSCSgrMy4zViBzdGFuZGJ5KQkJMFYgLSA0LjM4VgogCWluNjogVmJhdAkoKzMuMFYpCQkJMFYgLSA0LjM4VgorCWluNzogVnRyaXAJKCsxLjVWKQkJCTBWIC0gMS45OVYKIAogRWFjaCB2b2x0YWdlIGlucHV0IGhhcyBhc3NvY2lhdGVkIG1pbiBhbmQgbWF4IGxpbWl0cyB3aGljaCB0cmlnZ2VyIGFuIGFsYXJtCiB3aGVuIGNyb3NzZWQuCkBAIC0yMTcsMTAgKzIxOCwxMCBAQAogdnJtCQkJCVJXCVZvbHRhZ2UgcmVndWxhdG9yIG1vZHVsZSB2ZXJzaW9uCiAJCQkJCW51bWJlci4KIAotaW5bMC02XV9pbnB1dAkJCVJPCU1lYXN1cmVkIHZvbHRhZ2UgaW4gbWlsbGl2b2x0cy4KLWluWzAtNl1fbWluCQkJUlcJTG93IGxpbWl0IGZvciB2b2x0YWdlIGlucHV0LgotaW5bMC02XV9tYXgJCQlSVwlIaWdoIGxpbWl0IGZvciB2b2x0YWdlIGlucHV0LgotaW5bMC02XV9hbGFybQkJCVJPCVZvbHRhZ2UgaW5wdXQgYWxhcm0uIFJldHVybnMgMSBpZgoraW5bMC03XV9pbnB1dAkJCVJPCU1lYXN1cmVkIHZvbHRhZ2UgaW4gbWlsbGl2b2x0cy4KK2luWzAtN11fbWluCQkJUlcJTG93IGxpbWl0IGZvciB2b2x0YWdlIGlucHV0LgoraW5bMC03XV9tYXgJCQlSVwlIaWdoIGxpbWl0IGZvciB2b2x0YWdlIGlucHV0LgoraW5bMC03XV9hbGFybQkJCVJPCVZvbHRhZ2UgaW5wdXQgYWxhcm0uIFJldHVybnMgMSBpZgogCQkJCQl2b2x0YWdlIGlucHV0IGlzIG9yIHdlbnQgb3V0c2lkZSB0aGUKIAkJCQkJYXNzb2NpYXRlZCBtaW4tbWF4IHJhbmdlLCAwIG90aGVyd2lzZS4KIApAQCAtMzI0LDMgKzMyNSw0IEBACiBwd201CQkJb3B0CQlvcHQKIGZhbjYJCQlvcHQJCW9wdAogcHdtNgkJCW9wdAkJb3B0CitpbjcJCQkJCQl5ZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZHM2MjAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzNjIwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmUzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzNjIwCkBAIC0wLDAgKzEsMzQgQEAKK0tlcm5lbCBkcml2ZXIgZHM2MjAKKz09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIERhbGxhcyBTZW1pY29uZHVjdG9yIERTNjIwCisgICAgUHJlZml4OiAnZHM2MjAnCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIERhbGxhcyBTZW1pY29uZHVjdG9yIHdlYnNpdGUKKyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZGFsc2VtaS5jb20vCisKK0F1dGhvcnM6CisgICAgICAgIFJvbGFuZCBTdGlnZ2UgPHN0aWdnZUBhbnRjb20uZGU+CisgICAgICAgIGJhc2VkIG9uIGRzMTYyMS5jIGJ5CisgICAgICAgIENocmlzdGlhbiBXLiBadWNrc2Nod2VyZHQgPHphbnlAdHJpcS5uZXQ+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgRFM2MjAgaXMgYSAob25lIGluc3RhbmNlKSBkaWdpdGFsIHRoZXJtb21ldGVyIGFuZCB0aGVybW9zdGF0LiBJdCBoYXMgYm90aAoraGlnaCBhbmQgbG93IHRlbXBlcmF0dXJlIGxpbWl0cyB3aGljaCBjYW4gYmUgdXNlciBkZWZpbmVkIChpLmUuICBwcm9ncmFtbWVkCitpbnRvIG5vbi12b2xhdGlsZSBvbi1jaGlwIHJlZ2lzdGVycykuIFRlbXBlcmF0dXJlIHJhbmdlIGlzIC01NSBkZWdyZWUgQ2Vsc2l1cwordG8gKzEyNS4gQmV0d2VlbiAwIGFuZCA3MCBkZWdyZWUgQ2Vsc2l1cywgYWNjdXJhY3kgaXMgMC41IEtlbHZpbi4gVGhlIHZhbHVlCityZXR1cm5lZCB2aWEgc3lzZnMgZGlzcGxheXMgcG9zdCBkZWNpbWFsIHBvc2l0aW9ucy4KKworVGhlIHRoZXJtb3N0YXQgZnVuY3Rpb24gd29ya3MgYXMgZm9sbG93czogV2hlbiBjb25maWd1cmVkIHZpYSBwbGF0Zm9ybV9kYXRhCisoc3RydWN0IGRzNjIwX3BsYXRmb3JtX2RhdGEpIC5wb21vZGUgPT0gMCAoZGVmYXVsdCksIHRoZSB0aGVybW9zdGF0IG91dHB1dCBwaW4KK1BPIGlzIGFsd2F5cyBsb3cuIElmIC5wb21vZGUgPT0gMSwgdGhlIHRoZXJtb3N0YXQgaXMgaW4gUE9fTE9XIG1vZGUuIEkuZS4sIHRoZQorb3V0cHV0IHBpbiBQTyBiZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSB0ZW1wZXJhdHVyZSBmYWxscyBiZWxvdyB0ZW1wMV9taW4gYW5kCitzdGF5cyBhY3RpdmUgdW50aWwgdGhlIHRlbXBlcmF0dXJlIGdvZXMgYWJvdmUgdGVtcDFfbWF4LgorCitMaWtld2lzZSwgd2l0aCAucG9tb2RlID09IDIsIHRoZSB0aGVybW9zdGF0IGlzIGluIFBPX0hJR0ggbW9kZS4gSS5lLiwgdGhlIFBPCitvdXRwdXQgcGluIGJlY29tZXMgYWN0aXZlIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGdvZXMgYWJvdmUgdGVtcDFfbWF4IGFuZCBzdGF5cworYWN0aXZlIHVudGlsIHRoZSB0ZW1wZXJhdHVyZSBmYWxscyBiZWxvdyB0ZW1wMV9taW4uCisKK1RoZSBQTyBvdXRwdXQgcGluIG9mIHRoZSBEUzYyMCBvcGVyYXRlcyBhY3RpdmUtbG93LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zaHQyMSBiL0RvY3VtZW50YXRpb24vaHdtb24vc2h0MjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxN2ZkYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vc2h0MjEKQEAgLTAsMCArMSw0OSBAQAorS2VybmVsIGRyaXZlciBzaHQyMQorPT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogU2Vuc2lyaW9uIFNIVDIxCisgICAgUHJlZml4OiAnc2h0MjEnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUKKyAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgU2Vuc2lyaW9uIHdlYnNpdGUKKyAgICBodHRwOi8vd3d3LnNlbnNpcmlvbi5jb20vZW4vcGRmL3Byb2R1Y3RfaW5mb3JtYXRpb24vRGF0YXNoZWV0LWh1bWlkaXR5LXNlbnNvci1TSFQyMS5wZGYKKworICAqIFNlbnNpcmlvbiBTSFQyNQorICAgIFByZWZpeDogJ3NodDIxJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFNlbnNpcmlvbiB3ZWJzaXRlCisgICAgaHR0cDovL3d3dy5zZW5zaXJpb24uY29tL2VuL3BkZi9wcm9kdWN0X2luZm9ybWF0aW9uL0RhdGFzaGVldC1odW1pZGl0eS1zZW5zb3ItU0hUMjUucGRmCisKK0F1dGhvcjoKKyAgVXJzIEZsZWlzY2ggPHVycy5mbGVpc2NoQHNlbnNpcmlvbi5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgU0hUMjEgYW5kIFNIVDI1IGFyZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycyBpbiBhIERGTiBwYWNrYWdlIG9mCitvbmx5IDMgeCAzIG1tIGZvb3RwcmludCBhbmQgMS4xIG1tIGhlaWdodC4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvCitkZXZpY2VzIGlzIHRoZSBoaWdoZXIgbGV2ZWwgb2YgcHJlY2lzaW9uIG9mIHRoZSBTSFQyNSAoMS44JSByZWxhdGl2ZSBodW1pZGl0eSwKKzAuMiBkZWdyZWUgQ2Vsc2l1cykgY29tcGFyZWQgd2l0aCB0aGUgU0hUMjEgKDIuMCUgcmVsYXRpdmUgaHVtaWRpdHksCiswLjMgZGVncmVlIENlbHNpdXMpLgorCitUaGUgZGV2aWNlcyBjb21tdW5pY2F0ZSB3aXRoIHRoZSBJMkMgcHJvdG9jb2wuIEFsbCBzZW5zb3JzIGFyZSBzZXQgdG8gdGhlIHNhbWUKK0kyQyBhZGRyZXNzIDB4NDAsIHNvIGFuIGVudHJ5IHdpdGggSTJDX0JPQVJEX0lORk8oInNodDIxIiwgMHg0MCkgY2FuIGJlIHVzZWQKK2luIHRoZSBib2FyZCBzZXR1cCBjb2RlLgorCitzeXNmcy1JbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLQorCit0ZW1wMV9pbnB1dCAtIHRlbXBlcmF0dXJlIGlucHV0CitodW1pZGl0eTFfaW5wdXQgLSBodW1pZGl0eSBpbnB1dAorCitOb3RlcworLS0tLS0KKworVGhlIGRyaXZlciB1c2VzIHRoZSBkZWZhdWx0IHJlc29sdXRpb24gc2V0dGluZ3Mgb2YgMTIgYml0IGZvciBodW1pZGl0eSBhbmQgMTQKK2JpdCBmb3IgdGVtcGVyYXR1cmUsIHdoaWNoIHJlc3VsdHMgaW4gdHlwaWNhbCBtZWFzdXJlbWVudCB0aW1lcyBvZiAyMiBtcyBmb3IKK2h1bWlkaXR5IGFuZCA2NiBtcyBmb3IgdGVtcGVyYXR1cmUuIFRvIGtlZXAgc2VsZiBoZWF0aW5nIGJlbG93IDAuMSBkZWdyZWUKK0NlbHNpdXMsIHRoZSBkZXZpY2Ugc2hvdWxkIG5vdCBiZSBhY3RpdmUgZm9yIG1vcmUgdGhhbiAxMCUgb2YgdGhlIHRpbWUsCitlLmcuIG1heGltdW0gdHdvIG1lYXN1cmVtZW50cyBwZXIgc2Vjb25kIGF0IHRoZSBnaXZlbiByZXNvbHV0aW9uLgorCitEaWZmZXJlbnQgcmVzb2x1dGlvbnMsIHRoZSBvbi1jaGlwIGhlYXRlciwgdXNpbmcgdGhlIENSQyBjaGVja3N1bSBhbmQgcmVhZGluZwordGhlIHNlcmlhbCBudW1iZXIgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQppbmRleCA2NDU2OTkwLi5jNjU1OWYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpAQCAtMzg0LDEwICszODQsMjAgQEAKIAkJVW5pdDogbWlsbGlhbXBlcmUKIAkJUlcKIAorY3VyclsxLSpdX2xjcml0CUN1cnJlbnQgY3JpdGljYWwgbG93IHZhbHVlCisJCVVuaXQ6IG1pbGxpYW1wZXJlCisJCVJXCisKK2N1cnJbMS0qXV9jcml0CUN1cnJlbnQgY3JpdGljYWwgaGlnaCB2YWx1ZS4KKwkJVW5pdDogbWlsbGlhbXBlcmUKKwkJUlcKKwogY3VyclsxLSpdX2lucHV0CUN1cnJlbnQgaW5wdXQgdmFsdWUKIAkJVW5pdDogbWlsbGlhbXBlcmUKIAkJUk8KIAorQWxzbyBzZWUgdGhlIEFsYXJtcyBzZWN0aW9uIGZvciBzdGF0dXMgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnRzLgorCiAqKioqKioqKioKICogUG93ZXIgKgogKioqKioqKioqCkBAIC00NTAsMTMgKzQ2MCw2IEBACiAJCQkJVW5pdDogUGVyY2VudAogCQkJCVJPCiAKLXBvd2VyWzEtKl1fYWxhcm0JCTEgaWYgdGhlIHN5c3RlbSBpcyBkcmF3aW5nIG1vcmUgcG93ZXIgdGhhbiB0aGUKLQkJCQljYXAgYWxsb3dzOyAwIG90aGVyd2lzZS4gIEEgcG9sbCBub3RpZmljYXRpb24gaXMKLQkJCQlzZW50IHRvIHRoaXMgZmlsZSB3aGVuIHRoZSBwb3dlciB1c2UgZXhjZWVkcyB0aGUKLQkJCQljYXAuICBUaGlzIGZpbGUgb25seSBhcHBlYXJzIGlmIHRoZSBjYXAgaXMga25vd24KLQkJCQl0byBiZSBlbmZvcmNlZCBieSBoYXJkd2FyZS4KLQkJCQlSTwotCiBwb3dlclsxLSpdX2NhcAkJCUlmIHBvd2VyIHVzZSByaXNlcyBhYm92ZSB0aGlzIGxpbWl0LCB0aGUKIAkJCQlzeXN0ZW0gc2hvdWxkIHRha2UgYWN0aW9uIHRvIHJlZHVjZSBwb3dlciB1c2UuCiAJCQkJQSBwb2xsIG5vdGlmaWNhdGlvbiBpcyBzZW50IHRvIHRoaXMgZmlsZSBpZiB0aGUKQEAgLTQ3OSw2ICs0ODIsMjAgQEAKIAkJCQlVbml0OiBtaWNyb1dhdHQKIAkJCQlSTwogCitwb3dlclsxLSpdX21heAkJCU1heGltdW0gcG93ZXIuCisJCQkJVW5pdDogbWljcm9XYXR0CisJCQkJUlcKKworcG93ZXJbMS0qXV9jcml0CQkJQ3JpdGljYWwgbWF4aW11bSBwb3dlci4KKwkJCQlJZiBwb3dlciByaXNlcyB0byBvciBhYm92ZSB0aGlzIGxpbWl0LCB0aGUKKwkJCQlzeXN0ZW0gaXMgZXhwZWN0ZWQgdGFrZSBkcmFzdGljIGFjdGlvbiB0byByZWR1Y2UKKwkJCQlwb3dlciBjb25zdW1wdGlvbiwgc3VjaCBhcyBhIHN5c3RlbSBzaHV0ZG93biBvcgorCQkJCWEgZm9yY2VkIHBvd2VyZG93biBvZiBzb21lIGRldmljZXMuCisJCQkJVW5pdDogbWljcm9XYXR0CisJCQkJUlcKKworQWxzbyBzZWUgdGhlIEFsYXJtcyBzZWN0aW9uIGZvciBzdGF0dXMgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHBvd2VyIHJlYWRpbmdzLgorCiAqKioqKioqKioqCiAqIEVuZXJneSAqCiAqKioqKioqKioqCkBAIC00ODgsNiArNTA1LDE1IEBACiAJCQkJUk8KIAogCisqKioqKioqKioqKioKKyogSHVtaWRpdHkgKgorKioqKioqKioqKioqCisKK2h1bWlkaXR5WzEtKl1faW5wdXQJCUh1bWlkaXR5CisJCQkJVW5pdDogbWlsbGktcGVyY2VudCAocGVyIGNlbnQgbWlsbGUsIHBjbSkKKwkJCQlSTworCisKICoqKioqKioqKioKICogQWxhcm1zICoKICoqKioqKioqKioKQEAgLTUwMSw2ICs1MjcsNyBAQAogCiBpblswLSpdX2FsYXJtCiBjdXJyWzEtKl1fYWxhcm0KK3Bvd2VyWzEtKl1fYWxhcm0KIGZhblsxLSpdX2FsYXJtCiB0ZW1wWzEtKl1fYWxhcm0KIAkJQ2hhbm5lbCBhbGFybQpAQCAtNTEyLDEyICs1MzksMjAgQEAKIAogaW5bMC0qXV9taW5fYWxhcm0KIGluWzAtKl1fbWF4X2FsYXJtCitpblswLSpdX2xjcml0X2FsYXJtCitpblswLSpdX2NyaXRfYWxhcm0KIGN1cnJbMS0qXV9taW5fYWxhcm0KIGN1cnJbMS0qXV9tYXhfYWxhcm0KK2N1cnJbMS0qXV9sY3JpdF9hbGFybQorY3VyclsxLSpdX2NyaXRfYWxhcm0KK3Bvd2VyWzEtKl1fY2FwX2FsYXJtCitwb3dlclsxLSpdX21heF9hbGFybQorcG93ZXJbMS0qXV9jcml0X2FsYXJtCiBmYW5bMS0qXV9taW5fYWxhcm0KIGZhblsxLSpdX21heF9hbGFybQogdGVtcFsxLSpdX21pbl9hbGFybQogdGVtcFsxLSpdX21heF9hbGFybQordGVtcFsxLSpdX2xjcml0X2FsYXJtCiB0ZW1wWzEtKl1fY3JpdF9hbGFybQogdGVtcFsxLSpdX2VtZXJnZW5jeV9hbGFybQogCQlMaW1pdCBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZiBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKaW5kZXggZmIxNDVlNS4uODQzMmUxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2hmCkBAIC05MSwzICs5MSwyNSBAQAogCiBUaGUgYWJvdmUgc2VxdWVuY2UgYXNzdW1lcyBhIFN1cGVyLUkvTyBjb25maWcgc3BhY2UgYXQgMHgyZS8weDJmLCBidXQKIDB4NGUvMHg0ZiBpcyBhbHNvIHBvc3NpYmxlLgorCitWb2x0YWdlIHBpbiBtYXBwaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSB2b2x0YWdlIHBpbiBtYXBwaW5nIGZvciB0aGUgVzgzNjI3VEhGLiBUaGlzCitjYW4gYmUgdXNlZnVsIHRvIGNvbnZlcnQgZGF0YSBwcm92aWRlZCBieSBib2FyZCBtYW51ZmFjdHVyZXJzIGludG8KK3dvcmtpbmcgbGlic2Vuc29ycyBjb25maWd1cmF0aW9uIHN0YXRlbWVudHMuCisKKyAgICBXODM2MjdUSEYJCXwKKyAgUGluCXwgTmFtZQkJfCBSZWdpc3Rlcgl8IFN5c2ZzIGF0dHJpYnV0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMTAwCXwgQ1BVVkNPUkUJfCAyMGgJCXwgaW4wCisgICA5OQl8IFZJTjAJCXwgMjFoCQl8IGluMQorICAgOTgJfCBWSU4xCQl8IDIyaAkJfCBpbjIKKyAgIDk3CXwgVklOMgkJfCAyNGgJCXwgaW40CisgIDExNAl8IEFWQ0MJCXwgMjNoCQl8IGluMworICAgNjEJfCA1VlNCCQl8IDUwaCAoYmFuayA1KQl8IGluNworICAgNzQJfCBWQkFUCQl8IDUxaCAoYmFuayA1KQl8IGluOAorCitGb3Igb3RoZXIgc3VwcG9ydGVkIGRldmljZXMsIHlvdSdsbCBoYXZlIHRvIHRha2UgdGhlIGhhcmQgcGF0aCBhbmQKK2xvb2sgdXAgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhc2hlZXQgeW91cnNlbGYgKGFuZCB0aGVuIGFkZCBpdAordG8gdGhpcyBkb2N1bWVudCBwbGVhc2UuKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3OTMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MwppbmRleCA1MTE3MWE4Li42Y2M1ZjYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MwpAQCAtOTIsNyArOTIsNyBAQAogCiAqIENoYXNzaXMKICAgSWYgdGhlIGNhc2Ugb3BlbiBhbGFybSB0cmlnZ2VycywgaXQgd2lsbCBzdGF5IGluIHRoaXMgc3RhdGUgdW5sZXNzIGNsZWFyZWQKLSAgYnkgYW55IHdyaXRlIHRvIHRoZSBzeXNmcyBmaWxlICJjaGFzc2lzIi4KKyAgYnkgd3JpdGluZyAwIHRvIHRoZSBzeXNmcyBmaWxlICJpbnRydXNpb24wX2FsYXJtIi4KIAogKiBWSUQgYW5kIFZSTQogICBUaGUgVlJNIHZlcnNpb24gaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgZG9uJ3QgbW9kaWZ5IHRoZSBpdCB1bmxlc3MgeW91CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9tdXhlcy9ncGlvLWkyY211eCBiL0RvY3VtZW50YXRpb24vaTJjL211eGVzL2dwaW8taTJjbXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWNkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9tdXhlcy9ncGlvLWkyY211eApAQCAtMCwwICsxLDY1IEBACitLZXJuZWwgZHJpdmVyIGdwaW8taTJjbXV4CisKK0F1dGhvcjogUGV0ZXIgS29yc2dhYXJkIDxwZXRlci5rb3JzZ2FhcmRAYmFyY28uY29tPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworZ3Bpby1pMmNtdXggaXMgYW4gaTJjIG11eCBkcml2ZXIgcHJvdmlkaW5nIGFjY2VzcyB0byBJMkMgYnVzIHNlZ21lbnRzCitmcm9tIGEgbWFzdGVyIEkyQyBidXMgYW5kIGEgaGFyZHdhcmUgTVVYIGNvbnRyb2xsZWQgdGhyb3VnaCBHUElPIHBpbnMuCisKK0UuRy46CisKKyAgLS0tLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgQnVzIHNlZ21lbnQgMSAgIC0gLSAtIC0gLQorIHwgICAgICAgICAgfCBTQ0wvU0RBICAgIHwgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgIHwKKyB8ICAgICAgICAgIHwtLS0tLS0tLS0tLS18ICAgICAgICAgIHwKKyB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgIHwgQnVzIHNlZ21lbnQgMiB8ICAgICAgICAgICB8CisgfCAgTGludXggICB8IEdQSU8gMS4uTiAgfCAgIE1VWCAgICB8LS0tLS0tLS0tLS0tLS0tICAgRGV2aWNlcworIHwgICAgICAgICAgfC0tLS0tLS0tLS0tLXwgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyB8ICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgIHwgQnVzIHNlZ21lbnQgTQorIHwgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgIC0gLSAtIC0gLQorCitTQ0wvU0RBIG9mIHRoZSBtYXN0ZXIgSTJDIGJ1cyBpcyBtdWx0aXBsZXhlZCB0byBidXMgc2VnbWVudCAxLi5NCithY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIG9mIHRoZSBHUElPIHBpbnMgMS4uTi4KKworVXNhZ2UKKy0tLS0tCisKK2dwaW8taTJjbXV4IHVzZXMgdGhlIHBsYXRmb3JtIGJ1cywgc28geW91IG5lZWQgdG8gcHJvdmlkZSBhIHN0cnVjdAorcGxhdGZvcm1fZGV2aWNlIHdpdGggdGhlIHBsYXRmb3JtX2RhdGEgcG9pbnRpbmcgdG8gYSBzdHJ1Y3QKK2dwaW9faTJjbXV4X3BsYXRmb3JtX2RhdGEgd2l0aCB0aGUgSTJDIGFkYXB0ZXIgbnVtYmVyIG9mIHRoZSBtYXN0ZXIKK2J1cywgdGhlIG51bWJlciBvZiBidXMgc2VnbWVudHMgdG8gY3JlYXRlIGFuZCB0aGUgR1BJTyBwaW5zIHVzZWQKK3RvIGNvbnRyb2wgaXQuIFNlZSBpbmNsdWRlL2xpbnV4L2dwaW8taTJjbXV4LmggZm9yIGRldGFpbHMuCisKK0UuRy4gc29tZXRoaW5nIGxpa2UgdGhpcyBmb3IgYSBNVVggcHJvdmlkaW5nIDQgYnVzIHNlZ21lbnRzCitjb250cm9sbGVkIHRocm91Z2ggMyBHUElPIHBpbnM6CisKKyNpbmNsdWRlIDxsaW51eC9ncGlvLWkyY211eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbXlib2FyZF9ncGlvbXV4X2dwaW9zW10gPSB7CisJQVQ5MV9QSU5fUEMyNiwgQVQ5MV9QSU5fUEMyNSwgQVQ5MV9QSU5fUEMyNAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIG15Ym9hcmRfZ3Bpb211eF92YWx1ZXNbXSA9IHsKKwkwLCAxLCAyLCAzCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9faTJjbXV4X3BsYXRmb3JtX2RhdGEgbXlib2FyZF9pMmNtdXhfZGF0YSA9IHsKKwkucGFyZW50CQk9IDEsCisJLmJhc2VfbnIJPSAyLCAvKiBvcHRpb25hbCAqLworCS52YWx1ZXMJCT0gbXlib2FyZF9ncGlvbXV4X3ZhbHVlcywKKwkubl92YWx1ZXMJPSBBUlJBWV9TSVpFKG15Ym9hcmRfZ3Bpb211eF92YWx1ZXMpLAorCS5ncGlvcwkJPSBteWJvYXJkX2dwaW9tdXhfZ3Bpb3MsCisJLm5fZ3Bpb3MJPSBBUlJBWV9TSVpFKG15Ym9hcmRfZ3Bpb211eF9ncGlvcyksCisJLmlkbGUJCT0gNCwgLyogb3B0aW9uYWwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG15Ym9hcmRfaTJjbXV4ID0geworCS5uYW1lCQk9ICJncGlvLWkyY211eCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm15Ym9hcmRfaTJjbXV4X2RhdGEsCisJfSwKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2ZmLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CmluZGV4IGRlZDRkNWYuLmIzODY3YmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvZmYudHh0CkBAIC00OSw3ICs0OSw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KIAotdW5zaWduZWQgbG9uZyBmZWF0dXJlc1sxICsgRkZfTUFYL3NpemVvZih1bnNpZ25lZCBsb25nKV07CisjZGVmaW5lIEJJVFNfVE9fTE9OR1MoeCkgXAorCSgoKHgpICsgOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZykgLSAxKSAvICg4ICogc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkpCit1bnNpZ25lZCBsb25nIGZlYXR1cmVzW0JJVFNfVE9fTE9OR1MoRkZfQ05UKV07CiBpbnQgaW9jdGwoaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IHJlcXVlc3QsIHVuc2lnbmVkIGxvbmcgKmZlYXR1cmVzKTsKIAogInJlcXVlc3QiIG11c3QgYmUgRVZJT0NHQklUKEVWX0ZGLCBzaXplIG9mIGZlYXR1cmVzIGFycmF5IGluIGJ5dGVzICkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAppbmRleCBkNmE2M2M3Li5hYzI5M2U5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CkBAIC0yNDcsNyArMjQ3LDcgQEAKICdwJwk0MC03RglsaW51eC9udnJhbS5oCiAncCcJODAtOUYJbGludXgvcHBkZXYuaAkJdXNlci1zcGFjZSBwYXJwb3J0CiAJCQkJCTxtYWlsdG86dGltQGN5YmVyZWxrLm5ldD4KLSdwJwlBMS1BNAlsaW51eC9wcHMuaAkJTGludXhQUFMKKydwJwlBMS1BNQlsaW51eC9wcHMuaAkJTGludXhQUFMKIAkJCQkJPG1haWx0bzpnaW9tZXR0aUBsaW51eC5pdD4KICdxJwkwMC0xRglsaW51eC9zZXJpby5oCiAncScJODAtRkYJbGludXgvdGVsZXBob255LmgJSW50ZXJuZXQgUGhvbmVKQUNLLCBJbnRlcm5ldCBMaW5lSkFDSwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vaW9zdGF0cy50eHQKaW5kZXggNTlhNjllYy4uZjZkZWNlNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvc3RhdHMudHh0CkBAIC04MSw3ICs4MSw3IEBACiAgICAgVGhlIG9ubHkgZmllbGQgdGhhdCBzaG91bGQgZ28gdG8gemVyby4gSW5jcmVtZW50ZWQgYXMgcmVxdWVzdHMgYXJlCiAgICAgZ2l2ZW4gdG8gYXBwcm9wcmlhdGUgc3RydWN0IHJlcXVlc3RfcXVldWUgYW5kIGRlY3JlbWVudGVkIGFzIHRoZXkgZmluaXNoLgogRmllbGQgMTAgLS0gIyBvZiBtaWxsaXNlY29uZHMgc3BlbnQgZG9pbmcgSS9PcwotICAgIFRoaXMgZmllbGQgaXMgaW5jcmVhc2VzIHNvIGxvbmcgYXMgZmllbGQgOSBpcyBub256ZXJvLgorICAgIFRoaXMgZmllbGQgaW5jcmVhc2VzIHNvIGxvbmcgYXMgZmllbGQgOSBpcyBub256ZXJvLgogRmllbGQgMTEgLS0gd2VpZ2h0ZWQgIyBvZiBtaWxsaXNlY29uZHMgc3BlbnQgZG9pbmcgSS9PcwogICAgIFRoaXMgZmllbGQgaXMgaW5jcmVtZW50ZWQgYXQgZWFjaCBJL08gc3RhcnQsIEkvTyBjb21wbGV0aW9uLCBJL08KICAgICBtZXJnZSwgb3IgcmVhZCBvZiB0aGVzZSBzdGF0cyBieSB0aGUgbnVtYmVyIG9mIEkvT3MgaW4gcHJvZ3Jlc3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDFlNTE2NWEuLjRhOTkwMzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtNzMsNiArNzMsMTQgQEAKIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyAiTz0uLi4iLgogU2V0dGluZyAiTz0uLi4iIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBLQlVJTERfT1VUUFVULgogCitLQlVJTERfREVCQVJDSAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgZGViLXBrZyB0YXJnZXQsIGFsbG93cyBvdmVycmlkaW5nIHRoZSBub3JtYWwgaGV1cmlzdGljcyBkZXBsb3llZCBieQorZGViLXBrZy4gTm9ybWFsbHkgZGViLXBrZyBhdHRlbXB0cyB0byBndWVzcyB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGJhc2VkIG9uCit0aGUgVVRTX01BQ0hJTkUgdmFyaWFibGUsIGFuZCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgYWxzbyB0aGUga2VybmVsIGNvbmZpZy4KK1RoZSB2YWx1ZSBvZiBLQlVJTERfREVCQVJDSCBpcyBhc3N1bWVkIChub3QgY2hlY2tlZCkgdG8gYmUgYSB2YWxpZCBEZWJpYW4KK2FyY2hpdGVjdHVyZS4KKwogQVJDSAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNldCBBUkNIIHRvIHRoZSBhcmNoaXRlY3R1cmUgdG8gYmUgYnVpbHQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CmluZGV4IDJmZTkzY2EuLmI1MDdkNjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CkBAIC0xMTIsNyArMTEyLDYgQEAKIAkobm8gcHJvbXB0cyBhbnl3aGVyZSkgYW5kIGZvciBzeW1ib2xzIHdpdGggbm8gZGVwZW5kZW5jaWVzLgogCVRoYXQgd2lsbCBsaW1pdCB0aGUgdXNlZnVsbmVzcyBidXQgb24gdGhlIG90aGVyIGhhbmQgYXZvaWQKIAl0aGUgaWxsZWdhbCBjb25maWd1cmF0aW9ucyBhbGwgb3Zlci4KLQlrY29uZmlnIHNob3VsZCBvbmUgZGF5IHdhcm4gYWJvdXQgc3VjaCB0aGluZ3MuCiAKIC0gbnVtZXJpY2FsIHJhbmdlczogInJhbmdlIiA8c3ltYm9sPiA8c3ltYm9sPiBbImlmIiA8ZXhwcj5dCiAgIFRoaXMgYWxsb3dzIHRvIGxpbWl0IHRoZSByYW5nZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMgZm9yIGludApAQCAtMjY4LDcgKzI2Nyw3IEBACiAKIGNob2ljZXM6CiAKLQkiY2hvaWNlIgorCSJjaG9pY2UiIFtzeW1ib2xdCiAJPGNob2ljZSBvcHRpb25zPgogCTxjaG9pY2UgYmxvY2s+CiAJImVuZGNob2ljZSIKQEAgLTI4Miw2ICsyODEsMTAgQEAKIGNhbiBiZSBjb21waWxlZCBhcyBtb2R1bGVzLgogQSBjaG9pY2UgYWNjZXB0cyBhbm90aGVyIG9wdGlvbiAib3B0aW9uYWwiLCB3aGljaCBhbGxvd3MgdG8gc2V0IHRoZQogY2hvaWNlIHRvICduJyBhbmQgbm8gZW50cnkgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCitJZiBubyBbc3ltYm9sXSBpcyBhc3NvY2lhdGVkIHdpdGggYSBjaG9pY2UsIHRoZW4geW91IGNhbiBub3QgaGF2ZSBtdWx0aXBsZQorZGVmaW5pdGlvbnMgb2YgdGhhdCBjaG9pY2UuIElmIGEgW3N5bWJvbF0gaXMgYXNzb2NpYXRlZCB0byB0aGUgY2hvaWNlLAordGhlbiB5b3UgbWF5IGRlZmluZSB0aGUgc2FtZSBjaG9pY2UgKGllLiB3aXRoIHRoZSBzYW1lIGVudHJpZXMpIGluIGFub3RoZXIKK3BsYWNlLgogCiBjb21tZW50OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCAwZWYwMGJkLi44NmUzY2QwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTExMzYsNiArMTEzNiwyMSBAQAogCSAgICAgIHJlc3VsdGluZyBpbiB0aGUgdGFyZ2V0IGZpbGUgYmVpbmcgcmVjb21waWxlZCBmb3Igbm8KIAkgICAgICBvYnZpb3VzIHJlYXNvbi4KIAorICAgIGR0YworCUNyZWF0ZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBibG9iIG9iamVjdCBzdWl0YWJsZSBmb3IgbGlua2luZworCWludG8gdm1saW51eC4gRGV2aWNlIHRyZWUgYmxvYnMgbGlua2VkIGludG8gdm1saW51eCBhcmUgcGxhY2VkCisJaW4gYW4gaW5pdCBzZWN0aW9uIGluIHRoZSBpbWFnZS4gUGxhdGZvcm0gY29kZSAqbXVzdCogY29weSB0aGUKKwlibG9iIHRvIG5vbi1pbml0IG1lbW9yeSBwcmlvciB0byBjYWxsaW5nIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpLgorCisJRXhhbXBsZToKKwkJI2FyY2gveDg2L3BsYXRmb3JtL2NlNDEwMC9NYWtlZmlsZQorCQljbGVhbi1maWxlcyA6PSAqZHRiLlMKKworCQlEVENfRkxBR1MgOj0gLXAgMTAyNAorCQlvYmoteSArPSBmb28uZHRiLm8KKworCQkkKG9iaikvJS5kdGI6ICQoc3JjKS8lLmR0cworCQkJJChjYWxsIGNtZCxkdGMpCiAKIC0tLSA2LjcgQ3VzdG9tIGtidWlsZCBjb21tYW5kcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dCBiL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CmluZGV4IGNhYjYxZDguLjdhOWUwYjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CkBAIC02NSwxOCArNjUsMjEgQEAKIAogMikgRG93bmxvYWQgdGhlIGtleGVjLXRvb2xzIHVzZXItc3BhY2UgcGFja2FnZSBmcm9tIHRoZSBmb2xsb3dpbmcgVVJMOgogCi1odHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvaG9ybXMva2V4ZWMtdG9vbHMva2V4ZWMtdG9vbHMudGFyLmd6CitodHRwOi8va2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2tleGVjL2tleGVjLXRvb2xzLnRhci5negogCiBUaGlzIGlzIGEgc3ltbGluayB0byB0aGUgbGF0ZXN0IHZlcnNpb24uCiAKIFRoZSBsYXRlc3Qga2V4ZWMtdG9vbHMgZ2l0IHRyZWUgaXMgYXZhaWxhYmxlIGF0OgogCi1naXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvaG9ybXMva2V4ZWMtdG9vbHMuZ2l0Ci1vcgotaHR0cDovL3d3dy5rZXJuZWwub3JnL2dpdC8/cD1saW51eC9rZXJuZWwvZ2l0L2hvcm1zL2tleGVjLXRvb2xzLmdpdAorZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS91dGlscy9rZXJuZWwva2V4ZWMva2V4ZWMtdG9vbHMuZ2l0CithbmQKK2h0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL3V0aWxzL2tlcm5lbC9rZXhlYy9rZXhlYy10b29scy5naXQKKworVGhlcmUgaXMgYWxzbyBhIGdpdHdlYiBpbnRlcmZhY2UgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZ2l0Lz9wPXV0aWxzL2tlcm5lbC9rZXhlYy9rZXhlYy10b29scy5naXQKIAogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBrZXhlYy10b29scyBjYW4gYmUgZm91bmQgYXQKLWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ob3Jtcy9rZXhlYy10b29scy9SRUFETUUuaHRtbAoraHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9rZXJuZWwva2V4ZWMvUkVBRE1FLmh0bWwKIAogMykgVW5wYWNrIHRoZSB0YXJiYWxsIHdpdGggdGhlIHRhciBjb21tYW5kLCBhcyBmb2xsb3dzOgogCkBAIC00MzksNiArNDQyLDYgQEAKIENvbnRhY3QKID09PT09PT0KIAotVml2ZWsgR295YWwgKHZnb3lhbEBpbi5pYm0uY29tKQorVml2ZWsgR295YWwgKHZnb3lhbEByZWRoYXQuY29tKQogTWFuZWVzaCBTb25pIChtYW5lZXNoQGluLmlibS5jb20pCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZjNkYzk1MS4uYjcyZTA3MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTE5OSwxMSArMTk5LDYgQEAKIAkJCXVudXNhYmxlLiAgVGhlICJsb2dfYnVmX2xlbiIgcGFyYW1ldGVyIG1heSBiZSB1c2VmdWwKIAkJCWlmIHlvdSBuZWVkIHRvIGNhcHR1cmUgbW9yZSBvdXRwdXQuCiAKLQlhY3BpX2Rpc3BsYXlfb3V0cHV0PQlbSFcsQUNQSV0KLQkJCWFjcGlfZGlzcGxheV9vdXRwdXQ9dmVuZG9yCi0JCQlhY3BpX2Rpc3BsYXlfb3V0cHV0PXZpZGVvCi0JCQlTZWUgYWJvdmUuCi0KIAlhY3BpX2lycV9iYWxhbmNlIFtIVyxBQ1BJXQogCQkJQUNQSSB3aWxsIGJhbGFuY2UgYWN0aXZlIElSUXMKIAkJCWRlZmF1bHQgaW4gQVBJQyBtb2RlCkBAIC00MDMsNiArMzk4LDEwIEBACiAJYnR0di5wbGw9CVNlZSBEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvSW5zbW9kLW9wdGlvbnMKIAlidHR2LnR1bmVyPQlhbmQgRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NBUkRMSVNUCiAKKwlidWxrX3JlbW92ZT1vZmYJW1BQQ10gIFRoaXMgcGFyYW1ldGVyIGRpc2FibGVzIHRoZSB1c2Ugb2YgdGhlIHBTZXJpZXMKKwkJCWZpcm13YXJlIGZlYXR1cmUgZm9yIGZsdXNoaW5nIG11bHRpcGxlIGhwdGUgZW50cmllcworCQkJYXQgYSB0aW1lLgorCiAJYzEwMT0JCVtORVRdIE1veGEgQzEwMSBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZAogCiAJY2FjaGVzaXplPQlbQlVHUz1YODYtMzJdIE92ZXJyaWRlIGxldmVsIDIgQ1BVIGNhY2hlIHNpemUgZGV0ZWN0aW9uLgpAQCAtNjU1LDExICs2NTQsNiBAQAogCiAJZHNjYzQuc2V0dXA9CVtORVRdCiAKLQlkeW5hbWljX3ByaW50awlFbmFibGVzIHByX2RlYnVnKCkvZGV2X2RiZygpIGNhbGxzIGlmCi0JCQlDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaGFzIGJlZW4gZW5hYmxlZC4KLQkJCVRoZXNlIGNhbiBhbHNvIGJlIHN3aXRjaGVkIG9uL29mZiB2aWEKLQkJCTxkZWJ1Z2ZzPi9keW5hbWljX3ByaW50ay9tb2R1bGVzCi0KIAllYXJseWNvbj0JW0tOTF0gT3V0cHV0IGVhcmx5IGNvbnNvbGUgZGV2aWNlIGFuZCBvcHRpb25zLgogCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KIAkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KQEAgLTg4NCw2ICs4NzgsNyBAQAogCQkJICAgICBjb250cm9sbGVyCiAJaTgwNDIubm9wbnAJW0hXXSBEb24ndCB1c2UgQUNQSVBuUCAvIFBuUEJJT1MgdG8gZGlzY292ZXIgS0JEL0FVWAogCQkJICAgICBjb250cm9sbGVycworCWk4MDQyLm5vdGltZW91dAlbSFddIElnbm9yZSB0aW1lb3V0IGNvbmRpdGlvbiBzaWduYWxsZWQgYnkgY29ucm9sbGVyCiAJaTgwNDIucmVzZXQJW0hXXSBSZXNldCB0aGUgY29udHJvbGxlciBkdXJpbmcgaW5pdCBhbmQgY2xlYW51cAogCWk4MDQyLnVubG9jawlbSFddIFVubG9jayAoaWdub3JlKSB0aGUga2V5bG9jawogCkBAIC0xNDkwLDYgKzE0ODUsMTAgQEAKIAltdGRwYXJ0cz0JW01URF0KIAkJCVNlZSBkcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jLgogCisJbXVsdGl0Y2U9b2ZmCVtQUENdICBUaGlzIHBhcmFtZXRlciBkaXNhYmxlcyB0aGUgdXNlIG9mIHRoZSBwU2VyaWVzCisJCQlmaXJtd2FyZSBmZWF0dXJlIGZvciB1cGRhdGluZyBtdWx0aXBsZSBUQ0UgZW50cmllcworCQkJYXQgYSB0aW1lLgorCiAJb25lbmFuZC5iZHJ5PQlbSFcsTVREXSBGbGV4LU9uZU5BTkQgQm91bmRhcnkgQ29uZmlndXJhdGlvbgogCiAJCQlGb3JtYXQ6IFtkaWUwX2JvdW5kYXJ5XVssZGllMF9sb2NrXVssZGllMV9ib3VuZGFyeV1bLGRpZTFfbG9ja10KQEAgLTE3MDEsNiArMTcwMCw5IEBACiAKIAluby1rdm1jbG9jawlbWDg2LEtWTV0gRGlzYWJsZSBwYXJhdmlydHVhbGl6ZWQgS1ZNIGNsb2NrIGRyaXZlcgogCisJbm8ta3ZtYXBmCVtYODYsS1ZNXSBEaXNhYmxlIHBhcmF2aXJ0dWFsaXplZCBhc3luY2hyb25vdXMgcGFnZQorCQkJZmF1bHQgaGFuZGxpbmcuCisKIAlub2xhcGljCQlbWDg2LTMyLEFQSUNdIERvIG5vdCBlbmFibGUgb3IgdXNlIHRoZSBsb2NhbCBBUElDLgogCiAJbm9sYXBpY190aW1lcglbWDg2LTMyLEFQSUNdIERvIG5vdCB1c2UgdGhlIGxvY2FsIEFQSUMgdGltZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tleXMtdHJ1c3RlZC1lbmNyeXB0ZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI3OWJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApAQCAtMCwwICsxLDE0NSBAQAorCQkJVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMKKworVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMgYXJlIHR3byBuZXcga2V5IHR5cGVzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBrZXJuZWwKK2tleSByaW5nIHNlcnZpY2UuICBCb3RoIG9mIHRoZXNlIG5ldyB0eXBlcyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN5bW1ldGljIGtleXMsCithbmQgaW4gYm90aCBjYXNlcyBhbGwga2V5cyBhcmUgY3JlYXRlZCBpbiB0aGUga2VybmVsLCBhbmQgdXNlciBzcGFjZSBzZWVzLAorc3RvcmVzLCBhbmQgbG9hZHMgb25seSBlbmNyeXB0ZWQgYmxvYnMuICBUcnVzdGVkIEtleXMgcmVxdWlyZSB0aGUgYXZhaWxhYmlsaXR5CitvZiBhIFRydXN0ZWQgUGxhdGZvcm0gTW9kdWxlIChUUE0pIGNoaXAgZm9yIGdyZWF0ZXIgc2VjdXJpdHksIHdoaWxlIEVuY3J5cHRlZAorS2V5cyBjYW4gYmUgdXNlZCBvbiBhbnkgc3lzdGVtLiAgQWxsIHVzZXIgbGV2ZWwgYmxvYnMsIGFyZSBkaXNwbGF5ZWQgYW5kIGxvYWRlZAoraW4gaGV4IGFzY2lpIGZvciBjb252ZW5pZW5jZSwgYW5kIGFyZSBpbnRlZ3JpdHkgdmVyaWZpZWQuCisKK1RydXN0ZWQgS2V5cyB1c2UgYSBUUE0gYm90aCB0byBnZW5lcmF0ZSBhbmQgdG8gc2VhbCB0aGUga2V5cy4gIEtleXMgYXJlIHNlYWxlZAordW5kZXIgYSAyMDQ4IGJpdCBSU0Ega2V5IGluIHRoZSBUUE0sIGFuZCBvcHRpb25hbGx5IHNlYWxlZCB0byBzcGVjaWZpZWQgUENSCisoaW50ZWdyaXR5IG1lYXN1cmVtZW50KSB2YWx1ZXMsIGFuZCBvbmx5IHVuc2VhbGVkIGJ5IHRoZSBUUE0sIGlmIFBDUnMgYW5kIGJsb2IKK2ludGVncml0eSB2ZXJpZmljYXRpb25zIG1hdGNoLiAgQSBsb2FkZWQgVHJ1c3RlZCBLZXkgY2FuIGJlIHVwZGF0ZWQgd2l0aCBuZXcKKyhmdXR1cmUpIFBDUiB2YWx1ZXMsIHNvIGtleXMgYXJlIGVhc2lseSBtaWdyYXRlZCB0byBuZXcgcGNyIHZhbHVlcywgc3VjaCBhcword2hlbiB0aGUga2VybmVsIGFuZCBpbml0cmFtZnMgYXJlIHVwZGF0ZWQuICBUaGUgc2FtZSBrZXkgY2FuIGhhdmUgbWFueSBzYXZlZAorYmxvYnMgdW5kZXIgZGlmZmVyZW50IFBDUiB2YWx1ZXMsIHNvIG11bHRpcGxlIGJvb3RzIGFyZSBlYXNpbHkgc3VwcG9ydGVkLgorCitCeSBkZWZhdWx0LCB0cnVzdGVkIGtleXMgYXJlIHNlYWxlZCB1bmRlciB0aGUgU1JLLCB3aGljaCBoYXMgdGhlIGRlZmF1bHQKK2F1dGhvcml6YXRpb24gdmFsdWUgKDIwIHplcm9zKS4gIFRoaXMgY2FuIGJlIHNldCBhdCB0YWtlb3duZXJzaGlwIHRpbWUgd2l0aCB0aGUKK3Ryb3VzZXIncyB1dGlsaXR5OiAidHBtX3Rha2Vvd25lcnNoaXAgLXUgLXoiLgorCitVc2FnZToKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibmV3IGtleWxlbiBbb3B0aW9uc10iIHJpbmcKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiBbcGNybG9jaz1wY3JudW1dIiByaW5nCisgICAga2V5Y3RsIHVwZGF0ZSBrZXkgInVwZGF0ZSBbb3B0aW9uc10iCisgICAga2V5Y3RsIHByaW50IGtleWlkCisKKyAgICBvcHRpb25zOgorICAgICAgIGtleWhhbmRsZT0gYXNjaWkgaGV4IHZhbHVlIG9mIHNlYWxpbmcga2V5IGRlZmF1bHQgMHg0MDAwMDAwMCAoU1JLKQorICAgICAgIGtleWF1dGg9CSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxpbmcga2V5IGRlZmF1bHQgMHgwMC4uLmkKKwkJICAoNDAgYXNjaWkgemVyb3MpCisgICAgICAgYmxvYmF1dGg9ICBhc2NpaSBoZXggYXV0aCBmb3Igc2VhbGVkIGRhdGEgZGVmYXVsdCAweDAwLi4uCisJCSAgKDQwIGFzY2lpIHplcm9zKQorICAgICAgIGJsb2JhdXRoPSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxlZCBkYXRhIGRlZmF1bHQgMHgwMC4uLgorCQkgICg0MCBhc2NpaSB6ZXJvcykKKyAgICAgICBwY3JpbmZvPQkgIGFzY2lpIGhleCBvZiBQQ1JfSU5GTyBvciBQQ1JfSU5GT19MT05HIChubyBkZWZhdWx0KQorICAgICAgIHBjcmxvY2s9CSAgcGNyIG51bWJlciB0byBiZSBleHRlbmRlZCB0byAibG9jayIgYmxvYgorICAgICAgIG1pZ3JhdGFibGU9IDB8MSBpbmRpY2F0aW5nIHBlcm1pc3Npb24gdG8gcmVzZWFsIHRvIG5ldyBQQ1IgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgMSAocmVzZWFsaW5nIGFsbG93ZWQpCisKKyJrZXljdGwgcHJpbnQiIHJldHVybnMgYW4gYXNjaWkgaGV4IGNvcHkgb2YgdGhlIHNlYWxlZCBrZXksIHdoaWNoIGlzIGluIHN0YW5kYXJkCitUUE1fU1RPUkVEX0RBVEEgZm9ybWF0LiAgVGhlIGtleSBsZW5ndGggZm9yIG5ldyBrZXlzIGFyZSBhbHdheXMgaW4gYnl0ZXMuCitUcnVzdGVkIEtleXMgY2FuIGJlIDMyIC0gMTI4IGJ5dGVzICgyNTYgLSAxMDI0IGJpdHMpLCB0aGUgdXBwZXIgbGltaXQgaXMgdG8gZml0Cit3aXRoaW4gdGhlIDIwNDggYml0IFNSSyAoUlNBKSBrZXlsZW5ndGgsIHdpdGggYWxsIG5lY2Vzc2FyeSBzdHJ1Y3R1cmUvcGFkZGluZy4KKworRW5jcnlwdGVkIGtleXMgZG8gbm90IGRlcGVuZCBvbiBhIFRQTSwgYW5kIGFyZSBmYXN0ZXIsIGFzIHRoZXkgdXNlIEFFUyBmb3IKK2VuY3J5cHRpb24vZGVjcnlwdGlvbi4gIE5ldyBrZXlzIGFyZSBjcmVhdGVkIGZyb20ga2VybmVsIGdlbmVyYXRlZCByYW5kb20KK251bWJlcnMsIGFuZCBhcmUgZW5jcnlwdGVkL2RlY3J5cHRlZCB1c2luZyBhIHNwZWNpZmllZCAnbWFzdGVyJyBrZXkuICBUaGUKKydtYXN0ZXInIGtleSBjYW4gZWl0aGVyIGJlIGEgdHJ1c3RlZC1rZXkgb3IgdXNlci1rZXkgdHlwZS4gIFRoZSBtYWluCitkaXNhZHZhbnRhZ2Ugb2YgZW5jcnlwdGVkIGtleXMgaXMgdGhhdCBpZiB0aGV5IGFyZSBub3Qgcm9vdGVkIGluIGEgdHJ1c3RlZCBrZXksCit0aGV5IGFyZSBvbmx5IGFzIHNlY3VyZSBhcyB0aGUgdXNlciBrZXkgZW5jcnlwdGluZyB0aGVtLiAgVGhlIG1hc3RlciB1c2VyIGtleQorc2hvdWxkIHRoZXJlZm9yZSBiZSBsb2FkZWQgaW4gYXMgc2VjdXJlIGEgd2F5IGFzIHBvc3NpYmxlLCBwcmVmZXJhYmx5IGVhcmx5IGluCitib290LgorCitVc2FnZToKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibmV3IGtleS10eXBlOm1hc3Rlci1rZXktbmFtZSBrZXlsZW4iIHJpbmcKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiIgcmluZworICBrZXljdGwgdXBkYXRlIGtleWlkICJ1cGRhdGUga2V5LXR5cGU6bWFzdGVyLWtleS1uYW1lIgorCit3aGVyZSAna2V5LXR5cGUnIGlzIGVpdGhlciAndHJ1c3RlZCcgb3IgJ3VzZXInLgorCitFeGFtcGxlcyBvZiB0cnVzdGVkIGFuZCBlbmNyeXB0ZWQga2V5IHVzYWdlOgorCitDcmVhdGUgYW5kIHNhdmUgYSB0cnVzdGVkIGtleSBuYW1lZCAia21rIiBvZiBsZW5ndGggMzIgYnl0ZXM6CisKKyAgICAkIGtleWN0bCBhZGQgdHJ1c3RlZCBrbWsgIm5ldyAzMiIgQHUKKyAgICA0NDA1MDI4NDgKKworICAgICQga2V5Y3RsIHNob3cKKyAgICBTZXNzaW9uIEtleXJpbmcKKyAgICAgICAgICAgLTMgLS1hbHN3cnYgICAgNTAwICAgNTAwICBrZXlyaW5nOiBfc2VzCisgICAgIDk3ODMzNzE0IC0tYWxzd3J2ICAgIDUwMCAgICAtMSAgIFxfIGtleXJpbmc6IF91aWQuNTAwCisgICAgNDQwNTAyODQ4IC0tYWxzd3J2ICAgIDUwMCAgIDUwMCAgICAgICBcXyB0cnVzdGVkOiBrbWsKKworICAgICQga2V5Y3RsIHByaW50IDQ0MDUwMjg0OAorICAgIDAxMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDVkMDFiN2UzZjRhNmJlNTcwOTkzMGYzYjcwYTc0M2NiYjQyZTBjYzk1ZTE4ZTkxNQorICAgIDNmNjBkYTQ1NWJiZjExNDRhZDEyZTRmOTJiNDUyZjk2NjkyOWY2MTA1ZmQyOWNhMjhlNGQ0ZDVhMDMxZDA2ODQ3OGJhY2IwYgorICAgIDI3MzUxMTE5ZjgyMjkxMWIwYTExYmEzZDM0OThiYTZhMzJlNTBkYWM3ZjMyODk0ZGQ4OTBlYjlhZDU3OGU0ZTI5MmM4MzcyMgorICAgIGE1MmU1NmEwOTdlNmE2OGIzZjU2ZjdhNTJlY2UwY2RjY2JhMWViNjJjYWQ3ZDgxN2Y2ZGM1ODg5OGIzYWMxNWYzNjAyNmZlYworICAgIGQ1NjhiZDRhNzA2Y2I2MGJiMzdiZTZkOGYxMjQwNjYxMTk5ZDY0MGI2NmZiMGZlM2IwNzlmOTdmNDUwYjllZjljMjJjNmQ1ZAorICAgIGRkMzc5ZjBmYWNkMWNkMDIwMjgxZGZhM2M3MGJhMjFhM2ZhNmZjMjQ3MWRjNmQxM2VjZjgyOThiOTQ2ZjY1MzQ1ZmFhNWVmMAorICAgIGYxZjhmZmYwM2FkMGFjYjA4MzcyNTUzNTYzNmFkZGIwOGQ3M2RlZGI5ODMyZGExOTgwODFlNWRlYWU4NGJmYWYwNDA5YzIyYgorICAgIGU0YThhZWEyYjYwN2VjOTY5MzFlNmY0ZDRmZTU2M2JhCisKKyAgICAkIGtleWN0bCBwaXBlIDQ0MDUwMjg0OCA+IGttay5ibG9iCisKK0xvYWQgYSB0cnVzdGVkIGtleSBmcm9tIHRoZSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIHRydXN0ZWQga21rICJsb2FkIGBjYXQga21rLmJsb2JgIiBAdQorICAgIDI2ODcyODgyNAorCisgICAgJCBrZXljdGwgcHJpbnQgMjY4NzI4ODI0CisgICAgMDEwMTAwMDAwMDAwMDAwMDAwMDAwMTAwNWQwMWI3ZTNmNGE2YmU1NzA5OTMwZjNiNzBhNzQzY2JiNDJlMGNjOTVlMThlOTE1CisgICAgM2Y2MGRhNDU1YmJmMTE0NGFkMTJlNGY5MmI0NTJmOTY2OTI5ZjYxMDVmZDI5Y2EyOGU0ZDRkNWEwMzFkMDY4NDc4YmFjYjBiCisgICAgMjczNTExMTlmODIyOTExYjBhMTFiYTNkMzQ5OGJhNmEzMmU1MGRhYzdmMzI4OTRkZDg5MGViOWFkNTc4ZTRlMjkyYzgzNzIyCisgICAgYTUyZTU2YTA5N2U2YTY4YjNmNTZmN2E1MmVjZTBjZGNjYmExZWI2MmNhZDdkODE3ZjZkYzU4ODk4YjNhYzE1ZjM2MDI2ZmVjCisgICAgZDU2OGJkNGE3MDZjYjYwYmIzN2JlNmQ4ZjEyNDA2NjExOTlkNjQwYjY2ZmIwZmUzYjA3OWY5N2Y0NTBiOWVmOWMyMmM2ZDVkCisgICAgZGQzNzlmMGZhY2QxY2QwMjAyODFkZmEzYzcwYmEyMWEzZmE2ZmMyNDcxZGM2ZDEzZWNmODI5OGI5NDZmNjUzNDVmYWE1ZWYwCisgICAgZjFmOGZmZjAzYWQwYWNiMDgzNzI1NTM1NjM2YWRkYjA4ZDczZGVkYjk4MzJkYTE5ODA4MWU1ZGVhZTg0YmZhZjA0MDljMjJiCisgICAgZTRhOGFlYTJiNjA3ZWM5NjkzMWU2ZjRkNGZlNTYzYmEKKworUmVzZWFsIGEgdHJ1c3RlZCBrZXkgdW5kZXIgbmV3IHBjciB2YWx1ZXM6CisKKyAgICAkIGtleWN0bCB1cGRhdGUgMjY4NzI4ODI0ICJ1cGRhdGUgcGNyaW5mbz1gY2F0IHBjci5ibG9iYCIKKyAgICAkIGtleWN0bCBwcmludCAyNjg3Mjg4MjQKKyAgICAwMTAxMDAwMDAwMDAwMDJjMDAwMjgwMDA5M2MzNWEwOWI3MGZmZjI2ZTdhOThhZTc4NmM2NDFlNjc4ZWM2ZmZiNmI0NmQ4MDUKKyAgICA3N2M4YTYzNzdhZWQ5ZDMyMTljNmRmZWM0YjIzZmZlMzAwMDAwMTAwNWQzN2Q0NzJhYzhhNDQwMjNmYmIzZDE4NTgzYTRmNzMKKyAgICBkM2EwNzZjMDg1OGY2ZjFkY2FhMzllYTBmMTE5OTExZmYwM2Y1NDA2ZGY0ZjdmMjdmNDFkYThkNzE5NGY0NWM5ZjRlMDBmMmUKKyAgICBkZjQ0OWYyNjYyNTNhYTNmNTJlNTVjNTNkZTE0Nzc3M2UwMGYwZjlhY2E4NmM2NGQ5NGM5NTM4MjI2NTk2OGMzNTRjNWVhYjQKKyAgICA5NjM4YzVhZTk5Yzg5ZGUxZTA5OTcyNDJlZGZiMGI1MDE3NDRlMTFmZjk3NjJkZmQ5NTFjZmZkOTMyMjdjYzUxMzM4NGU3ZTYKKyAgICBlNzgyYzI5NDM1YzdlYzJlZGFmYWEyZjRjMWZlNmU3YTc4MWI1OTU0OWZmNTI5NjM3MWI0MjEzMzc3N2RjYzViOGI5NzE2MTAKKyAgICA5NGJjNjdlZGUxOWU0M2RkYjlkYzJiYWFjYWQzNzRhMzZmZWFmMDMxNGQ3MDBhZjBhNjVjMTY0YjcwODI0MDE3NDBlNDg5YzkKKyAgICA3ZWY2YTI0ZGVmZTQ4NDYxMDQyMDliZjBjM2VjZWQ3ZmExYTY3MmVkNWIxMjVmYzlkOGNkODhiNDc2YTY1OGE0NDM0NjQ0ZWYKKyAgICBkZjhhZTlhMTc4ZTlmODNiYTlmMDhkMTBmYTQ3ZTQyMjZiOThiMDcwMmYwNmIzYjgKKworQ3JlYXRlIGFuZCBzYXZlIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgdXNpbmcgdGhlIGFib3ZlIHRydXN0ZWQga2V5ICJrbWsiOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gIm5ldyB0cnVzdGVkOmttayAzMiIgQHUKKyAgICAxNTk3NzExNzUKKworICAgICQga2V5Y3RsIHByaW50IDE1OTc3MTE3NQorICAgIHRydXN0ZWQ6a21rIDMyIDIzNzU3MjVhZDU3Nzk4ODQ2YTliYmQyNDBkZTg5MDZmMDA2ZTY2YzAzYWY1M2IxYjM4MmRiYmM1NQorICAgIGJlMmE0NDYxNmU0OTU5NDMwNDM2ZGM0ZjJhN2E5NjU5YWE2MGJiNDY1MmFlYjIxMjBmMTQ5ZWQxOTdjNTY0ZTAyNDcxN2M2NAorICAgIDU5NzJkY2I4MmFiMmRkZTgzMzc2ZDgyYjJlM2MwOWZmYworCisgICAgJCBrZXljdGwgcGlwZSAxNTk3NzExNzUgPiBldm0uYmxvYgorCitMb2FkIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgZnJvbSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gImxvYWQgYGNhdCBldm0uYmxvYmAiIEB1CisgICAgODMxNjg0MjYyCisKKyAgICAkIGtleWN0bCBwcmludCA4MzE2ODQyNjIKKyAgICB0cnVzdGVkOmttayAzMiAyMzc1NzI1YWQ1Nzc5ODg0NmE5YmJkMjQwZGU4OTA2ZjAwNmU2NmMwM2FmNTNiMWIzODJkYmJjNTUKKyAgICBiZTJhNDQ2MTZlNDk1OTQzMDQzNmRjNGYyYTdhOTY1OWFhNjBiYjQ2NTJhZWIyMTIwZjE0OWVkMTk3YzU2NGUwMjQ3MTdjNjQKKyAgICA1OTcyZGNiODJhYjJkZGU4MzM3NmQ4MmIyZTNjMDlmZmMKKworCitUaGUgaW5pdGlhbCBjb25zdW1lciBvZiB0cnVzdGVkIGtleXMgaXMgRVZNLCB3aGljaCBhdCBib290IHRpbWUgbmVlZHMgYSBoaWdoCitxdWFsaXR5IHN5bW1ldHJpYyBrZXkgZm9yIEhNQUMgcHJvdGVjdGlvbiBvZiBmaWxlIG1ldGFkYXRhLiAgVGhlIHVzZSBvZiBhCit0cnVzdGVkIGtleSBwcm92aWRlcyBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBFVk0ga2V5IGhhcyBub3QgYmVlbgorY29tcHJvbWlzZWQgYnkgYSB1c2VyIGxldmVsIHByb2JsZW0sIGFuZCB3aGVuIHNlYWxlZCB0byBzcGVjaWZpYyBib290IFBDUgordmFsdWVzLCBwcm90ZWN0cyBhZ2FpbnN0IGJvb3QgYW5kIG9mZmxpbmUgYXR0YWNrcy4gIE90aGVyIHVzZXMgZm9yIHRydXN0ZWQgYW5kCitlbmNyeXB0ZWQga2V5cywgc3VjaCBhcyBmb3IgZGlzayBhbmQgZmlsZSBlbmNyeXB0aW9uIGFyZSBhbnRpY2lwYXRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va29fS1IvSE9XVE8gYi9Eb2N1bWVudGF0aW9uL2tvX0tSL0hPV1RPCmluZGV4IGUzYTU1YjYuLmFiNTE4OWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va29fS1IvSE9XVE8KKysrIGIvRG9jdW1lbnRhdGlvbi9rb19LUi9IT1dUTwpAQCAtMzkxLDggKzM5MSw4IEBACiBidWdtZS1qYW5pdG9yIOuplOydvOungSDrpqzsiqTtirgoYnVnemlsbGHsl5Ag66qo65OgIOuzgO2ZlOuTpOydtCDsl6zquLDshJwg66mU7J2866GcIOyghO2VtOynhOuLpCkKIOyXkCDrk7HroZ3tlZjrqbQg65Cc64ukLgogCi0gICAgICBodHRwOi8vbGlzdHMub3NkbC5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKLSAgICAgIGh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCisgICAgICBodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vYnVnbWUtbmV3CisgICAgICBodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vYnVnbWUtamFuaXRvcnMKIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IDc0MWZlNjYuLjBjZmIwMGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtNTk4LDcgKzU5OCw3IEBACiBhKSBUaGUgaW5zdHJ1Y3Rpb25zIGluIERDUiBtdXN0IGJlIHJlbG9jYXRhYmxlLgogYikgVGhlIGluc3RydWN0aW9ucyBpbiBEQ1IgbXVzdCBub3QgaW5jbHVkZSBhIGNhbGwgaW5zdHJ1Y3Rpb24uCiBjKSBKVFBSIG11c3Qgbm90IGJlIHRhcmdldGVkIGJ5IGFueSBqdW1wIG9yIGNhbGwgaW5zdHJ1Y3Rpb24uCi1kKSBEQ1IgbXVzdCBub3Qgc3RyYWRkbGUgdGhlIGJvcmRlciBiZXR3ZWVlbiBmdW5jdGlvbnMuCitkKSBEQ1IgbXVzdCBub3Qgc3RyYWRkbGUgdGhlIGJvcmRlciBiZXR3ZWVuIGZ1bmN0aW9ucy4KIAogQW55d2F5LCB0aGVzZSBsaW1pdGF0aW9ucyBhcmUgY2hlY2tlZCBieSB0aGUgaW4ta2VybmVsIGluc3RydWN0aW9uCiBkZWNvZGVyLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24va3ZtL2FwaS50eHQKaW5kZXggYjMzNjI2Ni4uYWQ4NTc5NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rdm0vYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2t2bS9hcGkudHh0CkBAIC04NzQsNyArODc0LDcgQEAKICAtIEtWTV9NUF9TVEFURV9IQUxURUQ6ICAgICAgICAgIHRoZSB2Y3B1IGhhcyBleGVjdXRlZCBhIEhMVCBpbnN0cnVjdGlvbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdAogIC0gS1ZNX01QX1NUQVRFX1NJUElfUkVDRUlWRUQ6ICAgdGhlIHZjcHUgaGFzIGp1c3QgcmVjZWl2ZWQgYSBTSVBJICh2ZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzaWJsZSB2aWEgS1ZNX0dFVF9WQ1BVX0VWRU5UUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGUgdmlhIEtWTV9HRVRfVkNQVV9FVkVOVFMpCiAKIFRoaXMgaW9jdGwgaXMgb25seSB1c2VmdWwgYWZ0ZXIgS1ZNX0NSRUFURV9JUlFDSElQLiAgV2l0aG91dCBhbiBpbi1rZXJuZWwKIGlycWNoaXAsIHRoZSBtdWx0aXByb2Nlc3Npbmcgc3RhdGUgbXVzdCBiZSBtYWludGFpbmVkIGJ5IHVzZXJzcGFjZS4KQEAgLTEwODUsNiArMTA4NSwxODQgQEAKIElmIGFueSBhZGRpdGlvbmFsIGZpZWxkIGdldHMgYWRkZWQgdG8gdGhpcyBzdHJ1Y3R1cmUgbGF0ZXIgb24sIGEgYml0IGZvciB0aGF0CiBhZGRpdGlvbmFsIHBpZWNlIG9mIGluZm9ybWF0aW9uIHdpbGwgYmUgc2V0IGluIHRoZSBmbGFncyBiaXRtYXAuCiAKKzQuNDcgS1ZNX0FTU0lHTl9QQ0lfREVWSUNFCisKK0NhcGFiaWxpdHk6IEtWTV9DQVBfREVWSUNFX0FTU0lHTk1FTlQKK0FyY2hpdGVjdHVyZXM6IHg4NiBpYTY0CitUeXBlOiB2bSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9hc3NpZ25lZF9wY2lfZGV2IChpbikKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworQXNzaWducyBhIGhvc3QgUENJIGRldmljZSB0byB0aGUgVk0uCisKK3N0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiB7CisJX191MzIgYXNzaWduZWRfZGV2X2lkOworCV9fdTMyIGJ1c25yOworCV9fdTMyIGRldmZuOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHNlZ25yOworCXVuaW9uIHsKKwkJX191MzIgcmVzZXJ2ZWRbMTFdOworCX07Cit9OworCitUaGUgUENJIGRldmljZSBpcyBzcGVjaWZpZWQgYnkgdGhlIHRyaXBsZSBzZWduciwgYnVzbnIsIGFuZCBkZXZmbi4KK0lkZW50aWZpY2F0aW9uIGluIHN1Y2NlZWRpbmcgc2VydmljZSByZXF1ZXN0cyBpcyBkb25lIHZpYSBhc3NpZ25lZF9kZXZfaWQuIFRoZQorZm9sbG93aW5nIGZsYWdzIGFyZSBzcGVjaWZpZWQ6CisKKy8qIERlcGVuZHMgb24gS1ZNX0NBUF9JT01NVSAqLworI2RlZmluZSBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUJKDEgPDwgMCkKKworNC40OCBLVk1fREVBU1NJR05fUENJX0RFVklDRQorCitDYXBhYmlsaXR5OiBLVk1fQ0FQX0RFVklDRV9ERUFTU0lHTk1FTlQKK0FyY2hpdGVjdHVyZXM6IHg4NiBpYTY0CitUeXBlOiB2bSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9hc3NpZ25lZF9wY2lfZGV2IChpbikKK1JldHVybnM6IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKKworRW5kcyBQQ0kgZGV2aWNlIGFzc2lnbm1lbnQsIHJlbGVhc2luZyBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisKK1NlZSBLVk1fQ0FQX0RFVklDRV9BU1NJR05NRU5UIGZvciB0aGUgZGF0YSBzdHJ1Y3R1cmUuIE9ubHkgYXNzaWduZWRfZGV2X2lkIGlzCit1c2VkIGluIGt2bV9hc3NpZ25lZF9wY2lfZGV2IHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuCisKKzQuNDkgS1ZNX0FTU0lHTl9ERVZfSVJRCisKK0NhcGFiaWxpdHk6IEtWTV9DQVBfQVNTSUdOX0RFVl9JUlEKK0FyY2hpdGVjdHVyZXM6IHg4NiBpYTY0CitUeXBlOiB2bSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgKGluKQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorCitBc3NpZ25zIGFuIElSUSB0byBhIHBhc3NlZC10aHJvdWdoIGRldmljZS4KKworc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UzMiBob3N0X2lycTsKKwlfX3UzMiBndWVzdF9pcnE7CisJX191MzIgZmxhZ3M7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX191MzIgYWRkcl9sbzsKKwkJCV9fdTMyIGFkZHJfaGk7CisJCQlfX3UzMiBkYXRhOworCQl9IGd1ZXN0X21zaTsKKwkJX191MzIgcmVzZXJ2ZWRbMTJdOworCX07Cit9OworCitUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBkZWZpbmVkOgorCisjZGVmaW5lIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCAgICAoMSA8PCAwKQorI2RlZmluZSBLVk1fREVWX0lSUV9IT1NUX01TSSAgICAgKDEgPDwgMSkKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYICAgICgxIDw8IDIpCisKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfSU5UWCAgICgxIDw8IDgpCisjZGVmaW5lIEtWTV9ERVZfSVJRX0dVRVNUX01TSSAgICAoMSA8PCA5KQorI2RlZmluZSBLVk1fREVWX0lSUV9HVUVTVF9NU0lYICAgKDEgPDwgMTApCisKK0l0IGlzIG5vdCB2YWxpZCB0byBzcGVjaWZ5IG11bHRpcGxlIHR5cGVzIHBlciBob3N0IG9yIGd1ZXN0IElSUS4gSG93ZXZlciwgdGhlCitJUlEgdHlwZSBvZiBob3N0IGFuZCBndWVzdCBjYW4gZGlmZmVyIG9yIGNhbiBldmVuIGJlIG51bGwuCisKKzQuNTAgS1ZNX0RFQVNTSUdOX0RFVl9JUlEKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9BU1NJR05fREVWX0lSUQorQXJjaGl0ZWN0dXJlczogeDg2IGlhNjQKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisKK0VuZHMgYW4gSVJRIGFzc2lnbm1lbnQgdG8gYSBwYXNzZWQtdGhyb3VnaCBkZXZpY2UuCisKK1NlZSBLVk1fQVNTSUdOX0RFVl9JUlEgZm9yIHRoZSBkYXRhIHN0cnVjdHVyZS4gVGhlIHRhcmdldCBkZXZpY2UgaXMgc3BlY2lmaWVkCitieSBhc3NpZ25lZF9kZXZfaWQsIGZsYWdzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgSVJRIHR5cGUgc3BlY2lmaWVkIG9uCitLVk1fQVNTSUdOX0RFVl9JUlEuIFBhcnRpYWwgZGVhc3NpZ25tZW50IG9mIGhvc3Qgb3IgZ3Vlc3QgSVJRIGlzIGFsbG93ZWQuCisKKzQuNTEgS1ZNX1NFVF9HU0lfUk9VVElORworCitDYXBhYmlsaXR5OiBLVk1fQ0FQX0lSUV9ST1VUSU5HCitBcmNoaXRlY3R1cmVzOiB4ODYgaWE2NAorVHlwZTogdm0gaW9jdGwKK1BhcmFtZXRlcnM6IHN0cnVjdCBrdm1faXJxX3JvdXRpbmcgKGluKQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorCitTZXRzIHRoZSBHU0kgcm91dGluZyB0YWJsZSBlbnRyaWVzLCBvdmVyd3JpdGluZyBhbnkgcHJldmlvdXNseSBzZXQgZW50cmllcy4KKworc3RydWN0IGt2bV9pcnFfcm91dGluZyB7CisJX191MzIgbnI7CisJX191MzIgZmxhZ3M7CisJc3RydWN0IGt2bV9pcnFfcm91dGluZ19lbnRyeSBlbnRyaWVzWzBdOworfTsKKworTm8gZmxhZ3MgYXJlIHNwZWNpZmllZCBzbyBmYXIsIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uCisKK3N0cnVjdCBrdm1faXJxX3JvdXRpbmdfZW50cnkgeworCV9fdTMyIGdzaTsKKwlfX3UzMiB0eXBlOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHBhZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfaXJxY2hpcCBpcnFjaGlwOworCQlzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX21zaSBtc2k7CisJCV9fdTMyIHBhZFs4XTsKKwl9IHU7Cit9OworCisvKiBnc2kgcm91dGluZyBlbnRyeSB0eXBlcyAqLworI2RlZmluZSBLVk1fSVJRX1JPVVRJTkdfSVJRQ0hJUCAxCisjZGVmaW5lIEtWTV9JUlFfUk9VVElOR19NU0kgMgorCitObyBmbGFncyBhcmUgc3BlY2lmaWVkIHNvIGZhciwgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4KKworc3RydWN0IGt2bV9pcnFfcm91dGluZ19pcnFjaGlwIHsKKwlfX3UzMiBpcnFjaGlwOworCV9fdTMyIHBpbjsKK307CisKK3N0cnVjdCBrdm1faXJxX3JvdXRpbmdfbXNpIHsKKwlfX3UzMiBhZGRyZXNzX2xvOworCV9fdTMyIGFkZHJlc3NfaGk7CisJX191MzIgZGF0YTsKKwlfX3UzMiBwYWQ7Cit9OworCis0LjUyIEtWTV9BU1NJR05fU0VUX01TSVhfTlIKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9ERVZJQ0VfTVNJWAorQXJjaGl0ZWN0dXJlczogeDg2IGlhNjQKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfbnIgKGluKQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorCitTZXQgdGhlIG51bWJlciBvZiBNU0ktWCBpbnRlcnJ1cHRzIGZvciBhbiBhc3NpZ25lZCBkZXZpY2UuIFRoaXMgc2VydmljZSBjYW4KK29ubHkgYmUgY2FsbGVkIG9uY2UgaW4gdGhlIGxpZmV0aW1lIG9mIGFuIGFzc2lnbmVkIGRldmljZS4KKworc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X25yIHsKKwlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CisJX191MTYgZW50cnlfbnI7CisJX191MTYgcGFkZGluZzsKK307CisKKyNkZWZpbmUgS1ZNX01BWF9NU0lYX1BFUl9ERVYJCTI1NgorCis0LjUzIEtWTV9BU1NJR05fU0VUX01TSVhfRU5UUlkKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9ERVZJQ0VfTVNJWAorQXJjaGl0ZWN0dXJlczogeDg2IGlhNjQKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfZW50cnkgKGluKQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorCitTcGVjaWZpZXMgdGhlIHJvdXRpbmcgb2YgYW4gTVNJLVggYXNzaWduZWQgZGV2aWNlIGludGVycnVwdCB0byBhIEdTSS4gU2V0dGluZwordGhlIEdTSSB2ZWN0b3IgdG8gemVybyBtZWFucyBkaXNhYmxpbmcgdGhlIGludGVycnVwdC4KKworc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X2VudHJ5IHsKKwlfX3UzMiBhc3NpZ25lZF9kZXZfaWQ7CisJX191MzIgZ3NpOworCV9fdTE2IGVudHJ5OyAvKiBUaGUgaW5kZXggb2YgZW50cnkgaW4gdGhlIE1TSS1YIHRhYmxlICovCisJX191MTYgcGFkZGluZ1szXTsKK307CisKIDUuIFRoZSBrdm1fcnVuIHN0cnVjdHVyZQogCiBBcHBsaWNhdGlvbiBjb2RlIG9idGFpbnMgYSBwb2ludGVyIHRvIHRoZSBrdm1fcnVuIHN0cnVjdHVyZSBieQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vY3B1aWQudHh0IGIvRG9jdW1lbnRhdGlvbi9rdm0vY3B1aWQudHh0CmluZGV4IDE0YTEyZWEuLjg4MjA2ODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3ZtL2NwdWlkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2t2bS9jcHVpZC50eHQKQEAgLTM2LDYgKzM2LDkgQEAKIEtWTV9GRUFUVVJFX0NMT0NLU09VUkNFMiAgICAgICAgICAgfHwgICAgIDMgfHwga3ZtY2xvY2sgYXZhaWxhYmxlIGF0IG1zcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgICAgfHwgMHg0YjU2NGQwMCBhbmQgMHg0YjU2NGQwMQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitLVk1fRkVBVFVSRV9BU1lOQ19QRiAgICAgICAgICAgICAgIHx8ICAgICA0IHx8IGFzeW5jIHBmIGNhbiBiZSBlbmFibGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgIHx8IHdyaXRpbmcgdG8gbXNyIDB4NGI1NjRkMDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogS1ZNX0ZFQVRVUkVfQ0xPQ0tTT1VSQ0VfU1RBQkxFX0JJVCB8fCAgICAyNCB8fCBob3N0IHdpbGwgd2FybiBpZiBubyBndWVzdC1zaWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgIHx8IHBlci1jcHUgd2FycHMgYXJlIGV4cGVjdGVkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgIHx8IGt2bWNsb2NrLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rdm0vbXNyLnR4dCBiL0RvY3VtZW50YXRpb24va3ZtL21zci50eHQKaW5kZXggOGRkY2ZlOC4uZDA3OWFlZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rdm0vbXNyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2t2bS9tc3IudHh0CkBAIC0zLDcgKzMsNiBAQAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogS1ZNIG1ha2VzIHVzZSBvZiBzb21lIGN1c3RvbSBNU1JzIHRvIHNlcnZpY2Ugc29tZSByZXF1ZXN0cy4KLUF0IHByZXNlbnQsIHRoaXMgZmFjaWxpdHkgaXMgb25seSB1c2VkIGJ5IGt2bWNsb2NrLgogCiBDdXN0b20gTVNScyBoYXZlIGEgcmFuZ2UgcmVzZXJ2ZWQgZm9yIHRoZW0sIHRoYXQgZ29lcyBmcm9tCiAweDRiNTY0ZDAwIHRvIDB4NGI1NjRkZmYuIFRoZXJlIGFyZSBNU1JzIG91dHNpZGUgdGhpcyBhcmVhLApAQCAtMTUxLDMgKzE1MCwzOCBAQAogCQkJcmV0dXJuIFBSRVNFTlQ7CiAJCX0gZWxzZQogCQkJcmV0dXJuIE5PTl9QUkVTRU5UOworCitNU1JfS1ZNX0FTWU5DX1BGX0VOOiAweDRiNTY0ZDAyCisJZGF0YTogQml0cyA2My02IGhvbGQgNjQtYnl0ZSBhbGlnbmVkIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYQorCTY0IGJ5dGUgbWVtb3J5IGFyZWEgd2hpY2ggbXVzdCBiZSBpbiBndWVzdCBSQU0gYW5kIG11c3QgYmUKKwl6ZXJvZWQuIEJpdHMgNS0yIGFyZSByZXNlcnZlZCBhbmQgc2hvdWxkIGJlIHplcm8uIEJpdCAwIGlzIDEKKwl3aGVuIGFzeW5jaHJvbm91cyBwYWdlIGZhdWx0cyBhcmUgZW5hYmxlZCBvbiB0aGUgdmNwdSAwIHdoZW4KKwlkaXNhYmxlZC4gQml0IDIgaXMgMSBpZiBhc3luY2hyb25vdXMgcGFnZSBmYXVsdHMgY2FuIGJlIGluamVjdGVkCisJd2hlbiB2Y3B1IGlzIGluIGNwbCA9PSAwLgorCisJRmlyc3QgNCBieXRlIG9mIDY0IGJ5dGUgbWVtb3J5IGxvY2F0aW9uIHdpbGwgYmUgd3JpdHRlbiB0byBieQorCXRoZSBoeXBlcnZpc29yIGF0IHRoZSB0aW1lIG9mIGFzeW5jaHJvbm91cyBwYWdlIGZhdWx0IChBUEYpCisJaW5qZWN0aW9uIHRvIGluZGljYXRlIHR5cGUgb2YgYXN5bmNocm9ub3VzIHBhZ2UgZmF1bHQuIFZhbHVlCisJb2YgMSBtZWFucyB0aGF0IHRoZSBwYWdlIHJlZmVycmVkIHRvIGJ5IHRoZSBwYWdlIGZhdWx0IGlzIG5vdAorCXByZXNlbnQuIFZhbHVlIDIgbWVhbnMgdGhhdCB0aGUgcGFnZSBpcyBub3cgYXZhaWxhYmxlLiBEaXNhYmxpbmcKKwlpbnRlcnJ1cHQgaW5oaWJpdHMgQVBGcy4gR3Vlc3QgbXVzdCBub3QgZW5hYmxlIGludGVycnVwdAorCWJlZm9yZSB0aGUgcmVhc29uIGlzIHJlYWQsIG9yIGl0IG1heSBiZSBvdmVyd3JpdHRlbiBieSBhbm90aGVyCisJQVBGLiBTaW5jZSBBUEYgdXNlcyB0aGUgc2FtZSBleGNlcHRpb24gdmVjdG9yIGFzIHJlZ3VsYXIgcGFnZQorCWZhdWx0IGd1ZXN0IG11c3QgcmVzZXQgdGhlIHJlYXNvbiB0byAwIGJlZm9yZSBpdCBkb2VzCisJc29tZXRoaW5nIHRoYXQgY2FuIGdlbmVyYXRlIG5vcm1hbCBwYWdlIGZhdWx0LiAgSWYgZHVyaW5nIHBhZ2UKKwlmYXVsdCBBUEYgcmVhc29uIGlzIDAgaXQgbWVhbnMgdGhhdCB0aGlzIGlzIHJlZ3VsYXIgcGFnZQorCWZhdWx0LgorCisJRHVyaW5nIGRlbGl2ZXJ5IG9mIHR5cGUgMSBBUEYgY3IyIGNvbnRhaW5zIGEgdG9rZW4gdGhhdCB3aWxsCisJYmUgdXNlZCB0byBub3RpZnkgYSBndWVzdCB3aGVuIG1pc3NpbmcgcGFnZSBiZWNvbWVzCisJYXZhaWxhYmxlLiBXaGVuIHBhZ2UgYmVjb21lcyBhdmFpbGFibGUgdHlwZSAyIEFQRiBpcyBzZW50IHdpdGgKKwljcjIgc2V0IHRvIHRoZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UuIFRoZXJlIGlzIHNwZWNpYWwKKwlraW5kIG9mIHRva2VuIDB4ZmZmZmZmZmYgd2hpY2ggdGVsbHMgdmNwdSB0aGF0IGl0IHNob3VsZCB3YWtlCisJdXAgYWxsIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBBUEZzIGFuZCBubyBpbmRpdmlkdWFsIHR5cGUgMiBBUEZzCisJd2lsbCBiZSBzZW50LgorCisJSWYgQVBGIGlzIGRpc2FibGVkIHdoaWxlIHRoZXJlIGFyZSBvdXRzdGFuZGluZyBBUEZzLCB0aGV5IHdpbGwKKwlub3QgYmUgZGVsaXZlcmVkLgorCisJQ3VycmVudGx5IHR5cGUgMiBBUEYgd2lsbCBiZSBhbHdheXMgZGVsaXZlcmVkIG9uIHRoZSBzYW1lIHZjcHUgYXMKKwl0eXBlIDEgd2FzLCBidXQgZ3Vlc3Qgc2hvdWxkIG5vdCByZWx5IG9uIHRoYXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9sZ3Vlc3QvbGd1ZXN0LnR4dAppbmRleCBlZmIzYTZhLi42Y2NhZjhlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xndWVzdC9sZ3Vlc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGd1ZXN0L2xndWVzdC50eHQKQEAgLTExMSw4ICsxMTEsMTEgQEAKIAogICBUaGVuIHVzZSAtLXR1bm5ldD1icmlkZ2U6bGcwIHdoZW4gbGF1bmNoaW5nIHRoZSBndWVzdC4KIAotICBTZWUgaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvQnJpZGdlIGZvciBnZW5lcmFsIGluZm9ybWF0aW9uCi0gIG9uIGhvdyB0byBnZXQgYnJpZGdpbmcgd29ya2luZy4KKyAgU2VlOgorICAKKyAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvY29sbGFib3JhdGUvd29ya2dyb3Vwcy9uZXR3b3JraW5nL2JyaWRnZQorICAgIAorICBmb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0IGJyaWRnaW5nIHRvIHdvcmsuCiAKIFRoZXJlIGlzIGEgaGVscGZ1bCBtYWlsaW5nIGxpc3QgYXQgaHR0cDovL296bGFicy5vcmcvbWFpbG1hbi9saXN0aW5mby9sZ3Vlc3QKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9tYWdpYy1udW1iZXIudHh0CmluZGV4IDUwNWYxOTYuLjRiMTJhYmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWFnaWMtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21hZ2ljLW51bWJlci50eHQKQEAgLTE1MCw3ICsxNTAsNyBAQAogU1RMX0JPQVJETUFHSUMgICAgICAgIDB4YTIyNjdmNTIgIHN0bGJyZCAgICAgICAgICAgIGluY2x1ZGUvbGludXgvc3RhbGxpb24uaAogRU5JMTU1X01BR0lDICAgICAgICAgIDB4YTU0Yjg3MmQgIG1pZHdheV9lcHJvbQkgICAgZHJpdmVycy9hdG0vZW5pLmgKIFNDSV9NQUdJQyAgICAgICAgICAgICAweGJhYmVmYWNlICBnc19wb3J0ICAgICAgICAgICBkcml2ZXJzL2NoYXIvc2gtc2NpLmgKLUNPREFfTUFHSUMgICAgICAgICAgICAweEMwREFDMERBICBjb2RhX2ZpbGVfaW5mbyAgICBpbmNsdWRlL2xpbnV4L2NvZGFfZnNfaS5oCitDT0RBX01BR0lDICAgICAgICAgICAgMHhDMERBQzBEQSAgY29kYV9maWxlX2luZm8gICAgZnMvY29kYS9jb2RhX2ZzX2kuaAogRFBNRU1fTUFHSUMgICAgICAgICAgIDB4YzBmZmVlMTEgIGdkdF9wY2lfc3JhbSAgICAgIGRyaXZlcnMvc2NzaS9nZHRoLmgKIFNUTElfUE9SVE1BR0lDICAgICAgICAweGU2NzFjN2ExICBzdGxpcG9ydCAgICAgICAgICBpbmNsdWRlL2xpbnV4L2lzdGFsbGlvbi5oCiBZQU1fTUFHSUMgICAgICAgICAgICAgMHhGMTBBNzY1NCAgeWFtX3BvcnQgICAgICAgICAgZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFrZS9oZWFkZXJzX2luc3RhbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKaW5kZXggZjI0ODFjYS4uOTUxZWI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKQEAgLTM5LDggKzM5LDkgQEAKIFRoZSBjb21tYW5kICJtYWtlIGhlYWRlcnNfaW5zdGFsbF9hbGwiIGV4cG9ydHMgaGVhZGVycyBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKIHNpbXVsdGFuZW91c2x5LiAgKFRoaXMgaXMgbW9zdGx5IG9mIGludGVyZXN0IHRvIGRpc3RyaWJ1dGlvbiBtYWludGFpbmVycywKIHdobyBjcmVhdGUgYW4gYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IHRhcmJhbGwgZnJvbSB0aGUgcmVzdWx0aW5nIGluY2x1ZGUKLWRpcmVjdG9yeS4pICBSZW1lbWJlciB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBsaW51eC9hc20gZGlyZWN0b3J5IHZpYSAibXYiCi1vciAibG4gLXMiIGJlZm9yZSBidWlsZGluZyBhIEMgbGlicmFyeSB3aXRoIGhlYWRlcnMgZXhwb3J0ZWQgdGhpcyB3YXkuCitkaXJlY3RvcnkuKSAgWW91IGFsc28gY2FuIHVzZSBIRFJfQVJDSF9MSVNUIHRvIHNwZWNpZnkgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLgorUmVtZW1iZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgbGludXgvYXNtIGRpcmVjdG9yeSB2aWEgIm12IiBvciAibG4gLXMiCitiZWZvcmUgYnVpbGRpbmcgYSBDIGxpYnJhcnkgd2l0aCBoZWFkZXJzIGV4cG9ydGVkIHRoaXMgd2F5LgogCiBUaGUga2VybmVsIGhlYWRlciBleHBvcnQgaW5mcmFzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZCBieSBEYXZpZCBXb29kaG91c2UKIDxkd213MkBpbmZyYWRlYWQub3JnPi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9icmlkZ2UudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQKaW5kZXggYmVjNjlhOC4uYTdiYTVlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQKQEAgLTEsOCArMSw4IEBACiBJbiBvcmRlciB0byB1c2UgdGhlIEV0aGVybmV0IGJyaWRnaW5nIGZ1bmN0aW9uYWxpdHksIHlvdSdsbCBuZWVkIHRoZQogdXNlcnNwYWNlIHRvb2xzLiBUaGVzZSBwcm9ncmFtcyBhbmQgZG9jdW1lbnRhdGlvbiBhcmUgYXZhaWxhYmxlCi1hdCBodHRwOi8vd3d3LmxpbnV4LWZvdW5kYXRpb24ub3JnL2VuL05ldDpCcmlkZ2UuICBUaGUgZG93bmxvYWQgcGFnZSBpcworYXQgaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2VuL05ldDpCcmlkZ2UuICBUaGUgZG93bmxvYWQgcGFnZSBpcwogaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9icmlkZ2UuCiAKIElmIHlvdSBzdGlsbCBoYXZlIHF1ZXN0aW9ucywgZG9uJ3QgaGVzaXRhdGUgdG8gcG9zdCB0byB0aGUgbWFpbGluZyBsaXN0IAotKG1vcmUgaW5mbyBodHRwOi8vbGlzdHMub3NkbC5vcmcvbWFpbG1hbi9saXN0aW5mby9icmlkZ2UpLgorKG1vcmUgaW5mbyBodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vYnJpZGdlKS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NhaWYvc3BpX3BvcnRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NhaWYvc3BpX3BvcnRpbmcudHh0CmluZGV4IDYxZDdjOTIuLjBjYjhjYjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYWlmL3NwaV9wb3J0aW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FpZi9zcGlfcG9ydGluZy50eHQKQEAgLTMyLDcgKzMyLDcgQEAKIAlUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQ0FJRiBTUEkgaW50ZXJmYWNlIHRvIGdpdmUKIAl5b3UgYSBjaGFuY2UgdG8gc2V0IHVwIHlvdXIgaGFyZHdhcmUgdG8gYmUgcmVhZHkgdG8gcmVjZWl2ZQogCWEgc3RyZWFtIG9mIGRhdGEgZnJvbSB0aGUgbWFzdGVyLiBUaGUgeGZlciBzdHJ1Y3R1cmUgY29udGFpbnMKLQlib3RoIHBoeXNpY2FsIGFuZCBsb2dpY2FsIGFkcmVzc2VzLCBhcyB3ZWxsIGFzIHRoZSB0b3RhbCBsZW5ndGgKKwlib3RoIHBoeXNpY2FsIGFuZCBsb2dpY2FsIGFkZHJlc3NlcywgYXMgd2VsbCBhcyB0aGUgdG90YWwgbGVuZ3RoCiAJb2YgdGhlIHRyYW5zZmVyIGluIGJvdGggZGlyZWN0aW9ucy5UaGUgZGV2IHBhcmFtZXRlciBjYW4gYmUgdXNlZAogCXRvIG1hcCB0byBkaWZmZXJlbnQgQ0FJRiBTUEkgc2xhdmUgZGV2aWNlcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RjY3AudHh0CmluZGV4IDgxMTg3MmIuLmQ3MThiYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kY2NwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGNjcC50eHQKQEAgLTM4LDExICszOCwxMSBAQAogc3BlY2lmaWVkIGluIFJGQ3MgNDM0MC4uLjQyLgogCiBUaGUga25vd24gYnVncyBhcmUgYXQ6Ci0JaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvVE9ETyNEQ0NQCisJaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2NvbGxhYm9yYXRlL3dvcmtncm91cHMvbmV0d29ya2luZy90b2RvI0RDQ1AKIAogRm9yIG1vcmUgdXAtdG8tZGF0ZSB2ZXJzaW9ucyBvZiB0aGUgRENDUCBpbXBsZW1lbnRhdGlvbiwgcGxlYXNlIGNvbnNpZGVyIHVzaW5nCiB0aGUgZXhwZXJpbWVudGFsIERDQ1AgdGVzdCB0cmVlOyBpbnN0cnVjdGlvbnMgZm9yIGNoZWNraW5nIHRoaXMgb3V0IGFyZSBvbjoKLWh0dHA6Ly9saW51eC1uZXQub3NkbC5vcmcvaW5kZXgucGhwL0RDQ1BfVGVzdGluZyNFeHBlcmltZW50YWxfRENDUF9zb3VyY2VfdHJlZQoraHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2NvbGxhYm9yYXRlL3dvcmtncm91cHMvbmV0d29ya2luZy9kY2NwX3Rlc3RpbmcjRXhwZXJpbWVudGFsX0RDQ1Bfc291cmNlX3RyZWUKIAogCiBTb2NrZXQgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2dlbmVyaWNfbmV0bGluay50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZ2VuZXJpY19uZXRsaW5rLnR4dAppbmRleCBkNGY4YjhiLi4zZTA3MTExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZ2VuZXJpY19uZXRsaW5rLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZ2VuZXJpY19uZXRsaW5rLnR4dApAQCAtMSwzICsxLDMgQEAKIEEgd2lraSBkb2N1bWVudCBvbiBob3cgdG8gdXNlIEdlbmVyaWMgTmV0bGluayBjYW4gYmUgZm91bmQgaGVyZToKIAotICogaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvR2VuZXJpY19OZXRsaW5rX0hPV1RPCisgKiBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvY29sbGFib3JhdGUvd29ya2dyb3Vwcy9uZXR3b3JraW5nL2dlbmVyaWNfbmV0bGlua19ob3d0bwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZmMvbmZjLXBuNTQ0LnR4dCBiL0RvY3VtZW50YXRpb24vbmZjL25mYy1wbjU0NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmZjL25mYy1wbjU0NC50eHQKQEAgLTAsMCArMSwxMTQgQEAKK0tlcm5lbCBkcml2ZXIgZm9yIHRoZSBOWFAgU2VtaWNvbmR1Y3RvcnMgUE41NDQgTmVhciBGaWVsZAorQ29tbXVuaWNhdGlvbiBjaGlwCisKK0F1dGhvcjogSmFyaSBWYW5oYWxhCitDb250YWN0OiBNYXR0aSBBYWx0b25lbiAobWF0dGkuai5hYWx0b25lbiBhdCBub2tpYS5jb20pCisKK0dlbmVyYWwKKy0tLS0tLS0KKworVGhlIFBONTQ0IGlzIGFuIGludGVncmF0ZWQgdHJhbnNtaXNzaW9uIG1vZHVsZSBmb3IgY29udGFjdGxlc3MKK2NvbW11bmljYXRpb24uIFRoZSBkcml2ZXIgZ29lcyB1bmRlciBkcml2ZXMvbmZjLyBhbmQgaXMgY29tcGlsZWQgYXMgYQorbW9kdWxlIG5hbWVkICJwbjU0NCIuIEl0IHJlZ2lzdGVycyBhIG1pc2MgZGV2aWNlIGFuZCBjcmVhdGVzIGEgZGV2aWNlCitmaWxlIG5hbWVkICIvZGV2L3BuNTQ0Ii4KKworSG9zdCBJbnRlcmZhY2VzOiBJMkMsIFNQSSBhbmQgSFNVLCB0aGlzIGRyaXZlciBzdXBwb3J0cyBjdXJyZW50bHkgb25seSBJMkMuCisKK1RoZSBJbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0KKworVGhlIGRyaXZlciBvZmZlcnMgYSBzeXNmcyBpbnRlcmZhY2UgZm9yIGEgaGFyZHdhcmUgdGVzdCBhbmQgYW4gSU9DVEwKK2ludGVyZmFjZSBmb3Igc2VsZWN0aW5nIGJldHdlZW4gdHdvIG9wZXJhdGluZyBtb2Rlcy4gVGhlcmUgYXJlIHJlYWQsCit3cml0ZSBhbmQgcG9sbCBmdW5jdGlvbnMgZm9yIHRyYW5zZmVycmluZyBtZXNzYWdlcy4gVGhlIHR3byBvcGVyYXRpbmcKK21vZGVzIGFyZSB0aGUgbm9ybWFsIChIQ0kpIG1vZGUgYW5kIHRoZSBmaXJtd2FyZSB1cGRhdGUgbW9kZS4KKworUE41NDQgaXMgY29udHJvbGxlZCBieSBzZW5kaW5nIG1lc3NhZ2VzIGZyb20gdGhlIHVzZXJzcGFjZSB0byB0aGUKK2NoaXAuIFRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBkcml2ZXIgaXMganVzdCB0byBwYXNzIHRob3NlIG1lc3NhZ2VzCit3aXRob3V0IGNhcmluZyBhYm91dCB0aGUgbWVzc2FnZSBjb250ZW50LgorCisKK1Byb3RvY29scworLS0tLS0tLS0tCisKK0luIHRoZSBub3JtYWwgKEhDSSkgbW9kZSBhbmQgaW4gdGhlIGZpcm13YXJlIHVwZGF0ZSBtb2RlIHJlYWQgYW5kCit3cml0ZSBmdW5jdGlvbnMgYmVoYXZlIGEgYml0IGRpZmZlcmVudGx5IGJlY2F1c2UgdGhlIG1lc3NhZ2UgZm9ybWF0cworb3IgdGhlIHByb3RvY29scyBhcmUgZGlmZmVyZW50LgorCitJbiB0aGUgbm9ybWFsIChIQ0kpIG1vZGUgdGhlIHByb3RvY29sIHVzZWQgaXMgZGVyaXZlZCBmcm9tIHRoZSBFVFNJCitIQ0kgc3BlY2lmaWNhdGlvbi4gVGhlIGZpcm13YXJlIGlzIHVwZGF0ZWQgdXNpbmcgYSBzcGVjaWZpYyBwcm90b2NvbCwKK3doaWNoIGlzIGRpZmZlcmVudCBmcm9tIEhDSS4KKworSENJIG1lc3NhZ2VzIGNvbnNpc3Qgb2YgYW4gZWlnaHQgYml0IGhlYWRlciBhbmQgdGhlIG1lc3NhZ2UgYm9keS4gVGhlCitoZWFkZXIgY29udGFpbnMgdGhlIG1lc3NhZ2UgbGVuZ3RoLiBNYXhpbXVtIHNpemUgZm9yIGFuIEhDSSBtZXNzYWdlIGlzCiszMy4gSW4gSENJIG1vZGUgc2VudCBtZXNzYWdlcyBhcmUgdGVzdGVkIGZvciBhIGNvcnJlY3QKK2NoZWNrc3VtLiBGaXJtd2FyZSB1cGRhdGUgbWVzc2FnZXMgaGF2ZSB0aGUgbGVuZ3RoIGluIHRoZSBzZWNvbmQgKE1TQikKK2FuZCB0aGlyZCAoTFNCKSBieXRlcyBvZiB0aGUgbWVzc2FnZS4gVGhlIG1heGltdW0gRlcgbWVzc2FnZSBsZW5ndGggaXMKKzEwMjQgYnl0ZXMuCisKK0ZvciB0aGUgRVRTSSBIQ0kgc3BlY2lmaWNhdGlvbiBzZWUKK2h0dHA6Ly93d3cuZXRzaS5vcmcvV2ViU2l0ZS9UZWNobm9sb2dpZXMvUHJvdG9jb2xTcGVjaWZpY2F0aW9uLmFzcHgKKworVGhlIEhhcmR3YXJlIFRlc3QKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpZGVhIG9mIHRoZSB0ZXN0IGlzIHRoYXQgaXQgY2FuIHBlcmZvcm1lZCBieSByZWFkaW5nIGZyb20gdGhlCitjb3JyZXNwb25kaW5nIHN5c2ZzIGZpbGUuIFRoZSB0ZXN0IGlzIGltcGxlbWVudGVkIGluIHRoZSBib2FyZCBmaWxlCithbmQgaXQgc2hvdWxkIHRlc3QgdGhhdCBQTjU0NCBjYW4gYmUgcHV0IGludG8gdGhlIGZpcm13YXJlIHVwZGF0ZQorbW9kZS4gSWYgdGhlIHRlc3QgaXMgbm90IGltcGxlbWVudGVkIHRoZSBzeXNmcyBmaWxlIGRvZXMgbm90IGdldAorY3JlYXRlZC4KKworRXhhbXBsZToKKz4gY2F0IC9zeXMvbW9kdWxlL3BuNTQ0L2RyaXZlcnMvaTJjXDpwbjU0NC8zLTAwMmIvbmZjX3Rlc3QKKzEKKworTm9ybWFsIE9wZXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLQorCitQTjU0NCBpcyBwb3dlcmVkIHVwIHdoZW4gdGhlIGRldmljZSBmaWxlIGlzIG9wZW5lZCwgb3RoZXJ3aXNlIGl0J3MKK3R1cm5lZCBvZmYuIE9ubHkgb25lIGluc3RhbmNlIGNhbiB1c2UgdGhlIGRldmljZSBhdCBhIHRpbWUuCisKK1VzZXJzcGFjZSBhcHBsaWNhdGlvbnMgY29udHJvbCBQTjU0NCB3aXRoIEhDSSBtZXNzYWdlcy4gVGhlIGhhcmR3YXJlCitzZW5kcyBhbiBpbnRlcnJ1cHQgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZy4gRGF0YSBpcworcGh5c2ljYWxseSByZWFkIHdoZW4gdGhlIHJlYWQgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgdXNlcnNwYWNlCithcHBsaWNhdGlvbi4gUG9sbCgpIGNoZWNrcyB0aGUgcmVhZCBpbnRlcnJ1cHQgc3RhdGUuIENvbmZpZ3VyYXRpb24gYW5kCitzZWxmIHRlc3RpbmcgYXJlIGFsc28gZG9uZSBmcm9tIHRoZSB1c2Vyc3BhY2UgdXNpbmcgcmVhZCBhbmQgd3JpdGUuCisKK0V4YW1wbGUgcGxhdGZvcm0gZGF0YToKKworc3RhdGljIGludCByeDcxX3BuNTQ0X25mY19yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIEdldCBhbmQgc2V0dXAgdGhlIEhXIHJlc291cmNlcyBmb3IgdGhlIGRldmljZSAqLworfQorCitzdGF0aWMgdm9pZCByeDcxX3BuNTQ0X25mY19mcmVlX3Jlc291cmNlcyh2b2lkKQoreworCS8qIFJlbGVhc2UgdGhlIEhXIHJlc291cmNlcyAqLworfQorCitzdGF0aWMgdm9pZCByeDcxX3BuNTQ0X25mY19lbmFibGUoaW50IGZ3KQoreworCS8qIFR1cm4gdGhlIGRldmljZSBvbiAqLworfQorCitzdGF0aWMgaW50IHJ4NzFfcG41NDRfbmZjX3Rlc3Qodm9pZCkKK3sKKwkvKgorCSAqIFB1dCB0aGUgZGV2aWNlIGludG8gdGhlIEZXIHVwZGF0ZSBtb2RlCisJICogYW5kIHRoZW4gYmFjayB0byB0aGUgbm9ybWFsIG1vZGUuCisJICogQ2hlY2sgdGhlIGJlaGF2aW9yIGFuZCByZXR1cm4gb25lIG9uIHN1Y2Nlc3MsCisJICogemVybyBvbiBmYWlsdXJlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCByeDcxX3BuNTQ0X25mY19kaXNhYmxlKHZvaWQpCit7CisJLyogdHVybiB0aGUgcG93ZXIgb2ZmICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcG41NDRfbmZjX3BsYXRmb3JtX2RhdGEgcng3MV9uZmNfZGF0YSA9IHsKKwkucmVxdWVzdF9yZXNvdXJjZXMgPSByeDcxX3BuNTQ0X25mY19yZXF1ZXN0X3Jlc291cmNlcywKKwkuZnJlZV9yZXNvdXJjZXMgPSByeDcxX3BuNTQ0X25mY19mcmVlX3Jlc291cmNlcywKKwkuZW5hYmxlID0gcng3MV9wbjU0NF9uZmNfZW5hYmxlLAorCS50ZXN0ID0gcng3MV9wbjU0NF9uZmNfdGVzdCwKKwkuZGlzYWJsZSA9IHJ4NzFfcG41NDRfbmZjX2Rpc2FibGUsCit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9kcml2ZXJzLXRlc3RpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kcml2ZXJzLXRlc3RpbmcudHh0CmluZGV4IDdmN2E3MzcuLjYzOGFmZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvZHJpdmVycy10ZXN0aW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RyaXZlcnMtdGVzdGluZy50eHQKQEAgLTIzLDEwICsyMywxMCBAQAogd2l0aG91dCB0aGUgbmV3IGRyaXZlciwgeW91IGFyZSByZWFkeSB0byB0ZXN0IGl0OgogCiBhKSBCdWlsZCB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCBsb2FkIGl0IGFuZCB0cnkgdGhlIHRlc3QgbW9kZXMgb2YgaGliZXJuYXRpb24KLSAgIChzZWU6IERvY3VtZW50cy9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LCAxKS4KKyAgIChzZWU6IERvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMSkuCiAKIGIpIExvYWQgdGhlIGRyaXZlciBhbmQgYXR0ZW1wdCB0byBoaWJlcm5hdGUgaW4gdGhlICJyZWJvb3QiLCAic2h1dGRvd24iIGFuZAotICAgInBsYXRmb3JtIiBtb2RlcyAoc2VlOiBEb2N1bWVudHMvcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMSkuCisgICAicGxhdGZvcm0iIG1vZGVzIChzZWU6IERvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMSkuCiAKIGMpIENvbXBpbGUgdGhlIGRyaXZlciBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwgYW5kIHRyeSB0aGUgdGVzdCBtb2RlcyBvZgogICAgaGliZXJuYXRpb24uCkBAIC0zNCwxMiArMzQsMTIgQEAKIGQpIEF0dGVtcHQgdG8gaGliZXJuYXRlIHdpdGggdGhlIGRyaXZlciBjb21waWxlZCBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwKICAgIGluIHRoZSAicmVib290IiwgInNodXRkb3duIiBhbmQgInBsYXRmb3JtIiBtb2Rlcy4KIAotZSkgVHJ5IHRoZSB0ZXN0IG1vZGVzIG9mIHN1c3BlbmQgKHNlZTogRG9jdW1lbnRzL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsCitlKSBUcnkgdGhlIHRlc3QgbW9kZXMgb2Ygc3VzcGVuZCAoc2VlOiBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsCiAgICAyKS4gIFtBcyBmYXIgYXMgdGhlIFNUUiB0ZXN0cyBhcmUgY29uY2VybmVkLCBpdCBzaG91bGQgbm90IG1hdHRlciB3aGV0aGVyIG9yCiAgICBub3QgdGhlIGRyaXZlciBpcyBidWlsdCBhcyBhIG1vZHVsZS5dCiAKIGYpIEF0dGVtcHQgdG8gc3VzcGVuZCB0byBSQU0gdXNpbmcgdGhlIHMycmFtIHRvb2wgd2l0aCB0aGUgZHJpdmVyIGxvYWRlZAotICAgKHNlZTogRG9jdW1lbnRzL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDIpLgorICAgKHNlZTogRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LCAyKS4KIAogRWFjaCBvZiB0aGUgYWJvdmUgdGVzdHMgc2hvdWxkIGJlIHJlcGVhdGVkIHNldmVyYWwgdGltZXMgYW5kIHRoZSBTVEQgdGVzdHMKIHNob3VsZCBiZSBtaXhlZCB3aXRoIHRoZSBTVFIgdGVzdHMuICBJZiBhbnkgb2YgdGhlbSBmYWlscywgdGhlIGRyaXZlciBjYW5ub3QgYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CmluZGV4IDQxY2M3YjMuLmZmZTU1ZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dApAQCAtNTAsNiArNTAsMTUgQEAKIGFuZCBkZXZpY2UgY2xhc3MgY2FsbGJhY2tzIGFyZSByZWZlcnJlZCB0byBhcyBzdWJzeXN0ZW0tbGV2ZWwgY2FsbGJhY2tzIGluIHdoYXQKIGZvbGxvd3MuCiAKK0J5IGRlZmF1bHQsIHRoZSBjYWxsYmFja3MgYXJlIGFsd2F5cyBpbnZva2VkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIGludGVycnVwdHMKK2VuYWJsZWQuICBIb3dldmVyLCBzdWJzeXN0ZW1zIGNhbiB1c2UgdGhlIHBtX3J1bnRpbWVfaXJxX3NhZmUoKSBoZWxwZXIgZnVuY3Rpb24KK3RvIHRlbGwgdGhlIFBNIGNvcmUgdGhhdCBhIGRldmljZSdzIC0+cnVudGltZV9zdXNwZW5kKCkgYW5kIC0+cnVudGltZV9yZXN1bWUoKQorY2FsbGJhY2tzIHNob3VsZCBiZSBpbnZva2VkIGluIGF0b21pYyBjb250ZXh0IHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorKC0+cnVudGltZV9pZGxlKCkgaXMgc3RpbGwgaW52b2tlZCB0aGUgZGVmYXVsdCB3YXkpLiAgVGhpcyBpbXBsaWVzIHRoYXQgdGhlc2UKK2NhbGxiYWNrIHJvdXRpbmVzIG11c3Qgbm90IGJsb2NrIG9yIHNsZWVwLCBidXQgaXQgYWxzbyBtZWFucyB0aGF0IHRoZQorc3luY2hyb25vdXMgaGVscGVyIGZ1bmN0aW9ucyBsaXN0ZWQgYXQgdGhlIGVuZCBvZiBTZWN0aW9uIDQgY2FuIGJlIHVzZWQgd2l0aGluCithbiBpbnRlcnJ1cHQgaGFuZGxlciBvciBpbiBhbiBhdG9taWMgY29udGV4dC4KKwogVGhlIHN1YnN5c3RlbS1sZXZlbCBzdXNwZW5kIGNhbGxiYWNrIGlzIF9lbnRpcmVseV8gX3Jlc3BvbnNpYmxlXyBmb3IgaGFuZGxpbmcKIHRoZSBzdXNwZW5kIG9mIHRoZSBkZXZpY2UgYXMgYXBwcm9wcmlhdGUsIHdoaWNoIG1heSwgYnV0IG5lZWQgbm90IGluY2x1ZGUKIGV4ZWN1dGluZyB0aGUgZGV2aWNlIGRyaXZlcidzIG93biAtPnJ1bnRpbWVfc3VzcGVuZCgpIGNhbGxiYWNrIChmcm9tIHRoZQpAQCAtMjM3LDYgKzI0NiwxMCBAQAogICAgICAgU2VjdGlvbiA4KTsgaXQgbWF5IGJlIG1vZGlmaWVkIG9ubHkgYnkgdGhlIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKCkKICAgICAgIGhlbHBlciBmdW5jdGlvbgogCisgIHVuc2lnbmVkIGludCBpcnFfc2FmZTsKKyAgICAtIGluZGljYXRlcyB0aGF0IHRoZSAtPnJ1bnRpbWVfc3VzcGVuZCgpIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkgY2FsbGJhY2tzCisgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgc3BpbmxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZAorCiAgIHVuc2lnbmVkIGludCB1c2VfYXV0b3N1c3BlbmQ7CiAgICAgLSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlJ3MgZHJpdmVyIHN1cHBvcnRzIGRlbGF5ZWQgYXV0b3N1c3BlbmQgKHNlZQogICAgICAgU2VjdGlvbiA5KTsgaXQgbWF5IGJlIG1vZGlmaWVkIG9ubHkgYnkgdGhlCkBAIC0zNDQsNiArMzU3LDEwIEBACiAgICAgLSBkZWNyZW1lbnQgdGhlIGRldmljZSdzIHVzYWdlIGNvdW50ZXI7IGlmIHRoZSByZXN1bHQgaXMgMCB0aGVuIHJ1bgogICAgICAgcG1fcnVudGltZV9pZGxlKGRldikgYW5kIHJldHVybiBpdHMgcmVzdWx0CiAKKyAgaW50IHBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgIC0gZGVjcmVtZW50IHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyOyBpZiB0aGUgcmVzdWx0IGlzIDAgdGhlbiBydW4KKyAgICAgIHBtX3J1bnRpbWVfc3VzcGVuZChkZXYpIGFuZCByZXR1cm4gaXRzIHJlc3VsdAorCiAgIGludCBwbV9ydW50aW1lX3B1dF9zeW5jX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBkZWNyZW1lbnQgdGhlIGRldmljZSdzIHVzYWdlIGNvdW50ZXI7IGlmIHRoZSByZXN1bHQgaXMgMCB0aGVuIHJ1bgogICAgICAgcG1fcnVudGltZV9hdXRvc3VzcGVuZChkZXYpIGFuZCByZXR1cm4gaXRzIHJlc3VsdApAQCAtMzk3LDYgKzQxNCwxMSBAQAogICAgICAgUE0gYXR0cmlidXRlcyBmcm9tIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIgKG9yIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nCiAgICAgICBhZGRlZCB3aGVuIHRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCkKIAorICB2b2lkIHBtX3J1bnRpbWVfaXJxX3NhZmUoc3RydWN0IGRldmljZSAqZGV2KTsKKyAgICAtIHNldCB0aGUgcG93ZXIuaXJxX3NhZmUgZmxhZyBmb3IgdGhlIGRldmljZSwgY2F1c2luZyB0aGUgcnVudGltZS1QTQorICAgICAgc3VzcGVuZCBhbmQgcmVzdW1lIGNhbGxiYWNrcyAoYnV0IG5vdCB0aGUgaWRsZSBjYWxsYmFjaykgdG8gYmUgaW52b2tlZAorICAgICAgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCisKICAgdm9pZCBwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHN0cnVjdCBkZXZpY2UgKmRldik7CiAgICAgLSBzZXQgdGhlIHBvd2VyLmxhc3RfYnVzeSBmaWVsZCB0byB0aGUgY3VycmVudCB0aW1lCiAKQEAgLTQzOCw2ICs0NjAsMTUgQEAKIHBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koKQogcG1fcnVudGltZV9hdXRvc3VzcGVuZF9leHBpcmF0aW9uKCkKIAorSWYgcG1fcnVudGltZV9pcnFfc2FmZSgpIGhhcyBiZWVuIGNhbGxlZCBmb3IgYSBkZXZpY2UgdGhlbiB0aGUgZm9sbG93aW5nIGhlbHBlcgorZnVuY3Rpb25zIG1heSBhbHNvIGJlIHVzZWQgaW4gaW50ZXJydXB0IGNvbnRleHQ6CisKK3BtX3J1bnRpbWVfc3VzcGVuZCgpCitwbV9ydW50aW1lX2F1dG9zdXNwZW5kKCkKK3BtX3J1bnRpbWVfcmVzdW1lKCkKK3BtX3J1bnRpbWVfZ2V0X3N5bmMoKQorcG1fcnVudGltZV9wdXRfc3luY19zdXNwZW5kKCkKKwogNS4gUnVuLXRpbWUgUE0gSW5pdGlhbGl6YXRpb24sIERldmljZSBQcm9iaW5nIGFuZCBSZW1vdmFsCiAKIEluaXRpYWxseSwgdGhlIHJ1bi10aW1lIFBNIGlzIGRpc2FibGVkIGZvciBhbGwgZGV2aWNlcywgd2hpY2ggbWVhbnMgdGhhdCB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKaW5kZXggMzAyZGI1ZC4uNzQwMGQ3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKQEAgLTEzMSw3ICsxMzEsNyBAQAogcG9pbnQgYW5kIHRoZSB3YXkgYSBuZXcgcGxhdGZvcm0gc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBrZXJuZWwuIFRoZQogbGVnYWN5IGlTZXJpZXMgcGxhdGZvcm0gYnJlYWtzIHRob3NlIHJ1bGVzIGFzIGl0IHByZWRhdGVzIHRoaXMgc2NoZW1lLAogYnV0IG5vIG5ldyBib2FyZCBzdXBwb3J0IHdpbGwgYmUgYWNjZXB0ZWQgaW4gdGhlIG1haW4gdHJlZSB0aGF0Ci1kb2Vzbid0IGZvbGxvd3MgdGhlbSBwcm9wZXJseS4gIEluIGFkZGl0aW9uLCBzaW5jZSB0aGUgYWR2ZW50IG9mIHRoZQorZG9lc24ndCBmb2xsb3cgdGhlbSBwcm9wZXJseS4gIEluIGFkZGl0aW9uLCBzaW5jZSB0aGUgYWR2ZW50IG9mIHRoZQogYXJjaC9wb3dlcnBjIG1lcmdlZCBhcmNoaXRlY3R1cmUgZm9yIHBwYzMyIGFuZCBwcGM2NCwgbmV3IDMyLWJpdAogcGxhdGZvcm1zIGFuZCAzMi1iaXQgcGxhdGZvcm1zIHdoaWNoIG1vdmUgaW50byBhcmNoL3Bvd2VycGMgd2lsbCBiZQogcmVxdWlyZWQgdG8gdXNlIHRoZXNlIHJ1bGVzIGFzIHdlbGwuCkBAIC0xMDI1LDcgKzEwMjUsNyBAQAogCiBXQVJOSU5HOiBUaGlzIHZlcnNpb24gaXMgc3RpbGwgaW4gZWFybHkgZGV2ZWxvcG1lbnQgc3RhZ2U7IHRoZQogcmVzdWx0aW5nIGRldmljZS10cmVlICJibG9icyIgaGF2ZSBub3QgeWV0IGJlZW4gdmFsaWRhdGVkIHdpdGggdGhlCi1rZXJuZWwuIFRoZSBjdXJyZW50IGdlbmVyYXRlZCBibG9jIGxhY2tzIGEgdXNlZnVsIHJlc2VydmUgbWFwIChpdCB3aWxsCitrZXJuZWwuIFRoZSBjdXJyZW50IGdlbmVyYXRlZCBibG9jayBsYWNrcyBhIHVzZWZ1bCByZXNlcnZlIG1hcCAoaXQgd2lsbAogYmUgZml4ZWQgdG8gZ2VuZXJhdGUgYW4gZW1wdHkgb25lLCBpdCdzIHVwIHRvIHRoZSBib290bG9hZGVyIHRvIGZpbGwKIGl0IHVwKSBhbW9uZyBvdGhlcnMuIFRoZSBlcnJvciBoYW5kbGluZyBuZWVkcyB3b3JrLCBidWdzIGFyZSBsdXJraW5nLAogZXRjLi4uCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbiBhcmJpdHJhcnkgYXJyYXkgb2YgYnl0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgY2hpbGRub2RlQGFkZHJlc3NzIHsJLyogZGVmaW5lIGEgY2hpbGQgbm9kZSBuYW1lZCAiY2hpbGRub2RlIgorICBjaGlsZG5vZGVAYWRkcmVzcyB7CS8qIGRlZmluZSBhIGNoaWxkIG5vZGUgbmFtZWQgImNoaWxkbm9kZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2hvc2UgdW5pdCBuYW1lIGlzICJjaGlsZG5vZGUgYXQKIAkJCQkgKiBhZGRyZXNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvNHh4L2NwbS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzLzR4eC9jcG0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDU5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzLzR4eC9jcG0udHh0CkBAIC0wLDAgKzEsNTIgQEAKK1BQQzR4eCBDbG9jayBQb3dlciBNYW5hZ2VtZW50IChDUE0pIG5vZGUKKworUmVxdWlyZWQgcHJvcGVydGllczoKKwktIGNvbXBhdGlibGUJCTogY29tcGF0aWJsZSBsaXN0LCBjdXJyZW50bHkgb25seSAiaWJtLGNwbSIKKwktIGRjci1hY2Nlc3MtbWV0aG9kCTogIm5hdGl2ZSIKKwktIGRjci1yZWcJCTogPCBEQ1IgcmVnaXN0ZXIgcmFuZ2UgPgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gZXItb2Zmc2V0CQk6IEFsbCA0eHggU29DcyB3aXRoIGEgQ1BNIGNvbnRyb2xsZXIgaGF2ZQorCQkJCSAgb25lIG9mIHR3byBkaWZmZXJlbnQgb3JkZXIgZm9yIHRoZSBDUE0KKwkJCQkgIHJlZ2lzdGVycy4gU29tZSBoYXZlIHRoZSBDUE0gcmVnaXN0ZXJzCisJCQkJICBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIChFUixGUixTUikuIFRoZQorCQkJCSAgb3RoZXJzIGhhdmUgdGhlbSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyCisJCQkJICAoU1IsRVIsRlIpLiBGb3IgdGhlIHNlY29uZCBjYXNlIHNldAorCQkJCSAgZXItb2Zmc2V0ID0gPDE+LgorCS0gdW51c2VkLXVuaXRzCQk6IHNwZWNpZmllciBjb25zaXN0IG9mIG9uZSBjZWxsLiBGb3IgZWFjaAorCQkJCSAgYml0IGluIHRoZSBjZWxsLCB0aGUgY29ycmVzcG9uZGluZyBiaXQKKwkJCQkgIGluIENQTSB3aWxsIGJlIHNldCB0byB0dXJuIG9mZiB1bnVzZWQKKwkJCQkgIGRldmljZXMuCisJLSBpZGxlLWRvemUJCTogc3BlY2lmaWVyIGNvbnNpc3Qgb2Ygb25lIGNlbGwuIEZvciBlYWNoCisJCQkJICBiaXQgaW4gdGhlIGNlbGwsIHRoZSBjb3JyZXNwb25kaW5nIGJpdAorCQkJCSAgaW4gQ1BNIHdpbGwgYmUgc2V0IHRvIHR1cm4gb2ZmIHVudXNlZAorCQkJCSAgZGV2aWNlcy4gVGhpcyBpcyB1c3VhbGx5IGp1c3QgQ1BNW0NQVV0uCisJLSBzdGFuZGJ5CQk6IHNwZWNpZmllciBjb25zaXN0IG9mIG9uZSBjZWxsLiBGb3IgZWFjaAorCQkJCSAgYml0IGluIHRoZSBjZWxsLCB0aGUgY29ycmVzcG9uZGluZyBiaXQKKwkJCQkgIGluIENQTSB3aWxsIGJlIHNldCBvbiBzdGFuZGJ5IGFuZAorCQkJCSAgcmVzdG9yZWQgb24gcmVzdW1lLgorCS0gc3VzcGVuZAkJOiBzcGVjaWZpZXIgY29uc2lzdCBvZiBvbmUgY2VsbC4gRm9yIGVhY2gKKwkJCQkgIGJpdCBpbiB0aGUgY2VsbCwgdGhlIGNvcnJlc3BvbmRpbmcgYml0CisJCQkJICBpbiBDUE0gd2lsbCBiZSBzZXQgb24gc3VzcGVuZCAobWVtKSBhbmQKKwkJCQkgIHJlc3RvcmVkIG9uIHJlc3VtZS4gTm90ZSwgZm9yIHN0YW5kYnkKKwkJCQkgIGFuZCBzdXNwZW5kIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgY2FuCisJCQkJICBiZSBkaWZmZXJlbnQgb3IgdGhlIHNhbWUuIFVzdWFsbHkgZm9yCisJCQkJICBzdGFuZGJ5IG9ubHkgY2xhc3MgMiBhbmQgMyB1bml0cyBhcmUgc2V0LgorCQkJCSAgSG93ZXZlciwgdGhlIGludGVyZmFjZSBkb2VzIG5vdCBjYXJlLgorCQkJCSAgSWYgdGhleSBhcmUgdGhlIHNhbWUsIHRoZSBhZGRpdGlvbmFsCisJCQkJICBwb3dlciBzYXZpbmcgd2lsbCBiZSBzZWVpbmcgaWYgc3VwcG9ydAorCQkJCSAgaXMgYXZhaWxhYmxlIHRvIHB1dCB0aGUgRERSIGluIHNlbGYKKwkJCQkgIHJlZnJlc2ggbW9kZSBhbmQgYW55IGFkZGl0aW9uYWwgcG93ZXIKKwkJCQkgIHNhdmluZyB0ZWNobmlxdWVzIGZvciB0aGUgc3BlY2lmaWMgU29DLgorCitFeGFtcGxlOgorCUNQTTA6IGNwbSB7CisJCWNvbXBhdGlibGUgPSAiaWJtLGNwbSI7CisJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7CisJCWRjci1yZWcgPSA8MHgxNjAgMHgwMDM+OworCQllci1vZmZzZXQgPSA8MD47CisJCXVudXNlZC11bml0cyA9IDwweDAwMDAwMTAwPjsKKwkJaWRsZS1kb3plID0gPDB4MDIwMDAwMDA+OworCQlzdGFuZGJ5ID0gPDB4ZmVmZjAwMDA+OworCQlzdXNwZW5kID0gPDB4ZmVmZjc5MWQ+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZWVwcm9tLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZWVwcm9tLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzQyYzEwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9lZXByb20udHh0CkBAIC0wLDAgKzEsMjggQEAKK0VFUFJPTXMgKEkyQykKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgIjxtYW51ZmFjdHVyZXI+LDx0eXBlPiIKKwkJIElmIHRoZXJlIGlzIG5vIHNwZWNpZmljIGRyaXZlciBmb3IgPG1hbnVmYWN0dXJlcj4sIGEgZ2VuZXJpYworCQkgZHJpdmVyIGJhc2VkIG9uIDx0eXBlPiBpcyBzZWxlY3RlZC4gUG9zc2libGUgdHlwZXMgYXJlOgorCQkgMjRjMDAsIDI0YzAxLCAyNGMwMiwgMjRjMDQsIDI0YzA4LCAyNGMxNiwgMjRjMzIsIDI0YzY0LAorCQkgMjRjMTI4LCAyNGMyNTYsIDI0YzUxMiwgMjRjMTAyNCwgc3BkCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIEVFUFJPTQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgIC0gcGFnZXNpemUgOiB0aGUgbGVuZ3RoIG9mIHRoZSBwYWdlc2l6ZSBmb3Igd3JpdGluZy4gUGxlYXNlIGNvbnN1bHQgdGhlCisgICAgICAgICAgICAgICBtYW51YWwgb2YgeW91ciBkZXZpY2UsIHRoYXQgdmFsdWUgdmFyaWVzIGEgbG90LiBBIHdyb25nIHZhbHVlCisJICAgICAgIG1heSByZXN1bHQgaW4gZGF0YSBsb3NzISBJZiBub3Qgc3BlY2lmaWVkLCBhIHNhZmV0eSB2YWx1ZSBvZgorCSAgICAgICAnMScgaXMgdXNlZCB3aGljaCB3aWxsIGJlIHZlcnkgc2xvdy4KKworICAtIHJlYWQtb25seTogdGhpcyBwYXJhbWV0ZXJsZXNzIHByb3BlcnR5IGRpc2FibGVzIHdyaXRlcyB0byB0aGUgZWVwcm9tCisKK0V4YW1wbGU6CisKK2VlcHJvbUA1MiB7CisJY29tcGF0aWJsZSA9ICJhdG1lbCwyNGMzMiI7CisJcmVnID0gPDB4NTI+OworCXBhZ2VzaXplID0gPDMyPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bwcy9wcHMudHh0IGIvRG9jdW1lbnRhdGlvbi9wcHMvcHBzLnR4dAppbmRleCAxMjVmNGFiLi5kMzVkY2RkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bwcy9wcHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHBzL3Bwcy50eHQKQEAgLTE3MCwzICsxNzAsNDkgQEAKIAogUGxlYXNlLCBub3RlIHRoYXQgdG8gY29tcGlsZSB1c2VybGFuZCBwcm9ncmFtcyB5b3UgbmVlZCB0aGUgZmlsZSB0aW1lcHBzLmgKIChzZWUgRG9jdW1lbnRhdGlvbi9wcHMvKS4KKworCitHZW5lcmF0b3JzCistLS0tLS0tLS0tCisKK1NvbWV0aW1lcyBvbmUgbmVlZHMgdG8gYmUgYWJsZSBub3Qgb25seSB0byBjYXRjaCBQUFMgc2lnbmFscyBidXQgdG8gcHJvZHVjZQordGhlbSBhbHNvLiBGb3IgZXhhbXBsZSwgcnVubmluZyBhIGRpc3RyaWJ1dGVkIHNpbXVsYXRpb24sIHdoaWNoIHJlcXVpcmVzCitjb21wdXRlcnMnIGNsb2NrIHRvIGJlIHN5bmNocm9uaXplZCB2ZXJ5IHRpZ2h0bHkuIE9uZSB3YXkgdG8gZG8gdGhpcyBpcyB0bworaW52ZW50IHNvbWUgY29tcGxpY2F0ZWQgaGFyZHdhcmUgc29sdXRpb25zIGJ1dCBpdCBtYXkgYmUgbmVpdGhlciBuZWNlc3NhcnkKK25vciBhZmZvcmRhYmxlLiBUaGUgY2hlYXAgd2F5IGlzIHRvIGxvYWQgYSBQUFMgZ2VuZXJhdG9yIG9uIG9uZSBvZiB0aGUKK2NvbXB1dGVycyAobWFzdGVyKSBhbmQgUFBTIGNsaWVudHMgb24gb3RoZXJzIChzbGF2ZXMpLCBhbmQgdXNlIHZlcnkgc2ltcGxlCitjYWJsZXMgdG8gZGVsaXZlciBzaWduYWxzIHVzaW5nIHBhcmFsbGVsIHBvcnRzLCBmb3IgZXhhbXBsZS4KKworUGFyYWxsZWwgcG9ydCBjYWJsZSBwaW5vdXQ6CitwaW4JbmFtZQltYXN0ZXIgICAgICBzbGF2ZQorMQlTVFJPQkUJICAqLS0tLS0tICAgICAqCisyCUQwCSAgKiAgICAgfCAgICAgKgorMwlEMQkgICogICAgIHwgICAgICoKKzQJRDIJICAqICAgICB8ICAgICAqCis1CUQzCSAgKiAgICAgfCAgICAgKgorNglENAkgICogICAgIHwgICAgICoKKzcJRDUJICAqICAgICB8ICAgICAqCis4CUQ2CSAgKiAgICAgfCAgICAgKgorOQlENwkgICogICAgIHwgICAgICoKKzEwCUFDSwkgICogICAgIC0tLS0tLSoKKzExCUJVU1kJICAqICAgICAgICAgICAqCisxMglQRQkgICogICAgICAgICAgICoKKzEzCVNFTAkgICogICAgICAgICAgICoKKzE0CUFVVE9GRAkgICogICAgICAgICAgICoKKzE1CUVSUk9SCSAgKiAgICAgICAgICAgKgorMTYJSU5JVAkgICogICAgICAgICAgICoKKzE3CVNFTElOCSAgKiAgICAgICAgICAgKgorMTgtMjUJR05ECSAgKi0tLS0tLS0tLS0tKgorCitQbGVhc2Ugbm90ZSB0aGF0IHBhcmFsbGVsIHBvcnQgaW50ZXJydXB0IG9jY3VycyBvbmx5IG9uIGhpZ2gtPmxvdyB0cmFuc2l0aW9uLAorc28gaXQgaXMgdXNlZCBmb3IgUFBTIGFzc2VydCBlZGdlLiBQUFMgY2xlYXIgZWRnZSBjYW4gYmUgZGV0ZXJtaW5lZCBvbmx5Cit1c2luZyBwb2xsaW5nIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGljaCBhY3R1YWxseSBjYW4gYmUgZG9uZSB3YXkgbW9yZQorcHJlY2lzZWx5IGJlY2F1c2UgaW50ZXJydXB0IGhhbmRsaW5nIGRlbGF5cyBjYW4gYmUgcXVpdGUgYmlnIGFuZCByYW5kb20uIFNvCitjdXJyZW50IHBhcnBvcnQgUFBTIGdlbmVyYXRvciBpbXBsZW1lbnRhdGlvbiAocHBzX2dlbl9wYXJwb3J0IG1vZHVsZSkgaXMKK2dlYXJlZCB0b3dhcmRzIHVzaW5nIHRoZSBjbGVhciBlZGdlIGZvciB0aW1lIHN5bmNocm9uaXphdGlvbi4KKworQ2xlYXIgZWRnZSBwb2xsaW5nIGlzIGRvbmUgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzIHNvIGl0J3MgYmV0dGVyIHRvIHNlbGVjdAorZGVsYXkgYmV0d2VlbiBhc3NlcnQgYW5kIGNsZWFyIGVkZ2UgYXMgc21hbGwgYXMgcG9zc2libGUgdG8gcmVkdWNlIHN5c3RlbQorbGF0ZW5jaWVzLiBCdXQgaWYgaXQgaXMgdG9vIHNtYWxsIHNsYXZlIHdvbid0IGJlIGFibGUgdG8gY2FwdHVyZSBjbGVhciBlZGdlCit0cmFuc2l0aW9uLiBUaGUgZGVmYXVsdCBvZiAzMHVzIHNob3VsZCBiZSBnb29kIGVub3VnaCBpbiBtb3N0IHNpdHVhdGlvbnMuCitUaGUgZGVsYXkgY2FuIGJlIHNlbGVjdGVkIHVzaW5nICdkZWxheScgcHBzX2dlbl9wYXJwb3J0IG1vZHVsZSBwYXJhbWV0ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyLzAwLUlOREVYCmluZGV4IDNjMDBjOWMuLmQyNjUxYzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyLzAwLUlOREVYCkBAIC0zLDcgKzMsNyBAQAogc2NoZWQtYXJjaC50eHQKIAktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgogc2NoZWQtZGVzaWduLUNGUy50eHQKLQktIGdvYWxzLCBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wbGV0ZSBGYWlyIFNjaGVkdWxlci4KKwktIGdvYWxzLCBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wbGV0ZWx5IEZhaXIgU2NoZWR1bGVyLgogc2NoZWQtZG9tYWlucy50eHQKIAktIGluZm9ybWF0aW9uIG9uIHNjaGVkdWxpbmcgZG9tYWlucy4KIHNjaGVkLW5pY2UtZGVzaWduLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCmluZGV4IDMzN2M5MjQuLjVlODM3NjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubHBmYworKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLmxwZmMKQEAgLTU3Myw3ICs1NzMsNyBAQAogCSogQmFja3JvdW5kIG5vZGV2X3RpbWVvdXQgcHJvY2Vzc2luZyB0byBEUEMgVGhpcyBlbmFibGVzIHVzIHRvCiAJICB1bmJsb2NrIChzdG9wIGRldl9sb3NzX3Rtbykgd2hlbiBhcHBvcHJpYXRlLgogCSogRml4IGFycmF5IGRpc2NvdmVyeSB3aXRoIG11bHRpcGxlIGx1bnMuICBUaGUgbWF4X2x1bnMgd2FzIDAgYXQKLQkgIHRoZSB0aW1lIHRoZSBob3N0IHN0cnVjdHVyZSB3YXMgaW50aWFsaXplZC4gIGxwZmNfY2ZnX3BhcmFtcworCSAgdGhlIHRpbWUgdGhlIGhvc3Qgc3RydWN0dXJlIHdhcyBpbml0aWFsaXplZC4gIGxwZmNfY2ZnX3BhcmFtcwogCSAgdGhlbiBzZXQgdGhlIG1heF9sdW5zIHRvIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyd2FyZHMuCiAJKiBSZW1vdmUgdW51c2VkIGRlZmluZSBMUEZDX01BWF9MVU4gYW5kIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZgogCSAgbHBmY19tYXhfbHVuIHBhcmFtZXRlciB0byA1MTIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC90dHkudHh0IGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvdHR5LnR4dAppbmRleCA3YzkwMDUwLi41NDBkYjQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC90dHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2VyaWFsL3R0eS50eHQKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiBkY2RfY2hhbmdlKCkJLQlSZXBvcnQgdG8gdGhlIHR0eSBsaW5lIHRoZSBjdXJyZW50IERDRCBwaW4gc3RhdHVzCiAJCQljaGFuZ2VzIGFuZCB0aGUgcmVsYXRpdmUgdGltZXN0YW1wLiBUaGUgdGltZXN0YW1wCi0JCQljYW4gYmUgTlVMTC4KKwkJCWNhbm5vdCBiZSBOVUxMLgogCiAKIERyaXZlciBBY2Nlc3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKaW5kZXggZDBlYjY5Ni4uM2MxZWRkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQKQEAgLTk3NCwxMyArOTc0LDYgQEAKIAogICAgIFNlZSBoZHNwbS50eHQgZm9yIGRldGFpbHMuCiAKLSAgTW9kdWxlIHNuZC1oaWZpZXIKLSAgLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1vZHVsZSBmb3IgdGhlIE1lZGlhVGVrL1RlbXBvVGVjIEhpRmllciBGYW50YXNpYSBzb3VuZCBjYXJkLgotCi0gICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgYXV0b3Byb2JlIGFuZCBtdWx0aXBsZSBjYXJkcy4KLQogICBNb2R1bGUgc25kLWljZTE3MTIKICAgLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE1MzEsMTUgKzE1MjQsMjAgQEAKICAgTW9kdWxlIHNuZC1veHlnZW4KICAgLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIE1vZHVsZSBmb3Igc291bmQgY2FyZHMgYmFzZWQgb24gdGhlIEMtTWVkaWEgQ01JODc4OCBjaGlwOgorICAgIE1vZHVsZSBmb3Igc291bmQgY2FyZHMgYmFzZWQgb24gdGhlIEMtTWVkaWEgQ01JODc4Ni84Nzg3Lzg3ODggY2hpcDoKICAgICAqIEFzb3VuZCBBLTg3ODgKKyAgICAqIEFzdXMgWG9uYXIgREcKICAgICAqIEF1emVuVGVjaCBYLU1lcmlkaWFuCisgICAgKiBBdXplblRlY2ggWC1NZXJpZGlhbiAyRwogICAgICogQmdlYXJzIGItRW5zcGlyZXIKICAgICAqIENsdWIzRCBUaGVhdHJvbiBEVFMKICAgICAqIEhULU9tZWdhIENsYXJvIChwbHVzKQogICAgICogSFQtT21lZ2EgQ2xhcm8gaGFsbyAoWFQpCisgICAgKiBLdXJvdXRvc2hpa291IENNSTg3ODctSEcyUENJCiAgICAgKiBSYXplciBCYXJyYWN1ZGEgQUMtMQogICAgICogU29uZGlnbyBJbmZlcm5vCisgICAgKiBUZW1wb1RlYyBIaUZpZXIgRmFudGFzaWEKKyAgICAqIFRlbXBvVGVjIEhpRmllciBTZXJlbmFkZQogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgYXV0b3Byb2JlIGFuZCBtdWx0aXBsZSBjYXJkcy4KIApAQCAtMjAwNiw5ICsyMDA0LDkgQEAKICAgTW9kdWxlIHNuZC12aXJ0dW9zbwogICAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBNb2R1bGUgZm9yIHNvdW5kIGNhcmRzIGJhc2VkIG9uIHRoZSBBc3VzIEFWMTAwL0FWMjAwIGNoaXBzLAotICAgIGkuZS4sIFhvbmFyIEQxLCBEWCwgRDIsIEQyWCwgRFMsIEhEQVYxLjMgKERlbHV4ZSksIEVzc2VuY2UgU1QKLSAgICAoRGVsdXhlKSBhbmQgRXNzZW5jZSBTVFguCisgICAgTW9kdWxlIGZvciBzb3VuZCBjYXJkcyBiYXNlZCBvbiB0aGUgQXN1cyBBVjY2L0FWMTAwL0FWMjAwIGNoaXBzLAorICAgIGkuZS4sIFhvbmFyIEQxLCBEWCwgRDIsIEQyWCwgRFMsIEVzc2VuY2UgU1QgKERlbHV4ZSksIEVzc2VuY2UgU1RYLAorICAgIEhEQVYxLjMgKERlbHV4ZSksIGFuZCBIREFWMS4zIFNsaW0uCiAKICAgICBUaGlzIG1vZHVsZSBzdXBwb3J0cyBhdXRvcHJvYmUgYW5kIG11bHRpcGxlIGNhcmRzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CmluZGV4IDM3YzZhYWQuLjE2YWU0MzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby1Nb2RlbHMudHh0CkBAIC0xNDksNyArMTQ5LDYgQEAKICAgYWNlci1hc3BpcmUtNzczMGcgQWNlciBBc3BpcmUgNzczMEcKICAgYWNlci1hc3BpcmUtODkzMGcgQWNlciBBc3BpcmUgODkzMEcKICAgbWVkaW9uCU1lZGlvbiBMYXB0b3BzCi0gIG1lZGlvbi1tZDIJTWVkaW9uIE1EMgogICB0YXJnYS1kaWcJVGFyZ2EvTVNJCiAgIHRhcmdhLTJjaC1kaWcJVGFyZ2EvTVNJIHdpdGggMi1jaGFubmVsCiAgIHRhcmdhLThjaC1kaWcgVGFyZ2EvTVNJIHdpdGggOC1jaGFubmVsIChNU0kgR1g2MjApCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vc3lzY3RsLzAwLUlOREVYCmluZGV4IDEyODZmNDUuLjhjZjVkNDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsLzAwLUlOREVYCkBAIC00LDggKzQsNiBAQAogCS0gZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCAvcHJvYy9zeXMvIHN5c2N0bCBmaWxlcy4KIGFiaS50eHQKIAktIGRvY3VtZW50YXRpb24gZm9yIC9wcm9jL3N5cy9hYmkvKi4KLWN0bF91bm51bWJlcmVkLnR4dAotCS0gZXhwbGFuYXRpb24gb2Ygd2h5IG9uZSBzaG91bGQgbm90IGFkZCBuZXcgYmluYXJ5IHN5c2N0bCBudW1iZXJzLgogZnMudHh0CiAJLSBkb2N1bWVudGF0aW9uIGZvciAvcHJvYy9zeXMvZnMvKi4KIGtlcm5lbC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDIwOWUxNTguLjExZDVjZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMzQsNiArMzQsNyBAQAogLSBob3RwbHVnCiAtIGphdmEtYXBwbGV0dmlld2VyICAgICAgICAgICBbIGJpbmZtdF9qYXZhLCBvYnNvbGV0ZSBdCiAtIGphdmEtaW50ZXJwcmV0ZXIgICAgICAgICAgICBbIGJpbmZtdF9qYXZhLCBvYnNvbGV0ZSBdCistIGtwdHJfcmVzdHJpY3QKIC0ga3N0YWNrX2RlcHRoX3RvX3ByaW50ICAgICAgIFsgWDg2IG9ubHkgXQogLSBsMmNyICAgICAgICAgICAgICAgICAgICAgICAgWyBQUEMgb25seSBdCiAtIG1vZHByb2JlICAgICAgICAgICAgICAgICAgICA9PT4gRG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmctbW9kdWxlcy50eHQKQEAgLTIxOSw3ICsyMjAsNyBAQAogVGhpcyB0b2dnbGUgaW5kaWNhdGVzIHdoZXRoZXIgdW5wcml2aWxlZ2VkIHVzZXJzIGFyZSBwcmV2ZW50ZWQgZnJvbSB1c2luZwogZG1lc2coOCkgdG8gdmlldyBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwncyBsb2cgYnVmZmVyLiAgV2hlbgogZG1lc2dfcmVzdHJpY3QgaXMgc2V0IHRvICgwKSB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zLiAgV2hlbgotZG1lc2dfcmVzdHJpY3QgaXMgc2V0IHNldCB0byAoMSksIHVzZXJzIG11c3QgaGF2ZSBDQVBfU1lTX0FETUlOIHRvIHVzZQorZG1lc2dfcmVzdHJpY3QgaXMgc2V0IHNldCB0byAoMSksIHVzZXJzIG11c3QgaGF2ZSBDQVBfU1lTTE9HIHRvIHVzZQogZG1lc2coOCkuCiAKIFRoZSBrZXJuZWwgY29uZmlnIG9wdGlvbiBDT05GSUdfU0VDVVJJVFlfRE1FU0dfUkVTVFJJQ1Qgc2V0cyB0aGUgZGVmYXVsdApAQCAtMjYxLDYgKzI2MiwxOSBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitrcHRyX3Jlc3RyaWN0OgorCitUaGlzIHRvZ2dsZSBpbmRpY2F0ZXMgd2hldGhlciByZXN0cmljdGlvbnMgYXJlIHBsYWNlZCBvbgorZXhwb3Npbmcga2VybmVsIGFkZHJlc3NlcyB2aWEgL3Byb2MgYW5kIG90aGVyIGludGVyZmFjZXMuICBXaGVuCitrcHRyX3Jlc3RyaWN0IGlzIHNldCB0byAoMCksIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMuICBXaGVuCitrcHRyX3Jlc3RyaWN0IGlzIHNldCB0byAoMSksIHRoZSBkZWZhdWx0LCBrZXJuZWwgcG9pbnRlcnMKK3ByaW50ZWQgdXNpbmcgdGhlICVwSyBmb3JtYXQgc3BlY2lmaWVyIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAwJ3MKK3VubGVzcyB0aGUgdXNlciBoYXMgQ0FQX1NZU0xPRy4gIFdoZW4ga3B0cl9yZXN0cmljdCBpcyBzZXQgdG8KKygyKSwga2VybmVsIHBvaW50ZXJzIHByaW50ZWQgdXNpbmcgJXBLIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAwJ3MKK3JlZ2FyZGxlc3Mgb2YgcHJpdmlsZWdlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwoga3N0YWNrX2RlcHRoX3RvX3ByaW50OiAoWDg2IG9ubHkpCiAKIENvbnRyb2xzIHRoZSBudW1iZXIgb2Ygd29yZHMgdG8gcHJpbnQgd2hlbiBkdW1waW5nIHRoZSByYXcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGhlcm1hbC9zeXNmcy1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQKaW5kZXggY2IzZDE1Yi4uYjYxZTQ2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQKQEAgLTI3OCwzICsyNzgsMTUgQEAKICAgICB8LS0tbmFtZToJCQlhY3BpdHoKICAgICB8LS0tdGVtcDFfaW5wdXQ6CQkzNzAwMAogICAgIHwtLS10ZW1wMV9jcml0OgkJMTAwMDAwCisKKzQuIEV2ZW50IE5vdGlmaWNhdGlvbgorCitUaGUgZnJhbWV3b3JrIGluY2x1ZGVzIGEgc2ltcGxlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20sIGluIHRoZSBmb3JtIG9mIGEKK25ldGxpbmsgZXZlbnQuIE5ldGxpbmsgc29ja2V0IGluaXRpYWxpemF0aW9uIGlzIGRvbmUgZHVyaW5nIHRoZSBfaW5pdF8KK29mIHRoZSBmcmFtZXdvcmsuIERyaXZlcnMgd2hpY2ggaW50ZW5kIHRvIHVzZSB0aGUgbm90aWZpY2F0aW9uIG1lY2hhbmlzbQoranVzdCBuZWVkIHRvIGNhbGwgZ2VuZXJhdGVfbmV0bGlua19ldmVudCgpIHdpdGggdHdvIGFyZ3VtZW50cyB2aXoKKyhvcmlnaW5hdG9yLCBldmVudCkuIFR5cGljYWxseSB0aGUgb3JpZ2luYXRvciB3aWxsIGJlIGFuIGludGVnZXIgYXNzaWduZWQKK3RvIGEgdGhlcm1hbF96b25lX2RldmljZSB3aGVuIGl0IHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgZnJhbWV3b3JrLiBUaGUKK2V2ZW50IHdpbGwgYmUgb25lIG9mOntUSEVSTUFMX0FVWDAsIFRIRVJNQUxfQVVYMSwgVEhFUk1BTF9DUklUSUNBTCwKK1RIRVJNQUxfREVWX0ZBVUxUfS4gTm90aWZpY2F0aW9uIGNhbiBiZSBzZW50IHdoZW4gdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUKK2Nyb3NzZXMgYW55IG9mIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RpbWVycy90aW1lcl9zdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL3RpbWVycy90aW1lcl9zdGF0cy50eHQKaW5kZXggOWJkMDBmYy4uOGFiZDQwYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90aW1lcnMvdGltZXJfc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdGltZXJzL3RpbWVyX3N0YXRzLnR4dApAQCAtMTksNyArMTksNyBAQAogCiAtIHRoZSBwaWQgb2YgdGhlIHRhc2socHJvY2Vzcykgd2hpY2ggaW5pdGlhbGl6ZWQgdGhlIHRpbWVyCiAtIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHdoaWNoIGluaXRpYWxpemVkIHRoZSB0aW1lcgotLSB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIHRpbWVyIHdhcyBpbnRpYWxpemVkCistIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgdGltZXIgd2FzIGluaXRpYWxpemVkCiAtIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBhc3NvY2lhdGVkIHRvIHRoZSB0aW1lcgogLSB0aGUgbnVtYmVyIG9mIGV2ZW50cyAoY2FsbGJhY2tzKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy50eHQKaW5kZXggMDliZDhlOS4uYjUxMDU2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9ldmVudHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLnR4dApAQCAtMTI1LDcgKzEyNSw3IEBACiBGb3IgZXhhbXBsZSwgaGVyZSdzIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgZm9yIHRoZSAnc2NoZWRfd2FrZXVwJwogZXZlbnQ6CiAKLSMgY2F0IC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zY2hlZC9zY2hlZF93YWtldXAvZm9ybWF0CisjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zY2hlZC9zY2hlZF93YWtldXAvZm9ybWF0CiAKIG5hbWU6IHNjaGVkX3dha2V1cAogSUQ6IDYwCkBAIC0yMDEsMTkgKzIwMSwxOSBAQAogCiBGb3IgZXhhbXBsZToKIAotIyBjZCAvZGVidWcvdHJhY2luZy9ldmVudHMvc2NoZWQvc2NoZWRfd2FrZXVwCisjIGNkIC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL3NjaGVkL3NjaGVkX3dha2V1cAogIyBlY2hvICJjb21tb25fcHJlZW1wdF9jb3VudCA+IDQiID4gZmlsdGVyCiAKIEEgc2xpZ2h0bHkgbW9yZSBpbnZvbHZlZCBleGFtcGxlOgogCi0jIGNkIC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zY2hlZC9zY2hlZF9zaWduYWxfc2VuZAorIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zaWduYWwvc2lnbmFsX2dlbmVyYXRlCiAjIGVjaG8gIigoc2lnID49IDEwICYmIHNpZyA8IDE1KSB8fCBzaWcgPT0gMTcpICYmIGNvbW0gIT0gYmFzaCIgPiBmaWx0ZXIKIAogSWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGV4cHJlc3Npb24sIHlvdSdsbCBnZXQgYW4gJ0ludmFsaWQKIGFyZ3VtZW50JyBlcnJvciB3aGVuIHNldHRpbmcgaXQsIGFuZCB0aGUgZXJyb25lb3VzIHN0cmluZyBhbG9uZyB3aXRoCiBhbiBlcnJvciBtZXNzYWdlIGNhbiBiZSBzZWVuIGJ5IGxvb2tpbmcgYXQgdGhlIGZpbHRlciBlLmcuOgogCi0jIGNkIC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zY2hlZC9zY2hlZF9zaWduYWxfc2VuZAorIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zaWduYWwvc2lnbmFsX2dlbmVyYXRlCiAjIGVjaG8gIigoc2lnID49IDEwICYmIHNpZyA8IDE1KSB8fCBkc2lnID09IDE3KSAmJiBjb21tICE9IGJhc2giID4gZmlsdGVyCiAtYmFzaDogZWNobzogd3JpdGUgZXJyb3I6IEludmFsaWQgYXJndW1lbnQKICMgY2F0IGZpbHRlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vdm0vTWFrZWZpbGUKaW5kZXggOWRjZmYzMi4uM2ZhNGQwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogb2JqLSA6PSBkdW1teS5vCiAKICMgTGlzdCBvZiBwcm9ncmFtcyB0byBidWlsZAotaG9zdHByb2dzLXkgOj0gc2xhYmluZm8gcGFnZS10eXBlcyBodWdlcGFnZS1tbWFwIGh1Z2VwYWdlLXNobSBtYXBfaHVnZXRsYgoraG9zdHByb2dzLXkgOj0gcGFnZS10eXBlcyBodWdlcGFnZS1tbWFwIGh1Z2VwYWdlLXNobSBtYXBfaHVnZXRsYgogCiAjIFRlbGwga2J1aWxkIHRvIGFsd2F5cyBidWlsZCB0aGUgcHJvZ3JhbXMKIGFsd2F5cyA6PSAkKGhvc3Rwcm9ncy15KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS90cmFuc2h1Z2UudHh0IGIvRG9jdW1lbnRhdGlvbi92bS90cmFuc2h1Z2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjRhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3RyYW5zaHVnZS50eHQKQEAgLTAsMCArMSwyOTggQEAKKz0gVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCA9CisKKz09IE9iamVjdGl2ZSA9PQorCitQZXJmb3JtYW5jZSBjcml0aWNhbCBjb21wdXRpbmcgYXBwbGljYXRpb25zIGRlYWxpbmcgd2l0aCBsYXJnZSBtZW1vcnkKK3dvcmtpbmcgc2V0cyBhcmUgYWxyZWFkeSBydW5uaW5nIG9uIHRvcCBvZiBsaWJodWdldGxiZnMgYW5kIGluIHR1cm4KK2h1Z2V0bGJmcy4gVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCBpcyBhbiBhbHRlcm5hdGl2ZSBtZWFucyBvZgordXNpbmcgaHVnZSBwYWdlcyBmb3IgdGhlIGJhY2tpbmcgb2YgdmlydHVhbCBtZW1vcnkgd2l0aCBodWdlIHBhZ2VzCit0aGF0IHN1cHBvcnRzIHRoZSBhdXRvbWF0aWMgcHJvbW90aW9uIGFuZCBkZW1vdGlvbiBvZiBwYWdlIHNpemVzIGFuZAord2l0aG91dCB0aGUgc2hvcnRjb21pbmdzIG9mIGh1Z2V0bGJmcy4KKworQ3VycmVudGx5IGl0IG9ubHkgd29ya3MgZm9yIGFub255bW91cyBtZW1vcnkgbWFwcGluZ3MgYnV0IGluIHRoZQorZnV0dXJlIGl0IGNhbiBleHBhbmQgb3ZlciB0aGUgcGFnZWNhY2hlIGxheWVyIHN0YXJ0aW5nIHdpdGggdG1wZnMuCisKK1RoZSByZWFzb24gYXBwbGljYXRpb25zIGFyZSBydW5uaW5nIGZhc3RlciBpcyBiZWNhdXNlIG9mIHR3bworZmFjdG9ycy4gVGhlIGZpcnN0IGZhY3RvciBpcyBhbG1vc3QgY29tcGxldGVseSBpcnJlbGV2YW50IGFuZCBpdCdzIG5vdAorb2Ygc2lnbmlmaWNhbnQgaW50ZXJlc3QgYmVjYXVzZSBpdCdsbCBhbHNvIGhhdmUgdGhlIGRvd25zaWRlIG9mCityZXF1aXJpbmcgbGFyZ2VyIGNsZWFyLXBhZ2UgY29weS1wYWdlIGluIHBhZ2UgZmF1bHRzIHdoaWNoIGlzIGEKK3BvdGVudGlhbGx5IG5lZ2F0aXZlIGVmZmVjdC4gVGhlIGZpcnN0IGZhY3RvciBjb25zaXN0cyBpbiB0YWtpbmcgYQorc2luZ2xlIHBhZ2UgZmF1bHQgZm9yIGVhY2ggMk0gdmlydHVhbCByZWdpb24gdG91Y2hlZCBieSB1c2VybGFuZCAoc28KK3JlZHVjaW5nIHRoZSBlbnRlci9leGl0IGtlcm5lbCBmcmVxdWVuY3kgYnkgYSA1MTIgdGltZXMgZmFjdG9yKS4gVGhpcworb25seSBtYXR0ZXJzIHRoZSBmaXJzdCB0aW1lIHRoZSBtZW1vcnkgaXMgYWNjZXNzZWQgZm9yIHRoZSBsaWZldGltZSBvZgorYSBtZW1vcnkgbWFwcGluZy4gVGhlIHNlY29uZCBsb25nIGxhc3RpbmcgYW5kIG11Y2ggbW9yZSBpbXBvcnRhbnQKK2ZhY3RvciB3aWxsIGFmZmVjdCBhbGwgc3Vic2VxdWVudCBhY2Nlc3NlcyB0byB0aGUgbWVtb3J5IGZvciB0aGUgd2hvbGUKK3J1bnRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiBUaGUgc2Vjb25kIGZhY3RvciBjb25zaXN0IG9mIHR3bworY29tcG9uZW50czogMSkgdGhlIFRMQiBtaXNzIHdpbGwgcnVuIGZhc3RlciAoZXNwZWNpYWxseSB3aXRoCit2aXJ0dWFsaXphdGlvbiB1c2luZyBuZXN0ZWQgcGFnZXRhYmxlcyBidXQgYWxtb3N0IGFsd2F5cyBhbHNvIG9uIGJhcmUKK21ldGFsIHdpdGhvdXQgdmlydHVhbGl6YXRpb24pIGFuZCAyKSBhIHNpbmdsZSBUTEIgZW50cnkgd2lsbCBiZQorbWFwcGluZyBhIG11Y2ggbGFyZ2VyIGFtb3VudCBvZiB2aXJ0dWFsIG1lbW9yeSBpbiB0dXJuIHJlZHVjaW5nIHRoZQorbnVtYmVyIG9mIFRMQiBtaXNzZXMuIFdpdGggdmlydHVhbGl6YXRpb24gYW5kIG5lc3RlZCBwYWdldGFibGVzIHRoZQorVExCIGNhbiBiZSBtYXBwZWQgb2YgbGFyZ2VyIHNpemUgb25seSBpZiBib3RoIEtWTSBhbmQgdGhlIExpbnV4IGd1ZXN0CithcmUgdXNpbmcgaHVnZXBhZ2VzIGJ1dCBhIHNpZ25pZmljYW50IHNwZWVkdXAgYWxyZWFkeSBoYXBwZW5zIGlmIG9ubHkKK29uZSBvZiB0aGUgdHdvIGlzIHVzaW5nIGh1Z2VwYWdlcyBqdXN0IGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhlIFRMQgorbWlzcyBpcyBnb2luZyB0byBydW4gZmFzdGVyLgorCis9PSBEZXNpZ24gPT0KKworLSAiZ3JhY2VmdWwgZmFsbGJhY2siOiBtbSBjb21wb25lbnRzIHdoaWNoIGRvbid0IGhhdmUgdHJhbnNwYXJlbnQKKyAgaHVnZXBhZ2Uga25vd2xlZGdlIGZhbGwgYmFjayB0byBicmVha2luZyBhIHRyYW5zcGFyZW50IGh1Z2VwYWdlIGFuZAorICB3b3JraW5nIG9uIHRoZSByZWd1bGFyIHBhZ2VzIGFuZCB0aGVpciByZXNwZWN0aXZlIHJlZ3VsYXIgcG1kL3B0ZQorICBtYXBwaW5ncworCistIGlmIGEgaHVnZXBhZ2UgYWxsb2NhdGlvbiBmYWlscyBiZWNhdXNlIG9mIG1lbW9yeSBmcmFnbWVudGF0aW9uLAorICByZWd1bGFyIHBhZ2VzIHNob3VsZCBiZSBncmFjZWZ1bGx5IGFsbG9jYXRlZCBpbnN0ZWFkIGFuZCBtaXhlZCBpbgorICB0aGUgc2FtZSB2bWEgd2l0aG91dCBhbnkgZmFpbHVyZSBvciBzaWduaWZpY2FudCBkZWxheSBhbmQgd2l0aG91dAorICB1c2VybGFuZCBub3RpY2luZworCistIGlmIHNvbWUgdGFzayBxdWl0cyBhbmQgbW9yZSBodWdlcGFnZXMgYmVjb21lIGF2YWlsYWJsZSAoZWl0aGVyCisgIGltbWVkaWF0ZWx5IGluIHRoZSBidWRkeSBvciB0aHJvdWdoIHRoZSBWTSksIGd1ZXN0IHBoeXNpY2FsIG1lbW9yeQorICBiYWNrZWQgYnkgcmVndWxhciBwYWdlcyBzaG91bGQgYmUgcmVsb2NhdGVkIG9uIGh1Z2VwYWdlcworICBhdXRvbWF0aWNhbGx5ICh3aXRoIGtodWdlcGFnZWQpCisKKy0gaXQgZG9lc24ndCByZXF1aXJlIG1lbW9yeSByZXNlcnZhdGlvbiBhbmQgaW4gdHVybiBpdCB1c2VzIGh1Z2VwYWdlcworICB3aGVuZXZlciBwb3NzaWJsZSAodGhlIG9ubHkgcG9zc2libGUgcmVzZXJ2YXRpb24gaGVyZSBpcyBrZXJuZWxjb3JlPQorICB0byBhdm9pZCB1bm1vdmFibGUgcGFnZXMgdG8gZnJhZ21lbnQgYWxsIHRoZSBtZW1vcnkgYnV0IHN1Y2ggYSB0d2VhaworICBpcyBub3Qgc3BlY2lmaWMgdG8gdHJhbnNwYXJlbnQgaHVnZXBhZ2Ugc3VwcG9ydCBhbmQgaXQncyBhIGdlbmVyaWMKKyAgZmVhdHVyZSB0aGF0IGFwcGxpZXMgdG8gYWxsIGR5bmFtaWMgaGlnaCBvcmRlciBhbGxvY2F0aW9ucyBpbiB0aGUKKyAga2VybmVsKQorCistIHRoaXMgaW5pdGlhbCBzdXBwb3J0IG9ubHkgb2ZmZXJzIHRoZSBmZWF0dXJlIGluIHRoZSBhbm9ueW1vdXMgbWVtb3J5CisgIHJlZ2lvbnMgYnV0IGl0J2QgYmUgaWRlYWwgdG8gbW92ZSBpdCB0byB0bXBmcyBhbmQgdGhlIHBhZ2VjYWNoZQorICBsYXRlcgorCitUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IG1heGltaXplcyB0aGUgdXNlZnVsbmVzcyBvZiBmcmVlIG1lbW9yeQoraWYgY29tcGFyZWQgdG8gdGhlIHJlc2VydmF0aW9uIGFwcHJvYWNoIG9mIGh1Z2V0bGJmcyBieSBhbGxvd2luZyBhbGwKK3VudXNlZCBtZW1vcnkgdG8gYmUgdXNlZCBhcyBjYWNoZSBvciBvdGhlciBtb3ZhYmxlIChvciBldmVuIHVubW92YWJsZQorZW50aXRpZXMpLiBJdCBkb2Vzbid0IHJlcXVpcmUgcmVzZXJ2YXRpb24gdG8gcHJldmVudCBodWdlcGFnZQorYWxsb2NhdGlvbiBmYWlsdXJlcyB0byBiZSBub3RpY2VhYmxlIGZyb20gdXNlcmxhbmQuIEl0IGFsbG93cyBwYWdpbmcKK2FuZCBhbGwgb3RoZXIgYWR2YW5jZWQgVk0gZmVhdHVyZXMgdG8gYmUgYXZhaWxhYmxlIG9uIHRoZQoraHVnZXBhZ2VzLiBJdCByZXF1aXJlcyBubyBtb2RpZmljYXRpb25zIGZvciBhcHBsaWNhdGlvbnMgdG8gdGFrZQorYWR2YW50YWdlIG9mIGl0LgorCitBcHBsaWNhdGlvbnMgaG93ZXZlciBjYW4gYmUgZnVydGhlciBvcHRpbWl6ZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKK3RoaXMgZmVhdHVyZSwgbGlrZSBmb3IgZXhhbXBsZSB0aGV5J3ZlIGJlZW4gb3B0aW1pemVkIGJlZm9yZSB0byBhdm9pZAorYSBmbG9vZCBvZiBtbWFwIHN5c3RlbSBjYWxscyBmb3IgZXZlcnkgbWFsbG9jKDRrKS4gT3B0aW1pemluZyB1c2VybGFuZAoraXMgYnkgZmFyIG5vdCBtYW5kYXRvcnkgYW5kIGtodWdlcGFnZWQgYWxyZWFkeSBjYW4gdGFrZSBjYXJlIG9mIGxvbmcKK2xpdmVkIHBhZ2UgYWxsb2NhdGlvbnMgZXZlbiBmb3IgaHVnZXBhZ2UgdW5hd2FyZSBhcHBsaWNhdGlvbnMgdGhhdAorZGVhbHMgd2l0aCBsYXJnZSBhbW91bnRzIG9mIG1lbW9yeS4KKworSW4gY2VydGFpbiBjYXNlcyB3aGVuIGh1Z2VwYWdlcyBhcmUgZW5hYmxlZCBzeXN0ZW0gd2lkZSwgYXBwbGljYXRpb24KK21heSBlbmQgdXAgYWxsb2NhdGluZyBtb3JlIG1lbW9yeSByZXNvdXJjZXMuIEFuIGFwcGxpY2F0aW9uIG1heSBtbWFwIGEKK2xhcmdlIHJlZ2lvbiBidXQgb25seSB0b3VjaCAxIGJ5dGUgb2YgaXQsIGluIHRoYXQgY2FzZSBhIDJNIHBhZ2UgbWlnaHQKK2JlIGFsbG9jYXRlZCBpbnN0ZWFkIG9mIGEgNGsgcGFnZSBmb3Igbm8gZ29vZC4gVGhpcyBpcyB3aHkgaXQncworcG9zc2libGUgdG8gZGlzYWJsZSBodWdlcGFnZXMgc3lzdGVtLXdpZGUgYW5kIHRvIG9ubHkgaGF2ZSB0aGVtIGluc2lkZQorTUFEVl9IVUdFUEFHRSBtYWR2aXNlIHJlZ2lvbnMuCisKK0VtYmVkZGVkIHN5c3RlbXMgc2hvdWxkIGVuYWJsZSBodWdlcGFnZXMgb25seSBpbnNpZGUgbWFkdmlzZSByZWdpb25zCit0byBlbGltaW5hdGUgYW55IHJpc2sgb2Ygd2FzdGluZyBhbnkgcHJlY2lvdXMgYnl0ZSBvZiBtZW1vcnkgYW5kIHRvCitvbmx5IHJ1biBmYXN0ZXIuCisKK0FwcGxpY2F0aW9ucyB0aGF0IGdldHMgYSBsb3Qgb2YgYmVuZWZpdCBmcm9tIGh1Z2VwYWdlcyBhbmQgdGhhdCBkb24ndAorcmlzayB0byBsb3NlIG1lbW9yeSBieSB1c2luZyBodWdlcGFnZXMsIHNob3VsZCB1c2UKK21hZHZpc2UoTUFEVl9IVUdFUEFHRSkgb24gdGhlaXIgY3JpdGljYWwgbW1hcHBlZCByZWdpb25zLgorCis9PSBzeXNmcyA9PQorCitUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0IGNhbiBiZSBlbnRpcmVseSBkaXNhYmxlZCAobW9zdGx5IGZvcgorZGVidWdnaW5nIHB1cnBvc2VzKSBvciBvbmx5IGVuYWJsZWQgaW5zaWRlIE1BRFZfSFVHRVBBR0UgcmVnaW9ucyAodG8KK2F2b2lkIHRoZSByaXNrIG9mIGNvbnN1bWluZyBtb3JlIG1lbW9yeSByZXNvdXJjZXMpIG9yIGVuYWJsZWQgc3lzdGVtCit3aWRlLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCB3aXRoIG9uZSBvZjoKKworZWNobyBhbHdheXMgPi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWQKK2VjaG8gbWFkdmlzZSA+L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZAorZWNobyBuZXZlciA+L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZAorCitJdCdzIGFsc28gcG9zc2libGUgdG8gbGltaXQgZGVmcmFnIGVmZm9ydHMgaW4gdGhlIFZNIHRvIGdlbmVyYXRlCitodWdlcGFnZXMgaW4gY2FzZSB0aGV5J3JlIG5vdCBpbW1lZGlhdGVseSBmcmVlIHRvIG1hZHZpc2UgcmVnaW9ucyBvcgordG8gbmV2ZXIgdHJ5IHRvIGRlZnJhZyBtZW1vcnkgYW5kIHNpbXBseSBmYWxsYmFjayB0byByZWd1bGFyIHBhZ2VzCit1bmxlc3MgaHVnZXBhZ2VzIGFyZSBpbW1lZGlhdGVseSBhdmFpbGFibGUuIENsZWFybHkgaWYgd2Ugc3BlbmQgQ1BVCit0aW1lIHRvIGRlZnJhZyBtZW1vcnksIHdlIHdvdWxkIGV4cGVjdCB0byBnYWluIGV2ZW4gbW9yZSBieSB0aGUgZmFjdAord2UgdXNlIGh1Z2VwYWdlcyBsYXRlciBpbnN0ZWFkIG9mIHJlZ3VsYXIgcGFnZXMuIFRoaXMgaXNuJ3QgYWx3YXlzCitndWFyYW50ZWVkLCBidXQgaXQgbWF5IGJlIG1vcmUgbGlrZWx5IGluIGNhc2UgdGhlIGFsbG9jYXRpb24gaXMgZm9yIGEKK01BRFZfSFVHRVBBR0UgcmVnaW9uLgorCitlY2hvIGFsd2F5cyA+L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZGVmcmFnCitlY2hvIG1hZHZpc2UgPi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2RlZnJhZworZWNobyBuZXZlciA+L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZGVmcmFnCisKK2todWdlcGFnZWQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgd2hlbgordHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZCBpcyBzZXQgdG8gImFsd2F5cyIgb3IgIm1hZHZpc2UsIGFuZCBpdCdsbAorYmUgYXV0b21hdGljYWxseSBzaHV0ZG93biBpZiBpdCdzIHNldCB0byAibmV2ZXIiLgorCitraHVnZXBhZ2VkIHJ1bnMgdXN1YWxseSBhdCBsb3cgZnJlcXVlbmN5IHNvIHdoaWxlIG9uZSBtYXkgbm90IHdhbnQgdG8KK2ludm9rZSBkZWZyYWcgYWxnb3JpdGhtcyBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgcGFnZSBmYXVsdHMsIGl0CitzaG91bGQgYmUgd29ydGggaW52b2tpbmcgZGVmcmFnIGF0IGxlYXN0IGluIGtodWdlcGFnZWQuIEhvd2V2ZXIgaXQncworYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIGRlZnJhZyBpbiBraHVnZXBhZ2VkOgorCitlY2hvIHllcyA+L3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9kZWZyYWcKK2VjaG8gbm8gPi9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvZGVmcmFnCisKK1lvdSBjYW4gYWxzbyBjb250cm9sIGhvdyBtYW55IHBhZ2VzIGtodWdlcGFnZWQgc2hvdWxkIHNjYW4gYXQgZWFjaAorcGFzczoKKworL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2Uva2h1Z2VwYWdlZC9wYWdlc190b19zY2FuCisKK2FuZCBob3cgbWFueSBtaWxsaXNlY29uZHMgdG8gd2FpdCBpbiBraHVnZXBhZ2VkIGJldHdlZW4gZWFjaCBwYXNzICh5b3UKK2NhbiBzZXQgdGhpcyB0byAwIHRvIHJ1biBraHVnZXBhZ2VkIGF0IDEwMCUgdXRpbGl6YXRpb24gb2Ygb25lIGNvcmUpOgorCisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzCisKK2FuZCBob3cgbWFueSBtaWxsaXNlY29uZHMgdG8gd2FpdCBpbiBraHVnZXBhZ2VkIGlmIHRoZXJlJ3MgYW4gaHVnZXBhZ2UKK2FsbG9jYXRpb24gZmFpbHVyZSB0byB0aHJvdHRsZSB0aGUgbmV4dCBhbGxvY2F0aW9uIGF0dGVtcHQuCisKKy9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzCisKK1RoZSBraHVnZXBhZ2VkIHByb2dyZXNzIGNhbiBiZSBzZWVuIGluIHRoZSBudW1iZXIgb2YgcGFnZXMgY29sbGFwc2VkOgorCisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL3BhZ2VzX2NvbGxhcHNlZAorCitmb3IgZWFjaCBwYXNzOgorCisvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9raHVnZXBhZ2VkL2Z1bGxfc2NhbnMKKworPT0gQm9vdCBwYXJhbWV0ZXIgPT0KKworWW91IGNhbiBjaGFuZ2UgdGhlIHN5c2ZzIGJvb3QgdGltZSBkZWZhdWx0cyBvZiBUcmFuc3BhcmVudCBIdWdlcGFnZQorU3VwcG9ydCBieSBwYXNzaW5nIHRoZSBwYXJhbWV0ZXIgInRyYW5zcGFyZW50X2h1Z2VwYWdlPWFsd2F5cyIgb3IKKyJ0cmFuc3BhcmVudF9odWdlcGFnZT1tYWR2aXNlIiBvciAidHJhbnNwYXJlbnRfaHVnZXBhZ2U9bmV2ZXIiCisod2l0aG91dCAiIikgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisKKz09IE5lZWQgb2YgYXBwbGljYXRpb24gcmVzdGFydCA9PQorCitUaGUgdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZCB2YWx1ZXMgb25seSBhZmZlY3QgZnV0dXJlCitiZWhhdmlvci4gU28gdG8gbWFrZSB0aGVtIGVmZmVjdGl2ZSB5b3UgbmVlZCB0byByZXN0YXJ0IGFueQorYXBwbGljYXRpb24gdGhhdCBjb3VsZCBoYXZlIGJlZW4gdXNpbmcgaHVnZXBhZ2VzLiBUaGlzIGFsc28gYXBwbGllcyB0bwordGhlIHJlZ2lvbnMgcmVnaXN0ZXJlZCBpbiBraHVnZXBhZ2VkLgorCis9PSBnZXRfdXNlcl9wYWdlcyBhbmQgZm9sbG93X3BhZ2UgPT0KKworZ2V0X3VzZXJfcGFnZXMgYW5kIGZvbGxvd19wYWdlIGlmIHJ1biBvbiBhIGh1Z2VwYWdlLCB3aWxsIHJldHVybiB0aGUKK2hlYWQgb3IgdGFpbCBwYWdlcyBhcyB1c3VhbCAoZXhhY3RseSBhcyB0aGV5IHdvdWxkIGRvIG9uCitodWdldGxiZnMpLiBNb3N0IGd1cCB1c2VycyB3aWxsIG9ubHkgY2FyZSBhYm91dCB0aGUgYWN0dWFsIHBoeXNpY2FsCithZGRyZXNzIG9mIHRoZSBwYWdlIGFuZCBpdHMgdGVtcG9yYXJ5IHBpbm5pbmcgdG8gcmVsZWFzZSBhZnRlciB0aGUgSS9PCitpcyBjb21wbGV0ZSwgc28gdGhleSB3b24ndCBldmVyIG5vdGljZSB0aGUgZmFjdCB0aGUgcGFnZSBpcyBodWdlLiBCdXQKK2lmIGFueSBkcml2ZXIgaXMgZ29pbmcgdG8gbWFuZ2xlIG92ZXIgdGhlIHBhZ2Ugc3RydWN0dXJlIG9mIHRoZSB0YWlsCitwYWdlIChsaWtlIGZvciBjaGVja2luZyBwYWdlLT5tYXBwaW5nIG9yIG90aGVyIGJpdHMgdGhhdCBhcmUgcmVsZXZhbnQKK2ZvciB0aGUgaGVhZCBwYWdlIGFuZCBub3QgdGhlIHRhaWwgcGFnZSksIGl0IHNob3VsZCBiZSB1cGRhdGVkIHRvIGp1bXAKK3RvIGNoZWNrIGhlYWQgcGFnZSBpbnN0ZWFkICh3aGlsZSBzZXJpYWxpemluZyBwcm9wZXJseSBhZ2FpbnN0CitzcGxpdF9odWdlX3BhZ2UoKSB0byBhdm9pZCB0aGUgaGVhZCBhbmQgdGFpbCBwYWdlcyB0byBkaXNhcHBlYXIgZnJvbQordW5kZXIgaXQsIHNlZSB0aGUgZnV0ZXggY29kZSB0byBzZWUgYW4gZXhhbXBsZSBvZiB0aGF0LCBodWdldGxiZnMgYWxzbworbmVlZGVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gZnV0ZXggY29kZSBmb3Igc2ltaWxhciByZWFzb25zKS4KKworTk9URTogdGhlc2UgYXJlbid0IG5ldyBjb25zdHJhaW50cyB0byB0aGUgR1VQIEFQSSwgYW5kIHRoZXkgbWF0Y2ggdGhlCitzYW1lIGNvbnN0cmFpbnMgdGhhdCBhcHBsaWVzIHRvIGh1Z2V0bGJmcyB0b28sIHNvIGFueSBkcml2ZXIgY2FwYWJsZQorb2YgaGFuZGxpbmcgR1VQIG9uIGh1Z2V0bGJmcyB3aWxsIGFsc28gd29yayBmaW5lIG9uIHRyYW5zcGFyZW50CitodWdlcGFnZSBiYWNrZWQgbWFwcGluZ3MuCisKK0luIGNhc2UgeW91IGNhbid0IGhhbmRsZSBjb21wb3VuZCBwYWdlcyBpZiB0aGV5J3JlIHJldHVybmVkIGJ5Citmb2xsb3dfcGFnZSwgdGhlIEZPTExfU1BMSVQgYml0IGNhbiBiZSBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyIHRvCitmb2xsb3dfcGFnZSwgc28gdGhhdCBpdCB3aWxsIHNwbGl0IHRoZSBodWdlcGFnZXMgYmVmb3JlIHJldHVybmluZwordGhlbS4gTWlncmF0aW9uIGZvciBleGFtcGxlIHBhc3NlcyBGT0xMX1NQTElUIGFzIHBhcmFtZXRlciB0bworZm9sbG93X3BhZ2UgYmVjYXVzZSBpdCdzIG5vdCBodWdlcGFnZSBhd2FyZSBhbmQgaW4gZmFjdCBpdCBjYW4ndCB3b3JrCithdCBhbGwgb24gaHVnZXRsYmZzIChidXQgaXQgaW5zdGVhZCB3b3JrcyBmaW5lIG9uIHRyYW5zcGFyZW50CitodWdlcGFnZXMgdGhhbmtzIHRvIEZPTExfU1BMSVQpLiBtaWdyYXRpb24gc2ltcGx5IGNhbid0IGRlYWwgd2l0aAoraHVnZXBhZ2VzIGJlaW5nIHJldHVybmVkIChhcyBpdCdzIG5vdCBvbmx5IGNoZWNraW5nIHRoZSBwZm4gb2YgdGhlCitwYWdlIGFuZCBwaW5uaW5nIGl0IGR1cmluZyB0aGUgY29weSBidXQgaXQgcHJldGVuZHMgdG8gbWlncmF0ZSB0aGUKK21lbW9yeSBpbiByZWd1bGFyIHBhZ2Ugc2l6ZXMgYW5kIHdpdGggcmVndWxhciBwdGUvcG1kIG1hcHBpbmdzKS4KKworPT0gT3B0aW1pemluZyB0aGUgYXBwbGljYXRpb25zID09CisKK1RvIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUga2VybmVsIHdpbGwgbWFwIGEgMk0gcGFnZSBpbW1lZGlhdGVseSBpbiBhbnkKK21lbW9yeSByZWdpb24sIHRoZSBtbWFwIHJlZ2lvbiBoYXMgdG8gYmUgaHVnZXBhZ2UgbmF0dXJhbGx5CithbGlnbmVkLiBwb3NpeF9tZW1hbGlnbigpIGNhbiBwcm92aWRlIHRoYXQgZ3VhcmFudGVlLgorCis9PSBIdWdldGxiZnMgPT0KKworWW91IGNhbiB1c2UgaHVnZXRsYmZzIG9uIGEga2VybmVsIHRoYXQgaGFzIHRyYW5zcGFyZW50IGh1Z2VwYWdlCitzdXBwb3J0IGVuYWJsZWQganVzdCBmaW5lIGFzIGFsd2F5cy4gTm8gZGlmZmVyZW5jZSBjYW4gYmUgbm90ZWQgaW4KK2h1Z2V0bGJmcyBvdGhlciB0aGFuIHRoZXJlIHdpbGwgYmUgbGVzcyBvdmVyYWxsIGZyYWdtZW50YXRpb24uIEFsbAordXN1YWwgZmVhdHVyZXMgYmVsb25naW5nIHRvIGh1Z2V0bGJmcyBhcmUgcHJlc2VydmVkIGFuZAordW5hZmZlY3RlZC4gbGliaHVnZXRsYmZzIHdpbGwgYWxzbyB3b3JrIGZpbmUgYXMgdXN1YWwuCisKKz09IEdyYWNlZnVsIGZhbGxiYWNrID09CisKK0NvZGUgd2Fsa2luZyBwYWdldGFibGVzIGJ1dCB1bndhcmUgYWJvdXQgaHVnZSBwbWRzIGNhbiBzaW1wbHkgY2FsbAorc3BsaXRfaHVnZV9wYWdlX3BtZChtbSwgcG1kKSB3aGVyZSB0aGUgcG1kIGlzIHRoZSBvbmUgcmV0dXJuZWQgYnkKK3BtZF9vZmZzZXQuIEl0J3MgdHJpdmlhbCB0byBtYWtlIHRoZSBjb2RlIHRyYW5zcGFyZW50IGh1Z2VwYWdlIGF3YXJlCitieSBqdXN0IGdyZXBwaW5nIGZvciAicG1kX29mZnNldCIgYW5kIGFkZGluZyBzcGxpdF9odWdlX3BhZ2VfcG1kIHdoZXJlCittaXNzaW5nIGFmdGVyIHBtZF9vZmZzZXQgcmV0dXJucyB0aGUgcG1kLiBUaGFua3MgdG8gdGhlIGdyYWNlZnVsCitmYWxsYmFjayBkZXNpZ24sIHdpdGggYSBvbmUgbGluZXIgY2hhbmdlLCB5b3UgY2FuIGF2b2lkIHRvIHdyaXRlCitodW5kcmVkIGlmIG5vdCB0aG91c2FuZCBvZiBsaW5lcyBvZiBjb21wbGV4IGNvZGUgdG8gbWFrZSB5b3VyIGNvZGUKK2h1Z2VwYWdlIGF3YXJlLgorCitJZiB5b3UncmUgbm90IHdhbGtpbmcgcGFnZXRhYmxlcyBidXQgeW91IHJ1biBpbnRvIGEgcGh5c2ljYWwgaHVnZXBhZ2UKK2J1dCB5b3UgY2FuJ3QgaGFuZGxlIGl0IG5hdGl2ZWx5IGluIHlvdXIgY29kZSwgeW91IGNhbiBzcGxpdCBpdCBieQorY2FsbGluZyBzcGxpdF9odWdlX3BhZ2UocGFnZSkuIFRoaXMgaXMgd2hhdCB0aGUgTGludXggVk0gZG9lcyBiZWZvcmUKK2l0IHRyaWVzIHRvIHN3YXBvdXQgdGhlIGh1Z2VwYWdlIGZvciBleGFtcGxlLgorCitFeGFtcGxlIHRvIG1ha2UgbXJlbWFwLmMgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgYXdhcmUgd2l0aCBhIG9uZSBsaW5lcgorY2hhbmdlOgorCitkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYworLS0tIGEvbW0vbXJlbWFwLmMKKysrKyBiL21tL21yZW1hcC5jCitAQCAtNDEsNiArNDEsNyBAQCBzdGF0aWMgcG1kX3QgKmdldF9vbGRfcG1kKHN0cnVjdCBtbV9zdHJ1CisJCXJldHVybiBOVUxMOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworKwlzcGxpdF9odWdlX3BhZ2VfcG1kKG1tLCBwbWQpOworCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKKwkJcmV0dXJuIE5VTEw7CisKKz09IExvY2tpbmcgaW4gaHVnZXBhZ2UgYXdhcmUgY29kZSA9PQorCitXZSB3YW50IGFzIG11Y2ggY29kZSBhcyBwb3NzaWJsZSBodWdlcGFnZSBhd2FyZSwgYXMgY2FsbGluZworc3BsaXRfaHVnZV9wYWdlKCkgb3Igc3BsaXRfaHVnZV9wYWdlX3BtZCgpIGhhcyBhIGNvc3QuCisKK1RvIG1ha2UgcGFnZXRhYmxlIHdhbGtzIGh1Z2UgcG1kIGF3YXJlLCBhbGwgeW91IG5lZWQgdG8gZG8gaXMgdG8gY2FsbAorcG1kX3RyYW5zX2h1Z2UoKSBvbiB0aGUgcG1kIHJldHVybmVkIGJ5IHBtZF9vZmZzZXQuIFlvdSBtdXN0IGhvbGQgdGhlCittbWFwX3NlbSBpbiByZWFkIChvciB3cml0ZSkgbW9kZSB0byBiZSBzdXJlIGFuIGh1Z2UgcG1kIGNhbm5vdCBiZQorY3JlYXRlZCBmcm9tIHVuZGVyIHlvdSBieSBraHVnZXBhZ2VkIChraHVnZXBhZ2VkIGNvbGxhcHNlX2h1Z2VfcGFnZQordGFrZXMgdGhlIG1tYXBfc2VtIGluIHdyaXRlIG1vZGUgaW4gYWRkaXRpb24gdG8gdGhlIGFub25fdm1hIGxvY2spLiBJZgorcG1kX3RyYW5zX2h1Z2UgcmV0dXJucyBmYWxzZSwgeW91IGp1c3QgZmFsbGJhY2sgaW4gdGhlIG9sZCBjb2RlCitwYXRocy4gSWYgaW5zdGVhZCBwbWRfdHJhbnNfaHVnZSByZXR1cm5zIHRydWUsIHlvdSBoYXZlIHRvIHRha2UgdGhlCittbS0+cGFnZV90YWJsZV9sb2NrIGFuZCByZS1ydW4gcG1kX3RyYW5zX2h1Z2UuIFRha2luZyB0aGUKK3BhZ2VfdGFibGVfbG9jayB3aWxsIHByZXZlbnQgdGhlIGh1Z2UgcG1kIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEKK3JlZ3VsYXIgcG1kIGZyb20gdW5kZXIgeW91IChzcGxpdF9odWdlX3BhZ2UgY2FuIHJ1biBpbiBwYXJhbGxlbCB0byB0aGUKK3BhZ2V0YWJsZSB3YWxrKS4gSWYgdGhlIHNlY29uZCBwbWRfdHJhbnNfaHVnZSByZXR1cm5zIGZhbHNlLCB5b3UKK3Nob3VsZCBqdXN0IGRyb3AgdGhlIHBhZ2VfdGFibGVfbG9jayBhbmQgZmFsbGJhY2sgdG8gdGhlIG9sZCBjb2RlIGFzCitiZWZvcmUuIE90aGVyd2lzZSB5b3Ugc2hvdWxkIHJ1biBwbWRfdHJhbnNfc3BsaXR0aW5nIG9uIHRoZSBwbWQuIEluCitjYXNlIHBtZF90cmFuc19zcGxpdHRpbmcgcmV0dXJucyB0cnVlLCBpdCBtZWFucyBzcGxpdF9odWdlX3BhZ2UgaXMKK2FscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBzcGxpdHRpbmcgdGhlIHBhZ2UuIFNvIGlmIHBtZF90cmFuc19zcGxpdHRpbmcKK3JldHVybnMgdHJ1ZSBpdCdzIGVub3VnaCB0byBkcm9wIHRoZSBwYWdlX3RhYmxlX2xvY2sgYW5kIGNhbGwKK3dhaXRfc3BsaXRfaHVnZV9wYWdlIGFuZCB0aGVuIGZhbGxiYWNrIHRoZSBvbGQgY29kZSBwYXRocy4gWW91IGFyZQorZ3VhcmFudGVlZCBieSB0aGUgdGltZSB3YWl0X3NwbGl0X2h1Z2VfcGFnZSByZXR1cm5zLCB0aGUgcG1kIGlzbid0CitodWdlIGFueW1vcmUuIElmIHBtZF90cmFuc19zcGxpdHRpbmcgcmV0dXJucyBmYWxzZSwgeW91IGNhbiBwcm9jZWVkIHRvCitwcm9jZXNzIHRoZSBodWdlIHBtZCBhbmQgdGhlIGh1Z2VwYWdlIG5hdGl2ZWx5LiBPbmNlIGZpbmlzaGVkIHlvdSBjYW4KK2Ryb3AgdGhlIHBhZ2VfdGFibGVfbG9jay4KKworPT0gY29tcG91bmRfbG9jaywgZ2V0X3VzZXJfcGFnZXMgYW5kIHB1dF9wYWdlID09CisKK3NwbGl0X2h1Z2VfcGFnZSBpbnRlcm5hbGx5IGhhcyB0byBkaXN0cmlidXRlIHRoZSByZWZjb3VudHMgaW4gdGhlIGhlYWQKK3BhZ2UgdG8gdGhlIHRhaWwgcGFnZXMgYmVmb3JlIGNsZWFyaW5nIGFsbCBQR19oZWFkL3RhaWwgYml0cyBmcm9tIHRoZQorcGFnZSBzdHJ1Y3R1cmVzLiBJdCBjYW4gZG8gdGhhdCBlYXNpbHkgZm9yIHJlZmNvdW50cyB0YWtlbiBieSBodWdlIHBtZAorbWFwcGluZ3MuIEJ1dCB0aGUgR1VJIEFQSSBhcyBjcmVhdGVkIGJ5IGh1Z2V0bGJmcyAodGhhdCByZXR1cm5zIGhlYWQKK2FuZCB0YWlsIHBhZ2VzIGlmIHJ1bm5pbmcgZ2V0X3VzZXJfcGFnZXMgb24gYW4gYWRkcmVzcyBiYWNrZWQgYnkgYW55CitodWdlcGFnZSksIHJlcXVpcmVzIHRoZSByZWZjb3VudCB0byBiZSBhY2NvdW50ZWQgb24gdGhlIHRhaWwgcGFnZXMgYW5kCitub3Qgb25seSBpbiB0aGUgaGVhZCBwYWdlcywgaWYgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHJ1bgorc3BsaXRfaHVnZV9wYWdlIHdoaWxlIHRoZXJlIGFyZSBndXAgcGlucyBlc3RhYmxpc2hlZCBvbiBhbnkgdGFpbAorcGFnZS4gRmFpbHVyZSB0byBiZSBhYmxlIHRvIHJ1biBzcGxpdF9odWdlX3BhZ2UgaWYgdGhlcmUncyBhbnkgZ3VwIHBpbgorb24gYW55IHRhaWwgcGFnZSwgd291bGQgbWVhbiBoYXZpbmcgdG8gc3BsaXQgYWxsIGh1Z2VwYWdlcyB1cGZyb250IGluCitnZXRfdXNlcl9wYWdlcyB3aGljaCBpcyB1bmFjY2VwdGFibGUgYXMgdG9vIG1hbnkgZ3VwIHVzZXJzIGFyZQorcGVyZm9ybWFuY2UgY3JpdGljYWwgYW5kIHRoZXkgbXVzdCB3b3JrIG5hdGl2ZWx5IG9uIGh1Z2VwYWdlcyBsaWtlCit0aGV5IHdvcmsgbmF0aXZlbHkgb24gaHVnZXRsYmZzIGFscmVhZHkgKGh1Z2V0bGJmcyBpcyBzaW1wbGVyIGJlY2F1c2UKK2h1Z2V0bGJmcyBwYWdlcyBjYW5ub3QgYmUgc3BsaXR0ZWQgc28gdGhlcmUgd291bGRuJ3QgYmUgcmVxdWlyZW1lbnQgb2YKK2FjY291bnRpbmcgdGhlIHBpbnMgb24gdGhlIHRhaWwgcGFnZXMgZm9yIGh1Z2V0bGJmcykuIElmIHdlIHdvdWxkbid0CithY2NvdW50IHRoZSBndXAgcmVmY291bnRzIG9uIHRoZSB0YWlsIHBhZ2VzIGR1cmluZyBndXAsIHdlIHdvbid0IGtub3cKK2FueW1vcmUgd2hpY2ggdGFpbCBwYWdlIGlzIHBpbm5lZCBieSBndXAgYW5kIHdoaWNoIGlzIG5vdCB3aGlsZSB3ZSBydW4KK3NwbGl0X2h1Z2VfcGFnZS4gQnV0IHdlIHN0aWxsIGhhdmUgdG8gYWRkIHRoZSBndXAgcGluIHRvIHRoZSBoZWFkIHBhZ2UKK3RvbywgdG8ga25vdyB3aGVuIHdlIGNhbiBmcmVlIHRoZSBjb21wb3VuZCBwYWdlIGluIGNhc2UgaXQncyBuZXZlcgorc3BsaXR0ZWQgZHVyaW5nIGl0cyBsaWZldGltZS4gVGhhdCByZXF1aXJlcyBjaGFuZ2luZyBub3QganVzdAorZ2V0X3BhZ2UsIGJ1dCBwdXRfcGFnZSBhcyB3ZWxsIHNvIHRoYXQgd2hlbiBwdXRfcGFnZSBydW5zIG9uIGEgdGFpbAorcGFnZSAoYW5kIG9ubHkgb24gYSB0YWlsIHBhZ2UpIGl0IHdpbGwgZmluZCBpdHMgcmVzcGVjdGl2ZSBoZWFkIHBhZ2UsCithbmQgdGhlbiBpdCB3aWxsIGRlY3JlYXNlIHRoZSBoZWFkIHBhZ2UgcmVmY291bnQgaW4gYWRkaXRpb24gdG8gdGhlCit0YWlsIHBhZ2UgcmVmY291bnQuIFRvIG9idGFpbiBhIGhlYWQgcGFnZSByZWxpYWJseSBhbmQgdG8gZGVjcmVhc2UgaXRzCityZWZjb3VudCB3aXRob3V0IHJhY2UgY29uZGl0aW9ucywgcHV0X3BhZ2UgaGFzIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0CitfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCB1c2luZyBhIHNwZWNpYWwgcGVyLXBhZ2UgbG9jayBjYWxsZWQKK2NvbXBvdW5kX2xvY2suCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vdzEvc2xhdmVzLzAwLUlOREVYCmluZGV4IGY4MTAxZDYuLjc1NjEzYzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvc2xhdmVzLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vdzEvc2xhdmVzLzAwLUlOREVYCkBAIC0yLDMgKzIsNSBAQAogCS0gVGhpcyBmaWxlCiB3MV90aGVybQogCS0gVGhlIE1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIGRzMTgqMjAgdGVtcGVyYXR1cmUgc2Vuc29yLgordzFfZHMyNDIzCisJLSBUaGUgTWF4aW0vRGFsbGFzIFNlbWljb25kdWN0b3IgZHMyNDIzIGNvdW50ZXIgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvdzFfZHMyNDIzIGIvRG9jdW1lbnRhdGlvbi93MS9zbGF2ZXMvdzFfZHMyNDIzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYTY1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3cxL3NsYXZlcy93MV9kczI0MjMKQEAgLTAsMCArMSw0NyBAQAorS2VybmVsIGRyaXZlciB3MV9kczI0MjMKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBNYXhpbSBEUzI0MjMgYmFzZWQgY291bnRlciBkZXZpY2VzLgorCitzdXBwb3J0ZWQgZmFtaWx5IGNvZGVzOgorCVcxX1RIRVJNX0RTMjQyMwkweDFECisKK0F1dGhvcjogTWlrYSBMYWl0aW8gPGxhbWlrckBwaWxwcGEub3JnPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworU3VwcG9ydCBpcyBwcm92aWRlZCB0aHJvdWdoIHRoZSBzeXNmcyB3MV9zbGF2ZSBmaWxlLiBFYWNoIG9wZW5pbmcgYW5kCityZWFkIHNlcXVlbmNlIG9mIHcxX3NsYXZlIGZpbGUgaW5pdGlhdGVzIHRoZSByZWFkIG9mIGNvdW50ZXJzIGFuZCByYW0KK2F2YWlsYWJsZSBpbiBEUzI0MjMgcGFnZXMgMTIgLSAxNS4KKworUmVzdWx0IG9mIGVhY2ggcGFnZSBpcyBwcm92aWRlZCBhcyBhbiBBU0NJSSBvdXRwdXQgd2hlcmUgZWFjaCBjb3VudGVyCit2YWx1ZSBhbmQgYXNzb2NpYXRlZCByYW0gYnVmZmVyIGlzIG91dHBwdXRlZCB0byBvd24gbGluZS4KKworRWFjaCBsaW5lcyB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlcyBvZiA0MiBieXRlcyByZWFkIGZyb20gdGhlIGNvdW50ZXIgYW5kCittZW1vcnkgcGFnZSBhbG9uZyB0aGUgY3JjPVlFUyBvciBOTyBmb3IgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZWFkIG9wZXJhdGlvbgord2FzIHN1Y2Nlc3NmdWxsIGFuZCBDUkMgbWF0Y2hlZC4KK0lmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWxsLCB0aGVyZSBpcyBhbHNvIGluIHRoZSBlbmQgb2YgZWFjaCBsaW5lCithIGNvdW50ZXIgdmFsdWUgZXhwcmVzc2VkIGFzIGFuIGludGVnZXIgYWZ0ZXIgYz0KKworTWVhbmluZyBvZiA0MiBieXRlcyByZXByZXNlbnRlZCBpcyBmb2xsb3dpbmc6CisgLSAxIGJ5dGUgZnJvbSByYW0gcGFnZQorIC0gNCBieXRlcyBmb3IgdGhlIGNvdW50ZXIgdmFsdWUKKyAtIDQgemVybyBieXRlcworIC0gMiBieXRlcyBmb3IgY3JjMTYgd2hpY2ggd2FzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGF0YSByZWFkIHNpbmNlIHRoZSBwcmV2aW91cyBjcmMgYnl0ZXMKKyAtIDMxIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoZSByYW0gcGFnZQorIC0gY3JjPVlFUy9OTyBpbmRpY2F0aW5nIHdoZXRoZXIgcmVhZCB3YXMgb2sgYW5kIGNyYyBtYXRjaGVkCisgLSBjPTxpbnQ+IGN1cnJlbnQgY291bnRlciB2YWx1ZQorCitleGFtcGxlIGZyb20gdGhlIHN1Y2Nlc3NmdWxsIHJlYWQ6CiswMCAwMiAwMCAwMCAwMCAwMCAwMCAwMCAwMCA2ZCAzOCAwMCBmZiBmZiAwMCAwMCBmZSBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiBjcmM9WUVTIGM9MgorMDAgMDIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgZTAgMWYgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgY3JjPVlFUyBjPTIKKzAwIDI5IGM2IDVkIDE4IDAwIDAwIDAwIDAwIDA0IDM3IDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIDAwIDAwIGZmIGZmIGNyYz1ZRVMgYz00MDg3OTg3NjEKKzAwIDA1IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDhkIDM5IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGNyYz1ZRVMgYz01CisKK2V4YW1wbGUgZnJvbSB0aGUgcmVhZCB3aXRoIGNyYyBlcnJvcnM6CiswMCAwMiAwMCAwMCAwMCAwMCAwMCAwMCAwMCA2ZCAzOCAwMCBmZiBmZiAwMCAwMCBmZSBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiBjcmM9WUVTIGM9MgorMDAgMDIgMDAgMDAgMjIgMDAgMDAgMDAgMDAgZTAgMWYgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgMDAgMDAgZmYgZmYgY3JjPU5PCiswMCBlMSA2MSA1ZCAxOSAwMCAwMCAwMCAwMCBkZiAwYiAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiAwMCAwMCBmZiBmZiBjcmM9Tk8KKzAwIDA1IDAwIDAwIDIwIDAwIDAwIDAwIDAwIDhkIDM5IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGNyYz1OTwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAppbmRleCBiZGViODFjLi45YjcyMjFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dApAQCAtNjIyLDkgKzYyMiw5IEBACiAgIFRoZSBwYXlsb2FkIG1heSBiZSBjb21wcmVzc2VkLiBUaGUgZm9ybWF0IG9mIGJvdGggdGhlIGNvbXByZXNzZWQgYW5kCiAgIHVuY29tcHJlc3NlZCBkYXRhIHNob3VsZCBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBzdGFuZGFyZCBtYWdpYwogICBudW1iZXJzLiAgVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgY29tcHJlc3Npb24gZm9ybWF0cyBhcmUgZ3ppcAotICAobWFnaWMgbnVtYmVycyAxRiA4QiBvciAxRiA5RSksIGJ6aXAyIChtYWdpYyBudW1iZXIgNDIgNUEpIGFuZCBMWk1BCi0gIChtYWdpYyBudW1iZXIgNUQgMDApLiAgVGhlIHVuY29tcHJlc3NlZCBwYXlsb2FkIGlzIGN1cnJlbnRseSBhbHdheXMgRUxGCi0gIChtYWdpYyBudW1iZXIgN0YgNDUgNEMgNDYpLgorICAobWFnaWMgbnVtYmVycyAxRiA4QiBvciAxRiA5RSksIGJ6aXAyIChtYWdpYyBudW1iZXIgNDIgNUEpLCBMWk1BCisgIChtYWdpYyBudW1iZXIgNUQgMDApLCBhbmQgWFogKG1hZ2ljIG51bWJlciBGRCAzNykuICBUaGUgdW5jb21wcmVzc2VkCisgIHBheWxvYWQgaXMgY3VycmVudGx5IGFsd2F5cyBFTEYgKG1hZ2ljIG51bWJlciA3RiA0NSA0QyA0NikuCiAgIAogRmllbGQgbmFtZToJcGF5bG9hZF9sZW5ndGgKIFR5cGU6CQlyZWFkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3h6LnR4dCBiL0RvY3VtZW50YXRpb24veHoudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjNlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3h6LnR4dApAQCAtMCwwICsxLDEyMSBAQAorCitYWiBkYXRhIGNvbXByZXNzaW9uIGluIExpbnV4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorCisgICAgWFogaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBmb3JtYXQgd2l0aCBoaWdoIGNvbXByZXNzaW9uCisgICAgcmF0aW8gYW5kIHJlbGF0aXZlbHkgZmFzdCBkZWNvbXByZXNzaW9uLiBUaGUgcHJpbWFyeSBjb21wcmVzc2lvbgorICAgIGFsZ29yaXRobSAoZmlsdGVyKSBpcyBMWk1BMi4gQWRkaXRpb25hbCBmaWx0ZXJzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUKKyAgICBjb21wcmVzc2lvbiByYXRpbyBldmVuIGZ1cnRoZXIuIEUuZy4gQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXJzCisgICAgaW1wcm92ZSBjb21wcmVzc2lvbiByYXRpbyBvZiBleGVjdXRhYmxlIGRhdGEuCisKKyAgICBUaGUgWFogZGVjb21wcmVzc29yIGluIExpbnV4IGlzIGNhbGxlZCBYWiBFbWJlZGRlZC4gSXQgc3VwcG9ydHMKKyAgICB0aGUgTFpNQTIgZmlsdGVyIGFuZCBvcHRpb25hbGx5IGFsc28gQkNKIGZpbHRlcnMuIENSQzMyIGlzIHN1cHBvcnRlZAorICAgIGZvciBpbnRlZ3JpdHkgY2hlY2tpbmcuIFRoZSBob21lIHBhZ2Ugb2YgWFogRW1iZWRkZWQgaXMgYXQKKyAgICA8aHR0cDovL3R1a2Fhbmkub3JnL3h6L2VtYmVkZGVkLmh0bWw+LCB3aGVyZSB5b3UgY2FuIGZpbmQgdGhlCisgICAgbGF0ZXN0IHZlcnNpb24gYW5kIGFsc28gaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgdGhlIGNvZGUgb3V0c2lkZQorICAgIHRoZSBMaW51eCBrZXJuZWwuCisKKyAgICBGb3IgdXNlcnNwYWNlLCBYWiBVdGlscyBwcm92aWRlIGEgemxpYi1saWtlIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAgICBhbmQgYSBnemlwLWxpa2UgY29tbWFuZCBsaW5lIHRvb2wuIFhaIFV0aWxzIGNhbiBiZSBkb3dubG9hZGVkIGZyb20KKyAgICA8aHR0cDovL3R1a2Fhbmkub3JnL3h6Lz4uCisKK1haIHJlbGF0ZWQgY29tcG9uZW50cyBpbiB0aGUga2VybmVsCisKKyAgICBUaGUgeHpfZGVjIG1vZHVsZSBwcm92aWRlcyBYWiBkZWNvbXByZXNzb3Igd2l0aCBzaW5nbGUtY2FsbCAoYnVmZmVyCisgICAgdG8gYnVmZmVyKSBhbmQgbXVsdGktY2FsbCAoc3RhdGVmdWwpIEFQSXMuIFRoZSB1c2FnZSBvZiB0aGUgeHpfZGVjCisgICAgbW9kdWxlIGlzIGRvY3VtZW50ZWQgaW4gaW5jbHVkZS9saW51eC94ei5oLgorCisgICAgVGhlIHh6X2RlY190ZXN0IG1vZHVsZSBpcyBmb3IgdGVzdGluZyB4el9kZWMuIHh6X2RlY190ZXN0IGlzIG5vdAorICAgIHVzZWZ1bCB1bmxlc3MgeW91IGFyZSBoYWNraW5nIHRoZSBYWiBkZWNvbXByZXNzb3IuIHh6X2RlY190ZXN0CisgICAgYWxsb2NhdGVzIGEgY2hhciBkZXZpY2UgbWFqb3IgZHluYW1pY2FsbHkgdG8gd2hpY2ggb25lIGNhbiB3cml0ZQorICAgIC54eiBmaWxlcyBmcm9tIHVzZXJzcGFjZS4gVGhlIGRlY29tcHJlc3NlZCBvdXRwdXQgaXMgdGhyb3duIGF3YXkuCisgICAgS2VlcCBhbiBleWUgb24gZG1lc2cgdG8gc2VlIGRpYWdub3N0aWNzIHByaW50ZWQgYnkgeHpfZGVjX3Rlc3QuCisgICAgU2VlIHRoZSB4el9kZWNfdGVzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGRldGFpbHMuCisKKyAgICBGb3IgZGVjb21wcmVzc2luZyB0aGUga2VybmVsIGltYWdlLCBpbml0cmFtZnMsIGFuZCBpbml0cmQsIHRoZXJlCisgICAgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGluIGxpYi9kZWNvbXByZXNzX3VueHouYy4gSXRzIEFQSSBpcyB0aGUKKyAgICBzYW1lIGFzIGluIG90aGVyIGRlY29tcHJlc3NfKi5jIGZpbGVzLCB3aGljaCBpcyBkZWZpbmVkIGluCisgICAgaW5jbHVkZS9saW51eC9kZWNvbXByZXNzL2dlbmVyaWMuaC4KKworICAgIHNjcmlwdHMveHpfd3JhcC5zaCBpcyBhIHdyYXBwZXIgZm9yIHRoZSB4eiBjb21tYW5kIGxpbmUgdG9vbCBmb3VuZAorICAgIGZyb20gWFogVXRpbHMuIFRoZSB3cmFwcGVyIHNldHMgY29tcHJlc3Npb24gb3B0aW9ucyB0byB2YWx1ZXMgc3VpdGFibGUKKyAgICBmb3IgY29tcHJlc3NpbmcgdGhlIGtlcm5lbCBpbWFnZS4KKworICAgIEZvciBrZXJuZWwgbWFrZWZpbGVzLCB0d28gY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciB1c2Ugd2l0aAorICAgICQoY2FsbCBpZl9uZWVkZWQpLiBUaGUga2VybmVsIGltYWdlIHNob3VsZCBiZSBjb21wcmVzc2VkIHdpdGgKKyAgICAkKGNhbGwgaWZfbmVlZGVkLHh6a2Vybikgd2hpY2ggd2lsbCB1c2UgYSBCQ0ogZmlsdGVyIGFuZCBhIGJpZyBMWk1BMgorICAgIGRpY3Rpb25hcnkuIEl0IHdpbGwgYWxzbyBhcHBlbmQgYSBmb3VyLWJ5dGUgdHJhaWxlciBjb250YWluaW5nIHRoZQorICAgIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBmaWxlLCB3aGljaCBpcyBuZWVkZWQgYnkgdGhlIGJvb3QgY29kZS4KKyAgICBPdGhlciB0aGluZ3Mgc2hvdWxkIGJlIGNvbXByZXNzZWQgd2l0aCAkKGNhbGwgaWZfbmVlZGVkLHh6bWlzYykKKyAgICB3aGljaCB3aWxsIHVzZSBubyBCQ0ogZmlsdGVyIGFuZCAxIE1pQiBMWk1BMiBkaWN0aW9uYXJ5LgorCitOb3RlcyBvbiBjb21wcmVzc2lvbiBvcHRpb25zCisKKyAgICBTaW5jZSB0aGUgWFogRW1iZWRkZWQgc3VwcG9ydHMgb25seSBzdHJlYW1zIHdpdGggbm8gaW50ZWdyaXR5IGNoZWNrIG9yCisgICAgQ1JDMzIsIG1ha2Ugc3VyZSB0aGF0IHlvdSBkb24ndCB1c2Ugc29tZSBvdGhlciBpbnRlZ3JpdHkgY2hlY2sgdHlwZQorICAgIHdoZW4gZW5jb2RpbmcgZmlsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgZGVjb2RlZCBieSB0aGUga2VybmVsLiBXaXRoCisgICAgbGlibHptYSwgeW91IG5lZWQgdG8gdXNlIGVpdGhlciBMWk1BX0NIRUNLX05PTkUgb3IgTFpNQV9DSEVDS19DUkMzMgorICAgIHdoZW4gZW5jb2RpbmcuIFdpdGggdGhlIHh6IGNvbW1hbmQgbGluZSB0b29sLCB1c2UgLS1jaGVjaz1ub25lIG9yCisgICAgLS1jaGVjaz1jcmMzMi4KKworICAgIFVzaW5nIENSQzMyIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHVubGVzcyB0aGVyZSBpcyBzb21lIG90aGVyIGxheWVyCisgICAgd2hpY2ggd2lsbCB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW55d2F5LgorICAgIERvdWJsZSBjaGVja2luZyB0aGUgaW50ZWdyaXR5IHdvdWxkIHByb2JhYmx5IGJlIHdhc3RlIG9mIENQVSBjeWNsZXMuCisgICAgTm90ZSB0aGF0IHRoZSBoZWFkZXJzIHdpbGwgYWx3YXlzIGhhdmUgYSBDUkMzMiB3aGljaCB3aWxsIGJlIHZhbGlkYXRlZAorICAgIGJ5IHRoZSBkZWNvZGVyOyB5b3UgY2FuIG9ubHkgY2hhbmdlIHRoZSBpbnRlZ3JpdHkgY2hlY2sgdHlwZSAob3IKKyAgICBkaXNhYmxlIGl0KSBmb3IgdGhlIGFjdHVhbCB1bmNvbXByZXNzZWQgZGF0YS4KKworICAgIEluIHVzZXJzcGFjZSwgTFpNQTIgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBkaWN0aW9uYXJ5IHNpemVzIG9mIHNldmVyYWwKKyAgICBtZWdhYnl0ZXMuIFRoZSBkZWNvZGVyIG5lZWRzIHRvIGhhdmUgdGhlIGRpY3Rpb25hcnkgaW4gUkFNLCB0aHVzIGJpZworICAgIGRpY3Rpb25hcmllcyBjYW5ub3QgYmUgdXNlZCBmb3IgZmlsZXMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgZGVjb2RlZAorICAgIGJ5IHRoZSBrZXJuZWwuIDEgTWlCIGlzIHByb2JhYmx5IHRoZSBtYXhpbXVtIHJlYXNvbmFibGUgZGljdGlvbmFyeQorICAgIHNpemUgZm9yIGluLWtlcm5lbCB1c2UgKG1heWJlIG1vcmUgaXMgT0sgZm9yIGluaXRyYW1mcykuIFRoZSBwcmVzZXRzCisgICAgaW4gWFogVXRpbHMgbWF5IG5vdCBiZSBvcHRpbWFsIHdoZW4gY3JlYXRpbmcgZmlsZXMgZm9yIHRoZSBrZXJuZWwsCisgICAgc28gZG9uJ3QgaGVzaXRhdGUgdG8gdXNlIGN1c3RvbSBzZXR0aW5ncy4gRXhhbXBsZToKKworICAgICAgICB4eiAtLWNoZWNrPWNyYzMyIC0tbHptYTI9ZGljdD01MTJLaUIgaW5wdXRmaWxlCisKKyAgICBBbiBleGNlcHRpb24gdG8gYWJvdmUgZGljdGlvbmFyeSBzaXplIGxpbWl0YXRpb24gaXMgd2hlbiB0aGUgZGVjb2RlcgorICAgIGlzIHVzZWQgaW4gc2luZ2xlLWNhbGwgbW9kZS4gRGVjb21wcmVzc2luZyB0aGUga2VybmVsIGl0c2VsZiBpcyBhbgorICAgIGV4YW1wbGUgb2YgdGhpcyBzaXR1YXRpb24uIEluIHNpbmdsZS1jYWxsIG1vZGUsIHRoZSBtZW1vcnkgdXNhZ2UKKyAgICBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZGljdGlvbmFyeSBzaXplLCBhbmQgaXQgaXMgcGVyZmVjdGx5IGZpbmUgdG8KKyAgICB1c2UgYSBiaWcgZGljdGlvbmFyeTogZm9yIG1heGltdW0gY29tcHJlc3Npb24sIHRoZSBkaWN0aW9uYXJ5IHNob3VsZAorICAgIGJlIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgdW5jb21wcmVzc2VkIGRhdGEgaXRzZWxmLgorCitGdXR1cmUgcGxhbnMKKworICAgIENyZWF0aW5nIGEgbGltaXRlZCBYWiBlbmNvZGVyIG1heSBiZSBjb25zaWRlcmVkIGlmIHBlb3BsZSB0aGluayBpdCBpcworICAgIHVzZWZ1bC4gTFpNQTIgaXMgc2xvd2VyIHRvIGNvbXByZXNzIHRoYW4gZS5nLiBEZWZsYXRlIG9yIExaTyBldmVuIGF0CisgICAgdGhlIGZhc3Rlc3Qgc2V0dGluZ3MsIHNvIGl0IGlzbid0IGNsZWFyIGlmIExaTUEyIGVuY29kZXIgaXMgd2FudGVkCisgICAgaW50byB0aGUga2VybmVsLgorCisgICAgU3VwcG9ydCBmb3IgbGltaXRlZCByYW5kb20tYWNjZXNzIHJlYWRpbmcgaXMgcGxhbm5lZCBmb3IgdGhlCisgICAgZGVjb21wcmVzc2lvbiBjb2RlLiBJIGRvbid0IGtub3cgaWYgaXQgY291bGQgaGF2ZSBhbnkgdXNlIGluIHRoZQorICAgIGtlcm5lbCwgYnV0IEkga25vdyB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCBpbiBzb21lIGVtYmVkZGVkIHByb2plY3RzCisgICAgb3V0c2lkZSB0aGUgTGludXgga2VybmVsLgorCitDb25mb3JtYW5jZSB0byB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24KKworICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBjb3JuZXIgY2FzZXMgd2hlcmUgdGhpbmdzIGhhdmUgYmVlbiBzaW1wbGlmaWVkCisgICAgYXQgZXhwZW5zZSBvZiBkZXRlY3RpbmcgZXJyb3JzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiBUaGVzZSBzaG91bGQgbm90CisgICAgbWF0dGVyIGluIHByYWN0aWNlIGFsbCwgc2luY2UgdGhleSBkb24ndCBjYXVzZSBzZWN1cml0eSBpc3N1ZXMuIEJ1dAorICAgIGl0IGlzIGdvb2QgdG8ga25vdyB0aGlzIGlmIHRlc3RpbmcgdGhlIGNvZGUgZS5nLiB3aXRoIHRoZSB0ZXN0IGZpbGVzCisgICAgZnJvbSBYWiBVdGlscy4KKworUmVwb3J0aW5nIGJ1Z3MKKworICAgIEJlZm9yZSByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBjaGVjayB0aGF0IGl0J3Mgbm90IGZpeGVkIGFscmVhZHkKKyAgICBhdCB1cHN0cmVhbS4gU2VlIDxodHRwOi8vdHVrYWFuaS5vcmcveHovZW1iZWRkZWQuaHRtbD4gdG8gZ2V0IHRoZQorICAgIGxhdGVzdCBjb2RlLgorCisgICAgUmVwb3J0IGJ1Z3MgdG8gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4gb3IgdmlzaXQgI3R1a2Fhbmkgb24KKyAgICBGcmVlbm9kZSBhbmQgdGFsayB0byBMYXJoenUuIEkgZG9uJ3QgYWN0aXZlbHkgcmVhZCBMS01MIG9yIG90aGVyCisgICAga2VybmVsLXJlbGF0ZWQgbWFpbGluZyBsaXN0cywgc28gaWYgdGhlcmUncyBzb21ldGhpbmcgSSBzaG91bGQga25vdywKKyAgICB5b3Ugc2hvdWxkIGVtYWlsIHRvIG1lIHBlcnNvbmFsbHkgb3IgdXNlIElSQy4KKworICAgIERvbid0IGJvdGhlciBJZ29yIFBhdmxvdiB3aXRoIHF1ZXN0aW9ucyBhYm91dCB0aGUgWFogaW1wbGVtZW50YXRpb24KKyAgICBpbiB0aGUga2VybmVsIG9yIGFib3V0IFhaIFV0aWxzLiBXaGlsZSB0aGVzZSB0d28gaW1wbGVtZW50YXRpb25zCisgICAgaW5jbHVkZSBlc3NlbnRpYWwgY29kZSB0aGF0IGlzIGRpcmVjdGx5IGJhc2VkIG9uIElnb3IgUGF2bG92J3MgY29kZSwKKyAgICB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgYXJlbid0IG1haW50YWluZWQgbm9yIHN1cHBvcnRlZCBieSBoaW0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3poX0NOL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi96aF9DTi9IT1dUTwppbmRleCA2OTE2MDc3Li5mYWY5NzZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3poX0NOL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vemhfQ04vSE9XVE8KQEAgLTM0Nyw4ICszNDcsOCBAQAog5pyA5pawYnVn55qE6YCa55+l77yM5Y+v5Lul6K6i6ZiFYnVnbWUtbmV36YKu5Lu25YiX6KGo77yI5Y+q5pyJ5paw55qEYnVn5oql5ZGK5Lya6KKr5a+E5Yiw6L+Z6YeM77yJCiDmiJbogIXorqLpmIVidWdtZS1qYW5pdG9y6YKu5Lu25YiX6KGo77yI5omA5pyJYnVnemlsbGHnmoTlj5jliqjpg73kvJrooqvlr4TliLDov5nph4zvvInjgIIKIAotCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldwotCWh0dHA6Ly9saXN0cy5vc2RsLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCisJaHR0cHM6Ly9saXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldworCWh0dHBzOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycwogCiAKIOmCruS7tuWIl+ihqApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi96aF9DTi9TdWJtaXR0aW5nRHJpdmVycyBiL0RvY3VtZW50YXRpb24vemhfQ04vU3VibWl0dGluZ0RyaXZlcnMKaW5kZXggYzI3YjBmNi4uNTg4OWY4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi96aF9DTi9TdWJtaXR0aW5nRHJpdmVycworKysgYi9Eb2N1bWVudGF0aW9uL3poX0NOL1N1Ym1pdHRpbmdEcml2ZXJzCkBAIC02MSw3ICs2MSw3IEBACiBMaW51eCAyLjY6CiAJ6Zmk5LqG6YG15b6q5ZKMIDIuNCDniYjlhoXmoLjlkIzmoLfnmoTop4TliJnlpJbvvIzkvaDov5jpnIDopoHlnKggbGludXgta2VybmVsIOmCruS7tgogCeWIl+ihqOS4iui3n+i4quacgOaWsOeahCBBUEkg5Y+Y5YyW44CC5ZCRIExpbnV4IDIuNiDlhoXmoLjmj5DkuqTpqbHliqjnmoTpobbnuqfogZTns7vkuroKLQnmmK8gQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz7jgIIKKwnmmK8gQW5kcmV3IE1vcnRvbiA8YWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZz7jgIIKIAog5Yaz5a6a6K6+5aSH6amx5Yqo6IO95ZCm6KKr5o6l5Y+X55qE5p2h5Lu2CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDIzZDA0MzYuLjg5ZTRkNGIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0yODUsNiArMjg1LDQxIEBACiBTOglNYWludGFpbmVkCiBGOglzb3VuZC9wY2kvYWQxODg5LioKIAorQUQ1MjVYIEFOQUxPRyBERVZJQ0VTIERJR0lUQUwgUE9URU5USU9NRVRFUlMgRFJJVkVSCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ1MjU0CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC5jCisKK0FENTM5OCBDVVJSRU5UIFJFR1VMQVRPUiBEUklWRVIgKEFENTM5OC9BRDU4MjEpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ1Mzk4CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvcmVndWxhdG9yL2FkNTM5OC5jCisKK0FENzE0WCBDQVBBQ0lUQU5DRSBUT1VDSCBTRU5TT1IgRFJJVkVSIChBRDcxNDIvMy83LzgvN0EpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ3MTQyCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHguYworCitBRDc4NzcgVE9VQ0hTQ1JFRU4gRFJJVkVSCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ3ODc3CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc3LmMKKworQUQ3ODc5IFRPVUNIU0NSRUVOIERSSVZFUiAoQUQ3ODc5L0FENzg4OSkKK006CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgorTDoJZGV2aWNlLWRyaXZlci1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworVzoJaHR0cDovL3dpa2ktYW5hbG9nLmNvbS9BRDc4NzkKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYworCiBBRE0xMDI1IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCiBNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKQEAgLTMwNCw2ICszMzksMzIgQEAKIFM6CU9ycGhhbgogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS4qCiAKK0FEUDU1MjAgQkFDS0xJR0hUIERSSVZFUiBXSVRIIElPIEVYUEFOREVSIChBRFA1NTIwL0FEUDU1MDEpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQURQNTUyMAorUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL21mZC9hZHA1NTIwLmMKK0Y6CWRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYworRjoJZHJpdmVycy9sZWQvbGVkcy1hZHA1NTIwLmMKK0Y6CWRyaXZlcnMvZ3Bpby9hZHA1NTIwLWdwaW8uYworRjoJZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTIwLWtleXMuYworCitBRFA1NTg4IFFXRVJUWSBLRVlQQUQgQU5EIElPIEVYUEFOREVSIERSSVZFUiAoQURQNTU4OC9BRFA1NTg3KQorTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+CitMOglkZXZpY2UtZHJpdmVyLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitXOglodHRwOi8vd2lraS1hbmFsb2cuY29tL0FEUDU1ODgKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYworRjoJZHJpdmVycy9ncGlvL2FkcDU1ODgtZ3Bpby5jCisKK0FEUDg4NjAgQkFDS0xJR0hUIERSSVZFUiAoQURQODg2MC9BRFA4ODYxL0FEUDg4NjMpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQURQODg2MAorUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKKwogQURUNzQ2WCBGQU4gRFJJVkVSCiBNOglDb2xpbiBMZXJveSA8Y29saW5AY29saW5vLm5ldD4KIFM6CU1haW50YWluZWQKQEAgLTMxNiw2ICszNzcsMTMgQEAKIEY6CURvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3NQogRjoJZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKIAorQURYTDM0WCBUSFJFRS1BWElTIERJR0lUQUwgQUNDRUxFUk9NRVRFUiBEUklWRVIgKEFEWEwzNDUvQURYTDM0NikKK006CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgorTDoJZGV2aWNlLWRyaXZlci1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworVzoJaHR0cDovL3dpa2ktYW5hbG9nLmNvbS9BRFhMMzQ1CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LmMKKwogQURWQU5TWVMgU0NTSSBEUklWRVIKIE06CU1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC00MjgsNyArNDk2LDYgQEAKIEY6CWFyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKIAogQU1TIChBcHBsZSBNb3Rpb24gU2Vuc29yKSBEUklWRVIKLU06CVN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CiBNOglNaWNoYWVsIEhhbnNlbG1hbm4gPGxpbnV4LWtlcm5lbEBoYW5zbWkuY2g+CiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbWFjaW50b3NoL2Ftcy8KQEAgLTQ0MCwxNiArNTA3LDIyIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2luZmluaWJhbmQvaHcvYW1zbzExMDAvCiAKK0FOQUxPRyBERVZJQ0VTIElOQyBBU09DIENPREVDIERSSVZFUlMKK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitXOglodHRwOi8vd2lraS1hbmFsb2cuY29tLworUzoJU3VwcG9ydGVkCitGOglzb3VuZC9zb2MvY29kZWNzL2FkMSoKK0Y6CXNvdW5kL3NvYy9jb2RlY3MvYWRhdSoKK0Y6CXNvdW5kL3NvYy9jb2RlY3MvYWRhdioKK0Y6CXNvdW5kL3NvYy9jb2RlY3Mvc3NtKgorCiBBTkFMT0cgREVWSUNFUyBJTkMgQVNPQyBEUklWRVJTCiBMOgl1Y2xpbnV4LWRpc3QtZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBXOglodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiBTOglTdXBwb3J0ZWQKIEY6CXNvdW5kL3NvYy9ibGFja2Zpbi8qCi1GOglzb3VuZC9zb2MvY29kZWNzL2FkMSoKLUY6CXNvdW5kL3NvYy9jb2RlY3MvYWRhdSoKLUY6CXNvdW5kL3NvYy9jb2RlY3MvYWRhdioKLUY6CXNvdW5kL3NvYy9jb2RlY3Mvc3NtKgogCiBBT0EgKEFwcGxlIE9uYm9hcmQgQXVkaW8pIEFMU0EgRFJJVkVSCiBNOglKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgpAQCAtMTQyMyw3ICsxNDk2LDkgQEAKIEJST0FEQ09NIEJSQ004MDIxMSBJRUVFODAyLjExbiBXSVJFTEVTUyBEUklWRVIKIE06CUJyZXR0IFJ1ZGxleSA8YnJ1ZGxleUBicm9hZGNvbS5jb20+CiBNOglIZW5yeSBQdGFzaW5za2kgPGhlbnJ5cEBicm9hZGNvbS5jb20+Ci1NOglOb2hlZSBLbyA8bm9oZWVrQGJyb2FkY29tLmNvbT4KK006CURvd2FuIEtpbSA8ZG93YW5AYnJvYWRjb20uY29tPgorTToJUm9sYW5kIFZvc3NlbiA8cnZvc3NlbkBicm9hZGNvbS5jb20+CitNOglBcmVuZCB2YW4gU3ByaWVsIDxhcmVuZEBicm9hZGNvbS5jb20+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS8KQEAgLTE0NDgsNiArMTUyMywxNCBAQAogRjoJYmxvY2svYnNnLmMKIEY6CWluY2x1ZGUvbGludXgvYnNnLmgKIAorQlQ4N1ggQVVESU8gRFJJVkVSCitNOglDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitUOglnaXQgZ2l0Oi8vZ2l0LmFsc2EtcHJvamVjdC5vcmcvYWxzYS1rZXJuZWwuZ2l0CitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQnQ4N3gudHh0CitGOglzb3VuZC9wY2kvYnQ4N3guYworCiBCVDhYWEdQSU8gRFJJVkVSCiBNOglNaWNoYWVsIEJ1ZXNjaCA8bWJAYnUzc2NoLmRlPgogVzoJaHR0cDovL2J1M3NjaC5kZS9idGdwaW8ucGhwCkBAIC0xNDczLDYgKzE1NTYsMTMgQEAKIEY6CURvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di8KIEY6CWRyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dioKIAorQy1NRURJQSBDTUk4Nzg4IERSSVZFUgorTToJQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CitMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVDoJZ2l0IGdpdDovL2dpdC5hbHNhLXByb2plY3Qub3JnL2Fsc2Eta2VybmVsLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJc291bmQvcGNpL294eWdlbi8KKwogQ0FDSEVGSUxFUzogRlMtQ0FDSEUgQkFDS0VORCBGT1IgQ0FDSElORyBPTiBNT1VOVEVEIEZJTEVTWVNURU1TCiBNOglEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgogTDoJbGludXgtY2FjaGVmc0ByZWRoYXQuY29tCkBAIC0xNzA5LDcgKzE3OTksOCBAQAogRjoJZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCiAKIENPTkZJR0ZTCi1NOglKb2VsIEJlY2tlciA8am9lbC5iZWNrZXJAb3JhY2xlLmNvbT4KK006CUpvZWwgQmVja2VyIDxqbGJlY0BldmlscGxhbi5vcmc+CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2psYmVjL2NvbmZpZ2ZzLmdpdAogUzoJU3VwcG9ydGVkCiBGOglmcy9jb25maWdmcy8KIEY6CWluY2x1ZGUvbGludXgvY29uZmlnZnMuaApAQCAtMTkzMSw3ICsyMDIyLDcgQEAKIERDQ1AgUFJPVE9DT0wKIE06CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBnaG9zdHByb3RvY29scy5uZXQ+CiBMOglkY2NwQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvRENDUAorVzoJaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2NvbGxhYm9yYXRlL3dvcmtncm91cHMvbmV0d29ya2luZy9kY2NwCiBTOglNYWludGFpbmVkCiBGOglpbmNsdWRlL2xpbnV4L2RjY3AuaAogRjoJaW5jbHVkZS9saW51eC90ZnJjLmgKQEAgLTIyNjMsNiArMjM1NCwxMyBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL3I4MjYwMF9lZGFjLmMKIAorRURJUk9MIFVBLTEwMS9VQS0xMDAwIERSSVZFUgorTToJQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CitMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVDoJZ2l0IGdpdDovL2dpdC5hbHNhLXByb2plY3Qub3JnL2Fsc2Eta2VybmVsLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJc291bmQvdXNiL21pc2MvdWExMDEuYworCiBFRUVQQyBMQVBUT1AgRVhUUkFTIERSSVZFUgogTToJQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluY2pAaWtzYWlmLm5ldD4KIEw6CWFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApAQCAtMjI3MSw2ICsyMzY5LDE0IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwogCitFRUVQQyBXTUkgRVhUUkFTIERSSVZFUgorTToJQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluY2pAaWtzYWlmLm5ldD4KK0w6CWFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJcGxhdGZvcm0tZHJpdmVyLXg4NkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9hY3BpNGFzdXMuc2YubmV0CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYworCiBFRklGQiBGUkFNRUJVRkZFUiBEUklWRVIKIEw6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZwogTToJUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgpAQCAtMjM0NSw3ICsyNDUxLDcgQEAKIE06CVN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgogTDoJYnJpZGdlQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LmxpbnV4LWZvdW5kYXRpb24ub3JnL2VuL05ldDpCcmlkZ2UKK1c6CWh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9lbi9OZXQ6QnJpZGdlCiBTOglNYWludGFpbmVkCiBGOglpbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvCiBGOgluZXQvYnJpZGdlLwpAQCAtMjYwOCw2ICsyNzE0LDE0IEBACiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLWdwaW8uYwogRjoJaW5jbHVkZS9saW51eC9pMmMtZ3Bpby5oCiAKK0dFTkVSSUMgR1BJTyBJMkMgTVVMVElQTEVYRVIgRFJJVkVSCitNOglQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CitMOglsaW51eC1pMmNAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaTJjL211eGVzL2dwaW8taTJjbXV4LmMKK0Y6CWluY2x1ZGUvbGludXgvZ3Bpby1pMmNtdXguaAorRjoJRG9jdW1lbnRhdGlvbi9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXgKKwogR0VORVJJQyBIRExDIChXQU4pIERSSVZFUlMKIE06CUtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CiBXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLwpAQCAtMzQxNSw2ICszNTI5LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3NlcmlhbC9qc20vCiAKK0sxMFRFTVAgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVIKK006CUNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPgorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9od21vbi9rMTB0ZW1wCitGOglkcml2ZXJzL2h3bW9uL2sxMHRlbXAuYworCiBLOFRFTVAgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVIKIE06CVJ1ZG9sZiBNYXJlayA8ci5tYXJla0Bhc3NlbWJsZXIuY3o+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCkBAIC00MDAwLDkgKzQxMjEsOCBAQAogRjoJa2VybmVsL21vZHVsZS5jCiAKIE1PVElPTiBFWUUgVkFJTyBQSUNUVVJFQk9PSyBDQU1FUkEgRFJJVkVSCi1NOglTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogVzoJaHR0cDovL3BvcGllcy5uZXQvbWV5ZS8KLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9tZXllLnR4dAogRjoJZHJpdmVycy9tZWRpYS92aWRlby9tZXllLioKIEY6CWluY2x1ZGUvbGludXgvbWV5ZS5oCkBAIC00MjY4LDYgKzQzODgsNyBAQAogTToJS09OSVNISSBSeXVzdWtlIDxrb25pc2hpLnJ5dXN1a2VAbGFiLm50dC5jby5qcD4KIEw6CWxpbnV4LW5pbGZzQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5uaWxmcy5vcmcvZW4vCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3J5dXN1a2UvbmlsZnMyLmdpdAogUzoJU3VwcG9ydGVkCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL25pbGZzMi50eHQKIEY6CWZzL25pbGZzMi8KQEAgLTQyODksMTEgKzQ0MTAsMTEgQEAKIEY6CWRyaXZlcnMvc2NzaS9uc3AzMioKIAogTlRGUyBGSUxFU1lTVEVNCi1NOglBbnRvbiBBbHRhcGFybWFrb3YgPGFpYTIxQGNhbnRhYi5uZXQ+CitNOglBbnRvbiBBbHRhcGFybWFrb3YgPGFudG9uQHR1eGVyYS5jb20+CiBMOglsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVc6CWh0dHA6Ly93d3cubGludXgtbnRmcy5vcmcvCitXOglodHRwOi8vd3d3LnR1eGVyYS5jb20vCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2FpYTIxL250ZnMtMi42LmdpdAotUzoJTWFpbnRhaW5lZAorUzoJU3VwcG9ydGVkCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CiBGOglmcy9udGZzLwogCkBAIC00NDQ1LDYgKzQ1NjYsMTMgQEAKIEY6CWluY2x1ZGUvbGludXgvb2YqLmgKIEs6CW9mX2dldF9wcm9wZXJ0eQogCitPUEw0IERSSVZFUgorTToJQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CitMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVDoJZ2l0IGdpdDovL2dpdC5hbHNhLXByb2plY3Qub3JnL2Fsc2Eta2VybmVsLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJc291bmQvZHJpdmVycy9vcGw0LworCiBPUFJPRklMRQogTToJUm9iZXJ0IFJpY2h0ZXIgPHJvYmVydC5yaWNodGVyQGFtZC5jb20+CiBMOglvcHJvZmlsZS1saXN0QGxpc3RzLnNmLm5ldApAQCAtNDQ1Niw3ICs0NTg0LDcgQEAKIAogT1JBQ0xFIENMVVNURVIgRklMRVNZU1RFTSAyIChPQ0ZTMikKIE06CU1hcmsgRmFzaGVoIDxtZmFzaGVoQHN1c2UuY29tPgotTToJSm9lbCBCZWNrZXIgPGpvZWwuYmVja2VyQG9yYWNsZS5jb20+CitNOglKb2VsIEJlY2tlciA8amxiZWNAZXZpbHBsYW4ub3JnPgogTDoJb2NmczItZGV2ZWxAb3NzLm9yYWNsZS5jb20gKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogVzoJaHR0cDovL29zcy5vcmFjbGUuY29tL3Byb2plY3RzL29jZnMyLwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qbGJlYy9vY2ZzMi5naXQKQEAgLTQ1NDEsNyArNDY2OSw3IEBACiBNOglDaHJpcyBXcmlnaHQgPGNocmlzd0Bzb3VzLXNvbC5vcmc+CiBNOglBbG9rIEthdGFyaWEgPGFrYXRhcmlhQHZtd2FyZS5jb20+CiBNOglSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Ci1MOgl2aXJ0dWFsaXphdGlvbkBsaXN0cy5vc2RsLm9yZworTDoJdmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9pYTY0L3BhcmF2aXJ0X29wcy50eHQKIEY6CWFyY2gvKi9rZXJuZWwvcGFyYXZpcnQqCkBAIC01MDM5LDExICs1MTY3LDYgQEAKIEY6CWtlcm5lbC9zcmN1KgogWDoJa2VybmVsL3JjdXRvcnR1cmUuYwogCi1SRUFMIFRJTUUgQ0xPQ0sgRFJJVkVSIChMRUdBQ1kpCi1NOglQYXVsIEdvcnRtYWtlciA8cF9nb3J0bWFrZXJAeWFob28uY29tPgotUzoJTWFpbnRhaW5lZAotRjoJZHJpdmVycy9jaGFyL3J0Yy5jCi0KIFJFQUwgVElNRSBDTE9DSyAoUlRDKSBTVUJTWVNURU0KIE06CUFsZXNzYW5kcm8gWnVtbW8gPGEuenVtbW9AdG93ZXJ0ZWNoLml0PgogTDoJcnRjLWxpbnV4QGdvb2dsZWdyb3Vwcy5jb20KQEAgLTUxNDksOCArNTI3Miw3IEBACiBGOglkcml2ZXJzL3MzOTAvbmV0LwogCiBTMzkwIFpDUllQVCBEUklWRVIKLU06CUZlbGl4IEJlY2sgPGZlbGl4LmJlY2tAZGUuaWJtLmNvbT4KLU06CVJhbHBoIFd1ZXJ0aG5lciA8cmFscGgud3VlcnRobmVyQGRlLmlibS5jb20+CitNOglIb2xnZXIgRGVuZ2xlciA8aGRAbGludXgudm5ldC5pYm0uY29tPgogTToJbGludXgzOTBAZGUuaWJtLmNvbQogTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KQEAgLTUxOTYsNyArNTMxOCw3IEBACiBNOglKYXNzaSBCcmFyIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CVN1cHBvcnRlZAotRjoJc291bmQvc29jL3MzYzI0eHgKK0Y6CXNvdW5kL3NvYy9zYW1zdW5nCiAKIFRJTUVLRUVQSU5HLCBOVFAKIE06CUpvaG4gU3R1bHR6IDxqb2huc3R1bEB1cy5pYm0uY29tPgpAQCAtNTkyOSw3ICs2MDUxLDggQEAKIFRPTU9ZTyBTRUNVUklUWSBNT0RVTEUKIE06CUtlbnRhcm8gVGFrZWRhIDx0YWtlZGFrbkBudHRkYXRhLmNvLmpwPgogTToJVGV0c3VvIEhhbmRhIDxwZW5ndWluLWtlcm5lbEBJLWxvdmUuU0FLVVJBLm5lLmpwPgotTDoJdG9tb3lvLXVzZXJzLWVuQGxpc3RzLnNvdXJjZWZvcmdlLmpwIChzdWJzY3JpYmVycy1vbmx5LCBmb3IgZGV2ZWxvcGVycyBhbmQgdXNlcnMgaW4gRW5nbGlzaCkKK0w6CXRvbW95by1kZXYtZW5AbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciBkZXZlbG9wZXJzIGluIEVuZ2xpc2gpCitMOgl0b21veW8tdXNlcnMtZW5AbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciB1c2VycyBpbiBFbmdsaXNoKQogTDoJdG9tb3lvLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIGRldmVsb3BlcnMgaW4gSmFwYW5lc2UpCiBMOgl0b21veW8tdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciB1c2VycyBpbiBKYXBhbmVzZSkKIFc6CWh0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvCkBAIC02MjAzLDYgKzYzMjYsMTMgQEAKIFc6CWh0dHA6Ly93d3cub25lLWV5ZWQtYWxpZW4ubmV0L35tZGhhcm0vbGludXgtdXNiLwogRjoJZHJpdmVycy91c2Ivc3RvcmFnZS8KIAorVVNCIE1JREkgRFJJVkVSCitNOglDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitUOglnaXQgZ2l0Oi8vZ2l0LmFsc2EtcHJvamVjdC5vcmcvYWxzYS1rZXJuZWwuZ2l0CitTOglNYWludGFpbmVkCitGOglzb3VuZC91c2IvbWlkaS4qCisKIFVTQiBPSENJIERSSVZFUgogTToJRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCkBAIC02NDQyLDcgKzY1NzIsNyBAQAogVklSVElPIEhPU1QgKFZIT1NUKQogTToJIk1pY2hhZWwgUy4gVHNpcmtpbiIgPG1zdEByZWRoYXQuY29tPgogTDoJa3ZtQHZnZXIua2VybmVsLm9yZwotTDoJdmlydHVhbGl6YXRpb25AbGlzdHMub3NkbC5vcmcKK0w6CXZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3Zob3N0LwpAQCAtNjQ2MSwxMyArNjU5MSwxMiBAQAogRjoJZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYwogCiBWSUEgU0QvTU1DIENBUkQgQ09OVFJPTExFUiBEUklWRVIKLU06CUpvc2VwaCBDaGFuIDxKb3NlcGhDaGFuQHZpYS5jb20udHc+CitNOglCcnVjZSBDaGFuZyA8YnJ1Y2VjaGFuZ0B2aWEuY29tLnR3PgogTToJSGFyYWxkIFdlbHRlIDxIYXJhbGRXZWx0ZUB2aWF0ZWNoLmNvbT4KIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbW1jL2hvc3QvdmlhLXNkbW1jLmMKIAogVklBIFVOSUNIUk9NRShQUk8pL0NIUk9NRTkgRlJBTUVCVUZGRVIgRFJJVkVSCi1NOglKb3NlcGggQ2hhbiA8Sm9zZXBoQ2hhbkB2aWEuY29tLnR3PgogTToJRmxvcmlhbiBUb2JpYXMgU2NoYW5kaW5hdCA8RmxvcmlhblNjaGFuZGluYXRAZ214LmRlPgogTDoJbGludXgtZmJkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCkBAIC02NDkyLDcgKzY2MjEsNyBAQAogCiBWTFlOUSBCVVMKIE06CUZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+Ci1MOglvcGVud3J0LWRldmVsQGxpc3RzLm9wZW53cnQub3JnCitMOglvcGVud3J0LWRldmVsQGxpc3RzLm9wZW53cnQub3JnIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy92bHlucS92bHlucS5jCiBGOglpbmNsdWRlL2xpbnV4L3ZseW5xLmgKQEAgLTY3MTIsNyArNjg0MSw3IEBACiBNOglKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXkuZml0emhhcmRpbmdlQGNpdHJpeC5jb20+CiBNOglLb25yYWQgUnplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+CiBMOgl4ZW4tZGV2ZWxAbGlzdHMueGVuc291cmNlLmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCi1MOgl2aXJ0dWFsaXphdGlvbkBsaXN0cy5vc2RsLm9yZworTDoJdmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKIFM6CVN1cHBvcnRlZAogRjoJYXJjaC94ODYveGVuLwogRjoJZHJpdmVycy8qL3hlbi0qZnJvbnQuYwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA3NGIyNTU1Li42YTQ1NzY5IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMjI0LDYgKzIyNCw3IEBACiBlbmRpZgogCiBLQ09ORklHX0NPTkZJRwk/PSAuY29uZmlnCitleHBvcnQgS0NPTkZJR19DT05GSUcKIAogIyBTSEVMTCB1c2VkIGJ5IGtidWlsZAogQ09ORklHX1NIRUxMIDo9ICQoc2hlbGwgaWYgWyAteCAiJCRCQVNIIiBdOyB0aGVuIGVjaG8gJCRCQVNIOyBcCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW1hbi5oCmluZGV4IDk5YzU2ZDQuLjcyZGI5ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW1hbi5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vbW1hbi5oCkBAIC01Myw2ICs1Myw5IEBACiAjZGVmaW5lIE1BRFZfTUVSR0VBQkxFICAgMTIJCS8qIEtTTSBtYXkgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCiAjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMJCS8qIEtTTSBtYXkgbm90IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLwogCisjZGVmaW5lIE1BRFZfSFVHRVBBR0UJMTQJCS8qIFdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTE1CQkvKiBOb3Qgd29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworCiAvKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCiAjZGVmaW5lIE1BUF9GSUxFCTAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IDBmMWQ4NDkuLmMxZjNlN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTUwNiw3ICs1MDYsNyBAQAogCQlDTU9TX1dSSVRFKHJlYWxfc2Vjb25kcyxSVENfU0VDT05EUyk7CiAJCUNNT1NfV1JJVEUocmVhbF9taW51dGVzLFJUQ19NSU5VVEVTKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCXByaW50a19vbmNlKEtFUk5fTk9USUNFCiAJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKIAkJICAgICAgIGNtb3NfbWludXRlcywgcmVhbF9taW51dGVzKTsKICAJCXJldHZhbCA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jIGIvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCmluZGV4IDQyZmY5MGIuLjY2NWViZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYworKysgYi9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCiAvKgogICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIG5lZWRlZCBmb3IgRE1BIGJvdW5jaW5nLgotICogSVRFODE1MiBjaGlwIGNhbiBhZGRyZWVzIHVwIHRvIDY0TUJ5dGUsIHNvIGFsbCB0aGUgZGV2aWNlcworICogSVRFODE1MiBjaGlwIGNhbiBhZGRyZXNzIHVwIHRvIDY0TUJ5dGUsIHNvIGFsbCB0aGUgZGV2aWNlcwogICogY29ubmVjdGVkIHRvIElURTgxNTIgKFBDSSBhbmQgVVNCKSBzaG91bGQgaGF2ZSBsaW1pdGVkIERNQSB3aW5kb3cKICAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vdmljLmMgYi9hcmNoL2FybS9jb21tb24vdmljLmMKaW5kZXggYmE2NWY2ZS4uY2I2NjBiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3ZpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi92aWMuYwpAQCAtNzAsNyArNzAsNyBAQAogICogdmljX2luaXQyIC0gY29tbW9uIGluaXRpYWxpc2F0aW9uIGNvZGUKICAqIEBiYXNlOiBCYXNlIG9mIHRoZSBWSUMuCiAgKgotICogQ29tbW9uIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHJlZ2lzdGVyYXRpb24KKyAqIENvbW1vbiBpbml0aWFsaXNhdGlvbiBjb2RlIGZvciByZWdpc3RyYXRpb24KICAqIGFuZCByZXN1bWUuCiAqLwogc3RhdGljIHZvaWQgdmljX2luaXQyKHZvaWQgX19pb21lbSAqYmFzZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdTg1MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKaW5kZXggYmU4MGYwMy4uNTJkODZjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKQEAgLTksNiArOSwxMCBAQAogIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfVTg1MDA9eQorQ09ORklHX1VYNTAwX1NPQ19EQjU1MDA9eQorQ09ORklHX1VYNTAwX1NPQ19EQjg1MDA9eQorQ09ORklHX01BQ0hfVTg1MDA9eQorQ09ORklHX01BQ0hfVTU1MDA9eQogQ09ORklHX1NNUD15CiBDT05GSUdfTlJfQ1BVUz0yCiBDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMGMxYmI2OC4uMmNmZTgxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzgsMTcgKzM4LDkgQEAKICNpZmRlZiBDT05GSUdfTU1VCiB2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlpZiAoIXNpemUpCi0JCXJldHVybiBOVUxMOwotCi0JYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fQUxMT0MsIE1PRFVMRVNfVkFERFIsIE1PRFVMRVNfRU5EKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMX0VYRUMpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZV9yYW5nZShzaXplLCAxLCBNT0RVTEVTX1ZBRERSLCBNT0RVTEVTX0VORCwKKwkJCQlHRlBfS0VSTkVMLCBQQUdFX0tFUk5FTF9FWEVDLCAtMSwKKwkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogI2Vsc2UgLyogQ09ORklHX01NVSAqLwogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCmluZGV4IDdiNThjOTQuLmRlMmZkMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwpAQCAtMTI4LDE3ICsxMjgsMTcgQEAKIAkJLnBsYXRmb3JtX2RhdGEJPSAmbXlfZmxhc2gwX3BsYXRmb3JtLAogI2VuZGlmCiAJfSwKLQl7CS8qIFVzZXIgYWNjZXNzYWJsZSBzcGkgLSBjczEgKDI1MEtIeikgKi8KKwl7CS8qIFVzZXIgYWNjZXNzaWJsZSBzcGkgLSBjczEgKDI1MEtIeikgKi8KIAkJLm1vZGFsaWFzCT0gInNwaS1jczEiLAogCQkuY2hpcF9zZWxlY3QJPSAxLAogCQkubWF4X3NwZWVkX2h6CT0gMjUwICogMTAwMCwKIAl9LAotCXsJLyogVXNlciBhY2Nlc3NhYmxlIHNwaSAtIGNzMiAoMU1IeikgKi8KKwl7CS8qIFVzZXIgYWNjZXNzaWJsZSBzcGkgLSBjczIgKDFNSHopICovCiAJCS5tb2RhbGlhcwk9ICJzcGktY3MyIiwKIAkJLmNoaXBfc2VsZWN0CT0gMiwKIAkJLm1heF9zcGVlZF9oegk9IDEgKiAxMDAwICogMTAwMCwKIAl9LAotCXsJLyogVXNlciBhY2Nlc3NhYmxlIHNwaSAtIGNzMyAoMTBNSHopICovCisJewkvKiBVc2VyIGFjY2Vzc2libGUgc3BpIC0gY3MzICgxME1IeikgKi8KIAkJLm1vZGFsaWFzCT0gInNwaS1jczMiLAogCQkuY2hpcF9zZWxlY3QJPSAzLAogCQkubWF4X3NwZWVkX2h6CT0gMTAgKiAxMDAwICogMTAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9wbS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmMKaW5kZXggZGFmYmFjYy4uZWE1M2Y0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3BtLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYXQ5MV9wbV9vcHMgPXsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYXQ5MV9wbV9vcHMgPSB7CiAJLnZhbGlkCT0gYXQ5MV9wbV92YWxpZF9zdGF0ZSwKIAkuYmVnaW4JPSBhdDkxX3BtX2JlZ2luLAogCS5lbnRlcgk9IGF0OTFfcG1fZW50ZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY3NwL2NoaXBjL2NoaXBjSHcuYyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvY2hpcGMvY2hpcGNIdy5jCmluZGV4IGIzYTYxZDguLjk2MjczZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvY2hpcGMvY2hpcGNIdy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvY2hpcGMvY2hpcGNIdy5jCkBAIC03NTcsNyArNzU3LDcgQEAKIAkJdCA9IHQgPDwgMTsKIAl9CiAKLQkvKiBJbnRpYWxpemUgdGhlIHJlc3VsdCAqLworCS8qIEluaXRpYWxpemUgdGhlIHJlc3VsdCAqLwogCXIgPSAwOwogCiAJZG8gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NzcC9kbWFjL2RtYWNIdy5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NzcC9kbWFjL2RtYWNIdy5jCmluZGV4IDdiOWJhYzIuLjZiOWJlMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvZG1hYy9kbWFjSHcuYworKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY3NwL2RtYWMvZG1hY0h3LmMKQEAgLTg5Myw3ICs4OTMsNyBAQAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdWludDMyX3QgZG1hY0h3X2dldERtYUNvbnRyb2xsZXJBdHRyaWJ1dGUoZG1hY0h3X0hBTkRMRV90IGhhbmRsZSwJLyogIFsgSU4gXSAgRE1BIENoYW5uZWwgaGFuZGxlICovCi0JCQkJCSAgZG1hY0h3X0NPTlRST0xMRVJfQVRUUklCX2UgYXR0cgkvKiAgWyBJTiBdICBETUEgQ29udHJvbGVyIGF0dHJpYnV0ZSBvZiB0eXBlICBkbWFjSHdfQ09OVFJPTExFUl9BVFRSSUJfZSAqLworCQkJCQkgIGRtYWNId19DT05UUk9MTEVSX0FUVFJJQl9lIGF0dHIJLyogIFsgSU4gXSAgRE1BIENvbnRyb2xsZXIgYXR0cmlidXRlIG9mIHR5cGUgIGRtYWNId19DT05UUk9MTEVSX0FUVFJJQl9lICovCiAgICAgKSB7CiAJZG1hY0h3X0NCTEtfdCAqcENibGsgPSBkbWFjSHdfSEFORExFX1RPX0NCTEsoaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NzcC9kbWFjL2RtYWNId19leHRyYS5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NzcC9kbWFjL2RtYWNId19leHRyYS5jCmluZGV4IGZmN2I0MzYuLjc3Zjg0YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvZG1hYy9kbWFjSHdfZXh0cmEuYworKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY3NwL2RtYWMvZG1hY0h3X2V4dHJhLmMKQEAgLTMxNiw3ICszMTYsNyBAQAogLyoqCiAqICBAYnJpZWYgICBDaGVjayBpZiBETUEgY2hhbm5lbCBpcyB0aGUgZmxvdyBjb250cm9sbGVyCiAqCi0qICBAcmV0dXJuICAxIDogSWYgRE1BIGlzIGEgZmxvdyBjb250cm9sZXIKKyogIEByZXR1cm4gIDEgOiBJZiBETUEgaXMgYSBmbG93IGNvbnRyb2xsZXIKICogICAgICAgICAgIDAgOiBQZXJpcGhlcmFsIGlzIHRoZSBmbG93IGNvbnRyb2xsZXIKICoKICogIEBub3RlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY3NwL3Rtci90bXJIdy5jIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2NzcC90bXIvdG1ySHcuYwppbmRleCA1YzFjOWEwLi4xNjIyNWU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvY3NwL3Rtci90bXJIdy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9jc3AvdG1yL3Rtckh3LmMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQl0ID0gdCA8PCAxOwogCX0KIAotCS8qIEludGlhbGl6ZSB0aGUgcmVzdWx0ICovCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVzdWx0ICovCiAJciA9IDA7CiAKIAlkbyB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvZG1hLmMKaW5kZXggNzdlYjM1Yy4uOGQxYmFmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2RtYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9kbWEuYwpAQCAtNjcxLDcgKzY3MSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqCi0qICAgSW50aWFsaXplcyBhbGwgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIERNQS4KKyogICBJbml0aWFsaXplcyBhbGwgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIERNQS4KICogICBAcmV0dXJuCiAqICAgICAgID49IDAgICAgLSBJbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bGwuCiAqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvZG1hY0h3LmggYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvZG1hY0h3LmgKaW5kZXggNWQ1MTAxMy4uNmM4ZGEyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvY3NwL2RtYWNIdy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL2NzcC9kbWFjSHcuaApAQCAtNTkwLDcgKzU5MCw3IEBACiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1aW50MzJfdCBkbWFjSHdfZ2V0RG1hQ29udHJvbGxlckF0dHJpYnV0ZShkbWFjSHdfSEFORExFX3QgaGFuZGxlLAkvKiAgWyBJTiBdICBETUEgQ2hhbm5lbCBoYW5kbGUgICovCi0JCQkJCSAgZG1hY0h3X0NPTlRST0xMRVJfQVRUUklCX2UgYXR0cgkvKiAgWyBJTiBdICBETUEgQ29udHJvbGVyIGF0dHJpYnV0ZSBvZiB0eXBlICBkbWFjSHdfQ09OVFJPTExFUl9BVFRSSUJfZSAqLworCQkJCQkgIGRtYWNId19DT05UUk9MTEVSX0FUVFJJQl9lIGF0dHIJLyogIFsgSU4gXSAgRE1BIENvbnRyb2xsZXIgYXR0cmlidXRlIG9mIHR5cGUgIGRtYWNId19DT05UUk9MTEVSX0FUVFJJQl9lICovCiAgICAgKTsKIAogI2VuZGlmIC8qIF9ETUFDSFdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvY3NwL3Rtckh3LmggYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvdG1ySHcuaAppbmRleCBmMTIzNmQwLi4yY2JiNTMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvdG1ySHcuaAorKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9jc3AvdG1ySHcuaApAQCAtNzYsNyArNzYsNyBAQAogKiAgICAgICAgICAgY2VydGFpbiB0aW1lIGludGVydmFsCiAqCiAqICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgcGVyaW9kaWMgdGltZXIgdG8gZ2VuZXJhdGUgdGltZXIgaW50ZXJydXB0Ci0qICBhZnRlciBldmVyeSB0aW1lIGludGVydmFsIGluIG1pbGlzZWNvbmQKKyogIGFmdGVyIGV2ZXJ5IHRpbWUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmQKICoKICogIEByZXR1cm4gICBPbiBzdWNjZXNzOiBFZmZlY3RpdmUgaW50ZXJ2YWwgc2V0IGluIG1pbGktc2Vjb25kCiAqICAgICAgICAgICAgT24gZmFpbHVyZTogMApAQCAtOTMsNyArOTMsNyBAQAogKiAgICAgICAgICAgYWZ0ZXIgY2VydGFpbiB0aW1lIGludGVydmFsCiAqCiAqICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgcGVyaW9kaWMgdGltZXIgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgdGlja3MgYWZ0ZXIKLSogIGNlcnRhaW4gdGltZSBpbnRlcnZhbCBpbiBtaWxpc2Vjb25kCisqICBjZXJ0YWluIHRpbWUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmQKICoKICogIEByZXR1cm4gICBPbiBzdWNjZXNzOiBFZmZlY3RpdmUgaW50ZXJ2YWwgc2V0IGluIG1pbGktc2Vjb25kCiAqICAgICAgICAgICAgT24gZmFpbHVyZTogMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3ByaXYuaCBiL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvY3NwL2RtYWNId19wcml2LmgKaW5kZXggY2JmMzM0ZC4uZDY3ZTJmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3ByaXYuaAorKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2NzcC9kbWFjSHdfcHJpdi5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIC8qIERhdGEgdHlwZSBmb3IgRE1BIExpbmsgTGlzdCBJdGVtICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdWludDMyX3Qgc2FyOwkJLyogU291cmNlIEFkcmVzcyBSZWdpc3Rlci4KKwl1aW50MzJfdCBzYXI7CQkvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3Rlci4KIAkJCQkgICBBZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byBDVEx4LlNSQ19UUl9XSURUSC4gICAgICAgICAgICAgKi8KIAl1aW50MzJfdCBkYXI7CQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIFJlZ2lzdGVyLgogCQkJCSAgIEFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIENUTHguRFNUX1RSX1dJRFRILiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3JlZy5oIGIvYXJjaC9hcm0vbWFjaC1iY21yaW5nL2luY2x1ZGUvbWFjaC9jc3AvZG1hY0h3X3JlZy5oCmluZGV4IDg5MWNlYTguLmYxZWNmOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYmNtcmluZy9pbmNsdWRlL21hY2gvY3NwL2RtYWNId19yZWcuaAorKysgYi9hcmNoL2FybS9tYWNoLWJjbXJpbmcvaW5jbHVkZS9tYWNoL2NzcC9kbWFjSHdfcmVnLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAogLyogRGF0YSB0eXBlIHJlcHJlc2VudGluZyBETUEgY2hhbm5lbCByZWdpc3RlcnMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlkbWFjSHdfUkVHNjRfdCBDaGFubmVsU2FyOwkvKiAgU291cmNlIEFkcmVzcyBSZWdpc3Rlci4gNjQgYml0cyAodXBwZXIgMzIgYml0cyBhcmUgcmVzZXJ2ZWQpCisJZG1hY0h3X1JFRzY0X3QgQ2hhbm5lbFNhcjsJLyogIFNvdXJjZSBBZGRyZXNzIFJlZ2lzdGVyLiA2NCBiaXRzICh1cHBlciAzMiBiaXRzIGFyZSByZXNlcnZlZCkKIAkJCQkJICAgQWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gQ1RMeC5TUkNfVFJfV0lEVEguCiAJCQkJCSAqLwogCWRtYWNId19SRUc2NF90IENoYW5uZWxEYXI7CS8qICBEZXN0aW5hdGlvbiBBZGRyZXNzIFJlZ2lzdGVyLjY0IGJpdHMgKHVwcGVyIDMyIGJpdHMgYXJlIHJlc2VydmVkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvcG0uYwppbmRleCBmYWI5NTNiLi4xYmQ3M2EwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BtLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgZGF2aW5jaV9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGRhdmluY2lfcG1fb3BzID0gewogCS5lbnRlcgkJPSBkYXZpbmNpX3BtX2VudGVyLAogCS52YWxpZAkJPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uYwppbmRleCBmN2ExMjU4Li5mZTYyN2FiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL2NvbW1vbi5jCkBAIC03NzAsNyArNzcwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRvdmVfc2RpbzAgPSB7Ci0JLm5hbWUJCT0gInNkaGNpLW12IiwKKwkubmFtZQkJPSAic2RoY2ktZG92ZSIsCiAJLmlkCQk9IDAsCiAJLmRldgkJPSB7CiAJCS5kbWFfbWFzawkJPSAmc2Rpb19kbWFtYXNrLApAQCAtNzk4LDcgKzc5OCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkb3ZlX3NkaW8xID0gewotCS5uYW1lCQk9ICJzZGhjaS1tdiIsCisJLm5hbWUJCT0gInNkaGNpLWRvdmUiLAogCS5pZAkJPSAxLAogCS5kZXYJCT0gewogCQkuZG1hX21hc2sJCT0gJnNkaW9fZG1hbWFzaywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZ2VtaW5pL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggMjEzYTRmYy4uOGM5NTBlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1nZW1pbmkvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgR0VNSU5JX0xQQ19IT1NUX0JBU0UJMHg0NzAwMDAwMAogI2RlZmluZSBHRU1JTklfTFBDX0lPX0JBU0UJMHg0NzgwMDAwMAogI2RlZmluZSBHRU1JTklfSU5URVJSVVBUX0JBU0UJMHg0ODAwMDAwMAotLyogVE9ETzogRGlmZmVyZW50IGludGVycnVwdCBjb250cm9sZXJzIHdoZW4gU01QCisvKiBUT0RPOiBEaWZmZXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXJzIHdoZW4gU01QCiAgKiAjZGVmaW5lIEdFTUlOSV9JTlRFUlJVUFQwX0JBU0UJMHg0ODAwMDAwMAogICogI2RlZmluZSBHRU1JTklfSU5URVJSVVBUMV9CQVNFCTB4NDkwMDAwMDAKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM4LmMKaW5kZXggZjY2N2EyNi4uNTA1NjE0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzguYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzOC5jCkBAIC0yNTQsMTAgKzI1NCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSBwY20wMzhfcmVndWxhdG9yc1tdID0gewogCXsKLQkJLmlkID0gTUMxMzc4M19SRUdVX1ZDQU0sCisJCS5pZCA9IE1DMTM3ODNfUkVHX1ZDQU0sCiAJCS5pbml0X2RhdGEgPSAmY2FtX2RhdGEsCiAJfSwgewotCQkuaWQgPSBNQzEzNzgzX1JFR1VfVk1NQzEsCisJCS5pZCA9IE1DMTM3ODNfUkVHX1ZNTUMxLAogCQkuaW5pdF9kYXRhID0gJnNkaGMxX2RhdGEsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14MjcuYwppbmRleCA2YmY4MWNlLi5hY2YxNzY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXgyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDI3LmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBteDI3X3N1c3BlbmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBteDI3X3N1c3BlbmRfb3BzID0gewogCS5lbnRlciA9IG14Mjdfc3VzcGVuZF9lbnRlciwKIAkudmFsaWQgPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL29wZW5yZC1zZXR1cC5jCmluZGV4IGM5ZDc3ZmEuLmNmY2NhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2Qvb3BlbnJkLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9vcGVucmQtc2V0dXAuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAKIAlraXJrd29vZF9pMmNfaW5pdCgpOwogCi0JaWYgKG1hY2hpbmVfaXNfb3BlbnJkX2NsaWVudCgpKSB7CisJaWYgKG1hY2hpbmVfaXNfb3BlbnJkX2NsaWVudCgpIHx8IG1hY2hpbmVfaXNfb3BlbnJkX3VsdGltYXRlKCkpIHsKIAkJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaTJjX2JvYXJkX2luZm8sCiAJCQlBUlJBWV9TSVpFKGkyY19ib2FyZF9pbmZvKSk7CiAJCWtpcmt3b29kX2F1ZGlvX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbHBjMzJ4eC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BtLmMKaW5kZXggYTZlMmFlZC4uZTc2ZDQxYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1scGMzMnh4L3BtLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGxwYzMyeHhfcG1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBscGMzMnh4X3BtX29wcyA9IHsKIAkudmFsaWQJPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogCS5lbnRlcgk9IGxwYzMyeHhfcG1fZW50ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKaW5kZXggZmFlOTMxYS4uNWQzZDlhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCkBAIC00MCwxMSArNDAsMTMgQEAKIAlib29sICJNU004WDYwIgogCXNlbGVjdCBNQUNIX01TTThYNjBfU1VSRiBpZiAoIU1BQ0hfTVNNOFg2MF9SVU1JMyAmJiAhTUFDSF9NU004WDYwX1NJTSBcCiAJCQkJICAmJiAhTUFDSF9NU004WDYwX0ZGQSkKKwlzZWxlY3QgQVJDSF9NU01fU0NPUlBJT05NUAogCXNlbGVjdCBBUk1fR0lDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBNU01fVjJfVExNTQogCXNlbGVjdCBNU01fR1BJT01VWAogCXNlbGVjdCBJT01NVV9BUEkKKwlzZWxlY3QgTVNNX1NDTSBpZiBTTVAKIAogZW5kY2hvaWNlCiAKQEAgLTE3Miw0ICsxNzQsNyBAQAogCiBjb25maWcgSU9NTVVfQVBJCiAJYm9vbAorCitjb25maWcgTVNNX1NDTQorCWJvb2wKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCmluZGV4IDU5NjQ2YmIuLjk0MTk1YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlCkBAIC0xOCw2ICsxOCwxMCBAQAogb2JqLSQoQ09ORklHX0FSQ0hfUVNEOFg1MCkgKz0gc2lyYy5vCiBvYmotJChDT05GSUdfTVNNX1NNRCkgKz0gc21kLm8gc21kX2RlYnVnLm8KIG9iai0kKENPTkZJR19NU01fU01EKSArPSBsYXN0X3JhZGlvX2xvZy5vCitvYmotJChDT05GSUdfTVNNX1NDTSkgKz0gc2NtLm8gc2NtLWJvb3QubworCitvYmotJChDT05GSUdfSE9UUExVR19DUFUpICs9IGhvdHBsdWcubworb2JqLSQoQ09ORklHX1NNUCkgKz0gaGVhZHNtcC5vIHBsYXRzbXAubwogCiBvYmotJChDT05GSUdfTUFDSF9UUk9VVCkgKz0gYm9hcmQtdHJvdXQubyBib2FyZC10cm91dC1ncGlvLm8gYm9hcmQtdHJvdXQtbW1jLm8gZGV2aWNlcy1tc203eDAwLm8KIG9iai0kKENPTkZJR19NQUNIX1RST1VUKSArPSBib2FyZC10cm91dC5vIGJvYXJkLXRyb3V0LWdwaW8ubyBib2FyZC10cm91dC1tbWMubyBib2FyZC10cm91dC1wYW5lbC5vIGRldmljZXMtbXNtN3gwMC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9oZWFkc21wLlMgYi9hcmNoL2FybS9tYWNoLW1zbS9oZWFkc21wLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjMjE0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2hlYWRzbXAuUwpAQCAtMCwwICsxLDQwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaGVhZHNtcC5TCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBBUk0gTGltaXRlZAorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworCV9fSU5JVAorCisvKgorICogTVNNIHNwZWNpZmljIGVudHJ5IHBvaW50IGZvciBzZWNvbmRhcnkgQ1BVcy4gIFRoaXMgcHJvdmlkZXMKKyAqIGEgImhvbGRpbmcgcGVuIiBpbnRvIHdoaWNoIGFsbCBzZWNvbmRhcnkgY29yZXMgYXJlIGhlbGQgdW50aWwgd2UncmUKKyAqIHJlYWR5IGZvciB0aGVtIHRvIGluaXRpYWxpc2UuCisgKi8KK0VOVFJZKG1zbV9zZWNvbmRhcnlfc3RhcnR1cCkKKwltcmMJcDE1LCAwLCByMCwgYzAsIGMwLCA1CisJYW5kCXIwLCByMCwgIzE1CisJYWRyCXI0LCAxZgorCWxkbWlhCXI0LCB7cjUsIHI2fQorCXN1YglyNCwgcjQsIHI1CisJYWRkCXI2LCByNiwgcjQKK3BlbjoJbGRyCXI3LCBbcjZdCisJY21wCXI3LCByMAorCWJuZQlwZW4KKworCS8qCisJICogd2UndmUgYmVlbiByZWxlYXNlZCBmcm9tIHRoZSBob2xkaW5nIHBlbjogc2Vjb25kYXJ5X3N0YWNrCisJICogc2hvdWxkIG5vdyBjb250YWluIHRoZSBTVkMgc3RhY2sgZm9yIHRoaXMgY29yZQorCSAqLworCWIJc2Vjb25kYXJ5X3N0YXJ0dXAKKworCS5hbGlnbgorMToJLmxvbmcJLgorCS5sb25nCXBlbl9yZWxlYXNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ob3RwbHVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzMWY3MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKK2V4dGVybiB2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2U7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfZW50ZXJfbG93cG93ZXIodm9pZCkKK3sKKwkvKiBKdXN0IGZsdXNoIHRoZSBjYWNoZS4gQ2hhbmdpbmcgdGhlIGNvaGVyZW5jeSBpcyBub3QgeWV0CisJICogYXZhaWxhYmxlIG9uIG1zbS4gKi8KKwlmbHVzaF9jYWNoZV9hbGwoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9sZWF2ZV9sb3dwb3dlcih2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdGZvcm1fZG9fbG93cG93ZXIodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKiBKdXN0IGVudGVyIHdmaSBmb3Igbm93LiBUT0RPOiBQcm9wZXJseSBzaHV0IG9mZiB0aGUgY3B1LiAqLworCWZvciAoOzspIHsKKwkJLyoKKwkJICogaGVyZSdzIHRoZSBXRkkKKwkJICovCisJCWFzbSgid2ZpIgorCQkgICAgOgorCQkgICAgOgorCQkgICAgOiAibWVtb3J5IiwgImNjIik7CisKKwkJaWYgKHBlbl9yZWxlYXNlID09IGNwdSkgeworCQkJLyoKKwkJCSAqIE9LLCBwcm9wZXIgd2FrZXVwLCB3ZSdyZSBkb25lCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogZ2V0dGluZyBoZXJlLCBtZWFucyB0aGF0IHdlIGhhdmUgY29tZSBvdXQgb2YgV0ZJIHdpdGhvdXQKKwkJICogaGF2aW5nIGJlZW4gd29rZW4gdXAgLSB0aGlzIHNob3VsZG4ndCBoYXBwZW4KKwkJICoKKwkJICogVGhlIHRyb3VibGUgaXMsIGxldHRpbmcgcGVvcGxlIGtub3cgYWJvdXQgdGhpcyBpcyBub3QgcmVhbGx5CisJCSAqIHBvc3NpYmxlLCBzaW5jZSB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW5jb2hlcmVudGx5LCBhbmQKKwkJICogdGhlcmVmb3JlIGNhbm5vdCBzYWZlbHkgY2FsbCBwcmludGsoKSBvciBhbnl0aGluZyBlbHNlCisJCSAqLworCQlwcl9kZWJ1ZygiQ1BVJXU6IHNwdXJpb3VzIHdha2V1cCBjYWxsXG4iLCBjcHUpOworCX0KK30KKworaW50IHBsYXRmb3JtX2NwdV9raWxsKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBwbGF0Zm9ybS1zcGVjaWZpYyBjb2RlIHRvIHNodXRkb3duIGEgQ1BVCisgKgorICogQ2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZAorICovCit2b2lkIHBsYXRmb3JtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIHdlJ3JlIHJlYWR5IGZvciBzaHV0ZG93biBub3csIHNvIGRvIGl0CisJICovCisJY3B1X2VudGVyX2xvd3Bvd2VyKCk7CisJcGxhdGZvcm1fZG9fbG93cG93ZXIoY3B1KTsKKworCS8qCisJICogYnJpbmcgdGhpcyBDUFUgYmFjayBpbnRvIHRoZSB3b3JsZCBvZiBjYWNoZQorCSAqIGNvaGVyZW5jeSwgYW5kIHRoZW4gcmVzdG9yZSBpbnRlcnJ1cHRzCisJICovCisJY3B1X2xlYXZlX2xvd3Bvd2VyKCk7Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qCisJICogd2UgZG9uJ3QgYWxsb3cgQ1BVIDAgdG8gYmUgc2h1dGRvd24gKGl0IGlzIHN0aWxsIHRvbyBzcGVjaWFsCisJICogZS5nLiBjbG9jayB0aWNrIGludGVycnVwdHMpCisJICovCisJcmV0dXJuIGNwdSA9PSAwID8gLUVQRVJNIDogMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby1xZ2ljLlMgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8tcWdpYy5TCmluZGV4IDRkYzk5YWEuLjEyNDY3MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby1xZ2ljLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLXFnaWMuUwpAQCAtMjYsNyArMjYsNyBAQAogCSAqIFRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZSBpcyBkZWZpbmVkIGluIHRoZQogCSAqIGludGVycnVwdCBjb250cm9sbGVyIHNwZWMuICBUbyB3aXQ6CiAJICoKLQkgKiBNaWdyYXRlZCB0aGUgY29kZSBmcm9tIEFSTSBNUCBwb3J0IHRvIGJlIG1vcmUgY29uc2lzdGFudAorCSAqIE1pZ3JhdGVkIHRoZSBjb2RlIGZyb20gQVJNIE1QIHBvcnQgdG8gYmUgbW9yZSBjb25zaXN0ZW50CiAJICogd2l0aCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAsIHRoZSBmb2xsb3dpbmcgc3RpbGwgaG9sZHMgdHJ1ZQogCSAqIGhvd2V2ZXIsIGFsbCBpbnRlcnJ1cHRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YKIAkgKiBpZiB0aGV5IGFyZSBsb2NhbCBJUEkgb3IgUFBJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NjAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCmluZGV4IDdjNDNhOWIuLmE1NGUzM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg2MC5oCkBAIC02MCw3ICs2MCwxMSBAQAogCiAjZGVmaW5lIE1TTV9UTVJfQkFTRQkJSU9NRU0oMHhGMDIwMDAwMCkKICNkZWZpbmUgTVNNX1RNUl9QSFlTCQkweDAyMDAwMDAwCi0jZGVmaW5lIE1TTV9UTVJfU0laRQkJKFNaXzFNKQorI2RlZmluZSBNU01fVE1SX1NJWkUJCVNaXzRLCisKKyNkZWZpbmUgTVNNX1RNUjBfQkFTRQkJSU9NRU0oMHhGMDIwMTAwMCkKKyNkZWZpbmUgTVNNX1RNUjBfUEhZUwkJMHgwMjA0MDAwMAorI2RlZmluZSBNU01fVE1SMF9TSVpFCQlTWl80SwogCiAjZGVmaW5lIE1TTV9HUFRfQkFTRQkJKE1TTV9UTVJfQkFTRSArIDB4NCkKICNkZWZpbmUgTVNNX0RHVF9CQVNFCQkoTVNNX1RNUl9CQVNFICsgMHgyNCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCmluZGV4IGY5MTJkN2IuLjEyNjAwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwpAQCAtMTA1LDYgKzEwNSw3IEBACiAJTVNNX0RFVklDRShRR0lDX0RJU1QpLAogCU1TTV9ERVZJQ0UoUUdJQ19DUFUpLAogCU1TTV9ERVZJQ0UoVE1SKSwKKwlNU01fREVWSUNFKFRNUjApLAogCU1TTV9ERVZJQ0UoQUNDKSwKIAlNU01fREVWSUNFKEdDQyksCiB9OwpAQCAtMTUzLDcgKzE1NCw3IEBACiB7CiAJaWYgKG10eXBlID09IE1UX0RFVklDRSkgewogCQkvKiBUaGUgcGVyaXBoZXJhbHMgaW4gdGhlIDg4MDAwMDAwIC0gRDAwMDAwMDAgcmFuZ2UKLQkJICogYXJlIG9ubHkgYWNjZXNzYWJsZSBieSB0eXBlIE1UX0RFVklDRV9OT05TSEFSRUQuCisJCSAqIGFyZSBvbmx5IGFjY2Vzc2libGUgYnkgdHlwZSBNVF9ERVZJQ0VfTk9OU0hBUkVELgogCQkgKiBBZGp1c3QgbXR5cGUgYXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcyAianVzdCB3b3JrLiIKIAkJICovCiAJCWlmICgocGh5c19hZGRyID49IDB4ODgwMDAwMDApICYmIChwaHlzX2FkZHIgPCAweEQwMDAwMDAwKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyN2JjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworI2luY2x1ZGUgInNjbS1ib290LmgiCisKKyNkZWZpbmUgVkREX1NDMV9BUlJBWV9DTEFNUF9HRlNfQ1RMIDB4MTVBMAorI2RlZmluZSBTQ1NTX0NQVTFDT1JFX1JFU0VUIDB4RDgwCisjZGVmaW5lIFNDU1NfREJHX1NUQVRVU19DT1JFX1BXUkRVUCAweEU2NAorCisvKiBNYXNrIGZvciBlZGdlIHRyaWdnZXIgUFBJcyBleGNlcHQgQVZTX1NWSUNJTlQgYW5kIEFWU19TVklDSU5UU1dET05FICovCisjZGVmaW5lIEdJQ19QUElfRURHRV9NQVNLIDB4RkZGRkQ3RkYKKworZXh0ZXJuIHZvaWQgbXNtX3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOworLyoKKyAqIGNvbnRyb2wgZm9yIHdoaWNoIGNvcmUgaXMgdGhlIG5leHQgdG8gY29tZSBvdXQgb2YgdGhlIHNlY29uZGFyeQorICogYm9vdCAiaG9sZGluZyBwZW4iLgorICovCit2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2UgPSAtMTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOworCit2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIENvbmZpZ3VyZSBlZGdlLXRyaWdnZXJlZCBQUElzICovCisJd3JpdGVsKEdJQ19QUElfRURHRV9NQVNLLCBNU01fUUdJQ19ESVNUX0JBU0UgKyBHSUNfRElTVF9DT05GSUcgKyA0KTsKKworCS8qCisJICogaWYgYW55IGludGVycnVwdHMgYXJlIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhlIHByaW1hcnkKKwkgKiBjb3JlIChlLmcuIHRpbWVyIGlycSksIHRoZW4gdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gZW5hYmxlZAorCSAqIGZvciB1czogZG8gc28KKwkgKi8KKwlnaWNfc2Vjb25kYXJ5X2luaXQoMCk7CisKKwkvKgorCSAqIGxldCB0aGUgcHJpbWFyeSBwcm9jZXNzb3Iga25vdyB3ZSdyZSBvdXQgb2YgdGhlCisJICogcGVuLCB0aGVuIGhlYWQgb2ZmIGludG8gdGhlIEMgZW50cnkgcG9pbnQKKwkgKi8KKwlwZW5fcmVsZWFzZSA9IC0xOworCXNtcF93bWIoKTsKKworCS8qCisJICogU3luY2hyb25pc2Ugd2l0aCB0aGUgYm9vdCB0aHJlYWQuCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworfQorCitzdGF0aWMgX19jcHVpbml0IHZvaWQgcHJlcGFyZV9jb2xkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCByZXQ7CisJcmV0ID0gc2NtX3NldF9ib290X2FkZHIodmlydF90b19waHlzKG1zbV9zZWNvbmRhcnlfc3RhcnR1cCksCisJCQkJU0NNX0ZMQUdfQ09MREJPT1RfQ1BVMSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXZvaWQgKnNjMV9iYXNlX3B0cjsKKwkJc2MxX2Jhc2VfcHRyID0gaW9yZW1hcF9ub2NhY2hlKDB4MDA5MDIwMDAsIFNaXzRLKjIpOworCQlpZiAoc2MxX2Jhc2VfcHRyKSB7CisJCQl3cml0ZWwoMCwgc2MxX2Jhc2VfcHRyICsgVkREX1NDMV9BUlJBWV9DTEFNUF9HRlNfQ1RMKTsKKwkJCXdyaXRlbCgwLCBzYzFfYmFzZV9wdHIgKyBTQ1NTX0NQVTFDT1JFX1JFU0VUKTsKKwkJCXdyaXRlbCgzLCBzYzFfYmFzZV9wdHIgKyBTQ1NTX0RCR19TVEFUVVNfQ09SRV9QV1JEVVApOworCQkJaW91bm1hcChzYzFfYmFzZV9wdHIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJGYWlsZWQgdG8gc2V0IHNlY29uZGFyeSBjb3JlIGJvb3QgIgorCQkJCSAgImFkZHJlc3NcbiIpOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RhdGljIGludCBjb2xkX2Jvb3RfZG9uZTsKKworCS8qIE9ubHkgbmVlZCB0byBicmluZyBjcHUgb3V0IG9mIHJlc2V0IHRoaXMgd2F5IG9uY2UgKi8KKwlpZiAoY29sZF9ib290X2RvbmUgPT0gZmFsc2UpIHsKKwkJcHJlcGFyZV9jb2xkX2NwdShjcHUpOworCQljb2xkX2Jvb3RfZG9uZSA9IHRydWU7CisJfQorCisJLyoKKwkgKiBzZXQgc3luY2hyb25pc2F0aW9uIHN0YXRlIGJldHdlZW4gdGhpcyBib290IHByb2Nlc3NvcgorCSAqIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZQorCSAqLworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKworCS8qCisJICogVGhlIHNlY29uZGFyeSBwcm9jZXNzb3IgaXMgd2FpdGluZyB0byBiZSByZWxlYXNlZCBmcm9tCisJICogdGhlIGhvbGRpbmcgcGVuIC0gcmVsZWFzZSBpdCwgdGhlbiB3YWl0IGZvciBpdCB0byBmbGFnCisJICogdGhhdCBpdCBoYXMgYmVlbiByZWxlYXNlZCBieSByZXNldHRpbmcgcGVuX3JlbGVhc2UuCisJICoKKwkgKiBOb3RlIHRoYXQgInBlbl9yZWxlYXNlIiBpcyB0aGUgaGFyZHdhcmUgQ1BVIElELCB3aGVyZWFzCisJICogImNwdSIgaXMgTGludXgncyBpbnRlcm5hbCBJRC4KKwkgKi8KKwlwZW5fcmVsZWFzZSA9IGNwdTsKKwlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKikmcGVuX3JlbGVhc2UsIHNpemVvZihwZW5fcmVsZWFzZSkpOworCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7CisKKwkvKgorCSAqIFNlbmQgdGhlIHNlY29uZGFyeSBDUFUgYSBzb2Z0IGludGVycnVwdCwgdGhlcmVieSBjYXVzaW5nCisJICogdGhlIGJvb3QgbW9uaXRvciB0byByZWFkIHRoZSBzeXN0ZW0gd2lkZSBmbGFncyByZWdpc3RlciwKKwkgKiBhbmQgYnJhbmNoIHRvIHRoZSBhZGRyZXNzIGZvdW5kIHRoZXJlLgorCSAqLworCXNtcF9jcm9zc19jYWxsKGNwdW1hc2tfb2YoY3B1KSwgMSk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArICgxICogSFopOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlzbXBfcm1iKCk7CisJCWlmIChwZW5fcmVsZWFzZSA9PSAtMSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJLyoKKwkgKiBub3cgdGhlIHNlY29uZGFyeSBjb3JlIGlzIHN0YXJ0aW5nIHVwIGxldCBpdCBydW4gaXRzCisJICogY2FsaWJyYXRpb25zLCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorCSAqLworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworCisJcmV0dXJuIHBlbl9yZWxlYXNlICE9IC0xID8gLUVOT1NZUyA6IDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBDUFUgcG9zc2libGUgbWFwIGVhcmx5IC0gdGhpcyBkZXNjcmliZXMgdGhlIENQVXMKKyAqIHdoaWNoIG1heSBiZSBwcmVzZW50IG9yIGJlY29tZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIFRoZSBtc204eDYwCisgKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBUk0gU0NVLCBzbyBqdXN0IHNldCB0aGUgcG9zc2libGUgY3B1IG1hc2sgdG8KKyAqIE5SX0NQVVMuCisgKi8KK3ZvaWQgX19pbml0IHNtcF9pbml0X2NwdXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hcCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZXQgb2YgQ1BVcworCSAqIGFjdHVhbGx5IHBvcHVsYXRlZCBhdCB0aGUgcHJlc2VudCB0aW1lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQorCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9zY20tYm9vdC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWNlZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuYwpAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgInNjbS5oIgorI2luY2x1ZGUgInNjbS1ib290LmgiCisKKy8qCisgKiBTZXQgdGhlIGNvbGQvd2FybSBib290IGFkZHJlc3MgZm9yIG9uZSBvZiB0aGUgQ1BVIGNvcmVzLgorICovCitpbnQgc2NtX3NldF9ib290X2FkZHIocGh5c19hZGRyX3QgYWRkciwgaW50IGZsYWdzKQoreworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJcGh5c19hZGRyX3QgIGFkZHI7CisJfSBjbWQ7CisKKwljbWQuYWRkciA9IGFkZHI7CisJY21kLmZsYWdzID0gZmxhZ3M7CisJcmV0dXJuIHNjbV9jYWxsKFNDTV9TVkNfQk9PVCwgU0NNX0JPT1RfQUREUiwKKwkJCSZjbWQsIHNpemVvZihjbWQpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woc2NtX3NldF9ib290X2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS1ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmOWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS1ib290LmgKQEAgLTAsMCArMSwzOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX01BQ0hfU0NNX0JPT1RfSAorI2RlZmluZSBfX01BQ0hfU0NNX0JPT1RfSAorCisjZGVmaW5lIFNDTV9CT09UX0FERFIJCQkweDEKKyNkZWZpbmUgU0NNX0ZMQUdfQ09MREJPT1RfQ1BVMQkJMHgxCisjZGVmaW5lIFNDTV9GTEFHX1dBUk1CT09UX0NQVTEJCTB4MgorI2RlZmluZSBTQ01fRkxBR19XQVJNQk9PVF9DUFUwCQkweDQKKworaW50IHNjbV9zZXRfYm9vdF9hZGRyKHBoeXNfYWRkcl90IGFkZHIsIGludCBmbGFncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI5YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgInNjbS5oIgorCisvKiBDYWNoZSBsaW5lIHNpemUgZm9yIG1zbTh4NjAgKi8KKyNkZWZpbmUgQ0FDSEVMSU5FU0laRSAzMgorCisjZGVmaW5lIFNDTV9FTk9NRU0JCS01CisjZGVmaW5lIFNDTV9FT1BOT1RTVVBQCQktNAorI2RlZmluZSBTQ01fRUlOVkFMX0FERFIJCS0zCisjZGVmaW5lIFNDTV9FSU5WQUxfQVJHCQktMgorI2RlZmluZSBTQ01fRVJST1IJCS0xCisjZGVmaW5lIFNDTV9JTlRFUlJVUFRFRAkJMQorCitzdGF0aWMgREVGSU5FX01VVEVYKHNjbV9sb2NrKTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NtX2NvbW1hbmQgLSBvbmUgU0NNIGNvbW1hbmQgYnVmZmVyCisgKiBAbGVuOiB0b3RhbCBhdmFpbGFibGUgbWVtb3J5IGZvciBjb21tYW5kIGFuZCByZXNwb25zZQorICogQGJ1Zl9vZmZzZXQ6IHN0YXJ0IG9mIGNvbW1hbmQgYnVmZmVyCisgKiBAcmVzcF9oZHJfb2Zmc2V0OiBzdGFydCBvZiByZXNwb25zZSBidWZmZXIKKyAqIEBpZDogY29tbWFuZCB0byBiZSBleGVjdXRlZAorICogQGJ1ZjogYnVmZmVyIHJldHVybmVkIGZyb20gc2NtX2dldF9jb21tYW5kX2J1ZmZlcigpCisgKgorICogQW4gU0NNIGNvbW1hbmQgaXMgbGF5ZWQgb3V0IGluIG1lbW9yeSBhcyBmb2xsb3dzOgorICoKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzdHJ1Y3Qgc2NtX2NvbW1hbmQKKyAqCXwgY29tbWFuZCBoZWFkZXIgIHwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzY21fZ2V0X2NvbW1hbmRfYnVmZmVyKCkKKyAqCXwgY29tbWFuZCBidWZmZXIgIHwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzdHJ1Y3Qgc2NtX3Jlc3BvbnNlIGFuZAorICoJfCByZXNwb25zZSBoZWFkZXIgfCAgICAgIHNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKCkKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcigpCisgKgl8IHJlc3BvbnNlIGJ1ZmZlciB8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlcmUgY2FuIGJlIGFyYml0cmFyeSBwYWRkaW5nIGJldHdlZW4gdGhlIGhlYWRlcnMgYW5kIGJ1ZmZlcnMgc28KKyAqIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2NtX2dldF8qX2J1ZmZlcigpIHJvdXRpbmVzCisgKiB0byBhY2Nlc3MgdGhlIGJ1ZmZlcnMgaW4gYSBzYWZlIG1hbm5lci4KKyAqLworc3RydWN0IHNjbV9jb21tYW5kIHsKKwl1MzIJbGVuOworCXUzMglidWZfb2Zmc2V0OworCXUzMglyZXNwX2hkcl9vZmZzZXQ7CisJdTMyCWlkOworCXUzMglidWZbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzY21fcmVzcG9uc2UgLSBvbmUgU0NNIHJlc3BvbnNlIGJ1ZmZlcgorICogQGxlbjogdG90YWwgYXZhaWxhYmxlIG1lbW9yeSBmb3IgcmVzcG9uc2UKKyAqIEBidWZfb2Zmc2V0OiBzdGFydCBvZiByZXNwb25zZSBkYXRhIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHNjbV9yZXNwb25zZQorICogQGlzX2NvbXBsZXRlOiBpbmRpY2F0ZXMgaWYgdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIHByb2Nlc3NpbmcKKyAqLworc3RydWN0IHNjbV9yZXNwb25zZSB7CisJdTMyCWxlbjsKKwl1MzIJYnVmX29mZnNldDsKKwl1MzIJaXNfY29tcGxldGU7Cit9OworCisvKioKKyAqIGFsbG9jX3NjbV9jb21tYW5kKCkgLSBBbGxvY2F0ZSBhbiBTQ00gY29tbWFuZAorICogQGNtZF9zaXplOiBzaXplIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcgorICogQHJlc3Bfc2l6ZTogc2l6ZSBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQWxsb2NhdGUgYW4gU0NNIGNvbW1hbmQsIGluY2x1ZGluZyBlbm91Z2ggcm9vbSBmb3IgdGhlIGNvbW1hbmQKKyAqIGFuZCByZXNwb25zZSBoZWFkZXJzIGFzIHdlbGwgYXMgdGhlIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGJ1ZmZlcnMuCisgKgorICogUmV0dXJucyBhIHZhbGlkICZzY21fY29tbWFuZCBvbiBzdWNjZXNzIG9yICVOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICovCitzdGF0aWMgc3RydWN0IHNjbV9jb21tYW5kICphbGxvY19zY21fY29tbWFuZChzaXplX3QgY21kX3NpemUsIHNpemVfdCByZXNwX3NpemUpCit7CisJc3RydWN0IHNjbV9jb21tYW5kICpjbWQ7CisJc2l6ZV90IGxlbiA9IHNpemVvZigqY21kKSArIHNpemVvZihzdHJ1Y3Qgc2NtX3Jlc3BvbnNlKSArIGNtZF9zaXplICsKKwkJcmVzcF9zaXplOworCisJY21kID0ga3phbGxvYyhQQUdFX0FMSUdOKGxlbiksIEdGUF9LRVJORUwpOworCWlmIChjbWQpIHsKKwkJY21kLT5sZW4gPSBsZW47CisJCWNtZC0+YnVmX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY21fY29tbWFuZCwgYnVmKTsKKwkJY21kLT5yZXNwX2hkcl9vZmZzZXQgPSBjbWQtPmJ1Zl9vZmZzZXQgKyBjbWRfc2l6ZTsKKwl9CisJcmV0dXJuIGNtZDsKK30KKworLyoqCisgKiBmcmVlX3NjbV9jb21tYW5kKCkgLSBGcmVlIGFuIFNDTSBjb21tYW5kCisgKiBAY21kOiBjb21tYW5kIHRvIGZyZWUKKyAqCisgKiBGcmVlIGFuIFNDTSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zY21fY29tbWFuZChzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlrZnJlZShjbWQpOworfQorCisvKioKKyAqIHNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKCkgLSBHZXQgYSBwb2ludGVyIHRvIGEgc2NtX3Jlc3BvbnNlCisgKiBAY21kOiBjb21tYW5kCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBmb3IgYSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY21fcmVzcG9uc2UgKnNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKAorCQljb25zdCBzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlyZXR1cm4gKHZvaWQgKiljbWQgKyBjbWQtPnJlc3BfaGRyX29mZnNldDsKK30KKworLyoqCisgKiBzY21fZ2V0X2NvbW1hbmRfYnVmZmVyKCkgLSBHZXQgYSBwb2ludGVyIHRvIGEgY29tbWFuZCBidWZmZXIKKyAqIEBjbWQ6IGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBidWZmZXIgb2YgYSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnNjbV9nZXRfY29tbWFuZF9idWZmZXIoY29uc3Qgc3RydWN0IHNjbV9jb21tYW5kICpjbWQpCit7CisJcmV0dXJuICh2b2lkICopY21kLT5idWY7Cit9CisKKy8qKgorICogc2NtX2dldF9yZXNwb25zZV9idWZmZXIoKSAtIEdldCBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBidWZmZXIKKyAqIEByc3A6IHJlc3BvbnNlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBidWZmZXIgb2YgYSByZXNwb25zZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcihjb25zdCBzdHJ1Y3Qgc2NtX3Jlc3BvbnNlICpyc3ApCit7CisJcmV0dXJuICh2b2lkICopcnNwICsgcnNwLT5idWZfb2Zmc2V0OworfQorCitzdGF0aWMgaW50IHNjbV9yZW1hcF9lcnJvcihpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBTQ01fRVJST1I6CisJCXJldHVybiAtRUlPOworCWNhc2UgU0NNX0VJTlZBTF9BRERSOgorCWNhc2UgU0NNX0VJTlZBTF9BUkc6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgU0NNX0VPUE5PVFNVUFA6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwljYXNlIFNDTV9FTk9NRU06CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHUzMiBzbWModTMyIGNtZF9hZGRyKQoreworCWludCBjb250ZXh0X2lkOworCXJlZ2lzdGVyIHUzMiByMCBhc20oInIwIikgPSAxOworCXJlZ2lzdGVyIHUzMiByMSBhc20oInIxIikgPSAodTMyKSZjb250ZXh0X2lkOworCXJlZ2lzdGVyIHUzMiByMiBhc20oInIyIikgPSBjbWRfYWRkcjsKKwlhc20oCisJCV9fYXNtZXEoIiUwIiwgInIwIikKKwkJX19hc21lcSgiJTEiLCAicjAiKQorCQlfX2FzbWVxKCIlMiIsICJyMSIpCisJCV9fYXNtZXEoIiUzIiwgInIyIikKKwkJInNtYwkjMAlAIHN3aXRjaCB0byBzZWN1cmUgd29ybGRcbiIKKwkJOiAiPXIiIChyMCkKKwkJOiAiciIgKHIwKSwgInIiIChyMSksICJyIiAocjIpCisJCTogInIzIik7CisJcmV0dXJuIHIwOworfQorCitzdGF0aWMgaW50IF9fc2NtX2NhbGwoY29uc3Qgc3RydWN0IHNjbV9jb21tYW5kICpjbWQpCit7CisJaW50IHJldDsKKwl1MzIgY21kX2FkZHIgPSB2aXJ0X3RvX3BoeXMoY21kKTsKKworCS8qCisJICogRmx1c2ggdGhlIGVudGlyZSBjYWNoZSBoZXJlIHNvIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byByZW1lbWJlcgorCSAqIHRvIGZsdXNoIHRoZSBjYWNoZSB3aGVuIHBhc3NpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIHRvIHRoZSBzZWN1cmUKKwkgKiBzaWRlIGluIHRoZSBidWZmZXIuCisJICovCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJZG8geworCQlyZXQgPSBzbWMoY21kX2FkZHIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gc2NtX3JlbWFwX2Vycm9yKHJldCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHJldCA9PSBTQ01fSU5URVJSVVBURUQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzY21fY2FsbCgpIC0gU2VuZCBhbiBTQ00gY29tbWFuZAorICogQHN2Y19pZDogc2VydmljZSBpZGVudGlmaWVyCisgKiBAY21kX2lkOiBjb21tYW5kIGlkZW50aWZpZXIKKyAqIEBjbWRfYnVmOiBjb21tYW5kIGJ1ZmZlcgorICogQGNtZF9sZW46IGxlbmd0aCBvZiB0aGUgY29tbWFuZCBidWZmZXIKKyAqIEByZXNwX2J1ZjogcmVzcG9uc2UgYnVmZmVyCisgKiBAcmVzcF9sZW46IGxlbmd0aCBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBTQ00gYW5kIHdhaXRzIGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2ggcHJvY2Vzc2luZy4KKyAqLworaW50IHNjbV9jYWxsKHUzMiBzdmNfaWQsIHUzMiBjbWRfaWQsIGNvbnN0IHZvaWQgKmNtZF9idWYsIHNpemVfdCBjbWRfbGVuLAorCQl2b2lkICpyZXNwX2J1Ziwgc2l6ZV90IHJlc3BfbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IHNjbV9jb21tYW5kICpjbWQ7CisJc3RydWN0IHNjbV9yZXNwb25zZSAqcnNwOworCisJY21kID0gYWxsb2Nfc2NtX2NvbW1hbmQoY21kX2xlbiwgcmVzcF9sZW4pOworCWlmICghY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZC0+aWQgPSAoc3ZjX2lkIDw8IDEwKSB8IGNtZF9pZDsKKwlpZiAoY21kX2J1ZikKKwkJbWVtY3B5KHNjbV9nZXRfY29tbWFuZF9idWZmZXIoY21kKSwgY21kX2J1ZiwgY21kX2xlbik7CisKKwltdXRleF9sb2NrKCZzY21fbG9jayk7CisJcmV0ID0gX19zY21fY2FsbChjbWQpOworCW11dGV4X3VubG9jaygmc2NtX2xvY2spOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcnNwID0gc2NtX2NvbW1hbmRfdG9fcmVzcG9uc2UoY21kKTsKKwlkbyB7CisJCXUzMiBzdGFydCA9ICh1MzIpcnNwOworCQl1MzIgZW5kID0gKHUzMilzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcihyc3ApICsgcmVzcF9sZW47CisJCXN0YXJ0ICY9IH4oQ0FDSEVMSU5FU0laRSAtIDEpOworCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKwkJCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjNywgYzYsIDEiIDogOiAiciIgKHN0YXJ0KQorCQkJICAgICA6ICJtZW1vcnkiKTsKKwkJCXN0YXJ0ICs9IENBQ0hFTElORVNJWkU7CisJCX0KKwl9IHdoaWxlICghcnNwLT5pc19jb21wbGV0ZSk7CisKKwlpZiAocmVzcF9idWYpCisJCW1lbWNweShyZXNwX2J1Ziwgc2NtX2dldF9yZXNwb25zZV9idWZmZXIocnNwKSwgcmVzcF9sZW4pOworb3V0OgorCWZyZWVfc2NtX2NvbW1hbmQoY21kKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzY21fY2FsbCk7CisKK3UzMiBzY21fZ2V0X3ZlcnNpb24odm9pZCkKK3sKKwlpbnQgY29udGV4dF9pZDsKKwlzdGF0aWMgdTMyIHZlcnNpb24gPSAtMTsKKwlyZWdpc3RlciB1MzIgcjAgYXNtKCJyMCIpID0gMHgxIDw8IDg7CisJcmVnaXN0ZXIgdTMyIHIxIGFzbSgicjEiKSA9ICh1MzIpJmNvbnRleHRfaWQ7CisKKwlpZiAodmVyc2lvbiAhPSAtMSkKKwkJcmV0dXJuIHZlcnNpb247CisKKwltdXRleF9sb2NrKCZzY21fbG9jayk7CisJYXNtKAorCQlfX2FzbWVxKCIlMCIsICJyMSIpCisJCV9fYXNtZXEoIiUxIiwgInIwIikKKwkJX19hc21lcSgiJTIiLCAicjEiKQorCQkic21jCSMwCUAgc3dpdGNoIHRvIHNlY3VyZSB3b3JsZFxuIgorCQk6ICI9ciIgKHIxKQorCQk6ICJyIiAocjApLCAiciIgKHIxKQorCQk6ICJyMiIsICJyMyIpOworCXZlcnNpb24gPSByMTsKKwltdXRleF91bmxvY2soJnNjbV9sb2NrKTsKKworCXJldHVybiB2ZXJzaW9uOworfQorRVhQT1JUX1NZTUJPTChzY21fZ2V0X3ZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmggYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE3ODZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX01BQ0hfU0NNX0gKKyNkZWZpbmUgX19NQUNIX1NDTV9ICisKKyNkZWZpbmUgU0NNX1NWQ19CT09UCQkJMHgxCisjZGVmaW5lIFNDTV9TVkNfUElMCQkJMHgyCisKK2V4dGVybiBpbnQgc2NtX2NhbGwodTMyIHN2Y19pZCwgdTMyIGNtZF9pZCwgY29uc3Qgdm9pZCAqY21kX2J1Ziwgc2l6ZV90IGNtZF9sZW4sCisJCXZvaWQgKnJlc3BfYnVmLCBzaXplX3QgcmVzcF9sZW4pOworCisjZGVmaW5lIFNDTV9WRVJTSU9OKG1ham9yLCBtaW5vcikgKCgobWFqb3IpIDw8IDE2KSB8ICgobWlub3IpICYgMHhGRikpCisKK2V4dGVybiB1MzIgc2NtX2dldF92ZXJzaW9uKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCmluZGV4IDU5NWJlN2YuLmMxMDVkMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYwpAQCAtNDcsNiArNDcsMTkgQEAKIAogI2RlZmluZSBHUFRfSFogMzI3NjgKIAorZW51bSB0aW1lcl9sb2NhdGlvbiB7CisJTE9DQUxfVElNRVIgPSAwLAorCUdMT0JBTF9USU1FUiA9IDEsCit9OworCisjaWZkZWYgTVNNX1RNUjBfQkFTRQorI2RlZmluZSBNU01fVE1SX0dMT0JBTAkJKE1TTV9UTVIwX0JBU0UgLSBNU01fVE1SX0JBU0UpCisjZWxzZQorI2RlZmluZSBNU01fVE1SX0dMT0JBTAkJMAorI2VuZGlmCisKKyNkZWZpbmUgTVNNX0dMT0JBTF9USU1FUiBNU01fQ0xPQ0tfREdUCisKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCiAjZGVmaW5lIERHVF9IWiAoMTkyMDAwMDAgLyA0KSAvKiAxOS4yIE1IeiAvIDQgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBNU01fREdUX1NISUZUICgwKQpAQCAtNjUsNDkgKzc4LDY3IEBACiAJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICpyZWdiYXNlOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBmcmVxOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBzaGlmdDsKKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKmdsb2JhbF9jb3VudGVyOworCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAqbG9jYWxfY291bnRlcjsKIH07CiAKK2VudW0geworCU1TTV9DTE9DS19HUFQsCisJTVNNX0NMT0NLX0RHVCwKKwlOUl9USU1FUlMsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2Nsb2NrIG1zbV9jbG9ja3NbXTsKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpsb2NhbF9jbG9ja19ldmVudDsKKwogc3RhdGljIGlycXJldHVybl90IG1zbV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApCisJCWV2dCA9IGxvY2FsX2Nsb2NrX2V2ZW50OworCWlmIChldnQtPmV2ZW50X2hhbmRsZXIgPT0gTlVMTCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOwogCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGN5Y2xlX3QgbXNtX2dwdF9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCitzdGF0aWMgY3ljbGVfdCBtc21fcmVhZF90aW1lcl9jb3VudChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewotCXJldHVybiByZWFkbChNU01fR1BUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwpOworCXN0cnVjdCBtc21fY2xvY2sgKmNsayA9IGNvbnRhaW5lcl9vZihjcywgc3RydWN0IG1zbV9jbG9jaywgY2xvY2tzb3VyY2UpOworCisJcmV0dXJuIHJlYWRsKGNsay0+Z2xvYmFsX2NvdW50ZXIpOwogfQogCi1zdGF0aWMgY3ljbGVfdCBtc21fZGd0X3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3N0YXRpYyBzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9ja2V2ZW50X3RvX2Nsb2NrKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlyZXR1cm4gcmVhZGwoTVNNX0RHVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMKSA+PiBNU01fREdUX1NISUZUOworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVElNRVJTOyBpKyspCisJCWlmIChldnQgPT0gJihtc21fY2xvY2tzW2ldLmNsb2NrZXZlbnQpKQorCQkJcmV0dXJuICZtc21fY2xvY2tzW2ldOworCXJldHVybiAmbXNtX2Nsb2Nrc1tNU01fR0xPQkFMX1RJTUVSXTsKKyNlbHNlCisJcmV0dXJuIGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtc21fY2xvY2ssIGNsb2NrZXZlbnQpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgbXNtX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAogCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja2V2ZW50KTsKLQl1aW50MzJfdCBub3cgPSByZWFkbChjbG9jay0+cmVnYmFzZSArIFRJTUVSX0NPVU5UX1ZBTCk7CisJc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjbG9ja2V2ZW50X3RvX2Nsb2NrKGV2dCk7CisJdWludDMyX3Qgbm93ID0gcmVhZGwoY2xvY2stPmxvY2FsX2NvdW50ZXIpOwogCXVpbnQzMl90IGFsYXJtID0gbm93ICsgKGN5Y2xlcyA8PCBjbG9jay0+c2hpZnQpOwotCWludCBsYXRlOwogCiAJd3JpdGVsKGFsYXJtLCBjbG9jay0+cmVnYmFzZSArIFRJTUVSX01BVENIX1ZBTCk7Ci0Jbm93ID0gcmVhZGwoY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9DT1VOVF9WQUwpOwotCWxhdGUgPSBub3cgLSBhbGFybTsKLQlpZiAobGF0ZSA+PSAoLTIgPDwgY2xvY2stPnNoaWZ0KSAmJiBsYXRlIDwgREdUX0haKjUpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJtc21fdGltZXJfc2V0X25leHRfZXZlbnQoJWx1KSBjbG9jayAlcywgIgotCQkgICAgICAgImFsYXJtIGFscmVhZHkgZXhwaXJlZCwgbm93ICV4LCBhbGFybSAleCwgbGF0ZSAlZFxuIiwKLQkJICAgICAgIGN5Y2xlcywgY2xvY2stPmNsb2NrZXZlbnQubmFtZSwgbm93LCBhbGFybSwgbGF0ZSk7Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtc21fdGltZXJfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJCQkgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja2V2ZW50KTsKKwlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9IGNsb2NrZXZlbnRfdG9fY2xvY2soZXZ0KTsKKwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgogCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CkBAIC0xMjMsNyArMTU0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgbXNtX2Nsb2Nrc1tdID0gewotCXsKKwlbTVNNX0NMT0NLX0dQVF0gPSB7CiAJCS5jbG9ja2V2ZW50ID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImdwX3RpbWVyIiwKIAkJCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCkBAIC0xMzUsNyArMTY2LDcgQEAKIAkJLmNsb2Nrc291cmNlID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImdwX3RpbWVyIiwKIAkJCS5yYXRpbmcgICAgICAgICA9IDIwMCwKLQkJCS5yZWFkICAgICAgICAgICA9IG1zbV9ncHRfcmVhZCwKKwkJCS5yZWFkICAgICAgICAgICA9IG1zbV9yZWFkX3RpbWVyX2NvdW50LAogCQkJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJCQkuZmxhZ3MgICAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkJfSwKQEAgLTE0Nyw5ICsxNzgsMTIgQEAKIAkJCS5pcnEgICAgID0gSU5UX0dQX1RJTUVSX0VYUAogCQl9LAogCQkucmVnYmFzZSA9IE1TTV9HUFRfQkFTRSwKLQkJLmZyZXEgPSBHUFRfSFoKKwkJLmZyZXEgPSBHUFRfSFosCisJCS5sb2NhbF9jb3VudGVyID0gTVNNX0dQVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMLAorCQkuZ2xvYmFsX2NvdW50ZXIgPSBNU01fR1BUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwgKworCQkJTVNNX1RNUl9HTE9CQUwsCiAJfSwKLQl7CisJW01TTV9DTE9DS19ER1RdID0gewogCQkuY2xvY2tldmVudCA9IHsKIAkJCS5uYW1lICAgICAgICAgICA9ICJkZ190aW1lciIsCiAJCQkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULApAQCAtMTYxLDcgKzE5NSw3IEBACiAJCS5jbG9ja3NvdXJjZSA9IHsKIAkJCS5uYW1lICAgICAgICAgICA9ICJkZ190aW1lciIsCiAJCQkucmF0aW5nICAgICAgICAgPSAzMDAsCi0JCQkucmVhZCAgICAgICAgICAgPSBtc21fZGd0X3JlYWQsCisJCQkucmVhZCAgICAgICAgICAgPSBtc21fcmVhZF90aW1lcl9jb3VudCwKIAkJCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soKDMyIC0gTVNNX0RHVF9TSElGVCkpLAogCQkJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJCX0sCkBAIC0xNzQsNyArMjA4LDEwIEBACiAJCX0sCiAJCS5yZWdiYXNlID0gTVNNX0RHVF9CQVNFLAogCQkuZnJlcSA9IERHVF9IWiA+PiBNU01fREdUX1NISUZULAotCQkuc2hpZnQgPSBNU01fREdUX1NISUZUCisJCS5zaGlmdCA9IE1TTV9ER1RfU0hJRlQsCisJCS5sb2NhbF9jb3VudGVyID0gTVNNX0RHVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMLAorCQkuZ2xvYmFsX2NvdW50ZXIgPSBNU01fREdUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwgKworCQkJTVNNX1RNUl9HTE9CQUwsCiAJfQogfTsKIApAQCAtMTgzLDcgKzIyMCw3IEBACiAJaW50IGk7CiAJaW50IHJlczsKIAotI2lmZGVmIENPTkZJR19BUkNIX01TTThYNjAKKyNpZmRlZiBDT05GSUdfQVJDSF9NU01fU0NPUlBJT05NUAogCXdyaXRlbChER1RfQ0xLX0NUTF9ESVZfNCwgTVNNX1RNUl9CQVNFICsgREdUX0NMS19DVEwpOwogI2VuZGlmCiAKQEAgLTIxNyw2ICsyNTQsNDggQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSAmbXNtX2Nsb2Nrc1tNU01fR0xPQkFMX1RJTUVSXTsKKworCS8qIFVzZSBleGlzdGluZyBjbG9ja19ldmVudCBmb3IgY3B1IDAgKi8KKwlpZiAoIXNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJcmV0dXJuOworCisJd3JpdGVsKERHVF9DTEtfQ1RMX0RJVl80LCBNU01fVE1SX0JBU0UgKyBER1RfQ0xLX0NUTCk7CisKKwlpZiAoIWxvY2FsX2Nsb2NrX2V2ZW50KSB7CisJCXdyaXRlbCgwLCBjbG9jay0+cmVnYmFzZSAgKyBUSU1FUl9FTkFCTEUpOworCQl3cml0ZWwoMCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9DTEVBUik7CisJCXdyaXRlbCh+MCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9NQVRDSF9WQUwpOworCX0KKwlldnQtPmlycSA9IGNsb2NrLT5pcnEuaXJxOworCWV2dC0+bmFtZSA9ICJsb2NhbF90aW1lciI7CisJZXZ0LT5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZXZ0LT5yYXRpbmcgPSBjbG9jay0+Y2xvY2tldmVudC5yYXRpbmc7CisJZXZ0LT5zZXRfbW9kZSA9IG1zbV90aW1lcl9zZXRfbW9kZTsKKwlldnQtPnNldF9uZXh0X2V2ZW50ID0gbXNtX3RpbWVyX3NldF9uZXh0X2V2ZW50OworCWV2dC0+c2hpZnQgPSBjbG9jay0+Y2xvY2tldmVudC5zaGlmdDsKKwlldnQtPm11bHQgPSBkaXZfc2MoY2xvY2stPmZyZXEsIE5TRUNfUEVSX1NFQywgZXZ0LT5zaGlmdCk7CisJZXZ0LT5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZjAwMDAwMDAgPj4gY2xvY2stPnNoaWZ0LCBldnQpOworCWV2dC0+bWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucyg0LCBldnQpOworCisJbG9jYWxfY2xvY2tfZXZlbnQgPSBldnQ7CisKKwlnaWNfZW5hYmxlX3BwaShjbG9jay0+aXJxLmlycSk7CisKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoZXZ0KTsKK30KKworaW5saW5lIGludCBsb2NhbF90aW1lcl9hY2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyID0gewogCS5pbml0ID0gbXNtX3RpbWVyX2luaXQKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFfM2RzLmMgYi9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFfM2RzLmMKaW5kZXggNGU1MTZiNC4uODk5YTk2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxXzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMV8zZHMuYwpAQCAtMTQwLDEwICsxNDAsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9pbml0X2RhdGEgbXgzMV8zZHNfcmVndWxhdG9yc1tdID0gewogCXsKLQkJLmlkID0gTUMxMzc4M19SRUdVX1BXR1QxU1BJLCAvKiBQb3dlciBHYXRlIGZvciBBUk0gY29yZS4gKi8KKwkJLmlkID0gTUMxMzc4M19SRUdfUFdHVDFTUEksIC8qIFBvd2VyIEdhdGUgZm9yIEFSTSBjb3JlLiAqLwogCQkuaW5pdF9kYXRhID0gJnB3Z3R4X2luaXQsCiAJfSwgewotCQkuaWQgPSBNQzEzNzgzX1JFR1VfUFdHVDJTUEksIC8qIFBvd2VyIEdhdGUgZm9yIEwyIENhY2hlLiAqLworCQkuaWQgPSBNQzEzNzgzX1JFR19QV0dUMlNQSSwgLyogUG93ZXIgR2F0ZSBmb3IgTDIgQ2FjaGUuICovCiAJCS5pbml0X2RhdGEgPSAmcHdndHhfaW5pdCwKIAl9LCB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMW1vYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtbXgzL21hY2gtbXgzMW1vYm9hcmQuYwppbmRleCAyMDNkMjFhLi4xYWE4ZDY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14My9tYWNoLW14MzFtb2JvYXJkLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDMvbWFjaC1teDMxbW9ib2FyZC5jCkBAIC0yMTYsMTEgKzIxNiwxMSBAQAogCiBzdGF0aWMgc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSBtb2JvYXJkX3JlZ3VsYXRvcnNbXSA9IHsKIAl7Ci0JCS5pZCA9IE1DMTM3ODNfUkVHVV9WTU1DMSwKKwkJLmlkID0gTUMxMzc4M19SRUdfVk1NQzEsCiAJCS5pbml0X2RhdGEgPSAmc2RoY192cmVnX2RhdGEsCiAJfSwKIAl7Ci0JCS5pZCA9IE1DMTM3ODNfUkVHVV9WQ0FNLAorCQkuaWQgPSBNQzEzNzgzX1JFR19WQ0FNLAogCQkuaW5pdF9kYXRhID0gJmNhbV92cmVnX2RhdGEsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3BtLmMKaW5kZXggMGNjYTIzYS4uOThiYTk3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvcG0uYwpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAKIAogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG9tYXBfcG1fb3BzID17CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG9tYXBfcG1fb3BzID0gewogCS5wcmVwYXJlCT0gb21hcF9wbV9wcmVwYXJlLAogCS5lbnRlcgkJPSBvbWFwX3BtX2VudGVyLAogCS5maW5pc2gJCT0gb21hcF9wbV9maW5pc2gsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQppbmRleCBjZDczMzJmLi4xYzBjMmIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKQEAgLTE4NywxNiArMTg3LDE5IEBACiAJCQkJCSAgIGhzbW1jLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfWk9PTTIpCQkrPSBib2FyZC16b29tLm8gXAogCQkJCQkgICBib2FyZC16b29tLXBlcmlwaGVyYWxzLm8gXAorCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubyBcCiAJCQkJCSAgIGJvYXJkLWZsYXNoLm8gXAogCQkJCQkgICBoc21tYy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kZWJ1Z2JvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfWk9PTTMpCQkrPSBib2FyZC16b29tLm8gXAogCQkJCQkgICBib2FyZC16b29tLXBlcmlwaGVyYWxzLm8gXAorCQkJCQkgICBib2FyZC16b29tLWRpc3BsYXkubyBcCiAJCQkJCSAgIGJvYXJkLWZsYXNoLm8gXAogCQkJCQkgICBoc21tYy5vIFwKIAkJCQkJICAgYm9hcmQtem9vbS1kZWJ1Z2JvYXJkLm8KIG9iai0kKENPTkZJR19NQUNIX09NQVBfMzYzMFNEUCkJCSs9IGJvYXJkLTM2MzBzZHAubyBcCiAJCQkJCSAgIGJvYXJkLXpvb20tcGVyaXBoZXJhbHMubyBcCisJCQkJCSAgIGJvYXJkLXpvb20tZGlzcGxheS5vIFwKIAkJCQkJICAgYm9hcmQtZmxhc2gubyBcCiAJCQkJCSAgIGhzbW1jLm8KIG9iai0kKENPTkZJR19NQUNIX0NNX1QzNSkJCSs9IGJvYXJkLWNtLXQzNS5vIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKaW5kZXggM2IzOWVmMS4uZDRlNDFlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNDMwc2RwLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvcGFuZWwtZ2VuZXJpYy1kcGkuaD4KIAogI2luY2x1ZGUgPHBsYXQvZ3BtYy1zbWM5MXguaD4KIApAQCAtMjcwLDE1ICsyNzEsMjAgQEAKIAkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9sY2QsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHAzNDMwX2R2aV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19wYW5lbCIsCi0JLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0geworCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCiAJLnBsYXRmb3JtX2VuYWJsZQk9IHNkcDM0MzBfcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IHNkcDM0MzBfcGFuZWxfZGlzYWJsZV9kdmksCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBzZHAzNDMwX2R2aV9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJkdmkiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2Ugc2RwMzQzMF90dl9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJ0diIsCiAJLmRyaXZlcl9uYW1lCQk9ICJ2ZW5jIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtMzYzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKaW5kZXggNWQ0MWRiZS4uNjI2NDU2NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC0zNjMwc2RwLmMKQEAgLTIwNyw2ICsyMDcsNyBAQAogewogCW9tYXAzX211eF9pbml0KGJvYXJkX211eCwgT01BUF9QQUNLQUdFX0NCUCk7CiAJem9vbV9wZXJpcGhlcmFsc19pbml0KCk7CisJem9vbV9kaXNwbGF5X2luaXQoKTsKIAlib2FyZF9zbWM5MXhfaW5pdCgpOwogCWJvYXJkX2ZsYXNoX2luaXQoc2RwX2ZsYXNoX3BhcnRpdGlvbnMsIGNoaXBfc2VsX3NkcCk7CiAJZW5hYmxlX2JvYXJkX3dha2V1cF9zb3VyY2UoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtNDQzMHNkcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKaW5kZXggYTcwYmRmMi4uMDdkMWIyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC00NDMwc2RwLmMKQEAgLTU1NCw2ICs1NTQsNyBAQAogCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiBzdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7CisJT01BUDRfTVVYKFVTQkIyX1VMUElUTExfQ0xLLCBPTUFQX01VWF9NT0RFNCB8IE9NQVBfUElOX09VVFBVVCksCiAJeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKIH07CiAjZWxzZQpAQCAtNTc2LDExICs1NzcsMTIgQEAKIAlvbWFwNF90d2w2MDMwX2hzbW1jX2luaXQobW1jKTsKIAogCS8qIFBvd2VyIG9uIHRoZSBVTFBJIFBIWSAqLwotCWlmIChncGlvX2lzX3ZhbGlkKE9NQVA0U0RQX01ETV9QV1JfRU5fR1BJTykpIHsKLQkJLyogRklYTUU6IEFzc3VtZXMgcGFkIGlzIGFscmVhZHkgbXV4ZWQgZm9yIEdQSU8gbW9kZSAqLwotCQlncGlvX3JlcXVlc3QoT01BUDRTRFBfTURNX1BXUl9FTl9HUElPLCAiVVNCQjEgUEhZIFZNRE1fM1YzIik7CisJc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KE9NQVA0U0RQX01ETV9QV1JfRU5fR1BJTywgIlVTQkIxIFBIWSBWTURNXzNWMyIpOworCWlmIChzdGF0dXMpCisJCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgVVNCQjEgUEhZIEdQSU9cbiIsIF9fZnVuY19fKTsKKwllbHNlCiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChPTUFQNFNEUF9NRE1fUFdSX0VOX0dQSU8sIDEpOwotCX0KKwogCXVzYl9laGNpX2luaXQoJmVoY2lfcGRhdGEpOwogCXVzYl9tdXNiX2luaXQoJm11c2JfYm9hcmRfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWFtMzUxN2V2bS5jCmluZGV4IGJjMTU2MjYuLjEwZDYwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtYW0zNTE3ZXZtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1hbTM1MTdldm0uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPHBsYXQvY29tbW9uLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3BhbmVsLWdlbmVyaWMtZHBpLmg+CiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJjb250cm9sLmgiCkBAIC0zMDMsMTMgKzMwNCwxOCBAQAogCWxjZF9lbmFibGVkID0gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGxjZF9wYW5lbCA9IHsKKwkubmFtZQkJCT0gInNoYXJwX2xxIiwKKwkucGxhdGZvcm1fZW5hYmxlCT0gYW0zNTE3X2V2bV9wYW5lbF9lbmFibGVfbGNkLAorCS5wbGF0Zm9ybV9kaXNhYmxlCT0gYW0zNTE3X2V2bV9wYW5lbF9kaXNhYmxlX2xjZCwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGFtMzUxN19ldm1fbGNkX2RldmljZSA9IHsKIAkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAogCS5uYW1lCQkJPSAibGNkIiwKLQkuZHJpdmVyX25hbWUJCT0gInNoYXJwX2xxX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZGF0YQkJCT0gJmxjZF9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzIAk9IDE2LAotCS5wbGF0Zm9ybV9lbmFibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2VuYWJsZV9sY2QsCi0JLnBsYXRmb3JtX2Rpc2FibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2Rpc2FibGVfbGNkLAogfTsKIAogc3RhdGljIGludCBhbTM1MTdfZXZtX3BhbmVsX2VuYWJsZV90dihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCkBAIC0zNDYsMTMgKzM1MiwxOCBAQAogCWR2aV9lbmFibGVkID0gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKKwkubmFtZQkJCT0gImdlbmVyaWMiLAorCS5wbGF0Zm9ybV9lbmFibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2VuYWJsZV9kdmksCisJLnBsYXRmb3JtX2Rpc2FibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2Rpc2FibGVfZHZpLAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgYW0zNTE3X2V2bV9kdmlfZGV2aWNlID0gewogCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCiAJLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19wYW5lbCIsCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCiAJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAotCS5wbGF0Zm9ybV9lbmFibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2VuYWJsZV9kdmksCi0JLnBsYXRmb3JtX2Rpc2FibGUJPSBhbTM1MTdfZXZtX3BhbmVsX2Rpc2FibGVfZHZpLAogfTsKIAogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmFtMzUxN19ldm1fZHNzX2RldmljZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWNtLXQzNS5jCmluZGV4IDQ4NmEzZGUuLmRhYzE0MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtY20tdDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1jbS10MzUuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+CisjaW5jbHVkZSA8cGxhdC9wYW5lbC1nZW5lcmljLWRwaS5oPgogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTM1MSwyNCArMzUyLDM0IEBACiB7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGNtX3QzNV9sY2RfZGV2aWNlID0gewotCS5uYW1lCQkJPSAibGNkIiwKLQkuZHJpdmVyX25hbWUJCT0gInRvcHBvbHlfdGRvMzVzX3BhbmVsIiwKLQkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5waHkuZHBpLmRhdGFfbGluZXMJPSAxOCwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBsY2RfcGFuZWwgPSB7CisJLm5hbWUJCQk9ICJ0b3Bwb2x5X3RkbzM1cyIsCiAJLnBsYXRmb3JtX2VuYWJsZQk9IGNtX3QzNV9wYW5lbF9lbmFibGVfbGNkLAogCS5wbGF0Zm9ybV9kaXNhYmxlCT0gY21fdDM1X3BhbmVsX2Rpc2FibGVfbGNkLAogfTsKIAotc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgY21fdDM1X2R2aV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19wYW5lbCIsCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBjbV90MzVfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRhdGEJCQk9ICZsY2RfcGFuZWwsCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDE4LAorfTsKKworc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKKwkubmFtZQkJCT0gImdlbmVyaWMiLAogCS5wbGF0Zm9ybV9lbmFibGUJPSBjbV90MzVfcGFuZWxfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IGNtX3QzNV9wYW5lbF9kaXNhYmxlX2R2aSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGNtX3QzNV9kdmlfZGV2aWNlID0geworCS5uYW1lCQkJPSAiZHZpIiwKKwkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAorCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAorCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGNtX3QzNV90dl9kZXZpY2UgPSB7CiAJLm5hbWUJCQk9ICJ0diIsCiAJLmRyaXZlcl9uYW1lCQk9ICJ2ZW5jIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZGV2a2l0ODAwMC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKaW5kZXggNDUxZTdmZi4uMDBiYjFmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1kZXZraXQ4MDAwLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgogI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvcGFuZWwtZ2VuZXJpYy1kcGkuaD4KIAogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CkBAIC0xNDksMjUgKzE1MCwzNCBAQAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGRldmtpdDgwMDBfdmlvX3N1cHBseSA9CiAJUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgInNwaTIuMCIpOwogCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBkZXZraXQ4MDAwX2xjZF9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgICAgICAgICAgPSAibGNkIiwKLQkuZHJpdmVyX25hbWUgICAgICAgICAgICA9ICJnZW5lcmljX3BhbmVsIiwKLQkudHlwZSAgICAgICAgICAgICAgICAgICA9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkucGh5LmRwaS5kYXRhX2xpbmVzICAgICA9IDI0LAotCS5yZXNldF9ncGlvICAgICAgICAgICAgID0gLUVJTlZBTCwgLyogd2lsbCBiZSByZXBsYWNlZCAqLworc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGxjZF9wYW5lbCA9IHsKKwkubmFtZQkJCT0gImdlbmVyaWMiLAogCS5wbGF0Zm9ybV9lbmFibGUgICAgICAgID0gZGV2a2l0ODAwMF9wYW5lbF9lbmFibGVfbGNkLAogCS5wbGF0Zm9ybV9kaXNhYmxlICAgICAgID0gZGV2a2l0ODAwMF9wYW5lbF9kaXNhYmxlX2xjZCwKIH07Ci1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBkZXZraXQ4MDAwX2R2aV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiZHZpIiwKLQkuZHJpdmVyX25hbWUgICAgICAgICAgICA9ICJnZW5lcmljX3BhbmVsIiwKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgZGV2a2l0ODAwMF9sY2RfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImxjZCIsCiAJLnR5cGUgICAgICAgICAgICAgICAgICAgPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLmRyaXZlcl9uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kYXRhCQkJPSAmbGNkX3BhbmVsLAogCS5waHkuZHBpLmRhdGFfbGluZXMgICAgID0gMjQsCi0JLnJlc2V0X2dwaW8gICAgICAgICAgICAgPSAtRUlOVkFMLCAvKiB3aWxsIGJlIHJlcGxhY2VkICovCit9OworCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0geworCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCiAJLnBsYXRmb3JtX2VuYWJsZSAgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUgICAgICAgPSBkZXZraXQ4MDAwX3BhbmVsX2Rpc2FibGVfZHZpLAogfTsKIAorc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgZGV2a2l0ODAwMF9kdmlfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImR2aSIsCisJLnR5cGUgICAgICAgICAgICAgICAgICAgPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLmRyaXZlcl9uYW1lICAgICAgICAgICAgPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kYXRhCQkJPSAmZHZpX3BhbmVsLAorCS5waHkuZHBpLmRhdGFfbGluZXMgICAgID0gMjQsCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBkZXZraXQ4MDAwX3R2X2RldmljZSA9IHsKIAkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJ0diIsCiAJLmRyaXZlcl9uYW1lICAgICAgICAgICAgPSAidmVuYyIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDIwLmMKaW5kZXggMGFmYTMwMS4uM2JlODVhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMjAuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgpAQCAtMzEsNiArMzIsNyBAQAogI2luY2x1ZGUgPHBsYXQvZ3BtYy5oPgogI2luY2x1ZGUgPHBsYXQvdXNiLmg+CiAjaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+CisjaW5jbHVkZSA8cGxhdC9wYW5lbC1nZW5lcmljLWRwaS5oPgogI2luY2x1ZGUgPHBsYXQvb25lbmFuZC5oPgogCiAjaW5jbHVkZSAibXV4LmgiCkBAIC00NTksMTMgKzQ2MSwxOCBAQAogCWdwaW9fZGlyZWN0aW9uX291dHB1dChJR0VQMl9HUElPX0RWSV9QVVAsIDApOwogfQogCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0geworCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCisJLnBsYXRmb3JtX2VuYWJsZQk9IGlnZXAyX2VuYWJsZV9kdmksCisJLnBsYXRmb3JtX2Rpc2FibGUJPSBpZ2VwMl9kaXNhYmxlX2R2aSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGlnZXAyX2R2aV9kZXZpY2UgPSB7CiAJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKIAkubmFtZQkJCT0gImR2aSIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCi0JLnBsYXRmb3JtX2VuYWJsZQk9IGlnZXAyX2VuYWJsZV9kdmksCi0JLnBsYXRmb3JtX2Rpc2FibGUJPSBpZ2VwMl9kaXNhYmxlX2R2aSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICppZ2VwMl9kc3NfZGV2aWNlc1tdID0gewpAQCAtNTM1LDYgKzU0MiwzNyBAQAogCS5hdWRpbyA9ICZpZ2VwMl9hdWRpb19kYXRhLAogfTsKIAorc3RhdGljIGludCBpZ2VwMl9rZXltYXBbXSA9IHsKKwlLRVkoMCwgMCwgS0VZX0xFRlQpLAorCUtFWSgwLCAxLCBLRVlfUklHSFQpLAorCUtFWSgwLCAyLCBLRVlfQSksCisJS0VZKDAsIDMsIEtFWV9CKSwKKwlLRVkoMSwgMCwgS0VZX0RPV04pLAorCUtFWSgxLCAxLCBLRVlfVVApLAorCUtFWSgxLCAyLCBLRVlfRSksCisJS0VZKDEsIDMsIEtFWV9GKSwKKwlLRVkoMiwgMCwgS0VZX0VOVEVSKSwKKwlLRVkoMiwgMSwgS0VZX0kpLAorCUtFWSgyLCAyLCBLRVlfSiksCisJS0VZKDIsIDMsIEtFWV9LKSwKKwlLRVkoMywgMCwgS0VZX00pLAorCUtFWSgzLCAxLCBLRVlfTiksCisJS0VZKDMsIDIsIEtFWV9PKSwKKwlLRVkoMywgMywgS0VZX1ApCit9OworCitzdGF0aWMgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSBpZ2VwMl9rZXltYXBfZGF0YSA9IHsKKwkua2V5bWFwCQkJPSBpZ2VwMl9rZXltYXAsCisJLmtleW1hcF9zaXplCQk9IEFSUkFZX1NJWkUoaWdlcDJfa2V5bWFwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9rZXlwYWRfZGF0YSBpZ2VwMl9rZXlwYWRfcGRhdGEgPSB7CisJLmtleW1hcF9kYXRhCT0gJmlnZXAyX2tleW1hcF9kYXRhLAorCS5yb3dzCQk9IDQsCisJLmNvbHMJCT0gNCwKKwkucmVwCQk9IDEsCit9OworCiBzdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSBpZ2VwMl90d2xkYXRhID0gewogCS5pcnFfYmFzZQk9IFRXTDQwMzBfSVJRX0JBU0UsCiAJLmlycV9lbmQJPSBUV0w0MDMwX0lSUV9FTkQsCkBAIC01NDMsNiArNTgxLDcgQEAKIAkudXNiCQk9ICZpZ2VwMl91c2JfZGF0YSwKIAkuY29kZWMJCT0gJmlnZXAyX2NvZGVjX2RhdGEsCiAJLmdwaW8JCT0gJmlnZXAyX3R3bDQwMzBfZ3Bpb19wZGF0YSwKKwkua2V5cGFkCQk9ICZpZ2VwMl9rZXlwYWRfcGRhdGEsCiAJLnZtbWMxICAgICAgICAgID0gJmlnZXAyX3ZtbWMxLAogCS52cGxsMgkJPSAmaWdlcDJfdnBsbDIsCiAJLnZpbwkJPSAmaWdlcDJfdmlvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAzMC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1pZ2VwMDAzMC5jCmluZGV4IGJjY2NkNjguLjRkYzYyYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtaWdlcDAwMzAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWlnZXAwMDMwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2ZpeGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAKQEAgLTQzLDcgKzQ0LDcgQEAKICNkZWZpbmUgSUdFUDNfR1BJT19XSUZJX05SRVNFVAkxMzkKICNkZWZpbmUgSUdFUDNfR1BJT19CVF9OUkVTRVQJMTM3CiAKLSNkZWZpbmUgSUdFUDNfR1BJT19VU0JIX05SRVNFVCAgMTE1CisjZGVmaW5lIElHRVAzX0dQSU9fVVNCSF9OUkVTRVQgIDE4MwogCiAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfT05FTkFORF9PTUFQMikgfHwgXApAQCAtMTAzLDcgKzEwNCw3IEBACiAJfSwKIH07CiAKLXZvaWQgX19pbml0IGlnZXAzX2ZsYXNoX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpZ2VwM19mbGFzaF9pbml0KHZvaWQpCiB7CiAJdTggY3MgPSAwOwogCXU4IG9uZW5hbmRjcyA9IEdQTUNfQ1NfTlVNICsgMTsKQEAgLTEzNywxMiArMTM4LDExIEBACiB9CiAKICNlbHNlCi12b2lkIF9faW5pdCBpZ2VwM19mbGFzaF9pbml0KHZvaWQpIHt9CitzdGF0aWMgdm9pZCBfX2luaXQgaWdlcDNfZmxhc2hfaW5pdCh2b2lkKSB7fQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpZ2VwM192bW1jMV9zdXBwbHkgPSB7Ci0JLnN1cHBseQkJPSAidm1tYyIsCi19Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGlnZXAzX3ZtbWMxX3N1cHBseSA9CisJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJtbWNpLW9tYXAtaHMuMCIpOwogCiAvKiBWTU1DMSBmb3IgT01BUCBWRERfTU1DMSAoaS9vKSBhbmQgTU1DMSBjYXJkICovCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgaWdlcDNfdm1tYzEgPSB7CkBAIC0xNTksNiArMTU5LDUyIEBACiAJLmNvbnN1bWVyX3N1cHBsaWVzICAgICAgPSAmaWdlcDNfdm1tYzFfc3VwcGx5LAogfTsKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGlnZXAzX3Zpb19zdXBwbHkgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZtbWNfYXV4IiwgIm1tY2ktb21hcC1ocy4xIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBpZ2VwM192aW8gPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubWluX3VWCQkJPSAxODAwMDAwLAorCQkubWF4X3VWCQkJPSAxODAwMDAwLAorCQkuYXBwbHlfdVYJCT0gMSwKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gMSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSAmaWdlcDNfdmlvX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpZ2VwM192bW1jMl9zdXBwbHkgPQorCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAibW1jaS1vbWFwLWhzLjEiKTsKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGlnZXAzX3ZtbWMyID0geworCS5jb25zdHJhaW50cwk9IHsKKwkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwsCisJCS5hbHdheXNfb24JCT0gMSwKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZpZ2VwM192bW1jMl9zdXBwbHksCit9OworCitzdGF0aWMgc3RydWN0IGZpeGVkX3ZvbHRhZ2VfY29uZmlnIGlnZXAzX3Z3bGFuID0geworCS5zdXBwbHlfbmFtZQkJPSAidndsYW4iLAorCS5taWNyb3ZvbHRzCQk9IDMzMDAwMDAsCisJLmdwaW8JCQk9IC1FSU5WQUwsCisJLmVuYWJsZWRfYXRfYm9vdAk9IDEsCisJLmluaXRfZGF0YQkJPSAmaWdlcDNfdm1tYzIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpZ2VwM192d2xhbl9kZXZpY2UgPSB7CisJLm5hbWUJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAk9IDAsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaWdlcDNfdndsYW4sCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyBtbWNbXSA9IHsKIAlbMF0gPSB7CiAJCS5tbWMJCT0gMSwKQEAgLTI1NCwxMiArMzAwLDYgQEAKIAltbWNbMF0uZ3Bpb19jZCA9IGdwaW8gKyAwOwogCW9tYXAyX2hzbW1jX2luaXQobW1jKTsKIAotCS8qCi0JICogbGluayByZWd1bGF0b3JzIHRvIE1NQyBhZGFwdGVycyAuLi4gd2UgImtub3ciIHRoZQotCSAqIHJlZ3VsYXRvcnMgd2lsbCBiZSBzZXQgdXAgb25seSAqYWZ0ZXIqIHdlIHJldHVybi4KLQkgKi8KLQlpZ2VwM192bW1jMV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKLQogCS8qIFRXTDQwMzBfR1BJT19NQVggKyAxID09IGxlZEIgKG91dCwgYWN0aXZlIGxvdyBMRUQpICovCiAjaWYgIWRlZmluZWQoQ09ORklHX0xFRFNfR1BJTykgJiYgIWRlZmluZWQoQ09ORklHX0xFRFNfR1BJT19NT0RVTEUpCiAJaWYgKChncGlvX3JlcXVlc3QoZ3BpbytUV0w0MDMwX0dQSU9fTUFYKzEsICJncGlvLWxlZDpncmVlbjpkMSIpID09IDApCkBAIC0yODcsNiArMzI3LDEwIEBACiAJLnVzYl9tb2RlCT0gVDJfVVNCX01PREVfVUxQSSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppZ2VwM19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaWdlcDNfdndsYW5fZGV2aWNlLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGlnZXAzX2luaXRfaXJxKHZvaWQpCiB7CiAJb21hcDJfaW5pdF9jb21tb25faW5mcmFzdHJ1Y3R1cmUoKTsKQEAgLTMwMyw2ICszNDcsNyBAQAogCS51c2IJCT0gJmlnZXAzX3R3bDQwMzBfdXNiX2RhdGEsCiAJLmdwaW8JCT0gJmlnZXAzX3R3bDQwMzBfZ3Bpb19wZGF0YSwKIAkudm1tYzEJCT0gJmlnZXAzX3ZtbWMxLAorCS52aW8JCT0gJmlnZXAzX3ZpbywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBpZ2VwM19pMmNfYm9hcmRpbmZvW10gPSB7CkBAIC0zNjMsOCArNDA4LDIwIEBACiB2b2lkIF9faW5pdCBpZ2VwM193aWZpX2J0X2luaXQodm9pZCkge30KICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IGVoY2lfaGNkX29tYXBfcGxhdGZvcm1fZGF0YSBlaGNpX3BkYXRhIF9faW5pdGNvbnN0ID0geworCS5wb3J0X21vZGVbMF0gPSBFSENJX0hDRF9PTUFQX01PREVfVU5LTk9XTiwKKwkucG9ydF9tb2RlWzFdID0gRUhDSV9IQ0RfT01BUF9NT0RFX1BIWSwKKwkucG9ydF9tb2RlWzJdID0gRUhDSV9IQ0RfT01BUF9NT0RFX1VOS05PV04sCisKKwkucGh5X3Jlc2V0ID0gdHJ1ZSwKKwkucmVzZXRfZ3Bpb19wb3J0WzBdID0gLUVJTlZBTCwKKwkucmVzZXRfZ3Bpb19wb3J0WzFdID0gSUdFUDNfR1BJT19VU0JIX05SRVNFVCwKKwkucmVzZXRfZ3Bpb19wb3J0WzJdID0gLUVJTlZBTCwKK307CisKICNpZmRlZiBDT05GSUdfT01BUF9NVVgKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKKwlPTUFQM19NVVgoSTJDMl9TREEsIE9NQVBfTVVYX01PREU0IHwgT01BUF9QSU5fT1VUUFVUKSwKIAl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAogfTsKICNlbmRpZgpAQCAtMzc1LDkgKzQzMiwxMCBAQAogCiAJLyogUmVnaXN0ZXIgSTJDIGJ1c3NlcyBhbmQgZHJpdmVycyAqLwogCWlnZXAzX2kyY19pbml0KCk7Ci0KKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpZ2VwM19kZXZpY2VzLCBBUlJBWV9TSVpFKGlnZXAzX2RldmljZXMpKTsKIAlvbWFwX3NlcmlhbF9pbml0KCk7CiAJdXNiX211c2JfaW5pdCgmbXVzYl9ib2FyZF9kYXRhKTsKKwl1c2JfZWhjaV9pbml0KCZlaGNpX3BkYXRhKTsKIAogCWlnZXAzX2ZsYXNoX2luaXQoKTsKIAlpZ2VwM19sZWRzX2luaXQoKTsKQEAgLTM5Miw2ICs0NTAsNyBAQAogCiBNQUNISU5FX1NUQVJUKElHRVAwMDMwLCAiSUdFUCBPTUFQMyBtb2R1bGUiKQogCS5ib290X3BhcmFtcwk9IDB4ODAwMDAxMDAsCisJLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCiAJLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCiAJLmluaXRfaXJxCT0gaWdlcDNfaW5pdF9pcnEsCiAJLmluaXRfbWFjaGluZQk9IGlnZXAzX2luaXQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzYmVhZ2xlLmMKaW5kZXggNmMxMjc2MC4uNDZkODE0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2JlYWdsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNiZWFnbGUuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPHBsYXQvYm9hcmQuaD4KICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvZGlzcGxheS5oPgorI2luY2x1ZGUgPHBsYXQvcGFuZWwtZ2VuZXJpYy1kcGkuaD4KICNpbmNsdWRlIDxwbGF0L2dwbWMuaD4KICNpbmNsdWRlIDxwbGF0L25hbmQuaD4KICNpbmNsdWRlIDxwbGF0L3VzYi5oPgpAQCAtMTk0LDE0ICsxOTUsMTkgQEAKIAkJZ3Bpb19zZXRfdmFsdWUoZHNzZGV2LT5yZXNldF9ncGlvLCAwKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhIGR2aV9wYW5lbCA9IHsKKwkubmFtZSA9ICJnZW5lcmljIiwKKwkucGxhdGZvcm1fZW5hYmxlID0gYmVhZ2xlX2VuYWJsZV9kdmksCisJLnBsYXRmb3JtX2Rpc2FibGUgPSBiZWFnbGVfZGlzYWJsZV9kdmksCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBiZWFnbGVfZHZpX2RldmljZSA9IHsKIAkudHlwZSA9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKIAkubmFtZSA9ICJkdmkiLAotCS5kcml2ZXJfbmFtZSA9ICJnZW5lcmljX3BhbmVsIiwKKwkuZHJpdmVyX25hbWUgPSAiZ2VuZXJpY19kcGlfcGFuZWwiLAorCS5kYXRhID0gJmR2aV9wYW5lbCwKIAkucGh5LmRwaS5kYXRhX2xpbmVzID0gMjQsCi0JLnJlc2V0X2dwaW8gPSAxNzAsCi0JLnBsYXRmb3JtX2VuYWJsZSA9IGJlYWdsZV9lbmFibGVfZHZpLAotCS5wbGF0Zm9ybV9kaXNhYmxlID0gYmVhZ2xlX2Rpc2FibGVfZHZpLAorCS5yZXNldF9ncGlvID0gLUVJTlZBTCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIGJlYWdsZV90dl9kZXZpY2UgPSB7CkBAIC0yNzMsNiArMjc5LDggQEAKIHN0YXRpYyBpbnQgYmVhZ2xlX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCiB7CisJaW50IHI7CisKIAlpZiAob21hcDNfYmVhZ2xlX2dldF9yZXYoKSA9PSBPTUFQM0JFQUdMRV9CT0FSRF9YTSkgewogCQltbWNbMF0uZ3Bpb193cCA9IC1FSU5WQUw7CiAJfSBlbHNlIGlmICgob21hcDNfYmVhZ2xlX2dldF9yZXYoKSA9PSBPTUFQM0JFQUdMRV9CT0FSRF9DMV8zKSB8fApAQCAtMjkzLDE3ICszMDEsNjMgQEAKIAkvKiBSRVZJU0lUOiBuZWVkIGVoY2ktb21hcCBob29rcyBmb3IgZXh0ZXJuYWwgVkJVUwogCSAqIHBvd2VyIHN3aXRjaCBhbmQgb3ZlcmN1cnJlbnQgZGV0ZWN0CiAJICovCisJaWYgKG9tYXAzX2JlYWdsZV9nZXRfcmV2KCkgIT0gT01BUDNCRUFHTEVfQk9BUkRfWE0pIHsKKwkJciA9IGdwaW9fcmVxdWVzdChncGlvICsgMSwgIkVIQ0lfbk9DIik7CisJCWlmICghcikgeworCQkJciA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8gKyAxKTsKKwkJCWlmIChyKQorCQkJCWdwaW9fZnJlZShncGlvICsgMSk7CisJCX0KKwkJaWYgKHIpCisJCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gY29uZmlndXJlIEVIQ0lfbk9DXG4iLCBfX2Z1bmNfXyk7CisJfQogCi0JZ3Bpb19yZXF1ZXN0KGdwaW8gKyAxLCAiRUhDSV9uT0MiKTsKLQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvICsgMSk7Ci0KLQkvKiBUV0w0MDMwX0dQSU9fTUFYICsgMCA9PSBsZWRBLCBFSENJIG5FTl9VU0JfUFdSIChvdXQsIGFjdGl2ZSBsb3cpICovCisJLyoKKwkgKiBUV0w0MDMwX0dQSU9fTUFYICsgMCA9PSBsZWRBLCBFSENJIG5FTl9VU0JfUFdSIChvdXQsIFhNIGFjdGl2ZQorCSAqIGhpZ2ggLyBvdGhlcnMgYWN0aXZlIGxvdykKKwkgKi8KIAlncGlvX3JlcXVlc3QoZ3BpbyArIFRXTDQwMzBfR1BJT19NQVgsICJuRU5fVVNCX1BXUiIpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgVFdMNDAzMF9HUElPX01BWCwgMCk7CisJaWYgKG9tYXAzX2JlYWdsZV9nZXRfcmV2KCkgPT0gT01BUDNCRUFHTEVfQk9BUkRfWE0pCisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgVFdMNDAzMF9HUElPX01BWCwgMSk7CisJZWxzZQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbyArIFRXTDQwMzBfR1BJT19NQVgsIDApOworCisJLyogRFZJIHJlc2V0IEdQSU8gaXMgZGlmZmVyZW50IGJldHdlZW4gYmVhZ2xlIHJldmlzaW9ucyAqLworCWlmIChvbWFwM19iZWFnbGVfZ2V0X3JldigpID09IE9NQVAzQkVBR0xFX0JPQVJEX1hNKQorCQliZWFnbGVfZHZpX2RldmljZS5yZXNldF9ncGlvID0gMTI5OworCWVsc2UKKwkJYmVhZ2xlX2R2aV9kZXZpY2UucmVzZXRfZ3BpbyA9IDE3MDsKIAogCS8qIFRXTDQwMzBfR1BJT19NQVggKyAxID09IGxlZEIsIFBNVV9TVEFUIChvdXQsIGFjdGl2ZSBsb3cgTEVEKSAqLwogCWdwaW9fbGVkc1syXS5ncGlvID0gZ3BpbyArIFRXTDQwMzBfR1BJT19NQVggKyAxOwogCisJLyoKKwkgKiBncGlvICsgMSBvbiBYbSBjb250cm9scyB0aGUgVEZQNDEwJ3MgZW5hYmxlIGxpbmUgKGFjdGl2ZSBsb3cpCisJICogZ3BpbyArIDIgY29udHJvbCB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBib2FyZCByZXYgYXMgZm9sbG93czoKKwkgKiBQNy9QOCByZXZpc2lvbnMocHJvdG90eXBlKTogQ2FtZXJhIEVOCisJICogQTIrIHJldmlzaW9ucyAocHJvZHVjdGlvbik6IExETyAoc3VwcGxpZXMgRFZJLCBzZXJpYWwsIGxlZCBibG9ja3MpCisJICovCisJaWYgKG9tYXAzX2JlYWdsZV9nZXRfcmV2KCkgPT0gT01BUDNCRUFHTEVfQk9BUkRfWE0pIHsKKwkJciA9IGdwaW9fcmVxdWVzdChncGlvICsgMSwgIm5EVklfUFdSX0VOIik7CisJCWlmICghcikgeworCQkJciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgMSwgMCk7CisJCQlpZiAocikKKwkJCQlncGlvX2ZyZWUoZ3BpbyArIDEpOworCQl9CisJCWlmIChyKQorCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGNvbmZpZ3VyZSBuRFZJX1BXUl9FTlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXIgPSBncGlvX3JlcXVlc3QoZ3BpbyArIDIsICJEVklfTERPX0VOIik7CisJCWlmICghcikgeworCQkJciA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvICsgMiwgMSk7CisJCQlpZiAocikKKwkJCQlncGlvX2ZyZWUoZ3BpbyArIDIpOworCQl9CisJCWlmIChyKQorCQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGNvbmZpZ3VyZSBEVklfTERPX0VOXG4iLAorCQkJCV9fZnVuY19fKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM2V2bS5jCmluZGV4IDNkZThkOWIuLjMyM2MzODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNldm0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzZXZtLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxwbGF0L2NvbW1vbi5oPgogI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KICNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3BhbmVsLWdlbmVyaWMtZHBpLmg+CiAKICNpbmNsdWRlICJtdXguaCIKICNpbmNsdWRlICJzZHJhbS1taWNyb24tbXQ0NmgzMm0zMmxmLTYuaCIKQEAgLTMwMSwxNSArMzAyLDIwIEBACiAJZHZpX2VuYWJsZWQgPSAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwM19ldm1fZHZpX2RldmljZSA9IHsKLQkubmFtZQkJCT0gImR2aSIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX3BhbmVsIiwKLQkudHlwZQkJCT0gT01BUF9ESVNQTEFZX1RZUEVfRFBJLAotCS5waHkuZHBpLmRhdGFfbGluZXMJPSAyNCwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBkdmlfcGFuZWwgPSB7CisJLm5hbWUJCQk9ICJnZW5lcmljIiwKIAkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDNfZXZtX2VuYWJsZV9kdmksCiAJLnBsYXRmb3JtX2Rpc2FibGUJPSBvbWFwM19ldm1fZGlzYWJsZV9kdmksCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwM19ldm1fZHZpX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImR2aSIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkuZHJpdmVyX25hbWUJCT0gImdlbmVyaWNfZHBpX3BhbmVsIiwKKwkuZGF0YQkJCT0gJmR2aV9wYW5lbCwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqb21hcDNfZXZtX2Rzc19kZXZpY2VzW10gPSB7CiAJJm9tYXAzX2V2bV9sY2RfZGV2aWNlLAogCSZvbWFwM19ldm1fdHZfZGV2aWNlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDNzdGFsa2VyLmMKaW5kZXggOWRmOWQ5My4uMmEyZGFkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwM3N0YWxrZXIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW9tYXAzc3RhbGtlci5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8cGxhdC9uYW5kLmg+CiAjaW5jbHVkZSA8cGxhdC91c2IuaD4KICNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxwbGF0L3BhbmVsLWdlbmVyaWMtZHBpLmg+CiAKICNpbmNsdWRlIDxwbGF0L21jc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgpAQCAtMTYwLDE1ICsxNjEsMjAgQEAKIAlsY2RfZW5hYmxlZCA9IDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXAzX3N0YWxrZXJfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJCT0gImxjZCIsCi0JLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX3BhbmVsIiwKLQkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCi0JLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKK3N0YXRpYyBzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSBsY2RfcGFuZWwgPSB7CisJLm5hbWUJCQk9ICJnZW5lcmljIiwKIAkucGxhdGZvcm1fZW5hYmxlCT0gb21hcDNfc3RhbGtlcl9lbmFibGVfbGNkLAogCS5wbGF0Zm9ybV9kaXNhYmxlCT0gb21hcDNfc3RhbGtlcl9kaXNhYmxlX2xjZCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIG9tYXAzX3N0YWxrZXJfbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRhdGEJCQk9ICZsY2RfcGFuZWwsCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCit9OworCiBzdGF0aWMgaW50IG9tYXAzX3N0YWxrZXJfZW5hYmxlX3R2KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlyZXR1cm4gMDsKQEAgLTIwOCwxNSArMjE0LDIwIEBACiAJZHZpX2VuYWJsZWQgPSAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwM19zdGFsa2VyX2R2aV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJkdmkiLAotCS5kcml2ZXJfbmFtZQkJPSAiZ2VuZXJpY19wYW5lbCIsCi0JLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKLQkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCitzdGF0aWMgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgZHZpX3BhbmVsID0geworCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCiAJLnBsYXRmb3JtX2VuYWJsZQk9IG9tYXAzX3N0YWxrZXJfZW5hYmxlX2R2aSwKIAkucGxhdGZvcm1fZGlzYWJsZQk9IG9tYXAzX3N0YWxrZXJfZGlzYWJsZV9kdmksCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RldmljZSBvbWFwM19zdGFsa2VyX2R2aV9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJkdmkiLAorCS50eXBlCQkJPSBPTUFQX0RJU1BMQVlfVFlQRV9EUEksCisJLmRyaXZlcl9uYW1lCQk9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJLmRhdGEJCQk9ICZkdmlfcGFuZWwsCisJLnBoeS5kcGkuZGF0YV9saW5lcwk9IDI0LAorfTsKKwogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKm9tYXAzX3N0YWxrZXJfZHNzX2RldmljZXNbXSA9IHsKIAkmb21hcDNfc3RhbGtlcl9sY2RfZGV2aWNlLAogCSZvbWFwM19zdGFsa2VyX3R2X2RldmljZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtb21hcDRwYW5kYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKaW5kZXggMzA5NGUyMC4uZTAwMWEwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1vbWFwNHBhbmRhLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtOTUsNyArOTYsMTYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBvbWFwNF9laGNpX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBjbGsgKnBoeV9yZWZfY2xrOwogCisJLyogRlJFRl9DTEszIHByb3ZpZGVzIHRoZSAxOS4yIE1IeiByZWZlcmVuY2UgY2xvY2sgdG8gdGhlIFBIWSAqLworCXBoeV9yZWZfY2xrID0gY2xrX2dldChOVUxMLCAiYXV4Y2xrM19jayIpOworCWlmIChJU19FUlIocGh5X3JlZl9jbGspKSB7CisJCXByX2VycigiQ2Fubm90IHJlcXVlc3QgYXV4Y2xrM1xuIik7CisJCWdvdG8gZXJyb3IxOworCX0KKwljbGtfc2V0X3JhdGUocGh5X3JlZl9jbGssIDE5MjAwMDAwKTsKKwljbGtfZW5hYmxlKHBoeV9yZWZfY2xrKTsKIAogCS8qIGRpc2FibGUgdGhlIHBvd2VyIHRvIHRoZSB1c2IgaHViIHByaW9yIHRvIGluaXQgKi8KIAlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19IVUJfUE9XRVIsICJodWJfcG93ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1kaXNwbGF5LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2Q0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXpvb20tZGlzcGxheS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBNb2RpZmllZCBmcm9tIG1hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvdHdsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHBsYXQvbWNzcGkuaD4KKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKworI2RlZmluZSBMQ0RfUEFORUxfUkVTRVRfR1BJT19QUk9ECTk2CisjZGVmaW5lIExDRF9QQU5FTF9SRVNFVF9HUElPX1BJTE9UCTU1CisjZGVmaW5lIExDRF9QQU5FTF9RVkdBX0dQSU8JCTU2CisKK3N0YXRpYyB2b2lkIHpvb21fbGNkX3BhbmVsX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgbGNkX3BhbmVsX3Jlc2V0X2dwaW87CisKKwlsY2RfcGFuZWxfcmVzZXRfZ3BpbyA9IChvbWFwX3JldigpID4gT01BUDM0MzBfUkVWX0VTM18wKSA/CisJCQlMQ0RfUEFORUxfUkVTRVRfR1BJT19QUk9EIDoKKwkJCUxDRF9QQU5FTF9SRVNFVF9HUElPX1BJTE9UOworCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KGxjZF9wYW5lbF9yZXNldF9ncGlvLCAibGNkIHJlc2V0Iik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgTENEIHJlc2V0IEdQSU8gKGdwaW8lZCkuXG4iLAorCQkJbGNkX3BhbmVsX3Jlc2V0X2dwaW8pOworCQlyZXR1cm47CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChsY2RfcGFuZWxfcmVzZXRfZ3BpbywgMSk7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoTENEX1BBTkVMX1FWR0FfR1BJTywgImxjZCBxdmdhIik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgTENEX1BBTkVMX1FWR0FfR1BJTyAoZ3BpbyVkKS5cbiIsCisJCQlMQ0RfUEFORUxfUVZHQV9HUElPKTsKKwkJZ290byBlcnIwOworCX0KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoTENEX1BBTkVMX1FWR0FfR1BJTywgMSk7CisKKwlyZXR1cm47CitlcnIwOgorCWdwaW9fZnJlZShsY2RfcGFuZWxfcmVzZXRfZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgem9vbV9wYW5lbF9lbmFibGVfbGNkKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgem9vbV9wYW5lbF9kaXNhYmxlX2xjZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7Cit9CisKKy8qCisgKiBQV01BL0IgcmVnaXN0ZXIgb2Zmc2V0cyAoVFdMNDAzMF9NT0RVTEVfUFdNQSkKKyAqLworI2RlZmluZSBUV0xfSU5UQlJfUE1CUjEJMHhECisjZGVmaW5lIFRXTF9JTlRCUl9HUEJSMQkweEMKKyNkZWZpbmUgVFdMX0xFRF9QV01PTgkweDAKKyNkZWZpbmUgVFdMX0xFRF9QV01PRkYJMHgxCisKK3N0YXRpYyBpbnQgem9vbV9zZXRfYmxfaW50ZW5zaXR5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl1OCBtdXhfcHdtLCBlbmJfcHdtOworCisJaWYgKGxldmVsID4gMTAwKQorCQlyZXR1cm4gLTE7CisKKwl0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfSU5UQlIsICZtdXhfcHdtLCBUV0xfSU5UQlJfUE1CUjEpOworCXR3bF9pMmNfcmVhZF91OChUV0w0MDMwX01PRFVMRV9JTlRCUiwgJmVuYl9wd20sIFRXTF9JTlRCUl9HUEJSMSk7CisKKwlpZiAobGV2ZWwgPT0gMCkgeworCQkvKiBkaXNhYmxlIHB3bTEgb3V0cHV0IGFuZCBjbG9jayAqLworCQllbmJfcHdtID0gZW5iX3B3bSAmIDB4RjU7CisJCS8qIGNoYW5nZSBwd20xIHBpbiB0byBncGlvIHBpbiAqLworCQltdXhfcHdtID0gbXV4X3B3bSAmIDB4Q0Y7CisJCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5UQlIsCisJCQkJCWVuYl9wd20sIFRXTF9JTlRCUl9HUEJSMSk7CisJCXR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5UQlIsCisJCQkJCW11eF9wd20sIFRXTF9JTlRCUl9QTUJSMSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghKChlbmJfcHdtICYgMHhBKSAmJiAobXV4X3B3bSAmIDB4MzApKSkgeworCQkvKiBjaGFuZ2UgZ3BpbyBwaW4gdG8gcHdtMSBwaW4gKi8KKwkJbXV4X3B3bSA9IG11eF9wd20gfCAweDMwOworCQkvKiBlbmFibGUgcHdtMSBvdXRwdXQgYW5kIGNsb2NrKi8KKwkJZW5iX3B3bSA9IGVuYl9wd20gfCAweDBBOworCQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0lOVEJSLAorCQkJCQltdXhfcHdtLCBUV0xfSU5UQlJfUE1CUjEpOworCQl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX0lOVEJSLAorCQkJCQllbmJfcHdtLCBUV0xfSU5UQlJfR1BCUjEpOworCX0KKworCWMgPSAoKDUwICogKDEwMCAtIGxldmVsKSkgLyAxMDApICsgMTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTTEsIDB4N0YsIFRXTF9MRURfUFdNT0ZGKTsKKwl0d2xfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BXTTEsIGMsIFRXTF9MRURfUFdNT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlIHpvb21fbGNkX2RldmljZSA9IHsKKwkubmFtZQkJCT0gImxjZCIsCisJLmRyaXZlcl9uYW1lCQk9ICJORUNfODA0OF9wYW5lbCIsCisJLnR5cGUJCQk9IE9NQVBfRElTUExBWV9UWVBFX0RQSSwKKwkucGh5LmRwaS5kYXRhX2xpbmVzCT0gMjQsCisJLnBsYXRmb3JtX2VuYWJsZQk9IHpvb21fcGFuZWxfZW5hYmxlX2xjZCwKKwkucGxhdGZvcm1fZGlzYWJsZQk9IHpvb21fcGFuZWxfZGlzYWJsZV9sY2QsCisJLm1heF9iYWNrbGlnaHRfbGV2ZWwJPSAxMDAsCisJLnNldF9iYWNrbGlnaHQJCT0gem9vbV9zZXRfYmxfaW50ZW5zaXR5LAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKnpvb21fZHNzX2RldmljZXNbXSA9IHsKKwkmem9vbV9sY2RfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIHpvb21fZHNzX2RhdGEgPSB7CisJLm51bV9kZXZpY2VzCQk9IEFSUkFZX1NJWkUoem9vbV9kc3NfZGV2aWNlcyksCisJLmRldmljZXMJCT0gem9vbV9kc3NfZGV2aWNlcywKKwkuZGVmYXVsdF9kZXZpY2UJCT0gJnpvb21fbGNkX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHpvb21fZHNzX2RldmljZSA9IHsKKwkubmFtZQkJCQk9ICJvbWFwZHNzIiwKKwkuaWQJCQkJPSAtMSwKKwkuZGV2CQkJCT0geworCQkucGxhdGZvcm1fZGF0YQkJPSAmem9vbV9kc3NfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnIGRzc19sY2RfbWNzcGlfY29uZmlnID0geworCS50dXJib19tb2RlCQk9IDEsCisJLnNpbmdsZV9jaGFubmVsCT0gMSwgIC8qIDA6IHNsYXZlLCAxOiBtYXN0ZXIgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gbmVjXzgwNDhfc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLm1vZGFsaWFzCQk9ICJuZWNfODA0OF9zcGkiLAorCQkuYnVzX251bQkJPSAxLAorCQkuY2hpcF9zZWxlY3QJCT0gMiwKKwkJLm1heF9zcGVlZF9oegkJPSAzNzUwMDAsCisJCS5jb250cm9sbGVyX2RhdGEJPSAmZHNzX2xjZF9tY3NwaV9jb25maWcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp6b29tX2Rpc3BsYXlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnpvb21fZHNzX2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHpvb21fZGlzcGxheV9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoem9vbV9kaXNwbGF5X2RldmljZXMsCisJCQkJQVJSQVlfU0laRSh6b29tX2Rpc3BsYXlfZGV2aWNlcykpOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKG5lY184MDQ4X3NwaV9ib2FyZF9pbmZvLAorCQkJCUFSUkFZX1NJWkUobmVjXzgwNDhfc3BpX2JvYXJkX2luZm8pKTsKKwl6b29tX2xjZF9wYW5lbF9pbml0KCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS1wZXJpcGhlcmFscy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLXBlcmlwaGVyYWxzLmMKaW5kZXggM2ZiZDBlZC4uZTBlMDQwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLXBlcmlwaGVyYWxzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLXBlcmlwaGVyYWxzLmMKQEAgLTM1LDYgKzM1LDggQEAKICNkZWZpbmUgT01BUF9aT09NX1dMQU5fUE1FTkFfR1BJTwkoMTAxKQogI2RlZmluZSBPTUFQX1pPT01fV0xBTl9JUlFfR1BJTwkJKDE2MikKIAorI2RlZmluZSBMQ0RfUEFORUxfRU5BQkxFX0dQSU8JCSg3ICsgT01BUF9NQVhfR1BJT19MSU5FUykKKwogLyogWm9vbTIgaGFzIFF3ZXJ0eSBrZXlib2FyZCovCiBzdGF0aWMgdWludDMyX3QgYm9hcmRfa2V5bWFwW10gPSB7CiAJS0VZKDAsIDAsIEtFWV9FKSwKQEAgLTE5MCw3ICsxOTIsNyBAQAogCX0sCiB9OwogCi1zdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgb21hcF96b29tX3dsYW5fZGF0YSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSBvbWFwX3pvb21fd2xhbl9kYXRhIF9faW5pdGRhdGEgPSB7CiAJLmlycSA9IE9NQVBfR1BJT19JUlEoT01BUF9aT09NX1dMQU5fSVJRX0dQSU8pLAogCS8qIFpPT00gcmVmIGNsb2NrIGlzIDI2IE1IeiAqLwogCS5ib2FyZF9yZWZfY2xvY2sgPSAxLApAQCAtMjI0LDkgKzIyNiw0MyBAQAogCXt9ICAgICAgLyogVGVybWluYXRvciAqLwogfTsKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHpvb21fdnBsbDJfc3VwcGx5ID0KKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzIik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB6b29tX3ZkZGFfZGFjX3N1cHBseSA9CisJUkVHVUxBVE9SX1NVUFBMWSgidmRkYV9kYWMiLCAib21hcGRzcyIpOworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgem9vbV92cGxsMiA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS5taW5fdVYgICAgICAgICAgICAgICAgID0gMTgwMDAwMCwKKwkJLm1heF91ViAgICAgICAgICAgICAgICAgPSAxODAwMDAwLAorCQkudmFsaWRfbW9kZXNfbWFzayAgICAgICA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAorCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCisJCS52YWxpZF9vcHNfbWFzayAgICAgICAgID0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCisJCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJfSwKKwkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCQk9IDEsCisJLmNvbnN1bWVyX3N1cHBsaWVzCQk9ICZ6b29tX3ZwbGwyX3N1cHBseSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB6b29tX3ZkYWMgPSB7CisJLmNvbnN0cmFpbnRzID0geworCQkubWluX3VWICAgICAgICAgICAgICAgICA9IDE4MDAwMDAsCisJCS5tYXhfdVYgICAgICAgICAgICAgICAgID0gMTgwMDAwMCwKKwkJLnZhbGlkX21vZGVzX21hc2sgICAgICAgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKKwkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAorCQkudmFsaWRfb3BzX21hc2sgICAgICAgICA9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQorCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwkJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwkJPSAmem9vbV92ZGRhX2RhY19zdXBwbHksCit9OworCiBzdGF0aWMgaW50IHpvb21fdHdsX2dwaW9fc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAogCQl1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuZ3BpbykKIHsKKwlpbnQgcmV0OworCiAJLyogZ3BpbyArIDAgaXMgIm1tYzBfY2QiIChpbnB1dC9JUlEpICovCiAJbW1jWzBdLmdwaW9fY2QgPSBncGlvICsgMDsKIAlvbWFwMl9oc21tY19pbml0KG1tYyk7CkBAIC0yMzgsMTEgKzI3NCwxOSBAQAogCXpvb21fdnNpbV9zdXBwbHkuZGV2ID0gbW1jWzBdLmRldjsKIAl6b29tX3ZtbWMyX3N1cHBseS5kZXYgPSBtbWNbMV0uZGV2OwogCi0JcmV0dXJuIDA7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0KExDRF9QQU5FTF9FTkFCTEVfR1BJTywgImxjZCBlbmFibGUiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGdldCBMQ0RfUEFORUxfRU5BQkxFX0dQSU8gKGdwaW8lZCkuXG4iLAorCQkJCUxDRF9QQU5FTF9FTkFCTEVfR1BJTyk7CisJCXJldHVybiByZXQ7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChMQ0RfUEFORUxfRU5BQkxFX0dQSU8sIDApOworCisJcmV0dXJuIHJldDsKIH0KIAogLyogRVhUTVVURSBjYWxsYmFjayBmdW5jdGlvbiAqLwotdm9pZCB6b29tMl9zZXRfaHNfZXh0bXV0ZShpbnQgbXV0ZSkKK3N0YXRpYyB2b2lkIHpvb20yX3NldF9oc19leHRtdXRlKGludCBtdXRlKQogewogCWdwaW9fc2V0X3ZhbHVlKFpPT00yX0hFQURTRVRfRVhUTVVURV9HUElPLCBtdXRlKTsKIH0KQEAgLTMwMSw3ICszNDUsOCBAQAogCS52bW1jMSAgICAgICAgICA9ICZ6b29tX3ZtbWMxLAogCS52bW1jMiAgICAgICAgICA9ICZ6b29tX3ZtbWMyLAogCS52c2ltICAgICAgICAgICA9ICZ6b29tX3ZzaW0sCi0KKwkudnBsbDIJCT0gJnpvb21fdnBsbDIsCisJLnZkYWMJCT0gJnpvb21fdmRhYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSB6b29tX2kyY19ib2FyZGluZm9bXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtem9vbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKaW5kZXggZTA0MWM1My4uZTI2NzU0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC16b29tLmMKQEAgLTEzMCw2ICsxMzAsNyBAQAogCQkJQVJSQVlfU0laRSh6b29tX25hbmRfcGFydGl0aW9ucyksIFpPT01fTkFORF9DUyk7CiAJem9vbV9kZWJ1Z2JvYXJkX2luaXQoKTsKIAl6b29tX3BlcmlwaGVyYWxzX2luaXQoKTsKKwl6b29tX2Rpc3BsYXlfaW5pdCgpOwogfQogCiBNQUNISU5FX1NUQVJUKE9NQVBfWk9PTTIsICJPTUFQIFpvb20yIGJvYXJkIikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYwppbmRleCBkM2FiMWM5ZS4uNDAzYTRhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9jazN4eHhfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2szeHh4X2RhdGEuYwpAQCAtMzI4Niw3ICszMjg2LDcgQEAKIAlDTEsoTlVMTCwJImNwZWZ1c2VfZmNrIiwJJmNwZWZ1c2VfZmNrLAlDS18zNDMwRVMyUExVUyB8IENLX0FNMzVYWCB8IENLXzM2WFgpLAogCUNMSyhOVUxMLAkidHNfZmNrIiwJJnRzX2ZjaywJQ0tfMzQzMEVTMlBMVVMgfCBDS19BTTM1WFggfCBDS18zNlhYKSwKIAlDTEsoTlVMTCwJInVzYnRsbF9mY2siLAkmdXNidGxsX2ZjaywJQ0tfMzQzMEVTMlBMVVMgfCBDS19BTTM1WFggfCBDS18zNlhYKSwKLQlDTEsoImVoY2ktb21hcC4wIiwJInVzYnRsbF9mY2siLAkmdXNidGxsX2ZjaywJQ0tfMzQzMEVTMiB8IENLX0FNMzVYWCksCisJQ0xLKCJlaGNpLW9tYXAuMCIsCSJ1c2J0bGxfZmNrIiwJJnVzYnRsbF9mY2ssCUNLXzM0MzBFUzJQTFVTIHwgQ0tfQU0zNVhYIHwgQ0tfMzZYWCksCiAJQ0xLKCJvbWFwLW1jYnNwLjEiLAkicHJjbV9mY2siLAkmY29yZV85Nm1fZmNrLAlDS18zWFhYKSwKIAlDTEsoIm9tYXAtbWNic3AuNSIsCSJwcmNtX2ZjayIsCSZjb3JlXzk2bV9mY2ssCUNLXzNYWFgpLAogCUNMSyhOVUxMLAkiY29yZV85Nm1fZmNrIiwJJmNvcmVfOTZtX2ZjaywJQ0tfM1hYWCksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL2Nsb2NrZG9tYWluLmgKaW5kZXggZGUzZmFhMi4uOWI0NTljMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbG9ja2RvbWFpbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY2xvY2tkb21haW4uaApAQCAtMTAzLDkgKzEwMyw3IEBACiAJCWNvbnN0IGNoYXIgKm5hbWU7CiAJCXN0cnVjdCBwb3dlcmRvbWFpbiAqcHRyOwogCX0gcHdyZG07Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMikgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMykKIAljb25zdCB1MTYgY2xrdHJjdHJsX21hc2s7Ci0jZW5kaWYKIAljb25zdCB1OCBmbGFnczsKIAljb25zdCB1OCBkZXBfYml0OwogCWNvbnN0IHU4IHByY21fcGFydGl0aW9uOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlMzR4eC5jCmluZGV4IGYzZTA0M2YuLmY3YjIyYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY3B1aWRsZTM0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGUzNHh4LmMKQEAgLTQ3LDYgKzQ3LDggQEAKIAogI2RlZmluZSBPTUFQM19TVEFURV9NQVggT01BUDNfU1RBVEVfQzcKIAorI2RlZmluZSBDUFVJRExFX0ZMQUdfQ0hFQ0tfQk0JMHgxMDAwMAkvKiB1c2Ugb21hcDNfZW50ZXJfaWRsZV9ibSgpICovCisKIHN0cnVjdCBvbWFwM19wcm9jZXNzb3JfY3ggewogCXU4IHZhbGlkOwogCXU4IHR5cGU7CkBAIC0yNTIsNyArMjU0LDcgQEAKIAkgKiBGSVhNRTogd2UgY3VycmVudGx5IG1hbmFnZSBkZXZpY2Utc3BlY2lmaWMgaWRsZSBzdGF0ZXMKIAkgKiAgICAgICAgZm9yIFBFUiBhbmQgQ09SRSBpbiBjb21iaW5hdGlvbiB3aXRoIENQVS1zcGVjaWZpYwogCSAqICAgICAgICBpZGxlIHN0YXRlcy4gIFRoaXMgaXMgd3JvbmcsIGFuZCBkZXZpY2Utc3BlY2lmaWMKLQkgKiAgICAgICAgaWRsZSBtYW5hZ21lbnQgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIG91dCBpbnRvIAorCSAqICAgICAgICBpZGxlIG1hbmFnZW1lbnQgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIG91dCBpbnRvIAogCSAqICAgICAgICBpdHMgb3duIGNvZGUuCiAJICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMKaW5kZXggMzgxZjRlYi4uMmM5YzkxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kZXZpY2VzLmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogYXJjaF9pbml0Y2FsbChvbWFwMl9pbml0X2RldmljZXMpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfT01BUF9XQVRDSERPR19NT0RVTEUpCi1zdHJ1Y3Qgb21hcF9kZXZpY2VfcG1fbGF0ZW5jeSBvbWFwX3dkdF9sYXRlbmN5W10gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfZGV2aWNlX3BtX2xhdGVuY3kgb21hcF93ZHRfbGF0ZW5jeVtdID0gewogCVswXSA9IHsKIAkJLmRlYWN0aXZhdGVfZnVuYyA9IG9tYXBfZGV2aWNlX2lkbGVfaHdtb2RzLAogCQkuYWN0aXZhdGVfZnVuYyAgID0gb21hcF9kZXZpY2VfZW5hYmxlX2h3bW9kcywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2JvYXJkLXpvb20uaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvaW5jbHVkZS9tYWNoL2JvYXJkLXpvb20uaAppbmRleCBmOTNjYTM5Li5kMjBiZDljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2luY2x1ZGUvbWFjaC9ib2FyZC16b29tLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pbmNsdWRlL21hY2gvYm9hcmQtem9vbS5oCkBAIC0xLDkgKzEsMTIgQEAKIC8qCiAgKiBEZWZpbmVzIGZvciB6b29tIGJvYXJkcwogICovCisjaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+CisKICNkZWZpbmUgWk9PTV9OQU5EX0NTICAgIDAKIAogZXh0ZXJuIGludCBfX2luaXQgem9vbV9kZWJ1Z2JvYXJkX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgem9vbV9wZXJpcGhlcmFsc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHpvb21fZGlzcGxheV9pbml0KHZvaWQpOwogCiAjZGVmaW5lIFpPT00yX0hFQURTRVRfRVhUTVVURV9HUElPCTE1MwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4LmMKaW5kZXggMTdiZDYzOS4uZGY4ZDJmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eC5jCkBAIC04OTMsNyArODkzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAltID0gJmVudHJ5LT5tdXg7Ci0JbWVtY3B5KG0sIHNyYywgc2l6ZW9mKHN0cnVjdCBvbWFwX211eF9lbnRyeSkpOworCWVudHJ5LT5tdXggPSAqc3JjOwogCiAjaWZkZWYgQ09ORklHX09NQVBfTVVYCiAJaWYgKG9tYXBfbXV4X2NvcHlfbmFtZXMoc3JjLCBtKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tdXgzNHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eDM0eHguYwppbmRleCA0NDBjOThlLi4xN2Y4MGU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eDM0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL211eDM0eHguYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAgKiBTaWduYWxzIGRpZmZlcmVudCBvbiBDQkMgcGFja2FnZSBjb21wYXJlZCB0byB0aGUgc3VwZXJzZXQKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ0JDKQotc3RydWN0IG9tYXBfbXV4IF9faW5pdGRhdGEgb21hcDNfY2JjX3N1YnNldFtdID0geworc3RhdGljIHN0cnVjdCBvbWFwX211eCBfX2luaXRkYXRhIG9tYXAzX2NiY19zdWJzZXRbXSA9IHsKIAl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAogfTsKICNlbHNlCkBAIC03MjEsNyArNzIxLDcgQEAKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykJXAogCQkmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ0JDKQotc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXAzX2NiY19iYWxsW10gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXAzX2NiY19iYWxsW10gPSB7CiAJX09NQVAzX0JBTExFTlRSWShDQU1fRDAsICJhZTE2IiwgTlVMTCksCiAJX09NQVAzX0JBTExFTlRSWShDQU1fRDEsICJhZTE1IiwgTlVMTCksCiAJX09NQVAzX0JBTExFTlRSWShDQU1fRDEwLCAiZDI1IiwgTlVMTCksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL211eDQ0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCmluZGV4IDk4MGYxMWQuLmMzMjJlN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbXV4NDR4eC5jCkBAIC01NDQsNyArNTQ0LDcgQEAKICAqLwogI2lmIGRlZmluZWQoQ09ORklHX09NQVBfTVVYKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykJCVwKIAkJJiYgZGVmaW5lZChDT05GSUdfT01BUF9QQUNLQUdFX0NCTCkKLXN0cnVjdCBvbWFwX2JhbGwgX19pbml0ZGF0YSBvbWFwNF9jb3JlX2NibF9iYWxsW10gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXA0X2NvcmVfY2JsX2JhbGxbXSA9IHsKIAlfT01BUDRfQkFMTEVOVFJZKEdQTUNfQUQwLCAiYzEyIiwgTlVMTCksCiAJX09NQVA0X0JBTExFTlRSWShHUE1DX0FEMSwgImQxMiIsIE5VTEwpLAogCV9PTUFQNF9CQUxMRU5UUlkoR1BNQ19BRDIsICJjMTMiLCBOVUxMKSwKQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgKi8KICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX01VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCQlcCiAJCSYmIGRlZmluZWQoQ09ORklHX09NQVBfUEFDS0FHRV9DQlMpCi1zdHJ1Y3Qgb21hcF9iYWxsIF9faW5pdGRhdGEgb21hcDRfY29yZV9jYnNfYmFsbFtdID0geworc3RhdGljIHN0cnVjdCBvbWFwX2JhbGwgX19pbml0ZGF0YSBvbWFwNF9jb3JlX2Nic19iYWxsW10gPSB7CiAJX09NQVA0X0JBTExFTlRSWShHUE1DX0FEMCwgImMxMiIsIE5VTEwpLAogCV9PTUFQNF9CQUxMRU5UUlkoR1BNQ19BRDEsICJkMTIiLCBOVUxMKSwKIAlfT01BUDRfQkFMTEVOVFJZKEdQTUNfQUQyLCAiYzEzIiwgTlVMTCksCkBAIC0xNTQ2LDcgKzE1NDYsNyBAQAogICovCiAjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NVVgpICYmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQkJXAogCQkmJiBkZWZpbmVkKENPTkZJR19PTUFQX1BBQ0tBR0VfQ0JMKQotc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXA0X3drdXBfY2JsX2Nic19iYWxsW10gPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfYmFsbCBfX2luaXRkYXRhIG9tYXA0X3drdXBfY2JsX2Nic19iYWxsW10gPSB7CiAJX09NQVA0X0JBTExFTlRSWShTSU1fSU8sICJoNCIsIE5VTEwpLAogCV9PTUFQNF9CQUxMRU5UUlkoU0lNX0NMSywgImoyIiwgTlVMTCksCiAJX09NQVA0X0JBTExFTlRSWShTSU1fUkVTRVQsICJnMiIsIE5VTEwpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3R3bC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX3R3bC5jCmluZGV4IDE1ZjhjNmMuLjAwZTFkMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF90d2wuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfdHdsLmMKQEAgLTIwLDYgKzIwLDggQEAKIAogI2luY2x1ZGUgPHBsYXQvdm9sdGFnZS5oPgogCisjaW5jbHVkZSAicG0uaCIKKwogI2RlZmluZSBPTUFQM19TUkkyQ19TTEFWRV9BRERSCQkweDEyCiAjZGVmaW5lIE9NQVAzX1ZERF9NUFVfU1JfQ09OVFJPTF9SRUcJMHgwMAogI2RlZmluZSBPTUFQM19WRERfQ09SRV9TUl9DT05UUk9MX1JFRwkweDAxCkBAIC02MCwxNyArNjIsMTcgQEAKIAogI2RlZmluZSBSRUdfU01QU19PRkZTRVQgICAgICAgICAweEUwCiAKLXVuc2lnbmVkIGxvbmcgdHdsNDAzMF92c2VsX3RvX3V2KGNvbnN0IHU4IHZzZWwpCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0d2w0MDMwX3ZzZWxfdG9fdXYoY29uc3QgdTggdnNlbCkKIHsKIAlyZXR1cm4gKCgodnNlbCAqIDEyNSkgKyA2MDAwKSkgKiAxMDA7CiB9CiAKLXU4IHR3bDQwMzBfdXZfdG9fdnNlbCh1bnNpZ25lZCBsb25nIHV2KQorc3RhdGljIHU4IHR3bDQwMzBfdXZfdG9fdnNlbCh1bnNpZ25lZCBsb25nIHV2KQogewogCXJldHVybiBESVZfUk9VTkRfVVAodXYgLSA2MDAwMDAsIDEyNTAwKTsKIH0KIAotdW5zaWduZWQgbG9uZyB0d2w2MDMwX3ZzZWxfdG9fdXYoY29uc3QgdTggdnNlbCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHR3bDYwMzBfdnNlbF90b191dihjb25zdCB1OCB2c2VsKQogewogCS8qCiAJICogSW4gVFdMNjAzMCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIFNNUFNfT0ZGU0VUCkBAIC0xMDIsNyArMTA0LDcgQEAKIAkJcmV0dXJuICgoKCh2c2VsIC0gMSkgKiAxMjUpICsgNjAwMCkpICogMTAwOwogfQogCi11OCB0d2w2MDMwX3V2X3RvX3ZzZWwodW5zaWduZWQgbG9uZyB1dikKK3N0YXRpYyB1OCB0d2w2MDMwX3V2X3RvX3ZzZWwodW5zaWduZWQgbG9uZyB1dikKIHsKIAkvKgogCSAqIEluIFRXTDYwMzAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBTTVBTX09GRlNFVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0yNHh4LmMKaW5kZXggZGFjMmQxZC4uOWU1ZGM4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTI0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMjR4eC5jCkBAIC0zNTAsNyArMzUwLDcgQEAKIAllbmFibGVfaGx0KCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgb21hcF9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG9tYXBfcG1fb3BzID0gewogCS5iZWdpbgkJPSBvbWFwMl9wbV9iZWdpbiwKIAkuZW50ZXIJCT0gb21hcDJfcG1fZW50ZXIsCiAJLmVuZAkJPSBvbWFwMl9wbV9lbmQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYwppbmRleCA1YjMyM2YyLi44Y2JiZWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMKQEAgLTYwNSw3ICs2MDUsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBvbWFwX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgb21hcF9wbV9vcHMgPSB7CiAJLmJlZ2luCQk9IG9tYXAzX3BtX2JlZ2luLAogCS5lbmQJCT0gb21hcDNfcG1fZW5kLAogCS5lbnRlcgkJPSBvbWFwM19wbV9lbnRlciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jCmluZGV4IGU5ZjQ4NjJjLi43NmNmZmYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgb21hcF9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIG9tYXBfcG1fb3BzID0gewogCS5iZWdpbgkJPSBvbWFwNF9wbV9iZWdpbiwKIAkuZW5kCQk9IG9tYXA0X3BtX2VuZCwKIAkuZW50ZXIJCT0gb21hcDRfcG1fZW50ZXIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtX2J1cy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wbV9idXMuYwppbmRleCA3ODQ5ODlmLi41YWNkMmFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL3BtX2J1cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvcG1fYnVzLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KIAogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCi1pbnQgb21hcF9wbV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBvbWFwX3BtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCWludCByLCByZXQgPSAwOwpAQCAtMzcsNyArMzcsNyBAQAogCXJldHVybiByZXQ7CiB9OwogCi1pbnQgb21hcF9wbV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG9tYXBfcG1fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlpbnQgcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL3BybTJ4eHhfM3h4eC5oCmluZGV4IDUzZDQ0ZjYuLjQ5NjU0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvcHJtMnh4eF8zeHh4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9wcm0yeHh4XzN4eHguaApAQCAtMjI4LDcgKzIyOCw2NyBAQAogCiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwotCisvKgorICogU3R1YiBvbWFwMnh4eC9vbWFwM3h4eCBmdW5jdGlvbnMgc28gdGhhdCBjb21tb24gZmlsZXMKKyAqIGNvbnRpbnVlIHRvIGJ1aWxkIHdoZW4gY3VzdG9tIGJ1aWxkcyBhcmUgdXNlZAorICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNCkgJiYgIShkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fAlcCisJCQkJCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpKQorc3RhdGljIGlubGluZSB1MzIgb21hcDJfcHJtX3JlYWRfbW9kX3JlZyhzMTYgbW9kdWxlLCB1MTYgaWR4KQoreworCVdBUk4oMSwgInBybTogb21hcDJ4eHgvb21hcDN4eHggc3BlY2lmaWMgZnVuY3Rpb24gYW5kICIKKwkJIm5vdCBzdXBwb3NlIHRvIGJlIHVzZWQgb24gb21hcDRcbiIpOworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIG9tYXAyX3BybV93cml0ZV9tb2RfcmVnKHUzMiB2YWwsIHMxNiBtb2R1bGUsIHUxNiBpZHgpCit7CisJV0FSTigxLCAicHJtOiBvbWFwMnh4eC9vbWFwM3h4eCBzcGVjaWZpYyBmdW5jdGlvbiBhbmQgIgorCQkibm90IHN1cHBvc2UgdG8gYmUgdXNlZCBvbiBvbWFwNFxuIik7Cit9CitzdGF0aWMgaW5saW5lIHUzMiBvbWFwMl9wcm1fcm13X21vZF9yZWdfYml0cyh1MzIgbWFzaywgdTMyIGJpdHMsCisJCXMxNiBtb2R1bGUsIHMxNiBpZHgpCit7CisJV0FSTigxLCAicHJtOiBvbWFwMnh4eC9vbWFwM3h4eCBzcGVjaWZpYyBmdW5jdGlvbiBhbmQgIgorCQkibm90IHN1cHBvc2UgdG8gYmUgdXNlZCBvbiBvbWFwNFxuIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHUzMiBvbWFwMl9wcm1fc2V0X21vZF9yZWdfYml0cyh1MzIgYml0cywgczE2IG1vZHVsZSwgczE2IGlkeCkKK3sKKwlXQVJOKDEsICJwcm06IG9tYXAyeHh4L29tYXAzeHh4IHNwZWNpZmljIGZ1bmN0aW9uIGFuZCAiCisJCSJub3Qgc3VwcG9zZSB0byBiZSB1c2VkIG9uIG9tYXA0XG4iKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdTMyIG9tYXAyX3BybV9jbGVhcl9tb2RfcmVnX2JpdHModTMyIGJpdHMsIHMxNiBtb2R1bGUsIHMxNiBpZHgpCit7CisJV0FSTigxLCAicHJtOiBvbWFwMnh4eC9vbWFwM3h4eCBzcGVjaWZpYyBmdW5jdGlvbiBhbmQgIgorCQkibm90IHN1cHBvc2UgdG8gYmUgdXNlZCBvbiBvbWFwNFxuIik7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHUzMiBvbWFwMl9wcm1fcmVhZF9tb2RfYml0c19zaGlmdChzMTYgZG9tYWluLCBzMTYgaWR4LCB1MzIgbWFzaykKK3sKKwlXQVJOKDEsICJwcm06IG9tYXAyeHh4L29tYXAzeHh4IHNwZWNpZmljIGZ1bmN0aW9uIGFuZCAiCisJCSJub3Qgc3VwcG9zZSB0byBiZSB1c2VkIG9uIG9tYXA0XG4iKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9tYXAyX3BybV9pc19oYXJkcmVzZXRfYXNzZXJ0ZWQoczE2IHBybV9tb2QsIHU4IHNoaWZ0KQoreworCVdBUk4oMSwgInBybTogb21hcDJ4eHgvb21hcDN4eHggc3BlY2lmaWMgZnVuY3Rpb24gYW5kICIKKwkJIm5vdCBzdXBwb3NlIHRvIGJlIHVzZWQgb24gb21hcDRcbiIpOworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgb21hcDJfcHJtX2Fzc2VydF9oYXJkcmVzZXQoczE2IHBybV9tb2QsIHU4IHNoaWZ0KQoreworCVdBUk4oMSwgInBybTogb21hcDJ4eHgvb21hcDN4eHggc3BlY2lmaWMgZnVuY3Rpb24gYW5kICIKKwkJIm5vdCBzdXBwb3NlIHRvIGJlIHVzZWQgb24gb21hcDRcbiIpOworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgb21hcDJfcHJtX2RlYXNzZXJ0X2hhcmRyZXNldChzMTYgcHJtX21vZCwgdTggc2hpZnQpCit7CisJV0FSTigxLCAicHJtOiBvbWFwMnh4eC9vbWFwM3h4eCBzcGVjaWZpYyBmdW5jdGlvbiBhbmQgIgorCQkibm90IHN1cHBvc2UgdG8gYmUgdXNlZCBvbiBvbWFwNFxuIik7CisJcmV0dXJuIDA7Cit9CisjZWxzZQogLyogUG93ZXIvcmVzZXQgbWFuYWdlbWVudCBkb21haW4gcmVnaXN0ZXIgZ2V0L3NldCAqLwogZXh0ZXJuIHUzMiBvbWFwMl9wcm1fcmVhZF9tb2RfcmVnKHMxNiBtb2R1bGUsIHUxNiBpZHgpOwogZXh0ZXJuIHZvaWQgb21hcDJfcHJtX3dyaXRlX21vZF9yZWcodTMyIHZhbCwgczE2IG1vZHVsZSwgdTE2IGlkeCk7CkBAIC0yNDIsNiArMzAyLDcgQEAKIGV4dGVybiBpbnQgb21hcDJfcHJtX2Fzc2VydF9oYXJkcmVzZXQoczE2IHBybV9tb2QsIHU4IHNoaWZ0KTsKIGV4dGVybiBpbnQgb21hcDJfcHJtX2RlYXNzZXJ0X2hhcmRyZXNldChzMTYgcHJtX21vZCwgdTggc2hpZnQpOwogCisjZW5kaWYJLyogQ09ORklHX0FSQ0hfT01BUDQgKi8KICNlbmRpZgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvc2VyaWFsLmMKaW5kZXggYzY0NTc4OC4uMzAyZGE3NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9zZXJpYWwuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NlcmlhbC5jCkBAIC04NTIsNyArODUyLDcgQEAKIH0KIAogLyoqCi0gKiBvbWFwX3NlcmlhbF9pbml0KCkgLSBpbnRpYWxpemUgYWxsIHN1cHBvcnRlZCBzZXJpYWwgcG9ydHMKKyAqIG9tYXBfc2VyaWFsX2luaXQoKSAtIGluaXRpYWxpemUgYWxsIHN1cHBvcnRlZCBzZXJpYWwgcG9ydHMKICAqCiAgKiBJbml0aWFsaXplcyBhbGwgYXZhaWxhYmxlIFVBUlRzIGFzIHNlcmlhbCBwb3J0cy4gUGxhdGZvcm1zCiAgKiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhleSB3YW50IHRvIGhhdmUgZGVmYXVsdCBiZWhhdmlvdXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvc3JfZGV2aWNlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3NyX2RldmljZS5jCmluZGV4IDc4NmQ2ODUuLmIxZTBhZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvc3JfZGV2aWNlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9zcl9kZXZpY2UuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPHBsYXQvdm9sdGFnZS5oPgogCiAjaW5jbHVkZSAiY29udHJvbC5oIgorI2luY2x1ZGUgInBtLmgiCiAKIHN0YXRpYyBib29sIHNyX2VuYWJsZV9vbl9pbml0OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3dkX3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL3dkX3RpbWVyLmMKaW5kZXggYjBjNDkwNy4uNDA2NzY2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi93ZF90aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvd2RfdGltZXIuYwpAQCAtMTMsNiArMTMsOCBAQAogCiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CiAKKyNpbmNsdWRlICJ3ZF90aW1lci5oIgorCiAvKgogICogSW4gb3JkZXIgdG8gYXZvaWQgYW55IGFzc3VtcHRpb25zIGZyb20gYm9vdGxvYWRlciByZWdhcmRpbmcgV0RUCiAgKiBzZXR0aW5ncywgV0RUIG1vZHVsZSBpcyByZXNldCBkdXJpbmcgaW5pdC4gVGhpcyBlbmFibGVzIHRoZSB3YXRjaGRvZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3BtLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYwppbmRleCBlZTNjMjljLi5mM2U2MGEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvcG0uYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJICAgICAgIChzdGF0ZSA9PSBQTV9TVVNQRU5EX01FTSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcG54NDAwOF9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHBueDQwMDhfcG1fb3BzID0gewogCS5lbnRlciA9IHBueDQwMDhfcG1fZW50ZXIsCiAJLnZhbGlkID0gcG54NDAwOF9wbV92YWxpZCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9teG04eDEwLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9teG04eDEwLmMKaW5kZXggNDYyMTY3YS4uY2RmN2Y0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbXhtOHgxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL214bTh4MTAuYwpAQCAtMzM3LDcgKzMzNyw3IEBACiB9CiAjZW5kaWYKIAotLyogVVNCIE9wZW4gSG9zdCBDb250cm9sZXIgSW50ZXJmYWNlICovCisvKiBVU0IgT3BlbiBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlICovCiBzdGF0aWMgc3RydWN0IHB4YW9oY2lfcGxhdGZvcm1fZGF0YSBteG1fOHgxMF9vaGNpX3BsYXRmb3JtX2RhdGEgPSB7CiAJLnBvcnRfbW9kZSA9IFBNTV9OUFNfTU9ERSwKIAkuZmxhZ3MgPSBFTkFCTEVfUE9SVF9BTEwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9wbS5jCmluZGV4IDE2NmMxNWYuLjk3OGUxYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG0uYwpAQCAtOTYsNyArOTYsNyBAQAogCQlweGFfY3B1X3BtX2Zucy0+ZmluaXNoKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcHhhX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcHhhX3BtX29wcyA9IHsKIAkudmFsaWQJCT0gcHhhX3BtX3ZhbGlkLAogCS5lbnRlcgkJPSBweGFfcG1fZW50ZXIsCiAJLnByZXBhcmUJPSBweGFfcG1fcHJlcGFyZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2xfcG0uYyBiL2FyY2gvYXJtL21hY2gtcHhhL3NoYXJwc2xfcG0uYwppbmRleCBlNjhkNDZkLi43ODU4ODBmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9zaGFycHNsX3BtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc2hhcnBzbF9wbS5jCkBAIC04NjksNyArODY5LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBzaGFycHNsX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgc2hhcnBzbF9wbV9vcHMgPSB7CiAJLnByZXBhcmUJPSBweGFfcG1fcHJlcGFyZSwKIAkuZmluaXNoCQk9IHB4YV9wbV9maW5pc2gsCiAJLmVudGVyCQk9IGNvcmdpX3B4YV9wbV9lbnRlciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCmluZGV4IGQ3YWRhOGMuLjFhODFmZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJJnMzY19kZXZpY2Vfd2R0LAogCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAotCSZzM2NfZGV2aWNlX3BjbSwKKwkmc2Ftc3VuZ19hc29jX2RtYSwKIAkmczNjX2RldmljZV91c2JnYWRnZXQsCiAJJmgxOTQwX2RldmljZV9sZWRzLAogCSZoMTk0MF9kZXZpY2VfYmx1ZXRvb3RoLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtcngxOTUwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDE5NTAuYwppbmRleCBlMDYyMmJiLi5lYWI2YWU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDE5NTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1yeDE5NTAuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJJnMzY19kZXZpY2Vfd2R0LAogCSZzM2NfZGV2aWNlX2kyYzAsCiAJJnMzY19kZXZpY2VfaWlzLAotCSZzM2NfZGV2aWNlX3BjbSwKKwkmc2Ftc3VuZ19hc29jX2RtYSwKIAkmczNjX2RldmljZV91c2JnYWRnZXQsCiAJJnMzY19kZXZpY2VfcnRjLAogCSZzM2NfZGV2aWNlX25hbmQsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jbG9jay5jCmluZGV4IDdlMDNmMGEuLjFjOThkMmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY2xvY2suYwpAQCAtNjk1LDcgKzY5NSw3IEBACiAJfSwgewogCQkuY2xrCT0gewogCQkJLm5hbWUJCT0gImF1ZGlvLWJ1cyIsCi0JCQkuaWQJCT0gLTEsICAvKiBUaGVyZSdzIG9ubHkgb25lIElJU3Y0IHBvcnQgKi8KKwkJCS5pZAkJPSAyLAogCQkJLmN0cmxiaXQgICAgICAgID0gUzNDNjQxMF9DTEtDT05fU0NMS19BVURJTzIsCiAJCQkuZW5hYmxlCQk9IHMzYzY0eHhfc2Nsa19jdHJsLAogCQl9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1hdWRpby5jCmluZGV4IDc2NDI2YTMuLmNhZDY3MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtYXVkaW8uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LWF1ZGlvLmMKQEAgLTIyLDcgKzIyLDEyIEBACiAjaW5jbHVkZSA8cGxhdC9hdWRpby5oPgogI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KIAotc3RhdGljIGludCBzM2M2NHh4X2kyc3YzX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgY29uc3QgY2hhciAqcmNsa3NyY1tdID0geworCVswXSA9ICJpaXMiLAorCVsxXSA9ICJhdWRpby1idXMiLAorfTsKKworc3RhdGljIGludCBzM2M2NHh4X2kyc19jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXVuc2lnbmVkIGludCBiYXNlOwogCkBAIC0zMyw2ICszOCwxMiBAQAogCWNhc2UgMToKIAkJYmFzZSA9IFMzQzY0WFhfR1BFKDApOwogCQlicmVhazsKKwljYXNlIDI6CisJCXMzY19ncGlvX2NmZ3BpbihTM0M2NFhYX0dQQyg0KSwgUzNDX0dQSU9fU0ZOKDUpKTsKKwkJczNjX2dwaW9fY2ZncGluKFMzQzY0WFhfR1BDKDUpLCBTM0NfR1BJT19TRk4oNSkpOworCQlzM2NfZ3Bpb19jZmdwaW4oUzNDNjRYWF9HUEMoNyksIFMzQ19HUElPX1NGTig1KSk7CisJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTM0M2NFhYX0dQSCg2KSwgNCwgUzNDX0dQSU9fU0ZOKDUpKTsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgSTJTIENvbnRyb2xsZXIgbnVtYmVyOiAlZFxuIiwKIAkJCXBkZXYtPmlkKTsKQEAgLTQ0LDE2ICs1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczNjNjR4eF9pMnN2NF9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXMzY19ncGlvX2NmZ3BpbihTM0M2NFhYX0dQQyg0KSwgUzNDX0dQSU9fU0ZOKDUpKTsKLQlzM2NfZ3Bpb19jZmdwaW4oUzNDNjRYWF9HUEMoNSksIFMzQ19HUElPX1NGTig1KSk7Ci0JczNjX2dwaW9fY2ZncGluKFMzQzY0WFhfR1BDKDcpLCBTM0NfR1BJT19TRk4oNSkpOwotCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTM0M2NFhYX0dQSCg2KSwgNCwgUzNDX0dQSU9fU0ZOKDUpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHMzYzY0eHhfaWlzMF9yZXNvdXJjZVtdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0ID0gUzNDNjRYWF9QQV9JSVMwLApAQCAtNzIsMTcgKzczLDIyIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIHMzY19pMnMwX3BkYXRhID0gewotCS5jZmdfZ3BpbyA9IHMzYzY0eHhfaTJzdjNfY2ZnX2dwaW8sCitzdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBpMnN2M19wZGF0YSA9IHsKKwkuY2ZnX2dwaW8gPSBzM2M2NHh4X2kyc19jZmdfZ3BpbywKKwkudHlwZSA9IHsKKwkJLmkycyA9IHsKKwkJCS5zcmNfY2xrID0gcmNsa3NyYywKKwkJfSwKKwl9LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9paXMwID0gewotCS5uYW1lCQkgID0gInMzYzY0eHgtaWlzIiwKKwkubmFtZQkJICA9ICJzYW1zdW5nLWkycyIsCiAJLmlkCQkgID0gMCwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2M2NHh4X2lpczBfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczNjNjR4eF9paXMwX3Jlc291cmNlLAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19pMnMwX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2M19wZGF0YSwKIAl9LAogfTsKIEVYUE9SVF9TWU1CT0woczNjNjR4eF9kZXZpY2VfaWlzMCk7CkBAIC0xMDUsMTcgKzExMSwxMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBzM2NfaTJzMV9wZGF0YSA9IHsKLQkuY2ZnX2dwaW8gPSBzM2M2NHh4X2kyc3YzX2NmZ19ncGlvLAotfTsKLQogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9paXMxID0gewotCS5uYW1lCQkgID0gInMzYzY0eHgtaWlzIiwKKwkubmFtZQkJICA9ICJzYW1zdW5nLWkycyIsCiAJLmlkCQkgID0gMSwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2M2NHh4X2lpczFfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczNjNjR4eF9paXMxX3Jlc291cmNlLAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19pMnMxX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2M19wZGF0YSwKIAl9LAogfTsKIEVYUE9SVF9TWU1CT0woczNjNjR4eF9kZXZpY2VfaWlzMSk7CkBAIC0xMzgsMTcgKzE0MCwyMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBzM2NfaTJzdjRfcGRhdGEgPSB7Ci0JLmNmZ19ncGlvID0gczNjNjR4eF9pMnN2NF9jZmdfZ3BpbywKK3N0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIGkyc3Y0X3BkYXRhID0geworCS5jZmdfZ3BpbyA9IHMzYzY0eHhfaTJzX2NmZ19ncGlvLAorCS50eXBlID0geworCQkuaTJzID0geworCQkJLnF1aXJrcyA9IFFVSVJLX1BSSV82Q0hBTiwKKwkJCS5zcmNfY2xrID0gcmNsa3NyYywKKwkJfSwKKwl9LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2M2NHh4X2RldmljZV9paXN2NCA9IHsKLQkubmFtZQkJICA9ICJzM2M2NHh4LWlpcy12NCIsCi0JLmlkCQkgID0gLTEsCisJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAorCS5pZCA9IDIsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjNjR4eF9paXN2NF9yZXNvdXJjZSksCiAJLnJlc291cmNlCSAgPSBzM2M2NHh4X2lpc3Y0X3Jlc291cmNlLAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19pMnN2NF9wZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJzdjRfcGRhdGEsCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKHMzYzY0eHhfZGV2aWNlX2lpc3Y0KTsKQEAgLTI4OCw3ICsyOTYsNyBAQAogc3RhdGljIHU2NCBzM2M2NHh4X2FjOTdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfYWM5NyA9IHsKLQkubmFtZQkJICA9ICJzM2MtYWM5NyIsCisJLm5hbWUJCSAgPSAic2Ftc3VuZy1hYzk3IiwKIAkuaWQJCSAgPSAtMSwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzM2M2NHh4X2FjOTdfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczNjNjR4eF9hYzk3X3Jlc291cmNlLApAQCAtMzA3LDE2ICszMTUsMyBAQAogCWVsc2UKIAkJczNjX2FjOTdfcGRhdGEuY2ZnX2dwaW8gPSBzM2M2NHh4X2FjOTdfY2ZnX2dwZTsKIH0KLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX2F1ZGlvX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9wY20gPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjR4eC1wY20tYXVkaW8iLAotCS5pZAkJICA9IC0xLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9hdWRpb19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotRVhQT1JUX1NZTUJPTChzM2NfZGV2aWNlX3BjbSk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kbWEuYwppbmRleCBlN2QwM2FiLi4zNzJlYTY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZG1hLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2RtYS5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAkvKiBTZXQgYWxsIERNQSBjb25maWd1cmF0aW9uIHRvIGJlIERNQSwgbm90IFNETUEgKi8KIAl3cml0ZWwoMHhmZmZmZmYsIFMzQ19TWVNSRUcoMHgxMTApKTsKIAotCS8qIFJlZ2lzdGVyIHN0YW5kYXJkIERNQSBjb250cm9sZXJzICovCisJLyogUmVnaXN0ZXIgc3RhbmRhcmQgRE1BIGNvbnRyb2xsZXJzICovCiAJczNjNjR4eF9kbWFfaW5pdDEoMCwgRE1BQ0hfVUFSVDAsIElSUV9ETUEwLCAweDc1MDAwMDAwKTsKIAlzM2M2NHh4X2RtYV9pbml0MSg4LCBETUFDSF9QQ00xX1RYLCBJUlFfRE1BMSwgMHg3NTEwMDAwMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvbWFjaC1zbWRrNjQxMC5jCmluZGV4IDc3NDg4ZmEuLmU4NTE5MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9tYWNoLXNtZGs2NDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L21hY2gtc21kazY0MTAuYwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJJnMzY19kZXZpY2VfZmIsCiAJJnMzY19kZXZpY2Vfb2hjaSwKIAkmczNjX2RldmljZV91c2JfaHNvdGcsCi0JJnMzY19kZXZpY2VfcGNtLAorCSZzYW1zdW5nX2Fzb2NfZG1hLAogCSZzM2M2NHh4X2RldmljZV9paXN2NCwKIAkmc2Ftc3VuZ19kZXZpY2Vfa2V5cGFkLAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cDY0NDIvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0NDIvZGV2LWF1ZGlvLmMKaW5kZXggMzQ2MjE5Ny4uODcxOWRjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NDQyL2Rldi1hdWRpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwNjQ0Mi9kZXYtYXVkaW8uYwpAQCAtMjksNyArMjksNyBAQAogCQliYXNlID0gUzVQNjQ0Ml9HUEMxKDApOwogCQlicmVhazsKIAotCWNhc2UgLTE6CisJY2FzZSAwOgogCQliYXNlID0gUzVQNjQ0Ml9HUEMwKDApOwogCQlicmVhazsKIApAQCAtNDIsOCArNDIsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczNjX2kyc19wZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpyY2xrc3JjX3YzNVtdID0geworCVswXSA9ICJidXNjbGsiLAorCVsxXSA9ICJpMnNjbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgaTJzdjM1X3BkYXRhID0gewogCS5jZmdfZ3BpbyA9IHM1cDY0NDJfY2ZnX2kycywKKwkudHlwZSA9IHsKKwkJLmkycyA9IHsKKwkJCS5xdWlya3MgPSBRVUlSS19TRUNfREFJIHwgUVVJUktfTkVFRF9SU1RDTFIsCisJCQkuc3JjX2NsayA9IHJjbGtzcmNfdjM1LAorCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cDY0NDJfaWlzMF9yZXNvdXJjZVtdID0gewpAQCAtNjIsMTUgKzczLDM0IEBACiAJCS5lbmQgICA9IERNQUNIX0kyUzBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAogCX0sCisJWzNdID0geworCQkuc3RhcnQgPSBETUFDSF9JMlMwU19UWCwKKwkJLmVuZCA9IERNQUNIX0kyUzBTX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQyX2RldmljZV9paXMwID0gewotCS5uYW1lCQkgID0gInMzYzY0eHgtaWlzLXY0IiwKLQkuaWQJCSAgPSAtMSwKKwkubmFtZSA9ICJzYW1zdW5nLWkycyIsCisJLmlkID0gMCwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzNXA2NDQyX2lpczBfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczVwNjQ0Ml9paXMwX3Jlc291cmNlLAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19pMnNfcGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyc3YzNV9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJjbGtzcmNfdjNbXSA9IHsKKwlbMF0gPSAiaWlzIiwKKwlbMV0gPSAic2Nsa19hdWRpbyIsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBpMnN2M19wZGF0YSA9IHsKKwkuY2ZnX2dwaW8gPSBzNXA2NDQyX2NmZ19pMnMsCisJLnR5cGUgPSB7CisJCS5pMnMgPSB7CisJCQkuc3JjX2NsayA9IHJjbGtzcmNfdjMsCisJCX0sCiAJfSwKIH07CiAKQEAgLTkzLDEyICsxMjMsMTIgQEAKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0Ml9kZXZpY2VfaWlzMSA9IHsKLQkubmFtZQkJICA9ICJzM2M2NHh4LWlpcyIsCisJLm5hbWUJCSAgPSAic2Ftc3VuZy1pMnMiLAogCS5pZAkJICA9IDEsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwNjQ0Ml9paXMxX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHM1cDY0NDJfaWlzMV9yZXNvdXJjZSwKIAkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfaTJzX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2M19wZGF0YSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYyBiL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDQwLmMKaW5kZXggZTQ4ODNkYy4uNDA5YzVmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ0MC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCAyNSksCiAJfSwgewotCQkubmFtZQkJPSAiaTJzX3Y0MCIsCisJCS5uYW1lCQk9ICJpaXMiLAogCQkuaWQJCT0gMCwKIAkJLnBhcmVudAkJPSAmY2xrX3BjbGtfbG93LmNsaywKIAkJLmVuYWJsZQkJPSBzNXA2NHgwX3BjbGtfY3RybCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMgYi9hcmNoL2FybS9tYWNoLXM1cDY0eDAvY2xvY2stczVwNjQ1MC5jCmluZGV4IDdkYmYzYzkuLjdmYzZhYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwNjR4MC9jbG9jay1zNXA2NDUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Nsb2NrLXM1cDY0NTAuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCS5jdHJsYml0CT0gKDEgPDwgMjIpLAogCX0sIHsKIAkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAtMSwKKwkJLmlkCQk9IDAsCiAJCS5wYXJlbnQJCT0gJmNsa19wY2xrX2xvdy5jbGssCiAJCS5lbmFibGUJCT0gczVwNjR4MF9wY2xrX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgMjYpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1hdWRpby5jCmluZGV4IDM5NmJhY2MuLjE0Zjg5ZTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cDY0eDAvZGV2LWF1ZGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXA2NHgwL2Rldi1hdWRpby5jCkBAIC0xOSwxNSArMTksMTkgQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCi1zdGF0aWMgaW50IHM1cDY0NDBfY2ZnX2kycyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGNvbnN0IGNoYXIgKnJjbGtzcmNbXSA9IHsKKwlbMF0gPSAiaWlzIiwKKwlbMV0gPSAic2Nsa19hdWRpbzIiLAorfTsKKworc3RhdGljIGludCBzNXA2NHgwX2NmZ19pMnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAkvKiBjb25maWd1cmUgR1BJTyBmb3IgaTJzIHBvcnQgKi8KIAlzd2l0Y2ggKHBkZXYtPmlkKSB7Ci0JY2FzZSAtMToKKwljYXNlIDA6CiAJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVA2NDQwX0dQUig0KSwgNSwgUzNDX0dQSU9fU0ZOKDUpKTsKIAkJczNjX2dwaW9fY2ZncGluX3JhbmdlKFM1UDY0NDBfR1BSKDEzKSwgMiwgUzNDX0dQSU9fU0ZOKDUpKTsKIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgRGV2aWNlICVkXG4iLCBwZGV2LT5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzYsMzEgKzQwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczVwNjQ1MF9jZmdfaTJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JLyogY29uZmlndXJlIEdQSU8gZm9yIGkycyBwb3J0ICovCi0Jc3dpdGNoIChwZGV2LT5pZCkgewotCWNhc2UgLTE6Ci0JCXMzY19ncGlvX2NmZ3BpbihTNVA2NDUwX0dQQig0KSwgUzNDX0dQSU9fU0ZOKDUpKTsKLQkJczNjX2dwaW9fY2ZncGluX3JhbmdlKFM1UDY0NTBfR1BSKDQpLCA1LCBTM0NfR1BJT19TRk4oNSkpOwotCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQNjQ1MF9HUFIoMTMpLCAyLCBTM0NfR1BJT19TRk4oNSkpOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIERldmljZSAlZFxuIiwgcGRldi0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczVwNjQ0MF9pMnNfcGRhdGEgPSB7Ci0JLmNmZ19ncGlvID0gczVwNjQ0MF9jZmdfaTJzLAotfTsKLQotc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczVwNjQ1MF9pMnNfcGRhdGEgPSB7Ci0JLmNmZ19ncGlvID0gczVwNjQ1MF9jZmdfaTJzLAorc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczVwNjR4MF9pMnNfcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwNjR4MF9jZmdfaTJzLAorCS50eXBlID0geworCQkuaTJzID0geworCQkJLnF1aXJrcyA9IFFVSVJLX1BSSV82Q0hBTiwKKwkJCS5zcmNfY2xrID0gcmNsa3NyYywKKwkJfSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXA2NHgwX2lpczBfcmVzb3VyY2VbXSA9IHsKQEAgLTgyLDIyICs2OSwyMiBAQAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQwX2RldmljZV9paXMgPSB7Ci0JLm5hbWUJCT0gInMzYzY0eHgtaWlzLXY0IiwKLQkuaWQJCT0gLTEsCisJLm5hbWUJCT0gInNhbXN1bmctaTJzIiwKKwkuaWQJCT0gMCwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwNjR4MF9paXMwX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJPSBzNXA2NHgwX2lpczBfcmVzb3VyY2UsCiAJLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmczVwNjQ0MF9pMnNfcGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnM1cDY0eDBfaTJzX3BkYXRhLAogCX0sCiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NTBfZGV2aWNlX2lpczAgPSB7Ci0JLm5hbWUJCT0gInMzYzY0eHgtaWlzLXY0IiwKLQkuaWQJCT0gLTEsCisJLm5hbWUJCT0gInNhbXN1bmctaTJzIiwKKwkuaWQJCT0gMCwKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoczVwNjR4MF9paXMwX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJPSBzNXA2NHgwX2lpczBfcmVzb3VyY2UsCiAJLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmczVwNjQ1MF9pMnNfcGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnM1cDY0eDBfaTJzX3BkYXRhLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLXM1cGMxMDAvZGV2LWF1ZGlvLmMKaW5kZXggNTY0ZTE5NS4uYWIyZDI3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL2Rldi1hdWRpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9kZXYtYXVkaW8uYwpAQCAtMjMsMTcgKzIzLDE0IEBACiB7CiAJLyogY29uZmlndXJlIEdQSU8gZm9yIGkycyBwb3J0ICovCiAJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgMDogLyogRGVkaWNhdGVkIHBpbnMgKi8KKwkJYnJlYWs7CiAJY2FzZSAxOgogCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQQzEwMF9HUEMoMCksIDUsIFMzQ19HUElPX1NGTigyKSk7CiAJCWJyZWFrOwotCiAJY2FzZSAyOgogCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQQzEwMF9HUEczKDApLCA1LCBTM0NfR1BJT19TRk4oNCkpOwogCQlicmVhazsKLQotCWNhc2UgLTE6IC8qIERlZGljYXRlZCBwaW5zICovCi0JCWJyZWFrOwotCiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIERldmljZSAlZFxuIiwgcGRldi0+aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQyLDggKzM5LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIHMzY19pMnNfcGRhdGEgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqcmNsa3NyY192NVtdID0geworCVswXSA9ICJpaXMiLAorCVsxXSA9ICJpMnNjbGtkMiIsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBpMnN2NV9wZGF0YSA9IHsKIAkuY2ZnX2dwaW8gPSBzNXBjMTAwX2NmZ19pMnMsCisJLnR5cGUgPSB7CisJCS5pMnMgPSB7CisJCQkucXVpcmtzID0gUVVJUktfUFJJXzZDSEFOIHwgUVVJUktfU0VDX0RBSQorCQkJCQkgfCBRVUlSS19ORUVEX1JTVENMUiwKKwkJCS5zcmNfY2xrID0gcmNsa3NyY192NSwKKwkJfSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXBjMTAwX2lpczBfcmVzb3VyY2VbXSA9IHsKQEAgLTYyLDE1ICs3MSwzNCBAQAogCQkuZW5kICAgPSBETUFDSF9JMlMwX1JYLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKIAl9LAorCVszXSA9IHsKKwkJLnN0YXJ0ID0gRE1BQ0hfSTJTMFNfVFgsCisJCS5lbmQgPSBETUFDSF9JMlMwU19UWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfaWlzMCA9IHsKLQkubmFtZQkJICA9ICJzM2M2NHh4LWlpcy12NCIsCi0JLmlkCQkgID0gLTEsCisJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAorCS5pZCA9IDAsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwYzEwMF9paXMwX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHM1cGMxMDBfaWlzMF9yZXNvdXJjZSwKIAkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfaTJzX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2NV9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJjbGtzcmNfdjNbXSA9IHsKKwlbMF0gPSAiaWlzIiwKKwlbMV0gPSAic2Nsa19hdWRpbyIsCit9OworCitzdGF0aWMgc3RydWN0IHMzY19hdWRpb19wZGF0YSBpMnN2M19wZGF0YSA9IHsKKwkuY2ZnX2dwaW8gPSBzNXBjMTAwX2NmZ19pMnMsCisJLnR5cGUgPSB7CisJCS5pMnMgPSB7CisJCQkuc3JjX2NsayA9IHJjbGtzcmNfdjMsCisJCX0sCiAJfSwKIH07CiAKQEAgLTkzLDEyICsxMjEsMTIgQEAKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfaWlzMSA9IHsKLQkubmFtZQkJICA9ICJzM2M2NHh4LWlpcyIsCisJLm5hbWUJCSAgPSAic2Ftc3VuZy1pMnMiLAogCS5pZAkJICA9IDEsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwYzEwMF9paXMxX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHM1cGMxMDBfaWlzMV9yZXNvdXJjZSwKIAkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfaTJzX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2M19wZGF0YSwKIAl9LAogfTsKIApAQCAtMTIxLDEyICsxNDksMTIgQEAKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwYzEwMF9kZXZpY2VfaWlzMiA9IHsKLQkubmFtZQkJICA9ICJzM2M2NHh4LWlpcyIsCisJLm5hbWUJCSAgPSAic2Ftc3VuZy1pMnMiLAogCS5pZAkJICA9IDIsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczVwYzEwMF9paXMyX3Jlc291cmNlKSwKIAkucmVzb3VyY2UJICA9IHM1cGMxMDBfaWlzMl9yZXNvdXJjZSwKIAkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfaTJzX3BkYXRhLAorCQkucGxhdGZvcm1fZGF0YSA9ICZpMnN2M19wZGF0YSwKIAl9LAogfTsKIApAQCAtMjUzLDcgKzI4MSw3IEBACiBzdGF0aWMgdTY0IHM1cGMxMDBfYWM5N19kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXBjMTAwX2RldmljZV9hYzk3ID0gewotCS5uYW1lCQkgID0gInMzYy1hYzk3IiwKKwkubmFtZQkJICA9ICJzYW1zdW5nLWFjOTciLAogCS5pZAkJICA9IC0xLAogCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHM1cGMxMDBfYWM5N19yZXNvdXJjZSksCiAJLnJlc291cmNlCSAgPSBzNXBjMTAwX2FjOTdfcmVzb3VyY2UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jIGIvYXJjaC9hcm0vbWFjaC1zNXBjMTAwL21hY2gtc21ka2MxMDAuYwppbmRleCAxOGI0MDVkLi5kZDE5MmEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cGMxMDAvbWFjaC1zbWRrYzEwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwYzEwMC9tYWNoLXNtZGtjMTAwLmMKQEAgLTk2LDYgKzk2LDcgQEAKIAogLyogSTJDMCAqLwogc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpMmNfZGV2czBbXSBfX2luaXRkYXRhID0geworCXtJMkNfQk9BUkRfSU5GTygid204NTgwIiwgMHgxYiksfSwKIH07CiAKIC8qIEkyQzEgKi8KQEAgLTE5MCw2ICsxOTEsNyBAQAogCSZzM2NfZGV2aWNlX3RzLAogCSZzM2NfZGV2aWNlX3dkdCwKIAkmc21ka2MxMDBfbGNkX3Bvd2VyZGV2LAorCSZzYW1zdW5nX2Fzb2NfZG1hLAogCSZzNXBjMTAwX2RldmljZV9paXMwLAogCSZzYW1zdW5nX2RldmljZV9rZXlwYWQsCiAJJnM1cGMxMDBfZGV2aWNlX2FjOTcsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCmluZGV4IDAxOWMzYTYuLmI3NzRmZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9jbG9jay5jCkBAIC00NjcsMjAgKzQ2NywyMCBAQAogCQkuZW5hYmxlCQk9IHM1cHYyMTBfY2xrX2lwM19jdHJsLAogCQkuY3RybGJpdAk9ICgxPDwyMSksCiAJfSwgewotCQkubmFtZQkJPSAiaTJzX3Y1MCIsCisJCS5uYW1lCQk9ICJpaXMiLAogCQkuaWQJCT0gMCwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDE8PDQpLAogCX0sIHsKLQkJLm5hbWUJCT0gImkyc192MzIiLAotCQkuaWQJCT0gMCwKKwkJLm5hbWUJCT0gImlpcyIsCisJCS5pZAkJPSAxLAogCQkucGFyZW50CQk9ICZjbGtfcCwKIAkJLmVuYWJsZQkJPSBzNXB2MjEwX2Nsa19pcDNfY3RybCwKIAkJLmN0cmxiaXQJPSAoMSA8PCA1KSwKIAl9LCB7Ci0JCS5uYW1lCQk9ICJpMnNfdjMyIiwKLQkJLmlkCQk9IDEsCisJCS5uYW1lCQk9ICJpaXMiLAorCQkuaWQJCT0gMiwKIAkJLnBhcmVudAkJPSAmY2xrX3AsCiAJCS5lbmFibGUJCT0gczVwdjIxMF9jbGtfaXAzX2N0cmwsCiAJCS5jdHJsYml0CT0gKDEgPDwgNiksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LWF1ZGlvLmMgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvZGV2LWF1ZGlvLmMKaW5kZXggMTMwM2ZjYi4uOGQ1OGYxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL2Rldi1hdWRpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9kZXYtYXVkaW8uYwpAQCAtMTksMjIgKzE5LDI0IEBACiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAorc3RhdGljIGNvbnN0IGNoYXIgKnJjbGtzcmNbXSA9IHsKKwlbMF0gPSAiYnVzY2xrIiwKKwlbMV0gPSAiaTJzY2xrIiwKK307CisKIHN0YXRpYyBpbnQgczVwdjIxMF9jZmdfaTJzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJLyogY29uZmlndXJlIEdQSU8gZm9yIGkycyBwb3J0ICovCiAJc3dpdGNoIChwZGV2LT5pZCkgeworCWNhc2UgMDoKKwkJczNjX2dwaW9fY2ZncGluX3JhbmdlKFM1UFYyMTBfR1BJKDApLCA3LCBTM0NfR1BJT19TRk4oMikpOworCQlicmVhazsKIAljYXNlIDE6CiAJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMjEwX0dQQzAoMCksIDUsIFMzQ19HUElPX1NGTigyKSk7CiAJCWJyZWFrOwotCiAJY2FzZSAyOgogCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQVjIxMF9HUEMxKDApLCA1LCBTM0NfR1BJT19TRk4oNCkpOwogCQlicmVhazsKLQotCWNhc2UgLTE6Ci0JCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMjEwX0dQSSgwKSwgNywgUzNDX0dQSU9fU0ZOKDIpKTsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgRGV2aWNlICVkXG4iLCBwZGV2LT5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDMsOCArNDUsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczNjX2kyc19wZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIGkyc3Y1X3BkYXRhID0gewogCS5jZmdfZ3BpbyA9IHM1cHYyMTBfY2ZnX2kycywKKwkudHlwZSA9IHsKKwkJLmkycyA9IHsKKwkJCS5xdWlya3MgPSBRVUlSS19QUklfNkNIQU4gfCBRVUlSS19TRUNfREFJCisJCQkJCSB8IFFVSVJLX05FRURfUlNUQ0xSLAorCQkJLnNyY19jbGsgPSByY2xrc3JjLAorCQl9LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYyMTBfaWlzMF9yZXNvdXJjZVtdID0gewpAQCAtNjMsMTUgKzcyLDM0IEBACiAJCS5lbmQgICA9IERNQUNIX0kyUzBfUlgsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAogCX0sCisJWzNdID0geworCQkuc3RhcnQgPSBETUFDSF9JMlMwU19UWCwKKwkJLmVuZCA9IERNQUNIX0kyUzBTX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MjEwX2RldmljZV9paXMwID0gewotCS5uYW1lCQkgID0gInMzYzY0eHgtaWlzLXY0IiwKLQkuaWQJCSAgPSAtMSwKKwkubmFtZSA9ICJzYW1zdW5nLWkycyIsCisJLmlkID0gMCwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzNXB2MjEwX2lpczBfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczVwdjIxMF9paXMwX3Jlc291cmNlLAogCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19pMnNfcGRhdGEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyc3Y1X3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmNsa3NyY192M1tdID0geworCVswXSA9ICJpaXMiLAorCVsxXSA9ICJhdWRpby1idXMiLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgaTJzdjNfcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwdjIxMF9jZmdfaTJzLAorCS50eXBlID0geworCQkuaTJzID0geworCQkJLnNyY19jbGsgPSByY2xrc3JjX3YzLAorCQl9LAogCX0sCiB9OwogCkBAIC05NCwxMiArMTIyLDEyIEBACiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczEgPSB7Ci0JLm5hbWUJCSAgPSAiczNjNjR4eC1paXMiLAorCS5uYW1lCQkgID0gInNhbXN1bmctaTJzIiwKIAkuaWQJCSAgPSAxLAogCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHM1cHYyMTBfaWlzMV9yZXNvdXJjZSksCiAJLnJlc291cmNlCSAgPSBzNXB2MjEwX2lpczFfcmVzb3VyY2UsCiAJLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmczNjX2kyc19wZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJzdjNfcGRhdGEsCiAJfSwKIH07CiAKQEAgLTEyMiwxMiArMTUwLDEyIEBACiB9OwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX2lpczIgPSB7Ci0JLm5hbWUJCSAgPSAiczNjNjR4eC1paXMiLAorCS5uYW1lCQkgID0gInNhbXN1bmctaTJzIiwKIAkuaWQJCSAgPSAyLAogCS5udW1fcmVzb3VyY2VzCSAgPSBBUlJBWV9TSVpFKHM1cHYyMTBfaWlzMl9yZXNvdXJjZSksCiAJLnJlc291cmNlCSAgPSBzNXB2MjEwX2lpczJfcmVzb3VyY2UsCiAJLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmczNjX2kyc19wZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJzdjNfcGRhdGEsCiAJfSwKIH07CiAKQEAgLTI4Myw3ICszMTEsNyBAQAogc3RhdGljIHU2NCBzNXB2MjEwX2FjOTdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfYWM5NyA9IHsKLQkubmFtZQkJICA9ICJzM2MtYWM5NyIsCisJLm5hbWUJCSAgPSAic2Ftc3VuZy1hYzk3IiwKIAkuaWQJCSAgPSAtMSwKIAkubnVtX3Jlc291cmNlcwkgID0gQVJSQVlfU0laRShzNXB2MjEwX2FjOTdfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczVwdjIxMF9hYzk3X3Jlc291cmNlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvS2NvbmZpZwppbmRleCAxMTUwYjM2Li5kNjRlZmUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYzMTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvS2NvbmZpZwpAQCAtMTEsNiArMTEsNyBAQAogCiBjb25maWcgQ1BVX1M1UFYzMTAKIAlib29sCisJc2VsZWN0IFMzQ19QTDMzMF9ETUEKIAloZWxwCiAJICBFbmFibGUgUzVQVjMxMCBDUFUgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYzMTAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvTWFrZWZpbGUKaW5kZXggODRhZmM2NC4uNjFlM2NiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjMxMC9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNyBAQAogIyBDb3JlIHN1cHBvcnQgZm9yIFM1UFYzMTAgc3lzdGVtCiAKIG9iai0kKENPTkZJR19DUFVfUzVQVjMxMCkJKz0gY3B1Lm8gaW5pdC5vIGNsb2NrLm8gaXJxLWNvbWJpbmVyLm8KLW9iai0kKENPTkZJR19DUFVfUzVQVjMxMCkJKz0gc2V0dXAtaTJjMC5vIHRpbWUubyBncGlvbGliLm8gaXJxLWVpbnQubworb2JqLSQoQ09ORklHX0NQVV9TNVBWMzEwKQkrPSBzZXR1cC1pMmMwLm8gdGltZS5vIGdwaW9saWIubyBpcnEtZWludC5vIGRtYS5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBwbGF0c21wLm8gaGVhZHNtcC5vCiBvYmotJChDT05GSUdfTE9DQUxfVElNRVJTKQkrPSBsb2NhbHRpbWVyLm8KQEAgLTI3LDYgKzI3LDcgQEAKIAogIyBkZXZpY2Ugc3VwcG9ydAogCitvYmoteSArPSBkZXYtYXVkaW8ubwogb2JqLSQoQ09ORklHX1M1UFYzMTBfU0VUVVBfSTJDMSkJKz0gc2V0dXAtaTJjMS5vCiBvYmotJChDT05GSUdfUzVQVjMxMF9TRVRVUF9JMkMyKQkrPSBzZXR1cC1pMmMyLm8KIG9iai0kKENPTkZJR19TNVBWMzEwX1NFVFVQX0kyQzMpCSs9IHNldHVwLWkyYzMubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2Rldi1hdWRpby5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2Rldi1hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTY0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvZGV2LWF1ZGlvLmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczVwdjMxMC9kZXYtYXVkaW8uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQKKyAqCUphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2luY2x1ZGUgPHBsYXQvZ3Bpby1jZmcuaD4KKyNpbmNsdWRlIDxwbGF0L2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICpyY2xrc3JjW10gPSB7CisJWzBdID0gImJ1c2NsayIsCisJWzFdID0gImkyc2NsayIsCit9OworCitzdGF0aWMgaW50IHM1cHYzMTBfY2ZnX2kycyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCS8qIGNvbmZpZ3VyZSBHUElPIGZvciBpMnMgcG9ydCAqLworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIDA6CisJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMzEwX0dQWigwKSwgNywgUzNDX0dQSU9fU0ZOKDIpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQVjMxMF9HUEMwKDApLCA1LCBTM0NfR1BJT19TRk4oMikpOworCQlicmVhazsKKwljYXNlIDI6CisJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMzEwX0dQQzEoMCksIDUsIFMzQ19HUElPX1NGTig0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBEZXZpY2UgJWRcbiIsIHBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIGkyc3Y1X3BkYXRhID0geworCS5jZmdfZ3BpbyA9IHM1cHYzMTBfY2ZnX2kycywKKwkudHlwZSA9IHsKKwkJLmkycyA9IHsKKwkJCS5xdWlya3MgPSBRVUlSS19QUklfNkNIQU4gfCBRVUlSS19TRUNfREFJCisJCQkJCSB8IFFVSVJLX05FRURfUlNUQ0xSLAorCQkJLnNyY19jbGsgPSByY2xrc3JjLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYzMTBfaTJzMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9JMlMwLAorCQkuZW5kCT0gUzVQVjMxMF9QQV9JMlMwICsgMHgxMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfSTJTMF9UWCwKKwkJLmVuZAk9IERNQUNIX0kyUzBfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBETUFDSF9JMlMwX1JYLAorCQkuZW5kCT0gRE1BQ0hfSTJTMF9SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbM10gPSB7CisJCS5zdGFydAk9IERNQUNIX0kyUzBTX1RYLAorCQkuZW5kCT0gRE1BQ0hfSTJTMFNfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX2kyczAgPSB7CisJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHM1cHYzMTBfaTJzMF9yZXNvdXJjZSksCisJLnJlc291cmNlID0gczVwdjMxMF9pMnMwX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyc3Y1X3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmNsa3NyY192M1tdID0geworCVswXSA9ICJzY2xrX2kycyIsCisJWzFdID0gIm5vX3N1Y2hfY2xvY2siLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgaTJzdjNfcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwdjMxMF9jZmdfaTJzLAorCS50eXBlID0geworCQkuaTJzID0geworCQkJLnF1aXJrcyA9IFFVSVJLX05PX01VWFBTUiwKKwkJCS5zcmNfY2xrID0gcmNsa3NyY192MywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXB2MzEwX2kyczFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFM1UFYzMTBfUEFfSTJTMSwKKwkJLmVuZAk9IFM1UFYzMTBfUEFfSTJTMSArIDB4MTAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IERNQUNIX0kyUzFfVFgsCisJCS5lbmQJPSBETUFDSF9JMlMxX1RYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfSTJTMV9SWCwKKwkJLmVuZAk9IERNQUNIX0kyUzFfUlgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX2kyczEgPSB7CisJLm5hbWUgPSAic2Ftc3VuZy1pMnMiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHM1cHYzMTBfaTJzMV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gczVwdjMxMF9pMnMxX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmkyc3YzX3BkYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYzMTBfaTJzMl9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9JMlMyLAorCQkuZW5kCT0gUzVQVjMxMF9QQV9JMlMyICsgMHgxMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfSTJTMl9UWCwKKwkJLmVuZAk9IERNQUNIX0kyUzJfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBETUFDSF9JMlMyX1JYLAorCQkuZW5kCT0gRE1BQ0hfSTJTMl9SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2VfaTJzMiA9IHsKKwkubmFtZSA9ICJzYW1zdW5nLWkycyIsCisJLmlkID0gMiwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoczVwdjMxMF9pMnMyX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBzNXB2MzEwX2kyczJfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaTJzdjNfcGRhdGEsCisJfSwKK307CisKKy8qIFBDTSBDb250cm9sbGVyIHBsYXRmb3JtX2RldmljZXMgKi8KKworc3RhdGljIGludCBzNXB2MzEwX3BjbV9jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIDA6CisJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMzEwX0dQWigwKSwgNSwgUzNDX0dQSU9fU0ZOKDMpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQVjMxMF9HUEMwKDApLCA1LCBTM0NfR1BJT19TRk4oMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCXMzY19ncGlvX2NmZ3Bpbl9yYW5nZShTNVBWMzEwX0dQQzEoMCksIDUsIFMzQ19HUElPX1NGTigzKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIFBDTSBDb250cm9sbGVyIG51bWJlciEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIHMzY19wY21fcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwdjMxMF9wY21fY2ZnX2dwaW8sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYzMTBfcGNtMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9QQ00wLAorCQkuZW5kCT0gUzVQVjMxMF9QQV9QQ00wICsgMHgxMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfUENNMF9UWCwKKwkJLmVuZAk9IERNQUNIX1BDTTBfVFgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzJdID0geworCQkuc3RhcnQJPSBETUFDSF9QQ00wX1JYLAorCQkuZW5kCT0gRE1BQ0hfUENNMF9SWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2VfcGNtMCA9IHsKKwkubmFtZSA9ICJzYW1zdW5nLXBjbSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoczVwdjMxMF9wY20wX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBzNXB2MzEwX3BjbTBfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmczNjX3BjbV9wZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzNXB2MzEwX3BjbTFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFM1UFYzMTBfUEFfUENNMSwKKwkJLmVuZAk9IFM1UFYzMTBfUEFfUENNMSArIDB4MTAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IERNQUNIX1BDTTFfVFgsCisJCS5lbmQJPSBETUFDSF9QQ00xX1RYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfUENNMV9SWCwKKwkJLmVuZAk9IERNQUNIX1BDTTFfUlgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX3BjbTEgPSB7CisJLm5hbWUgPSAic2Ftc3VuZy1wY20iLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHM1cHYzMTBfcGNtMV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gczVwdjMxMF9wY20xX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnMzY19wY21fcGRhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwdjMxMF9wY20yX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBTNVBWMzEwX1BBX1BDTTIsCisJCS5lbmQJPSBTNVBWMzEwX1BBX1BDTTIgKyAweDEwMCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBETUFDSF9QQ00yX1RYLAorCQkuZW5kCT0gRE1BQ0hfUENNMl9UWCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IERNQUNIX1BDTTJfUlgsCisJCS5lbmQJPSBETUFDSF9QQ00yX1JYLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MzEwX2RldmljZV9wY20yID0geworCS5uYW1lID0gInNhbXN1bmctcGNtIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzNXB2MzEwX3BjbTJfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IHM1cHYzMTBfcGNtMl9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfcGNtX3BkYXRhLAorCX0sCit9OworCisvKiBBQzk3IENvbnRyb2xsZXIgcGxhdGZvcm0gZGV2aWNlcyAqLworCitzdGF0aWMgaW50IHM1cHYzMTBfYWM5N19jZmdfZ3BpbyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzM2NfZ3Bpb19jZmdwaW5fcmFuZ2UoUzVQVjMxMF9HUEMwKDApLCA1LCBTM0NfR1BJT19TRk4oNCkpOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYzMTBfYWM5N19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9BQzk3LAorCQkuZW5kCT0gUzVQVjMxMF9QQV9BQzk3ICsgMHgxMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfQUM5N19QQ01PVVQsCisJCS5lbmQJPSBETUFDSF9BQzk3X1BDTU9VVCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydAk9IERNQUNIX0FDOTdfUENNSU4sCisJCS5lbmQJPSBETUFDSF9BQzk3X1BDTUlOLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCVszXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfQUM5N19NSUNJTiwKKwkJLmVuZAk9IERNQUNIX0FDOTdfTUlDSU4sCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzRdID0geworCQkuc3RhcnQJPSBJUlFfQUM5NywKKwkJLmVuZAk9IElSUV9BQzk3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgczNjX2FjOTdfcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwdjMxMF9hYzk3X2NmZ19ncGlvLAorfTsKKworc3RhdGljIHU2NCBzNXB2MzEwX2FjOTdfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2VfYWM5NyA9IHsKKwkubmFtZSA9ICJzYW1zdW5nLWFjOTciLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShzNXB2MzEwX2FjOTdfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IHM1cHYzMTBfYWM5N19yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzM2NfYWM5N19wZGF0YSwKKwkJLmRtYV9tYXNrID0gJnM1cHYzMTBfYWM5N19kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworCisvKiBTL1BESUYgQ29udHJvbGxlciBwbGF0Zm9ybV9kZXZpY2UgKi8KKworc3RhdGljIGludCBzNXB2MzEwX3NwZGlmX2NmZ19ncGlvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJczNjX2dwaW9fY2ZncGluX3JhbmdlKFM1UFYzMTBfR1BDMSgwKSwgMiwgUzNDX0dQSU9fU0ZOKDMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHM1cHYzMTBfc3BkaWZfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFM1UFYzMTBfUEFfU1BESUYsCisJCS5lbmQJPSBTNVBWMzEwX1BBX1NQRElGICsgMHgxMDAgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gRE1BQ0hfU1BESUYsCisJCS5lbmQJPSBETUFDSF9TUERJRiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIHNhbXN1bmdfc3BkaWZfcGRhdGEgPSB7CisJLmNmZ19ncGlvID0gczVwdjMxMF9zcGRpZl9jZmdfZ3BpbywKK307CisKK3N0YXRpYyB1NjQgczVwdjMxMF9zcGRpZl9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MzEwX2RldmljZV9zcGRpZiA9IHsKKwkubmFtZSA9ICJzYW1zdW5nLXNwZGlmIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoczVwdjMxMF9zcGRpZl9yZXNvdXJjZSksCisJLnJlc291cmNlID0gczVwdjMxMF9zcGRpZl9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzYW1zdW5nX3NwZGlmX3BkYXRhLAorCQkuZG1hX21hc2sgPSAmczVwdjMxMF9zcGRpZl9kbWFtYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDY2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvZG1hLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgorICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisjaW5jbHVkZSA8cGxhdC9pcnFzLmg+CisKKyNpbmNsdWRlIDxtYWNoL21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSA8cGxhdC9zM2MtcGwzMzAtcGRhdGEuaD4KKworc3RhdGljIHU2NCBkbWFfZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwdjMxMF9wZG1hMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9QRE1BMCwKKwkJLmVuZAk9IFM1UFYzMTBfUEFfUERNQTAgKyBTWl80SywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9QRE1BMCwKKwkJLmVuZAk9IElSUV9QRE1BMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIHM1cHYzMTBfcGRtYTBfcGRhdGEgPSB7CisJLnBlcmkgPSB7CisJCVswXSA9IERNQUNIX1BDTTBfUlgsCisJCVsxXSA9IERNQUNIX1BDTTBfVFgsCisJCVsyXSA9IERNQUNIX1BDTTJfUlgsCisJCVszXSA9IERNQUNIX1BDTTJfVFgsCisJCVs0XSA9IERNQUNIX01TTV9SRVEwLAorCQlbNV0gPSBETUFDSF9NU01fUkVRMiwKKwkJWzZdID0gRE1BQ0hfU1BJMF9SWCwKKwkJWzddID0gRE1BQ0hfU1BJMF9UWCwKKwkJWzhdID0gRE1BQ0hfU1BJMl9SWCwKKwkJWzldID0gRE1BQ0hfU1BJMl9UWCwKKwkJWzEwXSA9IERNQUNIX0kyUzBTX1RYLAorCQlbMTFdID0gRE1BQ0hfSTJTMF9SWCwKKwkJWzEyXSA9IERNQUNIX0kyUzBfVFgsCisJCVsxM10gPSBETUFDSF9JMlMyX1JYLAorCQlbMTRdID0gRE1BQ0hfSTJTMl9UWCwKKwkJWzE1XSA9IERNQUNIX1VBUlQwX1JYLAorCQlbMTZdID0gRE1BQ0hfVUFSVDBfVFgsCisJCVsxN10gPSBETUFDSF9VQVJUMl9SWCwKKwkJWzE4XSA9IERNQUNIX1VBUlQyX1RYLAorCQlbMTldID0gRE1BQ0hfVUFSVDRfUlgsCisJCVsyMF0gPSBETUFDSF9VQVJUNF9UWCwKKwkJWzIxXSA9IERNQUNIX1NMSU1CVVMwX1JYLAorCQlbMjJdID0gRE1BQ0hfU0xJTUJVUzBfVFgsCisJCVsyM10gPSBETUFDSF9TTElNQlVTMl9SWCwKKwkJWzI0XSA9IERNQUNIX1NMSU1CVVMyX1RYLAorCQlbMjVdID0gRE1BQ0hfU0xJTUJVUzRfUlgsCisJCVsyNl0gPSBETUFDSF9TTElNQlVTNF9UWCwKKwkJWzI3XSA9IERNQUNIX0FDOTdfTUlDSU4sCisJCVsyOF0gPSBETUFDSF9BQzk3X1BDTUlOLAorCQlbMjldID0gRE1BQ0hfQUM5N19QQ01PVVQsCisJCVszMF0gPSBETUFDSF9NQVgsCisJCVszMV0gPSBETUFDSF9NQVgsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX3BkbWEwID0geworCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXB2MzEwX3BkbWEwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXB2MzEwX3BkbWEwX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhID0gJnM1cHYzMTBfcGRtYTBfcGRhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczVwdjMxMF9wZG1hMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUzVQVjMxMF9QQV9QRE1BMSwKKwkJLmVuZAk9IFM1UFYzMTBfUEFfUERNQTEgKyBTWl80SywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9QRE1BMSwKKwkJLmVuZAk9IElSUV9QRE1BMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjX3BsMzMwX3BsYXRkYXRhIHM1cHYzMTBfcGRtYTFfcGRhdGEgPSB7CisJLnBlcmkgPSB7CisJCVswXSA9IERNQUNIX1BDTTBfUlgsCisJCVsxXSA9IERNQUNIX1BDTTBfVFgsCisJCVsyXSA9IERNQUNIX1BDTTFfUlgsCisJCVszXSA9IERNQUNIX1BDTTFfVFgsCisJCVs0XSA9IERNQUNIX01TTV9SRVExLAorCQlbNV0gPSBETUFDSF9NU01fUkVRMywKKwkJWzZdID0gRE1BQ0hfU1BJMV9SWCwKKwkJWzddID0gRE1BQ0hfU1BJMV9UWCwKKwkJWzhdID0gRE1BQ0hfSTJTMFNfVFgsCisJCVs5XSA9IERNQUNIX0kyUzBfUlgsCisJCVsxMF0gPSBETUFDSF9JMlMwX1RYLAorCQlbMTFdID0gRE1BQ0hfSTJTMV9SWCwKKwkJWzEyXSA9IERNQUNIX0kyUzFfVFgsCisJCVsxM10gPSBETUFDSF9VQVJUMF9SWCwKKwkJWzE0XSA9IERNQUNIX1VBUlQwX1RYLAorCQlbMTVdID0gRE1BQ0hfVUFSVDFfUlgsCisJCVsxNl0gPSBETUFDSF9VQVJUMV9UWCwKKwkJWzE3XSA9IERNQUNIX1VBUlQzX1JYLAorCQlbMThdID0gRE1BQ0hfVUFSVDNfVFgsCisJCVsxOV0gPSBETUFDSF9TTElNQlVTMV9SWCwKKwkJWzIwXSA9IERNQUNIX1NMSU1CVVMxX1RYLAorCQlbMjFdID0gRE1BQ0hfU0xJTUJVUzNfUlgsCisJCVsyMl0gPSBETUFDSF9TTElNQlVTM19UWCwKKwkJWzIzXSA9IERNQUNIX1NMSU1CVVM1X1JYLAorCQlbMjRdID0gRE1BQ0hfU0xJTUJVUzVfVFgsCisJCVsyNV0gPSBETUFDSF9TTElNQlVTMEFVWF9SWCwKKwkJWzI2XSA9IERNQUNIX1NMSU1CVVMwQVVYX1RYLAorCQlbMjddID0gRE1BQ0hfU1BESUYsCisJCVsyOF0gPSBETUFDSF9NQVgsCisJCVsyOV0gPSBETUFDSF9NQVgsCisJCVszMF0gPSBETUFDSF9NQVgsCisJCVszMV0gPSBETUFDSF9NQVgsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX3BkbWExID0geworCS5uYW1lCQk9ICJzM2MtcGwzMzAiLAorCS5pZAkJPSAxLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzNXB2MzEwX3BkbWExX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBzNXB2MzEwX3BkbWExX3Jlc291cmNlLAorCS5kZXYJCT0geworCQkuZG1hX21hc2sgPSAmZG1hX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJCS5wbGF0Zm9ybV9kYXRhID0gJnM1cHYzMTBfcGRtYTFfcGRhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzNXB2MzEwX2RtYWNzW10gX19pbml0ZGF0YSA9IHsKKwkmczVwdjMxMF9kZXZpY2VfcGRtYTAsCisJJnM1cHYzMTBfZGV2aWNlX3BkbWExLAorfTsKKworc3RhdGljIGludCBfX2luaXQgczVwdjMxMF9kbWFfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKHM1cHYzMTBfZG1hY3MsIEFSUkFZX1NJWkUoczVwdjMxMF9kbWFjcykpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHM1cHYzMTBfZG1hX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL21hY2gtczVwdjMxMC9pbmNsdWRlL21hY2gvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyMDllYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjMxMC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQuCisgKglKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX01BQ0hfRE1BX0gKKyNkZWZpbmUgX19NQUNIX0RNQV9ICisKKy8qIFRoaXMgcGxhdGZvcm0gdXNlcyB0aGUgY29tbW9uIFMzQyBETUEgQVBJIGRyaXZlciBmb3IgUEwzMzAgKi8KKyNpbmNsdWRlIDxwbGF0L3MzYy1kbWEtcGwzMzAuaD4KKworI2VuZGlmIC8qIF9fTUFDSF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA5OWU3ZGFkLi4zYzA1YzU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXM1cHYzMTAvaW5jbHVkZS9tYWNoL2lycXMuaAorKysgYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtNTQsNiArNTQsOSBAQAogI2RlZmluZSBDT01CSU5FUl9HUk9VUCh4KQkoKHgpICogTUFYX0lSUV9JTl9DT01CSU5FUiArIElSUV9TUEkoNjQpKQogI2RlZmluZSBDT01CSU5FUl9JUlEoeCwgeSkJKENPTUJJTkVSX0dST1VQKHgpICsgeSkKIAorI2RlZmluZSBJUlFfUERNQTAJCUNPTUJJTkVSX0lSUSgyMSwgMCkKKyNkZWZpbmUgSVJRX1BETUExCQlDT01CSU5FUl9JUlEoMjEsIDEpCisKICNkZWZpbmUgSVJRX1RJTUVSMF9WSUMJCUNPTUJJTkVSX0lSUSgyMiwgMCkKICNkZWZpbmUgSVJRX1RJTUVSMV9WSUMJCUNPTUJJTkVSX0lSUSgyMiwgMSkKICNkZWZpbmUgSVJRX1RJTUVSMl9WSUMJCUNPTUJJTkVSX0lSUSgyMiwgMikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczVwdjMxMC9pbmNsdWRlL21hY2gvbWFwLmggYi9hcmNoL2FybS9tYWNoLXM1cHYzMTAvaW5jbHVkZS9tYWNoL21hcC5oCmluZGV4IDdhY2Y0ZTcuLjUzOTk0NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjMxMC9pbmNsdWRlL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zNXB2MzEwL2luY2x1ZGUvbWFjaC9tYXAuaApAQCAtNTIsNiArNTIsMTEgQEAKICNkZWZpbmUgUzVQVjMxMF9QQV9HSUNfRElTVAkJKDB4MTA1MDEwMDApCiAjZGVmaW5lIFM1UFYzMTBfUEFfTDJDQwkJCSgweDEwNTAyMDAwKQogCisvKiBETUEgKi8KKyNkZWZpbmUgUzVQVjMxMF9QQV9NRE1BCQkweDEwODEwMDAwCisjZGVmaW5lIFM1UFYzMTBfUEFfUERNQTAJMHgxMjY4MDAwMAorI2RlZmluZSBTNVBWMzEwX1BBX1BETUExCTB4MTI2OTAwMDAKKwogI2RlZmluZSBTNVBWMzEwX1BBX0dQSU8xCQkoMHgxMTQwMDAwMCkKICNkZWZpbmUgUzVQVjMxMF9QQV9HUElPMgkJKDB4MTEwMDAwMDApCiAjZGVmaW5lIFM1UFYzMTBfUEFfR1BJTzMJCSgweDAzODYwMDAwKQpAQCAtNjAsNiArNjUsMjIgQEAKIAogI2RlZmluZSBTNVBWMzEwX1BBX1NST01DCQkoMHgxMjU3MDAwMCkKIAorLyogUy9QRElGICovCisjZGVmaW5lIFM1UFYzMTBfUEFfU1BESUYJMHhFMTEwMDAwMAorCisvKiBJMlMgKi8KKyNkZWZpbmUgUzVQVjMxMF9QQV9JMlMwCQkweDAzODMwMDAwCisjZGVmaW5lIFM1UFYzMTBfUEFfSTJTMQkJMHhFMzEwMDAwMAorI2RlZmluZSBTNVBWMzEwX1BBX0kyUzIJCTB4RTJBMDAwMDAKKworLyogUENNICovCisjZGVmaW5lIFM1UFYzMTBfUEFfUENNMAkJMHgwMzg0MDAwMAorI2RlZmluZSBTNVBWMzEwX1BBX1BDTTEJCTB4MTM5ODAwMDAKKyNkZWZpbmUgUzVQVjMxMF9QQV9QQ00yCQkweDEzOTkwMDAwCisKKy8qIEFDOTcgKi8KKyNkZWZpbmUgUzVQVjMxMF9QQV9BQzk3CQkweDEzOUEwMDAwCisKICNkZWZpbmUgUzVQVjMxMF9QQV9VQVJUCQkJKDB4MTM4MDAwMDApCiAKICNkZWZpbmUgUzVQX1BBX1VBUlQoeCkJCQkoUzVQVjMxMF9QQV9VQVJUICsgKCh4KSAqIFMzQ19VQVJUX09GRlNFVCkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcG0uYwppbmRleCBjODNmZGM4Li5hYjlmYzQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BtLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCXJldHVybiB2aXJ0X3RvX3BoeXMoc3ApOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHNhMTF4MF9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHNhMTF4MF9wbV9vcHMgPSB7CiAJLmVudGVyCQk9IHNhMTF4MF9wbV9lbnRlciwKIAkudmFsaWQJCT0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCBjZDc5ZDdjLi4zY2YwOTUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTI0NywxMCArMjQ3LDcgQEAKICAqLwogc3RhdGljIGludCBzbG90X2NuN19nZXRfY2Qoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpZiAoZ3Bpb19pc192YWxpZChHUElPX1BPUlQ0MSkpCi0JCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoR1BJT19QT1JUNDEpOwotCWVsc2UKLQkJcmV0dXJuIC1FTlhJTzsKKwlyZXR1cm4gIWdwaW9fZ2V0X3ZhbHVlKEdQSU9fUE9SVDQxKTsKIH0KIAogLyogU0hfTU1DSUYgKi8KQEAgLTMwOCw2ICszMDUsNyBAQAogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkwX2luZm8gPSB7CiAJLmRtYV9zbGF2ZV90eAk9IFNIRE1BX1NMQVZFX1NESEkwX1RYLAogCS5kbWFfc2xhdmVfcngJPSBTSERNQV9TTEFWRV9TREhJMF9SWCwKKwkudG1pb19jYXBzCT0gTU1DX0NBUF9TRElPX0lSUSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTBfcmVzb3VyY2VzW10gPSB7CkBAIC0zMzksNyArMzM3LDcgQEAKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTFfUlgsCiAJLnRtaW9fb2NyX21hc2sJPSBNTUNfVkREXzE2NV8xOTUsCiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9ORUVEU19QT0xMLAorCS50bWlvX2NhcHMJPSBNTUNfQ0FQX05FRURTX1BPTEwgfCBNTUNfQ0FQX1NESU9fSVJRLAogCS5nZXRfY2QJCT0gc2xvdF9jbjdfZ2V0X2NkLAogfTsKIApAQCAtNzExLDYgKzcwOSwxMCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmc2lfYWs0NjQzX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfZnNpMl9hX2FrNDY0MyIsCit9OworCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9sY2RjX2luZm8gc2hfbW9iaWxlX2xjZGMxX2luZm8gPSB7CiAJLmNsb2NrX3NvdXJjZSA9IExDRENfQ0xLX0VYVEVSTkFMLAogCS5jaFswXSA9IHsKQEAgLTkzMyw2ICs5MzUsNyBAQAogCSZzZGhpMV9kZXZpY2UsCiAJJnVzYjFfaG9zdF9kZXZpY2UsCiAJJmZzaV9kZXZpY2UsCisJJmZzaV9hazQ2NDNfZGV2aWNlLAogCSZzaF9tbWNpZl9kZXZpY2UsCiAJJmxjZGMxX2RldmljZSwKIAkmbGNkY19kZXZpY2UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWc0ZXZtLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWc0ZXZtLmMKaW5kZXggYzEzZjAxMi4uZGVlM2U5MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1nNGV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtZzRldm0uYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zaF9rZXlzYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NoX21vYmlsZV9zZGhpLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvc2g3Mzc3Lmg+CkBAIC0xOTYsNiArMTk3LDEwIEBACiB9OwogCiAvKiBTREhJICovCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9zZGhpX2luZm8gc2RoaTBfaW5mbyA9IHsKKwkudG1pb19jYXBzCT0gTU1DX0NBUF9TRElPX0lSUSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkubmFtZQk9ICJTREhJMCIsCkBAIC0yMTQsNiArMjE5LDEzIEBACiAJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMF9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSAgICAgICA9IHNkaGkwX3Jlc291cmNlcywKIAkuaWQgICAgICAgICAgICAgPSAwLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNkaGkwX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMV9pbmZvID0geworCS50bWlvX2NhcHMJPSBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8IE1NQ19DQVBfU0RJT19JUlEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNkaGkxX3Jlc291cmNlc1tdID0gewpAQCAtMjM0LDYgKzI0Niw5IEBACiAJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzZGhpMV9yZXNvdXJjZXMpLAogCS5yZXNvdXJjZSAgICAgICA9IHNkaGkxX3Jlc291cmNlcywKIAkuaWQgICAgICAgICAgICAgPSAxLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNkaGkxX2luZm8sCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpnNGV2bV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwppbmRleCA1YmNmNWMxLi43YjE1ZDIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCkBAIC02NTcsMTcgKzY1NywxNCBAQAogICovCiBzdGF0aWMgaW50IHNsb3RfY243X2dldF9jZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWlmIChncGlvX2lzX3ZhbGlkKEdQSU9fUE9SVDQxKSkKLQkJcmV0dXJuICFncGlvX2dldF92YWx1ZShHUElPX1BPUlQ0MSk7Ci0JZWxzZQotCQlyZXR1cm4gLUVOWElPOworCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoR1BJT19QT1JUNDEpOwogfQogCiAvKiBTREhJMCAqLwogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkwX2luZm8gPSB7CiAJLmRtYV9zbGF2ZV90eAk9IFNIRE1BX1NMQVZFX1NESEkwX1RYLAogCS5kbWFfc2xhdmVfcngJPSBTSERNQV9TTEFWRV9TREhJMF9SWCwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9TRF9ISUdIU1BFRUQsCisJLnRtaW9fY2Fwcwk9IE1NQ19DQVBfU0RfSElHSFNQRUVEIHwgTU1DX0NBUF9TRElPX0lSUSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTBfcmVzb3VyY2VzW10gPSB7CkBAIC03MDAsNyArNjk3LDcgQEAKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTFfUlgsCiAJLnRtaW9fb2NyX21hc2sJPSBNTUNfVkREXzE2NV8xOTUsCiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAorCS50bWlvX2NhcHMJPSBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RJT19JUlEgfAogCQkJICBNTUNfQ0FQX05FRURTX1BPTEwsCiAJLmdldF9jZAkJPSBzbG90X2NuN19nZXRfY2QsCiB9OwpAQCAtNzI5LDEzICs3MjYsMjMgQEAKIH07CiAjZW5kaWYKIAorLyoKKyAqIFRoZSBjYXJkIGRldGVjdCBwaW4gb2YgdGhlIHRvcCBTRC9NTUMgc2xvdCAoQ04yMykgaXMgYWN0aXZlIGxvdyBhbmQgaXMKKyAqIGNvbm5lY3RlZCB0byBHUElPIFNDSUZCX1NDSyBvZiBTSDczNzIgKEdQSU9fUE9SVDE2MikuCisgKi8KK3N0YXRpYyBpbnQgc2xvdF9jbjIzX2dldF9jZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAhZ3Bpb19nZXRfdmFsdWUoR1BJT19QT1JUMTYyKTsKK30KKwogLyogU0RISTIgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMl9pbmZvID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMl9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTJfUlgsCiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKLQkudG1pb19jYXBzCT0gTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAorCS50bWlvX2NhcHMJPSBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8IE1NQ19DQVBfU0RJT19JUlEgfAogCQkJICBNTUNfQ0FQX05FRURTX1BPTEwsCisJLmdldF9jZAkJPSBzbG90X2NuMjNfZ2V0X2NkLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZGhpMl9yZXNvdXJjZXNbXSA9IHsKQEAgLTk1Myw2ICs5NjAsNyBAQAogfTsKIAogLyogSTJDICovCisjZGVmaW5lIElSUTcgZXZ0MmlycSgweDAyZTApCiAjZGVmaW5lIElSUTkgZXZ0MmlycSgweDAzMjApCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjMF9kZXZpY2VzW10gPSB7CkBAIC05NjUsNiArOTczLDExIEBACiAJCS5wbGF0Zm9ybV9kYXRhID0gJm1hY2tlcmVsX3RjYTY0MTZfa2V5c19pbmZvLAogCQkuaXJxID0gSVJROSwKIAl9LAorCS8qIFRvdWNoc2NyZWVuICovCisJeworCQlJMkNfQk9BUkRfSU5GTygic3QxMjMyLXRzIiwgMHg1NSksCisJCS5pcnEgPSBJUlE3LAorCX0sCiB9OwogCiAjZGVmaW5lIElSUTIxIGV2dDJpcnEoMHgzMmEwKQpAQCAtMTA5Miw2ICsxMTA1LDEwIEBACiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSVJROV80MiwJTlVMTCk7CiAJc2V0X2lycV90eXBlKElSUTksIElSUV9UWVBFX0xFVkVMX0hJR0gpOwogCisJLyogZW5hYmxlIFRvdWNoc2NyZWVuICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSVJRN180MCwJTlVMTCk7CisJc2V0X2lycV90eXBlKElSUTcsIElSUV9UWVBFX0xFVkVMX0xPVyk7CisKIAkvKiBlbmFibGUgQWNjZWxlcm9tZXRlciAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX0lSUTIxLAlOVUxMKTsKIAlzZXRfaXJxX3R5cGUoSVJRMjEsIElSUV9UWVBFX0xFVkVMX0hJR0gpOwpAQCAtMTEyNyw2ICsxMTQ0LDEwIEBACiAJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0RISUQyXzEsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NESElEMl8wLCBOVUxMKTsKIAorCS8qIGNhcmQgZGV0ZWN0IHBpbiBmb3IgbWljcm9TRCBzbG90IChDTjIzKSAqLworCWdwaW9fcmVxdWVzdChHUElPX1BPUlQxNjIsIE5VTEwpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KEdQSU9fUE9SVDE2Mik7CisKIAkvKiBNTUNJRiAqLwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzAsIE5VTEwpOwogCWdwaW9fcmVxdWVzdChHUElPX0ZOX01NQ0QwXzEsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvaGVhZC1hcDRldmIudHh0IGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbmNsdWRlL21hY2gvaGVhZC1hcDRldmIudHh0CmluZGV4IGUzZWJmYTcuLmVmZDM2ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2hlYWQtYXA0ZXZiLnR4dAorKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9oZWFkLWFwNGV2Yi50eHQKQEAgLTg1LDMgKzg1LDEwIEBACiBXQUlUIDEsIDB4RkU0MDAwOUMKIAogRUQgMHhFNjE1MDM1NCwgMHgwMDAwMDAwMgorCitMSVNUICJTQ0lGMCAtIFNlcmlhbCBwb3J0IGZvciBlYXJseXByaW50ayIKK0VCIDB4RTYwNTMwOTgsIDB4MTEKK0VCIDB4RTYwNTMwOTgsIDB4ZTEKK0VXIDB4RTZDNDAwMDAsIDB4MDAwMAorRUIgMHhFNkM0MDAwNCwgMHgxOQorRVcgMHhFNkM0MDAwOCwgMHgzMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2luY2x1ZGUvbWFjaC9oZWFkLW1hY2tlcmVsLnR4dCBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2hlYWQtbWFja2VyZWwudHh0CmluZGV4IGUzZWJmYTcuLmVmZDM2ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2hlYWQtbWFja2VyZWwudHh0CisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW5jbHVkZS9tYWNoL2hlYWQtbWFja2VyZWwudHh0CkBAIC04NSwzICs4NSwxMCBAQAogV0FJVCAxLCAweEZFNDAwMDlDCiAKIEVEIDB4RTYxNTAzNTQsIDB4MDAwMDAwMDIKKworTElTVCAiU0NJRjAgLSBTZXJpYWwgcG9ydCBmb3IgZWFybHlwcmludGsiCitFQiAweEU2MDUzMDk4LCAweDExCitFQiAweEU2MDUzMDk4LCAweGUxCitFVyAweEU2QzQwMDAwLCAweDAwMDAKK0VCIDB4RTZDNDAwMDQsIDB4MTkKK0VXIDB4RTZDNDAwMDgsIDB4MzAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM2Ny5jCmluZGV4IDFhMjBjNDguLjJmZTk3MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzY3LmMKQEAgLTE4OSwxMCArMTg5LDEwIEBACiAJICB7IFNDSUZCLCBTQ0lGQTUsIFNDSUZBNCwgTVNJT0YxLAogCSAgICAwLCAwLCBNU0lPRjIsIDAgfSB9LAogCXsgMHhlNjk0MDA5YywgMHhlNjk0MDBkYywgOCwgLyogSU1SN0EgLyBJTUNSN0EgKi8KLQkgIHsgRElTQUJMRUQsIERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELAorCSAgeyBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwKIAkgICAgRkxDVExfRkxUUkVRMUksIEZMQ1RMX0ZMVFJFUTBJLCBGTENUTF9GTFRFTkRJLCBGTENUTF9GTFNURUkgfSB9LAogCXsgMHhlNjk0MDBhMCwgMHhlNjk0MDBlMCwgOCwgLyogSU1SOEEgLyBJTUNSOEEgKi8KLQkgIHsgRElTQUJMRUQsIERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELAorCSAgeyBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwKIAkgICAgVFRJMjAsIFVTQkRNQUNfVVNIRE1JLCBTUFUsIFNJVSB9IH0sCiAJeyAweGU2OTQwMGE0LCAweGU2OTQwMGU0LCA4LCAvKiBJTVI5QSAvIElNQ1I5QSAqLwogCSAgeyBDTVQxX0NNVDEzLCBDTVQxX0NNVDEyLCBDTVQxX0NNVDExLCBDTVQxX0NNVDEwLApAQCAtMjA3LDcgKzIwNyw3IEBACiAJICB7IDAsIDAsIFRQVTAsIFRQVTEsCiAJICAgIFRQVTIsIFRQVTMsIFRQVTQsIDAgfSB9LAogCXsgMHhlNjk0MDBiNCwgMHhlNjk0MDBmNCwgOCwgLyogSU1SMTNBIC8gSU1DUjEzQSAqLwotCSAgeyBESVNBQkxFRCwgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsCisJICB7IERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELCBFTkFCTEVELAogCSAgICBNSVNUWSwgQ01UMywgUldEVDEsIFJXRFQwIH0gfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzIuYwppbmRleCAzMGIyZjQwLi5mNzhhMWVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Mi5jCkBAIC0yMzAsMTAgKzIzMCwxMCBAQAogCSAgeyBTQ0lGQiwgU0NJRkE1LCBTQ0lGQTQsIE1TSU9GMSwKIAkgICAgMCwgMCwgTVNJT0YyLCAwIH0gfSwKIAl7IDB4ZTY5NDAwOWMsIDB4ZTY5NDAwZGMsIDgsIC8qIElNUjdBIC8gSU1DUjdBICovCi0JICB7IERJU0FCTEVELCBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwKKwkgIHsgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsCiAJICAgIEZMQ1RMX0ZMVFJFUTFJLCBGTENUTF9GTFRSRVEwSSwgRkxDVExfRkxURU5ESSwgRkxDVExfRkxTVEVJIH0gfSwKIAl7IDB4ZTY5NDAwYTAsIDB4ZTY5NDAwZTAsIDgsIC8qIElNUjhBIC8gSU1DUjhBICovCi0JICB7IDAsIERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELAorCSAgeyAwLCBFTkFCTEVELCBFTkFCTEVELCBFTkFCTEVELAogCSAgICBUVEkyMCwgVVNCSFNETUFDMF9VU0hETUksIDAsIDAgfSB9LAogCXsgMHhlNjk0MDBhNCwgMHhlNjk0MDBlNCwgOCwgLyogSU1SOUEgLyBJTUNSOUEgKi8KIAkgIHsgQ01UMV9DTVQxMywgQ01UMV9DTVQxMiwgQ01UMV9DTVQxMSwgQ01UMV9DTVQxMCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczNzcuYwppbmRleCAyY2RlYjhjLi5kZDU2ODM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3Mzc3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzM3Ny5jCkBAIC0yMzQsMTAgKzIzNCwxMCBAQAogCSAgeyBTQ0lGQiwgU0NJRkE1LCBTQ0lGQTQsIE1TSU9GMSwKIAkgICAgMCwgMCwgTVNJT0YyLCAwIH0gfSwKIAl7IDB4ZTY5NDAwOWMsIDB4ZTY5NDAwZGMsIDgsIC8qIElNUjdBIC8gSU1DUjdBICovCi0JICB7IERJU0FCTEVELCBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwKKwkgIHsgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsCiAJICAgIEZMQ1RMX0ZMVFJFUTFJLCBGTENUTF9GTFRSRVEwSSwgRkxDVExfRkxURU5ESSwgRkxDVExfRkxTVEVJIH0gfSwKIAl7IDB4ZTY5NDAwYTAsIDB4ZTY5NDAwZTAsIDgsIC8qIElNUjhBIC8gSU1DUjhBICovCi0JICB7IERJU0FCTEVELCBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwKKwkgIHsgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsCiAJICAgIFRUSTIwLCBVU0JETUFDX1VTSERNSSwgMCwgTVNVRyB9IH0sCiAJeyAweGU2OTQwMGE0LCAweGU2OTQwMGU0LCA4LCAvKiBJTVI5QSAvIElNQ1I5QSAqLwogCSAgeyBDTVQxX0NNVDEzLCBDTVQxX0NNVDEyLCBDTVQxX0NNVDExLCBDTVQxX0NNVDEwLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzY3LmMKaW5kZXggMDAzMDA4Yy4uY2UyODE0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNjcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM2Ny5jCkBAIC0zNSw2ICszNSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjNDAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjMDApLCBldnQyaXJxKDB4YzAwKSwKIAkJCSAgICBldnQyaXJxKDB4YzAwKSwgZXZ0MmlycSgweGMwMCkgfSwKQEAgLTUyLDYgKzU0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmM1MDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGMyMCksIGV2dDJpcnEoMHhjMjApLAogCQkJICAgIGV2dDJpcnEoMHhjMjApLCBldnQyaXJxKDB4YzIwKSB9LApAQCAtNjksNiArNzMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzYwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzQwKSwgZXZ0MmlycSgweGM0MCksCiAJCQkgICAgZXZ0MmlycSgweGM0MCksIGV2dDJpcnEoMHhjNDApIH0sCkBAIC04Niw2ICs5Miw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjNzAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjNjApLCBldnQyaXJxKDB4YzYwKSwKIAkJCSAgICBldnQyaXJxKDB4YzYwKSwgZXZ0MmlycSgweGM2MCkgfSwKQEAgLTEwMyw2ICsxMTEsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY0X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzgwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4ZDIwKSwgZXZ0MmlycSgweGQyMCksCiAJCQkgICAgZXZ0MmlycSgweGQyMCksIGV2dDJpcnEoMHhkMjApIH0sCkBAIC0xMjAsNiArMTMwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmNiMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGQ0MCksIGV2dDJpcnEoMHhkNDApLAogCQkJICAgIGV2dDJpcnEoMHhkNDApLCBldnQyaXJxKDB4ZDQwKSB9LApAQCAtMTM3LDYgKzE0OSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjZfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjMzAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkNjApLCBldnQyaXJxKDB4ZDYwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDYwKSwgZXZ0MmlycSgweGQ2MCkgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzcyLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM3Mi5jCmluZGV4IDJlM2UxMWUuLmZmMDQ5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3MzcyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNzIuYwpAQCAtMzgsNiArMzgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzQwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweDBjMDApLCBldnQyaXJxKDB4MGMwMCksCiAJCQkgICAgZXZ0MmlycSgweDBjMDApLCBldnQyaXJxKDB4MGMwMCkgfSwKQEAgLTU1LDYgKzU3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmM1MDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHgwYzIwKSwgZXZ0MmlycSgweDBjMjApLAogCQkJICAgIGV2dDJpcnEoMHgwYzIwKSwgZXZ0MmlycSgweDBjMjApIH0sCkBAIC03Miw2ICs3Niw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjNjAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4MGM0MCksIGV2dDJpcnEoMHgwYzQwKSwKIAkJCSAgICBldnQyaXJxKDB4MGM0MCksIGV2dDJpcnEoMHgwYzQwKSB9LApAQCAtODksNiArOTUsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzcwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweDBjNjApLCBldnQyaXJxKDB4MGM2MCksCiAJCQkgICAgZXZ0MmlycSgweDBjNjApLCBldnQyaXJxKDB4MGM2MCkgfSwKQEAgLTEwNiw2ICsxMTQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY0X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzgwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweDBkMjApLCBldnQyaXJxKDB4MGQyMCksCiAJCQkgICAgZXZ0MmlycSgweDBkMjApLCBldnQyaXJxKDB4MGQyMCkgfSwKQEAgLTEyMyw2ICsxMzMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2Y2IwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweDBkNDApLCBldnQyaXJxKDB4MGQ0MCksCiAJCQkgICAgZXZ0MmlycSgweDBkNDApLCBldnQyaXJxKDB4MGQ0MCkgfSwKQEAgLTE0MCw2ICsxNTIsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY2X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzMwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZCLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweDBkNjApLCBldnQyaXJxKDB4MGQ2MCksCiAJCQkgICAgZXZ0MmlycSgweDBkNjApLCBldnQyaXJxKDB4MGQ2MCkgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3Mzc3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzM3Ny5jCmluZGV4IDU3NWRiZDYuLjgwOTliMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3Mzc3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczNzcuYwpAQCAtMzYsNiArMzYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzQwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzAwKSwgZXZ0MmlycSgweGMwMCksCiAJCQkgICAgZXZ0MmlycSgweGMwMCksIGV2dDJpcnEoMHhjMDApIH0sCkBAIC01Myw2ICs1NSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjNTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhjMjApLCBldnQyaXJxKDB4YzIwKSwKIAkJCSAgICBldnQyaXJxKDB4YzIwKSwgZXZ0MmlycSgweGMyMCkgfSwKQEAgLTcwLDYgKzc0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmM2MDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGM0MCksIGV2dDJpcnEoMHhjNDApLAogCQkJICAgIGV2dDJpcnEoMHhjNDApLCBldnQyaXJxKDB4YzQwKSB9LApAQCAtODcsNiArOTMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzcwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyBldnQyaXJxKDB4YzYwKSwgZXZ0MmlycSgweGM2MCksCiAJCQkgICAgZXZ0MmlycSgweGM2MCksIGV2dDJpcnEoMHhjNjApIH0sCkBAIC0xMDQsNiArMTEyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmM4MDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgZXZ0MmlycSgweGQyMCksIGV2dDJpcnEoMHhkMjApLAogCQkJICAgIGV2dDJpcnEoMHhkMjApLCBldnQyaXJxKDB4ZDIwKSB9LApAQCAtMTIxLDYgKzEzMSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjVfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjYjAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkNDApLCBldnQyaXJxKDB4ZDQwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDQwKSwgZXZ0MmlycSgweGQ0MCkgfSwKQEAgLTEzOCw2ICsxNTAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY2X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2Y2MwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyBpbnRjc19ldnQyaXJxKDB4MWE4MCksIGludGNzX2V2dDJpcnEoMHgxYTgwKSwKIAkJCSAgICBpbnRjc19ldnQyaXJxKDB4MWE4MCksIGludGNzX2V2dDJpcnEoMHgxYTgwKSB9LApAQCAtMTU1LDYgKzE2OSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjdfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjMzAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IGV2dDJpcnEoMHhkNjApLCBldnQyaXJxKDB4ZDYwKSwKIAkJCSAgICBldnQyaXJxKDB4ZDYwKSwgZXZ0MmlycSgweGQ2MCkgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXNoNzNhMC5jCmluZGV4IGYxZWZmOGIuLjY4NWM0MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvc2V0dXAtc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1zaDczYTAuYwpAQCAtMzYsNiArMzYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzQwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSg3MiksIGdpY19zcGkoNzIpLAogCQkJICAgIGdpY19zcGkoNzIpLCBnaWNfc3BpKDcyKSB9LApAQCAtNTIsNiArNTQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzUwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSg3MyksIGdpY19zcGkoNzMpLAogCQkJICAgIGdpY19zcGkoNzMpLCBnaWNfc3BpKDczKSB9LApAQCAtNjgsNiArNzIsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzYwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSg3NCksIGdpY19zcGkoNzQpLAogCQkJICAgIGdpY19zcGkoNzQpLCBnaWNfc3BpKDc0KSB9LApAQCAtODQsNiArOTAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzcwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSg3NSksIGdpY19zcGkoNzUpLAogCQkJICAgIGdpY19zcGkoNzUpLCBnaWNfc3BpKDc1KSB9LApAQCAtMTAwLDYgKzEwOCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZTZjODAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJLmlycXMJCT0geyBnaWNfc3BpKDc4KSwgZ2ljX3NwaSg3OCksCiAJCQkgICAgZ2ljX3NwaSg3OCksIGdpY19zcGkoNzgpIH0sCkBAIC0xMTYsNiArMTI2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhlNmNiMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkuaXJxcwkJPSB7IGdpY19zcGkoNzkpLCBnaWNfc3BpKDc5KSwKIAkJCSAgICBnaWNfc3BpKDc5KSwgZ2ljX3NwaSg3OSkgfSwKQEAgLTEzMiw2ICsxNDQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY2X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2Y2MwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSgxNTYpLCBnaWNfc3BpKDE1NiksCiAJCQkgICAgZ2ljX3NwaSgxNTYpLCBnaWNfc3BpKDE1NikgfSwKQEAgLTE0OCw2ICsxNjIsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY3X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2Y2QwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZBLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSgxNDMpLCBnaWNfc3BpKDE0MyksCiAJCQkgICAgZ2ljX3NwaSgxNDMpLCBnaWNfc3BpKDE0MykgfSwKQEAgLTE2NCw2ICsxODAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY4X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGU2YzMwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUZCLAogCS5pcnFzCQk9IHsgZ2ljX3NwaSg4MCksIGdpY19zcGkoODApLAogCQkJICAgIGdpY19zcGkoODApLCBnaWNfc3BpKDgwKSB9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMwMC5jIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMwMC5jCmluZGV4IDM1NjBmOGMuLjVhYTJkNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzAwLmMKQEAgLTM3MSw3ICszNzEsNyBAQAogfTsKIAogLyogQWRkIHNwZWFyMzAwIHNwZWNpZmljIGRldmljZXMgaGVyZSAqLwotLyogYXJtIGdwaW8xIGRldmljZSByZWdpc3RlcmF0aW9uICovCisvKiBhcm0gZ3BpbzEgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLwogc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8xX3BsYXRfZGF0YSA9IHsKIAkuZ3Bpb19iYXNlCT0gOCwKIAkuaXJxX2Jhc2UJPSBTUEVBUl9HUElPMV9JTlRfQkFTRSwKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCS8qIGNhbGwgc3BlYXIzeHggZmFtaWx5IGNvbW1vbiBpbml0IGZ1bmN0aW9uICovCiAJc3BlYXIzeHhfaW5pdCgpOwogCi0JLyogc2hhcmVkIGlycSByZWdpc3RlcmF0aW9uICovCisJLyogc2hhcmVkIGlycSByZWdpc3RyYXRpb24gKi8KIAlzaGlycV9yYXMxLnJlZ3MuYmFzZSA9CiAJCWlvcmVtYXAoU1BFQVIzMDBfVEVMRUNPTV9CQVNFLCBTUEVBUjMwMF9URUxFQ09NX1JFR19TSVpFKTsKIAlpZiAoc2hpcnFfcmFzMS5yZWdzLmJhc2UpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMTAuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMTAuYwppbmRleCA5NmExYWI4Li41M2I0MWI1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyMzEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMxMC5jCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkvKiBjYWxsIHNwZWFyM3h4IGZhbWlseSBjb21tb24gaW5pdCBmdW5jdGlvbiAqLwogCXNwZWFyM3h4X2luaXQoKTsKIAotCS8qIHNoYXJlZCBpcnEgcmVnaXN0ZXJhdGlvbiAqLworCS8qIHNoYXJlZCBpcnEgcmVnaXN0cmF0aW9uICovCiAJYmFzZSA9IGlvcmVtYXAoU1BFQVIzMTBfU09DX0NPTkZJR19CQVNFLCBTUEVBUjMxMF9TT0NfQ09ORklHX1NJWkUpOwogCWlmIChiYXNlKSB7CiAJCS8qIHNoaXJxIDEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjAuYyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjAuYwppbmRleCA2YTEyMTk1NC4uODhiNDY1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzMjAuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAJLyogY2FsbCBzcGVhcjN4eCBmYW1pbHkgY29tbW9uIGluaXQgZnVuY3Rpb24gKi8KIAlzcGVhcjN4eF9pbml0KCk7CiAKLQkvKiBzaGFyZWQgaXJxIHJlZ2lzdGVyYXRpb24gKi8KKwkvKiBzaGFyZWQgaXJxIHJlZ2lzdHJhdGlvbiAqLwogCWJhc2UgPSBpb3JlbWFwKFNQRUFSMzIwX1NPQ19DT05GSUdfQkFTRSwgU1BFQVIzMjBfU09DX0NPTkZJR19TSVpFKTsKIAlpZiAoYmFzZSkgewogCQkvKiBzaGlycSAxICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyM3h4LmMgYi9hcmNoL2FybS9tYWNoLXNwZWFyM3h4L3NwZWFyM3h4LmMKaW5kZXggZTg3MzEzYS4uNTJmNTUzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zcGVhcjN4eC9zcGVhcjN4eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc3BlYXIzeHgvc3BlYXIzeHguYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1hY2gvc3BlYXIuaD4KIAogLyogQWRkIHNwZWFyM3h4IG1hY2hpbmVzIGNvbW1vbiBkZXZpY2VzIGhlcmUgKi8KLS8qIGdwaW8gZGV2aWNlIHJlZ2lzdGVyYXRpb24gKi8KKy8qIGdwaW8gZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLwogc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW9fcGxhdF9kYXRhID0gewogCS5ncGlvX2Jhc2UJPSAwLAogCS5pcnFfYmFzZQk9IFNQRUFSX0dQSU9fSU5UX0JBU0UsCkBAIC00MSw3ICs0MSw3IEBACiAJLmlycSA9IHtJUlFfQkFTSUNfR1BJTywgTk9fSVJRfSwKIH07CiAKLS8qIHVhcnQgZGV2aWNlIHJlZ2lzdGVyYXRpb24gKi8KKy8qIHVhcnQgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLwogc3RydWN0IGFtYmFfZGV2aWNlIHVhcnRfZGV2aWNlID0gewogCS5kZXYgPSB7CiAJCS5pbml0X25hbWUgPSAidWFydCIsCkBAIC01NDMsNiArNTQzLDYgQEAKIAogcG14X2ZhaWw6CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJwYWRtdXg6IHJlZ2lzdGVyYXRpb24gZmFpbGVkLiBlcnIgbm86ICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgInBhZG11eDogcmVnaXN0cmF0aW9uIGZhaWxlZC4gZXJyIG5vOiAlZFxuIiwKIAkJCQlyZXQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9zcGVhcjZ4eC5jIGIvYXJjaC9hcm0vbWFjaC1zcGVhcjZ4eC9zcGVhcjZ4eC5jCmluZGV4IGJhZjZiY2MuLmYyZmUxNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc3BlYXI2eHgvc3BlYXI2eHguYworKysgYi9hcmNoL2FybS9tYWNoLXNwZWFyNnh4L3NwZWFyNnh4LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxtYWNoL3NwZWFyLmg+CiAKIC8qIEFkZCBzcGVhcjZ4eCBtYWNoaW5lcyBjb21tb24gZGV2aWNlcyBoZXJlICovCi0vKiB1YXJ0IGRldmljZSByZWdpc3RlcmF0aW9uICovCisvKiB1YXJ0IGRldmljZSByZWdpc3RyYXRpb24gKi8KIHN0cnVjdCBhbWJhX2RldmljZSB1YXJ0X2RldmljZVtdID0gewogCXsKIAkJLmRldiA9IHsKQEAgLTUwLDcgKzUwLDcgQEAKIAl9CiB9OwogCi0vKiBncGlvIGRldmljZSByZWdpc3RlcmF0aW9uICovCisvKiBncGlvIGRldmljZSByZWdpc3RyYXRpb24gKi8KIHN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvX3BsYXRfZGF0YVtdID0gewogCXsKIAkJLmdwaW9fYmFzZQk9IDAsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9zZGhjaS5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvc2RoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQwODZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvc2RoY2kuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtdGVncmEvaW5jbHVkZS9tYWNoL3NkaGNpLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGFsbSwgSW5jLgorICogQXV0aG9yOiBZdm9ubmUgWWlwIDx5QHBhbG0uY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX1RFR1JBX1NESENJX0gKKyNkZWZpbmUgX19BU01fQVJNX0FSQ0hfVEVHUkFfU0RIQ0lfSAorCisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKworc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgeworCWludCBjZF9ncGlvOworCWludCB3cF9ncGlvOworCWludCBwb3dlcl9ncGlvOworCWludCBpc184Yml0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXUzMDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdTMwMC9LY29uZmlnCmluZGV4IDgwMWIyMWUuLjMyYTdiMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdTMwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdTMwMC9LY29uZmlnCkBAIC02NCw3ICs2NCw3IEBACiAJYm9vbCAiRHVhbCBSQU0iCiAJaGVscAogCQlTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBEdWFsIFJBTSBwaG9uZXMuCi0JCVRoaXMgaXMgdHdvIFJBTSBtZW1vcnlzIG9uIGRpZmZlcmVudCBFTUlGcy4KKwkJVGhpcyBpcyB0d28gUkFNIG1lbW9yaWVzIG9uIGRpZmZlcmVudCBFTUlGcy4KIGVuZGNob2ljZQogCiBjb25maWcgVTMwMF9ERUJVRwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9jb2g5MDEzMTguaCBiL2FyY2gvYXJtL21hY2gtdTMwMC9pbmNsdWRlL21hY2gvY29oOTAxMzE4LmgKaW5kZXggMTkzZGEyZC4uNjE5M2FhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11MzAwL2luY2x1ZGUvbWFjaC9jb2g5MDEzMTguaAorKysgYi9hcmNoL2FybS9tYWNoLXUzMDAvaW5jbHVkZS9tYWNoL2NvaDkwMTMxOC5oCkBAIC0yNCw3ICsyNCw3IEBACiAgKiBAc3JjX2FkZHI6IHRyYW5zZmVyIHNvdXJjZSBhZGRyZXNzCiAgKiBAZHN0X2FkZHI6IHRyYW5zZmVyIGRlc3RpbmF0aW9uIGFkZHJlc3MKICAqIEBsaW5rX2FkZHI6ICBwaHlzaWNhbCBhZGRyZXNzIHRvIG5leHQgbGxpCi0gKiBAdmlydF9saW5rX2FkZHI6IHZpcnR1YWwgYWRkcmVzIG9mIG5leHQgbGxpIChvbmx5IHVzZWQgYnkgcG9vbF9mcmVlKQorICogQHZpcnRfbGlua19hZGRyOiB2aXJ0dWFsIGFkZHJlc3Mgb2YgbmV4dCBsbGkgKG9ubHkgdXNlZCBieSBwb29sX2ZyZWUpCiAgKiBAcGh5X3RoaXM6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY3VycmVudCBsbGkgKG9ubHkgdXNlZCBieSBwb29sX2ZyZWUpCiAgKi8KIHN0cnVjdCBjb2g5MDEzMThfbGxpIHsKQEAgLTkwLDcgKzkwLDcgQEAKICAqIHN0cnVjdCBjb2g5MDEzMThfcGxhdGZvcm0gLSBwbGF0Zm9ybSBhcmNoIHN0cnVjdHVyZQogICogQGNoYW5zX3NsYXZlOiBzcGVjaWZ5aW5nIGRtYSBzbGF2ZSBjaGFubmVscwogICogQGNoYW5zX21lbWNweTogc3BlY2lmeWluZyBkbWEgbWVtY3B5IGNoYW5uZWxzCi0gKiBAYWNjZXNzX21lbW9yeV9zdGF0ZTogcmVxdWVzdGluZyBETUEgbWVtZW9yeSBhY2Nlc3MgKG9uIC8gb2ZmKQorICogQGFjY2Vzc19tZW1vcnlfc3RhdGU6IHJlcXVlc3RpbmcgRE1BIG1lbW9yeSBhY2Nlc3MgKG9uIC8gb2ZmKQogICogQGNoYW5fY29uZjogZG1hIGNoYW5uZWwgY29uZmlndXJhdGlvbnMKICAqIEBtYXhfY2hhbm5lbHM6IG1heCBudW1iZXIgb2YgZG1hIGNoYW5lbmxzCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvS2NvbmZpZwppbmRleCAyZGQ0NGEwLi4yNDdjYWEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9LY29uZmlnCkBAIC03LDI4ICs3LDMwIEBACiAJc2VsZWN0IEhBU19NVFUKIAlzZWxlY3QgTk9NQURJS19HUElPCiAKLWNvbmZpZyBVWDUwMF9TT0NfREI4NTAwCi0JYm9vbAorbWVudSAiVXg1MDAgU29DIgogCiBjb25maWcgVVg1MDBfU09DX0RCNTUwMAotCWJvb2wKKwlib29sICJEQjU1MDAiCiAKLWNob2ljZQotCXByb21wdCAiVXg1MDAgdGFyZ2V0IHBsYXRmb3JtIgotCWRlZmF1bHQgTUFDSF9VODUwMF9NT1AKK2NvbmZpZyBVWDUwMF9TT0NfREI4NTAwCisJYm9vbCAiREI4NTAwIgogCi1jb25maWcgTUFDSF9VODUwMF9NT1AKK2VuZG1lbnUKKworbWVudSAiVXg1MDAgdGFyZ2V0IHBsYXRmb3JtIgorCitjb25maWcgTUFDSF9VODUwMAogCWJvb2wgIlU4NTAwIERldmVsb3BtZW50IHBsYXRmb3JtIgotCXNlbGVjdCBVWDUwMF9TT0NfREI4NTAwCisJZGVwZW5kcyBvbiBVWDUwMF9TT0NfREI4NTAwCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgbW9wNTAwIGRldmVsb3BtZW50IHBsYXRmb3JtLgogCiBjb25maWcgTUFDSF9VNTUwMAogCWJvb2wgIlU1NTAwIERldmVsb3BtZW50IHBsYXRmb3JtIgotCXNlbGVjdCBVWDUwMF9TT0NfREI1NTAwCisJZGVwZW5kcyBvbiBVWDUwMF9TT0NfREI1NTAwCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgVTU1MDAgZGV2ZWxvcG1lbnQgcGxhdGZvcm0uCi1lbmRjaG9pY2UKK2VuZG1lbnUKIAogY29uZmlnIFVYNTAwX0RFQlVHX1VBUlQKIAlpbnQgIlV4NTAwIFVBUlQgdG8gdXNlIGZvciBsb3ctbGV2ZWwgZGVidWciCkBAIC0zOSwxNCArNDEsMTQgQEAKIAogY29uZmlnIFU1NTAwX01PREVNX0lSUQogCWJvb2wgIk1vZGVtIElSUSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDSF9VNTUwMAorCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCNTUwMAogCWRlZmF1bHQgeQogCWhlbHAKIAkgIEFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyBJUlE6cyBmcm9tIG1vZGVtIHNpZGUKIAogY29uZmlnIFU1NTAwX01CT1gKIAlib29sICJNYWlsYm94IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQUNIX1U1NTAwICYmIFU1NTAwX01PREVNX0lSUQorCWRlcGVuZHMgb24gVTU1MDBfTU9ERU1fSVJRCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgQWRkIHN1cHBvcnQgZm9yIFU1NTAwIG1haWxib3ggY29tbXVuaWNhdGlvbiB3aXRoIG1vZGVtIHNpZGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlCmluZGV4IDEyMDUyZTguLjUzZWJiNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZQpAQCAtMiwxMCArMiwxMSBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbCwgVTg1MDAgbWFjaGluZS4KICMKIAotb2JqLXkJCQkJOj0gY2xvY2subyBjcHUubyBkZXZpY2VzLm8gZGV2aWNlcy1jb21tb24ubworb2JqLXkJCQkJOj0gY2xvY2subyBjcHUubyBkZXZpY2VzLm8gZGV2aWNlcy1jb21tb24ubyBcCisJCQkJICAgaWQubwogb2JqLSQoQ09ORklHX1VYNTAwX1NPQ19EQjU1MDApCSs9IGNwdS1kYjU1MDAubyBkbWEtZGI1NTAwLm8KIG9iai0kKENPTkZJR19VWDUwMF9TT0NfREI4NTAwKQkrPSBjcHUtZGI4NTAwLm8gZGV2aWNlcy1kYjg1MDAubyBwcmNtdS5vCi1vYmotJChDT05GSUdfTUFDSF9VODUwMF9NT1ApCSs9IGJvYXJkLW1vcDUwMC5vIGJvYXJkLW1vcDUwMC1zZGkubyBcCitvYmotJChDT05GSUdfTUFDSF9VODUwMCkJKz0gYm9hcmQtbW9wNTAwLm8gYm9hcmQtbW9wNTAwLXNkaS5vIFwKIAkJCQlib2FyZC1tb3A1MDAta2V5cGFkcy5vCiBvYmotJChDT05GSUdfTUFDSF9VNTUwMCkJKz0gYm9hcmQtdTU1MDAubyBib2FyZC11NTUwMC1zZGkubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHBsYXRzbXAubyBoZWFkc21wLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXJlZ3VsYXRvcnMuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLXJlZ3VsYXRvcnMuYwppbmRleCAxMTg3ZjFmLi41MzM5NjdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1yZWd1bGF0b3JzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcmVndWxhdG9ycy5jCkBAIC0zLDk5ICszLDk0IEBACiAgKgogICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKICAqCi0gKiBBdXRob3I6IFN1bmRhciBJeWVyIDxzdW5kYXIuaXllckBzdGVyaWNzc29uLmNvbT4KKyAqIEF1dGhvcnM6IFN1bmRhciBJeWVyIDxzdW5kYXIuaXllckBzdGVyaWNzc29uLmNvbT4KKyAqICAgICAgICAgIEJlbmd0IEpvbnNzb24gPGJlbmd0Lmcuam9uc3NvbkBzdGVyaWNzc29uLmNvbT4KICAqCiAgKiBNT1A1MDAgYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIHJlZ3VsYXRvcnMKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2FiODUwMC5oPgogCi0vKiBzdXBwbGllcyB0byB0aGUgZGlzcGxheS9jYW1lcmEgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBhYjg1MDBfdmF1eDFfcmVndWxhdG9yID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUgPSAiVi1ESVNQTEFZIiwKLQkJLm1pbl91ViA9IDI1MDAwMDAsCi0JCS5tYXhfdVYgPSAyOTAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0V8Ci0JCQkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorLyogQUI4NTAwIHJlZ3VsYXRvcnMgKi8KK3N0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF9yZWd1bGF0b3JzW0FCODUwMF9OVU1fUkVHVUxBVE9SU10gPSB7CisJLyogc3VwcGxpZXMgdG8gdGhlIGRpc3BsYXkvY2FtZXJhICovCisJW0FCODUwMF9MRE9fQVVYMV0gPSB7CisJCS5jb25zdHJhaW50cyA9IHsKKwkJCS5uYW1lID0gIlYtRElTUExBWSIsCisJCQkubWluX3VWID0gMjUwMDAwMCwKKwkJCS5tYXhfdVYgPSAyOTAwMDAwLAorCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFIHwKKwkJCQkJICBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJfSwKKwl9LAorCS8qIHN1cHBsaWVzIHRvIHRoZSBvbi1ib2FyZCBlTU1DICovCisJW0FCODUwMF9MRE9fQVVYMl0gPSB7CisJCS5jb25zdHJhaW50cyA9IHsKKwkJCS5uYW1lID0gIlYtZU1NQzEiLAorCQkJLm1pbl91ViA9IDExMDAwMDAsCisJCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQkJCSAgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCX0sCisJfSwKKwkvKiBzdXBwbHkgZm9yIFZBVVgzLCBzdXBwbGllcyB0byBTRGNhcmQgc2xvdHMgKi8KKwlbQUI4NTAwX0xET19BVVgzXSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm5hbWUgPSAiVi1NTUMtU0QiLAorCQkJLm1pbl91ViA9IDExMDAwMDAsCisJCQkubWF4X3VWID0gMzMwMDAwMCwKKwkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSB8CisJCQkJCSAgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCX0sCisJfSwKKwkvKiBzdXBwbHkgZm9yIHR2b3V0LCBncGFkYywgVFZPVVQgTERPICovCisJW0FCODUwMF9MRE9fVFZPVVRdID0geworCQkuY29uc3RyYWludHMgPSB7CisJCQkubmFtZSA9ICJWLVRWT1VUIiwKKwkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQl9LAorCX0sCisJLyogc3VwcGx5IGZvciBhYjg1MDAtdmF1ZGlvLCBWQVVESU8gTERPICovCisJW0FCODUwMF9MRE9fQVVESU9dID0geworCQkuY29uc3RyYWludHMgPSB7CisJCQkubmFtZSA9ICJWLUFVRCIsCisJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJfSwKKwl9LAorCS8qIHN1cHBseSBmb3Igdi1hbmFtaWMxIFZBTWljMS1MRE8gKi8KKwlbQUI4NTAwX0xET19BTkFNSUMxXSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm5hbWUgPSAiVi1BTUlDMSIsCisJCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwkJfSwKKwl9LAorCS8qIHN1cHBseSBmb3Igdi1hbWljMiwgVkFNSUMyIExETywgcmV1c2UgY29uc3RhbnRzIGZvciBBTUlDMSAqLworCVtBQjg1MDBfTERPX0FOQU1JQzJdID0geworCQkuY29uc3RyYWludHMgPSB7CisJCQkubmFtZSA9ICJWLUFNSUMyIiwKKwkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQl9LAorCX0sCisJLyogc3VwcGx5IGZvciB2LWRtaWMsIFZETUlDIExETyAqLworCVtBQjg1MDBfTERPX0RNSUNdID0geworCQkuY29uc3RyYWludHMgPSB7CisJCQkubmFtZSA9ICJWLURNSUMiLAorCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCX0sCisJfSwKKwkvKiBzdXBwbHkgZm9yIHYtaW50Y29yZTEyLCBWSU5UQ09SRTEyIExETyAqLworCVtBQjg1MDBfTERPX0lOVENPUkVdID0geworCQkuY29uc3RyYWludHMgPSB7CisJCQkubmFtZSA9ICJWLUlOVENPUkUiLAorCQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCisJCX0sCisJfSwKKwkvKiBzdXBwbHkgZm9yIFU4NTAwIENTSS9EU0ksIFZBTkEgTERPICovCisJW0FCODUwMF9MRE9fQU5BXSA9IHsKKwkJLmNvbnN0cmFpbnRzID0geworCQkJLm5hbWUgPSAiVi1DU0kvRFNJIiwKKwkJCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAorCQl9LAogCX0sCiB9OwotCi0vKiBzdXBwbGllcyB0byB0aGUgb24tYm9hcmQgZU1NQyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF92YXV4Ml9yZWd1bGF0b3IgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZSA9ICJWLWVNTUMxIiwKLQkJLm1pbl91ViA9IDExMDAwMDAsCi0JCS5tYXhfdVYgPSAzMzAwMDAwLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0V8Ci0JCQkJCVJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi19OwotCi0vKiBzdXBwbHkgZm9yIFZBVVgzLCBzdXBwbGllcyB0byBTRGNhcmQgc2xvdHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBhYjg1MDBfdmF1eDNfcmVndWxhdG9yID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUgPSAiVi1NTUMtU0QiLAotCQkubWluX3VWID0gMTEwMDAwMCwKLQkJLm1heF91ViA9IDMzMDAwMDAsCi0JCS52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRXwKLQkJCQkJUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIHN1cHBseSBmb3IgdHZvdXQsIGdwYWRjLCBUVk9VVCBMRE8gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBhYjg1MDBfdnR2b3V0X2luaXQgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZSA9ICJWLVRWT1VUIiwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIHN1cHBseSBmb3IgYWI4NTAwLXZhdWRpbywgVkFVRElPIExETyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF92YXVkaW9faW5pdCA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lID0gIlYtQVVEIiwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIHN1cHBseSBmb3Igdi1hbmFtaWMxIFZBTWljMS1MRE8gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBhYjg1MDBfdmFtaWMxX2luaXQgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZSA9ICJWLUFNSUMxIiwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIHN1cHBseSBmb3Igdi1hbWljMiwgVkFNSUMyIExETywgcmV1c2UgY29uc3RhbnRzIGZvciBBTUlDMSAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF92YW1pYzJfaW5pdCA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lID0gIlYtQU1JQzIiLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotLyogc3VwcGx5IGZvciB2LWRtaWMsIFZETUlDIExETyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF92ZG1pY19pbml0ID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUgPSAiVi1ETUlDIiwKLQkJLnZhbGlkX29wc19tYXNrID0gUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLS8qIHN1cHBseSBmb3Igdi1pbnRjb3JlMTIsIFZJTlRDT1JFMTIgTERPICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgYWI4NTAwX3ZpbnRjb3JlX2luaXQgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZSA9ICJWLUlOVENPUkUiLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQotLyogc3VwcGx5IGZvciBVODUwMCBDU0kvRFNJLCBWQU5BIExETyAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGFiODUwMF92YW5hX2luaXQgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZSA9ICJWLUNTSS9EU0kiLAotCQkudmFsaWRfb3BzX21hc2sgPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcmVndWxhdG9ycy5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtcmVndWxhdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NzVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC1yZWd1bGF0b3JzLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMAorICoKKyAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCisgKgorICogQXV0aG9yOiBCZW5ndCBKb25zc29uIDxiZW5ndC5nLmpvbnNzb25Ac3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICoKKyAqIE1PUDUwMCBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmb3IgcmVndWxhdG9ycworICovCisKKyNpZm5kZWYgX19CT0FSRF9NT1A1MDBfUkVHVUxBVE9SU19ICisjZGVmaW5lIF9fQk9BUkRfTU9QNTAwX1JFR1VMQVRPUlNfSAorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvYWI4NTAwLmg+CisKK2V4dGVybiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBhYjg1MDBfcmVndWxhdG9yc1tBQjg1MDBfTlVNX1JFR1VMQVRPUlNdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2JvYXJkLW1vcDUwMC5jCmluZGV4IGExYzllYTEuLmEzOTNmNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImRldmljZXMtZGI4NTAwLmgiCiAjaW5jbHVkZSAicGlucy1kYjg1MDAuaCIKICNpbmNsdWRlICJib2FyZC1tb3A1MDAuaCIKKyNpbmNsdWRlICJib2FyZC1tb3A1MDAtcmVndWxhdG9ycy5oIgogCiBzdGF0aWMgcGluX2NmZ190IG1vcDUwMF9waW5zW10gPSB7CiAJLyogU1NQMCAqLwpAQCAtODAsNiArODEsOCBAQAogCiBzdGF0aWMgc3RydWN0IGFiODUwMF9wbGF0Zm9ybV9kYXRhIGFiODUwMF9wbGF0ZGF0YSA9IHsKIAkuaXJxX2Jhc2UJPSBNT1A1MDBfQUI4NTAwX0lSUV9CQVNFLAorCS5yZWd1bGF0b3IJPSBhYjg1MDBfcmVndWxhdG9ycywKKwkubnVtX3JlZ3VsYXRvcgk9IEFSUkFZX1NJWkUoYWI4NTAwX3JlZ3VsYXRvcnMpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfcmVzb3VyY2VzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKaW5kZXggY2NmZjJkYWUxLi5iMmIwYTNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jbG9jay5jCkBAIC0xMzYsOCArMTM2LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX210dV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCiB7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gX19pb19hZGRyZXNzKFVYNTAwX1BSQ01VX0JBU0UpCi0JCSsgUFJDTV9UQ1I7CisJdm9pZCBfX2lvbWVtICphZGRyOwogCXUzMiB0Y3I7CiAJaW50IG10dSA9IChpbnQpIGNsay0+ZGF0YTsKIAkvKgpAQCAtMTQ5LDEzICsxNDgsMjAgQEAKIAl1bnNpZ25lZCBsb25nIG10dXJhdGU7CiAJdW5zaWduZWQgbG9uZyByZXRjbGs7CiAKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCWFkZHIgPSBfX2lvX2FkZHJlc3MoVTU1MDBfUFJDTVVfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCWFkZHIgPSBfX2lvX2FkZHJlc3MoVTg1MDBfUFJDTVVfQkFTRSk7CisJZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOworCiAJLyoKIAkgKiBPbiBhIHN0YXJ0dXAsIGFsd2F5cyBjb25pZmd1cmUgdGhlIFRDUiB0byB0aGUgZG96ZSBtb2RlOwogCSAqIGJvb3Rsb2FkZXJzIGRvIGl0IGZvciB1cy4gRG8gdGhpcyBpbiB0aGUga2VybmVsIHRvby4KIAkgKi8KLQl3cml0ZWwoUFJDTV9UQ1JfRE9aRV9NT0RFLCBhZGRyKTsKKwl3cml0ZWwoUFJDTV9UQ1JfRE9aRV9NT0RFLCBhZGRyICsgUFJDTV9UQ1IpOwogCi0JdGNyID0gcmVhZGwoYWRkcik7CisJdGNyID0gcmVhZGwoYWRkciArIFBSQ01fVENSKTsKIAogCS8qIEdldCB0aGUgcmF0ZSBmcm9tIHRoZSBwYXJlbnQgYXMgYSBkZWZhdWx0ICovCiAJaWYgKGNsay0+cGFyZW50X3BlcmlwaCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiNTUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKaW5kZXggYWNjODQxZS4uYWYwNGUwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKQEAgLTIxLDcgKzIxLDIwIEBACiAKICNpbmNsdWRlICJkZXZpY2VzLWRiNTUwMC5oIgogCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU1NTAwX3VhcnRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJX19JT19ERVZfREVTQyhVNTUwMF9VQVJUMF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9VQVJUMl9CQVNFLCBTWl80SyksCit9OworCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU1NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCV9fSU9fREVWX0RFU0MoVTU1MDBfR0lDX0NQVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9HSUNfRElTVF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9MMkNDX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1RXRF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9NVFUwX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1NDVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9CQUNLVVBSQU0wX0JBU0UsIFNaXzhLKSwKKwogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzBfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzFfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzJfQkFTRSwgU1pfNEspLApAQCAtMTQzLDYgKzE1NiwxMSBAQAogCiB2b2lkIF9faW5pdCB1NTUwMF9tYXBfaW8odm9pZCkKIHsKKwkvKgorCSAqIE1hcCB0aGUgVUFSVHMgZWFybHkgc28gdGhhdCB0aGUgREVCVUdfTEwgc3R1ZmYgY29udGludWVzIHRvIHdvcmsuCisJICovCisJaW90YWJsZV9pbml0KHU1NTAwX3VhcnRfaW9fZGVzYywgQVJSQVlfU0laRSh1NTUwMF91YXJ0X2lvX2Rlc2MpKTsKKwogCXV4NTAwX21hcF9pbygpOwogCiAJaW90YWJsZV9pbml0KHU1NTAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUodTU1MDBfaW9fZGVzYykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwppbmRleCBjMGYzNGE0Li4xNzQ4ZmJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwpAQCAtMjksMTMgKzI5LDMxIEBACiB9OwogCiAvKiBtaW5pbXVtIHN0YXRpYyBpL28gbWFwcGluZyByZXF1aXJlZCB0byBib290IFU4NTAwIHBsYXRmb3JtcyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB1ODUwMF91YXJ0X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCV9fSU9fREVWX0RFU0MoVTg1MDBfVUFSVDBfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfVUFSVDJfQkFTRSwgU1pfNEspLAorfTsKKwogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB1ODUwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0dJQ19DUFVfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfR0lDX0RJU1RfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfTDJDQ19CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9UV0RfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfTVRVMF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9TQ1VfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQkFDS1VQUkFNMF9CQVNFLCBTWl84SyksCisKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0NMS1JTVDFfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUMl9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9DTEtSU1QzX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0NMS1JTVDVfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUNl9CQVNFLCBTWl80SyksCisKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX1BSQ01VX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8wX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8xX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8yX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8zX0JBU0UsIFNaXzRLKSwKLQlfX01FTV9ERVZfREVTQyhVODUwMF9CT09UX1JPTV9CQVNFLCBTWl8xTSksCiB9OwogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU4NTAwX2VkX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewpAQCAtNTIsNzEgKzcwLDEzIEBACiAJX19JT19ERVZfREVTQyhVODUwMF9QUkNNVV9UQ0RNX0JBU0UsIFNaXzRLKSwKIH07CiAKLS8qCi0gKiBGdW5jdGlvbnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxhdGVyIEFTSUNzCi0gKiBXZSBsb29rIGludG8gdGhlIGVuZCBvZiB0aGUgUk9NIHRvIGxvY2F0ZSB0aGUgaGFyZGNvZGVkIEFTSUMgSUQuCi0gKiBUaGlzIGlzIG9ubHkgbmVlZGVkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtaW5vciByZXZpc2lvbnMgYW5kCi0gKiBwcm9jZXNzIHZhcmlhbnRzIG9mIGFuIEFTSUMsIHRoZSBtYWpvciByZXZpc2lvbnMgYXJlIGVuY29kZWQgaW4KLSAqIHRoZSBjcHVpZC4KLSAqLwotI2RlZmluZSBVODUwMF9BU0lDX0lEX0xPQ19FRF9WMQkoVTg1MDBfQk9PVF9ST01fQkFTRSArIDB4MUZGRjQpCi0jZGVmaW5lIFU4NTAwX0FTSUNfSURfTE9DX1YyCShVODUwMF9CT09UX1JPTV9CQVNFICsgMHgxREJGNCkKLSNkZWZpbmUgVTg1MDBfQVNJQ19SRVZfRUQJMHgwMQotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMTAJMHhBMAotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMTEJMHhBMQotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMjAJMHhCMAotCi0vKioKLSAqIHN0cnVjdCBkYjg1MDBfYXNpY19pZCAtIGZpZWxkcyBvZiB0aGUgQVNJQyBJRAotICogQHByb2Nlc3M6IHRoZSBtYW51ZmFjdHVyaW5nIHByb2Nlc3MsIDB4NDAgaXMgNDAgbm0KLSAqICAweDAwIGlzICJzdGFuZGFyZCIKLSAqIEBwYXJ0bnVtYmVyOiBoaXRoZXJldG8gMHg4NTAwIGZvciBEQjg1MDAKLSAqIEByZXZpc2lvbjogdmVyc2lvbiBjb2RlIGluIHRoZSBzZXJpZXMKLSAqIFRoaXMgZmllbGQgZGVmaW5pb24gaXMgbm90IGZvcm1hbGx5IGRlZmluZWQgYnV0IG1ha2VzCi0gKiBzZW5zZS4KLSAqLwotc3RydWN0IGRiODUwMF9hc2ljX2lkIHsKLQl1OCBwcm9jZXNzOwotCXUxNiBwYXJ0bnVtYmVyOwotCXU4IHJldmlzaW9uOwotfTsKLQotLyogVGhpcyBpc24ndCBnb2luZyB0byBjaGFuZ2UgYXQgcnVudGltZSAqLwotc3RhdGljIHN0cnVjdCBkYjg1MDBfYXNpY19pZCBkYjg1MDBfaWQ7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfZGI4NTAwX2FzaWNfaWQodm9pZCkKLXsKLQl1MzIgYXNpY2lkOwotCi0JaWYgKGNwdV9pc191ODUwMHYxKCkgfHwgY3B1X2lzX3U4NTAwZWQoKSkKLQkJYXNpY2lkID0gcmVhZGwoX19pb19hZGRyZXNzKFU4NTAwX0FTSUNfSURfTE9DX0VEX1YxKSk7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIoKSkKLQkJYXNpY2lkID0gcmVhZGwoX19pb19hZGRyZXNzKFU4NTAwX0FTSUNfSURfTE9DX1YyKSk7Ci0JZWxzZQotCQlCVUcoKTsKLQotCWRiODUwMF9pZC5wcm9jZXNzID0gKGFzaWNpZCA+PiAyNCk7Ci0JZGI4NTAwX2lkLnBhcnRudW1iZXIgPSAoYXNpY2lkID4+IDE2KSAmIDB4RkZGRlU7Ci0JZGI4NTAwX2lkLnJldmlzaW9uID0gYXNpY2lkICYgMHhGRlU7Ci19Ci0KLWJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpCi17Ci0JcmV0dXJuIChkYjg1MDBfaWQucmV2aXNpb24gPT0gVTg1MDBfQVNJQ19SRVZfVjEwKTsKLX0KLQotYm9vbCBjcHVfaXNfdTg1MDB2MTEodm9pZCkKLXsKLQlyZXR1cm4gKGRiODUwMF9pZC5yZXZpc2lvbiA9PSBVODUwMF9BU0lDX1JFVl9WMTEpOwotfQotCi1ib29sIGNwdV9pc191ODUwMHYyMCh2b2lkKQotewotCXJldHVybiAoZGI4NTAwX2lkLnJldmlzaW9uID09IFU4NTAwX0FTSUNfUkVWX1YyMCk7Ci19Ci0KIHZvaWQgX19pbml0IHU4NTAwX21hcF9pbyh2b2lkKQogeworCS8qCisJICogTWFwIHRoZSBVQVJUcyBlYXJseSBzbyB0aGF0IHRoZSBERUJVR19MTCBzdHVmZiBjb250aW51ZXMgdG8gd29yay4KKwkgKi8KKwlpb3RhYmxlX2luaXQodTg1MDBfdWFydF9pb19kZXNjLCBBUlJBWV9TSVpFKHU4NTAwX3VhcnRfaW9fZGVzYykpOworCiAJdXg1MDBfbWFwX2lvKCk7CiAKIAlpb3RhYmxlX2luaXQodTg1MDBfaW9fZGVzYywgQVJSQVlfU0laRSh1ODUwMF9pb19kZXNjKSk7CkBAIC0xMjcsOSArODcsNiBAQAogCQlpb3RhYmxlX2luaXQodTg1MDBfdjFfaW9fZGVzYywgQVJSQVlfU0laRSh1ODUwMF92MV9pb19kZXNjKSk7CiAJZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIoKSkKIAkJaW90YWJsZV9pbml0KHU4NTAwX3YyX2lvX2Rlc2MsIEFSUkFZX1NJWkUodTg1MDBfdjJfaW9fZGVzYykpOwotCi0JLyogUmVhZCBvdXQgdGhlIEFTSUMgSUQgYXMgZWFybHkgYXMgd2UgY2FuICovCi0JZ2V0X2RiODUwMF9hc2ljX2lkKCk7CiB9CiAKIHN0YXRpYyByZXNvdXJjZV9zaXplX3QgX19pbml0ZGF0YSBkYjg1MDBfZ3Bpb19iYXNlW10gPSB7CkBAIC0xNTksMjAgKzExNiw2IEBACiAgKi8KIHZvaWQgX19pbml0IHU4NTAwX2luaXRfZGV2aWNlcyh2b2lkKQogewotCS8qIERpc3BsYXkgc29tZSBBU0lDIGJvaWxlcnBsYXRlICovCi0JcHJfaW5mbygiREI4NTAwOiBwcm9jZXNzOiAlMDJ4LCByZXZpc2lvbiBJRDogMHglMDJ4XG4iLAotCQlkYjg1MDBfaWQucHJvY2VzcywgZGI4NTAwX2lkLnJldmlzaW9uKTsKLQlpZiAoY3B1X2lzX3U4NTAwZWQoKSkKLQkJcHJfaW5mbygiREI4NTAwOiBFYXJseSBEcm9wIChFRClcbiIpOwotCWVsc2UgaWYgKGNwdV9pc191ODUwMHYxMCgpKQotCQlwcl9pbmZvKCJEQjg1MDA6IHZlcnNpb24gMS4wXG4iKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDB2MTEoKSkKLQkJcHJfaW5mbygiREI4NTAwOiB2ZXJzaW9uIDEuMVxuIik7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIwKCkpCi0JCXByX2luZm8oIkRCODUwMDogdmVyc2lvbiAyLjBcbiIpOwotCWVsc2UKLQkJcHJfd2FybmluZygiQVNJQzogVU5LTk9XTiBTSUxJQ09OIFZFUlNJT04hXG4iKTsKLQogCWlmIChjcHVfaXNfdTg1MDBlZCgpKQogCQlkbWE0MF91ODUwMGVkX2ZpeHVwKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCmluZGV4IDU3MzA0MDkuLjVhNDMxMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYwpAQCAtMjMsMzcgKzIzLDI1IEBACiAKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIHV4NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCV9fSU9fREVWX0RFU0MoVVg1MDBfVUFSVDBfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfVUFSVDJfQkFTRSwgU1pfNEspLAotCi0JX19JT19ERVZfREVTQyhVWDUwMF9HSUNfQ1BVX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0dJQ19ESVNUX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0wyQ0NfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfVFdEX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX1NDVV9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0NMS1JTVDFfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUMl9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9DTEtSU1QzX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0NMS1JTVDVfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUNl9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX01UVTBfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfTVRVMV9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0JBQ0tVUFJBTTBfQkFTRSwgU1pfOEspLAotfTsKLQotdm9pZCBfX2luaXQgdXg1MDBfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KHV4NTAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUodXg1MDBfaW9fZGVzYykpOwotfQorI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCitzdGF0aWMgdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7CisjZW5kaWYKIAogdm9pZCBfX2luaXQgdXg1MDBfaW5pdF9pcnEodm9pZCkKIHsKLQlnaWNfaW5pdCgwLCAyOSwgX19pb19hZGRyZXNzKFVYNTAwX0dJQ19ESVNUX0JBU0UpLAotCQkgX19pb19hZGRyZXNzKFVYNTAwX0dJQ19DUFVfQkFTRSkpOworCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisKKwlpZiAoY3B1X2lzX3U1NTAwKCkpIHsKKwkJZGlzdF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX0dJQ19ESVNUX0JBU0UpOworCQljcHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9HSUNfQ1BVX0JBU0UpOworCX0gZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpIHsKKwkJZGlzdF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0dJQ19ESVNUX0JBU0UpOworCQljcHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9HSUNfQ1BVX0JBU0UpOworCX0gZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOworCisJZ2ljX2luaXQoMCwgMjksIGRpc3RfYmFzZSwgY3B1X2Jhc2UpOwogCiAJLyoKIAkgKiBJbml0IGNsb2NrcyBoZXJlIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGZvciBzeXN0ZW0gdGltZXIKQEAgLTc0LDcgKzYyLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3N5bmModm9pZCkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfTDJDQ19CQVNFKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7CisKIAl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgTDJYMF9DQUNIRV9TWU5DKTsKIAl1eDUwMF9jYWNoZV93YWl0KGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMsIDEpOwogfQpAQCAtOTYsMjAgKzg1LDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHV4NTAwX2wyeDBfaW52X2FsbCh2b2lkKQogewotCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX0wyQ0NfQkFTRSk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gbDJ4MF9iYXNlOwogCXVpbnQzMl90IGwyeDBfd2F5X21hc2sgPSAoMTw8MTYpIC0gMTsJLyogQml0bWFzayBvZiBhY3RpdmUgd2F5cyAqLwogCiAJLyogaW52YWxpZGF0ZSBhbGwgd2F5cyAqLwotCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfSU5WX1dBWSk7Ci0JdXg1MDBfY2FjaGVfd2FpdChsMngwX2Jhc2UgKyBMMlgwX0lOVl9XQVksIGwyeDBfd2F5X21hc2spOworCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGJhc2UgKyBMMlgwX0lOVl9XQVkpOworCXV4NTAwX2NhY2hlX3dhaXQoYmFzZSArIEwyWDBfSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CiAJdXg1MDBfY2FjaGVfc3luYygpOwogfQogCiBzdGF0aWMgaW50IHV4NTAwX2wyeDBfaW5pdCh2b2lkKQogewotCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOwotCi0JbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX0wyQ0NfQkFTRSk7CisJaWYgKGNwdV9pc191NTUwMCgpKQorCQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTDJDQ19CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0wyQ0NfQkFTRSk7CisJZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOwogCiAJLyogNjRLQiB3YXkgc2l6ZSwgOCB3YXkgYXNzb2NpYXRpdml0eSwgZm9yY2UgV0EgKi8KIAlsMngwX2luaXQobDJ4MF9iYXNlLCAweDNlMDYwMDAwLCAweGMwMDAwZmZmKTsKQEAgLTEyNywxMyArMTE5LDIxIEBACiB7CiAjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwogCS8qIFNldHVwIHRoZSBsb2NhbCB0aW1lciBiYXNlICovCi0JdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfVFdEX0JBU0UpOwotI2VuZGlmCi0JLyogU2V0dXAgdGhlIE1UVSBiYXNlICovCi0JaWYgKGNwdV9pc191ODUwMGVkKCkpCi0JCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX01UVTBfQkFTRV9FRCk7CisJaWYgKGNwdV9pc191NTUwMCgpKQorCQl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9UV0RfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX1RXRF9CQVNFKTsKIAllbHNlCi0JCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX01UVTBfQkFTRSk7CisJCXV4NTAwX3Vua25vd25fc29jKCk7CisjZW5kaWYKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX01UVTBfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwZWQoKSkKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFX0VEKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CiAKIAlubWRrX3RpbWVyX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaWQuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUxMjJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pZC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CisKK3N0cnVjdCBkYng1MDBfYXNpY19pZCBkYng1MDBfaWQ7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXg1MDBfcmVhZF9hc2ljaWQocGh5c19hZGRyX3QgYWRkcikKK3sKKwlwaHlzX2FkZHJfdCBiYXNlID0gYWRkciAmIH4weGZmZjsKKwlzdHJ1Y3QgbWFwX2Rlc2MgZGVzYyA9IHsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKGJhc2UpLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oYmFzZSksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfTsKKworCWlvdGFibGVfaW5pdCgmZGVzYywgMSk7CisKKwkvKiBBcyBpbiBkZXZpY2VtYXBzX2luaXQoKSAqLworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKworCXJldHVybiByZWFkbChfX2lvX2FkZHJlc3MoYWRkcikpOworfQorCitzdGF0aWMgdm9pZCB1eDUwMF9wcmludF9zb2NfaW5mbyh1bnNpZ25lZCBpbnQgYXNpY2lkKQoreworCXVuc2lnbmVkIGludCByZXYgPSBkYng1MDBfcmV2aXNpb24oKTsKKworCXByX2luZm8oIkRCJTR4ICIsIGRieDUwMF9wYXJ0bnVtYmVyKCkpOworCisJaWYgKHJldiA9PSAweDAxKQorCQlwcl9jb250KCJFYXJseSBEcm9wIik7CisJZWxzZSBpZiAocmV2ID49IDB4QTApCisJCXByX2NvbnQoInYlZC4lZCIgLCAocmV2ID4+IDQpIC0gMHhBICsgMSwgcmV2ICYgMHhmKTsKKwllbHNlCisJCXByX2NvbnQoIlVua25vd24iKTsKKworCXByX2NvbnQoIiBbJSMwMTB4XVxuIiwgYXNpY2lkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwYXJ0bnVtYmVyKHVuc2lnbmVkIGludCBhc2ljaWQpCit7CisJcmV0dXJuIChhc2ljaWQgPj4gOCkgJiAweGZmZmY7Cit9CisKKy8qCisgKiBTT0MJCU1JRFIJCUFTSUNJRCBBRERSRVNTCQlBU0lDSUQgVkFMVUUKKyAqIERCODUwMGVkCTB4NDEwZmMwOTAJMHg5MDAxRkZGNAkJMHgwMDg1MDAwMQorICogREI4NTAwdjEJMHg0MTFmYzA5MQkweDkwMDFGRkY0CQkweDAwODUwMEEwCisgKiBEQjg1MDB2MS4xCTB4NDExZmMwOTEJMHg5MDAxRkZGNAkJMHgwMDg1MDBBMQorICogREI4NTAwdjIJMHg0MTJmYzA5MQkweDkwMDFEQkY0CQkweDAwODUwMEIwCisgKiBEQjU1MDB2MQkweDQxMmZjMDkxCTB4OTAwMUZGRjQJCTB4MDA1NTAwQTAKKyAqLworCit2b2lkIF9faW5pdCB1eDUwMF9tYXBfaW8odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1aWQgPSByZWFkX2NwdWlkX2lkKCk7CisJdW5zaWduZWQgaW50IGFzaWNpZCA9IDA7CisJcGh5c19hZGRyX3QgYWRkciA9IDA7CisKKwlzd2l0Y2ggKGNwdWlkKSB7CisJY2FzZSAweDQxMGZjMDkwOiAvKiBEQjg1MDBlZCAqLworCWNhc2UgMHg0MTFmYzA5MTogLyogREI4NTAwdjEgKi8KKwkJYWRkciA9IDB4OTAwMUZGRjQ7CisJCWJyZWFrOworCisJY2FzZSAweDQxMmZjMDkxOiAvKiBEQjg1MDB2MiAvIERCNTUwMHYxICovCisJCWFzaWNpZCA9IHV4NTAwX3JlYWRfYXNpY2lkKDB4OTAwMURCRjQpOworCQlpZiAocGFydG51bWJlcihhc2ljaWQpID09IDB4ODUwMCkKKwkJCS8qIERCODUwMHYyICovCisJCQlicmVhazsKKworCQkvKiBEQjU1MDB2MSAqLworCQlhZGRyID0gMHg5MDAxRkZGNDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGFkZHIpCisJCWFzaWNpZCA9IHV4NTAwX3JlYWRfYXNpY2lkKGFkZHIpOworCisJaWYgKCFhc2ljaWQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaWRlbnRpZnkgU29DXG4iKTsKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKwl9CisKKwlkYng1MDBfaWQucHJvY2VzcyA9IGFzaWNpZCA+PiAyNDsKKwlkYng1MDBfaWQucGFydG51bWJlciA9IHBhcnRudW1iZXIoYXNpY2lkKTsKKwlkYng1MDBfaWQucmV2aXNpb24gPSBhc2ljaWQgJiAweGZmOworCisJdXg1MDBfcHJpbnRfc29jX2luZm8oYXNpY2lkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGJlN2MwZjEuLjcwMGZiMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTQsNyArMTQsMjQgQEAKICNlcnJvciBJbnZhbGlkIFV4NTAwIGRlYnVnIFVBUlQKICNlbmRpZgogCi0jZGVmaW5lIF9fVVg1MDBfVUFSVChuKQlVWDUwMF9VQVJUIyNuIyNfQkFTRQorLyoKKyAqIERFQlVHX0xMIG9ubHkgd29ya3MgaWYgb25seSBvbmUgU09DIGlzIGJ1aWx0IGluLiAgV2UgZG9uJ3QgdXNlICNlbHNlIGJlbG93CisgKiBpbiBvcmRlciB0byBnZXQgIl9fVVg1MDBfVUFSVCByZWRlZmluZWQiIHdhcm5pbmdzIGlmIG1vcmUgdGhhbiBvbmUgU09DIGlzCisgKiBidWlsdCwgc28gdGhhdCB0aGVyZSdzIHNvbWUgaGludCBkdXJpbmcgdGhlIGJ1aWxkIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nLgorICovCisKKyNpZmRlZiBDT05GSUdfVVg1MDBfU09DX0RCNTUwMAorI2RlZmluZSBfX1VYNTAwX1VBUlQobikJVTU1MDBfVUFSVCMjbiMjX0JBU0UKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKKyNkZWZpbmUgX19VWDUwMF9VQVJUKG4pCVU4NTAwX1VBUlQjI24jI19CQVNFCisjZW5kaWYKKworI2lmbmRlZiBfX1VYNTAwX1VBUlQKKyNlcnJvciBVbmtub3duIFNPQworI2VuZGlmCisKICNkZWZpbmUgVVg1MDBfVUFSVChuKQlfX1VYNTAwX1VBUlQobikKICNkZWZpbmUgVUFSVF9CQVNFCVVYNTAwX1VBUlQoQ09ORklHX1VYNTAwX0RFQlVHX1VBUlQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGEzN2Y1ODUuLjA3MWJiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMTEsMTUgKzExLDEwIEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jZGVmaW5lIEhBVkVfR0VUX0lSUU5SX1BSRUFNQkxFCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQogCi0JCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLQkJbGRyICAgICBcYmFzZSwgPUlPX0FERFJFU1MoVVg1MDBfR0lDX0NQVV9CQVNFKQotCQkuZW5kbQotCiAJCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggNjI5NWNjNS4uYmY2M2YyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0yOSwxMTggKzI5LDEyIEBACiAjaW5jbHVkZSA8bWFjaC9kYjg1MDAtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvZGI1NTAwLXJlZ3MuaD4KIAotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI4NTAwCi0jZGVmaW5lIFVYNTAwKHBlcmlwaCkJCVU4NTAwXyMjcGVyaXBoIyNfQkFTRQotI2VsaWYgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCNTUwMCkKLSNkZWZpbmUgVVg1MDAocGVyaXBoKQkJVTU1MDBfIyNwZXJpcGgjI19CQVNFCi0jZW5kaWYKLQotI2RlZmluZSBVWDUwMF9CQUNLVVBSQU0wX0JBU0UJVVg1MDAoQkFDS1VQUkFNMCkKLSNkZWZpbmUgVVg1MDBfQkFDS1VQUkFNMV9CQVNFCVVYNTAwKEJBQ0tVUFJBTTEpCi0jZGVmaW5lIFVYNTAwX0IyUjJfQkFTRQkJVVg1MDAoQjJSMikKLQotI2RlZmluZSBVWDUwMF9DTEtSU1QxX0JBU0UJVVg1MDAoQ0xLUlNUMSkKLSNkZWZpbmUgVVg1MDBfQ0xLUlNUMl9CQVNFCVVYNTAwKENMS1JTVDIpCi0jZGVmaW5lIFVYNTAwX0NMS1JTVDNfQkFTRQlVWDUwMChDTEtSU1QzKQotI2RlZmluZSBVWDUwMF9DTEtSU1Q1X0JBU0UJVVg1MDAoQ0xLUlNUNSkKLSNkZWZpbmUgVVg1MDBfQ0xLUlNUNl9CQVNFCVVYNTAwKENMS1JTVDYpCi0KLSNkZWZpbmUgVVg1MDBfRE1BX0JBU0UJCVVYNTAwKERNQSkKLSNkZWZpbmUgVVg1MDBfRlNNQ19CQVNFCQlVWDUwMChGU01DKQotCi0jZGVmaW5lIFVYNTAwX0dJQ19DUFVfQkFTRQlVWDUwMChHSUNfQ1BVKQotI2RlZmluZSBVWDUwMF9HSUNfRElTVF9CQVNFCVVYNTAwKEdJQ19ESVNUKQotCi0jZGVmaW5lIFVYNTAwX0kyQzFfQkFTRQkJVVg1MDAoSTJDMSkKLSNkZWZpbmUgVVg1MDBfSTJDMl9CQVNFCQlVWDUwMChJMkMyKQotI2RlZmluZSBVWDUwMF9JMkMzX0JBU0UJCVVYNTAwKEkyQzMpCi0KLSNkZWZpbmUgVVg1MDBfTDJDQ19CQVNFCQlVWDUwMChMMkNDKQotI2RlZmluZSBVWDUwMF9NQ0RFX0JBU0UJCVVYNTAwKE1DREUpCi0jZGVmaW5lIFVYNTAwX01UVTBfQkFTRQkJVVg1MDAoTVRVMCkKLSNkZWZpbmUgVVg1MDBfTVRVMV9CQVNFCQlVWDUwMChNVFUxKQotI2RlZmluZSBVWDUwMF9QUkNNVV9CQVNFCVVYNTAwKFBSQ01VKQotCi0jZGVmaW5lIFVYNTAwX1JOR19CQVNFCQlVWDUwMChSTkcpCi0jZGVmaW5lIFVYNTAwX1JUQ19CQVNFCQlVWDUwMChSVEMpCi0KLSNkZWZpbmUgVVg1MDBfU0NVX0JBU0UJCVVYNTAwKFNDVSkKLQotI2RlZmluZSBVWDUwMF9TREkwX0JBU0UJCVVYNTAwKFNESTApCi0jZGVmaW5lIFVYNTAwX1NESTFfQkFTRQkJVVg1MDAoU0RJMSkKLSNkZWZpbmUgVVg1MDBfU0RJMl9CQVNFCQlVWDUwMChTREkyKQotI2RlZmluZSBVWDUwMF9TREkzX0JBU0UJCVVYNTAwKFNESTMpCi0jZGVmaW5lIFVYNTAwX1NESTRfQkFTRQkJVVg1MDAoU0RJNCkKLQotI2RlZmluZSBVWDUwMF9TUEkwX0JBU0UJCVVYNTAwKFNQSTApCi0jZGVmaW5lIFVYNTAwX1NQSTFfQkFTRQkJVVg1MDAoU1BJMSkKLSNkZWZpbmUgVVg1MDBfU1BJMl9CQVNFCQlVWDUwMChTUEkyKQotI2RlZmluZSBVWDUwMF9TUEkzX0JBU0UJCVVYNTAwKFNQSTMpCi0KLSNkZWZpbmUgVVg1MDBfU0lBX0JBU0UJCVVYNTAwKFNJQSkKLSNkZWZpbmUgVVg1MDBfU1ZBX0JBU0UJCVVYNTAwKFNWQSkKLQotI2RlZmluZSBVWDUwMF9UV0RfQkFTRQkJVVg1MDAoVFdEKQotCi0jZGVmaW5lIFVYNTAwX1VBUlQwX0JBU0UJVVg1MDAoVUFSVDApCi0jZGVmaW5lIFVYNTAwX1VBUlQxX0JBU0UJVVg1MDAoVUFSVDEpCi0jZGVmaW5lIFVYNTAwX1VBUlQyX0JBU0UJVVg1MDAoVUFSVDIpCi0KLSNkZWZpbmUgVVg1MDBfVVNCT1RHX0JBU0UJVVg1MDAoVVNCT1RHKQotCiAvKiBTVC1Fcmljc3NvbiBtb2RpZmllZCBwbDAyMiBpZCAqLwogI2RlZmluZSBTU1BfUEVSX0lECQkweDAxMDgwMDIyCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKLQlyZXR1cm4gMTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBDUFVJRF9EQjg1MDBFRAkweDQxMGZjMDkwCi0jZGVmaW5lIENQVUlEX0RCODUwMFYxCTB4NDExZmMwOTEKLSNkZWZpbmUgQ1BVSURfREI4NTAwVjIJMHg0MTJmYzA5MQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwZWQodm9pZCkKLXsKLQlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKHJlYWRfY3B1aWRfaWQoKSA9PSBDUFVJRF9EQjg1MDBFRCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDB2MSh2b2lkKQotewotCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiAocmVhZF9jcHVpZF9pZCgpID09IENQVUlEX0RCODUwMFYxKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGNwdV9pc191ODUwMHYyKHZvaWQpCi17Ci0JcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIChyZWFkX2NwdWlkX2lkKCkgPT0gQ1BVSURfREI4NTAwVjIpOwotfQotCi0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKLWJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpOwotYm9vbCBjcHVfaXNfdTg1MDB2MTEodm9pZCk7Ci1ib29sIGNwdV9pc191ODUwMHYyMCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjExKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjIwKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBib29sIGNwdV9pc191NTUwMCh2b2lkKQotewotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCi0JcmV0dXJuIDE7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19CisjaW5jbHVkZSA8bWFjaC9pZC5oPgogCiAjZGVmaW5lIEFSUkFZX0FORF9TSVpFKHgpCSh4KSwgQVJSQVlfU0laRSh4KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pZC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTI4OGQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaWQuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgX19NQUNIX1VYNTAwX0lECisjZGVmaW5lIF9fTUFDSF9VWDUwMF9JRAorCisvKioKKyAqIHN0cnVjdCBkYng1MDBfYXNpY19pZCAtIGZpZWxkcyBvZiB0aGUgQVNJQyBJRAorICogQHByb2Nlc3M6IHRoZSBtYW51ZmFjdHVyaW5nIHByb2Nlc3MsIDB4NDAgaXMgNDAgbm0gMHgwMCBpcyAic3RhbmRhcmQiCisgKiBAcGFydG51bWJlcjogaGl0aGVyZXRvIDB4ODUwMCBmb3IgREI4NTAwCisgKiBAcmV2aXNpb246IHZlcnNpb24gY29kZSBpbiB0aGUgc2VyaWVzCisgKi8KK3N0cnVjdCBkYng1MDBfYXNpY19pZCB7CisJdTE2CXBhcnRudW1iZXI7CisJdTgJcmV2aXNpb247CisJdTgJcHJvY2VzczsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGJ4NTAwX2FzaWNfaWQgZGJ4NTAwX2lkOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGRieDUwMF9wYXJ0bnVtYmVyKHZvaWQpCit7CisJcmV0dXJuIGRieDUwMF9pZC5wYXJ0bnVtYmVyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGRieDUwMF9yZXZpc2lvbih2b2lkKQoreworCXJldHVybiBkYng1MDBfaWQucmV2aXNpb247Cit9CisKKy8qCisgKiBTT0NzCisgKi8KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwKHZvaWQpCit7CisJcmV0dXJuIGRieDUwMF9wYXJ0bnVtYmVyKCkgPT0gMHg4NTAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTU1MDAodm9pZCkKK3sKKwlyZXR1cm4gZGJ4NTAwX3BhcnRudW1iZXIoKSA9PSAweDU1MDA7Cit9CisKKy8qCisgKiA4NTAwIHJldmlzaW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMGVkKHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIGRieDUwMF9yZXZpc2lvbigpID09IDB4MDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMHYxKHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIChkYng1MDBfcmV2aXNpb24oKSAmIDB4ZjApID09IDB4QTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMHYxMCh2b2lkKQoreworCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiBkYng1MDBfcmV2aXNpb24oKSA9PSAweEEwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTg1MDB2MTEodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgZGJ4NTAwX3JldmlzaW9uKCkgPT0gMHhBMTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwdjIodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKChkYng1MDBfcmV2aXNpb24oKSAmIDB4ZjApID09IDB4QjApOworfQorCisjZGVmaW5lIHV4NTAwX3Vua25vd25fc29jKCkJQlVHKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggODgwYWU0NS4uYmExMjk0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMzYsNyArMzYsNyBAQAogLyogVGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgYm9hcmQtc3BlY2lmaWMgaXJxIGhlYWRlcnMgKi8KICNkZWZpbmUgSVJRX0JPQVJEX0VORAkJCUlSUV9CT0FSRF9TVEFSVAogCi0jaWZkZWYgQ09ORklHX01BQ0hfVTg1MDBfTU9QCisjaWZkZWYgQ09ORklHX01BQ0hfVTg1MDAKICNpbmNsdWRlIDxtYWNoL2lycXMtYm9hcmQtbW9wNTAwLmg+CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvc2V0dXAuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3NldHVwLmgKaW5kZXggNDY5ODc3ZS4uYTdkMzYzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvc2V0dXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9zZXR1cC5oCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotZXh0ZXJuIHZvaWQgX19pbml0IHV4NTAwX21hcF9pbyh2b2lkKTsKK3ZvaWQgX19pbml0IHV4NTAwX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB1NTUwMF9tYXBfaW8odm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdTg1MDBfbWFwX2lvKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL21vZGVtLWlycS1kYjU1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCmluZGV4IDMxODdmODguLmUxMjk2YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lkLmg+CisKICNkZWZpbmUgTU9ERU1fSU5UQ09OX0JBU0VfQUREUiAweEJGRkQzMDAwCiAjZGVmaW5lIE1PREVNX0lOVENPTl9TSVpFIDB4RkZGCiAKQEAgLTEwMSw2ICsxMDMsOSBAQAogCXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgIG1vZGVtX2lycV9jaGlwOwogCXN0cnVjdCBtb2RlbV9pcnEgKm1pOwogCisJaWYgKCFjcHVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlwcl9pbmZvKCJtb2RlbV9pcnE6IFNldCB1cCBJUlEgaGFuZGxlciBmb3IgaW5jb21pbmcgbW9kZW0gSVJRICVkXG4iLAogCQkgICBJUlFfREI1NTAwX01PREVNKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwppbmRleCBkNzdlNzZjLi40ZmZmNGQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgogCiAvKgogICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5CkBAIC00MCw2ICs0MSwxOCBAQAogCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIodm9pZCkKK3sKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCXJldHVybiBfX2lvX2FkZHJlc3MoVTU1MDBfU0NVX0JBU0UpOworCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQorCQlyZXR1cm4gX19pb19hZGRyZXNzKFU4NTAwX1NDVV9CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOwogCiB2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQpAQCAtMTAwLDIxICsxMTMsMjggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHdha2V1cF9zZWNvbmRhcnkodm9pZCkKIHsKKwl2b2lkIF9faW9tZW0gKmJhY2t1cHJhbTsKKworCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJYmFja3VwcmFtID0gX19pb19hZGRyZXNzKFU1NTAwX0JBQ0tVUFJBTTBfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCWJhY2t1cHJhbSA9IF9faW9fYWRkcmVzcyhVODUwMF9CQUNLVVBSQU0wX0JBU0UpOworCWVsc2UKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKwogCS8qCiAJICogd3JpdGUgdGhlIGFkZHJlc3Mgb2Ygc2Vjb25kYXJ5IHN0YXJ0dXAgaW50byB0aGUgYmFja3VwIHJhbSByZWdpc3RlcgogCSAqIGF0IG9mZnNldCAweDFGRjQsIHRoZW4gd3JpdGUgdGhlIG1hZ2ljIG51bWJlciAweEExRkVFRDAxIHRvIHRoZQogCSAqIGJhY2t1cCByYW0gcmVnaXN0ZXIgYXQgb2Zmc2V0IDB4MUZGMCwgd2hpY2ggaXMgd2hhdCBib290IHJvbSBjb2RlCiAJICogaXMgd2FpdGluZyBmb3IuIFRoaXMgd291bGQgd2FrZSB1cCB0aGUgc2Vjb25kYXJ5IGNvcmUgZnJvbSBXRkUKIAkgKi8KLSNkZWZpbmUgVTg1MDBfQ1BVMV9KVU1QQUREUl9PRkZTRVQgMHgxRkY0CisjZGVmaW5lIFVYNTAwX0NQVTFfSlVNUEFERFJfT0ZGU0VUIDB4MUZGNAogCV9fcmF3X3dyaXRlbCh2aXJ0X3RvX3BoeXModTg1MDBfc2Vjb25kYXJ5X3N0YXJ0dXApLAotCQlfX2lvX2FkZHJlc3MoVVg1MDBfQkFDS1VQUkFNMF9CQVNFKSArCi0JCVU4NTAwX0NQVTFfSlVNUEFERFJfT0ZGU0VUKTsKKwkJICAgICBiYWNrdXByYW0gKyBVWDUwMF9DUFUxX0pVTVBBRERSX09GRlNFVCk7CiAKLSNkZWZpbmUgVTg1MDBfQ1BVMV9XQUtFTUFHSUNfT0ZGU0VUIDB4MUZGMAorI2RlZmluZSBVWDUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQgMHgxRkYwCiAJX19yYXdfd3JpdGVsKDB4QTFGRUVEMDEsCi0JCV9faW9fYWRkcmVzcyhVWDUwMF9CQUNLVVBSQU0wX0JBU0UpICsKLQkJVTg1MDBfQ1BVMV9XQUtFTUFHSUNfT0ZGU0VUKTsKKwkJICAgICBiYWNrdXByYW0gKyBVWDUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQpOwogCiAJLyogbWFrZSBzdXJlIHdyaXRlIGJ1ZmZlciBpcyBkcmFpbmVkICovCiAJbWIoKTsKQEAgLTEyNiw5ICsxNDYsMTAgQEAKICAqLwogdm9pZCBfX2luaXQgc21wX2luaXRfY3B1cyh2b2lkKQogeworCXZvaWQgX19pb21lbSAqc2N1X2Jhc2UgPSBzY3VfYmFzZV9hZGRyKCk7CiAJdW5zaWduZWQgaW50IGksIG5jb3JlczsKIAotCW5jb3JlcyA9IHNjdV9nZXRfY29yZV9jb3VudChfX2lvX2FkZHJlc3MoVVg1MDBfU0NVX0JBU0UpKTsKKwluY29yZXMgPSBzY3VfYmFzZSA/IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZSkgOiAxOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKG5jb3JlcyA+IE5SX0NQVVMpIHsKQEAgLTE1NCw2ICsxNzUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQogCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7CiAKLQlzY3VfZW5hYmxlKF9faW9fYWRkcmVzcyhVWDUwMF9TQ1VfQkFTRSkpOworCXNjdV9lbmFibGUoc2N1X2Jhc2VfYWRkcigpKTsKIAl3YWtldXBfc2Vjb25kYXJ5KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBmY2MxZTYyLi45ZDMwYzZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTY0NCw3ICs2NDQsNyBAQAogCiBjb25maWcgU1dQX0VNVUxBVEUKIAlib29sICJFbXVsYXRlIFNXUC9TV1BCIGluc3RydWN0aW9ucyIKLQlkZXBlbmRzIG9uIENQVV9WNworCWRlcGVuZHMgb24gQ1BVX1Y3ICYmICFDUFVfVjYKIAlzZWxlY3QgSEFWRV9QUk9DX0NQVSBpZiBQUk9DX0ZTCiAJZGVmYXVsdCB5IGlmIFNNUAogCWhlbHAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2ZsdXNoLmMgYi9hcmNoL2FybS9tbS9mbHVzaC5jCmluZGV4IGMyOWYyODMuLjJiMjY5YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2ZsdXNoLmMKKysrIGIvYXJjaC9hcm0vbW0vZmx1c2guYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KIAogI2luY2x1ZGUgIm1tLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3BnZC5jIGIvYXJjaC9hcm0vbW0vcGdkLmMKaW5kZXggOTMyOTJhMS4uNzA5MjQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcGdkLmMKKysrIGIvYXJjaC9hcm0vbW0vcGdkLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAkJaWYgKCFuZXdfcG1kKQogCQkJZ290byBub19wbWQ7CiAKLQkJbmV3X3B0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIG5ld19wbWQsIDApOworCQluZXdfcHRlID0gcHRlX2FsbG9jX21hcChtbSwgTlVMTCwgbmV3X3BtZCwgMCk7CiAJCWlmICghbmV3X3B0ZSkKIAkJCWdvdG8gbm9fcHRlOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2lycXMuaAppbmRleCA1OGE0OWNjLi5iYTY1YzkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTcwLDcgKzcwLDcgQEAKIAogLyogYWxsIG5vcm1hbCBJUlFzIGNhbiBiZSBGSVFzICovCiAjZGVmaW5lIEZJUV9TVEFSVAkwCi0vKiBzd2l0Y2ggYmV0d2VhbiBJUlEgYW5kIEZJUSAqLworLyogc3dpdGNoIGJldHdlZW4gSVJRIGFuZCBGSVEgKi8KIGV4dGVybiBpbnQgbXhjX3NldF9pcnFfZmlxKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKTsKIAogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfTVhDX0lSUVNfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwppbmRleCAxZjk4ZTBiLi5jY2YyNjYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKQEAgLTcxOCw3ICs3MTgsNyBAQAogCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKIAljYXNlIE1FVEhPRF9HUElPXzQ0WFg6CiAJCXNldF8yNHh4X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBncGlvLCB0cmlnZ2VyKTsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogI2VuZGlmCiAJZGVmYXVsdDoKIAkJZ290byBiYWQ7CkBAIC03NTYsOCArNzU2LDEwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIAlyZXR2YWwgPSBfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgdHlwZSk7CiAJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCWlycV9kZXNjW2lycV0uc3RhdHVzICY9IH5JUlFfVFlQRV9TRU5TRV9NQVNLOwotCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyB8PSB0eXBlOworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmQgPSBpcnFfdG9fZGVzYyhpcnEpOworCisJCWQtPnN0YXR1cyAmPSB+SVJRX1RZUEVfU0VOU0VfTUFTSzsKKwkJZC0+c3RhdHVzIHw9IHR5cGU7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhbmstPmxvY2ssIGZsYWdzKTsKIApAQCAtMTY3MSw3ICsxNjczLDkgQEAKIAogCWZvciAoaiA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OwogCQkgICAgIGogPCBiYW5rLT52aXJ0dWFsX2lycV9zdGFydCArIGJhbmtfd2lkdGg7IGorKykgewotCQlsb2NrZGVwX3NldF9jbGFzcygmaXJxX2Rlc2Nbal0ubG9jaywgJmdwaW9fbG9ja19jbGFzcyk7CisJCXN0cnVjdCBpcnFfZGVzYyAqZCA9IGlycV90b19kZXNjKGopOworCisJCWxvY2tkZXBfc2V0X2NsYXNzKCZkLT5sb2NrLCAmZ3Bpb19sb2NrX2NsYXNzKTsKIAkJc2V0X2lycV9jaGlwX2RhdGEoaiwgYmFuayk7CiAJCWlmIChiYW5rX2lzX21wdWlvKGJhbmspKQogCQkJc2V0X2lycV9jaGlwKGosICZtcHVpb19pcnFfY2hpcCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L2Rpc3BsYXkuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZGlzcGxheS5oCmluZGV4IGM5MTVhNjYuLjUzN2Y0ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZGlzcGxheS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvZGlzcGxheS5oCkBAIC00Miw2ICs0MiwxMCBAQAogI2RlZmluZSBESVNQQ19JUlFfU1lOQ19MT1NUCQkoMSA8PCAxNCkKICNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVAkoMSA8PCAxNSkKICNkZWZpbmUgRElTUENfSVJRX1dBS0VVUAkJKDEgPDwgMTYpCisjZGVmaW5lIERJU1BDX0lSUV9TWU5DX0xPU1QyCQkoMSA8PCAxNykKKyNkZWZpbmUgRElTUENfSVJRX1ZTWU5DMgkJKDEgPDwgMTgpCisjZGVmaW5lIERJU1BDX0lSUV9BQ0JJQVNfQ09VTlRfU1RBVDIJKDEgPDwgMjEpCisjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkUyCQkoMSA8PCAyMikKIAogc3RydWN0IG9tYXBfZHNzX2RldmljZTsKIHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcjsKQEAgLTY0LDYgKzY4LDcgQEAKIGVudW0gb21hcF9jaGFubmVsIHsKIAlPTUFQX0RTU19DSEFOTkVMX0xDRAk9IDAsCiAJT01BUF9EU1NfQ0hBTk5FTF9ESUdJVAk9IDEsCisJT01BUF9EU1NfQ0hBTk5FTF9MQ0QyCT0gMiwKIH07CiAKIGVudW0gb21hcF9jb2xvcl9tb2RlIHsKQEAgLTE0Miw2ICsxNDcsNyBAQAogZW51bSBvbWFwX2Rzc19vdmVybGF5X21hbmFnZXJzIHsKIAlPTUFQX0RTU19PVkxfTUdSX0xDRCwKIAlPTUFQX0RTU19PVkxfTUdSX1RWLAorCU9NQVBfRFNTX09WTF9NR1JfTENEMiwKIH07CiAKIGVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSB7CkBAIC0yNjgsNiArMjc0LDcgQEAKIAl1MTYgb3V0X3dpZHRoOwkvKiBpZiAwLCBvdXRfd2lkdGggPT0gd2lkdGggKi8KIAl1MTYgb3V0X2hlaWdodDsJLyogaWYgMCwgb3V0X2hlaWdodCA9PSBoZWlnaHQgKi8KIAl1OCBnbG9iYWxfYWxwaGE7CisJdTggcHJlX211bHRfYWxwaGE7CiB9OwogCiBzdHJ1Y3Qgb21hcF9vdmVybGF5IHsKQEAgLTM1MSw2ICszNTgsOCBAQAogCiAJZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSB0eXBlOwogCisJZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbDsKKwogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCXU4IGRhdGFfbGluZXM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L29tYXBfaHdtb2QuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCmluZGV4IDY4NjRhOTkuLjFlZWU4NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvb21hcF9od21vZC5oCkBAIC0zNTEsNyArMzUxLDcgQEAKIC8qKgogICogc3RydWN0IG9tYXBfaHdtb2Rfb21hcDRfcHJjbSAtIE9NQVA0LXNwZWNpZmljIFBSQ00gZGF0YQogICogQGNsa2N0cmxfcmVnOiBQUkNNIGFkZHJlc3Mgb2YgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIKLSAqIEByc3RjdHJsX3JlZzogYWRyZXNzIG9mIHRoZSBYWFhfUlNUQ1RSTCByZWdpc3RlciBsb2NhdGVkIGluIHRoZSBQUk0KKyAqIEByc3RjdHJsX3JlZzogYWRkcmVzcyBvZiB0aGUgWFhYX1JTVENUUkwgcmVnaXN0ZXIgbG9jYXRlZCBpbiB0aGUgUFJNCiAgKiBAc3VibW9kdWxlX3drZGVwX2JpdDogYml0IHNoaWZ0IG9mIHRoZSBXS0RFUCByYW5nZQogICovCiBzdHJ1Y3Qgb21hcF9od21vZF9vbWFwNF9wcmNtIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvcGFuZWwtZ2VuZXJpYy1kcGkuaCBiL2FyY2gvYXJtL3BsYXQtb21hcC9pbmNsdWRlL3BsYXQvcGFuZWwtZ2VuZXJpYy1kcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC9wYW5lbC1nZW5lcmljLWRwaS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBIZWFkZXIgZm9yIGdlbmVyaWMgRFBJIHBhbmVsIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBDYW5vbmljYWwgTHRkLgorICogQXV0aG9yOiBCcnlhbiBXdSA8YnJ5YW4ud3VAY2Fub25pY2FsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19BUkNIX0FSTV9QTEFUX09NQVBfUEFORUxfR0VORVJJQ19EUElfSAorI2RlZmluZSBfX0FSQ0hfQVJNX1BMQVRfT01BUF9QQU5FTF9HRU5FUklDX0RQSV9ICisKKyNpbmNsdWRlICJkaXNwbGF5LmgiCisKKy8qKgorICogc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEgLSBwYW5lbCBkcml2ZXIgY29uZmlndXJhdGlvbiBkYXRhCisgKiBAbmFtZTogcGFuZWwgbmFtZQorICogQHBsYXRmb3JtX2VuYWJsZTogcGxhdGZvcm0gc3BlY2lmaWMgcGFuZWwgZW5hYmxlIGZ1bmN0aW9uCisgKiBAcGxhdGZvcm1fZGlzYWJsZTogcGxhdGZvcm0gc3BlY2lmaWMgcGFuZWwgZGlzYWJsZSBmdW5jdGlvbgorICovCitzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpwbGF0Zm9ybV9lbmFibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CisJdm9pZCAoKnBsYXRmb3JtX2Rpc2FibGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Cit9OworCisjZW5kaWYgLyogX19BUkNIX0FSTV9QTEFUX09NQVBfUEFORUxfR0VORVJJQ19EUElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2luY2x1ZGUvcGxhdC92b2x0YWdlLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZvbHRhZ2UuaAppbmRleCAwZmYxMjMzLi41YmQyMDRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZvbHRhZ2UuaAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvaW5jbHVkZS9wbGF0L3ZvbHRhZ2UuaApAQCAtMTQsNiArMTQsOCBAQAogI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfT01BUDJfVk9MVEFHRV9ICiAjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQMl9WT0xUQUdFX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCiAjZGVmaW5lIFZPTFRTQ0FMRV9WUEZPUkNFVVBEQVRFCQkxCiAjZGVmaW5lIFZPTFRTQ0FMRV9WQ0JZUEFTUwkJMgogCkBAIC02NSw5ICs2Nyw2IEBACiAJY2hhciAqbmFtZTsKIH07CiAKLS8qIEFQSSB0byBnZXQgdGhlIHZvbHRhZ2Vkb21haW4gcG9pbnRlciAqLwotc3RydWN0IHZvbHRhZ2Vkb21haW4gKm9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUpOwotCiAvKioKICAqIHN0cnVjdCBvbWFwX3ZvbHRfZGF0YSAtIE9tYXAgdm9sdGFnZSBzcGVjaWZpYyBkYXRhLgogICogQHZvbHRhZ2Vfbm9taW5hbDoJVGhlIHBvc3NpYmxlIHZvbHRhZ2UgdmFsdWUgaW4gdVYKQEAgLTEzMSwxNiArMTMwLDI2IEBACiAJCXN0cnVjdCBvbWFwX3ZvbHRfcG1pY19pbmZvICpwbWljX2luZm8pOwogdm9pZCBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCiAJCWludCB2b2x0c2NhbGVfbWV0aG9kKTsKKy8qIEFQSSB0byBnZXQgdGhlIHZvbHRhZ2Vkb21haW4gcG9pbnRlciAqLworc3RydWN0IHZvbHRhZ2Vkb21haW4gKm9tYXBfdm9sdGFnZV9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUpOworCiBpbnQgb21hcF92b2x0YWdlX2xhdGVfaW5pdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBvbWFwX3ZvbHRhZ2VfcmVnaXN0ZXJfcG1pYyhzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqdm9sdGRtLAotCQlzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyAqcG1pY19pbmZvKSB7fQorCQlzdHJ1Y3Qgb21hcF92b2x0X3BtaWNfaW5mbyAqcG1pY19pbmZvKQoreworCXJldHVybiAtRUlOVkFMOworfQogc3RhdGljIGlubGluZSAgdm9pZCBvbWFwX2NoYW5nZV92b2x0c2NhbGVfbWV0aG9kKHN0cnVjdCB2b2x0YWdlZG9tYWluICp2b2x0ZG0sCiAJCWludCB2b2x0c2NhbGVfbWV0aG9kKSB7fQogc3RhdGljIGlubGluZSBpbnQgb21hcF92b2x0YWdlX2xhdGVfaW5pdCh2b2lkKQogewogCXJldHVybiAtRUlOVkFMOwogfQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm9sdGFnZWRvbWFpbiAqb21hcF92b2x0YWdlX2RvbWFpbl9sb29rdXAoY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUtZnJlcS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKaW5kZXggMWVjYzE1Yi4uMjVhOGZjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2NwdS1mcmVxLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9kZXZzLmMKaW5kZXggMmY5MTA1Ny4uOGE0MmJjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2RldnMuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZGV2cy5jCkBAIC0yNTksMjEgKzI1OSw2IEBACiAKIEVYUE9SVF9TWU1CT0woczNjX2RldmljZV9paXMpOwogCi0vKiBBU29DIFBDTSBETUEgKi8KLQotc3RhdGljIHU2NCBzM2NfZGV2aWNlX2F1ZGlvX2RtYW1hc2sgPSAweGZmZmZmZmZmVUw7Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjX2RldmljZV9wY20gPSB7Ci0JLm5hbWUJCSAgPSAiczNjMjR4eC1wY20tYXVkaW8iLAotCS5pZAkJICA9IC0xLAotCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9hdWRpb19kbWFtYXNrLAotCQkuY29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmVUwKLQl9Ci19OwotCi1FWFBPUlRfU1lNQk9MKHMzY19kZXZpY2VfcGNtKTsKLQogLyogUlRDICovCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczNjX3J0Y19yZXNvdXJjZVtdID0gewpAQCAtNDk2LDggKzQ4MSwxMCBAQAogCX0sCiB9OwogCitzdGF0aWMgdTY0IHMzY19kZXZpY2VfYXVkaW9fZG1hbWFzayA9IDB4ZmZmZmZmZmZVTDsKKwogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2NfZGV2aWNlX2FjOTcgPSB7Ci0JLm5hbWUJCSAgPSAiczNjLWFjOTciLAorCS5uYW1lCQkgID0gInNhbXN1bmctYWM5NyIsCiAJLmlkCQkgID0gLTEsCiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2FjOTdfcmVzb3VyY2UpLAogCS5yZXNvdXJjZQkgID0gczNjX2FjOTdfcmVzb3VyY2UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKaW5kZXggYWZjY2U0NzQuLjE5ZDhhMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIG9iai15CQkJCSs9IHB3bS1jbG9jay5vCiBvYmoteQkJCQkrPSBncGlvLm8KIG9iai15CQkJCSs9IGdwaW8tY29uZmlnLm8KK29iai15CQkJCSs9IGRldi1hc29jZG1hLm8KIAogb2JqLSQoQ09ORklHX1NBTVNVTkdfR1BJT0xJQl80QklUKQkrPSBncGlvbGliLm8KIG9iai0kKENPTkZJR19TQU1TVU5HX0NMS1NSQykJKz0gY2xvY2stY2xrc3JjLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYXNvY2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1hc29jZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2OGM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYXNvY2RtYS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYXNvY2RtYS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIEx0ZAorICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8cGxhdC9kZXZzLmg+CisKK3N0YXRpYyB1NjQgYXVkaW9fZG1hbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYSA9IHsKKwkubmFtZQkJICA9ICJzYW1zdW5nLWF1ZGlvIiwKKwkuaWQJCSAgPSAtMSwKKwkuZGV2ICAgICAgICAgICAgICA9IHsKKwkJLmRtYV9tYXNrID0gJmF1ZGlvX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfQorfTsKK0VYUE9SVF9TWU1CT0woc2Ftc3VuZ19hc29jX2RtYSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2F1ZGlvLmgKaW5kZXggNzcxMmZmNi4uYTA4MjZlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9hdWRpby5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvYXVkaW8uaApAQCAtMjUsMTAgKzI1LDM0IEBACiAjZGVmaW5lIFM1UEMxMDBfU1BESUZfR1BHMyAxCiBleHRlcm4gdm9pZCBzNXBjMTAwX3NwZGlmX3NldHVwX2dwaW8oaW50KTsKIAorc3RydWN0IHNhbXN1bmdfaTJzIHsKKy8qIElmIHRoZSBQcmltYXJ5IERBSSBoYXMgNS4xIENoYW5uZWxzICovCisjZGVmaW5lIFFVSVJLX1BSSV82Q0hBTgkJKDEgPDwgMCkKKy8qIElmIHRoZSBJMlMgYmxvY2sgaGFzIGEgU3RlcmVvIE92ZXJsYXkgQ2hhbm5lbCAqLworI2RlZmluZSBRVUlSS19TRUNfREFJCQkoMSA8PCAxKQorLyoKKyAqIElmIHRoZSBJMlMgYmxvY2sgaGFzIG5vIGludGVybmFsIHByZXNjYWxhciBvciBNVVggKEkyU01PRFsxMF0gYml0KQorICogVGhlIE1hY2hpbmUgZHJpdmVyIG11c3QgcHJvdmlkZSBzdWl0YWJseSBzZXQgY2xvY2sgdG8gdGhlIEkyUyBibG9jay4KKyAqLworI2RlZmluZSBRVUlSS19OT19NVVhQU1IJCSgxIDw8IDIpCisjZGVmaW5lIFFVSVJLX05FRURfUlNUQ0xSCSgxIDw8IDMpCisJLyogUXVpcmtzIG9mIHRoZSBJMlMgY29udHJvbGxlciAqLworCXUzMiBxdWlya3M7CisKKwkvKgorCSAqIEFycmF5IG9mIGNsb2NrIG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSTJTIHNpZ25hbHMuCisJICogQWxzbyBjb3JyZXNwb25kcyB0byBjbG9ja3Mgb2YgSTJTTU9EWzEwXQorCSAqLworCWNvbnN0IGNoYXIgKipzcmNfY2xrOworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhIC0gY29tbW9uIHBsYXRmb3JtIGRhdGEgZm9yIGF1ZGlvIGRldmljZSBkcml2ZXJzCiAgKiBAY2ZnX2dwaW86IENhbGxiYWNrIGZ1bmN0aW9uIHRvIHNldHVwIG11eCdlZCBwaW5zIGluIEkyUy9QQ00vQUM5NyBtb2RlCiAgKi8KIHN0cnVjdCBzM2NfYXVkaW9fcGRhdGEgewogCWludCAoKmNmZ19ncGlvKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopOworCXVuaW9uIHsKKwkJc3RydWN0IHNhbXN1bmdfaTJzIGkyczsKKwl9IHR5cGU7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2luY2x1ZGUvcGxhdC9kZXZzLmggYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaAppbmRleCAyZDgyYTZjLi5lOWUzYjZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaAorKysgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2RldnMuaApAQCAtMzIsNyArMzIsNyBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2Vfc3BpMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3NwaTE7CiAKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzY19kZXZpY2VfcGNtOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2Ftc3VuZ19hc29jX2RtYTsKIAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjNjR4eF9kZXZpY2VfcGNtMDsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMzYzY0eHhfZGV2aWNlX3BjbTE7CkBAIC05Niw2ICs5NiwxNSBAQAogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjIxMF9kZXZpY2VfaWlzMjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYyMTBfZGV2aWNlX3NwZGlmOwogCitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MzEwX2RldmljZV9hYzk3OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2VfcGNtMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX3BjbTE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MzEwX2RldmljZV9wY20yOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2VfaTJzMDsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cHYzMTBfZGV2aWNlX2kyczE7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXB2MzEwX2RldmljZV9pMnMyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwdjMxMF9kZXZpY2Vfc3BkaWY7CisKIGV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHM1cDY0NDJfZGV2aWNlX3BjbTA7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBzNXA2NDQyX2RldmljZV9wY20xOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczVwNjQ0Ml9kZXZpY2VfaWlzMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9wbS5jIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKaW5kZXggMjdjZmNhNS4uNWJmM2YyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLmMKQEAgLTM1NSw3ICszNTUsNyBAQAogCXMzY19wbV9jaGVja19jbGVhbnVwKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgczNjX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgczNjX3BtX29wcyA9IHsKIAkuZW50ZXIJCT0gczNjX3BtX2VudGVyLAogCS5wcmVwYXJlCT0gczNjX3BtX3ByZXBhcmUsCiAJLmZpbmlzaAkJPSBzM2NfcG1fZmluaXNoLApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKaW5kZXggOGM2YTI0NC4uNjU5ZDExOSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCkBAIC0xODgsNyArMTg4LDcgQEAKIAkgKi8KIAlyZWdzID0gKHZvaWQgX19pb21lbSBfX2ZvcmNlICopcmVzLT5zdGFydDsKIAlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGNsayIpOwotCWlmICghcGNsaykKKwlpZiAoSVNfRVJSKHBjbGspKQogCQlyZXR1cm47CiAKIAljbGtfZW5hYmxlKHBjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCmluZGV4IDJhZGMyNjEuLjZjZTMwZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCSAqLwogCXJlZ3MgPSAodm9pZCBfX2lvbWVtIF9fZm9yY2UgKilyZXMtPnN0YXJ0OwogCXBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7Ci0JaWYgKCFwY2xrKQorCWlmIChJU19FUlIocGNsaykpCiAJCXJldHVybjsKIAogCWNsa19lbmFibGUocGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMKaW5kZXggNzVmMTlmNC4uODZmYWI3NyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvc2V0dXAuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJICovCiAJcmVncyA9ICh2b2lkIF9faW9tZW0gX19mb3JjZSAqKXJlcy0+c3RhcnQ7CiAJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKLQlpZiAoIXBjbGspCisJaWYgKElTX0VSUihwY2xrKSkKIAkJcmV0dXJuOwogCiAJY2xrX2VuYWJsZShwY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYwppbmRleCBkZDAwOTg3NS4uZGExNGZiZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJcmVncyA9ICh2b2lkIF9faW9tZW0gX19mb3JjZSAqKXJlcy0+c3RhcnQ7CiAJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInBjbGsiKTsKIAotCWlmICghcGNsaykKKwlpZiAoSVNfRVJSKHBjbGspKQogCQlyZXR1cm47CiAKIAljbGtfZW5hYmxlKHBjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvbWVyaXNjL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9tZXJpc2Mvc2V0dXAuYwppbmRleCA2MjNiMDc3Li5lNjFiYzk0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9tZXJpc2Mvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9tZXJpc2Mvc2V0dXAuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAlyZWdzID0gKHZvaWQgX19pb21lbSBfX2ZvcmNlICopcmVzLT5zdGFydDsKIAlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGNsayIpOwotCWlmICghcGNsaykKKwlpZiAoSVNfRVJSKHBjbGspKQogCQlyZXR1cm47CiAKIAljbGtfZW5hYmxlKHBjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jCmluZGV4IDUyM2Q4ZTEuLmM0ZGE1Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL3NldHVwLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCSAqLwogCXJlZ3MgPSAodm9pZCBfX2lvbWVtIF9fZm9yY2UgKilyZXMtPnN0YXJ0OwogCXBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7Ci0JaWYgKCFwY2xrKQorCWlmIChJU19FUlIocGNsaykpCiAJCXJldHVybjsKIAogCWNsa19lbmFibGUocGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2RlZmNvbmZpZwppbmRleCA5ODU0MDEzLi42ZjljYTU2IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTIsMjAgKzIsMTcgQEAKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfT1BST0ZJTEU9bQotQ09ORklHX0tQUk9CRVM9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKIENPTkZJR19OT19IWj15CkBAIC0yOSw2ICsyNiw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQogQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQogQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CitDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlM9eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTcyLDggKzcwLDggQEAKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9UQ0xJQj15Ci1DT05GSUdfRUVQUk9NX0FUMjQ9bQogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX1RVTj1tCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKQEAgLTEwNiw2ICsxMDQsNyBAQAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19BVDMyQVA3MDBYX1dEVD15CiBDT05GSUdfVVNCX0dBREdFVD15CitDT05GSUdfVVNCX0dBREdFVF9WQlVTX0RSQVc9MzUwCiBDT05GSUdfVVNCX1pFUk89bQogQ09ORklHX1VTQl9FVEg9bQogQ09ORklHX1VTQl9HQURHRVRGUz1tCkBAIC0xMTUsMTQgKzExNCwxMiBAQAogQ09ORklHX01NQz15CiBDT05GSUdfTU1DX1RFU1Q9bQogQ09ORklHX01NQ19BVE1FTE1DST15Ci1DT05GSUdfTU1DX1NQST1tCiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfR1BJTz15CiBDT05GSUdfTEVEU19UUklHR0VSUz15CiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKLUNPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFg9eQogQ09ORklHX0RNQURFVklDRVM9eQpAQCAtMTMwLDIxICsxMjcsMjMgQEAKIENPTkZJR19FWFQzX0ZTPXkKICMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQ0X0ZTPXkKKyMgQ09ORklHX0VYVDRfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfRlVTRV9GUz1tCiBDT05GSUdfTVNET1NfRlM9bQogQ09ORklHX1ZGQVRfRlM9bQogQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAorQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1RNUEZTPXkKLUNPTkZJR19DT05GSUdGU19GUz1tCitDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19VRlNfRlM9eQorQ09ORklHX1VCSUZTX0ZTPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX05GU0Q9bQogQ09ORklHX05GU0RfVjM9eQotQ09ORklHX1NNQl9GUz1tCiBDT05GSUdfQ0lGUz1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCkBAIC0xNTUsNSArMTU0LDMgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1BDQkM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwppbmRleCA3Y2VkYTM1Li43ZWVjZTBhIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtMiwyMCArMiwxNyBAQAogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogQ09ORklHX05PX0haPXkKQEAgLTMxLDYgKzI4LDcgQEAKIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfQVQzMkFQPXkKK0NPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNzQsOCArNzIsMTAgQEAKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9UQ0xJQj15CiBDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfVFVOPW0KIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01BQ0I9eQogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldApAQCAtMTA0LDYgKzEwNCw3IEBACiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfQVRNRUw9eQogQ09ORklHX1NQSV9TUElERVY9bQorQ09ORklHX0dQSU9fU1lTRlM9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19BVDMyQVA3MDBYX1dEVD15CkBAIC0xMjcsNiArMTI4LDcgQEAKIENPTkZJR19VU0JfR19TRVJJQUw9bQogQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KIENPTkZJR19NTUM9eQorQ09ORklHX01NQ19URVNUPW0KIENPTkZJR19NTUNfQVRNRUxNQ0k9eQogQ09ORklHX05FV19MRURTPXkKIENPTkZJR19MRURTX0NMQVNTPXkKQEAgLTE0MSwxMSArMTQzLDE0IEBACiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz15CisjIENPTkZJR19FWFQ0X0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX01TRE9TX0ZTPW0KIENPTkZJR19WRkFUX0ZTPW0KIENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKK0NPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKQEAgLTE1NSw3ICsxNjAsNiBAQAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TTUJfRlM9bQogQ09ORklHX0NJRlM9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQpAQCAtMTY2LDQgKzE3MCwzIEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwX2V2a2xjZDEwMV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZwppbmRleCA3YmM1YjJjLi4zODdlYjlkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZXZrbGNkMTAxX2RlZmNvbmZpZwpAQCAtMiwyMCArMiwxNyBAQAogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogQ09ORklHX05PX0haPXkKQEAgLTMwLDYgKzI3LDcgQEAKIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfQVQzMkFQPXkKK0NPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNzMsOCArNzEsMTAgQEAKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9UQ0xJQj15CiBDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfVFVOPW0KIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01BQ0I9eQogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldApAQCAtMTAzLDYgKzEwMyw3IEBACiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfQVRNRUw9eQogQ09ORklHX1NQSV9TUElERVY9bQorQ09ORklHX0dQSU9fU1lTRlM9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19BVDMyQVA3MDBYX1dEVD15CkBAIC0xMjYsNiArMTI3LDcgQEAKIENPTkZJR19VU0JfR19TRVJJQUw9bQogQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KIENPTkZJR19NTUM9eQorQ09ORklHX01NQ19URVNUPW0KIENPTkZJR19NTUNfQVRNRUxNQ0k9eQogQ09ORklHX05FV19MRURTPXkKIENPTkZJR19MRURTX0NMQVNTPXkKQEAgLTE0MCwxMSArMTQyLDE0IEBACiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz15CisjIENPTkZJR19FWFQ0X0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX01TRE9TX0ZTPW0KIENPTkZJR19WRkFUX0ZTPW0KIENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKK0NPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKQEAgLTE1NCw3ICsxNTksNiBAQAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TTUJfRlM9bQogQ09ORklHX0NJRlM9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQpAQCAtMTY1LDQgKzE2OSwzIEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwppbmRleCA0YmQzNjgyLi5mMGZlMjM3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2RlZmNvbmZpZwpAQCAtMiwyMCArMiwxNyBAQAogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogQ09ORklHX05PX0haPXkKQEAgLTI5LDYgKzI2LDcgQEAKIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfQVQzMkFQPXkKK0NPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNzQsNiArNzIsNyBAQAogQ09ORklHX0JMS19ERVZfTE9PUD1tCiBDT05GSUdfQkxLX0RFVl9OQkQ9bQogQ09ORklHX0JMS19ERVZfUkFNPW0KK0NPTkZJR19NSVNDX0RFVklDRVM9eQogQ09ORklHX0FUTUVMX1RDTElCPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19UVU49bQpAQCAtMTA3LDYgKzEwNiw3IEBACiBDT05GSUdfV0FUQ0hET0c9eQogQ09ORklHX0FUMzJBUDcwMFhfV0RUPXkKIENPTkZJR19VU0JfR0FER0VUPXkKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz0zNTAKIENPTkZJR19VU0JfWkVSTz1tCiBDT05GSUdfVVNCX0VUSD1tCiBDT05GSUdfVVNCX0dBREdFVEZTPW0KQEAgLTExNiwxNCArMTE2LDEyIEBACiBDT05GSUdfTU1DPXkKIENPTkZJR19NTUNfVEVTVD1tCiBDT05GSUdfTU1DX0FUTUVMTUNJPXkKLUNPTkZJR19NTUNfU1BJPW0KIENPTkZJR19ORVdfTEVEUz15CiBDT05GSUdfTEVEU19DTEFTUz15CiBDT05GSUdfTEVEU19HUElPPXkKIENPTkZJR19MRURTX1RSSUdHRVJTPXkKIENPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQ9eQotQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWD15CiBDT05GSUdfRE1BREVWSUNFUz15CkBAIC0xMzEsMjEgKzEyOSwyMyBAQAogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDRfRlM9eQorIyBDT05GSUdfRVhUNF9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19GVVNFX0ZTPW0KIENPTkZJR19NU0RPU19GUz1tCiBDT05GSUdfVkZBVF9GUz1tCiBDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODUwCitDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQotQ09ORklHX0NPTkZJR0ZTX0ZTPW0KK0NPTkZJR19DT05GSUdGU19GUz15CiBDT05GSUdfSkZGUzJfRlM9eQotQ09ORklHX1VGU19GUz15CitDT05GSUdfVUJJRlNfRlM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15Ci1DT05GSUdfU01CX0ZTPW0KIENPTkZJR19DSUZTPW0KIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KIENPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KQEAgLTE1Niw1ICsxNTYsMyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fUENCQz1tCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMF9kZWZjb25maWcKaW5kZXggZjg0MzdlZi4uZTRhN2MxZCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAwX2RlZmNvbmZpZwpAQCAtMiwyMCArMiwxNyBAQAogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci1DT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKLUNPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAogQ09ORklHX05PX0haPXkKQEAgLTMyLDYgKzI5LDcgQEAKIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfQVQzMkFQPXkKK0NPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNzcsOCArNzUsMTAgQEAKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9UQ0xJQj15CiBDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfVFVOPW0KIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01BQ0I9eQogIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldApAQCAtMTA3LDYgKzEwNyw3IEBACiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfQVRNRUw9eQogQ09ORklHX1NQSV9TUElERVY9bQorQ09ORklHX0dQSU9fU1lTRlM9eQogIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19BVDMyQVA3MDBYX1dEVD15CkBAIC0xMzAsNiArMTMxLDcgQEAKIENPTkZJR19VU0JfR19TRVJJQUw9bQogQ09ORklHX1VTQl9DRENfQ09NUE9TSVRFPW0KIENPTkZJR19NTUM9eQorQ09ORklHX01NQ19URVNUPW0KIENPTkZJR19NTUNfQVRNRUxNQ0k9eQogQ09ORklHX05FV19MRURTPXkKIENPTkZJR19MRURTX0NMQVNTPXkKQEAgLTE0NCwxMSArMTQ2LDE0IEBACiBDT05GSUdfRVhUM19GUz15CiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz15CisjIENPTkZJR19FWFQ0X0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX01TRE9TX0ZTPW0KIENPTkZJR19WRkFUX0ZTPW0KIENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKK0NPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CiBDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKQEAgLTE1OCw3ICsxNjMsNiBAQAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TTUJfRlM9bQogQ09ORklHX0NJRlM9bQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQogQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQpAQCAtMTY5LDQgKzE3MywzIEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0bmd3MTAwbWtpaV9ldmtsY2QxMDFfZGVmY29uZmlnCmluZGV4IDdmNThmOTkuLjZmMzdmNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMG1raWlfZXZrbGNkMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBta2lpX2V2a2xjZDEwMV9kZWZjb25maWcKQEAgLTIsMjAgKzIsMTcgQEAKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQotQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfT1BST0ZJTEU9bQotQ09ORklHX0tQUk9CRVM9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15Ci1DT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKIENPTkZJR19OT19IWj15CkBAIC0zMSw2ICsyOCw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQogQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQogQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CitDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlM9eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTc2LDggKzc0LDEwIEBACiBDT05GSUdfQkxLX0RFVl9MT09QPW0KIENPTkZJR19CTEtfREVWX05CRD1tCiBDT05GSUdfQkxLX0RFVl9SQU09bQorQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfQVRNRUxfVENMSUI9eQogQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX1RVTj1tCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKIENPTkZJR19NQUNCPXkKICMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKQEAgLTEwNiw2ICsxMDYsNyBAQAogQ09ORklHX1NQST15CiBDT05GSUdfU1BJX0FUTUVMPXkKIENPTkZJR19TUElfU1BJREVWPW0KK0NPTkZJR19HUElPX1NZU0ZTPXkKICMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiBDT05GSUdfQVQzMkFQNzAwWF9XRFQ9eQpAQCAtMTI5LDYgKzEzMCw3IEBACiBDT05GSUdfVVNCX0dfU0VSSUFMPW0KIENPTkZJR19VU0JfQ0RDX0NPTVBPU0lURT1tCiBDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfVEVTVD1tCiBDT05GSUdfTU1DX0FUTUVMTUNJPXkKIENPTkZJR19ORVdfTEVEUz15CiBDT05GSUdfTEVEU19DTEFTUz15CkBAIC0xNDMsMTEgKzE0NSwxNCBAQAogQ09ORklHX0VYVDNfRlM9eQogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAorQ09ORklHX0VYVDRfRlM9eQorIyBDT05GSUdfRVhUNF9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19GVVNFX0ZTPW0KIENPTkZJR19NU0RPU19GUz1tCiBDT05GSUdfVkZBVF9GUz1tCiBDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODUwCitDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX0NPTkZJR0ZTX0ZTPXkKIENPTkZJR19KRkZTMl9GUz15CkBAIC0xNTcsNyArMTYyLDYgQEAKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTkZTRD1tCiBDT05GSUdfTkZTRF9WMz15Ci1DT05GSUdfU01CX0ZTPW0KIENPTkZJR19DSUZTPW0KIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KIENPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KQEAgLTE2OCw0ICsxNzIsMyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKaW5kZXggYWVjNGM0My4uNGZiMDFmNSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKQEAgLTMsNyArMyw2IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CiBDT05GSUdfUkVMQVk9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKQEAgLTExLDcgKzEwLDcgQEAKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CiBDT05GSUdfT1BST0ZJTEU9bQotQ09ORklHX0tQUk9CRVM9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CkBAIC0yNiw2ICsyNSw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQogQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQogQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CitDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlM9eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTM1LDYgKzM1LDcgQEAKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19ORVRfSVBJUD1tCitDT05GSUdfTkVUX0lQR1JFX0RFTVVYPW0KIENPTkZJR19ORVRfSVBHUkU9bQogQ09ORklHX0lORVRfQUg9bQogQ09ORklHX0lORVRfRVNQPW0KQEAgLTU4LDE2ICs1OSwxNCBAQAogQ09ORklHX01URF9DRkk9eQogQ09ORklHX01URF9DRklfQU1EU1REPXkKIENPTkZJR19NVERfUEhZU01BUD15Ci1DT05GSUdfTVREX0RBVEFGTEFTSD1tCi1DT05GSUdfTVREX00yNVA4MD1tCiBDT05GSUdfTVREX1VCST15CiBDT05GSUdfQkxLX0RFVl9MT09QPW0KIENPTkZJR19CTEtfREVWX05CRD1tCiBDT05GSUdfQkxLX0RFVl9SQU09bQorQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfQVRNRUxfUFdNPW0KIENPTkZJR19BVE1FTF9UQ0xJQj15CiBDT05GSUdfQVRNRUxfU1NDPW0KLUNPTkZJR19FRVBST01fQVQyND1tCiAjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfU0Q9bQogQ09ORklHX0JMS19ERVZfU1I9bQpAQCAtMTIwLDcgKzExOSw2IEBACiBDT05GSUdfU05EX1BDTV9PU1M9bQogIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0RSSVZFUlMgaXMgbm90IHNldAogQ09ORklHX1NORF9BVDczQzIxMz1tCiAjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0dBREdFVD15CkBAIC0xMzEsMTYgKzEyOSwxNSBAQAogQ09ORklHX1VTQl9HX1NFUklBTD1tCiBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEU9bQogQ09ORklHX01NQz15CitDT05GSUdfTU1DX1RFU1Q9bQogQ09ORklHX01NQ19BVE1FTE1DST15Ci1DT05GSUdfTU1DX1NQST1tCiBDT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0xFRFNfQ0xBU1M9bQorQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfQVRNRUxfUFdNPW0KIENPTkZJR19MRURTX0dQSU89bQogQ09ORklHX0xFRFNfVFJJR0dFUlM9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj1tCiBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD1tCi1DT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049bQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKQEAgLTE0OSwyMCArMTQ2LDIzIEBACiAjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfRVhUNF9GUz15CisjIENPTkZJR19FWFQ0X0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX01TRE9TX0ZTPW0KIENPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CitDT05GSUdfQ09ORklHRlNfRlM9eQogQ09ORklHX0pGRlMyX0ZTPXkKLSMgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSIGlzIG5vdCBzZXQKIENPTkZJR19VQklGU19GUz15Ci1DT05GSUdfTUlOSVhfRlM9bQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKIENPTkZJR19ST09UX05GUz15CitDT05GSUdfQ0lGUz1tCiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT1tCiBDT05GSUdfTkxTX1VURjg9bQogQ09ORklHX01BR0lDX1NZU1JRPXkKQEAgLTE3MCw2ICsxNzAsMyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj1tCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDAzX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCmluZGV4IDUwYmEzZGIuLjlmYWFmOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnCkBAIC0yLDIyICsyLDE1IEBACiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKLUNPTkZJR19UQVNLU1RBVFM9eQotQ09ORklHX1RBU0tfREVMQVlfQUNDVD15Ci1DT05GSUdfQVVESVQ9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIENPTkZJR19SRUxBWT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKQEAgLTMzLDYgKzI2LDcgQEAKIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORD15CiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CiBDT05GSUdfQ1BVX0ZSRVFfQVQzMkFQPXkKK0NPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNTQsMTggKzQ4LDE4IEBACiBDT05GSUdfTVREX0NGST15CiBDT05GSUdfTVREX0NGSV9BTURTVEQ9eQogQ09ORklHX01URF9QSFlTTUFQPXkKLUNPTkZJR19NVERfREFUQUZMQVNIPW0KLUNPTkZJR19NVERfTTI1UDgwPW0KK0NPTkZJR19NVERfVUJJPXkKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9QV009bQogQ09ORklHX0FUTUVMX1RDTElCPXkKIENPTkZJR19BVE1FTF9TU0M9bQotQ09ORklHX0VFUFJPTV9BVDI0PW0KICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9TRD1tCiBDT05GSUdfQkxLX0RFVl9TUj1tCisjIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9bQogIyBDT05GSUdfU0FUQV9QTVAgaXMgbm90IHNldAogQ09ORklHX1BBVEFfQVQzMj1tCkBAIC03Nyw2ICs3MSw3IEBACiBDT05GSUdfUFBQX0RFRkxBVEU9bQogQ09ORklHX1BQUF9CU0RDT01QPW0KIENPTkZJR19JTlBVVD1tCitDT05GSUdfSU5QVVRfRVZERVY9bQogIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAogQ09ORklHX0tFWUJPQVJEX0dQSU89bQogIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKQEAgLTEwNiw3ICsxMDEsNiBAQAogQ09ORklHX1NORF9BVDczQzIxMz1tCiAjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0dBREdFVD15Ci1DT05GSUdfVVNCX0dBREdFVF9ERUJVR19GUz15CiBDT05GSUdfVVNCX1pFUk89bQogQ09ORklHX1VTQl9FVEg9bQogQ09ORklHX1VTQl9HQURHRVRGUz1tCkBAIC0xMTYsMzYgKzExMCwzOSBAQAogQ09ORklHX01NQz15CiBDT05GSUdfTU1DX1RFU1Q9bQogQ09ORklHX01NQ19BVE1FTE1DST15Ci1DT05GSUdfTU1DX1NQST1tCiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfQVRNRUxfUFdNPW0KLUNPTkZJR19MRURTX0dQSU89eQorQ09ORklHX0xFRFNfR1BJTz1tCiBDT05GSUdfTEVEU19UUklHR0VSUz15Ci1DT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKLUNPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKLUNPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPW0KK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWD15CiBDT05GSUdfRE1BREVWSUNFUz15Ci1DT05GSUdfRFdfRE1BQz15Ci1DT05GSUdfRVhUMl9GUz1tCi1DT05GSUdfRVhUM19GUz1tCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz15CisjIENPTkZJR19FWFQ0X0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX01TRE9TX0ZTPW0KIENPTkZJR19WRkFUX0ZTPW0KK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15Ci1DT05GSUdfQ09ORklHRlNfRlM9bQorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKIENPTkZJR19KRkZTMl9GUz15CitDT05GSUdfVUJJRlNfRlM9eQogIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CiBDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD1tCiBDT05GSUdfTkxTX0lTTzg4NTlfMT1tCiBDT05GSUdfTkxTX1VURjg9bQogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19ERUJVR19GUz15CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLUNPTkZJR19DUkNfVDEwRElGPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDRfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKaW5kZXggMzI5ZTEwYi4uM2QyYTVkOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNF9kZWZjb25maWcKQEAgLTEsMTkgKzEsMzIgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAotIyBDT05GSUdfRlVURVggaXMgbm90IHNldAotIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfU0lHTkFMRkQgaXMgbm90IHNldAotIyBDT05GSUdfVElNRVJGRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVkVOVEZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAotQ09ORklHX1NMT0I9eQotIyBDT05GSUdfQkxPQ0sgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9bQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIENPTkZJR19CT0FSRF9BVFNUSzEwMDQ9eQogIyBDT05GSUdfT1dORVJTSElQX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19OTUlfREVCVUdHSU5HPXkKK0NPTkZJR19QTT15CitDT05GSUdfQ1BVX0ZSRVE9eQorIyBDT05GSUdfQ1BVX0ZSRVFfU1RBVCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0U9eQorQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CitDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlM9eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTMxLDQwICs0NCwxMDQgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQogQ09ORklHX01URF9DRkk9eQogQ09ORklHX01URF9DRklfQU1EU1REPXkKIENPTkZJR19NVERfUEhZU01BUD15Ci0jIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorQ09ORklHX01URF9VQkk9eQorQ09ORklHX0JMS19ERVZfTE9PUD1tCitDT05GSUdfQkxLX0RFVl9OQkQ9bQorQ09ORklHX0JMS19ERVZfUkFNPW0KK0NPTkZJR19NSVNDX0RFVklDRVM9eQorQ09ORklHX0FUTUVMX1BXTT1tCitDT05GSUdfQVRNRUxfVENMSUI9eQorQ09ORklHX0FUTUVMX1NTQz1tCisjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU0Q9bQorQ09ORklHX0JMS19ERVZfU1I9bQorIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPW0KKyMgQ09ORklHX1NBVEFfUE1QIGlzIG5vdCBzZXQKK0NPTkZJR19QQVRBX0FUMzI9bQorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9bQorQ09ORklHX1BQUF9BU1lOQz1tCitDT05GSUdfUFBQX0RFRkxBVEU9bQorQ09ORklHX1BQUF9CU0RDT01QPW0KK0NPTkZJR19JTlBVVD1tCitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX0dQSU89bQorIyBDT05GSUdfTU9VU0VfUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19NT1VTRV9HUElPPW0KICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9BVE1FTD15CiBDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX0FUTUVMX1BEQyBpcyBub3Qgc2V0CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0kyQz1tCitDT05GSUdfSTJDX0NIQVJERVY9bQorQ09ORklHX0kyQ19HUElPPW0KIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9BVE1FTD15CitDT05GSUdfU1BJX1NQSURFVj1tCitDT05GSUdfR1BJT19TWVNGUz15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogQ09ORklHX0FUMzJBUDcwMFhfV0RUPXkKIENPTkZJR19GQj15CiBDT05GSUdfRkJfQVRNRUw9eQogQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CitDT05GSUdfTENEX0NMQVNTX0RFVklDRT15CiBDT05GSUdfTENEX0xUVjM1MFFWPXkKICMgQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAogQ09ORklHX1VTQl9HQURHRVQ9eQotQ09ORklHX1VTQl9FVEg9eQotIyBDT05GSUdfVVNCX0VUSF9STkRJUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1pFUk89bQorQ09ORklHX1VTQl9FVEg9bQorQ09ORklHX1VTQl9HQURHRVRGUz1tCitDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRT1tCitDT05GSUdfVVNCX0dfU0VSSUFMPW0KK0NPTkZJR19VU0JfQ0RDX0NPTVBPU0lURT1tCitDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfVEVTVD1tCitDT05GSUdfTU1DX0FUTUVMTUNJPXkKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz15CitDT05GSUdfTEVEU19BVE1FTF9QV009bQorQ09ORklHX0xFRFNfR1BJTz1tCitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPW0KK0NPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPW0KIENPTkZJR19SVENfQ0xBU1M9eQotIyBDT05GSUdfUlRDX0lOVEZfUFJPQyBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQ0X0ZTPXkKKyMgQ09ORklHX0VYVDRfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfRlVTRV9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAogQ09ORklHX1BST0NfS0NPUkU9eQotIyBDT05GSUdfUFJPQ19QQUdFX01PTklUT1IgaXMgbm90IHNldAogQ09ORklHX1RNUEZTPXkKK0NPTkZJR19DT05GSUdGU19GUz15CiBDT05GSUdfSkZGUzJfRlM9eQotIyBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIgaXMgbm90IHNldAorQ09ORklHX1VCSUZTX0ZTPXkKICMgQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9bQorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorQ09ORklHX05MU19JU084ODU5XzE9bQorQ09ORklHX05MU19VVEY4PW0KIENPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfRlM9eQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRzdGsxMDA2X2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCmluZGV4IGRiY2MxYjUuLjFlZDhmMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQogQ09ORklHX1JFTEFZPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CkBAIC0xMSw3ICsxMCw3IEBACiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQogQ09ORklHX09QUk9GSUxFPW0KLUNPTkZJR19LUFJPQkVTPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldApAQCAtMzcsNiArMzYsNyBAQAogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX05FVF9JUElQPW0KK0NPTkZJR19ORVRfSVBHUkVfREVNVVg9bQogQ09ORklHX05FVF9JUEdSRT1tCiBDT05GSUdfSU5FVF9BSD1tCiBDT05GSUdfSU5FVF9FU1A9bQpAQCAtNjAsMTUgKzYwLDEzIEBACiBDT05GSUdfTVREX0NGST15CiBDT05GSUdfTVREX0NGSV9BTURTVEQ9eQogQ09ORklHX01URF9QSFlTTUFQPXkKLUNPTkZJR19NVERfREFUQUZMQVNIPW0KLUNPTkZJR19NVERfREFUQUZMQVNIX09UUD15Ci1DT05GSUdfTVREX00yNVA4MD1tCiBDT05GSUdfTVREX05BTkQ9eQogQ09ORklHX01URF9OQU5EX0FUTUVMPXkKIENPTkZJR19NVERfVUJJPXkKIENPTkZJR19CTEtfREVWX0xPT1A9bQogQ09ORklHX0JMS19ERVZfTkJEPW0KIENPTkZJR19CTEtfREVWX1JBTT1tCitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKIENPTkZJR19BVE1FTF9QV009bQogQ09ORklHX0FUTUVMX1RDTElCPXkKIENPTkZJR19BVE1FTF9TU0M9bQpAQCAtMTMyLDE3ICsxMzAsMTcgQEAKIENPTkZJR19VU0JfR0FER0VURlM9bQogQ09ORklHX1VTQl9GSUxFX1NUT1JBR0U9bQogQ09ORklHX1VTQl9HX1NFUklBTD1tCitDT05GSUdfVVNCX0NEQ19DT01QT1NJVEU9bQogQ09ORklHX01NQz15CitDT05GSUdfTU1DX1RFU1Q9bQogQ09ORklHX01NQ19BVE1FTE1DST15Ci1DT05GSUdfTU1DX1NQST1tCiBDT05GSUdfTkVXX0xFRFM9eQotQ09ORklHX0xFRFNfQ0xBU1M9bQorQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfQVRNRUxfUFdNPW0KIENPTkZJR19MRURTX0dQSU89bQogQ09ORklHX0xFRFNfVFJJR0dFUlM9eQogQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUj1tCiBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVD1tCi1DT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT049bQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0RSVl9BVDMyQVA3MDBYPXkKIENPTkZJR19ETUFERVZJQ0VTPXkKQEAgLTE1NiwxNSArMTU0LDE4IEBACiBDT05GSUdfRlVTRV9GUz1tCiBDT05GSUdfTVNET1NfRlM9bQogQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1RNUEZTPXkKK0NPTkZJR19DT05GSUdGU19GUz15CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX1VCSUZTX0ZTPXkKLUNPTkZJR19NSU5JWF9GUz1tCiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQogQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19DSUZTPW0KIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPW0KIENPTkZJR19OTFNfSVNPODg1OV8xPW0KIENPTkZJR19OTFNfVVRGOD1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQpAQCAtMTcyLDcgKzE3MywzIEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKIENPTkZJR19GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19GSVBTPXkKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX1QxMERJRj1tCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvZmF2ci0zMl9kZWZjb25maWcKaW5kZXggMGM4MTNiNi4uYWVhZGM5NSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2ZhdnItMzJfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9mYXZyLTMyX2RlZmNvbmZpZwpAQCAtMTEsNyArMTEsNyBAQAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT1tCi1DT05GSUdfS1BST0JFUz15CisjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZyBiL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZwppbmRleCBkY2MwMWYwLi4xNjkyYmVlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2hhbW1lcmhlYWRfZGVmY29uZmlnCkBAIC0xMiw3ICsxMiw3IEBACiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQogQ09ORklHX09QUk9GSUxFPW0KLUNPTkZJR19LUFJPQkVTPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCmluZGV4IGFiNjA4YjcuLjI0NGYyYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKQEAgLTE1LDIwICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KIAotLyoga2VybmVsL3Byb2Nlc3MuYyAqLwotYXNtbGlua2FnZSBpbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgKik7Ci1hc21saW5rYWdlIGludCBzeXNfY2xvbmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCSB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCQkJIHN0cnVjdCBwdF9yZWdzICopOwotYXNtbGlua2FnZSBpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICopOwotYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjb25zdCBjaGFyIF9fdXNlciAqLCBjaGFyIF9fdXNlciAqX191c2VyICosCi0JCQkgIGNoYXIgX191c2VyICpfX3VzZXIgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLS8qIGtlcm5lbC9zaWduYWwuYyAqLwotYXNtbGlua2FnZSBpbnQgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICosIHN0YWNrX3QgX191c2VyICosCi0JCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKik7Ci1hc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOwotCiAvKiBtbS9jYWNoZS5jICovCiBhc21saW5rYWdlIGludCBzeXNfY2FjaGVmbHVzaChpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCA5YzQ2YWFhLi5lZjVhMmEwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNjcsMTQgKzM2NywxMyBAQAogfQogCiBhc21saW5rYWdlIGludCBzeXNfY2xvbmUodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBuZXdzcCwKLQkJCSB1bnNpZ25lZCBsb25nIHBhcmVudF90aWRwdHIsCi0JCQkgdW5zaWduZWQgbG9uZyBjaGlsZF90aWRwdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCQl2b2lkIF9fdXNlciAqcGFyZW50X3RpZHB0ciwgdm9pZCBfX3VzZXIgKmNoaWxkX3RpZHB0ciwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKCFuZXdzcCkKIAkJbmV3c3AgPSByZWdzLT5zcDsKLQlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsIHJlZ3MsIDAsCi0JCSAgICAgICAoaW50IF9fdXNlciAqKXBhcmVudF90aWRwdHIsCi0JCSAgICAgICAoaW50IF9fdXNlciAqKWNoaWxkX3RpZHB0cik7CisJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLCBwYXJlbnRfdGlkcHRyLAorCQkJY2hpbGRfdGlkcHRyKTsKIH0KIAogYXNtbGlua2FnZSBpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCmluZGV4IDY2OGVkMjguLjA1YWQyOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAkucmF0aW5nCQk9IDUwLAogCS5yZWFkCQk9IHJlYWRfY3ljbGVfY291bnQsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLnNoaWZ0CQk9IDE2LAogCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKQEAgLTEyMyw5ICsxMjIsNyBAQAogCiAJLyogZmlndXJlIHJhdGUgZm9yIGNvdW50ZXIgKi8KIAljb3VudGVyX2h6ID0gY2xrX2dldF9yYXRlKGJvb3RfY3B1X2RhdGEuY2xrKTsKLQljb3VudGVyLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KGNvdW50ZXJfaHosIGNvdW50ZXIuc2hpZnQpOwotCi0JcmV0ID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNvdW50ZXIpOworCXJldCA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjb3VudGVyLCBjb3VudGVyX2h6KTsKIAlpZiAocmV0KQogCQlwcl9kZWJ1ZygidGltZXI6IGNvdWxkIG5vdCByZWdpc3RlciBjbG9ja3NvdXJjZTogJWRcbiIsIHJldCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcG0uYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcG0uYwppbmRleCBmMDIxZWRmLi4zMmQ2ODBlIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3BtLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9wbS5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBhdnIzMl9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGF2cjMyX3BtX29wcyA9IHsKIAkudmFsaWQJPSBhdnIzMl9wbV92YWxpZF9zdGF0ZSwKIAkuZW50ZXIJPSBhdnIzMl9wbV9lbnRlciwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA0NjczOGQ0Li40NmY0MmIyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTE5LDcgKzE5LDcgQEAKIGVuZGlmCiBLQlVJTERfQUZMQUdTICAgICAgICAgICArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tZmRwaWMpCiBLQlVJTERfQ0ZMQUdTX01PRFVMRSAgICArPSAtbWxvbmctY2FsbHMKLUtCVUlMRF9MREZMQUdTX01PRFVMRSAgICs9IC1tIGVsZjMyYmZpbgorTERGTEFHUyAgICAgICAgICAgICAgICAgKz0gLW0gZWxmMzJiZmluCiBLQUxMU1lNUyAgICAgICAgICs9IC0tc3ltYm9sLXByZWZpeD1fCiAKIEtCVUlMRF9ERUZDT05GSUcgOj0gQkY1MzctU1RBTVBfZGVmY29uZmlnCkBAIC05Nyw4ICs5NywxMSBAQAogcmV2LSQoQ09ORklHX0JGX1JFVl9OT05FKSA6PSBub25lCiByZXYtJChDT05GSUdfQkZfUkVWX0FOWSkgIDo9IGFueQogCi1LQlVJTERfQ0ZMQUdTICs9IC1tY3B1PSQoY3B1LXkpLSQocmV2LXkpCi1LQlVJTERfQUZMQUdTICs9IC1tY3B1PSQoY3B1LXkpLSQocmV2LXkpCitDUFVfUkVWIDo9ICQoY3B1LXkpLSQocmV2LXkpCitleHBvcnQgQ1BVX1JFVgorCitLQlVJTERfQ0ZMQUdTICs9IC1tY3B1PSQoQ1BVX1JFVikKK0tCVUlMRF9BRkxBR1MgKz0gLW1jcHU9JChDUFVfUkVWKQogCiAjIC0gd2UgdXRpbGl6ZSB0aGUgc2lsaWNvbiByZXYgZnJvbSB0aGUgdG9vbGNoYWluLCBzbyBtb3ZlIGl0IG92ZXIgdG8gdGhlIGNoZWNrZmxhZ3MKIENIRUNLRkxBR1NfU0lMSUNPTiA9ICQoc2hlbGwgZWNobyAiIiB8ICQoQ1BQKSAkKEtCVUlMRF9DRkxBR1MpIC1kRCAtIDI+L2Rldi9udWxsIHwgYXdrICckJDIgPT0gIl9fU0lMSUNPTl9SRVZJU0lPTl9fIiB7IHByaW50ICQkMyB9JykKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vYm9vdC9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vYm9vdC9NYWtlZmlsZQppbmRleCAxM2QyZGJkLi4wYTQ5Mjc5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9ib290L01ha2VmaWxlCkBAIC0xNyw3ICsxNyw3IEBACiAKIHF1aWV0X2NtZF91aW1hZ2UgPSBVSU1BR0UgICRACiAgICAgICBjbWRfdWltYWdlID0gJChDT05GSUdfU0hFTEwpICQoTUtJTUFHRSkgLUEgJChBUkNIKSAtTyBsaW51eCAtVCBrZXJuZWwgXAotICAgICAgICAgICAgICAgICAgIC1DICQoMikgLW4gJyQoTUFDSElORSktJChLRVJORUxSRUxFQVNFKScgXAorICAgICAgICAgICAgICAgICAgIC1DICQoMikgLW4gJyQoQ1BVX1JFViktJChLRVJORUxSRUxFQVNFKScgXAogICAgICAgICAgICAgICAgICAgIC1lICQoc2hlbGwgJChOTSkgdm1saW51eCB8IGF3ayAnJCRORiA9PSAiX19zdGFydCIge3ByaW50ICQkMX0nKSBcCiAgICAgICAgICAgICAgICAgICAgJChVSU1BR0VfT1BUUy15KSAtZCAkPCAkQAogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVQtU01QX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVC1TTVBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjQ1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVQtU01QX2RlZmNvbmZpZwpAQCAtMCwwICsxLDExMyBAQAorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorIyBDT05GSUdfU0lHTkFMRkQgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJGRCBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVEZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FJTyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfTU1BUF9BTExPV19VTklOSVRJQUxJWkVEPXkKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKK0NPTkZJR19CRjU2MT15CitDT05GSUdfU01QPXkKK0NPTkZJR19JUlFfVElNRVIwPTEwCitDT05GSUdfQ0xLSU5fSFo9MzAwMDAwMDAKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX05PTU1VX0lOSVRJQUxfVFJJTV9FWENFU1M9MAorQ09ORklHX0JGSU5fR1BUSU1FUlM9bQorQ09ORklHX0NfQ0RQUklPPXkKK0NPTkZJR19CQU5LXzM9MHhBQUMyCitDT05GSUdfQklORk1UX0ZMQVQ9eQorQ09ORklHX0JJTkZNVF9aRkxBVD15CitDT05GSUdfUE09eQorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19JUkRBPW0KK0NPTkZJR19JUkxBTj1tCitDT05GSUdfSVJDT01NPW0KK0NPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUD15CitDT05GSUdfSVJUVFlfU0lSPW0KKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorQ09ORklHX01URD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKK0NPTkZJR19NVERfQ0hBUj1tCitDT05GSUdfTVREX0JMT0NLPXkKK0NPTkZJR19NVERfQ0ZJPW0KK0NPTkZJR19NVERfQ0ZJX0FNRFNURD1tCitDT05GSUdfTVREX1JBTT15CitDT05GSUdfTVREX1JPTT1tCitDT05GSUdfTVREX1BIWVNNQVA9bQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVQ9bQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPW0KKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX0JGSU5fSlRBR19DT01NPW0KK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0JGSU49eQorQ09ORklHX0dQSU9MSUI9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19CRklOX1dEVD15CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz1tCitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX1NNQl9GUz1tCitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19TSElSUT15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTU1SUz15CitDT05GSUdfREVCVUdfSFdFUlI9eQorQ09ORklHX0VYQUNUX0hXRVJSPXkKK0NPTkZJR19ERUJVR19ET1VCTEVGQVVMVD15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09ORT15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19DUExCX0lORk89eQorQ09ORklHX0NSWVBUTz15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvRE5QNTM3MF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvRE5QNTM3MF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViYzdkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9ETlA1MzcwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEyMSBAQAorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfTE9DQUxWRVJTSU9OPSJETlA1MzcwIgorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TTE9CPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19CRjUzNz15CitDT05GSUdfQkZfUkVWXzBfMz15CitDT05GSUdfRE5QNTM3MD15CitDT05GSUdfSVJRX0VSUk9SPTcKKyMgQ09ORklHX0NZQ0xFU19DTE9DS1NPVVJDRSBpcyBub3Qgc2V0CitDT05GSUdfQ19DRFBSSU89eQorQ09ORklHX0NfQU1CRU5fQjBfQjFfQjI9eQorQ09ORklHX1BNPXkKKyMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX0xMQzI9eQorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19NVEQ9eQorQ09ORklHX01URF9ERUJVRz15CitDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0U9MQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKK0NPTkZJR19ORlRMPXkKK0NPTkZJR19ORlRMX1JXPXkKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CitDT05GSUdfTVREX1JPTT15CitDT05GSUdfTVREX0FCU0VOVD15CitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorQ09ORklHX01URF9QSFlTTUFQPXkKK0NPTkZJR19NVERfVUNMSU5VWD15CitDT05GSUdfTVREX1BMQVRSQU09eQorQ09ORklHX01URF9EQVRBRkxBU0g9eQorQ09ORklHX01URF9CTE9DSzJNVEQ9eQorQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9QTEFURk9STT15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0RBVklDT01fUEhZPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX0JGSU5fTUFDPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0pUQUdfQ09NTT15CitDT05GSUdfQkZJTl9KVEFHX0NPTU1fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU49eQorQ09ORklHX1NFUklBTF9CRklOX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9CRklOX1VBUlQwPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTY0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQorQ09ORklHX1NQST15CitDT05GSUdfU1BJX0JGSU49eQorQ09ORklHX1NQSV9TUElERVY9eQorQ09ORklHX0dQSU9MSUI9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorQ09ORklHX1NFTlNPUlNfTE03NT15CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKK0NPTkZJR19NTUNfU1BJPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT04NTAKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEg9eQorIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CitDT05GSUdfTkxTX0NPREVQQUdFXzg1MD15CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19TSElSUT15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfREVCVUdfT0JKRUNUUz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz15CitDT05GSUdfREVCVUdfS09CSkVDVD15CitDT05GSUdfREVCVUdfSU5GTz15CitDT05GSUdfREVCVUdfVk09eQorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKK0NPTkZJR19ERUJVR19MSVNUPXkKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19QQUdFX1BPSVNPTklORz15CisjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUPXkKK0NPTkZJR19DUExCX0lORk89eQorQ09ORklHX0NSQ19DQ0lUVD15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fZG1hLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMTIwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9kbWEuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogYmZpbl9kbWEuaCAtIEJsYWNrZmluIERNQSBkZWZpbmVzL3N0cnVjdHVyZXMvZXRjLi4uCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19BU01fQkZJTl9ETUFfSF9fCisjZGVmaW5lIF9fQVNNX0JGSU5fRE1BX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRE1BX0NPTkZJRyBNYXNrcyAqLworI2RlZmluZSBETUFFTgkJCTB4MDAwMQkvKiBETUEgQ2hhbm5lbCBFbmFibGUgKi8KKyNkZWZpbmUgV05SCQkJCTB4MDAwMgkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikgKi8KKyNkZWZpbmUgV0RTSVpFXzgJCTB4MDAwMAkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSA4ICovCisjZGVmaW5lIFdEU0laRV8xNgkJMHgwMDA0CS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDE2ICovCisjZGVmaW5lIFdEU0laRV8zMgkJMHgwMDA4CS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDMyICovCisjZGVmaW5lIERNQTJECQkJMHgwMDEwCS8qIERNQSBNb2RlICgyRC8xRCopICovCisjZGVmaW5lIFJFU1RBUlQJCQkweDAwMjAJLyogRE1BIEJ1ZmZlciBDbGVhciAqLworI2RlZmluZSBESV9TRUwJCQkweDAwNDAJLyogRGF0YSBJbnRlcnJ1cHQgVGltaW5nIFNlbGVjdCAqLworI2RlZmluZSBESV9FTgkJCTB4MDA4MAkvKiBEYXRhIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTkRTSVpFXzAJCTB4MDAwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDAgKFN0b3AvQXV0b2J1ZmZlcikgKi8KKyNkZWZpbmUgTkRTSVpFXzEJCTB4MDEwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDEgKi8KKyNkZWZpbmUgTkRTSVpFXzIJCTB4MDIwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDIgKi8KKyNkZWZpbmUgTkRTSVpFXzMJCTB4MDMwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDMgKi8KKyNkZWZpbmUgTkRTSVpFXzQJCTB4MDQwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDQgKi8KKyNkZWZpbmUgTkRTSVpFXzUJCTB4MDUwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDUgKi8KKyNkZWZpbmUgTkRTSVpFXzYJCTB4MDYwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDYgKi8KKyNkZWZpbmUgTkRTSVpFXzcJCTB4MDcwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDcgKi8KKyNkZWZpbmUgTkRTSVpFXzgJCTB4MDgwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDggKi8KKyNkZWZpbmUgTkRTSVpFXzkJCTB4MDkwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDkgKi8KKyNkZWZpbmUgTkRTSVpFCQkJMHgwZjAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplICovCisjZGVmaW5lIERNQUZMT1cJCQkweDcwMDAJLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIERNQUZMT1dfU1RPUAkweDAwMDAJLyogU3RvcCBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfQVVUTwkweDEwMDAJLyogQXV0b2J1ZmZlciBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfQVJSQVkJMHg0MDAwCS8qIERlc2NyaXB0b3IgQXJyYXkgTW9kZSAqLworI2RlZmluZSBETUFGTE9XX1NNQUxMCTB4NjAwMAkvKiBTbWFsbCBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLworI2RlZmluZSBETUFGTE9XX0xBUkdFCTB4NzAwMAkvKiBMYXJnZSBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLworCisvKiBETUFfSVJRX1NUQVRVUyBNYXNrcyAqLworI2RlZmluZSBETUFfRE9ORQkJMHgwMDAxCS8qIERNQSBDb21wbGV0aW9uIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRE1BX0VSUgkJCTB4MDAwMgkvKiBETUEgRXJyb3IgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBERkVUQ0gJCQkweDAwMDQJLyogRE1BIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yICovCisjZGVmaW5lIERNQV9SVU4JCQkweDAwMDgJLyogRE1BIENoYW5uZWwgUnVubmluZyBJbmRpY2F0b3IgKi8KKworLyoKKyAqIEFsbCBCbGFja2ZpbiBzeXN0ZW0gTU1ScyBhcmUgcGFkZGVkIHRvIDMyYml0cyBldmVuIGlmIHRoZSByZWdpc3RlcgorICogaXRzZWxmIGlzIG9ubHkgMTZiaXRzLiAgU28gdXNlIGEgaGVscGVyIG1hY3JvIHRvIHN0cmVhbWxpbmUgdGhpcy4KKyAqLworI2RlZmluZSBfX0JGUChtKSB1MTYgbTsgdTE2IF9fcGFkXyMjbQorCisvKgorICogYmZpbiBkbWEgcmVnaXN0ZXJzIGxheW91dAorICovCitzdHJ1Y3QgYmZpbl9kbWFfcmVncyB7CisJdTMyIG5leHRfZGVzY19wdHI7CisJdTMyIHN0YXJ0X2FkZHI7CisJX19CRlAoY29uZmlnKTsKKwl1MzIgX19wYWQwOworCV9fQkZQKHhfY291bnQpOworCV9fQkZQKHhfbW9kaWZ5KTsKKwlfX0JGUCh5X2NvdW50KTsKKwlfX0JGUCh5X21vZGlmeSk7CisJdTMyIGN1cnJfZGVzY19wdHI7CisJdTMyIGN1cnJfYWRkcjsKKwlfX0JGUChpcnFfc3RhdHVzKTsKKwlfX0JGUChwZXJpcGhlcmFsX21hcCk7CisJX19CRlAoY3Vycl94X2NvdW50KTsKKwl1MzIgX19wYWQxOworCV9fQkZQKGN1cnJfeV9jb3VudCk7CisJdTMyIF9fcGFkMjsKK307CisKKy8qCisgKiBiZmluIGhhbmRzaGFrZSBtZG1hIHJlZ2lzdGVycyBsYXlvdXQKKyAqLworc3RydWN0IGJmaW5faG1kbWFfcmVncyB7CisJX19CRlAoY29udHJvbCk7CisJX19CRlAoZWNpbml0KTsKKwlfX0JGUChiY2luaXQpOworCV9fQkZQKGVjdXJnZW50KTsKKwlfX0JGUChlY292ZXJmbG93KTsKKwlfX0JGUChlY291bnQpOworCV9fQkZQKGJjb3VudCk7Cit9OworCisjdW5kZWYgX19CRlAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2VyaWFsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmOWYxNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIGJmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9BU01fU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fQVNNX1NFUklBTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bWFjaC9hbm9tYWx5Lmg+CisjaW5jbHVkZSA8bWFjaC9iZmluX3NlcmlhbC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDJfQ1RTUlRTKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUM19DVFNSVFMpCisjIGlmZGVmIEJGSU5fVUFSVF9CRjU0WF9TVFlMRQorIyAgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUworIyBlbHNlCisjICBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworIyBlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBjaXJjX2J1ZjsKK3N0cnVjdCB0aW1lcl9saXN0Oworc3RydWN0IHdvcmtfc3RydWN0OworCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCXVuc2lnbmVkIGludCBvbGRfc3RhdHVzOworCWludCBzdGF0dXNfaXJxOworI2lmbmRlZiBCRklOX1VBUlRfQkY1NFhfU1RZTEUKKwl1bnNpZ25lZCBpbnQgbHNyOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCWludCB0eF9kb25lOworCWludCB0eF9jb3VudDsKKwlzdHJ1Y3QgY2lyY19idWYgcnhfZG1hX2J1ZjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9kbWFfdGltZXI7CisJaW50IHJ4X2RtYV9ucm93czsKKwl1bnNpZ25lZCBpbnQgdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IHJ4X2RtYV9jaGFubmVsOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9kbWFfd29ya3F1ZXVlOworI2VsaWYgQU5PTUFMWV8wNTAwMDM2MworCXVuc2lnbmVkIGludCBhbm9tYWx5X3RocmVzaG9sZDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUworCWludCBzY3RzOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fSEFSRF9DVFNSVFMpCisJaW50IGN0c19waW47CisJaW50IHJ0c19waW47CisjZW5kaWYKK307CisKKy8qIFVBUlRfTENSIE1hc2tzICovCisjZGVmaW5lIFdMUyh4KSAgICAgICAgICAgICAgICAgICAoKCh4KS01KSAmIDB4MDMpICAvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KKyNkZWZpbmUgU1RCICAgICAgICAgICAgICAgICAgICAgIDB4MDQgIC8qIFN0b3AgQml0cyAqLworI2RlZmluZSBQRU4gICAgICAgICAgICAgICAgICAgICAgMHgwOCAgLyogUGFyaXR5IEVuYWJsZSAqLworI2RlZmluZSBFUFMgICAgICAgICAgICAgICAgICAgICAgMHgxMCAgLyogRXZlbiBQYXJpdHkgU2VsZWN0ICovCisjZGVmaW5lIFNUUCAgICAgICAgICAgICAgICAgICAgICAweDIwICAvKiBTdGljayBQYXJpdHkgKi8KKyNkZWZpbmUgU0IgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgIC8qIFNldCBCcmVhayAqLworI2RlZmluZSBETEFCICAgICAgICAgICAgICAgICAgICAgMHg4MCAgLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MgKi8KKworLyogVUFSVF9MU1IgTWFza3MgKi8KKyNkZWZpbmUgRFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgIC8qIERhdGEgUmVhZHkgKi8KKyNkZWZpbmUgT0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgIC8qIE92ZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgUEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgIC8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBGRSAgICAgICAgICAgICAgICAgICAgICAgMHgwOCAgLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBCSSAgICAgICAgICAgICAgICAgICAgICAgMHgxMCAgLyogQnJlYWsgSW50ZXJydXB0ICovCisjZGVmaW5lIFRIUkUgICAgICAgICAgICAgICAgICAgICAweDIwICAvKiBUSFIgRW1wdHkgKi8KKyNkZWZpbmUgVEVNVCAgICAgICAgICAgICAgICAgICAgIDB4NDAgIC8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkgKi8KKyNkZWZpbmUgVEZJICAgICAgICAgICAgICAgICAgICAgIDB4ODAgIC8qIFRyYW5zbWlzc2lvbiBGaW5pc2hlZCBJbmRpY2F0b3IgKi8KKworLyogVUFSVF9JRVIgTWFza3MgKi8KKyNkZWZpbmUgRVJCRkkgICAgICAgICAgICAgICAgICAgIDB4MDEgIC8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdCAqLworI2RlZmluZSBFVEJFSSAgICAgICAgICAgICAgICAgICAgMHgwMiAgLyogRW5hYmxlIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRUxTSSAgICAgICAgICAgICAgICAgICAgIDB4MDQgIC8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0ICovCisjZGVmaW5lIEVEU1NJICAgICAgICAgICAgICAgICAgICAweDA4ICAvKiBFbmFibGUgTW9kZW0gU3RhdHVzIEludGVycnVwdCAqLworI2RlZmluZSBFRFRQVEkgICAgICAgICAgICAgICAgICAgMHgxMCAgLyogRW5hYmxlIERNQSBUcmFuc21pdCBQSVJRIEludGVycnVwdCAqLworI2RlZmluZSBFVEZJICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLyogRW5hYmxlIFRyYW5zbWlzc2lvbiBGaW5pc2hlZCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRVJGQ0kgICAgICAgICAgICAgICAgICAgIDB4NDAgIC8qIEVuYWJsZSBSZWNlaXZlIEZJRk8gQ291bnQgSW50ZXJydXB0ICovCisKKy8qIFVBUlRfTUNSIE1hc2tzICovCisjZGVmaW5lIFhPRkYgICAgICAgICAgICAgICAgICAgICAweDAxICAvKiBUcmFuc21pdHRlciBPZmYgKi8KKyNkZWZpbmUgTVJUUyAgICAgICAgICAgICAgICAgICAgIDB4MDIgIC8qIE1hbnVhbCBSZXF1ZXN0IFRvIFNlbmQgKi8KKyNkZWZpbmUgUkZJVCAgICAgICAgICAgICAgICAgICAgIDB4MDQgIC8qIFJlY2VpdmUgRklGTyBJUlEgVGhyZXNob2xkICovCisjZGVmaW5lIFJGUlQgICAgICAgICAgICAgICAgICAgICAweDA4ICAvKiBSZWNlaXZlIEZJRk8gUlRTIFRocmVzaG9sZCAqLworI2RlZmluZSBMT09QX0VOQSAgICAgICAgICAgICAgICAgMHgxMCAgLyogTG9vcGJhY2sgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgRkNQT0wgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIEZsb3cgQ29udHJvbCBQaW4gUG9sYXJpdHkgKi8KKyNkZWZpbmUgQVJUUyAgICAgICAgICAgICAgICAgICAgIDB4NDAgIC8qIEF1dG9tYXRpYyBSZXF1ZXN0IFRvIFNlbmQgKi8KKyNkZWZpbmUgQUNUUyAgICAgICAgICAgICAgICAgICAgIDB4ODAgIC8qIEF1dG9tYXRpYyBDbGVhciBUbyBTZW5kICovCisKKy8qIFVBUlRfTVNSIE1hc2tzICovCisjZGVmaW5lIFNDVFMgICAgICAgICAgICAgICAgICAgICAweDAxICAvKiBTdGlja3kgQ1RTICovCisjZGVmaW5lIENUUyAgICAgICAgICAgICAgICAgICAgICAweDEwICAvKiBDbGVhciBUbyBTZW5kICovCisjZGVmaW5lIFJGQ1MgICAgICAgICAgICAgICAgICAgICAweDIwICAvKiBSZWNlaXZlIEZJRk8gQ291bnQgU3RhdHVzICovCisKKy8qIFVBUlRfR0NUTCBNYXNrcyAqLworI2RlZmluZSBVQ0VOICAgICAgICAgICAgICAgICAgICAgMHgwMSAgLyogRW5hYmxlIFVBUlR4IENsb2NrcyAqLworI2RlZmluZSBJUkVOICAgICAgICAgICAgICAgICAgICAgMHgwMiAgLyogRW5hYmxlIElyREEgTW9kZSAqLworI2RlZmluZSBUUE9MQyAgICAgICAgICAgICAgICAgICAgMHgwNCAgLyogSXJEQSBUWCBQb2xhcml0eSBDaGFuZ2UgKi8KKyNkZWZpbmUgUlBPTEMgICAgICAgICAgICAgICAgICAgIDB4MDggIC8qIElyREEgUlggUG9sYXJpdHkgQ2hhbmdlICovCisjZGVmaW5lIEZQRSAgICAgICAgICAgICAgICAgICAgICAweDEwICAvKiBGb3JjZSBQYXJpdHkgRXJyb3IgT24gVHJhbnNtaXQgKi8KKyNkZWZpbmUgRkZFICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQgKi8KKworI2lmZGVmIEJGSU5fVUFSVF9CRjU0WF9TVFlMRQorIyBkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMCAgLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNCAgLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgwOCAgLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQyAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMCAgLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNCAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOCAgLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQyAgLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0lFUl9TRVQgICAgICAgICAgMHgyMCAgLyogU2V0IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAqLworIyBkZWZpbmUgT0ZGU0VUX0lFUl9DTEVBUiAgICAgICAgMHgyNCAgLyogQ2xlYXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworIyBkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgyOCAgLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgyQyAgLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAqLworI2Vsc2UgLyogQkY1MzMgc3R5bGUgKi8KKyMgZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAgIC8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMCAgLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwICAvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQgIC8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNCAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4ICAvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyMgZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMCAgLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0ICAvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTggIC8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQyAgLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0ICAvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgKi8KKy8qIGNvZGUgc2hvdWxkIG5vdCBuZWVkIElJUiwgc28gZm9yY2UgYnVpbGQgZXJyb3IgaWYgdGhleSB1c2UgaXQgKi8KKyMgdW5kZWYgT0ZGU0VUX0lJUgorI2VuZGlmCisKKy8qCisgKiBBbGwgQmxhY2tmaW4gc3lzdGVtIE1NUnMgYXJlIHBhZGRlZCB0byAzMmJpdHMgZXZlbiBpZiB0aGUgcmVnaXN0ZXIKKyAqIGl0c2VsZiBpcyBvbmx5IDE2Yml0cy4gIFNvIHVzZSBhIGhlbHBlciBtYWNybyB0byBzdHJlYW1saW5lIHRoaXMuCisgKi8KKyNkZWZpbmUgX19CRlAobSkgdTE2IG07IHUxNiBfX3BhZF8jI20KK3N0cnVjdCBiZmluX3VhcnRfcmVncyB7CisjaWZkZWYgQkZJTl9VQVJUX0JGNTRYX1NUWUxFCisJX19CRlAoZGxsKTsKKwlfX0JGUChkbGgpOworCV9fQkZQKGdjdGwpOworCV9fQkZQKGxjcik7CisJX19CRlAobWNyKTsKKwlfX0JGUChsc3IpOworCV9fQkZQKG1zcik7CisJX19CRlAoc2NyKTsKKwlfX0JGUChpZXJfc2V0KTsKKwlfX0JGUChpZXJfY2xlYXIpOworCV9fQkZQKHRocik7CisJX19CRlAocmJyKTsKKyNlbHNlCisJdW5pb24geworCQl1MTYgZGxsOworCQl1MTYgdGhyOworCQljb25zdCB1MTYgcmJyOworCX07CisJY29uc3QgdTE2IF9fcGFkMDsKKwl1bmlvbiB7CisJCXUxNiBkbGg7CisJCXUxNiBpZXI7CisJfTsKKwljb25zdCB1MTYgX19wYWQxOworCWNvbnN0IF9fQkZQKGlpcik7CisJX19CRlAobGNyKTsKKwlfX0JGUChtY3IpOworCV9fQkZQKGxzcik7CisJX19CRlAobXNyKTsKKwlfX0JGUChzY3IpOworCWNvbnN0IHUzMiBfX3BhZDI7CisJX19CRlAoZ2N0bCk7CisjZW5kaWYKK307CisjdW5kZWYgX19CRlAKKworI2lmbmRlZiBwb3J0X21lbWJhc2UKKyMgZGVmaW5lIHBvcnRfbWVtYmFzZShwKSAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKShwKSktPnBvcnQubWVtYmFzZSkKKyNlbmRpZgorCisjZGVmaW5lIFVBUlRfR0VUX0NIQVIocCkgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfUkJSKQorI2RlZmluZSBVQVJUX0dFVF9ETEwocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0RMTCkKKyNkZWZpbmUgVUFSVF9HRVRfRExIKHApICAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9ETEgpCisjZGVmaW5lIFVBUlRfR0VUX0dDVEwocCkgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfR0NUTCkKKyNkZWZpbmUgVUFSVF9HRVRfTENSKHApICAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MQ1IpCisjZGVmaW5lIFVBUlRfR0VUX01DUihwKSAgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTUNSKQorI2RlZmluZSBVQVJUX0dFVF9NU1IocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX01TUikKKworI2RlZmluZSBVQVJUX1BVVF9DSEFSKHAsIHYpICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9USFIsIHYpCisjZGVmaW5lIFVBUlRfUFVUX0RMTChwLCB2KSAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0RMTCwgdikKKyNkZWZpbmUgVUFSVF9QVVRfRExIKHAsIHYpICAgIGJmaW5fd3JpdGUxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfRExILCB2KQorI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHAsIHYpICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9HQ1RMLCB2KQorI2RlZmluZSBVQVJUX1BVVF9MQ1IocCwgdikgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MQ1IsIHYpCisjZGVmaW5lIFVBUlRfUFVUX01DUihwLCB2KSAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX01DUiwgdikKKworI2lmZGVmIEJGSU5fVUFSVF9CRjU0WF9TVFlMRQorCisjZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHAsIHYpICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0lFUl9DTEVBUiwgdikKKyNkZWZpbmUgVUFSVF9HRVRfSUVSKHApICAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9JRVJfU0VUKQorI2RlZmluZSBVQVJUX1NFVF9JRVIocCwgdikgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9JRVJfU0VULCB2KQorCisjZGVmaW5lIFVBUlRfQ0xFQVJfRExBQihwKSAgICAvKiBNTVJzIG5vdCBtdXhlZCBvbiBCRjU0eCAqLworI2RlZmluZSBVQVJUX1NFVF9ETEFCKHApICAgICAgLyogTU1ScyBub3QgbXV4ZWQgb24gQkY1NHggKi8KKworI2RlZmluZSBVQVJUX0NMRUFSX0xTUihwKSAgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MU1IsIC0xKQorI2RlZmluZSBVQVJUX0dFVF9MU1IocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0xTUikKKyNkZWZpbmUgVUFSVF9QVVRfTFNSKHAsIHYpICAgIGJmaW5fd3JpdGUxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTFNSLCB2KQorCisvKiBUaGlzIGhhbmRsZXMgaGFyZCBDVFMvUlRTICovCisjZGVmaW5lIEJGSU5fVUFSVF9DVFNSVFNfSEFSRAorI2RlZmluZSBVQVJUX0NMRUFSX1NDVFMocCkgICAgICBiZmluX3dyaXRlMTYoKHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9NU1IpLCBTQ1RTKQorI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgICAgICAgICAoVUFSVF9HRVRfTVNSKHgpICYgQ1RTKQorI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpICAgICBVQVJUX1BVVF9NQ1IoeCwgVUFSVF9HRVRfTUNSKHgpICYgfihBUlRTIHwgTVJUUykpCisjZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSAgICAgIFVBUlRfUFVUX01DUih4LCBVQVJUX0dFVF9NQ1IoeCkgfCBNUlRTIHwgQVJUUykKKyNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSAgVUFSVF9TRVRfSUVSKHgsIHYpCisjZGVmaW5lIFVBUlRfRElTQUJMRV9JTlRTKHgpICAgIFVBUlRfQ0xFQVJfSUVSKHgsIDB4RikKKworI2Vsc2UgLyogQkY1MzMgc3R5bGUgKi8KKworI2RlZmluZSBVQVJUX0NMRUFSX0lFUihwLCB2KSAgVUFSVF9QVVRfSUVSKHAsIFVBUlRfR0VUX0lFUihwKSAmIH4odikpCisjZGVmaW5lIFVBUlRfR0VUX0lFUihwKSAgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfSUVSKQorI2RlZmluZSBVQVJUX1BVVF9JRVIocCwgdikgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9JRVIsIHYpCisjZGVmaW5lIFVBUlRfU0VUX0lFUihwLCB2KSAgICBVQVJUX1BVVF9JRVIocCwgVUFSVF9HRVRfSUVSKHApIHwgKHYpKQorCisjZGVmaW5lIFVBUlRfQ0xFQVJfRExBQihwKSAgICBkbyB7IFVBUlRfUFVUX0xDUihwLCBVQVJUX0dFVF9MQ1IocCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFVBUlRfU0VUX0RMQUIocCkgICAgICBkbyB7IFVBUlRfUFVUX0xDUihwLCBVQVJUX0dFVF9MQ1IocCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKKworI2lmbmRlZiBwdXRfbHNyX2NhY2hlCisjIGRlZmluZSBwdXRfbHNyX2NhY2hlKHAsIHYpICgoKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICopKHApKS0+bHNyID0gKHYpKQorI2VuZGlmCisjaWZuZGVmIGdldF9sc3JfY2FjaGUKKyMgZGVmaW5lIGdldF9sc3JfY2FjaGUocCkgICAgKCgoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKikocCkpLT5sc3IpCisjZW5kaWYKKworLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCisgKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKKyAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUih2b2lkICpwKQoreworCXB1dF9sc3JfY2FjaGUocCwgMCk7CisJYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MU1IsIC0xKTsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUih2b2lkICpwKQoreworCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTFNSKTsKKwlwdXRfbHNyX2NhY2hlKHAsIGdldF9sc3JfY2FjaGUocCkgfCAobHNyICYgKEJJfEZFfFBFfE9FKSkpOworCXJldHVybiBsc3IgfCBnZXRfbHNyX2NhY2hlKHApOworfQorc3RhdGljIGlubGluZSB2b2lkIFVBUlRfUFVUX0xTUih2b2lkICpwLCB1aW50MTZfdCB2YWwpCit7CisJcHV0X2xzcl9jYWNoZShwLCBnZXRfbHNyX2NhY2hlKHApICYgfnZhbCk7Cit9CisKKy8qIFRoaXMgaGFuZGxlcyBzb2Z0IENUUy9SVFMgKi8KKyNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpICAgICAgICBncGlvX2dldF92YWx1ZSgoeCktPmN0c19waW4pCisjZGVmaW5lIFVBUlRfRElTQUJMRV9SVFMoeCkgICAgZ3Bpb19zZXRfdmFsdWUoKHgpLT5ydHNfcGluLCAxKQorI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgICAgIGdwaW9fc2V0X3ZhbHVlKCh4KS0+cnRzX3BpbiwgMCkKKyNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKKyNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgICBVQVJUX1BVVF9JRVIoeCwgMCkKKworI2VuZGlmCisKKyNpZm5kZWYgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQorIyBkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRSAyCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQkZJTl9BU01fU0VSSUFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggM2Y3ZWY0ZC4uMjlmNGZkOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC0xMDgsNyArMTA4LDkgQEAKICNkZWZpbmUgc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJYmFycmllcigpCiAKKyNkZWZpbmUgdGVzdF9iaXQgX19za2lwX3Rlc3RfYml0CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL25vbi1hdG9taWMuaD4KKyN1bmRlZiB0ZXN0X2JpdAogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKaW5kZXggYmQwNjQxYS4uNTY4ODg1YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaApAQCAtNyw2ICs3LDggQEAKICNpZm5kZWYgX19BUkNIX0JMQUNLRklOX0NBQ0hFX0gKICNkZWZpbmUgX19BUkNIX0JMQUNLRklOX0NBQ0hFX0gKIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4JLyogZm9yIGFzbWxpbmthZ2UgKi8KKwogLyoKICAqIEJ5dGVzIHBlciBMMSBjYWNoZSBsaW5lCiAgKiBCbGFja2ZpbiBsb2FkcyAzMiBieXRlcyBmb3IgY2FjaGUKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggMjY2NmZmOC4uNzcxMzViNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTExLDYgKzExLDkgQEAKIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgkvKiBmb3IgU1NZTkMoKSAqLwogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgkvKiBmb3IgX3JhbWVuZCAqLworI2lmZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20vc21wLmg+CisjZW5kaWYKIAogZXh0ZXJuIHZvaWQgYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmRfYWRkcmVzcyk7CiBleHRlcm4gdm9pZCBibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCmluZGV4IGVlZGYzY2E2Li5kOWRiYzFhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKQEAgLTE0LDQwICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEuaD4KLQotLyogRE1BX0NPTkZJRyBNYXNrcyAqLwotI2RlZmluZSBETUFFTgkJCTB4MDAwMQkvKiBETUEgQ2hhbm5lbCBFbmFibGUgKi8KLSNkZWZpbmUgV05SCQkJCTB4MDAwMgkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikgKi8KLSNkZWZpbmUgV0RTSVpFXzgJCTB4MDAwMAkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSA4ICovCi0jZGVmaW5lIFdEU0laRV8xNgkJMHgwMDA0CS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDE2ICovCi0jZGVmaW5lIFdEU0laRV8zMgkJMHgwMDA4CS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDMyICovCi0jZGVmaW5lIERNQTJECQkJMHgwMDEwCS8qIERNQSBNb2RlICgyRC8xRCopICovCi0jZGVmaW5lIFJFU1RBUlQJCQkweDAwMjAJLyogRE1BIEJ1ZmZlciBDbGVhciAqLwotI2RlZmluZSBESV9TRUwJCQkweDAwNDAJLyogRGF0YSBJbnRlcnJ1cHQgVGltaW5nIFNlbGVjdCAqLwotI2RlZmluZSBESV9FTgkJCTB4MDA4MAkvKiBEYXRhIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgTkRTSVpFXzAJCTB4MDAwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDAgKFN0b3AvQXV0b2J1ZmZlcikgKi8KLSNkZWZpbmUgTkRTSVpFXzEJCTB4MDEwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDEgKi8KLSNkZWZpbmUgTkRTSVpFXzIJCTB4MDIwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDIgKi8KLSNkZWZpbmUgTkRTSVpFXzMJCTB4MDMwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDMgKi8KLSNkZWZpbmUgTkRTSVpFXzQJCTB4MDQwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDQgKi8KLSNkZWZpbmUgTkRTSVpFXzUJCTB4MDUwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDUgKi8KLSNkZWZpbmUgTkRTSVpFXzYJCTB4MDYwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDYgKi8KLSNkZWZpbmUgTkRTSVpFXzcJCTB4MDcwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDcgKi8KLSNkZWZpbmUgTkRTSVpFXzgJCTB4MDgwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDggKi8KLSNkZWZpbmUgTkRTSVpFXzkJCTB4MDkwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDkgKi8KLSNkZWZpbmUgTkRTSVpFCQkJMHgwZjAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplICovCi0jZGVmaW5lIERNQUZMT1cJCQkweDcwMDAJLyogRmxvdyBDb250cm9sICovCi0jZGVmaW5lIERNQUZMT1dfU1RPUAkweDAwMDAJLyogU3RvcCBNb2RlICovCi0jZGVmaW5lIERNQUZMT1dfQVVUTwkweDEwMDAJLyogQXV0b2J1ZmZlciBNb2RlICovCi0jZGVmaW5lIERNQUZMT1dfQVJSQVkJMHg0MDAwCS8qIERlc2NyaXB0b3IgQXJyYXkgTW9kZSAqLwotI2RlZmluZSBETUFGTE9XX1NNQUxMCTB4NjAwMAkvKiBTbWFsbCBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLwotI2RlZmluZSBETUFGTE9XX0xBUkdFCTB4NzAwMAkvKiBMYXJnZSBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLwotCi0vKiBETUFfSVJRX1NUQVRVUyBNYXNrcyAqLwotI2RlZmluZSBETUFfRE9ORQkJMHgwMDAxCS8qIERNQSBDb21wbGV0aW9uIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgRE1BX0VSUgkJCTB4MDAwMgkvKiBETUEgRXJyb3IgSW50ZXJydXB0IFN0YXR1cyAqLwotI2RlZmluZSBERkVUQ0gJCQkweDAwMDQJLyogRE1BIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yICovCi0jZGVmaW5lIERNQV9SVU4JCQkweDAwMDgJLyogRE1BIENoYW5uZWwgUnVubmluZyBJbmRpY2F0b3IgKi8KKyNpbmNsdWRlIDxhc20vYmZpbl9kbWEuaD4KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBjb25maWcgcmVnIGJpdHMgdmFsdWUKQEAgLTE0OSw3ICsxMTYsNyBAQAogKglETUEgQVBJJ3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKLWV4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdOworZXh0ZXJuIHN0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdOwogZXh0ZXJuIGludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX3N0YXJ0X2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kcG1jLmgKaW5kZXggZWZjYzNhZS4uMzA0NzEyMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kcG1jLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kcG1jLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9CTEFDS0ZJTl9EUE1DX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9EUE1DX0hfCiAKKyNpbmNsdWRlIDxtYWNoL3BsbC5oPgorCiAvKiBQTExfQ1RMIE1hc2tzICovCiAjZGVmaW5lIERGCQkJMHgwMDAxCS8qIDA6IFBMTCA9IENMS0lOLCAxOiBQTEwgPSBDTEtJTi8yICovCiAjZGVmaW5lIFBMTF9PRkYJCQkweDAwMDIJLyogUExMIE5vdCBQb3dlcmVkICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggMjM0ZmJhYy4uZGNjYWUyNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA0LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNDggKzcsNDggQEAKICNpZm5kZWYgX0JGSU5fSU9fSAogI2RlZmluZSBfQkZJTl9JT19ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLS8qCi0gKiBUaGVzZSBhcmUgZm9yIElTQS9QQ0kgc2hhcmVkIG1lbW9yeSBfb25seV8gYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkCi0gKiBvbiBhbnkgb3RoZXIgdHlwZSBvZiBtZW1vcnksIGluY2x1ZGluZyBab3JybyBtZW1vcnkuIFRoZXkgYXJlIG1lYW50IHRvCi0gKiBhY2Nlc3MgdGhlIGJ1cyBpbiB0aGUgYnVzIGJ5dGUgb3JkZXIgd2hpY2ggaXMgbGl0dGxlLWVuZGlhbiEuCi0gKgotICogcmVhZFgvd3JpdGVYKCkgYXJlIHVzZWQgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgZGV2aWNlcy4gT24gc29tZQotICogYXJjaGl0ZWN0dXJlcyB0aGUgbWVtb3J5IG1hcHBlZCBJTyBzdHVmZiBuZWVkcyB0byBiZSBhY2Nlc3NlZAotICogZGlmZmVyZW50bHkuIE9uIHRoZSBiZmluIGFyY2hpdGVjdHVyZSwgd2UganVzdCByZWFkL3dyaXRlIHRoZQotICogbWVtb3J5IGxvY2F0aW9uIGRpcmVjdGx5LgotICovCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JaW50IHRtcDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJImNsaSAlMTsiCi0JCSJOT1A7IE5PUDsgU1NZTkM7IgotCQkiJTAgPSBiIFslMl0gKHopOyIKLQkJInN0aSAlMTsiCi0JCTogIj1kIih2YWwpLCAiPWQiKHRtcCkKLQkJOiAiYSIoYWRkcikKLQkpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBjaGFyKSB2YWw7CisjZGVmaW5lIERFQ0xBUkVfQkZJTl9SQVdfUkVBRFgoc2l6ZSwgdHlwZSwgYXNtLCBhc21fc2lnbikgXAorc3RhdGljIGlubGluZSB0eXBlIF9fcmF3X3JlYWQjI3NpemUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSBcCit7IFwKKwl1bnNpZ25lZCBpbnQgdmFsOyBcCisJaW50IHRtcDsgXAorCV9fYXNtX18gX192b2xhdGlsZV9fICggXAorCQkiY2xpICUxOyIgXAorCQkiTk9QOyBOT1A7IFNTWU5DOyIgXAorCQkiJTAgPSAiI2FzbSIgWyUyXSAiI2FzbV9zaWduIjsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPWQiKHZhbCksICI9ZCIodG1wKSBcCisJCTogImEiKGFkZHIpIFwKKwkpOyBcCisJcmV0dXJuICh0eXBlKSB2YWw7IFwKIH0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiY2xpICUxOyIKLQkJIk5PUDsgTk9QOyBTU1lOQzsiCi0JCSIlMCA9IHcgWyUyXSAoeik7IgotCQkic3RpICUxOyIKLQkJOiAiPWQiKHZhbCksICI9ZCIodG1wKQotCQk6ICJhIihhZGRyKQotCSk7Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWludCB0bXA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJjbGkgJTE7IgotCQkiTk9QOyBOT1A7IFNTWU5DOyIKLQkJIiUwID0gWyUyXTsiCi0JCSJzdGkgJTE7IgotCQk6ICI9ZCIodmFsKSwgIj1kIih0bXApCi0JCTogImEiKGFkZHIpCi0JKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLSNlbmRpZiAvKiAgX19BU1NFTUJMWV9fICovCi0KLSNkZWZpbmUgd3JpdGViKGIsIGFkZHIpICh2b2lkKSgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChhZGRyKSkgPSAoYikpCi0jZGVmaW5lIHdyaXRldyhiLCBhZGRyKSAodm9pZCkoKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKGFkZHIpKSA9IChiKSkKLSNkZWZpbmUgd3JpdGVsKGIsIGFkZHIpICh2b2lkKSgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKSA9IChiKSkKLQotI2RlZmluZSBfX3Jhd19yZWFkYiByZWFkYgotI2RlZmluZSBfX3Jhd19yZWFkdyByZWFkdwotI2RlZmluZSBfX3Jhd19yZWFkbCByZWFkbAotI2RlZmluZSBfX3Jhd193cml0ZWIgd3JpdGViCi0jZGVmaW5lIF9fcmF3X3dyaXRldyB3cml0ZXcKLSNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAotI2RlZmluZSBtZW1zZXRfaW8oYSwgYiwgYykJbWVtc2V0KCh2b2lkICopKGEpLCAoYiksIChjKSkKLSNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLCBiLCBjKQltZW1jcHkoKGEpLCAodm9pZCAqKShiKSwgKGMpKQotI2RlZmluZSBtZW1jcHlfdG9pbyhhLCBiLCBjKQltZW1jcHkoKHZvaWQgKikoYSksIChiKSwgKGMpKQotCi0vKiBDb252ZXJ0ICJJL08gcG9ydCBhZGRyZXNzZXMiIHRvIGFjdHVhbCBhZGRyZXNzZXMuICBpLmUuIHVnbHkgY2FzdHMuICovCi0jZGVmaW5lIF9faW8ocG9ydCkgKCh2b2lkICopKHVuc2lnbmVkIGxvbmcpKHBvcnQpKQotCi0jZGVmaW5lIGluYihwb3J0KSAgICByZWFkYihfX2lvKHBvcnQpKQotI2RlZmluZSBpbncocG9ydCkgICAgcmVhZHcoX19pbyhwb3J0KSkKLSNkZWZpbmUgaW5sKHBvcnQpICAgIHJlYWRsKF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dGIoeCwgcG9ydCkgd3JpdGViKHgsIF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dHcoeCwgcG9ydCkgd3JpdGV3KHgsIF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dGwoeCwgcG9ydCkgd3JpdGVsKHgsIF9faW8ocG9ydCkpCi0KLSNkZWZpbmUgaW5iX3AocG9ydCkgICAgaW5iKF9faW8ocG9ydCkpCi0jZGVmaW5lIGlud19wKHBvcnQpICAgIGludyhfX2lvKHBvcnQpKQotI2RlZmluZSBpbmxfcChwb3J0KSAgICBpbmwoX19pbyhwb3J0KSkKLSNkZWZpbmUgb3V0Yl9wKHgsIHBvcnQpIG91dGIoeCwgX19pbyhwb3J0KSkKLSNkZWZpbmUgb3V0d19wKHgsIHBvcnQpIG91dHcoeCwgX19pbyhwb3J0KSkKLSNkZWZpbmUgb3V0bF9wKHgsIHBvcnQpIG91dGwoeCwgX19pbyhwb3J0KSkKLQotI2RlZmluZSBpb3JlYWQ4X3JlcChhLCBkLCBjKQlyZWFkc2IoYSwgZCwgYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsIGQsIGMpCXJlYWRzdyhhLCBkLCBjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAoYSwgZCwgYykJcmVhZHNsKGEsIGQsIGMpCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChhLCBzLCBjKQl3cml0ZXNiKGEsIHMsIGMpCi0jZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSwgcywgYykJd3JpdGVzdyhhLCBzLCBjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKGEsIHMsIGMpCXdyaXRlc2woYSwgcywgYykKLQotI2RlZmluZSBpb3JlYWQ4KHgpCQkJcmVhZGIoeCkKLSNkZWZpbmUgaW9yZWFkMTYoeCkJCQlyZWFkdyh4KQotI2RlZmluZSBpb3JlYWQzMih4KQkJCXJlYWRsKHgpCi0jZGVmaW5lIGlvd3JpdGU4KHZhbCwgeCkJCXdyaXRlYih2YWwsIHgpCi0jZGVmaW5lIGlvd3JpdGUxNih2YWwsIHgpCQl3cml0ZXcodmFsLCB4KQotI2RlZmluZSBpb3dyaXRlMzIodmFsLCB4KQkJd3JpdGVsKHZhbCwgeCkKLQotLyoqCi0gKiBJL08gd3JpdGUgYmFycmllcgotICoKLSAqIEVuc3VyZSBvcmRlcmluZyBvZiBJL08gc3BhY2Ugd3JpdGVzLiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgd3JpdGVzCi0gKiBmb2xsb3dpbmcgdGhlIGJhcnJpZXIgd2lsbCBhcnJpdmUgYWZ0ZXIgYWxsIHByZXZpb3VzIHdyaXRlcy4KLSAqLwotI2RlZmluZSBtbWlvd2IoKSBkbyB7IFNTWU5DKCk7IHdtYigpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKLQotLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KLSNkZWZpbmUgSU9NQVBfTk9DQUNIRV9TRVIJCTEKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KK0RFQ0xBUkVfQkZJTl9SQVdfUkVBRFgoYiwgdTgsIGIsICh6KSkKKyNkZWZpbmUgX19yYXdfcmVhZGIgX19yYXdfcmVhZGIKK0RFQ0xBUkVfQkZJTl9SQVdfUkVBRFgodywgdTE2LCB3LCAoeikpCisjZGVmaW5lIF9fcmF3X3JlYWR3IF9fcmF3X3JlYWR3CitERUNMQVJFX0JGSU5fUkFXX1JFQURYKGwsIHUzMiwgLCApCisjZGVmaW5lIF9fcmF3X3JlYWRsIF9fcmF3X3JlYWRsCiAKIGV4dGVybiB2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gdm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgb3V0c3dfOCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKKyNkZWZpbmUgb3V0c2Igb3V0c2IKKyNkZWZpbmUgb3V0c3cgb3V0c3cKKyNkZWZpbmUgb3V0c2wgb3V0c2wKIAogZXh0ZXJuIHZvaWQgaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgaW5zd184KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gdm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gdm9pZCBpbnNsXzE2KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisjZGVmaW5lIGluc2IgaW5zYgorI2RlZmluZSBpbnN3IGluc3cKKyNkZWZpbmUgaW5zbCBpbnNsCiAKIGV4dGVybiB2b2lkIGRtYV9vdXRzYih1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKIGV4dGVybiB2b2lkIGRtYV9vdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKQEAgLTE1OCwxMDggKzU4LDE0IEBACiBleHRlcm4gdm9pZCBkbWFfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKIGV4dGVybiB2b2lkIGRtYV9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgY291bnQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCWluc2woKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCWluc3coKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCWluc2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlvdXRzbCgodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCW91dHN3KCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlc2IoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCi17Ci0Jb3V0c2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOwotfQotCi0vKgotICogTWFwIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBpbnRvIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KKy8qKgorICogSS9PIHdyaXRlIGJhcnJpZXIKKyAqCisgKiBFbnN1cmUgb3JkZXJpbmcgb2YgSS9PIHNwYWNlIHdyaXRlcy4gVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHdyaXRlcworICogZm9sbG93aW5nIHRoZSBiYXJyaWVyIHdpbGwgYXJyaXZlIGFmdGVyIGFsbCBwcmV2aW91cyB3cml0ZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCWludCBjYWNoZWZsYWcpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzYWRkcjsKLX0KKyNkZWZpbmUgbW1pb3diKCkgZG8geyBTU1lOQygpOyB3bWIoKTsgfSB3aGlsZSAoMCkKIAotLyoKLSAqIFVubWFwIGEgaW9yZW1hcCgpZWQgcmVnaW9uIGFnYWluCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpb3VubWFwKHZvaWQgKmFkZHIpCi17Ci19Ci0KLS8qCi0gKiBfX2lvdW5tYXAgdW5tYXBzIG5lYXJseSBldmVyeXRoaW5nLCBzbyBiZSBjYXJlZnVsCi0gKiBpdCBkb2Vzbid0IGZyZWUgY3VycmVudGx5IHBvaW50ZXIvcGFnZSB0YWJsZXMgYW55bW9yZSBidXQgaXQKLSAqIHdhbnMndCB1c2VkIGFueXdheSBhbmQgbWlnaHQgYmUgYWRkZWQgbGF0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvdW5tYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotfQotCi0vKgotICogU2V0IG5ldyBjYWNoZSBtb2RlIGZvciBzb21lIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgotICogVGhlIGNhbGxlciBtdXN0IHB1c2ggZGF0YSBmb3IgdGhhdCByYW5nZSBpdHNlbGYsIGlmIHN1Y2ggZGF0YSBtYXkgYWxyZWFkeQotICogYmUgaW4gdGhlIGNhY2hlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX3NldF9jYWNoZW1vZGUodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQlpbnQgY21vZGUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gX19pb3JlbWFwKHBoeXNhZGRyLCBzaXplLCBJT01BUF9OT0NBQ0hFX1NFUik7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcF9ub2NhY2hlKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIF9faW9yZW1hcChwaHlzYWRkciwgc2l6ZSwgSU9NQVBfTk9DQUNIRV9TRVIpOwotfQotCi1leHRlcm4gdm9pZCBibGtmaW5faW52X2NhY2hlX2FsbCh2b2lkKTsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pby5oPgogCiAjZW5kaWYKLQotI2RlZmluZQlpb3BvcnRfbWFwKHBvcnQsIG5yKQkJKCh2b2lkIF9faW9tZW0qKShwb3J0KSkKLSNkZWZpbmUJaW9wb3J0X3VubWFwKGFkZHIpCi0KLS8qIFBhZ2VzIHRvIHBoeXNpY2FsIGFkZHJlc3MuLi4gKi8KLSNkZWZpbmUgcGFnZV90b19idXMocGFnZSkgICAgICAgKChwYWdlIC0gbWVtX21hcCkgPDwgUEFHRV9TSElGVCkKLQotI2RlZmluZSBwaHlzX3RvX3ZpcnQodmFkZHIpCSgodm9pZCAqKSAodmFkZHIpKQotI2RlZmluZSB2aXJ0X3RvX3BoeXModmFkZHIpCSgodW5zaWduZWQgbG9uZykgKHZhZGRyKSkKLQotI2RlZmluZSB2aXJ0X3RvX2J1cyB2aXJ0X3RvX3BoeXMKLSNkZWZpbmUgYnVzX3RvX3ZpcnQgcGh5c190b192aXJ0Ci0KLS8qCi0gKiBDb252ZXJ0IGEgcGh5c2ljYWwgcG9pbnRlciB0byBhIHZpcnR1YWwga2VybmVsIHBvaW50ZXIgZm9yIC9kZXYvbWVtCi0gKiBhY2Nlc3MKLSAqLwotI2RlZmluZSB4bGF0ZV9kZXZfbWVtX3B0cihwKQlfX3ZhKHApCi0KLS8qCi0gKiBDb252ZXJ0IGEgdmlydHVhbCBjYWNoZWQgcG9pbnRlciB0byBhbiB1bmNhY2hlZCBwb2ludGVyCi0gKi8KLSNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApCXAKLQotI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmCQkJCS8qIF9CRklOX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaAppbmRleCA0MWM0ZDcwLi4zMzY1Y2I5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCkBAIC0xMyw5ICsxMyw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogIyBpbmNsdWRlIDxhc20vcGRhLmg+CiAjIGluY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLS8qIEZvcndhcmQgZGVjbCBuZWVkZWQgZHVlIHRvIGNkZWYgaW50ZXIgZGVwZW5kZW5jaWVzICovCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2RzcGlkKHZvaWQpOwotIyBkZWZpbmUgYmxhY2tmaW5fY29yZV9pZCgpIChiZmluX2RzcGlkKCkgJiAweGZmKQogIyBkZWZpbmUgYmZpbl9pcnFfZmxhZ3MgY3B1X3BkYVtibGFja2Zpbl9jb3JlX2lkKCldLmltYXNrCiAjZWxzZQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZpbl9pcnFfZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBhZWE4ODAyLi44YWY3NzcyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8bWFjaC9ibGFja2Zpbi5oPgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmR1c3Aodm9pZCkKIHsKQEAgLTEzNCw2ICsxMzQsOCBAQAogCXJldHVybiBiZmluX3JlYWRfRFNQSUQoKTsKIH0KIAorI2RlZmluZSBibGFja2Zpbl9jb3JlX2lkKCkgKGJmaW5fZHNwaWQoKSAmIDB4ZmYpCisKIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgX19wdXJlIGJmaW5fY29tcGlsZWRfcmV2aWQodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRl9SRVZfMF8wKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IDE5NDJjY2YuLjFmMjg2ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTE3LDEyICsxNywxMiBAQAogYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwogYXNtbGlua2FnZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7CiBhc21saW5rYWdlIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKLWFzbWxpbmthZ2Ugdm9pZCBhcmNoX3JlYWRfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwotYXNtbGlua2FnZSBpbnQgYXJjaF9yZWFkX3RyeWxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKLWFzbWxpbmthZ2Ugdm9pZCBhcmNoX3JlYWRfdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Ci1hc21saW5rYWdlIHZvaWQgYXJjaF93cml0ZV9sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Ci1hc21saW5rYWdlIGludCBhcmNoX3dyaXRlX3RyeWxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKLWFzbWxpbmthZ2Ugdm9pZCBhcmNoX3dyaXRlX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3JlYWRfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfcmVhZF91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd193cml0ZV9sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIGludCBfX3Jhd193cml0ZV90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfd3JpdGVfdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfc3Bpbl9pc19sb2NrZWQoYXJjaF9zcGlubG9ja190ICpsb2NrKQogewpAQCAtNjQsMzIgKzY0LDM2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3JlYWRfbG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlhcmNoX3JlYWRfbG9ja19hc20oJnJ3LT5sb2NrKTsKKwlfX3Jhd19yZWFkX2xvY2tfYXNtKCZydy0+bG9jayk7CiB9CiAKKyNkZWZpbmUgYXJjaF9yZWFkX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfcmVhZF9sb2NrKGxvY2spCisKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfcmVhZF90cnlsb2NrKGFyY2hfcndsb2NrX3QgKnJ3KQogewotCXJldHVybiBhcmNoX3JlYWRfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKKwlyZXR1cm4gX19yYXdfcmVhZF90cnlsb2NrX2FzbSgmcnctPmxvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX3VubG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlhcmNoX3JlYWRfdW5sb2NrX2FzbSgmcnctPmxvY2spOworCV9fcmF3X3JlYWRfdW5sb2NrX2FzbSgmcnctPmxvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV9sb2NrKGFyY2hfcndsb2NrX3QgKnJ3KQogewotCWFyY2hfd3JpdGVfbG9ja19hc20oJnJ3LT5sb2NrKTsKKwlfX3Jhd193cml0ZV9sb2NrX2FzbSgmcnctPmxvY2spOwogfQogCisjZGVmaW5lIGFyY2hfd3JpdGVfbG9ja19mbGFncyhsb2NrLCBmbGFncykgYXJjaF93cml0ZV9sb2NrKGxvY2spCisKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfd3JpdGVfdHJ5bG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlyZXR1cm4gYXJjaF93cml0ZV90cnlsb2NrX2FzbSgmcnctPmxvY2spOworCXJldHVybiBfX3Jhd193cml0ZV90cnlsb2NrX2FzbSgmcnctPmxvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF93cml0ZV91bmxvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JYXJjaF93cml0ZV91bmxvY2tfYXNtKCZydy0+bG9jayk7CisJX19yYXdfd3JpdGVfdW5sb2NrX2FzbSgmcnctPmxvY2spOwogfQogCiAjZGVmaW5lIGFyY2hfc3Bpbl9yZWxheChsb2NrKSAgCWNwdV9yZWxheCgpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcGxsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcGxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMTc4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wbGwuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX01BQ0hfQ09NTU9OX1BMTF9ICisjZGVmaW5lIF9NQUNIX0NPTU1PTl9QTExfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CisKKyNpZm5kZWYgYmZpbl9pd3JfcmVzdG9yZQorc3RhdGljIGlubGluZSB2b2lkCitiZmluX2l3cl9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgaXdyMCwgdW5zaWduZWQgbG9uZyBpd3IxLCB1bnNpZ25lZCBsb25nIGl3cjIpCit7CisjaWZkZWYgU0lDX0lXUgorCWJmaW5fd3JpdGVfU0lDX0lXUihpd3IwKTsKKyNlbHNlCisJYmZpbl93cml0ZV9TSUNfSVdSMChpd3IwKTsKKyMgaWZkZWYgU0lDX0lXUjEKKwliZmluX3dyaXRlX1NJQ19JV1IxKGl3cjEpOworIyBlbmRpZgorIyBpZmRlZiBTSUNfSVdSMgorCWJmaW5fd3JpdGVfU0lDX0lXUjIoaXdyMik7CisjIGVuZGlmCisjZW5kaWYKK30KKyNlbmRpZgorCisjaWZuZGVmIGJmaW5faXdyX3NhdmUKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZpbl9pd3Jfc2F2ZSh1bnNpZ25lZCBsb25nIG5pd3IwLCB1bnNpZ25lZCBsb25nIG5pd3IxLCB1bnNpZ25lZCBsb25nIG5pd3IyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICppd3IwLCB1bnNpZ25lZCBsb25nICppd3IxLCB1bnNpZ25lZCBsb25nICppd3IyKQoreworI2lmZGVmIFNJQ19JV1IKKwkqaXdyMCA9IGJmaW5fcmVhZF9TSUNfSVdSKCk7CisjZWxzZQorCSppd3IwID0gYmZpbl9yZWFkX1NJQ19JV1IwKCk7CisjIGlmZGVmIFNJQ19JV1IxCisJKml3cjEgPSBiZmluX3JlYWRfU0lDX0lXUjEoKTsKKyMgZW5kaWYKKyMgaWZkZWYgU0lDX0lXUjIKKwkqaXdyMiA9IGJmaW5fcmVhZF9TSUNfSVdSMigpOworIyBlbmRpZgorI2VuZGlmCisJYmZpbl9pd3JfcmVzdG9yZShuaXdyMCwgbml3cjEsIG5pd3IyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgX2JmaW5fd3JpdGVfcGxsX3JlbG9jayh1MzIgYWRkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwliZmluX2l3cl9zYXZlKElXUl9FTkFCTEUoMCksIDAsIDAsICZpd3IwLCAmaXdyMSwgJml3cjIpOworCisJYmZpbl93cml0ZTE2KGFkZHIsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX2l3cl9yZXN0b3JlKGl3cjAsIGl3cjEsIGl3cjIpOworCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZSAqLworc3RhdGljIGlubGluZSB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCV9iZmluX3dyaXRlX3BsbF9yZWxvY2soUExMX0NUTCwgdmFsKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZSAqLworc3RhdGljIGlubGluZSB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJX2JmaW5fd3JpdGVfcGxsX3JlbG9jayhWUl9DVEwsIHZhbCk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1hLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNzhhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEEgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQV9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQV9fCisKKyNkZWZpbmUgUEEwCQkoMSA8PCAwKQorI2RlZmluZSBQQTEJCSgxIDw8IDEpCisjZGVmaW5lIFBBMgkJKDEgPDwgMikKKyNkZWZpbmUgUEEzCQkoMSA8PCAzKQorI2RlZmluZSBQQTQJCSgxIDw8IDQpCisjZGVmaW5lIFBBNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEE2CQkoMSA8PCA2KQorI2RlZmluZSBQQTcJCSgxIDw8IDcpCisjZGVmaW5lIFBBOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEE5CQkoMSA8PCA5KQorI2RlZmluZSBQQTEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEExMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBBMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQQTEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEExNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBBMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1iLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTcwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEIgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQl9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQl9fCisKKyNkZWZpbmUgUEIwCQkoMSA8PCAwKQorI2RlZmluZSBQQjEJCSgxIDw8IDEpCisjZGVmaW5lIFBCMgkJKDEgPDwgMikKKyNkZWZpbmUgUEIzCQkoMSA8PCAzKQorI2RlZmluZSBQQjQJCSgxIDw8IDQpCisjZGVmaW5lIFBCNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEI2CQkoMSA8PCA2KQorI2RlZmluZSBQQjcJCSgxIDw8IDcpCisjZGVmaW5lIFBCOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEI5CQkoMSA8PCA5KQorI2RlZmluZSBQQjEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEIxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBCMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQQjEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEIxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBCMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1jLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzY2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEMgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQ19fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfQ19fCisKKyNkZWZpbmUgUEMwCQkoMSA8PCAwKQorI2RlZmluZSBQQzEJCSgxIDw8IDEpCisjZGVmaW5lIFBDMgkJKDEgPDwgMikKKyNkZWZpbmUgUEMzCQkoMSA8PCAzKQorI2RlZmluZSBQQzQJCSgxIDw8IDQpCisjZGVmaW5lIFBDNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEM2CQkoMSA8PCA2KQorI2RlZmluZSBQQzcJCSgxIDw8IDcpCisjZGVmaW5lIFBDOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEM5CQkoMSA8PCA5KQorI2RlZmluZSBQQzEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEMxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBDMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQQzEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEMxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBDMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1kLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OGM2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEQgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRF9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRF9fCisKKyNkZWZpbmUgUEQwCQkoMSA8PCAwKQorI2RlZmluZSBQRDEJCSgxIDw8IDEpCisjZGVmaW5lIFBEMgkJKDEgPDwgMikKKyNkZWZpbmUgUEQzCQkoMSA8PCAzKQorI2RlZmluZSBQRDQJCSgxIDw8IDQpCisjZGVmaW5lIFBENQkJKDEgPDwgNSkKKyNkZWZpbmUgUEQ2CQkoMSA8PCA2KQorI2RlZmluZSBQRDcJCSgxIDw8IDcpCisjZGVmaW5lIFBEOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEQ5CQkoMSA8PCA5KQorI2RlZmluZSBQRDEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEQxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBEMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQRDEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEQxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBEMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1lLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEUgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRV9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRV9fCisKKyNkZWZpbmUgUEUwCQkoMSA8PCAwKQorI2RlZmluZSBQRTEJCSgxIDw8IDEpCisjZGVmaW5lIFBFMgkJKDEgPDwgMikKKyNkZWZpbmUgUEUzCQkoMSA8PCAzKQorI2RlZmluZSBQRTQJCSgxIDw8IDQpCisjZGVmaW5lIFBFNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEU2CQkoMSA8PCA2KQorI2RlZmluZSBQRTcJCSgxIDw8IDcpCisjZGVmaW5lIFBFOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEU5CQkoMSA8PCA5KQorI2RlZmluZSBQRTEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEUxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBFMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQRTEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEUxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBFMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1mLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWYyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEYgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRl9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfRl9fCisKKyNkZWZpbmUgUEYwCQkoMSA8PCAwKQorI2RlZmluZSBQRjEJCSgxIDw8IDEpCisjZGVmaW5lIFBGMgkJKDEgPDwgMikKKyNkZWZpbmUgUEYzCQkoMSA8PCAzKQorI2RlZmluZSBQRjQJCSgxIDw8IDQpCisjZGVmaW5lIFBGNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEY2CQkoMSA8PCA2KQorI2RlZmluZSBQRjcJCSgxIDw8IDcpCisjZGVmaW5lIFBGOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEY5CQkoMSA8PCA5KQorI2RlZmluZSBQRjEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEYxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBGMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQRjEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEYxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBGMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1nLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzU1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEcgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfR19fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfR19fCisKKyNkZWZpbmUgUEcwCQkoMSA8PCAwKQorI2RlZmluZSBQRzEJCSgxIDw8IDEpCisjZGVmaW5lIFBHMgkJKDEgPDwgMikKKyNkZWZpbmUgUEczCQkoMSA8PCAzKQorI2RlZmluZSBQRzQJCSgxIDw8IDQpCisjZGVmaW5lIFBHNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEc2CQkoMSA8PCA2KQorI2RlZmluZSBQRzcJCSgxIDw8IDcpCisjZGVmaW5lIFBHOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEc5CQkoMSA8PCA5KQorI2RlZmluZSBQRzEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEcxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBHMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQRzEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEcxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBHMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1oLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzkxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEggTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSF9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSF9fCisKKyNkZWZpbmUgUEgwCQkoMSA8PCAwKQorI2RlZmluZSBQSDEJCSgxIDw8IDEpCisjZGVmaW5lIFBIMgkJKDEgPDwgMikKKyNkZWZpbmUgUEgzCQkoMSA8PCAzKQorI2RlZmluZSBQSDQJCSgxIDw8IDQpCisjZGVmaW5lIFBINQkJKDEgPDwgNSkKKyNkZWZpbmUgUEg2CQkoMSA8PCA2KQorI2RlZmluZSBQSDcJCSgxIDw8IDcpCisjZGVmaW5lIFBIOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEg5CQkoMSA8PCA5KQorI2RlZmluZSBQSDEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEgxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBIMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQSDEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEgxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBIMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1pLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzZmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEkgTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSV9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSV9fCisKKyNkZWZpbmUgUEkwCQkoMSA8PCAwKQorI2RlZmluZSBQSTEJCSgxIDw8IDEpCisjZGVmaW5lIFBJMgkJKDEgPDwgMikKKyNkZWZpbmUgUEkzCQkoMSA8PCAzKQorI2RlZmluZSBQSTQJCSgxIDw8IDQpCisjZGVmaW5lIFBJNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEk2CQkoMSA8PCA2KQorI2RlZmluZSBQSTcJCSgxIDw8IDcpCisjZGVmaW5lIFBJOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEk5CQkoMSA8PCA5KQorI2RlZmluZSBQSTEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEkxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBJMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQSTEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEkxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBJMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9tYWNoLWNvbW1vbi9wb3J0cy1qLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDEyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtai5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBQb3J0IEogTWFza3MKKyAqLworCisjaWZuZGVmIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSl9fCisjZGVmaW5lIF9fQkZJTl9QRVJJUEhFUkFMX1BPUlRfSl9fCisKKyNkZWZpbmUgUEowCQkoMSA8PCAwKQorI2RlZmluZSBQSjEJCSgxIDw8IDEpCisjZGVmaW5lIFBKMgkJKDEgPDwgMikKKyNkZWZpbmUgUEozCQkoMSA8PCAzKQorI2RlZmluZSBQSjQJCSgxIDw8IDQpCisjZGVmaW5lIFBKNQkJKDEgPDwgNSkKKyNkZWZpbmUgUEo2CQkoMSA8PCA2KQorI2RlZmluZSBQSjcJCSgxIDw8IDcpCisjZGVmaW5lIFBKOAkJKDEgPDwgOCkKKyNkZWZpbmUgUEo5CQkoMSA8PCA5KQorI2RlZmluZSBQSjEwCQkoMSA8PCAxMCkKKyNkZWZpbmUgUEoxMQkJKDEgPDwgMTEpCisjZGVmaW5lIFBKMTIJCSgxIDw8IDEyKQorI2RlZmluZSBQSjEzCQkoMSA8PCAxMykKKyNkZWZpbmUgUEoxNAkJKDEgPDwgMTQpCisjZGVmaW5lIFBKMTUJCSgxIDw8IDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwppbmRleCBiZmU3NWFmLi44ODZlMDAwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkgICAgKChfcmFtZW5kIC0gdW5jYWNoZWRfZW5kKSA+PSAxICogMTAyNCAqIDEwMjQpKQogCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IHVuY2FjaGVkX2VuZDsKIAllbHNlCi0JCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gdW5jYWNoZWRfZW5kICYgfigxICogMTAyNCAqIDEwMjQpOworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IHVuY2FjaGVkX2VuZCAmIH4oMSAqIDEwMjQgKiAxMDI0IC0gMSk7CiAJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gU0RSQU1fREdFTkVSSUM7CiAJLyogRE1BIHVuY2FjaGVkIHJlZ2lvbi4gICovCiAJaWYgKERNQV9VTkNBQ0hFRF9SRUdJT04pIHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYwppbmRleCBlZGFlNDYxLi5lYjkyNTkyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCkBAIC0zNDUsNiArMzQ1LDIzIEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19JUElQRQorc3RhdGljIHVuc2lnbmVkIGxvbmcga2dkYl9hcmNoX2ltYXNrOworI2VuZGlmCisKK3ZvaWQga2dkYl9wb3N0X3ByaW1hcnlfY29kZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVfdmVjdG9yLCBpbnQgZXJyX2NvZGUpCit7CisJaWYgKGtnZGJfc2luZ2xlX3N0ZXApCisJCXByZWVtcHRfZW5hYmxlKCk7CisKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlpZiAoa2dkYl9hcmNoX2ltYXNrKSB7CisJCWNwdV9wZGFbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV0uZXhfaW1hc2sgPSBrZ2RiX2FyY2hfaW1hc2s7CisJCWtnZGJfYXJjaF9pbWFzayA9IDA7CisJfQorI2VuZGlmCit9CisKIGludCBrZ2RiX2FyY2hfaGFuZGxlX2V4Y2VwdGlvbihpbnQgdmVjdG9yLCBpbnQgc2lnbm8sCiAJCQkgICAgICAgaW50IGVycl9jb2RlLCBjaGFyICpyZW1jb21faW5fYnVmZmVyLAogCQkJICAgICAgIGNoYXIgKnJlbWNvbV9vdXRfYnVmZmVyLApAQCAtMzg4LDYgKzQwNSwxMiBAQAogCQkJICoga2dkYl9zaW5nbGVfc3RlcCA+IDAgbWVhbnMgaW4gc2luZ2xlIHN0ZXAgbW9kZQogCQkJICovCiAJCQlrZ2RiX3NpbmdsZV9zdGVwID0gaSArIDE7CisKKwkJCXByZWVtcHRfZGlzYWJsZSgpOworI2lmZGVmIENPTkZJR19JUElQRQorCQkJa2dkYl9hcmNoX2ltYXNrID0gY3B1X3BkYVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXS5leF9pbWFzazsKKwkJCWNwdV9wZGFbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV0uZXhfaW1hc2sgPSAwOworI2VuZGlmCiAJCX0KIAogCQliZmluX2NvcnJlY3RfaHdfYnJlYWsoKTsKQEAgLTQ0OCw2ICs0NzEsOSBAQAogaW50IGtnZGJfYXJjaF9pbml0KHZvaWQpCiB7CiAJa2dkYl9zaW5nbGVfc3RlcCA9IDA7CisjaWZkZWYgQ09ORklHX0lQSVBFCisJa2dkYl9hcmNoX2ltYXNrID0gMDsKKyNlbmRpZgogCiAJYmZpbl9yZW1vdmVfYWxsX2h3X2JyZWFrKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGJfdGVzdC5jCmluZGV4IDA4YzAyMzYuLjJhNmU5ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGJfdGVzdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGJfdGVzdC5jCkBAIC05NSw2ICs5NSwxMCBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CiAKKyNpZiBMMl9MRU5HVEgKKwludW0yID0gMDsKKyNlbmRpZgorCiAJZW50cnkgPSBwcm9jX2NyZWF0ZSgia2dkYnRlc3QiLCAwLCBOVUxMLCAma2dkYl90ZXN0X3Byb2NfZm9wcyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCmluZGV4IGI4OTRjOGEuLmMwY2NhZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKQEAgLTEwNCwyNCArMTA0LDIzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9waHlkZXZfcGxhdGZvcm1fZGF0YSBiZmluX3BoeWRldl9kYXRhW10gPSB7CiAJewotCQkuYWRkciA9IDEsCi0JCS5pcnEgPSBJUlFfTUFDX1BIWUlOVCwKLQl9LAotCXsKLQkJLmFkZHIgPSAyLAotCQkuaXJxID0gSVJRX01BQ19QSFlJTlQsCi0JfSwKLQl7CisjaWYgZGVmaW5lZChDT05GSUdfTkVUX0RTQV9LU1o4ODkzTSkgfHwgZGVmaW5lZChDT05GSUdfTkVUX0RTQV9LU1o4ODkzTV9NT0RVTEUpCiAJCS5hZGRyID0gMywKKyNlbHNlCisJCS5hZGRyID0gMSwKKyNlbmRpZgogCQkuaXJxID0gSVJRX01BQ19QSFlJTlQsCiAJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9taWlfYnVzX3BsYXRmb3JtX2RhdGEgYmZpbl9taWlfYnVzX2RhdGEgPSB7Ci0JLnBoeWRldl9udW1iZXIgPSAzLAorCS5waHlkZXZfbnVtYmVyID0gMSwKIAkucGh5ZGV2X2RhdGEgPSBiZmluX3BoeWRldl9kYXRhLAogCS5waHlfbW9kZSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCiAJLm1hY19wZXJpcGhlcmFscyA9IGJmaW5fbWFjX3BlcmlwaGVyYWxzLAorI2lmIGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M00pIHx8IGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M01fTU9EVUxFKQorCS5waHlfbWFzayA9IDB4ZmZmNywgLyogT25seSBwcm9iZSB0aGUgcG9ydCBwaHkgY29ubmVjdCB0byB0aGUgb24gY2hpcCBNQUMgKi8KKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9taWlfYnVzID0gewpAQCAtNDUzLDcgKzQ1Miw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNDk2LDcgKzQ5NSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNjM2LDkgKzYzNSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTY3MCw5ICs2NjksOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYwppbmRleCBlNmNlMWQ3Li41MGZjNWM4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMKQEAgLTM3Nyw3ICszNzcsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTQyMCw3ICs0MjAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTU0Nyw5ICs1NDcsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01ODEsOSArNTgxLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCmluZGV4IDc4YjQzNjAuLmJjZDFmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM2MDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtYWNoL2JmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKyNkZWZpbmUgX19CRklOX01BQ0hfU0VSSUFMX0hfXworCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggOTcwZDMxMC4uZjZkOTI0YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC00LDM2ICs0LDkgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9JRVIodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCwgdikgICAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSB8ICh2KSkKLSNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCwgdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQotI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9MQ1IodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQotI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDEpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQotI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQotI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKIApAQCAtNTQsNTAgKzI3LDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgotCi0vKgotICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYwotICovCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7Ci0Jc3RydWN0IHVhcnRfcG9ydCBwb3J0OwotCXVuc2lnbmVkIGludCBvbGRfc3RhdHVzOwotCWludCBzdGF0dXNfaXJxOwotCXVuc2lnbmVkIGludCBsc3I7Ci0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQotCWludCB0eF9kb25lOwotCWludCB0eF9jb3VudDsKLQlzdHJ1Y3QgY2lyY19idWYgcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByeF9kbWFfdGltZXI7Ci0JaW50IHJ4X2RtYV9ucm93czsKLQl1bnNpZ25lZCBpbnQgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50IHJ4X2RtYV9jaGFubmVsOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9kbWFfd29ya3F1ZXVlOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUwotCXN0cnVjdCB0aW1lcl9saXN0IGN0c190aW1lcjsKLQlpbnQgY3RzX3BpbjsKLQlpbnQgcnRzX3BpbjsKLSNlbmRpZgotfTsKLQotLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCi0gKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKLSAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdWFydC0+bHNyID0gMDsKLQliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOwotfQotCiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nIHVhcnRfYmFzZV9hZGRyOwogCWludCB1YXJ0X2lycTsKQEAgLTE0NiwzICs3NSw1IEBACiB9OwogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCisKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCA5MDUzNDYyLi5hODgyODg2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDYxICsxLDQzIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCiAjZGVmaW5lIF9NQUNIX0JMQUNLRklOX0hfCiAKICNpbmNsdWRlICJiZjUxOC5oIgotI2luY2x1ZGUgImRlZkJGNTEyLmgiCiAjaW5jbHVkZSAiYW5vbWFseS5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTgpCi0jaW5jbHVkZSAiZGVmQkY1MTguaCIKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpZmRlZiBDT05GSUdfQkY1MTIKKyMgaW5jbHVkZSAiZGVmQkY1MTIuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRjUxNAorIyBpbmNsdWRlICJkZWZCRjUxNC5oIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE2CisjIGluY2x1ZGUgImRlZkJGNTE2LmgiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MTgKKyMgaW5jbHVkZSAiZGVmQkY1MTguaCIKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTYpCi0jaW5jbHVkZSAiZGVmQkY1MTYuaCIKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaWZkZWYgQ09ORklHX0JGNTEyCisjICBpbmNsdWRlICJjZGVmQkY1MTIuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTE0CisjICBpbmNsdWRlICJjZGVmQkY1MTQuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTE2CisjICBpbmNsdWRlICJjZGVmQkY1MTYuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTE4CisjICBpbmNsdWRlICJjZGVmQkY1MTguaCIKKyMgZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTQpCi0jaW5jbHVkZSAiZGVmQkY1MTQuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTIpCi0jaW5jbHVkZSAiZGVmQkY1MTIuaCIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQotI2luY2x1ZGUgImNkZWZCRjUxMi5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTgpCi0jaW5jbHVkZSAiY2RlZkJGNTE4LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGNTE2KQotI2luY2x1ZGUgImNkZWZCRjUxNi5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRjUxNCkKLSNpbmNsdWRlICJjZGVmQkY1MTQuaCIKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTIKLQotI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLwotI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oCmluZGV4IDQ5MzAyMGQuLmI2NTdkMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNywxNSArNywxMDM3IEBACiAjaWZuZGVmIF9DREVGX0JGNTEyX0gKICNkZWZpbmUgX0NERUZfQkY1MTJfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MTIuaCIKKy8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQkJYmZpbl9yZWFkMTYoUExMX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJCWJmaW5fcmVhZDE2KFBMTF9ESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpCQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQorI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFBMTF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9MT0NLQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkJCQliZmluX3JlYWQzMihDSElQSUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0hJUElEKHZhbCkJCQliZmluX3dyaXRlMzIoQ0hJUElELCB2YWwpCiAKLS8qIGluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgogCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxMiAqLworLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NXUlNUKCkJCQliZmluX3JlYWQxNihTV1JTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TV1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KFNXUlNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TWVNDUigpCQkJYmZpbl9yZWFkMTYoU1lTQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1lTQ1IodmFsKQkJCWJmaW5fd3JpdGUxNihTWVNDUiwgdmFsKQogCi0vKiBpbmNsdWRlIGNkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KLSNpbmNsdWRlICJjZGVmQkY1MXhfYmFzZS5oIgorI2RlZmluZSBiZmluX3JlYWRfU0lDX1JWRUNUKCkJCQliZmluX3JlYWQzMihTSUNfUlZFQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX1JWRUNUKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfUlZFQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSyh4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSksIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjIoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIyKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIyKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjMoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIzKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIzKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMywgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lTUjAgKyAoeCA8PCA2KSksIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JV1IwICsgKHggPDwgNikpLCB2YWwpCisKKy8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUxeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjQoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI0KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI0KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjUoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI1KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI1KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjYoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI2KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI2KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjcoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI3KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI3KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgdmFsKQorCisvKiBXYXRjaGRvZyBUaW1lcgkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NUTCgpCQkJYmZpbl9yZWFkMTYoV0RPR19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DVEwodmFsKQkJYmZpbl93cml0ZTE2KFdET0dfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NOVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DTlQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFdET0dfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfU1RBVCwgdmFsKQorCisKKy8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1RBVCgpCQkJYmZpbl9yZWFkMzIoUlRDX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFJUQ19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSUNUTCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lDVEwodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSVNUQVQoKQkJCWJmaW5fcmVhZDE2KFJUQ19JU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfSVNUQVQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1NXQ05UKCkJCQliZmluX3JlYWQxNihSVENfU1dDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NXQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfU1dDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19BTEFSTSgpCQkJYmZpbl9yZWFkMzIoUlRDX0FMQVJNKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19BTEFSTSh2YWwpCQliZmluX3dyaXRlMzIoUlRDX0FMQVJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfRkFTVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0ZBU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0ZBU1QodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19GQVNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfUFJFTigpCQkJYmZpbl9yZWFkMTYoUlRDX1BSRU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1BSRU4odmFsKQkJYmZpbl93cml0ZTE2KFJUQ19QUkVOLCB2YWwpCisKKworLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMF9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01TUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMF9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfR0NUTCwgdmFsKQorCisKKy8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjBfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjFfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjJfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjNfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjRfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjVfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjZfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjdfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1dJRFRILCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0VOQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9FTkFCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9FTkFCTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0RJU0FCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRElTQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQkJYmZpbl9yZWFkMzIoVElNRVJfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMzIoVElNRVJfU1RBVFVTLCB2YWwpCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRGSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JURklPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fSU5FTiwgdmFsKQorCisKKy8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SRlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDBfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDBfQ0hOTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzMsIHZhbCkKKworCisvKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MzLCB2YWwpCisKKworLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1HQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX0FNR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9BTUdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMCgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDApCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwwKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMSgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwxKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkJCQliZmluX3JlYWQzMihFQklVX1NER0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NER0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9TREdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RCQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX1NEQkNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEQkNUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TREJDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RSUkMoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RSUkMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFJSQyh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFJSQywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFNUQVQoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQorCisKKy8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BQ19UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19QRVIodmFsKQkJYmZpbl93cml0ZTE2KERNQUNfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BQ19UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19DTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQUNfVENfQ05ULCB2YWwpCisKKy8qIERNQSBDb250cm9sbGVyCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BM19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE0X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE1X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE2X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BN19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTdfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE3X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BN19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQThfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE4X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQThfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE5X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPTlRST0woKQkJCWJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoUFBJX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fY2xlYXJfUFBJX1NUQVRVUygpCQkJYmZpbl93cml0ZV9QUElfU1RBVFVTKDB4RkZGRikKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9ERUxBWSgpCQkJYmZpbl9yZWFkMTYoUFBJX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9ERUxBWSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0RFTEFZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09VTlQoKQkJCWJmaW5fcmVhZDE2KFBQSV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkJCQliZmluX3JlYWQxNihQUElfRlJBTUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0ZSQU1FKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfRlJBTUUsIHZhbCkKKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPKCkJCQliZmluX3JlYWQxNihQT1JUR0lPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUR0lPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUR0lPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUR0lPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0lORU4sIHZhbCkKKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEhJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEhJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUSElPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUSElPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19JTkVOLCB2YWwpCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTVNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTVNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9HQ1RMLCB2YWwpCisKKy8qIE9taXQgQ0FOIHJlZ2lzdGVyIHNldHMgZnJvbSB0aGUgY2RlZkJGNTM0LmggKENBTiBpcyBub3QgaW4gdGhlIEFEU1AtQkY1MXggcHJvY2Vzc29yKSAqLworCisvKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUSF9GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVF9NVVgsIHZhbCkKKworCisvKiBIYW5kc2hha2UgTURNQSBSZWdpc3RlcnMJKDB4RkZDMDMzMDAgLSAweEZGQzAzM0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDVVJHRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDVVJHRU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTBfRUNPVkVSRkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVkVSRkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNPVU5ULCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDVVJHRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDVVJHRU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTFfRUNPVkVSRkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVkVSRkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNPVU5ULCB2YWwpCisKKy8qID09PT0gZW5kIGZyb20gY2RlZkJGNTM0LmggPT09PSAqLworCisvKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX01VWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUR19NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19NVVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfTVVYLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JURl9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUR19EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUSF9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEdfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUSF9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEZfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEdfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEhfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRIX0hZU1RFUklTSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0RSSVZFKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfU0xFVygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0hZU1RFUklTSVMsIHZhbCkKKworLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE9TVF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoSE9TVF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1RJTUVPVVQoKQkJYmZpbl9yZWFkMTYoSE9TVF9USU1FT1VUKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfVElNRU9VVCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9USU1FT1VULCB2YWwpCisKKy8qIENvdW50ZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KENOVF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0lNQVNLKCkJCQliZmluX3JlYWQxNihDTlRfSU1BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0lNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfSU1BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KENOVF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTU1BTkQoKQkJCWJmaW5fcmVhZDE2KENOVF9DT01NQU5EKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT01NQU5EKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09NTUFORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0RFQk9VTkNFKCkJCWJmaW5fcmVhZDE2KENOVF9ERUJPVU5DRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfREVCT1VOQ0UodmFsKQkJYmZpbl93cml0ZTE2KENOVF9ERUJPVU5DRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPVU5URVIoKQkJCWJmaW5fcmVhZDMyKENOVF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihDTlRfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX01BWCgpCQkJYmZpbl9yZWFkMzIoQ05UX01BWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUFYKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01BWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX01JTigpCQkJYmZpbl9yZWFkMzIoQ05UX01JTikKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUlOKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01JTiwgdmFsKQorCisvKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NZU1NXVCgpCQliZmluX3JlYWQzMihTRUNVUkVfU1lTU1dUKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TWVNTV1QodmFsKQkJYmZpbl93cml0ZTMyKFNFQ1VSRV9TWVNTV1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NUQVRVUygpCQliZmluX3JlYWQxNihTRUNVUkVfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9TVEFUVVMsIHZhbCkKIAogI2VuZGlmIC8qIF9DREVGX0JGNTEyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oCmluZGV4IDEwOGZhNGIuLmRjOTg4NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNyw5ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1MTRfSAogI2RlZmluZSBfQ0RFRl9CRjUxNF9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjUxNC5oIgotCiAvKiBCRjUxNCBpcyBCRjUxMiArIFJTSSAqLwogI2luY2x1ZGUgImNkZWZCRjUxMi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaAppbmRleCAyNzUxNTkyLi4xNDJlNDVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsOSArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTE2X0gKICNkZWZpbmUgX0NERUZfQkY1MTZfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MTYuaCIKLQogLyogQkY1MTYgaXMgQkY1MTQgKyBFTUFDICovCiAjaW5jbHVkZSAiY2RlZkJGNTE0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oCmluZGV4IDdmYjdmMGUuLmU2MzgxOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNyw5ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1MThfSAogI2RlZmluZSBfQ0RFRl9CRjUxOF9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjUxOC5oIgotCiAvKiBCRjUxOCBpcyBCRjUxNiArIElFRUUtMTU4OCAqLwogI2luY2x1ZGUgImNkZWZCRjUxNi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjk2OWYuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgotICovCi0KLSNpZm5kZWYgX0NERUZfQkY1MlhfSAotI2RlZmluZSBfQ0RFRl9CRjUyWF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKLQotLyogSW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgCQkJCQkJCQkqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogPT09PSBiZWdpbiBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KLQotLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkJCQliZmluX3JlYWQxNihQTExfQ1RMKQotI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpCQkJYmZpbl9yZWFkMTYoUExMX0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCQliZmluX3dyaXRlMTYoUExMX0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkJCQliZmluX3JlYWQxNihWUl9DVEwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpCQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpCQkJYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUExMX0xPQ0tDTlQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9MT0NLQ05ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DSElQSUQoKQkJCWJmaW5fcmVhZDMyKENISVBJRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9DSElQSUQodmFsKQkJCWJmaW5fd3JpdGUzMihDSElQSUQsIHZhbCkKLQotCi0vKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKQkJCWJmaW5fcmVhZDE2KFNXUlNUKQotI2RlZmluZSBiZmluX3dyaXRlX1NXUlNUKHZhbCkJCQliZmluX3dyaXRlMTYoU1dSU1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkJCQliZmluX3JlYWQxNihTWVNDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9TWVNDUih2YWwpCQkJYmZpbl93cml0ZTE2KFNZU0NSLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19SVkVDVCgpCQkJYmZpbl9yZWFkMzIoU0lDX1JWRUNUKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX1JWRUNULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0swKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSU1BU0swICsgKHggPDwgNikpLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIwKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIyKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIzKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwICsgKHggPDwgNikpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JU1IwICsgKHggPDwgNikpLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCArICh4IDw8IDYpKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVdSMCArICh4IDw8IDYpKSwgdmFsKQotCi0vKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0sxKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI1KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI2KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNikKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI3KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNykKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIHZhbCkKLQotLyogV2F0Y2hkb2cgVGltZXIJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfV0RPR19DVEwoKQkJCWJmaW5fcmVhZDE2KFdET0dfQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihXRE9HX0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfV0RPR19DTlQoKQkJCWJmaW5fcmVhZDMyKFdET0dfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ05UKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkJCQliZmluX3JlYWQzMihXRE9HX1NUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX1NUQVQsIHZhbCkKLQotCi0vKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFJUQ19TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX0lDVEwoKQkJCWJmaW5fcmVhZDE2KFJUQ19JQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSUNUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX0lTVEFUKCkJCQliZmluX3JlYWQxNihSVENfSVNUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSVNUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TV0NOVCgpCQkJYmZpbl9yZWFkMTYoUlRDX1NXQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TV0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKQkJCWJmaW5fcmVhZDMyKFJUQ19BTEFSTSkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfQUxBUk0odmFsKQkJYmZpbl93cml0ZTMyKFJUQ19BTEFSTSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX0ZBU1QoKQkJCWJmaW5fcmVhZDE2KFJUQ19GQVNUKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19GQVNUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfRkFTVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX1BSRU4oKQkJCWJmaW5fcmVhZDE2KFJUQ19QUkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQotCi0KLS8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMF9USFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9USFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfUkJSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExIKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTUNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xTUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NU1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NU1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfU0NSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMF9HQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0dDVEwsIHZhbCkKLQotCi0vKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIwX0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIxX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIxX0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSM19DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIzX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIzX0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI0X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI0X0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI1X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI1X0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNl9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI2X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI2X0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSN19DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI3X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI3X0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19QRVJJT0QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1BFUklPRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19XSURUSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19XSURUSCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9FTkFCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9ESVNBQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0RJU0FCTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRElTQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRElTQUJMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKCkJCWJmaW5fcmVhZDMyKFRJTUVSX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSX1NUQVRVUywgdmFsKQotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkJCQliZmluX3JlYWQxNihQT1JURklPKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JURklPLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0EpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRElSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0RJUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JURklPX1BPTEFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fUE9MQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JURklPX0VER0UpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0VER0UsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JURklPX0JPVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0JPVEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JURklPX0lORU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0lORU4sIHZhbCkKLQotCi0vKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENMS0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkNMS0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JGU0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkZTRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9TVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX0NITkwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MwKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MzKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MwKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MzKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCi0KLQotLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVENMS0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDTEtESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RGU0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVEZTRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfQ0hOTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMywgdmFsKQotCi0KLS8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNR0NUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfQU1HQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDAoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwwKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDEoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwxKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMSh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NER0NUTCgpCQkJYmZpbl9yZWFkMzIoRUJJVV9TREdDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREdDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TREJDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREJDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RCQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEUlJDKCkJCQliZmluX3JlYWQxNihFQklVX1NEUlJDKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkJCQliZmluX3JlYWQxNihFQklVX1NEU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFNUQVQsIHZhbCkKLQotCi0vKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENfUEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfQ05UKCkJCQliZmluX3JlYWQxNihETUFfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ19DTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ19DTlQsIHZhbCkKLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDUEVSKCkJCQliZmluX3JlYWQxNihETUFfVENQRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENQRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BX1RDQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ0NOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDQ05ULCB2YWwpCi0KLS8qIERNQSBDb250cm9sbGVyCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTJfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEyX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMl9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTNfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEzX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BM19QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTRfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE0X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTVfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE1X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTZfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE2X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNl9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTdfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE3X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BN19QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQThfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE4X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQThfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTlfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE5X0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTExX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLQotLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPTlRST0woKQkJCWJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUFBJX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoUFBJX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fY2xlYXJfUFBJX1NUQVRVUygpCQkJYmZpbl93cml0ZV9QUElfU1RBVFVTKDB4RkZGRikKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9ERUxBWSgpCQkJYmZpbl9yZWFkMTYoUFBJX0RFTEFZKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9ERUxBWSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0RFTEFZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09VTlQoKQkJCWJmaW5fcmVhZDE2KFBQSV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkJCQliZmluX3JlYWQxNihQUElfRlJBTUUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0ZSQU1FKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfRlJBTUUsIHZhbCkKLQotCi0vKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPKCkJCQliZmluX3JlYWQxNihQT1JUR0lPKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUR0lPLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0EpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQV9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tCX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRElSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0RJUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX1BPTEFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fUE9MQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX0VER0UpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0VER0UsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUR0lPX0JPVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0JPVEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUR0lPX0lORU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0lORU4sIHZhbCkKLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEhJTykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEhJTywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUSElPX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0EsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0FfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQl9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUSElPX0RJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19ESVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19QT0xBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1BPTEFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19FREdFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19FREdFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19CT1RIKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19CT1RILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19JTkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19JTkVOLCB2YWwpCi0KLQotLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfVEhSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfVEhSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1JCUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1JCUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUVSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMSCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JSVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JSVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTENSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTENSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01DUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01DUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MU1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MU1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTVNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTVNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1NDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1NDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfR0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9HQ1RMLCB2YWwpCi0KLS8qIE9taXQgQ0FOIHJlZ2lzdGVyIHNldHMgZnJvbSB0aGUgY2RlZkJGNTM0LmggKENBTiBpcyBub3QgaW4gdGhlIEFEU1AtQkY1MXggcHJvY2Vzc29yKSAqLwotCi0vKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRkVSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRkVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0ZFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0ZFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUSF9GRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9GRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUX01VWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVF9NVVgsIHZhbCkKLQotCi0vKiBIYW5kc2hha2UgTURNQSBSZWdpc3RlcnMJKDB4RkZDMDMzMDAgLSAweEZGQzAzM0ZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9DT05UUk9MKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNJTklUKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ0lOSVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDVVJHRU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDVVJHRU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTBfRUNPVkVSRkxPVykKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVkVSRkxPVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0JDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfQkNPVU5ULCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9DT05UUk9MKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNJTklUKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ0lOSVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNVUkdFTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDVVJHRU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ1VSR0VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDVVJHRU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVkVSRkxPVygpCQliZmluX3JlYWQxNihITURNQTFfRUNPVkVSRkxPVykKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVkVSRkxPVyh2YWwpCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVkVSRkxPVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0JDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfQkNPVU5ULCB2YWwpCi0KLS8qID09PT0gZW5kIGZyb20gY2RlZkJGNTM0LmggPT09PSAqLwotCi0vKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX01VWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX01VWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUR19NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19NVVgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfTVVYKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfTVVYLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JURl9EUklWRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfRFJJVkUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUR19EUklWRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRFJJVkUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0RSSVZFKCkJCQliZmluX3JlYWQxNihQT1JUSF9EUklWRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRFJJVkUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX1NMRVcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfU0xFVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEdfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUSF9TTEVXKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX1NMRVcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEZfSFlTVEVSSVNJUykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGX0hZU1RFUklTSVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEdfSFlTVEVSSVNJUykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHX0hZU1RFUklTSVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoUE9SVEhfSFlTVEVSSVNJUykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRIX0hZU1RFUklTSVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0RSSVZFKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0RSSVZFKQotI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9EUklWRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfU0xFVygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9TTEVXKQotI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX1NMRVcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX0hZU1RFUklTSVMoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9IWVNURVJJU0lTKHZhbCkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0hZU1RFUklTSVMsIHZhbCkKLQotLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9IT1NUX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE9TVF9DT05UUk9MKQotI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9DT05UUk9MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoSE9TVF9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9IT1NUX1RJTUVPVVQoKQkJYmZpbl9yZWFkMTYoSE9TVF9USU1FT1VUKQotI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfVElNRU9VVCh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9USU1FT1VULCB2YWwpCi0KLS8qIENvdW50ZXIgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KENOVF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX0lNQVNLKCkJCQliZmluX3JlYWQxNihDTlRfSU1BU0spCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0lNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfSU1BU0ssIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KENOVF9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTU1BTkQoKQkJCWJmaW5fcmVhZDE2KENOVF9DT01NQU5EKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT01NQU5EKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09NTUFORCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX0RFQk9VTkNFKCkJCWJmaW5fcmVhZDE2KENOVF9ERUJPVU5DRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfREVCT1VOQ0UodmFsKQkJYmZpbl93cml0ZTE2KENOVF9ERUJPVU5DRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPVU5URVIoKQkJCWJmaW5fcmVhZDMyKENOVF9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihDTlRfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX01BWCgpCQkJYmZpbl9yZWFkMzIoQ05UX01BWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUFYKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01BWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX01JTigpCQkJYmZpbl9yZWFkMzIoQ05UX01JTikKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfTUlOKHZhbCkJCQliZmluX3dyaXRlMzIoQ05UX01JTiwgdmFsKQotCi0vKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NZU1NXVCgpCQliZmluX3JlYWQzMihTRUNVUkVfU1lTU1dUKQotI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TWVNTV1QodmFsKQkJYmZpbl93cml0ZTMyKFNFQ1VSRV9TWVNTV1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9DT05UUk9MKQotI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX1NUQVRVUygpCQliZmluX3JlYWQxNihTRUNVUkVfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX1NFQ1VSRV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9TVEFUVVMsIHZhbCkKLQotLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNlbmRpZiAvKiBfQ0RFRl9CRjUyWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmgKaW5kZXggOWI1MDViYi4uMjcyODU4MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTIgKzcsMTM4OCBAQAogI2lmbmRlZiBfREVGX0JGNTEyX0gKICNkZWZpbmUgX0RFRl9CRjUxMl9ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjUxeCAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTIgKi8KKy8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLworI2RlZmluZSBQTExfQ1RMCQkJCTB4RkZDMDAwMDAJLyogUExMIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQTExfRElWCQkJCTB4RkZDMDAwMDQJLyogUExMIERpdmlkZSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFZSX0NUTAkJCQkweEZGQzAwMDA4CS8qIFZvbHRhZ2UgUmVndWxhdG9yIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUExMX1NUQVQJCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQTExfTE9DS0NOVAkJCTB4RkZDMDAwMTAJLyogUExMIExvY2sgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIENISVBJRAkJCQkweEZGQzAwMDE0CS8qIERldmljZSBJRCBSZWdpc3RlciAqLwogCi0vKiBJbmNsdWRlIGRlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLwotI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCQkqLworI2RlZmluZSBTV1JTVAkJCQkweEZGQzAwMTAwCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTWVNDUgkJCQkweEZGQzAwMTA0CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNJQ19SVkVDVAkJCTB4RkZDMDAxMDgJLyogSW50ZXJydXB0IFJlc2V0IFZlY3RvciBBZGRyZXNzIFJlZ2lzdGVyCQkJKi8KKworI2RlZmluZSBTSUNfSU1BU0swCQkJMHhGRkMwMDEwQwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjAJCQkweEZGQzAwMTEwCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjEJCQkweEZGQzAwMTE0CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDEJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjIJCQkweEZGQzAwMTE4CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDIJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDMJCQkJKi8KKyNkZWZpbmUgU0lDX0lTUjAJCQkweEZGQzAwMTIwCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNJQ19JV1IwCQkJMHhGRkMwMDEyNAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyCQkJCQkqLworCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworI2RlZmluZSBTSUNfSU1BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNEMgICAgIC8qIEludGVycnVwdCBNYXNrIHJlZ2lzdGVyIG9mIFNJQzIgKi8KKyNkZWZpbmUgU0lDX0lBUjQgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTUwICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjQgKi8KKyNkZWZpbmUgU0lDX0lBUjUgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU0ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjUgKi8KKyNkZWZpbmUgU0lDX0lBUjYgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU4ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjYgKi8KKyNkZWZpbmUgU0lDX0lBUjcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTVDICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjcgKi8KKyNkZWZpbmUgU0lDX0lTUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTYwICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJQ19JV1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2NCAgICAgLyogSW50ZXJydXB0IFdha2V1cCByZWdpc3RlciAqLworCisKKy8qIFdhdGNoZG9nIFRpbWVyCQkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgV0RPR19DVEwJCQkweEZGQzAwMjAwCS8qIFdhdGNoZG9nIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgV0RPR19DTlQJCQkweEZGQzAwMjA0CS8qIFdhdGNoZG9nIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBXRE9HX1NUQVQJCQkweEZGQzAwMjA4CS8qIFdhdGNoZG9nIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBSVENfU1RBVAkJCTB4RkZDMDAzMDAJLyogUlRDIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFJUQ19JQ1RMCQkJMHhGRkMwMDMwNAkvKiBSVEMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfSVNUQVQJCQkweEZGQzAwMzA4CS8qIFJUQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX1NXQ05UCQkJMHhGRkMwMDMwQwkvKiBSVEMgU3RvcHdhdGNoIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFJUQ19BTEFSTQkJCTB4RkZDMDAzMTAJLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFJUQ19GQVNUCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19QUkVOCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBBbHRlcm5hdGUgTWFjcm8JCSovCisKKworLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCisjZGVmaW5lIFVBUlQwX1RIUgkJCTB4RkZDMDA0MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMF9SQlIJCQkweEZGQzAwNDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9ETEwJCQkweEZGQzAwNDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfSUVSCQkJMHhGRkMwMDQwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQwX0RMSAkJCTB4RkZDMDA0MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMF9JSVIJCQkweEZGQzAwNDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVUFSVDBfTENSCQkJMHhGRkMwMDQwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX01DUgkJCTB4RkZDMDA0MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTFNSCQkJMHhGRkMwMDQxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFVBUlQwX01TUgkJCTB4RkZDMDA0MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9TQ1IJCQkweEZGQzAwNDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfR0NUTAkJCTB4RkZDMDA0MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFNQSTAgQ29udHJvbGxlcgkJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJMHhGRkMwMDUwMAorI2RlZmluZSBTUEkwX0NUTAkJCTB4RkZDMDA1MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX0ZMRwkJCTB4RkZDMDA1MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX1NUQVQJCQkweEZGQzAwNTA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkwX1REQlIJCQkweEZGQzAwNTBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkwX1JEQlIJCQkweEZGQzAwNTEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTBfQkFVRAkJCTB4RkZDMDA1MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BJMF9TSEFET1cJCQkweEZGQzAwNTE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KKworLyogU1BJMSBDb250cm9sbGVyCQkJKDB4RkZDMDM0MDAgLSAweEZGQzAzNEZGKQkJCQkJCQkqLworI2RlZmluZSBTUEkxX1JFR0JBU0UJCQkweEZGQzAzNDAwCisjZGVmaW5lIFNQSTFfQ1RMCQkJMHhGRkMwMzQwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfRkxHCQkJMHhGRkMwMzQwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfU1RBVAkJCTB4RkZDMDM0MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSTFfVERCUgkJCTB4RkZDMDM0MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTFfUkRCUgkJCTB4RkZDMDM0MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMV9CQVVECQkJMHhGRkMwMzQxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUEkxX1NIQURPVwkJCTB4RkZDMDM0MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9DT05GSUcJCTB4RkZDMDA2MDAJLyogVGltZXIgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVElNRVIwX0NPVU5URVIJCTB4RkZDMDA2MDQJLyogVGltZXIgMCBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfUEVSSU9ECQkweEZGQzAwNjA4CS8qIFRpbWVyIDAgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfV0lEVEgJCTB4RkZDMDA2MEMJLyogVGltZXIgMCBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBUSU1FUjFfQ09ORklHCQkweEZGQzAwNjEwCS8qIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX0NPVU5URVIJCTB4RkZDMDA2MTQJLyogVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjFfUEVSSU9ECQkweEZGQzAwNjE4CS8qIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX1dJRFRICQkweEZGQzAwNjFDCS8qIFRpbWVyIDEgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjJfQ09ORklHCQkweEZGQzAwNjIwCS8qIFRpbWVyIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX0NPVU5URVIJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjJfUEVSSU9ECQkweEZGQzAwNjI4CS8qIFRpbWVyIDIgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX1dJRFRICQkweEZGQzAwNjJDCS8qIFRpbWVyIDIgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjNfQ09ORklHCQkweEZGQzAwNjMwCS8qIFRpbWVyIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRJTUVSM19DT1VOVEVSCQkweEZGQzAwNjM0CS8qIFRpbWVyIDMgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1BFUklPRAkJMHhGRkMwMDYzOAkvKiBUaW1lciAzIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1dJRFRICQkweEZGQzAwNjNDCS8qIFRpbWVyIDMgV2lkdGggUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgVElNRVI0X0NPTkZJRwkJMHhGRkMwMDY0MAkvKiBUaW1lciA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9DT1VOVEVSCQkweEZGQzAwNjQ0CS8qIFRpbWVyIDQgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X1BFUklPRAkJMHhGRkMwMDY0OAkvKiBUaW1lciA0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9XSURUSAkJMHhGRkMwMDY0QwkvKiBUaW1lciA0IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI1X0NPTkZJRwkJMHhGRkMwMDY1MAkvKiBUaW1lciA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9DT1VOVEVSCQkweEZGQzAwNjU0CS8qIFRpbWVyIDUgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X1BFUklPRAkJMHhGRkMwMDY1OAkvKiBUaW1lciA1IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9XSURUSAkJMHhGRkMwMDY1QwkvKiBUaW1lciA1IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI2X0NPTkZJRwkJMHhGRkMwMDY2MAkvKiBUaW1lciA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9DT1VOVEVSCQkweEZGQzAwNjY0CS8qIFRpbWVyIDYgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X1BFUklPRAkJMHhGRkMwMDY2OAkvKiBUaW1lciA2IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9XSURUSAkJMHhGRkMwMDY2QwkvKiBUaW1lciA2IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI3X0NPTkZJRwkJMHhGRkMwMDY3MAkvKiBUaW1lciA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSN19DT1VOVEVSCQkweEZGQzAwNjc0CS8qIFRpbWVyIDcgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X1BFUklPRAkJMHhGRkMwMDY3OAkvKiBUaW1lciA3IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSN19XSURUSAkJMHhGRkMwMDY3QwkvKiBUaW1lciA3IFdpZHRoIFJlZ2lzdGVyICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVJfRU5BQkxFCQkweEZGQzAwNjgwCS8qIFRpbWVyIEVuYWJsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVJfRElTQUJMRQkJMHhGRkMwMDY4NAkvKiBUaW1lciBEaXNhYmxlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUl9TVEFUVVMJCTB4RkZDMDA2ODgJLyogVGltZXIgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJTwkJCQkJMHhGRkMwMDcwMAkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fQ0xFQVIJCQkweEZGQzAwNzA0CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRGSU9fU0VUCQkJCTB4RkZDMDA3MDgJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX1RPR0dMRQkJCTB4RkZDMDA3MEMJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBCQkJMHhGRkMwMDcxMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tBX0NMRUFSCQkweEZGQzAwNzE0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9TRVQJCTB4RkZDMDA3MTgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfVE9HR0xFCTB4RkZDMDA3MUMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQgkJCTB4RkZDMDA3MjAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9DTEVBUgkJMHhGRkMwMDcyNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfU0VUCQkweEZGQzAwNzI4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tCX1RPR0dMRQkweEZGQzAwNzJDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fRElSCQkJCTB4RkZDMDA3MzAJLyogUG9ydCBGIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JURklPX1BPTEFSCQkJMHhGRkMwMDczNAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19FREdFCQkJMHhGRkMwMDczOAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0JPVEgJCQkweEZGQzAwNzNDCS8qIFBvcnQgRiBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19JTkVOCQkJMHhGRkMwMDc0MAkvKiBQb3J0IEYgSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlciAJCQkJCSovCisKKy8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IxCQkJMHhGRkMwMDgwMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDUjIJCQkweEZGQzAwODA0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfVENMS0RJVgkJMHhGRkMwMDgwOAkvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RGU0RJVgkJMHhGRkMwMDgwQwkvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UWAkJCTB4RkZDMDA4MTAJLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JYCQkJMHhGRkMwMDgxOAkvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMQkJCTB4RkZDMDA4MjAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ1IyCQkJMHhGRkMwMDgyNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDTEtESVYJCTB4RkZDMDA4MjgJLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SRlNESVYJCTB4RkZDMDA4MkMJLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMAkvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNAkvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzEJCTB4RkZDMDA4MzgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NQ01DMgkJMHhGRkMwMDgzQwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MwCQkweEZGQzAwODQwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMQkJMHhGRkMwMDg0NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVRDUzIJCTB4RkZDMDA4NDgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MzCQkweEZGQzAwODRDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMAkJMHhGRkMwMDg1MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMQkJMHhGRkMwMDg1NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMgkJMHhGRkMwMDg1OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMwkJMHhGRkMwMDg1QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKy8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ1IxCQkJMHhGRkMwMDkwMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDUjIJCQkweEZGQzAwOTA0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfVENMS0RJVgkJMHhGRkMwMDkwOAkvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RGU0RJVgkJMHhGRkMwMDkwQwkvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UWAkJCTB4RkZDMDA5MTAJLyogU1BPUlQxIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JYCQkJMHhGRkMwMDkxOAkvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUkNSMQkJCTB4RkZDMDA5MjAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ1IyCQkJMHhGRkMwMDkyNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDTEtESVYJCTB4RkZDMDA5MjgJLyogU1BPUlQxIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SRlNESVYJCTB4RkZDMDA5MkMJLyogU1BPUlQxIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9TVEFUCQkJMHhGRkMwMDkzMAkvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNAkvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDFfTUNNQzEJCTB4RkZDMDA5MzgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NQ01DMgkJMHhGRkMwMDkzQwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MwCQkweEZGQzAwOTQwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMQkJMHhGRkMwMDk0NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTVRDUzIJCTB4RkZDMDA5NDgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MzCQkweEZGQzAwOTRDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMAkJMHhGRkMwMDk1MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMQkJMHhGRkMwMDk1NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMgkJMHhGRkMwMDk1OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMwkJMHhGRkMwMDk1QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCQkqLworI2RlZmluZSBFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkqLworI2RlZmluZSBFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBFQklVX0FNQkNUTDEJCTB4RkZDMDBBMDgJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBFQklVX1NER0NUTAkJCTB4RkZDMDBBMTAJLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0CS8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTgJLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMJLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKworLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BQ19UQ19QRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRE1BQ19UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLworCisvKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMEUwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQThfQ09ORklHCQkJCTB4RkZDMDBFMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X1hfQ09VTlQJCQkweEZGQzAwRTEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWF9NT0RJRlkJCQkweEZGQzAwRTE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfQ09VTlQJCQkweEZGQzAwRTE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWV9NT0RJRlkJCQkweEZGQzAwRTFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE4X0NVUlJfQUREUgkJCTB4RkZDMDBFMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMEUyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEUyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDBFNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE5X0NPTkZJRwkJCQkweEZGQzAwRTQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX0NPVU5UCQkJMHhGRkMwMEU1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1hfTU9ESUZZCQkJMHhGRkMwMEU1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMEU1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1lfTU9ESUZZCQkJMHhGRkMwMEU1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0FERFIJCQkweEZGQzAwRTY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDBFNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEU3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEU3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DT05GSUcJCQkweEZGQzAwRTg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDBFOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMEU5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1lfQ09VTlQJCQkweEZGQzAwRTk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX01PRElGWQkJCTB4RkZDMDBFOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUEwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDBFQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUI4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTExX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDBFRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1hfTU9ESUZZCQkJMHhGRkMwMEVENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1lfQ09VTlQJCQkweEZGQzAwRUQ4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX01PRElGWQkJCTB4RkZDMDBFREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUUwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTExX0NVUlJfQUREUgkJCTB4RkZDMDBFRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUY4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjAwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSCQkweEZGQzAwRjA0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEYwOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQJCQkweEZGQzAwRjEwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX01PRElGWQkJMHhGRkMwMEYxNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWV9DT1VOVAkJCTB4RkZDMDBGMTgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRjFDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGMjAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRjI0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTCQkweEZGQzAwRjI4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjJDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjMwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEYzOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGNDAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEY0NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEY0OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9DT1VOVAkJCTB4RkZDMDBGNTAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBGNTQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQJCQkweEZGQzAwRjU4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRjVDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGNjAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIJCTB4RkZDMDBGNjQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEY2OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEY2QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjcwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjc4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjgwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSCQkweEZGQzAwRjg0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEY4OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQJCQkweEZGQzAwRjkwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX01PRElGWQkJMHhGRkMwMEY5NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWV9DT1VOVAkJCTB4RkZDMDBGOTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRjlDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGQTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRkE0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRkE4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkFDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkIwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZCOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGQzAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEZDNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEZDOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9DT1VOVAkJCTB4RkZDMDBGRDAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBGRDQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQJCQkweEZGQzAwRkQ4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRkRDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGRTAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIJCTB4RkZDMDBGRTQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMEZFOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZFQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkYwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkY4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJKi8KKyNkZWZpbmUgUFBJX0NPTlRST0wJCQkweEZGQzAxMDAwCS8qIFBQSSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyCSovCisjZGVmaW5lIFBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyCQkqLworI2RlZmluZSBQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIJKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJCTB4RkZDMDE0MDAKKyNkZWZpbmUgVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVFdJMF9DT05UUk9MCQkJMHhGRkMwMTQwNAkvKiBUV0kgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSTBfU0xBVkVfQ1RMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9DVEwJCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9TVEFUCQkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9BRERSCQkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJIE1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTyBSZWNlaXZlIERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8gUmVjZWl2ZSBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU8JCQkJCTB4RkZDMDE1MDAJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0NMRUFSCQkJMHhGRkMwMTUwNAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JUR0lPX1NFVAkJCQkweEZGQzAxNTA4CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19UT0dHTEUJCQkweEZGQzAxNTBDCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQQkJCTB4RkZDMDE1MTAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTUxNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfU0VUCQkweEZGQzAxNTE4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1RPR0dMRQkweEZGQzAxNTFDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0IJCQkweEZGQzAxNTIwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE1MjQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX1NFVAkJMHhGRkMwMTUyOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTUyQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX0RJUgkJCQkweEZGQzAxNTMwCS8qIFBvcnQgRyBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19QT0xBUgkJCTB4RkZDMDE1MzQJLyogUG9ydCBHIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fRURHRQkJCTB4RkZDMDE1MzgJLyogUG9ydCBHIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19CT1RICQkJMHhGRkMwMTUzQwkvKiBQb3J0IEcgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fSU5FTgkJCTB4RkZDMDE1NDAJLyogUG9ydCBHIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUSElPCQkJCQkweEZGQzAxNzAwCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19DTEVBUgkJCTB4RkZDMDE3MDQJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEhJT19TRVQJCQkJMHhGRkMwMTcwOAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fVE9HR0xFCQkJMHhGRkMwMTcwQwkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0EJCQkweEZGQzAxNzEwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE3MTQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX1NFVAkJMHhGRkMwMTcxOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTcxQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCCQkJMHhGRkMwMTcyMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX0NMRUFSCQkweEZGQzAxNzI0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9TRVQJCTB4RkZDMDE3MjgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE3MkMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19ESVIJCQkJMHhGRkMwMTczMAkvKiBQb3J0IEggSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fUE9MQVIJCQkweEZGQzAxNzM0CS8qIFBvcnQgSCBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX0VER0UJCQkweEZGQzAxNzM4CS8qIFBvcnQgSCBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQk9USAkJCTB4RkZDMDE3M0MJLyogUG9ydCBIIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0lORU4JCQkweEZGQzAxNzQwCS8qIFBvcnQgSCBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLworI2RlZmluZSBVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCSovCisjZGVmaW5lIFVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCSovCisjZGVmaW5lIFVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9NU1IJCQkweEZGQzAyMDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworCisKKy8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JURl9GRVIJCQkweEZGQzAzMjAwCS8qIFBvcnQgRiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgUE9SVEdfRkVSCQkJMHhGRkMwMzIwNAkvKiBQb3J0IEcgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRIX0ZFUgkJCTB4RkZDMDMyMDgJLyogUG9ydCBIIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBCRklOX1BPUlRfTVVYCQkJMHhGRkMwMzIwQwkvKiBQb3J0IE11bHRpcGxleGVyIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyCQkqLworI2RlZmluZSBITURNQTBfRUNPVkVSRkxPVwkweEZGQzAzMzEwCS8qIEhNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLworI2RlZmluZSBITURNQTBfRUNPVU5UCQkweEZGQzAzMzE0CS8qIEhNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDT1VOVAkJMHhGRkMwMzMxOAkvKiBITURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIEhNRE1BMV9DT05UUk9MCQkweEZGQzAzMzQwCS8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTFfRUNJTklUCQkweEZGQzAzMzQ0CS8qIEhNRE1BMSBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfRUNVUkdFTlQJCTB4RkZDMDMzNEMJLyogSE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1ZFUkZMT1cJMHhGRkMwMzM1MAkvKiBITURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ09VTlQJCTB4RkZDMDMzNTgJLyogSE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworCisvKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLworI2RlZmluZSBQT1JURl9NVVggICAgICAgICAgICAgICAweEZGQzAzMjEwICAgICAgLyogUG9ydCBGIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTQgICAgICAvKiBQb3J0IEcgbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxOCAgICAgIC8qIFBvcnQgSCBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JURl9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjIwICAgICAgLyogUG9ydCBGIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyNCAgICAgIC8qIFBvcnQgRyBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjggICAgICAvKiBQb3J0IEggZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JURl9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjMwICAgICAgLyogUG9ydCBGIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JUR19TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM0ICAgICAgLyogUG9ydCBHIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM4ICAgICAgLyogUG9ydCBIIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JURl9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQwICAgICAgLyogUG9ydCBGIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDQgICAgICAvKiBQb3J0IEcgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0OCAgICAgIC8qIFBvcnQgSCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9EUklWRSAgICAgICAgICAweEZGQzAzMjgwICAgICAgLyogTWlzYyBQb3J0IGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfU0xFVyAgICAgICAgICAgMHhGRkMwMzI4NCAgICAgIC8qIE1pc2MgUG9ydCBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfSFlTVEVSSVNJUyAgICAgMHhGRkMwMzI4OCAgICAgIC8qIE1pc2MgUG9ydCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIEFuZCBNYWNyb3MKKyoqCisqKiBEaXNjbGFpbWVyOglBbGwgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBtYWtlIEMgYW5kIEFzc2VtYmx5IGNvZGUgbW9yZSByZWFkYWJsZS4KKyoqCQkJCVVzZSB0aGVzZSBtYWNyb3MgY2FyZWZ1bGx5LCBhcyBhbnkgdGhhdCBkbyBsZWZ0IHNoaWZ0cyBmb3IgZmllbGQKKyoqCQkJCWRlcG9zaXRpbmcgd2lsbCByZXN1bHQgaW4gdGhlIGxvd2VyIG9yZGVyIGJpdHMgYmVpbmcgZGVzdHJveWVkLiAgQW55CisqKgkJCQltYWNybyB0aGF0IHNoaWZ0cyBsZWZ0IHRvIHByb3Blcmx5IHBvc2l0aW9uIHRoZSBiaXQtZmllbGQgc2hvdWxkIGJlCisqKgkJCQl1c2VkIGFzIHBhcnQgb2YgYW4gT1IgdG8gaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIGFuZCBOT1QgYXMgYSBkeW5hbWljCisqKgkJCQltb2RpZmllciBVTkxFU1MgdGhlIGxvd2VyIG9yZGVyIGJpdHMgYXJlIHNhdmVkIGFuZCBPUmVkIGJhY2sgaW4gd2hlbgorKioJCQkJdGhlIG1hY3JvIGlzIHVzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDSElQSUQgTWFza3MgKi8KKyNkZWZpbmUgQ0hJUElEX1ZFUlNJT04gICAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIENISVBJRF9GQU1JTFkgICAgICAgICAgMHgwRkZGRjAwMAorI2RlZmluZSBDSElQSURfTUFOVUZBQ1RVUkUgICAgIDB4MDAwMDBGRkUKKworLyogU1dSU1QgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTWVNURU1fUkVTRVQJCTB4MDAwNwkvKiBJbml0aWF0ZXMgQSBTeXN0ZW0gU29mdHdhcmUgUmVzZXQJCQkqLworI2RlZmluZQlET1VCTEVfRkFVTFQJCTB4MDAwOAkvKiBDb3JlIERvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQJCQkJKi8KKyNkZWZpbmUgUkVTRVRfRE9VQkxFCQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0CQkqLworI2RlZmluZSBSRVNFVF9XRE9HCQkJMHg0MDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBXYXRjaGRvZyBUaW1lcgkJCSovCisjZGVmaW5lIFJFU0VUX1NPRlRXQVJFCQkweDgwMDAJLyogU1cgUmVzZXQgT2NjdXJyZWQgU2luY2UgTGFzdCBSZWFkIE9mIFNXUlNUCSovCisKKy8qIFNZU0NSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCTU9ERQkJCQkweDAwMDcJLyogQm9vdCBNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMJKi8KKyNkZWZpbmUJTk9CT09UCQkJCTB4MDAxMAkvKiBFeGVjdXRlIEZyb20gTDEgb3IgQVNZTkMgQmFuayAwIFdoZW4gQk1PREUgPSAwCQkqLworCisKKy8qICoqKioqKioqKioqKiogIFNZU1RFTSBJTlRFUlJVUFQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IgU0lDX0lTUiwgU0lDX0lXUiwgU0lDX0lNQVNLCQkJCQkJCQkJCSovCisKKyNpZiAwCisjZGVmaW5lIElSUV9QTExfV0FLRVVQCTB4MDAwMDAwMDEJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQJCQkgCQkJCQkqLworCisjZGVmaW5lIElSUV9FUlJPUjEgICAgICAweDAwMDAwMDAyICAvKiBFcnJvciBJbnRlcnJ1cHQgKERNQSwgRE1BUnggQmxvY2ssIERNQVJ4IE92ZXJmbG93KSAqLworI2RlZmluZSBJUlFfRVJST1IyICAgICAgMHgwMDAwMDAwNCAgLyogRXJyb3IgSW50ZXJydXB0IChDQU4sIEV0aGVybmV0LCBTUE9SVHgsIFBQSSwgU1BJLCBVQVJUeCkgKi8KKyNkZWZpbmUgSVJRX1JUQwkJCTB4MDAwMDAwMDgJLyogUmVhbCBUaW1lIENsb2NrIEludGVycnVwdCAJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMAkJMHgwMDAwMDAxMAkvKiBETUEgQ2hhbm5lbCAwIChQUEkpIEludGVycnVwdCAJCQkJCSovCisjZGVmaW5lIElSUV9ETUEzCQkweDAwMDAwMDIwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMCBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BNAkJMHgwMDAwMDA0MAkvKiBETUEgQ2hhbm5lbCA0IChTUE9SVDAgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTUJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgNSAoU1BPUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisKKyNkZWZpbmUgSVJRX0RNQTYJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgNiAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgCQkgCQkqLworI2RlZmluZSBJUlFfVFdJCQkJMHgwMDAwMDIwMAkvKiBUV0kgSW50ZXJydXB0CQkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTcJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgNyAoU1BJKSBJbnRlcnJ1cHQgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BOAkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCA4IChVQVJUMCBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BOQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCA5IChVQVJUMCBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BMTAJCTB4MDAwMDIwMDAJLyogRE1BIENoYW5uZWwgMTAgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUExMQkJMHgwMDAwNDAwMAkvKiBETUEgQ2hhbm5lbCAxMSAoVUFSVDEgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0NBTl9SWAkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgCQkJCQkJCSovCisKKyNkZWZpbmUgSVJRX0NBTl9UWAkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQgSW50ZXJydXB0ICAJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEJCTB4MDAwMjAwMDAJLyogRE1BIENoYW5uZWwgMSAoRXRoZXJuZXQgUlgpIEludGVycnVwdCAJCQkqLworI2RlZmluZSBJUlFfUEZBX1BPUlRICTB4MDAwMjAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQSAJCQkJCSovCisjZGVmaW5lIElSUV9ETUEyCQkweDAwMDQwMDAwCS8qIERNQSBDaGFubmVsIDIgKEV0aGVybmV0IFRYKSBJbnRlcnJ1cHQgCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JUSAkweDAwMDQwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEIgCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIwCQkweDAwMDgwMDAwCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIxCQkweDAwMTAwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMgkJMHgwMDIwMDAwMAkvKiBUaW1lciAyIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjMJCTB4MDA0MDAwMDAJLyogVGltZXIgMyBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI0CQkweDAwODAwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0IAkJCQkJCQkJKi8KKworI2RlZmluZSBJUlFfVElNRVI1CQkweDAxMDAwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNgkJMHgwMjAwMDAwMAkvKiBUaW1lciA2IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjcJCTB4MDQwMDAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfUEZBX1BPUlRGRwkweDA4MDAwMDAwCS8qIFBGIFBvcnRzIEYmRyAoUEYzMTowKSBJbnRlcnJ1cHQgQSAJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JURgkweDgwMDAwMDAwCS8qIFBGIFBvcnQgRiAoUEYxNTowKSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZGVmaW5lIElSUV9ETUExMgkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTIgKE1ETUExIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KKyNkZWZpbmUgSVJRX0RNQTEzCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMyAoTURNQTEgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BMTQJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE0IChNRE1BMCBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCisjZGVmaW5lIElSUV9ETUExNQkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTUgKE1ETUEwIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1dET0cJCTB4ODAwMDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRHCTB4MTAwMDAwMDAJLyogUEYgUG9ydCBHIChQRjMxOjE2KSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZW5kaWYKKworLyogU0lDX0lBUjAgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDBfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMCBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMiBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjNSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjNyBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjEgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDhfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjOCBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFA5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjOSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzEwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxMSBhc3NpZ25lZCBJVkcgI3ggCSovCisjZGVmaW5lIFAxMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMxMiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDEzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzEzIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMTQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMxNSBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjIgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDE2X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzE2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxNyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTggYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzE5IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyMSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzIyIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMjMgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIzIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAyNF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMyNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMjUgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzI2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMyNyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzI4IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjkgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAzMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMzMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDMxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzMxIGFzc2lnbmVkIElWRyAjeAkqLworCisKKy8qIFNJQ19JTUFTSyBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIFNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KKyNkZWZpbmUgU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBNYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CQkqLworI2RlZmluZSBTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkqLworCisvKiBTSUNfSVdSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgSVdSX0RJU0FCTEVfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFdha2V1cCBEaXNhYmxlIGFsbCBwZXJpcGhlcmFscwkqLworI2RlZmluZSBJV1JfRU5BQkxFX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBXYWtldXAgRW5hYmxlIGFsbCBwZXJpcGhlcmFscwkqLworI2RlZmluZSBJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3gJCSovCisjZGVmaW5lIElXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpIAkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4CQkqLworCisvKiAgKioqKioqKioqKioqKioqKiAgR0VORVJBTCBQVVJQT1NFIFRJTUVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqLworLyogVElNRVJfRU5BQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTUVOMAkJCTB4MDAwMQkJLyogRW5hYmxlIFRpbWVyIDAJCQkJCSovCisjZGVmaW5lIFRJTUVOMQkJCTB4MDAwMgkJLyogRW5hYmxlIFRpbWVyIDEJCQkJCSovCisjZGVmaW5lIFRJTUVOMgkJCTB4MDAwNAkJLyogRW5hYmxlIFRpbWVyIDIJCQkJCSovCisjZGVmaW5lIFRJTUVOMwkJCTB4MDAwOAkJLyogRW5hYmxlIFRpbWVyIDMJCQkJCSovCisjZGVmaW5lIFRJTUVONAkJCTB4MDAxMAkJLyogRW5hYmxlIFRpbWVyIDQJCQkJCSovCisjZGVmaW5lIFRJTUVONQkJCTB4MDAyMAkJLyogRW5hYmxlIFRpbWVyIDUJCQkJCSovCisjZGVmaW5lIFRJTUVONgkJCTB4MDA0MAkJLyogRW5hYmxlIFRpbWVyIDYJCQkJCSovCisjZGVmaW5lIFRJTUVONwkJCTB4MDA4MAkJLyogRW5hYmxlIFRpbWVyIDcJCQkJCSovCisKKy8qIFRJTUVSX0RJU0FCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRElTMAkJCVRJTUVOMAkJLyogRGlzYWJsZSBUaW1lciAwCQkJCQkqLworI2RlZmluZSBUSU1ESVMxCQkJVElNRU4xCQkvKiBEaXNhYmxlIFRpbWVyIDEJCQkJCSovCisjZGVmaW5lIFRJTURJUzIJCQlUSU1FTjIJCS8qIERpc2FibGUgVGltZXIgMgkJCQkJKi8KKyNkZWZpbmUgVElNRElTMwkJCVRJTUVOMwkJLyogRGlzYWJsZSBUaW1lciAzCQkJCQkqLworI2RlZmluZSBUSU1ESVM0CQkJVElNRU40CQkvKiBEaXNhYmxlIFRpbWVyIDQJCQkJCSovCisjZGVmaW5lIFRJTURJUzUJCQlUSU1FTjUJCS8qIERpc2FibGUgVGltZXIgNQkJCQkJKi8KKyNkZWZpbmUgVElNRElTNgkJCVRJTUVONgkJLyogRGlzYWJsZSBUaW1lciA2CQkJCQkqLworI2RlZmluZSBUSU1ESVM3CQkJVElNRU43CQkvKiBEaXNhYmxlIFRpbWVyIDcJCQkJCSovCisKKy8qIFRJTUVSX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1JTDAJCQkweDAwMDAwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMQkJCTB4MDAwMDAwMDIJLyogVGltZXIgMSBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwyCQkJMHgwMDAwMDAwNAkvKiBUaW1lciAyIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDMJCQkweDAwMDAwMDA4CS8qIFRpbWVyIDMgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRPVkZfRVJSMAkJMHgwMDAwMDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjEJCTB4MDAwMDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIyCQkweDAwMDAwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMwkJMHgwMDAwMDA4MAkvKiBUaW1lciAzIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUUlVOMAkJCTB4MDAwMDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMQkJCTB4MDAwMDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMgkJCTB4MDAwMDQwMDAJLyogVGltZXIgMiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVOMwkJCTB4MDAwMDgwMDAJLyogVGltZXIgMyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUSU1JTDQJCQkweDAwMDEwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNQkJCTB4MDAwMjAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw2CQkJMHgwMDA0MDAwMAkvKiBUaW1lciA2IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDcJCQkweDAwMDgwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRPVkZfRVJSNAkJMHgwMDEwMDAwMAkvKiBUaW1lciA0IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjUJCTB4MDAyMDAwMDAJLyogVGltZXIgNSBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI2CQkweDAwNDAwMDAwCS8qIFRpbWVyIDYgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNwkJMHgwMDgwMDAwMAkvKiBUaW1lciA3IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUUlVONAkJCTB4MTAwMDAwMDAJLyogVGltZXIgNCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONQkJCTB4MjAwMDAwMDAJLyogVGltZXIgNSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONgkJCTB4NDAwMDAwMDAJLyogVGltZXIgNiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworI2RlZmluZSBUUlVONwkJCTB4ODAwMDAwMDAJLyogVGltZXIgNyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLworCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgVE9WTF9FUlIwIFRPVkZfRVJSMAorI2RlZmluZSBUT1ZMX0VSUjEgVE9WRl9FUlIxCisjZGVmaW5lIFRPVkxfRVJSMiBUT1ZGX0VSUjIKKyNkZWZpbmUgVE9WTF9FUlIzIFRPVkZfRVJSMworI2RlZmluZSBUT1ZMX0VSUjQgVE9WRl9FUlI0CisjZGVmaW5lIFRPVkxfRVJSNSBUT1ZGX0VSUjUKKyNkZWZpbmUgVE9WTF9FUlI2IFRPVkZfRVJSNgorI2RlZmluZSBUT1ZMX0VSUjcgVE9WRl9FUlI3CisKKy8qIFRJTUVSeF9DT05GSUcgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFdNX09VVAkJCTB4MDAwMQkvKiBQdWxzZS1XaWR0aCBNb2R1bGF0aW9uIE91dHB1dCBNb2RlCSovCisjZGVmaW5lIFdEVEhfQ0FQCQkweDAwMDIJLyogV2lkdGggQ2FwdHVyZSBJbnB1dCBNb2RlCQkJCSovCisjZGVmaW5lIEVYVF9DTEsJCQkweDAwMDMJLyogRXh0ZXJuYWwgQ2xvY2sgTW9kZQkJCQkJKi8KKyNkZWZpbmUgUFVMU0VfSEkJCTB4MDAwNAkvKiBBY3Rpb24gUHVsc2UgKFBvc2l0aXZlL05lZ2F0aXZlKikJKi8KKyNkZWZpbmUgUEVSSU9EX0NOVAkJMHgwMDA4CS8qIFBlcmlvZCBDb3VudAkJCQkJCQkqLworI2RlZmluZSBJUlFfRU5BCQkJMHgwMDEwCS8qIEludGVycnVwdCBSZXF1ZXN0IEVuYWJsZQkJCQkqLworI2RlZmluZSBUSU5fU0VMCQkJMHgwMDIwCS8qIFRpbWVyIElucHV0IFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgT1VUX0RJUwkJCTB4MDA0MAkvKiBPdXRwdXQgUGFkIERpc2FibGUJCQkJCSovCisjZGVmaW5lIENMS19TRUwJCQkweDAwODAJLyogVGltZXIgQ2xvY2sgU2VsZWN0CQkJCQkqLworI2RlZmluZSBUT0dHTEVfSEkJCTB4MDEwMAkvKiBQV01fT1VUIFBVTFNFX0hJIFRvZ2dsZSBNb2RlCQkJKi8KKyNkZWZpbmUgRU1VX1JVTgkJCTB4MDIwMAkvKiBFbXVsYXRpb24gQmVoYXZpb3IgU2VsZWN0CQkJKi8KKyNkZWZpbmUgRVJSX1RZUAkJCTB4QzAwMAkvKiBFcnJvciBUeXBlCQkJCQkJCSovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUJJVV9BTUdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEFNQ0tFTgkJCTB4MDAwMQkJLyogRW5hYmxlIENMS09VVAkJCQkJCQkJCSovCisjZGVmaW5lCUFNQkVOX05PTkUJCTB4MDAwMAkJLyogQWxsIEJhbmtzIERpc2FibGVkCQkJCQkJCQkqLworI2RlZmluZSBBTUJFTl9CMAkJMHgwMDAyCQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmsgMCBvbmx5CQkJCQkqLworI2RlZmluZSBBTUJFTl9CMF9CMQkJMHgwMDA0CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAgJiAxIG9ubHkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjBfQjFfQjIJMHgwMDA2CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyCQkJKi8KKyNkZWZpbmUgQU1CRU5fQUxMCQkweDAwMDgJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwgMiwgYW5kIDMJKi8KKworLyogRUJJVV9BTUJDVEwwIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIChCMCkgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCMFJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjAgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIwVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisjZGVmaW5lIEIxUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDEgKEIxKSBSRFkgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAJKi8KKyNkZWZpbmUgQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIxIFJEWSBBY3RpdmUgSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkqLworI2RlZmluZSBCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZSAJKi8KKyNkZWZpbmUgQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIxVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZSAgCSovCisjZGVmaW5lIEIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzIAkqLworI2RlZmluZSBCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMgCSovCisjZGVmaW5lIEIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlIAkqLworI2RlZmluZSBCMUhUXzIJCQkweDAwODAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjFIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIxSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMVJBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIxUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworLyogRUJJVV9BTUJDVEwxIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIChCMikgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjIgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMlRUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIySFRfMgkJCTB4MDAwMDAwODAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMkhUXzMJCQkweDAwMDAwMEMwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjJIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIyUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF80CQkJMHgwMDAwNDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF83CQkJMHgwMDAwNzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisjZGVmaW5lIEIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgKEIzKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMyBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIzVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIzSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCM0hUXzAJCQkweDAwMDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjNSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVCSVVfU0RHQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNDVExFCQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU0RSQU0gU2lnbmFscwkJCQkJCQkJCQkqLworI2RlZmluZSBDTF8yCQkJMHgwMDAwMDAwOAkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDIgY3ljbGVzCQkJCQkJCQkqLworI2RlZmluZSBDTF8zCQkJMHgwMDAwMDAwQwkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDMgY3ljbGVzCQkJCQkJCQkqLworI2RlZmluZSBQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJCSovCisjZGVmaW5lIFBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJKi8KKyNkZWZpbmUgUEFTUl9CMAkJCTB4MDAwMDAwMjAJLyogT25seSBTRFJBTSBCYW5rIDAgSXMgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCSovCisjZGVmaW5lIFRSQVNfMQkJCTB4MDAwMDAwNDAJLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18yCQkJMHgwMDAwMDA4MAkvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzMJCQkweDAwMDAwMEMwCS8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNAkJCTB4MDAwMDAxMDAJLyogU0RSQU0gdFJBUyA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU181CQkJMHgwMDAwMDE0MAkvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzYJCQkweDAwMDAwMTgwCS8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNwkJCTB4MDAwMDAxQzAJLyogU0RSQU0gdFJBUyA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU184CQkJMHgwMDAwMDIwMAkvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzkJCQkweDAwMDAwMjQwCS8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTAJCQkweDAwMDAwMjgwCS8qIFNEUkFNIHRSQVMgPSAxMCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzExCQkJMHgwMDAwMDJDMAkvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMgkJCTB4MDAwMDAzMDAJLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTMJCQkweDAwMDAwMzQwCS8qIFNEUkFNIHRSQVMgPSAxMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzE0CQkJMHgwMDAwMDM4MAkvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xNQkJCTB4MDAwMDAzQzAJLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8xCQkJMHgwMDAwMDgwMAkvKiBTRFJBTSB0UlAgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8yCQkJMHgwMDAwMTAwMAkvKiBTRFJBTSB0UlAgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMwkJCTB4MDAwMDE4MDAJLyogU0RSQU0gdFJQID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzQJCQkweDAwMDAyMDAwCS8qIFNEUkFNIHRSUCA9IDQgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF81CQkJMHgwMDAwMjgwMAkvKiBTRFJBTSB0UlAgPSA1IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNgkJCTB4MDAwMDMwMDAJLyogU0RSQU0gdFJQID0gNiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzcJCQkweDAwMDAzODAwCS8qIFNEUkFNIHRSUCA9IDcgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMQkJCTB4MDAwMDgwMDAJLyogU0RSQU0gdFJDRCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8yCQkJMHgwMDAxMDAwMAkvKiBTRFJBTSB0UkNEID0gMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzMJCQkweDAwMDE4MDAwCS8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNAkJCTB4MDAwMjAwMDAJLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF81CQkJMHgwMDAyODAwMAkvKiBTRFJBTSB0UkNEID0gNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzYJCQkweDAwMDMwMDAwCS8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNwkJCTB4MDAwMzgwMDAJLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzEJCQkweDAwMDgwMDAwCS8qIFNEUkFNIHRXUiA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzIJCQkweDAwMTAwMDAwCS8qIFNEUkFNIHRXUiA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8zCQkJMHgwMDE4MDAwMAkvKiBTRFJBTSB0V1IgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBQVVBTRAkJCTB4MDAyMDAwMDAJLyogUG93ZXItVXAgU3RhcnQgRGVsYXkgKDE1IFNDTEsgQ3ljbGVzIERlbGF5KQkJCQkqLworI2RlZmluZSBQU00JCQkJMHgwMDQwMDAwMAkvKiBQb3dlci1VcCBTZXF1ZW5jZSAoTW9kZSBSZWdpc3RlciBCZWZvcmUvQWZ0ZXIqIFJlZnJlc2gpCSovCisjZGVmaW5lIFBTUwkJCQkweDAwODAwMDAwCS8qIEVuYWJsZSBQb3dlci1VcCBTZXF1ZW5jZSBvbiBOZXh0IFNEUkFNIEFjY2VzcwkJCSovCisjZGVmaW5lIFNSRlMJCQkweDAxMDAwMDAwCS8qIEVuYWJsZSBTRFJBTSBTZWxmLVJlZnJlc2ggTW9kZQkJCQkJCQkqLworI2RlZmluZSBFQlVGRQkJCTB4MDIwMDAwMDAJLyogRW5hYmxlIEV4dGVybmFsIEJ1ZmZlcmluZyBUaW1pbmcJCQkJCQkJKi8KKyNkZWZpbmUgRkJCUlcJCQkweDA0MDAwMDAwCS8qIEVuYWJsZSBGYXN0IEJhY2stVG8tQmFjayBSZWFkIFRvIFdyaXRlCQkJCQkqLworI2RlZmluZSBFTVJFTgkJCTB4MTAwMDAwMDAJLyogRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgVENTUgkJCTB4MjAwMDAwMDAJLyogVGVtcC1Db21wZW5zYXRlZCBTZWxmLVJlZnJlc2ggVmFsdWUgKDg1LzQ1KiBEZWcgQykJCSovCisjZGVmaW5lIENEREJHCQkJMHg0MDAwMDAwMAkvKiBUcmlzdGF0ZSBTRFJBTSBDb250cm9scyBEdXJpbmcgQnVzIEdyYW50CQkJCQkqLworCisvKiBFQklVX1NEQkNUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEVCRQkJCQkweDAwMDEJCS8qIEVuYWJsZSBTRFJBTSBFeHRlcm5hbCBCYW5rCQkJCQkJCSovCisjZGVmaW5lIEVCU1pfMTYJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDE2TUIJKi8KKyNkZWZpbmUgRUJTWl8zMgkJCTB4MDAwMgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMzJNQgkqLworI2RlZmluZSBFQlNaXzY0CQkJMHgwMDA0CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA2NE1CCSovCisjZGVmaW5lIEVCU1pfMTI4CQkweDAwMDYJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDEyOE1CCQkqLworI2RlZmluZSBFQlNaXzI1NgkJMHgwMDA4CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAyNTZNQiAJKi8KKyNkZWZpbmUgRUJTWl81MTIJCTB4MDAwQQkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIJCSovCisjZGVmaW5lIEVCQ0FXXzgJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA4IEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfOQkJCTB4MDAxMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDkgQml0cwkqLworI2RlZmluZSBFQkNBV18xMAkJMHgwMDIwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTAgQml0cwkqLworI2RlZmluZSBFQkNBV18xMQkJMHgwMDMwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTEgQml0cwkqLworCisvKiBFQklVX1NEU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0RDSQkJCTB4MDAwMQkJLyogU0RSQU0gQ29udHJvbGxlciBJZGxlIAkJCQkqLworI2RlZmluZSBTRFNSQQkJCTB4MDAwMgkJLyogU0RSQU0gU2VsZi1SZWZyZXNoIEFjdGl2ZQkJCSovCisjZGVmaW5lIFNEUFVBCQkJMHgwMDA0CQkvKiBTRFJBTSBQb3dlci1VcCBBY3RpdmUgCQkJCSovCisjZGVmaW5lIFNEUlMJCQkweDAwMDgJCS8qIFNEUkFNIFdpbGwgUG93ZXItVXAgT24gTmV4dCBBY2Nlc3MJKi8KKyNkZWZpbmUgU0RFQVNFCQkJMHgwMDEwCQkvKiBTRFJBTSBFQUIgU3RpY2t5IEVycm9yIFN0YXR1cwkJKi8KKyNkZWZpbmUgQkdTVEFUCQkJMHgwMDIwCQkvKiBCdXMgR3JhbnQgU3RhdHVzCQkJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBETUF4X1BFUklQSEVSQUxfTUFQLCBNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzCQkJCQkJCQkqLworI2RlZmluZSBDVFlQRQkJCTB4MDA0MAkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciAoTWVtb3J5L1BlcmlwaGVyYWwqKQkqLworI2RlZmluZSBQTUFQCQkJMHhGMDAwCS8qIFBlcmlwaGVyYWwgTWFwcGVkIFRvIFRoaXMgQ2hhbm5lbAkJCQkqLworI2RlZmluZSBQTUFQX1BQSQkJMHgwMDAwCS8qIAkJUFBJIFBvcnQgRE1BCQkJCQkJCQkqLworI2RlZmluZQlQTUFQX0VNQUNSWAkJMHgxMDAwCS8qIAkJRXRoZXJuZXQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX0VNQUNUWAkJMHgyMDAwCS8qIAkJRXRoZXJuZXQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDBSWAkweDMwMDAJLyogCQlTUE9SVDAgUmVjZWl2ZSBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDBUWAkweDQwMDAJLyogCQlTUE9SVDAgVHJhbnNtaXQgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQxUlgJMHg1MDAwCS8qIAkJU1BPUlQxIFJlY2VpdmUgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQxVFgJMHg2MDAwCS8qIAkJU1BPUlQxIFRyYW5zbWl0IERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQSQkJMHg3MDAwCS8qIAkJU1BJIFBvcnQgRE1BCQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1VBUlQwUlgJMHg4MDAwCS8qIAkJVUFSVDAgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfVUFSVDBUWAkweDkwMDAJLyogCQlVQVJUMCBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCisjZGVmaW5lCVBNQVBfVUFSVDFSWAkweEEwMDAJLyogCQlVQVJUMSBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVRYCTB4QjAwMAkvKiAJCVVBUlQxIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKworLyogICoqKioqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKi8KKy8qICBQUElfQ09OVFJPTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUX0VOCQkJMHgwMDAxCQkvKiBQUEkgUG9ydCBFbmFibGUJCQkJCSovCisjZGVmaW5lIFBPUlRfRElSCQkweDAwMDIJCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkJCQkqLworI2RlZmluZSBYRlJfVFlQRQkJMHgwMDBDCQkvKiBQUEkgVHJhbnNmZXIgVHlwZQkJCQkqLworI2RlZmluZSBQT1JUX0NGRwkJMHgwMDMwCQkvKiBQUEkgUG9ydCBDb25maWd1cmF0aW9uCQkJKi8KKyNkZWZpbmUgRkxEX1NFTAkJCTB4MDA0MAkJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QJCQkqLworI2RlZmluZSBQQUNLX0VOCQkJMHgwMDgwCQkvKiBQUEkgUGFja2luZyBNb2RlCQkJCQkqLworI2RlZmluZSBETUEzMgkJCTB4MDEwMAkJLyogUFBJIDMyLWJpdCBETUEgRW5hYmxlCQkJKi8KKyNkZWZpbmUgU0tJUF9FTgkJCTB4MDIwMAkJLyogUFBJIFNraXAgRWxlbWVudCBFbmFibGUJCQkqLworI2RlZmluZSBTS0lQX0VPCQkJMHgwNDAwCQkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cwkJKi8KKyNkZWZpbmUgRExFTl84CQkJMHgwMDAwCQkvKiBEYXRhIExlbmd0aCA9IDggQml0cwkJCQkqLworI2RlZmluZSBETEVOXzEwCQkJMHgwODAwCQkvKiBEYXRhIExlbmd0aCA9IDEwIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzExCQkJMHgxMDAwCQkvKiBEYXRhIExlbmd0aCA9IDExIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzEyCQkJMHgxODAwCQkvKiBEYXRhIExlbmd0aCA9IDEyIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzEzCQkJMHgyMDAwCQkvKiBEYXRhIExlbmd0aCA9IDEzIEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE0CQkJMHgyODAwCQkvKiBEYXRhIExlbmd0aCA9IDE0IEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE1CQkJMHgzMDAwCQkvKiBEYXRhIExlbmd0aCA9IDE1IEJpdHMJCQkqLworI2RlZmluZSBETEVOXzE2CQkJMHgzODAwCQkvKiBEYXRhIExlbmd0aCA9IDE2IEJpdHMJCQkqLworI2RlZmluZSBETEVOR1RICQkJMHgzODAwCQkvKiBQUEkgRGF0YSBMZW5ndGggICovCisjZGVmaW5lIFBPTEMJCQkweDQwMDAJCS8qIFBQSSBDbG9jayBQb2xhcml0eQkJCQkqLworI2RlZmluZSBQT0xTCQkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eQkJCSovCisKKy8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEZMRAkJCQkweDA0MDAJCS8qIEZpZWxkIEluZGljYXRvcgkJCQkJKi8KKyNkZWZpbmUgRlRfRVJSCQkJMHgwODAwCQkvKiBGcmFtZSBUcmFjayBFcnJvcgkJCQkqLworI2RlZmluZSBPVlIJCQkJMHgxMDAwCQkvKiBGSUZPIE92ZXJmbG93IEVycm9yCQkJCSovCisjZGVmaW5lIFVORFIJCQkweDIwMDAJCS8qIEZJRk8gVW5kZXJydW4gRXJyb3IJCQkJKi8KKyNkZWZpbmUgRVJSX0RFVAkJCTB4NDAwMAkJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yCQkJKi8KKyNkZWZpbmUgRVJSX05DT1IJCTB4ODAwMAkJLyogRXJyb3IgTm90IENvcnJlY3RlZCBJbmRpY2F0b3IJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqKiogIFRXTy1XSVJFIElOVEVSRkFDRSAoVFdJKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUV0lfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSV9DTEtESVYgPSBDTEtMT1coeCl8Q0xLSEkoeSk7ICApCQkJCSovCisjZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cJCQkqLworI2RlZmluZSBDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93CQkJKi8KKworLyogVFdJX1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KQkqLworI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IgQ29tcGF0aWJpbGl0eSBFbmFibGUJCQkJCSovCisKKy8qIFRXSV9TTEFWRV9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGgJCQkJCQkJKi8KKyNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQJCQkJCSovCisjZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwgQWRycmVzcyBNYXRjaGluZyBFbmFibGVkCQkqLworCisvKiBUV0lfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikJKi8KKyNkZWZpbmUgR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsIEluZGljYXRvcgkJCQkJCSovCisKKy8qIFRXSV9NQVNURVJfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlCQkJCQkJKi8KKyNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGgJCQkJCSovCisjZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKQkJKi8KKyNkZWZpbmUJRkFTVAkJMHgwMDA4CQkvKiBVc2UgRmFzdCBNb2RlIFRpbWluZyBTcGVjcwkJCQkqLworI2RlZmluZQlTVE9QCQkweDAwMTAJCS8qIElzc3VlIFN0b3AgQ29uZGl0aW9uCQkJCQkJKi8KKyNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydCBvciBTdG9wKiBBdCBFbmQgT2YgVHJhbnNmZXIJKi8KKyNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhIEJ5dGVzIFRvIFRyYW5zZmVyCQkJCQkqLworI2RlZmluZQlTREFPVlIJCTB4NDAwMAkJLyogU2VyaWFsIERhdGEgT3ZlcnJpZGUJCQkJCQkqLworI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrIE92ZXJyaWRlCQkJCQkqLworCisvKiBUV0lfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcwkJCQkJKi8KKyNkZWZpbmUJTE9TVEFSQgkJMHgwMDAyCQkvKiBMb3N0IEFyYml0cmF0aW9uIEluZGljYXRvciAoWGZlciBBYm9ydGVkKQkqLworI2RlZmluZQlBTkFLCQkweDAwMDQJCS8qIEFkZHJlc3MgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCisjZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YSBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KKyNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvcgkJCQkJCQkqLworI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZSBFcnJvcgkJCQkJCQkqLworI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UJCQkJCQkJKi8KKyNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jayBTZW5zZQkJCQkJCQkqLworI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvcgkJCQkJCQkqLworCisvKiBUV0lfSU5UX1NSQyBhbmQgVFdJX0lOVF9FTkFCTEUgTWFza3MJCQkJCQkqLworI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQJKi8KKyNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUJKi8KKyNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvcgkJKi8KKyNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdwkJCSovCisjZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZQkqLworI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvcgkqLworI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZQkqLworI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlCQkqLworCisvKiBUV0lfRklGT19DVFJMIE1hc2tzCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2gJCQkqLworI2RlZmluZQlSQ1ZGTFVTSAkweDAwMDIJCS8qIFJlY2VpdmUgQnVmZmVyIEZsdXNoCQkJCSovCisjZGVmaW5lCVhNVElOVExFTgkweDAwMDQJCS8qIFRyYW5zbWl0IEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCisjZGVmaW5lCVJDVklOVExFTgkweDAwMDgJCS8qIFJlY2VpdmUgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KKworLyogVFdJX0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyogCQlUcmFuc21pdCBGSUZPIEVtcHR5CQkJCQkJKi8KKyNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKiAJCVRyYW5zbWl0IEZJRk8gSGFzIDEgQnl0ZSBUbyBXcml0ZQkJKi8KKyNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKiAJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkJKi8KKworI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTyBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyogCQlSZWNlaXZlIEZJRk8gRW1wdHkJCQkJCQkqLworI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qIAkJUmVjZWl2ZSBGSUZPIEhhcyAxIEJ5dGUgVG8gUmVhZAkJCSovCisjZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyogCQlSZWNlaXZlIEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBSZWFkKQkJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqKiAgUElOIENPTlRST0wgUkVHSVNURVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBPUlRfTVVYIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUEpTRQkJCTB4MDAwMQkJCS8qIFBvcnQgSiBTUEkvU1BPUlQgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEpTRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVEZTMC9EVDBQUkkJCQkqLworI2RlZmluZQlQSlNFX1NQSQkJMHgwMDAxCQkJLyogCQlFbmFibGUgU1BJX1NTRUwzOjIJCQkqLworCisjZGVmaW5lCVBKQ0UoeCkJCQkoKCh4KSYweDMpPDwxKQkvKiBQb3J0IEogQ0FOL1NQSS9TUE9SVCBFbmFibGUJCSovCisjZGVmaW5lCVBKQ0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIERSMFNFQy9EVDBTRUMJCSovCisjZGVmaW5lCVBKQ0VfQ0FOCQkweDAwMDIJCQkvKiAJCUVuYWJsZSBDQU4gUlgvVFgJCQkqLworI2RlZmluZQlQSkNFX1NQSQkJMHgwMDA0CQkJLyogCQlFbmFibGUgU1BJX1NTRUw3CQkJKi8KKworI2RlZmluZQlQRkRFCQkJMHgwMDA4CQkJLyogUG9ydCBGIERNQSBSZXF1ZXN0IEVuYWJsZQkJKi8KKyNkZWZpbmUJUEZERV9VQVJUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBVQVJUMCBSWC9UWAkJCSovCisjZGVmaW5lCVBGREVfRE1BCQkweDAwMDgJCQkvKiAJCUVuYWJsZSBETUFSMTowCQkJCSovCisKKyNkZWZpbmUJUEZURQkJCTB4MDAxMAkJCS8qIFBvcnQgRiBUaW1lciBFbmFibGUJCQkJKi8KKyNkZWZpbmUJUEZURV9VQVJUCQkweDAwMDAJCQkvKgkJRW5hYmxlIFVBUlQxIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEZURV9USU1FUgkJMHgwMDEwCQkJLyogCQlFbmFibGUgVE1SNzo2CQkJCSovCisKKyNkZWZpbmUJUEZTNkUJCQkweDAwMjAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNiBFbmFibGUJCQkqLworI2RlZmluZQlQRlM2RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI1CQkJCQkqLworI2RlZmluZQlQRlM2RV9TUEkJCTB4MDAyMAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNgkJCSovCisKKyNkZWZpbmUJUEZTNUUJCQkweDAwNDAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNSBFbmFibGUJCQkqLworI2RlZmluZQlQRlM1RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI0CQkJCQkqLworI2RlZmluZQlQRlM1RV9TUEkJCTB4MDA0MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNQkJCSovCisKKyNkZWZpbmUJUEZTNEUJCQkweDAwODAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNCBFbmFibGUJCQkqLworI2RlZmluZQlQRlM0RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVIzCQkJCQkqLworI2RlZmluZQlQRlM0RV9TUEkJCTB4MDA4MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNAkJCSovCisKKyNkZWZpbmUJUEZGRQkJCTB4MDEwMAkJCS8qIFBvcnQgRiBQUEkgRnJhbWUgU3luYyBFbmFibGUJCSovCisjZGVmaW5lCVBGRkVfVElNRVIJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRNUjIJCQkJCSovCisjZGVmaW5lCVBGRkVfUFBJCQkweDAxMDAJCQkvKiAJCUVuYWJsZSBQUEkgRlMzCQkJCSovCisKKyNkZWZpbmUJUEdTRQkJCTB4MDIwMAkJCS8qIFBvcnQgRyBTUE9SVDEgU2Vjb25kYXJ5IEVuYWJsZQkqLworI2RlZmluZQlQR1NFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQ5OjgJCQkJKi8KKyNkZWZpbmUJUEdTRV9TUE9SVAkJMHgwMjAwCQkJLyogCQlFbmFibGUgRFIxU0VDL0RUMVNFQwkJKi8KKworI2RlZmluZQlQR1JFCQkJMHgwNDAwCQkJLyogUG9ydCBHIFNQT1JUMSBSZWNlaXZlIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEdSRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTI6MTAJCQkqLworI2RlZmluZQlQR1JFX1NQT1JUCQkweDA0MDAJCQkvKiAJCUVuYWJsZSBEUjFQUkkvUkZTMS9SU0NMSzEJKi8KKworI2RlZmluZQlQR1RFCQkJMHgwODAwCQkJLyogUG9ydCBHIFNQT1JUMSBUcmFuc21pdCBFbmFibGUJKi8KKyNkZWZpbmUJUEdURV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTU6MTMJCQkqLworI2RlZmluZQlQR1RFX1NQT1JUCQkweDA4MDAJCQkvKiAJCUVuYWJsZSBEVDFQUkkvVEZTMS9UU0NMSzEJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqICBIQU5EU0hBS0UgRE1BIChIRE1BKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLworLyogSERNQXhfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlITURNQUVOCQkweDAwMDEJLyogRW5hYmxlIEhhbmRzaGFrZSBETUEgMC8xCQkJCQkqLworI2RlZmluZQlSRVAJCQkweDAwMDIJLyogSERNQSBSZXF1ZXN0IFBvbGFyaXR5CQkJCQkqLworI2RlZmluZQlVVEUJCQkweDAwMDQJLyogVXJnZW5jeSBUaHJlc2hvbGQgRW5hYmxlCQkJCQkqLworI2RlZmluZQlPSUUJCQkweDAwMTAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZQkJCQkqLworI2RlZmluZQlCRElFCQkweDAwMjAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCisjZGVmaW5lCU1CREkJCTB4MDA0MAkvKiBNYXNrIEJsb2NrIERvbmUgSVJRIElmIFBlbmRpbmcgRUNOVAkJKi8KKyNkZWZpbmUJRFJRCQkJMHgwMzAwCS8qIEhETUEgUmVxdWVzdCBUeXBlCQkJCQkJKi8KKyNkZWZpbmUJRFJRX05PTkUJMHgwMDAwCS8qIAkJTm8gUmVxdWVzdAkJCQkJCQkqLworI2RlZmluZQlEUlFfU0lOR0xFCTB4MDEwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgU2luZ2xlCQkJCSovCisjZGVmaW5lCURSUV9NVUxUSQkweDAyMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIChEZWZhdWx0KQkqLworI2RlZmluZQlEUlFfVVJHRU5UCTB4MDMwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgVXJnZW50CQkqLworI2RlZmluZQlSQkMJCQkweDEwMDAJLyogUmVsb2FkIEJDTlQgV2l0aCBJQkNOVAkJCQkJKi8KKyNkZWZpbmUJUFMJCQkweDIwMDAJLyogSERNQSBQaW4gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCU9JCQkJMHg0MDAwCS8qIE92ZXJmbG93IEludGVycnVwdCBHZW5lcmF0ZWQJCQkJKi8KKyNkZWZpbmUJQkRJCQkJMHg4MDAwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEdlbmVyYXRlZAkJCSovCisKKy8qIGVudHJ5IGFkZHJlc3NlcyBvZiB0aGUgdXNlci1jYWxsYWJsZSBCb290IFJPTSBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBfQk9PVFJPTV9SRVNFVCAweEVGMDAwMDAwCisjZGVmaW5lIF9CT09UUk9NX0ZJTkFMX0lOSVQgMHhFRjAwMDAwMgorI2RlZmluZSBfQk9PVFJPTV9ET19NRU1PUllfRE1BIDB4RUYwMDAwMDYKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfRkxBU0ggMHhFRjAwMDAwOAorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9TUEkgMHhFRjAwMDAwQQorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9UV0kgMHhFRjAwMDAwQworI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfRkxBU0ggMHhFRjAwMDAxMAorI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfU1BJIDB4RUYwMDAwMTIKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1RXSSAweEVGMDAwMDE0CisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlQR0RFX1VBUlQgICBQRkRFX1VBUlQKKyNkZWZpbmUJUEdERV9ETUEgICAgUEZERV9ETUEKKyNkZWZpbmUJQ0tFTE9XCQlTQ0tFTE9XCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ09OVFJPTCAgMHhmZmMwMzQwMCAgIC8qIEhPU1QgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRVUyAgMHhmZmMwMzQwNCAgIC8qIEhPU1QgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9USU1FT1VUICAweGZmYzAzNDA4ICAgLyogSE9TVCBBY2tub3dsZWRnZSBNb2RlIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKworLyogQ291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTkZJRyAgMHhmZmMwMzUwMCAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBDTlRfSU1BU0sgIDB4ZmZjMDM1MDQgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX1NUQVRVUyAgMHhmZmMwMzUwOCAgIC8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09NTUFORCAgMHhmZmMwMzUwYyAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTlRfREVCT1VOQ0UgIDB4ZmZjMDM1MTAgICAvKiBEZWJvdW5jZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09VTlRFUiAgMHhmZmMwMzUxNCAgIC8qIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NQVggIDB4ZmZjMDM1MTggICAvKiBNYXhpbWFsIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUlOICAweGZmYzAzNTFjICAgLyogTWluaW1hbCBDb3VudCBSZWdpc3RlciAqLworCisvKiBPVFAvRlVTRSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBPVFBfQ09OVFJPTCAgMHhmZmMwMzYwMCAgIC8qIE9UUC9GdXNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9CRU4gIDB4ZmZjMDM2MDQgICAvKiBPVFAvRnVzZSBCeXRlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1NUQVRVUyAgMHhmZmMwMzYwOCAgIC8qIE9UUC9GdXNlIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1RJTUlORyAgMHhmZmMwMzYwYyAgIC8qIE9UUC9GdXNlIEFjY2VzcyBUaW1pbmcgKi8KKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TWVNTV1QgIDB4ZmZjMDM2MjAgICAvKiBTZWN1cmUgU3lzdGVtIFN3aXRjaGVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9DT05UUk9MICAweGZmYzAzNjI0ICAgLyogU2VjdXJlIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TVEFUVVMgIDB4ZmZjMDM2MjggICAvKiBTZWN1cmUgU3RhdHVzICovCisKKy8qIE9UUCBSZWFkL1dyaXRlIERhdGEgQnVmZmVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEwICAweGZmYzAzNjgwICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEExICAweGZmYzAzNjg0ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEyICAweGZmYzAzNjg4ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEzICAweGZmYzAzNjhjICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisKKy8qIE1vdG9yIENvbnRyb2wgUFdNIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DVFJMICAweGZmYzAzNzAwICAgLyogUFdNIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NUQVQgIDB4ZmZjMDM3MDQgICAvKiBQV00gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1RNICAweGZmYzAzNzA4ICAgLyogUFdNIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9EVCAgMHhmZmMwMzcwYyAgIC8qIFBXTSBEZWFkIFRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0dBVEUgIDB4ZmZjMDM3MTAgICAvKiBQV00gQ2hvcHBpbmcgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQSAgMHhmZmMwMzcxNCAgIC8qIFBXTSBDaGFubmVsIEEgRHV0eSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hCICAweGZmYzAzNzE4ICAgLyogUFdNIENoYW5uZWwgQiBEdXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEMgIDB4ZmZjMDM3MWMgICAvKiBQV00gQ2hhbm5lbCBDIER1dHkgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NFRyAgMHhmZmMwMzcyMCAgIC8qIFBXTSBDcm9zc292ZXIgYW5kIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TWU5DV1QgIDB4ZmZjMDM3MjQgICAvKiBQV00gU3luYyBQbHVzZSBXaWR0aCBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEFMICAweGZmYzAzNzI4ICAgLyogUFdNIENoYW5uZWwgQUwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEJMICAweGZmYzAzNzJjICAgLyogUFdNIENoYW5uZWwgQkwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSENMICAweGZmYzAzNzMwICAgLyogUFdNIENoYW5uZWwgQ0wgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fTFNJICAweGZmYzAzNzM0ICAgLyogUFdNIExvdyBTaWRlIEludmVydCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TVEFUMiAgMHhmZmMwMzczOCAgIC8qIFBXTSBTdGF0dXMgUmVnaXN0ZXIgMiAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KKy8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQml0IG1hc2tzIGZvciBIT1NUX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTiAgMHgxICAgICAgICAvKiBIb3N0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU5EICAweDIgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU5EICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9EQVRBX1NJWkUgIDB4NCAgICAgICAgLyogRGF0YSBTaXplICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uREFUQV9TSVpFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9SU1QgIDB4OCAgICAgICAgLyogSG9zdCBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX1JTVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hSRFlfT1ZSICAweDIwICAgICAgIC8qIEhvc3QgUmVhZHkgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSFJEWV9PVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9JTlRfTU9ERSAgMHg0MCAgICAgICAvKiBJbnRlcnJ1cHQgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25JTlRfTU9ERSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JUX0VOICAweDgwICAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfIG5CVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhXICAweDEwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFdyaXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhXICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFIgIDB4MjAwICAgICAgLyogRW5hYmxlIEhvc3QgUmVhZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQkRSICAweDQwMCAgICAgIC8qIEJ1cnN0IERNQSBSZXF1ZXN0cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkJEUiAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9SRUFEWSAgMHgxICAgICAgICAvKiBETUEgUmVhZHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uUkVBRFkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRlVMTCAgMHgyICAgICAgICAvKiBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0ZVTEwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9FTVBUWSAgMHg0ICAgICAgICAvKiBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0VNUFRZICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQ09NUExFVEUgIDB4OCAgICAgICAgLyogRE1BIENvbXBsZXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkNPTVBMRVRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hTSEsgIDB4MTAgICAgICAgLyogSG9zdCBIYW5kc2hha2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhTSEsgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfVElNRU9VVCAgMHgyMCAgICAgICAvKiBIb3N0IFRpbWVvdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblRJTUVPVVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSElSUSAgMHg0MCAgICAgICAvKiBIb3N0IEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ISVJRICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0FMTE9XX0NORkcgIDB4ODAgICAgICAgLyogQWxsb3cgTmV3IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkFMTE9XX0NORkcgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRE1BX0RJUiAgMHgxMDAgICAgICAvKiBETUEgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ETUFfRElSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9CVEUgIDB4MjAwICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkJURSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hPU1RSRF9ET05FICAweDgwMDAgICAgIC8qIEhvc3QgUmVhZCBDb21wbGV0aW9uIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgSE9TVF9TVEFUX25IT1NUUkRfRE9ORSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9USU1FT1VUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgSE9TVF9DT1VOVF9USU1FT1VUICAweDdmZiAgICAgIC8qIEhvc3QgVGltZW91dCBjb3VudCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TWVNTV1QgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFTVVEQUJMICAweDEgICAgICAgIC8qIEVtdWxhdGlvbiBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5FTVVEQUJMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUlNUREFCTCAgMHgyICAgICAgICAvKiBSZXNldCBEaXNhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblJTVERBQkwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBMMUlEQUJMICAweDFjICAgICAgIC8qIEwxIEluc3RydWN0aW9uIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREFEQUJMICAweGUwICAgICAgIC8qIEwxIERhdGEgQmFuayBBIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREJEQUJMICAweDcwMCAgICAgIC8qIEwxIERhdGEgQmFuayBCIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUEwT1ZSICAweDgwMCAgICAgIC8qIERNQTAgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUEwT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BMU9WUiAgMHgxMDAwICAgICAvKiBETUExIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BMU9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFTVVPVlIgIDB4NDAwMCAgICAgLyogRW11bGF0aW9uIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5FTVVPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgT1RQU0VOICAweDgwMDAgICAgIC8qIE9UUCBTZWNyZXRzIEVuYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk9UUFNFTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBMMkRBQkwgIDB4NzAwMDAgICAgLyogTDIgTWVtb3J5IERpc2FibGUuICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUwICAweDEgICAgICAgIC8qIFNFQ1VSRSAwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTAgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUxICAweDIgICAgICAgIC8qIFNFQ1VSRSAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTEgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUyICAweDQgICAgICAgIC8qIFNFQ1VSRSAyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUzICAweDggICAgICAgIC8qIFNFQ1VSRSAzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTMgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNNT0RFICAweDMgICAgICAgIC8qIFNlY3VyZWQgTW9kZSBDb250cm9sIFN0YXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBOTUkgIDB4NCAgICAgICAgLyogTm9uIE1hc2thYmxlIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBuTk1JICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQUZWQUxJRCAgMHg4ICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBWYWxpZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5BRlZBTElEICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEFGRVhJVCAgMHgxMCAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBFeGl0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5BRkVYSVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNTVEFUICAweGUwICAgICAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KIAogI2VuZGlmIC8qIF9ERUZfQkY1MTJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NDkxMy4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCi0gKi8KLQotI2lmbmRlZiBfREVGX0JGNTFYX0gKLSNkZWZpbmUgX0RFRl9CRjUxWF9ICi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICAgU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgQ09NTU9OIFRPIEFMTCBBRFNQLUJGNTF4ICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgUExMX0NUTAkJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUExMX0RJVgkJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBWUl9DVEwJCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBMTF9TVEFUCQkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUExMX0xPQ0tDTlQJCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBDSElQSUQJCQkJMHhGRkMwMDAxNAkvKiBEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KLQotLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJCSovCi0jZGVmaW5lIFNXUlNUCQkJCTB4RkZDMDAxMDAJLyogU29mdHdhcmUgUmVzZXQgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNZU0NSCQkJCTB4RkZDMDAxMDQJLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgU0lDX1JWRUNUCQkJMHhGRkMwMDEwOAkvKiBJbnRlcnJ1cHQgUmVzZXQgVmVjdG9yIEFkZHJlc3MgUmVnaXN0ZXIJCQkqLwotCi0jZGVmaW5lIFNJQ19JTUFTSzAJCQkweEZGQzAwMTBDCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTSUNfSUFSMAkJCTB4RkZDMDAxMTAJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMAkJCQkqLwotI2RlZmluZSBTSUNfSUFSMQkJCTB4RkZDMDAxMTQJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMQkJCQkqLwotI2RlZmluZSBTSUNfSUFSMgkJCTB4RkZDMDAxMTgJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMgkJCQkqLwotI2RlZmluZSBTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMwkJCQkqLwotI2RlZmluZSBTSUNfSVNSMAkJCTB4RkZDMDAxMjAJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU0lDX0lXUjAJCQkweEZGQzAwMTI0CS8qIEludGVycnVwdCBXYWtldXAgUmVnaXN0ZXIJCQkJCSovCi0KLS8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUxeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCi0jZGVmaW5lIFNJQ19JTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE0QyAgICAgLyogSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgb2YgU0lDMiAqLwotI2RlZmluZSBTSUNfSUFSNCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTAgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNCAqLwotI2RlZmluZSBTSUNfSUFSNSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTQgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNSAqLwotI2RlZmluZSBTSUNfSUFSNiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTggICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNiAqLwotI2RlZmluZSBTSUNfSUFSNyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNUMgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNyAqLwotI2RlZmluZSBTSUNfSVNSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjAgICAgIC8qIEludGVycnVwdCBTdGF0dXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0lDX0lXUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTY0ICAgICAvKiBJbnRlcnJ1cHQgV2FrZXVwIHJlZ2lzdGVyICovCi0KLQotLyogV2F0Y2hkb2cgVGltZXIJCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkqLwotI2RlZmluZSBXRE9HX0NUTAkJCTB4RkZDMDAyMDAJLyogV2F0Y2hkb2cgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBXRE9HX0NOVAkJCTB4RkZDMDAyMDQJLyogV2F0Y2hkb2cgQ291bnQgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFdET0dfU1RBVAkJCTB4RkZDMDAyMDgJLyogV2F0Y2hkb2cgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIFJUQ19TVEFUCQkJMHhGRkMwMDMwMAkvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUlRDX0lDVEwJCQkweEZGQzAwMzA0CS8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFJUQ19JU1RBVAkJCTB4RkZDMDAzMDgJLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBSVENfU1dDTlQJCQkweEZGQzAwMzBDCS8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUlRDX0FMQVJNCQkJMHhGRkMwMDMxMAkvKiBSVEMgQWxhcm0gVGltZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUlRDX0ZBU1QJCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUlRDX1BSRU4JCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIEFsdGVybmF0ZSBNYWNybwkJKi8KLQotCi0vKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfVEhSCQkJMHhGRkMwMDQwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQwX1JCUgkJCTB4RkZDMDA0MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX0RMTAkJCTB4RkZDMDA0MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCQkqLwotI2RlZmluZSBVQVJUMF9JRVIJCQkweEZGQzAwNDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDBfRExICQkJMHhGRkMwMDQwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpCQkJCSovCi0jZGVmaW5lIFVBUlQwX0lJUgkJCTB4RkZDMDA0MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBVQVJUMF9MQ1IJCQkweEZGQzAwNDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfTUNSCQkJMHhGRkMwMDQxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMF9MU1IJCQkweEZGQzAwNDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfTVNSCQkJMHhGRkMwMDQxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX1NDUgkJCTB4RkZDMDA0MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBVQVJUMF9HQ1RMCQkJMHhGRkMwMDQyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLQotLyogU1BJMCBDb250cm9sbGVyCQkJKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKQkJCQkJCQkqLwotI2RlZmluZSBTUEkwX1JFR0JBU0UJCQkweEZGQzAwNTAwCi0jZGVmaW5lIFNQSTBfQ1RMCQkJMHhGRkMwMDUwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTBfRkxHCQkJMHhGRkMwMDUwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTBfU1RBVAkJCTB4RkZDMDA1MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTBfVERCUgkJCTB4RkZDMDA1MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFNQSTBfUkRCUgkJCTB4RkZDMDA1MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgU1BJMF9CQVVECQkJMHhGRkMwMDUxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUEkwX1NIQURPVwkJCTB4RkZDMDA1MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLwotCi0vKiBTUEkxIENvbnRyb2xsZXIJCQkoMHhGRkMwMzQwMCAtIDB4RkZDMDM0RkYpCQkJCQkJCSovCi0jZGVmaW5lIFNQSTFfUkVHQkFTRQkJCTB4RkZDMDM0MDAKLSNkZWZpbmUgU1BJMV9DVEwJCQkweEZGQzAzNDAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BJMV9GTEcJCQkweEZGQzAzNDA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BJMV9TVEFUCQkJMHhGRkMwMzQwOAkvKiBTUEkgU3RhdHVzIHJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BJMV9UREJSCQkJMHhGRkMwMzQwQwkvKiBTUEkgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgU1BJMV9SREJSCQkJMHhGRkMwMzQxMAkvKiBTUEkgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBTUEkxX0JBVUQJCQkweEZGQzAzNDE0CS8qIFNQSSBCYXVkIHJhdGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNQSTFfU0hBRE9XCQkJMHhGRkMwMzQxOAkvKiBTUElfUkRCUiBTaGFkb3cgUmVnaXN0ZXIJCQkJCSovCi0KLS8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNRVIwX0NPTkZJRwkJMHhGRkMwMDYwMAkvKiBUaW1lciAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUSU1FUjBfQ09VTlRFUgkJMHhGRkMwMDYwNAkvKiBUaW1lciAwIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSMF9QRVJJT0QJCTB4RkZDMDA2MDgJLyogVGltZXIgMCBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSMF9XSURUSAkJMHhGRkMwMDYwQwkvKiBUaW1lciAwIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLwotCi0jZGVmaW5lIFRJTUVSMV9DT05GSUcJCTB4RkZDMDA2MTAJLyogVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjFfQ09VTlRFUgkJMHhGRkMwMDYxNAkvKiBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMV9QRVJJT0QJCTB4RkZDMDA2MTgJLyogVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjFfV0lEVEgJCTB4RkZDMDA2MUMJLyogVGltZXIgMSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSMl9DT05GSUcJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjJfQ09VTlRFUgkJMHhGRkMwMDYyNAkvKiBUaW1lciAyIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMl9QRVJJT0QJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjJfV0lEVEgJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSM19DT05GSUcJCTB4RkZDMDA2MzAJLyogVGltZXIgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVElNRVIzX0NPVU5URVIJCTB4RkZDMDA2MzQJLyogVGltZXIgMyBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjNfUEVSSU9ECQkweEZGQzAwNjM4CS8qIFRpbWVyIDMgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjNfV0lEVEgJCTB4RkZDMDA2M0MJLyogVGltZXIgMyBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KLQotI2RlZmluZSBUSU1FUjRfQ09ORklHCQkweEZGQzAwNjQwCS8qIFRpbWVyIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI0X0NPVU5URVIJCTB4RkZDMDA2NDQJLyogVGltZXIgNCBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjRfUEVSSU9ECQkweEZGQzAwNjQ4CS8qIFRpbWVyIDQgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI0X1dJRFRICQkweEZGQzAwNjRDCS8qIFRpbWVyIDQgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjVfQ09ORklHCQkweEZGQzAwNjUwCS8qIFRpbWVyIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI1X0NPVU5URVIJCTB4RkZDMDA2NTQJLyogVGltZXIgNSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjVfUEVSSU9ECQkweEZGQzAwNjU4CS8qIFRpbWVyIDUgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI1X1dJRFRICQkweEZGQzAwNjVDCS8qIFRpbWVyIDUgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjZfQ09ORklHCQkweEZGQzAwNjYwCS8qIFRpbWVyIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI2X0NPVU5URVIJCTB4RkZDMDA2NjQJLyogVGltZXIgNiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjZfUEVSSU9ECQkweEZGQzAwNjY4CS8qIFRpbWVyIDYgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI2X1dJRFRICQkweEZGQzAwNjZDCS8qIFRpbWVyIDYgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjdfQ09ORklHCQkweEZGQzAwNjcwCS8qIFRpbWVyIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI3X0NPVU5URVIJCTB4RkZDMDA2NzQJLyogVGltZXIgNyBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjdfUEVSSU9ECQkweEZGQzAwNjc4CS8qIFRpbWVyIDcgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI3X1dJRFRICQkweEZGQzAwNjdDCS8qIFRpbWVyIDcgV2lkdGggUmVnaXN0ZXIgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUl9FTkFCTEUJCTB4RkZDMDA2ODAJLyogVGltZXIgRW5hYmxlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUl9ESVNBQkxFCQkweEZGQzAwNjg0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSX1NUQVRVUwkJMHhGRkMwMDY4OAkvKiBUaW1lciBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JURklPCQkJCQkweEZGQzAwNzAwCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19DTEVBUgkJCTB4RkZDMDA3MDQJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUE9SVEZJT19TRVQJCQkJMHhGRkMwMDcwOAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fVE9HR0xFCQkJMHhGRkMwMDcwQwkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0EJCQkweEZGQzAwNzEwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDA3MTQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tBX1NFVAkJMHhGRkMwMDcxOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQV9UT0dHTEUJMHhGRkMwMDcxQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JURklPX01BU0tCCQkJMHhGRkMwMDcyMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JURklPX01BU0tCX0NMRUFSCQkweEZGQzAwNzI0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQl9TRVQJCTB4RkZDMDA3MjgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDA3MkMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19ESVIJCQkJMHhGRkMwMDczMAkvKiBQb3J0IEYgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fUE9MQVIJCQkweEZGQzAwNzM0CS8qIFBvcnQgRiBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JURklPX0VER0UJCQkweEZGQzAwNzM4CS8qIFBvcnQgRiBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fQk9USAkJCTB4RkZDMDA3M0MJLyogUG9ydCBGIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JURklPX0lORU4JCQkweEZGQzAwNzQwCS8qIFBvcnQgRiBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyIAkJCQkJKi8KLQotLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RDUjEJCQkweEZGQzAwODAwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfVENSMgkJCTB4RkZDMDA4MDQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMF9UQ0xLRElWCQkweEZGQzAwODA4CS8qIFNQT1JUMCBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfVEZTRElWCQkweEZGQzAwODBDCS8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RYCQkJMHhGRkMwMDgxMAkvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfUlgJCQkweEZGQzAwODE4CS8qIFNQT1JUMCBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9SQ1IxCQkJMHhGRkMwMDgyMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JDUjIJCQkweEZGQzAwODI0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfUkNMS0RJVgkJMHhGRkMwMDgyOAkvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JGU0RJVgkJMHhGRkMwMDgyQwkvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwCS8qIFNQT1JUMCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX0NITkwJCQkweEZGQzAwODM0CS8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9NQ01DMQkJMHhGRkMwMDgzOAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQwX01DTUMyCQkweEZGQzAwODNDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzAJCTB4RkZDMDA4NDAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MxCQkweEZGQzAwODQ0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NVENTMgkJMHhGRkMwMDg0OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzMJCTB4RkZDMDA4NEMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MwCQkweEZGQzAwODUwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MxCQkweEZGQzAwODU0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MyCQkweEZGQzAwODU4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MzCQkweEZGQzAwODVDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLQotLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RDUjEJCQkweEZGQzAwOTAwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfVENSMgkJCTB4RkZDMDA5MDQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMV9UQ0xLRElWCQkweEZGQzAwOTA4CS8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfVEZTRElWCQkweEZGQzAwOTBDCS8qIFNQT1JUMSBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RYCQkJMHhGRkMwMDkxMAkvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfUlgJCQkweEZGQzAwOTE4CS8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9SQ1IxCQkJMHhGRkMwMDkyMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JDUjIJCQkweEZGQzAwOTI0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfUkNMS0RJVgkJMHhGRkMwMDkyOAkvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JGU0RJVgkJMHhGRkMwMDkyQwkvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwCS8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0CS8qIFNQT1JUMSBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9NQ01DMQkJMHhGRkMwMDkzOAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQxX01DTUMyCQkweEZGQzAwOTNDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzAJCTB4RkZDMDA5NDAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQxX01UQ1MxCQkweEZGQzAwOTQ0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMV9NVENTMgkJMHhGRkMwMDk0OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzMJCTB4RkZDMDA5NEMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MwCQkweEZGQzAwOTUwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MxCQkweEZGQzAwOTU0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MyCQkweEZGQzAwOTU4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MzCQkweEZGQzAwOTVDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLQotLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJCSovCi0jZGVmaW5lIEVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCSovCi0jZGVmaW5lIEVCSVVfQU1CQ1RMMAkJMHhGRkMwMEEwNAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIEVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIEVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMAkvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQJLyogU0RSQU0gQmFuayBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBFQklVX1NEUlJDCQkJMHhGRkMwMEExOAkvKiBTRFJBTSBSZWZyZXNoIFJhdGUgQ29udHJvbCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIEVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQwkvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLwotCi0vKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBETUFfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIERNQV9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLwotCi0vKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIERNQV9UQ1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBETUFfVENDTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLwotCi0vKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMEUwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQThfQ09ORklHCQkJCTB4RkZDMDBFMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE4X1hfQ09VTlQJCQkweEZGQzAwRTEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQThfWF9NT0RJRlkJCQkweEZGQzAwRTE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1lfQ09VTlQJCQkweEZGQzAwRTE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQThfWV9NT0RJRlkJCQkweEZGQzAwRTFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE4X0NVUlJfQUREUgkJCTB4RkZDMDBFMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMEUyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEUyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDBFNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE5X0NPTkZJRwkJCQkweEZGQzAwRTQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOV9YX0NPVU5UCQkJMHhGRkMwMEU1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE5X1hfTU9ESUZZCQkJMHhGRkMwMEU1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMEU1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE5X1lfTU9ESUZZCQkJMHhGRkMwMEU1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX0FERFIJCQkweEZGQzAwRTY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDBFNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEU3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEU3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9DT05GSUcJCQkweEZGQzAwRTg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDBFOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMEU5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTEwX1lfQ09VTlQJCQkweEZGQzAwRTk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9ZX01PRElGWQkJCTB4RkZDMDBFOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUEwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDBFQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUI4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTExX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDBFRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTExX1hfTU9ESUZZCQkJMHhGRkMwMEVENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTExX1lfQ09VTlQJCQkweEZGQzAwRUQ4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9ZX01PRElGWQkJCTB4RkZDMDBFREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUUwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTExX0NVUlJfQUREUgkJCTB4RkZDMDBFRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUY4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjAwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSCQkweEZGQzAwRjA0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEYwOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQJCQkweEZGQzAwRjEwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9YX01PRElGWQkJMHhGRkMwMEYxNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfWV9DT1VOVAkJCTB4RkZDMDBGMTgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRjFDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGMjAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRjI0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTCQkweEZGQzAwRjI4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjJDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjMwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEYzOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGNDAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEY0NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEY0OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfWF9DT1VOVAkJCTB4RkZDMDBGNTAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBGNTQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQJCQkweEZGQzAwRjU4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRjVDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGNjAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIJCTB4RkZDMDBGNjQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEY2OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEY2QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjcwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjc4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotCi0jZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjgwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSCQkweEZGQzAwRjg0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEY4OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQJCQkweEZGQzAwRjkwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9YX01PRElGWQkJMHhGRkMwMEY5NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfWV9DT1VOVAkJCTB4RkZDMDBGOTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRjlDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGQTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRkE0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRkE4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkFDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkIwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZCOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGQzAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEZDNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEZDOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfWF9DT1VOVAkJCTB4RkZDMDBGRDAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBGRDQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQJCQkweEZGQzAwRkQ4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRkRDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGRTAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIJCTB4RkZDMDBGRTQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMEZFOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZFQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkYwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkY4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJKi8KLSNkZWZpbmUgUFBJX0NPTlRST0wJCQkweEZGQzAxMDAwCS8qIFBQSSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIJKi8KLQotCi0vKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCi0jZGVmaW5lIFRXSTBfUkVHQkFTRQkJCTB4RkZDMDE0MDAKLSNkZWZpbmUgVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVFdJMF9DT05UUk9MCQkJMHhGRkMwMTQwNAkvKiBUV0kgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFRXSTBfU0xBVkVfQ1RMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9DVEwJCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9TVEFUCQkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9BRERSCQkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJIE1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTyBSZWNlaXZlIERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8gUmVjZWl2ZSBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU8JCQkJCTB4RkZDMDE1MDAJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0NMRUFSCQkJMHhGRkMwMTUwNAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQT1JUR0lPX1NFVAkJCQkweEZGQzAxNTA4CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19UT0dHTEUJCQkweEZGQzAxNTBDCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQQkJCTB4RkZDMDE1MTAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTUxNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0FfU0VUCQkweEZGQzAxNTE4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tBX1RPR0dMRQkweEZGQzAxNTFDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0IJCQkweEZGQzAxNTIwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE1MjQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCX1NFVAkJMHhGRkMwMTUyOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTUyQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX0RJUgkJCQkweEZGQzAxNTMwCS8qIFBvcnQgRyBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19QT0xBUgkJCTB4RkZDMDE1MzQJLyogUG9ydCBHIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fRURHRQkJCTB4RkZDMDE1MzgJLyogUG9ydCBHIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19CT1RICQkJMHhGRkMwMTUzQwkvKiBQb3J0IEcgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fSU5FTgkJCTB4RkZDMDE1NDAJLyogUG9ydCBHIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLwotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUSElPCQkJCQkweEZGQzAxNzAwCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19DTEVBUgkJCTB4RkZDMDE3MDQJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUE9SVEhJT19TRVQJCQkJMHhGRkMwMTcwOAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fVE9HR0xFCQkJMHhGRkMwMTcwQwkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0EJCQkweEZGQzAxNzEwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE3MTQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBX1NFVAkJMHhGRkMwMTcxOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTcxQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCCQkJMHhGRkMwMTcyMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCX0NMRUFSCQkweEZGQzAxNzI0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQl9TRVQJCTB4RkZDMDE3MjgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE3MkMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19ESVIJCQkJMHhGRkMwMTczMAkvKiBQb3J0IEggSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fUE9MQVIJCQkweEZGQzAxNzM0CS8qIFBvcnQgSCBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX0VER0UJCQkweEZGQzAxNzM4CS8qIFBvcnQgSCBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fQk9USAkJCTB4RkZDMDE3M0MJLyogUG9ydCBIIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUSElPX0lORU4JCQkweEZGQzAxNzQwCS8qIFBvcnQgSCBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KLQotCi0vKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCSovCi0jZGVmaW5lIFVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCSovCi0jZGVmaW5lIFVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMV9NU1IJCQkweEZGQzAyMDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotCi0KLS8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JURl9GRVIJCQkweEZGQzAzMjAwCS8qIFBvcnQgRiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KLSNkZWZpbmUgUE9SVEdfRkVSCQkJMHhGRkMwMzIwNAkvKiBQb3J0IEcgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCi0jZGVmaW5lIFBPUlRIX0ZFUgkJCTB4RkZDMDMyMDgJLyogUG9ydCBIIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLwotI2RlZmluZSBCRklOX1BPUlRfTVVYCQkJMHhGRkMwMzIwQwkvKiBQb3J0IE11bHRpcGxleGVyIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0KLQotLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBITURNQTBfRUNPVkVSRkxPVwkweEZGQzAzMzEwCS8qIEhNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLwotI2RlZmluZSBITURNQTBfRUNPVU5UCQkweEZGQzAzMzE0CS8qIEhNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0JDT1VOVAkJMHhGRkMwMzMxOAkvKiBITURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIEhNRE1BMV9DT05UUk9MCQkweEZGQzAzMzQwCS8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBITURNQTFfRUNJTklUCQkweEZGQzAzMzQ0CS8qIEhNRE1BMSBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTFfRUNVUkdFTlQJCTB4RkZDMDMzNEMJLyogSE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgSE1ETUExX0VDT1ZFUkZMT1cJMHhGRkMwMzM1MAkvKiBITURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9CQ09VTlQJCTB4RkZDMDMzNTgJLyogSE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotCi0vKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLwotI2RlZmluZSBQT1JURl9NVVggICAgICAgICAgICAgICAweEZGQzAzMjEwICAgICAgLyogUG9ydCBGIG11eCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRHX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTQgICAgICAvKiBQb3J0IEcgbXV4IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEhfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxOCAgICAgIC8qIFBvcnQgSCBtdXggY29udHJvbCAqLwotI2RlZmluZSBQT1JURl9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjIwICAgICAgLyogUG9ydCBGIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEdfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyNCAgICAgIC8qIFBvcnQgRyBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjggICAgICAvKiBQb3J0IEggZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLwotI2RlZmluZSBQT1JURl9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjMwICAgICAgLyogUG9ydCBGIHNsZXcgY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM0ICAgICAgLyogUG9ydCBHIHNsZXcgY29udHJvbCAqLwotI2RlZmluZSBQT1JUSF9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM4ICAgICAgLyogUG9ydCBIIHNsZXcgY29udHJvbCAqLwotI2RlZmluZSBQT1JURl9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQwICAgICAgLyogUG9ydCBGIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCi0jZGVmaW5lIFBPUlRHX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDQgICAgICAvKiBQb3J0IEcgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEhfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0OCAgICAgIC8qIFBvcnQgSCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLwotI2RlZmluZSBNSVNDUE9SVF9EUklWRSAgICAgICAgICAweEZGQzAzMjgwICAgICAgLyogTWlzYyBQb3J0IGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KLSNkZWZpbmUgTUlTQ1BPUlRfU0xFVyAgICAgICAgICAgMHhGRkMwMzI4NCAgICAgIC8qIE1pc2MgUG9ydCBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgTUlTQ1BPUlRfSFlTVEVSSVNJUyAgICAgMHhGRkMwMzI4OCAgICAgIC8qIE1pc2MgUG9ydCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIEFuZCBNYWNyb3MKLSoqCi0qKiBEaXNjbGFpbWVyOglBbGwgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBtYWtlIEMgYW5kIEFzc2VtYmx5IGNvZGUgbW9yZSByZWFkYWJsZS4KLSoqCQkJCVVzZSB0aGVzZSBtYWNyb3MgY2FyZWZ1bGx5LCBhcyBhbnkgdGhhdCBkbyBsZWZ0IHNoaWZ0cyBmb3IgZmllbGQKLSoqCQkJCWRlcG9zaXRpbmcgd2lsbCByZXN1bHQgaW4gdGhlIGxvd2VyIG9yZGVyIGJpdHMgYmVpbmcgZGVzdHJveWVkLiAgQW55Ci0qKgkJCQltYWNybyB0aGF0IHNoaWZ0cyBsZWZ0IHRvIHByb3Blcmx5IHBvc2l0aW9uIHRoZSBiaXQtZmllbGQgc2hvdWxkIGJlCi0qKgkJCQl1c2VkIGFzIHBhcnQgb2YgYW4gT1IgdG8gaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIGFuZCBOT1QgYXMgYSBkeW5hbWljCi0qKgkJCQltb2RpZmllciBVTkxFU1MgdGhlIGxvd2VyIG9yZGVyIGJpdHMgYXJlIHNhdmVkIGFuZCBPUmVkIGJhY2sgaW4gd2hlbgotKioJCQkJdGhlIG1hY3JvIGlzIHVzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDSElQSUQgTWFza3MgKi8KLSNkZWZpbmUgQ0hJUElEX1ZFUlNJT04gICAgICAgICAweEYwMDAwMDAwCi0jZGVmaW5lIENISVBJRF9GQU1JTFkgICAgICAgICAgMHgwRkZGRjAwMAotI2RlZmluZSBDSElQSURfTUFOVUZBQ1RVUkUgICAgIDB4MDAwMDBGRkUKLQotLyogU1dSU1QgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBTWVNURU1fUkVTRVQJCTB4MDAwNwkvKiBJbml0aWF0ZXMgQSBTeXN0ZW0gU29mdHdhcmUgUmVzZXQJCQkqLwotI2RlZmluZQlET1VCTEVfRkFVTFQJCTB4MDAwOAkvKiBDb3JlIERvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQJCQkJKi8KLSNkZWZpbmUgUkVTRVRfRE9VQkxFCQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0CQkqLwotI2RlZmluZSBSRVNFVF9XRE9HCQkJMHg0MDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBXYXRjaGRvZyBUaW1lcgkJCSovCi0jZGVmaW5lIFJFU0VUX1NPRlRXQVJFCQkweDgwMDAJLyogU1cgUmVzZXQgT2NjdXJyZWQgU2luY2UgTGFzdCBSZWFkIE9mIFNXUlNUCSovCi0KLS8qIFNZU0NSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBCTU9ERQkJCQkweDAwMDcJLyogQm9vdCBNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMJKi8KLSNkZWZpbmUJTk9CT09UCQkJCTB4MDAxMAkvKiBFeGVjdXRlIEZyb20gTDEgb3IgQVNZTkMgQmFuayAwIFdoZW4gQk1PREUgPSAwCQkqLwotCi0KLS8qICoqKioqKioqKioqKiogIFNZU1RFTSBJTlRFUlJVUFQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IgU0lDX0lTUiwgU0lDX0lXUiwgU0lDX0lNQVNLCQkJCQkJCQkJCSovCi0KLSNpZiAwCi0jZGVmaW5lIElSUV9QTExfV0FLRVVQCTB4MDAwMDAwMDEJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQJCQkgCQkJCQkqLwotCi0jZGVmaW5lIElSUV9FUlJPUjEgICAgICAweDAwMDAwMDAyICAvKiBFcnJvciBJbnRlcnJ1cHQgKERNQSwgRE1BUnggQmxvY2ssIERNQVJ4IE92ZXJmbG93KSAqLwotI2RlZmluZSBJUlFfRVJST1IyICAgICAgMHgwMDAwMDAwNCAgLyogRXJyb3IgSW50ZXJydXB0IChDQU4sIEV0aGVybmV0LCBTUE9SVHgsIFBQSSwgU1BJLCBVQVJUeCkgKi8KLSNkZWZpbmUgSVJRX1JUQwkJCTB4MDAwMDAwMDgJLyogUmVhbCBUaW1lIENsb2NrIEludGVycnVwdCAJCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMAkJMHgwMDAwMDAxMAkvKiBETUEgQ2hhbm5lbCAwIChQUEkpIEludGVycnVwdCAJCQkJCSovCi0jZGVmaW5lIElSUV9ETUEzCQkweDAwMDAwMDIwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMCBSWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BNAkJMHgwMDAwMDA0MAkvKiBETUEgQ2hhbm5lbCA0IChTUE9SVDAgVFgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTUJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgNSAoU1BPUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCi0KLSNkZWZpbmUgSVJRX0RNQTYJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgNiAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgCQkgCQkqLwotI2RlZmluZSBJUlFfVFdJCQkJMHgwMDAwMDIwMAkvKiBUV0kgSW50ZXJydXB0CQkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTcJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgNyAoU1BJKSBJbnRlcnJ1cHQgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BOAkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCA4IChVQVJUMCBSWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BOQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCA5IChVQVJUMCBUWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BMTAJCTB4MDAwMDIwMDAJLyogRE1BIENoYW5uZWwgMTAgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUExMQkJMHgwMDAwNDAwMAkvKiBETUEgQ2hhbm5lbCAxMSAoVUFSVDEgVFgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0NBTl9SWAkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgCQkJCQkJCSovCi0KLSNkZWZpbmUgSVJRX0NBTl9UWAkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQgSW50ZXJydXB0ICAJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTEJCTB4MDAwMjAwMDAJLyogRE1BIENoYW5uZWwgMSAoRXRoZXJuZXQgUlgpIEludGVycnVwdCAJCQkqLwotI2RlZmluZSBJUlFfUEZBX1BPUlRICTB4MDAwMjAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQSAJCQkJCSovCi0jZGVmaW5lIElSUV9ETUEyCQkweDAwMDQwMDAwCS8qIERNQSBDaGFubmVsIDIgKEV0aGVybmV0IFRYKSBJbnRlcnJ1cHQgCQkJKi8KLSNkZWZpbmUgSVJRX1BGQl9QT1JUSAkweDAwMDQwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEIgCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVIwCQkweDAwMDgwMDAwCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVIxCQkweDAwMTAwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMgkJMHgwMDIwMDAwMAkvKiBUaW1lciAyIEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjMJCTB4MDA0MDAwMDAJLyogVGltZXIgMyBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVI0CQkweDAwODAwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0IAkJCQkJCQkJKi8KLQotI2RlZmluZSBJUlFfVElNRVI1CQkweDAxMDAwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSNgkJMHgwMjAwMDAwMAkvKiBUaW1lciA2IEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjcJCTB4MDQwMDAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfUEZBX1BPUlRGRwkweDA4MDAwMDAwCS8qIFBGIFBvcnRzIEYmRyAoUEYzMTowKSBJbnRlcnJ1cHQgQSAJCQkJKi8KLSNkZWZpbmUgSVJRX1BGQl9QT1JURgkweDgwMDAwMDAwCS8qIFBGIFBvcnQgRiAoUEYxNTowKSBJbnRlcnJ1cHQgQiAJCQkJCSovCi0jZGVmaW5lIElSUV9ETUExMgkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTIgKE1ETUExIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KLSNkZWZpbmUgSVJRX0RNQTEzCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMyAoTURNQTEgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLwotI2RlZmluZSBJUlFfRE1BMTQJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE0IChNRE1BMCBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCi0jZGVmaW5lIElSUV9ETUExNQkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTUgKE1ETUEwIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX1dET0cJCTB4ODAwMDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfUEZCX1BPUlRHCTB4MTAwMDAwMDAJLyogUEYgUG9ydCBHIChQRjMxOjE2KSBJbnRlcnJ1cHQgQiAJCQkJCSovCi0jZW5kaWYKLQotLyogU0lDX0lBUjAgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUDBfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMCBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFAxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMSBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFAyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMiBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFAzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMyBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjNCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjNSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjNiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjNyBhc3NpZ25lZCBJVkcgI3gJKi8KLQotLyogU0lDX0lBUjEgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUDhfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjOCBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFA5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjOSBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFAxMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzEwIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxMSBhc3NpZ25lZCBJVkcgI3ggCSovCi0jZGVmaW5lIFAxMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMxMiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDEzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzEzIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTRfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMTQgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMxNSBhc3NpZ25lZCBJVkcgI3gJKi8KLQotLyogU0lDX0lBUjIgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUDE2X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzE2IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxNyBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTggYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzE5IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjAgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyMSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzIyIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMjMgYXNzaWduZWQgSVZHICN4CSovCi0KLS8qIFNJQ19JQVIzIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFAyNF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMyNCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMjUgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzI2IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjdfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMyNyBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI4X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzI4IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjkgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAzMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMzMCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDMxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzMxIGFzc2lnbmVkIElWRyAjeAkqLwotCi0KLS8qIFNJQ19JTUFTSyBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIFNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KLSNkZWZpbmUgU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBNYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CQkqLwotI2RlZmluZSBTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkqLwotCi0vKiBTSUNfSVdSIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgSVdSX0RJU0FCTEVfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFdha2V1cCBEaXNhYmxlIGFsbCBwZXJpcGhlcmFscwkqLwotI2RlZmluZSBJV1JfRU5BQkxFX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBXYWtldXAgRW5hYmxlIGFsbCBwZXJpcGhlcmFscwkqLwotI2RlZmluZSBJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3gJCSovCi0jZGVmaW5lIElXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpIAkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4CQkqLwotCi0KLS8qICoqKioqKioqKioqKioqIFVBUlQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVUFSVHhfTENSIE1hc2tzCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgV0xTKHgpCQkoKCh4KS01KSAmIDB4MDMpCS8qIFdvcmQgTGVuZ3RoIFNlbGVjdCAqLwotI2RlZmluZSBTVEIJCQkweDA0CQkJCS8qIFN0b3AgQml0cwkJCSovCi0jZGVmaW5lIFBFTgkJCTB4MDgJCQkJLyogUGFyaXR5IEVuYWJsZQkJKi8KLSNkZWZpbmUgRVBTCQkJMHgxMAkJCQkvKiBFdmVuIFBhcml0eSBTZWxlY3QJKi8KLSNkZWZpbmUgU1RQCQkJMHgyMAkJCQkvKiBTdGljayBQYXJpdHkJCQkqLwotI2RlZmluZSBTQgkJCTB4NDAJCQkJLyogU2V0IEJyZWFrCQkJKi8KLSNkZWZpbmUgRExBQgkJMHg4MAkJCQkvKiBEaXZpc29yIExhdGNoIEFjY2VzcwkqLwotCi0vKiBVQVJUeF9NQ1IgTWFzawkJCQkJCQkJCQkqLwotI2RlZmluZSBMT09QX0VOQQkweDEwCS8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICovCi0jZGVmaW5lIExPT1BfRU5BX1AJMHgwNAotCi0vKiBVQVJUeF9MU1IgTWFza3MJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRFIJCQkweDAxCS8qIERhdGEgUmVhZHkJCQkJKi8KLSNkZWZpbmUgT0UJCQkweDAyCS8qIE92ZXJydW4gRXJyb3IJCQkqLwotI2RlZmluZSBQRQkJCTB4MDQJLyogUGFyaXR5IEVycm9yCQkJCSovCi0jZGVmaW5lIEZFCQkJMHgwOAkvKiBGcmFtaW5nIEVycm9yCQkJKi8KLSNkZWZpbmUgQkkJCQkweDEwCS8qIEJyZWFrIEludGVycnVwdAkJCSovCi0jZGVmaW5lIFRIUkUJCTB4MjAJLyogVEhSIEVtcHR5CQkJCSovCi0jZGVmaW5lIFRFTVQJCTB4NDAJLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eQkqLwotCi0vKiBVQVJUeF9JRVIgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBFUkJGSQkJMHgwMQkJLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0CQkqLwotI2RlZmluZSBFVEJFSQkJMHgwMgkJLyogRW5hYmxlIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eSBJbnRlcnJ1cHQJKi8KLSNkZWZpbmUgRUxTSQkJMHgwNAkJLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQJCQkJKi8KLQotLyogVUFSVHhfSUlSIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBOSU5UCQkweDAxCQkvKiBQZW5kaW5nIEludGVycnVwdAkJCQkJKi8KLSNkZWZpbmUgSUlSX1RYX1JFQURZICAgIDB4MDIJCS8qIFVBUlRfVEhSIGVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElJUl9SWF9SRUFEWSAgICAweDA0CQkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfTElORV9DSEFOR0UgMHgwNgkJLyogUmVjZWl2ZSBsaW5lIHN0YXR1cyAgICAJCQkqLwotI2RlZmluZSBJSVJfU1RBVFVTCTB4MDYJCS8qIEhpZ2hlc3QgUHJpb3JpdHkgUGVuZGluZyBJbnRlcnJ1cHQJKi8KLQotLyogVUFSVHhfR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBVQ0VOCQkweDAxCQkvKiBFbmFibGUgVUFSVHggQ2xvY2tzCQkJCSovCi0jZGVmaW5lIElSRU4JCTB4MDIJCS8qIEVuYWJsZSBJckRBIE1vZGUJCQkJCSovCi0jZGVmaW5lIFRQT0xDCQkweDA0CQkvKiBJckRBIFRYIFBvbGFyaXR5IENoYW5nZQkJCSovCi0jZGVmaW5lIFJQT0xDCQkweDA4CQkvKiBJckRBIFJYIFBvbGFyaXR5IENoYW5nZQkJCSovCi0jZGVmaW5lIEZQRQkJCTB4MTAJCS8qIEZvcmNlIFBhcml0eSBFcnJvciBPbiBUcmFuc21pdAkqLwotI2RlZmluZSBGRkUJCQkweDIwCQkvKiBGb3JjZSBGcmFtaW5nIEVycm9yIE9uIFRyYW5zbWl0CSovCi0KLQotLyogICoqKioqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRJTUVSX0VOQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBUSU1FTjAJCQkweDAwMDEJCS8qIEVuYWJsZSBUaW1lciAwCQkJCQkqLwotI2RlZmluZSBUSU1FTjEJCQkweDAwMDIJCS8qIEVuYWJsZSBUaW1lciAxCQkJCQkqLwotI2RlZmluZSBUSU1FTjIJCQkweDAwMDQJCS8qIEVuYWJsZSBUaW1lciAyCQkJCQkqLwotI2RlZmluZSBUSU1FTjMJCQkweDAwMDgJCS8qIEVuYWJsZSBUaW1lciAzCQkJCQkqLwotI2RlZmluZSBUSU1FTjQJCQkweDAwMTAJCS8qIEVuYWJsZSBUaW1lciA0CQkJCQkqLwotI2RlZmluZSBUSU1FTjUJCQkweDAwMjAJCS8qIEVuYWJsZSBUaW1lciA1CQkJCQkqLwotI2RlZmluZSBUSU1FTjYJCQkweDAwNDAJCS8qIEVuYWJsZSBUaW1lciA2CQkJCQkqLwotI2RlZmluZSBUSU1FTjcJCQkweDAwODAJCS8qIEVuYWJsZSBUaW1lciA3CQkJCQkqLwotCi0vKiBUSU1FUl9ESVNBQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRJTURJUzAJCQlUSU1FTjAJCS8qIERpc2FibGUgVGltZXIgMAkJCQkJKi8KLSNkZWZpbmUgVElNRElTMQkJCVRJTUVOMQkJLyogRGlzYWJsZSBUaW1lciAxCQkJCQkqLwotI2RlZmluZSBUSU1ESVMyCQkJVElNRU4yCQkvKiBEaXNhYmxlIFRpbWVyIDIJCQkJCSovCi0jZGVmaW5lIFRJTURJUzMJCQlUSU1FTjMJCS8qIERpc2FibGUgVGltZXIgMwkJCQkJKi8KLSNkZWZpbmUgVElNRElTNAkJCVRJTUVONAkJLyogRGlzYWJsZSBUaW1lciA0CQkJCQkqLwotI2RlZmluZSBUSU1ESVM1CQkJVElNRU41CQkvKiBEaXNhYmxlIFRpbWVyIDUJCQkJCSovCi0jZGVmaW5lIFRJTURJUzYJCQlUSU1FTjYJCS8qIERpc2FibGUgVGltZXIgNgkJCQkJKi8KLSNkZWZpbmUgVElNRElTNwkJCVRJTUVONwkJLyogRGlzYWJsZSBUaW1lciA3CQkJCQkqLwotCi0vKiBUSU1FUl9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNSUwwCQkJMHgwMDAwMDAwMQkvKiBUaW1lciAwIEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDEJCQkweDAwMDAwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMMgkJCTB4MDAwMDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUwzCQkJMHgwMDAwMDAwOAkvKiBUaW1lciAzIEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjAJCTB4MDAwMDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIxCQkweDAwMDAwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSMgkJMHgwMDAwMDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjMJCTB4MDAwMDAwODAJLyogVGltZXIgMyBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVFJVTjAJCQkweDAwMDAxMDAwCS8qIFRpbWVyIDAgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjEJCQkweDAwMDAyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjIJCQkweDAwMDA0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjMJCQkweDAwMDA4MDAwCS8qIFRpbWVyIDMgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVElNSUw0CQkJMHgwMDAxMDAwMAkvKiBUaW1lciA0IEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDUJCQkweDAwMDIwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMNgkJCTB4MDAwNDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUw3CQkJMHgwMDA4MDAwMAkvKiBUaW1lciA3IEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjQJCTB4MDAxMDAwMDAJLyogVGltZXIgNCBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI1CQkweDAwMjAwMDAwCS8qIFRpbWVyIDUgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSNgkJMHgwMDQwMDAwMAkvKiBUaW1lciA2IENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjcJCTB4MDA4MDAwMDAJLyogVGltZXIgNyBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVFJVTjQJCQkweDEwMDAwMDAwCS8qIFRpbWVyIDQgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjUJCQkweDIwMDAwMDAwCS8qIFRpbWVyIDUgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjYJCQkweDQwMDAwMDAwCS8qIFRpbWVyIDYgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLSNkZWZpbmUgVFJVTjcJCQkweDgwMDAwMDAwCS8qIFRpbWVyIDcgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KLQotLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFRPVkxfRVJSMCBUT1ZGX0VSUjAKLSNkZWZpbmUgVE9WTF9FUlIxIFRPVkZfRVJSMQotI2RlZmluZSBUT1ZMX0VSUjIgVE9WRl9FUlIyCi0jZGVmaW5lIFRPVkxfRVJSMyBUT1ZGX0VSUjMKLSNkZWZpbmUgVE9WTF9FUlI0IFRPVkZfRVJSNAotI2RlZmluZSBUT1ZMX0VSUjUgVE9WRl9FUlI1Ci0jZGVmaW5lIFRPVkxfRVJSNiBUT1ZGX0VSUjYKLSNkZWZpbmUgVE9WTF9FUlI3IFRPVkZfRVJSNwotCi0vKiBUSU1FUnhfQ09ORklHIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBXTV9PVVQJCQkweDAwMDEJLyogUHVsc2UtV2lkdGggTW9kdWxhdGlvbiBPdXRwdXQgTW9kZQkqLwotI2RlZmluZSBXRFRIX0NBUAkJMHgwMDAyCS8qIFdpZHRoIENhcHR1cmUgSW5wdXQgTW9kZQkJCQkqLwotI2RlZmluZSBFWFRfQ0xLCQkJMHgwMDAzCS8qIEV4dGVybmFsIENsb2NrIE1vZGUJCQkJCSovCi0jZGVmaW5lIFBVTFNFX0hJCQkweDAwMDQJLyogQWN0aW9uIFB1bHNlIChQb3NpdGl2ZS9OZWdhdGl2ZSopCSovCi0jZGVmaW5lIFBFUklPRF9DTlQJCTB4MDAwOAkvKiBQZXJpb2QgQ291bnQJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX0VOQQkJCTB4MDAxMAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBFbmFibGUJCQkJKi8KLSNkZWZpbmUgVElOX1NFTAkJCTB4MDAyMAkvKiBUaW1lciBJbnB1dCBTZWxlY3QJCQkJCSovCi0jZGVmaW5lIE9VVF9ESVMJCQkweDAwNDAJLyogT3V0cHV0IFBhZCBEaXNhYmxlCQkJCQkqLwotI2RlZmluZSBDTEtfU0VMCQkJMHgwMDgwCS8qIFRpbWVyIENsb2NrIFNlbGVjdAkJCQkJKi8KLSNkZWZpbmUgVE9HR0xFX0hJCQkweDAxMDAJLyogUFdNX09VVCBQVUxTRV9ISSBUb2dnbGUgTW9kZQkJCSovCi0jZGVmaW5lIEVNVV9SVU4JCQkweDAyMDAJLyogRW11bGF0aW9uIEJlaGF2aW9yIFNlbGVjdAkJCSovCi0jZGVmaW5lIEVSUl9UWVAJCQkweEMwMDAJLyogRXJyb3IgVHlwZQkJCQkJCQkqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKiAgIEdQSU8gUE9SVFMgRiwgRywgSCBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIE1hc2tzIAkJCQkqLwotLyogUG9ydCBGIE1hc2tzIAkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUEYwCQkweDAwMDEKLSNkZWZpbmUgUEYxCQkweDAwMDIKLSNkZWZpbmUgUEYyCQkweDAwMDQKLSNkZWZpbmUgUEYzCQkweDAwMDgKLSNkZWZpbmUgUEY0CQkweDAwMTAKLSNkZWZpbmUgUEY1CQkweDAwMjAKLSNkZWZpbmUgUEY2CQkweDAwNDAKLSNkZWZpbmUgUEY3CQkweDAwODAKLSNkZWZpbmUgUEY4CQkweDAxMDAKLSNkZWZpbmUgUEY5CQkweDAyMDAKLSNkZWZpbmUgUEYxMAkweDA0MDAKLSNkZWZpbmUgUEYxMQkweDA4MDAKLSNkZWZpbmUgUEYxMgkweDEwMDAKLSNkZWZpbmUgUEYxMwkweDIwMDAKLSNkZWZpbmUgUEYxNAkweDQwMDAKLSNkZWZpbmUgUEYxNQkweDgwMDAKLQotLyogUG9ydCBHIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUEcwCQkweDAwMDEKLSNkZWZpbmUgUEcxCQkweDAwMDIKLSNkZWZpbmUgUEcyCQkweDAwMDQKLSNkZWZpbmUgUEczCQkweDAwMDgKLSNkZWZpbmUgUEc0CQkweDAwMTAKLSNkZWZpbmUgUEc1CQkweDAwMjAKLSNkZWZpbmUgUEc2CQkweDAwNDAKLSNkZWZpbmUgUEc3CQkweDAwODAKLSNkZWZpbmUgUEc4CQkweDAxMDAKLSNkZWZpbmUgUEc5CQkweDAyMDAKLSNkZWZpbmUgUEcxMAkweDA0MDAKLSNkZWZpbmUgUEcxMQkweDA4MDAKLSNkZWZpbmUgUEcxMgkweDEwMDAKLSNkZWZpbmUgUEcxMwkweDIwMDAKLSNkZWZpbmUgUEcxNAkweDQwMDAKLSNkZWZpbmUgUEcxNQkweDgwMDAKLQotLyogUG9ydCBIIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUEgwCQkweDAwMDEKLSNkZWZpbmUgUEgxCQkweDAwMDIKLSNkZWZpbmUgUEgyCQkweDAwMDQKLSNkZWZpbmUgUEgzCQkweDAwMDgKLSNkZWZpbmUgUEg0CQkweDAwMTAKLSNkZWZpbmUgUEg1CQkweDAwMjAKLSNkZWZpbmUgUEg2CQkweDAwNDAKLSNkZWZpbmUgUEg3CQkweDAwODAKLQotLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFQklVX0FNR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQU1DS0VOCQkJMHgwMDAxCQkvKiBFbmFibGUgQ0xLT1VUCQkJCQkJCQkJKi8KLSNkZWZpbmUJQU1CRU5fTk9ORQkJMHgwMDAwCQkvKiBBbGwgQmFua3MgRGlzYWJsZWQJCQkJCQkJCSovCi0jZGVmaW5lIEFNQkVOX0IwCQkweDAwMDIJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFuayAwIG9ubHkJCQkJCSovCi0jZGVmaW5lIEFNQkVOX0IwX0IxCQkweDAwMDQJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCAmIDEgb25seQkJCQkqLwotI2RlZmluZSBBTUJFTl9CMF9CMV9CMgkweDAwMDYJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCwgMSwgYW5kIDIJCQkqLwotI2RlZmluZSBBTUJFTl9BTEwJCTB4MDAwOAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAoYWxsKSAwLCAxLCAyLCBhbmQgMwkqLwotCi0vKiBFQklVX0FNQkNUTDAgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEIwUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDAgKEIwKSBSRFkgRW5hYmxlCQkJCQkJCSovCi0jZGVmaW5lIEIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMCBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCi0jZGVmaW5lIEIwVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMFRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIwVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLwotI2RlZmluZSBCMFNUXzEJCQkweDAwMDAwMDEwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjBTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCi0jZGVmaW5lIEIwU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLwotI2RlZmluZSBCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjBIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIwSFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMEhUXzAJCQkweDAwMDAwMDAwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KLSNkZWZpbmUgQjBSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMFJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMFdBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF81CQkJMHgwMDAwNTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF84CQkJMHgwMDAwODAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0KLSNkZWZpbmUgQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSAoQjEpIFJEWSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgIAkqLwotI2RlZmluZSBCMVJEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjEgUkRZIEFjdGl2ZSBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgCSovCi0jZGVmaW5lIEIxVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlIAkqLwotI2RlZmluZSBCMVRUXzIJCQkweDAwMDgwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIxVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLwotI2RlZmluZSBCMVNUXzEJCQkweDAwMTAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlICAJKi8KLSNkZWZpbmUgQjFTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMgCSovCi0jZGVmaW5lIEIxU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzIAkqLwotI2RlZmluZSBCMVNUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcyAJKi8KLSNkZWZpbmUgQjFIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUgCSovCi0jZGVmaW5lIEIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF80CQkJMHg0MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF83CQkJMHg3MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0vKiBFQklVX0FNQkNUTDEgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEIyUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDIgKEIyKSBSRFkgRW5hYmxlCQkJCQkJCSovCi0jZGVmaW5lIEIyUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMiBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCi0jZGVmaW5lIEIyVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMlRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjJUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLwotI2RlZmluZSBCMlNUXzEJCQkweDAwMDAwMDEwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMlNUXzIJCQkweDAwMDAwMDIwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjJTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCi0jZGVmaW5lIEIyU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLwotI2RlZmluZSBCMkhUXzEJCQkweDAwMDAwMDQwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KLSNkZWZpbmUgQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0KLSNkZWZpbmUgQjNSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMyAoQjMpIFJEWSBFbmFibGUJCQkJCQkJKi8KLSNkZWZpbmUgQjNSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIzIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KLSNkZWZpbmUgQjNUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIzVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCM1RUXzMJCQkweDAwMEMwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCi0jZGVmaW5lIEIzU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIzU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLwotI2RlZmluZSBCM1NUXzMJCQkweDAwMzAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjNTVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCi0jZGVmaW5lIEIzSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLwotI2RlZmluZSBCM1JBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF82CQkJMHg2MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF85CQkJMHg5MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqICBTRFJBTSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRUJJVV9TREdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU0NUTEUJCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTRFJBTSBTaWduYWxzCQkJCQkJCQkJCSovCi0jZGVmaW5lIENMXzIJCQkweDAwMDAwMDA4CS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMiBjeWNsZXMJCQkJCQkJCSovCi0jZGVmaW5lIENMXzMJCQkweDAwMDAwMDBDCS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMyBjeWNsZXMJCQkJCQkJCSovCi0jZGVmaW5lIFBBU1JfQUxMCQkweDAwMDAwMDAwCS8qIEFsbCA0IFNEUkFNIEJhbmtzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkJKi8KLSNkZWZpbmUgUEFTUl9CMF9CMQkJMHgwMDAwMDAxMAkvKiBTRFJBTSBCYW5rcyAwIGFuZCAxIEFyZSBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkqLwotI2RlZmluZSBQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5IFNEUkFNIEJhbmsgMCBJcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJKi8KLSNkZWZpbmUgVFJBU18xCQkJMHgwMDAwMDA0MAkvKiBTRFJBTSB0UkFTID0gMSBjeWNsZQkJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzIJCQkweDAwMDAwMDgwCS8qIFNEUkFNIHRSQVMgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMwkJCTB4MDAwMDAwQzAJLyogU0RSQU0gdFJBUyA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU180CQkJMHgwMDAwMDEwMAkvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzUJCQkweDAwMDAwMTQwCS8qIFNEUkFNIHRSQVMgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNgkJCTB4MDAwMDAxODAJLyogU0RSQU0gdFJBUyA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU183CQkJMHgwMDAwMDFDMAkvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzgJCQkweDAwMDAwMjAwCS8qIFNEUkFNIHRSQVMgPSA4IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfOQkJCTB4MDAwMDAyNDAJLyogU0RSQU0gdFJBUyA9IDkgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xMAkJCTB4MDAwMDAyODAJLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTEJCQkweDAwMDAwMkMwCS8qIFNEUkFNIHRSQVMgPSAxMSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzEyCQkJMHgwMDAwMDMwMAkvKiBTRFJBTSB0UkFTID0gMTIgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xMwkJCTB4MDAwMDAzNDAJLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTQJCQkweDAwMDAwMzgwCS8qIFNEUkFNIHRSQVMgPSAxNCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzE1CQkJMHgwMDAwMDNDMAkvKiBTRFJBTSB0UkFTID0gMTUgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzEJCQkweDAwMDAwODAwCS8qIFNEUkFNIHRSUCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzIJCQkweDAwMDAxMDAwCS8qIFNEUkFNIHRSUCA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF8zCQkJMHgwMDAwMTgwMAkvKiBTRFJBTSB0UlAgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfNAkJCTB4MDAwMDIwMDAJLyogU0RSQU0gdFJQID0gNCBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzUJCQkweDAwMDAyODAwCS8qIFNEUkFNIHRSUCA9IDUgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF82CQkJMHgwMDAwMzAwMAkvKiBTRFJBTSB0UlAgPSA2IGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfNwkJCTB4MDAwMDM4MDAJLyogU0RSQU0gdFJQID0gNyBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF8xCQkJMHgwMDAwODAwMAkvKiBTRFJBTSB0UkNEID0gMSBjeWNsZQkJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzIJCQkweDAwMDEwMDAwCS8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfMwkJCTB4MDAwMTgwMDAJLyogU0RSQU0gdFJDRCA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF80CQkJMHgwMDAyMDAwMAkvKiBTRFJBTSB0UkNEID0gNCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzUJCQkweDAwMDI4MDAwCS8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNgkJCTB4MDAwMzAwMDAJLyogU0RSQU0gdFJDRCA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF83CQkJMHgwMDAzODAwMAkvKiBTRFJBTSB0UkNEID0gNyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUV1JfMQkJCTB4MDAwODAwMDAJLyogU0RSQU0gdFdSID0gMSBjeWNsZQkJCQkJCQkJCQkqLwotI2RlZmluZSBUV1JfMgkJCTB4MDAxMDAwMDAJLyogU0RSQU0gdFdSID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFdSXzMJCQkweDAwMTgwMDAwCS8qIFNEUkFNIHRXUiA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBVUFNECQkJMHgwMDIwMDAwMAkvKiBQb3dlci1VcCBTdGFydCBEZWxheSAoMTUgU0NMSyBDeWNsZXMgRGVsYXkpCQkJCSovCi0jZGVmaW5lIFBTTQkJCQkweDAwNDAwMDAwCS8qIFBvd2VyLVVwIFNlcXVlbmNlIChNb2RlIFJlZ2lzdGVyIEJlZm9yZS9BZnRlciogUmVmcmVzaCkJKi8KLSNkZWZpbmUgUFNTCQkJCTB4MDA4MDAwMDAJLyogRW5hYmxlIFBvd2VyLVVwIFNlcXVlbmNlIG9uIE5leHQgU0RSQU0gQWNjZXNzCQkJKi8KLSNkZWZpbmUgU1JGUwkJCTB4MDEwMDAwMDAJLyogRW5hYmxlIFNEUkFNIFNlbGYtUmVmcmVzaCBNb2RlCQkJCQkJCSovCi0jZGVmaW5lIEVCVUZFCQkJMHgwMjAwMDAwMAkvKiBFbmFibGUgRXh0ZXJuYWwgQnVmZmVyaW5nIFRpbWluZwkJCQkJCQkqLwotI2RlZmluZSBGQkJSVwkJCTB4MDQwMDAwMDAJLyogRW5hYmxlIEZhc3QgQmFjay1Uby1CYWNrIFJlYWQgVG8gV3JpdGUJCQkJCSovCi0jZGVmaW5lIEVNUkVOCQkJMHgxMDAwMDAwMAkvKiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBUQ1NSCQkJMHgyMDAwMDAwMAkvKiBUZW1wLUNvbXBlbnNhdGVkIFNlbGYtUmVmcmVzaCBWYWx1ZSAoODUvNDUqIERlZyBDKQkJKi8KLSNkZWZpbmUgQ0REQkcJCQkweDQwMDAwMDAwCS8qIFRyaXN0YXRlIFNEUkFNIENvbnRyb2xzIER1cmluZyBCdXMgR3JhbnQJCQkJCSovCi0KLS8qIEVCSVVfU0RCQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRUJFCQkJCTB4MDAwMQkJLyogRW5hYmxlIFNEUkFNIEV4dGVybmFsIEJhbmsJCQkJCQkJKi8KLSNkZWZpbmUgRUJTWl8xNgkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTZNQgkqLwotI2RlZmluZSBFQlNaXzMyCQkJMHgwMDAyCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAzMk1CCSovCi0jZGVmaW5lIEVCU1pfNjQJCQkweDAwMDQJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDY0TUIJKi8KLSNkZWZpbmUgRUJTWl8xMjgJCTB4MDAwNgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTI4TUIJCSovCi0jZGVmaW5lIEVCU1pfMjU2CQkweDAwMDgJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CIAkqLwotI2RlZmluZSBFQlNaXzUxMgkJMHgwMDBBCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA1MTJNQgkJKi8KLSNkZWZpbmUgRUJDQVdfOAkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDggQml0cwkqLwotI2RlZmluZSBFQkNBV185CQkJMHgwMDEwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOSBCaXRzCSovCi0jZGVmaW5lIEVCQ0FXXzEwCQkweDAwMjAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMCBCaXRzCSovCi0jZGVmaW5lIEVCQ0FXXzExCQkweDAwMzAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMSBCaXRzCSovCi0KLS8qIEVCSVVfU0RTVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBTRENJCQkJMHgwMDAxCQkvKiBTRFJBTSBDb250cm9sbGVyIElkbGUgCQkJCSovCi0jZGVmaW5lIFNEU1JBCQkJMHgwMDAyCQkvKiBTRFJBTSBTZWxmLVJlZnJlc2ggQWN0aXZlCQkJKi8KLSNkZWZpbmUgU0RQVUEJCQkweDAwMDQJCS8qIFNEUkFNIFBvd2VyLVVwIEFjdGl2ZSAJCQkJKi8KLSNkZWZpbmUgU0RSUwkJCTB4MDAwOAkJLyogU0RSQU0gV2lsbCBQb3dlci1VcCBPbiBOZXh0IEFjY2VzcwkqLwotI2RlZmluZSBTREVBU0UJCQkweDAwMTAJCS8qIFNEUkFNIEVBQiBTdGlja3kgRXJyb3IgU3RhdHVzCQkqLwotI2RlZmluZSBCR1NUQVQJCQkweDAwMjAJCS8qIEJ1cyBHcmFudCBTdGF0dXMJCQkJCQkqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqICBETUEgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIERNQXhfUEVSSVBIRVJBTF9NQVAsIE1ETUFfeXlfUEVSSVBIRVJBTF9NQVAgTWFza3MJCQkJCQkJCSovCi0jZGVmaW5lIENUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIChNZW1vcnkvUGVyaXBoZXJhbCopCSovCi0jZGVmaW5lIFBNQVAJCQkweEYwMDAJLyogUGVyaXBoZXJhbCBNYXBwZWQgVG8gVGhpcyBDaGFubmVsCQkJCSovCi0jZGVmaW5lIFBNQVBfUFBJCQkweDAwMDAJLyogCQlQUEkgUG9ydCBETUEJCQkJCQkJCSovCi0jZGVmaW5lCVBNQVBfRU1BQ1JYCQkweDEwMDAJLyogCQlFdGhlcm5ldCBSZWNlaXZlIERNQQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfRU1BQ1RYCQkweDIwMDAJLyogCQlFdGhlcm5ldCBUcmFuc21pdCBETUEJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQT1JUMFJYCTB4MzAwMAkvKiAJCVNQT1JUMCBSZWNlaXZlIERNQQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQT1JUMFRYCTB4NDAwMAkvKiAJCVNQT1JUMCBUcmFuc21pdCBETUEJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDFSWAkweDUwMDAJLyogCQlTUE9SVDEgUmVjZWl2ZSBETUEJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDFUWAkweDYwMDAJLyogCQlTUE9SVDEgVHJhbnNtaXQgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BJCQkweDcwMDAJLyogCQlTUEkgUG9ydCBETUEJCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfVUFSVDBSWAkweDgwMDAJLyogCQlVQVJUMCBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9VQVJUMFRYCTB4OTAwMAkvKiAJCVVBUlQwIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KLSNkZWZpbmUJUE1BUF9VQVJUMVJYCTB4QTAwMAkvKiAJCVVBUlQxIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLwotI2RlZmluZQlQTUFQX1VBUlQxVFgJMHhCMDAwCS8qIAkJVUFSVDEgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLwotCi0vKiAgKioqKioqKioqKioqICBQQVJBTExFTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoUFBJKSBNQVNLUyAqKioqKioqKioqKioqLwotLyogIFBQSV9DT05UUk9MIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBPUlRfRU4JCQkweDAwMDEJCS8qIFBQSSBQb3J0IEVuYWJsZQkJCQkJKi8KLSNkZWZpbmUgUE9SVF9ESVIJCTB4MDAwMgkJLyogUFBJIFBvcnQgRGlyZWN0aW9uCQkJCSovCi0jZGVmaW5lIFhGUl9UWVBFCQkweDAwMEMJCS8qIFBQSSBUcmFuc2ZlciBUeXBlCQkJCSovCi0jZGVmaW5lIFBPUlRfQ0ZHCQkweDAwMzAJCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24JCQkqLwotI2RlZmluZSBGTERfU0VMCQkJMHgwMDQwCQkvKiBQUEkgQWN0aXZlIEZpZWxkIFNlbGVjdAkJCSovCi0jZGVmaW5lIFBBQ0tfRU4JCQkweDAwODAJCS8qIFBQSSBQYWNraW5nIE1vZGUJCQkJCSovCi0jZGVmaW5lIERNQTMyCQkJMHgwMTAwCQkvKiBQUEkgMzItYml0IERNQSBFbmFibGUJCQkqLwotI2RlZmluZSBTS0lQX0VOCQkJMHgwMjAwCQkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZQkJCSovCi0jZGVmaW5lIFNLSVBfRU8JCQkweDA0MDAJCS8qIFBQSSBTa2lwIEV2ZW4vT2RkIEVsZW1lbnRzCQkqLwotI2RlZmluZSBETEVOXzgJCQkweDAwMDAJCS8qIERhdGEgTGVuZ3RoID0gOCBCaXRzCQkJCSovCi0jZGVmaW5lIERMRU5fMTAJCQkweDA4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTAgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTEJCQkweDEwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTEgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTIJCQkweDE4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTIgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTMJCQkweDIwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTMgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTQJCQkweDI4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTQgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTUJCQkweDMwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTUgQml0cwkJCSovCi0jZGVmaW5lIERMRU5fMTYJCQkweDM4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTYgQml0cwkJCSovCi0jZGVmaW5lIERMRU5HVEgJCQkweDM4MDAJCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KLSNkZWZpbmUgUE9MQwkJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5CQkJCSovCi0jZGVmaW5lIFBPTFMJCQkweDgwMDAJCS8qIFBQSSBGcmFtZSBTeW5jIFBvbGFyaXR5CQkJKi8KLQotLyogUFBJX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRkxECQkJCTB4MDQwMAkJLyogRmllbGQgSW5kaWNhdG9yCQkJCQkqLwotI2RlZmluZSBGVF9FUlIJCQkweDA4MDAJCS8qIEZyYW1lIFRyYWNrIEVycm9yCQkJCSovCi0jZGVmaW5lIE9WUgkJCQkweDEwMDAJCS8qIEZJRk8gT3ZlcmZsb3cgRXJyb3IJCQkJKi8KLSNkZWZpbmUgVU5EUgkJCTB4MjAwMAkJLyogRklGTyBVbmRlcnJ1biBFcnJvcgkJCQkqLwotI2RlZmluZSBFUlJfREVUCQkJMHg0MDAwCQkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IJCQkqLwotI2RlZmluZSBFUlJfTkNPUgkJMHg4MDAwCQkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvcgkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0kpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRXSV9DTEtESVYgTWFjcm9zIChVc2U6ICpwVFdJX0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsgICkJCQkJKi8KLSNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGKQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdwkJCSovCi0jZGVmaW5lIENMS0hJKHkpCSgoKHkpJjB4RkYpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cJCQkqLwotCi0vKiBUV0lfUFJFU0NBTEUgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlQUkVTQ0FMRQkweDAwN0YJCS8qIFNDTEtzIFBlciBJbnRlcm5hbCBUaW1lIFJlZmVyZW5jZSAoMTBNSHopCSovCi0jZGVmaW5lCVRXSV9FTkEJCTB4MDA4MAkJLyogVFdJIEVuYWJsZQkJCQkJCQkJCSovCi0jZGVmaW5lCVNDQ0IJCTB4MDIwMAkJLyogU0NDQiBDb21wYXRpYmlsaXR5IEVuYWJsZQkJCQkJKi8KLQotLyogVFdJX1NMQVZFX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVNFTgkJCTB4MDAwMQkJLyogU2xhdmUgRW5hYmxlCQkJCQkJCQkJKi8KLSNkZWZpbmUJU0FERF9MRU4JMHgwMDAyCQkvKiBTbGF2ZSBBZGRyZXNzIExlbmd0aAkJCQkJCQkqLwotI2RlZmluZQlTVERWQUwJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNtaXQgRGF0YSBWYWxpZAkJCQkJKi8KLSNkZWZpbmUJTkFLCQkJMHgwMDA4CQkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLwotI2RlZmluZQlHRU4JCQkweDAwMTAJCS8qIEdlbmVyYWwgQ2FsbCBBZHJyZXNzIE1hdGNoaW5nIEVuYWJsZWQJCSovCi0KLS8qIFRXSV9TTEFWRV9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJU0RJUgkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKQkqLwotI2RlZmluZSBHQ0FMTAkJMHgwMDAyCQkvKiBHZW5lcmFsIENhbGwgSW5kaWNhdG9yCQkJCQkJKi8KLQotLyogVFdJX01BU1RFUl9DVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJTUVOCQkJMHgwMDAxCQkvKiBNYXN0ZXIgTW9kZSBFbmFibGUJCQkJCQkqLwotI2RlZmluZQlNQUREX0xFTgkweDAwMDIJCS8qIE1hc3RlciBBZGRyZXNzIExlbmd0aAkJCQkJKi8KLSNkZWZpbmUJTURJUgkJMHgwMDA0CQkvKiBNYXN0ZXIgVHJhbnNtaXQgRGlyZWN0aW9uIChSWC9UWCopCQkqLwotI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nIFNwZWNzCQkJCSovCi0jZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24JCQkJCQkqLwotI2RlZmluZQlSU1RBUlQJCTB4MDAyMAkJLyogUmVwZWF0IFN0YXJ0IG9yIFN0b3AqIEF0IEVuZCBPZiBUcmFuc2ZlcgkqLwotI2RlZmluZQlEQ05UCQkweDNGQzAJCS8qIERhdGEgQnl0ZXMgVG8gVHJhbnNmZXIJCQkJCSovCi0jZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZQkJCQkJCSovCi0jZGVmaW5lCVNDTE9WUgkJMHg4MDAwCQkvKiBTZXJpYWwgQ2xvY2sgT3ZlcnJpZGUJCQkJCSovCi0KLS8qIFRXSV9NQVNURVJfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJTVBST0cJCTB4MDAwMQkJLyogTWFzdGVyIFRyYW5zZmVyIEluIFByb2dyZXNzCQkJCQkqLwotI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QgQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpCSovCi0jZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KLSNkZWZpbmUJRE5BSwkJMHgwMDA4CQkvKiBEYXRhIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLwotI2RlZmluZQlCVUZSREVSUgkweDAwMTAJCS8qIEJ1ZmZlciBSZWFkIEVycm9yCQkJCQkJCSovCi0jZGVmaW5lCUJVRldSRVJSCTB4MDAyMAkJLyogQnVmZmVyIFdyaXRlIEVycm9yCQkJCQkJCSovCi0jZGVmaW5lCVNEQVNFTgkJMHgwMDQwCQkvKiBTZXJpYWwgRGF0YSBTZW5zZQkJCQkJCQkqLwotI2RlZmluZQlTQ0xTRU4JCTB4MDA4MAkJLyogU2VyaWFsIENsb2NrIFNlbnNlCQkJCQkJCSovCi0jZGVmaW5lCUJVU0JVU1kJCTB4MDEwMAkJLyogQnVzIEJ1c3kgSW5kaWNhdG9yCQkJCQkJCSovCi0KLS8qIFRXSV9JTlRfU1JDIGFuZCBUV0lfSU5UX0VOQUJMRSBNYXNrcwkJCQkJCSovCi0jZGVmaW5lCVNJTklUCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIEluaXRpYXRlZAkqLwotI2RlZmluZQlTQ09NUAkJMHgwMDAyCQkvKiBTbGF2ZSBUcmFuc2ZlciBDb21wbGV0ZQkqLwotI2RlZmluZQlTRVJSCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zZmVyIEVycm9yCQkqLwotI2RlZmluZQlTT1ZGCQkweDAwMDgJCS8qIFNsYXZlIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUJTUNPTVAJCTB4MDAxMAkJLyogTWFzdGVyIFRyYW5zZmVyIENvbXBsZXRlCSovCi0jZGVmaW5lCU1FUlIJCTB4MDAyMAkJLyogTWFzdGVyIFRyYW5zZmVyIEVycm9yCSovCi0jZGVmaW5lCVhNVFNFUlYJCTB4MDA0MAkJLyogVHJhbnNtaXQgRklGTyBTZXJ2aWNlCSovCi0jZGVmaW5lCVJDVlNFUlYJCTB4MDA4MAkJLyogUmVjZWl2ZSBGSUZPIFNlcnZpY2UJCSovCi0KLS8qIFRXSV9GSUZPX0NUUkwgTWFza3MJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlYTVRGTFVTSAkweDAwMDEJCS8qIFRyYW5zbWl0IEJ1ZmZlciBGbHVzaAkJCSovCi0jZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2gJCQkJKi8KLSNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KLSNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLwotCi0vKiBUV0lfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cwkJCQkJCQkqLwotI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKiAJCVRyYW5zbWl0IEZJRk8gRW1wdHkJCQkJCQkqLwotI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qIAkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlCQkqLwotI2RlZmluZQlYTVRfRlVMTAkweDAwMDMJCS8qIAkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKQkqLwotCi0jZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPIFN0YXR1cwkJCQkJCQkqLwotI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKiAJCVJlY2VpdmUgRklGTyBFbXB0eQkJCQkJCSovCi0jZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyogCQlSZWNlaXZlIEZJRk8gSGFzIDEgQnl0ZSBUbyBSZWFkCQkJKi8KLSNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKiAJCVJlY2VpdmUgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpCQkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqICBQSU4gQ09OVFJPTCBSRUdJU1RFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUE9SVF9NVVggTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlQSlNFCQkJMHgwMDAxCQkJLyogUG9ydCBKIFNQSS9TUE9SVCBFbmFibGUJCQkqLwotI2RlZmluZQlQSlNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBURlMwL0RUMFBSSQkJCSovCi0jZGVmaW5lCVBKU0VfU1BJCQkweDAwMDEJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDM6MgkJCSovCi0KLSNkZWZpbmUJUEpDRSh4KQkJCSgoKHgpJjB4Myk8PDEpCS8qIFBvcnQgSiBDQU4vU1BJL1NQT1JUIEVuYWJsZQkJKi8KLSNkZWZpbmUJUEpDRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgRFIwU0VDL0RUMFNFQwkJKi8KLSNkZWZpbmUJUEpDRV9DQU4JCTB4MDAwMgkJCS8qIAkJRW5hYmxlIENBTiBSWC9UWAkJCSovCi0jZGVmaW5lCVBKQ0VfU1BJCQkweDAwMDQJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDcJCQkqLwotCi0jZGVmaW5lCVBGREUJCQkweDAwMDgJCQkvKiBQb3J0IEYgRE1BIFJlcXVlc3QgRW5hYmxlCQkqLwotI2RlZmluZQlQRkRFX1VBUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFVBUlQwIFJYL1RYCQkJKi8KLSNkZWZpbmUJUEZERV9ETUEJCTB4MDAwOAkJCS8qIAkJRW5hYmxlIERNQVIxOjAJCQkJKi8KLQotI2RlZmluZQlQRlRFCQkJMHgwMDEwCQkJLyogUG9ydCBGIFRpbWVyIEVuYWJsZQkJCQkqLwotI2RlZmluZQlQRlRFX1VBUlQJCTB4MDAwMAkJCS8qCQlFbmFibGUgVUFSVDEgUlgvVFgJCQkqLwotI2RlZmluZQlQRlRFX1RJTUVSCQkweDAwMTAJCQkvKiAJCUVuYWJsZSBUTVI3OjYJCQkJKi8KLQotI2RlZmluZQlQRlM2RQkJCTB4MDAyMAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA2IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzZFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjUJCQkJCSovCi0jZGVmaW5lCVBGUzZFX1NQSQkJMHgwMDIwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw2CQkJKi8KLQotI2RlZmluZQlQRlM1RQkJCTB4MDA0MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA1IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzVFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjQJCQkJCSovCi0jZGVmaW5lCVBGUzVFX1NQSQkJMHgwMDQwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw1CQkJKi8KLQotI2RlZmluZQlQRlM0RQkJCTB4MDA4MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA0IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzRFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjMJCQkJCSovCi0jZGVmaW5lCVBGUzRFX1NQSQkJMHgwMDgwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw0CQkJKi8KLQotI2RlZmluZQlQRkZFCQkJMHgwMTAwCQkJLyogUG9ydCBGIFBQSSBGcmFtZSBTeW5jIEVuYWJsZQkJKi8KLSNkZWZpbmUJUEZGRV9USU1FUgkJMHgwMDAwCQkJLyogCQlFbmFibGUgVE1SMgkJCQkJKi8KLSNkZWZpbmUJUEZGRV9QUEkJCTB4MDEwMAkJCS8qIAkJRW5hYmxlIFBQSSBGUzMJCQkJKi8KLQotI2RlZmluZQlQR1NFCQkJMHgwMjAwCQkJLyogUG9ydCBHIFNQT1JUMSBTZWNvbmRhcnkgRW5hYmxlCSovCi0jZGVmaW5lCVBHU0VfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDk6OAkJCQkqLwotI2RlZmluZQlQR1NFX1NQT1JUCQkweDAyMDAJCQkvKiAJCUVuYWJsZSBEUjFTRUMvRFQxU0VDCQkqLwotCi0jZGVmaW5lCVBHUkUJCQkweDA0MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFJlY2VpdmUgRW5hYmxlCQkqLwotI2RlZmluZQlQR1JFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxMjoxMAkJCSovCi0jZGVmaW5lCVBHUkVfU1BPUlQJCTB4MDQwMAkJCS8qIAkJRW5hYmxlIERSMVBSSS9SRlMxL1JTQ0xLMQkqLwotCi0jZGVmaW5lCVBHVEUJCQkweDA4MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFRyYW5zbWl0IEVuYWJsZQkqLwotI2RlZmluZQlQR1RFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxNToxMwkJCSovCi0jZGVmaW5lCVBHVEVfU1BPUlQJCTB4MDgwMAkJCS8qIAkJRW5hYmxlIERUMVBSSS9URlMxL1RTQ0xLMQkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqKiogIEhBTkRTSEFLRSBETUEgKEhETUEpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKiovCi0vKiBIRE1BeF9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCUhNRE1BRU4JCTB4MDAwMQkvKiBFbmFibGUgSGFuZHNoYWtlIERNQSAwLzEJCQkJCSovCi0jZGVmaW5lCVJFUAkJCTB4MDAwMgkvKiBIRE1BIFJlcXVlc3QgUG9sYXJpdHkJCQkJCSovCi0jZGVmaW5lCVVURQkJCTB4MDAwNAkvKiBVcmdlbmN5IFRocmVzaG9sZCBFbmFibGUJCQkJCSovCi0jZGVmaW5lCU9JRQkJCTB4MDAxMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCi0jZGVmaW5lCUJESUUJCTB4MDAyMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBFbmFibGUJCQkJKi8KLSNkZWZpbmUJTUJESQkJMHgwMDQwCS8qIE1hc2sgQmxvY2sgRG9uZSBJUlEgSWYgUGVuZGluZyBFQ05UCQkqLwotI2RlZmluZQlEUlEJCQkweDAzMDAJLyogSERNQSBSZXF1ZXN0IFR5cGUJCQkJCQkqLwotI2RlZmluZQlEUlFfTk9ORQkweDAwMDAJLyogCQlObyBSZXF1ZXN0CQkJCQkJCSovCi0jZGVmaW5lCURSUV9TSU5HTEUJMHgwMTAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBTaW5nbGUJCQkJKi8KLSNkZWZpbmUJRFJRX01VTFRJCTB4MDIwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgKERlZmF1bHQpCSovCi0jZGVmaW5lCURSUV9VUkdFTlQJMHgwMzAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSBVcmdlbnQJCSovCi0jZGVmaW5lCVJCQwkJCTB4MTAwMAkvKiBSZWxvYWQgQkNOVCBXaXRoIElCQ05UCQkJCQkqLwotI2RlZmluZQlQUwkJCTB4MjAwMAkvKiBIRE1BIFBpbiBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJT0kJCQkweDQwMDAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEdlbmVyYXRlZAkJCQkqLwotI2RlZmluZQlCREkJCQkweDgwMDAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJKi8KLQotLyogZW50cnkgYWRkcmVzc2VzIG9mIHRoZSB1c2VyLWNhbGxhYmxlIEJvb3QgUk9NIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIF9CT09UUk9NX1JFU0VUIDB4RUYwMDAwMDAKLSNkZWZpbmUgX0JPT1RST01fRklOQUxfSU5JVCAweEVGMDAwMDAyCi0jZGVmaW5lIF9CT09UUk9NX0RPX01FTU9SWV9ETUEgMHhFRjAwMDAwNgotI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9GTEFTSCAweEVGMDAwMDA4Ci0jZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1NQSSAweEVGMDAwMDBBCi0jZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1RXSSAweEVGMDAwMDBDCi0jZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19GTEFTSCAweEVGMDAwMDEwCi0jZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19TUEkgMHhFRjAwMDAxMgotI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfVFdJIDB4RUYwMDAwMTQKLQotLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lCVBHREVfVUFSVCAgIFBGREVfVUFSVAotI2RlZmluZQlQR0RFX0RNQSAgICBQRkRFX0RNQQotI2RlZmluZQlDS0VMT1cJCVNDS0VMT1cKLQotLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DT05UUk9MICAweGZmYzAzNDAwICAgLyogSE9TVCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVFVTICAweGZmYzAzNDA0ICAgLyogSE9TVCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1RJTUVPVVQgIDB4ZmZjMDM0MDggICAvKiBIT1NUIEFja25vd2xlZGdlIE1vZGUgVGltZW91dCBSZWdpc3RlciAqLwotCi0vKiBDb3VudGVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09ORklHICAweGZmYzAzNTAwICAgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIENOVF9JTUFTSyAgMHhmZmMwMzUwNCAgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfU1RBVFVTICAweGZmYzAzNTA4ICAgLyogU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT01NQU5EICAweGZmYzAzNTBjICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENOVF9ERUJPVU5DRSAgMHhmZmMwMzUxMCAgIC8qIERlYm91bmNlIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT1VOVEVSICAweGZmYzAzNTE0ICAgLyogQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01BWCAgMHhmZmMwMzUxOCAgIC8qIE1heGltYWwgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NSU4gIDB4ZmZjMDM1MWMgICAvKiBNaW5pbWFsIENvdW50IFJlZ2lzdGVyICovCi0KLS8qIE9UUC9GVVNFIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE9UUF9DT05UUk9MICAweGZmYzAzNjAwICAgLyogT1RQL0Z1c2UgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0JFTiAgMHhmZmMwMzYwNCAgIC8qIE9UUC9GdXNlIEJ5dGUgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfU1RBVFVTICAweGZmYzAzNjA4ICAgLyogT1RQL0Z1c2UgU3RhdHVzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfVElNSU5HICAweGZmYzAzNjBjICAgLyogT1RQL0Z1c2UgQWNjZXNzIFRpbWluZyAqLwotCi0vKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NZU1NXVCAgMHhmZmMwMzYyMCAgIC8qIFNlY3VyZSBTeXN0ZW0gU3dpdGNoZXMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFX0NPTlRST0wgIDB4ZmZjMDM2MjQgICAvKiBTZWN1cmUgQ29udHJvbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NUQVRVUyAgMHhmZmMwMzYyOCAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KLQotLyogT1RQIFJlYWQvV3JpdGUgRGF0YSBCdWZmZXIgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTAgIDB4ZmZjMDM2ODAgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTEgIDB4ZmZjMDM2ODQgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTIgIDB4ZmZjMDM2ODggICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTMgIDB4ZmZjMDM2OGMgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLQotLyogTW90b3IgQ29udHJvbCBQV00gUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NUUkwgIDB4ZmZjMDM3MDAgICAvKiBQV00gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fU1RBVCAgMHhmZmMwMzcwNCAgIC8qIFBXTSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fVE0gIDB4ZmZjMDM3MDggICAvKiBQV00gUGVyaW9kIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0RUICAweGZmYzAzNzBjICAgLyogUFdNIERlYWQgVGltZSBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fR0FURSAgMHhmZmMwMzcxMCAgIC8qIFBXTSBDaG9wcGluZyBDb250cm9sICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hBICAweGZmYzAzNzE0ICAgLyogUFdNIENoYW5uZWwgQSBEdXR5IENvbnRyb2wgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEIgIDB4ZmZjMDM3MTggICAvKiBQV00gQ2hhbm5lbCBCIER1dHkgQ29udHJvbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQyAgMHhmZmMwMzcxYyAgIC8qIFBXTSBDaGFubmVsIEMgRHV0eSBDb250cm9sICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fU0VHICAweGZmYzAzNzIwICAgLyogUFdNIENyb3Nzb3ZlciBhbmQgT3V0cHV0IEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NZTkNXVCAgMHhmZmMwMzcyNCAgIC8qIFBXTSBTeW5jIFBsdXNlIFdpZHRoIENvbnRyb2wgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQUwgIDB4ZmZjMDM3MjggICAvKiBQV00gQ2hhbm5lbCBBTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQkwgIDB4ZmZjMDM3MmMgICAvKiBQV00gQ2hhbm5lbCBCTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQ0wgIDB4ZmZjMDM3MzAgICAvKiBQV00gQ2hhbm5lbCBDTCBEdXR5IENvbnRyb2wgKFNSIG1vZGUgb25seSkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9MU0kgIDB4ZmZjMDM3MzQgICAvKiBQV00gTG93IFNpZGUgSW52ZXJ0IChTUiBtb2RlIG9ubHkpICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NUQVQyICAweGZmYzAzNzM4ICAgLyogUFdNIFN0YXR1cyBSZWdpc3RlciAyICovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogICAgIFNJTkdMRSBCSVQgTUFDUk8gUEFJUlMgKGJpdCBtYXNrIGFuZCBuZWdhdGVkIG9uZSkgICAgICAqLwotLyogICAgIGFuZCBNVUxUSSBCSVQgUkVBRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBCaXQgbWFza3MgZm9yIEhPU1RfQ09OVFJPTCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VOICAweDEgICAgICAgIC8qIEhvc3QgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTkQgIDB4MiAgICAgICAgLyogSG9zdCBFbmRpYW5lc3MgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTkQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0RBVEFfU0laRSAgMHg0ICAgICAgICAvKiBEYXRhIFNpemUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25EQVRBX1NJWkUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX1JTVCAgMHg4ICAgICAgICAvKiBIb3N0IFJlc2V0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfUlNUICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSFJEWV9PVlIgIDB4MjAgICAgICAgLyogSG9zdCBSZWFkeSBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IUkRZX09WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0lOVF9NT0RFICAweDQwICAgICAgIC8qIEludGVycnVwdCBNb2RlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbklOVF9NT0RFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQlRfRU4gIDB4ODAgICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl8gbkJUX0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFcgIDB4MTAwICAgICAgLyogRW5hYmxlIEhvc3QgV3JpdGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFcgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIUiAgMHgyMDAgICAgICAvKiBFbmFibGUgSG9zdCBSZWFkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CRFIgIDB4NDAwICAgICAgLyogQnVyc3QgRE1BIFJlcXVlc3RzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uQkRSICAweDAKLQotLyogQml0IG1hc2tzIGZvciBIT1NUX1NUQVRVUyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1JFQURZICAweDEgICAgICAgIC8qIERNQSBSZWFkeSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25SRUFEWSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9GVUxMICAweDIgICAgICAgIC8qIEZJRk8gRnVsbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRlVMTCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0VNUFRZICAweDQgICAgICAgIC8qIEZJRk8gRW1wdHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRU1QVFkgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9DT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQ09NUExFVEUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSFNISyAgMHgxMCAgICAgICAvKiBIb3N0IEhhbmRzaGFrZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSFNISyAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9USU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uVElNRU9VVCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ISVJRICAweDQwICAgICAgIC8qIEhvc3QgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhJUlEgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQUxMT1dfQ05GRyAgMHg4MCAgICAgICAvKiBBbGxvdyBOZXcgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQUxMT1dfQ05GRyAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ETUFfRElSICAweDEwMCAgICAgIC8qIERNQSBEaXJlY3Rpb24gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkRNQV9ESVIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0JURSAgMHgyMDAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGVkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQlRFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfSE9TVFJEX0RPTkUgIDB4ODAwMCAgICAgLyogSG9zdCBSZWFkIENvbXBsZXRpb24gSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhPU1RSRF9ET05FICAweDAKLQotLyogQml0IG1hc2tzIGZvciBIT1NUX1RJTUVPVVQgKi8KLQotI2RlZmluZSAgICAgICAgICAgICBIT1NUX0NPVU5UX1RJTUVPVVQgIDB4N2ZmICAgICAgLyogSG9zdCBUaW1lb3V0IGNvdW50ICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NZU1NXVCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEVNVURBQkwgIDB4MSAgICAgICAgLyogRW11bGF0aW9uIERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkVNVURBQkwgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBSU1REQUJMICAweDIgICAgICAgIC8qIFJlc2V0IERpc2FibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuUlNUREFCTCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEwxSURBQkwgIDB4MWMgICAgICAgLyogTDEgSW5zdHJ1Y3Rpb24gTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQURBQkwgIDB4ZTAgICAgICAgLyogTDEgRGF0YSBCYW5rIEEgTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQkRBQkwgIDB4NzAwICAgICAgLyogTDEgRGF0YSBCYW5rIEIgTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTBPVlIgIDB4ODAwICAgICAgLyogRE1BMCBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTBPVlIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUExT1ZSICAweDEwMDAgICAgIC8qIERNQTEgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUExT1ZSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVNVU9WUiAgMHg0MDAwICAgICAvKiBFbXVsYXRpb24gT3ZlcnJpZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkVNVU9WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBPVFBTRU4gIDB4ODAwMCAgICAgLyogT1RQIFNlY3JldHMgRW5hYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBuT1RQU0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEwyREFCTCAgMHg3MDAwMCAgICAvKiBMMiBNZW1vcnkgRGlzYWJsZS4gKi8KLQotLyogQml0IG1hc2tzIGZvciBTRUNVUkVfQ09OVFJPTCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTAgIDB4MSAgICAgICAgLyogU0VDVVJFIDAgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTEgIDB4MiAgICAgICAgLyogU0VDVVJFIDEgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTIgIDB4NCAgICAgICAgLyogU0VDVVJFIDIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTMgIDB4OCAgICAgICAgLyogU0VDVVJFIDMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMyAgMHgwCi0KLS8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NUQVRVUyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ01PREUgIDB4MyAgICAgICAgLyogU2VjdXJlZCBNb2RlIENvbnRyb2wgU3RhdGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE5NSSAgMHg0ICAgICAgICAvKiBOb24gTWFza2FibGUgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIG5OTUkgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBBRlZBTElEICAweDggICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIFZhbGlkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkFGVkFMSUQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQUZFWElUICAweDEwICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIEV4aXQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkFGRVhJVCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1NUQVQgIDB4ZTAgICAgICAgLyogU2VjdXJlIFN0YXR1cyAqLwotCi0KLQotI2VuZGlmIC8qIF9ERUZfQkY1MVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA5YWY2Y2UwLi5iNDgwNzA1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtNTUsNCArNTUsOCBAQAogI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKICNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCiAKKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1mLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZy5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWguaD4KKwogI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcGxsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BsbC5oCmluZGV4IGQ1NTAyOTguLjk0Y2NhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcGxsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wbGwuaApAQCAtMSw2MyArMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9NQUNIX1BMTF9ICi0jZGVmaW5lIF9NQUNIX1BMTF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KLQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9hZDcxNjBldmFsLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYwppbmRleCA1MjI5NWZmLi5jY2FiNGM2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2FkNzE2MGV2YWwuYwpAQCAtNjcsNiArNjcsNyBAQAogCSAqIGlmIGl0IGlzIHRoZSBjYXNlLgogCSAqLwogCS5ncGlvX3Zyc2VsX2FjdGl2ZQk9IDEsCisJLmNsa2luICAgICAgICAgID0gMjQsICAgICAgICAgICAvKiBtdXNiIENMS0lOIGluIE1IWiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CkBAIC00MTksNyArNDIwLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC00NzQsNyArNDc1LDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC02MjcsOSArNjI4LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNjYxLDkgKzY2Miw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwppbmRleCA1MDUzM2VkLi5jOWQ2ZGM4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiBpZiBpdCBpcyB0aGUgY2FzZS4KIAkgKi8KIAkuZ3Bpb192cnNlbF9hY3RpdmUJPSAxLAorCS5jbGtpbiAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyogbXVzYiBDTEtJTiBpbiBNSFogKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewpAQCAtNjE0LDcgKzYxNSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNjY5LDcgKzY3MCw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtODAxLDkgKzgwMiw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTgzNSw5ICs4MzYsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKaW5kZXggZDA2MTc3Yi4uYjcxMDFhYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYwpAQCAtNjgsNiArNjgsNyBAQAogCSAqIGlmIGl0IGlzIHRoZSBjYXNlLgogCSAqLwogCS5ncGlvX3Zyc2VsX2FjdGl2ZQk9IDEsCisJLmNsa2luICAgICAgICAgID0gMjQsICAgICAgICAgICAvKiBtdXNiIENMS0lOIGluIE1IWiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CkBAIC00OTksNyArNTAwLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC01NTQsNyArNTU1LDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC02ODEsOSArNjgyLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNzE1LDkgKzcxNiw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCAzNWE4OGE1Li4yY2QyZmY2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC0xMDgsNiArMTA4LDcgQEAKIAkgKiBpZiBpdCBpcyB0aGUgY2FzZS4KIAkgKi8KIAkuZ3Bpb192cnNlbF9hY3RpdmUJPSAxLAorCS5jbGtpbiAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyogbXVzYiBDTEtJTiBpbiBNSFogKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewpAQCAtNzA4LDcgKzcwOSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNzYzLDcgKzc2NCw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtOTYyLDYgKzk2MywxMSBAQAogCQlJMkNfQk9BUkRfSU5GTygiYWQ1MjUyIiwgMHgyZiksCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfQURBVTEzNzMpIHx8IGRlZmluZWQoQ09ORklHX1NORF9TT0NfQURBVTEzNzNfTU9EVUxFKQorCXsKKwkJSTJDX0JPQVJEX0lORk8oImFkYXUxMzczIiwgMHgxQSksCisJfSwKKyNlbmRpZgogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVF9NT0RVTEUpCkBAIC05ODQsOSArOTkwLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtMTAxOCw5ICsxMDI0LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jCmluZGV4IDEzMDg2MWIuLjE4ZDMwM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCUdQSU9fUEcxLCBHUElPX1BIOSwgR1BJT19QSDEwCiB9OwogCi1zdGF0aWMgc3RydWN0IGdwaW9fZGVjb2Rlcl9wbGF0ZnJvbV9kYXRhIHNwaV9kZWNvZGVkX2NzID0geworc3RhdGljIHN0cnVjdCBncGlvX2RlY29kZXJfcGxhdGZvcm1fZGF0YSBzcGlfZGVjb2RlZF9jcyA9IHsKIAkuYmFzZQkJPSBFWFBfR1BJT19TUElTRUxfQkFTRSwKIAkuaW5wdXRfYWRkcnMJPSBncGlvX2FkZHJfaW5wdXRzLAogCS5ucl9pbnB1dF9hZGRycyA9IEFSUkFZX1NJWkUoZ3Bpb19hZGRyX2lucHV0cyksCkBAIC01ODYsNyArNTg2LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC02NDIsNyArNjQyLDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC03OTksOSArNzk5LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtODM0LDkgKzgzNCw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYwppbmRleCA3YmM3NTc3Li4xZmFiZGVmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqIGNvbnN0IGRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjNjAzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogbWFjaC9iZmluX3NlcmlhbC5oIC0gQmxhY2tmaW4gVUFSVC9TZXJpYWwgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisjZGVmaW5lIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKworI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCmluZGV4IGMxZDU1YjguLjk2MGUwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtNCwzNiArNCw5IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAKLSNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUVSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMSCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUlSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lJUikpCi0jZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQotI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCi0KLSNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgVUFSVF9TRVRfSUVSKHVhcnQsIHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsIHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfR0NUTCh1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCiAjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAKQEAgLTU0LDUwICsyNyw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotLyoKLSAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKLSAqLwotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKLQl1bnNpZ25lZCBpbnQgb2xkX3N0YXR1czsKLQlpbnQgc3RhdHVzX2lycTsKLQl1bnNpZ25lZCBpbnQgbHNyOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQgdHhfZG9uZTsKLQlpbnQgdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcnhfZG1hX3RpbWVyOwotCWludCByeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50IHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCByeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlzdHJ1Y3QgdGltZXJfbGlzdCBjdHNfdGltZXI7Ci0JaW50IGN0c19waW47Ci0JaW50IHJ0c19waW47Ci0jZW5kaWYKLX07Ci0KLS8qIFRoZSBoYXJkd2FyZSBjbGVhcnMgdGhlIExTUiBiaXRzIHVwb24gcmVhZCwgc28gd2UgbmVlZCB0byBjYWNoZQotICogc29tZSBvZiB0aGUgbW9yZSBmdW4gYml0cyBpbiBzb2Z0d2FyZSBzbyB0aGV5IGRvbid0IGdldCBsb3N0Ci0gKiB3aGVuIGNoZWNraW5nIHRoZSBMU1IgaW4gb3RoZXIgY29kZSBwYXRocyAoVFgpLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBVQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXVhcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHVhcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVhcnQtPmxzciA9IDA7Ci0JYmZpbl93cml0ZTE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IsIC0xKTsKLX0KLQogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZyB1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQgdWFydF9pcnE7CkBAIC0xNDYsMyArNzUsNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggZjcxNGM1ZC4uZTFkMjc5MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw0OSArMSwzNyBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXwogI2RlZmluZSBfTUFDSF9CTEFDS0ZJTl9IXwogCiAjaW5jbHVkZSAiYmY1MjcuaCIKLSNpbmNsdWRlICJkZWZCRjUyMi5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTI3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyNikKLSNpbmNsdWRlICJkZWZCRjUyNy5oIgorI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorI2lmIGRlZmluZWQoQ09ORklHX0JGNTIzKSB8fCBkZWZpbmVkKENPTkZJR19CRjUyMikKKyMgaW5jbHVkZSAiZGVmQkY1MjIuaCIKICNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfQkY1MjUpIHx8IGRlZmluZWQoQ09ORklHX0JGNTI0KQotI2luY2x1ZGUgImRlZkJGNTI1LmgiCisjIGluY2x1ZGUgImRlZkJGNTI1LmgiCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUyNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjYpCisjIGluY2x1ZGUgImRlZkJGNTI3LmgiCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKLSNpbmNsdWRlICJjZGVmQkY1MjIuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGNTI3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyNikKLSNpbmNsdWRlICJjZGVmQkY1MjcuaCIKKyMgaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorIyBpZiBkZWZpbmVkKENPTkZJR19CRjUyMykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjIpCisjICBpbmNsdWRlICJjZGVmQkY1MjIuaCIKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChDT05GSUdfQkY1MjUpIHx8IGRlZmluZWQoQ09ORklHX0JGNTI0KQorIyAgaW5jbHVkZSAiY2RlZkJGNTI1LmgiCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0JGNTI3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyNikKKyMgIGluY2x1ZGUgImNkZWZCRjUyNy5oIgorIyBlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRjUyNSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MjQpCi0jaW5jbHVkZSAiY2RlZkJGNTI1LmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkyCi0KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjIuaAppbmRleCAxMDc5YWY4Li42MThkZmNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTIyLmgKQEAgLTEsMjEgKzEsMTA5NSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUyMl9ICiAjZGVmaW5lIF9DREVGX0JGNTIyX0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTIyLmgiCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKQkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkJCQliZmluX3JlYWQxNihQTExfRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJCWJmaW5fcmVhZDE2KFZSX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkJCQliZmluX3JlYWQxNihQTExfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCQliZmluX3JlYWQxNihQTExfTE9DS0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX0xPQ0tDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NISVBJRCgpCQkJYmZpbl9yZWFkMzIoQ0hJUElEKQorI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpCQkJYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQogCi0vKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MjIgKi8KKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpCQkJYmZpbl9yZWFkMTYoU1dSU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKQkJCWJmaW5fd3JpdGUxNihTV1JTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1lTQ1IoKQkJCWJmaW5fcmVhZDE2KFNZU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkJCQliZmluX3dyaXRlMTYoU1lTQ1IsIHZhbCkKIAotLyogaW5jbHVkZSBjZGVmQkY1MnhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUyeCBwcm9jZXNzb3JzICovCi0jaW5jbHVkZSAiY2RlZkJGNTJ4X2Jhc2UuaCIKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19SVkVDVCgpCQkJYmZpbl9yZWFkMzIoU0lDX1JWRUNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX1JWRUNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0swKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSU1BU0swICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIwKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIyKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIzKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JU1IwICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVdSMCArICh4IDw8IDYpKSwgdmFsKQorCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MnggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI1KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI2KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI3KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIHZhbCkKKworLyogV2F0Y2hkb2cgVGltZXIJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfV0RPR19DVEwoKQkJCWJmaW5fcmVhZDE2KFdET0dfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihXRE9HX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19DTlQoKQkJCWJmaW5fcmVhZDMyKFdET0dfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ05UKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkJCQliZmluX3JlYWQzMihXRE9HX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX1NUQVQsIHZhbCkKKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFJUQ19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lDVEwoKQkJCWJmaW5fcmVhZDE2KFJUQ19JQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSUNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lTVEFUKCkJCQliZmluX3JlYWQxNihSVENfSVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TV0NOVCgpCQkJYmZpbl9yZWFkMTYoUlRDX1NXQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TV0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKQkJCWJmaW5fcmVhZDMyKFJUQ19BTEFSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfQUxBUk0odmFsKQkJYmZpbl93cml0ZTMyKFJUQ19BTEFSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0ZBU1QoKQkJCWJmaW5fcmVhZDE2KFJUQ19GQVNUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19GQVNUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfRkFTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1BSRU4oKQkJCWJmaW5fcmVhZDE2KFJUQ19QUkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQorCisKKy8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMF9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMF9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0dDVEwsIHZhbCkKKworCisvKiBTUEkgQ29udHJvbGxlcgkJKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfQ1RMKCkJCQliZmluX3JlYWQxNihTUElfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9DVEwodmFsKQkJCWJmaW5fd3JpdGUxNihTUElfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfRkxHKCkJCQliZmluX3JlYWQxNihTUElfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9GTEcodmFsKQkJCWJmaW5fd3JpdGUxNihTUElfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BJX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfVERCUigpCQkJYmZpbl9yZWFkMTYoU1BJX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1REQlIodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfUkRCUigpCQkJYmZpbl9yZWFkMTYoU1BJX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1JEQlIodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfQkFVRCgpCQkJYmZpbl9yZWFkMTYoU1BJX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0JBVUQodmFsKQkJYmZpbl93cml0ZTE2KFNQSV9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUElfU0hBRE9XKCkJCQliZmluX3JlYWQxNihTUElfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9TSEFET1codmFsKQkJYmZpbl93cml0ZTE2KFNQSV9TSEFET1csIHZhbCkKKworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIwX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIxX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIzX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI0X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI1X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI2X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI3X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9FTkFCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9ESVNBQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0RJU0FCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRElTQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRElTQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKCkJCWJmaW5fcmVhZDMyKFRJTUVSX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSX1NUQVRVUywgdmFsKQorCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkJCQliZmluX3JlYWQxNihQT1JURklPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JURklPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JURklPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JURklPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JURklPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JURklPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0lORU4sIHZhbCkKKworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVENMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVEZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfQ0hOTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMywgdmFsKQorCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNR0NUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfQU1HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDAoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwwKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDEoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwxKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMSh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NER0NUTCgpCQkJYmZpbl9yZWFkMzIoRUJJVV9TREdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREdDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TREJDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREJDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RCQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEUlJDKCkJCQliZmluX3JlYWQxNihFQklVX1NEUlJDKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkJCQliZmluX3JlYWQxNihFQklVX1NEU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFNUQVQsIHZhbCkKKworCisvKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19QRVIoKQkJCWJmaW5fcmVhZDE2KERNQUNfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUNfVENfUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFDX1RDX1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19DTlQoKQkJCWJmaW5fcmVhZDE2KERNQUNfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUNfVENfQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFDX1RDX0NOVCwgdmFsKQorCisvKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTZfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BN19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE5X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTExX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihQUElfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX2NsZWFyX1BQSV9TVEFUVVMoKQkJCWJmaW5fd3JpdGVfUFBJX1NUQVRVUygweEZGRkYpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfREVMQVkoKQkJCWJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkJCQliZmluX3JlYWQxNihQUElfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpCQkJYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0ZSQU1FLCB2YWwpCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEdJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEdJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19JTkVOLCB2YWwpCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRISU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRISU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUSElPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fSU5FTiwgdmFsKQorCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMV9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01TUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMV9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQorCisvKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGNkZWZCRjUzNC5oIChDQU4gaXMgbm90IGluIHRoZSBBRFNQLUJGNTJ4IHByb2Nlc3NvcikgKi8KKworLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUR19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVF9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRfTVVYLCB2YWwpCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQorCisvKiA9PT09IGVuZCBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfTVVYKCkJCQliZmluX3JlYWQxNihQT1JURl9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9NVVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfTVVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX01VWCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JURl9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEhfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRGX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JURl9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRHX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR19IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRIX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSF9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9EUklWRSgpCQliZmluX3JlYWQxNihNSVNDUE9SVF9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX1NMRVcoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9IWVNURVJJU0lTLCB2YWwpCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfSE9TVF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhPU1RfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KEhPU1RfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9USU1FT1VUKCkJCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfVElNRU9VVCwgdmFsKQorCisvKiBDb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09ORklHKCkJCQliZmluX3JlYWQxNihDTlRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9JTUFTSygpCQkJYmZpbl9yZWFkMTYoQ05UX0lNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9JTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0lNQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfU1RBVFVTKCkJCQliZmluX3JlYWQxNihDTlRfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KENOVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT01NQU5EKCkJCQliZmluX3JlYWQxNihDTlRfQ09NTUFORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09NTUFORCh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTU1BTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9ERUJPVU5DRSgpCQliZmluX3JlYWQxNihDTlRfREVCT1VOQ0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0RFQk9VTkNFKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfREVCT1VOQ0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT1VOVEVSKCkJCQliZmluX3JlYWQzMihDTlRfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoQ05UX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NQVgoKQkJCWJmaW5fcmVhZDMyKENOVF9NQVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01BWCh2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NQVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NSU4oKQkJCWJmaW5fcmVhZDMyKENOVF9NSU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01JTih2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NSU4sIHZhbCkKKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TWVNTV1QoKQkJYmZpbl9yZWFkMzIoU0VDVVJFX1NZU1NXVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1lTU1dUKHZhbCkJCWJmaW5fd3JpdGUzMihTRUNVUkVfU1lTU1dULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfQ09OVFJPTCgpCQliZmluX3JlYWQxNihTRUNVUkVfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoU0VDVVJFX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfU1RBVFVTLCB2YWwpCisKKy8qIE5GQyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfTkZDX0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1NUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUVNUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUU1BU0soKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzAoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MwKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MwKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzEoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MxKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MxKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzIoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MyKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MyKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzMoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MzKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MzKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0NPVU5UKCkJCQliZmluX3JlYWQxNihORkNfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19SU1QoKQkJCWJmaW5fcmVhZDE2KE5GQ19SU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19SU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19QR0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX1BHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19QR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1BHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUkVBRCgpCQkJYmZpbl9yZWFkMTYoTkZDX1JFQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JFQUQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19SRUFELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQUREUigpCQkJYmZpbl9yZWFkMTYoTkZDX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQ01EKCkJCQliZmluX3JlYWQxNihORkNfQ01EKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19DTUQodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfQ01ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9XUigpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfV1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfV1IodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1dSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9SRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfUkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfUkQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1JELCB2YWwpCiAKICNlbmRpZiAvKiBfQ0RFRl9CRjUyMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjUuaAppbmRleCBkN2UyNzUxLi5kOTBhODViIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI1LmgKQEAgLTEsMTUgKzEsMTIgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MjVfSAogI2RlZmluZSBfQ0RFRl9CRjUyNV9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjUyNS5oIgotCiAvKiBCRjUyNSBpcyBCRjUyMiArIFVTQiAqLwogI2luY2x1ZGUgImNkZWZCRjUyMi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaAppbmRleCBjN2JhNTQ0Li5lYjIyZjU4NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNy5oCkBAIC0xLDE1ICsxLDEyIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTI3X0gKICNkZWZpbmUgX0NERUZfQkY1MjdfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MjcuaCIKLQogLyogQkY1MjcgaXMgQkY1MjUgKyBFTUFDICovCiAjaW5jbHVkZSAiY2RlZkJGNTI1LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0OGI1MmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCi0gKi8KLQotI2lmbmRlZiBfQ0RFRl9CRjUyWF9ICi0jZGVmaW5lIF9DREVGX0JGNTJYX0gKLQotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0jaW5jbHVkZSAiZGVmQkY1MnhfYmFzZS5oIgotCi0vKiBJbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAJCQkJCQkJCSovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCi0vKiA9PT09IGJlZ2luIGZyb20gY2RlZkJGNTM0LmggPT09PSAqLwotCi0vKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKQkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkJCQliZmluX3JlYWQxNihQTExfRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJCWJmaW5fcmVhZDE2KFZSX0NUTCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkJCQliZmluX3JlYWQxNihQTExfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCQliZmluX3JlYWQxNihQTExfTE9DS0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX0xPQ0tDTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NISVBJRCgpCQkJYmZpbl9yZWFkMzIoQ0hJUElEKQotI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpCQkJYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQotCi0KLS8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpCQkJYmZpbl9yZWFkMTYoU1dSU1QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKQkJCWJmaW5fd3JpdGUxNihTV1JTVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1lTQ1IoKQkJCWJmaW5fcmVhZDE2KFNZU0NSKQotI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkJCQliZmluX3dyaXRlMTYoU1lTQ1IsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX1JWRUNUKCkJCQliZmluX3JlYWQzMihTSUNfUlZFQ1QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX1JWRUNUKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfUlZFQ1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCArICh4IDw8IDYpKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSyh4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSksIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIwKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIxKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjIoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIyKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIyKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjMoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVIzKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIzKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSMywgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjAgKyAoeCA8PCA2KSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lTUjAgKyAoeCA8PCA2KSksIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IwICsgKHggPDwgNikpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JV1IwICsgKHggPDwgNikpLCB2YWwpCi0KLS8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUyeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lNQVNLMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjQoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI0KQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI0KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjUoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI1KQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI1KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjYoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI2KQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI2KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjcoKQkJCWJmaW5fcmVhZDMyKFNJQ19JQVI3KQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI3KHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSUFSNywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjEoKQkJCWJmaW5fcmVhZDMyKFNJQ19JV1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgdmFsKQotCi0vKiBXYXRjaGRvZyBUaW1lcgkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NUTCgpCQkJYmZpbl9yZWFkMTYoV0RPR19DVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DVEwodmFsKQkJYmZpbl93cml0ZTE2KFdET0dfQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NOVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19DTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19DTlQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfQ05ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9XRE9HX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFdET0dfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFdET0dfU1RBVCwgdmFsKQotCi0KLS8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfU1RBVCgpCQkJYmZpbl9yZWFkMzIoUlRDX1NUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKFJUQ19TVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfSUNUTCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lDVEwodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfSVNUQVQoKQkJCWJmaW5fcmVhZDE2KFJUQ19JU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfSVNUQVQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19JU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX1NXQ05UKCkJCQliZmluX3JlYWQxNihSVENfU1dDTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NXQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfU1dDTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19BTEFSTSgpCQkJYmZpbl9yZWFkMzIoUlRDX0FMQVJNKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19BTEFSTSh2YWwpCQliZmluX3dyaXRlMzIoUlRDX0FMQVJNLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfRkFTVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0ZBU1QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0ZBU1QodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19GQVNULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfUFJFTigpCQkJYmZpbl9yZWFkMTYoUlRDX1BSRU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1BSRU4odmFsKQkJYmZpbl93cml0ZTE2KFJUQ19QUkVOLCB2YWwpCi0KLQotLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1RIUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1RIUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMF9SQlIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9SQlIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExMKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUlSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUlSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTFNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTFNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01TUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01TUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMF9TQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9TQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0dDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfR0NUTCwgdmFsKQotCi0KLS8qIFNQSSBDb250cm9sbGVyCQkoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9DVEwoKQkJCWJmaW5fcmVhZDE2KFNQSV9DVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0NUTCh2YWwpCQkJYmZpbl93cml0ZTE2KFNQSV9DVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9GTEcoKQkJCWJmaW5fcmVhZDE2KFNQSV9GTEcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BJX0ZMRyh2YWwpCQkJYmZpbl93cml0ZTE2KFNQSV9GTEcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9TVEFUKCkJCQliZmluX3JlYWQxNihTUElfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BJX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9UREJSKCkJCQliZmluX3JlYWQxNihTUElfVERCUikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfVERCUih2YWwpCQliZmluX3dyaXRlMTYoU1BJX1REQlIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9SREJSKCkJCQliZmluX3JlYWQxNihTUElfUkRCUikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfUkRCUih2YWwpCQliZmluX3dyaXRlMTYoU1BJX1JEQlIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9CQVVEKCkJCQliZmluX3JlYWQxNihTUElfQkFVRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfQkFVRCh2YWwpCQliZmluX3dyaXRlMTYoU1BJX0JBVUQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQSV9TSEFET1coKQkJCWJmaW5fcmVhZDE2KFNQSV9TSEFET1cpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BJX1NIQURPVyh2YWwpCQliZmluX3dyaXRlMTYoU1BJX1NIQURPVywgdmFsKQotCi0KLS8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjBfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIwX1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjFfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIxX1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIyX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjJfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjJfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIyX1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVIzX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjNfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjNfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVIzX1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI0X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjRfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjRfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI0X1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI1X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjVfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjVfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI1X1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI2X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjZfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjZfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI2X1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT05GSUcoKQkJYmZpbl9yZWFkMTYoVElNRVI3X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUjdfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09VTlRFUigpCQliZmluX3JlYWQzMihUSU1FUjdfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19QRVJJT0QoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1BFUklPRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfUEVSSU9EKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfUEVSSU9ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfV0lEVEgoKQkJYmZpbl9yZWFkMzIoVElNRVI3X1dJRFRIKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19XSURUSCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1dJRFRILCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0VOQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9FTkFCTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9FTkFCTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0RJU0FCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRElTQUJMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJCWJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQkJYmZpbl9yZWFkMzIoVElNRVJfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMzIoVElNRVJfU1RBVFVTLCB2YWwpCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU8pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRGSU8sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JURklPX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tBX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0JfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEZJT19ESVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRElSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fUE9MQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19QT0xBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRURHRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fRURHRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQk9USCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQk9USCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fSU5FTikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fSU5FTiwgdmFsKQotCi0KLS8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9URlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ0xLRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNMS0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkZTRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SRlNESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDBfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDBfQ0hOTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX0NITkwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzMsIHZhbCkKLQotCi0vKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ0xLRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENMS0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVEZTRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9URlNESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkNMS0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDTEtESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JGU0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkZTRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1NUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9TVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX0NITkwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9DSE5MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX01DTUMyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX01DTUMyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MwKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01UQ1MzKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MzLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MwKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQxX01SQ1MzKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MzLCB2YWwpCi0KLQotLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1HQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX0FNR0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9BTUdDVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMCgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwwKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMSgpCQliZmluX3JlYWQzMihFQklVX0FNQkNUTDEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUJDVEwxKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkJCQliZmluX3JlYWQzMihFQklVX1NER0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NER0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9TREdDVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RCQ1RMKCkJCQliZmluX3JlYWQxNihFQklVX1NEQkNUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEQkNUTCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TREJDVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RSUkMoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RSUkMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFJSQyh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFJSQywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFNUQVQoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RTVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQotCi0KLS8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfUEVSKCkJCQliZmluX3JlYWQxNihETUFfVENfUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ19QRVIodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ19QRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19DTlQoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ19DTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX0NOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDX0NOVCwgdmFsKQotCi0vKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENQRVIoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENQRVIodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ1BFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDQ05UKCkJCQliZmluX3JlYWQxNihETUFfVENDTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENDTlQsIHZhbCkKLQotLyogRE1BIENvbnRyb2xsZXIJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUExX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMl9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEyX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTJfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTJfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEyX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMl9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BM19DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEzX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTNfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTNfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEzX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BM19QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE0X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTRfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTRfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE0X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE1X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTVfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTVfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE1X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNl9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE2X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTZfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTZfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE2X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNl9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BN19DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE3X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTdfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTdfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE3X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BN19QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQThfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE4X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQThfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQThfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE4X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE5X1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTlfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTlfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE5X1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotCi0vKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09OVFJPTCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPTlRST0wpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkJCQliZmluX3JlYWQxNihQUElfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFBQSV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9jbGVhcl9QUElfU1RBVFVTKCkJCQliZmluX3dyaXRlX1BQSV9TVEFUVVMoMHhGRkZGKQotI2RlZmluZSBiZmluX3JlYWRfUFBJX0RFTEFZKCkJCQliZmluX3JlYWQxNihQUElfREVMQVkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0RFTEFZKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfREVMQVksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT1VOVCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfRlJBTUUoKQkJCWJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9GUkFNRSwgdmFsKQotCi0KLS8qIFR3by1XaXJlIEludGVyZmFjZQkJKDB4RkZDMDE0MDAgLSAweEZGQzAxNEZGKQkJCQkJCQkJKi8KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU8pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRHSU8sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19ESVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRElSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fUE9MQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19QT0xBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRURHRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRURHRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQk9USCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQk9USCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fSU5FTikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fSU5FTiwgdmFsKQotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPKCkJCQliZmluX3JlYWQxNihQT1JUSElPKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUSElPLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0EpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRElSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0RJUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUSElPX1BPTEFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fUE9MQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUSElPX0VER0UpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0VER0UsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUSElPX0JPVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0JPVEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUSElPX0lORU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0lORU4sIHZhbCkKLQotCi0vKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMV9USFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9USFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfUkJSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfUkJSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExIKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lJUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTUNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTUNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xTUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xTUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NU1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NU1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfU0NSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfU0NSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMV9HQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0dDVEwsIHZhbCkKLQotLyogT21pdCBDQU4gcmVnaXN0ZXIgc2V0cyBmcm9tIHRoZSBjZGVmQkY1MzQuaCAoQ0FOIGlzIG5vdCBpbiB0aGUgQURTUC1CRjUyeCBwcm9jZXNzb3IpICovCi0KLS8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRkVSKCkJCQliZmluX3JlYWQxNihQT1JURl9GRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9GRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRkVSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRkVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0ZFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0ZFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRfTVVYKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUX01VWCwgdmFsKQotCi0KLS8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0NPTlRST0wpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9DT05UUk9MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNJTklUKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ0lOSVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNVUkdFTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNVUkdFTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09WRVJGTE9XKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09WRVJGTE9XLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ09VTlQsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUExX0NPTlRST0wpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9DT05UUk9MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNJTklUKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ0lOSVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNVUkdFTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNVUkdFTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09WRVJGTE9XKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09WRVJGTE9XLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ09VTlQsIHZhbCkKLQotLyogPT09PSBlbmQgZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCi0KLS8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfTVVYKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfTVVYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX01VWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX01VWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUSF9NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9NVVgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0RSSVZFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9EUklWRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0RSSVZFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19EUklWRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0RSSVZFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9EUklWRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEZfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUR19TTEVXKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX1NMRVcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX1NMRVcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfU0xFVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JURl9IWVNURVJJU0lTKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEZfSFlTVEVSSVNJUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUR19IWVNURVJJU0lTKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEdfSFlTVEVSSVNJUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUSF9IWVNURVJJU0lTKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEhfSFlTVEVSSVNJUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfRFJJVkUoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9TTEVXKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX1NMRVcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfU0xFVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9IWVNURVJJU0lTKQotI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUywgdmFsKQotCi0vKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfQ09OVFJPTCgpCQliZmluX3JlYWQxNihIT1NUX0NPTlRST0wpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfU1RBVFVTKCkJCQliZmluX3JlYWQxNihIT1NUX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfVElNRU9VVCgpCQliZmluX3JlYWQxNihIT1NUX1RJTUVPVVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9USU1FT1VUKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1RJTUVPVVQsIHZhbCkKLQotLyogQ291bnRlciBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfSU1BU0soKQkJCWJmaW5fcmVhZDE2KENOVF9JTUFTSykKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfSU1BU0sodmFsKQkJYmZpbl93cml0ZTE2KENOVF9JTUFTSywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ05UX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoQ05UX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09NTUFORCgpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTU1BTkQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTU1BTkQodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT01NQU5ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfREVCT1VOQ0UoKQkJYmZpbl9yZWFkMTYoQ05UX0RFQk9VTkNFKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9ERUJPVU5DRSh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0RFQk9VTkNFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09VTlRFUigpCQkJYmZpbl9yZWFkMzIoQ05UX0NPVU5URVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKENOVF9DT1VOVEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUFYKCkJCQliZmluX3JlYWQzMihDTlRfTUFYKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NQVgodmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUFYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUlOKCkJCQliZmluX3JlYWQzMihDTlRfTUlOKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NSU4odmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUlOLCB2YWwpCi0KLS8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1lTU1dUKCkJCWJmaW5fcmVhZDMyKFNFQ1VSRV9TWVNTV1QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NZU1NXVCh2YWwpCQliZmluX3dyaXRlMzIoU0VDVVJFX1NZU1NXVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoU0VDVVJFX0NPTlRST0wpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9DT05UUk9MLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX1NUQVRVUywgdmFsKQotCi0vKiBORkMgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19DVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19DVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NUTCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19DVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19TVEFUKCkJCQliZmluX3JlYWQxNihORkNfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFTVEFUKCkJCQliZmluX3JlYWQxNihORkNfSVJRU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUVNUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFNQVNLKCkJCQliZmluX3JlYWQxNihORkNfSVJRTUFTSykKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUU1BU0ssIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MwKCkJCQliZmluX3JlYWQxNihORkNfRUNDMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MxKCkJCQliZmluX3JlYWQxNihORkNfRUNDMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMSh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MyKCkJCQliZmluX3JlYWQxNihORkNfRUNDMikKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMih2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MzKCkJCQliZmluX3JlYWQxNihORkNfRUNDMykKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19DT1VOVCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfUlNUKCkJCQliZmluX3JlYWQxNihORkNfUlNUKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19SU1QodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfUlNULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfUEdDVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19QR0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfUEdDVEwodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19QR0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX1JFQUQoKQkJCWJmaW5fcmVhZDE2KE5GQ19SRUFEKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19SRUFEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfUkVBRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0FERFIoKQkJCWJmaW5fcmVhZDE2KE5GQ19BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19BRERSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0NNRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NNRCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ01EKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NNRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfV1IoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1dSKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1dSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9XUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfUkQoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1JEKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1JEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9SRCwgdmFsKQotCi0vKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLwotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2VuZGlmIC8qIF9DREVGX0JGNTJYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjIuaAppbmRleCBjYjEzOWEyLi44OWY1NDIwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTIyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyMi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDEyICs3LDEzOTMgQEAKICNpZm5kZWYgX0RFRl9CRjUyMl9ICiAjZGVmaW5lIF9ERUZfQkY1MjJfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBDT01NT04gVE8gQUxMIEFEU1AtQkY1MnggICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTIyICovCisvKiA9PT09IGJlZ2luIGZyb20gZGVmQkY1MzQuaCA9PT09ICovCiAKLS8qIEluY2x1ZGUgZGVmQkY1MnhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUyeCBwcm9jZXNzb3JzICovCi0jaW5jbHVkZSAiZGVmQkY1MnhfYmFzZS5oIgorLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCisjZGVmaW5lIFBMTF9DVEwJCQkJMHhGRkMwMDAwMAkvKiBQTEwgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBMTF9ESVYJCQkJMHhGRkMwMDAwNAkvKiBQTEwgRGl2aWRlIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVlJfQ1RMCQkJCTB4RkZDMDAwMDgJLyogVm9sdGFnZSBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUExMX1NUQVQJCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQTExfTE9DS0NOVAkJCTB4RkZDMDAwMTAJLyogUExMIExvY2sgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIENISVBJRCAgICAgICAgMHhGRkMwMDAxNCAgLyogRGV2aWNlIElEIFJlZ2lzdGVyICovCisKKworLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJKi8KKyNkZWZpbmUgU1dSU1QJCQkJMHhGRkMwMDEwMAkvKiBTb2Z0d2FyZSBSZXNldCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1lTQ1IJCQkJMHhGRkMwMDEwNAkvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNJQ19SVkVDVAkJCTB4RkZDMDAxMDgJLyogSW50ZXJydXB0IFJlc2V0IFZlY3RvciBBZGRyZXNzIFJlZ2lzdGVyCSovCisKKyNkZWZpbmUgU0lDX0lNQVNLMAkJCTB4RkZDMDAxMEMJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNJQ19JQVIwCQkJMHhGRkMwMDExMAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjEJCQkweEZGQzAwMTE0CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDEJCQkqLworI2RlZmluZSBTSUNfSUFSMgkJCTB4RkZDMDAxMTgJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMgkJCSovCisjZGVmaW5lIFNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAzCQkJKi8KKyNkZWZpbmUgU0lDX0lTUjAJCQkJMHhGRkMwMDEyMAkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNJQ19JV1IwCQkJCTB4RkZDMDAxMjQJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlcgkJCQkqLworCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MnggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworI2RlZmluZSBTSUNfSU1BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNEMgICAgIC8qIEludGVycnVwdCBNYXNrIHJlZ2lzdGVyIG9mIFNJQzIgKi8KKyNkZWZpbmUgU0lDX0lBUjQgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTUwICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjQgKi8KKyNkZWZpbmUgU0lDX0lBUjUgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU0ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjUgKi8KKyNkZWZpbmUgU0lDX0lBUjYgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU4ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjYgKi8KKyNkZWZpbmUgU0lDX0lBUjcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTVDICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjcgKi8KKyNkZWZpbmUgU0lDX0lTUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTYwICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJQ19JV1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2NCAgICAgLyogSW50ZXJydXB0IFdha2V1cCByZWdpc3RlciAqLworCisKKy8qIFdhdGNoZG9nIFRpbWVyCQkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgV0RPR19DVEwJCQkweEZGQzAwMjAwCS8qIFdhdGNoZG9nIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgV0RPR19DTlQJCQkweEZGQzAwMjA0CS8qIFdhdGNoZG9nIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBXRE9HX1NUQVQJCQkweEZGQzAwMjA4CS8qIFdhdGNoZG9nIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBSVENfU1RBVAkJCTB4RkZDMDAzMDAJLyogUlRDIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFJUQ19JQ1RMCQkJMHhGRkMwMDMwNAkvKiBSVEMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfSVNUQVQJCQkweEZGQzAwMzA4CS8qIFJUQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX1NXQ05UCQkJMHhGRkMwMDMwQwkvKiBSVEMgU3RvcHdhdGNoIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFJUQ19BTEFSTQkJCTB4RkZDMDAzMTAJLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFJUQ19GQVNUCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19QUkVOCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBBbHRlcm5hdGUgTWFjcm8JCSovCisKKworLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCisjZGVmaW5lIFVBUlQwX1RIUgkJCTB4RkZDMDA0MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMF9SQlIJCQkweEZGQzAwNDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9ETEwJCQkweEZGQzAwNDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfSUVSCQkJMHhGRkMwMDQwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQwX0RMSAkJCTB4RkZDMDA0MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMF9JSVIJCQkweEZGQzAwNDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVUFSVDBfTENSCQkJMHhGRkMwMDQwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX01DUgkJCTB4RkZDMDA0MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTFNSCQkJMHhGRkMwMDQxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFVBUlQwX01TUgkJCTB4RkZDMDA0MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9TQ1IJCQkweEZGQzAwNDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfR0NUTAkJCTB4RkZDMDA0MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKworLyogU1BJIENvbnRyb2xsZXIJCQkoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpCQkJCQkJCQkqLworI2RlZmluZSBTUEkwX1JFR0JBU0UJCQkweEZGQzAwNTAwCisjZGVmaW5lIFNQSV9DVEwJCQkJMHhGRkMwMDUwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSV9GTEcJCQkJMHhGRkMwMDUwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFNQSV9TVEFUCQkJMHhGRkMwMDUwOAkvKiBTUEkgU3RhdHVzIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJX1REQlIJCQkweEZGQzAwNTBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgU1BJX1JEQlIJCQkweEZGQzAwNTEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BJX0JBVUQJCQkweEZGQzAwNTE0CS8qIFNQSSBCYXVkIHJhdGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQSV9TSEFET1cJCQkweEZGQzAwNTE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9DT05GSUcJCTB4RkZDMDA2MDAJLyogVGltZXIgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVElNRVIwX0NPVU5URVIJCTB4RkZDMDA2MDQJLyogVGltZXIgMCBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfUEVSSU9ECQkweEZGQzAwNjA4CS8qIFRpbWVyIDAgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjBfV0lEVEgJCTB4RkZDMDA2MEMJLyogVGltZXIgMCBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBUSU1FUjFfQ09ORklHCQkweEZGQzAwNjEwCS8qIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX0NPVU5URVIJCTB4RkZDMDA2MTQJLyogVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjFfUEVSSU9ECQkweEZGQzAwNjE4CS8qIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX1dJRFRICQkweEZGQzAwNjFDCS8qIFRpbWVyIDEgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjJfQ09ORklHCQkweEZGQzAwNjIwCS8qIFRpbWVyIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX0NPVU5URVIJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjJfUEVSSU9ECQkweEZGQzAwNjI4CS8qIFRpbWVyIDIgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX1dJRFRICQkweEZGQzAwNjJDCS8qIFRpbWVyIDIgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjNfQ09ORklHCQkweEZGQzAwNjMwCS8qIFRpbWVyIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRJTUVSM19DT1VOVEVSCQkweEZGQzAwNjM0CS8qIFRpbWVyIDMgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1BFUklPRAkJMHhGRkMwMDYzOAkvKiBUaW1lciAzIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIzX1dJRFRICQkweEZGQzAwNjNDCS8qIFRpbWVyIDMgV2lkdGggUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgVElNRVI0X0NPTkZJRwkJMHhGRkMwMDY0MAkvKiBUaW1lciA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9DT1VOVEVSCQkweEZGQzAwNjQ0CS8qIFRpbWVyIDQgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X1BFUklPRAkJMHhGRkMwMDY0OAkvKiBUaW1lciA0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9XSURUSAkJMHhGRkMwMDY0QwkvKiBUaW1lciA0IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI1X0NPTkZJRwkJMHhGRkMwMDY1MAkvKiBUaW1lciA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9DT1VOVEVSCQkweEZGQzAwNjU0CS8qIFRpbWVyIDUgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X1BFUklPRAkJMHhGRkMwMDY1OAkvKiBUaW1lciA1IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9XSURUSAkJMHhGRkMwMDY1QwkvKiBUaW1lciA1IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI2X0NPTkZJRwkJMHhGRkMwMDY2MAkvKiBUaW1lciA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9DT1VOVEVSCQkweEZGQzAwNjY0CS8qIFRpbWVyIDYgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X1BFUklPRAkJMHhGRkMwMDY2OAkvKiBUaW1lciA2IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9XSURUSAkJMHhGRkMwMDY2QwkvKiBUaW1lciA2IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVI3X0NPTkZJRwkJMHhGRkMwMDY3MAkvKiBUaW1lciA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSN19DT1VOVEVSCQkweEZGQzAwNjc0CS8qIFRpbWVyIDcgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X1BFUklPRAkJMHhGRkMwMDY3OAkvKiBUaW1lciA3IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSN19XSURUSAkJMHhGRkMwMDY3QwkvKiBUaW1lciA3IFdpZHRoIFJlZ2lzdGVyICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVJfRU5BQkxFCQkweEZGQzAwNjgwCS8qIFRpbWVyIEVuYWJsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVJfRElTQUJMRQkJMHhGRkMwMDY4NAkvKiBUaW1lciBEaXNhYmxlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUl9TVEFUVVMJCTB4RkZDMDA2ODgJLyogVGltZXIgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JURklPCQkJCQkweEZGQzAwNzAwCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19DTEVBUgkJCTB4RkZDMDA3MDQJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEZJT19TRVQJCQkJMHhGRkMwMDcwOAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fVE9HR0xFCQkJMHhGRkMwMDcwQwkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0EJCQkweEZGQzAwNzEwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDA3MTQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBX1NFVAkJMHhGRkMwMDcxOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9UT0dHTEUJMHhGRkMwMDcxQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tCCQkJMHhGRkMwMDcyMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX01BU0tCX0NMRUFSCQkweEZGQzAwNzI0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9TRVQJCTB4RkZDMDA3MjgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDA3MkMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19ESVIJCQkJMHhGRkMwMDczMAkvKiBQb3J0IEYgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fUE9MQVIJCQkweEZGQzAwNzM0CS8qIFBvcnQgRiBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JURklPX0VER0UJCQkweEZGQzAwNzM4CS8qIFBvcnQgRiBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fQk9USAkJCTB4RkZDMDA3M0MJLyogUG9ydCBGIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0lORU4JCQkweEZGQzAwNzQwCS8qIFBvcnQgRiBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyIAkJCQkJKi8KKworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfVENSMQkJCTB4RkZDMDA4MDAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IyCQkJMHhGRkMwMDgwNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDTEtESVYJCTB4RkZDMDA4MDgJLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9URlNESVYJCTB4RkZDMDA4MEMJLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfVFgJCQkweEZGQzAwODEwCS8qIFNQT1JUMCBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SWAkJCTB4RkZDMDA4MTgJLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDUjEJCQkweEZGQzAwODIwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMgkJCTB4RkZDMDA4MjQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ0xLRElWCQkweEZGQzAwODI4CS8qIFNQT1JUMCBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkZTRElWCQkweEZGQzAwODJDCS8qIFNQT1JUMCBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfU1RBVAkJCTB4RkZDMDA4MzAJLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQJLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX01DTUMxCQkweEZGQzAwODM4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzIJCTB4RkZDMDA4M0MJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMAkJMHhGRkMwMDg0MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVRDUzEJCTB4RkZDMDA4NDQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MyCQkweEZGQzAwODQ4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMwkJMHhGRkMwMDg0QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLworI2RlZmluZSBTUE9SVDBfTVJDUzAJCTB4RkZDMDA4NTAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVJDUzEJCTB4RkZDMDA4NTQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVJDUzIJCTB4RkZDMDA4NTgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDBfTVJDUzMJCTB4RkZDMDA4NUMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLworCisKKy8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ1IxCQkJMHhGRkMwMDkwMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDUjIJCQkweEZGQzAwOTA0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfVENMS0RJVgkJMHhGRkMwMDkwOAkvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RGU0RJVgkJMHhGRkMwMDkwQwkvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9UWAkJCTB4RkZDMDA5MTAJLyogU1BPUlQxIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JYCQkJMHhGRkMwMDkxOAkvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUkNSMQkJCTB4RkZDMDA5MjAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ1IyCQkJMHhGRkMwMDkyNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDTEtESVYJCTB4RkZDMDA5MjgJLyogU1BPUlQxIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SRlNESVYJCTB4RkZDMDA5MkMJLyogU1BPUlQxIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMV9TVEFUCQkJMHhGRkMwMDkzMAkvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNAkvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDFfTUNNQzEJCTB4RkZDMDA5MzgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NQ01DMgkJMHhGRkMwMDkzQwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MwCQkweEZGQzAwOTQwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMQkJMHhGRkMwMDk0NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTVRDUzIJCTB4RkZDMDA5NDgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MzCQkweEZGQzAwOTRDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMAkJMHhGRkMwMDk1MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMQkJMHhGRkMwMDk1NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMgkJMHhGRkMwMDk1OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NUkNTMwkJMHhGRkMwMDk1QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKworLyogRXh0ZXJuYWwgQnVzIEludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikJCQkJCQkJCSovCisjZGVmaW5lIEVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCSovCisjZGVmaW5lIEVCSVVfQU1CQ1RMMAkJMHhGRkMwMEEwNAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAwCSovCisjZGVmaW5lIEVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOAkvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgQ29udHJvbCBSZWdpc3RlciAxCSovCisjZGVmaW5lIEVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMAkvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQJLyogU0RSQU0gQmFuayBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBFQklVX1NEUlJDCQkJMHhGRkMwMEExOAkvKiBTRFJBTSBSZWZyZXNoIFJhdGUgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIEVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQwkvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworCisKKy8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQUNfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIERNQUNfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KKworLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQThfU1RBUlRfQUREUgkJCTB4RkZDMDBFMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X0NPTkZJRwkJCQkweEZGQzAwRTA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOF9YX0NPVU5UCQkJMHhGRkMwMEUxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1hfTU9ESUZZCQkJMHhGRkMwMEUxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMEUxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfTU9ESUZZCQkJMHhGRkMwMEUxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0FERFIJCQkweEZGQzAwRTI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDBFMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEUzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEUzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE5X1NUQVJUX0FERFIJCQkweEZGQzAwRTQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DT05GSUcJCQkJMHhGRkMwMEU0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTlfWF9DT1VOVAkJCTB4RkZDMDBFNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX01PRElGWQkJCTB4RkZDMDBFNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfWV9DT1VOVAkJCTB4RkZDMDBFNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX01PRElGWQkJCTB4RkZDMDBFNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEU2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMEU2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAwRTY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMF9TVEFSVF9BRERSCQkweEZGQzAwRTg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX1hfQ09VTlQJCQkweEZGQzAwRTkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9YX01PRElGWQkJCTB4RkZDMDBFOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX0NPVU5UCQkJMHhGRkMwMEU5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAwRTlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMF9DVVJSX0FERFIJCQkweEZGQzAwRUE0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRUMwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX1hfQ09VTlQJCQkweEZGQzAwRUQwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9YX01PRElGWQkJCTB4RkZDMDBFRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX0NPVU5UCQkJMHhGRkMwMEVEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAwRURDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMV9DVVJSX0FERFIJCQkweEZGQzAwRUU0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEYwMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEYwNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NPTkZJRwkJCTB4RkZDMDBGMDgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX0NPVU5UCQkJMHhGRkMwMEYxMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBGMTQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQJCQkweEZGQzAwRjE4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9ZX01PRElGWQkJMHhGRkMwMEYxQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjIwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEYyNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEYyOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEYyQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEYzMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGMzgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjQwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBGNDQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NPTkZJRwkJCTB4RkZDMDBGNDgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQJCQkweEZGQzAwRjUwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZCQkweEZGQzAwRjU0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UCQkJMHhGRkMwMEY1OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEY1QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjYwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRjY0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBGNjgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGNkMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEY3MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEY3OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEY4MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEY4NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NPTkZJRwkJCTB4RkZDMDBGODgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX0NPVU5UCQkJMHhGRkMwMEY5MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBGOTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQJCQkweEZGQzAwRjk4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9ZX01PRElGWQkJMHhGRkMwMEY5QwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkEwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEZBNAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEZBOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZBQwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZCMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGQjgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRkMwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBGQzQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NPTkZJRwkJCTB4RkZDMDBGQzgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQJCQkweEZGQzAwRkQwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZCQkweEZGQzAwRkQ0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UCQkJMHhGRkMwMEZEOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEZEQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkUwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRkU0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBGRTgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGRUMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZGMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZGOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCSovCisjZGVmaW5lIFBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9TVEFUVVMJCQkweEZGQzAxMDA0CS8qIFBQSSBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgkqLworI2RlZmluZSBQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUFBJX0ZSQU1FCQkJMHhGRkMwMTAxMAkvKiBQUEkgRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyCSovCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworI2RlZmluZSBUV0kwX1JFR0JBU0UJCQkweEZGQzAxNDAwCisjZGVmaW5lIFRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSTBfQ09OVFJPTAkJCTB4RkZDMDE0MDQJLyogVFdJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfQ1RMCQkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfU1RBVAkJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfQUREUgkJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSSBNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUV0kwX0ZJRk9fU1RBVAkJMHhGRkMwMTQyQwkvKiBGSUZPIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLworI2RlZmluZSBUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTyBUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8gUmVjZWl2ZSBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUR0lPCQkJCQkweEZGQzAxNTAwCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19DTEVBUgkJCTB4RkZDMDE1MDQJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEdJT19TRVQJCQkJMHhGRkMwMTUwOAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fVE9HR0xFCQkJMHhGRkMwMTUwQwkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0EJCQkweEZGQzAxNTEwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE1MTQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1NFVAkJMHhGRkMwMTUxOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTUxQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCCQkJMHhGRkMwMTUyMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX0NMRUFSCQkweEZGQzAxNTI0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9TRVQJCTB4RkZDMDE1MjgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE1MkMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19ESVIJCQkJMHhGRkMwMTUzMAkvKiBQb3J0IEcgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fUE9MQVIJCQkweEZGQzAxNTM0CS8qIFBvcnQgRyBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUR0lPX0VER0UJCQkweEZGQzAxNTM4CS8qIFBvcnQgRyBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fQk9USAkJCTB4RkZDMDE1M0MJLyogUG9ydCBHIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0lORU4JCQkweEZGQzAxNTQwCS8qIFBvcnQgRyBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJTwkJCQkJMHhGRkMwMTcwMAkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQ0xFQVIJCQkweEZGQzAxNzA0CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRISU9fU0VUCQkJCTB4RkZDMDE3MDgJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX1RPR0dMRQkJCTB4RkZDMDE3MEMJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBCQkJMHhGRkMwMTcxMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX0NMRUFSCQkweEZGQzAxNzE0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9TRVQJCTB4RkZDMDE3MTgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE3MUMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQgkJCTB4RkZDMDE3MjAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTcyNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfU0VUCQkweEZGQzAxNzI4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX1RPR0dMRQkweEZGQzAxNzJDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fRElSCQkJCTB4RkZDMDE3MzAJLyogUG9ydCBIIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JUSElPX1BPTEFSCQkJMHhGRkMwMTczNAkvKiBQb3J0IEggSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19FREdFCQkJMHhGRkMwMTczOAkvKiBQb3J0IEggSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0JPVEgJCQkweEZGQzAxNzNDCS8qIFBvcnQgSCBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19JTkVOCQkJMHhGRkMwMTc0MAkvKiBQb3J0IEggSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkqLworI2RlZmluZSBVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTVNSCQkJMHhGRkMwMjAxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKworCisvKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGRlZkJGNTM0LmggKENBTiBpcyBub3QgaW4gdGhlIEFEU1AtQkY1MnggcHJvY2Vzc29yKSAqLworCisvKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZfRkVSCQkJMHhGRkMwMzIwMAkvKiBQb3J0IEYgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRHX0ZFUgkJCTB4RkZDMDMyMDQJLyogUG9ydCBHIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBQT1JUSF9GRVIJCQkweEZGQzAzMjA4CS8qIFBvcnQgSCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgQkZJTl9QT1JUX01VWAkJCTB4RkZDMDMyMEMJLyogUG9ydCBNdWx0aXBsZXhlciBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTBfRUNJTklUCQkweEZGQzAzMzA0CS8qIEhNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDSU5JVAkJMHhGRkMwMzMwOAkvKiBITURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfRUNVUkdFTlQJCTB4RkZDMDMzMEMJLyogSE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1VOVAkJMHhGRkMwMzMxNAkvKiBITURNQTAgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBITURNQTFfQ09OVFJPTAkJMHhGRkMwMzM0MAkvKiBIYW5kc2hha2UgTURNQTEgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ0lOSVQJCTB4RkZDMDMzNDgJLyogSE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCisjZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKy8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCisjZGVmaW5lIFBPUlRGX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTAgICAgICAvKiBQb3J0IEYgbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxNCAgICAgIC8qIFBvcnQgRyBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9NVVggICAgICAgICAgICAgICAweEZGQzAzMjE4ICAgICAgLyogUG9ydCBIIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjAgICAgICAvKiBQb3J0IEYgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JUR19EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI0ICAgICAgLyogUG9ydCBHIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyOCAgICAgIC8qIFBvcnQgSCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzAgICAgICAvKiBQb3J0IEYgc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzQgICAgICAvKiBQb3J0IEcgc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzggICAgICAvKiBQb3J0IEggc2xldyBjb250cm9sICovCisjZGVmaW5lIFBPUlRGX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDAgICAgICAvKiBQb3J0IEYgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0NCAgICAgIC8qIFBvcnQgRyBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ4ICAgICAgLyogUG9ydCBIIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX0RSSVZFICAgICAgICAgIDB4RkZDMDMyODAgICAgICAvKiBNaXNjIFBvcnQgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9TTEVXICAgICAgICAgICAweEZGQzAzMjg0ICAgICAgLyogTWlzYyBQb3J0IHNsZXcgY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9IWVNURVJJU0lTICAgICAweEZGQzAzMjg4ICAgICAgLyogTWlzYyBQb3J0IFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgQW5kIE1hY3JvcworKioKKyoqIERpc2NsYWltZXI6CUFsbCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIG1ha2UgQyBhbmQgQXNzZW1ibHkgY29kZSBtb3JlIHJlYWRhYmxlLgorKioJCQkJVXNlIHRoZXNlIG1hY3JvcyBjYXJlZnVsbHksIGFzIGFueSB0aGF0IGRvIGxlZnQgc2hpZnRzIGZvciBmaWVsZAorKioJCQkJZGVwb3NpdGluZyB3aWxsIHJlc3VsdCBpbiB0aGUgbG93ZXIgb3JkZXIgYml0cyBiZWluZyBkZXN0cm95ZWQuICBBbnkKKyoqCQkJCW1hY3JvIHRoYXQgc2hpZnRzIGxlZnQgdG8gcHJvcGVybHkgcG9zaXRpb24gdGhlIGJpdC1maWVsZCBzaG91bGQgYmUKKyoqCQkJCXVzZWQgYXMgcGFydCBvZiBhbiBPUiB0byBpbml0aWFsaXplIGEgcmVnaXN0ZXIgYW5kIE5PVCBhcyBhIGR5bmFtaWMKKyoqCQkJCW1vZGlmaWVyIFVOTEVTUyB0aGUgbG93ZXIgb3JkZXIgYml0cyBhcmUgc2F2ZWQgYW5kIE9SZWQgYmFjayBpbiB3aGVuCisqKgkJCQl0aGUgbWFjcm8gaXMgdXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENISVBJRCBNYXNrcyAqLworI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCisjZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQorCisvKiBTV1JTVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNZU1RFTV9SRVNFVAkJMHgwMDA3CS8qIEluaXRpYXRlcyBBIFN5c3RlbSBTb2Z0d2FyZSBSZXNldAkJCSovCisjZGVmaW5lCURPVUJMRV9GQVVMVAkJMHgwMDA4CS8qIENvcmUgRG91YmxlIEZhdWx0IENhdXNlcyBSZXNldAkJCQkqLworI2RlZmluZSBSRVNFVF9ET1VCTEUJCTB4MjAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgQ29yZSBEb3VibGUtRmF1bHQJCSovCisjZGVmaW5lIFJFU0VUX1dET0cJCQkweDQwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IFdhdGNoZG9nIFRpbWVyCQkJKi8KKyNkZWZpbmUgUkVTRVRfU09GVFdBUkUJCTB4ODAwMAkvKiBTVyBSZXNldCBPY2N1cnJlZCBTaW5jZSBMYXN0IFJlYWQgT2YgU1dSU1QJKi8KKworLyogU1lTQ1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEJNT0RFCQkJCTB4MDAwNwkvKiBCb290IE1vZGUgLSBMYXRjaGVkIER1cmluZyBIVyBSZXNldCBGcm9tIE1vZGUgUGlucwkqLworI2RlZmluZQlOT0JPT1QJCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbSBMMSBvciBBU1lOQyBCYW5rIDAgV2hlbiBCTU9ERSA9IDAJCSovCisKKworLyogKioqKioqKioqKioqKiAgU1lTVEVNIElOVEVSUlVQVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQZXJpcGhlcmFsIE1hc2tzIEZvciBTSUNfSVNSLCBTSUNfSVdSLCBTSUNfSU1BU0sJCQkJCQkJCQkJKi8KKworI2lmIDAKKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVAJMHgwMDAwMDAwMQkvKiBQTEwgV2FrZXVwIEludGVycnVwdAkJCSAJCQkJCSovCisKKyNkZWZpbmUgSVJRX0VSUk9SMSAgICAgIDB4MDAwMDAwMDIgIC8qIEVycm9yIEludGVycnVwdCAoRE1BLCBETUFSeCBCbG9jaywgRE1BUnggT3ZlcmZsb3cpICovCisjZGVmaW5lIElSUV9FUlJPUjIgICAgICAweDAwMDAwMDA0ICAvKiBFcnJvciBJbnRlcnJ1cHQgKENBTiwgRXRoZXJuZXQsIFNQT1JUeCwgUFBJLCBTUEksIFVBUlR4KSAqLworI2RlZmluZSBJUlFfUlRDCQkJMHgwMDAwMDAwOAkvKiBSZWFsIFRpbWUgQ2xvY2sgSW50ZXJydXB0IAkJCQkJCSovCisjZGVmaW5lIElSUV9ETUEwCQkweDAwMDAwMDEwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTMJCTB4MDAwMDAwMjAJLyogRE1BIENoYW5uZWwgMyAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE0CQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDQgKFNQT1JUMCBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BNQkJMHgwMDAwMDA4MAkvKiBETUEgQ2hhbm5lbCA1IChTUE9SVDEgUlgpIEludGVycnVwdCAJCQkJKi8KKworI2RlZmluZSBJUlFfRE1BNgkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCA2IChTUE9SVDEgVFgpIEludGVycnVwdCAJCSAJCSovCisjZGVmaW5lIElSUV9UV0kJCQkweDAwMDAwMjAwCS8qIFRXSSBJbnRlcnJ1cHQJCQkJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BNwkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCA3IChTUEkpIEludGVycnVwdCAJCQkJCSovCisjZGVmaW5lIElSUV9ETUE4CQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDggKFVBUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE5CQkweDAwMDAxMDAwCS8qIERNQSBDaGFubmVsIDkgKFVBUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUExMAkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCAxMCAoVUFSVDEgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTExCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDExIChVQVJUMSBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfQ0FOX1JYCQkweDAwMDA4MDAwCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCAJCQkJCQkJKi8KKworI2RlZmluZSBJUlFfQ0FOX1RYCQkweDAwMDEwMDAwCS8qIENBTiBUcmFuc21pdCBJbnRlcnJ1cHQgIAkJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMQkJMHgwMDAyMDAwMAkvKiBETUEgQ2hhbm5lbCAxIChFdGhlcm5ldCBSWCkgSW50ZXJydXB0IAkJCSovCisjZGVmaW5lIElSUV9QRkFfUE9SVEgJMHgwMDAyMDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBBIAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTIJCTB4MDAwNDAwMDAJLyogRE1BIENoYW5uZWwgMiAoRXRoZXJuZXQgVFgpIEludGVycnVwdCAJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRICTB4MDAwNDAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjAJCTB4MDAwODAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjEJCTB4MDAxMDAwMDAJLyogVGltZXIgMSBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIyCQkweDAwMjAwMDAwCS8qIFRpbWVyIDIgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMwkJMHgwMDQwMDAwMAkvKiBUaW1lciAzIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjQJCTB4MDA4MDAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQgCQkJCQkJCQkqLworCisjZGVmaW5lIElSUV9USU1FUjUJCTB4MDEwMDAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI2CQkweDAyMDAwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNwkJMHgwNDAwMDAwMAkvKiBUaW1lciA3IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9QRkFfUE9SVEZHCTB4MDgwMDAwMDAJLyogUEYgUG9ydHMgRiZHIChQRjMxOjApIEludGVycnVwdCBBIAkJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRGCTB4ODAwMDAwMDAJLyogUEYgUG9ydCBGIChQRjE1OjApIEludGVycnVwdCBCIAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEyCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMiAoTURNQTEgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLworI2RlZmluZSBJUlFfRE1BMTMJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEzIChNRE1BMSBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUExNAkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTQgKE1ETUEwIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KKyNkZWZpbmUgSVJRX0RNQTE1CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNSAoTURNQTAgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfV0RPRwkJMHg4MDAwMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEcJMHgxMDAwMDAwMAkvKiBQRiBQb3J0IEcgKFBGMzE6MTYpIEludGVycnVwdCBCIAkJCQkJKi8KKyNlbmRpZgorCisvKiBTSUNfSUFSMCBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMwIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMzIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICM0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICM1IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICM2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICM3IGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMSBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQOF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICM4IGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICM5IGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDEwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzExIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDEyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzEyIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMTMgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMxNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzE1IGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMiBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMTZfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMTYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzE3IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMThfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxOCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTkgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzIxIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMjIgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMyMyBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjMgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDI0X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzI0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMyNSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMjYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzI3IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjhfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjggYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyOSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDMwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzMwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMzFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMzEgYXNzaWduZWQgSVZHICN4CSovCisKKworLyogU0lDX0lNQVNLIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0lDX1VOTUFTS19BTEwJMHgwMDAwMDAwMAkJCQkJLyogVW5tYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KKyNkZWZpbmUgU0lDX01BU0tfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIE1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLworI2RlZmluZSBTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIFNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CSovCisKKy8qIFNJQ19JV1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzCSovCisjZGVmaW5lIElXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzCSovCisjZGVmaW5lIElXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeAkJKi8KKyNkZWZpbmUgSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkgCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3gJCSovCisKKy8qICAqKioqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiovCisvKiBUSU1FUl9FTkFCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRU4wCQkJMHgwMDAxCQkvKiBFbmFibGUgVGltZXIgMAkJCQkJKi8KKyNkZWZpbmUgVElNRU4xCQkJMHgwMDAyCQkvKiBFbmFibGUgVGltZXIgMQkJCQkJKi8KKyNkZWZpbmUgVElNRU4yCQkJMHgwMDA0CQkvKiBFbmFibGUgVGltZXIgMgkJCQkJKi8KKyNkZWZpbmUgVElNRU4zCQkJMHgwMDA4CQkvKiBFbmFibGUgVGltZXIgMwkJCQkJKi8KKyNkZWZpbmUgVElNRU40CQkJMHgwMDEwCQkvKiBFbmFibGUgVGltZXIgNAkJCQkJKi8KKyNkZWZpbmUgVElNRU41CQkJMHgwMDIwCQkvKiBFbmFibGUgVGltZXIgNQkJCQkJKi8KKyNkZWZpbmUgVElNRU42CQkJMHgwMDQwCQkvKiBFbmFibGUgVGltZXIgNgkJCQkJKi8KKyNkZWZpbmUgVElNRU43CQkJMHgwMDgwCQkvKiBFbmFibGUgVGltZXIgNwkJCQkJKi8KKworLyogVElNRVJfRElTQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1ESVMwCQkJVElNRU4wCQkvKiBEaXNhYmxlIFRpbWVyIDAJCQkJCSovCisjZGVmaW5lIFRJTURJUzEJCQlUSU1FTjEJCS8qIERpc2FibGUgVGltZXIgMQkJCQkJKi8KKyNkZWZpbmUgVElNRElTMgkJCVRJTUVOMgkJLyogRGlzYWJsZSBUaW1lciAyCQkJCQkqLworI2RlZmluZSBUSU1ESVMzCQkJVElNRU4zCQkvKiBEaXNhYmxlIFRpbWVyIDMJCQkJCSovCisjZGVmaW5lIFRJTURJUzQJCQlUSU1FTjQJCS8qIERpc2FibGUgVGltZXIgNAkJCQkJKi8KKyNkZWZpbmUgVElNRElTNQkJCVRJTUVONQkJLyogRGlzYWJsZSBUaW1lciA1CQkJCQkqLworI2RlZmluZSBUSU1ESVM2CQkJVElNRU42CQkvKiBEaXNhYmxlIFRpbWVyIDYJCQkJCSovCisjZGVmaW5lIFRJTURJUzcJCQlUSU1FTjcJCS8qIERpc2FibGUgVGltZXIgNwkJCQkJKi8KKworLyogVElNRVJfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTUlMMAkJCTB4MDAwMDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwxCQkJMHgwMDAwMDAwMgkvKiBUaW1lciAxIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDIJCQkweDAwMDAwMDA0CS8qIFRpbWVyIDIgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMwkJCTB4MDAwMDAwMDgJLyogVGltZXIgMyBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIwCQkweDAwMDAwMDEwCS8qIFRpbWVyIDAgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMQkJMHgwMDAwMDAyMAkvKiBUaW1lciAxIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjIJCTB4MDAwMDAwNDAJLyogVGltZXIgMiBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIzCQkweDAwMDAwMDgwCS8qIFRpbWVyIDMgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRSVU4wCQkJMHgwMDAwMTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4xCQkJMHgwMDAwMjAwMAkvKiBUaW1lciAxIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4yCQkJMHgwMDAwNDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4zCQkJMHgwMDAwODAwMAkvKiBUaW1lciAzIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRJTUlMNAkJCTB4MDAwMTAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw1CQkJMHgwMDAyMDAwMAkvKiBUaW1lciA1IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDYJCQkweDAwMDQwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNwkJCTB4MDAwODAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI0CQkweDAwMTAwMDAwCS8qIFRpbWVyIDQgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNQkJMHgwMDIwMDAwMAkvKiBUaW1lciA1IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjYJCTB4MDA0MDAwMDAJLyogVGltZXIgNiBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI3CQkweDAwODAwMDAwCS8qIFRpbWVyIDcgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRSVU40CQkJMHgxMDAwMDAwMAkvKiBUaW1lciA0IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU41CQkJMHgyMDAwMDAwMAkvKiBUaW1lciA1IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU42CQkJMHg0MDAwMDAwMAkvKiBUaW1lciA2IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU43CQkJMHg4MDAwMDAwMAkvKiBUaW1lciA3IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUT1ZMX0VSUjAgVE9WRl9FUlIwCisjZGVmaW5lIFRPVkxfRVJSMSBUT1ZGX0VSUjEKKyNkZWZpbmUgVE9WTF9FUlIyIFRPVkZfRVJSMgorI2RlZmluZSBUT1ZMX0VSUjMgVE9WRl9FUlIzCisjZGVmaW5lIFRPVkxfRVJSNCBUT1ZGX0VSUjQKKyNkZWZpbmUgVE9WTF9FUlI1IFRPVkZfRVJSNQorI2RlZmluZSBUT1ZMX0VSUjYgVE9WRl9FUlI2CisjZGVmaW5lIFRPVkxfRVJSNyBUT1ZGX0VSUjcKKworLyogVElNRVJ4X0NPTkZJRyBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQV01fT1VUCQkJMHgwMDAxCS8qIFB1bHNlLVdpZHRoIE1vZHVsYXRpb24gT3V0cHV0IE1vZGUJKi8KKyNkZWZpbmUgV0RUSF9DQVAJCTB4MDAwMgkvKiBXaWR0aCBDYXB0dXJlIElucHV0IE1vZGUJCQkJKi8KKyNkZWZpbmUgRVhUX0NMSwkJCTB4MDAwMwkvKiBFeHRlcm5hbCBDbG9jayBNb2RlCQkJCQkqLworI2RlZmluZSBQVUxTRV9ISQkJMHgwMDA0CS8qIEFjdGlvbiBQdWxzZSAoUG9zaXRpdmUvTmVnYXRpdmUqKQkqLworI2RlZmluZSBQRVJJT0RfQ05UCQkweDAwMDgJLyogUGVyaW9kIENvdW50CQkJCQkJCSovCisjZGVmaW5lIElSUV9FTkEJCQkweDAwMTAJLyogSW50ZXJydXB0IFJlcXVlc3QgRW5hYmxlCQkJCSovCisjZGVmaW5lIFRJTl9TRUwJCQkweDAwMjAJLyogVGltZXIgSW5wdXQgU2VsZWN0CQkJCQkqLworI2RlZmluZSBPVVRfRElTCQkJMHgwMDQwCS8qIE91dHB1dCBQYWQgRGlzYWJsZQkJCQkJKi8KKyNkZWZpbmUgQ0xLX1NFTAkJCTB4MDA4MAkvKiBUaW1lciBDbG9jayBTZWxlY3QJCQkJCSovCisjZGVmaW5lIFRPR0dMRV9ISQkJMHgwMTAwCS8qIFBXTV9PVVQgUFVMU0VfSEkgVG9nZ2xlIE1vZGUJCQkqLworI2RlZmluZSBFTVVfUlVOCQkJMHgwMjAwCS8qIEVtdWxhdGlvbiBCZWhhdmlvciBTZWxlY3QJCQkqLworI2RlZmluZSBFUlJfVFlQCQkJMHhDMDAwCS8qIEVycm9yIFR5cGUJCQkJCQkJKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQklVX0FNR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQU1DS0VOCQkJMHgwMDAxCQkvKiBFbmFibGUgQ0xLT1VUCQkJCQkJCQkJKi8KKyNkZWZpbmUJQU1CRU5fTk9ORQkJMHgwMDAwCQkvKiBBbGwgQmFua3MgRGlzYWJsZWQJCQkJCQkJCSovCisjZGVmaW5lIEFNQkVOX0IwCQkweDAwMDIJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFuayAwIG9ubHkJCQkJCSovCisjZGVmaW5lIEFNQkVOX0IwX0IxCQkweDAwMDQJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCAmIDEgb25seQkJCQkqLworI2RlZmluZSBBTUJFTl9CMF9CMV9CMgkweDAwMDYJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgMCwgMSwgYW5kIDIJCQkqLworI2RlZmluZSBBTUJFTl9BTEwJCTB4MDAwOAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAoYWxsKSAwLCAxLCAyLCBhbmQgMwkqLworCisvKiBFQklVX0FNQkNUTDAgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEIwUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDAgKEIwKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMCBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIwVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMFRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIwVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMFNUXzEJCQkweDAwMDAwMDEwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIwU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIwSFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMEhUXzAJCQkweDAwMDAwMDAwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjBSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMFJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMFdBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF81CQkJMHgwMDAwNTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF84CQkJMHgwMDAwODAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKyNkZWZpbmUgQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSAoQjEpIFJEWSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgIAkqLworI2RlZmluZSBCMVJEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjEgUkRZIEFjdGl2ZSBIaWdoICAgICAgICAgICAgICAgICAgICAgICAgICAgCSovCisjZGVmaW5lIEIxVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlIAkqLworI2RlZmluZSBCMVRUXzIJCQkweDAwMDgwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIxVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMVNUXzEJCQkweDAwMTAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlICAJKi8KKyNkZWZpbmUgQjFTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMgCSovCisjZGVmaW5lIEIxU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzIAkqLworI2RlZmluZSBCMVNUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUgCSovCisjZGVmaW5lIEIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF80CQkJMHg0MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF83CQkJMHg3MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisvKiBFQklVX0FNQkNUTDEgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEIyUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDIgKEIyKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIyUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCMiBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIyVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMlRUXzIJCQkweDAwMDAwMDA4ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjJUVF8zCQkJMHgwMDAwMDAwQyAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCMlNUXzEJCQkweDAwMDAwMDEwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMlNUXzIJCQkweDAwMDAwMDIwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJTVF8zCQkJMHgwMDAwMDAzMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIyU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCMkhUXzEJCQkweDAwMDAwMDQwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKyNkZWZpbmUgQjNSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMyAoQjMpIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjNSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIzIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjNUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCM1RUXzMJCQkweDAwMEMwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIzU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCM1NUXzMJCQkweDAwMzAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNTVF80CQkJMHgwMDAwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIzSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCM1JBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIzUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIzV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF82CQkJMHg2MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF85CQkJMHg5MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqICBTRFJBTSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUJJVV9TREdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0NUTEUJCQkweDAwMDAwMDAxCS8qIEVuYWJsZSBTRFJBTSBTaWduYWxzCQkJCQkJCQkJCSovCisjZGVmaW5lIENMXzIJCQkweDAwMDAwMDA4CS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMiBjeWNsZXMJCQkJCQkJCSovCisjZGVmaW5lIENMXzMJCQkweDAwMDAwMDBDCS8qIFNEUkFNIENBUyBMYXRlbmN5ID0gMyBjeWNsZXMJCQkJCQkJCSovCisjZGVmaW5lIFBBU1JfQUxMCQkweDAwMDAwMDAwCS8qIEFsbCA0IFNEUkFNIEJhbmtzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkJKi8KKyNkZWZpbmUgUEFTUl9CMF9CMQkJMHgwMDAwMDAxMAkvKiBTRFJBTSBCYW5rcyAwIGFuZCAxIEFyZSBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkqLworI2RlZmluZSBQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5IFNEUkFNIEJhbmsgMCBJcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJKi8KKyNkZWZpbmUgVFJBU18xCQkJMHgwMDAwMDA0MAkvKiBTRFJBTSB0UkFTID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzIJCQkweDAwMDAwMDgwCS8qIFNEUkFNIHRSQVMgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMwkJCTB4MDAwMDAwQzAJLyogU0RSQU0gdFJBUyA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU180CQkJMHgwMDAwMDEwMAkvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzUJCQkweDAwMDAwMTQwCS8qIFNEUkFNIHRSQVMgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNgkJCTB4MDAwMDAxODAJLyogU0RSQU0gdFJBUyA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU183CQkJMHgwMDAwMDFDMAkvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzgJCQkweDAwMDAwMjAwCS8qIFNEUkFNIHRSQVMgPSA4IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfOQkJCTB4MDAwMDAyNDAJLyogU0RSQU0gdFJBUyA9IDkgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMAkJCTB4MDAwMDAyODAJLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTEJCQkweDAwMDAwMkMwCS8qIFNEUkFNIHRSQVMgPSAxMSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEyCQkJMHgwMDAwMDMwMAkvKiBTRFJBTSB0UkFTID0gMTIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMwkJCTB4MDAwMDAzNDAJLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTQJCQkweDAwMDAwMzgwCS8qIFNEUkFNIHRSQVMgPSAxNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzE1CQkJMHgwMDAwMDNDMAkvKiBTRFJBTSB0UkFTID0gMTUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzEJCQkweDAwMDAwODAwCS8qIFNEUkFNIHRSUCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzIJCQkweDAwMDAxMDAwCS8qIFNEUkFNIHRSUCA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8zCQkJMHgwMDAwMTgwMAkvKiBTRFJBTSB0UlAgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNAkJCTB4MDAwMDIwMDAJLyogU0RSQU0gdFJQID0gNCBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzUJCQkweDAwMDAyODAwCS8qIFNEUkFNIHRSUCA9IDUgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF82CQkJMHgwMDAwMzAwMAkvKiBTRFJBTSB0UlAgPSA2IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNwkJCTB4MDAwMDM4MDAJLyogU0RSQU0gdFJQID0gNyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8xCQkJMHgwMDAwODAwMAkvKiBTRFJBTSB0UkNEID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzIJCQkweDAwMDEwMDAwCS8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMwkJCTB4MDAwMTgwMDAJLyogU0RSQU0gdFJDRCA9IDMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF80CQkJMHgwMDAyMDAwMAkvKiBTRFJBTSB0UkNEID0gNCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzUJCQkweDAwMDI4MDAwCS8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNgkJCTB4MDAwMzAwMDAJLyogU0RSQU0gdFJDRCA9IDYgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF83CQkJMHgwMDAzODAwMAkvKiBTRFJBTSB0UkNEID0gNyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMQkJCTB4MDAwODAwMDAJLyogU0RSQU0gdFdSID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMgkJCTB4MDAxMDAwMDAJLyogU0RSQU0gdFdSID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzMJCQkweDAwMTgwMDAwCS8qIFNEUkFNIHRXUiA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFBVUFNECQkJMHgwMDIwMDAwMAkvKiBQb3dlci1VcCBTdGFydCBEZWxheSAoMTUgU0NMSyBDeWNsZXMgRGVsYXkpCQkJCSovCisjZGVmaW5lIFBTTQkJCQkweDAwNDAwMDAwCS8qIFBvd2VyLVVwIFNlcXVlbmNlIChNb2RlIFJlZ2lzdGVyIEJlZm9yZS9BZnRlciogUmVmcmVzaCkJKi8KKyNkZWZpbmUgUFNTCQkJCTB4MDA4MDAwMDAJLyogRW5hYmxlIFBvd2VyLVVwIFNlcXVlbmNlIG9uIE5leHQgU0RSQU0gQWNjZXNzCQkJKi8KKyNkZWZpbmUgU1JGUwkJCTB4MDEwMDAwMDAJLyogRW5hYmxlIFNEUkFNIFNlbGYtUmVmcmVzaCBNb2RlCQkJCQkJCSovCisjZGVmaW5lIEVCVUZFCQkJMHgwMjAwMDAwMAkvKiBFbmFibGUgRXh0ZXJuYWwgQnVmZmVyaW5nIFRpbWluZwkJCQkJCQkqLworI2RlZmluZSBGQkJSVwkJCTB4MDQwMDAwMDAJLyogRW5hYmxlIEZhc3QgQmFjay1Uby1CYWNrIFJlYWQgVG8gV3JpdGUJCQkJCSovCisjZGVmaW5lIEVNUkVOCQkJMHgxMDAwMDAwMAkvKiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBUQ1NSCQkJMHgyMDAwMDAwMAkvKiBUZW1wLUNvbXBlbnNhdGVkIFNlbGYtUmVmcmVzaCBWYWx1ZSAoODUvNDUqIERlZyBDKQkJKi8KKyNkZWZpbmUgQ0REQkcJCQkweDQwMDAwMDAwCS8qIFRyaXN0YXRlIFNEUkFNIENvbnRyb2xzIER1cmluZyBCdXMgR3JhbnQJCQkJCSovCisKKy8qIEVCSVVfU0RCQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRUJFCQkJCTB4MDAwMQkJLyogRW5hYmxlIFNEUkFNIEV4dGVybmFsIEJhbmsJCQkJCQkJKi8KKyNkZWZpbmUgRUJTWl8xNgkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTZNQgkqLworI2RlZmluZSBFQlNaXzMyCQkJMHgwMDAyCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAzMk1CCSovCisjZGVmaW5lIEVCU1pfNjQJCQkweDAwMDQJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDY0TUIJKi8KKyNkZWZpbmUgRUJTWl8xMjgJCTB4MDAwNgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMTI4TUIJCSovCisjZGVmaW5lIEVCU1pfMjU2CQkweDAwMDgJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CIAkqLworI2RlZmluZSBFQlNaXzUxMgkJMHgwMDBBCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA1MTJNQgkJKi8KKyNkZWZpbmUgRUJDQVdfOAkJCTB4MDAwMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDggQml0cwkqLworI2RlZmluZSBFQkNBV185CQkJMHgwMDEwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOSBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzEwCQkweDAwMjAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMCBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzExCQkweDAwMzAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSAxMSBCaXRzCSovCisKKy8qIEVCSVVfU0RTVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTRENJCQkJMHgwMDAxCQkvKiBTRFJBTSBDb250cm9sbGVyIElkbGUgCQkJCSovCisjZGVmaW5lIFNEU1JBCQkJMHgwMDAyCQkvKiBTRFJBTSBTZWxmLVJlZnJlc2ggQWN0aXZlCQkJKi8KKyNkZWZpbmUgU0RQVUEJCQkweDAwMDQJCS8qIFNEUkFNIFBvd2VyLVVwIEFjdGl2ZSAJCQkJKi8KKyNkZWZpbmUgU0RSUwkJCTB4MDAwOAkJLyogU0RSQU0gV2lsbCBQb3dlci1VcCBPbiBOZXh0IEFjY2VzcwkqLworI2RlZmluZSBTREVBU0UJCQkweDAwMTAJCS8qIFNEUkFNIEVBQiBTdGlja3kgRXJyb3IgU3RhdHVzCQkqLworI2RlZmluZSBCR1NUQVQJCQkweDAwMjAJCS8qIEJ1cyBHcmFudCBTdGF0dXMJCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqICBETUEgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERNQXhfUEVSSVBIRVJBTF9NQVAsIE1ETUFfeXlfUEVSSVBIRVJBTF9NQVAgTWFza3MJCQkJCQkJCSovCisjZGVmaW5lIENUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIChNZW1vcnkvUGVyaXBoZXJhbCopCSovCisjZGVmaW5lIFBNQVAJCQkweEYwMDAJLyogUGVyaXBoZXJhbCBNYXBwZWQgVG8gVGhpcyBDaGFubmVsCQkJCSovCisjZGVmaW5lIFBNQVBfUFBJCQkweDAwMDAJLyogCQlQUEkgUG9ydCBETUEJCQkJCQkJCSovCisjZGVmaW5lCVBNQVBfRU1BQ1JYCQkweDEwMDAJLyogCQlFdGhlcm5ldCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfRU1BQ1RYCQkweDIwMDAJLyogCQlFdGhlcm5ldCBUcmFuc21pdCBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMFJYCTB4MzAwMAkvKiAJCVNQT1JUMCBSZWNlaXZlIERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMFRYCTB4NDAwMAkvKiAJCVNQT1JUMCBUcmFuc21pdCBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDFSWAkweDUwMDAJLyogCQlTUE9SVDEgUmVjZWl2ZSBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUE9SVDFUWAkweDYwMDAJLyogCQlTUE9SVDEgVHJhbnNtaXQgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BJCQkweDcwMDAJLyogCQlTUEkgUG9ydCBETUEJCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfVUFSVDBSWAkweDgwMDAJLyogCQlVQVJUMCBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9VQVJUMFRYCTB4OTAwMAkvKiAJCVVBUlQwIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVJYCTB4QTAwMAkvKiAJCVVBUlQxIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZQlQTUFQX1VBUlQxVFgJMHhCMDAwCS8qIAkJVUFSVDEgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLworCisvKiAgKioqKioqKioqKioqICBQQVJBTExFTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoUFBJKSBNQVNLUyAqKioqKioqKioqKioqLworLyogIFBQSV9DT05UUk9MIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRfRU4JCQkweDAwMDEJCS8qIFBQSSBQb3J0IEVuYWJsZQkJCQkJKi8KKyNkZWZpbmUgUE9SVF9ESVIJCTB4MDAwMgkJLyogUFBJIFBvcnQgRGlyZWN0aW9uCQkJCSovCisjZGVmaW5lIFhGUl9UWVBFCQkweDAwMEMJCS8qIFBQSSBUcmFuc2ZlciBUeXBlCQkJCSovCisjZGVmaW5lIFBPUlRfQ0ZHCQkweDAwMzAJCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24JCQkqLworI2RlZmluZSBGTERfU0VMCQkJMHgwMDQwCQkvKiBQUEkgQWN0aXZlIEZpZWxkIFNlbGVjdAkJCSovCisjZGVmaW5lIFBBQ0tfRU4JCQkweDAwODAJCS8qIFBQSSBQYWNraW5nIE1vZGUJCQkJCSovCisjZGVmaW5lIERNQTMyCQkJMHgwMTAwCQkvKiBQUEkgMzItYml0IERNQSBFbmFibGUJCQkqLworI2RlZmluZSBTS0lQX0VOCQkJMHgwMjAwCQkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZQkJCSovCisjZGVmaW5lIFNLSVBfRU8JCQkweDA0MDAJCS8qIFBQSSBTa2lwIEV2ZW4vT2RkIEVsZW1lbnRzCQkqLworI2RlZmluZSBETEVOXzgJCQkweDAwMDAJCS8qIERhdGEgTGVuZ3RoID0gOCBCaXRzCQkJCSovCisjZGVmaW5lIERMRU5fMTAJCQkweDA4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTAgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTEJCQkweDEwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTEgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTIJCQkweDE4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTIgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTMJCQkweDIwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTMgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTQJCQkweDI4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTQgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTUJCQkweDMwMDAJCS8qIERhdGEgTGVuZ3RoID0gMTUgQml0cwkJCSovCisjZGVmaW5lIERMRU5fMTYJCQkweDM4MDAJCS8qIERhdGEgTGVuZ3RoID0gMTYgQml0cwkJCSovCisjZGVmaW5lIERMRU5HVEgJCQkweDM4MDAJCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KKyNkZWZpbmUgUE9MQwkJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5CQkJCSovCisjZGVmaW5lIFBPTFMJCQkweDgwMDAJCS8qIFBQSSBGcmFtZSBTeW5jIFBvbGFyaXR5CQkJKi8KKworLyogUFBJX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRkxECQkJCTB4MDQwMAkJLyogRmllbGQgSW5kaWNhdG9yCQkJCQkqLworI2RlZmluZSBGVF9FUlIJCQkweDA4MDAJCS8qIEZyYW1lIFRyYWNrIEVycm9yCQkJCSovCisjZGVmaW5lIE9WUgkJCQkweDEwMDAJCS8qIEZJRk8gT3ZlcmZsb3cgRXJyb3IJCQkJKi8KKyNkZWZpbmUgVU5EUgkJCTB4MjAwMAkJLyogRklGTyBVbmRlcnJ1biBFcnJvcgkJCQkqLworI2RlZmluZSBFUlJfREVUCQkJMHg0MDAwCQkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IJCQkqLworI2RlZmluZSBFUlJfTkNPUgkJMHg4MDAwCQkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvcgkqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0kpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRXSV9DTEtESVYgTWFjcm9zIChVc2U6ICpwVFdJX0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsgICkJCQkJKi8KKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGKQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdwkJCSovCisjZGVmaW5lIENMS0hJKHkpCSgoKHkpJjB4RkYpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cJCQkqLworCisvKiBUV0lfUFJFU0NBTEUgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlQUkVTQ0FMRQkweDAwN0YJCS8qIFNDTEtzIFBlciBJbnRlcm5hbCBUaW1lIFJlZmVyZW5jZSAoMTBNSHopCSovCisjZGVmaW5lCVRXSV9FTkEJCTB4MDA4MAkJLyogVFdJIEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCVNDQ0IJCTB4MDIwMAkJLyogU0NDQiBDb21wYXRpYmlsaXR5IEVuYWJsZQkJCQkJKi8KKworLyogVFdJX1NMQVZFX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVNFTgkJCTB4MDAwMQkJLyogU2xhdmUgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0FERF9MRU4JMHgwMDAyCQkvKiBTbGF2ZSBBZGRyZXNzIExlbmd0aAkJCQkJCQkqLworI2RlZmluZQlTVERWQUwJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNtaXQgRGF0YSBWYWxpZAkJCQkJKi8KKyNkZWZpbmUJTkFLCQkJMHgwMDA4CQkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLworI2RlZmluZQlHRU4JCQkweDAwMTAJCS8qIEdlbmVyYWwgQ2FsbCBBZHJyZXNzIE1hdGNoaW5nIEVuYWJsZWQJCSovCisKKy8qIFRXSV9TTEFWRV9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0RJUgkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKQkqLworI2RlZmluZSBHQ0FMTAkJMHgwMDAyCQkvKiBHZW5lcmFsIENhbGwgSW5kaWNhdG9yCQkJCQkJKi8KKworLyogVFdJX01BU1RFUl9DVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJTUVOCQkJMHgwMDAxCQkvKiBNYXN0ZXIgTW9kZSBFbmFibGUJCQkJCQkqLworI2RlZmluZQlNQUREX0xFTgkweDAwMDIJCS8qIE1hc3RlciBBZGRyZXNzIExlbmd0aAkJCQkJKi8KKyNkZWZpbmUJTURJUgkJMHgwMDA0CQkvKiBNYXN0ZXIgVHJhbnNtaXQgRGlyZWN0aW9uIChSWC9UWCopCQkqLworI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nIFNwZWNzCQkJCSovCisjZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24JCQkJCQkqLworI2RlZmluZQlSU1RBUlQJCTB4MDAyMAkJLyogUmVwZWF0IFN0YXJ0IG9yIFN0b3AqIEF0IEVuZCBPZiBUcmFuc2ZlcgkqLworI2RlZmluZQlEQ05UCQkweDNGQzAJCS8qIERhdGEgQnl0ZXMgVG8gVHJhbnNmZXIJCQkJCSovCisjZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZQkJCQkJCSovCisjZGVmaW5lCVNDTE9WUgkJMHg4MDAwCQkvKiBTZXJpYWwgQ2xvY2sgT3ZlcnJpZGUJCQkJCSovCisKKy8qIFRXSV9NQVNURVJfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJTVBST0cJCTB4MDAwMQkJLyogTWFzdGVyIFRyYW5zZmVyIEluIFByb2dyZXNzCQkJCQkqLworI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QgQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpCSovCisjZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KKyNkZWZpbmUJRE5BSwkJMHgwMDA4CQkvKiBEYXRhIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLworI2RlZmluZQlCVUZSREVSUgkweDAwMTAJCS8qIEJ1ZmZlciBSZWFkIEVycm9yCQkJCQkJCSovCisjZGVmaW5lCUJVRldSRVJSCTB4MDAyMAkJLyogQnVmZmVyIFdyaXRlIEVycm9yCQkJCQkJCSovCisjZGVmaW5lCVNEQVNFTgkJMHgwMDQwCQkvKiBTZXJpYWwgRGF0YSBTZW5zZQkJCQkJCQkqLworI2RlZmluZQlTQ0xTRU4JCTB4MDA4MAkJLyogU2VyaWFsIENsb2NrIFNlbnNlCQkJCQkJCSovCisjZGVmaW5lCUJVU0JVU1kJCTB4MDEwMAkJLyogQnVzIEJ1c3kgSW5kaWNhdG9yCQkJCQkJCSovCisKKy8qIFRXSV9JTlRfU1JDIGFuZCBUV0lfSU5UX0VOQUJMRSBNYXNrcwkJCQkJCSovCisjZGVmaW5lCVNJTklUCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIEluaXRpYXRlZAkqLworI2RlZmluZQlTQ09NUAkJMHgwMDAyCQkvKiBTbGF2ZSBUcmFuc2ZlciBDb21wbGV0ZQkqLworI2RlZmluZQlTRVJSCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zZmVyIEVycm9yCQkqLworI2RlZmluZQlTT1ZGCQkweDAwMDgJCS8qIFNsYXZlIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUJTUNPTVAJCTB4MDAxMAkJLyogTWFzdGVyIFRyYW5zZmVyIENvbXBsZXRlCSovCisjZGVmaW5lCU1FUlIJCTB4MDAyMAkJLyogTWFzdGVyIFRyYW5zZmVyIEVycm9yCSovCisjZGVmaW5lCVhNVFNFUlYJCTB4MDA0MAkJLyogVHJhbnNtaXQgRklGTyBTZXJ2aWNlCSovCisjZGVmaW5lCVJDVlNFUlYJCTB4MDA4MAkJLyogUmVjZWl2ZSBGSUZPIFNlcnZpY2UJCSovCisKKy8qIFRXSV9GSUZPX0NUUkwgTWFza3MJCQkJCQkJCQkJCQkqLworI2RlZmluZQlYTVRGTFVTSAkweDAwMDEJCS8qIFRyYW5zbWl0IEJ1ZmZlciBGbHVzaAkJCSovCisjZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2gJCQkJKi8KKyNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KKyNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLworCisvKiBUV0lfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKiAJCVRyYW5zbWl0IEZJRk8gRW1wdHkJCQkJCQkqLworI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qIAkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlCQkqLworI2RlZmluZQlYTVRfRlVMTAkweDAwMDMJCS8qIAkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKQkqLworCisjZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKiAJCVJlY2VpdmUgRklGTyBFbXB0eQkJCQkJCSovCisjZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyogCQlSZWNlaXZlIEZJRk8gSGFzIDEgQnl0ZSBUbyBSZWFkCQkJKi8KKyNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKiAJCVJlY2VpdmUgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpCQkqLworCisKKy8qIE9taXQgQ0FOIG1hc2tzIGZyb20gZGVmQkY1MzQuaCAqLworCisvKiAgKioqKioqKioqKioqKioqKioqKiAgUElOIENPTlRST0wgUkVHSVNURVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBPUlRfTVVYIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUEpTRQkJCTB4MDAwMQkJCS8qIFBvcnQgSiBTUEkvU1BPUlQgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEpTRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVEZTMC9EVDBQUkkJCQkqLworI2RlZmluZQlQSlNFX1NQSQkJMHgwMDAxCQkJLyogCQlFbmFibGUgU1BJX1NTRUwzOjIJCQkqLworCisjZGVmaW5lCVBKQ0UoeCkJCQkoKCh4KSYweDMpPDwxKQkvKiBQb3J0IEogQ0FOL1NQSS9TUE9SVCBFbmFibGUJCSovCisjZGVmaW5lCVBKQ0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIERSMFNFQy9EVDBTRUMJCSovCisjZGVmaW5lCVBKQ0VfQ0FOCQkweDAwMDIJCQkvKiAJCUVuYWJsZSBDQU4gUlgvVFgJCQkqLworI2RlZmluZQlQSkNFX1NQSQkJMHgwMDA0CQkJLyogCQlFbmFibGUgU1BJX1NTRUw3CQkJKi8KKworI2RlZmluZQlQRkRFCQkJMHgwMDA4CQkJLyogUG9ydCBGIERNQSBSZXF1ZXN0IEVuYWJsZQkJKi8KKyNkZWZpbmUJUEZERV9VQVJUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBVQVJUMCBSWC9UWAkJCSovCisjZGVmaW5lCVBGREVfRE1BCQkweDAwMDgJCQkvKiAJCUVuYWJsZSBETUFSMTowCQkJCSovCisKKyNkZWZpbmUJUEZURQkJCTB4MDAxMAkJCS8qIFBvcnQgRiBUaW1lciBFbmFibGUJCQkJKi8KKyNkZWZpbmUJUEZURV9VQVJUCQkweDAwMDAJCQkvKgkJRW5hYmxlIFVBUlQxIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEZURV9USU1FUgkJMHgwMDEwCQkJLyogCQlFbmFibGUgVE1SNzo2CQkJCSovCisKKyNkZWZpbmUJUEZTNkUJCQkweDAwMjAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNiBFbmFibGUJCQkqLworI2RlZmluZQlQRlM2RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI1CQkJCQkqLworI2RlZmluZQlQRlM2RV9TUEkJCTB4MDAyMAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNgkJCSovCisKKyNkZWZpbmUJUEZTNUUJCQkweDAwNDAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNSBFbmFibGUJCQkqLworI2RlZmluZQlQRlM1RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI0CQkJCQkqLworI2RlZmluZQlQRlM1RV9TUEkJCTB4MDA0MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNQkJCSovCisKKyNkZWZpbmUJUEZTNEUJCQkweDAwODAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNCBFbmFibGUJCQkqLworI2RlZmluZQlQRlM0RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVIzCQkJCQkqLworI2RlZmluZQlQRlM0RV9TUEkJCTB4MDA4MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNAkJCSovCisKKyNkZWZpbmUJUEZGRQkJCTB4MDEwMAkJCS8qIFBvcnQgRiBQUEkgRnJhbWUgU3luYyBFbmFibGUJCSovCisjZGVmaW5lCVBGRkVfVElNRVIJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRNUjIJCQkJCSovCisjZGVmaW5lCVBGRkVfUFBJCQkweDAxMDAJCQkvKiAJCUVuYWJsZSBQUEkgRlMzCQkJCSovCisKKyNkZWZpbmUJUEdTRQkJCTB4MDIwMAkJCS8qIFBvcnQgRyBTUE9SVDEgU2Vjb25kYXJ5IEVuYWJsZQkqLworI2RlZmluZQlQR1NFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQ5OjgJCQkJKi8KKyNkZWZpbmUJUEdTRV9TUE9SVAkJMHgwMjAwCQkJLyogCQlFbmFibGUgRFIxU0VDL0RUMVNFQwkJKi8KKworI2RlZmluZQlQR1JFCQkJMHgwNDAwCQkJLyogUG9ydCBHIFNQT1JUMSBSZWNlaXZlIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEdSRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTI6MTAJCQkqLworI2RlZmluZQlQR1JFX1NQT1JUCQkweDA0MDAJCQkvKiAJCUVuYWJsZSBEUjFQUkkvUkZTMS9SU0NMSzEJKi8KKworI2RlZmluZQlQR1RFCQkJMHgwODAwCQkJLyogUG9ydCBHIFNQT1JUMSBUcmFuc21pdCBFbmFibGUJKi8KKyNkZWZpbmUJUEdURV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTU6MTMJCQkqLworI2RlZmluZQlQR1RFX1NQT1JUCQkweDA4MDAJCQkvKiAJCUVuYWJsZSBEVDFQUkkvVEZTMS9UU0NMSzEJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqICBIQU5EU0hBS0UgRE1BIChIRE1BKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLworLyogSERNQXhfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlITURNQUVOCQkweDAwMDEJLyogRW5hYmxlIEhhbmRzaGFrZSBETUEgMC8xCQkJCQkqLworI2RlZmluZQlSRVAJCQkweDAwMDIJLyogSERNQSBSZXF1ZXN0IFBvbGFyaXR5CQkJCQkqLworI2RlZmluZQlVVEUJCQkweDAwMDQJLyogVXJnZW5jeSBUaHJlc2hvbGQgRW5hYmxlCQkJCQkqLworI2RlZmluZQlPSUUJCQkweDAwMTAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZQkJCQkqLworI2RlZmluZQlCRElFCQkweDAwMjAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCisjZGVmaW5lCU1CREkJCTB4MDA0MAkvKiBNYXNrIEJsb2NrIERvbmUgSVJRIElmIFBlbmRpbmcgRUNOVAkJKi8KKyNkZWZpbmUJRFJRCQkJMHgwMzAwCS8qIEhETUEgUmVxdWVzdCBUeXBlCQkJCQkJKi8KKyNkZWZpbmUJRFJRX05PTkUJMHgwMDAwCS8qIAkJTm8gUmVxdWVzdAkJCQkJCQkqLworI2RlZmluZQlEUlFfU0lOR0xFCTB4MDEwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgU2luZ2xlCQkJCSovCisjZGVmaW5lCURSUV9NVUxUSQkweDAyMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIChEZWZhdWx0KQkqLworI2RlZmluZQlEUlFfVVJHRU5UCTB4MDMwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgVXJnZW50CQkqLworI2RlZmluZQlSQkMJCQkweDEwMDAJLyogUmVsb2FkIEJDTlQgV2l0aCBJQkNOVAkJCQkJKi8KKyNkZWZpbmUJUFMJCQkweDIwMDAJLyogSERNQSBQaW4gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCU9JCQkJMHg0MDAwCS8qIE92ZXJmbG93IEludGVycnVwdCBHZW5lcmF0ZWQJCQkJKi8KKyNkZWZpbmUJQkRJCQkJMHg4MDAwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEdlbmVyYXRlZAkJCSovCisKKy8qIGVudHJ5IGFkZHJlc3NlcyBvZiB0aGUgdXNlci1jYWxsYWJsZSBCb290IFJPTSBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBfQk9PVFJPTV9SRVNFVCAweEVGMDAwMDAwCisjZGVmaW5lIF9CT09UUk9NX0ZJTkFMX0lOSVQgMHhFRjAwMDAwMgorI2RlZmluZSBfQk9PVFJPTV9ET19NRU1PUllfRE1BIDB4RUYwMDAwMDYKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfRkxBU0ggMHhFRjAwMDAwOAorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9TUEkgMHhFRjAwMDAwQQorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9UV0kgMHhFRjAwMDAwQworI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfRkxBU0ggMHhFRjAwMDAxMAorI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfU1BJIDB4RUYwMDAwMTIKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1RXSSAweEVGMDAwMDE0CisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlQR0RFX1VBUlQgICBQRkRFX1VBUlQKKyNkZWZpbmUJUEdERV9ETUEgICAgUEZERV9ETUEKKyNkZWZpbmUJQ0tFTE9XCQlTQ0tFTE9XCisKKy8qID09PT0gZW5kIGZyb20gZGVmQkY1MzQuaCA9PT09ICovCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ09OVFJPTCAgMHhmZmMwMzQwMCAgIC8qIEhPU1QgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRVUyAgMHhmZmMwMzQwNCAgIC8qIEhPU1QgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9USU1FT1VUICAweGZmYzAzNDA4ICAgLyogSE9TVCBBY2tub3dsZWRnZSBNb2RlIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKworLyogQ291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTkZJRyAgMHhmZmMwMzUwMCAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBDTlRfSU1BU0sgIDB4ZmZjMDM1MDQgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX1NUQVRVUyAgMHhmZmMwMzUwOCAgIC8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09NTUFORCAgMHhmZmMwMzUwYyAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTlRfREVCT1VOQ0UgIDB4ZmZjMDM1MTAgICAvKiBEZWJvdW5jZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09VTlRFUiAgMHhmZmMwMzUxNCAgIC8qIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NQVggIDB4ZmZjMDM1MTggICAvKiBNYXhpbWFsIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUlOICAweGZmYzAzNTFjICAgLyogTWluaW1hbCBDb3VudCBSZWdpc3RlciAqLworCisvKiBPVFAvRlVTRSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBPVFBfQ09OVFJPTCAgMHhmZmMwMzYwMCAgIC8qIE9UUC9GdXNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9CRU4gIDB4ZmZjMDM2MDQgICAvKiBPVFAvRnVzZSBCeXRlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1NUQVRVUyAgMHhmZmMwMzYwOCAgIC8qIE9UUC9GdXNlIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1RJTUlORyAgMHhmZmMwMzYwYyAgIC8qIE9UUC9GdXNlIEFjY2VzcyBUaW1pbmcgKi8KKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TWVNTV1QgIDB4ZmZjMDM2MjAgICAvKiBTZWN1cmUgU3lzdGVtIFN3aXRjaGVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9DT05UUk9MICAweGZmYzAzNjI0ICAgLyogU2VjdXJlIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TVEFUVVMgIDB4ZmZjMDM2MjggICAvKiBTZWN1cmUgU3RhdHVzICovCisKKy8qIE9UUCBSZWFkL1dyaXRlIERhdGEgQnVmZmVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEwICAweGZmYzAzNjgwICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEExICAweGZmYzAzNjg0ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEyICAweGZmYzAzNjg4ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEzICAweGZmYzAzNjhjICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisKKy8qIE5GQyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0NUTCAgMHhmZmMwMzcwMCAgIC8qIE5BTkQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfU1RBVCAgMHhmZmMwMzcwNCAgIC8qIE5BTkQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19JUlFTVEFUICAweGZmYzAzNzA4ICAgLyogTkFORCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19JUlFNQVNLICAweGZmYzAzNzBjICAgLyogTkFORCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfRUNDMCAgMHhmZmMwMzcxMCAgIC8qIE5BTkQgRUNDIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0VDQzEgIDB4ZmZjMDM3MTQgICAvKiBOQU5EIEVDQyBSZWdpc3RlciAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MyICAweGZmYzAzNzE4ICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfRUNDMyAgMHhmZmMwMzcxYyAgIC8qIE5BTkQgRUNDIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBORkNfQ09VTlQgIDB4ZmZjMDM3MjAgICAvKiBOQU5EIEVDQyBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX1JTVCAgMHhmZmMwMzcyNCAgIC8qIE5BTkQgRUNDIFJlc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgTkZDX1BHQ1RMICAweGZmYzAzNzI4ICAgLyogTkFORCBQYWdlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX1JFQUQgIDB4ZmZjMDM3MmMgICAvKiBOQU5EIFJlYWQgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfQUREUiAgMHhmZmMwMzc0MCAgIC8qIE5BTkQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0NNRCAgMHhmZmMwMzc0NCAgIC8qIE5BTkQgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBORkNfREFUQV9XUiAgMHhmZmMwMzc0OCAgIC8qIE5BTkQgRGF0YSBXcml0ZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBORkNfREFUQV9SRCAgMHhmZmMwMzc0YyAgIC8qIE5BTkQgRGF0YSBSZWFkIFJlZ2lzdGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KKy8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQml0IG1hc2tzIGZvciBIT1NUX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTiAgMHgxICAgICAgICAvKiBIb3N0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU5EICAweDIgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU5EICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9EQVRBX1NJWkUgIDB4NCAgICAgICAgLyogRGF0YSBTaXplICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uREFUQV9TSVpFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9SU1QgIDB4OCAgICAgICAgLyogSG9zdCBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX1JTVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hSRFlfT1ZSICAweDIwICAgICAgIC8qIEhvc3QgUmVhZHkgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSFJEWV9PVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9JTlRfTU9ERSAgMHg0MCAgICAgICAvKiBJbnRlcnJ1cHQgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25JTlRfTU9ERSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JUX0VOICAweDgwICAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfIG5CVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhXICAweDEwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFdyaXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhXICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFIgIDB4MjAwICAgICAgLyogRW5hYmxlIEhvc3QgUmVhZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQkRSICAweDQwMCAgICAgIC8qIEJ1cnN0IERNQSBSZXF1ZXN0cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkJEUiAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9SRUFEWSAgMHgxICAgICAgICAvKiBETUEgUmVhZHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uUkVBRFkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRlVMTCAgMHgyICAgICAgICAvKiBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0ZVTEwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9FTVBUWSAgMHg0ICAgICAgICAvKiBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0VNUFRZICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQ09NUExFVEUgIDB4OCAgICAgICAgLyogRE1BIENvbXBsZXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkNPTVBMRVRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hTSEsgIDB4MTAgICAgICAgLyogSG9zdCBIYW5kc2hha2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhTSEsgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfVElNRU9VVCAgMHgyMCAgICAgICAvKiBIb3N0IFRpbWVvdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblRJTUVPVVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSElSUSAgMHg0MCAgICAgICAvKiBIb3N0IEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ISVJRICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0FMTE9XX0NORkcgIDB4ODAgICAgICAgLyogQWxsb3cgTmV3IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkFMTE9XX0NORkcgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRE1BX0RJUiAgMHgxMDAgICAgICAvKiBETUEgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ETUFfRElSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9CVEUgIDB4MjAwICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkJURSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hPU1RSRF9ET05FICAweDgwMDAgICAgIC8qIEhvc3QgUmVhZCBDb21wbGV0aW9uIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgSE9TVF9TVEFUX25IT1NUUkRfRE9ORSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9USU1FT1VUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgSE9TVF9DT1VOVF9USU1FT1VUICAweDdmZiAgICAgIC8qIEhvc3QgVGltZW91dCBjb3VudCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TWVNTV1QgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFTVVEQUJMICAweDEgICAgICAgIC8qIEVtdWxhdGlvbiBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5FTVVEQUJMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUlNUREFCTCAgMHgyICAgICAgICAvKiBSZXNldCBEaXNhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblJTVERBQkwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBMMUlEQUJMICAweDFjICAgICAgIC8qIEwxIEluc3RydWN0aW9uIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREFEQUJMICAweGUwICAgICAgIC8qIEwxIERhdGEgQmFuayBBIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREJEQUJMICAweDcwMCAgICAgIC8qIEwxIERhdGEgQmFuayBCIE1lbW9yeSBEaXNhYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUEwT1ZSICAweDgwMCAgICAgIC8qIERNQTAgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUEwT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BMU9WUiAgMHgxMDAwICAgICAvKiBETUExIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BMU9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFTVVPVlIgIDB4NDAwMCAgICAgLyogRW11bGF0aW9uIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5FTVVPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgT1RQU0VOICAweDgwMDAgICAgIC8qIE9UUCBTZWNyZXRzIEVuYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk9UUFNFTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBMMkRBQkwgIDB4NzAwMDAgICAgLyogTDIgTWVtb3J5IERpc2FibGUuICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUwICAweDEgICAgICAgIC8qIFNFQ1VSRSAwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTAgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUxICAweDIgICAgICAgIC8qIFNFQ1VSRSAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTEgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUyICAweDQgICAgICAgIC8qIFNFQ1VSRSAyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUzICAweDggICAgICAgIC8qIFNFQ1VSRSAzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTMgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNNT0RFICAweDMgICAgICAgIC8qIFNlY3VyZWQgTW9kZSBDb250cm9sIFN0YXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBOTUkgIDB4NCAgICAgICAgLyogTm9uIE1hc2thYmxlIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBuTk1JICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQUZWQUxJRCAgMHg4ICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBWYWxpZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5BRlZBTElEICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEFGRVhJVCAgMHgxMCAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBFeGl0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5BRkVYSVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNTVEFUICAweGUwICAgICAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KIAogI2VuZGlmIC8qIF9ERUZfQkY1MjJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNS5oCmluZGV4IGMxMzZmNzAuLmNjMzgzYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjUuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI1LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjcuaAppbmRleCA0ZGQ1OGZiLi4wNTM2OWE5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTJ4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQ3NTAzLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQotICovCi0KLSNpZm5kZWYgX0RFRl9CRjUyWF9ICi0jZGVmaW5lIF9ERUZfQkY1MlhfSAotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjUyeCAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogPT09PSBiZWdpbiBmcm9tIGRlZkJGNTM0LmggPT09PSAqLwotCi0vKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgUExMX0NUTAkJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUExMX0RJVgkJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBWUl9DVEwJCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQTExfU1RBVAkJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBMTF9MT0NLQ05UCQkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jayBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgQ0hJUElEICAgICAgICAweEZGQzAwMDE0ICAvKiBEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KLQotCi0vKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkqLwotI2RlZmluZSBTV1JTVAkJCQkweEZGQzAwMTAwCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTWVNDUgkJCQkweEZGQzAwMTA0CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU0lDX1JWRUNUCQkJMHhGRkMwMDEwOAkvKiBJbnRlcnJ1cHQgUmVzZXQgVmVjdG9yIEFkZHJlc3MgUmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTSUNfSU1BU0swCQkJMHhGRkMwMDEwQwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjAJCQkweEZGQzAwMTEwCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAJCQkqLwotI2RlZmluZSBTSUNfSUFSMQkJCTB4RkZDMDAxMTQJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMQkJCSovCi0jZGVmaW5lIFNJQ19JQVIyCQkJMHhGRkMwMDExOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDMJCQkqLwotI2RlZmluZSBTSUNfSVNSMAkJCQkweEZGQzAwMTIwCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgU0lDX0lXUjAJCQkJMHhGRkMwMDEyNAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyCQkJCSovCi0KLS8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUyeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCi0jZGVmaW5lIFNJQ19JTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE0QyAgICAgLyogSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgb2YgU0lDMiAqLwotI2RlZmluZSBTSUNfSUFSNCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTAgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNCAqLwotI2RlZmluZSBTSUNfSUFSNSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTQgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNSAqLwotI2RlZmluZSBTSUNfSUFSNiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTggICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNiAqLwotI2RlZmluZSBTSUNfSUFSNyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNUMgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNyAqLwotI2RlZmluZSBTSUNfSVNSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjAgICAgIC8qIEludGVycnVwdCBTdGF0dXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0lDX0lXUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTY0ICAgICAvKiBJbnRlcnJ1cHQgV2FrZXVwIHJlZ2lzdGVyICovCi0KLQotLyogV2F0Y2hkb2cgVGltZXIJCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkqLwotI2RlZmluZSBXRE9HX0NUTAkJCTB4RkZDMDAyMDAJLyogV2F0Y2hkb2cgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBXRE9HX0NOVAkJCTB4RkZDMDAyMDQJLyogV2F0Y2hkb2cgQ291bnQgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFdET0dfU1RBVAkJCTB4RkZDMDAyMDgJLyogV2F0Y2hkb2cgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIFJUQ19TVEFUCQkJMHhGRkMwMDMwMAkvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUlRDX0lDVEwJCQkweEZGQzAwMzA0CS8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFJUQ19JU1RBVAkJCTB4RkZDMDAzMDgJLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBSVENfU1dDTlQJCQkweEZGQzAwMzBDCS8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUlRDX0FMQVJNCQkJMHhGRkMwMDMxMAkvKiBSVEMgQWxhcm0gVGltZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUlRDX0ZBU1QJCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUlRDX1BSRU4JCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIEFsdGVybmF0ZSBNYWNybwkJKi8KLQotCi0vKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfVEhSCQkJMHhGRkMwMDQwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQwX1JCUgkJCTB4RkZDMDA0MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX0RMTAkJCTB4RkZDMDA0MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCQkqLwotI2RlZmluZSBVQVJUMF9JRVIJCQkweEZGQzAwNDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDBfRExICQkJMHhGRkMwMDQwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpCQkJCSovCi0jZGVmaW5lIFVBUlQwX0lJUgkJCTB4RkZDMDA0MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBVQVJUMF9MQ1IJCQkweEZGQzAwNDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfTUNSCQkJMHhGRkMwMDQxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMF9MU1IJCQkweEZGQzAwNDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfTVNSCQkJMHhGRkMwMDQxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX1NDUgkJCTB4RkZDMDA0MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBVQVJUMF9HQ1RMCQkJMHhGRkMwMDQyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLQotCi0vKiBTUEkgQ29udHJvbGxlcgkJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJCSovCi0jZGVmaW5lIFNQSTBfUkVHQkFTRQkJCTB4RkZDMDA1MDAKLSNkZWZpbmUgU1BJX0NUTAkJCQkweEZGQzAwNTAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BJX0ZMRwkJCQkweEZGQzAwNTA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BJX1NUQVQJCQkweEZGQzAwNTA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUElfVERCUgkJCTB4RkZDMDA1MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBTUElfUkRCUgkJCTB4RkZDMDA1MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUElfQkFVRAkJCTB4RkZDMDA1MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU1BJX1NIQURPVwkJCTB4RkZDMDA1MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNRVIwX0NPTkZJRwkJMHhGRkMwMDYwMAkvKiBUaW1lciAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUSU1FUjBfQ09VTlRFUgkJMHhGRkMwMDYwNAkvKiBUaW1lciAwIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSMF9QRVJJT0QJCTB4RkZDMDA2MDgJLyogVGltZXIgMCBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSMF9XSURUSAkJMHhGRkMwMDYwQwkvKiBUaW1lciAwIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLwotCi0jZGVmaW5lIFRJTUVSMV9DT05GSUcJCTB4RkZDMDA2MTAJLyogVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjFfQ09VTlRFUgkJMHhGRkMwMDYxNAkvKiBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMV9QRVJJT0QJCTB4RkZDMDA2MTgJLyogVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjFfV0lEVEgJCTB4RkZDMDA2MUMJLyogVGltZXIgMSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSMl9DT05GSUcJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjJfQ09VTlRFUgkJMHhGRkMwMDYyNAkvKiBUaW1lciAyIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMl9QRVJJT0QJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjJfV0lEVEgJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSM19DT05GSUcJCTB4RkZDMDA2MzAJLyogVGltZXIgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVElNRVIzX0NPVU5URVIJCTB4RkZDMDA2MzQJLyogVGltZXIgMyBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjNfUEVSSU9ECQkweEZGQzAwNjM4CS8qIFRpbWVyIDMgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjNfV0lEVEgJCTB4RkZDMDA2M0MJLyogVGltZXIgMyBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KLQotI2RlZmluZSBUSU1FUjRfQ09ORklHCQkweEZGQzAwNjQwCS8qIFRpbWVyIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI0X0NPVU5URVIJCTB4RkZDMDA2NDQJLyogVGltZXIgNCBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjRfUEVSSU9ECQkweEZGQzAwNjQ4CS8qIFRpbWVyIDQgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI0X1dJRFRICQkweEZGQzAwNjRDCS8qIFRpbWVyIDQgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjVfQ09ORklHCQkweEZGQzAwNjUwCS8qIFRpbWVyIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI1X0NPVU5URVIJCTB4RkZDMDA2NTQJLyogVGltZXIgNSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjVfUEVSSU9ECQkweEZGQzAwNjU4CS8qIFRpbWVyIDUgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI1X1dJRFRICQkweEZGQzAwNjVDCS8qIFRpbWVyIDUgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjZfQ09ORklHCQkweEZGQzAwNjYwCS8qIFRpbWVyIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI2X0NPVU5URVIJCTB4RkZDMDA2NjQJLyogVGltZXIgNiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjZfUEVSSU9ECQkweEZGQzAwNjY4CS8qIFRpbWVyIDYgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI2X1dJRFRICQkweEZGQzAwNjZDCS8qIFRpbWVyIDYgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjdfQ09ORklHCQkweEZGQzAwNjcwCS8qIFRpbWVyIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVI3X0NPVU5URVIJCTB4RkZDMDA2NzQJLyogVGltZXIgNyBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjdfUEVSSU9ECQkweEZGQzAwNjc4CS8qIFRpbWVyIDcgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI3X1dJRFRICQkweEZGQzAwNjdDCS8qIFRpbWVyIDcgV2lkdGggUmVnaXN0ZXIgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUl9FTkFCTEUJCTB4RkZDMDA2ODAJLyogVGltZXIgRW5hYmxlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUl9ESVNBQkxFCQkweEZGQzAwNjg0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSX1NUQVRVUwkJMHhGRkMwMDY4OAkvKiBUaW1lciBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBPUlRGSU8JCQkJCTB4RkZDMDA3MDAJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JURklPX0NMRUFSCQkJMHhGRkMwMDcwNAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQT1JURklPX1NFVAkJCQkweEZGQzAwNzA4CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19UT0dHTEUJCQkweEZGQzAwNzBDCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQQkJCTB4RkZDMDA3MTAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQV9DTEVBUgkJMHhGRkMwMDcxNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0FfU0VUCQkweEZGQzAwNzE4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tBX1RPR0dMRQkweEZGQzAwNzFDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0IJCQkweEZGQzAwNzIwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDA3MjQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tCX1NFVAkJMHhGRkMwMDcyOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQl9UT0dHTEUJMHhGRkMwMDcyQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JURklPX0RJUgkJCQkweEZGQzAwNzMwCS8qIFBvcnQgRiBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19QT0xBUgkJCTB4RkZDMDA3MzQJLyogUG9ydCBGIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fRURHRQkJCTB4RkZDMDA3MzgJLyogUG9ydCBGIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19CT1RICQkJMHhGRkMwMDczQwkvKiBQb3J0IEYgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fSU5FTgkJCTB4RkZDMDA3NDAJLyogUG9ydCBGIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgCQkJCQkqLwotCi0KLS8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9UQ1IxCQkJMHhGRkMwMDgwMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RDUjIJCQkweEZGQzAwODA0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfVENMS0RJVgkJMHhGRkMwMDgwOAkvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RGU0RJVgkJMHhGRkMwMDgwQwkvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9UWAkJCTB4RkZDMDA4MTAJLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JYCQkJMHhGRkMwMDgxOAkvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfUkNSMQkJCTB4RkZDMDA4MjAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMF9SQ1IyCQkJMHhGRkMwMDgyNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JDTEtESVYJCTB4RkZDMDA4MjgJLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9SRlNESVYJCTB4RkZDMDA4MkMJLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMAkvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNAkvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfTUNNQzEJCTB4RkZDMDA4MzgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NQ01DMgkJMHhGRkMwMDgzQwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MwCQkweEZGQzAwODQwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMF9NVENTMQkJMHhGRkMwMDg0NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzIJCTB4RkZDMDA4NDgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MzCQkweEZGQzAwODRDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMAkJMHhGRkMwMDg1MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMQkJMHhGRkMwMDg1NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMgkJMHhGRkMwMDg1OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMwkJMHhGRkMwMDg1QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCi0KLQotLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RDUjEJCQkweEZGQzAwOTAwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfVENSMgkJCTB4RkZDMDA5MDQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMV9UQ0xLRElWCQkweEZGQzAwOTA4CS8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfVEZTRElWCQkweEZGQzAwOTBDCS8qIFNQT1JUMSBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RYCQkJMHhGRkMwMDkxMAkvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfUlgJCQkweEZGQzAwOTE4CS8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9SQ1IxCQkJMHhGRkMwMDkyMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JDUjIJCQkweEZGQzAwOTI0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfUkNMS0RJVgkJMHhGRkMwMDkyOAkvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JGU0RJVgkJMHhGRkMwMDkyQwkvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwCS8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0CS8qIFNQT1JUMSBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9NQ01DMQkJMHhGRkMwMDkzOAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQxX01DTUMyCQkweEZGQzAwOTNDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzAJCTB4RkZDMDA5NDAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQxX01UQ1MxCQkweEZGQzAwOTQ0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMV9NVENTMgkJMHhGRkMwMDk0OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzMJCTB4RkZDMDA5NEMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MwCQkweEZGQzAwOTUwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MxCQkweEZGQzAwOTU0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MyCQkweEZGQzAwOTU4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQxX01SQ1MzCQkweEZGQzAwOTVDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLQotCi0vKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgRUJJVV9BTUdDVEwJCQkweEZGQzAwQTAwCS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwCS8qIFNEUkFNIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEVCSVVfU0RCQ1RMCQkJMHhGRkMwMEExNAkvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIEVCSVVfU0RSUkMJCQkweEZGQzAwQTE4CS8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0KLQotLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRE1BX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBETUFfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBETUFfVENQRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgRE1BX1RDQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KLQotLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQThfU1RBUlRfQUREUgkJCTB4RkZDMDBFMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE4X0NPTkZJRwkJCQkweEZGQzAwRTA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOF9YX0NPVU5UCQkJMHhGRkMwMEUxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1hfTU9ESUZZCQkJMHhGRkMwMEUxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMEUxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1lfTU9ESUZZCQkJMHhGRkMwMEUxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BOF9DVVJSX0FERFIJCQkweEZGQzAwRTI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDBFMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEUzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEUzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE5X1NUQVJUX0FERFIJCQkweEZGQzAwRTQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOV9DT05GSUcJCQkJMHhGRkMwMEU0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTlfWF9DT1VOVAkJCTB4RkZDMDBFNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9YX01PRElGWQkJCTB4RkZDMDBFNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTlfWV9DT1VOVAkJCTB4RkZDMDBFNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9ZX01PRElGWQkJCTB4RkZDMDBFNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEU2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMEU2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAwRTY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExMF9TVEFSVF9BRERSCQkweEZGQzAwRTg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX1hfQ09VTlQJCQkweEZGQzAwRTkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9YX01PRElGWQkJCTB4RkZDMDBFOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9ZX0NPVU5UCQkJMHhGRkMwMEU5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAwRTlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExMF9DVVJSX0FERFIJCQkweEZGQzAwRUE0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRUMwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX1hfQ09VTlQJCQkweEZGQzAwRUQwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9YX01PRElGWQkJCTB4RkZDMDBFRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9ZX0NPVU5UCQkJMHhGRkMwMEVEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAwRURDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExMV9DVVJSX0FERFIJCQkweEZGQzAwRUU0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEYwMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEYwNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX0NPTkZJRwkJCTB4RkZDMDBGMDgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9YX0NPVU5UCQkJMHhGRkMwMEYxMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBGMTQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQJCQkweEZGQzAwRjE4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9ZX01PRElGWQkJMHhGRkMwMEYxQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjIwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEYyNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEYyOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEYyQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEYzMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGMzgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjQwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBGNDQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NPTkZJRwkJCTB4RkZDMDBGNDgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQJCQkweEZGQzAwRjUwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZCQkweEZGQzAwRjU0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UCQkJMHhGRkMwMEY1OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEY1QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjYwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRjY0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBGNjgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGNkMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEY3MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEY3OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLQotI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEY4MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEY4NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX0NPTkZJRwkJCTB4RkZDMDBGODgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9YX0NPVU5UCQkJMHhGRkMwMEY5MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBGOTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQJCQkweEZGQzAwRjk4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9ZX01PRElGWQkJMHhGRkMwMEY5QwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkEwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEZBNAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEZBOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZBQwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZCMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGQjgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRkMwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBGQzQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NPTkZJRwkJCTB4RkZDMDBGQzgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQJCQkweEZGQzAwRkQwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZCQkweEZGQzAwRkQ0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UCQkJMHhGRkMwMEZEOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEZEQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkUwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRkU0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBGRTgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGRUMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZGMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZGOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLQotCi0vKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCSovCi0jZGVmaW5lIFBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBQSV9TVEFUVVMJCQkweEZGQzAxMDA0CS8qIFBQSSBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgkqLwotI2RlZmluZSBQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUFBJX0ZSQU1FCQkJMHhGRkMwMTAxMAkvKiBQUEkgRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyCSovCi0KLQotLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLwotI2RlZmluZSBUV0kwX1JFR0JBU0UJCQkweEZGQzAxNDAwCi0jZGVmaW5lIFRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRXSTBfQ09OVFJPTAkJCTB4RkZDMDE0MDQJLyogVFdJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfQ1RMCQkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfU1RBVAkJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfQUREUgkJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSSBNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUV0kwX0ZJRk9fU1RBVAkJMHhGRkMwMTQyQwkvKiBGSUZPIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLwotI2RlZmluZSBUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTyBUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8gUmVjZWl2ZSBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLwotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUR0lPCQkJCQkweEZGQzAxNTAwCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19DTEVBUgkJCTB4RkZDMDE1MDQJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUE9SVEdJT19TRVQJCQkJMHhGRkMwMTUwOAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fVE9HR0xFCQkJMHhGRkMwMTUwQwkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0EJCQkweEZGQzAxNTEwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE1MTQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tBX1NFVAkJMHhGRkMwMTUxOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTUxQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCCQkJMHhGRkMwMTUyMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCX0NMRUFSCQkweEZGQzAxNTI0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQl9TRVQJCTB4RkZDMDE1MjgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE1MkMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEdJT19ESVIJCQkJMHhGRkMwMTUzMAkvKiBQb3J0IEcgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fUE9MQVIJCQkweEZGQzAxNTM0CS8qIFBvcnQgRyBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0VER0UJCQkweEZGQzAxNTM4CS8qIFBvcnQgRyBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fQk9USAkJCTB4RkZDMDE1M0MJLyogUG9ydCBHIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0lORU4JCQkweEZGQzAxNTQwCS8qIFBvcnQgRyBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEhJTwkJCQkJMHhGRkMwMTcwMAkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fQ0xFQVIJCQkweEZGQzAxNzA0CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBPUlRISU9fU0VUCQkJCTB4RkZDMDE3MDgJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX1RPR0dMRQkJCTB4RkZDMDE3MEMJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBCQkJMHhGRkMwMTcxMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBX0NMRUFSCQkweEZGQzAxNzE0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQV9TRVQJCTB4RkZDMDE3MTgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE3MUMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQgkJCTB4RkZDMDE3MjAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTcyNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0JfU0VUCQkweEZGQzAxNzI4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCX1RPR0dMRQkweEZGQzAxNzJDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRISU9fRElSCQkJCTB4RkZDMDE3MzAJLyogUG9ydCBIIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX1BPTEFSCQkJMHhGRkMwMTczNAkvKiBQb3J0IEggSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19FREdFCQkJMHhGRkMwMTczOAkvKiBQb3J0IEggSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUSElPX0JPVEgJCQkweEZGQzAxNzNDCS8qIFBvcnQgSCBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19JTkVOCQkJMHhGRkMwMTc0MAkvKiBQb3J0IEggSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCi0KLQotLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkqLwotI2RlZmluZSBVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkqLwotI2RlZmluZSBVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkqLwotI2RlZmluZSBVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfTVNSCQkJMHhGRkMwMjAxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLQotCi0vKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGRlZkJGNTM0LmggKENBTiBpcyBub3QgaW4gdGhlIEFEU1AtQkY1MnggcHJvY2Vzc29yKSAqLwotCi0vKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEZfRkVSCQkJMHhGRkMwMzIwMAkvKiBQb3J0IEYgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCi0jZGVmaW5lIFBPUlRHX0ZFUgkJCTB4RkZDMDMyMDQJLyogUG9ydCBHIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLwotI2RlZmluZSBQT1JUSF9GRVIJCQkweEZGQzAzMjA4CS8qIFBvcnQgSCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KLSNkZWZpbmUgQkZJTl9QT1JUX01VWAkJCTB4RkZDMDMyMEMJLyogUG9ydCBNdWx0aXBsZXhlciBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBITURNQTBfRUNJTklUCQkweEZGQzAzMzA0CS8qIEhNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0JDSU5JVAkJMHhGRkMwMzMwOAkvKiBITURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTBfRUNVUkdFTlQJCTB4RkZDMDMzMEMJLyogSE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgSE1ETUEwX0VDT1VOVAkJMHhGRkMwMzMxNAkvKiBITURNQTAgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBITURNQTFfQ09OVFJPTAkJMHhGRkMwMzM0MAkvKiBIYW5kc2hha2UgTURNQTEgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9CQ0lOSVQJCTB4RkZDMDMzNDgJLyogSE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCi0jZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLS8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCi0jZGVmaW5lIFBPUlRGX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTAgICAgICAvKiBQb3J0IEYgbXV4IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEdfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxNCAgICAgIC8qIFBvcnQgRyBtdXggY29udHJvbCAqLwotI2RlZmluZSBQT1JUSF9NVVggICAgICAgICAgICAgICAweEZGQzAzMjE4ICAgICAgLyogUG9ydCBIIG11eCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRGX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjAgICAgICAvKiBQb3J0IEYgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI0ICAgICAgLyogUG9ydCBHIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEhfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyOCAgICAgIC8qIFBvcnQgSCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRGX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzAgICAgICAvKiBQb3J0IEYgc2xldyBjb250cm9sICovCi0jZGVmaW5lIFBPUlRHX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzQgICAgICAvKiBQb3J0IEcgc2xldyBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX1NMRVcgICAgICAgICAgICAgIDB4RkZDMDMyMzggICAgICAvKiBQb3J0IEggc2xldyBjb250cm9sICovCi0jZGVmaW5lIFBPUlRGX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDAgICAgICAvKiBQb3J0IEYgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEdfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0NCAgICAgIC8qIFBvcnQgRyBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLwotI2RlZmluZSBQT1JUSF9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ4ICAgICAgLyogUG9ydCBIIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCi0jZGVmaW5lIE1JU0NQT1JUX0RSSVZFICAgICAgICAgIDB4RkZDMDMyODAgICAgICAvKiBNaXNjIFBvcnQgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLwotI2RlZmluZSBNSVNDUE9SVF9TTEVXICAgICAgICAgICAweEZGQzAzMjg0ICAgICAgLyogTWlzYyBQb3J0IHNsZXcgY29udHJvbCAqLwotI2RlZmluZSBNSVNDUE9SVF9IWVNURVJJU0lTICAgICAweEZGQzAzMjg4ICAgICAgLyogTWlzYyBQb3J0IFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgQW5kIE1hY3JvcwotKioKLSoqIERpc2NsYWltZXI6CUFsbCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIG1ha2UgQyBhbmQgQXNzZW1ibHkgY29kZSBtb3JlIHJlYWRhYmxlLgotKioJCQkJVXNlIHRoZXNlIG1hY3JvcyBjYXJlZnVsbHksIGFzIGFueSB0aGF0IGRvIGxlZnQgc2hpZnRzIGZvciBmaWVsZAotKioJCQkJZGVwb3NpdGluZyB3aWxsIHJlc3VsdCBpbiB0aGUgbG93ZXIgb3JkZXIgYml0cyBiZWluZyBkZXN0cm95ZWQuICBBbnkKLSoqCQkJCW1hY3JvIHRoYXQgc2hpZnRzIGxlZnQgdG8gcHJvcGVybHkgcG9zaXRpb24gdGhlIGJpdC1maWVsZCBzaG91bGQgYmUKLSoqCQkJCXVzZWQgYXMgcGFydCBvZiBhbiBPUiB0byBpbml0aWFsaXplIGEgcmVnaXN0ZXIgYW5kIE5PVCBhcyBhIGR5bmFtaWMKLSoqCQkJCW1vZGlmaWVyIFVOTEVTUyB0aGUgbG93ZXIgb3JkZXIgYml0cyBhcmUgc2F2ZWQgYW5kIE9SZWQgYmFjayBpbiB3aGVuCi0qKgkJCQl0aGUgbWFjcm8gaXMgdXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENISVBJRCBNYXNrcyAqLwotI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKLSNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCi0jZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQotCi0vKiBTV1JTVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNZU1RFTV9SRVNFVAkJMHgwMDA3CS8qIEluaXRpYXRlcyBBIFN5c3RlbSBTb2Z0d2FyZSBSZXNldAkJCSovCi0jZGVmaW5lCURPVUJMRV9GQVVMVAkJMHgwMDA4CS8qIENvcmUgRG91YmxlIEZhdWx0IENhdXNlcyBSZXNldAkJCQkqLwotI2RlZmluZSBSRVNFVF9ET1VCTEUJCTB4MjAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgQ29yZSBEb3VibGUtRmF1bHQJCSovCi0jZGVmaW5lIFJFU0VUX1dET0cJCQkweDQwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IFdhdGNoZG9nIFRpbWVyCQkJKi8KLSNkZWZpbmUgUkVTRVRfU09GVFdBUkUJCTB4ODAwMAkvKiBTVyBSZXNldCBPY2N1cnJlZCBTaW5jZSBMYXN0IFJlYWQgT2YgU1dSU1QJKi8KLQotLyogU1lTQ1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEJNT0RFCQkJCTB4MDAwNwkvKiBCb290IE1vZGUgLSBMYXRjaGVkIER1cmluZyBIVyBSZXNldCBGcm9tIE1vZGUgUGlucwkqLwotI2RlZmluZQlOT0JPT1QJCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbSBMMSBvciBBU1lOQyBCYW5rIDAgV2hlbiBCTU9ERSA9IDAJCSovCi0KLQotLyogKioqKioqKioqKioqKiAgU1lTVEVNIElOVEVSUlVQVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQZXJpcGhlcmFsIE1hc2tzIEZvciBTSUNfSVNSLCBTSUNfSVdSLCBTSUNfSU1BU0sJCQkJCQkJCQkJKi8KLQotI2lmIDAKLSNkZWZpbmUgSVJRX1BMTF9XQUtFVVAJMHgwMDAwMDAwMQkvKiBQTEwgV2FrZXVwIEludGVycnVwdAkJCSAJCQkJCSovCi0KLSNkZWZpbmUgSVJRX0VSUk9SMSAgICAgIDB4MDAwMDAwMDIgIC8qIEVycm9yIEludGVycnVwdCAoRE1BLCBETUFSeCBCbG9jaywgRE1BUnggT3ZlcmZsb3cpICovCi0jZGVmaW5lIElSUV9FUlJPUjIgICAgICAweDAwMDAwMDA0ICAvKiBFcnJvciBJbnRlcnJ1cHQgKENBTiwgRXRoZXJuZXQsIFNQT1JUeCwgUFBJLCBTUEksIFVBUlR4KSAqLwotI2RlZmluZSBJUlFfUlRDCQkJMHgwMDAwMDAwOAkvKiBSZWFsIFRpbWUgQ2xvY2sgSW50ZXJydXB0IAkJCQkJCSovCi0jZGVmaW5lIElSUV9ETUEwCQkweDAwMDAwMDEwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IAkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTMJCTB4MDAwMDAwMjAJLyogRE1BIENoYW5uZWwgMyAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUE0CQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDQgKFNQT1JUMCBUWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BNQkJMHgwMDAwMDA4MAkvKiBETUEgQ2hhbm5lbCA1IChTUE9SVDEgUlgpIEludGVycnVwdCAJCQkJKi8KLQotI2RlZmluZSBJUlFfRE1BNgkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCA2IChTUE9SVDEgVFgpIEludGVycnVwdCAJCSAJCSovCi0jZGVmaW5lIElSUV9UV0kJCQkweDAwMDAwMjAwCS8qIFRXSSBJbnRlcnJ1cHQJCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BNwkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCA3IChTUEkpIEludGVycnVwdCAJCQkJCSovCi0jZGVmaW5lIElSUV9ETUE4CQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDggKFVBUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUE5CQkweDAwMDAxMDAwCS8qIERNQSBDaGFubmVsIDkgKFVBUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUExMAkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCAxMCAoVUFSVDEgUlgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTExCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDExIChVQVJUMSBUWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfQ0FOX1JYCQkweDAwMDA4MDAwCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCAJCQkJCQkJKi8KLQotI2RlZmluZSBJUlFfQ0FOX1RYCQkweDAwMDEwMDAwCS8qIENBTiBUcmFuc21pdCBJbnRlcnJ1cHQgIAkJCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMQkJMHgwMDAyMDAwMAkvKiBETUEgQ2hhbm5lbCAxIChFdGhlcm5ldCBSWCkgSW50ZXJydXB0IAkJCSovCi0jZGVmaW5lIElSUV9QRkFfUE9SVEgJMHgwMDAyMDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBBIAkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTIJCTB4MDAwNDAwMDAJLyogRE1BIENoYW5uZWwgMiAoRXRoZXJuZXQgVFgpIEludGVycnVwdCAJCQkqLwotI2RlZmluZSBJUlFfUEZCX1BPUlRICTB4MDAwNDAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQiAJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjAJCTB4MDAwODAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjEJCTB4MDAxMDAwMDAJLyogVGltZXIgMSBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVIyCQkweDAwMjAwMDAwCS8qIFRpbWVyIDIgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMwkJMHgwMDQwMDAwMAkvKiBUaW1lciAzIEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjQJCTB4MDA4MDAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotCi0jZGVmaW5lIElSUV9USU1FUjUJCTB4MDEwMDAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVI2CQkweDAyMDAwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSNwkJMHgwNDAwMDAwMAkvKiBUaW1lciA3IEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9QRkFfUE9SVEZHCTB4MDgwMDAwMDAJLyogUEYgUG9ydHMgRiZHIChQRjMxOjApIEludGVycnVwdCBBIAkJCQkqLwotI2RlZmluZSBJUlFfUEZCX1BPUlRGCTB4ODAwMDAwMDAJLyogUEYgUG9ydCBGIChQRjE1OjApIEludGVycnVwdCBCIAkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTEyCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMiAoTURNQTEgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLwotI2RlZmluZSBJUlFfRE1BMTMJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEzIChNRE1BMSBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9ETUExNAkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTQgKE1ETUEwIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KLSNkZWZpbmUgSVJRX0RNQTE1CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNSAoTURNQTAgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLwotI2RlZmluZSBJUlFfV0RPRwkJMHg4MDAwMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9QRkJfUE9SVEcJMHgxMDAwMDAwMAkvKiBQRiBQb3J0IEcgKFBGMzE6MTYpIEludGVycnVwdCBCIAkJCQkJKi8KLSNlbmRpZgotCi0vKiBTSUNfSUFSMCBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQMF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMwIGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxIGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyIGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMzIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICM0IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICM1IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICM2IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICM3IGFzc2lnbmVkIElWRyAjeAkqLwotCi0vKiBTSUNfSUFSMSBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQOF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICM4IGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICM5IGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDEwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTAgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzExIGFzc2lnbmVkIElWRyAjeCAJKi8KLSNkZWZpbmUgUDEyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzEyIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMTMgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMxNCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzE1IGFzc2lnbmVkIElWRyAjeAkqLwotCi0vKiBTSUNfSUFSMiBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQMTZfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMTYgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzE3IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMThfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxOCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTkgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyMCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzIxIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMjIgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMyMyBhc3NpZ25lZCBJVkcgI3gJKi8KLQotLyogU0lDX0lBUjMgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUDI0X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzI0IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMyNSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMjYgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzI3IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjhfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjggYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyOSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDMwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzMwIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMzFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMzEgYXNzaWduZWQgSVZHICN4CSovCi0KLQotLyogU0lDX0lNQVNLIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU0lDX1VOTUFTS19BTEwJMHgwMDAwMDAwMAkJCQkJLyogVW5tYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KLSNkZWZpbmUgU0lDX01BU0tfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIE1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLwotI2RlZmluZSBTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJCSovCi0jZGVmaW5lIFNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CSovCi0KLS8qIFNJQ19JV1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzCSovCi0jZGVmaW5lIElXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzCSovCi0jZGVmaW5lIElXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeAkJKi8KLSNkZWZpbmUgSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkgCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3gJCSovCi0KLQotLyogKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBVQVJUeF9MQ1IgTWFza3MJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBXTFMoeCkJCSgoKHgpLTUpICYgMHgwMykJLyogV29yZCBMZW5ndGggU2VsZWN0ICovCi0jZGVmaW5lIFNUQgkJCTB4MDQJCQkJLyogU3RvcCBCaXRzCQkJKi8KLSNkZWZpbmUgUEVOCQkJMHgwOAkJCQkvKiBQYXJpdHkgRW5hYmxlCQkqLwotI2RlZmluZSBFUFMJCQkweDEwCQkJCS8qIEV2ZW4gUGFyaXR5IFNlbGVjdAkqLwotI2RlZmluZSBTVFAJCQkweDIwCQkJCS8qIFN0aWNrIFBhcml0eQkJCSovCi0jZGVmaW5lIFNCCQkJMHg0MAkJCQkvKiBTZXQgQnJlYWsJCQkqLwotI2RlZmluZSBETEFCCQkweDgwCQkJCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzCSovCi0KLS8qIFVBUlR4X01DUiBNYXNrCQkJCQkJCQkJCSovCi0jZGVmaW5lIExPT1BfRU5BCTB4MTAJLyogTG9vcGJhY2sgTW9kZSBFbmFibGUgKi8KLSNkZWZpbmUgTE9PUF9FTkFfUAkweDA0Ci0KLS8qIFVBUlR4X0xTUiBNYXNrcwkJCQkJCQkJCQkqLwotI2RlZmluZSBEUgkJCTB4MDEJLyogRGF0YSBSZWFkeQkJCQkqLwotI2RlZmluZSBPRQkJCTB4MDIJLyogT3ZlcnJ1biBFcnJvcgkJCSovCi0jZGVmaW5lIFBFCQkJMHgwNAkvKiBQYXJpdHkgRXJyb3IJCQkJKi8KLSNkZWZpbmUgRkUJCQkweDA4CS8qIEZyYW1pbmcgRXJyb3IJCQkqLwotI2RlZmluZSBCSQkJCTB4MTAJLyogQnJlYWsgSW50ZXJydXB0CQkJKi8KLSNkZWZpbmUgVEhSRQkJMHgyMAkvKiBUSFIgRW1wdHkJCQkJKi8KLSNkZWZpbmUgVEVNVAkJMHg0MAkvKiBUU1IgYW5kIFVBUlRfVEhSIEVtcHR5CSovCi0KLS8qIFVBUlR4X0lFUiBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEVSQkZJCQkweDAxCQkvKiBFbmFibGUgUmVjZWl2ZSBCdWZmZXIgRnVsbCBJbnRlcnJ1cHQJCSovCi0jZGVmaW5lIEVUQkVJCQkweDAyCQkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5IEludGVycnVwdAkqLwotI2RlZmluZSBFTFNJCQkweDA0CQkvKiBFbmFibGUgUlggU3RhdHVzIEludGVycnVwdAkJCQkqLwotCi0vKiBVQVJUeF9JSVIgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIE5JTlQJCTB4MDEJCS8qIFBlbmRpbmcgSW50ZXJydXB0CQkJCQkqLwotI2RlZmluZSBJSVJfVFhfUkVBRFkgICAgMHgwMgkJLyogVUFSVF9USFIgZW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1JYX1JFQURZICAgIDB4MDQJCS8qIFJlY2VpdmUgZGF0YSByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElJUl9MSU5FX0NIQU5HRSAweDA2CQkvKiBSZWNlaXZlIGxpbmUgc3RhdHVzICAgIAkJCSovCi0jZGVmaW5lIElJUl9TVEFUVVMJMHgwNgkJLyogSGlnaGVzdCBQcmlvcml0eSBQZW5kaW5nIEludGVycnVwdAkqLwotCi0vKiBVQVJUeF9HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFVDRU4JCTB4MDEJCS8qIEVuYWJsZSBVQVJUeCBDbG9ja3MJCQkJKi8KLSNkZWZpbmUgSVJFTgkJMHgwMgkJLyogRW5hYmxlIElyREEgTW9kZQkJCQkJKi8KLSNkZWZpbmUgVFBPTEMJCTB4MDQJCS8qIElyREEgVFggUG9sYXJpdHkgQ2hhbmdlCQkJKi8KLSNkZWZpbmUgUlBPTEMJCTB4MDgJCS8qIElyREEgUlggUG9sYXJpdHkgQ2hhbmdlCQkJKi8KLSNkZWZpbmUgRlBFCQkJMHgxMAkJLyogRm9yY2UgUGFyaXR5IEVycm9yIE9uIFRyYW5zbWl0CSovCi0jZGVmaW5lIEZGRQkJCTB4MjAJCS8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQJKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKiAgR0VORVJBTCBQVVJQT1NFIFRJTUVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqLwotLyogVElNRVJfRU5BQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRJTUVOMAkJCTB4MDAwMQkJLyogRW5hYmxlIFRpbWVyIDAJCQkJCSovCi0jZGVmaW5lIFRJTUVOMQkJCTB4MDAwMgkJLyogRW5hYmxlIFRpbWVyIDEJCQkJCSovCi0jZGVmaW5lIFRJTUVOMgkJCTB4MDAwNAkJLyogRW5hYmxlIFRpbWVyIDIJCQkJCSovCi0jZGVmaW5lIFRJTUVOMwkJCTB4MDAwOAkJLyogRW5hYmxlIFRpbWVyIDMJCQkJCSovCi0jZGVmaW5lIFRJTUVONAkJCTB4MDAxMAkJLyogRW5hYmxlIFRpbWVyIDQJCQkJCSovCi0jZGVmaW5lIFRJTUVONQkJCTB4MDAyMAkJLyogRW5hYmxlIFRpbWVyIDUJCQkJCSovCi0jZGVmaW5lIFRJTUVONgkJCTB4MDA0MAkJLyogRW5hYmxlIFRpbWVyIDYJCQkJCSovCi0jZGVmaW5lIFRJTUVONwkJCTB4MDA4MAkJLyogRW5hYmxlIFRpbWVyIDcJCQkJCSovCi0KLS8qIFRJTUVSX0RJU0FCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNRElTMAkJCVRJTUVOMAkJLyogRGlzYWJsZSBUaW1lciAwCQkJCQkqLwotI2RlZmluZSBUSU1ESVMxCQkJVElNRU4xCQkvKiBEaXNhYmxlIFRpbWVyIDEJCQkJCSovCi0jZGVmaW5lIFRJTURJUzIJCQlUSU1FTjIJCS8qIERpc2FibGUgVGltZXIgMgkJCQkJKi8KLSNkZWZpbmUgVElNRElTMwkJCVRJTUVOMwkJLyogRGlzYWJsZSBUaW1lciAzCQkJCQkqLwotI2RlZmluZSBUSU1ESVM0CQkJVElNRU40CQkvKiBEaXNhYmxlIFRpbWVyIDQJCQkJCSovCi0jZGVmaW5lIFRJTURJUzUJCQlUSU1FTjUJCS8qIERpc2FibGUgVGltZXIgNQkJCQkJKi8KLSNkZWZpbmUgVElNRElTNgkJCVRJTUVONgkJLyogRGlzYWJsZSBUaW1lciA2CQkJCQkqLwotI2RlZmluZSBUSU1ESVM3CQkJVElNRU43CQkvKiBEaXNhYmxlIFRpbWVyIDcJCQkJCSovCi0KLS8qIFRJTUVSX1NUQVRVUyBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBUSU1JTDAJCQkweDAwMDAwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMMQkJCTB4MDAwMDAwMDIJLyogVGltZXIgMSBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUwyCQkJMHgwMDAwMDAwNAkvKiBUaW1lciAyIEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDMJCQkweDAwMDAwMDA4CS8qIFRpbWVyIDMgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRPVkZfRVJSMAkJMHgwMDAwMDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjEJCTB4MDAwMDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIyCQkweDAwMDAwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSMwkJMHgwMDAwMDA4MAkvKiBUaW1lciAzIENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUUlVOMAkJCTB4MDAwMDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVOMQkJCTB4MDAwMDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVOMgkJCTB4MDAwMDQwMDAJLyogVGltZXIgMiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVOMwkJCTB4MDAwMDgwMDAJLyogVGltZXIgMyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUSU1JTDQJCQkweDAwMDEwMDAwCS8qIFRpbWVyIDQgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMNQkJCTB4MDAwMjAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUw2CQkJMHgwMDA0MDAwMAkvKiBUaW1lciA2IEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDcJCQkweDAwMDgwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRPVkZfRVJSNAkJMHgwMDEwMDAwMAkvKiBUaW1lciA0IENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjUJCTB4MDAyMDAwMDAJLyogVGltZXIgNSBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI2CQkweDAwNDAwMDAwCS8qIFRpbWVyIDYgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSNwkJMHgwMDgwMDAwMAkvKiBUaW1lciA3IENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUUlVONAkJCTB4MTAwMDAwMDAJLyogVGltZXIgNCBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVONQkJCTB4MjAwMDAwMDAJLyogVGltZXIgNSBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVONgkJCTB4NDAwMDAwMDAJLyogVGltZXIgNiBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotI2RlZmluZSBUUlVONwkJCTB4ODAwMDAwMDAJLyogVGltZXIgNyBTbGF2ZSBFbmFibGUgU3RhdHVzCQkqLwotCi0vKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgVE9WTF9FUlIwIFRPVkZfRVJSMAotI2RlZmluZSBUT1ZMX0VSUjEgVE9WRl9FUlIxCi0jZGVmaW5lIFRPVkxfRVJSMiBUT1ZGX0VSUjIKLSNkZWZpbmUgVE9WTF9FUlIzIFRPVkZfRVJSMwotI2RlZmluZSBUT1ZMX0VSUjQgVE9WRl9FUlI0Ci0jZGVmaW5lIFRPVkxfRVJSNSBUT1ZGX0VSUjUKLSNkZWZpbmUgVE9WTF9FUlI2IFRPVkZfRVJSNgotI2RlZmluZSBUT1ZMX0VSUjcgVE9WRl9FUlI3Ci0KLS8qIFRJTUVSeF9DT05GSUcgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUFdNX09VVAkJCTB4MDAwMQkvKiBQdWxzZS1XaWR0aCBNb2R1bGF0aW9uIE91dHB1dCBNb2RlCSovCi0jZGVmaW5lIFdEVEhfQ0FQCQkweDAwMDIJLyogV2lkdGggQ2FwdHVyZSBJbnB1dCBNb2RlCQkJCSovCi0jZGVmaW5lIEVYVF9DTEsJCQkweDAwMDMJLyogRXh0ZXJuYWwgQ2xvY2sgTW9kZQkJCQkJKi8KLSNkZWZpbmUgUFVMU0VfSEkJCTB4MDAwNAkvKiBBY3Rpb24gUHVsc2UgKFBvc2l0aXZlL05lZ2F0aXZlKikJKi8KLSNkZWZpbmUgUEVSSU9EX0NOVAkJMHgwMDA4CS8qIFBlcmlvZCBDb3VudAkJCQkJCQkqLwotI2RlZmluZSBJUlFfRU5BCQkJMHgwMDEwCS8qIEludGVycnVwdCBSZXF1ZXN0IEVuYWJsZQkJCQkqLwotI2RlZmluZSBUSU5fU0VMCQkJMHgwMDIwCS8qIFRpbWVyIElucHV0IFNlbGVjdAkJCQkJKi8KLSNkZWZpbmUgT1VUX0RJUwkJCTB4MDA0MAkvKiBPdXRwdXQgUGFkIERpc2FibGUJCQkJCSovCi0jZGVmaW5lIENMS19TRUwJCQkweDAwODAJLyogVGltZXIgQ2xvY2sgU2VsZWN0CQkJCQkqLwotI2RlZmluZSBUT0dHTEVfSEkJCTB4MDEwMAkvKiBQV01fT1VUIFBVTFNFX0hJIFRvZ2dsZSBNb2RlCQkJKi8KLSNkZWZpbmUgRU1VX1JVTgkJCTB4MDIwMAkvKiBFbXVsYXRpb24gQmVoYXZpb3IgU2VsZWN0CQkJKi8KLSNkZWZpbmUgRVJSX1RZUAkJCTB4QzAwMAkvKiBFcnJvciBUeXBlCQkJCQkJCSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqICAgR1BJTyBQT1JUUyBGLCBHLCBIIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAgTWFza3MgCQkJCSovCi0vKiBQb3J0IEYgTWFza3MgCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQRjAJCTB4MDAwMQotI2RlZmluZSBQRjEJCTB4MDAwMgotI2RlZmluZSBQRjIJCTB4MDAwNAotI2RlZmluZSBQRjMJCTB4MDAwOAotI2RlZmluZSBQRjQJCTB4MDAxMAotI2RlZmluZSBQRjUJCTB4MDAyMAotI2RlZmluZSBQRjYJCTB4MDA0MAotI2RlZmluZSBQRjcJCTB4MDA4MAotI2RlZmluZSBQRjgJCTB4MDEwMAotI2RlZmluZSBQRjkJCTB4MDIwMAotI2RlZmluZSBQRjEwCTB4MDQwMAotI2RlZmluZSBQRjExCTB4MDgwMAotI2RlZmluZSBQRjEyCTB4MTAwMAotI2RlZmluZSBQRjEzCTB4MjAwMAotI2RlZmluZSBQRjE0CTB4NDAwMAotI2RlZmluZSBQRjE1CTB4ODAwMAotCi0vKiBQb3J0IEcgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQRzAJCTB4MDAwMQotI2RlZmluZSBQRzEJCTB4MDAwMgotI2RlZmluZSBQRzIJCTB4MDAwNAotI2RlZmluZSBQRzMJCTB4MDAwOAotI2RlZmluZSBQRzQJCTB4MDAxMAotI2RlZmluZSBQRzUJCTB4MDAyMAotI2RlZmluZSBQRzYJCTB4MDA0MAotI2RlZmluZSBQRzcJCTB4MDA4MAotI2RlZmluZSBQRzgJCTB4MDEwMAotI2RlZmluZSBQRzkJCTB4MDIwMAotI2RlZmluZSBQRzEwCTB4MDQwMAotI2RlZmluZSBQRzExCTB4MDgwMAotI2RlZmluZSBQRzEyCTB4MTAwMAotI2RlZmluZSBQRzEzCTB4MjAwMAotI2RlZmluZSBQRzE0CTB4NDAwMAotI2RlZmluZSBQRzE1CTB4ODAwMAotCi0vKiBQb3J0IEggTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQSDAJCTB4MDAwMQotI2RlZmluZSBQSDEJCTB4MDAwMgotI2RlZmluZSBQSDIJCTB4MDAwNAotI2RlZmluZSBQSDMJCTB4MDAwOAotI2RlZmluZSBQSDQJCTB4MDAxMAotI2RlZmluZSBQSDUJCTB4MDAyMAotI2RlZmluZSBQSDYJCTB4MDA0MAotI2RlZmluZSBQSDcJCTB4MDA4MAotI2RlZmluZSBQSDgJCTB4MDEwMAotI2RlZmluZSBQSDkJCTB4MDIwMAotI2RlZmluZSBQSDEwCTB4MDQwMAotI2RlZmluZSBQSDExCTB4MDgwMAotI2RlZmluZSBQSDEyCTB4MTAwMAotI2RlZmluZSBQSDEzCTB4MjAwMAotI2RlZmluZSBQSDE0CTB4NDAwMAotI2RlZmluZSBQSDE1CTB4ODAwMAotCi0vKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVCSVVfQU1HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBBTUNLRU4JCQkweDAwMDEJCS8qIEVuYWJsZSBDTEtPVVQJCQkJCQkJCQkqLwotI2RlZmluZQlBTUJFTl9OT05FCQkweDAwMDAJCS8qIEFsbCBCYW5rcyBEaXNhYmxlZAkJCQkJCQkJKi8KLSNkZWZpbmUgQU1CRU5fQjAJCTB4MDAwMgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rIDAgb25seQkJCQkJKi8KLSNkZWZpbmUgQU1CRU5fQjBfQjEJCTB4MDAwNAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwICYgMSBvbmx5CQkJCSovCi0jZGVmaW5lIEFNQkVOX0IwX0IxX0IyCTB4MDAwNgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMgkJCSovCi0jZGVmaW5lIEFNQkVOX0FMTAkJMHgwMDA4CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsIDIsIGFuZCAzCSovCi0KLS8qIEVCSVVfQU1CQ1RMMCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCAoQjApIFJEWSBFbmFibGUJCQkJCQkJKi8KLSNkZWZpbmUgQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIwIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KLSNkZWZpbmUgQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjBUVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCi0jZGVmaW5lIEIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLwotI2RlZmluZSBCMFNUXzMJCQkweDAwMDAwMDMwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCi0jZGVmaW5lIEIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLwotI2RlZmluZSBCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLQotI2RlZmluZSBCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIChCMSkgUkRZIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgCSovCi0jZGVmaW5lIEIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMSBSRFkgQWN0aXZlIEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAJKi8KLSNkZWZpbmUgQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUgCSovCi0jZGVmaW5lIEIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjFUVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCi0jZGVmaW5lIEIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUgIAkqLwotI2RlZmluZSBCMVNUXzIJCQkweDAwMjAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcyAJKi8KLSNkZWZpbmUgQjFTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMgCSovCi0jZGVmaW5lIEIxU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzIAkqLwotI2RlZmluZSBCMUhUXzEJCQkweDAwNDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZSAJKi8KLSNkZWZpbmUgQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KLSNkZWZpbmUgQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0KLS8qIEVCSVVfQU1CQ1RMMSBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQjJSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMiAoQjIpIFJEWSBFbmFibGUJCQkJCQkJKi8KLSNkZWZpbmUgQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIyIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KLSNkZWZpbmUgQjJUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIyVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCi0jZGVmaW5lIEIyU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIyU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLwotI2RlZmluZSBCMlNUXzMJCQkweDAwMDAwMDMwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjJTVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCi0jZGVmaW5lIEIySFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLwotI2RlZmluZSBCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLQotI2RlZmluZSBCM1JEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAzIChCMykgUkRZIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjMgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLwotI2RlZmluZSBCM1RUXzEJCQkweDAwMDQwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjNUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjNTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjNTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCi0jZGVmaW5lIEIzU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLwotI2RlZmluZSBCM1NUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjNIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIzUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF80CQkJMHg0MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF83CQkJMHg3MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFQklVX1NER0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBTQ1RMRQkJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFNEUkFNIFNpZ25hbHMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQ0xfMgkJCTB4MDAwMDAwMDgJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAyIGN5Y2xlcwkJCQkJCQkJKi8KLSNkZWZpbmUgQ0xfMwkJCTB4MDAwMDAwMEMJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAzIGN5Y2xlcwkJCQkJCQkJKi8KLSNkZWZpbmUgUEFTUl9BTEwJCTB4MDAwMDAwMDAJLyogQWxsIDQgU0RSQU0gQmFua3MgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCQkqLwotI2RlZmluZSBQQVNSX0IwX0IxCQkweDAwMDAwMDEwCS8qIFNEUkFNIEJhbmtzIDAgYW5kIDEgQXJlIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCSovCi0jZGVmaW5lIFBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkgU0RSQU0gQmFuayAwIElzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkqLwotI2RlZmluZSBUUkFTXzEJCQkweDAwMDAwMDQwCS8qIFNEUkFNIHRSQVMgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMgkJCTB4MDAwMDAwODAJLyogU0RSQU0gdFJBUyA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18zCQkJMHgwMDAwMDBDMAkvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzQJCQkweDAwMDAwMTAwCS8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNQkJCTB4MDAwMDAxNDAJLyogU0RSQU0gdFJBUyA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU182CQkJMHgwMDAwMDE4MAkvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzcJCQkweDAwMDAwMUMwCS8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfOAkJCTB4MDAwMDAyMDAJLyogU0RSQU0gdFJBUyA9IDggY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU185CQkJMHgwMDAwMDI0MAkvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzEwCQkJMHgwMDAwMDI4MAkvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xMQkJCTB4MDAwMDAyQzAJLyogU0RSQU0gdFJBUyA9IDExIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTIJCQkweDAwMDAwMzAwCS8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzEzCQkJMHgwMDAwMDM0MAkvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xNAkJCTB4MDAwMDAzODAJLyogU0RSQU0gdFJBUyA9IDE0IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTUJCQkweDAwMDAwM0MwCS8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfMQkJCTB4MDAwMDA4MDAJLyogU0RSQU0gdFJQID0gMSBjeWNsZQkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfMgkJCTB4MDAwMDEwMDAJLyogU0RSQU0gdFJQID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzMJCQkweDAwMDAxODAwCS8qIFNEUkFNIHRSUCA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF80CQkJMHgwMDAwMjAwMAkvKiBTRFJBTSB0UlAgPSA0IGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfNQkJCTB4MDAwMDI4MDAJLyogU0RSQU0gdFJQID0gNSBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzYJCQkweDAwMDAzMDAwCS8qIFNEUkFNIHRSUCA9IDYgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF83CQkJMHgwMDAwMzgwMAkvKiBTRFJBTSB0UlAgPSA3IGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzEJCQkweDAwMDA4MDAwCS8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfMgkJCTB4MDAwMTAwMDAJLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF8zCQkJMHgwMDAxODAwMAkvKiBTRFJBTSB0UkNEID0gMyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzQJCQkweDAwMDIwMDAwCS8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNQkJCTB4MDAwMjgwMDAJLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF82CQkJMHgwMDAzMDAwMAkvKiBTRFJBTSB0UkNEID0gNiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzcJCQkweDAwMDM4MDAwCS8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRXUl8xCQkJMHgwMDA4MDAwMAkvKiBTRFJBTSB0V1IgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRXUl8yCQkJMHgwMDEwMDAwMAkvKiBTRFJBTSB0V1IgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUV1JfMwkJCTB4MDAxODAwMDAJLyogU0RSQU0gdFdSID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUFVQU0QJCQkweDAwMjAwMDAwCS8qIFBvd2VyLVVwIFN0YXJ0IERlbGF5ICgxNSBTQ0xLIEN5Y2xlcyBEZWxheSkJCQkJKi8KLSNkZWZpbmUgUFNNCQkJCTB4MDA0MDAwMDAJLyogUG93ZXItVXAgU2VxdWVuY2UgKE1vZGUgUmVnaXN0ZXIgQmVmb3JlL0FmdGVyKiBSZWZyZXNoKQkqLwotI2RlZmluZSBQU1MJCQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgUG93ZXItVXAgU2VxdWVuY2Ugb24gTmV4dCBTRFJBTSBBY2Nlc3MJCQkqLwotI2RlZmluZSBTUkZTCQkJMHgwMTAwMDAwMAkvKiBFbmFibGUgU0RSQU0gU2VsZi1SZWZyZXNoIE1vZGUJCQkJCQkJKi8KLSNkZWZpbmUgRUJVRkUJCQkweDAyMDAwMDAwCS8qIEVuYWJsZSBFeHRlcm5hbCBCdWZmZXJpbmcgVGltaW5nCQkJCQkJCSovCi0jZGVmaW5lIEZCQlJXCQkJMHgwNDAwMDAwMAkvKiBFbmFibGUgRmFzdCBCYWNrLVRvLUJhY2sgUmVhZCBUbyBXcml0ZQkJCQkJKi8KLSNkZWZpbmUgRU1SRU4JCQkweDEwMDAwMDAwCS8qIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgRW5hYmxlCQkJCQkJCSovCi0jZGVmaW5lIFRDU1IJCQkweDIwMDAwMDAwCS8qIFRlbXAtQ29tcGVuc2F0ZWQgU2VsZi1SZWZyZXNoIFZhbHVlICg4NS80NSogRGVnIEMpCQkqLwotI2RlZmluZSBDRERCRwkJCTB4NDAwMDAwMDAJLyogVHJpc3RhdGUgU0RSQU0gQ29udHJvbHMgRHVyaW5nIEJ1cyBHcmFudAkJCQkJKi8KLQotLyogRUJJVV9TREJDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBFQkUJCQkJMHgwMDAxCQkvKiBFbmFibGUgU0RSQU0gRXh0ZXJuYWwgQmFuawkJCQkJCQkqLwotI2RlZmluZSBFQlNaXzE2CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxNk1CCSovCi0jZGVmaW5lIEVCU1pfMzIJCQkweDAwMDIJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDMyTUIJKi8KLSNkZWZpbmUgRUJTWl82NAkJCTB4MDAwNAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNjRNQgkqLwotI2RlZmluZSBFQlNaXzEyOAkJMHgwMDA2CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxMjhNQgkJKi8KLSNkZWZpbmUgRUJTWl8yNTYJCTB4MDAwOAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgCSovCi0jZGVmaW5lIEVCU1pfNTEyCQkweDAwMEEJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CCQkqLwotI2RlZmluZSBFQkNBV184CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOCBCaXRzCSovCi0jZGVmaW5lIEVCQ0FXXzkJCQkweDAwMTAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA5IEJpdHMJKi8KLSNkZWZpbmUgRUJDQVdfMTAJCTB4MDAyMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDEwIEJpdHMJKi8KLSNkZWZpbmUgRUJDQVdfMTEJCTB4MDAzMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDExIEJpdHMJKi8KLQotLyogRUJJVV9TRFNUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNEQ0kJCQkweDAwMDEJCS8qIFNEUkFNIENvbnRyb2xsZXIgSWRsZSAJCQkJKi8KLSNkZWZpbmUgU0RTUkEJCQkweDAwMDIJCS8qIFNEUkFNIFNlbGYtUmVmcmVzaCBBY3RpdmUJCQkqLwotI2RlZmluZSBTRFBVQQkJCTB4MDAwNAkJLyogU0RSQU0gUG93ZXItVXAgQWN0aXZlIAkJCQkqLwotI2RlZmluZSBTRFJTCQkJMHgwMDA4CQkvKiBTRFJBTSBXaWxsIFBvd2VyLVVwIE9uIE5leHQgQWNjZXNzCSovCi0jZGVmaW5lIFNERUFTRQkJCTB4MDAxMAkJLyogU0RSQU0gRUFCIFN0aWNreSBFcnJvciBTdGF0dXMJCSovCi0jZGVmaW5lIEJHU1RBVAkJCTB4MDAyMAkJLyogQnVzIEdyYW50IFN0YXR1cwkJCQkJCSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRE1BeF9QRVJJUEhFUkFMX01BUCwgTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcwkJCQkJCQkJKi8KLSNkZWZpbmUgQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKE1lbW9yeS9QZXJpcGhlcmFsKikJKi8KLSNkZWZpbmUgUE1BUAkJCTB4RjAwMAkvKiBQZXJpcGhlcmFsIE1hcHBlZCBUbyBUaGlzIENoYW5uZWwJCQkJKi8KLSNkZWZpbmUgUE1BUF9QUEkJCTB4MDAwMAkvKiAJCVBQSSBQb3J0IERNQQkJCQkJCQkJKi8KLSNkZWZpbmUJUE1BUF9FTUFDUlgJCTB4MTAwMAkvKiAJCUV0aGVybmV0IFJlY2VpdmUgRE1BCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9FTUFDVFgJCTB4MjAwMAkvKiAJCUV0aGVybmV0IFRyYW5zbWl0IERNQQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQwUlgJMHgzMDAwCS8qIAkJU1BPUlQwIFJlY2VpdmUgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQwVFgJMHg0MDAwCS8qIAkJU1BPUlQwIFRyYW5zbWl0IERNQQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQT1JUMVJYCTB4NTAwMAkvKiAJCVNQT1JUMSBSZWNlaXZlIERNQQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQT1JUMVRYCTB4NjAwMAkvKiAJCVNQT1JUMSBUcmFuc21pdCBETUEJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUEkJCTB4NzAwMAkvKiAJCVNQSSBQb3J0IERNQQkJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9VQVJUMFJYCTB4ODAwMAkvKiAJCVVBUlQwIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLwotI2RlZmluZSBQTUFQX1VBUlQwVFgJMHg5MDAwCS8qIAkJVUFSVDAgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLwotI2RlZmluZQlQTUFQX1VBUlQxUlgJMHhBMDAwCS8qIAkJVUFSVDEgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCi0jZGVmaW5lCVBNQVBfVUFSVDFUWAkweEIwMDAJLyogCQlVQVJUMSBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCi0KLS8qICAqKioqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKiovCi0vKiAgUFBJX0NPTlRST0wgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVF9FTgkJCTB4MDAwMQkJLyogUFBJIFBvcnQgRW5hYmxlCQkJCQkqLwotI2RlZmluZSBQT1JUX0RJUgkJMHgwMDAyCQkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JCQkJKi8KLSNkZWZpbmUgWEZSX1RZUEUJCTB4MDAwQwkJLyogUFBJIFRyYW5zZmVyIFR5cGUJCQkJKi8KLSNkZWZpbmUgUE9SVF9DRkcJCTB4MDAzMAkJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbgkJCSovCi0jZGVmaW5lIEZMRF9TRUwJCQkweDAwNDAJCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0CQkJKi8KLSNkZWZpbmUgUEFDS19FTgkJCTB4MDA4MAkJLyogUFBJIFBhY2tpbmcgTW9kZQkJCQkJKi8KLSNkZWZpbmUgRE1BMzIJCQkweDAxMDAJCS8qIFBQSSAzMi1iaXQgRE1BIEVuYWJsZQkJCSovCi0jZGVmaW5lIFNLSVBfRU4JCQkweDAyMDAJCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlCQkJKi8KLSNkZWZpbmUgU0tJUF9FTwkJCTB4MDQwMAkJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMJCSovCi0jZGVmaW5lIERMRU5fOAkJCTB4MDAwMAkJLyogRGF0YSBMZW5ndGggPSA4IEJpdHMJCQkJKi8KLSNkZWZpbmUgRExFTl8xMAkJCTB4MDgwMAkJLyogRGF0YSBMZW5ndGggPSAxMCBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xMQkJCTB4MTAwMAkJLyogRGF0YSBMZW5ndGggPSAxMSBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xMgkJCTB4MTgwMAkJLyogRGF0YSBMZW5ndGggPSAxMiBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xMwkJCTB4MjAwMAkJLyogRGF0YSBMZW5ndGggPSAxMyBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xNAkJCTB4MjgwMAkJLyogRGF0YSBMZW5ndGggPSAxNCBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xNQkJCTB4MzAwMAkJLyogRGF0YSBMZW5ndGggPSAxNSBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTl8xNgkJCTB4MzgwMAkJLyogRGF0YSBMZW5ndGggPSAxNiBCaXRzCQkJKi8KLSNkZWZpbmUgRExFTkdUSAkJCTB4MzgwMAkJLyogUFBJIERhdGEgTGVuZ3RoICAqLwotI2RlZmluZSBQT0xDCQkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkJCQkJKi8KLSNkZWZpbmUgUE9MUwkJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkJCQkqLwotCi0vKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBGTEQJCQkJMHgwNDAwCQkvKiBGaWVsZCBJbmRpY2F0b3IJCQkJCSovCi0jZGVmaW5lIEZUX0VSUgkJCTB4MDgwMAkJLyogRnJhbWUgVHJhY2sgRXJyb3IJCQkJKi8KLSNkZWZpbmUgT1ZSCQkJCTB4MTAwMAkJLyogRklGTyBPdmVyZmxvdyBFcnJvcgkJCQkqLwotI2RlZmluZSBVTkRSCQkJMHgyMDAwCQkvKiBGSUZPIFVuZGVycnVuIEVycm9yCQkJCSovCi0jZGVmaW5lIEVSUl9ERVQJCQkweDQwMDAJCS8qIEVycm9yIERldGVjdGVkIEluZGljYXRvcgkJCSovCi0jZGVmaW5lIEVSUl9OQ09SCQkweDgwMDAJCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yCSovCi0KLQotLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogVFdJX0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0lfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOyAgKQkJCQkqLwotI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkYpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93CQkJKi8KLSNkZWZpbmUgQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdwkJCSovCi0KLS8qIFRXSV9QUkVTQ0FMRSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVBSRVNDQUxFCTB4MDA3RgkJLyogU0NMS3MgUGVyIEludGVybmFsIFRpbWUgUmVmZXJlbmNlICgxME1IeikJKi8KLSNkZWZpbmUJVFdJX0VOQQkJMHgwMDgwCQkvKiBUV0kgRW5hYmxlCQkJCQkJCQkJKi8KLSNkZWZpbmUJU0NDQgkJMHgwMjAwCQkvKiBTQ0NCIENvbXBhdGliaWxpdHkgRW5hYmxlCQkJCQkqLwotCi0vKiBUV0lfU0xBVkVfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCQkJCQkJCQkqLwotI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCQkJCQkJCSovCi0jZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkCQkJCQkqLwotI2RlZmluZQlOQUsJCQkweDAwMDgJCS8qIE5BSy9BQ0sqIEdlbmVyYXRlZCBBdCBDb25jbHVzaW9uIE9mIFRyYW5zZmVyICovCi0jZGVmaW5lCUdFTgkJCTB4MDAxMAkJLyogR2VuZXJhbCBDYWxsIEFkcnJlc3MgTWF0Y2hpbmcgRW5hYmxlZAkJKi8KLQotLyogVFdJX1NMQVZFX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlTRElSCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIERpcmVjdGlvbiAoVHJhbnNtaXQvUmVjZWl2ZSopCSovCi0jZGVmaW5lIEdDQUxMCQkweDAwMDIJCS8qIEdlbmVyYWwgQ2FsbCBJbmRpY2F0b3IJCQkJCQkqLwotCi0vKiBUV0lfTUFTVEVSX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlNRU4JCQkweDAwMDEJCS8qIE1hc3RlciBNb2RlIEVuYWJsZQkJCQkJCSovCi0jZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoCQkJCQkqLwotI2RlZmluZQlNRElSCQkweDAwMDQJCS8qIE1hc3RlciBUcmFuc21pdCBEaXJlY3Rpb24gKFJYL1RYKikJCSovCi0jZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcgU3BlY3MJCQkJKi8KLSNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbgkJCQkJCSovCi0jZGVmaW5lCVJTVEFSVAkJMHgwMDIwCQkvKiBSZXBlYXQgU3RhcnQgb3IgU3RvcCogQXQgRW5kIE9mIFRyYW5zZmVyCSovCi0jZGVmaW5lCURDTlQJCTB4M0ZDMAkJLyogRGF0YSBCeXRlcyBUbyBUcmFuc2ZlcgkJCQkJKi8KLSNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlCQkJCQkJKi8KLSNkZWZpbmUJU0NMT1ZSCQkweDgwMDAJCS8qIFNlcmlhbCBDbG9jayBPdmVycmlkZQkJCQkJKi8KLQotLyogVFdJX01BU1RFUl9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlNUFJPRwkJMHgwMDAxCQkvKiBNYXN0ZXIgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MJCQkJCSovCi0jZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdCBBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkJKi8KLSNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLwotI2RlZmluZQlETkFLCQkweDAwMDgJCS8qIERhdGEgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCi0jZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IJCQkJCQkJKi8KLSNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUgRXJyb3IJCQkJCQkJKi8KLSNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlCQkJCQkJCSovCi0jZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sgU2Vuc2UJCQkJCQkJKi8KLSNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IJCQkJCQkJKi8KLQotLyogVFdJX0lOVF9TUkMgYW5kIFRXSV9JTlRfRU5BQkxFIE1hc2tzCQkJCQkJKi8KLSNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkCSovCi0jZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlCSovCi0jZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IJCSovCi0jZGVmaW5lCVNPVkYJCTB4MDAwOAkJLyogU2xhdmUgT3ZlcmZsb3cJCQkqLwotI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUJKi8KLSNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IJKi8KLSNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UJKi8KLSNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8gU2VydmljZQkJKi8KLQotLyogVFdJX0ZJRk9fQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoCQkJKi8KLSNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaAkJCQkqLwotI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLwotI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCi0KLS8qIFRXSV9GSUZPX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlYTVRTVEFUCQkweDAwMDMJCS8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzCQkJCQkJCSovCi0jZGVmaW5lCVhNVF9FTVBUWQkweDAwMDAJCS8qIAkJVHJhbnNtaXQgRklGTyBFbXB0eQkJCQkJCSovCi0jZGVmaW5lCVhNVF9IQUxGCTB4MDAwMQkJLyogCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUJCSovCi0jZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyogCQlUcmFuc21pdCBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gV3JpdGUpCSovCi0KLSNkZWZpbmUJUkNWU1RBVAkJMHgwMDBDCQkvKiBSZWNlaXZlIEZJRk8gU3RhdHVzCQkJCQkJCSovCi0jZGVmaW5lCVJDVl9FTVBUWQkweDAwMDAJCS8qIAkJUmVjZWl2ZSBGSUZPIEVtcHR5CQkJCQkJKi8KLSNkZWZpbmUJUkNWX0hBTEYJMHgwMDA0CQkvKiAJCVJlY2VpdmUgRklGTyBIYXMgMSBCeXRlIFRvIFJlYWQJCQkqLwotI2RlZmluZQlSQ1ZfRlVMTAkweDAwMEMJCS8qIAkJUmVjZWl2ZSBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkJCSovCi0KLQotLyogT21pdCBDQU4gbWFza3MgZnJvbSBkZWZCRjUzNC5oICovCi0KLS8qICAqKioqKioqKioqKioqKioqKioqICBQSU4gQ09OVFJPTCBSRUdJU1RFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUE9SVF9NVVggTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlQSlNFCQkJMHgwMDAxCQkJLyogUG9ydCBKIFNQSS9TUE9SVCBFbmFibGUJCQkqLwotI2RlZmluZQlQSlNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBURlMwL0RUMFBSSQkJCSovCi0jZGVmaW5lCVBKU0VfU1BJCQkweDAwMDEJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDM6MgkJCSovCi0KLSNkZWZpbmUJUEpDRSh4KQkJCSgoKHgpJjB4Myk8PDEpCS8qIFBvcnQgSiBDQU4vU1BJL1NQT1JUIEVuYWJsZQkJKi8KLSNkZWZpbmUJUEpDRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgRFIwU0VDL0RUMFNFQwkJKi8KLSNkZWZpbmUJUEpDRV9DQU4JCTB4MDAwMgkJCS8qIAkJRW5hYmxlIENBTiBSWC9UWAkJCSovCi0jZGVmaW5lCVBKQ0VfU1BJCQkweDAwMDQJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDcJCQkqLwotCi0jZGVmaW5lCVBGREUJCQkweDAwMDgJCQkvKiBQb3J0IEYgRE1BIFJlcXVlc3QgRW5hYmxlCQkqLwotI2RlZmluZQlQRkRFX1VBUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFVBUlQwIFJYL1RYCQkJKi8KLSNkZWZpbmUJUEZERV9ETUEJCTB4MDAwOAkJCS8qIAkJRW5hYmxlIERNQVIxOjAJCQkJKi8KLQotI2RlZmluZQlQRlRFCQkJMHgwMDEwCQkJLyogUG9ydCBGIFRpbWVyIEVuYWJsZQkJCQkqLwotI2RlZmluZQlQRlRFX1VBUlQJCTB4MDAwMAkJCS8qCQlFbmFibGUgVUFSVDEgUlgvVFgJCQkqLwotI2RlZmluZQlQRlRFX1RJTUVSCQkweDAwMTAJCQkvKiAJCUVuYWJsZSBUTVI3OjYJCQkJKi8KLQotI2RlZmluZQlQRlM2RQkJCTB4MDAyMAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA2IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzZFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjUJCQkJCSovCi0jZGVmaW5lCVBGUzZFX1NQSQkJMHgwMDIwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw2CQkJKi8KLQotI2RlZmluZQlQRlM1RQkJCTB4MDA0MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA1IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzVFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjQJCQkJCSovCi0jZGVmaW5lCVBGUzVFX1NQSQkJMHgwMDQwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw1CQkJKi8KLQotI2RlZmluZQlQRlM0RQkJCTB4MDA4MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA0IEVuYWJsZQkJCSovCi0jZGVmaW5lCVBGUzRFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjMJCQkJCSovCi0jZGVmaW5lCVBGUzRFX1NQSQkJMHgwMDgwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw0CQkJKi8KLQotI2RlZmluZQlQRkZFCQkJMHgwMTAwCQkJLyogUG9ydCBGIFBQSSBGcmFtZSBTeW5jIEVuYWJsZQkJKi8KLSNkZWZpbmUJUEZGRV9USU1FUgkJMHgwMDAwCQkJLyogCQlFbmFibGUgVE1SMgkJCQkJKi8KLSNkZWZpbmUJUEZGRV9QUEkJCTB4MDEwMAkJCS8qIAkJRW5hYmxlIFBQSSBGUzMJCQkJKi8KLQotI2RlZmluZQlQR1NFCQkJMHgwMjAwCQkJLyogUG9ydCBHIFNQT1JUMSBTZWNvbmRhcnkgRW5hYmxlCSovCi0jZGVmaW5lCVBHU0VfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDk6OAkJCQkqLwotI2RlZmluZQlQR1NFX1NQT1JUCQkweDAyMDAJCQkvKiAJCUVuYWJsZSBEUjFTRUMvRFQxU0VDCQkqLwotCi0jZGVmaW5lCVBHUkUJCQkweDA0MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFJlY2VpdmUgRW5hYmxlCQkqLwotI2RlZmluZQlQR1JFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxMjoxMAkJCSovCi0jZGVmaW5lCVBHUkVfU1BPUlQJCTB4MDQwMAkJCS8qIAkJRW5hYmxlIERSMVBSSS9SRlMxL1JTQ0xLMQkqLwotCi0jZGVmaW5lCVBHVEUJCQkweDA4MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFRyYW5zbWl0IEVuYWJsZQkqLwotI2RlZmluZQlQR1RFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxNToxMwkJCSovCi0jZGVmaW5lCVBHVEVfU1BPUlQJCTB4MDgwMAkJCS8qIAkJRW5hYmxlIERUMVBSSS9URlMxL1RTQ0xLMQkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqKiogIEhBTkRTSEFLRSBETUEgKEhETUEpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKiovCi0vKiBIRE1BeF9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCUhNRE1BRU4JCTB4MDAwMQkvKiBFbmFibGUgSGFuZHNoYWtlIERNQSAwLzEJCQkJCSovCi0jZGVmaW5lCVJFUAkJCTB4MDAwMgkvKiBIRE1BIFJlcXVlc3QgUG9sYXJpdHkJCQkJCSovCi0jZGVmaW5lCVVURQkJCTB4MDAwNAkvKiBVcmdlbmN5IFRocmVzaG9sZCBFbmFibGUJCQkJCSovCi0jZGVmaW5lCU9JRQkJCTB4MDAxMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCi0jZGVmaW5lCUJESUUJCTB4MDAyMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBFbmFibGUJCQkJKi8KLSNkZWZpbmUJTUJESQkJMHgwMDQwCS8qIE1hc2sgQmxvY2sgRG9uZSBJUlEgSWYgUGVuZGluZyBFQ05UCQkqLwotI2RlZmluZQlEUlEJCQkweDAzMDAJLyogSERNQSBSZXF1ZXN0IFR5cGUJCQkJCQkqLwotI2RlZmluZQlEUlFfTk9ORQkweDAwMDAJLyogCQlObyBSZXF1ZXN0CQkJCQkJCSovCi0jZGVmaW5lCURSUV9TSU5HTEUJMHgwMTAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBTaW5nbGUJCQkJKi8KLSNkZWZpbmUJRFJRX01VTFRJCTB4MDIwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgKERlZmF1bHQpCSovCi0jZGVmaW5lCURSUV9VUkdFTlQJMHgwMzAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSBVcmdlbnQJCSovCi0jZGVmaW5lCVJCQwkJCTB4MTAwMAkvKiBSZWxvYWQgQkNOVCBXaXRoIElCQ05UCQkJCQkqLwotI2RlZmluZQlQUwkJCTB4MjAwMAkvKiBIRE1BIFBpbiBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJT0kJCQkweDQwMDAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEdlbmVyYXRlZAkJCQkqLwotI2RlZmluZQlCREkJCQkweDgwMDAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJKi8KLQotLyogZW50cnkgYWRkcmVzc2VzIG9mIHRoZSB1c2VyLWNhbGxhYmxlIEJvb3QgUk9NIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIF9CT09UUk9NX1JFU0VUIDB4RUYwMDAwMDAKLSNkZWZpbmUgX0JPT1RST01fRklOQUxfSU5JVCAweEVGMDAwMDAyCi0jZGVmaW5lIF9CT09UUk9NX0RPX01FTU9SWV9ETUEgMHhFRjAwMDAwNgotI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9GTEFTSCAweEVGMDAwMDA4Ci0jZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1NQSSAweEVGMDAwMDBBCi0jZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1RXSSAweEVGMDAwMDBDCi0jZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19GTEFTSCAweEVGMDAwMDEwCi0jZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19TUEkgMHhFRjAwMDAxMgotI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfVFdJIDB4RUYwMDAwMTQKLQotLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lCVBHREVfVUFSVCAgIFBGREVfVUFSVAotI2RlZmluZQlQR0RFX0RNQSAgICBQRkRFX0RNQQotI2RlZmluZQlDS0VMT1cJCVNDS0VMT1cKLQotLyogPT09PSBlbmQgZnJvbSBkZWZCRjUzNC5oID09PT0gKi8KLQotLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DT05UUk9MICAweGZmYzAzNDAwICAgLyogSE9TVCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVFVTICAweGZmYzAzNDA0ICAgLyogSE9TVCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1RJTUVPVVQgIDB4ZmZjMDM0MDggICAvKiBIT1NUIEFja25vd2xlZGdlIE1vZGUgVGltZW91dCBSZWdpc3RlciAqLwotCi0vKiBDb3VudGVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09ORklHICAweGZmYzAzNTAwICAgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIENOVF9JTUFTSyAgMHhmZmMwMzUwNCAgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfU1RBVFVTICAweGZmYzAzNTA4ICAgLyogU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT01NQU5EICAweGZmYzAzNTBjICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENOVF9ERUJPVU5DRSAgMHhmZmMwMzUxMCAgIC8qIERlYm91bmNlIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT1VOVEVSICAweGZmYzAzNTE0ICAgLyogQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01BWCAgMHhmZmMwMzUxOCAgIC8qIE1heGltYWwgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NSU4gIDB4ZmZjMDM1MWMgICAvKiBNaW5pbWFsIENvdW50IFJlZ2lzdGVyICovCi0KLS8qIE9UUC9GVVNFIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE9UUF9DT05UUk9MICAweGZmYzAzNjAwICAgLyogT1RQL0Z1c2UgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0JFTiAgMHhmZmMwMzYwNCAgIC8qIE9UUC9GdXNlIEJ5dGUgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfU1RBVFVTICAweGZmYzAzNjA4ICAgLyogT1RQL0Z1c2UgU3RhdHVzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfVElNSU5HICAweGZmYzAzNjBjICAgLyogT1RQL0Z1c2UgQWNjZXNzIFRpbWluZyAqLwotCi0vKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NZU1NXVCAgMHhmZmMwMzYyMCAgIC8qIFNlY3VyZSBTeXN0ZW0gU3dpdGNoZXMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFX0NPTlRST0wgIDB4ZmZjMDM2MjQgICAvKiBTZWN1cmUgQ29udHJvbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NUQVRVUyAgMHhmZmMwMzYyOCAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KLQotLyogT1RQIFJlYWQvV3JpdGUgRGF0YSBCdWZmZXIgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTAgIDB4ZmZjMDM2ODAgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTEgIDB4ZmZjMDM2ODQgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTIgIDB4ZmZjMDM2ODggICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTMgIDB4ZmZjMDM2OGMgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KLQotLyogTkZDIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfQ1RMICAweGZmYzAzNzAwICAgLyogTkFORCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19TVEFUICAweGZmYzAzNzA0ICAgLyogTkFORCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0lSUVNUQVQgIDB4ZmZjMDM3MDggICAvKiBOQU5EIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0lSUU1BU0sgIDB4ZmZjMDM3MGMgICAvKiBOQU5EIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MwICAweGZmYzAzNzEwICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfRUNDMSAgMHhmZmMwMzcxNCAgIC8qIE5BTkQgRUNDIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0VDQzIgIDB4ZmZjMDM3MTggICAvKiBOQU5EIEVDQyBSZWdpc3RlciAyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MzICAweGZmYzAzNzFjICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19DT1VOVCAgMHhmZmMwMzcyMCAgIC8qIE5BTkQgRUNDIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfUlNUICAweGZmYzAzNzI0ICAgLyogTkFORCBFQ0MgUmVzZXQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBORkNfUEdDVEwgIDB4ZmZjMDM3MjggICAvKiBOQU5EIFBhZ2UgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfUkVBRCAgMHhmZmMwMzcyYyAgIC8qIE5BTkQgUmVhZCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19BRERSICAweGZmYzAzNzQwICAgLyogTkFORCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfQ01EICAweGZmYzAzNzQ0ICAgLyogTkFORCBDb21tYW5kIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19EQVRBX1dSICAweGZmYzAzNzQ4ICAgLyogTkFORCBEYXRhIFdyaXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19EQVRBX1JEICAweGZmYzAzNzRjICAgLyogTkFORCBEYXRhIFJlYWQgUmVnaXN0ZXIgKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogICAgIFNJTkdMRSBCSVQgTUFDUk8gUEFJUlMgKGJpdCBtYXNrIGFuZCBuZWdhdGVkIG9uZSkgICAgICAqLwotLyogICAgIGFuZCBNVUxUSSBCSVQgUkVBRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBCaXQgbWFza3MgZm9yIEhPU1RfQ09OVFJPTCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VOICAweDEgICAgICAgIC8qIEhvc3QgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTkQgIDB4MiAgICAgICAgLyogSG9zdCBFbmRpYW5lc3MgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTkQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0RBVEFfU0laRSAgMHg0ICAgICAgICAvKiBEYXRhIFNpemUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25EQVRBX1NJWkUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX1JTVCAgMHg4ICAgICAgICAvKiBIb3N0IFJlc2V0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfUlNUICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSFJEWV9PVlIgIDB4MjAgICAgICAgLyogSG9zdCBSZWFkeSBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IUkRZX09WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0lOVF9NT0RFICAweDQwICAgICAgIC8qIEludGVycnVwdCBNb2RlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbklOVF9NT0RFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQlRfRU4gIDB4ODAgICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl8gbkJUX0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFcgIDB4MTAwICAgICAgLyogRW5hYmxlIEhvc3QgV3JpdGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFcgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIUiAgMHgyMDAgICAgICAvKiBFbmFibGUgSG9zdCBSZWFkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CRFIgIDB4NDAwICAgICAgLyogQnVyc3QgRE1BIFJlcXVlc3RzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uQkRSICAweDAKLQotLyogQml0IG1hc2tzIGZvciBIT1NUX1NUQVRVUyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1JFQURZICAweDEgICAgICAgIC8qIERNQSBSZWFkeSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25SRUFEWSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9GVUxMICAweDIgICAgICAgIC8qIEZJRk8gRnVsbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRlVMTCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0VNUFRZICAweDQgICAgICAgIC8qIEZJRk8gRW1wdHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRU1QVFkgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9DT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQ09NUExFVEUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSFNISyAgMHgxMCAgICAgICAvKiBIb3N0IEhhbmRzaGFrZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSFNISyAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9USU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uVElNRU9VVCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ISVJRICAweDQwICAgICAgIC8qIEhvc3QgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhJUlEgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQUxMT1dfQ05GRyAgMHg4MCAgICAgICAvKiBBbGxvdyBOZXcgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQUxMT1dfQ05GRyAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ETUFfRElSICAweDEwMCAgICAgIC8qIERNQSBEaXJlY3Rpb24gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkRNQV9ESVIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0JURSAgMHgyMDAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGVkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQlRFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfSE9TVFJEX0RPTkUgIDB4ODAwMCAgICAgLyogSG9zdCBSZWFkIENvbXBsZXRpb24gSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhPU1RSRF9ET05FICAweDAKLQotLyogQml0IG1hc2tzIGZvciBIT1NUX1RJTUVPVVQgKi8KLQotI2RlZmluZSAgICAgICAgICAgICBIT1NUX0NPVU5UX1RJTUVPVVQgIDB4N2ZmICAgICAgLyogSG9zdCBUaW1lb3V0IGNvdW50ICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NZU1NXVCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEVNVURBQkwgIDB4MSAgICAgICAgLyogRW11bGF0aW9uIERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkVNVURBQkwgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBSU1REQUJMICAweDIgICAgICAgIC8qIFJlc2V0IERpc2FibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuUlNUREFCTCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEwxSURBQkwgIDB4MWMgICAgICAgLyogTDEgSW5zdHJ1Y3Rpb24gTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQURBQkwgIDB4ZTAgICAgICAgLyogTDEgRGF0YSBCYW5rIEEgTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQkRBQkwgIDB4NzAwICAgICAgLyogTDEgRGF0YSBCYW5rIEIgTWVtb3J5IERpc2FibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTBPVlIgIDB4ODAwICAgICAgLyogRE1BMCBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTBPVlIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUExT1ZSICAweDEwMDAgICAgIC8qIERNQTEgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUExT1ZSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVNVU9WUiAgMHg0MDAwICAgICAvKiBFbXVsYXRpb24gT3ZlcnJpZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkVNVU9WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBPVFBTRU4gIDB4ODAwMCAgICAgLyogT1RQIFNlY3JldHMgRW5hYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBuT1RQU0VOICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEwyREFCTCAgMHg3MDAwMCAgICAvKiBMMiBNZW1vcnkgRGlzYWJsZS4gKi8KLQotLyogQml0IG1hc2tzIGZvciBTRUNVUkVfQ09OVFJPTCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTAgIDB4MSAgICAgICAgLyogU0VDVVJFIDAgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTEgIDB4MiAgICAgICAgLyogU0VDVVJFIDEgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTIgIDB4NCAgICAgICAgLyogU0VDVVJFIDIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTMgIDB4OCAgICAgICAgLyogU0VDVVJFIDMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMyAgMHgwCi0KLS8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NUQVRVUyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ01PREUgIDB4MyAgICAgICAgLyogU2VjdXJlZCBNb2RlIENvbnRyb2wgU3RhdGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE5NSSAgMHg0ICAgICAgICAvKiBOb24gTWFza2FibGUgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIG5OTUkgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBBRlZBTElEICAweDggICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIFZhbGlkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkFGVkFMSUQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQUZFWElUICAweDEwICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIEV4aXQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkFGRVhJVCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1NUQVQgIDB4ZTAgICAgICAgLyogU2VjdXJlIFN0YXR1cyAqLwotCi0jZW5kaWYgLyogX0RFRl9CRjUyWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGY4MGMyOTkuLmZiYTYwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC02Miw0ICs2Miw4IEBACiAjZGVmaW5lIFBPUlRfRyBHUElPX1BHMAogI2RlZmluZSBQT1JUX0ggR1BJT19QSDAKIAorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWYuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1nLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtaC5oPgorCiAjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9wbGwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcGxsLmgKaW5kZXggMjRmMWQ3Yy4uOTRjY2E2NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9wbGwuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BsbC5oCkBAIC0xLDYzICsxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9QTExfSAotI2RlZmluZSBfTUFDSF9QTExfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX01BQ0hfUExMX0ggKi8KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwppbmRleCAyY2U3YjE2Li5kNGJmY2VhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCmluZGV4IDIwYzEwMjIuLjg3YjVhZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KICNpbmNsdWRlIDxhc20vZHBtYy5oPgotI2luY2x1ZGUgPG1hY2gvZmlvX2ZsYWcuaD4KIAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwpAQCAtMjI1LDcgKzIyNCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMjkwLDkgKzI4OSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTMyNCw5ICszMjMsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CkBAIC00NzYsMTAgKzQ3NSwxNiBAQAogCQlyZXR1cm4gcmV0OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MVhfTU9EVUxFKQotCS8qIHNldHVwIEJGNTMzX1NUQU1QIENQTEQgdG8gcm91dGUgQU1TMyB0byBFdGhlcm5ldCBNQUMgKi8KLQliZmluX3dyaXRlX0ZJT19ESVIoYmZpbl9yZWFkX0ZJT19ESVIoKSB8IFBGMCk7Ci0JYmZpbl93cml0ZV9GSU9fRkxBR19TKFBGMCk7Ci0JU1NZTkMoKTsKKwkvKgorCSAqIHNldHVwIEJGNTMzX1NUQU1QIENQTEQgdG8gcm91dGUgQU1TMyB0byBFdGhlcm5ldCBNQUMuCisJICogdGhlIGJmaW4tYXN5bmMtbWFwIGRyaXZlciB0YWtlcyBjYXJlIG9mIGZsaXBwaW5nIGJldHdlZW4KKwkgKiBmbGFzaCBhbmQgZXRoZXJuZXQgd2hlbiBuZWNlc3NhcnkuCisJICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEdQSU9fUEYwLCAiZW5ldF9jcGxkIik7CisJaWYgKCFyZXQpIHsKKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUEYwLCAxKTsKKwkJZ3Bpb19mcmVlKEdQSU9fUEYwKTsKKwl9CiAjZW5kaWYKIAogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmaW5fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCmluZGV4IGFkYmU2MmEuLjRkNTYwNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTMzNiw5ICszMzYsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC0zNzAsOSArMzcwLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCmluZGV4IGExY2I4ZTcuLmI2N2I5MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKQEAgLTM0OSw3ICszNDksNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvaXAweC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKaW5kZXggNWJhNGIwMi4uZjg2OWEzNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLSNpbmNsdWRlIDxtYWNoL2Zpb19mbGFnLmg+CiAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KQEAgLTE3NCw3ICsxNzMsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTI5NSwxNSArMjk0LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoaXAweF9kZXZpY2VzLCBBUlJBWV9TSVpFKGlwMHhfZGV2aWNlcykpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKTsgKytpKSB7Ci0JCWludCBqID0gMSA8PCBiZmluX3NwaV9ib2FyZF9pbmZvW2ldLmNoaXBfc2VsZWN0OwotCQkvKiBzZXQgc3BpIGNzIHRvIDEgKi8KLQkJYmZpbl93cml0ZV9GSU9fRElSKGJmaW5fcmVhZF9GSU9fRElSKCkgfCBqKTsKLQkJYmZpbl93cml0ZV9GSU9fRkxBR19TKGopOwotCX0KIAlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZmluX3NwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKGJmaW5fc3BpX2JvYXJkX2luZm8pKTsKLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKaW5kZXggYjNiMWNkZS4uNDMyMjRlZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgogI2luY2x1ZGUgPGFzbS9kcG1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9maW9fZmxhZy5oPgogCiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCkBAIC0zNTQsNyArMzUzLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC00MTksOSArNDE4LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNDUzLDkgKzQ1Miw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKQEAgLTY3NCwxMCArNjczLDE2IEBACiAJCXJldHVybiByZXQ7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCi0JLyogc2V0dXAgQkY1MzNfU1RBTVAgQ1BMRCB0byByb3V0ZSBBTVMzIHRvIEV0aGVybmV0IE1BQyAqLwotCWJmaW5fd3JpdGVfRklPX0RJUihiZmluX3JlYWRfRklPX0RJUigpIHwgUEYwKTsKLQliZmluX3dyaXRlX0ZJT19GTEFHX1MoUEYwKTsKLQlTU1lOQygpOworCS8qCisJICogc2V0dXAgQkY1MzNfU1RBTVAgQ1BMRCB0byByb3V0ZSBBTVMzIHRvIEV0aGVybmV0IE1BQy4KKwkgKiB0aGUgYmZpbi1hc3luYy1tYXAgZHJpdmVyIHRha2VzIGNhcmUgb2YgZmxpcHBpbmcgYmV0d2VlbgorCSAqIGZsYXNoIGFuZCBldGhlcm5ldCB3aGVuIG5lY2Vzc2FyeS4KKwkgKi8KKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QRjAsICJlbmV0X2NwbGQiKTsKKwlpZiAoIXJldCkgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QRjAsIDEpOworCQlncGlvX2ZyZWUoR1BJT19QRjApOworCX0KICNlbmRpZgogCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CkBAIC03MTMsNyArNzE4LDYgQEAKIHZvaWQgbmF0aXZlX21hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CiAJLyogd29ya2Fyb3VuZCBwdWxsIHVwIG9uIGNwbGQgLyBmbGFzaCBwaW4gbm90IGJlaW5nIHN0cm9uZyBlbm91Z2ggKi8KLQliZmluX3dyaXRlX0ZJT19JTkVOKH5QRjApOwotCWJmaW5fd3JpdGVfRklPX0RJUihQRjApOwotCWJmaW5fd3JpdGVfRklPX0ZMQUdfQyhQRjApOworCWdwaW9fcmVxdWVzdChHUElPX1BGMCwgImZsYXNoX2NwbGQiKTsKKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QRjAsIDApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCmluZGV4IDRhMTRhNDYuLjFmNTk4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA3MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtYWNoL2JmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKyNkZWZpbmUgX19CRklOX01BQ0hfU0VSSUFMX0hfXworCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggOWUxZjNkZS4uNDVkY2FhNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC00LDM2ICs0LDkgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSx2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCx2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQotI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKICMgaWZuZGVmIENPTkZJR19VQVJUMF9DVFNfUElOCkBAIC00NCw1MSArMTcsNiBAQAogIyBlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCi0KLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKLSAgICAgICAgc3RydWN0IHVhcnRfcG9ydCAgICAgICAgcG9ydDsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgb2xkX3N0YXR1czsKLQlpbnQJCQlzdGF0dXNfaXJxOwotCXVuc2lnbmVkIGludCBsc3I7Ci0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQotCWludAkJCXR4X2RvbmU7Ci0JaW50CQkJdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQJCQlyeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOwotI2Vsc2UKLSMgaWYgQU5PTUFMWV8wNTAwMDM2MwotCXVuc2lnbmVkIGludCBhbm9tYWx5X3RocmVzaG9sZDsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBjdHNfdGltZXI7Ci0JaW50CQkJY3RzX3BpbjsKLQlpbnQJCQlydHNfcGluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKLSAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAotICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1YXJ0LT5sc3IgPSAwOwotCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Ci19Ci0KIHN0cnVjdCBiZmluX3NlcmlhbF9yZXMgewogCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CiAJaW50CQl1YXJ0X2lycTsKQEAgLTEyMCwzICs0OCw1IEBACiB9OwogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCisKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCBmNGJkNmRmLi5lMzY2MjA3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXwpAQCAtMTAsMjYgKzEwLDE0IEBACiAjZGVmaW5lIEJGNTMzX0ZBTUlMWQogCiAjaW5jbHVkZSAiYmY1MzMuaCIKLSNpbmNsdWRlICJkZWZCRjUzMi5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAotI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKLSNpbmNsdWRlICJjZGVmQkY1MzIuaCIKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpbmNsdWRlICJkZWZCRjUzMi5oIgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisjIGluY2x1ZGUgImNkZWZCRjUzMi5oIgogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTICAgICAgMQotCi0jZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVIgICAgICAgICAgICAgIDB4MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICAgICovCi0jZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCi0KLSNlbmRpZgkJCQkvKiBfTUFDSF9CTEFDS0ZJTl9IXyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaAppbmRleCA0MDFlNTI0Li5mZDBjYmU0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwpAQCAtNyw5ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1MzJfSAogI2RlZmluZSBfQ0RFRl9CRjUzMl9ICiAKLS8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sICgweEZGQzAgMDQwMC0weEZGQzAgMDdGRikgKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfU1RBVCkKQEAgLTY2LDE2ICs2MywxMCBAQAogI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFJUQ19QUkVOLHZhbCkKIAogLyogRE1BIFRyYWZmaWMgY29udHJvbHMgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ1BFUigpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENQRVIodmFsKSAgICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFfVENQRVIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDQ05UKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ0NOVCh2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ0NOVCx2YWwpCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19QRVIoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX1BFUih2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDX1BFUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfQ05UKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ19DTlQodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ19DTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19QRVIoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQ19UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19QRVIodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQ19UQ19QRVIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19DTlQoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQ19UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19DTlQodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQ19UQ19DTlQsdmFsKQogCiAvKiBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMCAyNDAwLTB4RkZDMCAyN0ZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfRklPX0RJUigpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0RJUikKQEAgLTEwNSw2ICs5Niw0NyBAQAogI2RlZmluZSBiZmluX3JlYWRfRklPX01BU0tCX1QoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX01BU0tCX1QpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRklPX01BU0tCX1QodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX01BU0tCX1QsdmFsKQogCisjaWYgQU5PTUFMWV8wNTAwMDMxMQorLyogS2VlcCBhdCB0aGUgQ1BQIGV4cGFuc2lvbiB0byBhdm9pZCBjaXJjdWxhciBoZWFkZXIgZGVwZW5kZW5jeSBsb29wcyAqLworI2RlZmluZSBCRklOX1dSSVRFX0ZJT19GTEFHKG5hbWUsIHZhbCkgXAorCWRvIHsgXAorCQl1bnNpZ25lZCBsb25nIF9fZmxhZ3M7IFwKKwkJX19mbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsgXAorCQliZmluX3dyaXRlMTYoRklPX0ZMQUdfIyNuYW1lLCB2YWwpOyBcCisJCWJmaW5fcmVhZF9DSElQSUQoKTsgXAorCQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKF9fZmxhZ3MpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19EKHZhbCkgICAgICAgICAgIEJGSU5fV1JJVEVfRklPX0ZMQUcoRCwgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0ModmFsKSAgICAgICAgICAgQkZJTl9XUklURV9GSU9fRkxBRyhDLCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfUyh2YWwpICAgICAgICAgICBCRklOX1dSSVRFX0ZJT19GTEFHKFMsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19UKHZhbCkgICAgICAgICAgIEJGSU5fV1JJVEVfRklPX0ZMQUcoVCwgdmFsKQorCisjZGVmaW5lIEJGSU5fUkVBRF9GSU9fRkxBRyhuYW1lKSBcCisJKHsgXAorCQl1bnNpZ25lZCBsb25nIF9fZmxhZ3M7IFwKKwkJdTE2IF9fcmV0OyBcCisJCV9fZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7IFwKKwkJX19yZXQgPSBiZmluX3JlYWQxNihGSU9fRkxBR18jI25hbWUpOyBcCisJCWJmaW5fcmVhZF9DSElQSUQoKTsgXAorCQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKF9fZmxhZ3MpOyBcCisJCV9fcmV0OyBcCisJfSkKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSAgICAgICAgICAgICAgIEJGSU5fUkVBRF9GSU9fRkxBRyhEKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfQygpICAgICAgICAgICAgICAgQkZJTl9SRUFEX0ZJT19GTEFHKEMpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19TKCkgICAgICAgICAgICAgICBCRklOX1JFQURfRklPX0ZMQUcoUykKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1QoKSAgICAgICAgICAgICAgIEJGSU5fUkVBRF9GSU9fRkxBRyhUKQorCisjZWxzZQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0QsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19DKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19DLCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfUyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfUywgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0QpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19DKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19DKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfUygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfUykKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1QpCisjZW5kaWYKKwogLyogRE1BIENvbnRyb2xsZXIgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLHZhbCkKQEAgLTY0Nyw3ICs2NzksNCBAQAogI2RlZmluZSBiZmluX3JlYWRfUFBJX0ZSQU1FKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQogI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBQSV9GUkFNRSx2YWwpCiAKLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1MzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kZWZCRjUzMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kZWZCRjUzMi5oCmluZGV4IDNhZGIwYjQuLjIzNzZkNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZGVmQkY1MzIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RlZkJGNTMyLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogU3lzdGVtICYgTU1SIGJpdCBhbmQgQWRkcmVzcyBkZWZpbml0aW9ucyBmb3IgQURTUC1CRjUzMgogICoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC05LDkgKzksNiBAQAogI2lmbmRlZiBfREVGX0JGNTMyX0gKICNkZWZpbmUgX0RFRl9CRjUzMl9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0xODIsMTIgKzE3OSw4IEBACiAjZGVmaW5lIEVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQwkvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIgKi8KIAogLyogRE1BIFRyYWZmaWMgY29udHJvbHMgKi8KLSNkZWZpbmUgRE1BX1RDX1BFUiAweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCi0jZGVmaW5lIERNQV9UQ19DTlQgMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBETUFfVENQRVIgMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLwotI2RlZmluZSBETUFfVENDTlQgMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BQ19UQ19QRVIgMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZSBETUFDX1RDX0NOVCAweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlciAqLwogCiAvKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpICovCiAjZGVmaW5lIERNQTBfQ09ORklHCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwpAQCAtNDMyLDgzICs0MjUsNiBAQAogI2RlZmluZSBJV1JfRU5BQkxFKHgpCSAgICAgICAoMSA8PCAoeCkpCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLwogI2RlZmluZSBJV1JfRElTQUJMRSh4KSAoMHhGRkZGRkZGRiBeICgxIDw8ICh4KSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggKi8KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogVUFSVF9MQ1IgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBETEFCCTB4ODAKLSNkZWZpbmUgU0IgICAgICAweDQwCi0jZGVmaW5lIFNUUCAgICAgIDB4MjAKLSNkZWZpbmUgRVBTICAgICAweDEwCi0jZGVmaW5lIFBFTgkweDA4Ci0jZGVmaW5lIFNUQgkweDA0Ci0jZGVmaW5lIFdMUyh4KQkoKHgtNSkgJiAweDAzKQotCi0jZGVmaW5lIERMQUJfUAkweDA3Ci0jZGVmaW5lIFNCX1AJMHgwNgotI2RlZmluZSBTVFBfUAkweDA1Ci0jZGVmaW5lIEVQU19QCTB4MDQKLSNkZWZpbmUgUEVOX1AJMHgwMwotI2RlZmluZSBTVEJfUAkweDAyCi0jZGVmaW5lIFdMU19QMQkweDAxCi0jZGVmaW5lIFdMU19QMAkweDAwCi0KLS8qIFVBUlRfTUNSIFJlZ2lzdGVyICovCi0jZGVmaW5lIExPT1BfRU5BCTB4MTAKLSNkZWZpbmUgTE9PUF9FTkFfUAkweDA0Ci0KLS8qIFVBUlRfTFNSIFJlZ2lzdGVyICovCi0jZGVmaW5lIFRFTVQJMHg0MAotI2RlZmluZSBUSFJFCTB4MjAKLSNkZWZpbmUgQkkJMHgxMAotI2RlZmluZSBGRQkweDA4Ci0jZGVmaW5lIFBFCTB4MDQKLSNkZWZpbmUgT0UJMHgwMgotI2RlZmluZSBEUgkweDAxCi0KLSNkZWZpbmUgVEVNUF9QCTB4MDYKLSNkZWZpbmUgVEhSRV9QCTB4MDUKLSNkZWZpbmUgQklfUAkweDA0Ci0jZGVmaW5lIEZFX1AJMHgwMwotI2RlZmluZSBQRV9QCTB4MDIKLSNkZWZpbmUgT0VfUAkweDAxCi0jZGVmaW5lIERSX1AJMHgwMAotCi0vKiBVQVJUX0lFUiBSZWdpc3RlciAqLwotI2RlZmluZSBFTFNJCTB4MDQKLSNkZWZpbmUgRVRCRUkJMHgwMgotI2RlZmluZSBFUkJGSQkweDAxCi0KLSNkZWZpbmUgRUxTSV9QCTB4MDIKLSNkZWZpbmUgRVRCRUlfUAkweDAxCi0jZGVmaW5lIEVSQkZJX1AJMHgwMAotCi0vKiBVQVJUX0lJUiBSZWdpc3RlciAqLwotI2RlZmluZSBTVEFUVVMoeCkJKCh4IDw8IDEpICYgMHgwNikKLSNkZWZpbmUgTklOVAkJMHgwMQotI2RlZmluZSBTVEFUVVNfUDEJMHgwMgotI2RlZmluZSBTVEFUVVNfUDAJMHgwMQotI2RlZmluZSBOSU5UX1AJCTB4MDAKLSNkZWZpbmUgSUlSX1RYX1JFQURZICAgIDB4MDIJLyogVUFSVF9USFIgZW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1JYX1JFQURZICAgIDB4MDQJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJLyogUmVjZWl2ZSBsaW5lIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1NUQVRVUwkweDA2Ci0KLS8qIFVBUlRfR0NUTCBSZWdpc3RlciAqLwotI2RlZmluZSBGRkUJMHgyMAotI2RlZmluZSBGUEUJMHgxMAotI2RlZmluZSBSUE9MQwkweDA4Ci0jZGVmaW5lIFRQT0xDCTB4MDQKLSNkZWZpbmUgSVJFTgkweDAyCi0jZGVmaW5lIFVDRU4JMHgwMQotCi0jZGVmaW5lIEZGRV9QCTB4MDUKLSNkZWZpbmUgRlBFX1AJMHgwNAotI2RlZmluZSBSUE9MQ19QCTB4MDMKLSNkZWZpbmUgVFBPTENfUAkweDAyCi0jZGVmaW5lIElSRU5fUAkweDAxCi0jZGVmaW5lIFVDRU5fUAkweDAwCi0KIC8qICAqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKioqKiogICAqLwogCiAvKiAgUFBJX0NPTlRST0wgTWFza3MgICAgICAgICAqLwpAQCAtNjQzLDQ0ICs1NTksNiBAQAogI2RlZmluZSBFUlJfVFlQX1AwCQkweDBFCiAjZGVmaW5lIEVSUl9UWVBfUDEJCTB4MEYKIAotLyovICoqKioqKioqKioqKioqKioqKiAgIFBST0dSQU1NQUJMRSBGTEFHIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBNYXNrcyAqLwotI2RlZmluZSBQRjAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgUEYxICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFBGMiAgICAgICAgIDB4MDAwNAotI2RlZmluZSBQRjMgICAgICAgICAweDAwMDgKLSNkZWZpbmUgUEY0ICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFBGNSAgICAgICAgIDB4MDAyMAotI2RlZmluZSBQRjYgICAgICAgICAweDAwNDAKLSNkZWZpbmUgUEY3ICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFBGOCAgICAgICAgIDB4MDEwMAotI2RlZmluZSBQRjkgICAgICAgICAweDAyMDAKLSNkZWZpbmUgUEYxMCAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFBGMTEgICAgICAgIDB4MDgwMAotI2RlZmluZSBQRjEyICAgICAgICAweDEwMDAKLSNkZWZpbmUgUEYxMyAgICAgICAgMHgyMDAwCi0jZGVmaW5lIFBGMTQgICAgICAgIDB4NDAwMAotI2RlZmluZSBQRjE1ICAgICAgICAweDgwMDAKLQotLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBCSVQgUE9TSVRJT05TICovCi0jZGVmaW5lIFBGMF9QICAgICAgICAgMAotI2RlZmluZSBQRjFfUCAgICAgICAgIDEKLSNkZWZpbmUgUEYyX1AgICAgICAgICAyCi0jZGVmaW5lIFBGM19QICAgICAgICAgMwotI2RlZmluZSBQRjRfUCAgICAgICAgIDQKLSNkZWZpbmUgUEY1X1AgICAgICAgICA1Ci0jZGVmaW5lIFBGNl9QICAgICAgICAgNgotI2RlZmluZSBQRjdfUCAgICAgICAgIDcKLSNkZWZpbmUgUEY4X1AgICAgICAgICA4Ci0jZGVmaW5lIFBGOV9QICAgICAgICAgOQotI2RlZmluZSBQRjEwX1AgICAgICAgIDEwCi0jZGVmaW5lIFBGMTFfUCAgICAgICAgMTEKLSNkZWZpbmUgUEYxMl9QICAgICAgICAxMgotI2RlZmluZSBQRjEzX1AgICAgICAgIDEzCi0jZGVmaW5lIFBGMTRfUCAgICAgICAgMTQKLSNkZWZpbmUgUEYxNV9QICAgICAgICAxNQotCiAvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKiAqLwogCiAvKiBBTUdDVEwgTWFza3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZmlvX2ZsYWcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZmlvX2ZsYWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiZmJhMC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Zpb19mbGFnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9GSU9fRkxBR19ICi0jZGVmaW5lIF9NQUNIX0ZJT19GTEFHX0gKLQotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgotCi0jaWYgQU5PTUFMWV8wNTAwMDMxMQotI2RlZmluZSBCRklOX1dSSVRFX0ZJT19GTEFHKG5hbWUpIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3dyaXRlX0ZJT19GTEFHXyMjbmFtZSh1bnNpZ25lZCBzaG9ydCB2YWwpIFwKLXsgXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsgXAotCWJmaW5fd3JpdGUxNihGSU9fRkxBR18jI25hbWUsIHZhbCk7IFwKLQliZmluX3JlYWRfQ0hJUElEKCk7IFwKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotfQotQkZJTl9XUklURV9GSU9fRkxBRyhEKQotQkZJTl9XUklURV9GSU9fRkxBRyhDKQotQkZJTl9XUklURV9GSU9fRkxBRyhTKQotQkZJTl9XUklURV9GSU9fRkxBRyhUKQotCi0jZGVmaW5lIEJGSU5fUkVBRF9GSU9fRkxBRyhuYW1lKSBcCi1zdGF0aWMgaW5saW5lIHUxNiBiZmluX3JlYWRfRklPX0ZMQUdfIyNuYW1lKHZvaWQpIFwKLXsgXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKLQl1MTYgcmV0OyBcCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7IFwKLQlyZXQgPSBiZmluX3JlYWQxNihGSU9fRkxBR18jI25hbWUpOyBcCi0JYmZpbl9yZWFkX0NISVBJRCgpOyBcCi0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKLQlyZXR1cm4gcmV0OyBcCi19Ci1CRklOX1JFQURfRklPX0ZMQUcoRCkKLUJGSU5fUkVBRF9GSU9fRkxBRyhDKQotQkZJTl9SRUFEX0ZJT19GTEFHKFMpCi1CRklOX1JFQURfRklPX0ZMQUcoVCkKLQotI2Vsc2UKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19EKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ELCB2YWwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfQyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfQywgdmFsKQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1MsIHZhbCkKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19UKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19UKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19UKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfQygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfQykKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1MpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19EKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19EKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTUFDSF9GSU9fRkxBR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGUwMjQxNmQuLmNjZTRmOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0yOCw0ICsyOCw2IEBACiAKICNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCiAKKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1mLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCAxNjljMTA2Li45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNTcgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9NQUNIX1BMTF9ICi0jZGVmaW5lIF9NQUNIX1BMTF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KLQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9LY29uZmlnCmluZGV4IDQ0MTMyZmQuLmE0NGJmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL0tjb25maWcKQEAgLTM5LDQgKzM5LDEwIEBACiAJaGVscAogCSAgQm9hcmQgc3VwcGx5IHBhY2thZ2UgZm9yIENTUCBNaW5vdGF1cgogCitjb25maWcgRE5QNTM3MAorCWJvb2wgIlNTViBEaWwvTmV0UEMgRE5QLzUzNzAiCisJZGVwZW5kcyBvbiAoQkY1MzcpCisJaGVscAorCSAgQm9hcmQgc3VwcGx5IHBhY2thZ2UgZm9yIEROUC81MzcwIERJTDY0IG1vZHVsZQorCiBlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL01ha2VmaWxlCmluZGV4IDdlNmFhNGUuLmZlNDIyNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9NYWtlZmlsZQpAQCAtOCwzICs4LDQgQEAKIG9iai0kKENPTkZJR19CRklONTM3X0JMVUVURUNITklYX1RDTSkgICs9IHRjbV9iZjUzNy5vCiBvYmotJChDT05GSUdfUE5BVjEwKSAgICAgICAgICAgICAgICAgICArPSBwbmF2MTAubwogb2JqLSQoQ09ORklHX0NBTVNJR19NSU5PVEFVUikgICAgICAgICAgKz0gbWlub3RhdXIubworb2JqLSQoQ09ORklHX0ROUDUzNzApICAgICAgICAgICAgICAgICAgKz0gZG5wNTM3MC5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYwppbmRleCA4MzY2OThjLi4yYzc3NmUxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKQEAgLTM3Myw3ICszNzMsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTQzNCw3ICs0MzQsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTU0NSw5ICs1NDUsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01NzksOSArNTc5LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKaW5kZXggMmE4NTY3MC4uMDg1NjYxMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCkBAIC0zNTYsNyArMzU2LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0zOTksNyArMzk5LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC01MTAsOSArNTEwLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNTQ0LDkgKzU0NCw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlOWVhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvZG5wNTM3MC5jCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogVGhpcyBpcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgU1NWIERpbC9OZXRQQyBETlAvNTM3MCBib2FyZC4KKyAqCisgKiBESUwgbW9kdWxlOiAgICAgICAgIGh0dHA6Ly93d3cuZGlsbmV0cGMuY29tL2RucDAwODYuaHRtCisgKiBTSzI4IChzdGFydGVyIGtpdCk6IGh0dHA6Ly93d3cuZGlsbmV0cGMuY29tL2RucDAwODguaHRtCisgKgorICogQ29weXJpZ2h0IDIwMTAgM2FsaXR5IERpZ2l0YWwgU3lzdGVtcworICogQ29weXJpZ2h0IDIwMDUgTmF0aW9uYWwgSUNUIEF1c3RyYWxpYSAoTklDVEEpCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvbW1jX3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KKyNpbmNsdWRlIDxhc20vcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vZHBtYy5oPgorCisvKgorICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCisgKi8KK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiRE5QLzUzNzAiOworI2RlZmluZSBGTEFTSF9NQUMgICAgICAgICAgICAgICAweDIwMmYwMDAwCisjZGVmaW5lIENPTkZJR19NVERfUEhZU01BUF9MRU4gIDB4MzAwMDAwCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lID0gInJ0Yy1iZmluIiwKKwkuaWQgICA9IC0xLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9iZmluX21hYy5oPgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGJmaW5fbWFjX3BlcmlwaGVyYWxzW10gPSBQX1JNSUkwOworCitzdGF0aWMgc3RydWN0IGJmaW5fcGh5ZGV2X3BsYXRmb3JtX2RhdGEgYmZpbl9waHlkZXZfZGF0YVtdID0geworCXsKKwkJLmFkZHIgPSAxLAorCQkuaXJxID0gUEhZX1BPTEwsIC8qIElSUV9NQUNfUEhZSU5UICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9taWlfYnVzX3BsYXRmb3JtX2RhdGEgYmZpbl9taWlfYnVzX2RhdGEgPSB7CisJLnBoeWRldl9udW1iZXIgICA9IDEsCisJLnBoeWRldl9kYXRhICAgICA9IGJmaW5fcGh5ZGV2X2RhdGEsCisJLnBoeV9tb2RlICAgICAgICA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJLAorCS5tYWNfcGVyaXBoZXJhbHMgPSBiZmluX21hY19wZXJpcGhlcmFscywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fbWlpX2J1cyA9IHsKKwkubmFtZSA9ICJiZmluX21paV9idXMiLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fbWlpX2J1c19kYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fbWFjX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX21hYyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9taWlfYnVzLAorCX0KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXNtYl9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSAgICAgICA9ICJib290bG9hZGVyKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4MzAwMDAsCisJCS5vZmZzZXQgICAgID0gMCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImxpbnV4IGtlcm5lbCBhbmQgcm9vdGZzKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4MzAwMDAwIC0gMHgzMDAwMCAtIDB4MTAwMDAsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAiTUFDIGFkZHJlc3Mobm9yKSIsCisJCS5zaXplICAgICAgID0gMHgxMDAwMCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBhc21iX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAxLAorCS5wYXJ0cyAgICAgID0gYXNtYl9mbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyAgID0gQVJSQVlfU0laRShhc21iX2ZsYXNoX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhc21iX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDJmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKKy8qIDQgTUIgTk9SIGZsYXNoIGF0dGFjaGVkIHRvIGFzeW5jIG1lbW9yeSBiYW5rcyAwLTIsCisgKiB0aGVyZWZvcmUgb25seSAzIE1CIHZpc2libGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFzbWJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCSAgPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCSAgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmFzbWJfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZhc21iX2ZsYXNoX3Jlc291cmNlLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKworI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQorCisjZGVmaW5lIE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5UIElSUV9QRjUKKworc3RhdGljIGludCBiZmluX21tY19zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJaXJxcmV0dXJuX3QgKCpkZXRlY3RfaW50KShpbnQsIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHJlcXVlc3RfaXJxKE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5ULCBkZXRlY3RfaW50LAorCQlJUlFGX1RSSUdHRVJfRkFMTElORywgIm1tYy1zcGktZGV0ZWN0IiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fbW1jX3NwaV9leGl0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX2lycShNTUNfU1BJX0NBUkRfREVURUNUX0lOVCwgZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBtbWNfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSAgICA9IDAsCSAvKiB1c2Ugbm8gZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworCitzdGF0aWMgc3RydWN0IG1tY19zcGlfcGxhdGZvcm1fZGF0YSBiZmluX21tY19zcGlfcGRhdGEgPSB7CisJLmluaXQgPSBiZmluX21tY19zcGlfaW5pdCwKKwkuZXhpdCA9IGJmaW5fbW1jX3NwaV9leGl0LAorCS5kZXRlY3RfZGVsYXkgPSAxMDAsIC8qIG1zZWNzICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIX01PRFVMRSkKKy8qIFRoaXMgbWFwcGluZyBpcyBmb3IgYXQ0NWRiNjQyIGl0IGhhcyAxMDU2IHBhZ2Ugc2l6ZSwKKyAqIHBhcnRpdGlvbiBzaXplIGFuZCBvZmZzZXQgc2hvdWxkIGJlIHBhZ2UgYWxpZ25lZAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYmZpbl9zcGlfZGF0YWZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgPSAiSkZGUzIgZGF0YWZsYXNoKG5vcikiLAorI2lmZGVmIENPTkZJR19NVERfUEFHRVNJWkVfMTAyNAorCQkub2Zmc2V0ID0gMHg0MDAwMCwKKwkJLnNpemUgICA9IDB4N0MwMDAwLAorI2Vsc2UKKwkJLm9mZnNldCA9IDB4MCwKKwkJLnNpemUgICA9IDB4ODQwMDAwLAorI2VuZGlmCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGJmaW5fc3BpX2RhdGFmbGFzaF9kYXRhID0geworCS5uYW1lICAgICA9ICJtdGRfZGF0YWZsYXNoIiwKKwkucGFydHMgICAgPSBiZmluX3NwaV9kYXRhZmxhc2hfcGFydGl0aW9ucywKKwkubnJfcGFydHMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpX2RhdGFmbGFzaF9wYXJ0aXRpb25zKSwKKwkudHlwZSAgICAgPSAibXRkX2RhdGFmbGFzaCIsCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2RhdGFmbGFzaF9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgICAgPSAwLAkgLyogdXNlIG5vIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0geworLyogU0QvTU1DIGNhcmQgcmVhZGVyIGF0IFNQSSBidXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcwkgPSAibW1jX3NwaSIsCisJCS5tYXhfc3BlZWRfaHogICAgPSAyMDAwMDAwMCwKKwkJLmJ1c19udW0JID0gMCwKKwkJLmNoaXBfc2VsZWN0ICAgICA9IDEsCisJCS5wbGF0Zm9ybV9kYXRhICAgPSAmYmZpbl9tbWNfc3BpX3BkYXRhLAorCQkuY29udHJvbGxlcl9kYXRhID0gJm1tY19zcGlfY2hpcF9pbmZvLAorCQkubW9kZQkgICAgICAgICA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorCisvKiA4IE1lZ2FieXRlIEF0bWVsIE5PUiBmbGFzaCBjaGlwIGF0IFNQSSBidXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIX01PRFVMRSkKKwl7CisJLm1vZGFsaWFzICAgICAgICA9ICJtdGRfZGF0YWZsYXNoIiwKKwkubWF4X3NwZWVkX2h6ICAgID0gMTY3MDAwMDAsCisJLmJ1c19udW0gICAgICAgICA9IDAsCisJLmNoaXBfc2VsZWN0ICAgICA9IDIsCisJLnBsYXRmb3JtX2RhdGEgICA9ICZiZmluX3NwaV9kYXRhZmxhc2hfZGF0YSwKKwkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9kYXRhZmxhc2hfY2hpcF9pbmZvLAorCS5tb2RlICAgICAgICAgICAgPSBTUElfTU9ERV8zLCAvKiBTUElfQ1BIQSBhbmQgU1BJX0NQT0wgKi8KKwl9LAorI2VuZGlmCit9OworCisvKiBTUEkgY29udHJvbGxlciBkYXRhICovCisvKiBTUEkgKDApICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc3BpMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU1BJMF9SRUdCQVNFLAorCQkuZW5kICAgPSBTUEkwX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJLAorCQkuZW5kICAgPSBDSF9TUEksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJWzJdID0geworCQkuc3RhcnQgPSBJUlFfU1BJLAorCQkuZW5kICAgPSBJUlFfU1BJLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgc3BpX2JmaW5fbWFzdGVyX2luZm8gPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gOCwKKwkuZW5hYmxlX2RtYSAgICAgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSAgICAgICAgPSB7UF9TUEkwX1NDSywgUF9TUEkwX01JU08sIFBfU1BJMF9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNwaV9iZmluX21hc3Rlcl9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgPSAiYmZpbi1zcGkiLAorCS5pZCAgICAgICAgICAgID0gMCwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSAgICAgID0gYmZpbl9zcGkwX3Jlc291cmNlLAorCS5kZXYgICAgICAgICAgID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfYmZpbl9tYXN0ZXJfaW5mbywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3VhcnQwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gVUFSVDBfVEhSLAorCQkuZW5kID0gVUFSVDBfR0NUTCsyLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfRVJST1IsCisJCS5lbmQgPSBJUlFfVUFSVDBfRVJST1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9UWCwKKwkJLmVuZCA9IENIX1VBUlQwX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CisJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl91YXJ0MF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi11YXJ0IiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3VhcnQwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl91YXJ0MF9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl91YXJ0MF9wZXJpcGhlcmFscywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0MV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IFVBUlQxX1RIUiwKKwkJLmVuZCAgID0gVUFSVDFfR0NUTCsyLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kICAgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9FUlJPUiwKKwkJLmVuZCAgID0gSVJRX1VBUlQxX0VSUk9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfVFgsCisJCS5lbmQgICA9IENIX1VBUlQxX1RYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgICA9IENIX1VBUlQxX1JYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKKwlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3VhcnQxX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICA9ICJiZmluLXVhcnQiLAorCS5pZCAgICAgICAgICAgID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl91YXJ0MV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgID0gYmZpbl91YXJ0MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl91YXJ0MV9wZXJpcGhlcmFscywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFRXSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gVFdJMF9SRUdCQVNFICsgMHhmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0ksCisJCS5lbmQgICA9IElSUV9UV0ksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYmZpbl90d2lfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgID0gImkyYy1iZmluLXR3aSIsCisJLmlkICAgICAgICAgICAgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3R3aTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSAgICAgID0gYmZpbl90d2kwX3Jlc291cmNlLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG5wNTM3MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJJmJmaW5fdWFydDBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQxCisJJmJmaW5fdWFydDFfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCisJJmFzbWJfZmxhc2hfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorCSZiZmluX21paV9idXMsCisJJmJmaW5fbWFjX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKwkmc3BpX2JmaW5fbWFzdGVyX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCisJJmkyY19iZmluX3R3aV9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKKwkmcnRjX2RldmljZSwKKyNlbmRpZgorCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkbnA1MzcwX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJETlAvNTM3MDogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIik7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoZG5wNTM3MF9kZXZpY2VzLCBBUlJBWV9TSVpFKGRucDUzNzBfZGV2aWNlcykpOworCXByaW50ayhLRVJOX0lORk8gIkROUC81MzcwOiByZWdpc3RlcmluZyAlenUgU1BJIHNsYXZlIGRldmljZXNcbiIsCisJICAgICAgIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOworCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmaW5fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOworCXByaW50ayhLRVJOX0lORk8gIkROUC81MzcwOiBNQUMgJXBNXG4iLCAodm9pZCAqKUZMQVNIX01BQyk7CisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGRucDUzNzBfaW5pdCk7CisKKy8qCisgKiBDdXJyZW50bHkgdGhlIE1BQyBhZGRyZXNzIGlzIHNhdmVkIGluIEZsYXNoIGJ5IFUtQm9vdAorICovCit2b2lkIGJmaW5fZ2V0X2V0aGVyX2FkZHIoY2hhciAqYWRkcikKK3sKKwkqKHUzMiAqKSgmKGFkZHJbMF0pKSA9IGJmaW5fcmVhZDMyKEZMQVNIX01BQyk7CisJKih1MTYgKikoJihhZGRyWzRdKSkgPSBiZmluX3JlYWQxNihGTEFTSF9NQUMgKyA0KTsKK30KK0VYUE9SVF9TWU1CT0woYmZpbl9nZXRfZXRoZXJfYWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKaW5kZXggNDk4MDA1MS4uYmZiMzY3MSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMzA2LDcgKzMwNiw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNDE5LDkgKzQxOSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTQ1Myw5ICs0NTMsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwppbmRleCBiOTU4MDc4Li45Mzg5ZjAzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKQEAgLTM2Nyw3ICszNjcsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTQxMCw3ICs0MTAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwppbmRleCAzYWEzNDRjLi4yYzY5Nzg1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCkBAIC0yODksNyArMjg5LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX0NBTl9CRklOX01PRFVMRSkKLXVuc2lnbmVkIHNob3J0IGJmaW5fY2FuX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKIAlQX0NBTjBfUlgsIFBfQ0FOMF9UWCwgMAogfTsKIApAQCAtNjkzLDcgKzY5Myw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0FEMlMxMjBYKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTMTIwWF9NT0RVTEUpCi11bnNpZ25lZCBzaG9ydCBhZDJzMTIweF9wbGF0Zm9ybV9kYXRhW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWQyczEyMHhfcGxhdGZvcm1fZGF0YVtdID0gewogCS8qIHVzZWQgYXMgU0FNUExFIGFuZCBSRFZFTCAqLwogCUdQSU9fUEY1LCBHUElPX1BGNiwgMAogfTsKQEAgLTcwNSw3ICs3MDUsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMCkgfHwgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfTU9EVUxFKQotdW5zaWduZWQgc2hvcnQgYWQyczEyMTBfcGxhdGZvcm1fZGF0YVtdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGFkMnMxMjEwX3BsYXRmb3JtX2RhdGFbXSA9IHsKIAkvKiB1c2UgYXMgU0FNUExFLCBBMCwgQTEgKi8KIAlHUElPX1BGNywgR1BJT19QRjgsIEdQSU9fUEY5LAogIyBpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKQEAgLTE3MTcsNyArMTcxNyw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMTc2MCw3ICsxNzYwLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC0yNDQ3LDkgKzI0NDcsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC0yNDgxLDkgKzI0ODEsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwppbmRleCAzMTQ5OGFkLi4wNzYxYjIwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTM5OSw3ICszOTksNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTUxMiw5ICs1MTIsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01NDYsOSArNTQ2LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCmluZGV4IDVjOGM0ZWQuLjVjNjJlOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM2MDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtYWNoL2JmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKyNkZWZpbmUgX19CRklOX01BQ0hfU0VSSUFMX0hfXworCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggNjM1YzkxYy4uM2U5NTVkYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC00LDM2ICs0LDkgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSx2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCx2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQotI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCiAjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAKQEAgLTU0LDQ5ICsyNyw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotLyoKLSAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKLSAqLwotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotICAgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICAgICAgICBwb3J0OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBvbGRfc3RhdHVzOwotCWludAkJCXN0YXR1c19pcnE7Ci0JdW5zaWduZWQgaW50IGxzcjsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCi0JaW50CQkJdHhfZG9uZTsKLQlpbnQJCQl0eF9jb3VudDsKLQlzdHJ1Y3QgY2lyY19idWYJCXJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludAkJCXJ4X2RtYV9ucm93czsKLQl1bnNpZ25lZCBpbnQJCXR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludAkJcnhfZG1hX2NoYW5uZWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXR4X2RtYV93b3JrcXVldWU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCi0JaW50CQljdHNfcGluOwotCWludCAJCXJ0c19waW47Ci0jZW5kaWYKLX07Ci0KLS8qIFRoZSBoYXJkd2FyZSBjbGVhcnMgdGhlIExTUiBiaXRzIHVwb24gcmVhZCwgc28gd2UgbmVlZCB0byBjYWNoZQotICogc29tZSBvZiB0aGUgbW9yZSBmdW4gYml0cyBpbiBzb2Z0d2FyZSBzbyB0aGV5IGRvbid0IGdldCBsb3N0Ci0gKiB3aGVuIGNoZWNraW5nIHRoZSBMU1IgaW4gb3RoZXIgY29kZSBwYXRocyAoVFgpLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBVQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXVhcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHVhcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVhcnQtPmxzciA9IDA7Ci0JYmZpbl93cml0ZTE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IsIC0xKTsKLX0KLQogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZwl1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQJCXVhcnRfaXJxOwpAQCAtMTQ1LDMgKzc1LDUgQEAKIH07CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKKworI2luY2x1ZGUgPGFzbS9iZmluX3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IGExMmQ0YjYuLmJhYTA5NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsNyArMSw3IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCkBAIC0xMCwzNCArMTAsMjQgQEAKICNkZWZpbmUgQkY1MzdfRkFNSUxZCiAKICNpbmNsdWRlICJiZjUzNy5oIgotI2luY2x1ZGUgImRlZkJGNTM0LmgiCiAjaW5jbHVkZSAiYW5vbWFseS5oIgogCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisjaWZkZWYgQ09ORklHX0JGNTM0CisjIGluY2x1ZGUgImRlZkJGNTM0LmgiCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19CRjUzNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MzYpCi0jaW5jbHVkZSAiZGVmQkY1MzcuaCIKKyMgaW5jbHVkZSAiZGVmQkY1MzcuaCIKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQotI2luY2x1ZGUgImNkZWZCRjUzNC5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MzcpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KQotI2luY2x1ZGUgImNkZWZCRjUzNy5oIgorIyBpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisjIGlmZGVmIENPTkZJR19CRjUzNAorIyAgaW5jbHVkZSAiY2RlZkJGNTM0LmgiCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0JGNTM3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNikKKyMgIGluY2x1ZGUgImNkZWZCRjUzNy5oIgorIyBlbmRpZgogI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJMgotCi0jZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVIgICAgICAgICAgICAgIDB4MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICAgICovCi0jZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKaW5kZXggZmJlYjM1ZS4uNTYzZWRlOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KQEAgLTcsMTQgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjUzNF9ICiAjZGVmaW5lIF9DREVGX0JGNTM0X0gKIAotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zIAkJCQkJCQkJCSovCi0jaW5jbHVkZSAiZGVmQkY1MzQuaCIKLQotLyogSW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgCQkJCQkJCQkqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0RJVikKQEAgLTM1NSwxNiArMzQ3LDEwIEBACiAjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFNUQVQodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRUJJVV9TRFNUQVQsdmFsKQogCiAvKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX1BFUigpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX1BFUih2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ19QRVIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX0NOVCgpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ19DTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX0NOVCh2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ19DTlQsdmFsKQotCi0vKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENQRVIoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFfVENQRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDUEVSKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDUEVSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ0NOVCgpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENDTlQodmFsKSAgICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFfVENDTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19QRVIoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQ19UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19QRVIodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQ19UQ19QRVIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19DTlQoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQ19UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQ19UQ19DTlQodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQ19UQ19DTlQsdmFsKQogCiAvKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KICNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQpAQCAtMTc0Nyw3ICsxNzMzLDQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ09VTlQoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCx2YWwpCiAKLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1MzRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM3LmgKaW5kZXggOTM2M2MzOS4uMTllYzIxZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KQEAgLTEwLDkgKzEwLDYgQEAKIC8qIEluY2x1ZGUgTU1ScyBDb21tb24gdG8gQkY1MzQgCQkJCQkJCQkqLwogI2luY2x1ZGUgImNkZWZCRjUzNC5oIgogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zIAkJCQkJCQkJCSovCi0jaW5jbHVkZSAiZGVmQkY1MzcuaCIKLQogLyogSW5jbHVkZSBNYWNybyAiRGVmaW5lcyIgRm9yIEVNQUMgKFVuaXF1ZSB0byBCRjUzNi9CRjUzNwkJKi8KIC8qIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCSgweEZGQzAzMDAwIC0gMHhGRkMwMzFGRikgCQkJCQkJKi8KICNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfT1BNT0RFKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDMyKEVNQUNfT1BNT0RFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNC5oCmluZGV4IDAzMjNlNmIuLjcyNWJiMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsOSArNyw2IEBACiAjaWZuZGVmIF9ERUZfQkY1MzRfSAogI2RlZmluZSBfREVGX0JGNTM0X0gKIAotLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MywxMiArMTkwLDggQEAKICNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIC8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIERNQV9UQ19QRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgRE1BX1RDX0NOVAkJCTB4RkZDMDBCMTAJLyogVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyCSovCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgRE1BX1RDUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIERNQV9UQ0NOVAkJCTB4RkZDMDBCMTAJLyogVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQUNfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIERNQUNfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KIAogLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCiAjZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KQEAgLTEwMjksNDggKzEwMjIsNiBAQAogI2RlZmluZSBJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAgICAgICAgICAqLwogI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICAgICAgICAgKi8KIAotLyogKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBVQVJUeF9MQ1IgTWFza3MJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBXTFMoeCkJCSgoKHgpLTUpICYgMHgwMykJLyogV29yZCBMZW5ndGggU2VsZWN0ICAgKi8KLSNkZWZpbmUgU1RCCQkJMHgwNAkvKiBTdG9wIEJpdHMgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBFTgkJCTB4MDgJLyogUGFyaXR5IEVuYWJsZSAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBFUFMJCQkweDEwCS8qIEV2ZW4gUGFyaXR5IFNlbGVjdCAgICovCi0jZGVmaW5lIFNUUAkJCTB4MjAJLyogU3RpY2sgUGFyaXR5ICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTQgkJCTB4NDAJLyogU2V0IEJyZWFrICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBETEFCCQkweDgwCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzICovCi0KLS8qIFVBUlR4X01DUiBNYXNrCQkJCQkJCQkJCSovCi0jZGVmaW5lIExPT1BfRU5BCQkweDEwCS8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICAgICAgICAgKi8KLSNkZWZpbmUgTE9PUF9FTkFfUAkweDA0Ci0vKiBVQVJUeF9MU1IgTWFza3MJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRFIJCQkweDAxCS8qIERhdGEgUmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRQkJCTB4MDIJLyogT3ZlcnJ1biBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBFCQkJMHgwNAkvKiBQYXJpdHkgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRkUJCQkweDA4CS8qIEZyYW1pbmcgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCSQkJCTB4MTAJLyogQnJlYWsgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRIUkUJCTB4MjAJLyogVEhSIEVtcHR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRFTVQJCTB4NDAJLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eSAgICAgICAqLwotCi0vKiBVQVJUeF9JRVIgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBFUkJGSQkJMHgwMQkvKiBFbmFibGUgUmVjZWl2ZSBCdWZmZXIgRnVsbCBJbnRlcnJ1cHQgICAgICAgICAqLwotI2RlZmluZSBFVEJFSQkJMHgwMgkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5IEludGVycnVwdCAgICAgICAqLwotI2RlZmluZSBFTFNJCQkweDA0CS8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogVUFSVHhfSUlSIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBOSU5UCQkweDAxCS8qIFBlbmRpbmcgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1RYX1JFQURZICAgIDB4MDIJLyogVUFSVF9USFIgZW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1JYX1JFQURZICAgIDB4MDQJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJLyogUmVjZWl2ZSBsaW5lIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1NUQVRVUwkweDA2Ci0KLS8qIFVBUlR4X0dDVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVUNFTgkJMHgwMQkvKiBFbmFibGUgVUFSVHggQ2xvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJUkVOCQkweDAyCS8qIEVuYWJsZSBJckRBIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFBPTEMJCTB4MDQJLyogSXJEQSBUWCBQb2xhcml0eSBDaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUlBPTEMJCTB4MDgJLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlBFCQkJMHgxMAkvKiBGb3JjZSBQYXJpdHkgRXJyb3IgT24gVHJhbnNtaXQgICAgICAgKi8KLSNkZWZpbmUgRkZFCQkJMHgyMAkvKiBGb3JjZSBGcmFtaW5nIEVycm9yIE9uIFRyYW5zbWl0ICAgICAgKi8KLQogLyogICoqKioqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFRJTUVSX0VOQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLwogI2RlZmluZSBUSU1FTjAJCQkweDAwMDEJLyogRW5hYmxlIFRpbWVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE0MSw2MiArMTA5Miw2IEBACiAjZGVmaW5lIEVNVV9SVU4JCQkweDAyMDAJLyogRW11bGF0aW9uIEJlaGF2aW9yIFNlbGVjdCAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRVJSX1RZUAkJCTB4QzAwMAkvKiBFcnJvciBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotLyogKioqKioqKioqKioqKioqKioqICAgR1BJTyBQT1JUUyBGLCBHLCBIIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAgTWFza3MgCQkJCSovCi0vKiBQb3J0IEYgTWFza3MgCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQRjAJCTB4MDAwMQotI2RlZmluZSBQRjEJCTB4MDAwMgotI2RlZmluZSBQRjIJCTB4MDAwNAotI2RlZmluZSBQRjMJCTB4MDAwOAotI2RlZmluZSBQRjQJCTB4MDAxMAotI2RlZmluZSBQRjUJCTB4MDAyMAotI2RlZmluZSBQRjYJCTB4MDA0MAotI2RlZmluZSBQRjcJCTB4MDA4MAotI2RlZmluZSBQRjgJCTB4MDEwMAotI2RlZmluZSBQRjkJCTB4MDIwMAotI2RlZmluZSBQRjEwCTB4MDQwMAotI2RlZmluZSBQRjExCTB4MDgwMAotI2RlZmluZSBQRjEyCTB4MTAwMAotI2RlZmluZSBQRjEzCTB4MjAwMAotI2RlZmluZSBQRjE0CTB4NDAwMAotI2RlZmluZSBQRjE1CTB4ODAwMAotCi0vKiBQb3J0IEcgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQRzAJCTB4MDAwMQotI2RlZmluZSBQRzEJCTB4MDAwMgotI2RlZmluZSBQRzIJCTB4MDAwNAotI2RlZmluZSBQRzMJCTB4MDAwOAotI2RlZmluZSBQRzQJCTB4MDAxMAotI2RlZmluZSBQRzUJCTB4MDAyMAotI2RlZmluZSBQRzYJCTB4MDA0MAotI2RlZmluZSBQRzcJCTB4MDA4MAotI2RlZmluZSBQRzgJCTB4MDEwMAotI2RlZmluZSBQRzkJCTB4MDIwMAotI2RlZmluZSBQRzEwCTB4MDQwMAotI2RlZmluZSBQRzExCTB4MDgwMAotI2RlZmluZSBQRzEyCTB4MTAwMAotI2RlZmluZSBQRzEzCTB4MjAwMAotI2RlZmluZSBQRzE0CTB4NDAwMAotI2RlZmluZSBQRzE1CTB4ODAwMAotCi0vKiBQb3J0IEggTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQSDAJCTB4MDAwMQotI2RlZmluZSBQSDEJCTB4MDAwMgotI2RlZmluZSBQSDIJCTB4MDAwNAotI2RlZmluZSBQSDMJCTB4MDAwOAotI2RlZmluZSBQSDQJCTB4MDAxMAotI2RlZmluZSBQSDUJCTB4MDAyMAotI2RlZmluZSBQSDYJCTB4MDA0MAotI2RlZmluZSBQSDcJCTB4MDA4MAotI2RlZmluZSBQSDgJCTB4MDEwMAotI2RlZmluZSBQSDkJCTB4MDIwMAotI2RlZmluZSBQSDEwCTB4MDQwMAotI2RlZmluZSBQSDExCTB4MDgwMAotI2RlZmluZSBQSDEyCTB4MTAwMAotI2RlZmluZSBQSDEzCTB4MjAwMAotI2RlZmluZSBQSDE0CTB4NDAwMAotI2RlZmluZSBQSDE1CTB4ODAwMAotCiAvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEVCSVVfQU1HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwogI2RlZmluZSBBTUNLRU4JCQkweDAwMDEJLyogRW5hYmxlIENMS09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTIzLDcgKzE0MTgsNyBAQAogI2RlZmluZQlTQUREX0xFTgkweDAwMDIJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUJU1REVkFMCQkweDAwMDQJLyogU2xhdmUgVHJhbnNtaXQgRGF0YSBWYWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lCU5BSwkJCTB4MDAwOAkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLwotI2RlZmluZQlHRU4JCQkweDAwMTAJLyogR2VuZXJhbCBDYWxsIEFkcnJlc3MgTWF0Y2hpbmcgRW5hYmxlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZQlHRU4JCQkweDAwMTAJLyogR2VuZXJhbCBDYWxsIEFkZHJlc3MgTWF0Y2hpbmcgRW5hYmxlZCAgICAgICAgICAgICAgICAqLwogCiAvKiBUV0lfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCiAjZGVmaW5lCVNESVIJCTB4MDAwMQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNy5oCmluZGV4IDhjYjVkNWMuLjNkNDcxZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsOSArNyw2IEBACiAjaWZuZGVmIF9ERUZfQkY1MzdfSAogI2RlZmluZSBfREVGX0JGNTM3X0gKIAotLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCiAvKiBJbmNsdWRlIGFsbCBNTVIgYW5kIGJpdCBkZWZpbmVzIGNvbW1vbiB0byBCRjUzNCAqLwogI2luY2x1ZGUgImRlZkJGNTM0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZjgwYzI5OS4uZmJhNjA2YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTYyLDQgKzYyLDggQEAKICNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCiAjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWcuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1oLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCAxNjljMTA2Li45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNTcgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9NQUNIX1BMTF9ICi0jZGVmaW5lIF9NQUNIX1BMTF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KLQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCmluZGV4IGM2ZmIwYTUuLmU2MTQyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKQEAgLTgyLDcgKzgyLDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0xMjUsNyArMTI1LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDJfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQyX1RYLCBQX1VBUlQyX1JYLCAwCiB9OwogCkBAIC0yODIsOSArMjgyLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtMzE2LDkgKzMxNiw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKQEAgLTM1MCw3ICszNTAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQyX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDJfVEZTLCBQX1NQT1JUMl9EVFBSSSwgUF9TUE9SVDJfVFNDTEssIFBfU1BPUlQyX1JGUywKIAlQX1NQT1JUMl9EUlBSSSwgUF9TUE9SVDJfUlNDTEssIFBfU1BPUlQyX0RSU0VDLCBQX1NQT1JUMl9EVFNFQywgMAogfTsKQEAgLTM4NCw3ICszODQsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0M19wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQzX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDNfVEZTLCBQX1NQT1JUM19EVFBSSSwgUF9TUE9SVDNfVFNDTEssIFBfU1BPUlQzX1JGUywKIAlQX1NQT1JUM19EUlBSSSwgUF9TUE9SVDNfUlNDTEssIFBfU1BPUlQzX0RSU0VDLCBQX1NQT1JUM19EVFNFQywgMAogfTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DQU5fQkZJTikgfHwgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU5fTU9EVUxFKQotdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0gewogCVBfQ0FOMF9SWCwgUF9DQU4wX1RYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKaW5kZXggNWRjMDIyNS4uY2NlOGVmNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApAQCAtMzIsMTQgKzMyLDE0IEBACiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTdfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExOF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE5X05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfRDBfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMF9TMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX0QxX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfUzFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX1MwX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QyX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDNfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MzX05FWFRfREVTQ19QVFIsCiB9OwogRVhQT1JUX1NZTUJPTChkbWFfaW9fYmFzZV9hZGRyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NmUyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCA1YzE0ODE0Li5iZWI1MDJlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsMzYgKzQsOSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9JRVIodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCwgdikgICAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSB8ICh2KSkKLSNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCwgdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQotI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9MQ1IodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQotI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDEpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQotI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQotI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKIApAQCAtNTQsNTAgKzI3LDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgotCi0vKgotICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYwotICovCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7Ci0Jc3RydWN0IHVhcnRfcG9ydAlwb3J0OwotCXVuc2lnbmVkIGludAkJb2xkX3N0YXR1czsKLQlpbnQJCQlzdGF0dXNfaXJxOwotCXVuc2lnbmVkIGludCBsc3I7Ci0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQotCWludAkJCXR4X2RvbmU7Ci0JaW50CQkJdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQJCQlyeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUwotCXN0cnVjdCB0aW1lcl9saXN0CWN0c190aW1lcjsKLQlpbnQJCWN0c19waW47Ci0JaW50CQlydHNfcGluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKLSAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAotICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1YXJ0LT5sc3IgPSAwOwotCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Ci19Ci0KIHN0cnVjdCBiZmluX3NlcmlhbF9yZXMgewogCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CiAJaW50CQl1YXJ0X2lycTsKQEAgLTE2MCwzICs4OSw1IEBACiB9OwogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCisKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCAwOGI1ZWFiLi43OTFkMDg0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC0xMCwzMSArMTAsMjQgQEAKICNkZWZpbmUgQkY1MzhfRkFNSUxZCiAKICNpbmNsdWRlICJiZjUzOC5oIgotI2luY2x1ZGUgImRlZkJGNTM5LmgiCiAjaW5jbHVkZSAiYW5vbWFseS5oIgogCi0KLSNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCi0jaW5jbHVkZSAiY2RlZkJGNTM4LmgiCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRjUzOSkKLSNpbmNsdWRlICJjZGVmQkY1MzkuaCIKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpZmRlZiBDT05GSUdfQkY1MzgKKyMgaW5jbHVkZSAiZGVmQkY1MzguaCIKICNlbmRpZgorI2lmZGVmIENPTkZJR19CRjUzOQorIyBpbmNsdWRlICJkZWZCRjUzOS5oIgogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTMKLQotI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLwotI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyMgaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorIyBpZmRlZiBDT05GSUdfQkY1MzgKKyMgIGluY2x1ZGUgImNkZWZCRjUzOC5oIgorIyBlbmRpZgorIyBpZmRlZiBDT05GSUdfQkY1MzkKKyMgIGluY2x1ZGUgImNkZWZCRjUzOS5oIgorIyBlbmRpZgorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKaW5kZXggMDg1YjA2Yi4uZjZhNTY3OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1MzhfSAogI2RlZmluZSBfQ0RFRl9CRjUzOF9ICiAKLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotLyppbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zKi8KLSNpbmNsdWRlICJkZWZCRjUzOS5oIgotCi0vKmluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KICNkZWZpbmUgYmZpbl93cml0ZVBUUihhZGRyLCB2YWwpIGJmaW5fd3JpdGUzMihhZGRyLCB2YWwpCiAKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCkBAIC00ODcsMTAgKzQ3OSwxMCBAQAogI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKSAgICAgYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkgICAgICAgIGJmaW5fcmVhZDE2KEVCSVVfU0RTVEFUKQogI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RTVEFUKHZhbCkgICAgYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1RDX1BFUigpICAgICAgICBiZmluX3JlYWQxNihETUEwX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1RDX1BFUih2YWwpICAgIGJmaW5fd3JpdGUxNihETUEwX1RDX1BFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9UQ19DTlQoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9UQ19DTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9UQ19DTlQodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMF9UQ19DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUMwX1RDX1BFUigpICAgICAgIGJmaW5fcmVhZDE2KERNQUMwX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDMF9UQ19QRVIodmFsKSAgIGJmaW5fd3JpdGUxNihETUFDMF9UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUMwX1RDX0NOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQUMwX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDMF9UQ19DTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUFDMF9UQ19DTlQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEwX05FWFRfREVTQ19QVFIpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX05FWFRfREVTQ19QVFIsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUEwX1NUQVJUX0FERFIpCkBAIC02OTksMTAgKzY5MSwxMCBAQAogI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9YX0NPVU5ULCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE3X0NVUlJfWV9DT1VOVCkKICNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9UQ19QRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9UQ19QRVIodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMV9UQ19QRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTFfVENfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMV9UQ19QRVIoKSAgICAgICBiZmluX3JlYWQxNihETUFDMV9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzFfVENfUEVSKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BQzFfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMV9UQ19DTlQoKSAgICAgICBiZmluX3JlYWQxNihETUFDMV9UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzFfVENfQ05UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BQzFfVENfQ05ULCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BOF9ORVhUX0RFU0NfUFRSKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQThfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9ORVhUX0RFU0NfUFRSLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BOF9TVEFSVF9BRERSKQpAQCAtMTAxNSwyNzMgKzEwMDcsMjE0IEBACiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X0NVUlJfWF9DT1VOVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTlfQ1VSUl9ZX0NPVU5UKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSAgYmZpbl9yZWFkX01ETUEwX1MwX0NPTkZJRygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKSBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKSAgYmZpbl9yZWFkX01ETUEwX1MwX0lSUV9TVEFUVVMoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzBfSVJRX1NUQVRVUyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMF9TMF9YX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX01PRElGWSgpICBiZmluX3JlYWRfTURNQTBfUzBfWV9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUEwX1MwX1lfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpICBiZmluX3JlYWRfTURNQTBfUzBfWF9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMF9YX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpICBiZmluX3JlYWRfTURNQTBfUzBfWV9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpICBiZmluX3JlYWRfTURNQTBfUzBfU1RBUlRfQUREUigpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMF9TVEFSVF9BRERSKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMF9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUEwX0QwX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTBfRDBfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUEwX0QwX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX0QwX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX0QwX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX0QwX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUEwX0QwX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUih2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMV9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUEwX1MxX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTBfUzFfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUEwX1MxX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX1MxX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMV9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX1MxX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzFfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX1MxX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzFfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUEwX1MxX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzFfU1RBUlRfQUREUih2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NPTkZJRygpICBiZmluX3JlYWRfTURNQTBfRDFfQ09ORklHKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDFfQ09ORklHKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpICBiZmluX3JlYWRfTURNQTBfRDFfSVJRX1NUQVRVUygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMV9JUlFfU1RBVFVTKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX0QxX1hfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMV9YX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMF9EMV9ZX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDFfWV9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9EMV9YX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX0QxX1hfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9EMV9ZX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX0QxX1lfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMF9EMV9TVEFSVF9BRERSKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUEwX0QxX1NUQVJUX0FERFIodmFsKQotCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfRDBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQV9TMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BX0QxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfUzFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX0QyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX0QyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9EMl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9EMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9EMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9EMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX0QyX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQV9EMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BX0QyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX0QyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX0QyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzJfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BX1MyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX1MyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX1MyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX1MyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX1MyX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzJfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BX1MyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUFfUzJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfUzJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfUzJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EM19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX0QzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfRDNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9EM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MzX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MzX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TM19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQV9TM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BX1MzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX0NVUlJfWV9DT1VOVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPTlRST0woKSAgICAgICAgYmZpbl9yZWFkMTYoUFBJX0NPTlRST0wpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPTlRST0wodmFsKSAgICBiZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKSAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCkBAIC0yMDI0LDcgKzE5NTcsNCBAQAogI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfSUQxKCkgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfSUQxKQogI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0lEMSh2YWwpICAgYmZpbl93cml0ZTE2KENBTl9NQjMxX0lEMSwgdmFsKQogCi0vKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLwotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaAppbmRleCAxOThjNGJiLi5hY2MxNWYzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKQEAgLTEsNiArMSw3IEBACi0vKiBETyBOT1QgRURJVCBUSElTIEZJTEUKLSAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWNkZWYtaGVhZGVycy54c2wKLSAqIERPIE5PVCBFRElUIFRISVMgRklMRQorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTM5X0gKQEAgLTksNyArMTAsNiBAQAogLyogSW5jbHVkZSBNTVJzIENvbW1vbiB0byBCRjUzOCAJCQkJCQkJCSovCiAjaW5jbHVkZSAiY2RlZkJGNTM4LmgiCiAKLQogI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9DT05GSUcpCiAjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoTVhWUl9DT05GSUcsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUExMX0NUTF8wKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUExMX0NUTF8wKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyN2Y4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM4LmgKQEAgLTAsMCArMSwxODI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQorICovCisKKyNpZm5kZWYgX0RFRl9CRjUzOF9ICisjZGVmaW5lIF9ERUZfQkY1MzhfSAorCisvKiBDbG9jay9SZWd1bGF0b3IgQ29udHJvbCAoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpICovCisjZGVmaW5lCVBMTF9DVEwJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIHJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9ESVYJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJVlJfQ1RMCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9TVEFUCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJUExMX0xPQ0tDTlQJCTB4RkZDMDAwMTAJLyogUExMIExvY2sJQ291bnQgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJQ0hJUElECQkJMHhGRkMwMDAxNAkvKiBDaGlwCUlEIFJlZ2lzdGVyICovCisKKy8qIENISVBJRCBNYXNrcyAqLworI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCisjZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQorCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKSAqLworI2RlZmluZQlTV1JTVAkJCTB4RkZDMDAxMDAgIC8qIFNvZnR3YXJlCVJlc2V0IFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVNZU0NSCQkJMHhGRkMwMDEwNCAgLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gcmVnaXN0ZSAqLworI2RlZmluZQlTSUNfUlZFQ1QJCTB4RkZDMDAxMDgKKyNkZWZpbmUJU0lDX0lNQVNLMAkJMHhGRkMwMDEwQyAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0lDX0lBUjAJCTB4RkZDMDAxMTAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU0lDX0lBUjEJCTB4RkZDMDAxMTQgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lBUjIJCTB4RkZDMDAxMTggIC8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU0lDX0lTUjAJCQkweEZGQzAwMTIwICAvKiBJbnRlcnJ1cHQgU3RhdHVzCVJlZ2lzdGVyICovCisjZGVmaW5lCVNJQ19JV1IwCQkJMHhGRkMwMDEyNCAgLyogSW50ZXJydXB0IFdha2V1cAlSZWdpc3RlciAqLworI2RlZmluZQlTSUNfSU1BU0sxCQkJMHhGRkMwMDEyOAkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JU1IxCQkJMHhGRkMwMDEyQwkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lXUjEJCQkweEZGQzAwMTMwCS8qIEludGVycnVwdCBXYWtldXAgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSUFSNAkJCTB4RkZDMDAxMzQJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgNCAqLworI2RlZmluZQlTSUNfSUFSNQkJCTB4RkZDMDAxMzgJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgNSAqLworI2RlZmluZQlTSUNfSUFSNgkJCTB4RkZDMDAxM0MJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgNiAqLworCisKKy8qIFdhdGNoZG9nIFRpbWVyICgweEZGQzAwMjAwIC0JMHhGRkMwMDJGRikgKi8KKyNkZWZpbmUJV0RPR19DVEwJMHhGRkMwMDIwMCAgLyogV2F0Y2hkb2cJQ29udHJvbAlSZWdpc3RlciAqLworI2RlZmluZQlXRE9HX0NOVAkweEZGQzAwMjA0ICAvKiBXYXRjaGRvZwlDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlXRE9HX1NUQVQJMHhGRkMwMDIwOCAgLyogV2F0Y2hkb2cJU3RhdHVzIFJlZ2lzdGVyICovCisKKworLyogUmVhbAlUaW1lIENsb2NrICgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikgKi8KKyNkZWZpbmUJUlRDX1NUQVQJMHhGRkMwMDMwMCAgLyogUlRDIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlSVENfSUNUTAkweEZGQzAwMzA0ICAvKiBSVEMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0lTVEFUCTB4RkZDMDAzMDggIC8qIFJUQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19TV0NOVAkweEZGQzAwMzBDICAvKiBSVEMgU3RvcHdhdGNoIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19BTEFSTQkweEZGQzAwMzEwICAvKiBSVEMgQWxhcm0gVGltZSBSZWdpc3RlciAqLworI2RlZmluZQlSVENfRkFTVAkweEZGQzAwMzE0ICAvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlSVENfUFJFTgkJMHhGRkMwMDMxNCAgLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIgKGFsdGVybmF0ZQltYWNybykgKi8KKworCisvKiBVQVJUMCBDb250cm9sbGVyICgweEZGQzAwNDAwCS0gMHhGRkMwMDRGRikgKi8KKyNkZWZpbmUJVUFSVDBfVEhSCSAgICAgIDB4RkZDMDA0MDAgIC8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfUkJSCSAgICAgIDB4RkZDMDA0MDAgIC8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0RMTAkgICAgICAweEZGQzAwNDAwICAvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDBfSUVSCSAgICAgIDB4RkZDMDA0MDQgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfRExICSAgICAgIDB4RkZDMDA0MDQgIC8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDBfSUlSCSAgICAgIDB4RkZDMDA0MDggIC8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9MQ1IJICAgICAgMHhGRkMwMDQwQyAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX01DUgkJCSAweEZGQzAwNDEwICAvKglNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0xTUgkgICAgICAweEZGQzAwNDE0ICAvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9TQ1IJICAgICAgMHhGRkMwMDQxQyAgLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfR0NUTAkJICAgICAweEZGQzAwNDI0CSAvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFNQSTAJQ29udHJvbGxlciAoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpICovCisKKyNkZWZpbmUJU1BJMF9DVEwJCQkweEZGQzAwNTAwICAvKiBTUEkwIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9GTEcJCQkweEZGQzAwNTA0ICAvKiBTUEkwIEZsYWcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9TVEFUCQkJMHhGRkMwMDUwOCAgLyogU1BJMCBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9UREJSCQkJMHhGRkMwMDUwQyAgLyogU1BJMCBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1JEQlIJCQkweEZGQzAwNTEwICAvKiBTUEkwIFJlY2VpdmUgRGF0YSBCdWZmZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9CQVVECQkJMHhGRkMwMDUxNCAgLyogU1BJMCBCYXVkIHJhdGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9TSEFET1cJCQkweEZGQzAwNTE4ICAvKiBTUEkwX1JEQlIgU2hhZG93CVJlZ2lzdGVyICovCisjZGVmaW5lIFNQSTBfUkVHQkFTRQkJCVNQSTBfQ1RMCisKKworLyogVElNRVIgMCwgMSwgMiBSZWdpc3RlcnMgKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKSAqLworI2RlZmluZQlUSU1FUjBfQ09ORklHCQkJMHhGRkMwMDYwMCAgICAgLyogVGltZXIJMCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSMF9DT1VOVEVSCQkJCTB4RkZDMDA2MDQgICAgIC8qIFRpbWVyCTAgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUjBfUEVSSU9ECQkJMHhGRkMwMDYwOCAgICAgLyogVGltZXIJMCBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVIwX1dJRFRICQkJMHhGRkMwMDYwQyAgICAgLyogVGltZXIJMCBXaWR0aAlSZWdpc3RlciAqLworCisjZGVmaW5lCVRJTUVSMV9DT05GSUcJCQkweEZGQzAwNjEwCS8qICBUaW1lciAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAqLworI2RlZmluZQlUSU1FUjFfQ09VTlRFUgkJCTB4RkZDMDA2MTQJLyogIFRpbWVyIDEgQ291bnRlciBSZWdpc3RlcgkgICAgICovCisjZGVmaW5lCVRJTUVSMV9QRVJJT0QJCQkweEZGQzAwNjE4CS8qICBUaW1lciAxIFBlcmlvZCBSZWdpc3RlcgkgICAgICovCisjZGVmaW5lCVRJTUVSMV9XSURUSAkJCTB4RkZDMDA2MUMJLyogIFRpbWVyIDEgV2lkdGggUmVnaXN0ZXIJICAgICAqLworCisjZGVmaW5lCVRJTUVSMl9DT05GSUcJCQkweEZGQzAwNjIwCS8qIFRpbWVyIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICovCisjZGVmaW5lCVRJTUVSMl9DT1VOVEVSCQkJMHhGRkMwMDYyNAkvKiBUaW1lciAyIENvdW50ZXIgUmVnaXN0ZXIJICAgICovCisjZGVmaW5lCVRJTUVSMl9QRVJJT0QJCQkweEZGQzAwNjI4CS8qIFRpbWVyIDIgUGVyaW9kIFJlZ2lzdGVyCSAgICAqLworI2RlZmluZQlUSU1FUjJfV0lEVEgJCQkweEZGQzAwNjJDCS8qIFRpbWVyIDIgV2lkdGggUmVnaXN0ZXIJICAgICovCisKKyNkZWZpbmUJVElNRVJfRU5BQkxFCQkJCTB4RkZDMDA2NDAJLyogVGltZXIgRW5hYmxlCVJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSX0RJU0FCTEUJCQkJMHhGRkMwMDY0NAkvKiBUaW1lciBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSX1NUQVRVUwkJCQkweEZGQzAwNjQ4CS8qIFRpbWVyIFN0YXR1cwlSZWdpc3RlciAqLworCisKKy8qIFByb2dyYW1tYWJsZQlGbGFncyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICovCisjZGVmaW5lCUZJT19GTEFHX0QJCQkJMHhGRkMwMDcwMCAgLyogRmxhZyBNYXNrIHRvIGRpcmVjdGx5IHNwZWNpZnkgc3RhdGUgb2YgcGlucyAqLworI2RlZmluZQlGSU9fRkxBR19DCQkJMHhGRkMwMDcwNCAgLyogUGVyaXBoZXJhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAoY2xlYXIpICovCisjZGVmaW5lCUZJT19GTEFHX1MJCQkweEZGQzAwNzA4ICAvKiBQZXJpcGhlcmFsIEludGVycnVwdCBGbGFnIFJlZ2lzdGVyIChzZXQpICovCisjZGVmaW5lCUZJT19GTEFHX1QJCQkJCTB4RkZDMDA3MEMgIC8qIEZsYWcgTWFzayB0byBkaXJlY3RseSB0b2dnbGUgc3RhdGUgb2YgcGlucyAqLworI2RlZmluZQlGSU9fTUFTS0FfRAkJCTB4RkZDMDA3MTAgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAoc2V0IGRpcmVjdGx5KSAqLworI2RlZmluZQlGSU9fTUFTS0FfQwkJCTB4RkZDMDA3MTQgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAoY2xlYXIpICovCisjZGVmaW5lCUZJT19NQVNLQV9TCQkJMHhGRkMwMDcxOCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChzZXQpICovCisjZGVmaW5lCUZJT19NQVNLQV9UCQkJMHhGRkMwMDcxQyAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyICh0b2dnbGUpICovCisjZGVmaW5lCUZJT19NQVNLQl9ECQkJMHhGRkMwMDcyMCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyIChzZXQgZGlyZWN0bHkpICovCisjZGVmaW5lCUZJT19NQVNLQl9DCQkJMHhGRkMwMDcyNCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyIChjbGVhcikgKi8KKyNkZWZpbmUJRklPX01BU0tCX1MJCQkweEZGQzAwNzI4ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKHNldCkgKi8KKyNkZWZpbmUJRklPX01BU0tCX1QJCQkweEZGQzAwNzJDICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKHRvZ2dsZSkgKi8KKyNkZWZpbmUJRklPX0RJUgkJCQkweEZGQzAwNzMwICAvKiBQZXJpcGhlcmFsIEZsYWcgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCUZJT19QT0xBUgkJCTB4RkZDMDA3MzQgIC8qIEZsYWcgU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lCUZJT19FREdFCQkJMHhGRkMwMDczOCAgLyogRmxhZyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX0JPVEgJCQkweEZGQzAwNzNDICAvKiBGbGFnIFNldAlvbiBCT1RICUVkZ2VzIFJlZ2lzdGVyICovCisjZGVmaW5lCUZJT19JTkVOCQkJCQkweEZGQzAwNzQwICAvKiBGbGFnIElucHV0IEVuYWJsZSBSZWdpc3RlciAgKi8KKworCisvKiBTUE9SVDAgQ29udHJvbGxlciAoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpICovCisjZGVmaW5lCVNQT1JUMF9UQ1IxCQkJCTB4RkZDMDA4MDAgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RDUjIJCQkJMHhGRkMwMDgwNCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfVENMS0RJVgkJCTB4RkZDMDA4MDggIC8qIFNQT1JUMCBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9URlNESVYJCQkweEZGQzAwODBDICAvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9UWAkJCTB4RkZDMDA4MTAgIC8qIFNQT1JUMCBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SWAkJCTB4RkZDMDA4MTggIC8qIFNQT1JUMCBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SQ1IxCQkJCTB4RkZDMDA4MjAgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JDUjIJCQkJMHhGRkMwMDgyNCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUkNMS0RJVgkJCTB4RkZDMDA4MjggIC8qIFNQT1JUMCBSZWNlaXZlIENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JGU0RJVgkJCTB4RkZDMDA4MkMgIC8qIFNQT1JUMCBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfU1RBVAkJCTB4RkZDMDA4MzAgIC8qIFNQT1JUMCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX0NITkwJCQkweEZGQzAwODM0ICAvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9NQ01DMQkJCTB4RkZDMDA4MzggIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDBfTUNNQzIJCQkweEZGQzAwODNDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQwX01UQ1MwCQkJMHhGRkMwMDg0MCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQwX01UQ1MxCQkJMHhGRkMwMDg0NCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQwX01UQ1MyCQkJMHhGRkMwMDg0OCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQwX01UQ1MzCQkJMHhGRkMwMDg0QyAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MwCQkJMHhGRkMwMDg1MCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDBfTVJDUzEJCQkweEZGQzAwODU0ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMgkJCTB4RkZDMDA4NTggIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MzCQkJMHhGRkMwMDg1QyAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMyAqLworCisKKy8qIFNQT1JUMSBDb250cm9sbGVyICgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikgKi8KKyNkZWZpbmUJU1BPUlQxX1RDUjEJCQkJMHhGRkMwMDkwMCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfVENSMgkJCQkweEZGQzAwOTA0ICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9UQ0xLRElWCQkJMHhGRkMwMDkwOCAgLyogU1BPUlQxIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RGU0RJVgkJCTB4RkZDMDA5MEMgIC8qIFNQT1JUMSBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RYCQkJMHhGRkMwMDkxMCAgLyogU1BPUlQxIFRYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JYCQkJMHhGRkMwMDkxOCAgLyogU1BPUlQxIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JDUjEJCQkJMHhGRkMwMDkyMCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUkNSMgkJCQkweEZGQzAwOTI0ICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SQ0xLRElWCQkJMHhGRkMwMDkyOCAgLyogU1BPUlQxIFJlY2VpdmUgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfUkZTRElWCQkJMHhGRkMwMDkyQyAgLyogU1BPUlQxIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9TVEFUCQkJMHhGRkMwMDkzMCAgLyogU1BPUlQxIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfQ0hOTAkJCTB4RkZDMDA5MzQgIC8qIFNQT1JUMSBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX01DTUMxCQkJMHhGRkMwMDkzOCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMV9NQ01DMgkJCTB4RkZDMDA5M0MgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDFfTVRDUzAJCQkweEZGQzAwOTQwICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDFfTVRDUzEJCQkweEZGQzAwOTQ0ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDFfTVRDUzIJCQkweEZGQzAwOTQ4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDFfTVRDUzMJCQkweEZGQzAwOTRDICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDFfTVJDUzAJCQkweEZGQzAwOTUwICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMQkJCTB4RkZDMDA5NTQgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MyCQkJMHhGRkMwMDk1OCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDFfTVJDUzMJCQkweEZGQzAwOTVDICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzICovCisKKworLyogRXh0ZXJuYWwgQnVzCUludGVyZmFjZSBVbml0ICgweEZGQzAwQTAwIC0gMHhGRkMwMEFGRikgKi8KKy8qIEFzeW5jaHJvbm91cwlNZW1vcnkgQ29udHJvbGxlciAgKi8KKyNkZWZpbmUJRUJJVV9BTUdDVEwJCQkweEZGQzAwQTAwICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUVCSVVfQU1CQ1RMMAkJMHhGRkMwMEEwNCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rCUNvbnRyb2wJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlFQklVX0FNQkNUTDEJCTB4RkZDMDBBMDggIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuawlDb250cm9sCVJlZ2lzdGVyIDEgKi8KKworLyogU0RSQU0gQ29udHJvbGxlciAqLworI2RlZmluZQlFQklVX1NER0NUTAkJCTB4RkZDMDBBMTAgIC8qIFNEUkFNIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUVCSVVfU0RCQ1RMCQkJMHhGRkMwMEExNCAgLyogU0RSQU0gQmFuayBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUVCSVVfU0RSUkMJCQkweEZGQzAwQTE4ICAvKiBTRFJBTSBSZWZyZXNoIFJhdGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMgIC8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlciAqLworCisKKworLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzICgweEZGQzAwQjAwIC0gMHhGRkMwMEJGRikgKi8KKworI2RlZmluZQlETUFDMF9UQ19QRVIJCQkweEZGQzAwQjBDCS8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BQzBfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlciAqLworCisKKworLyogRE1BIENvbnRyb2xsZXIgMCAoMHhGRkMwMEMwMAktIDB4RkZDMDBGRkYpCQkJCQkJCSAqLworCisjZGVmaW5lCURNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ09ORklHCQkJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9NT0RJRlkJCQkweEZGQzAwQzE0CS8qIERNQSBDaGFubmVsIDAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDMjAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfQUREUgkJCTB4RkZDMDBDMjQJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9JUlFfU1RBVFVTCQkJMHhGRkMwMEMyOAkvKiBETUEgQ2hhbm5lbCAwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEMyQwkvKiBETUEgQ2hhbm5lbCAwIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzMwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzM4CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzQwCS8qIERNQSBDaGFubmVsIDEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX0NPVU5UCQkJMHhGRkMwMEM1MAkvKiBETUEgQ2hhbm5lbCAxIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfTU9ESUZZCQkJMHhGRkMwMEM1QwkvKiBETUEgQ2hhbm5lbCAxIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1NUQVJUX0FERFIJCQkweEZGQzAwQzg0CS8qIERNQSBDaGFubmVsIDIgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9DT1VOVAkJCTB4RkZDMDBDOTgJLyogRE1BIENoYW5uZWwgMiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ09ORklHCQkJCTB4RkZDMDBDQzgJLyogRE1BIENoYW5uZWwgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9NT0RJRlkJCQkweEZGQzAwQ0Q0CS8qIERNQSBDaGFubmVsIDMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDRTAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfQUREUgkJCTB4RkZDMDBDRTQJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19JUlFfU1RBVFVTCQkJMHhGRkMwMENFOAkvKiBETUEgQ2hhbm5lbCAzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENFQwkvKiBETUEgQ2hhbm5lbCAzIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0YwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0Y4CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDAwCS8qIERNQSBDaGFubmVsIDQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX0NPVU5UCQkJMHhGRkMwMEQxMAkvKiBETUEgQ2hhbm5lbCA0IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfTU9ESUZZCQkJMHhGRkMwMEQxQwkvKiBETUEgQ2hhbm5lbCA0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1NUQVJUX0FERFIJCQkweEZGQzAwRDQ0CS8qIERNQSBDaGFubmVsIDUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9DT1VOVAkJCTB4RkZDMDBENTgJLyogRE1BIENoYW5uZWwgNSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ09ORklHCQkJCTB4RkZDMDBEODgJLyogRE1BIENoYW5uZWwgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9NT0RJRlkJCQkweEZGQzAwRDk0CS8qIERNQSBDaGFubmVsIDYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEQTAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfQUREUgkJCTB4RkZDMDBEQTQJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9JUlFfU1RBVFVTCQkJMHhGRkMwMERBOAkvKiBETUEgQ2hhbm5lbCA2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERBQwkvKiBETUEgQ2hhbm5lbCA2IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREIwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREI4CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BN19ORVhUX0RFU0NfUFRSCQkweEZGQzAwREMwCS8qIERNQSBDaGFubmVsIDcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX0NPVU5UCQkJMHhGRkMwMEREMAkvKiBETUEgQ2hhbm5lbCA3IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfTU9ESUZZCQkJMHhGRkMwMEREQwkvKiBETUEgQ2hhbm5lbCA3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEUwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEUwNAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9DT05GSUcJCQkweEZGQzAwRTA4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX1hfQ09VTlQJCTB4RkZDMDBFMTAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBFMTQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX1lfQ09VTlQJCTB4RkZDMDBFMTgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfWV9NT0RJRlkJCTB4RkZDMDBFMUMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX0NVUlJfREVTQ19QVFIJMHhGRkMwMEUyMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRTI0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEUyOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRTJDCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEUzMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTM4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFNDAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9TVEFSVF9BRERSCQkweEZGQzAwRTQ0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9DT05GSUcJCQkweEZGQzAwRTQ4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9YX0NPVU5UCQkweEZGQzAwRTUwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9YX01PRElGWQkJMHhGRkMwMEU1NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX1lfQ09VTlQJCTB4RkZDMDBFNTgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRTVDCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTYwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRTY0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBFNjgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFNkMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEU3MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEU3OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEU4MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEU4NAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9DT05GSUcJCQkweEZGQzAwRTg4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX1hfQ09VTlQJCTB4RkZDMDBFOTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBFOTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX1lfQ09VTlQJCTB4RkZDMDBFOTgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfWV9NT0RJRlkJCTB4RkZDMDBFOUMJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVBMAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRUE0CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEVBOAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEVCMAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAwRUI4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFQzAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9YX0NPVU5UCQkweEZGQzAwRUQwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9YX01PRElGWQkJMHhGRkMwMEVENAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX1lfQ09VTlQJCTB4RkZDMDBFRDgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRURDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRUUwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRUU0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFRUMJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEVGMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEVGOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoUFBJKSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpICovCisjZGVmaW5lCVBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfU1RBVFVTCQkJMHhGRkMwMTAwNAkvKiBQUEkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyCUNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVBQSV9GUkFNRQkJCTB4RkZDMDEwMTAJLyogUFBJIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZSAwCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkgKi8KKyNkZWZpbmUJVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfQ09OVFJPTAkJMHhGRkMwMTQwNAkvKiBUV0kwCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9NQVNURVJfQ1RMCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9TVEFUCTB4RkZDMDE0MTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX0FERFIJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9GSUZPX1NUQVQJCTB4RkZDMDE0MkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgVFdJMF9SRUdCQVNFCQlUV0kwX0NMS0RJVgorCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVFdJMF9QUkVTQ0FMRQkgVFdJMF9DT05UUk9MCisjZGVmaW5lCVRXSTBfSU5UX1NSQwkgVFdJMF9JTlRfU1RBVAorI2RlZmluZQlUV0kwX0lOVF9FTkFCTEUJIFRXSTBfSU5UX01BU0sKKworCisvKiBHZW5lcmFsLVB1cnBvc2UgUG9ydHMgICgweEZGQzAxNTAwIC0JMHhGRkMwMTVGRikJICovCisKKy8qIEdQSU8JUG9ydCBDIFJlZ2lzdGVyCU5hbWVzICovCisjZGVmaW5lIFBPUlRDSU9fRkVSCQkJMHhGRkMwMTUwMAkvKiBHUElPCVBpbiBQb3J0IEMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQT1JUQ0lPCQkJCTB4RkZDMDE1MTAJLyogR1BJTwlQaW4gUG9ydCBDIERhdGEJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVENJT19DTEVBUgkJCTB4RkZDMDE1MjAJLyogQ2xlYXIgR1BJTyBQaW4gUG9ydCBDIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRDSU9fU0VUCQkJMHhGRkMwMTUzMAkvKiBTZXQgR1BJTyBQaW4JUG9ydCBDIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRDSU9fVE9HR0xFCQkJMHhGRkMwMTU0MAkvKiBUb2dnbGUgR1BJTyBQaW4gUG9ydAlDIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRDSU9fRElSCQkJMHhGRkMwMTU1MAkvKiBHUElPCVBpbiBQb3J0IEMgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRDSU9fSU5FTgkJCTB4RkZDMDE1NjAJLyogR1BJTwlQaW4gUG9ydCBDIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBHUElPCVBvcnQgRCBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZSBQT1JURElPX0ZFUgkJCTB4RkZDMDE1MDQJLyogR1BJTwlQaW4gUG9ydCBEIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVERJTwkJCQkweEZGQzAxNTE0CS8qIEdQSU8JUGluIFBvcnQgRCBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRESU9fQ0xFQVIJCQkweEZGQzAxNTI0CS8qIENsZWFyIEdQSU8gUGluIFBvcnQgRCBSZWdpc3RlciAqLworI2RlZmluZSBQT1JURElPX1NFVAkJCTB4RkZDMDE1MzQJLyogU2V0IEdQSU8gUGluCVBvcnQgRCBSZWdpc3RlciAqLworI2RlZmluZSBQT1JURElPX1RPR0dMRQkJCTB4RkZDMDE1NDQJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJRCBSZWdpc3RlciAqLworI2RlZmluZSBQT1JURElPX0RJUgkJCTB4RkZDMDE1NTQJLyogR1BJTwlQaW4gUG9ydCBEIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQT1JURElPX0lORU4JCQkweEZGQzAxNTY0CS8qIEdQSU8JUGluIFBvcnQgRCBJbnB1dCBFbmFibGUJUmVnaXN0ZXIgKi8KKworLyogR1BJTwlQb3J0IEUgUmVnaXN0ZXIJTmFtZXMgKi8KKyNkZWZpbmUgUE9SVEVJT19GRVIJCQkweEZGQzAxNTA4CS8qIEdQSU8JUGluIFBvcnQgRSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRFSU8JCQkJMHhGRkMwMTUxOAkvKiBHUElPCVBpbiBQb3J0IEUgRGF0YQlSZWdpc3RlciAqLworI2RlZmluZSBQT1JURUlPX0NMRUFSCQkJMHhGRkMwMTUyOAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVEVJT19TRVQJCQkweEZGQzAxNTM4CS8qIFNldCBHUElPIFBpbglQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVEVJT19UT0dHTEUJCQkweEZGQzAxNTQ4CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVEVJT19ESVIJCQkweEZGQzAxNTU4CS8qIEdQSU8JUGluIFBvcnQgRSBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVEVJT19JTkVOCQkJMHhGRkMwMTU2OAkvKiBHUElPCVBpbiBQb3J0IEUgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCisKKy8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMUIwMCAtIDB4RkZDMDFCRkYpICovCisKKyNkZWZpbmUJRE1BQzFfVENfUEVSCQkJMHhGRkMwMUIwQwkvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQUMxX1RDX0NOVAkJCTB4RkZDMDFCMTAJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KKworCisKKy8qIERNQSBDb250cm9sbGVyIDEgKDB4RkZDMDFDMDAJLSAweEZGQzAxRkZGKQkJCQkJCQkgKi8KKyNkZWZpbmUJRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMUMwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DT05GSUcJCQkJMHhGRkMwMUMwOAkvKiBETUEgQ2hhbm5lbCA4IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9YX0NPVU5UCQkJMHhGRkMwMUMxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9YX01PRElGWQkJCTB4RkZDMDFDMTQJLyogRE1BIENoYW5uZWwgOCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1lfQ09VTlQJCQkweEZGQzAxQzE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1lfTU9ESUZZCQkJMHhGRkMwMUMxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUMyMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9BRERSCQkJMHhGRkMwMUMyNAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0lSUV9TVEFUVVMJCQkweEZGQzAxQzI4CS8qIERNQSBDaGFubmVsIDggSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1BFUklQSEVSQUxfTUFQCQkweEZGQzAxQzJDCS8qIERNQSBDaGFubmVsIDggUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDMzAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDMzgJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE5X05FWFRfREVTQ19QVFIJCTB4RkZDMDFDNDAJLyogRE1BIENoYW5uZWwgOSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1NUQVJUX0FERFIJCQkweEZGQzAxQzQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NPTkZJRwkJCQkweEZGQzAxQzQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1hfQ09VTlQJCQkweEZGQzAxQzUwCS8qIERNQSBDaGFubmVsIDkgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1hfTU9ESUZZCQkJMHhGRkMwMUM1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWV9DT1VOVAkJCTB4RkZDMDFDNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWV9NT0RJRlkJCQkweEZGQzAxQzVDCS8qIERNQSBDaGFubmVsIDkgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQzYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX0FERFIJCQkweEZGQzAxQzY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDFDNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDFDNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUM3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUM3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDFDODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfU1RBUlRfQUREUgkJMHhGRkMwMUM4NAkvKiBETUEgQ2hhbm5lbCAxMCBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NPTkZJRwkJCTB4RkZDMDFDODgJLyogRE1BIENoYW5uZWwgMTAgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9YX0NPVU5UCQkJMHhGRkMwMUM5MAkvKiBETUEgQ2hhbm5lbCAxMCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMUM5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9ZX0NPVU5UCQkJMHhGRkMwMUM5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1lfTU9ESUZZCQkJMHhGRkMwMUM5QwkvKiBETUEgQ2hhbm5lbCAxMCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQ0EwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDFDQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDFDQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxQ0FDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMUNCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQ0I4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDFDQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfU1RBUlRfQUREUgkJMHhGRkMwMUNDNAkvKiBETUEgQ2hhbm5lbCAxMSBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NPTkZJRwkJCTB4RkZDMDFDQzgJLyogRE1BIENoYW5uZWwgMTEgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9YX0NPVU5UCQkJMHhGRkMwMUNEMAkvKiBETUEgQ2hhbm5lbCAxMSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1hfTU9ESUZZCQkJMHhGRkMwMUNENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9ZX0NPVU5UCQkJMHhGRkMwMUNEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1lfTU9ESUZZCQkJMHhGRkMwMUNEQwkvKiBETUEgQ2hhbm5lbCAxMSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQ0UwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfQUREUgkJCTB4RkZDMDFDRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDFDRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAxQ0VDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMUNGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQ0Y4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDFEMDAJLyogRE1BIENoYW5uZWwgMTIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfU1RBUlRfQUREUgkJMHhGRkMwMUQwNAkvKiBETUEgQ2hhbm5lbCAxMiBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NPTkZJRwkJCTB4RkZDMDFEMDgJLyogRE1BIENoYW5uZWwgMTIgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9YX0NPVU5UCQkJMHhGRkMwMUQxMAkvKiBETUEgQ2hhbm5lbCAxMiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1hfTU9ESUZZCQkJMHhGRkMwMUQxNAkvKiBETUEgQ2hhbm5lbCAxMiBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9ZX0NPVU5UCQkJMHhGRkMwMUQxOAkvKiBETUEgQ2hhbm5lbCAxMiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1lfTU9ESUZZCQkJMHhGRkMwMUQxQwkvKiBETUEgQ2hhbm5lbCAxMiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAxRDIwCS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfQUREUgkJCTB4RkZDMDFEMjQJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0lSUV9TVEFUVVMJCTB4RkZDMDFEMjgJLyogRE1BIENoYW5uZWwgMTIgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9QRVJJUEhFUkFMX01BUAkweEZGQzAxRDJDCS8qIERNQSBDaGFubmVsIDEyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMUQzMAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRDM4CS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTEzX05FWFRfREVTQ19QVFIJCTB4RkZDMDFENDAJLyogRE1BIENoYW5uZWwgMTMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfU1RBUlRfQUREUgkJMHhGRkMwMUQ0NAkvKiBETUEgQ2hhbm5lbCAxMyBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NPTkZJRwkJCTB4RkZDMDFENDgJLyogRE1BIENoYW5uZWwgMTMgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExM19YX0NPVU5UCQkJMHhGRkMwMUQ1MAkvKiBETUEgQ2hhbm5lbCAxMyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1hfTU9ESUZZCQkJMHhGRkMwMUQ1NAkvKiBETUEgQ2hhbm5lbCAxMyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19ZX0NPVU5UCQkJMHhGRkMwMUQ1OAkvKiBETUEgQ2hhbm5lbCAxMyBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1lfTU9ESUZZCQkJMHhGRkMwMUQ1QwkvKiBETUEgQ2hhbm5lbCAxMyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX0RFU0NfUFRSCQkweEZGQzAxRDYwCS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfQUREUgkJCTB4RkZDMDFENjQJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0lSUV9TVEFUVVMJCTB4RkZDMDFENjgJLyogRE1BIENoYW5uZWwgMTMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19QRVJJUEhFUkFMX01BUAkweEZGQzAxRDZDCS8qIERNQSBDaGFubmVsIDEzIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMUQ3MAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRDc4CS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDFEODAJLyogRE1BIENoYW5uZWwgMTQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfU1RBUlRfQUREUgkJMHhGRkMwMUQ4NAkvKiBETUEgQ2hhbm5lbCAxNCBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NPTkZJRwkJCTB4RkZDMDFEODgJLyogRE1BIENoYW5uZWwgMTQgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9YX0NPVU5UCQkJMHhGRkMwMUQ5MAkvKiBETUEgQ2hhbm5lbCAxNCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1hfTU9ESUZZCQkJMHhGRkMwMUQ5NAkvKiBETUEgQ2hhbm5lbCAxNCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9ZX0NPVU5UCQkJMHhGRkMwMUQ5OAkvKiBETUEgQ2hhbm5lbCAxNCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1lfTU9ESUZZCQkJMHhGRkMwMUQ5QwkvKiBETUEgQ2hhbm5lbCAxNCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxREEwCS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfQUREUgkJCTB4RkZDMDFEQTQJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0lSUV9TVEFUVVMJCTB4RkZDMDFEQTgJLyogRE1BIENoYW5uZWwgMTQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9QRVJJUEhFUkFMX01BUAkweEZGQzAxREFDCS8qIERNQSBDaGFubmVsIDE0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfWF9DT1VOVAkJMHhGRkMwMURCMAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxREI4CS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDFEQzAJLyogRE1BIENoYW5uZWwgMTUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfU1RBUlRfQUREUgkJMHhGRkMwMURDNAkvKiBETUEgQ2hhbm5lbCAxNSBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NPTkZJRwkJCTB4RkZDMDFEQzgJLyogRE1BIENoYW5uZWwgMTUgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9YX0NPVU5UCQkJMHhGRkMwMUREMAkvKiBETUEgQ2hhbm5lbCAxNSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1hfTU9ESUZZCQkJMHhGRkMwMURENAkvKiBETUEgQ2hhbm5lbCAxNSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9ZX0NPVU5UCQkJMHhGRkMwMUREOAkvKiBETUEgQ2hhbm5lbCAxNSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1lfTU9ESUZZCQkJMHhGRkMwMUREQwkvKiBETUEgQ2hhbm5lbCAxNSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAxREUwCS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfQUREUgkJCTB4RkZDMDFERTQJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0lSUV9TVEFUVVMJCTB4RkZDMDFERTgJLyogRE1BIENoYW5uZWwgMTUgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9QRVJJUEhFUkFMX01BUAkweEZGQzAxREVDCS8qIERNQSBDaGFubmVsIDE1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMURGMAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxREY4CS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE2X05FWFRfREVTQ19QVFIJCTB4RkZDMDFFMDAJLyogRE1BIENoYW5uZWwgMTYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfU1RBUlRfQUREUgkJMHhGRkMwMUUwNAkvKiBETUEgQ2hhbm5lbCAxNiBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NPTkZJRwkJCTB4RkZDMDFFMDgJLyogRE1BIENoYW5uZWwgMTYgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9YX0NPVU5UCQkJMHhGRkMwMUUxMAkvKiBETUEgQ2hhbm5lbCAxNiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1hfTU9ESUZZCQkJMHhGRkMwMUUxNAkvKiBETUEgQ2hhbm5lbCAxNiBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9ZX0NPVU5UCQkJMHhGRkMwMUUxOAkvKiBETUEgQ2hhbm5lbCAxNiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1lfTU9ESUZZCQkJMHhGRkMwMUUxQwkvKiBETUEgQ2hhbm5lbCAxNiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAxRTIwCS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfQUREUgkJCTB4RkZDMDFFMjQJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0lSUV9TVEFUVVMJCTB4RkZDMDFFMjgJLyogRE1BIENoYW5uZWwgMTYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9QRVJJUEhFUkFMX01BUAkweEZGQzAxRTJDCS8qIERNQSBDaGFubmVsIDE2IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUUzMAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRTM4CS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDFFNDAJLyogRE1BIENoYW5uZWwgMTcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfU1RBUlRfQUREUgkJMHhGRkMwMUU0NAkvKiBETUEgQ2hhbm5lbCAxNyBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NPTkZJRwkJCTB4RkZDMDFFNDgJLyogRE1BIENoYW5uZWwgMTcgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExN19YX0NPVU5UCQkJMHhGRkMwMUU1MAkvKiBETUEgQ2hhbm5lbCAxNyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1hfTU9ESUZZCQkJMHhGRkMwMUU1NAkvKiBETUEgQ2hhbm5lbCAxNyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19ZX0NPVU5UCQkJMHhGRkMwMUU1OAkvKiBETUEgQ2hhbm5lbCAxNyBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1lfTU9ESUZZCQkJMHhGRkMwMUU1QwkvKiBETUEgQ2hhbm5lbCAxNyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX0RFU0NfUFRSCQkweEZGQzAxRTYwCS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfQUREUgkJCTB4RkZDMDFFNjQJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0lSUV9TVEFUVVMJCTB4RkZDMDFFNjgJLyogRE1BIENoYW5uZWwgMTcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19QRVJJUEhFUkFMX01BUAkweEZGQzAxRTZDCS8qIERNQSBDaGFubmVsIDE3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUU3MAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRTc4CS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDFFODAJLyogRE1BIENoYW5uZWwgMTggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfU1RBUlRfQUREUgkJMHhGRkMwMUU4NAkvKiBETUEgQ2hhbm5lbCAxOCBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NPTkZJRwkJCTB4RkZDMDFFODgJLyogRE1BIENoYW5uZWwgMTggQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9YX0NPVU5UCQkJMHhGRkMwMUU5MAkvKiBETUEgQ2hhbm5lbCAxOCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1hfTU9ESUZZCQkJMHhGRkMwMUU5NAkvKiBETUEgQ2hhbm5lbCAxOCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9ZX0NPVU5UCQkJMHhGRkMwMUU5OAkvKiBETUEgQ2hhbm5lbCAxOCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1lfTU9ESUZZCQkJMHhGRkMwMUU5QwkvKiBETUEgQ2hhbm5lbCAxOCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxRUEwCS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfQUREUgkJCTB4RkZDMDFFQTQJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0lSUV9TVEFUVVMJCTB4RkZDMDFFQTgJLyogRE1BIENoYW5uZWwgMTggSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRUFDCS8qIERNQSBDaGFubmVsIDE4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUVCMAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRUI4CS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTE5X05FWFRfREVTQ19QVFIJCTB4RkZDMDFFQzAJLyogRE1BIENoYW5uZWwgMTkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfU1RBUlRfQUREUgkJMHhGRkMwMUVDNAkvKiBETUEgQ2hhbm5lbCAxOSBTdGFydAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NPTkZJRwkJCTB4RkZDMDFFQzgJLyogRE1BIENoYW5uZWwgMTkgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9YX0NPVU5UCQkJMHhGRkMwMUVEMAkvKiBETUEgQ2hhbm5lbCAxOSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1hfTU9ESUZZCQkJMHhGRkMwMUVENAkvKiBETUEgQ2hhbm5lbCAxOSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9ZX0NPVU5UCQkJMHhGRkMwMUVEOAkvKiBETUEgQ2hhbm5lbCAxOSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1lfTU9ESUZZCQkJMHhGRkMwMUVEQwkvKiBETUEgQ2hhbm5lbCAxOSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAxRUUwCS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfQUREUgkJCTB4RkZDMDFFRTQJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0lSUV9TVEFUVVMJCTB4RkZDMDFFRTgJLyogRE1BIENoYW5uZWwgMTkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9QRVJJUEhFUkFMX01BUAkweEZGQzAxRUVDCS8qIERNQSBDaGFubmVsIDE5IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUVGMAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxRUY4CS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUFfRDJfTkVYVF9ERVNDX1BUUgkweEZGQzAxRjAwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9TVEFSVF9BRERSCQkweEZGQzAxRjA0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX0NPTkZJRwkJCTB4RkZDMDFGMDgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfWF9DT1VOVAkJMHhGRkMwMUYxMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9YX01PRElGWQkJMHhGRkMwMUYxNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfWV9DT1VOVAkJMHhGRkMwMUYxOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9ZX01PRElGWQkJMHhGRkMwMUYxQwkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjIwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9DVVJSX0FERFIJCTB4RkZDMDFGMjQJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9JUlFfU1RBVFVTCQkweEZGQzAxRjI4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGMkMJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX0NVUlJfWF9DT1VOVAkweEZGQzAxRjMwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGMzgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX1MyX05FWFRfREVTQ19QVFIJMHhGRkMwMUY0MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1NUQVJUX0FERFIJCTB4RkZDMDFGNDQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX0NPTkZJRwkJCTB4RkZDMDFGNDgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1hfQ09VTlQJCTB4RkZDMDFGNTAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1hfTU9ESUZZCQkweEZGQzAxRjU0CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfWV9DT1VOVAkJMHhGRkMwMUY1OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfWV9NT0RJRlkJCTB4RkZDMDFGNUMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9DVVJSX0RFU0NfUFRSCTB4RkZDMDFGNjAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9DVVJSX0FERFIJCTB4RkZDMDFGNjQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfSVJRX1NUQVRVUwkJMHhGRkMwMUY2OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUY2QwkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX0NVUlJfWF9DT1VOVAkweEZGQzAxRjcwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX0NVUlJfWV9DT1VOVAkweEZGQzAxRjc4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUFfRDNfTkVYVF9ERVNDX1BUUgkweEZGQzAxRjgwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19TVEFSVF9BRERSCQkweEZGQzAxRjg0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX0NPTkZJRwkJCTB4RkZDMDFGODgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfWF9DT1VOVAkJMHhGRkMwMUY5MAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19YX01PRElGWQkJMHhGRkMwMUY5NAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfWV9DT1VOVAkJMHhGRkMwMUY5OAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19ZX01PRElGWQkJMHhGRkMwMUY5QwkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkEwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19DVVJSX0FERFIJCTB4RkZDMDFGQTQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19JUlFfU1RBVFVTCQkweEZGQzAxRkE4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGQUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX0NVUlJfWF9DT1VOVAkweEZGQzAxRkIwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGQjgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX1MzX05FWFRfREVTQ19QVFIJMHhGRkMwMUZDMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1NUQVJUX0FERFIJCTB4RkZDMDFGQzQJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX0NPTkZJRwkJCTB4RkZDMDFGQzgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1hfQ09VTlQJCTB4RkZDMDFGRDAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1hfTU9ESUZZCQkweEZGQzAxRkQ0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfWV9DT1VOVAkJMHhGRkMwMUZEOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfWV9NT0RJRlkJCTB4RkZDMDFGREMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19DVVJSX0RFU0NfUFRSCTB4RkZDMDFGRTAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19DVVJSX0FERFIJCTB4RkZDMDFGRTQJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfSVJRX1NUQVRVUwkJMHhGRkMwMUZFOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUZFQwkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX0NVUlJfWF9DT1VOVAkweEZGQzAxRkYwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX0NVUlJfWV9DT1VOVAkweEZGQzAxRkY4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJICovCisjZGVmaW5lCVVBUlQxX1RIUgkJCTB4RkZDMDIwMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDFfSUlSCQkJMHhGRkMwMjAwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTENSCQkJMHhGRkMwMjAwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTUNSCQkJMHhGRkMwMjAxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0xTUgkJCTB4RkZDMDIwMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQyIENvbnRyb2xsZXIJCSgweEZGQzAyMTAwIC0gMHhGRkMwMjFGRikJICovCisjZGVmaW5lCVVBUlQyX1RIUgkJCTB4RkZDMDIxMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9SQlIJCQkweEZGQzAyMTAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0RMTAkJCTB4RkZDMDIxMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQyX0lFUgkJCTB4RkZDMDIxMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9ETEgJCQkweEZGQzAyMTA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDJfSUlSCQkJMHhGRkMwMjEwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTENSCQkJMHhGRkMwMjEwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTUNSCQkJMHhGRkMwMjExMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0xTUgkJCTB4RkZDMDIxMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfU0NSCQkJMHhGRkMwMjExQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9HQ1RMCQkJMHhGRkMwMjEyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZSAxCSgweEZGQzAyMjAwIC0gMHhGRkMwMjJGRikJCQkgKi8KKyNkZWZpbmUJVFdJMV9DTEtESVYJCQkweEZGQzAyMjAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfQ09OVFJPTAkJMHhGRkMwMjIwNAkvKiBUV0kxCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0NUTAkJMHhGRkMwMjIwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9TTEFWRV9TVEFUCQkweEZGQzAyMjBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfQUREUgkJMHhGRkMwMjIxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfQ1RMCTB4RkZDMDIyMTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX01BU1RFUl9TVEFUCTB4RkZDMDIyMTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX0FERFIJMHhGRkMwMjIxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfSU5UX1NUQVQJCTB4RkZDMDIyMjAJLyogVFdJMQlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfSU5UX01BU0sJCTB4RkZDMDIyMjQJLyogVFdJMQlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9GSUZPX0NUTAkJMHhGRkMwMjIyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9GSUZPX1NUQVQJCTB4RkZDMDIyMkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9YTVRfREFUQTgJCTB4RkZDMDIyODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfWE1UX0RBVEExNgkJMHhGRkMwMjI4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTgJCTB4RkZDMDIyODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTE2CQkweEZGQzAyMjhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lIFRXSTFfUkVHQkFTRQkJVFdJMV9DTEtESVYKKworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVFdJMV9QUkVTQ0FMRQkgIFRXSTFfQ09OVFJPTAorI2RlZmluZQlUV0kxX0lOVF9TUkMJICBUV0kxX0lOVF9TVEFUCisjZGVmaW5lCVRXSTFfSU5UX0VOQUJMRQkgIFRXSTFfSU5UX01BU0sKKworCisvKiBTUEkxCUNvbnRyb2xsZXIJCSgweEZGQzAyMzAwIC0gMHhGRkMwMjNGRikJICovCisjZGVmaW5lCVNQSTFfQ1RMCQkJMHhGRkMwMjMwMCAgLyogU1BJMSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfRkxHCQkJMHhGRkMwMjMwNCAgLyogU1BJMSBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU1RBVAkJCTB4RkZDMDIzMDggIC8qIFNQSTEgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfVERCUgkJCTB4RkZDMDIzMEMgIC8qIFNQSTEgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9SREJSCQkJMHhGRkMwMjMxMCAgLyogU1BJMSBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfQkFVRAkJCTB4RkZDMDIzMTQgIC8qIFNQSTEgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU0hBRE9XCQkJMHhGRkMwMjMxOCAgLyogU1BJMV9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkxX1JFR0JBU0UJCQlTUEkxX0NUTAorCisvKiBTUEkyCUNvbnRyb2xsZXIJCSgweEZGQzAyNDAwIC0gMHhGRkMwMjRGRikJICovCisjZGVmaW5lCVNQSTJfQ1RMCQkJMHhGRkMwMjQwMCAgLyogU1BJMiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfRkxHCQkJMHhGRkMwMjQwNCAgLyogU1BJMiBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU1RBVAkJCTB4RkZDMDI0MDggIC8qIFNQSTIgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfVERCUgkJCTB4RkZDMDI0MEMgIC8qIFNQSTIgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9SREJSCQkJMHhGRkMwMjQxMCAgLyogU1BJMiBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfQkFVRAkJCTB4RkZDMDI0MTQgIC8qIFNQSTIgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU0hBRE9XCQkJMHhGRkMwMjQxOCAgLyogU1BJMl9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkyX1JFR0JBU0UJCQlTUEkyX0NUTAorCisvKiBTUE9SVDIgQ29udHJvbGxlcgkJKDB4RkZDMDI1MDAgLSAweEZGQzAyNUZGKQkJCSAqLworI2RlZmluZQlTUE9SVDJfVENSMQkJCTB4RkZDMDI1MDAJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENSMgkJCTB4RkZDMDI1MDQJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENMS0RJVgkJMHhGRkMwMjUwOAkvKiBTUE9SVDIgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfVEZTRElWCQkweEZGQzAyNTBDCS8qIFNQT1JUMiBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RYCQkJMHhGRkMwMjUxMAkvKiBTUE9SVDIgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUlgJCQkweEZGQzAyNTE4CS8qIFNQT1JUMiBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IxCQkJMHhGRkMwMjUyMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IyCQkJMHhGRkMwMjUyNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ0xLRElWCQkweEZGQzAyNTI4CS8qIFNQT1JUMiBSZWNlaXZlIENsb2NrCURpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JGU0RJVgkJMHhGRkMwMjUyQwkvKiBTUE9SVDIgUmVjZWl2ZSBGcmFtZQlTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1NUQVQJCQkweEZGQzAyNTMwCS8qIFNQT1JUMiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX0NITkwJCQkweEZGQzAyNTM0CS8qIFNQT1JUMiBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX01DTUMxCQkweEZGQzAyNTM4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDJfTUNNQzIJCTB4RkZDMDI1M0MJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMAkJMHhGRkMwMjU0MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDJfTVRDUzEJCTB4RkZDMDI1NDQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MyCQkweEZGQzAyNTQ4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMwkJMHhGRkMwMjU0QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDJfTVJDUzAJCTB4RkZDMDI1NTAJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlTUE9SVDJfTVJDUzEJCTB4RkZDMDI1NTQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlTUE9SVDJfTVJDUzIJCTB4RkZDMDI1NTgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMiAqLworI2RlZmluZQlTUE9SVDJfTVJDUzMJCTB4RkZDMDI1NUMJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMyAqLworCisKKy8qIFNQT1JUMyBDb250cm9sbGVyCQkoMHhGRkMwMjYwMCAtIDB4RkZDMDI2RkYpCQkJICovCisjZGVmaW5lCVNQT1JUM19UQ1IxCQkJMHhGRkMwMjYwMAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ1IyCQkJMHhGRkMwMjYwNAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ0xLRElWCQkweEZGQzAyNjA4CS8qIFNQT1JUMyBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19URlNESVYJCTB4RkZDMDI2MEMJLyogU1BPUlQzIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfVFgJCQkweEZGQzAyNjEwCS8qIFNQT1JUMyBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SWAkJCTB4RkZDMDI2MTgJLyogU1BPUlQzIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjEJCQkweEZGQzAyNjIwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjIJCQkweEZGQzAyNjI0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDTEtESVYJCTB4RkZDMDI2MjgJLyogU1BPUlQzIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfUkZTRElWCQkweEZGQzAyNjJDCS8qIFNQT1JUMyBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfU1RBVAkJCTB4RkZDMDI2MzAJLyogU1BPUlQzIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfQ0hOTAkJCTB4RkZDMDI2MzQJLyogU1BPUlQzIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfTUNNQzEJCTB4RkZDMDI2MzgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUM19NQ01DMgkJMHhGRkMwMjYzQwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MwCQkweEZGQzAyNjQwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUM19NVENTMQkJMHhGRkMwMjY0NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDNfTVRDUzIJCTB4RkZDMDI2NDgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MzCQkweEZGQzAyNjRDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUM19NUkNTMAkJMHhGRkMwMjY1MAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCisjZGVmaW5lCVNQT1JUM19NUkNTMQkJMHhGRkMwMjY1NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCisjZGVmaW5lCVNQT1JUM19NUkNTMgkJMHhGRkMwMjY1OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCisjZGVmaW5lCVNQT1JUM19NUkNTMwkJMHhGRkMwMjY1QwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCisKKworLyogQ0FOIENvbnRyb2xsZXIJCSgweEZGQzAyQTAwIC0gMHhGRkMwMkZGRikJCQkJICovCisvKiBGb3IgTWFpbGJveGVzIDAtMTUJCQkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUMxCQkJCTB4RkZDMDJBMDAJLyogTWFpbGJveCBjb25maWcgcmVnIDEJICovCisjZGVmaW5lCUNBTl9NRDEJCQkJMHhGRkMwMkEwNAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMSAqLworI2RlZmluZQlDQU5fVFJTMQkJCTB4RkZDMDJBMDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RSUjEJCQkweEZGQzAyQTBDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RBMQkJCQkweEZGQzAyQTEwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAxICovCisjZGVmaW5lCUNBTl9BQTEJCQkJMHhGRkMwMkExNAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMSAqLworI2RlZmluZQlDQU5fUk1QMQkJCTB4RkZDMDJBMTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JNTDEJCQkweEZGQzAyQTFDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAxICovCisjZGVmaW5lCUNBTl9NQlRJRjEJCQkweEZGQzAyQTIwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX01CUklGMQkJCTB4RkZDMDJBMjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMSAqLworI2RlZmluZQlDQU5fTUJJTTEJCQkweEZGQzAyQTI4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JGSDEJCQkweEZGQzAyQTJDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMSAqLworI2RlZmluZQlDQU5fT1BTUzEJCQkweEZGQzAyQTMwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAxICovCisKKy8qIEZvciBNYWlsYm94ZXMgMTYtMzEJCQkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUMyCQkJCTB4RkZDMDJBNDAJLyogTWFpbGJveCBjb25maWcgcmVnIDIJICovCisjZGVmaW5lCUNBTl9NRDIJCQkJMHhGRkMwMkE0NAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMiAqLworI2RlZmluZQlDQU5fVFJTMgkJCTB4RkZDMDJBNDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RSUjIJCQkweEZGQzAyQTRDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RBMgkJCQkweEZGQzAyQTUwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAyICovCisjZGVmaW5lCUNBTl9BQTIJCQkJMHhGRkMwMkE1NAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMiAqLworI2RlZmluZQlDQU5fUk1QMgkJCTB4RkZDMDJBNTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JNTDIJCQkweEZGQzAyQTVDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAyICovCisjZGVmaW5lCUNBTl9NQlRJRjIJCQkweEZGQzAyQTYwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX01CUklGMgkJCTB4RkZDMDJBNjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMiAqLworI2RlZmluZQlDQU5fTUJJTTIJCQkweEZGQzAyQTY4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JGSDIJCQkweEZGQzAyQTZDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMiAqLworI2RlZmluZQlDQU5fT1BTUzIJCQkweEZGQzAyQTcwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAyICovCisKKyNkZWZpbmUJQ0FOX0NMT0NLCQkJMHhGRkMwMkE4MAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLworI2RlZmluZQlDQU5fVElNSU5HCQkJMHhGRkMwMkE4NAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCUNBTl9ERUJVRwkJCTB4RkZDMDJBODgJLyogRGVidWcgUmVnaXN0ZXIJCSAqLworLyogdGhlIGZvbGxvd2luZyBpcyBmb3IJYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJQ0FOX0NORgkJIENBTl9ERUJVRworCisjZGVmaW5lCUNBTl9TVEFUVVMJCQkweEZGQzAyQThDCS8qIEdsb2JhbCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0NFQwkJCQkweEZGQzAyQTkwCS8qIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0dJUwkJCQkweEZGQzAyQTk0CS8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSU0JCQkJMHhGRkMwMkE5OAkvKiBHbG9iYWwgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0dJRgkJCQkweEZGQzAyQTlDCS8qIEdsb2JhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fQ09OVFJPTAkJCTB4RkZDMDJBQTAJLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0lOVFIJCQkweEZGQzAyQUE0CS8qIEludGVycnVwdCBQZW5kaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQlRECQkJMHhGRkMwMkFBQwkvKiBNYWlsYm94IFRlbXBvcmFyeSBEaXNhYmxlIEZlYXR1cmUgKi8KKyNkZWZpbmUJQ0FOX0VXUgkJCQkweEZGQzAyQUIwCS8qIFByb2dyYW1tYWJsZQlXYXJuaW5nCUxldmVsICovCisjZGVmaW5lCUNBTl9FU1IJCQkJMHhGRkMwMkFCNAkvKiBFcnJvciBTdGF0dXMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX1VDQ05UCQkJMHhGRkMwMkFDNAkvKiBVbml2ZXJzYWwgQ291bnRlcgkgKi8KKyNkZWZpbmUJQ0FOX1VDUkMJCQkweEZGQzAyQUM4CS8qIFVuaXZlcnNhbCBDb3VudGVyIFJlbG9hZC9DYXB0dXJlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9VQ0NORgkJCTB4RkZDMDJBQ0MJLyogVW5pdmVyc2FsIENvdW50ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCisvKiBNYWlsYm94IEFjY2VwdGFuY2UgTWFza3MJCQkJCSAqLworI2RlZmluZQlDQU5fQU0wMEwJCQkweEZGQzAyQjAwCS8qIE1haWxib3ggMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAwSAkJCTB4RkZDMDJCMDQJLyogTWFpbGJveCAwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAxTAkJCTB4RkZDMDJCMDgJLyogTWFpbGJveCAxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDFICQkJMHhGRkMwMkIwQwkvKiBNYWlsYm94IDEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDJMCQkJMHhGRkMwMkIxMAkvKiBNYWlsYm94IDIgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMkgJCQkweEZGQzAyQjE0CS8qIE1haWxib3ggMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wM0wJCQkweEZGQzAyQjE4CS8qIE1haWxib3ggMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAzSAkJCTB4RkZDMDJCMUMJLyogTWFpbGJveCAzIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA0TAkJCTB4RkZDMDJCMjAJLyogTWFpbGJveCA0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDRICQkJMHhGRkMwMkIyNAkvKiBNYWlsYm94IDQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDVMCQkJMHhGRkMwMkIyOAkvKiBNYWlsYm94IDUgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNUgJCQkweEZGQzAyQjJDCS8qIE1haWxib3ggNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNkwJCQkweEZGQzAyQjMwCS8qIE1haWxib3ggNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA2SAkJCTB4RkZDMDJCMzQJLyogTWFpbGJveCA2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA3TAkJCTB4RkZDMDJCMzgJLyogTWFpbGJveCA3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDdICQkJMHhGRkMwMkIzQwkvKiBNYWlsYm94IDcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDhMCQkJMHhGRkMwMkI0MAkvKiBNYWlsYm94IDggTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOEgJCQkweEZGQzAyQjQ0CS8qIE1haWxib3ggOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOUwJCQkweEZGQzAyQjQ4CS8qIE1haWxib3ggOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA5SAkJCTB4RkZDMDJCNEMJLyogTWFpbGJveCA5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEwTAkJCTB4RkZDMDJCNTAJLyogTWFpbGJveCAxMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEwSAkJCTB4RkZDMDJCNTQJLyogTWFpbGJveCAxMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMUwJCQkweEZGQzAyQjU4CS8qIE1haWxib3ggMTEgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMUgJCQkweEZGQzAyQjVDCS8qIE1haWxib3ggMTEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTJMCQkJMHhGRkMwMkI2MAkvKiBNYWlsYm94IDEyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTJICQkJMHhGRkMwMkI2NAkvKiBNYWlsYm94IDEyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEzTAkJCTB4RkZDMDJCNjgJLyogTWFpbGJveCAxMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEzSAkJCTB4RkZDMDJCNkMJLyogTWFpbGJveCAxMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xNEwJCQkweEZGQzAyQjcwCS8qIE1haWxib3ggMTQgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xNEgJCQkweEZGQzAyQjc0CS8qIE1haWxib3ggMTQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTVMCQkJMHhGRkMwMkI3OAkvKiBNYWlsYm94IDE1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTVICQkJMHhGRkMwMkI3QwkvKiBNYWlsYm94IDE1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisKKyNkZWZpbmUJQ0FOX0FNMTZMCQkJMHhGRkMwMkI4MAkvKiBNYWlsYm94IDE2IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTZICQkJMHhGRkMwMkI4NAkvKiBNYWlsYm94IDE2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE3TAkJCTB4RkZDMDJCODgJLyogTWFpbGJveCAxNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE3SAkJCTB4RkZDMDJCOEMJLyogTWFpbGJveCAxNyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xOEwJCQkweEZGQzAyQjkwCS8qIE1haWxib3ggMTggTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xOEgJCQkweEZGQzAyQjk0CS8qIE1haWxib3ggMTggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTlMCQkJMHhGRkMwMkI5OAkvKiBNYWlsYm94IDE5IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTlICQkJMHhGRkMwMkI5QwkvKiBNYWlsYm94IDE5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIwTAkJCTB4RkZDMDJCQTAJLyogTWFpbGJveCAyMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIwSAkJCTB4RkZDMDJCQTQJLyogTWFpbGJveCAyMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMUwJCQkweEZGQzAyQkE4CS8qIE1haWxib3ggMjEgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMUgJCQkweEZGQzAyQkFDCS8qIE1haWxib3ggMjEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjJMCQkJMHhGRkMwMkJCMAkvKiBNYWlsYm94IDIyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjJICQkJMHhGRkMwMkJCNAkvKiBNYWlsYm94IDIyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIzTAkJCTB4RkZDMDJCQjgJLyogTWFpbGJveCAyMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIzSAkJCTB4RkZDMDJCQkMJLyogTWFpbGJveCAyMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNEwJCQkweEZGQzAyQkMwCS8qIE1haWxib3ggMjQgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNEgJCQkweEZGQzAyQkM0CS8qIE1haWxib3ggMjQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjVMCQkJMHhGRkMwMkJDOAkvKiBNYWlsYm94IDI1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjVICQkJMHhGRkMwMkJDQwkvKiBNYWlsYm94IDI1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI2TAkJCTB4RkZDMDJCRDAJLyogTWFpbGJveCAyNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI2SAkJCTB4RkZDMDJCRDQJLyogTWFpbGJveCAyNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yN0wJCQkweEZGQzAyQkQ4CS8qIE1haWxib3ggMjcgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yN0gJCQkweEZGQzAyQkRDCS8qIE1haWxib3ggMjcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjhMCQkJMHhGRkMwMkJFMAkvKiBNYWlsYm94IDI4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjhICQkJMHhGRkMwMkJFNAkvKiBNYWlsYm94IDI4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI5TAkJCTB4RkZDMDJCRTgJLyogTWFpbGJveCAyOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI5SAkJCTB4RkZDMDJCRUMJLyogTWFpbGJveCAyOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0zMEwJCQkweEZGQzAyQkYwCS8qIE1haWxib3ggMzAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0zMEgJCQkweEZGQzAyQkY0CS8qIE1haWxib3ggMzAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzFMCQkJMHhGRkMwMkJGOAkvKiBNYWlsYm94IDMxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzFICQkJMHhGRkMwMkJGQwkvKiBNYWlsYm94IDMxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisKKy8qIENBTiBBY2NlcHRhbmNlIE1hc2sgTWFjcm9zICovCisjZGVmaW5lCUNBTl9BTV9MKHgpCQkJKENBTl9BTTAwTCsoKHgpKjB4OCkpCisjZGVmaW5lCUNBTl9BTV9IKHgpCQkJKENBTl9BTTAwSCsoKHgpKjB4OCkpCisKKy8qIE1haWxib3ggUmVnaXN0ZXJzCQkJCQkJCQkJICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEwCQkweEZGQzAyQzAwCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTEJCTB4RkZDMDJDMDQJLyogTWFpbGJveCAwIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTIJCTB4RkZDMDJDMDgJLyogTWFpbGJveCAwIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfREFUQTMJCTB4RkZDMDJDMEMJLyogTWFpbGJveCAwIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfTEVOR1RICQkweEZGQzAyQzEwCS8qIE1haWxib3ggMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX1RJTUVTVEFNUAkweEZGQzAyQzE0CS8qIE1haWxib3ggMCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0lEMAkJMHhGRkMwMkMxOAkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDBfSUQxCQkweEZGQzAyQzFDCS8qIE1haWxib3ggMCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwMV9EQVRBMAkJMHhGRkMwMkMyMAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEExCQkweEZGQzAyQzI0CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEEyCQkweEZGQzAyQzI4CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0RBVEEzCQkweEZGQzAyQzJDCS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0xFTkdUSAkJMHhGRkMwMkMzMAkvKiBNYWlsYm94IDEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9USU1FU1RBTVAJMHhGRkMwMkMzNAkvKiBNYWlsYm94IDEgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9JRDAJCTB4RkZDMDJDMzgJLyogTWFpbGJveCAxIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAxX0lEMQkJMHhGRkMwMkMzQwkvKiBNYWlsYm94IDEgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDJfREFUQTAJCTB4RkZDMDJDNDAJLyogTWFpbGJveCAyIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMQkJMHhGRkMwMkM0NAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMgkJMHhGRkMwMkM0OAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9EQVRBMwkJMHhGRkMwMkM0QwkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9MRU5HVEgJCTB4RkZDMDJDNTAJLyogTWFpbGJveCAyIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfVElNRVNUQU1QCTB4RkZDMDJDNTQJLyogTWFpbGJveCAyIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfSUQwCQkweEZGQzAyQzU4CS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMl9JRDEJCTB4RkZDMDJDNUMJLyogTWFpbGJveCAyIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEwCQkweEZGQzAyQzYwCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTEJCTB4RkZDMDJDNjQJLyogTWFpbGJveCAzIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTIJCTB4RkZDMDJDNjgJLyogTWFpbGJveCAzIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfREFUQTMJCTB4RkZDMDJDNkMJLyogTWFpbGJveCAzIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfTEVOR1RICQkweEZGQzAyQzcwCS8qIE1haWxib3ggMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX1RJTUVTVEFNUAkweEZGQzAyQzc0CS8qIE1haWxib3ggMyBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0lEMAkJMHhGRkMwMkM3OAkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDNfSUQxCQkweEZGQzAyQzdDCS8qIE1haWxib3ggMyBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwNF9EQVRBMAkJMHhGRkMwMkM4MAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEExCQkweEZGQzAyQzg0CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEEyCQkweEZGQzAyQzg4CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0RBVEEzCQkweEZGQzAyQzhDCS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0xFTkdUSAkJMHhGRkMwMkM5MAkvKiBNYWlsYm94IDQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9USU1FU1RBTVAJMHhGRkMwMkM5NAkvKiBNYWlsYm94IDQgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9JRDAJCTB4RkZDMDJDOTgJLyogTWFpbGJveCA0IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA0X0lEMQkJMHhGRkMwMkM5QwkvKiBNYWlsYm94IDQgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDVfREFUQTAJCTB4RkZDMDJDQTAJLyogTWFpbGJveCA1IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMQkJMHhGRkMwMkNBNAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMgkJMHhGRkMwMkNBOAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9EQVRBMwkJMHhGRkMwMkNBQwkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9MRU5HVEgJCTB4RkZDMDJDQjAJLyogTWFpbGJveCA1IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfVElNRVNUQU1QCTB4RkZDMDJDQjQJLyogTWFpbGJveCA1IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfSUQwCQkweEZGQzAyQ0I4CS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNV9JRDEJCTB4RkZDMDJDQkMJLyogTWFpbGJveCA1IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEwCQkweEZGQzAyQ0MwCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTEJCTB4RkZDMDJDQzQJLyogTWFpbGJveCA2IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTIJCTB4RkZDMDJDQzgJLyogTWFpbGJveCA2IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfREFUQTMJCTB4RkZDMDJDQ0MJLyogTWFpbGJveCA2IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfTEVOR1RICQkweEZGQzAyQ0QwCS8qIE1haWxib3ggNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X1RJTUVTVEFNUAkweEZGQzAyQ0Q0CS8qIE1haWxib3ggNiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0lEMAkJMHhGRkMwMkNEOAkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDZfSUQxCQkweEZGQzAyQ0RDCS8qIE1haWxib3ggNiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwN19EQVRBMAkJMHhGRkMwMkNFMAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEExCQkweEZGQzAyQ0U0CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEEyCQkweEZGQzAyQ0U4CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0RBVEEzCQkweEZGQzAyQ0VDCS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0xFTkdUSAkJMHhGRkMwMkNGMAkvKiBNYWlsYm94IDcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19USU1FU1RBTVAJMHhGRkMwMkNGNAkvKiBNYWlsYm94IDcgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19JRDAJCTB4RkZDMDJDRjgJLyogTWFpbGJveCA3IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA3X0lEMQkJMHhGRkMwMkNGQwkvKiBNYWlsYm94IDcgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDhfREFUQTAJCTB4RkZDMDJEMDAJLyogTWFpbGJveCA4IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMQkJMHhGRkMwMkQwNAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMgkJMHhGRkMwMkQwOAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9EQVRBMwkJMHhGRkMwMkQwQwkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9MRU5HVEgJCTB4RkZDMDJEMTAJLyogTWFpbGJveCA4IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfVElNRVNUQU1QCTB4RkZDMDJEMTQJLyogTWFpbGJveCA4IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfSUQwCQkweEZGQzAyRDE4CS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOF9JRDEJCTB4RkZDMDJEMUMJLyogTWFpbGJveCA4IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEwCQkweEZGQzAyRDIwCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTEJCTB4RkZDMDJEMjQJLyogTWFpbGJveCA5IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTIJCTB4RkZDMDJEMjgJLyogTWFpbGJveCA5IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfREFUQTMJCTB4RkZDMDJEMkMJLyogTWFpbGJveCA5IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfTEVOR1RICQkweEZGQzAyRDMwCS8qIE1haWxib3ggOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X1RJTUVTVEFNUAkweEZGQzAyRDM0CS8qIE1haWxib3ggOSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0lEMAkJMHhGRkMwMkQzOAkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDlfSUQxCQkweEZGQzAyRDNDCS8qIE1haWxib3ggOSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMF9EQVRBMAkJMHhGRkMwMkQ0MAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9EQVRBMQkJMHhGRkMwMkQ0NAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfREFUQTIJCTB4RkZDMDJENDgJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX0RBVEEzCQkweEZGQzAyRDRDCS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9MRU5HVEgJCTB4RkZDMDJENTAJLyogTWFpbGJveCAxMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX1RJTUVTVEFNUAkweEZGQzAyRDU0CS8qIE1haWxib3ggMTAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9JRDAJCTB4RkZDMDJENTgJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9JRDEJCTB4RkZDMDJENUMJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMV9EQVRBMAkJMHhGRkMwMkQ2MAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9EQVRBMQkJMHhGRkMwMkQ2NAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfREFUQTIJCTB4RkZDMDJENjgJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX0RBVEEzCQkweEZGQzAyRDZDCS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9MRU5HVEgJCTB4RkZDMDJENzAJLyogTWFpbGJveCAxMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX1RJTUVTVEFNUAkweEZGQzAyRDc0CS8qIE1haWxib3ggMTEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9JRDAJCTB4RkZDMDJENzgJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9JRDEJCTB4RkZDMDJEN0MJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxMl9EQVRBMAkJMHhGRkMwMkQ4MAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9EQVRBMQkJMHhGRkMwMkQ4NAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfREFUQTIJCTB4RkZDMDJEODgJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX0RBVEEzCQkweEZGQzAyRDhDCS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9MRU5HVEgJCTB4RkZDMDJEOTAJLyogTWFpbGJveCAxMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX1RJTUVTVEFNUAkweEZGQzAyRDk0CS8qIE1haWxib3ggMTIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9JRDAJCTB4RkZDMDJEOTgJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9JRDEJCTB4RkZDMDJEOUMJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxM19EQVRBMAkJMHhGRkMwMkRBMAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19EQVRBMQkJMHhGRkMwMkRBNAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfREFUQTIJCTB4RkZDMDJEQTgJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX0RBVEEzCQkweEZGQzAyREFDCS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19MRU5HVEgJCTB4RkZDMDJEQjAJLyogTWFpbGJveCAxMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX1RJTUVTVEFNUAkweEZGQzAyREI0CS8qIE1haWxib3ggMTMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19JRDAJCTB4RkZDMDJEQjgJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19JRDEJCTB4RkZDMDJEQkMJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNF9EQVRBMAkJMHhGRkMwMkRDMAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9EQVRBMQkJMHhGRkMwMkRDNAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfREFUQTIJCTB4RkZDMDJEQzgJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X0RBVEEzCQkweEZGQzAyRENDCS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9MRU5HVEgJCTB4RkZDMDJERDAJLyogTWFpbGJveCAxNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X1RJTUVTVEFNUAkweEZGQzAyREQ0CS8qIE1haWxib3ggMTQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9JRDAJCTB4RkZDMDJERDgJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9JRDEJCTB4RkZDMDJEREMJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNV9EQVRBMAkJMHhGRkMwMkRFMAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9EQVRBMQkJMHhGRkMwMkRFNAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfREFUQTIJCTB4RkZDMDJERTgJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X0RBVEEzCQkweEZGQzAyREVDCS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9MRU5HVEgJCTB4RkZDMDJERjAJLyogTWFpbGJveCAxNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X1RJTUVTVEFNUAkweEZGQzAyREY0CS8qIE1haWxib3ggMTUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9JRDAJCTB4RkZDMDJERjgJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9JRDEJCTB4RkZDMDJERkMJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxNl9EQVRBMAkJMHhGRkMwMkUwMAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9EQVRBMQkJMHhGRkMwMkUwNAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfREFUQTIJCTB4RkZDMDJFMDgJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X0RBVEEzCQkweEZGQzAyRTBDCS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9MRU5HVEgJCTB4RkZDMDJFMTAJLyogTWFpbGJveCAxNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X1RJTUVTVEFNUAkweEZGQzAyRTE0CS8qIE1haWxib3ggMTYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9JRDAJCTB4RkZDMDJFMTgJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9JRDEJCTB4RkZDMDJFMUMJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxN19EQVRBMAkJMHhGRkMwMkUyMAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19EQVRBMQkJMHhGRkMwMkUyNAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfREFUQTIJCTB4RkZDMDJFMjgJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X0RBVEEzCQkweEZGQzAyRTJDCS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19MRU5HVEgJCTB4RkZDMDJFMzAJLyogTWFpbGJveCAxNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X1RJTUVTVEFNUAkweEZGQzAyRTM0CS8qIE1haWxib3ggMTcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19JRDAJCTB4RkZDMDJFMzgJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19JRDEJCTB4RkZDMDJFM0MJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxOF9EQVRBMAkJMHhGRkMwMkU0MAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9EQVRBMQkJMHhGRkMwMkU0NAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfREFUQTIJCTB4RkZDMDJFNDgJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X0RBVEEzCQkweEZGQzAyRTRDCS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9MRU5HVEgJCTB4RkZDMDJFNTAJLyogTWFpbGJveCAxOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X1RJTUVTVEFNUAkweEZGQzAyRTU0CS8qIE1haWxib3ggMTggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9JRDAJCTB4RkZDMDJFNTgJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9JRDEJCTB4RkZDMDJFNUMJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIxOV9EQVRBMAkJMHhGRkMwMkU2MAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9EQVRBMQkJMHhGRkMwMkU2NAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfREFUQTIJCTB4RkZDMDJFNjgJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X0RBVEEzCQkweEZGQzAyRTZDCS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9MRU5HVEgJCTB4RkZDMDJFNzAJLyogTWFpbGJveCAxOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X1RJTUVTVEFNUAkweEZGQzAyRTc0CS8qIE1haWxib3ggMTkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9JRDAJCTB4RkZDMDJFNzgJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9JRDEJCTB4RkZDMDJFN0MJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMF9EQVRBMAkJMHhGRkMwMkU4MAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9EQVRBMQkJMHhGRkMwMkU4NAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfREFUQTIJCTB4RkZDMDJFODgJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX0RBVEEzCQkweEZGQzAyRThDCS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9MRU5HVEgJCTB4RkZDMDJFOTAJLyogTWFpbGJveCAyMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX1RJTUVTVEFNUAkweEZGQzAyRTk0CS8qIE1haWxib3ggMjAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9JRDAJCTB4RkZDMDJFOTgJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9JRDEJCTB4RkZDMDJFOUMJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMV9EQVRBMAkJMHhGRkMwMkVBMAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9EQVRBMQkJMHhGRkMwMkVBNAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfREFUQTIJCTB4RkZDMDJFQTgJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX0RBVEEzCQkweEZGQzAyRUFDCS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9MRU5HVEgJCTB4RkZDMDJFQjAJLyogTWFpbGJveCAyMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX1RJTUVTVEFNUAkweEZGQzAyRUI0CS8qIE1haWxib3ggMjEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9JRDAJCTB4RkZDMDJFQjgJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9JRDEJCTB4RkZDMDJFQkMJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyMl9EQVRBMAkJMHhGRkMwMkVDMAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9EQVRBMQkJMHhGRkMwMkVDNAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfREFUQTIJCTB4RkZDMDJFQzgJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX0RBVEEzCQkweEZGQzAyRUNDCS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9MRU5HVEgJCTB4RkZDMDJFRDAJLyogTWFpbGJveCAyMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX1RJTUVTVEFNUAkweEZGQzAyRUQ0CS8qIE1haWxib3ggMjIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9JRDAJCTB4RkZDMDJFRDgJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9JRDEJCTB4RkZDMDJFREMJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyM19EQVRBMAkJMHhGRkMwMkVFMAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19EQVRBMQkJMHhGRkMwMkVFNAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfREFUQTIJCTB4RkZDMDJFRTgJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX0RBVEEzCQkweEZGQzAyRUVDCS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19MRU5HVEgJCTB4RkZDMDJFRjAJLyogTWFpbGJveCAyMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX1RJTUVTVEFNUAkweEZGQzAyRUY0CS8qIE1haWxib3ggMjMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19JRDAJCTB4RkZDMDJFRjgJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19JRDEJCTB4RkZDMDJFRkMJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNF9EQVRBMAkJMHhGRkMwMkYwMAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9EQVRBMQkJMHhGRkMwMkYwNAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfREFUQTIJCTB4RkZDMDJGMDgJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X0RBVEEzCQkweEZGQzAyRjBDCS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9MRU5HVEgJCTB4RkZDMDJGMTAJLyogTWFpbGJveCAyNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X1RJTUVTVEFNUAkweEZGQzAyRjE0CS8qIE1haWxib3ggMjQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9JRDAJCTB4RkZDMDJGMTgJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9JRDEJCTB4RkZDMDJGMUMJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNV9EQVRBMAkJMHhGRkMwMkYyMAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9EQVRBMQkJMHhGRkMwMkYyNAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfREFUQTIJCTB4RkZDMDJGMjgJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X0RBVEEzCQkweEZGQzAyRjJDCS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9MRU5HVEgJCTB4RkZDMDJGMzAJLyogTWFpbGJveCAyNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X1RJTUVTVEFNUAkweEZGQzAyRjM0CS8qIE1haWxib3ggMjUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9JRDAJCTB4RkZDMDJGMzgJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9JRDEJCTB4RkZDMDJGM0MJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyNl9EQVRBMAkJMHhGRkMwMkY0MAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9EQVRBMQkJMHhGRkMwMkY0NAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfREFUQTIJCTB4RkZDMDJGNDgJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X0RBVEEzCQkweEZGQzAyRjRDCS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9MRU5HVEgJCTB4RkZDMDJGNTAJLyogTWFpbGJveCAyNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X1RJTUVTVEFNUAkweEZGQzAyRjU0CS8qIE1haWxib3ggMjYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9JRDAJCTB4RkZDMDJGNTgJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9JRDEJCTB4RkZDMDJGNUMJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyN19EQVRBMAkJMHhGRkMwMkY2MAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19EQVRBMQkJMHhGRkMwMkY2NAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfREFUQTIJCTB4RkZDMDJGNjgJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X0RBVEEzCQkweEZGQzAyRjZDCS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19MRU5HVEgJCTB4RkZDMDJGNzAJLyogTWFpbGJveCAyNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X1RJTUVTVEFNUAkweEZGQzAyRjc0CS8qIE1haWxib3ggMjcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19JRDAJCTB4RkZDMDJGNzgJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19JRDEJCTB4RkZDMDJGN0MJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyOF9EQVRBMAkJMHhGRkMwMkY4MAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9EQVRBMQkJMHhGRkMwMkY4NAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfREFUQTIJCTB4RkZDMDJGODgJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X0RBVEEzCQkweEZGQzAyRjhDCS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9MRU5HVEgJCTB4RkZDMDJGOTAJLyogTWFpbGJveCAyOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X1RJTUVTVEFNUAkweEZGQzAyRjk0CS8qIE1haWxib3ggMjggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9JRDAJCTB4RkZDMDJGOTgJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9JRDEJCTB4RkZDMDJGOUMJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIyOV9EQVRBMAkJMHhGRkMwMkZBMAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9EQVRBMQkJMHhGRkMwMkZBNAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfREFUQTIJCTB4RkZDMDJGQTgJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X0RBVEEzCQkweEZGQzAyRkFDCS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9MRU5HVEgJCTB4RkZDMDJGQjAJLyogTWFpbGJveCAyOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X1RJTUVTVEFNUAkweEZGQzAyRkI0CS8qIE1haWxib3ggMjkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9JRDAJCTB4RkZDMDJGQjgJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9JRDEJCTB4RkZDMDJGQkMJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIzMF9EQVRBMAkJMHhGRkMwMkZDMAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9EQVRBMQkJMHhGRkMwMkZDNAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfREFUQTIJCTB4RkZDMDJGQzgJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX0RBVEEzCQkweEZGQzAyRkNDCS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9MRU5HVEgJCTB4RkZDMDJGRDAJLyogTWFpbGJveCAzMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX1RJTUVTVEFNUAkweEZGQzAyRkQ0CS8qIE1haWxib3ggMzAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9JRDAJCTB4RkZDMDJGRDgJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9JRDEJCTB4RkZDMDJGREMJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIzMV9EQVRBMAkJMHhGRkMwMkZFMAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9EQVRBMQkJMHhGRkMwMkZFNAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfREFUQTIJCTB4RkZDMDJGRTgJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX0RBVEEzCQkweEZGQzAyRkVDCS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9MRU5HVEgJCTB4RkZDMDJGRjAJLyogTWFpbGJveCAzMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX1RJTUVTVEFNUAkweEZGQzAyRkY0CS8qIE1haWxib3ggMzEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9JRDAJCTB4RkZDMDJGRjgJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9JRDEJCTB4RkZDMDJGRkMJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KKworLyogQ0FOIE1haWxib3ggQXJlYSBNYWNyb3MgKi8KKyNkZWZpbmUJQ0FOX01CX0lEMSh4KQkJKENBTl9NQjAwX0lEMSsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfSUQwKHgpCQkoQ0FOX01CMDBfSUQwKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9USU1FU1RBTVAoeCkJKENBTl9NQjAwX1RJTUVTVEFNUCsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfTEVOR1RIKHgpCShDQU5fTUIwMF9MRU5HVEgrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEzKHgpCQkoQ0FOX01CMDBfREFUQTMrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEyKHgpCQkoQ0FOX01CMDBfREFUQTIrKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEExKHgpCQkoQ0FOX01CMDBfREFUQTErKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0RBVEEwKHgpCQkoQ0FOX01CMDBfREFUQTArKCh4KSoweDIwKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBhbmQJTWFjcm9zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBTV1JTVCBNYXNrICovCisjZGVmaW5lCVNZU1RFTV9SRVNFVAkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lCURPVUJMRV9GQVVMVAkweDAwMDgJLyogQ29yZQlEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0ICovCisjZGVmaW5lCVJFU0VUX0RPVUJMRQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0ICovCisjZGVmaW5lCVJFU0VUX1dET0cJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUJUkVTRVRfU09GVFdBUkUJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QJUmVhZCBPZglTV1JTVCAqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQk1PREUJCQkweDAwMDYJLyogQm9vdAlNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMgKi8KKyNkZWZpbmUJTk9CT09UCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbQlMMSBvciBBU1lOQyBCYW5rIDAgV2hlbglCTU9ERSA9CTAgKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKiogKi8KKworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDMF9JU1IsIFNJQzBfSVdSLCBTSUMwX0lNQVNLICovCisjZGVmaW5lCVBMTF9XQUtFVVBfSVJRCQkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzBfRVJSX0lSUQkJMHgwMDAwMDAwMgkvKiBETUEgQ29udHJvbGxlciAwIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBQSV9FUlJfSVJRCQkweDAwMDAwMDA0CS8qIFBQSSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDBfRVJSX0lSUQkJMHgwMDAwMDAwOAkvKiBTUE9SVDAgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQxX0VSUl9JUlEJCTB4MDAwMDAwMTAJLyogU1BPUlQxIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTBfRVJSX0lSUQkJMHgwMDAwMDAyMAkvKiBTUEkwCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQwX0VSUl9JUlEJCTB4MDAwMDAwNDAJLyogVUFSVDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJUlRDX0lSUQkJCTB4MDAwMDAwODAJLyogUmVhbC1UaW1lIENsb2NrIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTBfSVJRCQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMV9JUlEJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMSAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUEyX0lSUQkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCAyIChTUE9SVDAgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTNfSVJRCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMSBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BNF9JUlEJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE1X0lSUQkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCA1IChTUEkpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTZfSVJRCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDYgKFVBUlQgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTdfSVJRCQkweDAwMDA4MDAwCS8qIERNQSBDaGFubmVsIDcgKFVBUlQgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRJTUVSMF9JUlEJCTB4MDAwMTAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUSU1FUjFfSVJRCQkweDAwMDIwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVElNRVIyX0lSUQkJMHgwMDA0MDAwMAkvKiBUaW1lciAyIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBGQV9JUlEJCQkweDAwMDgwMDAwCS8qIFByb2dyYW1tYWJsZQlGbGFnIEludGVycnVwdCBSZXF1ZXN0IEEgKi8KKyNkZWZpbmUJUEZCX0lSUQkJCTB4MDAxMDAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQiAqLworI2RlZmluZQlNRE1BMF8wX0lSUQkJMHgwMDIwMDAwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1ETUEwXzFfSVJRCQkweDAwNDAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJV0RPR19JUlEJCTB4MDA4MDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzFfRVJSX0lSUQkJMHgwMTAwMDAwMAkvKiBETUEgQ29udHJvbGxlciAxIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUMl9FUlJfSVJRCQkweDAyMDAwMDAwCS8qIFNQT1JUMiBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDNfRVJSX0lSUQkJMHgwNDAwMDAwMAkvKiBTUE9SVDMgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TRF9JUlEJCTB4MDgwMDAwMDAJLyogTVhWUglTeW5jaHJvbm91cyBEYXRhIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTFfRVJSX0lSUQkJMHgxMDAwMDAwMAkvKiBTUEkxCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTJfRVJSX0lSUQkJMHgyMDAwMDAwMAkvKiBTUEkyCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQxX0VSUl9JUlEJCTB4NDAwMDAwMDAJLyogVUFSVDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVUFSVDJfRVJSX0lSUQkJMHg4MDAwMDAwMAkvKiBVQVJUMiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMF9FUlJfSVJRCQlETUFDMF9FUlJfSVJRCisjZGVmaW5lCURNQTFfRVJSX0lSUQkJRE1BQzFfRVJSX0lSUQorCisKKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yCVNJQ19JU1IxLCBTSUNfSVdSMSwgU0lDX0lNQVNLMQkgKi8KKyNkZWZpbmUJQ0FOX0VSUl9JUlEJCQkweDAwMDAwMDAxCS8qIENBTiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE4X0lSUQkJCTB4MDAwMDAwMDIJLyogRE1BIENoYW5uZWwgOCAoU1BPUlQyIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE5X0lSUQkJCTB4MDAwMDAwMDQJLyogRE1BIENoYW5uZWwgOSAoU1BPUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExMF9JUlEJCQkweDAwMDAwMDA4CS8qIERNQSBDaGFubmVsIDEwIChTUE9SVDMgUlgpIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCURNQTExX0lSUQkJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMTEgKFNQT1JUMyBUWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTJfSVJRCQkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExM19JUlEJCQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE0X0lSUQkJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgMTQgKFNQSTEpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE1X0lSUQkJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMTUgKFNQSTIpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE2X0lSUQkJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMTYgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExN19JUlEJCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDE3IChVQVJUMSBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMThfSVJRCQkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCAxOCAoVUFSVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE5X0lSUQkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgMTkgKFVBUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kwX0lSUQkJCTB4MDAwMDIwMDAJLyogVFdJMAlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kxX0lSUQkJCTB4MDAwMDQwMDAJLyogVFdJMQlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fUlhfSVJRCQkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fVFhfSVJRCQkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMF9JUlEJCQkweDAwMDIwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMV9JUlEJCQkweDAwMDQwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TVEFUX0lSUQkJCTB4MDAwODAwMDAJLyogTVhWUglTdGF0dXMgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9DTV9JUlEJCQkweDAwMTAwMDAwCS8qIE1YVlIJQ29udHJvbAlNZXNzYWdlCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfQVBfSVJRCQkJMHgwMDIwMDAwMAkvKiBNWFZSCUFzeW5jaHJvbm91cyBQYWNrZXQgSW50ZXJydXB0ICovCisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlNRE1BMF9JUlEJCU1ETUExXzBfSVJRCisjZGVmaW5lCU1ETUExX0lSUQkJTURNQTFfMV9JUlEKKworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlfTUYxNSAweEZ1CisjZGVmaW5lCV9NRjcgN3UKKyNlbHNlCisjZGVmaW5lCV9NRjE1IDB4RgorI2RlZmluZQlfTUY3IDcKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lNQVNLeCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lCVNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrCWFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRnUpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLworI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGdSBeICgxIDw8ICgoeCkmMHgxRnUpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3gJaW50ZXJydXB0ICovCisjZWxzZQorI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sJUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lXUnggTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzICovCisjZGVmaW5lCUlXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZWxzZQorI2RlZmluZQlJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiAgKioqKioqKioqICBQQVJBTExFTAlQRVJJUEhFUkFMIElOVEVSRkFDRSAoUFBJKSBNQVNLUyAqKioqKioqKioqKioqKioqICAgKi8KKy8qICBQUElfQ09OVFJPTAlNYXNrcwkgICAgICAqLworI2RlZmluZQlQT1JUX0VOCQkweDAwMDEJLyogUFBJIFBvcnQgRW5hYmxlICAqLworI2RlZmluZQlQT1JUX0RJUgkweDAwMDIJLyogUFBJIFBvcnQgRGlyZWN0aW9uCSAgICAqLworI2RlZmluZQlYRlJfVFlQRQkweDAwMEMJLyogUFBJIFRyYW5zZmVyCVR5cGUgICovCisjZGVmaW5lCVBPUlRfQ0ZHCTB4MDAzMAkvKiBQUEkgUG9ydCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lCUZMRF9TRUwJCTB4MDA0MAkvKiBQUEkgQWN0aXZlIEZpZWxkIFNlbGVjdCAqLworI2RlZmluZQlQQUNLX0VOCQkweDAwODAJLyogUFBJIFBhY2tpbmcgTW9kZSAqLworLyogcHJldmlvdXMgdmVyc2lvbnMgb2YJZGVmQkY1MzkuaCBlcnJvbmVvdXNseSBpbmNsdWRlZAlETUEzMiAoUFBJIDMyLWJpdCBETUEgRW5hYmxlKSAqLworI2RlZmluZQlTS0lQX0VOCQkweDAyMDAJLyogUFBJIFNraXAgRWxlbWVudCBFbmFibGUgKi8KKyNkZWZpbmUJU0tJUF9FTwkJMHgwNDAwCS8qIFBQSSBTa2lwIEV2ZW4vT2RkIEVsZW1lbnRzICovCisjZGVmaW5lCURMRU5HVEgJCTB4MzgwMAkvKiBQUEkgRGF0YSBMZW5ndGggICovCisjZGVmaW5lCURMRU5fOAkJMHgwCSAgICAgLyoJUFBJIERhdGEgTGVuZ3RoCW1hc2sgZm9yIERMRU49OCAqLworI2RlZmluZQlETEVOXzEwCQkweDA4MDAJCS8qIERhdGEJTGVuZ3RoID0gMTAgQml0cyAqLworI2RlZmluZQlETEVOXzExCQkweDEwMDAJCS8qIERhdGEJTGVuZ3RoID0gMTEgQml0cyAqLworI2RlZmluZQlETEVOXzEyCQkweDE4MDAJCS8qIERhdGEJTGVuZ3RoID0gMTIgQml0cyAqLworI2RlZmluZQlETEVOXzEzCQkweDIwMDAJCS8qIERhdGEJTGVuZ3RoID0gMTMgQml0cyAqLworI2RlZmluZQlETEVOXzE0CQkweDI4MDAJCS8qIERhdGEJTGVuZ3RoID0gMTQgQml0cyAqLworI2RlZmluZQlETEVOXzE1CQkweDMwMDAJCS8qIERhdGEJTGVuZ3RoID0gMTUgQml0cyAqLworI2RlZmluZQlETEVOXzE2CQkweDM4MDAJCS8qIERhdGEJTGVuZ3RoID0gMTYgQml0cyAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlETEVOKHgpCQkoKCgoeCktOXUpICYgMHgwN3UpIDw8IDExKSAgLyogUFBJIERhdGEJTGVuZ3RoIChvbmx5IHdvcmtzIGZvciB4PTEwLS0+eD0xNikgKi8KKyNlbHNlCisjZGVmaW5lCURMRU4oeCkJCSgoKCh4KS05KSAmIDB4MDcpIDw8IDExKSAgLyogUFBJIERhdGEgTGVuZ3RoIChvbmx5IHdvcmtzIGZvciB4PTEwLS0+eD0xNikgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJUE9MCQkJMHhDMDAwCS8qIFBQSSBTaWduYWwgUG9sYXJpdGllcyAgICAgICAqLworI2RlZmluZQlQT0xDCQkweDQwMDAJCS8qIFBQSSBDbG9jayBQb2xhcml0eSAqLworI2RlZmluZQlQT0xTCQkweDgwMDAJCS8qIFBQSSBGcmFtZSBTeW5jIFBvbGFyaXR5ICovCisKKworLyogUFBJX1NUQVRVUyBNYXNrcwkJCQkJICAgICAqLworI2RlZmluZQlGTEQJCQkweDA0MDAJLyogRmllbGQgSW5kaWNhdG9yICAgKi8KKyNkZWZpbmUJRlRfRVJSCQkweDA4MDAJLyogRnJhbWUgVHJhY2sgRXJyb3IgKi8KKyNkZWZpbmUJT1ZSCQkJMHgxMDAwCS8qIEZJRk8JT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUJVU5EUgkJMHgyMDAwCS8qIEZJRk8JVW5kZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUJRVJSX0RFVAkJMHg0MDAwCS8qIEVycm9yIERldGVjdGVkIEluZGljYXRvciAqLworI2RlZmluZQlFUlJfTkNPUgkweDgwMDAJLyogRXJyb3IgTm90IENvcnJlY3RlZCBJbmRpY2F0b3IgKi8KKworCisvKiAqKioqKioqKioqICBETUEgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERNQXhfUEVSSVBIRVJBTF9NQVAsCU1ETUFfeXlfUEVSSVBIRVJBTF9NQVAgTWFza3MgKi8KKworI2RlZmluZQlDVFlQRQkJCTB4MDA0MAkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciAqLworI2RlZmluZQlDVFlQRV9QCQkJMHg2CQkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciBCSVQgUE9TSVRJT04gKi8KKyNkZWZpbmUJUENBUDgJCQkweDAwODAJLyogRE1BIDgtYml0IE9wZXJhdGlvbiBJbmRpY2F0b3IgICAqLworI2RlZmluZQlQQ0FQMTYJCQkweDAxMDAJLyogRE1BIDE2LWJpdCBPcGVyYXRpb24JSW5kaWNhdG9yICovCisjZGVmaW5lCVBDQVAzMgkJCTB4MDIwMAkvKiBETUEgMzItYml0IE9wZXJhdGlvbglJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUENBUFdSCQkJMHgwNDAwCS8qIERNQSBXcml0ZSBPcGVyYXRpb24gSW5kaWNhdG9yICovCisjZGVmaW5lCVBDQVBSRAkJCTB4MDgwMAkvKiBETUEgUmVhZCBPcGVyYXRpb24gSW5kaWNhdG9yICovCisjZGVmaW5lCVBNQVAJCQkweEYwMDAJLyogRE1BIFBlcmlwaGVyYWwgTWFwIEZpZWxkICovCisKKy8qIFBNQVAJRW5jb2RpbmdzIEZvciBETUEgQ29udHJvbGxlciAwICovCisjZGVmaW5lCVBNQVBfUFBJCQkweDAwMDAJLyogUE1BUAlQUEkgUG9ydCBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDBSWAkweDEwMDAJLyogUE1BUAlTUE9SVDAgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDBUWAkweDIwMDAJLyogUE1BUAlTUE9SVDAgVHJhbnNtaXQJRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQxUlgJMHgzMDAwCS8qIFBNQVAJU1BPUlQxIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQxVFgJMHg0MDAwCS8qIFBNQVAJU1BPUlQxIFRyYW5zbWl0CURNQSAqLworI2RlZmluZQlQTUFQX1NQSTAJCTB4NTAwMAkvKiBQTUFQCVNQSSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMFJYCQkweDYwMDAJLyogUE1BUAlVQVJUIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDBUWAkJMHg3MDAwCS8qIFBNQVAJVUFSVCBUcmFuc21pdCBETUEgKi8KKworLyogUE1BUAlFbmNvZGluZ3MgRm9yIERNQSBDb250cm9sbGVyIDEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDJSWAkgICAgMHgwMDAwICAvKiBQTUFQIFNQT1JUMiBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMlRYCSAgICAweDEwMDAgIC8qIFBNQVAgU1BPUlQyIFRyYW5zbWl0IERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUM1JYCSAgICAweDIwMDAgIC8qIFBNQVAgU1BPUlQzIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQzVFgJICAgIDB4MzAwMCAgLyogUE1BUCBTUE9SVDMgVHJhbnNtaXQgRE1BICovCisjZGVmaW5lCVBNQVBfU1BJMQkgICAgMHg2MDAwICAvKiBQTUFQIFNQSTEgRE1BICovCisjZGVmaW5lCVBNQVBfU1BJMgkgICAgMHg3MDAwICAvKiBQTUFQIFNQSTIgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDFSWAkgICAgMHg4MDAwICAvKiBQTUFQIFVBUlQxIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDFUWAkgICAgMHg5MDAwICAvKiBQTUFQIFVBUlQxIFRyYW5zbWl0IERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQyUlgJICAgIDB4QTAwMCAgLyogUE1BUCBVQVJUMiBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQyVFgJICAgIDB4QjAwMCAgLyogUE1BUCBVQVJUMiBUcmFuc21pdCBETUEgKi8KKworCisvKiAgKioqKioqKioqKioqKiAgR0VORVJBTCBQVVJQT1NFIFRJTUVSIE1BU0tTCSoqKioqKioqKioqKioqKioqKioqICovCisvKiBQV00gVGltZXIgYml0IGRlZmluaXRpb25zICovCisvKiBUSU1FUl9FTkFCTEUJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRU4wCQkJMHgwMDAxCS8qIEVuYWJsZSBUaW1lcgkwICovCisjZGVmaW5lCVRJTUVOMQkJCTB4MDAwMgkvKiBFbmFibGUgVGltZXIJMSAqLworI2RlZmluZQlUSU1FTjIJCQkweDAwMDQJLyogRW5hYmxlIFRpbWVyCTIgKi8KKworI2RlZmluZQlUSU1FTjBfUAkJMHgwMAorI2RlZmluZQlUSU1FTjFfUAkJMHgwMQorI2RlZmluZQlUSU1FTjJfUAkJMHgwMgorCisvKiBUSU1FUl9ESVNBQkxFIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTURJUzAJCQkweDAwMDEJLyogRGlzYWJsZSBUaW1lciAwICovCisjZGVmaW5lCVRJTURJUzEJCQkweDAwMDIJLyogRGlzYWJsZSBUaW1lciAxICovCisjZGVmaW5lCVRJTURJUzIJCQkweDAwMDQJLyogRGlzYWJsZSBUaW1lciAyICovCisKKyNkZWZpbmUJVElNRElTMF9QCQkweDAwCisjZGVmaW5lCVRJTURJUzFfUAkJMHgwMQorI2RlZmluZQlUSU1ESVMyX1AJCTB4MDIKKworLyogVElNRVJfU1RBVFVTCVJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUlMMAkJCTB4MDAwMQkvKiBUaW1lciAwIEludGVycnVwdCAqLworI2RlZmluZQlUSU1JTDEJCQkweDAwMDIJLyogVGltZXIgMSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVElNSUwyCQkJMHgwMDA0CS8qIFRpbWVyIDIgSW50ZXJydXB0ICovCisjZGVmaW5lCVRPVkZfRVJSMAkJMHgwMDEwCS8qIFRpbWVyIDAgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZQlUT1ZGX0VSUjEJCTB4MDAyMAkvKiBUaW1lciAxIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUJVE9WRl9FUlIyCQkweDAwNDAJLyogVGltZXIgMiBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lCVRSVU4wCQkJMHgxMDAwCS8qIFRpbWVyIDAgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLworI2RlZmluZQlUUlVOMQkJCTB4MjAwMAkvKiBUaW1lciAxIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KKyNkZWZpbmUJVFJVTjIJCQkweDQwMDAJLyogVGltZXIgMiBTbGF2ZSBFbmFibGUJU3RhdHVzICovCisKKyNkZWZpbmUJVElNSUwwX1AJCTB4MDAKKyNkZWZpbmUJVElNSUwxX1AJCTB4MDEKKyNkZWZpbmUJVElNSUwyX1AJCTB4MDIKKyNkZWZpbmUJVE9WRl9FUlIwX1AJCTB4MDQKKyNkZWZpbmUJVE9WRl9FUlIxX1AJCTB4MDUKKyNkZWZpbmUJVE9WRl9FUlIyX1AJCTB4MDYKKyNkZWZpbmUJVFJVTjBfUAkJCTB4MEMKKyNkZWZpbmUJVFJVTjFfUAkJCTB4MEQKKyNkZWZpbmUJVFJVTjJfUAkJCTB4MEUKKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQJTWFjcm9zIFByb3ZpZGVkCUZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVRPVkxfRVJSMAkJVE9WRl9FUlIwCisjZGVmaW5lCVRPVkxfRVJSMQkJVE9WRl9FUlIxCisjZGVmaW5lCVRPVkxfRVJSMgkJVE9WRl9FUlIyCisjZGVmaW5lCVRPVkxfRVJSMF9QCQlUT1ZGX0VSUjBfUAorI2RlZmluZQlUT1ZMX0VSUjFfUAlUT1ZGX0VSUjFfUAorI2RlZmluZQlUT1ZMX0VSUjJfUAlUT1ZGX0VSUjJfUAorCisvKiBUSU1FUnhfQ09ORklHIFJlZ2lzdGVycyAqLworI2RlZmluZQlQV01fT1VUCQkJMHgwMDAxCisjZGVmaW5lCVdEVEhfQ0FQCQkweDAwMDIKKyNkZWZpbmUJRVhUX0NMSwkJCTB4MDAwMworI2RlZmluZQlQVUxTRV9ISQkJMHgwMDA0CisjZGVmaW5lCVBFUklPRF9DTlQJCTB4MDAwOAorI2RlZmluZQlJUlFfRU5BCQkJMHgwMDEwCisjZGVmaW5lCVRJTl9TRUwJCQkweDAwMjAKKyNkZWZpbmUJT1VUX0RJUwkJCTB4MDA0MAorI2RlZmluZQlDTEtfU0VMCQkJMHgwMDgwCisjZGVmaW5lCVRPR0dMRV9ISQkJMHgwMTAwCisjZGVmaW5lCUVNVV9SVU4JCQkweDAyMDAKKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJRVJSX1RZUCh4KQkJKCgoeCkgJgkweDAzdSkgPDwgMTQpCisjZWxzZQorI2RlZmluZQlFUlJfVFlQKHgpCQkoKCh4KSAmCTB4MDMpIDw8IDE0KQorI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisjZGVmaW5lCVRNT0RFX1AwCQkweDAwCisjZGVmaW5lCVRNT0RFX1AxCQkweDAxCisjZGVmaW5lCVBVTFNFX0hJX1AJCTB4MDIKKyNkZWZpbmUJUEVSSU9EX0NOVF9QCTB4MDMKKyNkZWZpbmUJSVJRX0VOQV9QCQkweDA0CisjZGVmaW5lCVRJTl9TRUxfUAkJMHgwNQorI2RlZmluZQlPVVRfRElTX1AJCTB4MDYKKyNkZWZpbmUJQ0xLX1NFTF9QCQkweDA3CisjZGVmaW5lCVRPR0dMRV9ISV9QCQkweDA4CisjZGVmaW5lCUVNVV9SVU5fUAkJMHgwOQorI2RlZmluZQlFUlJfVFlQX1AwCQkweDBFCisjZGVmaW5lCUVSUl9UWVBfUDEJCTB4MEYKKworLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MJKioqKioqKioqKioqKiAqLworLyogRUJJVV9BTUdDVEwgTWFza3MgKi8KKyNkZWZpbmUJQU1DS0VOCQkweDAwMDEJLyogRW5hYmxlIENMS09VVCAqLworI2RlZmluZQlBTUJFTl9OT05FCTB4MDAwMAkvKiBBbGwgQmFua3MgRGlzYWJsZWQgKi8KKyNkZWZpbmUJQU1CRU5fQjAJMHgwMDAyCS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgMCBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxCTB4MDAwNAkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwICYJMSBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxX0IyCTB4MDAwNgkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMiAqLworI2RlZmluZQlBTUJFTl9BTEwJMHgwMDA4CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsCTIsIGFuZCAzICovCisjZGVmaW5lCUNEUFJJTwkJMHgwMTAwCS8qIERNQSBoYXMgcHJpb3JpdHkgb3ZlciBjb3JlIGZvciBleHRlcm5hbCBhY2Nlc3NlcyAqLworCisvKiBFQklVX0FNR0NUTCBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCUFNQ0tFTl9QCQkweDAwMDAJLyogRW5hYmxlIENMS09VVCAqLworI2RlZmluZQlBTUJFTl9QMAkJMHgwMDAxCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMDAgLSBiYW5rcyAwLTMgZGlzYWJsZWQsIDAwMSAtIEJhbmsgMCBlbmFibGVkICovCisjZGVmaW5lCUFNQkVOX1AxCQkweDAwMDIJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDAxMCAtIGJhbmtzIDAmMSBlbmFibGVkLAkgMDExIC0gYmFua3MgMC0zIGVuYWJsZWQgKi8KKyNkZWZpbmUJQU1CRU5fUDIJCTB4MDAwMwkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMXh4IC0gQWxsIGJhbmtzIChiYW5rIDAsCTEsIDIsIGFuZCAzKSBlbmFibGVkICovCisKKy8qIEVCSVVfQU1CQ1RMMAlNYXNrcyAqLworI2RlZmluZQlCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMCBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD0xIGN5Y2xlICovCisjZGVmaW5lCUIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF8zCQkJMHgwMDAwMDAzMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD0zIGN5Y2xlcyAqLworI2RlZmluZQlCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTQgY3ljbGVzICovCisjZGVmaW5lCUIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDAgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDUgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDggY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIFJEWSBlbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEJhbmsgMSBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIxVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFTVF8yCQkJMHgwMDIwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIxU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFIVF8xCQkJMHgwMDQwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xCQkJMHgxMDAwMDAwMCAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKworLyogRUJJVV9BTUJDVEwxCU1hc2tzICovCisjZGVmaW5lCUIyUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDIgUkRZIEVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworI2RlZmluZQlCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQmFuayAyIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCisjZGVmaW5lCUIyVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlRUXzIJCQkweDAwMDAwMDA4ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMlNUXzEJCQkweDAwMDAwMDEwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJTVF8zCQkJMHgwMDAwMDAzMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMkhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLworI2RlZmluZQlCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMyBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDMgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjNUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1NUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzEJCQkweDAxMDAwMDAwIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0JMSBjeWNsZSAqLworI2RlZmluZQlCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xCQkJMHgxMDAwMDAwMCAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIzV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8zCQkJMHgzMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF82CQkJMHg2MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF85CQkJMHg5MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xMQkJMHhCMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xNAkJMHhFMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBFQklVX1NER0NUTCBNYXNrcyAqLworI2RlZmluZQlTQ1RMRQkJCTB4MDAwMDAwMDEgLyogRW5hYmxlIFNDTEtbMF0sIC9TUkFTLCAvU0NBUywgL1NXRSwgU0RRTVszOjBdICovCisjZGVmaW5lCUNMXzIJCQkweDAwMDAwMDA4IC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQ0xfMwkJCTB4MDAwMDAwMEMgLyogU0RSQU0gQ0FTCWxhdGVuY3kJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlQRkUJCQkJMHgwMDAwMDAxMCAvKiBFbmFibGUgU0RSQU0gcHJlZmV0Y2ggKi8KKyNkZWZpbmUJUEZQCQkJCTB4MDAwMDAwMjAgLyogUHJlZmV0Y2ggaGFzIHByaW9yaXR5IG92ZXIgQU1DIHJlcXVlc3RzICovCisjZGVmaW5lCVBBU1JfQUxMCQkweDAwMDAwMDAwCS8qIEFsbCA0IFNEUkFNIEJhbmtzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2ggKi8KKyNkZWZpbmUJUEFTUl9CMF9CMQkJMHgwMDAwMDAxMAkvKiBTRFJBTSBCYW5rcyAwIGFuZCAxIEFyZSBSZWZyZXNoZWQgSW4JU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkJU0RSQU0gQmFuayAwIElzCVJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2ggKi8KKyNkZWZpbmUJVFJBU18xCQkJMHgwMDAwMDA0MCAvKiBTRFJBTSB0UkFTID0gMSBjeWNsZSAqLworI2RlZmluZQlUUkFTXzIJCQkweDAwMDAwMDgwIC8qIFNEUkFNIHRSQVMgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzMJCQkweDAwMDAwMEMwIC8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzQJCQkweDAwMDAwMTAwIC8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzUJCQkweDAwMDAwMTQwIC8qIFNEUkFNIHRSQVMgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzYJCQkweDAwMDAwMTgwIC8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzcJCQkweDAwMDAwMUMwIC8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzgJCQkweDAwMDAwMjAwIC8qIFNEUkFNIHRSQVMgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzkJCQkweDAwMDAwMjQwIC8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzEwCQkJMHgwMDAwMDI4MCAvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTEJCQkweDAwMDAwMkMwIC8qIFNEUkFNIHRSQVMgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMgkJCTB4MDAwMDAzMDAgLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzEzCQkJMHgwMDAwMDM0MCAvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTQJCQkweDAwMDAwMzgwIC8qIFNEUkFNIHRSQVMgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xNQkJCTB4MDAwMDAzQzAgLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfMQkJCTB4MDAwMDA4MDAgLyogU0RSQU0gdFJQCT0gMSBjeWNsZSAqLworI2RlZmluZQlUUlBfMgkJCTB4MDAwMDEwMDAgLyogU0RSQU0gdFJQCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzMJCQkweDAwMDAxODAwIC8qIFNEUkFNIHRSUAk9IDMgY3ljbGVzICovCisjZGVmaW5lCVRSUF80CQkJMHgwMDAwMjAwMCAvKiBTRFJBTSB0UlAJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNQkJCTB4MDAwMDI4MDAgLyogU0RSQU0gdFJQCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzYJCQkweDAwMDAzMDAwIC8qIFNEUkFNIHRSUAk9IDYgY3ljbGVzICovCisjZGVmaW5lCVRSUF83CQkJMHgwMDAwMzgwMCAvKiBTRFJBTSB0UlAJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzEJCQkweDAwMDA4MDAwIC8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlICovCisjZGVmaW5lCVRSQ0RfMgkJCTB4MDAwMTAwMDAgLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfMwkJCTB4MDAwMTgwMDAgLyogU0RSQU0gdFJDRCA9IDMgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNAkJCTB4MDAwMjAwMDAgLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNQkJCTB4MDAwMjgwMDAgLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNgkJCTB4MDAwMzAwMDAgLyogU0RSQU0gdFJDRCA9IDYgY3ljbGVzICovCisjZGVmaW5lCVRSQ0RfNwkJCTB4MDAwMzgwMDAgLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzICovCisjZGVmaW5lCVRXUl8xCQkJMHgwMDA4MDAwMCAvKiBTRFJBTSB0V1IJPSAxIGN5Y2xlICovCisjZGVmaW5lCVRXUl8yCQkJMHgwMDEwMDAwMCAvKiBTRFJBTSB0V1IJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUV1JfMwkJCTB4MDAxODAwMDAgLyogU0RSQU0gdFdSCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJUFVQU0QJCQkweDAwMjAwMDAwIC8qUG93ZXItdXAgc3RhcnQgZGVsYXkgKi8KKyNkZWZpbmUJUFNNCQkJCTB4MDA0MDAwMDAgLyogU0RSQU0gcG93ZXItdXAgc2VxdWVuY2UgPQlQcmVjaGFyZ2UsIG1vZGUJcmVnaXN0ZXIgc2V0LCA4CUNCUiByZWZyZXNoIGN5Y2xlcyAqLworI2RlZmluZQlQU1MJCQkJMHgwMDgwMDAwMCAvKiBlbmFibGUgU0RSQU0gcG93ZXItdXAgc2VxdWVuY2Ugb24JbmV4dCBTRFJBTSBhY2Nlc3MgKi8KKyNkZWZpbmUJU1JGUwkJCTB4MDEwMDAwMDAgLyogU3RhcnQgU0RSQU0gc2VsZi1yZWZyZXNoIG1vZGUgKi8KKyNkZWZpbmUJRUJVRkUJCQkweDAyMDAwMDAwIC8qIEVuYWJsZSBleHRlcm5hbCBidWZmZXJpbmcJdGltaW5nICovCisjZGVmaW5lCUZCQlJXCQkJMHgwNDAwMDAwMCAvKiBGYXN0IGJhY2stdG8tYmFjawlyZWFkIHdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlFTVJFTgkJCTB4MTAwMDAwMDAgLyogRXh0ZW5kZWQgbW9kZSByZWdpc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJVENTUgkJCTB4MjAwMDAwMDAgLyogVGVtcCBjb21wZW5zYXRlZCBzZWxmIHJlZnJlc2ggdmFsdWUgODUgZGVnIEMgKi8KKyNkZWZpbmUJQ0REQkcJCQkweDQwMDAwMDAwIC8qIFRyaXN0YXRlIFNEUkFNIGNvbnRyb2xzIGR1cmluZyBidXMgZ3JhbnQgKi8KKworLyogRUJJVV9TREJDVEwgTWFza3MgKi8KKyNkZWZpbmUJRUJFCQkJCTB4MDAwMDAwMDEgLyogRW5hYmxlIFNEUkFNIGV4dGVybmFsIGJhbmsgKi8KKyNkZWZpbmUJRUJTWl8xNgkJCTB4MDAwMDAwMDAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMTZNQiAqLworI2RlZmluZQlFQlNaXzMyCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSAzMk1CICovCisjZGVmaW5lCUVCU1pfNjQJCQkweDAwMDAwMDA0IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDY0TUIgKi8KKyNkZWZpbmUJRUJTWl8xMjgJCTB4MDAwMDAwMDYgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMTI4TUIgKi8KKyNkZWZpbmUJRUJTWl8yNTYJCTB4MDAwMDAwMDggLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgKi8KKyNkZWZpbmUJRUJTWl81MTIJCTB4MDAwMDAwMEEgLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIgKi8KKyNkZWZpbmUJRUJDQVdfOAkJCTB4MDAwMDAwMDAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDggYml0cyAqLworI2RlZmluZQlFQkNBV185CQkJMHgwMDAwMDAxMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCisjZGVmaW5lCUVCQ0FXXzEwCQkweDAwMDAwMDIwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KKyNkZWZpbmUJRUJDQVdfMTEJCTB4MDAwMDAwMzAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLworCisvKiBFQklVX1NEU1RBVCBNYXNrcyAqLworI2RlZmluZQlTRENJCQkJMHgwMDAwMDAwMSAvKiBTRFJBTSBjb250cm9sbGVyIGlzIGlkbGUgKi8KKyNkZWZpbmUJU0RTUkEJCQkweDAwMDAwMDAyIC8qIFNEUkFNIFNEUkFNIHNlbGYgcmVmcmVzaCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUJU0RQVUEJCQkweDAwMDAwMDA0IC8qIFNEUkFNIHBvd2VyIHVwIGFjdGl2ZSAgKi8KKyNkZWZpbmUJU0RSUwkJCTB4MDAwMDAwMDggLyogU0RSQU0gaXMgaW4gcmVzZXQJc3RhdGUgKi8KKyNkZWZpbmUJU0RFQVNFCQkJMHgwMDAwMDAxMCAvKiBTRFJBTSBFQUIJc3RpY2t5IGVycm9yIHN0YXR1cyAtIFcxQyAqLworI2RlZmluZQlCR1NUQVQJCQkweDAwMDAwMDIwIC8qIEJ1cyBncmFudGVkICovCisKKworLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSXgpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRXSXhfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSXhfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOwkgKSAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkZ1KQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdyAqLworI2RlZmluZQlDTEtISSh5KQkoKCh5KSYweEZGdSk8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLworI2Vsc2UKKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGKQkJLyogUGVyaW9kcyBDbG9jayBJcyBIZWxkIExvdyAqLworI2RlZmluZQlDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93ICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKy8qIFRXSXhfUFJFU0NBTEUgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlQUkVTQ0FMRQkweDAwN0YJCS8qIFNDTEtzIFBlciBJbnRlcm5hbCBUaW1lIFJlZmVyZW5jZSAoMTBNSHopICovCisjZGVmaW5lCVRXSV9FTkEJCTB4MDA4MAkJLyogVFdJIEVuYWJsZQkJICovCisjZGVmaW5lCVNDQ0IJCTB4MDIwMAkJLyogU0NDQglDb21wYXRpYmlsaXR5IEVuYWJsZSAqLworCisvKiBUV0l4X1NMQVZFX0NUUkwgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJICovCisjZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGggKi8KKyNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQgKi8KKyNkZWZpbmUJTkFLCQkJMHgwMDA4CQkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLworI2RlZmluZQlHRU4JCQkweDAwMTAJCS8qIEdlbmVyYWwgQ2FsbAlBZHJyZXNzCU1hdGNoaW5nIEVuYWJsZWQgKi8KKworLyogVFdJeF9TTEFWRV9TVEFUIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0RJUgkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKSAqLworI2RlZmluZQlHQ0FMTAkJMHgwMDAyCQkvKiBHZW5lcmFsIENhbGwJSW5kaWNhdG9yICovCisKKy8qIFRXSXhfTUFTVEVSX0NUUkwgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJTUVOCQkJMHgwMDAxCQkvKiBNYXN0ZXIgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGggKi8KKyNkZWZpbmUJTURJUgkJMHgwMDA0CQkvKiBNYXN0ZXIgVHJhbnNtaXQgRGlyZWN0aW9uIChSWC9UWCopICovCisjZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcJU3BlY3MgKi8KKyNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbiAqLworI2RlZmluZQlSU1RBUlQJCTB4MDAyMAkJLyogUmVwZWF0IFN0YXJ0CW9yIFN0b3AqIEF0IEVuZAlPZiBUcmFuc2ZlciAqLworI2RlZmluZQlEQ05UCQkweDNGQzAJCS8qIERhdGEJQnl0ZXMgVG8gVHJhbnNmZXIgKi8KKyNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlICovCisjZGVmaW5lCVNDTE9WUgkJMHg4MDAwCQkvKiBTZXJpYWwgQ2xvY2sJT3ZlcnJpZGUgKi8KKworLyogVFdJeF9NQVNURVJfU1RBVCBNYXNrcwkJCQkJCQkgKi8KKyNkZWZpbmUJTVBST0cJCTB4MDAwMQkJLyogTWFzdGVyIFRyYW5zZmVyIEluIFByb2dyZXNzICovCisjZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdAlBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkgKi8KKyNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQgKi8KKyNkZWZpbmUJRE5BSwkJMHgwMDA4CQkvKiBEYXRhCU5vdCBBY2tub3dsZWRnZWQgKi8KKyNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvciAqLworI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZQlFcnJvciAqLworI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UgKi8KKyNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jawlTZW5zZSAqLworI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvciAqLworCisvKiBUV0l4X0lOVF9TUkMJYW5kIFRXSXhfSU5UX0VOQUJMRSBNYXNrcyAqLworI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQgKi8KKyNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUgKi8KKyNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvciAqLworI2RlZmluZQlTT1ZGCQkweDAwMDgJCS8qIFNsYXZlIE92ZXJmbG93ICovCisjZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZSAqLworI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvciAqLworI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZSAqLworI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTwlTZXJ2aWNlICovCisKKy8qIFRXSXhfRklGT19DVEwgTWFza3MJCQkJCSAqLworI2RlZmluZQlYTVRGTFVTSAkweDAwMDEJCS8qIFRyYW5zbWl0IEJ1ZmZlciBGbHVzaCAqLworI2RlZmluZQlSQ1ZGTFVTSAkweDAwMDIJCS8qIFJlY2VpdmUgQnVmZmVyIEZsdXNoICovCisjZGVmaW5lCVhNVElOVExFTgkweDAwMDQJCS8qIFRyYW5zbWl0IEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoICovCisjZGVmaW5lCVJDVklOVExFTgkweDAwMDgJCS8qIFJlY2VpdmUgQnVmZmVyIEludGVycnVwdCBMZW5ndGggKi8KKworLyogVFdJeF9GSUZPX1NUQVQgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlYTVRTVEFUCQkweDAwMDMJCS8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzICovCisjZGVmaW5lCVhNVF9FTVBUWQkweDAwMDAJCS8qCQlUcmFuc21pdCBGSUZPIEVtcHR5ICovCisjZGVmaW5lCVhNVF9IQUxGCTB4MDAwMQkJLyoJCVRyYW5zbWl0IEZJRk8gSGFzIDEgQnl0ZSBUbyBXcml0ZSAqLworI2RlZmluZQlYTVRfRlVMTAkweDAwMDMJCS8qCQlUcmFuc21pdCBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gV3JpdGUpICovCisKKyNkZWZpbmUJUkNWU1RBVAkJMHgwMDBDCQkvKiBSZWNlaXZlIEZJRk8JU3RhdHVzICovCisjZGVmaW5lCVJDVl9FTVBUWQkweDAwMDAJCS8qCQlSZWNlaXZlCUZJRk8gRW1wdHkgKi8KKyNkZWZpbmUJUkNWX0hBTEYJMHgwMDA0CQkvKgkJUmVjZWl2ZQlGSUZPIEhhcyAxIEJ5dGUJVG8gUmVhZCAqLworI2RlZmluZQlSQ1ZfRlVMTAkweDAwMEMJCS8qCQlSZWNlaXZlCUZJRk8gRnVsbCAoMiBCeXRlcyBUbyBSZWFkKSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzkuaAppbmRleCA3YThhYzVmLi44MTAwYmNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oCkBAIC0xLDg1OSArMSwxMyBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCiAKLS8qIFNZU1RFTSAmIE1NIFJFR0lTVEVSIEJJVCAmIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MzgvOSAqLwotCiAjaWZuZGVmIF9ERUZfQkY1MzlfSAogI2RlZmluZSBfREVGX0JGNTM5X0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogU3lzdGVtIE1NUiBSZWdpc3RlciBNYXAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogQ2xvY2svUmVndWxhdG9yIENvbnRyb2wgKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKSAqLwotI2RlZmluZQlQTExfQ1RMCQkJMHhGRkMwMDAwMAkvKiBQTEwgQ29udHJvbCByZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlQTExfRElWCQkJMHhGRkMwMDAwNAkvKiBQTEwgRGl2aWRlIFJlZ2lzdGVyICgxNi1iaXQpICovCi0jZGVmaW5lCVZSX0NUTAkJCTB4RkZDMDAwMDgJLyogVm9sdGFnZSBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlQTExfU1RBVAkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIHJlZ2lzdGVyICgxNi1iaXQpICovCi0jZGVmaW5lCVBMTF9MT0NLQ05UCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrCUNvdW50IHJlZ2lzdGVyICgxNi1iaXQpICovCi0jZGVmaW5lCUNISVBJRAkJCTB4RkZDMDAwMTQJLyogQ2hpcAlJRCBSZWdpc3RlciAqLwotCi0vKiBDSElQSUQgTWFza3MgKi8KLSNkZWZpbmUgQ0hJUElEX1ZFUlNJT04gICAgICAgICAweEYwMDAwMDAwCi0jZGVmaW5lIENISVBJRF9GQU1JTFkgICAgICAgICAgMHgwRkZGRjAwMAotI2RlZmluZSBDSElQSURfTUFOVUZBQ1RVUkUgICAgIDB4MDAwMDBGRkUKLQotLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikgKi8KLSNkZWZpbmUJU1dSU1QJCQkweEZGQzAwMTAwICAvKiBTb2Z0d2FyZQlSZXNldCBSZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlTWVNDUgkJCTB4RkZDMDAxMDQgIC8qIFN5c3RlbSBDb25maWd1cmF0aW9uIHJlZ2lzdGUgKi8KLSNkZWZpbmUJU0lDX1JWRUNUCQkweEZGQzAwMTA4Ci0jZGVmaW5lCVNJQ19JTUFTSzAJCTB4RkZDMDAxMEMgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNJQ19JQVIwCQkweEZGQzAwMTEwICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwICovCi0jZGVmaW5lCVNJQ19JQVIxCQkweEZGQzAwMTE0ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNJQ19JQVIyCQkweEZGQzAwMTE4ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciAzICovCi0jZGVmaW5lCVNJQ19JU1IwCQkJMHhGRkMwMDEyMCAgLyogSW50ZXJydXB0IFN0YXR1cwlSZWdpc3RlciAqLwotI2RlZmluZQlTSUNfSVdSMAkJCTB4RkZDMDAxMjQgIC8qIEludGVycnVwdCBXYWtldXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU0lDX0lNQVNLMQkJCTB4RkZDMDAxMjgJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTSUNfSVNSMQkJCTB4RkZDMDAxMkMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNJQ19JV1IxCQkJMHhGRkMwMDEzMAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU0lDX0lBUjQJCQkweEZGQzAwMTM0CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDQgKi8KLSNkZWZpbmUJU0lDX0lBUjUJCQkweEZGQzAwMTM4CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDUgKi8KLSNkZWZpbmUJU0lDX0lBUjYJCQkweEZGQzAwMTNDCS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDYgKi8KLQotCi0vKiBXYXRjaGRvZyBUaW1lciAoMHhGRkMwMDIwMCAtCTB4RkZDMDAyRkYpICovCi0jZGVmaW5lCVdET0dfQ1RMCTB4RkZDMDAyMDAgIC8qIFdhdGNoZG9nCUNvbnRyb2wJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJV0RPR19DTlQJMHhGRkMwMDIwNCAgLyogV2F0Y2hkb2cJQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJV0RPR19TVEFUCTB4RkZDMDAyMDggIC8qIFdhdGNoZG9nCVN0YXR1cyBSZWdpc3RlciAqLwotCi0KLS8qIFJlYWwJVGltZSBDbG9jayAoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpICovCi0jZGVmaW5lCVJUQ19TVEFUCTB4RkZDMDAzMDAgIC8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUlRDX0lDVEwJMHhGRkMwMDMwNCAgLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVJUQ19JU1RBVAkweEZGQzAwMzA4ICAvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlSVENfU1dDTlQJMHhGRkMwMDMwQyAgLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlSVENfQUxBUk0JMHhGRkMwMDMxMCAgLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUlRDX0ZBU1QJMHhGRkMwMDMxNCAgLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUlRDX1BSRU4JCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyIChhbHRlcm5hdGUJbWFjcm8pICovCi0KLQotLyogVUFSVDAgQ29udHJvbGxlciAoMHhGRkMwMDQwMAktIDB4RkZDMDA0RkYpICovCi0jZGVmaW5lCVVBUlQwX1RIUgkgICAgICAweEZGQzAwNDAwICAvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQwX1JCUgkgICAgICAweEZGQzAwNDAwICAvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9ETEwJICAgICAgMHhGRkMwMDQwMCAgLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCi0jZGVmaW5lCVVBUlQwX0lFUgkgICAgICAweEZGQzAwNDA0ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQwX0RMSAkgICAgICAweEZGQzAwNDA0ICAvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICovCi0jZGVmaW5lCVVBUlQwX0lJUgkgICAgICAweEZGQzAwNDA4ICAvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDBfTENSCSAgICAgIDB4RkZDMDA0MEMgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9NQ1IJCQkgMHhGRkMwMDQxMCAgLyoJTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9MU1IJICAgICAgMHhGRkMwMDQxNCAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDBfU0NSCSAgICAgIDB4RkZDMDA0MUMgIC8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQwX0dDVEwJCSAgICAgMHhGRkMwMDQyNAkgLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotCi0vKiBTUEkwCUNvbnRyb2xsZXIgKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKSAqLwotCi0jZGVmaW5lCVNQSTBfQ1RMCQkJMHhGRkMwMDUwMCAgLyogU1BJMCBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfRkxHCQkJMHhGRkMwMDUwNCAgLyogU1BJMCBGbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfU1RBVAkJCTB4RkZDMDA1MDggIC8qIFNQSTAgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfVERCUgkJCTB4RkZDMDA1MEMgIC8qIFNQSTAgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMF9SREJSCQkJMHhGRkMwMDUxMCAgLyogU1BJMCBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfQkFVRAkJCTB4RkZDMDA1MTQgIC8qIFNQSTAgQmF1ZCByYXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfU0hBRE9XCQkJMHhGRkMwMDUxOCAgLyogU1BJMF9SREJSIFNoYWRvdwlSZWdpc3RlciAqLwotI2RlZmluZSBTUEkwX1JFR0JBU0UJCQlTUEkwX0NUTAotCi0KLS8qIFRJTUVSIDAsIDEsIDIgUmVnaXN0ZXJzICgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikgKi8KLSNkZWZpbmUJVElNRVIwX0NPTkZJRwkJCTB4RkZDMDA2MDAgICAgIC8qIFRpbWVyCTAgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLwotI2RlZmluZQlUSU1FUjBfQ09VTlRFUgkJCQkweEZGQzAwNjA0ICAgICAvKiBUaW1lcgkwIENvdW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNRVIwX1BFUklPRAkJCTB4RkZDMDA2MDggICAgIC8qIFRpbWVyCTAgUGVyaW9kIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRJTUVSMF9XSURUSAkJCTB4RkZDMDA2MEMgICAgIC8qIFRpbWVyCTAgV2lkdGgJUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlUSU1FUjFfQ09ORklHCQkJMHhGRkMwMDYxMAkvKiAgVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KLSNkZWZpbmUJVElNRVIxX0NPVU5URVIJCQkweEZGQzAwNjE0CS8qICBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIJICAgICAqLwotI2RlZmluZQlUSU1FUjFfUEVSSU9ECQkJMHhGRkMwMDYxOAkvKiAgVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIJICAgICAqLwotI2RlZmluZQlUSU1FUjFfV0lEVEgJCQkweEZGQzAwNjFDCS8qICBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyCSAgICAgKi8KLQotI2RlZmluZQlUSU1FUjJfQ09ORklHCQkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAqLwotI2RlZmluZQlUSU1FUjJfQ09VTlRFUgkJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyCSAgICAqLwotI2RlZmluZQlUSU1FUjJfUEVSSU9ECQkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlcgkgICAgKi8KLSNkZWZpbmUJVElNRVIyX1dJRFRICQkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyCSAgICAqLwotCi0jZGVmaW5lCVRJTUVSX0VOQUJMRQkJCQkweEZGQzAwNjQwCS8qIFRpbWVyIEVuYWJsZQlSZWdpc3RlciAqLwotI2RlZmluZQlUSU1FUl9ESVNBQkxFCQkJCTB4RkZDMDA2NDQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlUSU1FUl9TVEFUVVMJCQkJMHhGRkMwMDY0OAkvKiBUaW1lciBTdGF0dXMJUmVnaXN0ZXIgKi8KLQotCi0vKiBQcm9ncmFtbWFibGUJRmxhZ3MgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAqLwotI2RlZmluZQlGSU9fRkxBR19ECQkJCTB4RkZDMDA3MDAgIC8qIEZsYWcgTWFzayB0byBkaXJlY3RseSBzcGVjaWZ5IHN0YXRlIG9mIHBpbnMgKi8KLSNkZWZpbmUJRklPX0ZMQUdfQwkJCTB4RkZDMDA3MDQgIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKGNsZWFyKSAqLwotI2RlZmluZQlGSU9fRkxBR19TCQkJMHhGRkMwMDcwOCAgLyogUGVyaXBoZXJhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAoc2V0KSAqLwotI2RlZmluZQlGSU9fRkxBR19UCQkJCQkweEZGQzAwNzBDICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgdG9nZ2xlIHN0YXRlIG9mIHBpbnMgKi8KLSNkZWZpbmUJRklPX01BU0tBX0QJCQkweEZGQzAwNzEwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KLSNkZWZpbmUJRklPX01BU0tBX0MJCQkweEZGQzAwNzE0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKGNsZWFyKSAqLwotI2RlZmluZQlGSU9fTUFTS0FfUwkJCTB4RkZDMDA3MTggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAoc2V0KSAqLwotI2RlZmluZQlGSU9fTUFTS0FfVAkJCTB4RkZDMDA3MUMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAodG9nZ2xlKSAqLwotI2RlZmluZQlGSU9fTUFTS0JfRAkJCTB4RkZDMDA3MjAgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0IGRpcmVjdGx5KSAqLwotI2RlZmluZQlGSU9fTUFTS0JfQwkJCTB4RkZDMDA3MjQgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoY2xlYXIpICovCi0jZGVmaW5lCUZJT19NQVNLQl9TCQkJMHhGRkMwMDcyOCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyIChzZXQpICovCi0jZGVmaW5lCUZJT19NQVNLQl9UCQkJMHhGRkMwMDcyQyAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyICh0b2dnbGUpICovCi0jZGVmaW5lCUZJT19ESVIJCQkJMHhGRkMwMDczMCAgLyogUGVyaXBoZXJhbCBGbGFnIERpcmVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlGSU9fUE9MQVIJCQkweEZGQzAwNzM0ICAvKiBGbGFnIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlciAqLwotI2RlZmluZQlGSU9fRURHRQkJCTB4RkZDMDA3MzggIC8qIEZsYWcgU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyICovCi0jZGVmaW5lCUZJT19CT1RICQkJMHhGRkMwMDczQyAgLyogRmxhZyBTZXQJb24gQk9USAlFZGdlcyBSZWdpc3RlciAqLwotI2RlZmluZQlGSU9fSU5FTgkJCQkJMHhGRkMwMDc0MCAgLyogRmxhZyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgICovCi0KLQotLyogU1BPUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKSAqLwotI2RlZmluZQlTUE9SVDBfVENSMQkJCQkweEZGQzAwODAwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMF9UQ1IyCQkJCTB4RkZDMDA4MDQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1RDTEtESVYJCQkweEZGQzAwODA4ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDBfVEZTRElWCQkJMHhGRkMwMDgwQyAgLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDBfVFgJCQkweEZGQzAwODEwICAvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfUlgJCQkweEZGQzAwODE4ICAvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfUkNSMQkJCQkweEZGQzAwODIwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMF9SQ1IyCQkJCTB4RkZDMDA4MjQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1JDTEtESVYJCQkweEZGQzAwODI4ICAvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMF9SRlNESVYJCQkweEZGQzAwODJDICAvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwICAvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNCAgLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfTUNNQzEJCQkweEZGQzAwODM4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQwX01DTUMyCQkJMHhGRkMwMDgzQyAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMF9NVENTMAkJCTB4RkZDMDA4NDAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCi0jZGVmaW5lCVNQT1JUMF9NVENTMQkJCTB4RkZDMDA4NDQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUMF9NVENTMgkJCTB4RkZDMDA4NDggIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMF9NVENTMwkJCTB4RkZDMDA4NEMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCi0jZGVmaW5lCVNQT1JUMF9NUkNTMAkJCTB4RkZDMDA4NTAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUJU1BPUlQwX01SQ1MxCQkJMHhGRkMwMDg1NCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDBfTVJDUzIJCQkweEZGQzAwODU4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMF9NUkNTMwkJCTB4RkZDMDA4NUMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KLQotCi0vKiBTUE9SVDEgQ29udHJvbGxlciAoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpICovCi0jZGVmaW5lCVNQT1JUMV9UQ1IxCQkJCTB4RkZDMDA5MDAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1RDUjIJCQkJMHhGRkMwMDkwNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDFfVENMS0RJVgkJCTB4RkZDMDA5MDggIC8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMV9URlNESVYJCQkweEZGQzAwOTBDICAvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMV9UWAkJCTB4RkZDMDA5MTAgIC8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9SWAkJCTB4RkZDMDA5MTggIC8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9SQ1IxCQkJCTB4RkZDMDA5MjAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1JDUjIJCQkJMHhGRkMwMDkyNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDFfUkNMS0RJVgkJCTB4RkZDMDA5MjggIC8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1JGU0RJVgkJCTB4RkZDMDA5MkMgIC8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAgIC8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0ICAvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9NQ01DMQkJCTB4RkZDMDA5MzggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDFfTUNNQzIJCQkweEZGQzAwOTNDICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQxX01UQ1MwCQkJMHhGRkMwMDk0MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUJU1BPUlQxX01UQ1MxCQkJMHhGRkMwMDk0NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQxX01UQ1MyCQkJMHhGRkMwMDk0OCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQxX01UQ1MzCQkJMHhGRkMwMDk0QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KLSNkZWZpbmUJU1BPUlQxX01SQ1MwCQkJMHhGRkMwMDk1MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlTUE9SVDFfTVJDUzEJCQkweEZGQzAwOTU0ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUMV9NUkNTMgkJCTB4RkZDMDA5NTggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQxX01SQ1MzCQkJMHhGRkMwMDk1QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMyAqLwotCi0KLS8qIEV4dGVybmFsIEJ1cwlJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpICovCi0vKiBBc3luY2hyb25vdXMJTWVtb3J5IENvbnRyb2xsZXIgICovCi0jZGVmaW5lCUVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuawlDb250cm9sCVJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUJRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAxICovCi0KLS8qIFNEUkFNIENvbnRyb2xsZXIgKi8KLSNkZWZpbmUJRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwICAvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQgIC8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlFQklVX1NEUlJDCQkJMHhGRkMwMEExOCAgLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDICAvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIgKi8KLQotCi0KLS8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMEIwMCAtIDB4RkZDMDBCRkYpICovCi0KLSNkZWZpbmUJRE1BQzBfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQUMwX1RDX0NOVAkJCTB4RkZDMDBCMTAJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQJcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZAlmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlETUEwX1RDUEVSCQkJRE1BQzBfVENfUEVSCi0jZGVmaW5lCURNQTBfVENDTlQJCQlETUFDMF9UQ19DTlQKLQotCi0vKiBETUEgQ29udHJvbGxlciAwICgweEZGQzAwQzAwCS0gMHhGRkMwMEZGRikJCQkJCQkJICovCi0KLSNkZWZpbmUJRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9TVEFSVF9BRERSCQkJMHhGRkMwMEMwNAkvKiBETUEgQ2hhbm5lbCAwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX1lfQ09VTlQJCQkweEZGQzAwQzE4CS8qIERNQSBDaGFubmVsIDAgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX0NPTkZJRwkJCQkweEZGQzAwQzQ4CS8qIERNQSBDaGFubmVsIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1hfTU9ESUZZCQkJMHhGRkMwMEM1NAkvKiBETUEgQ2hhbm5lbCAxIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzYwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9DVVJSX0FERFIJCQkweEZGQzAwQzY0CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfSVJRX1NUQVRVUwkJCTB4RkZDMDBDNjgJLyogRE1BIENoYW5uZWwgMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDNkMJLyogRE1BIENoYW5uZWwgMSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEM3MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEM3OAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCURNQTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM4MAkvKiBETUEgQ2hhbm5lbCAyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfWF9DT1VOVAkJCTB4RkZDMDBDOTAJLyogRE1BIENoYW5uZWwgMiBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9ZX01PRElGWQkJCTB4RkZDMDBDOUMJLyogRE1BIENoYW5uZWwgMiBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19TVEFSVF9BRERSCQkJMHhGRkMwMENDNAkvKiBETUEgQ2hhbm5lbCAzIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX1lfQ09VTlQJCQkweEZGQzAwQ0Q4CS8qIERNQSBDaGFubmVsIDMgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X0NPTkZJRwkJCQkweEZGQzAwRDA4CS8qIERNQSBDaGFubmVsIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1hfTU9ESUZZCQkJMHhGRkMwMEQxNAkvKiBETUEgQ2hhbm5lbCA0IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDIwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9DVVJSX0FERFIJCQkweEZGQzAwRDI0CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfSVJRX1NUQVRVUwkJCTB4RkZDMDBEMjgJLyogRE1BIENoYW5uZWwgNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEMkMJLyogRE1BIENoYW5uZWwgNCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQzMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQzOAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCURNQTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ0MAkvKiBETUEgQ2hhbm5lbCA1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfWF9DT1VOVAkJCTB4RkZDMDBENTAJLyogRE1BIENoYW5uZWwgNSBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9ZX01PRElGWQkJCTB4RkZDMDBENUMJLyogRE1BIENoYW5uZWwgNSBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9TVEFSVF9BRERSCQkJMHhGRkMwMEQ4NAkvKiBETUEgQ2hhbm5lbCA2IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X1lfQ09VTlQJCQkweEZGQzAwRDk4CS8qIERNQSBDaGFubmVsIDYgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X0NPTkZJRwkJCQkweEZGQzAwREM4CS8qIERNQSBDaGFubmVsIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1hfTU9ESUZZCQkJMHhGRkMwMERENAkvKiBETUEgQ2hhbm5lbCA3IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19DVVJSX0RFU0NfUFRSCQkweEZGQzAwREUwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19DVVJSX0FERFIJCQkweEZGQzAwREU0CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfSVJRX1NUQVRVUwkJCTB4RkZDMDBERTgJLyogRE1BIENoYW5uZWwgNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBERUMJLyogRE1BIENoYW5uZWwgNyBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERGMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERGOAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUEwX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEUwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1NUQVJUX0FERFIJCTB4RkZDMDBFMDQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX0NPTkZJRwkJCTB4RkZDMDBFMDgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1hfQ09VTlQJCTB4RkZDMDBFMTAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1hfTU9ESUZZCQkweEZGQzAwRTE0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfWV9DT1VOVAkJMHhGRkMwMEUxOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfWV9NT0RJRlkJCTB4RkZDMDBFMUMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFMjAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9DVVJSX0FERFIJCTB4RkZDMDBFMjQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEUyOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEUyQwkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRTMwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTM4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCi0KLSNkZWZpbmUJTURNQTBfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRTQwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBFNDQJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9DT05GSUcJCQkweEZGQzAwRTQ4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfWF9DT1VOVAkJMHhGRkMwMEU1MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX1hfTU9ESUZZCQkweEZGQzAwRTU0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX1lfQ09VTlQJCTB4RkZDMDBFNTgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9ZX01PRElGWQkJMHhGRkMwMEU1QwkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFNjAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfQ1VSUl9BRERSCQkweEZGQzAwRTY0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9JUlFfU1RBVFVTCQkweEZGQzAwRTY4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEU2QwkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEU3MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFNzgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJTURNQTBfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRTgwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEU4NAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfWF9DT1VOVAkJMHhGRkMwMEU5MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfWF9NT0RJRlkJCTB4RkZDMDBFOTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9ZX0NPVU5UCQkweEZGQzAwRTk4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9ZX01PRElGWQkJMHhGRkMwMEU5QwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVBMAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX0NVUlJfQUREUgkJMHhGRkMwMEVBNAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFQjAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFQjgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlNRE1BMF9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFQzAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEVDNAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX0NPTkZJRwkJCTB4RkZDMDBFQzgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9YX0NPVU5UCQkweEZGQzAwRUQwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfWF9NT0RJRlkJCTB4RkZDMDBFRDQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfWV9DT1VOVAkJMHhGRkMwMEVEOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX1lfTU9ESUZZCQkweEZGQzAwRURDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVFMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9DVVJSX0FERFIJCTB4RkZDMDBFRTQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRUYwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEVGOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIgTURNQTBfRDBfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QwX1NUQVJUX0FERFIgTURNQTBfRDBfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX0QwX0NPTkZJRyBNRE1BMF9EMF9DT05GSUcKLSNkZWZpbmUgTURNQV9EMF9YX0NPVU5UIE1ETUEwX0QwX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMF9YX01PRElGWSBNRE1BMF9EMF9YX01PRElGWQotI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQgTURNQTBfRDBfWV9DT1VOVAotI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZIE1ETUEwX0QwX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiBNRE1BMF9EMF9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSIE1ETUEwX0QwX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX0QwX0lSUV9TVEFUVVMgTURNQTBfRDBfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX0QwX1BFUklQSEVSQUxfTUFQIE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9YX0NPVU5UIE1ETUEwX0QwX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QwX0NVUlJfWV9DT1VOVCBNRE1BMF9EMF9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX1MwX05FWFRfREVTQ19QVFIgTURNQTBfUzBfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIgTURNQTBfUzBfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX1MwX0NPTkZJRyBNRE1BMF9TMF9DT05GSUcKLSNkZWZpbmUgTURNQV9TMF9YX0NPVU5UIE1ETUEwX1MwX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMF9YX01PRElGWSBNRE1BMF9TMF9YX01PRElGWQotI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQgTURNQTBfUzBfWV9DT1VOVAotI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZIE1ETUEwX1MwX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUiBNRE1BMF9TMF9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSIE1ETUEwX1MwX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMgTURNQTBfUzBfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQIE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9YX0NPVU5UIE1ETUEwX1MwX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVCBNRE1BMF9TMF9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIgTURNQTBfRDFfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QxX1NUQVJUX0FERFIgTURNQTBfRDFfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX0QxX0NPTkZJRyBNRE1BMF9EMV9DT05GSUcKLSNkZWZpbmUgTURNQV9EMV9YX0NPVU5UIE1ETUEwX0QxX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMV9YX01PRElGWSBNRE1BMF9EMV9YX01PRElGWQotI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQgTURNQTBfRDFfWV9DT1VOVAotI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZIE1ETUEwX0QxX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiBNRE1BMF9EMV9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSIE1ETUEwX0QxX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX0QxX0lSUV9TVEFUVVMgTURNQTBfRDFfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX0QxX1BFUklQSEVSQUxfTUFQIE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9YX0NPVU5UIE1ETUEwX0QxX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QxX0NVUlJfWV9DT1VOVCBNRE1BMF9EMV9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX1MxX05FWFRfREVTQ19QVFIgTURNQTBfUzFfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIgTURNQTBfUzFfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX1MxX0NPTkZJRyBNRE1BMF9TMV9DT05GSUcKLSNkZWZpbmUgTURNQV9TMV9YX0NPVU5UIE1ETUEwX1MxX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMV9YX01PRElGWSBNRE1BMF9TMV9YX01PRElGWQotI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQgTURNQTBfUzFfWV9DT1VOVAotI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZIE1ETUEwX1MxX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiBNRE1BMF9TMV9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSIE1ETUEwX1MxX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMgTURNQTBfUzFfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQIE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9YX0NPVU5UIE1ETUEwX1MxX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVCBNRE1BMF9TMV9DVVJSX1lfQ09VTlQKLQotCi0vKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoUFBJKSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpICovCi0jZGVmaW5lCVBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlQUElfU1RBVFVTCQkJMHhGRkMwMTAwNAkvKiBQUEkgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyCUNvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCVBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCVBQSV9GUkFNRQkJCTB4RkZDMDEwMTAJLyogUFBJIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLwotCi0KLS8qIFR3by1XaXJlIEludGVyZmFjZSAwCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkgKi8KLSNkZWZpbmUJVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfQ09OVFJPTAkJMHhGRkMwMTQwNAkvKiBUV0kwCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9NQVNURVJfQ1RMCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX01BU1RFUl9TVEFUCTB4RkZDMDE0MTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfTUFTVEVSX0FERFIJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9GSUZPX1NUQVQJCTB4RkZDMDE0MkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgVFdJMF9SRUdCQVNFCQlUV0kwX0NMS0RJVgotCi0vKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJVFdJMF9QUkVTQ0FMRQkgVFdJMF9DT05UUk9MCi0jZGVmaW5lCVRXSTBfSU5UX1NSQwkgVFdJMF9JTlRfU1RBVAotI2RlZmluZQlUV0kwX0lOVF9FTkFCTEUJIFRXSTBfSU5UX01BU0sKLQotCi0vKiBHZW5lcmFsLVB1cnBvc2UgUG9ydHMgICgweEZGQzAxNTAwIC0JMHhGRkMwMTVGRikJICovCi0KLS8qIEdQSU8JUG9ydCBDIFJlZ2lzdGVyCU5hbWVzICovCi0jZGVmaW5lIFBPUlRDSU9fRkVSCQkJMHhGRkMwMTUwMAkvKiBHUElPCVBpbiBQb3J0IEMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JUQ0lPCQkJCTB4RkZDMDE1MTAJLyogR1BJTwlQaW4gUG9ydCBDIERhdGEJUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVENJT19DTEVBUgkJCTB4RkZDMDE1MjAJLyogQ2xlYXIgR1BJTyBQaW4gUG9ydCBDIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRDSU9fU0VUCQkJMHhGRkMwMTUzMAkvKiBTZXQgR1BJTyBQaW4JUG9ydCBDIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRDSU9fVE9HR0xFCQkJMHhGRkMwMTU0MAkvKiBUb2dnbGUgR1BJTyBQaW4gUG9ydAlDIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRDSU9fRElSCQkJMHhGRkMwMTU1MAkvKiBHUElPCVBpbiBQb3J0IEMgRGlyZWN0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRDSU9fSU5FTgkJCTB4RkZDMDE1NjAJLyogR1BJTwlQaW4gUG9ydCBDIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLwotCi0vKiBHUElPCVBvcnQgRCBSZWdpc3RlcglOYW1lcyAqLwotI2RlZmluZSBQT1JURElPX0ZFUgkJCTB4RkZDMDE1MDQJLyogR1BJTwlQaW4gUG9ydCBEIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVERJTwkJCQkweEZGQzAxNTE0CS8qIEdQSU8JUGluIFBvcnQgRCBEYXRhCVJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRESU9fQ0xFQVIJCQkweEZGQzAxNTI0CS8qIENsZWFyIEdQSU8gUGluIFBvcnQgRCBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURElPX1NFVAkJCTB4RkZDMDE1MzQJLyogU2V0IEdQSU8gUGluCVBvcnQgRCBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURElPX1RPR0dMRQkJCTB4RkZDMDE1NDQJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJRCBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURElPX0RJUgkJCTB4RkZDMDE1NTQJLyogR1BJTwlQaW4gUG9ydCBEIERpcmVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURElPX0lORU4JCQkweEZGQzAxNTY0CS8qIEdQSU8JUGluIFBvcnQgRCBJbnB1dCBFbmFibGUJUmVnaXN0ZXIgKi8KLQotLyogR1BJTwlQb3J0IEUgUmVnaXN0ZXIJTmFtZXMgKi8KLSNkZWZpbmUgUE9SVEVJT19GRVIJCQkweEZGQzAxNTA4CS8qIEdQSU8JUGluIFBvcnQgRSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRFSU8JCQkJMHhGRkMwMTUxOAkvKiBHUElPCVBpbiBQb3J0IEUgRGF0YQlSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURUlPX0NMRUFSCQkJMHhGRkMwMTUyOAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVEVJT19TRVQJCQkweEZGQzAxNTM4CS8qIFNldCBHUElPIFBpbglQb3J0IEUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVEVJT19UT0dHTEUJCQkweEZGQzAxNTQ4CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVEVJT19ESVIJCQkweEZGQzAxNTU4CS8qIEdQSU8JUGluIFBvcnQgRSBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVEVJT19JTkVOCQkJMHhGRkMwMTU2OAkvKiBHUElPCVBpbiBQb3J0IEUgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCi0KLS8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMUIwMCAtIDB4RkZDMDFCRkYpICovCi0KLSNkZWZpbmUJRE1BQzFfVENfUEVSCQkJMHhGRkMwMUIwQwkvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQUMxX1RDX0NOVAkJCTB4RkZDMDFCMTAJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQJcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZAlmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlETUExX1RDUEVSCQkJRE1BQzFfVENfUEVSCi0jZGVmaW5lCURNQTFfVENDTlQJCQlETUFDMV9UQ19DTlQKLQotCi0vKiBETUEgQ29udHJvbGxlciAxICgweEZGQzAxQzAwCS0gMHhGRkMwMUZGRikJCQkJCQkJICovCi0jZGVmaW5lCURNQThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUMwMAkvKiBETUEgQ2hhbm5lbCA4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfU1RBUlRfQUREUgkJCTB4RkZDMDFDMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfQ09ORklHCQkJCTB4RkZDMDFDMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfWF9DT1VOVAkJCTB4RkZDMDFDMTAJLyogRE1BIENoYW5uZWwgOCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfWF9NT0RJRlkJCQkweEZGQzAxQzE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMUMxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9ZX01PRElGWQkJCTB4RkZDMDFDMUMJLyogRE1BIENoYW5uZWwgOCBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X0NVUlJfQUREUgkJCTB4RkZDMDFDMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMUMyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUMyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9TVEFSVF9BRERSCQkJMHhGRkMwMUM0NAkvKiBETUEgQ2hhbm5lbCA5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9DT05GSUcJCQkJMHhGRkMwMUM0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9YX0NPVU5UCQkJMHhGRkMwMUM1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9YX01PRElGWQkJCTB4RkZDMDFDNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X1lfQ09VTlQJCQkweEZGQzAxQzU4CS8qIERNQSBDaGFubmVsIDkgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X1lfTU9ESUZZCQkJMHhGRkMwMUM1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUM2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMUM2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAxQzY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAxQzZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDFDODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9DT05GSUcJCQkweEZGQzAxQzg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDFDOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9YX01PRElGWQkJCTB4RkZDMDFDOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfWV9DT1VOVAkJCTB4RkZDMDFDOTgJLyogRE1BIENoYW5uZWwgMTAgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9ZX01PRElGWQkJCTB4RkZDMDFDOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9DVVJSX0FERFIJCQkweEZGQzAxQ0E0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9JUlFfU1RBVFVTCQkweEZGQzAxQ0E4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQ0MwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX1NUQVJUX0FERFIJCTB4RkZDMDFDQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9DT05GSUcJCQkweEZGQzAxQ0M4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDFDRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9YX01PRElGWQkJCTB4RkZDMDFDRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfWV9DT1VOVAkJCTB4RkZDMDFDRDgJLyogRE1BIENoYW5uZWwgMTEgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9ZX01PRElGWQkJCTB4RkZDMDFDREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9DVVJSX0FERFIJCQkweEZGQzAxQ0U0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9JUlFfU1RBVFVTCQkweEZGQzAxQ0U4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDAwCS8qIERNQSBDaGFubmVsIDEyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX1NUQVJUX0FERFIJCTB4RkZDMDFEMDQJLyogRE1BIENoYW5uZWwgMTIgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9DT05GSUcJCQkweEZGQzAxRDA4CS8qIERNQSBDaGFubmVsIDEyIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfWF9DT1VOVAkJCTB4RkZDMDFEMTAJLyogRE1BIENoYW5uZWwgMTIgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9YX01PRElGWQkJCTB4RkZDMDFEMTQJLyogRE1BIENoYW5uZWwgMTIgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfWV9DT1VOVAkJCTB4RkZDMDFEMTgJLyogRE1BIENoYW5uZWwgMTIgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9ZX01PRElGWQkJCTB4RkZDMDFEMUMJLyogRE1BIENoYW5uZWwgMTIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQyMAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9DVVJSX0FERFIJCQkweEZGQzAxRDI0CS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9JUlFfU1RBVFVTCQkweEZGQzAxRDI4CS8qIERNQSBDaGFubmVsIDEyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQyQwkvKiBETUEgQ2hhbm5lbCAxMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEMzAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQzOAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExM19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDQwCS8qIERNQSBDaGFubmVsIDEzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX1NUQVJUX0FERFIJCTB4RkZDMDFENDQJLyogRE1BIENoYW5uZWwgMTMgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19DT05GSUcJCQkweEZGQzAxRDQ4CS8qIERNQSBDaGFubmVsIDEzIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfWF9DT1VOVAkJCTB4RkZDMDFENTAJLyogRE1BIENoYW5uZWwgMTMgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19YX01PRElGWQkJCTB4RkZDMDFENTQJLyogRE1BIENoYW5uZWwgMTMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfWV9DT1VOVAkJCTB4RkZDMDFENTgJLyogRE1BIENoYW5uZWwgMTMgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19ZX01PRElGWQkJCTB4RkZDMDFENUMJLyogRE1BIENoYW5uZWwgMTMgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQ2MAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19DVVJSX0FERFIJCQkweEZGQzAxRDY0CS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19JUlFfU1RBVFVTCQkweEZGQzAxRDY4CS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQ2QwkvKiBETUEgQ2hhbm5lbCAxMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19DVVJSX1hfQ09VTlQJCTB4RkZDMDFENzAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQ3OAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDgwCS8qIERNQSBDaGFubmVsIDE0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X1NUQVJUX0FERFIJCTB4RkZDMDFEODQJLyogRE1BIENoYW5uZWwgMTQgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9DT05GSUcJCQkweEZGQzAxRDg4CS8qIERNQSBDaGFubmVsIDE0IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfWF9DT1VOVAkJCTB4RkZDMDFEOTAJLyogRE1BIENoYW5uZWwgMTQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9YX01PRElGWQkJCTB4RkZDMDFEOTQJLyogRE1BIENoYW5uZWwgMTQgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfWV9DT1VOVAkJCTB4RkZDMDFEOTgJLyogRE1BIENoYW5uZWwgMTQgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9ZX01PRElGWQkJCTB4RkZDMDFEOUMJLyogRE1BIENoYW5uZWwgMTQgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURBMAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9DVVJSX0FERFIJCQkweEZGQzAxREE0CS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9JUlFfU1RBVFVTCQkweEZGQzAxREE4CS8qIERNQSBDaGFubmVsIDE0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURBQwkvKiBETUEgQ2hhbm5lbCAxNCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEQjAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURCOAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxREMwCS8qIERNQSBDaGFubmVsIDE1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X1NUQVJUX0FERFIJCTB4RkZDMDFEQzQJLyogRE1BIENoYW5uZWwgMTUgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9DT05GSUcJCQkweEZGQzAxREM4CS8qIERNQSBDaGFubmVsIDE1IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfWF9DT1VOVAkJCTB4RkZDMDFERDAJLyogRE1BIENoYW5uZWwgMTUgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9YX01PRElGWQkJCTB4RkZDMDFERDQJLyogRE1BIENoYW5uZWwgMTUgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfWV9DT1VOVAkJCTB4RkZDMDFERDgJLyogRE1BIENoYW5uZWwgMTUgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9ZX01PRElGWQkJCTB4RkZDMDFEREMJLyogRE1BIENoYW5uZWwgMTUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURFMAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9DVVJSX0FERFIJCQkweEZGQzAxREU0CS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9JUlFfU1RBVFVTCQkweEZGQzAxREU4CS8qIERNQSBDaGFubmVsIDE1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURFQwkvKiBETUEgQ2hhbm5lbCAxNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFERjAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURGOAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTAwCS8qIERNQSBDaGFubmVsIDE2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X1NUQVJUX0FERFIJCTB4RkZDMDFFMDQJLyogRE1BIENoYW5uZWwgMTYgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9DT05GSUcJCQkweEZGQzAxRTA4CS8qIERNQSBDaGFubmVsIDE2IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfWF9DT1VOVAkJCTB4RkZDMDFFMTAJLyogRE1BIENoYW5uZWwgMTYgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9YX01PRElGWQkJCTB4RkZDMDFFMTQJLyogRE1BIENoYW5uZWwgMTYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfWV9DT1VOVAkJCTB4RkZDMDFFMTgJLyogRE1BIENoYW5uZWwgMTYgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9ZX01PRElGWQkJCTB4RkZDMDFFMUMJLyogRE1BIENoYW5uZWwgMTYgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUUyMAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9DVVJSX0FERFIJCQkweEZGQzAxRTI0CS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9JUlFfU1RBVFVTCQkweEZGQzAxRTI4CS8qIERNQSBDaGFubmVsIDE2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUUyQwkvKiBETUEgQ2hhbm5lbCAxNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFMzAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUUzOAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExN19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTQwCS8qIERNQSBDaGFubmVsIDE3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X1NUQVJUX0FERFIJCTB4RkZDMDFFNDQJLyogRE1BIENoYW5uZWwgMTcgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19DT05GSUcJCQkweEZGQzAxRTQ4CS8qIERNQSBDaGFubmVsIDE3IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfWF9DT1VOVAkJCTB4RkZDMDFFNTAJLyogRE1BIENoYW5uZWwgMTcgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19YX01PRElGWQkJCTB4RkZDMDFFNTQJLyogRE1BIENoYW5uZWwgMTcgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfWV9DT1VOVAkJCTB4RkZDMDFFNTgJLyogRE1BIENoYW5uZWwgMTcgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19ZX01PRElGWQkJCTB4RkZDMDFFNUMJLyogRE1BIENoYW5uZWwgMTcgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUU2MAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19DVVJSX0FERFIJCQkweEZGQzAxRTY0CS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19JUlFfU1RBVFVTCQkweEZGQzAxRTY4CS8qIERNQSBDaGFubmVsIDE3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUU2QwkvKiBETUEgQ2hhbm5lbCAxNyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19DVVJSX1hfQ09VTlQJCTB4RkZDMDFFNzAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUU3OAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTgwCS8qIERNQSBDaGFubmVsIDE4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X1NUQVJUX0FERFIJCTB4RkZDMDFFODQJLyogRE1BIENoYW5uZWwgMTggU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9DT05GSUcJCQkweEZGQzAxRTg4CS8qIERNQSBDaGFubmVsIDE4IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfWF9DT1VOVAkJCTB4RkZDMDFFOTAJLyogRE1BIENoYW5uZWwgMTggWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9YX01PRElGWQkJCTB4RkZDMDFFOTQJLyogRE1BIENoYW5uZWwgMTggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfWV9DT1VOVAkJCTB4RkZDMDFFOTgJLyogRE1BIENoYW5uZWwgMTggWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9ZX01PRElGWQkJCTB4RkZDMDFFOUMJLyogRE1BIENoYW5uZWwgMTggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVBMAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9DVVJSX0FERFIJCQkweEZGQzAxRUE0CS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9JUlFfU1RBVFVTCQkweEZGQzAxRUE4CS8qIERNQSBDaGFubmVsIDE4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVBQwkvKiBETUEgQ2hhbm5lbCAxOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFQjAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVCOAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUExOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRUMwCS8qIERNQSBDaGFubmVsIDE5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X1NUQVJUX0FERFIJCTB4RkZDMDFFQzQJLyogRE1BIENoYW5uZWwgMTkgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9DT05GSUcJCQkweEZGQzAxRUM4CS8qIERNQSBDaGFubmVsIDE5IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfWF9DT1VOVAkJCTB4RkZDMDFFRDAJLyogRE1BIENoYW5uZWwgMTkgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9YX01PRElGWQkJCTB4RkZDMDFFRDQJLyogRE1BIENoYW5uZWwgMTkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfWV9DT1VOVAkJCTB4RkZDMDFFRDgJLyogRE1BIENoYW5uZWwgMTkgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9ZX01PRElGWQkJCTB4RkZDMDFFREMJLyogRE1BIENoYW5uZWwgMTkgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVFMAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9DVVJSX0FERFIJCQkweEZGQzAxRUU0CS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9JUlFfU1RBVFVTCQkweEZGQzAxRUU4CS8qIERNQSBDaGFubmVsIDE5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVFQwkvKiBETUEgQ2hhbm5lbCAxOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFRjAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVGOAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlNRE1BMV9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGMDAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9TVEFSVF9BRERSCQkweEZGQzAxRjA0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9DT05GSUcJCQkweEZGQzAxRjA4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9YX0NPVU5UCQkweEZGQzAxRjEwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9YX01PRElGWQkJMHhGRkMwMUYxNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX1lfQ09VTlQJCTB4RkZDMDFGMTgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX1lfTU9ESUZZCQkweEZGQzAxRjFDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjIwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfQ1VSUl9BRERSCQkweEZGQzAxRjI0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDFGMjgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGMkMJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMUYzMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMUYzOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUExX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMUY0MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9TVEFSVF9BRERSCQkweEZGQzAxRjQ0CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfQ09ORklHCQkJMHhGRkMwMUY0OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX1hfQ09VTlQJCTB4RkZDMDFGNTAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9YX01PRElGWQkJMHhGRkMwMUY1NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9ZX0NPVU5UCQkweEZGQzAxRjU4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfWV9NT0RJRlkJCTB4RkZDMDFGNUMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjYwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0NVUlJfQUREUgkJMHhGRkMwMUY2NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMUY2OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGNkMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGNzAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAxRjc4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUExX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMUY4MAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1NUQVJUX0FERFIJCTB4RkZDMDFGODQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX0NPTkZJRwkJCTB4RkZDMDFGODgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1hfQ09VTlQJCTB4RkZDMDFGOTAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1hfTU9ESUZZCQkweEZGQzAxRjk0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfWV9DT1VOVAkJMHhGRkMwMUY5OAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfWV9NT0RJRlkJCTB4RkZDMDFGOUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDFGQTAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9DVVJSX0FERFIJCTB4RkZDMDFGQTQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMUZBOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUZBQwkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAxRkIwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAxRkI4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCi0KLSNkZWZpbmUJTURNQTFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAxRkMwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX1NUQVJUX0FERFIJCTB4RkZDMDFGQzQJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9DT05GSUcJCQkweEZGQzAxRkM4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfWF9DT1VOVAkJMHhGRkMwMUZEMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX1hfTU9ESUZZCQkweEZGQzAxRkQ0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX1lfQ09VTlQJCTB4RkZDMDFGRDgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9ZX01PRElGWQkJMHhGRkMwMUZEQwkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDFGRTAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfQ1VSUl9BRERSCQkweEZGQzAxRkU0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9JUlFfU1RBVFVTCQkweEZGQzAxRkU4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUZFQwkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMUZGMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGRjgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLQotLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkgKi8KLSNkZWZpbmUJVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQxX1JCUgkJCTB4RkZDMDIwMDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDFfRExMCQkJMHhGRkMwMjAwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgKi8KLSNkZWZpbmUJVUFSVDFfSUVSCQkJMHhGRkMwMjAwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLwotI2RlZmluZQlVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUJQ29udHJvbAlSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lCVN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQxX0dDVEwJCQkweEZGQzAyMDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCi0KLQotLyogVUFSVDIgQ29udHJvbGxlcgkJKDB4RkZDMDIxMDAgLSAweEZGQzAyMUZGKQkgKi8KLSNkZWZpbmUJVUFSVDJfVEhSCQkJMHhGRkMwMjEwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQyX1JCUgkJCTB4RkZDMDIxMDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDJfRExMCQkJMHhGRkMwMjEwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgKi8KLSNkZWZpbmUJVUFSVDJfSUVSCQkJMHhGRkMwMjEwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQyX0RMSAkJCTB4RkZDMDIxMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLwotI2RlZmluZQlVQVJUMl9JSVIJCQkweEZGQzAyMTA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9MQ1IJCQkweEZGQzAyMTBDCS8qIExpbmUJQ29udHJvbAlSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9NQ1IJCQkweEZGQzAyMTEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDJfTFNSCQkJMHhGRkMwMjExNAkvKiBMaW5lCVN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9TQ1IJCQkweEZGQzAyMTFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQyX0dDVEwJCQkweEZGQzAyMTI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCi0KLQotLyogVHdvLVdpcmUgSW50ZXJmYWNlIDEJKDB4RkZDMDIyMDAgLSAweEZGQzAyMkZGKQkJCSAqLwotI2RlZmluZQlUV0kxX0NMS0RJVgkJCTB4RkZDMDIyMDAJLyogU2VyaWFsIENsb2NrCURpdmlkZXIJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9DT05UUk9MCQkweEZGQzAyMjA0CS8qIFRXSTEJTWFzdGVyIEludGVybmFsCVRpbWUgUmVmZXJlbmNlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfU0xBVkVfQ1RMCQkweEZGQzAyMjA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX1NMQVZFX1NUQVQJCTB4RkZDMDIyMEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9TTEFWRV9BRERSCQkweEZGQzAyMjEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX01BU1RFUl9DVEwJMHhGRkMwMjIxNAkvKiBNYXN0ZXIgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfTUFTVEVSX1NUQVQJMHhGRkMwMjIxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9NQVNURVJfQUREUgkweEZGQzAyMjFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9JTlRfU1RBVAkJMHhGRkMwMjIyMAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9JTlRfTUFTSwkJMHhGRkMwMjIyNAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX0ZJRk9fQ1RMCQkweEZGQzAyMjI4CS8qIEZJRk8JQ29udHJvbAlSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX0ZJRk9fU1RBVAkJMHhGRkMwMjIyQwkvKiBGSUZPCVN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX1hNVF9EQVRBOAkJMHhGRkMwMjI4MAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9YTVRfREFUQTE2CQkweEZGQzAyMjg0CS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX1JDVl9EQVRBOAkJMHhGRkMwMjI4OAkvKiBGSUZPCVJlY2VpdmUJRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX1JDVl9EQVRBMTYJCTB4RkZDMDIyOEMJLyogRklGTwlSZWNlaXZlCURhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVFdJMV9SRUdCQVNFCQlUV0kxX0NMS0RJVgotCi0KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlUV0kxX1BSRVNDQUxFCSAgVFdJMV9DT05UUk9MCi0jZGVmaW5lCVRXSTFfSU5UX1NSQwkgIFRXSTFfSU5UX1NUQVQKLSNkZWZpbmUJVFdJMV9JTlRfRU5BQkxFCSAgVFdJMV9JTlRfTUFTSwotCi0KLS8qIFNQSTEJQ29udHJvbGxlcgkJKDB4RkZDMDIzMDAgLSAweEZGQzAyM0ZGKQkgKi8KLSNkZWZpbmUJU1BJMV9DVEwJCQkweEZGQzAyMzAwICAvKiBTUEkxIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9GTEcJCQkweEZGQzAyMzA0ICAvKiBTUEkxIEZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9TVEFUCQkJMHhGRkMwMjMwOCAgLyogU1BJMSBTdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9UREJSCQkJMHhGRkMwMjMwQyAgLyogU1BJMSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLwotI2RlZmluZQlTUEkxX1JEQlIJCQkweEZGQzAyMzEwICAvKiBTUEkxIFJlY2VpdmUgRGF0YSBCdWZmZXIJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9CQVVECQkJMHhGRkMwMjMxNCAgLyogU1BJMSBCYXVkIHJhdGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9TSEFET1cJCQkweEZGQzAyMzE4ICAvKiBTUEkxX1JEQlIgU2hhZG93CVJlZ2lzdGVyICovCi0jZGVmaW5lIFNQSTFfUkVHQkFTRQkJCVNQSTFfQ1RMCi0KLS8qIFNQSTIJQ29udHJvbGxlcgkJKDB4RkZDMDI0MDAgLSAweEZGQzAyNEZGKQkgKi8KLSNkZWZpbmUJU1BJMl9DVEwJCQkweEZGQzAyNDAwICAvKiBTUEkyIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9GTEcJCQkweEZGQzAyNDA0ICAvKiBTUEkyIEZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9TVEFUCQkJMHhGRkMwMjQwOCAgLyogU1BJMiBTdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9UREJSCQkJMHhGRkMwMjQwQyAgLyogU1BJMiBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLwotI2RlZmluZQlTUEkyX1JEQlIJCQkweEZGQzAyNDEwICAvKiBTUEkyIFJlY2VpdmUgRGF0YSBCdWZmZXIJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9CQVVECQkJMHhGRkMwMjQxNCAgLyogU1BJMiBCYXVkIHJhdGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9TSEFET1cJCQkweEZGQzAyNDE4ICAvKiBTUEkyX1JEQlIgU2hhZG93CVJlZ2lzdGVyICovCi0jZGVmaW5lIFNQSTJfUkVHQkFTRQkJCVNQSTJfQ1RMCi0KLS8qIFNQT1JUMiBDb250cm9sbGVyCQkoMHhGRkMwMjUwMCAtIDB4RkZDMDI1RkYpCQkJICovCi0jZGVmaW5lCVNQT1JUMl9UQ1IxCQkJMHhGRkMwMjUwMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9UQ1IyCQkJMHhGRkMwMjUwNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9UQ0xLRElWCQkweEZGQzAyNTA4CS8qIFNQT1JUMiBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMl9URlNESVYJCTB4RkZDMDI1MEMJLyogU1BPUlQyIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDJfVFgJCQkweEZGQzAyNTEwCS8qIFNQT1JUMiBUWCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9SWAkJCTB4RkZDMDI1MTgJLyogU1BPUlQyIFJYIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1JDUjEJCQkweEZGQzAyNTIwCS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1JDUjIJCQkweEZGQzAyNTI0CS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1JDTEtESVYJCTB4RkZDMDI1MjgJLyogU1BPUlQyIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDJfUkZTRElWCQkweEZGQzAyNTJDCS8qIFNQT1JUMiBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDJfU1RBVAkJCTB4RkZDMDI1MzAJLyogU1BPUlQyIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDJfQ0hOTAkJCTB4RkZDMDI1MzQJLyogU1BPUlQyIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDJfTUNNQzEJCTB4RkZDMDI1MzgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUMl9NQ01DMgkJMHhGRkMwMjUzQwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQyX01UQ1MwCQkweEZGQzAyNTQwCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCi0jZGVmaW5lCVNQT1JUMl9NVENTMQkJMHhGRkMwMjU0NAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDJfTVRDUzIJCTB4RkZDMDI1NDgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQyX01UQ1MzCQkweEZGQzAyNTRDCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCi0jZGVmaW5lCVNQT1JUMl9NUkNTMAkJMHhGRkMwMjU1MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCi0jZGVmaW5lCVNQT1JUMl9NUkNTMQkJMHhGRkMwMjU1NAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCi0jZGVmaW5lCVNQT1JUMl9NUkNTMgkJMHhGRkMwMjU1OAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCi0jZGVmaW5lCVNQT1JUMl9NUkNTMwkJMHhGRkMwMjU1QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCi0KLQotLyogU1BPUlQzIENvbnRyb2xsZXIJCSgweEZGQzAyNjAwIC0gMHhGRkMwMjZGRikJCQkgKi8KLSNkZWZpbmUJU1BPUlQzX1RDUjEJCQkweEZGQzAyNjAwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1RDUjIJCQkweEZGQzAyNjA0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1RDTEtESVYJCTB4RkZDMDI2MDgJLyogU1BPUlQzIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1RGU0RJVgkJMHhGRkMwMjYwQwkvKiBTUE9SVDMgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUM19UWAkJCTB4RkZDMDI2MTAJLyogU1BPUlQzIFRYIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1JYCQkJMHhGRkMwMjYxOAkvKiBTUE9SVDMgUlggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDNfUkNSMQkJCTB4RkZDMDI2MjAJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDNfUkNSMgkJCTB4RkZDMDI2MjQJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDNfUkNMS0RJVgkJMHhGRkMwMjYyOAkvKiBTUE9SVDMgUmVjZWl2ZSBDbG9jawlEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUM19SRlNESVYJCTB4RkZDMDI2MkMJLyogU1BPUlQzIFJlY2VpdmUgRnJhbWUJU3luYyBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUM19TVEFUCQkJMHhGRkMwMjYzMAkvKiBTUE9SVDMgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUM19DSE5MCQkJMHhGRkMwMjYzNAkvKiBTUE9SVDMgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUM19NQ01DMQkJMHhGRkMwMjYzOAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQzX01DTUMyCQkweEZGQzAyNjNDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTUE9SVDNfTVRDUzAJCTB4RkZDMDI2NDAJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUJU1BPUlQzX01UQ1MxCQkweEZGQzAyNjQ0CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUM19NVENTMgkJMHhGRkMwMjY0OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTUE9SVDNfTVRDUzMJCTB4RkZDMDI2NEMJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDMgKi8KLSNkZWZpbmUJU1BPUlQzX01SQ1MwCQkweEZGQzAyNjUwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTAgKi8KLSNkZWZpbmUJU1BPUlQzX01SQ1MxCQkweEZGQzAyNjU0CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTEgKi8KLSNkZWZpbmUJU1BPUlQzX01SQ1MyCQkweEZGQzAyNjU4CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTIgKi8KLSNkZWZpbmUJU1BPUlQzX01SQ1MzCQkweEZGQzAyNjVDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTMgKi8KLQorI2luY2x1ZGUgImRlZkJGNTM4LmgiCiAKIC8qIE1lZGlhIFRyYW5zY2VpdmVyIChNWFZSKSAgICgweEZGQzAyNzAwIC0gMHhGRkMwMjhGRikgKi8KIApAQCAtOTk1LDEyNDkgKzE0OSw0IEBACiAjZGVmaW5lCU1YVlJfQkxPQ0tfQ05UCSAgICAgIDB4RkZDMDI4QzAgIC8qIE1YVlIgQmxvY2sJQ291bnRlciAqLwogI2RlZmluZQlNWFZSX1BMTF9DVExfMgkgICAgICAweEZGQzAyOEM0ICAvKiBNWFZSIFBoYXNlCUxvY2sgTG9vcCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KIAotCi0vKiBDQU4gQ29udHJvbGxlcgkJKDB4RkZDMDJBMDAgLSAweEZGQzAyRkZGKQkJCQkgKi8KLS8qIEZvciBNYWlsYm94ZXMgMC0xNQkJCQkJCQkJCQkJICovCi0jZGVmaW5lCUNBTl9NQzEJCQkJMHhGRkMwMkEwMAkvKiBNYWlsYm94IGNvbmZpZyByZWcgMQkgKi8KLSNkZWZpbmUJQ0FOX01EMQkJCQkweEZGQzAyQTA0CS8qIE1haWxib3ggZGlyZWN0aW9uIHJlZyAxICovCi0jZGVmaW5lCUNBTl9UUlMxCQkJMHhGRkMwMkEwOAkvKiBUcmFuc21pdCBSZXF1ZXN0IFNldAlyZWcgMSAqLwotI2RlZmluZQlDQU5fVFJSMQkJCTB4RkZDMDJBMEMJLyogVHJhbnNtaXQgUmVxdWVzdCBSZXNldCByZWcgMSAqLwotI2RlZmluZQlDQU5fVEExCQkJCTB4RkZDMDJBMTAJLyogVHJhbnNtaXQgQWNrbm93bGVkZ2UJcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX0FBMQkJCQkweEZGQzAyQTE0CS8qIFRyYW5zbWl0IEFib3J0IEFja25vd2xlZGdlIHJlZyAxICovCi0jZGVmaW5lCUNBTl9STVAxCQkJMHhGRkMwMkExOAkvKiBSZWNlaXZlIE1lc3NhZ2UgUGVuZGluZyByZWcgMSAqLwotI2RlZmluZQlDQU5fUk1MMQkJCTB4RkZDMDJBMUMJLyogUmVjZWl2ZSBNZXNzYWdlIExvc3QJcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX01CVElGMQkJCTB4RkZDMDJBMjAJLyogTWFpbGJveCBUcmFuc21pdCBJbnRlcnJ1cHQgRmxhZyByZWcgMSAqLwotI2RlZmluZQlDQU5fTUJSSUYxCQkJMHhGRkMwMkEyNAkvKiBNYWlsYm94IFJlY2VpdmUgIEludGVycnVwdCBGbGFnIHJlZyAxICovCi0jZGVmaW5lCUNBTl9NQklNMQkJCTB4RkZDMDJBMjgJLyogTWFpbGJveCBJbnRlcnJ1cHQgTWFzayByZWcgMSAqLwotI2RlZmluZQlDQU5fUkZIMQkJCTB4RkZDMDJBMkMJLyogUmVtb3RlIEZyYW1lCUhhbmRsaW5nIHJlZyAxICovCi0jZGVmaW5lCUNBTl9PUFNTMQkJCTB4RkZDMDJBMzAJLyogT3ZlcndyaXRlIFByb3RlY3Rpb24JU2luZ2xlIFNob3QgWG1pc3Npb24gcmVnIDEgKi8KLQotLyogRm9yIE1haWxib3hlcyAxNi0zMQkJCQkJCQkJCQkJICovCi0jZGVmaW5lCUNBTl9NQzIJCQkJMHhGRkMwMkE0MAkvKiBNYWlsYm94IGNvbmZpZyByZWcgMgkgKi8KLSNkZWZpbmUJQ0FOX01EMgkJCQkweEZGQzAyQTQ0CS8qIE1haWxib3ggZGlyZWN0aW9uIHJlZyAyICovCi0jZGVmaW5lCUNBTl9UUlMyCQkJMHhGRkMwMkE0OAkvKiBUcmFuc21pdCBSZXF1ZXN0IFNldAlyZWcgMiAqLwotI2RlZmluZQlDQU5fVFJSMgkJCTB4RkZDMDJBNEMJLyogVHJhbnNtaXQgUmVxdWVzdCBSZXNldCByZWcgMiAqLwotI2RlZmluZQlDQU5fVEEyCQkJCTB4RkZDMDJBNTAJLyogVHJhbnNtaXQgQWNrbm93bGVkZ2UJcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX0FBMgkJCQkweEZGQzAyQTU0CS8qIFRyYW5zbWl0IEFib3J0IEFja25vd2xlZGdlIHJlZyAyICovCi0jZGVmaW5lCUNBTl9STVAyCQkJMHhGRkMwMkE1OAkvKiBSZWNlaXZlIE1lc3NhZ2UgUGVuZGluZyByZWcgMiAqLwotI2RlZmluZQlDQU5fUk1MMgkJCTB4RkZDMDJBNUMJLyogUmVjZWl2ZSBNZXNzYWdlIExvc3QJcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX01CVElGMgkJCTB4RkZDMDJBNjAJLyogTWFpbGJveCBUcmFuc21pdCBJbnRlcnJ1cHQgRmxhZyByZWcgMiAqLwotI2RlZmluZQlDQU5fTUJSSUYyCQkJMHhGRkMwMkE2NAkvKiBNYWlsYm94IFJlY2VpdmUgIEludGVycnVwdCBGbGFnIHJlZyAyICovCi0jZGVmaW5lCUNBTl9NQklNMgkJCTB4RkZDMDJBNjgJLyogTWFpbGJveCBJbnRlcnJ1cHQgTWFzayByZWcgMiAqLwotI2RlZmluZQlDQU5fUkZIMgkJCTB4RkZDMDJBNkMJLyogUmVtb3RlIEZyYW1lCUhhbmRsaW5nIHJlZyAyICovCi0jZGVmaW5lCUNBTl9PUFNTMgkJCTB4RkZDMDJBNzAJLyogT3ZlcndyaXRlIFByb3RlY3Rpb24JU2luZ2xlIFNob3QgWG1pc3Npb24gcmVnIDIgKi8KLQotI2RlZmluZQlDQU5fQ0xPQ0sJCQkweEZGQzAyQTgwCS8qIEJpdCBUaW1pbmcgQ29uZmlndXJhdGlvbiByZWdpc3RlciAwICovCi0jZGVmaW5lCUNBTl9USU1JTkcJCQkweEZGQzAyQTg0CS8qIEJpdCBUaW1pbmcgQ29uZmlndXJhdGlvbiByZWdpc3RlciAxICovCi0KLSNkZWZpbmUJQ0FOX0RFQlVHCQkJMHhGRkMwMkE4OAkvKiBEZWJ1ZyBSZWdpc3RlcgkJICovCi0vKiB0aGUgZm9sbG93aW5nIGlzIGZvcgliYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlDQU5fQ05GCQkgQ0FOX0RFQlVHCi0KLSNkZWZpbmUJQ0FOX1NUQVRVUwkJCTB4RkZDMDJBOEMJLyogR2xvYmFsIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fQ0VDCQkJCTB4RkZDMDJBOTAJLyogRXJyb3IgQ291bnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fR0lTCQkJCTB4RkZDMDJBOTQJLyogR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX0dJTQkJCQkweEZGQzAyQTk4CS8qIEdsb2JhbCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fR0lGCQkJCTB4RkZDMDJBOUMJLyogR2xvYmFsIEludGVycnVwdCBGbGFnIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9DT05UUk9MCQkJMHhGRkMwMkFBMAkvKiBNYXN0ZXIgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fSU5UUgkJCTB4RkZDMDJBQTQJLyogSW50ZXJydXB0IFBlbmRpbmcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CVEQJCQkweEZGQzAyQUFDCS8qIE1haWxib3ggVGVtcG9yYXJ5IERpc2FibGUgRmVhdHVyZSAqLwotI2RlZmluZQlDQU5fRVdSCQkJCTB4RkZDMDJBQjAJLyogUHJvZ3JhbW1hYmxlCVdhcm5pbmcJTGV2ZWwgKi8KLSNkZWZpbmUJQ0FOX0VTUgkJCQkweEZGQzAyQUI0CS8qIEVycm9yIFN0YXR1cwlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fVUNDTlQJCQkweEZGQzAyQUM0CS8qIFVuaXZlcnNhbCBDb3VudGVyCSAqLwotI2RlZmluZQlDQU5fVUNSQwkJCTB4RkZDMDJBQzgJLyogVW5pdmVyc2FsIENvdW50ZXIgUmVsb2FkL0NhcHR1cmUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX1VDQ05GCQkJMHhGRkMwMkFDQwkvKiBVbml2ZXJzYWwgQ291bnRlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0KLS8qIE1haWxib3ggQWNjZXB0YW5jZSBNYXNrcwkJCQkJICovCi0jZGVmaW5lCUNBTl9BTTAwTAkJCTB4RkZDMDJCMDAJLyogTWFpbGJveCAwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDBICQkJMHhGRkMwMkIwNAkvKiBNYWlsYm94IDAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDFMCQkJMHhGRkMwMkIwOAkvKiBNYWlsYm94IDEgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wMUgJCQkweEZGQzAyQjBDCS8qIE1haWxib3ggMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wMkwJCQkweEZGQzAyQjEwCS8qIE1haWxib3ggMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTAySAkJCTB4RkZDMDJCMTQJLyogTWFpbGJveCAyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTAzTAkJCTB4RkZDMDJCMTgJLyogTWFpbGJveCAzIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDNICQkJMHhGRkMwMkIxQwkvKiBNYWlsYm94IDMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDRMCQkJMHhGRkMwMkIyMAkvKiBNYWlsYm94IDQgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wNEgJCQkweEZGQzAyQjI0CS8qIE1haWxib3ggNCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wNUwJCQkweEZGQzAyQjI4CS8qIE1haWxib3ggNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA1SAkJCTB4RkZDMDJCMkMJLyogTWFpbGJveCA1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA2TAkJCTB4RkZDMDJCMzAJLyogTWFpbGJveCA2IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDZICQkJMHhGRkMwMkIzNAkvKiBNYWlsYm94IDYgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDdMCQkJMHhGRkMwMkIzOAkvKiBNYWlsYm94IDcgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wN0gJCQkweEZGQzAyQjNDCS8qIE1haWxib3ggNyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wOEwJCQkweEZGQzAyQjQwCS8qIE1haWxib3ggOCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA4SAkJCTB4RkZDMDJCNDQJLyogTWFpbGJveCA4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA5TAkJCTB4RkZDMDJCNDgJLyogTWFpbGJveCA5IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDlICQkJMHhGRkMwMkI0QwkvKiBNYWlsYm94IDkgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTBMCQkJMHhGRkMwMkI1MAkvKiBNYWlsYm94IDEwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTBICQkJMHhGRkMwMkI1NAkvKiBNYWlsYm94IDEwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTExTAkJCTB4RkZDMDJCNTgJLyogTWFpbGJveCAxMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTExSAkJCTB4RkZDMDJCNUMJLyogTWFpbGJveCAxMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xMkwJCQkweEZGQzAyQjYwCS8qIE1haWxib3ggMTIgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xMkgJCQkweEZGQzAyQjY0CS8qIE1haWxib3ggMTIgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTNMCQkJMHhGRkMwMkI2OAkvKiBNYWlsYm94IDEzIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTNICQkJMHhGRkMwMkI2QwkvKiBNYWlsYm94IDEzIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE0TAkJCTB4RkZDMDJCNzAJLyogTWFpbGJveCAxNCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE0SAkJCTB4RkZDMDJCNzQJLyogTWFpbGJveCAxNCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xNUwJCQkweEZGQzAyQjc4CS8qIE1haWxib3ggMTUgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xNUgJCQkweEZGQzAyQjdDCS8qIE1haWxib3ggMTUgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLQotI2RlZmluZQlDQU5fQU0xNkwJCQkweEZGQzAyQjgwCS8qIE1haWxib3ggMTYgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xNkgJCQkweEZGQzAyQjg0CS8qIE1haWxib3ggMTYgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTdMCQkJMHhGRkMwMkI4OAkvKiBNYWlsYm94IDE3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTdICQkJMHhGRkMwMkI4QwkvKiBNYWlsYm94IDE3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE4TAkJCTB4RkZDMDJCOTAJLyogTWFpbGJveCAxOCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE4SAkJCTB4RkZDMDJCOTQJLyogTWFpbGJveCAxOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xOUwJCQkweEZGQzAyQjk4CS8qIE1haWxib3ggMTkgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xOUgJCQkweEZGQzAyQjlDCS8qIE1haWxib3ggMTkgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjBMCQkJMHhGRkMwMkJBMAkvKiBNYWlsYm94IDIwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjBICQkJMHhGRkMwMkJBNAkvKiBNYWlsYm94IDIwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIxTAkJCTB4RkZDMDJCQTgJLyogTWFpbGJveCAyMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIxSAkJCTB4RkZDMDJCQUMJLyogTWFpbGJveCAyMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yMkwJCQkweEZGQzAyQkIwCS8qIE1haWxib3ggMjIgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yMkgJCQkweEZGQzAyQkI0CS8qIE1haWxib3ggMjIgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjNMCQkJMHhGRkMwMkJCOAkvKiBNYWlsYm94IDIzIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjNICQkJMHhGRkMwMkJCQwkvKiBNYWlsYm94IDIzIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI0TAkJCTB4RkZDMDJCQzAJLyogTWFpbGJveCAyNCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI0SAkJCTB4RkZDMDJCQzQJLyogTWFpbGJveCAyNCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yNUwJCQkweEZGQzAyQkM4CS8qIE1haWxib3ggMjUgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yNUgJCQkweEZGQzAyQkNDCS8qIE1haWxib3ggMjUgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjZMCQkJMHhGRkMwMkJEMAkvKiBNYWlsYm94IDI2IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjZICQkJMHhGRkMwMkJENAkvKiBNYWlsYm94IDI2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI3TAkJCTB4RkZDMDJCRDgJLyogTWFpbGJveCAyNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI3SAkJCTB4RkZDMDJCREMJLyogTWFpbGJveCAyNyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yOEwJCQkweEZGQzAyQkUwCS8qIE1haWxib3ggMjggTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yOEgJCQkweEZGQzAyQkU0CS8qIE1haWxib3ggMjggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjlMCQkJMHhGRkMwMkJFOAkvKiBNYWlsYm94IDI5IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjlICQkJMHhGRkMwMkJFQwkvKiBNYWlsYm94IDI5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTMwTAkJCTB4RkZDMDJCRjAJLyogTWFpbGJveCAzMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTMwSAkJCTB4RkZDMDJCRjQJLyogTWFpbGJveCAzMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0zMUwJCQkweEZGQzAyQkY4CS8qIE1haWxib3ggMzEgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0zMUgJCQkweEZGQzAyQkZDCS8qIE1haWxib3ggMzEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLQotLyogQ0FOIEFjY2VwdGFuY2UgTWFzayBNYWNyb3MgKi8KLSNkZWZpbmUJQ0FOX0FNX0woeCkJCQkoQ0FOX0FNMDBMKygoeCkqMHg4KSkKLSNkZWZpbmUJQ0FOX0FNX0goeCkJCQkoQ0FOX0FNMDBIKygoeCkqMHg4KSkKLQotLyogTWFpbGJveCBSZWdpc3RlcnMJCQkJCQkJCQkgKi8KLSNkZWZpbmUJQ0FOX01CMDBfREFUQTAJCTB4RkZDMDJDMDAJLyogTWFpbGJveCAwIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMF9EQVRBMQkJMHhGRkMwMkMwNAkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMF9EQVRBMgkJMHhGRkMwMkMwOAkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMF9EQVRBMwkJMHhGRkMwMkMwQwkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMF9MRU5HVEgJCTB4RkZDMDJDMTAJLyogTWFpbGJveCAwIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfVElNRVNUQU1QCTB4RkZDMDJDMTQJLyogTWFpbGJveCAwIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfSUQwCQkweEZGQzAyQzE4CS8qIE1haWxib3ggMCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMF9JRDEJCTB4RkZDMDJDMUMJLyogTWFpbGJveCAwIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjAxX0RBVEEwCQkweEZGQzAyQzIwCS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDFfREFUQTEJCTB4RkZDMDJDMjQJLyogTWFpbGJveCAxIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDFfREFUQTIJCTB4RkZDMDJDMjgJLyogTWFpbGJveCAxIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDFfREFUQTMJCTB4RkZDMDJDMkMJLyogTWFpbGJveCAxIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDFfTEVOR1RICQkweEZGQzAyQzMwCS8qIE1haWxib3ggMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX1RJTUVTVEFNUAkweEZGQzAyQzM0CS8qIE1haWxib3ggMSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0lEMAkJMHhGRkMwMkMzOAkvKiBNYWlsYm94IDEgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDFfSUQxCQkweEZGQzAyQzNDCS8qIE1haWxib3ggMSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwMl9EQVRBMAkJMHhGRkMwMkM0MAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAyX0RBVEExCQkweEZGQzAyQzQ0CS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAyX0RBVEEyCQkweEZGQzAyQzQ4CS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAyX0RBVEEzCQkweEZGQzAyQzRDCS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAyX0xFTkdUSAkJMHhGRkMwMkM1MAkvKiBNYWlsYm94IDIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9USU1FU1RBTVAJMHhGRkMwMkM1NAkvKiBNYWlsYm94IDIgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9JRDAJCTB4RkZDMDJDNTgJLyogTWFpbGJveCAyIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAyX0lEMQkJMHhGRkMwMkM1QwkvKiBNYWlsYm94IDIgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDNfREFUQTAJCTB4RkZDMDJDNjAJLyogTWFpbGJveCAzIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwM19EQVRBMQkJMHhGRkMwMkM2NAkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwM19EQVRBMgkJMHhGRkMwMkM2OAkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwM19EQVRBMwkJMHhGRkMwMkM2QwkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwM19MRU5HVEgJCTB4RkZDMDJDNzAJLyogTWFpbGJveCAzIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfVElNRVNUQU1QCTB4RkZDMDJDNzQJLyogTWFpbGJveCAzIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfSUQwCQkweEZGQzAyQzc4CS8qIE1haWxib3ggMyBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwM19JRDEJCTB4RkZDMDJDN0MJLyogTWFpbGJveCAzIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjA0X0RBVEEwCQkweEZGQzAyQzgwCS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDRfREFUQTEJCTB4RkZDMDJDODQJLyogTWFpbGJveCA0IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDRfREFUQTIJCTB4RkZDMDJDODgJLyogTWFpbGJveCA0IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDRfREFUQTMJCTB4RkZDMDJDOEMJLyogTWFpbGJveCA0IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDRfTEVOR1RICQkweEZGQzAyQzkwCS8qIE1haWxib3ggNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X1RJTUVTVEFNUAkweEZGQzAyQzk0CS8qIE1haWxib3ggNCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0lEMAkJMHhGRkMwMkM5OAkvKiBNYWlsYm94IDQgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDRfSUQxCQkweEZGQzAyQzlDCS8qIE1haWxib3ggNCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwNV9EQVRBMAkJMHhGRkMwMkNBMAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA1X0RBVEExCQkweEZGQzAyQ0E0CS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA1X0RBVEEyCQkweEZGQzAyQ0E4CS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA1X0RBVEEzCQkweEZGQzAyQ0FDCS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA1X0xFTkdUSAkJMHhGRkMwMkNCMAkvKiBNYWlsYm94IDUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9USU1FU1RBTVAJMHhGRkMwMkNCNAkvKiBNYWlsYm94IDUgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9JRDAJCTB4RkZDMDJDQjgJLyogTWFpbGJveCA1IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA1X0lEMQkJMHhGRkMwMkNCQwkvKiBNYWlsYm94IDUgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDZfREFUQTAJCTB4RkZDMDJDQzAJLyogTWFpbGJveCA2IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNl9EQVRBMQkJMHhGRkMwMkNDNAkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNl9EQVRBMgkJMHhGRkMwMkNDOAkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNl9EQVRBMwkJMHhGRkMwMkNDQwkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNl9MRU5HVEgJCTB4RkZDMDJDRDAJLyogTWFpbGJveCA2IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfVElNRVNUQU1QCTB4RkZDMDJDRDQJLyogTWFpbGJveCA2IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfSUQwCQkweEZGQzAyQ0Q4CS8qIE1haWxib3ggNiBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNl9JRDEJCTB4RkZDMDJDREMJLyogTWFpbGJveCA2IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjA3X0RBVEEwCQkweEZGQzAyQ0UwCS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDdfREFUQTEJCTB4RkZDMDJDRTQJLyogTWFpbGJveCA3IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDdfREFUQTIJCTB4RkZDMDJDRTgJLyogTWFpbGJveCA3IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDdfREFUQTMJCTB4RkZDMDJDRUMJLyogTWFpbGJveCA3IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDdfTEVOR1RICQkweEZGQzAyQ0YwCS8qIE1haWxib3ggNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X1RJTUVTVEFNUAkweEZGQzAyQ0Y0CS8qIE1haWxib3ggNyBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0lEMAkJMHhGRkMwMkNGOAkvKiBNYWlsYm94IDcgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDdfSUQxCQkweEZGQzAyQ0ZDCS8qIE1haWxib3ggNyBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwOF9EQVRBMAkJMHhGRkMwMkQwMAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA4X0RBVEExCQkweEZGQzAyRDA0CS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA4X0RBVEEyCQkweEZGQzAyRDA4CS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA4X0RBVEEzCQkweEZGQzAyRDBDCS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA4X0xFTkdUSAkJMHhGRkMwMkQxMAkvKiBNYWlsYm94IDggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9USU1FU1RBTVAJMHhGRkMwMkQxNAkvKiBNYWlsYm94IDggVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9JRDAJCTB4RkZDMDJEMTgJLyogTWFpbGJveCA4IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA4X0lEMQkJMHhGRkMwMkQxQwkvKiBNYWlsYm94IDggSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDlfREFUQTAJCTB4RkZDMDJEMjAJLyogTWFpbGJveCA5IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOV9EQVRBMQkJMHhGRkMwMkQyNAkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOV9EQVRBMgkJMHhGRkMwMkQyOAkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOV9EQVRBMwkJMHhGRkMwMkQyQwkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOV9MRU5HVEgJCTB4RkZDMDJEMzAJLyogTWFpbGJveCA5IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfVElNRVNUQU1QCTB4RkZDMDJEMzQJLyogTWFpbGJveCA5IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfSUQwCQkweEZGQzAyRDM4CS8qIE1haWxib3ggOSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOV9JRDEJCTB4RkZDMDJEM0MJLyogTWFpbGJveCA5IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjEwX0RBVEEwCQkweEZGQzAyRDQwCS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX0RBVEExCQkweEZGQzAyRDQ0CS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMF9EQVRBMgkJMHhGRkMwMkQ0OAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTBfREFUQTMJCTB4RkZDMDJENEMJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX0xFTkdUSAkJMHhGRkMwMkQ1MAkvKiBNYWlsYm94IDEwIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTBfVElNRVNUQU1QCTB4RkZDMDJENTQJLyogTWFpbGJveCAxMCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX0lEMAkJMHhGRkMwMkQ1OAkvKiBNYWlsYm94IDEwIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX0lEMQkJMHhGRkMwMkQ1QwkvKiBNYWlsYm94IDEwIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjExX0RBVEEwCQkweEZGQzAyRDYwCS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX0RBVEExCQkweEZGQzAyRDY0CS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMV9EQVRBMgkJMHhGRkMwMkQ2OAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTFfREFUQTMJCTB4RkZDMDJENkMJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX0xFTkdUSAkJMHhGRkMwMkQ3MAkvKiBNYWlsYm94IDExIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTFfVElNRVNUQU1QCTB4RkZDMDJENzQJLyogTWFpbGJveCAxMSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX0lEMAkJMHhGRkMwMkQ3OAkvKiBNYWlsYm94IDExIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX0lEMQkJMHhGRkMwMkQ3QwkvKiBNYWlsYm94IDExIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjEyX0RBVEEwCQkweEZGQzAyRDgwCS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX0RBVEExCQkweEZGQzAyRDg0CS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMl9EQVRBMgkJMHhGRkMwMkQ4OAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTJfREFUQTMJCTB4RkZDMDJEOEMJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX0xFTkdUSAkJMHhGRkMwMkQ5MAkvKiBNYWlsYm94IDEyIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTJfVElNRVNUQU1QCTB4RkZDMDJEOTQJLyogTWFpbGJveCAxMiBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX0lEMAkJMHhGRkMwMkQ5OAkvKiBNYWlsYm94IDEyIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX0lEMQkJMHhGRkMwMkQ5QwkvKiBNYWlsYm94IDEyIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjEzX0RBVEEwCQkweEZGQzAyREEwCS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX0RBVEExCQkweEZGQzAyREE0CS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxM19EQVRBMgkJMHhGRkMwMkRBOAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTNfREFUQTMJCTB4RkZDMDJEQUMJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX0xFTkdUSAkJMHhGRkMwMkRCMAkvKiBNYWlsYm94IDEzIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTNfVElNRVNUQU1QCTB4RkZDMDJEQjQJLyogTWFpbGJveCAxMyBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX0lEMAkJMHhGRkMwMkRCOAkvKiBNYWlsYm94IDEzIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX0lEMQkJMHhGRkMwMkRCQwkvKiBNYWlsYm94IDEzIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE0X0RBVEEwCQkweEZGQzAyREMwCS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X0RBVEExCQkweEZGQzAyREM0CS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNF9EQVRBMgkJMHhGRkMwMkRDOAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTRfREFUQTMJCTB4RkZDMDJEQ0MJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X0xFTkdUSAkJMHhGRkMwMkREMAkvKiBNYWlsYm94IDE0IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTRfVElNRVNUQU1QCTB4RkZDMDJERDQJLyogTWFpbGJveCAxNCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X0lEMAkJMHhGRkMwMkREOAkvKiBNYWlsYm94IDE0IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X0lEMQkJMHhGRkMwMkREQwkvKiBNYWlsYm94IDE0IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE1X0RBVEEwCQkweEZGQzAyREUwCS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X0RBVEExCQkweEZGQzAyREU0CS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNV9EQVRBMgkJMHhGRkMwMkRFOAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTVfREFUQTMJCTB4RkZDMDJERUMJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X0xFTkdUSAkJMHhGRkMwMkRGMAkvKiBNYWlsYm94IDE1IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTVfVElNRVNUQU1QCTB4RkZDMDJERjQJLyogTWFpbGJveCAxNSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X0lEMAkJMHhGRkMwMkRGOAkvKiBNYWlsYm94IDE1IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X0lEMQkJMHhGRkMwMkRGQwkvKiBNYWlsYm94IDE1IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE2X0RBVEEwCQkweEZGQzAyRTAwCS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X0RBVEExCQkweEZGQzAyRTA0CS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNl9EQVRBMgkJMHhGRkMwMkUwOAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTZfREFUQTMJCTB4RkZDMDJFMEMJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X0xFTkdUSAkJMHhGRkMwMkUxMAkvKiBNYWlsYm94IDE2IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTZfVElNRVNUQU1QCTB4RkZDMDJFMTQJLyogTWFpbGJveCAxNiBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X0lEMAkJMHhGRkMwMkUxOAkvKiBNYWlsYm94IDE2IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X0lEMQkJMHhGRkMwMkUxQwkvKiBNYWlsYm94IDE2IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE3X0RBVEEwCQkweEZGQzAyRTIwCS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X0RBVEExCQkweEZGQzAyRTI0CS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxN19EQVRBMgkJMHhGRkMwMkUyOAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTdfREFUQTMJCTB4RkZDMDJFMkMJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X0xFTkdUSAkJMHhGRkMwMkUzMAkvKiBNYWlsYm94IDE3IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTdfVElNRVNUQU1QCTB4RkZDMDJFMzQJLyogTWFpbGJveCAxNyBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X0lEMAkJMHhGRkMwMkUzOAkvKiBNYWlsYm94IDE3IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X0lEMQkJMHhGRkMwMkUzQwkvKiBNYWlsYm94IDE3IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE4X0RBVEEwCQkweEZGQzAyRTQwCS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X0RBVEExCQkweEZGQzAyRTQ0CS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOF9EQVRBMgkJMHhGRkMwMkU0OAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMThfREFUQTMJCTB4RkZDMDJFNEMJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X0xFTkdUSAkJMHhGRkMwMkU1MAkvKiBNYWlsYm94IDE4IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMThfVElNRVNUQU1QCTB4RkZDMDJFNTQJLyogTWFpbGJveCAxOCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X0lEMAkJMHhGRkMwMkU1OAkvKiBNYWlsYm94IDE4IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X0lEMQkJMHhGRkMwMkU1QwkvKiBNYWlsYm94IDE4IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjE5X0RBVEEwCQkweEZGQzAyRTYwCS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X0RBVEExCQkweEZGQzAyRTY0CS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOV9EQVRBMgkJMHhGRkMwMkU2OAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTlfREFUQTMJCTB4RkZDMDJFNkMJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X0xFTkdUSAkJMHhGRkMwMkU3MAkvKiBNYWlsYm94IDE5IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTlfVElNRVNUQU1QCTB4RkZDMDJFNzQJLyogTWFpbGJveCAxOSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X0lEMAkJMHhGRkMwMkU3OAkvKiBNYWlsYm94IDE5IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X0lEMQkJMHhGRkMwMkU3QwkvKiBNYWlsYm94IDE5IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjIwX0RBVEEwCQkweEZGQzAyRTgwCS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX0RBVEExCQkweEZGQzAyRTg0CS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMF9EQVRBMgkJMHhGRkMwMkU4OAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjBfREFUQTMJCTB4RkZDMDJFOEMJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX0xFTkdUSAkJMHhGRkMwMkU5MAkvKiBNYWlsYm94IDIwIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjBfVElNRVNUQU1QCTB4RkZDMDJFOTQJLyogTWFpbGJveCAyMCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX0lEMAkJMHhGRkMwMkU5OAkvKiBNYWlsYm94IDIwIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX0lEMQkJMHhGRkMwMkU5QwkvKiBNYWlsYm94IDIwIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjIxX0RBVEEwCQkweEZGQzAyRUEwCS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX0RBVEExCQkweEZGQzAyRUE0CS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMV9EQVRBMgkJMHhGRkMwMkVBOAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjFfREFUQTMJCTB4RkZDMDJFQUMJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX0xFTkdUSAkJMHhGRkMwMkVCMAkvKiBNYWlsYm94IDIxIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjFfVElNRVNUQU1QCTB4RkZDMDJFQjQJLyogTWFpbGJveCAyMSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX0lEMAkJMHhGRkMwMkVCOAkvKiBNYWlsYm94IDIxIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX0lEMQkJMHhGRkMwMkVCQwkvKiBNYWlsYm94IDIxIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjIyX0RBVEEwCQkweEZGQzAyRUMwCS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX0RBVEExCQkweEZGQzAyRUM0CS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMl9EQVRBMgkJMHhGRkMwMkVDOAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjJfREFUQTMJCTB4RkZDMDJFQ0MJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX0xFTkdUSAkJMHhGRkMwMkVEMAkvKiBNYWlsYm94IDIyIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjJfVElNRVNUQU1QCTB4RkZDMDJFRDQJLyogTWFpbGJveCAyMiBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX0lEMAkJMHhGRkMwMkVEOAkvKiBNYWlsYm94IDIyIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX0lEMQkJMHhGRkMwMkVEQwkvKiBNYWlsYm94IDIyIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjIzX0RBVEEwCQkweEZGQzAyRUUwCS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX0RBVEExCQkweEZGQzAyRUU0CS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyM19EQVRBMgkJMHhGRkMwMkVFOAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjNfREFUQTMJCTB4RkZDMDJFRUMJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX0xFTkdUSAkJMHhGRkMwMkVGMAkvKiBNYWlsYm94IDIzIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjNfVElNRVNUQU1QCTB4RkZDMDJFRjQJLyogTWFpbGJveCAyMyBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX0lEMAkJMHhGRkMwMkVGOAkvKiBNYWlsYm94IDIzIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX0lEMQkJMHhGRkMwMkVGQwkvKiBNYWlsYm94IDIzIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI0X0RBVEEwCQkweEZGQzAyRjAwCS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X0RBVEExCQkweEZGQzAyRjA0CS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNF9EQVRBMgkJMHhGRkMwMkYwOAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjRfREFUQTMJCTB4RkZDMDJGMEMJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X0xFTkdUSAkJMHhGRkMwMkYxMAkvKiBNYWlsYm94IDI0IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjRfVElNRVNUQU1QCTB4RkZDMDJGMTQJLyogTWFpbGJveCAyNCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X0lEMAkJMHhGRkMwMkYxOAkvKiBNYWlsYm94IDI0IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X0lEMQkJMHhGRkMwMkYxQwkvKiBNYWlsYm94IDI0IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI1X0RBVEEwCQkweEZGQzAyRjIwCS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X0RBVEExCQkweEZGQzAyRjI0CS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNV9EQVRBMgkJMHhGRkMwMkYyOAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjVfREFUQTMJCTB4RkZDMDJGMkMJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X0xFTkdUSAkJMHhGRkMwMkYzMAkvKiBNYWlsYm94IDI1IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjVfVElNRVNUQU1QCTB4RkZDMDJGMzQJLyogTWFpbGJveCAyNSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X0lEMAkJMHhGRkMwMkYzOAkvKiBNYWlsYm94IDI1IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X0lEMQkJMHhGRkMwMkYzQwkvKiBNYWlsYm94IDI1IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI2X0RBVEEwCQkweEZGQzAyRjQwCS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X0RBVEExCQkweEZGQzAyRjQ0CS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNl9EQVRBMgkJMHhGRkMwMkY0OAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjZfREFUQTMJCTB4RkZDMDJGNEMJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X0xFTkdUSAkJMHhGRkMwMkY1MAkvKiBNYWlsYm94IDI2IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjZfVElNRVNUQU1QCTB4RkZDMDJGNTQJLyogTWFpbGJveCAyNiBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X0lEMAkJMHhGRkMwMkY1OAkvKiBNYWlsYm94IDI2IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X0lEMQkJMHhGRkMwMkY1QwkvKiBNYWlsYm94IDI2IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI3X0RBVEEwCQkweEZGQzAyRjYwCS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X0RBVEExCQkweEZGQzAyRjY0CS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyN19EQVRBMgkJMHhGRkMwMkY2OAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjdfREFUQTMJCTB4RkZDMDJGNkMJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X0xFTkdUSAkJMHhGRkMwMkY3MAkvKiBNYWlsYm94IDI3IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjdfVElNRVNUQU1QCTB4RkZDMDJGNzQJLyogTWFpbGJveCAyNyBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X0lEMAkJMHhGRkMwMkY3OAkvKiBNYWlsYm94IDI3IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X0lEMQkJMHhGRkMwMkY3QwkvKiBNYWlsYm94IDI3IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI4X0RBVEEwCQkweEZGQzAyRjgwCS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X0RBVEExCQkweEZGQzAyRjg0CS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOF9EQVRBMgkJMHhGRkMwMkY4OAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjhfREFUQTMJCTB4RkZDMDJGOEMJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X0xFTkdUSAkJMHhGRkMwMkY5MAkvKiBNYWlsYm94IDI4IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjhfVElNRVNUQU1QCTB4RkZDMDJGOTQJLyogTWFpbGJveCAyOCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X0lEMAkJMHhGRkMwMkY5OAkvKiBNYWlsYm94IDI4IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X0lEMQkJMHhGRkMwMkY5QwkvKiBNYWlsYm94IDI4IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjI5X0RBVEEwCQkweEZGQzAyRkEwCS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X0RBVEExCQkweEZGQzAyRkE0CS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOV9EQVRBMgkJMHhGRkMwMkZBOAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjlfREFUQTMJCTB4RkZDMDJGQUMJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X0xFTkdUSAkJMHhGRkMwMkZCMAkvKiBNYWlsYm94IDI5IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjlfVElNRVNUQU1QCTB4RkZDMDJGQjQJLyogTWFpbGJveCAyOSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X0lEMAkJMHhGRkMwMkZCOAkvKiBNYWlsYm94IDI5IElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X0lEMQkJMHhGRkMwMkZCQwkvKiBNYWlsYm94IDI5IElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjMwX0RBVEEwCQkweEZGQzAyRkMwCS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX0RBVEExCQkweEZGQzAyRkM0CS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMF9EQVRBMgkJMHhGRkMwMkZDOAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzBfREFUQTMJCTB4RkZDMDJGQ0MJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX0xFTkdUSAkJMHhGRkMwMkZEMAkvKiBNYWlsYm94IDMwIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzBfVElNRVNUQU1QCTB4RkZDMDJGRDQJLyogTWFpbGJveCAzMCBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX0lEMAkJMHhGRkMwMkZEOAkvKiBNYWlsYm94IDMwIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX0lEMQkJMHhGRkMwMkZEQwkvKiBNYWlsYm94IDMwIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjMxX0RBVEEwCQkweEZGQzAyRkUwCS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTAgWzE1OjBdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX0RBVEExCQkweEZGQzAyRkU0CS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMV9EQVRBMgkJMHhGRkMwMkZFOAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzFfREFUQTMJCTB4RkZDMDJGRUMJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX0xFTkdUSAkJMHhGRkMwMkZGMAkvKiBNYWlsYm94IDMxIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzFfVElNRVNUQU1QCTB4RkZDMDJGRjQJLyogTWFpbGJveCAzMSBUaW1lIFN0YW1wIFZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX0lEMAkJMHhGRkMwMkZGOAkvKiBNYWlsYm94IDMxIElkZW50aWZpZXIgTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX0lEMQkJMHhGRkMwMkZGQwkvKiBNYWlsYm94IDMxIElkZW50aWZpZXIgSGlnaCBSZWdpc3RlciAqLwotCi0vKiBDQU4gTWFpbGJveCBBcmVhIE1hY3JvcyAqLwotI2RlZmluZQlDQU5fTUJfSUQxKHgpCQkoQ0FOX01CMDBfSUQxKygoeCkqMHgyMCkpCi0jZGVmaW5lCUNBTl9NQl9JRDAoeCkJCShDQU5fTUIwMF9JRDArKCh4KSoweDIwKSkKLSNkZWZpbmUJQ0FOX01CX1RJTUVTVEFNUCh4KQkoQ0FOX01CMDBfVElNRVNUQU1QKygoeCkqMHgyMCkpCi0jZGVmaW5lCUNBTl9NQl9MRU5HVEgoeCkJKENBTl9NQjAwX0xFTkdUSCsoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfREFUQTMoeCkJCShDQU5fTUIwMF9EQVRBMysoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfREFUQTIoeCkJCShDQU5fTUIwMF9EQVRBMisoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfREFUQTEoeCkJCShDQU5fTUIwMF9EQVRBMSsoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfREFUQTAoeCkJCShDQU5fTUIwMF9EQVRBMCsoKHgpKjB4MjApKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIGFuZAlNYWNyb3MgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFNXUlNUIE1hc2sgKi8KLSNkZWZpbmUJU1lTVEVNX1JFU0VUCTB4MDAwNwkvKiBJbml0aWF0ZXMgQSBTeXN0ZW0gU29mdHdhcmUgUmVzZXQgKi8KLSNkZWZpbmUJRE9VQkxFX0ZBVUxUCTB4MDAwOAkvKiBDb3JlCURvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQgKi8KLSNkZWZpbmUJUkVTRVRfRE9VQkxFCTB4MjAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgQ29yZSBEb3VibGUtRmF1bHQgKi8KLSNkZWZpbmUJUkVTRVRfV0RPRwkJMHg0MDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBXYXRjaGRvZyBUaW1lciAqLwotI2RlZmluZQlSRVNFVF9TT0ZUV0FSRQkweDgwMDAJLyogU1cgUmVzZXQgT2NjdXJyZWQgU2luY2UgTGFzdAlSZWFkIE9mCVNXUlNUICovCi0KLS8qIFNZU0NSIE1hc2tzCQkJCQkJCQkJCQkJCSAqLwotI2RlZmluZQlCTU9ERQkJCTB4MDAwNgkvKiBCb290CU1vZGUgLSBMYXRjaGVkIER1cmluZyBIVyBSZXNldCBGcm9tIE1vZGUgUGlucyAqLwotI2RlZmluZQlOT0JPT1QJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tCUwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuCUJNT0RFID0JMCAqLwotCi0KLS8qICoqKioqKioqKioqKiogIFNZU1RFTSBJTlRFUlJVUFQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBQZXJpcGhlcmFsIE1hc2tzIEZvcglTSUMwX0lTUiwgU0lDMF9JV1IsIFNJQzBfSU1BU0sgKi8KLSNkZWZpbmUJUExMX1dBS0VVUF9JUlEJCTB4MDAwMDAwMDEJLyogUExMIFdha2V1cCBJbnRlcnJ1cHQJUmVxdWVzdCAqLwotI2RlZmluZQlETUFDMF9FUlJfSVJRCQkweDAwMDAwMDAyCS8qIERNQSBDb250cm9sbGVyIDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJUFBJX0VSUl9JUlEJCTB4MDAwMDAwMDQJLyogUFBJIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVNQT1JUMF9FUlJfSVJRCQkweDAwMDAwMDA4CS8qIFNQT1JUMCBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlTUE9SVDFfRVJSX0lSUQkJMHgwMDAwMDAxMAkvKiBTUE9SVDEgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJU1BJMF9FUlJfSVJRCQkweDAwMDAwMDIwCS8qIFNQSTAJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJVUFSVDBfRVJSX0lSUQkJMHgwMDAwMDA0MAkvKiBVQVJUMCBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlSVENfSVJRCQkJMHgwMDAwMDA4MAkvKiBSZWFsLVRpbWUgQ2xvY2sgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMF9JUlEJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUExX0lSUQkJMHgwMDAwMDIwMAkvKiBETUEgQ2hhbm5lbCAxIChTUE9SVDAgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTJfSVJRCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDIgKFNQT1JUMCBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BM19JUlEJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgMyAoU1BPUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUE0X0lSUQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCA0IChTUE9SVDEgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTVfSVJRCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDUgKFNQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BNl9JUlEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgNiAoVUFSVCBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BN19JUlEJCTB4MDAwMDgwMDAJLyogRE1BIENoYW5uZWwgNyAoVUFSVCBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJVElNRVIwX0lSUQkJMHgwMDAxMDAwMAkvKiBUaW1lciAwIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVRJTUVSMV9JUlEJCTB4MDAwMjAwMDAJLyogVGltZXIgMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlUSU1FUjJfSVJRCQkweDAwMDQwMDAwCS8qIFRpbWVyIDIgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJUEZBX0lSUQkJCTB4MDAwODAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQSAqLwotI2RlZmluZQlQRkJfSVJRCQkJMHgwMDEwMDAwMAkvKiBQcm9ncmFtbWFibGUJRmxhZyBJbnRlcnJ1cHQgUmVxdWVzdCBCICovCi0jZGVmaW5lCU1ETUEwXzBfSVJRCQkweDAwMjAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTURNQTBfMV9JUlEJCTB4MDA0MDAwMDAJLyogTWVtRE1BMCBTdHJlYW0gMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlXRE9HX0lSUQkJMHgwMDgwMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUFDMV9FUlJfSVJRCQkweDAxMDAwMDAwCS8qIERNQSBDb250cm9sbGVyIDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJU1BPUlQyX0VSUl9JUlEJCTB4MDIwMDAwMDAJLyogU1BPUlQyIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVNQT1JUM19FUlJfSVJRCQkweDA0MDAwMDAwCS8qIFNQT1JUMyBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlNWFZSX1NEX0lSUQkJMHgwODAwMDAwMAkvKiBNWFZSCVN5bmNocm9ub3VzIERhdGEgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJU1BJMV9FUlJfSVJRCQkweDEwMDAwMDAwCS8qIFNQSTEJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJU1BJMl9FUlJfSVJRCQkweDIwMDAwMDAwCS8qIFNQSTIJRXJyb3IgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJVUFSVDFfRVJSX0lSUQkJMHg0MDAwMDAwMAkvKiBVQVJUMSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlVQVJUMl9FUlJfSVJRCQkweDgwMDAwMDAwCS8qIFVBUlQyIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCi0KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlETUEwX0VSUl9JUlEJCURNQUMwX0VSUl9JUlEKLSNkZWZpbmUJRE1BMV9FUlJfSVJRCQlETUFDMV9FUlJfSVJRCi0KLQotLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDX0lTUjEsIFNJQ19JV1IxLCBTSUNfSU1BU0sxCSAqLwotI2RlZmluZQlDQU5fRVJSX0lSUQkJCTB4MDAwMDAwMDEJLyogQ0FOIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQThfSVJRCQkJMHgwMDAwMDAwMgkvKiBETUEgQ2hhbm5lbCA4IChTUE9SVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTlfSVJRCQkJMHgwMDAwMDAwNAkvKiBETUEgQ2hhbm5lbCA5IChTUE9SVDIgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTEwX0lSUQkJCTB4MDAwMDAwMDgJLyogRE1BIENoYW5uZWwgMTAgKFNQT1JUMyBSWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTFfSVJRCQkJMHgwMDAwMDAxMAkvKiBETUEgQ2hhbm5lbCAxMSAoU1BPUlQzIFRYKSBJbnRlcnJ1cHQJUmVxdWVzdCAqLwotI2RlZmluZQlETUExMl9JUlEJCQkweDAwMDAwMDIwCS8qIERNQSBDaGFubmVsIDEyIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTEzX0lSUQkJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgMTMgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTRfSVJRCQkJMHgwMDAwMDA4MAkvKiBETUEgQ2hhbm5lbCAxNCAoU1BJMSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTVfSVJRCQkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCAxNSAoU1BJMikgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTZfSVJRCQkJMHgwMDAwMDIwMAkvKiBETUEgQ2hhbm5lbCAxNiAoVUFSVDEgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTE3X0lSUQkJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgMTcgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUExOF9JUlEJCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDE4IChVQVJUMiBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTlfSVJRCQkJMHgwMDAwMTAwMAkvKiBETUEgQ2hhbm5lbCAxOSAoVUFSVDIgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVRXSTBfSVJRCQkJMHgwMDAwMjAwMAkvKiBUV0kwCUludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVRXSTFfSVJRCQkJMHgwMDAwNDAwMAkvKiBUV0kxCUludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCUNBTl9SWF9JUlEJCQkweDAwMDA4MDAwCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCUNBTl9UWF9JUlEJCQkweDAwMDEwMDAwCS8qIENBTiBUcmFuc21pdAlJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlNRE1BMV8wX0lSUQkJCTB4MDAwMjAwMDAJLyogTWVtRE1BMSBTdHJlYW0gMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlNRE1BMV8xX0lSUQkJCTB4MDAwNDAwMDAJLyogTWVtRE1BMSBTdHJlYW0gMSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlNWFZSX1NUQVRfSVJRCQkJMHgwMDA4MDAwMAkvKiBNWFZSCVN0YXR1cyBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlNWFZSX0NNX0lSUQkJCTB4MDAxMDAwMDAJLyogTVhWUglDb250cm9sCU1lc3NhZ2UJSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTVhWUl9BUF9JUlEJCQkweDAwMjAwMDAwCS8qIE1YVlIJQXN5bmNocm9ub3VzIFBhY2tldCBJbnRlcnJ1cHQgKi8KLQotLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lCU1ETUEwX0lSUQkJTURNQTFfMF9JUlEKLSNkZWZpbmUJTURNQTFfSVJRCQlNRE1BMV8xX0lSUQotCi0jaWZkZWYgX01JU1JBX1JVTEVTCi0jZGVmaW5lCV9NRjE1IDB4RnUKLSNkZWZpbmUJX01GNyA3dQotI2Vsc2UKLSNkZWZpbmUJX01GMTUgMHhGCi0jZGVmaW5lCV9NRjcgNwotI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLwotCi0vKiBTSUNfSU1BU0t4IE1hc2tzCQkJCQkJCQkJCQkgKi8KLSNkZWZpbmUJU0lDX1VOTUFTS19BTEwJMHgwMDAwMDAwMAkJCQkJLyogVW5tYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KLSNkZWZpbmUJU0lDX01BU0tfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIE1hc2sJYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cyAqLwotI2lmZGVmIF9NSVNSQV9SVUxFUwotI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBNYXNrCVBlcmlwaGVyYWwgI3ggaW50ZXJydXB0ICovCi0jZGVmaW5lCVNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KLSNlbHNlCi0jZGVmaW5lCVNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLwotI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4CWludGVycnVwdCAqLwotI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLwotCi0vKiBTSUNfSVdSeCBNYXNrcwkJCQkJCQkJCQkJICovCi0jZGVmaW5lCUlXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMgKi8KLSNkZWZpbmUJSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMgKi8KLSNpZmRlZiBfTUlTUkFfUlVMRVMKLSNkZWZpbmUJSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUZ1KSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLwotI2RlZmluZQlJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRnUgXiAoMSA8PCAoKHgpJjB4MUZ1KSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggKi8KLSNlbHNlCi0jZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLwotI2RlZmluZQlJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCi0jZW5kaWYgLyogX01JU1JBX1JVTEVTICovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIFVBUlR4X0xDUiBSZWdpc3RlciAqLwotI2lmZGVmIF9NSVNSQV9SVUxFUwotI2RlZmluZQlXTFMoeCkJCSgoKHgpLTV1KSAmIDB4MDN1KQkvKiBXb3JkCUxlbmd0aCBTZWxlY3QgKi8KLSNlbHNlCi0jZGVmaW5lCVdMUyh4KQkJKCgoeCktNSkgJiAweDAzKQkvKiBXb3JkCUxlbmd0aCBTZWxlY3QgKi8KLSNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KLSNkZWZpbmUJU1RCCQkJMHgwNAkJCQkvKiBTdG9wCUJpdHMgKi8KLSNkZWZpbmUJUEVOCQkJMHgwOAkJCQkvKiBQYXJpdHkgRW5hYmxlICovCi0jZGVmaW5lCUVQUwkJCTB4MTAJCQkJLyogRXZlbglQYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lCVNUUAkJCTB4MjAJCQkJLyogU3RpY2sgUGFyaXR5ICovCi0jZGVmaW5lCVNCCQkJMHg0MAkJCQkvKiBTZXQgQnJlYWsgKi8KLSNkZWZpbmUJRExBQgkJMHg4MAkJCQkvKiBEaXZpc29yIExhdGNoIEFjY2VzcyAqLwotCi0jZGVmaW5lCURMQUJfUAkJMHgwNwotI2RlZmluZQlTQl9QCQkweDA2Ci0jZGVmaW5lCVNUUF9QCQkweDA1Ci0jZGVmaW5lCUVQU19QCQkweDA0Ci0jZGVmaW5lCVBFTl9QCQkweDAzCi0jZGVmaW5lCVNUQl9QCQkweDAyCi0jZGVmaW5lCVdMU19QMQkJMHgwMQotI2RlZmluZQlXTFNfUDAJCTB4MDAKLQotLyogVUFSVHhfTUNSIFJlZ2lzdGVyICovCi0jZGVmaW5lCUxPT1BfRU5BCTB4MTAJLyogTG9vcGJhY2sgTW9kZSBFbmFibGUgKi8KLSNkZWZpbmUJTE9PUF9FTkFfUAkweDA0Ci0vKiBEZXByZWNhdGVkIFVBUlR4X01DUglNYXNrCQkJICovCi0KLS8qIFVBUlR4X0xTUiBSZWdpc3RlciAqLwotI2RlZmluZQlEUgkJCTB4MDEJLyogRGF0YQlSZWFkeSAqLwotI2RlZmluZQlPRQkJCTB4MDIJLyogT3ZlcnJ1biBFcnJvciAqLwotI2RlZmluZQlQRQkJCTB4MDQJLyogUGFyaXR5IEVycm9yICovCi0jZGVmaW5lCUZFCQkJMHgwOAkvKiBGcmFtaW5nIEVycm9yICovCi0jZGVmaW5lCUJJCQkJMHgxMAkvKiBCcmVhayBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVEhSRQkJMHgyMAkvKiBUSFIgRW1wdHkgKi8KLSNkZWZpbmUJVEVNVAkJMHg0MAkvKiBUU1IgYW5kIFVBUlRfVEhSIEVtcHR5ICovCi0KLSNkZWZpbmUJVEVNUF9QCQkweDA2Ci0jZGVmaW5lCVRIUkVfUAkJMHgwNQotI2RlZmluZQlCSV9QCQkweDA0Ci0jZGVmaW5lCUZFX1AJCTB4MDMKLSNkZWZpbmUJUEVfUAkJMHgwMgotI2RlZmluZQlPRV9QCQkweDAxCi0jZGVmaW5lCURSX1AJCTB4MDAKLQotLyogVUFSVHhfSUVSIFJlZ2lzdGVyICovCi0jZGVmaW5lCUVSQkZJCQkweDAxCQkvKiBFbmFibGUgUmVjZWl2ZSBCdWZmZXIgRnVsbCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJRVRCRUkJCTB4MDIJCS8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkJSW50ZXJydXB0ICovCi0jZGVmaW5lCUVMU0kJCTB4MDQJCS8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0ICovCi0KLSNkZWZpbmUJRUxTSV9QCQkweDAyCi0jZGVmaW5lCUVUQkVJX1AJCTB4MDEKLSNkZWZpbmUJRVJCRklfUAkJMHgwMAotCi0vKiBVQVJUeF9JSVIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTklOVAkJMHgwMQotI2RlZmluZQlTVEFUVVNfUDEJMHgwMgotI2RlZmluZQlTVEFUVVNfUDAJMHgwMQotI2RlZmluZQlOSU5UX1AJCTB4MDAKLQotLyogVUFSVHhfR0NUTCBSZWdpc3RlciAqLwotI2RlZmluZQlVQ0VOCQkweDAxCQkvKiBFbmFibGUgVUFSVHgJQ2xvY2tzICovCi0jZGVmaW5lCUlSRU4JCTB4MDIJCS8qIEVuYWJsZSBJckRBIE1vZGUgKi8KLSNkZWZpbmUJVFBPTEMJCTB4MDQJCS8qIElyREEJVFggUG9sYXJpdHkgQ2hhbmdlICovCi0jZGVmaW5lCVJQT0xDCQkweDA4CQkvKiBJckRBCVJYIFBvbGFyaXR5IENoYW5nZSAqLwotI2RlZmluZQlGUEUJCQkweDEwCQkvKiBGb3JjZSBQYXJpdHkJRXJyb3IgT24gVHJhbnNtaXQgKi8KLSNkZWZpbmUJRkZFCQkJMHgyMAkJLyogRm9yY2UgRnJhbWluZyBFcnJvciBPbiBUcmFuc21pdCAqLwotCi0jZGVmaW5lCUZGRV9QCQkweDA1Ci0jZGVmaW5lCUZQRV9QCQkweDA0Ci0jZGVmaW5lCVJQT0xDX1AJCTB4MDMKLSNkZWZpbmUJVFBPTENfUAkJMHgwMgotI2RlZmluZQlJUkVOX1AJCTB4MDEKLSNkZWZpbmUJVUNFTl9QCQkweDAwCi0KLQotLyogICoqKioqKioqKiAgUEFSQUxMRUwJUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKioqKiAgICovCi0vKiAgUFBJX0NPTlRST0wJTWFza3MJICAgICAgKi8KLSNkZWZpbmUJUE9SVF9FTgkJMHgwMDAxCS8qIFBQSSBQb3J0IEVuYWJsZSAgKi8KLSNkZWZpbmUJUE9SVF9ESVIJMHgwMDAyCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkgICAgKi8KLSNkZWZpbmUJWEZSX1RZUEUJMHgwMDBDCS8qIFBQSSBUcmFuc2ZlcglUeXBlICAqLwotI2RlZmluZQlQT1JUX0NGRwkweDAwMzAJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZQlGTERfU0VMCQkweDAwNDAJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QgKi8KLSNkZWZpbmUJUEFDS19FTgkJMHgwMDgwCS8qIFBQSSBQYWNraW5nIE1vZGUgKi8KLS8qIHByZXZpb3VzIHZlcnNpb25zIG9mCWRlZkJGNTM5LmggZXJyb25lb3VzbHkgaW5jbHVkZWQJRE1BMzIgKFBQSSAzMi1iaXQgRE1BIEVuYWJsZSkgKi8KLSNkZWZpbmUJU0tJUF9FTgkJMHgwMjAwCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlICovCi0jZGVmaW5lCVNLSVBfRU8JCTB4MDQwMAkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cyAqLwotI2RlZmluZQlETEVOR1RICQkweDM4MDAJLyogUFBJIERhdGEgTGVuZ3RoICAqLwotI2RlZmluZQlETEVOXzgJCTB4MAkgICAgIC8qCVBQSSBEYXRhIExlbmd0aAltYXNrIGZvciBETEVOPTggKi8KLSNkZWZpbmUJRExFTl8xMAkJMHgwODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEwIEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xMQkJMHgxMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDExIEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xMgkJMHgxODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEyIEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xMwkJMHgyMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDEzIEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xNAkJMHgyODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE0IEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xNQkJMHgzMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDE1IEJpdHMgKi8KLSNkZWZpbmUJRExFTl8xNgkJMHgzODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE2IEJpdHMgKi8KLSNpZmRlZiBfTUlTUkFfUlVMRVMKLSNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTl1KSAmIDB4MDd1KSA8PCAxMSkgIC8qIFBQSSBEYXRhCUxlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCi0jZWxzZQotI2RlZmluZQlETEVOKHgpCQkoKCgoeCktOSkgJiAweDA3KSA8PCAxMSkgIC8qIFBQSSBEYXRhIExlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCi0jZW5kaWYgLyogX01JU1JBX1JVTEVTICovCi0jZGVmaW5lCVBPTAkJCTB4QzAwMAkvKiBQUEkgU2lnbmFsIFBvbGFyaXRpZXMgICAgICAgKi8KLSNkZWZpbmUJUE9MQwkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkgKi8KLSNkZWZpbmUJUE9MUwkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eSAqLwotCi0KLS8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCSAgICAgKi8KLSNkZWZpbmUJRkxECQkJMHgwNDAwCS8qIEZpZWxkIEluZGljYXRvciAgICovCi0jZGVmaW5lCUZUX0VSUgkJMHgwODAwCS8qIEZyYW1lIFRyYWNrIEVycm9yICovCi0jZGVmaW5lCU9WUgkJCTB4MTAwMAkvKiBGSUZPCU92ZXJmbG93IEVycm9yICovCi0jZGVmaW5lCVVORFIJCTB4MjAwMAkvKiBGSUZPCVVuZGVycnVuIEVycm9yICovCi0jZGVmaW5lCUVSUl9ERVQJCTB4NDAwMAkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IgKi8KLSNkZWZpbmUJRVJSX05DT1IJMHg4MDAwCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yICovCi0KLQotLyogKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBETUF4X1BFUklQSEVSQUxfTUFQLAlNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzICovCi0KLSNkZWZpbmUJQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKi8KLSNkZWZpbmUJQ1RZUEVfUAkJCTB4NgkJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgQklUIFBPU0lUSU9OICovCi0jZGVmaW5lCVBDQVA4CQkJMHgwMDgwCS8qIERNQSA4LWJpdCBPcGVyYXRpb24gSW5kaWNhdG9yICAgKi8KLSNkZWZpbmUJUENBUDE2CQkJMHgwMTAwCS8qIERNQSAxNi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLwotI2RlZmluZQlQQ0FQMzIJCQkweDAyMDAJLyogRE1BIDMyLWJpdCBPcGVyYXRpb24JSW5kaWNhdG9yICovCi0jZGVmaW5lCVBDQVBXUgkJCTB4MDQwMAkvKiBETUEgV3JpdGUgT3BlcmF0aW9uIEluZGljYXRvciAqLwotI2RlZmluZQlQQ0FQUkQJCQkweDA4MDAJLyogRE1BIFJlYWQgT3BlcmF0aW9uIEluZGljYXRvciAqLwotI2RlZmluZQlQTUFQCQkJMHhGMDAwCS8qIERNQSBQZXJpcGhlcmFsIE1hcCBGaWVsZCAqLwotCi0vKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMCAqLwotI2RlZmluZQlQTUFQX1BQSQkJMHgwMDAwCS8qIFBNQVAJUFBJIFBvcnQgRE1BICovCi0jZGVmaW5lCVBNQVBfU1BPUlQwUlgJMHgxMDAwCS8qIFBNQVAJU1BPUlQwIFJlY2VpdmUgRE1BICovCi0jZGVmaW5lCVBNQVBfU1BPUlQwVFgJMHgyMDAwCS8qIFBNQVAJU1BPUlQwIFRyYW5zbWl0CURNQSAqLwotI2RlZmluZQlQTUFQX1NQT1JUMVJYCTB4MzAwMAkvKiBQTUFQCVNQT1JUMSBSZWNlaXZlIERNQSAqLwotI2RlZmluZQlQTUFQX1NQT1JUMVRYCTB4NDAwMAkvKiBQTUFQCVNQT1JUMSBUcmFuc21pdAlETUEgKi8KLSNkZWZpbmUJUE1BUF9TUEkwCQkweDUwMDAJLyogUE1BUAlTUEkgRE1BICovCi0jZGVmaW5lCVBNQVBfVUFSVDBSWAkJMHg2MDAwCS8qIFBNQVAJVUFSVCBSZWNlaXZlIERNQSAqLwotI2RlZmluZQlQTUFQX1VBUlQwVFgJCTB4NzAwMAkvKiBQTUFQCVVBUlQgVHJhbnNtaXQgRE1BICovCi0KLS8qIFBNQVAJRW5jb2RpbmdzIEZvciBETUEgQ29udHJvbGxlciAxICovCi0jZGVmaW5lCVBNQVBfU1BPUlQyUlgJICAgIDB4MDAwMCAgLyogUE1BUCBTUE9SVDIgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUE9SVDJUWAkgICAgMHgxMDAwICAvKiBQTUFQIFNQT1JUMiBUcmFuc21pdCBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUE9SVDNSWAkgICAgMHgyMDAwICAvKiBQTUFQIFNQT1JUMyBSZWNlaXZlIERNQSAqLwotI2RlZmluZQlQTUFQX1NQT1JUM1RYCSAgICAweDMwMDAgIC8qIFBNQVAgU1BPUlQzIFRyYW5zbWl0IERNQSAqLwotI2RlZmluZQlQTUFQX1NQSTEJICAgIDB4NjAwMCAgLyogUE1BUCBTUEkxIERNQSAqLwotI2RlZmluZQlQTUFQX1NQSTIJICAgIDB4NzAwMCAgLyogUE1BUCBTUEkyIERNQSAqLwotI2RlZmluZQlQTUFQX1VBUlQxUlgJICAgIDB4ODAwMCAgLyogUE1BUCBVQVJUMSBSZWNlaXZlIERNQSAqLwotI2RlZmluZQlQTUFQX1VBUlQxVFgJICAgIDB4OTAwMCAgLyogUE1BUCBVQVJUMSBUcmFuc21pdCBETUEgKi8KLSNkZWZpbmUJUE1BUF9VQVJUMlJYCSAgICAweEEwMDAgIC8qIFBNQVAgVUFSVDIgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9VQVJUMlRYCSAgICAweEIwMDAgIC8qIFBNQVAgVUFSVDIgVHJhbnNtaXQgRE1BICovCi0KLQotLyogICoqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUwkqKioqKioqKioqKioqKioqKioqKiAqLwotLyogUFdNIFRpbWVyIGJpdCBkZWZpbml0aW9ucyAqLwotLyogVElNRVJfRU5BQkxFCVJlZ2lzdGVyICovCi0jZGVmaW5lCVRJTUVOMAkJCTB4MDAwMQkvKiBFbmFibGUgVGltZXIJMCAqLwotI2RlZmluZQlUSU1FTjEJCQkweDAwMDIJLyogRW5hYmxlIFRpbWVyCTEgKi8KLSNkZWZpbmUJVElNRU4yCQkJMHgwMDA0CS8qIEVuYWJsZSBUaW1lcgkyICovCi0KLSNkZWZpbmUJVElNRU4wX1AJCTB4MDAKLSNkZWZpbmUJVElNRU4xX1AJCTB4MDEKLSNkZWZpbmUJVElNRU4yX1AJCTB4MDIKLQotLyogVElNRVJfRElTQUJMRSBSZWdpc3RlciAqLwotI2RlZmluZQlUSU1ESVMwCQkJMHgwMDAxCS8qIERpc2FibGUgVGltZXIgMCAqLwotI2RlZmluZQlUSU1ESVMxCQkJMHgwMDAyCS8qIERpc2FibGUgVGltZXIgMSAqLwotI2RlZmluZQlUSU1ESVMyCQkJMHgwMDA0CS8qIERpc2FibGUgVGltZXIgMiAqLwotCi0jZGVmaW5lCVRJTURJUzBfUAkJMHgwMAotI2RlZmluZQlUSU1ESVMxX1AJCTB4MDEKLSNkZWZpbmUJVElNRElTMl9QCQkweDAyCi0KLS8qIFRJTUVSX1NUQVRVUwlSZWdpc3RlciAqLwotI2RlZmluZQlUSU1JTDAJCQkweDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVElNSUwxCQkJMHgwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0ICovCi0jZGVmaW5lCVRJTUlMMgkJCTB4MDAwNAkvKiBUaW1lciAyIEludGVycnVwdCAqLwotI2RlZmluZQlUT1ZGX0VSUjAJCTB4MDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cgKi8KLSNkZWZpbmUJVE9WRl9FUlIxCQkweDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93ICovCi0jZGVmaW5lCVRPVkZfRVJSMgkJMHgwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdyAqLwotI2RlZmluZQlUUlVOMAkJCTB4MTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KLSNkZWZpbmUJVFJVTjEJCQkweDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUJU3RhdHVzICovCi0jZGVmaW5lCVRSVU4yCQkJMHg0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLwotCi0jZGVmaW5lCVRJTUlMMF9QCQkweDAwCi0jZGVmaW5lCVRJTUlMMV9QCQkweDAxCi0jZGVmaW5lCVRJTUlMMl9QCQkweDAyCi0jZGVmaW5lCVRPVkZfRVJSMF9QCQkweDA0Ci0jZGVmaW5lCVRPVkZfRVJSMV9QCQkweDA1Ci0jZGVmaW5lCVRPVkZfRVJSMl9QCQkweDA2Ci0jZGVmaW5lCVRSVU4wX1AJCQkweDBDCi0jZGVmaW5lCVRSVU4xX1AJCQkweDBECi0jZGVmaW5lCVRSVU4yX1AJCQkweDBFCi0KLS8qIEFsdGVybmF0ZSBEZXByZWNhdGVkCU1hY3JvcyBQcm92aWRlZAlGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlUT1ZMX0VSUjAJCVRPVkZfRVJSMAotI2RlZmluZQlUT1ZMX0VSUjEJCVRPVkZfRVJSMQotI2RlZmluZQlUT1ZMX0VSUjIJCVRPVkZfRVJSMgotI2RlZmluZQlUT1ZMX0VSUjBfUAkJVE9WRl9FUlIwX1AKLSNkZWZpbmUJVE9WTF9FUlIxX1AJVE9WRl9FUlIxX1AKLSNkZWZpbmUJVE9WTF9FUlIyX1AJVE9WRl9FUlIyX1AKLQotLyogVElNRVJ4X0NPTkZJRyBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJUFdNX09VVAkJCTB4MDAwMQotI2RlZmluZQlXRFRIX0NBUAkJMHgwMDAyCi0jZGVmaW5lCUVYVF9DTEsJCQkweDAwMDMKLSNkZWZpbmUJUFVMU0VfSEkJCTB4MDAwNAotI2RlZmluZQlQRVJJT0RfQ05UCQkweDAwMDgKLSNkZWZpbmUJSVJRX0VOQQkJCTB4MDAxMAotI2RlZmluZQlUSU5fU0VMCQkJMHgwMDIwCi0jZGVmaW5lCU9VVF9ESVMJCQkweDAwNDAKLSNkZWZpbmUJQ0xLX1NFTAkJCTB4MDA4MAotI2RlZmluZQlUT0dHTEVfSEkJCTB4MDEwMAotI2RlZmluZQlFTVVfUlVOCQkJMHgwMjAwCi0jaWZkZWYgX01JU1JBX1JVTEVTCi0jZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwM3UpIDw8IDE0KQotI2Vsc2UKLSNkZWZpbmUJRVJSX1RZUCh4KQkJKCgoeCkgJgkweDAzKSA8PCAxNCkKLSNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KLQotI2RlZmluZQlUTU9ERV9QMAkJMHgwMAotI2RlZmluZQlUTU9ERV9QMQkJMHgwMQotI2RlZmluZQlQVUxTRV9ISV9QCQkweDAyCi0jZGVmaW5lCVBFUklPRF9DTlRfUAkweDAzCi0jZGVmaW5lCUlSUV9FTkFfUAkJMHgwNAotI2RlZmluZQlUSU5fU0VMX1AJCTB4MDUKLSNkZWZpbmUJT1VUX0RJU19QCQkweDA2Ci0jZGVmaW5lCUNMS19TRUxfUAkJMHgwNwotI2RlZmluZQlUT0dHTEVfSElfUAkJMHgwOAotI2RlZmluZQlFTVVfUlVOX1AJCTB4MDkKLSNkZWZpbmUJRVJSX1RZUF9QMAkJMHgwRQotI2RlZmluZQlFUlJfVFlQX1AxCQkweDBGCi0KLQotLyovICoqKioqKioqKioqKioqKioqKgkgR0VORVJBTC1QVVJQT1NFIEkvTyAgKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgRmxhZyBJL08gKEZJT18pIE1hc2tzICovCi0jZGVmaW5lCVBGMAkJCTB4MDAwMQotI2RlZmluZQlQRjEJCQkweDAwMDIKLSNkZWZpbmUJUEYyCQkJMHgwMDA0Ci0jZGVmaW5lCVBGMwkJCTB4MDAwOAotI2RlZmluZQlQRjQJCQkweDAwMTAKLSNkZWZpbmUJUEY1CQkJMHgwMDIwCi0jZGVmaW5lCVBGNgkJCTB4MDA0MAotI2RlZmluZQlQRjcJCQkweDAwODAKLSNkZWZpbmUJUEY4CQkJMHgwMTAwCi0jZGVmaW5lCVBGOQkJCTB4MDIwMAotI2RlZmluZQlQRjEwCQkweDA0MDAKLSNkZWZpbmUJUEYxMQkJMHgwODAwCi0jZGVmaW5lCVBGMTIJCTB4MTAwMAotI2RlZmluZQlQRjEzCQkweDIwMDAKLSNkZWZpbmUJUEYxNAkJMHg0MDAwCi0jZGVmaW5lCVBGMTUJCTB4ODAwMAotCi0vKiAgUE9SVCBGIEJJVCBQT1NJVElPTlMgKi8KLSNkZWZpbmUJUEYwX1AJCTB4MAotI2RlZmluZQlQRjFfUAkJMHgxCi0jZGVmaW5lCVBGMl9QCQkweDIKLSNkZWZpbmUJUEYzX1AJCTB4MwotI2RlZmluZQlQRjRfUAkJMHg0Ci0jZGVmaW5lCVBGNV9QCQkweDUKLSNkZWZpbmUJUEY2X1AJCTB4NgotI2RlZmluZQlQRjdfUAkJMHg3Ci0jZGVmaW5lCVBGOF9QCQkweDgKLSNkZWZpbmUJUEY5X1AJCTB4OQotI2RlZmluZQlQRjEwX1AJCTB4QQotI2RlZmluZQlQRjExX1AJCTB4QgotI2RlZmluZQlQRjEyX1AJCTB4QwotI2RlZmluZQlQRjEzX1AJCTB4RAotI2RlZmluZQlQRjE0X1AJCTB4RQotI2RlZmluZQlQRjE1X1AJCTB4RgotCi0KLS8qKioqKioqKioqKioqKioqKioqICAgR1BJTyBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLwotLyogUG9ydAlDIE1hc2tzICovCi0jZGVmaW5lCVBDMAkJMHgwMDAxCi0jZGVmaW5lCVBDMQkJMHgwMDAyCi0jZGVmaW5lCVBDNAkJMHgwMDEwCi0jZGVmaW5lCVBDNQkJMHgwMDIwCi0jZGVmaW5lCVBDNgkJMHgwMDQwCi0jZGVmaW5lCVBDNwkJMHgwMDgwCi0jZGVmaW5lCVBDOAkJMHgwMTAwCi0jZGVmaW5lCVBDOQkJMHgwMjAwCi0vKiBQb3J0CUMgQml0IFBvc2l0aW9ucyAqLwotI2RlZmluZQlQQzBfUAkweDAKLSNkZWZpbmUJUEMxX1AJMHgxCi0jZGVmaW5lCVBDNF9QCTB4NAotI2RlZmluZQlQQzVfUAkweDUKLSNkZWZpbmUJUEM2X1AJMHg2Ci0jZGVmaW5lCVBDN19QCTB4NwotI2RlZmluZQlQQzhfUAkweDgKLSNkZWZpbmUJUEM5X1AJMHg5Ci0KLS8qIFBvcnQJRCAqLwotI2RlZmluZQlQRDAJCTB4MDAwMQotI2RlZmluZQlQRDEJCTB4MDAwMgotI2RlZmluZQlQRDIJCTB4MDAwNAotI2RlZmluZQlQRDMJCTB4MDAwOAotI2RlZmluZQlQRDQJCTB4MDAxMAotI2RlZmluZQlQRDUJCTB4MDAyMAotI2RlZmluZQlQRDYJCTB4MDA0MAotI2RlZmluZQlQRDcJCTB4MDA4MAotI2RlZmluZQlQRDgJCTB4MDEwMAotI2RlZmluZQlQRDkJCTB4MDIwMAotI2RlZmluZQlQRDEwCTB4MDQwMAotI2RlZmluZQlQRDExCTB4MDgwMAotI2RlZmluZQlQRDEyCTB4MTAwMAotI2RlZmluZQlQRDEzCTB4MjAwMAotI2RlZmluZQlQRDE0CTB4NDAwMAotI2RlZmluZQlQRDE1CTB4ODAwMAotLyogUG9ydAlEIEJpdCBQb3NpdGlvbnMgKi8KLSNkZWZpbmUJUEQwX1AJMHgwCi0jZGVmaW5lCVBEMV9QCTB4MQotI2RlZmluZQlQRDJfUAkweDIKLSNkZWZpbmUJUEQzX1AJMHgzCi0jZGVmaW5lCVBENF9QCTB4NAotI2RlZmluZQlQRDVfUAkweDUKLSNkZWZpbmUJUEQ2X1AJMHg2Ci0jZGVmaW5lCVBEN19QCTB4NwotI2RlZmluZQlQRDhfUAkweDgKLSNkZWZpbmUJUEQ5X1AJMHg5Ci0jZGVmaW5lCVBEMTBfUAkweEEKLSNkZWZpbmUJUEQxMV9QCTB4QgotI2RlZmluZQlQRDEyX1AJMHhDCi0jZGVmaW5lCVBEMTNfUAkweEQKLSNkZWZpbmUJUEQxNF9QCTB4RQotI2RlZmluZQlQRDE1X1AJMHhGCi0KLS8qIFBvcnQJRSAqLwotI2RlZmluZQlQRTAJCTB4MDAwMQotI2RlZmluZQlQRTEJCTB4MDAwMgotI2RlZmluZQlQRTIJCTB4MDAwNAotI2RlZmluZQlQRTMJCTB4MDAwOAotI2RlZmluZQlQRTQJCTB4MDAxMAotI2RlZmluZQlQRTUJCTB4MDAyMAotI2RlZmluZQlQRTYJCTB4MDA0MAotI2RlZmluZQlQRTcJCTB4MDA4MAotI2RlZmluZQlQRTgJCTB4MDEwMAotI2RlZmluZQlQRTkJCTB4MDIwMAotI2RlZmluZQlQRTEwCTB4MDQwMAotI2RlZmluZQlQRTExCTB4MDgwMAotI2RlZmluZQlQRTEyCTB4MTAwMAotI2RlZmluZQlQRTEzCTB4MjAwMAotI2RlZmluZQlQRTE0CTB4NDAwMAotI2RlZmluZQlQRTE1CTB4ODAwMAotLyogUG9ydAlFIEJpdCBQb3NpdGlvbnMgKi8KLSNkZWZpbmUJUEUwX1AJMHgwCi0jZGVmaW5lCVBFMV9QCTB4MQotI2RlZmluZQlQRTJfUAkweDIKLSNkZWZpbmUJUEUzX1AJMHgzCi0jZGVmaW5lCVBFNF9QCTB4NAotI2RlZmluZQlQRTVfUAkweDUKLSNkZWZpbmUJUEU2X1AJMHg2Ci0jZGVmaW5lCVBFN19QCTB4NwotI2RlZmluZQlQRThfUAkweDgKLSNkZWZpbmUJUEU5X1AJMHg5Ci0jZGVmaW5lCVBFMTBfUAkweEEKLSNkZWZpbmUJUEUxMV9QCTB4QgotI2RlZmluZQlQRTEyX1AJMHhDCi0jZGVmaW5lCVBFMTNfUAkweEQKLSNkZWZpbmUJUEUxNF9QCTB4RQotI2RlZmluZQlQRTE1X1AJMHhGCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTCSoqKioqKioqKioqKiogKi8KLS8qIEVCSVVfQU1HQ1RMIE1hc2tzICovCi0jZGVmaW5lCUFNQ0tFTgkJMHgwMDAxCS8qIEVuYWJsZSBDTEtPVVQgKi8KLSNkZWZpbmUJQU1CRU5fTk9ORQkweDAwMDAJLyogQWxsIEJhbmtzIERpc2FibGVkICovCi0jZGVmaW5lCUFNQkVOX0IwCTB4MDAwMgkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIDAgb25seSAqLwotI2RlZmluZQlBTUJFTl9CMF9CMQkweDAwMDQJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgMCAmCTEgb25seSAqLwotI2RlZmluZQlBTUJFTl9CMF9CMV9CMgkweDAwMDYJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgMCwgMSwgYW5kIDIgKi8KLSNkZWZpbmUJQU1CRU5fQUxMCTB4MDAwOAkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAoYWxsKSAwLCAxLAkyLCBhbmQgMyAqLwotI2RlZmluZQlDRFBSSU8JCTB4MDEwMAkvKiBETUEgaGFzIHByaW9yaXR5IG92ZXIgY29yZSBmb3IgZXh0ZXJuYWwgYWNjZXNzZXMgKi8KLQotLyogRUJJVV9BTUdDVEwgQml0IFBvc2l0aW9ucyAqLwotI2RlZmluZQlBTUNLRU5fUAkJMHgwMDAwCS8qIEVuYWJsZSBDTEtPVVQgKi8KLSNkZWZpbmUJQU1CRU5fUDAJCTB4MDAwMQkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMDAwIC0gYmFua3MgMC0zIGRpc2FibGVkLCAwMDEgLSBCYW5rIDAgZW5hYmxlZCAqLwotI2RlZmluZQlBTUJFTl9QMQkJMHgwMDAyCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMTAgLSBiYW5rcyAwJjEgZW5hYmxlZCwJIDAxMSAtIGJhbmtzIDAtMyBlbmFibGVkICovCi0jZGVmaW5lCUFNQkVOX1AyCQkweDAwMDMJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDF4eCAtIEFsbCBiYW5rcyAoYmFuayAwLAkxLCAyLCBhbmQgMykgZW5hYmxlZCAqLwotCi0vKiBFQklVX0FNQkNUTDAJTWFza3MgKi8KLSNkZWZpbmUJQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCBSRFkgRW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCi0jZGVmaW5lCUIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCYW5rIDAgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KLSNkZWZpbmUJQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MSBjeWNsZSAqLwotI2RlZmluZQlCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTIgY3ljbGVzICovCi0jZGVmaW5lCUIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MyBjeWNsZXMgKi8KLSNkZWZpbmUJQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD00IGN5Y2xlcyAqLwotI2RlZmluZQlCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAwIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCi0jZGVmaW5lCUIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDEgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KLSNkZWZpbmUJQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCi0KLS8qIEVCSVVfQU1CQ1RMMQlNYXNrcyAqLwotI2RlZmluZQlCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KLSNkZWZpbmUJQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMiBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLwotI2RlZmluZQlCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCi0jZGVmaW5lCUIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCi0jZGVmaW5lCUIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMSBjeWNsZSAqLwotI2RlZmluZQlCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCi0jZGVmaW5lCUIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgUkRZIGVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLwotI2RlZmluZQlCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQmFuayAzIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCi0jZGVmaW5lCUIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLwotI2RlZmluZQlCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLwotI2RlZmluZQlCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLwotI2RlZmluZQlCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLwotI2RlZmluZQlCM1JBVF8xCQkJMHgwMTAwMDAwMCAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9CTEgY3ljbGUgKi8KLSNkZWZpbmUJQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLwotI2RlZmluZQlCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogRUJJVV9TREdDVEwgTWFza3MgKi8KLSNkZWZpbmUJU0NUTEUJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTQ0xLWzBdLCAvU1JBUywgL1NDQVMsIC9TV0UsIFNEUU1bMzowXSAqLwotI2RlZmluZQlDTF8yCQkJMHgwMDAwMDAwOCAvKiBTRFJBTSBDQVMJbGF0ZW5jeQk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUNMXzMJCQkweDAwMDAwMDBDIC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJUEZFCQkJCTB4MDAwMDAwMTAgLyogRW5hYmxlIFNEUkFNIHByZWZldGNoICovCi0jZGVmaW5lCVBGUAkJCQkweDAwMDAwMDIwIC8qIFByZWZldGNoIGhhcyBwcmlvcml0eSBvdmVyIEFNQyByZXF1ZXN0cyAqLwotI2RlZmluZQlQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCi0jZGVmaW5lCVBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluCVNlbGYtUmVmcmVzaCAqLwotI2RlZmluZQlQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5CVNEUkFNIEJhbmsgMCBJcwlSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCi0jZGVmaW5lCVRSQVNfMQkJCTB4MDAwMDAwNDAgLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJVFJBU18yCQkJMHgwMDAwMDA4MCAvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU18zCQkJMHgwMDAwMDBDMCAvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU180CQkJMHgwMDAwMDEwMCAvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU181CQkJMHgwMDAwMDE0MCAvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU182CQkJMHgwMDAwMDE4MCAvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU183CQkJMHgwMDAwMDFDMCAvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU184CQkJMHgwMDAwMDIwMCAvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU185CQkJMHgwMDAwMDI0MCAvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU18xMAkJCTB4MDAwMDAyODAgLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcyAqLwotI2RlZmluZQlUUkFTXzExCQkJMHgwMDAwMDJDMCAvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfMTIJCQkweDAwMDAwMzAwIC8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU18xMwkJCTB4MDAwMDAzNDAgLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcyAqLwotI2RlZmluZQlUUkFTXzE0CQkJMHgwMDAwMDM4MCAvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfMTUJCQkweDAwMDAwM0MwIC8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMgKi8KLSNkZWZpbmUJVFJQXzEJCQkweDAwMDAwODAwIC8qIFNEUkFNIHRSUAk9IDEgY3ljbGUgKi8KLSNkZWZpbmUJVFJQXzIJCQkweDAwMDAxMDAwIC8qIFNEUkFNIHRSUAk9IDIgY3ljbGVzICovCi0jZGVmaW5lCVRSUF8zCQkJMHgwMDAwMTgwMCAvKiBTRFJBTSB0UlAJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlUUlBfNAkJCTB4MDAwMDIwMDAgLyogU0RSQU0gdFJQCT0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJVFJQXzUJCQkweDAwMDAyODAwIC8qIFNEUkFNIHRSUAk9IDUgY3ljbGVzICovCi0jZGVmaW5lCVRSUF82CQkJMHgwMDAwMzAwMCAvKiBTRFJBTSB0UlAJPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlUUlBfNwkJCTB4MDAwMDM4MDAgLyogU0RSQU0gdFJQCT0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF8xCQkJMHgwMDAwODAwMCAvKiBTRFJBTSB0UkNEID0gMSBjeWNsZSAqLwotI2RlZmluZQlUUkNEXzIJCQkweDAwMDEwMDAwIC8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlUUkNEXzMJCQkweDAwMDE4MDAwIC8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlUUkNEXzQJCQkweDAwMDIwMDAwIC8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlUUkNEXzUJCQkweDAwMDI4MDAwIC8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcyAqLwotI2RlZmluZQlUUkNEXzYJCQkweDAwMDMwMDAwIC8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlUUkNEXzcJCQkweDAwMDM4MDAwIC8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlUV1JfMQkJCTB4MDAwODAwMDAgLyogU0RSQU0gdFdSCT0gMSBjeWNsZSAqLwotI2RlZmluZQlUV1JfMgkJCTB4MDAxMDAwMDAgLyogU0RSQU0gdFdSCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJVFdSXzMJCQkweDAwMTgwMDAwIC8qIFNEUkFNIHRXUgk9IDMgY3ljbGVzICovCi0jZGVmaW5lCVBVUFNECQkJMHgwMDIwMDAwMCAvKlBvd2VyLXVwIHN0YXJ0IGRlbGF5ICovCi0jZGVmaW5lCVBTTQkJCQkweDAwNDAwMDAwIC8qIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlID0JUHJlY2hhcmdlLCBtb2RlCXJlZ2lzdGVyIHNldCwgOAlDQlIgcmVmcmVzaCBjeWNsZXMgKi8KLSNkZWZpbmUJUFNTCQkJCTB4MDA4MDAwMDAgLyogZW5hYmxlIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlIG9uCW5leHQgU0RSQU0gYWNjZXNzICovCi0jZGVmaW5lCVNSRlMJCQkweDAxMDAwMDAwIC8qIFN0YXJ0IFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCi0jZGVmaW5lCUVCVUZFCQkJMHgwMjAwMDAwMCAvKiBFbmFibGUgZXh0ZXJuYWwgYnVmZmVyaW5nCXRpbWluZyAqLwotI2RlZmluZQlGQkJSVwkJCTB4MDQwMDAwMDAgLyogRmFzdCBiYWNrLXRvLWJhY2sJcmVhZCB3cml0ZSBlbmFibGUgKi8KLSNkZWZpbmUJRU1SRU4JCQkweDEwMDAwMDAwIC8qIEV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgZW5hYmxlICovCi0jZGVmaW5lCVRDU1IJCQkweDIwMDAwMDAwIC8qIFRlbXAgY29tcGVuc2F0ZWQgc2VsZiByZWZyZXNoIHZhbHVlIDg1IGRlZyBDICovCi0jZGVmaW5lCUNEREJHCQkJMHg0MDAwMDAwMCAvKiBUcmlzdGF0ZSBTRFJBTSBjb250cm9scyBkdXJpbmcgYnVzIGdyYW50ICovCi0KLS8qIEVCSVVfU0RCQ1RMIE1hc2tzICovCi0jZGVmaW5lCUVCRQkJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTRFJBTSBleHRlcm5hbCBiYW5rICovCi0jZGVmaW5lCUVCU1pfMTYJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDE2TUIgKi8KLSNkZWZpbmUJRUJTWl8zMgkJCTB4MDAwMDAwMDIgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMzJNQiAqLwotI2RlZmluZQlFQlNaXzY0CQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSA2NE1CICovCi0jZGVmaW5lCUVCU1pfMTI4CQkweDAwMDAwMDA2IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDEyOE1CICovCi0jZGVmaW5lCUVCU1pfMjU2CQkweDAwMDAwMDA4IC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CICovCi0jZGVmaW5lCUVCU1pfNTEyCQkweDAwMDAwMDBBIC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CICovCi0jZGVmaW5lCUVCQ0FXXzgJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA4IGJpdHMgKi8KLSNkZWZpbmUJRUJDQVdfOQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLwotI2RlZmluZQlFQkNBV18xMAkJMHgwMDAwMDAyMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCi0jZGVmaW5lCUVCQ0FXXzExCQkweDAwMDAwMDMwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KLQotLyogRUJJVV9TRFNUQVQgTWFza3MgKi8KLSNkZWZpbmUJU0RDSQkJCTB4MDAwMDAwMDEgLyogU0RSQU0gY29udHJvbGxlciBpcyBpZGxlICovCi0jZGVmaW5lCVNEU1JBCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBTRFJBTSBzZWxmIHJlZnJlc2ggaXMgYWN0aXZlICovCi0jZGVmaW5lCVNEUFVBCQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBwb3dlciB1cCBhY3RpdmUgICovCi0jZGVmaW5lCVNEUlMJCQkweDAwMDAwMDA4IC8qIFNEUkFNIGlzIGluIHJlc2V0CXN0YXRlICovCi0jZGVmaW5lCVNERUFTRQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gRUFCCXN0aWNreSBlcnJvciBzdGF0dXMgLSBXMUMgKi8KLSNkZWZpbmUJQkdTVEFUCQkJMHgwMDAwMDAyMCAvKiBCdXMgZ3JhbnRlZCAqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0l4KSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUV0l4X0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0l4X0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsJICkgKi8KLSNpZmRlZiBfTUlTUkFfUlVMRVMKLSNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGdSkJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KLSNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRnUpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cgKi8KLSNlbHNlCi0jZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KLSNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLwotI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLwotCi0vKiBUV0l4X1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkgKi8KLSNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KSAqLwotI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCSAqLwotI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IJQ29tcGF0aWJpbGl0eSBFbmFibGUgKi8KLQotLyogVFdJeF9TTEFWRV9DVFJMIE1hc2tzCQkJCQkJCQkgKi8KLSNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCSAqLwotI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoICovCi0jZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkICovCi0jZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KLSNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwJQWRycmVzcwlNYXRjaGluZyBFbmFibGVkICovCi0KLS8qIFRXSXhfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJICovCi0jZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikgKi8KLSNkZWZpbmUJR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsCUluZGljYXRvciAqLwotCi0vKiBUV0l4X01BU1RFUl9DVFJMIE1hc2tzCQkJCQkJICovCi0jZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlICovCi0jZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoICovCi0jZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKSAqLwotI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nCVNwZWNzICovCi0jZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24gKi8KLSNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydAlvciBTdG9wKiBBdCBFbmQJT2YgVHJhbnNmZXIgKi8KLSNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhCUJ5dGVzIFRvIFRyYW5zZmVyICovCi0jZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZSAqLwotI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrCU92ZXJyaWRlICovCi0KLS8qIFRXSXhfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJICovCi0jZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcyAqLwotI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QJQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpICovCi0jZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkICovCi0jZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YQlOb3QgQWNrbm93bGVkZ2VkICovCi0jZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IgKi8KLSNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUJRXJyb3IgKi8KLSNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlICovCi0jZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sJU2Vuc2UgKi8KLSNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IgKi8KLQotLyogVFdJeF9JTlRfU1JDCWFuZCBUV0l4X0lOVF9FTkFCTEUgTWFza3MgKi8KLSNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkICovCi0jZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlICovCi0jZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IgKi8KLSNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdyAqLwotI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUgKi8KLSNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IgKi8KLSNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UgKi8KLSNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8JU2VydmljZSAqLwotCi0vKiBUV0l4X0ZJRk9fQ1RMIE1hc2tzCQkJCQkgKi8KLSNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2ggKi8KLSNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaCAqLwotI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLwotI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoICovCi0KLS8qIFRXSXhfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkgKi8KLSNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cyAqLwotI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKgkJVHJhbnNtaXQgRklGTyBFbXB0eSAqLwotI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUgKi8KLSNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKgkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKSAqLwotCi0jZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPCVN0YXR1cyAqLwotI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKgkJUmVjZWl2ZQlGSUZPIEVtcHR5ICovCi0jZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyoJCVJlY2VpdmUJRklGTyBIYXMgMSBCeXRlCVRvIFJlYWQgKi8KLSNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKgkJUmVjZWl2ZQlGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkgKi8KLQogI2VuZGlmIC8qIF9ERUZfQkY1MzlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBiZDlhZGI3Li44YTViZWVlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtNzAsNCArNzAsOSBAQAogI2RlZmluZSBQT1JUX0QgR1BJT19QRDAKICNkZWZpbmUgUE9SVF9FIEdQSU9fUEUwCiAKKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1jLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZC5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWUuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1mLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCBiMzBiYmNkLi45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNjMgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9QTExfSAotI2RlZmluZSBfTUFDSF9QTExfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX01BQ0hfUExMX0ggKi8KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwppbmRleCA0YzJlZTY3Li5kMTE1MDJhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0yMTEsNyArMjExLDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLAogI2lmZGVmIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUwogCVBfVUFSVDFfUlRTLCBQX1VBUlQxX0NUUywKQEAgLTI1OCw3ICsyNTgsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQyX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0Ml9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDJfVFgsIFBfVUFSVDJfUlgsIDAKIH07CiAKQEAgLTMxMyw3ICszMTMsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQzX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0M19wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDNfVFgsIFBfVUFSVDNfUlgsCiAjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDNfQ1RTUlRTCiAJUF9VQVJUM19SVFMsIFBfVUFSVDNfQ1RTLApAQCAtNTA0LDYgKzUwNCw3IEBACiAJICogaWYgaXQgaXMgdGhlIGNhc2UuCiAJICovCiAJLmdwaW9fdnJzZWxfYWN0aXZlCT0gMSwKKwkuY2xraW4gICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qIG11c2IgQ0xLSU4gaW4gTUhaICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhIG11c2JfcGxhdCA9IHsKQEAgLTU1Miw5ICs1NTMsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01ODYsOSArNTg3LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpAQCAtNjIwLDcgKzYyMSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQyX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDJfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMl9URlMsIFBfU1BPUlQyX0RUUFJJLCBQX1NQT1JUMl9UU0NMSywgUF9TUE9SVDJfUkZTLAogCVBfU1BPUlQyX0RSUFJJLCBQX1NQT1JUMl9SU0NMSywgUF9TUE9SVDJfRFJTRUMsIFBfU1BPUlQyX0RUU0VDLCAwCiB9OwpAQCAtNjU0LDcgKzY1NSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQzX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDNfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUM19URlMsIFBfU1BPUlQzX0RUUFJJLCBQX1NQT1JUM19UU0NMSywgUF9TUE9SVDNfUkZTLAogCVBfU1BPUlQzX0RSUFJJLCBQX1NQT1JUM19SU0NMSywgUF9TUE9SVDNfRFJTRUMsIFBfU1BPUlQzX0RUU0VDLCAwCiB9OwpAQCAtNzU2LDcgKzc1Nyw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0NBTl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19DQU5fQkZJTl9NT0RVTEUpCi11bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fY2FuX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9DQU4wX1JYLCBQX0NBTjBfVFgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCA0ZjAzZmJjLi5jZTVhMmJiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0zMTYsNyArMzE2LDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLAogI2lmZGVmIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUwogCVBfVUFSVDFfUlRTLCBQX1VBUlQxX0NUUywKQEAgLTM2Myw3ICszNjMsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQyX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0Ml9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDJfVFgsIFBfVUFSVDJfUlgsIDAKIH07CiAKQEAgLTQxOCw3ICs0MTgsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQzX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0M19wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDNfVFgsIFBfVUFSVDNfUlgsCiAjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDNfQ1RTUlRTCiAJUF9VQVJUM19SVFMsIFBfVUFSVDNfQ1RTLApAQCAtNjA5LDYgKzYwOSw3IEBACiAJICogaWYgaXQgaXMgdGhlIGNhc2UuCiAJICovCiAJLmdwaW9fdnJzZWxfYWN0aXZlCT0gMSwKKwkuY2xraW4gICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qIG11c2IgQ0xLSU4gaW4gTUhaICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhIG11c2JfcGxhdCA9IHsKQEAgLTY1Nyw5ICs2NTgsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC02OTEsOSArNjkyLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpAQCAtNzI1LDcgKzcyNiw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQyX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDJfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMl9URlMsIFBfU1BPUlQyX0RUUFJJLCBQX1NQT1JUMl9UU0NMSywgUF9TUE9SVDJfUkZTLAogCVBfU1BPUlQyX0RSUFJJLCBQX1NQT1JUMl9SU0NMSywgUF9TUE9SVDJfRFJTRUMsIFBfU1BPUlQyX0RUU0VDLCAwCiB9OwpAQCAtNzU5LDcgKzc2MCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQzX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDNfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUM19URlMsIFBfU1BPUlQzX0RUUFJJLCBQX1NQT1JUM19UU0NMSywgUF9TUE9SVDNfUkZTLAogCVBfU1BPUlQzX0RSUFJJLCBQX1NQT1JUM19SU0NMSywgUF9TUE9SVDNfRFJTRUMsIFBfU1BPUlQzX0RUU0VDLCAwCiB9OwpAQCAtNzc3LDcgKzc3OCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0NBTl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19DQU5fQkZJTl9NT0RVTEUpCi11bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fY2FuX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9DQU4wX1JYLCBQX0NBTjBfVFgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYwppbmRleCA4ODhiOWNjLi42OWVhZDMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqIGNvbnN0IGRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3MTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogbWFjaC9iZmluX3NlcmlhbC5oIC0gQmxhY2tmaW4gVUFSVC9TZXJpYWwgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisjZGVmaW5lIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKworI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJNAorCisjZGVmaW5lIEJGSU5fVUFSVF9CRjU0WF9TVFlMRQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCmluZGV4IGRkNDRhYTcuLjBkOTRlZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtNCw3MiArNCwxNCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVJfU0VUKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0xTUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpKQotI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCi0jZGVmaW5lIFVBUlRfR0VUX01TUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9NU1IpKQotI2RlZmluZSBVQVJUX0dFVF9NQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTUNSKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLHYpCi0jZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSX1NFVCksdikKLSNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCx2KSAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVJfQ0xFQVIpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSx2KQotI2RlZmluZSBVQVJUX1BVVF9MU1IodWFydCx2KQliZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLHYpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfTFNSKHVhcnQpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKSwgLTEpCi0jZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCx2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksdikKLSNkZWZpbmUgVUFSVF9QVVRfTUNSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9NQ1IpLHYpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfU0NUUyh1YXJ0KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTVNSKSxTQ1RTKQotCi0jZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIC8qIE1NUnMgbm90IG11eGVkIG9uIEJGNTR4ICovCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIC8qIE1NUnMgbm90IG11eGVkIG9uIEJGNTR4ICovCi0KLSNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIChVQVJUX0dFVF9NU1IoeCkgJiBDVFMpCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9SVFMoeCkgVUFSVF9QVVRfTUNSKHgsIFVBUlRfR0VUX01DUih4KSAmIH4oQVJUU3xNUlRTKSkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfUlRTKHgpIFVBUlRfUFVUX01DUih4LCBVQVJUX0dFVF9NQ1IoeCkgfCBNUlRTIHwgQVJUUykKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1NFVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9DTEVBUl9JRVIoeCwgMHhGKQotCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMl9DVFNSVFMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDNfQ1RTUlRTKQogIyBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotLyoKLSAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKLSAqLwotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotICAgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICAgICAgICBwb3J0OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBvbGRfc3RhdHVzOwotCWludAkJCXN0YXR1c19pcnE7Ci0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQotCWludAkJCXR4X2RvbmU7Ci0JaW50CQkJdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQJCQlyeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCi0JaW50CQkJc2N0czsKLQlpbnQJCQljdHNfcGluOwotCWludAkJCXJ0c19waW47Ci0jZW5kaWYKLX07Ci0KIHN0cnVjdCBiZmluX3NlcmlhbF9yZXMgewogCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CiAJaW50CQl1YXJ0X2lycTsKQEAgLTE0OCwzICs5MCw1IEBACiB9OwogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCisKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCA1Njg0MDMwLi43MmRhNzIxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC0xMCw1OCArMTAsNDAgQEAKICNpbmNsdWRlICJiZjU0OC5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAorI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgogI2lmZGVmIENPTkZJR19CRjU0MgotI2luY2x1ZGUgImRlZkJGNTQyLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRjU0NAotI2luY2x1ZGUgImRlZkJGNTQ0LmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRjU0NwotI2luY2x1ZGUgImRlZkJGNTQ3LmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRjU0OAotI2luY2x1ZGUgImRlZkJGNTQ4LmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRjU0OQotI2luY2x1ZGUgImRlZkJGNTQ5LmgiCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKLSNpZmRlZiBDT05GSUdfQkY1NDIKLSNpbmNsdWRlICJjZGVmQkY1NDIuaCIKKyMgaW5jbHVkZSAiZGVmQkY1NDIuaCIKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjU0NAotI2luY2x1ZGUgImNkZWZCRjU0NC5oIgorIyBpbmNsdWRlICJkZWZCRjU0NC5oIgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTQ3Ci0jaW5jbHVkZSAiY2RlZkJGNTQ3LmgiCisjIGluY2x1ZGUgImRlZkJGNTQ3LmgiCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1NDgKLSNpbmNsdWRlICJjZGVmQkY1NDguaCIKKyMgaW5jbHVkZSAiZGVmQkY1NDguaCIKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjU0OQotI2luY2x1ZGUgImNkZWZCRjU0OS5oIgorIyBpbmNsdWRlICJkZWZCRjU0OS5oIgogI2VuZGlmCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaWZkZWYgQ09ORklHX0JGNTQyCisjICBpbmNsdWRlICJjZGVmQkY1NDIuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTQ0CisjICBpbmNsdWRlICJjZGVmQkY1NDQuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTQ3CisjICBpbmNsdWRlICJjZGVmQkY1NDcuaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTQ4CisjICBpbmNsdWRlICJjZGVmQkY1NDguaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTQ5CisjICBpbmNsdWRlICJjZGVmQkY1NDkuaCIKKyMgZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwk0Ci0KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgwOAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUl9TRVQgICAgICAgICAgMHgyMAkvKiBTZXQgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUl9DTEVBUiAgICAgICAgMHgyNAkvKiBDbGVhciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgyOAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgyQwkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Mi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDIuaAppbmRleCA0MmY0YTk0Li5kMDljMTljIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Mi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KQEAgLTcsMTQgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjU0Ml9ICiAjZGVmaW5lIF9DREVGX0JGNTQyX0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTQyLmgiCi0KLS8qIGluY2x1ZGUgY29yZSBzYmZpbl9yZWFkXygpZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQyICovCi0KIC8qIGluY2x1ZGUgY2RlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggYmZpbl9yZWFkXygpcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiY2RlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ0LmgKaW5kZXggMjIwNzc5OS4uMzNlYzgxMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0NC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1NDRfSAogI2RlZmluZSBfQ0RFRl9CRjU0NF9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjU0NC5oIgotCi0vKiBpbmNsdWRlIGNvcmUgc2JmaW5fcmVhZF8oKWVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0NCAqLwotCiAvKiBpbmNsdWRlIGNkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IGJmaW5fcmVhZF8oKXJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImNkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Ny5oCmluZGV4IGJjNjUwZTYuLmJjYjk3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDcuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KQEAgLTcsMTQgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjU0N19ICiAjZGVmaW5lIF9DREVGX0JGNTQ3X0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTQ3LmgiCi0KLS8qIGluY2x1ZGUgY29yZSBzYmZpbl9yZWFkXygpZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ3ICovCi0KIC8qIGluY2x1ZGUgY2RlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggYmZpbl9yZWFkXygpcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiY2RlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ4LmgKaW5kZXggMzUyM2UwOC4uYmFlNjdhNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1NDhfSAogI2RlZmluZSBfQ0RFRl9CRjU0OF9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjU0OC5oIgotCi0vKiBpbmNsdWRlIGNvcmUgc2JmaW5fcmVhZF8oKWVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0OCAqLwotCiAvKiBpbmNsdWRlIGNkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IGJmaW5fcmVhZF8oKXJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImNkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OS5oCmluZGV4IDgwMjAxZWQuLjAwMjEzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDkuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTQ5X0gKICNkZWZpbmUgX0NERUZfQkY1NDlfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1NDkuaCIKLQotLyogaW5jbHVkZSBjb3JlIHNiZmluX3JlYWRfKCllY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDkgKi8KLQogLyogaW5jbHVkZSBjZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBiZmluX3JlYWRfKClyb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJjZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKaW5kZXggZGVhZjVkNi4uNTBjODljOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxMCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTRYX0gKICNkZWZpbmUgX0NERUZfQkY1NFhfSAogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBDT01NT04gVE8gQUxMIEFEU1AtQkY1NHggICAgKi8KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0yNjMzLDIyICsyNjI5LDUgQEAKIAogLyogSGFuZHNoYWtlIE1ETUEgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNoYXJlZCBmaWxlIGJlY2F1c2UgaXQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgQURTUC1CRjU0MiBiZmluX3JlYWRfKClyb2Nlc3NvciAqLwogCi0vKiBsZWdhY3kgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1DQkNUTDAJCWJmaW5fcmVhZF9FQklVX0FNQkNUTDAKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQ0JDVEwwCWJmaW5fd3JpdGVfRUJJVV9BTUJDVEwwCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQ0JDVEwxCQliZmluX3JlYWRfRUJJVV9BTUJDVEwxCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUNCQ1RMMQliZmluX3dyaXRlX0VCSVVfQU1CQ1RMMQotI2RlZmluZSBiZmluX3JlYWRfUElOVDBfSVJRCQliZmluX3JlYWRfUElOVDBfUkVRVUVTVAotI2RlZmluZSBiZmluX3dyaXRlX1BJTlQwX0lSUQkJYmZpbl93cml0ZV9QSU5UMF9SRVFVRVNUCi0jZGVmaW5lIGJmaW5fcmVhZF9QSU5UMV9JUlEJCWJmaW5fcmVhZF9QSU5UMV9SRVFVRVNUCi0jZGVmaW5lIGJmaW5fd3JpdGVfUElOVDFfSVJRCQliZmluX3dyaXRlX1BJTlQxX1JFUVVFU1QKLSNkZWZpbmUgYmZpbl9yZWFkX1BJTlQyX0lSUQkJYmZpbl9yZWFkX1BJTlQyX1JFUVVFU1QKLSNkZWZpbmUgYmZpbl93cml0ZV9QSU5UMl9JUlEJCWJmaW5fd3JpdGVfUElOVDJfUkVRVUVTVAotI2RlZmluZSBiZmluX3JlYWRfUElOVDNfSVJRCQliZmluX3JlYWRfUElOVDNfUkVRVUVTVAotI2RlZmluZSBiZmluX3dyaXRlX1BJTlQzX0lSUQkJYmZpbl93cml0ZV9QSU5UM19SRVFVRVNUCi0KLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCiAjZW5kaWYgLyogX0NERUZfQkY1NFhfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQyLmgKaW5kZXggYWJmNWY3NS4uNjI5YmYyMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Mi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNywxMSArNyw2IEBACiAjaWZuZGVmIF9ERUZfQkY1NDJfSAogI2RlZmluZSBfREVGX0JGNTQyX0gKIAotLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0MiAqLwotCiAvKiBJbmNsdWRlIGRlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggcHJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImRlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0NC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0NC5oCmluZGV4IGUyNzcxMDkuLjY0MjQ2OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTEgKzcsNiBAQAogI2lmbmRlZiBfREVGX0JGNTQ0X0gKICNkZWZpbmUgX0RFRl9CRjU0NF9ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDQgKi8KLQogLyogSW5jbHVkZSBkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IHByb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaAppbmRleCBiZTIxYmE1Li4yZjMzMzdjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Ny5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNywxMSArNyw2IEBACiAjaWZuZGVmIF9ERUZfQkY1NDdfSAogI2RlZmluZSBfREVGX0JGNTQ3X0gKIAotLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0NyAqLwotCiAvKiBJbmNsdWRlIGRlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggcHJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImRlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OC5oCmluZGV4IDNmYjMzYjAuLjNjN2YxYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ4LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTEgKzcsNiBAQAogI2lmbmRlZiBfREVGX0JGNTQ4X0gKICNkZWZpbmUgX0RFRl9CRjU0OF9ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDggKi8KLQogLyogSW5jbHVkZSBkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IHByb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaAppbmRleCA1YTA0ZTZkLi45YTQ1Y2I2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDExICs3LDYgQEAKICNpZm5kZWYgX0RFRl9CRjU0OV9ICiAjZGVmaW5lIF9ERUZfQkY1NDlfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ5ICovCi0KIC8qIEluY2x1ZGUgZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBwcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTR4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NHhfYmFzZS5oCmluZGV4IDc4ZjkxMTAuLjA4NjdjMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NHhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NHhfYmFzZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC0xNjE1LDE0ICsxNjE1LDE0IEBACiAjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ1RZUEUgIDB4NDAgICAgICAgLyogRE1BIENoYW5uZWwgVHlwZSAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBQTUFQICAweGYwMDAgICAgIC8qIFBlcmlwaGVyYWwgTWFwcGVkIFRvIFRoaXMgQ2hhbm5lbCAqLwogCi0vKiBCaXQgbWFza3MgZm9yIERNQUN4X1RDUEVSICovCisvKiBCaXQgbWFza3MgZm9yIERNQUN4X1RDX1BFUiAqLwogCiAjZGVmaW5lICAgICAgICBEQ0JfVFJBRkZJQ19QRVJJT0QgIDB4ZiAgICAgICAgLyogRENCIFRyYWZmaWMgQ29udHJvbCBQZXJpb2QgKi8KICNkZWZpbmUgICAgICAgIERFQl9UUkFGRklDX1BFUklPRCAgMHhmMCAgICAgICAvKiBERUIgVHJhZmZpYyBDb250cm9sIFBlcmlvZCAqLwogI2RlZmluZSAgICAgICAgREFCX1RSQUZGSUNfUEVSSU9EICAweDcwMCAgICAgIC8qIERBQiBUcmFmZmljIENvbnRyb2wgUGVyaW9kICovCiAjZGVmaW5lICAgTURNQV9ST1VORF9ST0JJTl9QRVJJT0QgIDB4ZjgwMCAgICAgLyogTURNQSBSb3VuZCBSb2JpbiBQZXJpb2QgKi8KIAotLyogQml0IG1hc2tzIGZvciBETUFDeF9UQ0NOVCAqLworLyogQml0IG1hc2tzIGZvciBETUFDeF9UQ19DTlQgKi8KIAogI2RlZmluZSAgICAgICAgIERDQl9UUkFGRklDX0NPVU5UICAweGYgICAgICAgIC8qIERDQiBUcmFmZmljIENvbnRyb2wgQ291bnQgKi8KICNkZWZpbmUgICAgICAgICBERUJfVFJBRkZJQ19DT1VOVCAgMHhmMCAgICAgICAvKiBERUIgVHJhZmZpYyBDb250cm9sIENvdW50ICovCkBAIC0yMTcyLDY4ICsyMTcyLDYgQEAKIAogI2RlZmluZSAgICAgICAgICAgICAgICAgUkNWREFUQTE2ICAweGZmZmYgICAgIC8qIFJlY2VpdmUgRklGTyAxNi1CaXQgRGF0YSAqLwogCi0vKiBCaXQgbWFza3MgZm9yIFVBUlR4X0xDUiAqLwotCi0jaWYgMAotLyogY29uZmxpY3RzIHdpdGggbGVnYWN5IG9uZSBpbiBsYXN0IHNlY3Rpb24gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFdMUyAgMHgzICAgICAgICAvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KLSNlbmRpZgotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgU1RCICAweDQgICAgICAgIC8qIFN0b3AgQml0cyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUEVOICAweDggICAgICAgIC8qIFBhcml0eSBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEVQUyAgMHgxMCAgICAgICAvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFNUUCAgMHgyMCAgICAgICAvKiBTdGlja3kgUGFyaXR5ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgU0IgIDB4NDAgICAgICAgLyogU2V0IEJyZWFrICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgVUFSVHhfTUNSICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgWE9GRiAgMHgxICAgICAgICAvKiBUcmFuc21pdHRlciBPZmYgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTVJUUyAgMHgyICAgICAgICAvKiBNYW51YWwgUmVxdWVzdCBUbyBTZW5kICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFJGSVQgIDB4NCAgICAgICAgLyogUmVjZWl2ZSBGSUZPIElSUSBUaHJlc2hvbGQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgUkZSVCAgMHg4ICAgICAgICAvKiBSZWNlaXZlIEZJRk8gUlRTIFRocmVzaG9sZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIExPT1BfRU5BICAweDEwICAgICAgIC8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRkNQT0wgIDB4MjAgICAgICAgLyogRmxvdyBDb250cm9sIFBpbiBQb2xhcml0eSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBBUlRTICAweDQwICAgICAgIC8qIEF1dG9tYXRpYyBSZXF1ZXN0IFRvIFNlbmQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQUNUUyAgMHg4MCAgICAgICAvKiBBdXRvbWF0aWMgQ2xlYXIgVG8gU2VuZCAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFVBUlR4X0xTUiAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgRFIgIDB4MSAgICAgICAgLyogRGF0YSBSZWFkeSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9FICAweDIgICAgICAgIC8qIE92ZXJydW4gRXJyb3IgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBQRSAgMHg0ICAgICAgICAvKiBQYXJpdHkgRXJyb3IgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBGRSAgMHg4ICAgICAgICAvKiBGcmFtaW5nIEVycm9yICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgQkkgIDB4MTAgICAgICAgLyogQnJlYWsgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRIUkUgIDB4MjAgICAgICAgLyogVEhSIEVtcHR5ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRFTVQgIDB4NDAgICAgICAgLyogVHJhbnNtaXR0ZXIgRW1wdHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFRGSSAgMHg4MCAgICAgICAvKiBUcmFuc21pc3Npb24gRmluaXNoZWQgSW5kaWNhdG9yICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgVUFSVHhfTVNSICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgU0NUUyAgMHgxICAgICAgICAvKiBTdGlja3kgQ1RTICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDVFMgIDB4MTAgICAgICAgLyogQ2xlYXIgVG8gU2VuZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBSRkNTICAweDIwICAgICAgIC8qIFJlY2VpdmUgRklGTyBDb3VudCBTdGF0dXMgKi8KLQotLyogQml0IG1hc2tzIGZvciBVQVJUeF9JRVJfU0VUICYgVUFSVHhfSUVSX0NMRUFSICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRVJCRkkgIDB4MSAgICAgICAgLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEVUQkVJICAweDIgICAgICAgIC8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBFTFNJICAweDQgICAgICAgIC8qIEVuYWJsZSBSZWNlaXZlIFN0YXR1cyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRURTU0kgIDB4OCAgICAgICAgLyogRW5hYmxlIE1vZGVtIFN0YXR1cyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBFRFRQVEkgIDB4MTAgICAgICAgLyogRW5hYmxlIERNQSBUcmFuc21pdCBQSVJRIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVRGSSAgMHgyMCAgICAgICAvKiBFbmFibGUgVHJhbnNtaXNzaW9uIEZpbmlzaGVkIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBFUkZDSSAgMHg0MCAgICAgICAvKiBFbmFibGUgUmVjZWl2ZSBGSUZPIENvdW50IEludGVycnVwdCAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFVBUlR4X0dDVEwgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVQ0VOICAweDEgICAgICAgIC8qIFVBUlQgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIElSRU4gIDB4MiAgICAgICAgLyogSXJEQSBNb2RlIEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRQT0xDICAweDQgICAgICAgIC8qIElyREEgVFggUG9sYXJpdHkgQ2hhbmdlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgUlBPTEMgIDB4OCAgICAgICAgLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEZQRSAgMHgxMCAgICAgICAvKiBGb3JjZSBQYXJpdHkgRXJyb3IgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEZGRSAgMHgyMCAgICAgICAvKiBGb3JjZSBGcmFtaW5nIEVycm9yICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEVEQk8gIDB4NDAgICAgICAgLyogRW5hYmxlIERpdmlkZS1ieS1PbmUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBFR0xTSSAgMHg4MCAgICAgICAvKiBFbmFibGUgR2xvYmFsIExTIEludGVycnVwdCAqLwotCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qICAgICBNVUxUSSBCSVQgTUFDUk8gRU5VTUVSQVRJT05TICAgICAgICAgICAgKi8KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTIyNTEsMTMgKzIxODksNiBAQAogI2RlZmluZSBXRFRIX0NBUCAweDAwMDIKICNkZWZpbmUgRVhUX0NMSyAgMHgwMDAzCiAKLS8qIFVBUlR4X0xDUiBiaXQgZmllbGQgb3B0aW9ucyAqLwotCi0jZGVmaW5lIFdMU181ICAgMHgwMDAwICAgIC8qIDUgZGF0YSBiaXRzICovCi0jZGVmaW5lIFdMU182ICAgMHgwMDAxICAgIC8qIDYgZGF0YSBiaXRzICovCi0jZGVmaW5lIFdMU183ICAgMHgwMDAyICAgIC8qIDcgZGF0YSBiaXRzICovCi0jZGVmaW5lIFdMU184ICAgMHgwMDAzICAgIC8qIDggZGF0YSBiaXRzICovCi0KIC8qIFBJTlR4IFJlZ2lzdGVyIEJpdCBEZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIFBJUTAgMHgwMDAwMDAwMQpAQCAtMjMwMCwyNDAgKzIyMzEsNiBAQAogI2RlZmluZSBQSVEzMCAweDQwMDAwMDAwCiAjZGVmaW5lIFBJUTMxIDB4ODAwMDAwMDAKIAotLyogUE9SVCBBIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEEsIFBPUlRBX1NFVCwgUE9SVEFfQ0xFQVIsCi1QT1JUQV9ESVJfU0VULCBQT1JUQV9ESVJfQ0xFQVIsIFBPUlRBX0lORU4sCi1QT1JUQV9GRVIgcmVnaXN0ZXJzCi0qLwotCi0jZGVmaW5lIFBBMCAweDAwMDEKLSNkZWZpbmUgUEExIDB4MDAwMgotI2RlZmluZSBQQTIgMHgwMDA0Ci0jZGVmaW5lIFBBMyAweDAwMDgKLSNkZWZpbmUgUEE0IDB4MDAxMAotI2RlZmluZSBQQTUgMHgwMDIwCi0jZGVmaW5lIFBBNiAweDAwNDAKLSNkZWZpbmUgUEE3IDB4MDA4MAotI2RlZmluZSBQQTggMHgwMTAwCi0jZGVmaW5lIFBBOSAweDAyMDAKLSNkZWZpbmUgUEExMCAweDA0MDAKLSNkZWZpbmUgUEExMSAweDA4MDAKLSNkZWZpbmUgUEExMiAweDEwMDAKLSNkZWZpbmUgUEExMyAweDIwMDAKLSNkZWZpbmUgUEExNCAweDQwMDAKLSNkZWZpbmUgUEExNSAweDgwMDAKLQotLyogUE9SVCBCIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEIsIFBPUlRCX1NFVCwgUE9SVEJfQ0xFQVIsCi1QT1JUQl9ESVJfU0VULCBQT1JUQl9ESVJfQ0xFQVIsIFBPUlRCX0lORU4sCi1QT1JUQl9GRVIgcmVnaXN0ZXJzCi0qLwotCi0jZGVmaW5lIFBCMCAweDAwMDEKLSNkZWZpbmUgUEIxIDB4MDAwMgotI2RlZmluZSBQQjIgMHgwMDA0Ci0jZGVmaW5lIFBCMyAweDAwMDgKLSNkZWZpbmUgUEI0IDB4MDAxMAotI2RlZmluZSBQQjUgMHgwMDIwCi0jZGVmaW5lIFBCNiAweDAwNDAKLSNkZWZpbmUgUEI3IDB4MDA4MAotI2RlZmluZSBQQjggMHgwMTAwCi0jZGVmaW5lIFBCOSAweDAyMDAKLSNkZWZpbmUgUEIxMCAweDA0MDAKLSNkZWZpbmUgUEIxMSAweDA4MDAKLSNkZWZpbmUgUEIxMiAweDEwMDAKLSNkZWZpbmUgUEIxMyAweDIwMDAKLSNkZWZpbmUgUEIxNCAweDQwMDAKLQotCi0vKiBQT1JUIEMgQml0IERlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzCi1QT1JUQywgUE9SVENfU0VULCBQT1JUQ19DTEVBUiwKLVBPUlRDX0RJUl9TRVQsIFBPUlRDX0RJUl9DTEVBUiwgUE9SVENfSU5FTiwKLVBPUlRDX0ZFUiByZWdpc3RlcnMKLSovCi0KLQotI2RlZmluZSBQQzAgMHgwMDAxCi0jZGVmaW5lIFBDMSAweDAwMDIKLSNkZWZpbmUgUEMyIDB4MDAwNAotI2RlZmluZSBQQzMgMHgwMDA4Ci0jZGVmaW5lIFBDNCAweDAwMTAKLSNkZWZpbmUgUEM1IDB4MDAyMAotI2RlZmluZSBQQzYgMHgwMDQwCi0jZGVmaW5lIFBDNyAweDAwODAKLSNkZWZpbmUgUEM4IDB4MDEwMAotI2RlZmluZSBQQzkgMHgwMjAwCi0jZGVmaW5lIFBDMTAgMHgwNDAwCi0jZGVmaW5lIFBDMTEgMHgwODAwCi0jZGVmaW5lIFBDMTIgMHgxMDAwCi0jZGVmaW5lIFBDMTMgMHgyMDAwCi0KLQotLyogUE9SVCBEIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEQsIFBPUlREX1NFVCwgUE9SVERfQ0xFQVIsCi1QT1JURF9ESVJfU0VULCBQT1JURF9ESVJfQ0xFQVIsIFBPUlREX0lORU4sCi1QT1JURF9GRVIgcmVnaXN0ZXJzCi0qLwotCi0jZGVmaW5lIFBEMCAweDAwMDEKLSNkZWZpbmUgUEQxIDB4MDAwMgotI2RlZmluZSBQRDIgMHgwMDA0Ci0jZGVmaW5lIFBEMyAweDAwMDgKLSNkZWZpbmUgUEQ0IDB4MDAxMAotI2RlZmluZSBQRDUgMHgwMDIwCi0jZGVmaW5lIFBENiAweDAwNDAKLSNkZWZpbmUgUEQ3IDB4MDA4MAotI2RlZmluZSBQRDggMHgwMTAwCi0jZGVmaW5lIFBEOSAweDAyMDAKLSNkZWZpbmUgUEQxMCAweDA0MDAKLSNkZWZpbmUgUEQxMSAweDA4MDAKLSNkZWZpbmUgUEQxMiAweDEwMDAKLSNkZWZpbmUgUEQxMyAweDIwMDAKLSNkZWZpbmUgUEQxNCAweDQwMDAKLSNkZWZpbmUgUEQxNSAweDgwMDAKLQotLyogUE9SVCBFIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEUsIFBPUlRFX1NFVCwgUE9SVEVfQ0xFQVIsCi1QT1JURV9ESVJfU0VULCBQT1JURV9ESVJfQ0xFQVIsIFBPUlRFX0lORU4sCi1QT1JURV9GRVIgcmVnaXN0ZXJzCi0qLwotCi0KLSNkZWZpbmUgUEUwIDB4MDAwMQotI2RlZmluZSBQRTEgMHgwMDAyCi0jZGVmaW5lIFBFMiAweDAwMDQKLSNkZWZpbmUgUEUzIDB4MDAwOAotI2RlZmluZSBQRTQgMHgwMDEwCi0jZGVmaW5lIFBFNSAweDAwMjAKLSNkZWZpbmUgUEU2IDB4MDA0MAotI2RlZmluZSBQRTcgMHgwMDgwCi0jZGVmaW5lIFBFOCAweDAxMDAKLSNkZWZpbmUgUEU5IDB4MDIwMAotI2RlZmluZSBQRTEwIDB4MDQwMAotI2RlZmluZSBQRTExIDB4MDgwMAotI2RlZmluZSBQRTEyIDB4MTAwMAotI2RlZmluZSBQRTEzIDB4MjAwMAotI2RlZmluZSBQRTE0IDB4NDAwMAotI2RlZmluZSBQRTE1IDB4ODAwMAotCi0vKiBQT1JUIEYgQml0IERlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzCi1QT1JURiwgUE9SVEZfU0VULCBQT1JURl9DTEVBUiwKLVBPUlRGX0RJUl9TRVQsIFBPUlRGX0RJUl9DTEVBUiwgUE9SVEZfSU5FTiwKLVBPUlRGX0ZFUiByZWdpc3RlcnMKLSovCi0KLQotI2RlZmluZSBQRjAgMHgwMDAxCi0jZGVmaW5lIFBGMSAweDAwMDIKLSNkZWZpbmUgUEYyIDB4MDAwNAotI2RlZmluZSBQRjMgMHgwMDA4Ci0jZGVmaW5lIFBGNCAweDAwMTAKLSNkZWZpbmUgUEY1IDB4MDAyMAotI2RlZmluZSBQRjYgMHgwMDQwCi0jZGVmaW5lIFBGNyAweDAwODAKLSNkZWZpbmUgUEY4IDB4MDEwMAotI2RlZmluZSBQRjkgMHgwMjAwCi0jZGVmaW5lIFBGMTAgMHgwNDAwCi0jZGVmaW5lIFBGMTEgMHgwODAwCi0jZGVmaW5lIFBGMTIgMHgxMDAwCi0jZGVmaW5lIFBGMTMgMHgyMDAwCi0jZGVmaW5lIFBGMTQgMHg0MDAwCi0jZGVmaW5lIFBGMTUgMHg4MDAwCi0KLS8qIFBPUlQgRyBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRHLCBQT1JUR19TRVQsIFBPUlRHX0NMRUFSLAotUE9SVEdfRElSX1NFVCwgUE9SVEdfRElSX0NMRUFSLCBQT1JUR19JTkVOLAotUE9SVEdfRkVSIHJlZ2lzdGVycwotKi8KLQotCi0jZGVmaW5lIFBHMCAweDAwMDEKLSNkZWZpbmUgUEcxIDB4MDAwMgotI2RlZmluZSBQRzIgMHgwMDA0Ci0jZGVmaW5lIFBHMyAweDAwMDgKLSNkZWZpbmUgUEc0IDB4MDAxMAotI2RlZmluZSBQRzUgMHgwMDIwCi0jZGVmaW5lIFBHNiAweDAwNDAKLSNkZWZpbmUgUEc3IDB4MDA4MAotI2RlZmluZSBQRzggMHgwMTAwCi0jZGVmaW5lIFBHOSAweDAyMDAKLSNkZWZpbmUgUEcxMCAweDA0MDAKLSNkZWZpbmUgUEcxMSAweDA4MDAKLSNkZWZpbmUgUEcxMiAweDEwMDAKLSNkZWZpbmUgUEcxMyAweDIwMDAKLSNkZWZpbmUgUEcxNCAweDQwMDAKLSNkZWZpbmUgUEcxNSAweDgwMDAKLQotLyogUE9SVCBIIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEgsIFBPUlRIX1NFVCwgUE9SVEhfQ0xFQVIsCi1QT1JUSF9ESVJfU0VULCBQT1JUSF9ESVJfQ0xFQVIsIFBPUlRIX0lORU4sCi1QT1JUSF9GRVIgcmVnaXN0ZXJzCi0qLwotCi0KLSNkZWZpbmUgUEgwIDB4MDAwMQotI2RlZmluZSBQSDEgMHgwMDAyCi0jZGVmaW5lIFBIMiAweDAwMDQKLSNkZWZpbmUgUEgzIDB4MDAwOAotI2RlZmluZSBQSDQgMHgwMDEwCi0jZGVmaW5lIFBINSAweDAwMjAKLSNkZWZpbmUgUEg2IDB4MDA0MAotI2RlZmluZSBQSDcgMHgwMDgwCi0jZGVmaW5lIFBIOCAweDAxMDAKLSNkZWZpbmUgUEg5IDB4MDIwMAotI2RlZmluZSBQSDEwIDB4MDQwMAotI2RlZmluZSBQSDExIDB4MDgwMAotI2RlZmluZSBQSDEyIDB4MTAwMAotI2RlZmluZSBQSDEzIDB4MjAwMAotCi0KLS8qIFBPUlQgSSBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRJLCBQT1JUSV9TRVQsIFBPUlRJX0NMRUFSLAotUE9SVElfRElSX1NFVCwgUE9SVElfRElSX0NMRUFSLCBQT1JUSV9JTkVOLAotUE9SVElfRkVSIHJlZ2lzdGVycwotKi8KLQotCi0jZGVmaW5lIFBJMCAweDAwMDEKLSNkZWZpbmUgUEkxIDB4MDAwMgotI2RlZmluZSBQSTIgMHgwMDA0Ci0jZGVmaW5lIFBJMyAweDAwMDgKLSNkZWZpbmUgUEk0IDB4MDAxMAotI2RlZmluZSBQSTUgMHgwMDIwCi0jZGVmaW5lIFBJNiAweDAwNDAKLSNkZWZpbmUgUEk3IDB4MDA4MAotI2RlZmluZSBQSTggMHgwMTAwCi0jZGVmaW5lIFBJOSAweDAyMDAKLSNkZWZpbmUgUEkxMCAweDA0MDAKLSNkZWZpbmUgUEkxMSAweDA4MDAKLSNkZWZpbmUgUEkxMiAweDEwMDAKLSNkZWZpbmUgUEkxMyAweDIwMDAKLSNkZWZpbmUgUEkxNCAweDQwMDAKLSNkZWZpbmUgUEkxNSAweDgwMDAKLQotLyogUE9SVCBKIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEosIFBPUlRKX1NFVCwgUE9SVEpfQ0xFQVIsCi1QT1JUSl9ESVJfU0VULCBQT1JUSl9ESVJfQ0xFQVIsIFBPUlRKX0lORU4sCi1QT1JUSl9GRVIgcmVnaXN0ZXJzCi0qLwotCi0KLSNkZWZpbmUgUEowIDB4MDAwMQotI2RlZmluZSBQSjEgMHgwMDAyCi0jZGVmaW5lIFBKMiAweDAwMDQKLSNkZWZpbmUgUEozIDB4MDAwOAotI2RlZmluZSBQSjQgMHgwMDEwCi0jZGVmaW5lIFBKNSAweDAwMjAKLSNkZWZpbmUgUEo2IDB4MDA0MAotI2RlZmluZSBQSjcgMHgwMDgwCi0jZGVmaW5lIFBKOCAweDAxMDAKLSNkZWZpbmUgUEo5IDB4MDIwMAotI2RlZmluZSBQSjEwIDB4MDQwMAotI2RlZmluZSBQSjExIDB4MDgwMAotI2RlZmluZSBQSjEyIDB4MTAwMAotI2RlZmluZSBQSjEzIDB4MjAwMAotCi0KIC8qIFBvcnQgTXV4aW5nIEJpdCBGaWVsZHMgZm9yIFBPUlR4X01VWCBSZWdpc3RlcnMgKi8KIAogI2RlZmluZSBNVVgwIDB4MDAwMDAwMDMKQEAgLTI3MDMsMTYgKzI0MDAsNCBAQAogI2RlZmluZSBCM01BUF9QSUggMHgwNjAwMDAwMCAvKiBNYXAgUG9ydCBJIEhpZ2ggdG8gQnl0ZSAzICovCiAjZGVmaW5lIEIzTUFQX1BKSCAweDA3MDAwMDAwIC8qIE1hcCBQb3J0IEogSGlnaCB0byBCeXRlIDMgKi8KIAotCi0vKiBmb3IgbGVnYWN5IGNvbXBhdGliaWxpdHkgKi8KLQotI2RlZmluZSBXTFMoeCkgICgoKHgpLTUpICYgMHgwMykgLyogV29yZCBMZW5ndGggU2VsZWN0ICovCi0jZGVmaW5lIFcxTE1BWF9NQVggVzFMTUFYX01JTgotI2RlZmluZSBFQklVX0FNQ0JDVEwwIEVCSVVfQU1CQ1RMMAotI2RlZmluZSBFQklVX0FNQ0JDVEwxIEVCSVVfQU1CQ1RMMQotI2RlZmluZSBQSU5UMF9JUlEgUElOVDBfUkVRVUVTVAotI2RlZmluZSBQSU5UMV9JUlEgUElOVDFfUkVRVUVTVAotI2RlZmluZSBQSU5UMl9JUlEgUElOVDJfUkVRVUVTVAotI2RlZmluZSBQSU5UM19JUlEgUElOVDNfUkVRVUVTVAotCiAjZW5kaWYgLyogX0RFRl9CRjU0WF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDI4MDM3ZTMuLjdkYjQzMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0yMDAsNCArMjAwLDE1IEBACiAKICNlbmRpZgogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtYS5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWIuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1jLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZC5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWUuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1mLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZy5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWguaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1pLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtai5oPgorCiAjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggMWY5OWI1MS4uOTlmZDFiMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC00NzQsNCArNDc0LDI2IEBACiAjZGVmaW5lIElSUV9QSU5UMl9QT1MJCTI0CiAjZGVmaW5lIElSUV9QSU5UM19QT1MJCTI4CiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIGJmaW4gcGludCByZWdpc3RlcnMgbGF5b3V0CisgKi8KK3N0cnVjdCBiZmluX3BpbnRfcmVncyB7CisJdTMyIG1hc2tfc2V0OworCXUzMiBtYXNrX2NsZWFyOworCXUzMiBpcnE7CisJdTMyIGFzc2lnbjsKKwl1MzIgZWRnZV9zZXQ7CisJdTMyIGVkZ2VfY2xlYXI7CisJdTMyIGludmVydF9zZXQ7CisJdTMyIGludmVydF9jbGVhcjsKKwl1MzIgcGluc3RhdGU7CisJdTMyIGxhdGNoOworCXUzMiBfX3BhZDBbMl07Cit9OworCisjZW5kaWYKKwogI2VuZGlmIC8qIF9CRjU0OF9JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcGxsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL3BsbC5oCmluZGV4IDc4NjVhMDkuLjk0Y2NhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcGxsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9wbGwuaApAQCAtMSw2OSArMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqLwotCi0jaWZuZGVmIF9NQUNIX1BMTF9ICi0jZGVmaW5lIF9NQUNIX1BMTF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KLQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQlpd3IyID0gYmZpbl9yZWFkMzIoU0lDX0lXUjIpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IyLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMSwgaXdyMjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCmluZGV4IGY5OWYxNzQuLjUyZDZmNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAlqdW1wIC5McmV0cnlfY29yZWxvY2sKIC5MZG9uZV9jb3JlbG9jazoKIAlwMCA9IHIxOworCS8qIGZsdXNoIGNvcmUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyIGJlZm9yZSBpbnZhbGlkYXRlIGRjYWNoZSAqLwogCUNTWU5DKHIyKTsKIAlmbHVzaGludltwMF07CiAJU1NZTkMocjIpOwpAQCAtNjg1LDYgKzY4Niw4IEBACiAJcjEgPSAtTDFfQ0FDSEVfQllURVM7CiAJcjEgPSByMCAmIHIxOwogCXAwID0gcjE7CisJLyogZmx1c2ggY29yZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIgYmVmb3JlIGludmFsaWRhdGUgZGNhY2hlICovCisJQ1NZTkMocjIpOwogCWZsdXNoaW52W3AwXTsKIAlTU1lOQyhyMik7CiAJcjAgPSBbcDFdOwpAQCAtOTA3LDYgKzkxMCw4IEBACiAJcjEgPSAtTDFfQ0FDSEVfQllURVM7CiAJcjEgPSByMCAmIHIxOwogCXAwID0gcjE7CisJLyogZmx1c2ggY29yZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIgYmVmb3JlIGludmFsaWRhdGUgZGNhY2hlICovCisJQ1NZTkMocjIpOwogCWZsdXNoaW52W3AwXTsKIAlTU1lOQyhyMik7CiAJcjAgPSBbcDFdOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYwppbmRleCAwYjFjMjBmLi4zOTI2Y2Q5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2Fjdmlsb24uYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJIH0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCAwODdiNmIwLi4zYjY3OTI5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKaW5kZXggYWI3YTQ4Ny4uZjY2N2U3NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCmluZGV4IGQzMDE3ZTUuLmJiMDU2ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKaW5kZXggYzkzOGMzYy4uOGZmZGQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMl9ORVhUX0RFU0NfUFRSLApAQCAtMzYsMTQgKzM2LDE0IEBACiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl85X05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl8xMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfMTFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX1MwX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEyX0QwX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTJfUzBfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMl9EMV9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEyX1MxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MyX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EM19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzNfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBJTURNQV9EMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIElNRE1BX1MwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgSU1ETUFfRDFfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ob3RwbHVnLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaG90cGx1Zy5jCmluZGV4IGM5NTE2OWIuLjRjZDNiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ob3RwbHVnLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hvdHBsdWcuYwpAQCAtNiw3ICs2LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKwogI2RlZmluZSBTSUNfU1lTSVJRKGlycSkJKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKQogCiBpbnQgaG90cGx1Z19jb3JlYjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKaW5kZXggNGMxMDhjOS4uNmEzNDk5YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTE4MSw3ICsxODEsMTEgQEAKIC8qIEluY29ycmVjdCBUaW1lciBQdWxzZSBXaWR0aCBpbiBTaW5nbGUtU2hvdCBQV01fT1VUIE1vZGUgd2l0aCBFeHRlcm5hbCBDbG9jayAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjU0IChfX1NJTElDT05fUkVWSVNJT05fXyA+IDMpCiAvKiBJbnRlcnJ1cHQvRXhjZXB0aW9uIER1cmluZyBTaG9ydCBIYXJkd2FyZSBMb29wIE1heSBDYXVzZSBCYWQgSW5zdHJ1Y3Rpb24gRmV0Y2hlcyAqLwotI2RlZmluZSBBTk9NQUxZXzA1MDAwMjU3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCisvKiBUZW1wb2FyeSB3b3JrIGFyb3VuZCBmb3Iga2dkYiBidWcgNjMzMyBpbiBTTVAga2VybmVsLiBJdCBsb29rcyBjb3JlYiBoYW5ncyBpbiBleGNlcHRpb24KKyAqIHdpdGhvdXQgaGFuZGxpbmcgYW5vbWFseSAwNTAwMDI1NyBwcm9wZXJseSBvbiBiZjU2MSB2MC41LiBUaGlzIHdvcmsgYXJvdW5kIG1heSBjaGFuZ2UKKyAqIGFmdGVyIHRoZSBiZWhhdmlvciBhbmQgdGhlIHJvb3QgY2F1c2UgYXJlIGNvbmZpcm1lZCB3aXRoIGhhcmR3YXJlIHRlYW0uCisgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1IHx8IChfX1NJTElDT05fUkVWSVNJT05fXyA9PSA1ICYmIENPTkZJR19TTVApKQogLyogSW5zdHJ1Y3Rpb24gQ2FjaGUgSXMgQ29ycnVwdGVkIFdoZW4gQml0cyA5IGFuZCAxMiBvZiB0aGUgSUNQTEIgRGF0YSBSZWdpc3RlcnMgRGlmZmVyICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNTggKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKIC8qIElDUExCX1NUQVRVUyBNTVIgUmVnaXN0ZXIgTWF5IEJlIENvcnJ1cHRlZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCBlMzNlMTU4Li4zYTY5NDc0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsMzYgKzQsOSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAotI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCi0jZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKLQotI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSx2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCx2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQotI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKICMgaWZuZGVmIENPTkZJR19VQVJUMF9DVFNfUElOCkBAIC00NCw1MSArMTcsNiBAQAogIyBlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCi0KLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKLSAgICAgICAgc3RydWN0IHVhcnRfcG9ydCAgICAgICAgcG9ydDsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgb2xkX3N0YXR1czsKLQlpbnQJCQlzdGF0dXNfaXJxOwotCXVuc2lnbmVkIGludCBsc3I7Ci0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQotCWludAkJCXR4X2RvbmU7Ci0JaW50CQkJdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQJCQlyeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOwotI2Vsc2UKLSMgaWYgQU5PTUFMWV8wNTAwMDM2MwotCXVuc2lnbmVkIGludCBhbm9tYWx5X3RocmVzaG9sZDsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICBjdHNfdGltZXI7Ci0JaW50CQkJY3RzX3BpbjsKLQlpbnQJCQlydHNfcGluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKLSAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAotICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1YXJ0LT5sc3IgPSAwOwotCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Ci19Ci0KIHN0cnVjdCBiZmluX3NlcmlhbF9yZXMgewogCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CiAJaW50CQl1YXJ0X2lycTsKQEAgLTEyMCwzICs0OCw1IEBACiB9OwogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCisKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCA2YzdkYzU4Li5kYzQ3MDUzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC0xMCwxMSArMTAsMTQgQEAKICNkZWZpbmUgQkY1NjFfRkFNSUxZCiAKICNpbmNsdWRlICJiZjU2MS5oIgotI2luY2x1ZGUgImRlZkJGNTYxLmgiCiAjaW5jbHVkZSAiYW5vbWFseS5oIgogCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQotI2luY2x1ZGUgImNkZWZCRjU2MS5oIgorI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorI2luY2x1ZGUgImRlZkJGNTYxLmgiCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaW5jbHVkZSAiY2RlZkJGNTYxLmgiCiAjZW5kaWYKIAogI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfRCgpIGJmaW5fcmVhZF9GSU8wX0ZMQUdfRCgpCkBAIC0zNSwxOSArMzgsNCBAQAogI2RlZmluZSBiZmluX3JlYWRfU0lDQl9JU1IoeCkJCWJmaW5fcmVhZDMyKF9fU0lDX01VWChTSUNCX0lTUjAsIHgpKQogI2RlZmluZSBiZmluX3dyaXRlX1NJQ0JfSVNSKHgsIHZhbCkJYmZpbl93cml0ZTMyKF9fU0lDX01VWChTSUNCX0lTUjAsIHgpLCB2YWwpCiAKLSNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTICAgICAgMQotCi0jZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVIgICAgICAgICAgICAgIDB4MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICAgICovCi0jZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCi0KICNlbmRpZgkJCQkvKiBfTUFDSF9CTEFDS0ZJTl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKaW5kZXggMmJhYjk5MS4uNzUzMzMxNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1NjFfSAogI2RlZmluZSBfQ0RFRl9CRjU2MV9ICiAKLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTYxLmgiCi0KLS8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC01MjMsMTQgKzUxNSwxNCBAQAogI2RlZmluZSBiZmluX3JlYWRfUFBJMV9GUkFNRSgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUFBJMV9GUkFNRSkKICNkZWZpbmUgYmZpbl93cml0ZV9QUEkxX0ZSQU1FKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihQUEkxX0ZSQU1FLHZhbCkKIC8qRE1BIHRyYWZmaWMgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfUEVSKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfUEVSKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTFfVENfUEVSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfQ05UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfQ05UKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTFfVENfQ05ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfVENfUEVSKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTJfVENfUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfVENfUEVSKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTJfVENfUEVSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfVENfQ05UKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQTJfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfVENfQ05UKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KERNQTJfVENfQ05ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUMwX1RDX1BFUigpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQUMwX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDMF9UQ19QRVIodmFsKSAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDMF9UQ19QRVIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQzBfVENfQ05UKCkgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQzBfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUMwX1RDX0NOVCh2YWwpICAgICAgICAgYmZpbl93cml0ZTE2KERNQUMwX1RDX0NOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMV9UQ19QRVIoKSAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDMV9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzFfVENfUEVSKHZhbCkgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQzFfVENfUEVSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUMxX1RDX0NOVCgpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQUMxX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDMV9UQ19DTlQodmFsKSAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDMV9UQ19DTlQsdmFsKQogLyogRE1BMSBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDFDMDAtMHhGRkMwIDFGRkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUExXzBfQ09ORklHKCkgICAgICAgICAgICBiZmluX3JlYWQxNihETUExXzBfQ09ORklHKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfMF9DT05GSUcodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KERNQTFfMF9DT05GSUcsdmFsKQpAQCAtODQ1LDExMCArODM3LDExMCBAQAogI2RlZmluZSBiZmluX3JlYWRfRE1BMV8xMV9QRVJJUEhFUkFMX01BUCgpICAgYmZpbl9yZWFkMTYoRE1BMV8xMV9QRVJJUEhFUkFMX01BUCkKICNkZWZpbmUgYmZpbl93cml0ZV9ETUExXzExX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTFfMTFfUEVSSVBIRVJBTF9NQVAsdmFsKQogLyogTWVtb3J5IERNQTEgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAxRTgwLTB4RkZDMCAxRkZGKSAqLwotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9EMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMV9EMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUExX0QwX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfRDBfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMV9EMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTFfRDBfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTFfRDBfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMV9EMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9QRVJJUEhFUkFMX01BUCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ09ORklHLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUExX1MwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUExX1MwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQTFfUzBfU1RBUlRfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUExX1MwX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUExX1MwX1hfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUExX1MwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMV9TMF9DVVJSX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUExX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BMV9TMF9DVVJSX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9JUlFfU1RBVFVTLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DT05GSUcsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfRDFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX0QxX05FWFRfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQTFfRDFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BMV9EMV9TVEFSVF9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfRDFfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfRDFfWF9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfRDFfWV9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfRDFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX0QxX0NVUlJfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQTFfRDFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUExX0QxX0NVUlJfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUExX0QxX0lSUV9TVEFUVVMsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9TMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMV9TMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUExX1MxX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfUzFfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMV9TMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTFfUzFfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTFfUzFfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMV9TMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9EMl9DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDJfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfRDJfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX0QyX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDJfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QyX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDJfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9EMl9DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX0QyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9EMl9JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9EMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfUEVSSVBIRVJBTF9NQVAsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzJfQ09ORklHLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MyX05FWFRfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BX1MyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BX1MyX1NUQVJUX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MyX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MyX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9TMl9YX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MyX1lfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MyX0NVUlJfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BX1MyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUFfUzJfQ1VSUl9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9DVVJSX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX0NVUlJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzJfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUFfUzJfSVJRX1NUQVRVUyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX1BFUklQSEVSQUxfTUFQLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QzX0NPTkZJRyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDNfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EM19ORVhUX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQV9EM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQV9EM19TVEFSVF9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EM19YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EM19ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDNfWF9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9EM19ZX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDNfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EM19DVVJSX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQV9EM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BX0QzX0NVUlJfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfQ1VSUl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19DVVJSX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BX0QzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BX0QzX0lSUV9TVEFUVVMsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BX0QzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9TM19DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzNfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfUzNfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzNfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzNfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MzX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfUzNfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzNfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9TM19DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9TM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9TM19JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9TM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfUEVSSVBIRVJBTF9NQVAsdmFsKQogLyogRE1BMiBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDBDMDAtMHhGRkMwIDBERkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUEyXzBfQ09ORklHKCkgICAgICAgICAgICBiZmluX3JlYWQxNihETUEyXzBfQ09ORklHKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfMF9DT05GSUcodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KERNQTJfMF9DT05GSUcsdmFsKQpAQCAtMTI2MywxMTAgKzEyNTUsMTEwIEBACiAjZGVmaW5lIGJmaW5fcmVhZF9ETUEyXzExX1BFUklQSEVSQUxfTUFQKCkgICBiZmluX3JlYWQxNihETUEyXzExX1BFUklQSEVSQUxfTUFQKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfMTFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMl8xMV9QRVJJUEhFUkFMX01BUCx2YWwpCiAvKiBNZW1vcnkgRE1BMiBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDBFODAtMHhGRkMwIDBGRkYpICovCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQTJfRDBfQ09ORklHLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX0QwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9EMF9ORVhUX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX0QwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQTJfRDBfU1RBUlRfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QwX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QwX1hfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QwX1lfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX0QwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9EMF9DVVJSX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX0QwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BMl9EMF9DVVJSX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9DVVJSX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9DVVJSX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9JUlFfU1RBVFVTLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX0QwX1BFUklQSEVSQUxfTUFQLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMF9DT05GSUcsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTJfUzBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUEyX1MwX05FWFRfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQTJfUzBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BMl9TMF9TVEFSVF9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTJfUzBfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MwX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTJfUzBfWF9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTJfUzBfWV9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTJfUzBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUEyX1MwX0NVUlJfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQTJfUzBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUEyX1MwX0NVUlJfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX1MwX0NVUlJfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX1MwX0NVUlJfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUEyX1MwX0lSUV9TVEFUVVMsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQTJfUzBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfUzBfUEVSSVBIRVJBTF9NQVAsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QxX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9EMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfRDFfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMl9EMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUEyX0QxX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMV9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTJfRDFfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMV9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMV9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9EMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfRDFfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMl9EMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTJfRDFfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfRDFfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfRDFfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTJfRDFfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMl9EMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9EMV9QRVJJUEhFUkFMX01BUCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQTJfUzFfQ09ORklHLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX1MxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9TMV9ORVhUX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX1MxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQTJfUzFfU1RBUlRfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MxX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MxX1hfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MxX1lfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX1MxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9TMV9DVVJSX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX1MxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BMl9TMV9DVVJSX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9DVVJSX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9DVVJSX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9JUlFfU1RBVFVTLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX1MxX1BFUklQSEVSQUxfTUFQLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQV9EMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQV9EMF9TVEFSVF9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EMF9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EMF9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfUzBfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MwX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX0QxX05FWFRfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BX0QxX1NUQVJUX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QxX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QxX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9EMV9YX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQV9TMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQV9TMV9TVEFSVF9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9TMV9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9TMV9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCx2YWwpCiAvKiBJbnRlcm5hbCBNZW1vcnkgRE1BIFJlZ2lzdGVycyAoMHhGRkMwXzE4MDAgLSAweEZGQzBfMTlGRikgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0lNRE1BX0QwX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KElNRE1BX0QwX0NPTkZJRykKICNkZWZpbmUgYmZpbl93cml0ZV9JTURNQV9EMF9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihJTURNQV9EMF9DT05GSUcsdmFsKQpAQCAtMTQ2NSw2NSArMTQ1Nyw0IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9JTURNQV9TMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihJTURNQV9TMV9JUlFfU1RBVFVTKQogI2RlZmluZSBiZmluX3dyaXRlX0lNRE1BX1MxX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KElNRE1BX1MxX0lSUV9TVEFUVVMsdmFsKQogCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpICBiZmluX3JlYWRfTURNQTFfUzBfQ09ORklHKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzBfQ09ORklHKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpICBiZmluX3JlYWRfTURNQTFfUzBfSVJRX1NUQVRVUygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMF9JUlFfU1RBVFVTKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUExX1MwX1hfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMF9YX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMV9TMF9ZX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzBfWV9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMV9TMF9YX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUExX1MwX1hfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMV9TMF9ZX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUExX1MwX1lfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMV9TMF9TVEFSVF9BRERSKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUExX1MwX1NUQVJUX0FERFIodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DT05GSUcoKSAgYmZpbl9yZWFkX01ETUExX0QwX0NPTkZJRygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcodmFsKSBiZmluX3dyaXRlX01ETUExX0QwX0NPTkZJRyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAgYmZpbl9yZWFkX01ETUExX0QwX0lSUV9TVEFUVVMoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfSVJRX1NUQVRVUyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMV9EMF9YX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfRDBfWV9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX0QwX1lfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfRDBfWF9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMF9YX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfRDBfWV9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpICBiZmluX3JlYWRfTURNQTFfRDBfU1RBUlRfQUREUigpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMF9TVEFSVF9BRERSKHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DT05GSUcoKSAgYmZpbl9yZWFkX01ETUExX1MxX0NPTkZJRygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DT05GSUcodmFsKSBiZmluX3dyaXRlX01ETUExX1MxX0NPTkZJRyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKSAgYmZpbl9yZWFkX01ETUExX1MxX0lSUV9TVEFUVVMoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzFfSVJRX1NUQVRVUyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMV9TMV9YX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfUzFfWV9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX1MxX1lfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfUzFfWF9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMV9YX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfUzFfWV9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpICBiZmluX3JlYWRfTURNQTFfUzFfU1RBUlRfQUREUigpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMV9TVEFSVF9BRERSKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMV9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUExX0QxX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfRDFfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX0QxX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUExX0QxX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX0QxX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX0QxX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDFfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUExX0QxX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDFfU1RBUlRfQUREUih2YWwpCi0KLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1NjFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCmluZGV4IDc5ZTA0OGQuLjcxZTgwNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKQEAgLTEsMTggKzEsMTEgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCiAjaWZuZGVmIF9ERUZfQkY1NjFfSAogI2RlZmluZSBfREVGX0JGNTYxX0gKLS8qCi0jaWYgIWRlZmluZWQoX19BRFNQQkY1NjFfXykKLSN3YXJuaW5nIGRlZkJGNTYxLmggc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZm9yIEJGNTYxIGNoaXAuCi0jZW5kaWYKLSovCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogLyogU3lzdGVtIE1NUiBSZWdpc3RlciBNYXAgKi8KQEAgLTMxMSwxMCArMzA0LDEwIEBACiAjZGVmaW5lIFBQSTFfRlJBTUUgCQkJCQkweEZGQzAxMzEwCS8qIFBQSTEgRnJhbWUgTGVuZ3RoIHJlZ2lzdGVyICovCiAKIC8qRE1BIHRyYWZmaWMgY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUJRE1BMV9UQ19QRVIgIDB4RkZDMDFCMEMJLyogVHJhZmZpYyBjb250cm9sIHBlcmlvZHMgKi8KLSNkZWZpbmUJRE1BMV9UQ19DTlQgIDB4RkZDMDFCMTAJLyogVHJhZmZpYyBjb250cm9sIGN1cnJlbnQgY291bnRzICovCi0jZGVmaW5lCURNQTJfVENfUEVSICAweEZGQzAwQjBDCS8qIFRyYWZmaWMgY29udHJvbCBwZXJpb2RzICovCi0jZGVmaW5lCURNQTJfVENfQ05UICAweEZGQzAwQjEwCS8qIFRyYWZmaWMgY29udHJvbCBjdXJyZW50IGNvdW50cyAgICAgICAgKi8KKyNkZWZpbmUJRE1BQzBfVENfUEVSICAweEZGQzAwQjBDCS8qIFRyYWZmaWMgY29udHJvbCBwZXJpb2RzICovCisjZGVmaW5lCURNQUMwX1RDX0NOVCAgMHhGRkMwMEIxMAkvKiBUcmFmZmljIGNvbnRyb2wgY3VycmVudCBjb3VudHMgICAgICAgICovCisjZGVmaW5lCURNQUMxX1RDX1BFUiAgMHhGRkMwMUIwQwkvKiBUcmFmZmljIGNvbnRyb2wgcGVyaW9kcyAqLworI2RlZmluZQlETUFDMV9UQ19DTlQgIDB4RkZDMDFCMTAJLyogVHJhZmZpYyBjb250cm9sIGN1cnJlbnQgY291bnRzICovCiAKIC8qIERNQTEgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAxQzAwLTB4RkZDMCAxRkZGKSAqLwogI2RlZmluZSBETUExXzBfQ09ORklHIDB4RkZDMDFDMDgJLyogRE1BMSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtNDg2LDYxICs0NzksNjEgQEAKICNkZWZpbmUgRE1BMV8xMV9QRVJJUEhFUkFMX01BUCAweEZGQzAxRUVDCS8qIERNQTEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwogCiAvKiBNZW1vcnkgRE1BMSBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDFFODAtMHhGRkMwIDFGRkYpICovCi0jZGVmaW5lIE1ETUExX0QwX0NPTkZJRyAweEZGQzAxRjA4CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lIE1ETUExX0QwX05FWFRfREVTQ19QVFIgMHhGRkMwMUYwMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTFfRDBfU1RBUlRfQUREUiAweEZGQzAxRjA0CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUExX0QwX1hfQ09VTlQgMHhGRkMwMUYxMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9EMF9ZX0NPVU5UIDB4RkZDMDFGMTgJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDBfWF9NT0RJRlkgMHhGRkMwMUYxNAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCi0jZGVmaW5lIE1ETUExX0QwX1lfTU9ESUZZIDB4RkZDMDFGMUMJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9EMF9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGMjAJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTFfRDBfQ1VSUl9BRERSIDB4RkZDMDFGMjQJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9EMF9DVVJSX1hfQ09VTlQgMHhGRkMwMUYzMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDBfQ1VSUl9ZX0NPVU5UIDB4RkZDMDFGMzgJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX0QwX0lSUV9TVEFUVVMgMHhGRkMwMUYyOAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyAqLwotI2RlZmluZSBNRE1BMV9EMF9QRVJJUEhFUkFMX01BUCAweEZGQzAxRjJDCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCAqLworI2RlZmluZSBNRE1BX0QyX0NPTkZJRyAweEZGQzAxRjA4CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIE1ETUFfRDJfTkVYVF9ERVNDX1BUUiAweEZGQzAxRjAwCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX0QyX1NUQVJUX0FERFIgMHhGRkMwMUYwNAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX0QyX1hfQ09VTlQgMHhGRkMwMUYxMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QyX1lfQ09VTlQgMHhGRkMwMUYxOAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QyX1hfTU9ESUZZIDB4RkZDMDFGMTQJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QyX1lfTU9ESUZZIDB4RkZDMDFGMUMJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QyX0NVUlJfREVTQ19QVFIgMHhGRkMwMUYyMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdCBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX0QyX0NVUlJfQUREUiAweEZGQzAxRjI0CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EMl9DVVJSX1hfQ09VTlQgMHhGRkMwMUYzMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EMl9DVVJSX1lfQ09VTlQgMHhGRkMwMUYzOAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EMl9JUlFfU1RBVFVTIDB4RkZDMDFGMjgJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgKi8KKyNkZWZpbmUgTURNQV9EMl9QRVJJUEhFUkFMX01BUCAweEZGQzAxRjJDCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCAqLwogCi0jZGVmaW5lIE1ETUExX1MwX0NPTkZJRyAweEZGQzAxRjQ4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSIDB4RkZDMDFGNDAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMV9TMF9TVEFSVF9BRERSIDB4RkZDMDFGNDQJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUExX1MwX1hfQ09VTlQgMHhGRkMwMUY1MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfWV9DT1VOVCAweEZGQzAxRjU4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMF9YX01PRElGWSAweEZGQzAxRjU0CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9TMF9ZX01PRElGWSAweEZGQzAxRjVDCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9TMF9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGNjAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLwotI2RlZmluZSBNRE1BMV9TMF9DVVJSX0FERFIgMHhGRkMwMUY2NAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9TMF9DVVJSX1hfQ09VTlQgMHhGRkMwMUY3MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMF9DVVJSX1lfQ09VTlQgMHhGRkMwMUY3OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMF9JUlFfU1RBVFVTIDB4RkZDMDFGNjgJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzICovCi0jZGVmaW5lIE1ETUExX1MwX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGNkMJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCAqLworI2RlZmluZSBNRE1BX1MyX0NPTkZJRyAweEZGQzAxRjQ4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNRE1BX1MyX05FWFRfREVTQ19QVFIgMHhGRkMwMUY0MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCisjZGVmaW5lIE1ETUFfUzJfU1RBUlRfQUREUiAweEZGQzAxRjQ0CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX1MyX1hfQ09VTlQgMHhGRkMwMUY1MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9TMl9ZX0NPVU5UIDB4RkZDMDFGNTgJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzJfWF9NT0RJRlkgMHhGRkMwMUY1NAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TMl9ZX01PRElGWSAweEZGQzAxRjVDCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX1MyX0NVUlJfREVTQ19QVFIgMHhGRkMwMUY2MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCisjZGVmaW5lIE1ETUFfUzJfQ1VSUl9BRERSIDB4RkZDMDFGNjQJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMl9DVVJSX1hfQ09VTlQgMHhGRkMwMUY3MAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MyX0NVUlJfWV9DT1VOVCAweEZGQzAxRjc4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzJfSVJRX1NUQVRVUyAweEZGQzAxRjY4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyAqLworI2RlZmluZSBNRE1BX1MyX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGNkMJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCAqLwogCi0jZGVmaW5lIE1ETUExX0QxX0NPTkZJRyAweEZGQzAxRjg4CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lIE1ETUExX0QxX05FWFRfREVTQ19QVFIgMHhGRkMwMUY4MAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTFfRDFfU1RBUlRfQUREUiAweEZGQzAxRjg0CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUExX0QxX1hfQ09VTlQgMHhGRkMwMUY5MAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9EMV9ZX0NPVU5UIDB4RkZDMDFGOTgJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDFfWF9NT0RJRlkgMHhGRkMwMUY5NAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCi0jZGVmaW5lIE1ETUExX0QxX1lfTU9ESUZZIDB4RkZDMDFGOUMJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9EMV9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGQTAJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTFfRDFfQ1VSUl9BRERSIDB4RkZDMDFGQTQJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgQ3VycmVudCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUExX0QxX0NVUlJfWF9DT1VOVCAweEZGQzAxRkIwCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9EMV9DVVJSX1lfQ09VTlQgMHhGRkMwMUZCOAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDFfSVJRX1NUQVRVUyAweEZGQzAxRkE4CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEludGVycnVwdC9TdGF0dXMgKi8KLSNkZWZpbmUgTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMUZBQwkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBQZXJpcGhlcmFsIE1hcCAqLworI2RlZmluZSBNRE1BX0QzX0NPTkZJRyAweEZGQzAxRjg4CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIE1ETUFfRDNfTkVYVF9ERVNDX1BUUiAweEZGQzAxRjgwCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX0QzX1NUQVJUX0FERFIgMHhGRkMwMUY4NAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX0QzX1hfQ09VTlQgMHhGRkMwMUY5MAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QzX1lfQ09VTlQgMHhGRkMwMUY5OAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QzX1hfTU9ESUZZIDB4RkZDMDFGOTQJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QzX1lfTU9ESUZZIDB4RkZDMDFGOUMJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QzX0NVUlJfREVTQ19QVFIgMHhGRkMwMUZBMAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX0QzX0NVUlJfQUREUiAweEZGQzAxRkE0CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX0QzX0NVUlJfWF9DT1VOVCAweEZGQzAxRkIwCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QzX0NVUlJfWV9DT1VOVCAweEZGQzAxRkI4CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX0QzX0lSUV9TVEFUVVMgMHhGRkMwMUZBOAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBJbnRlcnJ1cHQvU3RhdHVzICovCisjZGVmaW5lIE1ETUFfRDNfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMUZBQwkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBQZXJpcGhlcmFsIE1hcCAqLwogCi0jZGVmaW5lIE1ETUExX1MxX0NPTkZJRyAweEZGQzAxRkM4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBNRE1BMV9TMV9ORVhUX0RFU0NfUFRSIDB4RkZDMDFGQzAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMV9TMV9TVEFSVF9BRERSIDB4RkZDMDFGQzQJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUExX1MxX1hfQ09VTlQgMHhGRkMwMUZEMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfWV9DT1VOVCAweEZGQzAxRkQ4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMV9YX01PRElGWSAweEZGQzAxRkQ0CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9TMV9ZX01PRElGWSAweEZGQzAxRkRDCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9TMV9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGRTAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLwotI2RlZmluZSBNRE1BMV9TMV9DVVJSX0FERFIgMHhGRkMwMUZFNAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9TMV9DVVJSX1hfQ09VTlQgMHhGRkMwMUZGMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMV9DVVJSX1lfQ09VTlQgMHhGRkMwMUZGOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9TMV9JUlFfU1RBVFVTIDB4RkZDMDFGRTgJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzICovCi0jZGVmaW5lIE1ETUExX1MxX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGRUMJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCAqLworI2RlZmluZSBNRE1BX1MzX0NPTkZJRyAweEZGQzAxRkM4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNRE1BX1MzX05FWFRfREVTQ19QVFIgMHhGRkMwMUZDMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCisjZGVmaW5lIE1ETUFfUzNfU1RBUlRfQUREUiAweEZGQzAxRkM0CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX1MzX1hfQ09VTlQgMHhGRkMwMUZEMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9TM19ZX0NPVU5UIDB4RkZDMDFGRDgJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzNfWF9NT0RJRlkgMHhGRkMwMUZENAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TM19ZX01PRElGWSAweEZGQzAxRkRDCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX1MzX0NVUlJfREVTQ19QVFIgMHhGRkMwMUZFMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCisjZGVmaW5lIE1ETUFfUzNfQ1VSUl9BRERSIDB4RkZDMDFGRTQJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TM19DVVJSX1hfQ09VTlQgMHhGRkMwMUZGMAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MzX0NVUlJfWV9DT1VOVCAweEZGQzAxRkY4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzNfSVJRX1NUQVRVUyAweEZGQzAxRkU4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyAqLworI2RlZmluZSBNRE1BX1MzX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGRUMJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCAqLwogCiAvKiBETUEyIENvbnRyb2xsZXIgcmVnaXN0ZXJzICgweEZGQzAgMEMwMC0weEZGQzAgMERGRikgKi8KICNkZWZpbmUgRE1BMl8wX0NPTkZJRyAweEZGQzAwQzA4CS8qIERNQTIgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTcxMiwxMTcgKzcwNSw2MSBAQAogI2RlZmluZSBETUEyXzExX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBFRUMJLyogRE1BMiBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCiAKIC8qIE1lbW9yeSBETUEyIENvbnRyb2xsZXIgcmVnaXN0ZXJzICgweEZGQzAgMEU4MC0weEZGQzAgMEZGRikgKi8KLSNkZWZpbmUgTURNQTJfRDBfQ09ORklHIDB4RkZDMDBGMDgJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDBfTkVYVF9ERVNDX1BUUiAweEZGQzAwRjAwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMl9EMF9TVEFSVF9BRERSIDB4RkZDMDBGMDQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTJfRDBfWF9DT1VOVCAweEZGQzAwRjEwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDBfWV9DT1VOVCAweEZGQzAwRjE4CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IE91dGVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDBfWF9NT0RJRlkgMHhGRkMwMEYxNAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCi0jZGVmaW5lIE1ETUEyX0QwX1lfTU9ESUZZIDB4RkZDMDBGMUMJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9EMF9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGMjAJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTJfRDBfQ1VSUl9BRERSIDB4RkZDMDBGMjQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMl9EMF9DVVJSX1hfQ09VTlQgMHhGRkMwMEYzMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX0QwX0NVUlJfWV9DT1VOVCAweEZGQzAwRjM4CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCByZWcgKi8KLSNkZWZpbmUgTURNQTJfRDBfSVJRX1NUQVRVUyAweEZGQzAwRjI4CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDBfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEYyQwkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMF9DT05GSUcgMHhGRkMwMEYwOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIgMHhGRkMwMEYwMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KKyNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSIDB4RkZDMDBGMDQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EMF9YX0NPVU5UIDB4RkZDMDBGMTAJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgSW5uZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQgMHhGRkMwMEYxOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBPdXRlci1Mb29wIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkgMHhGRkMwMEYxNAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfRDBfWV9NT0RJRlkgMHhGRkMwMEYxQwkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBPdXRlci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiAweEZGQzAwRjIwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSIDB4RkZDMDBGMjQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVCAweEZGQzAwRjMwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCByZWcgKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQgMHhGRkMwMEYzOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgcmVnICovCisjZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUyAweEZGQzAwRjI4CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUCAweEZGQzAwRjJDCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCByZWdpc3RlciAqLwogCi0jZGVmaW5lIE1ETUEyX1MwX0NPTkZJRyAweEZGQzAwRjQ4CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMF9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGNDAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMl9TMF9TVEFSVF9BRERSIDB4RkZDMDBGNDQJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUEyX1MwX1hfQ09VTlQgMHhGRkMwMEY1MAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzBfWV9DT1VOVCAweEZGQzAwRjU4CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMF9YX01PRElGWSAweEZGQzAwRjU0CS8qTWVtRE1BMiBTdHJlYW0gMCBTcmMgSW5uZXItTG9vcCBBZGRyLUluY3JlbWVudCByZWcgKi8KLSNkZWZpbmUgTURNQTJfUzBfWV9NT0RJRlkgMHhGRkMwMEY1QwkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIE91dGVyLUxvb3AgQWRkci1JbmNyZW1lbnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX1MwX0NVUlJfREVTQ19QVFIgMHhGRkMwMEY2MAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCi0jZGVmaW5lIE1ETUEyX1MwX0NVUlJfQUREUiAweEZGQzAwRjY0CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUEyX1MwX0NVUlJfWF9DT1VOVCAweEZGQzAwRjcwCS8qTWVtRE1BMiBTdHJlYW0gMCBTcmMgQ3VycmVudCBJbm5lci1Mb29wIENvdW50IHJlZyAqLwotI2RlZmluZSBNRE1BMl9TMF9DVVJSX1lfQ09VTlQgMHhGRkMwMEY3OAkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCByZWcgKi8KLSNkZWZpbmUgTURNQTJfUzBfSVJRX1NUQVRVUyAweEZGQzAwRjY4CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMF9QRVJJUEhFUkFMX01BUCAweEZGQzAwRjZDCS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMF9DT05GSUcgMHhGRkMwMEY0OAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGNDAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIgMHhGRkMwMEY0NAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMF9YX0NPVU5UIDB4RkZDMDBGNTAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzBfWV9DT1VOVCAweEZGQzAwRjU4CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZIDB4RkZDMDBGNTQJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBJbm5lci1Mb29wIEFkZHItSW5jcmVtZW50IHJlZyAqLworI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZIDB4RkZDMDBGNUMJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBPdXRlci1Mb29wIEFkZHItSW5jcmVtZW50IHJlZyAqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfREVTQ19QVFIgMHhGRkMwMEY2MAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSIDB4RkZDMDBGNjQJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQgMHhGRkMwMEY3MAkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCByZWcgKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQgMHhGRkMwMEY3OAkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCByZWcgKi8KKyNkZWZpbmUgTURNQV9TMF9JUlFfU1RBVFVTIDB4RkZDMDBGNjgJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEY2QwkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIHJlZ2lzdGVyICovCiAKLSNkZWZpbmUgTURNQTJfRDFfQ09ORklHIDB4RkZDMDBGODgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDFfTkVYVF9ERVNDX1BUUiAweEZGQzAwRjgwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMl9EMV9TVEFSVF9BRERSIDB4RkZDMDBGODQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTJfRDFfWF9DT1VOVCAweEZGQzAwRjkwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDFfWV9DT1VOVCAweEZGQzAwRjk4CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IE91dGVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfRDFfWF9NT0RJRlkgMHhGRkMwMEY5NAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCi0jZGVmaW5lIE1ETUEyX0QxX1lfTU9ESUZZIDB4RkZDMDBGOUMJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9EMV9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGQTAJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgKi8KLSNkZWZpbmUgTURNQTJfRDFfQ1VSUl9BRERSIDB4RkZDMDBGQTQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyByZWcgKi8KLSNkZWZpbmUgTURNQTJfRDFfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGQjAJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgQ3VycmVudCBJbm5lci1Mb29wIENvdW50IHJlZyAqLwotI2RlZmluZSBNRE1BMl9EMV9DVVJSX1lfQ09VTlQgMHhGRkMwMEZCOAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX0QxX0lSUV9TVEFUVVMgMHhGRkMwMEZBOAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWcgKi8KLSNkZWZpbmUgTURNQTJfRDFfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEZBQwkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMV9DT05GSUcgMHhGRkMwMEY4OAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIgMHhGRkMwMEY4MAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KKyNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSIDB4RkZDMDBGODQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EMV9YX0NPVU5UIDB4RkZDMDBGOTAJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgSW5uZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQgMHhGRkMwMEY5OAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBPdXRlci1Mb29wIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkgMHhGRkMwMEY5NAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfRDFfWV9NT0RJRlkgMHhGRkMwMEY5QwkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBPdXRlci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiAweEZGQzAwRkEwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUHRyICovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSIDB4RkZDMDBGQTQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQgMHhGRkMwMEZCMAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgcmVnICovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGQjgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50IHJlZyAqLworI2RlZmluZSBNRE1BX0QxX0lSUV9TVEFUVVMgMHhGRkMwMEZBOAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWcgKi8KKyNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUCAweEZGQzAwRkFDCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCByZWdpc3RlciAqLwogCi0jZGVmaW5lIE1ETUEyX1MxX0NPTkZJRyAweEZGQzAwRkM4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMV9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGQzAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLwotI2RlZmluZSBNRE1BMl9TMV9TVEFSVF9BRERSIDB4RkZDMDBGQzQJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUEyX1MxX1hfQ09VTlQgMHhGRkMwMEZEMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzFfWV9DT1VOVCAweEZGQzAwRkQ4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMV9YX01PRElGWSAweEZGQzAwRkQ0CS8qTWVtRE1BMiBTdHJlYW0gMSBTcmMgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9TMV9ZX01PRElGWSAweEZGQzAwRkRDCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9TMV9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGRTAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLwotI2RlZmluZSBNRE1BMl9TMV9DVVJSX0FERFIgMHhGRkMwMEZFNAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMl9TMV9DVVJSX1hfQ09VTlQgMHhGRkMwMEZGMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMl9TMV9DVVJSX1lfQ09VTlQgMHhGRkMwMEZGOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMl9TMV9JUlFfU1RBVFVTIDB4RkZDMDBGRTgJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX1MxX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBGRUMJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCByZWdpc3RlciAqLwotCi0jZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUiBNRE1BMV9EMF9ORVhUX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUiBNRE1BMV9EMF9TVEFSVF9BRERSCi0jZGVmaW5lIE1ETUFfRDBfQ09ORklHIE1ETUExX0QwX0NPTkZJRwotI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQgTURNQTFfRDBfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QwX1hfTU9ESUZZIE1ETUExX0QwX1hfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDBfWV9DT1VOVCBNRE1BMV9EMF9ZX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDBfWV9NT0RJRlkgTURNQTFfRDBfWV9NT0RJRlkKLSNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSIE1ETUExX0QwX0NVUlJfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9EMF9DVVJSX0FERFIgTURNQTFfRDBfQ1VSUl9BRERSCi0jZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUyBNRE1BMV9EMF9JUlFfU1RBVFVTCi0jZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAgTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAKLSNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQgTURNQTFfRDBfQ1VSUl9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UIE1ETUExX0QwX0NVUlJfWV9DT1VOVAotCi0jZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUiBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUiBNRE1BMV9TMF9TVEFSVF9BRERSCi0jZGVmaW5lIE1ETUFfUzBfQ09ORklHIE1ETUExX1MwX0NPTkZJRwotI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQgTURNQTFfUzBfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZIE1ETUExX1MwX1hfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzBfWV9DT1VOVCBNRE1BMV9TMF9ZX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzBfWV9NT0RJRlkgTURNQTFfUzBfWV9NT0RJRlkKLSNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSIE1ETUExX1MwX0NVUlJfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIgTURNQTFfUzBfQ1VSUl9BRERSCi0jZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUyBNRE1BMV9TMF9JUlFfU1RBVFVTCi0jZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAgTURNQTFfUzBfUEVSSVBIRVJBTF9NQVAKLSNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQgTURNQTFfUzBfQ1VSUl9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9ZX0NPVU5UIE1ETUExX1MwX0NVUlJfWV9DT1VOVAotCi0jZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUiBNRE1BMV9EMV9ORVhUX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUiBNRE1BMV9EMV9TVEFSVF9BRERSCi0jZGVmaW5lIE1ETUFfRDFfQ09ORklHIE1ETUExX0QxX0NPTkZJRwotI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQgTURNQTFfRDFfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QxX1hfTU9ESUZZIE1ETUExX0QxX1hfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDFfWV9DT1VOVCBNRE1BMV9EMV9ZX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDFfWV9NT0RJRlkgTURNQTFfRDFfWV9NT0RJRlkKLSNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSIE1ETUExX0QxX0NVUlJfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9EMV9DVVJSX0FERFIgTURNQTFfRDFfQ1VSUl9BRERSCi0jZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUyBNRE1BMV9EMV9JUlFfU1RBVFVTCi0jZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAgTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAKLSNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQgTURNQTFfRDFfQ1VSUl9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UIE1ETUExX0QxX0NVUlJfWV9DT1VOVAotCi0jZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUiBNRE1BMV9TMV9ORVhUX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUiBNRE1BMV9TMV9TVEFSVF9BRERSCi0jZGVmaW5lIE1ETUFfUzFfQ09ORklHIE1ETUExX1MxX0NPTkZJRwotI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQgTURNQTFfUzFfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZIE1ETUExX1MxX1hfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzFfWV9DT1VOVCBNRE1BMV9TMV9ZX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzFfWV9NT0RJRlkgTURNQTFfUzFfWV9NT0RJRlkKLSNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSIE1ETUExX1MxX0NVUlJfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIgTURNQTFfUzFfQ1VSUl9BRERSCi0jZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUyBNRE1BMV9TMV9JUlFfU1RBVFVTCi0jZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAgTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAKLSNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQgTURNQTFfUzFfQ1VSUl9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9ZX0NPVU5UIE1ETUExX1MxX0NVUlJfWV9DT1VOVAorI2RlZmluZSBNRE1BX1MxX0NPTkZJRyAweEZGQzAwRkM4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MxX05FWFRfREVTQ19QVFIgMHhGRkMwMEZDMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCisjZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUiAweEZGQzAwRkM0CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLworI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQgMHhGRkMwMEZEMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UIDB4RkZDMDBGRDgJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBPdXRlci1Mb29wIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkgMHhGRkMwMEZENAkvKk1lbURNQTIgU3RyZWFtIDEgU3JjIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TMV9ZX01PRElGWSAweEZGQzAwRkRDCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfREVTQ19QVFIgMHhGRkMwMEZFMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSIDB4RkZDMDBGRTQJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQgMHhGRkMwMEZGMAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVCAweEZGQzAwRkY4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUyAweEZGQzAwRkU4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBGRUMJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCByZWdpc3RlciAqLwogCiAvKiBJbnRlcm5hbCBNZW1vcnkgRE1BIFJlZ2lzdGVycyAoMHhGRkMwXzE4MDAgLSAweEZGQzBfMTlGRikgKi8KICNkZWZpbmUgSU1ETUFfRDBfQ09ORklHIDB4RkZDMDE4MDgJLypJTURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uICovCkBAIC05MjcsODMgKzg2NCw2IEBACiAjZGVmaW5lIElXUl9FTkFCTEUoeCkJICAgICAgICgxIDw8ICh4KSkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4ICovCiAjZGVmaW5lIElXUl9ESVNBQkxFKHgpICgweEZGRkZGRkZGIF4gKDEgPDwgKHgpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBVQVJUX0xDUiBSZWdpc3RlciAqLwotCi0jZGVmaW5lIERMQUIJMHg4MAotI2RlZmluZSBTQiAgICAgIDB4NDAKLSNkZWZpbmUgU1RQICAgICAgMHgyMAotI2RlZmluZSBFUFMgICAgIDB4MTAKLSNkZWZpbmUgUEVOCTB4MDgKLSNkZWZpbmUgU1RCCTB4MDQKLSNkZWZpbmUgV0xTKHgpCSgoeC01KSAmIDB4MDMpCi0KLSNkZWZpbmUgRExBQl9QCTB4MDcKLSNkZWZpbmUgU0JfUAkweDA2Ci0jZGVmaW5lIFNUUF9QCTB4MDUKLSNkZWZpbmUgRVBTX1AJMHgwNAotI2RlZmluZSBQRU5fUAkweDAzCi0jZGVmaW5lIFNUQl9QCTB4MDIKLSNkZWZpbmUgV0xTX1AxCTB4MDEKLSNkZWZpbmUgV0xTX1AwCTB4MDAKLQotLyogVUFSVF9NQ1IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE9PUF9FTkEJMHgxMAotI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKLQotLyogVUFSVF9MU1IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVEVNVAkweDQwCi0jZGVmaW5lIFRIUkUJMHgyMAotI2RlZmluZSBCSQkweDEwCi0jZGVmaW5lIEZFCTB4MDgKLSNkZWZpbmUgUEUJMHgwNAotI2RlZmluZSBPRQkweDAyCi0jZGVmaW5lIERSCTB4MDEKLQotI2RlZmluZSBURU1QX1AJMHgwNgotI2RlZmluZSBUSFJFX1AJMHgwNQotI2RlZmluZSBCSV9QCTB4MDQKLSNkZWZpbmUgRkVfUAkweDAzCi0jZGVmaW5lIFBFX1AJMHgwMgotI2RlZmluZSBPRV9QCTB4MDEKLSNkZWZpbmUgRFJfUAkweDAwCi0KLS8qIFVBUlRfSUVSIFJlZ2lzdGVyICovCi0jZGVmaW5lIEVMU0kJMHgwNAotI2RlZmluZSBFVEJFSQkweDAyCi0jZGVmaW5lIEVSQkZJCTB4MDEKLQotI2RlZmluZSBFTFNJX1AJMHgwMgotI2RlZmluZSBFVEJFSV9QCTB4MDEKLSNkZWZpbmUgRVJCRklfUAkweDAwCi0KLS8qIFVBUlRfSUlSIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNUQVRVUyh4KQkoKHggPDwgMSkgJiAweDA2KQotI2RlZmluZSBOSU5UCQkweDAxCi0jZGVmaW5lIFNUQVRVU19QMQkweDAyCi0jZGVmaW5lIFNUQVRVU19QMAkweDAxCi0jZGVmaW5lIE5JTlRfUAkJMHgwMAotI2RlZmluZSBJSVJfVFhfUkVBRFkgICAgMHgwMgkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfTElORV9DSEFOR0UgMHgwNgkvKiBSZWNlaXZlIGxpbmUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfU1RBVFVTCTB4MDYKLQotLyogVUFSVF9HQ1RMIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZGRQkweDIwCi0jZGVmaW5lIEZQRQkweDEwCi0jZGVmaW5lIFJQT0xDCTB4MDgKLSNkZWZpbmUgVFBPTEMJMHgwNAotI2RlZmluZSBJUkVOCTB4MDIKLSNkZWZpbmUgVUNFTgkweDAxCi0KLSNkZWZpbmUgRkZFX1AJMHgwNQotI2RlZmluZSBGUEVfUAkweDA0Ci0jZGVmaW5lIFJQT0xDX1AJMHgwMwotI2RlZmluZSBUUE9MQ19QCTB4MDIKLSNkZWZpbmUgSVJFTl9QCTB4MDEKLSNkZWZpbmUgVUNFTl9QCTB4MDAKLQogLyogICoqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKioqKiAgICovCiAKIC8qICBQUElfQ09OVFJPTCBNYXNrcyAgICAgICAgICovCkBAIC0xMjMwLDQ0ICsxMDkwLDYgQEAKICNkZWZpbmUgRVJSX1RZUF9QMAkJMHgwRQogI2RlZmluZSBFUlJfVFlQX1AxCQkweDBGCiAKLS8qLyAqKioqKioqKioqKioqKioqKiogICBQUk9HUkFNTUFCTEUgRkxBRyBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qICBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAgTWFza3MgKi8KLSNkZWZpbmUgUEYwICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFBGMSAgICAgICAgIDB4MDAwMgotI2RlZmluZSBQRjIgICAgICAgICAweDAwMDQKLSNkZWZpbmUgUEYzICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIFBGNCAgICAgICAgIDB4MDAxMAotI2RlZmluZSBQRjUgICAgICAgICAweDAwMjAKLSNkZWZpbmUgUEY2ICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIFBGNyAgICAgICAgIDB4MDA4MAotI2RlZmluZSBQRjggICAgICAgICAweDAxMDAKLSNkZWZpbmUgUEY5ICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFBGMTAgICAgICAgIDB4MDQwMAotI2RlZmluZSBQRjExICAgICAgICAweDA4MDAKLSNkZWZpbmUgUEYxMiAgICAgICAgMHgxMDAwCi0jZGVmaW5lIFBGMTMgICAgICAgIDB4MjAwMAotI2RlZmluZSBQRjE0ICAgICAgICAweDQwMDAKLSNkZWZpbmUgUEYxNSAgICAgICAgMHg4MDAwCi0KLS8qICBHZW5lcmFsIFB1cnBvc2UgSU8gKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAgQklUIFBPU0lUSU9OUyAqLwotI2RlZmluZSBQRjBfUCAgICAgICAgIDAKLSNkZWZpbmUgUEYxX1AgICAgICAgICAxCi0jZGVmaW5lIFBGMl9QICAgICAgICAgMgotI2RlZmluZSBQRjNfUCAgICAgICAgIDMKLSNkZWZpbmUgUEY0X1AgICAgICAgICA0Ci0jZGVmaW5lIFBGNV9QICAgICAgICAgNQotI2RlZmluZSBQRjZfUCAgICAgICAgIDYKLSNkZWZpbmUgUEY3X1AgICAgICAgICA3Ci0jZGVmaW5lIFBGOF9QICAgICAgICAgOAotI2RlZmluZSBQRjlfUCAgICAgICAgIDkKLSNkZWZpbmUgUEYxMF9QICAgICAgICAxMAotI2RlZmluZSBQRjExX1AgICAgICAgIDExCi0jZGVmaW5lIFBGMTJfUCAgICAgICAgMTIKLSNkZWZpbmUgUEYxM19QICAgICAgICAxMwotI2RlZmluZSBQRjE0X1AgICAgICAgIDE0Ci0jZGVmaW5lIFBGMTVfUCAgICAgICAgMTUKLQogLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKiogKi8KIAogLyogQU1HQ1RMIE1hc2tzICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IDRmOGFhNWQuLjU3ZDVlYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC02Miw0ICs2Miw2IEBACiAjZGVmaW5lIFBPUlRfRklPMSBHUElPXzE2CiAjZGVmaW5lIFBPUlRfRklPMiBHUElPXzMyCiAKKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1mLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IDViOTZlYTUuLjRjYzkxOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC0xMDYsNyArMTA2LDcgQEAKICNkZWZpbmUgQ09SRUFfTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQJMHhGRjcwMDAwMAogCi0jaWZkZWYgX19BU1NFTUJMWV9fCisjaWZkZWYgQ09ORklHX1NNUAogCiAvKgogICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYm90aCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIFBEQSBmb3IgdGhlCkBAIC0xMjEsOCArMTIxLDcgQEAKICAqIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgRHJlZyBmb3IgZGV0ZXJtaW5pbmcgdGhlIFBEQQogICogYWRkcmVzcyB0byBiZSByZXR1cm5lZCBpbnRvIFByZWcuCiAgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorIyBkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCiAJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAogCXByZWcuaCA9IGhpKERTUElEKTsJCVwKIAlwcmVnID0gW3ByZWddOwkJCVwKQEAgLTE1OCw3ICsxNTcsNyBAQAogCXByZWcgPSBbcHJlZ107CQkJXAogNDoKIAotI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCQlcCisjIGRlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCQlcCiAJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAogCXByZWcuaCA9IGhpKERTUElEKTsJCVwKIAlkcmVnID0gW3ByZWddOwkJCVwKQEAgLTE2OSwxMyArMTY4LDE3IEBACiAJcHJlZyA9IFtwcmVnXTsJCQlcCiAxOgkJCQkJXAogCi0jZGVmaW5lIEdFVF9DUFVJRChwcmVnLCBkcmVnKQkJXAorIyBkZWZpbmUgR0VUX0NQVUlEKHByZWcsIGRyZWcpCQlcCiAJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAogCXByZWcuaCA9IGhpKERTUElEKTsJCVwKIAlkcmVnID0gW3ByZWddOwkJCVwKIAlkcmVnID0gUk9UIGRyZWcgQlkgLTE7CQlcCiAJZHJlZyA9IENDOwogCisjIGlmbmRlZiBfX0FTU0VNQkxZX18KKworIyAgaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2wxX3NjcmF0Y2hfc3RhcnRfY3B1KGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdSA/IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQgOiBDT1JFQV9MMV9TQ1JBVENIX1NUQVJUOwpAQCAtMjEwLDggKzIxMyw3IEBACiAJcmV0dXJuIGdldF9sMV9kYXRhX2Jfc3RhcnRfY3B1KGJsYWNrZmluX2NvcmVfaWQoKSk7CiB9CiAKKyMgZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9wbGwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcGxsLmgKaW5kZXggZjJiMWZiZC4uNzk3N2RiMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9wbGwuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3BsbC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDU3ICs3LDQ4IEBACiAjaWZuZGVmIF9NQUNIX1BMTF9ICiAjZGVmaW5lIF9NQUNIX1BMTF9ICiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBDT05GSUdfU01QCisKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KKyNpbmNsdWRlIDxtYWNoL2lycS5oPgogCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCisjZGVmaW5lIFNVUFBMRV8wX1dBS0VVUCAoKElSUV9TVVBQTEVfMCAtIChJUlFfQ09SRVRNUiArIDEpKSAlIDMyKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmaW5faXdyX3Jlc3RvcmUodW5zaWduZWQgbG9uZyBpd3IwLCB1bnNpZ25lZCBsb25nIGl3cjEsIHVuc2lnbmVkIGxvbmcgaXdyMikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCXVuc2lnbmVkIGxvbmcgU0lDQV9TSUNCX09GRiA9ICgoYmZpbl9yZWFkX0RTUElEKCkgJiAweGZmKSA/IDB4MTAwMCA6IDApOwogCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47CisJYmZpbl93cml0ZTMyKFNJQ19JV1IwICsgU0lDQV9TSUNCX09GRiwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxICsgU0lDQV9TSUNCX09GRiwgaXdyMSk7Cit9CisjZGVmaW5lIGJmaW5faXdyX3Jlc3RvcmUgYmZpbl9pd3JfcmVzdG9yZQogCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ0FfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ0FfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIDApOworc3RhdGljIGlubGluZSB2b2lkCitiZmluX2l3cl9zYXZlKHVuc2lnbmVkIGxvbmcgbml3cjAsIHVuc2lnbmVkIGxvbmcgbml3cjEsIHVuc2lnbmVkIGxvbmcgbml3cjIsCisgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKml3cjAsIHVuc2lnbmVkIGxvbmcgKml3cjEsIHVuc2lnbmVkIGxvbmcgKml3cjIpCit7CisJdW5zaWduZWQgbG9uZyBTSUNBX1NJQ0JfT0ZGID0gKChiZmluX3JlYWRfRFNQSUQoKSAmIDB4ZmYpID8gMHgxMDAwIDogMCk7CiAKLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKKwkqaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwICsgU0lDQV9TSUNCX09GRik7CisJKml3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSArIFNJQ0FfU0lDQl9PRkYpOworCWJmaW5faXdyX3Jlc3RvcmUobml3cjAsIG5pd3IxLCBuaXdyMik7Cit9CisjZGVmaW5lIGJmaW5faXdyX3NhdmUgYmZpbl9pd3Jfc2F2ZQogCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CitzdGF0aWMgaW5saW5lIHZvaWQKK2JmaW5faXdyX3NldF9zdXAwKHVuc2lnbmVkIGxvbmcgKml3cjAsIHVuc2lnbmVkIGxvbmcgKml3cjEsIHVuc2lnbmVkIGxvbmcgKml3cjIpCit7CisJYmZpbl9pd3Jfc2F2ZSgwLCBJV1JfRU5BQkxFKFNVUFBMRV8wX1dBS0VVUCksIDAsIGl3cjAsIGl3cjEsIGl3cjIpOwogfQogCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisjZW5kaWYKIAotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47CisjZW5kaWYKIAotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KIAotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCBpd3IxKTsKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotI2VuZGlmIC8qIF9NQUNIX1BMTF9IICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvc21wLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oCmluZGV4IDJjOGM1MTQuLjM0NmM2MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvc21wLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaApAQCAtNyw2ICs3LDggQEAKICNpZm5kZWYgX01BQ0hfQkY1NjFfU01QCiAjZGVmaW5lIF9NQUNIX0JGNTYxX1NNUAogCisvKiBUaGlzIGhlYWRlciBoYXMgdG8gc3RhbmQgYWxvbmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwcyAqLworCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKIHZvaWQgcGxhdGZvcm1faW5pdF9jcHVzKHZvaWQpOwpAQCAtMTcsMTMgKzE5LDEzIEBACiAKIHZvaWQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSk7CiAKLXZvaWQgcGxhdGZvcm1fcmVxdWVzdF9pcGkoaW50ICgqaGFuZGxlcikoaW50LCB2b2lkICopKTsKK3ZvaWQgcGxhdGZvcm1fcmVxdWVzdF9pcGkoaW50IGlycSwgLyppcnFfaGFuZGxlcl90Ki8gdm9pZCAqaGFuZGxlcik7CiAKLXZvaWQgcGxhdGZvcm1fc2VuZF9pcGkoY3B1bWFza190IGNhbGxtYXApOwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCwgaW50IGlycSk7CiAKLXZvaWQgcGxhdGZvcm1fc2VuZF9pcGlfY3B1KHVuc2lnbmVkIGludCBjcHUpOwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSwgaW50IGlycSk7CiAKLXZvaWQgcGxhdGZvcm1fY2xlYXJfaXBpKHVuc2lnbmVkIGludCBjcHUpOwordm9pZCBwbGF0Zm9ybV9jbGVhcl9pcGkodW5zaWduZWQgaW50IGNwdSwgaW50IGlycSk7CiAKIHZvaWQgYmZpbl9sb2NhbF90aW1lcl9zZXR1cCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCmluZGV4IGY1NDBlZDEuLjEwNzRhN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKQEAgLTg2LDEyICs4NiwxMiBAQAogCiAJc3Bpbl9sb2NrKCZib290X2xvY2spOwogCi0JaWYgKChiZmluX3JlYWRfU0lDX1NZU0NSKCkgJiBDT1JFQl9TUkFNX0lOSVQpID09IDApIHsKKwlpZiAoKGJmaW5fcmVhZF9TWVNDUigpICYgQ09SRUJfU1JBTV9JTklUKSA9PSAwKSB7CiAJCS8qIENvcmVCIGFscmVhZHkgcnVubmluZywgc2VuZGluZyBpcGkgdG8gd2FrZXVwIGl0ICovCiAJCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUsIElSUV9TVVBQTEVfMCk7CiAJfSBlbHNlIHsKIAkJLyogS2ljayBDb3JlQiwgd2hpY2ggc2hvdWxkIHN0YXJ0IGV4ZWN1dGlvbiBmcm9tIENPUkVfU1JBTV9CQVNFLiAqLwotCQliZmluX3dyaXRlX1NJQ19TWVNDUihiZmluX3JlYWRfU0lDX1NZU0NSKCkgJiB+Q09SRUJfU1JBTV9JTklUKTsKKwkJYmZpbl93cml0ZV9TWVNDUihiZmluX3JlYWRfU1lTQ1IoKSAmIH5DT1JFQl9TUkFNX0lOSVQpOwogCQlTU1lOQygpOwogCX0KIApAQCAtMTExLDQxICsxMTEsNDYgQEAKIAkJcGFuaWMoIkNQVSV1OiBwcm9jZXNzb3IgZmFpbGVkIHRvIGJvb3RcbiIsIGNwdSk7CiB9CiAKLXZvaWQgX19pbml0IHBsYXRmb3JtX3JlcXVlc3RfaXBpKGlycV9oYW5kbGVyX3QgaGFuZGxlcikKK3N0YXRpYyBjb25zdCBjaGFyIHN1cHBsZTBbXSA9ICJJUlFfU1VQUExFXzAiOworc3RhdGljIGNvbnN0IGNoYXIgc3VwcGxlMVtdID0gIklSUV9TVVBQTEVfMSI7Cit2b2lkIF9faW5pdCBwbGF0Zm9ybV9yZXF1ZXN0X2lwaShpbnQgaXJxLCB2b2lkICpoYW5kbGVyKQogewogCWludCByZXQ7CisJY29uc3QgY2hhciAqbmFtZSA9IChpcnEgPT0gSVJRX1NVUFBMRV8wKSA/IHN1cHBsZTAgOiBzdXBwbGUxOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoSVJRX1NVUFBMRV8wLCBoYW5kbGVyLCBJUlFGX0RJU0FCTEVELAotCQkJICAiU3VwcGxlbWVudGFsIEludGVycnVwdDAiLCBoYW5kbGVyKTsKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwgbmFtZSwgaGFuZGxlcik7CiAJaWYgKHJldCkKLQkJcGFuaWMoIkNhbm5vdCByZXF1ZXN0IHN1cHBsZW1lbnRhbCBpbnRlcnJ1cHQgMCBmb3IgSVBJIHNlcnZpY2UiKTsKKwkJcGFuaWMoIkNhbm5vdCByZXF1ZXN0ICVzIGZvciBJUEkgc2VydmljZSIsIG5hbWUpOwogfQogCi12b2lkIHBsYXRmb3JtX3NlbmRfaXBpKGNwdW1hc2tfdCBjYWxsbWFwKQordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCwgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OworCWludCBvZmZzZXQgPSAoaXJxID09IElSUV9TVVBQTEVfMCkgPyA2IDogODsKIAogCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY2FsbG1hcCkgewogCQlCVUdfT04oY3B1ID49IDIpOwogCQlTU1lOQygpOwotCQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICg2ICsgY3B1KSkpOworCQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8IChvZmZzZXQgKyBjcHUpKSk7CiAJCVNTWU5DKCk7CiAJfQogfQogCi12b2lkIHBsYXRmb3JtX3NlbmRfaXBpX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSwgaW50IGlycSkKIHsKKwlpbnQgb2Zmc2V0ID0gKGlycSA9PSBJUlFfU1VQUExFXzApID8gNiA6IDg7CiAJQlVHX09OKGNwdSA+PSAyKTsKIAlTU1lOQygpOwotCWJmaW5fd3JpdGVfU0lDQl9TWVNDUihiZmluX3JlYWRfU0lDQl9TWVNDUigpIHwgKDEgPDwgKDYgKyBjcHUpKSk7CisJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAob2Zmc2V0ICsgY3B1KSkpOwogCVNTWU5DKCk7CiB9CiAKLXZvaWQgcGxhdGZvcm1fY2xlYXJfaXBpKHVuc2lnbmVkIGludCBjcHUpCit2b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgaXJxKQogeworCWludCBvZmZzZXQgPSAoaXJxID09IElSUV9TVVBQTEVfMCkgPyAxMCA6IDEyOwogCUJVR19PTihjcHUgPj0gMik7CiAJU1NZTkMoKTsKLQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICgxMCArIGNwdSkpKTsKKwliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8IChvZmZzZXQgKyBjcHUpKSk7CiAJU1NZTkMoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCmluZGV4IDJjYTkxNWUuLmJjMDhjOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKQEAgLTYxNSw3ICs2MTUsNyBAQAogI2lmZGVmIENPTkZJR19JUElQRQogCXIwID0gc3A7CiAJU1AgKz0gLTEyOwotCWNhbGwgX19faXBpcGVfc3lzY2FsbF9yb290OworCXBzZXVkb19sb25nX2NhbGwgX19faXBpcGVfc3lzY2FsbF9yb290LCBwMDsKIAlTUCArPSAxMjsKIAljYyA9IHIwID09IDE7CiAJaWYgY2MganVtcCAuTHN5c2NhbGxfcmVhbGx5X2V4aXQ7CkBAIC02OTIsNyArNjkyLDcgQEAKIAlbLS1zcF0gPSByZXRpOwogCVNQICs9IDQ7IC8qIGRvbid0IG1lcmdlIHdpdGggbmV4dCBpbnNuIHRvIGtlZXAgdGhlIHBhdHRlcm4gb2J2aW91cyAqLwogCVNQICs9IC0xMjsKLQljYWxsIF9fX2lwaXBlX3N5bmNfcm9vdDsKKwlwc2V1ZG9fbG9uZ19jYWxsIF9fX2lwaXBlX3N5bmNfcm9vdCwgcDQ7CiAJU1AgKz0gMTI7CiAJanVtcCAuTHJlc3VtZV91c2Vyc3BhY2VfMTsKIC5Mc3lzY2FsbF9ub19pcnFzeW5jOgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwppbmRleCBkYTdlM2M2Li5hNjA0ZjE5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwpAQCAtODY2LDcgKzg2Niw2IEBACiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7CiAJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAKLQlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKIAlwaW50W2JhbmtdLT5tYXNrX3NldCA9IHBpbnRiaXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwppbmRleCA4MDg4NGIxLi4zYzY0OGEwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCkBAIC0yMyw5ICsyMyw2IEBACiAKIHZvaWQgYmZpbl9wbV9zdXNwZW5kX3N0YW5kYnlfZW50ZXIodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7CiAJYmZpbl9wbV9zdGFuZGJ5X3NldHVwKCk7CiAKICNpZmRlZiBDT05GSUdfUE1fQkZJTl9TTEVFUF9ERUVQRVIKQEAgLTU1LDggKzUyLDYgQEAKICNlbHNlCiAJYmZpbl93cml0ZV9TSUNfSVdSKElXUl9ESVNBQkxFX0FMTCk7CiAjZW5kaWYKLQotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBpbnQgYmY1M3hfc3VzcGVuZF9sMV9tZW0odW5zaWduZWQgY2hhciAqbWVtcHRyKQpAQCAtMTI3LDcgKzEyMiw2IEBACiAKIGludCBiZmluX3BtX3N1c3BlbmRfbWVtX2VudGVyKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgd2FrZXVwLCByZXQ7CiAKIAl1bnNpZ25lZCBjaGFyICptZW1wdHIgPSBrbWFsbG9jKEwxX0NPREVfTEVOR1RIICsgTDFfREFUQV9BX0xFTkdUSApAQCAtMTQ5LDEyICsxNDMsOSBAQAogCXdha2V1cCB8PSBHUFdFOwogI2VuZGlmCiAKLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQogCXJldCA9IGJsYWNrZmluX2RtYV9zdXNwZW5kKCk7CiAKIAlpZiAocmV0KSB7Ci0JCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlrZnJlZShtZW1wdHIpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE3OCw3ICsxNjksNiBAQAogCWJmaW5fZ3Bpb19wbV9oaWJlcm5hdGVfcmVzdG9yZSgpOwogCWJsYWNrZmluX2RtYV9yZXN1bWUoKTsKIAotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCWtmcmVlKG1lbXB0cik7CiAKIAlyZXR1cm4gMDsKQEAgLTIzMyw3ICsyMjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYmZpbl9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGJmaW5fcG1fb3BzID0gewogCS5lbnRlciA9IGJmaW5fcG1fZW50ZXIsCiAJLnZhbGlkCT0gYmZpbl9wbV92YWxpZCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwppbmRleCBhMTcxMDdhLi45ZjI1MTQwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQzLDEyICs0NCw2IEBACiAJKmluaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYiwgKmluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYiwKIAkqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOwogCi1jcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKLUVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7Ci0KLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotCiAjZGVmaW5lIEJGSU5fSVBJX1JFU0NIRURVTEUgICAwCiAjZGVmaW5lIEJGSU5fSVBJX0NBTExfRlVOQyAgICAxCiAjZGVmaW5lIEJGSU5fSVBJX0NQVV9TVE9QICAgICAyCkBAIC02NSw4ICs2MCw3IEBACiAJdm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pOwogCXZvaWQgKmluZm87CiAJaW50IHdhaXQ7Ci0JY3B1bWFza190IHBlbmRpbmc7Ci0JY3B1bWFza190IHdhaXRtYXNrOworCWNwdW1hc2tfdCAqd2FpdG1hc2s7CiB9OwogCiBzdGF0aWMgc3RydWN0IGJsYWNrZmluX2ZsdXNoX2RhdGEgc21wX2ZsdXNoX2RhdGE7CkBAIC03NCwxNSArNjgsMTkgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RvcF9sb2NrKTsKIAogc3RydWN0IGlwaV9tZXNzYWdlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgbG9uZyB0eXBlOwogCXN0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgY2FsbF9zdHJ1Y3Q7CiB9OwogCisvKiBBIG1hZ2ljIG51bWJlciAtIHN0cmVzcyB0ZXN0IHNob3dzIHRoaXMgaXMgc2FmZSBmb3IgY29tbW9uIGNhc2VzICovCisjZGVmaW5lIEJGSU5fSVBJX01TR1FfTEVOIDUKKworLyogU2ltcGxlIEZJRk8gYnVmZmVyLCBvdmVyZmxvdyBsZWFkcyB0byBwYW5pYyAqLwogc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdW5zaWduZWQgbG9uZyBoZWFkOyAvKiBoZWFkIG9mIHRoZSBxdWV1ZSAqLworCXN0cnVjdCBpcGlfbWVzc2FnZSBpcGlfbWVzc2FnZVtCRklOX0lQSV9NU0dRX0xFTl07CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlLCBpcGlfbXNnX3F1ZXVlKTsKQEAgLTEyMSw3ICsxMTksNiBAQAogCWZ1bmMgPSBtc2ctPmNhbGxfc3RydWN0LmZ1bmM7CiAJaW5mbyA9IG1zZy0+Y2FsbF9zdHJ1Y3QuaW5mbzsKIAl3YWl0ID0gbXNnLT5jYWxsX3N0cnVjdC53YWl0OwotCWNwdV9jbGVhcihjcHUsIG1zZy0+Y2FsbF9zdHJ1Y3QucGVuZGluZyk7CiAJZnVuYyhpbmZvKTsKIAlpZiAod2FpdCkgewogI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCkBAIC0xMzIsNTEgKzEyOSw1NyBAQAogCQkgKi8KIAkJcmVzeW5jX2NvcmVfZGNhY2hlKCk7CiAjZW5kaWYKLQkJY3B1X2NsZWFyKGNwdSwgbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayk7Ci0JfSBlbHNlCi0JCWtmcmVlKG1zZyk7CisJCWNwdV9jbGVhcihjcHUsICptc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKTsKKwl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBpcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCisvKiBVc2UgSVJRX1NVUFBMRV8wIHRvIHJlcXVlc3QgcmVzY2hlZHVsZS4KKyAqIFdoZW4gcmV0dXJuaW5nIGZyb20gaW50ZXJydXB0IHRvIHVzZXIgc3BhY2UsCisgKiB0aGVyZSBpcyBjaGFuY2UgdG8gcmVzY2hlZHVsZSAqLworc3RhdGljIGlycXJldHVybl90IGlwaV9oYW5kbGVyX2ludDAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwbGF0Zm9ybV9jbGVhcl9pcGkoY3B1LCBJUlFfU1VQUExFXzApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlwaV9oYW5kbGVyX2ludDEoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewogCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXBsYXRmb3JtX2NsZWFyX2lwaShjcHUpOworCXBsYXRmb3JtX2NsZWFyX2lwaShjcHUsIElSUV9TVVBQTEVfMSk7CiAKIAltc2dfcXVldWUgPSAmX19nZXRfY3B1X3ZhcihpcGlfbXNnX3F1ZXVlKTsKLQltc2dfcXVldWUtPmNvdW50Kys7CiAKLQlzcGluX2xvY2soJm1zZ19xdWV1ZS0+bG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZtc2dfcXVldWUtPmhlYWQpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkobXNnX3F1ZXVlLT5oZWFkLm5leHQsIHR5cGVvZigqbXNnKSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChtc2dfcXVldWUtPmNvdW50KSB7CisJCW1zZyA9ICZtc2dfcXVldWUtPmlwaV9tZXNzYWdlW21zZ19xdWV1ZS0+aGVhZF07CiAJCXN3aXRjaCAobXNnLT50eXBlKSB7Ci0JCWNhc2UgQkZJTl9JUElfUkVTQ0hFRFVMRToKLQkJCS8qIFRoYXQncyB0aGUgZWFzaWVzdCBvbmU7IGxlYXZlIGl0IHRvCi0JCQkgKiByZXR1cm5fZnJvbV9pbnQuICovCi0JCQlrZnJlZShtc2cpOwotCQkJYnJlYWs7CiAJCWNhc2UgQkZJTl9JUElfQ0FMTF9GVU5DOgotCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSwgbXNnKTsKLQkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQljYXNlIEJGSU5fSVBJX0NQVV9TVE9QOgotCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWlwaV9jcHVfc3RvcChjcHUpOwotCQkJc3Bpbl9sb2NrKCZtc2dfcXVldWUtPmxvY2spOwotCQkJa2ZyZWUobXNnKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IFVua25vd24gSVBJIG1lc3NhZ2UgMHglbHhcbiIsCiAJCQkgICAgICAgY3B1LCBtc2ctPnR5cGUpOwotCQkJa2ZyZWUobXNnKTsKIAkJCWJyZWFrOwogCQl9CisJCW1zZ19xdWV1ZS0+aGVhZCsrOworCQltc2dfcXVldWUtPmhlYWQgJT0gQkZJTl9JUElfTVNHUV9MRU47CisJCW1zZ19xdWV1ZS0+Y291bnQtLTsKIAl9Ci0Jc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xODYsNDggKzE4OSw0NyBAQAogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1zZ19xdWV1ZS0+aGVhZCk7CiAJCXNwaW5fbG9ja19pbml0KCZtc2dfcXVldWUtPmxvY2spOwogCQltc2dfcXVldWUtPmNvdW50ID0gMDsKKwkJbXNnX3F1ZXVlLT5oZWFkID0gMDsKIAl9CiB9CiAKLWludCBzbXBfY2FsbF9mdW5jdGlvbih2b2lkICgqZnVuYykodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCB3YWl0KQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9zZW5kX21lc3NhZ2UoY3B1bWFza190IGNhbGxtYXAsIHVuc2lnbmVkIGxvbmcgdHlwZSwKKwkJCQkJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHdhaXQpCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKLQljcHVtYXNrX3QgY2FsbG1hcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwotCi0JY2FsbG1hcCA9IGNwdV9vbmxpbmVfbWFwOwotCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNhbGxtYXApOwotCWlmIChjcHVzX2VtcHR5KGNhbGxtYXApKQotCQlyZXR1cm4gMDsKLQotCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKLQltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOwotCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7Ci0JbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKLQltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKLQltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbmV4dF9tc2c7CisJY3B1bWFza190IHdhaXRtYXNrID0gY2FsbG1hcDsgLyogd2FpdG1hc2sgaXMgc2hhcmVkIGJ5IGFsbCBjcHVzICovCiAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKIAkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCQlpZiAobXNnX3F1ZXVlLT5jb3VudCA8IEJGSU5fSVBJX01TR1FfTEVOKSB7CisJCQluZXh0X21zZyA9IChtc2dfcXVldWUtPmhlYWQgKyBtc2dfcXVldWUtPmNvdW50KQorCQkJCQklIEJGSU5fSVBJX01TR1FfTEVOOworCQkJbXNnID0gJm1zZ19xdWV1ZS0+aXBpX21lc3NhZ2VbbmV4dF9tc2ddOworCQkJbXNnLT50eXBlID0gdHlwZTsKKwkJCWlmICh0eXBlID09IEJGSU5fSVBJX0NBTExfRlVOQykgeworCQkJCW1zZy0+Y2FsbF9zdHJ1Y3QuZnVuYyA9IGZ1bmM7CisJCQkJbXNnLT5jYWxsX3N0cnVjdC5pbmZvID0gaW5mbzsKKwkJCQltc2ctPmNhbGxfc3RydWN0LndhaXQgPSB3YWl0OworCQkJCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2sgPSAmd2FpdG1hc2s7CisJCQl9CisJCQltc2dfcXVldWUtPmNvdW50Kys7CisJCX0gZWxzZQorCQkJcGFuaWMoIklQSSBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93XG4iKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7Ci0JCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1LCBJUlFfU1VQUExFXzEpOwogCX0KKwogCWlmICh3YWl0KSB7Ci0JCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKKwkJd2hpbGUgKCFjcHVzX2VtcHR5KHdhaXRtYXNrKSkKIAkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAotCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7CisJCQkJKHVuc2lnbmVkIGxvbmcpKCZ3YWl0bWFzayksCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZ3YWl0bWFzaykpOwogI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCiAJCS8qCiAJCSAqIEludmFsaWRhdGUgRCBjYWNoZSBpbiBjYXNlIHNoYXJlZCBkYXRhIHdhcyBjaGFuZ2VkIGJ5CkBAIC0yMzUsOCArMjM3LDIwIEBACiAJCSAqLwogCQlyZXN5bmNfY29yZV9kY2FjaGUoKTsKICNlbmRpZgotCQlrZnJlZShtc2cpOwogCX0KK30KKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uKHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHdhaXQpCit7CisJY3B1bWFza190IGNhbGxtYXA7CisKKwljYWxsbWFwID0gY3B1X29ubGluZV9tYXA7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY2FsbG1hcCk7CisJaWYgKGNwdXNfZW1wdHkoY2FsbG1hcCkpCisJCXJldHVybiAwOworCisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DQUxMX0ZVTkMsIGZ1bmMsIGluZm8sIHdhaXQpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbik7CkBAIC0yNDYsMTAwICsyNjAsMzkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gY3B1aWQ7CiAJY3B1bWFza190IGNhbGxtYXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKIAogCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKQogCQlyZXR1cm4gMDsKIAljcHVzX2NsZWFyKGNhbGxtYXApOwogCWNwdV9zZXQoY3B1LCBjYWxsbWFwKTsKIAotCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKLQltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOwotCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7Ci0JbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKLQltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKLQltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DQUxMX0ZVTkMsIGZ1bmMsIGluZm8sIHdhaXQpOwogCi0JbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKLQotCWlmICh3YWl0KSB7Ci0JCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKLQkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAotCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7Ci0jaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKLQkJLyoKLQkJICogSW52YWxpZGF0ZSBEIGNhY2hlIGluIGNhc2Ugc2hhcmVkIGRhdGEgd2FzIGNoYW5nZWQgYnkKLQkJICogb3RoZXIgcHJvY2Vzc29ycyB0byBlbnN1cmUgY2FjaGUgY29oZXJlbmNlLgotCQkgKi8KLQkJcmVzeW5jX2NvcmVfZGNhY2hlKCk7Ci0jZW5kaWYKLQkJa2ZyZWUobXNnKTsKLQl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwotCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwotCisJLyogc2ltcGx5IHRyaWdnZXIgYW4gaXBpICovCiAJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCXJldHVybjsKLQotCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuOwotCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOwotCW1zZy0+dHlwZSA9IEJGSU5fSVBJX1JFU0NIRURVTEU7Ci0KLQltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUsIElSUV9TVVBQTEVfMCk7CiAKIAlyZXR1cm47CiB9CiAKIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjcHU7CiAJY3B1bWFza190IGNhbGxtYXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKIAogCWNhbGxtYXAgPSBjcHVfb25saW5lX21hcDsKIAljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjYWxsbWFwKTsKIAlpZiAoY3B1c19lbXB0eShjYWxsbWFwKSkKIAkJcmV0dXJuOwogCi0JbXNnID0ga3phbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOwotCWlmICghbXNnKQotCQlyZXR1cm47Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT50eXBlID0gQkZJTl9JUElfQ1BVX1NUT1A7CisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DUFVfU1RPUCwgTlVMTCwgTlVMTCwgMCk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKLQkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQkJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7Ci0JfQogCXJldHVybjsKIH0KIApAQCAtNDQ2LDcgKzM5OSw4IEBACiB7CiAJcGxhdGZvcm1fcHJlcGFyZV9jcHVzKG1heF9jcHVzKTsKIAlpcGlfcXVldWVfaW5pdCgpOwotCXBsYXRmb3JtX3JlcXVlc3RfaXBpKCZpcGlfaGFuZGxlcik7CisJcGxhdGZvcm1fcmVxdWVzdF9pcGkoSVJRX1NVUFBMRV8wLCBpcGlfaGFuZGxlcl9pbnQwKTsKKwlwbGF0Zm9ybV9yZXF1ZXN0X2lwaShJUlFfU1VQUExFXzEsIGlwaV9oYW5kbGVyX2ludDEpOwogfQogCiB2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKaW5kZXggNjI3ZTA0Yi4uZGZkMzA0YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKQEAgLTcwNCwxOCArNzA0LDE4IEBACiB7CiAJc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKmxzbCwgKip0bXA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlpbnQgcmV0ID0gLTE7CiAKIAlmb3IgKHRtcCA9ICZtbS0+Y29udGV4dC5zcmFtX2xpc3Q7ICp0bXA7IHRtcCA9ICYoKnRtcCktPm5leHQpCi0JCWlmICgoKnRtcCktPmFkZHIgPT0gYWRkcikKLQkJCWdvdG8gZm91bmQ7Ci0JcmV0dXJuIC0xOwotZm91bmQ6Ci0JbHNsID0gKnRtcDsKLQlzcmFtX2ZyZWUoYWRkcik7Ci0JKnRtcCA9IGxzbC0+bmV4dDsKLQlrZnJlZShsc2wpOworCQlpZiAoKCp0bXApLT5hZGRyID09IGFkZHIpIHsKKwkJCWxzbCA9ICp0bXA7CisJCQlyZXQgPSBzcmFtX2ZyZWUoYWRkcik7CisJCQkqdG1wID0gbHNsLT5uZXh0OworCQkJa2ZyZWUobHNsKTsKKwkJCWJyZWFrOworCQl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChzcmFtX2ZyZWVfd2l0aF9sc2wpOwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL25hbmRfaW5pdC5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9uYW5kX2luaXQuUwppbmRleCBlNzA1ZjVjLi5kNjcxZmVkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL25hbmRfaW5pdC5TCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvbmFuZF9pbml0LlMKQEAgLTEzOSw3ICsxMzksNyBAQAogCWxzcnEJOCwgJHI0CiAJbW92ZS5iCSRyNCwgWyRyMV0JOyBSb3cgYWRkcmVzcwogCWxzcnEJOCwgJHI0Ci0JbW92ZS5iCSRyNCwgWyRyMV0JOyBSb3cgYWRkZHJlc3MKKwltb3ZlLmIJJHI0LCBbJHIxXQk7IFJvdyBhZGRyZXNzCiAJbW92ZXEJMjAsICRyNAogMjoJYm5lCTJiCiAJc3VicQkxLCAkcjQKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9ldHJheGdwaW8uaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9ldHJheGdwaW8uaAppbmRleCBkNDc0ODE4Li40NjFjMDg5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vZXRyYXhncGlvLmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2V0cmF4Z3Bpby5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFRoZSBmb2xsb3dpbmcgZGV2aWNlcyBhcmUgYWNjZXNzYWJsZSB1c2luZyB0aGlzIGRyaXZlciB1c2luZworICogVGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBhY2Nlc3NpYmxlIHVzaW5nIHRoaXMgZHJpdmVyIHVzaW5nCiAgKiBHUElPX01BSk9SICgxMjApIGFuZCBhIGNvdXBsZSBvZiBtaW5vciBudW1iZXJzLgogICoKICAqIEZvciBFVFJBWCAxMDBMWCAoQ09ORklHX0VUUkFYX0FSQ0hfVjEwKToKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKaW5kZXggYjUwOTY0My4uNGU3MzA5MiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAkJQ01PU19XUklURShyZWFsX3NlY29uZHMsUlRDX1NFQ09ORFMpOwogCQlDTU9TX1dSSVRFKHJlYWxfbWludXRlcyxSVENfTUlOVVRFUyk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORworCQlwcmludGtfb25jZShLRVJOX05PVElDRQogCQkgICAgICAgInNldF9ydGNfbW1zczogY2FuJ3QgdXBkYXRlIGZyb20gJWQgdG8gJWRcbiIsCiAJCSAgICAgICBjbW9zX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7CiAJCXJldHZhbCA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnLmRlYnVnIGIvYXJjaC9oODMwMC9LY29uZmlnLmRlYnVnCmluZGV4IGVlNjcxYzMuLmU4ZDFiMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcuZGVidWcKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkgIGJ1aWx0aW4ga2VybmVsIGNvbW1hbmRsaW5lIGVuYWJsZWQuCiAKIGNvbmZpZyBLRVJORUxfQ09NTUFORAotCXN0cmluZyAiQnVpbGRpbiBjb21tbWFuZCBzdHJpbmciCisJc3RyaW5nICJCdWlsZGluIGNvbW1hbmQgc3RyaW5nIgogCWRlcGVuZHMgb24gREVGQVVMVF9DTURMSU5FCiAJaGVscAogCSAgYnVpbHRpbiBrZXJuZWwgY29tbWFuZGxpbmUgc3RyaW5ncy4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggY2M4MzM1ZS4uZTVhNmMzNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2lvLmgKQEAgLTQyNiw2ICs0MjYsMTEgQEAKIGV4dGVybiB2b2lkIGlvdW5tYXAgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiBleHRlcm4gdm9pZCBfX2lvbWVtICogZWFybHlfaW9yZW1hcCAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBlYXJseV9pb3VubWFwICh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqIGlvcmVtYXBfY2FjaGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIGlvcmVtYXAocGh5c19hZGRyLCBzaXplKTsKK30KKwogCiAvKgogICogU3RyaW5nIHZlcnNpb24gb2YgSU8gbWVtb3J5IGFjY2VzcyBvcHM6CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDJmMjI5ZTUuLjI2ODllZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC01OTAsNiArNTkwLDEwIEBACiBpbnQga3ZtX3BhbF9lbXVsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pOwogdm9pZCBrdm1fc2FsX2VtdWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAorI2RlZmluZSBfX0tWTV9IQVZFX0FSQ0hfVk1fQUxMT0MgMQorc3RydWN0IGt2bSAqa3ZtX2FyY2hfYWxsb2Nfdm0odm9pZCk7Cit2b2lkIGt2bV9hcmNoX2ZyZWVfdm0oc3RydWN0IGt2bSAqa3ZtKTsKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggNDFiNmQzMS4uOTYxYTE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xODksNiArMTg5LDcgQEAKICMgZGVmaW5lIHBncHJvdF92YWwoeCkJKCh4KS5wZ3Byb3QpCiAKICMgZGVmaW5lIF9fcHRlKHgpCSgocHRlX3QpIHsgKHgpIH0gKQorIyBkZWZpbmUgX19wbWQoeCkJKChwbWRfdCkgeyAoeCkgfSApCiAjIGRlZmluZSBfX3BncHJvdCh4KQkoKHBncHJvdF90KSB7ICh4KSB9ICkKIAogI2Vsc2UgLyogIVNUUklDVF9NTV9UWVBFQ0hFQ0tTICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggMzQ4ZTQ0ZC4uMDNhZmU3OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNzE3LDggKzcxNyw5IEBACiAjZGVmaW5lIHNwaW5fbG9ja19wcmVmZXRjaCh4KQlwcmVmZXRjaHcoeCkKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlkbGVfaGFsdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlkbGVfbm9td2FpdDsKKworZW51bSBpZGxlX2Jvb3Rfb3ZlcnJpZGUge0lETEVfTk9fT1ZFUlJJREU9MCwgSURMRV9IQUxULCBJRExFX0ZPUkNFX01XQUlULAorCQkJIElETEVfTk9NV0FJVCwgSURMRV9QT0xMfTsKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCBjNmM5MGYzLi45MGViY2ViIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNDc3LDYgKzQ3NywxMiBAQAogCWlmICghKHBhLT5mbGFncyAmIEFDUElfU1JBVF9DUFVfRU5BQkxFRCkpCiAJCXJldHVybjsKIAorCWlmIChzcmF0X251bV9jcHVzID49IEFSUkFZX1NJWkUobm9kZV9jcHVpZCkpIHsKKwkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HCisJCQkgICAgIm5vZGVfY3B1aWRbJWxkXSBpcyB0b28gc21hbGwsIG1heSBub3QgYmUgYWJsZSB0byB1c2UgYWxsIGNwdXNcbiIsCisJCQkgICAgQVJSQVlfU0laRShub2RlX2NwdWlkKSk7CisJCXJldHVybjsKKwl9CiAJcHhtID0gZ2V0X3Byb2Nlc3Nvcl9wcm94aW1pdHlfZG9tYWluKHBhKTsKIAogCS8qIHJlY29yZCB0aGlzIG5vZGUgaW4gcHJveGltaXR5IGJpdG1hcCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDlhMjYwMTUuLjM4YzA3YjggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTYzMyw3ICs2MzMsNyBAQAogCUJVR19PTihiaW5kX2lycV92ZWN0b3IoaXJxLCB2ZWMsIENQVV9NQVNLX0FMTCkpOwogCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAlkZXNjLT5zdGF0dXMgfD0gSVJRX1BFUl9DUFU7Ci0JZGVzYy0+Y2hpcCA9ICZpcnFfdHlwZV9pYTY0X2xzYXBpYzsKKwlzZXRfaXJxX2NoaXAoaXJxLCAmaXJxX3R5cGVfaWE2NF9sc2FwaWMpOwogCWlmIChhY3Rpb24pCiAJCXNldHVwX2lycShpcnEsIGFjdGlvbik7CiAJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX3BlcmNwdV9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwppbmRleCBmMDk5YjgyLi44OWFjY2M2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYwpAQCAtNjE3LDExICs2MTcsMTQgQEAKIAlyZXR1cm4gZ2V0X3VubWFwcGVkX2FyZWEoZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOwogfQogCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHBmbWZzX2RlbnRyeV9vcGVyYXRpb25zOwogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqCiBwZm1mc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gbW91bnRfcHNldWRvKGZzX3R5cGUsICJwZm06IiwgTlVMTCwgUEZNRlNfTUFHSUMpOworCXJldHVybiBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgInBmbToiLCBOVUxMLCAmcGZtZnNfZGVudHJ5X29wZXJhdGlvbnMsCisJCQlQRk1GU19NQUdJQyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBwZm1fZnNfdHlwZSA9IHsKQEAgLTgyOSwxMCArODMyLDkgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQltZW0gID0gdm1hbGxvYyhzaXplKTsKKwltZW0gID0gdnphbGxvYyhzaXplKTsKIAlpZiAobWVtKSB7CiAJCS8vcHJpbnRrKCJwZXJmbW9uOiBDUFUlZCBwZm1fcnZtYWxsb2MoJWxkKT0lcFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaXplLCBtZW0pOwotCQltZW1zZXQobWVtLCAwLCBzaXplKTsKIAkJYWRkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKIAkJd2hpbGUgKHNpemUgPiAwKSB7CiAJCQlwZm1fcmVzZXJ2ZV9wYWdlKGFkZHIpOwpAQCAtMjIzMyw3ICsyMjM1LDYgQEAKIAl9CiAJcGF0aC5tbnQgPSBtbnRnZXQocGZtZnNfbW50KTsKIAotCWRfc2V0X2Rfb3AocGF0aC5kZW50cnksICZwZm1mc19kZW50cnlfb3BlcmF0aW9ucyk7CiAJZF9hZGQocGF0aC5kZW50cnksIGlub2RlKTsKIAogCWZpbGUgPSBhbGxvY19maWxlKCZwYXRoLCBGTU9ERV9SRUFELCAmcGZtX2ZpbGVfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMTZmMWM3Yi4uNmQzM2M1YyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTUzLDEyICs1Myw4IEBACiAKIHZvaWQgKCppYTY0X21hcmtfaWRsZSkoaW50KTsKIAotdW5zaWduZWQgbG9uZyBib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gMDsKK3Vuc2lnbmVkIGxvbmcgYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfTk9fT1ZFUlJJREU7CiBFWFBPUlRfU1lNQk9MKGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUpOwotdW5zaWduZWQgbG9uZyBpZGxlX2hhbHQ7Ci1FWFBPUlRfU1lNQk9MKGlkbGVfaGFsdCk7Ci11bnNpZ25lZCBsb25nIGlkbGVfbm9td2FpdDsKLUVYUE9SVF9TWU1CT0woaWRsZV9ub213YWl0KTsKIHZvaWQgKCpwbV9pZGxlKSAodm9pZCk7CiBFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOwogdm9pZCAoKnBtX3Bvd2VyX29mZikgKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKaW5kZXggZGFiZWVmZTIuLmJlNDUwYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwpAQCAtMjkzLDYgKzI5Myw3IEBACiB2b2lkCiBzbXBfZmx1c2hfdGxiX21tIChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwljcHVtYXNrX3Zhcl90IGNwdXM7CiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJLyogdGhpcyBoYXBwZW5zIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgYSBzaW5nbGUtdGhyZWFkZWQgZm9yaygpOiAgKi8KIAlpZiAobGlrZWx5KG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSAmJiBhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA9PSAxKSkKQEAgLTMwMSw5ICszMDIsMTUgQEAKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuOwogCX0KLQotCXNtcF9jYWxsX2Z1bmN0aW9uX21hbnkobW1fY3B1bWFzayhtbSksCi0JCSh2b2lkICgqKSh2b2lkICopKWxvY2FsX2ZpbmlzaF9mbHVzaF90bGJfbW0sIG1tLCAxKTsKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZjcHVzLCBHRlBfQVRPTUlDKSkgeworCQlzbXBfY2FsbF9mdW5jdGlvbigodm9pZCAoKikodm9pZCAqKSlsb2NhbF9maW5pc2hfZmx1c2hfdGxiX21tLAorCQkJbW0sIDEpOworCX0gZWxzZSB7CisJCWNwdW1hc2tfY29weShjcHVzLCBtbV9jcHVtYXNrKG1tKSk7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX21hbnkoY3B1cywKKwkJCSh2b2lkICgqKSh2b2lkICopKWxvY2FsX2ZpbmlzaF9mbHVzaF90bGJfbW0sIG1tLCAxKTsKKwkJZnJlZV9jcHVtYXNrX3ZhcihjcHVzKTsKKwl9CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlsb2NhbF9maW5pc2hfZmx1c2hfdGxiX21tKG1tKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IGVkNmYyMmUuLjk3MDJmYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5ld19pdG07CiAKLQlpZiAodW5saWtlbHkoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpIHsKKwlpZiAoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkgewogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKaW5kZXggZjU2YTYzMS4uNzBkMjI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYwpAQCAtNzQ5LDcgKzc0OSw3IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3ZtICprdm1fYWxsb2Nfa3ZtKHZvaWQpCitzdHJ1Y3Qga3ZtICprdm1fYXJjaF9hbGxvY192bSh2b2lkKQogewogCiAJc3RydWN0IGt2bSAqa3ZtOwpAQCAtNzYwLDcgKzc2MCw3IEBACiAJdm1fYmFzZSA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKEtWTV9WTV9EQVRBX1NJWkUpKTsKIAogCWlmICghdm1fYmFzZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiBOVUxMOwogCiAJbWVtc2V0KCh2b2lkICopdm1fYmFzZSwgMCwgS1ZNX1ZNX0RBVEFfU0laRSk7CiAJa3ZtID0gKHN0cnVjdCBrdm0gKikodm1fYmFzZSArCkBAIC04MDYsMTAgKzgwNiwxMiBAQAogI2RlZmluZSBHVUVTVF9QSFlTSUNBTF9SUjQJMHgyNzM5CiAjZGVmaW5lIFZNTV9JTklUX1JSCQkweDE2NjAKIAotc3RhdGljIHZvaWQga3ZtX2luaXRfdm0oc3RydWN0IGt2bSAqa3ZtKQoraW50IGt2bV9hcmNoX2luaXRfdm0oc3RydWN0IGt2bSAqa3ZtKQogewogCUJVR19PTigha3ZtKTsKIAorCWt2bS0+YXJjaC5pc19zbjIgPSBpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKTsKKwogCWt2bS0+YXJjaC5tZXRhcGh5c2ljYWxfcnIwID0gR1VFU1RfUEhZU0lDQUxfUlIwOwogCWt2bS0+YXJjaC5tZXRhcGh5c2ljYWxfcnI0ID0gR1VFU1RfUEhZU0lDQUxfUlI0OwogCWt2bS0+YXJjaC52bW1faW5pdF9yciA9IFZNTV9JTklUX1JSOwpAQCAtODIzLDIxICs4MjUsOCBAQAogCiAJLyogUmVzZXJ2ZSBiaXQgMCBvZiBpcnFfc291cmNlc19iaXRtYXAgZm9yIHVzZXJzcGFjZSBpcnEgc291cmNlICovCiAJc2V0X2JpdChLVk1fVVNFUlNQQUNFX0lSUV9TT1VSQ0VfSUQsICZrdm0tPmFyY2guaXJxX3NvdXJjZXNfYml0bWFwKTsKLX0KIAotc3RydWN0ICBrdm0gKmt2bV9hcmNoX2NyZWF0ZV92bSh2b2lkKQotewotCXN0cnVjdCBrdm0gKmt2bSA9IGt2bV9hbGxvY19rdm0oKTsKLQotCWlmIChJU19FUlIoa3ZtKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlrdm0tPmFyY2guaXNfc24yID0gaWE2NF9wbGF0Zm9ybV9pcygic24yIik7Ci0KLQlrdm1faW5pdF92bShrdm0pOwotCi0JcmV0dXJuIGt2bTsKLQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9nZXRfaXJxY2hpcChzdHJ1Y3Qga3ZtICprdm0sCkBAIC05NjIsNyArOTUxLDkgQEAKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX3NldHVwX2RlZmF1bHRfaXJxX3JvdXRpbmcoa3ZtKTsKIAkJaWYgKHIpIHsKKwkJCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CiAJCQlrdm1faW9hcGljX2Rlc3Ryb3koa3ZtKTsKKwkJCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWJyZWFrOwpAQCAtMTM1Nyw3ICsxMzQ4LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9rdm0oc3RydWN0IGt2bSAqa3ZtKQordm9pZCBrdm1fYXJjaF9mcmVlX3ZtKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAl1bnNpZ25lZCBsb25nIHZtX2Jhc2UgPSBrdm0tPmFyY2gudm1fYmFzZTsKIApAQCAtMTM5OSw5ICsxMzkwLDYgQEAKICNlbmRpZgogCWtmcmVlKGt2bS0+YXJjaC52aW9hcGljKTsKIAlrdm1fcmVsZWFzZV92bV9wYWdlcyhrdm0pOwotCWt2bV9mcmVlX3BoeXNtZW0oa3ZtKTsKLQljbGVhbnVwX3NyY3Vfc3RydWN0KCZrdm0tPnNyY3UpOwotCWZyZWVfa3ZtKGt2bSk7CiB9CiAKIHZvaWQga3ZtX2FyY2hfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9tbWlvLmMgYi9hcmNoL2lhNjQva3ZtL21taW8uYwppbmRleCBmYjhmOWY1Li5mMWUxN2QzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL21taW8uYworKysgYi9hcmNoL2lhNjQva3ZtL21taW8uYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAlsb2NhbF9pcnFfc2F2ZShwc3IpOwogCi0JLypJbnRlcmNlcHQgdGhlIGFjY2VzIGZvciBQSUIgcmFuZ2UqLworCS8qSW50ZXJjZXB0IHRoZSBhY2Nlc3MgZm9yIFBJQiByYW5nZSovCiAJaWYgKGlvdCA9PSBHUEZOX1BJQikgewogCQlpZiAoIWRpcikKIAkJCWxzYXBpY193cml0ZSh2Y3B1LCBzcmNfcGEsIHMsICpkZXN0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggMTg0MWVlNy4uNWNhNjc0YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9pYTY0L21tL2h1Z2V0bGJwYWdlLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlpZiAocHVkKSB7CiAJCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCB0YWRkcik7CiAJCWlmIChwbWQpCi0JCQlwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBwbWQsIHRhZGRyKTsKKwkJCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIE5VTEwsIHBtZCwgdGFkZHIpOwogCX0KIAlyZXR1cm4gcHRlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2lmcHNwMDYwL3NyYy9mcHNwLlMgYi9hcmNoL202OGsvaWZwc3AwNjAvc3JjL2Zwc3AuUwppbmRleCA3MzYxM2I1Li4yNmU4NWUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaWZwc3AwNjAvc3JjL2Zwc3AuUworKysgYi9hcmNoL202OGsvaWZwc3AwNjAvc3JjL2Zwc3AuUwpAQCAtMzg4MSw3ICszODgxLDcgQEAKICMgRlAgVW5pbXBsZW1lbnRlZCBJbnN0cnVjdGlvbiBzdGFjayBmcmFtZSBhbmQganVtcCB0byB0aGF0IGVudHJ5CiAjIHBvaW50LgogIwotIyBidXQsIGlmIHRoZSBGUFUgaXMgZGlzYWJsZWQsIHRoZW4gd2UgbmVlZCB0byBqdW1wIHRvIHRoZSBGUFUgZGlhYmxlZAorIyBidXQsIGlmIHRoZSBGUFUgaXMgZGlzYWJsZWQsIHRoZW4gd2UgbmVlZCB0byBqdW1wIHRvIHRoZSBGUFUgZGlzYWJsZWQKICMgZW50cnkgcG9pbnQuCiAJbW92YwkJJXBjciwlZDAKIAlidHN0CQkmMHgxLCVkMApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NDh4Z3B0LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0OHhncHQuaAppbmRleCBjOGVmMTU4Li4zM2IyZWVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0OHhncHQuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0OHhncHQuaApAQCAtNTksMTEgKzU5LDEzIEBACiAjZGVmaW5lIE1DRl9HUFRfR01TX0dQSU9fSU5QVVQgICAgICgweDAwMDAwMDAwKQogI2RlZmluZSBNQ0ZfR1BUX0dNU19HUElPX09VVExPICAgICAoMHgwMDAwMDAyMCkKICNkZWZpbmUgTUNGX0dQVF9HTVNfR1BJT19PVVRISSAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIE1DRl9HUFRfR01TX0dQSU9fTUFTSyAgICAgICgweDAwMDAwMDMwKQogI2RlZmluZSBNQ0ZfR1BUX0dNU19UTVNfRElTQUJMRSAgICAoMHgwMDAwMDAwMCkKICNkZWZpbmUgTUNGX0dQVF9HTVNfVE1TX0lOQ0FQVCAgICAgKDB4MDAwMDAwMDEpCiAjZGVmaW5lIE1DRl9HUFRfR01TX1RNU19PVVRDQVBUICAgICgweDAwMDAwMDAyKQogI2RlZmluZSBNQ0ZfR1BUX0dNU19UTVNfUFdNICAgICAgICAoMHgwMDAwMDAwMykKICNkZWZpbmUgTUNGX0dQVF9HTVNfVE1TX0dQSU8gICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1DRl9HUFRfR01TX1RNU19NQVNLICAgICAgICgweDAwMDAwMDA3KQogCiAvKiBCaXQgZGVmaW5pdGlvbnMgYW5kIG1hY3JvcyBmb3IgTUNGX0dQVF9HQ0lSICovCiAjZGVmaW5lIE1DRl9HUFRfR0NJUl9DTlQoeCkgICAgICAgICgoKHgpJjB4MDAwMEZGRkYpPDwwKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N1bjNfcGd0YWJsZS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N1bjNfcGd0YWJsZS5oCmluZGV4IGNmNWZhZDkuLmY1NWFhMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zdW4zX3BndGFibGUuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc3VuM19wZ3RhYmxlLmgKQEAgLTIxNyw5ICsyMTcsOCBAQAogLyogRmluZCBhbiBlbnRyeSBpbiB0aGUgdGhpcmQtbGV2ZWwgcGFnZXRhYmxlLiAqLwogI2RlZmluZSBwdGVfaW5kZXgoYWRkcmVzcykgKChhZGRyZXNzID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURS0xKSkKICNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyZXNzKSAoKHB0ZV90ICopIF9fcG1kX3BhZ2UoKnBtZCkgKyBwdGVfaW5kZXgoYWRkcmVzcykpCi0vKiBGSVhNRTogc2hvdWxkIHdlIGJvdGhlciB3aXRoIGttYXAoKSBoZXJlPyAqLwotI2RlZmluZSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpICgocHRlX3QgKilrbWFwKHBtZF9wYWdlKCpwbWQpKSArIHB0ZV9pbmRleChhZGRyZXNzKSkKLSNkZWZpbmUgcHRlX3VubWFwKHB0ZSkga3VubWFwKHB0ZSkKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKSAoKHB0ZV90ICopcGFnZV9hZGRyZXNzKHBtZF9wYWdlKCpwbWQpKSArIHB0ZV9pbmRleChhZGRyZXNzKSkKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkgZG8geyB9IHdoaWxlICgwKQogCiAvKiBNYWNyb3MgdG8gKGRlKWNvbnN0cnVjdCB0aGUgZmFrZSBQVEVzIHJlcHJlc2VudGluZyBzd2FwIHBhZ2VzLiAqLwogI2RlZmluZSBfX3N3cF90eXBlKHgpCQkoKHgpLnZhbCAmIDB4N0YpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDFkYTVkNTMuLjc5MDk4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMDQsNSArMTA0LDYgQEAKICNkZWZpbmUgVElGX1NZU0NBTExfVFJBQ0UJMTUJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMTYJLyogaXMgdGVybWluYXRpbmcgZHVlIHRvIE9PTSBraWxsZXIgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMTcJLyogdGhyZWFkIGlzIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJMTgJLyogcmVzdG9yZSBzaWduYWwgbWFzayBpbiBkb19zaWduYWwgKi8KIAogI2VuZGlmCS8qIF9BU01fTTY4S19USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmgKaW5kZXggYjQzYjM2Yi4uMjZkODUxZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtMzczLDYgKzM3Myw3IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECiAKIC8qCiAgKiAiQ29uZGl0aW9uYWwiIHN5c2NhbGxzCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKaW5kZXggNjM2MGM0My4uMTU1OWRlYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwpAQCAtOTksNyArOTksMTAgQEAKIAlqcmEJLkxyZXRfZnJvbV9leGNlcHRpb24KIAogRU5UUlkocmV0X2Zyb21fc2lnbmFsKQotCVJFU1RPUkVfU1dJVENIX1NUQUNLCisJdHN0YgklY3VycHRyQChUQVNLX0lORk8rVElORk9fRkxBR1MrMikKKwlqZ2UJMWYKKwlqYnNyCXN5c2NhbGxfdHJhY2UKKzE6CVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCiAvKiBvbiA2ODA0MCBjb21wbGV0ZSBwZW5kaW5nIHdyaXRlYmFja3MgaWYgYW55ICovCiAjaWZkZWYgQ09ORklHX002ODA0MApAQCAtMTc0LDE2ICsxNzcsMTEgQEAKIAlzdWJxbAkjNCwlc3AJCQl8IGR1bW15IHJldHVybiBhZGRyZXNzCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQljbHJsCSVzcEAtCiAJYnNybAlkb19zaWduYWwKLQlhZGRxbAkjOCwlc3AKKwlhZGRxbAkjNCwlc3AKIAlSRVNUT1JFX1NXSVRDSF9TVEFDSwogCWFkZHFsCSM0LCVzcAotCXRzdGwJJWQwCi0JamVxCXJlc3VtZV91c2Vyc3BhY2UKLQl8IHdoZW4gc2luZ2xlIHN0ZXBwaW5nIGludG8gaGFuZGxlciBzdG9wIGF0IHRoZSBmaXJzdCBpbnNuCi0JYnRzdAkjNiwlY3VycHRyQChUQVNLX0lORk8rVElORk9fRkxBR1MrMikKLQlqZXEJcmVzdW1lX3VzZXJzcGFjZQorCWpicmEJcmVzdW1lX3VzZXJzcGFjZQogCiBkb19kZWxheWVkX3RyYWNlOgogCWJjbHIJIzcsJXNwQChQVF9PRkZfU1IpCXwgY2xlYXIgdHJhY2UgYml0IGluIFNSCkBAIC0yOTAsMjIgKzI4OCw2IEBACiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlydHMKIAotRU5UUlkoc3lzX3NpZ3N1c3BlbmQpCi0JU0FWRV9TV0lUQ0hfU1RBQ0sKLQlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQlqYnNyCWRvX3NpZ3N1c3BlbmQKLQlhZGRxbAkjNCwlc3AKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSwotCXJ0cwotCi1FTlRSWShzeXNfcnRfc2lnc3VzcGVuZCkKLQlTQVZFX1NXSVRDSF9TVEFDSwotCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWpic3IJZG9fcnRfc2lnc3VzcGVuZAotCWFkZHFsCSM0LCVzcAotCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0JcnRzCi0KIEVOVFJZKHN5c19zaWdyZXR1cm4pCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCWRvX3NpZ3JldHVybgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNGIzODc1My4uZDEyYzNiMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCkBAIC01MSw4ICs1MSw2IEBACiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KIGNvbnN0IGludCBmcmFtZV9leHRyYV9zaXplc1sxNl0gPSB7CiAgIFsxXQk9IC0xLCAvKiBzaXplb2YoKChzdHJ1Y3QgZnJhbWUgKikwKS0+dW4uZm10MSksICovCiAgIFsyXQk9IHNpemVvZigoKHN0cnVjdCBmcmFtZSAqKTApLT51bi5mbXQyKSwKQEAgLTc0LDUxICs3MiwyMSBAQAogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KLWFzbWxpbmthZ2UgaW50IGRvX3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIGludAorc3lzX3NpZ3N1c3BlbmQoaW50IHVudXNlZDAsIGludCB1bnVzZWQxLCBvbGRfc2lnc2V0X3QgbWFzaykKIHsKLQlvbGRfc2lnc2V0X3QgbWFzayA9IHJlZ3MtPmQzOwotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KIAltYXNrICY9IF9CTE9DS0FCTEU7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCi0JcmVncy0+ZDAgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAKLWFzbWxpbmthZ2UgaW50Ci1kb19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ3NldF90IF9fdXNlciAqdW5ld3NldCA9IChzaWdzZXRfdCBfX3VzZXIgKilyZWdzLT5kMTsKLQlzaXplX3Qgc2lnc2V0c2l6ZSA9IChzaXplX3QpcmVncy0+ZDI7Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQotCXJlZ3MtPmQwID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50CkBAIC0xMzIsMTAgKzEwMCwxMCBAQAogCQlvbGRfc2lnc2V0X3QgbWFzazsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFjdCwgc2l6ZW9mKCphY3QpKSB8fAogCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfaGFuZGxlciwgJmFjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikpCisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncyk7Ci0JCV9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzayk7CiAJCXNpZ2luaXRzZXQoJm5ld19rYS5zYS5zYV9tYXNrLCBtYXNrKTsKIAl9CiAKQEAgLTE0NCwxMCArMTEyLDEwIEBACiAJaWYgKCFyZXQgJiYgb2FjdCkgewogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CiAJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKLQkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfcmVzdG9yZXIsICZvYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spKQogCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zMTgsMzYgKzI4NiwxMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnAsCi0JCSAgIGludCAqcGQwKQorc3RhdGljIGludCBtYW5nbGVfa2VybmVsX3N0YWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZm9ybWF0dmVjLAorCQkJICAgICAgIHZvaWQgX191c2VyICpmcCkKIHsKLQlpbnQgZnNpemUsIGZvcm1hdHZlYzsKLQlzdHJ1Y3Qgc2lnY29udGV4dCBjb250ZXh0OwotCWludCBlcnI7Ci0KLQkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KLQljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7Ci0KLQkvKiBnZXQgcHJldmlvdXMgY29udGV4dCAqLwotCWlmIChjb3B5X2Zyb21fdXNlcigmY29udGV4dCwgdXNjLCBzaXplb2YoY29udGV4dCkpKQotCQlnb3RvIGJhZGZyYW1lOwotCi0JLyogcmVzdG9yZSBwYXNzZWQgcmVnaXN0ZXJzICovCi0JcmVncy0+ZDEgPSBjb250ZXh0LnNjX2QxOwotCXJlZ3MtPmEwID0gY29udGV4dC5zY19hMDsKLQlyZWdzLT5hMSA9IGNvbnRleHQuc2NfYTE7Ci0JcmVncy0+c3IgPSAocmVncy0+c3IgJiAweGZmMDApIHwgKGNvbnRleHQuc2Nfc3IgJiAweGZmKTsKLQlyZWdzLT5wYyA9IGNvbnRleHQuc2NfcGM7Ci0JcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLwotCXdydXNwKGNvbnRleHQuc2NfdXNwKTsKLQlmb3JtYXR2ZWMgPSBjb250ZXh0LnNjX2Zvcm1hdHZlYzsKLQlyZWdzLT5mb3JtYXQgPSBmb3JtYXR2ZWMgPj4gMTI7Ci0JcmVncy0+dmVjdG9yID0gZm9ybWF0dmVjICYgMHhmZmY7Ci0KLQllcnIgPSByZXN0b3JlX2ZwdV9zdGF0ZSgmY29udGV4dCk7Ci0KLQlmc2l6ZSA9IGZyYW1lX2V4dHJhX3NpemVzW3JlZ3MtPmZvcm1hdF07CisJaW50IGZzaXplID0gZnJhbWVfZXh0cmFfc2l6ZXNbZm9ybWF0dmVjID4+IDEyXTsKIAlpZiAoZnNpemUgPCAwKSB7CiAJCS8qCiAJCSAqIHVzZXIgcHJvY2VzcyB0cnlpbmcgdG8gcmV0dXJuIHdpdGggd2VpcmQgZnJhbWUgZm9ybWF0CkBAIC0zNTUsMTYgKzI5NywyMiBAQAogI2lmZGVmIERFQlVHCiAJCXByaW50aygidXNlciBwcm9jZXNzIHJldHVybmluZyB3aXRoIHdlaXJkIGZyYW1lIGZvcm1hdFxuIik7CiAjZW5kaWYKLQkJZ290byBiYWRmcmFtZTsKKwkJcmV0dXJuIDE7CiAJfQotCi0JLyogT0suCU1ha2Ugcm9vbSBvbiB0aGUgc3VwZXJ2aXNvciBzdGFjayBmb3IgdGhlIGV4dHJhIGp1bmssCi0JICogaWYgbmVjZXNzYXJ5LgotCSAqLwotCi0JaWYgKGZzaXplKSB7CisJaWYgKCFmc2l6ZSkgeworCQlyZWdzLT5mb3JtYXQgPSBmb3JtYXR2ZWMgPj4gMTI7CisJCXJlZ3MtPnZlY3RvciA9IGZvcm1hdHZlYyAmIDB4ZmZmOworCX0gZWxzZSB7CiAJCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3ID0gKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilyZWdzIC0gMTsKLQkJcmVncy0+ZDAgPSBjb250ZXh0LnNjX2QwOworCQl1bnNpZ25lZCBsb25nIGJ1Zltmc2l6ZSAvIDJdOyAvKiB5ZXMsIHR3aWNlIGFzIG11Y2ggKi8KKworCQkvKiB0aGF0J2xsIG1ha2Ugc3VyZSB0aGF0IGV4cGFuc2lvbiB3b24ndCBjcmFwIG92ZXIgZGF0YSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmICsgZnNpemUgLyA0LCBmcCwgZnNpemUpKQorCQkJcmV0dXJuIDE7CisKKwkJLyogcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJCXJlZ3MtPmZvcm1hdCA9IGZvcm1hdHZlYyA+PiAxMjsKKwkJcmVncy0+dmVjdG9yID0gZm9ybWF0dmVjICYgMHhmZmY7CiAjZGVmaW5lIGZyYW1lX29mZnNldCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKStzaXplb2Yoc3RydWN0IHN3aXRjaF9zdGFjaykpCiAJCV9fYXNtX18gX192b2xhdGlsZV9fCiAJCQkoIiAgIG1vdmVsICUwLCUvYTBcblx0IgpAQCAtMzc2LDMwICszMjQsNTAgQEAKIAkJCSAiICAgbGVhICUvc3BAKCVjMyksJS9hMFxuXHQiIC8qIGFkZCBvZmZzZXQgb2YgZm10ICovCiAJCQkgIiAgIGxzcmwgICMyLCUxXG5cdCIKIAkJCSAiICAgc3VicWwgIzEsJTFcblx0IgotCQkJICIyOiBtb3Zlc2wgJTRAKywlMlxuXHQiCi0JCQkgIjM6IG1vdmVsICUyLCUvYTBAK1xuXHQiCisJCQkgLyogY29weSB0byB0aGUgZ2FwIHdlJ2QgbWFkZSAqLworCQkJICIyOiBtb3ZlbCAlNEArLCUvYTBAK1xuXHQiCiAJCQkgIiAgIGRicmEgJTEsMmJcblx0IgogCQkJICIgICBicmFsIHJldF9mcm9tX3NpZ25hbFxuIgotCQkJICI0OlxuIgotCQkJICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgIiAgIC5hbGlnbiA0XG4iCi0JCQkgIiAgIC5sb25nIDJiLDRiXG4iCi0JCQkgIiAgIC5sb25nIDNiLDRiXG4iCi0JCQkgIi5wcmV2aW91cyIKIAkJCSA6IC8qIG5vIG91dHB1dHMsIGl0IGRvZXNuJ3QgZXZlciByZXR1cm4gKi8KIAkJCSA6ICJhIiAoc3cpLCAiZCIgKGZzaXplKSwgImQiIChmcmFtZV9vZmZzZXQvNC0xKSwKLQkJCSAgICJuIiAoZnJhbWVfb2Zmc2V0KSwgImEiIChmcCkKKwkJCSAgICJuIiAoZnJhbWVfb2Zmc2V0KSwgImEiIChidWYgKyBmc2l6ZS80KQogCQkJIDogImEwIik7CiAjdW5kZWYgZnJhbWVfb2Zmc2V0Ci0JCS8qCi0JCSAqIElmIHdlIGV2ZXIgZ2V0IGhlcmUgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlCi0JCSAqIGJ1aWxkaW5nIHRoZSBhYm92ZSBzdGFjay1mcmFtZS4KLQkJICovCi0JCWdvdG8gYmFkZnJhbWU7CiAJfQorCXJldHVybiAwOworfQogCi0JKnBkMCA9IGNvbnRleHQuc2NfZDA7Ci0JcmV0dXJuIGVycjsKK3N0YXRpYyBpbmxpbmUgaW50CityZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqdXNjLCB2b2lkIF9fdXNlciAqZnApCit7CisJaW50IGZvcm1hdHZlYzsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBjb250ZXh0OworCWludCBlcnI7CisKKwkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CisKKwkvKiBnZXQgcHJldmlvdXMgY29udGV4dCAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29udGV4dCwgdXNjLCBzaXplb2YoY29udGV4dCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJLyogcmVzdG9yZSBwYXNzZWQgcmVnaXN0ZXJzICovCisJcmVncy0+ZDAgPSBjb250ZXh0LnNjX2QwOworCXJlZ3MtPmQxID0gY29udGV4dC5zY19kMTsKKwlyZWdzLT5hMCA9IGNvbnRleHQuc2NfYTA7CisJcmVncy0+YTEgPSBjb250ZXh0LnNjX2ExOworCXJlZ3MtPnNyID0gKHJlZ3MtPnNyICYgMHhmZjAwKSB8IChjb250ZXh0LnNjX3NyICYgMHhmZik7CisJcmVncy0+cGMgPSBjb250ZXh0LnNjX3BjOworCXJlZ3MtPm9yaWdfZDAgPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KKwl3cnVzcChjb250ZXh0LnNjX3VzcCk7CisJZm9ybWF0dmVjID0gY29udGV4dC5zY19mb3JtYXR2ZWM7CisKKwllcnIgPSByZXN0b3JlX2ZwdV9zdGF0ZSgmY29udGV4dCk7CisKKwlpZiAoZXJyIHx8IG1hbmdsZV9rZXJuZWxfc3RhY2socmVncywgZm9ybWF0dmVjLCBmcCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlyZXR1cm4gMDsKIAogYmFkZnJhbWU6CiAJcmV0dXJuIDE7CkBAIC00MDcsOSArMzc1LDkgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIGludCAqcGQwKQorCQkgICAgc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMpCiB7Ci0JaW50IGZzaXplLCB0ZW1wOworCWludCB0ZW1wOwogCWdyZWdfdCBfX3VzZXIgKmdyZWdzID0gdWMtPnVjX21jb250ZXh0LmdyZWdzOwogCXVuc2lnbmVkIGxvbmcgdXNwOwogCWludCBlcnI7CkBAIC00NDMsNjUgKzQxMSwxNiBAQAogCXJlZ3MtPnNyID0gKHJlZ3MtPnNyICYgMHhmZjAwKSB8ICh0ZW1wICYgMHhmZik7CiAJcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLwogCWVyciB8PSBfX2dldF91c2VyKHRlbXAsICZ1Yy0+dWNfZm9ybWF0dmVjKTsKLQlyZWdzLT5mb3JtYXQgPSB0ZW1wID4+IDEyOwotCXJlZ3MtPnZlY3RvciA9IHRlbXAgJiAweGZmZjsKIAogCWVyciB8PSBydF9yZXN0b3JlX2ZwdV9zdGF0ZSh1Yyk7CiAKLQlpZiAoZG9fc2lnYWx0c3RhY2soJnVjLT51Y19zdGFjaywgTlVMTCwgdXNwKSA9PSAtRUZBVUxUKQorCWlmIChlcnIgfHwgZG9fc2lnYWx0c3RhY2soJnVjLT51Y19zdGFjaywgTlVMTCwgdXNwKSA9PSAtRUZBVUxUKQogCQlnb3RvIGJhZGZyYW1lOwogCi0JZnNpemUgPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOwotCWlmIChmc2l6ZSA8IDApIHsKLQkJLyoKLQkJICogdXNlciBwcm9jZXNzIHRyeWluZyB0byByZXR1cm4gd2l0aCB3ZWlyZCBmcmFtZSBmb3JtYXQKLQkJICovCi0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJ1c2VyIHByb2Nlc3MgcmV0dXJuaW5nIHdpdGggd2VpcmQgZnJhbWUgZm9ybWF0XG4iKTsKLSNlbmRpZgorCWlmIChtYW5nbGVfa2VybmVsX3N0YWNrKHJlZ3MsIHRlbXAsICZ1Yy0+dWNfZXh0cmEpKQogCQlnb3RvIGJhZGZyYW1lOwotCX0KIAotCS8qIE9LLglNYWtlIHJvb20gb24gdGhlIHN1cGVydmlzb3Igc3RhY2sgZm9yIHRoZSBleHRyYSBqdW5rLAotCSAqIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQotCWlmIChmc2l6ZSkgewotI2RlZmluZSBmcmFtZV9vZmZzZXQgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykrc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spKQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCQkJKCIgICBtb3ZlbCAlMCwlL2EwXG5cdCIKLQkJCSAiICAgc3VibCAlMSwlL2EwXG5cdCIgICAgIC8qIG1ha2Ugcm9vbSBvbiBzdGFjayAqLwotCQkJICIgICBtb3ZlbCAlL2EwLCUvc3Bcblx0IiAgLyogc2V0IHN0YWNrIHBvaW50ZXIgKi8KLQkJCSAvKiBtb3ZlIHN3aXRjaF9zdGFjayBhbmQgcHRfcmVncyAqLwotCQkJICIxOiBtb3ZlbCAlMEArLCUvYTBAK1xuXHQiCi0JCQkgIiAgIGRicmEgJTIsMWJcblx0IgotCQkJICIgICBsZWEgJS9zcEAoJWMzKSwlL2EwXG5cdCIgLyogYWRkIG9mZnNldCBvZiBmbXQgKi8KLQkJCSAiICAgbHNybCAgIzIsJTFcblx0IgotCQkJICIgICBzdWJxbCAjMSwlMVxuXHQiCi0JCQkgIjI6IG1vdmVzbCAlNEArLCUyXG5cdCIKLQkJCSAiMzogbW92ZWwgJTIsJS9hMEArXG5cdCIKLQkJCSAiICAgZGJyYSAlMSwyYlxuXHQiCi0JCQkgIiAgIGJyYWwgcmV0X2Zyb21fc2lnbmFsXG4iCi0JCQkgIjQ6XG4iCi0JCQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkJCSAiICAgLmFsaWduIDRcbiIKLQkJCSAiICAgLmxvbmcgMmIsNGJcbiIKLQkJCSAiICAgLmxvbmcgM2IsNGJcbiIKLQkJCSAiLnByZXZpb3VzIgotCQkJIDogLyogbm8gb3V0cHV0cywgaXQgZG9lc24ndCBldmVyIHJldHVybiAqLwotCQkJIDogImEiIChzdyksICJkIiAoZnNpemUpLCAiZCIgKGZyYW1lX29mZnNldC80LTEpLAotCQkJICAgIm4iIChmcmFtZV9vZmZzZXQpLCAiYSIgKCZ1Yy0+dWNfZXh0cmEpCi0JCQkgOiAiYTAiKTsKLSN1bmRlZiBmcmFtZV9vZmZzZXQKLQkJLyoKLQkJICogSWYgd2UgZXZlciBnZXQgaGVyZSBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUKLQkJICogYnVpbGRpbmcgdGhlIGFib3ZlIHN0YWNrLWZyYW1lLgotCQkgKi8KLQkJZ290byBiYWRmcmFtZTsKLQl9Ci0KLQkqcGQwID0gcmVncy0+ZDA7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIAogYmFkZnJhbWU6CiAJcmV0dXJuIDE7CkBAIC01MTQsNyArNDMzLDYgQEAKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7CiAJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7Ci0JaW50IGQwOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCWdvdG8gYmFkZnJhbWU7CkBAIC01MjgsOSArNDQ2LDkgQEAKIAljdXJyZW50LT5ibG9ja2VkID0gc2V0OwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAKLQlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsIGZyYW1lICsgMSwgJmQwKSkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsIGZyYW1lICsgMSkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0JcmV0dXJuIGQwOworCXJldHVybiByZWdzLT5kMDsKIAogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwpAQCAtNTQ0LDcgKzQ2Miw2IEBACiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwotCWludCBkMDsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGJhZGZyYW1lOwpAQCAtNTU1LDkgKzQ3Miw5IEBACiAJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCi0JaWYgKHJ0X3Jlc3RvcmVfdWNvbnRleHQocmVncywgc3csICZmcmFtZS0+dWMsICZkMCkpCisJaWYgKHJ0X3Jlc3RvcmVfdWNvbnRleHQocmVncywgc3csICZmcmFtZS0+dWMpKQogCQlnb3RvIGJhZGZyYW1lOwotCXJldHVybiBkMDsKKwlyZXR1cm4gcmVncy0+ZDA7CiAKIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKQEAgLTc3NSw3ICs2OTIsNyBAQAogCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorc3RhdGljIGludCBzZXR1cF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJCSBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKQEAgLTc5MywxMCArNzEwLDggQEAKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSArIGZzaXplKTsKIAotCWlmIChmc2l6ZSkgeworCWlmIChmc2l6ZSkKIAkJZXJyIHw9IGNvcHlfdG9fdXNlciAoZnJhbWUgKyAxLCByZWdzICsgMSwgZnNpemUpOwotCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKLQl9CiAKIAllcnIgfD0gX19wdXRfdXNlcigoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgogCQkJICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcApAQCAtODI2LDExICs3NDEsMjEgQEAKIAogCXB1c2hfY2FjaGUgKCh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnJldGNvZGUpOwogCi0JLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwkvKgorCSAqIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyLiAgQWxsIHRoZSBzdGF0ZSB3ZSBhcmUgYWJvdXQKKwkgKiB0byBkZXN0cm95IGlzIHN1Y2Nlc3NmdWxseSBjb3BpZWQgdG8gc2lnZnJhbWUuCisJICovCiAJd3J1c3AgKCh1bnNpZ25lZCBsb25nKSBmcmFtZSk7CiAJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CiAKLWFkanVzdF9zdGFjazoKKwkvKgorCSAqIFRoaXMgaXMgc3VidGxlOyBpZiB3ZSBidWlsZCBtb3JlIHRoYW4gb25lIHNpZ2ZyYW1lLCBhbGwgYnV0IHRoZQorCSAqIGZpcnN0IG9uZSB3aWxsIHNlZSBmcmFtZSBmb3JtYXQgMCBhbmQgaGF2ZSBmc2l6ZSA9PSAwLCBzbyB3ZSB3b24ndAorCSAqIHNjcmV3IHN0a2Fkai4KKwkgKi8KKwlpZiAoZnNpemUpCisJCXJlZ3MtPnN0a2FkaiA9IGZzaXplOworCiAJLyogUHJlcGFyZSB0byBza2lwIG92ZXIgdGhlIGV4dHJhIHN0dWZmIGluIHRoZSBleGNlcHRpb24gZnJhbWUuICAqLwogCWlmIChyZWdzLT5zdGthZGopIHsKIAkJc3RydWN0IHB0X3JlZ3MgKnRyZWdzID0KQEAgLTg0NSwxNCArNzcwLDE0IEBACiAJCXRyZWdzLT5wYyA9IHJlZ3MtPnBjOwogCQl0cmVncy0+c3IgPSByZWdzLT5zcjsKIAl9Ci0JcmV0dXJuOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCWdvdG8gYWRqdXN0X3N0YWNrOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHNldHVwX3J0X2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCitzdGF0aWMgaW50IHNldHVwX3J0X2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJCQkgICAgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CkBAIC04NjksMTAgKzc5NCw4IEBACiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOwogCi0JaWYgKGZzaXplKSB7CisJaWYgKGZzaXplKQogCQllcnIgfD0gY29weV90b191c2VyICgmZnJhbWUtPnVjLnVjX2V4dHJhLCByZWdzICsgMSwgZnNpemUpOwotCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKLQl9CiAKIAllcnIgfD0gX19wdXRfdXNlcigoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgogCQkJICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcApAQCAtOTE0LDExICs4MzcsMjEgQEAKIAogCXB1c2hfY2FjaGUgKCh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnJldGNvZGUpOwogCi0JLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwkvKgorCSAqIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyLiAgQWxsIHRoZSBzdGF0ZSB3ZSBhcmUgYWJvdXQKKwkgKiB0byBkZXN0cm95IGlzIHN1Y2Nlc3NmdWxseSBjb3BpZWQgdG8gc2lnZnJhbWUuCisJICovCiAJd3J1c3AgKCh1bnNpZ25lZCBsb25nKSBmcmFtZSk7CiAJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykga2EtPnNhLnNhX2hhbmRsZXI7CiAKLWFkanVzdF9zdGFjazoKKwkvKgorCSAqIFRoaXMgaXMgc3VidGxlOyBpZiB3ZSBidWlsZCBtb3JlIHRoYW4gb25lIHNpZ2ZyYW1lLCBhbGwgYnV0IHRoZQorCSAqIGZpcnN0IG9uZSB3aWxsIHNlZSBmcmFtZSBmb3JtYXQgMCBhbmQgaGF2ZSBmc2l6ZSA9PSAwLCBzbyB3ZSB3b24ndAorCSAqIHNjcmV3IHN0a2Fkai4KKwkgKi8KKwlpZiAoZnNpemUpCisJCXJlZ3MtPnN0a2FkaiA9IGZzaXplOworCiAJLyogUHJlcGFyZSB0byBza2lwIG92ZXIgdGhlIGV4dHJhIHN0dWZmIGluIHRoZSBleGNlcHRpb24gZnJhbWUuICAqLwogCWlmIChyZWdzLT5zdGthZGopIHsKIAkJc3RydWN0IHB0X3JlZ3MgKnRyZWdzID0KQEAgLTkzMywxMSArODY2LDExIEBACiAJCXRyZWdzLT5wYyA9IHJlZ3MtPnBjOwogCQl0cmVncy0+c3IgPSByZWdzLT5zcjsKIAl9Ci0JcmV0dXJuOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCWdvdG8gYWRqdXN0X3N0YWNrOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtOTk1LDYgKzkyOCw3IEBACiBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkgICAgICBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpbnQgZXJyOwogCS8qIGFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPm9yaWdfZDAgPj0gMCkKIAkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLwpAQCAtMTAwMiwxNyArOTM2LDI0IEBACiAKIAkvKiBzZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCi0JCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJCWVyciA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CiAJZWxzZQotCQlzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOworCQllcnIgPSBzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwogCi0JaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX09ORVNIT1QpCi0JCWthLT5zYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKKwlpZiAoZXJyKQorCQlyZXR1cm47CiAKIAlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKIAlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKIAkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9ERUxBWUVEX1RSQUNFKSkgeworCQlyZWdzLT5zciAmPSB+MHg4MDAwOworCQlzZW5kX3NpZyhTSUdUUkFQLCBjdXJyZW50LCAxKTsKKwl9CisKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKIH0KIAogLyoKQEAgLTEwMjAsMjIgKzk2MSwyNSBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXNpZ2luZm9fdCBpbmZvOwogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlpbnQgc2lnbnI7CisJc2lnc2V0X3QgKm9sZHNldDsKIAogCWN1cnJlbnQtPnRocmVhZC5lc3AwID0gKHVuc2lnbmVkIGxvbmcpIHJlZ3M7CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCWlmIChzaWduciA+IDApIHsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCiAJCWhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm47CiAJfQogCiAJLyogRGlkIHdlIGNvbWUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwpAQCAtMTA0Myw1ICs5ODcsOSBAQAogCQkvKiBSZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KIAkJaGFuZGxlX3Jlc3RhcnQocmVncywgTlVMTCwgMCk7CiAKLQlyZXR1cm4gMDsKKwkvKiBJZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHJlc3RvcmUgdGhlIHNhdmVkIG1hc2suICAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvcHNjLmMgYi9hcmNoL202OGsvbWFjL3BzYy5jCmluZGV4IGJhNmNjYWIuLmE0YzNlYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvcHNjLmMKKysrIGIvYXJjaC9tNjhrL21hYy9wc2MuYwpAQCAtODgsNyArODgsNyBAQAogCiAJLyoKIAkgKiBUaGUgUFNDIGlzIGFsd2F5cyBhdCB0aGUgc2FtZSBzcG90LCBidXQgdXNpbmcgcHNjCi0JICoga2VlcHMgdGhpbmdzIGNvbnNpc2FudCB3aXRoIHRoZSBwc2NfeHh4eCBmdW5jdGlvbnMuCisJICoga2VlcHMgdGhpbmdzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHNjX3h4eHggZnVuY3Rpb25zLgogCSAqLwogCiAJcHNjID0gKHZvaWQgKikgUFNDX0JBU0U7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCmluZGV4IGFmZjZmNTcuLjI3ODNmMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCkBAIC0xMTIsMjIgKzExMiw2IEBACiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlydHMKIAotRU5UUlkoc3lzX3NpZ3N1c3BlbmQpCi0JU0FWRV9TV0lUQ0hfU1RBQ0sKLQlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQlqYnNyCWRvX3NpZ3N1c3BlbmQKLQlhZGRxbAkjNCwlc3AKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSwotCXJ0cwotCi1FTlRSWShzeXNfcnRfc2lnc3VzcGVuZCkKLQlTQVZFX1NXSVRDSF9TVEFDSwotCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWpic3IJZG9fcnRfc2lnc3VzcGVuZAotCWFkZHFsCSM0LCVzcAotCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0JcnRzCi0KIEVOVFJZKHN5c19zaWdyZXR1cm4pCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCWRvX3NpZ3JldHVybgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCmluZGV4IDVhYjZhMDQuLjM2YTgxYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKQEAgLTUzLDY1ICs1MywzMCBAQAogCiB2b2lkIHJldF9mcm9tX3VzZXJfc2lnbmFsKHZvaWQpOwogdm9pZCByZXRfZnJvbV91c2VyX3J0X3NpZ25hbCh2b2lkKTsKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIC8qCiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBpbnQKK3N5c19zaWdzdXNwZW5kKGludCB1bnVzZWQwLCBpbnQgdW51c2VkMSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jb2xkX3NpZ3NldF90IG1hc2sgPSByZWdzLT5kMzsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJbWFzayAmPSBfQkxPQ0tBQkxFOwogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwogCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPmQwID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3Jlc3RvcmVfc2lnbWFzaygpOworCisJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAogYXNtbGlua2FnZSBpbnQKLWRvX3J0X3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnc2V0X3QgKnVuZXdzZXQgPSAoc2lnc2V0X3QgKilyZWdzLT5kMTsKLQlzaXplX3Qgc2lnc2V0c2l6ZSA9IChzaXplX3QpcmVncy0+ZDI7Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+ZDAgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19Ci0KLWFzbWxpbmthZ2UgaW50IAotc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiAqYWN0LAotCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uICpvYWN0KQorc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOwogCWludCByZXQ7CkBAIC0xMjAsMTAgKzg1LDEwIEBACiAJCW9sZF9zaWdzZXRfdCBtYXNrOwogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CiAJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAotCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKTsKLQkJX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKTsKIAkJc2lnaW5pdHNldCgmbmV3X2thLnNhLnNhX21hc2ssIG1hc2spOwogCX0KIApAQCAtMTMyLDE3ICs5NywxNyBAQAogCWlmICghcmV0ICYmIG9hY3QpIHsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAogCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiBhc21saW5rYWdlIGludAotc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgKnVzcywgc3RhY2tfdCAqdW9zcykKK3N5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcykKIHsKIAlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZHVzcCgpKTsKIH0KQEAgLTE1NywxMCArMTIyLDEwIEBACiAKIHN0cnVjdCBzaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwogCWludCBjb2RlOwotCXN0cnVjdCBzaWdjb250ZXh0ICpwc2M7CisJc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpwc2M7CiAJY2hhciByZXRjb2RlWzhdOwogCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOwogCXN0cnVjdCBzaWdjb250ZXh0IHNjOwpAQCAtMTY4LDEwICsxMzMsMTAgQEAKIAogc3RydWN0IHJ0X3NpZ2ZyYW1lCiB7Ci0JY2hhciAqcHJldGNvZGU7CisJY2hhciBfX3VzZXIgKnByZXRjb2RlOwogCWludCBzaWc7Ci0Jc3RydWN0IHNpZ2luZm8gKnBpbmZvOwotCXZvaWQgKnB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOworCXZvaWQgX191c2VyICpwdWM7CiAJY2hhciByZXRjb2RlWzhdOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHVjb250ZXh0IHVjOwpAQCAtMTk4LDggKzE2Myw4IEBACiAJCWdvdG8gb3V0OwogCiAJICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJICAgICAgImZtb3ZlbXggJTAsJS9mcDAtJS9mcDFcblx0IgotCQkJICAgICAgImZtb3ZlbWwgJTEsJS9mcGNyLyUvZnBzci8lL2ZwaWFyXG5cdCIKKwkJCSAgICAgICJmbW92ZW14ICUwLCUlZnAwLSUlZnAxXG5cdCIKKwkJCSAgICAgICJmbW92ZW1sICUxLCUlZnBjci8lJWZwc3IvJSVmcGlhclxuXHQiCiAJCQkgICAgICAiLmNoaXAgNjhrIgogCQkJICAgICAgOiAvKiBubyBvdXRwdXRzICovCiAJCQkgICAgICA6ICJtIiAoKnNjLT5zY19mcHJlZ3MpLCAibSIgKCpzYy0+c2NfZnBjbnRsKSk7CkBAIC0yMTgsNyArMTgzLDcgQEAKICNkZWZpbmUgdWNfZm9ybWF0dmVjCXVjX2ZpbGxlcltGUENPTlRFWFRfU0laRS80XQogI2RlZmluZSB1Y19leHRyYQl1Y19maWxsZXJbRlBDT05URVhUX1NJWkUvNCsxXQogCi1zdGF0aWMgaW5saW5lIGludCBydF9yZXN0b3JlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgKnVjKQorc3RhdGljIGlubGluZSBpbnQgcnRfcmVzdG9yZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMpCiB7CiAJdW5zaWduZWQgY2hhciBmcHN0YXRlW0ZQQ09OVEVYVF9TSVpFXTsKIAlpbnQgY29udGV4dF9zaXplID0gMDsKQEAgLTIyOCw3ICsxOTMsNyBAQAogCWlmIChGUFVfSVNfRU1VKSB7CiAJCS8qIHJlc3RvcmUgZnB1IGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmZwY250bCwKLQkJCQkmdWMtPnVjX21jb250ZXh0LmZwcmVncy5mX3BjciwgMTIpKQorCQkJCXVjLT51Y19tY29udGV4dC5mcHJlZ3MuZl9mcGNudGwsIDEyKSkKIAkJCWdvdG8gb3V0OwogCQkvKiByZXN0b3JlIGFsbCBvdGhlciBmcHUgcmVnaXN0ZXIgKi8KIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmZwLApAQCAtMjM3LDcgKzIwMiw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nICopJnVjLT51Y19mcHN0YXRlKSkKKwlpZiAoX19nZXRfdXNlcigqKGxvbmcgKilmcHN0YXRlLCAobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUpKQogCQlnb3RvIG91dDsKIAlpZiAoZnBzdGF0ZVswXSkgewogCQljb250ZXh0X3NpemUgPSBmcHN0YXRlWzFdOwpAQCAtMjQ5LDE1ICsyMTQsMTUgQEAKIAkJICAgICBzaXplb2YoZnByZWdzKSkpCiAJCQlnb3RvIG91dDsKIAkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlMCwlL2ZwMC0lL2ZwN1xuXHQiCi0JCQkJICAiZm1vdmVtbCAlMSwlL2ZwY3IvJS9mcHNyLyUvZnBpYXJcblx0IgorCQkJCSAgImZtb3ZlbXggJTAsJSVmcDAtJSVmcDdcblx0IgorCQkJCSAgImZtb3ZlbWwgJTEsJSVmcGNyLyUlZnBzci8lJWZwaWFyXG5cdCIKIAkJCQkgICIuY2hpcCA2OGsiCiAJCQkJICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCQkgIDogIm0iICgqZnByZWdzLmZfZnByZWdzKSwKLQkJCQkgICAgIm0iIChmcHJlZ3MuZl9wY3IpKTsKKwkJCQkgICAgIm0iICgqZnByZWdzLmZfZnBjbnRsKSk7CiAJfQogCWlmIChjb250ZXh0X3NpemUgJiYKLQkgICAgX19jb3B5X2Zyb21fdXNlcihmcHN0YXRlICsgNCwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLAorCSAgICBfX2NvcHlfZnJvbV91c2VyKGZwc3RhdGUgKyA0LCAobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLAogCQkJICAgICBjb250ZXh0X3NpemUpKQogCQlnb3RvIG91dDsKIAlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKQEAgLTI3Miw3ICsyMzcsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0ICp1c2MsIHZvaWQgKmZwLAorcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnVzYywgdm9pZCBfX3VzZXIgKmZwLAogCQkgICBpbnQgKnBkMCkKIHsKIAlpbnQgZm9ybWF0dmVjOwpAQCAtMzEyLDEwICsyNzcsMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0ICp1YywgaW50ICpwZDApCisJCSAgICBzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywgaW50ICpwZDApCiB7CiAJaW50IHRlbXA7Ci0JZ3JlZ190ICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKKwlncmVnX3QgX191c2VyICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKIAl1bnNpZ25lZCBsb25nIHVzcDsKIAlpbnQgZXJyOwogCkBAIC0zNjUsNyArMzMwLDcgQEAKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopICZfX3VudXNlZDsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoc3cgKyAxKTsKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7Ci0Jc3RydWN0IHNpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgKikodXNwIC0gNCk7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7CiAJaW50IGQwOwogCkBAIC0zOTcsNyArMzYyLDcgQEAKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopICZfX3VudXNlZDsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoc3cgKyAxKTsKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7Ci0Jc3RydWN0IHJ0X3NpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgKikodXNwIC0gNCk7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7CiAJaW50IGQwOwogCkBAIC00NDMsMTcgKzQwOCwxNyBAQAogCWlmIChzYy0+c2NfZnBzdGF0ZVswXSkgewogCQlmcHVfdmVyc2lvbiA9IHNjLT5zY19mcHN0YXRlWzBdOwogCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKLQkJCQkgICJmbW92ZW14ICUvZnAwLSUvZnAxLCUwXG5cdCIKLQkJCQkgICJmbW92ZW1sICUvZnBjci8lL2Zwc3IvJS9mcGlhciwlMVxuXHQiCisJCQkJICAiZm1vdmVteCAlJWZwMC0lJWZwMSwlMFxuXHQiCisJCQkJICAiZm1vdmVtbCAlJWZwY3IvJSVmcHNyLyUlZnBpYXIsJTFcblx0IgogCQkJCSAgIi5jaGlwIDY4ayIKLQkJCQkgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJCSAgOiAibSIgKCpzYy0+c2NfZnByZWdzKSwKLQkJCQkgICAgIm0iICgqc2MtPnNjX2ZwY250bCkKKwkJCQkgIDogIj1tIiAoKnNjLT5zY19mcHJlZ3MpLAorCQkJCSAgICAiPW0iICgqc2MtPnNjX2ZwY250bCkKKwkJCQkgIDogLyogbm8gaW5wdXRzICovCiAJCQkJICA6ICJtZW1vcnkiKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3NhdmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSBpbnQgcnRfc2F2ZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgZnBzdGF0ZVtGUENPTlRFWFRfU0laRV07CiAJaW50IGNvbnRleHRfc2l6ZSA9IDA7CkBAIC00NjEsNyArNDI2LDcgQEAKIAogCWlmIChGUFVfSVNfRU1VKSB7CiAJCS8qIHNhdmUgZnB1IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX21jb250ZXh0LmZwcmVncy5mX3BjciwKKwkJZXJyIHw9IGNvcHlfdG9fdXNlcih1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfcGNudGwsCiAJCQkJY3VycmVudC0+dGhyZWFkLmZwY250bCwgMTIpOwogCQkvKiBzYXZlIGFsbCBvdGhlciBmcHUgcmVnaXN0ZXIgKi8KIAkJZXJyIHw9IGNvcHlfdG9fdXNlcih1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfZnByZWdzLApAQCAtNDc0LDI0ICs0MzksMjQgQEAKIAkJCSAgIi5jaGlwIDY4ayIKIAkJCSAgOiA6ICJtIiAoKmZwc3RhdGUpIDogIm1lbW9yeSIpOwogCi0JZXJyIHw9IF9fcHV0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpOworCWVyciB8PSBfX3B1dF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CiAJaWYgKGZwc3RhdGVbMF0pIHsKIAkJZnByZWdzZXRfdCBmcHJlZ3M7CiAJCWNvbnRleHRfc2l6ZSA9IGZwc3RhdGVbMV07CiAJCWZwdV92ZXJzaW9uID0gZnBzdGF0ZVswXTsKIAkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlL2ZwMC0lL2ZwNywlMFxuXHQiCi0JCQkJICAiZm1vdmVtbCAlL2ZwY3IvJS9mcHNyLyUvZnBpYXIsJTFcblx0IgorCQkJCSAgImZtb3ZlbXggJSVmcDAtJSVmcDcsJTBcblx0IgorCQkJCSAgImZtb3ZlbWwgJSVmcGNyLyUlZnBzci8lJWZwaWFyLCUxXG5cdCIKIAkJCQkgICIuY2hpcCA2OGsiCi0JCQkJICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJCQkgIDogIm0iICgqZnByZWdzLmZfZnByZWdzKSwKLQkJCQkgICAgIm0iIChmcHJlZ3MuZl9wY3IpCisJCQkJICA6ICI9bSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAorCQkJCSAgICAiPW0iICgqZnByZWdzLmZfZnBjbnRsKQorCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KIAkJCQkgIDogIm1lbW9yeSIpOwogCQllcnIgfD0gY29weV90b191c2VyKCZ1Yy0+dWNfbWNvbnRleHQuZnByZWdzLCAmZnByZWdzLAogCQkJCSAgICBzaXplb2YoZnByZWdzKSk7CiAJfQogCWlmIChjb250ZXh0X3NpemUpCi0JCWVyciB8PSBjb3B5X3RvX3VzZXIoKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLCBmcHN0YXRlICsgNCwKKwkJZXJyIHw9IGNvcHlfdG9fdXNlcigobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLCBmcHN0YXRlICsgNCwKIAkJCQkgICAgY29udGV4dF9zaXplKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTE2LDEwICs0ODEsMTAgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludCBydF9zZXR1cF91Y29udGV4dChzdHJ1Y3QgdWNvbnRleHQgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3NldHVwX3Vjb250ZXh0KHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncyAtIDE7Ci0JZ3JlZ190ICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKKwlncmVnX3QgX191c2VyICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKIAlpbnQgZXJyID0gMDsKIAogCWVyciB8PSBfX3B1dF91c2VyKE1DT05URVhUX1ZFUlNJT04sICZ1Yy0+dWNfbWNvbnRleHQudmVyc2lvbik7CkBAIC01NDcsNyArNTEyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKgorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQogewogCXVuc2lnbmVkIGxvbmcgdXNwOwpAQCAtNTYwLDEzICs1MjUsMTMgQEAKIAkJaWYgKCFzYXNfc3NfZmxhZ3ModXNwKSkKIAkJCXVzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCX0KLQlyZXR1cm4gKHZvaWQgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCitzdGF0aWMgaW50IHNldHVwX2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAogCQkJIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWU7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJc3RydWN0IHNpZ2NvbnRleHQgY29udGV4dDsKIAlpbnQgZXJyID0gMDsKIApAQCAtNjE3LDE3ICs1ODIsMTcgQEAKIAkJdHJlZ3MtPnBjID0gcmVncy0+cGM7CiAJCXRyZWdzLT5zciA9IHJlZ3MtPnNyOwogCX0KLQlyZXR1cm47CisJcmV0dXJuIGVycjsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKIAlnb3RvIGFkanVzdF9zdGFjazsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfcnRfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKK3N0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkJCSAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCWludCBlcnIgPSAwOwogCiAJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKQEAgLTY0NCw4ICs2MDksOCBAQAogCiAJLyogQ3JlYXRlIHRoZSB1Y29udGV4dC4gICovCiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKLQllcnIgfD0gX19wdXRfdXNlcigodm9pZCAqKWN1cnJlbnQtPnNhc19zc19zcCwKKwllcnIgfD0gX19wdXRfdXNlcihOVUxMLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKWN1cnJlbnQtPnNhc19zc19zcCwKIAkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHJkdXNwKCkpLAogCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKQEAgLTY4MSw3ICs2NDYsNyBAQAogCQl0cmVncy0+cGMgPSByZWdzLT5wYzsKIAkJdHJlZ3MtPnNyID0gcmVncy0+c3I7CiAJfQotCXJldHVybjsKKwlyZXR1cm4gZXJyOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwpAQCAtNzI4LDYgKzY5Myw3IEBACiBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkgICAgICBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpbnQgZXJyOwogCS8qIGFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPm9yaWdfZDAgPj0gMCkKIAkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLwpAQCAtNzM1LDEyICs3MDEsMTIgQEAKIAogCS8qIHNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKKwkJZXJyID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAllbHNlCi0JCXNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CisJCWVyciA9IHNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CiAKLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05FU0hPVCkKLQkJa2EtPnNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCWlmIChlcnIpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOwpAQCAtNzQ4LDYgKzcxNCw4IEBACiAJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOwogfQogCiAvKgpAQCAtNzU1LDExICs3MjMsMTIgQEAKICAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQogICogbWlzdGFrZS4KICAqLwotYXNtbGlua2FnZSBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CiAJc2lnaW5mb190IGluZm87CiAJaW50IHNpZ25yOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAkvKgogCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCkBAIC03NjgsMTYgKzczNywxOCBAQAogCSAqIGlmIHNvLgogCSAqLwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAlpZiAoc2lnbnIgPiAwKSB7CiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIERpZCB3ZSBjb21lIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KQEAgLTc4NSw1ICs3NTYsMTAgQEAKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCiAJCWhhbmRsZV9yZXN0YXJ0KHJlZ3MsIE5VTEwsIDApOwogCX0KLQlyZXR1cm4gMDsKKworCS8qIElmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcmVzdG9yZSB0aGUgc2F2ZWQgbWFzay4gICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMKaW5kZXggMjcyNDFlMS4uMjQwYTdhNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCkBAIC0xMDYsNiArMTA2LDcgQEAKIAltb3ZlbAklc3AsJWQxCQkJLyogZ2V0IHRocmVhZF9pbmZvIHBvaW50ZXIgKi8KIAlhbmRsCSMtVEhSRUFEX1NJWkUsJWQxCiAJbW92ZWwJJWQxLCVhMgorMToKIAltb3ZlCSVhMkAoVElfRkxBR1MpLCVkMQkvKiB0aHJlYWRfaW5mby0+ZmxhZ3MgKi8KIAlhbmRsCSNfVElGX1dPUktfTUFTSywlZDEKIAlqbmUJTHdvcmtfdG9fZG8KQEAgLTEyMCwxMyArMTIxLDExIEBACiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MqLwogCVNBVkVfU1dJVENIX1NUQUNLCiAJcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JY2xybAklc3BALQogCWJzcncJZG9fc2lnbmFsCi0JYWRkcWwJIzgsJXNwCisJYWRkcWwJIzQsJXNwCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLUxyZXR1cm46Ci0JUkVTVE9SRV9BTEwKKwlqcmEJMWIKIAogLyoKICAqIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIsIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHByb2Nlc3NfaW50KCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TCmluZGV4IGMxMzFjNmUuLjhhMjg3ODggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUwpAQCAtMTAyLDYgKzEwMiw3IEBACiAJbW92ZWwJJXNwLCVkMQkJCS8qIGdldCB0aHJlYWRfaW5mbyBwb2ludGVyICovCiAJYW5kbAkjLVRIUkVBRF9TSVpFLCVkMQogCW1vdmVsCSVkMSwlYTIKKzE6CiAJbW92ZQklYTJAKFRJX0ZMQUdTKSwlZDEJLyogdGhyZWFkX2luZm8tPmZsYWdzICovCiAJYW5kbAkjX1RJRl9XT1JLX01BU0ssJWQxCiAJam5lCUx3b3JrX3RvX2RvCkBAIC0xMTYsMTMgKzExNywxMSBAQAogCXN1YnFsCSM0LCVzcAkJCS8qIGR1bW15IHJldHVybiBhZGRyZXNzKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWNscmwJJXNwQC0KIAlic3J3CWRvX3NpZ25hbAotCWFkZHFsCSM4LCVzcAorCWFkZHFsCSM0LCVzcAogCVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCi1McmV0dXJuOgotCVJFU1RPUkVfQUxMCisJanJhCTFiCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLCByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBkb19JUlEoKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2VudHJ5LlMKaW5kZXggNWU5MmJlZC4uZTFkZWJjOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCkBAIC0xNjcsMTIgKzE2NywxMSBAQAogCXN1YnFsCSM0LCVzcAkJCS8qIGR1bW15IHJldHVybiBhZGRyZXNzICovCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQljbHJsCSVzcEAtCiAJanNyCWRvX3NpZ25hbAotCWFkZHFsCSM4LCVzcAorCWFkZHFsCSM0LCVzcAogCVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCi0Jam1wCUxyZXR1cm4KKwlqbXAJTHVzZXJfcmV0dXJuCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGludGVycnVwdCBoYW5kbGVyIChmb3IgYWxsIGhhcmR3YXJlIGludGVycnVwdApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwppbmRleCAzODdkNWZmLi41ZjUwMThhIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwpAQCAtMTQsNyArMTQsNyBAQAogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKIAlzZWxlY3QgVFJBQ0lOR19TVVBQT1JUCiAJc2VsZWN0IE9GCi0Jc2VsZWN0IE9GX0ZMQVRUUkVFCisJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAKIGNvbmZpZyBTV0FQCiAJZGVmX2Jvb2wgbgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcuZGVidWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwppbmRleCBlNjZlMjVjLi4wMTJlMzc3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwpAQCAtMjMsOCArMjMsNCBAQAogCSAgVGhpcyBvcHRpb24gdHVybnMgb24vb2ZmIGhlYXJ0IGJlYXQga2VybmVsIGZ1bmN0aW9uYWxpdHkuCiAJICBGaXJzdCBHUElPIG5vZGUgaXMgdGFrZW4uCiAKLWNvbmZpZyBERUJVR19CT09UTUVNCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgotCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUKaW5kZXggMTVmMWYxZC4uNmY0MzJlNiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZQpAQCAtMTcsNyArMTcsNyBAQAogIyBUaGUgdmFyaW91cyBDT05GSUdfWElMSU5YIGNwdSBmZWF0dXJlcyBvcHRpb25zIGFyZSBpbnRlZ2VycyAwLzEvMi4uLgogIyByYXRoZXIgdGhhbiBib29scyB5L24KIAotIyBXb3JrIG91dCBIVyBtdWx0aXBsZXIgc3VwcG9ydC4gIFRoaXMgaXMgaWNreS4KKyMgV29yayBvdXQgSFcgbXVsdGlwbGVyIHN1cHBvcnQuIFRoaXMgaXMgdHJpY2t5LgogIyAxLiBTcGFydGFuMiBoYXMgbm8gSFcgbXVsdGlwbGVycy4KICMgMi4gTWljcm9CbGF6ZSB2My54IGFsd2F5cyB1c2VzIHRoZW0sIGV4Y2VwdCBpbiBTcGFydGFuIDIKICMgMy4gQWxsIG90aGVyIEZQR2EvQ1BVIHZlciBjb21ib3MsIHdlIGNhbiB0cnVzdCB0aGUgQ09ORklHXyBzZXR0aW5ncwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQppbmRleCBiZTAxZDc4Li40YzRlNThlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQpAQCAtMTAsOSArMTAsNiBAQAogCiBPQkpDT1BZRkxBR1MgOj0gLU8gYmluYXJ5CiAKLSMgV2hlcmUgdGhlIERUUyBmaWxlcyBsaXZlCi1kdHN0cmVlICAgICAgICAgOj0gJChzcmN0cmVlKS8kKHNyYykvZHRzCi0KICMgRW5zdXJlIHN5c3RlbS5kdGIgZXhpc3RzCiAkKG9iaikvbGlua2VkX2R0Yi5vOiAkKG9iaikvc3lzdGVtLmR0YgogCkBAIC01MSwxNCArNDgsMTEgQEAKIAkkKGNhbGwgaWZfY2hhbmdlZCxzdHJpcCkKIAlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScgJyAoIydgY2F0IC52ZXJzaW9uYCcpJwogCi0jIFJ1bGUgdG8gYnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMKLURUQyA9ICQob2JqdHJlZSkvc2NyaXB0cy9kdGMvZHRjCiAKICMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icwotcXVpZXRfY21kX2R0YyA9IERUQyAgICAgJEAKLQljbWRfZHRjID0gJChEVEMpIC1PIGR0YiAtbyAkKG9iaikvJCouZHRiIC1iIDAgLXAgMTAyNCAkKGR0c3RyZWUpLyQqLmR0cworRFRDX0ZMQUdTIDo9IC1wIDEwMjQKIAotJChvYmopLyUuZHRiOiAkKGR0c3RyZWUpLyUuZHRzIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZHRjKQorJChvYmopLyUuZHRiOiAkKHNyYykvZHRzLyUuZHRzIEZPUkNFCisJJChjYWxsIGNtZCxkdGMpCiAKIGNsZWFuLWZpbGVzICs9ICouZHRiIHNpbXBsZUltYWdlLioudW5zdHJpcCBsaW51eC5iaW4udWIKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL21tdV9kZWZjb25maWcgYi9hcmNoL21pY3JvYmxhemUvY29uZmlncy9tbXVfZGVmY29uZmlnCmluZGV4IDhiNDIyYjEuLmFiOGZiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL21tdV9kZWZjb25maWcKKysrIGIvYXJjaC9taWNyb2JsYXplL2NvbmZpZ3MvbW11X2RlZmNvbmZpZwpAQCAtNjYsNSArNjYsNCBAQAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19ERUJVR19CT09UTUVNPXkKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGJkYzM4MzEuLjJlNzJhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtNjQsOSArNjQsNiBAQAogLyogQ1BVIE9GIG5vZGUgbWF0Y2hpbmcgKi8KIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X2NwdV9ub2RlKGludCBjcHUsIHVuc2lnbmVkIGludCAqdGhyZWFkKTsKIAotLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLQogLyoqCiAgKiBvZl9pcnFfbWFwX3BjaSAtIFJlc29sdmUgdGhlIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlCiAgKiBAcGRldjoJdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaAppbmRleCAzN2RiOTZhLi5hMTBiZWM2IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHZyLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3B2ci5oCkBAIC0xLDkgKzEsOSBAQAogLyoKICAqIFN1cHBvcnQgZm9yIHRoZSBNaWNyb0JsYXplIFBWUiAoUHJvY2Vzc29yIFZlcnNpb24gUmVnaXN0ZXIpCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhbCBTaW1layA8bW9uc3RyQG1vbnN0ci5ldT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTEgTWljaGFsIFNpbWVrIDxtb25zdHJAbW9uc3RyLmV1PgogICogQ29weXJpZ2h0IChDKSAyMDA3IEpvaG4gV2lsbGlhbXMgPGpvaG4ud2lsbGlhbXNAcGV0YWxvZ2l4LmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNyAtIDIwMDkgUGV0YUxvZ2l4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgLSAyMDExIFBldGFMb2dpeAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtNDYsMTEgKzQ2LDExIEBACiAjZGVmaW5lIFBWUjJfSV9MTUJfTUFTSwkJCTB4MTAwMDAwMDAKICNkZWZpbmUgUFZSMl9JTlRFUlJVUFRfSVNfRURHRV9NQVNLCTB4MDgwMDAwMDAKICNkZWZpbmUgUFZSMl9FREdFX0lTX1BPU0lUSVZFX01BU0sJMHgwNDAwMDAwMAotI2RlZmluZSBQVlIyX0RfUExCX01BU0sJCQkweDAyMDAwMDAwCS8qIG5ldyAqLwotI2RlZmluZSBQVlIyX0lfUExCX01BU0sJCQkweDAxMDAwMDAwCS8qIG5ldyAqLwotI2RlZmluZSBQVlIyX0lOVEVSQ09OTkVDVAkJMHgwMDgwMDAwMAkvKiBuZXcgKi8KLSNkZWZpbmUgUFZSMl9VU0VfRVhURU5EX0ZTTAkJMHgwMDA4MDAwMAkvKiBuZXcgKi8KLSNkZWZpbmUgUFZSMl9VU0VfRlNMX0VYQwkJMHgwMDA0MDAwMAkvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9EX1BMQl9NQVNLCQkJMHgwMjAwMDAwMCAvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9JX1BMQl9NQVNLCQkJMHgwMTAwMDAwMCAvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9JTlRFUkNPTk5FQ1QJCTB4MDA4MDAwMDAgLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0VYVEVORF9GU0wJCTB4MDAwODAwMDAgLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0ZTTF9FWEMJCTB4MDAwNDAwMDAgLyogbmV3ICovCiAjZGVmaW5lIFBWUjJfVVNFX01TUl9JTlNUUgkJMHgwMDAyMDAwMAogI2RlZmluZSBQVlIyX1VTRV9QQ01QX0lOU1RSCQkweDAwMDEwMDAwCiAjZGVmaW5lIFBWUjJfQVJFQV9PUFRJTUlTRUQJCTB4MDAwMDgwMDAKQEAgLTU5LDcgKzU5LDcgQEAKICNkZWZpbmUgUFZSMl9VU0VfSFdfTVVMX01BU0sJCTB4MDAwMDEwMDAKICNkZWZpbmUgUFZSMl9VU0VfRlBVX01BU0sJCTB4MDAwMDA4MDAKICNkZWZpbmUgUFZSMl9VU0VfTVVMNjRfTUFTSwkJMHgwMDAwMDQwMAotI2RlZmluZSBQVlIyX1VTRV9GUFUyX01BU0sJCTB4MDAwMDAyMDAJLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0ZQVTJfTUFTSwkJMHgwMDAwMDIwMCAvKiBuZXcgKi8KICNkZWZpbmUgUFZSMl9VU0VfSVBMQkVYQyAJCTB4MDAwMDAxMDAKICNkZWZpbmUgUFZSMl9VU0VfRFBMQkVYQwkJMHgwMDAwMDA4MAogI2RlZmluZSBQVlIyX09QQ09ERV8weDBfSUxMX01BU0sJMHgwMDAwMDA0MApAQCAtMTIyLDk2ICsxMjIsMTAzIEBACiAKIAogLyogUFZSIGFjY2VzcyBtYWNyb3MgKi8KLSNkZWZpbmUgUFZSX0lTX0ZVTEwocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1BWUl9GVUxMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfQkFSUkVMKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfQkFSUkVMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRElWKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfRElWX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfSFdfTVVMKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfSFdfTVVMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRlBVKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfRlBVX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRlBVMihwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX0ZQVTJfTUFTSykKLSNkZWZpbmUgUFZSX1VTRV9JQ0FDSEUocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1VTRV9JQ0FDSEVfTUFTSykKLSNkZWZpbmUgUFZSX1VTRV9EQ0FDSEUocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1VTRV9EQ0FDSEVfTUFTSykKLSNkZWZpbmUgUFZSX1ZFUlNJT04ocHZyKQkoKHB2ci5wdnJbMF0gJiBQVlIwX1ZFUlNJT05fTUFTSykgPj4gOCkKLSNkZWZpbmUgUFZSX1VTRVIxKHB2cikJCQkocHZyLnB2clswXSAmIFBWUjBfVVNFUjFfTUFTSykKLSNkZWZpbmUgUFZSX1VTRVIyKHB2cikJCQkocHZyLnB2clsxXSAmIFBWUjFfVVNFUjJfTUFTSykKKyNkZWZpbmUgUFZSX0lTX0ZVTEwoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9QVlJfRlVMTF9NQVNLKQorI2RlZmluZSBQVlJfVVNFX0JBUlJFTChfcHZyKQkoX3B2ci5wdnJbMF0gJiBQVlIwX1VTRV9CQVJSRUxfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9ESVYoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VfRElWX01BU0spCisjZGVmaW5lIFBWUl9VU0VfSFdfTVVMKF9wdnIpCShfcHZyLnB2clswXSAmIFBWUjBfVVNFX0hXX01VTF9NQVNLKQorI2RlZmluZSBQVlJfVVNFX0ZQVShfcHZyKQkoX3B2ci5wdnJbMF0gJiBQVlIwX1VTRV9GUFVfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9GUFUyKF9wdnIpCShfcHZyLnB2clsyXSAmIFBWUjJfVVNFX0ZQVTJfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9JQ0FDSEUoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VfSUNBQ0hFX01BU0spCisjZGVmaW5lIFBWUl9VU0VfRENBQ0hFKF9wdnIpCShfcHZyLnB2clswXSAmIFBWUjBfVVNFX0RDQUNIRV9NQVNLKQorI2RlZmluZSBQVlJfVkVSU0lPTihfcHZyKQkoKF9wdnIucHZyWzBdICYgUFZSMF9WRVJTSU9OX01BU0spID4+IDgpCisjZGVmaW5lIFBWUl9VU0VSMShfcHZyKQkJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VSMV9NQVNLKQorI2RlZmluZSBQVlJfVVNFUjIoX3B2cikJCShfcHZyLnB2clsxXSAmIFBWUjFfVVNFUjJfTUFTSykKIAotI2RlZmluZSBQVlJfRF9PUEIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9EX09QQl9NQVNLKQotI2RlZmluZSBQVlJfRF9MTUIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9EX0xNQl9NQVNLKQotI2RlZmluZSBQVlJfSV9PUEIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9JX09QQl9NQVNLKQotI2RlZmluZSBQVlJfSV9MTUIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9JX0xNQl9NQVNLKQotI2RlZmluZSBQVlJfSU5URVJSVVBUX0lTX0VER0UocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfSU5URVJSVVBUX0lTX0VER0VfTUFTSykKLSNkZWZpbmUgUFZSX0VER0VfSVNfUE9TSVRJVkUocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfRURHRV9JU19QT1NJVElWRV9NQVNLKQotI2RlZmluZSBQVlJfVVNFX01TUl9JTlNUUihwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX01TUl9JTlNUUikKLSNkZWZpbmUgUFZSX1VTRV9QQ01QX0lOU1RSKHB2cikJCShwdnIucHZyWzJdICYgUFZSMl9VU0VfUENNUF9JTlNUUikKLSNkZWZpbmUgUFZSX0FSRUFfT1BUSU1JU0VEKHB2cikJCShwdnIucHZyWzJdICYgUFZSMl9BUkVBX09QVElNSVNFRCkKLSNkZWZpbmUgUFZSX1VTRV9NVUw2NChwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX01VTDY0X01BU0spCi0jZGVmaW5lIFBWUl9PUENPREVfMHgwX0lMTEVHQUwocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfT1BDT0RFXzB4MF9JTExfTUFTSykKLSNkZWZpbmUgUFZSX1VOQUxJR05FRF9FWENFUFRJT04ocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfVU5BTElHTkVEX0VYQ19NQVNLKQotI2RlZmluZSBQVlJfSUxMX09QQ09ERV9FWENFUFRJT04ocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfSUxMX09QQ09ERV9FWENfTUFTSykKLSNkZWZpbmUgUFZSX0lPUEJfQlVTX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9JT1BCX0JVU19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0RPUEJfQlVTX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9ET1BCX0JVU19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0RJVl9aRVJPX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9ESVZfWkVST19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0ZQVV9FWENFUFRJT04ocHZyKQkJKHB2ci5wdnJbMl0gJiBQVlIyX0ZQVV9FWENfTUFTSykKLSNkZWZpbmUgUFZSX0ZTTF9FWENFUFRJT04ocHZyKQkJKHB2ci5wdnJbMl0gJiBQVlIyX1VTRV9FWFRFTkRfRlNMKQorI2RlZmluZSBQVlJfRF9PUEIoX3B2cikJCShfcHZyLnB2clsyXSAmIFBWUjJfRF9PUEJfTUFTSykKKyNkZWZpbmUgUFZSX0RfTE1CKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX0RfTE1CX01BU0spCisjZGVmaW5lIFBWUl9JX09QQihfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9JX09QQl9NQVNLKQorI2RlZmluZSBQVlJfSV9MTUIoX3B2cikJCShfcHZyLnB2clsyXSAmIFBWUjJfSV9MTUJfTUFTSykKKyNkZWZpbmUgUFZSX0lOVEVSUlVQVF9JU19FREdFKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfSU5URVJSVVBUX0lTX0VER0VfTUFTSykKKyNkZWZpbmUgUFZSX0VER0VfSVNfUE9TSVRJVkUoX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9FREdFX0lTX1BPU0lUSVZFX01BU0spCisjZGVmaW5lIFBWUl9VU0VfTVNSX0lOU1RSKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9NU1JfSU5TVFIpCisjZGVmaW5lIFBWUl9VU0VfUENNUF9JTlNUUihfcHZyKQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9QQ01QX0lOU1RSKQorI2RlZmluZSBQVlJfQVJFQV9PUFRJTUlTRUQoX3B2cikJKF9wdnIucHZyWzJdICYgUFZSMl9BUkVBX09QVElNSVNFRCkKKyNkZWZpbmUgUFZSX1VTRV9NVUw2NChfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9VU0VfTVVMNjRfTUFTSykKKyNkZWZpbmUgUFZSX09QQ09ERV8weDBfSUxMRUdBTChfcHZyKSBcCisJCQkoX3B2ci5wdnJbMl0gJiBQVlIyX09QQ09ERV8weDBfSUxMX01BU0spCisjZGVmaW5lIFBWUl9VTkFMSUdORURfRVhDRVBUSU9OKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfVU5BTElHTkVEX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfSUxMX09QQ09ERV9FWENFUFRJT04oX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9JTExfT1BDT0RFX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfSU9QQl9CVVNfRVhDRVBUSU9OKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfSU9QQl9CVVNfRVhDX01BU0spCisjZGVmaW5lIFBWUl9ET1BCX0JVU19FWENFUFRJT04oX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9ET1BCX0JVU19FWENfTUFTSykKKyNkZWZpbmUgUFZSX0RJVl9aRVJPX0VYQ0VQVElPTihfcHZyKSBcCisJCQkoX3B2ci5wdnJbMl0gJiBQVlIyX0RJVl9aRVJPX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfRlBVX0VYQ0VQVElPTihfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9GUFVfRVhDX01BU0spCisjZGVmaW5lIFBWUl9GU0xfRVhDRVBUSU9OKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9FWFRFTkRfRlNMKQogCi0jZGVmaW5lIFBWUl9ERUJVR19FTkFCTEVEKHB2cikJCShwdnIucHZyWzNdICYgUFZSM19ERUJVR19FTkFCTEVEX01BU0spCi0jZGVmaW5lIFBWUl9OVU1CRVJfT0ZfUENfQlJLKHB2cikgXAotCQkJKChwdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUENfQlJLX01BU0spID4+IDI1KQotI2RlZmluZSBQVlJfTlVNQkVSX09GX1JEX0FERFJfQlJLKHB2cikgXAotCQkJKChwdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUkRfQUREUl9CUktfTUFTSykgPj4gMTkpCi0jZGVmaW5lIFBWUl9OVU1CRVJfT0ZfV1JfQUREUl9CUksocHZyKSBcCi0JCQkoKHB2ci5wdnJbM10gJiBQVlIzX05VTUJFUl9PRl9XUl9BRERSX0JSS19NQVNLKSA+PiAxMykKLSNkZWZpbmUgUFZSX0ZTTF9MSU5LUyhwdnIpCSgocHZyLnB2clszXSAmIFBWUjNfRlNMX0xJTktTX01BU0spID4+IDcpCisjZGVmaW5lIFBWUl9ERUJVR19FTkFCTEVEKF9wdnIpCQkoX3B2ci5wdnJbM10gJiBQVlIzX0RFQlVHX0VOQUJMRURfTUFTSykKKyNkZWZpbmUgUFZSX05VTUJFUl9PRl9QQ19CUksoX3B2cikgXAorCQkJKChfcHZyLnB2clszXSAmIFBWUjNfTlVNQkVSX09GX1BDX0JSS19NQVNLKSA+PiAyNSkKKyNkZWZpbmUgUFZSX05VTUJFUl9PRl9SRF9BRERSX0JSSyhfcHZyKSBcCisJCQkoKF9wdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUkRfQUREUl9CUktfTUFTSykgPj4gMTkpCisjZGVmaW5lIFBWUl9OVU1CRVJfT0ZfV1JfQUREUl9CUksoX3B2cikgXAorCQkJKChfcHZyLnB2clszXSAmIFBWUjNfTlVNQkVSX09GX1dSX0FERFJfQlJLX01BU0spID4+IDEzKQorI2RlZmluZSBQVlJfRlNMX0xJTktTKF9wdnIpCSgoX3B2ci5wdnJbM10gJiBQVlIzX0ZTTF9MSU5LU19NQVNLKSA+PiA3KQogCi0jZGVmaW5lIFBWUl9JQ0FDSEVfQUREUl9UQUdfQklUUyhwdnIpIFwKLQkJCSgocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSykgPj4gMjYpCi0jZGVmaW5lIFBWUl9JQ0FDSEVfVVNFX0ZTTChwdnIpCQkocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX1VTRV9GU0xfTUFTSykKLSNkZWZpbmUgUFZSX0lDQUNIRV9BTExPV19XUihwdnIpCShwdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUxMT1dfV1JfTUFTSykKLSNkZWZpbmUgUFZSX0lDQUNIRV9MSU5FX0xFTihwdnIpIFwKLQkJCSgxIDw8ICgocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKLSNkZWZpbmUgUFZSX0lDQUNIRV9CWVRFX1NJWkUocHZyKSBcCi0JCQkoMSA8PCAoKHB2ci5wdnJbNF0gJiBQVlI0X0lDQUNIRV9CWVRFX1NJWkVfTUFTSykgPj4gMTYpKQorI2RlZmluZSBQVlJfSUNBQ0hFX0FERFJfVEFHX0JJVFMoX3B2cikgXAorCQkoKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUREUl9UQUdfQklUU19NQVNLKSA+PiAyNikKKyNkZWZpbmUgUFZSX0lDQUNIRV9VU0VfRlNMKF9wdnIpIFwKKwkJKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfVVNFX0ZTTF9NQVNLKQorI2RlZmluZSBQVlJfSUNBQ0hFX0FMTE9XX1dSKF9wdnIpIFwKKwkJKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUxMT1dfV1JfTUFTSykKKyNkZWZpbmUgUFZSX0lDQUNIRV9MSU5FX0xFTihfcHZyKSBcCisJCSgxIDw8ICgoX3B2ci5wdnJbNF0gJiBQVlI0X0lDQUNIRV9MSU5FX0xFTl9NQVNLKSA+PiAyMSkpCisjZGVmaW5lIFBWUl9JQ0FDSEVfQllURV9TSVpFKF9wdnIpIFwKKwkJKDEgPDwgKChfcHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0JZVEVfU0laRV9NQVNLKSA+PiAxNikpCiAKLSNkZWZpbmUgUFZSX0RDQUNIRV9BRERSX1RBR19CSVRTKHB2cikgXAotCQkJKChwdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQUREUl9UQUdfQklUU19NQVNLKSA+PiAyNikKLSNkZWZpbmUgUFZSX0RDQUNIRV9VU0VfRlNMKHB2cikJCShwdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfVVNFX0ZTTF9NQVNLKQotI2RlZmluZSBQVlJfRENBQ0hFX0FMTE9XX1dSKHB2cikJKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9BTExPV19XUl9NQVNLKQorI2RlZmluZSBQVlJfRENBQ0hFX0FERFJfVEFHX0JJVFMoX3B2cikgXAorCQkJKChfcHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSykgPj4gMjYpCisjZGVmaW5lIFBWUl9EQ0FDSEVfVVNFX0ZTTChfcHZyKQkoX3B2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfRlNMX01BU0spCisjZGVmaW5lIFBWUl9EQ0FDSEVfQUxMT1dfV1IoX3B2cikgXAorCQkJKF9wdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQUxMT1dfV1JfTUFTSykKIC8qIEZJWE1FIHR3byBzaGlmdHMgb24gb25lIGxpbmUgbmVlZHMgYW55IGNvbW1lbnQgKi8KLSNkZWZpbmUgUFZSX0RDQUNIRV9MSU5FX0xFTihwdnIpIFwKLQkJCSgxIDw8ICgocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKLSNkZWZpbmUgUFZSX0RDQUNIRV9CWVRFX1NJWkUocHZyKSBcCi0JCQkoMSA8PCAoKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9CWVRFX1NJWkVfTUFTSykgPj4gMTYpKQorI2RlZmluZSBQVlJfRENBQ0hFX0xJTkVfTEVOKF9wdnIpIFwKKwkJKDEgPDwgKChfcHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKKyNkZWZpbmUgUFZSX0RDQUNIRV9CWVRFX1NJWkUoX3B2cikgXAorCQkoMSA8PCAoKF9wdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQllURV9TSVpFX01BU0spID4+IDE2KSkKIAotI2RlZmluZSBQVlJfRENBQ0hFX1VTRV9XUklURUJBQ0socHZyKSBcCi0JCQkoKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfV1JJVEVCQUNLKSA+PiAxNCkKKyNkZWZpbmUgUFZSX0RDQUNIRV9VU0VfV1JJVEVCQUNLKF9wdnIpIFwKKwkJCSgoX3B2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfV1JJVEVCQUNLKSA+PiAxNCkKIAotI2RlZmluZSBQVlJfSUNBQ0hFX0JBU0VBRERSKHB2cikJKHB2ci5wdnJbNl0gJiBQVlI2X0lDQUNIRV9CQVNFQUREUl9NQVNLKQotI2RlZmluZSBQVlJfSUNBQ0hFX0hJR0hBRERSKHB2cikJKHB2ci5wdnJbN10gJiBQVlI3X0lDQUNIRV9ISUdIQUREUl9NQVNLKQorI2RlZmluZSBQVlJfSUNBQ0hFX0JBU0VBRERSKF9wdnIpIFwKKwkJCShfcHZyLnB2cls2XSAmIFBWUjZfSUNBQ0hFX0JBU0VBRERSX01BU0spCisjZGVmaW5lIFBWUl9JQ0FDSEVfSElHSEFERFIoX3B2cikgXAorCQkJKF9wdnIucHZyWzddICYgUFZSN19JQ0FDSEVfSElHSEFERFJfTUFTSykKKyNkZWZpbmUgUFZSX0RDQUNIRV9CQVNFQUREUihfcHZyKSBcCisJCQkoX3B2ci5wdnJbOF0gJiBQVlI4X0RDQUNIRV9CQVNFQUREUl9NQVNLKQorI2RlZmluZSBQVlJfRENBQ0hFX0hJR0hBRERSKF9wdnIpIFwKKwkJCShfcHZyLnB2cls5XSAmIFBWUjlfRENBQ0hFX0hJR0hBRERSX01BU0spCiAKLSNkZWZpbmUgUFZSX0RDQUNIRV9CQVNFQUREUihwdnIpCShwdnIucHZyWzhdICYgUFZSOF9EQ0FDSEVfQkFTRUFERFJfTUFTSykKLSNkZWZpbmUgUFZSX0RDQUNIRV9ISUdIQUREUihwdnIpCShwdnIucHZyWzldICYgUFZSOV9EQ0FDSEVfSElHSEFERFJfTUFTSykKKyNkZWZpbmUgUFZSX1RBUkdFVF9GQU1JTFkoX3B2cikgXAorCQkJKChfcHZyLnB2clsxMF0gJiBQVlIxMF9UQVJHRVRfRkFNSUxZX01BU0spID4+IDI0KQogCi0jZGVmaW5lIFBWUl9UQVJHRVRfRkFNSUxZKHB2cikJKChwdnIucHZyWzEwXSAmIFBWUjEwX1RBUkdFVF9GQU1JTFlfTUFTSykgPj4gMjQpCi0KLSNkZWZpbmUgUFZSX01TUl9SRVNFVF9WQUxVRShwdnIpIFwKLQkJCQkocHZyLnB2clsxMV0gJiBQVlIxMV9NU1JfUkVTRVRfVkFMVUVfTUFTSykKKyNkZWZpbmUgUFZSX01TUl9SRVNFVF9WQUxVRShfcHZyKSBcCisJCQkoX3B2ci5wdnJbMTFdICYgUFZSMTFfTVNSX1JFU0VUX1ZBTFVFX01BU0spCiAKIC8qIG1tdSAqLwotI2RlZmluZSBQVlJfVVNFX01NVShwdnIpCSgocHZyLnB2clsxMV0gJiBQVlIxMV9VU0VfTU1VKSA+PiAzMCkKLSNkZWZpbmUgUFZSX01NVV9JVExCX1NJWkUocHZyKQkocHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfSVRMQl9TSVpFKQotI2RlZmluZSBQVlJfTU1VX0RUTEJfU0laRShwdnIpCShwdnIucHZyWzExXSAmIFBWUjExX01NVV9EVExCX1NJWkUpCi0jZGVmaW5lIFBWUl9NTVVfVExCX0FDQ0VTUyhwdnIpCShwdnIucHZyWzExXSAmIFBWUjExX01NVV9UTEJfQUNDRVNTKQotI2RlZmluZSBQVlJfTU1VX1pPTkVTKHB2cikJKHB2ci5wdnJbMTFdICYgUFZSMTFfTU1VX1pPTkVTKQorI2RlZmluZSBQVlJfVVNFX01NVShfcHZyKQkJKChfcHZyLnB2clsxMV0gJiBQVlIxMV9VU0VfTU1VKSA+PiAzMCkKKyNkZWZpbmUgUFZSX01NVV9JVExCX1NJWkUoX3B2cikJCShfcHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfSVRMQl9TSVpFKQorI2RlZmluZSBQVlJfTU1VX0RUTEJfU0laRShfcHZyKQkJKF9wdnIucHZyWzExXSAmIFBWUjExX01NVV9EVExCX1NJWkUpCisjZGVmaW5lIFBWUl9NTVVfVExCX0FDQ0VTUyhfcHZyKQkoX3B2ci5wdnJbMTFdICYgUFZSMTFfTU1VX1RMQl9BQ0NFU1MpCisjZGVmaW5lIFBWUl9NTVVfWk9ORVMoX3B2cikJCShfcHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfWk9ORVMpCiAKIC8qIGVuZGlhbiAqLwotI2RlZmluZSBQVlJfRU5ESUFOKHB2cikJKHB2ci5wdnJbMF0gJiBQVlIwX0VOREkpCisjZGVmaW5lIFBWUl9FTkRJQU4oX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9FTkRJKQogCiBpbnQgY3B1X2hhc19wdnIodm9pZCk7CiB2b2lkIGdldF9wdnIoc3RydWN0IHB2cl9zICpwdnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCmluZGV4IDg3Yzc5ZmEuLjJjMzA5ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAl7IjcuMzAuYSIsIDB4MTB9LAogCXsiNy4zMC5iIiwgMHgxMX0sCiAJeyI4LjAwLmEiLCAweDEyfSwKKwl7IjguMDAuYiIsIDB4MTN9LAogCXtOVUxMLCAwfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUwppbmRleCA4MTkyMzhiLi40MWMzMGNkIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TCkBAIC0yODcsMjUgKzI4Nyw0NCBAQAogICogYXJlIG1hc2tlZC4gVGhpcyBpcyBuaWNlLCBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIENMSSBiZWZvcmUgc3RhdGUgc2F2ZQogICovCiBDX0VOVFJZKF91c2VyX2V4Y2VwdGlvbik6Ci0JYWRkaQlyMTQsIHIxNCwgNAkvKiByZXR1cm4gYWRkcmVzcyBpcyA0IGJ5dGUgYWZ0ZXIgY2FsbCAqLwogCXN3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSkgLyogc2F2ZSBzdGFjayAqLworCWFkZGkJcjE0LCByMTQsIDQJLyogcmV0dXJuIGFkZHJlc3MgaXMgNCBieXRlIGFmdGVyIGNhbGwgKi8KIAorCW1mcwlyMSwgcm1zcgorCW5vcAorCWFuZGkJcjEsIHIxLCBNU1JfVU1TCisJYm5laQlyMSwgMWYKKworLyogS2VybmVsLW1vZGUgc3RhdGUgc2F2ZSAtIGtlcm5lbCBleGVjdmUgKi8KKwlsd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpOyAvKiBSZWxvYWQga2VybmVsIHN0YWNrLXB0ciovCisJdG9waHlzKHIxLHIxKTsKKworCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgLyogTWFrZSByb29tIG9uIHRoZSBzdGFjay4gKi8KKwlTQVZFX1JFR1MKKworCXN3aQlyMSwgcjEsIFBUTyArIFBUX01PREU7IC8qIHB0X3JlZ3MgLT4ga2VybmVsIG1vZGUgKi8KKwlicmlkCTJmOworCW5vcDsJCQkJLyogRmlsbCBkZWxheSBzbG90ICovCisKKy8qIFVzZXItbW9kZSBzdGF0ZSBzYXZlLiAgKi8KKzE6CiAJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7IC8qIGdldCBzYXZlZCBjdXJyZW50ICovCiAJdG9waHlzKHIxLHIxKTsKIAlsd2kJcjEsIHIxLCBUU19USFJFQURfSU5GTzsJLyogZ2V0IHN0YWNrIGZyb20gdGFza19zdHJ1Y3QgKi8KLQkvKiBNUyB0aGVzZSB0aHJlZSBpbnN0cnVjdGlvbnMgY2FuIGJlIGFkZGVkIHRvIG9uZSAqLwotCS8qIGFkZGlrCXIxLCByMSwgVEhSRUFEX1NJWkU7ICovCi0JLyogdG9waHlzKHIxLHIxKTsgKi8KLQkvKiBhZGRpawlyMSwgcjEsIC1TVEFURV9TQVZFX1NJWkU7ICovCi0JYWRkaWsgcjEsIHIxLCBUSFJFQURfU0laRSArIENPTkZJR19LRVJORUxfQkFTRV9BRERSIC0gQ09ORklHX0tFUk5FTF9TVEFSVCAtIFNUQVRFX1NBVkVfU0laRTsKKy8qIGNhbGN1bGF0ZSBrZXJuZWwgc3RhY2sgcG9pbnRlciBmcm9tIHRhc2sgc3RydWN0IDhrICovCisJYWRkaWsJcjEsIHIxLCBUSFJFQURfU0laRTsKKwl0b3BoeXMocjEscjEpOworCisJYWRkaWsJcjEsIHIxLCAtU1RBVEVfU0FWRV9TSVpFOyAvKiBNYWtlIHJvb20gb24gdGhlIHN0YWNrLiAgKi8KIAlTQVZFX1JFR1MKIAlzd2kJcjAsIHIxLCBQVE8gKyBQVF9SMwogCXN3aQlyMCwgcjEsIFBUTyArIFBUX1I0CiAKKwlzd2kJcjAsIHIxLCBQVE8gKyBQVF9NT0RFOwkJCS8qIFdhcyBpbiB1c2VyLW1vZGUuICovCiAJbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CiAJc3dpCXIxMSwgcjEsIFBUTytQVF9SMTsJCS8qIFN0b3JlIHVzZXIgU1AuICAqLwogCWNsZWFyX3VtczsKLQlsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CisyOglsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CiAJLyogU2F2ZSBhd2F5IHRoZSBzeXNjYWxsIG51bWJlci4gICovCiAJc3dpCXIxMiwgcjEsIFBUTytQVF9SMDsKIAl0b3ZpcnQocjEscjEpCkBAIC0zNzUsNiArMzk0LDkgQEAKIAlzd2kJcjMsIHIxLCBQVE8gKyBQVF9SMwogCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0CiAKKwlsd2kJcjExLCByMSwgUFRPICsgUFRfTU9ERTsKKy8qIFNlZSBpZiByZXR1cm5pbmcgdG8ga2VybmVsIG1vZGUsIGlmIHNvLCBza2lwIHJlc2NoZWQgJmMuICAqLworCWJuZWkJcjExLCAyZjsKIAkvKiBXZSdyZSByZXR1cm5pbmcgdG8gdXNlciBtb2RlLCBzbyBjaGVjayBmb3IgdmFyaW91cyBjb25kaXRpb25zIHRoYXQKIAkgKiB0cmlnZ2VyIHJlc2NoZWR1bGluZy4gKi8KIAkvKiBGSVhNRTogUmVzdHJ1Y3R1cmUgYWxsIHRoZXNlIGZsYWcgY2hlY2tzLiAqLwpAQCAtNDE3LDYgKzQzOSwxNiBAQAogCVJFU1RPUkVfUkVHUzsKIAlhZGRpawlyMSwgcjEsIFNUQVRFX1NBVkVfU0laRQkJLyogQ2xlYW4gdXAgc3RhY2sgc3BhY2UuICAqLwogCWx3aQlyMSwgcjEsIFBUX1IxIC0gUFRfU0laRTsvKiBSZXN0b3JlIHVzZXIgc3RhY2sgcG9pbnRlci4gKi8KKwlicmkJNmY7CisKKy8qIFJldHVybiB0byBrZXJuZWwgc3RhdGUuICAqLworMjoJc2V0X2JpcDsJCQkvKiAgSW50cyBtYXNrZWQgZm9yIHN0YXRlIHJlc3RvcmUgKi8KKwlWTV9PRkY7CisJdG9waHlzKHIxLHIxKTsKKwlSRVNUT1JFX1JFR1M7CisJYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KKwl0b3ZpcnQocjEscjEpOworNjoKIFRSQVBfcmV0dXJuOgkJLyogTWFrZSBnbG9iYWwgc3ltYm9sIGZvciBkZWJ1Z2dpbmcgKi8KIAlydGJkCXIxNCwgMDsJLyogSW5zdHJ1Y3Rpb25zIHRvIHJldHVybiBmcm9tIGFuIElSUSAqLwogCW5vcDsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKaW5kZXggNDc4ZjI5NC4uYTdmYTZhZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNkZWZpbmUgTUlDUk9CTEFaRV9JTExfT1BDT0RFX0VYQ0VQVElPTgkweDAyCiAjZGVmaW5lIE1JQ1JPQkxBWkVfSUJVU19FWENFUFRJT04JMHgwMwpAQCAtNTIsNiArNTMsOCBAQAogdm9pZCBzd19leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJX2V4Y2VwdGlvbihTSUdUUkFQLCByZWdzLCBUUkFQX0JSS1BULCByZWdzLT5yMTYpOworCWZsdXNoX2RjYWNoZV9yYW5nZShyZWdzLT5yMTYsIHJlZ3MtPnIxNiArIDB4NCk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKHJlZ3MtPnIxNiwgcmVncy0+cjE2ICsgMHg0KTsKIH0KIAogdm9pZCBfZXhjZXB0aW9uKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2h3X2V4Y2VwdGlvbl9oYW5kbGVyLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2h3X2V4Y2VwdGlvbl9oYW5kbGVyLlMKaW5kZXggNzgxMTk1NC4uMjVmNmUwNyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9od19leGNlcHRpb25faGFuZGxlci5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUwpAQCAtOTQ1LDExICs5NDUsMjAgQEAKIHN0b3JlNDoJc2JpCXIzLCByNCwgMzsJLyogRGVsYXkgc2xvdCAqLwogZXhfc2h3X3ZtOgogCS8qIFN0b3JlIHRoZSBsb3dlciBoYWxmLXdvcmQsIGJ5dGUtYnktYnl0ZSBpbnRvIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyNpZmRlZiBfX01JQ1JPQkxBWkVFTF9fCisJbGJ1aQlyMywgcjUsIDA7CitzdG9yZTU6CXNiaQlyMywgcjQsIDA7CisJbGJ1aQlyMywgcjUsIDE7CisJYnJpZAlyZXRfZnJvbV9leGM7CitzdG9yZTY6CXNiaQlyMywgcjQsIDE7CS8qIERlbGF5IHNsb3QgKi8KKyNlbHNlCiAJbGJ1aQlyMywgcjUsIDI7CiBzdG9yZTU6CXNiaQlyMywgcjQsIDA7CiAJbGJ1aQlyMywgcjUsIDM7CiAJYnJpZAlyZXRfZnJvbV9leGM7CiBzdG9yZTY6CXNiaQlyMywgcjQsIDE7CS8qIERlbGF5IHNsb3QgKi8KKyNlbmRpZgorCiBleF9zd19lbmRfdm06CQkJLyogRXhjZXB0aW9uIGhhbmRsaW5nIG9mIHN0b3JlIHdvcmQsIGVuZHMuICovCiAKIC8qIFdlIGhhdmUgdG8gcHJldmVudCBjYXNlcyB0aGF0IGdldC9wdXRfdXNlciBtYWNyb3MgZ2V0IHVuYWxpZ25lZCBwb2ludGVyCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb20uYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbS5jCmluZGV4IGExMDUzMDEuLmM4ODEzOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbS5jCkBAIC02MSwxNCArNjEsMTIgQEAKIAljaGFyICpwOwogCWludCAqYWRkcjsKIAotCXByX2RlYnVnKCJzZWFyY2ggXCJjaG9zZW5cIiwgZGVwdGg6ICVkLCB1bmFtZTogJXNcbiIsIGRlcHRoLCB1bmFtZSk7CisJcHJfZGVidWcoInNlYXJjaCBcInNlcmlhbFwiLCBkZXB0aDogJWQsIHVuYW1lOiAlc1xuIiwgZGVwdGgsIHVuYW1lKTsKIAogLyogZmluZCBhbGwgc2VyaWFsIG5vZGVzICovCiAJaWYgKHN0cm5jbXAodW5hbWUsICJzZXJpYWwiLCA2KSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCWVhcmx5X2luaXRfZHRfY2hlY2tfZm9yX2luaXRyZChub2RlKTsKLQogLyogZmluZCBjb21wYXRpYmxlIG5vZGUgd2l0aCB1YXJ0bGl0ZSAqLwogCXAgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJjb21wYXRpYmxlIiwgJmwpOwogCWlmICgoc3RybmNtcChwLCAieGxueCx4cHMtdWFydGxpdGUiLCAxNykgIT0gMCkgJiYKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggOTlkOWI2MS4uOWFlMjRmNCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTExMCw0MSArMTEwLDMgQEAKIAljZWxscyA9IHByb3AgPyAqKHUzMiAqKXByb3AgOiBvZl9uX3NpemVfY2VsbHMoZG4pOwogCSpzaXplID0gb2ZfcmVhZF9udW1iZXIoZG1hX3dpbmRvdywgY2VsbHMpOwogfQotCi0vKioKLSAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKLSAqIGNoZWNrZWQgZmlyc3QsIGJlY2F1c2UgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRvICJtb3N0IHJlY2VudCIgTUFDCi0gKiBhZGRyZXNzLiBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiAnbG9jYWwtbWFjLWFkZHJlc3MnIGlzIGNoZWNrZWQgbmV4dCwKLSAqIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCBhZGRyZXNzLiAgSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gdGhlIG9ic29sZXRlCi0gKiAnYWRkcmVzcycgaXMgY2hlY2tlZCwganVzdCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGFuIG9sZCBkZXZpY2UgdHJlZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlICdhZGRyZXNzJyBwcm9wZXJ0eSBpcyBzdXBwb3NlZCB0byBjb250YWluIGEgdmlydHVhbCBhZGRyZXNzIG9mCi0gKiB0aGUgcmVnaXN0ZXIgc2V0LCBidXQgc29tZSBEVFMgZmlsZXMgaGF2ZSByZWRlZmluZWQgdGhhdCBwcm9wZXJ0eSB0byBiZSB0aGUKLSAqIE1BQyBhZGRyZXNzLgotICoKLSAqIEFsbC16ZXJvIE1BQyBhZGRyZXNzZXMgYXJlIHJlamVjdGVkLCBiZWNhdXNlIHRob3NlIGNvdWxkIGJlIHByb3BlcnRpZXMgdGhhdAotICogZXhpc3QgaW4gdGhlIGRldmljZSB0cmVlLCBidXQgd2VyZSBub3Qgc2V0IGJ5IFUtQm9vdC4gIEZvciBleGFtcGxlLCB0aGUKLSAqIERUUyBjb3VsZCBkZWZpbmUgJ21hYy1hZGRyZXNzJyBhbmQgJ2xvY2FsLW1hYy1hZGRyZXNzJywgd2l0aCB6ZXJvIE1BQwotICogYWRkcmVzc2VzLiAgU29tZSBvbGRlciBVLUJvb3RzIG9ubHkgaW5pdGlhbGl6ZWQgJ2xvY2FsLW1hYy1hZGRyZXNzJy4gIEluCi0gKiB0aGlzIGNhc2UsIHRoZSByZWFsIE1BQyBpcyBpbiAnbG9jYWwtbWFjLWFkZHJlc3MnLCBhbmQgJ21hYy1hZGRyZXNzJyBleGlzdHMKLSAqIGJ1dCBpcyBhbGwgemVyb3MuCi0qLwotY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcDsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2dldF9tYWNfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggOTZhODhjMy4uMzQ1MWJkZSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTIzLDIwICsxMjMsMTAgQEAKIAogCV9faW5pdF9lbmRfYmVmb3JlX2luaXRyYW1mcyA9IC47CiAKLQkuaW5pdC5yYW1mcyBBTElHTihQQUdFX1NJWkUpIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgewotCQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JCSooLmluaXQucmFtZnMpCi0JCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0JCS4gPSBBTElHTig0KTsKLQkJTE9ORygwKTsKLS8qCi0gKiBGSVhNRSB0aGlzIGNhbiBicmVhayBpbml0cmFtZnMgZm9yIE1NVS4KLSAqIFBhZCBpbml0LnJhbWZzIHVwIHRvIHBhZ2UgYm91bmRhcnksCi0gKiBzbyB0aGF0IF9faW5pdF9lbmQgPT0gX19ic3Nfc3RhcnQuIFRoaXMgd2lsbCBtYWtlIGltYWdlLmVsZgotICogY29uc2lzdGVudCB3aXRoIHRoZSBpbWFnZS5iaW4KLSAqLwotCQkvKiAuID0gQUxJR04oUEFHRV9TSVpFKTsgKi8KKwkuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJSU5JVF9SQU1fRlMKIAl9CisKIAlfX2luaXRfZW5kID0gLjsKIAogCS5ic3MgQUxJR04gKFBBR0VfU0laRSkgOiBBVChBRERSKC5ic3MpIC0gTE9BRF9PRkZTRVQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9saWIvbWVtbW92ZS5jIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1tb3ZlLmMKaW5kZXggMTIzZTM2MS4uODEwZmQ2OCAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1tb3ZlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1tb3ZlLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQkJZm9yICg7IGMgPj0gNDsgYyAtPSA0KSB7CiAJCQkJdmFsdWUgPSAqLS1pX3NyYzsKIAkJCQkqLS1pX2RzdCA9IGJ1Zl9ob2xkIHwgKCh2YWx1ZSAmIDB4RkYwMDAwMDApPj4gMjQpOwotCQkJCWJ1Zl9ob2xkID0gKHZhbHVlICYgMHhGRkZGRkYpIDw8IDg7OworCQkJCWJ1Zl9ob2xkID0gKHZhbHVlICYgMHhGRkZGRkYpIDw8IDg7CiAJCQl9CiAjZW5kaWYKIAkJCS8qIFJlYWxpZ24gdGhlIHNvdXJjZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuUyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvbXVsZGkzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWFhOGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuUworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCi0vKgotICogTXVsdGlwbHkgb3BlcmF0aW9uIGZvciA2NCBiaXQgaW50ZWdlcnMsIGZvciBkZXZpY2VzIHdpdGggaGFyZCBtdWx0aXBseQotICoJSW5wdXQgOglPcGVyYW5kMVtIXSBpbiBSZWcgcjUKLSAqCQlPcGVyYW5kMVtMXSBpbiBSZWcgcjYKLSAqCQlPcGVyYW5kMltIXSBpbiBSZWcgcjcKLSAqCQlPcGVyYW5kMltMXSBpbiBSZWcgcjgKLSAqCU91dHB1dDogUmVzdWx0W0hdIGluIFJlZyByMwotICoJCVJlc3VsdFtMXSBpbiBSZWcgcjQKLSAqCi0gKiBFeHBsYWluYXRpb246Ci0gKgotICoJQm90aCB0aGUgaW5wdXQgbnVtYmVycyBhcmUgZGl2aWRlZCBpbnRvIDE2IGJpdCBudW1iZXIgYXMgZm9sbG93cwotICoJCW9wMSA9IEEgQiBDIEQKLSAqCQlvcDIgPSBFIEYgRyBICi0gKglyZXN1bHQgPSBEICogSAotICoJCSArIChDICogSCArIEQgKiBHKSA8PCAxNgotICoJCSArIChCICogSCArIEMgKiBHICsgRCAqIEYpIDw8IDMyCi0gKgkJICsgKEEgKiBIICsgQiAqIEcgKyBDICogRiArIEQgKiBFKSA8PCA0OAotICoKLSAqCU9ubHkgNjQgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSBjb25zaWRlcmVkCi0gKi8KLQotCS50ZXh0Ci0JLmdsb2JsCV9fbXVsZGkzCi0JLnR5cGUgX19tdWxkaTMsIEBmdW5jdGlvbgotCS5lbnQgX19tdWxkaTMKLQotX19tdWxkaTM6Ci0JYWRkaQlyMSwgcjEsIC00MAotCi0vKiBTYXZlIHRoZSBpbnB1dCBvcGVyYW5kcyBvbiB0aGUgY2FsbGVyJ3Mgc3RhY2sgKi8KLQlzd2kJcjUsIHIxLCA0NAotCXN3aQlyNiwgcjEsIDQ4Ci0Jc3dpCXI3LCByMSwgNTIKLQlzd2kJcjgsIHIxLCA1NgotCi0vKiBTdG9yZSBhbGwgdGhlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgKi8KLQlzdwlyMjAsIHIxLCByMAotCXN3aQlyMjEsIHIxLCA0Ci0Jc3dpCXIyMiwgcjEsIDgKLQlzd2kJcjIzLCByMSwgMTIKLQlzd2kJcjI0LCByMSwgMTYKLQlzd2kJcjI1LCByMSwgMjAKLQlzd2kJcjI2LCByMSwgMjQKLQlzd2kJcjI3LCByMSwgMjgKLQotLyogTG9hZCBhbGwgdGhlIDE2IGJpdCB2YWx1ZXMgZm9yIEEgdGhydSBIICovCi0JbGh1aQlyMjAsIHIxLCA0NCAvKiBBICovCi0JbGh1aQlyMjEsIHIxLCA0NiAvKiBCICovCi0JbGh1aQlyMjIsIHIxLCA0OCAvKiBDICovCi0JbGh1aQlyMjMsIHIxLCA1MCAvKiBEICovCi0JbGh1aQlyMjQsIHIxLCA1MiAvKiBFICovCi0JbGh1aQlyMjUsIHIxLCA1NCAvKiBGICovCi0JbGh1aQlyMjYsIHIxLCA1NiAvKiBHICovCi0JbGh1aQlyMjcsIHIxLCA1OCAvKiBIICovCi0KLS8qIEQgKiBIID09PiBMU0Igb2YgdGhlIHJlc3VsdCBvbiBzdGFjayA9PT4gU3RvcmUxICovCi0JbXVsCXI5LCByMjMsIHIyNwotCXN3aQlyOSwgcjEsIDM2IC8qIFBvczIgYW5kIFBvczMgKi8KLQotLyogSGkgKFN0b3JlMSkgKyBDICogSCArIEQgKiBHID09PiBTdG9yZTIgPT0+IFBvczEgYW5kIFBvczIgKi8KLS8qIFN0b3JlIHRoZSBjYXJyeSBnZW5lcmF0ZWQgaW4gcG9zaXRpb24gMiBmb3IgUG9zIDMgKi8KLQlsaHVpCXIxMSwgcjEsIDM2IC8qIFBvczIgKi8KLQltdWwJcjksIHIyMiwgcjI3IC8qIEMgKiBIICovCi0JbXVsCXIxMCwgcjIzLCByMjYgLyogRCAqIEcgKi8KLQlhZGQJcjksIHI5LCByMTAKLQlhZGRjCXIxMiwgcjAsIHIwCi0JYWRkCXI5LCByOSwgcjExCi0JYWRkYwlyMTIsIHIxMiwgcjAgLyogU3RvcmUgdGhlIENhcnJ5ICovCi0Jc2hpCXI5LCByMSwgMzYgLyogU3RvcmUgUG9zMiAqLwotCXN3aQlyOSwgcjEsIDMyCi0JbGh1aQlyMTEsIHIxLCAzMgotCXNoaQlyMTEsIHIxLCAzNCAvKiBTdG9yZSBQb3MxICovCi0KLS8qIEhpIChTdG9yZTIpICsgQiAqIEggKyBDICogRyArIEQgKiBGID09PiBTdG9yZTMgPT0+IFBvczAgYW5kIFBvczEgKi8KLQltdWwJcjksIHIyMSwgcjI3IC8qIEIgKiBIICovCi0JbXVsCXIxMCwgcjIyLCByMjYgLyogQyAqIEcgKi8KLQltdWwJcjcsIHIyMywgcjI1IC8qIEQgKiBGICovCi0JYWRkCXI5LCByOSwgcjExCi0JYWRkCXI5LCByOSwgcjEwCi0JYWRkCXI5LCByOSwgcjcKLQlzd2kJcjksIHIxLCAzMiAvKiBQb3MwIGFuZCBQb3MxICovCi0KLS8qIEhpIChTdG9yZTMpICsgQSAqIEggKyBCICogRyArIEMgKiBGICsgRCAqIEUgPT0+IFN0b3JlMyA9PT4gUG9zMCAqLwotCWxodWkJcjExLCByMSwgMzIgLyogUG9zMCAqLwotCW11bAlyOSwgcjIwLCByMjcgLyogQSAqIEggKi8KLQltdWwJcjEwLCByMjEsIHIyNiAvKiBCICogRyAqLwotCW11bAlyNywgcjIyLCByMjUgLyogQyAqIEYgKi8KLQltdWwJcjgsIHIyMywgcjI0IC8qIEQgKiBFICovCi0JYWRkCXI5LCByOSwgcjExCi0JYWRkIAlyOSwgcjksIHIxMAotCWFkZAlyOSwgcjksIHI3Ci0JYWRkCXI5LCByOSwgcjgKLQlzZXh0MTYJcjksIHI5IC8qIFNpZ24gZXh0ZW5kIHRoZSBNU0IgKi8KLQlzaGkJcjksIHIxLCAzMgotCi0vKiBNb3ZlIHJlc3VsdHMgdG8gcjMgYW5kIHI0ICovCi0JbGh1aQlyMywgcjEsIDMyCi0JYWRkCXIzLCByMywgcjEyCi0Jc2hpCXIzLCByMSwgMzIKLQlsd2kJcjMsIHIxLCAzMiAvKiBIaSBQYXJ0ICovCi0JbHdpCXI0LCByMSwgMzYgLyogTG8gUGFydCAqLwotCi0vKiBSZXN0b3JlIENhbGxlZSBzYXZlZCByZWdpc3RlcnMgKi8KLQlsdwlyMjAsIHIxLCByMAotCWx3aQlyMjEsIHIxLCA0Ci0JbHdpCXIyMiwgcjEsIDgKLQlsd2kJcjIzLCByMSwgMTIKLQlsd2kJcjI0LCByMSwgMTYKLQlsd2kJcjI1LCByMSwgMjAKLQlsd2kJcjI2LCByMSwgMjQKLQlsd2kJcjI3LCByMSwgMjgKLQotLyogUmVzdG9yZSBGcmFtZSBhbmQgcmV0dXJuICovCi0JcnRzZAlyMTUsIDgKLQlhZGRpCXIxLCByMSwgNDAKLQotLnNpemUgX19tdWxkaTMsIC4gLSBfX211bGRpMwotLmVuZCBfX211bGRpMwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuYyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvbXVsZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4NjBlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9saWIvbXVsZGkzLmMKQEAgLTAsMCArMSw2MCBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibGliZ2NjLmgiCisKKyNkZWZpbmUgRFd0eXBlIGxvbmcgbG9uZworI2RlZmluZSBVV3R5cGUgdW5zaWduZWQgbG9uZworI2RlZmluZSBVSFd0eXBlIHVuc2lnbmVkIHNob3J0CisKKyNkZWZpbmUgV19UWVBFX1NJWkUgMzIKKworI2RlZmluZSBfX2xsX0IgKChVV3R5cGUpIDEgPDwgKFdfVFlQRV9TSVpFIC8gMikpCisjZGVmaW5lIF9fbGxfbG93cGFydCh0KSAoKFVXdHlwZSkgKHQpICYgKF9fbGxfQiAtIDEpKQorI2RlZmluZSBfX2xsX2hpZ2hwYXJ0KHQpICgoVVd0eXBlKSAodCkgPj4gKFdfVFlQRV9TSVpFIC8gMikpCisKKy8qIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgdW11bF9wcG1tLCBkZWZpbmUgaXQgdXNpbmcgcGxhaW4gQy4gICovCisjaWYgIWRlZmluZWQodW11bF9wcG1tKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCVVXdHlwZSBfX3gwLCBfX3gxLCBfX3gyLCBfX3gzOwkJCQlcCisJCVVIV3R5cGUgX191bCwgX192bCwgX191aCwgX192aDsJCQkJXAorCQkJCQkJCQkJXAorCQlfX3VsID0gX19sbF9sb3dwYXJ0KHUpOwkJCQkJXAorCQlfX3VoID0gX19sbF9oaWdocGFydCh1KTsJCQkJXAorCQlfX3ZsID0gX19sbF9sb3dwYXJ0KHYpOwkJCQkJXAorCQlfX3ZoID0gX19sbF9oaWdocGFydCh2KTsJCQkJXAorCQkJCQkJCQkJXAorCQlfX3gwID0gKFVXdHlwZSkgX191bCAqIF9fdmw7CQkJCVwKKwkJX194MSA9IChVV3R5cGUpIF9fdWwgKiBfX3ZoOwkJCQlcCisJCV9feDIgPSAoVVd0eXBlKSBfX3VoICogX192bDsJCQkJXAorCQlfX3gzID0gKFVXdHlwZSkgX191aCAqIF9fdmg7CQkJCVwKKwkJCQkJCQkJCVwKKwkJX194MSArPSBfX2xsX2hpZ2hwYXJ0KF9feDApOyAvKiB0aGlzIGNhbid0IGdpdmUgY2FycnkgKi9cCisJCV9feDEgKz0gX194MjsgLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLwkJCVwKKwkJaWYgKF9feDEgPCBfX3gyKSAvKiBkaWQgd2UgZ2V0IGl0PyAqLwkJCVwKKwkJX194MyArPSBfX2xsX0I7IC8qIHllcywgYWRkIGl0IGluIHRoZSBwcm9wZXIgcG9zICovCVwKKwkJCQkJCQkJCVwKKwkJKHcxKSA9IF9feDMgKyBfX2xsX2hpZ2hwYXJ0KF9feDEpOwkJCVwKKwkJKHcwKSA9IF9fbGxfbG93cGFydChfX3gxKSAqIF9fbGxfQiArIF9fbGxfbG93cGFydChfX3gwKTtcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX191bXVsc2lkaTMpCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpICh7CQkJCVwKKwlEV3VuaW9uIF9fdzsJCQkJCVwKKwl1bXVsX3BwbW0oX193LnMuaGlnaCwgX193LnMubG93LCB1LCB2KTsJCVwKKwlfX3cubGw7CQkJCQkJXAorCX0pCisjZW5kaWYKKworRFd0eXBlIF9fbXVsZGkzKERXdHlwZSB1LCBEV3R5cGUgdikKK3sKKwljb25zdCBEV3VuaW9uIHV1ID0gey5sbCA9IHV9OworCWNvbnN0IERXdW5pb24gdnYgPSB7LmxsID0gdn07CisJRFd1bmlvbiB3ID0gey5sbCA9IF9fdW11bHNpZGkzKHV1LnMubG93LCB2di5zLmxvdyl9OworCisJdy5zLmhpZ2ggKz0gKChVV3R5cGUpIHV1LnMubG93ICogKFVXdHlwZSkgdnYucy5oaWdoCisJCSsgKFVXdHlwZSkgdXUucy5oaWdoICogKFVXdHlwZSkgdnYucy5sb3cpOworCisJcmV0dXJuIHcubGw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDBhOWI1YjguLmY0ODllYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0yMjE4LDcgKzIyMTgsNyBAQAogY29uZmlnIFVTRV9PRgogCWJvb2wgIkZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBzdXBwb3J0IgogCXNlbGVjdCBPRgotCXNlbGVjdCBPRl9GTEFUVFJFRQorCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgZmxhdHRlbmVkIGRldmljZSB0cmVlIG1hY2hpbmUgZGVzY3JpcHRpb25zLgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcG93ZXIuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCmluZGV4IGU1OTE2YTUuLjY0N2U1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAlhdV93cml0ZWwoc2xlZXBfdXNiWzFdLCBVU0JEX0VOQUJMRSk7CiAJYXVfc3luYygpOwogI2Vsc2UKLQkvKiBlbmFibGUgYWNjY2VzIHRvIE9URyBtZW1vcnkgKi8KKwkvKiBlbmFibGUgYWNjZXNzIHRvIE9URyBtZW1vcnkgKi8KIAlhdV93cml0ZWwoYXVfcmVhZGwoVVNCX01TUl9CQVNFICsgNCkgfCAoMSA8PCA2KSwgVVNCX01TUl9CQVNFICsgNCk7CiAJYXVfc3luYygpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcG0uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wbS5jCmluZGV4IDRiYmQzMTMuLmFjYWY5MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wbS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wbS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGRiMXhfcG1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBkYjF4X3BtX29wcyA9IHsKIAkudmFsaWQJCT0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKIAkuYmVnaW4JCT0gZGIxeF9wbV9iZWdpbiwKIAkuZW50ZXIJCT0gZGIxeF9wbV9lbnRlciwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvdGltZS5jIGIvYXJjaC9taXBzL2RlYy90aW1lLmMKaW5kZXggMDJmNTA1Zi4uZWE1N2YzOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlYy90aW1lLmMKKysrIGIvYXJjaC9taXBzL2RlYy90aW1lLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlDTU9TX1dSSVRFKHJlYWxfc2Vjb25kcywgUlRDX1NFQ09ORFMpOwogCQlDTU9TX1dSSVRFKHJlYWxfbWludXRlcywgUlRDX01JTlVURVMpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJcHJpbnRrX29uY2UoS0VSTl9OT1RJQ0UKIAkJICAgICAgICJzZXRfcnRjX21tc3M6IGNhbid0IHVwZGF0ZSBmcm9tICVkIHRvICVkXG4iLAogCQkgICAgICAgY21vc19taW51dGVzLCByZWFsX21pbnV0ZXMpOwogCQlyZXR2YWwgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBvd2VydHYvaW9yZW1hcC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9pb3JlbWFwLmgKaW5kZXggMDc2ZjJlZS4uYzg2ZWYwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9pb3JlbWFwLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcG93ZXJ0di9pb3JlbWFwLmgKQEAgLTg4LDcgKzg4LDcgQEAKIH0KIAogLyogVGhlc2UgYXJlIG5vdCBwb3J0YWJsZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGRyaXZlcnMuIERyaXZlcnMgc2hvdWxkCi0gKiBiZSB1c2luZyBpb3JlbWFwKCkgYW5kIGZyaWVuZHMgdG8gbWFwIHBoeXNpY2FsIGFkZHJlc2VzIHRvIHZpcnR1YWwKKyAqIGJlIHVzaW5nIGlvcmVtYXAoKSBhbmQgZnJpZW5kcyB0byBtYXAgcGh5c2ljYWwgYWRkcmVzc2VzIHRvIHZpcnR1YWwKICAqIGFkZHJlc3NlcyBhbmQgZG1hX21hcCooKSBhbmQgZnJpZW5kcyB0byBtYXAgdmlydHVhbCBhZGRyZXNzZXMgaW50byBETUEKICAqIGFkZHJlc3NlcyBhbmQgYmFjay4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21jMTQ2ODE4LXRpbWUuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYzE0NjgxOC10aW1lLmgKaW5kZXggMTk5YjQ1Ny4uNGEwOGRiZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21jMTQ2ODE4LXRpbWUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWMxNDY4MTgtdGltZS5oCkBAIC02Niw3ICs2Niw3IEBACiAJCUNNT1NfV1JJVEUocmVhbF9zZWNvbmRzLCBSVENfU0VDT05EUyk7CiAJCUNNT1NfV1JJVEUocmVhbF9taW51dGVzLCBSVENfTUlOVVRFUyk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORworCQlwcmludGtfb25jZShLRVJOX05PVElDRQogCQkgICAgICAgInNldF9ydGNfbW1zczogY2FuJ3QgdXBkYXRlIGZyb20gJWQgdG8gJWRcbiIsCiAJCSAgICAgICBjbW9zX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7CiAJCXJldHZhbCA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tbWFuLmgKaW5kZXggYzg5MmJmYi4uNzg1YjRlYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21tYW4uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW1hbi5oCkBAIC03Nyw2ICs3Nyw5IEBACiAjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMJCS8qIEtTTSBtYXkgbm90IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLwogI2RlZmluZSBNQURWX0hXUE9JU09OICAgIDEwMAkJLyogcG9pc29uIGEgcGFnZSBmb3IgdGVzdGluZyAqLwogCisjZGVmaW5lIE1BRFZfSFVHRVBBR0UJMTQJCS8qIFdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTE1CQkvKiBOb3Qgd29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworCiAvKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCiAjZGVmaW5lIE1BUF9GSUxFCTAKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9ib2FyZC1xaV9sYjYwLmMgYi9hcmNoL21pcHMvano0NzQwL2JvYXJkLXFpX2xiNjAuYwppbmRleCA1YzBhMzU3Li4yYzBlMTA3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvano0NzQwL2JvYXJkLXFpX2xiNjAuYworKysgYi9hcmNoL21pcHMvano0NzQwL2JvYXJkLXFpX2xiNjAuYwpAQCAtNjUsNyArNjUsNyBAQAogCiAvKiBFYXJseSBwcm90b3R5cGVzIG9mIHRoZSBRSSBMQjYwIGhhZCBvbmx5IDFHQiBvZiBOQU5ELgogICogSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGVzZSBkZXZpY2VzIGFzd2VsbCB0aGUgcGFydGl0aW9uIGFuZCBlY2MgbGF5b3V0IGlzCi0gKiBpbml0YWxpemVkIGRlcGVuZGluZyBvbiB0aGUgTkFORCBzaXplICovCisgKiBpbml0aWFsaXplZCBkZXBlbmRpbmcgb24gdGhlIE5BTkQgc2l6ZSAqLwogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHFpX2xiNjBfcGFydGl0aW9uc18xZ2JbXSA9IHsKIAl7CiAJCS5uYW1lID0gIk5BTkQgQk9PVCBwYXJ0aXRpb24iLApAQCAtNDY0LDcgKzQ2NCw3IEBACiAJYm9hcmRfZ3Bpb19zZXR1cCgpOwogCiAJaWYgKHFpX2xiNjBfaW5pdF9wbGF0Zm9ybV9kZXZpY2VzKCkpCi0JCXBhbmljKCJGYWlsZWQgdG8gaW5pdGFsaXplIHBsYXRmb3JtIGRldmljZXNcbiIpOworCQlwYW5pYygiRmFpbGVkIHRvIGluaXRpYWxpemUgcGxhdGZvcm0gZGV2aWNlc1xuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9qejQ3NDAvZ3Bpby5jIGIvYXJjaC9taXBzL2p6NDc0MC9ncGlvLmMKaW5kZXggMzhmNjBmMy4uODhlNmFlZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2p6NDc0MC9ncGlvLmMKKysrIGIvYXJjaC9taXBzL2p6NDc0MC9ncGlvLmMKQEAgLTU0Niw3ICs1NDYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGp6NDc0MF9ncGlvX2NoaXBzKTsgKytpKQogCQlqejQ3NDBfZ3Bpb19jaGlwX2luaXQoJmp6NDc0MF9ncGlvX2NoaXBzW2ldLCBpKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkpaNDc0MCBHUElPIGluaXRhbGl6ZWRcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkpaNDc0MCBHUElPIGluaXRpYWxpemVkXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2p6NDc0MC9wbS5jIGIvYXJjaC9taXBzL2p6NDc0MC9wbS5jCmluZGV4IGE5OTk0NTguLjkwMmQ1YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9qejQ3NDAvcG0uYworKysgYi9hcmNoL21pcHMvano0NzQwL3BtLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBqejQ3NDBfcG1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBqejQ3NDBfcG1fb3BzID0gewogCS52YWxpZAkJPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogCS5lbnRlcgkJPSBqejQ3NDBfcG1fZW50ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNmY1MWRkYS4uZDg3YTcyZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL21vZHVsZS5jCkBAIC00NiwxNyArNDYsOSBAQAogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKICNpZmRlZiBNT0RVTEVfU1RBUlQKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0JaWYgKCFzaXplKQotCQlyZXR1cm4gTlVMTDsKLQotCWFyZWEgPSBfX2dldF92bV9hcmVhKHNpemUsIFZNX0FMTE9DLCBNT0RVTEVfU1RBUlQsIE1PRFVMRV9FTkQpOwotCWlmICghYXJlYSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gX192bWFsbG9jX2FyZWEoYXJlYSwgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwpOworCXJldHVybiBfX3ZtYWxsb2Nfbm9kZV9yYW5nZShzaXplLCAxLCBNT0RVTEVfU1RBUlQsIE1PRFVMRV9FTkQsCisJCQkJR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwsIC0xLAorCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAjZWxzZQogCWlmIChzaXplID09IDApCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wbS5jIGIvYXJjaC9taXBzL2xvb25nc29uL2NvbW1vbi9wbS5jCmluZGV4IDZjMWZkOTAuLmY1NWUwN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sb29uZ3Nvbi9jb21tb24vcG0uYworKysgYi9hcmNoL21pcHMvbG9vbmdzb24vY29tbW9uL3BtLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBsb29uZ3Nvbl9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGxvb25nc29uX3BtX29wcyA9IHsKIAkudmFsaWQJPSBsb29uZ3Nvbl9wbV92YWxpZF9zdGF0ZSwKIAkuZW50ZXIJPSBsb29uZ3Nvbl9wbV9lbnRlciwKIH07CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLW1lbW9yeS5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1tZW1vcnkuYwppbmRleCBiMjc0MTljLi5hOTZkMjgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLW1lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtbWVtb3J5LmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyBjaGFyICptdHlwZXNbM10gPSB7CiAJIkRvbnQgdXNlIG1lbW9yeSIsCiAJIllBTU9OIFBST00gbWVtb3J5IiwKLQkiRnJlZSBtZW1tb3J5IiwKKwkiRnJlZSBtZW1vcnkiLAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaWUtb2N0ZW9uLmMgYi9hcmNoL21pcHMvcGNpL3BjaWUtb2N0ZW9uLmMKaW5kZXggMzg1ZjAzNS4uMDU4M2M0NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpZS1vY3Rlb24uYworKysgYi9hcmNoL21pcHMvcGNpL3BjaWUtb2N0ZW9uLmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCW1lbV9hY2Nlc3Nfc3ViaWQucy5yb3IgPSAwOwogCS8qIERpc2FibGUgUmVsYXhlZCBPcmRlcmluZyBmb3IgV3JpdGVzLiAqLwogCW1lbV9hY2Nlc3Nfc3ViaWQucy5yb3cgPSAwOwotCS8qIFBDSWUgQWRkZHJlc3MgQml0cyA8NjM6MzQ+LiAqLworCS8qIFBDSWUgQWRkcmVzcyBCaXRzIDw2MzozND4uICovCiAJbWVtX2FjY2Vzc19zdWJpZC5zLmJhID0gMDsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG93ZXJ0di9tZW1vcnkuYyBiL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCmluZGV4IDczODgwYWQuLmZiM2QyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9wb3dlcnR2L21lbW9yeS5jCkBAIC01Nyw3ICs1Nyw3IEBACiB1bnNpZ25lZCBsb25nIHB0dl9tZW1zaXplOwogCiAvKgotICogc3RydWN0IGxvd19tZW1fcmVzZXJ2ZWQgLSBJdGVtcyBpbiBsb3cgbWVtbW9yeSB0aGF0IGFyZSByZXNlcnZlZAorICogc3RydWN0IGxvd19tZW1fcmVzZXJ2ZWQgLSBJdGVtcyBpbiBsb3cgbWVtb3J5IHRoYXQgYXJlIHJlc2VydmVkCiAgKiBAc3RhcnQ6CVBoeXNpY2FsIGFkZHJlc3Mgb2YgaXRlbQogICogQHNpemU6CVNpemUsIGluIGJ5dGVzLCBvZiB0aGlzIGl0ZW0KICAqIEBpc19hbGlhc2VkOglUcnVlIGlmIHRoaXMgaXMgUkFNIGFsaWFzZWQgZnJvbSBhbm90aGVyIGxvY2F0aW9uLiBJZiBmYWxzZSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvcGNpLmMgYi9hcmNoL21pcHMvdHh4OS9nZW5lcmljL3BjaS5jCmluZGV4IDlhMGJlODEuLjk2ZTY5YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy90eHg5L2dlbmVyaWMvcGNpLmMKKysrIGIvYXJjaC9taXBzL3R4eDkvZ2VuZXJpYy9wY2kuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIC8qCiAgKiBhbGxvY2F0ZSBwY2lfY29udHJvbGxlciBhbmQgcmVzb3VyY2VzLgotICogbWVtX2Jhc2UsIGlvX2Jhc2U6IHBoeXNpY2FsIGFkZHJlc3NzLiAgMCBmb3IgYXV0byBhc3NpZ25tZW50LgorICogbWVtX2Jhc2UsIGlvX2Jhc2U6IHBoeXNpY2FsIGFkZHJlc3MuICAwIGZvciBhdXRvIGFzc2lnbm1lbnQuCiAgKiBtZW1fc2l6ZSBhbmQgaW9fc2l6ZSBtZWFucyBtYXggc2l6ZSBvbiBhdXRvIGFzc2lnbm1lbnQuCiAgKiBwY2ljIG11c3QgYmUgJnR4eDlfcHJpbWFyeV9wY2ljIG9yIE5VTEwuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9LY29uZmlnIGIvYXJjaC9tbjEwMzAwL0tjb25maWcKaW5kZXggNDFiYTM4NS4uOGVkNDFjZiAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL0tjb25maWcKKysrIGIvYXJjaC9tbjEwMzAwL0tjb25maWcKQEAgLTIwMyw2ICsyMDMsNyBAQAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCiAJZGVmYXVsdCB5CisJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTCiAJZGVwZW5kcyBvbiBNTjEwMzAwX1BST0NfTU4yV1MwMDM4IHx8IE1OMTAzMDBfUFJPQ19NTjJXUzAwNTAKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQpAQCAtMjI2LDExICsyMjcsNiBAQAogCWRlcGVuZHMgb24gU01QCiAJZGVmYXVsdCAiMiIKIAotY29uZmlnIFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTCi0JYm9vbAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCB5Ci0KIHNvdXJjZSAia2VybmVsL0tjb25maWcucHJlZW1wdCIKIAogY29uZmlnIE1OMTAzMDBfQ1VSUkVOVF9JTl9FMgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9ydGMuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvcnRjLmMKaW5kZXggZTllMjBmOS4uNDhkNzA1OCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9ydGMuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3J0Yy5jCkBAIC04OSw3ICs4OSw3IEBACiAJCUNNT1NfV1JJVEUocmVhbF9zZWNvbmRzLCBSVENfU0VDT05EUyk7CiAJCUNNT1NfV1JJVEUocmVhbF9taW51dGVzLCBSVENfTUlOVVRFUyk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORworCQlwcmludGtfb25jZShLRVJOX05PVElDRQogCQkgICAgICAgInNldF9ydGNfbW1zczogY2FuJ3QgdXBkYXRlIGZyb20gJWQgdG8gJWRcbiIsCiAJCSAgICAgICBjbW9zX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7CiAJCXJldHZhbCA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW1hbi5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW1hbi5oCmluZGV4IDk3NDljOGEuLmY1YjdiZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tYW4uaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbWFuLmgKQEAgLTU5LDYgKzU5LDkgQEAKICNkZWZpbmUgTUFEVl9NRVJHRUFCTEUgICA2NQkJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KICNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSA2NgkJLyogS1NNIG1heSBub3QgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCiAKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQk2NwkJLyogV29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworI2RlZmluZSBNQURWX05PSFVHRVBBR0UJNjgJCS8qIE5vdCB3b3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisKIC8qIGNvbXBhdGliaWxpdHkgZmxhZ3MgKi8KICNkZWZpbmUgTUFQX0ZJTEUJMAogI2RlZmluZSBNQVBfVkFSSUFCTEUJMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCBlNjI1ZTllLi45NTlmMzhjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMjAsNiArMjAsOSBAQAogY29uZmlnIEFSQ0hfUEhZU19BRERSX1RfNjRCSVQKICAgICAgICBkZWZfYm9vbCBQUEM2NCB8fCBQSFlTXzY0QklUCiAKK2NvbmZpZyBBUkNIX0RNQV9BRERSX1RfNjRCSVQKKwlkZWZfYm9vbCBBUkNIX1BIWVNfQUREUl9UXzY0QklUCisKIGNvbmZpZyBNTVUKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xMTYsNyArMTE5LDcgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAJc2VsZWN0IE9GCi0Jc2VsZWN0IE9GX0ZMQVRUUkVFCisJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAJc2VsZWN0IEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgpAQCAtMjA5LDcgKzIxMiw3IEBACiBjb25maWcgQVJDSF9TVVNQRU5EX1BPU1NJQkxFCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gQURCX1BNVSB8fCBQUENfRUZJS0EgfHwgUFBDX0xJVEU1MjAwIHx8IFBQQ184M3h4IHx8IFwKLQkJICAgUFBDXzg1eHggfHwgUFBDXzg2eHggfHwgUFBDX1BTRVJJRVMKKwkJICAgUFBDXzg1eHggfHwgUFBDXzg2eHggfHwgUFBDX1BTRVJJRVMgfHwgNDR4IHx8IDQweAogCiBjb25maWcgUFBDX0RDUl9OQVRJVkUKIAlib29sCkBAIC01OTUsMTMgKzU5OCwxMSBAQAogCiAJICBJZiB1bnN1cmUsIGxlYXZlIGJsYW5rCiAKLWlmICE0NHggfHwgQlJPS0VOCiBjb25maWcgQVJDSF9XQU5UU19GUkVFWkVSX0NPTlRST0wKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBBREJfUE1VCiAKIHNvdXJjZSBrZXJuZWwvcG93ZXIvS2NvbmZpZwotZW5kaWYKIAogY29uZmlnIFNFQ0NPTVAKIAlib29sICJFbmFibGUgc2VjY29tcCB0byBzYWZlbHkgY29tcHV0ZSB1bnRydXN0ZWQgYnl0ZWNvZGUiCkBAIC02ODIsNiArNjgzLDE1IEBACiAJICBGcmVlc2NhbGUgTVBDODV4eC9NUEM4Nnh4IHBvd2VyIG1hbmFnZW1lbnQgY29udHJvbGxlciBzdXBwb3J0CiAJICAoc3VzcGVuZC9yZXN1bWUpLiBGb3IgTVBDODN4eCBzZWUgcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCiAKK2NvbmZpZyBQUEM0eHhfQ1BNCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1VTUEVORCAmJiAoNDR4IHx8IDQweCkKKwloZWxwCisJICBQUEM0eHggQ2xvY2sgUG93ZXIgTWFuYWdlbWVudCAoQ1BNKSBzdXBwb3J0IChzdXNwZW5kL3Jlc3VtZSkuCisJICBJdCBhbHNvIGVuYWJsZXMgc3VwcG9ydCBmb3IgdHdvIGRpZmZlcmVudCBpZGxlIHN0YXRlcyAoaWRsZS13YWl0CisJICBhbmQgaWRsZS1kb3plKS4KKwogY29uZmlnIDR4eF9TT0MKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggZmFlODE5Mi4uOTZkZWVjNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTM1LDcgKzM1LDcgQEAKIAogQk9PVENGTEFHUwkrPSAtSSQob2JqKSAtSSQoc3JjdHJlZSkvJChvYmopCiAKLURUU19GTEFHUwk/PSAtcCAxMDI0CitEVENfRkxBR1MJPz0gLXAgMTAyNAogCiAkKG9iaikvNHh4Lm86IEJPT1RDRkxBR1MgKz0gLW1jcHU9NDA1CiAkKG9iaikvZWJvbnkubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKQEAgLTMzMiwxMCArMzMyLDggQEAKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHRyZWVib290LSQqLCwkKG9iaikvJCouZHRiKQogCiAjIFJ1bGUgdG8gYnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMKLURUQyA9ICQob2JqdHJlZSkvc2NyaXB0cy9kdGMvZHRjCi0KLSQob2JqKS8lLmR0YjogJChkdHN0cmVlKS8lLmR0cwotCSQoRFRDKSAtTyBkdGIgLW8gJChvYmopLyQqLmR0YiAtYiAwICQoRFRTX0ZMQUdTKSAkKGR0c3RyZWUpLyQqLmR0cworJChvYmopLyUuZHRiOiAkKHNyYykvZHRzLyUuZHRzCisJJChjYWxsIGNtZCxkdGMpCiAKICMgSWYgdGhlcmUgaXNuJ3QgYSBwbGF0Zm9ybSBzZWxlY3RlZCB0aGVuIGp1c3Qgc3RyaXAgdGhlIHZtbGludXguCiBpZmVxICgsJChpbWFnZS15KSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ibHVlc3RvbmUuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2JsdWVzdG9uZS5kdHMKaW5kZXggOWJiM2Q3Mi4uMmE1NmEwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2JsdWVzdG9uZS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2JsdWVzdG9uZS5kdHMKQEAgLTMzLDcgKzMzLDcgQEAKIAlhbGlhc2VzIHsKIAkJZXRoZXJuZXQwID0gJkVNQUMwOwogCQlzZXJpYWwwID0gJlVBUlQwOwotCQlzZXJpYWwxID0gJlVBUlQxOworCQkvL3NlcmlhbDEgPSAmVUFSVDE7IC0tZ2NsIG1pc3NpbmcgVUFSVDEgbGFiZWwKIAl9OwogCiAJY3B1cyB7CkBAIC01Miw3ICs1Miw3IEBACiAJCQlkLWNhY2hlLXNpemUgPSA8MzI3Njg+OwogCQkJZGNyLWNvbnRyb2xsZXI7CiAJCQlkY3ItYWNjZXNzLW1ldGhvZCA9ICJuYXRpdmUiOwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJDMD47CisJCQkvL25leHQtbGV2ZWwtY2FjaGUgPSA8JkwyQzA+OyAtLWdjbCBtaXNzaW5nIEwyQzAgbGFiZWwKIAkJfTsKIAl9OwogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkJCQkJLypSWEVPQiovIDB4NyAweDQKIAkJCQkJLypTRVJSKi8gIDB4MyAweDQKIAkJCQkJLypUWERFKi8gIDB4NCAweDQKLQkJCQkJLypSWERFKi8gIDB4NSAweDQKKwkJCQkJLypSWERFKi8gIDB4NSAweDQ+OwogCQl9OwogCiAJCVBPQjA6IG9wYiB7CkBAIC0xODIsNyArMTgyLDcgQEAKIAkJCQkJCXJlZyA9IDwweDAwMWEwMDAwIDB4MDAwNjAwMDA+OwogCQkJCQl9OwogCQkJCX07Ci0JCQl9CisJCQl9OwogCiAJCQlVQVJUMDogc2VyaWFsQGVmNjAwMzAwIHsKIAkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMKaW5kZXggYTMwMzcwMy4uNWIyN2E0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2FueW9ubGFuZHMuZHRzCkBAIC0xMDUsNiArMTA1LDE1IEBACiAJCWRjci1yZWcgPSA8MHgwMGMgMHgwMDI+OwogCX07CiAKKwlDUE0wOiBjcG0geworCQljb21wYXRpYmxlID0gImlibSxjcG0iOworCQlkY3ItYWNjZXNzLW1ldGhvZCA9ICJuYXRpdmUiOworCQlkY3ItcmVnID0gPDB4MTYwIDB4MDAzPjsKKwkJdW51c2VkLXVuaXRzID0gPDB4MDAwMDAxMDA+OworCQlpZGxlLWRvemUgPSA8MHgwMjAwMDAwMD47CisJCXN0YW5kYnkgPSA8MHhmZWZmNzkxZD47CisJfTsKKwogCUwyQzA6IGwyYyB7CiAJCWNvbXBhdGlibGUgPSAiaWJtLGwyLWNhY2hlLTQ2MGV4IiwgImlibSxsMi1jYWNoZSI7CiAJCWRjci1yZWcgPSA8MHgwMjAgMHgwMDgJCS8qIEludGVybmFsIFNSQU0gRENSJ3MgKi8KQEAgLTI3MCwyOCArMjc5LDYgQEAKIAkJCQlpbnRlcnJ1cHRzID0gPDB4MSAweDQ+OwogCQkJfTsKIAotCQkJVUFSVDI6IHNlcmlhbEBlZjYwMDUwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJCXJlZyA9IDwweGVmNjAwNTAwIDB4MDAwMDAwMDg+OwotCQkJCXZpcnR1YWwtcmVnID0gPDB4ZWY2MDA1MDA+OwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMxPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDB4ND47Ci0JCQl9OwotCi0JCQlVQVJUMzogc2VyaWFsQGVmNjAwNjAwIHsKLQkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQkJcmVnID0gPDB4ZWY2MDA2MDAgMHgwMDAwMDAwOD47Ci0JCQkJdmlydHVhbC1yZWcgPSA8MHhlZjYwMDYwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQkJY3VycmVudC1zcGVlZCA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMHg0PjsKLQkJCX07Ci0KIAkJCUlJQzA6IGkyY0BlZjYwMDcwMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJpYm0saWljLTQ2MGV4IiwgImlibSxpaWMiOwogCQkJCXJlZyA9IDwweGVmNjAwNzAwIDB4MDAwMDAwMTQ+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NtNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY201MjAwLmR0cwppbmRleCBkZDM4NjA4Li5hZDNhNGY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY201MjAwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY201MjAwLmR0cwpAQCAtMTAsMjIwICsxMCw3NCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAic2NoaW5kbGVyLGNtNTIwMCI7CiAJY29tcGF0aWJsZSA9ICJzY2hpbmRsZXIsY201MjAwIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OworCQljYW5AOTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OworCQljYW5AOTgwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OwotCQl9OwotCi0JCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKLQkJfTsKLQotCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47Ci0JCX07Ci0KLQkJdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwotCQl9OwotCi0JCXRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKLQkJfTsKLQotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCXNlcmlhbEAyMDAwIHsJCS8vIFBTQzEKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyMjAwIHsJCS8vIFBTQzIKKwkJcHNjQDIyMDAgewkJLy8gUFNDMgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyNDAwIHsJCS8vIFBTQzMKKwkJcHNjQDI0MDAgewkJLy8gUFNDMwogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAzIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyYzAwIHsJCS8vIFBTQzYKKwkJcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjgwMCB7CQkvLyBQU0M1CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyYzAwIHsJCS8vIFBTQzYKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAgICAgICAvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAgIC8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OworCQlhdGFAM2EwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXNyYW1AODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCWkyY0AzZDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CisKKwl9OworCisJcGNpQGYwMDAwZDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJzaW1wbGUtYnVzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlyYW5nZXMgPSA8MCAwIDB4ZmMwMDAwMDAgMHgyMDAwMDAwPjsKLQogCQkvLyAxNi1iaXQgZmxhc2ggZGV2aWNlIGF0IExvY2FsUGx1cyBCdXMgQ1MwCiAJCWZsYXNoQDAsMCB7CiAJCQljb21wYXRpYmxlID0gImNmaS1mbGFzaCI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCmluZGV4IDhlOWJlNmIuLjI3YmQyNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9kaWdzeV9tdGMuZHRzCkBAIC0xMSwxOTUgKzExLDY4IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJpbnRlcmNvbnRyb2wsZGlnc3ktbXRjIjsKIAljb21wYXRpYmxlID0gImludGVyY29udHJvbCxkaWdzeS1tdGMiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKIAogCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDIwMDAwMDA+OwkvLyAzMk1CCiAJfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KIAkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CiAJCQlmc2wsaGFzLXdkdDsKIAkJfTsKIAotCQl0aW1lckA2MTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CisJCXJ0Y0A4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CisJCWNhbkA5ODAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47CisJCXBzY0AyMDAwIHsJCS8vIFBTQzEKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OworCQlwc2NAMjIwMCB7CQkvLyBQU0MyCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY2MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNSAwPjsKKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47Ci0JCX07Ci0KLQkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8iLCJmc2wsbXBjNTIwMC1ncGlvIjsKLQkJCXJlZyA9IDwweGIwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA3IDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlzcGlAZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNwaSIsImZzbCxtcGM1MjAwLXNwaSI7Ci0JCQlyZWcgPSA8MHhmMDAgMHgyMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTMgMCAyIDE0IDA+OwotCQl9OwotCi0JCXVzYkAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OwotCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47Ci0JCX07Ci0KLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKLQkJfTsKLQotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47Ci0JCX07Ci0KLQkJc2VyaWFsQDI2MDAgewkJLy8gUFNDNAorCQlwc2NAMjYwMCB7CQkvLyBQU0M0CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDI2MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDExIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyODAwIHsJCS8vIFBTQzUKKwkJcHNjQDI4MDAgewkJLy8gUFNDNQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMiAwPjsKKwkJfTsKKworCQlwc2NAMmMwMCB7CQkvLyBQU0M2CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47ICAgICAgIC8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47ICAgLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCiAJCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0KIAkJCXJ0Y0A1MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJhdCwyNGMwOCI7CiAJCQkJcmVnID0gPDB4NTA+OwpAQCAtMjExLDE2ICs4NCwxNiBAQAogCQkJfTsKIAkJfTsKIAotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OworCQlpMmNAM2Q0MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCX07CiAKLQlscGIgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJzaW1wbGUtYnVzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OworCXBjaUBmMDAwMGQwMCB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKworCWxvY2FsYnVzIHsKIAkJcmFuZ2VzID0gPDAgMCAweGZmMDAwMDAwIDB4MTAwMDAwMD47CiAKIAkJLy8gMTYtYml0IGZsYXNoIGRldmljZSBhdCBMb2NhbFBsdXMgQnVzIENTMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvdGZvb3QuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvdGZvb3QuZHRzCmluZGV4IGNhZDljMzguLjcxZDNiYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob3Rmb290LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG90Zm9vdC5kdHMKQEAgLTExNyw2ICsxMTcsOCBAQAogCQkJfTsKIAogCQkJSUlDOiBpMmNAZWY2MDA1MDAgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy00MDVlcCIsICJpYm0saWljIjsKIAkJCQlyZWcgPSA8MHhlZjYwMDUwMCAweDAwMDAwMDExPjsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9raWxhdWVhLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9raWxhdWVhLmR0cwppbmRleCAwODNlNjhlLi44OWVkYjE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2lsYXVlYS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tpbGF1ZWEuZHRzCkBAIC04Miw2ICs4MiwxNSBAQAogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKIAl9OwogCisJQ1BNMDogY3BtIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sY3BtIjsKKwkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJZGNyLXJlZyA9IDwweDBiMCAweDAwMz47CisJCXVudXNlZC11bml0cyA9IDwweDAwMDAwMDAwPjsKKwkJaWRsZS1kb3plID0gPDB4MDIwMDAwMDA+OworCQlzdGFuZGJ5ID0gPDB4ZTNlNzQ4MDA+OworCX07CisKIAlwbGIgewogCQljb21wYXRpYmxlID0gImlibSxwbGItNDA1ZXgiLCAiaWJtLHBsYjQiOwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKaW5kZXggNTk3MDJhYy4uZmIyODhiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2xpdGU1MjAwYi5kdHMKQEAgLTEwLDI1NiArMTAsNzUgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxsaXRlNTIwMGIiOwogCWNvbXBhdGlibGUgPSAiZnNsLGxpdGU1MjAwYiI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKIAogCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4MTAwMDAwMDA+OwkvLyAyNTZNQgogCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKLQkJfTsKLQotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47Ci0JCX07Ci0KLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OwotCQl9OwotCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKLQkJfTsKLQotCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47Ci0JCX07Ci0KLQkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwotCQl9OwotCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJY2FuQDkwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKLQkJCXJlZyA9IDwweDkwMCAweDgwPjsKLQkJfTsKLQotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCXNlcmlhbEAyMDAwIHsJCS8vIFBTQzEKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7CiAJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKKwkJfTsKKworCQlwc2NAMjIwMCB7CQkvLyBQU0MyCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyNDAwIHsJCS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjgwMCB7CQkvLyBQU0M1CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyYzAwIHsJCS8vIFBTQzYKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJLy8gUFNDMiBpbiBhYzk3IG1vZGUgZXhhbXBsZQogCQkvL2FjOTdAMjIwMCB7CQkvLyBQU0MyCiAJCS8vCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1hYzk3IiwiZnNsLG1wYzUyMDAtcHNjLWFjOTciOwogCQkvLwljZWxsLWluZGV4ID0gPDE+OwotCQkvLwlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJLy8JaW50ZXJydXB0cyA9IDwyIDIgMD47CiAJCS8vfTsKIAogCQkvLyBQU0MzIGluIENPREVDIG1vZGUgZXhhbXBsZQogCQkvL2kyc0AyNDAwIHsJCS8vIFBTQzMKIAkJLy8JY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLWkycyI7IC8vbm90IDUyMDAgY29tcGF0aWJsZQogCQkvLwljZWxsLWluZGV4ID0gPDI+OwotCQkvLwlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJLy8JaW50ZXJydXB0cyA9IDwyIDMgMD47Ci0JCS8vfTsKLQotCQkvLyBQU0M0IGluIHVhcnQgbW9kZSBleGFtcGxlCi0JCS8vc2VyaWFsQDI2MDAgewkJLy8gUFNDNAotCQkvLwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJLy8JY2VsbC1pbmRleCA9IDwzPjsKLQkJLy8JcmVnID0gPDB4MjYwMCAweDEwMD47Ci0JCS8vCWludGVycnVwdHMgPSA8MiAxMSAwPjsKLQkJLy99OwotCi0JCS8vIFBTQzUgaW4gdWFydCBtb2RlIGV4YW1wbGUKLQkJLy9zZXJpYWxAMjgwMCB7CQkvLyBQU0M1Ci0JCS8vCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkvLwljZWxsLWluZGV4ID0gPDQ+OwotCQkvLwlyZWcgPSA8MHgyODAwIDB4MTAwPjsKLQkJLy8JaW50ZXJydXB0cyA9IDwyIDEyIDA+OwogCQkvL307CiAKIAkJLy8gUFNDNiBpbiBzcGkgbW9kZSBleGFtcGxlCiAJCS8vc3BpQDJjMDAgewkJLy8gUFNDNgogCQkvLwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2Mtc3BpIiwiZnNsLG1wYzUyMDAtcHNjLXNwaSI7CiAJCS8vCWNlbGwtaW5kZXggPSA8NT47Ci0JCS8vCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkvLwlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJLy99OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKLQkJfTsKLQotCQlpMmNAM2QwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQl9OwotCiAJCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47Ci0KIAkJCWVlcHJvbUA1MCB7CiAJCQkJY29tcGF0aWJsZSA9ICJhdG1lbCwyNGMwMiI7CiAJCQkJcmVnID0gPDB4NTA+OwpAQCAtMjczLDEyICs5Miw2IEBACiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzIC8vIDFzdCBzbG90CiAJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAxIDMKQEAgLTI5OCwxMSArMTExLDYgQEAKIAl9OwogCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJmc2wsbXBjNTIwMC1scGIiLCJzaW1wbGUtYnVzIjsKLQotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0KIAkJcmFuZ2VzID0gPDAgMCAweGZlMDAwMDAwIDB4MDIwMDAwMDA+OwogCiAJCWZsYXNoQDAsMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZWRpYTUyMDAuZHRzCmluZGV4IDBjMzkwMmIuLjQ4ZDcyZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZWRpYTUyMDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tZWRpYTUyMDAuZHRzCkBAIC0xMSwxNCArMTEsMTEgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxtZWRpYTUyMDAiOwogCWNvbXBhdGlibGUgPSAiZnNsLG1lZGlhNTIwMCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwogCiAJYWxpYXNlcyB7CiAJCWNvbnNvbGUgPSAmY29uc29sZTsKQEAgLTMwLDE2ICsyNyw3IEBACiAJfTsKIAogCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KIAkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCiAJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MzMwMDAwMDA+OwkvLyAzMyBNSHosIHRoZXNlIHdlcmUgY29uZmlndXJlZCBieSBVLUJvb3QKIAkJCWJ1cy1mcmVxdWVuY3kgPSA8MTMyMDAwMDAwPjsJCS8vIDEzMiBNSHoKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzOTYwMDAwMDA+OwkJLy8gMzk2IE1IegpAQCAtNDcsMjA1ICszNSw1NyBAQAogCX07CiAKIAltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA4MDAwMDAwPjsJLy8gMTI4TUIgUkFNCiAJfTsKIAotCXNvY0BmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OworCXNvYzUyMDBAZjAwMDAwMDAgewogCQlidXMtZnJlcXVlbmN5ID0gPDEzMjAwMDAwMD47Ly8gMTMyIE1IegotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07CiAKIAkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CiAJCQlmc2wsaGFzLXdkdDsKIAkJfTsKIAotCQl0aW1lckA2MTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CisJCXBzY0AyMDAwIHsJLy8gUFNDMQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CisJCXBzY0AyMjAwIHsJLy8gUFNDMgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CisJCXBzY0AyNDAwIHsJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47CisJCXBzY0AyNjAwIHsJLy8gUFNDNAorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47Ci0JCX07Ci0KLQkJdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwotCQl9OwotCi0JCXRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKLQkJfTsKLQotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWNhbkA5MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47Ci0JCQlyZWcgPSA8MHg5MDAgMHg4MD47Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47Ci0JCX07Ci0KLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKLQkJfTsKLQotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCXBzY0AyODAwIHsJLy8gUFNDNQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQkvLyBQU0M2IGluIHVhcnQgbW9kZQotCQljb25zb2xlOiBzZXJpYWxAMmMwMCB7CQkvLyBQU0M2CisJCWNvbnNvbGU6IHBzY0AyYzAwIHsJCS8vIFBTQzYKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXBvcnQtbnVtYmVyID0gPDA+OyAgLy8gTG9naWNhbCBwb3J0IGFzc2lnbm1lbnQKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKLQkJZXRoMDogZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OworCQlldGhlcm5ldEAzMDAwIHsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKLQkJfTsKLQotCQlpMmNAM2QwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQl9OwotCi0JCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47Ci0JCX07Ci0KLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKKwkJdXNiQDEwMDAgeworCQkJcmVnID0gPDB4MTAwMCAweDEwMD47CiAJCX07CiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1lZGlhNTIwMF9mcGdhIDAgMiAvLyAxc3Qgc2xvdAogCQkJCSAweGMwMDAgMCAwIDIgJm1lZGlhNTIwMF9mcGdhIDAgMwpAQCAtMjYyLDM3ICsxMDIsMjkgQEAKIAogCQkJCSAweGUwMDAgMCAwIDEgJm1lZGlhNTIwMF9mcGdhIDAgNSAvLyBDb3JhbElQCiAJCQkJPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCi0JCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJcmFuZ2VzID0gPDB4NDIwMDAwMDAgMCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMCAweDIwMDAwMDAwCiAJCQkgIDB4MDIwMDAwMDAgMCAweGEwMDAwMDAwIDB4YTAwMDAwMDAgMCAweDEwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4YjAwMDAwMDAgMCAweDAxMDAwMDAwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsInNpbXBsZS1idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0KIAkJcmFuZ2VzID0gPCAwIDAgMHhmYzAwMDAwMCAweDAyMDAwMDAwCiAJCQkgICAxIDAgMHhmZTAwMDAwMCAweDAyMDAwMDAwCiAJCQkgICAyIDAgMHhmMDAxMDAwMCAweDAwMDEwMDAwCiAJCQkgICAzIDAgMHhmMDAyMDAwMCAweDAwMDEwMDAwID47Ci0KIAkJZmxhc2hAMCwwIHsKIAkJCWNvbXBhdGlibGUgPSAiYW1kLGFtMjlsdjI4bWwiLCAiY2ZpLWZsYXNoIjsKLQkJCXJlZyA9IDwwIDB4MCAweDIwMDAwMDA+OwkJLy8gMzIgTUIKLQkJCWJhbmstd2lkdGggPSA8ND47CQkJLy8gV2lkdGggaW4gYnl0ZXMgb2YgdGhlIGZsYXNoIGJhbmsKLQkJCWRldmljZS13aWR0aCA9IDwyPjsJCQkvLyBUd28gZGV2aWNlcyBvbiBlYWNoIGJhbmsKKwkJCXJlZyA9IDwwIDB4MCAweDIwMDAwMDA+OyAgICAgICAgICAgICAgICAvLyAzMiBNQgorCQkJYmFuay13aWR0aCA9IDw0PjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpZHRoIGluIGJ5dGVzIG9mIHRoZSBmbGFzaCBiYW5rCisJCQlkZXZpY2Utd2lkdGggPSA8Mj47ICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIGRldmljZXMgb24gZWFjaCBiYW5rCiAJCX07CiAKIAkJZmxhc2hAMSwwIHsKIAkJCWNvbXBhdGlibGUgPSAiYW1kLGFtMjlsdjI4bWwiLCAiY2ZpLWZsYXNoIjsKLQkJCXJlZyA9IDwxIDAgMHgyMDAwMDAwPjsJCQkvLyAzMiBNQgotCQkJYmFuay13aWR0aCA9IDw0PjsJCQkvLyBXaWR0aCBpbiBieXRlcyBvZiB0aGUgZmxhc2ggYmFuawotCQkJZGV2aWNlLXdpZHRoID0gPDI+OwkJCS8vIFR3byBkZXZpY2VzIG9uIGVhY2ggYmFuaworCQkJcmVnID0gPDEgMCAweDIwMDAwMDA+OyAgICAgICAgICAgICAgICAgIC8vIDMyIE1CCisJCQliYW5rLXdpZHRoID0gPDQ+OyAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lkdGggaW4gYnl0ZXMgb2YgdGhlIGZsYXNoIGJhbmsKKwkJCWRldmljZS13aWR0aCA9IDwyPjsgICAgICAgICAgICAgICAgICAgICAvLyBUd28gZGV2aWNlcyBvbiBlYWNoIGJhbmsKIAkJfTsKIAogCQltZWRpYTUyMDBfZnBnYTogZnBnYUAyLDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21vdGlvbnByby5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cwppbmRleCA2Y2E0ZmMxLi4wYjc4ZTg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbW90aW9ucHJvLmR0cwpAQCAtMTAsMjE5ICsxMCw3MyBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAicHJvbWVzcyxtb3Rpb25wcm8iOwogCWNvbXBhdGlibGUgPSAicHJvbWVzcyxtb3Rpb25wcm8iOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKLQkJfTsKLQotCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47Ci0JCX07Ci0KLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OwotCQl9OwotCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKLQkJfTsKLQotCQltb3Rpb25wcm8tbGVkQDY2MCB7CS8vIE1vdGlvbi1QUk8gc3RhdHVzIExFRAorCQl0aW1lckA2NjAgewkvLyBNb3Rpb24tUFJPIHN0YXR1cyBMRUQKIAkJCWNvbXBhdGlibGUgPSAicHJvbWVzcyxtb3Rpb25wcm8tbGVkIjsKIAkJCWxhYmVsID0gIm1vdGlvbnByby1zdGF0dXNsZWQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwogCQkJYmxpbmstZGVsYXkgPSA8MTAwPjsgLy8gMTAwIG1zZWMKIAkJfTsKIAotCQltb3Rpb25wcm8tbGVkQDY3MCB7CS8vIE1vdGlvbi1QUk8gcmVhZHkgTEVECisJCXRpbWVyQDY3MCB7CS8vIE1vdGlvbi1QUk8gcmVhZHkgTEVECiAJCQljb21wYXRpYmxlID0gInByb21lc3MsbW90aW9ucHJvLWxlZCI7CiAJCQlsYWJlbCA9ICJtb3Rpb25wcm8tcmVhZHlsZWQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwogCQl9OwogCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47CisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCXNlcmlhbEAyMDAwIHsJCS8vIFBTQzEKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCiAJCS8vIFBTQzIgaW4gc3BpIG1hc3RlciBtb2RlIAotCQlzcGlAMjIwMCB7CQkvLyBQU0MyCisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1zcGkiLCJmc2wsbXBjNTIwMC1wc2Mtc3BpIjsKIAkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCS8vIFBTQzUgaW4gdWFydCBtb2RlCi0JCXNlcmlhbEAyODAwIHsJCS8vIFBTQzUKKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTIgMD47CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAgICAgICAvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAgIC8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJcmVnID0gPDI+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJaTJjQDNkMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CiAJCQkJcmVnID0gPDB4Njg+OwpAQCAtMjM1LDEwICs4OSwxMSBAQAogCQl9OwogCX07CiAKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsInNpbXBsZS1idXMiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDAxMDAwMDAwCiAJCQkgIDEgMCAweDUwMDAwMDAwIDB4MDAwMTAwMDAKIAkJCSAgMiAwIDB4NTAwMTAwMDAgMHgwMDAxMDAwMApAQCAtMjgwLDUgKzEzNSw2IEBACiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQl9OworCiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MjAwYi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjc1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIGJhc2UgTVBDNTIwMGIgRGV2aWNlIFRyZWUgU291cmNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlY3JldExhYgorICogR3JhbnQgTGlrZWx5IDxncmFudEBzZWNyZXRsYWIuY2E+CisgKiBKb2huIEJvbmVzaW8gPGJvbmVzQHNlY3JldGxhYi5jYT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJmc2wsbXBjNTIwMGIiOworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXBvd2VycGM6IFBvd2VyUEMsNTIwMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SworCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJfTsKKwl9OworCisJbWVtb3J5OiBtZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgorCX07CisKKwlzb2M6IHNvYzUyMDBAZjAwMDAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOworCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OworCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisKKwkJY2RtQDIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOworCQkJcmVnID0gPDB4MjAwIDB4Mzg+OworCQl9OworCisJCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgeworCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7CisJCQlyZWcgPSA8MHg1MDAgMHg4MD47CisJCX07CisKKwkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjAwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCX07CisKKwkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjEwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OworCQl9OworCisJCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYyMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKKwkJfTsKKworCQl0aW1lckA2MzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MzAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CisJCX07CisKKwkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjQwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OworCQl9OworCisJCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY1MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKKwkJfTsKKworCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2NjAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CisJCX07CisKKwkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjcwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OworCQl9OworCisJCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7CisJCQlyZWcgPSA8MHg4MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47CisJCX07CisKKwkJY2FuQDkwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKKwkJCXJlZyA9IDwweDkwMCAweDgwPjsKKwkJfTsKKworCQljYW5AOTgwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOworCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OworCQkJcmVnID0gPDB4OTgwIDB4ODA+OworCQl9OworCisJCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7CisJCQlyZWcgPSA8MHhiMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW9fd2t1cDogZ3Bpb0BjMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKKwkJCXJlZyA9IDwweGMwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCX07CisKKwkJc3BpQGYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOworCQkJcmVnID0gPDB4ZjAwIDB4MjA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKKwkJfTsKKworCQl1c2I6IHVzYkAxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7CisJCQlyZWcgPSA8MHgxMDAwIDB4ZmY+OworCQkJaW50ZXJydXB0cyA9IDwyIDYgMD47CisJCX07CisKKwkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKKwkJCXJlZyA9IDwweDEyMDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCisJCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCisJCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKKwkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJfTsKKworCQl4bGJAMWYwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOworCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCX07CisKKwkJcHNjMTogcHNjQDIwMDAgewkJLy8gUFNDMQorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCX07CisKKwkJcHNjMjogcHNjQDIyMDAgewkJLy8gUFNDMgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDIyMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDIgMD47CisJCX07CisKKwkJcHNjMzogcHNjQDI0MDAgewkJLy8gUFNDMworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDI0MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDMgMD47CisJCX07CisKKwkJcHNjNDogcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDI2MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDExIDA+OworCQl9OworCisJCXBzYzU6IHBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyODAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxMiAwPjsKKwkJfTsKKworCQlwc2M2OiBwc2NAMmMwMCB7CQkvLyBQU0M2CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MiLCJmc2wsbXBjNTIwMC1wc2MiOworCQkJcmVnID0gPDB4MmMwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKKwkJfTsKKworCQlldGgwOiBldGhlcm5ldEAzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CisJCX07CisKKwkJbWRpb0AzMDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7CisJCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCisJCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCisJCX07CisKKwkJYXRhQDNhMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKKwkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCX07CisKKwkJaTJjQDNkMDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOworCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKKwkJfTsKKworCQlpMmNAM2Q0MCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7CisJCQlyZWcgPSA8MHgzZDQwIDB4NDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OworCQl9OworCisJCXNyYW1AODAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7CisJCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCX07CisJfTsKKworCXBjaTogcGNpQGYwMDAwZDAwIHsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOworCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CisJCS8vIGludGVycnVwdC1tYXAtbWFzayA9IG5lZWQgdG8gYWRkCisJCS8vIGludGVycnVwdC1tYXAgPSBuZWVkIHRvIGFkZAorCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZyb20gYm9vdCBsb2FkZXIKKwkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIDEwIDA+OworCQlidXMtcmFuZ2UgPSA8MCAwPjsKKwkJLy8gcmFuZ2VzID0gbmVlZCB0byBhZGQKKwl9OworCisJbG9jYWxidXM6IGxvY2FsYnVzIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzID0gPDAgMCAweGZjMDAwMDAwIDB4MjAwMDAwMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOF9wMW0uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhfcDFtLmR0cwppbmRleCAwNWE3NmNjLi42OTdiM2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOF9wMW0uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4X3AxbS5kdHMKQEAgLTI5Nyw2ICsyOTcsMTQgQEAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CiAJCX07CiAKKwkJZG1hQDJjMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzMDgtZG1hIiwgImZzbCxtcGM1MTIxLWRtYSI7CisJCQlyZWcgPSA8MHgyYzAwMCAweDE4MDA+OworCQkJaW50ZXJydXB0cyA9IDwzIDB4OAorCQkJCQk5NCAweDg+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJmlwaWMgPjsKKwkJfTsKKwogCX07CiAKIAlwY2kwOiBwY2llQGUwMDA5MDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4cmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4cmRiLmR0cwppbmRleCBhOTdlYjJkLi5kM2RiMDJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhyZGIuZHRzCkBAIC0yNjUsNiArMjY1LDE0IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwogCQl9OwogCisJCWRtYUAyYzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzA4LWRtYSIsICJmc2wsbXBjNTEyMS1kbWEiOworCQkJcmVnID0gPDB4MmMwMDAgMHgxODAwPjsKKwkJCWludGVycnVwdHMgPSA8MyAweDgKKwkJCQkJOTQgMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisKIAl9OwogCiAJcGNpMDogcGNpZUBlMDAwOTAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMKaW5kZXggYjcyYTc1OC4uMjFkMzQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tdWNtYzUyLmR0cwpAQCAtMTEsMTcyICsxMSwxMDkgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKIAljb21wYXRpYmxlID0gIm1hbnJvbGFuZCxtdWNtYzUyIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwotCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKLQl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQlncHQwOiB0aW1lckA2MDAgewkvLyBHUFQgMCBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDE6IHRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQl0aW1lckA2NDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQl0aW1lckA2NTAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OworCQl0aW1lckA2NjAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCXRpbWVyQDY3MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXNlcmlhbEAyMDAwIHsgLyogUFNDMSBpbiBVQVJUIG1vZGUgKi8KKwkJcnRjQDgwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCWNhbkA5MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQljYW5AOTgwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJc3BpQGYwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXVzYkAxMDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDIwMDAgewkJLy8gUFNDMQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyMjAwIHsgLyogUFNDMiBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDIyMDAgewkJLy8gUFNDMgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQl9OwogCi0JCXNlcmlhbEAyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDI0MDAgewkJLy8gUFNDMworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjYwMCB7CQkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJCS8vIFBTQzUKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47IAkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQljb21wYXRpYmxlID0gImludGVsLGx4dDk3MSI7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKKwkJaTJjQDNkMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwogCQkJaHdtb25AMmMgewogCQkJCWNvbXBhdGlibGUgPSAiYWQsYWRtOTI0MCI7CiAJCQkJcmVnID0gPDB4MmM+OwpAQCAtMTg2LDIwICsxMjMsOSBAQAogCQkJCXJlZyA9IDwweDUxPjsKIAkJCX07CiAJCX07Ci0KLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKLQkJfTsKIAl9OwogCiAJcGNpQGYwMDAwZDAwIHsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wY2kiLCJmc2wsbXBjNTIwMC1wY2kiOwotCQlyZWcgPSA8MHhmMDAwMGQwMCAweDEwMD47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJCS8qIElEU0VMIDB4MTAgKi8KQEAgLTIwOCwyMCArMTM0LDEyIEBACiAJCQkJMHg4MDAwIDAgMCAzICZtcGM1MjAwX3BpYyAwIDIgMwogCQkJCTB4ODAwMCAwIDAgNCAmbXBjNTIwMF9waWMgMCAxIDMKIAkJCQk+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZyb20gYm9vdCBsb2FkZXIKLQkJaW50ZXJydXB0cyA9IDwyIDggMCAyIDkgMCAyIDEwIDA+OwotCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJcmFuZ2VzID0gPDB4NDIwMDAwMDAgMCAweDYwMDAwMDAwIDB4NjAwMDAwMDAgMCAweDEwMDAwMDAwCiAJCQkgIDB4MDIwMDAwMDAgMCAweDkwMDAwMDAwIDB4OTAwMDAwMDAgMCAweDEwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4YTAwMDAwMDAgMCAweDAxMDAwMDAwPjsKIAl9OwogCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJmc2wsbXBjNTIwMC1scGIiLCJzaW1wbGUtYnVzIjsKLQotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0KIAkJcmFuZ2VzID0gPDAgMCAweGZmODAwMDAwIDB4MDA4MDAwMDAKIAkJCSAgMSAwIDB4ODAwMDAwMDAgMHgwMDgwMDAwMAogCQkJICAzIDAgMHg4MDAwMDAwMCAweDAwODAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKaW5kZXggOGE0ZWMzMC4uOWUzNTQ5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMC5kdHMKQEAgLTEyLDI0NiArMTIsOTIgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInBoeXRlYyxwY20wMzAiOwogCWNvbXBhdGlibGUgPSAicGh5dGVjLHBjbTAzMCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCi0JfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQotCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKKwkJdGltZXJANjAwIHsJCS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwotCQl9OwotCiAJCWdwdDI6IHRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ0OiB0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NjogdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ3OiB0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCXJ0Y0A4MDAgewkvLyBSZWFsIHRpbWUgY2xvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXJ0YyIsImZzbCxtcGM1MjAwLXJ0YyI7Ci0JCQlyZWcgPSA8MHg4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDUgMCAxIDYgMD47Ci0JCX07Ci0KLQkJY2FuQDkwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxNyAwPjsKLQkJCXJlZyA9IDwweDkwMCAweDgwPjsKLQkJfTsKLQotCQljYW5AOTgwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE4IDA+OwotCQkJcmVnID0gPDB4OTgwIDB4ODA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCWFjOTdAMjAwMCB7IC8qIFBTQzEgaW4gYWM5NyBtb2RlICovCisJCXBzY0AyMDAwIHsgLyogUFNDMSBpbiBhYzk3IG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAibXBjNTIwMGItcHNjLWFjOTciLCJmc2wsbXBjNTIwMGItcHNjLWFjOTciOwogCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKIAkJLyogUFNDMiBwb3J0IGlzIHVzZWQgYnkgQ0FOMS8yICovCisJCXBzY0AyMjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKLQkJc2VyaWFsQDI0MDAgeyAvKiBQU0MzIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7IC8qIFBTQzMgaW4gVUFSVCBtb2RlICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAzIDA+OwogCQl9OwogCiAJCS8qIFBTQzQgaXMgPz8/ICovCisJCXBzY0AyNjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKIAkJLyogUFNDNSBpcyA/Pz8gKi8KKwkJcHNjQDI4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAotCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCXJ0Y0A1MSB7CiAJCQkJY29tcGF0aWJsZSA9ICJueHAscGNmODU2MyI7CiAJCQkJcmVnID0gPDB4NTE+OwpAQCAtMjU5LDYgKzEwNSw3IEBACiAJCQllZXByb21ANTIgewogCQkJCWNvbXBhdGlibGUgPSAiY2F0YWx5c3QsMjRjMzIiOwogCQkJCXJlZyA9IDwweDUyPjsKKwkJCQlwYWdlc2l6ZSA9IDwzMj47CiAJCQl9OwogCQl9OwogCkBAIC0yNjksMTIgKzExNiw2IEBACiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwweGMwMDAgMCAwIDEgJm1wYzUyMDBfcGljIDAgMCAzIC8vIDFzdCBzbG90CiAJCQkJIDB4YzAwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAxIDMKQEAgLTI4NSwxMSArMTI2LDEyIEBACiAJCQkJIDB4YzgwMCAwIDAgMiAmbXBjNTIwMF9waWMgMSAyIDMKIAkJCQkgMHhjODAwIDAgMCAzICZtcGM1MjAwX3BpYyAxIDMgMwogCQkJCSAweGM4MDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMCAzPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCi0JCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAyMDAwMDAwIDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGIwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKKworCWxvY2FsYnVzIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BjbTAzMi5kdHMKaW5kZXggODVkODU3YTUuLjFkZDQ3OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzCkBAIC0xMiw5OSArMTIsMzcgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInBoeXRlYyxwY20wMzIiOwogCWNvbXBhdGlibGUgPSAicGh5dGVjLHBjbTAzMiI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKIAogCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDgwMDAwMDA+OwkvLyAxMjhNQgogCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KLQkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCXRpbWVyQDYwMCB7CQkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKLQkJfTsKLQogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDQ6IHRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ1OiB0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CkBAIC0xMTgsMTYzICs1Niw2MiBAQAogCQl9OwogCiAJCWdwdDc6IHRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWNhbkA5MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47Ci0JCQlyZWcgPSA8MHg5MDAgMHg4MD47Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlhYzk3QDIwMDAgewkvKiBQU0MxIGlzIGFjOTcgKi8KKwkJcHNjQDIwMDAgewkvKiBQU0MxIGlzIGFjOTcgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1hYzk3IiwiZnNsLG1wYzUyMDAtcHNjLWFjOTciOwogCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKIAkJLyogUFNDMiBwb3J0IGlzIHVzZWQgYnkgQ0FOMS8yICovCisJCXBzY0AyMjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKLQkJc2VyaWFsQDI0MDAgeyAvKiBQU0MzIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7IC8qIFBTQzMgaW4gVUFSVCBtb2RlICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAzIDA+OwogCQl9OwogCiAJCS8qIFBTQzQgaXMgPz8/ICovCisJCXBzY0AyNjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKIAkJLyogUFNDNSBpcyA/Pz8gKi8KKwkJcHNjQDI4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAotCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCXJ0Y0A1MSB7CiAJCQkJY29tcGF0aWJsZSA9ICJueHAscGNmODU2MyI7CiAJCQkJcmVnID0gPDB4NTE+OwogCQkJfTsKIAkJCWVlcHJvbUA1MiB7Ci0JCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzMyIjsKKwkJCQljb21wYXRpYmxlID0gImNhdGFseXN0LDI0YzMyIjsKIAkJCQlyZWcgPSA8MHg1Mj47CisJCQkJcGFnZXNpemUgPSA8MzI+OwogCQkJfTsKIAkJfTsKLQotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OwotCQl9OwogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBjaSIsImZzbCxtcGM1MjAwLXBjaSI7Ci0JCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMyAvLyAxc3Qgc2xvdAogCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMSAzCkBAIC0yODUsMjAgKzEyMiwxMiBAQAogCQkJCSAweGM4MDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMiAzCiAJCQkJIDB4YzgwMCAwIDAgMyAmbXBjNTIwMF9waWMgMSAzIDMKIAkJCQkgMHhjODAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDAgMz47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgotCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhiMDAwMDAwMCAwIDB4MDEwMDAwMDA+OwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOwotCi0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAxIDAgMHhmYzAwMDAwMCAweDAyMDAwMDAwCiAJCQkgIDIgMCAweGZiZTAwMDAwIDB4MDAyMDAwMDAKQEAgLTM1MSw0MCArMTgwLDM5IEBACiAJCQliYW5rLXdpZHRoID0gPDI+OwogCQl9OwogCi0gICAgICAgICAgICAgICAgLyoKKwkJLyoKIAkJICogZXhhbXBsZSBzbmlwcGV0cyBmb3IgRlBHQQogCQkgKgogCQkgKiBmcGdhQDMsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDMgMCAweDAyMDAwMDAwPjsKLQkJICogICAgICAgICBiYW5rLXdpZHRoID0gPDQ+OworCQkgKgkgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7CisJCSAqCSByZWcgPSA8MyAwIDB4MDIwMDAwMDA+OworCQkgKgkgYmFuay13aWR0aCA9IDw0PjsKIAkJICogfTsKIAkJICoKIAkJICogZnBnYUA0LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiZnBnYV9kcml2ZXIiOwotCQkgKiAgICAgICAgIHJlZyA9IDw0IDAgMHgwMjAwMDAwMD47Ci0JCSAqICAgICAgICAgYmFuay13aWR0aCA9IDw0PjsKKwkJICoJIGNvbXBhdGlibGUgPSAiZnBnYV9kcml2ZXIiOworCQkgKgkgcmVnID0gPDQgMCAweDAyMDAwMDAwPjsKKwkJICoJIGJhbmstd2lkdGggPSA8ND47CiAJCSAqIH07Ci0gICAgICAgICAgICAgICAgICovCisJCSAqLwogCi0gICAgICAgICAgICAgICAgLyoKKwkJLyoKIAkJICogZXhhbXBsZSBzbmlwcGV0cyBmb3IgZnJlZSBjaGlwc2VsZWN0cwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA1LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDUgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NSAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA2LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDYgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NiAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA3LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDcgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NyAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqLworCQkgKi8KIAl9OwogfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3VjMTAxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy91YzEwMS5kdHMKaW5kZXggMDE5MjY0Yy4uYmE4M2Q1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3VjMTAxLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzCkBAIC0xMSw3OSArMTEsMjQgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIm1hbnJvbGFuZCx1YzEwMSI7CiAJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsdWMxMDEiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCWdwdDA6IHRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDE6IHRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CkBAIC05NywxMTggKzQyLDg1IEBACiAJCX07CiAKIAkJZ3B0NDogdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ2OiB0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NzogdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQlydGNAODAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJY2FuQDkwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47CisJCWNhbkA5ODAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCXNwaUBmMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlzZXJpYWxAMjAwMCB7IC8qIFBTQzEgaW4gVUFSVCBtb2RlICovCisJCXVzYkAxMDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDIwMDAgewkvLyBQU0MxCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKLQkJc2VyaWFsQDIyMDAgeyAvKiBQU0MyIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjIwMCB7CS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMmMwMCB7CQkvKiBQU0M2IGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7CS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI2MDAgewkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJLy8gUFNDNQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMmMwMCB7CS8vIFBTQzYKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWNvbXBhdGlibGUgPSAiaW50ZWwsbHh0OTcxIjsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OworCQlpMmNAM2QwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCiAJCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CiAJCQlmc2wscHJlc2VydmUtY2xvY2tpbmc7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKIApAQCAtMjIxLDE5ICsxMzMsMTMgQEAKIAkJCQlyZWcgPSA8MHg1MT47CiAJCQl9OwogCQl9OworCX07CiAKLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKLQkJfTsKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOwotCi0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZmY4MDAwMDAgMHgwMDgwMDAwMAogCQkJICAxIDAgMHg4MDAwMDAwMCAweDAwODAwMDAwCiAJCQkgIDMgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnCmluZGV4IDRlMTllZTcuLjM0YjhjMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9raWxhdWVhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgva2lsYXVlYV9kZWZjb25maWcKQEAgLTEyLDYgKzEyLDggQEAKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKIENPTkZJR19LSUxBVUVBPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKICMgQ09ORklHX1dBTE5VVCBpcyBub3Qgc2V0CiBDT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfUENJPXkKQEAgLTQyLDYgKzQ0LDkgQEAKIENPTkZJR19NVERfTkFORD15CiBDT05GSUdfTVREX05BTkRfTkRGQz15CiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19QTT15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfUFBDNHh4X0NQTT15CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKICMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2NhbnlvbmxhbmRzX2RlZmNvbmZpZwppbmRleCA0NWM2NGQ4Li4xN2U0ZGQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jYW55b25sYW5kc19kZWZjb25maWcKQEAgLTQyLDYgKzQyLDkgQEAKIENPTkZJR19NVERfTkFORD15CiBDT05GSUdfTVREX05BTkRfTkRGQz15CiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19QTT15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfUFBDNHh4X0NQTT15CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKICMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vOHh4X2ltbWFwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vOHh4X2ltbWFwLmgKaW5kZXggNGIwZTE1Mi4uNmI2ZGMyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtLzh4eF9pbW1hcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS84eHhfaW1tYXAuaApAQCAtOTMsNyArOTMsNyBAQAogfSBtZW1jdGw4eHhfdDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQlIgLSBNZW1vcnkgQ29udHJvbGVyOiBCYXNlIFJlZ2lzdGVyCQkJCQkxNi05CisgKiBCUiAtIE1lbW9yeSBDb250cm9sbGVyOiBCYXNlIFJlZ2lzdGVyCQkJCQkxNi05CiAgKi8KICNkZWZpbmUgQlJfQkFfTVNLCTB4ZmZmZjgwMDAJLyogQmFzZSBBZGRyZXNzIE1hc2sJCQkqLwogI2RlZmluZSBCUl9BVF9NU0sJMHgwMDAwNzAwMAkvKiBBZGRyZXNzIFR5cGUgTWFzawkJCSovCkBAIC0xMTAsNyArMTEwLDcgQEAKICNkZWZpbmUgQlJfVgkJMHgwMDAwMDAwMQkvKiBCYW5rIFZhbGlkCQkJCSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9SIC0gTWVtb3J5IENvbnRyb2xlcjogT3B0aW9uIFJlZ2lzdGVyCQkJCTE2LTExCisgKiBPUiAtIE1lbW9yeSBDb250cm9sbGVyOiBPcHRpb24gUmVnaXN0ZXIJCQkJMTYtMTEKICAqLwogI2RlZmluZSBPUl9BTV9NU0sJMHhmZmZmODAwMAkvKiBBZGRyZXNzIE1hc2sgTWFzawkJCSovCiAjZGVmaW5lIE9SX0FUTV9NU0sJMHgwMDAwNzAwMAkvKiBBZGRyZXNzIFR5cGUgTWFzayBNYXNrCQkqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2JpdG9wcy5oCmluZGV4IDMwOTY0YWUuLjhhN2U5MzE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC0yNjcsNyArMjY3LDE2IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0Lmg+CiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCisjaWZkZWYgQ09ORklHX1BQQzY0Cit1bnNpZ25lZCBpbnQgX19hcmNoX2h3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KTsKK3Vuc2lnbmVkIGludCBfX2FyY2hfaHdlaWdodDE2KHVuc2lnbmVkIGludCB3KTsKK3Vuc2lnbmVkIGludCBfX2FyY2hfaHdlaWdodDMyKHVuc2lnbmVkIGludCB3KTsKK3Vuc2lnbmVkIGxvbmcgX19hcmNoX2h3ZWlnaHQ2NChfX3U2NCB3KTsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvY29uc3RfaHdlaWdodC5oPgorI2Vsc2UKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvaHdlaWdodC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmluZC5oPgogCiAvKiBMaXR0bGUtZW5kaWFuIHZlcnNpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCmluZGV4IGYzYTFmZGQuLmYwYTIxMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCkBAIC0xOTksNiArMTk5LDggQEAKICNkZWZpbmUgQ1BVX0ZUUl9VTkFMSUdORURfTERfU1RECUxPTkdfQVNNX0NPTlNUKDB4MDA4MDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9BU1lNX1NNVAkJTE9OR19BU01fQ09OU1QoMHgwMTAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MJTE9OR19BU01fQ09OU1QoMHgwMjAwMDAwMDAwMDAwMDAwKQorI2RlZmluZSBDUFVfRlRSX1BPUENOVEIJCQlMT05HX0FTTV9DT05TVCgweDA0MDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfUE9QQ05URAkJCUxPTkdfQVNNX0NPTlNUKDB4MDgwMDAwMDAwMDAwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtNDAzLDIxICs0MDUsMjIgQEAKIAkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKLQkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTKQorCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MgfCBcCisJICAgIENQVV9GVFJfUE9QQ05UQikKICNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI2IChDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NQVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFIHwgXAogCSAgICBDUFVfRlRSX0RTQ1IgfCBDUFVfRlRSX1VOQUxJR05FRF9MRF9TVEQgfCBcCi0JICAgIENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUykKKwkgICAgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTIHwgQ1BVX0ZUUl9QT1BDTlRCKQogI2RlZmluZSBDUFVfRlRSU19QT1dFUjcgKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUgfCBcCiAJICAgIENQVV9GVFJfRFNDUiB8IENQVV9GVFJfU0FPICB8IENQVV9GVFJfQVNZTV9TTVQgfCBcCi0JICAgIENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUykKKwkgICAgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTIHwgQ1BVX0ZUUl9QT1BDTlRCIHwgQ1BVX0ZUUl9QT1BDTlREKQogI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKaW5kZXggYThlMTg0NC4uZjcxYmI0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCkBAIC02MSwyMiArNjEsMjUgQEAKIAlyZXR1cm4gY3B1X3RocmVhZF9tYXNrX3RvX2NvcmVzKGNwdV9vbmxpbmVfbWFwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1X3RocmVhZF90b19jb3JlKGludCBjcHUpCi17Ci0JcmV0dXJuIGNwdSA+PiB0aHJlYWRzX3NoaWZ0OwotfQorI2lmZGVmIENPTkZJR19TTVAKK2ludCBjcHVfY29yZV9pbmRleF9vZl90aHJlYWQoaW50IGNwdSk7CitpbnQgY3B1X2ZpcnN0X3RocmVhZF9vZl9jb3JlKGludCBjb3JlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjcHVfY29yZV9pbmRleF9vZl90aHJlYWQoaW50IGNwdSkgeyByZXR1cm4gY3B1OyB9CitzdGF0aWMgaW5saW5lIGludCBjcHVfZmlyc3RfdGhyZWFkX29mX2NvcmUoaW50IGNvcmUpIHsgcmV0dXJuIGNvcmU7IH0KKyNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBjcHVfdGhyZWFkX2luX2NvcmUoaW50IGNwdSkKIHsKIAlyZXR1cm4gY3B1ICYgKHRocmVhZHNfcGVyX2NvcmUgLSAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1X2ZpcnN0X3RocmVhZF9pbl9jb3JlKGludCBjcHUpCitzdGF0aWMgaW5saW5lIGludCBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoaW50IGNwdSkKIHsKIAlyZXR1cm4gY3B1ICYgfih0aHJlYWRzX3Blcl9jb3JlIC0gMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwdV9sYXN0X3RocmVhZF9pbl9jb3JlKGludCBjcHUpCitzdGF0aWMgaW5saW5lIGludCBjcHVfbGFzdF90aHJlYWRfc2libGluZyhpbnQgY3B1KQogewogCXJldHVybiBjcHUgfCAodGhyZWFkc19wZXJfY29yZSAtIDEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCmluZGV4IGEzOTU0ZTQuLjE2ZDI1YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKQEAgLTksNiArOSwxMiBAQAogc3RydWN0IGRtYV9tYXBfb3BzOwogc3RydWN0IGRldmljZV9ub2RlOwogCisvKgorICogQXJjaCBleHRlbnNpb25zIHRvIHN0cnVjdCBkZXZpY2UuCisgKgorICogV2hlbiBhZGRpbmcgZmllbGRzLCBjb25zaWRlciBtYWNpb19hZGRfb25lX2RldmljZSBpbgorICogZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisgKi8KIHN0cnVjdCBkZXZfYXJjaGRhdGEgewogCS8qIERNQSBvcGVyYXRpb25zIG9uIHRoYXQgZGV2aWNlICovCiAJc3RydWN0IGRtYV9tYXBfb3BzCSpkbWFfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Zpcm13YXJlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaAppbmRleCAyMDc3OGE0Li40ZWY2NjJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaApAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBGV19GRUFUVVJFX1BTM19MVjEJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDgwMDAwMCkKICNkZWZpbmUgRldfRkVBVFVSRV9CRUFUCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAxMDAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX0NNTwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMjAwMDAwMCkKKyNkZWZpbmUgRldfRkVBVFVSRV9WUEhOCQlBU01fQ09OU1QoMHgwMDAwMDAwMDA0MDAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC01OSw3ICs2MCw3IEBACiAJCUZXX0ZFQVRVUkVfVklPIHwgRldfRkVBVFVSRV9SRE1BIHwgRldfRkVBVFVSRV9MTEFOIHwKIAkJRldfRkVBVFVSRV9CVUxLX1JFTU9WRSB8IEZXX0ZFQVRVUkVfWERBQlIgfAogCQlGV19GRUFUVVJFX01VTFRJVENFIHwgRldfRkVBVFVSRV9TUExQQVIgfCBGV19GRUFUVVJFX0xQQVIgfAotCQlGV19GRUFUVVJFX0NNTywKKwkJRldfRkVBVFVSRV9DTU8gfCBGV19GRUFUVVJFX1ZQSE4sCiAJRldfRkVBVFVSRV9QU0VSSUVTX0FMV0FZUyA9IDAsCiAJRldfRkVBVFVSRV9JU0VSSUVTX1BPU1NJQkxFID0gRldfRkVBVFVSRV9JU0VSSUVTIHwgRldfRkVBVFVSRV9MUEFSLAogCUZXX0ZFQVRVUkVfSVNFUklFU19BTFdBWVMgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKaW5kZXggZGUwM2NhNS4uZWMwODlhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaApAQCAtMjMyLDcgKzIzMiw5IEBACiAjZGVmaW5lIEhfR0VUX0VNX1BBUk1TCQkweDJCOAogI2RlZmluZSBIX1NFVF9NUFAJCTB4MkQwCiAjZGVmaW5lIEhfR0VUX01QUAkJMHgyRDQKLSNkZWZpbmUgTUFYX0hDQUxMX09QQ09ERQlIX0dFVF9NUFAKKyNkZWZpbmUgSF9IT01FX05PREVfQVNTT0NJQVRJVklUWSAweDJFQworI2RlZmluZSBIX0JFU1RfRU5FUkdZCQkweDJGNAorI2RlZmluZSBNQVhfSENBTExfT1BDT0RFCUhfQkVTVF9FTkVSR1kKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2xwcGFjYS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2xwcGFjYS5oCmluZGV4IDdmNWUwZmUuLjM4MGQ0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9scHBhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHBwYWNhLmgKQEAgLTYyLDcgKzYyLDEwIEBACiAJdm9sYXRpbGUgdTMyIGR5bl9waXI7CQkvLyBEeW5hbWljIFByb2NJZFJlZyB2YWx1ZQl4MjAteDIzCiAJdTMyCWRzZWlfZGF0YTsgICAgICAgICAgIAkvLyBEU0VJIGRhdGEgICAgICAgICAgICAgICAgICAJeDI0LXgyNwogCXU2NAlzcHJnMzsgICAgICAgICAgICAgICAJLy8gU1BSRzMgdmFsdWUgICAgICAgICAgICAgICAgCXgyOC14MkYKLQl1OAlyZXNlcnZlZDNbODBdOwkJLy8gUmVzZXJ2ZWQJCQl4MzAteDdGCisJdTgJcmVzZXJ2ZWQzWzQwXTsJCS8vIFJlc2VydmVkCQkJeDMwLXg1NworCXZvbGF0aWxlIHU4IHZwaG5fYXNzb2NfY291bnRzWzhdOyAvLyBWaXJ0dWFsIHByb2Nlc3NvciBob21lIG5vZGUKKwkJCQkJLy8gYXNzb2NpYXRpdml0eSBjaGFuZ2UgY291bnRlcnMgeDU4LXg1RgorCXU4CXJlc2VydmVkNFszMl07CQkvLyBSZXNlcnZlZAkJCXg2MC14N0YKIAogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gQ0FDSEVfTElORV8yIDB4MDA4MCAtIDB4MDBGRiBDb250YWlucyBsb2NhbCByZWFkLXdyaXRlIGRhdGEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCmluZGV4IGQwNDViMDEuLjg0MzNkMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaApAQCAtMjcsOSArMjcsNyBAQAogc3RydWN0IHJ0Y190aW1lOwogc3RydWN0IGZpbGU7CiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7Ci0jaWZkZWYgQ09ORklHX0tFWEVDCiBzdHJ1Y3Qga2ltYWdlOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCiBzdHJ1Y3Qgc21wX29wc190IHsKQEAgLTcyLDcgKzcwLDcgQEAKIAkJCQkJICAgICBpbnQgcHNpemUsIGludCBzc2l6ZSk7CiAJdm9pZAkJKCpmbHVzaF9oYXNoX3JhbmdlKSh1bnNpZ25lZCBsb25nIG51bWJlciwgaW50IGxvY2FsKTsKIAotCS8qIHNwZWNpYWwgZm9yIGtleGVjLCB0byBiZSBjYWxsZWQgaW4gcmVhbCBtb2RlLCBsaW5hciBtYXBwaW5nIGlzCisJLyogc3BlY2lhbCBmb3Iga2V4ZWMsIHRvIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUsIGxpbmVhciBtYXBwaW5nIGlzCiAJICogZGVzdHJveWVkIGFzIHdlbGwgKi8KIAl2b2lkCQkoKmhwdGVfY2xlYXJfYWxsKSh2b2lkKTsKIApAQCAtMzI0LDggKzMyMiw2IEBACiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAotZXh0ZXJuIHZvaWQgc2V0dXBfcGNpX3B0cnModm9pZCk7Ci0KICNpZmRlZiBDT05GSUdfU01QCiAvKiBQb29yIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zICovCiBleHRlcm4gdm9pZCBfX2RldmluaXQgc21wX2dlbmVyaWNfZ2l2ZV90aW1lYmFzZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAppbmRleCBhYWM4N2NiLi5mZDNmZDU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oCkBAIC0zMyw2ICszMyw5IEBACiBleHRlcm4gY3B1bWFza192YXJfdCBub2RlX3RvX2NwdW1hc2tfbWFwW107CiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfcGZuOwordTY0IG1lbW9yeV9ob3RwbHVnX21heCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZgogCiAvKgpAQCAtNDIsNiArNDUsOCBAQAogI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCiAjZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9lbmRfcGZuKQogCisjZWxzZQorI2RlZmluZSBtZW1vcnlfaG90cGx1Z19tYXgoKSBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpCiAjZW5kaWYgLyogQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9udnJhbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKaW5kZXggODUwYjcyZi4uOTJlZmU2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmgKQEAgLTEwLDMxICsxMCw3IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19OVlJBTV9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19OVlJBTV9ICiAKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotCi0jZGVmaW5lIE5WUldfQ05UIDB4MjAKLSNkZWZpbmUgTlZSQU1fSEVBREVSX0xFTiAxNiAvKiBzaXplb2Yoc3RydWN0IG52cmFtX2hlYWRlcikgKi8KLSNkZWZpbmUgTlZSQU1fQkxPQ0tfTEVOIDE2Ci0jZGVmaW5lIE5WUkFNX01BWF9SRVEgKDIwODAvTlZSQU1fQkxPQ0tfTEVOKQotI2RlZmluZSBOVlJBTV9NSU5fUkVRICgxMDU2L05WUkFNX0JMT0NLX0xFTikKLQotI2RlZmluZSBOVlJBTV9BUzAgIDB4NzQKLSNkZWZpbmUgTlZSQU1fQVMxICAweDc1Ci0jZGVmaW5lIE5WUkFNX0RBVEEgMHg3NwotCi0KLS8qIFJUQyBPZmZzZXRzICovCi0KLSNkZWZpbmUgTU9UT19SVENfU0VDT05EUwkweDFGRjkKLSNkZWZpbmUgTU9UT19SVENfTUlOVVRFUwkweDFGRkEKLSNkZWZpbmUgTU9UT19SVENfSE9VUlMJCTB4MUZGQgotI2RlZmluZSBNT1RPX1JUQ19EQVlfT0ZfV0VFSwkweDFGRkMKLSNkZWZpbmUgTU9UT19SVENfREFZX09GX01PTlRICTB4MUZGRAotI2RlZmluZSBNT1RPX1JUQ19NT05USAkJMHgxRkZFCi0jZGVmaW5lIE1PVE9fUlRDX1lFQVIJCTB4MUZGRgotI2RlZmluZSBNT1RPX1JUQ19DT05UUk9MQSAgICAgICAweDFGRjgKLSNkZWZpbmUgTU9UT19SVENfQ09OVFJPTEIgICAgICAgMHgxRkY5Ci0KKy8qIFNpZ25hdHVyZXMgZm9yIG52cmFtIHBhcnRpdGlvbnMgKi8KICNkZWZpbmUgTlZSQU1fU0lHX1NQCTB4MDIJLyogc3VwcG9ydCBwcm9jZXNzb3IgKi8KICNkZWZpbmUgTlZSQU1fU0lHX09GCTB4NTAJLyogb3BlbiBmaXJtd2FyZSBjb25maWcgKi8KICNkZWZpbmUgTlZSQU1fU0lHX0ZXCTB4NTEJLyogZ2VuZXJhbCBmaXJtd2FyZSAqLwpAQCAtNDksMzIgKzI1LDE5IEBACiAjZGVmaW5lIE5WUkFNX1NJR19PUwkweGEwCS8qIE9TIGRlZmluZWQgKi8KICNkZWZpbmUgTlZSQU1fU0lHX1BBTklDCTB4YTEJLyogQXBwbGUgT1NYICJwYW5pYyIgKi8KIAotLyogSWYgY2hhbmdlIHRoaXMgc2l6ZSwgdGhlbiBjaGFuZ2UgdGhlIHNpemUgb2YgTlZOQU1FX0xFTiAqLwotc3RydWN0IG52cmFtX2hlYWRlciB7Ci0JdW5zaWduZWQgY2hhciBzaWduYXR1cmU7Ci0JdW5zaWduZWQgY2hhciBjaGVja3N1bTsKLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Ci0JY2hhciBuYW1lWzEyXTsKLX07Ci0KICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotc3RydWN0IG52cmFtX3BhcnRpdGlvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBwYXJ0aXRpb247Ci0Jc3RydWN0IG52cmFtX2hlYWRlciBoZWFkZXI7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotfTsKLQotCisjaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCiBleHRlcm4gaW50IG52cmFtX3dyaXRlX2Vycm9yX2xvZyhjaGFyICogYnVmZiwgaW50IGxlbmd0aCwKIAkJCQkJIHVuc2lnbmVkIGludCBlcnJfdHlwZSwgdW5zaWduZWQgaW50IGVycl9zZXEpOwogZXh0ZXJuIGludCBudnJhbV9yZWFkX2Vycm9yX2xvZyhjaGFyICogYnVmZiwgaW50IGxlbmd0aCwKIAkJCQkJIHVuc2lnbmVkIGludCAqIGVycl90eXBlLCB1bnNpZ25lZCBpbnQgKmVycl9zZXEpOwogZXh0ZXJuIGludCBudnJhbV9jbGVhcl9lcnJvcl9sb2codm9pZCk7Ci0KIGV4dGVybiBpbnQgcFNlcmllc19udnJhbV9pbml0KHZvaWQpOworI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogCiAjaWZkZWYgQ09ORklHX01NSU9fTlZSQU0KIGV4dGVybiBpbnQgbW1pb19udnJhbV9pbml0KHZvaWQpOwpAQCAtODUsNiArNDgsMTMgQEAKIH0KICNlbmRpZgogCitleHRlcm4gaW50IF9faW5pdCBudnJhbV9zY2FuX3BhcnRpdGlvbnModm9pZCk7CitleHRlcm4gbG9mZl90IG52cmFtX2NyZWF0ZV9wYXJ0aXRpb24oY29uc3QgY2hhciAqbmFtZSwgaW50IHNpZywKKwkJCQkgICAgIGludCByZXFfc2l6ZSwgaW50IG1pbl9zaXplKTsKK2V4dGVybiBpbnQgbnZyYW1fcmVtb3ZlX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnKTsKK2V4dGVybiBpbnQgbnZyYW1fZ2V0X3BhcnRpdGlvbl9zaXplKGxvZmZfdCBkYXRhX2luZGV4KTsKK2V4dGVybiBsb2ZmX3QgbnZyYW1fZmluZF9wYXJ0aXRpb24oY29uc3QgY2hhciAqbmFtZSwgaW50IHNpZywgaW50ICpvdXRfc2l6ZSk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIC8qIFBvd2VyTWFjIHNwZWNpZmljIG52cmFtIHN0dWZmcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKaW5kZXggNDNhZGM4Yi4uMTI1NTU2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCkBAIC0zNiw2ICszNiw4IEBACiAjZGVmaW5lIFBQQ19JTlNUX05PUAkJCTB4NjAwMDAwMDAKICNkZWZpbmUgUFBDX0lOU1RfUE9QQ05UQgkJMHg3YzAwMDBmNAogI2RlZmluZSBQUENfSU5TVF9QT1BDTlRCX01BU0sJCTB4ZmMwMDA3ZmUKKyNkZWZpbmUgUFBDX0lOU1RfUE9QQ05URAkJMHg3YzAwMDNmNAorI2RlZmluZSBQUENfSU5TVF9QT1BDTlRXCQkweDdjMDAwMmY0CiAjZGVmaW5lIFBQQ19JTlNUX1JGQ0kJCQkweDRjMDAwMDY2CiAjZGVmaW5lIFBQQ19JTlNUX1JGREkJCQkweDRjMDAwMDRlCiAjZGVmaW5lIFBQQ19JTlNUX1JGTUNJCQkJMHg0YzAwMDA0YwpAQCAtODgsNiArOTAsMTIgQEAKIAkJCQkJX19QUENfUkIoYikgfCBfX1BQQ19FSChlaCkpCiAjZGVmaW5lIFBQQ19NU0dTTkQoYikJCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX01TR1NORCB8IFwKIAkJCQkJX19QUENfUkIoYikpCisjZGVmaW5lIFBQQ19QT1BDTlRCKGEsIHMpCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1BPUENOVEIgfCBcCisJCQkJCV9fUFBDX1JBKGEpIHwgX19QUENfUlMocykpCisjZGVmaW5lIFBQQ19QT1BDTlREKGEsIHMpCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1BPUENOVEQgfCBcCisJCQkJCV9fUFBDX1JBKGEpIHwgX19QUENfUlMocykpCisjZGVmaW5lIFBQQ19QT1BDTlRXKGEsIHMpCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1BPUENOVFcgfCBcCisJCQkJCV9fUFBDX1JBKGEpIHwgX19QUENfUlMocykpCiAjZGVmaW5lIFBQQ19SRkNJCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9SRkNJKQogI2RlZmluZSBQUENfUkZESQkJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfUkZESSkKICNkZWZpbmUgUFBDX1JGTUNJCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9SRk1DSSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA0YzE0MTg3Li5kZTE5NjdhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMjIsNyArMTIyLDYgQEAKIAkJVEFTS19VTk1BUFBFRF9CQVNFX1VTRVIzMiA6IFRBU0tfVU5NQVBQRURfQkFTRV9VU0VSNjQgKQogI2VuZGlmCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogCiAjZGVmaW5lIFNUQUNLX1RPUF9VU0VSNjQgVEFTS19TSVpFX1VTRVI2NApAQCAtMTM5LDcgKzEzOCw2IEBACiAjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCiAKICNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCBhZTI2ZjJlLi5kNzI3NTc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogLyogVHJhbnNsYXRlIGEgRE1BIGFkZHJlc3MgZnJvbSBkZXZpY2Ugc3BhY2UgdG8gQ1BVIHNwYWNlICovCiBleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKLQkJCQkgICAgY29uc3QgdTMyICppbl9hZGRyKTsKKwkJCQkgICAgY29uc3QgX19iZTMyICppbl9hZGRyKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKQEAgLTYzLDkgKzYzLDYgQEAKIC8qIGNhY2hlIGxvb2t1cCAqLwogc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25leHRfY2FjaGVfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAotLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLQogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gaW50IG9mX25vZGVfdG9fbmlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IGFmZTRhYWEuLjdlZjBkOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oCkBAIC0xMDYsOSArMTA2LDIyIEBACiAJCQkJCQlpbnQgbmlkKQogewogfQotCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX1BQQ19TUExQQVIpCitleHRlcm4gaW50IHN0YXJ0X3RvcG9sb2d5X3VwZGF0ZSh2b2lkKTsKK2V4dGVybiBpbnQgc3RvcF90b3BvbG9neV91cGRhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc3RhcnRfdG9wb2xvZ3lfdXBkYXRlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBzdG9wX3RvcG9sb2d5X3VwZGF0ZSh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19OVU1BICYmIENPTkZJR19QUENfU1BMUEFSICovCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy90b3BvbG9neS5oPgogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS92ZHNvX2RhdGFwYWdlLmgKaW5kZXggMDg2NzljNS4uMjVlMzkyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oCkBAIC0xMTYsOSArMTE2LDcgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi0jaWZkZWYgX19LRVJORUxfXwogZXh0ZXJuIHN0cnVjdCB2ZHNvX2RhdGEgKnZkc29fZGF0YTsKLSNlbmRpZgogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IDM2YzMwZjMuLjNiYjJhM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMjksOCArMjksMTAgQEAKIG9iai15CQkJCTo9IGNwdXRhYmxlLm8gcHRyYWNlLm8gc3lzY2FsbHMubyBcCiAJCQkJICAgaXJxLm8gYWxpZ24ubyBzaWduYWxfMzIubyBwbWMubyB2ZHNvLm8gXAogCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3MubyBzeXN0YmwubyBpZGxlLm8gXAotCQkJCSAgIHNpZ25hbC5vIHN5c2ZzLm8gY2FjaGVpbmZvLm8KLW9iai15CQkJCSs9IHZkc28zMi8KKwkJCQkgICBzaWduYWwubyBzeXNmcy5vIGNhY2hlaW5mby5vIHRpbWUubyBcCisJCQkJICAgcHJvbS5vIHRyYXBzLm8gc2V0dXAtY29tbW9uLm8gXAorCQkJCSAgIHVkYmcubyBtaXNjLm8gaW8ubyBkbWEubyBcCisJCQkJICAgbWlzY18kKENPTkZJR19XT1JEX1NJWkUpLm8gdmRzbzMyLwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBcCiAJCQkJICAgcGFjYS5vIG52cmFtXzY0Lm8gZmlybXdhcmUubwpAQCAtODAsOSArODIsNiBAQAogZXh0cmEtJChDT05GSUdfOHh4KQkJOj0gaGVhZF84eHgubwogZXh0cmEteQkJCQkrPSB2bWxpbnV4LmxkcwogCi1vYmoteQkJCQkrPSB0aW1lLm8gcHJvbS5vIHRyYXBzLm8gc2V0dXAtY29tbW9uLm8gXAotCQkJCSAgIHVkYmcubyBtaXNjLm8gaW8ubyBkbWEubyBcCi0JCQkJICAgbWlzY18kKENPTkZJR19XT1JEX1NJWkUpLm8KIG9iai0kKENPTkZJR19QUEMzMikJCSs9IGVudHJ5XzMyLm8gc2V0dXBfMzIubwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gZG1hLWlvbW11Lm8gaW9tbXUubwogb2JqLSQoQ09ORklHX0tHREIpCQkrPSBrZ2RiLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBiZDBkZjJlLi4yM2U2YTkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yMDksNyArMjA5LDYgQEAKIAlERUZJTkUoUlRBU0VOVFJZLCBvZmZzZXRvZihzdHJ1Y3QgcnRhc190LCBlbnRyeSkpOwogCiAJLyogSW50ZXJydXB0IHJlZ2lzdGVyIGZyYW1lICovCi0JREVGSU5FKFNUQUNLX0ZSQU1FX09WRVJIRUFELCBTVEFDS19GUkFNRV9PVkVSSEVBRCk7CiAJREVGSU5FKElOVF9GUkFNRV9TSVpFLCBTVEFDS19JTlRfRlJBTUVfU0laRSk7CiAJREVGSU5FKFNXSVRDSF9GUkFNRV9TSVpFLCBTVEFDS19GUkFNRV9PVkVSSEVBRCArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwogI2lmZGVmIENPTkZJR19QUEM2NApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDk2YTkwOGYuLmJlNWFiMTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTQ1NywxNiArNDU3LDI2IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gNiwKIAkJLnBtY190eXBlCQk9IFBQQ19QTUNfSUJNLAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNywKLQkJLmNwdV9yZXN0b3JlCQk9IF9fcmVzdG9yZV9jcHVfcG93ZXI3LAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI3IiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKLQkJLm9wcm9maWxlX21tY3JhX3NpaHYJPSBQT1dFUjZfTU1DUkFfU0lIViwKLQkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBQT1dFUjZfTU1DUkFfU0lQUiwKLQkJLm9wcm9maWxlX21tY3JhX2NsZWFyCT0gUE9XRVI2X01NQ1JBX1RIUk0gfAotCQkJUE9XRVI2X01NQ1JBX09USEVSLAogCQkucGxhdGZvcm0JCT0gInBvd2VyNyIsCiAJfSwKKwl7CS8qIFBvd2VyNysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDRBMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjcrIChyYXcpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjcsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSNywKKwkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX0hQVEVfVEFCTEUgfAorCQkJTU1VX0ZUUl9UTEJJRV8yMDYsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNyIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5wbGF0Zm9ybQkJPSAicG93ZXI3KyIsCisJfSwKIAl7CS8qIENlbGwgQnJvYWRiYW5kIEVuZ2luZSAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwNzAwMDAwLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYwppbmRleCA4ZTA1YzE2Li4wYTJhZjUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcnRhcy5oPgogCiAjaWZkZWYgREVCVUcKICNpbmNsdWRlIDxhc20vdWRiZy5oPgpAQCAtMTQxLDMgKzE0MiwzNSBAQAogCiAJcmV0dXJuIGNzaXplOwogfQorCisjaWZkZWYgQ09ORklHX1BQQ19SVEFTCisvKgorICogVGhlIGNyYXNoa2VybmVsIHJlZ2lvbiB3aWxsIGFsbW9zdCBhbHdheXMgb3ZlcmxhcCB0aGUgUlRBUyByZWdpb24sIHNvCisgKiB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2hlbiBzaHJpbmtpbmcgdGhlIGNyYXNoa2VybmVsIHJlZ2lvbi4KKyAqLwordm9pZCBjcmFzaF9mcmVlX3Jlc2VydmVkX3BoeXNfcmFuZ2UodW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWNvbnN0IHUzMiAqYmFzZXAsICpzaXplcDsKKwl1bnNpZ25lZCBpbnQgcnRhc19zdGFydCA9IDAsIHJ0YXNfZW5kID0gMDsKKworCWJhc2VwID0gb2ZfZ2V0X3Byb3BlcnR5KHJ0YXMuZGV2LCAibGludXgscnRhcy1iYXNlIiwgTlVMTCk7CisJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkocnRhcy5kZXYsICJydGFzLXNpemUiLCBOVUxMKTsKKworCWlmIChiYXNlcCAmJiBzaXplcCkgeworCQlydGFzX3N0YXJ0ID0gKmJhc2VwOworCQlydGFzX2VuZCA9ICpiYXNlcCArICpzaXplcDsKKwl9CisKKwlmb3IgKGFkZHIgPSBiZWdpbjsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJLyogRG9lcyB0aGlzIHBhZ2Ugb3ZlcmxhcCB3aXRoIHRoZSBSVEFTIHJlZ2lvbj8gKi8KKwkJaWYgKGFkZHIgPD0gcnRhc19lbmQgJiYgKChhZGRyICsgUEFHRV9TSVpFKSA+IHJ0YXNfc3RhcnQpKQorCQkJY29udGludWU7CisKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGZuX3RvX3BhZ2UoYWRkciA+PiBQQUdFX1NISUZUKSk7CisJCWluaXRfcGFnZV9jb3VudChwZm5fdG9fcGFnZShhZGRyID4+IFBBR0VfU0hJRlQpKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKV9fdmEoYWRkcikpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKaW5kZXggNmU1NGEwZi4uZTc1NTQxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCkBAIC0xOSw3ICsxOSw3IEBACiAJCQkJICAgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKIHsKIAlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2LCBnZXRfaW9tbXVfdGFibGVfYmFzZShkZXYpLCBzaXplLAotCQkJCSAgICBkbWFfaGFuZGxlLCBkZXZpY2VfdG9fbWFzayhkZXYpLCBmbGFnLAorCQkJCSAgICBkbWFfaGFuZGxlLCBkZXYtPmNvaGVyZW50X2RtYV9tYXNrLCBmbGFnLAogCQkJCSAgICBkZXZfdG9fbm9kZShkZXYpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IGVkNGFlYjkuLmMyMmRjMWVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKICN1bmRlZiBTSE9XX1NZU0NBTExTCiAjdW5kZWYgU0hPV19TWVNDQUxMU19UQVNLCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggOWY4YjAxZC4uOGE4MTc5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vZXhjZXB0aW9uLTY0cy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogLyoKICAqIFdlIGxheW91dCBwaHlzaWNhbCBtZW1vcnkgYXMgZm9sbG93czoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCmluZGV4IGU4NmMwNDAuLmRlMzY5NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAjaWZkZWYgQ09ORklHX1ZTWAogI2RlZmluZSBSRVNUXzMyRlBWU1JTKG4sYyxiYXNlKQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUwppbmRleCA4Mjc4ZThiLi45ZGQyMWE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQweC5TCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qIEFzIHdpdGggdGhlIG90aGVyIFBvd2VyUEMgcG9ydHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgd2hlbiBjb2RlCiAgKiBleGVjdXRpb24gYmVnaW5zIGhlcmUsIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzIGNvbnRhaW4gdmFsaWQsIHlldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCmluZGV4IDU2MjMwNWIuLmNiYjM0MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3luY2guaD4KICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggZjBkZDU3Ny4uNzgyZjIzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZV82NC5oPgogI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogLyogVGhlIHBoeXNpY2FsIG1lbW9yeSBpcyBsYXllZCBvdXQgc3VjaCB0aGF0IHRoZSBzZWNvbmRhcnkgcHJvY2Vzc29yCiAgKiBzcGluIGNvZGUgc2l0cyBhdCAweDAwMDAuLi4weDAwZmYuIE9uIHNlcnZlciwgdGhlIHZlY3RvcnMgZm9sbG93CkBAIC05Niw3ICs5Nyw3IEBACiAJLmxsb25nIGh2UmVsZWFzZURhdGEtS0VSTkVMQkFTRQogI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCi0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKIAkvKiBUaGlzIGZsYWcgaXMgc2V0IHRvIDEgYnkgYSBsb2FkZXIgaWYgdGhlIGtlcm5lbCBzaG91bGQgcnVuCiAJICogYXQgdGhlIGxvYWRlZCBhZGRyZXNzIGluc3RlYWQgb2YgdGhlIGxpbmtlZCBhZGRyZXNzLiAgVGhpcwogCSAqIGlzIHVzZWQgYnkga2V4ZWMtdG9vbHMgdG8ga2VlcCB0aGUgdGhlIGtkdW1wIGtlcm5lbCBpbiB0aGUKQEAgLTM4NCwxMiArMzg1LDEwIEBACiAJLyogcHJvY2VzcyByZWxvY2F0aW9ucyBmb3IgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCAqLwogCWxpcwlyMjUsUEFHRV9PRkZTRVRAaGlnaGVzdAkvKiBjb21wdXRlIHZpcnR1YWwgYmFzZSBvZiBrZXJuZWwgKi8KIAlzbGRpCXIyNSxyMjUsMzIKLSNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAogCWx3eglyNyxfX3J1bl9hdF9sb2FkLV9zdGV4dChyMjYpCi0JY21wbHdpCWNyMCxyNywxCS8qIGtkdW1wIGtlcm5lbCA/IC0gc3RheSB3aGVyZSB3ZSBhcmUgKi8KKwljbXBsd2kJY3IwLHI3LDEJLyogZmxhZ2dlZCB0byBzdGF5IHdoZXJlIHdlIGFyZSA/ICovCiAJYm5lCTFmCiAJYWRkCXIyNSxyMjUscjI2Ci0jZW5kaWYKIDE6CW1yCXIzLHIyNQogCWJsCS5yZWxvY2F0ZQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKaW5kZXggMWYxYTA0Yi4uMWNiZjY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKiBNYWNybyB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuICovCiAjaWZkZWYgQ09ORklHXzh4eF9DUFU2CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKaW5kZXggNTI5YjgxNy4uM2UwMjcxMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgImhlYWRfYm9va2UuaCIKIAogLyogQXMgd2l0aCB0aGUgb3RoZXIgUG93ZXJQQyBwb3J0cywgaXQgaXMgZXhwZWN0ZWQgdGhhdCB3aGVuIGNvZGUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwppbmRleCBkNTgzOTE3Li45NjFiYjAzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCkBAIC0zMTEsOCArMzExLDkgQEAKIAkJLyogSGFuZGxlIGZhaWx1cmUgKi8KIAkJaWYgKHVubGlrZWx5KGVudHJ5ID09IERNQV9FUlJPUl9DT0RFKSkgewogCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9JTkZPICJpb21tdV9hbGxvYyBmYWlsZWQsIHRibCAlcCB2YWRkciAlbHgiCi0JCQkJICAgICAgICIgbnBhZ2VzICVseFxuIiwgdGJsLCB2YWRkciwgbnBhZ2VzKTsKKwkJCQlkZXZfaW5mbyhkZXYsICJpb21tdV9hbGxvYyBmYWlsZWQsIHRibCAlcCAiCisJCQkJCSAidmFkZHIgJWx4IG5wYWdlcyAlbHVcbiIsIHRibCwgdmFkZHIsCisJCQkJCSBucGFnZXMpOwogCQkJZ290byBmYWlsdXJlOwogCQl9CiAKQEAgLTU3OSw5ICs1ODAsOSBAQAogCQkJCQkgYXR0cnMpOwogCQlpZiAoZG1hX2hhbmRsZSA9PSBETUFfRVJST1JfQ09ERSkgewogCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJpb21tdV9hbGxvYyBmYWlsZWQsICIKLQkJCQkJCSJ0YmwgJXAgdmFkZHIgJXAgbnBhZ2VzICVkXG4iLAotCQkJCQkJdGJsLCB2YWRkciwgbnBhZ2VzKTsKKwkJCQlkZXZfaW5mbyhkZXYsICJpb21tdV9hbGxvYyBmYWlsZWQsIHRibCAlcCAiCisJCQkJCSAidmFkZHIgJXAgbnBhZ2VzICVkXG4iLCB0YmwsIHZhZGRyLAorCQkJCQkgbnBhZ2VzKTsKIAkJCX0KIAkJfSBlbHNlCiAJCQlkbWFfaGFuZGxlIHw9ICh1YWRkciAmIH5JT01NVV9QQUdFX01BU0spOwpAQCAtNjI3LDcgKzYyOCw4IEBACiAJICogdGhlIHRjZSB0YWJsZXMuCiAJICovCiAJaWYgKG9yZGVyID49IElPTUFQX01BWF9PUkRFUikgewotCQlwcmludGsoImlvbW11X2FsbG9jX2NvbnNpc3RlbnQgc2l6ZSB0b28gbGFyZ2U6IDB4JWx4XG4iLCBzaXplKTsKKwkJZGV2X2luZm8oZGV2LCAiaW9tbXVfYWxsb2NfY29uc2lzdGVudCBzaXplIHRvbyBsYXJnZTogMHglbHhcbiIsCisJCQkgc2l6ZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwppbmRleCAyZDI5NzUyLi5iNjk0NjNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2MuUwpAQCAtMTIyLDggKzEyMiwzIEBACiAJbXRscglyMAogCW1yCXIzLHI0CiAJYmxyCi0KLV9HTE9CQUwoX19zZXR1cF9jcHVfcG93ZXI3KQotX0dMT0JBTChfX3Jlc3RvcmVfY3B1X3Bvd2VyNykKLQkvKiBwbGFjZSBob2xkZXIgKi8KLQlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKaW5kZXggYTdhNTcwZC4uMDk0YmQ5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogCS50ZXh0CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggZTUxNDQ5MC4uMjA2YTMyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIAkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKaW5kZXggOWNmMTk3Zi4uYmIxMmIzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYwpAQCAtMzQsMTUgKzM0LDI2IEBACiAKICN1bmRlZiBERUJVR19OVlJBTQogCi1zdGF0aWMgc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIG52cmFtX3BhcnQ7Ci1zdGF0aWMgbG9uZyBudnJhbV9lcnJvcl9sb2dfaW5kZXggPSAtMTsKLXN0YXRpYyBsb25nIG52cmFtX2Vycm9yX2xvZ19zaXplID0gMDsKKyNkZWZpbmUgTlZSQU1fSEVBREVSX0xFTglzaXplb2Yoc3RydWN0IG52cmFtX2hlYWRlcikKKyNkZWZpbmUgTlZSQU1fQkxPQ0tfTEVOCQlOVlJBTV9IRUFERVJfTEVOCiAKLXN0cnVjdCBlcnJfbG9nX2luZm8gewotCWludCBlcnJvcl90eXBlOwotCXVuc2lnbmVkIGludCBzZXFfbnVtOworLyogSWYgY2hhbmdlIHRoaXMgc2l6ZSwgdGhlbiBjaGFuZ2UgdGhlIHNpemUgb2YgTlZOQU1FX0xFTiAqLworc3RydWN0IG52cmFtX2hlYWRlciB7CisJdW5zaWduZWQgY2hhciBzaWduYXR1cmU7CisJdW5zaWduZWQgY2hhciBjaGVja3N1bTsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CisJLyogVGVybWluYXRpbmcgbnVsbCByZXF1aXJlZCBvbmx5IGZvciBuYW1lcyA8IDEyIGNoYXJzLiAqLworCWNoYXIgbmFtZVsxMl07CiB9OwogCitzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBhcnRpdGlvbjsKKwlzdHJ1Y3QgbnZyYW1faGVhZGVyIGhlYWRlcjsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKG52cmFtX3BhcnRpdGlvbnMpOworCiBzdGF0aWMgbG9mZl90IGRldl9udnJhbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCiB7CiAJaW50IHNpemU7CkBAIC0xODYsMTQgKzE5NywxMiBAQAogI2lmZGVmIERFQlVHX05WUkFNCiBzdGF0aWMgdm9pZCBfX2luaXQgbnZyYW1fcHJpbnRfcGFydGl0aW9ucyhjaGFyICogbGFiZWwpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHA7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIHRtcF9wYXJ0OwogCQogCXByaW50ayhLRVJOX1dBUk5JTkcgIi0tLS0tLS0tJXMtLS0tLS0tLS1cbiIsIGxhYmVsKTsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJpbmR4XHRcdHNpZ1x0Y2hrc1x0bGVuXHRuYW1lXG4iKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZudnJhbV9wYXJ0LT5wYXJ0aXRpb24pIHsKLQkJdG1wX3BhcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiU0ZCAgICBcdCUwMnhcdCUwMnhcdCVkXHQlc1xuIiwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9wYXJ0LCAmbnZyYW1fcGFydGl0aW9ucywgcGFydGl0aW9uKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiU0ZCAgICBcdCUwMnhcdCUwMnhcdCVkXHQlMTJzXG4iLAogCQkgICAgICAgdG1wX3BhcnQtPmluZGV4LCB0bXBfcGFydC0+aGVhZGVyLnNpZ25hdHVyZSwKIAkJICAgICAgIHRtcF9wYXJ0LT5oZWFkZXIuY2hlY2tzdW0sIHRtcF9wYXJ0LT5oZWFkZXIubGVuZ3RoLAogCQkgICAgICAgdG1wX3BhcnQtPmhlYWRlci5uYW1lKTsKQEAgLTIyOCw5NSArMjM3LDExMyBAQAogCXJldHVybiBjX3N1bTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbnZyYW1fcmVtb3ZlX29zX3BhcnRpdGlvbih2b2lkKQorLyoqCisgKiBudnJhbV9yZW1vdmVfcGFydGl0aW9uIC0gUmVtb3ZlIG9uZSBvciBtb3JlIHBhcnRpdGlvbnMgaW4gbnZyYW0KKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBwYXJ0aXRpb24gdG8gcmVtb3ZlLCBvciBOVUxMIGZvciBhCisgKiAgICAgICAgc2lnbmF0dXJlIG9ubHkgbWF0Y2gKKyAqIEBzaWc6IHNpZ25hdHVyZSBvZiB0aGUgcGFydGl0aW9uKHMpIHRvIHJlbW92ZQorICovCisKK2ludCBfX2luaXQgbnZyYW1fcmVtb3ZlX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqajsKLQlzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICogcGFydDsKLQlzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICogY3VyX3BhcnQ7CisJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqcGFydCwgKnByZXYsICp0bXA7CiAJaW50IHJjOwogCi0JbGlzdF9mb3JfZWFjaChpLCAmbnZyYW1fcGFydC0+cGFydGl0aW9uKSB7Ci0JCXBhcnQgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7Ci0JCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IE5WUkFNX1NJR19PUykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhcnQsICZudnJhbV9wYXJ0aXRpb25zLCBwYXJ0aXRpb24pIHsKKwkJaWYgKHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gc2lnKQogCQkJY29udGludWU7Ci0JCQotCQkvKiBNYWtlIG9zIHBhcnRpdGlvbiBhIGZyZWUgcGFydGl0aW9uICovCisJCWlmIChuYW1lICYmIHN0cm5jbXAobmFtZSwgcGFydC0+aGVhZGVyLm5hbWUsIDEyKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1ha2UgcGFydGl0aW9uIGEgZnJlZSBwYXJ0aXRpb24gKi8KIAkJcGFydC0+aGVhZGVyLnNpZ25hdHVyZSA9IE5WUkFNX1NJR19GUkVFOwotCQlzcHJpbnRmKHBhcnQtPmhlYWRlci5uYW1lLCAid3d3d3d3d3d3d3d3Iik7CisJCXN0cm5jcHkocGFydC0+aGVhZGVyLm5hbWUsICJ3d3d3d3d3d3d3d3ciLCAxMik7CiAJCXBhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZwYXJ0LT5oZWFkZXIpOwotCi0JCS8qIE1lcmdlIGNvbnRpZ3VvdXMgZnJlZSBwYXJ0aXRpb25zIGJhY2t3YXJkcyAqLwotCQlsaXN0X2Zvcl9lYWNoX3ByZXYoaiwgJnBhcnQtPnBhcnRpdGlvbikgewotCQkJY3VyX3BhcnQgPSBsaXN0X2VudHJ5KGosIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7Ci0JCQlpZiAoY3VyX3BhcnQgPT0gbnZyYW1fcGFydCB8fCBjdXJfcGFydC0+aGVhZGVyLnNpZ25hdHVyZSAhPSBOVlJBTV9TSUdfRlJFRSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlwYXJ0LT5oZWFkZXIubGVuZ3RoICs9IGN1cl9wYXJ0LT5oZWFkZXIubGVuZ3RoOwotCQkJcGFydC0+aGVhZGVyLmNoZWNrc3VtID0gbnZyYW1fY2hlY2tzdW0oJnBhcnQtPmhlYWRlcik7Ci0JCQlwYXJ0LT5pbmRleCA9IGN1cl9wYXJ0LT5pbmRleDsKLQotCQkJbGlzdF9kZWwoJmN1cl9wYXJ0LT5wYXJ0aXRpb24pOwotCQkJa2ZyZWUoY3VyX3BhcnQpOwotCQkJaiA9ICZwYXJ0LT5wYXJ0aXRpb247IC8qIGZpeHVwIG91ciBsb29wICovCi0JCX0KLQkJCi0JCS8qIE1lcmdlIGNvbnRpZ3VvdXMgZnJlZSBwYXJ0aXRpb25zIGZvcndhcmRzICovCi0JCWxpc3RfZm9yX2VhY2goaiwgJnBhcnQtPnBhcnRpdGlvbikgewotCQkJY3VyX3BhcnQgPSBsaXN0X2VudHJ5KGosIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7Ci0JCQlpZiAoY3VyX3BhcnQgPT0gbnZyYW1fcGFydCB8fCBjdXJfcGFydC0+aGVhZGVyLnNpZ25hdHVyZSAhPSBOVlJBTV9TSUdfRlJFRSkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlwYXJ0LT5oZWFkZXIubGVuZ3RoICs9IGN1cl9wYXJ0LT5oZWFkZXIubGVuZ3RoOwotCQkJcGFydC0+aGVhZGVyLmNoZWNrc3VtID0gbnZyYW1fY2hlY2tzdW0oJnBhcnQtPmhlYWRlcik7Ci0KLQkJCWxpc3RfZGVsKCZjdXJfcGFydC0+cGFydGl0aW9uKTsKLQkJCWtmcmVlKGN1cl9wYXJ0KTsKLQkJCWogPSAmcGFydC0+cGFydGl0aW9uOyAvKiBmaXh1cCBvdXIgbG9vcCAqLwotCQl9Ci0JCQogCQlyYyA9IG52cmFtX3dyaXRlX2hlYWRlcihwYXJ0KTsKIAkJaWYgKHJjIDw9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVtb3ZlX29zX3BhcnRpdGlvbjogbnZyYW1fd3JpdGUgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVtb3ZlX3BhcnRpdGlvbjogbnZyYW1fd3JpdGUgZmFpbGVkICglZClcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQorCX0KIAorCS8qIE1lcmdlIGNvbnRpZ3VvdXMgb25lcyAqLworCXByZXYgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXJ0LCB0bXAsICZudnJhbV9wYXJ0aXRpb25zLCBwYXJ0aXRpb24pIHsKKwkJaWYgKHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX0ZSRUUpIHsKKwkJCXByZXYgPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHByZXYpIHsKKwkJCXByZXYtPmhlYWRlci5sZW5ndGggKz0gcGFydC0+aGVhZGVyLmxlbmd0aDsKKwkJCXByZXYtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZwYXJ0LT5oZWFkZXIpOworCQkJcmMgPSBudnJhbV93cml0ZV9oZWFkZXIocGFydCk7CisJCQlpZiAocmMgPD0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVtb3ZlX3BhcnRpdGlvbjogbnZyYW1fd3JpdGUgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQlsaXN0X2RlbCgmcGFydC0+cGFydGl0aW9uKTsKKwkJCWtmcmVlKHBhcnQpOworCQl9IGVsc2UKKwkJCXByZXYgPSBwYXJ0OwogCX0KIAkKIAlyZXR1cm4gMDsKIH0KIAotLyogbnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbgorLyoqCisgKiBudnJhbV9jcmVhdGVfcGFydGl0aW9uIC0gQ3JlYXRlIGEgcGFydGl0aW9uIGluIG52cmFtCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcGFydGl0aW9uIHRvIGNyZWF0ZQorICogQHNpZzogc2lnbmF0dXJlIG9mIHRoZSBwYXJ0aXRpb24gdG8gY3JlYXRlCisgKiBAcmVxX3NpemU6IHNpemUgb2YgZGF0YSB0byBhbGxvY2F0ZSBpbiBieXRlcworICogQG1pbl9zaXplOiBtaW5pbXVtIGFjY2VwdGFibGUgc2l6ZSAoMCBtZWFucyByZXFfc2l6ZSkKICAqCi0gKiBDcmVhdGUgYSBPUyBsaW51eCBwYXJ0aXRpb24gdG8gYnVmZmVyIGVycm9yIGxvZ3MuCi0gKiBXaWxsIGNyZWF0ZSBhIHBhcnRpdGlvbiBzdGFydGluZyBhdCB0aGUgZmlyc3QgZnJlZQotICogc3BhY2UgZm91bmQgaWYgc3BhY2UgaGFzIGVub3VnaCByb29tLgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgYSBwb3NpdGl2ZSBudnJhbSBpbmRleAorICogb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBhcmVhIG9mIHRoZSBuZXdseSBjcmVhdGVkCisgKiBwYXJ0aXRpb24uIElmIHlvdSBwcm92aWRlZCBhIG1pbl9zaXplIHNtYWxsZXIgdGhhbiByZXFfc2l6ZQorICogeW91IG5lZWQgdG8gcXVlcnkgZm9yIHRoZSBhY3R1YWwgc2l6ZSB5b3Vyc2VsZiBhZnRlciB0aGUKKyAqIGNhbGwgdXNpbmcgbnZyYW1fcGFydGl0aW9uX2dldF9zaXplKCkuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IG52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb24odm9pZCkKK2xvZmZfdCBfX2luaXQgbnZyYW1fY3JlYXRlX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnLAorCQkJCSAgICAgaW50IHJlcV9zaXplLCBpbnQgbWluX3NpemUpCiB7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqcGFydDsKIAlzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICpuZXdfcGFydDsKIAlzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICpmcmVlX3BhcnQgPSBOVUxMOwotCWludCBzZXFfaW5pdFsyXSA9IHsgMCwgMCB9OworCXN0YXRpYyBjaGFyIG52X2luaXRfdmFsc1sxNl07CiAJbG9mZl90IHRtcF9pbmRleDsKIAlsb25nIHNpemUgPSAwOwogCWludCByYzsKLQkKKworCS8qIENvbnZlcnQgc2l6ZXMgZnJvbSBieXRlcyB0byBibG9ja3MgKi8KKwlyZXFfc2l6ZSA9IF9BTElHTl9VUChyZXFfc2l6ZSwgTlZSQU1fQkxPQ0tfTEVOKSAvIE5WUkFNX0JMT0NLX0xFTjsKKwltaW5fc2l6ZSA9IF9BTElHTl9VUChtaW5fc2l6ZSwgTlZSQU1fQkxPQ0tfTEVOKSAvIE5WUkFNX0JMT0NLX0xFTjsKKworCS8qIElmIG5vIG1pbmltdW0gc2l6ZSBzcGVjaWZpZWQsIG1ha2UgaXQgdGhlIHNhbWUgYXMgdGhlCisJICogcmVxdWVzdGVkIHNpemUKKwkgKi8KKwlpZiAobWluX3NpemUgPT0gMCkKKwkJbWluX3NpemUgPSByZXFfc2l6ZTsKKwlpZiAobWluX3NpemUgPiByZXFfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOb3cgYWRkIG9uZSBibG9jayB0byBlYWNoIGZvciB0aGUgaGVhZGVyICovCisJcmVxX3NpemUgKz0gMTsKKwltaW5fc2l6ZSArPSAxOworCiAJLyogRmluZCBhIGZyZWUgcGFydGl0aW9uIHRoYXQgd2lsbCBnaXZlIHVzIHRoZSBtYXhpbXVtIG5lZWRlZCBzaXplIAogCSAgIElmIGNhbid0IGZpbmQgb25lIHRoYXQgd2lsbCBnaXZlIHVzIHRoZSBtaW5pbXVtIHNpemUgbmVlZGVkICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0LCAmbnZyYW1fcGFydC0+cGFydGl0aW9uLCBwYXJ0aXRpb24pIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhcnQsICZudnJhbV9wYXJ0aXRpb25zLCBwYXJ0aXRpb24pIHsKIAkJaWYgKHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX0ZSRUUpCiAJCQljb250aW51ZTsKIAotCQlpZiAocGFydC0+aGVhZGVyLmxlbmd0aCA+PSBOVlJBTV9NQVhfUkVRKSB7Ci0JCQlzaXplID0gTlZSQU1fTUFYX1JFUTsKKwkJaWYgKHBhcnQtPmhlYWRlci5sZW5ndGggPj0gcmVxX3NpemUpIHsKKwkJCXNpemUgPSByZXFfc2l6ZTsKIAkJCWZyZWVfcGFydCA9IHBhcnQ7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIXNpemUgJiYgcGFydC0+aGVhZGVyLmxlbmd0aCA+PSBOVlJBTV9NSU5fUkVRKSB7Ci0JCQlzaXplID0gTlZSQU1fTUlOX1JFUTsKKwkJaWYgKHBhcnQtPmhlYWRlci5sZW5ndGggPiBzaXplICYmCisJCSAgICBwYXJ0LT5oZWFkZXIubGVuZ3RoID49IG1pbl9zaXplKSB7CisJCQlzaXplID0gcGFydC0+aGVhZGVyLmxlbmd0aDsKIAkJCWZyZWVfcGFydCA9IHBhcnQ7CiAJCX0KIAl9CkBAIC0zMjYsMTM2ICszNTMsOTUgQEAKIAkvKiBDcmVhdGUgb3VyIE9TIHBhcnRpdGlvbiAqLwogCW5ld19wYXJ0ID0ga21hbGxvYyhzaXplb2YoKm5ld19wYXJ0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfcGFydCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IGttYWxsb2MgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBrbWFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW5ld19wYXJ0LT5pbmRleCA9IGZyZWVfcGFydC0+aW5kZXg7Ci0JbmV3X3BhcnQtPmhlYWRlci5zaWduYXR1cmUgPSBOVlJBTV9TSUdfT1M7CisJbmV3X3BhcnQtPmhlYWRlci5zaWduYXR1cmUgPSBzaWc7CiAJbmV3X3BhcnQtPmhlYWRlci5sZW5ndGggPSBzaXplOwotCXN0cmNweShuZXdfcGFydC0+aGVhZGVyLm5hbWUsICJwcGM2NCxsaW51eCIpOworCXN0cm5jcHkobmV3X3BhcnQtPmhlYWRlci5uYW1lLCBuYW1lLCAxMik7CiAJbmV3X3BhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZuZXdfcGFydC0+aGVhZGVyKTsKIAogCXJjID0gbnZyYW1fd3JpdGVfaGVhZGVyKG5ld19wYXJ0KTsKIAlpZiAocmMgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlX2hlYWRlciAiCi0JCQkJImZhaWxlZCAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgYW5kIGluaXRpYWxpemUgdG8gemVybyB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZCB0aGUgZXJyb3IKLQkgICB0eXBlIGxvZ2dlZCAqLwotCXRtcF9pbmRleCA9IG5ld19wYXJ0LT5pbmRleCArIE5WUkFNX0hFQURFUl9MRU47Ci0JcmMgPSBwcGNfbWQubnZyYW1fd3JpdGUoKGNoYXIgKikmc2VxX2luaXQsIHNpemVvZihzZXFfaW5pdCksICZ0bXBfaW5kZXgpOwotCWlmIChyYyA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbjogbnZyYW1fd3JpdGUgIgorCQlwcl9lcnIoIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlX2hlYWRlciAiCiAJCSAgICAgICAiZmFpbGVkICglZClcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KLQkKLQludnJhbV9lcnJvcl9sb2dfaW5kZXggPSBuZXdfcGFydC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOOwotCW52cmFtX2Vycm9yX2xvZ19zaXplID0gKChwYXJ0LT5oZWFkZXIubGVuZ3RoIC0gMSkgKgotCQkJCU5WUkFNX0JMT0NLX0xFTikgLSBzaXplb2Yoc3RydWN0IGVycl9sb2dfaW5mbyk7Ci0JCiAJbGlzdF9hZGRfdGFpbCgmbmV3X3BhcnQtPnBhcnRpdGlvbiwgJmZyZWVfcGFydC0+cGFydGl0aW9uKTsKIAotCWlmIChmcmVlX3BhcnQtPmhlYWRlci5sZW5ndGggPD0gc2l6ZSkgeworCS8qIEFkanVzdCBvciByZW1vdmUgdGhlIHBhcnRpdGlvbiB3ZSBzdG9sZSB0aGUgc3BhY2UgZnJvbSAqLworCWlmIChmcmVlX3BhcnQtPmhlYWRlci5sZW5ndGggPiBzaXplKSB7CisJCWZyZWVfcGFydC0+aW5kZXggKz0gc2l6ZSAqIE5WUkFNX0JMT0NLX0xFTjsKKwkJZnJlZV9wYXJ0LT5oZWFkZXIubGVuZ3RoIC09IHNpemU7CisJCWZyZWVfcGFydC0+aGVhZGVyLmNoZWNrc3VtID0gbnZyYW1fY2hlY2tzdW0oJmZyZWVfcGFydC0+aGVhZGVyKTsKKwkJcmMgPSBudnJhbV93cml0ZV9oZWFkZXIoZnJlZV9wYXJ0KTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXByX2VycigibnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbjogbnZyYW1fd3JpdGVfaGVhZGVyICIKKwkJCSAgICAgICAiZmFpbGVkICglZClcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSB7CiAJCWxpc3RfZGVsKCZmcmVlX3BhcnQtPnBhcnRpdGlvbik7CiAJCWtmcmVlKGZyZWVfcGFydCk7Ci0JCXJldHVybiAwOwogCX0gCiAKLQkvKiBBZGp1c3QgdGhlIHBhcnRpdGlvbiB3ZSBzdG9sZSB0aGUgc3BhY2UgZnJvbSAqLwotCWZyZWVfcGFydC0+aW5kZXggKz0gc2l6ZSAqIE5WUkFNX0JMT0NLX0xFTjsKLQlmcmVlX3BhcnQtPmhlYWRlci5sZW5ndGggLT0gc2l6ZTsKLQlmcmVlX3BhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZmcmVlX3BhcnQtPmhlYWRlcik7Ci0JCi0JcmMgPSBudnJhbV93cml0ZV9oZWFkZXIoZnJlZV9wYXJ0KTsKLQlpZiAocmMgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlX2hlYWRlciAiCi0JCSAgICAgICAiZmFpbGVkICglZClcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qIG52cmFtX3NldHVwX3BhcnRpdGlvbgotICoKLSAqIFRoaXMgd2lsbCBzZXR1cCB0aGUgcGFydGl0aW9uIHdlIG5lZWQgZm9yIGJ1ZmZlcmluZyB0aGUKLSAqIGVycm9yIGxvZ3MgYW5kIGNsZWFudXAgcGFydGl0aW9ucyBpZiBuZWVkZWQuCi0gKgotICogVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdGhlIGZvbGxvd2luZzoKLSAqIDEuKSBJZiB0aGVyZSBpcyBwcGM2NCxsaW51eCBwYXJ0aXRpb24gbGFyZ2UgZW5vdWdoIHRoZW4gdXNlIGl0LgotICogMi4pIElmIHRoZXJlIGlzIG5vdCBhIHBwYzY0LGxpbnV4IHBhcnRpdGlvbiBsYXJnZSBlbm91Z2gsIHNlYXJjaAotICogZm9yIGEgZnJlZSBwYXJ0aXRpb24gdGhhdCBpcyBsYXJnZSBlbm91Z2guCi0gKiAzLikgSWYgdGhlcmUgaXMgbm90IGEgZnJlZSBwYXJ0aXRpb24gbGFyZ2UgZW5vdWdoIHJlbW92ZSAKLSAqIF9hbGxfIE9TIHBhcnRpdGlvbnMgYW5kIGNvbnNvbGlkYXRlIHRoZSBzcGFjZS4KLSAqIDQuKSBXaWxsIGZpcnN0IHRyeSBnZXR0aW5nIGEgY2h1bmsgdGhhdCB3aWxsIHNhdGlzZnkgdGhlIG1heGltdW0KLSAqIGVycm9yIGxvZyBzaXplIChOVlJBTV9NQVhfUkVRKS4KLSAqIDUuKSBJZiB0aGUgbWF4IGNodW5rIGNhbm5vdCBiZSBhbGxvY2F0ZWQgdGhlbiB0cnkgZmluZGluZyBhIGNodW5rCi0gKiB0aGF0IHdpbGwgc2F0aXNmeSB0aGUgbWludW0gbmVlZGVkIChOVlJBTV9NSU5fUkVRKS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgbnZyYW1fc2V0dXBfcGFydGl0aW9uKHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqIHA7Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIHBhcnQ7Ci0JaW50IHJjOwotCi0JLyogRm9yIG5vdywgd2UgZG9uJ3QgZG8gYW55IG9mIHRoaXMgb24gcG1hYywgdW50aWwgSQotCSAqIGhhdmUgZmlndXJlZCBvdXQgaWYgaXQncyB3b3J0aCBraWxsaW5nIHNvbWUgdW51c2VkIHN0dWZmcwotCSAqIGluIG91ciBudnJhbSwgYXMgQXBwbGUgZGVmaW5lZCBwYXJ0aXRpb25zIHVzZSBwcmV0dHkgbXVjaAotCSAqIGFsbCBvZiB0aGUgc3BhY2UKLQkgKi8KLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JLyogc2VlIGlmIHdlIGhhdmUgYW4gT1MgcGFydGl0aW9uIHRoYXQgbWVldHMgb3VyIG5lZWRzLgotCSAgIHdpbGwgdHJ5IGdldHRpbmcgdGhlIG1heCB3ZSBuZWVkLiAgSWYgbm90IHdlJ2xsIGRlbGV0ZQotCSAgIHBhcnRpdGlvbnMgYW5kIHRyeSBhZ2Fpbi4gKi8KLQlsaXN0X2Zvcl9lYWNoKHAsICZudnJhbV9wYXJ0LT5wYXJ0aXRpb24pIHsKLQkJcGFydCA9IGxpc3RfZW50cnkocCwgc3RydWN0IG52cmFtX3BhcnRpdGlvbiwgcGFydGl0aW9uKTsKLQkJaWYgKHBhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX09TKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN0cmNtcChwYXJ0LT5oZWFkZXIubmFtZSwgInBwYzY0LGxpbnV4IikpCi0JCQljb250aW51ZTsKLQotCQlpZiAocGFydC0+aGVhZGVyLmxlbmd0aCA+PSBOVlJBTV9NSU5fUkVRKSB7Ci0JCQkvKiBmb3VuZCBvdXIgcGFydGl0aW9uICovCi0JCQludnJhbV9lcnJvcl9sb2dfaW5kZXggPSBwYXJ0LT5pbmRleCArIE5WUkFNX0hFQURFUl9MRU47Ci0JCQludnJhbV9lcnJvcl9sb2dfc2l6ZSA9ICgocGFydC0+aGVhZGVyLmxlbmd0aCAtIDEpICoKLQkJCQkJCU5WUkFNX0JMT0NLX0xFTikgLSBzaXplb2Yoc3RydWN0IGVycl9sb2dfaW5mbyk7Ci0JCQlyZXR1cm4gMDsKKwkvKiBDbGVhciB0aGUgbmV3IHBhcnRpdGlvbiAqLworCWZvciAodG1wX2luZGV4ID0gbmV3X3BhcnQtPmluZGV4ICsgTlZSQU1fSEVBREVSX0xFTjsKKwkgICAgIHRtcF9pbmRleCA8ICAoKHNpemUgLSAxKSAqIE5WUkFNX0JMT0NLX0xFTik7CisJICAgICB0bXBfaW5kZXggKz0gTlZSQU1fQkxPQ0tfTEVOKSB7CisJCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKG52X2luaXRfdmFscywgTlZSQU1fQkxPQ0tfTEVOLCAmdG1wX2luZGV4KTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXByX2VycigibnZyYW1fY3JlYXRlX3BhcnRpdGlvbjogbnZyYW1fd3JpdGUgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKIAkJfQogCX0KIAkKLQkvKiB0cnkgY3JlYXRpbmcgYSBwYXJ0aXRpb24gd2l0aCB0aGUgZnJlZSBzcGFjZSB3ZSBoYXZlICovCi0JcmMgPSBudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uKCk7Ci0JaWYgKCFyYykgewotCQlyZXR1cm4gMDsKLQl9Ci0JCQotCS8qIG5lZWQgdG8gZnJlZSB1cCBzb21lIHNwYWNlICovCi0JcmMgPSBudnJhbV9yZW1vdmVfb3NfcGFydGl0aW9uKCk7Ci0JaWYgKHJjKSB7Ci0JCXJldHVybiByYzsKLQl9CisJcmV0dXJuIG5ld19wYXJ0LT5pbmRleCArIE5WUkFNX0hFQURFUl9MRU47Cit9CisKKy8qKgorICogbnZyYW1fZ2V0X3BhcnRpdGlvbl9zaXplIC0gR2V0IHRoZSBkYXRhIHNpemUgb2YgYW4gbnZyYW0gcGFydGl0aW9uCisgKiBAZGF0YV9pbmRleDogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBvZgorICogICAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24uIFRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgICAgICBudnJhbV9jcmVhdGVfcGFydGl0aW9uKCkuCisgKi8KK2ludCBudnJhbV9nZXRfcGFydGl0aW9uX3NpemUobG9mZl90IGRhdGFfaW5kZXgpCit7CisJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqcGFydDsKIAkKLQkvKiBjcmVhdGUgYSBwYXJ0aXRpb24gaW4gdGhpcyBuZXcgc3BhY2UgKi8KLQlyYyA9IG52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb24oKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBDb3VsZCBub3QgZmluZCBhICIKLQkJICAgICAgICJOVlJBTSBwYXJ0aXRpb24gbGFyZ2UgZW5vdWdoXG4iKTsKLQkJcmV0dXJuIHJjOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFydCwgJm52cmFtX3BhcnRpdGlvbnMsIHBhcnRpdGlvbikgeworCQlpZiAocGFydC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOID09IGRhdGFfaW5kZXgpCisJCQlyZXR1cm4gKHBhcnQtPmhlYWRlci5sZW5ndGggLSAxKSAqIE5WUkFNX0JMT0NLX0xFTjsKIAl9Ci0JCi0JcmV0dXJuIDA7CisJcmV0dXJuIC0xOwogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IG52cmFtX3NjYW5fcGFydGl0aW9ucyh2b2lkKQorLyoqCisgKiBudnJhbV9maW5kX3BhcnRpdGlvbiAtIEZpbmQgYW4gbnZyYW0gcGFydGl0aW9uIGJ5IHNpZ25hdHVyZSBhbmQgbmFtZQorICogQG5hbWU6IE5hbWUgb2YgdGhlIHBhcnRpdGlvbiBvciBOVUxMIGZvciBhbnkgbmFtZQorICogQHNpZzogU2lnbmF0dXJlIHRvIHRlc3QgYWdhaW5zdAorICogQG91dF9zaXplOiBpZiBub24tTlVMTCwgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBwYXJ0aXRpb24KKyAqLworbG9mZl90IG52cmFtX2ZpbmRfcGFydGl0aW9uKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaWcsIGludCAqb3V0X3NpemUpCit7CisJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm52cmFtX3BhcnRpdGlvbnMsIHBhcnRpdGlvbikgeworCQlpZiAocC0+aGVhZGVyLnNpZ25hdHVyZSA9PSBzaWcgJiYKKwkJICAgICghbmFtZSB8fCAhc3RybmNtcChwLT5oZWFkZXIubmFtZSwgbmFtZSwgMTIpKSkgeworCQkJaWYgKG91dF9zaXplKQorCQkJCSpvdXRfc2l6ZSA9IChwLT5oZWFkZXIubGVuZ3RoIC0gMSkgKgorCQkJCQlOVlJBTV9CTE9DS19MRU47CisJCQlyZXR1cm4gcC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgX19pbml0IG52cmFtX3NjYW5fcGFydGl0aW9ucyh2b2lkKQogewogCWxvZmZfdCBjdXJfaW5kZXggPSAwOwogCXN0cnVjdCBudnJhbV9oZWFkZXIgcGhlYWQ7CkBAIC00NjUsNyArNDUxLDcgQEAKIAlpbnQgdG90YWxfc2l6ZTsKIAlpbnQgZXJyOwogCi0JaWYgKHBwY19tZC5udnJhbV9zaXplID09IE5VTEwpCisJaWYgKHBwY19tZC5udnJhbV9zaXplID09IE5VTEwgfHwgcHBjX21kLm52cmFtX3NpemUoKSA8PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAl0b3RhbF9zaXplID0gcHBjX21kLm52cmFtX3NpemUoKTsKIAkKQEAgLTUxMiwxMiArNDk4LDE2IEBACiAJCQogCQltZW1jcHkoJnRtcF9wYXJ0LT5oZWFkZXIsICZwaGVhZCwgTlZSQU1fSEVBREVSX0xFTik7CiAJCXRtcF9wYXJ0LT5pbmRleCA9IGN1cl9pbmRleDsKLQkJbGlzdF9hZGRfdGFpbCgmdG1wX3BhcnQtPnBhcnRpdGlvbiwgJm52cmFtX3BhcnQtPnBhcnRpdGlvbik7CisJCWxpc3RfYWRkX3RhaWwoJnRtcF9wYXJ0LT5wYXJ0aXRpb24sICZudnJhbV9wYXJ0aXRpb25zKTsKIAkJCiAJCWN1cl9pbmRleCArPSBwaGVhZC5sZW5ndGggKiBOVlJBTV9CTE9DS19MRU47CiAJfQogCWVyciA9IDA7CiAKKyNpZmRlZiBERUJVR19OVlJBTQorCW52cmFtX3ByaW50X3BhcnRpdGlvbnMoIk5WUkFNIFBhcnRpdGlvbnMiKTsKKyNlbmRpZgorCiAgb3V0OgogCWtmcmVlKGhlYWRlcik7CiAJcmV0dXJuIGVycjsKQEAgLTUyNSw5ICs1MTUsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgbnZyYW1faW5pdCh2b2lkKQogewotCWludCBlcnJvcjsKIAlpbnQgcmM7CiAJCisJQlVJTERfQlVHX09OKE5WUkFNX0JMT0NLX0xFTiAhPSAxNik7CisKIAlpZiAocHBjX21kLm52cmFtX3NpemUgPT0gTlVMTCB8fCBwcGNfbWQubnZyYW1fc2l6ZSgpIDw9IDApCiAJCXJldHVybiAgLUVOT0RFVjsKIApAQCAtNTM3LDI5ICs1MjgsNiBAQAogCQlyZXR1cm4gcmM7CiAJfQogICAJCi0gIAkvKiBpbml0aWFsaXplIG91ciBhbmNob3IgZm9yIHRoZSBudnJhbSBwYXJ0aXRpb24gbGlzdCAqLwotICAJbnZyYW1fcGFydCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBudnJhbV9wYXJ0aXRpb24pLCBHRlBfS0VSTkVMKTsKLSAgCWlmICghbnZyYW1fcGFydCkgewotICAJCXByaW50ayhLRVJOX0VSUiAibnZyYW1faW5pdDogRmFpbGVkIGttYWxsb2NcbiIpOwotICAJCXJldHVybiAtRU5PTUVNOwotICAJfQotICAJSU5JVF9MSVNUX0hFQUQoJm52cmFtX3BhcnQtPnBhcnRpdGlvbik7Ci0gIAotICAJLyogR2V0IGFsbCB0aGUgTlZSQU0gcGFydGl0aW9ucyAqLwotICAJZXJyb3IgPSBudnJhbV9zY2FuX3BhcnRpdGlvbnMoKTsKLSAgCWlmIChlcnJvcikgewotICAJCXByaW50ayhLRVJOX0VSUiAibnZyYW1faW5pdDogRmFpbGVkIG52cmFtX3NjYW5fcGFydGl0aW9uc1xuIik7Ci0gIAkJcmV0dXJuIGVycm9yOwotICAJfQotICAJCQotICAJaWYobnZyYW1fc2V0dXBfcGFydGl0aW9uKCkpIAotICAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52cmFtX2luaXQ6IENvdWxkIG5vdCBmaW5kIG52cmFtIHBhcnRpdGlvbiIKLSAgCQkgICAgICAgIiBmb3IgbnZyYW0gYnVmZmVyZWQgZXJyb3IgbG9nZ2luZy5cbiIpOwotICAKLSNpZmRlZiBERUJVR19OVlJBTQotCW52cmFtX3ByaW50X3BhcnRpdGlvbnMoIk5WUkFNIFBhcnRpdGlvbnMiKTsKLSNlbmRpZgotCiAgIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU2OCwxMzUgKzUzNiw2IEBACiAgICAgICAgIG1pc2NfZGVyZWdpc3RlciggJm52cmFtX2RldiApOwogfQogCi0KLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKLQotLyogbnZyYW1fd3JpdGVfZXJyb3JfbG9nCi0gKgotICogV2UgbmVlZCB0byBidWZmZXIgdGhlIGVycm9yIGxvZ3MgaW50byBudnJhbSB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlCi0gKiB0aGUgZmFpbHVyZSBpbmZvcm1hdGlvbiB0byBkZWNvZGUuICBJZiB3ZSBoYXZlIGEgc2V2ZXJlIGVycm9yIHRoZXJlCi0gKiBpcyBubyB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIE9TIG9yIHRoZSBtYWNoaW5lIGlzIGluIGEgc3RhdGUgdG8KLSAqIGdldCBiYWNrIHRvIHVzZXIgbGFuZCBhbmQgd3JpdGUgdGhlIGVycm9yIHRvIGRpc2suICBGb3IgZXhhbXBsZSBpZgotICogdGhlIFNDU0kgZGV2aWNlIGRyaXZlciBjYXVzZXMgYSBNYWNoaW5lIENoZWNrIGJ5IHdyaXRpbmcgdG8gYSBiYWQKLSAqIElPIGFkZHJlc3MsIHRoZXJlIGlzIG5vIHdheSBvZiBndWFyYW50ZWVpbmcgdGhhdCB0aGUgZGV2aWNlIGRyaXZlcgotICogaXMgaW4gYW55IHN0YXRlIHRoYXQgaXMgd291bGQgYWxzbyBiZSBhYmxlIHRvIHdyaXRlIHRoZSBlcnJvciBkYXRhCi0gKiBjYXB0dXJlZCB0byBkaXNrLCB0aHVzIHdlIGJ1ZmZlciBpdCBpbiBOVlJBTSBmb3IgYW5hbHlzaXMgb24gdGhlCi0gKiBuZXh0IGJvb3QuCi0gKgotICogSW4gTlZSQU0gdGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBlcnJvciBsb2cgYnVmZmVyIHdpbGwgbG9va3MgbGlrZToKLSAqIEhlYWRlciAoaW4gYnl0ZXMpOgotICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgc2lnbmF0dXJlIHwgY2hlY2tzdW0gfCBsZW5ndGggfCBuYW1lICAgICAgIHwgZGF0YSAgICAgICAgICAgICB8Ci0gKiB8MCAgICAgICAgICB8MSAgICAgICAgIHwyICAgICAgM3w0ICAgICAgICAgMTV8MTYgICAgICAgIGxlbmd0aC0xfAotICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqCi0gKiBUaGUgJ2RhdGEnIHNlY3Rpb24gd291bGQgbG9vayBsaWtlIChpbiBieXRlcyk6Ci0gKiArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogfCBldmVudF9sb2dnZWQgfCBzZXF1ZW5jZSAjIHwgZXJyb3IgbG9nICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwwICAgICAgICAgICAgM3w0ICAgICAgICAgIDd8OCAgICAgICAgICAgIG52cmFtX2Vycm9yX2xvZ19zaXplLTF8Ci0gKiArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICoKLSAqIGV2ZW50X2xvZ2dlZDogMCBpZiBldmVudCBoYXMgbm90IGJlZW4gbG9nZ2VkIHRvIHN5c2xvZywgMSBpZiBpdCBoYXMKLSAqIHNlcXVlbmNlICM6IFRoZSB1bmlxdWUgc2VxdWVuY2UgIyBmb3IgZWFjaCBldmVudC4gKHVudGlsIGl0IHdyYXBzKQotICogZXJyb3IgbG9nOiBUaGUgZXJyb3IgbG9nIGZyb20gZXZlbnRfc2NhbgotICovCi1pbnQgbnZyYW1fd3JpdGVfZXJyb3JfbG9nKGNoYXIgKiBidWZmLCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXJyX3R5cGUsIHVuc2lnbmVkIGludCBlcnJvcl9sb2dfY250KQotewotCWludCByYzsKLQlsb2ZmX3QgdG1wX2luZGV4OwotCXN0cnVjdCBlcnJfbG9nX2luZm8gaW5mbzsKLQkKLQlpZiAobnZyYW1fZXJyb3JfbG9nX2luZGV4ID09IC0xKSB7Ci0JCXJldHVybiAtRVNQSVBFOwotCX0KLQotCWlmIChsZW5ndGggPiBudnJhbV9lcnJvcl9sb2dfc2l6ZSkgewotCQlsZW5ndGggPSBudnJhbV9lcnJvcl9sb2dfc2l6ZTsKLQl9Ci0KLQlpbmZvLmVycm9yX3R5cGUgPSBlcnJfdHlwZTsKLQlpbmZvLnNlcV9udW0gPSBlcnJvcl9sb2dfY250OwotCi0JdG1wX2luZGV4ID0gbnZyYW1fZXJyb3JfbG9nX2luZGV4OwotCi0JcmMgPSBwcGNfbWQubnZyYW1fd3JpdGUoKGNoYXIgKikmaW5mbywgc2l6ZW9mKHN0cnVjdCBlcnJfbG9nX2luZm8pLCAmdG1wX2luZGV4KTsKLQlpZiAocmMgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3dyaXRlX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3dyaXRlICglZClcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKGJ1ZmYsIGxlbmd0aCwgJnRtcF9pbmRleCk7Ci0JaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV93cml0ZV9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV93cml0ZSAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIG52cmFtX3JlYWRfZXJyb3JfbG9nCi0gKgotICogUmVhZHMgbnZyYW0gZm9yIGVycm9yIGxvZyBmb3IgYXQgbW9zdCAnbGVuZ3RoJwotICovCi1pbnQgbnZyYW1fcmVhZF9lcnJvcl9sb2coY2hhciAqIGJ1ZmYsIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICogZXJyX3R5cGUsIHVuc2lnbmVkIGludCAqIGVycm9yX2xvZ19jbnQpCi17Ci0JaW50IHJjOwotCWxvZmZfdCB0bXBfaW5kZXg7Ci0Jc3RydWN0IGVycl9sb2dfaW5mbyBpbmZvOwotCQotCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpCi0JCXJldHVybiAtMTsKLQotCWlmIChsZW5ndGggPiBudnJhbV9lcnJvcl9sb2dfc2l6ZSkKLQkJbGVuZ3RoID0gbnZyYW1fZXJyb3JfbG9nX3NpemU7Ci0KLQl0bXBfaW5kZXggPSBudnJhbV9lcnJvcl9sb2dfaW5kZXg7Ci0KLQlyYyA9IHBwY19tZC5udnJhbV9yZWFkKChjaGFyICopJmluZm8sIHNpemVvZihzdHJ1Y3QgZXJyX2xvZ19pbmZvKSwgJnRtcF9pbmRleCk7Ci0JaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9yZWFkX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3JlYWQgKCVkKVxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBwcGNfbWQubnZyYW1fcmVhZChidWZmLCBsZW5ndGgsICZ0bXBfaW5kZXgpOwotCWlmIChyYyA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVhZF9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV9yZWFkICglZClcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCSplcnJvcl9sb2dfY250ID0gaW5mby5zZXFfbnVtOwotCSplcnJfdHlwZSA9IGluZm8uZXJyb3JfdHlwZTsKLQotCXJldHVybiAwOwotfQotCi0vKiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgemVybyBhbnl0aGluZywgYnV0IGl0IHNldHMgdGhlIGV2ZW50X2xvZ2dlZAotICogd29yZCB0byB0ZWxsIHRoYXQgdGhpcyBldmVudCBpcyBzYWZlbHkgaW4gc3lzbG9nLgotICovCi1pbnQgbnZyYW1fY2xlYXJfZXJyb3JfbG9nKHZvaWQpCi17Ci0JbG9mZl90IHRtcF9pbmRleDsKLQlpbnQgY2xlYXJfd29yZCA9IEVSUl9GTEFHX0FMUkVBRFlfTE9HR0VEOwotCWludCByYzsKLQotCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpCi0JCXJldHVybiAtMTsKLQotCXRtcF9pbmRleCA9IG52cmFtX2Vycm9yX2xvZ19pbmRleDsKLQkKLQlyYyA9IHBwY19tZC5udnJhbV93cml0ZSgoY2hhciAqKSZjbGVhcl93b3JkLCBzaXplb2YoaW50KSwgJnRtcF9pbmRleCk7Ci0JaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jbGVhcl9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV93cml0ZSAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwotCiBtb2R1bGVfaW5pdChudnJhbV9pbml0KTsKIG1vZHVsZV9leGl0KG52cmFtX2NsZWFudXApOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggZDQzZmM2NS4uODUxNTc3NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0xOTMsOCArMTkzLDcgQEAKIAlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArPSBpb192aXJ0X29mZnNldDsKIAlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7CiAKLQlwcl9kZWJ1ZygiICBob3NlLT5pb19yZXNvdXJjZT0weCUwMTZsbHguLi4weCUwMTZsbHhcbiIsCi0JCSBob3NlLT5pb19yZXNvdXJjZS5zdGFydCwgaG9zZS0+aW9fcmVzb3VyY2UuZW5kKTsKKwlwcl9kZWJ1ZygiICBob3NlLT5pb19yZXNvdXJjZT0lcFJcbiIsICZob3NlLT5pb19yZXNvdXJjZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGFiM2UzOTIuLmVmM2VmNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtMTg2LDMgKzE4NiwxMCBAQAogRVhQT1JUX1NZTUJPTChfX21mZGNyKTsKICNlbmRpZgogRVhQT1JUX1NZTUJPTChlbXB0eV96ZXJvX3BhZ2UpOworCisjaWZkZWYgQ09ORklHX1BQQzY0CitFWFBPUlRfU1lNQk9MKF9fYXJjaF9od2VpZ2h0OCk7CitFWFBPUlRfU1lNQk9MKF9fYXJjaF9od2VpZ2h0MTYpOworRVhQT1JUX1NZTUJPTChfX2FyY2hfaHdlaWdodDMyKTsKK0VYUE9SVF9TWU1CT0woX19hcmNoX2h3ZWlnaHQ2NCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX3NhdmVfcmVncy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfc2F2ZV9yZWdzLlMKaW5kZXggNTExM2JkMi4uZTgzYmEzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfc2F2ZV9yZWdzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfc2F2ZV9yZWdzLlMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCiAgKiBHcmFiIHRoZSByZWdpc3RlciB2YWx1ZXMgYXMgdGhleSBhcmUgbm93LgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCA4ODMzNGFmLi5jMmI3YTA3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMTE3LDQxICsxMTcsMyBAQAogCWNlbGxzID0gcHJvcCA/ICoodTMyICopcHJvcCA6IG9mX25fc2l6ZV9jZWxscyhkbik7CiAJKnNpemUgPSBvZl9yZWFkX251bWJlcihkbWFfd2luZG93LCBjZWxscyk7CiB9Ci0KLS8qKgotICogU2VhcmNoIHRoZSBkZXZpY2UgdHJlZSBmb3IgdGhlIGJlc3QgTUFDIGFkZHJlc3MgdG8gdXNlLiAgJ21hYy1hZGRyZXNzJyBpcwotICogY2hlY2tlZCBmaXJzdCwgYmVjYXVzZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdG8gIm1vc3QgcmVjZW50IiBNQUMKLSAqIGFkZHJlc3MuIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuICdsb2NhbC1tYWMtYWRkcmVzcycgaXMgY2hlY2tlZCBuZXh0LAotICogYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IGFkZHJlc3MuICBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiB0aGUgb2Jzb2xldGUKLSAqICdhZGRyZXNzJyBpcyBjaGVja2VkLCBqdXN0IGluIGNhc2Ugd2UncmUgdXNpbmcgYW4gb2xkIGRldmljZSB0cmVlLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgJ2FkZHJlc3MnIHByb3BlcnR5IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYSB2aXJ0dWFsIGFkZHJlc3Mgb2YKLSAqIHRoZSByZWdpc3RlciBzZXQsIGJ1dCBzb21lIERUUyBmaWxlcyBoYXZlIHJlZGVmaW5lZCB0aGF0IHByb3BlcnR5IHRvIGJlIHRoZQotICogTUFDIGFkZHJlc3MuCi0gKgotICogQWxsLXplcm8gTUFDIGFkZHJlc3NlcyBhcmUgcmVqZWN0ZWQsIGJlY2F1c2UgdGhvc2UgY291bGQgYmUgcHJvcGVydGllcyB0aGF0Ci0gKiBleGlzdCBpbiB0aGUgZGV2aWNlIHRyZWUsIGJ1dCB3ZXJlIG5vdCBzZXQgYnkgVS1Cb290LiAgRm9yIGV4YW1wbGUsIHRoZQotICogRFRTIGNvdWxkIGRlZmluZSAnbWFjLWFkZHJlc3MnIGFuZCAnbG9jYWwtbWFjLWFkZHJlc3MnLCB3aXRoIHplcm8gTUFDCi0gKiBhZGRyZXNzZXMuICBTb21lIG9sZGVyIFUtQm9vdHMgb25seSBpbml0aWFsaXplZCAnbG9jYWwtbWFjLWFkZHJlc3MnLiAgSW4KLSAqIHRoaXMgY2FzZSwgdGhlIHJlYWwgTUFDIGlzIGluICdsb2NhbC1tYWMtYWRkcmVzcycsIGFuZCAnbWFjLWFkZHJlc3MnIGV4aXN0cwotICogYnV0IGlzIGFsbCB6ZXJvcy4KLSovCi1jb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOwotCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCi0JCXJldHVybiBwcC0+dmFsdWU7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X21hY19hZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCmluZGV4IGE5YjMyOTYuLjkwNjUzNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTMxNiw2ICsxMzE2LDEwIEBACiBzdGF0aWMgbG9uZyBwcGNfc2V0X2h3ZGVidWcoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKIAkJICAgICBzdHJ1Y3QgcHBjX2h3X2JyZWFrcG9pbnQgKmJwX2luZm8pCiB7CisjaWZuZGVmIENPTkZJR19QUENfQURWX0RFQlVHX1JFR1MKKwl1bnNpZ25lZCBsb25nIGRhYnI7CisjZW5kaWYKKwogCWlmIChicF9pbmZvLT52ZXJzaW9uICE9IDEpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAjaWZkZWYgQ09ORklHX1BQQ19BRFZfREVCVUdfUkVHUwpAQCAtMTM1MywxMSArMTM1NywxMCBAQAogCS8qCiAJICogV2Ugb25seSBzdXBwb3J0IG9uZSBkYXRhIGJyZWFrcG9pbnQKIAkgKi8KLQlpZiAoKChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiBQUENfQlJFQUtQT0lOVF9UUklHR0VSX1JXKSA9PSAwKSB8fAotCSAgICAoKGJwX2luZm8tPnRyaWdnZXJfdHlwZSAmIH5QUENfQlJFQUtQT0lOVF9UUklHR0VSX1JXKSAhPSAwKSB8fAotCSAgICAoYnBfaW5mby0+dHJpZ2dlcl90eXBlICE9IFBQQ19CUkVBS1BPSU5UX1RSSUdHRVJfV1JJVEUpIHx8Ci0JICAgIChicF9pbmZvLT5hZGRyX21vZGUgIT0gUFBDX0JSRUFLUE9JTlRfTU9ERV9FWEFDVCkgfHwKLQkgICAgKGJwX2luZm8tPmNvbmRpdGlvbl9tb2RlICE9IFBQQ19CUkVBS1BPSU5UX0NPTkRJVElPTl9OT05FKSkKKwlpZiAoKGJwX2luZm8tPnRyaWdnZXJfdHlwZSAmIFBQQ19CUkVBS1BPSU5UX1RSSUdHRVJfUlcpID09IDAgfHwKKwkgICAgKGJwX2luZm8tPnRyaWdnZXJfdHlwZSAmIH5QUENfQlJFQUtQT0lOVF9UUklHR0VSX1JXKSAhPSAwIHx8CisJICAgIGJwX2luZm8tPmFkZHJfbW9kZSAhPSBQUENfQlJFQUtQT0lOVF9NT0RFX0VYQUNUIHx8CisJICAgIGJwX2luZm8tPmNvbmRpdGlvbl9tb2RlICE9IFBQQ19CUkVBS1BPSU5UX0NPTkRJVElPTl9OT05FKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChjaGlsZC0+dGhyZWFkLmRhYnIpCkBAIC0xMzY2LDcgKzEzNjksMTQgQEAKIAlpZiAoKHVuc2lnbmVkIGxvbmcpYnBfaW5mby0+YWRkciA+PSBUQVNLX1NJWkUpCiAJCXJldHVybiAtRUlPOwogCi0JY2hpbGQtPnRocmVhZC5kYWJyID0gKHVuc2lnbmVkIGxvbmcpYnBfaW5mby0+YWRkcjsKKwlkYWJyID0gKHVuc2lnbmVkIGxvbmcpYnBfaW5mby0+YWRkciAmIH43VUw7CisJZGFiciB8PSBEQUJSX1RSQU5TTEFUSU9OOworCWlmIChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiBQUENfQlJFQUtQT0lOVF9UUklHR0VSX1JFQUQpCisJCWRhYnIgfD0gREFCUl9EQVRBX1JFQUQ7CisJaWYgKGJwX2luZm8tPnRyaWdnZXJfdHlwZSAmIFBQQ19CUkVBS1BPSU5UX1RSSUdHRVJfV1JJVEUpCisJCWRhYnIgfD0gREFCUl9EQVRBX1dSSVRFOworCisJY2hpbGQtPnRocmVhZC5kYWJyID0gZGFicjsKIAogCXJldHVybiAxOwogI2VuZGlmIC8qICFDT05GSUdfUFBDX0FEVl9ERUJVR19EVkNTICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggOGE2ZGFmNC4uNjljNGJlOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMjgwLDcgKzI4MCwxMSBAQAogCQkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIERBQlIgYW5kIG5vIElBQlJTIGF0IHRoZSBtb21lbnQgKi8KIAkJaWYgKGFkZHIgPiAwKQogCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX1BQQ19BRFZfREVCVUdfUkVHUworCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkLmRhYzEsICh1MzIgX191c2VyICopZGF0YSk7CisjZWxzZQogCQlyZXQgPSBwdXRfdXNlcihjaGlsZC0+dGhyZWFkLmRhYnIsICh1MzIgX191c2VyICopZGF0YSk7CisjZW5kaWYKIAkJYnJlYWs7CiAJfQogCkBAIC0zMTIsNiArMzE2LDkgQEAKIAljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CiAJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKIAljYXNlIFBUUkFDRV9DT05UOgorCWNhc2UgUFBDX1BUUkFDRV9HRVRIV0RCR0lORk86CisJY2FzZSBQUENfUFRSQUNFX1NFVEhXREVCVUc6CisJY2FzZSBQUENfUFRSQUNFX0RFTEhXREVCVUc6CiAJCXJldCA9IGFyY2hfcHRyYWNlKGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKaW5kZXggOGZlOGJjNi4uMjA5N2YyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CiAKIHN0cnVjdCBydGFzX3QgcnRhcyA9IHsKIAkubG9jayA9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQKQEAgLTcxMyw2ICs3MTQsNyBAQAogCWludCBjcHU7CiAKIAlzbGJfc2V0X3NpemUoU0xCX01JTl9TSVpFKTsKKwlzdG9wX3RvcG9sb2d5X3VwZGF0ZSgpOwogCXByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nIGlibSxzdXNwZW5kLW1lIG9uIGNwdSAlaVxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCXdoaWxlIChyYyA9PSBIX01VTFRJX1RIUkVBRFNfQUNUSVZFICYmICFhdG9taWNfcmVhZCgmZGF0YS0+ZG9uZSkgJiYKQEAgLTcyOCw2ICs3MzAsNyBAQAogCQlyYyA9IGF0b21pY19yZWFkKCZkYXRhLT5lcnJvcik7CiAKIAlhdG9taWNfc2V0KCZkYXRhLT5lcnJvciwgcmMpOworCXN0YXJ0X3RvcG9sb2d5X3VwZGF0ZSgpOwogCiAJaWYgKHdha2Vfd2hlbl9kb25lKSB7CiAJCWF0b21pY19zZXQoJmRhdGEtPmRvbmUsIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IGNlNmY2MWMuLjVhMDQwMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTQzNyw4ICs0MzcsOCBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJLyoKLQkgKiBpbnRlcnJ1cHQgc3RhY2tzIG11c3QgYmUgdW5kZXIgMjU2TUIsIHdlIGNhbm5vdCBhZmZvcmQgdG8gdGFrZQotCSAqIFNMQiBtaXNzZXMgb24gdGhlbS4KKwkgKiBJbnRlcnJ1cHQgc3RhY2tzIG11c3QgYmUgaW4gdGhlIGZpcnN0IHNlZ21lbnQgc2luY2Ugd2UKKwkgKiBjYW5ub3QgYWZmb3JkIHRvIHRha2UgU0xCIG1pc3NlcyBvbiB0aGVtLgogCSAqLwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXNvZnRpcnFfY3R4W2ldID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggNjgwMzRiYi4uOTgxMzYwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC00NjYsNyArNDY2LDIwIEBACiAJcmV0dXJuIGlkOwogfQogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aGVuIG5vIGNoYW5nZSBjYW4gb2NjdXIgdG8gY3B1X3ByZXNlbnRfbWFzaywKKy8qIEhlbHBlciByb3V0aW5lcyBmb3IgY3B1IHRvIGNvcmUgbWFwcGluZyAqLworaW50IGNwdV9jb3JlX2luZGV4X29mX3RocmVhZChpbnQgY3B1KQoreworCXJldHVybiBjcHUgPj4gdGhyZWFkc19zaGlmdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9jb3JlX2luZGV4X29mX3RocmVhZCk7CisKK2ludCBjcHVfZmlyc3RfdGhyZWFkX29mX2NvcmUoaW50IGNvcmUpCit7CisJcmV0dXJuIGNvcmUgPDwgdGhyZWFkc19zaGlmdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9maXJzdF90aHJlYWRfb2ZfY29yZSk7CisKKy8qIE11c3QgYmUgY2FsbGVkIHdoZW4gbm8gY2hhbmdlIGNhbiBvY2N1ciB0byBjcHVfcHJlc2VudF9tYXAsCiAgKiBpLmUuIGR1cmluZyBjcHUgb25saW5lIG9yIG9mZmxpbmUuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV90b19sMmNhY2hlKGludCBjcHUpCkBAIC01MTQsNyArNTI3LDcgQEAKIAlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAJc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKIAkvKiBVcGRhdGUgc2libGluZyBtYXBzICovCi0JYmFzZSA9IGNwdV9maXJzdF90aHJlYWRfaW5fY29yZShjcHUpOworCWJhc2UgPSBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsKIAlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkc19wZXJfY29yZTsgaSsrKSB7CiAJCWlmIChjcHVfaXNfb2ZmbGluZShiYXNlICsgaSkpCiAJCQljb250aW51ZTsKQEAgLTYwMCw3ICs2MTMsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJLyogVXBkYXRlIHNpYmxpbmcgbWFwcyAqLwotCWJhc2UgPSBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsKKwliYXNlID0gY3B1X2ZpcnN0X3RocmVhZF9zaWJsaW5nKGNwdSk7CiAJZm9yIChpID0gMDsgaSA8IHRocmVhZHNfcGVyX2NvcmU7IGkrKykgewogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9zaWJsaW5nX21hc2soYmFzZSArIGkpKTsKIAkJY3B1bWFza19jbGVhcl9jcHUoYmFzZSArIGksIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDAxMDQwNjkuLjA5ZTRkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogc3RhdGljIHU2NCB0Yl90b19uc19zY2FsZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0IF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBib290X3RiIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdTY0IGJvb3RfdGIgX19yZWFkX21vc3RseTsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CiBzdGF0aWMgbG9uZyB0aW1lem9uZV9vZmZzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUwppbmRleCBmZTQ2MDQ4Li45ZGU2ZjM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmVjdG9yLlMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCiAgKiBsb2FkX3VwX2FsdGl2ZWModW51c2VkLCB1bnVzZWQsIHRzaykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IDQ0MWQyYTcuLjFiNjk1ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtNjAwLDYgKzYwMCwxMSBAQAogCXZpb19jbW9fZGVhbGxvYyh2aW9kZXYsIGFsbG9jX3NpemUpOwogfQogCitzdGF0aWMgaW50IHZpb19kbWFfaW9tbXVfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworICAgICAgICByZXR1cm4gZG1hX2lvbW11X29wcy5kbWFfc3VwcG9ydGVkKGRldiwgbWFzayk7Cit9CisKIHN0cnVjdCBkbWFfbWFwX29wcyB2aW9fZG1hX21hcHBpbmdfb3BzID0gewogCS5hbGxvY19jb2hlcmVudCA9IHZpb19kbWFfaW9tbXVfYWxsb2NfY29oZXJlbnQsCiAJLmZyZWVfY29oZXJlbnQgID0gdmlvX2RtYV9pb21tdV9mcmVlX2NvaGVyZW50LApAQCAtNjA3LDYgKzYxMiw3IEBACiAJLnVubWFwX3NnICAgICAgID0gdmlvX2RtYV9pb21tdV91bm1hcF9zZywKIAkubWFwX3BhZ2UgICAgICAgPSB2aW9fZG1hX2lvbW11X21hcF9wYWdlLAogCS51bm1hcF9wYWdlICAgICA9IHZpb19kbWFfaW9tbXVfdW5tYXBfcGFnZSwKKwkuZG1hX3N1cHBvcnRlZCAgPSB2aW9fZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQsCiAKIH07CiAKQEAgLTg1OCw4ICs4NjQsNyBAQAogCiBzdGF0aWMgdm9pZCB2aW9fY21vX3NldF9kbWFfb3BzKHN0cnVjdCB2aW9fZGV2ICp2aW9kZXYpCiB7Ci0JdmlvX2RtYV9tYXBwaW5nX29wcy5kbWFfc3VwcG9ydGVkID0gZG1hX2lvbW11X29wcy5kbWFfc3VwcG9ydGVkOwotCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmdmlvX2RtYV9tYXBwaW5nX29wczsKKwlzZXRfZG1hX29wcygmdmlvZGV2LT5kZXYsICZ2aW9fZG1hX21hcHBpbmdfb3BzKTsKIH0KIAogLyoqCkBAIC0xMjQ0LDcgKzEyNDksNyBAQAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0NNTykpCiAJCXZpb19jbW9fc2V0X2RtYV9vcHModmlvZGV2KTsKIAllbHNlCi0JCXZpb2Rldi0+ZGV2LmFyY2hkYXRhLmRtYV9vcHMgPSAmZG1hX2lvbW11X29wczsKKwkJc2V0X2RtYV9vcHMoJnZpb2Rldi0+ZGV2LCAmZG1hX2lvbW11X29wcyk7CiAJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJnZpb2Rldi0+ZGV2LCB2aW9fYnVpbGRfaW9tbXVfdGFibGUodmlvZGV2KSk7CiAJc2V0X2Rldl9ub2RlKCZ2aW9kZXYtPmRldiwgb2Zfbm9kZV90b19uaWQob2Zfbm9kZSkpOwogCkBAIC0xMjUyLDYgKzEyNTcsMTAgQEAKIAl2aW9kZXYtPmRldi5wYXJlbnQgPSAmdmlvX2J1c19kZXZpY2UuZGV2OwogCXZpb2Rldi0+ZGV2LmJ1cyA9ICZ2aW9fYnVzX3R5cGU7CiAJdmlvZGV2LT5kZXYucmVsZWFzZSA9IHZpb19kZXZfcmVsZWFzZTsKKyAgICAgICAgLyogbmVlZGVkIHRvIGVuc3VyZSBwcm9wZXIgb3BlcmF0aW9uIG9mIGNvaGVyZW50IGFsbG9jYXRpb25zCisgICAgICAgICAqIGxhdGVyLCBpbiBjYXNlIGRyaXZlciBkb2Vzbid0IHNldCBpdCBleHBsaWNpdGx5ICovCisgICAgICAgIGRtYV9zZXRfbWFzaygmdmlvZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOworICAgICAgICBkbWFfc2V0X2NvaGVyZW50X21hc2soJnZpb2Rldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBkZXZpY2UgZnJhbWV3b3JrICovCiAJaWYgKGRldmljZV9yZWdpc3RlcigmdmlvZGV2LT5kZXYpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwppbmRleCBlMzE2ODQ3Li5iYWRjOTgzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKQEAgLTEzMDcsMTIgKzEzMDcsMTAgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAl1bnNpZ25lZCBsb25nIHA7CiAKLQl2Y3B1X2Jvb2szcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MpKTsKKwl2Y3B1X2Jvb2szcyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MpKTsKIAlpZiAoIXZjcHVfYm9vazNzKQogCQlnb3RvIG91dDsKIAotCW1lbXNldCh2Y3B1X2Jvb2szcywgMCwgc2l6ZW9mKHN0cnVjdCBrdm1wcGNfdmNwdV9ib29rM3MpKTsKLQogCXZjcHVfYm9vazNzLT5zaGFkb3dfdmNwdSA9IChzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSAqKQogCQlremFsbG9jKHNpemVvZigqdmNwdV9ib29rM3MtPnNoYWRvd192Y3B1KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2Y3B1X2Jvb2szcy0+c2hhZG93X3ZjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL3Bvd2VycGMuYyBiL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCmluZGV4IDM4Zjc1NmYuLjk5NzU4NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jCkBAIC0xNDUsMTggKzE0NSwxMiBAQAogCSooaW50ICopcnRuID0ga3ZtcHBjX2NvcmVfY2hlY2tfcHJvY2Vzc29yX2NvbXBhdCgpOwogfQogCi1zdHJ1Y3Qga3ZtICprdm1fYXJjaF9jcmVhdGVfdm0odm9pZCkKK2ludCBrdm1fYXJjaF9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlzdHJ1Y3Qga3ZtICprdm07Ci0KLQlrdm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrdm0pCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JcmV0dXJuIGt2bTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQga3ZtcHBjX2ZyZWVfdmNwdXMoc3RydWN0IGt2bSAqa3ZtKQordm9pZCBrdm1fYXJjaF9kZXN0cm95X3ZtKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CkBAIC0xNzYsMTQgKzE3MCw2IEBACiB7CiB9CiAKLXZvaWQga3ZtX2FyY2hfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCi17Ci0Ja3ZtcHBjX2ZyZWVfdmNwdXMoa3ZtKTsKLQlrdm1fZnJlZV9waHlzbWVtKGt2bSk7Ci0JY2xlYW51cF9zcmN1X3N0cnVjdCgma3ZtLT5zcmN1KTsKLQlrZnJlZShrdm0pOwotfQotCiBpbnQga3ZtX2Rldl9pb2N0bF9jaGVja19leHRlbnNpb24obG9uZyBleHQpCiB7CiAJaW50IHI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQppbmRleCA4ODlmMmJjLi4xNjZhNmEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIAogb2JqLSQoQ09ORklHX1BQQzY0KQkrPSBjb3B5cGFnZV82NC5vIGNvcHl1c2VyXzY0Lm8gXAogCQkJICAgbWVtY3B5XzY0Lm8gdXNlcmNvcHlfNjQubyBtZW1fNjQubyBzdHJpbmcubyBcCi0JCQkgICBjaGVja3N1bV93cmFwcGVyc182NC5vCisJCQkgICBjaGVja3N1bV93cmFwcGVyc182NC5vIGh3ZWlnaHRfNjQubwogb2JqLSQoQ09ORklHX1hNT04pCSs9IHNzdGVwLm8gbGRzdGZwLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkrPSBzc3RlcC5vIGxkc3RmcC5vCiBvYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKQkrPSBzc3RlcC5vIGxkc3RmcC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2h3ZWlnaHRfNjQuUyBiL2FyY2gvcG93ZXJwYy9saWIvaHdlaWdodF82NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTI3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbGliL2h3ZWlnaHRfNjQuUwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMTAKKyAqCisgKiBBdXRob3I6IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorCisvKiBOb3RlOiBUaGlzIGNvZGUgcmVsaWVzIG9uIC1tbWluaW1hbC10b2MgKi8KKworX0dMT0JBTChfX2FyY2hfaHdlaWdodDgpCitCRUdJTl9GVFJfU0VDVElPTgorCWIgLl9fc3dfaHdlaWdodDgKKwlub3AKKwlub3AKK0ZUUl9TRUNUSU9OX0VMU0UKKwlQUENfUE9QQ05UQihyMyxyMykKKwljbHJsZGkJcjMscjMsNjQtOAorCWJscgorQUxUX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihDUFVfRlRSX1BPUENOVEIpCisKK19HTE9CQUwoX19hcmNoX2h3ZWlnaHQxNikKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYiAuX19zd19od2VpZ2h0MTYKKwlub3AKKwlub3AKKwlub3AKKwlub3AKK0ZUUl9TRUNUSU9OX0VMU0UKKyAgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDUwKQorCVBQQ19QT1BDTlRCKHIzLHIzKQorCXNyZGkJcjQscjMsOAorCWFkZAlyMyxyNCxyMworCWNscmxkaQlyMyxyMyw2NC04CisJYmxyCisgIEZUUl9TRUNUSU9OX0VMU0VfTkVTVEVEKDUwKQorCWNscmx3aSAgcjMscjMsMTYKKwlQUENfUE9QQ05UVyhyMyxyMykKKwljbHJsZGkJcjMscjMsNjQtOAorCWJscgorICBBTFRfRlRSX1NFQ1RJT05fRU5EX05FU1RFRF9JRkNMUihDUFVfRlRSX1BPUENOVEQsIDUwKQorQUxUX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihDUFVfRlRSX1BPUENOVEIpCisKK19HTE9CQUwoX19hcmNoX2h3ZWlnaHQzMikKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYiAuX19zd19od2VpZ2h0MzIKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKK0ZUUl9TRUNUSU9OX0VMU0UKKyAgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDUxKQorCVBQQ19QT1BDTlRCKHIzLHIzKQorCXNyZGkJcjQscjMsMTYKKwlhZGQJcjMscjQscjMKKwlzcmRpCXI0LHIzLDgKKwlhZGQJcjMscjQscjMKKwljbHJsZGkJcjMscjMsNjQtOAorCWJscgorICBGVFJfU0VDVElPTl9FTFNFX05FU1RFRCg1MSkKKwlQUENfUE9QQ05UVyhyMyxyMykKKwljbHJsZGkJcjMscjMsNjQtOAorCWJscgorICBBTFRfRlRSX1NFQ1RJT05fRU5EX05FU1RFRF9JRkNMUihDUFVfRlRSX1BPUENOVEQsIDUxKQorQUxUX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihDUFVfRlRSX1BPUENOVEIpCisKK19HTE9CQUwoX19hcmNoX2h3ZWlnaHQ2NCkKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYiAuX19zd19od2VpZ2h0NjQKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKK0ZUUl9TRUNUSU9OX0VMU0UKKyAgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDUyKQorCVBQQ19QT1BDTlRCKHIzLHIzKQorCXNyZGkJcjQscjMsMzIKKwlhZGQJcjMscjQscjMKKwlzcmRpCXI0LHIzLDE2CisJYWRkCXIzLHI0LHIzCisJc3JkaQlyNCxyMyw4CisJYWRkCXIzLHI0LHIzCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKKyAgRlRSX1NFQ1RJT05fRUxTRV9ORVNURUQoNTIpCisJUFBDX1BPUENOVEQocjMscjMpCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKKyAgQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRELCA1MikKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRCKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2d1cC5jIGIvYXJjaC9wb3dlcnBjL21tL2d1cC5jCmluZGV4IGQ3ZWZkYmYuLmZlYzEzMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9ndXAuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZ3VwLmMKQEAgLTE2LDYgKzE2LDE2IEBACiAKICNpZmRlZiBfX0hBVkVfQVJDSF9QVEVfU1BFQ0lBTAogCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQoreworCS8qCisJICogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQoKSBjYW5ub3QgcnVuCisJICogZnJvbSB1bmRlciB1cy4KKwkgKi8KKwlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPCAwKTsKKwlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOworfQorCiAvKgogICogVGhlIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGxlYWYgZnVuY3Rpb25zIGFyZSBtYWRlIG5vaW5saW5lIG90aGVyd2lzZSBnY2MKICAqIGlubGluZXMgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHdoaWNoIHJlc3VsdHMgaW4gdG9vIG11Y2gKQEAgLTQ3LDYgKzU3LDggQEAKIAkJCXB1dF9wYWdlKHBhZ2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KKwkJaWYgKFBhZ2VUYWlsKHBhZ2UpKQorCQkJZ2V0X2h1Z2VfcGFnZV90YWlsKHBhZ2UpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKIAkJKCpucikrKzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggNWU5NTg0NC4uYTU5OTFmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC0xMDcwLDcgKzEwNzAsNyBAQAogCQkgIHVuc2lnbmVkIGxvbmcgYWNjZXNzLCB1bnNpZ25lZCBsb25nIHRyYXApCiB7CiAJdW5zaWduZWQgbG9uZyB2c2lkOwotCXZvaWQgKnBnZGlyOworCXBnZF90ICpwZ2RpcjsKIAlwdGVfdCAqcHRlcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYywgc3NpemUsIGxvY2FsID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYwppbmRleCA1Y2U5OTg0Li5jMGFhYjUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCkBAIC0xMTEsOCArMTExLDggQEAKIAkJICogYSBjb3JlIG1hcCBpbnN0ZWFkIGJ1dCB0aGlzIHdpbGwgZG8gZm9yIG5vdy4KIAkJICovCiAJCWZvcl9lYWNoX2NwdShjcHUsIG1tX2NwdW1hc2sobW0pKSB7Ci0JCQlmb3IgKGkgPSBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsKLQkJCSAgICAgaSA8PSBjcHVfbGFzdF90aHJlYWRfaW5fY29yZShjcHUpOyBpKyspCisJCQlmb3IgKGkgPSBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsKKwkJCSAgICAgaSA8PSBjcHVfbGFzdF90aHJlYWRfc2libGluZyhjcHUpOyBpKyspCiAJCQkJX19zZXRfYml0KGlkLCBzdGFsZV9tYXBbaV0pOwogCQkJY3B1ID0gaSAtIDE7CiAJCX0KQEAgLTI2NCwxNCArMjY0LDE0IEBACiAJICovCiAJaWYgKHRlc3RfYml0KGlkLCBzdGFsZV9tYXBbY3B1XSkpIHsKIAkJcHJfaGFyZGNvbnQoIiB8IHN0YWxlIGZsdXNoICVkIFslZC4uJWRdIiwKLQkJCSAgICBpZCwgY3B1X2ZpcnN0X3RocmVhZF9pbl9jb3JlKGNwdSksCi0JCQkgICAgY3B1X2xhc3RfdGhyZWFkX2luX2NvcmUoY3B1KSk7CisJCQkgICAgaWQsIGNwdV9maXJzdF90aHJlYWRfc2libGluZyhjcHUpLAorCQkJICAgIGNwdV9sYXN0X3RocmVhZF9zaWJsaW5nKGNwdSkpOwogCiAJCWxvY2FsX2ZsdXNoX3RsYl9tbShuZXh0KTsKIAogCQkvKiBYWFggVGhpcyBjbGVhciBzaG91bGQgdWx0aW1hdGVseSBiZSBwYXJ0IG9mIGxvY2FsX2ZsdXNoX3RsYl9tbSAqLwotCQlmb3IgKGkgPSBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsKLQkJICAgICBpIDw9IGNwdV9sYXN0X3RocmVhZF9pbl9jb3JlKGNwdSk7IGkrKykgeworCQlmb3IgKGkgPSBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsKKwkJICAgICBpIDw9IGNwdV9sYXN0X3RocmVhZF9zaWJsaW5nKGNwdSk7IGkrKykgewogCQkJX19jbGVhcl9iaXQoaWQsIHN0YWxlX21hcFtpXSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCA3NDUwNWIyLi5iZjVjYjkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKQEAgLTIwLDEwICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlLmg+CiAjaW5jbHVkZSA8YXNtL3NwYXJzZW1lbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcGFjYS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KIAogc3RhdGljIGludCBudW1hX2VuYWJsZWQgPSAxOwogCkBAIC0xNjMsNyArMTY4LDcgQEAKIAl3b3JrX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBnZXRfYWN0aXZlX3JlZ2lvbl93b3JrX2ZuLCBub2RlX2FyKTsKIH0KIAotc3RhdGljIHZvaWQgX19jcHVpbml0IG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKIHsKIAludW1hX2NwdV9sb29rdXBfdGFibGVbY3B1XSA9IG5vZGU7CiAKQEAgLTE3Myw3ICsxNzgsNyBAQAogCQljcHVtYXNrX3NldF9jcHUoY3B1LCBub2RlX3RvX2NwdW1hc2tfbWFwW25vZGVdKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSB8fCBkZWZpbmVkKENPTkZJR19QUENfU1BMUEFSKQogc3RhdGljIHZvaWQgdW5tYXBfY3B1X2Zyb21fbm9kZSh1bnNpZ25lZCBsb25nIGNwdSkKIHsKIAlpbnQgbm9kZSA9IG51bWFfY3B1X2xvb2t1cF90YWJsZVtjcHVdOwpAQCAtMTg3LDcgKzE5Miw3IEBACiAJCSAgICAgICBjcHUsIG5vZGUpOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgfHwgQ09ORklHX1BQQ19TUExQQVIgKi8KIAogLyogbXVzdCBob2xkIHJlZmVyZW5jZSB0byBub2RlIGR1cmluZyBjYWxsICovCiBzdGF0aWMgY29uc3QgaW50ICpvZl9nZXRfYXNzb2NpYXRpdml0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKQEAgLTI0NiwzMiArMjUxLDQxIEBACiAvKiBSZXR1cm5zIG5pZCBpbiB0aGUgcmFuZ2UgWzAuLk1BWF9OVU1OT0RFUy0xXSwgb3IgLTEgaWYgbm8gdXNlZnVsIG51bWEKICAqIGluZm8gaXMgZm91bmQuCiAgKi8KLXN0YXRpYyBpbnQgb2Zfbm9kZV90b19uaWRfc2luZ2xlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKQorc3RhdGljIGludCBhc3NvY2lhdGl2aXR5X3RvX25pZChjb25zdCB1bnNpZ25lZCBpbnQgKmFzc29jaWF0aXZpdHkpCiB7CiAJaW50IG5pZCA9IC0xOwotCWNvbnN0IHVuc2lnbmVkIGludCAqdG1wOwogCiAJaWYgKG1pbl9jb21tb25fZGVwdGggPT0gLTEpCiAJCWdvdG8gb3V0OwogCi0JdG1wID0gb2ZfZ2V0X2Fzc29jaWF0aXZpdHkoZGV2aWNlKTsKLQlpZiAoIXRtcCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodG1wWzBdID49IG1pbl9jb21tb25fZGVwdGgpCi0JCW5pZCA9IHRtcFttaW5fY29tbW9uX2RlcHRoXTsKKwlpZiAoYXNzb2NpYXRpdml0eVswXSA+PSBtaW5fY29tbW9uX2RlcHRoKQorCQluaWQgPSBhc3NvY2lhdGl2aXR5W21pbl9jb21tb25fZGVwdGhdOwogCiAJLyogUE9XRVI0IExQQVIgdXNlcyAweGZmZmYgYXMgaW52YWxpZCBub2RlICovCiAJaWYgKG5pZCA9PSAweGZmZmYgfHwgbmlkID49IE1BWF9OVU1OT0RFUykKIAkJbmlkID0gLTE7CiAKLQlpZiAobmlkID4gMCAmJiB0bXBbMF0gPj0gZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aCkKLQkJaW5pdGlhbGl6ZV9kaXN0YW5jZV9sb29rdXBfdGFibGUobmlkLCB0bXApOworCWlmIChuaWQgPiAwICYmIGFzc29jaWF0aXZpdHlbMF0gPj0gZGlzdGFuY2VfcmVmX3BvaW50c19kZXB0aCkKKwkJaW5pdGlhbGl6ZV9kaXN0YW5jZV9sb29rdXBfdGFibGUobmlkLCBhc3NvY2lhdGl2aXR5KTsKIAogb3V0OgogCXJldHVybiBuaWQ7CiB9CiAKKy8qIFJldHVybnMgdGhlIG5pZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGRldmljZSB0cmVlIG5vZGUsCisgKiBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyBpbnQgb2Zfbm9kZV90b19uaWRfc2luZ2xlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKQoreworCWludCBuaWQgPSAtMTsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnRtcDsKKworCXRtcCA9IG9mX2dldF9hc3NvY2lhdGl2aXR5KGRldmljZSk7CisJaWYgKHRtcCkKKwkJbmlkID0gYXNzb2NpYXRpdml0eV90b19uaWQodG1wKTsKKwlyZXR1cm4gbmlkOworfQorCiAvKiBXYWxrIHRoZSBkZXZpY2UgdHJlZSB1cHdhcmRzLCBsb29raW5nIGZvciBhbiBhc3NvY2lhdGl2aXR5IGlkICovCiBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpCiB7CkBAIC0xMjQ3LDQgKzEyNjEsMjc1IEBACiAJcmV0dXJuIG5pZDsKIH0KIAorc3RhdGljIHU2NCBob3RfYWRkX2RyY29uZl9tZW1vcnlfbWF4KHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbWVtb3J5ID0gTlVMTDsKKyAgICAgICAgdW5zaWduZWQgaW50IGRyY29uZl9jZWxsX2NudCA9IDA7CisgICAgICAgIHU2NCBsbWJfc2l6ZSA9IDA7CisgICAgICAgIGNvbnN0IHUzMiAqZG0gPSAwOworCisgICAgICAgIG1lbW9yeSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLGR5bmFtaWMtcmVjb25maWd1cmF0aW9uLW1lbW9yeSIpOworICAgICAgICBpZiAobWVtb3J5KSB7CisgICAgICAgICAgICAgICAgZHJjb25mX2NlbGxfY250ID0gb2ZfZ2V0X2RyY29uZl9tZW1vcnkobWVtb3J5LCAmZG0pOworICAgICAgICAgICAgICAgIGxtYl9zaXplID0gb2ZfZ2V0X2xtYl9zaXplKG1lbW9yeSk7CisgICAgICAgICAgICAgICAgb2Zfbm9kZV9wdXQobWVtb3J5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG1iX3NpemUgKiBkcmNvbmZfY2VsbF9jbnQ7Cit9CisKKy8qCisgKiBtZW1vcnlfaG90cGx1Z19tYXggLSByZXR1cm4gbWF4IGFkZHJlc3Mgb2YgbWVtb3J5IHRoYXQgbWF5IGJlIGFkZGVkCisgKgorICogVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGRyY29uZmlnIG1lbW9yeQorICogaG90cGx1Zy4KKyAqLwordTY0IG1lbW9yeV9ob3RwbHVnX21heCh2b2lkKQoreworICAgICAgICByZXR1cm4gbWF4KGhvdF9hZGRfZHJjb25mX21lbW9yeV9tYXgoKSwgbWVtYmxvY2tfZW5kX29mX0RSQU0oKSk7Cit9CiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHICovCisKKy8qIFZydHVhbCBQcm9jZXNzb3IgSG9tZSBOb2RlIChWUEhOKSBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX1BQQ19TUExQQVIKKyNkZWZpbmUgVlBITl9OUl9DSEFOR0VfQ1RSUyAoOCkKK3N0YXRpYyB1OCB2cGhuX2NwdV9jaGFuZ2VfY291bnRzW05SX0NQVVNdW1ZQSE5fTlJfQ0hBTkdFX0NUUlNdOworc3RhdGljIGNwdW1hc2tfdCBjcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VzX21hc2s7CitzdGF0aWMgaW50IHZwaG5fZW5hYmxlZDsKK3N0YXRpYyB2b2lkIHNldF90b3BvbG9neV90aW1lcih2b2lkKTsKKworLyoKKyAqIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgYXNzb2NpYXRpdml0eSBjaGFuZ2UgY291bnRlcnMgaW4gdGhlCisgKiBoeXBlcnZpc29yLgorICovCitzdGF0aWMgdm9pZCBzZXR1cF9jcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VfY291bnRlcnModm9pZCkKK3sKKwlpbnQgY3B1ID0gMDsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJaW50IGkgPSAwOworCQl1OCAqY291bnRzID0gdnBobl9jcHVfY2hhbmdlX2NvdW50c1tjcHVdOworCQl2b2xhdGlsZSB1OCAqaHlwZXJ2aXNvcl9jb3VudHMgPSBscHBhY2FbY3B1XS52cGhuX2Fzc29jX2NvdW50czsKKworCQlmb3IgKGkgPSAwOyBpIDwgVlBITl9OUl9DSEFOR0VfQ1RSUzsgaSsrKSB7CisJCQljb3VudHNbaV0gPSBoeXBlcnZpc29yX2NvdW50c1tpXTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRoZSBoeXBlcnZpc29yIG1haW50YWlucyBhIHNldCBvZiA4IGFzc29jaWF0aXZpdHkgY2hhbmdlIGNvdW50ZXJzIGluCisgKiB0aGUgVlBBIG9mIGVhY2ggY3B1IHRoYXQgY29ycmVzcG9uZCB0byB0aGUgYXNzb2NpYXRpdml0eSBsZXZlbHMgaW4gdGhlCisgKiBpYm0sYXNzb2NpYXRpdml0eS1yZWZlcmVuY2UtcG9pbnRzIHByb3BlcnR5LiBXaGVuIGFuIGFzc29jaWF0aXZpdHkKKyAqIGxldmVsIGNoYW5nZXMsIHRoZSBjb3JyZXNwb25kaW5nIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQuCisgKgorICogU2V0IGEgYml0IGluIGNwdV9hc3NvY2lhdGl2aXR5X2NoYW5nZXNfbWFzayBmb3IgZWFjaCBjcHUgd2hvc2UgaG9tZQorICogbm9kZSBhc3NvY2lhdGl2aXR5IGxldmVscyBoYXZlIGNoYW5nZWQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNwdXMgd2l0aCB1bmhhbmRsZWQgYXNzb2NpYXRpdml0eSBjaGFuZ2VzLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VzX21hc2sodm9pZCkKK3sKKwlpbnQgY3B1ID0gMCwgbnJfY3B1cyA9IDA7CisJY3B1bWFza190ICpjaGFuZ2VzID0gJmNwdV9hc3NvY2lhdGl2aXR5X2NoYW5nZXNfbWFzazsKKworCWNwdW1hc2tfY2xlYXIoY2hhbmdlcyk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWludCBpLCBjaGFuZ2VkID0gMDsKKwkJdTggKmNvdW50cyA9IHZwaG5fY3B1X2NoYW5nZV9jb3VudHNbY3B1XTsKKwkJdm9sYXRpbGUgdTggKmh5cGVydmlzb3JfY291bnRzID0gbHBwYWNhW2NwdV0udnBobl9hc3NvY19jb3VudHM7CisKKwkJZm9yIChpID0gMDsgaSA8IFZQSE5fTlJfQ0hBTkdFX0NUUlM7IGkrKykgeworCQkJaWYgKGh5cGVydmlzb3JfY291bnRzW2ldID4gY291bnRzW2ldKSB7CisJCQkJY291bnRzW2ldID0gaHlwZXJ2aXNvcl9jb3VudHNbaV07CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGNoYW5nZWQpIHsKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNoYW5nZXMpOworCQkJbnJfY3B1cysrOworCQl9CisJfQorCisJcmV0dXJuIG5yX2NwdXM7Cit9CisKKy8qIDYgNjQtYml0IHJlZ2lzdGVycyB1bnBhY2tlZCBpbnRvIDEyIDMyLWJpdCBhc3NvY2lhdGl2aXR5IHZhbHVlcyAqLworI2RlZmluZSBWUEhOX0FTU09DX0JVRlNJWkUgKDYqc2l6ZW9mKHU2NCkvc2l6ZW9mKHUzMikpCisKKy8qCisgKiBDb252ZXJ0IHRoZSBhc3NvY2lhdGl2aXR5IGRvbWFpbiBudW1iZXJzIHJldHVybmVkIGZyb20gdGhlIGh5cGVydmlzb3IKKyAqIHRvIHRoZSBzZXF1ZW5jZSB0aGV5IHdvdWxkIGFwcGVhciBpbiB0aGUgaWJtLGFzc29jaWF0aXZpdHkgcHJvcGVydHkuCisgKi8KK3N0YXRpYyBpbnQgdnBobl91bnBhY2tfYXNzb2NpYXRpdml0eShjb25zdCBsb25nICpwYWNrZWQsIHVuc2lnbmVkIGludCAqdW5wYWNrZWQpCit7CisJaW50IGkgPSAwOworCWludCBucl9hc3NvY19kb21zID0gMDsKKwljb25zdCB1MTYgKmZpZWxkID0gKGNvbnN0IHUxNiopIHBhY2tlZDsKKworI2RlZmluZSBWUEhOX0ZJRUxEX1VOVVNFRAkoMHhmZmZmKQorI2RlZmluZSBWUEhOX0ZJRUxEX01TQgkJKDB4ODAwMCkKKyNkZWZpbmUgVlBITl9GSUVMRF9NQVNLCQkoflZQSE5fRklFTERfTVNCKQorCisJZm9yIChpID0gMDsgaSA8IFZQSE5fQVNTT0NfQlVGU0laRTsgaSsrKSB7CisJCWlmICgqZmllbGQgPT0gVlBITl9GSUVMRF9VTlVTRUQpIHsKKwkJCS8qIEFsbCBzaWduaWZpY2FudCBmaWVsZHMgcHJvY2Vzc2VkLCBhbmQgcmVtYWluaW5nCisJCQkgKiBmaWVsZHMgY29udGFpbiB0aGUgcmVzZXJ2ZWQgdmFsdWUgb2YgYWxsIDEncy4KKwkJCSAqIEp1c3Qgc3RvcmUgdGhlbS4KKwkJCSAqLworCQkJdW5wYWNrZWRbaV0gPSAqKCh1MzIqKWZpZWxkKTsKKwkJCWZpZWxkICs9IDI7CisJCX0KKwkJZWxzZSBpZiAoKmZpZWxkICYgVlBITl9GSUVMRF9NU0IpIHsKKwkJCS8qIERhdGEgaXMgaW4gdGhlIGxvd2VyIDE1IGJpdHMgb2YgdGhpcyBmaWVsZCAqLworCQkJdW5wYWNrZWRbaV0gPSAqZmllbGQgJiBWUEhOX0ZJRUxEX01BU0s7CisJCQlmaWVsZCsrOworCQkJbnJfYXNzb2NfZG9tcysrOworCQl9CisJCWVsc2UgeworCQkJLyogRGF0YSBpcyBpbiB0aGUgbG93ZXIgMTUgYml0cyBvZiB0aGlzIGZpZWxkCisJCQkgKiBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgbmV4dCAxNiBiaXQgZmllbGQKKwkJCSAqLworCQkJdW5wYWNrZWRbaV0gPSAqKCh1MzIqKWZpZWxkKTsKKwkJCWZpZWxkICs9IDI7CisJCQlucl9hc3NvY19kb21zKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbnJfYXNzb2NfZG9tczsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBuZXcgYXNzb2NpYXRpdml0eSBpbmZvcm1hdGlvbiBmb3IgYSB2aXJ0dWFsIHByb2Nlc3NvcidzCisgKiBob21lIG5vZGUuCisgKi8KK3N0YXRpYyBsb25nIGhjYWxsX3ZwaG4odW5zaWduZWQgbG9uZyBjcHUsIHVuc2lnbmVkIGludCAqYXNzb2NpYXRpdml0eSkKK3sKKwlsb25nIHJjID0gMDsKKwlsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTDlfQlVGU0laRV0gPSB7MH07CisJdTY0IGZsYWdzID0gMTsKKwlpbnQgaHdjcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CisKKwlyYyA9IHBscGFyX2hjYWxsOShIX0hPTUVfTk9ERV9BU1NPQ0lBVElWSVRZLCByZXRidWYsIGZsYWdzLCBod2NwdSk7CisJdnBobl91bnBhY2tfYXNzb2NpYXRpdml0eShyZXRidWYsIGFzc29jaWF0aXZpdHkpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9uZyB2cGhuX2dldF9hc3NvY2lhdGl2aXR5KHVuc2lnbmVkIGxvbmcgY3B1LAorCQkJCQl1bnNpZ25lZCBpbnQgKmFzc29jaWF0aXZpdHkpCit7CisJbG9uZyByYyA9IDA7CisKKwlyYyA9IGhjYWxsX3ZwaG4oY3B1LCBhc3NvY2lhdGl2aXR5KTsKKworCXN3aXRjaCAocmMpIHsKKwljYXNlIEhfRlVOQ1RJT046CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJWUEhOIGlzIG5vdCBzdXBwb3J0ZWQuIERpc2FibGluZyBwb2xsaW5nLi4uXG4iKTsKKwkJc3RvcF90b3BvbG9neV91cGRhdGUoKTsKKwkJYnJlYWs7CisJY2FzZSBIX0hBUkRXQVJFOgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJoY2FsbF92cGhuKCkgZXhwZXJpZW5jZWQgYSBoYXJkd2FyZSBmYXVsdCAiCisJCQkicHJldmVudGluZyBWUEhOLiBEaXNhYmxpbmcgcG9sbGluZy4uLlxuIik7CisJCXN0b3BfdG9wb2xvZ3lfdXBkYXRlKCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKgorICogVXBkYXRlIHRoZSBub2RlIG1hcHMgYW5kIHN5c2ZzIGVudHJpZXMgZm9yIGVhY2ggY3B1IHdob3NlIGhvbWUgbm9kZQorICogaGFzIGNoYW5nZWQuCisgKi8KK2ludCBhcmNoX3VwZGF0ZV9jcHVfdG9wb2xvZ3kodm9pZCkKK3sKKwlpbnQgY3B1ID0gMCwgbmlkID0gMCwgb2xkX25pZCA9IDA7CisJdW5zaWduZWQgaW50IGFzc29jaWF0aXZpdHlbVlBITl9BU1NPQ19CVUZTSVpFXSA9IHswfTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2ID0gTlVMTDsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlc19tYXNrKSB7CisJCXZwaG5fZ2V0X2Fzc29jaWF0aXZpdHkoY3B1LCBhc3NvY2lhdGl2aXR5KTsKKwkJbmlkID0gYXNzb2NpYXRpdml0eV90b19uaWQoYXNzb2NpYXRpdml0eSk7CisKKwkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCisJCQluaWQgPSBmaXJzdF9vbmxpbmVfbm9kZTsKKworCQlvbGRfbmlkID0gbnVtYV9jcHVfbG9va3VwX3RhYmxlW2NwdV07CisKKwkJLyogRGlzYWJsZSBob3RwbHVnIHdoaWxlIHdlIHVwZGF0ZSB0aGUgY3B1CisJCSAqIG1hc2tzIGFuZCBzeXNmcy4KKwkJICovCisJCWdldF9vbmxpbmVfY3B1cygpOworCQl1bnJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKGNwdSwgb2xkX25pZCk7CisJCXVubWFwX2NwdV9mcm9tX25vZGUoY3B1KTsKKwkJbWFwX2NwdV90b19ub2RlKGNwdSwgbmlkKTsKKwkJcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUoY3B1LCBuaWQpOworCQlwdXRfb25saW5lX2NwdXMoKTsKKworCQlzeXNkZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCQlpZiAoc3lzZGV2KQorCQkJa29iamVjdF91ZXZlbnQoJnN5c2Rldi0+a29iaiwgS09CSl9DSEFOR0UpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB0b3BvbG9neV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlyZWJ1aWxkX3NjaGVkX2RvbWFpbnMoKTsKK30KK3N0YXRpYyBERUNMQVJFX1dPUksodG9wb2xvZ3lfd29yaywgdG9wb2xvZ3lfd29ya19mbik7CisKK3ZvaWQgdG9wb2xvZ3lfc2NoZWR1bGVfdXBkYXRlKHZvaWQpCit7CisJc2NoZWR1bGVfd29yaygmdG9wb2xvZ3lfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHRvcG9sb2d5X3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sKKwlpZiAoIXZwaG5fZW5hYmxlZCkKKwkJcmV0dXJuOworCWlmICh1cGRhdGVfY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlc19tYXNrKCkgPiAwKQorCQl0b3BvbG9neV9zY2hlZHVsZV91cGRhdGUoKTsKKwlzZXRfdG9wb2xvZ3lfdGltZXIoKTsKK30KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0b3BvbG9neV90aW1lciA9CisJVElNRVJfSU5JVElBTElaRVIodG9wb2xvZ3lfdGltZXJfZm4sIDAsIDApOworCitzdGF0aWMgdm9pZCBzZXRfdG9wb2xvZ3lfdGltZXIodm9pZCkKK3sKKwl0b3BvbG9neV90aW1lci5kYXRhID0gMDsKKwl0b3BvbG9neV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDYwICogSFo7CisJYWRkX3RpbWVyKCZ0b3BvbG9neV90aW1lcik7Cit9CisKKy8qCisgKiBTdGFydCBwb2xsaW5nIGZvciBWUEhOIGFzc29jaWF0aXZpdHkgY2hhbmdlcy4KKyAqLworaW50IHN0YXJ0X3RvcG9sb2d5X3VwZGF0ZSh2b2lkKQoreworCWludCByYyA9IDA7CisKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9WUEhOKSkgeworCQl2cGhuX2VuYWJsZWQgPSAxOworCQlzZXR1cF9jcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VfY291bnRlcnMoKTsKKwkJaW5pdF90aW1lcl9kZWZlcnJhYmxlKCZ0b3BvbG9neV90aW1lcik7CisJCXNldF90b3BvbG9neV90aW1lcigpOworCQlyYyA9IDE7CisJfQorCisJcmV0dXJuIHJjOworfQorX19pbml0Y2FsbChzdGFydF90b3BvbG9neV91cGRhdGUpOworCisvKgorICogRGlzYWJsZSBwb2xsaW5nIGZvciBWUEhOIGFzc29jaWF0aXZpdHkgY2hhbmdlcy4KKyAqLworaW50IHN0b3BfdG9wb2xvZ3lfdXBkYXRlKHZvaWQpCit7CisJdnBobl9lbmFibGVkID0gMDsKKwlyZXR1cm4gZGVsX3RpbWVyX3N5bmMoJnRvcG9sb2d5X3RpbWVyKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1NQTFBBUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKaW5kZXggYTg3ZWFkMC4uOGRjNDFjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCkBAIC03OCw3ICs3OCw3IEBACiAKIAkvKiBwZ2RpciB0YWtlIHBhZ2Ugb3IgdHdvIHdpdGggNEsgcGFnZXMgYW5kIGEgcGFnZSBmcmFjdGlvbiBvdGhlcndpc2UgKi8KICNpZm5kZWYgQ09ORklHX1BQQ180S19QQUdFUwotCXJldCA9IChwZ2RfdCAqKWt6YWxsb2MoMSA8PCBQR0RJUl9PUkRFUiwgR0ZQX0tFUk5FTCk7CisJcmV0ID0ga3phbGxvYygxIDw8IFBHRElSX09SREVSLCBHRlBfS0VSTkVMKTsKICNlbHNlCiAJcmV0ID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCiAJCQlQR0RJUl9PUkRFUiAtIFBBR0VfU0hJRlQpOwpAQCAtMjMwLDYgKzIzMCw3IEBACiAJCWFyZWEgPSBnZXRfdm1fYXJlYV9jYWxsZXIoc2l6ZSwgVk1fSU9SRU1BUCwgY2FsbGVyKTsKIAkJaWYgKGFyZWEgPT0gMCkKIAkJCXJldHVybiBOVUxMOworCQlhcmVhLT5waHlzX2FkZHIgPSBwOwogCQl2ID0gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHI7CiAJfSBlbHNlIHsKIAkJdiA9IChpb3JlbWFwX2JvdCAtPSBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCmluZGV4IDIxZDZkZmEuLjg4OTI3YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwpAQCAtMjIzLDYgKzIyMyw4IEBACiAJCQkJCSAgICBjYWxsZXIpOwogCQlpZiAoYXJlYSA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7CisKKwkJYXJlYS0+cGh5c19hZGRyID0gcGFsaWduZWQ7CiAJCXJldCA9IF9faW9yZW1hcF9hdChwYWxpZ25lZCwgYXJlYS0+YWRkciwgc2l6ZSwgZmxhZ3MpOwogCQlpZiAoIXJldCkKIAkJCXZ1bm1hcChhcmVhLT5hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCmluZGV4IDdmZDkwZDAuLmM0ZDJiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYwpAQCAtMTQ2OSw3ICsxNDY5LDcgQEAKICAqIFRoZSBwbV9pbnRlcnZhbCByZWdpc3RlciBpcyBzZXR1cCB0byB3cml0ZSB0aGUgU1BVIFBDIHZhbHVlIGludG8gdGhlCiAgKiB0cmFjZSBidWZmZXIgYXQgdGhlIG1heGltdW0gcmF0ZSBwb3NzaWJsZS4gIFRoZSB0cmFjZSBidWZmZXIgaXMgY29uZmlndXJlZAogICogdG8gc3RvcmUgdGhlIFBDcywgd3JhcHBpbmcgd2hlbiBpdCBpcyBmdWxsLiAgVGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgaXMKLSAqIGludGlhbGl6ZWQgdG8gdGhlIG1heCBoYXJkd2FyZSBjb3VudCBtaW51cyB0aGUgbnVtYmVyIG9mIGV2ZW50cywgTiwgYmV0d2VlbgorICogaW5pdGlhbGl6ZWQgdG8gdGhlIG1heCBoYXJkd2FyZSBjb3VudCBtaW51cyB0aGUgbnVtYmVyIG9mIGV2ZW50cywgTiwgYmV0d2VlbgogICogc2FtcGxlcy4gIE9uY2UgdGhlIE4gZXZlbnRzIGhhdmUgb2NjdXJlZCwgYSBIVyBjb3VudGVyIG92ZXJmbG93IG9jY3VycwogICogY2F1c2luZyB0aGUgZ2VuZXJhdGlvbiBvZiBhIEhXIGNvdW50ZXIgaW50ZXJydXB0IHdoaWNoIGFsc28gc3RvcHMgdGhlCiAgKiB3cml0aW5nIG9mIHRoZSBTUFUgUEMgdmFsdWVzIHRvIHRoZSB0cmFjZSBidWZmZXIuICBIZW5jZSB0aGUgbGFzdCBQQwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jCmluZGV4IDU0NmJiYzIuLjI1MjFkOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L3BwYzQweF9zaW1wbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMKQEAgLTUwLDcgKzUwLDcgQEAKICAqIEFnYWluLCBpZiB5b3VyIGJvYXJkIG5lZWRzIHRvIGRvIHRoaW5ncyBkaWZmZXJlbnRseSB0aGVuIGNyZWF0ZSBhCiAgKiBib2FyZC5jIGZpbGUgZm9yIGl0IHJhdGhlciB0aGFuIGFkZGluZyBpdCB0byB0aGlzIGxpc3QuCiAgKi8KLXN0YXRpYyBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJhbWNjLGFjYWRpYSIsCiAJImFtY2MsaGFsZWFrYWxhIiwKIAkiYW1jYyxraWxhdWVhIiwKQEAgLTYwLDE0ICs2MCw5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHBwYzQweF9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZCk7IGkrKykgewotCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsIGJvYXJkW2ldKSkgewotCQkJcHBjX3BjaV9zZXRfZmxhZ3MoUFBDX1BDSV9SRUFTU0lHTl9BTExfUlNSQyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQorCWlmIChvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpKSB7CisJCXBwY19wY2lfc2V0X2ZsYWdzKFBQQ19QQ0lfUkVBU1NJR05fQUxMX1JTUkMpOworCQlyZXR1cm4gMTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUKaW5kZXggODJmZjMyNi4uYzA0ZDE2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUKQEAgLTEsNCArMSw3IEBACi1vYmotJChDT05GSUdfNDR4KQk6PSBtaXNjXzQ0eC5vIGlkbGUubworb2JqLSQoQ09ORklHXzQ0eCkJKz0gbWlzY180NHgubworaWZuZXEgKCQoQ09ORklHX1BQQzR4eF9DUE0pLHkpCitvYmotJChDT05GSUdfNDR4KQkrPSBpZGxlLm8KK2VuZGlmCiBvYmotJChDT05GSUdfUFBDNDR4X1NJTVBMRSkgKz0gcHBjNDR4X3NpbXBsZS5vCiBvYmotJChDT05GSUdfRUJPTlkpCSs9IGVib255Lm8KIG9iai0kKENPTkZJR19TQU00NDBFUCkgCSs9IHNhbTQ0MGVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2dlbmVyaWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2dlbmVyaWMuYwppbmRleCBlNDg3ZWIwLi45MjY3MzFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9nZW5lcmljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jCkBAIC0yNiw3ICsyNiw3IEBACiAvKgogICogbGlzdCBvZiBzdXBwb3J0ZWQgYm9hcmRzCiAgKi8KLXN0YXRpYyBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJwcnQscHJ0bHZ0IiwKIAlOVUxMCiB9OwpAQCAtMzYsMTYgKzM2LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjNTEyMV9nZW5lcmljX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWludCBpID0gMDsKLQotCXdoaWxlIChib2FyZFtpXSkgewotCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsIGJvYXJkW2ldKSkKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIGJvYXJkW2ldICE9IE5VTEw7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIGRlZmluZV9tYWNoaW5lKG1wYzUxMjFfZ2VuZXJpYykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYwppbmRleCBkZTU1YmMwLi4wMWZmYTY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYwpAQCAtMTcyLDIwICsxNzIsMTggQEAKIAltcGM1Mnh4X3NldHVwX3BjaSgpOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJmc2wsbGl0ZTUyMDAiLAorCSJmc2wsbGl0ZTUyMDBiIiwKKwlOVUxMLAorfTsKKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCBsaXRlNTIwMF9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbm9kZSA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgIm1vZGVsIiwgTlVMTCk7Ci0KLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCAiZnNsLGxpdGU1MjAwIikgJiYKLQkgICAgIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCAiZnNsLGxpdGU1MjAwYiIpKQotCQlyZXR1cm4gMDsKLQlwcl9kZWJ1ZygiJXMgYm9hcmQgZm91bmRcbiIsIG1vZGVsID8gbW9kZWwgOiAidW5rbm93biIpOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIGRlZmluZV9tYWNoaW5lKGxpdGU1MjAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDBfcG0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMF9wbS5jCmluZGV4IDgwMjM0ZTUuLmVkYTBmYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMF9wbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMF9wbS5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAlsaXRlNTIwMF9wbV90YXJnZXRfc3RhdGUgPSBQTV9TVVNQRU5EX09OOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGxpdGU1MjAwX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbGl0ZTUyMDBfcG1fb3BzID0gewogCS52YWxpZAkJPSBsaXRlNTIwMF9wbV92YWxpZCwKIAkuYmVnaW4JCT0gbGl0ZTUyMDBfcG1fYmVnaW4sCiAJLnByZXBhcmUJPSBsaXRlNTIwMF9wbV9wcmVwYXJlLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jCmluZGV4IDBiYWMzYTMuLjJjNzc4MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tZWRpYTUyMDAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbWVkaWE1MjAwLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogfQogCiAvKiBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgYm9hcmRzICovCi1zdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKIAkiZnNsLG1lZGlhNTIwMCIsCiAJTlVMTAogfTsKQEAgLTI0OSwxNiArMjQ5LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgbWVkaWE1MjAwX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWludCBpID0gMDsKLQotCXdoaWxlIChib2FyZFtpXSkgewotCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsIGJvYXJkW2ldKSkKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIChib2FyZFtpXSAhPSBOVUxMKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobWVkaWE1MjAwX3BsYXRmb3JtKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCmluZGV4IGQ0NWJlNWIuLmUzNmQ2ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1MjAwX3NpbXBsZS5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiAKIC8qIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBib2FyZHMgKi8KLXN0YXRpYyBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJpbnRlcmNvbnRyb2wsZGlnc3ktbXRjIiwKIAkibWFucm9sYW5kLG11Y21jNTIiLAogCSJtYW5yb2xhbmQsdWMxMDEiLApAQCAtNjYsMTYgKzY2LDcgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjNTIwMF9zaW1wbGVfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG5vZGUgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGJvYXJkW2ldKSB7Ci0JCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgYm9hcmRbaV0pKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0JCi0JcmV0dXJuIChib2FyZFtpXSAhPSBOVUxMKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobXBjNTIwMF9zaW1wbGVfcGxhdGZvcm0pIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wbS5jCmluZGV4IDU2OGNlZjYuLjgzMTBlOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJaW91bm1hcChtYmFyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBtcGM1Mnh4X3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbXBjNTJ4eF9wbV9vcHMgPSB7CiAJLnZhbGlkCQk9IG1wYzUyeHhfcG1fdmFsaWQsCiAJLnByZXBhcmUJPSBtcGM1Mnh4X3BtX3ByZXBhcmUsCiAJLmVudGVyCQk9IG1wYzUyeHhfcG1fZW50ZXIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMweF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCmluZGV4IDg0NjgzMWQuLjY2MWQzNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCkBAIC01NywxNiArNTcsMTkgQEAKIAlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7CiB9CiAKK3N0cnVjdCBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJIk1QQzgzMDhSREIiLAorCSJmc2wsbXBjODMwOHJkYiIsCisJImRlbngsbXBjODMwOF9wMW0iLAorCU5VTEwKK30KKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCBtcGM4MzB4X3JkYl9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIk1QQzgzMDhSREIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4MzA4cmRiIikgfHwKLQkgICAgICAgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJkZW54LG1wYzgzMDhfcDFtIik7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYwppbmRleCBhZTUyNWU0Li5iNTRjZDczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYwpAQCAtNjAsMTUgKzYwLDE4IEBACiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogfQogCitzdHJ1Y3QgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJNUEM4MzEzRVJEQiIsCisJImZzbCxtcGM4MzE1ZXJkYiIsCisJTlVMTAorfQorCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzgzMXhfcmRiX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiTVBDODMxM0VSREIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4MzE1ZXJkYiIpOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2J1c19pZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKaW5kZXggOTEwY2FhNi4uN2JhZmJmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKQEAgLTEwMSwxNyArMTAxLDIwIEBACiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJmc2wsbXBjODM3N3JkYiIsCisJImZzbCxtcGM4Mzc4cmRiIiwKKwkiZnNsLG1wYzgzNzlyZGIiLAorCSJmc2wsbXBjODM3N3dsYW4iLAorCU5VTEwKK307CisKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjODM3eF9yZGJfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsbXBjODM3N3JkYiIpIHx8Ci0JICAgICAgIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzgzNzhyZGIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4Mzc5cmRiIikgfHwKLQkgICAgICAgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsbXBjODM3N3dsYW4iKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobXBjODM3eF9yZGIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLWFzbS5TIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQtYXNtLlMKaW5kZXggMTkzMDU0My4uM2QxZWNkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQtYXNtLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQtYXNtLlMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCW9yaQlyNCwgcjQsIDB4MDAyYQogCW10c3ByCVNQUk5fREJBVDBMLCByNAogCWxpcwlyOCwgVE1QX1ZJUlRfSU1NUkBoCi0Jb3JpCXI0LCByOCwgMHgwMDFlCS8qIDEgTUJ5dGUgYWNjZXNzYWJsZSBmcm9tIEtlcm5lbCBTcGFjZSBvbmx5ICovCisJb3JpCXI0LCByOCwgMHgwMDFlCS8qIDEgTUJ5dGUgYWNjZXNzaWJsZSBmcm9tIEtlcm5lbCBTcGFjZSBvbmx5ICovCiAJbXRzcHIJU1BSTl9EQkFUMFUsIHI0CiAJaXN5bmMKIApAQCAtMjQxLDcgKzI0MSw3IEBACiAJb3JpCXI0LCByNCwgMHgwMDJhCiAJbXRzcHIJU1BSTl9EQkFUMUwsIHI0CiAJbGlzCXI5LCAoVE1QX1ZJUlRfSU1NUiArIDB4MDEwMDAwMDApQGgKLQlvcmkJcjQsIHI5LCAweDAwMWUJLyogMSBNQnl0ZSBhY2Nlc3NhYmxlIGZyb20gS2VybmVsIFNwYWNlIG9ubHkgKi8KKwlvcmkJcjQsIHI5LCAweDAwMWUJLyogMSBNQnl0ZSBhY2Nlc3NpYmxlIGZyb20gS2VybmVsIFNwYWNlIG9ubHkgKi8KIAltdHNwcglTUFJOX0RCQVQxVSwgcjQKIAlpc3luYwogCkBAIC0yNTMsNyArMjUzLDcgQEAKIAlsaQlyNCwgMHgwMDAyCiAJbXRzcHIJU1BSTl9EQkFUMkwsIHI0CiAJbGlzCXI0LCBLRVJORUxCQVNFQGgKLQlvcmkJcjQsIHI0LCAweDAwMWUJLyogMSBNQnl0ZSBhY2Nlc3NhYmxlIGZyb20gS2VybmVsIFNwYWNlIG9ubHkgKi8KKwlvcmkJcjQsIHI0LCAweDAwMWUJLyogMSBNQnl0ZSBhY2Nlc3NpYmxlIGZyb20gS2VybmVsIFNwYWNlIG9ubHkgKi8KIAltdHNwcglTUFJOX0RCQVQyVSwgcjQKIAlpc3luYwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYwppbmRleCA3NWFlNzdmLi5mZDRmMmYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbXBjODN4eF9zdXNwZW5kX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgbXBjODN4eF9zdXNwZW5kX29wcyA9IHsKIAkudmFsaWQgPSBtcGM4M3h4X3N1c3BlbmRfdmFsaWQsCiAJLmJlZ2luID0gbXBjODN4eF9zdXNwZW5kX2JlZ2luLAogCS5lbnRlciA9IG1wYzgzeHhfc3VzcGVuZF9lbnRlciwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggYWEzNGNhYy4uNzQ3ZDFlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTMwOSw3ICszMDksNyBAQAogCQkJLyogUDEwMjEgaGFzIHBpbnMgbXV4ZWQgZm9yIFFFIGFuZCBvdGhlciBmdW5jdGlvbnMuIFRvCiAJCQkgKiBlbmFibGUgUUUgVUVDIG1vZGUsIHdlIG5lZWQgdG8gc2V0IGJpdCBRRTAgZm9yIFVDQzEKIAkJCSAqIGluIEV0aCBtb2RlLCBRRTAgYW5kIFFFMyBmb3IgVUNDNSBpbiBFdGggbW9kZSwgUUU5Ci0JCQkgKiBhbmQgUUUxMiBmb3IgUUUgTUlJIG1hbmFnZW1lbnQgc2luZ2FscyBpbiBQTVVYQ1IKKwkJCSAqIGFuZCBRRTEyIGZvciBRRSBNSUkgbWFuYWdlbWVudCBzaWduYWxzIGluIFBNVVhDUgogCQkJICogcmVnaXN0ZXIuCiAJCQkgKi8KIAkJCQlzZXRiaXRzMzIocG11eGNyLCBNUEM4NXh4X1BNVVhDUl9RRTAgfApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKaW5kZXggOGYyOWJiYy4uNWU4NDdkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCkBAIC0xODYsMjEgKzE4NiwyMSBAQAogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwodHFtODV4eCwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKKwkidHFjLHRxbTg1NDAiLAorCSJ0cWMsdHFtODU0MSIsCisJInRxYyx0cW04NTQ4IiwKKwkidHFjLHRxbTg1NTUiLAorCSJ0cWMsdHFtODU2MCIsCisJTlVMTAorfTsKKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCB0cW04NXh4X3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JaWYgKChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQwIikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQxIikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTQ4IikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTU1IikpIHx8Ci0JICAgIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInRxYyx0cW04NTYwIikpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBkZWZpbmVfbWFjaGluZSh0cW04NXh4KSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKaW5kZXggOTU2MTU0Zi4uMjA1NzY4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtMzEzLDEzICszMTMsMTQgQEAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9LY29uZmlnIgogCiBjb25maWcgTVBDOHh4eF9HUElPCi0JYm9vbCAiTVBDOHh4eCBHUElPIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUENfTVBDODMxeCB8fCBQUENfTVBDODM0eCB8fCBQUENfTVBDODM3eCB8fCBGU0xfU09DX0JPT0tFIHx8IFBQQ184Nnh4CisJYm9vbCAiTVBDNTEyeC9NUEM4eHh4IEdQSU8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ19NUEM1MTJ4IHx8IFBQQ19NUEM4MzF4IHx8IFBQQ19NUEM4MzR4IHx8IFBQQ19NUEM4Mzd4IHx8IFwKKwkJICAgRlNMX1NPQ19CT09LRSB8fCBQUENfODZ4eAogCXNlbGVjdCBHRU5FUklDX0dQSU8KIAlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSdyZSBnb2luZyB0byB1c2UgaGFyZHdhcmUgdGhhdCBjb25uZWN0cyB0byB0aGUKLQkgIE1QQzgzMXgvODM0eC84Mzd4Lzg1NzIvODYxMCBHUElPcy4KKwkgIE1QQzUxMngvODMxeC84MzR4LzgzN3gvODU3Mi84NjEwIEdQSU9zLgogCiBjb25maWcgU0lNUExFX0dQSU8KIAlib29sICJTdXBwb3J0IGZvciBzaW1wbGUsIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pb21tdS5jCmluZGV4IGJlZWM0MDUuLjNjZTY4NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW9tbXUuYwpAQCAtNzYsNyArNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBjZWxsZWJfZG1hX2Rldl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5hcmNoZGF0YS5kbWFfb3BzID0gZ2V0X3BjaV9kbWFfb3BzKCk7CisJc2V0X2RtYV9vcHMoZGV2LCAmZG1hX2RpcmVjdF9vcHMpOwogCXNldF9kbWFfb2Zmc2V0KGRldiwgY2VsbGViX2RtYV9kaXJlY3Rfb2Zmc2V0KTsKIH0KIApAQCAtMTA2LDcgKzEwNiw2IEBACiBzdGF0aWMgaW50IF9faW5pdCBjZWxsZWJfaW5pdF9pb21tdSh2b2lkKQogewogCWNlbGxlYl9pbml0X2RpcmVjdF9tYXBwaW5nKCk7Ci0Jc2V0X3BjaV9kbWFfb3BzKCZkbWFfZGlyZWN0X29wcyk7CiAJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gY2VsbGViX3BjaV9kbWFfZGV2X3NldHVwOwogCWJ1c19yZWdpc3Rlcl9ub3RpZmllcigmcGxhdGZvcm1fYnVzX3R5cGUsICZjZWxsZWJfb2ZfYnVzX25vdGlmaWVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2xzY3NhX2FsbG9jLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvbHNjc2FfYWxsb2MuYwppbmRleCBhMTAxYWJmLi4zYjg5NGY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvbHNjc2FfYWxsb2MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvbHNjc2FfYWxsb2MuYwpAQCAtMzYsMTAgKzM2LDkgQEAKIAlzdHJ1Y3Qgc3B1X2xzY3NhICpsc2NzYTsKIAl1bnNpZ25lZCBjaGFyICpwOwogCi0JbHNjc2EgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3B1X2xzY3NhKSk7CisJbHNjc2EgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3Qgc3B1X2xzY3NhKSk7CiAJaWYgKCFsc2NzYSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGxzY3NhLCAwLCBzaXplb2Yoc3RydWN0IHNwdV9sc2NzYSkpOwogCWNzYS0+bHNjc2EgPSBsc2NzYTsKIAogCS8qIFNldCBMUyBwYWdlcyByZXNlcnZlZCB0byBhbGxvdyBmb3IgdXNlci1zcGFjZSBtYXBwaW5nLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKaW5kZXggMDU0ZGZlNS4uZjgwM2Y0YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCkBAIC0yOSw2ICsyOSwxMCBAQAogCiBleHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKIAorI2RlZmluZSBOVlJBTV9BUzAgIDB4NzQKKyNkZWZpbmUgTlZSQU1fQVMxICAweDc1CisjZGVmaW5lIE5WUkFNX0RBVEEgMHg3NworCiBzdGF0aWMgaW50IG52cmFtX2FzMSA9IE5WUkFNX0FTMTsKIHN0YXRpYyBpbnQgbnZyYW1fYXMwID0gTlZSQU1fQVMwOwogc3RhdGljIGludCBudnJhbV9kYXRhID0gTlZSQU1fREFUQTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKaW5kZXggNDJkMGE4OC4uYjVlMDI2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMKQEAgLTEwNDUsNzEgKzEwNDUsOSBAQAogCS53cml0ZQkJPSBtZl9zaWRlX3Byb2Nfd3JpdGUsCiB9OwogCi0jaWYgMAotc3RhdGljIHZvaWQgbWZfZ2V0U3JjSGlzdG9yeShjaGFyICpidWZmZXIsIGludCBzaXplKQotewotCXN0cnVjdCBJcGxUeXBlUmV0dXJuU3R1ZmYgcmV0dXJuX3N0dWZmOwotCXN0cnVjdCBwZW5kaW5nX2V2ZW50ICpldiA9IG5ld19wZW5kaW5nX2V2ZW50KCk7Ci0JaW50IHJjID0gMDsKLQljaGFyICpwYWdlc1s0XTsKLQotCXBhZ2VzWzBdID0ga21hbGxvYyg0MDk2LCBHRlBfQVRPTUlDKTsKLQlwYWdlc1sxXSA9IGttYWxsb2MoNDA5NiwgR0ZQX0FUT01JQyk7Ci0JcGFnZXNbMl0gPSBrbWFsbG9jKDQwOTYsIEdGUF9BVE9NSUMpOwotCXBhZ2VzWzNdID0ga21hbGxvYyg0MDk2LCBHRlBfQVRPTUlDKTsKLQlpZiAoKGV2ID09IE5VTEwpIHx8IChwYWdlc1swXSA9PSBOVUxMKSB8fCAocGFnZXNbMV0gPT0gTlVMTCkKLQkJCSB8fCAocGFnZXNbMl0gPT0gTlVMTCkgfHwgKHBhZ2VzWzNdID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybl9zdHVmZi54VHlwZSA9IDA7Ci0JcmV0dXJuX3N0dWZmLnhSYyA9IDA7Ci0JcmV0dXJuX3N0dWZmLnhEb25lID0gMDsKLQlldi0+ZXZlbnQuaHBfbHBfZXZlbnQueFN1YnR5cGUgPSA2OwotCWV2LT5ldmVudC5ocF9scF9ldmVudC54LnhTdWJ0eXBlRGF0YSA9Ci0JCXN1YnR5cGVfZGF0YSgnTScsICdGJywgJ1YnLCAnSScpOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQueEV2ZW50ID0gJnJldHVybl9zdHVmZjsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLmNtZCA9IDQ7Ci0JZXYtPmV2ZW50LmRhdGEudnNwX2NtZC5scF9pbmRleCA9IEh2THBDb25maWdfZ2V0THBJbmRleCgpOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQucmVzdWx0X2NvZGUgPSAweEZGOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQucmVzZXJ2ZWQgPSAwOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQuc3ViX2RhdGEucGFnZVswXSA9IGlzZXJpZXNfaHZfYWRkcihwYWdlc1swXSk7Ci0JZXYtPmV2ZW50LmRhdGEudnNwX2NtZC5zdWJfZGF0YS5wYWdlWzFdID0gaXNlcmllc19odl9hZGRyKHBhZ2VzWzFdKTsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnN1Yl9kYXRhLnBhZ2VbMl0gPSBpc2VyaWVzX2h2X2FkZHIocGFnZXNbMl0pOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQuc3ViX2RhdGEucGFnZVszXSA9IGlzZXJpZXNfaHZfYWRkcihwYWdlc1szXSk7Ci0JbWIoKTsKLQlpZiAoc2lnbmFsX2V2ZW50KGV2KSAhPSAwKQotCQlyZXR1cm47Ci0KLSAJd2hpbGUgKHJldHVybl9zdHVmZi54RG9uZSAhPSAxKQotIAkJdWRlbGF5KDEwKTsKLSAJaWYgKHJldHVybl9zdHVmZi54UmMgPT0gMCkKLSAJCW1lbWNweShidWZmZXIsIHBhZ2VzWzBdLCBzaXplKTsKLQlrZnJlZShwYWdlc1swXSk7Ci0Ja2ZyZWUocGFnZXNbMV0pOwotCWtmcmVlKHBhZ2VzWzJdKTsKLQlrZnJlZShwYWdlc1szXSk7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCBtZl9zcmNfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLSNpZiAwCi0JaW50IGxlbjsKLQotCW1mX2dldFNyY0hpc3RvcnkocGFnZSwgY291bnQpOwotCWxlbiA9IGNvdW50OwotCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbiA8IGNvdW50KSB7Ci0JCSplb2YgPSAxOwotCQlpZiAobGVuIDw9IDApCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UKLQkJbGVuID0gY291bnQ7Ci0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQlyZXR1cm4gbGVuOwotI2Vsc2UKIAlyZXR1cm4gMDsKLSNlbmRpZgogfQogCiBzdGF0aWMgaW50IG1mX3NyY19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYwppbmRleCAxZjlmYjJjLi4xNDk0M2VmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMKQEAgLTE1NiwyMCArMTU2LDEyIEBACiAKIHN0YXRpYyB2b2lkIHBjaV9kbWFfYnVzX3NldHVwX3Bhc2VtaShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0KIAlwcl9kZWJ1ZygicGNpX2RtYV9idXNfc2V0dXAsIGJ1cyAlcCwgYnVzLT5zZWxmICVwXG4iLCBidXMsIGJ1cy0+c2VsZik7CiAKIAlpZiAoIWlvbW11X3RhYmxlX2lvYm1hcF9pbml0ZWQpIHsKIAkJaW9tbXVfdGFibGVfaW9ibWFwX2luaXRlZCA9IDE7CiAJCWlvbW11X3RhYmxlX2lvYm1hcF9zZXR1cCgpOwogCX0KLQotCWRuID0gcGNpX2J1c190b19PRl9ub2RlKGJ1cyk7Ci0KLQlpZiAoZG4pCi0JCVBDSV9ETihkbiktPmlvbW11X3RhYmxlID0gJmlvbW11X3RhYmxlX2lvYm1hcDsKLQogfQogCiAKQEAgLTE5Miw5ICsxODQsNiBAQAogCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgJmlvbW11X3RhYmxlX2lvYm1hcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9kbWFfYnVzX3NldHVwX251bGwoc3RydWN0IHBjaV9idXMgKmIpIHsgfQotc3RhdGljIHZvaWQgcGNpX2RtYV9kZXZfc2V0dXBfbnVsbChzdHJ1Y3QgcGNpX2RldiAqZCkgeyB9Ci0KIGludCBfX2luaXQgaW9iX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKQEAgLTI1MSwxNCArMjQwLDggQEAKIAlpb21tdV9vZmYgPSBvZl9jaG9zZW4gJiYKIAkJCW9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxpb21tdS1vZmYiLCBOVUxMKTsKICNlbmRpZgotCWlmIChpb21tdV9vZmYpIHsKLQkJLyogRGlyZWN0IEkvTywgSU9NTVUgb2ZmICovCi0JCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IHBjaV9kbWFfZGV2X3NldHVwX251bGw7Ci0JCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IHBjaV9kbWFfYnVzX3NldHVwX251bGw7Ci0JCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOwotCisJaWYgKGlvbW11X29mZikKIAkJcmV0dXJuOwotCX0KIAogCWlvYl9pbml0KE5VTEwpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKaW5kZXggOWRlYjI3NC4uZDVhY2ViNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYwpAQCAtNTA2LDYgKzUwNiwxNSBAQAogCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAic211IiwgTlVMTCk7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAl9CisJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiZmN1Iik7CisJaWYgKG5wID09IE5VTEwpIHsKKwkJLyogU29tZSBtYWNoaW5lcyBoYXZlIHN0cmFuZ2VseSBicm9rZW4gZGV2aWNlLXRyZWUgKi8KKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3UzQDAsZjgwMDAwMDAvaTJjQGY4MDAxMDAwL2ZhbkAxNWUiKTsKKwl9CisJaWYgKG5wKSB7CisJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ0ZW1wZXJhdHVyZSIsIE5VTEwpOworCQlvZl9ub2RlX3B1dChucCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwppbmRleCBiMzQxMDE4Li42YzRiNTgzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTU2NiwxMCArNTY2LDEwIEBACiAJY2FzZSBQUzNfREVWX1RZUEVfU1RPUl9ESVNLOgogCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfRElTSyk7CiAKLQkJLyogU29tZSBkZXZpY2VzIGFyZSBub3QgYWNjZXNzYWJsZSBmcm9tIHRoZSBPdGhlciBPUyBscGFyLiAqLworCQkvKiBTb21lIGRldmljZXMgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIE90aGVyIE9TIGxwYXIuICovCiAJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikgewogCQkJcmVzdWx0ID0gMDsKLQkJCXByX2RlYnVnKCIlczoldTogbm90IGFjY2Vzc2FibGVcbiIsIF9fZnVuY19fLAorCQkJcHJfZGVidWcoIiVzOiV1OiBub3QgYWNjZXNzaWJsZVxuIiwgX19mdW5jX18sCiAJCQkJIF9fTElORV9fKTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCmluZGV4IDU5ZDk3MTIuLjkyMjkwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2ludGVycnVwdC5jCkBAIC00NCw3ICs0NCw3IEBACiAgKiBAbG9jazoKICAqIEBpcGlfZGVidWdfYnJrX21hc2s6CiAgKgotICogVGhlIEhWIG1hbnRhaW5zIHBlciBTTVQgdGhyZWFkIG1hcHBpbmdzIG9mIEhWIG91dGxldCB0byBIViBwbHVnIG9uCisgKiBUaGUgSFYgbWFpbnRhaW5zIHBlciBTTVQgdGhyZWFkIG1hcHBpbmdzIG9mIEhWIG91dGxldCB0byBIViBwbHVnIG9uCiAgKiBiZWhhbGYgb2YgdGhlIGd1ZXN0LiAgVGhlc2UgbWFwcGluZ3MgYXJlIGltcGxlbWVudGVkIGFzIDI1NiBiaXQgZ3Vlc3QKICAqIHN1cHBsaWVkIGJpdG1hcHMgaW5kZXhlZCBieSBwbHVnIG51bWJlci4gIFRoZSBhZGRyZXNzZXMgb2YgdGhlIGJpdG1hcHMKICAqIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEhWIHRocm91Z2ggbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKCkuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCmluZGV4IDMxMzk4MTQuLjVkMWI3NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnCkBAIC0zMyw2ICszMywxNiBAQAogICAgICAgIGRlcGVuZHMgb24gUENJX01TSSAmJiBFRUgKICAgICAgICBkZWZhdWx0IHkKIAorY29uZmlnIFBTRVJJRVNfRU5FUkdZCisJdHJpc3RhdGUgInBTZXJpZXMgZW5lcmd5IG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJZGVmYXVsdCB5CisJaGVscAorCSAgUHJvdmlkZXMgaW50ZXJmYWNlIHRvIHBsYXRmb3JtIGVuZXJneSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcworCSAgb24gc3VwcG9ydGVkIFBTRVJJRVMgcGxhdGZvcm1zLgorCSAgUHJvdmlkZXM6IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3BzZXJpZXNfKGRlKWFjdGl2YXRpb25faGludF9saXN0CisJICBhbmQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Ti9wc2VyaWVzXyhkZSlhY3RpdmF0aW9uX2hpbnQKKwogY29uZmlnIFNDQU5MT0cKIAl0cmlzdGF0ZSAiU2NhbmxvZyBkdW1wIGludGVyZmFjZSIKIAlkZXBlbmRzIG9uIFJUQVNfUFJPQyAmJiBQUENfUFNFUklFUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCmluZGV4IDU5ZWI4YmQuLmZjNTIzNzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIG9iai0kKENPTkZJR19LRVhFQykJKz0ga2V4ZWMubwogb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8gcGNpX2RscGFyLm8KIG9iai0kKENPTkZJR19QU0VSSUVTX01TSSkJKz0gbXNpLm8KK29iai0kKENPTkZJR19QU0VSSUVTX0VORVJHWSkJKz0gcHNlcmllc19lbmVyZ3kubwogCiBvYmotJChDT05GSUdfSE9UUExVR19DUFUpCSs9IGhvdHBsdWctY3B1Lm8KIG9iai0kKENPTkZJR19NRU1PUllfSE9UUExVRykJKz0gaG90cGx1Zy1tZW1vcnkubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCmluZGV4IDE1ZTEzYjUuLjIzOTgyYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogCiAvKioKICAqIEVFSF9TSE9XX0FUVFIgLS0gY3JlYXRlIHN5c2ZzIGVudHJ5IGZvciBlZWggc3RhdGlzdGljCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9maXJtd2FyZS5jCmluZGV4IDBhMTRkOGMuLjBiMGVmZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9maXJtd2FyZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9maXJtd2FyZS5jCkBAIC01NSw2ICs1NSw3IEBACiAJe0ZXX0ZFQVRVUkVfWERBQlIsCQkiaGNhbGwteGRhYnIifSwKIAl7RldfRkVBVFVSRV9NVUxUSVRDRSwJCSJoY2FsbC1tdWx0aS10Y2UifSwKIAl7RldfRkVBVFVSRV9TUExQQVIsCQkiaGNhbGwtc3BscGFyIn0sCisJe0ZXX0ZFQVRVUkVfVlBITiwJCSJoY2FsbC12cGhuIn0sCiB9OwogCiAvKiBCdWlsZCB1cCB0aGUgZmlybXdhcmUgZmVhdHVyZXMgYml0bWFzayB1c2luZyB0aGUgY29udGVudHMgb2YKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGwuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGwuUwppbmRleCA0OGQyMDU3Li5mZDA1ZmRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbC5TCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCQogI2RlZmluZSBTVEtfUEFSTShpKSAgICAgKDQ4ICsgKChpKS0zKSo4KQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsX2luc3QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCmluZGV4IGUxOWZmMDIuLmYxMDY2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCkBAIC01NSw3ICs1NSw3IEBACiBzdGF0aWMgaW50IGhjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewogCXVuc2lnbmVkIGxvbmcgaF9udW0gPSAodW5zaWduZWQgbG9uZylwOwotCXN0cnVjdCBoY2FsbF9zdGF0cyAqaHMgPSAoc3RydWN0IGhjYWxsX3N0YXRzICopbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGNhbGxfc3RhdHMgKmhzID0gbS0+cHJpdmF0ZTsKIAogCWlmIChoc1toX251bV0ubnVtX2NhbGxzKSB7CiAJCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QVVJSKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKaW5kZXggYTc3YmNhZS4uZWRlYTYwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQgKiwgdGNlX3BhZ2UpID0gTlVMTDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQgKiwgdGNlX3BhZ2UpOwogCiBzdGF0aWMgaW50IHRjZV9idWlsZG11bHRpX3BTZXJpZXNMUChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyB0Y2VudW0sCiAJCQkJICAgICBsb25nIG5wYWdlcywgdW5zaWduZWQgbG9uZyB1YWRkciwKQEAgLTMyMywxNCArMzIzLDEzIEBACiBzdGF0aWMgdm9pZCBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiLAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sCiAJCQkJICAgICAgc3RydWN0IGlvbW11X3RhYmxlICp0YmwsCi0JCQkJICAgICAgY29uc3Qgdm9pZCAqZG1hX3dpbmRvdywKLQkJCQkgICAgICBpbnQgYnVzc3Vibm8pCisJCQkJICAgICAgY29uc3Qgdm9pZCAqZG1hX3dpbmRvdykKIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKIAotCXRibC0+aXRfYnVzbm8gID0gYnVzc3Vibm87CiAJb2ZfcGFyc2VfZG1hX3dpbmRvdyhkbiwgZG1hX3dpbmRvdywgJnRibC0+aXRfaW5kZXgsICZvZmZzZXQsICZzaXplKTsKIAorCXRibC0+aXRfYnVzbm8gPSBwaGItPmJ1cy0+bnVtYmVyOwogCXRibC0+aXRfYmFzZSAgID0gMDsKIAl0YmwtPml0X2Jsb2Nrc2l6ZSAgPSAxNjsKIAl0YmwtPml0X3R5cGUgPSBUQ0VfUENJOwpAQCAtNDUwLDE0ICs0NDksMTAgQEAKIAlpZiAoIXBwY2ktPmlvbW11X3RhYmxlKSB7CiAJCXRibCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwgR0ZQX0tFUk5FTCwKIAkJCQkgICBwcGNpLT5waGItPm5vZGUpOwotCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBwY2ktPnBoYiwgcGRuLCB0YmwsIGRtYV93aW5kb3csCi0JCQlidXMtPm51bWJlcik7CisJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAJCXBwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBwY2ktPnBoYi0+bm9kZSk7CiAJCXByX2RlYnVnKCIgIGNyZWF0ZWQgdGFibGU6ICVwXG4iLCBwcGNpLT5pb21tdV90YWJsZSk7CiAJfQotCi0JaWYgKHBkbiAhPSBkbikKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBwcGNpLT5pb21tdV90YWJsZTsKIH0KIAogCkBAIC01MzMsMjEgKzUyOCwxMSBAQAogCX0KIAlwcl9kZWJ1ZygiICBwYXJlbnQgaXMgJXNcbiIsIHBkbi0+ZnVsbF9uYW1lKTsKIAotCS8qIENoZWNrIGZvciBwYXJlbnQgPT0gTlVMTCBzbyB3ZSBkb24ndCB0cnkgdG8gc2V0dXAgdGhlIGVtcHR5IEVBRFMKLQkgKiBzbG90cyBvbiBQT1dFUjQgbWFjaGluZXMuCi0JICovCi0JaWYgKGRtYV93aW5kb3cgPT0gTlVMTCB8fCBwZG4tPnBhcmVudCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCIgIG5vIGRtYSB3aW5kb3cgZm9yIGRldmljZSwgbGlua2luZyB0byBwYXJlbnRcbiIpOwotCQlzZXRfaW9tbXVfdGFibGVfYmFzZSgmZGV2LT5kZXYsIFBDSV9ETihwZG4pLT5pb21tdV90YWJsZSk7Ci0JCXJldHVybjsKLQl9Ci0KIAlwY2kgPSBQQ0lfRE4ocGRuKTsKIAlpZiAoIXBjaS0+aW9tbXVfdGFibGUpIHsKIAkJdGJsID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMLAogCQkJCSAgIHBjaS0+cGhiLT5ub2RlKTsKLQkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwY2ktPnBoYiwgcGRuLCB0YmwsIGRtYV93aW5kb3csCi0JCQlwY2ktPnBoYi0+YnVzLT5udW1iZXIpOworCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwgcGNpLT5waGItPm5vZGUpOwogCQlwcl9kZWJ1ZygiICBjcmVhdGVkIHRhYmxlOiAlcFxuIiwgcGNpLT5pb21tdV90YWJsZSk7CiAJfSBlbHNlIHsKQEAgLTU3MSw4ICs1NTYsNyBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIFBTRVJJRVNfUkVDT05GSUdfUkVNT1ZFOgotCQlpZiAocGNpICYmIHBjaS0+aW9tbXVfdGFibGUgJiYKLQkJICAgIG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxkbWEtd2luZG93IiwgTlVMTCkpCisJCWlmIChwY2kgJiYgcGNpLT5pb21tdV90YWJsZSkKIAkJCWlvbW11X2ZyZWVfdGFibGUocGNpLT5pb21tdV90YWJsZSwgbnAtPmZ1bGxfbmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC01ODksMTMgKzU3Myw4IEBACiAvKiBUaGVzZSBhcmUgY2FsbGVkIHZlcnkgZWFybHkuICovCiB2b2lkIGlvbW11X2luaXRfZWFybHlfcFNlcmllcyh2b2lkKQogewotCWlmIChvZl9jaG9zZW4gJiYgb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKSB7Ci0JCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLwotCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBOVUxMOwotCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBOVUxMOwotCQlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKKwlpZiAob2ZfY2hvc2VuICYmIG9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxpb21tdS1vZmYiLCBOVUxMKSkKIAkJcmV0dXJuOwotCX0KIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKSB7CiAJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX01VTFRJVENFKSkgewpAQCAtNjIyLDMgKzYwMSwxNyBAQAogCXNldF9wY2lfZG1hX29wcygmZG1hX2lvbW11X29wcyk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfbXVsdGl0Y2UoY2hhciAqc3RyKQoreworCWlmIChzdHJjbXAoc3RyLCAib2ZmIikgPT0gMCAmJgorCSAgICBmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpICYmCisJICAgIGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTVVMVElUQ0UpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGluZyBNVUxUSVRDRSBmaXJtd2FyZSBmZWF0dXJlXG4iKTsKKwkJcHBjX21kLnRjZV9idWlsZCA9IHRjZV9idWlsZF9wU2VyaWVzTFA7CisJCXBwY19tZC50Y2VfZnJlZQkgPSB0Y2VfZnJlZV9wU2VyaWVzTFA7CisJCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgJj0gfkZXX0ZFQVRVUkVfTVVMVElUQ0U7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJtdWx0aXRjZT0iLCBkaXNhYmxlX211bHRpdGNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IGYxMjkwNDAuLjVkM2VhOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtNjI3LDYgKzYyNywxOCBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwU2VyaWVzX2xwYXJfdGxiaWVfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX2J1bGtfcmVtb3ZlKGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyY21wKHN0ciwgIm9mZiIpID09IDAgJiYKKwkgICAgZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9CVUxLX1JFTU9WRSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGluZyBCVUxLX1JFTU9WRSBmaXJtd2FyZSBmZWF0dXJlIik7CisJCQlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzICY9IH5GV19GRUFUVVJFX0JVTEtfUkVNT1ZFOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYnVsa19yZW1vdmU9IiwgZGlzYWJsZV9idWxrX3JlbW92ZSk7CisKIHZvaWQgX19pbml0IGhwdGVfaW5pdF9scGFyKHZvaWQpCiB7CiAJcHBjX21kLmhwdGVfaW52YWxpZGF0ZQk9IHBTZXJpZXNfbHBhcl9ocHRlX2ludmFsaWRhdGU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbnZyYW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCmluZGV4IGJjM2M3ZjIuLjdlODI4YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jCkBAIC0yMiwxMSArMjIsMjUgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAKKy8qIE1heCBieXRlcyB0byByZWFkL3dyaXRlIGluIG9uZSBnbyAqLworI2RlZmluZSBOVlJXX0NOVCAweDIwCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnZyYW1fc2l6ZTsKIHN0YXRpYyBpbnQgbnZyYW1fZmV0Y2gsIG52cmFtX3N0b3JlOwogc3RhdGljIGNoYXIgbnZyYW1fYnVmW05WUldfQ05UXTsJLyogYXNzdW1lIHRoaXMgaXMgaW4gdGhlIGZpcnN0IDRHQiAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhudnJhbV9sb2NrKTsKIAorc3RhdGljIGxvbmcgbnZyYW1fZXJyb3JfbG9nX2luZGV4ID0gLTE7CitzdGF0aWMgbG9uZyBudnJhbV9lcnJvcl9sb2dfc2l6ZSA9IDA7CisKK3N0cnVjdCBlcnJfbG9nX2luZm8geworCWludCBlcnJvcl90eXBlOworCXVuc2lnbmVkIGludCBzZXFfbnVtOworfTsKKyNkZWZpbmUgTlZSQU1fTUFYX1JFUQkJMjA3OQorI2RlZmluZSBOVlJBTV9NSU5fUkVRCQkxMDU1CisKKyNkZWZpbmUgTlZSQU1fTE9HX1BBUlRfTkFNRQkiaWJtLHJ0YXMtbG9nIgogCiBzdGF0aWMgc3NpemVfdCBwU2VyaWVzX252cmFtX3JlYWQoY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqaW5kZXgpCiB7CkBAIC0xMTksNiArMTMzLDE5NyBAQAogCXJldHVybiBudnJhbV9zaXplID8gbnZyYW1fc2l6ZSA6IC1FTk9ERVY7CiB9CiAKKworLyogbnZyYW1fd3JpdGVfZXJyb3JfbG9nCisgKgorICogV2UgbmVlZCB0byBidWZmZXIgdGhlIGVycm9yIGxvZ3MgaW50byBudnJhbSB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlCisgKiB0aGUgZmFpbHVyZSBpbmZvcm1hdGlvbiB0byBkZWNvZGUuICBJZiB3ZSBoYXZlIGEgc2V2ZXJlIGVycm9yIHRoZXJlCisgKiBpcyBubyB3YXkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIE9TIG9yIHRoZSBtYWNoaW5lIGlzIGluIGEgc3RhdGUgdG8KKyAqIGdldCBiYWNrIHRvIHVzZXIgbGFuZCBhbmQgd3JpdGUgdGhlIGVycm9yIHRvIGRpc2suICBGb3IgZXhhbXBsZSBpZgorICogdGhlIFNDU0kgZGV2aWNlIGRyaXZlciBjYXVzZXMgYSBNYWNoaW5lIENoZWNrIGJ5IHdyaXRpbmcgdG8gYSBiYWQKKyAqIElPIGFkZHJlc3MsIHRoZXJlIGlzIG5vIHdheSBvZiBndWFyYW50ZWVpbmcgdGhhdCB0aGUgZGV2aWNlIGRyaXZlcgorICogaXMgaW4gYW55IHN0YXRlIHRoYXQgaXMgd291bGQgYWxzbyBiZSBhYmxlIHRvIHdyaXRlIHRoZSBlcnJvciBkYXRhCisgKiBjYXB0dXJlZCB0byBkaXNrLCB0aHVzIHdlIGJ1ZmZlciBpdCBpbiBOVlJBTSBmb3IgYW5hbHlzaXMgb24gdGhlCisgKiBuZXh0IGJvb3QuCisgKgorICogSW4gTlZSQU0gdGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBlcnJvciBsb2cgYnVmZmVyIHdpbGwgbG9va3MgbGlrZToKKyAqIEhlYWRlciAoaW4gYnl0ZXMpOgorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgc2lnbmF0dXJlIHwgY2hlY2tzdW0gfCBsZW5ndGggfCBuYW1lICAgICAgIHwgZGF0YSAgICAgICAgICAgICB8CisgKiB8MCAgICAgICAgICB8MSAgICAgICAgIHwyICAgICAgM3w0ICAgICAgICAgMTV8MTYgICAgICAgIGxlbmd0aC0xfAorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBUaGUgJ2RhdGEnIHNlY3Rpb24gd291bGQgbG9vayBsaWtlIChpbiBieXRlcyk6CisgKiArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBldmVudF9sb2dnZWQgfCBzZXF1ZW5jZSAjIHwgZXJyb3IgbG9nICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwwICAgICAgICAgICAgM3w0ICAgICAgICAgIDd8OCAgICAgICAgICAgIG52cmFtX2Vycm9yX2xvZ19zaXplLTF8CisgKiArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGV2ZW50X2xvZ2dlZDogMCBpZiBldmVudCBoYXMgbm90IGJlZW4gbG9nZ2VkIHRvIHN5c2xvZywgMSBpZiBpdCBoYXMKKyAqIHNlcXVlbmNlICM6IFRoZSB1bmlxdWUgc2VxdWVuY2UgIyBmb3IgZWFjaCBldmVudC4gKHVudGlsIGl0IHdyYXBzKQorICogZXJyb3IgbG9nOiBUaGUgZXJyb3IgbG9nIGZyb20gZXZlbnRfc2NhbgorICovCitpbnQgbnZyYW1fd3JpdGVfZXJyb3JfbG9nKGNoYXIgKiBidWZmLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZXJyX3R5cGUsIHVuc2lnbmVkIGludCBlcnJvcl9sb2dfY250KQoreworCWludCByYzsKKwlsb2ZmX3QgdG1wX2luZGV4OworCXN0cnVjdCBlcnJfbG9nX2luZm8gaW5mbzsKKwkKKwlpZiAobnZyYW1fZXJyb3JfbG9nX2luZGV4ID09IC0xKSB7CisJCXJldHVybiAtRVNQSVBFOworCX0KKworCWlmIChsZW5ndGggPiBudnJhbV9lcnJvcl9sb2dfc2l6ZSkgeworCQlsZW5ndGggPSBudnJhbV9lcnJvcl9sb2dfc2l6ZTsKKwl9CisKKwlpbmZvLmVycm9yX3R5cGUgPSBlcnJfdHlwZTsKKwlpbmZvLnNlcV9udW0gPSBlcnJvcl9sb2dfY250OworCisJdG1wX2luZGV4ID0gbnZyYW1fZXJyb3JfbG9nX2luZGV4OworCisJcmMgPSBwcGNfbWQubnZyYW1fd3JpdGUoKGNoYXIgKikmaW5mbywgc2l6ZW9mKHN0cnVjdCBlcnJfbG9nX2luZm8pLCAmdG1wX2luZGV4KTsKKwlpZiAocmMgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3dyaXRlX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3dyaXRlICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKGJ1ZmYsIGxlbmd0aCwgJnRtcF9pbmRleCk7CisJaWYgKHJjIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV93cml0ZV9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV93cml0ZSAoJWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIG52cmFtX3JlYWRfZXJyb3JfbG9nCisgKgorICogUmVhZHMgbnZyYW0gZm9yIGVycm9yIGxvZyBmb3IgYXQgbW9zdCAnbGVuZ3RoJworICovCitpbnQgbnZyYW1fcmVhZF9lcnJvcl9sb2coY2hhciAqIGJ1ZmYsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICogZXJyX3R5cGUsIHVuc2lnbmVkIGludCAqIGVycm9yX2xvZ19jbnQpCit7CisJaW50IHJjOworCWxvZmZfdCB0bXBfaW5kZXg7CisJc3RydWN0IGVycl9sb2dfaW5mbyBpbmZvOworCQorCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmIChsZW5ndGggPiBudnJhbV9lcnJvcl9sb2dfc2l6ZSkKKwkJbGVuZ3RoID0gbnZyYW1fZXJyb3JfbG9nX3NpemU7CisKKwl0bXBfaW5kZXggPSBudnJhbV9lcnJvcl9sb2dfaW5kZXg7CisKKwlyYyA9IHBwY19tZC5udnJhbV9yZWFkKChjaGFyICopJmluZm8sIHNpemVvZihzdHJ1Y3QgZXJyX2xvZ19pbmZvKSwgJnRtcF9pbmRleCk7CisJaWYgKHJjIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9yZWFkX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3JlYWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcGNfbWQubnZyYW1fcmVhZChidWZmLCBsZW5ndGgsICZ0bXBfaW5kZXgpOworCWlmIChyYyA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVhZF9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV9yZWFkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCSplcnJvcl9sb2dfY250ID0gaW5mby5zZXFfbnVtOworCSplcnJfdHlwZSA9IGluZm8uZXJyb3JfdHlwZTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgemVybyBhbnl0aGluZywgYnV0IGl0IHNldHMgdGhlIGV2ZW50X2xvZ2dlZAorICogd29yZCB0byB0ZWxsIHRoYXQgdGhpcyBldmVudCBpcyBzYWZlbHkgaW4gc3lzbG9nLgorICovCitpbnQgbnZyYW1fY2xlYXJfZXJyb3JfbG9nKHZvaWQpCit7CisJbG9mZl90IHRtcF9pbmRleDsKKwlpbnQgY2xlYXJfd29yZCA9IEVSUl9GTEFHX0FMUkVBRFlfTE9HR0VEOworCWludCByYzsKKworCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpCisJCXJldHVybiAtMTsKKworCXRtcF9pbmRleCA9IG52cmFtX2Vycm9yX2xvZ19pbmRleDsKKwkKKwlyYyA9IHBwY19tZC5udnJhbV93cml0ZSgoY2hhciAqKSZjbGVhcl93b3JkLCBzaXplb2YoaW50KSwgJnRtcF9pbmRleCk7CisJaWYgKHJjIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jbGVhcl9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV93cml0ZSAoJWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcHNlcmllc19udnJhbV9pbml0X2xvZ19wYXJ0aXRpb24KKyAqCisgKiBUaGlzIHdpbGwgc2V0dXAgdGhlIHBhcnRpdGlvbiB3ZSBuZWVkIGZvciBidWZmZXJpbmcgdGhlCisgKiBlcnJvciBsb2dzIGFuZCBjbGVhbnVwIHBhcnRpdGlvbnMgaWYgbmVlZGVkLgorICoKKyAqIFRoZSBnZW5lcmFsIHN0cmF0ZWd5IGlzIHRoZSBmb2xsb3dpbmc6CisgKiAxLikgSWYgdGhlcmUgaXMgbG9nIHBhcnRpdGlvbiBsYXJnZSBlbm91Z2ggdGhlbiB1c2UgaXQuCisgKiAyLikgSWYgdGhlcmUgaXMgbm9uZSBsYXJnZSBlbm91Z2gsIHNlYXJjaAorICogZm9yIGEgZnJlZSBwYXJ0aXRpb24gdGhhdCBpcyBsYXJnZSBlbm91Z2guCisgKiAzLikgSWYgdGhlcmUgaXMgbm90IGEgZnJlZSBwYXJ0aXRpb24gbGFyZ2UgZW5vdWdoIHJlbW92ZSAKKyAqIF9hbGxfIE9TIHBhcnRpdGlvbnMgYW5kIGNvbnNvbGlkYXRlIHRoZSBzcGFjZS4KKyAqIDQuKSBXaWxsIGZpcnN0IHRyeSBnZXR0aW5nIGEgY2h1bmsgdGhhdCB3aWxsIHNhdGlzZnkgdGhlIG1heGltdW0KKyAqIGVycm9yIGxvZyBzaXplIChOVlJBTV9NQVhfUkVRKS4KKyAqIDUuKSBJZiB0aGUgbWF4IGNodW5rIGNhbm5vdCBiZSBhbGxvY2F0ZWQgdGhlbiB0cnkgZmluZGluZyBhIGNodW5rCisgKiB0aGF0IHdpbGwgc2F0aXNmeSB0aGUgbWludW0gbmVlZGVkIChOVlJBTV9NSU5fUkVRKS4KKyAqLworc3RhdGljIGludCBfX2luaXQgcHNlcmllc19udnJhbV9pbml0X2xvZ19wYXJ0aXRpb24odm9pZCkKK3sKKwlsb2ZmX3QgcDsKKwlpbnQgc2l6ZTsKKworCS8qIFNjYW4gbnZyYW0gZm9yIHBhcnRpdGlvbnMgKi8KKwludnJhbV9zY2FuX3BhcnRpdGlvbnMoKTsKKworCS8qIExvb2tnIGZvciBvdXJzICovCisJcCA9IG52cmFtX2ZpbmRfcGFydGl0aW9uKE5WUkFNX0xPR19QQVJUX05BTUUsIE5WUkFNX1NJR19PUywgJnNpemUpOworCisJLyogRm91bmQgb25lIGJ1dCB0b28gc21hbGwsIHJlbW92ZSBpdCAqLworCWlmIChwICYmIHNpemUgPCBOVlJBTV9NSU5fUkVRKSB7CisJCXByX2luZm8oIm52cmFtOiBGb3VuZCB0b28gc21hbGwgIk5WUkFNX0xPR19QQVJUX05BTUUiIHBhcnRpdGlvbiIKKwkJCSIscmVtb3ZpbmcgaXQuLi4iKTsKKwkJbnZyYW1fcmVtb3ZlX3BhcnRpdGlvbihOVlJBTV9MT0dfUEFSVF9OQU1FLCBOVlJBTV9TSUdfT1MpOworCQlwID0gMDsKKwl9CisKKwkvKiBDcmVhdGUgb25lIGlmIHdlIGRpZG4ndCBmaW5kICovCisJaWYgKCFwKSB7CisJCXAgPSBudnJhbV9jcmVhdGVfcGFydGl0aW9uKE5WUkFNX0xPR19QQVJUX05BTUUsIE5WUkFNX1NJR19PUywKKwkJCQkJICAgTlZSQU1fTUFYX1JFUSwgTlZSQU1fTUlOX1JFUSk7CisJCS8qIE5vIHJvb20gZm9yIGl0LCB0cnkgdG8gZ2V0IHJpZCBvZiBhbnkgT1MgcGFydGl0aW9uCisJCSAqIGFuZCB0cnkgYWdhaW4KKwkJICovCisJCWlmIChwID09IC1FTk9TUEMpIHsKKwkJCXByX2luZm8oIm52cmFtOiBObyByb29tIHRvIGNyZWF0ZSAiTlZSQU1fTE9HX1BBUlRfTkFNRQorCQkJCSIgcGFydGl0aW9uLCBkZWxldGluZyBhbGwgT1MgcGFydGl0aW9ucy4uLiIpOworCQkJbnZyYW1fcmVtb3ZlX3BhcnRpdGlvbihOVUxMLCBOVlJBTV9TSUdfT1MpOworCQkJcCA9IG52cmFtX2NyZWF0ZV9wYXJ0aXRpb24oTlZSQU1fTE9HX1BBUlRfTkFNRSwKKwkJCQkJCSAgIE5WUkFNX1NJR19PUywgTlZSQU1fTUFYX1JFUSwKKwkJCQkJCSAgIE5WUkFNX01JTl9SRVEpOworCQl9CisJfQorCisJaWYgKHAgPD0gMCkgeworCQlwcl9lcnIoIm52cmFtOiBGYWlsZWQgdG8gZmluZCBvciBjcmVhdGUgIk5WUkFNX0xPR19QQVJUX05BTUUKKwkJICAgICAgICIgcGFydGl0aW9uLCBlcnIgJWRcbiIsIChpbnQpcCk7CisJCXJldHVybiAwOworCX0KKworCW52cmFtX2Vycm9yX2xvZ19pbmRleCA9IHA7CisJbnZyYW1fZXJyb3JfbG9nX3NpemUgPSBudnJhbV9nZXRfcGFydGl0aW9uX3NpemUocCkgLQorCQlzaXplb2Yoc3RydWN0IGVycl9sb2dfaW5mbyk7CisJCisJcmV0dXJuIDA7Cit9CittYWNoaW5lX2FyY2hfaW5pdGNhbGwocHNlcmllcywgcHNlcmllc19udnJhbV9pbml0X2xvZ19wYXJ0aXRpb24pOworCiBpbnQgX19pbml0IHBTZXJpZXNfbnZyYW1faW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnZyYW07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllc19lbmVyZ3kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzX2VuZXJneS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjNjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllc19lbmVyZ3kuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIFBPV0VSIHBsYXRmb3JtIGVuZXJneSBtYW5hZ2VtZW50IGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwc2VyaWVzIHBsYXRmb3JtIGRldmljZSBkcml2ZXIgcHJvdmlkZXMgYWNjZXNzIHRvCisgKiBwbGF0Zm9ybSBlbmVyZ3kgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGFzbS9jcHV0aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisKKworI2RlZmluZSBNT0RVTEVfVkVSUyAiMS4wIgorI2RlZmluZSBNT0RVTEVfTkFNRSAicHNlcmllc19lbmVyZ3kiCisKKy8qIERyaXZlciBmbGFncyAqLworCitzdGF0aWMgaW50IHN5c2ZzX2VudHJpZXM7CisKKy8qIEhlbHBlciByb3V0aW5lcyAqLworCisvKgorICogUm91dGluZSB0byBkZXRlY3QgZmlybXdhcmUgc3VwcG9ydCBmb3IgaGNhbGwKKyAqIHJldHVybiAxIGlmIEhfQkVTVF9FTkVSR1kgaXMgc3VwcG9ydGVkCisgKiBlbHNlIHJldHVybiAwCisgKi8KKworc3RhdGljIGludCBjaGVja19mb3JfaF9iZXN0X2VuZXJneSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcnRhcyA9IE5VTEw7CisJY29uc3QgY2hhciAqaHlwZXJ0YXMsICpzOworCWludCBsZW5ndGg7CisJaW50IHJjID0gMDsKKworCXJ0YXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL3J0YXMiKTsKKwlpZiAoIXJ0YXMpCisJCXJldHVybiAwOworCisJaHlwZXJ0YXMgPSBvZl9nZXRfcHJvcGVydHkocnRhcywgImlibSxoeXBlcnRhcy1mdW5jdGlvbnMiLCAmbGVuZ3RoKTsKKwlpZiAoIWh5cGVydGFzKSB7CisJCW9mX25vZGVfcHV0KHJ0YXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBoeXBlcnRhcyB3aWxsIGhhdmUgbGlzdCBvZiBzdHJpbmdzIHdpdGggaGNhbGwgbmFtZXMgKi8KKwlmb3IgKHMgPSBoeXBlcnRhczsgcyA8IGh5cGVydGFzICsgbGVuZ3RoOyBzICs9IHN0cmxlbihzKSArIDEpIHsKKwkJaWYgKCFzdHJuY21wKCJoY2FsbC1iZXN0LWVuZXJneS0xIiwgcywgMTkpKSB7CisJCQlyYyA9IDE7IC8qIEZvdW5kIHRoZSBzdHJpbmcgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCW9mX25vZGVfcHV0KHJ0YXMpOworCXJldHVybiByYzsKK30KKworLyogSGVscGVyIFJvdXRpbmVzIHRvIGNvbnZlcnQgYmV0d2VlbiBkcmNfaW5kZXggdG8gY3B1IG51bWJlcnMgKi8KKworc3RhdGljIHUzMiBjcHVfdG9fZHJjX2luZGV4KGludCBjcHUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IE5VTEw7CisJY29uc3QgaW50ICppbmRleGVzOworCWludCBpOworCWludCByYyA9IDE7CisJdTMyIHJldCA9IDA7CisKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCWlmIChkbiA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpbmRleGVzID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGRyYy1pbmRleGVzIiwgTlVMTCk7CisJaWYgKGluZGV4ZXMgPT0gTlVMTCkKKwkJZ290byBlcnJfb2Zfbm9kZV9wdXQ7CisJLyogQ29udmVydCBsb2dpY2FsIGNwdSBudW1iZXIgdG8gY29yZSBudW1iZXIgKi8KKwlpID0gY3B1X2NvcmVfaW5kZXhfb2ZfdGhyZWFkKGNwdSk7CisJLyoKKwkgKiBUaGUgZmlyc3QgZWxlbWVudCBpbmRleGVzWzBdIGlzIHRoZSBudW1iZXIgb2YgZHJjX2luZGV4ZXMKKwkgKiByZXR1cm5lZCBpbiB0aGUgbGlzdC4gIEhlbmNlIGkrMSB3aWxsIGdldCB0aGUgZHJjX2luZGV4CisJICogY29ycmVzcG9uZGluZyB0byBjb3JlIG51bWJlciBpLgorCSAqLworCVdBUk5fT04oaSA+IGluZGV4ZXNbMF0pOworCXJldCA9IGluZGV4ZXNbaSArIDFdOworCXJjID0gMDsKKworZXJyX29mX25vZGVfcHV0OgorCW9mX25vZGVfcHV0KGRuKTsKK2VycjoKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNwdV90b19kcmNfaW5kZXgoJWQpIGZhaWxlZCIsIGNwdSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcmNfaW5kZXhfdG9fY3B1KHUzMiBkcmNfaW5kZXgpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IE5VTEw7CisJY29uc3QgaW50ICppbmRleGVzOworCWludCBpLCBjcHUgPSAwOworCWludCByYyA9IDE7CisKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY3B1cyIpOworCWlmIChkbiA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpbmRleGVzID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLGRyYy1pbmRleGVzIiwgTlVMTCk7CisJaWYgKGluZGV4ZXMgPT0gTlVMTCkKKwkJZ290byBlcnJfb2Zfbm9kZV9wdXQ7CisJLyoKKwkgKiBGaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0aGUgbnVtYmVyIG9mIGRyY19pbmRleGVzCisJICogcmV0dXJuZWQuICBTZWFyY2ggdGhyb3VnaCB0aGUgbGlzdCB0byBmaW5kIHRoZSBtYXRjaGluZworCSAqIGRyY19pbmRleCBhbmQgZ2V0IHRoZSBjb3JlIG51bWJlcgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRleGVzWzBdOyBpKyspIHsKKwkJaWYgKGluZGV4ZXNbaSArIDFdID09IGRyY19pbmRleCkKKwkJCWJyZWFrOworCX0KKwkvKiBDb252ZXJ0IGNvcmUgbnVtYmVyIHRvIGxvZ2ljYWwgY3B1IG51bWJlciAqLworCWNwdSA9IGNwdV9maXJzdF90aHJlYWRfb2ZfY29yZShpKTsKKwlyYyA9IDA7CisKK2Vycl9vZl9ub2RlX3B1dDoKKwlvZl9ub2RlX3B1dChkbik7CitlcnI6CisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJkcmNfaW5kZXhfdG9fY3B1KCVkKSBmYWlsZWQiLCBkcmNfaW5kZXgpOworCXJldHVybiBjcHU7Cit9CisKKy8qCisgKiBwc2VyaWVzIGh5cGVydmlzb3IgY2FsbCBIX0JFU1RfRU5FUkdZIHByb3ZpZGVzIGhpbnRzIHRvIE9TIG9uCisgKiBwcmVmZXJyZWQgbG9naWNhbCBjcHVzIHRvIGFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgZm9yIG9wdGltaXplZAorICogZW5lcmd5IGNvbnN1bXB0aW9uLgorICovCisKKyNkZWZpbmUgRkxBR1NfTU9ERTEJMHgwMDRFMjAwMDAwMDgwRTAxCisjZGVmaW5lIEZMQUdTX01PREUyCTB4MDA0RTIwMDAwMDA4MDQwMQorI2RlZmluZSBGTEFHU19BQ1RJVkFURSAgMHgxMDAKKworc3RhdGljIHNzaXplX3QgZ2V0X2Jlc3RfZW5lcmd5X2xpc3QoY2hhciAqcGFnZSwgaW50IGFjdGl2YXRlKQoreworCWludCByYywgY250LCBpLCBjcHU7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiAqYnVmX3BhZ2U7CisJY2hhciAqcyA9IHBhZ2U7CisKKwlidWZfcGFnZSA9ICh1MzIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmX3BhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJZmxhZ3MgPSBGTEFHU19NT0RFMTsKKwlpZiAoYWN0aXZhdGUpCisJCWZsYWdzIHw9IEZMQUdTX0FDVElWQVRFOworCisJcmMgPSBwbHBhcl9oY2FsbDkoSF9CRVNUX0VORVJHWSwgcmV0YnVmLCBmbGFncywgMCwgX19wYShidWZfcGFnZSksCisJCQkJMCwgMCwgMCwgMCwgMCwgMCk7CisJaWYgKHJjICE9IEhfU1VDQ0VTUykgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zl9wYWdlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY250ID0gcmV0YnVmWzBdOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQljcHUgPSBkcmNfaW5kZXhfdG9fY3B1KGJ1Zl9wYWdlWzIqaSsxXSk7CisJCWlmICgoY3B1X29ubGluZShjcHUpICYmICFhY3RpdmF0ZSkgfHwKKwkJICAgICghY3B1X29ubGluZShjcHUpICYmIGFjdGl2YXRlKSkKKwkJCXMgKz0gc3ByaW50ZihzLCAiJWQsIiwgY3B1KTsKKwl9CisJaWYgKHMgPiBwYWdlKSB7IC8qIFNvbWV0aGluZyB0byBzaG93ICovCisJCXMtLTsgLyogU3VwcHJlc3MgbGFzdCBjb21tYSAqLworCQlzICs9IHNwcmludGYocywgIlxuIik7CisJfQorCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWZfcGFnZSk7CisJcmV0dXJuIHMtcGFnZTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2Jlc3RfZW5lcmd5X2RhdGEoc3RydWN0IHN5c19kZXZpY2UgKmRldiwKKwkJCQkJY2hhciAqcGFnZSwgaW50IGFjdGl2YXRlKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlmbGFncyA9IEZMQUdTX01PREUyOworCWlmIChhY3RpdmF0ZSkKKwkJZmxhZ3MgfD0gRkxBR1NfQUNUSVZBVEU7CisKKwlyYyA9IHBscGFyX2hjYWxsOShIX0JFU1RfRU5FUkdZLCByZXRidWYsIGZsYWdzLAorCQkJCWNwdV90b19kcmNfaW5kZXgoZGV2LT5pZCksCisJCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwlpZiAocmMgIT0gSF9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbHVcbiIsIHJldGJ1ZlsxXSA+PiAzMik7Cit9CisKKy8qIFdyYXBwZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBzc2l6ZV90IGNwdV9hY3RpdmF0ZV9oaW50X2xpc3Rfc2hvdyhzdHJ1Y3Qgc3lzZGV2X2NsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBzeXNkZXZfY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCXJldHVybiBnZXRfYmVzdF9lbmVyZ3lfbGlzdChwYWdlLCAxKTsKK30KKworc3RhdGljIHNzaXplX3QgY3B1X2RlYWN0aXZhdGVfaGludF9saXN0X3Nob3coc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xhc3MsCisJCQlzdHJ1Y3Qgc3lzZGV2X2NsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gZ2V0X2Jlc3RfZW5lcmd5X2xpc3QocGFnZSwgMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBlcmNwdV9hY3RpdmF0ZV9oaW50X3Nob3coc3RydWN0IHN5c19kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCXJldHVybiBnZXRfYmVzdF9lbmVyZ3lfZGF0YShkZXYsIHBhZ2UsIDEpOworfQorCitzdGF0aWMgc3NpemVfdCBwZXJjcHVfZGVhY3RpdmF0ZV9oaW50X3Nob3coc3RydWN0IHN5c19kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCXJldHVybiBnZXRfYmVzdF9lbmVyZ3lfZGF0YShkZXYsIHBhZ2UsIDApOworfQorCisvKgorICogQ3JlYXRlIHN5c2ZzIGludGVyZmFjZToKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3BzZXJpZXNfYWN0aXZhdGVfaGludF9saXN0CisgKiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9wc2VyaWVzX2RlYWN0aXZhdGVfaGludF9saXN0CisgKglDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjcHVzIHRvIGFjdGl2YXRlIG9yIGRlYWN0aXZhdGUKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdU4vcHNlcmllc19hY3RpdmF0ZV9oaW50CisgKiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVOL3BzZXJpZXNfZGVhY3RpdmF0ZV9oaW50CisgKglQZXItY3B1IHZhbHVlIG9mIHRoZSBoaW50CisgKi8KKworc3RydWN0IHN5c2Rldl9jbGFzc19hdHRyaWJ1dGUgYXR0cl9jcHVfYWN0aXZhdGVfaGludF9saXN0ID0KKwkJX1NZU0RFVl9DTEFTU19BVFRSKHBzZXJpZXNfYWN0aXZhdGVfaGludF9saXN0LCAwNDQ0LAorCQljcHVfYWN0aXZhdGVfaGludF9saXN0X3Nob3csIE5VTEwpOworCitzdHJ1Y3Qgc3lzZGV2X2NsYXNzX2F0dHJpYnV0ZSBhdHRyX2NwdV9kZWFjdGl2YXRlX2hpbnRfbGlzdCA9CisJCV9TWVNERVZfQ0xBU1NfQVRUUihwc2VyaWVzX2RlYWN0aXZhdGVfaGludF9saXN0LCAwNDQ0LAorCQljcHVfZGVhY3RpdmF0ZV9oaW50X2xpc3Rfc2hvdywgTlVMTCk7CisKK3N0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGF0dHJfcGVyY3B1X2FjdGl2YXRlX2hpbnQgPQorCQlfU1lTREVWX0FUVFIocHNlcmllc19hY3RpdmF0ZV9oaW50LCAwNDQ0LAorCQlwZXJjcHVfYWN0aXZhdGVfaGludF9zaG93LCBOVUxMKTsKKworc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgYXR0cl9wZXJjcHVfZGVhY3RpdmF0ZV9oaW50ID0KKwkJX1NZU0RFVl9BVFRSKHBzZXJpZXNfZGVhY3RpdmF0ZV9oaW50LCAwNDQ0LAorCQlwZXJjcHVfZGVhY3RpdmF0ZV9oaW50X3Nob3csIE5VTEwpOworCitzdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX2VuZXJneV9pbml0KHZvaWQpCit7CisJaW50IGNwdSwgZXJyOworCXN0cnVjdCBzeXNfZGV2aWNlICpjcHVfc3lzX2RldjsKKworCWlmICghY2hlY2tfZm9yX2hfYmVzdF9lbmVyZ3koKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJIeXBlcmNhbGwgSF9CRVNUX0VORVJHWSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIENyZWF0ZSB0aGUgc3lzZnMgZmlsZXMgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmY3B1X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmF0dHJfY3B1X2FjdGl2YXRlX2hpbnRfbGlzdC5hdHRyKTsKKwlpZiAoIWVycikKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNwdV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAorCQkJCSZhdHRyX2NwdV9kZWFjdGl2YXRlX2hpbnRfbGlzdC5hdHRyKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQljcHVfc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjcHVfc3lzX2Rldi0+a29iaiwKKwkJCQkmYXR0cl9wZXJjcHVfYWN0aXZhdGVfaGludC5hdHRyKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmY3B1X3N5c19kZXYtPmtvYmosCisJCQkJJmF0dHJfcGVyY3B1X2RlYWN0aXZhdGVfaGludC5hdHRyKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzeXNmc19lbnRyaWVzID0gMTsgLyogUmVtb3ZlZCBlbnRyaWVzIG9uIGNsZWFudXAgKi8KKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHNlcmllc19lbmVyZ3lfY2xlYW51cCh2b2lkKQoreworCWludCBjcHU7CisJc3RydWN0IHN5c19kZXZpY2UgKmNwdV9zeXNfZGV2OworCisJaWYgKCFzeXNmc19lbnRyaWVzKQorCQlyZXR1cm47CisKKwkvKiBSZW1vdmUgdGhlIHN5c2ZzIGZpbGVzICovCisJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNwdV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAorCQkJCSZhdHRyX2NwdV9hY3RpdmF0ZV9oaW50X2xpc3QuYXR0cik7CisKKwlzeXNmc19yZW1vdmVfZmlsZSgmY3B1X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmF0dHJfY3B1X2RlYWN0aXZhdGVfaGludF9saXN0LmF0dHIpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQljcHVfc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7CisJCXN5c2ZzX3JlbW92ZV9maWxlKCZjcHVfc3lzX2Rldi0+a29iaiwKKwkJCQkmYXR0cl9wZXJjcHVfYWN0aXZhdGVfaGludC5hdHRyKTsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNwdV9zeXNfZGV2LT5rb2JqLAorCQkJCSZhdHRyX3BlcmNwdV9kZWFjdGl2YXRlX2hpbnQuYXR0cik7CisJfQorfQorCittb2R1bGVfaW5pdChwc2VyaWVzX2VuZXJneV9pbml0KTsKK21vZHVsZV9leGl0KHBzZXJpZXNfZW5lcmd5X2NsZWFudXApOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHBTZXJpZXMgcGxhdGZvcm0gZW5lcmd5IG1hbmFnZW1lbnQiKTsKK01PRFVMRV9BVVRIT1IoIlZhaWR5YW5hdGhhbiBTcmluaXZhc2FuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3N1c3BlbmQuYwppbmRleCBlZDcyMDk4Li5hOGNhMjg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc3VzcGVuZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zdXNwZW5kLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCS5uYW1lID0gInBvd2VyIiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcHNlcmllc19zdXNwZW5kX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcHNlcmllc19zdXNwZW5kX29wcyA9IHsKIAkudmFsaWQJCT0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKIAkuYmVnaW4JCT0gcHNlcmllc19zdXNwZW5kX2JlZ2luLAogCS5wcmVwYXJlX2xhdGUJPSBwc2VyaWVzX3ByZXBhcmVfbGF0ZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IDBiZWY5ZGEuLjljMjk3MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtNDEsNiArNDEsNyBAQAogaWZlcSAoJChDT05GSUdfUENJKSx5KQogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHBwYzR4eF9wY2kubwogZW5kaWYKK29iai0kKENPTkZJR19QUEM0eHhfQ1BNKQkrPSBwcGM0eHhfY3BtLm8KIG9iai0kKENPTkZJR19QUEM0eHhfR1BJTykJKz0gcHBjNHh4X2dwaW8ubwogCiBvYmotJChDT05GSUdfQ1BNKQkJKz0gY3BtX2NvbW1vbi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jCmluZGV4IDE3Y2YxNWUuLjhlOWUwNmE3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTMxMiwxNyArMzEyLDEwIEBACiAKIHN0YXRpYyB2b2lkIHBjaV9kbWFfYnVzX3NldHVwX2RhcnQoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCiAJaWYgKCFpb21tdV90YWJsZV9kYXJ0X2luaXRlZCkgewogCQlpb21tdV90YWJsZV9kYXJ0X2luaXRlZCA9IDE7CiAJCWlvbW11X3RhYmxlX2RhcnRfc2V0dXAoKTsKIAl9Ci0KLQlkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwotCi0JaWYgKGRuKQotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV9kYXJ0OwogfQogCiBzdGF0aWMgYm9vbCBkYXJ0X2RldmljZV9vbl9wY2llKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTM3Myw3ICszNjYsNyBAQAogCWlmIChkbiA9PSBOVUxMKSB7CiAJCWRuID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImRhcnQiLCAidTQtZGFydCIpOwogCQlpZiAoZG4gPT0gTlVMTCkKLQkJCWdvdG8gYmFpbDsKKwkJCXJldHVybjsJLyogdXNlIGRlZmF1bHQgZGlyZWN0X2RtYV9vcHMgKi8KIAkJZGFydF9pc191NCA9IDE7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCmluZGV4IDQ0ZGU4NTUuLmU5MzgxYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BtYy5jCkBAIC01Myw3ICs1Myw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcG1jX3N1c3BlbmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBwbWNfc3VzcGVuZF9vcHMgPSB7CiAJLnZhbGlkID0gcG1jX3N1c3BlbmRfdmFsaWQsCiAJLmVudGVyID0gcG1jX3N1c3BlbmRfZW50ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYwppbmRleCA5NzI1MzY5Li45Zjk5YmVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYwpAQCAtOTczLDcgKzk3Myw2IEBACiAJaWYgKGRzciAmIERPT1JCRUxMX0RTUl9RRkkpIHsKIAkJcHJfaW5mbygiUklPOiBkb29yYmVsbCBxdWV1ZSBmdWxsXG4iKTsKIAkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5kc3IsIERPT1JCRUxMX0RTUl9RRkkpOwotCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBYWFggTmVlZCB0byBjaGVjay9kaXNwYXRjaCB1bnRpbCBxdWV1ZSBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4eF9ncGlvLmMKaW5kZXggYzBlYTA1ZS4uYzQ4Y2Q4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEdQSU9zIG9uIE1QQzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCisgKiBHUElPcyBvbiBNUEM1MTJ4LzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CiAgKgpAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBHUElPX0lFUgkJMHgwYwogI2RlZmluZSBHUElPX0lNUgkJMHgxMAogI2RlZmluZSBHUElPX0lDUgkJMHgxNAorI2RlZmluZSBHUElPX0lDUjIJCTB4MTgKIAogc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwIHsKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOwpAQCAtMzcsNiArMzgsNyBAQAogCSAqLwogCXUzMiBkYXRhOwogCXN0cnVjdCBpcnFfaG9zdCAqaXJxOworCXZvaWQgKm9mX2Rldl9pZF9kYXRhOwogfTsKIAogc3RhdGljIGlubGluZSB1MzIgbXBjOHh4eF9ncGlvMm1hc2sodW5zaWduZWQgaW50IGdwaW8pCkBAIC0yMTUsNiArMjE3LDUxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXBjNTEyeF9pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJdW5zaWduZWQgbG9uZyBncGlvID0gdmlycV90b19odyh2aXJxKTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChncGlvIDwgMTYpIHsKKwkJcmVnID0gbW0tPnJlZ3MgKyBHUElPX0lDUjsKKwkJc2hpZnQgPSAoMTUgLSBncGlvKSAqIDI7CisJfSBlbHNlIHsKKwkJcmVnID0gbW0tPnJlZ3MgKyBHUElPX0lDUjI7CisJCXNoaWZ0ID0gKDE1IC0gKGdwaW8gJSAxNikpICogMjsKKwl9CisKKwlzd2l0Y2ggKGZsb3dfdHlwZSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJzZXRiaXRzX2JlMzIocmVnLCAzIDw8IHNoaWZ0LCAyIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJzZXRiaXRzX2JlMzIocmVnLCAzIDw8IHNoaWZ0LCAxIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJiaXRzMzIocmVnLCAzIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1wYzh4eHhfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIm1wYzh4eHgtZ3BpbyIsCiAJLnVubWFzawkJPSBtcGM4eHh4X2lycV91bm1hc2ssCkBAIC0yMjYsNiArMjczLDExIEBACiBzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19pcnFfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkJaXJxX2h3X251bWJlcl90IGh3KQogeworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGgtPmhvc3RfZGF0YTsKKworCWlmIChtcGM4eHh4X2djLT5vZl9kZXZfaWRfZGF0YSkKKwkJbXBjOHh4eF9pcnFfY2hpcC5zZXRfdHlwZSA9IG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhOworCiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgaC0+aG9zdF9kYXRhKTsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJm1wYzh4eHhfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwogCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9OT05FKTsKQEAgLTI1MywxMSArMzA1LDIwIEBACiAJLnhsYXRlCT0gbXBjOHh4eF9ncGlvX2lycV94bGF0ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzh4eHhfZ3Bpb19pZHNbXSBfX2luaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktZ3BpbyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NjEwLWdwaW8iLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtZ3BpbyIsIC5kYXRhID0gbXBjNTEyeF9pcnFfc2V0X3R5cGUsIH0sCisJe30KK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4eHh4X2FkZF9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djOwogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwogCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOwogCXVuc2lnbmVkIGh3aXJxOwogCWludCByZXQ7CiAKQEAgLTI5Nyw2ICszNTgsMTAgQEAKIAlpZiAoIW1wYzh4eHhfZ2MtPmlycSkKIAkJZ290byBza2lwX2lycTsKIAorCWlkID0gb2ZfbWF0Y2hfbm9kZShtcGM4eHh4X2dwaW9faWRzLCBucCk7CisJaWYgKGlkKQorCQltcGM4eHh4X2djLT5vZl9kZXZfaWRfZGF0YSA9IGlkLT5kYXRhOworCiAJbXBjOHh4eF9nYy0+aXJxLT5ob3N0X2RhdGEgPSBtcGM4eHh4X2djOwogCiAJLyogYWNrIGFuZCBtYXNrIGFsbCBpcnFzICovCkBAIC0zMjEsMTMgKzM4Niw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4MzQ5LWdwaW8iKQotCQltcGM4eHh4X2FkZF9jb250cm9sbGVyKG5wKTsKLQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4NTcyLWdwaW8iKQotCQltcGM4eHh4X2FkZF9jb250cm9sbGVyKG5wKTsKLQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4NjEwLWdwaW8iKQorCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIG1wYzh4eHhfZ3Bpb19pZHMpCiAJCW1wYzh4eHhfYWRkX2NvbnRyb2xsZXIobnApOwogCiAJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZnNsLHFvcmlxLWdwaW8iKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDEzOThiYzQuLmZlYWVlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2NwbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfY3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiODZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2NwbS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogUG93ZXJQQyA0eHggQ2xvY2sgYW5kIFBvd2VyIE1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24KKyAqIFZpY3RvciBHYWxsYXJkbyAodmdhbGxhcmRvQGFwbS5jb20pCisgKgorICogQmFzZWQgb24gYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvaWRsZS5jOgorICogSmVyb25lIFlvdW5nIDxqeW91bmc1QHVzLmlibS5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBJQk0gQ29ycC4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYzoKKyAqIEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgorICogQ29weXJpZ2h0IDIwMDkgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKyNpbmNsdWRlIDxhc20vZGNyLW5hdGl2ZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKKyNkZWZpbmUgQ1BNX0VSCTAKKyNkZWZpbmUgQ1BNX0ZSCTEKKyNkZWZpbmUgQ1BNX1NSCTIKKworI2RlZmluZSBDUE1fSURMRV9XQUlUCTAKKyNkZWZpbmUgQ1BNX0lETEVfRE9aRQkxCisKK3N0cnVjdCBjcG0geworCWRjcl9ob3N0X3QJZGNyX2hvc3Q7CisJdW5zaWduZWQgaW50CWRjcl9vZmZzZXRbM107CisJdW5zaWduZWQgaW50CXBvd2Vyc2F2ZV9vZmY7CisJdW5zaWduZWQgaW50CXVudXNlZDsKKwl1bnNpZ25lZCBpbnQJaWRsZV9kb3plOworCXVuc2lnbmVkIGludAlzdGFuZGJ5OworCXVuc2lnbmVkIGludAlzdXNwZW5kOworfTsKKworc3RhdGljIHN0cnVjdCBjcG0gY3BtOworCitzdHJ1Y3QgY3BtX2lkbGVfbW9kZSB7CisJdW5zaWduZWQgaW50IGVuYWJsZWQ7CisJY29uc3QgY2hhciAgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNwbV9pZGxlX21vZGUgaWRsZV9tb2RlW10gPSB7CisJW0NQTV9JRExFX1dBSVRdID0geyAxLCAid2FpdCIgfSwgLyogZGVmYXVsdCAqLworCVtDUE1fSURMRV9ET1pFXSA9IHsgMCwgImRvemUiIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNwbV9zZXQodW5zaWduZWQgaW50IGNwbV9yZWcsIHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCS8qIENQTSBjb250cm9sbGVyIHN1cHBvcnRzIDMgZGlmZmVyZW50IHR5cGVzIG9mIHNsZWVwIGludGVyZmFjZQorCSAqIGtub3duIGFzIGNsYXNzIDEsIDIgYW5kIDMuIEZvciBjbGFzcyAxIHVuaXRzLCB0aGV5IGFyZQorCSAqIHVuY29uZGl0aW9uYWxseSBwdXQgdG8gc2xlZXAgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBDUE0gYml0IGlzCisJICogc2V0LiBGb3IgY2xhc3MgMiBhbmQgMyB1bml0cyB0aGlzIGlzIG5vdCBjYXNlOyBpZiB0aGV5IGNhbiBiZQorCSAqIHB1dCB0byB0byBzbGVlcCwgdGhleSB3aWxsLiBIZXJlIHdlIGRvIG5vdCB2ZXJpZnksIHdlIGp1c3QKKwkgKiBzZXQgdGhlbSBhbmQgZXhwZWN0IHRoZW0gdG8gZXZlbnR1YWxseSBnbyBvZmYgd2hlbiB0aGV5IGNhbi4KKwkgKi8KKwl2YWx1ZSA9IGRjcl9yZWFkKGNwbS5kY3JfaG9zdCwgY3BtLmRjcl9vZmZzZXRbY3BtX3JlZ10pOworCWRjcl93cml0ZShjcG0uZGNyX2hvc3QsIGNwbS5kY3Jfb2Zmc2V0W2NwbV9yZWddLCB2YWx1ZSB8IG1hc2spOworCisJLyogcmV0dXJuIG9sZCBzdGF0ZSwgdG8gcmVzdG9yZSBsYXRlciBpZiBuZWVkZWQgKi8KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX3dhaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1zcl9zYXZlOworCisJLyogc2F2ZSBvZmYgaW5pdGlhbCBzdGF0ZSAqLworCW1zcl9zYXZlID0gbWZtc3IoKTsKKwkvKiBzeW5jIHJlcXVpcmVkIHdoZW4gQ1BNMF9FUltDUFVdIGlzIHNldCAqLworCW1iKCk7CisJLyogc2V0IHdhaXQgc3RhdGUgTVNSICovCisJbXRtc3IobXNyX3NhdmV8TVNSX1dFfE1TUl9FRXxNU1JfQ0V8TVNSX0RFKTsKKwlpc3luYygpOworCS8qIHJldHVybiB0byBpbml0aWFsIHN0YXRlICovCisJbXRtc3IobXNyX3NhdmUpOworCWlzeW5jKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCBlcl9zYXZlOworCisJLyogdXBkYXRlIENQTV9FUiBzdGF0ZSAqLworCWVyX3NhdmUgPSBjcG1fc2V0KENQTV9FUiwgbWFzayk7CisKKwkvKiBnbyB0byB3YWl0IHN0YXRlIHNvIHRoYXQgQ1BNMF9FUltDUFVdIGNhbiB0YWtlIGVmZmVjdCAqLworCWNwbV9pZGxlX3dhaXQoKTsKKworCS8qIHJlc3RvcmUgQ1BNX0VSIHN0YXRlICovCisJZGNyX3dyaXRlKGNwbS5kY3JfaG9zdCwgY3BtLmRjcl9vZmZzZXRbQ1BNX0VSXSwgZXJfc2F2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX2RvemUodm9pZCkKK3sKKwljcG1faWRsZV9zbGVlcChjcG0uaWRsZV9kb3plKTsKK30KKworc3RhdGljIHZvaWQgY3BtX2lkbGVfY29uZmlnKGludCBtb2RlKQoreworCWludCBpOworCisJaWYgKGlkbGVfbW9kZVttb2RlXS5lbmFibGVkKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZGxlX21vZGUpOyBpKyspCisJCWlkbGVfbW9kZVtpXS5lbmFibGVkID0gMDsKKworCWlkbGVfbW9kZVttb2RlXS5lbmFibGVkID0gMTsKK30KKworc3RhdGljIHNzaXplX3QgY3BtX2lkbGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGJ1ZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlkbGVfbW9kZSk7IGkrKykgeworCQlpZiAoaWRsZV9tb2RlW2ldLmVuYWJsZWQpCisJCQlzICs9IHNwcmludGYocywgIlslc10gIiwgaWRsZV9tb2RlW2ldLm5hbWUpOworCQllbHNlCisJCQlzICs9IHNwcmludGYocywgIiVzICIsIGlkbGVfbW9kZVtpXS5uYW1lKTsKKwl9CisKKwkqKHMtMSkgPSAnXG4nOyAvKiBjb252ZXJ0IHRoZSBsYXN0IHNwYWNlIHRvIGEgbmV3bGluZSAqLworCisJcmV0dXJuIHMgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwbV9pZGxlX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKK3sKKwlpbnQgaTsKKwljaGFyICpwOworCWludCBsZW47CisKKwlwID0gbWVtY2hyKGJ1ZiwgJ1xuJywgbik7CisJbGVuID0gcCA/IHAgLSBidWYgOiBuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWRsZV9tb2RlKTsgaSsrKSB7CisJCWlmIChzdHJuY21wKGJ1ZiwgaWRsZV9tb2RlW2ldLm5hbWUsIGxlbikgPT0gMCkgeworCQkJY3BtX2lkbGVfY29uZmlnKGkpOworCQkJcmV0dXJuIG47CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjcG1faWRsZV9hdHRyID0KKwlfX0FUVFIoaWRsZSwgMDY0NCwgY3BtX2lkbGVfc2hvdywgY3BtX2lkbGVfc3RvcmUpOworCitzdGF0aWMgdm9pZCBjcG1faWRsZV9jb25maWdfc3lzZnModm9pZCkKK3sKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldjsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXN5c19kZXYgPSBnZXRfY3B1X3N5c2RldigwKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZzeXNfZGV2LT5rb2JqLAorCQkJCSZjcG1faWRsZV9hdHRyLmF0dHIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjcG06IGZhaWxlZCB0byBjcmVhdGUgaWRsZSBzeXNmcyBlbnRyeVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlKHZvaWQpCit7CisJaWYgKGlkbGVfbW9kZVtDUE1fSURMRV9ET1pFXS5lbmFibGVkKQorCQljcG1faWRsZV9kb3plKCk7CisJZWxzZQorCQljcG1faWRsZV93YWl0KCk7Cit9CisKK3N0YXRpYyBpbnQgY3BtX3N1c3BlbmRfdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKKwkJcmV0dXJuICEhY3BtLnN0YW5kYnk7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJcmV0dXJuICEhY3BtLnN1c3BlbmQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcG1fc3VzcGVuZF9zdGFuZGJ5KHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgdGNyX3NhdmU7CisKKwkvKiBkaXNhYmxlIGRlY3JlbWVudCBpbnRlcnJ1cHQgKi8KKwl0Y3Jfc2F2ZSA9IG1mc3ByKFNQUk5fVENSKTsKKwltdHNwcihTUFJOX1RDUiwgdGNyX3NhdmUgJiB+VENSX0RJRSk7CisKKwkvKiBnbyB0byBzbGVlcCBzdGF0ZSAqLworCWNwbV9pZGxlX3NsZWVwKG1hc2spOworCisJLyogcmVzdG9yZSBkZWNyZW1lbnQgaW50ZXJydXB0ICovCisJbXRzcHIoU1BSTl9UQ1IsIHRjcl9zYXZlKTsKK30KKworc3RhdGljIGludCBjcG1fc3VzcGVuZF9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCQljcG1fc3VzcGVuZF9zdGFuZGJ5KGNwbS5zdGFuZGJ5KTsKKwkJYnJlYWs7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJY3BtX3N1c3BlbmRfc3RhbmRieShjcG0uc3VzcGVuZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGNwbV9zdXNwZW5kX29wcyA9IHsKKwkudmFsaWQJCT0gY3BtX3N1c3BlbmRfdmFsaWQsCisJLmVudGVyCQk9IGNwbV9zdXNwZW5kX2VudGVyLAorfTsKKworc3RhdGljIGludCBjcG1fZ2V0X3VpbnRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgbmFtZSwgJmxlbik7CisKKwlpZiAocHJvcCA9PSBOVUxMIHx8IGxlbiA8IHNpemVvZih1MzIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAqcHJvcDsKK30KKworc3RhdGljIGludCBfX2luaXQgY3BtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBkY3JfYmFzZSwgZGNyX2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY3BtLnBvd2Vyc2F2ZV9vZmYpIHsKKwkJY3BtX2lkbGVfY29uZmlnKENQTV9JRExFX1dBSVQpOworCQlwcGNfbWQucG93ZXJfc2F2ZSA9ICZjcG1faWRsZTsKKwl9CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sY3BtIik7CisJaWYgKCFucCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkY3JfYmFzZSA9IGRjcl9yZXNvdXJjZV9zdGFydChucCwgMCk7CisJZGNyX2xlbiA9IGRjcl9yZXNvdXJjZV9sZW4obnAsIDApOworCisJaWYgKGRjcl9iYXNlID09IDAgfHwgZGNyX2xlbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BtOiBjb3VsZCBub3QgcGFyc2UgZGNyIHByb3BlcnR5IGZvciAlc1xuIiwKKwkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwljcG0uZGNyX2hvc3QgPSBkY3JfbWFwKG5wLCBkY3JfYmFzZSwgZGNyX2xlbik7CisKKwlpZiAoIURDUl9NQVBfT0soY3BtLmRjcl9ob3N0KSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwbTogZmFpbGVkIHRvIG1hcCBkY3IgcHJvcGVydHkgZm9yICVzXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbCA0eHggU29DcyB3aXRoIGEgQ1BNIGNvbnRyb2xsZXIgaGF2ZSBvbmUgb2YgdHdvCisJICogZGlmZmVyZW50IG9yZGVyIGZvciB0aGUgQ1BNIHJlZ2lzdGVycy4gU29tZSBoYXZlIHRoZQorCSAqIENQTSByZWdpc3RlcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoRVIsRlIsU1IpLiBUaGUKKwkgKiBvdGhlcnMgaGF2ZSB0aGVtIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKFNSLEVSLEZSKS4KKwkgKi8KKworCWlmIChjcG1fZ2V0X3VpbnRfcHJvcGVydHkobnAsICJlci1vZmZzZXQiKSA9PSAwKSB7CisJCWNwbS5kY3Jfb2Zmc2V0W0NQTV9FUl0gPSAwOworCQljcG0uZGNyX29mZnNldFtDUE1fRlJdID0gMTsKKwkJY3BtLmRjcl9vZmZzZXRbQ1BNX1NSXSA9IDI7CisJfSBlbHNlIHsKKwkJY3BtLmRjcl9vZmZzZXRbQ1BNX0VSXSA9IDE7CisJCWNwbS5kY3Jfb2Zmc2V0W0NQTV9GUl0gPSAyOworCQljcG0uZGNyX29mZnNldFtDUE1fU1JdID0gMDsKKwl9CisKKwkvKiBOb3cgbGV0J3Mgc2VlIHdoYXQgSVBzIHRvIHR1cm4gb2ZmIGZvciB0aGUgZm9sbG93aW5nIG1vZGVzICovCisKKwljcG0udW51c2VkID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAidW51c2VkLXVuaXRzIik7CisJY3BtLmlkbGVfZG96ZSA9IGNwbV9nZXRfdWludF9wcm9wZXJ0eShucCwgImlkbGUtZG96ZSIpOworCWNwbS5zdGFuZGJ5ID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAic3RhbmRieSIpOworCWNwbS5zdXNwZW5kID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAic3VzcGVuZCIpOworCisJLyogSWYgc29tZSBJUHMgYXJlIHVudXNlZCBsZXQncyB0dXJuIHRoZW0gb2ZmIG5vdyAqLworCisJaWYgKGNwbS51bnVzZWQpIHsKKwkJY3BtX3NldChDUE1fRVIsIGNwbS51bnVzZWQpOworCQljcG1fc2V0KENQTV9GUiwgY3BtLnVudXNlZCk7CisJfQorCisJLyogTm93IGxldCdzIGV4cG9ydCBpbnRlcmZhY2VzICovCisKKwlpZiAoIWNwbS5wb3dlcnNhdmVfb2ZmICYmIGNwbS5pZGxlX2RvemUpCisJCWNwbV9pZGxlX2NvbmZpZ19zeXNmcygpOworCisJaWYgKGNwbS5zdGFuZGJ5IHx8IGNwbS5zdXNwZW5kKQorCQlzdXNwZW5kX3NldF9vcHMoJmNwbV9zdXNwZW5kX29wcyk7CitvdXQ6CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIHJldDsKK30KKworbGF0ZV9pbml0Y2FsbChjcG1faW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNwbV9wb3dlcnNhdmVfb2ZmKGNoYXIgKmFyZykKK3sKKwljcG0ucG93ZXJzYXZlX29mZiA9IDE7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJwb3dlcnNhdmU9b2ZmIiwgY3BtX3Bvd2Vyc2F2ZV9vZmYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCBkNGQxNWFhLi5lZTA1NjgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGFzbS90c2kxMDguaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTgzLDggKzg0LDggQEAKIAkJbWVtc2V0KCZ0c2lfZXRoX2RhdGEsIDAsIHNpemVvZih0c2lfZXRoX2RhdGEpKTsKIAogCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7Ci0JCURCRygiJXM6IG5hbWU6c3RhcnQtPmVuZCA9ICVzOjB4JWx4LT4gMHglbHhcbiIsCi0JCQlfX2Z1bmNfXyxyWzBdLm5hbWUsIHJbMF0uc3RhcnQsIHJbMF0uZW5kKTsKKwkJREJHKCIlczogbmFtZTpzdGFydC0+ZW5kID0gJXM6JXBSXG4iLAorCQkgICAgX19mdW5jX18sIHJbMF0ubmFtZSwgJnJbMF0pOwogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKQEAgLTkyLDggKzkzLDggQEAKIAkJclsxXS5zdGFydCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAkJclsxXS5lbmQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJCXJbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJREJHKCIlczogbmFtZTpzdGFydC0+ZW5kID0gJXM6MHglbHgtPiAweCVseFxuIiwKLQkJCV9fZnVuY19fLHJbMV0ubmFtZSwgclsxXS5zdGFydCwgclsxXS5lbmQpOworCQlEQkcoIiVzOiBuYW1lOnN0YXJ0LT5lbmQgPSAlczolcFJcbiIsCisJCQlfX2Z1bmNfXywgclsxXS5uYW1lLCAmclsxXSk7CiAKIAkJdHNpX2V0aF9kZXYgPQogCQkgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidHNpLWV0aGVybmV0IiwgaSsrLCAmclswXSwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9kZWZjb25maWcgYi9hcmNoL3MzOTAvZGVmY29uZmlnCmluZGV4IGQ3OTY5NzEuLjI5YzgyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwpAQCAtNSwxMCArNSwyMSBAQAogQ09ORklHX1JDVV9UUkFDRT15CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0NHUk9VUFM9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKK0NPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15CitDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUj15CitDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQPXkKK0NPTkZJR19DR1JPVVBfU0NIRUQ9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKK0NPTkZJR19CTEtfQ0dST1VQPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfUEVSRl9FVkVOVFM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQj15CitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT15CiBDT05GSUdfS1BST0JFUz15CiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CkBAIC0xOSw3ICszMCw5IEBACiBDT05GSUdfUFJFRU1QVD15CiBDT05GSUdfTUVNT1JZX0hPVFBMVUc9eQogQ09ORklHX01FTU9SWV9IT1RSRU1PVkU9eQorQ09ORklHX0tTTT15CiBDT05GSUdfQklORk1UX01JU0M9bQorQ09ORklHX0NNTT1tCiBDT05GSUdfSFpfMTAwPXkKIENPTkZJR19LRVhFQz15CiBDT05GSUdfUE09eQpAQCAtMTA1LDYgKzExOCw3IEBACiBDT05GSUdfREVCVUdfTk9USUZJRVJTPXkKICMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAogQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1Q9eQorQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVT15CiBDT05GSUdfQ1BVX05PVElGSUVSX0VSUk9SX0lOSkVDVD1tCiBDT05GSUdfTEFURU5DWVRPUD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGE4NzVjMmYuLmRhMzU5Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jb21wYXQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTE2OSw3ICsxNjksNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpc19jb21wYXRfdGFzayh2b2lkKQogewotCXJldHVybiB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCk7CisJcmV0dXJuIGlzXzMyYml0X3Rhc2soKTsKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAzNTRkNDI2Li4xMGMwMjljIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xNjEsNyArMTYxLDkgQEAKICAgIHVzZSBvZiB0aGlzIGlzIHRvIGludm9rZSAiLi9sZC5zbyBzb21lcHJvZyIgdG8gdGVzdCBvdXQgYSBuZXcgdmVyc2lvbiBvZgogICAgdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KICAgIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4gICovCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkJKFNUQUNLX1RPUCAvIDMgKiAyKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyByYW5kb21pemVfZXRfZHluKHVuc2lnbmVkIGxvbmcgYmFzZSk7CisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkJKHJhbmRvbWl6ZV9ldF9keW4oU1RBQ0tfVE9QIC8gMyAqIDIpKQogCiAvKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CiAgICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBDUFUgc3VwcG9ydHMuICovCkBAIC0yMDYsNiArMjA4LDggQEAKIAljdXJyZW50LT5tbS0+Y29udGV4dC5ub2V4ZWMgPT0gMDsJCVwKIH0pCiAKKyNkZWZpbmUgU1RBQ0tfUk5EX01BU0sJMHg3ZmZVTAorCiAjZGVmaW5lIEFSQ0hfRExJTkZPCQkJCQkJCSAgICBcCiBkbyB7CQkJCQkJCQkJICAgIFwKIAlpZiAodmRzb19lbmFibGVkKQkJCQkJCSAgICBcCkBAIC0yMTgsNCArMjIyLDcgQEAKICNkZWZpbmUgQVJDSF9IQVNfU0VUVVBfQURESVRJT05BTF9QQUdFUyAxCiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKiwgaW50KTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNkZWZpbmUgYXJjaF9yYW5kb21pemVfYnJrIGFyY2hfcmFuZG9taXplX2JyaworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCA2NzEwYjBlLi44ZjhkNzU5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC00NDksNyArNDQ5LDcgQEAKIGV4dGVybiB2b2lkICgqX21hY2hpbmVfaGFsdCkodm9pZCk7CiBleHRlcm4gdm9pZCAoKl9tYWNoaW5lX3Bvd2VyX29mZikodm9pZCk7CiAKLSNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRwcm90KHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggZWJjNzcwOTEuLmFkMTM4MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMTgsNiArMTE4LDEyIEBACiAjZGVmaW5lIF9USUZfU0lOR0xFX1NURVAJKDE8PFRJRl9GUkVFWkUpCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKIAorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBpc18zMmJpdF90YXNrKCkJCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkpCisjZWxzZQorI2RlZmluZSBpc18zMmJpdF90YXNrKCkJCSgxKQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNkZWZpbmUgUFJFRU1QVF9BQ1RJVkUJCTB4NDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2YmE0MjIyLi5hODk1ZTY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzAsOSArMzAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxhc20vY29tcGF0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMzMyLDMgKzMzNCwzOSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKwordW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApCit7CisJaWYgKCEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX05PX1JBTkRPTUlaRSkgJiYgcmFuZG9taXplX3ZhX3NwYWNlKQorCQlzcCAtPSBnZXRfcmFuZG9tX2ludCgpICYgflBBR0VfTUFTSzsKKwlyZXR1cm4gc3AgJiB+MHhmOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYnJrX3JuZCh2b2lkKQoreworCS8qIDhNQiBmb3IgMzJiaXQsIDFHQiBmb3IgNjRiaXQgKi8KKwlpZiAoaXNfMzJiaXRfdGFzaygpKQorCQlyZXR1cm4gKGdldF9yYW5kb21faW50KCkgJiAweDdmZlVMKSA8PCBQQUdFX1NISUZUOworCWVsc2UKKwkJcmV0dXJuIChnZXRfcmFuZG9tX2ludCgpICYgMHgzZmZmZlVMKSA8PCBQQUdFX1NISUZUOworfQorCit1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IFBBR0VfQUxJR04obW0tPmJyayArIGJya19ybmQoKSk7CisKKwlpZiAocmV0IDwgbW0tPmJyaykKKwkJcmV0dXJuIG1tLT5icms7CisJcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgbG9uZyByYW5kb21pemVfZXRfZHluKHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldCA9IFBBR0VfQUxJR04oYmFzZSArIGJya19ybmQoKSk7CisKKwlpZiAoIShjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkpCisJCXJldHVybiBiYXNlOworCWlmIChyZXQgPCBiYXNlKQorCQlyZXR1cm4gYmFzZTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3MzOTAva2VybmVsL3Zkc28uYwppbmRleCBlMzE1MGRkLi5mNDM4ZDc0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Zkc28uYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAJaWYgKCF1c2VzX2ludGVycCkKIAkJcmV0dXJuIDA7CiAKLQl2ZHNvX2Jhc2UgPSBtbS0+bW1hcF9iYXNlOwogI2lmZGVmIENPTkZJR182NEJJVAogCXZkc29fcGFnZWxpc3QgPSB2ZHNvNjRfcGFnZWxpc3Q7CiAJdmRzb19wYWdlcyA9IHZkc282NF9wYWdlczsKQEAgLTIzMyw4ICsyMzIsNyBAQAogCSAqIGZhaWwgYW5kIGVuZCB1cCBwdXR0aW5nIGl0IGVsc2V3aGVyZS4KIAkgKi8KIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCXZkc29fYmFzZSA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZkc29fYmFzZSwKLQkJCQkgICAgICB2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQsIDAsIDApOworCXZkc29fYmFzZSA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIDAsIHZkc29fcGFnZXMgPDwgUEFHRV9TSElGVCwgMCwgMCk7CiAJaWYgKElTX0VSUl9WQUxVRSh2ZHNvX2Jhc2UpKSB7CiAJCXJjID0gdmRzb19iYXNlOwogCQlnb3RvIG91dF91cDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCA5ODVkODI1Li5iYWRlNTMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC0xNjQsMjQgKzE2NCwxOCBAQAogCXJldHVybiByOwogfQogCi1zdHJ1Y3Qga3ZtICprdm1fYXJjaF9jcmVhdGVfdm0odm9pZCkKK2ludCBrdm1fYXJjaF9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlzdHJ1Y3Qga3ZtICprdm07CiAJaW50IHJjOwogCWNoYXIgZGVidWdfbmFtZVsxNl07CiAKIAlyYyA9IHMzOTBfZW5hYmxlX3NpZSgpOwogCWlmIChyYykKLQkJZ290byBvdXRfbm9rdm07Ci0KLQlyYyA9IC1FTk9NRU07Ci0Ja3ZtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bSksIEdGUF9LRVJORUwpOwotCWlmICgha3ZtKQotCQlnb3RvIG91dF9ub2t2bTsKKwkJZ290byBvdXRfZXJyOwogCiAJa3ZtLT5hcmNoLnNjYSA9IChzdHJ1Y3Qgc2NhX2Jsb2NrICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWt2bS0+YXJjaC5zY2EpCi0JCWdvdG8gb3V0X25vc2NhOworCQlnb3RvIG91dF9lcnI7CiAKIAlzcHJpbnRmKGRlYnVnX25hbWUsICJrdm0tJXUiLCBjdXJyZW50LT5waWQpOwogCkBAIC0xOTUsMTMgKzE4OSwxMSBAQAogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoa3ZtLT5hcmNoLmRiZiwgJmRlYnVnX3NwcmludGZfdmlldyk7CiAJVk1fRVZFTlQoa3ZtLCAzLCAiJXMiLCAidm0gY3JlYXRlZCIpOwogCi0JcmV0dXJuIGt2bTsKKwlyZXR1cm4gMDsKIG91dF9ub2RiZjoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKGt2bS0+YXJjaC5zY2EpKTsKLW91dF9ub3NjYToKLQlrZnJlZShrdm0pOwotb3V0X25va3ZtOgotCXJldHVybiBFUlJfUFRSKHJjKTsKK291dF9lcnI6CisJcmV0dXJuIHJjOwogfQogCiB2b2lkIGt2bV9hcmNoX3ZjcHVfZGVzdHJveShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0yNDAsMTEgKzIzMiw4IEBACiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKQogewogCWt2bV9mcmVlX3ZjcHVzKGt2bSk7Ci0Ja3ZtX2ZyZWVfcGh5c21lbShrdm0pOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykoa3ZtLT5hcmNoLnNjYSkpOwogCWRlYnVnX3VucmVnaXN0ZXIoa3ZtLT5hcmNoLmRiZik7Ci0JY2xlYW51cF9zcmN1X3N0cnVjdCgma3ZtLT5zcmN1KTsKLQlrZnJlZShrdm0pOwogfQogCiAvKiBTZWN0aW9uOiB2Y3B1IHJlbGF0ZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tbWFwLmMgYi9hcmNoL3MzOTAvbW0vbW1hcC5jCmluZGV4IDg2OWVmYmEuLmM5YTlmN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tbWFwLmMKKysrIGIvYXJjaC9zMzkwL21tL21tYXAuYwpAQCAtMjcsMTcgKzI3LDQ0IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdC5oPgogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGFja19tYXhyYW5kb21fc2l6ZSh2b2lkKQoreworCWlmICghKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSkKKwkJcmV0dXJuIDA7CisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpCisJCXJldHVybiAwOworCXJldHVybiBTVEFDS19STkRfTUFTSyA8PCBQQUdFX1NISUZUOworfQorCiAvKgogICogVG9wIG9mIG1tYXAgYXJlYSAoanVzdCBiZWxvdyB0aGUgcHJvY2VzcyBzdGFjaykuCiAgKgotICogTGVhdmUgYW4gYXQgbGVhc3QgfjEyOCBNQiBob2xlLgorICogTGVhdmUgYXQgbGVhc3QgYSB+MzIgTUIgaG9sZS4KICAqLwotI2RlZmluZSBNSU5fR0FQICgxMjgqMTAyNCoxMDI0KQorI2RlZmluZSBNSU5fR0FQICgzMioxMDI0KjEwMjQpCiAjZGVmaW5lIE1BWF9HQVAgKFNUQUNLX1RPUC82KjUpCiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tYXBfaXNfbGVnYWN5KHZvaWQpCit7CisJaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9DT01QQVRfTEFZT1VUKQorCQlyZXR1cm4gMTsKKwlpZiAocmxpbWl0KFJMSU1JVF9TVEFDSykgPT0gUkxJTV9JTkZJTklUWSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX3JuZCh2b2lkKQoreworCWlmICghKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSkKKwkJcmV0dXJuIDA7CisJLyogOE1CIHJhbmRvbWl6YXRpb24gZm9yIG1tYXBfYmFzZSAqLworCXJldHVybiAoZ2V0X3JhbmRvbV9pbnQoKSAmIDB4N2ZmVUwpIDw8IFBBR0VfU0hJRlQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2Uodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGdhcCA9IHJsaW1pdChSTElNSVRfU1RBQ0spOwpAQCAtNDYsMjIgKzczLDggQEAKIAkJZ2FwID0gTUlOX0dBUDsKIAllbHNlIGlmIChnYXAgPiBNQVhfR0FQKQogCQlnYXAgPSBNQVhfR0FQOwotCi0JcmV0dXJuIFNUQUNLX1RPUCAtIChnYXAgJiBQQUdFX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtbWFwX2lzX2xlZ2FjeSh2b2lkKQotewotI2lmZGVmIENPTkZJR182NEJJVAotCS8qCi0JICogRm9yY2Ugc3RhbmRhcmQgYWxsb2NhdGlvbiBmb3IgNjQgYml0IHByb2dyYW1zLgotCSAqLwotCWlmICghaXNfY29tcGF0X3Rhc2soKSkKLQkJcmV0dXJuIDE7Ci0jZW5kaWYKLQlyZXR1cm4gc3lzY3RsX2xlZ2FjeV92YV9sYXlvdXQgfHwKLQkgICAgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9DT01QQVRfTEFZT1VUKSB8fAotCSAgICBybGltaXQoUkxJTUlUX1NUQUNLKSA9PSBSTElNX0lORklOSVRZOworCWdhcCAmPSBQQUdFX01BU0s7CisJcmV0dXJuIFNUQUNLX1RPUCAtIHN0YWNrX21heHJhbmRvbV9zaXplKCkgLSBtbWFwX3JuZCgpIC0gZ2FwOwogfQogCiAjaWZuZGVmIENPTkZJR182NEJJVApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvS2NvbmZpZyBiL2FyY2gvc2gvYm9hcmRzL0tjb25maWcKaW5kZXggMjAxOGM3ZS4uZDg5MzQxMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvS2NvbmZpZworKysgYi9hcmNoL3NoL2JvYXJkcy9LY29uZmlnCkBAIC0zLDYgKzMsOSBAQAogY29uZmlnIFNPTFVUSU9OX0VOR0lORQogCWJvb2wKIAorY29uZmlnIFNIX0FMUEhBX0JPQVJECisJYm9vbAorCiBjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCiAJYm9vbCAiU29sdXRpb25FbmdpbmUiCiAJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQpAQCAtMzIwLDYgKzMyMywyMSBAQAogCSAgQ29tcGFjdCBGbGFzaCBzb2NrZXQsIHR3byBzZXJpYWwgcG9ydHMgYW5kIFBDLTEwNCBidXMuCiAJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vc2gyMDAwLnNoLWxpbnV4Lm9yZz4uCiAKK2NvbmZpZyBTSF9BUFNINEEzQQorCWJvb2wgIkFQLVNINEEtM0EiCisJc2VsZWN0IFNIX0FMUEhBX0JPQVJECisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODUKKwloZWxwCisJICBTZWxlY3QgQVAtU0g0QS0zQSBpZiBjb25maWd1cmluZyBmb3IgYW4gQUxQSEFQUk9KRUNUIEFQLVNINEEtM0EuCisKK2NvbmZpZyBTSF9BUFNINEFEMEEKKwlib29sICJBUC1TSDRBRC0wQSIKKwlzZWxlY3QgU0hfQUxQSEFfQk9BUkQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3Nzg2CisJaGVscAorCSAgU2VsZWN0IEFQLVNINEFELTBBIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBBTFBIQVBST0pFQ1QgQVAtU0g0QUQtMEEuCisKIGVuZG1lbnUKIAogc291cmNlICJhcmNoL3NoL2JvYXJkcy9tYWNoLXIyZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9NYWtlZmlsZQppbmRleCBiZTdkMTFkLi45NzVhMGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9NYWtlZmlsZQpAQCAtMTMsMyArMTMsNSBAQAogb2JqLSQoQ09ORklHX1NIX1BPTEFSSVMpCSs9IGJvYXJkLXBvbGFyaXMubwogb2JqLSQoQ09ORklHX1NIX1RJVEFOKQkJKz0gYm9hcmQtdGl0YW4ubwogb2JqLSQoQ09ORklHX1NIX1NINzc1N0xDUikJKz0gYm9hcmQtc2g3NzU3bGNyLm8KK29iai0kKENPTkZJR19TSF9BUFNINEEzQSkJKz0gYm9hcmQtYXBzaDRhM2Eubworb2JqLSQoQ09ORklHX1NIX0FQU0g0QUQwQSkJKz0gYm9hcmQtYXBzaDRhZDBhLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YTNhLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmEyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQUxQSEFQUk9KRUNUIEFQLVNINEEtM0EgU3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQUxQSEFQUk9KRUNUIENvLixMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFlvc2hpaGlybyBTaGltb2RhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbm9yX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJsb2FkZXIiLAorCQkub2Zmc2V0CQk9IDB4MDAwMDAwMDAsCisJCS5zaXplCQk9IDUxMiAqIDEwMjQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJib290ZW52IiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplCQk9IDUxMiAqIDEwMjQsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJrZXJuZWwiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLnNpemUJCT0gNCAqIDEwMjQgKiAxMDI0LAorCX0sCisJeworCQkubmFtZQkJPSAiZGF0YSIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBub3JfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gNCwKKwkucGFydHMJCT0gbm9yX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShub3JfZmxhc2hfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG5vcl9mbGFzaF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0JPSB7CisJCS5zdGFydAk9IDB4MDAwMDAwMDAsCisJCS5lbmQJPSAweDAxMDAwMDAwIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugbm9yX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm5vcl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG5vcl9mbGFzaF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG5vcl9mbGFzaF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtc2M5MTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJCT0gInNtc2M5MTF4LW1lbW9yeSIsCisJCS5zdGFydAkJPSAweEE0MDAwMDAwLAorCQkuZW5kCQk9IDB4QTQwMDAwMDAgKyBTWl8yNTYgLSAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5uYW1lCQk9ICJzbXNjOTExeC1pcnEiLAorCQkuc3RhcnQJCT0gZXZ0MmlycSgweDIwMCksCisJCS5lbmQJCT0gZXZ0MmlycSgweDIwMCksCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbXNjOTExeF9wbGF0Zm9ybV9jb25maWcgc21zYzkxMXhfY29uZmlnID0geworCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0xPVywKKwkuaXJxX3R5cGUJPSBTTVNDOTExWF9JUlFfVFlQRV9PUEVOX0RSQUlOLAorCS5mbGFncwkJPSBTTVNDOTExWF9VU0VfMTZCSVQsCisJLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21zYzkxMXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbXNjOTExeCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzbXNjOTExeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtc2M5MTF4X3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzbXNjOTExeF9jb25maWcsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphcHNoNGEzYV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbm9yX2ZsYXNoX2RldmljZSwKKwkmc21zYzkxMXhfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXBzaDRhM2FfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhcHNoNGEzYV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKGFwc2g0YTNhX2RldmljZXMpKTsKK30KK2RldmljZV9pbml0Y2FsbChhcHNoNGEzYV9kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIGludCBhcHNoNGEzYV9jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OworCisJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKKwlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzAwMCk7CisJY2xrX3B1dChjbGspOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgYm9hcmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhcHNoNGEzYV9zZXR1cChjaGFyICoqY21kbGluZV9wKQoreworCXByaW50ayhLRVJOX0lORk8gIkFscGhhIFByb2plY3QgQVAtU0g0QS0zQSBzdXBwb3J0OlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhcHNoNGEzYV9pbml0X2lycSh2b2lkKQoreworCXBsYXRfaXJxX3NldHVwX3BpbnMoSVJRX01PREVfSVJRNzY1NCk7Cit9CisKKy8qIFJldHVybiB0aGUgYm9hcmQgc3BlY2lmaWMgYm9vdCBtb2RlIHBpbiBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IGFwc2g0YTNhX21vZGVfcGlucyh2b2lkKQoreworCWludCB2YWx1ZSA9IDA7CisKKwkvKiBUaGVzZSBhcmUgdGhlIGZhY3RvcnkgZGVmYXVsdCBzZXR0aW5ncyBvZiBTVzEgYW5kIFNXMi4KKwkgKiBJZiB5b3UgY2hhbmdlIHRoZXNlIGRpcCBzd2l0Y2hlcyB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KKwkgKiBhZGp1c3QgdGhlIHZhbHVlcyBiZWxvdyBhcyB3ZWxsLgorCSAqLworCXZhbHVlICY9IH5NT0RFX1BJTjA7ICAvKiBDbG9jayBNb2RlIDE2ICovCisJdmFsdWUgJj0gfk1PREVfUElOMTsKKwl2YWx1ZSAmPSB+TU9ERV9QSU4yOworCXZhbHVlICY9IH5NT0RFX1BJTjM7CisJdmFsdWUgfD0gIE1PREVfUElONDsKKwl2YWx1ZSAmPSB+TU9ERV9QSU41OyAgLyogMTYtYml0IEFyZWEwIGJ1cyB3aWR0aCAqLworCXZhbHVlIHw9ICBNT0RFX1BJTjY7ICAvKiBBcmVhIDAgU1JBTSBpbnRlcmZhY2UgKi8KKwl2YWx1ZSB8PSAgTU9ERV9QSU43OworCXZhbHVlIHw9ICBNT0RFX1BJTjg7ICAvKiBMaXR0bGUgRW5kaWFuICovCisJdmFsdWUgfD0gIE1PREVfUElOOTsgIC8qIE1hc3RlciBNb2RlICovCisJdmFsdWUgfD0gIE1PREVfUElOMTA7IC8qIENyeXN0YWwgcmVzb25hdG9yICovCisJdmFsdWUgfD0gIE1PREVfUElOMTE7IC8qIERpc3BsYXkgVW5pdCAqLworCXZhbHVlIHw9ICBNT0RFX1BJTjEyOworCXZhbHVlICY9IH5NT0RFX1BJTjEzOyAvKiAyOS1iaXQgYWRkcmVzcyBtb2RlICovCisJdmFsdWUgfD0gIE1PREVfUElOMTQ7IC8qIE5vIFBMTCBzdGVwLXVwICovCisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBUaGUgTWFjaGluZSBWZWN0b3IKKyAqLworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9hcHNoNGEzYSBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiQVAtU0g0QS0zQSIsCisJLm12X3NldHVwCQk9IGFwc2g0YTNhX3NldHVwLAorCS5tdl9jbGtfaW5pdAkJPSBhcHNoNGEzYV9jbGtfaW5pdCwKKwkubXZfaW5pdF9pcnEJCT0gYXBzaDRhM2FfaW5pdF9pcnEsCisJLm12X21vZGVfcGlucwkJPSBhcHNoNGEzYV9tb2RlX3BpbnMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJkMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBBTFBIQVBST0pFQ1QgQVAtU0g0QUQtMEEgU3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQUxQSEFQUk9KRUNUIENvLixMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgIE1hdHQgRmxlbWluZworICogQ29weXJpZ2h0IChDKSAyMDEwICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQkJPSAic21zYzkxMXgtbWVtb3J5IiwKKwkJLnN0YXJ0CQk9IDB4QTQwMDAwMDAsCisJCS5lbmQJCT0gMHhBNDAwMDAwMCArIFNaXzI1NiAtIDEsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLm5hbWUJCT0gInNtc2M5MTF4LWlycSIsCisJCS5zdGFydAkJPSBldnQyaXJxKDB4MjAwKSwKKwkJLmVuZAkJPSBldnQyaXJxKDB4MjAwKSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyBzbXNjOTExeF9jb25maWcgPSB7CisJLmlycV9wb2xhcml0eQk9IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfTE9XLAorCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX09QRU5fRFJBSU4sCisJLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8xNkJJVCwKKwkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbXNjOTExeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtc2M5MTF4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtc2M5MTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc21zYzkxMXhfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNtc2M5MTF4X2NvbmZpZywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFwc2g0YWQwYV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21zYzkxMXhfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXBzaDRhZDBhX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoYXBzaDRhZDBhX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoYXBzaDRhZDBhX2RldmljZXMpKTsKK30KK2RldmljZV9pbml0Y2FsbChhcHNoNGFkMGFfZGV2aWNlc19zZXR1cCk7CisKK3N0YXRpYyBpbnQgYXBzaDRhZDBhX21vZGVfcGlucyh2b2lkKQoreworCWludCB2YWx1ZSA9IDA7CisKKwkvKiBUaGVzZSBhcmUgdGhlIGZhY3RvcnkgZGVmYXVsdCBzZXR0aW5ncyBvZiBTVzEgYW5kIFNXMi4KKwkgKiBJZiB5b3UgY2hhbmdlIHRoZXNlIGRpcCBzd2l0Y2hlcyB0aGVuIHlvdSB3aWxsIG5lZWQgdG8KKwkgKiBhZGp1c3QgdGhlIHZhbHVlcyBiZWxvdyBhcyB3ZWxsLgorCSAqLworCXZhbHVlIHw9ICBNT0RFX1BJTjA7ICAvKiBDbG9jayBNb2RlIDMgKi8KKwl2YWx1ZSB8PSAgTU9ERV9QSU4xOworCXZhbHVlICY9IH5NT0RFX1BJTjI7CisJdmFsdWUgJj0gfk1PREVfUElOMzsKKwl2YWx1ZSAmPSB+TU9ERV9QSU40OyAgLyogMTYtYml0IEFyZWEwIGJ1cyB3aWR0aCAgKi8KKwl2YWx1ZSB8PSAgTU9ERV9QSU41OworCXZhbHVlIHw9ICBNT0RFX1BJTjY7CisJdmFsdWUgfD0gIE1PREVfUElONzsgIC8qIE5vcm1hbCBtb2RlICovCisJdmFsdWUgfD0gIE1PREVfUElOODsgIC8qIExpdHRsZSBFbmRpYW4gKi8KKwl2YWx1ZSB8PSAgTU9ERV9QSU45OyAgLyogQ3J5c3RhbCByZXNvbmF0b3IgKi8KKwl2YWx1ZSAmPSB+TU9ERV9QSU4xMDsgLyogMjktYml0IGFkZHJlc3MgbW9kZSAqLworCXZhbHVlICY9IH5NT0RFX1BJTjExOyAvKiBQQ0ktRSBSb290IHBvcnQgKi8KKwl2YWx1ZSAmPSB+TU9ERV9QSU4xMjsgLyogNCBsYW5lICsgMSBsYW5lICovCisJdmFsdWUgfD0gIE1PREVfUElOMTM7IC8qIEFVRCBFbmFibGUgKi8KKwl2YWx1ZSAmPSB+TU9ERV9QSU4xNDsgLyogTm9ybWFsIE9wZXJhdGlvbiAqLworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IGFwc2g0YWQwYV9jbGtfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OworCisJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKKwlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzAwMCk7CisJY2xrX3B1dChjbGspOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgYm9hcmQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhcHNoNGFkMGFfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKK3sKKwlwcl9pbmZvKCJBbHBoYSBQcm9qZWN0IEFQLVNINEFELTBBIHN1cHBvcnQ6XG4iKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFwc2g0YWQwYV9pbml0X2lycSh2b2lkKQoreworCXBsYXRfaXJxX3NldHVwX3BpbnMoSVJRX01PREVfSVJRMzIxMCk7Cit9CisKKy8qCisgKiBUaGUgTWFjaGluZSBWZWN0b3IKKyAqLworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9hcHNoNGFkMGEgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIkFQLVNINEFELTBBIiwKKwkubXZfc2V0dXAJCT0gYXBzaDRhZDBhX3NldHVwLAorCS5tdl9tb2RlX3BpbnMJCT0gYXBzaDRhZDBhX21vZGVfcGlucywKKwkubXZfY2xrX2luaXQJCT0gYXBzaDRhZDBhX2Nsa19pbml0LAorCS5tdl9pbml0X2lycQkJPSBhcHNoNGFkMGFfaW5pdF9pcnEsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtZWRvc2s3NzA1LmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3MDUuYwppbmRleCA0Y2IzYmI3Li41NDFkOGEyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3MDUuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3MDUuYwpAQCAtNjYsNyArNjYsNyBAQAogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhlZG9zazc3MDVfZGV2aWNlcywKIAkJCQkgICAgQVJSQVlfU0laRShlZG9zazc3MDVfZGV2aWNlcykpOwogfQotX19pbml0Y2FsbChpbml0X2Vkb3NrNzcwNV9kZXZpY2VzKTsKK2RldmljZV9pbml0Y2FsbChpbml0X2Vkb3NrNzcwNV9kZXZpY2VzKTsKIAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtZWRvc2s3NzYwLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3NjAuYwppbmRleCAzNWRjMDk5Li5mNDdhYzgyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3NjAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1lZG9zazc3NjAuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKGVkb3NrNzc2MF9kZXZpY2VzLAogCQkJCSAgICBBUlJBWV9TSVpFKGVkb3NrNzc2MF9kZXZpY2VzKSk7CiB9Ci1fX2luaXRjYWxsKGluaXRfZWRvc2s3NzYwX2RldmljZXMpOworZGV2aWNlX2luaXRjYWxsKGluaXRfZWRvc2s3NzYwX2RldmljZXMpOwogCiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc4NWxjci5jCmluZGV4IGZlN2U2ODYuLmVlNjVmZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc4NWxjci5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc4NWxjci5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3Nzg1bGNyX2RldmljZXMsCiAJCQkJICAgIEFSUkFZX1NJWkUoc2g3Nzg1bGNyX2RldmljZXMpKTsKIH0KLV9faW5pdGNhbGwoc2g3Nzg1bGNyX2RldmljZXNfc2V0dXApOworZGV2aWNlX2luaXRjYWxsKHNoNzc4NWxjcl9kZXZpY2VzX3NldHVwKTsKIAogLyogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZyAqLwogdm9pZCBfX2luaXQgaW5pdF9zaDc3ODVsY3JfSVJRKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggMDdlYTkwOC4uM2U1ZmMzYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zaF9tb2JpbGVfc2RoaS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvc2hfZmxjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNDMwLDExICs0MzIsMTggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkwX2NuM19kYXRhID0geworCS50bWlvX2NhcHMgICAgICA9IE1NQ19DQVBfU0RJT19JUlEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMF9jbjNfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzaF9tb2JpbGVfc2RoaSIsCiAJLmlkICAgICAgICAgICAgID0gMCwgLyogInNkaGkwIiBjbG9jayAqLwogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzZGhpMF9jbjNfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzZGhpMF9jbjNfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNkaGkwX2NuM19kYXRhLAorCX0sCiAJLmFyY2hkYXRhID0gewogCQkuaHdibGtfaWQgPSBIV0JMS19TREhJMCwKIAl9LApAQCAtNDUzLDExICs0NjIsMTggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNkaGkxX2NuN19kYXRhID0geworCS50bWlvX2NhcHMgICAgICA9IE1NQ19DQVBfU0RJT19JUlEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMV9jbjdfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzaF9tb2JpbGVfc2RoaSIsCiAJLmlkICAgICAgICAgICAgID0gMSwgLyogInNkaGkxIiBjbG9jayAqLwogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzZGhpMV9jbjdfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBzZGhpMV9jbjdfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNkaGkxX2NuN19kYXRhLAorCX0sCiAJLmFyY2hkYXRhID0gewogCQkuaHdibGtfaWQgPSBIV0JMS19TREhJMSwKIAl9LApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL3NldHVwLmMKaW5kZXggN2U4MjE2YS4uZTg5ZThlMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9zZXR1cC5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAogCXJldHVybiAwOwogfQotX19pbml0Y2FsbChzbXNjX3N1cGVyaW9fc2V0dXApOworZGV2aWNlX2luaXRjYWxsKHNtc2Nfc3VwZXJpb19zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmNheW1hbl9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IGxlbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZWNvdmVjMjQvc2V0dXAuYwppbmRleCBmNDhjNDkyLi4zM2I2NjI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWVjb3ZlYzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1lY292ZWMyNC9zZXR1cC5jCkBAIC00NzMsNiArNDczLDcgQEAKIAkuZG1hX3NsYXZlX3R4CT0gU0hETUFfU0xBVkVfU0RISTBfVFgsCiAJLmRtYV9zbGF2ZV9yeAk9IFNIRE1BX1NMQVZFX1NESEkwX1JYLAogCS5zZXRfcHdyCT0gc2RoaTBfc2V0X3B3ciwKKwkudG1pb19jYXBzICAgICAgPSBNTUNfQ0FQX1NESU9fSVJRIHwgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RoaTBfcmVzb3VyY2VzW10gPSB7CkBAIC01MTEsNiArNTEyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzZGhpMV9pbmZvID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMV9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTFfUlgsCisJLnRtaW9fY2FwcyAgICAgID0gTU1DX0NBUF9TRElPX0lSUSB8IE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQsCiAJLnNldF9wd3IJPSBzZGhpMV9zZXRfcHdyLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1ocDZ4eC9wbS5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1ocDZ4eC9wbS5jCmluZGV4IDQ0OTlhMzcuLmFkYzliNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtaHA2eHgvcG0uYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhwNnh4L3BtLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGhwNngwX3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgaHA2eDBfcG1fb3BzID0gewogCS5lbnRlcgkJPSBocDZ4MF9wbV9lbnRlciwKIAkudmFsaWQJCT0gc3VzcGVuZF92YWxpZF9vbmx5X21lbSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWtmcjJyMDkvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9zZXR1cC5jCmluZGV4IDliNjBlYWEuLjc1MDRkYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gta2ZyMnIwOS9zZXR1cC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NoX21vYmlsZV9zZGhpLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL29uZW5hbmQuaD4KQEAgLTM2Niw2ICszNjcsNyBAQAogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTBfUlgsCiAJLnRtaW9fZmxhZ3MJPSBUTUlPX01NQ19XUlBST1RFQ1RfRElTQUJMRSwKKwkudG1pb19jYXBzICAgICAgPSBNTUNfQ0FQX1NESU9fSVJRLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2ZyMnIwOV9zaF9zZGhpMF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svaXJxLmMKaW5kZXggZTc5NDEyYS4uYzAwYWNlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1sYW5kaXNrL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtbGFuZGlzay9pcnEuYwpAQCAtMSw5ICsxLDEwIEBACiAvKgotICogYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pcnEuYworICogYXJjaC9zaC9ib2FyZHMvbWFjaC1sYW5kaXNrL2lycS5jCiAgKgogICogSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgU3VwcG9ydAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IGtvZ2lpZGVuYQorICogQ29weXJpZ2h0IChDKSAyMDExIE5vYnVoaXJvIEl3YW1hdHN1CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxICBJYW4gZGEgU2lsdmEsIEplcmVteSBTaWVnZWwKICAqIEJhc2VkIGxhcmdlbHkgb24gaW9fc2UuYy4KQEAgLTEyLDQ0ICsxMyw1NCBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWFjaC1sYW5kaXNrL21hY2gvaW9kYXRhX2xhbmRpc2suaD4KIAotc3RhdGljIHZvaWQgZGlzYWJsZV9sYW5kaXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gMHhmZiBeICgweDAxIDw8IChkYXRhLT5pcnEgLSA1KSk7CitlbnVtIHsKKwlVTlVTRUQgPSAwLAogCi0JX19yYXdfd3JpdGViKF9fcmF3X3JlYWRiKFBBX0lNQVNLKSAmIG1hc2ssIFBBX0lNQVNLKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2xhbmRpc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlID0gKDB4MDEgPDwgKGRhdGEtPmlycSAtIDUpKTsKLQotCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihQQV9JTUFTSykgfCB2YWx1ZSwgUEFfSU1BU0spOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGxhbmRpc2tfaXJxX2NoaXAgX19yZWFkX21vc3RseSA9IHsKLQkubmFtZQkJPSAiTEFORElTSyIsCi0JLmlycV9tYXNrCT0gZGlzYWJsZV9sYW5kaXNrX2lycSwKLQkuaXJxX3VubWFzawk9IGVuYWJsZV9sYW5kaXNrX2lycSwKKwlQQ0lfSU5UQSwgLyogUENJIGludCBBICovCisJUENJX0lOVEIsIC8qIFBDSSBpbnQgQiAqLworCVBDSV9JTlRDLCAvKiBQQ0kgaW50IEMgKi8KKwlQQ0lfSU5URCwgLyogUENJIGludCBEICovCisJQVRBLAkgIC8qIEFUQSAqLworCUZBVEEsCSAgLyogQ0YgKi8KKwlQT1dFUiwJICAvKiBQb3dlciBzd3RpY2ggKi8KKwlCVVRUT04sCSAgLyogQnV0dG9uIHN3dGljaCAqLwogfTsKIAorLyogVmVjdG9ycyBmb3IgTEFORElTSyAqLworc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgdmVjdG9yc19sYW5kaXNrW10gX19pbml0ZGF0YSA9IHsKKwlJTlRDX0lSUShQQ0lfSU5UQSwgSVJRX1BDSUlOVEEpLAorCUlOVENfSVJRKFBDSV9JTlRCLCBJUlFfUENJSU5UQiksCisJSU5UQ19JUlEoUENJX0lOVEMsIElSUV9QQ0lJTlRDKSwKKwlJTlRDX0lSUShQQ0lfSU5URCwgSVJRX1BDSUlOVEQpLAorCUlOVENfSVJRKEFUQSwgSVJRX0FUQSksCisJSU5UQ19JUlEoRkFUQSwgSVJRX0ZBVEEpLAorCUlOVENfSVJRKFBPV0VSLCBJUlFfUE9XRVIpLAorCUlOVENfSVJRKEJVVFRPTiwgSVJRX0JVVFRPTiksCit9OworCisvKiBJUkxNU0sgbWFzayByZWdpc3RlciBsYXlvdXQgZm9yIExBTkRJU0sgKi8KK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBtYXNrX3JlZ2lzdGVyc19sYW5kaXNrW10gX19pbml0ZGF0YSA9IHsKKwl7IFBBX0lNQVNLLCAwLCA4LCAvKiBJUkxNU0sgKi8KKwkgIHsgIEJVVFRPTiwgUE9XRVIsIEZBVEEsIEFUQSwKKwkgICAgIFBDSV9JTlRELCBQQ0lfSU5UQywgUENJX0lOVEIsIFBDSV9JTlRBLAorCSAgfQorCX0sCit9OworCitzdGF0aWMgREVDTEFSRV9JTlRDX0RFU0MoaW50Y19kZXNjX2xhbmRpc2ssICJsYW5kaXNrIiwgdmVjdG9yc19sYW5kaXNrLCBOVUxMLAorCQkJbWFza19yZWdpc3RlcnNfbGFuZGlzaywgTlVMTCwgTlVMTCk7CiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCiB2b2lkIF9faW5pdCBpbml0X2xhbmRpc2tfSVJRKHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSA1OyBpIDwgMTQ7IGkrKykgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGksICZsYW5kaXNrX2lycV9jaGlwLAotCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJZW5hYmxlX2xhbmRpc2tfaXJxKGlycV9nZXRfaXJxX2RhdGEoaSkpOwotCX0KKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzY19sYW5kaXNrKTsKIAlfX3Jhd193cml0ZWIoMHgwMCwgUEFfUFdSSU5UX0NMUik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtbGFuZGlzay9zZXR1cC5jCmluZGV4IDUwMzM3YWNjLi45NDE4NmNmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWxhbmRpc2svc2V0dXAuYwpAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPG1hY2gtbGFuZGlzay9tYWNoL2lvZGF0YV9sYW5kaXNrLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXZvaWQgaW5pdF9sYW5kaXNrX0lSUSh2b2lkKTsKLQogc3RhdGljIHZvaWQgbGFuZGlza19wb3dlcl9vZmYodm9pZCkKIHsKICAgICAgICAgX19yYXdfd3JpdGViKDB4MDEsIFBBX1NIVVRET1dOKTsKQEAgLTgzLDcgKzgxLDcgQEAKIAkJCQkgICAgQVJSQVlfU0laRShsYW5kaXNrX2RldmljZXMpKTsKIH0KIAotX19pbml0Y2FsbChsYW5kaXNrX2RldmljZXNfc2V0dXApOworZGV2aWNlX2luaXRjYWxsKGxhbmRpc2tfZGV2aWNlc19zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBsYW5kaXNrX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKaW5kZXggYzhhY2ZlYy4uMDNhN2ZmZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NoX2tleXNjLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3NoX21vYmlsZV9zZGhpLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC00MTAsNiArNDExLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzaDc3MjRfc2RoaV9kYXRhID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTBfUlgsCisJLnRtaW9fY2FwcyAgICAgID0gTU1DX0NBUF9TRElPX0lSUSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkaGlfY245X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtcjJkL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXIyZC9zZXR1cC5jCmluZGV4IGI4NGRmNmEuLjRiOThhNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtcjJkL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1yMmQvc2V0dXAuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHJ0czc3NTFyMmRfZGV2aWNlcywKIAkJCQkgICAgQVJSQVlfU0laRShydHM3NzUxcjJkX2RldmljZXMpKTsKIH0KLV9faW5pdGNhbGwocnRzNzc1MXIyZF9kZXZpY2VzX3NldHVwKTsKK2RldmljZV9pbml0Y2FsbChydHM3NzUxcjJkX2RldmljZXNfc2V0dXApOwogCiBzdGF0aWMgdm9pZCBydHM3NzUxcjJkX3Bvd2VyX29mZih2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZGs3Nzg2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYwppbmRleCA3NWU0ZGRiLi4xNTIxYWE3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYwpAQCAtMTUsMTMgKzE1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CiAjaW5jbHVkZSA8bWFjaC9mcGdhLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vY2xrZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9zbXAtb3BzLmg+CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJcmV0dXJuIHNkazc3ODZfaTJjX3NldHVwKCk7CiB9Ci1fX2luaXRjYWxsKHNkazc3ODZfZGV2aWNlc19zZXR1cCk7CitkZXZpY2VfaW5pdGNhbGwoc2RrNzc4Nl9kZXZpY2VzX3NldHVwKTsKIAogc3RhdGljIGludCBzZGs3Nzg2X21vZGVfcGlucyh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83MjA2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzcyMDYvc2V0dXAuYwppbmRleCAzMzAzOWUwLi44YWI4MzMwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzcyMDYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzcyMDYvc2V0dXAuYwpAQCAtNzcsNyArNzcsNyBAQAogewogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzZTcyMDZfZGV2aWNlcywgQVJSQVlfU0laRShzZTcyMDZfZGV2aWNlcykpOwogfQotX19pbml0Y2FsbChzZTcyMDZfZGV2aWNlc19zZXR1cCk7CitkZXZpY2VfaW5pdGNhbGwoc2U3MjA2X2RldmljZXNfc2V0dXApOwogCiBzdGF0aWMgaW50IHNlNzIwNl9tb2RlX3BpbnModm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKaW5kZXggNTI3YTBjZC4uNTI3Njc5MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc2hfbW9iaWxlX3NkaGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KQEAgLTMxOCw2ICszMTksMTAgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZnNpX2FrNDY0Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2ZzaV9hX2FrNDY0MiIsCit9OworCiAvKiBLRVlTQyBpbiBTb0MgKE5lZWRzIFNXMzMtMiBzZXQgdG8gT04pICovCiBzdGF0aWMgc3RydWN0IHNoX2tleXNjX2luZm8ga2V5c2NfaW5mbyA9IHsKIAkubW9kZSA9IFNIX0tFWVNDX01PREVfMSwKQEAgLTQ2Nyw2ICs0NzIsNyBAQAogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfc2RoaV9pbmZvIHNoNzcyNF9zZGhpMF9kYXRhID0gewogCS5kbWFfc2xhdmVfdHgJPSBTSERNQV9TTEFWRV9TREhJMF9UWCwKIAkuZG1hX3NsYXZlX3J4CT0gU0hETUFfU0xBVkVfU0RISTBfUlgsCisJLnRtaW9fY2FwcyAgICAgID0gTU1DX0NBUF9TRElPX0lSUSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNkaGkwX2NuN19kZXZpY2UgPSB7CkBAIC00OTgsNiArNTA0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX3NkaGlfaW5mbyBzaDc3MjRfc2RoaTFfZGF0YSA9IHsKIAkuZG1hX3NsYXZlX3R4CT0gU0hETUFfU0xBVkVfU0RISTFfVFgsCiAJLmRtYV9zbGF2ZV9yeAk9IFNIRE1BX1NMQVZFX1NESEkxX1JYLAorCS50bWlvX2NhcHMgICAgICA9IE1NQ19DQVBfU0RJT19JUlEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZGhpMV9jbjhfZGV2aWNlID0gewpAQCAtNTkwLDYgKzU5Nyw3IEBACiAJJnNoNzcyNF91c2IwX2hvc3RfZGV2aWNlLAogCSZzaDc3MjRfdXNiMV9nYWRnZXRfZGV2aWNlLAogCSZmc2lfZGV2aWNlLAorCSZmc2lfYWs0NjQyX2RldmljZSwKIAkmc2RoaTBfY243X2RldmljZSwKIAkmc2RoaTFfY244X2RldmljZSwKIAkmaXJkYV9kZXZpY2UsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3NTEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9zZXR1cC5jCmluZGV4IDlmYmM1MWIuLjRlZDYwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9zZXR1cC5jCkBAIC00OCw3ICs0OCw3IEBACiB7CiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzc1MV9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzc1MV9kZXZpY2VzKSk7CiB9Ci1fX2luaXRjYWxsKHNlNzc1MV9kZXZpY2VzX3NldHVwKTsKK2RldmljZV9pbml0Y2FsbChzZTc3NTFfZGV2aWNlc19zZXR1cCk7CiAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9ydGMuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9ydGMuYwppbmRleCAxYjIwMDk5Li5mODNhYzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoMDMvcnRjLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDAzL3J0Yy5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAkJX19yYXdfd3JpdGViKHJlYWxfbWludXRlcyAlIDEwLCBSVENfTUlOMSk7CiAJCV9fcmF3X3dyaXRlYihyZWFsX21pbnV0ZXMgLyAxMCwgUlRDX01JTjEwKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCXByaW50a19vbmNlKEtFUk5fTk9USUNFCiAJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKIAkJICAgICAgIGNtb3NfbWludXRlcywgcmVhbF9taW51dGVzKTsKIAkJcmV0dmFsID0gLTE7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoMDMvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9zZXR1cC5jCmluZGV4IGFmNGEwYzAuLmQ0Zjc5YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9zZXR1cC5jCkBAIC05Niw3ICs5Niw3IEBACiAKIAlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2gwM19kZXZpY2VzLCBBUlJBWV9TSVpFKHNoMDNfZGV2aWNlcykpOwogfQotX19pbml0Y2FsbChzaDAzX2RldmljZXNfc2V0dXApOworZGV2aWNlX2luaXRjYWxsKHNoMDNfZGV2aWNlc19zZXR1cCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2gwMyBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiSW50ZXJmYWNlIChDVFAvUENJLVNIMDMpIiwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9yb21pbWFnZS9tbWNpZi1zaDc3MjQuYyBiL2FyY2gvc2gvYm9vdC9yb21pbWFnZS9tbWNpZi1zaDc3MjQuYwppbmRleCAxNDg2M2Q3Li5jODRlNzgzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3Qvcm9taW1hZ2UvbW1jaWYtc2g3NzI0LmMKKysrIGIvYXJjaC9zaC9ib290L3JvbWltYWdlL21tY2lmLXNoNzcyNC5jCkBAIC0yMSw5ICsyMSw2IEBACiAjZGVmaW5lIEhJWkNSQwkJMHhhNDA1MDE1YwogI2RlZmluZSBEUlZDUkEJCTB4YTQwNTAxOGEKIAotZW51bSB7IE1NQ0lGX1BST0dSRVNTX0VOVEVSLCBNTUNJRl9QUk9HUkVTU19JTklULAotICAgICAgIE1NQ0lGX1BST0dSRVNTX0xPQUQsIE1NQ0lGX1BST0dSRVNTX0RPTkUgfTsKLQogLyogU0g3NzI0IHNwZWNpZmljIE1NQ0lGIGxvYWRlcgogICoKICAqIGxvYWRzIHRoZSByb21JbWFnZSBmcm9tIGFuIE1NQyBjYXJkIHN0YXJ0aW5nIGZyb20gYmxvY2sgNTEyCkBAIC02Myw3ICs2MCw5IEBACiAJbW1jaWZfdXBkYXRlX3Byb2dyZXNzKE1NQ0lGX1BST0dSRVNTX0xPQUQpOwogCiAJLyogbG9hZCBrZXJuZWwgdmlhIE1NQ0lGIGludGVyZmFjZSAqLwotCXNoX21tY2lmX2Jvb3Rfc2x1cnAoTU1DSUZfQkFTRSwgYnVmLCBub19ieXRlcyk7CisJc2hfbW1jaWZfYm9vdF9kb19yZWFkKE1NQ0lGX0JBU0UsIDUxMiwKKwkgICAgICAgICAgICAgICAgICAgICAgKG5vX2J5dGVzICsgU0hfTU1DSUZfQkJTIC0gMSkgLyBTSF9NTUNJRl9CQlMsCisJCQkgICAgICBidWYpOwogCiAJLyogZGlzYWJsZSBjbG9jayB0byB0aGUgTU1DSUYgaGFyZHdhcmUgYmxvY2sgKi8KIAlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoTVNUUENSMikgfCAweDIwMDAwMDAwLCBNU1RQQ1IyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9hcHNoNGEzYV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvYXBzaDRhM2FfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjMyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3MvYXBzaDRhM2FfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTAyIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NT15CitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MEMwMDAwMDAKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CitDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKK0NPTkZJR19TSF9BUFNINEEzQT15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19LRVhFQz15CitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorQ09ORklHX01URD15CitDT05GSUdfTVREX0NPTkNBVD15CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTYzODQKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX1NNU0M5MTFYPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQorQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9NgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRkJfU0g3Nzg1RkI9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX05URlNfRlM9eQorQ09ORklHX05URlNfUlc9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19DSUZTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0idXRmOCIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX05MU19VVEY4PXkKKyMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvYXBzaDRhZDBhX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9hcHNoNGFkMGFfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWE1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3MvYXBzaDRhZDBhX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEzMyBAQAorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19SQ1VfVFJBQ0U9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfQ0dST1VQUz15CitDT05GSUdfQ0dST1VQX05TPXkKK0NPTkZJR19DR1JPVVBfRlJFRVpFUj15CitDT05GSUdfQ0dST1VQX0RFVklDRT15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorQ09ORklHX1JFU09VUkNFX0NPVU5URVJTPXkKK0NPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSPXkKK0NPTkZJR19CTEtfQ0dST1VQPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CitDT05GSUdfQ0ZRX0dST1VQX0lPU0NIRUQ9eQorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4Nj15CitDT05GSUdfTUVNT1JZX1NJWkU9MHgxMDAwMDAwMAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQj15CitDT05GSUdfTUVNT1JZX0hPVFBMVUc9eQorQ09ORklHX01FTU9SWV9IT1RSRU1PVkU9eQorQ09ORklHX0tTTT15CitDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKK0NPTkZJR19TSF9BUFNINEFEMEE9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFPW0KK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPW0KK0NPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQ9bQorQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkU9bQorQ09ORklHX1NIX0NQVV9GUkVRPXkKK0NPTkZJR19LRVhFQz15CitDT05GSUdfU0VDQ09NUD15CitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfQklORk1UX01JU0M9eQorQ09ORklHX1BNPXkKK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfUE1fVkVSQk9TRT15CitDT05GSUdfUE1fUlVOVElNRT15CitDT05GSUdfQ1BVX0lETEU9eQorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfQ0ZJPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAorQ09ORklHX1NDU0k9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKKyMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX01ESU9fQklUQkFORz15CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19TTVNDOTExWD15CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9NgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPXkKK0NPTkZJR19GQj15CitDT05GSUdfRkJfU0g3Nzg1RkI9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0ZPTlRTPXkKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CitDT05GSUdfVVNCX01PTj15CitDT05GSUdfVVNCX09IQ0lfSENEPXkKK0NPTkZJR19VU0JfU1RPUkFHRT15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19OVEZTX0ZTPXkKK0NPTkZJR19OVEZTX1JXPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19DSUZTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0idXRmOCIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX05MU19VVEY4PXkKKyMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19ERUJVR19TSElSUT15CitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CitDT05GSUdfREVCVUdfSU5GTz15CitDT05GSUdfREVCVUdfVk09eQorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfRFdBUkZfVU5XSU5ERVI9eQorIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzc1N2xjcl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzU3bGNyX2RlZmNvbmZpZwppbmRleCAyNzNmM2ZhLi41ZjdmNjY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzU3bGNyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzU3bGNyX2RlZmNvbmZpZwpAQCAtMzksMjEgKzM5LDE1IEBACiBDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX1JBTT15Ci0jIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX1BIWUxJQj15CiBDT05GSUdfVklURVNTRV9QSFk9eQotQ09ORklHX01ESU9fQklUQkFORz15CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQorQ09ORklHX1NIX0VUSD15CiAjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9QUzIgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCiBDT05GSUdfU0VSSUFMX1NIX1NDST15CiBDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0zCiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKQEAgLTYzLDcgKzU3LDYgQEAKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19FWFQyX0ZTPXkKIENPTkZJR19FWFQzX0ZTPXkKLUNPTkZJR19JTk9USUZZPXkKIENPTkZJR19JU085NjYwX0ZTPXkKIENPTkZJR19WRkFUX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKQEAgLTc2LDEwICs2OSw4IEBACiBDT05GSUdfTkxTX0NPREVQQUdFXzkzMj15CiBDT05GSUdfTkxTX0lTTzg4NTlfMT15CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jCmluZGV4IGJiMWE2YmIuLjk1YzZlMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxhbmRpc2suYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMKQEAgLTEsOSArMSwxMCBAQAogLyoKLSAqIGFyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxhbmRpc2suYworICogYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jCiAgKgogICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgYm9hcmQKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYga29naWlkZW5hCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9idWhpcm8gSXdhbWF0c3UKICAqCiAgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCkBAIC0xNSw2ICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCisjZGVmaW5lIFBDSU1DUl9NUlNFVF9PRkYJMHhCRkZGRkZGRgorI2RlZmluZSBQQ0lNQ1JfUkZTSF9PRkYJCTB4RkZGRkZGRkIKKwogaW50IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCS8qCkBAIC0yNiw5ICszMCwyOSBAQAogCWludCBpcnEgPSAoKHNsb3QgKyBwaW4gLSAxKSAmIDB4MykgKyA1OwogCiAJaWYgKChzbG90IHwgKHBpbiAtIDEpKSA+IDB4MykgewotCQlwcmludGsoIlBDSTogQmFkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWQgcGluICVjXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IEJhZCBJUlEgbWFwcGluZyByZXF1ZXN0IGZvciBzbG90ICVkIHBpbiAlY1xuIiwKIAkJICAgICAgIHNsb3QsIHBpbiAtIDEgKyAnQScpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiBpcnE7CiB9CisKK2ludCBwY2lfZml4dXBfcGNpYyhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4pCit7CisJdW5zaWduZWQgbG9uZyBiY3IxLCBtY3I7CisKKwliY3IxID0gX19yYXdfcmVhZGwoU0g3NzUxX0JDUjEpOworCWJjcjEgfD0gMHg0MDA4MDAwMDsJLyogRW5hYmxlIEJpdCAxOSBCUkVRRU4sIHNldCBQQ0lDIHRvIHNsYXZlICovCisJcGNpX3dyaXRlX3JlZyhjaGFuLCBiY3IxLCBTSDRfUENJQkNSMSk7CisKKwltY3IgPSBfX3Jhd19yZWFkbChTSDc3NTFfTUNSKTsKKwltY3IgPSAobWNyICYgUENJTUNSX01SU0VUX09GRikgJiBQQ0lNQ1JfUkZTSF9PRkY7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCBtY3IsIFNINF9QQ0lNQ1IpOworCisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDBjMDAwMDAwLCBTSDc3NTFfUENJQ09ORjUpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHhkMDAwMDAwMCwgU0g3NzUxX1BDSUNPTkY2KTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MGMwMDAwMDAsIFNINF9QQ0lMQVIwKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MDAwMDAwMDAsIFNINF9QQ0lMQVIxKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDg5YWIyYzUuLjI4YzVhYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTExLDExICsxMSw2IEBACiAgKgogICogV2hpbGUgcmVhZHtiLHcsbCxxfSBhbmQgd3JpdGV7Yix3LGwscX0gY29udGFpbiBtZW1vcnkgYmFycmllcnMKICAqIGF1dG9tYXRpY2FsbHksIHRoZXJlIGFyZSBhbHNvIF9fcmF3IHZlcnNpb25zLCB3aGljaCBkbyBub3QuCi0gKgotICogSGlzdG9yaWNhbGx5LCB3ZSBoYXZlIGFsc28gaGFkIGN0cmxfaW57Yix3LGwscX0vY3RybF9vdXR7Yix3LGwscX0gZm9yCi0gKiBTdXBlckggc3BlY2lmaWMgSS9PIChyYXcgSS9PIHRvIG9uLWNoaXAgQ1BVIHBlcmlwaGVyYWxzKS4gSW4gcHJhY3RpY2UKLSAqIHRoZXNlIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBfX3JhdyB2YXJpYW50cywgYW5kIGFzIHN1Y2gsIGFsbAotICogbmV3IGNvZGUgc2hvdWxkIGJlIHVzaW5nIHRoZSBfX3JhdyB2ZXJzaW9ucy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CkBAIC0yMzEsNTIgKzIyNiw2IEBACiAKICNlbmRpZgogCi0vKgotICogTGVnYWN5IFN1cGVySCBvbi1jaGlwIEkvTyBmdW5jdGlvbnMKLSAqCi0gKiBUaGVzZSBhcmUgYWxsIGRlcHJlY2F0ZWQsIGFsbCBuZXcgKGFuZCBlc3BlY2lhbGx5IGNyb3NzLXBsYXRmb3JtKSBjb2RlCi0gKiBzaG91bGQgYmUgdXNpbmcgdGhlIF9fcmF3X3h4eCgpIHJvdXRpbmVzIGRpcmVjdGx5LgotICovCi1zdGF0aWMgaW5saW5lIHU4IF9fZGVwcmVjYXRlZCBjdHJsX2luYih1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuIF9fcmF3X3JlYWRiKGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBfX2RlcHJlY2F0ZWQgY3RybF9pbncodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXJldHVybiBfX3Jhd19yZWFkdyhhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgX19kZXByZWNhdGVkIGN0cmxfaW5sKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gX19yYXdfcmVhZGwoYWRkcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IF9fZGVwcmVjYXRlZCBjdHJsX2lucSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuIF9fcmF3X3JlYWRxKGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZXByZWNhdGVkIGN0cmxfb3V0Yih1OCB2LCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JX19yYXdfd3JpdGViKHYsIGFkZHIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kZXByZWNhdGVkIGN0cmxfb3V0dyh1MTYgdiwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCV9fcmF3X3dyaXRldyh2LCBhZGRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fZGVwcmVjYXRlZCBjdHJsX291dGwodTMyIHYsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlfX3Jhd193cml0ZWwodiwgYWRkcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2RlcHJlY2F0ZWQgY3RybF9vdXRxKHU2NCB2LCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JX19yYXdfd3JpdGVxKHYsIGFkZHIpOwotfQotCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyogc3luY28gb24gU0gtNEEsIG90aGVyd2lzZSBhIG5vcCAqLwpAQCAtMzQxLDcgKzI5MCwxNSBAQAogCSAqIG1hcHBpbmcgbXVzdCBiZSBkb25lIGJ5IHRoZSBQTUIgb3IgYnkgdXNpbmcgcGFnZSB0YWJsZXMuCiAJICovCiAJaWYgKGxpa2VseShQWFNFRyhvZmZzZXQpIDwgUDNTRUcgJiYgUFhTRUcobGFzdF9hZGRyKSA8IFAzU0VHKSkgewotCQlpZiAodW5saWtlbHkocGdwcm90X3ZhbChwcm90KSAmIF9QQUdFX0NBQ0hBQkxFKSkKKwkJdTY0IGZsYWdzID0gcGdwcm90X3ZhbChwcm90KTsKKworCQkvKgorCQkgKiBBbnl0aGluZyB1c2luZyB0aGUgbGVnYWN5IFBURUEgc3BhY2UgYXR0cmlidXRlcyBuZWVkcworCQkgKiB0byBiZSBraWNrZWQgZG93biB0byBwYWdlIHRhYmxlIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGZsYWdzICYgX1BBR0VfUENDX01BU0spKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICh1bmxpa2VseShmbGFncyAmIF9QQUdFX0NBQ0hBQkxFKSkKIAkJCXJldHVybiAodm9pZCBfX2lvbWVtICopUDFTRUdBRERSKG9mZnNldCk7CiAKIAkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilQMlNFR0FERFIob2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbWFjaHZlYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tYWNodmVjLmgKaW5kZXggZGQ1ZDZlNS4uNTdjNWMzZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9tYWNodmVjLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9tYWNodmVjLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAlpbnQgKCptdl9tb2RlX3BpbnMpKHZvaWQpOwogCiAJdm9pZCAoKm12X21lbV9pbml0KSh2b2lkKTsKKwl2b2lkICgqbXZfbWVtX3Jlc2VydmUpKHZvaWQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBzaF9tdjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZV8zMi5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlXzMyLmgKaW5kZXggNDM1MjhlYy4uYjc5OWZlNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlXzMyLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlXzMyLmgKQEAgLTc2LDYgKzc2LDEwIEBACiAvKiBXcmFwcGVyIGZvciBleHRlbmRlZCBtb2RlIHBncHJvdCB0d2lkZGxpbmcgKi8KICNkZWZpbmUgX1BBR0VfRVhUKHgpCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykoeCkgPDwgMzIpCiAKKyNpZmRlZiBDT05GSUdfWDJUTEIKKyNkZWZpbmUgX1BBR0VfUENDX01BU0sJMHgwMDAwMDAwMAkvKiBObyBsZWdhY3kgUFRFQSBzdXBwb3J0ICovCisjZWxzZQorCiAvKiBzb2Z0d2FyZTogbW92ZXMgdG8gUFRFQS5UQyAoVGltaW5nIENvbnRyb2wpICovCiAjZGVmaW5lIF9QQUdFX1BDQ19BUkVBNQkweDAwMDAwMDAwCS8qIHVzZSBCU0MgcmVnaXN0ZXJzIGZvciBhcmVhNSAqLwogI2RlZmluZSBfUEFHRV9QQ0NfQVJFQTYJMHg4MDAwMDAwMAkvKiB1c2UgQlNDIHJlZ2lzdGVycyBmb3IgYXJlYTYgKi8KQEAgLTg5LDcgKzkzLDggQEAKICNkZWZpbmUgX1BBR0VfUENDX0FUUjgJMHg2MDAwMDAwMAkvKiBBdHRyaWJ1dGUgTWVtb3J5IHNwYWNlLCA4IGJpdCBidXMgKi8KICNkZWZpbmUgX1BBR0VfUENDX0FUUjE2CTB4NjAwMDAwMDEJLyogQXR0cmlidXRlIE1lbW9yeSBzcGFjZSwgNiBiaXQgYnVzICovCiAKLSNpZm5kZWYgQ09ORklHX1gyVExCCisjZGVmaW5lIF9QQUdFX1BDQ19NQVNLCTB4ZTAwMDAwMDEKKwogLyogY29weSB0aGUgcHRlYSBhdHRyaWJ1dGVzICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9wdGVhX2F0dHJpYnV0ZXModW5zaWduZWQgbG9uZyB4KQogewpAQCAtMjMxLDEzICsyMzYsNyBAQAogCQkJCQkgICBfUEFHRV9FWFRfS0VSTl9FWEVDKSkKIAogI2RlZmluZSBQQUdFX0tFUk5FTF9QQ0Moc2xvdCwgdHlwZSkgXAotCQkJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0RJUlRZIHwgXAotCQkJCSBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQgfCBcCi0JCQkJIF9QQUdFX0VYVChfUEFHRV9FWFRfS0VSTl9SRUFEIHwgXAotCQkJCQkgICBfUEFHRV9FWFRfS0VSTl9XUklURSB8IFwKLQkJCQkJICAgX1BBR0VfRVhUX0tFUk5fRVhFQykgXAotCQkJCSAoc2xvdCA/IF9QQUdFX1BDQ19BUkVBNSA6IF9QQUdFX1BDQ19BUkVBNikgfCBcCi0JCQkJICh0eXBlKSkKKwkJCV9fcGdwcm90KDApCiAKICNlbGlmIGRlZmluZWQoQ09ORklHX01NVSkgLyogU0gtWCBUTEIgKi8KICNkZWZpbmUgUEFHRV9OT05FCV9fcGdwcm90KF9QQUdFX1BST1ROT05FIHwgX1BBR0VfQ0FDSEFCTEUgfCBcCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBjOWU3Y2JjLi45YzdiZGZjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTM1LDcgKzM1LDcgQEAKIAlDUFVfU0g3NzIzLCBDUFVfU0g3NzI0LCBDUFVfU0g3NzU3LCBDUFVfU0hYMywKIAogCS8qIFNINEFMLURTUCB0eXBlcyAqLwotCUNQVV9TSDczNDMsIENQVV9TSDc3MjIsIENQVV9TSDczNjYsCisJQ1BVX1NINzM0MywgQ1BVX1NINzcyMiwgQ1BVX1NINzM2NiwgQ1BVX1NINzM3MiwKIAogCS8qIFNILTUgdHlwZXMgKi8KICAgICAgICAgQ1BVX1NINV8xMDEsIENQVV9TSDVfMTAzLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yXzMyLmgKaW5kZXggZTNjNzNjZC4uOTAwZjhkNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3JfMzIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvcl8zMi5oCkBAIC0xOTQsMTUgKzE5NCwxNyBAQAogI2RlZmluZSBLU1RLX0VTUCh0c2spICAodGFza19wdF9yZWdzKHRzayktPnJlZ3NbMTVdKQogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMkEpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCisKICNkZWZpbmUgUFJFRkVUQ0hfU1RSSURFCQlMMV9DQUNIRV9CWVRFUwogI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSAogI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSFcKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaCh2b2lkICp4KQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqeCkKIHsKIAlfX2J1aWx0aW5fcHJlZmV0Y2goeCwgMCwgMyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHcodm9pZCAqeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKIHsKIAlfX2J1aWx0aW5fcHJlZmV0Y2goeCwgMSwgMyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1sYW5kaXNrL21hY2gvaW9kYXRhX2xhbmRpc2suaCBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWxhbmRpc2svbWFjaC9pb2RhdGFfbGFuZGlzay5oCmluZGV4IDZmYjA0YWIuLmY0MzI3NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWxhbmRpc2svbWFjaC9pb2RhdGFfbGFuZGlzay5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWxhbmRpc2svbWFjaC9pb2RhdGFfbGFuZGlzay5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX0FTTV9TSF9JT0RBVEFfTEFORElTS19ICiAKIC8qCi0gKiBsaW51eC9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lvZGF0YV9sYW5kaXNrLmgKKyAqIGFyY2gvc2gvaW5jbHVkZS9tYWNoLWxhbmRpc2svbWFjaC9pb2RhdGFfbGFuZGlzay5oCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAwICBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KICAqCkBAIC0yNyw3ICsyNyw3IEBACiAKICNkZWZpbmUgSVJRX1BDSUlOVEEJNQkJLyogUENJIElOVEEgSVJRICovCiAjZGVmaW5lIElSUV9QQ0lJTlRCCTYJCS8qIFBDSSBJTlRCIElSUSAqLwotI2RlZmluZSBJUlFfUENJSU5EQwk3CQkvKiBQQ0kgSU5UQyBJUlEgKi8KKyNkZWZpbmUgSVJRX1BDSUlOVEMJNwkJLyogUENJIElOVEMgSVJRICovCiAjZGVmaW5lIElSUV9QQ0lJTlRECTgJCS8qIFBDSSBJTlREIElSUSAqLwogI2RlZmluZSBJUlFfQVRBCQk5CQkvKiBBVEEgSVJRICovCiAjZGVmaW5lIElSUV9GQVRBCTEwCQkvKiBGQVRBIElSUSAqLwpAQCAtMzUsNiArMzUsOCBAQAogI2RlZmluZSBJUlFfQlVUVE9OCTEyCQkvKiBVU0wtNVAgQnV0dG9uIElSUSAqLwogI2RlZmluZSBJUlFfRkFVTFQJMTMJCS8qIFVTTC01UCBGYXVsdCAgSVJRICovCiAKK3ZvaWQgaW5pdF9sYW5kaXNrX0lSUSh2b2lkKTsKKwogI2RlZmluZSBfX0lPX1BSRUZJWCBsYW5kaXNrCiAjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3Byb2MuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9wcm9jLmMKaW5kZXggZTgwYTkzNi4uZjQ3YmU4NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3Byb2MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvcHJvYy5jCkBAIC0yNSw3ICsyNSw3IEBACiAJW0NQVV9TSDVfMTAxXQk9ICJTSDUtMTAxIiwJW0NQVV9TSDVfMTAzXQk9ICJTSDUtMTAzIiwKIAlbQ1BVX01YR10JPSAiTVgtRyIsCVtDUFVfU0g3NzIzXQk9ICJTSDc3MjMiLAogCVtDUFVfU0g3MzY2XQk9ICJTSDczNjYiLAlbQ1BVX1NINzcyNF0JPSAiU0g3NzI0IiwKLQlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCisJW0NQVV9TSDczNzJdCT0gIlNINzM3MiIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCmluZGV4IGMzNjM4NTEuLjBmOGJlZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwpAQCAtNjIsNiArNjIsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGY4NDAwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgODgsIDg4LCA4OCwgODggfSwKIH07CkBAIC03Nyw2ICs3OSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4Zjg0MTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA5MiwgOTIsIDkyLCA5MiB9LAogfTsKQEAgLTkyLDYgKzk2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmODQyMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDk2LCA5NiwgOTYsIDk2IH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtbXhnLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1teGcuYwppbmRleCA2Yzk2ZWEwLi45NDliZjJiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1teGcuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1teGcuYwpAQCAtMjAxLDYgKzIwMSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmY4MDQwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAyMjAsIDIyMCwgMjIwLCAyMjAgfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDEuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMS5jCmluZGV4IGQwOGJmNGMuLjlkZjU1OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMS5jCkBAIC0xODAsNiArMTgwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlODAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDE4MCwgMTgwLCAxODAsIDE4MCB9CiB9OwpAQCAtMTk1LDYgKzE5Nyw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZTg4MDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAxODQsIDE4NCwgMTg0LCAxODQgfQogfTsKQEAgLTIxMCw2ICsyMTQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMTg4LCAxODgsIDE4OCwgMTg4IH0KIH07CkBAIC0yMjUsNiArMjMxLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmM19wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlOTgwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDE5MiwgMTkyLCAxOTIsIDE5MiB9CiB9OwpAQCAtMjQwLDYgKzI0OCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZWEwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAxOTYsIDE5NiwgMTk2LCAxOTYgfQogfTsKQEAgLTI1NSw2ICsyNjUsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmVhODAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMjAwLCAyMDAsIDIwMCwgMjAwIH0KIH07CkBAIC0yNzAsNiArMjgyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlYjAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDIwNCwgMjA0LCAyMDQsIDIwNCB9CiB9OwpAQCAtMjg1LDYgKzI5OSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjdfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZWI4MDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAyMDgsIDIwOCwgMjA4LCAyMDggfQogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKaW5kZXggODMyZjQwMS4uYTQzMTI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKQEAgLTE3Niw2ICsxNzYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU4MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDE5MiwgMTkyLCAxOTIsIDE5MiB9LAogfTsKQEAgLTE5MSw2ICsxOTMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU4ODAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDE5NiwgMTk2LCAxOTYsIDE5NiB9LAogfTsKQEAgLTIwNiw2ICsyMTAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDIwMCwgMjAwLCAyMDAsIDIwMCB9LAogfTsKQEAgLTIyMSw2ICsyMjcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5ODAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9ICB7IDIwNCwgMjA0LCAyMDQsIDIwNCB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKaW5kZXggZGM0N2IwNC4uNWQxNGY4NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKQEAgLTEzNiw2ICsxMzYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU4MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMjQwLCAyNDAsIDI0MCwgMjQwIH0sCiB9OwpAQCAtMTUxLDYgKzE1Myw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZTg4MDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAyNDQsIDI0NCwgMjQ0LCAyNDQgfSwKIH07CkBAIC0xNjYsNiArMTcwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZlOTAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDI0OCwgMjQ4LCAyNDgsIDI0OCB9LAogfTsKQEAgLTE4MSw2ICsxODcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmU5ODAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMjUyLCAyNTIsIDI1MiwgMjUyIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggYmFhZGQ3Zi4uY2QyZTcwMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC03MCw2ICs3MCw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQ0MTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9USUUgfCBTQ1NDUl9SSUUgIHwgU0NTQ1JfVEUgfAorCQkJICBTQ1NDUl9SRSAgfCBTQ1NDUl9DS0UxIHwgU0NTQ1JfQ0tFMCwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1NiwgNTYsIDU2IH0sCiB9OwpAQCAtODUsNiArODgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGE0NDAwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfVElFIHwgU0NTQ1JfUklFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MiwgNTIsIDUyIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMKaW5kZXggM2NmOGM4ZS4uNDU1MWFkNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jCkBAIC0xMDksNiArMTA5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZmZmU4MCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyAyMywgMjMsIDIzLCAwIH0sCiB9OwpAQCAtMTI2LDYgKzEyOCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQwMDAxNTAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDU2LCA1NiwgNTYsIDU2IH0sCiB9OwpAQCAtMTQzLDYgKzE0Nyw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQwMDAxNDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfSVJEQSwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIsIDUyIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKaW5kZXggYjBjMmZiNC4uNzhmNmIwMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCkBAIC05OSw2ICs5OSw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQ0MDAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFIHwgU0NTQ1JfUkVJRSB8CisJCQkgIFNDU0NSX0NLRTEgfCBTQ1NDUl9DS0UwLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIsIDUyIH0sCiB9OwpAQCAtMTE0LDYgKzExNyw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQ0MTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFIHwgU0NTQ1JfUkVJRSB8CisJCQkgIFNDU0NSX0NLRTEgfCBTQ1NDUl9DS0UwLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDU2LCA1NiwgNTYsIDU2IH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKaW5kZXggMjRiMTcxMy4uMzY1Yjk0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBTSDc3MjAgU2V0dXAKKyAqIFNldHVwIGNvZGUgZm9yIFNINzcyMCwgU0g3NzIxLgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIE1hcmt1cyBCcnVubmVyLCBNYXJrIEpvbmFzCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBQYXVsIE11bmR0CkBAIC01MSw2ICs1MSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQ0MzAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDgwLCA4MCwgODAsIDgwIH0sCiB9OwpAQCAtNjYsNiArNjgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGE0NDM4MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwppbmRleCBiOTM0NThmLi45NzFjZjBmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCkBAIC0xNTEsOCArMTUxLDE0IEBACiAJCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTDJfQ0FDSEU7CiAJCQlicmVhazsKIAkJY2FzZSAweDEwOgorCQljYXNlIDB4MTE6CiAJCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzU3OwogCQkJYnJlYWs7CisJCWNhc2UgMHhkMDoKKwkJY2FzZSAweDQwOiAvKiB5b24tdGVuLWdvICovCisJCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3MzcyOworCQkJYnJlYWs7CisKIAkJfQogCQlicmVhazsKIAljYXNlIDB4NDAwMDoJLyogMXN0IGN1dCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDQtMjAyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYwppbmRleCBlOTE2YjE4Li41YjI4MzMxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYwpAQCAtMTgsNiArMTgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTgwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwppbmRleCA5MTFkMTk2Li5jMmIwYWFhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGFzbS9tYWNodHlwZXMuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewpAQCAtMzUsMzMgKzM2LDM3IEBACiAJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0geworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmUwMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyAyMywgMjMsIDIzLCAwIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzaC1zY2kiLAogCS5pZAkJPSAwLAogCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZzY2lmMF9wbGF0Zm9ybV9kYXRhLAorCQkucGxhdGZvcm1fZGF0YQk9ICZzY2lfcGxhdGZvcm1fZGF0YSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmU4MDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmX2RldmljZSA9IHsKIAkubmFtZQkJPSAic2gtc2NpIiwKIAkuaWQJCT0gMSwKIAkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmc2NpZjFfcGxhdGZvcm1fZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc2NpZl9wbGF0Zm9ybV9kYXRhLAogCX0sCiB9OwogCkBAIC0yMTAsOCArMjE1LDYgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzUwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZzY2lmMF9kZXZpY2UsCi0JJnNjaWYxX2RldmljZSwKIAkmcnRjX2RldmljZSwKIAkmdG11MF9kZXZpY2UsCiAJJnRtdTFfZGV2aWNlLApAQCAtMjI2LDE0ICsyMjksMTkgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2g3NzUwX2RldmljZXNfc2V0dXAodm9pZCkKIHsKKwlpZiAobWFjaF9pc19ydHM3NzUxcjJkKCkpIHsKKwkJcGxhdGZvcm1fcmVnaXN0ZXJfZGV2aWNlKCZzY2lmX2RldmljZSk7CisJfSBlbHNlIHsKKwkJcGxhdGZvcm1fcmVnaXN0ZXJfZGV2aWNlKCZzY2lfZGV2aWNlKTsKKwkJcGxhdGZvcm1fcmVnaXN0ZXJfZGV2aWNlKCZzY2lmX2RldmljZSk7CisJfQorCiAJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc1MF9kZXZpY2VzLAogCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc1MF9kZXZpY2VzKSk7CiB9CiBhcmNoX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc1MF9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmc2NpZjBfZGV2aWNlLAotCSZzY2lmMV9kZXZpY2UsCiAJJnRtdTBfZGV2aWNlLAogCSZ0bXUxX2RldmljZSwKIAkmdG11Ml9kZXZpY2UsCkBAIC0yNDcsNiArMjU1LDE0IEBACiAKIHZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCiB7CisJaWYgKG1hY2hfaXNfcnRzNzc1MXIyZCgpKSB7CisJCXNjaWZfcGxhdGZvcm1fZGF0YS5zY3NjciB8PSBTQ1NDUl9DS0UxOworCQllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcygmc2NpZl9kZXZpY2UsIDEpOworCX0gZWxzZSB7CisJCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKCZzY2lfZGV2aWNlLCAxKTsKKwkJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoJnNjaWZfZGV2aWNlLCAxKTsKKwl9CisKIAllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3NTBfZWFybHlfZGV2aWNlcywKIAkJCQkgICBBUlJBWV9TSVpFKHNoNzc1MF9lYXJseV9kZXZpY2VzKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCA0OGVhOGZlLi43OGJiZjIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTEyOSw2ICsxMjksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZlNjAwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKIH07CkBAIC0xNDUsNiArMTQ3LDggQEAKIAkubWFwYmFzZQk9IDB4ZmU2MTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLmlycXMJCT0geyA3MiwgNzMsIDc1LCA3NCB9LAogfTsKIApAQCAtMTU5LDYgKzE2Myw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmU2MjAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA3NiwgNzcsIDc5LCA3OCB9LAogfTsKQEAgLTE3NCw2ICsxODAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZlNDgwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyA4MCwgODEsIDgyLCAwIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzQzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNDMuYwppbmRleCAzNjgxY2FmZC4uMWI4ODQ4MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzQzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzQzLmMKQEAgLTE5LDYgKzE5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMDAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCiB9OwpAQCAtMzQsNiArMzYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhmZmUxMDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODEsIDgxLCA4MSwgODEgfSwKIH07CkBAIC00OSw2ICs1Myw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTIwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfQ0tFMSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MiwgODIsIDgyLCA4MiB9LAogfTsKQEAgLTY0LDYgKzcwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmM19wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMzAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgzLCA4MywgODMsIDgzIH0sCiB9OwpAQCAtMzYwLDYgKzM2OCw4IEBACiAKIGVudW0gewogCVVOVVNFRCA9IDAsCisJRU5BQkxFRCwKKwlESVNBQkxFRCwKIAogCS8qIGludGVycnVwdCBzb3VyY2VzICovCiAJSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywgSVJRNCwgSVJRNSwgSVJRNiwgSVJRNywKQEAgLTM3NSwxNSArMzg1LDEzIEBACiAJSTJDMF9BTEksIEkyQzBfVEFDS0ksIEkyQzBfV0FJVEksIEkyQzBfRFRFSSwKIAlJMkMxX0FMSSwgSTJDMV9UQUNLSSwgSTJDMV9XQUlUSSwgSTJDMV9EVEVJLAogCVNJTV9URUksIFNJTV9UWEksIFNJTV9SWEksIFNJTV9FUkksCi0JSVJEQSwKLQlTREhJMCwgU0RISTEsIFNESEkyLCBTREhJMywKLQlDTVQsIFRTSUYsIFNJVSwKKwlJUkRBLCBTREhJLCBDTVQsIFRTSUYsIFNJVSwKIAlUTVUwLCBUTVUxLCBUTVUyLAogCUpQVSwgTENEQywKIAogCS8qIGludGVycnVwdCBncm91cHMgKi8KIAotCURNQUMwMTIzLCBWSU9WT1UsIE1NQywgRE1BQzQ1LCBGTENUTCwgSTJDMCwgSTJDMSwgU0lNLCBTREhJLCBVU0IsCisJRE1BQzAxMjMsIFZJT1ZPVSwgTU1DLCBETUFDNDUsIEZMQ1RMLCBJMkMwLCBJMkMxLCBTSU0sIFVTQiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNbXSBfX2luaXRkYXRhID0gewpAQCAtNDEyLDggKzQyMCw4IEBACiAJSU5UQ19WRUNUKEZMQ1RMX0ZMVFJFUTBJLCAweGRjMCksIElOVENfVkVDVChGTENUTF9GTFRSRVExSSwgMHhkZTApLAogCUlOVENfVkVDVChJMkMwX0FMSSwgMHhlMDApLCBJTlRDX1ZFQ1QoSTJDMF9UQUNLSSwgMHhlMjApLAogCUlOVENfVkVDVChJMkMwX1dBSVRJLCAweGU0MCksIElOVENfVkVDVChJMkMwX0RURUksIDB4ZTYwKSwKLQlJTlRDX1ZFQ1QoU0RISTAsIDB4ZTgwKSwgSU5UQ19WRUNUKFNESEkxLCAweGVhMCksCi0JSU5UQ19WRUNUKFNESEkyLCAweGVjMCksIElOVENfVkVDVChTREhJMywgMHhlZTApLAorCUlOVENfVkVDVChTREhJLCAweGU4MCksIElOVENfVkVDVChTREhJLCAweGVhMCksCisJSU5UQ19WRUNUKFNESEksIDB4ZWMwKSwgSU5UQ19WRUNUKFNESEksIDB4ZWUwKSwKIAlJTlRDX1ZFQ1QoQ01ULCAweGYwMCksIElOVENfVkVDVChUU0lGLCAweGYyMCksCiAJSU5UQ19WRUNUKFNJVSwgMHhmODApLAogCUlOVENfVkVDVChUTVUwLCAweDQwMCksIElOVENfVkVDVChUTVUxLCAweDQyMCksCkBAIC00MzEsNyArNDM5LDYgQEAKIAlJTlRDX0dST1VQKEkyQzAsIEkyQzBfQUxJLCBJMkMwX1RBQ0tJLCBJMkMwX1dBSVRJLCBJMkMwX0RURUkpLAogCUlOVENfR1JPVVAoSTJDMSwgSTJDMV9BTEksIEkyQzFfVEFDS0ksIEkyQzFfV0FJVEksIEkyQzFfRFRFSSksCiAJSU5UQ19HUk9VUChTSU0sIFNJTV9URUksIFNJTV9UWEksIFNJTV9SWEksIFNJTV9FUkkpLAotCUlOVENfR1JPVVAoU0RISSwgU0RISTAsIFNESEkxLCBTREhJMiwgU0RISTMpLAogCUlOVENfR1JPVVAoVVNCLCBVU0JJMCwgVVNCSTEpLAogfTsKIApAQCAtNDUyLDcgKzQ1OSw3IEBACiAJICB7IEkyQzBfRFRFSSwgSTJDMF9XQUlUSSwgSTJDMF9UQUNLSSwgSTJDMF9BTEksCiAJICAgIEZMQ1RMX0ZMVFJFUTFJLCBGTENUTF9GTFRSRVEwSSwgRkxDVExfRkxFTkRJLCBGTENUTF9GTFNURUkgfSB9LAogCXsgMHhhNDA4MDBhMCwgMHhhNDA4MDBlMCwgOCwgLyogSU1SOCAvIElNQ1I4ICovCi0JICB7IFNESEkzLCBTREhJMiwgU0RISTEsIFNESEkwLCAwLCAwLCAwLCBTSVUgfSB9LAorCSAgeyBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgMCwgMCwgMCwgU0lVIH0gfSwKIAl7IDB4YTQwODAwYTQsIDB4YTQwODAwZTQsIDgsIC8qIElNUjkgLyBJTUNSOSAqLwogCSAgeyAwLCAwLCAwLCBDTVQsIDAsIFVTQkkxLCBVU0JJMCB9IH0sCiAJeyAweGE0MDgwMGE4LCAweGE0MDgwMGU4LCA4LCAvKiBJTVIxMCAvIElNQ1IxMCAqLwpAQCAtNDg4LDkgKzQ5NSwxMyBAQAogCSAgeyBJUlEwLCBJUlExLCBJUlEyLCBJUlEzLCBJUlE0LCBJUlE1LCBJUlE2LCBJUlE3IH0gfSwKIH07CiAKLXN0YXRpYyBERUNMQVJFX0lOVENfREVTQ19BQ0soaW50Y19kZXNjLCAic2g3MzQzIiwgdmVjdG9ycywgZ3JvdXBzLAotCQkJICAgICBtYXNrX3JlZ2lzdGVycywgcHJpb19yZWdpc3RlcnMsIHNlbnNlX3JlZ2lzdGVycywKLQkJCSAgICAgYWNrX3JlZ2lzdGVycyk7CitzdGF0aWMgc3RydWN0IGludGNfZGVzYyBpbnRjX2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkubmFtZSA9ICJzaDczNDMiLAorCS5mb3JjZV9lbmFibGUgPSBFTkFCTEVELAorCS5mb3JjZV9kaXNhYmxlID0gRElTQUJMRUQsCisJLmh3ID0gSU5UQ19IV19ERVNDKHZlY3RvcnMsIGdyb3VwcywgbWFza19yZWdpc3RlcnMsCisJCQkgICBwcmlvX3JlZ2lzdGVycywgc2Vuc2VfcmVnaXN0ZXJzLCBhY2tfcmVnaXN0ZXJzKSwKK307CiAKIHZvaWQgX19pbml0IHBsYXRfaXJxX3NldHVwKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNjYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM2Ni5jCmluZGV4IDhkYWI5ZTEuLjgyNjE2YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM2Ni5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM2Ni5jCkBAIC0yMSw2ICsyMSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA4MCwgODAsIDgwLCA4MCB9LAogfTsKQEAgLTMxOSw2ICszMjEsOCBAQAogCiBlbnVtIHsKIAlVTlVTRUQ9MCwKKwlFTkFCTEVELAorCURJU0FCTEVELAogCiAJLyogaW50ZXJydXB0IHNvdXJjZXMgKi8KIAlJUlEwLCBJUlExLCBJUlEyLCBJUlEzLCBJUlE0LCBJUlE1LCBJUlE2LCBJUlE3LApAQCAtMzMyLDE0ICszMzYsMTMgQEAKIAlERU5DLCBNU0lPRiwKIAlGTENUTF9GTFNURUksIEZMQ1RMX0ZMRU5ESSwgRkxDVExfRkxUUkVRMEksIEZMQ1RMX0ZMVFJFUTFJLAogCUkyQ19BTEksIEkyQ19UQUNLSSwgSTJDX1dBSVRJLCBJMkNfRFRFSSwKLQlTREhJMCwgU0RISTEsIFNESEkyLCBTREhJMywKLQlDTVQsIFRTSUYsIFNJVSwKKwlTREhJLCBDTVQsIFRTSUYsIFNJVSwKIAlUTVUwLCBUTVUxLCBUTVUyLAogCVZFVTIsIExDREMsCiAKIAkvKiBpbnRlcnJ1cHQgZ3JvdXBzICovCiAKLQlETUFDMDEyMywgVklPVk9VLCBNTUMsIERNQUM0NSwgRkxDVEwsIEkyQywgU0RISSwKKwlETUFDMDEyMywgVklPVk9VLCBNTUMsIERNQUM0NSwgRkxDVEwsIEkyQywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNbXSBfX2luaXRkYXRhID0gewpAQCAtMzY0LDggKzM2Nyw4IEBACiAJSU5UQ19WRUNUKEZMQ1RMX0ZMVFJFUTBJLCAweGRjMCksIElOVENfVkVDVChGTENUTF9GTFRSRVExSSwgMHhkZTApLAogCUlOVENfVkVDVChJMkNfQUxJLCAweGUwMCksIElOVENfVkVDVChJMkNfVEFDS0ksIDB4ZTIwKSwKIAlJTlRDX1ZFQ1QoSTJDX1dBSVRJLCAweGU0MCksIElOVENfVkVDVChJMkNfRFRFSSwgMHhlNjApLAotCUlOVENfVkVDVChTREhJMCwgMHhlODApLCBJTlRDX1ZFQ1QoU0RISTEsIDB4ZWEwKSwKLQlJTlRDX1ZFQ1QoU0RISTIsIDB4ZWMwKSwgSU5UQ19WRUNUKFNESEkzLCAweGVlMCksCisJSU5UQ19WRUNUKFNESEksIDB4ZTgwKSwgSU5UQ19WRUNUKFNESEksIDB4ZWEwKSwKKwlJTlRDX1ZFQ1QoU0RISSwgMHhlYzApLCBJTlRDX1ZFQ1QoU0RISSwgMHhlZTApLAogCUlOVENfVkVDVChDTVQsIDB4ZjAwKSwgSU5UQ19WRUNUKFRTSUYsIDB4ZjIwKSwKIAlJTlRDX1ZFQ1QoU0lVLCAweGY4MCksCiAJSU5UQ19WRUNUKFRNVTAsIDB4NDAwKSwgSU5UQ19WRUNUKFRNVTEsIDB4NDIwKSwKQEAgLTM4MSw3ICszODQsNiBAQAogCUlOVENfR1JPVVAoRkxDVEwsIEZMQ1RMX0ZMU1RFSSwgRkxDVExfRkxFTkRJLAogCQkgICBGTENUTF9GTFRSRVEwSSwgRkxDVExfRkxUUkVRMUkpLAogCUlOVENfR1JPVVAoSTJDLCBJMkNfQUxJLCBJMkNfVEFDS0ksIEkyQ19XQUlUSSwgSTJDX0RURUkpLAotCUlOVENfR1JPVVAoU0RISSwgU0RISTAsIFNESEkxLCBTREhJMiwgU0RISTMpLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIG1hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKQEAgLTQwMyw3ICs0MDUsNyBAQAogCSAgeyBJMkNfRFRFSSwgSTJDX1dBSVRJLCBJMkNfVEFDS0ksIEkyQ19BTEksCiAJICAgIEZMQ1RMX0ZMVFJFUTFJLCBGTENUTF9GTFRSRVEwSSwgRkxDVExfRkxFTkRJLCBGTENUTF9GTFNURUkgfSB9LAogCXsgMHhhNDA4MDBhMCwgMHhhNDA4MDBlMCwgOCwgLyogSU1SOCAvIElNQ1I4ICovCi0JICB7IFNESEkzLCBTREhJMiwgU0RISTEsIFNESEkwLCAwLCAwLCAwLCBTSVUgfSB9LAorCSAgeyBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCwgMCwgMCwgMCwgU0lVIH0gfSwKIAl7IDB4YTQwODAwYTQsIDB4YTQwODAwZTQsIDgsIC8qIElNUjkgLyBJTUNSOSAqLwogCSAgeyAwLCAwLCAwLCBDTVQsIDAsIFVTQiwgfSB9LAogCXsgMHhhNDA4MDBhOCwgMHhhNDA4MDBlOCwgOCwgLyogSU1SMTAgLyBJTUNSMTAgKi8KQEAgLTQ0MSw5ICs0NDMsMTMgQEAKIAkgIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywgSVJRNCwgSVJRNSwgSVJRNiwgSVJRNyB9IH0sCiB9OwogCi1zdGF0aWMgREVDTEFSRV9JTlRDX0RFU0NfQUNLKGludGNfZGVzYywgInNoNzM2NiIsIHZlY3RvcnMsIGdyb3VwcywKLQkJCSAgICAgbWFza19yZWdpc3RlcnMsIHByaW9fcmVnaXN0ZXJzLCBzZW5zZV9yZWdpc3RlcnMsCi0JCQkgICAgIGFja19yZWdpc3RlcnMpOworc3RhdGljIHN0cnVjdCBpbnRjX2Rlc2MgaW50Y19kZXNjIF9faW5pdGRhdGEgPSB7CisJLm5hbWUgPSAic2g3MzY2IiwKKwkuZm9yY2VfZW5hYmxlID0gRU5BQkxFRCwKKwkuZm9yY2VfZGlzYWJsZSA9IERJU0FCTEVELAorCS5odyA9IElOVENfSFdfREVTQyh2ZWN0b3JzLCBncm91cHMsIG1hc2tfcmVnaXN0ZXJzLAorCQkJICAgcHJpb19yZWdpc3RlcnMsIHNlbnNlX3JlZ2lzdGVycywgYWNrX3JlZ2lzdGVycyksCit9OwogCiB2b2lkIF9faW5pdCBwbGF0X2lycV9zZXR1cCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYwppbmRleCBkNTUxZWQ4Li41ODEzZDgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYwpAQCAtMTgxLDYgKzE4MSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTAwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MCwgODAsIDgwLCA4MCB9LAogfTsKQEAgLTE5Niw2ICsxOTgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhmZmUxMDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODEsIDgxLCA4MSwgODEgfSwKIH07CkBAIC0yMTEsNiArMjE1LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMjAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgyLCA4MiwgODIsIDgyIH0sCiB9OwpAQCAtNjk5LDcgKzcwNSw3IEBACiAJICB7IEkyQ19EVEVJLCBJMkNfV0FJVEksIEkyQ19UQUNLSSwgSTJDX0FMSSwKIAkgICAgRkxDVExfRkxUUkVRMUksIEZMQ1RMX0ZMVFJFUTBJLCBGTENUTF9GTEVOREksIEZMQ1RMX0ZMU1RFSSB9IH0sCiAJeyAweGE0MDgwMGEwLCAweGE0MDgwMGUwLCA4LCAvKiBJTVI4IC8gSU1DUjggKi8KLQkgIHsgRElTQUJMRUQsIERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELCAwLCAwLCBUV09ERywgU0lVIH0gfSwKKwkgIHsgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsIDAsIDAsIFRXT0RHLCBTSVUgfSB9LAogCXsgMHhhNDA4MDBhNCwgMHhhNDA4MDBlNCwgOCwgLyogSU1SOSAvIElNQ1I5ICovCiAJICB7IDAsIDAsIDAsIENNVCwgMCwgVVNCX1VTQkkxLCBVU0JfVVNCSTAsIH0gfSwKIAl7IDB4YTQwODAwYTgsIDB4YTQwODAwZTgsIDgsIC8qIElNUjEwIC8gSU1DUjEwICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jCmluZGV4IDBlYWRlZmQuLjA3MjM4MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jCkBAIC0yNCw2ICsyNCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTAwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MCwgODAsIDgwLCA4MCB9LAogfTsKQEAgLTM5LDYgKzQxLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMTAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgxLCA4MSwgODEsIDgxIH0sCiB9OwpAQCAtNTQsNiArNTgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhmZmUyMDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKIH07CkBAIC02OSw2ICs3NSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTMwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUZBLAogCS5pcnFzICAgICAgICAgICA9IHsgNTYsIDU2LCA1NiwgNTYgfSwKIH07CkBAIC04NCw2ICs5Miw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTQwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUZBLAogCS5pcnFzICAgICAgICAgICA9IHsgODgsIDg4LCA4OCwgODggfSwKIH07CkBAIC05OSw2ICsxMDksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhhNGU1MDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzMsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGQSwKIAkuaXJxcyAgICAgICAgICAgPSB7IDEwOSwgMTA5LCAxMDksIDEwOSB9LAogfTsKQEAgLTcxOSw3ICs3MzEsNyBAQAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIG1hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKIAl7IDB4YTQwODAwODAsIDB4YTQwODAwYzAsIDgsIC8qIElNUjAgLyBJTUNSMCAqLwogCSAgeyAwLCBUTVUxX1RVTkkyLCBUTVUxX1RVTkkxLCBUTVUxX1RVTkkwLAotCSAgICAwLCBESVNBQkxFRCwgRU5BQkxFRCwgRU5BQkxFRCB9IH0sCisJICAgIDAsIEVOQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQgfSB9LAogCXsgMHhhNDA4MDA4NCwgMHhhNDA4MDBjNCwgOCwgLyogSU1SMSAvIElNQ1IxICovCiAJICB7IFZJT19WT1VJLCBWSU9fVkVVMkhJLFZJT19CRVVJLFZJT19DRVVJLERNQUMwQV9ERUkzLERNQUMwQV9ERUkyLERNQUMwQV9ERUkxLERNQUMwQV9ERUkwIH0gfSwKIAl7IDB4YTQwODAwODgsIDB4YTQwODAwYzgsIDgsIC8qIElNUjIgLyBJTUNSMiAqLwpAQCAtNzM2LDcgKzc0OCw3IEBACiAJICB7IEkyQ19EVEVJLCBJMkNfV0FJVEksIEkyQ19UQUNLSSwgSTJDX0FMSSwKIAkgICAgRkxDVExfRkxUUkVRMUksIEZMQ1RMX0ZMVFJFUTBJLCBGTENUTF9GTFRFTkRJLCBGTENUTF9GTFNURUkgfSB9LAogCXsgMHhhNDA4MDBhMCwgMHhhNDA4MDBlMCwgOCwgLyogSU1SOCAvIElNQ1I4ICovCi0JICB7IDAsIERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELAorCSAgeyAwLCBFTkFCTEVELCBFTkFCTEVELCBFTkFCTEVELAogCSAgICAwLCAwLCBTQ0lGQV9TQ0lGQTIsIFNJVV9TSVVJIH0gfSwKIAl7IDB4YTQwODAwYTQsIDB4YTQwODAwZTQsIDgsIC8qIElNUjkgLyBJTUNSOSAqLwogCSAgeyAwLCAwLCAwLCBDTVRfQ01USSwgMCwgMCwgVVNCX1VTSTAsMCB9IH0sCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCmluZGV4IDgyOGM5NjUuLjAzMzNmZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCkBAIC0yNTcsNiArMjU3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMDAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCiB9OwpAQCAtMjcyLDYgKzI3NCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTEwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAogfTsKQEAgLTI4Nyw2ICsyOTEsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhmZmUyMDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKIH07CkBAIC0zMDIsNiArMzA4LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmM19wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4YTRlMzAwMDAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzMsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGQSwKIAkuaXJxcyAgICAgICAgICAgPSB7IDU2LCA1NiwgNTYsIDU2IH0sCiB9OwpAQCAtMzE3LDYgKzMyNSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTQwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18zLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRkEsCiAJLmlycXMgICAgICAgICAgID0geyA4OCwgODgsIDg4LCA4OCB9LAogfTsKQEAgLTMzMiw2ICszNDIsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhhNGU1MDAwMCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUZBLAogCS5pcnFzICAgICAgICAgICA9IHsgMTA5LCAxMDksIDEwOSwgMTA5IH0sCiB9OwpAQCAtMTE0NCw3ICsxMTU2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBtYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CiAJeyAweGE0MDgwMDgwLCAweGE0MDgwMGMwLCA4LCAvKiBJTVIwIC8gSU1DUjAgKi8KIAkgIHsgMCwgVE1VMV9UVU5JMiwgVE1VMV9UVU5JMSwgVE1VMV9UVU5JMCwKLQkgICAgMCwgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQgfSB9LAorCSAgICAwLCBFTkFCTEVELCBFTkFCTEVELCBFTkFCTEVEIH0gfSwKIAl7IDB4YTQwODAwODQsIDB4YTQwODAwYzQsIDgsIC8qIElNUjEgLyBJTUNSMSAqLwogCSAgeyBWSU9fVk9VLCBWSU9fVkVVMSwgVklPX0JFVTAsIFZJT19DRVUwLAogCSAgICBETUFDMEFfREVJMywgRE1BQzBBX0RFSTIsIERNQUMwQV9ERUkxLCBETUFDMEFfREVJMCB9IH0sCkBAIC0xMTY2LDcgKzExNzgsNyBAQAogCSAgeyBJMkMwX0RURUksIEkyQzBfV0FJVEksIEkyQzBfVEFDS0ksIEkyQzBfQUxJLAogCSAgICBJMkMxX0RURUksIEkyQzFfV0FJVEksIEkyQzFfVEFDS0ksIEkyQzFfQUxJIH0gfSwKIAl7IDB4YTQwODAwYTAsIDB4YTQwODAwZTAsIDgsIC8qIElNUjggLyBJTUNSOCAqLwotCSAgeyBESVNBQkxFRCwgRElTQUJMRUQsIEVOQUJMRUQsIEVOQUJMRUQsCisJICB7IERJU0FCTEVELCBFTkFCTEVELCBFTkFCTEVELCBFTkFCTEVELAogCSAgICAwLCAwLCBTQ0lGQTUsIEZTSSB9IH0sCiAJeyAweGE0MDgwMGE0LCAweGE0MDgwMGU0LCA4LCAvKiBJTVI5IC8gSU1DUjkgKi8KIAkgIHsgMCwgMCwgMCwgQ01ULCAwLCBVU0IxLCBVU0IwLCAwIH0gfSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc1Ny5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzU3LmMKaW5kZXggNzQ5YzYzOC4uOWMxZGUyNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzU3LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzU3LmMKQEAgLTIwLDYgKzIwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZTRiMDAwMCwJCS8qIFNDSUYyICovCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0MCwgNDAsIDQwLCA0MCB9LAogfTsKQEAgLTM1LDYgKzM3LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmM19wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZTRjMDAwMCwJCS8qIFNDSUYzICovCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA3NiwgNzYsIDc2LCA3NiB9LAogfTsKQEAgLTUwLDYgKzU0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZTRkMDAwMCwJCS8qIFNDSUY0ICovCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAxMDQsIDEwNCwgMTA0LCAxMDQgfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NjMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCmluZGV4IDViNWY2YjAuLjU5M2VjYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCkBAIC0xOSw2ICsxOSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0MCwgNDAsIDQwLCA0MCB9LAogfTsKQEAgLTM0LDYgKzM2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmUwODAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDc2LCA3NiwgNzYsIDc2IH0sCiB9OwpAQCAtNDksNiArNTMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTEwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMTA0LCAxMDQsIDEwNCwgMTA0IH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzcwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NzAuYwppbmRleCA3MjcwZDdmLi4yYzZhYTIyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NzAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NzAuYwpAQCAtMTcsNiArMTcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTIzMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYxLCA2MSwgNjEsIDYxIH0sCiB9OwpAQCAtMzIsNiArMzQsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTI0MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYyLCA2MiwgNjIsIDYyIH0sCiB9OwpAQCAtNDcsNiArNTEsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTI1MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYzLCA2MywgNjMsIDYzIH0sCiB9OwpAQCAtNjIsNiArNjgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTI2MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDY0LCA2NCwgNjQsIDY0IH0sCiB9OwpAQCAtNzcsNiArODUsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY0X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTI3MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDY1LCA2NSwgNjUsIDY1IH0sCiB9OwpAQCAtOTIsNiArMTAyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZjkyODAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFIHwgU0NTQ1JfVE9JRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA2NiwgNjYsIDY2LCA2NiB9LAogfTsKQEAgLTEwNyw2ICsxMTksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY2X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTI5MDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDY3LCA2NywgNjcsIDY3IH0sCiB9OwpAQCAtMTIyLDYgKzEzNiw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjdfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmY5MmEwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX1RPSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjgsIDY4LCA2OCwgNjggfSwKIH07CkBAIC0xMzcsNiArMTUzLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmOF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZjkyYjAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFIHwgU0NTQ1JfVE9JRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA2OSwgNjksIDY5LCA2OSB9LAogfTsKQEAgLTE1Miw2ICsxNzAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY5X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmOTJjMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9UT0lFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDcwLCA3MCwgNzAsIDcwIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwppbmRleCAwZjQxNDg2Li4wOGFkZDdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYwpAQCAtMjAsNiArMjAsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCiB9OwpAQCAtMzUsNiArMzcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTEwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDc2LCA3NiwgNzYsIDc2IH0sCiB9OwpAQCAtMzc5LDYgKzM4Myw3IEBACiAJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzgwX2RldmljZXMpKTsKIH0KIGFyY2hfaW5pdGNhbGwoc2g3NzgwX2RldmljZXNfc2V0dXApOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzgwX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lmMF9kZXZpY2UsCiAJJnNjaWYxX2RldmljZSwKQEAgLTM5Miw2ICszOTcsMTMgQEAKIAogdm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKIHsKKwlpZiAobWFjaF9pc19zaDIwMDcoKSkgeworCQlzY2lmMF9wbGF0Zm9ybV9kYXRhLnNjc2NyICY9IH5TQ1NDUl9DS0UxOworCQlzY2lmMF9wbGF0Zm9ybV9kYXRhLnNjYnJyX2FsZ29faWQgPSBTQ0JSUl9BTEdPXzI7CisJCXNjaWYxX3BsYXRmb3JtX2RhdGEuc2NzY3IgJj0gflNDU0NSX0NLRTE7CisJCXNjaWYxX3BsYXRmb3JtX2RhdGEuc2NicnJfYWxnb19pZCA9IFNDQlJSX0FMR09fMjsKKwl9CisKIAllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3ODBfZWFybHlfZGV2aWNlcywKIAkJCQkgICBBUlJBWV9TSVpFKHNoNzc4MF9lYXJseV9kZXZpY2VzKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IGM5YTU3MmIuLjE4ZDhmYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC0yMyw2ICsyMyw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlYTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDAsIDQwLCA0MCwgNDAgfSwKIH07CkBAIC0zOCw2ICs0MCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjFfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlYjAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDQsIDQ0LCA0NCwgNDQgfSwKIH07CkBAIC01Myw2ICs1Nyw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlYzAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjAsIDYwLCA2MCwgNjAgfSwKIH07CkBAIC02OCw2ICs3NCw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlZDAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjEsIDYxLCA2MSwgNjEgfSwKIH07CkBAIC04Myw2ICs5MSw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlZTAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSB8IFNDU0NSX0NLRTEsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjIsIDYyLCA2MiwgNjIgfSwKIH07CkBAIC05OCw2ICsxMDgsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWYwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYzLCA2MywgNjMsIDYzIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYwppbmRleCAwMTcwZGJkLi4xNjU2YjhjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYwpAQCAtMjksNiArMjksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWEwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MSwgNDMsIDQyIH0sCiB9OwpAQCAtNDcsNiArNDksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWIwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQ0LCA0NCwgNDQsIDQ0IH0sCiB9OwpAQCAtNjIsNiArNjYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWMwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUwLCA1MCwgNTAsIDUwIH0sCiB9OwpAQCAtNzcsNiArODMsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYzX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWQwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUxLCA1MSwgNTEsIDUxIH0sCiB9OwpAQCAtOTIsNiArMTAwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmVlMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFIHwgU0NTQ1JfQ0tFMSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MiwgNTIsIDUyLCA1MiB9LAogfTsKQEAgLTEwNyw2ICsxMTcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY1X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZWYwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUgfCBTQ1NDUl9DS0UxLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUzLCA1MywgNTMsIDUzIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCmluZGV4IDAxM2YwYjEuLmJiMjA4ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTI5LDYgKzI5LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmMzMDAwMCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAorCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MSwgNDMsIDQyIH0sCiB9OwpAQCAtNDQsNiArNDYsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYxX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmYzQwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCisJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKIH07CkBAIC01OSw2ICs2Myw4IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZjNjAwMDAsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MiwgNTMsIDU1LCA1NCB9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvc2V0dXAtc2g1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L3NldHVwLXNoNS5jCmluZGV4IGQ5MTA2NjYuLjE4NDE5ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvc2V0dXAtc2g1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS9zZXR1cC1zaDUuYwpAQCAtMTksNiArMTksOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSBQSFlTX1BFUklQSEVSQUxfQkxPQ0sgKyAweDAxMDMwMDAwLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKKwkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyAzOSwgNDAsIDQyLCAwIH0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL2NwdWlkbGUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9jcHVpZGxlLmMKaW5kZXggODM5NzJhYS4uYzE5ZTJhOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NobW9iaWxlL2NwdWlkbGUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvY3B1aWRsZS5jCkBAIC04MSw3ICs4MSw2IEBACiAJc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kgPSAxICogMjsKIAlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAzOwogCXN0YXRlLT5mbGFncyA9IDA7Ci0Jc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19TSEFMTE9XOwogCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAlzdGF0ZS0+ZW50ZXIgPSBjcHVpZGxlX3NsZWVwX2VudGVyOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2htb2JpbGUvcG0uYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbS5jCmluZGV4IGU1NTk2ODcuLmE2Zjk1YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaG1vYmlsZS9wbS5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBzaF9wbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIHNoX3BtX29wcyA9IHsKIAkuZW50ZXIgICAgICAgICAgPSBzaF9wbV9lbnRlciwKIAkudmFsaWQgICAgICAgICAgPSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2g1LmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoNS5jCmluZGV4IGViNGNjNGUuLmQxYmZmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2g1LmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDUuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiB9CiAKIC8qCi0gKiBGbHVzaCB0aGUgcmFuZ2UgW3N0YXJ0LGVuZF0gb2Yga2VybmVsIHZpcnR1YWwgYWRkZHJlc3Mgc3BhY2UgZnJvbQorICogRmx1c2ggdGhlIHJhbmdlIFtzdGFydCxlbmRdIG9mIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZnJvbQogICogdGhlIEktY2FjaGUuICBUaGUgY29ycmVzcG9uZGluZyByYW5nZSBtdXN0IGJlIHB1cmdlZCBmcm9tIHRoZQogICogRC1jYWNoZSBhbHNvIGJlY2F1c2UgdGhlIFNILTUgZG9lc24ndCBoYXZlIGNhY2hlIHNub29waW5nIGJldHdlZW4KICAqIHRoZSBjYWNoZXMuICBUaGUgYWRkcmVzc2VzIHdpbGwgYmUgdmlzaWJsZSB0aHJvdWdoIHRoZSBzdXBlcnBhZ2UKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvc2gvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA5MTYzZGIzLi5kNzc2MjM0IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zaC9tbS9odWdldGxicGFnZS5jCkBAIC0zNSw3ICszNSw3IEBACiAJCWlmIChwdWQpIHsKIAkJCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKIAkJCWlmIChwbWQpCi0JCQkJcHRlID0gcHRlX2FsbG9jX21hcChtbSwgcG1kLCBhZGRyKTsKKwkJCQlwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBOVUxMLCBwbWQsIGFkZHIpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2luaXQuYyBiL2FyY2gvc2gvbW0vaW5pdC5jCmluZGV4IDMzODViMjguLjBkM2Y5MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW5pdC5jCisrKyBiL2FyY2gvc2gvbW0vaW5pdC5jCkBAIC0yLDcgKzIsNyBAQAogICogbGludXgvYXJjaC9zaC9tbS9pbml0LmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDEwICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAxMSAgUGF1bCBNdW5kdAogICoKICAqICBCYXNlZCBvbiBsaW51eC9hcmNoL2kzODYvbW0vaW5pdC5jOgogICogICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCkBAIC0zMjUsMTEgKzMyNSwxNyBAQAogCWludCBuaWQ7CiAKIAltZW1ibG9ja19pbml0KCk7Ci0KIAlzaF9tdi5tdl9tZW1faW5pdCgpOwogCiAJZWFybHlfcmVzZXJ2ZV9tZW0oKTsKIAorCS8qCisJICogT25jZSB0aGUgZWFybHkgcmVzZXJ2YXRpb25zIGFyZSBvdXQgb2YgdGhlIHdheSwgZ2l2ZSB0aGUKKwkgKiBwbGF0Zm9ybXMgYSBjaGFuY2UgdG8ga2ljayBvdXQgc29tZSBtZW1vcnkuCisJICovCisJaWYgKHNoX212Lm12X21lbV9yZXNlcnZlKQorCQlzaF9tdi5tdl9tZW1fcmVzZXJ2ZSgpOworCiAJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobWVtb3J5X2xpbWl0KTsKIAltZW1ibG9ja19hbmFseXplKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwppbmRleCAwZTY4NDY1Li42ZGQ1NmM0IDEwMDY0NAotLS0gYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCkBAIC05LDYgKzksNyBAQAogSElHSExBTkRFUgkJU0hfSElHSExBTkRFUgogUlRTNzc1MVIyRAkJU0hfUlRTNzc1MVIyRAogUlNLCQkJU0hfUlNLCitBTFBIQV9CT0FSRAkJU0hfQUxQSEFfQk9BUkQKIAogIwogIyBMaXN0IG9mIGNvbXBhbmlvbiBjaGlwcyAvIE1GRHMuCkBAIC02MSwzICs2Miw1IEBACiBQT0xBUklTCQkJU0hfUE9MQVJJUwogS0ZSMlIwOQkJCVNIX0tGUjJSMDkKIEVDT1ZFQwkJCVNIX0VDT1ZFQworQVBTSDRBM0EJCVNIX0FQU0g0QTNBCitBUFNINEFEMEEJCVNIX0FQU0g0QUQwQQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKaW5kZXggMzVmNDg4My4uODUwNWUwYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAib2JpbyIpOwogCW5vZGUgPSBwcm9tX2dldGNoaWxkKG5vZGUpOwogCW5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJwb3dlciIpOwotCWlmIChub2RlID09IDAgfHwgbm9kZSA9PSAtMSkKKwlpZiAobm9kZSA9PSAwIHx8IChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuOwogCiAJLyogTWFwIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYwppbmRleCBlNDQ3OTM4Li4wZGM3MTRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYwpAQCAtMzc1LDUgKzM3NSw1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFyY2hfaW5pdGNhbGwoY3B1X3R5cGVfcHJvYmUpOworZWFybHlfaW5pdGNhbGwoY3B1X3R5cGVfcHJvYmUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCmluZGV4IGVlM2M3ZGQuLjhkMzQ4YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21vZHVsZS5jCkBAIC0yMywxNyArMjMsMTEgQEAKIAogc3RhdGljIHZvaWQgKm1vZHVsZV9tYXAodW5zaWduZWQgbG9uZyBzaXplKQogewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlpZiAoIXNpemUgfHwgc2l6ZSA+IE1PRFVMRVNfTEVOKQorCWlmIChQQUdFX0FMSUdOKHNpemUpID4gTU9EVUxFU19MRU4pCiAJCXJldHVybiBOVUxMOwotCi0JYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fQUxMT0MsIE1PRFVMRVNfVkFERFIsIE1PRFVMRVNfRU5EKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGVfcmFuZ2Uoc2l6ZSwgMSwgTU9EVUxFU19WQUREUiwgTU9EVUxFU19FTkQsCisJCQkJR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwsIC0xLAorCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKIHN0YXRpYyBjaGFyICpkb3QydW5kZXJzY29yZShjaGFyICpuYW1lKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY3IuYwppbmRleCBiODc4NzNjLi5hZTk2Y2Y1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY3IuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY3IuYwpAQCAtMTY4LDQgKzE2OCw0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotYXJjaF9pbml0Y2FsbChwY3JfYXJjaF9pbml0KTsKK2Vhcmx5X2luaXRjYWxsKHBjcl9hcmNoX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMKaW5kZXggYTQ0NDZjMC4uODIyODFhNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFyZmlyZS5jCkBAIC0yNCw3ICsyNCw3IEBACiB2b2lkIGNoZWNrX2lmX3N0YXJmaXJlKHZvaWQpCiB7CiAJcGhhbmRsZSBzc25vZGUgPSBwcm9tX2ZpbmRkZXZpY2UoIi9zc3Atc2VyaWFsIik7Ci0JaWYgKHNzbm9kZSAhPSAwICYmIHNzbm9kZSAhPSAtMSkKKwlpZiAoc3Nub2RlICE9IDAgJiYgKHMzMilzc25vZGUgIT0gLTEpCiAJCXRoaXNfaXNfc3RhcmZpcmUgPSAxOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCA0MmFkMmJhLi4xZTk3NzA5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTYyMiw3ICs2MjIsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgQ0hBRlNSX0lFUlJfbXNnW10gPQogCSJJbnRlcm5hbCBwcm9jZXNzb3IgZXJyb3IiOwogc3RhdGljIGNvbnN0IGNoYXIgQ0hBRlNSX0lTQVBfbXNnW10gPQotCSJTeXN0ZW0gcmVxdWVzdCBwYXJpdHkgZXJyb3Igb24gaW5jb21pbmcgYWRkcmVzc3MiOworCSJTeXN0ZW0gcmVxdWVzdCBwYXJpdHkgZXJyb3Igb24gaW5jb21pbmcgYWRkcmVzcyI7CiBzdGF0aWMgY29uc3QgY2hhciBDSEFGU1JfVUNVX21zZ1tdID0KIAkiVW5jb3JyZWN0YWJsZSBFLWNhY2hlIEVDQyBlcnJvciBmb3IgaWZldGNoL2RhdGEiOwogc3RhdGljIGNvbnN0IGNoYXIgQ0hBRlNSX1VDQ19tc2dbXSA9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfMzIuYyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY18zMi5jCmluZGV4IDVlZGNhYzEuLmU2MDY3YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY18zMi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY18zMi5jCkBAIC01MCw3ICs1MCw3IEBACiAJCWVuZCA9IFBHRElSX1NJWkU7CiAJb2Zmc2V0IC09IGFkZHJlc3M7CiAJZG8gewotCQlwdGVfdCAqIHB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgYWRkcmVzcyk7CisJCXB0ZV90ICpwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBOVUxMLCBwbWQsIGFkZHJlc3MpOwogCQlpZiAoIXB0ZSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpb19yZW1hcF9wdGVfcmFuZ2UobW0sIHB0ZSwgYWRkcmVzcywgZW5kIC0gYWRkcmVzcywgYWRkcmVzcyArIG9mZnNldCwgcHJvdCwgc3BhY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzY0LmMgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYwppbmRleCAwNGYyYmY0Li4zY2IwMGRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYwpAQCAtOTIsNyArOTIsNyBAQAogCQllbmQgPSBQR0RJUl9TSVpFOwogCW9mZnNldCAtPSBhZGRyZXNzOwogCWRvIHsKLQkJcHRlX3QgKiBwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBwbWQsIGFkZHJlc3MpOworCQlwdGVfdCAqcHRlID0gcHRlX2FsbG9jX21hcChtbSwgTlVMTCwgcG1kLCBhZGRyZXNzKTsKIAkJaWYgKCFwdGUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaW9fcmVtYXBfcHRlX3JhbmdlKG1tLCBwdGUsIGFkZHJlc3MsIGVuZCAtIGFkZHJlc3MsIGFkZHJlc3MgKyBvZmZzZXQsIHByb3QsIHNwYWNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvc3BhcmMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA1ZmRkZGYxLi5mNGU5NzY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9odWdldGxicGFnZS5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAlpZiAocHVkKSB7CiAJCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKIAkJaWYgKHBtZCkKLQkJCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgYWRkcik7CisJCQlwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBOVUxMLCBwbWQsIGFkZHIpOwogCX0KIAlyZXR1cm4gcHRlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKaW5kZXggZDM0MmRiYS4uMGE2MDFiMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCkBAIC02MCw3ICs2MCw3IEBACiAJcHJvbV9ub2Rlb3BzID0gcm9tdmVjLT5wdl9ub2Rlb3BzOwogCiAJcHJvbV9yb290X25vZGUgPSBwcm9tX2dldHNpYmxpbmcoMCk7Ci0JaWYoKHByb21fcm9vdF9ub2RlID09IDApIHx8IChwcm9tX3Jvb3Rfbm9kZSA9PSAtMSkpCisJaWYgKChwcm9tX3Jvb3Rfbm9kZSA9PSAwKSB8fCAoKHMzMilwcm9tX3Jvb3Rfbm9kZSA9PSAtMSkpCiAJCXByb21faGFsdCgpOwogCiAJaWYoKCgodW5zaWduZWQgbG9uZykgcHJvbV9ub2Rlb3BzKSA9PSAwKSB8fCAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF82NC5jCmluZGV4IDljNmFjNGIuLjUwMTZjNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL2luaXRfNjQuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAJcHJvbV9jaWZfaW5pdChjaWZfaGFuZGxlciwgY2lmX3N0YWNrKTsKIAogCXByb21fY2hvc2VuX25vZGUgPSBwcm9tX2ZpbmRkZXZpY2UocHJvbV9jaG9zZW5fcGF0aCk7Ci0JaWYgKCFwcm9tX2Nob3Nlbl9ub2RlIHx8IHByb21fY2hvc2VuX25vZGUgPT0gLTEpCisJaWYgKCFwcm9tX2Nob3Nlbl9ub2RlIHx8IChzMzIpcHJvbV9jaG9zZW5fbm9kZSA9PSAtMSkKIAkJcHJvbV9oYWx0KCk7CiAKIAlwcm9tX3N0ZG91dCA9IHByb21fZ2V0aW50KHByb21fY2hvc2VuX25vZGUsICJzdGRvdXQiKTsKIAogCW5vZGUgPSBwcm9tX2ZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOwotCWlmICghbm9kZSB8fCBub2RlID09IC0xKQorCWlmICghbm9kZSB8fCAoczMyKW5vZGUgPT0gLTEpCiAJCXByb21faGFsdCgpOwogCiAJcHJvbV9nZXRzdHJpbmcobm9kZSwgInZlcnNpb24iLCBwcm9tX3ZlcnNpb24sIHNpemVvZihwcm9tX3ZlcnNpb24pKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCmluZGV4IGJjOGU0Y2IuLmYzMGU4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYwpAQCAtNDAsMTEgKzQwLDExIEBACiB7CiAJcGhhbmRsZSBjbm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJY25vZGUgPSBfX3Byb21fZ2V0Y2hpbGQobm9kZSk7Ci0JaWYgKGNub2RlID09IDAgfHwgY25vZGUgPT0gLTEpCisJaWYgKGNub2RlID09IDAgfHwgKHMzMiljbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gY25vZGU7CkBAIC03MiwxMSArNzIsMTEgQEAKIHsKIAlwaGFuZGxlIHNpYm5vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXNpYm5vZGUgPSBfX3Byb21fZ2V0c2libGluZyhub2RlKTsKLQlpZiAoc2libm9kZSA9PSAwIHx8IHNpYm5vZGUgPT0gLTEpCisJaWYgKHNpYm5vZGUgPT0gMCB8fCAoczMyKXNpYm5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHNpYm5vZGU7CkBAIC0yMTksNyArMjE5LDcgQEAKICAqLwogY2hhciAqcHJvbV9uZXh0cHJvcChwaGFuZGxlIG5vZGUsIGNoYXIgKm9wcm9wLCBjaGFyICpidWZmZXIpCiB7Ci0JaWYgKG5vZGUgPT0gMCB8fCBub2RlID09IC0xKQorCWlmIChub2RlID09IDAgfHwgKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gIiI7CiAKIAlyZXR1cm4gX19wcm9tX25leHRwcm9wKG5vZGUsIG9wcm9wKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQkJCWlmIChkICE9IHMgKyAzICYmICghKmQgfHwgKmQgPT0gJy8nKQogCQkJCSAgICAmJiBkIDw9IHMgKyAzICsgOCkgewogCQkJCQlub2RlMiA9IG5vZGU7Ci0JCQkJCXdoaWxlIChub2RlMiAmJiBub2RlMiAhPSAtMSkgeworCQkJCQl3aGlsZSAobm9kZTIgJiYgKHMzMilub2RlMiAhPSAtMSkgewogCQkJCQkJaWYgKHByb21fZ2V0cHJvcGVydHkgKG5vZGUyLCAicmVnIiwgKGNoYXIgKilyZWcsIHNpemVvZiAocmVnKSkgPiAwKSB7CiAJCQkJCQkJaWYgKHdoaWNoX2lvID09IHJlZ1swXS53aGljaF9pbyAmJiBwaHlzX2FkZHIgPT0gcmVnWzBdLnBoeXNfYWRkcikgewogCQkJCQkJCQlub2RlID0gbm9kZTI7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQlub2RlMiA9IHByb21fZ2V0c2libGluZyhub2RlMik7Ci0JCQkJCQlpZiAoIW5vZGUyIHx8IG5vZGUyID09IC0xKQorCQkJCQkJaWYgKCFub2RlMiB8fCAoczMyKW5vZGUyID09IC0xKQogCQkJCQkJCWJyZWFrOwogCQkJCQkJbm9kZTIgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKHByb21fZ2V0c2libGluZyhub2RlMiksIG5idWYpOwogCQkJCQl9CkBAIC0zMDMsNiArMzAzLDcgQEAKIAlub2RlID0gKCpyb212ZWMtPnB2X3YyZGV2b3BzLnYyX2luc3QycGtnKShpbnN0KTsKIAlyZXN0b3JlX2N1cnJlbnQoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcm9tX2xvY2ssIGZsYWdzKTsKLQlpZiAobm9kZSA9PSAtMSkgcmV0dXJuIDA7CisJaWYgKChzMzIpbm9kZSA9PSAtMSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfNjQuYwppbmRleCBkOTM2NjAwLi45MjIwNGMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS90cmVlXzY0LmMKQEAgLTQzLDEwICs0MywxMCBAQAogewogCXBoYW5kbGUgY25vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAljbm9kZSA9IF9fcHJvbV9nZXRjaGlsZChub2RlKTsKLQlpZiAoY25vZGUgPT0gLTEpCisJaWYgKChzMzIpY25vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXJldHVybiBjbm9kZTsKIH0KQEAgLTU2LDEwICs1NiwxMCBAQAogewogCXBoYW5kbGUgY25vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAljbm9kZSA9IHByb21fbm9kZV90b19ub2RlKCJwYXJlbnQiLCBub2RlKTsKLQlpZiAoY25vZGUgPT0gLTEpCisJaWYgKChzMzIpY25vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXJldHVybiBjbm9kZTsKIH0KQEAgLTc2LDEwICs3NiwxMCBAQAogewogCXBoYW5kbGUgc2libm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXNpYm5vZGUgPSBfX3Byb21fZ2V0c2libGluZyhub2RlKTsKLQlpZiAoc2libm9kZSA9PSAtMSkKKwlpZiAoKHMzMilzaWJub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzaWJub2RlOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJdW5zaWduZWQgbG9uZyBhcmdzWzddOwogCiAJKmJ1ZmZlciA9IDA7Ci0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIGJ1ZmZlcjsKIAogCWFyZ3NbMF0gPSAodW5zaWduZWQgbG9uZykgcHJvbV9uZXh0cHJvcF9uYW1lOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJdW5zaWduZWQgbG9uZyBhcmdzWzddOwogCWNoYXIgYnVmWzMyXTsKIAotCWlmIChub2RlID09IC0xKSB7CisJaWYgKChzMzIpbm9kZSA9PSAtMSkgewogCQkqYnVmZmVyID0gMDsKIAkJcmV0dXJuIGJ1ZmZlcjsKIAl9CkBAIC0zNjksNyArMzY5LDcgQEAKIAlwMTI3NV9jbWRfZGlyZWN0KGFyZ3MpOwogCiAJbm9kZSA9IChpbnQpIGFyZ3NbNF07Ci0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcudW0gYi9hcmNoL3VtL0tjb25maWcudW0KaW5kZXggNTBkNmFhMi4uZjhkMWQwZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLnVtCisrKyBiL2FyY2gvdW0vS2NvbmZpZy51bQpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIGNvbmZpZyBISUdITUVNCiAJYm9vbCAiSGlnaG1lbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gITY0QklUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gITY0QklUICYmIEJST0tFTgogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgd2FzIHVzZWQgdG8gYWxsb3cgVU1MIHRvIHJ1biB3aXRoIGJpZyBhbW91bnRzIG9mIG1lbW9yeS4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCmluZGV4IDE2NjRjY2UuLjA1MGU0ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwpAQCAtODIxLDEyICs4MjEsMTIgQEAKIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGUsICpuZXh0OwogCXN0cnVjdCB3aW5jaCAqd2luY2g7CiAKIAlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoKGVsZSwgJndpbmNoX2hhbmRsZXJzKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgJndpbmNoX2hhbmRsZXJzKSB7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAJCWlmICh3aW5jaC0+dHR5ID09IHR0eSkgewogCQkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKaW5kZXggODUwMWU3ZC4uN2UwNjE5YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYwpAQCAtMzcsMTMgKzM3LDcgQEAKIAlpZiAoKnBwb3MgPiBtbWFwcGVyX3NpemUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvdW50ID4gbW1hcHBlcl9zaXplIC0gKnBwb3MpCi0JCWNvdW50ID0gbW1hcHBlcl9zaXplIC0gKnBwb3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnZfYnVmWypwcG9zXSwgYnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKHZfYnVmLCBtbWFwcGVyX3NpemUsIHBwb3MsIGJ1ZiwgY291bnQpOwogfQogCiBzdGF0aWMgbG9uZyBtbWFwcGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTEzNywzICsxMzEsNCBAQAogCiBNT0RVTEVfQVVUSE9SKCJHcmVnIExvbm5vbiA8Z2xvbm5vbkByaWRnZXJ1bi5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRTUExpbnV4IHNpbXVsYXRvciBtbWFwcGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKaW5kZXggM2QwOTlmOS4uMWFlZTU4NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCkBAIC0zMSw3ICszMSw3IEBACiAJaWYgKCFwbWQpCiAJCWdvdG8gb3V0X3BtZDsKIAotCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgcHJvYyk7CisJcHRlID0gcHRlX2FsbG9jX21hcChtbSwgTlVMTCwgcG1kLCBwcm9jKTsKIAlpZiAoIXB0ZSkKIAkJZ290byBvdXRfcHRlOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwppbmRleCBiNmZjY2IwLi40N2FlNGE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTUxLDYgKzUxLDcgQEAKIAlzZWxlY3QgSEFWRV9LRVJORUxfR1pJUAogCXNlbGVjdCBIQVZFX0tFUk5FTF9CWklQMgogCXNlbGVjdCBIQVZFX0tFUk5FTF9MWk1BCisJc2VsZWN0IEhBVkVfS0VSTkVMX1haCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0xaTwogCXNlbGVjdCBIQVZFX0hXX0JSRUFLUE9JTlQKIAlzZWxlY3QgSEFWRV9NSVhFRF9CUkVBS1BPSU5UU19SRUdTCkBAIC02NSw2ICs2Niw3IEBACiAJc2VsZWN0IEhBVkVfU1BBUlNFX0lSUQogCXNlbGVjdCBHRU5FUklDX0lSUV9QUk9CRQogCXNlbGVjdCBHRU5FUklDX1BFTkRJTkdfSVJRIGlmIFNNUAorCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKIAogY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVIKIAlkZWZfYm9vbCAoS1BST0JFUyB8fCBQRVJGX0VWRU5UUykKQEAgLTIwMywxMCArMjA1LDYgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgRE1BUiAmJiBBQ1BJCiAKLWNvbmZpZyBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUwotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFNNUAotCiBjb25maWcgWDg2XzMyX1NNUAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBTTVAKQEAgLTE5MzYsMTMgKzE5MzQsMTkgQEAKIAlkZXBlbmRzIG9uIFg4Nl82NCAmJiBQQ0kgJiYgQUNQSQogCiBjb25maWcgUENJX0NOQjIwTEVfUVVJUksKLQlib29sICJSZWFkIENOQjIwTEUgSG9zdCBCcmlkZ2UgV2luZG93cyIKLQlkZXBlbmRzIG9uIFBDSQorCWJvb2wgIlJlYWQgQ05CMjBMRSBIb3N0IEJyaWRnZSBXaW5kb3dzIiBpZiBFTUJFRERFRAorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFJlYWQgdGhlIFBDSSB3aW5kb3dzIG91dCBvZiB0aGUgQ05CMjBMRSBob3N0IGJyaWRnZS4gVGhpcyBhbGxvd3MKIAkgIFBDSSBob3RwbHVnIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRoIHRoZSBDTkIyMExFIGNoaXBzZXQgd2hpY2ggZG8KIAkgIG5vdCBoYXZlIEFDUEkuCiAKKwkgIFRoZXJlJ3Mgbm8gcHVibGljIHNwZWMgZm9yIHRoaXMgY2hpcHNldCwgYW5kIHRoaXMgZnVuY3Rpb25hbGl0eQorCSAgaXMga25vd24gdG8gYmUgaW5jb21wbGV0ZS4KKworCSAgWW91IHNob3VsZCBzYXkgTiB1bmxlc3MgeW91IGtub3cgeW91IG5lZWQgdGhpcy4KKwogY29uZmlnIERNQVIKIAlib29sICJTdXBwb3J0IGZvciBETUEgUmVtYXBwaW5nIERldmljZXMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBQQ0lfTVNJICYmIEFDUEkgJiYgRVhQRVJJTUVOVEFMCkBAIC0yMDcwLDcgKzIwNzQsNyBAQAogCiBjb25maWcgT0xQQ19YTzEKIAl0cmlzdGF0ZSAiT0xQQyBYTy0xIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBPTFBDICYmIFBDSQorCWRlcGVuZHMgb24gT0xQQyAmJiBNRkRfQ1M1NTM1CiAJLS0taGVscC0tLQogCSAgQWRkIHN1cHBvcnQgZm9yIG5vbi1lc3NlbnRpYWwgZmVhdHVyZXMgb2YgdGhlIE9MUEMgWE8tMSBsYXB0b3AuCiAKQEAgLTIwNzgsMTEgKzIwODIsMTcgQEAKIAlib29sICJTdXBwb3J0IGZvciBPTFBDJ3MgT3BlbiBGaXJtd2FyZSIKIAlkZXBlbmRzIG9uICFYODZfNjQgJiYgIVg4Nl9QQUUKIAlkZWZhdWx0IG4KKwlzZWxlY3QgT0YKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuIEZpcm13YXJlCiAJICB0aGF0IGlzIHVzZWQgb24gdGhlIE9MUEMgWE8tMSBDaGlsZHJlbidzIE1hY2hpbmUuCiAJICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCiAKK2NvbmZpZyBPTFBDX09QRU5GSVJNV0FSRV9EVAorCWJvb2wKKwlkZWZhdWx0IHkgaWYgT0xQQ19PUEVORklSTVdBUkUgJiYgUFJPQ19ERVZJQ0VUUkVFCisJc2VsZWN0IE9GX1BST01UUkVFCisKIGVuZGlmICMgWDg2XzMyCiAKIGNvbmZpZyBBTURfTkIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCAwYzIyOTU1Li4wOTY2NGVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAogIwogCi10YXJnZXRzIDo9IHZtbGludXgubGRzIHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogdm1saW51eC5iaW4uYnoyIHZtbGludXguYmluLmx6bWEgdm1saW51eC5iaW4ubHpvIGhlYWRfJChCSVRTKS5vIG1pc2MubyBzdHJpbmcubyBjbWRsaW5lLm8gZWFybHlfc2VyaWFsX2NvbnNvbGUubyBwaWdneS5vCit0YXJnZXRzIDo9IHZtbGludXgubGRzIHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogdm1saW51eC5iaW4uYnoyIHZtbGludXguYmluLmx6bWEgdm1saW51eC5iaW4ueHogdm1saW51eC5iaW4ubHpvIGhlYWRfJChCSVRTKS5vIG1pc2MubyBzdHJpbmcubyBjbWRsaW5lLm8gZWFybHlfc2VyaWFsX2NvbnNvbGUubyBwaWdneS5vCiAKIEtCVUlMRF9DRkxBR1MgOj0gLW0kKEJJVFMpIC1EX19LRVJORUxfXyAkKExJTlVYX0lOQ0xVREUpIC1PMgogS0JVSUxEX0NGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAtZlBJQwpAQCAtNDksMTIgKzQ5LDE1IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsYnppcDIpCiAkKG9iaikvdm1saW51eC5iaW4ubHptYTogJCh2bWxpbnV4LmJpbi5hbGwteSkgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxsem1hKQorJChvYmopL3ZtbGludXguYmluLnh6OiAkKHZtbGludXguYmluLmFsbC15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHh6a2VybikKICQob2JqKS92bWxpbnV4LmJpbi5sem86ICQodm1saW51eC5iaW4uYWxsLXkpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbHpvKQogCiBzdWZmaXgtJChDT05GSUdfS0VSTkVMX0daSVApCTo9IGd6CiBzdWZmaXgtJChDT05GSUdfS0VSTkVMX0JaSVAyKQk6PSBiejIKIHN1ZmZpeC0kKENPTkZJR19LRVJORUxfTFpNQSkJOj0gbHptYQorc3VmZml4LSQoQ09ORklHX0tFUk5FTF9YWikJOj0geHoKIHN1ZmZpeC0kKENPTkZJR19LRVJORUxfTFpPKSAJOj0gbHpvCiAKIHF1aWV0X2NtZF9ta3BpZ2d5ID0gTUtQSUdHWSAkQApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggMzI1YzA1Mi4uM2ExOWQwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMzksNiArMTM5LDEwIEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfdW5sem1hLmMiCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19LRVJORUxfWFoKKyNpbmNsdWRlICIuLi8uLi8uLi8uLi9saWIvZGVjb21wcmVzc191bnh6LmMiCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19LRVJORUxfTFpPCiAjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfdW5sem8uYyIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21rcGlnZ3kuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9ta3BpZ2d5LmMKaW5kZXggNWMyMjgxMi4uNjQ2YWE3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21rcGlnZ3kuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWtwaWdneS5jCkBAIC03NCw3ICs3NCw3IEBACiAKIAlvZmZzID0gKG9sZW4gPiBpbGVuKSA/IG9sZW4gLSBpbGVuIDogMDsKIAlvZmZzICs9IG9sZW4gPj4gMTI7CS8qIEFkZCA4IGJ5dGVzIGZvciBlYWNoIDMySyBibG9jayAqLwotCW9mZnMgKz0gMzIqMTAyNCArIDE4OwkvKiBBZGQgMzJLICsgMTggYnl0ZXMgc2xhY2sgKi8KKwlvZmZzICs9IDY0KjEwMjQgKyAxMjg7CS8qIEFkZCA2NEsgKyAxMjggYnl0ZXMgc2xhY2sgKi8KIAlvZmZzID0gKG9mZnMrNDA5NSkgJiB+NDA5NTsgLyogUm91bmQgdG8gYSA0SyBib3VuZGFyeSAqLwogCiAJcHJpbnRmKCIuc2VjdGlvbiBcIi5yb2RhdGEuLmNvbXByZXNzZWRcIixcImFcIixAcHJvZ2JpdHNcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2FzbS5TIGIvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2FzbS5TCmluZGV4IGZmMTY3NTYuLjhmZTJhNDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9hc20uUworKysgYi9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfYXNtLlMKQEAgLTksNiArOSwyMCBAQAogICogICAgICAgICAgICBWaW5vZGggR29wYWwgPHZpbm9kaC5nb3BhbEBpbnRlbC5jb20+CiAgKiAgICAgICAgICAgIEthaHJhbWFuIEFrZGVtaXIKICAqCisgKiBBZGRlZCBSRkM0MTA2IEFFUy1HQ00gc3VwcG9ydCBmb3IgMTI4LWJpdCBrZXlzIHVuZGVyIHRoZSBBRUFECisgKiBpbnRlcmZhY2UgZm9yIDY0LWJpdCBrZXJuZWxzLgorICogICAgQXV0aG9yczogRXJkaW5jIE96dHVyayAoZXJkaW5jLm96dHVya0BpbnRlbC5jb20pCisgKiAgICAgICAgICAgICBBaWRhbiBPJ01haG9ueSAoYWlkYW4uby5tYWhvbnlAaW50ZWwuY29tKQorICogICAgICAgICAgICAgQWRyaWFuIEhvYmFuIDxhZHJpYW4uaG9iYW5AaW50ZWwuY29tPgorICogICAgICAgICAgICAgSmFtZXMgR3VpbGZvcmQgKGphbWVzLmd1aWxmb3JkQGludGVsLmNvbSkKKyAqICAgICAgICAgICAgIEdhYnJpZWxlIFBhb2xvbmkgPGdhYnJpZWxlLnBhb2xvbmlAaW50ZWwuY29tPgorICogICAgICAgICAgICAgVGFkZXVzeiBTdHJ1ayAodGFkZXVzei5zdHJ1a0BpbnRlbC5jb20pCisgKiAgICAgICAgICAgICBXYWpkaSBGZWdoYWxpICh3YWpkaS5rLmZlZ2hhbGlAaW50ZWwuY29tKQorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBQb3J0ZWQgeDg2XzY0IHZlcnNpb24gdG8geDg2OgorICogICAgQXV0aG9yOiBNYXRoaWFzIEtyYXVzZSA8bWluaXBsaUBnb29nbGVtYWlsLmNvbT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0xOCw4ICszMiw2MiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vaW5zdC5oPgogCisjaWZkZWYgX194ODZfNjRfXworLmRhdGEKK1BPTFk6ICAgLm9jdGEgMHhDMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorVFdPT05FOiAub2N0YSAweDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCisKKyMgb3JkZXIgb2YgdGhlc2UgY29uc3RhbnRzIHNob3VsZCBub3QgY2hhbmdlLgorIyBtb3JlIHNwZWNpZmljYWxseSwgQUxMX0Ygc2hvdWxkIGZvbGxvdyBTSElGVF9NQVNLLAorIyBhbmQgWkVSTyBzaG91bGQgZm9sbG93IEFMTF9GCisKK1NIVUZfTUFTSzogIC5vY3RhIDB4MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYKK01BU0sxOiAgICAgIC5vY3RhIDB4MDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmYKK01BU0syOiAgICAgIC5vY3RhIDB4ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDAKK1NISUZUX01BU0s6IC5vY3RhIDB4MGYwZTBkMGMwYjBhMDkwODA3MDYwNTA0MDMwMjAxMDAKK0FMTF9GOiAgICAgIC5vY3RhIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKK1pFUk86ICAgICAgIC5vY3RhIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK09ORTogICAgICAgIC5vY3RhIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK0ZfTUlOX01BU0s6IC5vY3RhIDB4ZjFmMmYzZjRmNWY2ZjdmOGY5ZmFmYmZjZmRmZWZmMAorZGVjOiAgICAgICAgLm9jdGEgMHgxCitlbmM6ICAgICAgICAub2N0YSAweDIKKworCiAudGV4dAogCisKKyNkZWZpbmUJU1RBQ0tfT0ZGU0VUICAgIDgqMworI2RlZmluZQlIYXNoS2V5CQkxNiowCS8vIHN0b3JlIEhhc2hLZXkgPDwxIG1vZCBwb2x5IGhlcmUKKyNkZWZpbmUJSGFzaEtleV8yCTE2KjEJLy8gc3RvcmUgSGFzaEtleV4yIDw8MSBtb2QgcG9seSBoZXJlCisjZGVmaW5lCUhhc2hLZXlfMwkxNioyCS8vIHN0b3JlIEhhc2hLZXleMyA8PDEgbW9kIHBvbHkgaGVyZQorI2RlZmluZQlIYXNoS2V5XzQJMTYqMwkvLyBzdG9yZSBIYXNoS2V5XjQgPDwxIG1vZCBwb2x5IGhlcmUKKyNkZWZpbmUJSGFzaEtleV9rCTE2KjQJLy8gc3RvcmUgWE9SIG9mIEhpZ2ggNjQgYml0cyBhbmQgTG93IDY0CisJCQkJLy8gYml0cyBvZiAgSGFzaEtleSA8PDEgbW9kIHBvbHkgaGVyZQorCQkJCS8vKGZvciBLYXJhdHN1YmEgcHVycG9zZXMpCisjZGVmaW5lCUhhc2hLZXlfMl9rCTE2KjUJLy8gc3RvcmUgWE9SIG9mIEhpZ2ggNjQgYml0cyBhbmQgTG93IDY0CisJCQkJLy8gYml0cyBvZiAgSGFzaEtleV4yIDw8MSBtb2QgcG9seSBoZXJlCisJCQkJLy8gKGZvciBLYXJhdHN1YmEgcHVycG9zZXMpCisjZGVmaW5lCUhhc2hLZXlfM19rCTE2KjYJLy8gc3RvcmUgWE9SIG9mIEhpZ2ggNjQgYml0cyBhbmQgTG93IDY0CisJCQkJLy8gYml0cyBvZiAgSGFzaEtleV4zIDw8MSBtb2QgcG9seSBoZXJlCisJCQkJLy8gKGZvciBLYXJhdHN1YmEgcHVycG9zZXMpCisjZGVmaW5lCUhhc2hLZXlfNF9rCTE2KjcJLy8gc3RvcmUgWE9SIG9mIEhpZ2ggNjQgYml0cyBhbmQgTG93IDY0CisJCQkJLy8gYml0cyBvZiAgSGFzaEtleV40IDw8MSBtb2QgcG9seSBoZXJlCisJCQkJLy8gKGZvciBLYXJhdHN1YmEgcHVycG9zZXMpCisjZGVmaW5lCVZBUklBQkxFX09GRlNFVAkxNio4CisKKyNkZWZpbmUgYXJnMSByZGkKKyNkZWZpbmUgYXJnMiByc2kKKyNkZWZpbmUgYXJnMyByZHgKKyNkZWZpbmUgYXJnNCByY3gKKyNkZWZpbmUgYXJnNSByOAorI2RlZmluZSBhcmc2IHI5CisjZGVmaW5lIGFyZzcgU1RBQ0tfT0ZGU0VUKzgoJXIxNCkKKyNkZWZpbmUgYXJnOCBTVEFDS19PRkZTRVQrMTYoJXIxNCkKKyNkZWZpbmUgYXJnOSBTVEFDS19PRkZTRVQrMjQoJXIxNCkKKyNkZWZpbmUgYXJnMTAgU1RBQ0tfT0ZGU0VUKzMyKCVyMTQpCisjZW5kaWYKKworCiAjZGVmaW5lIFNUQVRFMQkleG1tMAogI2RlZmluZSBTVEFURTIJJXhtbTQKICNkZWZpbmUgU1RBVEUzCSV4bW01CkBAIC0zMiwxMiArMTAwLDE2IEBACiAjZGVmaW5lIElOCUlOMQogI2RlZmluZSBLRVkJJXhtbTIKICNkZWZpbmUgSVYJJXhtbTMKKwogI2RlZmluZSBCU1dBUF9NQVNLICV4bW0xMAogI2RlZmluZSBDVFIJJXhtbTExCiAjZGVmaW5lIElOQwkleG1tMTIKIAorI2lmZGVmIF9feDg2XzY0X18KKyNkZWZpbmUgQVJFRwklcmF4CiAjZGVmaW5lIEtFWVAJJXJkaQogI2RlZmluZSBPVVRQCSVyc2kKKyNkZWZpbmUgVUtFWVAJT1VUUAogI2RlZmluZSBJTlAJJXJkeAogI2RlZmluZSBMRU4JJXJjeAogI2RlZmluZSBJVlAJJXI4CkBAIC00Niw2ICsxMTgsMTU4OCBAQAogI2RlZmluZSBUS0VZUAlUMQogI2RlZmluZSBUMgklcjExCiAjZGVmaW5lIFRDVFJfTE9XIFQyCisjZWxzZQorI2RlZmluZSBBUkVHCSVlYXgKKyNkZWZpbmUgS0VZUAklZWRpCisjZGVmaW5lIE9VVFAJQVJFRworI2RlZmluZSBVS0VZUAlPVVRQCisjZGVmaW5lIElOUAklZWR4CisjZGVmaW5lIExFTgklZXNpCisjZGVmaW5lIElWUAklZWJwCisjZGVmaW5lIEtMRU4JJWVieAorI2RlZmluZSBUMQklZWN4CisjZGVmaW5lIFRLRVlQCVQxCisjZW5kaWYKKworCisjaWZkZWYgX194ODZfNjRfXworLyogR0hBU0hfTVVMIE1BQ1JPIHRvIGltcGxlbWVudDogRGF0YSpIYXNoS2V5IG1vZCAoMTI4LDEyNywxMjYsMTIxLDApCisqCisqCisqIElucHV0OiBBIGFuZCBCICgxMjgtYml0cyBlYWNoLCBiaXQtcmVmbGVjdGVkKQorKiBPdXRwdXQ6IEMgPSBBKkIqeCBtb2QgcG9seSwgKGkuZS4gPj4xICkKKyogVG8gY29tcHV0ZSBHSCA9IEdIKkhhc2hLZXkgbW9kIHBvbHksIGdpdmUgSEsgPSBIYXNoS2V5PDwxIG1vZCBwb2x5IGFzIGlucHV0CisqIEdIID0gR0ggKiBISyAqIHggbW9kIHBvbHkgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBHSCpIYXNoS2V5IG1vZCBwb2x5LgorKgorKi8KKy5tYWNybyBHSEFTSF9NVUwgR0ggSEsgVE1QMSBUTVAyIFRNUDMgVE1QNCBUTVA1CisJbW92ZHFhCSAgXEdILCBcVE1QMQorCXBzaHVmZAkgICQ3OCwgXEdILCBcVE1QMgorCXBzaHVmZAkgICQ3OCwgXEhLLCBcVE1QMworCXB4b3IJICBcR0gsIFxUTVAyICAgICAgICAgICAgIyBUTVAyID0gYTErYTAKKwlweG9yCSAgXEhLLCBcVE1QMyAgICAgICAgICAgICMgVE1QMyA9IGIxK2IwCisJUENMTVVMUURRIDB4MTEsIFxISywgXFRNUDEgICAgICMgVE1QMSA9IGExKmIxCisJUENMTVVMUURRIDB4MDAsIFxISywgXEdIICAgICAgICMgR0ggPSBhMCpiMAorCVBDTE1VTFFEUSAweDAwLCBcVE1QMywgXFRNUDIgICAjIFRNUDIgPSAoYTArYTEpKihiMStiMCkKKwlweG9yCSAgXEdILCBcVE1QMgorCXB4b3IJICBcVE1QMSwgXFRNUDIgICAgICAgICAgIyBUTVAyID0gKGEwKmIwKSsoYTEqYjApCisJbW92ZHFhCSAgXFRNUDIsIFxUTVAzCisJcHNsbGRxCSAgJDgsIFxUTVAzICAgICAgICAgICAgICMgbGVmdCBzaGlmdCBUTVAzIDIgRFdzCisJcHNybGRxCSAgJDgsIFxUTVAyICAgICAgICAgICAgICMgcmlnaHQgc2hpZnQgVE1QMiAyIERXcworCXB4b3IJICBcVE1QMywgXEdICisJcHhvcgkgIFxUTVAyLCBcVE1QMSAgICAgICAgICAjIFRNUDI6R0ggaG9sZHMgdGhlIHJlc3VsdCBvZiBHSCpISworCisgICAgICAgICMgZmlyc3QgcGhhc2Ugb2YgdGhlIHJlZHVjdGlvbgorCisJbW92ZHFhICAgIFxHSCwgXFRNUDIKKwltb3ZkcWEgICAgXEdILCBcVE1QMworCW1vdmRxYSAgICBcR0gsIFxUTVA0ICAgICAgICAgICAgIyBjb3B5IEdIIGludG8gVE1QMixUTVAzIGFuZCBUTVA0CisJCQkJCSMgaW4gaW4gb3JkZXIgdG8gcGVyZm9ybQorCQkJCQkjIGluZGVwZW5kZW50IHNoaWZ0cworCXBzbGxkICAgICAkMzEsIFxUTVAyICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnQgPDwzMQorCXBzbGxkICAgICAkMzAsIFxUTVAzICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnQgPDwzMAorCXBzbGxkICAgICAkMjUsIFxUTVA0ICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnQgPDwyNQorCXB4b3IgICAgICBcVE1QMywgXFRNUDIgICAgICAgICAgIyB4b3IgdGhlIHNoaWZ0ZWQgdmVyc2lvbnMKKwlweG9yICAgICAgXFRNUDQsIFxUTVAyCisJbW92ZHFhICAgIFxUTVAyLCBcVE1QNQorCXBzcmxkcSAgICAkNCwgXFRNUDUgICAgICAgICAgICAgIyByaWdodCBzaGlmdCBUTVA1IDEgRFcKKwlwc2xsZHEgICAgJDEyLCBcVE1QMiAgICAgICAgICAgICMgbGVmdCBzaGlmdCBUTVAyIDMgRFdzCisJcHhvciAgICAgIFxUTVAyLCBcR0gKKworICAgICAgICAjIHNlY29uZCBwaGFzZSBvZiB0aGUgcmVkdWN0aW9uCisKKwltb3ZkcWEgICAgXEdILFxUTVAyICAgICAgICAgICAgICMgY29weSBHSCBpbnRvIFRNUDIsVE1QMyBhbmQgVE1QNAorCQkJCQkjIGluIGluIG9yZGVyIHRvIHBlcmZvcm0KKwkJCQkJIyBpbmRlcGVuZGVudCBzaGlmdHMKKwltb3ZkcWEgICAgXEdILFxUTVAzCisJbW92ZHFhICAgIFxHSCxcVE1QNAorCXBzcmxkICAgICAkMSxcVE1QMiAgICAgICAgICAgICAgIyBwYWNrZWQgbGVmdCBzaGlmdCA+PjEKKwlwc3JsZCAgICAgJDIsXFRNUDMgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj4yCisJcHNybGQgICAgICQ3LFxUTVA0ICAgICAgICAgICAgICAjIHBhY2tlZCBsZWZ0IHNoaWZ0ID4+NworCXB4b3IgICAgICBcVE1QMyxcVE1QMgkJIyB4b3IgdGhlIHNoaWZ0ZWQgdmVyc2lvbnMKKwlweG9yICAgICAgXFRNUDQsXFRNUDIKKwlweG9yICAgICAgXFRNUDUsIFxUTVAyCisJcHhvciAgICAgIFxUTVAyLCBcR0gKKwlweG9yICAgICAgXFRNUDEsIFxHSCAgICAgICAgICAgICMgcmVzdWx0IGlzIGluIFRNUDEKKy5lbmRtCisKKy8qCisqIGlmIGEgPSBudW1iZXIgb2YgdG90YWwgcGxhaW50ZXh0IGJ5dGVzCisqIGIgPSBmbG9vcihhLzE2KQorKiBudW1faW5pdGlhbF9ibG9ja3MgPSBiIG1vZCA0CisqIGVuY3J5cHQgdGhlIGluaXRpYWwgbnVtX2luaXRpYWxfYmxvY2tzIGJsb2NrcyBhbmQgYXBwbHkgZ2hhc2ggb24KKyogdGhlIGNpcGhlcnRleHQKKyogJXIxMCwgJXIxMSwgJXIxMiwgJXJheCwgJXhtbTUsICV4bW02LCAleG1tNywgJXhtbTgsICV4bW05IHJlZ2lzdGVycworKiBhcmUgY2xvYmJlcmVkCisqIGFyZzEsICVhcmcyLCAlYXJnMywgJXIxNCBhcmUgdXNlZCBhcyBhIHBvaW50ZXIgb25seSwgbm90IG1vZGlmaWVkCisqLworCisKKy5tYWNybyBJTklUSUFMX0JMT0NLU19ERUMgbnVtX2luaXRpYWxfYmxvY2tzIFRNUDEgVE1QMiBUTVAzIFRNUDQgVE1QNSBYTU0wIFhNTTEgXAorWE1NMiBYTU0zIFhNTTQgWE1NRHN0IFRNUDYgVE1QNyBpIGlfc2VxIG9wZXJhdGlvbgorCW1vdgkgICBhcmc3LCAlcjEwICAgICAgICAgICAjICVyMTAgPSBBQUQKKwltb3YJICAgYXJnOCwgJXIxMiAgICAgICAgICAgIyAlcjEyID0gYWFkTGVuCisJbW92CSAgICVyMTIsICVyMTEKKwlweG9yCSAgICV4bW1caSwgJXhtbVxpCitfZ2V0X0FBRF9sb29wXG51bV9pbml0aWFsX2Jsb2Nrc1xvcGVyYXRpb246CisJbW92ZAkgICAoJXIxMCksIFxUTVAxCisJcHNsbGRxCSAgICQxMiwgXFRNUDEKKwlwc3JsZHEJICAgJDQsICV4bW1caQorCXB4b3IJICAgXFRNUDEsICV4bW1caQorCWFkZAkgICAkNCwgJXIxMAorCXN1YgkgICAkNCwgJXIxMgorCWpuZQkgICBfZ2V0X0FBRF9sb29wXG51bV9pbml0aWFsX2Jsb2Nrc1xvcGVyYXRpb24KKwljbXAJICAgJDE2LCAlcjExCisJamUJICAgX2dldF9BQURfbG9vcDJfZG9uZVxudW1faW5pdGlhbF9ibG9ja3Ncb3BlcmF0aW9uCisJbW92CSAgICQxNiwgJXIxMgorX2dldF9BQURfbG9vcDJcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbjoKKwlwc3JsZHEJICAgJDQsICV4bW1caQorCXN1YgkgICAkNCwgJXIxMgorCWNtcAkgICAlcjExLCAlcjEyCisJam5lCSAgIF9nZXRfQUFEX2xvb3AyXG51bV9pbml0aWFsX2Jsb2Nrc1xvcGVyYXRpb24KK19nZXRfQUFEX2xvb3AyX2RvbmVcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbjoKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gICAleG1tMTQsICV4bW1caSAjIGJ5dGUtcmVmbGVjdCB0aGUgQUFEIGRhdGEKKworCXhvcgkgICAlcjExLCAlcjExICMgaW5pdGlhbGlzZSB0aGUgZGF0YSBwb2ludGVyIG9mZnNldCBhcyB6ZXJvCisKKyAgICAgICAgIyBzdGFydCBBRVMgZm9yIG51bV9pbml0aWFsX2Jsb2NrcyBibG9ja3MKKworCW1vdgkgICAlYXJnNSwgJXJheCAgICAgICAgICAgICAgICAgICAgICAjICVyYXggPSAqWTAKKwltb3ZkcXUJICAgKCVyYXgpLCBcWE1NMCAgICAgICAgICAgICAgICAgICAgIyBYTU0wID0gWTAKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gICAleG1tMTQsIFxYTU0wCisKKy5pZiAoXGkgPT0gNSkgfHwgKFxpID09IDYpIHx8IChcaSA9PSA3KQorLmlycGMgaW5kZXgsIFxpX3NlcQorCXBhZGRkCSAgIE9ORSglcmlwKSwgXFhNTTAgICAgICAgICAgICAgICAgICMgSU5DUiBZMAorCW1vdmRxYQkgICBcWE1NMCwgJXhtbVxpbmRleAorICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAgICV4bW0xNCwgJXhtbVxpbmRleCAgICAgICMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCXB4b3IJICAgMTYqMCglYXJnMSksICV4bW1caW5kZXgKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4MTAoJXJkaSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDEKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4MjAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweDMwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMgorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHg0MCglYXJnMSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDIKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4NTAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweDYwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMgorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHg3MCglYXJnMSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDIKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4ODAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweDkwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMgorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHhhMCglYXJnMSksIFxUTVAxCisJQUVTRU5DTEFTVCBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICMgUm91bmQgMTAKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92ZHF1CSAgICglYXJnMyAsICVyMTEsIDEpLCBcVE1QMQorCXB4b3IJICAgXFRNUDEsICV4bW1caW5kZXgKKwltb3ZkcXUJICAgJXhtbVxpbmRleCwgKCVhcmcyICwgJXIxMSwgMSkKKwkjIHdyaXRlIGJhY2sgcGxhaW50ZXh0L2NpcGhlcnRleHQgZm9yIG51bV9pbml0aWFsX2Jsb2NrcworCWFkZAkgICAkMTYsICVyMTEKKworCW1vdmRxYSAgICAgXFRNUDEsICV4bW1caW5kZXgKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0JICAgJXhtbTE0LCAleG1tXGluZGV4CisKKwkJIyBwcmVwYXJlIHBsYWludGV4dC9jaXBoZXJ0ZXh0IGZvciBHSEFTSCBjb21wdXRhdGlvbgorLmVuZHIKKy5lbmRpZgorCUdIQVNIX01VTCAgJXhtbVxpLCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDUsIFxYTU0xCisgICAgICAgICMgYXBwbHkgR0hBU0ggb24gbnVtX2luaXRpYWxfYmxvY2tzIGJsb2NrcworCisuaWYgXGkgPT0gNQorICAgICAgICBweG9yICAgICAgICV4bW01LCAleG1tNgorCUdIQVNIX01VTCAgJXhtbTYsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNSwgXFhNTTEKKyAgICAgICAgcHhvciAgICAgICAleG1tNiwgJXhtbTcKKwlHSEFTSF9NVUwgICV4bW03LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDUsIFxYTU0xCisgICAgICAgIHB4b3IgICAgICAgJXhtbTcsICV4bW04CisJR0hBU0hfTVVMICAleG1tOCwgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA1LCBcWE1NMQorLmVsc2VpZiBcaSA9PSA2CisgICAgICAgIHB4b3IgICAgICAgJXhtbTYsICV4bW03CisJR0hBU0hfTVVMICAleG1tNywgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA1LCBcWE1NMQorICAgICAgICBweG9yICAgICAgICV4bW03LCAleG1tOAorCUdIQVNIX01VTCAgJXhtbTgsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNSwgXFhNTTEKKy5lbHNlaWYgXGkgPT0gNworICAgICAgICBweG9yICAgICAgICV4bW03LCAleG1tOAorCUdIQVNIX01VTCAgJXhtbTgsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNSwgXFhNTTEKKy5lbmRpZgorCWNtcAkgICAkNjQsICVyMTMKKwlqbAlfaW5pdGlhbF9ibG9ja3NfZG9uZVxudW1faW5pdGlhbF9ibG9ja3Ncb3BlcmF0aW9uCisJIyBubyBuZWVkIGZvciBwcmVjb21wdXRlZCB2YWx1ZXMKKy8qCisqCisqIFByZWNvbXB1dGF0aW9ucyBmb3IgSGFzaEtleSBwYXJhbGxlbCB3aXRoIGVuY3J5cHRpb24gb2YgZmlyc3QgNCBibG9ja3MuCisqIEhhc2tleV9pX2sgaG9sZHMgWE9SZWQgdmFsdWVzIG9mIHRoZSBsb3cgYW5kIGhpZ2ggcGFydHMgb2YgdGhlIEhhc2tleV9pCisqLworCXBhZGRkCSAgIE9ORSglcmlwKSwgXFhNTTAgICAgICAgICAgICAgICMgSU5DUiBZMAorCW1vdmRxYQkgICBcWE1NMCwgXFhNTTEKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gICV4bW0xNCwgXFhNTTEgICAgICAgICMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisJcGFkZGQJICAgT05FKCVyaXApLCBcWE1NMCAgICAgICAgICAgICAgIyBJTkNSIFkwCisJbW92ZHFhCSAgIFxYTU0wLCBcWE1NMgorICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAgJXhtbTE0LCBcWE1NMiAgICAgICAgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKKwlwYWRkZAkgICBPTkUoJXJpcCksIFxYTU0wICAgICAgICAgICAgICAjIElOQ1IgWTAKKwltb3ZkcWEJICAgXFhNTTAsIFxYTU0zCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICV4bW0xNCwgXFhNTTMgICAgICAgICMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisJcGFkZGQJICAgT05FKCVyaXApLCBcWE1NMCAgICAgICAgICAgICAgIyBJTkNSIFkwCisJbW92ZHFhCSAgIFxYTU0wLCBcWE1NNAorICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAleG1tMTQsIFxYTU00ICAgICAgICAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKworCXB4b3IJICAgMTYqMCglYXJnMSksIFxYTU0xCisJcHhvcgkgICAxNiowKCVhcmcxKSwgXFhNTTIKKwlweG9yCSAgIDE2KjAoJWFyZzEpLCBcWE1NMworCXB4b3IJICAgMTYqMCglYXJnMSksIFxYTU00CisJbW92ZHFhCSAgIFxUTVAzLCBcVE1QNQorCXBzaHVmZAkgICAkNzgsIFxUTVAzLCBcVE1QMQorCXB4b3IJICAgXFRNUDMsIFxUTVAxCisJbW92ZHFhCSAgIFxUTVAxLCBIYXNoS2V5X2soJXJzcCkKKwlHSEFTSF9NVUwgIFxUTVA1LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDYsIFxUTVA3CisjIFRNUDUgPSBIYXNoS2V5XjI8PDEgKG1vZCBwb2x5KQorCW1vdmRxYQkgICBcVE1QNSwgSGFzaEtleV8yKCVyc3ApCisjIEhhc2hLZXlfMiA9IEhhc2hLZXleMjw8MSAobW9kIHBvbHkpCisJcHNodWZkCSAgICQ3OCwgXFRNUDUsIFxUTVAxCisJcHhvcgkgICBcVE1QNSwgXFRNUDEKKwltb3ZkcWEJICAgXFRNUDEsIEhhc2hLZXlfMl9rKCVyc3ApCisuaXJwYyBpbmRleCwgMTIzNCAjIGRvIDQgcm91bmRzCisJbW92YXBzIDB4MTAqXGluZGV4KCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU0xCisJQUVTRU5DCSAgIFxUTVAxLCBcWE1NMgorCUFFU0VOQwkgICBcVE1QMSwgXFhNTTMKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU00CisuZW5kcgorCUdIQVNIX01VTCAgXFRNUDUsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNiwgXFRNUDcKKyMgVE1QNSA9IEhhc2hLZXleMzw8MSAobW9kIHBvbHkpCisJbW92ZHFhCSAgIFxUTVA1LCBIYXNoS2V5XzMoJXJzcCkKKwlwc2h1ZmQJICAgJDc4LCBcVE1QNSwgXFRNUDEKKwlweG9yCSAgIFxUTVA1LCBcVE1QMQorCW1vdmRxYQkgICBcVE1QMSwgSGFzaEtleV8zX2soJXJzcCkKKy5pcnBjIGluZGV4LCA1Njc4OSAjIGRvIG5leHQgNSByb3VuZHMKKwltb3ZhcHMgMHgxMCpcaW5kZXgoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwkgICBcVE1QMSwgXFhNTTEKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU0yCisJQUVTRU5DCSAgIFxUTVAxLCBcWE1NMworCUFFU0VOQwkgICBcVE1QMSwgXFhNTTQKKy5lbmRyCisJR0hBU0hfTVVMICBcVE1QNSwgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA2LCBcVE1QNworIyBUTVA1ID0gSGFzaEtleV4zPDwxIChtb2QgcG9seSkKKwltb3ZkcWEJICAgXFRNUDUsIEhhc2hLZXlfNCglcnNwKQorCXBzaHVmZAkgICAkNzgsIFxUTVA1LCBcVE1QMQorCXB4b3IJICAgXFRNUDUsIFxUTVAxCisJbW92ZHFhCSAgIFxUTVAxLCBIYXNoS2V5XzRfayglcnNwKQorCW1vdmFwcyAweGEwKCVhcmcxKSwgXFRNUDIKKwlBRVNFTkNMQVNUIFxUTVAyLCBcWE1NMQorCUFFU0VOQ0xBU1QgXFRNUDIsIFxYTU0yCisJQUVTRU5DTEFTVCBcVE1QMiwgXFhNTTMKKwlBRVNFTkNMQVNUIFxUTVAyLCBcWE1NNAorCW1vdmRxdQkgICAxNiowKCVhcmczICwgJXIxMSAsIDEpLCBcVE1QMQorCXB4b3IJICAgXFRNUDEsIFxYTU0xCisJbW92ZHF1CSAgIFxYTU0xLCAxNiowKCVhcmcyICwgJXIxMSAsIDEpCisJbW92ZHFhICAgICBcVE1QMSwgXFhNTTEKKwltb3ZkcXUJICAgMTYqMSglYXJnMyAsICVyMTEgLCAxKSwgXFRNUDEKKwlweG9yCSAgIFxUTVAxLCBcWE1NMgorCW1vdmRxdQkgICBcWE1NMiwgMTYqMSglYXJnMiAsICVyMTEgLCAxKQorCW1vdmRxYSAgICAgXFRNUDEsIFxYTU0yCisJbW92ZHF1CSAgIDE2KjIoJWFyZzMgLCAlcjExICwgMSksIFxUTVAxCisJcHhvcgkgICBcVE1QMSwgXFhNTTMKKwltb3ZkcXUJICAgXFhNTTMsIDE2KjIoJWFyZzIgLCAlcjExICwgMSkKKwltb3ZkcWEgICAgIFxUTVAxLCBcWE1NMworCW1vdmRxdQkgICAxNiozKCVhcmczICwgJXIxMSAsIDEpLCBcVE1QMQorCXB4b3IJICAgXFRNUDEsIFxYTU00CisJbW92ZHF1CSAgIFxYTU00LCAxNiozKCVhcmcyICwgJXIxMSAsIDEpCisJbW92ZHFhICAgICBcVE1QMSwgXFhNTTQKKwlhZGQJICAgJDY0LCAlcjExCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICV4bW0xNCwgXFhNTTEgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisJcHhvcgkgICBcWE1NRHN0LCBcWE1NMQorIyBjb21iaW5lIEdIQVNIZWQgdmFsdWUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBjaXBoZXJ0ZXh0CisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICV4bW0xNCwgXFhNTTIgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICV4bW0xNCwgXFhNTTMgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICV4bW0xNCwgXFhNTTQgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKK19pbml0aWFsX2Jsb2Nrc19kb25lXG51bV9pbml0aWFsX2Jsb2Nrc1xvcGVyYXRpb246CisKKy5lbmRtCisKKworLyoKKyogaWYgYSA9IG51bWJlciBvZiB0b3RhbCBwbGFpbnRleHQgYnl0ZXMKKyogYiA9IGZsb29yKGEvMTYpCisqIG51bV9pbml0aWFsX2Jsb2NrcyA9IGIgbW9kIDQKKyogZW5jcnlwdCB0aGUgaW5pdGlhbCBudW1faW5pdGlhbF9ibG9ja3MgYmxvY2tzIGFuZCBhcHBseSBnaGFzaCBvbgorKiB0aGUgY2lwaGVydGV4dAorKiAlcjEwLCAlcjExLCAlcjEyLCAlcmF4LCAleG1tNSwgJXhtbTYsICV4bW03LCAleG1tOCwgJXhtbTkgcmVnaXN0ZXJzCisqIGFyZSBjbG9iYmVyZWQKKyogYXJnMSwgJWFyZzIsICVhcmczLCAlcjE0IGFyZSB1c2VkIGFzIGEgcG9pbnRlciBvbmx5LCBub3QgbW9kaWZpZWQKKyovCisKKworLm1hY3JvIElOSVRJQUxfQkxPQ0tTX0VOQyBudW1faW5pdGlhbF9ibG9ja3MgVE1QMSBUTVAyIFRNUDMgVE1QNCBUTVA1IFhNTTAgWE1NMSBcCitYTU0yIFhNTTMgWE1NNCBYTU1Ec3QgVE1QNiBUTVA3IGkgaV9zZXEgb3BlcmF0aW9uCisJbW92CSAgIGFyZzcsICVyMTAgICAgICAgICAgICMgJXIxMCA9IEFBRAorCW1vdgkgICBhcmc4LCAlcjEyICAgICAgICAgICAjICVyMTIgPSBhYWRMZW4KKwltb3YJICAgJXIxMiwgJXIxMQorCXB4b3IJICAgJXhtbVxpLCAleG1tXGkKK19nZXRfQUFEX2xvb3BcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbjoKKwltb3ZkCSAgICglcjEwKSwgXFRNUDEKKwlwc2xsZHEJICAgJDEyLCBcVE1QMQorCXBzcmxkcQkgICAkNCwgJXhtbVxpCisJcHhvcgkgICBcVE1QMSwgJXhtbVxpCisJYWRkCSAgICQ0LCAlcjEwCisJc3ViCSAgICQ0LCAlcjEyCisJam5lCSAgIF9nZXRfQUFEX2xvb3BcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbgorCWNtcAkgICAkMTYsICVyMTEKKwlqZQkgICBfZ2V0X0FBRF9sb29wMl9kb25lXG51bV9pbml0aWFsX2Jsb2Nrc1xvcGVyYXRpb24KKwltb3YJICAgJDE2LCAlcjEyCitfZ2V0X0FBRF9sb29wMlxudW1faW5pdGlhbF9ibG9ja3Ncb3BlcmF0aW9uOgorCXBzcmxkcQkgICAkNCwgJXhtbVxpCisJc3ViCSAgICQ0LCAlcjEyCisJY21wCSAgICVyMTEsICVyMTIKKwlqbmUJICAgX2dldF9BQURfbG9vcDJcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbgorX2dldF9BQURfbG9vcDJfZG9uZVxudW1faW5pdGlhbF9ibG9ja3Ncb3BlcmF0aW9uOgorICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAgICV4bW0xNCwgJXhtbVxpICMgYnl0ZS1yZWZsZWN0IHRoZSBBQUQgZGF0YQorCisJeG9yCSAgICVyMTEsICVyMTEgIyBpbml0aWFsaXNlIHRoZSBkYXRhIHBvaW50ZXIgb2Zmc2V0IGFzIHplcm8KKworICAgICAgICAjIHN0YXJ0IEFFUyBmb3IgbnVtX2luaXRpYWxfYmxvY2tzIGJsb2NrcworCisJbW92CSAgICVhcmc1LCAlcmF4ICAgICAgICAgICAgICAgICAgICAgICMgJXJheCA9ICpZMAorCW1vdmRxdQkgICAoJXJheCksIFxYTU0wICAgICAgICAgICAgICAgICAgICAjIFhNTTAgPSBZMAorICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAgICV4bW0xNCwgXFhNTTAKKworLmlmIChcaSA9PSA1KSB8fCAoXGkgPT0gNikgfHwgKFxpID09IDcpCisuaXJwYyBpbmRleCwgXGlfc2VxCisJcGFkZGQJICAgT05FKCVyaXApLCBcWE1NMCAgICAgICAgICAgICAgICAgIyBJTkNSIFkwCisJbW92ZHFhCSAgIFxYTU0wLCAleG1tXGluZGV4CisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICAgJXhtbTE0LCAleG1tXGluZGV4ICAgICAgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJcHhvcgkgICAxNiowKCVhcmcxKSwgJXhtbVxpbmRleAorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHgxMCglcmRpKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMQorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHgyMCglYXJnMSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDIKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4MzAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweDQwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMgorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHg1MCglYXJnMSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDIKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4NjAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweDcwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMgICAgIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgICMgUm91bmQgMgorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZhcHMgMHg4MCglYXJnMSksIFxUTVAxCisJQUVTRU5DICAgICBcVE1QMSwgJXhtbVxpbmRleCAgICAgICAgICAjIFJvdW5kIDIKKy5lbmRyCisuaXJwYyBpbmRleCwgXGlfc2VxCisJbW92YXBzIDB4OTAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQyAgICAgXFRNUDEsICV4bW1caW5kZXggICAgICAgICAgIyBSb3VuZCAyCisuZW5kcgorLmlycGMgaW5kZXgsIFxpX3NlcQorCW1vdmFwcyAweGEwKCVhcmcxKSwgXFRNUDEKKwlBRVNFTkNMQVNUIFxUTVAxLCAleG1tXGluZGV4ICAgICAgICAgIyBSb3VuZCAxMAorLmVuZHIKKy5pcnBjIGluZGV4LCBcaV9zZXEKKwltb3ZkcXUJICAgKCVhcmczICwgJXIxMSwgMSksIFxUTVAxCisJcHhvcgkgICBcVE1QMSwgJXhtbVxpbmRleAorCW1vdmRxdQkgICAleG1tXGluZGV4LCAoJWFyZzIgLCAlcjExLCAxKQorCSMgd3JpdGUgYmFjayBwbGFpbnRleHQvY2lwaGVydGV4dCBmb3IgbnVtX2luaXRpYWxfYmxvY2tzCisJYWRkCSAgICQxNiwgJXIxMQorCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NCSAgICV4bW0xNCwgJXhtbVxpbmRleAorCisJCSMgcHJlcGFyZSBwbGFpbnRleHQvY2lwaGVydGV4dCBmb3IgR0hBU0ggY29tcHV0YXRpb24KKy5lbmRyCisuZW5kaWYKKwlHSEFTSF9NVUwgICV4bW1caSwgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA1LCBcWE1NMQorICAgICAgICAjIGFwcGx5IEdIQVNIIG9uIG51bV9pbml0aWFsX2Jsb2NrcyBibG9ja3MKKworLmlmIFxpID09IDUKKyAgICAgICAgcHhvciAgICAgICAleG1tNSwgJXhtbTYKKwlHSEFTSF9NVUwgICV4bW02LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDUsIFxYTU0xCisgICAgICAgIHB4b3IgICAgICAgJXhtbTYsICV4bW03CisJR0hBU0hfTVVMICAleG1tNywgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA1LCBcWE1NMQorICAgICAgICBweG9yICAgICAgICV4bW03LCAleG1tOAorCUdIQVNIX01VTCAgJXhtbTgsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNSwgXFhNTTEKKy5lbHNlaWYgXGkgPT0gNgorICAgICAgICBweG9yICAgICAgICV4bW02LCAleG1tNworCUdIQVNIX01VTCAgJXhtbTcsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNSwgXFhNTTEKKyAgICAgICAgcHhvciAgICAgICAleG1tNywgJXhtbTgKKwlHSEFTSF9NVUwgICV4bW04LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDUsIFxYTU0xCisuZWxzZWlmIFxpID09IDcKKyAgICAgICAgcHhvciAgICAgICAleG1tNywgJXhtbTgKKwlHSEFTSF9NVUwgICV4bW04LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDUsIFxYTU0xCisuZW5kaWYKKwljbXAJICAgJDY0LCAlcjEzCisJamwJX2luaXRpYWxfYmxvY2tzX2RvbmVcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbgorCSMgbm8gbmVlZCBmb3IgcHJlY29tcHV0ZWQgdmFsdWVzCisvKgorKgorKiBQcmVjb21wdXRhdGlvbnMgZm9yIEhhc2hLZXkgcGFyYWxsZWwgd2l0aCBlbmNyeXB0aW9uIG9mIGZpcnN0IDQgYmxvY2tzLgorKiBIYXNrZXlfaV9rIGhvbGRzIFhPUmVkIHZhbHVlcyBvZiB0aGUgbG93IGFuZCBoaWdoIHBhcnRzIG9mIHRoZSBIYXNrZXlfaQorKi8KKwlwYWRkZAkgICBPTkUoJXJpcCksIFxYTU0wICAgICAgICAgICAgICAjIElOQ1IgWTAKKwltb3ZkcWEJICAgXFhNTTAsIFxYTU0xCisgICAgICAgIG1vdmRxYSAgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTQKKwlQU0hVRkJfWE1NICAleG1tMTQsIFxYTU0xICAgICAgICAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKworCXBhZGRkCSAgIE9ORSglcmlwKSwgXFhNTTAgICAgICAgICAgICAgICMgSU5DUiBZMAorCW1vdmRxYQkgICBcWE1NMCwgXFhNTTIKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gICV4bW0xNCwgXFhNTTIgICAgICAgICMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisJcGFkZGQJICAgT05FKCVyaXApLCBcWE1NMCAgICAgICAgICAgICAgIyBJTkNSIFkwCisJbW92ZHFhCSAgIFxYTU0wLCBcWE1NMworICAgICAgICBtb3ZkcWEgICAgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTE0CisJUFNIVUZCX1hNTSAleG1tMTQsIFxYTU0zICAgICAgICAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKworCXBhZGRkCSAgIE9ORSglcmlwKSwgXFhNTTAgICAgICAgICAgICAgICMgSU5DUiBZMAorCW1vdmRxYQkgICBcWE1NMCwgXFhNTTQKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gJXhtbTE0LCBcWE1NNCAgICAgICAgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKKwlweG9yCSAgIDE2KjAoJWFyZzEpLCBcWE1NMQorCXB4b3IJICAgMTYqMCglYXJnMSksIFxYTU0yCisJcHhvcgkgICAxNiowKCVhcmcxKSwgXFhNTTMKKwlweG9yCSAgIDE2KjAoJWFyZzEpLCBcWE1NNAorCW1vdmRxYQkgICBcVE1QMywgXFRNUDUKKwlwc2h1ZmQJICAgJDc4LCBcVE1QMywgXFRNUDEKKwlweG9yCSAgIFxUTVAzLCBcVE1QMQorCW1vdmRxYQkgICBcVE1QMSwgSGFzaEtleV9rKCVyc3ApCisJR0hBU0hfTVVMICBcVE1QNSwgXFRNUDMsIFxUTVAxLCBcVE1QMiwgXFRNUDQsIFxUTVA2LCBcVE1QNworIyBUTVA1ID0gSGFzaEtleV4yPDwxIChtb2QgcG9seSkKKwltb3ZkcWEJICAgXFRNUDUsIEhhc2hLZXlfMiglcnNwKQorIyBIYXNoS2V5XzIgPSBIYXNoS2V5XjI8PDEgKG1vZCBwb2x5KQorCXBzaHVmZAkgICAkNzgsIFxUTVA1LCBcVE1QMQorCXB4b3IJICAgXFRNUDUsIFxUTVAxCisJbW92ZHFhCSAgIFxUTVAxLCBIYXNoS2V5XzJfayglcnNwKQorLmlycGMgaW5kZXgsIDEyMzQgIyBkbyA0IHJvdW5kcworCW1vdmFwcyAweDEwKlxpbmRleCglYXJnMSksIFxUTVAxCisJQUVTRU5DCSAgIFxUTVAxLCBcWE1NMQorCUFFU0VOQwkgICBcVE1QMSwgXFhNTTIKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU0zCisJQUVTRU5DCSAgIFxUTVAxLCBcWE1NNAorLmVuZHIKKwlHSEFTSF9NVUwgIFxUTVA1LCBcVE1QMywgXFRNUDEsIFxUTVAyLCBcVE1QNCwgXFRNUDYsIFxUTVA3CisjIFRNUDUgPSBIYXNoS2V5XjM8PDEgKG1vZCBwb2x5KQorCW1vdmRxYQkgICBcVE1QNSwgSGFzaEtleV8zKCVyc3ApCisJcHNodWZkCSAgICQ3OCwgXFRNUDUsIFxUTVAxCisJcHhvcgkgICBcVE1QNSwgXFRNUDEKKwltb3ZkcWEJICAgXFRNUDEsIEhhc2hLZXlfM19rKCVyc3ApCisuaXJwYyBpbmRleCwgNTY3ODkgIyBkbyBuZXh0IDUgcm91bmRzCisJbW92YXBzIDB4MTAqXGluZGV4KCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU0xCisJQUVTRU5DCSAgIFxUTVAxLCBcWE1NMgorCUFFU0VOQwkgICBcVE1QMSwgXFhNTTMKKwlBRVNFTkMJICAgXFRNUDEsIFxYTU00CisuZW5kcgorCUdIQVNIX01VTCAgXFRNUDUsIFxUTVAzLCBcVE1QMSwgXFRNUDIsIFxUTVA0LCBcVE1QNiwgXFRNUDcKKyMgVE1QNSA9IEhhc2hLZXleMzw8MSAobW9kIHBvbHkpCisJbW92ZHFhCSAgIFxUTVA1LCBIYXNoS2V5XzQoJXJzcCkKKwlwc2h1ZmQJICAgJDc4LCBcVE1QNSwgXFRNUDEKKwlweG9yCSAgIFxUTVA1LCBcVE1QMQorCW1vdmRxYQkgICBcVE1QMSwgSGFzaEtleV80X2soJXJzcCkKKwltb3ZhcHMgMHhhMCglYXJnMSksIFxUTVAyCisJQUVTRU5DTEFTVCBcVE1QMiwgXFhNTTEKKwlBRVNFTkNMQVNUIFxUTVAyLCBcWE1NMgorCUFFU0VOQ0xBU1QgXFRNUDIsIFxYTU0zCisJQUVTRU5DTEFTVCBcVE1QMiwgXFhNTTQKKwltb3ZkcXUJICAgMTYqMCglYXJnMyAsICVyMTEgLCAxKSwgXFRNUDEKKwlweG9yCSAgIFxUTVAxLCBcWE1NMQorCW1vdmRxdQkgICAxNioxKCVhcmczICwgJXIxMSAsIDEpLCBcVE1QMQorCXB4b3IJICAgXFRNUDEsIFxYTU0yCisJbW92ZHF1CSAgIDE2KjIoJWFyZzMgLCAlcjExICwgMSksIFxUTVAxCisJcHhvcgkgICBcVE1QMSwgXFhNTTMKKwltb3ZkcXUJICAgMTYqMyglYXJnMyAsICVyMTEgLCAxKSwgXFRNUDEKKwlweG9yCSAgIFxUTVAxLCBcWE1NNAorCW1vdmRxdSAgICAgXFhNTTEsIDE2KjAoJWFyZzIgLCAlcjExICwgMSkKKwltb3ZkcXUgICAgIFxYTU0yLCAxNioxKCVhcmcyICwgJXIxMSAsIDEpCisJbW92ZHF1ICAgICBcWE1NMywgMTYqMiglYXJnMiAsICVyMTEgLCAxKQorCW1vdmRxdSAgICAgXFhNTTQsIDE2KjMoJWFyZzIgLCAlcjExICwgMSkKKworCWFkZAkgICAkNjQsICVyMTEKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gJXhtbTE0LCBcWE1NMSAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlweG9yCSAgIFxYTU1Ec3QsIFxYTU0xCisjIGNvbWJpbmUgR0hBU0hlZCB2YWx1ZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNpcGhlcnRleHQKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gJXhtbTE0LCBcWE1NMiAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gJXhtbTE0LCBcWE1NMyAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKyAgICAgICAgbW92ZHFhICAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNAorCVBTSFVGQl9YTU0gJXhtbTE0LCBcWE1NNCAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKworX2luaXRpYWxfYmxvY2tzX2RvbmVcbnVtX2luaXRpYWxfYmxvY2tzXG9wZXJhdGlvbjoKKworLmVuZG0KKworLyoKKyogZW5jcnlwdCA0IGJsb2NrcyBhdCBhIHRpbWUKKyogZ2hhc2ggdGhlIDQgcHJldmlvdXNseSBlbmNyeXB0ZWQgY2lwaGVydGV4dCBibG9ja3MKKyogYXJnMSwgJWFyZzIsICVhcmczIGFyZSB1c2VkIGFzIHBvaW50ZXJzIG9ubHksIG5vdCBtb2RpZmllZAorKiAlcjExIGlzIHRoZSBkYXRhIG9mZnNldCB2YWx1ZQorKi8KKy5tYWNybyBHSEFTSF80X0VOQ1JZUFRfNF9QQVJBTExFTF9FTkMgVE1QMSBUTVAyIFRNUDMgVE1QNCBUTVA1IFwKK1RNUDYgWE1NMCBYTU0xIFhNTTIgWE1NMyBYTU00IFhNTTUgWE1NNiBYTU03IFhNTTggb3BlcmF0aW9uCisKKwltb3ZkcWEJICBcWE1NMSwgXFhNTTUKKwltb3ZkcWEJICBcWE1NMiwgXFhNTTYKKwltb3ZkcWEJICBcWE1NMywgXFhNTTcKKwltb3ZkcWEJICBcWE1NNCwgXFhNTTgKKworICAgICAgICBtb3ZkcWEgICAgU0hVRl9NQVNLKCVyaXApLCAleG1tMTUKKyAgICAgICAgIyBtdWx0aXBseSBUTVA1ICogSGFzaEtleSB1c2luZyBrYXJhdHN1YmEKKworCW1vdmRxYQkgIFxYTU01LCBcVE1QNAorCXBzaHVmZAkgICQ3OCwgXFhNTTUsIFxUTVA2CisJcHhvcgkgIFxYTU01LCBcVE1QNgorCXBhZGRkICAgICBPTkUoJXJpcCksIFxYTU0wCQkjIElOQ1IgQ05UCisJbW92ZHFhCSAgSGFzaEtleV80KCVyc3ApLCBcVE1QNQorCVBDTE1VTFFEUSAweDExLCBcVE1QNSwgXFRNUDQgICAgICAgICAgICMgVE1QNCA9IGExKmIxCisJbW92ZHFhICAgIFxYTU0wLCBcWE1NMQorCXBhZGRkICAgICBPTkUoJXJpcCksIFxYTU0wCQkjIElOQ1IgQ05UCisJbW92ZHFhICAgIFxYTU0wLCBcWE1NMgorCXBhZGRkICAgICBPTkUoJXJpcCksIFxYTU0wCQkjIElOQ1IgQ05UCisJbW92ZHFhICAgIFxYTU0wLCBcWE1NMworCXBhZGRkICAgICBPTkUoJXJpcCksIFxYTU0wCQkjIElOQ1IgQ05UCisJbW92ZHFhICAgIFxYTU0wLCBcWE1NNAorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NMQkjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxYTU01ICAgICAgICAgICAjIFhNTTUgPSBhMCpiMAorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NMgkjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlQU0hVRkJfWE1NICV4bW0xNSwgXFhNTTMJIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU00CSMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisJcHhvcgkgICglYXJnMSksIFxYTU0xCisJcHhvcgkgICglYXJnMSksIFxYTU0yCisJcHhvcgkgICglYXJnMSksIFxYTU0zCisJcHhvcgkgICglYXJnMSksIFxYTU00CisJbW92ZHFhCSAgSGFzaEtleV80X2soJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MDAsIFxUTVA1LCBcVE1QNiAgICAgICAgICAgIyBUTVA2ID0gKGExK2EwKSooYjErYjApCisJbW92YXBzIDB4MTAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwkgIFxUTVAxLCBcWE1NMSAgICAgICAgICAgICAgIyBSb3VuZCAxCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0yCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0zCisJQUVTRU5DCSAgXFRNUDEsIFxYTU00CisJbW92YXBzIDB4MjAoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwkgIFxUTVAxLCBcWE1NMSAgICAgICAgICAgICAgIyBSb3VuZCAyCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0yCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0zCisJQUVTRU5DCSAgXFRNUDEsIFxYTU00CisJbW92ZHFhCSAgXFhNTTYsIFxUTVAxCisJcHNodWZkCSAgJDc4LCBcWE1NNiwgXFRNUDIKKwlweG9yCSAgXFhNTTYsIFxUTVAyCisJbW92ZHFhCSAgSGFzaEtleV8zKCVyc3ApLCBcVE1QNQorCVBDTE1VTFFEUSAweDExLCBcVE1QNSwgXFRNUDEgICAgICAgICAgICMgVE1QMSA9IGExICogYjEKKwltb3ZhcHMgMHgzMCglYXJnMSksIFxUTVAzCisJQUVTRU5DICAgIFxUTVAzLCBcWE1NMSAgICAgICAgICAgICAgIyBSb3VuZCAzCisJQUVTRU5DICAgIFxUTVAzLCBcWE1NMgorCUFFU0VOQyAgICBcVE1QMywgXFhNTTMKKwlBRVNFTkMgICAgXFRNUDMsIFxYTU00CisJUENMTVVMUURRIDB4MDAsIFxUTVA1LCBcWE1NNiAgICAgICAgICAgIyBYTU02ID0gYTAqYjAKKwltb3ZhcHMgMHg0MCglYXJnMSksIFxUTVAzCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDQKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwltb3ZkcWEJICBIYXNoS2V5XzNfayglcnNwKSwgXFRNUDUKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxUTVAyICAgICAgICAgICAjIFRNUDIgPSAoYTErYTApKihiMStiMCkKKwltb3ZhcHMgMHg1MCglYXJnMSksIFxUTVAzCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDUKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwlweG9yCSAgXFRNUDEsIFxUTVA0CisjIGFjY3VtdWxhdGUgdGhlIHJlc3VsdHMgaW4gVE1QNDpYTU01LCBUTVA2IGhvbGRzIHRoZSBtaWRkbGUgcGFydAorCXB4b3IJICBcWE1NNiwgXFhNTTUKKwlweG9yCSAgXFRNUDIsIFxUTVA2CisJbW92ZHFhCSAgXFhNTTcsIFxUTVAxCisJcHNodWZkCSAgJDc4LCBcWE1NNywgXFRNUDIKKwlweG9yCSAgXFhNTTcsIFxUTVAyCisJbW92ZHFhCSAgSGFzaEtleV8yKCVyc3AgKSwgXFRNUDUKKworICAgICAgICAjIE11bHRpcGx5IFRNUDUgKiBIYXNoS2V5IHVzaW5nIGthcmF0c3ViYQorCisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QMSAgICAgICAgICAgIyBUTVAxID0gYTEqYjEKKwltb3ZhcHMgMHg2MCglYXJnMSksIFxUTVAzCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDYKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxYTU03ICAgICAgICAgICAjIFhNTTcgPSBhMCpiMAorCW1vdmFwcyAweDcwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAgIyBSb3VuZCA3CisJQUVTRU5DCSAgXFRNUDMsIFxYTU0yCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0zCisJQUVTRU5DCSAgXFRNUDMsIFxYTU00CisJbW92ZHFhCSAgSGFzaEtleV8yX2soJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MDAsIFxUTVA1LCBcVE1QMiAgICAgICAgICAgIyBUTVAyID0gKGExK2EwKSooYjErYjApCisJbW92YXBzIDB4ODAoJWFyZzEpLCBcVE1QMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NMSAgICAgICAgICAgICAjIFJvdW5kIDgKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwlweG9yCSAgXFRNUDEsIFxUTVA0CisjIGFjY3VtdWxhdGUgdGhlIHJlc3VsdHMgaW4gVE1QNDpYTU01LCBUTVA2IGhvbGRzIHRoZSBtaWRkbGUgcGFydAorCXB4b3IJICBcWE1NNywgXFhNTTUKKwlweG9yCSAgXFRNUDIsIFxUTVA2CisKKyAgICAgICAgIyBNdWx0aXBseSBYTU04ICogSGFzaEtleQorICAgICAgICAjIFhNTTggYW5kIFRNUDUgaG9sZCB0aGUgdmFsdWVzIGZvciB0aGUgdHdvIG9wZXJhbmRzCisKKwltb3ZkcWEJICBcWE1NOCwgXFRNUDEKKwlwc2h1ZmQJICAkNzgsIFxYTU04LCBcVE1QMgorCXB4b3IJICBcWE1NOCwgXFRNUDIKKwltb3ZkcWEJICBIYXNoS2V5KCVyc3ApLCBcVE1QNQorCVBDTE1VTFFEUSAweDExLCBcVE1QNSwgXFRNUDEgICAgICAgICAgIyBUTVAxID0gYTEqYjEKKwltb3ZhcHMgMHg5MCglYXJnMSksIFxUTVAzCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgIyBSb3VuZCA5CisJQUVTRU5DCSAgXFRNUDMsIFxYTU0yCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0zCisJQUVTRU5DCSAgXFRNUDMsIFxYTU00CisJUENMTVVMUURRIDB4MDAsIFxUTVA1LCBcWE1NOCAgICAgICAgICAjIFhNTTggPSBhMCpiMAorCW1vdmFwcyAweGEwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkNMQVNUIFxUTVAzLCBcWE1NMSAgICAgICAgICAgIyBSb3VuZCAxMAorCUFFU0VOQ0xBU1QgXFRNUDMsIFxYTU0yCisJQUVTRU5DTEFTVCBcVE1QMywgXFhNTTMKKwlBRVNFTkNMQVNUIFxUTVAzLCBcWE1NNAorCW1vdmRxYSAgICBIYXNoS2V5X2soJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MDAsIFxUTVA1LCBcVE1QMiAgICAgICAgICAjIFRNUDIgPSAoYTErYTApKihiMStiMCkKKwltb3ZkcXUJICAoJWFyZzMsJXIxMSwxKSwgXFRNUDMKKwlweG9yCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICAgICAjIENpcGhlcnRleHQvUGxhaW50ZXh0IFhPUiBFSworCW1vdmRxdQkgIDE2KCVhcmczLCVyMTEsMSksIFxUTVAzCisJcHhvcgkgIFxUTVAzLCBcWE1NMiAgICAgICAgICAgICAgICAgIyBDaXBoZXJ0ZXh0L1BsYWludGV4dCBYT1IgRUsKKwltb3ZkcXUJICAzMiglYXJnMywlcjExLDEpLCBcVE1QMworCXB4b3IJICBcVE1QMywgXFhNTTMgICAgICAgICAgICAgICAgICMgQ2lwaGVydGV4dC9QbGFpbnRleHQgWE9SIEVLCisJbW92ZHF1CSAgNDgoJWFyZzMsJXIxMSwxKSwgXFRNUDMKKwlweG9yCSAgXFRNUDMsIFxYTU00ICAgICAgICAgICAgICAgICAjIENpcGhlcnRleHQvUGxhaW50ZXh0IFhPUiBFSworICAgICAgICBtb3ZkcXUgICAgXFhNTTEsICglYXJnMiwlcjExLDEpICAgICAgICAjIFdyaXRlIHRvIHRoZSBjaXBoZXJ0ZXh0IGJ1ZmZlcgorICAgICAgICBtb3ZkcXUgICAgXFhNTTIsIDE2KCVhcmcyLCVyMTEsMSkgICAgICAjIFdyaXRlIHRvIHRoZSBjaXBoZXJ0ZXh0IGJ1ZmZlcgorICAgICAgICBtb3ZkcXUgICAgXFhNTTMsIDMyKCVhcmcyLCVyMTEsMSkgICAgICAjIFdyaXRlIHRvIHRoZSBjaXBoZXJ0ZXh0IGJ1ZmZlcgorICAgICAgICBtb3ZkcXUgICAgXFhNTTQsIDQ4KCVhcmcyLCVyMTEsMSkgICAgICAjIFdyaXRlIHRvIHRoZSBjaXBoZXJ0ZXh0IGJ1ZmZlcgorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NMSAgICAgICAgIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU0yCSMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NMwkjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlQU0hVRkJfWE1NICV4bW0xNSwgXFhNTTQJIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKKwlweG9yCSAgXFRNUDQsIFxUTVAxCisJcHhvcgkgIFxYTU04LCBcWE1NNQorCXB4b3IJICBcVE1QNiwgXFRNUDIKKwlweG9yCSAgXFRNUDEsIFxUTVAyCisJcHhvcgkgIFxYTU01LCBcVE1QMgorCW1vdmRxYQkgIFxUTVAyLCBcVE1QMworCXBzbGxkcQkgICQ4LCBcVE1QMyAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHNoaWZ0IFRNUDMgMiBEV3MKKwlwc3JsZHEJICAkOCwgXFRNUDIgICAgICAgICAgICAgICAgICAgICMgcmlnaHQgc2hpZnQgVE1QMiAyIERXcworCXB4b3IJICBcVE1QMywgXFhNTTUKKwlweG9yCSAgXFRNUDIsIFxUTVAxCSAgIyBhY2N1bXVsYXRlIHRoZSByZXN1bHRzIGluIFRNUDE6WE1NNQorCisgICAgICAgICMgZmlyc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwltb3ZkcWEgICAgXFhNTTUsIFxUTVAyCisJbW92ZHFhICAgIFxYTU01LCBcVE1QMworCW1vdmRxYSAgICBcWE1NNSwgXFRNUDQKKyMgbW92ZSBYTU01IGludG8gVE1QMiwgVE1QMywgVE1QNCBpbiBvcmRlciB0byBwZXJmb3JtIHNoaWZ0cyBpbmRlcGVuZGVudGx5CisJcHNsbGQgICAgICQzMSwgXFRNUDIgICAgICAgICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnQgPDwgMzEKKwlwc2xsZCAgICAgJDMwLCBcVE1QMyAgICAgICAgICAgICAgICAgICAjIHBhY2tlZCByaWdodCBzaGlmdCA8PCAzMAorCXBzbGxkICAgICAkMjUsIFxUTVA0ICAgICAgICAgICAgICAgICAgICMgcGFja2VkIHJpZ2h0IHNoaWZ0IDw8IDI1CisJcHhvciAgICAgIFxUTVAzLCBcVE1QMgkgICAgICAgICAgICAgICAjIHhvciB0aGUgc2hpZnRlZCB2ZXJzaW9ucworCXB4b3IgICAgICBcVE1QNCwgXFRNUDIKKwltb3ZkcWEgICAgXFRNUDIsIFxUTVA1CisJcHNybGRxICAgICQ0LCBcVE1QNSAgICAgICAgICAgICAgICAgICAgIyByaWdodCBzaGlmdCBUNSAxIERXCisJcHNsbGRxICAgICQxMiwgXFRNUDIgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHNoaWZ0IFQyIDMgRFdzCisJcHhvciAgICAgIFxUTVAyLCBcWE1NNQorCisgICAgICAgICMgc2Vjb25kIHBoYXNlIG9mIHJlZHVjdGlvbgorCisJbW92ZHFhICAgIFxYTU01LFxUTVAyICMgbWFrZSAzIGNvcGllcyBvZiBYTU01IGludG8gVE1QMiwgVE1QMywgVE1QNAorCW1vdmRxYSAgICBcWE1NNSxcVE1QMworCW1vdmRxYSAgICBcWE1NNSxcVE1QNAorCXBzcmxkICAgICAkMSwgXFRNUDIgICAgICAgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj4xCisJcHNybGQgICAgICQyLCBcVE1QMyAgICAgICAgICAgICAgICAgICAgIyBwYWNrZWQgbGVmdCBzaGlmdCA+PjIKKwlwc3JsZCAgICAgJDcsIFxUTVA0ICAgICAgICAgICAgICAgICAgICAjIHBhY2tlZCBsZWZ0IHNoaWZ0ID4+NworCXB4b3IgICAgICBcVE1QMyxcVE1QMgkJICAgICAgICMgeG9yIHRoZSBzaGlmdGVkIHZlcnNpb25zCisJcHhvciAgICAgIFxUTVA0LFxUTVAyCisJcHhvciAgICAgIFxUTVA1LCBcVE1QMgorCXB4b3IgICAgICBcVE1QMiwgXFhNTTUKKwlweG9yICAgICAgXFRNUDEsIFxYTU01ICAgICAgICAgICAgICAgICAjIHJlc3VsdCBpcyBpbiBUTVAxCisKKwlweG9yCSAgXFhNTTUsIFxYTU0xCisuZW5kbQorCisvKgorKiBkZWNyeXB0IDQgYmxvY2tzIGF0IGEgdGltZQorKiBnaGFzaCB0aGUgNCBwcmV2aW91c2x5IGRlY3J5cHRlZCBjaXBoZXJ0ZXh0IGJsb2NrcworKiBhcmcxLCAlYXJnMiwgJWFyZzMgYXJlIHVzZWQgYXMgcG9pbnRlcnMgb25seSwgbm90IG1vZGlmaWVkCisqICVyMTEgaXMgdGhlIGRhdGEgb2Zmc2V0IHZhbHVlCisqLworLm1hY3JvIEdIQVNIXzRfRU5DUllQVF80X1BBUkFMTEVMX0RFQyBUTVAxIFRNUDIgVE1QMyBUTVA0IFRNUDUgXAorVE1QNiBYTU0wIFhNTTEgWE1NMiBYTU0zIFhNTTQgWE1NNSBYTU02IFhNTTcgWE1NOCBvcGVyYXRpb24KKworCW1vdmRxYQkgIFxYTU0xLCBcWE1NNQorCW1vdmRxYQkgIFxYTU0yLCBcWE1NNgorCW1vdmRxYQkgIFxYTU0zLCBcWE1NNworCW1vdmRxYQkgIFxYTU00LCBcWE1NOAorCisgICAgICAgIG1vdmRxYSAgICBTSFVGX01BU0soJXJpcCksICV4bW0xNQorICAgICAgICAjIG11bHRpcGx5IFRNUDUgKiBIYXNoS2V5IHVzaW5nIGthcmF0c3ViYQorCisJbW92ZHFhCSAgXFhNTTUsIFxUTVA0CisJcHNodWZkCSAgJDc4LCBcWE1NNSwgXFRNUDYKKwlweG9yCSAgXFhNTTUsIFxUTVA2CisJcGFkZGQgICAgIE9ORSglcmlwKSwgXFhNTTAJCSMgSU5DUiBDTlQKKwltb3ZkcWEJICBIYXNoS2V5XzQoJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QNCAgICAgICAgICAgIyBUTVA0ID0gYTEqYjEKKwltb3ZkcWEgICAgXFhNTTAsIFxYTU0xCisJcGFkZGQgICAgIE9ORSglcmlwKSwgXFhNTTAJCSMgSU5DUiBDTlQKKwltb3ZkcWEgICAgXFhNTTAsIFxYTU0yCisJcGFkZGQgICAgIE9ORSglcmlwKSwgXFhNTTAJCSMgSU5DUiBDTlQKKwltb3ZkcWEgICAgXFhNTTAsIFxYTU0zCisJcGFkZGQgICAgIE9ORSglcmlwKSwgXFhNTTAJCSMgSU5DUiBDTlQKKwltb3ZkcWEgICAgXFhNTTAsIFxYTU00CisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU0xCSMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFhNTTUgICAgICAgICAgICMgWE1NNSA9IGEwKmIwCisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU0yCSMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NMwkjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlQU0hVRkJfWE1NICV4bW0xNSwgXFhNTTQJIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisKKwlweG9yCSAgKCVhcmcxKSwgXFhNTTEKKwlweG9yCSAgKCVhcmcxKSwgXFhNTTIKKwlweG9yCSAgKCVhcmcxKSwgXFhNTTMKKwlweG9yCSAgKCVhcmcxKSwgXFhNTTQKKwltb3ZkcWEJICBIYXNoS2V5XzRfayglcnNwKSwgXFRNUDUKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxUTVA2ICAgICAgICAgICAjIFRNUDYgPSAoYTErYTApKihiMStiMCkKKwltb3ZhcHMgMHgxMCglYXJnMSksIFxUTVAxCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDEKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTIKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTMKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTQKKwltb3ZhcHMgMHgyMCglYXJnMSksIFxUTVAxCisJQUVTRU5DCSAgXFRNUDEsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDIKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTIKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTMKKwlBRVNFTkMJICBcVE1QMSwgXFhNTTQKKwltb3ZkcWEJICBcWE1NNiwgXFRNUDEKKwlwc2h1ZmQJICAkNzgsIFxYTU02LCBcVE1QMgorCXB4b3IJICBcWE1NNiwgXFRNUDIKKwltb3ZkcWEJICBIYXNoS2V5XzMoJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QMSAgICAgICAgICAgIyBUTVAxID0gYTEgKiBiMQorCW1vdmFwcyAweDMwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMgICAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICAjIFJvdW5kIDMKKwlBRVNFTkMgICAgXFRNUDMsIFxYTU0yCisJQUVTRU5DICAgIFxUTVAzLCBcWE1NMworCUFFU0VOQyAgICBcVE1QMywgXFhNTTQKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxYTU02ICAgICAgICAgICAjIFhNTTYgPSBhMCpiMAorCW1vdmFwcyAweDQwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAgICMgUm91bmQgNAorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMgorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NNAorCW1vdmRxYQkgIEhhc2hLZXlfM19rKCVyc3ApLCBcVE1QNQorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFRNUDIgICAgICAgICAgICMgVE1QMiA9IChhMSthMCkqKGIxK2IwKQorCW1vdmFwcyAweDUwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAgICMgUm91bmQgNQorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMgorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NNAorCXB4b3IJICBcVE1QMSwgXFRNUDQKKyMgYWNjdW11bGF0ZSB0aGUgcmVzdWx0cyBpbiBUTVA0OlhNTTUsIFRNUDYgaG9sZHMgdGhlIG1pZGRsZSBwYXJ0CisJcHhvcgkgIFxYTU02LCBcWE1NNQorCXB4b3IJICBcVE1QMiwgXFRNUDYKKwltb3ZkcWEJICBcWE1NNywgXFRNUDEKKwlwc2h1ZmQJICAkNzgsIFxYTU03LCBcVE1QMgorCXB4b3IJICBcWE1NNywgXFRNUDIKKwltb3ZkcWEJICBIYXNoS2V5XzIoJXJzcCApLCBcVE1QNQorCisgICAgICAgICMgTXVsdGlwbHkgVE1QNSAqIEhhc2hLZXkgdXNpbmcga2FyYXRzdWJhCisKKwlQQ0xNVUxRRFEgMHgxMSwgXFRNUDUsIFxUTVAxICAgICAgICAgICAjIFRNUDEgPSBhMSpiMQorCW1vdmFwcyAweDYwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAgICMgUm91bmQgNgorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMgorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NNAorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFhNTTcgICAgICAgICAgICMgWE1NNyA9IGEwKmIwCisJbW92YXBzIDB4NzAoJWFyZzEpLCBcVE1QMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NMSAgICAgICAgICAgICAjIFJvdW5kIDcKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwltb3ZkcWEJICBIYXNoS2V5XzJfayglcnNwKSwgXFRNUDUKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxUTVAyICAgICAgICAgICAjIFRNUDIgPSAoYTErYTApKihiMStiMCkKKwltb3ZhcHMgMHg4MCglYXJnMSksIFxUTVAzCisJQUVTRU5DCSAgXFRNUDMsIFxYTU0xICAgICAgICAgICAgICMgUm91bmQgOAorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMgorCUFFU0VOQwkgIFxUTVAzLCBcWE1NMworCUFFU0VOQwkgIFxUTVAzLCBcWE1NNAorCXB4b3IJICBcVE1QMSwgXFRNUDQKKyMgYWNjdW11bGF0ZSB0aGUgcmVzdWx0cyBpbiBUTVA0OlhNTTUsIFRNUDYgaG9sZHMgdGhlIG1pZGRsZSBwYXJ0CisJcHhvcgkgIFxYTU03LCBcWE1NNQorCXB4b3IJICBcVE1QMiwgXFRNUDYKKworICAgICAgICAjIE11bHRpcGx5IFhNTTggKiBIYXNoS2V5CisgICAgICAgICMgWE1NOCBhbmQgVE1QNSBob2xkIHRoZSB2YWx1ZXMgZm9yIHRoZSB0d28gb3BlcmFuZHMKKworCW1vdmRxYQkgIFxYTU04LCBcVE1QMQorCXBzaHVmZAkgICQ3OCwgXFhNTTgsIFxUTVAyCisJcHhvcgkgIFxYTU04LCBcVE1QMgorCW1vdmRxYQkgIEhhc2hLZXkoJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QMSAgICAgICAgICAjIFRNUDEgPSBhMSpiMQorCW1vdmFwcyAweDkwKCVhcmcxKSwgXFRNUDMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAjIFJvdW5kIDkKKwlBRVNFTkMJICBcVE1QMywgXFhNTTIKKwlBRVNFTkMJICBcVE1QMywgXFhNTTMKKwlBRVNFTkMJICBcVE1QMywgXFhNTTQKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxYTU04ICAgICAgICAgICMgWE1NOCA9IGEwKmIwCisJbW92YXBzIDB4YTAoJWFyZzEpLCBcVE1QMworCUFFU0VOQ0xBU1QgXFRNUDMsIFxYTU0xICAgICAgICAgICAjIFJvdW5kIDEwCisJQUVTRU5DTEFTVCBcVE1QMywgXFhNTTIKKwlBRVNFTkNMQVNUIFxUTVAzLCBcWE1NMworCUFFU0VOQ0xBU1QgXFRNUDMsIFxYTU00CisJbW92ZHFhICAgIEhhc2hLZXlfayglcnNwKSwgXFRNUDUKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxUTVAyICAgICAgICAgICMgVE1QMiA9IChhMSthMCkqKGIxK2IwKQorCW1vdmRxdQkgICglYXJnMywlcjExLDEpLCBcVE1QMworCXB4b3IJICBcVE1QMywgXFhNTTEgICAgICAgICAgICAgICAgICMgQ2lwaGVydGV4dC9QbGFpbnRleHQgWE9SIEVLCisJbW92ZHF1CSAgXFhNTTEsICglYXJnMiwlcjExLDEpICAgICAgICAjIFdyaXRlIHRvIHBsYWludGV4dCBidWZmZXIKKwltb3ZkcWEgICAgXFRNUDMsIFxYTU0xCisJbW92ZHF1CSAgMTYoJWFyZzMsJXIxMSwxKSwgXFRNUDMKKwlweG9yCSAgXFRNUDMsIFxYTU0yICAgICAgICAgICAgICAgICAjIENpcGhlcnRleHQvUGxhaW50ZXh0IFhPUiBFSworCW1vdmRxdQkgIFxYTU0yLCAxNiglYXJnMiwlcjExLDEpICAgICAgIyBXcml0ZSB0byBwbGFpbnRleHQgYnVmZmVyCisJbW92ZHFhICAgIFxUTVAzLCBcWE1NMgorCW1vdmRxdQkgIDMyKCVhcmczLCVyMTEsMSksIFxUTVAzCisJcHhvcgkgIFxUTVAzLCBcWE1NMyAgICAgICAgICAgICAgICAgIyBDaXBoZXJ0ZXh0L1BsYWludGV4dCBYT1IgRUsKKwltb3ZkcXUJICBcWE1NMywgMzIoJWFyZzIsJXIxMSwxKSAgICAgICMgV3JpdGUgdG8gcGxhaW50ZXh0IGJ1ZmZlcgorCW1vdmRxYSAgICBcVE1QMywgXFhNTTMKKwltb3ZkcXUJICA0OCglYXJnMywlcjExLDEpLCBcVE1QMworCXB4b3IJICBcVE1QMywgXFhNTTQgICAgICAgICAgICAgICAgICMgQ2lwaGVydGV4dC9QbGFpbnRleHQgWE9SIEVLCisJbW92ZHF1CSAgXFhNTTQsIDQ4KCVhcmcyLCVyMTEsMSkgICAgICAjIFdyaXRlIHRvIHBsYWludGV4dCBidWZmZXIKKwltb3ZkcWEgICAgXFRNUDMsIFxYTU00CisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU0xICAgICAgICAjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKwlQU0hVRkJfWE1NICV4bW0xNSwgXFhNTTIJIyBwZXJmb3JtIGEgMTYgYnl0ZSBzd2FwCisJUFNIVUZCX1hNTSAleG1tMTUsIFxYTU0zCSMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCVBTSFVGQl9YTU0gJXhtbTE1LCBcWE1NNAkjIHBlcmZvcm0gYSAxNiBieXRlIHN3YXAKKworCXB4b3IJICBcVE1QNCwgXFRNUDEKKwlweG9yCSAgXFhNTTgsIFxYTU01CisJcHhvcgkgIFxUTVA2LCBcVE1QMgorCXB4b3IJICBcVE1QMSwgXFRNUDIKKwlweG9yCSAgXFhNTTUsIFxUTVAyCisJbW92ZHFhCSAgXFRNUDIsIFxUTVAzCisJcHNsbGRxCSAgJDgsIFxUTVAzICAgICAgICAgICAgICAgICAgICAjIGxlZnQgc2hpZnQgVE1QMyAyIERXcworCXBzcmxkcQkgICQ4LCBcVE1QMiAgICAgICAgICAgICAgICAgICAgIyByaWdodCBzaGlmdCBUTVAyIDIgRFdzCisJcHhvcgkgIFxUTVAzLCBcWE1NNQorCXB4b3IJICBcVE1QMiwgXFRNUDEJICAjIGFjY3VtdWxhdGUgdGhlIHJlc3VsdHMgaW4gVE1QMTpYTU01CisKKyAgICAgICAgIyBmaXJzdCBwaGFzZSBvZiByZWR1Y3Rpb24KKworCW1vdmRxYSAgICBcWE1NNSwgXFRNUDIKKwltb3ZkcWEgICAgXFhNTTUsIFxUTVAzCisJbW92ZHFhICAgIFxYTU01LCBcVE1QNAorIyBtb3ZlIFhNTTUgaW50byBUTVAyLCBUTVAzLCBUTVA0IGluIG9yZGVyIHRvIHBlcmZvcm0gc2hpZnRzIGluZGVwZW5kZW50bHkKKwlwc2xsZCAgICAgJDMxLCBcVE1QMiAgICAgICAgICAgICAgICAgICAjIHBhY2tlZCByaWdodCBzaGlmdCA8PCAzMQorCXBzbGxkICAgICAkMzAsIFxUTVAzICAgICAgICAgICAgICAgICAgICMgcGFja2VkIHJpZ2h0IHNoaWZ0IDw8IDMwCisJcHNsbGQgICAgICQyNSwgXFRNUDQgICAgICAgICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnQgPDwgMjUKKwlweG9yICAgICAgXFRNUDMsIFxUTVAyCSAgICAgICAgICAgICAgICMgeG9yIHRoZSBzaGlmdGVkIHZlcnNpb25zCisJcHhvciAgICAgIFxUTVA0LCBcVE1QMgorCW1vdmRxYSAgICBcVE1QMiwgXFRNUDUKKwlwc3JsZHEgICAgJDQsIFxUTVA1ICAgICAgICAgICAgICAgICAgICAjIHJpZ2h0IHNoaWZ0IFQ1IDEgRFcKKwlwc2xsZHEgICAgJDEyLCBcVE1QMiAgICAgICAgICAgICAgICAgICAjIGxlZnQgc2hpZnQgVDIgMyBEV3MKKwlweG9yICAgICAgXFRNUDIsIFxYTU01CisKKyAgICAgICAgIyBzZWNvbmQgcGhhc2Ugb2YgcmVkdWN0aW9uCisKKwltb3ZkcWEgICAgXFhNTTUsXFRNUDIgIyBtYWtlIDMgY29waWVzIG9mIFhNTTUgaW50byBUTVAyLCBUTVAzLCBUTVA0CisJbW92ZHFhICAgIFxYTU01LFxUTVAzCisJbW92ZHFhICAgIFxYTU01LFxUTVA0CisJcHNybGQgICAgICQxLCBcVE1QMiAgICAgICAgICAgICAgICAgICAgIyBwYWNrZWQgbGVmdCBzaGlmdCA+PjEKKwlwc3JsZCAgICAgJDIsIFxUTVAzICAgICAgICAgICAgICAgICAgICAjIHBhY2tlZCBsZWZ0IHNoaWZ0ID4+MgorCXBzcmxkICAgICAkNywgXFRNUDQgICAgICAgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj43CisJcHhvciAgICAgIFxUTVAzLFxUTVAyCQkgICAgICAgIyB4b3IgdGhlIHNoaWZ0ZWQgdmVyc2lvbnMKKwlweG9yICAgICAgXFRNUDQsXFRNUDIKKwlweG9yICAgICAgXFRNUDUsIFxUTVAyCisJcHhvciAgICAgIFxUTVAyLCBcWE1NNQorCXB4b3IgICAgICBcVE1QMSwgXFhNTTUgICAgICAgICAgICAgICAgICMgcmVzdWx0IGlzIGluIFRNUDEKKworCXB4b3IJICBcWE1NNSwgXFhNTTEKKy5lbmRtCisKKy8qIEdIQVNIIHRoZSBsYXN0IDQgY2lwaGVydGV4dCBibG9ja3MuICovCisubWFjcm8JR0hBU0hfTEFTVF80IFRNUDEgVE1QMiBUTVAzIFRNUDQgVE1QNSBUTVA2IFwKK1RNUDcgWE1NMSBYTU0yIFhNTTMgWE1NNCBYTU1Ec3QKKworICAgICAgICAjIE11bHRpcGx5IFRNUDYgKiBIYXNoS2V5ICh1c2luZyBLYXJhdHN1YmEpCisKKwltb3ZkcWEJICBcWE1NMSwgXFRNUDYKKwlwc2h1ZmQJICAkNzgsIFxYTU0xLCBcVE1QMgorCXB4b3IJICBcWE1NMSwgXFRNUDIKKwltb3ZkcWEJICBIYXNoS2V5XzQoJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QNiAgICAgICAjIFRNUDYgPSBhMSpiMQorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFhNTTEgICAgICAgIyBYTU0xID0gYTAqYjAKKwltb3ZkcWEJICBIYXNoS2V5XzRfayglcnNwKSwgXFRNUDQKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDQsIFxUTVAyICAgICAgICMgVE1QMiA9IChhMSthMCkqKGIxK2IwKQorCW1vdmRxYQkgIFxYTU0xLCBcWE1NRHN0CisJbW92ZHFhCSAgXFRNUDIsIFxYTU0xICAgICAgICAgICAgICAjIHJlc3VsdCBpbiBUTVA2LCBYTU1Ec3QsIFhNTTEKKworICAgICAgICAjIE11bHRpcGx5IFRNUDEgKiBIYXNoS2V5ICh1c2luZyBLYXJhdHN1YmEpCisKKwltb3ZkcWEJICBcWE1NMiwgXFRNUDEKKwlwc2h1ZmQJICAkNzgsIFxYTU0yLCBcVE1QMgorCXB4b3IJICBcWE1NMiwgXFRNUDIKKwltb3ZkcWEJICBIYXNoS2V5XzMoJXJzcCksIFxUTVA1CisJUENMTVVMUURRIDB4MTEsIFxUTVA1LCBcVE1QMSAgICAgICAjIFRNUDEgPSBhMSpiMQorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFhNTTIgICAgICAgIyBYTU0yID0gYTAqYjAKKwltb3ZkcWEJICBIYXNoS2V5XzNfayglcnNwKSwgXFRNUDQKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDQsIFxUTVAyICAgICAgICMgVE1QMiA9IChhMSthMCkqKGIxK2IwKQorCXB4b3IJICBcVE1QMSwgXFRNUDYKKwlweG9yCSAgXFhNTTIsIFxYTU1Ec3QKKwlweG9yCSAgXFRNUDIsIFxYTU0xCisjIHJlc3VsdHMgYWNjdW11bGF0ZWQgaW4gVE1QNiwgWE1NRHN0LCBYTU0xCisKKyAgICAgICAgIyBNdWx0aXBseSBUTVAxICogSGFzaEtleSAodXNpbmcgS2FyYXRzdWJhKQorCisJbW92ZHFhCSAgXFhNTTMsIFxUTVAxCisJcHNodWZkCSAgJDc4LCBcWE1NMywgXFRNUDIKKwlweG9yCSAgXFhNTTMsIFxUTVAyCisJbW92ZHFhCSAgSGFzaEtleV8yKCVyc3ApLCBcVE1QNQorCVBDTE1VTFFEUSAweDExLCBcVE1QNSwgXFRNUDEgICAgICAgIyBUTVAxID0gYTEqYjEKKwlQQ0xNVUxRRFEgMHgwMCwgXFRNUDUsIFxYTU0zICAgICAgICMgWE1NMyA9IGEwKmIwCisJbW92ZHFhCSAgSGFzaEtleV8yX2soJXJzcCksIFxUTVA0CisJUENMTVVMUURRIDB4MDAsIFxUTVA0LCBcVE1QMiAgICAgICAjIFRNUDIgPSAoYTErYTApKihiMStiMCkKKwlweG9yCSAgXFRNUDEsIFxUTVA2CisJcHhvcgkgIFxYTU0zLCBcWE1NRHN0CisJcHhvcgkgIFxUTVAyLCBcWE1NMSAgICMgcmVzdWx0cyBhY2N1bXVsYXRlZCBpbiBUTVA2LCBYTU1Ec3QsIFhNTTEKKworICAgICAgICAjIE11bHRpcGx5IFRNUDEgKiBIYXNoS2V5ICh1c2luZyBLYXJhdHN1YmEpCisJbW92ZHFhCSAgXFhNTTQsIFxUTVAxCisJcHNodWZkCSAgJDc4LCBcWE1NNCwgXFRNUDIKKwlweG9yCSAgXFhNTTQsIFxUTVAyCisJbW92ZHFhCSAgSGFzaEtleSglcnNwKSwgXFRNUDUKKwlQQ0xNVUxRRFEgMHgxMSwgXFRNUDUsIFxUTVAxCSAgICAjIFRNUDEgPSBhMSpiMQorCVBDTE1VTFFEUSAweDAwLCBcVE1QNSwgXFhNTTQgICAgICAgIyBYTU00ID0gYTAqYjAKKwltb3ZkcWEJICBIYXNoS2V5X2soJXJzcCksIFxUTVA0CisJUENMTVVMUURRIDB4MDAsIFxUTVA0LCBcVE1QMiAgICAgICAjIFRNUDIgPSAoYTErYTApKihiMStiMCkKKwlweG9yCSAgXFRNUDEsIFxUTVA2CisJcHhvcgkgIFxYTU00LCBcWE1NRHN0CisJcHhvcgkgIFxYTU0xLCBcVE1QMgorCXB4b3IJICBcVE1QNiwgXFRNUDIKKwlweG9yCSAgXFhNTURzdCwgXFRNUDIKKwkjIG1pZGRsZSBzZWN0aW9uIG9mIHRoZSB0ZW1wIHJlc3VsdHMgY29tYmluZWQgYXMgaW4ga2FyYXRzdWJhIGFsZ29yaXRobQorCW1vdmRxYQkgIFxUTVAyLCBcVE1QNAorCXBzbGxkcQkgICQ4LCBcVE1QNCAgICAgICAgICAgICAgICAgIyBsZWZ0IHNoaWZ0IFRNUDQgMiBEV3MKKwlwc3JsZHEJICAkOCwgXFRNUDIgICAgICAgICAgICAgICAgICMgcmlnaHQgc2hpZnQgVE1QMiAyIERXcworCXB4b3IJICBcVE1QNCwgXFhNTURzdAorCXB4b3IJICBcVE1QMiwgXFRNUDYKKyMgVE1QNjpYTU1Ec3QgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgYWNjdW11bGF0ZWQgY2FycnktbGVzcyBtdWx0aXBsaWNhdGlvbnMKKwkjIGZpcnN0IHBoYXNlIG9mIHRoZSByZWR1Y3Rpb24KKwltb3ZkcWEgICAgXFhNTURzdCwgXFRNUDIKKwltb3ZkcWEgICAgXFhNTURzdCwgXFRNUDMKKwltb3ZkcWEgICAgXFhNTURzdCwgXFRNUDQKKyMgbW92ZSBYTU1Ec3QgaW50byBUTVAyLCBUTVAzLCBUTVA0IGluIG9yZGVyIHRvIHBlcmZvcm0gMyBzaGlmdHMgaW5kZXBlbmRlbnRseQorCXBzbGxkICAgICAkMzEsIFxUTVAyICAgICAgICAgICAgICAgICMgcGFja2VkIHJpZ2h0IHNoaWZ0aW5nIDw8IDMxCisJcHNsbGQgICAgICQzMCwgXFRNUDMgICAgICAgICAgICAgICAgIyBwYWNrZWQgcmlnaHQgc2hpZnRpbmcgPDwgMzAKKwlwc2xsZCAgICAgJDI1LCBcVE1QNCAgICAgICAgICAgICAgICAjIHBhY2tlZCByaWdodCBzaGlmdGluZyA8PCAyNQorCXB4b3IgICAgICBcVE1QMywgXFRNUDIgICAgICAgICAgICAgICMgeG9yIHRoZSBzaGlmdGVkIHZlcnNpb25zCisJcHhvciAgICAgIFxUTVA0LCBcVE1QMgorCW1vdmRxYSAgICBcVE1QMiwgXFRNUDcKKwlwc3JsZHEgICAgJDQsIFxUTVA3ICAgICAgICAgICAgICAgICAjIHJpZ2h0IHNoaWZ0IFRNUDcgMSBEVworCXBzbGxkcSAgICAkMTIsIFxUTVAyICAgICAgICAgICAgICAgICMgbGVmdCBzaGlmdCBUTVAyIDMgRFdzCisJcHhvciAgICAgIFxUTVAyLCBcWE1NRHN0CisKKyAgICAgICAgIyBzZWNvbmQgcGhhc2Ugb2YgdGhlIHJlZHVjdGlvbgorCW1vdmRxYSAgICBcWE1NRHN0LCBcVE1QMgorCSMgbWFrZSAzIGNvcGllcyBvZiBYTU1Ec3QgZm9yIGRvaW5nIDMgc2hpZnQgb3BlcmF0aW9ucworCW1vdmRxYSAgICBcWE1NRHN0LCBcVE1QMworCW1vdmRxYSAgICBcWE1NRHN0LCBcVE1QNAorCXBzcmxkICAgICAkMSwgXFRNUDIgICAgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj4gMQorCXBzcmxkICAgICAkMiwgXFRNUDMgICAgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj4gMgorCXBzcmxkICAgICAkNywgXFRNUDQgICAgICAgICAgICAgICAgICMgcGFja2VkIGxlZnQgc2hpZnQgPj4gNworCXB4b3IgICAgICBcVE1QMywgXFRNUDIgICAgICAgICAgICAgICMgeG9yIHRoZSBzaGlmdGVkIHZlcnNpb25zCisJcHhvciAgICAgIFxUTVA0LCBcVE1QMgorCXB4b3IgICAgICBcVE1QNywgXFRNUDIKKwlweG9yICAgICAgXFRNUDIsIFxYTU1Ec3QKKwlweG9yICAgICAgXFRNUDYsIFxYTU1Ec3QgICAgICAgICAgICAjIHJlZHVjZWQgcmVzdWx0IGlzIGluIFhNTURzdAorLmVuZG0KKworLyogRW5jcnlwdGlvbiBvZiBhIHNpbmdsZSBibG9jayBkb25lKi8KKy5tYWNybyBFTkNSWVBUX1NJTkdMRV9CTE9DSyBYTU0wIFRNUDEKKworCXB4b3IJKCVhcmcxKSwgXFhNTTAKKyAgICAgICAgbW92YXBzIDE2KCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMJXFRNUDEsIFxYTU0wCisgICAgICAgIG1vdmFwcyAzMiglYXJnMSksIFxUTVAxCisJQUVTRU5DCVxUTVAxLCBcWE1NMAorICAgICAgICBtb3ZhcHMgNDgoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwlcVE1QMSwgXFhNTTAKKyAgICAgICAgbW92YXBzIDY0KCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMJXFRNUDEsIFxYTU0wCisgICAgICAgIG1vdmFwcyA4MCglYXJnMSksIFxUTVAxCisJQUVTRU5DCVxUTVAxLCBcWE1NMAorICAgICAgICBtb3ZhcHMgOTYoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwlcVE1QMSwgXFhNTTAKKyAgICAgICAgbW92YXBzIDExMiglYXJnMSksIFxUTVAxCisJQUVTRU5DCVxUTVAxLCBcWE1NMAorICAgICAgICBtb3ZhcHMgMTI4KCVhcmcxKSwgXFRNUDEKKwlBRVNFTkMJXFRNUDEsIFxYTU0wCisgICAgICAgIG1vdmFwcyAxNDQoJWFyZzEpLCBcVE1QMQorCUFFU0VOQwlcVE1QMSwgXFhNTTAKKyAgICAgICAgbW92YXBzIDE2MCglYXJnMSksIFxUTVAxCisJQUVTRU5DTEFTVAlcVE1QMSwgXFhNTTAKKy5lbmRtCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHZvaWQgYWVzbmlfZ2NtX2RlYyh2b2lkICphZXNfY3R4LCAgICAvLyBBRVMgS2V5IHNjaGVkdWxlLiBTdGFydHMgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorKiAgICAgICAgICAgICAgICAgICB1OCAqb3V0LCAgICAgICAgICAgLy8gUGxhaW50ZXh0IG91dHB1dC4gRW5jcnlwdCBpbi1wbGFjZSBpcyBhbGxvd2VkLgorKiAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqaW4sICAgICAgLy8gQ2lwaGVydGV4dCBpbnB1dAorKiAgICAgICAgICAgICAgICAgICB1NjQgcGxhaW50ZXh0X2xlbiwgLy8gTGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMgZm9yIGRlY3J5cHRpb24uCisqICAgICAgICAgICAgICAgICAgIHU4ICppdiwgICAgICAgICAgICAvLyBQcmUtY291bnRlciBibG9jayBqMDogNCBieXRlIHNhbHQgKGZyb20gU2VjdXJpdHkgQXNzb2NpYXRpb24pCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgd2l0aCA4IGJ5dGUgSW5pdGlhbGlzYXRpb24gVmVjdG9yIChmcm9tIElQU2VjIEVTUCBQYXlsb2FkKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGVkIHdpdGggMHgwMDAwMDAwMS4gMTYtYnl0ZSBhbGlnbmVkIHBvaW50ZXIuCisqICAgICAgICAgICAgICAgICAgIHU4ICpoYXNoX3N1YmtleSwgICAvLyBILCB0aGUgSGFzaCBzdWIga2V5IGlucHV0LiBEYXRhIHN0YXJ0cyBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuCisqICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICphYWQsICAgICAvLyBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0aW9uIERhdGEgKEFBRCkKKyogICAgICAgICAgICAgICAgICAgdTY0IGFhZF9sZW4sICAgICAgIC8vIExlbmd0aCBvZiBBQUQgaW4gYnl0ZXMuIFdpdGggUkZDNDEwNiB0aGlzIGlzIGdvaW5nIHRvIGJlIDggb3IgMTIgYnl0ZXMKKyogICAgICAgICAgICAgICAgICAgdTggICphdXRoX3RhZywgICAgIC8vIEF1dGhlbnRpY2F0ZWQgVGFnIG91dHB1dC4gVGhlIGRyaXZlciB3aWxsIGNvbXBhcmUgdGhpcyB0byB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVuIGF1dGhlbnRpY2F0aW9uIHRhZyBhbmQgb25seSByZXR1cm4gdGhlIHBsYWludGV4dCBpZiB0aGV5IG1hdGNoLgorKiAgICAgICAgICAgICAgICAgICB1NjQgYXV0aF90YWdfbGVuKTsgLy8gQXV0aGVudGljYXRlZCBUYWcgTGVuZ3RoIGluIGJ5dGVzLiBWYWxpZCB2YWx1ZXMgYXJlIDE2CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobW9zdCBsaWtlbHkpLCAxMiBvciA4LgorKgorKiBBc3N1bXB0aW9uczoKKyoKKyoga2V5czoKKyogICAgICAga2V5cyBhcmUgcHJlLWV4cGFuZGVkIGFuZCBhbGlnbmVkIHRvIDE2IGJ5dGVzLiB3ZSBhcmUgdXNpbmcgdGhlIGZpcnN0CisqICAgICAgIHNldCBvZiAxMSBrZXlzIGluIHRoZSBkYXRhIHN0cnVjdHVyZSB2b2lkICphZXNfY3R4CisqCisqIGl2OgorKiAgICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisqICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorKiAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWx0ICAoRnJvbSB0aGUgU0EpICAgICAgICAgICAgICAgfAorKiAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gVmVjdG9yICAgICAgICAgICAgICAgICAgICAgfAorKiAgICAgICB8ICAgICAgICAgKFRoaXMgaXMgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIElQU2VjIGhlYWRlcikgICAgICAgfAorKiAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKiAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKgorKgorKgorKiBBQUQ6CisqICAgICAgIEFBRCBwYWRkZWQgdG8gMTI4IGJpdHMgd2l0aCAwCisqICAgICAgIGZvciBleGFtcGxlLCBhc3N1bWUgQUFEIGlzIGEgdTMyIHZlY3RvcgorKgorKiAgICAgICBpZiBBQUQgaXMgOCBieXRlczoKKyogICAgICAgQUFEWzNdID0ge0EwLCBBMX07CisqICAgICAgIHBhZGRlZCBBQUQgaW4geG1tIHJlZ2lzdGVyID0ge0ExIEEwIDAgMH0KKyoKKyogICAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEkgKEExKSAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgIDMyLWJpdCBTZXF1ZW5jZSBOdW1iZXIgKEEwKSAgICAgICAgICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUQgRm9ybWF0IHdpdGggMzItYml0IFNlcXVlbmNlIE51bWJlcgorKgorKiAgICAgICBpZiBBQUQgaXMgMTIgYnl0ZXM6CisqICAgICAgIEFBRFszXSA9IHtBMCwgQTEsIEEyfTsKKyogICAgICAgcGFkZGVkIEFBRCBpbiB4bW0gcmVnaXN0ZXIgPSB7QTIgQTEgQTAgMH0KKyoKKyogICAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJIChBMikgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgIDY0LWJpdCBFeHRlbmRlZCBTZXF1ZW5jZSBOdW1iZXIge0ExLEEwfSAgICAgICB8CisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQUFEIEZvcm1hdCB3aXRoIDY0LWJpdCBFeHRlbmRlZCBTZXF1ZW5jZSBOdW1iZXIKKyoKKyogYWFkTGVuOgorKiAgICAgICBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzcGVjLCBhYWRMZW4gY2FuIG9ubHkgYmUgOCBvciAxMiBieXRlcy4KKyogICAgICAgVGhlIGNvZGUgc3VwcG9ydHMgMTYgdG9vIGJ1dCBmb3Igb3RoZXIgc2l6ZXMsIHRoZSBjb2RlIHdpbGwgZmFpbC4KKyoKKyogVExlbjoKKyogICAgICAgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3BlYywgVExlbiBjYW4gb25seSBiZSA4LCAxMiBvciAxNiBieXRlcy4KKyogICAgICAgRm9yIG90aGVyIHNpemVzLCB0aGUgY29kZSB3aWxsIGZhaWwuCisqCisqIHBvbHkgPSB4XjEyOCArIHheMTI3ICsgeF4xMjYgKyB4XjEyMSArIDEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitFTlRSWShhZXNuaV9nY21fZGVjKQorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCW1vdgklcnNwLCAlcjE0CisvKgorKiBzdGF0ZXMgb2YgJXhtbSByZWdpc3RlcnMgJXhtbTY6JXhtbTE1IG5vdCBzYXZlZAorKiBhbGwgJXhtbSByZWdpc3RlcnMgYXJlIGNsb2JiZXJlZAorKi8KKwlzdWIJJFZBUklBQkxFX09GRlNFVCwgJXJzcAorCWFuZAkkfjYzLCAlcnNwICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGlnbiByc3AgdG8gNjQgYnl0ZXMKKwltb3YJJWFyZzYsICVyMTIKKwltb3ZkcXUJKCVyMTIpLCAleG1tMTMJCQkgICMgJXhtbTEzID0gSGFzaEtleQorICAgICAgICBtb3ZkcWEgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTIKKwlQU0hVRkJfWE1NICV4bW0yLCAleG1tMTMKKworCisjIFByZWNvbXB1dGUgSGFzaEtleTw8MSAobW9kIHBvbHkpIGZyb20gdGhlIGhhc2gga2V5IChyZXF1aXJlZCBmb3IgR0hBU0gpCisKKwltb3ZkcWEJJXhtbTEzLCAleG1tMgorCXBzbGxxCSQxLCAleG1tMTMKKwlwc3JscQkkNjMsICV4bW0yCisJbW92ZHFhCSV4bW0yLCAleG1tMQorCXBzbGxkcQkkOCwgJXhtbTIKKwlwc3JsZHEJJDgsICV4bW0xCisJcG9yCSV4bW0yLCAleG1tMTMKKworICAgICAgICAjIFJlZHVjdGlvbgorCisJcHNodWZkCSQweDI0LCAleG1tMSwgJXhtbTIKKwlwY21wZXFkIFRXT09ORSglcmlwKSwgJXhtbTIKKwlwYW5kCVBPTFkoJXJpcCksICV4bW0yCisJcHhvcgkleG1tMiwgJXhtbTEzICAgICAjICV4bW0xMyBob2xkcyB0aGUgSGFzaEtleTw8MSAobW9kIHBvbHkpCisKKworICAgICAgICAjIERlY3J5cHQgZmlyc3QgZmV3IGJsb2NrcworCisJbW92ZHFhICV4bW0xMywgSGFzaEtleSglcnNwKSAgICAgICAgICAgIyBzdG9yZSBIYXNoS2V5PDwxIChtb2QgcG9seSkKKwltb3YgJWFyZzQsICVyMTMgICAgIyBzYXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcGxhaW50ZXh0L2NpcGhlcnRleHQKKwlhbmQgJC0xNiwgJXIxMyAgICAgICAgICAgICAgICAgICAgICAjICVyMTMgPSAlcjEzIC0gKCVyMTMgbW9kIDE2KQorCW1vdiAlcjEzLCAlcjEyCisJYW5kICQoMzw8NCksICVyMTIKKwlqeiBfaW5pdGlhbF9udW1fYmxvY2tzX2lzXzBfZGVjcnlwdAorCWNtcCAkKDI8PDQpLCAlcjEyCisJamIgX2luaXRpYWxfbnVtX2Jsb2Nrc19pc18xX2RlY3J5cHQKKwlqZSBfaW5pdGlhbF9udW1fYmxvY2tzX2lzXzJfZGVjcnlwdAorX2luaXRpYWxfbnVtX2Jsb2Nrc19pc18zX2RlY3J5cHQ6CisJSU5JVElBTF9CTE9DS1NfREVDIDMsICV4bW05LCAleG1tMTAsICV4bW0xMywgJXhtbTExLCAleG1tMTIsICV4bW0wLCBcCisleG1tMSwgJXhtbTIsICV4bW0zLCAleG1tNCwgJXhtbTgsICV4bW01LCAleG1tNiwgNSwgNjc4LCBkZWMKKwlzdWIJJDQ4LCAlcjEzCisJam1wCV9pbml0aWFsX2Jsb2Nrc19kZWNyeXB0ZWQKK19pbml0aWFsX251bV9ibG9ja3NfaXNfMl9kZWNyeXB0OgorCUlOSVRJQUxfQkxPQ0tTX0RFQwkyLCAleG1tOSwgJXhtbTEwLCAleG1tMTMsICV4bW0xMSwgJXhtbTEyLCAleG1tMCwgXAorJXhtbTEsICV4bW0yLCAleG1tMywgJXhtbTQsICV4bW04LCAleG1tNSwgJXhtbTYsIDYsIDc4LCBkZWMKKwlzdWIJJDMyLCAlcjEzCisJam1wCV9pbml0aWFsX2Jsb2Nrc19kZWNyeXB0ZWQKK19pbml0aWFsX251bV9ibG9ja3NfaXNfMV9kZWNyeXB0OgorCUlOSVRJQUxfQkxPQ0tTX0RFQwkxLCAleG1tOSwgJXhtbTEwLCAleG1tMTMsICV4bW0xMSwgJXhtbTEyLCAleG1tMCwgXAorJXhtbTEsICV4bW0yLCAleG1tMywgJXhtbTQsICV4bW04LCAleG1tNSwgJXhtbTYsIDcsIDgsIGRlYworCXN1YgkkMTYsICVyMTMKKwlqbXAJX2luaXRpYWxfYmxvY2tzX2RlY3J5cHRlZAorX2luaXRpYWxfbnVtX2Jsb2Nrc19pc18wX2RlY3J5cHQ6CisJSU5JVElBTF9CTE9DS1NfREVDCTAsICV4bW05LCAleG1tMTAsICV4bW0xMywgJXhtbTExLCAleG1tMTIsICV4bW0wLCBcCisleG1tMSwgJXhtbTIsICV4bW0zLCAleG1tNCwgJXhtbTgsICV4bW01LCAleG1tNiwgOCwgMCwgZGVjCitfaW5pdGlhbF9ibG9ja3NfZGVjcnlwdGVkOgorCWNtcAkkMCwgJXIxMworCWplCV96ZXJvX2NpcGhlcl9sZWZ0X2RlY3J5cHQKKwlzdWIJJDY0LCAlcjEzCisJamUJX2ZvdXJfY2lwaGVyX2xlZnRfZGVjcnlwdAorX2RlY3J5cHRfYnlfNDoKKwlHSEFTSF80X0VOQ1JZUFRfNF9QQVJBTExFTF9ERUMJJXhtbTksICV4bW0xMCwgJXhtbTExLCAleG1tMTIsICV4bW0xMywgXAorJXhtbTE0LCAleG1tMCwgJXhtbTEsICV4bW0yLCAleG1tMywgJXhtbTQsICV4bW01LCAleG1tNiwgJXhtbTcsICV4bW04LCBkZWMKKwlhZGQJJDY0LCAlcjExCisJc3ViCSQ2NCwgJXIxMworCWpuZQlfZGVjcnlwdF9ieV80CitfZm91cl9jaXBoZXJfbGVmdF9kZWNyeXB0OgorCUdIQVNIX0xBU1RfNAkleG1tOSwgJXhtbTEwLCAleG1tMTEsICV4bW0xMiwgJXhtbTEzLCAleG1tMTQsIFwKKyV4bW0xNSwgJXhtbTEsICV4bW0yLCAleG1tMywgJXhtbTQsICV4bW04CitfemVyb19jaXBoZXJfbGVmdF9kZWNyeXB0OgorCW1vdgklYXJnNCwgJXIxMworCWFuZAkkMTUsICVyMTMJCQkJIyAlcjEzID0gYXJnNCAobW9kIDE2KQorCWplCV9tdWx0aXBsZV9vZl8xNl9ieXRlc19kZWNyeXB0CisKKyAgICAgICAgIyBIYW5kbGUgdGhlIGxhc3QgPDE2IGJ5dGUgYmxvY2sgc2VwZXJhdGVseQorCisJcGFkZGQgT05FKCVyaXApLCAleG1tMCAgICAgICAgICMgaW5jcmVtZW50IENOVCB0byBnZXQgWW4KKyAgICAgICAgbW92ZHFhIFNIVUZfTUFTSyglcmlwKSwgJXhtbTEwCisJUFNIVUZCX1hNTSAleG1tMTAsICV4bW0wCisKKwlFTkNSWVBUX1NJTkdMRV9CTE9DSyAgJXhtbTAsICV4bW0xICAgICMgRShLLCBZbikKKwlzdWIgJDE2LCAlcjExCisJYWRkICVyMTMsICVyMTEKKwltb3ZkcXUgKCVhcmczLCVyMTEsMSksICV4bW0xICAgIyByZWNpZXZlIHRoZSBsYXN0IDwxNiBieXRlIGJsb2NrCisJbGVhIFNISUZUX01BU0srMTYoJXJpcCksICVyMTIKKwlzdWIgJXIxMywgJXIxMgorIyBhZGp1c3QgdGhlIHNodWZmbGUgbWFzayBwb2ludGVyIHRvIGJlIGFibGUgdG8gc2hpZnQgMTYtJXIxMyBieXRlcworIyAoJXIxMyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHBsYWludGV4dCBtb2QgMTYpCisJbW92ZHF1ICglcjEyKSwgJXhtbTIgICAgICAgICAgICMgZ2V0IHRoZSBhcHByb3ByaWF0ZSBzaHVmZmxlIG1hc2sKKwlQU0hVRkJfWE1NICV4bW0yLCAleG1tMSAgICAgICAgICAgICMgcmlnaHQgc2hpZnQgMTYtJXIxMyBidXRlcworCisJbW92ZHFhICAleG1tMSwgJXhtbTIKKwlweG9yICV4bW0xLCAleG1tMCAgICAgICAgICAgICMgQ2lwaGVydGV4dCBYT1IgRShLLCBZbikKKwltb3ZkcXUgQUxMX0YtU0hJRlRfTUFTSyglcjEyKSwgJXhtbTEKKwkjIGdldCB0aGUgYXBwcm9wcmlhdGUgbWFzayB0byBtYXNrIG91dCB0b3AgMTYtJXIxMyBieXRlcyBvZiAleG1tMAorCXBhbmQgJXhtbTEsICV4bW0wICAgICAgICAgICAgIyBtYXNrIG91dCB0b3AgMTYtJXIxMyBieXRlcyBvZiAleG1tMAorCXBhbmQgICAgJXhtbTEsICV4bW0yCisgICAgICAgIG1vdmRxYSBTSFVGX01BU0soJXJpcCksICV4bW0xMAorCVBTSFVGQl9YTU0gJXhtbTEwICwleG1tMgorCisJcHhvciAleG1tMiwgJXhtbTgKKwlHSEFTSF9NVUwgJXhtbTgsICV4bW0xMywgJXhtbTksICV4bW0xMCwgJXhtbTExLCAleG1tNSwgJXhtbTYKKwkgICAgICAgICAgIyBHSEFTSCBjb21wdXRhdGlvbiBmb3IgdGhlIGxhc3QgPDE2IGJ5dGUgYmxvY2sKKwlzdWIgJXIxMywgJXIxMQorCWFkZCAkMTYsICVyMTEKKworICAgICAgICAjIG91dHB1dCAlcjEzIGJ5dGVzCisJTU9WUV9SNjRfWE1NCSV4bW0wLCAlcmF4CisJY21wCSQ4LCAlcjEzCisJamxlCV9sZXNzX3RoYW5fOF9ieXRlc19sZWZ0X2RlY3J5cHQKKwltb3YJJXJheCwgKCVhcmcyICwgJXIxMSwgMSkKKwlhZGQJJDgsICVyMTEKKwlwc3JsZHEJJDgsICV4bW0wCisJTU9WUV9SNjRfWE1NCSV4bW0wLCAlcmF4CisJc3ViCSQ4LCAlcjEzCitfbGVzc190aGFuXzhfYnl0ZXNfbGVmdF9kZWNyeXB0OgorCW1vdgklYWwsICAoJWFyZzIsICVyMTEsIDEpCisJYWRkCSQxLCAlcjExCisJc2hyCSQ4LCAlcmF4CisJc3ViCSQxLCAlcjEzCisJam5lCV9sZXNzX3RoYW5fOF9ieXRlc19sZWZ0X2RlY3J5cHQKK19tdWx0aXBsZV9vZl8xNl9ieXRlc19kZWNyeXB0OgorCW1vdglhcmc4LCAlcjEyCQkgICMgJXIxMyA9IGFhZExlbiAobnVtYmVyIG9mIGJ5dGVzKQorCXNobAkkMywgJXIxMgkJICAjIGNvbnZlcnQgaW50byBudW1iZXIgb2YgYml0cworCW1vdmQJJXIxMmQsICV4bW0xNQkJICAjIGxlbihBKSBpbiAleG1tMTUKKwlzaGwJJDMsICVhcmc0CQkgICMgbGVuKEMpIGluIGJpdHMgKCoxMjgpCisJTU9WUV9SNjRfWE1NCSVhcmc0LCAleG1tMQorCXBzbGxkcQkkOCwgJXhtbTE1CQkgICMgJXhtbTE1ID0gbGVuKEEpfHwweDAwMDAwMDAwMDAwMDAwMDAKKwlweG9yCSV4bW0xLCAleG1tMTUJCSAgIyAleG1tMTUgPSBsZW4oQSl8fGxlbihDKQorCXB4b3IJJXhtbTE1LCAleG1tOAorCUdIQVNIX01VTAkleG1tOCwgJXhtbTEzLCAleG1tOSwgJXhtbTEwLCAleG1tMTEsICV4bW01LCAleG1tNgorCSAgICAgICAgICMgZmluYWwgR0hBU0ggY29tcHV0YXRpb24KKyAgICAgICAgbW92ZHFhIFNIVUZfTUFTSyglcmlwKSwgJXhtbTEwCisJUFNIVUZCX1hNTSAleG1tMTAsICV4bW04CisKKwltb3YJJWFyZzUsICVyYXgJCSAgIyAlcmF4ID0gKlkwCisJbW92ZHF1CSglcmF4KSwgJXhtbTAJCSAgIyAleG1tMCA9IFkwCisJRU5DUllQVF9TSU5HTEVfQkxPQ0sJJXhtbTAsICAleG1tMQkgICMgRShLLCBZMCkKKwlweG9yCSV4bW04LCAleG1tMAorX3JldHVybl9UX2RlY3J5cHQ6CisJbW92CWFyZzksICVyMTAgICAgICAgICAgICAgICAgIyAlcjEwID0gYXV0aFRhZworCW1vdglhcmcxMCwgJXIxMSAgICAgICAgICAgICAgICMgJXIxMSA9IGF1dGhfdGFnX2xlbgorCWNtcAkkMTYsICVyMTEKKwlqZQlfVF8xNl9kZWNyeXB0CisJY21wCSQxMiwgJXIxMQorCWplCV9UXzEyX2RlY3J5cHQKK19UXzhfZGVjcnlwdDoKKwlNT1ZRX1I2NF9YTU0JJXhtbTAsICVyYXgKKwltb3YJJXJheCwgKCVyMTApCisJam1wCV9yZXR1cm5fVF9kb25lX2RlY3J5cHQKK19UXzEyX2RlY3J5cHQ6CisJTU9WUV9SNjRfWE1NCSV4bW0wLCAlcmF4CisJbW92CSVyYXgsICglcjEwKQorCXBzcmxkcQkkOCwgJXhtbTAKKwltb3ZkCSV4bW0wLCAlZWF4CisJbW92CSVlYXgsIDgoJXIxMCkKKwlqbXAJX3JldHVybl9UX2RvbmVfZGVjcnlwdAorX1RfMTZfZGVjcnlwdDoKKwltb3ZkcXUJJXhtbTAsICglcjEwKQorX3JldHVybl9UX2RvbmVfZGVjcnlwdDoKKwltb3YJJXIxNCwgJXJzcAorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXJldAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB2b2lkIGFlc25pX2djbV9lbmModm9pZCAqYWVzX2N0eCwgICAgICAvLyBBRVMgS2V5IHNjaGVkdWxlLiBTdGFydHMgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorKiAgICAgICAgICAgICAgICAgICAgdTggKm91dCwgICAgICAgICAgICAvLyBDaXBoZXJ0ZXh0IG91dHB1dC4gRW5jcnlwdCBpbi1wbGFjZSBpcyBhbGxvd2VkLgorKiAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmluLCAgICAgICAvLyBQbGFpbnRleHQgaW5wdXQKKyogICAgICAgICAgICAgICAgICAgIHU2NCBwbGFpbnRleHRfbGVuLCAgLy8gTGVuZ3RoIG9mIGRhdGEgaW4gYnl0ZXMgZm9yIGVuY3J5cHRpb24uCisqICAgICAgICAgICAgICAgICAgICB1OCAqaXYsICAgICAgICAgICAgIC8vIFByZS1jb3VudGVyIGJsb2NrIGowOiA0IGJ5dGUgc2FsdCAoZnJvbSBTZWN1cml0eSBBc3NvY2lhdGlvbikKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGVkIHdpdGggOCBieXRlIEluaXRpYWxpc2F0aW9uIFZlY3RvciAoZnJvbSBJUFNlYyBFU1AgUGF5bG9hZCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGVkIHdpdGggMHgwMDAwMDAwMS4gMTYtYnl0ZSBhbGlnbmVkIHBvaW50ZXIuCisqICAgICAgICAgICAgICAgICAgICB1OCAqaGFzaF9zdWJrZXksICAgIC8vIEgsIHRoZSBIYXNoIHN1YiBrZXkgaW5wdXQuIERhdGEgc3RhcnRzIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4KKyogICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICphYWQsICAgICAgLy8gQWRkaXRpb25hbCBBdXRoZW50aWNhdGlvbiBEYXRhIChBQUQpCisqICAgICAgICAgICAgICAgICAgICB1NjQgYWFkX2xlbiwgICAgICAgIC8vIExlbmd0aCBvZiBBQUQgaW4gYnl0ZXMuIFdpdGggUkZDNDEwNiB0aGlzIGlzIGdvaW5nIHRvIGJlIDggb3IgMTIgYnl0ZXMKKyogICAgICAgICAgICAgICAgICAgIHU4ICphdXRoX3RhZywgICAgICAgLy8gQXV0aGVudGljYXRlZCBUYWcgb3V0cHV0LgorKiAgICAgICAgICAgICAgICAgICAgdTY0IGF1dGhfdGFnX2xlbik7ICAvLyBBdXRoZW50aWNhdGVkIFRhZyBMZW5ndGggaW4gYnl0ZXMuIFZhbGlkIHZhbHVlcyBhcmUgMTYgKG1vc3QgbGlrZWx5KSwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTIgb3IgOC4KKyoKKyogQXNzdW1wdGlvbnM6CisqCisqIGtleXM6CisqICAgICAgIGtleXMgYXJlIHByZS1leHBhbmRlZCBhbmQgYWxpZ25lZCB0byAxNiBieXRlcy4gd2UgYXJlIHVzaW5nIHRoZQorKiAgICAgICBmaXJzdCBzZXQgb2YgMTEga2V5cyBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdm9pZCAqYWVzX2N0eAorKgorKgorKiBpdjoKKyogICAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FsdCAgKEZyb20gdGhlIFNBKSAgICAgICAgICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uIFZlY3RvciAgICAgICAgICAgICAgICAgICAgIHwKKyogICAgICAgfCAgICAgICAgIChUaGlzIGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBJUFNlYyBoZWFkZXIpICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyogICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyoKKyoKKyoKKyogQUFEOgorKiAgICAgICBBQUQgcGFkZGVkIHRvIDEyOCBiaXRzIHdpdGggMAorKiAgICAgICBmb3IgZXhhbXBsZSwgYXNzdW1lIEFBRCBpcyBhIHUzMiB2ZWN0b3IKKyoKKyogICAgICAgaWYgQUFEIGlzIDggYnl0ZXM6CisqICAgICAgIEFBRFszXSA9IHtBMCwgQTF9OworKiAgICAgICBwYWRkZWQgQUFEIGluIHhtbSByZWdpc3RlciA9IHtBMSBBMCAwIDB9CisqCisqICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJIChBMSkgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAzMi1iaXQgU2VxdWVuY2UgTnVtYmVyIChBMCkgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFEIEZvcm1hdCB3aXRoIDMyLWJpdCBTZXF1ZW5jZSBOdW1iZXIKKyoKKyogICAgICAgaWYgQUFEIGlzIDEyIGJ5dGVzOgorKiAgICAgICBBQURbM10gPSB7QTAsIEExLCBBMn07CisqICAgICAgIHBhZGRlZCBBQUQgaW4geG1tIHJlZ2lzdGVyID0ge0EyIEExIEEwIDB9CisqCisqICAgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BJIChBMikgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgIDY0LWJpdCBFeHRlbmRlZCBTZXF1ZW5jZSBOdW1iZXIge0ExLEEwfSAgICAgICB8CisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisqICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgIEFBRCBGb3JtYXQgd2l0aCA2NC1iaXQgRXh0ZW5kZWQgU2VxdWVuY2UgTnVtYmVyCisqCisqIGFhZExlbjoKKyogICAgICAgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3BlYywgYWFkTGVuIGNhbiBvbmx5IGJlIDggb3IgMTIgYnl0ZXMuCisqICAgICAgIFRoZSBjb2RlIHN1cHBvcnRzIDE2IHRvbyBidXQgZm9yIG90aGVyIHNpemVzLCB0aGUgY29kZSB3aWxsIGZhaWwuCisqCisqIFRMZW46CisqICAgICAgIGZyb20gdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWMsIFRMZW4gY2FuIG9ubHkgYmUgOCwgMTIgb3IgMTYgYnl0ZXMuCisqICAgICAgIEZvciBvdGhlciBzaXplcywgdGhlIGNvZGUgd2lsbCBmYWlsLgorKgorKiBwb2x5ID0geF4xMjggKyB4XjEyNyArIHheMTI2ICsgeF4xMjEgKyAxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitFTlRSWShhZXNuaV9nY21fZW5jKQorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCW1vdgklcnNwLCAlcjE0CisjCisjIHN0YXRlcyBvZiAleG1tIHJlZ2lzdGVycyAleG1tNjoleG1tMTUgbm90IHNhdmVkCisjIGFsbCAleG1tIHJlZ2lzdGVycyBhcmUgY2xvYmJlcmVkCisjCisJc3ViCSRWQVJJQUJMRV9PRkZTRVQsICVyc3AKKwlhbmQJJH42MywgJXJzcAorCW1vdgklYXJnNiwgJXIxMgorCW1vdmRxdQkoJXIxMiksICV4bW0xMworICAgICAgICBtb3ZkcWEgIFNIVUZfTUFTSyglcmlwKSwgJXhtbTIKKwlQU0hVRkJfWE1NICV4bW0yLCAleG1tMTMKKworCisjIHByZWNvbXB1dGUgSGFzaEtleTw8MSBtb2QgcG9seSBmcm9tIHRoZSBIYXNoS2V5IChyZXF1aXJlZCBmb3IgR0hBU0gpCisKKwltb3ZkcWEJJXhtbTEzLCAleG1tMgorCXBzbGxxCSQxLCAleG1tMTMKKwlwc3JscQkkNjMsICV4bW0yCisJbW92ZHFhCSV4bW0yLCAleG1tMQorCXBzbGxkcQkkOCwgJXhtbTIKKwlwc3JsZHEJJDgsICV4bW0xCisJcG9yCSV4bW0yLCAleG1tMTMKKworICAgICAgICAjIHJlZHVjZSBIYXNoS2V5PDwxCisKKwlwc2h1ZmQJJDB4MjQsICV4bW0xLCAleG1tMgorCXBjbXBlcWQgVFdPT05FKCVyaXApLCAleG1tMgorCXBhbmQJUE9MWSglcmlwKSwgJXhtbTIKKwlweG9yCSV4bW0yLCAleG1tMTMKKwltb3ZkcWEJJXhtbTEzLCBIYXNoS2V5KCVyc3ApCisJbW92CSVhcmc0LCAlcjEzICAgICAgICAgICAgIyAleG1tMTMgaG9sZHMgSGFzaEtleTw8MSAobW9kIHBvbHkpCisJYW5kCSQtMTYsICVyMTMKKwltb3YJJXIxMywgJXIxMgorCisgICAgICAgICMgRW5jcnlwdCBmaXJzdCBmZXcgYmxvY2tzCisKKwlhbmQJJCgzPDw0KSwgJXIxMgorCWp6CV9pbml0aWFsX251bV9ibG9ja3NfaXNfMF9lbmNyeXB0CisJY21wCSQoMjw8NCksICVyMTIKKwlqYglfaW5pdGlhbF9udW1fYmxvY2tzX2lzXzFfZW5jcnlwdAorCWplCV9pbml0aWFsX251bV9ibG9ja3NfaXNfMl9lbmNyeXB0CitfaW5pdGlhbF9udW1fYmxvY2tzX2lzXzNfZW5jcnlwdDoKKwlJTklUSUFMX0JMT0NLU19FTkMJMywgJXhtbTksICV4bW0xMCwgJXhtbTEzLCAleG1tMTEsICV4bW0xMiwgJXhtbTAsIFwKKyV4bW0xLCAleG1tMiwgJXhtbTMsICV4bW00LCAleG1tOCwgJXhtbTUsICV4bW02LCA1LCA2NzgsIGVuYworCXN1YgkkNDgsICVyMTMKKwlqbXAJX2luaXRpYWxfYmxvY2tzX2VuY3J5cHRlZAorX2luaXRpYWxfbnVtX2Jsb2Nrc19pc18yX2VuY3J5cHQ6CisJSU5JVElBTF9CTE9DS1NfRU5DCTIsICV4bW05LCAleG1tMTAsICV4bW0xMywgJXhtbTExLCAleG1tMTIsICV4bW0wLCBcCisleG1tMSwgJXhtbTIsICV4bW0zLCAleG1tNCwgJXhtbTgsICV4bW01LCAleG1tNiwgNiwgNzgsIGVuYworCXN1YgkkMzIsICVyMTMKKwlqbXAJX2luaXRpYWxfYmxvY2tzX2VuY3J5cHRlZAorX2luaXRpYWxfbnVtX2Jsb2Nrc19pc18xX2VuY3J5cHQ6CisJSU5JVElBTF9CTE9DS1NfRU5DCTEsICV4bW05LCAleG1tMTAsICV4bW0xMywgJXhtbTExLCAleG1tMTIsICV4bW0wLCBcCisleG1tMSwgJXhtbTIsICV4bW0zLCAleG1tNCwgJXhtbTgsICV4bW01LCAleG1tNiwgNywgOCwgZW5jCisJc3ViCSQxNiwgJXIxMworCWptcAlfaW5pdGlhbF9ibG9ja3NfZW5jcnlwdGVkCitfaW5pdGlhbF9udW1fYmxvY2tzX2lzXzBfZW5jcnlwdDoKKwlJTklUSUFMX0JMT0NLU19FTkMJMCwgJXhtbTksICV4bW0xMCwgJXhtbTEzLCAleG1tMTEsICV4bW0xMiwgJXhtbTAsIFwKKyV4bW0xLCAleG1tMiwgJXhtbTMsICV4bW00LCAleG1tOCwgJXhtbTUsICV4bW02LCA4LCAwLCBlbmMKK19pbml0aWFsX2Jsb2Nrc19lbmNyeXB0ZWQ6CisKKyAgICAgICAgIyBNYWluIGxvb3AgLSBFbmNyeXB0IHJlbWFpbmluZyBibG9ja3MKKworCWNtcAkkMCwgJXIxMworCWplCV96ZXJvX2NpcGhlcl9sZWZ0X2VuY3J5cHQKKwlzdWIJJDY0LCAlcjEzCisJamUJX2ZvdXJfY2lwaGVyX2xlZnRfZW5jcnlwdAorX2VuY3J5cHRfYnlfNF9lbmNyeXB0OgorCUdIQVNIXzRfRU5DUllQVF80X1BBUkFMTEVMX0VOQwkleG1tOSwgJXhtbTEwLCAleG1tMTEsICV4bW0xMiwgJXhtbTEzLCBcCisleG1tMTQsICV4bW0wLCAleG1tMSwgJXhtbTIsICV4bW0zLCAleG1tNCwgJXhtbTUsICV4bW02LCAleG1tNywgJXhtbTgsIGVuYworCWFkZAkkNjQsICVyMTEKKwlzdWIJJDY0LCAlcjEzCisJam5lCV9lbmNyeXB0X2J5XzRfZW5jcnlwdAorX2ZvdXJfY2lwaGVyX2xlZnRfZW5jcnlwdDoKKwlHSEFTSF9MQVNUXzQJJXhtbTksICV4bW0xMCwgJXhtbTExLCAleG1tMTIsICV4bW0xMywgJXhtbTE0LCBcCisleG1tMTUsICV4bW0xLCAleG1tMiwgJXhtbTMsICV4bW00LCAleG1tOAorX3plcm9fY2lwaGVyX2xlZnRfZW5jcnlwdDoKKwltb3YJJWFyZzQsICVyMTMKKwlhbmQJJDE1LCAlcjEzCQkJIyAlcjEzID0gYXJnNCAobW9kIDE2KQorCWplCV9tdWx0aXBsZV9vZl8xNl9ieXRlc19lbmNyeXB0CisKKyAgICAgICAgICMgSGFuZGxlIHRoZSBsYXN0IDwxNiBCeXRlIGJsb2NrIHNlcGVyYXRlbHkKKwlwYWRkZCBPTkUoJXJpcCksICV4bW0wICAgICAgICAgICAgICAgICMgSU5DUiBDTlQgdG8gZ2V0IFluCisgICAgICAgIG1vdmRxYSBTSFVGX01BU0soJXJpcCksICV4bW0xMAorCVBTSFVGQl9YTU0gJXhtbTEwLCAleG1tMAorCisJRU5DUllQVF9TSU5HTEVfQkxPQ0sJJXhtbTAsICV4bW0xICAgICAgICAjIEVuY3J5cHQoSywgWW4pCisJc3ViICQxNiwgJXIxMQorCWFkZCAlcjEzLCAlcjExCisJbW92ZHF1ICglYXJnMywlcjExLDEpLCAleG1tMSAgICAgIyByZWNlaXZlIHRoZSBsYXN0IDwxNiBieXRlIGJsb2NrcworCWxlYSBTSElGVF9NQVNLKzE2KCVyaXApLCAlcjEyCisJc3ViICVyMTMsICVyMTIKKwkjIGFkanVzdCB0aGUgc2h1ZmZsZSBtYXNrIHBvaW50ZXIgdG8gYmUgYWJsZSB0byBzaGlmdCAxNi1yMTMgYnl0ZXMKKwkjICglcjEzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcGxhaW50ZXh0IG1vZCAxNikKKwltb3ZkcXUJKCVyMTIpLCAleG1tMiAgICAgICAgICAgIyBnZXQgdGhlIGFwcHJvcHJpYXRlIHNodWZmbGUgbWFzaworCVBTSFVGQl9YTU0JJXhtbTIsICV4bW0xICAgICAgICAgICAgIyBzaGlmdCByaWdodCAxNi1yMTMgYnl0ZQorCXB4b3IJJXhtbTEsICV4bW0wICAgICAgICAgICAgIyBQbGFpbnRleHQgWE9SIEVuY3J5cHQoSywgWW4pCisJbW92ZHF1CUFMTF9GLVNISUZUX01BU0soJXIxMiksICV4bW0xCisJIyBnZXQgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gbWFzayBvdXQgdG9wIDE2LXIxMyBieXRlcyBvZiB4bW0wCisJcGFuZAkleG1tMSwgJXhtbTAgICAgICAgICAgICAjIG1hc2sgb3V0IHRvcCAxNi1yMTMgYnl0ZXMgb2YgeG1tMAorICAgICAgICBtb3ZkcWEgU0hVRl9NQVNLKCVyaXApLCAleG1tMTAKKwlQU0hVRkJfWE1NICV4bW0xMCwleG1tMAorCisJcHhvcgkleG1tMCwgJXhtbTgKKwlHSEFTSF9NVUwgJXhtbTgsICV4bW0xMywgJXhtbTksICV4bW0xMCwgJXhtbTExLCAleG1tNSwgJXhtbTYKKwkjIEdIQVNIIGNvbXB1dGF0aW9uIGZvciB0aGUgbGFzdCA8MTYgYnl0ZSBibG9jaworCXN1YgklcjEzLCAlcjExCisJYWRkCSQxNiwgJXIxMQorCVBTSFVGQl9YTU0gJXhtbTEwLCAleG1tMQorCisJIyBzaHVmZmxlIHhtbTAgYmFjayB0byBvdXRwdXQgYXMgY2lwaGVydGV4dAorCisgICAgICAgICMgT3V0cHV0ICVyMTMgYnl0ZXMKKwlNT1ZRX1I2NF9YTU0gJXhtbTAsICVyYXgKKwljbXAgJDgsICVyMTMKKwlqbGUgX2xlc3NfdGhhbl84X2J5dGVzX2xlZnRfZW5jcnlwdAorCW1vdiAlcmF4LCAoJWFyZzIgLCAlcjExLCAxKQorCWFkZCAkOCwgJXIxMQorCXBzcmxkcSAkOCwgJXhtbTAKKwlNT1ZRX1I2NF9YTU0gJXhtbTAsICVyYXgKKwlzdWIgJDgsICVyMTMKK19sZXNzX3RoYW5fOF9ieXRlc19sZWZ0X2VuY3J5cHQ6CisJbW92ICVhbCwgICglYXJnMiwgJXIxMSwgMSkKKwlhZGQgJDEsICVyMTEKKwlzaHIgJDgsICVyYXgKKwlzdWIgJDEsICVyMTMKKwlqbmUgX2xlc3NfdGhhbl84X2J5dGVzX2xlZnRfZW5jcnlwdAorX211bHRpcGxlX29mXzE2X2J5dGVzX2VuY3J5cHQ6CisJbW92CWFyZzgsICVyMTIgICAgIyAlcjEyID0gYWRkTGVuIChudW1iZXIgb2YgYnl0ZXMpCisJc2hsCSQzLCAlcjEyCisJbW92ZAklcjEyZCwgJXhtbTE1ICAgICAgICMgbGVuKEEpIGluICV4bW0xNQorCXNobAkkMywgJWFyZzQgICAgICAgICAgICAgICAjIGxlbihDKSBpbiBiaXRzICgqMTI4KQorCU1PVlFfUjY0X1hNTQklYXJnNCwgJXhtbTEKKwlwc2xsZHEJJDgsICV4bW0xNSAgICAgICAgICAjICV4bW0xNSA9IGxlbihBKXx8MHgwMDAwMDAwMDAwMDAwMDAwCisJcHhvcgkleG1tMSwgJXhtbTE1ICAgICAgICMgJXhtbTE1ID0gbGVuKEEpfHxsZW4oQykKKwlweG9yCSV4bW0xNSwgJXhtbTgKKwlHSEFTSF9NVUwJJXhtbTgsICV4bW0xMywgJXhtbTksICV4bW0xMCwgJXhtbTExLCAleG1tNSwgJXhtbTYKKwkjIGZpbmFsIEdIQVNIIGNvbXB1dGF0aW9uCisgICAgICAgIG1vdmRxYSBTSFVGX01BU0soJXJpcCksICV4bW0xMAorCVBTSFVGQl9YTU0gJXhtbTEwLCAleG1tOCAgICAgICAgICMgcGVyZm9ybSBhIDE2IGJ5dGUgc3dhcAorCisJbW92CSVhcmc1LCAlcmF4CQkgICAgICAgIyAlcmF4ICA9ICpZMAorCW1vdmRxdQkoJXJheCksICV4bW0wCQkgICAgICAgIyAleG1tMCA9IFkwCisJRU5DUllQVF9TSU5HTEVfQkxPQ0sJJXhtbTAsICV4bW0xNSAgICAgICAgICMgRW5jcnlwdChLLCBZMCkKKwlweG9yCSV4bW04LCAleG1tMAorX3JldHVybl9UX2VuY3J5cHQ6CisJbW92CWFyZzksICVyMTAgICAgICAgICAgICAgICAgICAgICAjICVyMTAgPSBhdXRoVGFnCisJbW92CWFyZzEwLCAlcjExICAgICAgICAgICAgICAgICAgICAjICVyMTEgPSBhdXRoX3RhZ19sZW4KKwljbXAJJDE2LCAlcjExCisJamUJX1RfMTZfZW5jcnlwdAorCWNtcAkkMTIsICVyMTEKKwlqZQlfVF8xMl9lbmNyeXB0CitfVF84X2VuY3J5cHQ6CisJTU9WUV9SNjRfWE1NCSV4bW0wLCAlcmF4CisJbW92CSVyYXgsICglcjEwKQorCWptcAlfcmV0dXJuX1RfZG9uZV9lbmNyeXB0CitfVF8xMl9lbmNyeXB0OgorCU1PVlFfUjY0X1hNTQkleG1tMCwgJXJheAorCW1vdgklcmF4LCAoJXIxMCkKKwlwc3JsZHEJJDgsICV4bW0wCisJbW92ZAkleG1tMCwgJWVheAorCW1vdgklZWF4LCA4KCVyMTApCisJam1wCV9yZXR1cm5fVF9kb25lX2VuY3J5cHQKK19UXzE2X2VuY3J5cHQ6CisJbW92ZHF1CSV4bW0wLCAoJXIxMCkKK19yZXR1cm5fVF9kb25lX2VuY3J5cHQ6CisJbW92CSVyMTQsICVyc3AKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlyZXQKKworI2VuZGlmCisKIAogX2tleV9leHBhbnNpb25fMTI4OgogX2tleV9leHBhbnNpb25fMjU2YToKQEAgLTU1LDEwICsxNzA5LDExIEBACiAJc2h1ZnBzICQwYjEwMDAxMTAwLCAleG1tMCwgJXhtbTQKIAlweG9yICV4bW00LCAleG1tMAogCXB4b3IgJXhtbTEsICV4bW0wCi0JbW92YXBzICV4bW0wLCAoJXJjeCkKLQlhZGQgJDB4MTAsICVyY3gKKwltb3ZhcHMgJXhtbTAsIChUS0VZUCkKKwlhZGQgJDB4MTAsIFRLRVlQCiAJcmV0CiAKKy5hbGlnbiA0CiBfa2V5X2V4cGFuc2lvbl8xOTJhOgogCXBzaHVmZCAkMGIwMTAxMDEwMSwgJXhtbTEsICV4bW0xCiAJc2h1ZnBzICQwYjAwMDEwMDAwLCAleG1tMCwgJXhtbTQKQEAgLTc2LDEyICsxNzMxLDEzIEBACiAKIAltb3ZhcHMgJXhtbTAsICV4bW0xCiAJc2h1ZnBzICQwYjAxMDAwMTAwLCAleG1tMCwgJXhtbTYKLQltb3ZhcHMgJXhtbTYsICglcmN4KQorCW1vdmFwcyAleG1tNiwgKFRLRVlQKQogCXNodWZwcyAkMGIwMTAwMTExMCwgJXhtbTIsICV4bW0xCi0JbW92YXBzICV4bW0xLCAxNiglcmN4KQotCWFkZCAkMHgyMCwgJXJjeAorCW1vdmFwcyAleG1tMSwgMHgxMChUS0VZUCkKKwlhZGQgJDB4MjAsIFRLRVlQCiAJcmV0CiAKKy5hbGlnbiA0CiBfa2V5X2V4cGFuc2lvbl8xOTJiOgogCXBzaHVmZCAkMGIwMTAxMDEwMSwgJXhtbTEsICV4bW0xCiAJc2h1ZnBzICQwYjAwMDEwMDAwLCAleG1tMCwgJXhtbTQKQEAgLTk2LDEwICsxNzUyLDExIEBACiAJcHhvciAleG1tMywgJXhtbTIKIAlweG9yICV4bW01LCAleG1tMgogCi0JbW92YXBzICV4bW0wLCAoJXJjeCkKLQlhZGQgJDB4MTAsICVyY3gKKwltb3ZhcHMgJXhtbTAsIChUS0VZUCkKKwlhZGQgJDB4MTAsIFRLRVlQCiAJcmV0CiAKKy5hbGlnbiA0CiBfa2V5X2V4cGFuc2lvbl8yNTZiOgogCXBzaHVmZCAkMGIxMDEwMTAxMCwgJXhtbTEsICV4bW0xCiAJc2h1ZnBzICQwYjAwMDEwMDAwLCAleG1tMiwgJXhtbTQKQEAgLTEwNyw4ICsxNzY0LDggQEAKIAlzaHVmcHMgJDBiMTAwMDExMDAsICV4bW0yLCAleG1tNAogCXB4b3IgJXhtbTQsICV4bW0yCiAJcHhvciAleG1tMSwgJXhtbTIKLQltb3ZhcHMgJXhtbTIsICglcmN4KQotCWFkZCAkMHgxMCwgJXJjeAorCW1vdmFwcyAleG1tMiwgKFRLRVlQKQorCWFkZCAkMHgxMCwgVEtFWVAKIAlyZXQKIAogLyoKQEAgLTExNiwxNyArMTc3MywyMyBAQAogICogICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiAgKi8KIEVOVFJZKGFlc25pX3NldF9rZXkpCi0JbW92dXBzICglcnNpKSwgJXhtbTAJCSMgdXNlciBrZXkgKGZpcnN0IDE2IGJ5dGVzKQotCW1vdmFwcyAleG1tMCwgKCVyZGkpCi0JbGVhIDB4MTAoJXJkaSksICVyY3gJCSMga2V5IGFkZHIKLQltb3ZsICVlZHgsIDQ4MCglcmRpKQorI2lmbmRlZiBfX3g4Nl82NF9fCisJcHVzaGwgS0VZUAorCW1vdmwgOCglZXNwKSwgS0VZUAkJIyBjdHgKKwltb3ZsIDEyKCVlc3ApLCBVS0VZUAkJIyBpbl9rZXkKKwltb3ZsIDE2KCVlc3ApLCAlZWR4CQkjIGtleV9sZW4KKyNlbmRpZgorCW1vdnVwcyAoVUtFWVApLCAleG1tMAkJIyB1c2VyIGtleSAoZmlyc3QgMTYgYnl0ZXMpCisJbW92YXBzICV4bW0wLCAoS0VZUCkKKwlsZWEgMHgxMChLRVlQKSwgVEtFWVAJCSMga2V5IGFkZHIKKwltb3ZsICVlZHgsIDQ4MChLRVlQKQogCXB4b3IgJXhtbTQsICV4bW00CQkjIHhtbTQgaXMgYXNzdW1lZCAwIGluIF9rZXlfZXhwYW5zaW9uX3gKIAljbXAgJDI0LCAlZGwKIAlqYiAuTGVuY19rZXkxMjgKIAlqZSAuTGVuY19rZXkxOTIKLQltb3Z1cHMgMHgxMCglcnNpKSwgJXhtbTIJIyBvdGhlciB1c2VyIGtleQotCW1vdmFwcyAleG1tMiwgKCVyY3gpCi0JYWRkICQweDEwLCAlcmN4CisJbW92dXBzIDB4MTAoVUtFWVApLCAleG1tMgkjIG90aGVyIHVzZXIga2V5CisJbW92YXBzICV4bW0yLCAoVEtFWVApCisJYWRkICQweDEwLCBUS0VZUAogCUFFU0tFWUdFTkFTU0lTVCAweDEgJXhtbTIgJXhtbTEJCSMgcm91bmQgMQogCWNhbGwgX2tleV9leHBhbnNpb25fMjU2YQogCUFFU0tFWUdFTkFTU0lTVCAweDEgJXhtbTAgJXhtbTEKQEAgLTE1NSw3ICsxODE4LDcgQEAKIAljYWxsIF9rZXlfZXhwYW5zaW9uXzI1NmEKIAlqbXAgLkxkZWNfa2V5CiAuTGVuY19rZXkxOTI6Ci0JbW92cSAweDEwKCVyc2kpLCAleG1tMgkJIyBvdGhlciB1c2VyIGtleQorCW1vdnEgMHgxMChVS0VZUCksICV4bW0yCQkjIG90aGVyIHVzZXIga2V5CiAJQUVTS0VZR0VOQVNTSVNUIDB4MSAleG1tMiAleG1tMQkJIyByb3VuZCAxCiAJY2FsbCBfa2V5X2V4cGFuc2lvbl8xOTJhCiAJQUVTS0VZR0VOQVNTSVNUIDB4MiAleG1tMiAleG1tMQkJIyByb3VuZCAyCkBAIC0xOTUsMzMgKzE4NTgsNDcgQEAKIAlBRVNLRVlHRU5BU1NJU1QgMHgzNiAleG1tMCAleG1tMQkjIHJvdW5kIDEwCiAJY2FsbCBfa2V5X2V4cGFuc2lvbl8xMjgKIC5MZGVjX2tleToKLQlzdWIgJDB4MTAsICVyY3gKLQltb3ZhcHMgKCVyZGkpLCAleG1tMAotCW1vdmFwcyAoJXJjeCksICV4bW0xCi0JbW92YXBzICV4bW0wLCAyNDAoJXJjeCkKLQltb3ZhcHMgJXhtbTEsIDI0MCglcmRpKQotCWFkZCAkMHgxMCwgJXJkaQotCWxlYSAyNDAtMTYoJXJjeCksICVyc2kKKwlzdWIgJDB4MTAsIFRLRVlQCisJbW92YXBzIChLRVlQKSwgJXhtbTAKKwltb3ZhcHMgKFRLRVlQKSwgJXhtbTEKKwltb3ZhcHMgJXhtbTAsIDI0MChUS0VZUCkKKwltb3ZhcHMgJXhtbTEsIDI0MChLRVlQKQorCWFkZCAkMHgxMCwgS0VZUAorCWxlYSAyNDAtMTYoVEtFWVApLCBVS0VZUAogLmFsaWduIDQKIC5MZGVjX2tleV9sb29wOgotCW1vdmFwcyAoJXJkaSksICV4bW0wCisJbW92YXBzIChLRVlQKSwgJXhtbTAKIAlBRVNJTUMgJXhtbTAgJXhtbTEKLQltb3ZhcHMgJXhtbTEsICglcnNpKQotCWFkZCAkMHgxMCwgJXJkaQotCXN1YiAkMHgxMCwgJXJzaQotCWNtcCAlcmN4LCAlcmRpCisJbW92YXBzICV4bW0xLCAoVUtFWVApCisJYWRkICQweDEwLCBLRVlQCisJc3ViICQweDEwLCBVS0VZUAorCWNtcCBUS0VZUCwgS0VZUAogCWpiIC5MZGVjX2tleV9sb29wCi0JeG9yICVyYXgsICVyYXgKKwl4b3IgQVJFRywgQVJFRworI2lmbmRlZiBfX3g4Nl82NF9fCisJcG9wbCBLRVlQCisjZW5kaWYKIAlyZXQKIAogLyoKICAqIHZvaWQgYWVzbmlfZW5jKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogICovCiBFTlRSWShhZXNuaV9lbmMpCisjaWZuZGVmIF9feDg2XzY0X18KKwlwdXNobCBLRVlQCisJcHVzaGwgS0xFTgorCW1vdmwgMTIoJWVzcCksIEtFWVAKKwltb3ZsIDE2KCVlc3ApLCBPVVRQCisJbW92bCAyMCglZXNwKSwgSU5QCisjZW5kaWYKIAltb3ZsIDQ4MChLRVlQKSwgS0xFTgkJIyBrZXkgbGVuZ3RoCiAJbW92dXBzIChJTlApLCBTVEFURQkJIyBpbnB1dAogCWNhbGwgX2Flc25pX2VuYzEKIAltb3Z1cHMgU1RBVEUsIChPVVRQKQkJIyBvdXRwdXQKKyNpZm5kZWYgX194ODZfNjRfXworCXBvcGwgS0xFTgorCXBvcGwgS0VZUAorI2VuZGlmCiAJcmV0CiAKIC8qCkBAIC0yMzYsNiArMTkxMyw3IEBACiAgKglLRVkKICAqCVRLRVlQIChUMSkKICAqLworLmFsaWduIDQKIF9hZXNuaV9lbmMxOgogCW1vdmFwcyAoS0VZUCksIEtFWQkJIyBrZXkKIAltb3YgS0VZUCwgVEtFWVAKQEAgLTI5OCw2ICsxOTc2LDcgQEAKICAqCUtFWQogICoJVEtFWVAgKFQxKQogICovCisuYWxpZ24gNAogX2Flc25pX2VuYzQ6CiAJbW92YXBzIChLRVlQKSwgS0VZCQkjIGtleQogCW1vdiBLRVlQLCBUS0VZUApAQCAtMzkxLDExICsyMDcwLDIyIEBACiAgKiB2b2lkIGFlc25pX2RlYyAoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiAgKi8KIEVOVFJZKGFlc25pX2RlYykKKyNpZm5kZWYgX194ODZfNjRfXworCXB1c2hsIEtFWVAKKwlwdXNobCBLTEVOCisJbW92bCAxMiglZXNwKSwgS0VZUAorCW1vdmwgMTYoJWVzcCksIE9VVFAKKwltb3ZsIDIwKCVlc3ApLCBJTlAKKyNlbmRpZgogCW1vdiA0ODAoS0VZUCksIEtMRU4JCSMga2V5IGxlbmd0aAogCWFkZCAkMjQwLCBLRVlQCiAJbW92dXBzIChJTlApLCBTVEFURQkJIyBpbnB1dAogCWNhbGwgX2Flc25pX2RlYzEKIAltb3Z1cHMgU1RBVEUsIChPVVRQKQkJI291dHB1dAorI2lmbmRlZiBfX3g4Nl82NF9fCisJcG9wbCBLTEVOCisJcG9wbCBLRVlQCisjZW5kaWYKIAlyZXQKIAogLyoKQEAgLTQxMCw2ICsyMTAwLDcgQEAKICAqCUtFWQogICoJVEtFWVAgKFQxKQogICovCisuYWxpZ24gNAogX2Flc25pX2RlYzE6CiAJbW92YXBzIChLRVlQKSwgS0VZCQkjIGtleQogCW1vdiBLRVlQLCBUS0VZUApAQCAtNDcyLDYgKzIxNjMsNyBAQAogICoJS0VZCiAgKglUS0VZUCAoVDEpCiAgKi8KKy5hbGlnbiA0CiBfYWVzbmlfZGVjNDoKIAltb3ZhcHMgKEtFWVApLCBLRVkJCSMga2V5CiAJbW92IEtFWVAsIFRLRVlQCkBAIC01NjYsNiArMjI1OCwxNSBAQAogICoJCSAgICAgIHNpemVfdCBsZW4pCiAgKi8KIEVOVFJZKGFlc25pX2VjYl9lbmMpCisjaWZuZGVmIF9feDg2XzY0X18KKwlwdXNobCBMRU4KKwlwdXNobCBLRVlQCisJcHVzaGwgS0xFTgorCW1vdmwgMTYoJWVzcCksIEtFWVAKKwltb3ZsIDIwKCVlc3ApLCBPVVRQCisJbW92bCAyNCglZXNwKSwgSU5QCisJbW92bCAyOCglZXNwKSwgTEVOCisjZW5kaWYKIAl0ZXN0IExFTiwgTEVOCQkjIGNoZWNrIGxlbmd0aAogCWp6IC5MZWNiX2VuY19yZXQKIAltb3YgNDgwKEtFWVApLCBLTEVOCkBAIC02MDIsNiArMjMwMywxMSBAQAogCWNtcCAkMTYsIExFTgogCWpnZSAuTGVjYl9lbmNfbG9vcDEKIC5MZWNiX2VuY19yZXQ6CisjaWZuZGVmIF9feDg2XzY0X18KKwlwb3BsIEtMRU4KKwlwb3BsIEtFWVAKKwlwb3BsIExFTgorI2VuZGlmCiAJcmV0CiAKIC8qCkBAIC02MDksNiArMjMxNSwxNSBAQAogICoJCSAgICAgIHNpemVfdCBsZW4pOwogICovCiBFTlRSWShhZXNuaV9lY2JfZGVjKQorI2lmbmRlZiBfX3g4Nl82NF9fCisJcHVzaGwgTEVOCisJcHVzaGwgS0VZUAorCXB1c2hsIEtMRU4KKwltb3ZsIDE2KCVlc3ApLCBLRVlQCisJbW92bCAyMCglZXNwKSwgT1VUUAorCW1vdmwgMjQoJWVzcCksIElOUAorCW1vdmwgMjgoJWVzcCksIExFTgorI2VuZGlmCiAJdGVzdCBMRU4sIExFTgogCWp6IC5MZWNiX2RlY19yZXQKIAltb3YgNDgwKEtFWVApLCBLTEVOCkBAIC02NDYsNiArMjM2MSwxMSBAQAogCWNtcCAkMTYsIExFTgogCWpnZSAuTGVjYl9kZWNfbG9vcDEKIC5MZWNiX2RlY19yZXQ6CisjaWZuZGVmIF9feDg2XzY0X18KKwlwb3BsIEtMRU4KKwlwb3BsIEtFWVAKKwlwb3BsIExFTgorI2VuZGlmCiAJcmV0CiAKIC8qCkBAIC02NTMsNiArMjM3MywxNyBAQAogICoJCSAgICAgIHNpemVfdCBsZW4sIHU4ICppdikKICAqLwogRU5UUlkoYWVzbmlfY2JjX2VuYykKKyNpZm5kZWYgX194ODZfNjRfXworCXB1c2hsIElWUAorCXB1c2hsIExFTgorCXB1c2hsIEtFWVAKKwlwdXNobCBLTEVOCisJbW92bCAyMCglZXNwKSwgS0VZUAorCW1vdmwgMjQoJWVzcCksIE9VVFAKKwltb3ZsIDI4KCVlc3ApLCBJTlAKKwltb3ZsIDMyKCVlc3ApLCBMRU4KKwltb3ZsIDM2KCVlc3ApLCBJVlAKKyNlbmRpZgogCWNtcCAkMTYsIExFTgogCWpiIC5MY2JjX2VuY19yZXQKIAltb3YgNDgwKEtFWVApLCBLTEVOCkBAIC02NzAsNiArMjQwMSwxMiBAQAogCWpnZSAuTGNiY19lbmNfbG9vcAogCW1vdnVwcyBTVEFURSwgKElWUCkKIC5MY2JjX2VuY19yZXQ6CisjaWZuZGVmIF9feDg2XzY0X18KKwlwb3BsIEtMRU4KKwlwb3BsIEtFWVAKKwlwb3BsIExFTgorCXBvcGwgSVZQCisjZW5kaWYKIAlyZXQKIAogLyoKQEAgLTY3Nyw2ICsyNDE0LDE3IEBACiAgKgkJICAgICAgc2l6ZV90IGxlbiwgdTggKml2KQogICovCiBFTlRSWShhZXNuaV9jYmNfZGVjKQorI2lmbmRlZiBfX3g4Nl82NF9fCisJcHVzaGwgSVZQCisJcHVzaGwgTEVOCisJcHVzaGwgS0VZUAorCXB1c2hsIEtMRU4KKwltb3ZsIDIwKCVlc3ApLCBLRVlQCisJbW92bCAyNCglZXNwKSwgT1VUUAorCW1vdmwgMjgoJWVzcCksIElOUAorCW1vdmwgMzIoJWVzcCksIExFTgorCW1vdmwgMzYoJWVzcCksIElWUAorI2VuZGlmCiAJY21wICQxNiwgTEVOCiAJamIgLkxjYmNfZGVjX2p1c3RfcmV0CiAJbW92IDQ4MChLRVlQKSwgS0xFTgpAQCAtNjkwLDE2ICsyNDM4LDMwIEBACiAJbW92YXBzIElOMSwgU1RBVEUxCiAJbW92dXBzIDB4MTAoSU5QKSwgSU4yCiAJbW92YXBzIElOMiwgU1RBVEUyCisjaWZkZWYgX194ODZfNjRfXwogCW1vdnVwcyAweDIwKElOUCksIElOMwogCW1vdmFwcyBJTjMsIFNUQVRFMwogCW1vdnVwcyAweDMwKElOUCksIElONAogCW1vdmFwcyBJTjQsIFNUQVRFNAorI2Vsc2UKKwltb3Z1cHMgMHgyMChJTlApLCBJTjEKKwltb3ZhcHMgSU4xLCBTVEFURTMKKwltb3Z1cHMgMHgzMChJTlApLCBJTjIKKwltb3ZhcHMgSU4yLCBTVEFURTQKKyNlbmRpZgogCWNhbGwgX2Flc25pX2RlYzQKIAlweG9yIElWLCBTVEFURTEKKyNpZmRlZiBfX3g4Nl82NF9fCiAJcHhvciBJTjEsIFNUQVRFMgogCXB4b3IgSU4yLCBTVEFURTMKIAlweG9yIElOMywgU1RBVEU0CiAJbW92YXBzIElONCwgSVYKKyNlbHNlCisJcHhvciAoSU5QKSwgU1RBVEUyCisJcHhvciAweDEwKElOUCksIFNUQVRFMworCXB4b3IgSU4xLCBTVEFURTQKKwltb3ZhcHMgSU4yLCBJVgorI2VuZGlmCiAJbW92dXBzIFNUQVRFMSwgKE9VVFApCiAJbW92dXBzIFNUQVRFMiwgMHgxMChPVVRQKQogCW1vdnVwcyBTVEFURTMsIDB4MjAoT1VUUCkKQEAgLTcyNyw4ICsyNDg5LDE1IEBACiAuTGNiY19kZWNfcmV0OgogCW1vdnVwcyBJViwgKElWUCkKIC5MY2JjX2RlY19qdXN0X3JldDoKKyNpZm5kZWYgX194ODZfNjRfXworCXBvcGwgS0xFTgorCXBvcGwgS0VZUAorCXBvcGwgTEVOCisJcG9wbCBJVlAKKyNlbmRpZgogCXJldAogCisjaWZkZWYgX194ODZfNjRfXwogLmFsaWduIDE2CiAuTGJzd2FwX21hc2s6CiAJLmJ5dGUgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMApAQCAtNzQ0LDYgKzI1MTMsNyBAQAogICoJSU5DOgk9PSAxLCBpbiBsaXR0bGUgZW5kaWFuCiAgKglCU1dBUF9NQVNLID09IGVuZGlhbiBzd2FwcGluZyBtYXNrCiAgKi8KKy5hbGlnbiA0CiBfYWVzbmlfaW5jX2luaXQ6CiAJbW92YXBzIC5MYnN3YXBfbWFzaywgQlNXQVBfTUFTSwogCW1vdmFwcyBJViwgQ1RSCkBAIC03NjgsNiArMjUzOCw3IEBACiAgKglDVFI6CT09IG91dHB1dCBJViwgaW4gbGl0dGxlIGVuZGlhbgogICoJVENUUl9MT1c6ID09IGxvd2VyIHF3b3JkIG9mIENUUgogICovCisuYWxpZ24gNAogX2Flc25pX2luYzoKIAlwYWRkcSBJTkMsIENUUgogCWFkZCAkMSwgVENUUl9MT1cKQEAgLTgzOSwzICsyNjEwLDQgQEAKIAltb3Z1cHMgSVYsIChJVlApCiAuTGN0cl9lbmNfanVzdF9yZXQ6CiAJcmV0CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jCmluZGV4IDJjYjNkY2MuLmUxZTYwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYwpAQCAtNSw2ICs1LDE0IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIEludGVsIENvcnAuCiAgKiAgICBBdXRob3I6IEh1YW5nIFlpbmcgPHlpbmcuaHVhbmdAaW50ZWwuY29tPgogICoKKyAqIEFkZGVkIFJGQzQxMDYgQUVTLUdDTSBzdXBwb3J0IGZvciAxMjgtYml0IGtleXMgdW5kZXIgdGhlIEFFQUQKKyAqIGludGVyZmFjZSBmb3IgNjQtYml0IGtlcm5lbHMuCisgKiAgICBBdXRob3JzOiBBZHJpYW4gSG9iYW4gPGFkcmlhbi5ob2JhbkBpbnRlbC5jb20+CisgKiAgICAgICAgICAgICBHYWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGludGVsLmNvbT4KKyAqICAgICAgICAgICAgIFRhZGV1c3ogU3RydWsgKHRhZGV1c3ouc3RydWtAaW50ZWwuY29tKQorICogICAgICAgICAgICAgQWlkYW4gTydNYWhvbnkgKGFpZGFuLm8ubWFob255QGludGVsLmNvbSkKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjEsNiArMjksMTAgQEAKICNpbmNsdWRlIDxjcnlwdG8vY3RyLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vYWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NjYXR0ZXJ3YWxrLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2FlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1JZUFRPX0NUUikgfHwgZGVmaW5lZChDT05GSUdfQ1JZUFRPX0NUUl9NT0RVTEUpCiAjZGVmaW5lIEhBU19DVFIKQEAgLTQyLDggKzU0LDMxIEBACiAJc3RydWN0IGNyeXB0ZF9hYmxrY2lwaGVyICpjcnlwdGRfdGZtOwogfTsKIAotI2RlZmluZSBBRVNOSV9BTElHTgkxNgorLyogVGhpcyBkYXRhIGlzIHN0b3JlZCBhdCB0aGUgZW5kIG9mIHRoZSBjcnlwdG9fdGZtIHN0cnVjdC4KKyAqIEl0J3MgYSB0eXBlIG9mIHBlciAic2Vzc2lvbiIgZGF0YSBzdG9yYWdlIGxvY2F0aW9uLgorICogVGhpcyBuZWVkcyB0byBiZSAxNiBieXRlIGFsaWduZWQuCisgKi8KK3N0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHggeworCXU4IGhhc2hfc3Via2V5WzE2XTsKKwlzdHJ1Y3QgY3J5cHRvX2Flc19jdHggYWVzX2tleV9leHBhbmRlZDsKKwl1OCBub25jZVs0XTsKKwlzdHJ1Y3QgY3J5cHRkX2FlYWQgKmNyeXB0ZF90Zm07Cit9OworCitzdHJ1Y3QgYWVzbmlfZ2NtX3NldF9oYXNoX3N1YmtleV9yZXN1bHQgeworCWludCBlcnI7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKK307CisKK3N0cnVjdCBhZXNuaV9oYXNoX3N1YmtleV9yZXFfZGF0YSB7CisJdTggaXZbMTZdOworCXN0cnVjdCBhZXNuaV9nY21fc2V0X2hhc2hfc3Via2V5X3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworfTsKKworI2RlZmluZSBBRVNOSV9BTElHTgkoMTYpCiAjZGVmaW5lIEFFU19CTE9DS19NQVNLCSh+KEFFU19CTE9DS19TSVpFLTEpKQorI2RlZmluZSBSRkM0MTA2X0hBU0hfU1VCS0VZX1NJWkUgMTYKIAogYXNtbGlua2FnZSBpbnQgYWVzbmlfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX2Flc19jdHggKmN0eCwgY29uc3QgdTggKmluX2tleSwKIAkJCSAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pOwpAQCAtNTksOSArOTQsNjIgQEAKIAkJCSAgICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IGxlbiwgdTggKml2KTsKIGFzbWxpbmthZ2Ugdm9pZCBhZXNuaV9jYmNfZGVjKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4LCB1OCAqb3V0LAogCQkJICAgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqaXYpOworI2lmZGVmIENPTkZJR19YODZfNjQKIGFzbWxpbmthZ2Ugdm9pZCBhZXNuaV9jdHJfZW5jKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4LCB1OCAqb3V0LAogCQkJICAgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqaXYpOwogCisvKiBhc21saW5rYWdlIHZvaWQgYWVzbmlfZ2NtX2VuYygpCisgKiB2b2lkICpjdHgsICBBRVMgS2V5IHNjaGVkdWxlLiBTdGFydHMgb24gYSAxNiBieXRlIGJvdW5kYXJ5LgorICogdTggKm91dCwgQ2lwaGVydGV4dCBvdXRwdXQuIEVuY3J5cHQgaW4tcGxhY2UgaXMgYWxsb3dlZC4KKyAqIGNvbnN0IHU4ICppbiwgUGxhaW50ZXh0IGlucHV0CisgKiB1bnNpZ25lZCBsb25nIHBsYWludGV4dF9sZW4sIExlbmd0aCBvZiBkYXRhIGluIGJ5dGVzIGZvciBlbmNyeXB0aW9uLgorICogdTggKml2LCBQcmUtY291bnRlciBibG9jayBqMDogNCBieXRlIHNhbHQgKGZyb20gU2VjdXJpdHkgQXNzb2NpYXRpb24pCisgKiAgICAgICAgIGNvbmNhdGVuYXRlZCB3aXRoIDggYnl0ZSBJbml0aWFsaXNhdGlvbiBWZWN0b3IgKGZyb20gSVBTZWMgRVNQCisgKiAgICAgICAgIFBheWxvYWQpIGNvbmNhdGVuYXRlZCB3aXRoIDB4MDAwMDAwMDEuIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyLgorICogdTggKmhhc2hfc3Via2V5LCB0aGUgSGFzaCBzdWIga2V5IGlucHV0LiBEYXRhIHN0YXJ0cyBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuCisgKiBjb25zdCB1OCAqYWFkLCBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0aW9uIERhdGEgKEFBRCkKKyAqIHVuc2lnbmVkIGxvbmcgYWFkX2xlbiwgTGVuZ3RoIG9mIEFBRCBpbiBieXRlcy4gV2l0aCBSRkM0MTA2IHRoaXMKKyAqICAgICAgICAgIGlzIGdvaW5nIHRvIGJlIDggb3IgMTIgYnl0ZXMKKyAqIHU4ICphdXRoX3RhZywgQXV0aGVudGljYXRlZCBUYWcgb3V0cHV0LgorICogdW5zaWduZWQgbG9uZyBhdXRoX3RhZ19sZW4pLCBBdXRoZW50aWNhdGVkIFRhZyBMZW5ndGggaW4gYnl0ZXMuCisgKiAgICAgICAgICBWYWxpZCB2YWx1ZXMgYXJlIDE2IChtb3N0IGxpa2VseSksIDEyIG9yIDguCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBhZXNuaV9nY21fZW5jKHZvaWQgKmN0eCwgdTggKm91dCwKKwkJCWNvbnN0IHU4ICppbiwgdW5zaWduZWQgbG9uZyBwbGFpbnRleHRfbGVuLCB1OCAqaXYsCisJCQl1OCAqaGFzaF9zdWJrZXksIGNvbnN0IHU4ICphYWQsIHVuc2lnbmVkIGxvbmcgYWFkX2xlbiwKKwkJCXU4ICphdXRoX3RhZywgdW5zaWduZWQgbG9uZyBhdXRoX3RhZ19sZW4pOworCisvKiBhc21saW5rYWdlIHZvaWQgYWVzbmlfZ2NtX2RlYygpCisgKiB2b2lkICpjdHgsIEFFUyBLZXkgc2NoZWR1bGUuIFN0YXJ0cyBvbiBhIDE2IGJ5dGUgYm91bmRhcnkuCisgKiB1OCAqb3V0LCBQbGFpbnRleHQgb3V0cHV0LiBEZWNyeXB0IGluLXBsYWNlIGlzIGFsbG93ZWQuCisgKiBjb25zdCB1OCAqaW4sIENpcGhlcnRleHQgaW5wdXQKKyAqIHVuc2lnbmVkIGxvbmcgY2lwaGVydGV4dF9sZW4sIExlbmd0aCBvZiBkYXRhIGluIGJ5dGVzIGZvciBkZWNyeXB0aW9uLgorICogdTggKml2LCBQcmUtY291bnRlciBibG9jayBqMDogNCBieXRlIHNhbHQgKGZyb20gU2VjdXJpdHkgQXNzb2NpYXRpb24pCisgKiAgICAgICAgIGNvbmNhdGVuYXRlZCB3aXRoIDggYnl0ZSBJbml0aWFsaXNhdGlvbiBWZWN0b3IgKGZyb20gSVBTZWMgRVNQCisgKiAgICAgICAgIFBheWxvYWQpIGNvbmNhdGVuYXRlZCB3aXRoIDB4MDAwMDAwMDEuIDE2LWJ5dGUgYWxpZ25lZCBwb2ludGVyLgorICogdTggKmhhc2hfc3Via2V5LCB0aGUgSGFzaCBzdWIga2V5IGlucHV0LiBEYXRhIHN0YXJ0cyBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuCisgKiBjb25zdCB1OCAqYWFkLCBBZGRpdGlvbmFsIEF1dGhlbnRpY2F0aW9uIERhdGEgKEFBRCkKKyAqIHVuc2lnbmVkIGxvbmcgYWFkX2xlbiwgTGVuZ3RoIG9mIEFBRCBpbiBieXRlcy4gV2l0aCBSRkM0MTA2IHRoaXMgaXMgZ29pbmcKKyAqIHRvIGJlIDggb3IgMTIgYnl0ZXMKKyAqIHU4ICphdXRoX3RhZywgQXV0aGVudGljYXRlZCBUYWcgb3V0cHV0LgorICogdW5zaWduZWQgbG9uZyBhdXRoX3RhZ19sZW4pIEF1dGhlbnRpY2F0ZWQgVGFnIExlbmd0aCBpbiBieXRlcy4KKyAqIFZhbGlkIHZhbHVlcyBhcmUgMTYgKG1vc3QgbGlrZWx5KSwgMTIgb3IgOC4KKyAqLworYXNtbGlua2FnZSB2b2lkIGFlc25pX2djbV9kZWModm9pZCAqY3R4LCB1OCAqb3V0LAorCQkJY29uc3QgdTggKmluLCB1bnNpZ25lZCBsb25nIGNpcGhlcnRleHRfbGVuLCB1OCAqaXYsCisJCQl1OCAqaGFzaF9zdWJrZXksIGNvbnN0IHU4ICphYWQsIHVuc2lnbmVkIGxvbmcgYWFkX2xlbiwKKwkJCXU4ICphdXRoX3RhZywgdW5zaWduZWQgbG9uZyBhdXRoX3RhZ19sZW4pOworCitzdGF0aWMgaW5saW5lIHN0cnVjdAorYWVzbmlfcmZjNDEwNl9nY21fY3R4ICphZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtKQoreworCXJldHVybgorCQkoc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqKQorCQlQVFJfQUxJR04oKHU4ICopCisJCWNyeXB0b190Zm1fY3R4KGNyeXB0b19hZWFkX3RmbSh0Zm0pKSwgQUVTTklfQUxJR04pOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hZXNfY3R4ICphZXNfY3R4KHZvaWQgKnJhd19jdHgpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcmF3X2N0eDsKQEAgLTMyNCw2ICs0MTIsNyBAQAogCX0sCiB9OwogCisjaWZkZWYgQ09ORklHX1g4Nl82NAogc3RhdGljIHZvaWQgY3RyX2NyeXB0X2ZpbmFsKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4LAogCQkJICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKQEAgLTM4OSw2ICs0NzgsNyBAQAogCQl9LAogCX0sCiB9OworI2VuZGlmCiAKIHN0YXRpYyBpbnQgYWJsa19zZXRfa2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAogCQkJdW5zaWduZWQgaW50IGtleV9sZW4pCkBAIC01MzYsNiArNjI2LDcgQEAKIAl9LAogfTsKIAorI2lmZGVmIENPTkZJR19YODZfNjQKIHN0YXRpYyBpbnQgYWJsa19jdHJfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQogewogCXN0cnVjdCBjcnlwdGRfYWJsa2NpcGhlciAqY3J5cHRkX3RmbTsKQEAgLTYxMiw2ICs3MDMsNyBAQAogCX0sCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmZGVmIEhBU19MUlcKIHN0YXRpYyBpbnQgYWJsa19scndfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpAQCAtNzMwLDYgKzgyMiw0MjQgQEAKIH07CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyBpbnQgcmZjNDEwNl9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0ZF9hZWFkICpjcnlwdGRfdGZtOworCXN0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHggKmN0eCA9IChzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICopCisJCVBUUl9BTElHTigodTggKiljcnlwdG9fdGZtX2N0eCh0Zm0pLCBBRVNOSV9BTElHTik7CisJY3J5cHRkX3RmbSA9IGNyeXB0ZF9hbGxvY19hZWFkKCJfX2RyaXZlci1nY20tYWVzLWFlc25pIiwgMCwgMCk7CisJaWYgKElTX0VSUihjcnlwdGRfdGZtKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3J5cHRkX3RmbSk7CisJY3R4LT5jcnlwdGRfdGZtID0gY3J5cHRkX3RmbTsKKwl0Zm0tPmNydF9hZWFkLnJlcXNpemUgPSBzaXplb2Yoc3RydWN0IGFlYWRfcmVxdWVzdCkKKwkJKyBjcnlwdG9fYWVhZF9yZXFzaXplKCZjcnlwdGRfdGZtLT5iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZjNDEwNl9leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0KKwkJKHN0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHggKikKKwkJUFRSX0FMSUdOKCh1OCAqKWNyeXB0b190Zm1fY3R4KHRmbSksIEFFU05JX0FMSUdOKTsKKwlpZiAoIUlTX0VSUihjdHgtPmNyeXB0ZF90Zm0pKQorCQljcnlwdGRfZnJlZV9hZWFkKGN0eC0+Y3J5cHRkX3RmbSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcmZjNDEwNl9zZXRfaGFzaF9zdWJrZXlfZG9uZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgYWVzbmlfZ2NtX3NldF9oYXNoX3N1YmtleV9yZXN1bHQgKnJlc3VsdCA9IHJlcS0+ZGF0YTsKKworCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQorCQlyZXR1cm47CisJcmVzdWx0LT5lcnIgPSBlcnI7CisJY29tcGxldGUoJnJlc3VsdC0+Y29tcGxldGlvbik7Cit9CisKK3N0YXRpYyBpbnQKK3JmYzQxMDZfc2V0X2hhc2hfc3Via2V5KHU4ICpoYXNoX3N1YmtleSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleV9sZW4pCit7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICpjdHJfdGZtOworCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgYWVzbmlfaGFzaF9zdWJrZXlfcmVxX2RhdGEgKnJlcV9kYXRhOworCisJY3RyX3RmbSA9IGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKCJjdHIoYWVzKSIsIDAsIDApOworCWlmIChJU19FUlIoY3RyX3RmbSkpCisJCXJldHVybiBQVFJfRVJSKGN0cl90Zm0pOworCisJY3J5cHRvX2FibGtjaXBoZXJfY2xlYXJfZmxhZ3MoY3RyX3RmbSwgfjApOworCisJcmV0ID0gY3J5cHRvX2FibGtjaXBoZXJfc2V0a2V5KGN0cl90Zm0sIGtleSwga2V5X2xlbik7CisJaWYgKHJldCkgeworCQljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKGN0cl90Zm0pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlcSA9IGFibGtjaXBoZXJfcmVxdWVzdF9hbGxvYyhjdHJfdGZtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkgeworCQljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKGN0cl90Zm0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXFfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpyZXFfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcmVxX2RhdGEpIHsKKwkJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihjdHJfdGZtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChyZXFfZGF0YS0+aXYsIDAsIHNpemVvZihyZXFfZGF0YS0+aXYpKTsKKworCS8qIENsZWFyIHRoZSBkYXRhIGluIHRoZSBoYXNoIHN1YiBrZXkgY29udGFpbmVyIHRvIHplcm8uKi8KKwkvKiBXZSB3YW50IHRvIGNpcGhlciBhbGwgemVyb3MgdG8gY3JlYXRlIHRoZSBoYXNoIHN1YiBrZXkuICovCisJbWVtc2V0KGhhc2hfc3Via2V5LCAwLCBSRkM0MTA2X0hBU0hfU1VCS0VZX1NJWkUpOworCisJaW5pdF9jb21wbGV0aW9uKCZyZXFfZGF0YS0+cmVzdWx0LmNvbXBsZXRpb24pOworCXNnX2luaXRfb25lKCZyZXFfZGF0YS0+c2csIGhhc2hfc3Via2V5LCBSRkM0MTA2X0hBU0hfU1VCS0VZX1NJWkUpOworCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfdGZtKHJlcSwgY3RyX3RmbSk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9TTEVFUCB8CisJCQkJCUNSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorCQkJCQlyZmM0MTA2X3NldF9oYXNoX3N1YmtleV9kb25lLAorCQkJCQkmcmVxX2RhdGEtPnJlc3VsdCk7CisKKwlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgJnJlcV9kYXRhLT5zZywKKwkJJnJlcV9kYXRhLT5zZywgUkZDNDEwNl9IQVNIX1NVQktFWV9TSVpFLCByZXFfZGF0YS0+aXYpOworCisJcmV0ID0gY3J5cHRvX2FibGtjaXBoZXJfZW5jcnlwdChyZXEpOworCWlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUJVU1kpIHsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlCisJCQkoJnJlcV9kYXRhLT5yZXN1bHQuY29tcGxldGlvbik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcmVxX2RhdGEtPnJlc3VsdC5lcnI7CisJfQorCWFibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CisJa2ZyZWUocmVxX2RhdGEpOworCWNyeXB0b19mcmVlX2FibGtjaXBoZXIoY3RyX3RmbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZmM0MTA2X3NldF9rZXkoc3RydWN0IGNyeXB0b19hZWFkICpwYXJlbnQsIGNvbnN0IHU4ICprZXksCisJCQkJCQkgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gY3J5cHRvX2FlYWRfdGZtKHBhcmVudCk7CisJc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0gYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldChwYXJlbnQpOworCXU4ICpuZXdfa2V5X21lbSA9IE5VTEw7CisKKwlpZiAoa2V5X2xlbiA8IDQpIHsKKwkJY3J5cHRvX3RmbV9zZXRfZmxhZ3ModGZtLCBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKkFjY291bnQgZm9yIDQgYnl0ZSBub25jZSBhdCB0aGUgZW5kLiovCisJa2V5X2xlbiAtPSA0OworCWlmIChrZXlfbGVuICE9IEFFU19LRVlTSVpFXzEyOCkgeworCQljcnlwdG9fdGZtX3NldF9mbGFncyh0Zm0sIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtY3B5KGN0eC0+bm9uY2UsIGtleSArIGtleV9sZW4sIHNpemVvZihjdHgtPm5vbmNlKSk7CisJLypUaGlzIG11c3QgYmUgb24gYSAxNiBieXRlIGJvdW5kYXJ5ISovCisJaWYgKCh1bnNpZ25lZCBsb25nKSgmKGN0eC0+YWVzX2tleV9leHBhbmRlZC5rZXlfZW5jWzBdKSkgJSBBRVNOSV9BTElHTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpa2V5ICUgQUVTTklfQUxJR04pIHsKKwkJLyprZXkgaXMgbm90IGFsaWduZWQ6IHVzZSBhbiBhdXh1bGlhciBhbGlnbmVkIHBvaW50ZXIqLworCQluZXdfa2V5X21lbSA9IGttYWxsb2Moa2V5X2xlbitBRVNOSV9BTElHTiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X2tleV9tZW0pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQluZXdfa2V5X21lbSA9IFBUUl9BTElHTihuZXdfa2V5X21lbSwgQUVTTklfQUxJR04pOworCQltZW1jcHkobmV3X2tleV9tZW0sIGtleSwga2V5X2xlbik7CisJCWtleSA9IG5ld19rZXlfbWVtOworCX0KKworCWlmICghaXJxX2ZwdV91c2FibGUoKSkKKwkJcmV0ID0gY3J5cHRvX2Flc19leHBhbmRfa2V5KCYoY3R4LT5hZXNfa2V5X2V4cGFuZGVkKSwKKwkJa2V5LCBrZXlfbGVuKTsKKwllbHNlIHsKKwkJa2VybmVsX2ZwdV9iZWdpbigpOworCQlyZXQgPSBhZXNuaV9zZXRfa2V5KCYoY3R4LT5hZXNfa2V5X2V4cGFuZGVkKSwga2V5LCBrZXlfbGVuKTsKKwkJa2VybmVsX2ZwdV9lbmQoKTsKKwl9CisJLypUaGlzIG11c3QgYmUgb24gYSAxNiBieXRlIGJvdW5kYXJ5ISovCisJaWYgKCh1bnNpZ25lZCBsb25nKSgmKGN0eC0+aGFzaF9zdWJrZXlbMF0pKSAlIEFFU05JX0FMSUdOKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gcmZjNDEwNl9zZXRfaGFzaF9zdWJrZXkoY3R4LT5oYXNoX3N1YmtleSwga2V5LCBrZXlfbGVuKTsKK2V4aXQ6CisJa2ZyZWUobmV3X2tleV9tZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgaXMgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSAoYWthIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGFuZCBjYW4KKyAqIGJlIDgsIDEyIG9yIDE2IGJ5dGVzIGxvbmcuICovCitzdGF0aWMgaW50IHJmYzQxMDZfc2V0X2F1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAorCQkJCXVuc2lnbmVkIGludCBhdXRoc2l6ZSkKK3sKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHBhcmVudCk7CisJc3RydWN0IGNyeXB0b19hZWFkICpjcnlwdGRfY2hpbGQgPSBjcnlwdGRfYWVhZF9jaGlsZChjdHgtPmNyeXB0ZF90Zm0pOworCisJc3dpdGNoIChhdXRoc2l6ZSkgeworCWNhc2UgODoKKwljYXNlIDEyOgorCWNhc2UgMTY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljcnlwdG9fYWVhZF9jcnQocGFyZW50KS0+YXV0aHNpemUgPSBhdXRoc2l6ZTsKKwljcnlwdG9fYWVhZF9jcnQoY3J5cHRkX2NoaWxkKS0+YXV0aHNpemUgPSBhdXRoc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmM0MTA2X2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQ7CisJc3RydWN0IGNyeXB0b19hZWFkICp0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHRmbSk7CisJc3RydWN0IGNyeXB0b19hZWFkICpjcnlwdGRfY2hpbGQgPSBjcnlwdGRfYWVhZF9jaGlsZChjdHgtPmNyeXB0ZF90Zm0pOworCisJaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7CisJCXN0cnVjdCBhZWFkX3JlcXVlc3QgKmNyeXB0ZF9yZXEgPQorCQkJKHN0cnVjdCBhZWFkX3JlcXVlc3QgKikgYWVhZF9yZXF1ZXN0X2N0eChyZXEpOworCQltZW1jcHkoY3J5cHRkX3JlcSwgcmVxLCBzaXplb2YoKnJlcSkpOworCQlhZWFkX3JlcXVlc3Rfc2V0X3RmbShjcnlwdGRfcmVxLCAmY3R4LT5jcnlwdGRfdGZtLT5iYXNlKTsKKwkJcmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJa2VybmVsX2ZwdV9iZWdpbigpOworCQlyZXQgPSBjcnlwdGRfY2hpbGQtPmJhc2UuY3J0X2FlYWQuZW5jcnlwdChyZXEpOworCQlrZXJuZWxfZnB1X2VuZCgpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworc3RhdGljIGludCByZmM0MTA2X2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQ7CisJc3RydWN0IGNyeXB0b19hZWFkICp0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHRmbSk7CisJc3RydWN0IGNyeXB0b19hZWFkICpjcnlwdGRfY2hpbGQgPSBjcnlwdGRfYWVhZF9jaGlsZChjdHgtPmNyeXB0ZF90Zm0pOworCisJaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7CisJCXN0cnVjdCBhZWFkX3JlcXVlc3QgKmNyeXB0ZF9yZXEgPQorCQkJKHN0cnVjdCBhZWFkX3JlcXVlc3QgKikgYWVhZF9yZXF1ZXN0X2N0eChyZXEpOworCQltZW1jcHkoY3J5cHRkX3JlcSwgcmVxLCBzaXplb2YoKnJlcSkpOworCQlhZWFkX3JlcXVlc3Rfc2V0X3RmbShjcnlwdGRfcmVxLCAmY3R4LT5jcnlwdGRfdGZtLT5iYXNlKTsKKwkJcmV0dXJuIGNyeXB0b19hZWFkX2RlY3J5cHQoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJa2VybmVsX2ZwdV9iZWdpbigpOworCQlyZXQgPSBjcnlwdGRfY2hpbGQtPmJhc2UuY3J0X2FlYWQuZGVjcnlwdChyZXEpOworCQlrZXJuZWxfZnB1X2VuZCgpOworCQlyZXR1cm4gcmV0OworCX0KK30KKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIHJmYzQxMDZfYWxnID0geworCS5jcmFfbmFtZSA9ICJyZmM0MTA2KGdjbShhZXMpKSIsCisJLmNyYV9kcml2ZXJfbmFtZSA9ICJyZmM0MTA2LWdjbS1hZXNuaSIsCisJLmNyYV9wcmlvcml0eSA9IDQwMCwKKwkuY3JhX2ZsYWdzID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQgfCBDUllQVE9fQUxHX0FTWU5DLAorCS5jcmFfYmxvY2tzaXplID0gMSwKKwkuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCkgKyBBRVNOSV9BTElHTiwKKwkuY3JhX2FsaWdubWFzayA9IDAsCisJLmNyYV90eXBlID0gJmNyeXB0b19uaXZhZWFkX3R5cGUsCisJLmNyYV9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QgPSBMSVNUX0hFQURfSU5JVChyZmM0MTA2X2FsZy5jcmFfbGlzdCksCisJLmNyYV9pbml0ID0gcmZjNDEwNl9pbml0LAorCS5jcmFfZXhpdCA9IHJmYzQxMDZfZXhpdCwKKwkuY3JhX3UgPSB7CisJCS5hZWFkID0geworCQkJLnNldGtleSA9IHJmYzQxMDZfc2V0X2tleSwKKwkJCS5zZXRhdXRoc2l6ZSA9IHJmYzQxMDZfc2V0X2F1dGhzaXplLAorCQkJLmVuY3J5cHQgPSByZmM0MTA2X2VuY3J5cHQsCisJCQkuZGVjcnlwdCA9IHJmYzQxMDZfZGVjcnlwdCwKKwkJCS5nZW5pdiA9ICJzZXFpdiIsCisJCQkuaXZzaXplID0gOCwKKwkJCS5tYXhhdXRoc2l6ZSA9IDE2LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZHJpdmVyX3JmYzQxMDZfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCit7CisJdTggb25lX2VudHJ5X2luX3NnID0gMDsKKwl1OCAqc3JjLCAqZHN0LCAqYXNzb2M7CisJX19iZTMyIGNvdW50ZXIgPSBjcHVfdG9fYmUzMigxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOworCXN0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHggKmN0eCA9IGFlc25pX3JmYzQxMDZfZ2NtX2N0eF9nZXQodGZtKTsKKwl2b2lkICphZXNfY3R4ID0gJihjdHgtPmFlc19rZXlfZXhwYW5kZWQpOworCXVuc2lnbmVkIGxvbmcgYXV0aF90YWdfbGVuID0gY3J5cHRvX2FlYWRfYXV0aHNpemUodGZtKTsKKwl1OCBpdl90YWJbMTYrQUVTTklfQUxJR05dOworCXU4KiBpdiA9ICh1OCAqKSBQVFJfQUxJR04oKHU4ICopaXZfdGFiLCBBRVNOSV9BTElHTik7CisJc3RydWN0IHNjYXR0ZXJfd2FsayBzcmNfc2dfd2FsazsKKwlzdHJ1Y3Qgc2NhdHRlcl93YWxrIGFzc29jX3NnX3dhbGs7CisJc3RydWN0IHNjYXR0ZXJfd2FsayBkc3Rfc2dfd2FsazsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEFzc3VtaW5nIHdlIGFyZSBzdXBwb3J0aW5nIHJmYzQxMDYgNjQtYml0IGV4dGVuZGVkICovCisJLyogc2VxdWVuY2UgbnVtYmVycyBXZSBuZWVkIHRvIGhhdmUgdGhlIEFBRCBsZW5ndGggZXF1YWwgKi8KKwkvKiB0byA4IG9yIDEyIGJ5dGVzICovCisJaWYgKHVubGlrZWx5KHJlcS0+YXNzb2NsZW4gIT0gOCAmJiByZXEtPmFzc29jbGVuICE9IDEyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogSVYgYmVsb3cgYnVpbHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkqKGl2K2kpID0gY3R4LT5ub25jZVtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkqKGl2KzQraSkgPSByZXEtPml2W2ldOworCSooKF9fYmUzMiAqKShpdisxMikpID0gY291bnRlcjsKKworCWlmICgoc2dfaXNfbGFzdChyZXEtPnNyYykpICYmIChzZ19pc19sYXN0KHJlcS0+YXNzb2MpKSkgeworCQlvbmVfZW50cnlfaW5fc2cgPSAxOworCQlzY2F0dGVyd2Fsa19zdGFydCgmc3JjX3NnX3dhbGssIHJlcS0+c3JjKTsKKwkJc2NhdHRlcndhbGtfc3RhcnQoJmFzc29jX3NnX3dhbGssIHJlcS0+YXNzb2MpOworCQlzcmMgPSBzY2F0dGVyd2Fsa19tYXAoJnNyY19zZ193YWxrLCAwKTsKKwkJYXNzb2MgPSBzY2F0dGVyd2Fsa19tYXAoJmFzc29jX3NnX3dhbGssIDApOworCQlkc3QgPSBzcmM7CisJCWlmICh1bmxpa2VseShyZXEtPnNyYyAhPSByZXEtPmRzdCkpIHsKKwkJCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZkc3Rfc2dfd2FsaywgcmVxLT5kc3QpOworCQkJZHN0ID0gc2NhdHRlcndhbGtfbWFwKCZkc3Rfc2dfd2FsaywgMCk7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc3JjLCBkc3QsIGFzc29jICovCisJCXNyYyA9IGttYWxsb2MocmVxLT5jcnlwdGxlbiArIGF1dGhfdGFnX2xlbiArIHJlcS0+YXNzb2NsZW4sCisJCQlHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFzcmMpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWFzc29jID0gKHNyYyArIHJlcS0+Y3J5cHRsZW4gKyBhdXRoX3RhZ19sZW4pOworCQlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoc3JjLCByZXEtPnNyYywgMCwgcmVxLT5jcnlwdGxlbiwgMCk7CisJCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShhc3NvYywgcmVxLT5hc3NvYywgMCwKKwkJCQkJcmVxLT5hc3NvY2xlbiwgMCk7CisJCWRzdCA9IHNyYzsKKwl9CisKKwlhZXNuaV9nY21fZW5jKGFlc19jdHgsIGRzdCwgc3JjLCAodW5zaWduZWQgbG9uZylyZXEtPmNyeXB0bGVuLCBpdiwKKwkJY3R4LT5oYXNoX3N1YmtleSwgYXNzb2MsICh1bnNpZ25lZCBsb25nKXJlcS0+YXNzb2NsZW4sIGRzdAorCQkrICgodW5zaWduZWQgbG9uZylyZXEtPmNyeXB0bGVuKSwgYXV0aF90YWdfbGVuKTsKKworCS8qIFRoZSBhdXRoVGFnIChha2EgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSkgbmVlZHMgdG8gYmUgd3JpdHRlbgorCSAqIGJhY2sgdG8gdGhlIHBhY2tldC4gKi8KKwlpZiAob25lX2VudHJ5X2luX3NnKSB7CisJCWlmICh1bmxpa2VseShyZXEtPnNyYyAhPSByZXEtPmRzdCkpIHsKKwkJCXNjYXR0ZXJ3YWxrX3VubWFwKGRzdCwgMCk7CisJCQlzY2F0dGVyd2Fsa19kb25lKCZkc3Rfc2dfd2FsaywgMCwgMCk7CisJCX0KKwkJc2NhdHRlcndhbGtfdW5tYXAoc3JjLCAwKTsKKwkJc2NhdHRlcndhbGtfdW5tYXAoYXNzb2MsIDApOworCQlzY2F0dGVyd2Fsa19kb25lKCZzcmNfc2dfd2FsaywgMCwgMCk7CisJCXNjYXR0ZXJ3YWxrX2RvbmUoJmFzc29jX3NnX3dhbGssIDAsIDApOworCX0gZWxzZSB7CisJCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShkc3QsIHJlcS0+ZHN0LCAwLAorCQkJcmVxLT5jcnlwdGxlbiArIGF1dGhfdGFnX2xlbiwgMSk7CisJCWtmcmVlKHNyYyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZHJpdmVyX3JmYzQxMDZfZGVjcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCit7CisJdTggb25lX2VudHJ5X2luX3NnID0gMDsKKwl1OCAqc3JjLCAqZHN0LCAqYXNzb2M7CisJdW5zaWduZWQgbG9uZyB0ZW1wQ2lwaGVyTGVuID0gMDsKKwlfX2JlMzIgY291bnRlciA9IGNwdV90b19iZTMyKDEpOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CisJc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0gYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldCh0Zm0pOworCXZvaWQgKmFlc19jdHggPSAmKGN0eC0+YWVzX2tleV9leHBhbmRlZCk7CisJdW5zaWduZWQgbG9uZyBhdXRoX3RhZ19sZW4gPSBjcnlwdG9fYWVhZF9hdXRoc2l6ZSh0Zm0pOworCXU4IGl2X2FuZF9hdXRoVGFnWzMyK0FFU05JX0FMSUdOXTsKKwl1OCAqaXYgPSAodTggKikgUFRSX0FMSUdOKCh1OCAqKWl2X2FuZF9hdXRoVGFnLCBBRVNOSV9BTElHTik7CisJdTggKmF1dGhUYWcgPSBpdiArIDE2OworCXN0cnVjdCBzY2F0dGVyX3dhbGsgc3JjX3NnX3dhbGs7CisJc3RydWN0IHNjYXR0ZXJfd2FsayBhc3NvY19zZ193YWxrOworCXN0cnVjdCBzY2F0dGVyX3dhbGsgZHN0X3NnX3dhbGs7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAodW5saWtlbHkoKHJlcS0+Y3J5cHRsZW4gPCBhdXRoX3RhZ19sZW4pIHx8CisJCShyZXEtPmFzc29jbGVuICE9IDggJiYgcmVxLT5hc3NvY2xlbiAhPSAxMikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBBc3N1bWluZyB3ZSBhcmUgc3VwcG9ydGluZyByZmM0MTA2IDY0LWJpdCBleHRlbmRlZCAqLworCS8qIHNlcXVlbmNlIG51bWJlcnMgV2UgbmVlZCB0byBoYXZlIHRoZSBBQUQgbGVuZ3RoICovCisJLyogZXF1YWwgdG8gOCBvciAxMiBieXRlcyAqLworCisJdGVtcENpcGhlckxlbiA9ICh1bnNpZ25lZCBsb25nKShyZXEtPmNyeXB0bGVuIC0gYXV0aF90YWdfbGVuKTsKKwkvKiBJViBiZWxvdyBidWlsdCAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCSooaXYraSkgPSBjdHgtPm5vbmNlW2ldOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCSooaXYrNCtpKSA9IHJlcS0+aXZbaV07CisJKigoX19iZTMyICopKGl2KzEyKSkgPSBjb3VudGVyOworCisJaWYgKChzZ19pc19sYXN0KHJlcS0+c3JjKSkgJiYgKHNnX2lzX2xhc3QocmVxLT5hc3NvYykpKSB7CisJCW9uZV9lbnRyeV9pbl9zZyA9IDE7CisJCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZzcmNfc2dfd2FsaywgcmVxLT5zcmMpOworCQlzY2F0dGVyd2Fsa19zdGFydCgmYXNzb2Nfc2dfd2FsaywgcmVxLT5hc3NvYyk7CisJCXNyYyA9IHNjYXR0ZXJ3YWxrX21hcCgmc3JjX3NnX3dhbGssIDApOworCQlhc3NvYyA9IHNjYXR0ZXJ3YWxrX21hcCgmYXNzb2Nfc2dfd2FsaywgMCk7CisJCWRzdCA9IHNyYzsKKwkJaWYgKHVubGlrZWx5KHJlcS0+c3JjICE9IHJlcS0+ZHN0KSkgeworCQkJc2NhdHRlcndhbGtfc3RhcnQoJmRzdF9zZ193YWxrLCByZXEtPmRzdCk7CisJCQlkc3QgPSBzY2F0dGVyd2Fsa19tYXAoJmRzdF9zZ193YWxrLCAwKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzcmMsIGRzdCwgYXNzb2MgKi8KKwkJc3JjID0ga21hbGxvYyhyZXEtPmNyeXB0bGVuICsgcmVxLT5hc3NvY2xlbiwgR0ZQX0FUT01JQyk7CisJCWlmICghc3JjKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWFzc29jID0gKHNyYyArIHJlcS0+Y3J5cHRsZW4gKyBhdXRoX3RhZ19sZW4pOworCQlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoc3JjLCByZXEtPnNyYywgMCwgcmVxLT5jcnlwdGxlbiwgMCk7CisJCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShhc3NvYywgcmVxLT5hc3NvYywgMCwKKwkJCXJlcS0+YXNzb2NsZW4sIDApOworCQlkc3QgPSBzcmM7CisJfQorCisJYWVzbmlfZ2NtX2RlYyhhZXNfY3R4LCBkc3QsIHNyYywgdGVtcENpcGhlckxlbiwgaXYsCisJCWN0eC0+aGFzaF9zdWJrZXksIGFzc29jLCAodW5zaWduZWQgbG9uZylyZXEtPmFzc29jbGVuLAorCQlhdXRoVGFnLCBhdXRoX3RhZ19sZW4pOworCisJLyogQ29tcGFyZSBnZW5lcmF0ZWQgdGFnIHdpdGggcGFzc2VkIGluIHRhZy4gKi8KKwlyZXR2YWwgPSBtZW1jbXAoc3JjICsgdGVtcENpcGhlckxlbiwgYXV0aFRhZywgYXV0aF90YWdfbGVuKSA/CisJCS1FQkFETVNHIDogMDsKKworCWlmIChvbmVfZW50cnlfaW5fc2cpIHsKKwkJaWYgKHVubGlrZWx5KHJlcS0+c3JjICE9IHJlcS0+ZHN0KSkgeworCQkJc2NhdHRlcndhbGtfdW5tYXAoZHN0LCAwKTsKKwkJCXNjYXR0ZXJ3YWxrX2RvbmUoJmRzdF9zZ193YWxrLCAwLCAwKTsKKwkJfQorCQlzY2F0dGVyd2Fsa191bm1hcChzcmMsIDApOworCQlzY2F0dGVyd2Fsa191bm1hcChhc3NvYywgMCk7CisJCXNjYXR0ZXJ3YWxrX2RvbmUoJnNyY19zZ193YWxrLCAwLCAwKTsKKwkJc2NhdHRlcndhbGtfZG9uZSgmYXNzb2Nfc2dfd2FsaywgMCwgMCk7CisJfSBlbHNlIHsKKwkJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KGRzdCwgcmVxLT5kc3QsIDAsIHJlcS0+Y3J5cHRsZW4sIDEpOworCQlrZnJlZShzcmMpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgX19yZmM0MTA2X2FsZyA9IHsKKwkuY3JhX25hbWUJCT0gIl9fZ2NtLWFlcy1hZXNuaSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1nY20tYWVzLWFlc25pIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQUVBRCwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPSAxLAorCS5jcmFfY3R4c2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4KSArIEFFU05JX0FMSUdOLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJLmNyYV90eXBlCQk9ICZjcnlwdG9fYWVhZF90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChfX3JmYzQxMDZfYWxnLmNyYV9saXN0KSwKKwkuY3JhX3UgPSB7CisJCS5hZWFkID0geworCQkJLmVuY3J5cHQJPSBfX2RyaXZlcl9yZmM0MTA2X2VuY3J5cHQsCisJCQkuZGVjcnlwdAk9IF9fZHJpdmVyX3JmYzQxMDZfZGVjcnlwdCwKKwkJfSwKKwl9LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IF9faW5pdCBhZXNuaV9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTczOCw2ICsxMjQ4LDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZWwgQUVTLU5JIGluc3RydWN0aW9ucyBhcmUgbm90IGRldGVjdGVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwogCWlmICgoZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWVzbmlfYWxnKSkpCiAJCWdvdG8gYWVzX2VycjsKIAlpZiAoKGVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJl9fYWVzbmlfYWxnKSkpCkBAIC03NDYsMTggKzEyNTcsMjQgQEAKIAkJZ290byBibGtfZWNiX2VycjsKIAlpZiAoKGVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jYmNfYWxnKSkpCiAJCWdvdG8gYmxrX2NiY19lcnI7Ci0JaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZibGtfY3RyX2FsZykpKQotCQlnb3RvIGJsa19jdHJfZXJyOwogCWlmICgoZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWJsa19lY2JfYWxnKSkpCiAJCWdvdG8gYWJsa19lY2JfZXJyOwogCWlmICgoZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmYWJsa19jYmNfYWxnKSkpCiAJCWdvdG8gYWJsa19jYmNfZXJyOworI2lmZGVmIENPTkZJR19YODZfNjQKKwlpZiAoKGVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmJsa19jdHJfYWxnKSkpCisJCWdvdG8gYmxrX2N0cl9lcnI7CiAJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhYmxrX2N0cl9hbGcpKSkKIAkJZ290byBhYmxrX2N0cl9lcnI7CisJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZfX3JmYzQxMDZfYWxnKSkpCisJCWdvdG8gX19hZWFkX2djbV9lcnI7CisJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZyZmM0MTA2X2FsZykpKQorCQlnb3RvIGFlYWRfZ2NtX2VycjsKICNpZmRlZiBIQVNfQ1RSCiAJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhYmxrX3JmYzM2ODZfY3RyX2FsZykpKQogCQlnb3RvIGFibGtfcmZjMzY4Nl9jdHJfZXJyOwogI2VuZGlmCisjZW5kaWYKICNpZmRlZiBIQVNfTFJXCiAJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhYmxrX2xyd19hbGcpKSkKIAkJZ290byBhYmxrX2xyd19lcnI7CkBAIC03NzAsNyArMTI4Nyw2IEBACiAJaWYgKChlcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhYmxrX3h0c19hbGcpKSkKIAkJZ290byBhYmxrX3h0c19lcnI7CiAjZW5kaWYKLQogCXJldHVybiBlcnI7CiAKICNpZmRlZiBIQVNfWFRTCkBAIC03ODQsMTggKzEzMDAsMjQgQEAKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFibGtfbHJ3X2FsZyk7CiBhYmxrX2xyd19lcnI6CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2XzY0CiAjaWZkZWYgSEFTX0NUUgogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWJsa19yZmMzNjg2X2N0cl9hbGcpOwogYWJsa19yZmMzNjg2X2N0cl9lcnI6CiAjZW5kaWYKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJnJmYzQxMDZfYWxnKTsKK2FlYWRfZ2NtX2VycjoKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJl9fcmZjNDEwNl9hbGcpOworX19hZWFkX2djbV9lcnI6CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhYmxrX2N0cl9hbGcpOwogYWJsa19jdHJfZXJyOgorCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2N0cl9hbGcpOworYmxrX2N0cl9lcnI6CisjZW5kaWYKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFibGtfY2JjX2FsZyk7CiBhYmxrX2NiY19lcnI6CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhYmxrX2VjYl9hbGcpOwogYWJsa19lY2JfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2N0cl9hbGcpOwotYmxrX2N0cl9lcnI6CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY2JjX2FsZyk7CiBibGtfY2JjX2VycjoKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmJsa19lY2JfYWxnKTsKQEAgLTgxOCwxMyArMTM0MCwxNyBAQAogI2lmZGVmIEhBU19MUlcKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFibGtfbHJ3X2FsZyk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2XzY0CiAjaWZkZWYgSEFTX0NUUgogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWJsa19yZmMzNjg2X2N0cl9hbGcpOwogI2VuZGlmCisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZyZmM0MTA2X2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZfX3JmYzQxMDZfYWxnKTsKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFibGtfY3RyX2FsZyk7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZibGtfY3RyX2FsZyk7CisjZW5kaWYKIAljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFibGtfY2JjX2FsZyk7CiAJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhYmxrX2VjYl9hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2N0cl9hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2NiY19hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYmxrX2VjYl9hbGcpOwogCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmX19hZXNuaV9hbGcpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oCmluZGV4IDU1ZDEwNmIuLjIxMWNhM2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FjcGkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hY3BpLmgKQEAgLTE4NSwxNyArMTg1LDE2IEBACiAKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiBleHRlcm4gaW50IGFjcGlfbnVtYTsKLWV4dGVybiBpbnQgYWNwaV9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpwaHlzbm9kZXMpOworZXh0ZXJuIHZvaWQgYWNwaV9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpwaHlzbm9kZXMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIGludCBhY3BpX3NjYW5fbm9kZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogI2RlZmluZSBOUl9OT0RFX01FTUJMS1MgKE1BWF9OVU1OT0RFUyoyKQorCisjaWZkZWYgQ09ORklHX05VTUFfRU1VCiBleHRlcm4gdm9pZCBhY3BpX2Zha2Vfbm9kZXMoY29uc3Qgc3RydWN0IGJvb3Rub2RlICpmYWtlX25vZGVzLAogCQkJCSAgIGludCBudW1fbm9kZXMpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Zha2Vfbm9kZXMoY29uc3Qgc3RydWN0IGJvb3Rub2RlICpmYWtlX25vZGVzLAotCQkJCSAgIGludCBudW1fbm9kZXMpCi17Ci19CiAjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9OVU1BICovCiAKICNkZWZpbmUgYWNwaV91bmxhenlfdGxiKHgpCWxlYXZlX21tKHgpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9uYi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKaW5kZXggNmFlZTUwZC4uNjRkYzgyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmgKQEAgLTMsMTYgKzMsMjcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCitzdHJ1Y3QgYW1kX25iX2J1c19kZXZfcmFuZ2UgeworCXU4IGJ1czsKKwl1OCBkZXZfYmFzZTsKKwl1OCBkZXZfbGltaXQ7Cit9OworCiBleHRlcm4gc3RydWN0IHBjaV9kZXZpY2VfaWQgYW1kX25iX21pc2NfaWRzW107CitleHRlcm4gY29uc3Qgc3RydWN0IGFtZF9uYl9idXNfZGV2X3JhbmdlIGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tdOwogc3RydWN0IGJvb3Rub2RlOwogCiBleHRlcm4gaW50IGVhcmx5X2lzX2FtZF9uYih1MzIgdmFsdWUpOwogZXh0ZXJuIGludCBhbWRfY2FjaGVfbm9ydGhicmlkZ2VzKHZvaWQpOwogZXh0ZXJuIHZvaWQgYW1kX2ZsdXNoX2dhcnRzKHZvaWQpOwotZXh0ZXJuIGludCBhbWRfZ2V0X25vZGVzKHN0cnVjdCBib290bm9kZSAqbm9kZXMpOwogZXh0ZXJuIGludCBhbWRfbnVtYV9pbml0KHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogZXh0ZXJuIGludCBhbWRfc2Nhbl9ub2Rlcyh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19OVU1BX0VNVQorZXh0ZXJuIHZvaWQgYW1kX2Zha2Vfbm9kZXMoY29uc3Qgc3RydWN0IGJvb3Rub2RlICpub2RlcywgaW50IG5yX25vZGVzKTsKK2V4dGVybiB2b2lkIGFtZF9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpub2Rlcyk7CisjZW5kaWYKKwogc3RydWN0IGFtZF9ub3J0aGJyaWRnZSB7CiAJc3RydWN0IHBjaV9kZXYgKm1pc2M7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdC5oCmluZGV4IDNiNjJhYjUuLjVlMWEyZWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Jvb3QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290LmgKQEAgLTMyLDExICszMiw3IEBACiAjZGVmaW5lIEJPT1RfSEVBUF9TSVpFICAgICAgICAgICAgIDB4NDAwMDAwCiAjZWxzZSAvKiAhQ09ORklHX0tFUk5FTF9CWklQMiAqLwogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotI2RlZmluZSBCT09UX0hFQVBfU0laRQkweDcwMDAKLSNlbHNlCi0jZGVmaW5lIEJPT1RfSEVBUF9TSVpFCTB4NDAwMAotI2VuZGlmCisjZGVmaW5lIEJPT1RfSEVBUF9TSVpFCTB4ODAwMAogCiAjZW5kaWYgLyogIUNPTkZJR19LRVJORUxfQlpJUDIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZml4bWFwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaAppbmRleCAwMTQxYjIzLi40NzI5YjJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaApAQCAtMTE2LDExICsxMTYsMTEgQEAKICNlbmRpZgogCUZJWF9URVhUX1BPS0UxLAkvKiByZXNlcnZlIDIgcGFnZXMgZm9yIHRleHRfcG9rZSgpICovCiAJRklYX1RFWFRfUE9LRTAsIC8qIGZpcnN0IHBhZ2UgaXMgbGFzdCwgYmVjYXVzZSBhbGxvY2F0aW9uIGlzIGJhY2t3YXJkICovCi0JX19lbmRfb2ZfcGVybWFuZW50X2ZpeGVkX2FkZHJlc3NlcywKLQogI2lmZGVmCUNPTkZJR19YODZfTVJTVAogCUZJWF9MTldfVlJUQywKICNlbmRpZgorCV9fZW5kX29mX3Blcm1hbmVudF9maXhlZF9hZGRyZXNzZXMsCisKIAkvKgogCSAqIDI1NiB0ZW1wb3JhcnkgYm9vdC10aW1lIG1hcHBpbmdzLCB1c2VkIGJ5IGVhcmx5X2lvcmVtYXAoKSwKIAkgKiBiZWZvcmUgaW9yZW1hcCgpIGlzIGZ1bmN0aW9uYWwuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ncGlvLmgKaW5kZXggNDlkYmZkZi4uOTFkOTE1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZ3Bpby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtMzgsMTIgKzM4LDkgQEAKIAlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOwogfQogCi0vKgotICogTm90IGltcGxlbWVudGVkLCB5ZXQuCi0gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGludCBncGlvKQogewotCXJldHVybiAtRU5PU1lTOworCXJldHVybiBfX2dwaW9fdG9faXJxKGdwaW8pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCmluZGV4IGZmMjU0NmMuLjdhMTUxNTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTIwLDYgKzIwLDkgQEAKICNpZm5kZWYgX0FTTV9YODZfSFlQRVJWSVNPUl9ICiAjZGVmaW5lIF9BU01fWDg2X0hZUEVSVklTT1JfSAogCisjaW5jbHVkZSA8YXNtL2t2bV9wYXJhLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisKIGV4dGVybiB2b2lkIGluaXRfaHlwZXJ2aXNvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgaW5pdF9oeXBlcnZpc29yX3BsYXRmb3JtKHZvaWQpOwogCkBAIC00Nyw0ICs1MCwxMyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfbXNfaHlwZXJ2OwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bTsKIAorc3RhdGljIGlubGluZSBib29sIGh5cGVydmlzb3JfeDJhcGljX2F2YWlsYWJsZSh2b2lkKQoreworCWlmIChrdm1fcGFyYV9hdmFpbGFibGUoKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKHhlbl94MmFwaWNfcGFyYV9hdmFpbGFibGUoKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggYmE4NzBiYi4uYzcwNGIzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTEwLDYgKzEwLDkgQEAKICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgogI2luY2x1ZGUgPGFzbS9pcnFfdmVjdG9ycy5oPgogCisvKiBFdmVuIHRob3VnaCB3ZSBkb24ndCBzdXBwb3J0IHRoaXMsIHN1cHBseSBpdCB0byBhcHBlYXNlIE9GICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX2Rpc3Bvc2VfbWFwcGluZyh1bnNpZ25lZCBpbnQgdmlycSkgeyB9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKIHsKIAlyZXR1cm4gKChpcnEgPT0gMikgPyA5IDogaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2tkZWJ1Zy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKaW5kZXggZjIzZWIyNS4uY2EyNDJkMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKQEAgLTE4LDcgKzE4LDYgQEAKIAlESUVfVFJBUCwKIAlESUVfR1BGLAogCURJRV9DQUxMLAotCURJRV9OTUlfSVBJLAogCURJRV9QQUdFX0ZBVUxULAogCURJRV9OTUlVTktOT1dOLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCmluZGV4IGIzNmM2YjMuLjhlMzdkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaApAQCAtMTUsNiArMTUsMTQgQEAKIAogc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQ7CiAKK3N0cnVjdCB4ODZfZXhjZXB0aW9uIHsKKwl1OCB2ZWN0b3I7CisJYm9vbCBlcnJvcl9jb2RlX3ZhbGlkOworCXUxNiBlcnJvcl9jb2RlOworCWJvb2wgbmVzdGVkX3BhZ2VfZmF1bHQ7CisJdTY0IGFkZHJlc3M7IC8qIGNyMiBvciBuZXN0ZWQgcGFnZSBmYXVsdCBncGEgKi8KK307CisKIC8qCiAgKiB4ODZfZW11bGF0ZV9vcHM6CiAgKgpAQCAtNjQsNyArNzIsOCBAQAogCSAqICBAYnl0ZXM6IFtJTiBdIE51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gbWVtb3J5LgogCSAqLwogCWludCAoKnJlYWRfc3RkKSh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKnZhbCwKLQkJCXVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgKmVycm9yKTsKKwkJCXVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJc3RydWN0IHg4Nl9leGNlcHRpb24gKmZhdWx0KTsKIAogCS8qCiAJICogd3JpdGVfc3RkOiBXcml0ZSBieXRlcyBvZiBzdGFuZGFyZCAobm9uLWVtdWxhdGVkL3NwZWNpYWwpIG1lbW9yeS4KQEAgLTc0LDcgKzgzLDggQEAKIAkgKiAgQGJ5dGVzOiBbSU4gXSBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gbWVtb3J5LgogCSAqLwogCWludCAoKndyaXRlX3N0ZCkodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICp2YWwsCi0JCQkgdW5zaWduZWQgaW50IGJ5dGVzLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiAqZXJyb3IpOworCQkJIHVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCk7CiAJLyoKIAkgKiBmZXRjaDogUmVhZCBieXRlcyBvZiBzdGFuZGFyZCAobm9uLWVtdWxhdGVkL3NwZWNpYWwpIG1lbW9yeS4KIAkgKiAgICAgICAgVXNlZCBmb3IgaW5zdHJ1Y3Rpb24gZmV0Y2guCkBAIC04Myw3ICs5Myw4IEBACiAJICogIEBieXRlczogW0lOIF0gTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBtZW1vcnkuCiAJICovCiAJaW50ICgqZmV0Y2gpKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqdmFsLAotCQkJdW5zaWduZWQgaW50IGJ5dGVzLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiAqZXJyb3IpOworCQkgICAgIHVuc2lnbmVkIGludCBieXRlcywgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCk7CiAKIAkvKgogCSAqIHJlYWRfZW11bGF0ZWQ6IFJlYWQgYnl0ZXMgZnJvbSBlbXVsYXRlZC9zcGVjaWFsIG1lbW9yeSBhcmVhLgpAQCAtOTQsNyArMTA1LDcgQEAKIAlpbnQgKCpyZWFkX2VtdWxhdGVkKSh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgIHZvaWQgKnZhbCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgKmVycm9yLAorCQkJICAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZmF1bHQsCiAJCQkgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIAkvKgpAQCAtMTA3LDcgKzExOCw3IEBACiAJaW50ICgqd3JpdGVfZW11bGF0ZWQpKHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICAgIGNvbnN0IHZvaWQgKnZhbCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCSAgICAgIHVuc2lnbmVkIGludCAqZXJyb3IsCisJCQkgICAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZmF1bHQsCiAJCQkgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAJLyoKQEAgLTEyMiw3ICsxMzMsNyBAQAogCQkJCWNvbnN0IHZvaWQgKm9sZCwKIAkJCQljb25zdCB2b2lkICpuZXcsCiAJCQkJdW5zaWduZWQgaW50IGJ5dGVzLAotCQkJCXVuc2lnbmVkIGludCAqZXJyb3IsCisJCQkJc3RydWN0IHg4Nl9leGNlcHRpb24gKmZhdWx0LAogCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIAlpbnQgKCpwaW9faW5fZW11bGF0ZWQpKGludCBzaXplLCB1bnNpZ25lZCBzaG9ydCBwb3J0LCB2b2lkICp2YWwsCkBAIC0xNTksNyArMTcwLDEwIEBACiAJfTsKIAl1bmlvbiB7CiAJCXVuc2lnbmVkIGxvbmcgKnJlZzsKLQkJdW5zaWduZWQgbG9uZyBtZW07CisJCXN0cnVjdCBzZWdtZW50ZWRfYWRkcmVzcyB7CisJCQl1bG9uZyBlYTsKKwkJCXVuc2lnbmVkIHNlZzsKKwkJfSBtZW07CiAJfSBhZGRyOwogCXVuaW9uIHsKIAkJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yMjYsOSArMjQwLDggQEAKIAogCWJvb2wgcGVybV9vazsgLyogZG8gbm90IGNoZWNrIHBlcm1pc3Npb25zIGlmIHRydWUgKi8KIAotCWludCBleGNlcHRpb247IC8qIGV4Y2VwdGlvbiB0aGF0IGhhcHBlbnMgZHVyaW5nIGVtdWxhdGlvbiBvciAtMSAqLwotCXUzMiBlcnJvcl9jb2RlOyAvKiBlcnJvciBjb2RlIGZvciBleGNlcHRpb24gKi8KLQlib29sIGVycm9yX2NvZGVfdmFsaWQ7CisJYm9vbCBoYXZlX2V4Y2VwdGlvbjsKKwlzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiBleGNlcHRpb247CiAKIAkvKiBkZWNvZGUgY2FjaGUgKi8KIAlzdHJ1Y3QgZGVjb2RlX2NhY2hlIGRlY29kZTsKQEAgLTI1Miw3ICsyNjUsNyBAQAogI2RlZmluZSBYODZFTVVMX01PREVfSE9TVCBYODZFTVVMX01PREVfUFJPVDY0CiAjZW5kaWYKIAotaW50IHg4Nl9kZWNvZGVfaW5zbihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCk7CitpbnQgeDg2X2RlY29kZV9pbnNuKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pOwogI2RlZmluZSBFTVVMQVRJT05fRkFJTEVEIC0xCiAjZGVmaW5lIEVNVUxBVElPTl9PSyAwCiAjZGVmaW5lIEVNVUxBVElPTl9SRVNUQVJUIDEKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGY3MDJmODIuLmZmZDdmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtODMsMTEgKzgzLDE0IEBACiAjZGVmaW5lIEtWTV9OUl9GSVhFRF9NVFJSX1JFR0lPTiA4OAogI2RlZmluZSBLVk1fTlJfVkFSX01UUlIgOAogCisjZGVmaW5lIEFTWU5DX1BGX1BFUl9WQ1BVIDY0CisKIGV4dGVybiBzcGlubG9ja190IGt2bV9sb2NrOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgdm1fbGlzdDsKIAogc3RydWN0IGt2bV92Y3B1Owogc3RydWN0IGt2bTsKK3N0cnVjdCBrdm1fYXN5bmNfcGY7CiAKIGVudW0ga3ZtX3JlZyB7CiAJVkNQVV9SRUdTX1JBWCA9IDAsCkBAIC0xMTQsNiArMTE3LDcgQEAKIAogZW51bSBrdm1fcmVnX2V4IHsKIAlWQ1BVX0VYUkVHX1BEUFRSID0gTlJfVkNQVV9SRUdTLAorCVZDUFVfRVhSRUdfQ1IzLAogfTsKIAogZW51bSB7CkBAIC0yMzgsMTYgKzI0MiwxOCBAQAogCXZvaWQgKCpuZXdfY3IzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXZvaWQgKCpzZXRfY3IzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgcm9vdCk7CiAJdW5zaWduZWQgbG9uZyAoKmdldF9jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0JaW50ICgqcGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiBlcnIpOwotCXZvaWQgKCppbmplY3RfcGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwlpbnQgKCpwYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgdTMyIGVyciwKKwkJCSAgYm9vbCBwcmVmYXVsdCk7CisJdm9pZCAoKmluamVjdF9wYWdlX2ZhdWx0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZmF1bHQpOwogCXZvaWQgKCpmcmVlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCWdwYV90ICgqZ3ZhX3RvX2dwYSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiBhY2Nlc3MsCi0JCQkgICAgdTMyICplcnJvcik7CisJCQkgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbik7CiAJZ3BhX3QgKCp0cmFuc2xhdGVfZ3BhKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwgdTMyIGFjY2Vzcyk7CiAJdm9pZCAoKnByZWZldGNoX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnBhZ2UpOwogCWludCAoKnN5bmNfcGFnZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBib29sIGNsZWFyX3Vuc3luYyk7CisJCQkgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApOwogCXZvaWQgKCppbnZscGcpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKTsKIAlocGFfdCByb290X2hwYTsKIAlpbnQgcm9vdF9sZXZlbDsKQEAgLTMxNSwxNiArMzIxLDYgQEAKIAkgKi8KIAlzdHJ1Y3Qga3ZtX21tdSAqd2Fsa19tbXU7CiAKLQkvKgotCSAqIFRoaXMgc3RydWN0IGlzIGZpbGxlZCB3aXRoIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gcHJvcGFnYXRlIGEKLQkgKiBwYWdlIGZhdWx0IGludG8gdGhlIGd1ZXN0Ci0JICovCi0Jc3RydWN0IHsKLQkJdTY0ICAgICAgYWRkcmVzczsKLQkJdW5zaWduZWQgZXJyb3JfY29kZTsKLQkJYm9vbCAgICAgbmVzdGVkOwotCX0gZmF1bHQ7Ci0KIAkvKiBvbmx5IG5lZWRlZCBpbiBrdm1fcHZfbW11X29wKCkgcGF0aCwgYnV0IGl0J3MgaG90IHNvCiAJICogcHV0IGl0IGhlcmUgdG8gYXZvaWQgYWxsb2NhdGlvbiAqLwogCXN0cnVjdCBrdm1fcHZfbW11X29wX2J1ZmZlciBtbXVfb3BfYnVmZmVyOwpAQCAtNDEyLDYgKzQwOCwxNSBAQAogCXU2NCBodl92YXBpYzsKIAogCWNwdW1hc2tfdmFyX3Qgd2JpbnZkX2RpcnR5X21hc2s7CisKKwlzdHJ1Y3QgeworCQlib29sIGhhbHRlZDsKKwkJZ2ZuX3QgZ2Zuc1tyb3VuZHVwX3Bvd19vZl90d28oQVNZTkNfUEZfUEVSX1ZDUFUpXTsKKwkJc3RydWN0IGdmbl90b19odmFfY2FjaGUgZGF0YTsKKwkJdTY0IG1zcl92YWw7CisJCXUzMiBpZDsKKwkJYm9vbCBzZW5kX3VzZXJfb25seTsKKwl9IGFwZjsKIH07CiAKIHN0cnVjdCBrdm1fYXJjaCB7CkBAIC00NTYsNiArNDYxLDEwIEBACiAJLyogZmllbGRzIHVzZWQgYnkgSFlQRVItViBlbXVsYXRpb24gKi8KIAl1NjQgaHZfZ3Vlc3Rfb3NfaWQ7CiAJdTY0IGh2X2h5cGVyY2FsbDsKKworCSNpZmRlZiBDT05GSUdfS1ZNX01NVV9BVURJVAorCWludCBhdWRpdF9wb2ludDsKKwkjZW5kaWYKIH07CiAKIHN0cnVjdCBrdm1fdm1fc3RhdCB7CkBAIC01MjksNiArNTM4LDcgQEAKIAkJCSAgICBzdHJ1Y3Qga3ZtX3NlZ21lbnQgKnZhciwgaW50IHNlZyk7CiAJdm9pZCAoKmdldF9jc19kYl9sX2JpdHMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50ICpkYiwgaW50ICpsKTsKIAl2b2lkICgqZGVjYWNoZV9jcjBfZ3Vlc3RfYml0cykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl2b2lkICgqZGVjYWNoZV9jcjMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKmRlY2FjaGVfY3I0X2d1ZXN0X2JpdHMpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnNldF9jcjApKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApOwogCXZvaWQgKCpzZXRfY3IzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKTsKQEAgLTU4Miw5ICs1OTIsMTcgQEAKIAogCXZvaWQgKCp3cml0ZV90c2Nfb2Zmc2V0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBvZmZzZXQpOwogCisJdm9pZCAoKmdldF9leGl0X2luZm8pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICppbmZvMSwgdTY0ICppbmZvMik7CiAJY29uc3Qgc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzICpleGl0X3JlYXNvbnNfc3RyOwogfTsKIAorc3RydWN0IGt2bV9hcmNoX2FzeW5jX3BmIHsKKwl1MzIgdG9rZW47CisJZ2ZuX3QgZ2ZuOworCXVuc2lnbmVkIGxvbmcgY3IzOworCWJvb2wgZGlyZWN0X21hcDsKK307CisKIGV4dGVybiBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgKmt2bV94ODZfb3BzOwogCiBpbnQga3ZtX21tdV9tb2R1bGVfaW5pdCh2b2lkKTsKQEAgLTU5NCw3ICs2MTIsNiBAQAogaW50IGt2bV9tbXVfY3JlYXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX21tdV9zZXR1cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbW11X3NldF9ub25wcmVzZW50X3B0ZXModTY0IHRyYXBfcHRlLCB1NjQgbm90cmFwX3B0ZSk7Ci12b2lkIGt2bV9tbXVfc2V0X2Jhc2VfcHRlcyh1NjQgYmFzZV9wdGUpOwogdm9pZCBrdm1fbW11X3NldF9tYXNrX3B0ZXModTY0IHVzZXJfbWFzaywgdTY0IGFjY2Vzc2VkX21hc2ssCiAJCXU2NCBkaXJ0eV9tYXNrLCB1NjQgbnhfbWFzaywgdTY0IHhfbWFzayk7CiAKQEAgLTYyMyw4ICs2NDAsMTUgQEAKICNkZWZpbmUgRU1VTFRZUEVfTk9fREVDT0RFCSAgICAoMSA8PCAwKQogI2RlZmluZSBFTVVMVFlQRV9UUkFQX1VECSAgICAoMSA8PCAxKQogI2RlZmluZSBFTVVMVFlQRV9TS0lQCQkgICAgKDEgPDwgMikKLWludCBlbXVsYXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCXVuc2lnbmVkIGxvbmcgY3IyLCB1MTYgZXJyb3JfY29kZSwgaW50IGVtdWxhdGlvbl90eXBlKTsKK2ludCB4ODZfZW11bGF0ZV9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IyLAorCQkJICAgIGludCBlbXVsYXRpb25fdHlwZSwgdm9pZCAqaW5zbiwgaW50IGluc25fbGVuKTsKKworc3RhdGljIGlubGluZSBpbnQgZW11bGF0ZV9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQlpbnQgZW11bGF0aW9uX3R5cGUpCit7CisJcmV0dXJuIHg4Nl9lbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIGVtdWxhdGlvbl90eXBlLCBOVUxMLCAwKTsKK30KKwogdm9pZCByZWFsbW9kZV9sZ2R0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IHNpemUsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiB2b2lkIHJlYWxtb2RlX2xpZHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MTYgc2l6ZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIApAQCAtNjUwLDcgKzY3NCw3IEBACiBpbnQga3ZtX3NldF9jcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMCk7CiBpbnQga3ZtX3NldF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMyk7CiBpbnQga3ZtX3NldF9jcjQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyNCk7Ci12b2lkIGt2bV9zZXRfY3I4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjgpOworaW50IGt2bV9zZXRfY3I4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjgpOwogaW50IGt2bV9zZXRfZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZHIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCBrdm1fZ2V0X2RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGRyLCB1bnNpZ25lZCBsb25nICp2YWwpOwogdW5zaWduZWQgbG9uZyBrdm1fZ2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtNjY4LDExICs2OTIsMTEgQEAKIHZvaWQga3ZtX3F1ZXVlX2V4Y2VwdGlvbl9lKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbnIsIHUzMiBlcnJvcl9jb2RlKTsKIHZvaWQga3ZtX3JlcXVldWVfZXhjZXB0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbnIpOwogdm9pZCBrdm1fcmVxdWV1ZV9leGNlcHRpb25fZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIG5yLCB1MzIgZXJyb3JfY29kZSk7Ci12b2lkIGt2bV9pbmplY3RfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1faW5qZWN0X3BhZ2VfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZmF1bHQpOwogaW50IGt2bV9yZWFkX2d1ZXN0X3BhZ2VfbW11KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXUgKm1tdSwKIAkJCSAgICBnZm5fdCBnZm4sIHZvaWQgKmRhdGEsIGludCBvZmZzZXQsIGludCBsZW4sCiAJCQkgICAgdTMyIGFjY2Vzcyk7Ci12b2lkIGt2bV9wcm9wYWdhdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX3Byb3BhZ2F0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCk7CiBib29sIGt2bV9yZXF1aXJlX2NwbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCByZXF1aXJlZF9jcGwpOwogCiBpbnQga3ZtX3BpY19zZXRfaXJxKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKTsKQEAgLTY5MCwxNiArNzE0LDIxIEBACiBpbnQga3ZtX21tdV9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9tbXVfdW5sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9tbXVfc3luY19yb290cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotZ3BhX3Qga3ZtX21tdV9ndmFfdG9fZ3BhX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiAqZXJyb3IpOwotZ3BhX3Qga3ZtX21tdV9ndmFfdG9fZ3BhX2ZldGNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCB1MzIgKmVycm9yKTsKLWdwYV90IGt2bV9tbXVfZ3ZhX3RvX2dwYV93cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgdTMyICplcnJvcik7Ci1ncGFfdCBrdm1fbW11X2d2YV90b19ncGFfc3lzdGVtKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCB1MzIgKmVycm9yKTsKK2dwYV90IGt2bV9tbXVfZ3ZhX3RvX2dwYV9yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLAorCQkJICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbik7CitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfZmV0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsCisJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbik7CitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsCisJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbik7CitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfc3lzdGVtKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLAorCQkJCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pOwogCiBpbnQga3ZtX2VtdWxhdGVfaHlwZXJjYWxsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIGludCBrdm1fZml4X2h5cGVyY2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCi1pbnQga3ZtX21tdV9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCB1MzIgZXJyb3JfY29kZSk7CitpbnQga3ZtX21tdV9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCB1MzIgZXJyb3JfY29kZSwKKwkJICAgICAgIHZvaWQgKmluc24sIGludCBpbnNuX2xlbik7CiB2b2lkIGt2bV9tbXVfaW52bHBnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKTsKIAogdm9pZCBrdm1fZW5hYmxlX3RkcCh2b2lkKTsKQEAgLTc2NiwyMCArNzk1LDI1IEBACiAjZGVmaW5lIEhGX1ZJTlRSX01BU0sJCSgxIDw8IDIpCiAjZGVmaW5lIEhGX05NSV9NQVNLCQkoMSA8PCAzKQogI2RlZmluZSBIRl9JUkVUX01BU0sJCSgxIDw8IDQpCisjZGVmaW5lIEhGX0dVRVNUX01BU0sJCSgxIDw8IDUpIC8qIFZDUFUgaXMgaW4gZ3Vlc3QtbW9kZSAqLwogCiAvKgogICogSGFyZHdhcmUgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBtYXkgZmF1bHQgaWYgYQogICogcmVib290IHR1cm5zIG9mZiB2aXJ0dWFsaXphdGlvbiB3aGlsZSBwcm9jZXNzZXMgYXJlIHJ1bm5pbmcuCiAgKiBUcmFwIHRoZSBmYXVsdCBhbmQgaWdub3JlIHRoZSBpbnN0cnVjdGlvbiBpZiB0aGF0IGhhcHBlbnMuCiAgKi8KLWFzbWxpbmthZ2Ugdm9pZCBrdm1faGFuZGxlX2ZhdWx0X29uX3JlYm9vdCh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBrdm1fc3B1cmlvdXNfZmF1bHQodm9pZCk7CitleHRlcm4gYm9vbCBrdm1fcmVib290aW5nOwogCiAjZGVmaW5lIF9fa3ZtX2hhbmRsZV9mYXVsdF9vbl9yZWJvb3QoaW5zbikgXAogCSI2NjY6ICIgaW5zbiAiXG5cdCIgXAorCSI2Njg6IFxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSIucHVzaHNlY3Rpb24gLmZpeHVwLCBcImF4XCIgXG4iIFwKIAkiNjY3OiBcblx0IiBcCisJImNtcGIgJDAsIGt2bV9yZWJvb3RpbmcgXG5cdCIJICAgICAgXAorCSJqbmUgNjY4YiBcblx0IiAgICAgIAkJICAgICAgXAogCV9fQVNNX1NJWkUocHVzaCkgIiAkNjY2YiBcblx0IgkgICAgICBcCi0JImptcCBrdm1faGFuZGxlX2ZhdWx0X29uX3JlYm9vdCBcblx0IiBcCisJImNhbGwga3ZtX3NwdXJpb3VzX2ZhdWx0IFxuXHQiCSAgICAgIFwKIAkiLnBvcHNlY3Rpb24gXG5cdCIgXAogCSIucHVzaHNlY3Rpb24gX19leF90YWJsZSwgXCJhXCIgXG5cdCIgXAogCV9BU01fUFRSICIgNjY2YiwgNjY3YiBcblx0IiBcCkBAIC03ODgsNiArODIyLDcgQEAKICNkZWZpbmUgS1ZNX0FSQ0hfV0FOVF9NTVVfTk9USUZJRVIKIGludCBrdm1fdW5tYXBfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBodmEpOwogaW50IGt2bV9hZ2VfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBodmEpOworaW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CiB2b2lkIGt2bV9zZXRfc3B0ZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSwgcHRlX3QgcHRlKTsKIGludCBjcHVpZF9tYXhwaHlhZGRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX2NwdV9oYXNfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CkBAIC03OTksNCArODM0LDE1IEBACiAKIGJvb2wga3ZtX2lzX2xpbmVhcl9yaXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGxpbmVhcl9yaXApOwogCit2b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2Vfbm90X3ByZXNlbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgc3RydWN0IGt2bV9hc3luY19wZiAqd29yayk7Cit2b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcHJlc2VudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspOwordm9pZCBrdm1fYXJjaF9hc3luY19wYWdlX3JlYWR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICAgICBzdHJ1Y3Qga3ZtX2FzeW5jX3BmICp3b3JrKTsKK2Jvb2wga3ZtX2FyY2hfY2FuX2luamVjdF9hc3luY19wYWdlX3ByZXNlbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2V4dGVybiBib29sIGt2bV9maW5kX2FzeW5jX3BmX2dmbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbik7CisKK3ZvaWQga3ZtX2NvbXBsZXRlX2luc25fZ3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZXJyKTsKKwogI2VuZGlmIC8qIF9BU01fWDg2X0tWTV9IT1NUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9wYXJhLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oCmluZGV4IDdiNTYyYjYuLmE0MjdiZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9wYXJhLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3BhcmEuaApAQCAtMjAsNiArMjAsNyBAQAogICogYXJlIGF2YWlsYWJsZS4gVGhlIHVzZSBvZiAweDExIGFuZCAweDEyIGlzIGRlcHJlY2F0ZWQKICAqLwogI2RlZmluZSBLVk1fRkVBVFVSRV9DTE9DS1NPVVJDRTIgICAgICAgIDMKKyNkZWZpbmUgS1ZNX0ZFQVRVUkVfQVNZTkNfUEYJCTQKIAogLyogVGhlIGxhc3QgOCBiaXRzIGFyZSB1c2VkIHRvIGluZGljYXRlIGhvdyB0byBpbnRlcnByZXQgdGhlIGZsYWdzIGZpZWxkCiAgKiBpbiBwdmNsb2NrIHN0cnVjdHVyZS4gSWYgbm8gYml0cyBhcmUgc2V0LCBhbGwgZmxhZ3MgYXJlIGlnbm9yZWQuCkBAIC0zMiw5ICszMywxMyBAQAogLyogQ3VzdG9tIE1TUnMgZmFsbHMgaW4gdGhlIHJhbmdlIDB4NGI1NjRkMDAtMHg0YjU2NGRmZiAqLwogI2RlZmluZSBNU1JfS1ZNX1dBTExfQ0xPQ0tfTkVXICAweDRiNTY0ZDAwCiAjZGVmaW5lIE1TUl9LVk1fU1lTVEVNX1RJTUVfTkVXIDB4NGI1NjRkMDEKKyNkZWZpbmUgTVNSX0tWTV9BU1lOQ19QRl9FTiAweDRiNTY0ZDAyCiAKICNkZWZpbmUgS1ZNX01BWF9NTVVfT1BfQkFUQ0ggICAgICAgICAgIDMyCiAKKyNkZWZpbmUgS1ZNX0FTWU5DX1BGX0VOQUJMRUQJCQkoMSA8PCAwKQorI2RlZmluZSBLVk1fQVNZTkNfUEZfU0VORF9BTFdBWVMJCSgxIDw8IDEpCisKIC8qIE9wZXJhdGlvbnMgZm9yIEtWTV9IQ19NTVVfT1AgKi8KICNkZWZpbmUgS1ZNX01NVV9PUF9XUklURV9QVEUgICAgICAgICAgICAxCiAjZGVmaW5lIEtWTV9NTVVfT1BfRkxVU0hfVExCCSAgICAgICAgMgpAQCAtNjEsMTAgKzY2LDIwIEBACiAJX191NjQgcHRfcGh5czsKIH07CiAKKyNkZWZpbmUgS1ZNX1BWX1JFQVNPTl9QQUdFX05PVF9QUkVTRU5UIDEKKyNkZWZpbmUgS1ZNX1BWX1JFQVNPTl9QQUdFX1JFQURZIDIKKworc3RydWN0IGt2bV92Y3B1X3B2X2FwZl9kYXRhIHsKKwlfX3UzMiByZWFzb247CisJX191OCBwYWRbNjBdOworCV9fdTMyIGVuYWJsZWQ7Cit9OworCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogZXh0ZXJuIHZvaWQga3ZtY2xvY2tfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQga3ZtX3JlZ2lzdGVyX2Nsb2NrKGNoYXIgKnR4dCk7CiAKIAogLyogVGhpcyBpbnN0cnVjdGlvbiBpcyB2bWNhbGwuICBPbiBub24tVlQgYXJjaGl0ZWN0dXJlcywgaXQgd2lsbCBnZW5lcmF0ZSBhCkBAIC0xNjAsOCArMTc1LDE3IEBACiAKICNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUCiB2b2lkIF9faW5pdCBrdm1fZ3Vlc3RfaW5pdCh2b2lkKTsKK3ZvaWQga3ZtX2FzeW5jX3BmX3Rhc2tfd2FpdCh1MzIgdG9rZW4pOwordm9pZCBrdm1fYXN5bmNfcGZfdGFza193YWtlKHUzMiB0b2tlbik7Cit1MzIga3ZtX3JlYWRfYW5kX3Jlc2V0X3BmX3JlYXNvbih2b2lkKTsKICNlbHNlCiAjZGVmaW5lIGt2bV9ndWVzdF9pbml0KCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBrdm1fYXN5bmNfcGZfdGFza193YWl0KFQpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGt2bV9hc3luY19wZl90YXNrX3dha2UoVCkgZG8ge30gd2hpbGUoMCkKK3N0YXRpYyBpbmxpbmUgdTMyIGt2bV9yZWFkX2FuZF9yZXNldF9wZl9yZWFzb24odm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaF90cmFwcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaF90cmFwcy5oCmluZGV4IGY3OTIwNjAuLjcyYThiNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21hY2hfdHJhcHMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoX3RyYXBzLmgKQEAgLTcsOSArNywxOSBAQAogCiAjaW5jbHVkZSA8YXNtL21jMTQ2ODE4cnRjLmg+CiAKKyNkZWZpbmUgTk1JX1JFQVNPTl9QT1JUCQkweDYxCisKKyNkZWZpbmUgTk1JX1JFQVNPTl9TRVJSCQkweDgwCisjZGVmaW5lIE5NSV9SRUFTT05fSU9DSEsJMHg0MAorI2RlZmluZSBOTUlfUkVBU09OX01BU0sJCShOTUlfUkVBU09OX1NFUlIgfCBOTUlfUkVBU09OX0lPQ0hLKQorCisjZGVmaW5lIE5NSV9SRUFTT05fQ0xFQVJfU0VSUgkweDA0CisjZGVmaW5lIE5NSV9SRUFTT05fQ0xFQVJfSU9DSEsJMHgwOAorI2RlZmluZSBOTUlfUkVBU09OX0NMRUFSX01BU0sJMHgwZgorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X25taV9yZWFzb24odm9pZCkKIHsKLQlyZXR1cm4gaW5iKDB4NjEpOworCXJldHVybiBpbmIoTk1JX1JFQVNPTl9QT1JUKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlYXNzZXJ0X25taSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAppbmRleCBjNDAyMWI5Li5jNzZmNWI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaApAQCAtMjMsNiArMjMsMjYgQEAKICNkZWZpbmUgYXJjaF90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlIGFyY2hfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZQogI2VuZGlmCiAKKy8qCisgKiBEZWZpbmUgc29tZSBwcmlvcml0aWVzIGZvciB0aGUgbm1pIG5vdGlmaWVyIGNhbGwgY2hhaW4uCisgKgorICogQ3JlYXRlIGEgbG9jYWwgbm1pIGJpdCB0aGF0IGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGFuCisgKiBleHRlcm5hbCBubWlzLCBiZWNhdXNlIHRoZSBsb2NhbCBvbmVzIGFyZSBtb3JlIGZyZXF1ZW50LgorICoKKyAqIEFsc28gc2V0dXAgc29tZSBkZWZhdWx0IGhpZ2gvbm9ybWFsL2xvdyBzZXR0aW5ncyBmb3IKKyAqIHN1YnN5c3RlbXMgdG8gcmVnaXN0ZXJzIHdpdGguICBVc2luZyA0IGJpdHMgdG8gc2VwZXJhdGUKKyAqIHRoZSBwcmlvcml0aWVzLiAgVGhpcyBjYW4gZ28gYWxvdCBoaWdoZXIgaWYgbmVlZGVkIGJlLgorICovCisKKyNkZWZpbmUgTk1JX0xPQ0FMX1NISUZUCQkxNgkvKiByYW5kb21seSBwaWNrZWQgKi8KKyNkZWZpbmUgTk1JX0xPQ0FMX0JJVAkJKDFVTEwgPDwgTk1JX0xPQ0FMX1NISUZUKQorI2RlZmluZSBOTUlfSElHSF9QUklPUgkJKDFVTEwgPDwgOCkKKyNkZWZpbmUgTk1JX05PUk1BTF9QUklPUgkoMVVMTCA8PCA0KQorI2RlZmluZSBOTUlfTE9XX1BSSU9SCQkoMVVMTCA8PCAwKQorI2RlZmluZSBOTUlfTE9DQUxfSElHSF9QUklPUgkoTk1JX0xPQ0FMX0JJVCB8IE5NSV9ISUdIX1BSSU9SKQorI2RlZmluZSBOTUlfTE9DQUxfTk9STUFMX1BSSU9SCShOTUlfTE9DQUxfQklUIHwgTk1JX05PUk1BTF9QUklPUikKKyNkZWZpbmUgTk1JX0xPQ0FMX0xPV19QUklPUgkoTk1JX0xPQ0FMX0JJVCB8IE5NSV9MT1dfUFJJT1IpCisKIHZvaWQgc3RvcF9ubWkodm9pZCk7CiB2b2lkIHJlc3RhcnRfbm1pKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmgKaW5kZXggODIzZTA3MC4uNWFlODcyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaApAQCAtMzgsNyArMzgsNyBAQAogZXh0ZXJuIHZvaWQgX19jcHVpbml0IG51bWFfcmVtb3ZlX2NwdShpbnQgY3B1KTsKIAogI2lmZGVmIENPTkZJR19OVU1BX0VNVQotI2RlZmluZSBGQUtFX05PREVfTUlOX1NJWkUJKCh1NjQpNjQgPDwgMjApCisjZGVmaW5lIEZBS0VfTk9ERV9NSU5fU0laRQkoKHU2NCkzMiA8PCAyMCkKICNkZWZpbmUgRkFLRV9OT0RFX01JTl9IQVNIX01BU0sJKH4oRkFLRV9OT0RFX01JTl9TSVpFIC0gMVVMKSkKICNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi8KICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9vbHBjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9vbHBjLmgKaW5kZXggNDJhOTc4Yy4uZjQ4MjAxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vb2xwYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL29scGMuaApAQCAtMTA3LDEwICsxMDcsMTQgQEAKIC8qIEdQSU8gYXNzaWdubWVudHMgKi8KIAogI2RlZmluZSBPTFBDX0dQSU9fTUlDX0FDCTEKLSNkZWZpbmUgT0xQQ19HUElPX0RDT05fSVJRCWdlb2RlX2dwaW8oNykKKyNkZWZpbmUgT0xQQ19HUElPX0RDT05fU1RBVDAJNQorI2RlZmluZSBPTFBDX0dQSU9fRENPTl9TVEFUMQk2CisjZGVmaW5lIE9MUENfR1BJT19EQ09OX0lSUQk3CiAjZGVmaW5lIE9MUENfR1BJT19USFJNX0FMUk0JZ2VvZGVfZ3BpbygxMCkKLSNkZWZpbmUgT0xQQ19HUElPX1NNQl9DTEsJZ2VvZGVfZ3BpbygxNCkKLSNkZWZpbmUgT0xQQ19HUElPX1NNQl9EQVRBCWdlb2RlX2dwaW8oMTUpCisjZGVmaW5lIE9MUENfR1BJT19EQ09OX0xPQUQgICAgMTEKKyNkZWZpbmUgT0xQQ19HUElPX0RDT05fQkxBTksgICAxMgorI2RlZmluZSBPTFBDX0dQSU9fU01CX0NMSyAgICAgIDE0CisjZGVmaW5lIE9MUENfR1BJT19TTUJfREFUQSAgICAgMTUKICNkZWZpbmUgT0xQQ19HUElPX1dPUktBVVgJZ2VvZGVfZ3BpbygyNCkKICNkZWZpbmUgT0xQQ19HUElPX0xJRAkJZ2VvZGVfZ3BpbygyNikKICNkZWZpbmUgT0xQQ19HUElPX0VDU0NJCQlnZW9kZV9ncGlvKDI3KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vb2xwY19vZncuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL29scGNfb2Z3LmgKaW5kZXggMmE4NDc4MS4uNjQxOTg4ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vb2xwY19vZncuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9vbHBjX29mdy5oCkBAIC04LDYgKzgsOCBAQAogCiAjaWZkZWYgQ09ORklHX09MUENfT1BFTkZJUk1XQVJFCiAKK2V4dGVybiBib29sIG9scGNfb2Z3X2lzX2luc3RhbGxlZCh2b2lkKTsKKwogLyogcnVuIGFuIE9GVyBjb21tYW5kIGJ5IGNhbGxpbmcgaW50byB0aGUgZmlybXdhcmUgKi8KICNkZWZpbmUgb2xwY19vZncobmFtZSwgYXJncywgcmVzKSBcCiAJX19vbHBjX29mdygobmFtZSksIEFSUkFZX1NJWkUoYXJncyksIGFyZ3MsIEFSUkFZX1NJWkUocmVzKSwgcmVzKQpAQCAtMjYsMTAgKzI4LDE3IEBACiAKICNlbHNlIC8qICFDT05GSUdfT0xQQ19PUEVORklSTVdBUkUgKi8KIAorc3RhdGljIGlubGluZSBib29sIG9scGNfb2Z3X2lzX2luc3RhbGxlZCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogc3RhdGljIGlubGluZSB2b2lkIG9scGNfb2Z3X2RldGVjdCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9vbHBjX29md19wZ2Qodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIGJvb2wgb2xwY19vZndfcHJlc2VudCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogCiAjZW5kaWYgLyogIUNPTkZJR19PTFBDX09QRU5GSVJNV0FSRSAqLwogCisjaWZkZWYgQ09ORklHX09MUENfT1BFTkZJUk1XQVJFX0RUCitleHRlcm4gdm9pZCBvbHBjX2R0X2J1aWxkX2RldmljZXRyZWUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG9scGNfZHRfYnVpbGRfZGV2aWNldHJlZSh2b2lkKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfT0xQQ19PUEVORklSTVdBUkVfRFQgKi8KKwogI2VuZGlmIC8qIF9BU01fWDg2X09MUENfT0ZXX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCmluZGV4IDc3MDljMTIuLjIwNzFhOGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaApAQCAtNDM1LDYgKzQzNSwxMSBAQAogewogCVBWT1BfVkNBTEwzKHB2X21tdV9vcHMucHRlX3VwZGF0ZSwgbW0sIGFkZHIsIHB0ZXApOwogfQorc3RhdGljIGlubGluZSB2b2lkIHBtZF91cGRhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgIHBtZF90ICpwbWRwKQoreworCVBWT1BfVkNBTEwzKHB2X21tdV9vcHMucG1kX3VwZGF0ZSwgbW0sIGFkZHIsIHBtZHApOworfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VwZGF0ZV9kZWZlcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICBwdGVfdCAqcHRlcCkKQEAgLTQ0Miw2ICs0NDcsMTIgQEAKIAlQVk9QX1ZDQUxMMyhwdl9tbXVfb3BzLnB0ZV91cGRhdGVfZGVmZXIsIG1tLCBhZGRyLCBwdGVwKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHBtZF91cGRhdGVfZGVmZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICAgcG1kX3QgKnBtZHApCit7CisJUFZPUF9WQ0FMTDMocHZfbW11X29wcy5wbWRfdXBkYXRlX2RlZmVyLCBtbSwgYWRkciwgcG1kcCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgcHRlX3QgX19wdGUocHRldmFsX3QgdmFsKQogewogCXB0ZXZhbF90IHJldDsKQEAgLTU0Myw2ICs1NTQsMjAgQEAKIAkJUFZPUF9WQ0FMTDQocHZfbW11X29wcy5zZXRfcHRlX2F0LCBtbSwgYWRkciwgcHRlcCwgcHRlLnB0ZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1kX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgICBwbWRfdCAqcG1kcCwgcG1kX3QgcG1kKQoreworI2lmIFBBR0VUQUJMRV9MRVZFTFMgPj0gMworCWlmIChzaXplb2YocG1kdmFsX3QpID4gc2l6ZW9mKGxvbmcpKQorCQkvKiA1IGFyZyB3b3JkcyAqLworCQlwdl9tbXVfb3BzLnNldF9wbWRfYXQobW0sIGFkZHIsIHBtZHAsIHBtZCk7CisJZWxzZQorCQlQVk9QX1ZDQUxMNChwdl9tbXVfb3BzLnNldF9wbWRfYXQsIG1tLCBhZGRyLCBwbWRwLCBwbWQucG1kKTsKKyNlbmRpZgorfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcG1kKHBtZF90ICpwbWRwLCBwbWRfdCBwbWQpCiB7CiAJcG1kdmFsX3QgdmFsID0gbmF0aXZlX3BtZF92YWwocG1kKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCmluZGV4IGI4MmJhYzkuLjgyODg1MDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaApAQCAtMjY1LDEwICsyNjUsMTYgQEAKIAl2b2lkICgqc2V0X3B0ZV9hdCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOwogCXZvaWQgKCpzZXRfcG1kKShwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKTsKKwl2b2lkICgqc2V0X3BtZF9hdCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgIHBtZF90ICpwbWRwLCBwbWRfdCBwbWR2YWwpOwogCXZvaWQgKCpwdGVfdXBkYXRlKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgcHRlX3QgKnB0ZXApOwogCXZvaWQgKCpwdGVfdXBkYXRlX2RlZmVyKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7CisJdm9pZCAoKnBtZF91cGRhdGUpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICBwbWRfdCAqcG1kcCk7CisJdm9pZCAoKnBtZF91cGRhdGVfZGVmZXIpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWRwKTsKIAogCXB0ZV90ICgqcHRlcF9tb2RpZnlfcHJvdF9zdGFydCkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkJcHRlX3QgKnB0ZXApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oCmluZGV4IDI5NWUyZmYuLmUyZjZhOTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfcDQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmgKQEAgLTIwLDYgKzIwLDkgQEAKICNkZWZpbmUgQVJDSF9QNF9NQVhfRVNDUgkoQVJDSF9QNF9UT1RBTF9FU0NSIC0gQVJDSF9QNF9SRVNFUlZFRF9FU0NSKQogI2RlZmluZSBBUkNIX1A0X01BWF9DQ0NSCSgxOCkKIAorI2RlZmluZSBBUkNIX1A0X0NOVFJWQUxfQklUUwkoNDApCisjZGVmaW5lIEFSQ0hfUDRfQ05UUlZBTF9NQVNLCSgoMVVMTCA8PCBBUkNIX1A0X0NOVFJWQUxfQklUUykgLSAxKQorCiAjZGVmaW5lIFA0X0VTQ1JfRVZFTlRfTUFTSwkweDdlMDAwMDAwVQogI2RlZmluZSBQNF9FU0NSX0VWRU5UX1NISUZUCTI1CiAjZGVmaW5lIFA0X0VTQ1JfRVZFTlRNQVNLX01BU0sJMHgwMWZmZmUwMFUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCAyNzFkZTk0Li5iNDM4OWE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC05Miw3ICs5Miw3IEBACiBleHRlcm4gdm9pZCBfX19wbWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZF9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwbWRfdCAqcG1kLAotCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRkcmVzcykKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlfX19wbWRfZnJlZV90bGIodGxiLCBwbWQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLmgKaW5kZXggMjMzNDk4Mi4uOTgzOTFkYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC5oCkBAIC00Niw2ICs0NiwxNSBAQAogI2RlZmluZSBuYXRpdmVfcHRlcF9nZXRfYW5kX2NsZWFyKHhwKSBuYXRpdmVfbG9jYWxfcHRlcF9nZXRfYW5kX2NsZWFyKHhwKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgaW5saW5lIHBtZF90IG5hdGl2ZV9wbWRwX2dldF9hbmRfY2xlYXIocG1kX3QgKnhwKQoreworCXJldHVybiBfX3BtZCh4Y2hnKChwbWR2YWxfdCAqKXhwLCAwKSk7Cit9CisjZWxzZQorI2RlZmluZSBuYXRpdmVfcG1kcF9nZXRfYW5kX2NsZWFyKHhwKSBuYXRpdmVfbG9jYWxfcG1kcF9nZXRfYW5kX2NsZWFyKHhwKQorI2VuZGlmCisKIC8qCiAgKiBCaXRzIF9QQUdFX0JJVF9QUkVTRU5ULCBfUEFHRV9CSVRfRklMRSBhbmQgX1BBR0VfQklUX1BST1ROT05FIGFyZSB0YWtlbiwKICAqIHNwbGl0IHVwIHRoZSAyOSBiaXRzIG9mIG9mZnNldCBpbnRvIHRoaXMgcmFuZ2U6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWwuaAppbmRleCAxNzdiMDE2Li45NGI5NzlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLmgKQEAgLTEwNCw2ICsxMDQsMjkgQEAKICNkZWZpbmUgbmF0aXZlX3B0ZXBfZ2V0X2FuZF9jbGVhcih4cCkgbmF0aXZlX2xvY2FsX3B0ZXBfZ2V0X2FuZF9jbGVhcih4cCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NNUAordW5pb24gc3BsaXRfcG1kIHsKKwlzdHJ1Y3QgeworCQl1MzIgcG1kX2xvdzsKKwkJdTMyIHBtZF9oaWdoOworCX07CisJcG1kX3QgcG1kOworfTsKK3N0YXRpYyBpbmxpbmUgcG1kX3QgbmF0aXZlX3BtZHBfZ2V0X2FuZF9jbGVhcihwbWRfdCAqcG1kcCkKK3sKKwl1bmlvbiBzcGxpdF9wbWQgcmVzLCAqb3JpZyA9ICh1bmlvbiBzcGxpdF9wbWQgKilwbWRwOworCisJLyogeGNoZyBhY3RzIGFzIGEgYmFycmllciBiZWZvcmUgc2V0dGluZyBvZiB0aGUgaGlnaCBiaXRzICovCisJcmVzLnBtZF9sb3cgPSB4Y2hnKCZvcmlnLT5wbWRfbG93LCAwKTsKKwlyZXMucG1kX2hpZ2ggPSBvcmlnLT5wbWRfaGlnaDsKKwlvcmlnLT5wbWRfaGlnaCA9IDA7CisKKwlyZXR1cm4gcmVzLnBtZDsKK30KKyNlbHNlCisjZGVmaW5lIG5hdGl2ZV9wbWRwX2dldF9hbmRfY2xlYXIoeHApIG5hdGl2ZV9sb2NhbF9wbWRwX2dldF9hbmRfY2xlYXIoeHApCisjZW5kaWYKKwogLyoKICAqIEJpdHMgMCwgNiBhbmQgNyBhcmUgdGFrZW4gaW4gdGhlIGxvdyBwYXJ0IG9mIHRoZSBwdGUsCiAgKiBwdXQgdGhlIDMyIGJpdHMgb2Ygb2Zmc2V0IGludG8gdGhlIGhpZ2ggcGFydC4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBhZGE4MjNhLi4xODYwMWM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0zNSw2ICszNSw3IEBACiAjZWxzZSAgLyogIUNPTkZJR19QQVJBVklSVCAqLwogI2RlZmluZSBzZXRfcHRlKHB0ZXAsIHB0ZSkJCW5hdGl2ZV9zZXRfcHRlKHB0ZXAsIHB0ZSkKICNkZWZpbmUgc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKQluYXRpdmVfc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKQorI2RlZmluZSBzZXRfcG1kX2F0KG1tLCBhZGRyLCBwbWRwLCBwbWQpCW5hdGl2ZV9zZXRfcG1kX2F0KG1tLCBhZGRyLCBwbWRwLCBwbWQpCiAKICNkZWZpbmUgc2V0X3B0ZV9hdG9taWMocHRlcCwgcHRlKQkJCQkJXAogCW5hdGl2ZV9zZXRfcHRlX2F0b21pYyhwdGVwLCBwdGUpCkBAIC01OSw2ICs2MCw4IEBACiAKICNkZWZpbmUgcHRlX3VwZGF0ZShtbSwgYWRkciwgcHRlcCkgICAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcHRlX3VwZGF0ZV9kZWZlcihtbSwgYWRkciwgcHRlcCkgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcG1kX3VwZGF0ZShtbSwgYWRkciwgcHRlcCkgICAgICAgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcG1kX3VwZGF0ZV9kZWZlcihtbSwgYWRkciwgcHRlcCkgICAgICAgIGRvIHsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBwZ2RfdmFsKHgpCW5hdGl2ZV9wZ2RfdmFsKHgpCiAjZGVmaW5lIF9fcGdkKHgpCW5hdGl2ZV9tYWtlX3BnZCh4KQpAQCAtOTQsNiArOTcsMTEgQEAKIAlyZXR1cm4gcHRlX2ZsYWdzKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcG1kX3lvdW5nKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX2ZsYWdzKHBtZCkgJiBfUEFHRV9BQ0NFU1NFRDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX2ZsYWdzKHB0ZSkgJiBfUEFHRV9SVzsKQEAgLTE0Miw2ICsxNTAsMjMgQEAKIAkJKF9QQUdFX1BTRSB8IF9QQUdFX1BSRVNFTlQpOwogfQogCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCitzdGF0aWMgaW5saW5lIGludCBwbWRfdHJhbnNfc3BsaXR0aW5nKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3ZhbChwbWQpICYgX1BBR0VfU1BMSVRUSU5HOworfQorCitzdGF0aWMgaW5saW5lIGludCBwbWRfdHJhbnNfaHVnZShwbWRfdCBwbWQpCit7CisJcmV0dXJuIHBtZF92YWwocG1kKSAmIF9QQUdFX1BTRTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFzX3RyYW5zcGFyZW50X2h1Z2VwYWdlKHZvaWQpCit7CisJcmV0dXJuIGNwdV9oYXNfcHNlOworfQorI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9zZXRfZmxhZ3MocHRlX3QgcHRlLCBwdGV2YWxfdCBzZXQpCiB7CiAJcHRldmFsX3QgdiA9IG5hdGl2ZV9wdGVfdmFsKHB0ZSk7CkBAIC0yMTYsNiArMjQxLDU1IEBACiAJcmV0dXJuIHB0ZV9zZXRfZmxhZ3MocHRlLCBfUEFHRV9TUEVDSUFMKTsKIH0KIAorc3RhdGljIGlubGluZSBwbWRfdCBwbWRfc2V0X2ZsYWdzKHBtZF90IHBtZCwgcG1kdmFsX3Qgc2V0KQoreworCXBtZHZhbF90IHYgPSBuYXRpdmVfcG1kX3ZhbChwbWQpOworCisJcmV0dXJuIF9fcG1kKHYgfCBzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9jbGVhcl9mbGFncyhwbWRfdCBwbWQsIHBtZHZhbF90IGNsZWFyKQoreworCXBtZHZhbF90IHYgPSBuYXRpdmVfcG1kX3ZhbChwbWQpOworCisJcmV0dXJuIF9fcG1kKHYgJiB+Y2xlYXIpOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9ta29sZChwbWRfdCBwbWQpCit7CisJcmV0dXJuIHBtZF9jbGVhcl9mbGFncyhwbWQsIF9QQUdFX0FDQ0VTU0VEKTsKK30KKworc3RhdGljIGlubGluZSBwbWRfdCBwbWRfd3Jwcm90ZWN0KHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX2NsZWFyX2ZsYWdzKHBtZCwgX1BBR0VfUlcpOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9ta2RpcnR5KHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3NldF9mbGFncyhwbWQsIF9QQUdFX0RJUlRZKTsKK30KKworc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbWtodWdlKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3NldF9mbGFncyhwbWQsIF9QQUdFX1BTRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcG1kX3QgcG1kX21reW91bmcocG1kX3QgcG1kKQoreworCXJldHVybiBwbWRfc2V0X2ZsYWdzKHBtZCwgX1BBR0VfQUNDRVNTRUQpOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9ta3dyaXRlKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX3NldF9mbGFncyhwbWQsIF9QQUdFX1JXKTsKK30KKworc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbWtub3RwcmVzZW50KHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gcG1kX2NsZWFyX2ZsYWdzKHBtZCwgX1BBR0VfUFJFU0VOVCk7Cit9CisKIC8qCiAgKiBNYXNrIG91dCB1bnN1cHBvcnRlZCBiaXRzIGluIGEgcHJlc2VudCBwZ3Byb3QuICBOb24tcHJlc2VudCBwZ3Byb3RzCiAgKiBjYW4gdXNlIHRob3NlIGJpdHMgZm9yIG90aGVyIHB1cnBvc2VzLCBzbyBsZWF2ZSB0aGVtIGJlLgpAQCAtMjU2LDYgKzMzMCwxNiBAQAogCXJldHVybiBfX3B0ZSh2YWwpOwogfQogCitzdGF0aWMgaW5saW5lIHBtZF90IHBtZF9tb2RpZnkocG1kX3QgcG1kLCBwZ3Byb3RfdCBuZXdwcm90KQoreworCXBtZHZhbF90IHZhbCA9IHBtZF92YWwocG1kKTsKKworCXZhbCAmPSBfSFBBR0VfQ0hHX01BU0s7CisJdmFsIHw9IG1hc3NhZ2VfcGdwcm90KG5ld3Byb3QpICYgfl9IUEFHRV9DSEdfTUFTSzsKKworCXJldHVybiBfX3BtZCh2YWwpOworfQorCiAvKiBtcHJvdGVjdCBuZWVkcyB0byBwcmVzZXJ2ZSBQQVQgYml0cyB3aGVuIHVwZGF0aW5nIHZtX3BhZ2VfcHJvdCAqLwogI2RlZmluZSBwZ3Byb3RfbW9kaWZ5IHBncHJvdF9tb2RpZnkKIHN0YXRpYyBpbmxpbmUgcGdwcm90X3QgcGdwcm90X21vZGlmeShwZ3Byb3RfdCBvbGRwcm90LCBwZ3Byb3RfdCBuZXdwcm90KQpAQCAtMzUwLDcgKzQzNCw3IEBACiAgKiBDdXJyZW50bHkgc3R1Y2sgYXMgYSBtYWNybyBkdWUgdG8gaW5kaXJlY3QgZm9yd2FyZCByZWZlcmVuY2UgdG8KICAqIGxpbnV4L21tem9uZS5oJ3MgX19zZWN0aW9uX21lbV9tYXBfYWRkcigpIGRlZmluaXRpb246CiAgKi8KLSNkZWZpbmUgcG1kX3BhZ2UocG1kKQlwZm5fdG9fcGFnZShwbWRfdmFsKHBtZCkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgcG1kX3BhZ2UocG1kKQlwZm5fdG9fcGFnZSgocG1kX3ZhbChwbWQpICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NISUZUKQogCiAvKgogICogdGhlIHBtZCBwYWdlIGNhbiBiZSB0aG91Z2h0IG9mIGFuIGFycmF5IGxpa2UgdGhpczogcG1kX3RbUFRSU19QRVJfUE1EXQpAQCAtNTI0LDEyICs2MDgsMjYgQEAKIAlyZXR1cm4gcmVzOwogfQogCitzdGF0aWMgaW5saW5lIHBtZF90IG5hdGl2ZV9sb2NhbF9wbWRwX2dldF9hbmRfY2xlYXIocG1kX3QgKnBtZHApCit7CisJcG1kX3QgcmVzID0gKnBtZHA7CisKKwluYXRpdmVfcG1kX2NsZWFyKHBtZHApOworCXJldHVybiByZXM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgcHRlX3QgKnB0ZXAgLCBwdGVfdCBwdGUpCiB7CiAJbmF0aXZlX3NldF9wdGUocHRlcCwgcHRlKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9zZXRfcG1kX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgICBwbWRfdCAqcG1kcCAsIHBtZF90IHBtZCkKK3sKKwluYXRpdmVfc2V0X3BtZChwbWRwLCBwbWQpOworfQorCiAjaWZuZGVmIENPTkZJR19QQVJBVklSVAogLyoKICAqIFJ1bGVzIGZvciB1c2luZyBwdGVfdXBkYXRlIC0gaXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYW55IFBURSB1cGRhdGUgd2hpY2gKQEAgLTYwNyw2ICs3MDUsNDkgQEAKIAogI2RlZmluZSBmbHVzaF90bGJfZml4X3NwdXJpb3VzX2ZhdWx0KHZtYSwgYWRkcmVzcykKIAorI2RlZmluZSBta19wbWQocGFnZSwgcGdwcm90KSAgIHBmbl9wbWQocGFnZV90b19wZm4ocGFnZSksIChwZ3Byb3QpKQorCisjZGVmaW5lICBfX0hBVkVfQVJDSF9QTURQX1NFVF9BQ0NFU1NfRkxBR1MKK2V4dGVybiBpbnQgcG1kcF9zZXRfYWNjZXNzX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwLAorCQkJCSBwbWRfdCBlbnRyeSwgaW50IGRpcnR5KTsKKworI2RlZmluZSBfX0hBVkVfQVJDSF9QTURQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCitleHRlcm4gaW50IHBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWRwKTsKKworI2RlZmluZSBfX0hBVkVfQVJDSF9QTURQX0NMRUFSX1lPVU5HX0ZMVVNICitleHRlcm4gaW50IHBtZHBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKTsKKworCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BNRFBfU1BMSVRUSU5HX0ZMVVNICitleHRlcm4gdm9pZCBwbWRwX3NwbGl0dGluZ19mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCBwbWRfdCAqcG1kcCk7CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUE1EX1dSSVRFCitzdGF0aWMgaW5saW5lIGludCBwbWRfd3JpdGUocG1kX3QgcG1kKQoreworCXJldHVybiBwbWRfZmxhZ3MocG1kKSAmIF9QQUdFX1JXOworfQorCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BNRFBfR0VUX0FORF9DTEVBUgorc3RhdGljIGlubGluZSBwbWRfdCBwbWRwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgICAgICAgcG1kX3QgKnBtZHApCit7CisJcG1kX3QgcG1kID0gbmF0aXZlX3BtZHBfZ2V0X2FuZF9jbGVhcihwbWRwKTsKKwlwbWRfdXBkYXRlKG1tLCBhZGRyLCBwbWRwKTsKKwlyZXR1cm4gcG1kOworfQorCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BNRFBfU0VUX1dSUFJPVEVDVAorc3RhdGljIGlubGluZSB2b2lkIHBtZHBfc2V0X3dycHJvdGVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWRwKQoreworCWNsZWFyX2JpdChfUEFHRV9CSVRfUlcsICh1bnNpZ25lZCBsb25nICopcG1kcCk7CisJcG1kX3VwZGF0ZShtbSwgYWRkciwgcG1kcCk7Cit9CisKIC8qCiAgKiBjbG9uZV9wZ2RfcmFuZ2UocGdkX3QgKmRzdCwgcGdkX3QgKnNyYywgaW50IGNvdW50KTsKICAqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmgKaW5kZXggZjg2ZGEyMC4uOTc1ZjcwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaApAQCAtNTksNiArNTksMTYgQEAKIAluYXRpdmVfc2V0X3B0ZShwdGVwLCBwdGUpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX3NldF9wbWQocG1kX3QgKnBtZHAsIHBtZF90IHBtZCkKK3sKKwkqcG1kcCA9IHBtZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9wbWRfY2xlYXIocG1kX3QgKnBtZCkKK3sKKwluYXRpdmVfc2V0X3BtZChwbWQsIG5hdGl2ZV9tYWtlX3BtZCgwKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgcHRlX3QgbmF0aXZlX3B0ZXBfZ2V0X2FuZF9jbGVhcihwdGVfdCAqeHApCiB7CiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNzIsMTQgKzgyLDE3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9zZXRfcG1kKHBtZF90ICpwbWRwLCBwbWRfdCBwbWQpCitzdGF0aWMgaW5saW5lIHBtZF90IG5hdGl2ZV9wbWRwX2dldF9hbmRfY2xlYXIocG1kX3QgKnhwKQogewotCSpwbWRwID0gcG1kOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX3BtZF9jbGVhcihwbWRfdCAqcG1kKQotewotCW5hdGl2ZV9zZXRfcG1kKHBtZCwgbmF0aXZlX21ha2VfcG1kKDApKTsKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIG5hdGl2ZV9tYWtlX3BtZCh4Y2hnKCZ4cC0+cG1kLCAwKSk7CisjZWxzZQorCS8qIG5hdGl2ZV9sb2NhbF9wbWRwX2dldF9hbmRfY2xlYXIsCisJICAgYnV0IGR1cGxpY2F0ZWQgYmVjYXVzZSBvZiBjeWNsaWMgZGVwZW5kZW5jeSAqLworCXBtZF90IHJldCA9ICp4cDsKKwluYXRpdmVfcG1kX2NsZWFyKHhwKTsKKwlyZXR1cm4gcmV0OworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfc2V0X3B1ZChwdWRfdCAqcHVkcCwgcHVkX3QgcHVkKQpAQCAtMTY4LDYgKzE4MSw3IEBACiAjZGVmaW5lCWtjX29mZnNldF90b192YWRkcihvKSAoKG8pIHwgfl9fVklSVFVBTF9NQVNLKQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9QR1RBQkxFXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAppbmRleCBkMWY0YTc2Li43ZGI3NzIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjZGVmaW5lIF9QQUdFX0JJVF9QQVRfTEFSR0UJMTIJLyogT24gMk1CIG9yIDFHQiBwYWdlcyAqLwogI2RlZmluZSBfUEFHRV9CSVRfU1BFQ0lBTAlfUEFHRV9CSVRfVU5VU0VEMQogI2RlZmluZSBfUEFHRV9CSVRfQ1BBX1RFU1QJX1BBR0VfQklUX1VOVVNFRDEKKyNkZWZpbmUgX1BBR0VfQklUX1NQTElUVElORwlfUEFHRV9CSVRfVU5VU0VEMSAvKiBvbmx5IHZhbGlkIG9uIGEgUFNFIHBtZCAqLwogI2RlZmluZSBfUEFHRV9CSVRfTlggICAgICAgICAgIDYzICAgICAgIC8qIE5vIGV4ZWN1dGU6IG9ubHkgdmFsaWQgYWZ0ZXIgY3B1aWQgY2hlY2sgKi8KIAogLyogSWYgX1BBR0VfQklUX1BSRVNFTlQgaXMgY2xlYXIsIHdlIHVzZSB0aGVzZTogKi8KQEAgLTQ1LDYgKzQ2LDcgQEAKICNkZWZpbmUgX1BBR0VfUEFUX0xBUkdFIChfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9QQVRfTEFSR0UpCiAjZGVmaW5lIF9QQUdFX1NQRUNJQUwJKF9BVChwdGV2YWxfdCwgMSkgPDwgX1BBR0VfQklUX1NQRUNJQUwpCiAjZGVmaW5lIF9QQUdFX0NQQV9URVNUCShfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9DUEFfVEVTVCkKKyNkZWZpbmUgX1BBR0VfU1BMSVRUSU5HCShfQVQocHRldmFsX3QsIDEpIDw8IF9QQUdFX0JJVF9TUExJVFRJTkcpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TUEVDSUFMCiAKICNpZmRlZiBDT05GSUdfS01FTUNIRUNLCkBAIC03MCw2ICs3Miw3IEBACiAvKiBTZXQgb2YgYml0cyBub3QgY2hhbmdlZCBpbiBwdGVfbW9kaWZ5ICovCiAjZGVmaW5lIF9QQUdFX0NIR19NQVNLCShQVEVfUEZOX01BU0sgfCBfUEFHRV9QQ0QgfCBfUEFHRV9QV1QgfAkJXAogCQkJIF9QQUdFX1NQRUNJQUwgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorI2RlZmluZSBfSFBBR0VfQ0hHX01BU0sgKF9QQUdFX0NIR19NQVNLIHwgX1BBR0VfUFNFKQogCiAjZGVmaW5lIF9QQUdFX0NBQ0hFX01BU0sJKF9QQUdFX1BDRCB8IF9QQUdFX1BXVCkKICNkZWZpbmUgX1BBR0VfQ0FDSEVfV0IJCSgwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBjNmVmZWNmOC4uNDU2MzZjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTc2MSwxMCArNzYxLDExIEBACiBleHRlcm4gdm9pZCBpbml0X2MxZV9tYXNrKHZvaWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZwkJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nCQlpZGxlX2hhbHQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZwkJaWRsZV9ub213YWl0OwogZXh0ZXJuIGJvb2wJCQljMWVfZGV0ZWN0ZWQ7CiAKK2VudW0gaWRsZV9ib290X292ZXJyaWRlIHtJRExFX05PX09WRVJSSURFPTAsIElETEVfSEFMVCwgSURMRV9OT01XQUlULAorCQkJIElETEVfUE9MTCwgSURMRV9GT1JDRV9NV0FJVH07CisKIGV4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQpOwogZXh0ZXJuIGludCBzeXNlbnRlcl9zZXR1cCh2b2lkKTsKIApAQCAtOTAxLDcgKzkwMiw3IEBACiAvKgogICogVGhlIGJlbG93IC04IGlzIHRvIHJlc2VydmUgOCBieXRlcyBvbiB0b3Agb2YgdGhlIHJpbmcwIHN0YWNrLgogICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSAic3RydWN0IHB0X3JlZ3MiCi0gKiBpcyBhY2Nlc3NhYmxlIGV2ZW4gaWYgdGhlIENQVSBoYXZlbid0IHN0b3JlZCB0aGUgU1MvRVNQIHJlZ2lzdGVycworICogaXMgYWNjZXNzaWJsZSBldmVuIGlmIHRoZSBDUFUgaGF2ZW4ndCBzdG9yZWQgdGhlIFNTL0VTUCByZWdpc3RlcnMKICAqIG9uIHRoZSBzdGFjayAoaW50ZXJydXB0IGdhdGUgZG9lcyBub3Qgc2F2ZSB0aGVzZSByZWdpc3RlcnMKICAqIHdoZW4gc3dpdGNoaW5nIHRvIHRoZSBzYW1lIHByaXYgcmluZykuCiAgKiBUaGVyZWZvcmUgYmV3YXJlOiBhY2Nlc3NpbmcgdGhlIHNzL2VzcCBmaWVsZHMgb2YgdGhlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYzk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMCwwICsxIEBACisvKiBkdW1teSBwcm9tLmg7IGhlcmUgdG8gbWFrZSBsaW51eC9vZi5oJ3MgI2luY2x1ZGVzIGhhcHB5ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdm0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N2bS5oCmluZGV4IDBlODMxMDUuLmYyYjgzYmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N2bS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N2bS5oCkBAIC00NywxNCArNDcsMTMgQEAKIAlJTlRFUkNFUFRfTU9OSVRPUiwKIAlJTlRFUkNFUFRfTVdBSVQsCiAJSU5URVJDRVBUX01XQUlUX0NPTkQsCisJSU5URVJDRVBUX1hTRVRCViwKIH07CiAKIAogc3RydWN0IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdm1jYl9jb250cm9sX2FyZWEgewotCXUxNiBpbnRlcmNlcHRfY3JfcmVhZDsKLQl1MTYgaW50ZXJjZXB0X2NyX3dyaXRlOwotCXUxNiBpbnRlcmNlcHRfZHJfcmVhZDsKLQl1MTYgaW50ZXJjZXB0X2RyX3dyaXRlOworCXUzMiBpbnRlcmNlcHRfY3I7CisJdTMyIGludGVyY2VwdF9kcjsKIAl1MzIgaW50ZXJjZXB0X2V4Y2VwdGlvbnM7CiAJdTY0IGludGVyY2VwdDsKIAl1OCByZXNlcnZlZF8xWzQyXTsKQEAgLTgxLDE0ICs4MCwxOSBAQAogCXUzMiBldmVudF9pbmpfZXJyOwogCXU2NCBuZXN0ZWRfY3IzOwogCXU2NCBsYnJfY3RsOwotCXU2NCByZXNlcnZlZF81OworCXUzMiBjbGVhbjsKKwl1MzIgcmVzZXJ2ZWRfNTsKIAl1NjQgbmV4dF9yaXA7Ci0JdTggcmVzZXJ2ZWRfNls4MTZdOworCXU4IGluc25fbGVuOworCXU4IGluc25fYnl0ZXNbMTVdOworCXU4IHJlc2VydmVkXzZbODAwXTsKIH07CiAKIAogI2RlZmluZSBUTEJfQ09OVFJPTF9ET19OT1RISU5HIDAKICNkZWZpbmUgVExCX0NPTlRST0xfRkxVU0hfQUxMX0FTSUQgMQorI2RlZmluZSBUTEJfQ09OVFJPTF9GTFVTSF9BU0lEIDMKKyNkZWZpbmUgVExCX0NPTlRST0xfRkxVU0hfQVNJRF9MT0NBTCA3CiAKICNkZWZpbmUgVl9UUFJfTUFTSyAweDBmCiAKQEAgLTIwNCwxOSArMjA4LDMxIEBACiAjZGVmaW5lIFNWTV9TRUxFQ1RPUl9SRUFEX01BU0sgU1ZNX1NFTEVDVE9SX1dSSVRFX01BU0sKICNkZWZpbmUgU1ZNX1NFTEVDVE9SX0NPREVfTUFTSyAoMSA8PCAzKQogCi0jZGVmaW5lIElOVEVSQ0VQVF9DUjBfTUFTSyAxCi0jZGVmaW5lIElOVEVSQ0VQVF9DUjNfTUFTSyAoMSA8PCAzKQotI2RlZmluZSBJTlRFUkNFUFRfQ1I0X01BU0sgKDEgPDwgNCkKLSNkZWZpbmUgSU5URVJDRVBUX0NSOF9NQVNLICgxIDw8IDgpCisjZGVmaW5lIElOVEVSQ0VQVF9DUjBfUkVBRAkwCisjZGVmaW5lIElOVEVSQ0VQVF9DUjNfUkVBRAkzCisjZGVmaW5lIElOVEVSQ0VQVF9DUjRfUkVBRAk0CisjZGVmaW5lIElOVEVSQ0VQVF9DUjhfUkVBRAk4CisjZGVmaW5lIElOVEVSQ0VQVF9DUjBfV1JJVEUJKDE2ICsgMCkKKyNkZWZpbmUgSU5URVJDRVBUX0NSM19XUklURQkoMTYgKyAzKQorI2RlZmluZSBJTlRFUkNFUFRfQ1I0X1dSSVRFCSgxNiArIDQpCisjZGVmaW5lIElOVEVSQ0VQVF9DUjhfV1JJVEUJKDE2ICsgOCkKIAotI2RlZmluZSBJTlRFUkNFUFRfRFIwX01BU0sgMQotI2RlZmluZSBJTlRFUkNFUFRfRFIxX01BU0sgKDEgPDwgMSkKLSNkZWZpbmUgSU5URVJDRVBUX0RSMl9NQVNLICgxIDw8IDIpCi0jZGVmaW5lIElOVEVSQ0VQVF9EUjNfTUFTSyAoMSA8PCAzKQotI2RlZmluZSBJTlRFUkNFUFRfRFI0X01BU0sgKDEgPDwgNCkKLSNkZWZpbmUgSU5URVJDRVBUX0RSNV9NQVNLICgxIDw8IDUpCi0jZGVmaW5lIElOVEVSQ0VQVF9EUjZfTUFTSyAoMSA8PCA2KQotI2RlZmluZSBJTlRFUkNFUFRfRFI3X01BU0sgKDEgPDwgNykKKyNkZWZpbmUgSU5URVJDRVBUX0RSMF9SRUFECTAKKyNkZWZpbmUgSU5URVJDRVBUX0RSMV9SRUFECTEKKyNkZWZpbmUgSU5URVJDRVBUX0RSMl9SRUFECTIKKyNkZWZpbmUgSU5URVJDRVBUX0RSM19SRUFECTMKKyNkZWZpbmUgSU5URVJDRVBUX0RSNF9SRUFECTQKKyNkZWZpbmUgSU5URVJDRVBUX0RSNV9SRUFECTUKKyNkZWZpbmUgSU5URVJDRVBUX0RSNl9SRUFECTYKKyNkZWZpbmUgSU5URVJDRVBUX0RSN19SRUFECTcKKyNkZWZpbmUgSU5URVJDRVBUX0RSMF9XUklURQkoMTYgKyAwKQorI2RlZmluZSBJTlRFUkNFUFRfRFIxX1dSSVRFCSgxNiArIDEpCisjZGVmaW5lIElOVEVSQ0VQVF9EUjJfV1JJVEUJKDE2ICsgMikKKyNkZWZpbmUgSU5URVJDRVBUX0RSM19XUklURQkoMTYgKyAzKQorI2RlZmluZSBJTlRFUkNFUFRfRFI0X1dSSVRFCSgxNiArIDQpCisjZGVmaW5lIElOVEVSQ0VQVF9EUjVfV1JJVEUJKDE2ICsgNSkKKyNkZWZpbmUgSU5URVJDRVBUX0RSNl9XUklURQkoMTYgKyA2KQorI2RlZmluZSBJTlRFUkNFUFRfRFI3X1dSSVRFCSgxNiArIDcpCiAKICNkZWZpbmUgU1ZNX0VWVElOSl9WRUNfTUFTSyAweGZmCiAKQEAgLTI0Niw2ICsyNjIsOCBAQAogI2RlZmluZSBTVk1fRVhJVElORk9TSElGVF9UU19SRUFTT05fSk1QIDM4CiAjZGVmaW5lIFNWTV9FWElUSU5GT1NISUZUX1RTX0hBU19FUlJPUl9DT0RFIDQ0CiAKKyNkZWZpbmUgU1ZNX0VYSVRJTkZPX1JFR19NQVNLIDB4MEYKKwogI2RlZmluZQlTVk1fRVhJVF9SRUFEX0NSMCAJMHgwMDAKICNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9DUjMgCTB4MDAzCiAjZGVmaW5lCVNWTV9FWElUX1JFQURfQ1I0IAkweDAwNApAQCAtMzE2LDYgKzMzNCw3IEBACiAjZGVmaW5lIFNWTV9FWElUX01PTklUT1IJMHgwOGEKICNkZWZpbmUgU1ZNX0VYSVRfTVdBSVQJCTB4MDhiCiAjZGVmaW5lIFNWTV9FWElUX01XQUlUX0NPTkQJMHgwOGMKKyNkZWZpbmUgU1ZNX0VYSVRfWFNFVEJWCQkweDA4ZAogI2RlZmluZSBTVk1fRVhJVF9OUEYgIAkJMHg0MDAKIAogI2RlZmluZSBTVk1fRVhJVF9FUlIJCS0xCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaAppbmRleCBmNjZjZGE1Li4wMzEwZGE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTMwLDYgKzMwLDcgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzdGFja19zZWdtZW50KHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIGdlbmVyYWxfcHJvdGVjdGlvbih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBwYWdlX2ZhdWx0KHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGFzeW5jX3BhZ2VfZmF1bHQodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgc3B1cmlvdXNfaW50ZXJydXB0X2J1Zyh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBjb3Byb2Nlc3Nvcl9lcnJvcih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBhbGlnbm1lbnRfY2hlY2sodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCmluZGV4IDlmMGNiZDkuLjg0NDcxYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCkBAIC02NiwxNSArNjYsMjMgQEAKICNkZWZpbmUgUElOX0JBU0VEX05NSV9FWElUSU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKICNkZWZpbmUgUElOX0JBU0VEX1ZJUlRVQUxfTk1JUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKIAorI2RlZmluZSBWTV9FWElUX1NBVkVfREVCVUdfQ09OVFJPTFMgICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBWTV9FWElUX0hPU1RfQUREUl9TUEFDRV9TSVpFICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBWTV9FWElUX0xPQURfSUEzMl9QRVJGX0dMT0JBTF9DVFJMICAgICAgMHgwMDAwMTAwMAogI2RlZmluZSBWTV9FWElUX0FDS19JTlRSX09OX0VYSVQgICAgICAgICAgICAgICAgMHgwMDAwODAwMAogI2RlZmluZSBWTV9FWElUX1NBVkVfSUEzMl9QQVQJCQkweDAwMDQwMDAwCiAjZGVmaW5lIFZNX0VYSVRfTE9BRF9JQTMyX1BBVAkJCTB4MDAwODAwMDAKKyNkZWZpbmUgVk1fRVhJVF9TQVZFX0lBMzJfRUZFUiAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgVk1fRVhJVF9MT0FEX0lBMzJfRUZFUiAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgVk1fRVhJVF9TQVZFX1ZNWF9QUkVFTVBUSU9OX1RJTUVSICAgICAgIDB4MDA0MDAwMDAKIAorI2RlZmluZSBWTV9FTlRSWV9MT0FEX0RFQlVHX0NPTlRST0xTICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBWTV9FTlRSWV9JQTMyRV9NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBWTV9FTlRSWV9TTU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBWTV9FTlRSWV9ERUFDVF9EVUFMX01PTklUT1IgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBWTV9FTlRSWV9MT0FEX0lBMzJfUEVSRl9HTE9CQUxfQ1RSTCAgICAgMHgwMDAwMjAwMAogI2RlZmluZSBWTV9FTlRSWV9MT0FEX0lBMzJfUEFUCQkJMHgwMDAwNDAwMAorI2RlZmluZSBWTV9FTlRSWV9MT0FEX0lBMzJfRUZFUiAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAogCiAvKiBWTUNTIEVuY29kaW5ncyAqLwogZW51bSB2bWNzX2ZpZWxkIHsKQEAgLTIzOSw2ICsyNDcsNyBAQAogI2RlZmluZSBFWElUX1JFQVNPTl9UQVNLX1NXSVRDSCAgICAgICAgIDkKICNkZWZpbmUgRVhJVF9SRUFTT05fQ1BVSUQgICAgICAgICAgICAgICAxMAogI2RlZmluZSBFWElUX1JFQVNPTl9ITFQgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEVYSVRfUkVBU09OX0lOVkQgICAgICAgICAgICAgICAgMTMKICNkZWZpbmUgRVhJVF9SRUFTT05fSU5WTFBHICAgICAgICAgICAgICAxNAogI2RlZmluZSBFWElUX1JFQVNPTl9SRFBNQyAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIEVYSVRfUkVBU09OX1JEVFNDICAgICAgICAgICAgICAgMTYKQEAgLTI5Niw2ICszMDUsMTIgQEAKICNkZWZpbmUgR1VFU1RfSU5UUl9TVEFURV9TTUkJCTB4MDAwMDAwMDQKICNkZWZpbmUgR1VFU1RfSU5UUl9TVEFURV9OTUkJCTB4MDAwMDAwMDgKIAorLyogR1VFU1RfQUNUSVZJVFlfU1RBVEUgZmxhZ3MgKi8KKyNkZWZpbmUgR1VFU1RfQUNUSVZJVFlfQUNUSVZFCQkwCisjZGVmaW5lIEdVRVNUX0FDVElWSVRZX0hMVAkJMQorI2RlZmluZSBHVUVTVF9BQ1RJVklUWV9TSFVURE9XTgkJMgorI2RlZmluZSBHVUVTVF9BQ1RJVklUWV9XQUlUX1NJUEkJMworCiAvKgogICogRXhpdCBRdWFsaWZpY2F0aW9ucyBmb3IgTU9WIGZvciBDb250cm9sIFJlZ2lzdGVyIEFjY2VzcwogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAppbmRleCAzOTZmZjRjLi42NmQwZmZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKQEAgLTM3LDQgKzM3LDM5IEBACiBleHRlcm4gc3RydWN0IHNoYXJlZF9pbmZvICpIWVBFUlZJU09SX3NoYXJlZF9pbmZvOwogZXh0ZXJuIHN0cnVjdCBzdGFydF9pbmZvICp4ZW5fc3RhcnRfaW5mbzsKIAorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB4ZW5fY3B1aWRfYmFzZSh2b2lkKQoreworCXVpbnQzMl90IGJhc2UsIGVheCwgZWJ4LCBlY3gsIGVkeDsKKwljaGFyIHNpZ25hdHVyZVsxM107CisKKwlmb3IgKGJhc2UgPSAweDQwMDAwMDAwOyBiYXNlIDwgMHg0MDAxMDAwMDsgYmFzZSArPSAweDEwMCkgeworCQljcHVpZChiYXNlLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyAwKSA9IGVieDsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyA0KSA9IGVjeDsKKwkJKih1aW50MzJfdCAqKShzaWduYXR1cmUgKyA4KSA9IGVkeDsKKwkJc2lnbmF0dXJlWzEyXSA9IDA7CisKKwkJaWYgKCFzdHJjbXAoIlhlblZNTVhlblZNTSIsIHNpZ25hdHVyZSkgJiYgKChlYXggLSBiYXNlKSA+PSAyKSkKKwkJCXJldHVybiBiYXNlOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1hFTgorZXh0ZXJuIGJvb2wgeGVuX2h2bV9uZWVkX2xhcGljKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGJvb2wgeGVuX3gyYXBpY19wYXJhX2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiB4ZW5faHZtX25lZWRfbGFwaWMoKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgeGVuX3gyYXBpY19wYXJhX2F2YWlsYWJsZSh2b2lkKQoreworCXJldHVybiAoeGVuX2NwdWlkX2Jhc2UoKSAhPSAwKTsKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9YODZfWEVOX0hZUEVSVklTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3BhZ2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9wYWdlLmgKaW5kZXggODc2MGNjNi4uZjI1YmRmMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL3BhZ2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vcGFnZS5oCkBAIC00Miw2ICs0MiwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BoeXNfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIHBmbik7CiBleHRlcm4gYm9vbCBzZXRfcGh5c190b19tYWNoaW5lKHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIG1mbik7CiAKK2V4dGVybiBpbnQgbTJwX2FkZF9vdmVycmlkZSh1bnNpZ25lZCBsb25nIG1mbiwgc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBtMnBfcmVtb3ZlX292ZXJyaWRlKHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqbTJwX2ZpbmRfb3ZlcnJpZGUodW5zaWduZWQgbG9uZyBtZm4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbTJwX2ZpbmRfb3ZlcnJpZGVfcGZuKHVuc2lnbmVkIGxvbmcgbWZuLCB1bnNpZ25lZCBsb25nIHBmbik7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZm5fdG9fbWZuKHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXVuc2lnbmVkIGxvbmcgbWZuOwpAQCAtNzIsOSArNzcsNiBAQAogCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKIAkJcmV0dXJuIG1mbjsKIAotCWlmICh1bmxpa2VseSgobWZuID4+IG1hY2hpbmVfdG9fcGh5c19vcmRlcikgIT0gMCkpCi0JCXJldHVybiB+MDsKLQogCXBmbiA9IDA7CiAJLyoKIAkgKiBUaGUgYXJyYXkgYWNjZXNzIGNhbiBmYWlsIChlLmcuLCBkZXZpY2Ugc3BhY2UgYmV5b25kIGVuZCBvZiBSQU0pLgpAQCAtODMsNiArODUsMTQgQEAKIAkgKi8KIAlfX2dldF91c2VyKHBmbiwgJm1hY2hpbmVfdG9fcGh5c19tYXBwaW5nW21mbl0pOwogCisJLyoKKwkgKiBJZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSBmb3JlaWduIG1mbiAoYmVjYXVzZSB0aGUgcGZuCisJICogZG9lc24ndCBtYXAgYmFjayB0byB0aGUgbWZuKSwgdGhlbiBjaGVjayB0aGUgbG9jYWwgb3ZlcnJpZGUKKwkgKiB0YWJsZSB0byBzZWUgaWYgdGhlcmUncyBhIGJldHRlciBwZm4gdG8gdXNlLgorCSAqLworCWlmIChnZXRfcGh5c190b19tYWNoaW5lKHBmbikgIT0gbWZuKQorCQlwZm4gPSBtMnBfZmluZF9vdmVycmlkZV9wZm4obWZuLCBwZm4pOworCiAJcmV0dXJuIHBmbjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IGVjODgxYzYuLmIzYTcxMTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTUwOSw2ICs1MDksNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2dzaV90b19pcnEpOwogCiBpbnQgYWNwaV9pc2FfaXJxX3RvX2dzaSh1bnNpZ25lZCBpc2FfaXJxLCB1MzIgKmdzaSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwppbmRleCBkMmZkYjA4Li41N2NhNzc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCkBAIC0xMDg2LDcgKzEwODYsNyBAQAogCiAJZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSArPSBBUEVSVFVSRV9SQU5HRV9TSVpFOwogCi0JLyogSW50aWFsaXplIHRoZSBleGNsdXNpb24gcmFuZ2UgaWYgbmVjZXNzYXJ5ICovCisJLyogSW5pdGlhbGl6ZSB0aGUgZXhjbHVzaW9uIHJhbmdlIGlmIG5lY2Vzc2FyeSAqLwogCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7CiAJCWlmIChpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYmCiAJCSAgICBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID49IGRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0CkBAIC0xMzUzLDcgKzEzNTMsNyBAQAogCiAvKgogICogQWxsb2NhdGVzIGEgbmV3IHByb3RlY3Rpb24gZG9tYWluIHVzYWJsZSBmb3IgdGhlIGRtYV9vcHMgZnVuY3Rpb25zLgotICogSXQgYWxzbyBpbnRpYWxpemVzIHRoZSBwYWdlIHRhYmxlIGFuZCB0aGUgYWRkcmVzcyBhbGxvY2F0b3IgZGF0YQorICogSXQgYWxzbyBpbml0aWFsaXplcyB0aGUgcGFnZSB0YWJsZSBhbmQgdGhlIGFkZHJlc3MgYWxsb2NhdG9yIGRhdGEKICAqIHN0cnVjdHVyZXMgcmVxdWlyZWQgZm9yIHRoZSBkbWFfb3BzIGludGVyZmFjZQogICovCiBzdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfb3BzX2RvbWFpbl9hbGxvYyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCmluZGV4IGFmZmFjYjUuLjBhOTlmNzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKQEAgLTIwLDYgKzIwLDEzIEBACiB9OwogRVhQT1JUX1NZTUJPTChhbWRfbmJfbWlzY19pZHMpOwogCitjb25zdCBzdHJ1Y3QgYW1kX25iX2J1c19kZXZfcmFuZ2UgYW1kX25iX2J1c19kZXZfcmFuZ2VzW10gX19pbml0Y29uc3QgPSB7CisJeyAweDAwLCAweDE4LCAweDIwIH0sCisJeyAweGZmLCAweDAwLCAweDIwIH0sCisJeyAweGZlLCAweDAwLCAweDIwIH0sCisJeyB9Cit9OworCiBzdHJ1Y3QgYW1kX25vcnRoYnJpZGdlX2luZm8gYW1kX25vcnRoYnJpZGdlczsKIEVYUE9SVF9TWU1CT0woYW1kX25vcnRoYnJpZGdlcyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKaW5kZXggZGNkN2M4My4uNTk1NWE3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKQEAgLTM5LDE4ICszOSw2IEBACiAKIGludCBmaXhfYXBlcnR1cmUgX19pbml0ZGF0YSA9IDE7CiAKLXN0cnVjdCBidXNfZGV2X3JhbmdlIHsKLQlpbnQgYnVzOwotCWludCBkZXZfYmFzZTsKLQlpbnQgZGV2X2xpbWl0OwotfTsKLQotc3RhdGljIHN0cnVjdCBidXNfZGV2X3JhbmdlIGJ1c19kZXZfcmFuZ2VzW10gX19pbml0ZGF0YSA9IHsKLQl7IDB4MDAsIDB4MTgsIDB4MjB9LAotCXsgMHhmZiwgMHgwMCwgMHgyMH0sCi0JeyAweGZlLCAweDAwLCAweDIwfQotfTsKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnYXJ0X3Jlc291cmNlID0gewogCS5uYW1lCT0gIkdBUlQiLAogCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLApAQCAtMjk0LDEzICsyODIsMTMgQEAKIAlzZWFyY2hfYWdwX2JyaWRnZSgmYWdwX2FwZXJfb3JkZXIsICZ2YWxpZF9hZ3ApOwogCiAJZml4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXNfZGV2X3Jhbmdlcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7IGkrKykgewogCQlpbnQgYnVzOwogCQlpbnQgZGV2X2Jhc2UsIGRldl9saW1pdDsKIAotCQlidXMgPSBidXNfZGV2X3Jhbmdlc1tpXS5idXM7Ci0JCWRldl9iYXNlID0gYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7Ci0JCWRldl9saW1pdCA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKKwkJYnVzID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmJ1czsKKwkJZGV2X2Jhc2UgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7CisJCWRldl9saW1pdCA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CiAKIAkJZm9yIChzbG90ID0gZGV2X2Jhc2U7IHNsb3QgPCBkZXZfbGltaXQ7IHNsb3QrKykgewogCQkJaWYgKCFlYXJseV9pc19hbWRfbmIocmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMHgwMCkpKQpAQCAtMzQ5LDEzICszMzcsMTMgQEAKIAkJcmV0dXJuOwogCiAJLyogZGlzYWJsZSB0aGVtIGFsbCBhdCBmaXJzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1c19kZXZfcmFuZ2VzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7IGkrKykgewogCQlpbnQgYnVzOwogCQlpbnQgZGV2X2Jhc2UsIGRldl9saW1pdDsKIAotCQlidXMgPSBidXNfZGV2X3Jhbmdlc1tpXS5idXM7Ci0JCWRldl9iYXNlID0gYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7Ci0JCWRldl9saW1pdCA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKKwkJYnVzID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmJ1czsKKwkJZGV2X2Jhc2UgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7CisJCWRldl9saW1pdCA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CiAKIAkJZm9yIChzbG90ID0gZGV2X2Jhc2U7IHNsb3QgPCBkZXZfbGltaXQ7IHNsb3QrKykgewogCQkJaWYgKCFlYXJseV9pc19hbWRfbmIocmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMHgwMCkpKQpAQCAtMzkwLDE0ICszNzgsMTQgQEAKIAogCWZpeCA9IDA7CiAJbm9kZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVzX2Rldl9yYW5nZXMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsgaSsrKSB7CiAJCWludCBidXM7CiAJCWludCBkZXZfYmFzZSwgZGV2X2xpbWl0OwogCQl1MzIgY3RsOwogCi0JCWJ1cyA9IGJ1c19kZXZfcmFuZ2VzW2ldLmJ1czsKLQkJZGV2X2Jhc2UgPSBidXNfZGV2X3Jhbmdlc1tpXS5kZXZfYmFzZTsKLQkJZGV2X2xpbWl0ID0gYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OworCQlidXMgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uYnVzOworCQlkZXZfYmFzZSA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfYmFzZTsKKwkJZGV2X2xpbWl0ID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKIAogCQlmb3IgKHNsb3QgPSBkZXZfYmFzZTsgc2xvdCA8IGRldl9saW1pdDsgc2xvdCsrKSB7CiAJCQlpZiAoIWVhcmx5X2lzX2FtZF9uYihyZWFkX3BjaV9jb25maWcoYnVzLCBzbG90LCAzLCAweDAwKSkpCkBAIC01MDUsNyArNDkzLDcgQEAKIAl9CiAKIAkvKiBGaXggdXAgdGhlIG5vcnRoIGJyaWRnZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXNfZGV2X3Jhbmdlcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OyBpKyspIHsKIAkJaW50IGJ1cywgZGV2X2Jhc2UsIGRldl9saW1pdDsKIAogCQkvKgpAQCAtNTE0LDkgKzUwMiw5IEBACiAJCSAqLwogCQl1MzIgY3RsID0gRElTVExCV0FMS1BSQiB8IGFwZXJfb3JkZXIgPDwgMTsKIAotCQlidXMgPSBidXNfZGV2X3Jhbmdlc1tpXS5idXM7Ci0JCWRldl9iYXNlID0gYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7Ci0JCWRldl9saW1pdCA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKKwkJYnVzID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmJ1czsKKwkJZGV2X2Jhc2UgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7CisJCWRldl9saW1pdCA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CiAJCWZvciAoc2xvdCA9IGRldl9iYXNlOyBzbG90IDwgZGV2X2xpbWl0OyBzbG90KyspIHsKIAkJCWlmICghZWFybHlfaXNfYW1kX25iKHJlYWRfcGNpX2NvbmZpZyhidXMsIHNsb3QsIDMsIDB4MDApKSkKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCA3OWU2YmFhLi4wNmMxOTZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC00OSw4ICs0OSw4IEBACiAjaW5jbHVkZSA8YXNtL210cnIuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL21jZS5oPgotI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgogI2luY2x1ZGUgPGFzbS90c2MuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogCiB1bnNpZ25lZCBpbnQgbnVtX3Byb2Nlc3NvcnM7CiAKQEAgLTY4NCw3ICs2ODQsNyBAQAogCWxhcGljX2Nsb2NrZXZlbnQubXVsdCA9IGRpdl9zYyhkZWx0YSwgVElDS19OU0VDICogTEFQSUNfQ0FMX0xPT1BTLAogCQkJCSAgICAgICBsYXBpY19jbG9ja2V2ZW50LnNoaWZ0KTsKIAlsYXBpY19jbG9ja2V2ZW50Lm1heF9kZWx0YV9ucyA9Ci0JCWNsb2NrZXZlbnRfZGVsdGEybnMoMHg3RkZGRkYsICZsYXBpY19jbG9ja2V2ZW50KTsKKwkJY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRkZGLCAmbGFwaWNfY2xvY2tldmVudCk7CiAJbGFwaWNfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQogCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4RiwgJmxhcGljX2Nsb2NrZXZlbnQpOwogCkBAIC0xNDc2LDcgKzE0NzYsOCBAQAogCQkvKiBJUiBpcyByZXF1aXJlZCBpZiB0aGVyZSBpcyBBUElDIElEID4gMjU1IGV2ZW4gd2hlbiBydW5uaW5nCiAJCSAqIHVuZGVyIEtWTQogCQkgKi8KLQkJaWYgKG1heF9waHlzaWNhbF9hcGljaWQgPiAyNTUgfHwgIWt2bV9wYXJhX2F2YWlsYWJsZSgpKQorCQlpZiAobWF4X3BoeXNpY2FsX2FwaWNpZCA+IDI1NSB8fAorCQkgICAgIWh5cGVydmlzb3JfeDJhcGljX2F2YWlsYWJsZSgpKQogCQkJZ290byBub3gyYXBpYzsKIAkJLyoKIAkJICogd2l0aG91dCBJUiBhbGwgQ1BVcyBjYW4gYmUgYWRkcmVzc2VkIGJ5IElPQVBJQy9NU0kKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKaW5kZXggNzJlYzI5ZS4uNzlmZDQzYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMKQEAgLTY4LDcgKzY4LDYgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBESUVfTk1JOgotCWNhc2UgRElFX05NSV9JUEk6CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTk2LDcgKzk1LDcgQEAKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IHN0cnVjdCBub3RpZmllcl9ibG9jayBiYWNrdHJhY2Vfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgICAgICAgICAgPSBhcmNoX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2VfaGFuZGxlciwKIAkubmV4dCAgICAgICAgICAgICAgICAgICA9IE5VTEwsCi0JLnByaW9yaXR5ICAgICAgICAgICAgICAgPSAxCisJLnByaW9yaXR5ICAgICAgICAgICAgICAgPSBOTUlfTE9DQUxfTE9XX1BSSU9SLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKaW5kZXggZWNjYTVmNC4uYmQxNmI1OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCkBAIC0zNzgsNyArMzc4LDcgQEAKIAogc3RhdGljIF9fY3B1aW5pdCB2b2lkIHNldF94MmFwaWNfZXh0cmFfYml0cyhpbnQgcG5vZGUpCiB7Ci0JX190aGlzX2NwdV93cml0ZSh4MmFwaWNfZXh0cmFfYml0cywgKHBub2RlIDw8IDYpKTsKKwlfX3RoaXNfY3B1X3dyaXRlKHgyYXBpY19leHRyYV9iaXRzLCBwbm9kZSA8PCB1dmhfYXBpY2lkLnMucG5vZGVfc2hpZnQpOwogfQogCiAvKgpAQCAtNjQxLDcgKzY0MSw3IEBACiAgKi8KIGludCB1dl9oYW5kbGVfbm1pKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKHJlYXNvbiAhPSBESUVfTk1JX0lQSSkKKwlpZiAocmVhc29uICE9IERJRV9OTUlVTktOT1dOKQogCQlyZXR1cm4gTk9USUZZX09LOwogCiAJaWYgKGluX2NyYXNoX2tleGVjKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWluamVjdC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWluamVjdC5jCmluZGV4IGU3ZGJkZTcuLmE3Nzk3MTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtaW5qZWN0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAKIC8qIFVwZGF0ZSBmYWtlIG1jZSByZWdpc3RlcnMgb24gY3VycmVudCBDUFUuICovCiBzdGF0aWMgdm9pZCBpbmplY3RfbWNlKHN0cnVjdCBtY2UgKm0pCkBAIC04Myw3ICs4NCw3IEBACiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKWRhdGE7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgbWNlICptID0gJl9fZ2V0X2NwdV92YXIoaW5qZWN0bSk7Ci0JaWYgKHZhbCAhPSBESUVfTk1JX0lQSSB8fCAhY3B1bWFza190ZXN0X2NwdShjcHUsIG1jZV9pbmplY3RfY3B1bWFzaykpCisJaWYgKHZhbCAhPSBESUVfTk1JIHx8ICFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgbWNlX2luamVjdF9jcHVtYXNrKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbWNlX2luamVjdF9jcHVtYXNrKTsKIAlpZiAobS0+aW5qZWN0X2ZsYWdzICYgTUNKX0VYQ0VQVElPTikKQEAgLTk1LDcgKzk2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtY2VfcmFpc2VfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBtY2VfcmFpc2Vfbm90aWZ5LAotCS5wcmlvcml0eSA9IDEwMDAsCisJLnByaW9yaXR5ID0gTk1JX0xPQ0FMX05PUk1BTF9QUklPUiwKIH07CiAKIC8qIEluamVjdCBtY2Ugb24gY3VycmVudCBDUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKaW5kZXggMDQ5MjEwMS4uOWQ5NzdhMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50LmMKQEAgLTEyNjcsNyArMTI2Nyw2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRElFX05NSToKLQljYXNlIERJRV9OTUlfSVBJOgogCQlicmVhazsKIAljYXNlIERJRV9OTUlVTktOT1dOOgogCQl0aGlzX25taSA9IHBlcmNwdV9yZWFkKGlycV9zdGF0Ll9fbm1pX2NvdW50KTsKQEAgLTEzMTcsNyArMTMxNiw3IEBACiBzdGF0aWMgX19yZWFkX21vc3RseSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGVyZl9ldmVudF9ubWlfbm90aWZpZXIgPSB7CiAJLm5vdGlmaWVyX2NhbGwJCT0gcGVyZl9ldmVudF9ubWlfaGFuZGxlciwKIAkubmV4dAkJCT0gTlVMTCwKLQkucHJpb3JpdHkJCT0gMQorCS5wcmlvcml0eQkJPSBOTUlfTE9DQUxfTE9XX1BSSU9SLAogfTsKIAogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IHVuY29uc3RyYWluZWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCmluZGV4IDgxNDAwYjkuLmU1NmI5YmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9wNC5jCkBAIC03NTMsMTkgKzc1MywyMSBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwNF9wbXVfY2xlYXJfY2Njcl9vdmYoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YykKIHsKLQlpbnQgb3ZlcmZsb3cgPSAwOwotCXUzMiBsb3csIGhpZ2g7CisJdTY0IHY7CiAKLQlyZG1zcihod2MtPmNvbmZpZ19iYXNlICsgaHdjLT5pZHgsIGxvdywgaGlnaCk7Ci0KLQkvKiB3ZSBuZWVkIHRvIGNoZWNrIGhpZ2ggYml0IGZvciB1bmZsYWdnZWQgb3ZlcmZsb3dzICovCi0JaWYgKChsb3cgJiBQNF9DQ0NSX09WRikgfHwgIShoaWdoICYgKDEgPDwgMzEpKSkgewotCQlvdmVyZmxvdyA9IDE7Ci0JCSh2b2lkKWNoZWNraW5nX3dybXNybChod2MtPmNvbmZpZ19iYXNlICsgaHdjLT5pZHgsCi0JCQkoKHU2NClsb3cpICYgflA0X0NDQ1JfT1ZGKTsKKwkvKiBhbiBvZmZpY2lhbCB3YXkgZm9yIG92ZXJmbG93IGluZGljYXRpb24gKi8KKwlyZG1zcmwoaHdjLT5jb25maWdfYmFzZSArIGh3Yy0+aWR4LCB2KTsKKwlpZiAodiAmIFA0X0NDQ1JfT1ZGKSB7CisJCXdybXNybChod2MtPmNvbmZpZ19iYXNlICsgaHdjLT5pZHgsIHYgJiB+UDRfQ0NDUl9PVkYpOworCQlyZXR1cm4gMTsKIAl9CiAKLQlyZXR1cm4gb3ZlcmZsb3c7CisJLyogaXQgbWlnaHQgYmUgdW5mbGFnZ2VkIG92ZXJmbG93ICovCisJcmRtc3JsKGh3Yy0+ZXZlbnRfYmFzZSArIGh3Yy0+aWR4LCB2KTsKKwlpZiAoISh2ICYgQVJDSF9QNF9DTlRSVkFMX01BU0spKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBwNF9wbXVfZGlzYWJsZV9wZWJzKHZvaWQpCkBAIC0xMTUyLDkgKzExNTQsOSBAQAogCSAqLwogCS5udW1fY291bnRlcnMJCT0gQVJDSF9QNF9NQVhfQ0NDUiwKIAkuYXBpYwkJCT0gMSwKLQkuY250dmFsX2JpdHMJCT0gNDAsCi0JLmNudHZhbF9tYXNrCQk9ICgxVUxMIDw8IDQwKSAtIDEsCi0JLm1heF9wZXJpb2QJCT0gKDFVTEwgPDwgMzkpIC0gMSwKKwkuY250dmFsX2JpdHMJCT0gQVJDSF9QNF9DTlRSVkFMX0JJVFMsCisJLmNudHZhbF9tYXNrCQk9IEFSQ0hfUDRfQ05UUlZBTF9NQVNLLAorCS5tYXhfcGVyaW9kCQk9ICgxVUxMIDw8IChBUkNIX1A0X0NOVFJWQUxfQklUUyAtIDEpKSAtIDEsCiAJLmh3X2NvbmZpZwkJPSBwNF9od19jb25maWcsCiAJLnNjaGVkdWxlX2V2ZW50cwk9IHA0X3BtdV9zY2hlZHVsZV9ldmVudHMsCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwppbmRleCA4NDc0Yzk5Li5kZjIwNzIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCkBAIC0xOTcsMTQgKzE5Nyw4IEBACiAgKi8KIHZvaWQgZHVtcF9zdGFjayh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYnAgPSAwOwogCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAKLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCWlmICghYnApCi0JCWdldF9icChicCk7Ci0jZW5kaWYKLQogCXByaW50aygiUGlkOiAlZCwgY29tbTogJS4yMHMgJXMgJXMgJS4qc1xuIiwKIAkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLCBwcmludF90YWludGVkKCksCiAJCWluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLApAQCAtMjQwLDYgKzIzNCw3IEBACiAJYnVzdF9zcGlubG9ja3MoMSk7CiAJcmV0dXJuIGZsYWdzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwob29wc19iZWdpbik7CiAKIHZvaWQgX19rcHJvYmVzIG9vcHNfZW5kKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2lnbnIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCAwYzJiN2VmLi4yOTRmMjZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS1tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDU5MWU2MDEuLmM4YjRlZmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0xNDA2LDYgKzE0MDYsMTYgQEAKIAlDRklfRU5EUFJPQwogRU5EKGdlbmVyYWxfcHJvdGVjdGlvbikKIAorI2lmZGVmIENPTkZJR19LVk1fR1VFU1QKK0VOVFJZKGFzeW5jX3BhZ2VfZmF1bHQpCisJUklORzBfRUNfRlJBTUUKKwlwdXNobCAkZG9fYXN5bmNfcGFnZV9mYXVsdAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJam1wIGVycm9yX2NvZGUKKwlDRklfRU5EUFJPQworRU5EKGFwZl9wYWdlX2ZhdWx0KQorI2VuZGlmCisKIC8qCiAgKiBFbmQgb2Yga3Byb2JlcyBzZWN0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggZTNiYTQxNy4uYWVkMWZmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKQEAgLTI5OSwxNyArMjk5LDIxIEBACiBFTlRSWShzYXZlX2FyZ3MpCiAJWENQVF9GUkFNRQogCWNsZAotCW1vdnFfY2ZpIHJkaSwgUkRJKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJzaSwgUlNJKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJkeCwgUkRYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJjeCwgUkNYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJheCwgUkFYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpICByOCwgIFI4KzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpICByOSwgIFI5KzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHIxMCwgUjEwKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHIxMSwgUjExKzE2LUFSR09GRlNFVAorCS8qCisJICogc3RhcnQgZnJvbSByYnAgaW4gcHRfcmVncyBhbmQganVtcCBvdmVyCisJICogcmV0dXJuIGFkZHJlc3MuCisJICovCisJbW92cV9jZmkgcmRpLCBSREkrOC1SQlAKKwltb3ZxX2NmaSByc2ksIFJTSSs4LVJCUAorCW1vdnFfY2ZpIHJkeCwgUkRYKzgtUkJQCisJbW92cV9jZmkgcmN4LCBSQ1grOC1SQlAKKwltb3ZxX2NmaSByYXgsIFJBWCs4LVJCUAorCW1vdnFfY2ZpICByOCwgIFI4KzgtUkJQCisJbW92cV9jZmkgIHI5LCAgUjkrOC1SQlAKKwltb3ZxX2NmaSByMTAsIFIxMCs4LVJCUAorCW1vdnFfY2ZpIHIxMSwgUjExKzgtUkJQCiAKLQlsZWFxIC1BUkdPRkZTRVQrMTYoJXJzcCksJXJkaQkvKiBhcmcxIGZvciBoYW5kbGVyICovCisJbGVhcSAtUkJQKzgoJXJzcCksJXJkaQkvKiBhcmcxIGZvciBoYW5kbGVyICovCiAJbW92cV9jZmkgcmJwLCA4CQkvKiBwdXNoICVyYnAgKi8KIAlsZWFxIDgoJXJzcCksICVyYnAJCS8qIG1vdiAlcnNwLCAlZWJwICovCiAJdGVzdGwgJDMsIENTKCVyZGkpCkBAIC03ODIsOCArNzg2LDkgQEAKIAogLyogMCglcnNwKTogfihpbnRlcnJ1cHQgbnVtYmVyKSAqLwogCS5tYWNybyBpbnRlcnJ1cHQgZnVuYwotCXN1YnEgJE9SSUdfUkFYLUFSR09GRlNFVCs4LCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIE9SSUdfUkFYLUFSR09GRlNFVCs4CisJLyogcmVzZXJ2ZSBwdF9yZWdzIGZvciBzY3JhdGNoIHJlZ3MgYW5kIHJicCAqLworCXN1YnEgJE9SSUdfUkFYLVJCUCwgJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCBPUklHX1JBWC1SQlAKIAljYWxsIHNhdmVfYXJncwogCVBBUlRJQUxfRlJBTUUgMAogCWNhbGwgXGZ1bmMKQEAgLTgwOCw5ICs4MTMsMTQgQEAKIAlUUkFDRV9JUlFTX09GRgogCWRlY2wgUEVSX0NQVV9WQVIoaXJxX2NvdW50KQogCWxlYXZlcQorCiAJQ0ZJX1JFU1RPUkUJCXJicAogCUNGSV9ERUZfQ0ZBX1JFR0lTVEVSCXJzcAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAktOAorCisJLyogd2UgZGlkIG5vdCBzYXZlIHJieCwgcmVzdG9yZSBvbmx5IGZyb20gQVJHT0ZGU0VUICovCisJYWRkcSAkOCwgJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAktOAogZXhpdF9pbnRyOgogCUdFVF9USFJFQURfSU5GTyglcmN4KQogCXRlc3RsICQzLENTLUFSR09GRlNFVCglcnNwKQpAQCAtMTMxOSw2ICsxMzI5LDkgQEAKICNlbmRpZgogZXJyb3JlbnRyeSBnZW5lcmFsX3Byb3RlY3Rpb24gZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCiBlcnJvcmVudHJ5IHBhZ2VfZmF1bHQgZG9fcGFnZV9mYXVsdAorI2lmZGVmIENPTkZJR19LVk1fR1VFU1QKK2Vycm9yZW50cnkgYXN5bmNfcGFnZV9mYXVsdCBkb19hc3luY19wYWdlX2ZhdWx0CisjZW5kaWYKICNpZmRlZiBDT05GSUdfWDg2X01DRQogcGFyYW5vaWR6ZXJvZW50cnkgbWFjaGluZV9jaGVjayAqbWFjaGluZV9jaGVja192ZWN0b3IoJXJpcCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggOWY1NGIyMC4uZmMyOTNkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCkBAIC0xMjYsNyArMTI2LDcgQEAKIAltb3ZzbAogCW1vdmwgcGEoYm9vdF9wYXJhbXMpICsgTkVXX0NMX1BPSU5URVIsJWVzaQogCWFuZGwgJWVzaSwlZXNpCi0JanogMWYJCQkjIE5vIGNvbWFuZCBsaW5lCisJanogMWYJCQkjIE5vIGNvbW1hbmQgbGluZQogCW1vdmwgJHBhKGJvb3RfY29tbWFuZF9saW5lKSwlZWRpCiAJbW92bCAkKENPTU1BTkRfTElORV9TSVpFLzQpLCVlY3gKIAlyZXAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jCmluZGV4IDU4YmIyMzkuLmU2MGMzOGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2kzODcuYwpAQCAtMTY5LDYgKzE2OSw3IEBACiAJc2V0X3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKHRzayk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpbml0X2ZwdSk7CiAKIC8qCiAgKiBUaGUgeHN0YXRlcmVnc19hY3RpdmUoKSByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBmcHJlZ3NfYWN0aXZlKCkgcm91dGluZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwppbmRleCAzYTQzY2FhLi41Mjk0NWRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycS5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgpAQCAtMjc1LDYgKzI3NiwxNSBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTCh2ZWN0b3JfdXNlZF9ieV9wZXJjcHVfaXJxKTsKIAorI2lmZGVmIENPTkZJR19PRgordW5zaWduZWQgaW50IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCisJCWNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpCit7CisJcmV0dXJuIGludHNwZWNbMF07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX29mX21hcHBpbmcpOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qIEEgY3B1IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBjcHVfb25saW5lX21hc2suICBSZXNldCBpcnEgYWZmaW5pdGllcy4gKi8KIHZvaWQgZml4dXBfaXJxcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggY2QyMWI2NS4uYTQxMzAwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAKIHN0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPQogewpAQCAtNTI1LDEwICs1MjYsNiBAQAogCQl9CiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAotCWNhc2UgRElFX05NSV9JUEk6Ci0JCS8qIEp1c3QgaWdub3JlLCB3ZSB3aWxsIGhhbmRsZSB0aGUgcm91bmR1cCBvbiBESUVfTk1JLiAqLwotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KIAljYXNlIERJRV9OTUlVTktOT1dOOgogCQlpZiAod2FzX2luX2RlYnVnX25taVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXSkgewogCQkJd2FzX2luX2RlYnVnX25taVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IDA7CkBAIC02MDYsNyArNjAzLDcgQEAKIAkvKgogCSAqIExvd2VzdC1wcmlvIG5vdGlmaWVyIHByaW9yaXR5LCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIGxhc3Q6CiAJICovCi0JLnByaW9yaXR5CT0gLUlOVF9NQVgsCisJLnByaW9yaXR5CT0gTk1JX0xPQ0FMX0xPV19QUklPUiwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bS5jIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCmluZGV4IDYzYjBlYzguLjhkYzQ0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKQEAgLTI3LDE2ICsyNywzNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKICNkZWZpbmUgTU1VX1FVRVVFX1NJWkUgMTAyNAogCitzdGF0aWMgaW50IGt2bWFwZiA9IDE7CisKK3N0YXRpYyBpbnQgcGFyc2Vfbm9fa3ZtYXBmKGNoYXIgKmFyZykKK3sKKyAgICAgICAga3ZtYXBmID0gMDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2Vhcmx5X3BhcmFtKCJuby1rdm1hcGYiLCBwYXJzZV9ub19rdm1hcGYpOworCiBzdHJ1Y3Qga3ZtX3BhcmFfc3RhdGUgewogCXU4IG1tdV9xdWV1ZVtNTVVfUVVFVUVfU0laRV07CiAJaW50IG1tdV9xdWV1ZV9sZW47CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGt2bV9wYXJhX3N0YXRlLCBwYXJhX3N0YXRlKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga3ZtX3ZjcHVfcHZfYXBmX2RhdGEsIGFwZl9yZWFzb24pIF9fYWxpZ25lZCg2NCk7CiAKIHN0YXRpYyBzdHJ1Y3Qga3ZtX3BhcmFfc3RhdGUgKmt2bV9wYXJhX3N0YXRlKHZvaWQpCiB7CkBAIC01MCw2ICs3MSwxOTUgQEAKIHsKIH0KIAorI2RlZmluZSBLVk1fVEFTS19TTEVFUF9IQVNIQklUUyA4CisjZGVmaW5lIEtWTV9UQVNLX1NMRUVQX0hBU0hTSVpFICgxPDxLVk1fVEFTS19TTEVFUF9IQVNIQklUUykKKworc3RydWN0IGt2bV90YXNrX3NsZWVwX25vZGUgeworCXN0cnVjdCBobGlzdF9ub2RlIGxpbms7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJdTMyIHRva2VuOworCWludCBjcHU7CisJYm9vbCBoYWx0ZWQ7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07Cit9OworCitzdGF0aWMgc3RydWN0IGt2bV90YXNrX3NsZWVwX2hlYWQgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBsaXN0OworfSBhc3luY19wZl9zbGVlcGVyc1tLVk1fVEFTS19TTEVFUF9IQVNIU0laRV07CisKK3N0YXRpYyBzdHJ1Y3Qga3ZtX3Rhc2tfc2xlZXBfbm9kZSAqX2ZpbmRfYXBmX3Rhc2soc3RydWN0IGt2bV90YXNrX3NsZWVwX2hlYWQgKmIsCisJCQkJCQkgIHUzMiB0b2tlbikKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKKworCWhsaXN0X2Zvcl9lYWNoKHAsICZiLT5saXN0KSB7CisJCXN0cnVjdCBrdm1fdGFza19zbGVlcF9ub2RlICpuID0KKwkJCWhsaXN0X2VudHJ5KHAsIHR5cGVvZigqbiksIGxpbmspOworCQlpZiAobi0+dG9rZW4gPT0gdG9rZW4pCisJCQlyZXR1cm4gbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBrdm1fYXN5bmNfcGZfdGFza193YWl0KHUzMiB0b2tlbikKK3sKKwl1MzIga2V5ID0gaGFzaF8zMih0b2tlbiwgS1ZNX1RBU0tfU0xFRVBfSEFTSEJJVFMpOworCXN0cnVjdCBrdm1fdGFza19zbGVlcF9oZWFkICpiID0gJmFzeW5jX3BmX3NsZWVwZXJzW2tleV07CisJc3RydWN0IGt2bV90YXNrX3NsZWVwX25vZGUgbiwgKmU7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IGNwdSwgaWRsZTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwlpZGxlID0gaWRsZV9jcHUoY3B1KTsKKwlwdXRfY3B1KCk7CisKKwlzcGluX2xvY2soJmItPmxvY2spOworCWUgPSBfZmluZF9hcGZfdGFzayhiLCB0b2tlbik7CisJaWYgKGUpIHsKKwkJLyogZHVtbXkgZW50cnkgZXhpc3QgLT4gd2FrZSB1cCB3YXMgZGVsaXZlcmVkIGFoZWFkIG9mIFBGICovCisJCWhsaXN0X2RlbCgmZS0+bGluayk7CisJCWtmcmVlKGUpOworCQlzcGluX3VubG9jaygmYi0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwluLnRva2VuID0gdG9rZW47CisJbi5jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbi5tbSA9IGN1cnJlbnQtPmFjdGl2ZV9tbTsKKwluLmhhbHRlZCA9IGlkbGUgfHwgcHJlZW1wdF9jb3VudCgpID4gMTsKKwlhdG9taWNfaW5jKCZuLm1tLT5tbV9jb3VudCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbi53cSk7CisJaGxpc3RfYWRkX2hlYWQoJm4ubGluaywgJmItPmxpc3QpOworCXNwaW5fdW5sb2NrKCZiLT5sb2NrKTsKKworCWZvciAoOzspIHsKKwkJaWYgKCFuLmhhbHRlZCkKKwkJCXByZXBhcmVfdG9fd2FpdCgmbi53cSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGhsaXN0X3VuaGFzaGVkKCZuLmxpbmspKQorCQkJYnJlYWs7CisKKwkJaWYgKCFuLmhhbHRlZCkgeworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJc2NoZWR1bGUoKTsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgY2Fubm90IHJlc2NoZWR1bGUuIFNvIGhhbHQuCisJCQkgKi8KKwkJCW5hdGl2ZV9zYWZlX2hhbHQoKTsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCX0KKwl9CisJaWYgKCFuLmhhbHRlZCkKKwkJZmluaXNoX3dhaXQoJm4ud3EsICZ3YWl0KTsKKworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9hc3luY19wZl90YXNrX3dhaXQpOworCitzdGF0aWMgdm9pZCBhcGZfdGFza193YWtlX29uZShzdHJ1Y3Qga3ZtX3Rhc2tfc2xlZXBfbm9kZSAqbikKK3sKKwlobGlzdF9kZWxfaW5pdCgmbi0+bGluayk7CisJaWYgKCFuLT5tbSkKKwkJcmV0dXJuOworCW1tZHJvcChuLT5tbSk7CisJaWYgKG4tPmhhbHRlZCkKKwkJc21wX3NlbmRfcmVzY2hlZHVsZShuLT5jcHUpOworCWVsc2UgaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm4tPndxKSkKKwkJd2FrZV91cCgmbi0+d3EpOworfQorCitzdGF0aWMgdm9pZCBhcGZfdGFza193YWtlX2FsbCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEtWTV9UQVNLX1NMRUVQX0hBU0hTSVpFOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X25vZGUgKnAsICpuZXh0OworCQlzdHJ1Y3Qga3ZtX3Rhc2tfc2xlZXBfaGVhZCAqYiA9ICZhc3luY19wZl9zbGVlcGVyc1tpXTsKKwkJc3Bpbl9sb2NrKCZiLT5sb2NrKTsKKwkJaGxpc3RfZm9yX2VhY2hfc2FmZShwLCBuZXh0LCAmYi0+bGlzdCkgeworCQkJc3RydWN0IGt2bV90YXNrX3NsZWVwX25vZGUgKm4gPQorCQkJCWhsaXN0X2VudHJ5KHAsIHR5cGVvZigqbiksIGxpbmspOworCQkJaWYgKG4tPmNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQkJYXBmX3Rhc2tfd2FrZV9vbmUobik7CisJCX0KKwkJc3Bpbl91bmxvY2soJmItPmxvY2spOworCX0KK30KKwordm9pZCBrdm1fYXN5bmNfcGZfdGFza193YWtlKHUzMiB0b2tlbikKK3sKKwl1MzIga2V5ID0gaGFzaF8zMih0b2tlbiwgS1ZNX1RBU0tfU0xFRVBfSEFTSEJJVFMpOworCXN0cnVjdCBrdm1fdGFza19zbGVlcF9oZWFkICpiID0gJmFzeW5jX3BmX3NsZWVwZXJzW2tleV07CisJc3RydWN0IGt2bV90YXNrX3NsZWVwX25vZGUgKm47CisKKwlpZiAodG9rZW4gPT0gfjApIHsKKwkJYXBmX3Rhc2tfd2FrZV9hbGwoKTsKKwkJcmV0dXJuOworCX0KKworYWdhaW46CisJc3Bpbl9sb2NrKCZiLT5sb2NrKTsKKwluID0gX2ZpbmRfYXBmX3Rhc2soYiwgdG9rZW4pOworCWlmICghbikgeworCQkvKgorCQkgKiBhc3luYyBQRiB3YXMgbm90IHlldCBoYW5kbGVkLgorCQkgKiBBZGQgZHVtbXkgZW50cnkgZm9yIHRoZSB0b2tlbi4KKwkJICovCisJCW4gPSBrbWFsbG9jKHNpemVvZigqbiksIEdGUF9BVE9NSUMpOworCQlpZiAoIW4pIHsKKwkJCS8qCisJCQkgKiBBbGxvY2F0aW9uIGZhaWxlZCEgQnVzeSB3YWl0IHdoaWxlIG90aGVyIGNwdQorCQkJICogaGFuZGxlcyBhc3luYyBQRi4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2soJmItPmxvY2spOworCQkJY3B1X3JlbGF4KCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCW4tPnRva2VuID0gdG9rZW47CisJCW4tPmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJbi0+bW0gPSBOVUxMOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuLT53cSk7CisJCWhsaXN0X2FkZF9oZWFkKCZuLT5saW5rLCAmYi0+bGlzdCk7CisJfSBlbHNlCisJCWFwZl90YXNrX3dha2Vfb25lKG4pOworCXNwaW5fdW5sb2NrKCZiLT5sb2NrKTsKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fYXN5bmNfcGZfdGFza193YWtlKTsKKwordTMyIGt2bV9yZWFkX2FuZF9yZXNldF9wZl9yZWFzb24odm9pZCkKK3sKKwl1MzIgcmVhc29uID0gMDsKKworCWlmIChfX2dldF9jcHVfdmFyKGFwZl9yZWFzb24pLmVuYWJsZWQpIHsKKwkJcmVhc29uID0gX19nZXRfY3B1X3ZhcihhcGZfcmVhc29uKS5yZWFzb247CisJCV9fZ2V0X2NwdV92YXIoYXBmX3JlYXNvbikucmVhc29uID0gMDsKKwl9CisKKwlyZXR1cm4gcmVhc29uOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYWRfYW5kX3Jlc2V0X3BmX3JlYXNvbik7CisKK2RvdHJhcGxpbmthZ2Ugdm9pZCBfX2twcm9iZXMKK2RvX2FzeW5jX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKK3sKKwlzd2l0Y2ggKGt2bV9yZWFkX2FuZF9yZXNldF9wZl9yZWFzb24oKSkgeworCWRlZmF1bHQ6CisJCWRvX3BhZ2VfZmF1bHQocmVncywgZXJyb3JfY29kZSk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1BWX1JFQVNPTl9QQUdFX05PVF9QUkVTRU5UOgorCQkvKiBwYWdlIGlzIHN3YXBwZWQgb3V0IGJ5IHRoZSBob3N0LiAqLworCQlrdm1fYXN5bmNfcGZfdGFza193YWl0KCh1MzIpcmVhZF9jcjIoKSk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1BWX1JFQVNPTl9QQUdFX1JFQURZOgorCQlrdm1fYXN5bmNfcGZfdGFza193YWtlKCh1MzIpcmVhZF9jcjIoKSk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQga3ZtX21tdV9vcCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxlbikKIHsKIAlpbnQgcjsKQEAgLTIzMSwxMCArNDQxLDExNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQgX19pbml0IGt2bV9ndWVzdF9pbml0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBrdm1fZ3Vlc3RfY3B1X2luaXQodm9pZCkKIHsKIAlpZiAoIWt2bV9wYXJhX2F2YWlsYWJsZSgpKQogCQlyZXR1cm47CiAKKwlpZiAoa3ZtX3BhcmFfaGFzX2ZlYXR1cmUoS1ZNX0ZFQVRVUkVfQVNZTkNfUEYpICYmIGt2bWFwZikgeworCQl1NjQgcGEgPSBfX3BhKCZfX2dldF9jcHVfdmFyKGFwZl9yZWFzb24pKTsKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJCXBhIHw9IEtWTV9BU1lOQ19QRl9TRU5EX0FMV0FZUzsKKyNlbmRpZgorCQl3cm1zcmwoTVNSX0tWTV9BU1lOQ19QRl9FTiwgcGEgfCBLVk1fQVNZTkNfUEZfRU5BQkxFRCk7CisJCV9fZ2V0X2NwdV92YXIoYXBmX3JlYXNvbikuZW5hYmxlZCA9IDE7CisJCXByaW50ayhLRVJOX0lORk8iS1ZNIHNldHVwIGFzeW5jIFBGIGZvciBjcHUgJWRcbiIsCisJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworCX0KK30KKworc3RhdGljIHZvaWQga3ZtX3B2X2Rpc2FibGVfYXBmKHZvaWQgKnVudXNlZCkKK3sKKwlpZiAoIV9fZ2V0X2NwdV92YXIoYXBmX3JlYXNvbikuZW5hYmxlZCkKKwkJcmV0dXJuOworCisJd3Jtc3JsKE1TUl9LVk1fQVNZTkNfUEZfRU4sIDApOworCV9fZ2V0X2NwdV92YXIoYXBmX3JlYXNvbikuZW5hYmxlZCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPIlVucmVnaXN0ZXIgcHYgc2hhcmVkIG1lbW9yeSBmb3IgY3B1ICVkXG4iLAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCitzdGF0aWMgaW50IGt2bV9wdl9yZWJvb3Rfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX1JFU1RBUlQpCisJCW9uX2VhY2hfY3B1KGt2bV9wdl9kaXNhYmxlX2FwZiwgTlVMTCwgMSk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9wdl9yZWJvb3RfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBrdm1fcHZfcmVib290X25vdGlmeSwKK307CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBfX2luaXQga3ZtX3NtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0tWTV9DTE9DSworCVdBUk5fT04oa3ZtX3JlZ2lzdGVyX2Nsb2NrKCJwcmltYXJ5IGNwdSBjbG9jayIpKTsKKyNlbmRpZgorCWt2bV9ndWVzdF9jcHVfaW5pdCgpOworCW5hdGl2ZV9zbXBfcHJlcGFyZV9ib290X2NwdSgpOworfQorCitzdGF0aWMgdm9pZCBrdm1fZ3Vlc3RfY3B1X29ubGluZSh2b2lkICpkdW1teSkKK3sKKwlrdm1fZ3Vlc3RfY3B1X2luaXQoKTsKK30KKworc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2NwdV9vZmZsaW5lKHZvaWQgKmR1bW15KQoreworCWt2bV9wdl9kaXNhYmxlX2FwZihOVUxMKTsKKwlhcGZfdGFza193YWtlX2FsbCgpOworfQorCitzdGF0aWMgaW50IF9fY3B1aW5pdCBrdm1fY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgorCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGt2bV9ndWVzdF9jcHVfb25saW5lLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGt2bV9ndWVzdF9jcHVfb2ZmbGluZSwgTlVMTCwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEga3ZtX2NwdV9ub3RpZmllciA9IHsKKyAgICAgICAgLm5vdGlmaWVyX2NhbGwgID0ga3ZtX2NwdV9ub3RpZnksCit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBrdm1fYXBmX3RyYXBfaW5pdCh2b2lkKQoreworCXNldF9pbnRyX2dhdGUoMTQsICZhc3luY19wYWdlX2ZhdWx0KTsKK30KKwordm9pZCBfX2luaXQga3ZtX2d1ZXN0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICgha3ZtX3BhcmFfYXZhaWxhYmxlKCkpCisJCXJldHVybjsKKwogCXBhcmF2aXJ0X29wc19zZXR1cCgpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3B2X3JlYm9vdF9uYik7CisJZm9yIChpID0gMDsgaSA8IEtWTV9UQVNLX1NMRUVQX0hBU0hTSVpFOyBpKyspCisJCXNwaW5fbG9ja19pbml0KCZhc3luY19wZl9zbGVlcGVyc1tpXS5sb2NrKTsKKwlpZiAoa3ZtX3BhcmFfaGFzX2ZlYXR1cmUoS1ZNX0ZFQVRVUkVfQVNZTkNfUEYpKQorCQl4ODZfaW5pdC5pcnFzLnRyYXBfaW5pdCA9IGt2bV9hcGZfdHJhcF9pbml0OworCisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9vcHMuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSBrdm1fc21wX3ByZXBhcmVfYm9vdF9jcHU7CisJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZrdm1fY3B1X25vdGlmaWVyKTsKKyNlbHNlCisJa3ZtX2d1ZXN0X2NwdV9pbml0KCk7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKaW5kZXggY2E0M2NlMy4uZjk4ZDNlYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCS5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAotc3RhdGljIGludCBrdm1fcmVnaXN0ZXJfY2xvY2soY2hhciAqdHh0KQoraW50IGt2bV9yZWdpc3Rlcl9jbG9jayhjaGFyICp0eHQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgbG93LCBoaWdoLCByZXQ7CkBAIC0xNTIsMTQgKzE1Miw2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIF9faW5pdCBrdm1fc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKLXsKLQlXQVJOX09OKGt2bV9yZWdpc3Rlcl9jbG9jaygicHJpbWFyeSBjcHUgY2xvY2siKSk7Ci0JbmF0aXZlX3NtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIEFmdGVyIHRoZSBjbG9jayBpcyByZWdpc3RlcmVkLCB0aGUgaG9zdCB3aWxsIGtlZXAgd3JpdGluZyB0byB0aGUKICAqIHJlZ2lzdGVyZWQgbWVtb3J5IGxvY2F0aW9uLiBJZiB0aGUgZ3Vlc3QgaGFwcGVucyB0byBzaHV0ZG93biwgdGhpcyBtZW1vcnkKQEAgLTIwNiw5ICsxOTgsNiBAQAogCXg4Nl9jcHVpbml0LnNldHVwX3BlcmNwdV9jbG9ja2V2ID0KIAkJa3ZtX3NldHVwX3NlY29uZGFyeV9jbG9jazsKICNlbmRpZgotI2lmZGVmIENPTkZJR19TTVAKLQlzbXBfb3BzLnNtcF9wcmVwYXJlX2Jvb3RfY3B1ID0ga3ZtX3NtcF9wcmVwYXJlX2Jvb3RfY3B1OwotI2VuZGlmCiAJbWFjaGluZV9vcHMuc2h1dGRvd24gID0ga3ZtX3NodXRkb3duOwogI2lmZGVmIENPTkZJR19LRVhFQwogCW1hY2hpbmVfb3BzLmNyYXNoX3NodXRkb3duICA9IGt2bV9jcmFzaF9zaHV0ZG93bjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYwppbmRleCA4ZjI5NTYwLi5hYjIzZjFhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0zNywyMCArMzcsMTEgQEAKIAogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCi0JaWYgKCFzaXplKQorCWlmIChQQUdFX0FMSUdOKHNpemUpID4gTU9EVUxFU19MRU4pCiAJCXJldHVybiBOVUxMOwotCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwotCWlmIChzaXplID4gTU9EVUxFU19MRU4pCi0JCXJldHVybiBOVUxMOwotCi0JYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoc2l6ZSwgVk1fQUxMT0MsIE1PRFVMRVNfVkFERFIsIE1PRFVMRVNfRU5EKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIF9fdm1hbGxvY19hcmVhKGFyZWEsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLAotCQkJCQlQQUdFX0tFUk5FTF9FWEVDKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGVfcmFuZ2Uoc2l6ZSwgMSwgTU9EVUxFU19WQUREUiwgTU9EVUxFU19FTkQsCisJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMX0VYRUMsCisJCQkJLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKIC8qIEZyZWUgbWVtb3J5IHJldHVybmVkIGZyb20gbW9kdWxlX2FsbG9jICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCmluZGV4IGM1YjI1MDAuLjg2OWUxYWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCkBAIC00MjEsOCArNDIxLDExIEBACiAJLnNldF9wdGUgPSBuYXRpdmVfc2V0X3B0ZSwKIAkuc2V0X3B0ZV9hdCA9IG5hdGl2ZV9zZXRfcHRlX2F0LAogCS5zZXRfcG1kID0gbmF0aXZlX3NldF9wbWQsCisJLnNldF9wbWRfYXQgPSBuYXRpdmVfc2V0X3BtZF9hdCwKIAkucHRlX3VwZGF0ZSA9IHBhcmF2aXJ0X25vcCwKIAkucHRlX3VwZGF0ZV9kZWZlciA9IHBhcmF2aXJ0X25vcCwKKwkucG1kX3VwZGF0ZSA9IHBhcmF2aXJ0X25vcCwKKwkucG1kX3VwZGF0ZV9kZWZlciA9IHBhcmF2aXJ0X25vcCwKIAogCS5wdGVwX21vZGlmeV9wcm90X3N0YXJ0ID0gX19wdGVwX21vZGlmeV9wcm90X3N0YXJ0LAogCS5wdGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IF9fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwOWMwOGExLi5kODI4NmVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIyLDExICsyMiw2IEBACiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KIAotdW5zaWduZWQgbG9uZyBpZGxlX2hhbHQ7Ci1FWFBPUlRfU1lNQk9MKGlkbGVfaGFsdCk7Ci11bnNpZ25lZCBsb25nIGlkbGVfbm9td2FpdDsKLUVYUE9SVF9TWU1CT0woaWRsZV9ub213YWl0KTsKLQogc3RydWN0IGttZW1fY2FjaGUgKnRhc2tfeHN0YXRlX2NhY2hlcDsKIEVYUE9SVF9TWU1CT0xfR1BMKHRhc2tfeHN0YXRlX2NhY2hlcCk7CiAKQEAgLTMyNyw3ICszMjIsNyBAQAogLyoKICAqIElkbGUgcmVsYXRlZCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwogICovCi11bnNpZ25lZCBsb25nIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSAwOwordW5zaWduZWQgbG9uZyBib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gSURMRV9OT19PVkVSUklERTsKIEVYUE9SVF9TWU1CT0woYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSk7CiAKIC8qCkBAIC0zODYsNiArMzgxLDggQEAKIAkJZWxzZQogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19QT0xMSU5HOworCQl0cmFjZV9wb3dlcl9lbmQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJdHJhY2VfY3B1X2lkbGUoUFdSX0VWRU5UX0VYSVQsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfSBlbHNlIHsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkvKiBsb29wIGlzIGRvbmUgYnkgdGhlIGNhbGxlciAqLwpAQCAtNDQzLDggKzQ0MCw2IEBACiAgKi8KIHZvaWQgbXdhaXRfaWRsZV93aXRoX2hpbnRzKHVuc2lnbmVkIGxvbmcgYXgsIHVuc2lnbmVkIGxvbmcgY3gpCiB7Ci0JdHJhY2VfcG93ZXJfc3RhcnQoUE9XRVJfQ1NUQVRFLCAoYXg+PjQpKzEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JdHJhY2VfY3B1X2lkbGUoKGF4Pj40KSsxLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJaWYgKGNwdV9oYXMoX190aGlzX2NwdV9wdHIoJmNwdV9pbmZvKSwgWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SKSkKIAkJCWNsZmx1c2goKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyk7CkBAIC00NzEsNiArNDY2LDggQEAKIAkJCV9fc3RpX213YWl0KDAsIDApOwogCQllbHNlCiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXRyYWNlX3Bvd2VyX2VuZChzbXBfcHJvY2Vzc29yX2lkKCkpOworCQl0cmFjZV9jcHVfaWRsZShQV1JfRVZFTlRfRVhJVCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAl9IGVsc2UKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQpAQCAtNTAzLDcgKzUwMCw2IEBACiAgKgogICogaWRsZT1td2FpdCBvdmVycmlkZXMgdGhpcyBkZWNpc2lvbiBhbmQgZm9yY2VzIHRoZSB1c2FnZSBvZiBtd2FpdC4KICAqLwotc3RhdGljIGludCBfX2NwdWluaXRkYXRhIGZvcmNlX213YWl0OwogCiAjZGVmaW5lIE1XQUlUX0lORk8JCQkweDA1CiAjZGVmaW5lIE1XQUlUX0VDWF9FWFRFTkRFRF9JTkZPCQkweDAxCkBAIC01MTMsNyArNTA5LDcgQEAKIHsKIAl1MzIgZWF4LCBlYngsIGVjeCwgZWR4OwogCi0JaWYgKGZvcmNlX213YWl0KQorCWlmIChib290X29wdGlvbl9pZGxlX292ZXJyaWRlID09IElETEVfRk9SQ0VfTVdBSVQpCiAJCXJldHVybiAxOwogCiAJaWYgKGMtPmNwdWlkX2xldmVsIDwgTVdBSVRfSU5GTykKQEAgLTYzMyw5ICs2MjksMTAgQEAKIAlpZiAoIXN0cmNtcChzdHIsICJwb2xsIikpIHsKIAkJcHJpbnRrKCJ1c2luZyBwb2xsaW5nIGlkbGUgdGhyZWFkcy5cbiIpOwogCQlwbV9pZGxlID0gcG9sbF9pZGxlOwotCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJtd2FpdCIpKQotCQlmb3JjZV9td2FpdCA9IDE7Ci0JZWxzZSBpZiAoIXN0cmNtcChzdHIsICJoYWx0IikpIHsKKwkJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfUE9MTDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibXdhaXQiKSkgeworCQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gSURMRV9GT1JDRV9NV0FJVDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiaGFsdCIpKSB7CiAJCS8qCiAJCSAqIFdoZW4gdGhlIGJvb3Qgb3B0aW9uIG9mIGlkbGU9aGFsdCBpcyBhZGRlZCwgaGFsdCBpcwogCQkgKiBmb3JjZWQgdG8gYmUgdXNlZCBmb3IgQ1BVIGlkbGUuIEluIHN1Y2ggY2FzZSBDUFUgQzIvQzMKQEAgLTY0NCw4ICs2NDEsNyBAQAogCQkgKiB0aGUgYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZS4KIAkJICovCiAJCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7Ci0JCWlkbGVfaGFsdCA9IDE7Ci0JCXJldHVybiAwOworCQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlID0gSURMRV9IQUxUOwogCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJub213YWl0IikpIHsKIAkJLyoKIAkJICogSWYgdGhlIGJvb3Qgb3B0aW9uIG9mICJpZGxlPW5vbXdhaXQiIGlzIGFkZGVkLApAQCAtNjUzLDEyICs2NDksMTAgQEAKIAkJICogc3RhdGVzLiBJbiBzdWNoIGNhc2UgaXQgd29uJ3QgdG91Y2ggdGhlIHZhcmlhYmxlCiAJCSAqIG9mIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUuCiAJCSAqLwotCQlpZGxlX25vbXdhaXQgPSAxOwotCQlyZXR1cm4gMDsKKwkJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfTk9NV0FJVDsKIAl9IGVsc2UKIAkJcmV0dXJuIC0xOwogCi0JYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgiaWRsZSIsIGlkbGVfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggNGI5YmVmYS4uOGQxMjg3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC01Nyw4ICs1Nyw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KLQogYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOwogCiAvKgpAQCAtMTEzLDggKzExMSw2IEBACiAJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKIAkJCXBtX2lkbGUoKTsKIAkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKLQkJCXRyYWNlX3Bvd2VyX2VuZChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCQkJdHJhY2VfY3B1X2lkbGUoUFdSX0VWRU5UX0VYSVQsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJCX0KIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCA0YzgxOGE3Li5iZDM4N2U4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTUxLDggKzUxLDYgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KIAotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgotCiBhc21saW5rYWdlIGV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CiAKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG9sZF9yc3ApOwpAQCAtMTQxLDEwICsxMzksNiBAQAogCQkJcG1faWRsZSgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCi0JCQl0cmFjZV9wb3dlcl9lbmQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkJCXRyYWNlX2NwdV9pZGxlKFBXUl9FVkVOVF9FWElULAotCQkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCiAJCQkvKiBJbiBtYW55IGNhc2VzIHRoZSBpbnRlcnJ1cHQgdGhhdCBlbmRlZCBpZGxlCiAJCQkgICBoYXMgYWxyZWFkeSBjYWxsZWQgZXhpdF9pZGxlLiBCdXQgc29tZSBpZGxlCiAJCQkgICBsb29wcyBjYW4gYmUgd29rZW4gdXAgd2l0aG91dCBpbnRlcnJ1cHQuICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggYzQ5NWFhOGQuLmZjN2FhZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vcGNpX3g4Ni5oPgogI2luY2x1ZGUgPGFzbS92aXJ0ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogI2lmZGVmIENPTkZJR19YODZfMzIKICMgaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KQEAgLTc0Nyw3ICs3NDgsNyBAQAogewogCWludCBjcHU7CiAKLQlpZiAodmFsICE9IERJRV9OTUlfSVBJKQorCWlmICh2YWwgIT0gRElFX05NSSkKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC03NzgsNiArNzc5LDggQEAKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcmFzaF9ubWlfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBjcmFzaF9ubWlfY2FsbGJhY2ssCisJLyogd2Ugd2FudCB0byBiZSB0aGUgZmlyc3Qgb25lIGNhbGxlZCAqLworCS5wcmlvcml0eSA9IE5NSV9MT0NBTF9ISUdIX1BSSU9SKzEsCiB9OwogCiAvKiBIYWx0IGFsbCBvdGhlciBDUFVzLCBjYWxsaW5nIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb24gZWFjaCBvZiB0aGVtCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKaW5kZXggMWNmYmJmYy4uNmYzOWNhYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3J0Yy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ydGMuYwpAQCAtNzYsNyArNzYsNyBAQAogCQlDTU9TX1dSSVRFKHJlYWxfc2Vjb25kcywgUlRDX1NFQ09ORFMpOwogCQlDTU9TX1dSSVRFKHJlYWxfbWludXRlcywgUlRDX01JTlVURVMpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJcHJpbnRrX29uY2UoS0VSTl9OT1RJQ0UKIAkJICAgICAgICJzZXRfcnRjX21tc3M6IGNhbid0IHVwZGF0ZSBmcm9tICVkIHRvICVkXG4iLAogCQkgICAgICAgY21vc19taW51dGVzLCByZWFsX21pbnV0ZXMpOwogCQlyZXR2YWwgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGM3MTQ5YzkuLjc2M2RmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtOTcsMTIgKzk3LDEyIEBACiAgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoeDg2X2NwdV9ob3RwbHVnX2RyaXZlcl9tdXRleCk7CiAKLXZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX2xvY2soKQordm9pZCBjcHVfaG90cGx1Z19kcml2ZXJfbG9jayh2b2lkKQogewogICAgICAgICBtdXRleF9sb2NrKCZ4ODZfY3B1X2hvdHBsdWdfZHJpdmVyX211dGV4KTsKIH0KIAotdm9pZCBjcHVfaG90cGx1Z19kcml2ZXJfdW5sb2NrKCkKK3ZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX3VubG9jayh2b2lkKQogewogICAgICAgICBtdXRleF91bmxvY2soJng4Nl9jcHVfaG90cGx1Z19kcml2ZXJfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Rib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYwppbmRleCBjMmYxYjI2Li45OThlOTcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJcG1kID0gcG1kX2FsbG9jKCZ0Ym9vdF9tbSwgcHVkLCB2YWRkcik7CiAJaWYgKCFwbWQpCiAJCXJldHVybiAtMTsKLQlwdGUgPSBwdGVfYWxsb2NfbWFwKCZ0Ym9vdF9tbSwgcG1kLCB2YWRkcik7CisJcHRlID0gcHRlX2FsbG9jX21hcCgmdGJvb3RfbW0sIE5VTEwsIHBtZCwgdmFkZHIpOwogCWlmICghcHRlKQogCQlyZXR1cm4gLTE7CiAJc2V0X3B0ZV9hdCgmdGJvb3RfbW0sIHZhZGRyLCBwdGUsIHBmbl9wdGUocGZuLCBwcm90KSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCmluZGV4IGM3NmFhY2EuLmI5YjY3MTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCkBAIC04NCw2ICs4NCwxMSBAQAogc3RhdGljIGludCBpZ25vcmVfbm1pczsKIAogaW50IHVua25vd25fbm1pX3BhbmljOworLyoKKyAqIFByZXZlbnQgTk1JIHJlYXNvbiBwb3J0ICgweDYxKSBiZWluZyBhY2Nlc3NlZCBzaW11bHRhbmVvdXNseSwgY2FuCisgKiBvbmx5IGJlIHVzZWQgaW4gTk1JIGhhbmRsZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKG5taV9yZWFzb25fbG9jayk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb25kaXRpb25hbF9zdGkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0zMTAsMTUgKzMxNSwxNSBAQAogX19zZXR1cCgidW5rbm93bl9ubWlfcGFuaWMiLCBzZXR1cF91bmtub3duX25taV9wYW5pYyk7CiAKIHN0YXRpYyBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCi1tZW1fcGFyaXR5X2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3BjaV9zZXJyX2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlwcmludGsoS0VSTl9FTUVSRwotCQkiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAotCQkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByX2VtZXJnKCJOTUk6IFBDSSBzeXN0ZW0gZXJyb3IgKFNFUlIpIGZvciByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAorCQkgcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcKLQkJIllvdSBoYXZlIHNvbWUgaGFyZHdhcmUgcHJvYmxlbSwgbGlrZWx5IG9uIHRoZSBQQ0kgYnVzLlxuIik7Ci0KKwkvKgorCSAqIE9uIHNvbWUgbWFjaGluZXMsIFBDSSBTRVJSIGxpbmUgaXMgdXNlZCB0byByZXBvcnQgbWVtb3J5CisJICogZXJyb3JzLiBFREFDIG1ha2VzIHVzZSBvZiBpdC4KKwkgKi8KICNpZiBkZWZpbmVkKENPTkZJR19FREFDKQogCWlmIChlZGFjX2hhbmRsZXJfc2V0KCkpIHsKIAkJZWRhY19hdG9taWNfYXNzZXJ0X2Vycm9yKCk7CkBAIC0zMjksMTEgKzMzNCwxMSBAQAogCWlmIChwYW5pY19vbl91bnJlY292ZXJlZF9ubWkpCiAJCXBhbmljKCJOTUk6IE5vdCBjb250aW51aW5nIik7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKKwlwcl9lbWVyZygiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKIAotCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBtZW1vcnkgcGFyaXR5IGVycm9yIGxpbmUuICovCi0JcmVhc29uID0gKHJlYXNvbiAmIDB4ZikgfCA0OwotCW91dGIocmVhc29uLCAweDYxKTsKKwkvKiBDbGVhciBhbmQgZGlzYWJsZSB0aGUgUENJIFNFUlIgZXJyb3IgbGluZS4gKi8KKwlyZWFzb24gPSAocmVhc29uICYgTk1JX1JFQVNPTl9DTEVBUl9NQVNLKSB8IE5NSV9SRUFTT05fQ0xFQVJfU0VSUjsKKwlvdXRiKHJlYXNvbiwgTk1JX1JFQVNPTl9QT1JUKTsKIH0KIAogc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKQEAgLTM0MSwxNSArMzQ2LDE3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIk5NSTogSU9DSyBlcnJvciAoZGVidWcgaW50ZXJydXB0PylcbiIpOworCXByX2VtZXJnKAorCSJOTUk6IElPQ0sgZXJyb3IgKGRlYnVnIGludGVycnVwdD8pIGZvciByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAorCQkgcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwogCiAJaWYgKHBhbmljX29uX2lvX25taSkKIAkJcGFuaWMoIk5NSSBJT0NLIGVycm9yOiBOb3QgY29udGludWluZyIpOwogCiAJLyogUmUtZW5hYmxlIHRoZSBJT0NLIGxpbmUsIHdhaXQgZm9yIGEgZmV3IHNlY29uZHMgKi8KLQlyZWFzb24gPSAocmVhc29uICYgMHhmKSB8IDg7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOworCXJlYXNvbiA9IChyZWFzb24gJiBOTUlfUkVBU09OX0NMRUFSX01BU0spIHwgTk1JX1JFQVNPTl9DTEVBUl9JT0NISzsKKwlvdXRiKHJlYXNvbiwgTk1JX1JFQVNPTl9QT1JUKTsKIAogCWkgPSAyMDAwMDsKIAl3aGlsZSAoLS1pKSB7CkBAIC0zNTcsOCArMzY0LDggQEAKIAkJdWRlbGF5KDEwMCk7CiAJfQogCi0JcmVhc29uICY9IH44OwotCW91dGIocmVhc29uLCAweDYxKTsKKwlyZWFzb24gJj0gfk5NSV9SRUFTT05fQ0xFQVJfSU9DSEs7CisJb3V0YihyZWFzb24sIE5NSV9SRUFTT05fUE9SVCk7CiB9CiAKIHN0YXRpYyBub3RyYWNlIF9fa3Byb2JlcyB2b2lkCkBAIC0zNzcsNTcgKzM4NCw1MCBAQAogCQlyZXR1cm47CiAJfQogI2VuZGlmCi0JcHJpbnRrKEtFUk5fRU1FUkcKLQkJIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gQ1BVICVkLlxuIiwKLQkJCXJlYXNvbiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcl9lbWVyZygiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAorCQkgcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7CisJcHJfZW1lcmcoIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7CiAJaWYgKHVua25vd25fbm1pX3BhbmljIHx8IHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKIAkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOworCXByX2VtZXJnKCJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwogfQogCiBzdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBjaGFyIHJlYXNvbiA9IDA7Ci0JaW50IGNwdTsKIAotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkvKgorCSAqIENQVS1zcGVjaWZpYyBOTUkgbXVzdCBiZSBwcm9jZXNzZWQgYmVmb3JlIG5vbi1DUFUtc3BlY2lmaWMKKwkgKiBOTUksIG90aGVyd2lzZSB3ZSBtYXkgbG9zZSBpdCwgYmVjYXVzZSB0aGUgQ1BVLXNwZWNpZmljCisJICogTk1JIGNhbiBub3QgYmUgZGV0ZWN0ZWQvcHJvY2Vzc2VkIG9uIG90aGVyIENQVXMuCisJICovCisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIDAsIDIsIFNJR0lOVCkgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybjsKIAotCS8qIE9ubHkgdGhlIEJTUCBnZXRzIGV4dGVybmFsIE5NSXMgZnJvbSB0aGUgc3lzdGVtLiAqLwotCWlmICghY3B1KQotCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOworCS8qIE5vbi1DUFUtc3BlY2lmaWMgTk1JOiBOTUkgc291cmNlcyBjYW4gYmUgcHJvY2Vzc2VkIG9uIGFueSBDUFUgKi8KKwlyYXdfc3Bpbl9sb2NrKCZubWlfcmVhc29uX2xvY2spOworCXJlYXNvbiA9IGdldF9ubWlfcmVhc29uKCk7CiAKLQlpZiAoIShyZWFzb24gJiAweGMwKSkgewotCQlpZiAobm90aWZ5X2RpZShESUVfTk1JX0lQSSwgIm5taV9pcGkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkKLQkJCQkJCQkJPT0gTk9USUZZX1NUT1ApCi0JCQlyZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQkJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQotCQkJCQkJCT09IE5PVElGWV9TVE9QKQotCQkJcmV0dXJuOworCWlmIChyZWFzb24gJiBOTUlfUkVBU09OX01BU0spIHsKKwkJaWYgKHJlYXNvbiAmIE5NSV9SRUFTT05fU0VSUikKKwkJCXBjaV9zZXJyX2Vycm9yKHJlYXNvbiwgcmVncyk7CisJCWVsc2UgaWYgKHJlYXNvbiAmIE5NSV9SRUFTT05fSU9DSEspCisJCQlpb19jaGVja19lcnJvcihyZWFzb24sIHJlZ3MpOworI2lmZGVmIENPTkZJR19YODZfMzIKKwkJLyoKKwkJICogUmVhc3NlcnQgTk1JIGluIGNhc2UgaXQgYmVjYW1lIGFjdGl2ZQorCQkgKiBtZWFud2hpbGUgYXMgaXQncyBlZGdlLXRyaWdnZXJlZDoKKwkJICovCisJCXJlYXNzZXJ0X25taSgpOwogI2VuZGlmCi0JCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7Ci0KKwkJcmF3X3NwaW5fdW5sb2NrKCZubWlfcmVhc29uX2xvY2spOwogCQlyZXR1cm47CiAJfQotCWlmIChub3RpZnlfZGllKERJRV9OTUksICJubWkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkgPT0gTk9USUZZX1NUT1ApCi0JCXJldHVybjsKKwlyYXdfc3Bpbl91bmxvY2soJm5taV9yZWFzb25fbG9jayk7CiAKLQkvKiBBSzogZm9sbG93aW5nIGNoZWNrcyBzZWVtIHRvIGJlIGJyb2tlbiBvbiBtb2Rlcm4gY2hpcHNldHMuIEZJWE1FICovCi0JaWYgKHJlYXNvbiAmIDB4ODApCi0JCW1lbV9wYXJpdHlfZXJyb3IocmVhc29uLCByZWdzKTsKLQlpZiAocmVhc29uICYgMHg0MCkKLQkJaW9fY2hlY2tfZXJyb3IocmVhc29uLCByZWdzKTsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JLyoKLQkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlIG1lYW53aGlsZQotCSAqIGFzIGl0J3MgZWRnZS10cmlnZ2VyZWQ6Ci0JICovCi0JcmVhc3NlcnRfbm1pKCk7Ci0jZW5kaWYKKwl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOwogfQogCiBkb3RyYXBsaW5rYWdlIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCAwM2QyZWE4Li44MjNmNzlhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC05NjUsNyArOTY1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF90c2NfY2xvY2tzb3VyY2Uodm9pZCkKIHsKLQlpZiAoIWNwdV9oYXNfdHNjIHx8IHRzY19kaXNhYmxlZCA+IDApCisJaWYgKCFjcHVfaGFzX3RzYyB8fCB0c2NfZGlzYWJsZWQgPiAwIHx8ICF0c2Nfa2h6KQogCQlyZXR1cm4gMDsKIAogCWlmICh0c2NfY2xvY2tzb3VyY2VfcmVsaWFibGUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jIGIvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYwppbmRleCA2MWZiOTg1Li44NjNmODc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMKQEAgLTE3OSw2ICsxNzksNyBAQAogCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKIAkJZ290byBvdXQ7CiAJcG1kID0gcG1kX29mZnNldChwdWQsIDB4QTAwMDApOworCXNwbGl0X2h1Z2VfcGFnZV9wbWQobW0sIHBtZCk7CiAJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQogCQlnb3RvIG91dDsKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIDB4QTAwMDAsICZwdGwpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL0tjb25maWcgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwppbmRleCBkZGMxMzFmLi41MGY2MzY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vS2NvbmZpZworKysgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwpAQCAtMjgsNiArMjgsNyBAQAogCXNlbGVjdCBIQVZFX0tWTV9JUlFDSElQCiAJc2VsZWN0IEhBVkVfS1ZNX0VWRU5URkQKIAlzZWxlY3QgS1ZNX0FQSUNfQVJDSElURUNUVVJFCisJc2VsZWN0IEtWTV9BU1lOQ19QRgogCXNlbGVjdCBVU0VSX1JFVFVSTl9OT1RJRklFUgogCXNlbGVjdCBLVk1fTU1JTwogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZSBiL2FyY2gveDg2L2t2bS9NYWtlZmlsZQppbmRleCAzMWE3MDM1Li5mMTU1MDFmNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAKLUVYVFJBX0NGTEFHUyArPSAtSXZpcnQva3ZtIC1JYXJjaC94ODYva3ZtCitjY2ZsYWdzLXkgKz0gLUl2aXJ0L2t2bSAtSWFyY2gveDg2L2t2bQogCiBDRkxBR1NfeDg2Lm8gOj0gLUkuCiBDRkxBR1Nfc3ZtLm8gOj0gLUkuCkBAIC05LDYgKzksNyBAQAogCQkJCWNvYWxlc2NlZF9tbWlvLm8gaXJxX2NvbW0ubyBldmVudGZkLm8gXAogCQkJCWFzc2lnbmVkLWRldi5vKQoga3ZtLSQoQ09ORklHX0lPTU1VX0FQSSkJKz0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCBpb21tdS5vKQora3ZtLSQoQ09ORklHX0tWTV9BU1lOQ19QRikJKz0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCBhc3luY19wZi5vKQogCiBrdm0teQkJCSs9IHg4Ni5vIG1tdS5vIGVtdWxhdGUubyBpODI1OS5vIGlycS5vIGxhcGljLm8gXAogCQkJICAgaTgyNTQubyB0aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jIGIvYXJjaC94ODYva3ZtL2VtdWxhdGUuYwppbmRleCAzOGI2ZThkLi5jYWY5NjY3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCisrKyBiL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKQEAgLTIwLDE2ICsyMCw4IEBACiAgKiBGcm9tOiB4ZW4tdW5zdGFibGUgMTA2NzY6YWY5ODA5ZjUxZjgxYTNjNDNmMjc2ZjAwYzgxYTUyZWY1NThhZmRhNAogICovCiAKLSNpZm5kZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8cHVibGljL3hlbi5oPgotI2RlZmluZSBEUFJJTlRGKF9mLCBfYSAuLi4pIHByaW50ZihfZiAsICMjIF9hKQotI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgImt2bV9jYWNoZV9yZWdzLmgiCi0jZGVmaW5lIERQUklOVEYoeC4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KIApAQCAtNDE4LDkgKzQxMCw5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotcmVnaXN0ZXJfYWRkcmVzcyhzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgcmVnKQorcmVnaXN0ZXJfYWRkcmVzcyhzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjLCB1bnNpZ25lZCBsb25nIHJlZykKIHsKLQlyZXR1cm4gYmFzZSArIGFkZHJlc3NfbWFzayhjLCByZWcpOworCXJldHVybiBhZGRyZXNzX21hc2soYywgcmVnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC00NTIsNjAgKzQ0NCw1NSBAQAogCXJldHVybiBvcHMtPmdldF9jYWNoZWRfc2VnbWVudF9iYXNlKHNlZywgY3R4dC0+dmNwdSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNlZ19vdmVycmlkZV9iYXNlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAotCQkJCSAgICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCi0JCQkJICAgICAgIHN0cnVjdCBkZWNvZGVfY2FjaGUgKmMpCitzdGF0aWMgdW5zaWduZWQgc2VnX292ZXJyaWRlKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAorCQkJICAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMsCisJCQkgICAgIHN0cnVjdCBkZWNvZGVfY2FjaGUgKmMpCiB7CiAJaWYgKCFjLT5oYXNfc2VnX292ZXJyaWRlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBzZWdfYmFzZShjdHh0LCBvcHMsIGMtPnNlZ19vdmVycmlkZSk7CisJcmV0dXJuIGMtPnNlZ19vdmVycmlkZTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZXNfYmFzZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKLQkJCSAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzKQorc3RhdGljIHVsb25nIGxpbmVhcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJICAgIHN0cnVjdCBzZWdtZW50ZWRfYWRkcmVzcyBhZGRyKQogewotCXJldHVybiBzZWdfYmFzZShjdHh0LCBvcHMsIFZDUFVfU1JFR19FUyk7CisJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CisJdWxvbmcgbGE7CisKKwlsYSA9IHNlZ19iYXNlKGN0eHQsIGN0eHQtPm9wcywgYWRkci5zZWcpICsgYWRkci5lYTsKKwlpZiAoYy0+YWRfYnl0ZXMgIT0gOCkKKwkJbGEgJj0gKHUzMiktMTsKKwlyZXR1cm4gbGE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNzX2Jhc2Uoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCi0JCQkgICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKK3N0YXRpYyBpbnQgZW11bGF0ZV9leGNlcHRpb24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCB2ZWMsCisJCQkgICAgIHUzMiBlcnJvciwgYm9vbCB2YWxpZCkKIHsKLQlyZXR1cm4gc2VnX2Jhc2UoY3R4dCwgb3BzLCBWQ1BVX1NSRUdfU1MpOworCWN0eHQtPmV4Y2VwdGlvbi52ZWN0b3IgPSB2ZWM7CisJY3R4dC0+ZXhjZXB0aW9uLmVycm9yX2NvZGUgPSBlcnJvcjsKKwljdHh0LT5leGNlcHRpb24uZXJyb3JfY29kZV92YWxpZCA9IHZhbGlkOworCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIH0KIAotc3RhdGljIHZvaWQgZW11bGF0ZV9leGNlcHRpb24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCB2ZWMsCi0JCQkJICAgICAgdTMyIGVycm9yLCBib29sIHZhbGlkKQorc3RhdGljIGludCBlbXVsYXRlX2dwKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgZXJyKQogewotCWN0eHQtPmV4Y2VwdGlvbiA9IHZlYzsKLQljdHh0LT5lcnJvcl9jb2RlID0gZXJyb3I7Ci0JY3R4dC0+ZXJyb3JfY29kZV92YWxpZCA9IHZhbGlkOworCXJldHVybiBlbXVsYXRlX2V4Y2VwdGlvbihjdHh0LCBHUF9WRUNUT1IsIGVyciwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVtdWxhdGVfZ3Aoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBlcnIpCitzdGF0aWMgaW50IGVtdWxhdGVfdWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgR1BfVkVDVE9SLCBlcnIsIHRydWUpOworCXJldHVybiBlbXVsYXRlX2V4Y2VwdGlvbihjdHh0LCBVRF9WRUNUT1IsIDAsIGZhbHNlKTsKIH0KIAotc3RhdGljIHZvaWQgZW11bGF0ZV9wZihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3N0YXRpYyBpbnQgZW11bGF0ZV90cyhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IGVycikKIHsKLQllbXVsYXRlX2V4Y2VwdGlvbihjdHh0LCBQRl9WRUNUT1IsIDAsIHRydWUpOwotfQotCi1zdGF0aWMgdm9pZCBlbXVsYXRlX3VkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQotewotCWVtdWxhdGVfZXhjZXB0aW9uKGN0eHQsIFVEX1ZFQ1RPUiwgMCwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBlbXVsYXRlX3RzKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgZXJyKQotewotCWVtdWxhdGVfZXhjZXB0aW9uKGN0eHQsIFRTX1ZFQ1RPUiwgZXJyLCB0cnVlKTsKKwlyZXR1cm4gZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgVFNfVkVDVE9SLCBlcnIsIHRydWUpOwogfQogCiBzdGF0aWMgaW50IGVtdWxhdGVfZGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JZW11bGF0ZV9leGNlcHRpb24oY3R4dCwgREVfVkVDVE9SLCAwLCBmYWxzZSk7Ci0JcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOworCXJldHVybiBlbXVsYXRlX2V4Y2VwdGlvbihjdHh0LCBERV9WRUNUT1IsIDAsIGZhbHNlKTsKIH0KIAogc3RhdGljIGludCBkb19mZXRjaF9pbnNuX2J5dGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCkBAIC01MjAsNyArNTA3LDcgQEAKIAkJY3VyX3NpemUgPSBmYy0+ZW5kIC0gZmMtPnN0YXJ0OwogCQlzaXplID0gbWluKDE1VUwgLSBjdXJfc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UoZWlwKSk7CiAJCXJjID0gb3BzLT5mZXRjaChjdHh0LT5jc19iYXNlICsgZWlwLCBmYy0+ZGF0YSArIGN1cl9zaXplLAotCQkJCXNpemUsIGN0eHQtPnZjcHUsIE5VTEwpOworCQkJCXNpemUsIGN0eHQtPnZjcHUsICZjdHh0LT5leGNlcHRpb24pOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJZmMtPmVuZCArPSBzaXplOwpAQCAtNTY0LDcgKzU1MSw3IEBACiAKIHN0YXRpYyBpbnQgcmVhZF9kZXNjcmlwdG9yKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCQkJICAgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyAqb3BzLAotCQkJICAgdWxvbmcgYWRkciwKKwkJCSAgIHN0cnVjdCBzZWdtZW50ZWRfYWRkcmVzcyBhZGRyLAogCQkJICAgdTE2ICpzaXplLCB1bnNpZ25lZCBsb25nICphZGRyZXNzLCBpbnQgb3BfYnl0ZXMpCiB7CiAJaW50IHJjOwpAQCAtNTcyLDEwICs1NTksMTMgQEAKIAlpZiAob3BfYnl0ZXMgPT0gMikKIAkJb3BfYnl0ZXMgPSAzOwogCSphZGRyZXNzID0gMDsKLQlyYyA9IG9wcy0+cmVhZF9zdGQoYWRkciwgKHVuc2lnbmVkIGxvbmcgKilzaXplLCAyLCBjdHh0LT52Y3B1LCBOVUxMKTsKKwlyYyA9IG9wcy0+cmVhZF9zdGQobGluZWFyKGN0eHQsIGFkZHIpLCAodW5zaWduZWQgbG9uZyAqKXNpemUsIDIsCisJCQkgICBjdHh0LT52Y3B1LCAmY3R4dC0+ZXhjZXB0aW9uKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwotCXJjID0gb3BzLT5yZWFkX3N0ZChhZGRyICsgMiwgYWRkcmVzcywgb3BfYnl0ZXMsIGN0eHQtPnZjcHUsIE5VTEwpOworCWFkZHIuZWEgKz0gMjsKKwlyYyA9IG9wcy0+cmVhZF9zdGQobGluZWFyKGN0eHQsIGFkZHIpLCBhZGRyZXNzLCBvcF9ieXRlcywKKwkJCSAgIGN0eHQtPnZjcHUsICZjdHh0LT5leGNlcHRpb24pOwogCXJldHVybiByYzsKIH0KIApAQCAtNzY4LDcgKzc1OCw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlvcC0+YWRkci5tZW0gPSBtb2RybV9lYTsKKwlvcC0+YWRkci5tZW0uZWEgPSBtb2RybV9lYTsKIGRvbmU6CiAJcmV0dXJuIHJjOwogfQpAQCAtNzgzLDEzICs3NzMsMTMgQEAKIAlvcC0+dHlwZSA9IE9QX01FTTsKIAlzd2l0Y2ggKGMtPmFkX2J5dGVzKSB7CiAJY2FzZSAyOgotCQlvcC0+YWRkci5tZW0gPSBpbnNuX2ZldGNoKHUxNiwgMiwgYy0+ZWlwKTsKKwkJb3AtPmFkZHIubWVtLmVhID0gaW5zbl9mZXRjaCh1MTYsIDIsIGMtPmVpcCk7CiAJCWJyZWFrOwogCWNhc2UgNDoKLQkJb3AtPmFkZHIubWVtID0gaW5zbl9mZXRjaCh1MzIsIDQsIGMtPmVpcCk7CisJCW9wLT5hZGRyLm1lbS5lYSA9IGluc25fZmV0Y2godTMyLCA0LCBjLT5laXApOwogCQlicmVhazsKIAljYXNlIDg6Ci0JCW9wLT5hZGRyLm1lbSA9IGluc25fZmV0Y2godTY0LCA4LCBjLT5laXApOworCQlvcC0+YWRkci5tZW0uZWEgPSBpbnNuX2ZldGNoKHU2NCwgOCwgYy0+ZWlwKTsKIAkJYnJlYWs7CiAJfQogZG9uZToKQEAgLTgwOCw3ICs3OTgsNyBAQAogCQllbHNlIGlmIChjLT5zcmMuYnl0ZXMgPT0gNCkKIAkJCXN2ID0gKHMzMiljLT5zcmMudmFsICYgKHMzMiltYXNrOwogCi0JCWMtPmRzdC5hZGRyLm1lbSArPSAoc3YgPj4gMyk7CisJCWMtPmRzdC5hZGRyLm1lbS5lYSArPSAoc3YgPj4gMyk7CiAJfQogCiAJLyogb25seSBzdWJ3b3JkIG9mZnNldCAqLwpAQCAtODIxLDcgKzgxMSw2IEBACiB7CiAJaW50IHJjOwogCXN0cnVjdCByZWFkX2NhY2hlICptYyA9ICZjdHh0LT5kZWNvZGUubWVtX3JlYWQ7Ci0JdTMyIGVycjsKIAogCXdoaWxlIChzaXplKSB7CiAJCWludCBuID0gbWluKHNpemUsIDh1KTsKQEAgLTgyOSwxMCArODE4LDggQEAKIAkJaWYgKG1jLT5wb3MgPCBtYy0+ZW5kKQogCQkJZ290byByZWFkX2NhY2hlZDsKIAotCQlyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZChhZGRyLCBtYy0+ZGF0YSArIG1jLT5lbmQsIG4sICZlcnIsCi0JCQkJCWN0eHQtPnZjcHUpOwotCQlpZiAocmMgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpCi0JCQllbXVsYXRlX3BmKGN0eHQpOworCQlyYyA9IG9wcy0+cmVhZF9lbXVsYXRlZChhZGRyLCBtYy0+ZGF0YSArIG1jLT5lbmQsIG4sCisJCQkJCSZjdHh0LT5leGNlcHRpb24sIGN0eHQtPnZjcHUpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCXJldHVybiByYzsKIAkJbWMtPmVuZCArPSBuOwpAQCAtOTA3LDE5ICs4OTQsMTUgQEAKIAlzdHJ1Y3QgZGVzY19wdHIgZHQ7CiAJdTE2IGluZGV4ID0gc2VsZWN0b3IgPj4gMzsKIAlpbnQgcmV0OwotCXUzMiBlcnI7CiAJdWxvbmcgYWRkcjsKIAogCWdldF9kZXNjcmlwdG9yX3RhYmxlX3B0cihjdHh0LCBvcHMsIHNlbGVjdG9yLCAmZHQpOwogCi0JaWYgKGR0LnNpemUgPCBpbmRleCAqIDggKyA3KSB7Ci0JCWVtdWxhdGVfZ3AoY3R4dCwgc2VsZWN0b3IgJiAweGZmZmMpOwotCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0JfQorCWlmIChkdC5zaXplIDwgaW5kZXggKiA4ICsgNykKKwkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgc2VsZWN0b3IgJiAweGZmZmMpOwogCWFkZHIgPSBkdC5hZGRyZXNzICsgaW5kZXggKiA4OwotCXJldCA9IG9wcy0+cmVhZF9zdGQoYWRkciwgZGVzYywgc2l6ZW9mICpkZXNjLCBjdHh0LT52Y3B1LCAgJmVycik7Ci0JaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkKLQkJZW11bGF0ZV9wZihjdHh0KTsKKwlyZXQgPSBvcHMtPnJlYWRfc3RkKGFkZHIsIGRlc2MsIHNpemVvZiAqZGVzYywgY3R4dC0+dmNwdSwKKwkJCSAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKIAogICAgICAgIHJldHVybiByZXQ7CiB9CkBAIC05MzEsMjEgKzkxNCwxNyBAQAogewogCXN0cnVjdCBkZXNjX3B0ciBkdDsKIAl1MTYgaW5kZXggPSBzZWxlY3RvciA+PiAzOwotCXUzMiBlcnI7CiAJdWxvbmcgYWRkcjsKIAlpbnQgcmV0OwogCiAJZ2V0X2Rlc2NyaXB0b3JfdGFibGVfcHRyKGN0eHQsIG9wcywgc2VsZWN0b3IsICZkdCk7CiAKLQlpZiAoZHQuc2l6ZSA8IGluZGV4ICogOCArIDcpIHsKLQkJZW11bGF0ZV9ncChjdHh0LCBzZWxlY3RvciAmIDB4ZmZmYyk7Ci0JCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQl9CisJaWYgKGR0LnNpemUgPCBpbmRleCAqIDggKyA3KQorCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCBzZWxlY3RvciAmIDB4ZmZmYyk7CiAKIAlhZGRyID0gZHQuYWRkcmVzcyArIGluZGV4ICogODsKLQlyZXQgPSBvcHMtPndyaXRlX3N0ZChhZGRyLCBkZXNjLCBzaXplb2YgKmRlc2MsIGN0eHQtPnZjcHUsICZlcnIpOwotCWlmIChyZXQgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpCi0JCWVtdWxhdGVfcGYoY3R4dCk7CisJcmV0ID0gb3BzLT53cml0ZV9zdGQoYWRkciwgZGVzYywgc2l6ZW9mICpkZXNjLCBjdHh0LT52Y3B1LAorCQkJICAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDkyLDcgKzEwNzEsNiBAQAogewogCWludCByYzsKIAlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKLQl1MzIgZXJyOwogCiAJc3dpdGNoIChjLT5kc3QudHlwZSkgewogCWNhc2UgT1BfUkVHOgpAQCAtMTEwMSwyMSArMTA3OSwxOSBAQAogCWNhc2UgT1BfTUVNOgogCQlpZiAoYy0+bG9ja19wcmVmaXgpCiAJCQlyYyA9IG9wcy0+Y21weGNoZ19lbXVsYXRlZCgKLQkJCQkJYy0+ZHN0LmFkZHIubWVtLAorCQkJCQlsaW5lYXIoY3R4dCwgYy0+ZHN0LmFkZHIubWVtKSwKIAkJCQkJJmMtPmRzdC5vcmlnX3ZhbCwKIAkJCQkJJmMtPmRzdC52YWwsCiAJCQkJCWMtPmRzdC5ieXRlcywKLQkJCQkJJmVyciwKKwkJCQkJJmN0eHQtPmV4Y2VwdGlvbiwKIAkJCQkJY3R4dC0+dmNwdSk7CiAJCWVsc2UKIAkJCXJjID0gb3BzLT53cml0ZV9lbXVsYXRlZCgKLQkJCQkJYy0+ZHN0LmFkZHIubWVtLAorCQkJCQlsaW5lYXIoY3R4dCwgYy0+ZHN0LmFkZHIubWVtKSwKIAkJCQkJJmMtPmRzdC52YWwsCiAJCQkJCWMtPmRzdC5ieXRlcywKLQkJCQkJJmVyciwKKwkJCQkJJmN0eHQtPmV4Y2VwdGlvbiwKIAkJCQkJY3R4dC0+dmNwdSk7Ci0JCWlmIChyYyA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkKLQkJCWVtdWxhdGVfcGYoY3R4dCk7CiAJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkJcmV0dXJuIHJjOwogCQlicmVhazsKQEAgLTExMzcsOCArMTExMyw4IEBACiAJYy0+ZHN0LmJ5dGVzID0gYy0+b3BfYnl0ZXM7CiAJYy0+ZHN0LnZhbCA9IGMtPnNyYy52YWw7CiAJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoYywgJmMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0sIC1jLT5vcF9ieXRlcyk7Ci0JYy0+ZHN0LmFkZHIubWVtID0gcmVnaXN0ZXJfYWRkcmVzcyhjLCBzc19iYXNlKGN0eHQsIG9wcyksCi0JCQkJCSAgIGMtPnJlZ3NbVkNQVV9SRUdTX1JTUF0pOworCWMtPmRzdC5hZGRyLm1lbS5lYSA9IHJlZ2lzdGVyX2FkZHJlc3MoYywgYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSk7CisJYy0+ZHN0LmFkZHIubWVtLnNlZyA9IFZDUFVfU1JFR19TUzsKIH0KIAogc3RhdGljIGludCBlbXVsYXRlX3BvcChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKQEAgLTExNDcsMTAgKzExMjMsMTEgQEAKIHsKIAlzdHJ1Y3QgZGVjb2RlX2NhY2hlICpjID0gJmN0eHQtPmRlY29kZTsKIAlpbnQgcmM7CisJc3RydWN0IHNlZ21lbnRlZF9hZGRyZXNzIGFkZHI7CiAKLQlyYyA9IHJlYWRfZW11bGF0ZWQoY3R4dCwgb3BzLCByZWdpc3Rlcl9hZGRyZXNzKGMsIHNzX2Jhc2UoY3R4dCwgb3BzKSwKLQkJCQkJCSAgICAgICBjLT5yZWdzW1ZDUFVfUkVHU19SU1BdKSwKLQkJCSAgIGRlc3QsIGxlbik7CisJYWRkci5lYSA9IHJlZ2lzdGVyX2FkZHJlc3MoYywgYy0+cmVnc1tWQ1BVX1JFR1NfUlNQXSk7CisJYWRkci5zZWcgPSBWQ1BVX1NSRUdfU1M7CisJcmMgPSByZWFkX2VtdWxhdGVkKGN0eHQsIG9wcywgbGluZWFyKGN0eHQsIGFkZHIpLCBkZXN0LCBsZW4pOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKQEAgLTExODQsMTAgKzExNjEsOCBAQAogCQkJY2hhbmdlX21hc2sgfD0gRUZMR19JRjsKIAkJYnJlYWs7CiAJY2FzZSBYODZFTVVMX01PREVfVk04NjoKLQkJaWYgKGlvcGwgPCAzKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOwotCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCQl9CisJCWlmIChpb3BsIDwgMykKKwkJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQljaGFuZ2VfbWFzayB8PSBFRkxHX0lGOwogCQlicmVhazsKIAlkZWZhdWx0OiAvKiByZWFsIG1vZGUgKi8KQEAgLTExOTgsOSArMTE3Myw2IEBACiAJKih1bnNpZ25lZCBsb25nICopZGVzdCA9CiAJCShjdHh0LT5lZmxhZ3MgJiB+Y2hhbmdlX21hc2spIHwgKHZhbCAmIGNoYW5nZV9tYXNrKTsKIAotCWlmIChyYyA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkKLQkJZW11bGF0ZV9wZihjdHh0KTsKLQogCXJldHVybiByYzsKIH0KIApAQCAtMTI4Nyw3ICsxMjU5LDYgQEAKIAlndmFfdCBjc19hZGRyOwogCWd2YV90IGVpcF9hZGRyOwogCXUxNiBjcywgZWlwOwotCXUzMiBlcnI7CiAKIAkvKiBUT0RPOiBBZGQgbGltaXQgY2hlY2tzICovCiAJYy0+c3JjLnZhbCA9IGN0eHQtPmVmbGFnczsKQEAgLTEzMTcsMTEgKzEyODgsMTEgQEAKIAllaXBfYWRkciA9IGR0LmFkZHJlc3MgKyAoaXJxIDw8IDIpOwogCWNzX2FkZHIgPSBkdC5hZGRyZXNzICsgKGlycSA8PCAyKSArIDI7CiAKLQlyYyA9IG9wcy0+cmVhZF9zdGQoY3NfYWRkciwgJmNzLCAyLCBjdHh0LT52Y3B1LCAmZXJyKTsKKwlyYyA9IG9wcy0+cmVhZF9zdGQoY3NfYWRkciwgJmNzLCAyLCBjdHh0LT52Y3B1LCAmY3R4dC0+ZXhjZXB0aW9uKTsKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBvcHMtPnJlYWRfc3RkKGVpcF9hZGRyLCAmZWlwLCAyLCBjdHh0LT52Y3B1LCAmZXJyKTsKKwlyYyA9IG9wcy0+cmVhZF9zdGQoZWlwX2FkZHIsICZlaXAsIDIsIGN0eHQtPnZjcHUsICZjdHh0LT5leGNlcHRpb24pOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKQEAgLTEzNzAsMTAgKzEzNDEsOCBAQAogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAodGVtcF9laXAgJiB+MHhmZmZmKSB7Ci0JCWVtdWxhdGVfZ3AoY3R4dCwgMCk7Ci0JCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQl9CisJaWYgKHRlbXBfZWlwICYgfjB4ZmZmZikKKwkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAKIAlyYyA9IGVtdWxhdGVfcG9wKGN0eHQsIG9wcywgJmNzLCBjLT5vcF9ieXRlcyk7CiAKQEAgLTE2MjQsMTAgKzE1OTMsOCBAQAogCiAJLyogc3lzY2FsbCBpcyBub3QgYXZhaWxhYmxlIGluIHJlYWwgbW9kZSAqLwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9SRUFMIHx8Ci0JICAgIGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1ZNODYpIHsKLQkJZW11bGF0ZV91ZChjdHh0KTsKLQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCX0KKwkgICAgY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfVk04NikKKwkJcmV0dXJuIGVtdWxhdGVfdWQoY3R4dCk7CiAKIAlzZXR1cF9zeXNjYWxsc19zZWdtZW50cyhjdHh0LCBvcHMsICZjcywgJnNzKTsKIApAQCAtMTY3OCwzNCArMTY0NSwyNiBAQAogCXUxNiBjc19zZWwsIHNzX3NlbDsKIAogCS8qIGluamVjdCAjR1AgaWYgaW4gcmVhbCBtb2RlICovCi0JaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1JFQUwpIHsKLQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKLQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCX0KKwlpZiAoY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfUkVBTCkKKwkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAKIAkvKiBYWFggc3lzZW50ZXIvc3lzZXhpdCBoYXZlIG5vdCBiZWVuIHRlc3RlZCBpbiA2NGJpdCBtb2RlLgogCSogVGhlcmVmb3JlLCB3ZSBpbmplY3QgYW4gI1VELgogCSovCi0JaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCkgewotCQllbXVsYXRlX3VkKGN0eHQpOwotCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0JfQorCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9QUk9UNjQpCisJCXJldHVybiBlbXVsYXRlX3VkKGN0eHQpOwogCiAJc2V0dXBfc3lzY2FsbHNfc2VnbWVudHMoY3R4dCwgb3BzLCAmY3MsICZzcyk7CiAKIAlvcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfU1lTRU5URVJfQ1MsICZtc3JfZGF0YSk7CiAJc3dpdGNoIChjdHh0LT5tb2RlKSB7CiAJY2FzZSBYODZFTVVMX01PREVfUFJPVDMyOgotCQlpZiAoKG1zcl9kYXRhICYgMHhmZmZjKSA9PSAweDApIHsKLQkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7Ci0JCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0JCX0KKwkJaWYgKChtc3JfZGF0YSAmIDB4ZmZmYykgPT0gMHgwKQorCQkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1Q2NDoKLQkJaWYgKG1zcl9kYXRhID09IDB4MCkgewotCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKLQkJCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQkJfQorCQlpZiAobXNyX2RhdGEgPT0gMHgwKQorCQkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTc0NSwxMCArMTcwNCw4IEBACiAKIAkvKiBpbmplY3QgI0dQIGlmIGluIHJlYWwgbW9kZSBvciBWaXJ0dWFsIDgwODYgbW9kZSAqLwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9SRUFMIHx8Ci0JICAgIGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1ZNODYpIHsKLQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKLQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCX0KKwkgICAgY3R4dC0+bW9kZSA9PSBYODZFTVVMX01PREVfVk04NikKKwkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAKIAlzZXR1cF9zeXNjYWxsc19zZWdtZW50cyhjdHh0LCBvcHMsICZjcywgJnNzKTsKIApAQCAtMTc2MywxOCArMTcyMCwxNCBAQAogCXN3aXRjaCAodXNlcm1vZGUpIHsKIAljYXNlIFg4NkVNVUxfTU9ERV9QUk9UMzI6CiAJCWNzX3NlbCA9ICh1MTYpKG1zcl9kYXRhICsgMTYpOwotCQlpZiAoKG1zcl9kYXRhICYgMHhmZmZjKSA9PSAweDApIHsKLQkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7Ci0JCQlyZXR1cm4gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7Ci0JCX0KKwkJaWYgKChtc3JfZGF0YSAmIDB4ZmZmYykgPT0gMHgwKQorCQkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCXNzX3NlbCA9ICh1MTYpKG1zcl9kYXRhICsgMjQpOwogCQlicmVhazsKIAljYXNlIFg4NkVNVUxfTU9ERV9QUk9UNjQ6CiAJCWNzX3NlbCA9ICh1MTYpKG1zcl9kYXRhICsgMzIpOwotCQlpZiAobXNyX2RhdGEgPT0gMHgwKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOwotCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCQl9CisJCWlmIChtc3JfZGF0YSA9PSAweDApCisJCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKIAkJc3Nfc2VsID0gY3Nfc2VsICsgODsKIAkJY3MuZCA9IDA7CiAJCWNzLmwgPSAxOwpAQCAtMTkzNCwzMyArMTg4NywyNyBAQAogewogCXN0cnVjdCB0c3Nfc2VnbWVudF8xNiB0c3Nfc2VnOwogCWludCByZXQ7Ci0JdTMyIGVyciwgbmV3X3Rzc19iYXNlID0gZ2V0X2Rlc2NfYmFzZShuZXdfZGVzYyk7CisJdTMyIG5ld190c3NfYmFzZSA9IGdldF9kZXNjX2Jhc2UobmV3X2Rlc2MpOwogCiAJcmV0ID0gb3BzLT5yZWFkX3N0ZChvbGRfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAmZXJyKTsKLQlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CisJCQkgICAgJmN0eHQtPmV4Y2VwdGlvbik7CisJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQllbXVsYXRlX3BmKGN0eHQpOwogCQlyZXR1cm4gcmV0OwotCX0KIAogCXNhdmVfc3RhdGVfdG9fdHNzMTYoY3R4dCwgb3BzLCAmdHNzX3NlZyk7CiAKIAlyZXQgPSBvcHMtPndyaXRlX3N0ZChvbGRfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAgJmVycik7Ci0JaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgeworCQkJICAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKKwlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCS8qIEZJWE1FOiBuZWVkIHRvIHByb3ZpZGUgcHJlY2lzZSBmYXVsdCBhZGRyZXNzICovCi0JCWVtdWxhdGVfcGYoY3R4dCk7CiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcmV0ID0gb3BzLT5yZWFkX3N0ZChuZXdfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAmZXJyKTsKLQlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CisJCQkgICAgJmN0eHQtPmV4Y2VwdGlvbik7CisJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQllbXVsYXRlX3BmKGN0eHQpOwogCQlyZXR1cm4gcmV0OwotCX0KIAogCWlmIChvbGRfdHNzX3NlbCAhPSAweGZmZmYpIHsKIAkJdHNzX3NlZy5wcmV2X3Rhc2tfbGluayA9IG9sZF90c3Nfc2VsOwpAQCAtMTk2OCwxMiArMTkxNSwxMCBAQAogCQlyZXQgPSBvcHMtPndyaXRlX3N0ZChuZXdfdHNzX2Jhc2UsCiAJCQkJICAgICAmdHNzX3NlZy5wcmV2X3Rhc2tfbGluaywKIAkJCQkgICAgIHNpemVvZiB0c3Nfc2VnLnByZXZfdGFza19saW5rLAotCQkJCSAgICAgY3R4dC0+dmNwdSwgJmVycik7Ci0JCWlmIChyZXQgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpIHsKKwkJCQkgICAgIGN0eHQtPnZjcHUsICZjdHh0LT5leGNlcHRpb24pOworCQlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQkJZW11bGF0ZV9wZihjdHh0KTsKIAkJCXJldHVybiByZXQ7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gbG9hZF9zdGF0ZV9mcm9tX3RzczE2KGN0eHQsIG9wcywgJnRzc19zZWcpOwpAQCAtMjAxMywxMCArMTk1OCw4IEBACiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IHJldDsKIAotCWlmIChvcHMtPnNldF9jcigzLCB0c3MtPmNyMywgY3R4dC0+dmNwdSkpIHsKLQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKLQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCX0KKwlpZiAob3BzLT5zZXRfY3IoMywgdHNzLT5jcjMsIGN0eHQtPnZjcHUpKQorCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKIAljLT5laXAgPSB0c3MtPmVpcDsKIAljdHh0LT5lZmxhZ3MgPSB0c3MtPmVmbGFncyB8IDI7CiAJYy0+cmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHRzcy0+ZWF4OwpAQCAtMjA3NiwzMyArMjAxOSwyNyBAQAogewogCXN0cnVjdCB0c3Nfc2VnbWVudF8zMiB0c3Nfc2VnOwogCWludCByZXQ7Ci0JdTMyIGVyciwgbmV3X3Rzc19iYXNlID0gZ2V0X2Rlc2NfYmFzZShuZXdfZGVzYyk7CisJdTMyIG5ld190c3NfYmFzZSA9IGdldF9kZXNjX2Jhc2UobmV3X2Rlc2MpOwogCiAJcmV0ID0gb3BzLT5yZWFkX3N0ZChvbGRfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAmZXJyKTsKLQlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CisJCQkgICAgJmN0eHQtPmV4Y2VwdGlvbik7CisJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQllbXVsYXRlX3BmKGN0eHQpOwogCQlyZXR1cm4gcmV0OwotCX0KIAogCXNhdmVfc3RhdGVfdG9fdHNzMzIoY3R4dCwgb3BzLCAmdHNzX3NlZyk7CiAKIAlyZXQgPSBvcHMtPndyaXRlX3N0ZChvbGRfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAgJmVycik7Ci0JaWYgKHJldCA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkgeworCQkJICAgICAmY3R4dC0+ZXhjZXB0aW9uKTsKKwlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCS8qIEZJWE1FOiBuZWVkIHRvIHByb3ZpZGUgcHJlY2lzZSBmYXVsdCBhZGRyZXNzICovCi0JCWVtdWxhdGVfcGYoY3R4dCk7CiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcmV0ID0gb3BzLT5yZWFkX3N0ZChuZXdfdHNzX2Jhc2UsICZ0c3Nfc2VnLCBzaXplb2YgdHNzX3NlZywgY3R4dC0+dmNwdSwKLQkJCSAgICAmZXJyKTsKLQlpZiAocmV0ID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKSB7CisJCQkgICAgJmN0eHQtPmV4Y2VwdGlvbik7CisJaWYgKHJldCAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQllbXVsYXRlX3BmKGN0eHQpOwogCQlyZXR1cm4gcmV0OwotCX0KIAogCWlmIChvbGRfdHNzX3NlbCAhPSAweGZmZmYpIHsKIAkJdHNzX3NlZy5wcmV2X3Rhc2tfbGluayA9IG9sZF90c3Nfc2VsOwpAQCAtMjExMCwxMiArMjA0NywxMCBAQAogCQlyZXQgPSBvcHMtPndyaXRlX3N0ZChuZXdfdHNzX2Jhc2UsCiAJCQkJICAgICAmdHNzX3NlZy5wcmV2X3Rhc2tfbGluaywKIAkJCQkgICAgIHNpemVvZiB0c3Nfc2VnLnByZXZfdGFza19saW5rLAotCQkJCSAgICAgY3R4dC0+dmNwdSwgJmVycik7Ci0JCWlmIChyZXQgPT0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQpIHsKKwkJCQkgICAgIGN0eHQtPnZjcHUsICZjdHh0LT5leGNlcHRpb24pOworCQlpZiAocmV0ICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQkvKiBGSVhNRTogbmVlZCB0byBwcm92aWRlIHByZWNpc2UgZmF1bHQgYWRkcmVzcyAqLwotCQkJZW11bGF0ZV9wZihjdHh0KTsKIAkJCXJldHVybiByZXQ7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gbG9hZF9zdGF0ZV9mcm9tX3RzczMyKGN0eHQsIG9wcywgJnRzc19zZWcpOwpAQCAtMjE0NiwxMCArMjA4MSw4IEBACiAKIAlpZiAocmVhc29uICE9IFRBU0tfU1dJVENIX0lSRVQpIHsKIAkJaWYgKCh0c3Nfc2VsZWN0b3IgJiAzKSA+IG5leHRfdHNzX2Rlc2MuZHBsIHx8Ci0JCSAgICBvcHMtPmNwbChjdHh0LT52Y3B1KSA+IG5leHRfdHNzX2Rlc2MuZHBsKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOwotCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwotCQl9CisJCSAgICBvcHMtPmNwbChjdHh0LT52Y3B1KSA+IG5leHRfdHNzX2Rlc2MuZHBsKQorCQkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJfQogCiAJZGVzY19saW1pdCA9IGRlc2NfbGltaXRfc2NhbGVkKCZuZXh0X3Rzc19kZXNjKTsKQEAgLTIyMzEsMTQgKzIxNjQsMTUgQEAKIAlyZXR1cm4gKHJjID09IFg4NkVNVUxfVU5IQU5ETEVBQkxFKSA/IC0xIDogMDsKIH0KIAotc3RhdGljIHZvaWQgc3RyaW5nX2FkZHJfaW5jKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCB1bnNpZ25lZCBsb25nIGJhc2UsCitzdGF0aWMgdm9pZCBzdHJpbmdfYWRkcl9pbmMoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHVuc2lnbmVkIHNlZywKIAkJCSAgICBpbnQgcmVnLCBzdHJ1Y3Qgb3BlcmFuZCAqb3ApCiB7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CiAJaW50IGRmID0gKGN0eHQtPmVmbGFncyAmIEVGTEdfREYpID8gLTEgOiAxOwogCiAJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoYywgJmMtPnJlZ3NbcmVnXSwgZGYgKiBvcC0+Ynl0ZXMpOwotCW9wLT5hZGRyLm1lbSA9IHJlZ2lzdGVyX2FkZHJlc3MoYywgIGJhc2UsIGMtPnJlZ3NbcmVnXSk7CisJb3AtPmFkZHIubWVtLmVhID0gcmVnaXN0ZXJfYWRkcmVzcyhjLCBjLT5yZWdzW3JlZ10pOworCW9wLT5hZGRyLm1lbS5zZWcgPSBzZWc7CiB9CiAKIHN0YXRpYyBpbnQgZW1fcHVzaChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKQEAgLTIzNjksMTAgKzIzMDMsOCBAQAogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmY3R4dC0+ZGVjb2RlOwogCXU2NCB0c2MgPSAwOwogCi0JaWYgKGNwbCA+IDAgJiYgKGN0eHQtPm9wcy0+Z2V0X2NyKDQsIGN0eHQtPnZjcHUpICYgWDg2X0NSNF9UU0QpKSB7Ci0JCWVtdWxhdGVfZ3AoY3R4dCwgMCk7Ci0JCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQl9CisJaWYgKGNwbCA+IDAgJiYgKGN0eHQtPm9wcy0+Z2V0X2NyKDQsIGN0eHQtPnZjcHUpICYgWDg2X0NSNF9UU0QpKQorCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKIAljdHh0LT5vcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgTVNSX0lBMzJfVFNDLCAmdHNjKTsKIAljLT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gKHUzMil0c2M7CiAJYy0+cmVnc1tWQ1BVX1JFR1NfUkRYXSA9IHRzYyA+PiAzMjsKQEAgLTI2NDcsNyArMjU3OSw3IEBACiAKIAlvcC0+dHlwZSA9IE9QX0lNTTsKIAlvcC0+Ynl0ZXMgPSBzaXplOwotCW9wLT5hZGRyLm1lbSA9IGMtPmVpcDsKKwlvcC0+YWRkci5tZW0uZWEgPSBjLT5laXA7CiAJLyogTkIuIEltbWVkaWF0ZXMgYXJlIHNpZ24tZXh0ZW5kZWQgYXMgbmVjZXNzYXJ5LiAqLwogCXN3aXRjaCAob3AtPmJ5dGVzKSB7CiAJY2FzZSAxOgpAQCAtMjY3OCw3ICsyNjEwLDcgQEAKIH0KIAogaW50Ci14ODZfZGVjb2RlX2luc24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit4ODZfZGVjb2RlX2luc24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHZvaWQgKmluc24sIGludCBpbnNuX2xlbikKIHsKIAlzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzICpvcHMgPSBjdHh0LT5vcHM7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYyA9ICZjdHh0LT5kZWNvZGU7CkBAIC0yNjg5LDcgKzI2MjEsMTAgQEAKIAlzdHJ1Y3Qgb3BlcmFuZCBtZW1vcCA9IHsgLnR5cGUgPSBPUF9OT05FIH07CiAKIAljLT5laXAgPSBjdHh0LT5laXA7Ci0JYy0+ZmV0Y2guc3RhcnQgPSBjLT5mZXRjaC5lbmQgPSBjLT5laXA7CisJYy0+ZmV0Y2guc3RhcnQgPSBjLT5laXA7CisJYy0+ZmV0Y2guZW5kID0gYy0+ZmV0Y2guc3RhcnQgKyBpbnNuX2xlbjsKKwlpZiAoaW5zbl9sZW4gPiAwKQorCQltZW1jcHkoYy0+ZmV0Y2guZGF0YSwgaW5zbiwgaW5zbl9sZW4pOwogCWN0eHQtPmNzX2Jhc2UgPSBzZWdfYmFzZShjdHh0LCBvcHMsIFZDUFVfU1JFR19DUyk7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKQEAgLTI4MDMsMTAgKzI3MzgsOCBAQAogCWMtPmV4ZWN1dGUgPSBvcGNvZGUudS5leGVjdXRlOwogCiAJLyogVW5yZWNvZ25pc2VkPyAqLwotCWlmIChjLT5kID09IDAgfHwgKGMtPmQgJiBVbmRlZmluZWQpKSB7Ci0JCURQUklOVEYoIkNhbm5vdCBlbXVsYXRlICUwMnhcbiIsIGMtPmIpOworCWlmIChjLT5kID09IDAgfHwgKGMtPmQgJiBVbmRlZmluZWQpKQogCQlyZXR1cm4gLTE7Ci0JfQogCiAJaWYgKG1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCAmJiAoYy0+ZCAmIFN0YWNrKSkKIAkJYy0+b3BfYnl0ZXMgPSA4OwpAQCAtMjgzMSwxNCArMjc2NCwxMyBAQAogCWlmICghYy0+aGFzX3NlZ19vdmVycmlkZSkKIAkJc2V0X3NlZ19vdmVycmlkZShjLCBWQ1BVX1NSRUdfRFMpOwogCi0JaWYgKG1lbW9wLnR5cGUgPT0gT1BfTUVNICYmICEoIWMtPnR3b2J5dGUgJiYgYy0+YiA9PSAweDhkKSkKLQkJbWVtb3AuYWRkci5tZW0gKz0gc2VnX292ZXJyaWRlX2Jhc2UoY3R4dCwgb3BzLCBjKTsKKwltZW1vcC5hZGRyLm1lbS5zZWcgPSBzZWdfb3ZlcnJpZGUoY3R4dCwgb3BzLCBjKTsKIAogCWlmIChtZW1vcC50eXBlID09IE9QX01FTSAmJiBjLT5hZF9ieXRlcyAhPSA4KQotCQltZW1vcC5hZGRyLm1lbSA9ICh1MzIpbWVtb3AuYWRkci5tZW07CisJCW1lbW9wLmFkZHIubWVtLmVhID0gKHUzMiltZW1vcC5hZGRyLm1lbS5lYTsKIAogCWlmIChtZW1vcC50eXBlID09IE9QX01FTSAmJiBjLT5yaXBfcmVsYXRpdmUpCi0JCW1lbW9wLmFkZHIubWVtICs9IGMtPmVpcDsKKwkJbWVtb3AuYWRkci5tZW0uZWEgKz0gYy0+ZWlwOwogCiAJLyoKIAkgKiBEZWNvZGUgYW5kIGZldGNoIHRoZSBzb3VyY2Ugb3BlcmFuZDogcmVnaXN0ZXIsIG1lbW9yeQpAQCAtMjg5MCwxNCArMjgyMiwxNCBAQAogCWNhc2UgU3JjU0k6CiAJCWMtPnNyYy50eXBlID0gT1BfTUVNOwogCQljLT5zcmMuYnl0ZXMgPSAoYy0+ZCAmIEJ5dGVPcCkgPyAxIDogYy0+b3BfYnl0ZXM7Ci0JCWMtPnNyYy5hZGRyLm1lbSA9Ci0JCQlyZWdpc3Rlcl9hZGRyZXNzKGMsICBzZWdfb3ZlcnJpZGVfYmFzZShjdHh0LCBvcHMsIGMpLAotCQkJCQkgYy0+cmVnc1tWQ1BVX1JFR1NfUlNJXSk7CisJCWMtPnNyYy5hZGRyLm1lbS5lYSA9CisJCQlyZWdpc3Rlcl9hZGRyZXNzKGMsIGMtPnJlZ3NbVkNQVV9SRUdTX1JTSV0pOworCQljLT5zcmMuYWRkci5tZW0uc2VnID0gc2VnX292ZXJyaWRlKGN0eHQsIG9wcywgYyksCiAJCWMtPnNyYy52YWwgPSAwOwogCQlicmVhazsKIAljYXNlIFNyY0ltbUZBZGRyOgogCQljLT5zcmMudHlwZSA9IE9QX0lNTTsKLQkJYy0+c3JjLmFkZHIubWVtID0gYy0+ZWlwOworCQljLT5zcmMuYWRkci5tZW0uZWEgPSBjLT5laXA7CiAJCWMtPnNyYy5ieXRlcyA9IGMtPm9wX2J5dGVzICsgMjsKIAkJaW5zbl9mZXRjaF9hcnIoYy0+c3JjLnZhbHB0ciwgYy0+c3JjLmJ5dGVzLCBjLT5laXApOwogCQlicmVhazsKQEAgLTI5NDQsNyArMjg3Niw3IEBACiAJCWJyZWFrOwogCWNhc2UgRHN0SW1tVUJ5dGU6CiAJCWMtPmRzdC50eXBlID0gT1BfSU1NOwotCQljLT5kc3QuYWRkci5tZW0gPSBjLT5laXA7CisJCWMtPmRzdC5hZGRyLm1lbS5lYSA9IGMtPmVpcDsKIAkJYy0+ZHN0LmJ5dGVzID0gMTsKIAkJYy0+ZHN0LnZhbCA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCk7CiAJCWJyZWFrOwpAQCAtMjk2OSw5ICsyOTAxLDkgQEAKIAljYXNlIERzdERJOgogCQljLT5kc3QudHlwZSA9IE9QX01FTTsKIAkJYy0+ZHN0LmJ5dGVzID0gKGMtPmQgJiBCeXRlT3ApID8gMSA6IGMtPm9wX2J5dGVzOwotCQljLT5kc3QuYWRkci5tZW0gPQotCQkJcmVnaXN0ZXJfYWRkcmVzcyhjLCBlc19iYXNlKGN0eHQsIG9wcyksCi0JCQkJCSBjLT5yZWdzW1ZDUFVfUkVHU19SREldKTsKKwkJYy0+ZHN0LmFkZHIubWVtLmVhID0KKwkJCXJlZ2lzdGVyX2FkZHJlc3MoYywgYy0+cmVnc1tWQ1BVX1JFR1NfUkRJXSk7CisJCWMtPmRzdC5hZGRyLm1lbS5zZWcgPSBWQ1BVX1NSRUdfRVM7CiAJCWMtPmRzdC52YWwgPSAwOwogCQlicmVhazsKIAljYXNlIEltcGxpY2l0T3BzOgpAQCAtMzAyMCwyNCArMjk1MiwyNCBAQAogCWN0eHQtPmRlY29kZS5tZW1fcmVhZC5wb3MgPSAwOwogCiAJaWYgKGN0eHQtPm1vZGUgPT0gWDg2RU1VTF9NT0RFX1BST1Q2NCAmJiAoYy0+ZCAmIE5vNjQpKSB7Ci0JCWVtdWxhdGVfdWQoY3R4dCk7CisJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAogCS8qIExPQ0sgcHJlZml4IGlzIGFsbG93ZWQgb25seSB3aXRoIHNvbWUgaW5zdHJ1Y3Rpb25zICovCiAJaWYgKGMtPmxvY2tfcHJlZml4ICYmICghKGMtPmQgJiBMb2NrKSB8fCBjLT5kc3QudHlwZSAhPSBPUF9NRU0pKSB7Ci0JCWVtdWxhdGVfdWQoY3R4dCk7CisJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKIAkJZ290byBkb25lOwogCX0KIAogCWlmICgoYy0+ZCAmIFNyY01hc2spID09IFNyY01lbUZBZGRyICYmIGMtPnNyYy50eXBlICE9IE9QX01FTSkgewotCQllbXVsYXRlX3VkKGN0eHQpOworCQlyYyA9IGVtdWxhdGVfdWQoY3R4dCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAkvKiBQcml2aWxlZ2VkIGluc3RydWN0aW9uIGNhbiBiZSBleGVjdXRlZCBvbmx5IGluIENQTD0wICovCiAJaWYgKChjLT5kICYgUHJpdikgJiYgb3BzLT5jcGwoY3R4dC0+dmNwdSkpIHsKLQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKKwkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0zMDUwLDcgKzI5ODIsNyBAQAogCX0KIAogCWlmICgoYy0+c3JjLnR5cGUgPT0gT1BfTUVNKSAmJiAhKGMtPmQgJiBOb0FjY2VzcykpIHsKLQkJcmMgPSByZWFkX2VtdWxhdGVkKGN0eHQsIG9wcywgYy0+c3JjLmFkZHIubWVtLAorCQlyYyA9IHJlYWRfZW11bGF0ZWQoY3R4dCwgb3BzLCBsaW5lYXIoY3R4dCwgYy0+c3JjLmFkZHIubWVtKSwKIAkJCQkJYy0+c3JjLnZhbHB0ciwgYy0+c3JjLmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CkBAIC0zMDU4LDcgKzI5OTAsNyBAQAogCX0KIAogCWlmIChjLT5zcmMyLnR5cGUgPT0gT1BfTUVNKSB7Ci0JCXJjID0gcmVhZF9lbXVsYXRlZChjdHh0LCBvcHMsIGMtPnNyYzIuYWRkci5tZW0sCisJCXJjID0gcmVhZF9lbXVsYXRlZChjdHh0LCBvcHMsIGxpbmVhcihjdHh0LCBjLT5zcmMyLmFkZHIubWVtKSwKIAkJCQkJJmMtPnNyYzIudmFsLCBjLT5zcmMyLmJ5dGVzKTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlnb3RvIGRvbmU7CkBAIC0zMDcwLDcgKzMwMDIsNyBAQAogCiAJaWYgKChjLT5kc3QudHlwZSA9PSBPUF9NRU0pICYmICEoYy0+ZCAmIE1vdikpIHsKIAkJLyogb3B0aW1pc2F0aW9uIC0gYXZvaWQgc2xvdyBlbXVsYXRlZCByZWFkIGlmIE1vdiAqLwotCQlyYyA9IHJlYWRfZW11bGF0ZWQoY3R4dCwgb3BzLCBjLT5kc3QuYWRkci5tZW0sCisJCXJjID0gcmVhZF9lbXVsYXRlZChjdHh0LCBvcHMsIGxpbmVhcihjdHh0LCBjLT5kc3QuYWRkci5tZW0pLAogCQkJCSAgICZjLT5kc3QudmFsLCBjLT5kc3QuYnl0ZXMpOwogCQlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJCWdvdG8gZG9uZTsKQEAgLTMyMTUsMTMgKzMxNDcsMTMgQEAKIAkJYnJlYWs7CiAJY2FzZSAweDhjOiAgLyogbW92IHIvbSwgc3JlZyAqLwogCQlpZiAoYy0+bW9kcm1fcmVnID4gVkNQVV9TUkVHX0dTKSB7Ci0JCQllbXVsYXRlX3VkKGN0eHQpOworCQkJcmMgPSBlbXVsYXRlX3VkKGN0eHQpOwogCQkJZ290byBkb25lOwogCQl9CiAJCWMtPmRzdC52YWwgPSBvcHMtPmdldF9zZWdtZW50X3NlbGVjdG9yKGMtPm1vZHJtX3JlZywgY3R4dC0+dmNwdSk7CiAJCWJyZWFrOwogCWNhc2UgMHg4ZDogLyogbGVhIHIxNi9yMzIsIG0gKi8KLQkJYy0+ZHN0LnZhbCA9IGMtPnNyYy5hZGRyLm1lbTsKKwkJYy0+ZHN0LnZhbCA9IGMtPnNyYy5hZGRyLm1lbS5lYTsKIAkJYnJlYWs7CiAJY2FzZSAweDhlOiB7IC8qIG1vdiBzZWcsIHIvbTE2ICovCiAJCXVpbnQxNl90IHNlbDsKQEAgLTMyMzAsNyArMzE2Miw3IEBACiAKIAkJaWYgKGMtPm1vZHJtX3JlZyA9PSBWQ1BVX1NSRUdfQ1MgfHwKIAkJICAgIGMtPm1vZHJtX3JlZyA+IFZDUFVfU1JFR19HUykgewotCQkJZW11bGF0ZV91ZChjdHh0KTsKKwkJCXJjID0gZW11bGF0ZV91ZChjdHh0KTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0zMjY4LDcgKzMyMDAsNiBAQAogCQlicmVhazsKIAljYXNlIDB4YTYgLi4uIDB4YTc6CS8qIGNtcHMgKi8KIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KLQkJRFBSSU5URigiY21wczogbWVtMT0weCVwIG1lbTI9MHglcFxuIiwgYy0+c3JjLmFkZHIubWVtLCBjLT5kc3QuYWRkci5tZW0pOwogCQlnb3RvIGNtcDsKIAljYXNlIDB4YTggLi4uIDB4YTk6CS8qIHRlc3QgYXgsIGltbSAqLwogCQlnb3RvIHRlc3Q7CkBAIC0zMzYzLDcgKzMyOTQsNyBAQAogCWRvX2lvX2luOgogCQljLT5kc3QuYnl0ZXMgPSBtaW4oYy0+ZHN0LmJ5dGVzLCA0dSk7CiAJCWlmICghZW11bGF0b3JfaW9fcGVybWl0ZWQoY3R4dCwgb3BzLCBjLT5zcmMudmFsLCBjLT5kc3QuYnl0ZXMpKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOworCQkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJZ290byBkb25lOwogCQl9CiAJCWlmICghcGlvX2luX2VtdWxhdGVkKGN0eHQsIG9wcywgYy0+ZHN0LmJ5dGVzLCBjLT5zcmMudmFsLApAQCAtMzM3Nyw3ICszMzA4LDcgQEAKIAkJYy0+c3JjLmJ5dGVzID0gbWluKGMtPnNyYy5ieXRlcywgNHUpOwogCQlpZiAoIWVtdWxhdG9yX2lvX3Blcm1pdGVkKGN0eHQsIG9wcywgYy0+ZHN0LnZhbCwKIAkJCQkJICBjLT5zcmMuYnl0ZXMpKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOworCQkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJZ290byBkb25lOwogCQl9CiAJCW9wcy0+cGlvX291dF9lbXVsYXRlZChjLT5zcmMuYnl0ZXMsIGMtPmRzdC52YWwsCkBAIC0zNDAyLDE0ICszMzMzLDE0IEBACiAJCWJyZWFrOwogCWNhc2UgMHhmYTogLyogY2xpICovCiAJCWlmIChlbXVsYXRvcl9iYWRfaW9wbChjdHh0LCBvcHMpKSB7Ci0JCQllbXVsYXRlX2dwKGN0eHQsIDApOworCQkJcmMgPSBlbXVsYXRlX2dwKGN0eHQsIDApOwogCQkJZ290byBkb25lOwogCQl9IGVsc2UKIAkJCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19JRjsKIAkJYnJlYWs7CiAJY2FzZSAweGZiOiAvKiBzdGkgKi8KIAkJaWYgKGVtdWxhdG9yX2JhZF9pb3BsKGN0eHQsIG9wcykpIHsKLQkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CisJCQlyYyA9IGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0gZWxzZSB7CiAJCQljdHh0LT5pbnRlcnJ1cHRpYmlsaXR5ID0gS1ZNX1g4Nl9TSEFET1dfSU5UX1NUSTsKQEAgLTM0NDksMTEgKzMzODAsMTEgQEAKIAljLT5kc3QudHlwZSA9IHNhdmVkX2RzdF90eXBlOwogCiAJaWYgKChjLT5kICYgU3JjTWFzaykgPT0gU3JjU0kpCi0JCXN0cmluZ19hZGRyX2luYyhjdHh0LCBzZWdfb3ZlcnJpZGVfYmFzZShjdHh0LCBvcHMsIGMpLAorCQlzdHJpbmdfYWRkcl9pbmMoY3R4dCwgc2VnX292ZXJyaWRlKGN0eHQsIG9wcywgYyksCiAJCQkJVkNQVV9SRUdTX1JTSSwgJmMtPnNyYyk7CiAKIAlpZiAoKGMtPmQgJiBEc3RNYXNrKSA9PSBEc3RESSkKLQkJc3RyaW5nX2FkZHJfaW5jKGN0eHQsIGVzX2Jhc2UoY3R4dCwgb3BzKSwgVkNQVV9SRUdTX1JESSwKKwkJc3RyaW5nX2FkZHJfaW5jKGN0eHQsIFZDUFVfU1JFR19FUywgVkNQVV9SRUdTX1JESSwKIAkJCQkmYy0+ZHN0KTsKIAogCWlmIChjLT5yZXBfcHJlZml4ICYmIChjLT5kICYgU3RyaW5nKSkgewpAQCAtMzQ4Miw2ICszNDEzLDggQEAKIAljdHh0LT5laXAgPSBjLT5laXA7CiAKIGRvbmU6CisJaWYgKHJjID09IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUKQorCQljdHh0LT5oYXZlX2V4Y2VwdGlvbiA9IHRydWU7CiAJcmV0dXJuIChyYyA9PSBYODZFTVVMX1VOSEFORExFQUJMRSkgPyBFTVVMQVRJT05fRkFJTEVEIDogRU1VTEFUSU9OX09LOwogCiB0d29ieXRlX2luc246CkBAIC0zNTQ0LDkgKzM0NzcsMTEgQEAKIAkJCWJyZWFrOwogCQljYXNlIDU6IC8qIG5vdCBkZWZpbmVkICovCiAJCQllbXVsYXRlX3VkKGN0eHQpOworCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJY2FzZSA3OiAvKiBpbnZscGcqLwotCQkJZW11bGF0ZV9pbnZscGcoY3R4dC0+dmNwdSwgYy0+c3JjLmFkZHIubWVtKTsKKwkJCWVtdWxhdGVfaW52bHBnKGN0eHQtPnZjcHUsCisJCQkJICAgICAgIGxpbmVhcihjdHh0LCBjLT5zcmMuYWRkci5tZW0pKTsKIAkJCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwogCQkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwogCQkJYnJlYWs7CkBAIC0zNTczLDYgKzM1MDgsNyBAQAogCQljYXNlIDUgLi4uIDc6CiAJCWNhc2UgOSAuLi4gMTU6CiAJCQllbXVsYXRlX3VkKGN0eHQpOworCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCQljLT5kc3QudmFsID0gb3BzLT5nZXRfY3IoYy0+bW9kcm1fcmVnLCBjdHh0LT52Y3B1KTsKQEAgLTM1ODEsNiArMzUxNyw3IEBACiAJCWlmICgob3BzLT5nZXRfY3IoNCwgY3R4dC0+dmNwdSkgJiBYODZfQ1I0X0RFKSAmJgogCQkgICAgKGMtPm1vZHJtX3JlZyA9PSA0IHx8IGMtPm1vZHJtX3JlZyA9PSA1KSkgewogCQkJZW11bGF0ZV91ZChjdHh0KTsKKwkJCXJjID0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJb3BzLT5nZXRfZHIoYy0+bW9kcm1fcmVnLCAmYy0+ZHN0LnZhbCwgY3R4dC0+dmNwdSk7CkBAIC0zNTg4LDYgKzM1MjUsNyBAQAogCWNhc2UgMHgyMjogLyogbW92IHJlZywgY3IgKi8KIAkJaWYgKG9wcy0+c2V0X2NyKGMtPm1vZHJtX3JlZywgYy0+c3JjLnZhbCwgY3R4dC0+dmNwdSkpIHsKIAkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CisJCQlyYyA9IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQkJZ290byBkb25lOwogCQl9CiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsKQEAgLTM1OTYsNiArMzUzNCw3IEBACiAJCWlmICgob3BzLT5nZXRfY3IoNCwgY3R4dC0+dmNwdSkgJiBYODZfQ1I0X0RFKSAmJgogCQkgICAgKGMtPm1vZHJtX3JlZyA9PSA0IHx8IGMtPm1vZHJtX3JlZyA9PSA1KSkgewogCQkJZW11bGF0ZV91ZChjdHh0KTsKKwkJCXJjID0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIApAQCAtMzYwNCw2ICszNTQzLDcgQEAKIAkJCQkgfjBVTEwgOiB+MFUpLCBjdHh0LT52Y3B1KSA8IDApIHsKIAkJCS8qICNVRCBjb25kaXRpb24gaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBjb2RlIGFib3ZlICovCiAJCQllbXVsYXRlX2dwKGN0eHQsIDApOworCQkJcmMgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCkBAIC0zNjE1LDYgKzM1NTUsNyBAQAogCQkJfCAoKHU2NCljLT5yZWdzW1ZDUFVfUkVHU19SRFhdIDw8IDMyKTsKIAkJaWYgKG9wcy0+c2V0X21zcihjdHh0LT52Y3B1LCBjLT5yZWdzW1ZDUFVfUkVHU19SQ1hdLCBtc3JfZGF0YSkpIHsKIAkJCWVtdWxhdGVfZ3AoY3R4dCwgMCk7CisJCQlyYyA9IFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQkJZ290byBkb25lOwogCQl9CiAJCXJjID0gWDg2RU1VTF9DT05USU5VRTsKQEAgLTM2MjMsNiArMzU2NCw3IEBACiAJCS8qIHJkbXNyICovCiAJCWlmIChvcHMtPmdldF9tc3IoY3R4dC0+dmNwdSwgYy0+cmVnc1tWQ1BVX1JFR1NfUkNYXSwgJm1zcl9kYXRhKSkgewogCQkJZW11bGF0ZV9ncChjdHh0LCAwKTsKKwkJCXJjID0gWDg2RU1VTF9QUk9QQUdBVEVfRkFVTFQ7CiAJCQlnb3RvIGRvbmU7CiAJCX0gZWxzZSB7CiAJCQljLT5yZWdzW1ZDUFVfUkVHU19SQVhdID0gKHUzMiltc3JfZGF0YTsKQEAgLTM3ODUsNiArMzcyNyw1IEBACiAJZ290byB3cml0ZWJhY2s7CiAKIGNhbm5vdF9lbXVsYXRlOgotCURQUklOVEYoIkNhbm5vdCBlbXVsYXRlICUwMnhcbiIsIGMtPmIpOwogCXJldHVybiAtMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9rdm1fY2FjaGVfcmVncy5oIGIvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKaW5kZXggOTc1YmI0NS4uMzM3N2Q1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKKysrIGIvYXJjaC94ODYva3ZtL2t2bV9jYWNoZV9yZWdzLmgKQEAgLTczLDYgKzczLDEzIEBACiAJcmV0dXJuIHZjcHUtPmFyY2guY3I0ICYgbWFzazsKIH0KIAorc3RhdGljIGlubGluZSB1bG9uZyBrdm1fcmVhZF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICghdGVzdF9iaXQoVkNQVV9FWFJFR19DUjMsICh1bG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfYXZhaWwpKQorCQlrdm1feDg2X29wcy0+ZGVjYWNoZV9jcjModmNwdSk7CisJcmV0dXJuIHZjcHUtPmFyY2guY3IzOworfQorCiBzdGF0aWMgaW5saW5lIHVsb25nIGt2bV9yZWFkX2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIGt2bV9yZWFkX2NyNF9iaXRzKHZjcHUsIH4wVUwpOwpAQCAtODQsNCArOTEsMTkgQEAKIAkJfCAoKHU2NCkoa3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgVkNQVV9SRUdTX1JEWCkgJiAtMXUpIDw8IDMyKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2d1ZXN0X21vZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZjcHUtPmFyY2guaGZsYWdzIHw9IEhGX0dVRVNUX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZWF2ZV9ndWVzdF9tb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1LT5hcmNoLmhmbGFncyAmPSB+SEZfR1VFU1RfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2d1ZXN0X21vZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiB2Y3B1LT5hcmNoLmhmbGFncyAmIEhGX0dVRVNUX01BU0s7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmMgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwppbmRleCA0MTNmODk3Li45M2NmOWQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYworKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwpAQCAtMjc3LDcgKzI3Nyw4IEBACiAKIAlpZiAob2xkX3BwciAhPSBwcHIpIHsKIAkJYXBpY19zZXRfcmVnKGFwaWMsIEFQSUNfUFJPQ1BSSSwgcHByKTsKLQkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0VWRU5ULCBhcGljLT52Y3B1KTsKKwkJaWYgKHBwciA8IG9sZF9wcHIpCisJCQlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIGFwaWMtPnZjcHUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IGZiYjA0YWUuLmYwMmI4ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTE4LDkgKzE4LDExIEBACiAgKgogICovCiAKKyNpbmNsdWRlICJpcnEuaCIKICNpbmNsdWRlICJtbXUuaCIKICNpbmNsdWRlICJ4ODYuaCIKICNpbmNsdWRlICJrdm1fY2FjaGVfcmVncy5oIgorI2luY2x1ZGUgIng4Ni5oIgogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTk0LDcgKzE5Niw2IEBACiAKIHN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKIHN0YXRpYyB1NjQgX19yZWFkX21vc3RseSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwotc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd19iYXNlX3ByZXNlbnRfcHRlOwogc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd19ueF9tYXNrOwogc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd194X21hc2s7CS8qIG11dHVhbCBleGNsdXNpdmUgd2l0aCBueF9tYXNrICovCiBzdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgc2hhZG93X3VzZXJfbWFzazsKQEAgLTIxMywxMiArMjE0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9tbXVfc2V0X25vbnByZXNlbnRfcHRlcyk7CiAKLXZvaWQga3ZtX21tdV9zZXRfYmFzZV9wdGVzKHU2NCBiYXNlX3B0ZSkKLXsKLQlzaGFkb3dfYmFzZV9wcmVzZW50X3B0ZSA9IGJhc2VfcHRlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX21tdV9zZXRfYmFzZV9wdGVzKTsKLQogdm9pZCBrdm1fbW11X3NldF9tYXNrX3B0ZXModTY0IHVzZXJfbWFzaywgdTY0IGFjY2Vzc2VkX21hc2ssCiAJCXU2NCBkaXJ0eV9tYXNrLCB1NjQgbnhfbWFzaywgdTY0IHhfbWFzaykKIHsKQEAgLTQ4Miw0NiArNDc3LDQ2IEBACiB9CiAKIC8qCi0gKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGxhcmdlcGFnZSB3cml0ZSBjb3VudCBmb3IgYSBnaXZlbgotICogZ2ZuLCBoYW5kbGluZyBzbG90cyB0aGF0IGFyZSBub3QgbGFyZ2UgcGFnZSBhbGlnbmVkLgorICogUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBsYXJnZSBwYWdlIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGdmbiwKKyAqIGhhbmRsaW5nIHNsb3RzIHRoYXQgYXJlIG5vdCBsYXJnZSBwYWdlIGFsaWduZWQuCiAgKi8KLXN0YXRpYyBpbnQgKnNsb3RfbGFyZ2VwYWdlX2lkeChnZm5fdCBnZm4sCi0JCQkgICAgICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKLQkJCSAgICAgICBpbnQgbGV2ZWwpCitzdGF0aWMgc3RydWN0IGt2bV9scGFnZV9pbmZvICpscGFnZV9pbmZvX3Nsb3QoZ2ZuX3QgZ2ZuLAorCQkJCQkgICAgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAorCQkJCQkgICAgICBpbnQgbGV2ZWwpCiB7CiAJdW5zaWduZWQgbG9uZyBpZHg7CiAKIAlpZHggPSAoZ2ZuID4+IEtWTV9IUEFHRV9HRk5fU0hJRlQobGV2ZWwpKSAtCiAJICAgICAgKHNsb3QtPmJhc2VfZ2ZuID4+IEtWTV9IUEFHRV9HRk5fU0hJRlQobGV2ZWwpKTsKLQlyZXR1cm4gJnNsb3QtPmxwYWdlX2luZm9bbGV2ZWwgLSAyXVtpZHhdLndyaXRlX2NvdW50OworCXJldHVybiAmc2xvdC0+bHBhZ2VfaW5mb1tsZXZlbCAtIDJdW2lkeF07CiB9CiAKIHN0YXRpYyB2b2lkIGFjY291bnRfc2hhZG93ZWQoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCiB7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdDsKLQlpbnQgKndyaXRlX2NvdW50OworCXN0cnVjdCBrdm1fbHBhZ2VfaW5mbyAqbGluZm87CiAJaW50IGk7CiAKIAlzbG90ID0gZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBnZm4pOwogCWZvciAoaSA9IFBUX0RJUkVDVE9SWV9MRVZFTDsKIAkgICAgIGkgPCBQVF9QQUdFX1RBQkxFX0xFVkVMICsgS1ZNX05SX1BBR0VfU0laRVM7ICsraSkgewotCQl3cml0ZV9jb3VudCAgID0gc2xvdF9sYXJnZXBhZ2VfaWR4KGdmbiwgc2xvdCwgaSk7Ci0JCSp3cml0ZV9jb3VudCArPSAxOworCQlsaW5mbyA9IGxwYWdlX2luZm9fc2xvdChnZm4sIHNsb3QsIGkpOworCQlsaW5mby0+d3JpdGVfY291bnQgKz0gMTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHVuYWNjb3VudF9zaGFkb3dlZChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKIAlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90OwotCWludCAqd3JpdGVfY291bnQ7CisJc3RydWN0IGt2bV9scGFnZV9pbmZvICpsaW5mbzsKIAlpbnQgaTsKIAogCXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CiAJZm9yIChpID0gUFRfRElSRUNUT1JZX0xFVkVMOwogCSAgICAgaSA8IFBUX1BBR0VfVEFCTEVfTEVWRUwgKyBLVk1fTlJfUEFHRV9TSVpFUzsgKytpKSB7Ci0JCXdyaXRlX2NvdW50ICAgPSBzbG90X2xhcmdlcGFnZV9pZHgoZ2ZuLCBzbG90LCBpKTsKLQkJKndyaXRlX2NvdW50IC09IDE7Ci0JCVdBUk5fT04oKndyaXRlX2NvdW50IDwgMCk7CisJCWxpbmZvID0gbHBhZ2VfaW5mb19zbG90KGdmbiwgc2xvdCwgaSk7CisJCWxpbmZvLT53cml0ZV9jb3VudCAtPSAxOworCQlXQVJOX09OKGxpbmZvLT53cml0ZV9jb3VudCA8IDApOwogCX0KIH0KIApAQCAtNTMwLDEyICs1MjUsMTIgQEAKIAkJCQlpbnQgbGV2ZWwpCiB7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdDsKLQlpbnQgKmxhcmdlcGFnZV9pZHg7CisJc3RydWN0IGt2bV9scGFnZV9pbmZvICpsaW5mbzsKIAogCXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CiAJaWYgKHNsb3QpIHsKLQkJbGFyZ2VwYWdlX2lkeCA9IHNsb3RfbGFyZ2VwYWdlX2lkeChnZm4sIHNsb3QsIGxldmVsKTsKLQkJcmV0dXJuICpsYXJnZXBhZ2VfaWR4OworCQlsaW5mbyA9IGxwYWdlX2luZm9fc2xvdChnZm4sIHNsb3QsIGxldmVsKTsKKwkJcmV0dXJuIGxpbmZvLT53cml0ZV9jb3VudDsKIAl9CiAKIAlyZXR1cm4gMTsKQEAgLTU1OSwxNCArNTU0LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtYXBwaW5nX2xldmVsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgbGFyZ2VfZ2ZuKQorc3RhdGljIGJvb2wgbWFwcGluZ19sZXZlbF9kaXJ0eV9iaXRtYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBsYXJnZV9nZm4pCiB7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdDsKLQlpbnQgaG9zdF9sZXZlbCwgbGV2ZWwsIG1heF9sZXZlbDsKLQogCXNsb3QgPSBnZm5fdG9fbWVtc2xvdCh2Y3B1LT5rdm0sIGxhcmdlX2dmbik7CiAJaWYgKHNsb3QgJiYgc2xvdC0+ZGlydHlfYml0bWFwKQotCQlyZXR1cm4gUFRfUEFHRV9UQUJMRV9MRVZFTDsKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IG1hcHBpbmdfbGV2ZWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBsYXJnZV9nZm4pCit7CisJaW50IGhvc3RfbGV2ZWwsIGxldmVsLCBtYXhfbGV2ZWw7CiAKIAlob3N0X2xldmVsID0gaG9zdF9tYXBwaW5nX2xldmVsKHZjcHUtPmt2bSwgbGFyZ2VfZ2ZuKTsKIApAQCAtNTkwLDE2ICs1ODksMTUgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nICpnZm5fdG9fcm1hcChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgaW50IGxldmVsKQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3Q7Ci0JdW5zaWduZWQgbG9uZyBpZHg7CisJc3RydWN0IGt2bV9scGFnZV9pbmZvICpsaW5mbzsKIAogCXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CiAJaWYgKGxpa2VseShsZXZlbCA9PSBQVF9QQUdFX1RBQkxFX0xFVkVMKSkKIAkJcmV0dXJuICZzbG90LT5ybWFwW2dmbiAtIHNsb3QtPmJhc2VfZ2ZuXTsKIAotCWlkeCA9IChnZm4gPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCkpIC0KLQkJKHNsb3QtPmJhc2VfZ2ZuID4+IEtWTV9IUEFHRV9HRk5fU0hJRlQobGV2ZWwpKTsKKwlsaW5mbyA9IGxwYWdlX2luZm9fc2xvdChnZm4sIHNsb3QsIGxldmVsKTsKIAotCXJldHVybiAmc2xvdC0+bHBhZ2VfaW5mb1tsZXZlbCAtIDJdW2lkeF0ucm1hcF9wZGU7CisJcmV0dXJuICZsaW5mby0+cm1hcF9wZGU7CiB9CiAKIC8qCkBAIC04ODcsMTkgKzg4NSwxNiBAQAogCQllbmQgPSBzdGFydCArIChtZW1zbG90LT5ucGFnZXMgPDwgUEFHRV9TSElGVCk7CiAJCWlmIChodmEgPj0gc3RhcnQgJiYgaHZhIDwgZW5kKSB7CiAJCQlnZm5fdCBnZm5fb2Zmc2V0ID0gKGh2YSAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUOworCQkJZ2ZuX3QgZ2ZuID0gbWVtc2xvdC0+YmFzZV9nZm4gKyBnZm5fb2Zmc2V0OwogCiAJCQlyZXQgPSBoYW5kbGVyKGt2bSwgJm1lbXNsb3QtPnJtYXBbZ2ZuX29mZnNldF0sIGRhdGEpOwogCiAJCQlmb3IgKGogPSAwOyBqIDwgS1ZNX05SX1BBR0VfU0laRVMgLSAxOyArK2opIHsKLQkJCQl1bnNpZ25lZCBsb25nIGlkeDsKLQkJCQlpbnQgc2g7CisJCQkJc3RydWN0IGt2bV9scGFnZV9pbmZvICpsaW5mbzsKIAotCQkJCXNoID0gS1ZNX0hQQUdFX0dGTl9TSElGVChQVF9ESVJFQ1RPUllfTEVWRUwraik7Ci0JCQkJaWR4ID0gKChtZW1zbG90LT5iYXNlX2dmbitnZm5fb2Zmc2V0KSA+PiBzaCkgLQotCQkJCQkobWVtc2xvdC0+YmFzZV9nZm4gPj4gc2gpOwotCQkJCXJldCB8PSBoYW5kbGVyKGt2bSwKLQkJCQkJJm1lbXNsb3QtPmxwYWdlX2luZm9bal1baWR4XS5ybWFwX3BkZSwKLQkJCQkJZGF0YSk7CisJCQkJbGluZm8gPSBscGFnZV9pbmZvX3Nsb3QoZ2ZuLCBtZW1zbG90LAorCQkJCQkJCVBUX0RJUkVDVE9SWV9MRVZFTCArIGopOworCQkJCXJldCB8PSBoYW5kbGVyKGt2bSwgJmxpbmZvLT5ybWFwX3BkZSwgZGF0YSk7CiAJCQl9CiAJCQl0cmFjZV9rdm1fYWdlX3BhZ2UoaHZhLCBtZW1zbG90LCByZXQpOwogCQkJcmV0dmFsIHw9IHJldDsKQEAgLTk1MCw2ICs5NDUsMzUgQEAKIAlyZXR1cm4geW91bmc7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX3Rlc3RfYWdlX3JtYXBwKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyAqcm1hcHAsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdTY0ICpzcHRlOworCWludCB5b3VuZyA9IDA7CisKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gYWNjZXNzIGJpdCBpbiB0aGUgc2Vjb25kYXJ5IHB0ZSBzZXQgYnkgdGhlCisJICogaGFyZHdhcmUgaXQncyB1cCB0byBndXAtZmFzdC9ndXAgdG8gc2V0IHRoZSBhY2Nlc3MgYml0IGluCisJICogdGhlIHByaW1hcnkgcHRlIG9yIGluIHRoZSBwYWdlIHN0cnVjdHVyZS4KKwkgKi8KKwlpZiAoIXNoYWRvd19hY2Nlc3NlZF9tYXNrKQorCQlnb3RvIG91dDsKKworCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgTlVMTCk7CisJd2hpbGUgKHNwdGUpIHsKKwkJdTY0IF9zcHRlID0gKnNwdGU7CisJCUJVR19PTighKF9zcHRlICYgUFRfUFJFU0VOVF9NQVNLKSk7CisJCXlvdW5nID0gX3NwdGUgJiBQVF9BQ0NFU1NFRF9NQVNLOworCQlpZiAoeW91bmcpIHsKKwkJCXlvdW5nID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgc3B0ZSk7CisJfQorb3V0OgorCXJldHVybiB5b3VuZzsKK30KKwogI2RlZmluZSBSTUFQX1JFQ1lDTEVfVEhSRVNIT0xEIDEwMDAKIAogc3RhdGljIHZvaWQgcm1hcF9yZWN5Y2xlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICpzcHRlLCBnZm5fdCBnZm4pCkBAIC05NzAsNiArOTk0LDExIEBACiAJcmV0dXJuIGt2bV9oYW5kbGVfaHZhKGt2bSwgaHZhLCAwLCBrdm1fYWdlX3JtYXBwKTsKIH0KIAoraW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSkKK3sKKwlyZXR1cm4ga3ZtX2hhbmRsZV9odmEoa3ZtLCBodmEsIDAsIGt2bV90ZXN0X2FnZV9ybWFwcCk7Cit9CisKICNpZmRlZiBNTVVfREVCVUcKIHN0YXRpYyBpbnQgaXNfZW1wdHlfc2hhZG93X3BhZ2UodTY0ICpzcHQpCiB7CkBAIC0xMTYxLDcgKzExOTAsNyBAQAogfQogCiBzdGF0aWMgaW50IG5vbnBhZ2luZ19zeW5jX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJICAgICAgIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCBib29sIGNsZWFyX3Vuc3luYykKKwkJCSAgICAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCkKIHsKIAlyZXR1cm4gMTsKIH0KQEAgLTEyOTEsNyArMTMyMCw3IEBACiAJaWYgKGNsZWFyX3Vuc3luYykKIAkJa3ZtX3VubGlua191bnN5bmNfcGFnZSh2Y3B1LT5rdm0sIHNwKTsKIAotCWlmICh2Y3B1LT5hcmNoLm1tdS5zeW5jX3BhZ2UodmNwdSwgc3AsIGNsZWFyX3Vuc3luYykpIHsKKwlpZiAodmNwdS0+YXJjaC5tbXUuc3luY19wYWdlKHZjcHUsIHNwKSkgewogCQlrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzcCwgaW52YWxpZF9saXN0KTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTMzMiwxMiArMTM2MSwxMiBAQAogCQkJY29udGludWU7CiAKIAkJV0FSTl9PTihzLT5yb2xlLmxldmVsICE9IFBUX1BBR0VfVEFCTEVfTEVWRUwpOworCQlrdm1fdW5saW5rX3Vuc3luY19wYWdlKHZjcHUtPmt2bSwgcyk7CiAJCWlmICgocy0+cm9sZS5jcjRfcGFlICE9ICEhaXNfcGFlKHZjcHUpKSB8fAotCQkJKHZjcHUtPmFyY2gubW11LnN5bmNfcGFnZSh2Y3B1LCBzLCB0cnVlKSkpIHsKKwkJCSh2Y3B1LT5hcmNoLm1tdS5zeW5jX3BhZ2UodmNwdSwgcykpKSB7CiAJCQlrdm1fbW11X3ByZXBhcmVfemFwX3BhZ2UodmNwdS0+a3ZtLCBzLCAmaW52YWxpZF9saXN0KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWt2bV91bmxpbmtfdW5zeW5jX3BhZ2UodmNwdS0+a3ZtLCBzKTsKIAkJZmx1c2ggPSB0cnVlOwogCX0KIApAQCAtMTk2Myw5ICsxOTkyLDkgQEAKIAkJICAgIHVuc2lnbmVkIHB0ZV9hY2Nlc3MsIGludCB1c2VyX2ZhdWx0LAogCQkgICAgaW50IHdyaXRlX2ZhdWx0LCBpbnQgZGlydHksIGludCBsZXZlbCwKIAkJICAgIGdmbl90IGdmbiwgcGZuX3QgcGZuLCBib29sIHNwZWN1bGF0aXZlLAotCQkgICAgYm9vbCBjYW5fdW5zeW5jLCBib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbikKKwkJICAgIGJvb2wgY2FuX3Vuc3luYywgYm9vbCBob3N0X3dyaXRhYmxlKQogewotCXU2NCBzcHRlOworCXU2NCBzcHRlLCBlbnRyeSA9ICpzcHRlcDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qCkBAIC0xOTczLDcgKzIwMDIsNyBAQAogCSAqIHdoZXRoZXIgdGhlIGd1ZXN0IGFjdHVhbGx5IHVzZWQgdGhlIHB0ZSAoaW4gb3JkZXIgdG8gZGV0ZWN0CiAJICogZGVtYW5kIHBhZ2luZykuCiAJICovCi0Jc3B0ZSA9IHNoYWRvd19iYXNlX3ByZXNlbnRfcHRlOworCXNwdGUgPSBQVF9QUkVTRU5UX01BU0s7CiAJaWYgKCFzcGVjdWxhdGl2ZSkKIAkJc3B0ZSB8PSBzaGFkb3dfYWNjZXNzZWRfbWFzazsKIAlpZiAoIWRpcnR5KQpAQCAtMTk5MCw4ICsyMDE5LDEwIEBACiAJCXNwdGUgfD0ga3ZtX3g4Nl9vcHMtPmdldF9tdF9tYXNrKHZjcHUsIGdmbiwKIAkJCWt2bV9pc19tbWlvX3BmbihwZm4pKTsKIAotCWlmIChyZXNldF9ob3N0X3Byb3RlY3Rpb24pCisJaWYgKGhvc3Rfd3JpdGFibGUpCiAJCXNwdGUgfD0gU1BURV9IT1NUX1dSSVRFQUJMRTsKKwllbHNlCisJCXB0ZV9hY2Nlc3MgJj0gfkFDQ19XUklURV9NQVNLOwogCiAJc3B0ZSB8PSAodTY0KXBmbiA8PCBQQUdFX1NISUZUOwogCkBAIC0yMDM2LDYgKzIwNjcsMTQgQEAKIAogc2V0X3B0ZToKIAl1cGRhdGVfc3B0ZShzcHRlcCwgc3B0ZSk7CisJLyoKKwkgKiBJZiB3ZSBvdmVyd3JpdGUgYSB3cml0YWJsZSBzcHRlIHdpdGggYSByZWFkLW9ubHkgb25lIHdlCisJICogc2hvdWxkIGZsdXNoIHJlbW90ZSBUTEJzLiBPdGhlcndpc2Ugcm1hcF93cml0ZV9wcm90ZWN0CisJICogd2lsbCBmaW5kIGEgcmVhZC1vbmx5IHNwdGUsIGV2ZW4gdGhvdWdoIHRoZSB3cml0YWJsZSBzcHRlCisJICogbWlnaHQgYmUgY2FjaGVkIG9uIGEgQ1BVJ3MgVExCLgorCSAqLworCWlmIChpc193cml0YWJsZV9wdGUoZW50cnkpICYmICFpc193cml0YWJsZV9wdGUoKnNwdGVwKSkKKwkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHZjcHUtPmt2bSk7CiBkb25lOgogCXJldHVybiByZXQ7CiB9CkBAIC0yMDQ1LDcgKzIwODQsNyBAQAogCQkJIGludCB1c2VyX2ZhdWx0LCBpbnQgd3JpdGVfZmF1bHQsIGludCBkaXJ0eSwKIAkJCSBpbnQgKnB0d3JpdGUsIGludCBsZXZlbCwgZ2ZuX3QgZ2ZuLAogCQkJIHBmbl90IHBmbiwgYm9vbCBzcGVjdWxhdGl2ZSwKLQkJCSBib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbikKKwkJCSBib29sIGhvc3Rfd3JpdGFibGUpCiB7CiAJaW50IHdhc19ybWFwcGVkID0gMDsKIAlpbnQgcm1hcF9jb3VudDsKQEAgLTIwODAsNyArMjExOSw3IEBACiAKIAlpZiAoc2V0X3NwdGUodmNwdSwgc3B0ZXAsIHB0ZV9hY2Nlc3MsIHVzZXJfZmF1bHQsIHdyaXRlX2ZhdWx0LAogCQkgICAgICBkaXJ0eSwgbGV2ZWwsIGdmbiwgcGZuLCBzcGVjdWxhdGl2ZSwgdHJ1ZSwKLQkJICAgICAgcmVzZXRfaG9zdF9wcm90ZWN0aW9uKSkgeworCQkgICAgICBob3N0X3dyaXRhYmxlKSkgewogCQlpZiAod3JpdGVfZmF1bHQpCiAJCQkqcHR3cml0ZSA9IDE7CiAJCWt2bV9tbXVfZmx1c2hfdGxiKHZjcHUpOwpAQCAtMjIxMSw3ICsyMjUwLDggQEAKIH0KIAogc3RhdGljIGludCBfX2RpcmVjdF9tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCB2LCBpbnQgd3JpdGUsCi0JCQlpbnQgbGV2ZWwsIGdmbl90IGdmbiwgcGZuX3QgcGZuKQorCQkJaW50IG1hcF93cml0YWJsZSwgaW50IGxldmVsLCBnZm5fdCBnZm4sIHBmbl90IHBmbiwKKwkJCWJvb2wgcHJlZmF1bHQpCiB7CiAJc3RydWN0IGt2bV9zaGFkb3dfd2Fsa19pdGVyYXRvciBpdGVyYXRvcjsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKQEAgLTIyMjAsOSArMjI2MCwxMSBAQAogCiAJZm9yX2VhY2hfc2hhZG93X2VudHJ5KHZjcHUsICh1NjQpZ2ZuIDw8IFBBR0VfU0hJRlQsIGl0ZXJhdG9yKSB7CiAJCWlmIChpdGVyYXRvci5sZXZlbCA9PSBsZXZlbCkgewotCQkJbW11X3NldF9zcHRlKHZjcHUsIGl0ZXJhdG9yLnNwdGVwLCBBQ0NfQUxMLCBBQ0NfQUxMLAorCQkJdW5zaWduZWQgcHRlX2FjY2VzcyA9IEFDQ19BTEw7CisKKwkJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdGVyYXRvci5zcHRlcCwgQUNDX0FMTCwgcHRlX2FjY2VzcywKIAkJCQkgICAgIDAsIHdyaXRlLCAxLCAmcHRfd3JpdGUsCi0JCQkJICAgICBsZXZlbCwgZ2ZuLCBwZm4sIGZhbHNlLCB0cnVlKTsKKwkJCQkgICAgIGxldmVsLCBnZm4sIHBmbiwgcHJlZmF1bHQsIG1hcF93cml0YWJsZSk7CiAJCQlkaXJlY3RfcHRlX3ByZWZldGNoKHZjcHUsIGl0ZXJhdG9yLnNwdGVwKTsKIAkJCSsrdmNwdS0+c3RhdC5wZl9maXhlZDsKIAkJCWJyZWFrOwpAQCAtMjI3NywyNyArMjMxOSw4MSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG5vbnBhZ2luZ19tYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCB2LCBpbnQgd3JpdGUsIGdmbl90IGdmbikKK3N0YXRpYyB2b2lkIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2FkanVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJCWdmbl90ICpnZm5wLCBwZm5fdCAqcGZucCwgaW50ICpsZXZlbHApCit7CisJcGZuX3QgcGZuID0gKnBmbnA7CisJZ2ZuX3QgZ2ZuID0gKmdmbnA7CisJaW50IGxldmVsID0gKmxldmVscDsKKworCS8qCisJICogQ2hlY2sgaWYgaXQncyBhIHRyYW5zcGFyZW50IGh1Z2VwYWdlLiBJZiB0aGlzIHdvdWxkIGJlIGFuCisJICogaHVnZXRsYmZzIHBhZ2UsIGxldmVsIHdvdWxkbid0IGJlIHNldCB0bworCSAqIFBUX1BBR0VfVEFCTEVfTEVWRUwgYW5kIHRoZXJlIHdvdWxkIGJlIG5vIGFkanVzdG1lbnQgZG9uZQorCSAqIGhlcmUuCisJICovCisJaWYgKCFpc19lcnJvcl9wZm4ocGZuKSAmJiAha3ZtX2lzX21taW9fcGZuKHBmbikgJiYKKwkgICAgbGV2ZWwgPT0gUFRfUEFHRV9UQUJMRV9MRVZFTCAmJgorCSAgICBQYWdlVHJhbnNDb21wb3VuZChwZm5fdG9fcGFnZShwZm4pKSAmJgorCSAgICAhaGFzX3dycHJvdGVjdGVkX3BhZ2UodmNwdS0+a3ZtLCBnZm4sIFBUX0RJUkVDVE9SWV9MRVZFTCkpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXNrOworCQkvKgorCQkgKiBtbXVfbm90aWZpZXJfcmV0cnkgd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlIGhvbGQgdGhlCisJCSAqIG1tdV9sb2NrIGhlcmUsIHNvIHRoZSBwbWQgY2FuJ3QgYmVjb21lIHNwbGl0dGluZworCQkgKiBmcm9tIHVuZGVyIHVzLCBhbmQgaW4gdHVybgorCQkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIGNhbid0IHJ1biBmcm9tIHVuZGVyCisJCSAqIHVzIGFuZCB3ZSBjYW4gc2FmZWx5IHRyYW5zZmVyIHRoZSByZWZjb3VudCBmcm9tCisJCSAqIFBHX3RhaWwgdG8gUEdfaGVhZCBhcyB3ZSBzd2l0Y2ggdGhlIHBmbiB0byB0YWlsIHRvCisJCSAqIGhlYWQuCisJCSAqLworCQkqbGV2ZWxwID0gbGV2ZWwgPSBQVF9ESVJFQ1RPUllfTEVWRUw7CisJCW1hc2sgPSBLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSAtIDE7CisJCVZNX0JVR19PTigoZ2ZuICYgbWFzaykgIT0gKHBmbiAmIG1hc2spKTsKKwkJaWYgKHBmbiAmIG1hc2spIHsKKwkJCWdmbiAmPSB+bWFzazsKKwkJCSpnZm5wID0gZ2ZuOworCQkJa3ZtX3JlbGVhc2VfcGZuX2NsZWFuKHBmbik7CisJCQlwZm4gJj0gfm1hc2s7CisJCQlpZiAoIWdldF9wYWdlX3VubGVzc196ZXJvKHBmbl90b19wYWdlKHBmbikpKQorCQkJCUJVRygpOworCQkJKnBmbnAgPSBwZm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBib29sIHRyeV9hc3luY19wZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgcHJlZmF1bHQsIGdmbl90IGdmbiwKKwkJCSBndmFfdCBndmEsIHBmbl90ICpwZm4sIGJvb2wgd3JpdGUsIGJvb2wgKndyaXRhYmxlKTsKKworc3RhdGljIGludCBub25wYWdpbmdfbWFwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdiwgaW50IHdyaXRlLCBnZm5fdCBnZm4sCisJCQkgYm9vbCBwcmVmYXVsdCkKIHsKIAlpbnQgcjsKIAlpbnQgbGV2ZWw7CisJaW50IGZvcmNlX3B0X2xldmVsOwogCXBmbl90IHBmbjsKIAl1bnNpZ25lZCBsb25nIG1tdV9zZXE7CisJYm9vbCBtYXBfd3JpdGFibGU7CiAKLQlsZXZlbCA9IG1hcHBpbmdfbGV2ZWwodmNwdSwgZ2ZuKTsKKwlmb3JjZV9wdF9sZXZlbCA9IG1hcHBpbmdfbGV2ZWxfZGlydHlfYml0bWFwKHZjcHUsIGdmbik7CisJaWYgKGxpa2VseSghZm9yY2VfcHRfbGV2ZWwpKSB7CisJCWxldmVsID0gbWFwcGluZ19sZXZlbCh2Y3B1LCBnZm4pOworCQkvKgorCQkgKiBUaGlzIHBhdGggYnVpbGRzIGEgUEFFIHBhZ2V0YWJsZSAtIHNvIHdlIGNhbiBtYXAKKwkJICogMm1iIHBhZ2VzIGF0IG1heGltdW0uIFRoZXJlZm9yZSBjaGVjayBpZiB0aGUgbGV2ZWwKKwkJICogaXMgbGFyZ2VyIHRoYW4gdGhhdC4KKwkJICovCisJCWlmIChsZXZlbCA+IFBUX0RJUkVDVE9SWV9MRVZFTCkKKwkJCWxldmVsID0gUFRfRElSRUNUT1JZX0xFVkVMOwogCi0JLyoKLQkgKiBUaGlzIHBhdGggYnVpbGRzIGEgUEFFIHBhZ2V0YWJsZSAtIHNvIHdlIGNhbiBtYXAgMm1iIHBhZ2VzIGF0Ci0JICogbWF4aW11bS4gVGhlcmVmb3JlIGNoZWNrIGlmIHRoZSBsZXZlbCBpcyBsYXJnZXIgdGhhbiB0aGF0LgotCSAqLwotCWlmIChsZXZlbCA+IFBUX0RJUkVDVE9SWV9MRVZFTCkKLQkJbGV2ZWwgPSBQVF9ESVJFQ1RPUllfTEVWRUw7Ci0KLQlnZm4gJj0gfihLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSAtIDEpOworCQlnZm4gJj0gfihLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSAtIDEpOworCX0gZWxzZQorCQlsZXZlbCA9IFBUX1BBR0VfVEFCTEVfTEVWRUw7CiAKIAltbXVfc2VxID0gdmNwdS0+a3ZtLT5tbXVfbm90aWZpZXJfc2VxOwogCXNtcF9ybWIoKTsKLQlwZm4gPSBnZm5fdG9fcGZuKHZjcHUtPmt2bSwgZ2ZuKTsKKworCWlmICh0cnlfYXN5bmNfcGYodmNwdSwgcHJlZmF1bHQsIGdmbiwgdiwgJnBmbiwgd3JpdGUsICZtYXBfd3JpdGFibGUpKQorCQlyZXR1cm4gMDsKIAogCS8qIG1taW8gKi8KIAlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCkBAIC0yMzA3LDcgKzI0MDMsMTAgQEAKIAlpZiAobW11X25vdGlmaWVyX3JldHJ5KHZjcHUsIG1tdV9zZXEpKQogCQlnb3RvIG91dF91bmxvY2s7CiAJa3ZtX21tdV9mcmVlX3NvbWVfcGFnZXModmNwdSk7Ci0JciA9IF9fZGlyZWN0X21hcCh2Y3B1LCB2LCB3cml0ZSwgbGV2ZWwsIGdmbiwgcGZuKTsKKwlpZiAobGlrZWx5KCFmb3JjZV9wdF9sZXZlbCkpCisJCXRyYW5zcGFyZW50X2h1Z2VwYWdlX2FkanVzdCh2Y3B1LCAmZ2ZuLCAmcGZuLCAmbGV2ZWwpOworCXIgPSBfX2RpcmVjdF9tYXAodmNwdSwgdiwgd3JpdGUsIG1hcF93cml0YWJsZSwgbGV2ZWwsIGdmbiwgcGZuLAorCQkJIHByZWZhdWx0KTsKIAlzcGluX3VubG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAKIApAQCAtMjUzMCw2ICsyNjI5LDcgQEAKIAkJaHBhX3Qgcm9vdCA9IHZjcHUtPmFyY2gubW11LnJvb3RfaHBhOwogCQlzcCA9IHBhZ2VfaGVhZGVyKHJvb3QpOwogCQltbXVfc3luY19jaGlsZHJlbih2Y3B1LCBzcCk7CisJCXRyYWNlX2t2bV9tbXVfYXVkaXQodmNwdSwgQVVESVRfUE9TVF9TWU5DKTsKIAkJcmV0dXJuOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CkBAIC0yNTUyLDIzICsyNjUyLDI0IEBACiB9CiAKIHN0YXRpYyBncGFfdCBub25wYWdpbmdfZ3ZhX3RvX2dwYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IHZhZGRyLAotCQkJCSAgdTMyIGFjY2VzcywgdTMyICplcnJvcikKKwkJCQkgIHUzMiBhY2Nlc3MsIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7Ci0JaWYgKGVycm9yKQotCQkqZXJyb3IgPSAwOworCWlmIChleGNlcHRpb24pCisJCWV4Y2VwdGlvbi0+ZXJyb3JfY29kZSA9IDA7CiAJcmV0dXJuIHZhZGRyOwogfQogCiBzdGF0aWMgZ3BhX3Qgbm9ucGFnaW5nX2d2YV90b19ncGFfbmVzdGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdmFkZHIsCi0JCQkJCSB1MzIgYWNjZXNzLCB1MzIgKmVycm9yKQorCQkJCQkgdTMyIGFjY2VzcywKKwkJCQkJIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7Ci0JaWYgKGVycm9yKQotCQkqZXJyb3IgPSAwOworCWlmIChleGNlcHRpb24pCisJCWV4Y2VwdGlvbi0+ZXJyb3JfY29kZSA9IDA7CiAJcmV0dXJuIHZjcHUtPmFyY2gubmVzdGVkX21tdS50cmFuc2xhdGVfZ3BhKHZjcHUsIHZhZGRyLCBhY2Nlc3MpOwogfQogCiBzdGF0aWMgaW50IG5vbnBhZ2luZ19wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLAotCQkJCXUzMiBlcnJvcl9jb2RlKQorCQkJCXUzMiBlcnJvcl9jb2RlLCBib29sIHByZWZhdWx0KQogewogCWdmbl90IGdmbjsKIAlpbnQgcjsKQEAgLTI1ODQsMTcgKzI2ODUsNjggQEAKIAlnZm4gPSBndmEgPj4gUEFHRV9TSElGVDsKIAogCXJldHVybiBub25wYWdpbmdfbWFwKHZjcHUsIGd2YSAmIFBBR0VfTUFTSywKLQkJCSAgICAgZXJyb3JfY29kZSAmIFBGRVJSX1dSSVRFX01BU0ssIGdmbik7CisJCQkgICAgIGVycm9yX2NvZGUgJiBQRkVSUl9XUklURV9NQVNLLCBnZm4sIHByZWZhdWx0KTsKIH0KIAotc3RhdGljIGludCB0ZHBfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGdwYSwKLQkJCQl1MzIgZXJyb3JfY29kZSkKK3N0YXRpYyBpbnQga3ZtX2FyY2hfc2V0dXBfYXN5bmNfcGYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIGdmbl90IGdmbikKK3sKKwlzdHJ1Y3Qga3ZtX2FyY2hfYXN5bmNfcGYgYXJjaDsKKworCWFyY2gudG9rZW4gPSAodmNwdS0+YXJjaC5hcGYuaWQrKyA8PCAxMikgfCB2Y3B1LT52Y3B1X2lkOworCWFyY2guZ2ZuID0gZ2ZuOworCWFyY2guZGlyZWN0X21hcCA9IHZjcHUtPmFyY2gubW11LmRpcmVjdF9tYXA7CisJYXJjaC5jcjMgPSB2Y3B1LT5hcmNoLm1tdS5nZXRfY3IzKHZjcHUpOworCisJcmV0dXJuIGt2bV9zZXR1cF9hc3luY19wZih2Y3B1LCBndmEsIGdmbiwgJmFyY2gpOworfQorCitzdGF0aWMgYm9vbCBjYW5fZG9fYXN5bmNfcGYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICh1bmxpa2VseSghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSB8fAorCQkgICAgIGt2bV9ldmVudF9uZWVkc19yZWluamVjdGlvbih2Y3B1KSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBrdm1feDg2X29wcy0+aW50ZXJydXB0X2FsbG93ZWQodmNwdSk7Cit9CisKK3N0YXRpYyBib29sIHRyeV9hc3luY19wZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgcHJlZmF1bHQsIGdmbl90IGdmbiwKKwkJCSBndmFfdCBndmEsIHBmbl90ICpwZm4sIGJvb2wgd3JpdGUsIGJvb2wgKndyaXRhYmxlKQoreworCWJvb2wgYXN5bmM7CisKKwkqcGZuID0gZ2ZuX3RvX3Bmbl9hc3luYyh2Y3B1LT5rdm0sIGdmbiwgJmFzeW5jLCB3cml0ZSwgd3JpdGFibGUpOworCisJaWYgKCFhc3luYykKKwkJcmV0dXJuIGZhbHNlOyAvKiAqcGZuIGhhcyBjb3JyZWN0IHBhZ2UgYWxyZWFkeSAqLworCisJcHV0X3BhZ2UocGZuX3RvX3BhZ2UoKnBmbikpOworCisJaWYgKCFwcmVmYXVsdCAmJiBjYW5fZG9fYXN5bmNfcGYodmNwdSkpIHsKKwkJdHJhY2Vfa3ZtX3RyeV9hc3luY19nZXRfcGFnZShndmEsIGdmbik7CisJCWlmIChrdm1fZmluZF9hc3luY19wZl9nZm4odmNwdSwgZ2ZuKSkgeworCQkJdHJhY2Vfa3ZtX2FzeW5jX3BmX2RvdWJsZWZhdWx0KGd2YSwgZ2ZuKTsKKwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9BUEZfSEFMVCwgdmNwdSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIGlmIChrdm1fYXJjaF9zZXR1cF9hc3luY19wZih2Y3B1LCBndmEsIGdmbikpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkqcGZuID0gZ2ZuX3RvX3Bmbl9wcm90KHZjcHUtPmt2bSwgZ2ZuLCB3cml0ZSwgd3JpdGFibGUpOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHRkcF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3BhLCB1MzIgZXJyb3JfY29kZSwKKwkJCSAgYm9vbCBwcmVmYXVsdCkKIHsKIAlwZm5fdCBwZm47CiAJaW50IHI7CiAJaW50IGxldmVsOworCWludCBmb3JjZV9wdF9sZXZlbDsKIAlnZm5fdCBnZm4gPSBncGEgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIG1tdV9zZXE7CisJaW50IHdyaXRlID0gZXJyb3JfY29kZSAmIFBGRVJSX1dSSVRFX01BU0s7CisJYm9vbCBtYXBfd3JpdGFibGU7CiAKIAlBU1NFUlQodmNwdSk7CiAJQVNTRVJUKFZBTElEX1BBR0UodmNwdS0+YXJjaC5tbXUucm9vdF9ocGEpKTsKQEAgLTI2MDMsMjEgKzI3NTUsMzAgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlsZXZlbCA9IG1hcHBpbmdfbGV2ZWwodmNwdSwgZ2ZuKTsKLQotCWdmbiAmPSB+KEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpIC0gMSk7CisJZm9yY2VfcHRfbGV2ZWwgPSBtYXBwaW5nX2xldmVsX2RpcnR5X2JpdG1hcCh2Y3B1LCBnZm4pOworCWlmIChsaWtlbHkoIWZvcmNlX3B0X2xldmVsKSkgeworCQlsZXZlbCA9IG1hcHBpbmdfbGV2ZWwodmNwdSwgZ2ZuKTsKKwkJZ2ZuICY9IH4oS1ZNX1BBR0VTX1BFUl9IUEFHRShsZXZlbCkgLSAxKTsKKwl9IGVsc2UKKwkJbGV2ZWwgPSBQVF9QQUdFX1RBQkxFX0xFVkVMOwogCiAJbW11X3NlcSA9IHZjcHUtPmt2bS0+bW11X25vdGlmaWVyX3NlcTsKIAlzbXBfcm1iKCk7Ci0JcGZuID0gZ2ZuX3RvX3Bmbih2Y3B1LT5rdm0sIGdmbik7CisKKwlpZiAodHJ5X2FzeW5jX3BmKHZjcHUsIHByZWZhdWx0LCBnZm4sIGdwYSwgJnBmbiwgd3JpdGUsICZtYXBfd3JpdGFibGUpKQorCQlyZXR1cm4gMDsKKworCS8qIG1taW8gKi8KIAlpZiAoaXNfZXJyb3JfcGZuKHBmbikpCiAJCXJldHVybiBrdm1faGFuZGxlX2JhZF9wYWdlKHZjcHUtPmt2bSwgZ2ZuLCBwZm4pOwogCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJaWYgKG1tdV9ub3RpZmllcl9yZXRyeSh2Y3B1LCBtbXVfc2VxKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOwotCXIgPSBfX2RpcmVjdF9tYXAodmNwdSwgZ3BhLCBlcnJvcl9jb2RlICYgUEZFUlJfV1JJVEVfTUFTSywKLQkJCSBsZXZlbCwgZ2ZuLCBwZm4pOworCWlmIChsaWtlbHkoIWZvcmNlX3B0X2xldmVsKSkKKwkJdHJhbnNwYXJlbnRfaHVnZXBhZ2VfYWRqdXN0KHZjcHUsICZnZm4sICZwZm4sICZsZXZlbCk7CisJciA9IF9fZGlyZWN0X21hcCh2Y3B1LCBncGEsIHdyaXRlLCBtYXBfd3JpdGFibGUsCisJCQkgbGV2ZWwsIGdmbiwgcGZuLCBwcmVmYXVsdCk7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogCiAJcmV0dXJuIHI7CkBAIC0yNjU5LDE4ICsyODIwLDE5IEBACiAKIHN0YXRpYyB2b2lkIHBhZ2luZ19uZXdfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlwZ3ByaW50aygiJXM6IGNyMyAlbHhcbiIsIF9fZnVuY19fLCB2Y3B1LT5hcmNoLmNyMyk7CisJcGdwcmludGsoIiVzOiBjcjMgJWx4XG4iLCBfX2Z1bmNfXywga3ZtX3JlYWRfY3IzKHZjcHUpKTsKIAltbXVfZnJlZV9yb290cyh2Y3B1KTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuIHZjcHUtPmFyY2guY3IzOworCXJldHVybiBrdm1fcmVhZF9jcjModmNwdSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluamVjdF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyB2b2lkIGluamVjdF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCkKIHsKLQl2Y3B1LT5hcmNoLm1tdS5pbmplY3RfcGFnZV9mYXVsdCh2Y3B1KTsKKwl2Y3B1LT5hcmNoLm1tdS5pbmplY3RfcGFnZV9mYXVsdCh2Y3B1LCBmYXVsdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHBhZ2luZ19mcmVlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTI4MTYsNiArMjk3OCw3IEBACiB7CiAJc3RydWN0IGt2bV9tbXUgKmNvbnRleHQgPSB2Y3B1LT5hcmNoLndhbGtfbW11OwogCisJY29udGV4dC0+YmFzZV9yb2xlLndvcmQgPSAwOwogCWNvbnRleHQtPm5ld19jcjMgPSBub25wYWdpbmdfbmV3X2NyMzsKIAljb250ZXh0LT5wYWdlX2ZhdWx0ID0gdGRwX3BhZ2VfZmF1bHQ7CiAJY29udGV4dC0+ZnJlZSA9IG5vbnBhZ2luZ19mcmVlOwpAQCAtMzAwOCw5ICszMTcxLDYgQEAKIAkJcmV0dXJuOwogICAgICAgICB9CiAKLQlpZiAoaXNfcnN2ZF9iaXRzX3NldCgmdmNwdS0+YXJjaC5tbXUsICoodTY0ICopbmV3LCBQVF9QQUdFX1RBQkxFX0xFVkVMKSkKLQkJcmV0dXJuOwotCiAJKyt2Y3B1LT5rdm0tPnN0YXQubW11X3B0ZV91cGRhdGVkOwogCWlmICghc3AtPnJvbGUuY3I0X3BhZSkKIAkJcGFnaW5nMzJfdXBkYXRlX3B0ZSh2Y3B1LCBzcCwgc3B0ZSwgbmV3KTsKQEAgLTMyNjQsMTIgKzM0MjQsMTMgQEAKIAl9CiB9CiAKLWludCBrdm1fbW11X3BhZ2VfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBjcjIsIHUzMiBlcnJvcl9jb2RlKQoraW50IGt2bV9tbXVfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGNyMiwgdTMyIGVycm9yX2NvZGUsCisJCSAgICAgICB2b2lkICppbnNuLCBpbnQgaW5zbl9sZW4pCiB7CiAJaW50IHI7CiAJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOwogCi0JciA9IHZjcHUtPmFyY2gubW11LnBhZ2VfZmF1bHQodmNwdSwgY3IyLCBlcnJvcl9jb2RlKTsKKwlyID0gdmNwdS0+YXJjaC5tbXUucGFnZV9mYXVsdCh2Y3B1LCBjcjIsIGVycm9yX2NvZGUsIGZhbHNlKTsKIAlpZiAociA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0zMjgyLDcgKzM0NDMsNyBAQAogCWlmIChyKQogCQlnb3RvIG91dDsKIAotCWVyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCBjcjIsIGVycm9yX2NvZGUsIDApOworCWVyID0geDg2X2VtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgY3IyLCAwLCBpbnNuLCBpbnNuX2xlbik7CiAKIAlzd2l0Y2ggKGVyKSB7CiAJY2FzZSBFTVVMQVRFX0RPTkU6CkBAIC0zMzc3LDExICszNTM4LDE0IEBACiAJCWlmICghdGVzdF9iaXQoc2xvdCwgc3AtPnNsb3RfYml0bWFwKSkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChzcC0+cm9sZS5sZXZlbCAhPSBQVF9QQUdFX1RBQkxFX0xFVkVMKQorCQkJY29udGludWU7CisKIAkJcHQgPSBzcC0+c3B0OwogCQlmb3IgKGkgPSAwOyBpIDwgUFQ2NF9FTlRfUEVSX1BBR0U7ICsraSkKIAkJCS8qIGF2b2lkIFJNVyAqLwogCQkJaWYgKGlzX3dyaXRhYmxlX3B0ZShwdFtpXSkpCi0JCQkJcHRbaV0gJj0gflBUX1dSSVRBQkxFX01BU0s7CisJCQkJdXBkYXRlX3NwdGUoJnB0W2ldLCBwdFtpXSAmIH5QVF9XUklUQUJMRV9NQVNLKTsKIAl9CiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CiB9CkBAIC0zNDYzLDEzICszNjI3LDYgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KG1tdV9wYWdlX2hlYWRlcl9jYWNoZSk7CiB9CiAKLXZvaWQga3ZtX21tdV9tb2R1bGVfZXhpdCh2b2lkKQotewotCW1tdV9kZXN0cm95X2NhY2hlcygpOwotCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJmt2bV90b3RhbF91c2VkX21tdV9wYWdlcyk7Ci0JdW5yZWdpc3Rlcl9zaHJpbmtlcigmbW11X3Nocmlua2VyKTsKLX0KLQogaW50IGt2bV9tbXVfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlwdGVfY2hhaW5fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgia3ZtX3B0ZV9jaGFpbiIsCkBAIC0zNTY2LDcgKzM3MjMsNyBAQAogCiBzdGF0aWMgaW50IGt2bV9wdl9tbXVfZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQkodm9pZClrdm1fc2V0X2NyMyh2Y3B1LCB2Y3B1LT5hcmNoLmNyMyk7CisJKHZvaWQpa3ZtX3NldF9jcjModmNwdSwga3ZtX3JlYWRfY3IzKHZjcHUpKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMzY2MiwxMiArMzgxOSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fbW11X2dldF9zcHRlX2hpZXJhcmNoeSk7CiAKLSNpZmRlZiBDT05GSUdfS1ZNX01NVV9BVURJVAotI2luY2x1ZGUgIm1tdV9hdWRpdC5jIgotI2Vsc2UKLXN0YXRpYyB2b2lkIG1tdV9hdWRpdF9kaXNhYmxlKHZvaWQpIHsgfQotI2VuZGlmCi0KIHZvaWQga3ZtX21tdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlBU1NFUlQodmNwdSk7CkBAIC0zNjc1LDUgKzM4MjYsMTggQEAKIAlkZXN0cm95X2t2bV9tbXUodmNwdSk7CiAJZnJlZV9tbXVfcGFnZXModmNwdSk7CiAJbW11X2ZyZWVfbWVtb3J5X2NhY2hlcyh2Y3B1KTsKK30KKworI2lmZGVmIENPTkZJR19LVk1fTU1VX0FVRElUCisjaW5jbHVkZSAibW11X2F1ZGl0LmMiCisjZWxzZQorc3RhdGljIHZvaWQgbW11X2F1ZGl0X2Rpc2FibGUodm9pZCkgeyB9CisjZW5kaWYKKwordm9pZCBrdm1fbW11X21vZHVsZV9leGl0KHZvaWQpCit7CisJbW11X2Rlc3Ryb3lfY2FjaGVzKCk7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgma3ZtX3RvdGFsX3VzZWRfbW11X3BhZ2VzKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZtbXVfc2hyaW5rZXIpOwogCW1tdV9hdWRpdF9kaXNhYmxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMgYi9hcmNoL3g4Ni9rdm0vbW11X2F1ZGl0LmMKaW5kZXggYmEyYmNkZC4uNWY2MjIzYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL21tdV9hdWRpdC5jCisrKyBiL2FyY2gveDg2L2t2bS9tbXVfYXVkaXQuYwpAQCAtMTksMTEgKzE5LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogCi1zdGF0aWMgaW50IGF1ZGl0X3BvaW50OwotCi0jZGVmaW5lIGF1ZGl0X3ByaW50ayhmbXQsIGFyZ3MuLi4pCQlcCisjZGVmaW5lIGF1ZGl0X3ByaW50ayhrdm0sIGZtdCwgYXJncy4uLikJCVwKIAlwcmludGsoS0VSTl9FUlIgImF1ZGl0OiAoJXMpIGVycm9yOiAiCVwKLQkJZm10LCBhdWRpdF9wb2ludF9uYW1lW2F1ZGl0X3BvaW50XSwgIyNhcmdzKQorCQlmbXQsIGF1ZGl0X3BvaW50X25hbWVba3ZtLT5hcmNoLmF1ZGl0X3BvaW50XSwgIyNhcmdzKQogCiB0eXBlZGVmIHZvaWQgKCppbnNwZWN0X3NwdGVfZm4pIChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCAqc3B0ZXAsIGludCBsZXZlbCk7CiAKQEAgLTk3LDE4ICs5NSwyMSBAQAogCiAJaWYgKHNwLT51bnN5bmMpIHsKIAkJaWYgKGxldmVsICE9IFBUX1BBR0VfVEFCTEVfTEVWRUwpIHsKLQkJCWF1ZGl0X3ByaW50aygidW5zeW5jIHNwOiAlcCBsZXZlbCA9ICVkXG4iLCBzcCwgbGV2ZWwpOworCQkJYXVkaXRfcHJpbnRrKHZjcHUtPmt2bSwgInVuc3luYyBzcDogJXAgIgorCQkJCSAgICAgImxldmVsID0gJWRcbiIsIHNwLCBsZXZlbCk7CiAJCQlyZXR1cm47CiAJCX0KIAogCQlpZiAoKnNwdGVwID09IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGUpIHsKLQkJCWF1ZGl0X3ByaW50aygibm90cmFwIHNwdGUgaW4gdW5zeW5jIHNwOiAlcFxuIiwgc3ApOworCQkJYXVkaXRfcHJpbnRrKHZjcHUtPmt2bSwgIm5vdHJhcCBzcHRlIGluIHVuc3luYyAiCisJCQkJICAgICAic3A6ICVwXG4iLCBzcCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKIAlpZiAoc3AtPnJvbGUuZGlyZWN0ICYmICpzcHRlcCA9PSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKSB7Ci0JCWF1ZGl0X3ByaW50aygibm90cmFwIHNwdGUgaW4gZGlyZWN0IHNwOiAlcFxuIiwgc3ApOworCQlhdWRpdF9wcmludGsodmNwdS0+a3ZtLCAibm90cmFwIHNwdGUgaW4gZGlyZWN0IHNwOiAlcFxuIiwKKwkJCSAgICAgc3ApOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjUsOCArMTI2LDkgQEAKIAogCWhwYSA9ICBwZm4gPDwgUEFHRV9TSElGVDsKIAlpZiAoKCpzcHRlcCAmIFBUNjRfQkFTRV9BRERSX01BU0spICE9IGhwYSkKLQkJYXVkaXRfcHJpbnRrKCJsZXZlbHMgJWQgcGZuICVsbHggaHBhICVsbHggZW50ICVsbHhuIiwKLQkJCQkgICB2Y3B1LT5hcmNoLm1tdS5yb290X2xldmVsLCBwZm4sIGhwYSwgKnNwdGVwKTsKKwkJYXVkaXRfcHJpbnRrKHZjcHUtPmt2bSwgImxldmVscyAlZCBwZm4gJWxseCBocGEgJWxseCAiCisJCQkgICAgICJlbnQgJWxseG4iLCB2Y3B1LT5hcmNoLm1tdS5yb290X2xldmVsLCBwZm4sCisJCQkgICAgIGhwYSwgKnNwdGVwKTsKIH0KIAogc3RhdGljIHZvaWQgaW5zcGVjdF9zcHRlX2hhc19ybWFwKHN0cnVjdCBrdm0gKmt2bSwgdTY0ICpzcHRlcCkKQEAgLTE0Miw4ICsxNDQsOCBAQAogCWlmICghZ2ZuX3RvX21lbXNsb3Qoa3ZtLCBnZm4pKSB7CiAJCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJcmV0dXJuOwotCQlhdWRpdF9wcmludGsoIm5vIG1lbXNsb3QgZm9yIGdmbiAlbGx4XG4iLCBnZm4pOwotCQlhdWRpdF9wcmludGsoImluZGV4ICVsZCBvZiBzcCAoZ2ZuPSVsbHgpXG4iLAorCQlhdWRpdF9wcmludGsoa3ZtLCAibm8gbWVtc2xvdCBmb3IgZ2ZuICVsbHhcbiIsIGdmbik7CisJCWF1ZGl0X3ByaW50ayhrdm0sICJpbmRleCAlbGQgb2Ygc3AgKGdmbj0lbGx4KVxuIiwKIAkJICAgICAgIChsb25nIGludCkoc3B0ZXAgLSByZXZfc3AtPnNwdCksIHJldl9zcC0+Z2ZuKTsKIAkJZHVtcF9zdGFjaygpOwogCQlyZXR1cm47CkBAIC0xNTMsNyArMTU1LDggQEAKIAlpZiAoISpybWFwcCkgewogCQlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKIAkJCXJldHVybjsKLQkJYXVkaXRfcHJpbnRrKCJubyBybWFwIGZvciB3cml0YWJsZSBzcHRlICVsbHhcbiIsICpzcHRlcCk7CisJCWF1ZGl0X3ByaW50ayhrdm0sICJubyBybWFwIGZvciB3cml0YWJsZSBzcHRlICVsbHhcbiIsCisJCQkgICAgICpzcHRlcCk7CiAJCWR1bXBfc3RhY2soKTsKIAl9CiB9CkBAIC0xNjgsOCArMTcxLDkgQEAKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZXApKTsKIAotCWlmIChhdWRpdF9wb2ludCA9PSBBVURJVF9QT1NUX1NZTkMgJiYgc3AtPnVuc3luYykKLQkJYXVkaXRfcHJpbnRrKCJtZWV0IHVuc3luYyBzcCglcCkgYWZ0ZXIgc3luYyByb290LlxuIiwgc3ApOworCWlmICh2Y3B1LT5rdm0tPmFyY2guYXVkaXRfcG9pbnQgPT0gQVVESVRfUE9TVF9TWU5DICYmIHNwLT51bnN5bmMpCisJCWF1ZGl0X3ByaW50ayh2Y3B1LT5rdm0sICJtZWV0IHVuc3luYyBzcCglcCkgYWZ0ZXIgc3luYyAiCisJCQkgICAgICJyb290LlxuIiwgc3ApOwogfQogCiBzdGF0aWMgdm9pZCBjaGVja19tYXBwaW5nc19ybWFwKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCkBAIC0yMDIsOCArMjA2LDkgQEAKIAlzcHRlID0gcm1hcF9uZXh0KGt2bSwgcm1hcHAsIE5VTEwpOwogCXdoaWxlIChzcHRlKSB7CiAJCWlmIChpc193cml0YWJsZV9wdGUoKnNwdGUpKQotCQkJYXVkaXRfcHJpbnRrKCJzaGFkb3cgcGFnZSBoYXMgd3JpdGFibGUgbWFwcGluZ3M6IGdmbiAiCi0JCQkJICAgICAiJWxseCByb2xlICV4XG4iLCBzcC0+Z2ZuLCBzcC0+cm9sZS53b3JkKTsKKwkJCWF1ZGl0X3ByaW50ayhrdm0sICJzaGFkb3cgcGFnZSBoYXMgd3JpdGFibGUgIgorCQkJCSAgICAgIm1hcHBpbmdzOiBnZm4gJWxseCByb2xlICV4XG4iLAorCQkJCSAgICAgc3AtPmdmbiwgc3AtPnJvbGUud29yZCk7CiAJCXNwdGUgPSBybWFwX25leHQoa3ZtLCBybWFwcCwgc3B0ZSk7CiAJfQogfQpAQCAtMjM4LDcgKzI0Myw3IEBACiAJaWYgKCFfX3JhdGVsaW1pdCgmcmF0ZWxpbWl0X3N0YXRlKSkKIAkJcmV0dXJuOwogCi0JYXVkaXRfcG9pbnQgPSBwb2ludDsKKwl2Y3B1LT5rdm0tPmFyY2guYXVkaXRfcG9pbnQgPSBwb2ludDsKIAlhdWRpdF9hbGxfYWN0aXZlX3Nwcyh2Y3B1LT5rdm0pOwogCWF1ZGl0X3ZjcHVfc3B0ZSh2Y3B1KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggY2Q3YTgzMy4uNmJjY2MyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTcyLDcgKzcyLDcgQEAKIAl1bnNpZ25lZCBwdF9hY2Nlc3M7CiAJdW5zaWduZWQgcHRlX2FjY2VzczsKIAlnZm5fdCBnZm47Ci0JdTMyIGVycm9yX2NvZGU7CisJc3RydWN0IHg4Nl9leGNlcHRpb24gZmF1bHQ7CiB9OwogCiBzdGF0aWMgZ2ZuX3QgZ3B0ZV90b19nZm5fbHZsKHB0X2VsZW1lbnRfdCBncHRlLCBpbnQgbHZsKQpAQCAtMjY2LDIxICsyNjYsMjMgQEAKIAlyZXR1cm4gMTsKIAogZXJyb3I6Ci0Jd2Fsa2VyLT5lcnJvcl9jb2RlID0gMDsKKwl3YWxrZXItPmZhdWx0LnZlY3RvciA9IFBGX1ZFQ1RPUjsKKwl3YWxrZXItPmZhdWx0LmVycm9yX2NvZGVfdmFsaWQgPSB0cnVlOworCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSA9IDA7CiAJaWYgKHByZXNlbnQpCi0JCXdhbGtlci0+ZXJyb3JfY29kZSB8PSBQRkVSUl9QUkVTRU5UX01BU0s7CisJCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSB8PSBQRkVSUl9QUkVTRU5UX01BU0s7CiAKLQl3YWxrZXItPmVycm9yX2NvZGUgfD0gd3JpdGVfZmF1bHQgfCB1c2VyX2ZhdWx0OworCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSB8PSB3cml0ZV9mYXVsdCB8IHVzZXJfZmF1bHQ7CiAKIAlpZiAoZmV0Y2hfZmF1bHQgJiYgbW11LT5ueCkKLQkJd2Fsa2VyLT5lcnJvcl9jb2RlIHw9IFBGRVJSX0ZFVENIX01BU0s7CisJCXdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSB8PSBQRkVSUl9GRVRDSF9NQVNLOwogCWlmIChyc3ZkX2ZhdWx0KQotCQl3YWxrZXItPmVycm9yX2NvZGUgfD0gUEZFUlJfUlNWRF9NQVNLOworCQl3YWxrZXItPmZhdWx0LmVycm9yX2NvZGUgfD0gUEZFUlJfUlNWRF9NQVNLOwogCi0JdmNwdS0+YXJjaC5mYXVsdC5hZGRyZXNzICAgID0gYWRkcjsKLQl2Y3B1LT5hcmNoLmZhdWx0LmVycm9yX2NvZGUgPSB3YWxrZXItPmVycm9yX2NvZGU7CisJd2Fsa2VyLT5mYXVsdC5hZGRyZXNzID0gYWRkcjsKKwl3YWxrZXItPmZhdWx0Lm5lc3RlZF9wYWdlX2ZhdWx0ID0gbW11ICE9IHZjcHUtPmFyY2gud2Fsa19tbXU7CiAKLQl0cmFjZV9rdm1fbW11X3dhbGtlcl9lcnJvcih3YWxrZXItPmVycm9yX2NvZGUpOworCXRyYWNlX2t2bV9tbXVfd2Fsa2VyX2Vycm9yKHdhbGtlci0+ZmF1bHQuZXJyb3JfY29kZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5OSwyNSArMzAxLDQyIEBACiAJCQkJCWFkZHIsIGFjY2Vzcyk7CiB9CiAKK3N0YXRpYyBib29sIEZOQU1FKHByZWZldGNoX2ludmFsaWRfZ3B0ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwgdTY0ICpzcHRlLAorCQkJCSAgICBwdF9lbGVtZW50X3QgZ3B0ZSkKK3sKKwl1NjQgbm9ucHJlc2VudCA9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlOworCisJaWYgKGlzX3JzdmRfYml0c19zZXQoJnZjcHUtPmFyY2gubW11LCBncHRlLCBQVF9QQUdFX1RBQkxFX0xFVkVMKSkKKwkJZ290byBub19wcmVzZW50OworCisJaWYgKCFpc19wcmVzZW50X2dwdGUoZ3B0ZSkpIHsKKwkJaWYgKCFzcC0+dW5zeW5jKQorCQkJbm9ucHJlc2VudCA9IHNoYWRvd19ub3RyYXBfbm9ucHJlc2VudF9wdGU7CisJCWdvdG8gbm9fcHJlc2VudDsKKwl9CisKKwlpZiAoIShncHRlICYgUFRfQUNDRVNTRURfTUFTSykpCisJCWdvdG8gbm9fcHJlc2VudDsKKworCXJldHVybiBmYWxzZTsKKworbm9fcHJlc2VudDoKKwlkcm9wX3NwdGUodmNwdS0+a3ZtLCBzcHRlLCBub25wcmVzZW50KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIHZvaWQgRk5BTUUodXBkYXRlX3B0ZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCwKIAkJCSAgICAgIHU2NCAqc3B0ZSwgY29uc3Qgdm9pZCAqcHRlKQogewogCXB0X2VsZW1lbnRfdCBncHRlOwogCXVuc2lnbmVkIHB0ZV9hY2Nlc3M7CiAJcGZuX3QgcGZuOwotCXU2NCBuZXdfc3B0ZTsKIAogCWdwdGUgPSAqKGNvbnN0IHB0X2VsZW1lbnRfdCAqKXB0ZTsKLQlpZiAofmdwdGUgJiAoUFRfUFJFU0VOVF9NQVNLIHwgUFRfQUNDRVNTRURfTUFTSykpIHsKLQkJaWYgKCFpc19wcmVzZW50X2dwdGUoZ3B0ZSkpIHsKLQkJCWlmIChzcC0+dW5zeW5jKQotCQkJCW5ld19zcHRlID0gc2hhZG93X3RyYXBfbm9ucHJlc2VudF9wdGU7Ci0JCQllbHNlCi0JCQkJbmV3X3NwdGUgPSBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlOwotCQkJX19zZXRfc3B0ZShzcHRlLCBuZXdfc3B0ZSk7Ci0JCX0KKwlpZiAoRk5BTUUocHJlZmV0Y2hfaW52YWxpZF9ncHRlKSh2Y3B1LCBzcCwgc3B0ZSwgZ3B0ZSkpCiAJCXJldHVybjsKLQl9CisKIAlwZ3ByaW50aygiJXM6IGdwdGUgJWxseCBzcHRlICVwXG4iLCBfX2Z1bmNfXywgKHU2NClncHRlLCBzcHRlKTsKIAlwdGVfYWNjZXNzID0gc3AtPnJvbGUuYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIGdwdGUpOwogCWlmIChncHRlX3RvX2dmbihncHRlKSAhPSB2Y3B1LT5hcmNoLnVwZGF0ZV9wdGUuZ2ZuKQpAQCAtMzI5LDcgKzM0OCw3IEBACiAJCXJldHVybjsKIAlrdm1fZ2V0X3BmbihwZm4pOwogCS8qCi0JICogd2UgY2FsbCBtbXVfc2V0X3NwdGUoKSB3aXRoIHJlc2V0X2hvc3RfcHJvdGVjdGlvbiA9IHRydWUgYmVhY3VzZSB0aGF0CisJICogd2UgY2FsbCBtbXVfc2V0X3NwdGUoKSB3aXRoIGhvc3Rfd3JpdGFibGUgPSB0cnVlIGJlYWN1c2UgdGhhdAogCSAqIHZjcHUtPmFyY2gudXBkYXRlX3B0ZS5wZm4gd2FzIGZldGNoZWQgZnJvbSBnZXRfdXNlcl9wYWdlcyh3cml0ZSA9IDEpLgogCSAqLwogCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzcHRlLCBzcC0+cm9sZS5hY2Nlc3MsIHB0ZV9hY2Nlc3MsIDAsIDAsCkBAIC0zNjQsNyArMzgzLDYgQEAKIAkJCQl1NjQgKnNwdGVwKQogewogCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCXN0cnVjdCBrdm1fbW11ICptbXUgPSAmdmNwdS0+YXJjaC5tbXU7CiAJcHRfZWxlbWVudF90ICpncHRlcCA9IGd3LT5wcmVmZXRjaF9wdGVzOwogCXU2NCAqc3B0ZTsKIAlpbnQgaTsKQEAgLTM5NSwxNCArNDEzLDcgQEAKIAogCQlncHRlID0gZ3B0ZXBbaV07CiAKLQkJaWYgKCFpc19wcmVzZW50X2dwdGUoZ3B0ZSkgfHwKLQkJICAgICAgaXNfcnN2ZF9iaXRzX3NldChtbXUsIGdwdGUsIFBUX1BBR0VfVEFCTEVfTEVWRUwpKSB7Ci0JCQlpZiAoIXNwLT51bnN5bmMpCi0JCQkJX19zZXRfc3B0ZShzcHRlLCBzaGFkb3dfbm90cmFwX25vbnByZXNlbnRfcHRlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCEoZ3B0ZSAmIFBUX0FDQ0VTU0VEX01BU0spKQorCQlpZiAoRk5BTUUocHJlZmV0Y2hfaW52YWxpZF9ncHRlKSh2Y3B1LCBzcCwgc3B0ZSwgZ3B0ZSkpCiAJCQljb250aW51ZTsKIAogCQlwdGVfYWNjZXNzID0gc3AtPnJvbGUuYWNjZXNzICYgRk5BTUUoZ3B0ZV9hY2Nlc3MpKHZjcHUsIGdwdGUpOwpAQCAtNDI3LDcgKzQzOCw4IEBACiBzdGF0aWMgdTY0ICpGTkFNRShmZXRjaCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyLAogCQkJIHN0cnVjdCBndWVzdF93YWxrZXIgKmd3LAogCQkJIGludCB1c2VyX2ZhdWx0LCBpbnQgd3JpdGVfZmF1bHQsIGludCBobGV2ZWwsCi0JCQkgaW50ICpwdHdyaXRlLCBwZm5fdCBwZm4pCisJCQkgaW50ICpwdHdyaXRlLCBwZm5fdCBwZm4sIGJvb2wgbWFwX3dyaXRhYmxlLAorCQkJIGJvb2wgcHJlZmF1bHQpCiB7CiAJdW5zaWduZWQgYWNjZXNzID0gZ3ctPnB0X2FjY2VzczsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcCA9IE5VTEw7CkBAIC01MDEsNyArNTEzLDcgQEAKIAogCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdC5zcHRlcCwgYWNjZXNzLCBndy0+cHRlX2FjY2VzcyAmIGFjY2VzcywKIAkJICAgICB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwgZGlydHksIHB0d3JpdGUsIGl0LmxldmVsLAotCQkgICAgIGd3LT5nZm4sIHBmbiwgZmFsc2UsIHRydWUpOworCQkgICAgIGd3LT5nZm4sIHBmbiwgcHJlZmF1bHQsIG1hcF93cml0YWJsZSk7CiAJRk5BTUUocHRlX3ByZWZldGNoKSh2Y3B1LCBndywgaXQuc3B0ZXApOwogCiAJcmV0dXJuIGl0LnNwdGVwOwpAQCAtNTI3LDggKzUzOSw4IEBACiAgKiAgUmV0dXJuczogMSBpZiB3ZSBuZWVkIHRvIGVtdWxhdGUgdGhlIGluc3RydWN0aW9uLCAwIG90aGVyd2lzZSwgb3IKICAqICAgICAgICAgICBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLgogICovCi1zdGF0aWMgaW50IEZOQU1FKHBhZ2VfZmF1bHQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgYWRkciwKLQkJCSAgICAgICB1MzIgZXJyb3JfY29kZSkKK3N0YXRpYyBpbnQgRk5BTUUocGFnZV9mYXVsdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBhZGRyLCB1MzIgZXJyb3JfY29kZSwKKwkJCSAgICAgYm9vbCBwcmVmYXVsdCkKIHsKIAlpbnQgd3JpdGVfZmF1bHQgPSBlcnJvcl9jb2RlICYgUEZFUlJfV1JJVEVfTUFTSzsKIAlpbnQgdXNlcl9mYXVsdCA9IGVycm9yX2NvZGUgJiBQRkVSUl9VU0VSX01BU0s7CkBAIC01MzgsNyArNTUwLDkgQEAKIAlpbnQgcjsKIAlwZm5fdCBwZm47CiAJaW50IGxldmVsID0gUFRfUEFHRV9UQUJMRV9MRVZFTDsKKwlpbnQgZm9yY2VfcHRfbGV2ZWw7CiAJdW5zaWduZWQgbG9uZyBtbXVfc2VxOworCWJvb2wgbWFwX3dyaXRhYmxlOwogCiAJcGdwcmludGsoIiVzOiBhZGRyICVseCBlcnIgJXhcbiIsIF9fZnVuY19fLCBhZGRyLCBlcnJvcl9jb2RlKTsKIApAQCAtNTU2LDE5ICs1NzAsMjkgQEAKIAkgKi8KIAlpZiAoIXIpIHsKIAkJcGdwcmludGsoIiVzOiBndWVzdCBwYWdlIGZhdWx0XG4iLCBfX2Z1bmNfXyk7Ci0JCWluamVjdF9wYWdlX2ZhdWx0KHZjcHUpOwotCQl2Y3B1LT5hcmNoLmxhc3RfcHRfd3JpdGVfY291bnQgPSAwOyAvKiByZXNldCBmb3JrIGRldGVjdG9yICovCisJCWlmICghcHJlZmF1bHQpIHsKKwkJCWluamVjdF9wYWdlX2ZhdWx0KHZjcHUsICZ3YWxrZXIuZmF1bHQpOworCQkJLyogcmVzZXQgZm9yayBkZXRlY3RvciAqLworCQkJdmNwdS0+YXJjaC5sYXN0X3B0X3dyaXRlX2NvdW50ID0gMDsKKwkJfQogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAod2Fsa2VyLmxldmVsID49IFBUX0RJUkVDVE9SWV9MRVZFTCkgeworCWlmICh3YWxrZXIubGV2ZWwgPj0gUFRfRElSRUNUT1JZX0xFVkVMKQorCQlmb3JjZV9wdF9sZXZlbCA9IG1hcHBpbmdfbGV2ZWxfZGlydHlfYml0bWFwKHZjcHUsIHdhbGtlci5nZm4pOworCWVsc2UKKwkJZm9yY2VfcHRfbGV2ZWwgPSAxOworCWlmICghZm9yY2VfcHRfbGV2ZWwpIHsKIAkJbGV2ZWwgPSBtaW4od2Fsa2VyLmxldmVsLCBtYXBwaW5nX2xldmVsKHZjcHUsIHdhbGtlci5nZm4pKTsKIAkJd2Fsa2VyLmdmbiA9IHdhbGtlci5nZm4gJiB+KEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpIC0gMSk7CiAJfQogCiAJbW11X3NlcSA9IHZjcHUtPmt2bS0+bW11X25vdGlmaWVyX3NlcTsKIAlzbXBfcm1iKCk7Ci0JcGZuID0gZ2ZuX3RvX3Bmbih2Y3B1LT5rdm0sIHdhbGtlci5nZm4pOworCisJaWYgKHRyeV9hc3luY19wZih2Y3B1LCBwcmVmYXVsdCwgd2Fsa2VyLmdmbiwgYWRkciwgJnBmbiwgd3JpdGVfZmF1bHQsCisJCQkgJm1hcF93cml0YWJsZSkpCisJCXJldHVybiAwOwogCiAJLyogbW1pbyAqLwogCWlmIChpc19lcnJvcl9wZm4ocGZuKSkKQEAgLTU4MCw4ICs2MDQsMTAgQEAKIAogCXRyYWNlX2t2bV9tbXVfYXVkaXQodmNwdSwgQVVESVRfUFJFX1BBR0VfRkFVTFQpOwogCWt2bV9tbXVfZnJlZV9zb21lX3BhZ2VzKHZjcHUpOworCWlmICghZm9yY2VfcHRfbGV2ZWwpCisJCXRyYW5zcGFyZW50X2h1Z2VwYWdlX2FkanVzdCh2Y3B1LCAmd2Fsa2VyLmdmbiwgJnBmbiwgJmxldmVsKTsKIAlzcHRlcCA9IEZOQU1FKGZldGNoKSh2Y3B1LCBhZGRyLCAmd2Fsa2VyLCB1c2VyX2ZhdWx0LCB3cml0ZV9mYXVsdCwKLQkJCSAgICAgbGV2ZWwsICZ3cml0ZV9wdCwgcGZuKTsKKwkJCSAgICAgbGV2ZWwsICZ3cml0ZV9wdCwgcGZuLCBtYXBfd3JpdGFibGUsIHByZWZhdWx0KTsKIAkodm9pZClzcHRlcDsKIAlwZ3ByaW50aygiJXM6IHNoYWRvdyBwdGUgJXAgJWxseCBwdHdyaXRlICVkXG4iLCBfX2Z1bmNfXywKIAkJIHNwdGVwLCAqc3B0ZXAsIHdyaXRlX3B0KTsKQEAgLTY2MSw3ICs2ODcsNyBAQAogfQogCiBzdGF0aWMgZ3BhX3QgRk5BTUUoZ3ZhX3RvX2dwYSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCB2YWRkciwgdTMyIGFjY2VzcywKLQkJCSAgICAgICB1MzIgKmVycm9yKQorCQkJICAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7CiAJc3RydWN0IGd1ZXN0X3dhbGtlciB3YWxrZXI7CiAJZ3BhX3QgZ3BhID0gVU5NQVBQRURfR1ZBOwpAQCAtNjcyLDE0ICs2OTgsMTUgQEAKIAlpZiAocikgewogCQlncGEgPSBnZm5fdG9fZ3BhKHdhbGtlci5nZm4pOwogCQlncGEgfD0gdmFkZHIgJiB+UEFHRV9NQVNLOwotCX0gZWxzZSBpZiAoZXJyb3IpCi0JCSplcnJvciA9IHdhbGtlci5lcnJvcl9jb2RlOworCX0gZWxzZSBpZiAoZXhjZXB0aW9uKQorCQkqZXhjZXB0aW9uID0gd2Fsa2VyLmZhdWx0OwogCiAJcmV0dXJuIGdwYTsKIH0KIAogc3RhdGljIGdwYV90IEZOQU1FKGd2YV90b19ncGFfbmVzdGVkKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IHZhZGRyLAotCQkJCSAgICAgIHUzMiBhY2Nlc3MsIHUzMiAqZXJyb3IpCisJCQkJICAgICAgdTMyIGFjY2VzcywKKwkJCQkgICAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQogewogCXN0cnVjdCBndWVzdF93YWxrZXIgd2Fsa2VyOwogCWdwYV90IGdwYSA9IFVOTUFQUEVEX0dWQTsKQEAgLTY5MCw4ICs3MTcsOCBAQAogCWlmIChyKSB7CiAJCWdwYSA9IGdmbl90b19ncGEod2Fsa2VyLmdmbik7CiAJCWdwYSB8PSB2YWRkciAmIH5QQUdFX01BU0s7Ci0JfSBlbHNlIGlmIChlcnJvcikKLQkJKmVycm9yID0gd2Fsa2VyLmVycm9yX2NvZGU7CisJfSBlbHNlIGlmIChleGNlcHRpb24pCisJCSpleGNlcHRpb24gPSB3YWxrZXIuZmF1bHQ7CiAKIAlyZXR1cm4gZ3BhOwogfQpAQCAtNzMwLDEyICs3NTcsMTkgQEAKICAqIFVzaW5nIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gZnJvbSBzcC0+Z2ZucyBpcyBzYWZlIGJlY2F1c2U6CiAgKiAtIFRoZSBzcHRlIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgc3RydWN0IHBhZ2UsIHNvIHRoZSBwZm4gZm9yIGEgZ2l2ZW4gZ2ZuCiAgKiAgIGNhbid0IGNoYW5nZSB1bmxlc3MgYWxsIHNwdGVzIHBvaW50aW5nIHRvIGl0IGFyZSBudWtlZCBmaXJzdC4KKyAqCisgKiBOb3RlOgorICogICBXZSBzaG91bGQgZmx1c2ggYWxsIHRsYnMgaWYgc3B0ZSBpcyBkcm9wcGVkIGV2ZW4gdGhvdWdoIGd1ZXN0IGlzCisgKiAgIHJlc3BvbnNpYmxlIGZvciBpdC4gU2luY2UgaWYgd2UgZG9uJ3QsIGt2bV9tbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9wYWdlCisgKiAgIGFuZCBrdm1fbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQgZGV0ZWN0IHRoZSBtYXBwaW5nIHBhZ2UgaXNuJ3QKKyAqICAgdXNlZCBieSBndWVzdCB0aGVuIHRsYnMgYXJlIG5vdCBmbHVzaGVkLCBzbyBndWVzdCBpcyBhbGxvd2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgZnJlZWQgcGFnZXMuCisgKiAgIEFuZCB3ZSBpbmNyZWFzZSBrdm0tPnRsYnNfZGlydHkgdG8gZGVsYXkgdGxicyBmbHVzaCBpbiB0aGlzIGNhc2UuCiAgKi8KLXN0YXRpYyBpbnQgRk5BTUUoc3luY19wYWdlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLAotCQkJICAgIGJvb2wgY2xlYXJfdW5zeW5jKQorc3RhdGljIGludCBGTkFNRShzeW5jX3BhZ2UpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CiAJaW50IGksIG9mZnNldCwgbnJfcHJlc2VudDsKLQlib29sIHJlc2V0X2hvc3RfcHJvdGVjdGlvbjsKKwlib29sIGhvc3Rfd3JpdGFibGU7CiAJZ3BhX3QgZmlyc3RfcHRlX2dwYTsKIAogCW9mZnNldCA9IG5yX3ByZXNlbnQgPSAwOwpAQCAtNzY0LDMxICs3OTgsMjcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWdmbiA9IGdwdGVfdG9fZ2ZuKGdwdGUpOwotCQlpZiAoaXNfcnN2ZF9iaXRzX3NldCgmdmNwdS0+YXJjaC5tbXUsIGdwdGUsIFBUX1BBR0VfVEFCTEVfTEVWRUwpCi0JCSAgICAgIHx8IGdmbiAhPSBzcC0+Z2Zuc1tpXSB8fCAhaXNfcHJlc2VudF9ncHRlKGdwdGUpCi0JCSAgICAgIHx8ICEoZ3B0ZSAmIFBUX0FDQ0VTU0VEX01BU0spKSB7Ci0JCQl1NjQgbm9ucHJlc2VudDsKIAotCQkJaWYgKGlzX3ByZXNlbnRfZ3B0ZShncHRlKSB8fCAhY2xlYXJfdW5zeW5jKQotCQkJCW5vbnByZXNlbnQgPSBzaGFkb3dfdHJhcF9ub25wcmVzZW50X3B0ZTsKLQkJCWVsc2UKLQkJCQlub25wcmVzZW50ID0gc2hhZG93X25vdHJhcF9ub25wcmVzZW50X3B0ZTsKLQkJCWRyb3Bfc3B0ZSh2Y3B1LT5rdm0sICZzcC0+c3B0W2ldLCBub25wcmVzZW50KTsKKwkJaWYgKEZOQU1FKHByZWZldGNoX2ludmFsaWRfZ3B0ZSkodmNwdSwgc3AsICZzcC0+c3B0W2ldLCBncHRlKSkgeworCQkJdmNwdS0+a3ZtLT50bGJzX2RpcnR5Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChnZm4gIT0gc3AtPmdmbnNbaV0pIHsKKwkJCWRyb3Bfc3B0ZSh2Y3B1LT5rdm0sICZzcC0+c3B0W2ldLAorCQkJCSAgICAgIHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlKTsKKwkJCXZjcHUtPmt2bS0+dGxic19kaXJ0eSsrOwogCQkJY29udGludWU7CiAJCX0KIAogCQlucl9wcmVzZW50Kys7CiAJCXB0ZV9hY2Nlc3MgPSBzcC0+cm9sZS5hY2Nlc3MgJiBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgZ3B0ZSk7Ci0JCWlmICghKHNwLT5zcHRbaV0gJiBTUFRFX0hPU1RfV1JJVEVBQkxFKSkgewotCQkJcHRlX2FjY2VzcyAmPSB+QUNDX1dSSVRFX01BU0s7Ci0JCQlyZXNldF9ob3N0X3Byb3RlY3Rpb24gPSAwOwotCQl9IGVsc2UgewotCQkJcmVzZXRfaG9zdF9wcm90ZWN0aW9uID0gMTsKLQkJfQorCQlob3N0X3dyaXRhYmxlID0gc3AtPnNwdFtpXSAmIFNQVEVfSE9TVF9XUklURUFCTEU7CisKIAkJc2V0X3NwdGUodmNwdSwgJnNwLT5zcHRbaV0sIHB0ZV9hY2Nlc3MsIDAsIDAsCiAJCQkgaXNfZGlydHlfZ3B0ZShncHRlKSwgUFRfUEFHRV9UQUJMRV9MRVZFTCwgZ2ZuLAogCQkJIHNwdGVfdG9fcGZuKHNwLT5zcHRbaV0pLCB0cnVlLCBmYWxzZSwKLQkJCSByZXNldF9ob3N0X3Byb3RlY3Rpb24pOworCQkJIGhvc3Rfd3JpdGFibGUpOwogCX0KIAogCXJldHVybiAhbnJfcHJlc2VudDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9zdm0uYyBiL2FyY2gveDg2L2t2bS9zdm0uYwppbmRleCBiODFhOWI3Li4yNWJkMWJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vc3ZtLmMKKysrIGIvYXJjaC94ODYva3ZtL3N2bS5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgogCiAjaW5jbHVkZSA8YXNtL3ZpcnRleHQuaD4KICNpbmNsdWRlICJ0cmFjZS5oIgpAQCAtNTAsNiArNTEsMTAgQEAKICNkZWZpbmUgU1ZNX0ZFQVRVUkVfTEJSViAgICAgICAgICAgKDEgPDwgIDEpCiAjZGVmaW5lIFNWTV9GRUFUVVJFX1NWTUwgICAgICAgICAgICgxIDw8ICAyKQogI2RlZmluZSBTVk1fRkVBVFVSRV9OUklQICAgICAgICAgICAoMSA8PCAgMykKKyNkZWZpbmUgU1ZNX0ZFQVRVUkVfVFNDX1JBVEUgICAgICAgKDEgPDwgIDQpCisjZGVmaW5lIFNWTV9GRUFUVVJFX1ZNQ0JfQ0xFQU4gICAgICgxIDw8ICA1KQorI2RlZmluZSBTVk1fRkVBVFVSRV9GTFVTSF9BU0lEICAgICAoMSA8PCAgNikKKyNkZWZpbmUgU1ZNX0ZFQVRVUkVfREVDT0RFX0FTU0lTVCAgKDEgPDwgIDcpCiAjZGVmaW5lIFNWTV9GRUFUVVJFX1BBVVNFX0ZJTFRFUiAgICgxIDw8IDEwKQogCiAjZGVmaW5lIE5FU1RFRF9FWElUX0hPU1QJMAkvKiBFeGl0IGhhbmRsZWQgb24gaG9zdCBsZXZlbCAqLwpAQCAtOTcsMTAgKzEwMiw4IEBACiAJdW5zaWduZWQgbG9uZyB2bWV4aXRfcmF4OwogCiAJLyogY2FjaGUgZm9yIGludGVyY2VwdHMgb2YgdGhlIGd1ZXN0ICovCi0JdTE2IGludGVyY2VwdF9jcl9yZWFkOwotCXUxNiBpbnRlcmNlcHRfY3Jfd3JpdGU7Ci0JdTE2IGludGVyY2VwdF9kcl9yZWFkOwotCXUxNiBpbnRlcmNlcHRfZHJfd3JpdGU7CisJdTMyIGludGVyY2VwdF9jcjsKKwl1MzIgaW50ZXJjZXB0X2RyOwogCXUzMiBpbnRlcmNlcHRfZXhjZXB0aW9uczsKIAl1NjQgaW50ZXJjZXB0OwogCkBAIC0xMjMsNyArMTI2LDEyIEBACiAJdTY0IG5leHRfcmlwOwogCiAJdTY0IGhvc3RfdXNlcl9tc3JzW05SX0hPU1RfU0FWRV9VU0VSX01TUlNdOwotCXU2NCBob3N0X2dzX2Jhc2U7CisJc3RydWN0IHsKKwkJdTE2IGZzOworCQl1MTYgZ3M7CisJCXUxNiBsZHQ7CisJCXU2NCBnc19iYXNlOworCX0gaG9zdDsKIAogCXUzMiAqbXNycG07CiAKQEAgLTEzMyw2ICsxNDEsNyBAQAogCiAJdW5zaWduZWQgaW50M19pbmplY3RlZDsKIAl1bnNpZ25lZCBsb25nIGludDNfcmlwOworCXUzMiBhcGZfcmVhc29uOwogfTsKIAogI2RlZmluZSBNU1JfSU5WQUxJRAkJCTB4ZmZmZmZmZmZVCkBAIC0xODAsMTQgKzE4OSwxNTEgQEAKIHN0YXRpYyBpbnQgbmVzdGVkX3N2bV9jaGVja19leGNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0sIHVuc2lnbmVkIG5yLAogCQkJCSAgICAgIGJvb2wgaGFzX2Vycm9yX2NvZGUsIHUzMiBlcnJvcl9jb2RlKTsKIAorZW51bSB7CisJVk1DQl9JTlRFUkNFUFRTLCAvKiBJbnRlcmNlcHQgdmVjdG9ycywgVFNDIG9mZnNldCwKKwkJCSAgICBwYXVzZSBmaWx0ZXIgY291bnQgKi8KKwlWTUNCX1BFUk1fTUFQLCAgIC8qIElPUE0gQmFzZSBhbmQgTVNSUE0gQmFzZSAqLworCVZNQ0JfQVNJRCwJIC8qIEFTSUQgKi8KKwlWTUNCX0lOVFIsCSAvKiBpbnRfY3RsLCBpbnRfdmVjdG9yICovCisJVk1DQl9OUFQsICAgICAgICAvKiBucHRfZW4sIG5DUjMsIGdQQVQgKi8KKwlWTUNCX0NSLAkgLyogQ1IwLCBDUjMsIENSNCwgRUZFUiAqLworCVZNQ0JfRFIsICAgICAgICAgLyogRFI2LCBEUjcgKi8KKwlWTUNCX0RULCAgICAgICAgIC8qIEdEVCwgSURUICovCisJVk1DQl9TRUcsICAgICAgICAvKiBDUywgRFMsIFNTLCBFUywgQ1BMICovCisJVk1DQl9DUjIsICAgICAgICAvKiBDUjIgb25seSAqLworCVZNQ0JfTEJSLCAgICAgICAgLyogREJHQ1RMLCBCUl9GUk9NLCBCUl9UTywgTEFTVF9FWF9GUk9NLCBMQVNUX0VYX1RPICovCisJVk1DQl9ESVJUWV9NQVgsCit9OworCisvKiBUUFIgYW5kIENSMiBhcmUgYWx3YXlzIHdyaXR0ZW4gYmVmb3JlIFZNUlVOICovCisjZGVmaW5lIFZNQ0JfQUxXQVlTX0RJUlRZX01BU0sJKCgxVSA8PCBWTUNCX0lOVFIpIHwgKDFVIDw8IFZNQ0JfQ1IyKSkKKworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfYWxsX2RpcnR5KHN0cnVjdCB2bWNiICp2bWNiKQoreworCXZtY2ItPmNvbnRyb2wuY2xlYW4gPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFya19hbGxfY2xlYW4oc3RydWN0IHZtY2IgKnZtY2IpCit7CisJdm1jYi0+Y29udHJvbC5jbGVhbiA9ICgoMSA8PCBWTUNCX0RJUlRZX01BWCkgLSAxKQorCQkJICAgICAgICYgflZNQ0JfQUxXQVlTX0RJUlRZX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX2RpcnR5KHN0cnVjdCB2bWNiICp2bWNiLCBpbnQgYml0KQoreworCXZtY2ItPmNvbnRyb2wuY2xlYW4gJj0gfigxIDw8IGJpdCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZjcHVfc3ZtICp0b19zdm0oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiBjb250YWluZXJfb2YodmNwdSwgc3RydWN0IHZjcHVfc3ZtLCB2Y3B1KTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzX25lc3RlZChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKK3N0YXRpYyB2b2lkIHJlY2FsY19pbnRlcmNlcHRzKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewotCXJldHVybiBzdm0tPm5lc3RlZC52bWNiOworCXN0cnVjdCB2bWNiX2NvbnRyb2xfYXJlYSAqYywgKmg7CisJc3RydWN0IG5lc3RlZF9zdGF0ZSAqZzsKKworCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX0lOVEVSQ0VQVFMpOworCisJaWYgKCFpc19ndWVzdF9tb2RlKCZzdm0tPnZjcHUpKQorCQlyZXR1cm47CisKKwljID0gJnN2bS0+dm1jYi0+Y29udHJvbDsKKwloID0gJnN2bS0+bmVzdGVkLmhzYXZlLT5jb250cm9sOworCWcgPSAmc3ZtLT5uZXN0ZWQ7CisKKwljLT5pbnRlcmNlcHRfY3IgPSBoLT5pbnRlcmNlcHRfY3IgfCBnLT5pbnRlcmNlcHRfY3I7CisJYy0+aW50ZXJjZXB0X2RyID0gaC0+aW50ZXJjZXB0X2RyIHwgZy0+aW50ZXJjZXB0X2RyOworCWMtPmludGVyY2VwdF9leGNlcHRpb25zID0gaC0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgfCBnLT5pbnRlcmNlcHRfZXhjZXB0aW9uczsKKwljLT5pbnRlcmNlcHQgPSBoLT5pbnRlcmNlcHQgfCBnLT5pbnRlcmNlcHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZtY2IgKmdldF9ob3N0X3ZtY2Ioc3RydWN0IHZjcHVfc3ZtICpzdm0pCit7CisJaWYgKGlzX2d1ZXN0X21vZGUoJnN2bS0+dmNwdSkpCisJCXJldHVybiBzdm0tPm5lc3RlZC5oc2F2ZTsKKwllbHNlCisJCXJldHVybiBzdm0tPnZtY2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3JfaW50ZXJjZXB0KHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBpbnQgYml0KQoreworCXN0cnVjdCB2bWNiICp2bWNiID0gZ2V0X2hvc3Rfdm1jYihzdm0pOworCisJdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3IgfD0gKDFVIDw8IGJpdCk7CisKKwlyZWNhbGNfaW50ZXJjZXB0cyhzdm0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xyX2NyX2ludGVyY2VwdChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgaW50IGJpdCkKK3sKKwlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IGdldF9ob3N0X3ZtY2Ioc3ZtKTsKKworCXZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyICY9IH4oMVUgPDwgYml0KTsKKworCXJlY2FsY19pbnRlcmNlcHRzKHN2bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19jcl9pbnRlcmNlcHQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIGludCBiaXQpCit7CisJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7CisKKwlyZXR1cm4gdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3IgJiAoMVUgPDwgYml0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9kcl9pbnRlcmNlcHQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIGludCBiaXQpCit7CisJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7CisKKwl2bWNiLT5jb250cm9sLmludGVyY2VwdF9kciB8PSAoMVUgPDwgYml0KTsKKworCXJlY2FsY19pbnRlcmNlcHRzKHN2bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZHJfaW50ZXJjZXB0KHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBpbnQgYml0KQoreworCXN0cnVjdCB2bWNiICp2bWNiID0gZ2V0X2hvc3Rfdm1jYihzdm0pOworCisJdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZHIgJj0gfigxVSA8PCBiaXQpOworCisJcmVjYWxjX2ludGVyY2VwdHMoc3ZtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leGNlcHRpb25faW50ZXJjZXB0KHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBpbnQgYml0KQoreworCXN0cnVjdCB2bWNiICp2bWNiID0gZ2V0X2hvc3Rfdm1jYihzdm0pOworCisJdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9ucyB8PSAoMVUgPDwgYml0KTsKKworCXJlY2FsY19pbnRlcmNlcHRzKHN2bSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZXhjZXB0aW9uX2ludGVyY2VwdChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgaW50IGJpdCkKK3sKKwlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IGdldF9ob3N0X3ZtY2Ioc3ZtKTsKKworCXZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgJj0gfigxVSA8PCBiaXQpOworCisJcmVjYWxjX2ludGVyY2VwdHMoc3ZtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pbnRlcmNlcHQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIGludCBiaXQpCit7CisJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7CisKKwl2bWNiLT5jb250cm9sLmludGVyY2VwdCB8PSAoMVVMTCA8PCBiaXQpOworCisJcmVjYWxjX2ludGVyY2VwdHMoc3ZtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNscl9pbnRlcmNlcHQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIGludCBiaXQpCit7CisJc3RydWN0IHZtY2IgKnZtY2IgPSBnZXRfaG9zdF92bWNiKHN2bSk7CisKKwl2bWNiLT5jb250cm9sLmludGVyY2VwdCAmPSB+KDFVTEwgPDwgYml0KTsKKworCXJlY2FsY19pbnRlcmNlcHRzKHN2bSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfZ2lmKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQpAQCAtMjY0LDExICs0MTAsNiBAQAogCiAjZGVmaW5lIE1BWF9JTlNUX1NJWkUgMTUKIAotc3RhdGljIGlubGluZSB1MzIgc3ZtX2hhcyh1MzIgZmVhdCkKLXsKLQlyZXR1cm4gc3ZtX2ZlYXR1cmVzICYgZmVhdDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGNsZ2kodm9pZCkKIHsKIAlhc20gdm9sYXRpbGUgKF9fZXgoU1ZNX0NMR0kpKTsKQEAgLTI4NCwxNiArNDI1LDYgQEAKIAlhc20gdm9sYXRpbGUgKF9fZXgoU1ZNX0lOVkxQR0EpIDogOiAiYSIoYWRkciksICJjIihhc2lkKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmb3JjZV9uZXdfYXNpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JdG9fc3ZtKHZjcHUpLT5hc2lkX2dlbmVyYXRpb24tLTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2d1ZXN0X3RsYihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JZm9yY2VfbmV3X2FzaWQodmNwdSk7Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X25wdF9sZXZlbCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTMxMCw2ICs0NDEsNyBAQAogCQllZmVyICY9IH5FRkVSX0xNRTsKIAogCXRvX3N2bSh2Y3B1KS0+dm1jYi0+c2F2ZS5lZmVyID0gZWZlciB8IEVGRVJfU1ZNRTsKKwltYXJrX2RpcnR5KHRvX3N2bSh2Y3B1KS0+dm1jYiwgVk1DQl9DUik7CiB9CiAKIHN0YXRpYyBpbnQgaXNfZXh0ZXJuYWxfaW50ZXJydXB0KHUzMiBpbmZvKQpAQCAtMzQ3LDcgKzQ3OSw3IEBACiAJCXN2bS0+bmV4dF9yaXAgPSBzdm0tPnZtY2ItPmNvbnRyb2wubmV4dF9yaXA7CiAKIAlpZiAoIXN2bS0+bmV4dF9yaXApIHsKLQkJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgRU1VTFRZUEVfU0tJUCkgIT0KKwkJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgRU1VTFRZUEVfU0tJUCkgIT0KIAkJCQlFTVVMQVRFX0RPTkUpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5PUFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CkBAIC0zNzQsNyArNTA2LDcgQEAKIAkgICAgbmVzdGVkX3N2bV9jaGVja19leGNlcHRpb24oc3ZtLCBuciwgaGFzX2Vycm9yX2NvZGUsIGVycm9yX2NvZGUpKQogCQlyZXR1cm47CiAKLQlpZiAobnIgPT0gQlBfVkVDVE9SICYmICFzdm1faGFzKFNWTV9GRUFUVVJFX05SSVApKSB7CisJaWYgKG5yID09IEJQX1ZFQ1RPUiAmJiAhc3RhdGljX2NwdV9oYXMoWDg2X0ZFQVRVUkVfTlJJUFMpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcmlwLCBvbGRfcmlwID0ga3ZtX3JpcF9yZWFkKCZzdm0tPnZjcHUpOwogCiAJCS8qCkBAIC02NzAsNyArODAyLDcgQEAKIAogCXN2bV9mZWF0dXJlcyA9IGNwdWlkX2VkeChTVk1fQ1BVSURfRlVOQyk7CiAKLQlpZiAoIXN2bV9oYXMoU1ZNX0ZFQVRVUkVfTlBUKSkKKwlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9OUFQpKQogCQlucHRfZW5hYmxlZCA9IGZhbHNlOwogCiAJaWYgKG5wdF9lbmFibGVkICYmICFucHQpIHsKQEAgLTcyNSwxMyArODU3LDE1IEBACiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAJdTY0IGdfdHNjX29mZnNldCA9IDA7CiAKLQlpZiAoaXNfbmVzdGVkKHN2bSkpIHsKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgewogCQlnX3RzY19vZmZzZXQgPSBzdm0tPnZtY2ItPmNvbnRyb2wudHNjX29mZnNldCAtCiAJCQkgICAgICAgc3ZtLT5uZXN0ZWQuaHNhdmUtPmNvbnRyb2wudHNjX29mZnNldDsKIAkJc3ZtLT5uZXN0ZWQuaHNhdmUtPmNvbnRyb2wudHNjX29mZnNldCA9IG9mZnNldDsKIAl9CiAKIAlzdm0tPnZtY2ItPmNvbnRyb2wudHNjX29mZnNldCA9IG9mZnNldCArIGdfdHNjX29mZnNldDsKKworCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX0lOVEVSQ0VQVFMpOwogfQogCiBzdGF0aWMgdm9pZCBzdm1fYWRqdXN0X3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzNjQgYWRqdXN0bWVudCkKQEAgLTczOSw4ICs4NzMsOSBAQAogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCiAJc3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQgKz0gYWRqdXN0bWVudDsKLQlpZiAoaXNfbmVzdGVkKHN2bSkpCisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpCiAJCXN2bS0+bmVzdGVkLmhzYXZlLT5jb250cm9sLnRzY19vZmZzZXQgKz0gYWRqdXN0bWVudDsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9JTlRFUkNFUFRTKTsKIH0KIAogc3RhdGljIHZvaWQgaW5pdF92bWNiKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQpAQCAtNzQ5LDYyICs4ODQsNjIgQEAKIAlzdHJ1Y3Qgdm1jYl9zYXZlX2FyZWEgKnNhdmUgPSAmc3ZtLT52bWNiLT5zYXZlOwogCiAJc3ZtLT52Y3B1LmZwdV9hY3RpdmUgPSAxOworCXN2bS0+dmNwdS5hcmNoLmhmbGFncyA9IDA7CiAKLQljb250cm9sLT5pbnRlcmNlcHRfY3JfcmVhZCA9CUlOVEVSQ0VQVF9DUjBfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9DUjNfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9DUjRfTUFTSzsKKwlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSMF9SRUFEKTsKKwlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSM19SRUFEKTsKKwlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSNF9SRUFEKTsKKwlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSMF9XUklURSk7CisJc2V0X2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjNfV1JJVEUpOworCXNldF9jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1I0X1dSSVRFKTsKKwlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSOF9XUklURSk7CiAKLQljb250cm9sLT5pbnRlcmNlcHRfY3Jfd3JpdGUgPQlJTlRFUkNFUFRfQ1IwX01BU0sgfAotCQkJCQlJTlRFUkNFUFRfQ1IzX01BU0sgfAotCQkJCQlJTlRFUkNFUFRfQ1I0X01BU0sgfAotCQkJCQlJTlRFUkNFUFRfQ1I4X01BU0s7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjBfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjFfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjJfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjNfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjRfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjVfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjZfUkVBRCk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjdfUkVBRCk7CiAKLQljb250cm9sLT5pbnRlcmNlcHRfZHJfcmVhZCA9CUlOVEVSQ0VQVF9EUjBfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjFfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjJfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjNfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjRfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjVfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjZfTUFTSyB8Ci0JCQkJCUlOVEVSQ0VQVF9EUjdfTUFTSzsKKwlzZXRfZHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0RSMF9XUklURSk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjFfV1JJVEUpOworCXNldF9kcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfRFIyX1dSSVRFKTsKKwlzZXRfZHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0RSM19XUklURSk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjRfV1JJVEUpOworCXNldF9kcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfRFI1X1dSSVRFKTsKKwlzZXRfZHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0RSNl9XUklURSk7CisJc2V0X2RyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9EUjdfV1JJVEUpOwogCi0JY29udHJvbC0+aW50ZXJjZXB0X2RyX3dyaXRlID0JSU5URVJDRVBUX0RSMF9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSMV9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSMl9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSM19NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSNF9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSNV9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSNl9NQVNLIHwKLQkJCQkJSU5URVJDRVBUX0RSN19NQVNLOworCXNldF9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgUEZfVkVDVE9SKTsKKwlzZXRfZXhjZXB0aW9uX2ludGVyY2VwdChzdm0sIFVEX1ZFQ1RPUik7CisJc2V0X2V4Y2VwdGlvbl9pbnRlcmNlcHQoc3ZtLCBNQ19WRUNUT1IpOwogCi0JY29udHJvbC0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgPSAoMSA8PCBQRl9WRUNUT1IpIHwKLQkJCQkJKDEgPDwgVURfVkVDVE9SKSB8Ci0JCQkJCSgxIDw8IE1DX1ZFQ1RPUik7Ci0KLQotCWNvbnRyb2wtPmludGVyY2VwdCA9CSgxVUxMIDw8IElOVEVSQ0VQVF9JTlRSKSB8Ci0JCQkJKDFVTEwgPDwgSU5URVJDRVBUX05NSSkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9TTUkpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfU0VMRUNUSVZFX0NSMCkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9DUFVJRCkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JTlZEKSB8Ci0JCQkJKDFVTEwgPDwgSU5URVJDRVBUX0hMVCkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JTlZMUEcpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfSU5WTFBHQSkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9JT0lPX1BST1QpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfTVNSX1BST1QpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfU0hVVERPV04pIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1SVU4pIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1NQ0FMTCkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9WTUxPQUQpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfVk1TQVZFKSB8Ci0JCQkJKDFVTEwgPDwgSU5URVJDRVBUX1NUR0kpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfQ0xHSSkgfAotCQkJCSgxVUxMIDw8IElOVEVSQ0VQVF9TS0lOSVQpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfV0JJTlZEKSB8Ci0JCQkJKDFVTEwgPDwgSU5URVJDRVBUX01PTklUT1IpIHwKLQkJCQkoMVVMTCA8PCBJTlRFUkNFUFRfTVdBSVQpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfSU5UUik7CisJc2V0X2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9OTUkpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfU01JKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1NFTEVDVElWRV9DUjApOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1BVSUQpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfSU5WRCk7CisJc2V0X2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9ITFQpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfSU5WTFBHKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lOVkxQR0EpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfSU9JT19QUk9UKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX01TUl9QUk9UKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1RBU0tfU1dJVENIKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1NIVVRET1dOKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1ZNUlVOKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1ZNTUNBTEwpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfVk1MT0FEKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1ZNU0FWRSk7CisJc2V0X2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9TVEdJKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NMR0kpOworCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfU0tJTklUKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1dCSU5WRCk7CisJc2V0X2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9NT05JVE9SKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX01XQUlUKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1hTRVRCVik7CiAKIAljb250cm9sLT5pb3BtX2Jhc2VfcGEgPSBpb3BtX2Jhc2U7CiAJY29udHJvbC0+bXNycG1fYmFzZV9wYSA9IF9fcGEoc3ZtLT5tc3JwbSk7CkBAIC04NTUsMjUgKzk5MCwyNyBAQAogCWlmIChucHRfZW5hYmxlZCkgewogCQkvKiBTZXR1cCBWTUNCIGZvciBOZXN0ZWQgUGFnaW5nICovCiAJCWNvbnRyb2wtPm5lc3RlZF9jdGwgPSAxOwotCQljb250cm9sLT5pbnRlcmNlcHQgJj0gfigoMVVMTCA8PCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpIHwKLQkJCQkJKDFVTEwgPDwgSU5URVJDRVBUX0lOVkxQRykpOwotCQljb250cm9sLT5pbnRlcmNlcHRfZXhjZXB0aW9ucyAmPSB+KDEgPDwgUEZfVkVDVE9SKTsKLQkJY29udHJvbC0+aW50ZXJjZXB0X2NyX3JlYWQgJj0gfklOVEVSQ0VQVF9DUjNfTUFTSzsKLQkJY29udHJvbC0+aW50ZXJjZXB0X2NyX3dyaXRlICY9IH5JTlRFUkNFUFRfQ1IzX01BU0s7CisJCWNscl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfVEFTS19TV0lUQ0gpOworCQljbHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lOVkxQRyk7CisJCWNscl9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgUEZfVkVDVE9SKTsKKwkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjNfUkVBRCk7CisJCWNscl9jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1IzX1dSSVRFKTsKIAkJc2F2ZS0+Z19wYXQgPSAweDAwMDcwNDA2MDAwNzA0MDZVTEw7CiAJCXNhdmUtPmNyMyA9IDA7CiAJCXNhdmUtPmNyNCA9IDA7CiAJfQotCWZvcmNlX25ld19hc2lkKCZzdm0tPnZjcHUpOworCXN2bS0+YXNpZF9nZW5lcmF0aW9uID0gMDsKIAogCXN2bS0+bmVzdGVkLnZtY2IgPSAwOwogCXN2bS0+dmNwdS5hcmNoLmhmbGFncyA9IDA7CiAKLQlpZiAoc3ZtX2hhcyhTVk1fRkVBVFVSRV9QQVVTRV9GSUxURVIpKSB7CisJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QQVVTRUZJTFRFUikpIHsKIAkJY29udHJvbC0+cGF1c2VfZmlsdGVyX2NvdW50ID0gMzAwMDsKLQkJY29udHJvbC0+aW50ZXJjZXB0IHw9ICgxVUxMIDw8IElOVEVSQ0VQVF9QQVVTRSk7CisJCXNldF9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfUEFVU0UpOwogCX0KIAorCW1hcmtfYWxsX2RpcnR5KHN2bS0+dm1jYik7CisKIAllbmFibGVfZ2lmKHN2bSk7CiB9CiAKQEAgLTk5MCw4ICsxMTI3LDE2IEBACiAKIAlpZiAodW5saWtlbHkoY3B1ICE9IHZjcHUtPmNwdSkpIHsKIAkJc3ZtLT5hc2lkX2dlbmVyYXRpb24gPSAwOworCQltYXJrX2FsbF9kaXJ0eShzdm0tPnZtY2IpOwogCX0KIAorI2lmZGVmIENPTkZJR19YODZfNjQKKwlyZG1zcmwoTVNSX0dTX0JBU0UsIHRvX3N2bSh2Y3B1KS0+aG9zdC5nc19iYXNlKTsKKyNlbmRpZgorCXNhdmVzZWdtZW50KGZzLCBzdm0tPmhvc3QuZnMpOworCXNhdmVzZWdtZW50KGdzLCBzdm0tPmhvc3QuZ3MpOworCXN2bS0+aG9zdC5sZHQgPSBrdm1fcmVhZF9sZHQoKTsKKwogCWZvciAoaSA9IDA7IGkgPCBOUl9IT1NUX1NBVkVfVVNFUl9NU1JTOyBpKyspCiAJCXJkbXNybChob3N0X3NhdmVfdXNlcl9tc3JzW2ldLCBzdm0tPmhvc3RfdXNlcl9tc3JzW2ldKTsKIH0KQEAgLTEwMDIsNiArMTE0NywxNCBAQAogCWludCBpOwogCiAJKyt2Y3B1LT5zdGF0Lmhvc3Rfc3RhdGVfcmVsb2FkOworCWt2bV9sb2FkX2xkdChzdm0tPmhvc3QubGR0KTsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJbG9hZHNlZ21lbnQoZnMsIHN2bS0+aG9zdC5mcyk7CisJbG9hZF9nc19pbmRleChzdm0tPmhvc3QuZ3MpOworCXdybXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIGN1cnJlbnQtPnRocmVhZC5ncyk7CisjZWxzZQorCWxvYWRzZWdtZW50KGdzLCBzdm0tPmhvc3QuZ3MpOworI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IE5SX0hPU1RfU0FWRV9VU0VSX01TUlM7IGkrKykKIAkJd3Jtc3JsKGhvc3Rfc2F2ZV91c2VyX21zcnNbaV0sIHN2bS0+aG9zdF91c2VyX21zcnNbaV0pOwogfQpAQCAtMTAyMSw3ICsxMTc0LDcgQEAKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgVkNQVV9FWFJFR19QRFBUUjoKIAkJQlVHX09OKCFucHRfZW5hYmxlZCk7Ci0JCWxvYWRfcGRwdHJzKHZjcHUsIHZjcHUtPmFyY2gud2Fsa19tbXUsIHZjcHUtPmFyY2guY3IzKTsKKwkJbG9hZF9wZHB0cnModmNwdSwgdmNwdS0+YXJjaC53YWxrX21tdSwga3ZtX3JlYWRfY3IzKHZjcHUpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC0xMDMwLDEyICsxMTgzLDEyIEBACiAKIHN0YXRpYyB2b2lkIHN2bV9zZXRfdmludHIoc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdCB8PSAxVUxMIDw8IElOVEVSQ0VQVF9WSU5UUjsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX1ZJTlRSKTsKIH0KIAogc3RhdGljIHZvaWQgc3ZtX2NsZWFyX3ZpbnRyKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewotCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgJj0gfigxVUxMIDw8IElOVEVSQ0VQVF9WSU5UUik7CisJY2xyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9WSU5UUik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgdm1jYl9zZWcgKnN2bV9zZWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgc2VnKQpAQCAtMTE1MCw2ICsxMzAzLDcgQEAKIAogCXN2bS0+dm1jYi0+c2F2ZS5pZHRyLmxpbWl0ID0gZHQtPnNpemU7CiAJc3ZtLT52bWNiLT5zYXZlLmlkdHIuYmFzZSA9IGR0LT5hZGRyZXNzIDsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9EVCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN2bV9nZXRfZ2R0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGRlc2NfcHRyICpkdCkKQEAgLTExNjYsMTkgKzEzMjAsMjMgQEAKIAogCXN2bS0+dm1jYi0+c2F2ZS5nZHRyLmxpbWl0ID0gZHQtPnNpemU7CiAJc3ZtLT52bWNiLT5zYXZlLmdkdHIuYmFzZSA9IGR0LT5hZGRyZXNzIDsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9EVCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN2bV9kZWNhY2hlX2NyMF9ndWVzdF9iaXRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIH0KIAorc3RhdGljIHZvaWQgc3ZtX2RlY2FjaGVfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKK30KKwogc3RhdGljIHZvaWQgc3ZtX2RlY2FjaGVfY3I0X2d1ZXN0X2JpdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfY3IwX2ludGVyY2VwdChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKIHsKLQlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IHN2bS0+dm1jYjsKIAl1bG9uZyBnY3IwID0gc3ZtLT52Y3B1LmFyY2guY3IwOwogCXU2NCAqaGNyMCA9ICZzdm0tPnZtY2ItPnNhdmUuY3IwOwogCkBAIC0xMTg4LDI3ICsxMzQ2LDE0IEBACiAJCSpoY3IwID0gKCpoY3IwICYgflNWTV9DUjBfU0VMRUNUSVZFX01BU0spCiAJCQl8IChnY3IwICYgU1ZNX0NSMF9TRUxFQ1RJVkVfTUFTSyk7CiAKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9DUik7CiAKIAlpZiAoZ2NyMCA9PSAqaGNyMCAmJiBzdm0tPnZjcHUuZnB1X2FjdGl2ZSkgewotCQl2bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl9yZWFkICY9IH5JTlRFUkNFUFRfQ1IwX01BU0s7Ci0JCXZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3dyaXRlICY9IH5JTlRFUkNFUFRfQ1IwX01BU0s7Ci0JCWlmIChpc19uZXN0ZWQoc3ZtKSkgewotCQkJc3RydWN0IHZtY2IgKmhzYXZlID0gc3ZtLT5uZXN0ZWQuaHNhdmU7Ci0KLQkJCWhzYXZlLT5jb250cm9sLmludGVyY2VwdF9jcl9yZWFkICAmPSB+SU5URVJDRVBUX0NSMF9NQVNLOwotCQkJaHNhdmUtPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3dyaXRlICY9IH5JTlRFUkNFUFRfQ1IwX01BU0s7Ci0JCQl2bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl9yZWFkICB8PSBzdm0tPm5lc3RlZC5pbnRlcmNlcHRfY3JfcmVhZDsKLQkJCXZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3dyaXRlIHw9IHN2bS0+bmVzdGVkLmludGVyY2VwdF9jcl93cml0ZTsKLQkJfQorCQljbHJfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSMF9SRUFEKTsKKwkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjBfV1JJVEUpOwogCX0gZWxzZSB7Ci0JCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3JfcmVhZCB8PSBJTlRFUkNFUFRfQ1IwX01BU0s7Ci0JCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgfD0gSU5URVJDRVBUX0NSMF9NQVNLOwotCQlpZiAoaXNfbmVzdGVkKHN2bSkpIHsKLQkJCXN0cnVjdCB2bWNiICpoc2F2ZSA9IHN2bS0+bmVzdGVkLmhzYXZlOwotCi0JCQloc2F2ZS0+Y29udHJvbC5pbnRlcmNlcHRfY3JfcmVhZCB8PSBJTlRFUkNFUFRfQ1IwX01BU0s7Ci0JCQloc2F2ZS0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgfD0gSU5URVJDRVBUX0NSMF9NQVNLOwotCQl9CisJCXNldF9jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1IwX1JFQUQpOworCQlzZXRfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSMF9XUklURSk7CiAJfQogfQogCkBAIC0xMjE2LDcgKzEzNjEsNyBAQAogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCi0JaWYgKGlzX25lc3RlZChzdm0pKSB7CisJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpIHsKIAkJLyoKIAkJICogV2UgYXJlIGhlcmUgYmVjYXVzZSB3ZSBydW4gaW4gbmVzdGVkIG1vZGUsIHRoZSBob3N0IGt2bQogCQkgKiBpbnRlcmNlcHRzIGNyMCB3cml0ZXMgYnV0IHRoZSBsMSBoeXBlcnZpc29yIGRvZXMgbm90LgpAQCAtMTI2OCw2ICsxNDEzLDcgQEAKIAkgKi8KIAljcjAgJj0gfihYODZfQ1IwX0NEIHwgWDg2X0NSMF9OVyk7CiAJc3ZtLT52bWNiLT5zYXZlLmNyMCA9IGNyMDsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9DUik7CiAJdXBkYXRlX2NyMF9pbnRlcmNlcHQoc3ZtKTsKIH0KIApAQCAtMTI3NywxMyArMTQyMywxNCBAQAogCXVuc2lnbmVkIGxvbmcgb2xkX2NyNCA9IHRvX3N2bSh2Y3B1KS0+dm1jYi0+c2F2ZS5jcjQ7CiAKIAlpZiAobnB0X2VuYWJsZWQgJiYgKChvbGRfY3I0IF4gY3I0KSAmIFg4Nl9DUjRfUEdFKSkKLQkJZm9yY2VfbmV3X2FzaWQodmNwdSk7CisJCXN2bV9mbHVzaF90bGIodmNwdSk7CiAKIAl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKIAlpZiAoIW5wdF9lbmFibGVkKQogCQljcjQgfD0gWDg2X0NSNF9QQUU7CiAJY3I0IHw9IGhvc3RfY3I0X21jZTsKIAl0b19zdm0odmNwdSktPnZtY2ItPnNhdmUuY3I0ID0gY3I0OworCW1hcmtfZGlydHkodG9fc3ZtKHZjcHUpLT52bWNiLCBWTUNCX0NSKTsKIH0KIAogc3RhdGljIHZvaWQgc3ZtX3NldF9zZWdtZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTEzMTIsMjYgKzE0NTksMjUgQEAKIAkJCT0gKHN2bS0+dm1jYi0+c2F2ZS5jcy5hdHRyaWIKIAkJCSAgID4+IFNWTV9TRUxFQ1RPUl9EUExfU0hJRlQpICYgMzsKIAorCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX1NFRyk7CiB9CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9kYl9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCi0Jc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zICY9Ci0JCX4oKDEgPDwgREJfVkVDVE9SKSB8ICgxIDw8IEJQX1ZFQ1RPUikpOworCWNscl9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgREJfVkVDVE9SKTsKKwljbHJfZXhjZXB0aW9uX2ludGVyY2VwdChzdm0sIEJQX1ZFQ1RPUik7CiAKIAlpZiAoc3ZtLT5ubWlfc2luZ2xlc3RlcCkKLQkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zIHw9ICgxIDw8IERCX1ZFQ1RPUik7CisJCXNldF9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgREJfVkVDVE9SKTsKIAogCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19FTkFCTEUpIHsKIAkJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYKIAkJICAgIChLVk1fR1VFU1REQkdfU0lOR0xFU1RFUCB8IEtWTV9HVUVTVERCR19VU0VfSFdfQlApKQotCQkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zIHw9Ci0JCQkJMSA8PCBEQl9WRUNUT1I7CisJCQlzZXRfZXhjZXB0aW9uX2ludGVyY2VwdChzdm0sIERCX1ZFQ1RPUik7CiAJCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19VU0VfU1dfQlApCi0JCQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgfD0KLQkJCQkxIDw8IEJQX1ZFQ1RPUjsKKwkJCXNldF9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgQlBfVkVDVE9SKTsKIAl9IGVsc2UKIAkJdmNwdS0+Z3Vlc3RfZGVidWcgPSAwOwogfQpAQCAtMTM0NSwyMyArMTQ5MSwxMSBAQAogCWVsc2UKIAkJc3ZtLT52bWNiLT5zYXZlLmRyNyA9IHZjcHUtPmFyY2guZHI3OwogCisJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfRFIpOworCiAJdXBkYXRlX2RiX2ludGVyY2VwdCh2Y3B1KTsKIH0KIAotc3RhdGljIHZvaWQgbG9hZF9ob3N0X21zcnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotI2lmZGVmIENPTkZJR19YODZfNjQKLQl3cm1zcmwoTVNSX0dTX0JBU0UsIHRvX3N2bSh2Y3B1KS0+aG9zdF9nc19iYXNlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBzYXZlX2hvc3RfbXNycyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXJkbXNybChNU1JfR1NfQkFTRSwgdG9fc3ZtKHZjcHUpLT5ob3N0X2dzX2Jhc2UpOwotI2VuZGlmCi19Ci0KIHN0YXRpYyB2b2lkIG5ld19hc2lkKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBzdHJ1Y3Qgc3ZtX2NwdV9kYXRhICpzZCkKIHsKIAlpZiAoc2QtPm5leHRfYXNpZCA+IHNkLT5tYXhfYXNpZCkgewpAQCAtMTM3Miw2ICsxNTA2LDggQEAKIAogCXN2bS0+YXNpZF9nZW5lcmF0aW9uID0gc2QtPmFzaWRfZ2VuZXJhdGlvbjsKIAlzdm0tPnZtY2ItPmNvbnRyb2wuYXNpZCA9IHNkLT5uZXh0X2FzaWQrKzsKKworCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX0FTSUQpOwogfQogCiBzdGF0aWMgdm9pZCBzdm1fc2V0X2RyNyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCkBAIC0xMzc5LDIwICsxNTE1LDQwIEBACiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAKIAlzdm0tPnZtY2ItPnNhdmUuZHI3ID0gdmFsdWU7CisJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfRFIpOwogfQogCiBzdGF0aWMgaW50IHBmX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKIHsKLQl1NjQgZmF1bHRfYWRkcmVzczsKKwl1NjQgZmF1bHRfYWRkcmVzcyA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMjsKIAl1MzIgZXJyb3JfY29kZTsKKwlpbnQgciA9IDE7CiAKLQlmYXVsdF9hZGRyZXNzICA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMjsKLQllcnJvcl9jb2RlID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xOworCXN3aXRjaCAoc3ZtLT5hcGZfcmVhc29uKSB7CisJZGVmYXVsdDoKKwkJZXJyb3JfY29kZSA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMTsKIAotCXRyYWNlX2t2bV9wYWdlX2ZhdWx0KGZhdWx0X2FkZHJlc3MsIGVycm9yX2NvZGUpOwotCWlmICghbnB0X2VuYWJsZWQgJiYga3ZtX2V2ZW50X25lZWRzX3JlaW5qZWN0aW9uKCZzdm0tPnZjcHUpKQotCQlrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQoJnN2bS0+dmNwdSwgZmF1bHRfYWRkcmVzcyk7Ci0JcmV0dXJuIGt2bV9tbXVfcGFnZV9mYXVsdCgmc3ZtLT52Y3B1LCBmYXVsdF9hZGRyZXNzLCBlcnJvcl9jb2RlKTsKKwkJdHJhY2Vfa3ZtX3BhZ2VfZmF1bHQoZmF1bHRfYWRkcmVzcywgZXJyb3JfY29kZSk7CisJCWlmICghbnB0X2VuYWJsZWQgJiYga3ZtX2V2ZW50X25lZWRzX3JlaW5qZWN0aW9uKCZzdm0tPnZjcHUpKQorCQkJa3ZtX21tdV91bnByb3RlY3RfcGFnZV92aXJ0KCZzdm0tPnZjcHUsIGZhdWx0X2FkZHJlc3MpOworCQlyID0ga3ZtX21tdV9wYWdlX2ZhdWx0KCZzdm0tPnZjcHUsIGZhdWx0X2FkZHJlc3MsIGVycm9yX2NvZGUsCisJCQlzdm0tPnZtY2ItPmNvbnRyb2wuaW5zbl9ieXRlcywKKwkJCXN2bS0+dm1jYi0+Y29udHJvbC5pbnNuX2xlbik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1BWX1JFQVNPTl9QQUdFX05PVF9QUkVTRU5UOgorCQlzdm0tPmFwZl9yZWFzb24gPSAwOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlrdm1fYXN5bmNfcGZfdGFza193YWl0KGZhdWx0X2FkZHJlc3MpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1BWX1JFQVNPTl9QQUdFX1JFQURZOgorCQlzdm0tPmFwZl9yZWFzb24gPSAwOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlrdm1fYXN5bmNfcGZfdGFza193YWtlKGZhdWx0X2FkZHJlc3MpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBkYl9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCkBAIC0xNDQwLDcgKzE1OTYsNyBAQAogewogCWludCBlcjsKIAotCWVyID0gZW11bGF0ZV9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1LCAwLCAwLCBFTVVMVFlQRV9UUkFQX1VEKTsKKwllciA9IGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgRU1VTFRZUEVfVFJBUF9VRCk7CiAJaWYgKGVyICE9IEVNVUxBVEVfRE9ORSkKIAkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbigmc3ZtLT52Y3B1LCBVRF9WRUNUT1IpOwogCXJldHVybiAxOwpAQCAtMTQ0OSwyMSArMTYwNSw4IEBACiBzdGF0aWMgdm9pZCBzdm1fZnB1X2FjdGl2YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKLQl1MzIgZXhjcDsKIAotCWlmIChpc19uZXN0ZWQoc3ZtKSkgewotCQl1MzIgaF9leGNwLCBuX2V4Y3A7Ci0KLQkJaF9leGNwICA9IHN2bS0+bmVzdGVkLmhzYXZlLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zOwotCQluX2V4Y3AgID0gc3ZtLT5uZXN0ZWQuaW50ZXJjZXB0X2V4Y2VwdGlvbnM7Ci0JCWhfZXhjcCAmPSB+KDEgPDwgTk1fVkVDVE9SKTsKLQkJZXhjcCAgICA9IGhfZXhjcCB8IG5fZXhjcDsKLQl9IGVsc2UgewotCQlleGNwICA9IHN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9uczsKLQkJZXhjcCAmPSB+KDEgPDwgTk1fVkVDVE9SKTsKLQl9Ci0KLQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgPSBleGNwOworCWNscl9leGNlcHRpb25faW50ZXJjZXB0KHN2bSwgTk1fVkVDVE9SKTsKIAogCXN2bS0+dmNwdS5mcHVfYWN0aXZlID0gMTsKIAl1cGRhdGVfY3IwX2ludGVyY2VwdChzdm0pOwpAQCAtMTU3MCw3ICsxNzEzLDcgQEAKIAlzdHJpbmcgPSAoaW9faW5mbyAmIFNWTV9JT0lPX1NUUl9NQVNLKSAhPSAwOwogCWluID0gKGlvX2luZm8gJiBTVk1fSU9JT19UWVBFX01BU0spICE9IDA7CiAJaWYgKHN0cmluZyB8fCBpbikKLQkJcmV0dXJuIGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCwgMCwgMCkgPT0gRU1VTEFURV9ET05FOworCQlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwKSA9PSBFTVVMQVRFX0RPTkU7CiAKIAlwb3J0ID0gaW9faW5mbyA+PiAxNjsKIAlzaXplID0gKGlvX2luZm8gJiBTVk1fSU9JT19TSVpFX01BU0spID4+IFNWTV9JT0lPX1NJWkVfU0hJRlQ7CkBAIC0xNjI0LDE3ICsxNzY3LDE5IEBACiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAKIAlzdm0tPnZtY2ItPmNvbnRyb2wubmVzdGVkX2NyMyA9IHJvb3Q7Ci0JZm9yY2VfbmV3X2FzaWQodmNwdSk7CisJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfTlBUKTsKKwlzdm1fZmx1c2hfdGxiKHZjcHUpOwogfQogCi1zdGF0aWMgdm9pZCBuZXN0ZWRfc3ZtX2luamVjdF9ucGZfZXhpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgdm9pZCBuZXN0ZWRfc3ZtX2luamVjdF9ucGZfZXhpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAogCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2NvZGUgPSBTVk1fRVhJVF9OUEY7CiAJc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZV9oaSA9IDA7Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xID0gdmNwdS0+YXJjaC5mYXVsdC5lcnJvcl9jb2RlOwotCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMiA9IHZjcHUtPmFyY2guZmF1bHQuYWRkcmVzczsKKwlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzEgPSBmYXVsdC0+ZXJyb3JfY29kZTsKKwlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzIgPSBmYXVsdC0+YWRkcmVzczsKIAogCW5lc3RlZF9zdm1fdm1leGl0KHN2bSk7CiB9CkBAIC0xNjgwLDcgKzE4MjUsNyBAQAogewogCWludCB2bWV4aXQ7CiAKLQlpZiAoIWlzX25lc3RlZChzdm0pKQorCWlmICghaXNfZ3Vlc3RfbW9kZSgmc3ZtLT52Y3B1KSkKIAkJcmV0dXJuIDA7CiAKIAlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlID0gU1ZNX0VYSVRfRVhDUF9CQVNFICsgbnI7CkBAIC0xNjk4LDcgKzE4NDMsNyBAQAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaXQgaXMgc2F2ZSB0byBlbmFibGUgdGhlIGlycSB3aW5kb3cgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBuZXN0ZWRfc3ZtX2ludHIoc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0JaWYgKCFpc19uZXN0ZWQoc3ZtKSkKKwlpZiAoIWlzX2d1ZXN0X21vZGUoJnN2bS0+dmNwdSkpCiAJCXJldHVybiB0cnVlOwogCiAJaWYgKCEoc3ZtLT52Y3B1LmFyY2guaGZsYWdzICYgSEZfVklOVFJfTUFTSykpCkBAIC0xNzM3LDcgKzE4ODIsNyBAQAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaXQgaXMgc2F2ZSB0byBlbmFibGUgdGhlIG5taSB3aW5kb3cgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBuZXN0ZWRfc3ZtX25taShzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKIHsKLQlpZiAoIWlzX25lc3RlZChzdm0pKQorCWlmICghaXNfZ3Vlc3RfbW9kZSgmc3ZtLT52Y3B1KSkKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoIShzdm0tPm5lc3RlZC5pbnRlcmNlcHQgJiAoMVVMTCA8PCBJTlRFUkNFUFRfTk1JKSkpCkBAIC0xODM2LDggKzE5ODEsOCBAQAogCQkJcmV0dXJuIE5FU1RFRF9FWElUX0hPU1Q7CiAJCWJyZWFrOwogCWNhc2UgU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SOgotCQkvKiBXaGVuIHdlJ3JlIHNoYWRvd2luZywgdHJhcCBQRnMgKi8KLQkJaWYgKCFucHRfZW5hYmxlZCkKKwkJLyogV2hlbiB3ZSdyZSBzaGFkb3dpbmcsIHRyYXAgUEZzLCBidXQgbm90IGFzeW5jIFBGICovCisJCWlmICghbnB0X2VuYWJsZWQgJiYgc3ZtLT5hcGZfcmVhc29uID09IDApCiAJCQlyZXR1cm4gTkVTVEVEX0VYSVRfSE9TVDsKIAkJYnJlYWs7CiAJY2FzZSBTVk1fRVhJVF9FWENQX0JBU0UgKyBOTV9WRUNUT1I6CkBAIC0xODY1LDI3ICsyMDEwLDE1IEBACiAJY2FzZSBTVk1fRVhJVF9JT0lPOgogCQl2bWV4aXQgPSBuZXN0ZWRfc3ZtX2ludGVyY2VwdF9pb2lvKHN2bSk7CiAJCWJyZWFrOwotCWNhc2UgU1ZNX0VYSVRfUkVBRF9DUjAgLi4uIFNWTV9FWElUX1JFQURfQ1I4OiB7Ci0JCXUzMiBjcl9iaXRzID0gMSA8PCAoZXhpdF9jb2RlIC0gU1ZNX0VYSVRfUkVBRF9DUjApOwotCQlpZiAoc3ZtLT5uZXN0ZWQuaW50ZXJjZXB0X2NyX3JlYWQgJiBjcl9iaXRzKQorCWNhc2UgU1ZNX0VYSVRfUkVBRF9DUjAgLi4uIFNWTV9FWElUX1dSSVRFX0NSODogeworCQl1MzIgYml0ID0gMVUgPDwgKGV4aXRfY29kZSAtIFNWTV9FWElUX1JFQURfQ1IwKTsKKwkJaWYgKHN2bS0+bmVzdGVkLmludGVyY2VwdF9jciAmIGJpdCkKIAkJCXZtZXhpdCA9IE5FU1RFRF9FWElUX0RPTkU7CiAJCWJyZWFrOwogCX0KLQljYXNlIFNWTV9FWElUX1dSSVRFX0NSMCAuLi4gU1ZNX0VYSVRfV1JJVEVfQ1I4OiB7Ci0JCXUzMiBjcl9iaXRzID0gMSA8PCAoZXhpdF9jb2RlIC0gU1ZNX0VYSVRfV1JJVEVfQ1IwKTsKLQkJaWYgKHN2bS0+bmVzdGVkLmludGVyY2VwdF9jcl93cml0ZSAmIGNyX2JpdHMpCi0JCQl2bWV4aXQgPSBORVNURURfRVhJVF9ET05FOwotCQlicmVhazsKLQl9Ci0JY2FzZSBTVk1fRVhJVF9SRUFEX0RSMCAuLi4gU1ZNX0VYSVRfUkVBRF9EUjc6IHsKLQkJdTMyIGRyX2JpdHMgPSAxIDw8IChleGl0X2NvZGUgLSBTVk1fRVhJVF9SRUFEX0RSMCk7Ci0JCWlmIChzdm0tPm5lc3RlZC5pbnRlcmNlcHRfZHJfcmVhZCAmIGRyX2JpdHMpCi0JCQl2bWV4aXQgPSBORVNURURfRVhJVF9ET05FOwotCQlicmVhazsKLQl9Ci0JY2FzZSBTVk1fRVhJVF9XUklURV9EUjAgLi4uIFNWTV9FWElUX1dSSVRFX0RSNzogewotCQl1MzIgZHJfYml0cyA9IDEgPDwgKGV4aXRfY29kZSAtIFNWTV9FWElUX1dSSVRFX0RSMCk7Ci0JCWlmIChzdm0tPm5lc3RlZC5pbnRlcmNlcHRfZHJfd3JpdGUgJiBkcl9iaXRzKQorCWNhc2UgU1ZNX0VYSVRfUkVBRF9EUjAgLi4uIFNWTV9FWElUX1dSSVRFX0RSNzogeworCQl1MzIgYml0ID0gMVUgPDwgKGV4aXRfY29kZSAtIFNWTV9FWElUX1JFQURfRFIwKTsKKwkJaWYgKHN2bS0+bmVzdGVkLmludGVyY2VwdF9kciAmIGJpdCkKIAkJCXZtZXhpdCA9IE5FU1RFRF9FWElUX0RPTkU7CiAJCWJyZWFrOwogCX0KQEAgLTE4OTMsNiArMjAyNiwxMCBAQAogCQl1MzIgZXhjcF9iaXRzID0gMSA8PCAoZXhpdF9jb2RlIC0gU1ZNX0VYSVRfRVhDUF9CQVNFKTsKIAkJaWYgKHN2bS0+bmVzdGVkLmludGVyY2VwdF9leGNlcHRpb25zICYgZXhjcF9iaXRzKQogCQkJdm1leGl0ID0gTkVTVEVEX0VYSVRfRE9ORTsKKwkJLyogYXN5bmMgcGFnZSBmYXVsdCBhbHdheXMgY2F1c2Ugdm1leGl0ICovCisJCWVsc2UgaWYgKChleGl0X2NvZGUgPT0gU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SKSAmJgorCQkJIHN2bS0+YXBmX3JlYXNvbiAhPSAwKQorCQkJdm1leGl0ID0gTkVTVEVEX0VYSVRfRE9ORTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU1ZNX0VYSVRfRVJSOiB7CkBAIC0xOTI2LDEwICsyMDYzLDggQEAKIAlzdHJ1Y3Qgdm1jYl9jb250cm9sX2FyZWEgKmRzdCAgPSAmZHN0X3ZtY2ItPmNvbnRyb2w7CiAJc3RydWN0IHZtY2JfY29udHJvbF9hcmVhICpmcm9tID0gJmZyb21fdm1jYi0+Y29udHJvbDsKIAotCWRzdC0+aW50ZXJjZXB0X2NyX3JlYWQgICAgPSBmcm9tLT5pbnRlcmNlcHRfY3JfcmVhZDsKLQlkc3QtPmludGVyY2VwdF9jcl93cml0ZSAgID0gZnJvbS0+aW50ZXJjZXB0X2NyX3dyaXRlOwotCWRzdC0+aW50ZXJjZXB0X2RyX3JlYWQgICAgPSBmcm9tLT5pbnRlcmNlcHRfZHJfcmVhZDsKLQlkc3QtPmludGVyY2VwdF9kcl93cml0ZSAgID0gZnJvbS0+aW50ZXJjZXB0X2RyX3dyaXRlOworCWRzdC0+aW50ZXJjZXB0X2NyICAgICAgICAgPSBmcm9tLT5pbnRlcmNlcHRfY3I7CisJZHN0LT5pbnRlcmNlcHRfZHIgICAgICAgICA9IGZyb20tPmludGVyY2VwdF9kcjsKIAlkc3QtPmludGVyY2VwdF9leGNlcHRpb25zID0gZnJvbS0+aW50ZXJjZXB0X2V4Y2VwdGlvbnM7CiAJZHN0LT5pbnRlcmNlcHQgICAgICAgICAgICA9IGZyb20tPmludGVyY2VwdDsKIAlkc3QtPmlvcG1fYmFzZV9wYSAgICAgICAgID0gZnJvbS0+aW9wbV9iYXNlX3BhOwpAQCAtMTk3MCw3ICsyMTA1LDggQEAKIAlpZiAoIW5lc3RlZF92bWNiKQogCQlyZXR1cm4gMTsKIAotCS8qIEV4aXQgbmVzdGVkIFNWTSBtb2RlICovCisJLyogRXhpdCBHdWVzdC1Nb2RlICovCisJbGVhdmVfZ3Vlc3RfbW9kZSgmc3ZtLT52Y3B1KTsKIAlzdm0tPm5lc3RlZC52bWNiID0gMDsKIAogCS8qIEdpdmUgdGhlIGN1cnJlbnQgdm1jYiB0byB0aGUgZ3Vlc3QgKi8KQEAgLTE5ODQsNyArMjEyMCw3IEBACiAJbmVzdGVkX3ZtY2ItPnNhdmUuaWR0ciAgID0gdm1jYi0+c2F2ZS5pZHRyOwogCW5lc3RlZF92bWNiLT5zYXZlLmVmZXIgICA9IHN2bS0+dmNwdS5hcmNoLmVmZXI7CiAJbmVzdGVkX3ZtY2ItPnNhdmUuY3IwICAgID0ga3ZtX3JlYWRfY3IwKCZzdm0tPnZjcHUpOwotCW5lc3RlZF92bWNiLT5zYXZlLmNyMyAgICA9IHN2bS0+dmNwdS5hcmNoLmNyMzsKKwluZXN0ZWRfdm1jYi0+c2F2ZS5jcjMgICAgPSBrdm1fcmVhZF9jcjMoJnN2bS0+dmNwdSk7CiAJbmVzdGVkX3ZtY2ItPnNhdmUuY3IyICAgID0gdm1jYi0+c2F2ZS5jcjI7CiAJbmVzdGVkX3ZtY2ItPnNhdmUuY3I0ICAgID0gc3ZtLT52Y3B1LmFyY2guY3I0OwogCW5lc3RlZF92bWNiLT5zYXZlLnJmbGFncyA9IHZtY2ItPnNhdmUucmZsYWdzOwpAQCAtMjA2MSw2ICsyMTk3LDggQEAKIAlzdm0tPnZtY2ItPnNhdmUuY3BsID0gMDsKIAlzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyA9IDA7CiAKKwltYXJrX2FsbF9kaXJ0eShzdm0tPnZtY2IpOworCiAJbmVzdGVkX3N2bV91bm1hcChwYWdlKTsKIAogCW5lc3RlZF9zdm1fdW5pbml0X21tdV9jb250ZXh0KCZzdm0tPnZjcHUpOwpAQCAtMjE0OCw4ICsyMjg2LDggQEAKIAkJCSAgICAgICBuZXN0ZWRfdm1jYi0+Y29udHJvbC5ldmVudF9pbmosCiAJCQkgICAgICAgbmVzdGVkX3ZtY2ItPmNvbnRyb2wubmVzdGVkX2N0bCk7CiAKLQl0cmFjZV9rdm1fbmVzdGVkX2ludGVyY2VwdHMobmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3JlYWQsCi0JCQkJICAgIG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSwKKwl0cmFjZV9rdm1fbmVzdGVkX2ludGVyY2VwdHMobmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyICYgMHhmZmZmLAorCQkJCSAgICBuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3IgPj4gMTYsCiAJCQkJICAgIG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zLAogCQkJCSAgICBuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHQpOwogCkBAIC0yMTc3LDcgKzIzMTUsNyBAQAogCWlmIChucHRfZW5hYmxlZCkKIAkJaHNhdmUtPnNhdmUuY3IzICAgID0gdm1jYi0+c2F2ZS5jcjM7CiAJZWxzZQotCQloc2F2ZS0+c2F2ZS5jcjMgICAgPSBzdm0tPnZjcHUuYXJjaC5jcjM7CisJCWhzYXZlLT5zYXZlLmNyMyAgICA9IGt2bV9yZWFkX2NyMygmc3ZtLT52Y3B1KTsKIAogCWNvcHlfdm1jYl9jb250cm9sX2FyZWEoaHNhdmUsIHZtY2IpOwogCkBAIC0yMjI5LDE0ICsyMzY3LDEyIEBACiAJc3ZtLT5uZXN0ZWQudm1jYl9pb3BtICA9IG5lc3RlZF92bWNiLT5jb250cm9sLmlvcG1fYmFzZV9wYSAgJiB+MHgwZmZmVUxMOwogCiAJLyogY2FjaGUgaW50ZXJjZXB0cyAqLwotCXN2bS0+bmVzdGVkLmludGVyY2VwdF9jcl9yZWFkICAgID0gbmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3JlYWQ7Ci0Jc3ZtLT5uZXN0ZWQuaW50ZXJjZXB0X2NyX3dyaXRlICAgPSBuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGU7Ci0Jc3ZtLT5uZXN0ZWQuaW50ZXJjZXB0X2RyX3JlYWQgICAgPSBuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZHJfcmVhZDsKLQlzdm0tPm5lc3RlZC5pbnRlcmNlcHRfZHJfd3JpdGUgICA9IG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9kcl93cml0ZTsKKwlzdm0tPm5lc3RlZC5pbnRlcmNlcHRfY3IgICAgICAgICA9IG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9jcjsKKwlzdm0tPm5lc3RlZC5pbnRlcmNlcHRfZHIgICAgICAgICA9IG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9kcjsKIAlzdm0tPm5lc3RlZC5pbnRlcmNlcHRfZXhjZXB0aW9ucyA9IG5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9leGNlcHRpb25zOwogCXN2bS0+bmVzdGVkLmludGVyY2VwdCAgICAgICAgICAgID0gbmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0OwogCi0JZm9yY2VfbmV3X2FzaWQoJnN2bS0+dmNwdSk7CisJc3ZtX2ZsdXNoX3RsYigmc3ZtLT52Y3B1KTsKIAlzdm0tPnZtY2ItPmNvbnRyb2wuaW50X2N0bCA9IG5lc3RlZF92bWNiLT5jb250cm9sLmludF9jdGwgfCBWX0lOVFJfTUFTS0lOR19NQVNLOwogCWlmIChuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRfY3RsICYgVl9JTlRSX01BU0tJTkdfTUFTSykKIAkJc3ZtLT52Y3B1LmFyY2guaGZsYWdzIHw9IEhGX1ZJTlRSX01BU0s7CkBAIC0yMjQ1LDI5ICsyMzgxLDEyIEBACiAKIAlpZiAoc3ZtLT52Y3B1LmFyY2guaGZsYWdzICYgSEZfVklOVFJfTUFTSykgewogCQkvKiBXZSBvbmx5IHdhbnQgdGhlIGNyOCBpbnRlcmNlcHQgYml0cyBvZiB0aGUgZ3Vlc3QgKi8KLQkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl9yZWFkICY9IH5JTlRFUkNFUFRfQ1I4X01BU0s7Ci0JCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgJj0gfklOVEVSQ0VQVF9DUjhfTUFTSzsKKwkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjhfUkVBRCk7CisJCWNscl9jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1I4X1dSSVRFKTsKIAl9CiAKIAkvKiBXZSBkb24ndCB3YW50IHRvIHNlZSBWTU1DQUxMcyBmcm9tIGEgbmVzdGVkIGd1ZXN0ICovCi0Jc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdCAmPSB+KDFVTEwgPDwgSU5URVJDRVBUX1ZNTUNBTEwpOwotCi0JLyoKLQkgKiBXZSBkb24ndCB3YW50IGEgbmVzdGVkIGd1ZXN0IHRvIGJlIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGUgZ3Vlc3QsIHNvCi0JICogYWxsIGludGVyY2VwdHMgYXJlIE9SZWQKLQkgKi8KLQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3JlYWQgfD0KLQkJbmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3JlYWQ7Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSB8PQotCQluZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGU7Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9kcl9yZWFkIHw9Ci0JCW5lc3RlZF92bWNiLT5jb250cm9sLmludGVyY2VwdF9kcl9yZWFkOwotCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZHJfd3JpdGUgfD0KLQkJbmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2RyX3dyaXRlOwotCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9ucyB8PQotCQluZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9uczsKLQotCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgfD0gbmVzdGVkX3ZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0OworCWNscl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfVk1NQ0FMTCk7CiAKIAlzdm0tPnZtY2ItPmNvbnRyb2wubGJyX2N0bCA9IG5lc3RlZF92bWNiLT5jb250cm9sLmxicl9jdGw7CiAJc3ZtLT52bWNiLT5jb250cm9sLmludF92ZWN0b3IgPSBuZXN0ZWRfdm1jYi0+Y29udHJvbC5pbnRfdmVjdG9yOwpAQCAtMjI3OCwxMSArMjM5NywyMSBAQAogCiAJbmVzdGVkX3N2bV91bm1hcChwYWdlKTsKIAotCS8qIG5lc3RlZF92bWNiIGlzIG91ciBpbmRpY2F0b3IgaWYgbmVzdGVkIFNWTSBpcyBhY3RpdmF0ZWQgKi8KKwkvKiBFbnRlciBHdWVzdC1Nb2RlICovCisJZW50ZXJfZ3Vlc3RfbW9kZSgmc3ZtLT52Y3B1KTsKKworCS8qCisJICogTWVyZ2UgZ3Vlc3QgYW5kIGhvc3QgaW50ZXJjZXB0cyAtIG11c3QgYmUgY2FsbGVkICB3aXRoIHZjcHUgaW4KKwkgKiBndWVzdC1tb2RlIHRvIHRha2UgYWZmZWN0IGhlcmUKKwkgKi8KKwlyZWNhbGNfaW50ZXJjZXB0cyhzdm0pOworCiAJc3ZtLT5uZXN0ZWQudm1jYiA9IHZtY2JfZ3BhOwogCiAJZW5hYmxlX2dpZihzdm0pOwogCisJbWFya19hbGxfZGlydHkoc3ZtLT52bWNiKTsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC0yNDAwLDYgKzI1MjksOCBAQAogCXN2bV9jbGVhcl92aW50cihzdm0pOwogCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfY3RsICY9IH5WX0lSUV9NQVNLOwogCisJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfSU5UUik7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjQyNiw2ICsyNTU3LDE5IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQgeHNldGJ2X2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKK3sKKwl1NjQgbmV3X2J2ID0ga3ZtX3JlYWRfZWR4X2VheCgmc3ZtLT52Y3B1KTsKKwl1MzIgaW5kZXggPSBrdm1fcmVnaXN0ZXJfcmVhZCgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKKworCWlmIChrdm1fc2V0X3hjcigmc3ZtLT52Y3B1LCBpbmRleCwgbmV3X2J2KSA9PSAwKSB7CisJCXN2bS0+bmV4dF9yaXAgPSBrdm1fcmlwX3JlYWQoJnN2bS0+dmNwdSkgKyAzOworCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKCZzdm0tPnZjcHUpOworCX0KKworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewogCWt2bV9xdWV1ZV9leGNlcHRpb24oJnN2bS0+dmNwdSwgVURfVkVDVE9SKTsKQEAgLTI1MDcsMTkgKzI2NTEsOTIgQEAKIHN0YXRpYyBpbnQgaXJldF9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7CiAJKytzdm0tPnZjcHUuc3RhdC5ubWlfd2luZG93X2V4aXRzOwotCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgJj0gfigxVUxMIDw8IElOVEVSQ0VQVF9JUkVUKTsKKwljbHJfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lSRVQpOwogCXN2bS0+dmNwdS5hcmNoLmhmbGFncyB8PSBIRl9JUkVUX01BU0s7CiAJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgaW52bHBnX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKIHsKLQlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkU7CisJaWYgKCFzdGF0aWNfY3B1X2hhcyhYODZfRkVBVFVSRV9ERUNPREVBU1NJU1RTKSkKKwkJcmV0dXJuIGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgMCkgPT0gRU1VTEFURV9ET05FOworCisJa3ZtX21tdV9pbnZscGcoJnN2bS0+dmNwdSwgc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xKTsKKwlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKCZzdm0tPnZjcHUpOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewotCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKCZzdm0tPnZjcHUsIDAsIDAsIDApID09IEVNVUxBVEVfRE9ORTsKKwlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1LCAwKSA9PSBFTVVMQVRFX0RPTkU7Cit9CisKKyNkZWZpbmUgQ1JfVkFMSUQgKDFVTEwgPDwgNjMpCisKK3N0YXRpYyBpbnQgY3JfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQoreworCWludCByZWcsIGNyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnI7CisKKwlpZiAoIXN0YXRpY19jcHVfaGFzKFg4Nl9GRUFUVVJFX0RFQ09ERUFTU0lTVFMpKQorCQlyZXR1cm4gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24oc3ZtKTsKKworCWlmICh1bmxpa2VseSgoc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xICYgQ1JfVkFMSUQpID09IDApKQorCQlyZXR1cm4gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24oc3ZtKTsKKworCXJlZyA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMSAmIFNWTV9FWElUSU5GT19SRUdfTUFTSzsKKwljciA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2NvZGUgLSBTVk1fRVhJVF9SRUFEX0NSMDsKKworCWVyciA9IDA7CisJaWYgKGNyID49IDE2KSB7IC8qIG1vdiB0byBjciAqLworCQljciAtPSAxNjsKKwkJdmFsID0ga3ZtX3JlZ2lzdGVyX3JlYWQoJnN2bS0+dmNwdSwgcmVnKTsKKwkJc3dpdGNoIChjcikgeworCQljYXNlIDA6CisJCQllcnIgPSBrdm1fc2V0X2NyMCgmc3ZtLT52Y3B1LCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWVyciA9IGt2bV9zZXRfY3IzKCZzdm0tPnZjcHUsIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJZXJyID0ga3ZtX3NldF9jcjQoJnN2bS0+dmNwdSwgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQllcnIgPSBrdm1fc2V0X2NyOCgmc3ZtLT52Y3B1LCB2YWwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlXQVJOKDEsICJ1bmhhbmRsZWQgd3JpdGUgdG8gQ1IlZCIsIGNyKTsKKwkJCWt2bV9xdWV1ZV9leGNlcHRpb24oJnN2bS0+dmNwdSwgVURfVkVDVE9SKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsgLyogbW92IGZyb20gY3IgKi8KKwkJc3dpdGNoIChjcikgeworCQljYXNlIDA6CisJCQl2YWwgPSBrdm1fcmVhZF9jcjAoJnN2bS0+dmNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmFsID0gc3ZtLT52Y3B1LmFyY2guY3IyOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXZhbCA9IGt2bV9yZWFkX2NyMygmc3ZtLT52Y3B1KTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl2YWwgPSBrdm1fcmVhZF9jcjQoJnN2bS0+dmNwdSk7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJdmFsID0ga3ZtX2dldF9jcjgoJnN2bS0+dmNwdSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdBUk4oMSwgInVuaGFuZGxlZCByZWFkIGZyb20gQ1IlZCIsIGNyKTsKKwkJCWt2bV9xdWV1ZV9leGNlcHRpb24oJnN2bS0+dmNwdSwgVURfVkVDVE9SKTsKKwkJCXJldHVybiAxOworCQl9CisJCWt2bV9yZWdpc3Rlcl93cml0ZSgmc3ZtLT52Y3B1LCByZWcsIHZhbCk7CisJfQorCWt2bV9jb21wbGV0ZV9pbnNuX2dwKCZzdm0tPnZjcHUsIGVycik7CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBjcjBfd3JpdGVfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQpAQCAtMjUyNyw3ICsyNzQ0LDcgQEAKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSAmc3ZtLT52Y3B1OwogCWludCByOwogCi0JciA9IGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgMCwgMCwgMCk7CisJciA9IGNyX2ludGVyY2VwdGlvbihzdm0pOwogCiAJaWYgKHN2bS0+bmVzdGVkLnZtZXhpdF9yaXApIHsKIAkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIFZDUFVfUkVHU19SSVAsIHN2bS0+bmVzdGVkLnZtZXhpdF9yaXApOwpAQCAtMjUzNiwyMiArMjc1Myw0NyBAQAogCQlzdm0tPm5lc3RlZC52bWV4aXRfcmlwID0gMDsKIAl9CiAKLQlyZXR1cm4gciA9PSBFTVVMQVRFX0RPTkU7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZHJfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQoreworCWludCByZWcsIGRyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnI7CisKKwlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9ERUNPREVBU1NJU1RTKSkKKwkJcmV0dXJuIGVtdWxhdGVfb25faW50ZXJjZXB0aW9uKHN2bSk7CisKKwlyZWcgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzEgJiBTVk1fRVhJVElORk9fUkVHX01BU0s7CisJZHIgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlIC0gU1ZNX0VYSVRfUkVBRF9EUjA7CisKKwlpZiAoZHIgPj0gMTYpIHsgLyogbW92IHRvIERSbiAqLworCQl2YWwgPSBrdm1fcmVnaXN0ZXJfcmVhZCgmc3ZtLT52Y3B1LCByZWcpOworCQlrdm1fc2V0X2RyKCZzdm0tPnZjcHUsIGRyIC0gMTYsIHZhbCk7CisJfSBlbHNlIHsKKwkJZXJyID0ga3ZtX2dldF9kcigmc3ZtLT52Y3B1LCBkciwgJnZhbCk7CisJCWlmICghZXJyKQorCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKCZzdm0tPnZjcHUsIHJlZywgdmFsKTsKKwl9CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBjcjhfd3JpdGVfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewogCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuID0gc3ZtLT52Y3B1LnJ1bjsKKwlpbnQgcjsKIAogCXU4IGNyOF9wcmV2ID0ga3ZtX2dldF9jcjgoJnN2bS0+dmNwdSk7CiAJLyogaW5zdHJ1Y3Rpb24gZW11bGF0aW9uIGNhbGxzIGt2bV9zZXRfY3I4KCkgKi8KLQllbXVsYXRlX2luc3RydWN0aW9uKCZzdm0tPnZjcHUsIDAsIDAsIDApOworCXIgPSBjcl9pbnRlcmNlcHRpb24oc3ZtKTsKIAlpZiAoaXJxY2hpcF9pbl9rZXJuZWwoc3ZtLT52Y3B1Lmt2bSkpIHsKLQkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSAmPSB+SU5URVJDRVBUX0NSOF9NQVNLOwotCQlyZXR1cm4gMTsKKwkJY2xyX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjhfV1JJVEUpOworCQlyZXR1cm4gcjsKIAl9CiAJaWYgKGNyOF9wcmV2IDw9IGt2bV9nZXRfY3I4KCZzdm0tPnZjcHUpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHI7CiAJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9TRVRfVFBSOwogCXJldHVybiAwOwogfQpAQCAtMjU2MiwxNCArMjgwNCw5IEBACiAKIAlzd2l0Y2ggKGVjeCkgewogCWNhc2UgTVNSX0lBMzJfVFNDOiB7Ci0JCXU2NCB0c2Nfb2Zmc2V0OworCQlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IGdldF9ob3N0X3ZtY2Ioc3ZtKTsKIAotCQlpZiAoaXNfbmVzdGVkKHN2bSkpCi0JCQl0c2Nfb2Zmc2V0ID0gc3ZtLT5uZXN0ZWQuaHNhdmUtPmNvbnRyb2wudHNjX29mZnNldDsKLQkJZWxzZQotCQkJdHNjX29mZnNldCA9IHN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0OwotCi0JCSpkYXRhID0gdHNjX29mZnNldCArIG5hdGl2ZV9yZWFkX3RzYygpOworCQkqZGF0YSA9IHZtY2ItPmNvbnRyb2wudHNjX29mZnNldCArIG5hdGl2ZV9yZWFkX3RzYygpOwogCQlicmVhazsKIAl9CiAJY2FzZSBNU1JfU1RBUjoKQEAgLTI3MTQsNyArMjk1MSw3IEBACiAJCXN2bS0+dm1jYi0+c2F2ZS5zeXNlbnRlcl9lc3AgPSBkYXRhOwogCQlicmVhazsKIAljYXNlIE1TUl9JQTMyX0RFQlVHQ1RMTVNSOgotCQlpZiAoIXN2bV9oYXMoU1ZNX0ZFQVRVUkVfTEJSVikpIHsKKwkJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTEJSVikpIHsKIAkJCXByX3VuaW1wbCh2Y3B1LCAiJXM6IE1TUl9JQTMyX0RFQlVHQ1RMIDB4JWxseCwgbm9wXG4iLAogCQkJCQlfX2Z1bmNfXywgZGF0YSk7CiAJCQlicmVhazsKQEAgLTI3MjMsNiArMjk2MCw3IEBACiAJCQlyZXR1cm4gMTsKIAogCQlzdm0tPnZtY2ItPnNhdmUuZGJnY3RsID0gZGF0YTsKKwkJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfTEJSKTsKIAkJaWYgKGRhdGEgJiAoMVVMTDw8MCkpCiAJCQlzdm1fZW5hYmxlX2xicnYoc3ZtKTsKIAkJZWxzZQpAQCAtMjc3NSw2ICszMDEzLDcgQEAKIAlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsICZzdm0tPnZjcHUpOwogCXN2bV9jbGVhcl92aW50cihzdm0pOwogCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfY3RsICY9IH5WX0lSUV9NQVNLOworCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX0lOVFIpOwogCS8qCiAJICogSWYgdGhlIHVzZXIgc3BhY2Ugd2FpdHMgdG8gaW5qZWN0IGludGVycnVwdHMsIGV4aXQgYXMgc29vbiBhcwogCSAqIHBvc3NpYmxlCkBAIC0yNzk3LDMxICszMDM2LDMxIEBACiB9CiAKIHN0YXRpYyBpbnQgKCpzdm1fZXhpdF9oYW5kbGVyc1tdKShzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkgPSB7Ci0JW1NWTV9FWElUX1JFQURfQ1IwXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1JFQURfQ1IzXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1JFQURfQ1I0XQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1JFQURfQ1I4XQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1JFQURfQ1IwXQkJCT0gY3JfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0NSM10JCQk9IGNyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9DUjRdCQkJPSBjcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1JFQURfQ1I4XQkJCT0gY3JfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9DUjBfU0VMX1dSSVRFXQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfV1JJVEVfQ1IwXQkJCT0gY3IwX3dyaXRlX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfV1JJVEVfQ1IzXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1dSSVRFX0NSNF0JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9XUklURV9DUjNdCQkJPSBjcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0NSNF0JCQk9IGNyX2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfV1JJVEVfQ1I4XQkJCT0gY3I4X3dyaXRlX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjBdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjFdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjJdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjNdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjRdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjVdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjZdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfUkVBRF9EUjddCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfV1JJVEVfRFIwXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1dSSVRFX0RSMV0JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAotCVtTVk1fRVhJVF9XUklURV9EUjJdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfV1JJVEVfRFIzXQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1dSSVRFX0RSNF0JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAotCVtTVk1fRVhJVF9XUklURV9EUjVdCQkJPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfV1JJVEVfRFI2XQkJCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1dSSVRFX0RSN10JCQk9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0RSMF0JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjFdCQkJPSBkcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1JFQURfRFIyXQkJCT0gZHJfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0RSM10JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjRdCQkJPSBkcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1JFQURfRFI1XQkJCT0gZHJfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9SRUFEX0RSNl0JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfUkVBRF9EUjddCQkJPSBkcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0RSMF0JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfRFIxXQkJCT0gZHJfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9XUklURV9EUjJdCQkJPSBkcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0RSM10JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfRFI0XQkJCT0gZHJfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9XUklURV9EUjVdCQkJPSBkcl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dSSVRFX0RSNl0JCQk9IGRyX2ludGVyY2VwdGlvbiwKKwlbU1ZNX0VYSVRfV1JJVEVfRFI3XQkJCT0gZHJfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9FWENQX0JBU0UgKyBEQl9WRUNUT1JdCT0gZGJfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9FWENQX0JBU0UgKyBCUF9WRUNUT1JdCT0gYnBfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9FWENQX0JBU0UgKyBVRF9WRUNUT1JdCT0gdWRfaW50ZXJjZXB0aW9uLApAQCAtMjg1NCw2ICszMDkzLDcgQEAKIAlbU1ZNX0VYSVRfV0JJTlZEXSAgICAgICAgICAgICAgICAgICAgICAgPSBlbXVsYXRlX29uX2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfTU9OSVRPUl0JCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9NV0FJVF0JCQk9IGludmFsaWRfb3BfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9YU0VUQlZdCQkJPSB4c2V0YnZfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9OUEZdCQkJCT0gcGZfaW50ZXJjZXB0aW9uLAogfTsKIApAQCAtMjg2NCwxMCArMzEwNCwxMCBAQAogCXN0cnVjdCB2bWNiX3NhdmVfYXJlYSAqc2F2ZSA9ICZzdm0tPnZtY2ItPnNhdmU7CiAKIAlwcl9lcnIoIlZNQ0IgQ29udHJvbCBBcmVhOlxuIik7Ci0JcHJfZXJyKCJjcl9yZWFkOiAgICAgICAgICAgICUwNHhcbiIsIGNvbnRyb2wtPmludGVyY2VwdF9jcl9yZWFkKTsKLQlwcl9lcnIoImNyX3dyaXRlOiAgICAgICAgICAgJTA0eFxuIiwgY29udHJvbC0+aW50ZXJjZXB0X2NyX3dyaXRlKTsKLQlwcl9lcnIoImRyX3JlYWQ6ICAgICAgICAgICAgJTA0eFxuIiwgY29udHJvbC0+aW50ZXJjZXB0X2RyX3JlYWQpOwotCXByX2VycigiZHJfd3JpdGU6ICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfZHJfd3JpdGUpOworCXByX2VycigiY3JfcmVhZDogICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfY3IgJiAweGZmZmYpOworCXByX2VycigiY3Jfd3JpdGU6ICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfY3IgPj4gMTYpOworCXByX2VycigiZHJfcmVhZDogICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfZHIgJiAweGZmZmYpOworCXByX2VycigiZHJfd3JpdGU6ICAgICAgICAgICAlMDR4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfZHIgPj4gMTYpOwogCXByX2VycigiZXhjZXB0aW9uczogICAgICAgICAlMDh4XG4iLCBjb250cm9sLT5pbnRlcmNlcHRfZXhjZXB0aW9ucyk7CiAJcHJfZXJyKCJpbnRlcmNlcHRzOiAgICAgICAgICUwMTZsbHhcbiIsIGNvbnRyb2wtPmludGVyY2VwdCk7CiAJcHJfZXJyKCJwYXVzZSBmaWx0ZXIgY291bnQ6ICVkXG4iLCBjb250cm9sLT5wYXVzZV9maWx0ZXJfY291bnQpOwpAQCAtMjk1MCwxNSArMzE5MCwyMyBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIHN2bV9nZXRfZXhpdF9pbmZvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0ICppbmZvMSwgdTY0ICppbmZvMikKK3sKKwlzdHJ1Y3Qgdm1jYl9jb250cm9sX2FyZWEgKmNvbnRyb2wgPSAmdG9fc3ZtKHZjcHUpLT52bWNiLT5jb250cm9sOworCisJKmluZm8xID0gY29udHJvbC0+ZXhpdF9pbmZvXzE7CisJKmluZm8yID0gY29udHJvbC0+ZXhpdF9pbmZvXzI7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX2V4aXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuID0gdmNwdS0+cnVuOwogCXUzMiBleGl0X2NvZGUgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlOwogCi0JdHJhY2Vfa3ZtX2V4aXQoZXhpdF9jb2RlLCB2Y3B1KTsKKwl0cmFjZV9rdm1fZXhpdChleGl0X2NvZGUsIHZjcHUsIEtWTV9JU0FfU1ZNKTsKIAotCWlmICghKHN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgJiBJTlRFUkNFUFRfQ1IwX01BU0spKQorCWlmICghaXNfY3JfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0NSMF9XUklURSkpCiAJCXZjcHUtPmFyY2guY3IwID0gc3ZtLT52bWNiLT5zYXZlLmNyMDsKIAlpZiAobnB0X2VuYWJsZWQpCiAJCXZjcHUtPmFyY2guY3IzID0gc3ZtLT52bWNiLT5zYXZlLmNyMzsKQEAgLTI5NzAsNyArMzIxOCw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmIChpc19uZXN0ZWQoc3ZtKSkgeworCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKSB7CiAJCWludCB2bWV4aXQ7CiAKIAkJdHJhY2Vfa3ZtX25lc3RlZF92bWV4aXQoc3ZtLT52bWNiLT5zYXZlLnJpcCwgZXhpdF9jb2RlLApAQCAtMzAzMyw3ICszMjgxLDYgQEAKIAogCXN0cnVjdCBzdm1fY3B1X2RhdGEgKnNkID0gcGVyX2NwdShzdm1fZGF0YSwgY3B1KTsKIAotCXN2bS0+dm1jYi0+Y29udHJvbC50bGJfY3RsID0gVExCX0NPTlRST0xfRE9fTk9USElORzsKIAkvKiBGSVhNRTogaGFuZGxlIHdyYXBhcm91bmQgb2YgYXNpZF9nZW5lcmF0aW9uICovCiAJaWYgKHN2bS0+YXNpZF9nZW5lcmF0aW9uICE9IHNkLT5hc2lkX2dlbmVyYXRpb24pCiAJCW5ld19hc2lkKHN2bSwgc2QpOwpAQCAtMzA0NSw3ICszMjkyLDcgQEAKIAogCXN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmogPSBTVk1fRVZUSU5KX1ZBTElEIHwgU1ZNX0VWVElOSl9UWVBFX05NSTsKIAl2Y3B1LT5hcmNoLmhmbGFncyB8PSBIRl9OTUlfTUFTSzsKLQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0IHw9ICgxVUxMIDw8IElOVEVSQ0VQVF9JUkVUKTsKKwlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lSRVQpOwogCSsrdmNwdS0+c3RhdC5ubWlfaW5qZWN0aW9uczsKIH0KIApAQCAtMzA1OCw2ICszMzA1LDcgQEAKIAljb250cm9sLT5pbnRfY3RsICY9IH5WX0lOVFJfUFJJT19NQVNLOwogCWNvbnRyb2wtPmludF9jdGwgfD0gVl9JUlFfTUFTSyB8CiAJCSgoLypjb250cm9sLT5pbnRfdmVjdG9yID4+IDQqLyAweGYpIDw8IFZfSU5UUl9QUklPX1NISUZUKTsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9JTlRSKTsKIH0KIAogc3RhdGljIHZvaWQgc3ZtX3NldF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzA3NywxNCArMzMyNSwxNCBAQAogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCi0JaWYgKGlzX25lc3RlZChzdm0pICYmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEhGX1ZJTlRSX01BU0spKQorCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpICYmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEhGX1ZJTlRSX01BU0spKQogCQlyZXR1cm47CiAKIAlpZiAoaXJyID09IC0xKQogCQlyZXR1cm47CiAKIAlpZiAodHByID49IGlycikKLQkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSB8PSBJTlRFUkNFUFRfQ1I4X01BU0s7CisJCXNldF9jcl9pbnRlcmNlcHQoc3ZtLCBJTlRFUkNFUFRfQ1I4X1dSSVRFKTsKIH0KIAogc3RhdGljIGludCBzdm1fbm1pX2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzExMiwxMCArMzM2MCwxMCBAQAogCiAJaWYgKG1hc2tlZCkgewogCQlzdm0tPnZjcHUuYXJjaC5oZmxhZ3MgfD0gSEZfTk1JX01BU0s7Ci0JCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgfD0gKDFVTEwgPDwgSU5URVJDRVBUX0lSRVQpOworCQlzZXRfaW50ZXJjZXB0KHN2bSwgSU5URVJDRVBUX0lSRVQpOwogCX0gZWxzZSB7CiAJCXN2bS0+dmNwdS5hcmNoLmhmbGFncyAmPSB+SEZfTk1JX01BU0s7Ci0JCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgJj0gfigxVUxMIDw8IElOVEVSQ0VQVF9JUkVUKTsKKwkJY2xyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9JUkVUKTsKIAl9CiB9CiAKQEAgLTMxMzEsNyArMzM3OSw3IEBACiAKIAlyZXQgPSAhISh2bWNiLT5zYXZlLnJmbGFncyAmIFg4Nl9FRkxBR1NfSUYpOwogCi0JaWYgKGlzX25lc3RlZChzdm0pKQorCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpKQogCQlyZXR1cm4gcmV0ICYmICEoc3ZtLT52Y3B1LmFyY2guaGZsYWdzICYgSEZfVklOVFJfTUFTSyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzE3Nyw3ICszNDI1LDEyIEBACiAKIHN0YXRpYyB2b2lkIHN2bV9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCWZvcmNlX25ld19hc2lkKHZjcHUpOworCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOworCisJaWYgKHN0YXRpY19jcHVfaGFzKFg4Nl9GRUFUVVJFX0ZMVVNIQllBU0lEKSkKKwkJc3ZtLT52bWNiLT5jb250cm9sLnRsYl9jdGwgPSBUTEJfQ09OVFJPTF9GTFVTSF9BU0lEOworCWVsc2UKKwkJc3ZtLT5hc2lkX2dlbmVyYXRpb24tLTsKIH0KIAogc3RhdGljIHZvaWQgc3ZtX3ByZXBhcmVfZ3Vlc3Rfc3dpdGNoKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTMxODgsMTAgKzM0NDEsMTAgQEAKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAotCWlmIChpc19uZXN0ZWQoc3ZtKSAmJiAodmNwdS0+YXJjaC5oZmxhZ3MgJiBIRl9WSU5UUl9NQVNLKSkKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSAmJiAodmNwdS0+YXJjaC5oZmxhZ3MgJiBIRl9WSU5UUl9NQVNLKSkKIAkJcmV0dXJuOwogCi0JaWYgKCEoc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSAmIElOVEVSQ0VQVF9DUjhfTUFTSykpIHsKKwlpZiAoIWlzX2NyX2ludGVyY2VwdChzdm0sIElOVEVSQ0VQVF9DUjhfV1JJVEUpKSB7CiAJCWludCBjcjggPSBzdm0tPnZtY2ItPmNvbnRyb2wuaW50X2N0bCAmIFZfVFBSX01BU0s7CiAJCWt2bV9zZXRfY3I4KHZjcHUsIGNyOCk7CiAJfQpAQCAtMzIwMiw3ICszNDU1LDcgQEAKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAl1NjQgY3I4OwogCi0JaWYgKGlzX25lc3RlZChzdm0pICYmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEhGX1ZJTlRSX01BU0spKQorCWlmIChpc19ndWVzdF9tb2RlKHZjcHUpICYmICh2Y3B1LT5hcmNoLmhmbGFncyAmIEhGX1ZJTlRSX01BU0spKQogCQlyZXR1cm47CiAKIAljcjggPSBrdm1fZ2V0X2NyOCh2Y3B1KTsKQEAgLTMyODksOSArMzU0Miw2IEBACiBzdGF0aWMgdm9pZCBzdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwotCXUxNiBmc19zZWxlY3RvcjsKLQl1MTYgZ3Nfc2VsZWN0b3I7Ci0JdTE2IGxkdF9zZWxlY3RvcjsKIAogCXN2bS0+dm1jYi0+c2F2ZS5yYXggPSB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF07CiAJc3ZtLT52bWNiLT5zYXZlLnJzcCA9IHZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUlNQXTsKQEAgLTMzMDgsMTAgKzM1NTgsNiBAQAogCiAJc3luY19sYXBpY190b19jcjgodmNwdSk7CiAKLQlzYXZlX2hvc3RfbXNycyh2Y3B1KTsKLQlzYXZlc2VnbWVudChmcywgZnNfc2VsZWN0b3IpOwotCXNhdmVzZWdtZW50KGdzLCBnc19zZWxlY3Rvcik7Ci0JbGR0X3NlbGVjdG9yID0ga3ZtX3JlYWRfbGR0KCk7CiAJc3ZtLT52bWNiLT5zYXZlLmNyMiA9IHZjcHUtPmFyY2guY3IyOwogCiAJY2xnaSgpOwpAQCAtMzM4OSwxOSArMzYzNSwxMCBAQAogI2VuZGlmCiAJCSk7CiAKLQl2Y3B1LT5hcmNoLmNyMiA9IHN2bS0+dm1jYi0+c2F2ZS5jcjI7Ci0JdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdID0gc3ZtLT52bWNiLT5zYXZlLnJheDsKLQl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JTUF0gPSBzdm0tPnZtY2ItPnNhdmUucnNwOwotCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUklQXSA9IHN2bS0+dm1jYi0+c2F2ZS5yaXA7Ci0KLQlsb2FkX2hvc3RfbXNycyh2Y3B1KTsKLQlrdm1fbG9hZF9sZHQobGR0X3NlbGVjdG9yKTsKLQlsb2Fkc2VnbWVudChmcywgZnNfc2VsZWN0b3IpOwogI2lmZGVmIENPTkZJR19YODZfNjQKLQlsb2FkX2dzX2luZGV4KGdzX3NlbGVjdG9yKTsKLQl3cm1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBjdXJyZW50LT50aHJlYWQuZ3MpOworCXdybXNybChNU1JfR1NfQkFTRSwgc3ZtLT5ob3N0LmdzX2Jhc2UpOwogI2Vsc2UKLQlsb2Fkc2VnbWVudChncywgZ3Nfc2VsZWN0b3IpOworCWxvYWRzZWdtZW50KGZzLCBzdm0tPmhvc3QuZnMpOwogI2VuZGlmCiAKIAlyZWxvYWRfdHNzKHZjcHUpOwpAQCAtMzQxMCwxMCArMzY0NywyMSBAQAogCiAJc3RnaSgpOwogCisJdmNwdS0+YXJjaC5jcjIgPSBzdm0tPnZtY2ItPnNhdmUuY3IyOworCXZjcHUtPmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSA9IHN2bS0+dm1jYi0+c2F2ZS5yYXg7CisJdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SU1BdID0gc3ZtLT52bWNiLT5zYXZlLnJzcDsKKwl2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JJUF0gPSBzdm0tPnZtY2ItPnNhdmUucmlwOworCiAJc3luY19jcjhfdG9fbGFwaWModmNwdSk7CiAKIAlzdm0tPm5leHRfcmlwID0gMDsKIAorCXN2bS0+dm1jYi0+Y29udHJvbC50bGJfY3RsID0gVExCX0NPTlRST0xfRE9fTk9USElORzsKKworCS8qIGlmIGV4aXQgZHVlIHRvIFBGIGNoZWNrIGZvciBhc3luYyBQRiAqLworCWlmIChzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlID09IFNWTV9FWElUX0VYQ1BfQkFTRSArIFBGX1ZFQ1RPUikKKwkJc3ZtLT5hcGZfcmVhc29uID0ga3ZtX3JlYWRfYW5kX3Jlc2V0X3BmX3JlYXNvbigpOworCiAJaWYgKG5wdF9lbmFibGVkKSB7CiAJCXZjcHUtPmFyY2gucmVnc19hdmFpbCAmPSB+KDEgPDwgVkNQVV9FWFJFR19QRFBUUik7CiAJCXZjcHUtPmFyY2gucmVnc19kaXJ0eSAmPSB+KDEgPDwgVkNQVV9FWFJFR19QRFBUUik7CkBAIC0zNDI2LDYgKzM2NzQsOCBAQAogCWlmICh1bmxpa2VseShzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlID09CiAJCSAgICAgU1ZNX0VYSVRfRVhDUF9CQVNFICsgTUNfVkVDVE9SKSkKIAkJc3ZtX2hhbmRsZV9tY2Uoc3ZtKTsKKworCW1hcmtfYWxsX2NsZWFuKHN2bS0+dm1jYik7CiB9CiAKICN1bmRlZiBSCkBAIC0zNDM1LDcgKzM2ODUsOCBAQAogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCiAJc3ZtLT52bWNiLT5zYXZlLmNyMyA9IHJvb3Q7Ci0JZm9yY2VfbmV3X2FzaWQodmNwdSk7CisJbWFya19kaXJ0eShzdm0tPnZtY2IsIFZNQ0JfQ1IpOworCXN2bV9mbHVzaF90bGIodmNwdSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF90ZHBfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByb290KQpAQCAtMzQ0MywxMSArMzY5NCwxMyBAQAogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCiAJc3ZtLT52bWNiLT5jb250cm9sLm5lc3RlZF9jcjMgPSByb290OworCW1hcmtfZGlydHkoc3ZtLT52bWNiLCBWTUNCX05QVCk7CiAKIAkvKiBBbHNvIHN5bmMgZ3Vlc3QgY3IzIGhlcmUgaW4gY2FzZSB3ZSBsaXZlIG1pZ3JhdGUgKi8KLQlzdm0tPnZtY2ItPnNhdmUuY3IzID0gdmNwdS0+YXJjaC5jcjM7CisJc3ZtLT52bWNiLT5zYXZlLmNyMyA9IGt2bV9yZWFkX2NyMyh2Y3B1KTsKKwltYXJrX2RpcnR5KHN2bS0+dm1jYiwgVk1DQl9DUik7CiAKLQlmb3JjZV9uZXdfYXNpZCh2Y3B1KTsKKwlzdm1fZmx1c2hfdGxiKHZjcHUpOwogfQogCiBzdGF0aWMgaW50IGlzX2Rpc2FibGVkKHZvaWQpCkBAIC0zNDk0LDEwICszNzQ3LDYgQEAKIHN0YXRpYyB2b2lkIHN2bV9zZXRfc3VwcG9ydGVkX2NwdWlkKHUzMiBmdW5jLCBzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqZW50cnkpCiB7CiAJc3dpdGNoIChmdW5jKSB7Ci0JY2FzZSAweDAwMDAwMDAxOgotCQkvKiBNYXNrIG91dCB4c2F2ZSBiaXQgYXMgbG9uZyBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNWTSAqLwotCQllbnRyeS0+ZWN4ICY9IH4oYml0KFg4Nl9GRUFUVVJFX1hTQVZFKSk7Ci0JCWJyZWFrOwogCWNhc2UgMHg4MDAwMDAwMToKIAkJaWYgKG5lc3RlZCkKIAkJCWVudHJ5LT5lY3ggfD0gKDEgPDwgMik7IC8qIFNldCBTVk0gYml0ICovCkBAIC0zNTExLDcgKzM3NjAsNyBAQAogCQkJCSAgIGFkZGl0aW9uYWwgZmVhdHVyZXMgKi8KIAogCQkvKiBTdXBwb3J0IG5leHRfcmlwIGlmIGhvc3Qgc3VwcG9ydHMgaXQgKi8KLQkJaWYgKHN2bV9oYXMoU1ZNX0ZFQVRVUkVfTlJJUCkpCisJCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTlJJUFMpKQogCQkJZW50cnktPmVkeCB8PSBTVk1fRkVBVFVSRV9OUklQOwogCiAJCS8qIFN1cHBvcnQgTlBUIGZvciB0aGUgZ3Vlc3QgaWYgZW5hYmxlZCAqLwpAQCAtMzU3MSw2ICszODIwLDcgQEAKIAl7IFNWTV9FWElUX1dCSU5WRCwJCQkid2JpbnZkIiB9LAogCXsgU1ZNX0VYSVRfTU9OSVRPUiwJCQkibW9uaXRvciIgfSwKIAl7IFNWTV9FWElUX01XQUlULAkJCSJtd2FpdCIgfSwKKwl7IFNWTV9FWElUX1hTRVRCViwJCQkieHNldGJ2IiB9LAogCXsgU1ZNX0VYSVRfTlBGLAkJCQkibnBmIiB9LAogCXsgLTEsIE5VTEwgfQogfTsKQEAgLTM1OTQsOSArMzg0NCw3IEBACiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAKLQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgfD0gMSA8PCBOTV9WRUNUT1I7Ci0JaWYgKGlzX25lc3RlZChzdm0pKQotCQlzdm0tPm5lc3RlZC5oc2F2ZS0+Y29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9ucyB8PSAxIDw8IE5NX1ZFQ1RPUjsKKwlzZXRfZXhjZXB0aW9uX2ludGVyY2VwdChzdm0sIE5NX1ZFQ1RPUik7CiAJdXBkYXRlX2NyMF9pbnRlcmNlcHQoc3ZtKTsKIH0KIApAQCAtMzYyNyw2ICszODc1LDcgQEAKIAkuZ2V0X2NwbCA9IHN2bV9nZXRfY3BsLAogCS5nZXRfY3NfZGJfbF9iaXRzID0ga3ZtX2dldF9jc19kYl9sX2JpdHMsCiAJLmRlY2FjaGVfY3IwX2d1ZXN0X2JpdHMgPSBzdm1fZGVjYWNoZV9jcjBfZ3Vlc3RfYml0cywKKwkuZGVjYWNoZV9jcjMgPSBzdm1fZGVjYWNoZV9jcjMsCiAJLmRlY2FjaGVfY3I0X2d1ZXN0X2JpdHMgPSBzdm1fZGVjYWNoZV9jcjRfZ3Vlc3RfYml0cywKIAkuc2V0X2NyMCA9IHN2bV9zZXRfY3IwLAogCS5zZXRfY3IzID0gc3ZtX3NldF9jcjMsCkBAIC0zNjY3LDcgKzM5MTYsOSBAQAogCS5nZXRfdGRwX2xldmVsID0gZ2V0X25wdF9sZXZlbCwKIAkuZ2V0X210X21hc2sgPSBzdm1fZ2V0X210X21hc2ssCiAKKwkuZ2V0X2V4aXRfaW5mbyA9IHN2bV9nZXRfZXhpdF9pbmZvLAogCS5leGl0X3JlYXNvbnNfc3RyID0gc3ZtX2V4aXRfcmVhc29uc19zdHIsCisKIAkuZ2V0X2xwYWdlX2xldmVsID0gc3ZtX2dldF9scGFnZV9sZXZlbCwKIAogCS5jcHVpZF91cGRhdGUgPSBzdm1fY3B1aWRfdXBkYXRlLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3RyYWNlLmggYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaAppbmRleCBhNjU0NGI4Li4xMzU3ZDdjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9rdm0vdHJhY2UuaApAQCAtMTc4LDI3ICsxNzgsMzYgQEAKICNkZWZpbmUgdHJhY2Vfa3ZtX2FwaWNfcmVhZChyZWcsIHZhbCkJCXRyYWNlX2t2bV9hcGljKDAsIHJlZywgdmFsKQogI2RlZmluZSB0cmFjZV9rdm1fYXBpY193cml0ZShyZWcsIHZhbCkJCXRyYWNlX2t2bV9hcGljKDEsIHJlZywgdmFsKQogCisjZGVmaW5lIEtWTV9JU0FfVk1YICAgMQorI2RlZmluZSBLVk1fSVNBX1NWTSAgIDIKKwogLyoKICAqIFRyYWNlcG9pbnQgZm9yIGt2bSBndWVzdCBleGl0OgogICovCiBUUkFDRV9FVkVOVChrdm1fZXhpdCwKLQlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgZXhpdF9yZWFzb24sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSksCi0JVFBfQVJHUyhleGl0X3JlYXNvbiwgdmNwdSksCisJVFBfUFJPVE8odW5zaWduZWQgaW50IGV4aXRfcmVhc29uLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBpc2EpLAorCVRQX0FSR1MoZXhpdF9yZWFzb24sIHZjcHUsIGlzYSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCWV4aXRfcmVhc29uCSkKIAkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJZ3Vlc3RfcmlwCSkKKwkJX19maWVsZCgJdTMyLAkgICAgICAgIGlzYSAgICAgICAgICAgICApCisJCV9fZmllbGQoCXU2NCwJICAgICAgICBpbmZvMSAgICAgICAgICAgKQorCQlfX2ZpZWxkKAl1NjQsCSAgICAgICAgaW5mbzIgICAgICAgICAgICkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPmV4aXRfcmVhc29uCT0gZXhpdF9yZWFzb247CiAJCV9fZW50cnktPmd1ZXN0X3JpcAk9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKKwkJX19lbnRyeS0+aXNhICAgICAgICAgICAgPSBpc2E7CisJCWt2bV94ODZfb3BzLT5nZXRfZXhpdF9pbmZvKHZjcHUsICZfX2VudHJ5LT5pbmZvMSwKKwkJCQkJICAgJl9fZW50cnktPmluZm8yKTsKIAkpLAogCi0JVFBfcHJpbnRrKCJyZWFzb24gJXMgcmlwIDB4JWx4IiwKKwlUUF9wcmludGsoInJlYXNvbiAlcyByaXAgMHglbHggaW5mbyAlbGx4ICVsbHgiLAogCQkgZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHAsIF9fZW50cnktPmV4aXRfcmVhc29uLAogCQkJCQkgIGt2bV94ODZfb3BzLT5leGl0X3JlYXNvbnNfc3RyKSwKLQkJIF9fZW50cnktPmd1ZXN0X3JpcCkKKwkJIF9fZW50cnktPmd1ZXN0X3JpcCwgX19lbnRyeS0+aW5mbzEsIF9fZW50cnktPmluZm8yKQogKTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS92bXguYyBiL2FyY2gveDg2L2t2bS92bXguYwppbmRleCA4MWZjYmU5Li5iZjg5ZWMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vdm14LmMKKysrIGIvYXJjaC94ODYva3ZtL3ZteC5jCkBAIC02OSw2ICs2OSw5IEBACiBzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgdm1tX2V4Y2x1c2l2ZSA9IDE7CiBtb2R1bGVfcGFyYW0odm1tX2V4Y2x1c2l2ZSwgYm9vbCwgU19JUlVHTyk7CiAKK3N0YXRpYyBpbnQgX19yZWFkX21vc3RseSB5aWVsZF9vbl9obHQgPSAxOworbW9kdWxlX3BhcmFtKHlpZWxkX29uX2hsdCwgYm9vbCwgU19JUlVHTyk7CisKICNkZWZpbmUgS1ZNX0dVRVNUX0NSMF9NQVNLX1VOUkVTVFJJQ1RFRF9HVUVTVAkJCQlcCiAJKFg4Nl9DUjBfV1AgfCBYODZfQ1IwX05FIHwgWDg2X0NSMF9OVyB8IFg4Nl9DUjBfQ0QpCiAjZGVmaW5lIEtWTV9HVUVTVF9DUjBfTUFTSwkJCQkJCVwKQEAgLTE3Nyw2ICsxODAsNyBAQAogc3RhdGljIHU2NCBjb25zdHJ1Y3RfZXB0cCh1bnNpZ25lZCBsb25nIHJvb3RfaHBhKTsKIHN0YXRpYyB2b2lkIGt2bV9jcHVfdm14b24odTY0IGFkZHIpOwogc3RhdGljIHZvaWQga3ZtX2NwdV92bXhvZmYodm9pZCk7CitzdGF0aWMgdm9pZCB2bXhfc2V0X2NyMyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3IzKTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bWNzICosIHZteGFyZWEpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bWNzICosIGN1cnJlbnRfdm1jcyk7CkBAIC0xODgsNiArMTkyLDggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfbXNyX2JpdG1hcF9sZWdhY3k7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbG9uZ21vZGU7CiAKK3N0YXRpYyBib29sIGNwdV9oYXNfbG9hZF9pYTMyX2VmZXI7CisKIHN0YXRpYyBERUNMQVJFX0JJVE1BUCh2bXhfdnBpZF9iaXRtYXAsIFZNWF9OUl9WUElEUyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZteF92cGlkX2xvY2spOwogCkBAIC00NzIsNyArNDc4LDcgQEAKIAl1OCBlcnJvcjsKIAogCWFzbSB2b2xhdGlsZSAoX19leChBU01fVk1YX1ZNQ0xFQVJfUkFYKSAiOyBzZXRuYSAlMCIKLQkJICAgICAgOiAiPWciKGVycm9yKSA6ICJhIigmcGh5c19hZGRyKSwgIm0iKHBoeXNfYWRkcikKKwkJICAgICAgOiAiPXFtIihlcnJvcikgOiAiYSIoJnBoeXNfYWRkciksICJtIihwaHlzX2FkZHIpCiAJCSAgICAgIDogImNjIiwgIm1lbW9yeSIpOwogCWlmIChlcnJvcikKIAkJcHJpbnRrKEtFUk5fRVJSICJrdm06IHZtY2xlYXIgZmFpbDogJXAvJWxseFxuIiwKQEAgLTQ4NSw3ICs0OTEsNyBAQAogCXU4IGVycm9yOwogCiAJYXNtIHZvbGF0aWxlIChfX2V4KEFTTV9WTVhfVk1QVFJMRF9SQVgpICI7IHNldG5hICUwIgotCQkJOiAiPWciKGVycm9yKSA6ICJhIigmcGh5c19hZGRyKSwgIm0iKHBoeXNfYWRkcikKKwkJCTogIj1xbSIoZXJyb3IpIDogImEiKCZwaHlzX2FkZHIpLCAibSIocGh5c19hZGRyKQogCQkJOiAiY2MiLCAibWVtb3J5Iik7CiAJaWYgKGVycm9yKQogCQlwcmludGsoS0VSTl9FUlIgImt2bTogdm1wdHJsZCAlcC8lbGx4IGZhaWxcbiIsCkBAIC01NjUsMTAgKzU3MSwxMCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2bWNzX3JlYWRsKHVuc2lnbmVkIGxvbmcgZmllbGQpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKIAogCWFzbSB2b2xhdGlsZSAoX19leChBU01fVk1YX1ZNUkVBRF9SRFhfUkFYKQotCQkgICAgICA6ICI9YSIodmFsdWUpIDogImQiKGZpZWxkKSA6ICJjYyIpOworCQkgICAgICA6ICIrYSIodmFsdWUpIDogImQiKGZpZWxkKSA6ICJjYyIpOwogCXJldHVybiB2YWx1ZTsKIH0KIApAQCAtNjYxLDYgKzY2NywxMiBAQAogCXVuc2lnbmVkIGk7CiAJc3RydWN0IG1zcl9hdXRvbG9hZCAqbSA9ICZ2bXgtPm1zcl9hdXRvbG9hZDsKIAorCWlmIChtc3IgPT0gTVNSX0VGRVIgJiYgY3B1X2hhc19sb2FkX2lhMzJfZWZlcikgeworCQl2bWNzX2NsZWFyX2JpdHMoVk1fRU5UUllfQ09OVFJPTFMsIFZNX0VOVFJZX0xPQURfSUEzMl9FRkVSKTsKKwkJdm1jc19jbGVhcl9iaXRzKFZNX0VYSVRfQ09OVFJPTFMsIFZNX0VYSVRfTE9BRF9JQTMyX0VGRVIpOworCQlyZXR1cm47CisJfQorCiAJZm9yIChpID0gMDsgaSA8IG0tPm5yOyArK2kpCiAJCWlmIChtLT5ndWVzdFtpXS5pbmRleCA9PSBtc3IpCiAJCQlicmVhazsKQEAgLTY4MCw2ICs2OTIsMTQgQEAKIAl1bnNpZ25lZCBpOwogCXN0cnVjdCBtc3JfYXV0b2xvYWQgKm0gPSAmdm14LT5tc3JfYXV0b2xvYWQ7CiAKKwlpZiAobXNyID09IE1TUl9FRkVSICYmIGNwdV9oYXNfbG9hZF9pYTMyX2VmZXIpIHsKKwkJdm1jc193cml0ZTY0KEdVRVNUX0lBMzJfRUZFUiwgZ3Vlc3RfdmFsKTsKKwkJdm1jc193cml0ZTY0KEhPU1RfSUEzMl9FRkVSLCBob3N0X3ZhbCk7CisJCXZtY3Nfc2V0X2JpdHMoVk1fRU5UUllfQ09OVFJPTFMsIFZNX0VOVFJZX0xPQURfSUEzMl9FRkVSKTsKKwkJdm1jc19zZXRfYml0cyhWTV9FWElUX0NPTlRST0xTLCBWTV9FWElUX0xPQURfSUEzMl9FRkVSKTsKKwkJcmV0dXJuOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBtLT5ucjsgKytpKQogCQlpZiAobS0+Z3Vlc3RbaV0uaW5kZXggPT0gbXNyKQogCQkJYnJlYWs7CkBAIC0xMDA5LDYgKzEwMjksMTcgQEAKIAl2bXhfc2V0X2ludGVycnVwdF9zaGFkb3codmNwdSwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHZteF9jbGVhcl9obHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIEVuc3VyZSB0aGF0IHdlIGNsZWFyIHRoZSBITFQgc3RhdGUgaW4gdGhlIFZNQ1MuICBXZSBkb24ndCBuZWVkIHRvCisJICogZXhwbGljaXRseSBza2lwIHRoZSBpbnN0cnVjdGlvbiBiZWNhdXNlIGlmIHRoZSBITFQgc3RhdGUgaXMgc2V0LCB0aGVuCisJICogdGhlIGluc3RydWN0aW9uIGlzIGFscmVhZHkgZXhlY3V0aW5nIGFuZCBSSVAgaGFzIGFscmVhZHkgYmVlbgorCSAqIGFkdmFuY2VkLiAqLworCWlmICgheWllbGRfb25faGx0ICYmCisJICAgIHZtY3NfcmVhZDMyKEdVRVNUX0FDVElWSVRZX1NUQVRFKSA9PSBHVUVTVF9BQ1RJVklUWV9ITFQpCisJCXZtY3Nfd3JpdGUzMihHVUVTVF9BQ1RJVklUWV9TVEFURSwgR1VFU1RfQUNUSVZJVFlfQUNUSVZFKTsKK30KKwogc3RhdGljIHZvaWQgdm14X3F1ZXVlX2V4Y2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIG5yLAogCQkJCWJvb2wgaGFzX2Vycm9yX2NvZGUsIHUzMiBlcnJvcl9jb2RlLAogCQkJCWJvb2wgcmVpbmplY3QpCkBAIC0xMDM1LDYgKzEwNjYsNyBAQAogCQlpbnRyX2luZm8gfD0gSU5UUl9UWVBFX0hBUkRfRVhDRVBUSU9OOwogCiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwgaW50cl9pbmZvKTsKKwl2bXhfY2xlYXJfaGx0KHZjcHUpOwogfQogCiBzdGF0aWMgYm9vbCB2bXhfcmR0c2NwX3N1cHBvcnRlZCh2b2lkKQpAQCAtMTMwNSw4ICsxMzM3LDExIEBACiAJCQkmJiB0Ym9vdF9lbmFibGVkKCkpCiAJCQlyZXR1cm4gMTsKIAkJaWYgKCEobXNyICYgRkVBVFVSRV9DT05UUk9MX1ZNWE9OX0VOQUJMRURfT1VUU0lERV9TTVgpCi0JCQkmJiAhdGJvb3RfZW5hYmxlZCgpKQorCQkJJiYgIXRib290X2VuYWJsZWQoKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAia3ZtOiBkaXNhYmxlIFRYVCBpbiB0aGUgQklPUyBvciAiCisJCQkJIiBhY3RpdmF0ZSBUWFQgYmVmb3JlIGVuYWJsaW5nIEtWTVxuIik7CiAJCQlyZXR1cm4gMTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMTQwMCw2ICsxNDM1LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBfX2luaXQgYm9vbCBhbGxvd18xX3NldHRpbmcodTMyIG1zciwgdTMyIGN0bCkKK3sKKwl1MzIgdm14X21zcl9sb3csIHZteF9tc3JfaGlnaDsKKworCXJkbXNyKG1zciwgdm14X21zcl9sb3csIHZteF9tc3JfaGlnaCk7CisJcmV0dXJuIHZteF9tc3JfaGlnaCAmIGN0bDsKK30KKwogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfdm1jc19jb25maWcoc3RydWN0IHZtY3NfY29uZmlnICp2bWNzX2NvbmYpCiB7CiAJdTMyIHZteF9tc3JfbG93LCB2bXhfbXNyX2hpZ2g7CkBAIC0xNDE2LDcgKzE0NTksNyBAQAogCQkJCSZfcGluX2Jhc2VkX2V4ZWNfY29udHJvbCkgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCW1pbiA9IENQVV9CQVNFRF9ITFRfRVhJVElORyB8CisJbWluID0KICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJICAgICAgQ1BVX0JBU0VEX0NSOF9MT0FEX0VYSVRJTkcgfAogCSAgICAgIENQVV9CQVNFRF9DUjhfU1RPUkVfRVhJVElORyB8CkBAIC0xNDI5LDYgKzE0NzIsMTAgQEAKIAkgICAgICBDUFVfQkFTRURfTVdBSVRfRVhJVElORyB8CiAJICAgICAgQ1BVX0JBU0VEX01PTklUT1JfRVhJVElORyB8CiAJICAgICAgQ1BVX0JBU0VEX0lOVkxQR19FWElUSU5HOworCisJaWYgKHlpZWxkX29uX2hsdCkKKwkJbWluIHw9IENQVV9CQVNFRF9ITFRfRVhJVElORzsKKwogCW9wdCA9IENQVV9CQVNFRF9UUFJfU0hBRE9XIHwKIAkgICAgICBDUFVfQkFTRURfVVNFX01TUl9CSVRNQVBTIHwKIAkgICAgICBDUFVfQkFTRURfQUNUSVZBVEVfU0VDT05EQVJZX0NPTlRST0xTOwpAQCAtMTUxMCw2ICsxNTU3LDEyIEBACiAJdm1jc19jb25mLT52bWV4aXRfY3RybCAgICAgICAgID0gX3ZtZXhpdF9jb250cm9sOwogCXZtY3NfY29uZi0+dm1lbnRyeV9jdHJsICAgICAgICA9IF92bWVudHJ5X2NvbnRyb2w7CiAKKwljcHVfaGFzX2xvYWRfaWEzMl9lZmVyID0KKwkJYWxsb3dfMV9zZXR0aW5nKE1TUl9JQTMyX1ZNWF9FTlRSWV9DVExTLAorCQkJCVZNX0VOVFJZX0xPQURfSUEzMl9FRkVSKQorCQkmJiBhbGxvd18xX3NldHRpbmcoTVNSX0lBMzJfVk1YX0VYSVRfQ1RMUywKKwkJCQkgICBWTV9FWElUX0xPQURfSUEzMl9FRkVSKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjgzLDkgKzE3MzYsMTMgQEAKIAlzYXZlLT5saW1pdCA9IHZtY3NfcmVhZDMyKHNmLT5saW1pdCk7CiAJc2F2ZS0+YXIgPSB2bWNzX3JlYWQzMihzZi0+YXJfYnl0ZXMpOwogCXZtY3Nfd3JpdGUxNihzZi0+c2VsZWN0b3IsIHNhdmUtPmJhc2UgPj4gNCk7Ci0Jdm1jc193cml0ZTMyKHNmLT5iYXNlLCBzYXZlLT5iYXNlICYgMHhmZmZmZik7CisJdm1jc193cml0ZTMyKHNmLT5iYXNlLCBzYXZlLT5iYXNlICYgMHhmZmZmMCk7CiAJdm1jc193cml0ZTMyKHNmLT5saW1pdCwgMHhmZmZmKTsKIAl2bWNzX3dyaXRlMzIoc2YtPmFyX2J5dGVzLCAweGYzKTsKKwlpZiAoc2F2ZS0+YmFzZSAmIDB4ZikKKwkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HICJrdm06IHNlZ21lbnQgYmFzZSBpcyBub3QgcGFyYWdyYXBoIgorCQkJICAgICIgYWxpZ25lZCB3aGVuIGVudGVyaW5nIHByb3RlY3RlZCBtb2RlIChzZWc9JWQpIiwKKwkJCSAgICBzZWcpOwogfQogCiBzdGF0aWMgdm9pZCBlbnRlcl9ybW9kZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0xODE0LDYgKzE4NzEsMTMgQEAKIAl2Y3B1LT5hcmNoLmNyMCB8PSB2bWNzX3JlYWRsKEdVRVNUX0NSMCkgJiBjcjBfZ3Vlc3Rfb3duZWRfYml0czsKIH0KIAorc3RhdGljIHZvaWQgdm14X2RlY2FjaGVfY3IzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoZW5hYmxlX2VwdCAmJiBpc19wYWdpbmcodmNwdSkpCisJCXZjcHUtPmFyY2guY3IzID0gdm1jc19yZWFkbChHVUVTVF9DUjMpOworCV9fc2V0X2JpdChWQ1BVX0VYUkVHX0NSMywgKHVsb25nICopJnZjcHUtPmFyY2gucmVnc19hdmFpbCk7Cit9CisKIHN0YXRpYyB2b2lkIHZteF9kZWNhY2hlX2NyNF9ndWVzdF9iaXRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bG9uZyBjcjRfZ3Vlc3Rfb3duZWRfYml0cyA9IHZjcHUtPmFyY2guY3I0X2d1ZXN0X293bmVkX2JpdHM7CkBAIC0xODU3LDYgKzE5MjEsNyBAQAogCQkJCQl1bnNpZ25lZCBsb25nIGNyMCwKIAkJCQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCXZteF9kZWNhY2hlX2NyMyh2Y3B1KTsKIAlpZiAoIShjcjAgJiBYODZfQ1IwX1BHKSkgewogCQkvKiBGcm9tIHBhZ2luZy9zdGFydGluZyB0byBub25wYWdpbmcgKi8KIAkJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCkBAIC0xOTM3LDcgKzIwMDIsNyBAQAogCWlmIChlbmFibGVfZXB0KSB7CiAJCWVwdHAgPSBjb25zdHJ1Y3RfZXB0cChjcjMpOwogCQl2bWNzX3dyaXRlNjQoRVBUX1BPSU5URVIsIGVwdHApOwotCQlndWVzdF9jcjMgPSBpc19wYWdpbmcodmNwdSkgPyB2Y3B1LT5hcmNoLmNyMyA6CisJCWd1ZXN0X2NyMyA9IGlzX3BhZ2luZyh2Y3B1KSA/IGt2bV9yZWFkX2NyMyh2Y3B1KSA6CiAJCQl2Y3B1LT5rdm0tPmFyY2guZXB0X2lkZW50aXR5X21hcF9hZGRyOwogCQllcHRfbG9hZF9wZHB0cnModmNwdSk7CiAJfQpAQCAtMjcyNSw3ICsyNzkwLDcgQEAKIAl2bWNzX3dyaXRlbChHVUVTVF9JRFRSX0JBU0UsIDApOwogCXZtY3Nfd3JpdGUzMihHVUVTVF9JRFRSX0xJTUlULCAweGZmZmYpOwogCi0Jdm1jc193cml0ZTMyKEdVRVNUX0FDVElWSVRZX1NUQVRFLCAwKTsKKwl2bWNzX3dyaXRlMzIoR1VFU1RfQUNUSVZJVFlfU1RBVEUsIEdVRVNUX0FDVElWSVRZX0FDVElWRSk7CiAJdm1jc193cml0ZTMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTywgMCk7CiAJdm1jc193cml0ZTMyKEdVRVNUX1BFTkRJTkdfREJHX0VYQ0VQVElPTlMsIDApOwogCkBAIC0yNzg3LDYgKzI4NTIsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmICh2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pICYgR1VFU1RfSU5UUl9TVEFURV9TVEkpIHsKKwkJZW5hYmxlX2lycV93aW5kb3codmNwdSk7CisJCXJldHVybjsKKwl9CiAJY3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCA9IHZtY3NfcmVhZDMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wpOwogCWNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgfD0gQ1BVX0JBU0VEX1ZJUlRVQUxfTk1JX1BFTkRJTkc7CiAJdm1jc193cml0ZTMyKENQVV9CQVNFRF9WTV9FWEVDX0NPTlRST0wsIGNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wpOwpAQCAtMjgxNCw2ICsyODgzLDcgQEAKIAl9IGVsc2UKIAkJaW50ciB8PSBJTlRSX1RZUEVfRVhUX0lOVFI7CiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwgaW50cik7CisJdm14X2NsZWFyX2hsdCh2Y3B1KTsKIH0KIAogc3RhdGljIHZvaWQgdm14X2luamVjdF9ubWkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjg0MSw2ICsyOTExLDcgQEAKIAl9CiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKIAkJCUlOVFJfVFlQRV9OTUlfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLIHwgTk1JX1ZFQ1RPUik7CisJdm14X2NsZWFyX2hsdCh2Y3B1KTsKIH0KIAogc3RhdGljIGludCB2bXhfbm1pX2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjg0OSw3ICsyOTIwLDggQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4JISh2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pICYKLQkJCShHVUVTVF9JTlRSX1NUQVRFX01PVl9TUyB8IEdVRVNUX0lOVFJfU1RBVEVfTk1JKSk7CisJCSAgKEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTIHwgR1VFU1RfSU5UUl9TVEFURV9TVEkKKwkJICAgfCBHVUVTVF9JTlRSX1NUQVRFX05NSSkpOwogfQogCiBzdGF0aWMgYm9vbCB2bXhfZ2V0X25taV9tYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTI5MTAsNyArMjk4Miw3IEBACiAJICogQ2F1c2UgdGhlICNTUyBmYXVsdCB3aXRoIDAgZXJyb3IgY29kZSBpbiBWTTg2IG1vZGUuCiAJICovCiAJaWYgKCgodmVjID09IEdQX1ZFQ1RPUikgfHwgKHZlYyA9PSBTU19WRUNUT1IpKSAmJiBlcnJfY29kZSA9PSAwKQotCQlpZiAoZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkUpCisJCWlmIChlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORSkKIAkJCXJldHVybiAxOwogCS8qCiAJICogRm9yd2FyZCBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0aGF0IGFyZSB2YWxpZCBpbiByZWFsIG1vZGUuCkBAIC0zMDA3LDcgKzMwNzksNyBAQAogCX0KIAogCWlmIChpc19pbnZhbGlkX29wY29kZShpbnRyX2luZm8pKSB7Ci0JCWVyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCBFTVVMVFlQRV9UUkFQX1VEKTsKKwkJZXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIEVNVUxUWVBFX1RSQVBfVUQpOwogCQlpZiAoZXIgIT0gRU1VTEFURV9ET05FKQogCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOwogCQlyZXR1cm4gMTsKQEAgLTMwMjYsNyArMzA5OCw3IEBACiAKIAkJaWYgKGt2bV9ldmVudF9uZWVkc19yZWluamVjdGlvbih2Y3B1KSkKIAkJCWt2bV9tbXVfdW5wcm90ZWN0X3BhZ2VfdmlydCh2Y3B1LCBjcjIpOwotCQlyZXR1cm4ga3ZtX21tdV9wYWdlX2ZhdWx0KHZjcHUsIGNyMiwgZXJyb3JfY29kZSk7CisJCXJldHVybiBrdm1fbW11X3BhZ2VfZmF1bHQodmNwdSwgY3IyLCBlcnJvcl9jb2RlLCBOVUxMLCAwKTsKIAl9CiAKIAlpZiAodm14LT5ybW9kZS52bTg2X2FjdGl2ZSAmJgpAQCAtMzA5OCw3ICszMTcwLDcgQEAKIAkrK3ZjcHUtPnN0YXQuaW9fZXhpdHM7CiAKIAlpZiAoc3RyaW5nIHx8IGluKQotCQlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkU7CisJCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORTsKIAogCXBvcnQgPSBleGl0X3F1YWxpZmljYXRpb24gPj4gMTY7CiAJc2l6ZSA9IChleGl0X3F1YWxpZmljYXRpb24gJiA3KSArIDE7CkBAIC0zMTE4LDE0ICszMTkwLDYgQEAKIAloeXBlcmNhbGxbMl0gPSAweGMxOwogfQogCi1zdGF0aWMgdm9pZCBjb21wbGV0ZV9pbnNuX2dwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGVycikKLXsKLQlpZiAoZXJyKQotCQlrdm1faW5qZWN0X2dwKHZjcHUsIDApOwotCWVsc2UKLQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKLX0KLQogc3RhdGljIGludCBoYW5kbGVfY3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXVuc2lnbmVkIGxvbmcgZXhpdF9xdWFsaWZpY2F0aW9uLCB2YWw7CkBAIC0zMTQzLDIxICszMjA3LDIxIEBACiAJCXN3aXRjaCAoY3IpIHsKIAkJY2FzZSAwOgogCQkJZXJyID0ga3ZtX3NldF9jcjAodmNwdSwgdmFsKTsKLQkJCWNvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKKwkJCWt2bV9jb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSAzOgogCQkJZXJyID0ga3ZtX3NldF9jcjModmNwdSwgdmFsKTsKLQkJCWNvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKKwkJCWt2bV9jb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA0OgogCQkJZXJyID0ga3ZtX3NldF9jcjQodmNwdSwgdmFsKTsKLQkJCWNvbXBsZXRlX2luc25fZ3AodmNwdSwgZXJyKTsKKwkJCWt2bV9jb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA4OiB7CiAJCQkJdTggY3I4X3ByZXYgPSBrdm1fZ2V0X2NyOCh2Y3B1KTsKIAkJCQl1OCBjcjggPSBrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCByZWcpOwotCQkJCWt2bV9zZXRfY3I4KHZjcHUsIGNyOCk7Ci0JCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwkJCQllcnIgPSBrdm1fc2V0X2NyOCh2Y3B1LCBjcjgpOworCQkJCWt2bV9jb21wbGV0ZV9pbnNuX2dwKHZjcHUsIGVycik7CiAJCQkJaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCiAJCQkJCXJldHVybiAxOwogCQkJCWlmIChjcjhfcHJldiA8PSBjcjgpCkBAIC0zMTc2LDggKzMyNDAsOSBAQAogCWNhc2UgMTogLyptb3YgZnJvbSBjciovCiAJCXN3aXRjaCAoY3IpIHsKIAkJY2FzZSAzOgotCQkJa3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIHJlZywgdmNwdS0+YXJjaC5jcjMpOwotCQkJdHJhY2Vfa3ZtX2NyX3JlYWQoY3IsIHZjcHUtPmFyY2guY3IzKTsKKwkJCXZhbCA9IGt2bV9yZWFkX2NyMyh2Y3B1KTsKKwkJCWt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCByZWcsIHZhbCk7CisJCQl0cmFjZV9rdm1fY3JfcmVhZChjciwgdmFsKTsKIAkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSA4OgpAQCAtMzM0OSw2ICszNDE0LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQgaGFuZGxlX2ludmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDApID09IEVNVUxBVEVfRE9ORTsKK30KKwogc3RhdGljIGludCBoYW5kbGVfaW52bHBnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKQEAgLTMzNzcsNyArMzQ0Nyw3IEBACiAKIHN0YXRpYyBpbnQgaGFuZGxlX2FwaWNfYWNjZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlyZXR1cm4gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCAwKSA9PSBFTVVMQVRFX0RPTkU7CisJcmV0dXJuIGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgMCkgPT0gRU1VTEFURV9ET05FOwogfQogCiBzdGF0aWMgaW50IGhhbmRsZV90YXNrX3N3aXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0zNDc2LDcgKzM1NDYsNyBAQAogCiAJZ3BhID0gdm1jc19yZWFkNjQoR1VFU1RfUEhZU0lDQUxfQUREUkVTUyk7CiAJdHJhY2Vfa3ZtX3BhZ2VfZmF1bHQoZ3BhLCBleGl0X3F1YWxpZmljYXRpb24pOwotCXJldHVybiBrdm1fbW11X3BhZ2VfZmF1bHQodmNwdSwgZ3BhICYgUEFHRV9NQVNLLCAwKTsKKwlyZXR1cm4ga3ZtX21tdV9wYWdlX2ZhdWx0KHZjcHUsIGdwYSwgZXhpdF9xdWFsaWZpY2F0aW9uICYgMHgzLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIHU2NCBlcHRfcnN2ZF9tYXNrKHU2NCBzcHRlLCBpbnQgbGV2ZWwpCkBAIC0zNTkyLDcgKzM2NjIsNyBAQAogCQkgICAgJiYgKGt2bV9nZXRfcmZsYWdzKCZ2bXgtPnZjcHUpICYgWDg2X0VGTEFHU19JRikpCiAJCQlyZXR1cm4gaGFuZGxlX2ludGVycnVwdF93aW5kb3coJnZteC0+dmNwdSk7CiAKLQkJZXJyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwLCAwLCAwKTsKKwkJZXJyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwKTsKIAogCQlpZiAoZXJyID09IEVNVUxBVEVfRE9fTU1JTykgewogCQkJcmV0ID0gMDsKQEAgLTM2NDksNiArMzcxOSw3IEBACiAJW0VYSVRfUkVBU09OX01TUl9XUklURV0gICAgICAgICAgICAgICA9IGhhbmRsZV93cm1zciwKIAlbRVhJVF9SRUFTT05fUEVORElOR19JTlRFUlJVUFRdICAgICAgID0gaGFuZGxlX2ludGVycnVwdF93aW5kb3csCiAJW0VYSVRfUkVBU09OX0hMVF0gICAgICAgICAgICAgICAgICAgICA9IGhhbmRsZV9oYWx0LAorCVtFWElUX1JFQVNPTl9JTlZEXQkJICAgICAgPSBoYW5kbGVfaW52ZCwKIAlbRVhJVF9SRUFTT05fSU5WTFBHXQkJICAgICAgPSBoYW5kbGVfaW52bHBnLAogCVtFWElUX1JFQVNPTl9WTUNBTExdICAgICAgICAgICAgICAgICAgPSBoYW5kbGVfdm1jYWxsLAogCVtFWElUX1JFQVNPTl9WTUNMRUFSXQkgICAgICAgICAgICAgID0gaGFuZGxlX3ZteF9pbnNuLApAQCAtMzY3Niw2ICszNzQ3LDEyIEBACiBzdGF0aWMgY29uc3QgaW50IGt2bV92bXhfbWF4X2V4aXRfaGFuZGxlcnMgPQogCUFSUkFZX1NJWkUoa3ZtX3ZteF9leGl0X2hhbmRsZXJzKTsKIAorc3RhdGljIHZvaWQgdm14X2dldF9leGl0X2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKmluZm8xLCB1NjQgKmluZm8yKQoreworCSppbmZvMSA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwkqaW5mbzIgPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOVFJfSU5GTyk7Cit9CisKIC8qCiAgKiBUaGUgZ3Vlc3QgaGFzIGV4aXRlZC4gIFNlZSBpZiB3ZSBjYW4gZml4IGl0IG9yIGlmIHdlIG5lZWQgdXNlcnNwYWNlCiAgKiBhc3Npc3RhbmNlLgpAQCAtMzY4NiwxNyArMzc2MywxMiBAQAogCXUzMiBleGl0X3JlYXNvbiA9IHZteC0+ZXhpdF9yZWFzb247CiAJdTMyIHZlY3RvcmluZ19pbmZvID0gdm14LT5pZHRfdmVjdG9yaW5nX2luZm87CiAKLQl0cmFjZV9rdm1fZXhpdChleGl0X3JlYXNvbiwgdmNwdSk7CisJdHJhY2Vfa3ZtX2V4aXQoZXhpdF9yZWFzb24sIHZjcHUsIEtWTV9JU0FfVk1YKTsKIAogCS8qIElmIGd1ZXN0IHN0YXRlIGlzIGludmFsaWQsIHN0YXJ0IGVtdWxhdGluZyAqLwogCWlmICh2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCAmJiBlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUpCiAJCXJldHVybiBoYW5kbGVfaW52YWxpZF9ndWVzdF9zdGF0ZSh2Y3B1KTsKIAotCS8qIEFjY2VzcyBDUjMgZG9uJ3QgY2F1c2UgVk1FeGl0IGluIHBhZ2luZyBtb2RlLCBzbyB3ZSBuZWVkCi0JICogdG8gc3luYyB3aXRoIGd1ZXN0IHJlYWwgQ1IzLiAqLwotCWlmIChlbmFibGVfZXB0ICYmIGlzX3BhZ2luZyh2Y3B1KSkKLQkJdmNwdS0+YXJjaC5jcjMgPSB2bWNzX3JlYWRsKEdVRVNUX0NSMyk7Ci0KIAlpZiAoZXhpdF9yZWFzb24gJiBWTVhfRVhJVF9SRUFTT05TX0ZBSUxFRF9WTUVOVFJZKSB7CiAJCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9GQUlMX0VOVFJZOwogCQl2Y3B1LT5ydW4tPmZhaWxfZW50cnkuaGFyZHdhcmVfZW50cnlfZmFpbHVyZV9yZWFzb24KQEAgLTQwMTMsNyArNDA4NSw4IEBACiAJICAgICAgKTsKIAogCXZjcHUtPmFyY2gucmVnc19hdmFpbCA9IH4oKDEgPDwgVkNQVV9SRUdTX1JJUCkgfCAoMSA8PCBWQ1BVX1JFR1NfUlNQKQotCQkJCSAgfCAoMSA8PCBWQ1BVX0VYUkVHX1BEUFRSKSk7CisJCQkJICB8ICgxIDw8IFZDUFVfRVhSRUdfUERQVFIpCisJCQkJICB8ICgxIDw8IFZDUFVfRVhSRUdfQ1IzKSk7CiAJdmNwdS0+YXJjaC5yZWdzX2RpcnR5ID0gMDsKIAogCXZteC0+aWR0X3ZlY3RvcmluZ19pbmZvID0gdm1jc19yZWFkMzIoSURUX1ZFQ1RPUklOR19JTkZPX0ZJRUxEKTsKQEAgLTQyODAsNiArNDM1Myw3IEBACiAJLmdldF9jcGwgPSB2bXhfZ2V0X2NwbCwKIAkuZ2V0X2NzX2RiX2xfYml0cyA9IHZteF9nZXRfY3NfZGJfbF9iaXRzLAogCS5kZWNhY2hlX2NyMF9ndWVzdF9iaXRzID0gdm14X2RlY2FjaGVfY3IwX2d1ZXN0X2JpdHMsCisJLmRlY2FjaGVfY3IzID0gdm14X2RlY2FjaGVfY3IzLAogCS5kZWNhY2hlX2NyNF9ndWVzdF9iaXRzID0gdm14X2RlY2FjaGVfY3I0X2d1ZXN0X2JpdHMsCiAJLnNldF9jcjAgPSB2bXhfc2V0X2NyMCwKIAkuc2V0X2NyMyA9IHZteF9zZXRfY3IzLApAQCAtNDMyMCw3ICs0Mzk0LDkgQEAKIAkuZ2V0X3RkcF9sZXZlbCA9IGdldF9lcHRfbGV2ZWwsCiAJLmdldF9tdF9tYXNrID0gdm14X2dldF9tdF9tYXNrLAogCisJLmdldF9leGl0X2luZm8gPSB2bXhfZ2V0X2V4aXRfaW5mbywKIAkuZXhpdF9yZWFzb25zX3N0ciA9IHZteF9leGl0X3JlYXNvbnNfc3RyLAorCiAJLmdldF9scGFnZV9sZXZlbCA9IHZteF9nZXRfbHBhZ2VfbGV2ZWwsCiAKIAkuY3B1aWRfdXBkYXRlID0gdm14X2NwdWlkX3VwZGF0ZSwKQEAgLTQzOTYsOCArNDQ3Miw2IEBACiAKIAlpZiAoZW5hYmxlX2VwdCkgewogCQlieXBhc3NfZ3Vlc3RfcGYgPSAwOwotCQlrdm1fbW11X3NldF9iYXNlX3B0ZXMoVk1YX0VQVF9SRUFEQUJMRV9NQVNLIHwKLQkJCVZNWF9FUFRfV1JJVEFCTEVfTUFTSyk7CiAJCWt2bV9tbXVfc2V0X21hc2tfcHRlcygwdWxsLCAwdWxsLCAwdWxsLCAwdWxsLAogCQkJCVZNWF9FUFRfRVhFQ1VUQUJMRV9NQVNLKTsKIAkJa3ZtX2VuYWJsZV90ZHAoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuYyBiL2FyY2gveDg2L2t2bS94ODYuYwppbmRleCA0NmEzNjhjLi5iY2MwZWZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmMKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rdm0uaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCkBAIC0xNTUsNiArMTU2LDEzIEBACiAKIHU2NCBfX3JlYWRfbW9zdGx5IGhvc3RfeGNyMDsKIAorc3RhdGljIGlubGluZSB2b2lkIGt2bV9hc3luY19wZl9oYXNoX3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcm91bmR1cF9wb3dfb2ZfdHdvKEFTWU5DX1BGX1BFUl9WQ1BVKTsgaSsrKQorCQl2Y3B1LT5hcmNoLmFwZi5nZm5zW2ldID0gfjA7Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9vbl91c2VyX3JldHVybihzdHJ1Y3QgdXNlcl9yZXR1cm5fbm90aWZpZXIgKnVybikKIHsKIAl1bnNpZ25lZCBzbG90OwpAQCAtMzI2LDIzICszMzQsMjggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9yZXF1ZXVlX2V4Y2VwdGlvbik7CiAKLXZvaWQga3ZtX2luamVjdF9wYWdlX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3ZvaWQga3ZtX2NvbXBsZXRlX2luc25fZ3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgZXJyKQogewotCXVuc2lnbmVkIGVycm9yX2NvZGUgPSB2Y3B1LT5hcmNoLmZhdWx0LmVycm9yX2NvZGU7CisJaWYgKGVycikKKwkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKKwllbHNlCisJCWt2bV94ODZfb3BzLT5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2NvbXBsZXRlX2luc25fZ3ApOwogCit2b2lkIGt2bV9pbmplY3RfcGFnZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpmYXVsdCkKK3sKIAkrK3ZjcHUtPnN0YXQucGZfZ3Vlc3Q7Ci0JdmNwdS0+YXJjaC5jcjIgPSB2Y3B1LT5hcmNoLmZhdWx0LmFkZHJlc3M7Ci0Ja3ZtX3F1ZXVlX2V4Y2VwdGlvbl9lKHZjcHUsIFBGX1ZFQ1RPUiwgZXJyb3JfY29kZSk7CisJdmNwdS0+YXJjaC5jcjIgPSBmYXVsdC0+YWRkcmVzczsKKwlrdm1fcXVldWVfZXhjZXB0aW9uX2UodmNwdSwgUEZfVkVDVE9SLCBmYXVsdC0+ZXJyb3JfY29kZSk7CiB9CiAKLXZvaWQga3ZtX3Byb3BhZ2F0ZV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit2b2lkIGt2bV9wcm9wYWdhdGVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZmF1bHQpCiB7Ci0JaWYgKG1tdV9pc19uZXN0ZWQodmNwdSkgJiYgIXZjcHUtPmFyY2guZmF1bHQubmVzdGVkKQotCQl2Y3B1LT5hcmNoLm5lc3RlZF9tbXUuaW5qZWN0X3BhZ2VfZmF1bHQodmNwdSk7CisJaWYgKG1tdV9pc19uZXN0ZWQodmNwdSkgJiYgIWZhdWx0LT5uZXN0ZWRfcGFnZV9mYXVsdCkKKwkJdmNwdS0+YXJjaC5uZXN0ZWRfbW11LmluamVjdF9wYWdlX2ZhdWx0KHZjcHUsIGZhdWx0KTsKIAllbHNlCi0JCXZjcHUtPmFyY2gubW11LmluamVjdF9wYWdlX2ZhdWx0KHZjcHUpOwotCi0JdmNwdS0+YXJjaC5mYXVsdC5uZXN0ZWQgPSBmYWxzZTsKKwkJdmNwdS0+YXJjaC5tbXUuaW5qZWN0X3BhZ2VfZmF1bHQodmNwdSwgZmF1bHQpOwogfQogCiB2b2lkIGt2bV9pbmplY3Rfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQ2MCw4ICs0NzMsOCBAQAogCQkgICAgICAodW5zaWduZWQgbG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfYXZhaWwpKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWdmbiA9ICh2Y3B1LT5hcmNoLmNyMyAmIH4zMXUpID4+IFBBR0VfU0hJRlQ7Ci0Jb2Zmc2V0ID0gKHZjcHUtPmFyY2guY3IzICYgfjMxdSkgJiAoUEFHRV9TSVpFIC0gMSk7CisJZ2ZuID0gKGt2bV9yZWFkX2NyMyh2Y3B1KSAmIH4zMXUpID4+IFBBR0VfU0hJRlQ7CisJb2Zmc2V0ID0gKGt2bV9yZWFkX2NyMyh2Y3B1KSAmIH4zMXUpICYgKFBBR0VfU0laRSAtIDEpOwogCXIgPSBrdm1fcmVhZF9uZXN0ZWRfZ3Vlc3RfcGFnZSh2Y3B1LCBnZm4sIHBkcHRlLCBvZmZzZXQsIHNpemVvZihwZHB0ZSksCiAJCQkJICAgICAgIFBGRVJSX1VTRVJfTUFTSyB8IFBGRVJSX1dSSVRFX01BU0spOwogCWlmIChyIDwgMCkKQEAgLTUwNiwxMiArNTE5LDE1IEBACiAJCX0gZWxzZQogI2VuZGlmCiAJCWlmIChpc19wYWUodmNwdSkgJiYgIWxvYWRfcGRwdHJzKHZjcHUsIHZjcHUtPmFyY2gud2Fsa19tbXUsCi0JCQkJCQkgdmNwdS0+YXJjaC5jcjMpKQorCQkJCQkJIGt2bV9yZWFkX2NyMyh2Y3B1KSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAKIAlrdm1feDg2X29wcy0+c2V0X2NyMCh2Y3B1LCBjcjApOwogCisJaWYgKChjcjAgXiBvbGRfY3IwKSAmIFg4Nl9DUjBfUEcpCisJCWt2bV9jbGVhcl9hc3luY19wZl9jb21wbGV0aW9uX3F1ZXVlKHZjcHUpOworCiAJaWYgKChjcjAgXiBvbGRfY3IwKSAmIHVwZGF0ZV9iaXRzKQogCQlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CiAJcmV0dXJuIDA7CkBAIC01OTUsNyArNjExLDggQEAKIAkJCXJldHVybiAxOwogCX0gZWxzZSBpZiAoaXNfcGFnaW5nKHZjcHUpICYmIChjcjQgJiBYODZfQ1I0X1BBRSkKIAkJICAgJiYgKChjcjQgXiBvbGRfY3I0KSAmIHBkcHRyX2JpdHMpCi0JCSAgICYmICFsb2FkX3BkcHRycyh2Y3B1LCB2Y3B1LT5hcmNoLndhbGtfbW11LCB2Y3B1LT5hcmNoLmNyMykpCisJCSAgICYmICFsb2FkX3BkcHRycyh2Y3B1LCB2Y3B1LT5hcmNoLndhbGtfbW11LAorCQkJCSAgIGt2bV9yZWFkX2NyMyh2Y3B1KSkpCiAJCXJldHVybiAxOwogCiAJaWYgKGNyNCAmIFg4Nl9DUjRfVk1YRSkKQEAgLTYxNSw3ICs2MzIsNyBAQAogCiBpbnQga3ZtX3NldF9jcjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMykKIHsKLQlpZiAoY3IzID09IHZjcHUtPmFyY2guY3IzICYmICFwZHB0cnNfY2hhbmdlZCh2Y3B1KSkgeworCWlmIChjcjMgPT0ga3ZtX3JlYWRfY3IzKHZjcHUpICYmICFwZHB0cnNfY2hhbmdlZCh2Y3B1KSkgewogCQlrdm1fbW11X3N5bmNfcm9vdHModmNwdSk7CiAJCWt2bV9tbXVfZmx1c2hfdGxiKHZjcHUpOwogCQlyZXR1cm4gMDsKQEAgLTY1MCwxMiArNjY3LDEzIEBACiAJaWYgKHVubGlrZWx5KCFnZm5fdG9fbWVtc2xvdCh2Y3B1LT5rdm0sIGNyMyA+PiBQQUdFX1NISUZUKSkpCiAJCXJldHVybiAxOwogCXZjcHUtPmFyY2guY3IzID0gY3IzOworCV9fc2V0X2JpdChWQ1BVX0VYUkVHX0NSMywgKHVsb25nICopJnZjcHUtPmFyY2gucmVnc19hdmFpbCk7CiAJdmNwdS0+YXJjaC5tbXUubmV3X2NyMyh2Y3B1KTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9zZXRfY3IzKTsKIAotaW50IF9fa3ZtX3NldF9jcjgoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyOCkKK2ludCBrdm1fc2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I4KQogewogCWlmIChjcjggJiBDUjhfUkVTRVJWRURfQklUUykKIAkJcmV0dXJuIDE7CkBAIC02NjUsMTIgKzY4Myw2IEBACiAJCXZjcHUtPmFyY2guY3I4ID0gY3I4OwogCXJldHVybiAwOwogfQotCi12b2lkIGt2bV9zZXRfY3I4KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjgpCi17Ci0JaWYgKF9fa3ZtX3NldF9jcjgodmNwdSwgY3I4KSkKLQkJa3ZtX2luamVjdF9ncCh2Y3B1LCAwKTsKLX0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9zZXRfY3I4KTsKIAogdW5zaWduZWQgbG9uZyBrdm1fZ2V0X2NyOChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC03NzUsMTIgKzc4NywxMiBAQAogICoga3ZtLXNwZWNpZmljLiBUaG9zZSBhcmUgcHV0IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCiAgKi8KIAotI2RlZmluZSBLVk1fU0FWRV9NU1JTX0JFR0lOCTcKKyNkZWZpbmUgS1ZNX1NBVkVfTVNSU19CRUdJTgk4CiBzdGF0aWMgdTMyIG1zcnNfdG9fc2F2ZVtdID0gewogCU1TUl9LVk1fU1lTVEVNX1RJTUUsIE1TUl9LVk1fV0FMTF9DTE9DSywKIAlNU1JfS1ZNX1NZU1RFTV9USU1FX05FVywgTVNSX0tWTV9XQUxMX0NMT0NLX05FVywKIAlIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBIVl9YNjRfTVNSX0hZUEVSQ0FMTCwKLQlIVl9YNjRfTVNSX0FQSUNfQVNTSVNUX1BBR0UsCisJSFZfWDY0X01TUl9BUElDX0FTU0lTVF9QQUdFLCBNU1JfS1ZNX0FTWU5DX1BGX0VOLAogCU1TUl9JQTMyX1NZU0VOVEVSX0NTLCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwKIAlNU1JfU1RBUiwKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC04MzAsNyArODQyLDYgQEAKIAlrdm1feDg2X29wcy0+c2V0X2VmZXIodmNwdSwgZWZlcik7CiAKIAl2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGUubnhlID0gKGVmZXIgJiBFRkVSX05YKSAmJiAhdGRwX2VuYWJsZWQ7Ci0Ja3ZtX21tdV9yZXNldF9jb250ZXh0KHZjcHUpOwogCiAJLyogVXBkYXRlIHJlc2VydmVkIGJpdHMgKi8KIAlpZiAoKGVmZXIgXiBvbGRfZWZlcikgJiBFRkVSX05YKQpAQCAtMTQxOCw2ICsxNDI5LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX3B2X2VuYWJsZV9hc3luY19wZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBkYXRhKQoreworCWdwYV90IGdwYSA9IGRhdGEgJiB+MHgzZjsKKworCS8qIEJpdHMgMjo1IGFyZSByZXNydmVkLCBTaG91bGQgYmUgemVybyAqLworCWlmIChkYXRhICYgMHgzYykKKwkJcmV0dXJuIDE7CisKKwl2Y3B1LT5hcmNoLmFwZi5tc3JfdmFsID0gZGF0YTsKKworCWlmICghKGRhdGEgJiBLVk1fQVNZTkNfUEZfRU5BQkxFRCkpIHsKKwkJa3ZtX2NsZWFyX2FzeW5jX3BmX2NvbXBsZXRpb25fcXVldWUodmNwdSk7CisJCWt2bV9hc3luY19wZl9oYXNoX3Jlc2V0KHZjcHUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoa3ZtX2dmbl90b19odmFfY2FjaGVfaW5pdCh2Y3B1LT5rdm0sICZ2Y3B1LT5hcmNoLmFwZi5kYXRhLCBncGEpKQorCQlyZXR1cm4gMTsKKworCXZjcHUtPmFyY2guYXBmLnNlbmRfdXNlcl9vbmx5ID0gIShkYXRhICYgS1ZNX0FTWU5DX1BGX1NFTkRfQUxXQVlTKTsKKwlrdm1fYXN5bmNfcGZfd2FrZXVwX2FsbCh2Y3B1KTsKKwlyZXR1cm4gMDsKK30KKwogaW50IGt2bV9zZXRfbXNyX2NvbW1vbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBtc3IsIHU2NCBkYXRhKQogewogCXN3aXRjaCAobXNyKSB7CkBAIC0xNDk5LDYgKzE1MzQsMTAgQEAKIAkJfQogCQlicmVhazsKIAl9CisJY2FzZSBNU1JfS1ZNX0FTWU5DX1BGX0VOOgorCQlpZiAoa3ZtX3B2X2VuYWJsZV9hc3luY19wZih2Y3B1LCBkYXRhKSkKKwkJCXJldHVybiAxOworCQlicmVhazsKIAljYXNlIE1TUl9JQTMyX01DR19DVEw6CiAJY2FzZSBNU1JfSUEzMl9NQ0dfU1RBVFVTOgogCWNhc2UgTVNSX0lBMzJfTUMwX0NUTCAuLi4gTVNSX0lBMzJfTUMwX0NUTCArIDQgKiBLVk1fTUFYX01DRV9CQU5LUyAtIDE6CkBAIC0xNzc1LDYgKzE4MTQsOSBAQAogCWNhc2UgTVNSX0tWTV9TWVNURU1fVElNRV9ORVc6CiAJCWRhdGEgPSB2Y3B1LT5hcmNoLnRpbWU7CiAJCWJyZWFrOworCWNhc2UgTVNSX0tWTV9BU1lOQ19QRl9FTjoKKwkJZGF0YSA9IHZjcHUtPmFyY2guYXBmLm1zcl92YWw7CisJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfUDVfTUNfQUREUjoKIAljYXNlIE1TUl9JQTMyX1A1X01DX1RZUEU6CiAJY2FzZSBNU1JfSUEzMl9NQ0dfQ0FQOgpAQCAtMTkwNCw2ICsxOTQ2LDcgQEAKIAljYXNlIEtWTV9DQVBfTk9QX0lPX0RFTEFZOgogCWNhc2UgS1ZNX0NBUF9NUF9TVEFURToKIAljYXNlIEtWTV9DQVBfU1lOQ19NTVU6CisJY2FzZSBLVk1fQ0FQX1VTRVJfTk1JOgogCWNhc2UgS1ZNX0NBUF9SRUlOSkVDVF9DT05UUk9MOgogCWNhc2UgS1ZNX0NBUF9JUlFfSU5KRUNUX1NUQVRVUzoKIAljYXNlIEtWTV9DQVBfQVNTSUdOX0RFVl9JUlE6CkBAIC0xOTIyLDYgKzE5NjUsNyBAQAogCWNhc2UgS1ZNX0NBUF9ERUJVR1JFR1M6CiAJY2FzZSBLVk1fQ0FQX1g4Nl9ST0JVU1RfU0lOR0xFU1RFUDoKIAljYXNlIEtWTV9DQVBfWFNBVkU6CisJY2FzZSBLVk1fQ0FQX0FTWU5DX1BGOgogCQlyID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPOgpAQCAtMjE4NSw2ICsyMjI5LDExIEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyB2b2lkIGNwdWlkX21hc2sodTMyICp3b3JkLCBpbnQgd29yZG51bSkKK3sKKwkqd29yZCAmPSBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5W3dvcmRudW1dOworfQorCiBzdGF0aWMgdm9pZCBkb19jcHVpZF8xX2VudChzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqZW50cnksIHUzMiBmdW5jdGlvbiwKIAkJCSAgIHUzMiBpbmRleCkKIHsKQEAgLTIyNTksNyArMjMwOCw5IEBACiAJCWJyZWFrOwogCWNhc2UgMToKIAkJZW50cnktPmVkeCAmPSBrdm1fc3VwcG9ydGVkX3dvcmQwX3g4Nl9mZWF0dXJlczsKKwkJY3B1aWRfbWFzaygmZW50cnktPmVkeCwgMCk7CiAJCWVudHJ5LT5lY3ggJj0ga3ZtX3N1cHBvcnRlZF93b3JkNF94ODZfZmVhdHVyZXM7CisJCWNwdWlkX21hc2soJmVudHJ5LT5lY3gsIDQpOwogCQkvKiB3ZSBzdXBwb3J0IHgyYXBpYyBlbXVsYXRpb24gZXZlbiBpZiBob3N0IGRvZXMgbm90IHN1cHBvcnQKIAkJICogaXQgc2luY2Ugd2UgZW11bGF0ZSB4MmFwaWMgaW4gc29mdHdhcmUgKi8KIAkJZW50cnktPmVjeCB8PSBGKFgyQVBJQyk7CkBAIC0yMzUwLDcgKzI0MDEsOSBAQAogCQlicmVhazsKIAljYXNlIDB4ODAwMDAwMDE6CiAJCWVudHJ5LT5lZHggJj0ga3ZtX3N1cHBvcnRlZF93b3JkMV94ODZfZmVhdHVyZXM7CisJCWNwdWlkX21hc2soJmVudHJ5LT5lZHgsIDEpOwogCQllbnRyeS0+ZWN4ICY9IGt2bV9zdXBwb3J0ZWRfd29yZDZfeDg2X2ZlYXR1cmVzOworCQljcHVpZF9tYXNrKCZlbnRyeS0+ZWN4LCA2KTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zMTY5LDIwICszMjIyLDE4IEBACiAJCXN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCAqb2xkX3Nsb3RzOwogCQl1bnNpZ25lZCBsb25nICpkaXJ0eV9iaXRtYXA7CiAKLQkJciA9IC1FTk9NRU07Ci0JCWRpcnR5X2JpdG1hcCA9IHZtYWxsb2Mobik7Ci0JCWlmICghZGlydHlfYml0bWFwKQotCQkJZ290byBvdXQ7CisJCWRpcnR5X2JpdG1hcCA9IG1lbXNsb3QtPmRpcnR5X2JpdG1hcF9oZWFkOworCQlpZiAobWVtc2xvdC0+ZGlydHlfYml0bWFwID09IGRpcnR5X2JpdG1hcCkKKwkJCWRpcnR5X2JpdG1hcCArPSBuIC8gc2l6ZW9mKGxvbmcpOwogCQltZW1zZXQoZGlydHlfYml0bWFwLCAwLCBuKTsKIAogCQlyID0gLUVOT01FTTsKIAkJc2xvdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2xvdHMpIHsKLQkJCXZmcmVlKGRpcnR5X2JpdG1hcCk7CisJCWlmICghc2xvdHMpCiAJCQlnb3RvIG91dDsKLQkJfQogCQltZW1jcHkoc2xvdHMsIGt2bS0+bWVtc2xvdHMsIHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSk7CiAJCXNsb3RzLT5tZW1zbG90c1tsb2ctPnNsb3RdLmRpcnR5X2JpdG1hcCA9IGRpcnR5X2JpdG1hcDsKKwkJc2xvdHMtPmdlbmVyYXRpb24rKzsKIAogCQlvbGRfc2xvdHMgPSBrdm0tPm1lbXNsb3RzOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoa3ZtLT5tZW1zbG90cywgc2xvdHMpOwpAQCAtMzE5NSwxMSArMzI0Niw4IEBACiAJCXNwaW5fdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcihsb2ctPmRpcnR5X2JpdG1hcCwgZGlydHlfYml0bWFwLCBuKSkgewotCQkJdmZyZWUoZGlydHlfYml0bWFwKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihsb2ctPmRpcnR5X2JpdG1hcCwgZGlydHlfYml0bWFwLCBuKSkKIAkJCWdvdG8gb3V0OwotCQl9Ci0JCXZmcmVlKGRpcnR5X2JpdG1hcCk7CiAJfSBlbHNlIHsKIAkJciA9IC1FRkFVTFQ7CiAJCWlmIChjbGVhcl91c2VyKGxvZy0+ZGlydHlfYml0bWFwLCBuKSkKQEAgLTMyNjYsOCArMzMxNCwxMCBAQAogCQlpZiAodnBpYykgewogCQkJciA9IGt2bV9pb2FwaWNfaW5pdChrdm0pOwogCQkJaWYgKHIpIHsKKwkJCQltdXRleF9sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQkJCWt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoa3ZtLCBLVk1fUElPX0JVUywKIAkJCQkJCQkgICZ2cGljLT5kZXYpOworCQkJCW11dGV4X3VubG9jaygma3ZtLT5zbG90c19sb2NrKTsKIAkJCQlrZnJlZSh2cGljKTsKIAkJCQlnb3RvIGNyZWF0ZV9pcnFjaGlwX3VubG9jazsKIAkJCX0KQEAgLTMyNzgsMTAgKzMzMjgsMTIgQEAKIAkJc21wX3dtYigpOwogCQlyID0ga3ZtX3NldHVwX2RlZmF1bHRfaXJxX3JvdXRpbmcoa3ZtKTsKIAkJaWYgKHIpIHsKKwkJCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CiAJCQltdXRleF9sb2NrKCZrdm0tPmlycV9sb2NrKTsKIAkJCWt2bV9pb2FwaWNfZGVzdHJveShrdm0pOwogCQkJa3ZtX2Rlc3Ryb3lfcGljKGt2bSk7CiAJCQltdXRleF91bmxvY2soJmt2bS0+aXJxX2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCQl9CiAJY3JlYXRlX2lycWNoaXBfdW5sb2NrOgogCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CkBAIC0zNTU3LDYzICszNjA5LDYzIEBACiBzdGF0aWMgZ3BhX3QgdHJhbnNsYXRlX25lc3RlZF9ncGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsIHUzMiBhY2Nlc3MpCiB7CiAJZ3BhX3QgdF9ncGE7Ci0JdTMyIGVycm9yOworCXN0cnVjdCB4ODZfZXhjZXB0aW9uIGV4Y2VwdGlvbjsKIAogCUJVR19PTighbW11X2lzX25lc3RlZCh2Y3B1KSk7CiAKIAkvKiBOUFQgd2Fsa3MgYXJlIGFsd2F5cyB1c2VyLXdhbGtzICovCiAJYWNjZXNzIHw9IFBGRVJSX1VTRVJfTUFTSzsKLQl0X2dwYSAgPSB2Y3B1LT5hcmNoLm1tdS5ndmFfdG9fZ3BhKHZjcHUsIGdwYSwgYWNjZXNzLCAmZXJyb3IpOwotCWlmICh0X2dwYSA9PSBVTk1BUFBFRF9HVkEpCi0JCXZjcHUtPmFyY2guZmF1bHQubmVzdGVkID0gdHJ1ZTsKKwl0X2dwYSAgPSB2Y3B1LT5hcmNoLm1tdS5ndmFfdG9fZ3BhKHZjcHUsIGdwYSwgYWNjZXNzLCAmZXhjZXB0aW9uKTsKIAogCXJldHVybiB0X2dwYTsKIH0KIAotZ3BhX3Qga3ZtX21tdV9ndmFfdG9fZ3BhX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiAqZXJyb3IpCitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwKKwkJCSAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7CiAJdTMyIGFjY2VzcyA9IChrdm1feDg2X29wcy0+Z2V0X2NwbCh2Y3B1KSA9PSAzKSA/IFBGRVJSX1VTRVJfTUFTSyA6IDA7Ci0JcmV0dXJuIHZjcHUtPmFyY2gud2Fsa19tbXUtPmd2YV90b19ncGEodmNwdSwgZ3ZhLCBhY2Nlc3MsIGVycm9yKTsKKwlyZXR1cm4gdmNwdS0+YXJjaC53YWxrX21tdS0+Z3ZhX3RvX2dwYSh2Y3B1LCBndmEsIGFjY2VzcywgZXhjZXB0aW9uKTsKIH0KIAotIGdwYV90IGt2bV9tbXVfZ3ZhX3RvX2dwYV9mZXRjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgdTMyICplcnJvcikKKyBncGFfdCBrdm1fbW11X2d2YV90b19ncGFfZmV0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsCisJCQkJc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKIHsKIAl1MzIgYWNjZXNzID0gKGt2bV94ODZfb3BzLT5nZXRfY3BsKHZjcHUpID09IDMpID8gUEZFUlJfVVNFUl9NQVNLIDogMDsKIAlhY2Nlc3MgfD0gUEZFUlJfRkVUQ0hfTUFTSzsKLQlyZXR1cm4gdmNwdS0+YXJjaC53YWxrX21tdS0+Z3ZhX3RvX2dwYSh2Y3B1LCBndmEsIGFjY2VzcywgZXJyb3IpOworCXJldHVybiB2Y3B1LT5hcmNoLndhbGtfbW11LT5ndmFfdG9fZ3BhKHZjcHUsIGd2YSwgYWNjZXNzLCBleGNlcHRpb24pOwogfQogCi1ncGFfdCBrdm1fbW11X2d2YV90b19ncGFfd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiAqZXJyb3IpCitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsCisJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKIHsKIAl1MzIgYWNjZXNzID0gKGt2bV94ODZfb3BzLT5nZXRfY3BsKHZjcHUpID09IDMpID8gUEZFUlJfVVNFUl9NQVNLIDogMDsKIAlhY2Nlc3MgfD0gUEZFUlJfV1JJVEVfTUFTSzsKLQlyZXR1cm4gdmNwdS0+YXJjaC53YWxrX21tdS0+Z3ZhX3RvX2dwYSh2Y3B1LCBndmEsIGFjY2VzcywgZXJyb3IpOworCXJldHVybiB2Y3B1LT5hcmNoLndhbGtfbW11LT5ndmFfdG9fZ3BhKHZjcHUsIGd2YSwgYWNjZXNzLCBleGNlcHRpb24pOwogfQogCiAvKiB1c2VzIHRoaXMgdG8gYWNjZXNzIGFueSBndWVzdCdzIG1hcHBlZCBtZW1vcnkgd2l0aG91dCBjaGVja2luZyBDUEwgKi8KLWdwYV90IGt2bV9tbXVfZ3ZhX3RvX2dwYV9zeXN0ZW0oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBndmFfdCBndmEsIHUzMiAqZXJyb3IpCitncGFfdCBrdm1fbW11X2d2YV90b19ncGFfc3lzdGVtKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLAorCQkJCXN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7Ci0JcmV0dXJuIHZjcHUtPmFyY2gud2Fsa19tbXUtPmd2YV90b19ncGEodmNwdSwgZ3ZhLCAwLCBlcnJvcik7CisJcmV0dXJuIHZjcHUtPmFyY2gud2Fsa19tbXUtPmd2YV90b19ncGEodmNwdSwgZ3ZhLCAwLCBleGNlcHRpb24pOwogfQogCiBzdGF0aWMgaW50IGt2bV9yZWFkX2d1ZXN0X3ZpcnRfaGVscGVyKGd2YV90IGFkZHIsIHZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLAogCQkJCSAgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIGFjY2VzcywKLQkJCQkgICAgICB1MzIgKmVycm9yKQorCQkJCSAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7CiAJdm9pZCAqZGF0YSA9IHZhbDsKIAlpbnQgciA9IFg4NkVNVUxfQ09OVElOVUU7CiAKIAl3aGlsZSAoYnl0ZXMpIHsKIAkJZ3BhX3QgZ3BhID0gdmNwdS0+YXJjaC53YWxrX21tdS0+Z3ZhX3RvX2dwYSh2Y3B1LCBhZGRyLCBhY2Nlc3MsCi0JCQkJCQkJICAgIGVycm9yKTsKKwkJCQkJCQkgICAgZXhjZXB0aW9uKTsKIAkJdW5zaWduZWQgb2Zmc2V0ID0gYWRkciAmIChQQUdFX1NJWkUtMSk7CiAJCXVuc2lnbmVkIHRvcmVhZCA9IG1pbihieXRlcywgKHVuc2lnbmVkKVBBR0VfU0laRSAtIG9mZnNldCk7CiAJCWludCByZXQ7CiAKLQkJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpIHsKLQkJCXIgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQorCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQlyZXQgPSBrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGdwYSwgZGF0YSwgdG9yZWFkKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXIgPSBYODZFTVVMX0lPX05FRURFRDsKQEAgLTM2MzAsMzEgKzM2ODIsMzUgQEAKIAogLyogdXNlZCBmb3IgaW5zdHJ1Y3Rpb24gZmV0Y2hpbmcgKi8KIHN0YXRpYyBpbnQga3ZtX2ZldGNoX2d1ZXN0X3ZpcnQoZ3ZhX3QgYWRkciwgdm9pZCAqdmFsLCB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgKmVycm9yKQorCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQlzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQogewogCXUzMiBhY2Nlc3MgPSAoa3ZtX3g4Nl9vcHMtPmdldF9jcGwodmNwdSkgPT0gMykgPyBQRkVSUl9VU0VSX01BU0sgOiAwOwogCXJldHVybiBrdm1fcmVhZF9ndWVzdF92aXJ0X2hlbHBlcihhZGRyLCB2YWwsIGJ5dGVzLCB2Y3B1LAotCQkJCQkgIGFjY2VzcyB8IFBGRVJSX0ZFVENIX01BU0ssIGVycm9yKTsKKwkJCQkJICBhY2Nlc3MgfCBQRkVSUl9GRVRDSF9NQVNLLAorCQkJCQkgIGV4Y2VwdGlvbik7CiB9CiAKIHN0YXRpYyBpbnQga3ZtX3JlYWRfZ3Vlc3RfdmlydChndmFfdCBhZGRyLCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKLQkJCSAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiAqZXJyb3IpCisJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7CiAJdTMyIGFjY2VzcyA9IChrdm1feDg2X29wcy0+Z2V0X2NwbCh2Y3B1KSA9PSAzKSA/IFBGRVJSX1VTRVJfTUFTSyA6IDA7CiAJcmV0dXJuIGt2bV9yZWFkX2d1ZXN0X3ZpcnRfaGVscGVyKGFkZHIsIHZhbCwgYnl0ZXMsIHZjcHUsIGFjY2VzcywKLQkJCQkJICBlcnJvcik7CisJCQkJCSAgZXhjZXB0aW9uKTsKIH0KIAogc3RhdGljIGludCBrdm1fcmVhZF9ndWVzdF92aXJ0X3N5c3RlbShndmFfdCBhZGRyLCB2b2lkICp2YWwsIHVuc2lnbmVkIGludCBieXRlcywKLQkJCSAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiAqZXJyb3IpCisJCQkJICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgIHN0cnVjdCB4ODZfZXhjZXB0aW9uICpleGNlcHRpb24pCiB7Ci0JcmV0dXJuIGt2bV9yZWFkX2d1ZXN0X3ZpcnRfaGVscGVyKGFkZHIsIHZhbCwgYnl0ZXMsIHZjcHUsIDAsIGVycm9yKTsKKwlyZXR1cm4ga3ZtX3JlYWRfZ3Vlc3RfdmlydF9oZWxwZXIoYWRkciwgdmFsLCBieXRlcywgdmNwdSwgMCwgZXhjZXB0aW9uKTsKIH0KIAogc3RhdGljIGludCBrdm1fd3JpdGVfZ3Vlc3RfdmlydF9zeXN0ZW0oZ3ZhX3QgYWRkciwgdm9pZCAqdmFsLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCiAJCQkJICAgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgICAgICAgdTMyICplcnJvcikKKwkJCQkgICAgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbikKIHsKIAl2b2lkICpkYXRhID0gdmFsOwogCWludCByID0gWDg2RU1VTF9DT05USU5VRTsKQEAgLTM2NjIsMTUgKzM3MTgsMTMgQEAKIAl3aGlsZSAoYnl0ZXMpIHsKIAkJZ3BhX3QgZ3BhID0gIHZjcHUtPmFyY2gud2Fsa19tbXUtPmd2YV90b19ncGEodmNwdSwgYWRkciwKIAkJCQkJCQkgICAgIFBGRVJSX1dSSVRFX01BU0ssCi0JCQkJCQkJICAgICBlcnJvcik7CisJCQkJCQkJICAgICBleGNlcHRpb24pOwogCQl1bnNpZ25lZCBvZmZzZXQgPSBhZGRyICYgKFBBR0VfU0laRS0xKTsKIAkJdW5zaWduZWQgdG93cml0ZSA9IG1pbihieXRlcywgKHVuc2lnbmVkKVBBR0VfU0laRSAtIG9mZnNldCk7CiAJCWludCByZXQ7CiAKLQkJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpIHsKLQkJCXIgPSBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmIChncGEgPT0gVU5NQVBQRURfR1ZBKQorCQkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwogCQlyZXQgPSBrdm1fd3JpdGVfZ3Vlc3QodmNwdS0+a3ZtLCBncGEsIGRhdGEsIHRvd3JpdGUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJciA9IFg4NkVNVUxfSU9fTkVFREVEOwpAQCAtMzY4OCw3ICszNzQyLDcgQEAKIHN0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF9lbXVsYXRlZCh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICB2b2lkICp2YWwsCiAJCQkJICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkJICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCisJCQkJICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uLAogCQkJCSAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWdwYV90ICAgICAgICAgICAgICAgICBncGE7CkBAIC0zNzAxLDcgKzM3NTUsNyBAQAogCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIAl9CiAKLQlncGEgPSBrdm1fbW11X2d2YV90b19ncGFfcmVhZCh2Y3B1LCBhZGRyLCBlcnJvcl9jb2RlKTsKKwlncGEgPSBrdm1fbW11X2d2YV90b19ncGFfcmVhZCh2Y3B1LCBhZGRyLCBleGNlcHRpb24pOwogCiAJaWYgKGdwYSA9PSBVTk1BUFBFRF9HVkEpCiAJCXJldHVybiBYODZFTVVMX1BST1BBR0FURV9GQVVMVDsKQEAgLTM3MTAsOCArMzc2NCw4IEBACiAJaWYgKChncGEgJiBQQUdFX01BU0spID09IEFQSUNfREVGQVVMVF9QSFlTX0JBU0UpCiAJCWdvdG8gbW1pbzsKIAotCWlmIChrdm1fcmVhZF9ndWVzdF92aXJ0KGFkZHIsIHZhbCwgYnl0ZXMsIHZjcHUsIE5VTEwpCi0JCQkJPT0gWDg2RU1VTF9DT05USU5VRSkKKwlpZiAoa3ZtX3JlYWRfZ3Vlc3RfdmlydChhZGRyLCB2YWwsIGJ5dGVzLCB2Y3B1LCBleGNlcHRpb24pCisJICAgID09IFg4NkVNVUxfQ09OVElOVUUpCiAJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogCiBtbWlvOgpAQCAtMzczNSw3ICszNzg5LDcgQEAKIH0KIAogaW50IGVtdWxhdG9yX3dyaXRlX3BoeXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsCi0JCQkgIGNvbnN0IHZvaWQgKnZhbCwgaW50IGJ5dGVzKQorCQkJY29uc3Qgdm9pZCAqdmFsLCBpbnQgYnl0ZXMpCiB7CiAJaW50IHJldDsKIApAQCAtMzc0OSwxMiArMzgwMywxMiBAQAogc3RhdGljIGludCBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZF9vbmVwYWdlKHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkJICAgY29uc3Qgdm9pZCAqdmFsLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCAqZXJyb3JfY29kZSwKKwkJCQkJICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKIAkJCQkJICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWdwYV90ICAgICAgICAgICAgICAgICBncGE7CiAKLQlncGEgPSBrdm1fbW11X2d2YV90b19ncGFfd3JpdGUodmNwdSwgYWRkciwgZXJyb3JfY29kZSk7CisJZ3BhID0ga3ZtX21tdV9ndmFfdG9fZ3BhX3dyaXRlKHZjcHUsIGFkZHIsIGV4Y2VwdGlvbik7CiAKIAlpZiAoZ3BhID09IFVOTUFQUEVEX0dWQSkKIAkJcmV0dXJuIFg4NkVNVUxfUFJPUEFHQVRFX0ZBVUxUOwpAQCAtMzc4Nyw3ICszODQxLDcgQEAKIGludCBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZCh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgY29uc3Qgdm9pZCAqdmFsLAogCQkJICAgIHVuc2lnbmVkIGludCBieXRlcywKLQkJCSAgICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCisJCQkgICAgc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKIAkJCSAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJLyogQ3Jvc3NpbmcgYSBwYWdlIGJvdW5kYXJ5PyAqLwpAQCAtMzc5NSw3ICszODQ5LDcgQEAKIAkJaW50IHJjLCBub3c7CiAKIAkJbm93ID0gLWFkZHIgJiB+UEFHRV9NQVNLOwotCQlyYyA9IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBub3csIGVycm9yX2NvZGUsCisJCXJjID0gZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWRfb25lcGFnZShhZGRyLCB2YWwsIG5vdywgZXhjZXB0aW9uLAogCQkJCQkJICAgICB2Y3B1KTsKIAkJaWYgKHJjICE9IFg4NkVNVUxfQ09OVElOVUUpCiAJCQlyZXR1cm4gcmM7CkBAIC0zODAzLDcgKzM4NTcsNyBAQAogCQl2YWwgKz0gbm93OwogCQlieXRlcyAtPSBub3c7CiAJfQotCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZF9vbmVwYWdlKGFkZHIsIHZhbCwgYnl0ZXMsIGVycm9yX2NvZGUsCisJcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkX29uZXBhZ2UoYWRkciwgdmFsLCBieXRlcywgZXhjZXB0aW9uLAogCQkJCQkgICAgICAgdmNwdSk7CiB9CiAKQEAgLTM4MjEsNyArMzg3NSw3IEBACiAJCQkJICAgICBjb25zdCB2b2lkICpvbGQsCiAJCQkJICAgICBjb25zdCB2b2lkICpuZXcsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKmVycm9yX2NvZGUsCisJCQkJICAgICBzdHJ1Y3QgeDg2X2V4Y2VwdGlvbiAqZXhjZXB0aW9uLAogCQkJCSAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWdwYV90IGdwYTsKQEAgLTM4NzksNyArMzkzMyw3IEBACiBlbXVsX3dyaXRlOgogCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAia3ZtOiBlbXVsYXRpbmcgZXhjaGFuZ2UgYXMgd3JpdGVcbiIpOwogCi0JcmV0dXJuIGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKGFkZHIsIG5ldywgYnl0ZXMsIGVycm9yX2NvZGUsIHZjcHUpOworCXJldHVybiBlbXVsYXRvcl93cml0ZV9lbXVsYXRlZChhZGRyLCBuZXcsIGJ5dGVzLCBleGNlcHRpb24sIHZjcHUpOwogfQogCiBzdGF0aWMgaW50IGtlcm5lbF9waW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkICpwZCkKQEAgLTM5MDQsNyArMzk1OCw3IEBACiAJaWYgKHZjcHUtPmFyY2gucGlvLmNvdW50KQogCQlnb3RvIGRhdGFfYXZhaWw7CiAKLQl0cmFjZV9rdm1fcGlvKDAsIHBvcnQsIHNpemUsIDEpOworCXRyYWNlX2t2bV9waW8oMCwgcG9ydCwgc2l6ZSwgY291bnQpOwogCiAJdmNwdS0+YXJjaC5waW8ucG9ydCA9IHBvcnQ7CiAJdmNwdS0+YXJjaC5waW8uaW4gPSAxOwpAQCAtMzkzMiw3ICszOTg2LDcgQEAKIAkJCSAgICAgIGNvbnN0IHZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGNvdW50LAogCQkJICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXRyYWNlX2t2bV9waW8oMSwgcG9ydCwgc2l6ZSwgMSk7CisJdHJhY2Vfa3ZtX3BpbygxLCBwb3J0LCBzaXplLCBjb3VudCk7CiAKIAl2Y3B1LT5hcmNoLnBpby5wb3J0ID0gcG9ydDsKIAl2Y3B1LT5hcmNoLnBpby5pbiA9IDA7CkBAIC0zOTczLDEzICs0MDI3LDE1IEBACiAJCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwogCiAJaWYgKGt2bV94ODZfb3BzLT5oYXNfd2JpbnZkX2V4aXQoKSkgewotCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJaW50IGNwdSA9IGdldF9jcHUoKTsKKworCQljcHVtYXNrX3NldF9jcHUoY3B1LCB2Y3B1LT5hcmNoLndiaW52ZF9kaXJ0eV9tYXNrKTsKIAkJc21wX2NhbGxfZnVuY3Rpb25fbWFueSh2Y3B1LT5hcmNoLndiaW52ZF9kaXJ0eV9tYXNrLAogCQkJCXdiaW52ZF9pcGksIE5VTEwsIDEpOwotCQlwcmVlbXB0X2VuYWJsZSgpOworCQlwdXRfY3B1KCk7CiAJCWNwdW1hc2tfY2xlYXIodmNwdS0+YXJjaC53YmludmRfZGlydHlfbWFzayk7Ci0JfQotCXdiaW52ZCgpOworCX0gZWxzZQorCQl3YmludmQoKTsKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9lbXVsYXRlX3diaW52ZCk7CkBAIC00MDE5LDcgKzQwNzUsNyBAQAogCQl2YWx1ZSA9IHZjcHUtPmFyY2guY3IyOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCXZhbHVlID0gdmNwdS0+YXJjaC5jcjM7CisJCXZhbHVlID0ga3ZtX3JlYWRfY3IzKHZjcHUpOwogCQlicmVhazsKIAljYXNlIDQ6CiAJCXZhbHVlID0ga3ZtX3JlYWRfY3I0KHZjcHUpOwpAQCAtNDA1Myw3ICs0MTA5LDcgQEAKIAkJcmVzID0ga3ZtX3NldF9jcjQodmNwdSwgbWtfY3JfNjQoa3ZtX3JlYWRfY3I0KHZjcHUpLCB2YWwpKTsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQlyZXMgPSBfX2t2bV9zZXRfY3I4KHZjcHUsIHZhbCAmIDB4ZlVMKTsKKwkJcmVzID0ga3ZtX3NldF9jcjgodmNwdSwgdmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdmNwdV9wcmludGYodmNwdSwgIiVzOiB1bmV4cGVjdGVkIGNyICV1XG4iLCBfX2Z1bmNfXywgY3IpOwpAQCAtNDIwNiwxMiArNDI2MiwxMyBAQAogc3RhdGljIHZvaWQgaW5qZWN0X2VtdWxhdGVkX2V4Y2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQ7Ci0JaWYgKGN0eHQtPmV4Y2VwdGlvbiA9PSBQRl9WRUNUT1IpCi0JCWt2bV9wcm9wYWdhdGVfZmF1bHQodmNwdSk7Ci0JZWxzZSBpZiAoY3R4dC0+ZXJyb3JfY29kZV92YWxpZCkKLQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbl9lKHZjcHUsIGN0eHQtPmV4Y2VwdGlvbiwgY3R4dC0+ZXJyb3JfY29kZSk7CisJaWYgKGN0eHQtPmV4Y2VwdGlvbi52ZWN0b3IgPT0gUEZfVkVDVE9SKQorCQlrdm1fcHJvcGFnYXRlX2ZhdWx0KHZjcHUsICZjdHh0LT5leGNlcHRpb24pOworCWVsc2UgaWYgKGN0eHQtPmV4Y2VwdGlvbi5lcnJvcl9jb2RlX3ZhbGlkKQorCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UodmNwdSwgY3R4dC0+ZXhjZXB0aW9uLnZlY3RvciwKKwkJCQkgICAgICBjdHh0LT5leGNlcHRpb24uZXJyb3JfY29kZSk7CiAJZWxzZQotCQlrdm1fcXVldWVfZXhjZXB0aW9uKHZjcHUsIGN0eHQtPmV4Y2VwdGlvbik7CisJCWt2bV9xdWV1ZV9leGNlcHRpb24odmNwdSwgY3R4dC0+ZXhjZXB0aW9uLnZlY3Rvcik7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfZW11bGF0ZV9jdHh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTQyNjcsMTMgKzQzMjQsMTkgQEAKIAogc3RhdGljIGludCBoYW5kbGVfZW11bGF0aW9uX2ZhaWx1cmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWludCByID0gRU1VTEFURV9ET05FOworCiAJKyt2Y3B1LT5zdGF0Lmluc25fZW11bGF0aW9uX2ZhaWw7CiAJdHJhY2Vfa3ZtX2VtdWxhdGVfaW5zbl9mYWlsZWQodmNwdSk7Ci0JdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOwotCXZjcHUtPnJ1bi0+aW50ZXJuYWwuc3ViZXJyb3IgPSBLVk1fSU5URVJOQUxfRVJST1JfRU1VTEFUSU9OOwotCXZjcHUtPnJ1bi0+aW50ZXJuYWwubmRhdGEgPSAwOworCWlmICghaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5URVJOQUxfRVJST1I7CisJCXZjcHUtPnJ1bi0+aW50ZXJuYWwuc3ViZXJyb3IgPSBLVk1fSU5URVJOQUxfRVJST1JfRU1VTEFUSU9OOworCQl2Y3B1LT5ydW4tPmludGVybmFsLm5kYXRhID0gMDsKKwkJciA9IEVNVUxBVEVfRkFJTDsKKwl9CiAJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOwotCXJldHVybiBFTVVMQVRFX0ZBSUw7CisKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wgcmVleGVjdXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhKQpAQCAtNDMwMiwxMCArNDM2NSwxMSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotaW50IGVtdWxhdGVfaW5zdHJ1Y3Rpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJdW5zaWduZWQgbG9uZyBjcjIsCi0JCQl1MTYgZXJyb3JfY29kZSwKLQkJCWludCBlbXVsYXRpb25fdHlwZSkKK2ludCB4ODZfZW11bGF0ZV9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjcjIsCisJCQkgICAgaW50IGVtdWxhdGlvbl90eXBlLAorCQkJICAgIHZvaWQgKmluc24sCisJCQkgICAgaW50IGluc25fbGVuKQogewogCWludCByOwogCXN0cnVjdCBkZWNvZGVfY2FjaGUgKmMgPSAmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuZGVjb2RlOwpAQCAtNDMyMywxMCArNDM4NywxMCBAQAogCWlmICghKGVtdWxhdGlvbl90eXBlICYgRU1VTFRZUEVfTk9fREVDT0RFKSkgewogCQlpbml0X2VtdWxhdGVfY3R4dCh2Y3B1KTsKIAkJdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQuaW50ZXJydXB0aWJpbGl0eSA9IDA7Ci0JCXZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmV4Y2VwdGlvbiA9IC0xOworCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5oYXZlX2V4Y2VwdGlvbiA9IGZhbHNlOwogCQl2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5wZXJtX29rID0gZmFsc2U7CiAKLQkJciA9IHg4Nl9kZWNvZGVfaW5zbigmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQpOworCQlyID0geDg2X2RlY29kZV9pbnNuKCZ2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dCwgaW5zbiwgaW5zbl9sZW4pOwogCQlpZiAociA9PSBYODZFTVVMX1BST1BBR0FURV9GQVVMVCkKIAkJCWdvdG8gZG9uZTsKIApAQCAtNDM4OSw3ICs0NDUzLDcgQEAKIAl9CiAKIGRvbmU6Ci0JaWYgKHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmV4Y2VwdGlvbiA+PSAwKSB7CisJaWYgKHZjcHUtPmFyY2guZW11bGF0ZV9jdHh0LmhhdmVfZXhjZXB0aW9uKSB7CiAJCWluamVjdF9lbXVsYXRlZF9leGNlcHRpb24odmNwdSk7CiAJCXIgPSBFTVVMQVRFX0RPTkU7CiAJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLnBpby5jb3VudCkgewpAQCAtNDQxMyw3ICs0NDc3LDcgQEAKIAogCXJldHVybiByOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZW11bGF0ZV9pbnN0cnVjdGlvbik7CitFWFBPUlRfU1lNQk9MX0dQTCh4ODZfZW11bGF0ZV9pbnN0cnVjdGlvbik7CiAKIGludCBrdm1fZmFzdF9waW9fb3V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHNpemUsIHVuc2lnbmVkIHNob3J0IHBvcnQpCiB7CkBAIC00NjUzLDcgKzQ3MTcsNiBAQAogCiAJa3ZtX3g4Nl9vcHMgPSBvcHM7CiAJa3ZtX21tdV9zZXRfbm9ucHJlc2VudF9wdGVzKDB1bGwsIDB1bGwpOwotCWt2bV9tbXVfc2V0X2Jhc2VfcHRlcyhQVF9QUkVTRU5UX01BU0spOwogCWt2bV9tbXVfc2V0X21hc2tfcHRlcyhQVF9VU0VSX01BU0ssIFBUX0FDQ0VTU0VEX01BU0ssCiAJCQlQVF9ESVJUWV9NQVNLLCBQVDY0X05YX01BU0ssIDApOwogCkBAIC01MTE2LDYgKzUxNzksMTIgQEAKIAkJCXZjcHUtPmZwdV9hY3RpdmUgPSAwOwogCQkJa3ZtX3g4Nl9vcHMtPmZwdV9kZWFjdGl2YXRlKHZjcHUpOwogCQl9CisJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX0FQRl9IQUxULCB2Y3B1KSkgeworCQkJLyogUGFnZSBpcyBzd2FwcGVkIG91dC4gRG8gc3ludGhldGljIGhhbHQgKi8KKwkJCXZjcHUtPmFyY2guYXBmLmhhbHRlZCA9IHRydWU7CisJCQlyID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJciA9IGt2bV9tbXVfcmVsb2FkKHZjcHUpOwpAQCAtNTI0NCw3ICs1MzEzLDggQEAKIAogCXIgPSAxOwogCXdoaWxlIChyID4gMCkgewotCQlpZiAodmNwdS0+YXJjaC5tcF9zdGF0ZSA9PSBLVk1fTVBfU1RBVEVfUlVOTkFCTEUpCisJCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9SVU5OQUJMRSAmJgorCQkgICAgIXZjcHUtPmFyY2guYXBmLmhhbHRlZCkKIAkJCXIgPSB2Y3B1X2VudGVyX2d1ZXN0KHZjcHUpOwogCQllbHNlIHsKIAkJCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgdmNwdS0+c3JjdV9pZHgpOwpAQCAtNTI1Nyw2ICs1MzI3LDcgQEAKIAkJCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9CiAJCQkJCQlLVk1fTVBfU1RBVEVfUlVOTkFCTEU7CiAJCQkJY2FzZSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU6CisJCQkJCXZjcHUtPmFyY2guYXBmLmhhbHRlZCA9IGZhbHNlOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVEOgogCQkJCWRlZmF1bHQ6CkBAIC01Mjc4LDYgKzUzNDksOSBAQAogCQkJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CiAJCQkrK3ZjcHUtPnN0YXQucmVxdWVzdF9pcnFfZXhpdHM7CiAJCX0KKworCQlrdm1fY2hlY2tfYXN5bmNfcGZfY29tcGxldGlvbih2Y3B1KTsKKwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXIgPSAtRUlOVFI7CiAJCQl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5UUjsKQEAgLTUzMDIsNiArNTM3Niw5IEBACiAJaW50IHI7CiAJc2lnc2V0X3Qgc2lnc2F2ZWQ7CiAKKwlpZiAoIXRza191c2VkX21hdGgoY3VycmVudCkgJiYgaW5pdF9mcHUoY3VycmVudCkpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKHZjcHUtPnNpZ3NldF9hY3RpdmUpCiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmdmNwdS0+c2lnc2V0LCAmc2lnc2F2ZWQpOwogCkBAIC01MzEzLDggKzUzOTAsMTIgQEAKIAl9CiAKIAkvKiByZS1zeW5jIGFwaWMncyB0cHIgKi8KLQlpZiAoIWlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCi0JCWt2bV9zZXRfY3I4KHZjcHUsIGt2bV9ydW4tPmNyOCk7CisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pKSB7CisJCWlmIChrdm1fc2V0X2NyOCh2Y3B1LCBrdm1fcnVuLT5jcjgpICE9IDApIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKIAlpZiAodmNwdS0+YXJjaC5waW8uY291bnQgfHwgdmNwdS0+bW1pb19uZWVkZWQpIHsKIAkJaWYgKHZjcHUtPm1taW9fbmVlZGVkKSB7CkBAIC01MzIzLDcgKzU0MDQsNyBAQAogCQkJdmNwdS0+bW1pb19uZWVkZWQgPSAwOwogCQl9CiAJCXZjcHUtPnNyY3VfaWR4ID0gc3JjdV9yZWFkX2xvY2soJnZjcHUtPmt2bS0+c3JjdSk7Ci0JCXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIDAsIDAsIEVNVUxUWVBFX05PX0RFQ09ERSk7CisJCXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIEVNVUxUWVBFX05PX0RFQ09ERSk7CiAJCXNyY3VfcmVhZF91bmxvY2soJnZjcHUtPmt2bS0+c3JjdSwgdmNwdS0+c3JjdV9pZHgpOwogCQlpZiAociAhPSBFTVVMQVRFX0RPTkUpIHsKIAkJCXIgPSAwOwpAQCAtNTQzNiw3ICs1NTE3LDcgQEAKIAogCXNyZWdzLT5jcjAgPSBrdm1fcmVhZF9jcjAodmNwdSk7CiAJc3JlZ3MtPmNyMiA9IHZjcHUtPmFyY2guY3IyOwotCXNyZWdzLT5jcjMgPSB2Y3B1LT5hcmNoLmNyMzsKKwlzcmVncy0+Y3IzID0ga3ZtX3JlYWRfY3IzKHZjcHUpOwogCXNyZWdzLT5jcjQgPSBrdm1fcmVhZF9jcjQodmNwdSk7CiAJc3JlZ3MtPmNyOCA9IGt2bV9nZXRfY3I4KHZjcHUpOwogCXNyZWdzLT5lZmVyID0gdmNwdS0+YXJjaC5lZmVyOwpAQCAtNTUwNCw4ICs1NTg1LDkgQEAKIAlrdm1feDg2X29wcy0+c2V0X2dkdCh2Y3B1LCAmZHQpOwogCiAJdmNwdS0+YXJjaC5jcjIgPSBzcmVncy0+Y3IyOwotCW1tdV9yZXNldF9uZWVkZWQgfD0gdmNwdS0+YXJjaC5jcjMgIT0gc3JlZ3MtPmNyMzsKKwltbXVfcmVzZXRfbmVlZGVkIHw9IGt2bV9yZWFkX2NyMyh2Y3B1KSAhPSBzcmVncy0+Y3IzOwogCXZjcHUtPmFyY2guY3IzID0gc3JlZ3MtPmNyMzsKKwlfX3NldF9iaXQoVkNQVV9FWFJFR19DUjMsICh1bG9uZyAqKSZ2Y3B1LT5hcmNoLnJlZ3NfYXZhaWwpOwogCiAJa3ZtX3NldF9jcjgodmNwdSwgc3JlZ3MtPmNyOCk7CiAKQEAgLTU1MjIsNyArNTYwNCw3IEBACiAJaWYgKHNyZWdzLT5jcjQgJiBYODZfQ1I0X09TWFNBVkUpCiAJCXVwZGF0ZV9jcHVpZCh2Y3B1KTsKIAlpZiAoIWlzX2xvbmdfbW9kZSh2Y3B1KSAmJiBpc19wYWUodmNwdSkpIHsKLQkJbG9hZF9wZHB0cnModmNwdSwgdmNwdS0+YXJjaC53YWxrX21tdSwgdmNwdS0+YXJjaC5jcjMpOworCQlsb2FkX3BkcHRycyh2Y3B1LCB2Y3B1LT5hcmNoLndhbGtfbW11LCBrdm1fcmVhZF9jcjModmNwdSkpOwogCQltbXVfcmVzZXRfbmVlZGVkID0gMTsKIAl9CiAKQEAgLTU3NzMsNiArNTg1NSw4IEBACiAKIHZvaWQga3ZtX2FyY2hfdmNwdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwl2Y3B1LT5hcmNoLmFwZi5tc3JfdmFsID0gMDsKKwogCXZjcHVfbG9hZCh2Y3B1KTsKIAlrdm1fbW11X3VubG9hZCh2Y3B1KTsKIAl2Y3B1X3B1dCh2Y3B1KTsKQEAgLTU3OTIsNiArNTg3NiwxMSBAQAogCXZjcHUtPmFyY2guZHI3ID0gRFI3X0ZJWEVEXzE7CiAKIAlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfRVZFTlQsIHZjcHUpOworCXZjcHUtPmFyY2guYXBmLm1zcl92YWwgPSAwOworCisJa3ZtX2NsZWFyX2FzeW5jX3BmX2NvbXBsZXRpb25fcXVldWUodmNwdSk7CisJa3ZtX2FzeW5jX3BmX2hhc2hfcmVzZXQodmNwdSk7CisJdmNwdS0+YXJjaC5hcGYuaGFsdGVkID0gZmFsc2U7CiAKIAlyZXR1cm4ga3ZtX3g4Nl9vcHMtPnZjcHVfcmVzZXQodmNwdSk7CiB9CkBAIC01ODgxLDYgKzU5NzAsOCBAQAogCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZ2Y3B1LT5hcmNoLndiaW52ZF9kaXJ0eV9tYXNrLCBHRlBfS0VSTkVMKSkKIAkJZ290byBmYWlsX2ZyZWVfbWNlX2JhbmtzOwogCisJa3ZtX2FzeW5jX3BmX2hhc2hfcmVzZXQodmNwdSk7CisKIAlyZXR1cm4gMDsKIGZhaWxfZnJlZV9tY2VfYmFua3M6CiAJa2ZyZWUodmNwdS0+YXJjaC5tY2VfYmFua3MpOwpAQCAtNTkwNiwxMyArNTk5Nyw4IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZjcHUtPmFyY2gucGlvX2RhdGEpOwogfQogCi1zdHJ1Y3QgIGt2bSAqa3ZtX2FyY2hfY3JlYXRlX3ZtKHZvaWQpCitpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0Jc3RydWN0IGt2bSAqa3ZtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFrdm0pCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCiAJSU5JVF9MSVNUX0hFQUQoJmt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzKTsKIAlJTklUX0xJU1RfSEVBRCgma3ZtLT5hcmNoLmFzc2lnbmVkX2Rldl9oZWFkKTsKIApAQCAtNTkyMSw3ICs2MDA3LDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCZrdm0tPmFyY2gudHNjX3dyaXRlX2xvY2spOwogCi0JcmV0dXJuIGt2bTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga3ZtX3VubG9hZF92Y3B1X21tdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC01OTM5LDggKzYwMjUsMTAgQEAKIAkvKgogCSAqIFVucGluIGFueSBtbXUgcGFnZXMgZmlyc3QuCiAJICovCi0Ja3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdmNwdSwga3ZtKQorCWt2bV9mb3JfZWFjaF92Y3B1KGksIHZjcHUsIGt2bSkgeworCQlrdm1fY2xlYXJfYXN5bmNfcGZfY29tcGxldGlvbl9xdWV1ZSh2Y3B1KTsKIAkJa3ZtX3VubG9hZF92Y3B1X21tdSh2Y3B1KTsKKwl9CiAJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdmNwdSwga3ZtKQogCQlrdm1fYXJjaF92Y3B1X2ZyZWUodmNwdSk7CiAKQEAgLTU5NjQsMTMgKzYwNTIsMTAgQEAKIAlrZnJlZShrdm0tPmFyY2gudnBpYyk7CiAJa2ZyZWUoa3ZtLT5hcmNoLnZpb2FwaWMpOwogCWt2bV9mcmVlX3ZjcHVzKGt2bSk7Ci0Ja3ZtX2ZyZWVfcGh5c21lbShrdm0pOwogCWlmIChrdm0tPmFyY2guYXBpY19hY2Nlc3NfcGFnZSkKIAkJcHV0X3BhZ2Uoa3ZtLT5hcmNoLmFwaWNfYWNjZXNzX3BhZ2UpOwogCWlmIChrdm0tPmFyY2guZXB0X2lkZW50aXR5X3BhZ2V0YWJsZSkKIAkJcHV0X3BhZ2Uoa3ZtLT5hcmNoLmVwdF9pZGVudGl0eV9wYWdldGFibGUpOwotCWNsZWFudXBfc3JjdV9zdHJ1Y3QoJmt2bS0+c3JjdSk7Ci0Ja2ZyZWUoa3ZtKTsKIH0KIAogaW50IGt2bV9hcmNoX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sCkBAIC02MDUxLDcgKzYxMzYsOSBAQAogCiBpbnQga3ZtX2FyY2hfdmNwdV9ydW5uYWJsZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuIHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFCisJcmV0dXJuICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9SVU5OQUJMRSAmJgorCQkhdmNwdS0+YXJjaC5hcGYuaGFsdGVkKQorCQl8fCAhbGlzdF9lbXB0eV9jYXJlZnVsKCZ2Y3B1LT5hc3luY19wZi5kb25lKQogCQl8fCB2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVECiAJCXx8IHZjcHUtPmFyY2gubm1pX3BlbmRpbmcgfHwKIAkJKGt2bV9hcmNoX2ludGVycnVwdF9hbGxvd2VkKHZjcHUpICYmCkBAIC02MTEwLDYgKzYxOTcsMTQ3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fc2V0X3JmbGFncyk7CiAKK3ZvaWQga3ZtX2FyY2hfYXN5bmNfcGFnZV9yZWFkeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspCit7CisJaW50IHI7CisKKwlpZiAoKHZjcHUtPmFyY2gubW11LmRpcmVjdF9tYXAgIT0gd29yay0+YXJjaC5kaXJlY3RfbWFwKSB8fAorCSAgICAgIGlzX2Vycm9yX3BhZ2Uod29yay0+cGFnZSkpCisJCXJldHVybjsKKworCXIgPSBrdm1fbW11X3JlbG9hZCh2Y3B1KTsKKwlpZiAodW5saWtlbHkocikpCisJCXJldHVybjsKKworCWlmICghdmNwdS0+YXJjaC5tbXUuZGlyZWN0X21hcCAmJgorCSAgICAgIHdvcmstPmFyY2guY3IzICE9IHZjcHUtPmFyY2gubW11LmdldF9jcjModmNwdSkpCisJCXJldHVybjsKKworCXZjcHUtPmFyY2gubW11LnBhZ2VfZmF1bHQodmNwdSwgd29yay0+Z3ZhLCAwLCB0cnVlKTsKK30KKworc3RhdGljIGlubGluZSB1MzIga3ZtX2FzeW5jX3BmX2hhc2hfZm4oZ2ZuX3QgZ2ZuKQoreworCXJldHVybiBoYXNoXzMyKGdmbiAmIDB4ZmZmZmZmZmYsIG9yZGVyX2Jhc2VfMihBU1lOQ19QRl9QRVJfVkNQVSkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBrdm1fYXN5bmNfcGZfbmV4dF9wcm9iZSh1MzIga2V5KQoreworCXJldHVybiAoa2V5ICsgMSkgJiAocm91bmR1cF9wb3dfb2ZfdHdvKEFTWU5DX1BGX1BFUl9WQ1BVKSAtIDEpOworfQorCitzdGF0aWMgdm9pZCBrdm1fYWRkX2FzeW5jX3BmX2dmbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbikKK3sKKwl1MzIga2V5ID0ga3ZtX2FzeW5jX3BmX2hhc2hfZm4oZ2ZuKTsKKworCXdoaWxlICh2Y3B1LT5hcmNoLmFwZi5nZm5zW2tleV0gIT0gfjApCisJCWtleSA9IGt2bV9hc3luY19wZl9uZXh0X3Byb2JlKGtleSk7CisKKwl2Y3B1LT5hcmNoLmFwZi5nZm5zW2tleV0gPSBnZm47Cit9CisKK3N0YXRpYyB1MzIga3ZtX2FzeW5jX3BmX2dmbl9zbG90KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuKQoreworCWludCBpOworCXUzMiBrZXkgPSBrdm1fYXN5bmNfcGZfaGFzaF9mbihnZm4pOworCisJZm9yIChpID0gMDsgaSA8IHJvdW5kdXBfcG93X29mX3R3byhBU1lOQ19QRl9QRVJfVkNQVSkgJiYKKwkJICAgICAodmNwdS0+YXJjaC5hcGYuZ2Zuc1trZXldICE9IGdmbiAmJgorCQkgICAgICB2Y3B1LT5hcmNoLmFwZi5nZm5zW2tleV0gIT0gfjApOyBpKyspCisJCWtleSA9IGt2bV9hc3luY19wZl9uZXh0X3Byb2JlKGtleSk7CisKKwlyZXR1cm4ga2V5OworfQorCitib29sIGt2bV9maW5kX2FzeW5jX3BmX2dmbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbikKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5hcGYuZ2Zuc1trdm1fYXN5bmNfcGZfZ2ZuX3Nsb3QodmNwdSwgZ2ZuKV0gPT0gZ2ZuOworfQorCitzdGF0aWMgdm9pZCBrdm1fZGVsX2FzeW5jX3BmX2dmbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbikKK3sKKwl1MzIgaSwgaiwgazsKKworCWkgPSBqID0ga3ZtX2FzeW5jX3BmX2dmbl9zbG90KHZjcHUsIGdmbik7CisJd2hpbGUgKHRydWUpIHsKKwkJdmNwdS0+YXJjaC5hcGYuZ2Zuc1tpXSA9IH4wOworCQlkbyB7CisJCQlqID0ga3ZtX2FzeW5jX3BmX25leHRfcHJvYmUoaik7CisJCQlpZiAodmNwdS0+YXJjaC5hcGYuZ2Zuc1tqXSA9PSB+MCkKKwkJCQlyZXR1cm47CisJCQlrID0ga3ZtX2FzeW5jX3BmX2hhc2hfZm4odmNwdS0+YXJjaC5hcGYuZ2Zuc1tqXSk7CisJCQkvKgorCQkJICogayBsaWVzIGN5Y2xpY2FsbHkgaW4gXWksal0KKwkJCSAqIHwgICAgaS5rLmogfAorCQkJICogfC4uLi5qIGkuay58IG9yICB8LmsuLmogaS4uLnwKKwkJCSAqLworCQl9IHdoaWxlICgoaSA8PSBqKSA/IChpIDwgayAmJiBrIDw9IGopIDogKGkgPCBrIHx8IGsgPD0gaikpOworCQl2Y3B1LT5hcmNoLmFwZi5nZm5zW2ldID0gdmNwdS0+YXJjaC5hcGYuZ2Zuc1tqXTsKKwkJaSA9IGo7CisJfQorfQorCitzdGF0aWMgaW50IGFwZl9wdXRfdXNlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiB2YWwpCit7CisKKwlyZXR1cm4ga3ZtX3dyaXRlX2d1ZXN0X2NhY2hlZCh2Y3B1LT5rdm0sICZ2Y3B1LT5hcmNoLmFwZi5kYXRhLCAmdmFsLAorCQkJCSAgICAgIHNpemVvZih2YWwpKTsKK30KKwordm9pZCBrdm1fYXJjaF9hc3luY19wYWdlX25vdF9wcmVzZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspCit7CisJc3RydWN0IHg4Nl9leGNlcHRpb24gZmF1bHQ7CisKKwl0cmFjZV9rdm1fYXN5bmNfcGZfbm90X3ByZXNlbnQod29yay0+YXJjaC50b2tlbiwgd29yay0+Z3ZhKTsKKwlrdm1fYWRkX2FzeW5jX3BmX2dmbih2Y3B1LCB3b3JrLT5hcmNoLmdmbik7CisKKwlpZiAoISh2Y3B1LT5hcmNoLmFwZi5tc3JfdmFsICYgS1ZNX0FTWU5DX1BGX0VOQUJMRUQpIHx8CisJICAgICh2Y3B1LT5hcmNoLmFwZi5zZW5kX3VzZXJfb25seSAmJgorCSAgICAga3ZtX3g4Nl9vcHMtPmdldF9jcGwodmNwdSkgPT0gMCkpCisJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9BUEZfSEFMVCwgdmNwdSk7CisJZWxzZSBpZiAoIWFwZl9wdXRfdXNlcih2Y3B1LCBLVk1fUFZfUkVBU09OX1BBR0VfTk9UX1BSRVNFTlQpKSB7CisJCWZhdWx0LnZlY3RvciA9IFBGX1ZFQ1RPUjsKKwkJZmF1bHQuZXJyb3JfY29kZV92YWxpZCA9IHRydWU7CisJCWZhdWx0LmVycm9yX2NvZGUgPSAwOworCQlmYXVsdC5uZXN0ZWRfcGFnZV9mYXVsdCA9IGZhbHNlOworCQlmYXVsdC5hZGRyZXNzID0gd29yay0+YXJjaC50b2tlbjsKKwkJa3ZtX2luamVjdF9wYWdlX2ZhdWx0KHZjcHUsICZmYXVsdCk7CisJfQorfQorCit2b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcHJlc2VudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJIHN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmspCit7CisJc3RydWN0IHg4Nl9leGNlcHRpb24gZmF1bHQ7CisKKwl0cmFjZV9rdm1fYXN5bmNfcGZfcmVhZHkod29yay0+YXJjaC50b2tlbiwgd29yay0+Z3ZhKTsKKwlpZiAoaXNfZXJyb3JfcGFnZSh3b3JrLT5wYWdlKSkKKwkJd29yay0+YXJjaC50b2tlbiA9IH4wOyAvKiBicm9hZGNhc3Qgd2FrZXVwICovCisJZWxzZQorCQlrdm1fZGVsX2FzeW5jX3BmX2dmbih2Y3B1LCB3b3JrLT5hcmNoLmdmbik7CisKKwlpZiAoKHZjcHUtPmFyY2guYXBmLm1zcl92YWwgJiBLVk1fQVNZTkNfUEZfRU5BQkxFRCkgJiYKKwkgICAgIWFwZl9wdXRfdXNlcih2Y3B1LCBLVk1fUFZfUkVBU09OX1BBR0VfUkVBRFkpKSB7CisJCWZhdWx0LnZlY3RvciA9IFBGX1ZFQ1RPUjsKKwkJZmF1bHQuZXJyb3JfY29kZV92YWxpZCA9IHRydWU7CisJCWZhdWx0LmVycm9yX2NvZGUgPSAwOworCQlmYXVsdC5uZXN0ZWRfcGFnZV9mYXVsdCA9IGZhbHNlOworCQlmYXVsdC5hZGRyZXNzID0gd29yay0+YXJjaC50b2tlbjsKKwkJa3ZtX2luamVjdF9wYWdlX2ZhdWx0KHZjcHUsICZmYXVsdCk7CisJfQorCXZjcHUtPmFyY2guYXBmLmhhbHRlZCA9IGZhbHNlOworfQorCitib29sIGt2bV9hcmNoX2Nhbl9pbmplY3RfYXN5bmNfcGFnZV9wcmVzZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoISh2Y3B1LT5hcmNoLmFwZi5tc3JfdmFsICYgS1ZNX0FTWU5DX1BGX0VOQUJMRUQpKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiAha3ZtX2V2ZW50X25lZWRzX3JlaW5qZWN0aW9uKHZjcHUpICYmCisJCQlrdm1feDg2X29wcy0+aW50ZXJydXB0X2FsbG93ZWQodmNwdSk7Cit9CisKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoa3ZtX2V4aXQpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChrdm1faW5qX3ZpcnEpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChrdm1fcGFnZV9mYXVsdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neV82NC5jIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3lfNjQuYwppbmRleCAwOGEwMDY5Li5mMjE5NjJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neV82NC5jCisrKyBiL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5XzY0LmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vYW1kX25iLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgX19pbml0ZGF0YSBub2Rlc1s4XTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW5pdGRhdGEgbm9kZWlkc1s4XTsKIHN0YXRpYyBub2RlbWFza190IF9faW5pdGRhdGEgbm9kZXNfcGFyc2VkID0gTk9ERV9NQVNLX05PTkU7CiAKIHN0YXRpYyBfX2luaXQgaW50IGZpbmRfbm9ydGhicmlkZ2Uodm9pZCkKQEAgLTY4LDE5ICs2OSw2IEBACiAjZW5kaWYKIH0KIAotaW50IF9faW5pdCBhbWRfZ2V0X25vZGVzKHN0cnVjdCBib290bm9kZSAqcGh5c25vZGVzKQotewotCWludCBpOwotCWludCByZXQgPSAwOwotCi0JZm9yX2VhY2hfbm9kZV9tYXNrKGksIG5vZGVzX3BhcnNlZCkgewotCQlwaHlzbm9kZXNbcmV0XS5zdGFydCA9IG5vZGVzW2ldLnN0YXJ0OwotCQlwaHlzbm9kZXNbcmV0XS5lbmQgPSBub2Rlc1tpXS5lbmQ7Ci0JCXJldCsrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCiBpbnQgX19pbml0IGFtZF9udW1hX2luaXQodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gUEZOX1BIWVMoc3RhcnRfcGZuKTsKQEAgLTExMyw3ICsxMDEsNyBAQAogCQliYXNlID0gcmVhZF9wY2lfY29uZmlnKDAsIG5iLCAxLCAweDQwICsgaSo4KTsKIAkJbGltaXQgPSByZWFkX3BjaV9jb25maWcoMCwgbmIsIDEsIDB4NDQgKyBpKjgpOwogCi0JCW5vZGVpZCA9IGxpbWl0ICYgNzsKKwkJbm9kZWlkc1tpXSA9IG5vZGVpZCA9IGxpbWl0ICYgNzsKIAkJaWYgKChiYXNlICYgMykgPT0gMCkgewogCQkJaWYgKGkgPCBudW1ub2RlcykKIAkJCQlwcl9pbmZvKCJTa2lwcGluZyBkaXNhYmxlZCBub2RlICVkXG4iLCBpKTsKQEAgLTE5Myw2ICsxODEsNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19OVU1BX0VNVQorc3RhdGljIHMxNiBmYWtlX2FwaWNpZF90b19ub2RlW01BWF9MT0NBTF9BUElDXSBfX2luaXRkYXRhID0geworCVswIC4uLiBNQVhfTE9DQUxfQVBJQy0xXSA9IE5VTUFfTk9fTk9ERQorfTsKKwordm9pZCBfX2luaXQgYW1kX2dldF9ub2RlcyhzdHJ1Y3QgYm9vdG5vZGUgKnBoeXNub2RlcykKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX25vZGVfbWFzayhpLCBub2Rlc19wYXJzZWQpIHsKKwkJcGh5c25vZGVzW2ldLnN0YXJ0ID0gbm9kZXNbaV0uc3RhcnQ7CisJCXBoeXNub2Rlc1tpXS5lbmQgPSBub2Rlc1tpXS5lbmQ7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBmaW5kX25vZGVfYnlfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IHJldCA9IE5VTUFfTk9fTk9ERTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWlmIChhZGRyID49IG5vZGVzW2ldLnN0YXJ0ICYmIGFkZHIgPCBub2Rlc1tpXS5lbmQpIHsKKwkJCXJldCA9IGk7CisJCQlicmVhazsKKwkJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGb3IgTlVNQSBlbXVsYXRpb24sIGZha2UgcHJveGltaXR5IGRvbWFpbiAoX1BYTSkgdG8gbm9kZSBpZCBtYXBwaW5ncyBtdXN0IGJlCisgKiBzZXR1cCB0byByZXByZXNlbnQgdGhlIHBoeXNpY2FsIHRvcG9sb2d5IGJ1dCByZWZsZWN0IHRoZSBlbXVsYXRlZAorICogZW52aXJvbm1lbnQuICBGb3IgZWFjaCBlbXVsYXRlZCBub2RlLCB0aGUgcmVhbCBub2RlIHdoaWNoIGl0IGFwcGVhcnMgb24gaXMKKyAqIGZvdW5kIGFuZCBhIGZha2UgcHhtIHRvIG5pZCBtYXBwaW5nIGlzIGNyZWF0ZWQgd2hpY2ggbWlycm9ycyB0aGUgYWN0dWFsCisgKiBsb2NhbGl0eS4gIG5vZGVfZGlzdGFuY2UoKSB0aGVuIHJlcHJlc2VudHMgdGhlIGNvcnJlY3QgZGlzdGFuY2VzIGJldHdlZW4KKyAqIGVtdWxhdGVkIG5vZGVzIGJ5IHVzaW5nIHRoZSBmYWtlIGFjcGkgbWFwcGluZ3MgdG8gcHhtcy4KKyAqLwordm9pZCBfX2luaXQgYW1kX2Zha2Vfbm9kZXMoY29uc3Qgc3RydWN0IGJvb3Rub2RlICpub2RlcywgaW50IG5yX25vZGVzKQoreworCXVuc2lnbmVkIGludCBiaXRzOworCXVuc2lnbmVkIGludCBjb3JlczsKKwl1bnNpZ25lZCBpbnQgYXBpY2lkX2Jhc2UgPSAwOworCWludCBpOworCisJYml0cyA9IGJvb3RfY3B1X2RhdGEueDg2X2NvcmVpZF9iaXRzOworCWNvcmVzID0gMSA8PCBiaXRzOworCWVhcmx5X2dldF9ib290X2NwdV9pZCgpOworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPiAwKQorCQlhcGljaWRfYmFzZSA9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlczsgaSsrKSB7CisJCWludCBpbmRleDsKKwkJaW50IG5pZDsKKwkJaW50IGo7CisKKwkJbmlkID0gZmluZF9ub2RlX2J5X2FkZHIobm9kZXNbaV0uc3RhcnQpOworCQlpZiAobmlkID09IE5VTUFfTk9fTk9ERSkKKwkJCWNvbnRpbnVlOworCisJCWluZGV4ID0gbm9kZWlkc1tuaWRdIDw8IGJpdHM7CisJCWlmIChmYWtlX2FwaWNpZF90b19ub2RlW2luZGV4ICsgYXBpY2lkX2Jhc2VdID09IE5VTUFfTk9fTk9ERSkKKwkJCWZvciAoaiA9IGFwaWNpZF9iYXNlOyBqIDwgY29yZXMgKyBhcGljaWRfYmFzZTsgaisrKQorCQkJCWZha2VfYXBpY2lkX3RvX25vZGVbaW5kZXggKyBqXSA9IGk7CisjaWZkZWYgQ09ORklHX0FDUElfTlVNQQorCQlfX2FjcGlfbWFwX3B4bV90b19ub2RlKG5pZCwgaSk7CisjZW5kaWYKKwl9CisJbWVtY3B5KGFwaWNpZF90b19ub2RlLCBmYWtlX2FwaWNpZF90b19ub2RlLCBzaXplb2YoYXBpY2lkX3RvX25vZGUpKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi8KKwogaW50IF9faW5pdCBhbWRfc2Nhbl9ub2Rlcyh2b2lkKQogewogCXVuc2lnbmVkIGludCBiaXRzOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZ3VwLmMgYi9hcmNoL3g4Ni9tbS9ndXAuYwppbmRleCA3MzhlNjU5Li5kYmUzNGI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9ndXAuYworKysgYi9hcmNoL3g4Ni9tbS9ndXAuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCkBAIC04OSw2ICs5MCw3IEBACiAJCVZNX0JVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOwogCQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKIAkJZ2V0X3BhZ2UocGFnZSk7CisJCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKIAkJKCpucikrKzsKIApAQCAtMTAzLDYgKzEwNSwxNyBAQAogCVZNX0JVR19PTihwYWdlICE9IGNvbXBvdW5kX2hlYWQocGFnZSkpOwogCVZNX0JVR19PTihwYWdlX2NvdW50KHBhZ2UpID09IDApOwogCWF0b21pY19hZGQobnIsICZwYWdlLT5fY291bnQpOworCVNldFBhZ2VSZWZlcmVuY2VkKHBhZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2h1Z2VfcGFnZV90YWlsKHN0cnVjdCBwYWdlICpwYWdlKQoreworCS8qCisJICogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQoKSBjYW5ub3QgcnVuCisJICogZnJvbSB1bmRlciB1cy4KKwkgKi8KKwlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9jb3VudCkgPCAwKTsKKwlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwogfQogCiBzdGF0aWMgbm9pbmxpbmUgaW50IGd1cF9odWdlX3BtZChwbWRfdCBwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKQEAgLTEyOCw2ICsxNDEsOCBAQAogCWRvIHsKIAkJVk1fQlVHX09OKGNvbXBvdW5kX2hlYWQocGFnZSkgIT0gaGVhZCk7CiAJCXBhZ2VzWypucl0gPSBwYWdlOworCQlpZiAoUGFnZVRhaWwocGFnZSkpCisJCQlnZXRfaHVnZV9wYWdlX3RhaWwocGFnZSk7CiAJCSgqbnIpKys7CiAJCXBhZ2UrKzsKIAkJcmVmcysrOwpAQCAtMTQ4LDcgKzE2MywxOCBAQAogCQlwbWRfdCBwbWQgPSAqcG1kcDsKIAogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7Ci0JCWlmIChwbWRfbm9uZShwbWQpKQorCQkvKgorCQkgKiBUaGUgcG1kX3RyYW5zX3NwbGl0dGluZygpIGNoZWNrIGJlbG93IGV4cGxhaW5zIHdoeQorCQkgKiBwbWRwX3NwbGl0dGluZ19mbHVzaCBoYXMgdG8gZmx1c2ggdGhlIHRsYiwgdG8gc3RvcAorCQkgKiB0aGlzIGd1cC1mYXN0IGNvZGUgZnJvbSBydW5uaW5nIHdoaWxlIHdlIHNldCB0aGUKKwkJICogc3BsaXR0aW5nIGJpdCBpbiB0aGUgcG1kLiBSZXR1cm5pbmcgemVybyB3aWxsIHRha2UKKwkJICogdGhlIHNsb3cgcGF0aCB0aGF0IHdpbGwgY2FsbCB3YWl0X3NwbGl0X2h1Z2VfcGFnZSgpCisJCSAqIGlmIHRoZSBwbWQgaXMgc3RpbGwgaW4gc3BsaXR0aW5nIHN0YXRlLiBndXAtZmFzdAorCQkgKiBjYW4ndCBiZWNhdXNlIGl0IGhhcyBpcnEgZGlzYWJsZWQgYW5kCisJCSAqIHdhaXRfc3BsaXRfaHVnZV9wYWdlKCkgd291bGQgbmV2ZXIgcmV0dXJuIGFzIHRoZQorCQkgKiB0bGIgZmx1c2ggSVBJIHdvdWxkbid0IHJ1bi4KKwkJICovCisJCWlmIChwbWRfbm9uZShwbWQpIHx8IHBtZF90cmFuc19zcGxpdHRpbmcocG1kKSkKIAkJCXJldHVybiAwOwogCQlpZiAodW5saWtlbHkocG1kX2xhcmdlKHBtZCkpKSB7CiAJCQlpZiAoIWd1cF9odWdlX3BtZChwbWQsIGFkZHIsIG5leHQsIHdyaXRlLCBwYWdlcywgbnIpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IGY4OWI1YmIuLmM4MjEwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxhc20vYnVncy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vb2xwY19vZncuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgpAQCAtNzE1LDYgKzcxNiw3IEBACiAJLyoKIAkgKiBOT1RFOiBhdCB0aGlzIHBvaW50IHRoZSBib290bWVtIGFsbG9jYXRvciBpcyBmdWxseSBhdmFpbGFibGUuCiAJICovCisJb2xwY19kdF9idWlsZF9kZXZpY2V0cmVlKCk7CiAJc3BhcnNlX2luaXQoKTsKIAl6b25lX3NpemVzX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfNjQuYyBiL2FyY2gveDg2L21tL251bWFfNjQuYwppbmRleCA3NzYyYTUxLi4xZTcyMTAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV82NC5jCkBAIC0yNjAsMzAgKzI2MCwzMCBAQAogI2lmZGVmIENPTkZJR19OVU1BX0VNVQogLyogTnVtYSBlbXVsYXRpb24gKi8KIHN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgbm9kZXNbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOwotc3RhdGljIHN0cnVjdCBib290bm9kZSBwaHlzbm9kZXNbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBib290bm9kZSBwaHlzbm9kZXNbTUFYX05VTU5PREVTXSBfX2NwdWluaXRkYXRhOwogc3RhdGljIGNoYXIgKmNtZGxpbmUgX19pbml0ZGF0YTsKIAogc3RhdGljIGludCBfX2luaXQgc2V0dXBfcGh5c25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAogCQkJCQlpbnQgYWNwaSwgaW50IGFtZCkKIHsKLQlpbnQgbnJfbm9kZXMgPSAwOwogCWludCByZXQgPSAwOwogCWludCBpOwogCisJbWVtc2V0KHBoeXNub2RlcywgMCwgc2l6ZW9mKHBoeXNub2RlcykpOwogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlpZiAoYWNwaSkKLQkJbnJfbm9kZXMgPSBhY3BpX2dldF9ub2RlcyhwaHlzbm9kZXMpOworCQlhY3BpX2dldF9ub2RlcyhwaHlzbm9kZXMsIHN0YXJ0LCBlbmQpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FNRF9OVU1BCiAJaWYgKGFtZCkKLQkJbnJfbm9kZXMgPSBhbWRfZ2V0X25vZGVzKHBoeXNub2Rlcyk7CisJCWFtZF9nZXRfbm9kZXMocGh5c25vZGVzKTsKICNlbmRpZgogCS8qCiAJICogQmFzaWMgc2FuaXR5IGNoZWNraW5nIG9uIHRoZSBwaHlzaWNhbCBub2RlIG1hcDogdGhlcmUgbWF5IGJlIGVycm9ycwogCSAqIGlmIHRoZSBTUkFUIG9yIEFNRCBjb2RlIGluY29ycmVjdGx5IHJlcG9ydGVkIHRoZSB0b3BvbG9neSBvciB0aGUgbWVtPQogCSAqIGtlcm5lbCBwYXJhbWV0ZXIgaXMgdXNlZC4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewogCQlpZiAocGh5c25vZGVzW2ldLnN0YXJ0ID09IHBoeXNub2Rlc1tpXS5lbmQpCiAJCQljb250aW51ZTsKIAkJaWYgKHBoeXNub2Rlc1tpXS5zdGFydCA+IGVuZCkgewpAQCAtMjk4LDE3ICsyOTgsNiBAQAogCQkJcGh5c25vZGVzW2ldLnN0YXJ0ID0gc3RhcnQ7CiAJCWlmIChwaHlzbm9kZXNbaV0uZW5kID4gZW5kKQogCQkJcGh5c25vZGVzW2ldLmVuZCA9IGVuZDsKLQl9Ci0KLQkvKgotCSAqIFJlbW92ZSBhbGwgbm9kZXMgdGhhdCBoYXZlIG5vIG1lbW9yeSBvciB3ZXJlIHRydW5jYXRlZCBiZWNhdXNlIG9mIHRoZQotCSAqIGxpbWl0ZWQgYWRkcmVzcyByYW5nZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZXM7IGkrKykgewotCQlpZiAocGh5c25vZGVzW2ldLnN0YXJ0ID09IHBoeXNub2Rlc1tpXS5lbmQpCi0JCQljb250aW51ZTsKLQkJcGh5c25vZGVzW3JldF0uc3RhcnQgPSBwaHlzbm9kZXNbaV0uc3RhcnQ7Ci0JCXBoeXNub2Rlc1tyZXRdLmVuZCA9IHBoeXNub2Rlc1tpXS5lbmQ7CiAJCXJldCsrOwogCX0KIApAQCAtMzI0LDYgKzMxMywyNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBmYWtlX3BoeXNub2RlcyhpbnQgYWNwaSwgaW50IGFtZCwgaW50IG5yX25vZGVzKQoreworCWludCBpOworCisJQlVHX09OKGFjcGkgJiYgYW1kKTsKKyNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCisJaWYgKGFjcGkpCisJCWFjcGlfZmFrZV9ub2Rlcyhub2RlcywgbnJfbm9kZXMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FNRF9OVU1BCisJaWYgKGFtZCkKKwkJYW1kX2Zha2Vfbm9kZXMobm9kZXMsIG5yX25vZGVzKTsKKyNlbmRpZgorCWlmICghYWNwaSAmJiAhYW1kKQorCQlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1X2lkczsgaSsrKQorCQkJbnVtYV9zZXRfbm9kZShpLCAwKTsKK30KKwogLyoKICAqIFNldHVwcyB1cCBuaWQgdG8gcmFuZ2UgZnJvbSBhZGRyIHRvIGFkZHIgKyBzaXplLiAgSWYgdGhlIGVuZAogICogYm91bmRhcnkgaXMgZ3JlYXRlciB0aGFuIG1heF9hZGRyLCB0aGVuIG1heF9hZGRyIGlzIHVzZWQgaW5zdGVhZC4KQEAgLTM1Miw4ICszNTksNyBAQAogICogU2V0cyB1cCBucl9ub2RlcyBmYWtlIG5vZGVzIGludGVybGVhdmVkIG92ZXIgcGh5c2ljYWwgbm9kZXMgcmFuZ2luZyBmcm9tIGFkZHIKICAqIHRvIG1heF9hZGRyLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZC4KICAqLwotc3RhdGljIGludCBfX2luaXQgc3BsaXRfbm9kZXNfaW50ZXJsZWF2ZSh1NjQgYWRkciwgdTY0IG1heF9hZGRyLAotCQkJCQkJaW50IG5yX3BoeXNfbm9kZXMsIGludCBucl9ub2RlcykKK3N0YXRpYyBpbnQgX19pbml0IHNwbGl0X25vZGVzX2ludGVybGVhdmUodTY0IGFkZHIsIHU2NCBtYXhfYWRkciwgaW50IG5yX25vZGVzKQogewogCW5vZGVtYXNrX3QgcGh5c25vZGVfbWFzayA9IE5PREVfTUFTS19OT05FOwogCXU2NCBzaXplOwpAQCAtMzg0LDcgKzM5MCw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGh5c19ub2RlczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykKIAkJaWYgKHBoeXNub2Rlc1tpXS5zdGFydCAhPSBwaHlzbm9kZXNbaV0uZW5kKQogCQkJbm9kZV9zZXQoaSwgcGh5c25vZGVfbWFzayk7CiAKQEAgLTU1MywxMSArNTU5LDkgQEAKIHsKIAl1NjQgYWRkciA9IHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUOwogCXU2NCBtYXhfYWRkciA9IGxhc3RfcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IG51bV9waHlzX25vZGVzOwogCWludCBudW1fbm9kZXM7CiAJaW50IGk7CiAKLQludW1fcGh5c19ub2RlcyA9IHNldHVwX3BoeXNub2RlcyhhZGRyLCBtYXhfYWRkciwgYWNwaSwgYW1kKTsKIAkvKgogCSAqIElmIHRoZSBudW1hPWZha2UgY29tbWFuZC1saW5lIGNvbnRhaW5zIGEgJ00nIG9yICdHJywgaXQgcmVwcmVzZW50cwogCSAqIHRoZSBmaXhlZCBub2RlIHNpemUuICBPdGhlcndpc2UsIGlmIGl0IGlzIGp1c3QgYSBzaW5nbGUgbnVtYmVyIE4sCkBAIC01NzIsNyArNTc2LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBuOwogCiAJCW4gPSBzaW1wbGVfc3RydG91bChjbWRsaW5lLCBOVUxMLCAwKTsKLQkJbnVtX25vZGVzID0gc3BsaXRfbm9kZXNfaW50ZXJsZWF2ZShhZGRyLCBtYXhfYWRkciwgbnVtX3BoeXNfbm9kZXMsIG4pOworCQludW1fbm9kZXMgPSBzcGxpdF9ub2Rlc19pbnRlcmxlYXZlKGFkZHIsIG1heF9hZGRyLCBuKTsKIAl9CiAKIAlpZiAobnVtX25vZGVzIDwgMCkKQEAgLTU5NSw3ICs1OTksOCBAQAogCQkJCQkJbm9kZXNbaV0uZW5kID4+IFBBR0VfU0hJRlQpOwogCQlzZXR1cF9ub2RlX2Jvb3RtZW0oaSwgbm9kZXNbaV0uc3RhcnQsIG5vZGVzW2ldLmVuZCk7CiAJfQotCWFjcGlfZmFrZV9ub2Rlcyhub2RlcywgbnVtX25vZGVzKTsKKwlzZXR1cF9waHlzbm9kZXMoYWRkciwgbWF4X2FkZHIsIGFjcGksIGFtZCk7CisJZmFrZV9waHlzbm9kZXMoYWNwaSwgYW1kLCBudW1fbm9kZXMpOwogCW51bWFfaW5pdF9hcnJheSgpOwogCXJldHVybiAwOwogfQpAQCAtNjEwLDggKzYxNSwxMiBAQAogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CiAKICNpZmRlZiBDT05GSUdfTlVNQV9FTVUKKwlzZXR1cF9waHlzbm9kZXMoc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsIGxhc3RfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQlhY3BpLCBhbWQpOwogCWlmIChjbWRsaW5lICYmICFudW1hX2VtdWxhdGlvbihzdGFydF9wZm4sIGxhc3RfcGZuLCBhY3BpLCBhbWQpKQogCQlyZXR1cm47CisJc2V0dXBfcGh5c25vZGVzKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULCBsYXN0X3BmbiA8PCBQQUdFX1NISUZULAorCQkJYWNwaSwgYW1kKTsKIAlub2Rlc19jbGVhcihub2RlX3Bvc3NpYmxlX21hcCk7CiAJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKICNlbmRpZgpAQCAtNzY3LDYgKzc3Niw3IEBACiAKICNpZm5kZWYgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUwogCisjaWZuZGVmIENPTkZJR19OVU1BX0VNVQogdm9pZCBfX2NwdWluaXQgbnVtYV9hZGRfY3B1KGludCBjcHUpCiB7CiAJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9kZV90b19jcHVtYXNrX21hcFtlYXJseV9jcHVfdG9fbm9kZShjcHUpXSk7CkBAIC03NzYsMzQgKzc4NiwxMTUgQEAKIHsKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vZGVfdG9fY3B1bWFza19tYXBbZWFybHlfY3B1X3RvX25vZGUoY3B1KV0pOwogfQorI2Vsc2UKK3ZvaWQgX19jcHVpbml0IG51bWFfYWRkX2NwdShpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1MTYgYXBpY2lkOworCWludCBwaHlzbmlkOworCWludCBuaWQgPSBOVU1BX05PX05PREU7CisKKwlhcGljaWQgPSBlYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOworCWlmIChhcGljaWQgIT0gQkFEX0FQSUNJRCkKKwkJbmlkID0gYXBpY2lkX3RvX25vZGVbYXBpY2lkXTsKKwlpZiAobmlkID09IE5VTUFfTk9fTk9ERSkKKwkJbmlkID0gZWFybHlfY3B1X3RvX25vZGUoY3B1KTsKKwlCVUdfT04obmlkID09IE5VTUFfTk9fTk9ERSB8fCAhbm9kZV9vbmxpbmUobmlkKSk7CisKKwkvKgorCSAqIFVzZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgZW11bGF0ZWQgbm9kZSB0byBmaW5kIHdoaWNoIHBoeXNpY2FsCisJICogbm9kZSBpdCBpcyBhbGxvY2F0ZWQgb24uCisJICovCisJYWRkciA9IG5vZGVfc3RhcnRfcGZuKG5pZCkgPDwgUEFHRV9TSElGVDsKKwlmb3IgKHBoeXNuaWQgPSAwOyBwaHlzbmlkIDwgTUFYX05VTU5PREVTOyBwaHlzbmlkKyspCisJCWlmIChhZGRyID49IHBoeXNub2Rlc1twaHlzbmlkXS5zdGFydCAmJgorCQkgICAgYWRkciA8IHBoeXNub2Rlc1twaHlzbmlkXS5lbmQpCisJCQlicmVhazsKKworCS8qCisJICogTWFwIHRoZSBjcHUgdG8gZWFjaCBlbXVsYXRlZCBub2RlIHRoYXQgaXMgYWxsb2NhdGVkIG9uIHRoZSBwaHlzaWNhbAorCSAqIG5vZGUgb2YgdGhlIGNwdSdzIGFwaWMgaWQuCisJICovCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWFkZHIgPSBub2RlX3N0YXJ0X3BmbihuaWQpIDw8IFBBR0VfU0hJRlQ7CisJCWlmIChhZGRyID49IHBoeXNub2Rlc1twaHlzbmlkXS5zdGFydCAmJgorCQkgICAgYWRkciA8IHBoeXNub2Rlc1twaHlzbmlkXS5lbmQpCisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBub2RlX3RvX2NwdW1hc2tfbWFwW25pZF0pOworCX0KK30KKwordm9pZCBfX2NwdWluaXQgbnVtYV9yZW1vdmVfY3B1KGludCBjcHUpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKQorCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5vZGVfdG9fY3B1bWFza19tYXBbaV0pOworfQorI2VuZGlmIC8qICFDT05GSUdfTlVNQV9FTVUgKi8KIAogI2Vsc2UgLyogQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUyAqLwotCi0vKgotICogLS0tLS0tLS0tIGRlYnVnIHZlcnNpb25zIG9mIHRoZSBudW1hIGZ1bmN0aW9ucyAtLS0tLS0tLS0KLSAqLwotc3RhdGljIHZvaWQgX19jcHVpbml0IG51bWFfc2V0X2NwdW1hc2soaW50IGNwdSwgaW50IGVuYWJsZSkKK3N0YXRpYyBzdHJ1Y3QgY3B1bWFzayBfX2NwdWluaXQgKmRlYnVnX2NwdW1hc2tfc2V0X2NwdShpbnQgY3B1LCBpbnQgZW5hYmxlKQogewogCWludCBub2RlID0gZWFybHlfY3B1X3RvX25vZGUoY3B1KTsKIAlzdHJ1Y3QgY3B1bWFzayAqbWFzazsKIAljaGFyIGJ1Zls2NF07CiAKIAltYXNrID0gbm9kZV90b19jcHVtYXNrX21hcFtub2RlXTsKLQlpZiAobWFzayA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm9kZV90b19jcHVtYXNrX21hcFslaV0gTlVMTFxuIiwgbm9kZSk7CisJaWYgKCFtYXNrKSB7CisJCXByX2Vycigibm9kZV90b19jcHVtYXNrX21hcFslaV0gTlVMTFxuIiwgbm9kZSk7CiAJCWR1bXBfc3RhY2soKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwljcHVsaXN0X3NjbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtYXNrKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMgY3B1ICVkIG5vZGUgJWQ6IG1hc2sgbm93ICVzXG4iLAorCQllbmFibGUgPyAibnVtYV9hZGRfY3B1IiA6ICJudW1hX3JlbW92ZV9jcHUiLAorCQljcHUsIG5vZGUsIGJ1Zik7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0gZGVidWcgdmVyc2lvbnMgb2YgdGhlIG51bWEgZnVuY3Rpb25zIC0tLS0tLS0tLQorICovCisjaWZuZGVmIENPTkZJR19OVU1BX0VNVQorc3RhdGljIHZvaWQgX19jcHVpbml0IG51bWFfc2V0X2NwdW1hc2soaW50IGNwdSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgY3B1bWFzayAqbWFzazsKKworCW1hc2sgPSBkZWJ1Z19jcHVtYXNrX3NldF9jcHUoY3B1LCBlbmFibGUpOworCWlmICghbWFzaykKKwkJcmV0dXJuOworCiAJaWYgKGVuYWJsZSkKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgbWFzayk7CiAJZWxzZQogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG1hc2spOwotCi0JY3B1bGlzdF9zY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbWFzayk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzIGNwdSAlZCBub2RlICVkOiBtYXNrIG5vdyAlc1xuIiwKLQkJZW5hYmxlID8gIm51bWFfYWRkX2NwdSIgOiAibnVtYV9yZW1vdmVfY3B1IiwgY3B1LCBub2RlLCBidWYpOwogfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBudW1hX3NldF9jcHVtYXNrKGludCBjcHUsIGludCBlbmFibGUpCit7CisJaW50IG5vZGUgPSBlYXJseV9jcHVfdG9fbm9kZShjcHUpOworCXN0cnVjdCBjcHVtYXNrICptYXNrOworCWludCBpOworCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJYWRkciA9IG5vZGVfc3RhcnRfcGZuKGkpIDw8IFBBR0VfU0hJRlQ7CisJCWlmIChhZGRyIDwgcGh5c25vZGVzW25vZGVdLnN0YXJ0IHx8CisJCQkJCWFkZHIgPj0gcGh5c25vZGVzW25vZGVdLmVuZCkKKwkJCWNvbnRpbnVlOworCQltYXNrID0gZGVidWdfY3B1bWFza19zZXRfY3B1KGNwdSwgZW5hYmxlKTsKKwkJaWYgKCFtYXNrKQorCQkJcmV0dXJuOworCisJCWlmIChlbmFibGUpCisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBtYXNrKTsKKwkJZWxzZQorCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBtYXNrKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX05VTUFfRU1VICovCiAKIHZvaWQgX19jcHVpbml0IG51bWFfYWRkX2NwdShpbnQgY3B1KQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGd0YWJsZS5jIGIvYXJjaC94ODYvbW0vcGd0YWJsZS5jCmluZGV4IDhiZThjN2QuLjUwMDI0MmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BndGFibGUuYworKysgYi9hcmNoL3g4Ni9tbS9wZ3RhYmxlLmMKQEAgLTMyMCw2ICszMjAsMjUgQEAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIAorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQoraW50IHBtZHBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCwKKwkJCSAgcG1kX3QgZW50cnksIGludCBkaXJ0eSkKK3sKKwlpbnQgY2hhbmdlZCA9ICFwbWRfc2FtZSgqcG1kcCwgZW50cnkpOworCisJVk1fQlVHX09OKGFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spOworCisJaWYgKGNoYW5nZWQgJiYgZGlydHkpIHsKKwkJKnBtZHAgPSBlbnRyeTsKKwkJcG1kX3VwZGF0ZV9kZWZlcih2bWEtPnZtX21tLCBhZGRyZXNzLCBwbWRwKTsKKwkJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIEhQQUdFX1BNRF9TSVpFKTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlZDsKK30KKyNlbmRpZgorCiBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CkBAIC0zMzUsNiArMzU0LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQoraW50IHBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHBtZF90ICpwbWRwKQoreworCWludCByZXQgPSAwOworCisJaWYgKHBtZF95b3VuZygqcG1kcCkpCisJCXJldCA9IHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfQUNDRVNTRUQsCisJCQkJCSAodW5zaWduZWQgbG9uZyAqKXBtZHApOworCisJaWYgKHJldCkKKwkJcG1kX3VwZGF0ZSh2bWEtPnZtX21tLCBhZGRyLCBwbWRwKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKwogaW50IHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQogewpAQCAtMzQ3LDYgKzM4MywzNiBAQAogCXJldHVybiB5b3VuZzsKIH0KIAorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQoraW50IHBtZHBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQoreworCWludCB5b3VuZzsKKworCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKKworCXlvdW5nID0gcG1kcF90ZXN0X2FuZF9jbGVhcl95b3VuZyh2bWEsIGFkZHJlc3MsIHBtZHApOworCWlmICh5b3VuZykKKwkJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIEhQQUdFX1BNRF9TSVpFKTsKKworCXJldHVybiB5b3VuZzsKK30KKwordm9pZCBwbWRwX3NwbGl0dGluZ19mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCkKK3sKKwlpbnQgc2V0OworCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKKwlzZXQgPSAhdGVzdF9hbmRfc2V0X2JpdChfUEFHRV9CSVRfU1BMSVRUSU5HLAorCQkJCSh1bnNpZ25lZCBsb25nICopcG1kcCk7CisJaWYgKHNldCkgeworCQlwbWRfdXBkYXRlKHZtYS0+dm1fbW0sIGFkZHJlc3MsIHBtZHApOworCQkvKiBuZWVkIHRsYiBmbHVzaCBvbmx5IHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IGd1cC1mYXN0ICovCisJCWZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSk7CisJfQorfQorI2VuZGlmCisKIC8qKgogICogcmVzZXJ2ZV90b3BfYWRkcmVzcyAtIHJlc2VydmVzIGEgaG9sZSBpbiB0aGUgdG9wIG9mIGtlcm5lbCBhZGRyZXNzIHNwYWNlCiAgKiBAcmVzZXJ2ZSAtIHNpemUgb2YgaG9sZSB0byByZXNlcnZlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMgYi9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKaW5kZXggMTcxYTBhYS4uNjAzZDI4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vc3JhdF82NC5jCisrKyBiL2FyY2gveDg2L21tL3NyYXRfNjQuYwpAQCAtMzQ5LDE4ICszNDksMTkgQEAKIAogdm9pZCBfX2luaXQgYWNwaV9udW1hX2FyY2hfZml4dXAodm9pZCkge30KIAotaW50IF9faW5pdCBhY3BpX2dldF9ub2RlcyhzdHJ1Y3QgYm9vdG5vZGUgKnBoeXNub2RlcykKKyNpZmRlZiBDT05GSUdfTlVNQV9FTVUKK3ZvaWQgX19pbml0IGFjcGlfZ2V0X25vZGVzKHN0cnVjdCBib290bm9kZSAqcGh5c25vZGVzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCXVuc2lnbmVkIGxvbmcgZW5kKQogewogCWludCBpOwotCWludCByZXQgPSAwOwogCiAJZm9yX2VhY2hfbm9kZV9tYXNrKGksIG5vZGVzX3BhcnNlZCkgewotCQlwaHlzbm9kZXNbcmV0XS5zdGFydCA9IG5vZGVzW2ldLnN0YXJ0OwotCQlwaHlzbm9kZXNbcmV0XS5lbmQgPSBub2Rlc1tpXS5lbmQ7Ci0JCXJldCsrOworCQljdXRvZmZfbm9kZShpLCBzdGFydCwgZW5kKTsKKwkJcGh5c25vZGVzW2ldLnN0YXJ0ID0gbm9kZXNbaV0uc3RhcnQ7CisJCXBoeXNub2Rlc1tpXS5lbmQgPSBub2Rlc1tpXS5lbmQ7CiAJfQotCXJldHVybiByZXQ7CiB9CisjZW5kaWYgLyogQ09ORklHX05VTUFfRU1VICovCiAKIC8qIFVzZSB0aGUgaW5mb3JtYXRpb24gZGlzY292ZXJlZCBhYm92ZSB0byBhY3R1YWxseSBzZXQgdXAgdGhlIG5vZGVzLiAqLwogaW50IF9faW5pdCBhY3BpX3NjYW5fbm9kZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC01MDUsOCArNTA2LDYgQEAKIHsKIAlpbnQgaSwgajsKIAotCXByaW50ayhLRVJOX0lORk8gIkZha2luZyBQWE0gYWZmaW5pdHkgZm9yIGZha2Ugbm9kZXMgb24gcmVhbCAiCi0JCQkgInRvcG9sb2d5LlxuIik7CiAJZm9yIChpID0gMDsgaSA8IG51bV9ub2RlczsgaSsrKSB7CiAJCWludCBuaWQsIHB4bTsKIApAQCAtNTI2LDYgKzUyNSwxNyBAQAogCQkJICAgIGZha2VfYXBpY2lkX3RvX25vZGVbal0gPT0gTlVNQV9OT19OT0RFKQogCQkJCWZha2VfYXBpY2lkX3RvX25vZGVbal0gPSBpOwogCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFwaWNpZC10by1ub2RlIG1hcHBpbmdzIGZvciBwaHlzaWNhbCBub2RlcyB0aGF0IGRvIG5vdAorCSAqIGhhdmUgYSBjb3JyZXNwb25kaW5nIGVtdWxhdGVkIG5vZGUsIGl0IHNob3VsZCBkZWZhdWx0IHRvIGEgZ3VhcmFudGVlZAorCSAqIHZhbHVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKQorCQlpZiAoYXBpY2lkX3RvX25vZGVbaV0gIT0gTlVNQV9OT19OT0RFICYmCisJCSAgICBmYWtlX2FwaWNpZF90b19ub2RlW2ldID09IE5VTUFfTk9fTk9ERSkKKwkJCWZha2VfYXBpY2lkX3RvX25vZGVbaV0gPSAwOworCiAJZm9yIChpID0gMDsgaSA8IG51bV9ub2RlczsgaSsrKQogCQlfX2FjcGlfbWFwX3B4bV90b19ub2RlKGZha2Vfbm9kZV90b19weG1fbWFwW2ldLCBpKTsKIAltZW1jcHkoYXBpY2lkX3RvX25vZGUsIGZha2VfYXBpY2lkX3RvX25vZGUsIHNpemVvZihhcGljaWRfdG9fbm9kZSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCmluZGV4IGYyNGE4NTMuLmUyYjdiMGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYworKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKQEAgLTY1LDcgKzY1LDYgQEAKIAogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSBESUVfTk1JOgotCWNhc2UgRElFX05NSV9JUEk6CiAJCWlmIChjdHJfcnVubmluZykKIAkJCW1vZGVsLT5jaGVja19jdHJzKGFyZ3MtPnJlZ3MsICZfX2dldF9jcHVfdmFyKGNwdV9tc3JzKSk7CiAJCWVsc2UgaWYgKCFubWlfZW5hYmxlZCkKQEAgLTM2MSw3ICszNjAsNyBAQAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcm9maWxlX2V4Y2VwdGlvbnNfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBwcm9maWxlX2V4Y2VwdGlvbnNfbm90aWZ5LAogCS5uZXh0ID0gTlVMTCwKLQkucHJpb3JpdHkgPSAyCisJLnByaW9yaXR5ID0gTk1JX0xPQ0FMX0xPV19QUklPUiwKIH07CiAKIHN0YXRpYyB2b2lkIG5taV9jcHVfcmVzdG9yZV9yZWdpc3RlcnMoc3RydWN0IG9wX21zcnMgKm1zcnMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKaW5kZXggMDYzNmRkOS4uNzIwYmY1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYwpAQCAtMzgsNyArMzgsNyBAQAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcm9maWxlX3RpbWVyX2V4Y2VwdGlvbnNfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBwcm9maWxlX3RpbWVyX2V4Y2VwdGlvbnNfbm90aWZ5LAogCS5uZXh0ID0gTlVMTCwKLQkucHJpb3JpdHkgPSAwCisJLnByaW9yaXR5ID0gTk1JX0xPV19QUklPUiwKIH07CiAKIHN0YXRpYyBpbnQgdGltZXJfc3RhcnQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMgYi9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCmluZGV4IGZjMWU4ZmUuLmUyN2RmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKKysrIGIvYXJjaC94ODYvcGNpL2FtZF9idXMuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogCisjaW5jbHVkZSA8YXNtL2FtZF9uYi5oPgogI2luY2x1ZGUgPGFzbS9wY2lfeDg2Lmg+CiAKICNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgpAQCAtMzc4LDYgKzM3OSwzNCBAQAogCS5ub3RpZmllcl9jYWxsCT0gYW1kX2NwdV9ub3RpZnksCiB9OwogCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX2VuYWJsZV9wY2lfaW9fZWNzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0FNRF9OQgorCXVuc2lnbmVkIGludCBpLCBuOworCisJZm9yIChuID0gaSA9IDA7ICFuICYmIGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7ICsraSkgeworCQl1OCBidXMgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uYnVzOworCQl1OCBzbG90ID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOworCQl1OCBsaW1pdCA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CisKKwkJZm9yICg7IHNsb3QgPCBsaW1pdDsgKytzbG90KSB7CisJCQl1MzIgdmFsID0gcmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMCk7CisKKwkJCWlmICghZWFybHlfaXNfYW1kX25iKHZhbCkpCisJCQkJY29udGludWU7CisKKwkJCXZhbCA9IHJlYWRfcGNpX2NvbmZpZyhidXMsIHNsb3QsIDMsIDB4OGMpOworCQkJaWYgKCEodmFsICYgKEVOQUJMRV9DRjhfRVhUX0NGRyA+PiAzMikpKSB7CisJCQkJdmFsIHw9IEVOQUJMRV9DRjhfRVhUX0NGRyA+PiAzMjsKKwkJCQl3cml0ZV9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMHg4YywgdmFsKTsKKwkJCX0KKwkJCSsrbjsKKwkJfQorCX0KKwlwcl9pbmZvKCJFeHRlbmRlZCBDb25maWcgU3BhY2UgZW5hYmxlZCBvbiAldSBub2Rlc1xuIiwgbik7CisjZW5kaWYKK30KKwogc3RhdGljIGludCBfX2luaXQgcGNpX2lvX2Vjc19pbml0KHZvaWQpCiB7CiAJaW50IGNwdTsKQEAgLTM4Niw2ICs0MTUsMTAgQEAKICAgICAgICAgaWYgKGJvb3RfY3B1X2RhdGEueDg2IDwgMHgxMCkKIAkJcmV0dXJuIDA7CiAKKwkvKiBUcnkgdGhlIFBDSSBtZXRob2QgZmlyc3QuICovCisJaWYgKGVhcmx5X3BjaV9hbGxvd2VkKCkpCisJCXBjaV9lbmFibGVfcGNpX2lvX2VjcygpOworCiAJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZhbWRfY3B1X25vdGlmaWVyKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKIAkJYW1kX2NwdV9ub3RpZnkoJmFtZF9jcHVfbm90aWZpZXIsICh1bnNpZ25lZCBsb25nKUNQVV9PTkxJTkUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYnJvYWRjb21fYnVzLmMgYi9hcmNoL3g4Ni9wY2kvYnJvYWRjb21fYnVzLmMKaW5kZXggMDg0NmE1Yi4uYWI4MjY5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2Jyb2FkY29tX2J1cy5jCisrKyBiL2FyY2gveDg2L3BjaS9icm9hZGNvbV9idXMuYwpAQCAtOSw2ICs5LDcgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMjUsMTIgKzI2LDE0IEBACiAJdTggZmJ1cywgbGJ1czsKIAlpbnQgaTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCiAJLyoKLQkgKiBUaGUgeDg2X3BjaV9yb290X2J1c19yZXNfcXVpcmtzKCkgZnVuY3Rpb24gYWxyZWFkeSByZWZ1c2VzIHRvIHVzZQotCSAqIHRoaXMgaW5mb3JtYXRpb24gaWYgQUNQSSBfQ1JTIHdhcyB1c2VkLiBUaGVyZWZvcmUsIHdlIGRvbid0IGJvdGhlcgotCSAqIGNoZWNraW5nIGlmIEFDUEkgaXMgZW5hYmxlZCwgYW5kIGp1c3QgZ2VuZXJhdGUgdGhlIGluZm9ybWF0aW9uCi0JICogZm9yIGJvdGggdGhlIEFDUEkgX0NSUyBhbmQgbm8gQUNQSSBjYXNlcy4KKwkgKiBXZSBzaG91bGQgZ2V0IGhvc3QgYnJpZGdlIGluZm9ybWF0aW9uIGZyb20gQUNQSSB1bmxlc3MgdGhlIEJJT1MKKwkgKiBkb2Vzbid0IHN1cHBvcnQgaXQuCiAJICovCisJaWYgKGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcigpKQorCQlyZXR1cm47CisjZW5kaWYKIAogCWluZm8gPSAmcGNpX3Jvb3RfaW5mb1twY2lfcm9vdF9udW1dOwogCXBjaV9yb290X251bSsrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCmluZGV4IGY3YzhhMzkuLjVmZTc1MDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogdW5zaWduZWQgaW50IHBjaV9lYXJseV9kdW1wX3JlZ3M7CiBzdGF0aWMgaW50IHBjaV9iZl9zb3J0Oworc3RhdGljIGludCBzbWJpb3NfdHlwZV9iMV9mbGFnOwogaW50IHBjaV9yb3V0ZWlycTsKIGludCBub2lvYXBpY3F1aXJrOwogI2lmZGVmIENPTkZJR19YODZfUkVST1VURV9GT1JfQlJPS0VOX0JPT1RfSVJRUwpAQCAtMTg1LDYgKzE4NiwzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcmVhZF9kbWlfdHlwZV9iMShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sCisJCQkJICAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSkKK3sKKwl1OCAqZCA9ICh1OCAqKWRtICsgNDsKKworCWlmIChkbS0+dHlwZSAhPSAweEIxKQorCQlyZXR1cm47CisJc3dpdGNoICgoKCoodTMyICopZCkgPj4gOSkgJiAweDAzKSB7CisJY2FzZSAweDAwOgorCQlwcmludGsoS0VSTl9JTkZPICJkbWkgdHlwZSAweEIxIHJlY29yZCAtIHVua25vd24gZmxhZ1xuIik7CisJCWJyZWFrOworCWNhc2UgMHgwMTogLyogc2V0IHBjaT1iZnNvcnQgKi8KKwkJc21iaW9zX3R5cGVfYjFfZmxhZyA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgwMjogLyogZG8gbm90IHNldCBwY2k9YmZzb3J0ICovCisJCXNtYmlvc190eXBlX2IxX2ZsYWcgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZpbmRfc29ydF9tZXRob2QoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJZG1pX3dhbGsocmVhZF9kbWlfdHlwZV9iMSwgTlVMTCk7CisKKwlpZiAoc21iaW9zX3R5cGVfYjFfZmxhZyA9PSAxKSB7CisJCXNldF9iZl9zb3J0KGQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCiAvKgogICogRW5hYmxlIHJlbnVtYmVyaW5nIG9mIFBDSSBidXMjIHJhbmdlcyB0byByZWFjaCBhbGwgUENJIGJ1c3NlcyAoQ2FyZGJ1cykKICAqLwpAQCAtMjEzLDYgKzI0NywxMyBAQAogCX0sCiAjZW5kaWYJCS8qIF9faTM4Nl9fICovCiAJeworCQkuY2FsbGJhY2sgPSBmaW5kX3NvcnRfbWV0aG9kLAorCQkuaWRlbnQgPSAiRGVsbCBTeXN0ZW0iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jIiksCisJCX0sCisJfSwKKwl7CiAJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTk1MCIsCiAJCS5tYXRjaGVzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDlmOWJmYjcuLjg3ZTZjODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTU4OSw3ICs1ODksOCBAQAogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF8xOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF8yOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF8zOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9QQVRTQlVSR19MUEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BBVFNCVVJHX0xQQ18wOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9QQVRTQlVSR19MUENfMToKIAkJci0+bmFtZSA9ICJQSUlYL0lDSCI7CiAJCXItPmdldCA9IHBpcnFfcGlpeF9nZXQ7CiAJCXItPnNldCA9IHBpcnFfcGlpeF9zZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L2Vhcmx5X3ByaW50a19tcnN0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L2Vhcmx5X3ByaW50a19tcnN0LmMKaW5kZXggNjVkZjYwMy4uMjViZmRiYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9lYXJseV9wcmludGtfbXJzdC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvZWFybHlfcHJpbnRrX21yc3QuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtcnN0X3NwaV9wYWRkciA9IE1SU1RfUkVHQkFTRV9TUEkwOwogCiBzdGF0aWMgdTMyICpwY2xrX3NwaTA7Ci0vKiBBbHdheXMgY29udGFpbnMgYW4gYWNjZXNzYWJsZSBhZGRyZXNzLCBzdGFydCB3aXRoIDAgKi8KKy8qIEFsd2F5cyBjb250YWlucyBhbiBhY2Nlc3NpYmxlIGFkZHJlc3MsIHN0YXJ0IHdpdGggMCAqLwogc3RhdGljIHN0cnVjdCBkd19zcGlfcmVnICpwc3BpOwogCiBzdGF0aWMgc3RydWN0IGttc2dfZHVtcGVyIGR3X2R1bXBlcjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL01ha2VmaWxlCmluZGV4IGMzMWI4ZmMuLmU3OTc0MjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKIG9iai0kKENPTkZJR19PTFBDKQkJKz0gb2xwYy5vCiBvYmotJChDT05GSUdfT0xQQ19YTzEpCQkrPSBvbHBjLXhvMS5vCiBvYmotJChDT05GSUdfT0xQQ19PUEVORklSTVdBUkUpCSs9IG9scGNfb2Z3Lm8KK29iai0kKENPTkZJR19PTFBDX09QRU5GSVJNV0FSRV9EVCkJKz0gb2xwY19kdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLmMKaW5kZXggZjU0NDJjMC4uMTI3Nzc1NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjLXhvMS5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy14bzEuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBTdXBwb3J0IGZvciBmZWF0dXJlcyBvZiB0aGUgT0xQQyBYTy0xIGxhcHRvcAogICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAxMCBPbmUgTGFwdG9wIHBlciBDaGlsZAogICogQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwNiBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCkBAIC0xMiw4ICsxMyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCkBAIC0yMiw5ICsyMSw2IEBACiAKICNkZWZpbmUgRFJWX05BTUUgIm9scGMteG8xIgogCi0jZGVmaW5lIFBNU19CQVIJCTQKLSNkZWZpbmUgQUNQSV9CQVIJNQotCiAvKiBQTUMgcmVnaXN0ZXJzIChQTVMgYmxvY2spICovCiAjZGVmaW5lIFBNX1NDTEsJCTB4MTAKICNkZWZpbmUgUE1fSU5fU0xQQ1RMCTB4MjAKQEAgLTU3LDY1ICs1Myw2NyBAQAogCW91dGwoMHgwMDAwMjAwMCwgYWNwaV9iYXNlICsgUE0xX0NOVCk7CiB9CiAKLS8qIFJlYWQgdGhlIGJhc2UgYWRkcmVzc2VzIGZyb20gdGhlIFBDSSBCQVIgaW5mbyAqLwotc3RhdGljIGludCBfX2RldmluaXQgc2V0dXBfYmFzZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaW50IHI7Ci0KLQlyID0gcGNpX2VuYWJsZV9kZXZpY2VfaW8ocGRldik7Ci0JaWYgKHIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIGRldmljZSBJT1xuIik7Ci0JCXJldHVybiByOwotCX0KLQotCXIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgQUNQSV9CQVIsIERSVl9OQU1FKTsKLQlpZiAocikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBQQ0kgQkFSICMlZFxuIiwgQUNQSV9CQVIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlyID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIFBNU19CQVIsIERSVl9OQU1FKTsKLQlpZiAocikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBQQ0kgQkFSICMlZFxuIiwgUE1TX0JBUik7Ci0JCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBBQ1BJX0JBUik7Ci0JCXJldHVybiByOwotCX0KLQotCWFjcGlfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBBQ1BJX0JBUik7Ci0JcG1zX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUE1TX0JBUik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2RldmluaXQgb2xwY194bzFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwotCWludCByOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCi0JcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EsCi0JCQkJTlVMTCk7Ci0JaWYgKCFwZGV2KQorCS8qIGRvbid0IHJ1biBvbiBub24tWE9zICovCisJaWYgKCFtYWNoaW5lX2lzX29scGMoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyID0gc2V0dXBfYmFzZXMocGNpZGV2KTsKLQlpZiAocikKLQkJcmV0dXJuIHI7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGZldGNoIGRldmljZSByZXNvdXJjZSBpbmZvXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCi0JcG1fcG93ZXJfb2ZmID0geG8xX3Bvd2VyX29mZjsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgRFJWX05BTUUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgcmVnaW9uXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiT0xQQyBYTy0xIHN1cHBvcnQgcmVnaXN0ZXJlZFxuIik7CisJaWYgKHN0cmNtcChwZGV2LT5uYW1lLCAiY3M1NTM1LXBtcyIpID09IDApCisJCXBtc19iYXNlID0gcmVzLT5zdGFydDsKKwllbHNlIGlmIChzdHJjbXAocGRldi0+bmFtZSwgImNzNTUzNS1hY3BpIikgPT0gMCkKKwkJYWNwaV9iYXNlID0gcmVzLT5zdGFydDsKKworCS8qIElmIHdlIGhhdmUgYm90aCBhZGRyZXNzZXMsIHdlIGNhbiBvdmVycmlkZSB0aGUgcG93ZXJvZmYgaG9vayAqLworCWlmIChwbXNfYmFzZSAmJiBhY3BpX2Jhc2UpIHsKKwkJcG1fcG93ZXJfb2ZmID0geG8xX3Bvd2VyX29mZjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT0xQQyBYTy0xIHN1cHBvcnQgcmVnaXN0ZXJlZFxuIik7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG9scGNfeG8xX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJcmVsZWFzZV9yZWdpb24oci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOworCisJaWYgKHN0cmNtcChwZGV2LT5uYW1lLCAiY3M1NTM1LXBtcyIpID09IDApCisJCXBtc19iYXNlID0gMDsKKwllbHNlIGlmIChzdHJjbXAocGRldi0+bmFtZSwgImNzNTUzNS1hY3BpIikgPT0gMCkKKwkJYWNwaV9iYXNlID0gMDsKKwogCXBtX3Bvd2VyX29mZiA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9scGNfeG8xX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNzNTUzNV9wbXNfZHJ2ID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gRFJWX05BTUUsCisJCS5uYW1lID0gImNzNTUzNS1wbXMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG9scGNfeG8xX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChvbHBjX3hvMV9yZW1vdmUpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3M1NTM1X2FjcGlfZHJ2ID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImNzNTUzNS1hY3BpIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUgPSBvbHBjX3hvMV9wcm9iZSwKQEAgLTEyNCwxMiArMTIyLDIzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG9scGNfeG8xX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbHBjX3hvMV9kcml2ZXIpOworCWludCByOworCisJciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY3M1NTM1X3Btc19kcnYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNzNTUzNV9hY3BpX2Rydik7CisJaWYgKHIpCisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjczU1MzVfcG1zX2Rydik7CisKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG9scGNfeG8xX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb2xwY194bzFfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3M1NTM1X2FjcGlfZHJ2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3M1NTM1X3Btc19kcnYpOwogfQogCiBNT0RVTEVfQVVUSE9SKCJEYW5pZWwgRHJha2UgPGRzZEBsYXB0b3Aub3JnPiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX2R0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGNfZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI4NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX2R0LmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBPTFBDLXNwZWNpZmljIE9GVyBkZXZpY2UgdHJlZSBzdXBwb3J0IGNvZGUuCisgKgorICogUGF1bCBNYWNrZXJyYXMJQXVndXN0IDE5OTYuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNSBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiAgQWRhcHRlZCBmb3IgNjRiaXQgUG93ZXJQQyBieSBEYXZlIEVuZ2VicmV0c2VuIGFuZCBQZXRlciBCZXJnbmVyLgorICogICAge2VuZ2VicmV0fGJlcmduZXJ9QHVzLmlibS5jb20KKyAqCisgKiAgQWRhcHRlZCBmb3Igc3BhcmMgYnkgRGF2aWQgUy4gTWlsbGVyIGRhdmVtQGRhdmVtbG9mdC5uZXQKKyAqICBBZGFwdGVkIGZvciB4ODYvT0xQQyBieSBBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BkdC5oPgorI2luY2x1ZGUgPGFzbS9vbHBjX29mdy5oPgorCitzdGF0aWMgcGhhbmRsZSBfX2luaXQgb2xwY19kdF9nZXRzaWJsaW5nKHBoYW5kbGUgbm9kZSkKK3sKKwljb25zdCB2b2lkICphcmdzW10gPSB7ICh2b2lkICopbm9kZSB9OworCXZvaWQgKnJlc1tdID0geyAmbm9kZSB9OworCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2xwY19vZncoInBlZXIiLCBhcmdzLCByZXMpIHx8IChzMzIpbm9kZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHBoYW5kbGUgX19pbml0IG9scGNfZHRfZ2V0Y2hpbGQocGhhbmRsZSBub2RlKQoreworCWNvbnN0IHZvaWQgKmFyZ3NbXSA9IHsgKHZvaWQgKilub2RlIH07CisJdm9pZCAqcmVzW10gPSB7ICZub2RlIH07CisKKwlpZiAoKHMzMilub2RlID09IC0xKQorCQlyZXR1cm4gMDsKKworCWlmIChvbHBjX29mdygiY2hpbGQiLCBhcmdzLCByZXMpIHx8IChzMzIpbm9kZSA9PSAtMSkgeworCQlwcl9lcnIoIlBST006ICVzOiBmZXRjaGluZyBjaGlsZCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBub2RlOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbHBjX2R0X2dldHByb3BsZW4ocGhhbmRsZSBub2RlLCBjb25zdCBjaGFyICpwcm9wKQoreworCWNvbnN0IHZvaWQgKmFyZ3NbXSA9IHsgKHZvaWQgKilub2RlLCBwcm9wIH07CisJaW50IGxlbjsKKwl2b2lkICpyZXNbXSA9IHsgJmxlbiB9OworCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKG9scGNfb2Z3KCJnZXRwcm9wbGVuIiwgYXJncywgcmVzKSkgeworCQlwcl9lcnIoIlBST006ICVzOiBnZXRwcm9wbGVuIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9scGNfZHRfZ2V0cHJvcGVydHkocGhhbmRsZSBub2RlLCBjb25zdCBjaGFyICpwcm9wLAorCQljaGFyICpidWYsIGludCBidWZzaXplKQoreworCWludCBwbGVuOworCisJcGxlbiA9IG9scGNfZHRfZ2V0cHJvcGxlbihub2RlLCBwcm9wKTsKKwlpZiAocGxlbiA+IGJ1ZnNpemUgfHwgcGxlbiA8IDEpIHsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCWNvbnN0IHZvaWQgKmFyZ3NbXSA9IHsgKHZvaWQgKilub2RlLCBwcm9wLCBidWYsICh2b2lkICopcGxlbiB9OworCQl2b2lkICpyZXNbXSA9IHsgJnBsZW4gfTsKKworCQlpZiAob2xwY19vZncoImdldHByb3AiLCBhcmdzLCByZXMpKSB7CisJCQlwcl9lcnIoIlBST006ICVzOiBnZXRwcm9wIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiBwbGVuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbHBjX2R0X25leHRwcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldiwgY2hhciAqYnVmKQoreworCWNvbnN0IHZvaWQgKmFyZ3NbXSA9IHsgKHZvaWQgKilub2RlLCBwcmV2LCBidWYgfTsKKwlpbnQgc3VjY2VzczsKKwl2b2lkICpyZXNbXSA9IHsgJnN1Y2Nlc3MgfTsKKworCWJ1ZlswXSA9ICdcMCc7CisKKwlpZiAoKHMzMilub2RlID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAob2xwY19vZncoIm5leHRwcm9wIiwgYXJncywgcmVzKSB8fCBzdWNjZXNzICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbHBjX2R0X3BrZzJwYXRoKHBoYW5kbGUgbm9kZSwgY2hhciAqYnVmLAorCQljb25zdCBpbnQgYnVmbGVuLCBpbnQgKmxlbikKK3sKKwljb25zdCB2b2lkICphcmdzW10gPSB7ICh2b2lkICopbm9kZSwgYnVmLCAodm9pZCAqKWJ1ZmxlbiB9OworCXZvaWQgKnJlc1tdID0geyBsZW4gfTsKKworCWlmICgoczMyKW5vZGUgPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmIChvbHBjX29mdygicGFja2FnZS10by1wYXRoIiwgYXJncywgcmVzKSB8fCAqbGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvbV9lYXJseV9hbGxvY2F0ZWQgX19pbml0ZGF0YTsKKwordm9pZCAqIF9faW5pdCBwcm9tX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdGF0aWMgdTggKm1lbTsKKwlzdGF0aWMgc2l6ZV90IGZyZWVfbWVtOworCXZvaWQgKnJlczsKKworCWlmIChmcmVlX21lbSA8IHNpemUpIHsKKwkJY29uc3Qgc2l6ZV90IGNodW5rX3NpemUgPSBtYXgoUEFHRV9TSVpFLCBzaXplKTsKKworCQkvKgorCQkgKiBUbyBtaW1pbWl6ZSB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLCBncmFiIGF0IGxlYXN0CisJCSAqIFBBR0VfU0laRSBvZiBtZW1vcnkgKHRoYXQncyBhbiBhcmJpdHJhcnkgY2hvaWNlIHRoYXQncworCQkgKiBmYXN0IGVub3VnaCBvbiB0aGUgcGxhdGZvcm1zIHdlIGNhcmUgYWJvdXQgd2hpbGUgbWluaW1pemluZworCQkgKiB3YXN0ZWQgYm9vdG1lbSkgYW5kIGhhbmQgb2ZmIGNodW5rcyBvZiBpdCB0byBjYWxsZXJzLgorCQkgKi8KKwkJcmVzID0gYWxsb2NfYm9vdG1lbShjaHVua19zaXplKTsKKwkJaWYgKCFyZXMpCisJCQlyZXR1cm4gTlVMTDsKKwkJcHJvbV9lYXJseV9hbGxvY2F0ZWQgKz0gY2h1bmtfc2l6ZTsKKwkJbWVtc2V0KHJlcywgMCwgY2h1bmtfc2l6ZSk7CisJCWZyZWVfbWVtID0gY2h1bmtfc2l6ZTsKKwkJbWVtID0gcmVzOworCX0KKworCS8qIGFsbG9jYXRlIGZyb20gdGhlIGxvY2FsIGNhY2hlICovCisJZnJlZV9tZW0gLT0gc2l6ZTsKKwlyZXMgPSBtZW07CisJbWVtICs9IHNpemU7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBvZl9wZHRfb3BzIHByb21fb2xwY19vcHMgX19pbml0ZGF0YSA9IHsKKwkubmV4dHByb3AgPSBvbHBjX2R0X25leHRwcm9wLAorCS5nZXRwcm9wbGVuID0gb2xwY19kdF9nZXRwcm9wbGVuLAorCS5nZXRwcm9wZXJ0eSA9IG9scGNfZHRfZ2V0cHJvcGVydHksCisJLmdldGNoaWxkID0gb2xwY19kdF9nZXRjaGlsZCwKKwkuZ2V0c2libGluZyA9IG9scGNfZHRfZ2V0c2libGluZywKKwkucGtnMnBhdGggPSBvbHBjX2R0X3BrZzJwYXRoLAorfTsKKwordm9pZCBfX2luaXQgb2xwY19kdF9idWlsZF9kZXZpY2V0cmVlKHZvaWQpCit7CisJcGhhbmRsZSByb290OworCisJaWYgKCFvbHBjX29md19pc19pbnN0YWxsZWQoKSkKKwkJcmV0dXJuOworCisJcm9vdCA9IG9scGNfZHRfZ2V0c2libGluZygwKTsKKwlpZiAoIXJvb3QpIHsKKwkJcHJfZXJyKCJQUk9NOiB1bmFibGUgdG8gZ2V0IHJvb3Qgbm9kZSBmcm9tIE9GVyFcbiIpOworCQlyZXR1cm47CisJfQorCW9mX3BkdF9idWlsZF9kZXZpY2V0cmVlKHJvb3QsICZwcm9tX29scGNfb3BzKTsKKworCXByX2luZm8oIlBST00gRFQ6IEJ1aWx0IGRldmljZSB0cmVlIHdpdGggJXUgYnl0ZXMgb2YgbWVtb3J5LlxuIiwKKwkJCXByb21fZWFybHlfYWxsb2NhdGVkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwY19vZncuYyBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwY19vZncuYwppbmRleCA3ODczMjA0Li5lNzYwNGY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGNfb2Z3LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjX29mdy5jCkBAIC0xMTAsMyArMTEwLDggQEAKIAkJCSh1bnNpZ25lZCBsb25nKW9scGNfb2Z3X2NpZiwgKC1zdGFydCkgPj4gMjApOwogCXJlc2VydmVfdG9wX2FkZHJlc3MoLXN0YXJ0KTsKIH0KKworYm9vbCBfX2luaXQgb2xwY19vZndfaXNfaW5zdGFsbGVkKHZvaWQpCit7CisJcmV0dXJuIG9scGNfb2Z3X2NpZiAhPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL01ha2VmaWxlIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCmluZGV4IDc3OTM4NTEuLjE3YzU2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDggQEAKIAogb2JqLXkJCTo9IGVubGlnaHRlbi5vIHNldHVwLm8gbXVsdGljYWxscy5vIG1tdS5vIGlycS5vIFwKIAkJCXRpbWUubyB4ZW4tYXNtLm8geGVuLWFzbV8kKEJJVFMpLm8gXAotCQkJZ3JhbnQtdGFibGUubyBzdXNwZW5kLm8gcGxhdGZvcm0tcGNpLXVucGx1Zy5vCisJCQlncmFudC10YWJsZS5vIHN1c3BlbmQubyBwbGF0Zm9ybS1wY2ktdW5wbHVnLm8gXAorCQkJcDJtLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSs9IHNwaW5sb2NrLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCBhYThjODlhLi43ZThkM2JjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMTc0LDYgKzExNzQsMTUgQEAKIAogCXhlbl9zbXBfaW5pdCgpOwogCisjaWZkZWYgQ09ORklHX0FDUElfTlVNQQorCS8qCisJICogVGhlIHBhZ2VzIHdlIGZyb20gWGVuIGFyZSBub3QgcmVsYXRlZCB0byBtYWNoaW5lIHBhZ2VzLCBzbworCSAqIGFueSBOVU1BIGluZm9ybWF0aW9uIHRoZSBrZXJuZWwgdHJpZXMgdG8gZ2V0IGZyb20gQUNQSSB3aWxsCisJICogYmUgbWVhbmluZ2xlc3MuICBQcmV2ZW50IGl0IGZyb20gdHJ5aW5nLgorCSAqLworCWFjcGlfbnVtYSA9IC0xOworI2VuZGlmCisKIAlwZ2QgPSAocGdkX3QgKil4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZTsKIAogCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCkBAIC0xMjU2LDI1ICsxMjY1LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdWludDMyX3QgeGVuX2NwdWlkX2Jhc2Uodm9pZCkKLXsKLQl1aW50MzJfdCBiYXNlLCBlYXgsIGVieCwgZWN4LCBlZHg7Ci0JY2hhciBzaWduYXR1cmVbMTNdOwotCi0JZm9yIChiYXNlID0gMHg0MDAwMDAwMDsgYmFzZSA8IDB4NDAwMTAwMDA7IGJhc2UgKz0gMHgxMDApIHsKLQkJY3B1aWQoYmFzZSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgMCkgPSBlYng7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgNCkgPSBlY3g7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgOCkgPSBlZHg7Ci0JCXNpZ25hdHVyZVsxMl0gPSAwOwotCi0JCWlmICghc3RyY21wKCJYZW5WTU1YZW5WTU0iLCBzaWduYXR1cmUpICYmICgoZWF4IC0gYmFzZSkgPj0gMikpCi0JCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbml0X2h2bV9wdl9pbmZvKGludCAqbWFqb3IsIGludCAqbWlub3IpCiB7CiAJdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4LCBwYWdlcywgbXNyLCBiYXNlOwpAQCAtMTM4NCw2ICsxMzc0LDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgeGVuX2h2bV9uZWVkX2xhcGljKHZvaWQpCit7CisJaWYgKHhlbl9wdl9kb21haW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICgheGVuX2h2bV9kb21haW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9waXJxcykgJiYgeGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5faHZtX25lZWRfbGFwaWMpOworCiBjb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bSA9IHsKIAkubmFtZQkJCT0gIlhlbiBIVk0iLAogCS5kZXRlY3QJCQk9IHhlbl9odm1fcGxhdGZvcm0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggNDQ5MjRlNS4uNzU3NWU1NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMTczLDM3MSArMTczLDYgQEAKICAqLwogI2RlZmluZSBVU0VSX0xJTUlUCSgoU1RBQ0tfVE9QX01BWCArIFBHRElSX1NJWkUgLSAxKSAmIFBHRElSX01BU0spCiAKLS8qCi0gKiBYZW4gbGVhdmVzIHRoZSByZXNwb25zaWJpbGl0eSBmb3IgbWFpbnRhaW5pbmcgcDJtIG1hcHBpbmdzIHRvIHRoZQotICogZ3Vlc3RzIHRoZW1zZWx2ZXMsIGJ1dCBpdCBtdXN0IGFsc28gYWNjZXNzIGFuZCB1cGRhdGUgdGhlIHAybSBhcnJheQotICogZHVyaW5nIHN1c3BlbmQvcmVzdW1lIHdoZW4gYWxsIHRoZSBwYWdlcyBhcmUgcmVhbGxvY2F0ZWQuCi0gKgotICogVGhlIHAybSB0YWJsZSBpcyBsb2dpY2FsbHkgYSBmbGF0IGFycmF5LCBidXQgd2UgaW1wbGVtZW50IGl0IGFzIGEKLSAqIHRocmVlLWxldmVsIHRyZWUgdG8gYWxsb3cgdGhlIGFkZHJlc3Mgc3BhY2UgdG8gYmUgc3BhcnNlLgotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICBwMm1fdG9wICAgICAgICAgICAgICBwMm1fdG9wX21mbgotICogICAgICAgLyAgXCAgICAgICAgICAgICAgICAgICAvICAgXAotICogcDJtX21pZCBwMm1fbWlkCXAybV9taWRfbWZuIHAybV9taWRfbWZuCi0gKiAgICAvIFwgICAgICAvIFwgICAgICAgICAvICAgICAgICAgICAvCi0gKiAgcDJtIHAybSBwMm0gcDJtIHAybSBwMm0gcDJtIC4uLgotICoKLSAqIFRoZSBwMm1fbWlkX21mbiBwYWdlcyBhcmUgbWFwcGVkIGJ5IHAybV90b3BfbWZuX3AuCi0gKgotICogVGhlIHAybV90b3AgYW5kIHAybV90b3BfbWZuIGxldmVscyBhcmUgbGltaXRlZCB0byAxIHBhZ2UsIHNvIHRoZQotICogbWF4aW11bSByZXByZXNlbnRhYmxlIHBzZXVkby1waHlzaWNhbCBhZGRyZXNzIHNwYWNlIGlzOgotICogIFAyTV9UT1BfUEVSX1BBR0UgKiBQMk1fTUlEX1BFUl9QQUdFICogUDJNX1BFUl9QQUdFIHBhZ2VzCi0gKgotICogUDJNX1BFUl9QQUdFIGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZSwgYXMgYSBtZm4gaXMgYWx3YXlzCi0gKiB1bnNpZ25lZCBsb25nICg4IGJ5dGVzIG9uIDY0LWJpdCwgNCBieXRlcyBvbiAzMiksIGxlYWRpbmcgdG8KLSAqIDUxMiBhbmQgMTAyNCBlbnRyaWVzIHJlc3BlY3RpdmVseS4gCi0gKi8KLQotdW5zaWduZWQgbG9uZyB4ZW5fbWF4X3AybV9wZm4gX19yZWFkX21vc3RseTsKLQotI2RlZmluZSBQMk1fUEVSX1BBR0UJCShQQUdFX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCi0jZGVmaW5lIFAyTV9NSURfUEVSX1BBR0UJKFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nICopKQotI2RlZmluZSBQMk1fVE9QX1BFUl9QQUdFCShQQUdFX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZyAqKikpCi0KLSNkZWZpbmUgTUFYX1AyTV9QRk4JCShQMk1fVE9QX1BFUl9QQUdFICogUDJNX01JRF9QRVJfUEFHRSAqIFAyTV9QRVJfUEFHRSkKLQotLyogUGxhY2Vob2xkZXJzIGZvciBob2xlcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSAqLwotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcsIHAybV9taXNzaW5nLCBQMk1fUEVSX1BBR0UpOwotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcgKiwgcDJtX21pZF9taXNzaW5nLCBQMk1fTUlEX1BFUl9QQUdFKTsKLXN0YXRpYyBSRVNFUlZFX0JSS19BUlJBWSh1bnNpZ25lZCBsb25nLCBwMm1fbWlkX21pc3NpbmdfbWZuLCBQMk1fTUlEX1BFUl9QQUdFKTsKLQotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcgKiosIHAybV90b3AsIFAyTV9UT1BfUEVSX1BBR0UpOwotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcsIHAybV90b3BfbWZuLCBQMk1fVE9QX1BFUl9QQUdFKTsKLXN0YXRpYyBSRVNFUlZFX0JSS19BUlJBWSh1bnNpZ25lZCBsb25nICosIHAybV90b3BfbWZuX3AsIFAyTV9UT1BfUEVSX1BBR0UpOwotCi1SRVNFUlZFX0JSSyhwMm1fbWlkLCBQQUdFX1NJWkUgKiAoTUFYX0RPTUFJTl9QQUdFUyAvIChQMk1fUEVSX1BBR0UgKiBQMk1fTUlEX1BFUl9QQUdFKSkpOwotUkVTRVJWRV9CUksocDJtX21pZF9tZm4sIFBBR0VfU0laRSAqIChNQVhfRE9NQUlOX1BBR0VTIC8gKFAyTV9QRVJfUEFHRSAqIFAyTV9NSURfUEVSX1BBR0UpKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgcDJtX3RvcF9pbmRleCh1bnNpZ25lZCBsb25nIHBmbikKLXsKLQlCVUdfT04ocGZuID49IE1BWF9QMk1fUEZOKTsKLQlyZXR1cm4gcGZuIC8gKFAyTV9NSURfUEVSX1BBR0UgKiBQMk1fUEVSX1BBR0UpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHAybV9taWRfaW5kZXgodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JcmV0dXJuIChwZm4gLyBQMk1fUEVSX1BBR0UpICUgUDJNX01JRF9QRVJfUEFHRTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBwMm1faW5kZXgodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JcmV0dXJuIHBmbiAlIFAyTV9QRVJfUEFHRTsKLX0KLQotc3RhdGljIHZvaWQgcDJtX3RvcF9pbml0KHVuc2lnbmVkIGxvbmcgKioqdG9wKQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUDJNX1RPUF9QRVJfUEFHRTsgaSsrKQotCQl0b3BbaV0gPSBwMm1fbWlkX21pc3Npbmc7Ci19Ci0KLXN0YXRpYyB2b2lkIHAybV90b3BfbWZuX2luaXQodW5zaWduZWQgbG9uZyAqdG9wKQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUDJNX1RPUF9QRVJfUEFHRTsgaSsrKQotCQl0b3BbaV0gPSB2aXJ0X3RvX21mbihwMm1fbWlkX21pc3NpbmdfbWZuKTsKLX0KLQotc3RhdGljIHZvaWQgcDJtX3RvcF9tZm5fcF9pbml0KHVuc2lnbmVkIGxvbmcgKip0b3ApCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQMk1fVE9QX1BFUl9QQUdFOyBpKyspCi0JCXRvcFtpXSA9IHAybV9taWRfbWlzc2luZ19tZm47Ci19Ci0KLXN0YXRpYyB2b2lkIHAybV9taWRfaW5pdCh1bnNpZ25lZCBsb25nICoqbWlkKQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUDJNX01JRF9QRVJfUEFHRTsgaSsrKQotCQltaWRbaV0gPSBwMm1fbWlzc2luZzsKLX0KLQotc3RhdGljIHZvaWQgcDJtX21pZF9tZm5faW5pdCh1bnNpZ25lZCBsb25nICptaWQpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQMk1fTUlEX1BFUl9QQUdFOyBpKyspCi0JCW1pZFtpXSA9IHZpcnRfdG9fbWZuKHAybV9taXNzaW5nKTsKLX0KLQotc3RhdGljIHZvaWQgcDJtX2luaXQodW5zaWduZWQgbG9uZyAqcDJtKQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUDJNX01JRF9QRVJfUEFHRTsgaSsrKQotCQlwMm1baV0gPSBJTlZBTElEX1AyTV9FTlRSWTsKLX0KLQotLyoKLSAqIEJ1aWxkIHRoZSBwYXJhbGxlbCBwMm1fdG9wX21mbiBhbmQgcDJtX21pZF9tZm4gc3RydWN0dXJlcwotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGJvdGggYXQgYm9vdCB0aW1lLCBhbmQgYWZ0ZXIgcmVzdW1pbmcgZnJvbSBzdXNwZW5kOgotICogLSBBdCBib290IHRpbWUgd2UncmUgY2FsbGVkIHZlcnkgZWFybHksIGFuZCBtdXN0IHVzZSBleHRlbmRfYnJrKCkKLSAqICAgdG8gYWxsb2NhdGUgbWVtb3J5LgotICoKLSAqIC0gQWZ0ZXIgcmVzdW1lIHdlJ3JlIGNhbGxlZCBmcm9tIHdpdGhpbiBzdG9wX21hY2hpbmUsIGJ1dCB0aGUgbWZuCi0gKiAgIHRyZWUgc2hvdWxkIGFscmVheSBiZSBjb21wbGV0ZWx5IGFsbG9jYXRlZC4KLSAqLwotdm9pZCB4ZW5fYnVpbGRfbWZuX2xpc3RfbGlzdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcGZuOwotCi0JLyogUHJlLWluaXRpYWxpemUgcDJtX3RvcF9tZm4gdG8gYmUgY29tcGxldGVseSBtaXNzaW5nICovCi0JaWYgKHAybV90b3BfbWZuID09IE5VTEwpIHsKLQkJcDJtX21pZF9taXNzaW5nX21mbiA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwotCQlwMm1fbWlkX21mbl9pbml0KHAybV9taWRfbWlzc2luZ19tZm4pOwotCi0JCXAybV90b3BfbWZuX3AgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKLQkJcDJtX3RvcF9tZm5fcF9pbml0KHAybV90b3BfbWZuX3ApOwotCi0JCXAybV90b3BfbWZuID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0JCXAybV90b3BfbWZuX2luaXQocDJtX3RvcF9tZm4pOwotCX0gZWxzZSB7Ci0JCS8qIFJlaW5pdGlhbGlzZSwgbWZuJ3MgYWxsIGNoYW5nZSBhZnRlciBtaWdyYXRpb24gKi8KLQkJcDJtX21pZF9tZm5faW5pdChwMm1fbWlkX21pc3NpbmdfbWZuKTsKLQl9Ci0KLQlmb3IgKHBmbiA9IDA7IHBmbiA8IHhlbl9tYXhfcDJtX3BmbjsgcGZuICs9IFAyTV9QRVJfUEFHRSkgewotCQl1bnNpZ25lZCB0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7Ci0JCXVuc2lnbmVkIG1pZGlkeCA9IHAybV9taWRfaW5kZXgocGZuKTsKLQkJdW5zaWduZWQgbG9uZyAqKm1pZDsKLQkJdW5zaWduZWQgbG9uZyAqbWlkX21mbl9wOwotCi0JCW1pZCA9IHAybV90b3BbdG9waWR4XTsKLQkJbWlkX21mbl9wID0gcDJtX3RvcF9tZm5fcFt0b3BpZHhdOwotCi0JCS8qIERvbid0IGJvdGhlciBhbGxvY2F0aW5nIGFueSBtZm4gbWlkIGxldmVscyBpZgotCQkgKiB0aGV5J3JlIGp1c3QgbWlzc2luZywganVzdCB1cGRhdGUgdGhlIHN0b3JlZCBtZm4sCi0JCSAqIHNpbmNlIGFsbCBjb3VsZCBoYXZlIGNoYW5nZWQgb3ZlciBhIG1pZ3JhdGUuCi0JCSAqLwotCQlpZiAobWlkID09IHAybV9taWRfbWlzc2luZykgewotCQkJQlVHX09OKG1pZGlkeCk7Ci0JCQlCVUdfT04obWlkX21mbl9wICE9IHAybV9taWRfbWlzc2luZ19tZm4pOwotCQkJcDJtX3RvcF9tZm5bdG9waWR4XSA9IHZpcnRfdG9fbWZuKHAybV9taWRfbWlzc2luZ19tZm4pOwotCQkJcGZuICs9IChQMk1fTUlEX1BFUl9QQUdFIC0gMSkgKiBQMk1fUEVSX1BBR0U7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChtaWRfbWZuX3AgPT0gcDJtX21pZF9taXNzaW5nX21mbikgewotCQkJLyoKLQkJCSAqIFhYWCBib290LXRpbWUgb25seSEgIFdlIHNob3VsZCBuZXZlciBmaW5kCi0JCQkgKiBtaXNzaW5nIHBhcnRzIG9mIHRoZSBtZm4gdHJlZSBhZnRlcgotCQkJICogcnVudGltZS4gIGV4dGVuZF9icmsoKSB3aWxsIEJVRyBpZiB3ZSBjYWxsCi0JCQkgKiBpdCB0b28gbGF0ZS4KLQkJCSAqLwotCQkJbWlkX21mbl9wID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0JCQlwMm1fbWlkX21mbl9pbml0KG1pZF9tZm5fcCk7Ci0KLQkJCXAybV90b3BfbWZuX3BbdG9waWR4XSA9IG1pZF9tZm5fcDsKLQkJfQotCi0JCXAybV90b3BfbWZuW3RvcGlkeF0gPSB2aXJ0X3RvX21mbihtaWRfbWZuX3ApOwotCQltaWRfbWZuX3BbbWlkaWR4XSA9IHZpcnRfdG9fbWZuKG1pZFttaWRpZHhdKTsKLQl9Ci19Ci0KLXZvaWQgeGVuX3NldHVwX21mbl9saXN0X2xpc3Qodm9pZCkKLXsKLQlCVUdfT04oSFlQRVJWSVNPUl9zaGFyZWRfaW5mbyA9PSAmeGVuX2R1bW15X3NoYXJlZF9pbmZvKTsKLQotCUhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPmFyY2gucGZuX3RvX21mbl9mcmFtZV9saXN0X2xpc3QgPQotCQl2aXJ0X3RvX21mbihwMm1fdG9wX21mbik7Ci0JSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+YXJjaC5tYXhfcGZuID0geGVuX21heF9wMm1fcGZuOwotfQotCi0vKiBTZXQgdXAgcDJtX3RvcCB0byBwb2ludCB0byB0aGUgZG9tYWluLWJ1aWxkZXIgcHJvdmlkZWQgcDJtIHBhZ2VzICovCi12b2lkIF9faW5pdCB4ZW5fYnVpbGRfZHluYW1pY19waHlzX3RvX21hY2hpbmUodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nICptZm5fbGlzdCA9ICh1bnNpZ25lZCBsb25nICopeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0OwotCXVuc2lnbmVkIGxvbmcgbWF4X3BmbiA9IG1pbihNQVhfRE9NQUlOX1BBR0VTLCB4ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMpOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCi0JeGVuX21heF9wMm1fcGZuID0gbWF4X3BmbjsKLQotCXAybV9taXNzaW5nID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0JcDJtX2luaXQocDJtX21pc3NpbmcpOwotCi0JcDJtX21pZF9taXNzaW5nID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0JcDJtX21pZF9pbml0KHAybV9taWRfbWlzc2luZyk7Ci0KLQlwMm1fdG9wID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0JcDJtX3RvcF9pbml0KHAybV90b3ApOwotCi0JLyoKLQkgKiBUaGUgZG9tYWluIGJ1aWxkZXIgZ2l2ZXMgdXMgYSBwcmUtY29uc3RydWN0ZWQgcDJtIGFycmF5IGluCi0JICogbWZuX2xpc3QgZm9yIGFsbCB0aGUgcGFnZXMgaW5pdGlhbGx5IGdpdmVuIHRvIHVzLCBzbyB3ZSBqdXN0Ci0JICogbmVlZCB0byBncmFmdCB0aGF0IGludG8gb3VyIHRyZWUgc3RydWN0dXJlLgotCSAqLwotCWZvciAocGZuID0gMDsgcGZuIDwgbWF4X3BmbjsgcGZuICs9IFAyTV9QRVJfUEFHRSkgewotCQl1bnNpZ25lZCB0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7Ci0JCXVuc2lnbmVkIG1pZGlkeCA9IHAybV9taWRfaW5kZXgocGZuKTsKLQotCQlpZiAocDJtX3RvcFt0b3BpZHhdID09IHAybV9taWRfbWlzc2luZykgewotCQkJdW5zaWduZWQgbG9uZyAqKm1pZCA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwotCQkJcDJtX21pZF9pbml0KG1pZCk7Ci0KLQkJCXAybV90b3BbdG9waWR4XSA9IG1pZDsKLQkJfQotCi0JCXAybV90b3BbdG9waWR4XVttaWRpZHhdID0gJm1mbl9saXN0W3Bmbl07Ci0JfQotfQotCi11bnNpZ25lZCBsb25nIGdldF9waHlzX3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JdW5zaWduZWQgdG9waWR4LCBtaWRpZHgsIGlkeDsKLQotCWlmICh1bmxpa2VseShwZm4gPj0gTUFYX1AyTV9QRk4pKQotCQlyZXR1cm4gSU5WQUxJRF9QMk1fRU5UUlk7Ci0KLQl0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7Ci0JbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOwotCWlkeCA9IHAybV9pbmRleChwZm4pOwotCi0JcmV0dXJuIHAybV90b3BbdG9waWR4XVttaWRpZHhdW2lkeF07Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChnZXRfcGh5c190b19tYWNoaW5lKTsKLQotc3RhdGljIHZvaWQgKmFsbG9jX3AybV9wYWdlKHZvaWQpCi17Ci0JcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX3AybV9wYWdlKHZvaWQgKnApCi17Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOwotfQotCi0vKiAKLSAqIEZ1bGx5IGFsbG9jYXRlIHRoZSBwMm0gc3RydWN0dXJlIGZvciBhIGdpdmVuIHBmbi4gIFdlIG5lZWQgdG8gY2hlY2sKLSAqIHRoYXQgYm90aCB0aGUgdG9wIGFuZCBtaWQgbGV2ZWxzIGFyZSBhbGxvY2F0ZWQsIGFuZCBtYWtlIHN1cmUgdGhlCi0gKiBwYXJhbGxlbCBtZm4gdHJlZSBpcyBrZXB0IGluIHN5bmMuICBXZSBtYXkgcmFjZSB3aXRoIG90aGVyIGNwdXMsIHNvCi0gKiB0aGUgbmV3IHBhZ2VzIGFyZSBpbnN0YWxsZWQgd2l0aCBjbXB4Y2hnOyBpZiB3ZSBsb3NlIHRoZSByYWNlIHRoZW4KLSAqIHNpbXBseSBmcmVlIHRoZSBwYWdlIHdlIGFsbG9jYXRlZCBhbmQgdXNlIHRoZSBvbmUgdGhhdCdzIHRoZXJlLgotICovCi1zdGF0aWMgYm9vbCBhbGxvY19wMm0odW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JdW5zaWduZWQgdG9waWR4LCBtaWRpZHg7Ci0JdW5zaWduZWQgbG9uZyAqKip0b3BfcCwgKiptaWQ7Ci0JdW5zaWduZWQgbG9uZyAqdG9wX21mbl9wLCAqbWlkX21mbjsKLQotCXRvcGlkeCA9IHAybV90b3BfaW5kZXgocGZuKTsKLQltaWRpZHggPSBwMm1fbWlkX2luZGV4KHBmbik7Ci0KLQl0b3BfcCA9ICZwMm1fdG9wW3RvcGlkeF07Ci0JbWlkID0gKnRvcF9wOwotCi0JaWYgKG1pZCA9PSBwMm1fbWlkX21pc3NpbmcpIHsKLQkJLyogTWlkIGxldmVsIGlzIG1pc3NpbmcsIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotCQltaWQgPSBhbGxvY19wMm1fcGFnZSgpOwotCQlpZiAoIW1pZCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlwMm1fbWlkX2luaXQobWlkKTsKLQotCQlpZiAoY21weGNoZyh0b3BfcCwgcDJtX21pZF9taXNzaW5nLCBtaWQpICE9IHAybV9taWRfbWlzc2luZykKLQkJCWZyZWVfcDJtX3BhZ2UobWlkKTsKLQl9Ci0KLQl0b3BfbWZuX3AgPSAmcDJtX3RvcF9tZm5bdG9waWR4XTsKLQltaWRfbWZuID0gcDJtX3RvcF9tZm5fcFt0b3BpZHhdOwotCi0JQlVHX09OKHZpcnRfdG9fbWZuKG1pZF9tZm4pICE9ICp0b3BfbWZuX3ApOwotCi0JaWYgKG1pZF9tZm4gPT0gcDJtX21pZF9taXNzaW5nX21mbikgewotCQkvKiBTZXBhcmF0ZWx5IGNoZWNrIHRoZSBtaWQgbWZuIGxldmVsICovCi0JCXVuc2lnbmVkIGxvbmcgbWlzc2luZ19tZm47Ci0JCXVuc2lnbmVkIGxvbmcgbWlkX21mbl9tZm47Ci0KLQkJbWlkX21mbiA9IGFsbG9jX3AybV9wYWdlKCk7Ci0JCWlmICghbWlkX21mbikKLQkJCXJldHVybiBmYWxzZTsKLQotCQlwMm1fbWlkX21mbl9pbml0KG1pZF9tZm4pOwotCi0JCW1pc3NpbmdfbWZuID0gdmlydF90b19tZm4ocDJtX21pZF9taXNzaW5nX21mbik7Ci0JCW1pZF9tZm5fbWZuID0gdmlydF90b19tZm4obWlkX21mbik7Ci0JCWlmIChjbXB4Y2hnKHRvcF9tZm5fcCwgbWlzc2luZ19tZm4sIG1pZF9tZm5fbWZuKSAhPSBtaXNzaW5nX21mbikKLQkJCWZyZWVfcDJtX3BhZ2UobWlkX21mbik7Ci0JCWVsc2UKLQkJCXAybV90b3BfbWZuX3BbdG9waWR4XSA9IG1pZF9tZm47Ci0JfQotCi0JaWYgKHAybV90b3BbdG9waWR4XVttaWRpZHhdID09IHAybV9taXNzaW5nKSB7Ci0JCS8qIHAybSBsZWFmIHBhZ2UgaXMgbWlzc2luZyAqLwotCQl1bnNpZ25lZCBsb25nICpwMm07Ci0KLQkJcDJtID0gYWxsb2NfcDJtX3BhZ2UoKTsKLQkJaWYgKCFwMm0pCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcDJtX2luaXQocDJtKTsKLQotCQlpZiAoY21weGNoZygmbWlkW21pZGlkeF0sIHAybV9taXNzaW5nLCBwMm0pICE9IHAybV9taXNzaW5nKQotCQkJZnJlZV9wMm1fcGFnZShwMm0pOwotCQllbHNlCi0JCQltaWRfbWZuW21pZGlkeF0gPSB2aXJ0X3RvX21mbihwMm0pOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi0vKiBUcnkgdG8gaW5zdGFsbCBwMm0gbWFwcGluZzsgZmFpbCBpZiBpbnRlcm1lZGlhdGUgYml0cyBtaXNzaW5nICovCi1ib29sIF9fc2V0X3BoeXNfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBtZm4pCi17Ci0JdW5zaWduZWQgdG9waWR4LCBtaWRpZHgsIGlkeDsKLQotCWlmICh1bmxpa2VseShwZm4gPj0gTUFYX1AyTV9QRk4pKSB7Ci0JCUJVR19PTihtZm4gIT0gSU5WQUxJRF9QMk1fRU5UUlkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7Ci0JbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOwotCWlkeCA9IHAybV9pbmRleChwZm4pOwotCi0JaWYgKHAybV90b3BbdG9waWR4XVttaWRpZHhdID09IHAybV9taXNzaW5nKQotCQlyZXR1cm4gbWZuID09IElOVkFMSURfUDJNX0VOVFJZOwotCi0JcDJtX3RvcFt0b3BpZHhdW21pZGlkeF1baWR4XSA9IG1mbjsKLQotCXJldHVybiB0cnVlOwotfQotCi1ib29sIHNldF9waHlzX3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbWZuKQotewotCWlmICh1bmxpa2VseSh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkpIHsKLQkJQlVHX09OKHBmbiAhPSBtZm4gJiYgbWZuICE9IElOVkFMSURfUDJNX0VOVFJZKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCFfX3NldF9waHlzX3RvX21hY2hpbmUocGZuLCBtZm4pKSkgIHsKLQkJaWYgKCFhbGxvY19wMm0ocGZuKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIV9fc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIG1mbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgYXJiaXRyYXJ5X3ZpcnRfdG9fbWZuKHZvaWQgKnZhZGRyKQogewogCXhtYWRkcl90IG1hZGRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSh2YWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vcDJtLmMgYi9hcmNoL3g4Ni94ZW4vcDJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyMjUxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3hlbi9wMm0uYwpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqIFhlbiBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IGZvciBtYWludGFpbmluZyBwMm0gbWFwcGluZ3MgdG8gdGhlCisgKiBndWVzdHMgdGhlbXNlbHZlcywgYnV0IGl0IG11c3QgYWxzbyBhY2Nlc3MgYW5kIHVwZGF0ZSB0aGUgcDJtIGFycmF5CisgKiBkdXJpbmcgc3VzcGVuZC9yZXN1bWUgd2hlbiBhbGwgdGhlIHBhZ2VzIGFyZSByZWFsbG9jYXRlZC4KKyAqCisgKiBUaGUgcDJtIHRhYmxlIGlzIGxvZ2ljYWxseSBhIGZsYXQgYXJyYXksIGJ1dCB3ZSBpbXBsZW1lbnQgaXQgYXMgYQorICogdGhyZWUtbGV2ZWwgdHJlZSB0byBhbGxvdyB0aGUgYWRkcmVzcyBzcGFjZSB0byBiZSBzcGFyc2UuCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIHAybV90b3AgICAgICAgICAgICAgIHAybV90b3BfbWZuCisgKiAgICAgICAvICBcICAgICAgICAgICAgICAgICAgIC8gICBcCisgKiBwMm1fbWlkIHAybV9taWQJcDJtX21pZF9tZm4gcDJtX21pZF9tZm4KKyAqICAgIC8gXCAgICAgIC8gXCAgICAgICAgIC8gICAgICAgICAgIC8KKyAqICBwMm0gcDJtIHAybSBwMm0gcDJtIHAybSBwMm0gLi4uCisgKgorICogVGhlIHAybV9taWRfbWZuIHBhZ2VzIGFyZSBtYXBwZWQgYnkgcDJtX3RvcF9tZm5fcC4KKyAqCisgKiBUaGUgcDJtX3RvcCBhbmQgcDJtX3RvcF9tZm4gbGV2ZWxzIGFyZSBsaW1pdGVkIHRvIDEgcGFnZSwgc28gdGhlCisgKiBtYXhpbXVtIHJlcHJlc2VudGFibGUgcHNldWRvLXBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaXM6CisgKiAgUDJNX1RPUF9QRVJfUEFHRSAqIFAyTV9NSURfUEVSX1BBR0UgKiBQMk1fUEVSX1BBR0UgcGFnZXMKKyAqCisgKiBQMk1fUEVSX1BBR0UgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBhcyBhIG1mbiBpcyBhbHdheXMKKyAqIHVuc2lnbmVkIGxvbmcgKDggYnl0ZXMgb24gNjQtYml0LCA0IGJ5dGVzIG9uIDMyKSwgbGVhZGluZyB0bworICogNTEyIGFuZCAxMDI0IGVudHJpZXMgcmVzcGVjdGl2ZWx5LiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8YXNtL3hlbi9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworI2luY2x1ZGUgInhlbi1vcHMuaCIKKworc3RhdGljIHZvaWQgX19pbml0IG0ycF9vdmVycmlkZV9pbml0KHZvaWQpOworCit1bnNpZ25lZCBsb25nIHhlbl9tYXhfcDJtX3BmbiBfX3JlYWRfbW9zdGx5OworCisjZGVmaW5lIFAyTV9QRVJfUEFHRQkJKFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNkZWZpbmUgUDJNX01JRF9QRVJfUEFHRQkoUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgKikpCisjZGVmaW5lIFAyTV9UT1BfUEVSX1BBR0UJKFBBR0VfU0laRSAvIHNpemVvZih1bnNpZ25lZCBsb25nICoqKSkKKworI2RlZmluZSBNQVhfUDJNX1BGTgkJKFAyTV9UT1BfUEVSX1BBR0UgKiBQMk1fTUlEX1BFUl9QQUdFICogUDJNX1BFUl9QQUdFKQorCisvKiBQbGFjZWhvbGRlcnMgZm9yIGhvbGVzIGluIHRoZSBhZGRyZXNzIHNwYWNlICovCitzdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkodW5zaWduZWQgbG9uZywgcDJtX21pc3NpbmcsIFAyTV9QRVJfUEFHRSk7CitzdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkodW5zaWduZWQgbG9uZyAqLCBwMm1fbWlkX21pc3NpbmcsIFAyTV9NSURfUEVSX1BBR0UpOworc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcsIHAybV9taWRfbWlzc2luZ19tZm4sIFAyTV9NSURfUEVSX1BBR0UpOworCitzdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkodW5zaWduZWQgbG9uZyAqKiwgcDJtX3RvcCwgUDJNX1RPUF9QRVJfUEFHRSk7CitzdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkodW5zaWduZWQgbG9uZywgcDJtX3RvcF9tZm4sIFAyTV9UT1BfUEVSX1BBR0UpOworc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHVuc2lnbmVkIGxvbmcgKiwgcDJtX3RvcF9tZm5fcCwgUDJNX1RPUF9QRVJfUEFHRSk7CisKK1JFU0VSVkVfQlJLKHAybV9taWQsIFBBR0VfU0laRSAqIChNQVhfRE9NQUlOX1BBR0VTIC8gKFAyTV9QRVJfUEFHRSAqIFAyTV9NSURfUEVSX1BBR0UpKSk7CitSRVNFUlZFX0JSSyhwMm1fbWlkX21mbiwgUEFHRV9TSVpFICogKE1BWF9ET01BSU5fUEFHRVMgLyAoUDJNX1BFUl9QQUdFICogUDJNX01JRF9QRVJfUEFHRSkpKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBwMm1fdG9wX2luZGV4KHVuc2lnbmVkIGxvbmcgcGZuKQoreworCUJVR19PTihwZm4gPj0gTUFYX1AyTV9QRk4pOworCXJldHVybiBwZm4gLyAoUDJNX01JRF9QRVJfUEFHRSAqIFAyTV9QRVJfUEFHRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcDJtX21pZF9pbmRleCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gKHBmbiAvIFAyTV9QRVJfUEFHRSkgJSBQMk1fTUlEX1BFUl9QQUdFOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHAybV9pbmRleCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gcGZuICUgUDJNX1BFUl9QQUdFOworfQorCitzdGF0aWMgdm9pZCBwMm1fdG9wX2luaXQodW5zaWduZWQgbG9uZyAqKip0b3ApCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQMk1fVE9QX1BFUl9QQUdFOyBpKyspCisJCXRvcFtpXSA9IHAybV9taWRfbWlzc2luZzsKK30KKworc3RhdGljIHZvaWQgcDJtX3RvcF9tZm5faW5pdCh1bnNpZ25lZCBsb25nICp0b3ApCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQMk1fVE9QX1BFUl9QQUdFOyBpKyspCisJCXRvcFtpXSA9IHZpcnRfdG9fbWZuKHAybV9taWRfbWlzc2luZ19tZm4pOworfQorCitzdGF0aWMgdm9pZCBwMm1fdG9wX21mbl9wX2luaXQodW5zaWduZWQgbG9uZyAqKnRvcCkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IFAyTV9UT1BfUEVSX1BBR0U7IGkrKykKKwkJdG9wW2ldID0gcDJtX21pZF9taXNzaW5nX21mbjsKK30KKworc3RhdGljIHZvaWQgcDJtX21pZF9pbml0KHVuc2lnbmVkIGxvbmcgKiptaWQpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQMk1fTUlEX1BFUl9QQUdFOyBpKyspCisJCW1pZFtpXSA9IHAybV9taXNzaW5nOworfQorCitzdGF0aWMgdm9pZCBwMm1fbWlkX21mbl9pbml0KHVuc2lnbmVkIGxvbmcgKm1pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IFAyTV9NSURfUEVSX1BBR0U7IGkrKykKKwkJbWlkW2ldID0gdmlydF90b19tZm4ocDJtX21pc3NpbmcpOworfQorCitzdGF0aWMgdm9pZCBwMm1faW5pdCh1bnNpZ25lZCBsb25nICpwMm0pCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQMk1fTUlEX1BFUl9QQUdFOyBpKyspCisJCXAybVtpXSA9IElOVkFMSURfUDJNX0VOVFJZOworfQorCisvKgorICogQnVpbGQgdGhlIHBhcmFsbGVsIHAybV90b3BfbWZuIGFuZCBwMm1fbWlkX21mbiBzdHJ1Y3R1cmVzCisgKgorICogVGhpcyBpcyBjYWxsZWQgYm90aCBhdCBib290IHRpbWUsIGFuZCBhZnRlciByZXN1bWluZyBmcm9tIHN1c3BlbmQ6CisgKiAtIEF0IGJvb3QgdGltZSB3ZSdyZSBjYWxsZWQgdmVyeSBlYXJseSwgYW5kIG11c3QgdXNlIGV4dGVuZF9icmsoKQorICogICB0byBhbGxvY2F0ZSBtZW1vcnkuCisgKgorICogLSBBZnRlciByZXN1bWUgd2UncmUgY2FsbGVkIGZyb20gd2l0aGluIHN0b3BfbWFjaGluZSwgYnV0IHRoZSBtZm4KKyAqICAgdHJlZSBzaG91bGQgYWxyZWF5IGJlIGNvbXBsZXRlbHkgYWxsb2NhdGVkLgorICovCit2b2lkIHhlbl9idWlsZF9tZm5fbGlzdF9saXN0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwkvKiBQcmUtaW5pdGlhbGl6ZSBwMm1fdG9wX21mbiB0byBiZSBjb21wbGV0ZWx5IG1pc3NpbmcgKi8KKwlpZiAocDJtX3RvcF9tZm4gPT0gTlVMTCkgeworCQlwMm1fbWlkX21pc3NpbmdfbWZuID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJCXAybV9taWRfbWZuX2luaXQocDJtX21pZF9taXNzaW5nX21mbik7CisKKwkJcDJtX3RvcF9tZm5fcCA9IGV4dGVuZF9icmsoUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQlwMm1fdG9wX21mbl9wX2luaXQocDJtX3RvcF9tZm5fcCk7CisKKwkJcDJtX3RvcF9tZm4gPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwkJcDJtX3RvcF9tZm5faW5pdChwMm1fdG9wX21mbik7CisJfSBlbHNlIHsKKwkJLyogUmVpbml0aWFsaXNlLCBtZm4ncyBhbGwgY2hhbmdlIGFmdGVyIG1pZ3JhdGlvbiAqLworCQlwMm1fbWlkX21mbl9pbml0KHAybV9taWRfbWlzc2luZ19tZm4pOworCX0KKworCWZvciAocGZuID0gMDsgcGZuIDwgeGVuX21heF9wMm1fcGZuOyBwZm4gKz0gUDJNX1BFUl9QQUdFKSB7CisJCXVuc2lnbmVkIHRvcGlkeCA9IHAybV90b3BfaW5kZXgocGZuKTsKKwkJdW5zaWduZWQgbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOworCQl1bnNpZ25lZCBsb25nICoqbWlkOworCQl1bnNpZ25lZCBsb25nICptaWRfbWZuX3A7CisKKwkJbWlkID0gcDJtX3RvcFt0b3BpZHhdOworCQltaWRfbWZuX3AgPSBwMm1fdG9wX21mbl9wW3RvcGlkeF07CisKKwkJLyogRG9uJ3QgYm90aGVyIGFsbG9jYXRpbmcgYW55IG1mbiBtaWQgbGV2ZWxzIGlmCisJCSAqIHRoZXkncmUganVzdCBtaXNzaW5nLCBqdXN0IHVwZGF0ZSB0aGUgc3RvcmVkIG1mbiwKKwkJICogc2luY2UgYWxsIGNvdWxkIGhhdmUgY2hhbmdlZCBvdmVyIGEgbWlncmF0ZS4KKwkJICovCisJCWlmIChtaWQgPT0gcDJtX21pZF9taXNzaW5nKSB7CisJCQlCVUdfT04obWlkaWR4KTsKKwkJCUJVR19PTihtaWRfbWZuX3AgIT0gcDJtX21pZF9taXNzaW5nX21mbik7CisJCQlwMm1fdG9wX21mblt0b3BpZHhdID0gdmlydF90b19tZm4ocDJtX21pZF9taXNzaW5nX21mbik7CisJCQlwZm4gKz0gKFAyTV9NSURfUEVSX1BBR0UgLSAxKSAqIFAyTV9QRVJfUEFHRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1pZF9tZm5fcCA9PSBwMm1fbWlkX21pc3NpbmdfbWZuKSB7CisJCQkvKgorCQkJICogWFhYIGJvb3QtdGltZSBvbmx5ISAgV2Ugc2hvdWxkIG5ldmVyIGZpbmQKKwkJCSAqIG1pc3NpbmcgcGFydHMgb2YgdGhlIG1mbiB0cmVlIGFmdGVyCisJCQkgKiBydW50aW1lLiAgZXh0ZW5kX2JyaygpIHdpbGwgQlVHIGlmIHdlIGNhbGwKKwkJCSAqIGl0IHRvbyBsYXRlLgorCQkJICovCisJCQltaWRfbWZuX3AgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwkJCXAybV9taWRfbWZuX2luaXQobWlkX21mbl9wKTsKKworCQkJcDJtX3RvcF9tZm5fcFt0b3BpZHhdID0gbWlkX21mbl9wOworCQl9CisKKwkJcDJtX3RvcF9tZm5bdG9waWR4XSA9IHZpcnRfdG9fbWZuKG1pZF9tZm5fcCk7CisJCW1pZF9tZm5fcFttaWRpZHhdID0gdmlydF90b19tZm4obWlkW21pZGlkeF0pOworCX0KK30KKwordm9pZCB4ZW5fc2V0dXBfbWZuX2xpc3RfbGlzdCh2b2lkKQoreworCUJVR19PTihIWVBFUlZJU09SX3NoYXJlZF9pbmZvID09ICZ4ZW5fZHVtbXlfc2hhcmVkX2luZm8pOworCisJSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+YXJjaC5wZm5fdG9fbWZuX2ZyYW1lX2xpc3RfbGlzdCA9CisJCXZpcnRfdG9fbWZuKHAybV90b3BfbWZuKTsKKwlIWVBFUlZJU09SX3NoYXJlZF9pbmZvLT5hcmNoLm1heF9wZm4gPSB4ZW5fbWF4X3AybV9wZm47Cit9CisKKy8qIFNldCB1cCBwMm1fdG9wIHRvIHBvaW50IHRvIHRoZSBkb21haW4tYnVpbGRlciBwcm92aWRlZCBwMm0gcGFnZXMgKi8KK3ZvaWQgX19pbml0IHhlbl9idWlsZF9keW5hbWljX3BoeXNfdG9fbWFjaGluZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgKm1mbl9saXN0ID0gKHVuc2lnbmVkIGxvbmcgKil4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3Q7CisJdW5zaWduZWQgbG9uZyBtYXhfcGZuID0gbWluKE1BWF9ET01BSU5fUEFHRVMsIHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcyk7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwl4ZW5fbWF4X3AybV9wZm4gPSBtYXhfcGZuOworCisJcDJtX21pc3NpbmcgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwlwMm1faW5pdChwMm1fbWlzc2luZyk7CisKKwlwMm1fbWlkX21pc3NpbmcgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwlwMm1fbWlkX2luaXQocDJtX21pZF9taXNzaW5nKTsKKworCXAybV90b3AgPSBleHRlbmRfYnJrKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKwlwMm1fdG9wX2luaXQocDJtX3RvcCk7CisKKwkvKgorCSAqIFRoZSBkb21haW4gYnVpbGRlciBnaXZlcyB1cyBhIHByZS1jb25zdHJ1Y3RlZCBwMm0gYXJyYXkgaW4KKwkgKiBtZm5fbGlzdCBmb3IgYWxsIHRoZSBwYWdlcyBpbml0aWFsbHkgZ2l2ZW4gdG8gdXMsIHNvIHdlIGp1c3QKKwkgKiBuZWVkIHRvIGdyYWZ0IHRoYXQgaW50byBvdXIgdHJlZSBzdHJ1Y3R1cmUuCisJICovCisJZm9yIChwZm4gPSAwOyBwZm4gPCBtYXhfcGZuOyBwZm4gKz0gUDJNX1BFUl9QQUdFKSB7CisJCXVuc2lnbmVkIHRvcGlkeCA9IHAybV90b3BfaW5kZXgocGZuKTsKKwkJdW5zaWduZWQgbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOworCisJCWlmIChwMm1fdG9wW3RvcGlkeF0gPT0gcDJtX21pZF9taXNzaW5nKSB7CisJCQl1bnNpZ25lZCBsb25nICoqbWlkID0gZXh0ZW5kX2JyayhQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisJCQlwMm1fbWlkX2luaXQobWlkKTsKKworCQkJcDJtX3RvcFt0b3BpZHhdID0gbWlkOworCQl9CisKKwkJcDJtX3RvcFt0b3BpZHhdW21pZGlkeF0gPSAmbWZuX2xpc3RbcGZuXTsKKwl9CisKKwltMnBfb3ZlcnJpZGVfaW5pdCgpOworfQorCit1bnNpZ25lZCBsb25nIGdldF9waHlzX3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4pCit7CisJdW5zaWduZWQgdG9waWR4LCBtaWRpZHgsIGlkeDsKKworCWlmICh1bmxpa2VseShwZm4gPj0gTUFYX1AyTV9QRk4pKQorCQlyZXR1cm4gSU5WQUxJRF9QMk1fRU5UUlk7CisKKwl0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7CisJbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOworCWlkeCA9IHAybV9pbmRleChwZm4pOworCisJcmV0dXJuIHAybV90b3BbdG9waWR4XVttaWRpZHhdW2lkeF07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZXRfcGh5c190b19tYWNoaW5lKTsKKworc3RhdGljIHZvaWQgKmFsbG9jX3AybV9wYWdlKHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3AybV9wYWdlKHZvaWQgKnApCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXApOworfQorCisvKiAKKyAqIEZ1bGx5IGFsbG9jYXRlIHRoZSBwMm0gc3RydWN0dXJlIGZvciBhIGdpdmVuIHBmbi4gIFdlIG5lZWQgdG8gY2hlY2sKKyAqIHRoYXQgYm90aCB0aGUgdG9wIGFuZCBtaWQgbGV2ZWxzIGFyZSBhbGxvY2F0ZWQsIGFuZCBtYWtlIHN1cmUgdGhlCisgKiBwYXJhbGxlbCBtZm4gdHJlZSBpcyBrZXB0IGluIHN5bmMuICBXZSBtYXkgcmFjZSB3aXRoIG90aGVyIGNwdXMsIHNvCisgKiB0aGUgbmV3IHBhZ2VzIGFyZSBpbnN0YWxsZWQgd2l0aCBjbXB4Y2hnOyBpZiB3ZSBsb3NlIHRoZSByYWNlIHRoZW4KKyAqIHNpbXBseSBmcmVlIHRoZSBwYWdlIHdlIGFsbG9jYXRlZCBhbmQgdXNlIHRoZSBvbmUgdGhhdCdzIHRoZXJlLgorICovCitzdGF0aWMgYm9vbCBhbGxvY19wMm0odW5zaWduZWQgbG9uZyBwZm4pCit7CisJdW5zaWduZWQgdG9waWR4LCBtaWRpZHg7CisJdW5zaWduZWQgbG9uZyAqKip0b3BfcCwgKiptaWQ7CisJdW5zaWduZWQgbG9uZyAqdG9wX21mbl9wLCAqbWlkX21mbjsKKworCXRvcGlkeCA9IHAybV90b3BfaW5kZXgocGZuKTsKKwltaWRpZHggPSBwMm1fbWlkX2luZGV4KHBmbik7CisKKwl0b3BfcCA9ICZwMm1fdG9wW3RvcGlkeF07CisJbWlkID0gKnRvcF9wOworCisJaWYgKG1pZCA9PSBwMm1fbWlkX21pc3NpbmcpIHsKKwkJLyogTWlkIGxldmVsIGlzIG1pc3NpbmcsIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQltaWQgPSBhbGxvY19wMm1fcGFnZSgpOworCQlpZiAoIW1pZCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlwMm1fbWlkX2luaXQobWlkKTsKKworCQlpZiAoY21weGNoZyh0b3BfcCwgcDJtX21pZF9taXNzaW5nLCBtaWQpICE9IHAybV9taWRfbWlzc2luZykKKwkJCWZyZWVfcDJtX3BhZ2UobWlkKTsKKwl9CisKKwl0b3BfbWZuX3AgPSAmcDJtX3RvcF9tZm5bdG9waWR4XTsKKwltaWRfbWZuID0gcDJtX3RvcF9tZm5fcFt0b3BpZHhdOworCisJQlVHX09OKHZpcnRfdG9fbWZuKG1pZF9tZm4pICE9ICp0b3BfbWZuX3ApOworCisJaWYgKG1pZF9tZm4gPT0gcDJtX21pZF9taXNzaW5nX21mbikgeworCQkvKiBTZXBhcmF0ZWx5IGNoZWNrIHRoZSBtaWQgbWZuIGxldmVsICovCisJCXVuc2lnbmVkIGxvbmcgbWlzc2luZ19tZm47CisJCXVuc2lnbmVkIGxvbmcgbWlkX21mbl9tZm47CisKKwkJbWlkX21mbiA9IGFsbG9jX3AybV9wYWdlKCk7CisJCWlmICghbWlkX21mbikKKwkJCXJldHVybiBmYWxzZTsKKworCQlwMm1fbWlkX21mbl9pbml0KG1pZF9tZm4pOworCisJCW1pc3NpbmdfbWZuID0gdmlydF90b19tZm4ocDJtX21pZF9taXNzaW5nX21mbik7CisJCW1pZF9tZm5fbWZuID0gdmlydF90b19tZm4obWlkX21mbik7CisJCWlmIChjbXB4Y2hnKHRvcF9tZm5fcCwgbWlzc2luZ19tZm4sIG1pZF9tZm5fbWZuKSAhPSBtaXNzaW5nX21mbikKKwkJCWZyZWVfcDJtX3BhZ2UobWlkX21mbik7CisJCWVsc2UKKwkJCXAybV90b3BfbWZuX3BbdG9waWR4XSA9IG1pZF9tZm47CisJfQorCisJaWYgKHAybV90b3BbdG9waWR4XVttaWRpZHhdID09IHAybV9taXNzaW5nKSB7CisJCS8qIHAybSBsZWFmIHBhZ2UgaXMgbWlzc2luZyAqLworCQl1bnNpZ25lZCBsb25nICpwMm07CisKKwkJcDJtID0gYWxsb2NfcDJtX3BhZ2UoKTsKKwkJaWYgKCFwMm0pCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcDJtX2luaXQocDJtKTsKKworCQlpZiAoY21weGNoZygmbWlkW21pZGlkeF0sIHAybV9taXNzaW5nLCBwMm0pICE9IHAybV9taXNzaW5nKQorCQkJZnJlZV9wMm1fcGFnZShwMm0pOworCQllbHNlCisJCQltaWRfbWZuW21pZGlkeF0gPSB2aXJ0X3RvX21mbihwMm0pOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBUcnkgdG8gaW5zdGFsbCBwMm0gbWFwcGluZzsgZmFpbCBpZiBpbnRlcm1lZGlhdGUgYml0cyBtaXNzaW5nICovCitib29sIF9fc2V0X3BoeXNfdG9fbWFjaGluZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBtZm4pCit7CisJdW5zaWduZWQgdG9waWR4LCBtaWRpZHgsIGlkeDsKKworCWlmICh1bmxpa2VseShwZm4gPj0gTUFYX1AyTV9QRk4pKSB7CisJCUJVR19PTihtZm4gIT0gSU5WQUxJRF9QMk1fRU5UUlkpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl0b3BpZHggPSBwMm1fdG9wX2luZGV4KHBmbik7CisJbWlkaWR4ID0gcDJtX21pZF9pbmRleChwZm4pOworCWlkeCA9IHAybV9pbmRleChwZm4pOworCisJaWYgKHAybV90b3BbdG9waWR4XVttaWRpZHhdID09IHAybV9taXNzaW5nKQorCQlyZXR1cm4gbWZuID09IElOVkFMSURfUDJNX0VOVFJZOworCisJcDJtX3RvcFt0b3BpZHhdW21pZGlkeF1baWR4XSA9IG1mbjsKKworCXJldHVybiB0cnVlOworfQorCitib29sIHNldF9waHlzX3RvX21hY2hpbmUodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbWZuKQoreworCWlmICh1bmxpa2VseSh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkpIHsKKwkJQlVHX09OKHBmbiAhPSBtZm4gJiYgbWZuICE9IElOVkFMSURfUDJNX0VOVFJZKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaWYgKHVubGlrZWx5KCFfX3NldF9waHlzX3RvX21hY2hpbmUocGZuLCBtZm4pKSkgIHsKKwkJaWYgKCFhbGxvY19wMm0ocGZuKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoIV9fc2V0X3BoeXNfdG9fbWFjaGluZShwZm4sIG1mbikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgTTJQX09WRVJSSURFX0hBU0hfU0hJRlQJMTAKKyNkZWZpbmUgTTJQX09WRVJSSURFX0hBU0gJKDEgPDwgTTJQX09WRVJSSURFX0hBU0hfU0hJRlQpCisKK3N0YXRpYyBSRVNFUlZFX0JSS19BUlJBWShzdHJ1Y3QgbGlzdF9oZWFkLCBtMnBfb3ZlcnJpZGVzLCBNMlBfT1ZFUlJJREVfSEFTSCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG0ycF9vdmVycmlkZV9sb2NrKTsKKworc3RhdGljIHZvaWQgX19pbml0IG0ycF9vdmVycmlkZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCW0ycF9vdmVycmlkZXMgPSBleHRlbmRfYnJrKHNpemVvZigqbTJwX292ZXJyaWRlcykgKiBNMlBfT1ZFUlJJREVfSEFTSCwKKwkJCQkgICBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJZm9yIChpID0gMDsgaSA8IE0yUF9PVkVSUklERV9IQVNIOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZtMnBfb3ZlcnJpZGVzW2ldKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWZuX2hhc2godW5zaWduZWQgbG9uZyBtZm4pCit7CisJcmV0dXJuIGhhc2hfbG9uZyhtZm4sIE0yUF9PVkVSUklERV9IQVNIX1NISUZUKTsKK30KKworLyogQWRkIGFuIE1GTiBvdmVycmlkZSBmb3IgYSBwYXJ0aWN1bGFyIHBhZ2UgKi8KK2ludCBtMnBfYWRkX292ZXJyaWRlKHVuc2lnbmVkIGxvbmcgbWZuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsZXZlbDsKKwlwdGVfdCAqcHRlcCA9IE5VTEw7CisKKwlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKTsKKwkJcHRlcCA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MsICZsZXZlbCk7CisKKwkJaWYgKFdBUk4ocHRlcCA9PSBOVUxMIHx8IGxldmVsICE9IFBHX0xFVkVMXzRLLAorCQkJCQkibTJwX2FkZF9vdmVycmlkZTogcGZuICVseCBub3QgbWFwcGVkIiwgcGZuKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhZ2UtPnByaXZhdGUgPSBtZm47CisJcGFnZS0+aW5kZXggPSBwZm5fdG9fbWZuKHBmbik7CisKKwlfX3NldF9waHlzX3RvX21hY2hpbmUocGZuLCBGT1JFSUdOX0ZSQU1FKG1mbikpOworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpCisJCS8qIEp1c3QgemFwIG9sZCBtYXBwaW5nIGZvciBub3cgKi8KKwkJcHRlX2NsZWFyKCZpbml0X21tLCBhZGRyZXNzLCBwdGVwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtMnBfb3ZlcnJpZGVfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZwYWdlLT5scnUsICAmbTJwX292ZXJyaWRlc1ttZm5faGFzaChtZm4pXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTJwX292ZXJyaWRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgbTJwX3JlbW92ZV9vdmVycmlkZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWZuOworCXVuc2lnbmVkIGxvbmcgcGZuOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKwl1bnNpZ25lZCBsZXZlbDsKKwlwdGVfdCAqcHRlcCA9IE5VTEw7CisKKwlwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwltZm4gPSBnZXRfcGh5c190b19tYWNoaW5lKHBmbik7CisJaWYgKG1mbiA9PSBJTlZBTElEX1AyTV9FTlRSWSB8fCAhKG1mbiAmIEZPUkVJR05fRlJBTUVfQklUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylfX3ZhKHBmbiA8PCBQQUdFX1NISUZUKTsKKwkJcHRlcCA9IGxvb2t1cF9hZGRyZXNzKGFkZHJlc3MsICZsZXZlbCk7CisKKwkJaWYgKFdBUk4ocHRlcCA9PSBOVUxMIHx8IGxldmVsICE9IFBHX0xFVkVMXzRLLAorCQkJCQkibTJwX3JlbW92ZV9vdmVycmlkZTogcGZuICVseCBub3QgbWFwcGVkIiwgcGZuKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtMnBfb3ZlcnJpZGVfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0ycF9vdmVycmlkZV9sb2NrLCBmbGFncyk7CisJX19zZXRfcGh5c190b19tYWNoaW5lKHBmbiwgcGFnZS0+aW5kZXgpOworCisJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKKwkJc2V0X3B0ZV9hdCgmaW5pdF9tbSwgYWRkcmVzcywgcHRlcCwKKwkJCQlwZm5fcHRlKHBmbiwgUEFHRV9LRVJORUwpKTsKKwkJLyogTm8gdGxiIGZsdXNoIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBjYWxsZXIgYWxyZWFkeQorCQkgKiBsZWZ0IHRoZSBwdGUgdW5tYXBwZWQuICovCisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhZ2UgKm0ycF9maW5kX292ZXJyaWRlKHVuc2lnbmVkIGxvbmcgbWZuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqYnVja2V0ID0gJm0ycF9vdmVycmlkZXNbbWZuX2hhc2gobWZuKV07CisJc3RydWN0IHBhZ2UgKnAsICpyZXQ7CisKKwlyZXQgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm0ycF9vdmVycmlkZV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGJ1Y2tldCwgbHJ1KSB7CisJCWlmIChwLT5wcml2YXRlID09IG1mbikgeworCQkJcmV0ID0gcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTJwX292ZXJyaWRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbTJwX2ZpbmRfb3ZlcnJpZGVfcGZuKHVuc2lnbmVkIGxvbmcgbWZuLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgcGFnZSAqcCA9IG0ycF9maW5kX292ZXJyaWRlKG1mbik7CisJdW5zaWduZWQgbG9uZyByZXQgPSBwZm47CisKKwlpZiAocCkKKwkJcmV0ID0gcGFnZV90b19wZm4ocCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobTJwX2ZpbmRfb3ZlcnJpZGVfcGZuKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tYW4uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tYW4uaAppbmRleCBmY2E0ZGI0Li4zMDc4OTAxIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbWFuLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW1hbi5oCkBAIC04Myw2ICs4Myw5IEBACiAjZGVmaW5lIE1BRFZfTUVSR0VBQkxFICAgMTIJCS8qIEtTTSBtYXkgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCiAjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMJCS8qIEtTTSBtYXkgbm90IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLwogCisjZGVmaW5lIE1BRFZfSFVHRVBBR0UJMTQJCS8qIFdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTE1CQkvKiBOb3Qgd29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworCiAvKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCiAjZGVmaW5lIE1BUF9GSUxFCTAKIApkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNncm91cC5jIGIvYmxvY2svYmxrLWNncm91cC5jCmluZGV4IGIxZmViZDAuLjQ1NTc2OGEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jZ3JvdXAuYworKysgYi9ibG9jay9ibGstY2dyb3VwLmMKQEAgLTE0NTIsMTAgKzE0NTIsNiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JLyogQ3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IGhpZXJhcmNoeSBkZWVwZXIgdGhhbiB0d28gbGV2ZWwgKDAsMSkgKi8KLQlpZiAocGFyZW50ICE9IGNncm91cC0+dG9wX2Nncm91cCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKLQogCWJsa2NnID0ga3phbGxvYyhzaXplb2YoKmJsa2NnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFibGtjZykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCA0Y2U5NTNmLi4yZjQwMDJmIDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2luY2x1ZGUgImJsay5oIgogCi1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX3JlbWFwKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfYmlvX3JlbWFwKTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfcnFfcmVtYXApOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChibG9ja19iaW9fY29tcGxldGUpOwogCkBAIC02NCwxMyArNjQsMjcgQEAKIAkJcmV0dXJuOwogCiAJY3B1ID0gcGFydF9zdGF0X2xvY2soKTsKLQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShycS0+cnFfZGlzaywgYmxrX3JxX3BvcyhycSkpOwogCi0JaWYgKCFuZXdfaW8pCisJaWYgKCFuZXdfaW8pIHsKKwkJcGFydCA9IHJxLT5wYXJ0OwogCQlwYXJ0X3N0YXRfaW5jKGNwdSwgcGFydCwgbWVyZ2VzW3J3XSk7Ci0JZWxzZSB7CisJfSBlbHNlIHsKKwkJcGFydCA9IGRpc2tfbWFwX3NlY3Rvcl9yY3UocnEtPnJxX2Rpc2ssIGJsa19ycV9wb3MocnEpKTsKKwkJaWYgKCFoZF9zdHJ1Y3RfdHJ5X2dldChwYXJ0KSkgeworCQkJLyoKKwkJCSAqIFRoZSBwYXJ0aXRpb24gaXMgYWxyZWFkeSBiZWluZyByZW1vdmVkLAorCQkJICogdGhlIHJlcXVlc3Qgd2lsbCBiZSBhY2NvdW50ZWQgb24gdGhlIGRpc2sgb25seQorCQkJICoKKwkJCSAqIFdlIHRha2UgYSByZWZlcmVuY2Ugb24gZGlzay0+cGFydDAgYWx0aG91Z2ggdGhhdAorCQkJICogcGFydGl0aW9uIHdpbGwgbmV2ZXIgYmUgZGVsZXRlZCwgc28gd2UgY2FuIHRyZWF0CisJCQkgKiBpdCBhcyBhbnkgb3RoZXIgcGFydGl0aW9uLgorCQkJICovCisJCQlwYXJ0ID0gJnJxLT5ycV9kaXNrLT5wYXJ0MDsKKwkJCWhkX3N0cnVjdF9nZXQocGFydCk7CisJCX0KIAkJcGFydF9yb3VuZF9zdGF0cyhjcHUsIHBhcnQpOwogCQlwYXJ0X2luY19pbl9mbGlnaHQocGFydCwgcncpOworCQlycS0+cGFydCA9IHBhcnQ7CiAJfQogCiAJcGFydF9zdGF0X3VubG9jaygpOwpAQCAtMTI4LDYgKzE0Miw3IEBACiAJcnEtPnJlZl9jb3VudCA9IDE7CiAJcnEtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCXNldF9zdGFydF90aW1lX25zKHJxKTsKKwlycS0+cGFydCA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19ycV9pbml0KTsKIApAQCAtMTMyOSw5ICsxMzQ0LDkgQEAKIAkJYmlvLT5iaV9zZWN0b3IgKz0gcC0+c3RhcnRfc2VjdDsKIAkJYmlvLT5iaV9iZGV2ID0gYmRldi0+YmRfY29udGFpbnM7CiAKLQkJdHJhY2VfYmxvY2tfcmVtYXAoYmRldl9nZXRfcXVldWUoYmlvLT5iaV9iZGV2KSwgYmlvLAotCQkJCSAgICBiZGV2LT5iZF9kZXYsCi0JCQkJICAgIGJpby0+Ymlfc2VjdG9yIC0gcC0+c3RhcnRfc2VjdCk7CisJCXRyYWNlX2Jsb2NrX2Jpb19yZW1hcChiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpLCBiaW8sCisJCQkJICAgICAgYmRldi0+YmRfZGV2LAorCQkJCSAgICAgIGJpby0+Ymlfc2VjdG9yIC0gcC0+c3RhcnRfc2VjdCk7CiAJfQogfQogCkBAIC0xNTAwLDcgKzE1MTUsNyBAQAogCQkJZ290byBlbmRfaW87CiAKIAkJaWYgKG9sZF9zZWN0b3IgIT0gLTEpCi0JCQl0cmFjZV9ibG9ja19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIG9sZF9zZWN0b3IpOworCQkJdHJhY2VfYmxvY2tfYmlvX3JlbWFwKHEsIGJpbywgb2xkX2Rldiwgb2xkX3NlY3Rvcik7CiAKIAkJb2xkX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCQlvbGRfZGV2ID0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CkBAIC0xNzc2LDcgKzE3OTEsNyBAQAogCQlpbnQgY3B1OwogCiAJCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7Ci0JCXBhcnQgPSBkaXNrX21hcF9zZWN0b3JfcmN1KHJlcS0+cnFfZGlzaywgYmxrX3JxX3BvcyhyZXEpKTsKKwkJcGFydCA9IHJlcS0+cGFydDsKIAkJcGFydF9zdGF0X2FkZChjcHUsIHBhcnQsIHNlY3RvcnNbcnddLCBieXRlcyA+PiA5KTsKIAkJcGFydF9zdGF0X3VubG9jaygpOwogCX0KQEAgLTE3OTYsMTMgKzE4MTEsMTQgQEAKIAkJaW50IGNwdTsKIAogCQljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIGJsa19ycV9wb3MocmVxKSk7CisJCXBhcnQgPSByZXEtPnBhcnQ7CiAKIAkJcGFydF9zdGF0X2luYyhjcHUsIHBhcnQsIGlvc1tyd10pOwogCQlwYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbik7CiAJCXBhcnRfcm91bmRfc3RhdHMoY3B1LCBwYXJ0KTsKIAkJcGFydF9kZWNfaW5fZmxpZ2h0KHBhcnQsIHJ3KTsKIAorCQloZF9zdHJ1Y3RfcHV0KHBhcnQpOwogCQlwYXJ0X3N0YXRfdW5sb2NrKCk7CiAJfQogfQpAQCAtMjYwNiw3ICsyNjIyLDkgQEAKIAlCVUlMRF9CVUdfT04oX19SRVFfTlJfQklUUyA+IDggKgogCQkJc2l6ZW9mKCgoc3RydWN0IHJlcXVlc3QgKikwKS0+Y21kX2ZsYWdzKSk7CiAKLQlrYmxvY2tkX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImtibG9ja2QiKTsKKwkvKiB1c2VkIGZvciB1bnBsdWdnaW5nIGFuZCBhZmZlY3RzIElPIGxhdGVuY3kvdGhyb3VnaHB1dCAtIEhJR0hQUkkgKi8KKwlrYmxvY2tkX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgia2Jsb2NrZCIsCisJCQkJCSAgICBXUV9NRU1fUkVDTEFJTSB8IFdRX0hJR0hQUkksIDApOwogCWlmICgha2Jsb2NrZF93b3JrcXVldWUpCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIGtibG9ja2RcbiIpOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstaW9jLmMgYi9ibG9jay9ibGstaW9jLmMKaW5kZXggM2M3YTMzOS4uYjc5MTAyMiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWlvYy5jCisrKyBiL2Jsb2NrL2Jsay1pb2MuYwpAQCAtNjQsNyArNjQsNyBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi0vKiBDYWxsZWQgYnkgdGhlIGV4aXR0aW5nIHRhc2sgKi8KKy8qIENhbGxlZCBieSB0aGUgZXhpdGluZyB0YXNrICovCiB2b2lkIGV4aXRfaW9fY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKQEAgLTc0LDEwICs3NCw5IEBACiAJdGFzay0+aW9fY29udGV4dCA9IE5VTEw7CiAJdGFza191bmxvY2sodGFzayk7CiAKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW9jLT5ucl90YXNrcykpIHsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW9jLT5ucl90YXNrcykpCiAJCWNmcV9leGl0KGlvYyk7CiAKLQl9CiAJcHV0X2lvX2NvbnRleHQoaW9jKTsKIH0KIApkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1lcmdlLmMgYi9ibG9jay9ibGstbWVyZ2UuYwppbmRleCA3NGJjNGE3Li5lYTg1ZTIwIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbWVyZ2UuYworKysgYi9ibG9jay9ibGstbWVyZ2UuYwpAQCAtMzUxLDExICszNTEsMTIgQEAKIAkJaW50IGNwdTsKIAogCQljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIGJsa19ycV9wb3MocmVxKSk7CisJCXBhcnQgPSByZXEtPnBhcnQ7CiAKIAkJcGFydF9yb3VuZF9zdGF0cyhjcHUsIHBhcnQpOwogCQlwYXJ0X2RlY19pbl9mbGlnaHQocGFydCwgcnFfZGF0YV9kaXIocmVxKSk7CiAKKwkJaGRfc3RydWN0X3B1dChwYXJ0KTsKIAkJcGFydF9zdGF0X3VubG9jaygpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IDRjZDU5YjAuLjg0Mjc2OTcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtODcsNyArODcsNiBAQAogCXVuc2lnbmVkIGNvdW50OwogCXVuc2lnbmVkIHRvdGFsX3dlaWdodDsKIAl1NjQgbWluX3ZkaXNrdGltZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqYWN0aXZlOwogfTsKICNkZWZpbmUgQ0ZRX1JCX1JPT1QJKHN0cnVjdCBjZnFfcmJfcm9vdCkgeyAucmIgPSBSQl9ST09ULCAubGVmdCA9IE5VTEwsIFwKIAkJCS5jb3VudCA9IDAsIC5taW5fdmRpc2t0aW1lID0gMCwgfQpAQCAtOTcsNyArOTYsNyBAQAogICovCiBzdHJ1Y3QgY2ZxX3F1ZXVlIHsKIAkvKiByZWZlcmVuY2UgY291bnQgKi8KLQlhdG9taWNfdCByZWY7CisJaW50IHJlZjsKIAkvKiB2YXJpb3VzIHN0YXRlIGZsYWdzLCBzZWUgYmVsb3cgKi8KIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJLyogcGFyZW50IGNmcV9kYXRhICovCkBAIC0xODAsNyArMTc5LDYgQEAKIAkvKiBncm91cCBzZXJ2aWNlX3RyZWUga2V5ICovCiAJdTY0IHZkaXNrdGltZTsKIAl1bnNpZ25lZCBpbnQgd2VpZ2h0OwotCWJvb2wgb25fc3Q7CiAKIAkvKiBudW1iZXIgb2YgY2ZxcSBjdXJyZW50bHkgb24gdGhpcyBncm91cCAqLwogCWludCBucl9jZnFxOwpAQCAtMjA5LDcgKzIwNyw3IEBACiAJc3RydWN0IGJsa2lvX2dyb3VwIGJsa2c7CiAjaWZkZWYgQ09ORklHX0NGUV9HUk9VUF9JT1NDSEVECiAJc3RydWN0IGhsaXN0X25vZGUgY2ZxZF9ub2RlOwotCWF0b21pY190IHJlZjsKKwlpbnQgcmVmOwogI2VuZGlmCiAJLyogbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgYXJlIG9uIHRoZSBkaXNwYXRjaCBsaXN0IG9yIGluc2lkZSBkcml2ZXIgKi8KIAlpbnQgZGlzcGF0Y2hlZDsKQEAgLTU2MywxMSArNTYxLDYgQEAKIAl1NjQgdmRpc2t0aW1lID0gc3QtPm1pbl92ZGlza3RpbWU7CiAJc3RydWN0IGNmcV9ncm91cCAqY2ZxZzsKIAotCWlmIChzdC0+YWN0aXZlKSB7Ci0JCWNmcWcgPSByYl9lbnRyeV9jZnFnKHN0LT5hY3RpdmUpOwotCQl2ZGlza3RpbWUgPSBjZnFnLT52ZGlza3RpbWU7Ci0JfQotCiAJaWYgKHN0LT5sZWZ0KSB7CiAJCWNmcWcgPSByYl9lbnRyeV9jZnFnKHN0LT5sZWZ0KTsKIAkJdmRpc2t0aW1lID0gbWluX3ZkaXNrdGltZSh2ZGlza3RpbWUsIGNmcWctPnZkaXNrdGltZSk7CkBAIC02NDYsMTEgKzYzOSwxMSBAQAogc3RhdGljIGlubGluZSBib29sIGNmcV9zbGljZV91c2VkKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJaWYgKGNmcV9jZnFxX3NsaWNlX25ldyhjZnFxKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgY2ZxcS0+c2xpY2VfZW5kKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCiAvKgpAQCAtODY5LDcgKzg2Miw3IEBACiAJc3RydWN0IHJiX25vZGUgKm47CiAKIAljZnFnLT5ucl9jZnFxKys7Ci0JaWYgKGNmcWctPm9uX3N0KQorCWlmICghUkJfRU1QVFlfTk9ERSgmY2ZxZy0+cmJfbm9kZSkpCiAJCXJldHVybjsKIAogCS8qCkBAIC04ODUsNyArODc4LDYgQEAKIAkJY2ZxZy0+dmRpc2t0aW1lID0gc3QtPm1pbl92ZGlza3RpbWU7CiAKIAlfX2NmcV9ncm91cF9zZXJ2aWNlX3RyZWVfYWRkKHN0LCBjZnFnKTsKLQljZnFnLT5vbl9zdCA9IHRydWU7CiAJc3QtPnRvdGFsX3dlaWdodCArPSBjZnFnLT53ZWlnaHQ7CiB9CiAKQEAgLTg5NCw5ICs4ODYsNiBAQAogewogCXN0cnVjdCBjZnFfcmJfcm9vdCAqc3QgPSAmY2ZxZC0+Z3JwX3NlcnZpY2VfdHJlZTsKIAotCWlmIChzdC0+YWN0aXZlID09ICZjZnFnLT5yYl9ub2RlKQotCQlzdC0+YWN0aXZlID0gTlVMTDsKLQogCUJVR19PTihjZnFnLT5ucl9jZnFxIDwgMSk7CiAJY2ZxZy0+bnJfY2ZxcS0tOwogCkBAIC05MDUsNyArODk0LDYgQEAKIAkJcmV0dXJuOwogCiAJY2ZxX2xvZ19jZnFnKGNmcWQsIGNmcWcsICJkZWxfZnJvbV9yciBncm91cCIpOwotCWNmcWctPm9uX3N0ID0gZmFsc2U7CiAJc3QtPnRvdGFsX3dlaWdodCAtPSBjZnFnLT53ZWlnaHQ7CiAJaWYgKCFSQl9FTVBUWV9OT0RFKCZjZnFnLT5yYl9ub2RlKSkKIAkJY2ZxX3JiX2VyYXNlKCZjZnFnLT5yYl9ub2RlLCBzdCk7CkBAIC0xMDI2LDExICsxMDE0LDExIEBACiAJICogZWxldmF0b3Igd2hpY2ggd2lsbCBiZSBkcm9wcGVkIGJ5IGVpdGhlciBlbGV2YXRvciBleGl0CiAJICogb3IgY2dyb3VwIGRlbGV0aW9uIHBhdGggZGVwZW5kaW5nIG9uIHdobyBpcyBleGl0aW5nIGZpcnN0LgogCSAqLwotCWF0b21pY19zZXQoJmNmcWctPnJlZiwgMSk7CisJY2ZxZy0+cmVmID0gMTsKIAogCS8qCiAJICogQWRkIGdyb3VwIG9udG8gY2dyb3VwIGxpc3QuIEl0IG1pZ2h0IGhhcHBlbiB0aGF0IGJkaS0+ZGV2IGlzCi0JICogbm90IGluaXRpbGlhemVkIHlldC4gSW5pdGlhbGl6ZSB0aGlzIG5ldyBncm91cCB3aXRob3V0IG1ham9yCisJICogbm90IGluaXRpYWxpemVkIHlldC4gSW5pdGlhbGl6ZSB0aGlzIG5ldyBncm91cCB3aXRob3V0IG1ham9yCiAJICogYW5kIG1pbm9yIGluZm8gYW5kIHRoaXMgaW5mbyB3aWxsIGJlIGZpbGxlZCBpbiBvbmNlIGEgbmV3IHRocmVhZAogCSAqIGNvbWVzIGZvciBJTy4gU2VlIGNvZGUgYWJvdmUuCiAJICovCkBAIC0xMDcxLDcgKzEwNTksNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjZnFfZ3JvdXAgKmNmcV9yZWZfZ2V0X2NmcWcoc3RydWN0IGNmcV9ncm91cCAqY2ZxZykKIHsKLQlhdG9taWNfaW5jKCZjZnFnLT5yZWYpOworCWNmcWctPnJlZisrOwogCXJldHVybiBjZnFnOwogfQogCkBAIC0xMDgzLDcgKzEwNzEsNyBAQAogCiAJY2ZxcS0+Y2ZxZyA9IGNmcWc7CiAJLyogY2ZxcSByZWZlcmVuY2Ugb24gY2ZxZyAqLwotCWF0b21pY19pbmMoJmNmcXEtPmNmcWctPnJlZik7CisJY2ZxcS0+Y2ZxZy0+cmVmKys7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9wdXRfY2ZxZyhzdHJ1Y3QgY2ZxX2dyb3VwICpjZnFnKQpAQCAtMTA5MSwxMSArMTA3OSwxMiBAQAogCXN0cnVjdCBjZnFfcmJfcm9vdCAqc3Q7CiAJaW50IGksIGo7CiAKLQlCVUdfT04oYXRvbWljX3JlYWQoJmNmcWctPnJlZikgPD0gMCk7Ci0JaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjZnFnLT5yZWYpKQorCUJVR19PTihjZnFnLT5yZWYgPD0gMCk7CisJY2ZxZy0+cmVmLS07CisJaWYgKGNmcWctPnJlZikKIAkJcmV0dXJuOwogCWZvcl9lYWNoX2NmcWdfc3QoY2ZxZywgaSwgaiwgc3QpCi0JCUJVR19PTighUkJfRU1QVFlfUk9PVCgmc3QtPnJiKSB8fCBzdC0+YWN0aXZlICE9IE5VTEwpOworCQlCVUdfT04oIVJCX0VNUFRZX1JPT1QoJnN0LT5yYikpOwogCWtmcmVlKGNmcWcpOwogfQogCkBAIC0xMjAwLDcgKzExODksNyBAQAogCQkJY2ZxX2dyb3VwX3NlcnZpY2VfdHJlZV9kZWwoY2ZxZCwgY2ZxcS0+Y2ZxZyk7CiAJCWNmcXEtPm9yaWdfY2ZxZyA9IGNmcXEtPmNmcWc7CiAJCWNmcXEtPmNmcWcgPSAmY2ZxZC0+cm9vdF9ncm91cDsKLQkJYXRvbWljX2luYygmY2ZxZC0+cm9vdF9ncm91cC5yZWYpOworCQljZnFkLT5yb290X2dyb3VwLnJlZisrOwogCQlncm91cF9jaGFuZ2VkID0gMTsKIAl9IGVsc2UgaWYgKCFjZnFkLT5jZnFfZ3JvdXBfaXNvbGF0aW9uCiAJCSAgICYmIGNmcXFfdHlwZShjZnFxKSA9PSBTWU5DX1dPUktMT0FEICYmIGNmcXEtPm9yaWdfY2ZxZykgewpAQCAtMTY4Nyw5ICsxNjc2LDYgQEAKIAlpZiAoY2ZxcSA9PSBjZnFkLT5hY3RpdmVfcXVldWUpCiAJCWNmcWQtPmFjdGl2ZV9xdWV1ZSA9IE5VTEw7CiAKLQlpZiAoJmNmcXEtPmNmcWctPnJiX25vZGUgPT0gY2ZxZC0+Z3JwX3NlcnZpY2VfdHJlZS5hY3RpdmUpCi0JCWNmcWQtPmdycF9zZXJ2aWNlX3RyZWUuYWN0aXZlID0gTlVMTDsKLQogCWlmIChjZnFkLT5hY3RpdmVfY2ljKSB7CiAJCXB1dF9pb19jb250ZXh0KGNmcWQtPmFjdGl2ZV9jaWMtPmlvYyk7CiAJCWNmcWQtPmFjdGl2ZV9jaWMgPSBOVUxMOwpAQCAtMTkwMSwxMCArMTg4NywxMCBAQAogCSAqIGluIHRoZWlyIHNlcnZpY2UgdHJlZS4KIAkgKi8KIAlpZiAoc2VydmljZV90cmVlLT5jb3VudCA9PSAxICYmIGNmcV9jZnFxX3N5bmMoY2ZxcSkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAljZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgIk5vdCBpZGxpbmcuIHN0LT5jb3VudDolZCIsCiAJCQlzZXJ2aWNlX3RyZWUtPmNvdW50KTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9hcm1fc2xpY2VfdGltZXIoc3RydWN0IGNmcV9kYXRhICpjZnFkKQpAQCAtMjA0MCw3ICsyMDI2LDcgQEAKIAlpbnQgcHJvY2Vzc19yZWZzLCBpb19yZWZzOwogCiAJaW9fcmVmcyA9IGNmcXEtPmFsbG9jYXRlZFtSRUFEXSArIGNmcXEtPmFsbG9jYXRlZFtXUklURV07Ci0JcHJvY2Vzc19yZWZzID0gYXRvbWljX3JlYWQoJmNmcXEtPnJlZikgLSBpb19yZWZzOworCXByb2Nlc3NfcmVmcyA9IGNmcXEtPnJlZiAtIGlvX3JlZnM7CiAJQlVHX09OKHByb2Nlc3NfcmVmcyA8IDApOwogCXJldHVybiBwcm9jZXNzX3JlZnM7CiB9CkBAIC0yMDgwLDEwICsyMDY2LDEwIEBACiAJICovCiAJaWYgKG5ld19wcm9jZXNzX3JlZnMgPj0gcHJvY2Vzc19yZWZzKSB7CiAJCWNmcXEtPm5ld19jZnFxID0gbmV3X2NmcXE7Ci0JCWF0b21pY19hZGQocHJvY2Vzc19yZWZzLCAmbmV3X2NmcXEtPnJlZik7CisJCW5ld19jZnFxLT5yZWYgKz0gcHJvY2Vzc19yZWZzOwogCX0gZWxzZSB7CiAJCW5ld19jZnFxLT5uZXdfY2ZxcSA9IGNmcXE7Ci0JCWF0b21pY19hZGQobmV3X3Byb2Nlc3NfcmVmcywgJmNmcXEtPnJlZik7CisJCWNmcXEtPnJlZiArPSBuZXdfcHJvY2Vzc19yZWZzOwogCX0KIH0KIApAQCAtMjExNiwxMiArMjEwMiw3IEBACiAJdW5zaWduZWQgY291bnQ7CiAJc3RydWN0IGNmcV9yYl9yb290ICpzdDsKIAl1bnNpZ25lZCBncm91cF9zbGljZTsKLQotCWlmICghY2ZxZykgewotCQljZnFkLT5zZXJ2aW5nX3ByaW8gPSBJRExFX1dPUktMT0FEOwotCQljZnFkLT53b3JrbG9hZF9leHBpcmVzID0gamlmZmllcyArIDE7Ci0JCXJldHVybjsKLQl9CisJZW51bSB3bF9wcmlvX3Qgb3JpZ2luYWxfcHJpbyA9IGNmcWQtPnNlcnZpbmdfcHJpbzsKIAogCS8qIENob29zZSBuZXh0IHByaW9yaXR5LiBSVCA+IEJFID4gSURMRSAqLwogCWlmIChjZnFfZ3JvdXBfYnVzeV9xdWV1ZXNfd2woUlRfV09SS0xPQUQsIGNmcWQsIGNmcWcpKQpAQCAtMjEzNCw2ICsyMTE1LDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChvcmlnaW5hbF9wcmlvICE9IGNmcWQtPnNlcnZpbmdfcHJpbykKKwkJZ290byBuZXdfd29ya2xvYWQ7CisKIAkvKgogCSAqIEZvciBSVCBhbmQgQkUsIHdlIGhhdmUgdG8gY2hvb3NlIGFsc28gdGhlIHR5cGUKIAkgKiAoU1lOQywgU1lOQ19OT0lETEUsIEFTWU5DKSwgYW5kIHRvIGNvbXB1dGUgYSB3b3JrbG9hZApAQCAtMjE0OCw2ICsyMTMyLDcgQEAKIAlpZiAoY291bnQgJiYgIXRpbWVfYWZ0ZXIoamlmZmllcywgY2ZxZC0+d29ya2xvYWRfZXhwaXJlcykpCiAJCXJldHVybjsKIAorbmV3X3dvcmtsb2FkOgogCS8qIG90aGVyd2lzZSBzZWxlY3QgbmV3IHdvcmtsb2FkIHR5cGUgKi8KIAljZnFkLT5zZXJ2aW5nX3R5cGUgPQogCQljZnFfY2hvb3NlX3dsKGNmcWQsIGNmcWcsIGNmcWQtPnNlcnZpbmdfcHJpbyk7CkBAIC0yMTk5LDcgKzIxODQsNiBAQAogCWlmIChSQl9FTVBUWV9ST09UKCZzdC0+cmIpKQogCQlyZXR1cm4gTlVMTDsKIAljZnFnID0gY2ZxX3JiX2ZpcnN0X2dyb3VwKHN0KTsKLQlzdC0+YWN0aXZlID0gJmNmcWctPnJiX25vZGU7CiAJdXBkYXRlX21pbl92ZGlza3RpbWUoc3QpOwogCXJldHVybiBjZnFnOwogfQpAQCAtMjI5Myw2ICsyMjc3LDE3IEBACiAJCWdvdG8ga2VlcF9xdWV1ZTsKIAl9CiAKKwkvKgorCSAqIFRoaXMgaXMgYSBkZWVwIHNlZWsgcXVldWUsIGJ1dCB0aGUgZGV2aWNlIGlzIG11Y2ggZmFzdGVyIHRoYW4KKwkgKiB0aGUgcXVldWUgY2FuIGRlbGl2ZXIsIGRvbid0IGlkbGUKKwkgKiovCisJaWYgKENGUVFfU0VFS1koY2ZxcSkgJiYgY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSkgJiYKKwkgICAgKGNmcV9jZnFxX3NsaWNlX25ldyhjZnFxKSB8fAorCSAgICAoY2ZxcS0+c2xpY2VfZW5kIC0gamlmZmllcyA+IGppZmZpZXMgLSBjZnFxLT5zbGljZV9zdGFydCkpKSB7CisJCWNmcV9jbGVhcl9jZnFxX2RlZXAoY2ZxcSk7CisJCWNmcV9jbGVhcl9jZnFxX2lkbGVfd2luZG93KGNmcXEpOworCX0KKwogCWlmIChjZnFxLT5kaXNwYXRjaGVkICYmIGNmcV9zaG91bGRfaWRsZShjZnFkLCBjZnFxKSkgewogCQljZnFxID0gTlVMTDsKIAkJZ290byBrZWVwX3F1ZXVlOwpAQCAtMjM2NywxMiArMjM2MiwxMiBAQAogewogCS8qIHRoZSBxdWV1ZSBoYXNuJ3QgZmluaXNoZWQgYW55IHJlcXVlc3QsIGNhbid0IGVzdGltYXRlICovCiAJaWYgKGNmcV9jZnFxX3NsaWNlX25ldyhjZnFxKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMgKyBjZnFkLT5jZnFfc2xpY2VfaWRsZSAqIGNmcXEtPmRpc3BhdGNoZWQsCiAJCWNmcXEtPnNsaWNlX2VuZCkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGJvb2wgY2ZxX21heV9kaXNwYXRjaChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCkBAIC0yNTM4LDkgKzI1MzMsMTAgQEAKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOwogCXN0cnVjdCBjZnFfZ3JvdXAgKmNmcWcsICpvcmlnX2NmcWc7CiAKLQlCVUdfT04oYXRvbWljX3JlYWQoJmNmcXEtPnJlZikgPD0gMCk7CisJQlVHX09OKGNmcXEtPnJlZiA8PSAwKTsKIAotCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY2ZxcS0+cmVmKSkKKwljZnFxLT5yZWYtLTsKKwlpZiAoY2ZxcS0+cmVmKQogCQlyZXR1cm47CiAKIAljZnFfbG9nX2NmcXEoY2ZxZCwgY2ZxcSwgInB1dF9xdWV1ZSIpOwpAQCAtMjg0Myw3ICsyODM5LDcgQEAKIAlSQl9DTEVBUl9OT0RFKCZjZnFxLT5wX25vZGUpOwogCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIAotCWF0b21pY19zZXQoJmNmcXEtPnJlZiwgMCk7CisJY2ZxcS0+cmVmID0gMDsKIAljZnFxLT5jZnFkID0gY2ZxZDsKIAogCWNmcV9tYXJrX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOwpAQCAtMjk3OSwxMSArMjk3NSwxMSBAQAogCSAqIHBpbiB0aGUgcXVldWUgbm93IHRoYXQgaXQncyBhbGxvY2F0ZWQsIHNjaGVkdWxlciBleGl0IHdpbGwgcHJ1bmUgaXQKIAkgKi8KIAlpZiAoIWlzX3N5bmMgJiYgISgqYXN5bmNfY2ZxcSkpIHsKLQkJYXRvbWljX2luYygmY2ZxcS0+cmVmKTsKKwkJY2ZxcS0+cmVmKys7CiAJCSphc3luY19jZnFxID0gY2ZxcTsKIAl9CiAKLQlhdG9taWNfaW5jKCZjZnFxLT5yZWYpOworCWNmcXEtPnJlZisrOwogCXJldHVybiBjZnFxOwogfQogCkBAIC0zMjY1LDYgKzMyNjEsMTAgQEAKIAlpZiAoY2ZxX2NsYXNzX3J0KG5ld19jZnFxKSAmJiAhY2ZxX2NsYXNzX3J0KGNmcXEpKQogCQlyZXR1cm4gdHJ1ZTsKIAorCS8qIEFuIGlkbGUgcXVldWUgc2hvdWxkIG5vdCBiZSBpZGxlIG5vdyBmb3Igc29tZSByZWFzb24gKi8KKwlpZiAoUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSAmJiAhY2ZxX3Nob3VsZF9pZGxlKGNmcWQsIGNmcXEpKQorCQlyZXR1cm4gdHJ1ZTsKKwogCWlmICghY2ZxZC0+YWN0aXZlX2NpYyB8fCAhY2ZxX2NmcXFfd2FpdF9yZXF1ZXN0KGNmcXEpKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTM2ODEsMTMgKzM2ODEsMTMgQEAKIAl9CiAKIAljZnFxLT5hbGxvY2F0ZWRbcnddKys7Ci0JYXRvbWljX2luYygmY2ZxcS0+cmVmKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCisJY2ZxcS0+cmVmKys7CiAJcnEtPmVsZXZhdG9yX3ByaXZhdGUgPSBjaWM7CiAJcnEtPmVsZXZhdG9yX3ByaXZhdGUyID0gY2ZxcTsKIAlycS0+ZWxldmF0b3JfcHJpdmF0ZTMgPSBjZnFfcmVmX2dldF9jZnFnKGNmcXEtPmNmcWcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gMDsKIAogcXVldWVfZmFpbDoKQEAgLTM4NjIsNiArMzg2MiwxMCBAQAogCWlmICghY2ZxZCkKIAkJcmV0dXJuIE5VTEw7CiAKKwkvKgorCSAqIERvbid0IG5lZWQgdGFrZSBxdWV1ZV9sb2NrIGluIHRoZSByb3V0aW5lLCBzaW5jZSB3ZSBhcmUKKwkgKiBpbml0aWFsaXppbmcgdGhlIGlvc2NoZWR1bGVyLCBhbmQgbm9ib2R5IGlzIHVzaW5nIGNmcWQKKwkgKi8KIAljZnFkLT5jaWNfaW5kZXggPSBpOwogCiAJLyogSW5pdCByb290IHNlcnZpY2UgdHJlZSAqLwpAQCAtMzg4MSw3ICszODg1LDcgQEAKIAkgKiBUYWtlIGEgcmVmZXJlbmNlIHRvIHJvb3QgZ3JvdXAgd2hpY2ggd2UgbmV2ZXIgZHJvcC4gVGhpcyBpcyBqdXN0CiAJICogdG8gbWFrZSBzdXJlIHRoYXQgY2ZxX3B1dF9jZnFnKCkgZG9lcyBub3QgdHJ5IHRvIGtmcmVlIHJvb3QgZ3JvdXAKIAkgKi8KLQlhdG9taWNfc2V0KCZjZnFnLT5yZWYsIDEpOworCWNmcWctPnJlZiA9IDE7CiAJcmN1X3JlYWRfbG9jaygpOwogCWNmcV9ibGtpb2NnX2FkZF9ibGtpb19ncm91cCgmYmxraW9fcm9vdF9jZ3JvdXAsICZjZnFnLT5ibGtnLAogCQkJCQkodm9pZCAqKWNmcWQsIDApOwpAQCAtMzkwMSw3ICszOTA1LDcgQEAKIAkgKiB3aWxsIG5vdCBhdHRlbXB0IHRvIGZyZWUgaXQuCiAJICovCiAJY2ZxX2luaXRfY2ZxcShjZnFkLCAmY2ZxZC0+b29tX2NmcXEsIDEsIDApOwotCWF0b21pY19pbmMoJmNmcWQtPm9vbV9jZnFxLnJlZik7CisJY2ZxZC0+b29tX2NmcXEucmVmKys7CiAJY2ZxX2xpbmtfY2ZxcV9jZnFnKCZjZnFkLT5vb21fY2ZxcSwgJmNmcWQtPnJvb3RfZ3JvdXApOwogCiAJSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmNpY19saXN0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDVmYTJiNDQuLjZhNWI3NzIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKICNpbmNsdWRlICJibGsuaCIKIApAQCAtMzUsNiArMzYsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBkaXNrX3R5cGU7CiAKK3N0YXRpYyB2b2lkIGRpc2tfYWRkX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CitzdGF0aWMgdm9pZCBkaXNrX2RlbF9ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOworc3RhdGljIHZvaWQgZGlza19yZWxlYXNlX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CisKIC8qKgogICogZGlza19nZXRfcGFydCAtIGdldCBwYXJ0aXRpb24KICAqIEBkaXNrOiBkaXNrIHRvIGxvb2sgcGFydGl0aW9uIGZyb20KQEAgLTIzOSw3ICsyNDQsNyBAQAogfSAqbWFqb3JfbmFtZXNbQkxLREVWX01BSk9SX0hBU0hfU0laRV07CiAKIC8qIGluZGV4IGluIHRoZSBhYm92ZSAtIGZvciBub3c6IGFzc3VtZSBubyBtdWx0aW1ham9yIHJhbmdlcyAqLwotc3RhdGljIGlubGluZSBpbnQgbWFqb3JfdG9faW5kZXgoaW50IG1ham9yKQorc3RhdGljIGlubGluZSBpbnQgbWFqb3JfdG9faW5kZXgodW5zaWduZWQgbWFqb3IpCiB7CiAJcmV0dXJuIG1ham9yICUgQkxLREVWX01BSk9SX0hBU0hfU0laRTsKIH0KQEAgLTUwMiw2ICs1MDcsNjQgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCByZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBkZXZpY2UgKmRkZXYgPSBkaXNrX3RvX2RldihkaXNrKTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXN0cnVjdCBkaXNrX3BhcnRfaXRlciBwaXRlcjsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCWludCBlcnI7CisKKwlkZGV2LT5wYXJlbnQgPSBkaXNrLT5kcml2ZXJmc19kZXY7CisKKwlkZXZfc2V0X25hbWUoZGRldiwgZGlzay0+ZGlza19uYW1lKTsKKworCS8qIGRlbGF5IHVldmVudHMsIHVudGlsIHdlIHNjYW5uZWQgcGFydGl0aW9uIHRhYmxlICovCisJZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZGRldiwgMSk7CisKKwlpZiAoZGV2aWNlX2FkZChkZGV2KSkKKwkJcmV0dXJuOworCWlmICghc3lzZnNfZGVwcmVjYXRlZCkgeworCQllcnIgPSBzeXNmc19jcmVhdGVfbGluayhibG9ja19kZXByLCAmZGRldi0+a29iaiwKKwkJCQkJa29iamVjdF9uYW1lKCZkZGV2LT5rb2JqKSk7CisJCWlmIChlcnIpIHsKKwkJCWRldmljZV9kZWwoZGRldik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZGlzay0+cGFydDAuaG9sZGVyX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImhvbGRlcnMiLCAmZGRldi0+a29iaik7CisJZGlzay0+c2xhdmVfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic2xhdmVzIiwgJmRkZXYtPmtvYmopOworCisJLyogTm8gbWlub3JzIHRvIHVzZSBmb3IgcGFydGl0aW9ucyAqLworCWlmICghZGlza19wYXJ0aXRpb25hYmxlKGRpc2spKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBObyBzdWNoIGRldmljZSAoZS5nLiwgbWVkaWEgd2VyZSBqdXN0IHJlbW92ZWQpICovCisJaWYgKCFnZXRfY2FwYWNpdHkoZGlzaykpCisJCWdvdG8gZXhpdDsKKworCWJkZXYgPSBiZGdldF9kaXNrKGRpc2ssIDApOworCWlmICghYmRldikKKwkJZ290byBleGl0OworCisJYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAxOworCWVyciA9IGJsa2Rldl9nZXQoYmRldiwgRk1PREVfUkVBRCwgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXhpdDsKKwlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUQpOworCitleGl0OgorCS8qIGFubm91bmNlIGRpc2sgYWZ0ZXIgcG9zc2libGUgcGFydGl0aW9ucyBhcmUgY3JlYXRlZCAqLworCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGRkZXYsIDApOworCWtvYmplY3RfdWV2ZW50KCZkZGV2LT5rb2JqLCBLT0JKX0FERCk7CisKKwkvKiBhbm5vdW5jZSBwb3NzaWJsZSBwYXJ0aXRpb25zICovCisJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIDApOworCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpCisJCWtvYmplY3RfdWV2ZW50KCZwYXJ0X3RvX2RldihwYXJ0KS0+a29iaiwgS09CSl9BREQpOworCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKK30KKwogLyoqCiAgKiBhZGRfZGlzayAtIGFkZCBwYXJ0aXRpb25pbmcgaW5mb3JtYXRpb24gdG8ga2VybmVsIGxpc3QKICAqIEBkaXNrOiBwZXItZGV2aWNlIHBhcnRpdGlvbmluZyBpbmZvcm1hdGlvbgpAQCAtNTUxLDE4ICs2MTQsNDggQEAKIAlyZXR2YWwgPSBzeXNmc19jcmVhdGVfbGluaygmZGlza190b19kZXYoZGlzayktPmtvYmosICZiZGktPmRldi0+a29iaiwKIAkJCQkgICAiYmRpIik7CiAJV0FSTl9PTihyZXR2YWwpOworCisJZGlza19hZGRfZXZlbnRzKGRpc2spOwogfQotCiBFWFBPUlRfU1lNQk9MKGFkZF9kaXNrKTsKLUVYUE9SVF9TWU1CT0woZGVsX2dlbmRpc2spOwkvKiBpbiBwYXJ0aXRpb25zL2NoZWNrLmMgKi8KIAotdm9pZCB1bmxpbmtfZ2VuZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3ZvaWQgZGVsX2dlbmRpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CisJc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOworCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7CisKKwlkaXNrX2RlbF9ldmVudHMoZGlzayk7CisKKwkvKiBpbnZhbGlkYXRlIHN0dWZmICovCisJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssCisJCQkgICAgIERJU0tfUElURVJfSU5DTF9FTVBUWSB8IERJU0tfUElURVJfUkVWRVJTRSk7CisJd2hpbGUgKChwYXJ0ID0gZGlza19wYXJ0X2l0ZXJfbmV4dCgmcGl0ZXIpKSkgeworCQlpbnZhbGlkYXRlX3BhcnRpdGlvbihkaXNrLCBwYXJ0LT5wYXJ0bm8pOworCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHBhcnQtPnBhcnRubyk7CisJfQorCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKKworCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIDApOworCWJsa19mcmVlX2RldnQoZGlza190b19kZXYoZGlzayktPmRldnQpOworCXNldF9jYXBhY2l0eShkaXNrLCAwKTsKKwlkaXNrLT5mbGFncyAmPSB+R0VOSERfRkxfVVA7CisKIAlzeXNmc19yZW1vdmVfbGluaygmZGlza190b19kZXYoZGlzayktPmtvYmosICJiZGkiKTsKIAliZGlfdW5yZWdpc3RlcigmZGlzay0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8pOwogCWJsa191bnJlZ2lzdGVyX3F1ZXVlKGRpc2spOwogCWJsa191bnJlZ2lzdGVyX3JlZ2lvbihkaXNrX2RldnQoZGlzayksIGRpc2stPm1pbm9ycyk7CisKKwlwYXJ0X3N0YXRfc2V0X2FsbCgmZGlzay0+cGFydDAsIDApOworCWRpc2stPnBhcnQwLnN0YW1wID0gMDsKKworCWtvYmplY3RfcHV0KGRpc2stPnBhcnQwLmhvbGRlcl9kaXIpOworCWtvYmplY3RfcHV0KGRpc2stPnNsYXZlX2Rpcik7CisJZGlzay0+ZHJpdmVyZnNfZGV2ID0gTlVMTDsKKwlpZiAoIXN5c2ZzX2RlcHJlY2F0ZWQpCisJCXN5c2ZzX3JlbW92ZV9saW5rKGJsb2NrX2RlcHIsIGRldl9uYW1lKGRpc2tfdG9fZGV2KGRpc2spKSk7CisJZGV2aWNlX2RlbChkaXNrX3RvX2RldihkaXNrKSk7CiB9CitFWFBPUlRfU1lNQk9MKGRlbF9nZW5kaXNrKTsKIAogLyoqCiAgKiBnZXRfZ2VuZGlzayAtIGdldCBwYXJ0aXRpb25pbmcgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZGV2aWNlCkBAIC03MzUsNyArODI4LDcgQEAKIAlzdGF0aWMgdm9pZCAqcDsKIAogCXAgPSBkaXNrX3NlcWZfc3RhcnQoc2VxZiwgcG9zKTsKLQlpZiAoIUlTX0VSUihwKSAmJiBwICYmICEqcG9zKQorCWlmICghSVNfRVJSX09SX05VTEwocCkgJiYgISpwb3MpCiAJCXNlcV9wdXRzKHNlcWYsICJtYWpvciBtaW5vciAgI2Jsb2NrcyAgbmFtZVxuXG4iKTsKIAlyZXR1cm4gcDsKIH0KQEAgLTEwMDUsNiArMTA5OCw3IEBACiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOwogCisJZGlza19yZWxlYXNlX2V2ZW50cyhkaXNrKTsKIAlrZnJlZShkaXNrLT5yYW5kb20pOwogCWRpc2tfcmVwbGFjZV9wYXJ0X3RibChkaXNrLCBOVUxMKTsKIAlmcmVlX3BhcnRfc3RhdHMoJmRpc2stPnBhcnQwKTsKQEAgLTExMTAsMjkgKzEyMDQsNiBAQAogbW9kdWxlX2luaXQocHJvY19nZW5oZF9pbml0KTsKICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCi1zdGF0aWMgdm9pZCBtZWRpYV9jaGFuZ2Vfbm90aWZ5X3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGdlbmRpc2sgKmdkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnZW5kaXNrLCBhc3luY19ub3RpZnkpOwotCWNoYXIgZXZlbnRbXSA9ICJNRURJQV9DSEFOR0U9MSI7Ci0JY2hhciAqZW52cFtdID0geyBldmVudCwgTlVMTCB9OwotCi0JLyoKLQkgKiBzZXQgZW52aXJvbWVudCB2YXJzIHRvIGluZGljYXRlIHdoaWNoIGV2ZW50IHRoaXMgaXMgZm9yCi0JICogc28gdGhhdCB1c2VyIHNwYWNlIHdpbGwga25vdyB0byBnbyBjaGVjayB0aGUgbWVkaWEgc3RhdHVzLgotCSAqLwotCWtvYmplY3RfdWV2ZW50X2VudigmZGlza190b19kZXYoZ2QpLT5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7Ci0JcHV0X2RldmljZShnZC0+ZHJpdmVyZnNfZGV2KTsKLX0KLQotI2lmIDAKLXZvaWQgZ2VuaGRfbWVkaWFfY2hhbmdlX25vdGlmeShzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKLXsKLQlnZXRfZGV2aWNlKGRpc2stPmRyaXZlcmZzX2Rldik7Ci0Jc2NoZWR1bGVfd29yaygmZGlzay0+YXN5bmNfbm90aWZ5KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGdlbmhkX21lZGlhX2NoYW5nZV9ub3RpZnkpOwotI2VuZGlmICAvKiAgMCAgKi8KLQogZGV2X3QgYmxrX2xvb2t1cF9kZXZ0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBwYXJ0bm8pCiB7CiAJZGV2X3QgZGV2dCA9IE1LREVWKDAsIDApOwpAQCAtMTE5MywxMyArMTI2NCwxMyBAQAogCQl9CiAJCWRpc2stPnBhcnRfdGJsLT5wYXJ0WzBdID0gJmRpc2stPnBhcnQwOwogCisJCWhkX3JlZl9pbml0KCZkaXNrLT5wYXJ0MCk7CisKIAkJZGlzay0+bWlub3JzID0gbWlub3JzOwogCQlyYW5kX2luaXRpYWxpemVfZGlzayhkaXNrKTsKIAkJZGlza190b19kZXYoZGlzayktPmNsYXNzID0gJmJsb2NrX2NsYXNzOwogCQlkaXNrX3RvX2RldihkaXNrKS0+dHlwZSA9ICZkaXNrX3R5cGU7CiAJCWRldmljZV9pbml0aWFsaXplKGRpc2tfdG9fZGV2KGRpc2spKTsKLQkJSU5JVF9XT1JLKCZkaXNrLT5hc3luY19ub3RpZnksCi0JCQltZWRpYV9jaGFuZ2Vfbm90aWZ5X3RocmVhZCk7CiAJfQogCXJldHVybiBkaXNrOwogfQpAQCAtMTI5MSwzICsxMzYyLDQyMiBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfcGFydGl0aW9uKTsKKworLyoKKyAqIERpc2sgZXZlbnRzIC0gbW9uaXRvciBkaXNrIGV2ZW50cyBsaWtlIG1lZGlhIGNoYW5nZSBhbmQgZWplY3QgcmVxdWVzdC4KKyAqLworc3RydWN0IGRpc2tfZXZlbnRzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CQkvKiBhbGwgZGlza19ldmVudCdzICovCisJc3RydWN0IGdlbmRpc2sJCSpkaXNrOwkJLyogdGhlIGFzc29jaWF0ZWQgZGlzayAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlpbnQJCQlibG9jazsJCS8qIGV2ZW50IGJsb2NraW5nIGRlcHRoICovCisJdW5zaWduZWQgaW50CQlwZW5kaW5nOwkvKiBldmVudHMgYWxyZWFkeSBzZW50IG91dCAqLworCXVuc2lnbmVkIGludAkJY2xlYXJpbmc7CS8qIGV2ZW50cyBiZWluZyBjbGVhcmVkICovCisKKwlsb25nCQkJcG9sbF9tc2VjczsJLyogaW50ZXJ2YWwsIC0xIGZvciBkZWZhdWx0ICovCisJc3RydWN0IGRlbGF5ZWRfd29yawlkd29yazsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkaXNrX2V2ZW50c19zdHJzW10gPSB7CisJW2lsb2cyKERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFKV0JPSAibWVkaWFfY2hhbmdlIiwKKwlbaWxvZzIoRElTS19FVkVOVF9FSkVDVF9SRVFVRVNUKV0JPSAiZWplY3RfcmVxdWVzdCIsCit9OworCitzdGF0aWMgY2hhciAqZGlza191ZXZlbnRzW10gPSB7CisJW2lsb2cyKERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFKV0JPSAiRElTS19NRURJQV9DSEFOR0U9MSIsCisJW2lsb2cyKERJU0tfRVZFTlRfRUpFQ1RfUkVRVUVTVCldCT0gIkRJU0tfRUpFQ1RfUkVRVUVTVD0xIiwKK307CisKKy8qIGxpc3Qgb2YgYWxsIGRpc2tfZXZlbnRzICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2tfZXZlbnRzX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQoZGlza19ldmVudHMpOworCisvKiBkaXNhYmxlIGluLWtlcm5lbCBwb2xsaW5nIGJ5IGRlZmF1bHQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRpc2tfZXZlbnRzX2RmbF9wb2xsX21zZWNzCT0gMDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlza19ldmVudHNfcG9sbF9qaWZmaWVzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBkaXNrX2V2ZW50cyAqZXYgPSBkaXNrLT5ldjsKKwlsb25nIGludHZfbXNlY3MgPSAwOworCisJLyoKKwkgKiBJZiBkZXZpY2Utc3BlY2lmaWMgcG9sbCBpbnRlcnZhbCBpcyBzZXQsIGFsd2F5cyB1c2UgaXQuICBJZgorCSAqIHRoZSBkZWZhdWx0IGlzIGJlaW5nIHVzZWQsIHBvbGwgaWZmIHRoZXJlIGFyZSBldmVudHMgd2hpY2gKKwkgKiBjYW4ndCBiZSBtb25pdG9yZWQgYXN5bmNocm9ub3VzbHkuCisJICovCisJaWYgKGV2LT5wb2xsX21zZWNzID49IDApCisJCWludHZfbXNlY3MgPSBldi0+cG9sbF9tc2VjczsKKwllbHNlIGlmIChkaXNrLT5ldmVudHMgJiB+ZGlzay0+YXN5bmNfZXZlbnRzKQorCQlpbnR2X21zZWNzID0gZGlza19ldmVudHNfZGZsX3BvbGxfbXNlY3M7CisKKwlyZXR1cm4gbXNlY3NfdG9famlmZmllcyhpbnR2X21zZWNzKTsKK30KKworc3RhdGljIHZvaWQgX19kaXNrX2Jsb2NrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgYm9vbCBzeW5jKQoreworCXN0cnVjdCBkaXNrX2V2ZW50cyAqZXYgPSBkaXNrLT5ldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgY2FuY2VsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmV2LT5sb2NrLCBmbGFncyk7CisJY2FuY2VsID0gIWV2LT5ibG9jaysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2FuY2VsKSB7CisJCWlmIChzeW5jKQorCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaXNrLT5ldi0+ZHdvcmspOworCQllbHNlCisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZkaXNrLT5ldi0+ZHdvcmspOworCX0KK30KKworc3RhdGljIHZvaWQgX19kaXNrX3VuYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBib29sIGNoZWNrX25vdykKK3sKKwlzdHJ1Y3QgZGlza19ldmVudHMgKmV2ID0gZGlzay0+ZXY7CisJdW5zaWduZWQgbG9uZyBpbnR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChXQVJOX09OX09OQ0UoZXYtPmJsb2NrIDw9IDApKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoLS1ldi0+YmxvY2spCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qCisJICogTm90IGV4YWN0bHkgYSBsYXRlbmN5IGNyaXRpY2FsIG9wZXJhdGlvbiwgc2V0IHBvbGwgdGltZXIKKwkgKiBzbGFjayB0byAyNSUgYW5kIGtpY2sgZXZlbnQgY2hlY2suCisJICovCisJaW50diA9IGRpc2tfZXZlbnRzX3BvbGxfamlmZmllcyhkaXNrKTsKKwlzZXRfdGltZXJfc2xhY2soJmV2LT5kd29yay50aW1lciwgaW50diAvIDQpOworCWlmIChjaGVja19ub3cpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbnJ0X3dxLCAmZXYtPmR3b3JrLCAwKTsKKwllbHNlIGlmIChpbnR2KQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX25ydF93cSwgJmV2LT5kd29yaywgaW50dik7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogZGlza19ibG9ja19ldmVudHMgLSBibG9jayBhbmQgZmx1c2ggZGlzayBldmVudCBjaGVja2luZworICogQGRpc2s6IGRpc2sgdG8gYmxvY2sgZXZlbnRzIGZvcgorICoKKyAqIE9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24sIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBldmVudCBjaGVja2luZworICogaXNuJ3QgaW4gcHJvZ3Jlc3MgYW5kIHdvbid0IGhhcHBlbiB1bnRpbCB1bmJsb2NrZWQgYnkKKyAqIGRpc2tfdW5ibG9ja19ldmVudHMoKS4gIEV2ZW50cyBibG9ja2luZyBpcyBjb3VudGVkIGFuZCB0aGUgYWN0dWFsCisgKiB1bmJsb2NraW5nIGhhcHBlbnMgYWZ0ZXIgdGhlIG1hdGNoaW5nIG51bWJlciBvZiB1bmJsb2NrcyBhcmUgZG9uZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGJsb2NrIGV2ZW50IGNoZWNraW5nIGZyb20KKyAqIGRpc2tfY2xlYXJfZXZlbnRzKCkuCisgKgorICogQ09OVEVYVDoKKyAqIE1pZ2h0IHNsZWVwLgorICovCit2b2lkIGRpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCWlmIChkaXNrLT5ldikKKwkJX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKK30KKworLyoqCisgKiBkaXNrX3VuYmxvY2tfZXZlbnRzIC0gdW5ibG9jayBkaXNrIGV2ZW50IGNoZWNraW5nCisgKiBAZGlzazogZGlzayB0byB1bmJsb2NrIGV2ZW50cyBmb3IKKyAqCisgKiBVbmRvIGRpc2tfYmxvY2tfZXZlbnRzKCkuICBXaGVuIHRoZSBibG9jayBjb3VudCByZWFjaGVzIHplcm8sIGl0CisgKiBzdGFydHMgZXZlbnRzIHBvbGxpbmcgaWYgY29uZmlndXJlZC4KKyAqCisgKiBDT05URVhUOgorICogRG9uJ3QgY2FyZS4gIFNhZmUgdG8gY2FsbCBmcm9tIGlycSBjb250ZXh0LgorICovCit2b2lkIGRpc2tfdW5ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJaWYgKGRpc2stPmV2KQorCQlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7Cit9CisKKy8qKgorICogZGlza19jaGVja19ldmVudHMgLSBzY2hlZHVsZSBpbW1lZGlhdGUgZXZlbnQgY2hlY2tpbmcKKyAqIEBkaXNrOiBkaXNrIHRvIGNoZWNrIGV2ZW50cyBmb3IKKyAqCisgKiBTY2hlZHVsZSBpbW1lZGlhdGUgZXZlbnQgY2hlY2tpbmcgb24gQGRpc2sgaWYgbm90IGJsb2NrZWQuCisgKgorICogQ09OVEVYVDoKKyAqIERvbid0IGNhcmUuICBTYWZlIHRvIGNhbGwgZnJvbSBpcnEgY29udGV4dC4KKyAqLwordm9pZCBkaXNrX2NoZWNrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlpZiAoZGlzay0+ZXYpIHsKKwkJX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCBmYWxzZSk7CisJCV9fZGlza191bmJsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkaXNrX2NoZWNrX2V2ZW50cyk7CisKKy8qKgorICogZGlza19jbGVhcl9ldmVudHMgLSBzeW5jaHJvbm91c2x5IGNoZWNrLCBjbGVhciBhbmQgcmV0dXJuIHBlbmRpbmcgZXZlbnRzCisgKiBAZGlzazogZGlzayB0byBmZXRjaCBhbmQgY2xlYXIgZXZlbnRzIGZyb20KKyAqIEBtYXNrOiBtYXNrIG9mIGV2ZW50cyB0byBiZSBmZXRjaGVkIGFuZCBjbGVhcnRlZAorICoKKyAqIERpc2sgZXZlbnRzIGFyZSBzeW5jaHJvbm91c2x5IGNoZWNrZWQgYW5kIHBlbmRpbmcgZXZlbnRzIGluIEBtYXNrCisgKiBhcmUgY2xlYXJlZCBhbmQgcmV0dXJuZWQuICBUaGlzIGlnbm9yZXMgdGhlIGJsb2NrIGNvdW50LgorICoKKyAqIENPTlRFWFQ6CisgKiBNaWdodCBzbGVlcC4KKyAqLwordW5zaWduZWQgaW50IGRpc2tfY2xlYXJfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgKmJkb3BzID0gZGlzay0+Zm9wczsKKwlzdHJ1Y3QgZGlza19ldmVudHMgKmV2ID0gZGlzay0+ZXY7CisJdW5zaWduZWQgaW50IHBlbmRpbmc7CisKKwlpZiAoIWV2KSB7CisJCS8qIGZvciBkcml2ZXJzIHN0aWxsIHVzaW5nIHRoZSBvbGQgLT5tZWRpYV9jaGFuZ2VkIG1ldGhvZCAqLworCQlpZiAoKG1hc2sgJiBESVNLX0VWRU5UX01FRElBX0NIQU5HRSkgJiYKKwkJICAgIGJkb3BzLT5tZWRpYV9jaGFuZ2VkICYmIGJkb3BzLT5tZWRpYV9jaGFuZ2VkKGRpc2spKQorCQkJcmV0dXJuIERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0ZWxsIHRoZSB3b3JrZm4gYWJvdXQgdGhlIGV2ZW50cyBiZWluZyBjbGVhcmVkICovCisJc3Bpbl9sb2NrX2lycSgmZXYtPmxvY2spOworCWV2LT5jbGVhcmluZyB8PSBtYXNrOworCXNwaW5fdW5sb2NrX2lycSgmZXYtPmxvY2spOworCisJLyogdW5jb25kdGlvbmFsbHkgc2NoZWR1bGUgZXZlbnQgY2hlY2sgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCAqLworCV9fZGlza19ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZldi0+ZHdvcmssIDApOworCWZsdXNoX2RlbGF5ZWRfd29yaygmZXYtPmR3b3JrKTsKKwlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgZmFsc2UpOworCisJLyogdGhlbiwgZmV0Y2ggYW5kIGNsZWFyIHBlbmRpbmcgZXZlbnRzICovCisJc3Bpbl9sb2NrX2lycSgmZXYtPmxvY2spOworCVdBUk5fT05fT05DRShldi0+Y2xlYXJpbmcgJiBtYXNrKTsJLyogY2xlYXJlZCBieSB3b3JrZm4gKi8KKwlwZW5kaW5nID0gZXYtPnBlbmRpbmcgJiBtYXNrOworCWV2LT5wZW5kaW5nICY9IH5tYXNrOworCXNwaW5fdW5sb2NrX2lycSgmZXYtPmxvY2spOworCisJcmV0dXJuIHBlbmRpbmc7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2tfZXZlbnRzX3dvcmtmbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IGRpc2tfZXZlbnRzICpldiA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGRpc2tfZXZlbnRzLCBkd29yayk7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBldi0+ZGlzazsKKwljaGFyICplbnZwW0FSUkFZX1NJWkUoZGlza191ZXZlbnRzKSArIDFdID0geyB9OworCXVuc2lnbmVkIGludCBjbGVhcmluZyA9IGV2LT5jbGVhcmluZzsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzOworCXVuc2lnbmVkIGxvbmcgaW50djsKKwlpbnQgbnJfZXZlbnRzID0gMCwgaTsKKworCS8qIGNoZWNrIGV2ZW50cyAqLworCWV2ZW50cyA9IGRpc2stPmZvcHMtPmNoZWNrX2V2ZW50cyhkaXNrLCBjbGVhcmluZyk7CisKKwkvKiBhY2N1bXVsYXRlIHBlbmRpbmcgZXZlbnRzIGFuZCBzY2hlZHVsZSBuZXh0IHBvbGwgaWYgbmVjZXNzYXJ5ICovCisJc3Bpbl9sb2NrX2lycSgmZXYtPmxvY2spOworCisJZXZlbnRzICY9IH5ldi0+cGVuZGluZzsKKwlldi0+cGVuZGluZyB8PSBldmVudHM7CisJZXYtPmNsZWFyaW5nICY9IH5jbGVhcmluZzsKKworCWludHYgPSBkaXNrX2V2ZW50c19wb2xsX2ppZmZpZXMoZGlzayk7CisJaWYgKCFldi0+YmxvY2sgJiYgaW50dikKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZldi0+ZHdvcmssIGludHYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZldi0+bG9jayk7CisKKwkvKiB0ZWxsIHVzZXJsYW5kIGFib3V0IG5ldyBldmVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkaXNrX3VldmVudHMpOyBpKyspCisJCWlmIChldmVudHMgJiAoMSA8PCBpKSkKKwkJCWVudnBbbnJfZXZlbnRzKytdID0gZGlza191ZXZlbnRzW2ldOworCisJaWYgKG5yX2V2ZW50cykKKwkJa29iamVjdF91ZXZlbnRfZW52KCZkaXNrX3RvX2RldihkaXNrKS0+a29iaiwgS09CSl9DSEFOR0UsIGVudnApOworfQorCisvKgorICogQSBkaXNrIGV2ZW50cyBlbmFibGVkIGRldmljZSBoYXMgdGhlIGZvbGxvd2luZyBzeXNmcyBub2RlcyB1bmRlcgorICogaXRzIC9zeXMvYmxvY2svWC8gZGlyZWN0b3J5LgorICoKKyAqIGV2ZW50cwkJOiBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgZXZlbnRzCisgKiBldmVudHNfYXN5bmMJCTogbGlzdCBvZiBldmVudHMgd2hpY2ggY2FuIGJlIGRldGVjdGVkIHcvbyBwb2xsaW5nCisgKiBldmVudHNfcG9sbF9tc2Vjcwk6IHBvbGxpbmcgaW50ZXJ2YWwsIDA6IGRpc2FibGUsIC0xOiBzeXN0ZW0gZGVmYXVsdAorICovCitzdGF0aWMgc3NpemVfdCBfX2Rpc2tfZXZlbnRzX3Nob3codW5zaWduZWQgaW50IGV2ZW50cywgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmRlbGltID0gIiI7CisJc3NpemVfdCBwb3MgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGlza19ldmVudHNfc3Rycyk7IGkrKykKKwkJaWYgKGV2ZW50cyAmICgxIDw8IGkpKSB7CisJCQlwb3MgKz0gc3ByaW50ZihidWYgKyBwb3MsICIlcyVzIiwKKwkJCQkgICAgICAgZGVsaW0sIGRpc2tfZXZlbnRzX3N0cnNbaV0pOworCQkJZGVsaW0gPSAiICI7CisJCX0KKwlpZiAocG9zKQorCQlwb3MgKz0gc3ByaW50ZihidWYgKyBwb3MsICJcbiIpOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc2tfZXZlbnRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCisJcmV0dXJuIF9fZGlza19ldmVudHNfc2hvdyhkaXNrLT5ldmVudHMsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc2tfZXZlbnRzX2FzeW5jX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCisJcmV0dXJuIF9fZGlza19ldmVudHNfc2hvdyhkaXNrLT5hc3luY19ldmVudHMsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc2tfZXZlbnRzX3BvbGxfbXNlY3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkaXNrLT5ldi0+cG9sbF9tc2Vjcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRpc2tfZXZlbnRzX3BvbGxfbXNlY3Nfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CisJbG9uZyBpbnR2OworCisJaWYgKCFjb3VudCB8fCAhc3NjYW5mKGJ1ZiwgIiVsZCIsICZpbnR2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW50diA8IDAgJiYgaW50diAhPSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX2Rpc2tfYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOworCWRpc2stPmV2LT5wb2xsX21zZWNzID0gaW50djsKKwlfX2Rpc2tfdW5ibG9ja19ldmVudHMoZGlzaywgdHJ1ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBERVZJQ0VfQVRUUihldmVudHMsIFNfSVJVR08sIGRpc2tfZXZlbnRzX3Nob3csIE5VTEwpOworc3RhdGljIGNvbnN0IERFVklDRV9BVFRSKGV2ZW50c19hc3luYywgU19JUlVHTywgZGlza19ldmVudHNfYXN5bmNfc2hvdywgTlVMTCk7CitzdGF0aWMgY29uc3QgREVWSUNFX0FUVFIoZXZlbnRzX3BvbGxfbXNlY3MsIFNfSVJVR098U19JV1VTUiwKKwkJCSBkaXNrX2V2ZW50c19wb2xsX21zZWNzX3Nob3csCisJCQkgZGlza19ldmVudHNfcG9sbF9tc2Vjc19zdG9yZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpkaXNrX2V2ZW50c19hdHRyc1tdID0geworCSZkZXZfYXR0cl9ldmVudHMuYXR0ciwKKwkmZGV2X2F0dHJfZXZlbnRzX2FzeW5jLmF0dHIsCisJJmRldl9hdHRyX2V2ZW50c19wb2xsX21zZWNzLmF0dHIsCisJTlVMTCwKK307CisKKy8qCisgKiBUaGUgZGVmYXVsdCBwb2xsaW5nIGludGVydmFsIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIGtlcm5lbAorICogcGFyYW1ldGVyIGJsb2NrLmV2ZW50c19kZmxfcG9sbF9tc2VjcyB3aGljaCBkZWZhdWx0cyB0byAwCisgKiAoZGlzYWJsZSkuICBUaGlzIGNhbiBhbHNvIGJlIG1vZGlmaWVkIHJ1bnRpbWUgYnkgd3JpdGluZyB0bworICogL3N5cy9tb2R1bGUvYmxvY2svZXZlbnRzX2RmbF9wb2xsX21zZWNzLgorICovCitzdGF0aWMgaW50IGRpc2tfZXZlbnRzX3NldF9kZmxfcG9sbF9tc2Vjcyhjb25zdCBjaGFyICp2YWwsCisJCQkJCSAgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJc3RydWN0IGRpc2tfZXZlbnRzICpldjsKKwlpbnQgcmV0OworCisJcmV0ID0gcGFyYW1fc2V0X3Vsb25nKHZhbCwga3ApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmZGlza19ldmVudHNfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldiwgJmRpc2tfZXZlbnRzLCBub2RlKQorCQlkaXNrX2NoZWNrX2V2ZW50cyhldi0+ZGlzayk7CisKKwltdXRleF91bmxvY2soJmRpc2tfZXZlbnRzX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgZGlza19ldmVudHNfZGZsX3BvbGxfbXNlY3NfcGFyYW1fb3BzID0geworCS5zZXQJPSBkaXNrX2V2ZW50c19zZXRfZGZsX3BvbGxfbXNlY3MsCisJLmdldAk9IHBhcmFtX2dldF91bG9uZywKK307CisKKyN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCisjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVgJImJsb2NrLiIKKworbW9kdWxlX3BhcmFtX2NiKGV2ZW50c19kZmxfcG9sbF9tc2VjcywgJmRpc2tfZXZlbnRzX2RmbF9wb2xsX21zZWNzX3BhcmFtX29wcywKKwkJJmRpc2tfZXZlbnRzX2RmbF9wb2xsX21zZWNzLCAwNjQ0KTsKKworLyoKKyAqIGRpc2tfe2FkZHxkZWx8cmVsZWFzZX1fZXZlbnRzIC0gaW5pdGlhbGl6ZSBhbmQgZGVzdHJveSBkaXNrX2V2ZW50cy4KKyAqLworc3RhdGljIHZvaWQgZGlza19hZGRfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBkaXNrX2V2ZW50cyAqZXY7CisKKwlpZiAoIWRpc2stPmZvcHMtPmNoZWNrX2V2ZW50cyB8fCAhKGRpc2stPmV2ZW50cyB8IGRpc2stPmFzeW5jX2V2ZW50cykpCisJCXJldHVybjsKKworCWV2ID0ga3phbGxvYyhzaXplb2YoKmV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFldikgeworCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGluaXRpYWxpemUgZXZlbnRzXG4iLCBkaXNrLT5kaXNrX25hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN5c2ZzX2NyZWF0ZV9maWxlcygmZGlza190b19kZXYoZGlzayktPmtvYmosCisJCQkgICAgICAgZGlza19ldmVudHNfYXR0cnMpIDwgMCkgeworCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlcyBmb3IgZXZlbnRzXG4iLAorCQkJZGlzay0+ZGlza19uYW1lKTsKKwkJa2ZyZWUoZXYpOworCQlyZXR1cm47CisJfQorCisJZGlzay0+ZXYgPSBldjsKKworCUlOSVRfTElTVF9IRUFEKCZldi0+bm9kZSk7CisJZXYtPmRpc2sgPSBkaXNrOworCXNwaW5fbG9ja19pbml0KCZldi0+bG9jayk7CisJZXYtPmJsb2NrID0gMTsKKwlldi0+cG9sbF9tc2VjcyA9IC0xOworCUlOSVRfREVMQVlFRF9XT1JLKCZldi0+ZHdvcmssIGRpc2tfZXZlbnRzX3dvcmtmbik7CisKKwltdXRleF9sb2NrKCZkaXNrX2V2ZW50c19tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmZXYtPm5vZGUsICZkaXNrX2V2ZW50cyk7CisJbXV0ZXhfdW5sb2NrKCZkaXNrX2V2ZW50c19tdXRleCk7CisKKwkvKgorCSAqIEJsb2NrIGNvdW50IGlzIGluaXRpYWxpemVkIHRvIDEgYW5kIHRoZSBmb2xsb3dpbmcgaW5pdGlhbAorCSAqIHVuYmxvY2sga2lja3MgaXQgaW50byBhY3Rpb24uCisJICovCisJX19kaXNrX3VuYmxvY2tfZXZlbnRzKGRpc2ssIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBkaXNrX2RlbF9ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJaWYgKCFkaXNrLT5ldikKKwkJcmV0dXJuOworCisJX19kaXNrX2Jsb2NrX2V2ZW50cyhkaXNrLCB0cnVlKTsKKworCW11dGV4X2xvY2soJmRpc2tfZXZlbnRzX211dGV4KTsKKwlsaXN0X2RlbF9pbml0KCZkaXNrLT5ldi0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZkaXNrX2V2ZW50c19tdXRleCk7CisKKwlzeXNmc19yZW1vdmVfZmlsZXMoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqLCBkaXNrX2V2ZW50c19hdHRycyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2tfcmVsZWFzZV9ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJLyogdGhlIGJsb2NrIGNvdW50IHNob3VsZCBiZSAxIGZyb20gZGlza19kZWxfZXZlbnRzKCkgKi8KKwlXQVJOX09OX09OQ0UoZGlzay0+ZXYgJiYgZGlzay0+ZXYtPmJsb2NrICE9IDEpOworCWtmcmVlKGRpc2stPmV2KTsKK30KZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IGE5YTMwMmUuLjkwNDlkNDYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtMjk0LDExICsyOTQsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoZ2V0X3VzZXIobiwgKGludCBfX3VzZXIgKikgYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoIShtb2RlICYgRk1PREVfRVhDTCkgJiYgYmRfY2xhaW0oYmRldiwgJmJkZXYpIDwgMCkKKwkJaWYgKCEobW9kZSAmIEZNT0RFX0VYQ0wpICYmCisJCSAgICBibGtkZXZfZ2V0KGJkZXYsIG1vZGUgfCBGTU9ERV9FWENMLCAmYmRldikgPCAwKQogCQkJcmV0dXJuIC1FQlVTWTsKIAkJcmV0ID0gc2V0X2Jsb2Nrc2l6ZShiZGV2LCBuKTsKIAkJaWYgKCEobW9kZSAmIEZNT0RFX0VYQ0wpKQotCQkJYmRfcmVsZWFzZShiZGV2KTsKKwkJCWJsa2Rldl9wdXQoYmRldiwgbW9kZSB8IEZNT0RFX0VYQ0wpOwogCQlyZXR1cm4gcmV0OwogCWNhc2UgQkxLUEc6CiAJCXJldCA9IGJsa3BnX2lvY3RsKGJkZXYsIChzdHJ1Y3QgYmxrcGdfaW9jdGxfYXJnIF9fdXNlciAqKSBhcmcpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCBlNGJhYzI5Li40YjdjYjBlIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMTEwLDcgKzExMCw2IEBACiAKIGNvbmZpZyBDUllQVE9fR0YxMjhNVUwKIAl0cmlzdGF0ZSAiR0YoMl4xMjgpIG11bHRpcGxpY2F0aW9uIGZ1bmN0aW9ucyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIEVmZmljaWVudCB0YWJsZSBkcml2ZW4gaW1wbGVtZW50YXRpb24gb2YgbXVsdGlwbGljYXRpb25zIGluIHRoZQogCSAgZmllbGQgR0YoMl4xMjgpLiAgVGhpcyBpcyBuZWVkZWQgYnkgc29tZSBjeXBoZXIgbW9kZXMuIFRoaXMKQEAgLTUzOSw4ICs1MzgsOSBAQAogCiBjb25maWcgQ1JZUFRPX0FFU19OSV9JTlRFTAogCXRyaXN0YXRlICJBRVMgY2lwaGVyIGFsZ29yaXRobXMgKEFFUy1OSSkiCi0JZGVwZW5kcyBvbiAoWDg2IHx8IFVNTF9YODYpICYmIDY0QklUCi0Jc2VsZWN0IENSWVBUT19BRVNfWDg2XzY0CisJZGVwZW5kcyBvbiAoWDg2IHx8IFVNTF9YODYpCisJc2VsZWN0IENSWVBUT19BRVNfWDg2XzY0IGlmIDY0QklUCisJc2VsZWN0IENSWVBUT19BRVNfNTg2IGlmICE2NEJJVAogCXNlbGVjdCBDUllQVE9fQ1JZUFRECiAJc2VsZWN0IENSWVBUT19BTEdBUEkKIAlzZWxlY3QgQ1JZUFRPX0ZQVQpAQCAtNTYzLDkgKzU2MywxMCBAQAogCiAJICBTZWUgPGh0dHA6Ly9jc3JjLm5pc3QuZ292L2VuY3J5cHRpb24vYWVzLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLQkgIEluIGFkZGl0aW9uIHRvIEFFUyBjaXBoZXIgYWxnb3JpdGhtIHN1cHBvcnQsIHRoZQotCSAgYWNjZWxlcmF0aW9uIGZvciBzb21lIHBvcHVsYXIgYmxvY2sgY2lwaGVyIG1vZGUgaXMgc3VwcG9ydGVkCi0JICB0b28sIGluY2x1ZGluZyBFQ0IsIENCQywgQ1RSLCBMUlcsIFBDQkMsIFhUUy4KKwkgIEluIGFkZGl0aW9uIHRvIEFFUyBjaXBoZXIgYWxnb3JpdGhtIHN1cHBvcnQsIHRoZSBhY2NlbGVyYXRpb24KKwkgIGZvciBzb21lIHBvcHVsYXIgYmxvY2sgY2lwaGVyIG1vZGUgaXMgc3VwcG9ydGVkIHRvbywgaW5jbHVkaW5nCisJICBFQ0IsIENCQywgTFJXLCBQQ0JDLCBYVFMuIFRoZSA2NCBiaXQgdmVyc2lvbiBoYXMgYWRkaXRpb25hbAorCSAgYWNjZWxlcmF0aW9uIGZvciBDVFIuCiAKIGNvbmZpZyBDUllQVE9fQU5VQklTCiAJdHJpc3RhdGUgIkFudWJpcyBjaXBoZXIgYWxnb3JpdGhtIgpAQCAtODQxLDYgKzg0MiwyNyBAQAogCSAgQU5TSSBYOS4zMSBBLjIuNC4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG11c3QgYmUgZW5hYmxlZCBpZgogCSAgQ1JZUFRPX0ZJUFMgaXMgc2VsZWN0ZWQKIAorY29uZmlnIENSWVBUT19VU0VSX0FQSQorCXRyaXN0YXRlCisKK2NvbmZpZyBDUllQVE9fVVNFUl9BUElfSEFTSAorCXRyaXN0YXRlICJVc2VyLXNwYWNlIGludGVyZmFjZSBmb3IgaGFzaCBhbGdvcml0aG1zIgorCWRlcGVuZHMgb24gTkVUCisJc2VsZWN0IENSWVBUT19IQVNICisJc2VsZWN0IENSWVBUT19VU0VSX0FQSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIHVzZXItc3BhY2VzIGludGVyZmFjZSBmb3IgaGFzaAorCSAgYWxnb3JpdGhtcy4KKworY29uZmlnIENSWVBUT19VU0VSX0FQSV9TS0NJUEhFUgorCXRyaXN0YXRlICJVc2VyLXNwYWNlIGludGVyZmFjZSBmb3Igc3ltbWV0cmljIGtleSBjaXBoZXIgYWxnb3JpdGhtcyIKKwlkZXBlbmRzIG9uIE5FVAorCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19VU0VSX0FQSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIHVzZXItc3BhY2VzIGludGVyZmFjZSBmb3Igc3ltbWV0cmljCisJICBrZXkgY2lwaGVyIGFsZ29yaXRobXMuCisKIHNvdXJjZSAiZHJpdmVycy9jcnlwdG8vS2NvbmZpZyIKIAogZW5kaWYJIyBpZiBDUllQVE8KZGlmZiAtLWdpdCBhL2NyeXB0by9NYWtlZmlsZSBiL2NyeXB0by9NYWtlZmlsZQppbmRleCA0MjNiN2RlLi5lOWEzOTljIDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKKysrIGIvY3J5cHRvL01ha2VmaWxlCkBAIC0zLDMyICszLDMyIEBACiAjCiAKIG9iai0kKENPTkZJR19DUllQVE8pICs9IGNyeXB0by5vCi1jcnlwdG8tb2JqcyA6PSBhcGkubyBjaXBoZXIubyBjb21wcmVzcy5vCitjcnlwdG8teSA6PSBhcGkubyBjaXBoZXIubyBjb21wcmVzcy5vCiAKIG9iai0kKENPTkZJR19DUllQVE9fV09SS1FVRVVFKSArPSBjcnlwdG9fd3EubwogCiBvYmotJChDT05GSUdfQ1JZUFRPX0ZJUFMpICs9IGZpcHMubwogCiBjcnlwdG9fYWxnYXBpLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2MubwotY3J5cHRvX2FsZ2FwaS1vYmpzIDo9IGFsZ2FwaS5vIHNjYXR0ZXJ3YWxrLm8gJChjcnlwdG9fYWxnYXBpLXkpCitjcnlwdG9fYWxnYXBpLXkgOj0gYWxnYXBpLm8gc2NhdHRlcndhbGsubyAkKGNyeXB0b19hbGdhcGkteSkKIG9iai0kKENPTkZJR19DUllQVE9fQUxHQVBJMikgKz0gY3J5cHRvX2FsZ2FwaS5vCiAKIG9iai0kKENPTkZJR19DUllQVE9fQUVBRDIpICs9IGFlYWQubwogCi1jcnlwdG9fYmxrY2lwaGVyLW9ianMgOj0gYWJsa2NpcGhlci5vCi1jcnlwdG9fYmxrY2lwaGVyLW9ianMgKz0gYmxrY2lwaGVyLm8KK2NyeXB0b19ibGtjaXBoZXIteSA6PSBhYmxrY2lwaGVyLm8KK2NyeXB0b19ibGtjaXBoZXIteSArPSBibGtjaXBoZXIubwogb2JqLSQoQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyKSArPSBjcnlwdG9fYmxrY2lwaGVyLm8KIG9iai0kKENPTkZJR19DUllQVE9fQkxLQ0lQSEVSMikgKz0gY2hhaW5pdi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjIpICs9IGVzZXFpdi5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NFUUlWKSArPSBzZXFpdi5vCiAKLWNyeXB0b19oYXNoLW9ianMgKz0gYWhhc2gubwotY3J5cHRvX2hhc2gtb2JqcyArPSBzaGFzaC5vCitjcnlwdG9faGFzaC15ICs9IGFoYXNoLm8KK2NyeXB0b19oYXNoLXkgKz0gc2hhc2gubwogb2JqLSQoQ09ORklHX0NSWVBUT19IQVNIMikgKz0gY3J5cHRvX2hhc2gubwogCiBvYmotJChDT05GSUdfQ1JZUFRPX1BDT01QMikgKz0gcGNvbXByZXNzLm8KIAotY3J5cHRvbWdyLW9ianMgOj0gYWxnYm9zcy5vIHRlc3RtZ3IubworY3J5cHRvbWdyLXkgOj0gYWxnYm9zcy5vIHRlc3RtZ3IubwogCiBvYmotJChDT05GSUdfQ1JZUFRPX01BTkFHRVIyKSArPSBjcnlwdG9tZ3Iubwogb2JqLSQoQ09ORklHX0NSWVBUT19ITUFDKSArPSBobWFjLm8KQEAgLTg1LDYgKzg1LDkgQEAKIG9iai0kKENPTkZJR19DUllQVE9fQU5TSV9DUFJORykgKz0gYW5zaV9jcHJuZy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1RFU1QpICs9IHRjcnlwdC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0dIQVNIKSArPSBnaGFzaC1nZW5lcmljLm8KK29iai0kKENPTkZJR19DUllQVE9fVVNFUl9BUEkpICs9IGFmX2FsZy5vCitvYmotJChDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0gpICs9IGFsZ2lmX2hhc2gubworb2JqLSQoQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUikgKz0gYWxnaWZfc2tjaXBoZXIubwogCiAjCiAjIGdlbmVyaWMgYWxnb3JpdGhtcyBhbmQgdGhlIGFzeW5jX3R4IGFwaQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FmX2FsZy5jIGIvY3J5cHRvL2FmX2FsZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MGQ3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYWZfYWxnLmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qCisgKiBhZl9hbGc6IFVzZXItc3BhY2UgYWxnb3JpdGhtIGludGVyZmFjZQorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgdXNlci1zcGFjZSBBUEkgZm9yIGFsZ29yaXRobXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGNyeXB0by9pZl9hbGcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKK3N0cnVjdCBhbGdfdHlwZV9saXN0IHsKKwljb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RhdGljIGF0b21pY19sb25nX3QgYWxnX21lbW9yeV9hbGxvY2F0ZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG8gYWxnX3Byb3RvID0geworCS5uYW1lCQkJPSAiQUxHIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5tZW1vcnlfYWxsb2NhdGVkCT0gJmFsZ19tZW1vcnlfYWxsb2NhdGVkLAorCS5vYmpfc2l6ZQkJPSBzaXplb2Yoc3RydWN0IGFsZ19zb2NrKSwKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYWxnX3R5cGVzKTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGFsZ190eXBlc19zZW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmX2FsZ190eXBlICphbGdfZ2V0X3R5cGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGUgPSBFUlJfUFRSKC1FTk9FTlQpOworCXN0cnVjdCBhbGdfdHlwZV9saXN0ICpub2RlOworCisJZG93bl9yZWFkKCZhbGdfdHlwZXNfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZhbGdfdHlwZXMsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChub2RlLT50eXBlLT5uYW1lLCBuYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0cnlfbW9kdWxlX2dldChub2RlLT50eXBlLT5vd25lcikpCisJCQl0eXBlID0gbm9kZS0+dHlwZTsKKwkJYnJlYWs7CisJfQorCXVwX3JlYWQoJmFsZ190eXBlc19zZW0pOworCisJcmV0dXJuIHR5cGU7Cit9CisKK2ludCBhZl9hbGdfcmVnaXN0ZXJfdHlwZShjb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGUpCit7CisJc3RydWN0IGFsZ190eXBlX2xpc3QgKm5vZGU7CisJaW50IGVyciA9IC1FRVhJU1Q7CisKKwlkb3duX3dyaXRlKCZhbGdfdHlwZXNfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZhbGdfdHlwZXMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAobm9kZS0+dHlwZS0+bmFtZSwgdHlwZS0+bmFtZSkpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlub2RlID0ga21hbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghbm9kZSkKKwkJZ290byB1bmxvY2s7CisKKwl0eXBlLT5vcHMtPm93bmVyID0gVEhJU19NT0RVTEU7CisJbm9kZS0+dHlwZSA9IHR5cGU7CisJbGlzdF9hZGQoJm5vZGUtPmxpc3QsICZhbGdfdHlwZXMpOworCWVyciA9IDA7CisKK3VubG9jazoKKwl1cF93cml0ZSgmYWxnX3R5cGVzX3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX3JlZ2lzdGVyX3R5cGUpOworCitpbnQgYWZfYWxnX3VucmVnaXN0ZXJfdHlwZShjb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGUpCit7CisJc3RydWN0IGFsZ190eXBlX2xpc3QgKm5vZGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlkb3duX3dyaXRlKCZhbGdfdHlwZXNfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZhbGdfdHlwZXMsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChub2RlLT50eXBlLT5uYW1lLCB0eXBlLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKKwkJa2ZyZWUobm9kZSk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKwl1cF93cml0ZSgmYWxnX3R5cGVzX3NlbSk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX3VucmVnaXN0ZXJfdHlwZSk7CisKK3N0YXRpYyB2b2lkIGFsZ19kb19yZWxlYXNlKGNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSAqdHlwZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlpZiAoIXR5cGUpCisJCXJldHVybjsKKworCXR5cGUtPnJlbGVhc2UocHJpdmF0ZSk7CisJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Cit9CisKK2ludCBhZl9hbGdfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCWlmIChzb2NrLT5zaykKKwkJc29ja19wdXQoc29jay0+c2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX3JlbGVhc2UpOworCitzdGF0aWMgaW50IGFsZ19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCBhZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNvY2thZGRyX2FsZyAqc2EgPSAodm9pZCAqKXVhZGRyOworCWNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSAqdHlwZTsKKwl2b2lkICpwcml2YXRlOworCisJaWYgKHNvY2stPnN0YXRlID09IFNTX0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKCpzYSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc2EtPnNhbGdfdHlwZVtzaXplb2Yoc2EtPnNhbGdfdHlwZSkgLSAxXSA9IDA7CisJc2EtPnNhbGdfbmFtZVtzaXplb2Yoc2EtPnNhbGdfbmFtZSkgLSAxXSA9IDA7CisKKwl0eXBlID0gYWxnX2dldF90eXBlKHNhLT5zYWxnX3R5cGUpOworCWlmIChJU19FUlIodHlwZSkgJiYgUFRSX0VSUih0eXBlKSA9PSAtRU5PRU5UKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJhbGdpZi0lcyIsIHNhLT5zYWxnX3R5cGUpOworCQl0eXBlID0gYWxnX2dldF90eXBlKHNhLT5zYWxnX3R5cGUpOworCX0KKworCWlmIChJU19FUlIodHlwZSkpCisJCXJldHVybiBQVFJfRVJSKHR5cGUpOworCisJcHJpdmF0ZSA9IHR5cGUtPmJpbmQoc2EtPnNhbGdfbmFtZSwgc2EtPnNhbGdfZmVhdCwgc2EtPnNhbGdfbWFzayk7CisJaWYgKElTX0VSUihwcml2YXRlKSkgeworCQltb2R1bGVfcHV0KHR5cGUtPm93bmVyKTsKKwkJcmV0dXJuIFBUUl9FUlIocHJpdmF0ZSk7CisJfQorCisJbG9ja19zb2NrKHNrKTsKKworCXN3YXAoYXNrLT50eXBlLCB0eXBlKTsKKwlzd2FwKGFzay0+cHJpdmF0ZSwgcHJpdmF0ZSk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCisJYWxnX2RvX3JlbGVhc2UodHlwZSwgcHJpdmF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGdfc2V0a2V5KHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKnVrZXksCisJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCWNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSAqdHlwZSA9IGFzay0+dHlwZTsKKwl1OCAqa2V5OworCWludCBlcnI7CisKKwlrZXkgPSBzb2NrX2ttYWxsb2Moc2ssIGtleWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXkpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoa2V5LCB1a2V5LCBrZXlsZW4pKQorCQlnb3RvIG91dDsKKworCWVyciA9IHR5cGUtPnNldGtleShhc2stPnByaXZhdGUsIGtleSwga2V5bGVuKTsKKworb3V0OgorCXNvY2tfa2ZyZWVfcyhzaywga2V5LCBrZXlsZW4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhbGdfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAorCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGU7CisJaW50IGVyciA9IC1FTk9QUk9UT09QVDsKKworCWxvY2tfc29jayhzayk7CisJdHlwZSA9IGFzay0+dHlwZTsKKworCWlmIChsZXZlbCAhPSBTT0xfQUxHIHx8ICF0eXBlKQorCQlnb3RvIHVubG9jazsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgQUxHX1NFVF9LRVk6CisJCWlmIChzb2NrLT5zdGF0ZSA9PSBTU19DT05ORUNURUQpCisJCQlnb3RvIHVubG9jazsKKwkJaWYgKCF0eXBlLT5zZXRrZXkpCisJCQlnb3RvIHVubG9jazsKKworCQllcnIgPSBhbGdfc2V0a2V5KHNrLCBvcHR2YWwsIG9wdGxlbik7CisJfQorCit1bmxvY2s6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBhZl9hbGdfYWNjZXB0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2tldCAqbmV3c29jaykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJY29uc3Qgc3RydWN0IGFmX2FsZ190eXBlICp0eXBlOworCXN0cnVjdCBzb2NrICpzazI7CisJaW50IGVycjsKKworCWxvY2tfc29jayhzayk7CisJdHlwZSA9IGFzay0+dHlwZTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKCF0eXBlKQorCQlnb3RvIHVubG9jazsKKworCXNrMiA9IHNrX2FsbG9jKHNvY2tfbmV0KHNrKSwgUEZfQUxHLCBHRlBfS0VSTkVMLCAmYWxnX3Byb3RvKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghc2syKQorCQlnb3RvIHVubG9jazsKKworCXNvY2tfaW5pdF9kYXRhKG5ld3NvY2ssIHNrMik7CisJc29ja19ncmFmdChzazIsIG5ld3NvY2spOworCisJZXJyID0gdHlwZS0+YWNjZXB0KGFzay0+cHJpdmF0ZSwgc2syKTsKKwlpZiAoZXJyKSB7CisJCXNrX2ZyZWUoc2syKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJc2syLT5za19mYW1pbHkgPSBQRl9BTEc7CisKKwlzb2NrX2hvbGQoc2spOworCWFsZ19zayhzazIpLT5wYXJlbnQgPSBzazsKKwlhbGdfc2soc2syKS0+dHlwZSA9IHR5cGU7CisKKwluZXdzb2NrLT5vcHMgPSB0eXBlLT5vcHM7CisJbmV3c29jay0+c3RhdGUgPSBTU19DT05ORUNURUQ7CisKKwllcnIgPSAwOworCit1bmxvY2s6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZl9hbGdfYWNjZXB0KTsKKworc3RhdGljIGludCBhbGdfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncykKK3sKKwlyZXR1cm4gYWZfYWxnX2FjY2VwdChzb2NrLT5zaywgbmV3c29jayk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIGFsZ19wcm90b19vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9BTEcsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCisJLmNvbm5lY3QJPQlzb2NrX25vX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIJPQlzb2NrX25vX3NvY2tldHBhaXIsCisJLmdldG5hbWUJPQlzb2NrX25vX2dldG5hbWUsCisJLmlvY3RsCQk9CXNvY2tfbm9faW9jdGwsCisJLmxpc3RlbgkJPQlzb2NrX25vX2xpc3RlbiwKKwkuc2h1dGRvd24JPQlzb2NrX25vX3NodXRkb3duLAorCS5nZXRzb2Nrb3B0CT0Jc29ja19ub19nZXRzb2Nrb3B0LAorCS5tbWFwCQk9CXNvY2tfbm9fbW1hcCwKKwkuc2VuZHBhZ2UJPQlzb2NrX25vX3NlbmRwYWdlLAorCS5zZW5kbXNnCT0Jc29ja19ub19zZW5kbXNnLAorCS5yZWN2bXNnCT0Jc29ja19ub19yZWN2bXNnLAorCS5wb2xsCQk9CXNvY2tfbm9fcG9sbCwKKworCS5iaW5kCQk9CWFsZ19iaW5kLAorCS5yZWxlYXNlCT0JYWZfYWxnX3JlbGVhc2UsCisJLnNldHNvY2tvcHQJPQlhbGdfc2V0c29ja29wdCwKKwkuYWNjZXB0CQk9CWFsZ19hY2NlcHQsCit9OworCitzdGF0aWMgdm9pZCBhbGdfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCisJYWxnX2RvX3JlbGVhc2UoYXNrLT50eXBlLCBhc2stPnByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGFsZ19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgcHJvdG9jb2wsCisJCSAgICAgIGludCBrZXJuKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgZXJyOworCisJaWYgKHNvY2stPnR5cGUgIT0gU09DS19TRVFQQUNLRVQpCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCWlmIChwcm90b2NvbCAhPSAwKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWVyciA9IC1FTk9NRU07CisJc2sgPSBza19hbGxvYyhuZXQsIFBGX0FMRywgR0ZQX0tFUk5FTCwgJmFsZ19wcm90byk7CisJaWYgKCFzaykKKwkJZ290byBvdXQ7CisKKwlzb2NrLT5vcHMgPSAmYWxnX3Byb3RvX29wczsKKwlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisKKwlzay0+c2tfZmFtaWx5ID0gUEZfQUxHOworCXNrLT5za19kZXN0cnVjdCA9IGFsZ19zb2NrX2Rlc3RydWN0OworCisJcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IGFsZ19mYW1pbHkgPSB7CisJLmZhbWlseQk9CVBGX0FMRywKKwkuY3JlYXRlCT0JYWxnX2NyZWF0ZSwKKwkub3duZXIJPQlUSElTX01PRFVMRSwKK307CisKK2ludCBhZl9hbGdfbWFrZV9zZyhzdHJ1Y3QgYWZfYWxnX3NnbCAqc2dsLCB2b2lkIF9fdXNlciAqYWRkciwgaW50IGxlbiwKKwkJICAgaW50IHdyaXRlKQoreworCXVuc2lnbmVkIGxvbmcgZnJvbSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CisJdW5zaWduZWQgb2ZmOworCWludCBlcnI7CisJaW50IGk7CisKKwllcnIgPSAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKHdyaXRlID8gVkVSSUZZX1JFQUQgOiBWRVJJRllfV1JJVEUsIGFkZHIsIGxlbikpCisJCWdvdG8gb3V0OworCisJb2ZmID0gZnJvbSAmIH5QQUdFX01BU0s7CisJbnBhZ2VzID0gKG9mZiArIGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJaWYgKG5wYWdlcyA+IEFMR19NQVhfUEFHRVMpCisJCW5wYWdlcyA9IEFMR19NQVhfUEFHRVM7CisKKwllcnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGZyb20sIG5wYWdlcywgd3JpdGUsIHNnbC0+cGFnZXMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKworCW5wYWdlcyA9IGVycjsKKwllcnIgPSAtRUlOVkFMOworCWlmIChXQVJOX09OKG5wYWdlcyA9PSAwKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCisJc2dfaW5pdF90YWJsZShzZ2wtPnNnLCBucGFnZXMpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWludCBwbGVuID0gbWluX3QoaW50LCBsZW4sIFBBR0VfU0laRSAtIG9mZik7CisKKwkJc2dfc2V0X3BhZ2Uoc2dsLT5zZyArIGksIHNnbC0+cGFnZXNbaV0sIHBsZW4sIG9mZik7CisKKwkJb2ZmID0gMDsKKwkJbGVuIC09IHBsZW47CisJCWVyciArPSBwbGVuOworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZl9hbGdfbWFrZV9zZyk7CisKK3ZvaWQgYWZfYWxnX2ZyZWVfc2coc3RydWN0IGFmX2FsZ19zZ2wgKnNnbCkKK3sKKwlpbnQgaTsKKworCWkgPSAwOworCWRvIHsKKwkJcHV0X3BhZ2Uoc2dsLT5wYWdlc1tpXSk7CisJfSB3aGlsZSAoIXNnX2lzX2xhc3Qoc2dsLT5zZyArIChpKyspKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZl9hbGdfZnJlZV9zZyk7CisKK2ludCBhZl9hbGdfY21zZ19zZW5kKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IGFmX2FsZ19jb250cm9sICpjb24pCit7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9BTEcpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2goY21zZy0+Y21zZ190eXBlKSB7CisJCWNhc2UgQUxHX1NFVF9JVjoKKwkJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZigqY29uLT5pdikpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJY29uLT5pdiA9ICh2b2lkICopQ01TR19EQVRBKGNtc2cpOworCQkJaWYgKGNtc2ctPmNtc2dfbGVuIDwgQ01TR19MRU4oY29uLT5pdi0+aXZsZW4gKworCQkJCQkJICAgICAgc2l6ZW9mKCpjb24tPml2KSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIEFMR19TRVRfT1A6CisJCQlpZiAoY21zZy0+Y21zZ19sZW4gPCBDTVNHX0xFTihzaXplb2YodTMyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljb24tPm9wID0gKih1MzIgKilDTVNHX0RBVEEoY21zZyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFmX2FsZ19jbXNnX3NlbmQpOworCitpbnQgYWZfYWxnX3dhaXRfZm9yX2NvbXBsZXRpb24oaW50IGVyciwgc3RydWN0IGFmX2FsZ19jb21wbGV0aW9uICpjb21wbGV0aW9uKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJY2FzZSAtRUJVU1k6CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsZXRpb24tPmNvbXBsZXRpb24pOworCQlJTklUX0NPTVBMRVRJT04oY29tcGxldGlvbi0+Y29tcGxldGlvbik7CisJCWVyciA9IGNvbXBsZXRpb24tPmVycjsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZl9hbGdfd2FpdF9mb3JfY29tcGxldGlvbik7CisKK3ZvaWQgYWZfYWxnX2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQoreworCXN0cnVjdCBhZl9hbGdfY29tcGxldGlvbiAqY29tcGxldGlvbiA9IHJlcS0+ZGF0YTsKKworCWNvbXBsZXRpb24tPmVyciA9IGVycjsKKwljb21wbGV0ZSgmY29tcGxldGlvbi0+Y29tcGxldGlvbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhZl9hbGdfY29tcGxldGUpOworCitzdGF0aWMgaW50IF9faW5pdCBhZl9hbGdfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSBwcm90b19yZWdpc3RlcigmYWxnX3Byb3RvLCAwKTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gc29ja19yZWdpc3RlcigmYWxnX2ZhbWlseSk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3Byb3RvOworCitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X3VucmVnaXN0ZXJfcHJvdG86CisJcHJvdG9fdW5yZWdpc3RlcigmYWxnX3Byb3RvKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFmX2FsZ19leGl0KHZvaWQpCit7CisJc29ja191bnJlZ2lzdGVyKFBGX0FMRyk7CisJcHJvdG9fdW5yZWdpc3RlcigmYWxnX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQoYWZfYWxnX2luaXQpOworbW9kdWxlX2V4aXQoYWZfYWxnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKEFGX0FMRyk7CmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnaWZfaGFzaC5jIGIvY3J5cHRvL2FsZ2lmX2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjEyMmExCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FsZ2lmX2hhc2guYwpAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIGFsZ2lmX2hhc2g6IFVzZXItc3BhY2UgaW50ZXJmYWNlIGZvciBoYXNoIGFsZ29yaXRobXMKKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIHVzZXItc3BhY2UgQVBJIGZvciBoYXNoIGFsZ29yaXRobXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vaWZfYWxnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworc3RydWN0IGhhc2hfY3R4IHsKKwlzdHJ1Y3QgYWZfYWxnX3NnbCBzZ2w7CisKKwl1OCAqcmVzdWx0OworCisJc3RydWN0IGFmX2FsZ19jb21wbGV0aW9uIGNvbXBsZXRpb247CisKKwl1bnNpZ25lZCBpbnQgbGVuOworCWJvb2wgbW9yZTsKKworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0IHJlcTsKK307CisKK3N0YXRpYyBpbnQgaGFzaF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqdW51c2VkLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgaWdub3JlZCkKK3sKKwlpbnQgbGltaXQgPSBBTEdfTUFYX1BBR0VTICogUEFHRV9TSVpFOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3QgaGFzaF9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGlvdmxlbjsKKwlzdHJ1Y3QgaW92ZWMgKmlvdjsKKwlsb25nIGNvcGllZCA9IDA7CisJaW50IGVycjsKKworCWlmIChsaW1pdCA+IHNrLT5za19zbmRidWYpCisJCWxpbWl0ID0gc2stPnNrX3NuZGJ1ZjsKKworCWxvY2tfc29jayhzayk7CisJaWYgKCFjdHgtPm1vcmUpIHsKKwkJZXJyID0gY3J5cHRvX2FoYXNoX2luaXQoJmN0eC0+cmVxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCWN0eC0+bW9yZSA9IDA7CisKKwlmb3IgKGlvdiA9IG1zZy0+bXNnX2lvdiwgaW92bGVuID0gbXNnLT5tc2dfaW92bGVuOyBpb3ZsZW4gPiAwOworCSAgICAgaW92bGVuLS0sIGlvdisrKSB7CisJCXVuc2lnbmVkIGxvbmcgc2VnbGVuID0gaW92LT5pb3ZfbGVuOworCQljaGFyIF9fdXNlciAqZnJvbSA9IGlvdi0+aW92X2Jhc2U7CisKKwkJd2hpbGUgKHNlZ2xlbikgeworCQkJaW50IGxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHNlZ2xlbiwgbGltaXQpOworCQkJaW50IG5ld2xlbjsKKworCQkJbmV3bGVuID0gYWZfYWxnX21ha2Vfc2coJmN0eC0+c2dsLCBmcm9tLCBsZW4sIDApOworCQkJaWYgKG5ld2xlbiA8IDApCisJCQkJZ290byB1bmxvY2s7CisKKwkJCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KCZjdHgtPnJlcSwgY3R4LT5zZ2wuc2csIE5VTEwsCisJCQkJCQluZXdsZW4pOworCisJCQllcnIgPSBhZl9hbGdfd2FpdF9mb3JfY29tcGxldGlvbigKKwkJCQljcnlwdG9fYWhhc2hfdXBkYXRlKCZjdHgtPnJlcSksCisJCQkJJmN0eC0+Y29tcGxldGlvbik7CisKKwkJCWFmX2FsZ19mcmVlX3NnKCZjdHgtPnNnbCk7CisKKwkJCWlmIChlcnIpCisJCQkJZ290byB1bmxvY2s7CisKKwkJCXNlZ2xlbiAtPSBuZXdsZW47CisJCQlmcm9tICs9IG5ld2xlbjsKKwkJCWNvcGllZCArPSBuZXdsZW47CisJCX0KKwl9CisKKwllcnIgPSAwOworCisJY3R4LT5tb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKKwlpZiAoIWN0eC0+bW9yZSkgeworCQlhaGFzaF9yZXF1ZXN0X3NldF9jcnlwdCgmY3R4LT5yZXEsIE5VTEwsIGN0eC0+cmVzdWx0LCAwKTsKKwkJZXJyID0gYWZfYWxnX3dhaXRfZm9yX2NvbXBsZXRpb24oY3J5cHRvX2FoYXNoX2ZpbmFsKCZjdHgtPnJlcSksCisJCQkJCQkgJmN0eC0+Y29tcGxldGlvbik7CisJfQorCit1bmxvY2s6CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnIgPzogY29waWVkOworfQorCitzdGF0aWMgc3NpemVfdCBoYXNoX3NlbmRwYWdlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3QgaGFzaF9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlpbnQgZXJyOworCisJbG9ja19zb2NrKHNrKTsKKwlzZ19pbml0X3RhYmxlKGN0eC0+c2dsLnNnLCAxKTsKKwlzZ19zZXRfcGFnZShjdHgtPnNnbC5zZywgcGFnZSwgc2l6ZSwgb2Zmc2V0KTsKKworCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KCZjdHgtPnJlcSwgY3R4LT5zZ2wuc2csIGN0eC0+cmVzdWx0LCBzaXplKTsKKworCWlmICghKGZsYWdzICYgTVNHX01PUkUpKSB7CisJCWlmIChjdHgtPm1vcmUpCisJCQllcnIgPSBjcnlwdG9fYWhhc2hfZmludXAoJmN0eC0+cmVxKTsKKwkJZWxzZQorCQkJZXJyID0gY3J5cHRvX2FoYXNoX2RpZ2VzdCgmY3R4LT5yZXEpOworCX0gZWxzZSB7CisJCWlmICghY3R4LT5tb3JlKSB7CisJCQllcnIgPSBjcnlwdG9fYWhhc2hfaW5pdCgmY3R4LT5yZXEpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCWVyciA9IGNyeXB0b19haGFzaF91cGRhdGUoJmN0eC0+cmVxKTsKKwl9CisKKwllcnIgPSBhZl9hbGdfd2FpdF9mb3JfY29tcGxldGlvbihlcnIsICZjdHgtPmNvbXBsZXRpb24pOworCWlmIChlcnIpCisJCWdvdG8gdW5sb2NrOworCisJY3R4LT5tb3JlID0gZmxhZ3MgJiBNU0dfTU9SRTsKKwordW5sb2NrOgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyID86IHNpemU7Cit9CisKK3N0YXRpYyBpbnQgaGFzaF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqdW51c2VkLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBoYXNoX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXVuc2lnbmVkIGRzID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUoY3J5cHRvX2FoYXNoX3JlcXRmbSgmY3R4LT5yZXEpKTsKKwlpbnQgZXJyOworCisJaWYgKGxlbiA+IGRzKQorCQlsZW4gPSBkczsKKwllbHNlIGlmIChsZW4gPCBkcykKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX1RSVU5DOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoY3R4LT5tb3JlKSB7CisJCWN0eC0+bW9yZSA9IDA7CisJCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KCZjdHgtPnJlcSwgTlVMTCwgY3R4LT5yZXN1bHQsIDApOworCQllcnIgPSBhZl9hbGdfd2FpdF9mb3JfY29tcGxldGlvbihjcnlwdG9fYWhhc2hfZmluYWwoJmN0eC0+cmVxKSwKKwkJCQkJCSAmY3R4LT5jb21wbGV0aW9uKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCWVyciA9IG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgY3R4LT5yZXN1bHQsIGxlbik7CisKK3VubG9jazoKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIGVyciA/OiBsZW47Cit9CisKK3N0YXRpYyBpbnQgaGFzaF9hY2NlcHQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqbmV3c29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3QgaGFzaF9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxID0gJmN0eC0+cmVxOworCWNoYXIgc3RhdGVbY3J5cHRvX2FoYXNoX3N0YXRlc2l6ZShjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSkpXTsKKwlzdHJ1Y3Qgc29jayAqc2syOworCXN0cnVjdCBhbGdfc29jayAqYXNrMjsKKwlzdHJ1Y3QgaGFzaF9jdHggKmN0eDI7CisJaW50IGVycjsKKworCWVyciA9IGNyeXB0b19haGFzaF9leHBvcnQocmVxLCBzdGF0ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGFmX2FsZ19hY2NlcHQoYXNrLT5wYXJlbnQsIG5ld3NvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzazIgPSBuZXdzb2NrLT5zazsKKwlhc2syID0gYWxnX3NrKHNrMik7CisJY3R4MiA9IGFzazItPnByaXZhdGU7CisJY3R4Mi0+bW9yZSA9IDE7CisKKwllcnIgPSBjcnlwdG9fYWhhc2hfaW1wb3J0KCZjdHgyLT5yZXEsIHN0YXRlKTsKKwlpZiAoZXJyKSB7CisJCXNvY2tfb3JwaGFuKHNrMik7CisJCXNvY2tfcHV0KHNrMik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYWxnaWZfaGFzaF9vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9BTEcsCisKKwkuY29ubmVjdAk9CXNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuZ2V0bmFtZQk9CXNvY2tfbm9fZ2V0bmFtZSwKKwkuaW9jdGwJCT0Jc29ja19ub19pb2N0bCwKKwkubGlzdGVuCQk9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93bgk9CXNvY2tfbm9fc2h1dGRvd24sCisJLmdldHNvY2tvcHQJPQlzb2NrX25vX2dldHNvY2tvcHQsCisJLm1tYXAJCT0Jc29ja19ub19tbWFwLAorCS5iaW5kCQk9CXNvY2tfbm9fYmluZCwKKwkuc2V0c29ja29wdAk9CXNvY2tfbm9fc2V0c29ja29wdCwKKwkucG9sbAkJPQlzb2NrX25vX3BvbGwsCisKKwkucmVsZWFzZQk9CWFmX2FsZ19yZWxlYXNlLAorCS5zZW5kbXNnCT0JaGFzaF9zZW5kbXNnLAorCS5zZW5kcGFnZQk9CWhhc2hfc2VuZHBhZ2UsCisJLnJlY3Ztc2cJPQloYXNoX3JlY3Ztc2csCisJLmFjY2VwdAkJPQloYXNoX2FjY2VwdCwKK307CisKK3N0YXRpYyB2b2lkICpoYXNoX2JpbmQoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXJldHVybiBjcnlwdG9fYWxsb2NfYWhhc2gobmFtZSwgdHlwZSwgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGhhc2hfcmVsZWFzZSh2b2lkICpwcml2YXRlKQoreworCWNyeXB0b19mcmVlX2FoYXNoKHByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGhhc2hfc2V0a2V5KHZvaWQgKnByaXZhdGUsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJcmV0dXJuIGNyeXB0b19haGFzaF9zZXRrZXkocHJpdmF0ZSwga2V5LCBrZXlsZW4pOworfQorCitzdGF0aWMgdm9pZCBoYXNoX3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3QgaGFzaF9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKworCXNvY2tfa2ZyZWVfcyhzaywgY3R4LT5yZXN1bHQsCisJCSAgICAgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUoY3J5cHRvX2FoYXNoX3JlcXRmbSgmY3R4LT5yZXEpKSk7CisJc29ja19rZnJlZV9zKHNrLCBjdHgsIGN0eC0+bGVuKTsKKwlhZl9hbGdfcmVsZWFzZV9wYXJlbnQoc2spOworfQorCitzdGF0aWMgaW50IGhhc2hfYWNjZXB0X3BhcmVudCh2b2lkICpwcml2YXRlLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhhc2hfY3R4ICpjdHg7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXVuc2lnbmVkIGxlbiA9IHNpemVvZigqY3R4KSArIGNyeXB0b19haGFzaF9yZXFzaXplKHByaXZhdGUpOworCXVuc2lnbmVkIGRzID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUocHJpdmF0ZSk7CisKKwljdHggPSBzb2NrX2ttYWxsb2Moc2ssIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJY3R4LT5yZXN1bHQgPSBzb2NrX2ttYWxsb2Moc2ssIGRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eC0+cmVzdWx0KSB7CisJCXNvY2tfa2ZyZWVfcyhzaywgY3R4LCBsZW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY3R4LT5yZXN1bHQsIDAsIGRzKTsKKworCWN0eC0+bGVuID0gbGVuOworCWN0eC0+bW9yZSA9IDA7CisJYWZfYWxnX2luaXRfY29tcGxldGlvbigmY3R4LT5jb21wbGV0aW9uKTsKKworCWFzay0+cHJpdmF0ZSA9IGN0eDsKKworCWFoYXNoX3JlcXVlc3Rfc2V0X3RmbSgmY3R4LT5yZXEsIHByaXZhdGUpOworCWFoYXNoX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKCZjdHgtPnJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisJCQkJICAgYWZfYWxnX2NvbXBsZXRlLCAmY3R4LT5jb21wbGV0aW9uKTsKKworCXNrLT5za19kZXN0cnVjdCA9IGhhc2hfc29ja19kZXN0cnVjdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmX2FsZ190eXBlIGFsZ2lmX3R5cGVfaGFzaCA9IHsKKwkuYmluZAkJPQloYXNoX2JpbmQsCisJLnJlbGVhc2UJPQloYXNoX3JlbGVhc2UsCisJLnNldGtleQkJPQloYXNoX3NldGtleSwKKwkuYWNjZXB0CQk9CWhhc2hfYWNjZXB0X3BhcmVudCwKKwkub3BzCQk9CSZhbGdpZl9oYXNoX29wcywKKwkubmFtZQkJPQkiaGFzaCIsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbGdpZl9oYXNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYWZfYWxnX3JlZ2lzdGVyX3R5cGUoJmFsZ2lmX3R5cGVfaGFzaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbGdpZl9oYXNoX2V4aXQodm9pZCkKK3sKKwlpbnQgZXJyID0gYWZfYWxnX3VucmVnaXN0ZXJfdHlwZSgmYWxnaWZfdHlwZV9oYXNoKTsKKwlCVUdfT04oZXJyKTsKK30KKworbW9kdWxlX2luaXQoYWxnaWZfaGFzaF9pbml0KTsKK21vZHVsZV9leGl0KGFsZ2lmX2hhc2hfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYyBiL2NyeXB0by9hbGdpZl9za2NpcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmRmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYwpAQCAtMCwwICsxLDYzMiBAQAorLyoKKyAqIGFsZ2lmX3NrY2lwaGVyOiBVc2VyLXNwYWNlIGludGVyZmFjZSBmb3Igc2tjaXBoZXIgYWxnb3JpdGhtcworICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgdXNlci1zcGFjZSBBUEkgZm9yIHN5bW1ldHJpYyBrZXkgY2lwaGVycy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vc2NhdHRlcndhbGsuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2tjaXBoZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaWZfYWxnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKK3N0cnVjdCBza2NpcGhlcl9zZ19saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlpbnQgY3VyOworCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzBdOworfTsKKworc3RydWN0IHNrY2lwaGVyX2N0eCB7CisJc3RydWN0IGxpc3RfaGVhZCB0c2dsOworCXN0cnVjdCBhZl9hbGdfc2dsIHJzZ2w7CisKKwl2b2lkICppdjsKKworCXN0cnVjdCBhZl9hbGdfY29tcGxldGlvbiBjb21wbGV0aW9uOworCisJdW5zaWduZWQgdXNlZDsKKworCXVuc2lnbmVkIGludCBsZW47CisJYm9vbCBtb3JlOworCWJvb2wgbWVyZ2U7CisJYm9vbCBlbmM7CisKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0IHJlcTsKK307CisKKyNkZWZpbmUgTUFYX1NHTF9FTlRTICgoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBza2NpcGhlcl9zZ19saXN0KSkgLyBcCisJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpIC0gMSkKKworc3RhdGljIGlubGluZSBpbnQgc2tjaXBoZXJfc25kYnVmKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCisJcmV0dXJuIG1heF90KGludCwgbWF4X3QoaW50LCBzay0+c2tfc25kYnVmICYgUEFHRV9NQVNLLCBQQUdFX1NJWkUpIC0KKwkJCSAgY3R4LT51c2VkLCAwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHNrY2lwaGVyX3dyaXRhYmxlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gUEFHRV9TSVpFIDw9IHNrY2lwaGVyX3NuZGJ1Zihzayk7Cit9CisKK3N0YXRpYyBpbnQgc2tjaXBoZXJfYWxsb2Nfc2dsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXN0cnVjdCBza2NpcGhlcl9zZ19saXN0ICpzZ2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisKKwlzZ2wgPSBsaXN0X2VudHJ5KGN0eC0+dHNnbC5wcmV2LCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwgbGlzdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnRzZ2wpKQorCQlzZyA9IHNnbC0+c2c7CisKKwlpZiAoIXNnIHx8IHNnbC0+Y3VyID49IE1BWF9TR0xfRU5UUykgeworCQlzZ2wgPSBzb2NrX2ttYWxsb2Moc2ssIHNpemVvZigqc2dsKSArCisJCQkJICAgICAgIHNpemVvZihzZ2wtPnNnWzBdKSAqIChNQVhfU0dMX0VOVFMgKyAxKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZ2wpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzZ19pbml0X3RhYmxlKHNnbC0+c2csIE1BWF9TR0xfRU5UUyArIDEpOworCQlzZ2wtPmN1ciA9IDA7CisKKwkJaWYgKHNnKQorCQkJc2NhdHRlcndhbGtfc2dfY2hhaW4oc2csIE1BWF9TR0xfRU5UUyArIDEsIHNnbC0+c2cpOworCisJCWxpc3RfYWRkX3RhaWwoJnNnbC0+bGlzdCwgJmN0eC0+dHNnbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrY2lwaGVyX3B1bGxfc2dsKHN0cnVjdCBzb2NrICpzaywgaW50IHVzZWQpCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCAqc2dsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+dHNnbCkpIHsKKwkJc2dsID0gbGlzdF9maXJzdF9lbnRyeSgmY3R4LT50c2dsLCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwKKwkJCQkgICAgICAgbGlzdCk7CisJCXNnID0gc2dsLT5zZzsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2dsLT5jdXI7IGkrKykgeworCQkJaW50IHBsZW4gPSBtaW5fdChpbnQsIHVzZWQsIHNnW2ldLmxlbmd0aCk7CisKKwkJCWlmICghc2dfcGFnZShzZyArIGkpKQorCQkJCWNvbnRpbnVlOworCisJCQlzZ1tpXS5sZW5ndGggLT0gcGxlbjsKKwkJCXNnW2ldLm9mZnNldCArPSBwbGVuOworCisJCQl1c2VkIC09IHBsZW47CisJCQljdHgtPnVzZWQgLT0gcGxlbjsKKworCQkJaWYgKHNnW2ldLmxlbmd0aCkKKwkJCQlyZXR1cm47CisKKwkJCXB1dF9wYWdlKHNnX3BhZ2Uoc2cgKyBpKSk7CisJCQlzZ19hc3NpZ25fcGFnZShzZyArIGksIE5VTEwpOworCQl9CisKKwkJbGlzdF9kZWwoJnNnbC0+bGlzdCk7CisJCXNvY2tfa2ZyZWVfcyhzaywgc2dsLAorCQkJICAgICBzaXplb2YoKnNnbCkgKyBzaXplb2Yoc2dsLT5zZ1swXSkgKgorCQkJCQkgICAgKE1BWF9TR0xfRU5UUyArIDEpKTsKKwl9CisKKwlpZiAoIWN0eC0+dXNlZCkKKwkJY3R4LT5tZXJnZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrY2lwaGVyX2ZyZWVfc2dsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCisJc2tjaXBoZXJfcHVsbF9zZ2woc2ssIGN0eC0+dXNlZCk7Cit9CisKK3N0YXRpYyBpbnQgc2tjaXBoZXJfd2FpdF9mb3Jfd21lbShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGZsYWdzKQoreworCWxvbmcgdGltZW91dDsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgZXJyID0gLUVSRVNUQVJUU1lTOworCisJaWYgKGZsYWdzICYgTVNHX0RPTlRXQUlUKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXNldF9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJZm9yICg7OykgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJcHJlcGFyZV90b193YWl0KHNrX3NsZWVwKHNrKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJaWYgKHNrX3dhaXRfZXZlbnQoc2ssICZ0aW1lb3V0LCBza2NpcGhlcl93cml0YWJsZShzaykpKSB7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmluaXNoX3dhaXQoc2tfc2xlZXAoc2spLCAmd2FpdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBza2NpcGhlcl93bWVtX3dha2V1cChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHNvY2tldF93cSAqd3E7CisKKwlpZiAoIXNrY2lwaGVyX3dyaXRhYmxlKHNrKSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCXdxID0gcmN1X2RlcmVmZXJlbmNlKHNrLT5za193cSk7CisJaWYgKHdxX2hhc19zbGVlcGVyKHdxKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgmd3EtPndhaXQsIFBPTExJTiB8CisJCQkJCQkJICAgUE9MTFJETk9STSB8CisJCQkJCQkJICAgUE9MTFJEQkFORCk7CisJc2tfd2FrZV9hc3luYyhzaywgU09DS19XQUtFX1dBSVRELCBQT0xMX0lOKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCBza2NpcGhlcl93YWl0X2Zvcl9kYXRhKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlsb25nIHRpbWVvdXQ7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IGVyciA9IC1FUkVTVEFSVFNZUzsKKworCWlmIChmbGFncyAmIE1TR19ET05UV0FJVCkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlzZXRfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisKKwlmb3IgKDs7KSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlwcmVwYXJlX3RvX3dhaXQoc2tfc2xlZXAoc2spLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCQlpZiAoc2tfd2FpdF9ldmVudChzaywgJnRpbWVvdXQsIGN0eC0+dXNlZCkpIHsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlmaW5pc2hfd2FpdChza19zbGVlcChzayksICZ3YWl0KTsKKworCWNsZWFyX2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgc2tjaXBoZXJfZGF0YV93YWtldXAoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJc3RydWN0IHNvY2tldF93cSAqd3E7CisKKwlpZiAoIWN0eC0+dXNlZCkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCXdxID0gcmN1X2RlcmVmZXJlbmNlKHNrLT5za193cSk7CisJaWYgKHdxX2hhc19zbGVlcGVyKHdxKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgmd3EtPndhaXQsIFBPTExPVVQgfAorCQkJCQkJCSAgIFBPTExSRE5PUk0gfAorCQkJCQkJCSAgIFBPTExSREJBTkQpOworCXNrX3dha2VfYXN5bmMoc2ssIFNPQ0tfV0FLRV9TUEFDRSwgUE9MTF9PVVQpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IHNrY2lwaGVyX3NlbmRtc2coc3RydWN0IGtpb2NiICp1bnVzZWQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKCZjdHgtPnJlcSk7CisJdW5zaWduZWQgaXZzaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKHRmbSk7CisJc3RydWN0IHNrY2lwaGVyX3NnX2xpc3QgKnNnbDsKKwlzdHJ1Y3QgYWZfYWxnX2NvbnRyb2wgY29uID0ge307CisJbG9uZyBjb3BpZWQgPSAwOworCWJvb2wgZW5jID0gMDsKKwlpbnQgZXJyOworCWludCBpOworCisJaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4pIHsKKwkJZXJyID0gYWZfYWxnX2Ntc2dfc2VuZChtc2csICZjb24pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlzd2l0Y2ggKGNvbi5vcCkgeworCQljYXNlIEFMR19PUF9FTkNSWVBUOgorCQkJZW5jID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFMR19PUF9ERUNSWVBUOgorCQkJZW5jID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY29uLml2ICYmIGNvbi5pdi0+aXZsZW4gIT0gaXZzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gLUVJTlZBTDsKKworCWxvY2tfc29jayhzayk7CisJaWYgKCFjdHgtPm1vcmUgJiYgY3R4LT51c2VkKQorCQlnb3RvIHVubG9jazsKKworCWlmICghY3R4LT51c2VkKSB7CisJCWN0eC0+ZW5jID0gZW5jOworCQlpZiAoY29uLml2KQorCQkJbWVtY3B5KGN0eC0+aXYsIGNvbi5pdi0+aXYsIGl2c2l6ZSk7CisJfQorCisJd2hpbGUgKHNpemUpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJdW5zaWduZWQgbG9uZyBsZW4gPSBzaXplOworCQlpbnQgcGxlbjsKKworCQlpZiAoY3R4LT5tZXJnZSkgeworCQkJc2dsID0gbGlzdF9lbnRyeShjdHgtPnRzZ2wucHJldiwKKwkJCQkJIHN0cnVjdCBza2NpcGhlcl9zZ19saXN0LCBsaXN0KTsKKwkJCXNnID0gc2dsLT5zZyArIHNnbC0+Y3VyIC0gMTsKKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiwKKwkJCQkgICAgUEFHRV9TSVpFIC0gc2ctPm9mZnNldCAtIHNnLT5sZW5ndGgpOworCisJCQllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNnKSkgKworCQkJCQkgICAgICAgc2ctPm9mZnNldCArIHNnLT5sZW5ndGgsCisJCQkJCSAgICAgICBtc2ctPm1zZ19pb3YsIGxlbik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQlzZy0+bGVuZ3RoICs9IGxlbjsKKwkJCWN0eC0+bWVyZ2UgPSAoc2ctPm9mZnNldCArIHNnLT5sZW5ndGgpICYKKwkJCQkgICAgIChQQUdFX1NJWkUgLSAxKTsKKworCQkJY3R4LT51c2VkICs9IGxlbjsKKwkJCWNvcGllZCArPSBsZW47CisJCQlzaXplIC09IGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFza2NpcGhlcl93cml0YWJsZShzaykpIHsKKwkJCWVyciA9IHNrY2lwaGVyX3dhaXRfZm9yX3dtZW0oc2ssIG1zZy0+bXNnX2ZsYWdzKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byB1bmxvY2s7CisJCX0KKworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBsZW4sIHNrY2lwaGVyX3NuZGJ1ZihzaykpOworCisJCWVyciA9IHNrY2lwaGVyX2FsbG9jX3NnbChzayk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVubG9jazsKKworCQlzZ2wgPSBsaXN0X2VudHJ5KGN0eC0+dHNnbC5wcmV2LCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwgbGlzdCk7CisJCXNnID0gc2dsLT5zZzsKKwkJZG8geworCQkJaSA9IHNnbC0+Y3VyOworCQkJcGxlbiA9IG1pbl90KGludCwgbGVuLCBQQUdFX1NJWkUpOworCisJCQlzZ19hc3NpZ25fcGFnZShzZyArIGksIGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCkpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWlmICghc2dfcGFnZShzZyArIGkpKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQllcnIgPSBtZW1jcHlfZnJvbWlvdmVjKHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNnICsgaSkpLAorCQkJCQkgICAgICAgbXNnLT5tc2dfaW92LCBwbGVuKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlfX2ZyZWVfcGFnZShzZ19wYWdlKHNnICsgaSkpOworCQkJCXNnX2Fzc2lnbl9wYWdlKHNnICsgaSwgTlVMTCk7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisKKwkJCXNnW2ldLmxlbmd0aCA9IHBsZW47CisJCQlsZW4gLT0gcGxlbjsKKwkJCWN0eC0+dXNlZCArPSBwbGVuOworCQkJY29waWVkICs9IHBsZW47CisJCQlzaXplIC09IHBsZW47CisJCQlzZ2wtPmN1cisrOworCQl9IHdoaWxlIChsZW4gJiYgc2dsLT5jdXIgPCBNQVhfU0dMX0VOVFMpOworCisJCWN0eC0+bWVyZ2UgPSBwbGVuICYgKFBBR0VfU0laRSAtIDEpOworCX0KKworCWVyciA9IDA7CisKKwljdHgtPm1vcmUgPSBtc2ctPm1zZ19mbGFncyAmIE1TR19NT1JFOworCWlmICghY3R4LT5tb3JlICYmICFsaXN0X2VtcHR5KCZjdHgtPnRzZ2wpKQorCQlzZ2wgPSBsaXN0X2VudHJ5KGN0eC0+dHNnbC5wcmV2LCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwgbGlzdCk7CisKK3VubG9jazoKKwlza2NpcGhlcl9kYXRhX3dha2V1cChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBjb3BpZWQgPzogZXJyOworfQorCitzdGF0aWMgc3NpemVfdCBza2NpcGhlcl9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXN0cnVjdCBza2NpcGhlcl9zZ19saXN0ICpzZ2w7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCWlmICghY3R4LT5tb3JlICYmIGN0eC0+dXNlZCkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoIXNpemUpCisJCWdvdG8gZG9uZTsKKworCWlmICghc2tjaXBoZXJfd3JpdGFibGUoc2spKSB7CisJCWVyciA9IHNrY2lwaGVyX3dhaXRfZm9yX3dtZW0oc2ssIGZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCWVyciA9IHNrY2lwaGVyX2FsbG9jX3NnbChzayk7CisJaWYgKGVycikKKwkJZ290byB1bmxvY2s7CisKKwljdHgtPm1lcmdlID0gMDsKKwlzZ2wgPSBsaXN0X2VudHJ5KGN0eC0+dHNnbC5wcmV2LCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwgbGlzdCk7CisKKwlnZXRfcGFnZShwYWdlKTsKKwlzZ19zZXRfcGFnZShzZ2wtPnNnICsgc2dsLT5jdXIsIHBhZ2UsIHNpemUsIG9mZnNldCk7CisJc2dsLT5jdXIrKzsKKwljdHgtPnVzZWQgKz0gc2l6ZTsKKworZG9uZToKKwljdHgtPm1vcmUgPSBmbGFncyAmIE1TR19NT1JFOworCWlmICghY3R4LT5tb3JlICYmICFsaXN0X2VtcHR5KCZjdHgtPnRzZ2wpKQorCQlzZ2wgPSBsaXN0X2VudHJ5KGN0eC0+dHNnbC5wcmV2LCBzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCwgbGlzdCk7CisKK3VubG9jazoKKwlza2NpcGhlcl9kYXRhX3dha2V1cChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnIgPzogc2l6ZTsKK30KKworc3RhdGljIGludCBza2NpcGhlcl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqdW51c2VkLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGlnbm9yZWQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXVuc2lnbmVkIGJzID0gY3J5cHRvX2FibGtjaXBoZXJfYmxvY2tzaXplKGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbSgKKwkJJmN0eC0+cmVxKSk7CisJc3RydWN0IHNrY2lwaGVyX3NnX2xpc3QgKnNnbDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGxvbmcgaW92bGVuOworCXN0cnVjdCBpb3ZlYyAqaW92OworCWludCBlcnIgPSAtRUFHQUlOOworCWludCB1c2VkOworCWxvbmcgY29waWVkID0gMDsKKworCWxvY2tfc29jayhzayk7CisJZm9yIChpb3YgPSBtc2ctPm1zZ19pb3YsIGlvdmxlbiA9IG1zZy0+bXNnX2lvdmxlbjsgaW92bGVuID4gMDsKKwkgICAgIGlvdmxlbi0tLCBpb3YrKykgeworCQl1bnNpZ25lZCBsb25nIHNlZ2xlbiA9IGlvdi0+aW92X2xlbjsKKwkJY2hhciBfX3VzZXIgKmZyb20gPSBpb3YtPmlvdl9iYXNlOworCisJCXdoaWxlIChzZWdsZW4pIHsKKwkJCXNnbCA9IGxpc3RfZmlyc3RfZW50cnkoJmN0eC0+dHNnbCwKKwkJCQkJICAgICAgIHN0cnVjdCBza2NpcGhlcl9zZ19saXN0LCBsaXN0KTsKKwkJCXNnID0gc2dsLT5zZzsKKworCQkJd2hpbGUgKCFzZy0+bGVuZ3RoKQorCQkJCXNnKys7CisKKwkJCXVzZWQgPSBjdHgtPnVzZWQ7CisJCQlpZiAoIXVzZWQpIHsKKwkJCQllcnIgPSBza2NpcGhlcl93YWl0X2Zvcl9kYXRhKHNrLCBmbGFncyk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byB1bmxvY2s7CisJCQl9CisKKwkJCXVzZWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VkLCBzZWdsZW4pOworCisJCQl1c2VkID0gYWZfYWxnX21ha2Vfc2coJmN0eC0+cnNnbCwgZnJvbSwgdXNlZCwgMSk7CisJCQllcnIgPSB1c2VkOworCQkJaWYgKGVyciA8IDApCisJCQkJZ290byB1bmxvY2s7CisKKwkJCWlmIChjdHgtPm1vcmUgfHwgdXNlZCA8IGN0eC0+dXNlZCkKKwkJCQl1c2VkIC09IHVzZWQgJSBiczsKKworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWlmICghdXNlZCkKKwkJCQlnb3RvIGZyZWU7CisKKwkJCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQoJmN0eC0+cmVxLCBzZywKKwkJCQkJCSAgICAgY3R4LT5yc2dsLnNnLCB1c2VkLAorCQkJCQkJICAgICBjdHgtPml2KTsKKworCQkJZXJyID0gYWZfYWxnX3dhaXRfZm9yX2NvbXBsZXRpb24oCisJCQkJY3R4LT5lbmMgPworCQkJCQljcnlwdG9fYWJsa2NpcGhlcl9lbmNyeXB0KCZjdHgtPnJlcSkgOgorCQkJCQljcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KCZjdHgtPnJlcSksCisJCQkJJmN0eC0+Y29tcGxldGlvbik7CisKK2ZyZWU6CisJCQlhZl9hbGdfZnJlZV9zZygmY3R4LT5yc2dsKTsKKworCQkJaWYgKGVycikKKwkJCQlnb3RvIHVubG9jazsKKworCQkJY29waWVkICs9IHVzZWQ7CisJCQlmcm9tICs9IHVzZWQ7CisJCQlzZWdsZW4gLT0gdXNlZDsKKwkJCXNrY2lwaGVyX3B1bGxfc2dsKHNrLCB1c2VkKTsKKwkJfQorCX0KKworCWVyciA9IDA7CisKK3VubG9jazoKKwlza2NpcGhlcl93bWVtX3dha2V1cChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBjb3BpZWQgPzogZXJyOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2tjaXBoZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCXNvY2tfcG9sbF93YWl0KGZpbGUsIHNrX3NsZWVwKHNrKSwgd2FpdCk7CisJbWFzayA9IDA7CisKKwlpZiAoY3R4LT51c2VkKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwlpZiAoc2tjaXBoZXJfd3JpdGFibGUoc2spKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTFdSQkFORDsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBhbGdpZl9za2NpcGhlcl9vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9BTEcsCisKKwkuY29ubmVjdAk9CXNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuZ2V0bmFtZQk9CXNvY2tfbm9fZ2V0bmFtZSwKKwkuaW9jdGwJCT0Jc29ja19ub19pb2N0bCwKKwkubGlzdGVuCQk9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93bgk9CXNvY2tfbm9fc2h1dGRvd24sCisJLmdldHNvY2tvcHQJPQlzb2NrX25vX2dldHNvY2tvcHQsCisJLm1tYXAJCT0Jc29ja19ub19tbWFwLAorCS5iaW5kCQk9CXNvY2tfbm9fYmluZCwKKwkuYWNjZXB0CQk9CXNvY2tfbm9fYWNjZXB0LAorCS5zZXRzb2Nrb3B0CT0Jc29ja19ub19zZXRzb2Nrb3B0LAorCisJLnJlbGVhc2UJPQlhZl9hbGdfcmVsZWFzZSwKKwkuc2VuZG1zZwk9CXNrY2lwaGVyX3NlbmRtc2csCisJLnNlbmRwYWdlCT0Jc2tjaXBoZXJfc2VuZHBhZ2UsCisJLnJlY3Ztc2cJPQlza2NpcGhlcl9yZWN2bXNnLAorCS5wb2xsCQk9CXNrY2lwaGVyX3BvbGwsCit9OworCitzdGF0aWMgdm9pZCAqc2tjaXBoZXJfYmluZChjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCit7CisJcmV0dXJuIGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKG5hbWUsIHR5cGUsIG1hc2spOworfQorCitzdGF0aWMgdm9pZCBza2NpcGhlcl9yZWxlYXNlKHZvaWQgKnByaXZhdGUpCit7CisJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihwcml2YXRlKTsKK30KKworc3RhdGljIGludCBza2NpcGhlcl9zZXRrZXkodm9pZCAqcHJpdmF0ZSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlyZXR1cm4gY3J5cHRvX2FibGtjaXBoZXJfc2V0a2V5KHByaXZhdGUsIGtleSwga2V5bGVuKTsKK30KKworc3RhdGljIHZvaWQgc2tjaXBoZXJfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbSgmY3R4LT5yZXEpOworCisJc2tjaXBoZXJfZnJlZV9zZ2woc2spOworCXNvY2tfa2ZyZWVfcyhzaywgY3R4LT5pdiwgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKHRmbSkpOworCXNvY2tfa2ZyZWVfcyhzaywgY3R4LCBjdHgtPmxlbik7CisJYWZfYWxnX3JlbGVhc2VfcGFyZW50KHNrKTsKK30KKworc3RhdGljIGludCBza2NpcGhlcl9hY2NlcHRfcGFyZW50KHZvaWQgKnByaXZhdGUsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHg7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXVuc2lnbmVkIGludCBsZW4gPSBzaXplb2YoKmN0eCkgKyBjcnlwdG9fYWJsa2NpcGhlcl9yZXFzaXplKHByaXZhdGUpOworCisJY3R4ID0gc29ja19rbWFsbG9jKHNrLCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+aXYgPSBzb2NrX2ttYWxsb2Moc2ssIGNyeXB0b19hYmxrY2lwaGVyX2l2c2l6ZShwcml2YXRlKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eC0+aXYpIHsKKwkJc29ja19rZnJlZV9zKHNrLCBjdHgsIGxlbik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChjdHgtPml2LCAwLCBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUocHJpdmF0ZSkpOworCisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+dHNnbCk7CisJY3R4LT5sZW4gPSBsZW47CisJY3R4LT51c2VkID0gMDsKKwljdHgtPm1vcmUgPSAwOworCWN0eC0+bWVyZ2UgPSAwOworCWN0eC0+ZW5jID0gMDsKKwlhZl9hbGdfaW5pdF9jb21wbGV0aW9uKCZjdHgtPmNvbXBsZXRpb24pOworCisJYXNrLT5wcml2YXRlID0gY3R4OworCisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF90Zm0oJmN0eC0+cmVxLCBwcml2YXRlKTsKKwlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKCZjdHgtPnJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0csCisJCQkJCWFmX2FsZ19jb21wbGV0ZSwgJmN0eC0+Y29tcGxldGlvbik7CisKKwlzay0+c2tfZGVzdHJ1Y3QgPSBza2NpcGhlcl9zb2NrX2Rlc3RydWN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgYWxnaWZfdHlwZV9za2NpcGhlciA9IHsKKwkuYmluZAkJPQlza2NpcGhlcl9iaW5kLAorCS5yZWxlYXNlCT0Jc2tjaXBoZXJfcmVsZWFzZSwKKwkuc2V0a2V5CQk9CXNrY2lwaGVyX3NldGtleSwKKwkuYWNjZXB0CQk9CXNrY2lwaGVyX2FjY2VwdF9wYXJlbnQsCisJLm9wcwkJPQkmYWxnaWZfc2tjaXBoZXJfb3BzLAorCS5uYW1lCQk9CSJza2NpcGhlciIsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbGdpZl9za2NpcGhlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGFmX2FsZ19yZWdpc3Rlcl90eXBlKCZhbGdpZl90eXBlX3NrY2lwaGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsZ2lmX3NrY2lwaGVyX2V4aXQodm9pZCkKK3sKKwlpbnQgZXJyID0gYWZfYWxnX3VucmVnaXN0ZXJfdHlwZSgmYWxnaWZfdHlwZV9za2NpcGhlcik7CisJQlVHX09OKGVycik7Cit9CisKK21vZHVsZV9pbml0KGFsZ2lmX3NrY2lwaGVyX2luaXQpOworbW9kdWxlX2V4aXQoYWxnaWZfc2tjaXBoZXJfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vYXV0aGVuYy5jIGIvY3J5cHRvL2F1dGhlbmMuYwppbmRleCBhNWEyMmNmLi41ZWY3YmE2IDEwMDY0NAotLS0gYS9jcnlwdG8vYXV0aGVuYy5jCisrKyBiL2NyeXB0by9hdXRoZW5jLmMKQEAgLTEwNywyMCArMTA3LDYgQEAKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIHZvaWQgYXV0aGVuY19jaGFpbihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmhlYWQsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkgIGludCBjaGFpbikKLXsKLQlpZiAoY2hhaW4pIHsKLQkJaGVhZC0+bGVuZ3RoICs9IHNnLT5sZW5ndGg7Ci0JCXNnID0gc2NhdHRlcndhbGtfc2dfbmV4dChzZyk7Ci0JfQotCi0JaWYgKHNnKQotCQlzY2F0dGVyd2Fsa19zZ19jaGFpbihoZWFkLCAyLCBzZyk7Ci0JZWxzZQotCQlzZ19tYXJrX2VuZChoZWFkKTsKLX0KLQogc3RhdGljIHZvaWQgYXV0aGVuY19nZW5pdl9haGFzaF91cGRhdGVfZG9uZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmFyZXEsCiAJCQkJCSAgICBpbnQgZXJyKQogewpAQCAtMzQ1LDcgKzMzMSw3IEBACiAJaWYgKGl2c2l6ZSkgewogCQlzZ19pbml0X3RhYmxlKGNpcGhlciwgMik7CiAJCXNnX3NldF9idWYoY2lwaGVyLCBpdiwgaXZzaXplKTsKLQkJYXV0aGVuY19jaGFpbihjaXBoZXIsIGRzdCwgdmRzdCA9PSBpdiArIGl2c2l6ZSk7CisJCXNjYXR0ZXJ3YWxrX2NyeXB0b19jaGFpbihjaXBoZXIsIGRzdCwgdmRzdCA9PSBpdiArIGl2c2l6ZSwgMik7CiAJCWRzdCA9IGNpcGhlcjsKIAkJY3J5cHRsZW4gKz0gaXZzaXplOwogCX0KQEAgLTM1NCw3ICszNDAsNyBAQAogCQlhdXRoZW5jX2FoYXNoX2ZuID0gY3J5cHRvX2F1dGhlbmNfYWhhc2g7CiAJCXNnX2luaXRfdGFibGUoYXNnLCAyKTsKIAkJc2dfc2V0X3BhZ2UoYXNnLCBzZ19wYWdlKGFzc29jKSwgYXNzb2MtPmxlbmd0aCwgYXNzb2MtPm9mZnNldCk7Ci0JCWF1dGhlbmNfY2hhaW4oYXNnLCBkc3QsIDApOworCQlzY2F0dGVyd2Fsa19jcnlwdG9fY2hhaW4oYXNnLCBkc3QsIDAsIDIpOwogCQlkc3QgPSBhc2c7CiAJCWNyeXB0bGVuICs9IHJlcS0+YXNzb2NsZW47CiAJfQpAQCAtNDk5LDcgKzQ4NSw3IEBACiAJaWYgKGl2c2l6ZSkgewogCQlzZ19pbml0X3RhYmxlKGNpcGhlciwgMik7CiAJCXNnX3NldF9idWYoY2lwaGVyLCBpdiwgaXZzaXplKTsKLQkJYXV0aGVuY19jaGFpbihjaXBoZXIsIHNyYywgdnNyYyA9PSBpdiArIGl2c2l6ZSk7CisJCXNjYXR0ZXJ3YWxrX2NyeXB0b19jaGFpbihjaXBoZXIsIHNyYywgdnNyYyA9PSBpdiArIGl2c2l6ZSwgMik7CiAJCXNyYyA9IGNpcGhlcjsKIAkJY3J5cHRsZW4gKz0gaXZzaXplOwogCX0KQEAgLTUwOCw3ICs0OTQsNyBAQAogCQlhdXRoZW5jX2FoYXNoX2ZuID0gY3J5cHRvX2F1dGhlbmNfYWhhc2g7CiAJCXNnX2luaXRfdGFibGUoYXNnLCAyKTsKIAkJc2dfc2V0X3BhZ2UoYXNnLCBzZ19wYWdlKGFzc29jKSwgYXNzb2MtPmxlbmd0aCwgYXNzb2MtPm9mZnNldCk7Ci0JCWF1dGhlbmNfY2hhaW4oYXNnLCBzcmMsIDApOworCQlzY2F0dGVyd2Fsa19jcnlwdG9fY2hhaW4oYXNnLCBzcmMsIDAsIDIpOwogCQlzcmMgPSBhc2c7CiAJCWNyeXB0bGVuICs9IHJlcS0+YXNzb2NsZW47CiAJfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Nhc3Q1LmMgYi9jcnlwdG8vY2FzdDUuYwppbmRleCBhMWQyMjk0Li40YTIzMGRkIDEwMDY0NAotLS0gYS9jcnlwdG8vY2FzdDUuYworKysgYi9jcnlwdG8vY2FzdDUuYwpAQCAtNjA0LDM2ICs2MDQsMjMgQEAKIAkgKiBSb3VuZHMgMywgNiwgOSwgMTIsIGFuZCAxNSB1c2UgZiBmdW5jdGlvbiBUeXBlIDMuCiAJICovCiAKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMF0sIEtyWzBdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bMl0sIEtyWzJdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bM10sIEtyWzNdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bNV0sIEtyWzVdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bNl0sIEtyWzZdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bOF0sIEtyWzhdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bOV0sIEtyWzldKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTBdLCBLclsxMF0pOworCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVsxMV0sIEtyWzExXSk7CiAJaWYgKCEoYy0+cnIpKSB7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVswXSwgS3JbMF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzJdLCBLclsyXSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVszXSwgS3JbM10pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzVdLCBLcls1XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVs2XSwgS3JbNl0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzhdLCBLcls4XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVs5XSwgS3JbOV0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTBdLCBLclsxMF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bMTFdLCBLclsxMV0pOwogCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMTJdLCBLclsxMl0pOwogCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTNdLCBLclsxM10pOwogCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bMTRdLCBLclsxNF0pOwogCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMTVdLCBLclsxNV0pOwotCX0gZWxzZSB7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVswXSwgS3JbMF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzJdLCBLclsyXSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVszXSwgS3JbM10pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzVdLCBLcls1XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVs2XSwgS3JbNl0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzhdLCBLcls4XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMShyLCBLbVs5XSwgS3JbOV0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMTBdLCBLclsxMF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bMTFdLCBLclsxMV0pOwogCX0KIAogCS8qIGMxLi4uYzY0IDwtLSAoUjE2LEwxNikuICAoRXhjaGFuZ2UgZmluYWwgYmxvY2tzIEwxNiwgUjE2IGFuZApAQCAtNjYzLDMyICs2NTAsMTkgQEAKIAkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzE0XSwgS3JbMTRdKTsKIAkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYyKHIsIEttWzEzXSwgS3JbMTNdKTsKIAkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzEyXSwgS3JbMTJdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzExXSwgS3JbMTFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYyKHIsIEttWzEwXSwgS3JbMTBdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzldLCBLcls5XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVs4XSwgS3JbOF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzZdLCBLcls2XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVs1XSwgS3JbNV0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzNdLCBLclszXSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVsyXSwgS3JbMl0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzBdLCBLclswXSk7Ci0JfSBlbHNlIHsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYzKHIsIEttWzExXSwgS3JbMTFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYyKHIsIEttWzEwXSwgS3JbMTBdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzldLCBLcls5XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVs4XSwgS3JbOF0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzZdLCBLcls2XSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVs1XSwgS3JbNV0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzNdLCBLclszXSk7Ci0JCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVsyXSwgS3JbMl0pOwotCQl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKLQkJdCA9IGw7IGwgPSByOyByID0gdCBeIEYxKHIsIEttWzBdLCBLclswXSk7CiAJfQorCXQgPSBsOyBsID0gcjsgciA9IHQgXiBGMyhyLCBLbVsxMV0sIEtyWzExXSk7CisJdCA9IGw7IGwgPSByOyByID0gdCBeIEYyKHIsIEttWzEwXSwgS3JbMTBdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bOV0sIEtyWzldKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bOF0sIEtyWzhdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bN10sIEtyWzddKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bNl0sIEtyWzZdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bNV0sIEtyWzVdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bNF0sIEtyWzRdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bM10sIEtyWzNdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjMociwgS21bMl0sIEtyWzJdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjIociwgS21bMV0sIEtyWzFdKTsKKwl0ID0gbDsgbCA9IHI7IHIgPSB0IF4gRjEociwgS21bMF0sIEtyWzBdKTsKIAogCWRzdFswXSA9IGNwdV90b19iZTMyKHIpOwogCWRzdFsxXSA9IGNwdV90b19iZTMyKGwpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b193cS5jIGIvY3J5cHRvL2NyeXB0b193cS5jCmluZGV4IGZkY2Y2MjQuLmI5ODBlZTEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9jcnlwdG9fd3EuYworKysgYi9jcnlwdG8vY3J5cHRvX3dxLmMKQEAgLTIwLDcgKzIwLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3J5cHRvX3dxX2luaXQodm9pZCkKIHsKLQlrY3J5cHRvX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiY3J5cHRvIik7CisJa2NyeXB0b193cSA9IGFsbG9jX3dvcmtxdWV1ZSgiY3J5cHRvIiwKKwkJCQkgICAgIFdRX01FTV9SRUNMQUlNIHwgV1FfQ1BVX0lOVEVOU0lWRSwgMSk7CiAJaWYgKHVubGlrZWx5KCFrY3J5cHRvX3dxKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jcnlwdG8vZGVmbGF0ZS5jIGIvY3J5cHRvL2RlZmxhdGUuYwppbmRleCA0NjNkYzg1Li5jYmM3YTMzIDEwMDY0NAotLS0gYS9jcnlwdG8vZGVmbGF0ZS5jCisrKyBiL2NyeXB0by9kZWZsYXRlLmMKQEAgLTQ4LDEyICs0OCwxMSBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJlYW0gPSAmY3R4LT5jb21wX3N0cmVhbTsKIAotCXN0cmVhbS0+d29ya3NwYWNlID0gdm1hbGxvYyh6bGliX2RlZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKKwlzdHJlYW0tPndvcmtzcGFjZSA9IHZ6YWxsb2MoemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CiAJaWYgKCFzdHJlYW0tPndvcmtzcGFjZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JbWVtc2V0KHN0cmVhbS0+d29ya3NwYWNlLCAwLCB6bGliX2RlZmxhdGVfd29ya3NwYWNlc2l6ZSgpKTsKIAlyZXQgPSB6bGliX2RlZmxhdGVJbml0MihzdHJlYW0sIERFRkxBVEVfREVGX0xFVkVMLCBaX0RFRkxBVEVELAogCSAgICAgICAgICAgICAgICAgICAgICAgIC1ERUZMQVRFX0RFRl9XSU5CSVRTLCBERUZMQVRFX0RFRl9NRU1MRVZFTCwKIAkgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkFVTFRfU1RSQVRFR1kpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2VzZXFpdi5jIGIvY3J5cHRvL2VzZXFpdi5jCmluZGV4IDNjYTNiNjYuLjQyY2U5ZjUgMTAwNjQ0Ci0tLSBhL2NyeXB0by9lc2VxaXYuYworKysgYi9jcnlwdG8vZXNlcWl2LmMKQEAgLTYyLDIwICs2Miw2IEBACiAJc2tjaXBoZXJfZ2l2Y3J5cHRfY29tcGxldGUocmVxLCBlcnIpOwogfQogCi1zdGF0aWMgdm9pZCBlc2VxaXZfY2hhaW4oc3RydWN0IHNjYXR0ZXJsaXN0ICpoZWFkLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCQkJIGludCBjaGFpbikKLXsKLQlpZiAoY2hhaW4pIHsKLQkJaGVhZC0+bGVuZ3RoICs9IHNnLT5sZW5ndGg7Ci0JCXNnID0gc2NhdHRlcndhbGtfc2dfbmV4dChzZyk7Ci0JfQotCi0JaWYgKHNnKQotCQlzY2F0dGVyd2Fsa19zZ19jaGFpbihoZWFkLCAyLCBzZyk7Ci0JZWxzZQotCQlzZ19tYXJrX2VuZChoZWFkKTsKLX0KLQogc3RhdGljIGludCBlc2VxaXZfZ2l2ZW5jcnlwdChzdHJ1Y3Qgc2tjaXBoZXJfZ2l2Y3J5cHRfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqZ2VuaXYgPSBza2NpcGhlcl9naXZjcnlwdF9yZXF0Zm0ocmVxKTsKQEAgLTEyNCwxMyArMTEwLDEzIEBACiAKIAlzZ19pbml0X3RhYmxlKHJlcWN0eC0+c3JjLCAyKTsKIAlzZ19zZXRfYnVmKHJlcWN0eC0+c3JjLCBnaXYsIGl2c2l6ZSk7Ci0JZXNlcWl2X2NoYWluKHJlcWN0eC0+c3JjLCBvc3JjLCB2c3JjID09IGdpdiArIGl2c2l6ZSk7CisJc2NhdHRlcndhbGtfY3J5cHRvX2NoYWluKHJlcWN0eC0+c3JjLCBvc3JjLCB2c3JjID09IGdpdiArIGl2c2l6ZSwgMik7CiAKIAlkc3QgPSByZXFjdHgtPnNyYzsKIAlpZiAob3NyYyAhPSBvZHN0KSB7CiAJCXNnX2luaXRfdGFibGUocmVxY3R4LT5kc3QsIDIpOwogCQlzZ19zZXRfYnVmKHJlcWN0eC0+ZHN0LCBnaXYsIGl2c2l6ZSk7Ci0JCWVzZXFpdl9jaGFpbihyZXFjdHgtPmRzdCwgb2RzdCwgdmRzdCA9PSBnaXYgKyBpdnNpemUpOworCQlzY2F0dGVyd2Fsa19jcnlwdG9fY2hhaW4ocmVxY3R4LT5kc3QsIG9kc3QsIHZkc3QgPT0gZ2l2ICsgaXZzaXplLCAyKTsKIAogCQlkc3QgPSByZXFjdHgtPmRzdDsKIAl9CmRpZmYgLS1naXQgYS9jcnlwdG8vZ2NtLmMgYi9jcnlwdG8vZ2NtLmMKaW5kZXggMmY1ZmJiYS4uMWEyNTI2MyAxMDA2NDQKLS0tIGEvY3J5cHRvL2djbS5jCisrKyBiL2NyeXB0by9nY20uYwpAQCAtMTEwMiwyMSArMTEwMiw2IEBACiAJcmV0dXJuIGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGN0eC0+Y2hpbGQsIGF1dGhzaXplKTsKIH0KIAotLyogdGhpcyBpcyB0aGUgc2FtZSBhcyBjcnlwdG9fYXV0aGVuY19jaGFpbiAqLwotc3RhdGljIHZvaWQgY3J5cHRvX3JmYzQ1NDNfY2hhaW4oc3RydWN0IHNjYXR0ZXJsaXN0ICpoZWFkLAotCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgY2hhaW4pCi17Ci0JaWYgKGNoYWluKSB7Ci0JCWhlYWQtPmxlbmd0aCArPSBzZy0+bGVuZ3RoOwotCQlzZyA9IHNjYXR0ZXJ3YWxrX3NnX25leHQoc2cpOwotCX0KLQotCWlmIChzZykKLQkJc2NhdHRlcndhbGtfc2dfY2hhaW4oaGVhZCwgMiwgc2cpOwotCWVsc2UKLQkJc2dfbWFya19lbmQoaGVhZCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcnlwdG9fcmZjNDU0M19jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEsCiAJCQkJCQkgaW50IGVuYykKIHsKQEAgLTExNTQsMTMgKzExMzksMTMgQEAKIAogCXNnX2luaXRfdGFibGUocGF5bG9hZCwgMik7CiAJc2dfc2V0X2J1ZihwYXlsb2FkLCByZXEtPml2LCA4KTsKLQljcnlwdG9fcmZjNDU0M19jaGFpbihwYXlsb2FkLCBkc3QsIHZkc3QgPT0gcmVxLT5pdiArIDgpOworCXNjYXR0ZXJ3YWxrX2NyeXB0b19jaGFpbihwYXlsb2FkLCBkc3QsIHZkc3QgPT0gcmVxLT5pdiArIDgsIDIpOwogCWFzc29jbGVuICs9IDggKyByZXEtPmNyeXB0bGVuIC0gKGVuYyA/IDAgOiBhdXRoc2l6ZSk7CiAKIAlzZ19pbml0X3RhYmxlKGFzc29jLCAyKTsKIAlzZ19zZXRfcGFnZShhc3NvYywgc2dfcGFnZShyZXEtPmFzc29jKSwgcmVxLT5hc3NvYy0+bGVuZ3RoLAogCQkgICAgcmVxLT5hc3NvYy0+b2Zmc2V0KTsKLQljcnlwdG9fcmZjNDU0M19jaGFpbihhc3NvYywgcGF5bG9hZCwgMCk7CisJc2NhdHRlcndhbGtfY3J5cHRvX2NoYWluKGFzc29jLCBwYXlsb2FkLCAwLCAyKTsKIAogCWFlYWRfcmVxdWVzdF9zZXRfdGZtKHN1YnJlcSwgY3R4LT5jaGlsZCk7CiAJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhzdWJyZXEsIHJlcS0+YmFzZS5mbGFncywgcmVxLT5iYXNlLmNvbXBsZXRlLApkaWZmIC0tZ2l0IGEvY3J5cHRvL3BjcnlwdC5jIGIvY3J5cHRvL3BjcnlwdC5jCmluZGV4IDc1NTg2ZjEuLjI5YTg5ZGEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9wY3J5cHQuYworKysgYi9jcnlwdG8vcGNyeXB0LmMKQEAgLTQ1NSw3ICs0NTUsOCBAQAogCiAJZ2V0X29ubGluZV9jcHVzKCk7CiAKLQlwY3J5cHQtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShuYW1lKTsKKwlwY3J5cHQtPndxID0gYWxsb2Nfd29ya3F1ZXVlKG5hbWUsCisJCQkJICAgICBXUV9NRU1fUkVDTEFJTSB8IFdRX0NQVV9JTlRFTlNJVkUsIDEpOwogCWlmICghcGNyeXB0LT53cSkKIAkJZ290byBlcnI7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9ybWQxMjguYyBiL2NyeXB0by9ybWQxMjguYwppbmRleCAxY2ViNjczLi44YTBmNjhiIDEwMDY0NAotLS0gYS9jcnlwdG8vcm1kMTI4LmMKKysrIGIvY3J5cHRvL3JtZDEyOC5jCkBAIC01LDcgKzUsNyBAQAogICoKICAqIEJhc2VkIG9uIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYnkgQW50b29uIEJvc3NlbGFlcnMsIEVTQVQtQ09TSUMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQWRyaWFuLUtlbiBSdWVlZ3NlZ2dlciA8cnVlZWdzZWdnZXIgKGF0KSBzd2lzcy1pdC5jaD4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBBZHJpYW4tS2VuIFJ1ZWVnc2VnZ2VyIDxrZW5AY29kZWxhYnMuY2g+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0zMjUsNCArMzI1LDUgQEAKIG1vZHVsZV9leGl0KHJtZDEyOF9tb2RfZmluaSk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFkcmlhbi1LZW4gUnVlZWdzZWdnZXIgPGtlbkBjb2RlbGFicy5jaD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUklQRU1ELTEyOCBNZXNzYWdlIERpZ2VzdCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JtZDE2MC5jIGIvY3J5cHRvL3JtZDE2MC5jCmluZGV4IDQ3MjI2MWZjLi41MjVkN2JiIDEwMDY0NAotLS0gYS9jcnlwdG8vcm1kMTYwLmMKKysrIGIvY3J5cHRvL3JtZDE2MC5jCkBAIC01LDcgKzUsNyBAQAogICoKICAqIEJhc2VkIG9uIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYnkgQW50b29uIEJvc3NlbGFlcnMsIEVTQVQtQ09TSUMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQWRyaWFuLUtlbiBSdWVlZ3NlZ2dlciA8cnVlZWdzZWdnZXIgKGF0KSBzd2lzcy1pdC5jaD4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBBZHJpYW4tS2VuIFJ1ZWVnc2VnZ2VyIDxrZW5AY29kZWxhYnMuY2g+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCkBAIC0zNjksNCArMzY5LDUgQEAKIG1vZHVsZV9leGl0KHJtZDE2MF9tb2RfZmluaSk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFkcmlhbi1LZW4gUnVlZWdzZWdnZXIgPGtlbkBjb2RlbGFicy5jaD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUklQRU1ELTE2MCBNZXNzYWdlIERpZ2VzdCIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3JtZDI1Ni5jIGIvY3J5cHRvL3JtZDI1Ni5jCmluZGV4IDcyZWFmYTguLjY5MjkzZDkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ybWQyNTYuYworKysgYi9jcnlwdG8vcm1kMjU2LmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogQmFzZWQgb24gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBieSBBbnRvb24gQm9zc2VsYWVycywgRVNBVC1DT1NJQwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBBZHJpYW4tS2VuIFJ1ZWVnc2VnZ2VyIDxydWVlZ3NlZ2dlciAoYXQpIHN3aXNzLWl0LmNoPgorICogQ29weXJpZ2h0IChjKSAyMDA4IEFkcmlhbi1LZW4gUnVlZWdzZWdnZXIgPGtlbkBjb2RlbGFicy5jaD4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKQEAgLTM0NCw0ICszNDQsNSBAQAogbW9kdWxlX2V4aXQocm1kMjU2X21vZF9maW5pKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQWRyaWFuLUtlbiBSdWVlZ3NlZ2dlciA8a2VuQGNvZGVsYWJzLmNoPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSSVBFTUQtMjU2IE1lc3NhZ2UgRGlnZXN0Iik7CmRpZmYgLS1naXQgYS9jcnlwdG8vcm1kMzIwLmMgYi9jcnlwdG8vcm1kMzIwLmMKaW5kZXggODZiZWNhYi4uMDlmOTdkZiAxMDA2NDQKLS0tIGEvY3J5cHRvL3JtZDMyMC5jCisrKyBiL2NyeXB0by9ybWQzMjAuYwpAQCAtNSw3ICs1LDcgQEAKICAqCiAgKiBCYXNlZCBvbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGJ5IEFudG9vbiBCb3NzZWxhZXJzLCBFU0FULUNPU0lDCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEFkcmlhbi1LZW4gUnVlZWdzZWdnZXIgPHJ1ZWVnc2VnZ2VyIChhdCkgc3dpc3MtaXQuY2g+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQWRyaWFuLUtlbiBSdWVlZ3NlZ2dlciA8a2VuQGNvZGVsYWJzLmNoPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpAQCAtMzkzLDQgKzM5Myw1IEBACiBtb2R1bGVfZXhpdChybWQzMjBfbW9kX2ZpbmkpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBZHJpYW4tS2VuIFJ1ZWVnc2VnZ2VyIDxrZW5AY29kZWxhYnMuY2g+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJJUEVNRC0zMjAgTWVzc2FnZSBEaWdlc3QiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGFzaC5jIGIvY3J5cHRvL3NoYXNoLmMKaW5kZXggMjJmZDk0My4uNzZmNzRiOSAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYXNoLmMKKysrIGIvY3J5cHRvL3NoYXNoLmMKQEAgLTMxMCw3ICszMTAsMTMgQEAKIAogc3RhdGljIGludCBzaGFzaF9hc3luY19pbXBvcnQoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSwgY29uc3Qgdm9pZCAqaW4pCiB7Ci0JcmV0dXJuIGNyeXB0b19zaGFzaF9pbXBvcnQoYWhhc2hfcmVxdWVzdF9jdHgocmVxKSwgaW4pOworCXN0cnVjdCBjcnlwdG9fc2hhc2ggKipjdHggPSBjcnlwdG9fYWhhc2hfY3R4KGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKSk7CisJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MgPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCisJZGVzYy0+dGZtID0gKmN0eDsKKwlkZXNjLT5mbGFncyA9IHJlcS0+YmFzZS5mbGFnczsKKworCXJldHVybiBjcnlwdG9fc2hhc2hfaW1wb3J0KGRlc2MsIGluKTsKIH0KIAogc3RhdGljIHZvaWQgY3J5cHRvX2V4aXRfc2hhc2hfb3BzX2FzeW5jKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCmRpZmYgLS1naXQgYS9jcnlwdG8vdGNyeXB0LmMgYi9jcnlwdG8vdGNyeXB0LmMKaW5kZXggM2NhNjhmOS4uOWFhYzVlNSAxMDA2NDQKLS0tIGEvY3J5cHRvL3RjcnlwdC5jCisrKyBiL2NyeXB0by90Y3J5cHQuYwpAQCAtOCw2ICs4LDEzIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmVhbi1GcmFuY29pcyBEaXZlIDxqZWZAbGludXhiZS5vcmc+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTm9raWEgU2llbWVucyBOZXR3b3JrcwogICoKKyAqIFVwZGF0ZWQgUkZDNDEwNiBBRVMtR0NNIHRlc3RpbmcuCisgKiAgICBBdXRob3JzOiBBaWRhbiBPJ01haG9ueSAoYWlkYW4uby5tYWhvbnlAaW50ZWwuY29tKQorICogICAgICAgICAgICAgQWRyaWFuIEhvYmFuIDxhZHJpYW4uaG9iYW5AaW50ZWwuY29tPgorICogICAgICAgICAgICAgR2FicmllbGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBpbnRlbC5jb20+CisgKiAgICAgICAgICAgICBUYWRldXN6IFN0cnVrICh0YWRldXN6LnN0cnVrQGludGVsLmNvbSkKKyAqICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCkBAIC05ODAsNiArOTg3LDEwIEBACiAJCXJldCArPSB0Y3J5cHRfdGVzdCgiYW5zaV9jcHJuZyIpOwogCQlicmVhazsKIAorCWNhc2UgMTUxOgorCQlyZXQgKz0gdGNyeXB0X3Rlc3QoInJmYzQxMDYoZ2NtKGFlcykpIik7CisJCWJyZWFrOworCiAJY2FzZSAyMDA6CiAJCXRlc3RfY2lwaGVyX3NwZWVkKCJlY2IoYWVzKSIsIEVOQ1JZUFQsIHNlYywgTlVMTCwgMCwKIAkJCQlzcGVlZF90ZW1wbGF0ZV8xNl8yNF8zMik7CmRpZmYgLS1naXQgYS9jcnlwdG8vdGVzdG1nci5jIGIvY3J5cHRvL3Rlc3RtZ3IuYwppbmRleCBmYThjOGY3Li4yN2VhOWZlIDEwMDY0NAotLS0gYS9jcnlwdG8vdGVzdG1nci5jCisrKyBiL2NyeXB0by90ZXN0bWdyLmMKQEAgLTYsNiArNiwxMyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA3IE5va2lhIFNpZW1lbnMgTmV0d29ya3MKICAqIENvcHlyaWdodCAoYykgMjAwOCBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiAgKgorICogVXBkYXRlZCBSRkM0MTA2IEFFUy1HQ00gdGVzdGluZy4KKyAqICAgIEF1dGhvcnM6IEFpZGFuIE8nTWFob255IChhaWRhbi5vLm1haG9ueUBpbnRlbC5jb20pCisgKiAgICAgICAgICAgICBBZHJpYW4gSG9iYW4gPGFkcmlhbi5ob2JhbkBpbnRlbC5jb20+CisgKiAgICAgICAgICAgICBHYWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGludGVsLmNvbT4KKyAqICAgICAgICAgICAgIFRhZGV1c3ogU3RydWsgKHRhZGV1c3ouc3RydWtAaW50ZWwuY29tKQorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKQEAgLTIyNDIsNiArMjI0OSwyMyBAQAogCQkJfQogCQl9CiAJfSwgeworCQkuYWxnID0gInJmYzQxMDYoZ2NtKGFlcykpIiwKKwkJLnRlc3QgPSBhbGdfdGVzdF9hZWFkLAorCQkuc3VpdGUgPSB7CisJCQkuYWVhZCA9IHsKKwkJCQkuZW5jID0geworCQkJCQkudmVjcyA9IGFlc19nY21fcmZjNDEwNl9lbmNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFFU19HQ01fNDEwNl9FTkNfVEVTVF9WRUNUT1JTCisJCQkJfSwKKwkJCQkuZGVjID0geworCQkJCQkudmVjcyA9IGFlc19nY21fcmZjNDEwNl9kZWNfdHZfdGVtcGxhdGUsCisJCQkJCS5jb3VudCA9IEFFU19HQ01fNDEwNl9ERUNfVEVTVF9WRUNUT1JTCisJCQkJfQorCQkJfQorCQl9CisJfSwgeworCisKIAkJLmFsZyA9ICJyZmM0MzA5KGNjbShhZXMpKSIsCiAJCS50ZXN0ID0gYWxnX3Rlc3RfYWVhZCwKIAkJLmZpcHNfYWxsb3dlZCA9IDEsCmRpZmYgLS1naXQgYS9jcnlwdG8vdGVzdG1nci5oIGIvY3J5cHRvL3Rlc3RtZ3IuaAppbmRleCA3NGUzNTM3Li44MzRhZjdmIDEwMDY0NAotLS0gYS9jcnlwdG8vdGVzdG1nci5oCisrKyBiL2NyeXB0by90ZXN0bWdyLmgKQEAgLTYsNiArNiwxNSBAQAogICogQ29weXJpZ2h0IChjKSAyMDA3IE5va2lhIFNpZW1lbnMgTmV0d29ya3MKICAqIENvcHlyaWdodCAoYykgMjAwOCBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiAgKgorICogVXBkYXRlZCBSRkM0MTA2IEFFUy1HQ00gdGVzdGluZy4gU29tZSB0ZXN0IHZlY3RvcnMgd2VyZSB0YWtlbiBmcm9tCisgKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9ncm91cHMvU1QvdG9vbGtpdC9CQ00vZG9jdW1lbnRzL3Byb3Bvc2VkbW9kZXMvCisgKiBnY20vZ2NtLXRlc3QtdmVjdG9ycy50YXIuZ3oKKyAqICAgICBBdXRob3JzOiBBaWRhbiBPJ01haG9ueSAoYWlkYW4uby5tYWhvbnlAaW50ZWwuY29tKQorICogICAgICAgICAgICAgIEFkcmlhbiBIb2JhbiA8YWRyaWFuLmhvYmFuQGludGVsLmNvbT4KKyAqICAgICAgICAgICAgICBHYWJyaWVsZSBQYW9sb25pIDxnYWJyaWVsZS5wYW9sb25pQGludGVsLmNvbT4KKyAqICAgICAgICAgICAgICBUYWRldXN6IFN0cnVrICh0YWRldXN6LnN0cnVrQGludGVsLmNvbSkKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIEludGVsIENvcnBvcmF0aW9uLgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQpAQCAtMjk0Nyw2ICsyOTU2LDggQEAKICNkZWZpbmUgQUVTX0NUUl8zNjg2X0RFQ19URVNUX1ZFQ1RPUlMgNgogI2RlZmluZSBBRVNfR0NNX0VOQ19URVNUX1ZFQ1RPUlMgOQogI2RlZmluZSBBRVNfR0NNX0RFQ19URVNUX1ZFQ1RPUlMgOAorI2RlZmluZSBBRVNfR0NNXzQxMDZfRU5DX1RFU1RfVkVDVE9SUyA3CisjZGVmaW5lIEFFU19HQ01fNDEwNl9ERUNfVEVTVF9WRUNUT1JTIDcKICNkZWZpbmUgQUVTX0NDTV9FTkNfVEVTVF9WRUNUT1JTIDcKICNkZWZpbmUgQUVTX0NDTV9ERUNfVEVTVF9WRUNUT1JTIDcKICNkZWZpbmUgQUVTX0NDTV80MzA5X0VOQ19URVNUX1ZFQ1RPUlMgNwpAQCAtNTgyOSw2ICs1ODQwLDM1NiBAQAogCX0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19nY21fcmZjNDEwNl9lbmNfdHZfdGVtcGxhdGVbXSA9IHsKKyAgICAgICAgeyAvKiBHZW5lcmF0ZWQgdXNpbmcgQ3J5cHRvKysgKi8KKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMjAsCisgICAgICAgICAgICAgICAgLml2ICAgICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmlucHV0ICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmlsZW4gICA9IDE2LAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSB6ZXJvZWRfc3RyaW5nLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSA4LAorCQkucmVzdWx0CT0gIlx4MDNceDg4XHhEQVx4Q0VceDYwXHhCNlx4QTNceDkyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhGM1x4MjhceEMyXHhCOVx4NzFceEIyXHhGRVx4NzgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDk3XHhGRVx4NENceDIzXHgzN1x4NDJceDAxXHhFMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ODFceDlGXHg4RFx4QzVceEQ3XHg0MVx4QTBceDFCIiwKKwkJLnJsZW4JPSAzMiwKKyAgICAgICAgfSx7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKyAgICAgICAgICAgICAgICAuaW5wdXQgID0gemVyb2VkX3N0cmluZywKKyAgICAgICAgICAgICAgICAuaWxlbiAgID0gMTYsCisgICAgICAgICAgICAgICAgLmFzc29jICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmFsZW4gICA9IDgsCisJCS5yZXN1bHQJPSAiXHhDMFx4MERceDhCXHg0Mlx4MEZceDhGXHgzNFx4MTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg4XHhCMVx4QzVceEJDXHhDNVx4QjZceEQ2XHgyOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NkFceDlEXHhERlx4MTFceDVFXHhGRVx4NUVceDlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyRlx4NzBceDQ0XHg5Mlx4RjdceEYyXHhFM1x4RUYiLAorCQkucmxlbgk9IDMyLAorCisgICAgICAgIH0sIHsKKwkJLmtleSAgICA9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMjAsCisgICAgICAgICAgICAgICAgLml2ICAgICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmlucHV0ICA9ICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIiwKKyAgICAgICAgICAgICAgICAuaWxlbiAgID0gMTYsCisgICAgICAgICAgICAgICAgLmFzc29jICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmFsZW4gICA9IDgsCisJCS5yZXN1bHQJPSAiXHg0Qlx4QjFceEI1XHhFM1x4MjVceDcxXHg3MFx4REUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDdGXHhDOVx4OUNceEE1XHgxNFx4MTlceEYyXHhBQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MEJceDhGXHg4OFx4NjlceDE3XHhFNlx4QjRceDNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhCMVx4NjhceEZEXHgxNFx4NTJceDY0XHg2MVx4QjIiLAorCQkucmxlbgk9IDMyLAorICAgICAgICB9LCB7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSB6ZXJvZWRfc3RyaW5nLAorICAgICAgICAgICAgICAgIC5pbnB1dCAgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCisgICAgICAgICAgICAgICAgLmlsZW4gICA9IDE2LAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSA4LAorCQkucmVzdWx0CT0gIlx4NEJceEIxXHhCNVx4RTNceDI1XHg3MVx4NzBceERFIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3Rlx4QzlceDlDXHhBNVx4MTRceDE5XHhGMlx4QUMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDkwXHg5Mlx4QjdceEUzXHg1Rlx4QTNceDlBXHg2MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4N0VceEQ3XHgxRlx4RDhceEQzXHg3Q1x4NEJceEY1IiwKKwkJLnJsZW4JPSAzMiwKKyAgICAgICAgfSwgeworCQkua2V5ICAgID0gIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIgorCQkJICAiXHg2ZFx4NmFceDhmXHg5NFx4NjdceDMwXHg4M1x4MDgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAyMCwKKyAgICAgICAgICAgICAgICAuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisgICAgICAgICAgICAgICAgLmlucHV0ICA9ICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIiwKKyAgICAgICAgICAgICAgICAuaWxlbiAgID0gMTYsCisgICAgICAgICAgICAgICAgLmFzc29jICA9ICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCisgICAgICAgICAgICAgICAgLmFsZW4gICA9IDgsCisJCS5yZXN1bHQJPSAiXHhDMVx4MENceDhBXHg0M1x4MEVceDhFXHgzNVx4MTkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg5XHhCMFx4QzRceEJEXHhDNFx4QjdceEQ3XHgyOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NjRceDUwXHhGOVx4MzJceDEzXHhGQlx4NzRceDYxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhGNFx4RURceDUyXHhEM1x4QzVceDEwXHg1NVx4M0MiLAorCQkucmxlbgk9IDMyLAorICAgICAgICB9LCB7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKyAgICAgICAgICAgICAgICAuaW5wdXQgID0gIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiLAorICAgICAgICAgICAgICAgIC5pbGVuICAgPSA2NCwKKyAgICAgICAgICAgICAgICAuYXNzb2MgID0gIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIiwKKyAgICAgICAgICAgICAgICAuYWxlbiAgID0gOCwKKwkJLnJlc3VsdAk9ICJceEMxXHgwQ1x4OEFceDQzXHgwRVx4OEVceDM1XHgxOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ODlceEIwXHhDNFx4QkRceEM0XHhCN1x4RDdceDI5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg5OFx4MTRceEExXHg0Mlx4MzdceDgwXHhGRFx4OTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDY4XHgxMlx4MDFceEE4XHg5MVx4ODlceEI5XHg4MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NUJceDExXHg3N1x4MTJceDlCXHhGRlx4MjRceDg5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg5NFx4NUZceDE4XHgxMlx4QkFceDI3XHgwOVx4MzkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDk5XHg5Nlx4NzZceDQyXHgxNVx4MUNceENEXHhDQiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4RENceEQzXHhEQVx4NjVceDczXHhBRlx4ODBceENEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhEMlx4QjZceEMyXHg0QVx4NzZceEMyXHg5Mlx4ODUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceEJEXHhDRlx4NjJceDk4XHg1OFx4MTRceEU1XHhCRCIsCisJCS5ybGVuCT0gODAsCisgICAgICAgIH0sIHsKKwkJLmtleSAgICA9ICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwNyIKKwkJCSAgIlx4MDhceDA5XHgwYVx4MGJceDBjXHgwZFx4MGVceDBmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMjAsCisgICAgICAgICAgICAgICAgLml2ICAgICA9ICJceDAwXHgwMFx4NDVceDY3XHg4OVx4YWJceGNkXHhlZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorICAgICAgICAgICAgICAgIC5pbnB1dCAgPSAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwKKyAgICAgICAgICAgICAgICAuaWxlbiAgID0gMTkyLAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSAiXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYVx4YWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGFhXHhhYVx4YWFceGFhIiwKKyAgICAgICAgICAgICAgICAuYWxlbiAgID0gMTIsCisJCS5yZXN1bHQJPSAiXHhDMVx4NzZceDMzXHg4NVx4RTJceDlCXHg1Rlx4REUiCisJCQkgICJceERFXHg4OVx4M0RceDQyXHhFN1x4QzlceDY5XHg4QSIKKwkJCSAgIlx4NDRceDZEXHhDM1x4ODhceDQ2XHgyRVx4QzJceDAxIgorCQkJICAiXHg1RVx4RjZceDBDXHgzOVx4RjBceEM0XHhBNVx4ODIiCisJCQkgICJceENEXHhFOFx4MzFceENDXHgwQVx4NENceEU0XHg0NCIKKwkJCSAgIlx4NDFceEE5XHg4Mlx4NkZceDIyXHhBMVx4MjNceDFBIgorCQkJICAiXHhBOFx4RTNceDE2XHhGRFx4MzFceDVDXHgyN1x4MzEiCisJCQkgICJceEYxXHg3Rlx4MDFceDYzXHhBM1x4QUZceDcwXHhBMSIKKwkJCSAgIlx4Q0ZceDA3XHg1N1x4NDFceDY3XHhEMFx4QzRceDQyIgorCQkJICAiXHhEQlx4MThceEM2XHg0Q1x4NENceEUwXHgzRFx4OUYiCisJCQkgICJceDA1XHgwN1x4RkJceDEzXHg3RFx4NEFceENBXHg1QiIKKwkJCSAgIlx4RjBceEJGXHg2NFx4N0VceDA1XHhCMVx4NzJceEVFIgorCQkJICAiXHg3Q1x4M0JceEQ0XHhDRFx4MTRceDAzXHhCMlx4MkMiCisJCQkgICJceEQzXHhBOVx4RUVceEZBXHgxN1x4RkNceDlDXHhERiIKKwkJCSAgIlx4QzdceDc1XHg0MFx4RkZceEFFXHhBRFx4MUVceDU5IgorCQkJICAiXHgyRlx4MzBceDI0XHhGQlx4QURceDZCXHgxMFx4RkEiCisJCQkgICJceDZDXHg5Rlx4NUJceEU3XHgyNVx4RDVceEQwXHgyNSIKKwkJCSAgIlx4QUNceDRBXHg0Qlx4REFceEZDXHg3QVx4ODVceDFCIgorCQkJICAiXHg3RVx4MTNceDA2XHg4Mlx4MDhceDE3XHhBNFx4MzUiCisJCQkgICJceEVDXHhDNVx4OERceDYzXHg5Nlx4ODFceDBBXHg4RiIKKwkJCSAgIlx4QTNceDA1XHgzOFx4OTVceDIwXHgxQVx4NDdceDA0IgorCQkJICAiXHg2Rlx4NkRceERBXHg4Rlx4RUZceEMxXHg3Nlx4MzUiCisJCQkgICJceDZCXHhDN1x4NERceDBGXHg5NFx4MTJceENBXHgzRSIKKwkJCSAgIlx4MkVceEQ1XHgwM1x4MkVceDg2XHg3RVx4QUFceDNCIgorCQkJICAiXHgzN1x4MDhceDFDXHhDRlx4QkFceDVEXHg3MVx4NDYiCisJCQkgICJceDgwXHg3Mlx4QjBceDRDXHg4Mlx4MERceDYwXHgzQyIsCisJCS5ybGVuCT0gMjA4LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19nY21fcmZjNDEwNl9kZWNfdHZfdGVtcGxhdGVbXSA9IHsKKyAgICAgICAgeyAvKiBHZW5lcmF0ZWQgdXNpbmcgQ3J5cHRvKysgKi8KKwkJLmtleSAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5rbGVuCT0gMjAsCisgICAgICAgICAgICAgICAgLml2ICAgICA9IHplcm9lZF9zdHJpbmcsCisJCS5pbnB1dAk9ICJceDAzXHg4OFx4REFceENFXHg2MFx4QjZceEEzXHg5MiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4RjNceDI4XHhDMlx4QjlceDcxXHhCMlx4RkVceDc4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg5N1x4RkVceDRDXHgyM1x4MzdceDQyXHgwMVx4RTAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDgxXHg5Rlx4OERceEM1XHhEN1x4NDFceEEwXHgxQiIsCisJCS5pbGVuCT0gMzIsCisgICAgICAgICAgICAgICAgLmFzc29jICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmFsZW4gICA9IDgsCisgICAgICAgICAgICAgICAgLnJlc3VsdCA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE2LAorCisgICAgICAgIH0seworCQkua2V5ICAgID0gIlx4ZmVceGZmXHhlOVx4OTJceDg2XHg2NVx4NzNceDFjIgorCQkJICAiXHg2ZFx4NmFceDhmXHg5NFx4NjdceDMwXHg4M1x4MDgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAyMCwKKyAgICAgICAgICAgICAgICAuaXYgICAgID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJceEMwXHgwRFx4OEJceDQyXHgwRlx4OEZceDM0XHgxOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ODhceEIxXHhDNVx4QkNceEM1XHhCNlx4RDZceDI4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg2QVx4OURceERGXHgxMVx4NUVceEZFXHg1RVx4OUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDJGXHg3MFx4NDRceDkyXHhGN1x4RjJceEUzXHhFRiIsCisJCS5pbGVuCT0gMzIsCisgICAgICAgICAgICAgICAgLmFzc29jICA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLmFsZW4gICA9IDgsCisgICAgICAgICAgICAgICAgLnJlc3VsdCA9IHplcm9lZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE2LAorICAgICAgICB9LCB7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSB6ZXJvZWRfc3RyaW5nLAorCQkuaW5wdXQJPSAiXHg0Qlx4QjFceEI1XHhFM1x4MjVceDcxXHg3MFx4REUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDdGXHhDOVx4OUNceEE1XHgxNFx4MTlceEYyXHhBQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MEJceDhGXHg4OFx4NjlceDE3XHhFNlx4QjRceDNDIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhCMVx4NjhceEZEXHgxNFx4NTJceDY0XHg2MVx4QjIiLAorCQkuaWxlbgk9IDMyLAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSB6ZXJvZWRfc3RyaW5nLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSA4LAorICAgICAgICAgICAgICAgIC5yZXN1bHQgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE2LAorICAgICAgICB9LCB7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSB6ZXJvZWRfc3RyaW5nLAorCQkuaW5wdXQJPSAiXHg0Qlx4QjFceEI1XHhFM1x4MjVceDcxXHg3MFx4REUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDdGXHhDOVx4OUNceEE1XHgxNFx4MTlceEYyXHhBQyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4OTBceDkyXHhCN1x4RTNceDVGXHhBM1x4OUFceDYzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg3RVx4RDdceDFGXHhEOFx4RDNceDdDXHg0Qlx4RjUiLAorCQkuaWxlbgk9IDMyLAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSA4LAorICAgICAgICAgICAgICAgIC5yZXN1bHQgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE2LAorCisgICAgICAgIH0sIHsKKwkJLmtleSAgICA9ICJceGZlXHhmZlx4ZTlceDkyXHg4Nlx4NjVceDczXHgxYyIKKwkJCSAgIlx4NmRceDZhXHg4Zlx4OTRceDY3XHgzMFx4ODNceDA4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisJCS5rbGVuCT0gMjAsCisgICAgICAgICAgICAgICAgLml2ICAgICA9ICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkuaW5wdXQJPSAiXHhDMVx4MENceDhBXHg0M1x4MEVceDhFXHgzNVx4MTkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg5XHhCMFx4QzRceEJEXHhDNFx4QjdceEQ3XHgyOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NjRceDUwXHhGOVx4MzJceDEzXHhGQlx4NzRceDYxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhGNFx4RURceDUyXHhEM1x4QzVceDEwXHg1NVx4M0MiLAorCQkuaWxlbgk9IDMyLAorICAgICAgICAgICAgICAgIC5hc3NvYyAgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSA4LAorICAgICAgICAgICAgICAgIC5yZXN1bHQgPSAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE2LAorICAgICAgICB9LCB7CisJCS5rZXkgICAgPSAiXHhmZVx4ZmZceGU5XHg5Mlx4ODZceDY1XHg3M1x4MWMiCisJCQkgICJceDZkXHg2YVx4OGZceDk0XHg2N1x4MzBceDgzXHgwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDAiLAorCQkua2xlbgk9IDIwLAorICAgICAgICAgICAgICAgIC5pdiAgICAgPSAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmlucHV0CT0gIlx4QzFceDBDXHg4QVx4NDNceDBFXHg4RVx4MzVceDE5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg4OVx4QjBceEM0XHhCRFx4QzRceEI3XHhEN1x4MjkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDk4XHgxNFx4QTFceDQyXHgzN1x4ODBceEZEXHg5MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NjhceDEyXHgwMVx4QThceDkxXHg4OVx4QjlceDgzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHg1Qlx4MTFceDc3XHgxMlx4OUJceEZGXHgyNFx4ODkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDk0XHg1Rlx4MThceDEyXHhCQVx4MjdceDA5XHgzOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4OTlceDk2XHg3Nlx4NDJceDE1XHgxQ1x4Q0RceENCIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhEQ1x4RDNceERBXHg2NVx4NzNceEFGXHg4MFx4Q0QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceEQyXHhCNlx4QzJceDRBXHg3Nlx4QzJceDkyXHg4NSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4QkRceENGXHg2Mlx4OThceDU4XHgxNFx4RTVceEJEIiwKKwkJLmlsZW4JPSA4MCwKKyAgICAgICAgICAgICAgICAuYXNzb2MgID0gIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIiwKKyAgICAgICAgICAgICAgICAuYWxlbiAgID0gOCwKKyAgICAgICAgICAgICAgICAucmVzdWx0ID0gIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMVx4MDFceDAxXHgwMVx4MDFceDAxXHgwMVx4MDEiLAorICAgICAgICAgICAgICAgIC5ybGVuICAgPSA2NCwKKyAgICAgICAgfSwgeworCQkua2V5ICAgID0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorCQkJICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwIiwKKwkJLmtsZW4JPSAyMCwKKyAgICAgICAgICAgICAgICAuaXYgICAgID0gIlx4MDBceDAwXHg0NVx4NjdceDg5XHhhYlx4Y2RceGVmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMCIsCisJCS5pbnB1dAk9ICJceEMxXHg3Nlx4MzNceDg1XHhFMlx4OUJceDVGXHhERSIKKwkJCSAgIlx4REVceDg5XHgzRFx4NDJceEU3XHhDOVx4NjlceDhBIgorCQkJICAiXHg0NFx4NkRceEMzXHg4OFx4NDZceDJFXHhDMlx4MDEiCisJCQkgICJceDVFXHhGNlx4MENceDM5XHhGMFx4QzRceEE1XHg4MiIKKwkJCSAgIlx4Q0RceEU4XHgzMVx4Q0NceDBBXHg0Q1x4RTRceDQ0IgorCQkJICAiXHg0MVx4QTlceDgyXHg2Rlx4MjJceEExXHgyM1x4MUEiCisJCQkgICJceEE4XHhFM1x4MTZceEZEXHgzMVx4NUNceDI3XHgzMSIKKwkJCSAgIlx4RjFceDdGXHgwMVx4NjNceEEzXHhBRlx4NzBceEExIgorCQkJICAiXHhDRlx4MDdceDU3XHg0MVx4NjdceEQwXHhDNFx4NDIiCisJCQkgICJceERCXHgxOFx4QzZceDRDXHg0Q1x4RTBceDNEXHg5RiIKKwkJCSAgIlx4MDVceDA3XHhGQlx4MTNceDdEXHg0QVx4Q0FceDVCIgorCQkJICAiXHhGMFx4QkZceDY0XHg3RVx4MDVceEIxXHg3Mlx4RUUiCisJCQkgICJceDdDXHgzQlx4RDRceENEXHgxNFx4MDNceEIyXHgyQyIKKwkJCSAgIlx4RDNceEE5XHhFRVx4RkFceDE3XHhGQ1x4OUNceERGIgorCQkJICAiXHhDN1x4NzVceDQwXHhGRlx4QUVceEFEXHgxRVx4NTkiCisJCQkgICJceDJGXHgzMFx4MjRceEZCXHhBRFx4NkJceDEwXHhGQSIKKwkJCSAgIlx4NkNceDlGXHg1Qlx4RTdceDI1XHhENVx4RDBceDI1IgorCQkJICAiXHhBQ1x4NEFceDRCXHhEQVx4RkNceDdBXHg4NVx4MUIiCisJCQkgICJceDdFXHgxM1x4MDZceDgyXHgwOFx4MTdceEE0XHgzNSIKKwkJCSAgIlx4RUNceEM1XHg4RFx4NjNceDk2XHg4MVx4MEFceDhGIgorCQkJICAiXHhBM1x4MDVceDM4XHg5NVx4MjBceDFBXHg0N1x4MDQiCisJCQkgICJceDZGXHg2RFx4REFceDhGXHhFRlx4QzFceDc2XHgzNSIKKwkJCSAgIlx4NkJceEM3XHg0RFx4MEZceDk0XHgxMlx4Q0FceDNFIgorCQkJICAiXHgyRVx4RDVceDAzXHgyRVx4ODZceDdFXHhBQVx4M0IiCisJCQkgICJceDM3XHgwOFx4MUNceENGXHhCQVx4NURceDcxXHg0NiIKKwkJCSAgIlx4ODBceDcyXHhCMFx4NENceDgyXHgwRFx4NjBceDNDIiwKKwkJLmlsZW4JPSAyMDgsCisgICAgICAgICAgICAgICAgLmFzc29jICA9ICJceGFhXHhhYVx4YWFceGFhXHhhYVx4YWFceGFhXHhhYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YWFceGFhXHhhYVx4YWEiLAorICAgICAgICAgICAgICAgIC5hbGVuICAgPSAxMiwKKyAgICAgICAgICAgICAgICAucmVzdWx0ID0gIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsCisgICAgICAgICAgICAgICAgLnJsZW4gICA9IDE5MiwKKworCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgYWVhZF90ZXN0dmVjIGFlc19jY21fZW5jX3R2X3RlbXBsYXRlW10gPSB7CiAJeyAvKiBGcm9tIFJGQyAzNjEwICovCiAJCS5rZXkJPSAiXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNlx4YzciCmRpZmYgLS1naXQgYS9jcnlwdG8vemxpYi5jIGIvY3J5cHRvL3psaWIuYwppbmRleCBjMzAxNTczMy4uNzM5YjhmYyAxMDA2NDQKLS0tIGEvY3J5cHRvL3psaWIuYworKysgYi9jcnlwdG8vemxpYi5jCkBAIC05NSwxMSArOTUsMTAgQEAKIAl6bGliX2NvbXBfZXhpdChjdHgpOwogCiAJd29ya3NwYWNlc2l6ZSA9IHpsaWJfZGVmbGF0ZV93b3Jrc3BhY2VzaXplKCk7Ci0Jc3RyZWFtLT53b3Jrc3BhY2UgPSB2bWFsbG9jKHdvcmtzcGFjZXNpemUpOworCXN0cmVhbS0+d29ya3NwYWNlID0gdnphbGxvYyh3b3Jrc3BhY2VzaXplKTsKIAlpZiAoIXN0cmVhbS0+d29ya3NwYWNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChzdHJlYW0tPndvcmtzcGFjZSwgMCwgd29ya3NwYWNlc2l6ZSk7CiAJcmV0ID0gemxpYl9kZWZsYXRlSW5pdDIoc3RyZWFtLAogCQkJCXRiW1pMSUJfQ09NUF9MRVZFTF0KIAkJCQkJPyBubGFfZ2V0X3UzMih0YltaTElCX0NPTVBfTEVWRUxdKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDNkOTNiM2EuLmRkMGE1YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTg4LDYgKzg4LDggQEAKIAogc291cmNlICJkcml2ZXJzL2xlZHMvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL25mYy9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYWNjZXNzaWJpbGl0eS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggYmYxNWNlNy4uZWY1MTMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC00MCw3ICs0MCw3IEBACiAKIG9iai15CQkJCSs9IHNlcmlhbC8KIG9iai0kKENPTkZJR19QQVJQT1JUKQkJKz0gcGFycG9ydC8KLW9iai15CQkJCSs9IGJhc2UvIGJsb2NrLyBtaXNjLyBtZmQvCitvYmoteQkJCQkrPSBiYXNlLyBibG9jay8gbWlzYy8gbWZkLyBuZmMvCiBvYmotJChDT05GSUdfTlVCVVMpCQkrPSBudWJ1cy8KIG9iai15CQkJCSs9IG1hY2ludG9zaC8KIG9iai0kKENPTkZJR19JREUpCQkrPSBpZGUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IDNmMzQ4OWMuLjEwYzdhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC01MSwxMiArNTEsNyBAQAogCSAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGlzIG9wdGlvbiBhbGxvd3MKIAkgIGRlcHJlY2F0ZWQgL3Byb2MvYWNwaS8gZmlsZXMgdG8gZXhpc3QsIGV2ZW4gd2hlbgogCSAgdGhleSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgZnVuY3Rpb25zIGluIC9zeXMuCi0JICBUaGUgZGVwcmVjYXRlZCBmaWxlcyAoYW5kIHRoZWlyIHJlcGxhY2VtZW50cykgaW5jbHVkZToKIAotCSAgL3Byb2MvYWNwaS9wcm9jZXNzb3IvKi90aHJvdHRsaW5nICgvc3lzL2NsYXNzL3RoZXJtYWwvCi0JCWNvb2xpbmdfZGV2aWNlKi8qKQotCSAgL3Byb2MvYWNwaS92aWRlby8qL2JyaWdodG5lc3MgKC9zeXMvY2xhc3MvYmFja2xpZ2h0LykKLQkgIC9wcm9jL2FjcGkvdGhlcm1hbF96b25lLyovKiAoL3N5cy9jbGFzcy90aGVybWFsLykKIAkgIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gL3Byb2MvYWNwaS8gZmlsZXMKIAkgIGFuZCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHlldCBleGlzdCBpbiAvc3lzLgogCkBAIC03NCw2ICs2OSw4IEBACiAJICAvcHJvYy9hY3BpL2FjX2FkYXB0ZXIvKiAoc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8qKQogCSAgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiAvcHJvYy9hY3BpLyBkaXJlY3RvcmllcwogCSAgYW5kIGZ1bmN0aW9ucywgd2hpY2ggZG8gbm90IHlldCBleGlzdCBpbiAvc3lzCisJICBUaGlzIG9wdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGUgcHJvYyBkaXJlY3Rvcmllcywgd2lsbCBiZQorCSAgZGVsZXRlZCBpbiAyLjYuMzkuCiAKIAkgIFNheSBOIHRvIGRlbGV0ZSBwb3dlciAvcHJvYy9hY3BpLyBkaXJlY3RvcmllcyB0aGF0IGhhdmUgbW92ZWQgdG8gL3N5cy8KIApAQCAtMjA5LDYgKzIwNiwxNyBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOgogCSAgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcm9jZXNzb3IuCitjb25maWcgQUNQSV9JUE1JCisJdHJpc3RhdGUgIklQTUkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSVBNSV9TSSAmJiBJUE1JX0hBTkRMRVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGRyaXZlciBlbmFibGVzIHRoZSBBQ1BJIHRvIGFjY2VzcyB0aGUgQk1DIGNvbnRyb2xsZXIuIEFuZCBpdAorCSAgdXNlcyB0aGUgSVBNSSByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2UgdG8gY29tbXVuaWNhdGUgd2l0aCBCTUMKKwkgIGNvbnRyb2xsZXIsIHdoaWNoIGNhbiBiZSBmb3VuZCBvbiBvbiB0aGUgc2VydmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOgorCSAgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcyBhY3BpX2lwbWkuCiAKIGNvbmZpZyBBQ1BJX0hPVFBMVUdfQ1BVCiAJYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IDNkMDMxZDAuLmQxMTNmYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTI0LDcgKzI0LDcgQEAKICMgc2xlZXAgcmVsYXRlZCBmaWxlcwogYWNwaS15CQkJCSs9IHdha2V1cC5vCiBhY3BpLXkJCQkJKz0gc2xlZXAubwotYWNwaS0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBwcm9jLm8KK2FjcGktJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gcHJvYy5vIG52cy5vCiAKIAogIwpAQCAtNjksNSArNjksNiBAQAogcHJvY2Vzc29yLSQoQ09ORklHX0NQVV9GUkVRKQkrPSBwcm9jZXNzb3JfcGVyZmxpYi5vCiAKIG9iai0kKENPTkZJR19BQ1BJX1BST0NFU1NPUl9BR0dSRUdBVE9SKSArPSBhY3BpX3BhZC5vCitvYmotJChDT05GSUdfQUNQSV9JUE1JKQkJKz0gYWNwaV9pcG1pLm8KIAogb2JqLSQoQ09ORklHX0FDUElfQVBFSSkJCSs9IGFwZWkvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDI1ZDNhYWUuLjU4YzNmNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC0xOTcsNyArMTk3LDggQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5ID0gTlVMTDsKIAotCisJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkRlcHJlY2F0ZWQgcHJvY2ZzIEkvRiBmb3IgQUMgaXMgbG9hZGVkLCIKKwkJCSIgcGxlYXNlIHJldHJ5IHdpdGggQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSIGNsZWFyZWRcbiIpOwogCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKIAkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAogCQkJCQkJICAgICBhY3BpX2FjX2Rpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9pcG1pLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9pcG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwYWNlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2lwbWkuYwpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqICBhY3BpX2lwbWkuYyAtIEFDUEkgSVBNSSBvcHJlZ2lvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgWmhhbyBZYWt1aSA8eWFrdWkuemhhb0BpbnRlbC5jb20+CisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisKK01PRFVMRV9BVVRIT1IoIlpoYW8gWWFrdWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBJUE1JIE9wcmVnaW9uIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElQTUlfRkxBR1NfSEFORExFUl9JTlNUQUxMCTAKKworI2RlZmluZSBBQ1BJX0lQTUlfT0sJCQkwCisjZGVmaW5lIEFDUElfSVBNSV9USU1FT1VUCQkweDEwCisjZGVmaW5lIEFDUElfSVBNSV9VTktOT1dOCQkweDA3CisvKiB0aGUgSVBNSSB0aW1lb3V0IGlzIDVzICovCisjZGVmaW5lIElQTUlfVElNRU9VVAkJCSg1ICogSFopCisKK3N0cnVjdCBhY3BpX2lwbWlfZGV2aWNlIHsKKwkvKiB0aGUgZGV2aWNlIGxpc3QgYXR0YWNoZWQgdG8gZHJpdmVyX2RhdGEuaXBtaV9kZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCS8qIHRoZSBJUE1JIHJlcXVlc3QgbWVzc2FnZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCB0eF9tc2dfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXgJdHhfbXNnX2xvY2s7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2OworCWlwbWlfdXNlcl90CXVzZXJfaW50ZXJmYWNlOworCWludCBpcG1pX2lmbnVtOyAvKiBJUE1JIGludGVyZmFjZSBudW1iZXIgKi8KKwlsb25nIGN1cnJfbXNnaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBtaV9zbWlfaW5mbyBzbWlfZGF0YTsKK307CisKK3N0cnVjdCBpcG1pX2RyaXZlcl9kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWlwbWlfZGV2aWNlczsKKwlzdHJ1Y3QgaXBtaV9zbWlfd2F0Y2hlcglibWNfZXZlbnRzOworCXN0cnVjdCBpcG1pX3VzZXJfaG5kbAlpcG1pX2huZGxyczsKKwlzdHJ1Y3QgbXV0ZXgJCWlwbWlfbG9jazsKK307CisKK3N0cnVjdCBhY3BpX2lwbWlfbXNnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJLyoKKwkgKiBHZW5lcmFsIHNwZWFraW5nIHRoZSBhZGRyIHR5cGUgc2hvdWxkIGJlIFNJX0FERFJfVFlQRS4gQW5kCisJICogdGhlIGFkZHIgY2hhbm5lbCBzaG91bGQgYmUgQk1DLgorCSAqIEluIGZhY3QgaXQgY2FuIGFsc28gYmUgSVBNQiB0eXBlLiBCdXQgd2Ugd2lsbCBoYXZlIHRvCisJICogcGFyc2UgaXQgZnJvbSB0aGUgTmV0Zm4gY29tbWFuZCBidWZmZXIuIEl0IGlzIHNvIGNvbXBsZXgKKwkgKiB0aGF0IGl0IGlzIHNraXBwZWQuCisJICovCisJc3RydWN0IGlwbWlfYWRkciBhZGRyOworCWxvbmcgdHhfbXNnaWQ7CisJLyogaXQgaXMgdXNlZCB0byB0cmFjayB3aGV0aGVyIHRoZSBJUE1JIG1lc3NhZ2UgaXMgZmluaXNoZWQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB0eF9jb21wbGV0ZTsKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnIHR4X21lc3NhZ2U7CisJaW50CW1zZ19kb25lOworCS8qIHR4IGRhdGEgLiBBbmQgY29weSBpdCBmcm9tIEFDUEkgb2JqZWN0IGJ1ZmZlciAqLworCXU4CXR4X2RhdGFbNjRdOworCWludAl0eF9sZW47CisJdTgJcnhfZGF0YVs2NF07CisJaW50CXJ4X2xlbjsKKwlzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqZGV2aWNlOworfTsKKworLyogSVBNSSByZXF1ZXN0L3Jlc3BvbnNlIGJ1ZmZlciBwZXIgQUNQSSA0LjAsIHNlYyA1LjUuMi40LjMuMiAqLworc3RydWN0IGFjcGlfaXBtaV9idWZmZXIgeworCXU4IHN0YXR1czsKKwl1OCBsZW5ndGg7CisJdTggZGF0YVs2NF07Cit9OworCitzdGF0aWMgdm9pZCBpcG1pX3JlZ2lzdGVyX2JtYyhpbnQgaWZhY2UsIHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcG1pX2JtY19nb25lKGludCBpZmFjZSk7CitzdGF0aWMgdm9pZCBpcG1pX21zZ19oYW5kbGVyKHN0cnVjdCBpcG1pX3JlY3ZfbXNnICptc2csIHZvaWQgKnVzZXJfbXNnX2RhdGEpOworc3RhdGljIHZvaWQgYWNwaV9hZGRfaXBtaV9kZXZpY2Uoc3RydWN0IGFjcGlfaXBtaV9kZXZpY2UgKmlwbWlfZGV2aWNlKTsKK3N0YXRpYyB2b2lkIGFjcGlfcmVtb3ZlX2lwbWlfZGV2aWNlKHN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pX2RldmljZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaXBtaV9kcml2ZXJfZGF0YSBkcml2ZXJfZGF0YSA9IHsKKwkuaXBtaV9kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQoZHJpdmVyX2RhdGEuaXBtaV9kZXZpY2VzKSwKKwkuYm1jX2V2ZW50cyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uZXdfc21pID0gaXBtaV9yZWdpc3Rlcl9ibWMsCisJCS5zbWlfZ29uZSA9IGlwbWlfYm1jX2dvbmUsCisJfSwKKwkuaXBtaV9obmRscnMgPSB7CisJCS5pcG1pX3JlY3ZfaG5kbCA9IGlwbWlfbXNnX2hhbmRsZXIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9pcG1pX21zZyAqYWNwaV9hbGxvY19pcG1pX21zZyhzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqaXBtaSkKK3sKKwlzdHJ1Y3QgYWNwaV9pcG1pX21zZyAqaXBtaV9tc2c7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSBpcG1pLT5wbnBfZGV2OworCisJaXBtaV9tc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9pcG1pX21zZyksIEdGUF9LRVJORUwpOworCWlmICghaXBtaV9tc2cpCXsKKwkJZGV2X3dhcm4oJnBucF9kZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaXBtaV9tc2dcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5pdF9jb21wbGV0aW9uKCZpcG1pX21zZy0+dHhfY29tcGxldGUpOworCUlOSVRfTElTVF9IRUFEKCZpcG1pX21zZy0+aGVhZCk7CisJaXBtaV9tc2ctPmRldmljZSA9IGlwbWk7CisJcmV0dXJuIGlwbWlfbXNnOworfQorCisjZGVmaW5lCQlJUE1JX09QX1JHTl9ORVRGTihvZmZzZXQpCSgob2Zmc2V0ID4+IDgpICYgMHhmZikKKyNkZWZpbmUJCUlQTUlfT1BfUkdOX0NNRChvZmZzZXQpCQkob2Zmc2V0ICYgMHhmZikKK3N0YXRpYyB2b2lkIGFjcGlfZm9ybWF0X2lwbWlfbXNnKHN0cnVjdCBhY3BpX2lwbWlfbXNnICp0eF9tc2csCisJCQkJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJYWNwaV9pbnRlZ2VyICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICptc2c7CisJc3RydWN0IGFjcGlfaXBtaV9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqZGV2aWNlOworCisJbXNnID0gJnR4X21zZy0+dHhfbWVzc2FnZTsKKwkvKgorCSAqIElQTUkgbmV0d29yayBmdW5jdGlvbiBhbmQgY29tbWFuZCBhcmUgZW5jb2RlZCBpbiB0aGUgYWRkcmVzcworCSAqIHdpdGhpbiB0aGUgSVBNSSBPcFJlZ2lvbjsgc2VlIEFDUEkgNC4wLCBzZWMgNS41LjIuNC4zLgorCSAqLworCW1zZy0+bmV0Zm4gPSBJUE1JX09QX1JHTl9ORVRGTihhZGRyZXNzKTsKKwltc2ctPmNtZCA9IElQTUlfT1BfUkdOX0NNRChhZGRyZXNzKTsKKwltc2ctPmRhdGEgPSB0eF9tc2ctPnR4X2RhdGE7CisJLyoKKwkgKiB2YWx1ZSBpcyB0aGUgcGFyYW1ldGVyIHBhc3NlZCBieSB0aGUgSVBNSSBvcHJlZ2lvbiBzcGFjZSBoYW5kbGVyLgorCSAqIEl0IHBvaW50cyB0byB0aGUgSVBNSSByZXF1ZXN0IG1lc3NhZ2UgYnVmZmVyCisJICovCisJYnVmZmVyID0gKHN0cnVjdCBhY3BpX2lwbWlfYnVmZmVyICopdmFsdWU7CisJLyogY29weSB0aGUgdHggbWVzc2FnZSBkYXRhICovCisJbXNnLT5kYXRhX2xlbiA9IGJ1ZmZlci0+bGVuZ3RoOworCW1lbWNweSh0eF9tc2ctPnR4X2RhdGEsIGJ1ZmZlci0+ZGF0YSwgbXNnLT5kYXRhX2xlbik7CisJLyoKKwkgKiBub3cgdGhlIGRlZmF1bHQgdHlwZSBpcyBTWVNURU1fSU5URVJGQUNFIGFuZCBjaGFubmVsIHR5cGUgaXMgQk1DLgorCSAqIElmIHRoZSBuZXRmbiBpcyBBUFBfUkVRVUVTVCBhbmQgdGhlIGNtZCBpcyBTRU5EX01FU1NBR0UsCisJICogdGhlIGFkZHIgdHlwZSBzaG91bGQgYmUgY2hhbmdlZCB0byBJUE1CLiBUaGVuIHdlIHdpbGwgaGF2ZSB0byBwYXJzZQorCSAqIHRoZSBJUE1JIHJlcXVlc3QgbWVzc2FnZSBidWZmZXIgdG8gZ2V0IHRoZSBJUE1CIGFkZHJlc3MuCisJICogSWYgc28sIHBsZWFzZSBmaXggbWUuCisJICovCisJdHhfbXNnLT5hZGRyLmFkZHJfdHlwZSA9IElQTUlfU1lTVEVNX0lOVEVSRkFDRV9BRERSX1RZUEU7CisJdHhfbXNnLT5hZGRyLmNoYW5uZWwgPSBJUE1JX0JNQ19DSEFOTkVMOworCXR4X21zZy0+YWRkci5kYXRhWzBdID0gMDsKKworCS8qIEdldCB0aGUgbXNnaWQgKi8KKwlkZXZpY2UgPSB0eF9tc2ctPmRldmljZTsKKwltdXRleF9sb2NrKCZkZXZpY2UtPnR4X21zZ19sb2NrKTsKKwlkZXZpY2UtPmN1cnJfbXNnaWQrKzsKKwl0eF9tc2ctPnR4X21zZ2lkID0gZGV2aWNlLT5jdXJyX21zZ2lkOworCW11dGV4X3VubG9jaygmZGV2aWNlLT50eF9tc2dfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZm9ybWF0X2lwbWlfcmVzcG9uc2Uoc3RydWN0IGFjcGlfaXBtaV9tc2cgKm1zZywKKwkJYWNwaV9pbnRlZ2VyICp2YWx1ZSwgaW50IHJlbV90aW1lKQoreworCXN0cnVjdCBhY3BpX2lwbWlfYnVmZmVyICpidWZmZXI7CisKKwkvKgorCSAqIHZhbHVlIGlzIGFsc28gdXNlZCBhcyBvdXRwdXQgcGFyYW1ldGVyLiBJdCByZXByZXNlbnRzIHRoZSByZXNwb25zZQorCSAqIElQTUkgbWVzc2FnZSByZXR1cm5lZCBieSBJUE1JIGNvbW1hbmQuCisJICovCisJYnVmZmVyID0gKHN0cnVjdCBhY3BpX2lwbWlfYnVmZmVyICopdmFsdWU7CisJaWYgKCFyZW1fdGltZSAmJiAhbXNnLT5tc2dfZG9uZSkgeworCQlidWZmZXItPnN0YXR1cyA9IEFDUElfSVBNSV9USU1FT1VUOworCQlyZXR1cm47CisJfQorCS8qCisJICogSWYgdGhlIGZsYWcgb2YgbXNnX2RvbmUgaXMgbm90IHNldCBvciB0aGUgcmVjdiBsZW5ndGggaXMgemVybywgaXQKKwkgKiBtZWFucyB0aGF0IHRoZSBJUE1JIGNvbW1hbmQgaXMgbm90IGV4ZWN1dGVkIGNvcnJlY3RseS4KKwkgKiBUaGUgc3RhdHVzIGNvZGUgd2lsbCBiZSBBQ1BJX0lQTUlfVU5LTk9XTi4KKwkgKi8KKwlpZiAoIW1zZy0+bXNnX2RvbmUgfHwgIW1zZy0+cnhfbGVuKSB7CisJCWJ1ZmZlci0+c3RhdHVzID0gQUNQSV9JUE1JX1VOS05PV047CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBJZiB0aGUgSVBNSSByZXNwb25zZSBtZXNzYWdlIGlzIG9idGFpbmVkIGNvcnJlY3RseSwgdGhlIHN0YXR1cyBjb2RlCisJICogd2lsbCBiZSBBQ1BJX0lQTUlfT0sKKwkgKi8KKwlidWZmZXItPnN0YXR1cyA9IEFDUElfSVBNSV9PSzsKKwlidWZmZXItPmxlbmd0aCA9IG1zZy0+cnhfbGVuOworCW1lbWNweShidWZmZXItPmRhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9sZW4pOworfQorCitzdGF0aWMgdm9pZCBpcG1pX2ZsdXNoX3R4X21zZyhzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqaXBtaSkKK3sKKwlzdHJ1Y3QgYWNwaV9pcG1pX21zZyAqdHhfbXNnLCAqdGVtcDsKKwlpbnQgY291bnQgPSBIWiAvIDEwOworCXN0cnVjdCBwbnBfZGV2ICpwbnBfZGV2ID0gaXBtaS0+cG5wX2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0eF9tc2csIHRlbXAsICZpcG1pLT50eF9tc2dfbGlzdCwgaGVhZCkgeworCQkvKiB3YWtlIHVwIHRoZSBzbGVlcCB0aHJlYWQgb24gdGhlIFR4IG1zZyAqLworCQljb21wbGV0ZSgmdHhfbXNnLT50eF9jb21wbGV0ZSk7CisJfQorCisJLyogd2FpdCBmb3IgYWJvdXQgMTAwbXMgdG8gZmx1c2ggdGhlIHR4IG1lc3NhZ2UgbGlzdCAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChsaXN0X2VtcHR5KCZpcG1pLT50eF9tc2dfbGlzdCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZpcG1pLT50eF9tc2dfbGlzdCkpCisJCWRldl93YXJuKCZwbnBfZGV2LT5kZXYsICJ0eCBtc2cgbGlzdCBpcyBub3QgTlVMTFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfbXNnX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKm1zZywgdm9pZCAqdXNlcl9tc2dfZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqaXBtaV9kZXZpY2UgPSB1c2VyX21zZ19kYXRhOworCWludCBtc2dfZm91bmQgPSAwOworCXN0cnVjdCBhY3BpX2lwbWlfbXNnICp0eF9tc2c7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSBpcG1pX2RldmljZS0+cG5wX2RldjsKKworCWlmIChtc2ctPnVzZXIgIT0gaXBtaV9kZXZpY2UtPnVzZXJfaW50ZXJmYWNlKSB7CisJCWRldl93YXJuKCZwbnBfZGV2LT5kZXYsICJVbmV4cGVjdGVkIHJlc3BvbnNlIGlzIHJldHVybmVkLiAiCisJCQkicmV0dXJuZWQgdXNlciAlcCwgZXhwZWN0ZWQgdXNlciAlcFxuIiwKKwkJCW1zZy0+dXNlciwgaXBtaV9kZXZpY2UtPnVzZXJfaW50ZXJmYWNlKTsKKwkJaXBtaV9mcmVlX3JlY3ZfbXNnKG1zZyk7CisJCXJldHVybjsKKwl9CisJbXV0ZXhfbG9jaygmaXBtaV9kZXZpY2UtPnR4X21zZ19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR4X21zZywgJmlwbWlfZGV2aWNlLT50eF9tc2dfbGlzdCwgaGVhZCkgeworCQlpZiAobXNnLT5tc2dpZCA9PSB0eF9tc2ctPnR4X21zZ2lkKSB7CisJCQltc2dfZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmlwbWlfZGV2aWNlLT50eF9tc2dfbG9jayk7CisJaWYgKCFtc2dfZm91bmQpIHsKKwkJZGV2X3dhcm4oJnBucF9kZXYtPmRldiwgIlVuZXhwZWN0ZWQgcmVzcG9uc2UgKG1zZyBpZCAlbGQpIGlzICIKKwkJCSJyZXR1cm5lZC5cbiIsIG1zZy0+bXNnaWQpOworCQlpcG1pX2ZyZWVfcmVjdl9tc2cobXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChtc2ctPm1zZy5kYXRhX2xlbikgeworCQkvKiBjb3B5IHRoZSByZXNwb25zZSBkYXRhIHRvIFJ4X2RhdGEgYnVmZmVyICovCisJCW1lbWNweSh0eF9tc2ctPnJ4X2RhdGEsIG1zZy0+bXNnX2RhdGEsIG1zZy0+bXNnLmRhdGFfbGVuKTsKKwkJdHhfbXNnLT5yeF9sZW4gPSBtc2ctPm1zZy5kYXRhX2xlbjsKKwkJdHhfbXNnLT5tc2dfZG9uZSA9IDE7CisJfQorCWNvbXBsZXRlKCZ0eF9tc2ctPnR4X2NvbXBsZXRlKTsKKwlpcG1pX2ZyZWVfcmVjdl9tc2cobXNnKTsKK307CisKK3N0YXRpYyB2b2lkIGlwbWlfcmVnaXN0ZXJfYm1jKGludCBpZmFjZSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pX2RldmljZSwgKnRlbXA7CisJc3RydWN0IHBucF9kZXYgKnBucF9kZXY7CisJaXBtaV91c2VyX3QJCXVzZXI7CisJaW50IGVycjsKKwlzdHJ1Y3QgaXBtaV9zbWlfaW5mbyBzbWlfZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwllcnIgPSBpcG1pX2dldF9zbWlfaW5mbyhpZmFjZSwgJnNtaV9kYXRhKTsKKworCWlmIChlcnIpCisJCXJldHVybjsKKworCWlmIChzbWlfZGF0YS5hZGRyX3NyYyAhPSBTSV9BQ1BJKSB7CisJCXB1dF9kZXZpY2Uoc21pX2RhdGEuZGV2KTsKKwkJcmV0dXJuOworCX0KKworCWhhbmRsZSA9IHNtaV9kYXRhLmFkZHJfaW5mby5hY3BpX2luZm8uYWNwaV9oYW5kbGU7CisKKwltdXRleF9sb2NrKCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcCwgJmRyaXZlcl9kYXRhLmlwbWlfZGV2aWNlcywgaGVhZCkgeworCQkvKgorCQkgKiBpZiB0aGUgY29ycmVzcG9uZGluZyBBQ1BJIGhhbmRsZSBpcyBhbHJlYWR5IGFkZGVkCisJCSAqIHRvIHRoZSBkZXZpY2UgbGlzdCwgZG9uJ3QgYWRkIGl0IGFnYWluLgorCQkgKi8KKwkJaWYgKHRlbXAtPmhhbmRsZSA9PSBoYW5kbGUpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpcG1pX2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCppcG1pX2RldmljZSksIEdGUF9LRVJORUwpOworCisJaWYgKCFpcG1pX2RldmljZSkKKwkJZ290byBvdXQ7CisKKwlwbnBfZGV2ID0gdG9fcG5wX2RldihzbWlfZGF0YS5kZXYpOworCWlwbWlfZGV2aWNlLT5oYW5kbGUgPSBoYW5kbGU7CisJaXBtaV9kZXZpY2UtPnBucF9kZXYgPSBwbnBfZGV2OworCisJZXJyID0gaXBtaV9jcmVhdGVfdXNlcihpZmFjZSwgJmRyaXZlcl9kYXRhLmlwbWlfaG5kbHJzLAorCQkJCQlpcG1pX2RldmljZSwgJnVzZXIpOworCWlmIChlcnIpIHsKKwkJZGV2X3dhcm4oJnBucF9kZXYtPmRldiwgIkNhbid0IGNyZWF0ZSBJUE1JIHVzZXIgaW50ZXJmYWNlXG4iKTsKKwkJa2ZyZWUoaXBtaV9kZXZpY2UpOworCQlnb3RvIG91dDsKKwl9CisJYWNwaV9hZGRfaXBtaV9kZXZpY2UoaXBtaV9kZXZpY2UpOworCWlwbWlfZGV2aWNlLT51c2VyX2ludGVyZmFjZSA9IHVzZXI7CisJaXBtaV9kZXZpY2UtPmlwbWlfaWZudW0gPSBpZmFjZTsKKwltdXRleF91bmxvY2soJmRyaXZlcl9kYXRhLmlwbWlfbG9jayk7CisJbWVtY3B5KCZpcG1pX2RldmljZS0+c21pX2RhdGEsICZzbWlfZGF0YSwgc2l6ZW9mKHN0cnVjdCBpcG1pX3NtaV9pbmZvKSk7CisJcmV0dXJuOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworCXB1dF9kZXZpY2Uoc21pX2RhdGEuZGV2KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfYm1jX2dvbmUoaW50IGlmYWNlKQoreworCXN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pX2RldmljZSwgKnRlbXA7CisKKwltdXRleF9sb2NrKCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcG1pX2RldmljZSwgdGVtcCwKKwkJCQkmZHJpdmVyX2RhdGEuaXBtaV9kZXZpY2VzLCBoZWFkKSB7CisJCWlmIChpcG1pX2RldmljZS0+aXBtaV9pZm51bSAhPSBpZmFjZSkKKwkJCWNvbnRpbnVlOworCisJCWFjcGlfcmVtb3ZlX2lwbWlfZGV2aWNlKGlwbWlfZGV2aWNlKTsKKwkJcHV0X2RldmljZShpcG1pX2RldmljZS0+c21pX2RhdGEuZGV2KTsKKwkJa2ZyZWUoaXBtaV9kZXZpY2UpOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkJQWRkcmVzcyBTcGFjZSBNYW5hZ2VtZW50CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgaXMgdGhlIElQTUkgb3ByZWdpb24gc3BhY2UgaGFuZGxlci4KKyAqIEBmdW5jdGlvbjogaW5kaWNhdGVzIHRoZSByZWFkL3dyaXRlLiBJbiBmYWN0IGFzIHRoZSBJUE1JIG1lc3NhZ2UgaXMgZHJpdmVuCisgKiBieSBjb21tYW5kLCBvbmx5IHdyaXRlIGlzIG1lYW5pbmdmdWwuCisgKiBAYWRkcmVzczogVGhpcyBjb250YWlucyB0aGUgbmV0Zm4vY29tbWFuZCBvZiBJUE1JIHJlcXVlc3QgbWVzc2FnZS4KKyAqIEBiaXRzICAgOiBub3QgdXNlZC4KKyAqIEB2YWx1ZSAgOiBpdCBpcyBhbiBpbi9vdXQgcGFyYW1ldGVyLiBJdCBwb2ludHMgdG8gdGhlIElQTUkgbWVzc2FnZSBidWZmZXIuCisgKgkgICAgIEJlZm9yZSB0aGUgSVBNSSBtZXNzYWdlIGlzIHNlbnQsIGl0IHJlcHJlc2VudHMgdGhlIGFjdHVhbCByZXF1ZXN0CisgKgkgICAgIElQTUkgbWVzc2FnZS4gQWZ0ZXIgdGhlIElQTUkgbWVzc2FnZSBpcyBmaW5pc2hlZCwgaXQgcmVwcmVzZW50cworICoJICAgICB0aGUgcmVzcG9uc2UgSVBNSSBtZXNzYWdlIHJldHVybmVkIGJ5IElQTUkgY29tbWFuZC4KKyAqIEBoYW5kbGVyX2NvbnRleHQ6IElQTUkgZGV2aWNlIGNvbnRleHQuCisgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2lwbWlfc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkgICAgICB1MzIgYml0cywgYWNwaV9pbnRlZ2VyICp2YWx1ZSwKKwkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWNwaV9pcG1pX21zZyAqdHhfbXNnOworCXN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pX2RldmljZSA9IGhhbmRsZXJfY29udGV4dDsKKwlpbnQgZXJyLCByZW1fdGltZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJLyoKKwkgKiBJUE1JIG9wcmVnaW9uIG1lc3NhZ2UuCisJICogSVBNSSBtZXNzYWdlIGlzIGZpcnN0bHkgd3JpdHRlbiB0byB0aGUgQk1DIGFuZCBzeXN0ZW0gc29mdHdhcmUKKwkgKiBjYW4gZ2V0IHRoZSByZXNwc29uc2UuIFNvIGl0IGlzIHVubWVhbmluZ2Z1bCBmb3IgdGhlIHJlYWQgYWNjZXNzCisJICogb2YgSVBNSSBvcHJlZ2lvbi4KKwkgKi8KKwlpZiAoKGZ1bmN0aW9uICYgQUNQSV9JT19NQVNLKSA9PSBBQ1BJX1JFQUQpCisJCXJldHVybiBBRV9UWVBFOworCisJaWYgKCFpcG1pX2RldmljZS0+dXNlcl9pbnRlcmZhY2UpCisJCXJldHVybiBBRV9OT1RfRVhJU1Q7CisKKwl0eF9tc2cgPSBhY3BpX2FsbG9jX2lwbWlfbXNnKGlwbWlfZGV2aWNlKTsKKwlpZiAoIXR4X21zZykKKwkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCWFjcGlfZm9ybWF0X2lwbWlfbXNnKHR4X21zZywgYWRkcmVzcywgdmFsdWUpOworCW11dGV4X2xvY2soJmlwbWlfZGV2aWNlLT50eF9tc2dfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdHhfbXNnLT5oZWFkLCAmaXBtaV9kZXZpY2UtPnR4X21zZ19saXN0KTsKKwltdXRleF91bmxvY2soJmlwbWlfZGV2aWNlLT50eF9tc2dfbG9jayk7CisJZXJyID0gaXBtaV9yZXF1ZXN0X3NldHRpbWUoaXBtaV9kZXZpY2UtPnVzZXJfaW50ZXJmYWNlLAorCQkJCQkmdHhfbXNnLT5hZGRyLAorCQkJCQl0eF9tc2ctPnR4X21zZ2lkLAorCQkJCQkmdHhfbXNnLT50eF9tZXNzYWdlLAorCQkJCQlOVUxMLCAwLCAwLCAwKTsKKwlpZiAoZXJyKSB7CisJCXN0YXR1cyA9IEFFX0VSUk9SOworCQlnb3RvIGVuZF9sYWJlbDsKKwl9CisJcmVtX3RpbWUgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnR4X21zZy0+dHhfY29tcGxldGUsCisJCQkJCUlQTUlfVElNRU9VVCk7CisJYWNwaV9mb3JtYXRfaXBtaV9yZXNwb25zZSh0eF9tc2csIHZhbHVlLCByZW1fdGltZSk7CisJc3RhdHVzID0gQUVfT0s7CisKK2VuZF9sYWJlbDoKKwltdXRleF9sb2NrKCZpcG1pX2RldmljZS0+dHhfbXNnX2xvY2spOworCWxpc3RfZGVsKCZ0eF9tc2ctPmhlYWQpOworCW11dGV4X3VubG9jaygmaXBtaV9kZXZpY2UtPnR4X21zZ19sb2NrKTsKKwlrZnJlZSh0eF9tc2cpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGlwbWlfcmVtb3ZlX3NwYWNlX2hhbmRsZXIoc3RydWN0IGFjcGlfaXBtaV9kZXZpY2UgKmlwbWkpCit7CisJaWYgKCF0ZXN0X2JpdChJUE1JX0ZMQUdTX0hBTkRMRVJfSU5TVEFMTCwgJmlwbWktPmZsYWdzKSkKKwkJcmV0dXJuOworCisJYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGlwbWktPmhhbmRsZSwKKwkJCQlBQ1BJX0FEUl9TUEFDRV9JUE1JLCAmYWNwaV9pcG1pX3NwYWNlX2hhbmRsZXIpOworCisJY2xlYXJfYml0KElQTUlfRkxBR1NfSEFORExFUl9JTlNUQUxMLCAmaXBtaS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGlwbWlfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKHN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICh0ZXN0X2JpdChJUE1JX0ZMQUdTX0hBTkRMRVJfSU5TVEFMTCwgJmlwbWktPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGlwbWktPmhhbmRsZSwKKwkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9JUE1JLAorCQkJCQkJICAgICZhY3BpX2lwbWlfc3BhY2VfaGFuZGxlciwKKwkJCQkJCSAgICBOVUxMLCBpcG1pKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJc3RydWN0IHBucF9kZXYgKnBucF9kZXYgPSBpcG1pLT5wbnBfZGV2OworCQlkZXZfd2FybigmcG5wX2Rldi0+ZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgSVBNSSBvcHJlZ2lvbiBzcGFjZSAiCisJCQkiaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNldF9iaXQoSVBNSV9GTEFHU19IQU5ETEVSX0lOU1RBTEwsICZpcG1pLT5mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfYWRkX2lwbWlfZGV2aWNlKHN0cnVjdCBhY3BpX2lwbWlfZGV2aWNlICppcG1pX2RldmljZSkKK3sKKworCUlOSVRfTElTVF9IRUFEKCZpcG1pX2RldmljZS0+aGVhZCk7CisKKwltdXRleF9pbml0KCZpcG1pX2RldmljZS0+dHhfbXNnX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZpcG1pX2RldmljZS0+dHhfbXNnX2xpc3QpOworCWlwbWlfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKGlwbWlfZGV2aWNlKTsKKworCWxpc3RfYWRkX3RhaWwoJmlwbWlfZGV2aWNlLT5oZWFkLCAmZHJpdmVyX2RhdGEuaXBtaV9kZXZpY2VzKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9yZW1vdmVfaXBtaV9kZXZpY2Uoc3RydWN0IGFjcGlfaXBtaV9kZXZpY2UgKmlwbWlfZGV2aWNlKQoreworCS8qCisJICogSWYgdGhlIElQTUkgdXNlciBpbnRlcmZhY2UgaXMgY3JlYXRlZCwgaXQgc2hvdWxkIGJlCisJICogZGVzdHJveWVkLgorCSAqLworCWlmIChpcG1pX2RldmljZS0+dXNlcl9pbnRlcmZhY2UpIHsKKwkJaXBtaV9kZXN0cm95X3VzZXIoaXBtaV9kZXZpY2UtPnVzZXJfaW50ZXJmYWNlKTsKKwkJaXBtaV9kZXZpY2UtPnVzZXJfaW50ZXJmYWNlID0gTlVMTDsKKwl9CisJLyogZmx1c2ggdGhlIFR4X21zZyBsaXN0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZpcG1pX2RldmljZS0+dHhfbXNnX2xpc3QpKQorCQlpcG1pX2ZsdXNoX3R4X21zZyhpcG1pX2RldmljZSk7CisKKwlsaXN0X2RlbCgmaXBtaV9kZXZpY2UtPmhlYWQpOworCWlwbWlfcmVtb3ZlX3NwYWNlX2hhbmRsZXIoaXBtaV9kZXZpY2UpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2lwbWlfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiByZXN1bHQ7CisKKwltdXRleF9pbml0KCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworCisJcmVzdWx0ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3RlcigmZHJpdmVyX2RhdGEuYm1jX2V2ZW50cyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9pcG1pX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV9pcG1pX2RldmljZSAqaXBtaV9kZXZpY2UsICp0ZW1wOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybjsKKworCWlwbWlfc21pX3dhdGNoZXJfdW5yZWdpc3RlcigmZHJpdmVyX2RhdGEuYm1jX2V2ZW50cyk7CisKKwkvKgorCSAqIFdoZW4gb25lIHNtaV93YXRjaGVyIGlzIHVucmVnaXN0ZXJlZCwgaXQgaXMgb25seSBkZWxldGVkCisJICogZnJvbSB0aGUgc21pX3dhdGNoZXIgbGlzdC4gQnV0IHRoZSBzbWlfZ29uZSBjYWxsYmFjayBmdW5jdGlvbgorCSAqIGlzIG5vdCBjYWxsZWQuIFNvIGV4cGxpY2l0bHkgdW5pbnN0YWxsIHRoZSBBQ1BJIElQTUkgb3JlZ2lvbgorCSAqIGhhbmRsZXIgYW5kIGZyZWUgaXQuCisJICovCisJbXV0ZXhfbG9jaygmZHJpdmVyX2RhdGEuaXBtaV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXBtaV9kZXZpY2UsIHRlbXAsCisJCQkJJmRyaXZlcl9kYXRhLmlwbWlfZGV2aWNlcywgaGVhZCkgeworCQlhY3BpX3JlbW92ZV9pcG1pX2RldmljZShpcG1pX2RldmljZSk7CisJCXB1dF9kZXZpY2UoaXBtaV9kZXZpY2UtPnNtaV9kYXRhLmRldik7CisJCWtmcmVlKGlwbWlfZGV2aWNlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfZGF0YS5pcG1pX2xvY2spOworfQorCittb2R1bGVfaW5pdChhY3BpX2lwbWlfaW5pdCk7Cittb2R1bGVfZXhpdChhY3BpX2lwbWlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQppbmRleCBhN2UxZDFhLi5lZWMyZWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAKIAogYWNwaS15ICs9IGV2ZXZlbnQubyAgZXZyZWdpb24ubyAgZXZzY2kubyAgICBldnhmZXZudC5vIFwKIAkgZXZtaXNjLm8gICBldnJnbmluaS5vICBldnhmYWNlLm8gIGV2eGZyZWduLm8gXAotCSBldmdwZS5vICAgIGV2Z3BlYmxrLm8gZXZncGVpbml0Lm8gIGV2Z3BldXRpbC5vCisJIGV2Z3BlLm8gICAgZXZncGVibGsubyBldmdwZWluaXQubyAgZXZncGV1dGlsLm8gZXZ4ZmdwZS5vCiAKIGFjcGkteSArPSBleGNvbmZpZy5vICBleGZpZWxkLm8gIGV4bmFtZXMubyAgIGV4b3Bhcmc2Lm8gIGV4cmVzb2x2Lm8gIGV4c3Rvcm9iLm9cCiAJIGV4Y29udnJ0Lm8gIGV4ZmxkaW8ubyAgZXhvcGFyZzEubyAgZXhwcmVwLm8gICAgZXhyZXNvcC5vICAgZXhzeXN0ZW0ub1wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaAppbmRleCBhNmY5OWNjLi43MGUwYjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZXZlbnRzLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oCkBAIC01MSw4ICs1MSw2IEBACiAKIGFjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyh2b2lkKTsKIAotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3Blcyh2b2lkKTsKLQogdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpOwogCiAvKgpAQCAtODIsOSArODAsOSBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX2V2X2VuYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAotYWNwaV9zdGF0dXMgYWNwaV9yYXdfZW5hYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV9ldl9hZGRfZ3BlX3JlZmVyZW5jZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCi1hY3BpX3N0YXR1cyBhY3BpX3Jhd19kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOworYWNwaV9zdGF0dXMgYWNwaV9ldl9yZW1vdmVfZ3BlX3JlZmVyZW5jZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCiBzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKIAkJCQkJCSAgICAgICB1MzIgZ3BlX251bWJlcik7CkBAIC05Myw2ICs5MSw4IEBACiAJCQkJCQkgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvCiAJCQkJCQkgICAgICpncGVfYmxvY2spOwogCithY3BpX3N0YXR1cyBhY3BpX2V2X2ZpbmlzaF9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKKwogLyoKICAqIGV2Z3BlYmxrIC0gVXBwZXItbGV2ZWwgR1BFIGJsb2NrIHN1cHBvcnQKICAqLwpAQCAtMTA3LDEyICsxMDcsMTMgQEAKIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKIAkJCSAgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKLQkJCSAgICAgdm9pZCAqaWdub3JlZCk7CisJCQkgICAgIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cyBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CiAKIHUzMgotYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2UsCisJCSAgICAgc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAogCQkgICAgIHUzMiBncGVfbnVtYmVyKTsKIAogLyoKQEAgLTEyNiwxMCArMTI3LDYgQEAKIGFjcGlfZXZfbWF0Y2hfZ3BlX21ldGhvZChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAogCQkJIHUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQkgIHUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7Ci0KIC8qCiAgKiBldmdwZXV0aWwgLSBHUEUgdXRpbGl0aWVzCiAgKi8KQEAgLTEzOCw2ICsxMzUsMTAgQEAKIAogdTggYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAorYWNwaV9zdGF0dXMKK2FjcGlfZXZfZ2V0X2dwZV9kZXZpY2Uoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkgICAgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywgdm9pZCAqY29udGV4dCk7CisKIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICphY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sodTMyIGludGVycnVwdF9udW1iZXIpOwogCiBhY3BpX3N0YXR1cyBhY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKaW5kZXggYWQ4OGZjYS4uOWJiNjljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaApAQCAtMTQ2LDYgKzE0Niw5IEBACiAKIGV4dGVybiB1MzIgYWNwaV9nYmxfbmVzdGluZ19sZXZlbDsKIAorQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ3BlX2NvdW50OworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZml4ZWRfZXZlbnRfY291bnRbQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKKwogLyogU3VwcG9ydCBmb3IgZHluYW1pYyBjb250cm9sIG1ldGhvZCB0cmFjaW5nIG1lY2hhbmlzbSAqLwogCiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsOwpAQCAtMzcwLDcgKzM3Myw5IEBACiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKIEFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvCiAqYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzW0FDUElfTUFYX0dQRV9CTE9DS1NdOwotQUNQSV9FWFRFUk4gdTggYWNwaV9hbGxfZ3Blc19pbml0aWFsaXplZDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2FsbF9ncGVzX2luaXRpYWxpemVkOworQUNQSV9FWFRFUk4gQUNQSV9HQkxfRVZFTlRfSEFORExFUiBhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcjsKK0FDUElfRVhURVJOIHZvaWQgKmFjcGlfZ2JsX2dsb2JhbF9ldmVudF9oYW5kbGVyX2NvbnRleHQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNod2FyZS5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2h3YXJlLmgKaW5kZXggMTY3NDcwYS4uMjU4ZDYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2h3YXJlLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2h3YXJlLmgKQEAgLTk0LDcgKzk0LDcgQEAKIAkJCSAgICAgc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfaHdfbG93X3NldF9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCBhY3Rpb24pOworYWNwaV9od19sb3dfc2V0X2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sIHUzMiBhY3Rpb24pOwogCiBhY3BpX3N0YXR1cwogYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCmluZGV4IDJjZWIwYzAuLjc0MDAwZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCkBAIC00MDgsMTcgKzQwOCwxOCBAQAogCiAvKiBEaXNwYXRjaCBpbmZvIGZvciBlYWNoIEdQRSAtLSBlaXRoZXIgYSBtZXRob2Qgb3IgaGFuZGxlciwgY2Fubm90IGJlIGJvdGggKi8KIAotc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvIHsKLQlhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzczsJLyogQWRkcmVzcyBvZiBoYW5kbGVyLCBpZiBhbnkgKi8KK3N0cnVjdCBhY3BpX2dwZV9oYW5kbGVyX2luZm8geworCWFjcGlfZ3BlX2hhbmRsZXIgYWRkcmVzczsJLyogQWRkcmVzcyBvZiBoYW5kbGVyLCBpZiBhbnkgKi8KIAl2b2lkICpjb250ZXh0OwkJLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsIChzYXZlZCkgKi8KLQl1OCBvcmlnX2ZsYWdzOwkJLyogT3JpZ2luYWwgbWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCi0JdTggb3JpZ19lbmFibGVkOwkvKiBTZXQgaWYgdGhlIEdQRSB3YXMgb3JpZ2luYWxseSBlbmFibGVkICovCisJdTggb3JpZ2luYWxfZmxhZ3M7ICAgICAgLyogT3JpZ2luYWwgKHByZS1oYW5kbGVyKSBHUEUgaW5mbyAqLworCXU4IG9yaWdpbmFsbHlfZW5hYmxlZDsgIC8qIFRydWUgaWYgR1BFIHdhcyBvcmlnaW5hbGx5IGVuYWJsZWQgKi8KIH07CiAKIHVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gewogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsICovCi0Jc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvICpoYW5kbGVyOworCXN0cnVjdCBhY3BpX2dwZV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7ICAvKiBJbnN0YWxsZWQgR1BFIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGU7ICAgICAgICAvKiBQYXJlbnQgX1BSVyBkZXZpY2UgZm9yIGltcGxpY2l0IG5vdGlmeSAqLwogfTsKIAogLyoKQEAgLTQ1OCw3ICs0NTksNyBAQAogCXUzMiByZWdpc3Rlcl9jb3VudDsJLyogTnVtYmVyIG9mIHJlZ2lzdGVyIHBhaXJzIGluIGJsb2NrICovCiAJdTE2IGdwZV9jb3VudDsJCS8qIE51bWJlciBvZiBpbmRpdmlkdWFsIEdQRXMgaW4gYmxvY2sgKi8KIAl1OCBibG9ja19iYXNlX251bWJlcjsJLyogQmFzZSBHUEUgbnVtYmVyIGZvciB0aGlzIGJsb2NrICovCi0JdTggaW5pdGlhbGl6ZWQ7ICAgICAgICAgLyogSWYgc2V0LCB0aGUgR1BFIGJsb2NrIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisJdTggaW5pdGlhbGl6ZWQ7ICAgICAgICAgLyogVFJVRSBpZiB0aGlzIGJsb2NrIGlzIGluaXRpYWxpemVkICovCiB9OwogCiAvKiBJbmZvcm1hdGlvbiBhYm91dCBHUEUgaW50ZXJydXB0IGhhbmRsZXJzLCBvbmUgcGVyIGVhY2ggaW50ZXJydXB0IGxldmVsIHVzZWQgZm9yIEdQRXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvYmplY3QuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvYmplY3QuaAppbmRleCBiZGJmYWYyMmIuLjk2MmEzY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvYmplY3QuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Fjb2JqZWN0LmgKQEAgLTkzLDcgKzkzLDcgQEAKIAogI2RlZmluZSBBT1BPQkpfQU1MX0NPTlNUQU5UICAgICAgICAgMHgwMQkvKiBJbnRlZ2VyIGlzIGFuIEFNTCBjb25zdGFudCAqLwogI2RlZmluZSBBT1BPQkpfU1RBVElDX1BPSU5URVIgICAgICAgMHgwMgkvKiBEYXRhIGlzIHBhcnQgb2YgYW4gQUNQSSB0YWJsZSwgZG9uJ3QgZGVsZXRlICovCi0jZGVmaW5lIEFPUE9CSl9EQVRBX1ZBTElEICAgICAgICAgICAweDA0CS8qIE9iamVjdCBpcyBpbnRpYWxpemVkIGFuZCBkYXRhIGlzIHZhbGlkICovCisjZGVmaW5lIEFPUE9CSl9EQVRBX1ZBTElEICAgICAgICAgICAweDA0CS8qIE9iamVjdCBpcyBpbml0aWFsaXplZCBhbmQgZGF0YSBpcyB2YWxpZCAqLwogI2RlZmluZSBBT1BPQkpfT0JKRUNUX0lOSVRJQUxJWkVEICAgMHgwOAkvKiBSZWdpb24gaXMgaW5pdGlhbGl6ZWQsIF9SRUcgd2FzIHJ1biAqLwogI2RlZmluZSBBT1BPQkpfU0VUVVBfQ09NUExFVEUgICAgICAgMHgxMAkvKiBSZWdpb24gc2V0dXAgaXMgY29tcGxldGUgKi8KICNkZWZpbmUgQU9QT0JKX0lOVkFMSUQgICAgICAgICAgICAgIDB4MjAJLyogSG9zdCBPUyB3b24ndCBhbGxvdyBhIFJlZ2lvbiBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZldmVudC5jCmluZGV4IGM2MWMzMDM5Li5lNWUzMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2ZXZlbnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2ZXZlbnQuYwpAQCAtMjE3LDkgKzIxNywxNyBAQAogCQkgICAgIHN0YXR1c19iaXRfbWFzaykKIAkJICAgICYmIChmaXhlZF9lbmFibGUgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgogCQkJZW5hYmxlX2JpdF9tYXNrKSkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGFuIGFjdGl2ZSAoc2lnbmFsbGVkKSBldmVudC4gSW52b2tlIGdsb2JhbCBldmVudAorCQkJICogaGFuZGxlciBpZiBwcmVzZW50LgorCQkJICovCisJCQlhY3BpX2ZpeGVkX2V2ZW50X2NvdW50W2ldKys7CisJCQlpZiAoYWNwaV9nYmxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIpIHsKKwkJCQlhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcgorCQkJCSAgICAoQUNQSV9FVkVOVF9UWVBFX0ZJWEVELCBOVUxMLCBpLAorCQkJCSAgICAgYWNwaV9nYmxfZ2xvYmFsX2V2ZW50X2hhbmRsZXJfY29udGV4dCk7CisJCQl9CiAKLQkJCS8qIEZvdW5kIGFuIGFjdGl2ZSAoc2lnbmFsbGVkKSBldmVudCAqLwotCQkJYWNwaV9vc19maXhlZF9ldmVudF9jb3VudChpKTsKIAkJCWludF9zdGF0dXMgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaChpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYwppbmRleCBmMjI2ZWFjLi43YzMzOWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZS5jCkBAIC01Miw2ICs1Miw4IEBACiAvKiBMb2NhbCBwcm90b3R5cGVzICovCiBzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2Qodm9pZCAqY29udGV4dCk7CiAKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfYXN5bmNoX2VuYWJsZV9ncGUodm9pZCAqY29udGV4dCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFzawpAQCAtMTAyLDcgKzEwNCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhciB0aGUgZ2l2ZW4gR1BFIGZyb20gc3RhbGUgZXZlbnRzIGFuZCBlbmFibGUgaXQuCisgKiBERVNDUklQVElPTjogQ2xlYXIgYSBHUEUgb2Ygc3RhbGUgZXZlbnRzIGFuZCBlbmFibGUgaXQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGFjcGlfc3RhdHVzCkBAIC0xMTMsMTIgKzExNSwxMyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZW5hYmxlX2dwZSk7CiAKIAkvKgotCSAqIFdlIHdpbGwgb25seSBhbGxvdyBhIEdQRSB0byBiZSBlbmFibGVkIGlmIGl0IGhhcyBlaXRoZXIgYW4KLQkgKiBhc3NvY2lhdGVkIG1ldGhvZCAoX0x4eC9fRXh4KSBvciBhIGhhbmRsZXIuIE90aGVyd2lzZSwgdGhlCi0JICogR1BFIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzYWJsZWQgYnkgYWNwaV9ldl9ncGVfZGlzcGF0Y2ggdGhlCi0JICogZmlyc3QgdGltZSBpdCBmaXJlcy4KKwkgKiBXZSB3aWxsIG9ubHkgYWxsb3cgYSBHUEUgdG8gYmUgZW5hYmxlZCBpZiBpdCBoYXMgZWl0aGVyIGFuIGFzc29jaWF0ZWQKKwkgKiBtZXRob2QgKF9MeHgvX0V4eCkgb3IgYSBoYW5kbGVyLCBvciBpcyB1c2luZyB0aGUgaW1wbGljaXQgbm90aWZ5CisJICogZmVhdHVyZS4gT3RoZXJ3aXNlLCB0aGUgR1BFIHdpbGwgYmUgaW1tZWRpYXRlbHkgZGlzYWJsZWQgYnkKKwkgKiBhY3BpX2V2X2dwZV9kaXNwYXRjaCB0aGUgZmlyc3QgdGltZSBpdCBmaXJlcy4KIAkgKi8KLQlpZiAoIShncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSkgeworCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KKwkgICAgQUNQSV9HUEVfRElTUEFUQ0hfTk9ORSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFORExFUik7CiAJfQogCkBAIC0xMzcsOSArMTQwLDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yYXdfZW5hYmxlX2dwZQorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWRkX2dwZV9yZWZlcmVuY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gIC0gR1BFIHRvIGVuYWJsZQorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gQWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgR1BFCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE0OCwxNiArMTUxLDIxIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYWNwaV9yYXdfZW5hYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pCithY3BpX3N0YXR1cyBhY3BpX2V2X2FkZF9ncGVfcmVmZXJlbmNlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfYWRkX2dwZV9yZWZlcmVuY2UpOworCiAJaWYgKGdwZV9ldmVudF9pbmZvLT5ydW50aW1lX2NvdW50ID09IEFDUElfVUlOVDhfTUFYKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9MSU1JVCk7CiAJfQogCiAJZ3BlX2V2ZW50X2luZm8tPnJ1bnRpbWVfY291bnQrKzsKIAlpZiAoZ3BlX2V2ZW50X2luZm8tPnJ1bnRpbWVfY291bnQgPT0gMSkgeworCisJCS8qIEVuYWJsZSBvbiBmaXJzdCByZWZlcmVuY2UgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2soZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CkBAIC0xNzMsOSArMTgxLDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yYXdfZGlzYWJsZV9ncGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3JlbW92ZV9ncGVfcmVmZXJlbmNlCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIEdQRSB0byBkaXNhYmxlCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAgICAgLSBSZW1vdmUgYSByZWZlcmVuY2UgdG8gdGhpcyBHUEUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTg0LDE2ICsxOTIsMjEgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhY3BpX3Jhd19kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9ncGVfcmVmZXJlbmNlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAorCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVtb3ZlX2dwZV9yZWZlcmVuY2UpOworCiAJaWYgKCFncGVfZXZlbnRfaW5mby0+cnVudGltZV9jb3VudCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTElNSVQpOwogCX0KIAogCWdwZV9ldmVudF9pbmZvLT5ydW50aW1lX2NvdW50LS07CiAJaWYgKCFncGVfZXZlbnRfaW5mby0+cnVudGltZV9jb3VudCkgeworCisJCS8qIERpc2FibGUgb24gbGFzdCByZWZlcmVuY2UgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2soZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXN0YXR1cyA9IGFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sCkBAIC0zNzksNyArMzkyLDcgQEAKIAkJCX0KIAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTlRFUlJVUFRTLAotCQkJCQkgICJSZWFkIEdQRSBSZWdpc3RlciBhdCBHUEUlWDogU3RhdHVzPSUwMlgsIEVuYWJsZT0lMDJYXG4iLAorCQkJCQkgICJSZWFkIEdQRSBSZWdpc3RlciBhdCBHUEUlMDJYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCiAJCQkJCSAgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwKIAkJCQkJICBzdGF0dXNfcmVnLCBlbmFibGVfcmVnKSk7CiAKQEAgLTQwNSw3ICs0MTgsOSBAQAogCQkJCQkgKiBvciBtZXRob2QuCiAJCQkJCSAqLwogCQkJCQlpbnRfc3RhdHVzIHw9Ci0JCQkJCSAgICBhY3BpX2V2X2dwZV9kaXNwYXRjaCgmZ3BlX2Jsb2NrLT4KKwkJCQkJICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoKGdwZV9ibG9jay0+CisJCQkJCQkJCSBub2RlLAorCQkJCQkJCQkgJmdwZV9ibG9jay0+CiAJCQkJCQlldmVudF9pbmZvWygoYWNwaV9zaXplKSBpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sIGogKyBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKTsKIAkJCQl9CiAJCQl9CkBAIC00MzUsMTcgKzQ1MCwyNSBAQAogICogICAgICAgICAgICAgIGFuIGludGVycnVwdCBoYW5kbGVyLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpOwogCiBzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2Qodm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8gPSAodm9pZCAqKWNvbnRleHQ7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gY29udGV4dDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gbG9jYWxfZ3BlX2V2ZW50X2luZm87CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmxvY2FsX2dwZV9ldmVudF9pbmZvOwogCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QpOwogCisJLyogQWxsb2NhdGUgYSBsb2NhbCBHUEUgYmxvY2sgKi8KKworCWxvY2FsX2dwZV9ldmVudF9pbmZvID0KKwkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CisJaWYgKCFsb2NhbF9ncGVfZXZlbnRfaW5mbykgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfTk9fTUVNT1JZLCAid2hpbGUgaGFuZGxpbmcgYSBHUEUiKSk7CisJCXJldHVybl9WT0lEOworCX0KKwogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTQ2Miw3ICs0ODUsNyBAQAogCSAqIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgR1BFIGluZm8gZm9yIHRoaXMgbGV2ZWwgLSB3ZSBjb3B5IHRoZSBpbmZvIHRvCiAJICogcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdpdGggcmVtb3ZlX2hhbmRsZXIvcmVtb3ZlX2Jsb2NrLgogCSAqLwotCUFDUElfTUVNQ1BZKCZsb2NhbF9ncGVfZXZlbnRfaW5mbywgZ3BlX2V2ZW50X2luZm8sCisJQUNQSV9NRU1DUFkobG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAogCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKQEAgLTQ3MCwxMiArNDkzLDI2IEBACiAJCXJldHVybl9WT0lEOwogCX0KIAotCS8qCi0JICogTXVzdCBjaGVjayBmb3IgY29udHJvbCBtZXRob2QgdHlwZSBkaXNwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGF2b2lkIGEKLQkgKiByYWNlIHdpdGggZXZfZ3BlX2luc3RhbGxfaGFuZGxlcgotCSAqLwotCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQotCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKKwkvKiBEbyB0aGUgY29ycmVjdCBkaXNwYXRjaCAtIG5vcm1hbCBtZXRob2Qgb3IgaW1wbGljaXQgbm90aWZ5ICovCisKKwlzd2l0Y2ggKGxvY2FsX2dwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spIHsKKwljYXNlIEFDUElfR1BFX0RJU1BBVENIX05PVElGWToKKworCQkvKgorCQkgKiBJbXBsaWNpdCBub3RpZnkuCisJCSAqIERpc3BhdGNoIGEgREVWSUNFX1dBS0Ugbm90aWZ5IHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyLgorCQkgKiBOT1RFOiB0aGUgcmVxdWVzdCBpcyBxdWV1ZWQgZm9yIGV4ZWN1dGlvbiBhZnRlciB0aGlzIG1ldGhvZAorCQkgKiBjb21wbGV0ZXMuIFRoZSBub3RpZnkgaGFuZGxlcnMgYXJlIE5PVCBpbnZva2VkIHN5bmNocm9ub3VzbHkKKwkJICogZnJvbSB0aGlzIHRocmVhZCAtLSBiZWNhdXNlIGhhbmRsZXJzIG1heSBpbiB0dXJuIHJ1biBvdGhlcgorCQkgKiBjb250cm9sIG1ldGhvZHMuCisJCSAqLworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdChsb2NhbF9ncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guCisJCQkJCQkgZGV2aWNlX25vZGUsCisJCQkJCQkgQUNQSV9OT1RJRllfREVWSUNFX1dBS0UpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EOgogCiAJCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCiAKQEAgLTQ4OCw3ICs1MjUsNyBAQAogCQkJICogY29udHJvbCBtZXRob2QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIEdQRQogCQkJICovCiAJCQlpbmZvLT5wcmVmaXhfbm9kZSA9Ci0JCQkgICAgbG9jYWxfZ3BlX2V2ZW50X2luZm8uZGlzcGF0Y2gubWV0aG9kX25vZGU7CisJCQkgICAgbG9jYWxfZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlOwogCQkJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CiAKIAkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CkBAIC00OTksNDYgKzUzNiw5OCBAQAogCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKIAkJCQkJIndoaWxlIGV2YWx1YXRpbmcgR1BFIG1ldGhvZCBbJTQuNHNdIiwKIAkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lCi0JCQkJCShsb2NhbF9ncGVfZXZlbnRfaW5mby5kaXNwYXRjaC4KKwkJCQkJKGxvY2FsX2dwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC4KIAkJCQkJIG1ldGhvZF9ub2RlKSkpOwogCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fVk9JRDsgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCX0KKwogCS8qIERlZmVyIGVuYWJsaW5nIG9mIEdQRSB1bnRpbCBhbGwgbm90aWZ5IGhhbmRsZXJzIGFyZSBkb25lICovCi0JYWNwaV9vc19leGVjdXRlKE9TTF9OT1RJRllfSEFORExFUiwgYWNwaV9ldl9hc3luY2hfZW5hYmxlX2dwZSwKLQkJCQlncGVfZXZlbnRfaW5mbyk7CisKKwlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX05PVElGWV9IQU5ETEVSLAorCQkJCSBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlLAorCQkJCSBsb2NhbF9ncGVfZXZlbnRfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRlJFRShsb2NhbF9ncGVfZXZlbnRfaW5mbyk7CisJfQogCXJldHVybl9WT0lEOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYXN5bmNoX2VuYWJsZV9ncGUKKyAqCisgKiBQQVJBTUVURVJTOiAgQ29udGV4dCAoZ3BlX2V2ZW50X2luZm8pIC0gSW5mbyBmb3IgdGhpcyBHUEUKKyAqICAgICAgICAgICAgICBDYWxsYmFjayBmcm9tIGFjcGlfb3NfZXhlY3V0ZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEFzeW5jaHJvbm91cyBjbGVhci9lbmFibGUgZm9yIEdQRS4gVGhpcyBhbGxvd3MgdGhlIEdQRSB0bworICogICAgICAgICAgICAgIGNvbXBsZXRlIChpLmUuLCBmaW5pc2ggZXhlY3V0aW9uIG9mIE5vdGlmeSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gY29udGV4dDsKKworCSh2b2lkKWFjcGlfZXZfZmluaXNoX2dwZShncGVfZXZlbnRfaW5mbyk7CisKKwlBQ1BJX0ZSRUUoZ3BlX2V2ZW50X2luZm8pOworCXJldHVybjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2ZpbmlzaF9ncGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAtIEluZm8gZm9yIHRoaXMgR1BFCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDbGVhci9FbmFibGUgYSBHUEUuIENvbW1vbiBjb2RlIHRoYXQgaXMgdXNlZCBhZnRlciBleGVjdXRpb24KKyAqICAgICAgICAgICAgICBvZiBhIEdQRSBtZXRob2Qgb3IgYSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgR1BFIGhhbmRsZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9ldl9maW5pc2hfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKK3sKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisKIAlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KIAkgICAgQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCS8qCi0JCSAqIEdQRSBpcyBsZXZlbC10cmlnZ2VyZWQsIHdlIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBhZnRlciBoYW5kbGluZwotCQkgKiB0aGUgZXZlbnQuCisJCSAqIEdQRSBpcyBsZXZlbC10cmlnZ2VyZWQsIHdlIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBhZnRlcgorCQkgKiBoYW5kbGluZyB0aGUgZXZlbnQuCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX1ZPSUQ7CisJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIAl9CiAKIAkvKgotCSAqIEVuYWJsZSB0aGlzIEdQRSwgY29uZGl0aW9uYWxseS4gVGhpcyBtZWFucyB0aGF0IHRoZSBHUEUgd2lsbCBvbmx5IGJlCi0JICogcGh5c2ljYWxseSBlbmFibGVkIGlmIHRoZSBlbmFibGVfZm9yX3J1biBiaXQgaXMgc2V0IGluIHRoZSBldmVudF9pbmZvCisJICogRW5hYmxlIHRoaXMgR1BFLCBjb25kaXRpb25hbGx5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIEdQRSB3aWxsCisJICogb25seSBiZSBwaHlzaWNhbGx5IGVuYWJsZWQgaWYgdGhlIGVuYWJsZV9mb3JfcnVuIGJpdCBpcyBzZXQKKwkgKiBpbiB0aGUgZXZlbnRfaW5mby4KIAkgKi8KLQkodm9pZClhY3BpX2h3X2xvd19zZXRfZ3BlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9DT05EX0VOQUJMRSk7Ci0KLQlyZXR1cm5fVk9JRDsKKwkodm9pZClhY3BpX2h3X2xvd19zZXRfZ3BlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9DT05ESVRJT05BTF9FTkFCTEUpOworCXJldHVybiAoQUVfT0spOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIEluZm8gZm9yIHRoaXMgR1BFCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gRGV2aWNlIG5vZGUuIE5VTEwgZm9yIEdQRTAvR1BFMQorICogICAgICAgICAgICAgIGdwZV9ldmVudF9pbmZvICAtIEluZm8gZm9yIHRoaXMgR1BFCiAgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gTnVtYmVyIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCiAgKgogICogUkVUVVJOOiAgICAgIElOVEVSUlVQVF9IQU5ETEVEIG9yIElOVEVSUlVQVF9OT1RfSEFORExFRApAQCAtNTUxLDEzICs2NDAsMjIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1MzIgZ3BlX251bWJlcikKK2FjcGlfZXZfZ3BlX2Rpc3BhdGNoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkgICAgc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1MzIgZ3BlX251bWJlcikKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHVybl92YWx1ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZ3BlX2Rpc3BhdGNoKTsKIAotCWFjcGlfb3NfZ3BlX2NvdW50KGdwZV9udW1iZXIpOworCS8qIEludm9rZSBnbG9iYWwgZXZlbnQgaGFuZGxlciBpZiBwcmVzZW50ICovCisKKwlhY3BpX2dwZV9jb3VudCsrOworCWlmIChhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcikgeworCQlhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX1RZUEVfR1BFLCBncGVfZGV2aWNlLAorCQkJCQkgICAgICBncGVfbnVtYmVyLAorCQkJCQkgICAgICBhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlcl9jb250ZXh0KTsKKwl9CiAKIAkvKgogCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiBOb3RlIHRoYXQKQEAgLTU2OCw1OSArNjY2LDU1IEBACiAJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiVW5hYmxlIHRvIGNsZWFyIEdQRVsweCUyWF0iLAotCQkJCQlncGVfbnVtYmVyKSk7CisJCQkJCSJVbmFibGUgdG8gY2xlYXIgR1BFJTAyWCIsIGdwZV9udW1iZXIpKTsKIAkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CiAJfQogCiAJLyoKLQkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wgbWV0aG9kCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIgZXhpc3RzLCB3ZSBpbnZva2UKLQkgKiBpdCBhbmQgZG8gbm90IGF0dGVtcHQgdG8gcnVuIHRoZSBtZXRob2QuIElmIHRoZXJlIGlzIG5laXRoZXIgYSBoYW5kbGVyCi0JICogbm9yIGEgbWV0aG9kLCB3ZSBkaXNhYmxlIHRoaXMgR1BFIHRvIHByZXZlbnQgZnVydGhlciBzdWNoIHBvaW50bGVzcwotCSAqIGV2ZW50cyBmcm9tIGZpcmluZy4KKwkgKiBBbHdheXMgZGlzYWJsZSB0aGUgR1BFIHNvIHRoYXQgaXQgZG9lcyBub3Qga2VlcCBmaXJpbmcgYmVmb3JlCisJICogYW55IGFzeW5jaHJvbm91cyBhY3Rpdml0eSBjb21wbGV0ZXMgKGVpdGhlciBmcm9tIHRoZSBleGVjdXRpb24KKwkgKiBvZiBhIEdQRSBtZXRob2Qgb3IgYW4gYXN5bmNocm9ub3VzIEdQRSBoYW5kbGVyLikKKwkgKgorCSAqIElmIHRoZXJlIGlzIG5vIGhhbmRsZXIgb3IgbWV0aG9kIHRvIHJ1biwganVzdCBkaXNhYmxlIHRoZQorCSAqIEdQRSBhbmQgbGVhdmUgaXQgZGlzYWJsZWQgcGVybWFuZW50bHkgdG8gcHJldmVudCBmdXJ0aGVyIHN1Y2gKKwkgKiBwb2ludGxlc3MgZXZlbnRzIGZyb20gZmlyaW5nLgorCSAqLworCXN0YXR1cyA9IGFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0RJU0FCTEUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJVbmFibGUgdG8gZGlzYWJsZSBHUEUlMDJYIiwgZ3BlX251bWJlcikpOworCQlyZXR1cm5fVUlOVDMyKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwl9CisKKwkvKgorCSAqIERpc3BhdGNoIHRoZSBHUEUgdG8gZWl0aGVyIGFuIGluc3RhbGxlZCBoYW5kbGVyIG9yIHRoZSBjb250cm9sCisJICogbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdQRSAoX0x4eCBvciBfRXh4KS4gSWYgYSBoYW5kbGVyCisJICogZXhpc3RzLCB3ZSBpbnZva2UgaXQgYW5kIGRvIG5vdCBhdHRlbXB0IHRvIHJ1biB0aGUgbWV0aG9kLgorCSAqIElmIHRoZXJlIGlzIG5laXRoZXIgYSBoYW5kbGVyIG5vciBhIG1ldGhvZCwgbGVhdmUgdGhlIEdQRQorCSAqIGRpc2FibGVkLgogCSAqLwogCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgewogCWNhc2UgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUjoKIAotCQkvKgotCQkgKiBJbnZva2UgdGhlIGluc3RhbGxlZCBoYW5kbGVyIChhdCBpbnRlcnJ1cHQgbGV2ZWwpCi0JCSAqIElnbm9yZSByZXR1cm4gc3RhdHVzIGZvciBub3cuCi0JCSAqIFRCRDogbGVhdmUgR1BFIGRpc2FibGVkIG9uIGVycm9yPwotCQkgKi8KLQkJKHZvaWQpZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmFkZHJlc3MoZ3BlX2V2ZW50X2luZm8tPgotCQkJCQkJCQlkaXNwYXRjaC4KLQkJCQkJCQkJaGFuZGxlci0+Ci0JCQkJCQkJCWNvbnRleHQpOworCQkvKiBJbnZva2UgdGhlIGluc3RhbGxlZCBoYW5kbGVyIChhdCBpbnRlcnJ1cHQgbGV2ZWwpICovCiAKLQkJLyogSXQgaXMgbm93IHNhZmUgdG8gY2xlYXIgbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cy4gKi8KKwkJcmV0dXJuX3ZhbHVlID0KKwkJICAgIGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyLT5hZGRyZXNzKGdwZV9kZXZpY2UsCisJCQkJCQkJICAgICAgZ3BlX251bWJlciwKKwkJCQkJCQkgICAgICBncGVfZXZlbnRfaW5mby0+CisJCQkJCQkJICAgICAgZGlzcGF0Y2guaGFuZGxlci0+CisJCQkJCQkJICAgICAgY29udGV4dCk7CiAKLQkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09Ci0JCSAgICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKLQkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJVbmFibGUgdG8gY2xlYXIgR1BFWzB4JTJYXSIsCi0JCQkJCQlncGVfbnVtYmVyKSk7Ci0JCQkJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7Ci0JCQl9CisJCS8qIElmIHJlcXVlc3RlZCwgY2xlYXIgKGlmIGxldmVsLXRyaWdnZXJlZCkgYW5kIHJlZW5hYmxlIHRoZSBHUEUgKi8KKworCQlpZiAocmV0dXJuX3ZhbHVlICYgQUNQSV9SRUVOQUJMRV9HUEUpIHsKKwkJCSh2b2lkKWFjcGlfZXZfZmluaXNoX2dwZShncGVfZXZlbnRfaW5mbyk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRDoKLQotCQkvKgotCQkgKiBEaXNhYmxlIHRoZSBHUEUsIHNvIGl0IGRvZXNuJ3Qga2VlcCBmaXJpbmcgYmVmb3JlIHRoZSBtZXRob2QgaGFzIGEKLQkJICogY2hhbmNlIHRvIHJ1biAoaXQgcnVucyBhc3luY2hyb25vdXNseSB3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19zZXRfZ3BlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiVW5hYmxlIHRvIGRpc2FibGUgR1BFWzB4JTJYXSIsCi0JCQkJCWdwZV9udW1iZXIpKTsKLQkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwotCQl9CisJY2FzZSBBQ1BJX0dQRV9ESVNQQVRDSF9OT1RJRlk6CiAKIAkJLyoKIAkJICogRXhlY3V0ZSB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGUgR1BFCkBAIC02MzEsNyArNzI1LDcgQEAKIAkJCQkJIGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiVW5hYmxlIHRvIHF1ZXVlIGhhbmRsZXIgZm9yIEdQRVsweCUyWF0gLSBldmVudCBkaXNhYmxlZCIsCisJCQkJCSJVbmFibGUgdG8gcXVldWUgaGFuZGxlciBmb3IgR1BFJTJYIC0gZXZlbnQgZGlzYWJsZWQiLAogCQkJCQlncGVfbnVtYmVyKSk7CiAJCX0KIAkJYnJlYWs7CkBAIC02NDQsMjAgKzczOCw5IEBACiAJCSAqIGEgR1BFIHRvIGJlIGVuYWJsZWQgaWYgaXQgaGFzIG5vIGhhbmRsZXIgb3IgbWV0aG9kLgogCQkgKi8KIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTm8gaGFuZGxlciBvciBtZXRob2QgZm9yIEdQRVsweCUyWF0sIGRpc2FibGluZyBldmVudCIsCisJCQkgICAgIk5vIGhhbmRsZXIgb3IgbWV0aG9kIGZvciBHUEUlMDJYLCBkaXNhYmxpbmcgZXZlbnQiLAogCQkJICAgIGdwZV9udW1iZXIpKTsKIAotCQkvKgotCQkgKiBEaXNhYmxlIHRoZSBHUEUuIFRoZSBHUEUgd2lsbCByZW1haW4gZGlzYWJsZWQgYSBoYW5kbGVyCi0JCSAqIGlzIGluc3RhbGxlZCBvciBBQ1BJQ0EgaXMgcmVzdGFydGVkLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfc2V0X2dwZShncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRElTQUJMRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIlVuYWJsZSB0byBkaXNhYmxlIEdQRVsweCUyWF0iLAotCQkJCQlncGVfbnVtYmVyKSk7Ci0JCQlyZXR1cm5fVUlOVDMyKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKLQkJfQogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYwppbmRleCAwMjBhZGQzLi45YWNiODY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWJsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYwpAQCAtMzYxLDkgKzM2MSw5IEBACiAKIAlncGVfYmxvY2stPm5vZGUgPSBncGVfZGV2aWNlOwogCWdwZV9ibG9jay0+Z3BlX2NvdW50ID0gKHUxNikocmVnaXN0ZXJfY291bnQgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCk7CisJZ3BlX2Jsb2NrLT5pbml0aWFsaXplZCA9IEZBTFNFOwogCWdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgPSByZWdpc3Rlcl9jb3VudDsKIAlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyID0gZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyOwotCWdwZV9ibG9jay0+aW5pdGlhbGl6ZWQgPSBGQUxTRTsKIAogCUFDUElfTUVNQ1BZKCZncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MsIGdwZV9ibG9ja19hZGRyZXNzLAogCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykpOwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCWFjcGlfYWxsX2dwZXNfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKwlhY3BpX2dibF9hbGxfZ3Blc19pbml0aWFsaXplZCA9IEZBTFNFOwogCiAJLyogRmluZCBhbGwgR1BFIG1ldGhvZHMgKF9MeHggb3JfRXh4KSBmb3IgdGhpcyBibG9jayAqLwogCkBAIC00MjMsMTQgKzQyMywxMiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgYmxvY2sKLSAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgICAgIC0gR3BlIEJsb2NrIGluZm8KKyAqIFBBUkFNRVRFUlM6ICBhY3BpX2dwZV9jYWxsYmFjawogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIGEgR1BFIGJsb2NrLiBGaXJzdCBmaW5kIGFuZCBydW4gYW55Ci0gKiAgICAgICAgICAgICAgX1BSVCBtZXRob2RzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmxvY2ssIHRoZW4gZW5hYmxlIHRoZQotICogICAgICAgICAgICAgIGFwcHJvcHJpYXRlIEdQRXMuCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIGEgR1BFIGJsb2NrLiBFbmFibGUgR1BFcyB0aGF0IGhhdmUKKyAqICAgICAgICAgICAgICBhc3NvY2lhdGVkIG1ldGhvZHMuCiAgKiAgICAgICAgICAgICAgTm90ZTogQXNzdW1lcyBuYW1lc3BhY2UgaXMgbG9ja2VkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NTAsOCArNDQ4LDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKTsKIAogCS8qCi0JICogSWdub3JlIGEgbnVsbCBHUEUgYmxvY2sgKGUuZy4sIGlmIG5vIEdQRSBibG9jayAxIGV4aXN0cykgYW5kCi0JICogR1BFIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5LgorCSAqIElnbm9yZSBhIG51bGwgR1BFIGJsb2NrIChlLmcuLCBpZiBubyBHUEUgYmxvY2sgMSBleGlzdHMpLCBhbmQKKwkgKiBhbnkgR1BFIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5LgogCSAqLwogCWlmICghZ3BlX2Jsb2NrIHx8IGdwZV9ibG9jay0+aW5pdGlhbGl6ZWQpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTQ1OSw4ICs0NTcsOCBAQAogCiAJLyoKIAkgKiBFbmFibGUgYWxsIEdQRXMgdGhhdCBoYXZlIGEgY29ycmVzcG9uZGluZyBtZXRob2QgYW5kIGhhdmUgdGhlCi0JICogQUNQSV9HUEVfQ0FOX1dBS0UgZmxhZyB1bnNldC4gIEFueSBvdGhlciBHUEVzIHdpdGhpbiB0aGlzIGJsb2NrIG11c3QKLQkgKiBiZSBlbmFibGVkIHZpYSB0aGUgYWNwaV9lbmFibGVfZ3BlKCkgaW50ZXJmYWNlLgorCSAqIEFDUElfR1BFX0NBTl9XQUtFIGZsYWcgdW5zZXQuIEFueSBvdGhlciBHUEVzIHdpdGhpbiB0aGlzIGJsb2NrCisJICogbXVzdCBiZSBlbmFibGVkIHZpYSB0aGUgYWNwaV9lbmFibGVfZ3BlKCkgaW50ZXJmYWNlLgogCSAqLwogCWdwZV9lbmFibGVkX2NvdW50ID0gMDsKIApAQCAtNDcyLDE0ICs0NzAsMTkgQEAKIAkJCWdwZV9pbmRleCA9IChpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgajsKIAkJCWdwZV9ldmVudF9pbmZvID0gJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfaW5kZXhdOwogCi0JCQkvKiBJZ25vcmUgR1BFcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZyBfTHh4L19FeHggbWV0aG9kICovCi0KLQkJCWlmICghKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkKKwkJCS8qCisJCQkgKiBJZ25vcmUgR1BFcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZyBfTHh4L19FeHggbWV0aG9kCisJCQkgKiBhbmQgR1BFcyB0aGF0IGFyZSB1c2VkIHRvIHdha2UgdGhlIHN5c3RlbQorCQkJICovCisJCQlpZiAoKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCQkJICAgICBBQ1BJX0dQRV9ESVNQQVRDSF9OT05FKQorCQkJICAgIHx8ICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykKKwkJCQk9PSBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKQogCQkJICAgIHx8IChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9DQU5fV0FLRSkpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJc3RhdHVzID0gYWNwaV9yYXdfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJCQlzdGF0dXMgPSBhY3BpX2V2X2FkZF9ncGVfcmVmZXJlbmNlKGdwZV9ldmVudF9pbmZvKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCiAJCQkJCSJDb3VsZCBub3QgZW5hYmxlIEdQRSAweCUwMlgiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWluaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMKaW5kZXggNGM4ZGVhNS4uYzU5ZGMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWluaXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlaW5pdC5jCkBAIC00NSwxMSArNDUsMjcgQEAKICNpbmNsdWRlICJhY2NvbW1vbi5oIgogI2luY2x1ZGUgImFjZXZlbnRzLmgiCiAjaW5jbHVkZSAiYWNuYW1lc3AuaCIKLSNpbmNsdWRlICJhY2ludGVycC5oIgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIEFDUElfTU9EVUxFX05BTUUoImV2Z3BlaW5pdCIpCiAKKy8qCisgKiBOb3RlOiBIaXN0b3J5IG9mIF9QUlcgc3VwcG9ydCBpbiBBQ1BJQ0EKKyAqCisgKiBPcmlnaW5hbGx5ICgyMDAwIC0gMjAxMCksIHRoZSBHUEUgaW5pdGlhbGl6YXRpb24gY29kZSBwZXJmb3JtZWQgYSB3YWxrIG9mCisgKiB0aGUgZW50aXJlIG5hbWVzcGFjZSB0byBleGVjdXRlIHRoZSBfUFJXIG1ldGhvZHMgYW5kIGRldGVjdCBhbGwgR1BFcworICogY2FwYWJsZSBvZiB3YWtpbmcgdGhlIHN5c3RlbS4KKyAqCisgKiBBcyBvZiAxMC8yMDEwLCB0aGUgX1BSVyBtZXRob2QgZXhlY3V0aW9uIGhhcyBiZWVuIHJlbW92ZWQgc2luY2UgaXQgaXMKKyAqIGFjdHVhbGx5IHVubmVjZXNzYXJ5LiBUaGUgaG9zdCBPUyBtdXN0IGluIGZhY3QgZXhlY3V0ZSBhbGwgX1BSVyBtZXRob2RzCisgKiBpbiBvcmRlciB0byBpZGVudGlmeSB0aGUgZGV2aWNlL3Bvd2VyLXJlc291cmNlIGRlcGVuZGVuY2llcy4gV2Ugbm93IHB1dAorICogdGhlIG9udXMgb24gdGhlIGhvc3QgT1MgdG8gaWRlbnRpZnkgdGhlIHdha2UgR1BFcyBhcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcworICogYW5kIHRvIGluZm9ybSBBQ1BJQ0Egb2YgdGhlc2UgR1BFcyB2aWEgdGhlIGFjcGlfc2V0dXBfZ3BlX2Zvcl93YWtlIGludGVyZmFjZS4gVGhpcworICogbm90IG9ubHkgcmVkdWNlcyB0aGUgY29tcGxleGl0eSBvZiB0aGUgQUNQSUNBIGluaXRpYWxpemF0aW9uIGNvZGUsIGJ1dCBpbgorICogc29tZSBjYXNlcyAob24gc3lzdGVtcyB3aXRoIHZlcnkgbGFyZ2UgbmFtZXNwYWNlcykgaXQgc2hvdWxkIHJlZHVjZSB0aGUKKyAqIGtlcm5lbCBib290IHRpbWUgYXMgd2VsbC4KKyAqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dwZV9pbml0aWFsaXplCkBAIC0yMjIsNyArMjM4LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAogCS8qCi0JICogMikgRmluZCBhbnkgX0x4eC9fRXh4IEdQRSBtZXRob2RzIHRoYXQgaGF2ZSBqdXN0IGJlZW4gbG9hZGVkLgorCSAqIEZpbmQgYW55IF9MeHgvX0V4eCBHUEUgbWV0aG9kcyB0aGF0IGhhdmUganVzdCBiZWVuIGxvYWRlZC4KIAkgKgogCSAqIEFueSBHUEVzIHRoYXQgY29ycmVzcG9uZCB0byBuZXcgX0x4eC9fRXh4IG1ldGhvZHMgYXJlIGltbWVkaWF0ZWx5CiAJICogZW5hYmxlZC4KQEAgLTIzNSw5ICsyNTEsOSBAQAogCQlyZXR1cm47CiAJfQogCisJd2Fsa19pbmZvLmNvdW50ID0gMDsKIAl3YWxrX2luZm8ub3duZXJfaWQgPSB0YWJsZV9vd25lcl9pZDsKIAl3YWxrX2luZm8uZXhlY3V0ZV9ieV9vd25lcl9pZCA9IFRSVUU7Ci0Jd2Fsa19pbmZvLmNvdW50ID0gMDsKIAogCS8qIFdhbGsgdGhlIGludGVycnVwdCBsZXZlbCBkZXNjcmlwdG9yIGxpc3QgKi8KIApAQCAtMjk4LDcgKzMxNCw3IEBACiAgKiAgICAgICAgICAgICAgICAgIHh4ICAgICAtIGlzIHRoZSBHUEUgbnVtYmVyIFtpbiBIRVhdCiAgKgogICogSWYgd2Fsa19pbmZvLT5leGVjdXRlX2J5X293bmVyX2lkIGlzIFRSVUUsIHdlIG9ubHkgZXhlY3V0ZSBleGFtaW5lIEdQRSBtZXRob2RzCi0gKiAgICB3aXRoIHRoYXQgb3duZXIuCisgKiB3aXRoIHRoYXQgb3duZXIuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDE1LDYgKzQzMSw3IEBACiAJICogQWRkIHRoZSBHUEUgaW5mb3JtYXRpb24gZnJvbSBhYm92ZSB0byB0aGUgZ3BlX2V2ZW50X2luZm8gYmxvY2sgZm9yCiAJICogdXNlIGR1cmluZyBkaXNwYXRjaCBvZiB0aGlzIEdQRS4KIAkgKi8KKwlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfihBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKTsKIAlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gKHU4KSh0eXBlIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKTsKIAlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2gubWV0aG9kX25vZGUgPSBtZXRob2Rfbm9kZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZXV0aWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGV1dGlsLmMKaW5kZXggMTlhMGU1MS4uMTBlNDc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZXV0aWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BldXRpbC5jCkBAIC0xNTQsNiArMTU0LDQ1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2V0X2dwZV9kZXZpY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgR1BFX1dBTEtfQ0FMTEJBQ0sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IE1hdGNoZXMgdGhlIGlucHV0IEdQRSBpbmRleCAoMC1jdXJyZW50X2dwZV9jb3VudCkgd2l0aCBhIEdQRQorICogICAgICAgICAgICAgIGJsb2NrIGRldmljZS4gTlVMTCBpZiB0aGUgR1BFIGlzIG9uZSBvZiB0aGUgRkFEVC1kZWZpbmVkIEdQRXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZ2V0X2dwZV9kZXZpY2Uoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkgICAgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfZGV2aWNlX2luZm8gKmluZm8gPSBjb250ZXh0OworCisJLyogSW5jcmVtZW50IEluZGV4IGJ5IHRoZSBudW1iZXIgb2YgR1BFcyBpbiB0aGlzIGJsb2NrICovCisKKwlpbmZvLT5uZXh0X2Jsb2NrX2Jhc2VfaW5kZXggKz0gZ3BlX2Jsb2NrLT5ncGVfY291bnQ7CisKKwlpZiAoaW5mby0+aW5kZXggPCBpbmZvLT5uZXh0X2Jsb2NrX2Jhc2VfaW5kZXgpIHsKKwkJLyoKKwkJICogVGhlIEdQRSBpbmRleCBpcyB3aXRoaW4gdGhpcyBibG9jaywgZ2V0IHRoZSBub2RlLiBMZWF2ZSB0aGUgbm9kZQorCQkgKiBOVUxMIGZvciB0aGUgRkFEVC1kZWZpbmVkIEdQRXMKKwkJICovCisJCWlmICgoZ3BlX2Jsb2NrLT5ub2RlKS0+dHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFKSB7CisJCQlpbmZvLT5ncGVfZGV2aWNlID0gZ3BlX2Jsb2NrLT5ub2RlOworCQl9CisKKwkJaW5mby0+c3RhdHVzID0gQUVfT0s7CisJCXJldHVybiAoQUVfQ1RSTF9FTkQpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sKICAqCiAgKiBQQVJBTUVURVJTOiAgaW50ZXJydXB0X251bWJlciAgICAgLSBJbnRlcnJ1cHQgZm9yIGEgR1BFIGJsb2NrCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2bWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldm1pc2MuYwppbmRleCBmY2FlZDlmLi44ZTMxYmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZtaXNjLmMKQEAgLTI4NCw0MSArMjg0LDQxIEBACiAgKiBSRVRVUk46ICAgICAgQUNQSV9JTlRFUlJVUFRfSEFORExFRAogICoKICAqIERFU0NSSVBUSU9OOiBJbnZva2VkIGRpcmVjdGx5IGZyb20gdGhlIFNDSSBoYW5kbGVyIHdoZW4gYSBnbG9iYWwgbG9jawotICogICAgICAgICAgICAgIHJlbGVhc2UgaW50ZXJydXB0IG9jY3Vycy4gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jaywKLSAqICAgICAgICAgICAgICBpZiBzdWNjZXNzZnVsLCBzaWduYWwgdGhlIHRocmVhZCB3YWl0aW5nIGZvciB0aGUgbG9jay4KKyAqICAgICAgICAgICAgICByZWxlYXNlIGludGVycnVwdCBvY2N1cnMuICBJZiB0aGVyZSdzIGEgdGhyZWFkIHdhaXRpbmcgZm9yCisgKiAgICAgICAgICAgICAgdGhlIGdsb2JhbCBsb2NrLCBzaWduYWwgaXQuCiAgKgogICogTk9URTogQXNzdW1lcyB0aGF0IHRoZSBzZW1hcGhvcmUgY2FuIGJlIHNpZ25hbGVkIGZyb20gaW50ZXJydXB0IGxldmVsLiBJZgogICogdGhpcyBpcyBub3QgcG9zc2libGUgZm9yIHNvbWUgcmVhc29uLCBhIHNlcGFyYXRlIHRocmVhZCB3aWxsIGhhdmUgdG8gYmUKICAqIHNjaGVkdWxlZCB0byBkbyB0aGlzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTggYWNwaV9ldl9nbG9iYWxfbG9ja19wZW5kaW5nOworc3RhdGljIHNwaW5sb2NrX3QgX2FjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrOworI2RlZmluZSBhY3BpX2V2X2dsb2JhbF9sb2NrX3BlbmRpbmdfbG9jayAmX2FjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrCiAKIHN0YXRpYyB1MzIgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQgKmNvbnRleHQpCiB7Ci0JdTggYWNxdWlyZWQgPSBGQUxTRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAKLQkvKgotCSAqIEF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLgotCSAqCi0JICogSWYgd2UgZG9uJ3QgZ2V0IGl0IG5vdywgaXQgd2lsbCBiZSBtYXJrZWQgcGVuZGluZyBhbmQgd2Ugd2lsbAotCSAqIHRha2UgYW5vdGhlciBpbnRlcnJ1cHQgd2hlbiBpdCBiZWNvbWVzIGZyZWUuCi0JICovCi0JQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX0ZBQ1MsIGFjcXVpcmVkKTsKLQlpZiAoYWNxdWlyZWQpIHsKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrKTsKIAotCQkvKiBHb3QgdGhlIGxvY2ssIG5vdyB3YWtlIGFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIGl0ICovCi0KLQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBUUlVFOwotCQkvKiBTZW5kIGEgdW5pdCB0byB0aGUgc2VtYXBob3JlICovCi0KLQkJaWYgKEFDUElfRkFJTFVSRQotCQkgICAgKGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZQotCQkgICAgIChhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUsIDEpKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkNvdWxkIG5vdCBzaWduYWwgR2xvYmFsIExvY2sgc2VtYXBob3JlIikpOwotCQl9CisJaWYgKCFhY3BpX2V2X2dsb2JhbF9sb2NrX3BlbmRpbmcpIHsKKwkJZ290byBvdXQ7CiAJfQogCisJLyogU2VuZCBhIHVuaXQgdG8gdGhlIHNlbWFwaG9yZSAqLworCisJc3RhdHVzID0gYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwgMSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3Qgc2lnbmFsIEdsb2JhbCBMb2NrIHNlbWFwaG9yZSIpKTsKKwl9CisKKwlhY3BpX2V2X2dsb2JhbF9sb2NrX3BlbmRpbmcgPSBGQUxTRTsKKworIG91dDoKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2V2X2dsb2JhbF9sb2NrX3BlbmRpbmdfbG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIChBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEKTsKIH0KIApAQCAtNDE1LDYgKzQxNSw3IEBACiAKIGFjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCkKIHsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1OCBhY3F1aXJlZCA9IEZBTFNFOwogCkBAIC00NjcsMzIgKzQ2OCw0NyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCS8qIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgYWN0dWFsIGhhcmR3YXJlIGxvY2sgKi8KKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrKTsKIAotCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhhY3BpX2dibF9GQUNTLCBhY3F1aXJlZCk7Ci0JaWYgKGFjcXVpcmVkKSB7CisJZG8gewogCi0JCS8qIFdlIGdvdCB0aGUgbG9jayAqLworCQkvKiBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGFjdHVhbCBoYXJkd2FyZSBsb2NrICovCiAKKwkJQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX0ZBQ1MsIGFjcXVpcmVkKTsKKwkJaWYgKGFjcXVpcmVkKSB7CisJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiQWNxdWlyZWQgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYWNwaV9ldl9nbG9iYWxfbG9ja19wZW5kaW5nID0gVFJVRTsKKworCQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2V2X2dsb2JhbF9sb2NrX3BlbmRpbmdfbG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIERpZCBub3QgZ2V0IHRoZSBsb2NrLiBUaGUgcGVuZGluZyBiaXQgd2FzIHNldCBhYm92ZSwgYW5kIHdlCisJCSAqIG11c3Qgd2FpdCB1bnRpbCB3ZSBnZXQgdGhlIGdsb2JhbCBsb2NrIHJlbGVhc2VkIGludGVycnVwdC4KKwkJICovCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJBY3F1aXJlZCBoYXJkd2FyZSBHbG9iYWwgTG9ja1xuIikpOworCQkJCSAgIldhaXRpbmcgZm9yIGhhcmR3YXJlIEdsb2JhbCBMb2NrXG4iKSk7CiAKLQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBUUlVFOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KKwkJLyoKKwkJICogV2FpdCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIGdsb2JhbCBsb2NrIGludGVycnVwdCBoYW5kbGVyLgorCQkgKiBUaGlzIGludGVyZmFjZSByZWxlYXNlcyB0aGUgaW50ZXJwcmV0ZXIgaWYgd2UgbXVzdCB3YWl0LgorCQkgKi8KKwkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoCisJCQkJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUsCisJCQkJCQlBQ1BJX1dBSVRfRk9SRVZFUik7CiAKLQkvKgotCSAqIERpZCBub3QgZ2V0IHRoZSBsb2NrLiBUaGUgcGVuZGluZyBiaXQgd2FzIHNldCBhYm92ZSwgYW5kIHdlIG11c3Qgbm93Ci0JICogd2FpdCB1bnRpbCB3ZSBnZXQgdGhlIGdsb2JhbCBsb2NrIHJlbGVhc2VkIGludGVycnVwdC4KLQkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJXYWl0aW5nIGZvciBoYXJkd2FyZSBHbG9iYWwgTG9ja1xuIikpOworCQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZ19sb2NrKTsKIAotCS8qCi0JICogV2FpdCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIGdsb2JhbCBsb2NrIGludGVycnVwdCBoYW5kbGVyLgotCSAqIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAotCQkJCQkgICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOworCX0gd2hpbGUgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKTsKKworCWFjcGlfZXZfZ2xvYmFsX2xvY2tfcGVuZGluZyA9IEZBTFNFOworCisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9ldl9nbG9iYWxfbG9ja19wZW5kaW5nX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYwppbmRleCAzNmFmMjIyLi4xMjI2Njg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZhY2UuYwpAQCAtOTIsNiArOTIsNTcgQEAKIAogQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcikKICNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9nbG9iYWxfZXZlbnRfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciBmdW5jdGlvbgorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBvbiBlYWNoIGV2ZW50CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTYXZlcyB0aGUgcG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbi4gVGhlIGdsb2JhbCBoYW5kbGVyCisgKiAgICAgICAgICAgICAgaXMgaW52b2tlZCB1cG9uIGVhY2ggaW5jb21pbmcgR1BFIGFuZCBGaXhlZCBFdmVudC4gSXQgaXMKKyAqICAgICAgICAgICAgICBpbnZva2VkIGF0IGludGVycnVwdCBsZXZlbCBhdCB0aGUgdGltZSBvZiB0aGUgZXZlbnQgZGlzcGF0Y2guCisgKiAgICAgICAgICAgICAgQ2FuIGJlIHVzZWQgdG8gdXBkYXRlIGV2ZW50IGNvdW50ZXJzLCBldGMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2luc3RhbGxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIoQUNQSV9HQkxfRVZFTlRfSEFORExFUiBoYW5kbGVyLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2dsb2JhbF9ldmVudF9oYW5kbGVyKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIWhhbmRsZXIpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBEb24ndCBhbGxvdyB0d28gaGFuZGxlcnMuICovCisKKwlpZiAoYWNwaV9nYmxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIpIHsKKwkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlhY3BpX2dibF9nbG9iYWxfZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7CisJYWNwaV9nYmxfZ2xvYmFsX2V2ZW50X2hhbmRsZXJfY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyCkBAIC02NzEsMTAgKzcyMiwxMCBAQAogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkJIHUzMiBncGVfbnVtYmVyLAotCQkJIHUzMiB0eXBlLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcywgdm9pZCAqY29udGV4dCkKKwkJCSB1MzIgdHlwZSwgYWNwaV9ncGVfaGFuZGxlciBhZGRyZXNzLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7CisJc3RydWN0IGFjcGlfZ3BlX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAKQEAgLTY5Myw3ICs3NDQsNyBAQAogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaGFuZGxlciBvYmplY3QgKi8KIAotCWhhbmRsZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvKSk7CisJaGFuZGxlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfaGFuZGxlcl9pbmZvKSk7CiAJaWYgKCFoYW5kbGVyKSB7CiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC03MjIsNyArNzczLDcgQEAKIAloYW5kbGVyLT5hZGRyZXNzID0gYWRkcmVzczsKIAloYW5kbGVyLT5jb250ZXh0ID0gY29udGV4dDsKIAloYW5kbGVyLT5tZXRob2Rfbm9kZSA9IGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZTsKLQloYW5kbGVyLT5vcmlnX2ZsYWdzID0gZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYKKwloYW5kbGVyLT5vcmlnaW5hbF9mbGFncyA9IGdwZV9ldmVudF9pbmZvLT5mbGFncyAmCiAJCQkoQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSyk7CiAKIAkvKgpAQCAtNzMxLDEwICs3ODIsMTAgQEAKIAkgKiBkaXNhYmxlZCBub3cgdG8gYXZvaWQgc3B1cmlvdXMgZXhlY3V0aW9uIG9mIHRoZSBoYW5kbGVyLgogCSAqLwogCi0JaWYgKChoYW5kbGVyLT5vcmlnX2ZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKQorCWlmICgoaGFuZGxlci0+b3JpZ2luYWxfZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpCiAJICAgICYmIGdwZV9ldmVudF9pbmZvLT5ydW50aW1lX2NvdW50KSB7Ci0JCWhhbmRsZXItPm9yaWdfZW5hYmxlZCA9IDE7Ci0JCSh2b2lkKWFjcGlfcmF3X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJaGFuZGxlci0+b3JpZ2luYWxseV9lbmFibGVkID0gMTsKKwkJKHZvaWQpYWNwaV9ldl9yZW1vdmVfZ3BlX3JlZmVyZW5jZShncGVfZXZlbnRfaW5mbyk7CiAJfQogCiAJLyogSW5zdGFsbCB0aGUgaGFuZGxlciAqLwpAQCAtNzc3LDEwICs4MjgsMTAgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBhY3BpX3N0YXR1cwogYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcykKKwkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2dwZV9oYW5kbGVyIGFkZHJlc3MpCiB7CiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKKwlzdHJ1Y3QgYWNwaV9ncGVfaGFuZGxlcl9pbmZvICpoYW5kbGVyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2NwdV9mbGFncyBmbGFnczsKIApAQCAtODM1LDcgKzg4Niw3IEBACiAJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlID0gaGFuZGxlci0+bWV0aG9kX25vZGU7CiAJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9CiAJCX4oQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSyk7Ci0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzIHw9IGhhbmRsZXItPm9yaWdfZmxhZ3M7CisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzIHw9IGhhbmRsZXItPm9yaWdpbmFsX2ZsYWdzOwogCiAJLyoKIAkgKiBJZiB0aGUgR1BFIHdhcyBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBhbmQgaXQgd2FzCkBAIC04NDMsOSArODk0LDkgQEAKIAkgKiBwb3N0LWluaXRpYWxpemF0aW9uIGNvbmZpZ3VyYXRpb24uCiAJICovCiAKLQlpZiAoKGhhbmRsZXItPm9yaWdfZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpCi0JICAgICYmIGhhbmRsZXItPm9yaWdfZW5hYmxlZCkKLQkJKHZvaWQpYWNwaV9yYXdfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJaWYgKChoYW5kbGVyLT5vcmlnaW5hbF9mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCkKKwkgICAgJiYgaGFuZGxlci0+b3JpZ2luYWxseV9lbmFibGVkKQorCQkodm9pZClhY3BpX2V2X2FkZF9ncGVfcmVmZXJlbmNlKGdwZV9ldmVudF9pbmZvKTsKIAogCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jCmluZGV4IGExZGFiZTMuLjkwNDg4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmV2bnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMKQEAgLTQzLDE4ICs0MywxMSBAQAogCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKLSNpbmNsdWRlICJhY2V2ZW50cy5oIgotI2luY2x1ZGUgImFjbmFtZXNwLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiBBQ1BJX01PRFVMRV9OQU1FKCJldnhmZXZudCIpCiAKLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9nZXRfZ3BlX2RldmljZShzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCi0JCSAgICAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLCB2b2lkICpjb250ZXh0KTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGUKQEAgLTIxMywxODUgKzIwNiw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ3BlX3dha2V1cAotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gRW5hYmxlIG9yIERpc2FibGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNldCBvciBjbGVhciB0aGUgR1BFJ3Mgd2FrZXVwIGVuYWJsZSBtYXNrIGJpdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9ncGVfd2FrZXVwKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1OCBhY3Rpb24pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQl1MzIgcmVnaXN0ZXJfYml0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dwZV93YWtldXApOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoIWdwZV9ldmVudF9pbmZvIHx8ICEoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfQ0FOX1dBS0UpKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87Ci0JaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgewotCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCXJlZ2lzdGVyX2JpdCA9Ci0JICAgIGFjcGlfaHdfZ2V0X2dwZV9yZWdpc3Rlcl9iaXQoZ3BlX2V2ZW50X2luZm8sIGdwZV9yZWdpc3Rlcl9pbmZvKTsKLQotCS8qIFBlcmZvcm0gdGhlIGFjdGlvbiAqLwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIEFDUElfR1BFX0VOQUJMRToKLQkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsCi0JCQkgICAgICh1OClyZWdpc3Rlcl9iaXQpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9HUEVfRElTQUJMRToKLQkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwKLQkJCSAgICAgICAodTgpcmVnaXN0ZXJfYml0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiJXUsIEludmFsaWQgYWN0aW9uIiwgYWN0aW9uKSk7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWJyZWFrOwotCX0KLQotdW5sb2NrX2FuZF9leGl0OgotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dwZV93YWtldXApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZW5hYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBZGQgYSByZWZlcmVuY2UgdG8gYSBHUEUuIE9uIHRoZSBmaXJzdCByZWZlcmVuY2UsIHRoZSBHUEUgaXMKLSAqICAgICAgICAgICAgICBoYXJkd2FyZS1lbmFibGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW5hYmxlX2dwZSk7Ci0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCi0KLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwotCWlmIChncGVfZXZlbnRfaW5mbykgewotCQlzdGF0dXMgPSBhY3BpX3Jhd19lbmFibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQl9Ci0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX2dwZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYSByZWZlcmVuY2UgdG8gYSBHUEUuIFdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzCi0gKiAgICAgICAgICAgICAgcmVtb3ZlZCwgb25seSB0aGVuIGlzIHRoZSBHUEUgZGlzYWJsZWQgKGZvciBydW50aW1lIEdQRXMpLCBvcgotICogICAgICAgICAgICAgIHRoZSBHUEUgbWFzayBiaXQgZGlzYWJsZWQgKGZvciB3YWtlIEdQRXMpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZGlzYWJsZV9ncGUpOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoZ3BlX2V2ZW50X2luZm8pIHsKLQkJc3RhdHVzID0gYWNwaV9yYXdfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pIDsKLQl9Ci0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZV9ncGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ3BlX2Nhbl93YWtlCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlLiBOVUxMIGZvciBHUEUwL0dQRTEKLSAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNldCB0aGUgQUNQSV9HUEVfQ0FOX1dBS0UgZmxhZyBmb3IgdGhlIGdpdmVuIEdQRS4gIElmIHRoZSBHUEUKLSAqICAgICAgICAgICAgICBoYXMgYSBjb3JyZXNwb25kaW5nIG1ldGhvZCBhbmQgaXMgY3VycmVudGx5IGVuYWJsZWQsIGRpc2FibGUgaXQKLSAqICAgICAgICAgICAgICAoR1BFcyB3aXRoIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBhcmUgZW5hYmxlZCB1bmNvbmRpdGlvbmFsbHkKLSAqICAgICAgICAgICAgICBkdXJpbmcgaW5pdGlhbGl6YXRpb24sIGJ1dCBHUEVzIHRoYXQgY2FuIHdha2UgdXAgYXJlIGV4cGVjdGVkCi0gKiAgICAgICAgICAgICAgdG8gYmUgaW5pdGlhbGx5IGRpc2FibGVkKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9ncGVfY2FuX3dha2UoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dwZV9jYW5fd2FrZSk7Ci0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCi0KLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwotCWlmIChncGVfZXZlbnRfaW5mbykgewotCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gQUNQSV9HUEVfQ0FOX1dBS0U7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQl9Ci0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ3BlX2Nhbl93YWtlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfZXZlbnQKICAqCiAgKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gVGhlIGZpeGVkIGV2ZW50dG8gYmUgZW5hYmxlZApAQCAtNDgzLDQ0ICsyOTcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2NsZWFyX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhciBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfY2xlYXJfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ncGUpOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2dwZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cwogICoKICAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnQKQEAgLTU3NSwzNzkgKzM1MSwzIEBACiB9CiAKIEFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ldmVudF9zdGF0dXMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2dwZV9zdGF0dXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UuIE5VTEwgZm9yIEdQRTAvR1BFMQotICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIGV2ZW50X3N0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgc3RhdHVzIG9mIGFuIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9ncGVfc3RhdHVzKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCi0JCSAgICB1MzIgZ3BlX251bWJlciwgYWNwaV9ldmVudF9zdGF0dXMgKmV2ZW50X3N0YXR1cykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2dwZV9zdGF0dXMpOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIE9idGFpbiBzdGF0dXMgb24gdGhlIHJlcXVlc3RlZCBHUEUgbnVtYmVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2dldF9ncGVfc3RhdHVzKGdwZV9ldmVudF9pbmZvLCBldmVudF9zdGF0dXMpOwotCi0JaWYgKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spCi0JCSpldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX0hBTkRMRTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ncGVfc3RhdHVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2dwZV9ibG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIEJsb2NrIERldmljZQotICogICAgICAgICAgICAgIGdwZV9ibG9ja19hZGRyZXNzICAgLSBBZGRyZXNzIGFuZCBzcGFjZV9pRAotICogICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50ICAgICAgLSBOdW1iZXIgb2YgR1BFIHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXIgICAgLSBIL1cgaW50ZXJydXB0IGZvciB0aGUgYmxvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJICAgICAgIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCi0JCSAgICAgICB1MzIgcmVnaXN0ZXJfY291bnQsIHUzMiBpbnRlcnJ1cHRfbnVtYmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9ncGVfYmxvY2spOwotCi0JaWYgKCghZ3BlX2RldmljZSkgfHwgKCFncGVfYmxvY2tfYWRkcmVzcykgfHwgKCFyZWdpc3Rlcl9jb3VudCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0Jbm9kZSA9IGFjcGlfbnNfdmFsaWRhdGVfaGFuZGxlKGdwZV9kZXZpY2UpOwotCWlmICghbm9kZSkgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKgotCSAqIEZvciB1c2VyLWluc3RhbGxlZCBHUEUgQmxvY2sgRGV2aWNlcywgdGhlIGdwZV9ibG9ja19iYXNlX251bWJlcgotCSAqIGlzIGFsd2F5cyB6ZXJvCi0JICovCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKG5vZGUsIGdwZV9ibG9ja19hZGRyZXNzLCByZWdpc3Rlcl9jb3VudCwgMCwKLQkJCQkgICAgIGludGVycnVwdF9udW1iZXIsICZncGVfYmxvY2spOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBJbnN0YWxsIGJsb2NrIGluIHRoZSBkZXZpY2Vfb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0KLQkJLyoKLQkJICogTm8gb2JqZWN0LCBjcmVhdGUgYSBuZXcgb25lIChEZXZpY2Ugbm9kZXMgZG8gbm90IGFsd2F5cyBoYXZlCi0JCSAqIGFuIGF0dGFjaGVkIG9iamVjdCkKLQkJICovCi0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9ERVZJQ0UpOwotCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9ERVZJQ0UpOwotCi0JCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0KLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCX0KLQotCS8qIE5vdyBpbnN0YWxsIHRoZSBHUEUgYmxvY2sgaW4gdGhlIGRldmljZV9vYmplY3QgKi8KLQotCW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JlbW92ZV9ncGVfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgICAgICAtIEhhbmRsZSB0byB0aGUgcGFyZW50IEdQRSBCbG9jayBEZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9ncGVfYmxvY2spOwotCi0JaWYgKCFncGVfZGV2aWNlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCW5vZGUgPSBhY3BpX25zX3ZhbGlkYXRlX2hhbmRsZShncGVfZGV2aWNlKTsKLQlpZiAoIW5vZGUpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogR2V0IHRoZSBkZXZpY2Vfb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQlpZiAoIW9ial9kZXNjIHx8ICFvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jaykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwotCX0KLQotCS8qIERlbGV0ZSB0aGUgR1BFIGJsb2NrIChidXQgbm90IHRoZSBkZXZpY2Vfb2JqZWN0KSAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKG9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2sgPSBOVUxMOwotCX0KLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9ncGVfZGV2aWNlCi0gKgotICogUEFSQU1FVEVSUzogIEluZGV4ICAgICAgICAgICAgICAgLSBTeXN0ZW0gR1BFIGluZGV4ICgwLWN1cnJlbnRfZ3BlX2NvdW50KQotICogICAgICAgICAgICAgIGdwZV9kZXZpY2UgICAgICAgICAgLSBXaGVyZSB0aGUgcGFyZW50IEdQRSBEZXZpY2UgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IE9idGFpbiB0aGUgR1BFIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IGluZGV4LiBBIE5VTEwKLSAqICAgICAgICAgICAgICBncGUgZGV2aWNlIGluZGljYXRlcyB0aGF0IHRoZSBncGUgbnVtYmVyIGlzIGNvbnRhaW5lZCBpbiBvbmUgb2YKLSAqICAgICAgICAgICAgICB0aGUgRkFEVC1kZWZpbmVkIGdwZSBibG9ja3MuIE90aGVyd2lzZSwgdGhlIEdQRSBibG9jayBkZXZpY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9ncGVfZGV2aWNlKHUzMiBpbmRleCwgYWNwaV9oYW5kbGUgKmdwZV9kZXZpY2UpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2RldmljZV9pbmZvIGluZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9ncGVfZGV2aWNlKTsKLQotCWlmICghZ3BlX2RldmljZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKGluZGV4ID49IGFjcGlfY3VycmVudF9ncGVfY291bnQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Ci0JfQotCi0JLyogU2V0dXAgYW5kIHdhbGsgdGhlIEdQRSBsaXN0ICovCi0KLQlpbmZvLmluZGV4ID0gaW5kZXg7Ci0JaW5mby5zdGF0dXMgPSBBRV9OT1RfRVhJU1Q7Ci0JaW5mby5ncGVfZGV2aWNlID0gTlVMTDsKLQlpbmZvLm5leHRfYmxvY2tfYmFzZV9pbmRleCA9IDA7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ldl9nZXRfZ3BlX2RldmljZSwgJmluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkqZ3BlX2RldmljZSA9IGluZm8uZ3BlX2RldmljZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoaW5mby5zdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZ3BlX2RldmljZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9nZXRfZ3BlX2RldmljZQotICoKLSAqIFBBUkFNRVRFUlM6ICBHUEVfV0FMS19DQUxMQkFDSwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTWF0Y2hlcyB0aGUgaW5wdXQgR1BFIGluZGV4ICgwLWN1cnJlbnRfZ3BlX2NvdW50KSB3aXRoIGEgR1BFCi0gKiAgICAgICAgICAgICAgYmxvY2sgZGV2aWNlLiBOVUxMIGlmIHRoZSBHUEUgaXMgb25lIG9mIHRoZSBGQURULWRlZmluZWQgR1BFcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2dldF9ncGVfZGV2aWNlKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJICAgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2ssIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2RldmljZV9pbmZvICppbmZvID0gY29udGV4dDsKLQotCS8qIEluY3JlbWVudCBJbmRleCBieSB0aGUgbnVtYmVyIG9mIEdQRXMgaW4gdGhpcyBibG9jayAqLwotCi0JaW5mby0+bmV4dF9ibG9ja19iYXNlX2luZGV4ICs9IGdwZV9ibG9jay0+Z3BlX2NvdW50OwotCi0JaWYgKGluZm8tPmluZGV4IDwgaW5mby0+bmV4dF9ibG9ja19iYXNlX2luZGV4KSB7Ci0JCS8qCi0JCSAqIFRoZSBHUEUgaW5kZXggaXMgd2l0aGluIHRoaXMgYmxvY2ssIGdldCB0aGUgbm9kZS4gTGVhdmUgdGhlIG5vZGUKLQkJICogTlVMTCBmb3IgdGhlIEZBRFQtZGVmaW5lZCBHUEVzCi0JCSAqLwotCQlpZiAoKGdwZV9ibG9jay0+bm9kZSktPnR5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgewotCQkJaW5mby0+Z3BlX2RldmljZSA9IGdwZV9ibG9jay0+bm9kZTsKLQkJfQotCi0JCWluZm8tPnN0YXR1cyA9IEFFX09LOwotCQlyZXR1cm4gKEFFX0NUUkxfRU5EKTsKLQl9Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfYWxsX2dwZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbmQgY2xlYXIgYWxsIEdQRXMgaW4gYWxsIEdQRSBibG9ja3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfYWxsX2dwZXModm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZGlzYWJsZV9hbGxfZ3Blcyk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZV9hbGxfcnVudGltZV9ncGVzCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMsIGluIGFsbCBHUEUgYmxvY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcygpOwotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91cGRhdGVfZ3BlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCBHUEVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIF9MeHggb3IgX0V4eCBtZXRob2RzIGFuZAotICogICAgICAgICAgICAgIGFyZSBub3QgcG9pbnRlZCB0byBieSBhbnkgZGV2aWNlIF9QUlcgbWV0aG9kcyBpbmRpY2F0aW5nIHRoYXQKLSAqICAgICAgICAgICAgICB0aGVzZSBHUEVzIGFyZSBnZW5lcmFsbHkgaW50ZW5kZWQgZm9yIHN5c3RlbSBvciBkZXZpY2Ugd2FrZXVwCi0gKiAgICAgICAgICAgICAgKHN1Y2ggR1BFcyBoYXZlIHRvIGJlIGVuYWJsZWQgZGlyZWN0bHkgd2hlbiB0aGUgZGV2aWNlcyB3aG9zZQotICogICAgICAgICAgICAgIF9QUlcgbWV0aG9kcyBwb2ludCB0byB0aGVtIGFyZSBzZXQgdXAgZm9yIHdha2V1cCBzaWduYWxpbmcpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdXBkYXRlX2dwZXModm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfdXBkYXRlX2dwZXMpOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0gZWxzZSBpZiAoYWNwaV9hbGxfZ3Blc19pbml0aWFsaXplZCkgewotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jaywgTlVMTCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWFjcGlfYWxsX2dwZXNfaW5pdGlhbGl6ZWQgPSBUUlVFOwotCX0KLQotdW5sb2NrOgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjg0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYwpAQCAtMCwwICsxLDY2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBldnhmZ3BlIC0gRXh0ZXJuYWwgSW50ZXJmYWNlcyBmb3IgR2VuZXJhbCBQdXJwb3NlIEV2ZW50cyAoR1BFcykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDEwLCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldnhmZ3BlIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3VwZGF0ZV9hbGxfZ3BlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb21wbGV0ZSBHUEUgaW5pdGlhbGl6YXRpb24gYW5kIGVuYWJsZSBhbGwgR1BFcyB0aGF0IGhhdmUKKyAqICAgICAgICAgICAgICBhc3NvY2lhdGVkIF9MeHggb3IgX0V4eCBtZXRob2RzIGFuZCBhcmUgbm90IHBvaW50ZWQgdG8gYnkgYW55CisgKiAgICAgICAgICAgICAgZGV2aWNlIF9QUlcgbWV0aG9kcyAodGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGVzZSBHUEVzIGFyZQorICogICAgICAgICAgICAgIGdlbmVyYWxseSBpbnRlbmRlZCBmb3Igc3lzdGVtIG9yIGRldmljZSB3YWtldXAuIFN1Y2ggR1BFcworICogICAgICAgICAgICAgIGhhdmUgdG8gYmUgZW5hYmxlZCBkaXJlY3RseSB3aGVuIHRoZSBkZXZpY2VzIHdob3NlIF9QUlcKKyAqICAgICAgICAgICAgICBtZXRob2RzIHBvaW50IHRvIHRoZW0gYXJlIHNldCB1cCBmb3Igd2FrZXVwIHNpZ25hbGluZy4pCisgKgorICogTk9URTogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnkgR1BFcyBhcmUgYWRkZWQgdG8gdGhlIHN5c3RlbS4gUHJpbWFyaWx5LAorICogYWZ0ZXIgdGhlIHN5c3RlbSBfUFJXIG1ldGhvZHMgaGF2ZSBiZWVuIHJ1biwgYnV0IGFsc28gYWZ0ZXIgYSBHUEUgQmxvY2sKKyAqIERldmljZSBoYXMgYmVlbiBhZGRlZCBvciBpZiBhbnkgbmV3IEdQRSBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZCB2aWEgYQorICogZHluYW1pYyB0YWJsZSBsb2FkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdXBkYXRlX2FsbF9ncGVzKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3VwZGF0ZV9hbGxfZ3Blcyk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKGFjcGlfZ2JsX2FsbF9ncGVzX2luaXRpYWxpemVkKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrLCBOVUxMKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJYWNwaV9nYmxfYWxsX2dwZXNfaW5pdGlhbGl6ZWQgPSBUUlVFOworCX0KKwordW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3VwZGF0ZV9hbGxfZ3BlcykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlLiBOVUxMIGZvciBHUEUwL0dQRTEKKyAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFkZCBhIHJlZmVyZW5jZSB0byBhIEdQRS4gT24gdGhlIGZpcnN0IHJlZmVyZW5jZSwgdGhlIEdQRSBpcworICogICAgICAgICAgICAgIGhhcmR3YXJlLWVuYWJsZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZV9ncGUpOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLworCisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlpZiAoZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9hZGRfZ3BlX3JlZmVyZW5jZShncGVfZXZlbnRfaW5mbyk7CisJfQorCisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ncGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZGlzYWJsZV9ncGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UuIE5VTEwgZm9yIEdQRTAvR1BFMQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGEgR1BFLiBXaGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBpcworICogICAgICAgICAgICAgIHJlbW92ZWQsIG9ubHkgdGhlbiBpcyB0aGUgR1BFIGRpc2FibGVkIChmb3IgcnVudGltZSBHUEVzKSwgb3IKKyAqICAgICAgICAgICAgICB0aGUgR1BFIG1hc2sgYml0IGRpc2FibGVkIChmb3Igd2FrZSBHUEVzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZGlzYWJsZV9ncGUpOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLworCisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlpZiAoZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9yZW1vdmVfZ3BlX3JlZmVyZW5jZShncGVfZXZlbnRfaW5mbykgOworCX0KKworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlX2dwZSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3NldHVwX2dwZV9mb3Jfd2FrZQorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWtlX2RldmljZSAgICAgICAgIC0gRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgR1BFICh2aWEgX1BSVykKKyAqICAgICAgICAgICAgICBncGVfZGV2aWNlICAgICAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UuIE5VTEwgZm9yIEdQRTAvR1BFMQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IE1hcmsgYSBHUEUgYXMgaGF2aW5nIHRoZSBhYmlsaXR5IHRvIHdha2UgdGhlIHN5c3RlbS4gVGhpcworICogICAgICAgICAgICAgIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZSBob3N0IGV4ZWN1dGVzIHRoZQorICogICAgICAgICAgICAgIF9QUlcgbWV0aG9kcyAoUG93ZXIgUmVzb3VyY2VzIGZvciBXYWtlKSBpbiB0aGUgc3lzdGVtIHRhYmxlcy4KKyAqICAgICAgICAgICAgICBFYWNoIF9QUlcgYXBwZWFycyB1bmRlciBhIERldmljZSBPYmplY3QgKFRoZSB3YWtlX2RldmljZSksIGFuZAorICogICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBpbmZvIGZvciB0aGUgd2FrZSBHUEUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogICAgICAgICAgICAgIHdha2VfZGV2aWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9zZXR1cF9ncGVfZm9yX3dha2UoYWNwaV9oYW5kbGUgd2FrZV9kZXZpY2UsCisJCQlhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGU7CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfc2V0dXBfZ3BlX2Zvcl93YWtlKTsKKworCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCisKKwlpZiAoIXdha2VfZGV2aWNlKSB7CisJCS8qCisJCSAqIEJ5IGZvcmNpbmcgd2FrZV9kZXZpY2UgdG8gYmUgdmFsaWQsIHdlIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZQorCQkgKiBpbXBsaWNpdCBub3RpZnkgZmVhdHVyZSBvbiBhbGwgaG9zdHMuCisJCSAqLworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogVmFsaWRhdGUgd2FrZV9kZXZpY2UgaXMgb2YgdHlwZSBEZXZpY2UgKi8KKworCWRldmljZV9ub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgd2FrZV9kZXZpY2UpOworCWlmIChkZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCisKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWlmIChncGVfZXZlbnRfaW5mbykgeworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBubyBtZXRob2Qgb3IgaGFuZGxlciBmb3IgdGhpcyBHUEUsIHRoZW4gdGhlCisJCSAqIHdha2VfZGV2aWNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhpcyBHUEUgZmlyZXMgKGFrYQorCQkgKiAiaW1wbGljaXQgbm90aWZ5IikgTm90ZTogVGhlIEdQRSBpcyBhc3N1bWVkIHRvIGJlCisJCSAqIGxldmVsLXRyaWdnZXJlZCAoZm9yIHdpbmRvd3MgY29tcGF0aWJpbGl0eSkuCisJCSAqLworCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9OT05FKSB7CisJCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgPQorCQkJICAgIChBQ1BJX0dQRV9ESVNQQVRDSF9OT1RJRlkgfAorCQkJICAgICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpOworCQkJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmRldmljZV9ub2RlID0gZGV2aWNlX25vZGU7CisJCX0KKworCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gQUNQSV9HUEVfQ0FOX1dBS0U7CisJCXN0YXR1cyA9IEFFX09LOworCX0KKworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXR1cF9ncGVfZm9yX3dha2UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X2dwZV93YWtlX21hc2sKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UuIE5VTEwgZm9yIEdQRTAvR1BFMQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jaworICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEVuYWJsZSBvciBEaXNhYmxlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTZXQgb3IgY2xlYXIgdGhlIEdQRSdzIHdha2V1cCBlbmFibGUgbWFzayBiaXQuIFRoZSBHUEUgbXVzdAorICogICAgICAgICAgICAgIGFscmVhZHkgYmUgbWFya2VkIGFzIGEgV0FLRSBHUEUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9zZXRfZ3BlX3dha2VfbWFzayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggYWN0aW9uKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CisJdTMyIHJlZ2lzdGVyX2JpdDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZ3BlX3dha2VfbWFzayk7CisKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgYW5kIHRoYXQgdGhpcyBHUEUgaXMgaW4KKwkgKiBmYWN0IGEgd2FrZSBHUEUKKwkgKi8KKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJaWYgKCEoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfQ0FOX1dBS0UpKSB7CisJCXN0YXR1cyA9IEFFX1RZUEU7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87CisJaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgeworCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCXJlZ2lzdGVyX2JpdCA9CisJICAgIGFjcGlfaHdfZ2V0X2dwZV9yZWdpc3Rlcl9iaXQoZ3BlX2V2ZW50X2luZm8sIGdwZV9yZWdpc3Rlcl9pbmZvKTsKKworCS8qIFBlcmZvcm0gdGhlIGFjdGlvbiAqLworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEFDUElfR1BFX0VOQUJMRToKKwkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsCisJCQkgICAgICh1OClyZWdpc3Rlcl9iaXQpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9HUEVfRElTQUJMRToKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwKKwkJCSAgICAgICAodTgpcmVnaXN0ZXJfYml0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiJXUsIEludmFsaWQgYWN0aW9uIiwgYWN0aW9uKSk7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWJyZWFrOworCX0KKwordW5sb2NrX2FuZF9leGl0OgorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3NldF9ncGVfd2FrZV9tYXNrKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2NsZWFyX2dwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDbGVhciBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfY2xlYXJfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ncGUpOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLworCisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2dwZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZ3BlX3N0YXR1cworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgZXZlbnRfc3RhdHVzICAgIC0gV2hlcmUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBHUEUgKHNpZ25hbGxlZC9ub3Rfc2lnbmFsbGVkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9nZXRfZ3BlX3N0YXR1cyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkgICAgdTMyIGdwZV9udW1iZXIsIGFjcGlfZXZlbnRfc3RhdHVzICpldmVudF9zdGF0dXMpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9ncGVfc3RhdHVzKTsKKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KKworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKiBPYnRhaW4gc3RhdHVzIG9uIHRoZSByZXF1ZXN0ZWQgR1BFIG51bWJlciAqLworCisJc3RhdHVzID0gYWNwaV9od19nZXRfZ3BlX3N0YXR1cyhncGVfZXZlbnRfaW5mbywgZXZlbnRfc3RhdHVzKTsKKworCWlmIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKQorCQkqZXZlbnRfc3RhdHVzIHw9IEFDUElfRVZFTlRfRkxBR19IQU5ETEU7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZ3BlX3N0YXR1cykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfYWxsX2dwZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGlzYWJsZSBhbmQgY2xlYXIgYWxsIEdQRXMgaW4gYWxsIEdQRSBibG9ja3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfYWxsX2dwZXModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZGlzYWJsZV9hbGxfZ3Blcyk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZV9hbGxfZ3BlcykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZV9hbGxfcnVudGltZV9ncGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMsIGluIGFsbCBHUEUgYmxvY2tzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcygpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9hbGxfcnVudGltZV9ncGVzKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgQmxvY2sgRGV2aWNlCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2FkZHJlc3MgICAtIEFkZHJlc3MgYW5kIHNwYWNlX2lECisgKiAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQgICAgICAtIE51bWJlciBvZiBHUEUgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIGJsb2NrCisgKiAgICAgICAgICAgICAgaW50ZXJydXB0X251bWJlciAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBJbnN0YWxsIGEgYmxvY2sgb2YgR1BFIHJlZ2lzdGVycy4gVGhlIEdQRXMgYXJlIG5vdAorICogICAgICAgICAgICAgIGVuYWJsZWQgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfaW5zdGFsbF9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJICAgICAgIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCSAgICAgICB1MzIgcmVnaXN0ZXJfY291bnQsIHUzMiBpbnRlcnJ1cHRfbnVtYmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKTsKKworCWlmICgoIWdwZV9kZXZpY2UpIHx8ICghZ3BlX2Jsb2NrX2FkZHJlc3MpIHx8ICghcmVnaXN0ZXJfY291bnQpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCW5vZGUgPSBhY3BpX25zX3ZhbGlkYXRlX2hhbmRsZShncGVfZGV2aWNlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyoKKwkgKiBGb3IgdXNlci1pbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZXMsIHRoZSBncGVfYmxvY2tfYmFzZV9udW1iZXIKKwkgKiBpcyBhbHdheXMgemVybworCSAqLworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhub2RlLCBncGVfYmxvY2tfYWRkcmVzcywgcmVnaXN0ZXJfY291bnQsIDAsCisJCQkJICAgICBpbnRlcnJ1cHRfbnVtYmVyLCAmZ3BlX2Jsb2NrKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogSW5zdGFsbCBibG9jayBpbiB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCisJCS8qCisJCSAqIE5vIG9iamVjdCwgY3JlYXRlIGEgbmV3IG9uZSAoRGV2aWNlIG5vZGVzIGRvIG5vdCBhbHdheXMgaGF2ZQorCQkgKiBhbiBhdHRhY2hlZCBvYmplY3QpCisJCSAqLworCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfREVWSUNFKTsKKwkJaWYgKCFvYmpfZGVzYykgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfREVWSUNFKTsKKworCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKwl9CisKKwkvKiBOb3cgaW5zdGFsbCB0aGUgR1BFIGJsb2NrIGluIHRoZSBkZXZpY2Vfb2JqZWN0ICovCisKKwlvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jayA9IGdwZV9ibG9jazsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9ibG9jaykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgQmxvY2sgRGV2aWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYSBwcmV2aW91c2x5IGluc3RhbGxlZCBibG9jayBvZiBHUEUgcmVnaXN0ZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfcmVtb3ZlX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKTsKKworCWlmICghZ3BlX2RldmljZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlub2RlID0gYWNwaV9uc192YWxpZGF0ZV9oYW5kbGUoZ3BlX2RldmljZSk7CisJaWYgKCFub2RlKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYyB8fCAhb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKKwl9CisKKwkvKiBEZWxldGUgdGhlIEdQRSBibG9jayAoYnV0IG5vdCB0aGUgZGV2aWNlX29iamVjdCkgKi8KKworCXN0YXR1cyA9IGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jayk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrID0gTlVMTDsKKwl9CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2dwZV9ibG9jaykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZ3BlX2RldmljZQorICoKKyAqIFBBUkFNRVRFUlM6ICBJbmRleCAgICAgICAgICAgICAgIC0gU3lzdGVtIEdQRSBpbmRleCAoMC1jdXJyZW50X2dwZV9jb3VudCkKKyAqICAgICAgICAgICAgICBncGVfZGV2aWNlICAgICAgICAgIC0gV2hlcmUgdGhlIHBhcmVudCBHUEUgRGV2aWNlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIEdQRSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBpbmRleC4gQSBOVUxMCisgKiAgICAgICAgICAgICAgZ3BlIGRldmljZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ3BlIG51bWJlciBpcyBjb250YWluZWQgaW4gb25lIG9mCisgKiAgICAgICAgICAgICAgdGhlIEZBRFQtZGVmaW5lZCBncGUgYmxvY2tzLiBPdGhlcndpc2UsIHRoZSBHUEUgYmxvY2sgZGV2aWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9nZXRfZ3BlX2RldmljZSh1MzIgaW5kZXgsIGFjcGlfaGFuZGxlICpncGVfZGV2aWNlKQoreworCXN0cnVjdCBhY3BpX2dwZV9kZXZpY2VfaW5mbyBpbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfZ3BlX2RldmljZSk7CisKKwlpZiAoIWdwZV9kZXZpY2UpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmIChpbmRleCA+PSBhY3BpX2N1cnJlbnRfZ3BlX2NvdW50KSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCX0KKworCS8qIFNldHVwIGFuZCB3YWxrIHRoZSBHUEUgbGlzdCAqLworCisJaW5mby5pbmRleCA9IGluZGV4OworCWluZm8uc3RhdHVzID0gQUVfTk9UX0VYSVNUOworCWluZm8uZ3BlX2RldmljZSA9IE5VTEw7CisJaW5mby5uZXh0X2Jsb2NrX2Jhc2VfaW5kZXggPSAwOworCisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfZXZfZ2V0X2dwZV9kZXZpY2UsICZpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJKmdwZV9kZXZpY2UgPSBBQ1BJX0NBU1RfUFRSKGFjcGlfaGFuZGxlLCBpbmZvLmdwZV9kZXZpY2UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhpbmZvLnN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ncGVfZGV2aWNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jCmluZGV4IDE0NzUwZGIuLjg1YzNjYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMKQEAgLTYyLDEwICs2MiwxMCBAQAogICogUEFSQU1FVEVSUzoJZ3BlX2V2ZW50X2luZm8JICAgIC0gSW5mbyBibG9jayBmb3IgdGhlIEdQRQogICoJCWdwZV9yZWdpc3Rlcl9pbmZvICAgLSBJbmZvIGJsb2NrIGZvciB0aGUgR1BFIHJlZ2lzdGVyCiAgKgotICogUkVUVVJOOglTdGF0dXMKKyAqIFJFVFVSTjoJUmVnaXN0ZXIgbWFzayB3aXRoIGEgb25lIGluIHRoZSBHUEUgYml0IHBvc2l0aW9uCiAgKgotICogREVTQ1JJUFRJT046CUNvbXB1dGUgR1BFIGVuYWJsZSBtYXNrIHdpdGggb25lIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICoJCUdQRSBzZXQuCisgKiBERVNDUklQVElPTjogQ29tcHV0ZSB0aGUgcmVnaXN0ZXIgbWFzayBmb3IgdGhpcyBHUEUuIE9uZSBiaXQgaXMgc2V0IGluIHRoZQorICogICAgICAgICAgICAgIGNvcnJlY3QgcG9zaXRpb24gZm9yIHRoZSBpbnB1dCBHUEUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtODUsMTIgKzg1LDEyIEBACiAgKgogICogUkVUVVJOOglTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgR1BFIGluIGl0cyBlbmFibGUgcmVnaXN0ZXIuCisgKiBERVNDUklQVElPTjogRW5hYmxlIG9yIGRpc2FibGUgYSBzaW5nbGUgR1BFIGluIHRoZSBwYXJlbnQgZW5hYmxlIHJlZ2lzdGVyLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2xvd19zZXRfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTggYWN0aW9uKQorYWNwaV9od19sb3dfc2V0X2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sIHUzMiBhY3Rpb24pCiB7CiAJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTExMywxNCArMTEzLDIwIEBACiAJCXJldHVybiAoc3RhdHVzKTsKIAl9CiAKLQkvKiBTZXQgb3QgY2xlYXIganVzdCB0aGUgYml0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUgKi8KKwkvKiBTZXQgb3IgY2xlYXIganVzdCB0aGUgYml0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUgKi8KIAogCXJlZ2lzdGVyX2JpdCA9IGFjcGlfaHdfZ2V0X2dwZV9yZWdpc3Rlcl9iaXQoZ3BlX2V2ZW50X2luZm8sCiAJCQkJCQlncGVfcmVnaXN0ZXJfaW5mbyk7CiAJc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIEFDUElfR1BFX0NPTkRfRU5BQkxFOgotCQlpZiAoIShyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4pKQorCWNhc2UgQUNQSV9HUEVfQ09ORElUSU9OQUxfRU5BQkxFOgorCisJCS8qIE9ubHkgZW5hYmxlIGlmIHRoZSBlbmFibGVfZm9yX3J1biBiaXQgaXMgc2V0ICovCisKKwkJaWYgKCEocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuKSkgewogCQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KIAogCWNhc2UgQUNQSV9HUEVfRU5BQkxFOgogCQlBQ1BJX1NFVF9CSVQoZW5hYmxlX21hc2ssIHJlZ2lzdGVyX2JpdCk7CkBAIC0xMzEsNyArMTM3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBhY3Rpb25cbiIpKTsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgR1BFIEFjdGlvbiwgJXVcbiIsIGFjdGlvbikpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApAQCAtMTY4LDEzICsxNzQsMTMgQEAKIAkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOwogCX0KIAotCXJlZ2lzdGVyX2JpdCA9IGFjcGlfaHdfZ2V0X2dwZV9yZWdpc3Rlcl9iaXQoZ3BlX2V2ZW50X2luZm8sCi0JCQkJCQlncGVfcmVnaXN0ZXJfaW5mbyk7Ci0KIAkvKgogCSAqIFdyaXRlIGEgb25lIHRvIHRoZSBhcHByb3ByaWF0ZSBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciB0bwogCSAqIGNsZWFyIHRoaXMgR1BFLgogCSAqLworCXJlZ2lzdGVyX2JpdCA9CisJICAgIGFjcGlfaHdfZ2V0X2dwZV9yZWdpc3Rlcl9iaXQoZ3BlX2V2ZW50X2luZm8sIGdwZV9yZWdpc3Rlcl9pbmZvKTsKKwogCXN0YXR1cyA9IGFjcGlfaHdfd3JpdGUocmVnaXN0ZXJfYml0LAogCQkJICAgICAgICZncGVfcmVnaXN0ZXJfaW5mby0+c3RhdHVzX2FkZHJlc3MpOwogCkBAIC0yMDEsOCArMjA3LDggQEAKIAl1MzIgaW5fYnl0ZTsKIAl1MzIgcmVnaXN0ZXJfYml0OwogCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9ldmVudF9zdGF0dXMgbG9jYWxfZXZlbnRfc3RhdHVzID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRnbG9iYWwuYwppbmRleCBlODdiYzY3Li41MDg1MzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jCkBAIC03NjgsNyArNzY4LDcgQEAKIAlhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0gPSBOVUxMOwogCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSA9IE5VTEw7CiAJYWNwaV9jdXJyZW50X2dwZV9jb3VudCA9IDA7Ci0JYWNwaV9hbGxfZ3Blc19pbml0aWFsaXplZCA9IEZBTFNFOworCWFjcGlfZ2JsX2FsbF9ncGVzX2luaXRpYWxpemVkID0gRkFMU0U7CiAKIAkvKiBHbG9iYWwgaGFuZGxlcnMgKi8KIApAQCAtNzc4LDYgKzc3OCw3IEBACiAJYWNwaV9nYmxfaW5pdF9oYW5kbGVyID0gTlVMTDsKIAlhY3BpX2dibF90YWJsZV9oYW5kbGVyID0gTlVMTDsKIAlhY3BpX2dibF9pbnRlcmZhY2VfaGFuZGxlciA9IE5VTEw7CisJYWNwaV9nYmxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIgPSBOVUxMOwogCiAJLyogR2xvYmFsIExvY2sgc3VwcG9ydCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmggYi9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmgKaW5kZXggMThkZjFlOS4uZWYwNTgxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktaW50ZXJuYWwuaApAQCAtMTA5LDYgKzEwOSw4IEBACiAJCXJldHVybiBzaXplb2YoKmVzdGF0dXMpICsgZXN0YXR1cy0+ZGF0YV9sZW5ndGg7CiB9CiAKK3ZvaWQgYXBlaV9lc3RhdHVzX3ByaW50KGNvbnN0IGNoYXIgKnBmeCwKKwkJCWNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpOwogaW50IGFwZWlfZXN0YXR1c19jaGVja19oZWFkZXIoY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cyk7CiBpbnQgYXBlaV9lc3RhdHVzX2NoZWNrKGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9jcGVyLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9jcGVyLmMKaW5kZXggZjRjZjJmYy4uMzE0NjRhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvY3Blci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2NwZXIuYwpAQCAtNDYsNiArNDYsMzE3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcGVyX25leHRfcmVjb3JkX2lkKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmNwZXJfc2V2ZXJpdHlfc3Ryc1tdID0geworCSJyZWNvdmVyYWJsZSIsCisJImZhdGFsIiwKKwkiY29ycmVjdGVkIiwKKwkiaW5mbyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3Blcl9zZXZlcml0eV9zdHIodW5zaWduZWQgaW50IHNldmVyaXR5KQoreworCXJldHVybiBzZXZlcml0eSA8IEFSUkFZX1NJWkUoY3Blcl9zZXZlcml0eV9zdHJzKSA/CisJCWNwZXJfc2V2ZXJpdHlfc3Ryc1tzZXZlcml0eV0gOiAidW5rbm93biI7Cit9CisKKy8qCisgKiBjcGVyX3ByaW50X2JpdHMgLSBwcmludCBzdHJpbmdzIGZvciBzZXQgYml0cworICogQHBmeDogcHJlZml4IGZvciBlYWNoIGxpbmUsIGluY2x1ZGluZyBsb2cgbGV2ZWwgYW5kIHByZWZpeCBzdHJpbmcKKyAqIEBiaXRzOiBiaXQgbWFzaworICogQHN0cnM6IHN0cmluZyBhcnJheSwgaW5kZXhlZCBieSBiaXQgcG9zaXRpb24KKyAqIEBzdHJzX3NpemU6IHNpemUgb2YgdGhlIHN0cmluZyBhcnJheTogQHN0cnMKKyAqCisgKiBGb3IgZWFjaCBzZXQgYml0IGluIEBiaXRzLCBwcmludCB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcgaW4gQHN0cnMuCisgKiBJZiB0aGUgb3V0cHV0IGxlbmd0aCBpcyBsb25nZXIgdGhhbiA4MCwgbXVsdGlwbGUgbGluZSB3aWxsIGJlCisgKiBwcmludGVkLCB3aXRoIEBwZnggaXMgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4KKyAqLworc3RhdGljIHZvaWQgY3Blcl9wcmludF9iaXRzKGNvbnN0IGNoYXIgKnBmeCwgdW5zaWduZWQgaW50IGJpdHMsCisJCQkgICAgY29uc3QgY2hhciAqc3Ryc1tdLCB1bnNpZ25lZCBpbnQgc3Ryc19zaXplKQoreworCWludCBpLCBsZW4gPSAwOworCWNvbnN0IGNoYXIgKnN0cjsKKwljaGFyIGJ1Zls4NF07CisKKwlmb3IgKGkgPSAwOyBpIDwgc3Ryc19zaXplOyBpKyspIHsKKwkJaWYgKCEoYml0cyAmICgxVSA8PCBpKSkpCisJCQljb250aW51ZTsKKwkJc3RyID0gc3Ryc1tpXTsKKwkJaWYgKGxlbiAmJiBsZW4gKyBzdHJsZW4oc3RyKSArIDIgPiA4MCkgeworCQkJcHJpbnRrKCIlc1xuIiwgYnVmKTsKKwkJCWxlbiA9IDA7CisJCX0KKwkJaWYgKCFsZW4pCisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlcyIsIHBmeCwgc3RyKTsKKwkJZWxzZQorCQkJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIHNpemVvZihidWYpLWxlbiwgIiwgJXMiLCBzdHIpOworCX0KKwlpZiAobGVuKQorCQlwcmludGsoIiVzXG4iLCBidWYpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY3Blcl9wcm9jX3R5cGVfc3Ryc1tdID0geworCSJJQTMyL1g2NCIsCisJIklBNjQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNwZXJfcHJvY19pc2Ffc3Ryc1tdID0geworCSJJQTMyIiwKKwkiSUE2NCIsCisJIlg2NCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3Blcl9wcm9jX2Vycm9yX3R5cGVfc3Ryc1tdID0geworCSJjYWNoZSBlcnJvciIsCisJIlRMQiBlcnJvciIsCisJImJ1cyBlcnJvciIsCisJIm1pY3JvLWFyY2hpdGVjdHVyYWwgZXJyb3IiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNwZXJfcHJvY19vcF9zdHJzW10gPSB7CisJInVua25vd24gb3IgZ2VuZXJpYyIsCisJImRhdGEgcmVhZCIsCisJImRhdGEgd3JpdGUiLAorCSJpbnN0cnVjdGlvbiBleGVjdXRpb24iLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNwZXJfcHJvY19mbGFnX3N0cnNbXSA9IHsKKwkicmVzdGFydGFibGUiLAorCSJwcmVjaXNlIElQIiwKKwkib3ZlcmZsb3ciLAorCSJjb3JyZWN0ZWQiLAorfTsKKworc3RhdGljIHZvaWQgY3Blcl9wcmludF9wcm9jX2dlbmVyaWMoY29uc3QgY2hhciAqcGZ4LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3Blcl9zZWNfcHJvY19nZW5lcmljICpwcm9jKQoreworCWlmIChwcm9jLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX1BST0NfVkFMSURfVFlQRSkKKwkJcHJpbnRrKCIlcyIicHJvY2Vzc29yX3R5cGU6ICVkLCAlc1xuIiwgcGZ4LCBwcm9jLT5wcm9jX3R5cGUsCisJCSAgICAgICBwcm9jLT5wcm9jX3R5cGUgPCBBUlJBWV9TSVpFKGNwZXJfcHJvY190eXBlX3N0cnMpID8KKwkJICAgICAgIGNwZXJfcHJvY190eXBlX3N0cnNbcHJvYy0+cHJvY190eXBlXSA6ICJ1bmtub3duIik7CisJaWYgKHByb2MtPnZhbGlkYXRpb25fYml0cyAmIENQRVJfUFJPQ19WQUxJRF9JU0EpCisJCXByaW50aygiJXMiInByb2Nlc3Nvcl9pc2E6ICVkLCAlc1xuIiwgcGZ4LCBwcm9jLT5wcm9jX2lzYSwKKwkJICAgICAgIHByb2MtPnByb2NfaXNhIDwgQVJSQVlfU0laRShjcGVyX3Byb2NfaXNhX3N0cnMpID8KKwkJICAgICAgIGNwZXJfcHJvY19pc2Ffc3Ryc1twcm9jLT5wcm9jX2lzYV0gOiAidW5rbm93biIpOworCWlmIChwcm9jLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX1BST0NfVkFMSURfRVJST1JfVFlQRSkgeworCQlwcmludGsoIiVzIiJlcnJvcl90eXBlOiAweCUwMnhcbiIsIHBmeCwgcHJvYy0+cHJvY19lcnJvcl90eXBlKTsKKwkJY3Blcl9wcmludF9iaXRzKHBmeCwgcHJvYy0+cHJvY19lcnJvcl90eXBlLAorCQkJCWNwZXJfcHJvY19lcnJvcl90eXBlX3N0cnMsCisJCQkJQVJSQVlfU0laRShjcGVyX3Byb2NfZXJyb3JfdHlwZV9zdHJzKSk7CisJfQorCWlmIChwcm9jLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX1BST0NfVkFMSURfT1BFUkFUSU9OKQorCQlwcmludGsoIiVzIiJvcGVyYXRpb246ICVkLCAlc1xuIiwgcGZ4LCBwcm9jLT5vcGVyYXRpb24sCisJCSAgICAgICBwcm9jLT5vcGVyYXRpb24gPCBBUlJBWV9TSVpFKGNwZXJfcHJvY19vcF9zdHJzKSA/CisJCSAgICAgICBjcGVyX3Byb2Nfb3Bfc3Ryc1twcm9jLT5vcGVyYXRpb25dIDogInVua25vd24iKTsKKwlpZiAocHJvYy0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QUk9DX1ZBTElEX0ZMQUdTKSB7CisJCXByaW50aygiJXMiImZsYWdzOiAweCUwMnhcbiIsIHBmeCwgcHJvYy0+ZmxhZ3MpOworCQljcGVyX3ByaW50X2JpdHMocGZ4LCBwcm9jLT5mbGFncywgY3Blcl9wcm9jX2ZsYWdfc3RycywKKwkJCQlBUlJBWV9TSVpFKGNwZXJfcHJvY19mbGFnX3N0cnMpKTsKKwl9CisJaWYgKHByb2MtPnZhbGlkYXRpb25fYml0cyAmIENQRVJfUFJPQ19WQUxJRF9MRVZFTCkKKwkJcHJpbnRrKCIlcyIibGV2ZWw6ICVkXG4iLCBwZngsIHByb2MtPmxldmVsKTsKKwlpZiAocHJvYy0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QUk9DX1ZBTElEX1ZFUlNJT04pCisJCXByaW50aygiJXMiInZlcnNpb25faW5mbzogMHglMDE2bGx4XG4iLCBwZngsIHByb2MtPmNwdV92ZXJzaW9uKTsKKwlpZiAocHJvYy0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QUk9DX1ZBTElEX0lEKQorCQlwcmludGsoIiVzIiJwcm9jZXNzb3JfaWQ6IDB4JTAxNmxseFxuIiwgcGZ4LCBwcm9jLT5wcm9jX2lkKTsKKwlpZiAocHJvYy0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QUk9DX1ZBTElEX1RBUkdFVF9BRERSRVNTKQorCQlwcmludGsoIiVzIiJ0YXJnZXRfYWRkcmVzczogMHglMDE2bGx4XG4iLAorCQkgICAgICAgcGZ4LCBwcm9jLT50YXJnZXRfYWRkcik7CisJaWYgKHByb2MtPnZhbGlkYXRpb25fYml0cyAmIENQRVJfUFJPQ19WQUxJRF9SRVFVRVNUT1JfSUQpCisJCXByaW50aygiJXMiInJlcXVlc3Rvcl9pZDogMHglMDE2bGx4XG4iLAorCQkgICAgICAgcGZ4LCBwcm9jLT5yZXF1ZXN0b3JfaWQpOworCWlmIChwcm9jLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX1BST0NfVkFMSURfUkVTUE9OREVSX0lEKQorCQlwcmludGsoIiVzIiJyZXNwb25kZXJfaWQ6IDB4JTAxNmxseFxuIiwKKwkJICAgICAgIHBmeCwgcHJvYy0+cmVzcG9uZGVyX2lkKTsKKwlpZiAocHJvYy0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QUk9DX1ZBTElEX0lQKQorCQlwcmludGsoIiVzIiJJUDogMHglMDE2bGx4XG4iLCBwZngsIHByb2MtPmlwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNwZXJfbWVtX2Vycl90eXBlX3N0cnNbXSA9IHsKKwkidW5rbm93biIsCisJIm5vIGVycm9yIiwKKwkic2luZ2xlLWJpdCBFQ0MiLAorCSJtdWx0aS1iaXQgRUNDIiwKKwkic2luZ2xlLXN5bWJvbCBjaGlwa2lsbCBFQ0MiLAorCSJtdWx0aS1zeW1ib2wgY2hpcGtpbGwgRUNDIiwKKwkibWFzdGVyIGFib3J0IiwKKwkidGFyZ2V0IGFib3J0IiwKKwkicGFyaXR5IGVycm9yIiwKKwkid2F0Y2hkb2cgdGltZW91dCIsCisJImludmFsaWQgYWRkcmVzcyIsCisJIm1pcnJvciBCcm9rZW4iLAorCSJtZW1vcnkgc3BhcmluZyIsCisJInNjcnViIGNvcnJlY3RlZCBlcnJvciIsCisJInNjcnViIHVuY29ycmVjdGVkIGVycm9yIiwKK307CisKK3N0YXRpYyB2b2lkIGNwZXJfcHJpbnRfbWVtKGNvbnN0IGNoYXIgKnBmeCwgY29uc3Qgc3RydWN0IGNwZXJfc2VjX21lbV9lcnIgKm1lbSkKK3sKKwlpZiAobWVtLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX01FTV9WQUxJRF9FUlJPUl9TVEFUVVMpCisJCXByaW50aygiJXMiImVycm9yX3N0YXR1czogMHglMDE2bGx4XG4iLCBwZngsIG1lbS0+ZXJyb3Jfc3RhdHVzKTsKKwlpZiAobWVtLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX01FTV9WQUxJRF9QSFlTSUNBTF9BRERSRVNTKQorCQlwcmludGsoIiVzIiJwaHlzaWNhbF9hZGRyZXNzOiAweCUwMTZsbHhcbiIsCisJCSAgICAgICBwZngsIG1lbS0+cGh5c2ljYWxfYWRkcik7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfUEhZU0lDQUxfQUREUkVTU19NQVNLKQorCQlwcmludGsoIiVzIiJwaHlzaWNhbF9hZGRyZXNzX21hc2s6IDB4JTAxNmxseFxuIiwKKwkJICAgICAgIHBmeCwgbWVtLT5waHlzaWNhbF9hZGRyX21hc2spOworCWlmIChtZW0tPnZhbGlkYXRpb25fYml0cyAmIENQRVJfTUVNX1ZBTElEX05PREUpCisJCXByaW50aygiJXMiIm5vZGU6ICVkXG4iLCBwZngsIG1lbS0+bm9kZSk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfQ0FSRCkKKwkJcHJpbnRrKCIlcyIiY2FyZDogJWRcbiIsIHBmeCwgbWVtLT5jYXJkKTsKKwlpZiAobWVtLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX01FTV9WQUxJRF9NT0RVTEUpCisJCXByaW50aygiJXMiIm1vZHVsZTogJWRcbiIsIHBmeCwgbWVtLT5tb2R1bGUpOworCWlmIChtZW0tPnZhbGlkYXRpb25fYml0cyAmIENQRVJfTUVNX1ZBTElEX0JBTkspCisJCXByaW50aygiJXMiImJhbms6ICVkXG4iLCBwZngsIG1lbS0+YmFuayk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfREVWSUNFKQorCQlwcmludGsoIiVzIiJkZXZpY2U6ICVkXG4iLCBwZngsIG1lbS0+ZGV2aWNlKTsKKwlpZiAobWVtLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX01FTV9WQUxJRF9ST1cpCisJCXByaW50aygiJXMiInJvdzogJWRcbiIsIHBmeCwgbWVtLT5yb3cpOworCWlmIChtZW0tPnZhbGlkYXRpb25fYml0cyAmIENQRVJfTUVNX1ZBTElEX0NPTFVNTikKKwkJcHJpbnRrKCIlcyIiY29sdW1uOiAlZFxuIiwgcGZ4LCBtZW0tPmNvbHVtbik7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfQklUX1BPU0lUSU9OKQorCQlwcmludGsoIiVzIiJiaXRfcG9zaXRpb246ICVkXG4iLCBwZngsIG1lbS0+Yml0X3Bvcyk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfUkVRVUVTVE9SX0lEKQorCQlwcmludGsoIiVzIiJyZXF1ZXN0b3JfaWQ6IDB4JTAxNmxseFxuIiwgcGZ4LCBtZW0tPnJlcXVlc3Rvcl9pZCk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfUkVTUE9OREVSX0lEKQorCQlwcmludGsoIiVzIiJyZXNwb25kZXJfaWQ6IDB4JTAxNmxseFxuIiwgcGZ4LCBtZW0tPnJlc3BvbmRlcl9pZCk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfVEFSR0VUX0lEKQorCQlwcmludGsoIiVzIiJ0YXJnZXRfaWQ6IDB4JTAxNmxseFxuIiwgcGZ4LCBtZW0tPnRhcmdldF9pZCk7CisJaWYgKG1lbS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfRVJST1JfVFlQRSkgeworCQl1OCBldHlwZSA9IG1lbS0+ZXJyb3JfdHlwZTsKKwkJcHJpbnRrKCIlcyIiZXJyb3JfdHlwZTogJWQsICVzXG4iLCBwZngsIGV0eXBlLAorCQkgICAgICAgZXR5cGUgPCBBUlJBWV9TSVpFKGNwZXJfbWVtX2Vycl90eXBlX3N0cnMpID8KKwkJICAgICAgIGNwZXJfbWVtX2Vycl90eXBlX3N0cnNbZXR5cGVdIDogInVua25vd24iKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjcGVyX3BjaWVfcG9ydF90eXBlX3N0cnNbXSA9IHsKKwkiUENJZSBlbmQgcG9pbnQiLAorCSJsZWdhY3kgUENJIGVuZCBwb2ludCIsCisJInVua25vd24iLAorCSJ1bmtub3duIiwKKwkicm9vdCBwb3J0IiwKKwkidXBzdHJlYW0gc3dpdGNoIHBvcnQiLAorCSJkb3duc3RyZWFtIHN3aXRjaCBwb3J0IiwKKwkiUENJZSB0byBQQ0kvUENJLVggYnJpZGdlIiwKKwkiUENJL1BDSS1YIHRvIFBDSWUgYnJpZGdlIiwKKwkicm9vdCBjb21wbGV4IGludGVncmF0ZWQgZW5kcG9pbnQgZGV2aWNlIiwKKwkicm9vdCBjb21wbGV4IGV2ZW50IGNvbGxlY3RvciIsCit9OworCitzdGF0aWMgdm9pZCBjcGVyX3ByaW50X3BjaWUoY29uc3QgY2hhciAqcGZ4LCBjb25zdCBzdHJ1Y3QgY3Blcl9zZWNfcGNpZSAqcGNpZSkKK3sKKwlpZiAocGNpZS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QQ0lFX1ZBTElEX1BPUlRfVFlQRSkKKwkJcHJpbnRrKCIlcyIicG9ydF90eXBlOiAlZCwgJXNcbiIsIHBmeCwgcGNpZS0+cG9ydF90eXBlLAorCQkgICAgICAgcGNpZS0+cG9ydF90eXBlIDwgQVJSQVlfU0laRShjcGVyX3BjaWVfcG9ydF90eXBlX3N0cnMpID8KKwkJICAgICAgIGNwZXJfcGNpZV9wb3J0X3R5cGVfc3Ryc1twY2llLT5wb3J0X3R5cGVdIDogInVua25vd24iKTsKKwlpZiAocGNpZS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QQ0lFX1ZBTElEX1ZFUlNJT04pCisJCXByaW50aygiJXMiInZlcnNpb246ICVkLiVkXG4iLCBwZngsCisJCSAgICAgICBwY2llLT52ZXJzaW9uLm1ham9yLCBwY2llLT52ZXJzaW9uLm1pbm9yKTsKKwlpZiAocGNpZS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QQ0lFX1ZBTElEX0NPTU1BTkRfU1RBVFVTKQorCQlwcmludGsoIiVzIiJjb21tYW5kOiAweCUwNHgsIHN0YXR1czogMHglMDR4XG4iLCBwZngsCisJCSAgICAgICBwY2llLT5jb21tYW5kLCBwY2llLT5zdGF0dXMpOworCWlmIChwY2llLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX1BDSUVfVkFMSURfREVWSUNFX0lEKSB7CisJCWNvbnN0IF9fdTggKnA7CisJCXByaW50aygiJXMiImRldmljZV9pZDogJTA0eDolMDJ4OiUwMnguJXhcbiIsIHBmeCwKKwkJICAgICAgIHBjaWUtPmRldmljZV9pZC5zZWdtZW50LCBwY2llLT5kZXZpY2VfaWQuYnVzLAorCQkgICAgICAgcGNpZS0+ZGV2aWNlX2lkLmRldmljZSwgcGNpZS0+ZGV2aWNlX2lkLmZ1bmN0aW9uKTsKKwkJcHJpbnRrKCIlcyIic2xvdDogJWRcbiIsIHBmeCwKKwkJICAgICAgIHBjaWUtPmRldmljZV9pZC5zbG90ID4+IENQRVJfUENJRV9TTE9UX1NISUZUKTsKKwkJcHJpbnRrKCIlcyIic2Vjb25kYXJ5X2J1czogMHglMDJ4XG4iLCBwZngsCisJCSAgICAgICBwY2llLT5kZXZpY2VfaWQuc2Vjb25kYXJ5X2J1cyk7CisJCXByaW50aygiJXMiInZlbmRvcl9pZDogMHglMDR4LCBkZXZpY2VfaWQ6IDB4JTA0eFxuIiwgcGZ4LAorCQkgICAgICAgcGNpZS0+ZGV2aWNlX2lkLnZlbmRvcl9pZCwgcGNpZS0+ZGV2aWNlX2lkLmRldmljZV9pZCk7CisJCXAgPSBwY2llLT5kZXZpY2VfaWQuY2xhc3NfY29kZTsKKwkJcHJpbnRrKCIlcyIiY2xhc3NfY29kZTogJTAyeCUwMnglMDJ4XG4iLCBwZngsIHBbMF0sIHBbMV0sIHBbMl0pOworCX0KKwlpZiAocGNpZS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QQ0lFX1ZBTElEX1NFUklBTF9OVU1CRVIpCisJCXByaW50aygiJXMiInNlcmlhbCBudW1iZXI6IDB4JTA0eCwgMHglMDR4XG4iLCBwZngsCisJCSAgICAgICBwY2llLT5zZXJpYWxfbnVtYmVyLmxvd2VyLCBwY2llLT5zZXJpYWxfbnVtYmVyLnVwcGVyKTsKKwlpZiAocGNpZS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9QQ0lFX1ZBTElEX0JSSURHRV9DT05UUk9MX1NUQVRVUykKKwkJcHJpbnRrKAorCSIlcyIiYnJpZGdlOiBzZWNvbmRhcnlfc3RhdHVzOiAweCUwNHgsIGNvbnRyb2w6IDB4JTA0eFxuIiwKKwlwZngsIHBjaWUtPmJyaWRnZS5zZWNvbmRhcnlfc3RhdHVzLCBwY2llLT5icmlkZ2UuY29udHJvbCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphcGVpX2VzdGF0dXNfc2VjdGlvbl9mbGFnX3N0cnNbXSA9IHsKKwkicHJpbWFyeSIsCisJImNvbnRhaW5tZW50IHdhcm5pbmciLAorCSJyZXNldCIsCisJInRocmVzaG9sZCBleGNlZWRlZCIsCisJInJlc291cmNlIG5vdCBhY2Nlc3NpYmxlIiwKKwkibGF0ZW50IGVycm9yIiwKK307CisKK3N0YXRpYyB2b2lkIGFwZWlfZXN0YXR1c19wcmludF9zZWN0aW9uKAorCWNvbnN0IGNoYXIgKnBmeCwgY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX2RhdGEgKmdkYXRhLCBpbnQgc2VjX25vKQoreworCXV1aWRfbGUgKnNlY190eXBlID0gKHV1aWRfbGUgKilnZGF0YS0+c2VjdGlvbl90eXBlOworCV9fdTE2IHNldmVyaXR5OworCisJc2V2ZXJpdHkgPSBnZGF0YS0+ZXJyb3Jfc2V2ZXJpdHk7CisJcHJpbnRrKCIlcyIic2VjdGlvbjogJWQsIHNldmVyaXR5OiAlZCwgJXNcbiIsIHBmeCwgc2VjX25vLCBzZXZlcml0eSwKKwkgICAgICAgY3Blcl9zZXZlcml0eV9zdHIoc2V2ZXJpdHkpKTsKKwlwcmludGsoIiVzIiJmbGFnczogMHglMDJ4XG4iLCBwZngsIGdkYXRhLT5mbGFncyk7CisJY3Blcl9wcmludF9iaXRzKHBmeCwgZ2RhdGEtPmZsYWdzLCBhcGVpX2VzdGF0dXNfc2VjdGlvbl9mbGFnX3N0cnMsCisJCQlBUlJBWV9TSVpFKGFwZWlfZXN0YXR1c19zZWN0aW9uX2ZsYWdfc3RycykpOworCWlmIChnZGF0YS0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9TRUNfVkFMSURfRlJVX0lEKQorCQlwcmludGsoIiVzIiJmcnVfaWQ6ICVwVWxcbiIsIHBmeCwgKHV1aWRfbGUgKilnZGF0YS0+ZnJ1X2lkKTsKKwlpZiAoZ2RhdGEtPnZhbGlkYXRpb25fYml0cyAmIENQRVJfU0VDX1ZBTElEX0ZSVV9URVhUKQorCQlwcmludGsoIiVzIiJmcnVfdGV4dDogJS4yMHNcbiIsIHBmeCwgZ2RhdGEtPmZydV90ZXh0KTsKKworCWlmICghdXVpZF9sZV9jbXAoKnNlY190eXBlLCBDUEVSX1NFQ19QUk9DX0dFTkVSSUMpKSB7CisJCXN0cnVjdCBjcGVyX3NlY19wcm9jX2dlbmVyaWMgKnByb2NfZXJyID0gKHZvaWQgKikoZ2RhdGEgKyAxKTsKKwkJcHJpbnRrKCIlcyIic2VjdGlvbl90eXBlOiBnZW5lcmFsIHByb2Nlc3NvciBlcnJvclxuIiwgcGZ4KTsKKwkJaWYgKGdkYXRhLT5lcnJvcl9kYXRhX2xlbmd0aCA+PSBzaXplb2YoKnByb2NfZXJyKSkKKwkJCWNwZXJfcHJpbnRfcHJvY19nZW5lcmljKHBmeCwgcHJvY19lcnIpOworCQllbHNlCisJCQlnb3RvIGVycl9zZWN0aW9uX3Rvb19zbWFsbDsKKwl9IGVsc2UgaWYgKCF1dWlkX2xlX2NtcCgqc2VjX3R5cGUsIENQRVJfU0VDX1BMQVRGT1JNX01FTSkpIHsKKwkJc3RydWN0IGNwZXJfc2VjX21lbV9lcnIgKm1lbV9lcnIgPSAodm9pZCAqKShnZGF0YSArIDEpOworCQlwcmludGsoIiVzIiJzZWN0aW9uX3R5cGU6IG1lbW9yeSBlcnJvclxuIiwgcGZ4KTsKKwkJaWYgKGdkYXRhLT5lcnJvcl9kYXRhX2xlbmd0aCA+PSBzaXplb2YoKm1lbV9lcnIpKQorCQkJY3Blcl9wcmludF9tZW0ocGZ4LCBtZW1fZXJyKTsKKwkJZWxzZQorCQkJZ290byBlcnJfc2VjdGlvbl90b29fc21hbGw7CisJfSBlbHNlIGlmICghdXVpZF9sZV9jbXAoKnNlY190eXBlLCBDUEVSX1NFQ19QQ0lFKSkgeworCQlzdHJ1Y3QgY3Blcl9zZWNfcGNpZSAqcGNpZSA9ICh2b2lkICopKGdkYXRhICsgMSk7CisJCXByaW50aygiJXMiInNlY3Rpb25fdHlwZTogUENJZSBlcnJvclxuIiwgcGZ4KTsKKwkJaWYgKGdkYXRhLT5lcnJvcl9kYXRhX2xlbmd0aCA+PSBzaXplb2YoKnBjaWUpKQorCQkJY3Blcl9wcmludF9wY2llKHBmeCwgcGNpZSk7CisJCWVsc2UKKwkJCWdvdG8gZXJyX3NlY3Rpb25fdG9vX3NtYWxsOworCX0gZWxzZQorCQlwcmludGsoIiVzIiJzZWN0aW9uIHR5cGU6IHVua25vd24sICVwVWxcbiIsIHBmeCwgc2VjX3R5cGUpOworCisJcmV0dXJuOworCitlcnJfc2VjdGlvbl90b29fc21hbGw6CisJcHJfZXJyKEZXX1dBUk4gImVycm9yIHNlY3Rpb24gbGVuZ3RoIGlzIHRvbyBzbWFsbFxuIik7Cit9CisKK3ZvaWQgYXBlaV9lc3RhdHVzX3ByaW50KGNvbnN0IGNoYXIgKnBmeCwKKwkJCWNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCit7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX2RhdGEgKmdkYXRhOworCXVuc2lnbmVkIGludCBkYXRhX2xlbiwgZ2VkYXRhX2xlbjsKKwlpbnQgc2VjX25vID0gMDsKKwlfX3UxNiBzZXZlcml0eTsKKworCXByaW50aygiJXMiIkFQRUkgZ2VuZXJpYyBoYXJkd2FyZSBlcnJvciBzdGF0dXNcbiIsIHBmeCk7CisJc2V2ZXJpdHkgPSBlc3RhdHVzLT5lcnJvcl9zZXZlcml0eTsKKwlwcmludGsoIiVzIiJzZXZlcml0eTogJWQsICVzXG4iLCBwZngsIHNldmVyaXR5LAorCSAgICAgICBjcGVyX3NldmVyaXR5X3N0cihzZXZlcml0eSkpOworCWRhdGFfbGVuID0gZXN0YXR1cy0+ZGF0YV9sZW5ndGg7CisJZ2RhdGEgPSAoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX2RhdGEgKikoZXN0YXR1cyArIDEpOworCXdoaWxlIChkYXRhX2xlbiA+IHNpemVvZigqZ2RhdGEpKSB7CisJCWdlZGF0YV9sZW4gPSBnZGF0YS0+ZXJyb3JfZGF0YV9sZW5ndGg7CisJCWFwZWlfZXN0YXR1c19wcmludF9zZWN0aW9uKHBmeCwgZ2RhdGEsIHNlY19ubyk7CisJCWRhdGFfbGVuIC09IGdlZGF0YV9sZW4gKyBzaXplb2YoKmdkYXRhKTsKKwkJc2VjX25vKys7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYXBlaV9lc3RhdHVzX3ByaW50KTsKKwogaW50IGFwZWlfZXN0YXR1c19jaGVja19oZWFkZXIoY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKIHsKIAlpZiAoZXN0YXR1cy0+ZGF0YV9sZW5ndGggJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYwppbmRleCBjZjI5ZGY2Li4wOTZhZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9laW5qLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZWluai5jCkBAIC0zOSw3ICszOSw3IEBACiAjZGVmaW5lIEVJTkpfUEZYICJFSU5KOiAiCiAKICNkZWZpbmUgU1BJTl9VTklUCQkxMDAJCQkvKiAxMDBucyAqLwotLyogRmlybXdhcmUgc2hvdWxkIHJlc3BvbmQgd2l0aGluIDEgbWlsaXNlY29uZHMgKi8KKy8qIEZpcm13YXJlIHNob3VsZCByZXNwb25kIHdpdGhpbiAxIG1pbGxpc2Vjb25kcyAqLwogI2RlZmluZSBGSVJNV0FSRV9USU1FT1VUCSgxICogTlNFQ19QRVJfTVNFQykKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwppbmRleCA1ODUwZDMyLi5jZjZkYjZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwpAQCAtNTMsNyArNTMsNyBAQAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Vyc3QpKSkKIAogI2RlZmluZSBTUElOX1VOSVQJCTEwMAkJCS8qIDEwMG5zICovCi0vKiBGaXJtd2FyZSBzaG91bGQgcmVzcG9uZCB3aXRoaW4gMSBtaWxpc2Vjb25kcyAqLworLyogRmlybXdhcmUgc2hvdWxkIHJlc3BvbmQgd2l0aGluIDEgbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIEZJUk1XQVJFX1RJTUVPVVQJKDEgKiBOU0VDX1BFUl9NU0VDKQogI2RlZmluZSBGSVJNV0FSRV9NQVhfU1RBTEwJNTAJCQkvKiA1MHVzICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYwppbmRleCAwZDUwNWU1Li5kMWQ0ODRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCkBAIC0xMiwxMCArMTIsNiBAQAogICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2UsIHBsZWFzZQogICogcmVmZXIgdG8gQUNQSSBTcGVjaWZpY2F0aW9uIHZlcnNpb24gNC4wLCBzZWN0aW9uIDE3LjMuMi42CiAgKgotICogTm93LCBvbmx5IFNDSSBub3RpZmljYXRpb24gdHlwZSBhbmQgbWVtb3J5IGVycm9ycyBhcmUKLSAqIHN1cHBvcnRlZC4gTW9yZSBub3RpZmljYXRpb24gdHlwZSBhbmQgaGFyZHdhcmUgZXJyb3IgdHlwZSB3aWxsIGJlCi0gKiBhZGRlZCBsYXRlci4KLSAqCiAgKiBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3JwLgogICogICBBdXRob3I6IEh1YW5nIFlpbmcgPHlpbmcuaHVhbmdAaW50ZWwuY29tPgogICoKQEAgLTM5LDE0ICszNSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3Blci5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFjcGkvYXBlaS5oPgogI2luY2x1ZGUgPGFjcGkvYXRvbWljaW8uaD4KICNpbmNsdWRlIDxhY3BpL2hlZC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAogI2luY2x1ZGUgImFwZWktaW50ZXJuYWwuaCIKIApAQCAtNTUsNDIgKzU1LDEzMSBAQAogI2RlZmluZSBHSEVTX0VTVEFUVVNfTUFYX1NJWkUJCTY1NTM2CiAKIC8qCi0gKiBPbmUgc3RydWN0IGdoZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCBnZW5lcmljIGhhcmR3YXJlIGVycm9yCi0gKiBzb3VyY2UuCi0gKgorICogT25lIHN0cnVjdCBnaGVzIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZ2VuZXJpYyBoYXJkd2FyZSBlcnJvciBzb3VyY2UuCiAgKiBJdCBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgQVBFSSBoYXJkd2FyZSBlcnJvciB0aW1lci9JUlEvU0NJL05NSQotICogaGFuZGxlci4gSGFuZGxlciBmb3Igb25lIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc291cmNlIGlzIG9ubHkKLSAqIHRyaWdnZXJlZCBhZnRlciB0aGUgcHJldmlvdXMgb25lIGlzIGRvbmUuIFNvIGhhbmRsZXIgY2FuIHVzZXMKLSAqIHN0cnVjdCBnaGVzIHdpdGhvdXQgbG9ja2luZy4KKyAqIGhhbmRsZXIuCiAgKgogICogZXN0YXR1czogbWVtb3J5IGJ1ZmZlciBmb3IgZXJyb3Igc3RhdHVzIGJsb2NrLCBhbGxvY2F0ZWQgZHVyaW5nCiAgKiBIRVNUIHBhcnNpbmcuCiAgKi8KICNkZWZpbmUgR0hFU19UT19DTEVBUgkJMHgwMDAxCisjZGVmaW5lIEdIRVNfRVhJVElORwkJMHgwMDAyCiAKIHN0cnVjdCBnaGVzIHsKIAlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CiAJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdTY0IGJ1ZmZlcl9wYWRkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJdW5zaWduZWQgaW50IGlycTsKKwl9OwogfTsKIAorc3RhdGljIGludCBnaGVzX3BhbmljX3RpbWVvdXQJX19yZWFkX21vc3RseSA9IDMwOworCiAvKgotICogRXJyb3Igc291cmNlIGxpc3RzLCBvbmUgbGlzdCBmb3IgZWFjaCBub3RpZmljYXRpb24gbWV0aG9kLiBUaGUKLSAqIG1lbWJlcnMgaW4gbGlzdHMgYXJlIHN0cnVjdCBnaGVzLgorICogQWxsIGVycm9yIHNvdXJjZXMgbm90aWZpZWQgd2l0aCBTQ0kgc2hhcmVzIG9uZSBub3RpZmllciBmdW5jdGlvbiwKKyAqIHNvIHRoZXkgbmVlZCB0byBiZSBsaW5rZWQgYW5kIGNoZWNrZWQgb25lIGJ5IG9uZS4gIFRoaXMgaXMgYXBwbGllZAorICogdG8gTk1JIHRvby4KICAqCi0gKiBUaGUgbGlzdCBtZW1iZXJzIGFyZSBvbmx5IGFkZGVkIGluIEhFU1QgcGFyc2luZyBhbmQgZGVsZXRlZCBkdXJpbmcKLSAqIG1vZHVsZV9leGl0LCB0aGF0IGlzLCBzaW5nbGUtdGhyZWFkZWQuIFNvIG5vIGxvY2sgaXMgbmVlZGVkIGZvcgotICogdGhhdC4KLSAqCi0gKiBCdXQgdGhlIG11dHVhbCBleGNsdXNpb24gaXMgbmVlZGVkIGJldHdlZW4gbWVtYmVycyBhZGRpbmcvZGVsZXRpbmcKLSAqIGFuZCB0aW1lci9JUlEvU0NJL05NSSBoYW5kbGVyLCB3aGljaCBtYXkgdHJhdmVyc2UgdGhlIGxpc3QuIFJDVSBpcwotICogdXNlZCBmb3IgdGhhdC4KKyAqIFJDVSBpcyB1c2VkIGZvciB0aGVzZSBsaXN0cywgc28gZ2hlc19saXN0X211dGV4IGlzIG9ubHkgdXNlZCBmb3IKKyAqIGxpc3QgY2hhbmdpbmcsIG5vdCBmb3IgdHJhdmVyc2luZy4KICAqLwogc3RhdGljIExJU1RfSEVBRChnaGVzX3NjaSk7CitzdGF0aWMgTElTVF9IRUFEKGdoZXNfbm1pKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoZ2hlc19saXN0X211dGV4KTsKIAorLyoKKyAqIE5NSSBtYXkgYmUgdHJpZ2dlcmVkIG9uIGFueSBDUFUsIHNvIGdoZXNfbm1pX2xvY2sgaXMgdXNlZCBmb3IKKyAqIG11dHVhbCBleGNsdXNpb24uCisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGdoZXNfbm1pX2xvY2spOworCisvKgorICogQmVjYXVzZSB0aGUgbWVtb3J5IGFyZWEgdXNlZCB0byB0cmFuc2ZlciBoYXJkd2FyZSBlcnJvciBpbmZvcm1hdGlvbgorICogZnJvbSBCSU9TIHRvIExpbnV4IGNhbiBiZSBkZXRlcm1pbmVkIG9ubHkgaW4gTk1JLCBJUlEgb3IgdGltZXIKKyAqIGhhbmRsZXIsIGJ1dCBnZW5lcmFsIGlvcmVtYXAgY2FuIG5vdCBiZSB1c2VkIGluIGF0b21pYyBjb250ZXh0LCBzbworICogYSBzcGVjaWFsIHZlcnNpb24gb2YgYXRvbWljIGlvcmVtYXAgaXMgaW1wbGVtZW50ZWQgZm9yIHRoYXQuCisgKi8KKworLyoKKyAqIFR3byB2aXJ0dWFsIHBhZ2VzIGFyZSB1c2VkLCBvbmUgZm9yIE5NSSBjb250ZXh0LCB0aGUgb3RoZXIgZm9yCisgKiBJUlEvUFJPQ0VTUyBjb250ZXh0CisgKi8KKyNkZWZpbmUgR0hFU19JT1JFTUFQX1BBR0VTCQkyCisjZGVmaW5lIEdIRVNfSU9SRU1BUF9OTUlfUEFHRShiYXNlKQkoYmFzZSkKKyNkZWZpbmUgR0hFU19JT1JFTUFQX0lSUV9QQUdFKGJhc2UpCSgoYmFzZSkgKyBQQUdFX1NJWkUpCisKKy8qIHZpcnR1YWwgbWVtb3J5IGFyZWEgZm9yIGF0b21pYyBpb3JlbWFwICovCitzdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqZ2hlc19pb3JlbWFwX2FyZWE7CisvKgorICogVGhlc2UgMiBzcGlubG9jayBpcyB1c2VkIHRvIHByZXZlbnQgYXRvbWljIGlvcmVtYXAgdmlydHVhbCBtZW1vcnkKKyAqIGFyZWEgZnJvbSBiZWluZyBtYXBwZWQgc2ltdWx0YW5lb3VzbHkuCisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGdoZXNfaW9yZW1hcF9sb2NrX25taSk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdoZXNfaW9yZW1hcF9sb2NrX2lycSk7CisKK3N0YXRpYyBpbnQgZ2hlc19pb3JlbWFwX2luaXQodm9pZCkKK3sKKwlnaGVzX2lvcmVtYXBfYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoUEFHRV9TSVpFICogR0hFU19JT1JFTUFQX1BBR0VTLAorCQlWTV9JT1JFTUFQLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCk7CisJaWYgKCFnaGVzX2lvcmVtYXBfYXJlYSkgeworCQlwcl9lcnIoR0hFU19QRlggIkZhaWxlZCB0byBhbGxvY2F0ZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIGZvciBhdG9taWMgaW9yZW1hcC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2hlc19pb3JlbWFwX2V4aXQodm9pZCkKK3sKKwlmcmVlX3ZtX2FyZWEoZ2hlc19pb3JlbWFwX2FyZWEpOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnaGVzX2lvcmVtYXBfcGZuX25taSh1NjQgcGZuKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKUdIRVNfSU9SRU1BUF9OTUlfUEFHRShnaGVzX2lvcmVtYXBfYXJlYS0+YWRkcik7CisJaW9yZW1hcF9wYWdlX3JhbmdlKHZhZGRyLCB2YWRkciArIFBBR0VfU0laRSwKKwkJCSAgIHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCk7CisKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXZhZGRyOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnaGVzX2lvcmVtYXBfcGZuX2lycSh1NjQgcGZuKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisKKwl2YWRkciA9ICh1bnNpZ25lZCBsb25nKUdIRVNfSU9SRU1BUF9JUlFfUEFHRShnaGVzX2lvcmVtYXBfYXJlYS0+YWRkcik7CisJaW9yZW1hcF9wYWdlX3JhbmdlKHZhZGRyLCB2YWRkciArIFBBR0VfU0laRSwKKwkJCSAgIHBmbiA8PCBQQUdFX1NISUZULCBQQUdFX0tFUk5FTCk7CisKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXZhZGRyOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2lvdW5tYXBfbm1pKHZvaWQgX19pb21lbSAqdmFkZHJfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXZhZGRyX3B0cjsKKwl2b2lkICpiYXNlID0gZ2hlc19pb3JlbWFwX2FyZWEtPmFkZHI7CisKKwlCVUdfT04odmFkZHIgIT0gKHVuc2lnbmVkIGxvbmcpR0hFU19JT1JFTUFQX05NSV9QQUdFKGJhc2UpKTsKKwl1bm1hcF9rZXJuZWxfcmFuZ2Vfbm9mbHVzaCh2YWRkciwgUEFHRV9TSVpFKTsKKwlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2lvdW5tYXBfaXJxKHZvaWQgX19pb21lbSAqdmFkZHJfcHRyKQoreworCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKXZhZGRyX3B0cjsKKwl2b2lkICpiYXNlID0gZ2hlc19pb3JlbWFwX2FyZWEtPmFkZHI7CisKKwlCVUdfT04odmFkZHIgIT0gKHVuc2lnbmVkIGxvbmcpR0hFU19JT1JFTUFQX0lSUV9QQUdFKGJhc2UpKTsKKwl1bm1hcF9rZXJuZWxfcmFuZ2Vfbm9mbHVzaCh2YWRkciwgUEFHRV9TSVpFKTsKKwlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOworfQorCiBzdGF0aWMgc3RydWN0IGdoZXMgKmdoZXNfbmV3KHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYykKIHsKIAlzdHJ1Y3QgZ2hlcyAqZ2hlczsKQEAgLTEwMSw3ICsxOTAsNiBAQAogCWlmICghZ2hlcykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJZ2hlcy0+Z2VuZXJpYyA9IGdlbmVyaWM7Ci0JSU5JVF9MSVNUX0hFQUQoJmdoZXMtPmxpc3QpOwogCXJjID0gYWNwaV9wcmVfbWFwX2dhcigmZ2VuZXJpYy0+ZXJyb3Jfc3RhdHVzX2FkZHJlc3MpOwogCWlmIChyYykKIAkJZ290byBlcnJfZnJlZTsKQEAgLTE1OCwyMiArMjQ2LDQxIEBACiAJfQogfQogCi0vKiBTQ0kgaGFuZGxlciBydW4gaW4gd29yayBxdWV1ZSwgc28gaW9yZW1hcCBjYW4gYmUgdXNlZCBoZXJlICovCi1zdGF0aWMgaW50IGdoZXNfY29weV90b2Zyb21fcGh5cyh2b2lkICpidWZmZXIsIHU2NCBwYWRkciwgdTMyIGxlbiwKLQkJCQkgaW50IGZyb21fcGh5cykKK3N0YXRpYyB2b2lkIGdoZXNfY29weV90b2Zyb21fcGh5cyh2b2lkICpidWZmZXIsIHU2NCBwYWRkciwgdTMyIGxlbiwKKwkJCQkgIGludCBmcm9tX3BoeXMpCiB7Ci0Jdm9pZCAqdmFkZHI7CisJdm9pZCBfX2lvbWVtICp2YWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgaW5fbm1pID0gaW5fbm1pKCk7CisJdTY0IG9mZnNldDsKKwl1MzIgdHJ1bms7CiAKLQl2YWRkciA9IGlvcmVtYXBfY2FjaGUocGFkZHIsIGxlbik7Ci0JaWYgKCF2YWRkcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGZyb21fcGh5cykKLQkJbWVtY3B5KGJ1ZmZlciwgdmFkZHIsIGxlbik7Ci0JZWxzZQotCQltZW1jcHkodmFkZHIsIGJ1ZmZlciwgbGVuKTsKLQlpb3VubWFwKHZhZGRyKTsKLQotCXJldHVybiAwOworCXdoaWxlIChsZW4gPiAwKSB7CisJCW9mZnNldCA9IHBhZGRyIC0gKHBhZGRyICYgUEFHRV9NQVNLKTsKKwkJaWYgKGluX25taSkgeworCQkJcmF3X3NwaW5fbG9jaygmZ2hlc19pb3JlbWFwX2xvY2tfbm1pKTsKKwkJCXZhZGRyID0gZ2hlc19pb3JlbWFwX3Bmbl9ubWkocGFkZHIgPj4gUEFHRV9TSElGVCk7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2hlc19pb3JlbWFwX2xvY2tfaXJxLCBmbGFncyk7CisJCQl2YWRkciA9IGdoZXNfaW9yZW1hcF9wZm5faXJxKHBhZGRyID4+IFBBR0VfU0hJRlQpOworCQl9CisJCXRydW5rID0gUEFHRV9TSVpFIC0gb2Zmc2V0OworCQl0cnVuayA9IG1pbih0cnVuaywgbGVuKTsKKwkJaWYgKGZyb21fcGh5cykKKwkJCW1lbWNweV9mcm9taW8oYnVmZmVyLCB2YWRkciArIG9mZnNldCwgdHJ1bmspOworCQllbHNlCisJCQltZW1jcHlfdG9pbyh2YWRkciArIG9mZnNldCwgYnVmZmVyLCB0cnVuayk7CisJCWxlbiAtPSB0cnVuazsKKwkJcGFkZHIgKz0gdHJ1bms7CisJCWJ1ZmZlciArPSB0cnVuazsKKwkJaWYgKGluX25taSkgeworCQkJZ2hlc19pb3VubWFwX25taSh2YWRkcik7CisJCQlyYXdfc3Bpbl91bmxvY2soJmdoZXNfaW9yZW1hcF9sb2NrX25taSk7CisJCX0gZWxzZSB7CisJCQlnaGVzX2lvdW5tYXBfaXJxKHZhZGRyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdoZXNfaW9yZW1hcF9sb2NrX2lycSwgZmxhZ3MpOworCQl9CisJfQogfQogCiBzdGF0aWMgaW50IGdoZXNfcmVhZF9lc3RhdHVzKHN0cnVjdCBnaGVzICpnaGVzLCBpbnQgc2lsZW50KQpAQCAtMTk0LDEwICszMDEsOCBAQAogCWlmICghYnVmX3BhZGRyKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXJjID0gZ2hlc19jb3B5X3RvZnJvbV9waHlzKGdoZXMtPmVzdGF0dXMsIGJ1Zl9wYWRkciwKLQkJCQkgICBzaXplb2YoKmdoZXMtPmVzdGF0dXMpLCAxKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKKwlnaGVzX2NvcHlfdG9mcm9tX3BoeXMoZ2hlcy0+ZXN0YXR1cywgYnVmX3BhZGRyLAorCQkJICAgICAgc2l6ZW9mKCpnaGVzLT5lc3RhdHVzKSwgMSk7CiAJaWYgKCFnaGVzLT5lc3RhdHVzLT5ibG9ja19zdGF0dXMpCiAJCXJldHVybiAtRU5PRU5UOwogCkBAIC0yMTIsMTcgKzMxNywxNSBAQAogCQlnb3RvIGVycl9yZWFkX2Jsb2NrOwogCWlmIChhcGVpX2VzdGF0dXNfY2hlY2tfaGVhZGVyKGdoZXMtPmVzdGF0dXMpKQogCQlnb3RvIGVycl9yZWFkX2Jsb2NrOwotCXJjID0gZ2hlc19jb3B5X3RvZnJvbV9waHlzKGdoZXMtPmVzdGF0dXMgKyAxLAotCQkJCSAgIGJ1Zl9wYWRkciArIHNpemVvZigqZ2hlcy0+ZXN0YXR1cyksCi0JCQkJICAgbGVuIC0gc2l6ZW9mKCpnaGVzLT5lc3RhdHVzKSwgMSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJZ2hlc19jb3B5X3RvZnJvbV9waHlzKGdoZXMtPmVzdGF0dXMgKyAxLAorCQkJICAgICAgYnVmX3BhZGRyICsgc2l6ZW9mKCpnaGVzLT5lc3RhdHVzKSwKKwkJCSAgICAgIGxlbiAtIHNpemVvZigqZ2hlcy0+ZXN0YXR1cyksIDEpOwogCWlmIChhcGVpX2VzdGF0dXNfY2hlY2soZ2hlcy0+ZXN0YXR1cykpCiAJCWdvdG8gZXJyX3JlYWRfYmxvY2s7CiAJcmMgPSAwOwogCiBlcnJfcmVhZF9ibG9jazoKLQlpZiAocmMgJiYgIXNpbGVudCkKKwlpZiAocmMgJiYgIXNpbGVudCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCiAJCXByX3dhcm5pbmcoRldfV0FSTiBHSEVTX1BGWAogCQkJICAgIkZhaWxlZCB0byByZWFkIGVycm9yIHN0YXR1cyBibG9jayFcbiIpOwogCXJldHVybiByYzsKQEAgLTI1NSwxMSArMzU4LDI2IEBACiAJCX0KICNlbmRpZgogCX0KK30KIAotCWlmICghcHJvY2Vzc2VkICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJcHJfd2FybmluZyhHSEVTX1BGWAotCQkiVW5rbm93biBlcnJvciByZWNvcmQgZnJvbSBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWRcbiIsCi0JCQkgICBnaGVzLT5nZW5lcmljLT5oZWFkZXIuc291cmNlX2lkKTsKK3N0YXRpYyB2b2lkIGdoZXNfcHJpbnRfZXN0YXR1cyhjb25zdCBjaGFyICpwZngsIHN0cnVjdCBnaGVzICpnaGVzKQoreworCS8qIE5vdCBtb3JlIHRoYW4gMiBtZXNzYWdlcyBldmVyeSA1IHNlY29uZHMgKi8KKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUqSFosIDIpOworCisJaWYgKHBmeCA9PSBOVUxMKSB7CisJCWlmIChnaGVzX3NldmVyaXR5KGdoZXMtPmVzdGF0dXMtPmVycm9yX3NldmVyaXR5KSA8PQorCQkgICAgR0hFU19TRVZfQ09SUkVDVEVEKQorCQkJcGZ4ID0gS0VSTl9XQVJOSU5HIEhXX0VSUjsKKwkJZWxzZQorCQkJcGZ4ID0gS0VSTl9FUlIgSFdfRVJSOworCX0KKwlpZiAoX19yYXRlbGltaXQoJnJhdGVsaW1pdCkpIHsKKwkJcHJpbnRrKAorCSIlcyIiSGFyZHdhcmUgZXJyb3IgZnJvbSBBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlOiAlZFxuIiwKKwlwZngsIGdoZXMtPmdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOworCQlhcGVpX2VzdGF0dXNfcHJpbnQocGZ4LCBnaGVzLT5lc3RhdHVzKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgZ2hlc19wcm9jKHN0cnVjdCBnaGVzICpnaGVzKQpAQCAtMjY5LDYgKzM4Nyw3IEBACiAJcmMgPSBnaGVzX3JlYWRfZXN0YXR1cyhnaGVzLCAwKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OworCWdoZXNfcHJpbnRfZXN0YXR1cyhOVUxMLCBnaGVzKTsKIAlnaGVzX2RvX3Byb2MoZ2hlcyk7CiAKIG91dDoKQEAgLTI3Niw2ICszOTUsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZ2hlc19hZGRfdGltZXIoc3RydWN0IGdoZXMgKmdoZXMpCit7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnID0gZ2hlcy0+Z2VuZXJpYzsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZTsKKworCWlmICghZy0+bm90aWZ5LnBvbGxfaW50ZXJ2YWwpIHsKKwkJcHJfd2FybmluZyhGV19XQVJOIEdIRVNfUEZYICJQb2xsIGludGVydmFsIGlzIDAgZm9yIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc291cmNlOiAlZCwgZGlzYWJsZWQuXG4iLAorCQkJICAgZy0+aGVhZGVyLnNvdXJjZV9pZCk7CisJCXJldHVybjsKKwl9CisJZXhwaXJlID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZy0+bm90aWZ5LnBvbGxfaW50ZXJ2YWwpOworCWdoZXMtPnRpbWVyLmV4cGlyZXMgPSByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKGV4cGlyZSk7CisJYWRkX3RpbWVyKCZnaGVzLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfcG9sbF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2hlcyAqZ2hlcyA9ICh2b2lkICopZGF0YTsKKworCWdoZXNfcHJvYyhnaGVzKTsKKwlpZiAoIShnaGVzLT5mbGFncyAmIEdIRVNfRVhJVElORykpCisJCWdoZXNfYWRkX3RpbWVyKGdoZXMpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZ2hlc19pcnFfZnVuYyhpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnaGVzICpnaGVzID0gZGF0YTsKKwlpbnQgcmM7CisKKwlyYyA9IGdoZXNfcHJvYyhnaGVzKTsKKwlpZiAocmMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGludCBnaGVzX25vdGlmeV9zY2koc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKIHsKQEAgLTI5MiwxMCArNDQ3LDYzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBnaGVzX25vdGlmeV9ubWkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorCQkJCSAgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdoZXMgKmdoZXMsICpnaGVzX2dsb2JhbCA9IE5VTEw7CisJaW50IHNldiwgc2V2X2dsb2JhbCA9IC0xOworCWludCByZXQgPSBOT1RJRllfRE9ORTsKKworCWlmIChjbWQgIT0gRElFX05NSSkKKwkJcmV0dXJuIHJldDsKKworCXJhd19zcGluX2xvY2soJmdoZXNfbm1pX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdoZXMsICZnaGVzX25taSwgbGlzdCkgeworCQlpZiAoZ2hlc19yZWFkX2VzdGF0dXMoZ2hlcywgMSkpIHsKKwkJCWdoZXNfY2xlYXJfZXN0YXR1cyhnaGVzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNldiA9IGdoZXNfc2V2ZXJpdHkoZ2hlcy0+ZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpOworCQlpZiAoc2V2ID4gc2V2X2dsb2JhbCkgeworCQkJc2V2X2dsb2JhbCA9IHNldjsKKwkJCWdoZXNfZ2xvYmFsID0gZ2hlczsKKwkJfQorCQlyZXQgPSBOT1RJRllfU1RPUDsKKwl9CisKKwlpZiAocmV0ID09IE5PVElGWV9ET05FKQorCQlnb3RvIG91dDsKKworCWlmIChzZXZfZ2xvYmFsID49IEdIRVNfU0VWX1BBTklDKSB7CisJCW9vcHNfYmVnaW4oKTsKKwkJZ2hlc19wcmludF9lc3RhdHVzKEtFUk5fRU1FUkcgSFdfRVJSLCBnaGVzX2dsb2JhbCk7CisJCS8qIHJlYm9vdCB0byBsb2cgdGhlIGVycm9yISAqLworCQlpZiAocGFuaWNfdGltZW91dCA9PSAwKQorCQkJcGFuaWNfdGltZW91dCA9IGdoZXNfcGFuaWNfdGltZW91dDsKKwkJcGFuaWMoIkZhdGFsIGhhcmR3YXJlIGVycm9yISIpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdoZXMsICZnaGVzX25taSwgbGlzdCkgeworCQlpZiAoIShnaGVzLT5mbGFncyAmIEdIRVNfVE9fQ0xFQVIpKQorCQkJY29udGludWU7CisJCS8qIERvIG5vdCBwcmludCBlc3RhdHVzIGJlY2F1c2UgcHJpbnRrIGlzIG5vdCBOTUkgc2FmZSAqLworCQlnaGVzX2RvX3Byb2MoZ2hlcyk7CisJCWdoZXNfY2xlYXJfZXN0YXR1cyhnaGVzKTsKKwl9CisKK291dDoKKwlyYXdfc3Bpbl91bmxvY2soJmdoZXNfbm1pX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZ2hlc19ub3RpZmllcl9zY2kgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBnaGVzX25vdGlmeV9zY2ksCiB9OwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGdoZXNfbm90aWZpZXJfbm1pID0geworCS5ub3RpZmllcl9jYWxsID0gZ2hlc19ub3RpZnlfbm1pLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZ2hlc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpnaGVzX2RldikKIHsKIAlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CkBAIC0zMDYsMTggKzUxNCwyNyBAQAogCWlmICghZ2VuZXJpYy0+ZW5hYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoZ2VuZXJpYy0+ZXJyb3JfYmxvY2tfbGVuZ3RoIDwKLQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMpKSB7Ci0JCXByX3dhcm5pbmcoRldfQlVHIEdIRVNfUEZYCi0iSW52YWxpZCBlcnJvciBibG9jayBsZW5ndGg6ICV1IGZvciBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWRcbiIsCi0JCQkgICBnZW5lcmljLT5lcnJvcl9ibG9ja19sZW5ndGgsCisJc3dpdGNoIChnZW5lcmljLT5ub3RpZnkudHlwZSkgeworCWNhc2UgQUNQSV9IRVNUX05PVElGWV9QT0xMRUQ6CisJY2FzZSBBQ1BJX0hFU1RfTk9USUZZX0VYVEVSTkFMOgorCWNhc2UgQUNQSV9IRVNUX05PVElGWV9TQ0k6CisJY2FzZSBBQ1BJX0hFU1RfTk9USUZZX05NSToKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX0hFU1RfTk9USUZZX0xPQ0FMOgorCQlwcl93YXJuaW5nKEdIRVNfUEZYICJHZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWQgbm90aWZpZWQgdmlhIGxvY2FsIGludGVycnVwdCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwKIAkJCSAgIGdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOwogCQlnb3RvIGVycjsKKwlkZWZhdWx0OgorCQlwcl93YXJuaW5nKEZXX1dBUk4gR0hFU19QRlggIlVua25vd24gbm90aWZpY2F0aW9uIHR5cGU6ICV1IGZvciBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWRcbiIsCisJCQkgICBnZW5lcmljLT5ub3RpZnkudHlwZSwgZ2VuZXJpYy0+aGVhZGVyLnNvdXJjZV9pZCk7CisJCWdvdG8gZXJyOwogCX0KLQlpZiAoZ2VuZXJpYy0+cmVjb3Jkc190b19wcmVhbGxvY2F0ZSA9PSAwKSB7Ci0JCXByX3dhcm5pbmcoRldfQlVHIEdIRVNfUEZYCi0iSW52YWxpZCByZWNvcmRzIHRvIHByZWFsbG9jYXRlOiAldSBmb3IgZ2VuZXJpYyBoYXJkd2FyZSBlcnJvciBzb3VyY2U6ICVkXG4iLAotCQkJICAgZ2VuZXJpYy0+cmVjb3Jkc190b19wcmVhbGxvY2F0ZSwKKworCXJjID0gLUVJTzsKKwlpZiAoZ2VuZXJpYy0+ZXJyb3JfYmxvY2tfbGVuZ3RoIDwKKwkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMpKSB7CisJCXByX3dhcm5pbmcoRldfQlVHIEdIRVNfUEZYICJJbnZhbGlkIGVycm9yIGJsb2NrIGxlbmd0aDogJXUgZm9yIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc291cmNlOiAlZFxuIiwKKwkJCSAgIGdlbmVyaWMtPmVycm9yX2Jsb2NrX2xlbmd0aCwKIAkJCSAgIGdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0zMjcsMzggKzU0NCw0MyBAQAogCQlnaGVzID0gTlVMTDsKIAkJZ290byBlcnI7CiAJfQotCWlmIChnZW5lcmljLT5ub3RpZnkudHlwZSA9PSBBQ1BJX0hFU1RfTk9USUZZX1NDSSkgeworCXN3aXRjaCAoZ2VuZXJpYy0+bm90aWZ5LnR5cGUpIHsKKwljYXNlIEFDUElfSEVTVF9OT1RJRllfUE9MTEVEOgorCQlnaGVzLT50aW1lci5mdW5jdGlvbiA9IGdoZXNfcG9sbF9mdW5jOworCQlnaGVzLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZ2hlczsKKwkJaW5pdF90aW1lcl9kZWZlcnJhYmxlKCZnaGVzLT50aW1lcik7CisJCWdoZXNfYWRkX3RpbWVyKGdoZXMpOworCQlicmVhazsKKwljYXNlIEFDUElfSEVTVF9OT1RJRllfRVhURVJOQUw6CisJCS8qIEV4dGVybmFsIGludGVycnVwdCB2ZWN0b3IgaXMgR1NJICovCisJCWlmIChhY3BpX2dzaV90b19pcnEoZ2VuZXJpYy0+bm90aWZ5LnZlY3RvciwgJmdoZXMtPmlycSkpIHsKKwkJCXByX2VycihHSEVTX1BGWCAiRmFpbGVkIHRvIG1hcCBHU0kgdG8gSVJRIGZvciBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWRcbiIsCisJCQkgICAgICAgZ2VuZXJpYy0+aGVhZGVyLnNvdXJjZV9pZCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAocmVxdWVzdF9pcnEoZ2hlcy0+aXJxLCBnaGVzX2lycV9mdW5jLAorCQkJCTAsICJHSEVTIElSUSIsIGdoZXMpKSB7CisJCQlwcl9lcnIoR0hFU19QRlggIkZhaWxlZCB0byByZWdpc3RlciBJUlEgZm9yIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc291cmNlOiAlZFxuIiwKKwkJCSAgICAgICBnZW5lcmljLT5oZWFkZXIuc291cmNlX2lkKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWJyZWFrOworCWNhc2UgQUNQSV9IRVNUX05PVElGWV9TQ0k6CiAJCW11dGV4X2xvY2soJmdoZXNfbGlzdF9tdXRleCk7CiAJCWlmIChsaXN0X2VtcHR5KCZnaGVzX3NjaSkpCiAJCQlyZWdpc3Rlcl9hY3BpX2hlZF9ub3RpZmllcigmZ2hlc19ub3RpZmllcl9zY2kpOwogCQlsaXN0X2FkZF9yY3UoJmdoZXMtPmxpc3QsICZnaGVzX3NjaSk7CiAJCW11dGV4X3VubG9jaygmZ2hlc19saXN0X211dGV4KTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBjaGFyICpub3RpZnkgPSBOVUxMOwotCi0JCXN3aXRjaCAoZ2VuZXJpYy0+bm90aWZ5LnR5cGUpIHsKLQkJY2FzZSBBQ1BJX0hFU1RfTk9USUZZX1BPTExFRDoKLQkJCW5vdGlmeSA9ICJQT0xMIjsKLQkJCWJyZWFrOwotCQljYXNlIEFDUElfSEVTVF9OT1RJRllfRVhURVJOQUw6Ci0JCWNhc2UgQUNQSV9IRVNUX05PVElGWV9MT0NBTDoKLQkJCW5vdGlmeSA9ICJJUlEiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNQSV9IRVNUX05PVElGWV9OTUk6Ci0JCQlub3RpZnkgPSAiTk1JIjsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChub3RpZnkpIHsKLQkJCXByX3dhcm5pbmcoR0hFU19QRlgKLSJHZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZTogJWQgbm90aWZpZWQgdmlhICVzIGlzIG5vdCBzdXBwb3J0ZWQhXG4iLAotCQkJCSAgIGdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQsIG5vdGlmeSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl93YXJuaW5nKEZXX1dBUk4gR0hFU19QRlgKLSJVbmtub3duIG5vdGlmaWNhdGlvbiB0eXBlOiAldSBmb3IgZ2VuZXJpYyBoYXJkd2FyZSBlcnJvciBzb3VyY2U6ICVkXG4iLAotCQkJZ2VuZXJpYy0+bm90aWZ5LnR5cGUsIGdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOwotCQl9Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnI7CisJCWJyZWFrOworCWNhc2UgQUNQSV9IRVNUX05PVElGWV9OTUk6CisJCW11dGV4X2xvY2soJmdoZXNfbGlzdF9tdXRleCk7CisJCWlmIChsaXN0X2VtcHR5KCZnaGVzX25taSkpCisJCQlyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmdoZXNfbm90aWZpZXJfbm1pKTsKKwkJbGlzdF9hZGRfcmN1KCZnaGVzLT5saXN0LCAmZ2hlc19ubWkpOworCQltdXRleF91bmxvY2soJmdoZXNfbGlzdF9tdXRleCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOwogCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShnaGVzX2RldiwgZ2hlcyk7CiAKQEAgLTM3OSw3ICs2MDEsMTQgQEAKIAlnaGVzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZ2hlc19kZXYpOwogCWdlbmVyaWMgPSBnaGVzLT5nZW5lcmljOwogCisJZ2hlcy0+ZmxhZ3MgfD0gR0hFU19FWElUSU5HOwogCXN3aXRjaCAoZ2VuZXJpYy0+bm90aWZ5LnR5cGUpIHsKKwljYXNlIEFDUElfSEVTVF9OT1RJRllfUE9MTEVEOgorCQlkZWxfdGltZXJfc3luYygmZ2hlcy0+dGltZXIpOworCQlicmVhazsKKwljYXNlIEFDUElfSEVTVF9OT1RJRllfRVhURVJOQUw6CisJCWZyZWVfaXJxKGdoZXMtPmlycSwgZ2hlcyk7CisJCWJyZWFrOwogCWNhc2UgQUNQSV9IRVNUX05PVElGWV9TQ0k6CiAJCW11dGV4X2xvY2soJmdoZXNfbGlzdF9tdXRleCk7CiAJCWxpc3RfZGVsX3JjdSgmZ2hlcy0+bGlzdCk7CkBAIC0zODcsMTIgKzYxNiwyMyBAQAogCQkJdW5yZWdpc3Rlcl9hY3BpX2hlZF9ub3RpZmllcigmZ2hlc19ub3RpZmllcl9zY2kpOwogCQltdXRleF91bmxvY2soJmdoZXNfbGlzdF9tdXRleCk7CiAJCWJyZWFrOworCWNhc2UgQUNQSV9IRVNUX05PVElGWV9OTUk6CisJCW11dGV4X2xvY2soJmdoZXNfbGlzdF9tdXRleCk7CisJCWxpc3RfZGVsX3JjdSgmZ2hlcy0+bGlzdCk7CisJCWlmIChsaXN0X2VtcHR5KCZnaGVzX25taSkpCisJCQl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmZ2hlc19ub3RpZmllcl9ubWkpOworCQltdXRleF91bmxvY2soJmdoZXNfbGlzdF9tdXRleCk7CisJCS8qCisJCSAqIFRvIHN5bmNocm9uaXplIHdpdGggTk1JIGhhbmRsZXIsIGdoZXMgY2FuIG9ubHkgYmUKKwkJICogZnJlZWQgYWZ0ZXIgTk1JIGhhbmRsZXIgZmluaXNoZXMuCisJCSAqLworCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCWJyZWFrOwogCX0KIAotCXN5bmNocm9uaXplX3JjdSgpOwogCWdoZXNfZmluaShnaGVzKTsKIAlrZnJlZShnaGVzKTsKIApAQCAtNDEyLDYgKzY1Miw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGdoZXNfaW5pdCh2b2lkKQogeworCWludCByYzsKKwogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNDIwLDEyICs2NjIsMjUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2hlc19wbGF0Zm9ybV9kcml2ZXIpOworCXJjID0gZ2hlc19pb3JlbWFwX2luaXQoKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdoZXNfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2lvcmVtYXBfZXhpdDsKKworCXJldHVybiAwOworZXJyX2lvcmVtYXBfZXhpdDoKKwlnaGVzX2lvcmVtYXBfZXhpdCgpOworZXJyOgorCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGdoZXNfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnaGVzX3BsYXRmb3JtX2RyaXZlcik7CisJZ2hlc19pb3JlbWFwX2V4aXQoKTsKIH0KIAogbW9kdWxlX2luaXQoZ2hlc19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYwppbmRleCBkYWE3YmM2Li40ZWU1OGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCkBAIC0xOTUsMjQgKzE5NSwyNCBAQAogCiBfX3NldHVwKCJoZXN0X2Rpc2FibGUiLCBzZXR1cF9oZXN0X2Rpc2FibGUpOwogCi1zdGF0aWMgaW50IF9faW5pdCBoZXN0X2luaXQodm9pZCkKK3ZvaWQgX19pbml0IGFjcGlfaGVzdF9pbml0KHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCByYyA9IC1FTk9ERVY7CiAJdW5zaWduZWQgaW50IGdoZXNfY291bnQgPSAwOwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCi0JCWdvdG8gZXJyOworCQlyZXR1cm47CiAKIAlpZiAoaGVzdF9kaXNhYmxlKSB7Ci0JCXByX2luZm8oSEVTVF9QRlggIkhFU1QgdGFibGluZyBwYXJzaW5nIGlzIGRpc2FibGVkLlxuIik7Ci0JCWdvdG8gZXJyOworCQlwcl9pbmZvKEhFU1RfUEZYICJUYWJsZSBwYXJzaW5nIGRpc2FibGVkLlxuIik7CisJCXJldHVybjsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19IRVNULCAwLAogCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJmhlc3RfdGFiKTsKIAlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewotCQlwcl9pbmZvKEhFU1RfUEZYICJUYWJsZSBpcyBub3QgZm91bmQhXG4iKTsKKwkJcHJfaW5mbyhIRVNUX1BGWCAiVGFibGUgbm90IGZvdW5kLlxuIik7CiAJCWdvdG8gZXJyOwogCX0gZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJY29uc3QgY2hhciAqbXNnID0gYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyk7CkBAIC0yMjYsMTUgKzIyNiwxMSBAQAogCQlnb3RvIGVycjsKIAogCXJjID0gaGVzdF9naGVzX2Rldl9yZWdpc3RlcihnaGVzX2NvdW50KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOworCWlmICghcmMpIHsKKwkJcHJfaW5mbyhIRVNUX1BGWCAiVGFibGUgcGFyc2luZyBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiIpOworCQlyZXR1cm47CisJfQogCi0JcHJfaW5mbyhIRVNUX1BGWCAiSEVTVCB0YWJsZSBwYXJzaW5nIGlzIGluaXRpYWxpemVkLlxuIik7Ci0KLQlyZXR1cm4gMDsKIGVycjoKIAloZXN0X2Rpc2FibGUgPSAxOwotCXJldHVybiByYzsKIH0KLQotc3Vic3lzX2luaXRjYWxsKGhlc3RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCA5NTY0OWQzLi42OGJjMjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTYzMSw2ICs2MzEsMTcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfcmVmcmVzaChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQoreworCWlmICghYmF0dGVyeS0+YmF0LmRldikKKwkJcmV0dXJuOworCisJYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKGJhdHRlcnkpOworCS8qIFRoZSBiYXR0ZXJ5IG1heSBoYXZlIGNoYW5nZWQgaXRzIHJlcG9ydGluZyB1bml0cy4gKi8KKwlzeXNmc19yZW1vdmVfYmF0dGVyeShiYXR0ZXJ5KTsKKwlzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODY4LDYgKzg3OSw4IEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAJaW50IGk7CiAKKwlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiRGVwcmVjYXRlZCBwcm9jZnMgSS9GIGZvciBiYXR0ZXJ5IGlzIGxvYWRlZCwiCisJCQkiIHBsZWFzZSByZXRyeSB3aXRoIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUiBjbGVhcmVkXG4iKTsKIAlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7CiAJCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gcHJvY19ta2RpcihhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKIAkJCQkJCSAgICAgYWNwaV9iYXR0ZXJ5X2Rpcik7CkBAIC05MTQsNiArOTI3LDggQEAKIAlpZiAoIWJhdHRlcnkpCiAJCXJldHVybjsKIAlvbGQgPSBiYXR0ZXJ5LT5iYXQuZGV2OworCWlmIChldmVudCA9PSBBQ1BJX0JBVFRFUllfTk9USUZZX0lORk8pCisJCWFjcGlfYmF0dGVyeV9yZWZyZXNoKGJhdHRlcnkpOwogCWFjcGlfYmF0dGVyeV91cGRhdGUoYmF0dGVyeSk7CiAJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChkZXZpY2UsIGV2ZW50LAogCQkJCSAgICAgYWNwaV9iYXR0ZXJ5X3ByZXNlbnQoYmF0dGVyeSkpOwpAQCAtOTgzLDYgKzk5OCw3IEBACiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCWJhdHRlcnkgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJYWNwaV9iYXR0ZXJ5X3JlZnJlc2goYmF0dGVyeSk7CiAJYmF0dGVyeS0+dXBkYXRlX3RpbWUgPSAwOwogCWFjcGlfYmF0dGVyeV91cGRhdGUoYmF0dGVyeSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggZDY4YmQ2MS4uN2NlZDYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtNTIsMjIgKzUyLDYgQEAKIAogI2RlZmluZSBTVFJVQ1RfVE9fSU5UKHMpCSgqKChpbnQqKSZzKSkKIAotc3RhdGljIGludCBzZXRfcG93ZXJfbm9jaGVjayhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiJXMgZGV0ZWN0ZWQgLSAiCi0JCSJkaXNhYmxlIHBvd2VyIGNoZWNrIGluIHBvd2VyIHRyYW5zaXRpb25cbiIsIGlkLT5pZGVudCk7Ci0JYWNwaV9wb3dlcl9ub2NoZWNrID0gMTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2NwdWluaXRkYXRhIHBvd2VyX25vY2hlY2tfZG1pX3RhYmxlW10gPSB7Ci0JewotCXNldF9wb3dlcl9ub2NoZWNrLCAiSFAgUGF2aWxpb24gMDUiLCB7Ci0JRE1JX01BVENIKERNSV9CSU9TX1ZFTkRPUiwgIlBob2VuaXggVGVjaG5vbG9naWVzIExURCIpLAotCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkhQIFBhdmlsaW9uIDA1IiksCi0JRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIyMDAxMjExUkUxMDFHTEVORCIpIH0sIE5VTEx9LAotCXt9LAotfTsKLQogCiAjaWZkZWYgQ09ORklHX1g4Ngogc3RhdGljIGludCBzZXRfY29weV9kc2R0KGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKQEAgLTE5NiwzMyArMTgwLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlciBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgYWNwaV9idXNfZ2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpzdGF0ZSkKK3N0YXRpYyBpbnQgX19hY3BpX2J1c19nZXRfcG93ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCAqc3RhdGUpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsb25nIHBzYyA9IDA7CiAKLQotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCWlmICghZGV2aWNlIHx8ICFzdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqc3RhdGUgPSBBQ1BJX1NUQVRFX1VOS05PV047CiAKLQlpZiAoIWRldmljZS0+ZmxhZ3MucG93ZXJfbWFuYWdlYWJsZSkgewotCQkvKiBUQkQ6IE5vbi1yZWN1cnNpdmUgYWxnb3JpdGhtIGZvciB3YWxraW5nIHVwIGhpZXJhcmNoeSAqLwotCQlpZiAoZGV2aWNlLT5wYXJlbnQpCi0JCQkqc3RhdGUgPSBkZXZpY2UtPnBhcmVudC0+cG93ZXIuc3RhdGU7Ci0JCWVsc2UKLQkJCSpzdGF0ZSA9IEFDUElfU1RBVEVfRDA7Ci0JfSBlbHNlIHsKKwlpZiAoZGV2aWNlLT5mbGFncy5wb3dlcl9tYW5hZ2VhYmxlKSB7CiAJCS8qCiAJCSAqIEdldCB0aGUgZGV2aWNlJ3MgcG93ZXIgc3RhdGUgZWl0aGVyIGRpcmVjdGx5ICh2aWEgX1BTQykgb3IKIAkJICogaW5kaXJlY3RseSAodmlhIHBvd2VyIHJlc291cmNlcykuCiAJCSAqLwogCQlpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMpIHsKLQkJCXJlc3VsdCA9IGFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlKGRldmljZSk7CisJCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX2dldF9pbmZlcnJlZF9zdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAkJCWlmIChyZXN1bHQpCiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJfSBlbHNlIGlmIChkZXZpY2UtPnBvd2VyLmZsYWdzLmV4cGxpY2l0X2dldCkgewpAQCAtMjMwLDU5ICsyMDUsMzMgQEAKIAkJCQkJCSAgICAgICBOVUxMLCAmcHNjKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWRldmljZS0+cG93ZXIuc3RhdGUgPSAoaW50KXBzYzsKKwkJCSpzdGF0ZSA9IChpbnQpcHNjOwogCQl9Ci0KLQkJKnN0YXRlID0gZGV2aWNlLT5wb3dlci5zdGF0ZTsKKwl9IGVsc2UgeworCQkvKiBUQkQ6IE5vbi1yZWN1cnNpdmUgYWxnb3JpdGhtIGZvciB3YWxraW5nIHVwIGhpZXJhcmNoeS4gKi8KKwkJKnN0YXRlID0gZGV2aWNlLT5wYXJlbnQgPworCQkJZGV2aWNlLT5wYXJlbnQtPnBvd2VyLnN0YXRlIDogQUNQSV9TVEFURV9EMDsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgWyVzXSBwb3dlciBzdGF0ZSBpcyBEJWRcbiIsCi0JCQkgIGRldmljZS0+cG5wLmJ1c19pZCwgZGV2aWNlLT5wb3dlci5zdGF0ZSkpOworCQkJICBkZXZpY2UtPnBucC5idXNfaWQsICpzdGF0ZSkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2V0X3Bvd2VyKTsKIAotaW50IGFjcGlfYnVzX3NldF9wb3dlcihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzdGF0ZSkKK3N0YXRpYyBpbnQgX19hY3BpX2J1c19zZXRfcG93ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUCcsICdTJywgJzAnICsgc3RhdGUsICdcMCcgfTsKIAotCi0JcmVzdWx0ID0gYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoKHN0YXRlIDwgQUNQSV9TVEFURV9EMCkgfHwgKHN0YXRlID4gQUNQSV9TVEFURV9EMykpCisJaWYgKCFkZXZpY2UgfHwgKHN0YXRlIDwgQUNQSV9TVEFURV9EMCkgfHwgKHN0YXRlID4gQUNQSV9TVEFURV9EMykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCB0YXJnZXQgc3RhdGUgKi8KIAotCWlmICghZGV2aWNlLT5mbGFncy5wb3dlcl9tYW5hZ2VhYmxlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBgWyVzXScgaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIsCi0JCQkJa29iamVjdF9uYW1lKCZkZXZpY2UtPmRldi5rb2JqKSkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JLyoKLQkgKiBHZXQgZGV2aWNlJ3MgY3VycmVudCBwb3dlciBzdGF0ZQotCSAqLwotCWlmICghYWNwaV9wb3dlcl9ub2NoZWNrKSB7Ci0JCS8qCi0JCSAqIE1heWJlIHRoZSBpbmNvcnJlY3QgcG93ZXIgc3RhdGUgaXMgcmV0dXJuZWQgb24gdGhlIGJvZ3VzCi0JCSAqIGJpb3MsIHdoaWNoIGlzIGRpZmZlcmVudCB3aXRoIHRoZSByZWFsIHBvd2VyIHN0YXRlLgotCQkgKiBGb3IgZXhhbXBsZTogdGhlIGJpb3MgcmV0dXJucyBEMCBzdGF0ZSBhbmQgdGhlIHJlYWwgcG93ZXIKLQkJICogc3RhdGUgaXMgRDMuIE9TIGV4cGVjdHMgdG8gc2V0IHRoZSBkZXZpY2UgdG8gRDAgc3RhdGUuIEluCi0JCSAqIHN1Y2ggY2FzZSBpZiBPUyB1c2VzIHRoZSBwb3dlciBzdGF0ZSByZXR1cm5lZCBieSB0aGUgQklPUywKLQkJICogdGhlIGRldmljZSBjYW4ndCBiZSB0cmFuc2lzdGVkIHRvIHRoZSBjb3JyZWN0IHBvd2VyIHN0YXRlLgotCQkgKiBTbyBpZiB0aGUgYWNwaV9wb3dlcl9ub2NoZWNrIGlzIHNldCwgaXQgaXMgdW5uZWNlc3NhcnkgdG8KLQkJICogZ2V0IHRoZSBwb3dlciBzdGF0ZSBieSBjYWxsaW5nIGFjcGlfYnVzX2dldF9wb3dlci4KLQkJICovCi0JCWFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJmRldmljZS0+cG93ZXIuc3RhdGUpOwotCX0KLQlpZiAoKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpICYmICFkZXZpY2UtPmZsYWdzLmZvcmNlX3Bvd2VyX3N0YXRlKSB7CisJaWYgKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIGlzIGFscmVhZHkgYXQgRCVkXG4iLAogCQkJCSAgc3RhdGUpKTsKIAkJcmV0dXJuIDA7CkBAIC0zNTEsOCArMzAwLDc1IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorCitpbnQgYWNwaV9idXNfc2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWlmICghZGV2aWNlLT5mbGFncy5wb3dlcl9tYW5hZ2VhYmxlKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkiRGV2aWNlIFslc10gaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIsCisJCQkJZGV2X25hbWUoJmRldmljZS0+ZGV2KSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gX19hY3BpX2J1c19zZXRfcG93ZXIoZGV2aWNlLCBzdGF0ZSk7Cit9CiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3NldF9wb3dlcik7CiAKKworaW50IGFjcGlfYnVzX2luaXRfcG93ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHN0YXRlOworCWludCByZXN1bHQ7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOworCisJcmVzdWx0ID0gX19hY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLCAmc3RhdGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMpCisJCXJlc3VsdCA9IGFjcGlfcG93ZXJfb25fcmVzb3VyY2VzKGRldmljZSwgc3RhdGUpOworCisJaWYgKCFyZXN1bHQpCisJCWRldmljZS0+cG93ZXIuc3RhdGUgPSBzdGF0ZTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworaW50IGFjcGlfYnVzX3VwZGF0ZV9wb3dlcihhY3BpX2hhbmRsZSBoYW5kbGUsIGludCAqc3RhdGVfcCkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKwlpbnQgc3RhdGU7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJcmVzdWx0ID0gX19hY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLCAmc3RhdGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXN1bHQgPSBfX2FjcGlfYnVzX3NldF9wb3dlcihkZXZpY2UsIHN0YXRlKTsKKwlpZiAoIXJlc3VsdCAmJiBzdGF0ZV9wKQorCQkqc3RhdGVfcCA9IHN0YXRlOworCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjcGlfYnVzX3VwZGF0ZV9wb3dlcik7CisKKwogYm9vbCBhY3BpX2J1c19wb3dlcl9tYW5hZ2VhYmxlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKQEAgLTEwMjMsMTUgKzEwMzksOCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gcmVzdWx0OwogCi0JLyoKLQkgKiBJZiB0aGUgbGFwdG9wIGZhbGxzIGludG8gdGhlIERNSSBjaGVjayB0YWJsZSwgdGhlIHBvd2VyIHN0YXRlIGNoZWNrCi0JICogd2lsbCBiZSBkaXNhYmxlZCBpbiB0aGUgY291cnNlIG9mIGRldmljZSBwb3dlciB0cmFuc2l0aW9uLgotCSAqLwotCWRtaV9jaGVja19zeXN0ZW0ocG93ZXJfbm9jaGVja19kbWlfdGFibGUpOwotCiAJYWNwaV9zY2FuX2luaXQoKTsKIAlhY3BpX2VjX2luaXQoKTsKLQlhY3BpX3Bvd2VyX2luaXQoKTsKIAlhY3BpX2RlYnVnZnNfaW5pdCgpOwogCWFjcGlfc2xlZXBfcHJvY19pbml0KCk7CiAJYWNwaV93YWtldXBfZGV2aWNlX2luaXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCA3MWVmOWNkLi43NmJiYjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0yNzksNiArMjc5LDkgQEAKIAlpbnB1dF9yZXBvcnRfc3dpdGNoKGJ1dHRvbi0+aW5wdXQsIFNXX0xJRCwgIXN0YXRlKTsKIAlpbnB1dF9zeW5jKGJ1dHRvbi0+aW5wdXQpOwogCisJaWYgKHN0YXRlKQorCQlwbV93YWtldXBfZXZlbnQoJmRldmljZS0+ZGV2LCAwKTsKKwogCXJldCA9IGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmFjcGlfbGlkX25vdGlmaWVyLCBzdGF0ZSwgZGV2aWNlKTsKIAlpZiAocmV0ID09IE5PVElGWV9ET05FKQogCQlyZXQgPSBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZhY3BpX2xpZF9ub3RpZmllciwgc3RhdGUsCkBAIC0zMTQsNiArMzE3LDggQEAKIAkJCWlucHV0X3N5bmMoaW5wdXQpOwogCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMCk7CiAJCQlpbnB1dF9zeW5jKGlucHV0KTsKKworCQkJcG1fd2FrZXVwX2V2ZW50KCZkZXZpY2UtPmRldiwgMCk7CiAJCX0KIAogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsICsrYnV0dG9uLT5wdXNoZWQpOwpAQCAtNDI2LDcgKzQzMSw3IEBACiAJCWFjcGlfZW5hYmxlX2dwZShkZXZpY2UtPndha2V1cC5ncGVfZGV2aWNlLAogCQkJCWRldmljZS0+d2FrZXVwLmdwZV9udW1iZXIpOwogCQlkZXZpY2UtPndha2V1cC5ydW5fd2FrZV9jb3VudCsrOwotCQlkZXZpY2UtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKKwkJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZkZXZpY2UtPmRldiwgdHJ1ZSk7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc11cbiIsIG5hbWUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpKTsKQEAgLTQ0OSw3ICs0NTQsNyBAQAogCQlhY3BpX2Rpc2FibGVfZ3BlKGRldmljZS0+d2FrZXVwLmdwZV9kZXZpY2UsCiAJCQkJZGV2aWNlLT53YWtldXAuZ3BlX251bWJlcik7CiAJCWRldmljZS0+d2FrZXVwLnJ1bl93YWtlX2NvdW50LS07Ci0JCWRldmljZS0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgPSAwOworCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmRldmljZS0+ZGV2LCBmYWxzZSk7CiAJfQogCiAJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCA4MTUxNGE0Li4xODY0YWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTcyNSw3ICs3MjUsNyBAQAogCQkJY29tcGxldGVfZG9jayhkcyk7CiAJCQlkb2NrX2V2ZW50KGRzLCBldmVudCwgRE9DS19FVkVOVCk7CiAJCQlkb2NrX2xvY2soZHMsIDEpOwotCQkJYWNwaV91cGRhdGVfZ3BlcygpOworCQkJYWNwaV91cGRhdGVfYWxsX2dwZXMoKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChkb2NrX3ByZXNlbnQoZHMpIHx8IGRvY2tfaW5fcHJvZ3Jlc3MoZHMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCAzMDJiMzFlLi5mYTg0OGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtNjA2LDcgKzYwNiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgYWNwaV9lY19ncGVfaGFuZGxlcih2b2lkICpkYXRhKQorc3RhdGljIHUzMiBhY3BpX2VjX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJdTMyIGdwZV9udW1iZXIsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFjcGlfZWMgKmVjID0gZGF0YTsKIApAQCAtNjE4LDcgKzYxOSw3IEBACiAJCXdha2VfdXAoJmVjLT53YWl0KTsKIAkJZWNfY2hlY2tfc2NpKGVjLCBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSk7CiAJfQotCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOworCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIHwgQUNQSV9SRUVOQUJMRV9HUEU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZmFuLmMgYi9kcml2ZXJzL2FjcGkvZmFuLmMKaW5kZXggNjAwNDkwOC4uNDY3NDc5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Zhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9mYW4uYwpAQCAtODYsNyArODYsNyBAQAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJmFjcGlfc3RhdGUpOworCXJlc3VsdCA9IGFjcGlfYnVzX3VwZGF0ZV9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJmFjcGlfc3RhdGUpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKQEAgLTEyMyw3ICsxMjMsNiBAQAogc3RhdGljIGludCBhY3BpX2Zhbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaW50IHN0YXRlID0gMDsKIAlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKIAogCWlmICghZGV2aWNlKQpAQCAtMTMyLDE2ICsxMzEsMTIgQEAKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCAiRmFuIik7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRkFOX0NMQVNTKTsKIAotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJnN0YXRlKTsKKwlyZXN1bHQgPSBhY3BpX2J1c191cGRhdGVfcG93ZXIoZGV2aWNlLT5oYW5kbGUsIE5VTEwpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiUmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlNldHRpbmcgaW5pdGlhbCBwb3dlciBzdGF0ZVxuIik7CiAJCWdvdG8gZW5kOwogCX0KIAotCWRldmljZS0+ZmxhZ3MuZm9yY2VfcG93ZXJfc3RhdGUgPSAxOwotCWFjcGlfYnVzX3NldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgc3RhdGUpOwotCWRldmljZS0+ZmxhZ3MuZm9yY2VfcG93ZXJfc3RhdGUgPSAwOwotCiAJY2RldiA9IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoIkZhbiIsIGRldmljZSwKIAkJCQkJCSZmYW5fY29vbGluZ19vcHMpOwogCWlmIChJU19FUlIoY2RldikpIHsKQEAgLTIwMCwyMiArMTk1LDE0IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9mYW5fcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWludCByZXN1bHQgPSAwOwotCWludCBwb3dlcl9zdGF0ZSA9IDA7CisJaW50IHJlc3VsdDsKIAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJnBvd2VyX3N0YXRlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKLQkJCQkgICJFcnJvciByZWFkaW5nIGZhbiBwb3dlciBzdGF0ZVxuIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZGV2aWNlLT5mbGFncy5mb3JjZV9wb3dlcl9zdGF0ZSA9IDE7Ci0JYWNwaV9idXNfc2V0X3Bvd2VyKGRldmljZS0+aGFuZGxlLCBwb3dlcl9zdGF0ZSk7Ci0JZGV2aWNlLT5mbGFncy5mb3JjZV9wb3dlcl9zdGF0ZSA9IDA7CisJcmVzdWx0ID0gYWNwaV9idXNfdXBkYXRlX3Bvd2VyKGRldmljZS0+aGFuZGxlLCBOVUxMKTsKKwlpZiAocmVzdWx0KQorCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciB1cGRhdGluZyBmYW4gcG93ZXIgc3RhdGVcbiIpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDc4YjAxNjQuLjdjNDdlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMTY3LDExICsxNjcsOCBAQAogCQkJCSJmaXJtd2FyZV9ub2RlIik7CiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZhY3BpX2Rldi0+ZGV2LmtvYmosICZkZXYtPmtvYmosCiAJCQkJInBoeXNpY2FsX25vZGUiKTsKLQkJaWYgKGFjcGlfZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpIHsKKwkJaWYgKGFjcGlfZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCiAJCQlkZXZpY2Vfc2V0X3dha2V1cF9jYXBhYmxlKGRldiwgdHJ1ZSk7Ci0JCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoZGV2LAotCQkJCQkJYWNwaV9kZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKTsKLQkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2ludGVybmFsLmggYi9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaAppbmRleCBhMjEyYmZlLi5iMWNjODFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaApAQCAtNDEsOSArNDEsMTAgQEAKIGludCBhY3BpX3Bvd2VyX2luaXQodm9pZCk7CiBpbnQgYWNwaV9kZXZpY2Vfc2xlZXBfd2FrZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmFibGUsIGludCBzbGVlcF9zdGF0ZSwgaW50IGRldl9zdGF0ZSk7Ci1pbnQgYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworaW50IGFjcGlfcG93ZXJfZ2V0X2luZmVycmVkX3N0YXRlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgKnN0YXRlKTsKK2ludCBhY3BpX3Bvd2VyX29uX3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKTsKIGludCBhY3BpX3Bvd2VyX3RyYW5zaXRpb24oc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7Ci1leHRlcm4gaW50IGFjcGlfcG93ZXJfbm9jaGVjazsKK2ludCBhY3BpX2J1c19pbml0X3Bvd2VyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogaW50IGFjcGlfd2FrZXVwX2RldmljZV9pbml0KHZvaWQpOwogdm9pZCBhY3BpX2Vhcmx5X3Byb2Nlc3Nvcl9zZXRfcGRjKHZvaWQpOwpAQCAtODIsOCArODMsMTYgQEAKIAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiBpbnQgYWNwaV9zbGVlcF9wcm9jX2luaXQodm9pZCk7CitpbnQgc3VzcGVuZF9udnNfYWxsb2Modm9pZCk7Cit2b2lkIHN1c3BlbmRfbnZzX2ZyZWUodm9pZCk7CitpbnQgc3VzcGVuZF9udnNfc2F2ZSh2b2lkKTsKK3ZvaWQgc3VzcGVuZF9udnNfcmVzdG9yZSh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX3NsZWVwX3Byb2NfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBzdXNwZW5kX252c19hbGxvYyh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZF9udnNfZnJlZSh2b2lkKSB7fQorc3RhdGljIGlubGluZSBpbnQgc3VzcGVuZF9udnNfc2F2ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZF9udnNfcmVzdG9yZSh2b2lkKSB7fQogI2VuZGlmCiAKICNlbmRpZiAvKiBfQUNQSV9JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL252cy5jIGIvZHJpdmVycy9hY3BpL252cy5jCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIGtlcm5lbC9wb3dlci9udnMuYwpyZW5hbWUgdG8gZHJpdmVycy9hY3BpL252cy5jCmluZGV4IDE4MzZkYjYuLjU0YjZhYjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9udnMuYworKysgYi9kcml2ZXJzL2FjcGkvbnZzLmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogbGludXgva2VybmVsL3Bvd2VyL2hpYmVybmF0ZV9udnMuYyAtIFJvdXRpbmVzIGZvciBoYW5kbGluZyBOVlMgbWVtb3J5CisgKiBudnMuYyAtIFJvdXRpbmVzIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBBQ1BJIE5WUyBtZW1vcnkgcmVnaW9uCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4LDIwMDkgUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPiwgTm92ZWxsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDExIFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIE5vdmVsbCBJbmMuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwpAQCAtMTEsNyArMTEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaW9zeGYuaD4KIAogLyoKICAqIFBsYXRmb3JtcywgbGlrZSBBQ1BJLCBtYXkgd2FudCB1cyB0byBzYXZlIHNvbWUgbWVtb3J5IHVzZWQgYnkgdGhlbSBkdXJpbmcKQEAgLTc5LDcgKzgwLDcgQEAKIAkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllbnRyeS0+ZGF0YSk7CiAJCQllbnRyeS0+ZGF0YSA9IE5VTEw7CiAJCQlpZiAoZW50cnktPmthZGRyKSB7Ci0JCQkJaW91bm1hcChlbnRyeS0+a2FkZHIpOworCQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KGVudHJ5LT5rYWRkciwgZW50cnktPnNpemUpOwogCQkJCWVudHJ5LT5rYWRkciA9IE5VTEw7CiAJCQl9CiAJCX0KQEAgLTEwNSw3ICsxMDYsNyBAQAogLyoqCiAgKglzdXNwZW5kX252c19zYXZlIC0gc2F2ZSBOVlMgbWVtb3J5IHJlZ2lvbnMKICAqLwotdm9pZCBzdXNwZW5kX252c19zYXZlKHZvaWQpCitpbnQgc3VzcGVuZF9udnNfc2F2ZSh2b2lkKQogewogCXN0cnVjdCBudnNfcGFnZSAqZW50cnk7CiAKQEAgLTExMyw5ICsxMTQsMTYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZudnNfbGlzdCwgbm9kZSkKIAkJaWYgKGVudHJ5LT5kYXRhKSB7Ci0JCQllbnRyeS0+a2FkZHIgPSBpb3JlbWFwKGVudHJ5LT5waHlzX3N0YXJ0LCBlbnRyeS0+c2l6ZSk7CisJCQllbnRyeS0+a2FkZHIgPSBhY3BpX29zX21hcF9tZW1vcnkoZW50cnktPnBoeXNfc3RhcnQsCisJCQkJCQkJICBlbnRyeS0+c2l6ZSk7CisJCQlpZiAoIWVudHJ5LT5rYWRkcikgeworCQkJCXN1c3BlbmRfbnZzX2ZyZWUoKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KIAkJCW1lbWNweShlbnRyeS0+ZGF0YSwgZW50cnktPmthZGRyLCBlbnRyeS0+c2l6ZSk7CiAJCX0KKworCXJldHVybiAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCAwNTVkN2I3Li5lMmRkNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAogCXBnX29mZiA9IHJvdW5kX2Rvd24ocGh5cywgUEFHRV9TSVpFKTsKIAlwZ19zeiA9IHJvdW5kX3VwKHBoeXMgKyBzaXplLCBQQUdFX1NJWkUpIC0gcGdfb2ZmOwotCXZpcnQgPSBpb3JlbWFwKHBnX29mZiwgcGdfc3opOworCXZpcnQgPSBpb3JlbWFwX2NhY2hlKHBnX29mZiwgcGdfc3opOwogCWlmICghdmlydCkgewogCQlrZnJlZShtYXApOwogCQlyZXR1cm4gTlVMTDsKQEAgLTY0Miw3ICs2NDIsNyBAQAogCXZpcnRfYWRkciA9IGFjcGlfbWFwX3ZhZGRyX2xvb2t1cChwaHlzX2FkZHIsIHNpemUpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICghdmlydF9hZGRyKSB7Ci0JCXZpcnRfYWRkciA9IGlvcmVtYXAocGh5c19hZGRyLCBzaXplKTsKKwkJdmlydF9hZGRyID0gaW9yZW1hcF9jYWNoZShwaHlzX2FkZHIsIHNpemUpOwogCQl1bm1hcCA9IDE7CiAJfQogCWlmICghdmFsdWUpCkBAIC02NzgsNyArNjc4LDcgQEAKIAl2aXJ0X2FkZHIgPSBhY3BpX21hcF92YWRkcl9sb29rdXAocGh5c19hZGRyLCBzaXplKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoIXZpcnRfYWRkcikgewotCQl2aXJ0X2FkZHIgPSBpb3JlbWFwKHBoeXNfYWRkciwgc2l6ZSk7CisJCXZpcnRfYWRkciA9IGlvcmVtYXBfY2FjaGUocGh5c19hZGRyLCBzaXplKTsKIAkJdW5tYXAgPSAxOwogCX0KIApAQCAtMTIzMyw4ICsxMjMzLDcgQEAKIGludCBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewogCXN0cnVjdCBhY3BpX3Jlc19saXN0ICpyZXNfbGlzdF9lbGVtOwotCWludCBpb3BvcnQ7Ci0JaW50IGNsYXNoID0gMDsKKwlpbnQgaW9wb3J0ID0gMCwgY2xhc2ggPSAwOwogCiAJaWYgKGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPT0gRU5GT1JDRV9SRVNPVVJDRVNfTk8pCiAJCXJldHVybiAwOwpAQCAtMTI2NCw5ICsxMjYzLDEzIEBACiAJaWYgKGNsYXNoKSB7CiAJCWlmIChhY3BpX2VuZm9yY2VfcmVzb3VyY2VzICE9IEVORk9SQ0VfUkVTT1VSQ0VTX05PKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBQ1BJOiByZXNvdXJjZSAlcyAlcFIiCi0JCQkgICAgICAgIiBjb25mbGljdHMgd2l0aCBBQ1BJIHJlZ2lvbiAlcyAlcFJcbiIsCisJCQkgICAgICAgIiBjb25mbGljdHMgd2l0aCBBQ1BJIHJlZ2lvbiAlcyAiCisJCQkgICAgICAgIlslcyAweCV6eC0weCV6eF1cbiIsCiAJCQkgICAgICAgcmVzLT5uYW1lLCByZXMsIHJlc19saXN0X2VsZW0tPm5hbWUsCi0JCQkgICAgICAgcmVzX2xpc3RfZWxlbSk7CisJCQkgICAgICAgKHJlc19saXN0X2VsZW0tPnJlc291cmNlX3R5cGUgPT0KKwkJCQlBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pID8gImlvIiA6ICJtZW0iLAorCQkJICAgICAgIChzaXplX3QpIHJlc19saXN0X2VsZW0tPnN0YXJ0LAorCQkJICAgICAgIChzaXplX3QpIHJlc19saXN0X2VsZW0tPmVuZCk7CiAJCQlpZiAoYWNwaV9lbmZvcmNlX3Jlc291cmNlcyA9PSBFTkZPUkNFX1JFU09VUkNFU19MQVgpCiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBQ1BJOiBUaGlzIGNvbmZsaWN0IG1heSIKIAkJCQkgICAgICAgIiBjYXVzZSByYW5kb20gcHJvYmxlbXMgYW5kIHN5c3RlbSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggOTY2NjhhZC4uZDk3NjY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hcGVpLmg+CiAKICNkZWZpbmUgUFJFRklYICJBQ1BJOiAiCiAKQEAgLTQ3LDYgKzQ4LDExIEBACiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3Rfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCisjZGVmaW5lIEFDUElfUENJRV9SRVFfU1VQUE9SVCAoT1NDX0VYVF9QQ0lfQ09ORklHX1NVUFBPUlQgXAorCQkJCXwgT1NDX0FDVElWRV9TVEFURV9QV1JfU1VQUE9SVCBcCisJCQkJfCBPU0NfQ0xPQ0tfUFdSX0NBUEFCSUxJVFlfU1VQUE9SVCBcCisJCQkJfCBPU0NfTVNJX1NVUFBPUlQpCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgcm9vdF9kZXZpY2VfaWRzW10gPSB7CiAJeyJQTlAwQTAzIiwgMH0sCiAJeyIiLCAwfSwKQEAgLTU2Niw2ICs1NzIsMzMgQEAKIAlpZiAoZmxhZ3MgIT0gYmFzZV9mbGFncykKIAkJYWNwaV9wY2lfb3NjX3N1cHBvcnQocm9vdCwgZmxhZ3MpOwogCisJaWYgKCFwY2llX3BvcnRzX2Rpc2FibGVkCisJICAgICYmIChmbGFncyAmIEFDUElfUENJRV9SRVFfU1VQUE9SVCkgPT0gQUNQSV9QQ0lFX1JFUV9TVVBQT1JUKSB7CisJCWZsYWdzID0gT1NDX1BDSV9FWFBSRVNTX0NBUF9TVFJVQ1RVUkVfQ09OVFJPTAorCQkJfCBPU0NfUENJX0VYUFJFU1NfTkFUSVZFX0hQX0NPTlRST0wKKwkJCXwgT1NDX1BDSV9FWFBSRVNTX1BNRV9DT05UUk9MOworCisJCWlmIChwY2lfYWVyX2F2YWlsYWJsZSgpKSB7CisJCQlpZiAoYWVyX2FjcGlfZmlybXdhcmVfZmlyc3QoKSkKKwkJCQlkZXZfZGJnKHJvb3QtPmJ1cy0+YnJpZGdlLAorCQkJCQkiUENJZSBlcnJvcnMgaGFuZGxlZCBieSBCSU9TLlxuIik7CisJCQllbHNlCisJCQkJZmxhZ3MgfD0gT1NDX1BDSV9FWFBSRVNTX0FFUl9DT05UUk9MOworCQl9CisKKwkJZGV2X2luZm8ocm9vdC0+YnVzLT5icmlkZ2UsCisJCQkiUmVxdWVzdGluZyBBQ1BJIF9PU0MgY29udHJvbCAoMHglMDJ4KVxuIiwgZmxhZ3MpOworCisJCXN0YXR1cyA9IGFjcGlfcGNpX29zY19jb250cm9sX3NldChkZXZpY2UtPmhhbmRsZSwgJmZsYWdzLAorCQkJCQlPU0NfUENJX0VYUFJFU1NfQ0FQX1NUUlVDVFVSRV9DT05UUk9MKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQkJZGV2X2luZm8ocm9vdC0+YnVzLT5icmlkZ2UsCisJCQkJIkFDUEkgX09TQyBjb250cm9sICgweCUwMngpIGdyYW50ZWRcbiIsIGZsYWdzKTsKKwkJZWxzZQorCQkJZGV2X2RiZyhyb290LT5idXMtPmJyaWRnZSwKKwkJCQkiQUNQSSBfT1NDIHJlcXVlc3QgZmFpbGVkIChjb2RlICVkKVxuIiwgc3RhdHVzKTsKKwl9CisKIAlwY2lfYWNwaV9hZGRfYnVzX3BtX25vdGlmaWVyKGRldmljZSwgcm9vdC0+YnVzKTsKIAlpZiAoZGV2aWNlLT53YWtldXAuZmxhZ3MucnVuX3dha2UpCiAJCWRldmljZV9zZXRfcnVuX3dha2Uocm9vdC0+YnVzLT5icmlkZ2UsIHRydWUpOwpAQCAtNjAzLDYgKzYzNiw4IEBACiAJaWYgKGFjcGlfcGNpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAorCWFjcGlfaGVzdF9pbml0KCk7CisKIAlwY2lfYWNwaV9jcnNfcXVpcmtzKCk7CiAJaWYgKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9wY2lfcm9vdF9kcml2ZXIpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcG93ZXIuYyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCmluZGV4IDRjOWMyZmIuLjlhYzJhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wb3dlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCkBAIC01Niw5ICs1Niw2IEBACiAjZGVmaW5lIEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT04JMHgwMQogI2RlZmluZSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX1VOS05PV04gMHhGRgogCi1pbnQgYWNwaV9wb3dlcl9ub2NoZWNrOwotbW9kdWxlX3BhcmFtX25hbWVkKHBvd2VyX25vY2hlY2ssIGFjcGlfcG93ZXJfbm9jaGVjaywgYm9vbCwgMDAwKTsKLQogc3RhdGljIGludCBhY3BpX3Bvd2VyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKQEAgLTE0OCw5ICsxNDUsOCBAQAogCiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfZ2V0X2xpc3Rfc3RhdGUoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QsIGludCAqc3RhdGUpCiB7Ci0JaW50IHJlc3VsdCA9IDAsIHN0YXRlMTsKLQl1MzIgaSA9IDA7Ci0KKwlpbnQgY3VyX3N0YXRlOworCWludCBpID0gMDsKIAogCWlmICghbGlzdCB8fCAhc3RhdGUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTU4LDI1ICsxNTQsMzMgQEAKIAkvKiBUaGUgc3RhdGUgb2YgdGhlIGxpc3QgaXMgJ29uJyBJRkYgYWxsIHJlc291cmNlcyBhcmUgJ29uJy4gKi8KIAogCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5jb3VudDsgaSsrKSB7Ci0JCS8qCi0JCSAqIFRoZSBzdGF0ZSBvZiB0aGUgcG93ZXIgcmVzb3VyY2UgY2FuIGJlIG9idGFpbmVkIGJ5Ci0JCSAqIHVzaW5nIHRoZSBBQ1BJIGhhbmRsZS4gSW4gc3VjaCBjYXNlIGl0IGlzIHVubmVjZXNzYXJ5IHRvCi0JCSAqIGdldCB0aGUgUG93ZXIgcmVzb3VyY2UgZmlyc3QgYW5kIHRoZW4gZ2V0IGl0cyBzdGF0ZSBhZ2Fpbi4KLQkJICovCi0JCXJlc3VsdCA9IGFjcGlfcG93ZXJfZ2V0X3N0YXRlKGxpc3QtPmhhbmRsZXNbaV0sICZzdGF0ZTEpOworCQlzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2U7CisJCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGxpc3QtPmhhbmRsZXNbaV07CisJCWludCByZXN1bHQ7CisKKwkJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfY29udGV4dChoYW5kbGUsICZyZXNvdXJjZSk7CiAJCWlmIChyZXN1bHQpCiAJCQlyZXR1cm4gcmVzdWx0OwogCi0JCSpzdGF0ZSA9IHN0YXRlMTsKKwkJbXV0ZXhfbG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOwogCi0JCWlmICgqc3RhdGUgIT0gQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9PTikKKwkJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfc3RhdGUoaGFuZGxlLCAmY3VyX3N0YXRlKTsKKworCQltdXRleF91bmxvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQlpZiAoY3VyX3N0YXRlICE9IEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT04pCiAJCQlicmVhazsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBsaXN0IGlzICVzXG4iLAotCQkJICAqc3RhdGUgPyAib24iIDogIm9mZiIpKTsKKwkJCSAgY3VyX3N0YXRlID8gIm9uIiA6ICJvZmYiKSk7CiAKLQlyZXR1cm4gcmVzdWx0OworCSpzdGF0ZSA9IGN1cl9zdGF0ZTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fYWNwaV9wb3dlcl9vbihzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSAqcmVzb3VyY2UpCkBAIC0yMjIsNyArMjI2LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IGFjcGlfcG93ZXJfb2ZmX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfb2ZmKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKQEAgLTI2Niw2ICsyNzAsMzUgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBfX2FjcGlfcG93ZXJfb2ZmX2xpc3Qoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QsIGludCBudW1fcmVzKQoreworCWludCBpOworCisJZm9yIChpID0gbnVtX3JlcyAtIDE7IGkgPj0gMCA7IGktLSkKKwkJYWNwaV9wb3dlcl9vZmYobGlzdC0+aGFuZGxlc1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcG93ZXJfb2ZmX2xpc3Qoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QpCit7CisJX19hY3BpX3Bvd2VyX29mZl9saXN0KGxpc3QsIGxpc3QtPmNvdW50KTsKK30KKworc3RhdGljIGludCBhY3BpX3Bvd2VyX29uX2xpc3Qoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QpCit7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+Y291bnQ7IGkrKykgeworCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29uKGxpc3QtPmhhbmRsZXNbaV0pOworCQlpZiAocmVzdWx0KSB7CisJCQlfX2FjcGlfcG93ZXJfb2ZmX2xpc3QobGlzdCwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogYWNwaV9kZXZpY2Vfc2xlZXBfd2FrZSAtIGV4ZWN1dGUgX0RTVyAoRGV2aWNlIFNsZWVwIFdha2UpIG9yIChkZXByZWNhdGVkIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSSAzLjApIF9QU1cgKFBvd2VyIFN0YXRlIFdha2UpCkBAIC00MDQsOCArNDM3LDcgQEAKIAogCS8qIENsb3NlIHBvd2VyIHJlc291cmNlICovCiAJZm9yIChpID0gMDsgaSA8IGRldi0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7Ci0JCWludCByZXQgPSBhY3BpX3Bvd2VyX29mZl9kZXZpY2UoCi0JCQkJZGV2LT53YWtldXAucmVzb3VyY2VzLmhhbmRsZXNbaV0pOworCQlpbnQgcmV0ID0gYWNwaV9wb3dlcl9vZmYoZGV2LT53YWtldXAucmVzb3VyY2VzLmhhbmRsZXNbaV0pOwogCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJUcmFuc2l0aW9uIHBvd2VyIHN0YXRlXG4iKTsKIAkJCWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkID0gMDsKQEAgLTQyMywxOSArNDU1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBQb3dlciBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitpbnQgYWNwaV9wb3dlcl9nZXRfaW5mZXJyZWRfc3RhdGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCAqc3RhdGUpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKmxpc3QgPSBOVUxMOwogCWludCBsaXN0X3N0YXRlID0gMDsKIAlpbnQgaSA9IDA7CiAKLQotCWlmICghZGV2aWNlKQorCWlmICghZGV2aWNlIHx8ICFzdGF0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOwotCiAJLyoKIAkgKiBXZSBrbm93IGEgZGV2aWNlJ3MgaW5mZXJyZWQgcG93ZXIgc3RhdGUgd2hlbiBhbGwgdGhlIHJlc291cmNlcwogCSAqIHJlcXVpcmVkIGZvciBhIGdpdmVuIEQtc3RhdGUgYXJlICdvbicuCkBAIC00NTAsMjIgKzQ3OSwyNiBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAogCQlpZiAobGlzdF9zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OKSB7Ci0JCQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gaTsKKwkJCSpzdGF0ZSA9IGk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCWRldmljZS0+cG93ZXIuc3RhdGUgPSBBQ1BJX1NUQVRFX0QzOwotCisJKnN0YXRlID0gQUNQSV9TVEFURV9EMzsKIAlyZXR1cm4gMDsKIH0KIAoraW50IGFjcGlfcG93ZXJfb25fcmVzb3VyY2VzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpCit7CisJaWYgKCFkZXZpY2UgfHwgc3RhdGUgPCBBQ1BJX1NUQVRFX0QwIHx8IHN0YXRlID4gQUNQSV9TVEFURV9EMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYWNwaV9wb3dlcl9vbl9saXN0KCZkZXZpY2UtPnBvd2VyLnN0YXRlc1tzdGF0ZV0ucmVzb3VyY2VzKTsKK30KKwogaW50IGFjcGlfcG93ZXJfdHJhbnNpdGlvbihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQogewotCWludCByZXN1bHQgPSAwOwotCXN0cnVjdCBhY3BpX2hhbmRsZV9saXN0ICpjbCA9IE5VTEw7CS8qIEN1cnJlbnQgUmVzb3VyY2VzICovCi0Jc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgKnRsID0gTlVMTDsJLyogVGFyZ2V0IFJlc291cmNlcyAqLwotCWludCBpID0gMDsKKwlpbnQgcmVzdWx0OwogCiAJaWYgKCFkZXZpY2UgfHwgKHN0YXRlIDwgQUNQSV9TVEFURV9EMCkgfHwgKHN0YXRlID4gQUNQSV9TVEFURV9EMykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDc3LDM3ICs1MTAsMjAgQEAKIAkgICAgfHwgKGRldmljZS0+cG93ZXIuc3RhdGUgPiBBQ1BJX1NUQVRFX0QzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQljbCA9ICZkZXZpY2UtPnBvd2VyLnN0YXRlc1tkZXZpY2UtPnBvd2VyLnN0YXRlXS5yZXNvdXJjZXM7Ci0JdGwgPSAmZGV2aWNlLT5wb3dlci5zdGF0ZXNbc3RhdGVdLnJlc291cmNlczsKLQogCS8qIFRCRDogUmVzb3VyY2VzIG11c3QgYmUgb3JkZXJlZC4gKi8KIAogCS8qCiAJICogRmlyc3Qgd2UgcmVmZXJlbmNlIGFsbCBwb3dlciByZXNvdXJjZXMgcmVxdWlyZWQgaW4gdGhlIHRhcmdldCBsaXN0Ci0JICogKGUuZy4gc28gdGhlIGRldmljZSBkb2Vzbid0IGxvc2UgcG93ZXIgd2hpbGUgdHJhbnNpdGlvbmluZykuCisJICogKGUuZy4gc28gdGhlIGRldmljZSBkb2Vzbid0IGxvc2UgcG93ZXIgd2hpbGUgdHJhbnNpdGlvbmluZykuICBUaGVuLAorCSAqIHdlIGRlcmVmZXJlbmNlIGFsbCBwb3dlciByZXNvdXJjZXMgdXNlZCBpbiB0aGUgY3VycmVudCBsaXN0LgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCB0bC0+Y291bnQ7IGkrKykgewotCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29uKHRsLT5oYW5kbGVzW2ldKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWdvdG8gZW5kOwotCX0KKwlyZXN1bHQgPSBhY3BpX3Bvd2VyX29uX2xpc3QoJmRldmljZS0+cG93ZXIuc3RhdGVzW3N0YXRlXS5yZXNvdXJjZXMpOworCWlmICghcmVzdWx0KQorCQlhY3BpX3Bvd2VyX29mZl9saXN0KAorCQkJJmRldmljZS0+cG93ZXIuc3RhdGVzW2RldmljZS0+cG93ZXIuc3RhdGVdLnJlc291cmNlcyk7CiAKLQkvKgotCSAqIFRoZW4gd2UgZGVyZWZlcmVuY2UgYWxsIHBvd2VyIHJlc291cmNlcyB1c2VkIGluIHRoZSBjdXJyZW50IGxpc3QuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNsLT5jb3VudDsgaSsrKSB7Ci0JCXJlc3VsdCA9IGFjcGlfcG93ZXJfb2ZmX2RldmljZShjbC0+aGFuZGxlc1tpXSk7Ci0JCWlmIChyZXN1bHQpCi0JCQlnb3RvIGVuZDsKLQl9Ci0KLSAgICAgZW5kOgotCWlmIChyZXN1bHQpCi0JCWRldmljZS0+cG93ZXIuc3RhdGUgPSBBQ1BJX1NUQVRFX1VOS05PV047Ci0JZWxzZSB7Ci0JLyogV2Ugc2hvdWxkbid0IGNoYW5nZSB0aGUgc3RhdGUgdGlsbCBhbGwgYWJvdmUgb3BlcmF0aW9ucyBzdWNjZWVkICovCi0JCWRldmljZS0+cG93ZXIuc3RhdGUgPSBzdGF0ZTsKLQl9CisJLyogV2Ugc2hvdWxkbid0IGNoYW5nZSB0aGUgc3RhdGUgdW5sZXNzIHRoZSBhYm92ZSBvcGVyYXRpb25zIHN1Y2NlZWQuICovCisJZGV2aWNlLT5wb3dlci5zdGF0ZSA9IHJlc3VsdCA/IEFDUElfU1RBVEVfVU5LTk9XTiA6IHN0YXRlOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCmluZGV4IGFmYWQ2NzcuLmY1Zjk4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2MuYwpAQCAtMzExLDcgKzMxMSw5IEBACiAJCQkgICBkZXYtPnBucC5idXNfaWQsCiAJCQkgICAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKIAkJCSAgIGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlID8gJyonIDogJyAnLAotCQkJICAgZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQkJICAgKGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikKKwkJCSAgICAgfHwgKGxkZXYgJiYgZGV2aWNlX21heV93YWtldXAobGRldikpKSA/CisJCQkgICAgICAgImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJCWlmIChsZGV2KQogCQkJc2VxX3ByaW50ZihzZXEsICIlczolcyIsCiAJCQkJICAgbGRldi0+YnVzID8gbGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCkBAIC0zMjgsOCArMzMwLDEwIEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFkZXYtPmhhbmRsZSk7CiAKLQlpZiAoZGV2ICYmIGRldmljZV9jYW5fd2FrZXVwKGRldikpCi0JCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShkZXYsIGFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKTsKKwlpZiAoZGV2ICYmIGRldmljZV9jYW5fd2FrZXVwKGRldikpIHsKKwkJYm9vbCBlbmFibGUgPSAhZGV2aWNlX21heV93YWtldXAoZGV2KTsKKwkJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKGRldiwgZW5hYmxlKTsKKwl9CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0zNDEsNyArMzQ1LDYgQEAKIAljaGFyIHN0cmJ1Zls1XTsKIAljaGFyIHN0cls1XSA9ICIiOwogCXVuc2lnbmVkIGludCBsZW4gPSBjb3VudDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmZvdW5kX2RldiA9IE5VTEw7CiAKIAlpZiAobGVuID4gNCkKIAkJbGVuID0gNDsKQEAgLTM2MSwzMyArMzY0LDEzIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoIXN0cm5jbXAoZGV2LT5wbnAuYnVzX2lkLCBzdHIsIDQpKSB7Ci0JCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KLQkJCSAgICBkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gMCA6IDE7Ci0JCQlmb3VuZF9kZXYgPSBkZXY7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoZm91bmRfZGV2KSB7Ci0JCXBoeXNpY2FsX2RldmljZV9lbmFibGVfd2FrZXVwKGZvdW5kX2Rldik7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCi0JCQkJCQkJICAgICAgIHN0cnVjdAotCQkJCQkJCSAgICAgICBhY3BpX2RldmljZSwKLQkJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOwotCi0JCQlpZiAoKGRldiAhPSBmb3VuZF9kZXYpICYmCi0JCQkgICAgKGRldi0+d2FrZXVwLmdwZV9udW1iZXIgPT0KLQkJCSAgICAgZm91bmRfZGV2LT53YWtldXAuZ3BlX251bWJlcikKLQkJCSAgICAmJiAoZGV2LT53YWtldXAuZ3BlX2RldmljZSA9PQotCQkJCWZvdW5kX2Rldi0+d2FrZXVwLmdwZV9kZXZpY2UpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICAgICAiQUNQSTogJyVzJyBhbmQgJyVzJyBoYXZlIHRoZSBzYW1lIEdQRSwgIgotCQkJCSAgICAgICAiY2FuJ3QgZGlzYWJsZS9lbmFibGUgb25lIHNlcGFyYXRlbHlcbiIsCi0JCQkJICAgICAgIGRldi0+cG5wLmJ1c19pZCwgZm91bmRfZGV2LT5wbnAuYnVzX2lkKTsKLQkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KLQkJCQkgICAgZm91bmRfZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZDsKKwkJCWlmIChkZXZpY2VfY2FuX3dha2V1cCgmZGV2LT5kZXYpKSB7CisJCQkJYm9vbCBlbmFibGUgPSAhZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KTsKKwkJCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmRldi0+ZGV2LCBlbmFibGUpOworCQkJfSBlbHNlIHsKIAkJCQlwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChkZXYpOwogCQkJfQorCQkJYnJlYWs7CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKaW5kZXggYmVjNTYxYy4uM2MxYTJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKQEAgLTIzLDcgKzIzLDcgQEAKIHsKIAlwcmludGsoS0VSTl9OT1RJQ0UgUFJFRklYICIlcyBkZXRlY3RlZCAtICIKIAkJImRpc2FibGluZyBtd2FpdCBmb3IgQ1BVIEMtc3RhdGVzXG4iLCBpZC0+aWRlbnQpOwotCWlkbGVfbm9td2FpdCA9IDE7CisJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfTk9NV0FJVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjgzLDcgKzI4Myw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlpZiAoaWRsZV9ub213YWl0KSB7CisJaWYgKGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPT0gSURMRV9OT01XQUlUKSB7CiAJCS8qCiAJCSAqIElmIG13YWl0IGlzIGRpc2FibGVkIGZvciBDUFUgQy1zdGF0ZXMsIHRoZSBDMkMzX0ZGSCBhY2Nlc3MKIAkJICogbW9kZSB3aWxsIGJlIGRpc2FibGVkIGluIHRoZSBwYXJhbWV0ZXIgb2YgX1BEQyBvYmplY3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwppbmRleCA4NWU0ODA0Li4zNjBhNzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKQEAgLTQwLDEwICs0MCw2IEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KQEAgLTI0Niw1MyArMjQyLDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0jaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3Byb2Nlc3Nvcl9kaXIgPSBOVUxMOwotCi1zdGF0aWMgaW50IF9fY3B1aW5pdCBhY3BpX3Byb2Nlc3Nvcl9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0KLQotCWlmICghYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJYWNwaV9kZXZpY2VfZGlyKGRldmljZSkgPSBwcm9jX21rZGlyKGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJCQkJICAgICBhY3BpX3Byb2Nlc3Nvcl9kaXIpOwotCQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogJ3Rocm90dGxpbmcnIFtSL1ddICovCi0JZW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKEFDUElfUFJPQ0VTU09SX0ZJTEVfVEhST1RUTElORywKLQkJCQkgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAotCQkJCSBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSwKLQkJCQkgJmFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wcywKLQkJCQkgYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfcmVtb3ZlX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCi0JaWYgKGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0ZJTEVfVEhST1RUTElORywKLQkJCQkgIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGFjcGlfcHJvY2Vzc29yX2Rpcik7Ci0JCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2Nlc3Nvcl9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDc4LDggKzQyNywxMyBAQAogCWlmIChhY3Rpb24gPT0gQ1BVX09OTElORSAmJiBwcikgewogCQlhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQocHIsIDApOwogCQlhY3BpX3Byb2Nlc3Nvcl9jc3RfaGFzX2NoYW5nZWQocHIpOworCQlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgYWN0aW9uKTsKIAkJYWNwaV9wcm9jZXNzb3JfdHN0YXRlX2hhc19jaGFuZ2VkKHByKTsKIAl9CisJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCAmJiBwcikgeworCQkvKiBpbnZhbGlkYXRlIHRoZSBmbGFnLnRocm90dGxpbmcgYWZ0ZXIgb25lIENQVSBpcyBvZmZsaW5lICovCisJCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBhY3Rpb24pOworCX0KIAlyZXR1cm4gTk9USUZZX09LOwogfQogCkBAIC01MzcsMTQgKzQ5MSwxMCBAQAogCiAJcGVyX2NwdShwcm9jZXNzb3JzLCBwci0+aWQpID0gcHI7CiAKLQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9hZGRfZnMoZGV2aWNlKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycl9mcmVlX2NwdW1hc2s7Ci0KIAlzeXNkZXYgPSBnZXRfY3B1X3N5c2Rldihwci0+aWQpOwogCWlmIChzeXNmc19jcmVhdGVfbGluaygmZGV2aWNlLT5kZXYua29iaiwgJnN5c2Rldi0+a29iaiwgInN5c2RldiIpKSB7CiAJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX3JlbW92ZV9mczsKKwkJZ290byBlcnJfZnJlZV9jcHVtYXNrOwogCX0KIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQpAQCAtNTkwLDggKzU0MCw2IEBACiAJdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKHByLT5jZGV2KTsKIGVycl9wb3dlcl9leGl0OgogCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2V4aXQocHIsIGRldmljZSk7Ci1lcnJfcmVtb3ZlX2ZzOgotCWFjcGlfcHJvY2Vzc29yX3JlbW92ZV9mcyhkZXZpY2UpOwogZXJyX2ZyZWVfY3B1bWFzazoKIAlmcmVlX2NwdW1hc2tfdmFyKHByLT50aHJvdHRsaW5nLnNoYXJlZF9jcHVfbWFwKTsKIApAQCAtNjIwLDggKzU2OCw2IEBACiAKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2aWNlLT5kZXYua29iaiwgInN5c2RldiIpOwogCi0JYWNwaV9wcm9jZXNzb3JfcmVtb3ZlX2ZzKGRldmljZSk7Ci0KIAlpZiAocHItPmNkZXYpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldmljZS0+ZGV2LmtvYmosICJ0aGVybWFsX2Nvb2xpbmciKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnByLT5jZGV2LT5kZXZpY2Uua29iaiwgImRldmljZSIpOwpAQCAtODU0LDEyICs4MDAsNiBAQAogCiAJbWVtc2V0KCZlcnJhdGEsIDAsIHNpemVvZihlcnJhdGEpKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGUwotCWFjcGlfcHJvY2Vzc29yX2RpciA9IHByb2NfbWtkaXIoQUNQSV9QUk9DRVNTT1JfQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwotCWlmICghYWNwaV9wcm9jZXNzb3JfZGlyKQotCQlyZXR1cm4gLUVOT01FTTsKLSNlbmRpZgotCiAJaWYgKCFjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9pZGxlX2RyaXZlcikpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkFDUEk6ICVzIHJlZ2lzdGVyZWQgd2l0aCBjcHVpZGxlXG4iLAogCQkJYWNwaV9pZGxlX2RyaXZlci5uYW1lKTsKQEAgLTg4NSwxMCArODI1LDYgQEAKIG91dF9jcHVpZGxlOgogCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfaWRsZV9kcml2ZXIpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTCi0JcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9QUk9DRVNTT1JfQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwotI2VuZGlmCi0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC05MDcsMTAgKzg0Myw2IEBACiAKIAljcHVpZGxlX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2lkbGVfZHJpdmVyKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGUwotCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfUFJPQ0VTU09SX0NMQVNTLCBhY3BpX3Jvb3RfZGlyKTsKLSNlbmRpZgotCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IGE3NjViODIuLmQ2MTViN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC03OSw2ICs3OSwxMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBsYXRlbmN5X2ZhY3RvciBfX3JlYWRfbW9zdGx5ID0gMjsKIG1vZHVsZV9wYXJhbShsYXRlbmN5X2ZhY3RvciwgdWludCwgMDY0NCk7CiAKK3N0YXRpYyBpbnQgZGlzYWJsZWRfYnlfaWRsZV9ib290X3BhcmFtKHZvaWQpCit7CisJcmV0dXJuIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPT0gSURMRV9QT0xMIHx8CisJCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPT0gSURMRV9GT1JDRV9NV0FJVCB8fAorCQlib290X29wdGlvbl9pZGxlX292ZXJyaWRlID09IElETEVfSEFMVDsKK30KKwogLyoKICAqIElCTSBUaGlua1BhZCBSNDBlIGNyYXNoZXMgbXlzdGVyaW91c2x5IHdoZW4gZ29pbmcgaW50byBDMiBvciBDMy4KICAqIEZvciBub3cgZGlzYWJsZSB0aGlzLiBQcm9iYWJseSBhIGJ1ZyBzb21ld2hlcmUgZWxzZS4KQEAgLTQ1NSw3ICs0NjIsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJaWYgKGN4LnR5cGUgPT0gQUNQSV9TVEFURV9DMSAmJgotCQkJCQkoaWRsZV9oYWx0IHx8IGlkbGVfbm9td2FpdCkpIHsKKwkJCSAgICAoYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9PSBJRExFX05PTVdBSVQpKSB7CiAJCQkJLyoKIAkJCQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBDMSBzcGFjZV9pZCBvYnRhaW5lZCBmcm9tCiAJCQkJICogX0NTVCBvYmplY3QgaXMgRklYRURfSEFSRFdBUkUgYWNjZXNzIG1vZGUuCkBAIC0xMDE2LDcgKzEwMjMsNiBAQAogCQlzdGF0ZS0+ZmxhZ3MgPSAwOwogCQlzd2l0Y2ggKGN4LT50eXBlKSB7CiAJCQljYXNlIEFDUElfU1RBVEVfQzE6Ci0JCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1NIQUxMT1c7CiAJCQlpZiAoY3gtPmVudHJ5X21ldGhvZCA9PSBBQ1BJX0NTVEFURV9GRkgpCiAJCQkJc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19USU1FX1ZBTElEOwogCkBAIC0xMDI1LDE2ICsxMDMxLDEzIEBACiAJCQlicmVhazsKIAogCQkJY2FzZSBBQ1BJX1NUQVRFX0MyOgotCQkJc3RhdGUtPmZsYWdzIHw9IENQVUlETEVfRkxBR19CQUxBTkNFRDsKIAkJCXN0YXRlLT5mbGFncyB8PSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRDsKIAkJCXN0YXRlLT5lbnRlciA9IGFjcGlfaWRsZV9lbnRlcl9zaW1wbGU7CiAJCQlkZXYtPnNhZmVfc3RhdGUgPSBzdGF0ZTsKIAkJCWJyZWFrOwogCiAJCQljYXNlIEFDUElfU1RBVEVfQzM6Ci0JCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX0RFRVA7CiAJCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7Ci0JCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX0NIRUNLX0JNOwogCQkJc3RhdGUtPmVudGVyID0gcHItPmZsYWdzLmJtX2NoZWNrID8KIAkJCQkJYWNwaV9pZGxlX2VudGVyX2JtIDoKIAkJCQkJYWNwaV9pZGxlX2VudGVyX3NpbXBsZTsKQEAgLTEwNTgsNyArMTA2MSw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSkKKwlpZiAoZGlzYWJsZWRfYnlfaWRsZV9ib290X3BhcmFtKCkpCiAJCXJldHVybiAwOwogCiAJaWYgKCFwcikKQEAgLTEwODksMTkgKzEwOTIsMTAgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCXN0YXRpYyBpbnQgZmlyc3RfcnVuOwogCi0JaWYgKGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUpCisJaWYgKGRpc2FibGVkX2J5X2lkbGVfYm9vdF9wYXJhbSgpKQogCQlyZXR1cm4gMDsKIAogCWlmICghZmlyc3RfcnVuKSB7Ci0JCWlmIChpZGxlX2hhbHQpIHsKLQkJCS8qCi0JCQkgKiBXaGVuIHRoZSBib290IG9wdGlvbiBvZiAiaWRsZT1oYWx0IiBpcyBhZGRlZCwgaGFsdAotCQkJICogaXMgdXNlZCBmb3IgQ1BVIElETEUuCi0JCQkgKiBJbiBzdWNoIGNhc2UgQzIvQzMgaXMgbWVhbmluZ2xlc3MuIFNvIHRoZSBtYXhfY3N0YXRlCi0JCQkgKiBpcyBzZXQgdG8gb25lLgotCQkJICovCi0JCQltYXhfY3N0YXRlID0gMTsKLQkJfQogCQlkbWlfY2hlY2tfc3lzdGVtKHByb2Nlc3Nvcl9wb3dlcl9kbWlfdGFibGUpOwogCQltYXhfY3N0YXRlID0gYWNwaV9wcm9jZXNzb3JfY3N0YXRlX2NoZWNrKG1heF9jc3RhdGUpOwogCQlpZiAobWF4X2NzdGF0ZSA8IEFDUElfQ19TVEFURVNfTUFYKQpAQCAtMTE0Miw3ICsxMTM2LDcgQEAKIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9leGl0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAoYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSkKKwlpZiAoZGlzYWJsZWRfYnlfaWRsZV9ib290X3BhcmFtKCkpCiAJCXJldHVybiAwOwogCiAJY3B1aWRsZV91bnJlZ2lzdGVyX2RldmljZSgmcHItPnBvd2VyLmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IGZmMzYzMjcuLmZhODRlOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC0zMiwxMCArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KLSNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlMKLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTM3MCw2ICszNjYsNTggQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWV2YWx1YXRlIHdoZXRoZXIgdGhlIFQtc3RhdGUgaXMgdmFsaWQKKyAqIGFmdGVyIG9uZSBDUFUgaXMgb25saW5lZC9vZmZsaW5lZC4KKyAqIEl0IGlzIG5vdGVkIHRoYXQgaXQgd29uJ3QgcmVldmFsdWF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZm9yCisgKiB0aGUgVC1zdGF0ZS4KKyAqCTEuIENvbnRyb2wgbWV0aG9kLgorICoJMi4gdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgVC1zdGF0ZQorICoJMy4gVFNEIGRvbWFpbgorICovCit2b2lkIGFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgeworCQkvKiBXaGVuIG9uZSBDUFUgaXMgb2ZmbGluZSwgdGhlIFQtc3RhdGUgdGhyb3R0bGluZworCQkgKiB3aWxsIGJlIGludmFsaWRhdGVkLgorCQkgKi8KKwkJcHItPmZsYWdzLnRocm90dGxpbmcgPSAwOworCQlyZXR1cm47CisJfQorCS8qIHRoZSBmb2xsb3dpbmcgaXMgdG8gcmVjaGVjayB3aGV0aGVyIHRoZSBULXN0YXRlIGlzIHZhbGlkIGZvcgorCSAqIHRoZSBvbmxpbmUgQ1BVCisJICovCisJaWYgKCFwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCkgeworCQkvKiBJZiB0aGUgbnVtYmVyIG9mIFQtc3RhdGUgaXMgaW52YWxpZCwgaXQgaXMKKwkJICogaW52YWxpZGF0ZWQuCisJCSAqLworCQlwci0+ZmxhZ3MudGhyb3R0bGluZyA9IDA7CisJCXJldHVybjsKKwl9CisJcHItPmZsYWdzLnRocm90dGxpbmcgPSAxOworCisJLyogRGlzYWJsZSB0aHJvdHRsaW5nIChpZiBlbmFibGVkKS4gIFdlJ2xsIGxldCBzdWJzZXF1ZW50CisJICogcG9saWN5IChlLmcudGhlcm1hbCkgZGVjaWRlIHRvIGxvd2VyIHBlcmZvcm1hbmNlIGlmIGl0CisJICogc28gY2hvb3NlcywgYnV0IGZvciBub3cgd2UnbGwgY3JhbmsgdXAgdGhlIHNwZWVkLgorCSAqLworCisJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmcocHIpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kOworCisJaWYgKHByLT50aHJvdHRsaW5nLnN0YXRlKSB7CisJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHByLCAwLCBmYWxzZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGVuZDsKKwl9CisKK2VuZDoKKwlpZiAocmVzdWx0KQorCQlwci0+ZmxhZ3MudGhyb3R0bGluZyA9IDA7Cit9CisvKgogICogX1BUQyAtIFByb2Nlc3NvciBUaHJvdHRsaW5nIENvbnRyb2wgKGFuZCBzdGF0dXMpIHJlZ2lzdGVyIGxvY2F0aW9uCiAgKi8KIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X3Rocm90dGxpbmdfY29udHJvbChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQpAQCAtODc2LDcgKzkyNCwxMSBAQAogCSAqLwogCWNwdW1hc2tfY29weShzYXZlZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKIAkvKiBGSVhNRTogdXNlIHdvcmtfb25fY3B1KCkgKi8KLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKHByLT5pZCkpOworCWlmIChzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKHByLT5pZCkpKSB7CisJCS8qIENhbid0IG1pZ3JhdGUgdG8gdGhlIHRhcmdldCBwci0+aWQgQ1BVLiBFeGl0ICovCisJCWZyZWVfY3B1bWFza192YXIoc2F2ZWRfbWFzayk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlyZXQgPSBwci0+dGhyb3R0bGluZy5hY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyhwcik7CiAJLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUgKi8KIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBzYXZlZF9tYXNrKTsKQEAgLTEwNTEsNiArMTEwMywxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlpZiAoY3B1X2lzX29mZmxpbmUocHItPmlkKSkgeworCQkvKgorCQkgKiB0aGUgY3B1IHBvaW50ZWQgYnkgcHItPmlkIGlzIG9mZmxpbmUuIFVubmVjZXNzYXJ5IHRvIGNoYW5nZQorCQkgKiB0aGUgdGhyb3R0bGluZyBzdGF0ZSBhbnkgbW9yZS4KKwkJICovCisJCXJldHVybiAtRU5PREVWOworCX0KKwogCWNwdW1hc2tfY29weShzYXZlZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKIAl0X3N0YXRlLnRhcmdldF9zdGF0ZSA9IHN0YXRlOwogCXBfdGhyb3R0bGluZyA9ICYocHItPnRocm90dGxpbmcpOwpAQCAtMTA3NCw3ICsxMTM0LDExIEBACiAJICovCiAJaWYgKHBfdGhyb3R0bGluZy0+c2hhcmVkX3R5cGUgPT0gRE9NQUlOX0NPT1JEX1RZUEVfU1dfQU5ZKSB7CiAJCS8qIEZJWE1FOiB1c2Ugd29ya19vbl9jcHUoKSAqLwotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKHByLT5pZCkpOworCQlpZiAoc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihwci0+aWQpKSkgeworCQkJLyogQ2FuJ3QgbWlncmF0ZSB0byB0aGUgcHItPmlkIENQVS4gRXhpdCAqLworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdDsKKwkJfQogCQlyZXQgPSBwX3Rocm90dGxpbmctPmFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHByLAogCQkJCQkJdF9zdGF0ZS50YXJnZXRfc3RhdGUsIGZvcmNlKTsKIAl9IGVsc2UgewpAQCAtMTEwNiw3ICsxMTcwLDggQEAKIAkJCX0KIAkJCXRfc3RhdGUuY3B1ID0gaTsKIAkJCS8qIEZJWE1FOiB1c2Ugd29ya19vbl9jcHUoKSAqLwotCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihpKSk7CisJCQlpZiAoc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihpKSkpCisJCQkJY29udGludWU7CiAJCQlyZXQgPSBtYXRjaF9wci0+dGhyb3R0bGluZy4KIAkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZygKIAkJCQltYXRjaF9wciwgdF9zdGF0ZS50YXJnZXRfc3RhdGUsIGZvcmNlKTsKQEAgLTExMjYsNiArMTE5MSw3IEBACiAJLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUgKi8KIAkvKiBGSVhNRTogdXNlIHdvcmtfb25fY3B1KCkgKi8KIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBzYXZlZF9tYXNrKTsKK2V4aXQ6CiAJZnJlZV9jcHVtYXNrX3ZhcihvbmxpbmVfdGhyb3R0bGluZ19jcHVzKTsKIAlmcmVlX2NwdW1hc2tfdmFyKHNhdmVkX21hc2spOwogCXJldHVybiByZXQ7CkBAIC0xMjE2LDExMyArMTI4MiwzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGUwotLyogcHJvYyBpbnRlcmZhY2UgKi8KLXN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCQkJICAgICAgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBzZXEtPnByaXZhdGU7Ci0JaW50IGkgPSAwOwotCWludCByZXN1bHQgPSAwOwotCi0JaWYgKCFwcikKLQkJZ290byBlbmQ7Ci0KLQlpZiAoIShwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCA+IDApKSB7Ci0JCXNlcV9wdXRzKHNlcSwgIjxub3Qgc3VwcG9ydGVkPlxuIik7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nKHByKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJc2VxX3B1dHMoc2VxLAotCQkJICJDb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgdGhyb3R0bGluZyBzdGF0ZS5cbiIpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlIGNvdW50OiAgICAgICAgICAgICAlZFxuIgotCQkgICAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIFQlZFxuIgotCQkgICAic3RhdGUgYXZhaWxhYmxlOiBUJWQgdG8gVCVkXG4iLAotCQkgICBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCwgcHItPnRocm90dGxpbmcuc3RhdGUsCi0JCSAgIHByLT50aHJvdHRsaW5nX3BsYXRmb3JtX2xpbWl0LAotCQkgICBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCAtIDEpOwotCi0Jc2VxX3B1dHMoc2VxLCAic3RhdGVzOlxuIik7Ci0JaWYgKHByLT50aHJvdHRsaW5nLmFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nID09Ci0JCQlhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19mYWR0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudDsgaSsrKQotCQkJc2VxX3ByaW50ZihzZXEsICIgICAlY1QlZDogICAgICAgICAgICAgICAgICAlMDJkJSVcbiIsCi0JCQkJICAgKGkgPT0gcHItPnRocm90dGxpbmcuc3RhdGUgPyAnKicgOiAnICcpLCBpLAotCQkJCSAgIChwci0+dGhyb3R0bGluZy5zdGF0ZXNbaV0ucGVyZm9ybWFuY2UgPyBwci0+Ci0JCQkJICAgIHRocm90dGxpbmcuc3RhdGVzW2ldLnBlcmZvcm1hbmNlIC8gMTAgOiAwKSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50OyBpKyspCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiAgICVjVCVkOiAgICAgICAgICAgICAgICAgICUwMmQlJVxuIiwKLQkJCQkgICAoaSA9PSBwci0+dGhyb3R0bGluZy5zdGF0ZSA/ICcqJyA6ICcgJyksIGksCi0JCQkJICAgKGludClwci0+dGhyb3R0bGluZy5zdGF0ZXNfdHNzW2ldLgotCQkJCSAgIGZyZXFwZXJjZW50YWdlKTsKLQl9Ci0KLSAgICAgIGVuZDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19zZXFfc2hvdywKLQkJCSAgIFBERShpbm9kZSktPmRhdGEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhY3BpX3Byb2Nlc3Nvcl93cml0ZV90aHJvdHRsaW5nKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBtLT5wcml2YXRlOwotCWNoYXIgc3RhdGVfc3RyaW5nWzVdID0gIiI7Ci0JY2hhciAqY2hhcnAgPSBOVUxMOwotCXNpemVfdCBzdGF0ZV92YWwgPSAwOwotCWNoYXIgdG1wYnVmWzVdID0gIiI7Ci0KLQlpZiAoIXByIHx8IChjb3VudCA+IHNpemVvZihzdGF0ZV9zdHJpbmcpIC0gMSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHN0YXRlX3N0cmluZywgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc3RhdGVfc3RyaW5nW2NvdW50XSA9ICdcMCc7Ci0JaWYgKChjb3VudCA+IDApICYmIChzdGF0ZV9zdHJpbmdbY291bnQtMV0gPT0gJ1xuJykpCi0JCXN0YXRlX3N0cmluZ1tjb3VudC0xXSA9ICdcMCc7Ci0KLQljaGFycCA9IHN0YXRlX3N0cmluZzsKLQlpZiAoKHN0YXRlX3N0cmluZ1swXSA9PSAndCcpIHx8IChzdGF0ZV9zdHJpbmdbMF0gPT0gJ1QnKSkKLQkJY2hhcnArKzsKLQotCXN0YXRlX3ZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNoYXJwLCBOVUxMLCAwKTsKLQlpZiAoc3RhdGVfdmFsID49IHByLT50aHJvdHRsaW5nLnN0YXRlX2NvdW50KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNucHJpbnRmKHRtcGJ1ZiwgNSwgIiV6dSIsIHN0YXRlX3ZhbCk7Ci0KLQlpZiAoc3RyY21wKHRtcGJ1ZiwgY2hhcnApICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcocHIsIHN0YXRlX3ZhbCwgZmFsc2UpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19vcGVuX2ZzLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLndyaXRlID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfdGhyb3R0bGluZywKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzLmMgYi9kcml2ZXJzL2FjcGkvc2JzLmMKaW5kZXggZTVkYmVkYi4uNTFhZTM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnMuYwpAQCAtNDg0LDYgKzQ4NCw4IEBACiAJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnN0YXRlX2ZvcHMsCiAJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmFsYXJtX2ZvcHMsIHZvaWQgKmRhdGEpCiB7CisJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkRlcHJlY2F0ZWQgcHJvY2ZzIEkvRiBmb3IgU0JTIGlzIGxvYWRlZCwiCisJCQkiIHBsZWFzZSByZXRyeSB3aXRoIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUiBjbGVhcmVkXG4iKTsKIAlpZiAoISpkaXIpIHsKIAkJKmRpciA9IHByb2NfbWtkaXIoZGlyX25hbWUsIHBhcmVudF9kaXIpOwogCQlpZiAoISpkaXIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDI5ZWY1MDUuLmI5OWU2MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtNzc4LDcgKzc3OCw3IEBACiAJCXdha2V1cC0+cmVzb3VyY2VzLmhhbmRsZXNbaV0gPSBlbGVtZW50LT5yZWZlcmVuY2UuaGFuZGxlOwogCX0KIAotCWFjcGlfZ3BlX2Nhbl93YWtlKHdha2V1cC0+Z3BlX2RldmljZSwgd2FrZXVwLT5ncGVfbnVtYmVyKTsKKwlhY3BpX3NldHVwX2dwZV9mb3Jfd2FrZShoYW5kbGUsIHdha2V1cC0+Z3BlX2RldmljZSwgd2FrZXVwLT5ncGVfbnVtYmVyKTsKIAogIG91dDoKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CkBAIC04MDMsNyArODAzLDcgQEAKIAkvKiBQb3dlciBidXR0b24sIExpZCBzd2l0Y2ggYWx3YXlzIGVuYWJsZSB3YWtldXAgKi8KIAlpZiAoIWFjcGlfbWF0Y2hfZGV2aWNlX2lkcyhkZXZpY2UsIGJ1dHRvbl9kZXZpY2VfaWRzKSkgewogCQlkZXZpY2UtPndha2V1cC5mbGFncy5ydW5fd2FrZSA9IDE7Ci0JCWRldmljZS0+d2FrZXVwLmZsYWdzLmFsd2F5c19lbmFibGVkID0gMTsKKwkJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmZGV2aWNlLT5kZXYsIHRydWUpOwogCQlyZXR1cm47CiAJfQogCkBAIC04MTUsMTYgKzgxNSwyMiBAQAogCQkJCSEhKGV2ZW50X3N0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19IQU5ETEUpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfYnVzX2dldF93YWtldXBfZGV2aWNlX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgYWNwaV9idXNfZ2V0X3dha2V1cF9kZXZpY2VfZmxhZ3Moc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CisJYWNwaV9oYW5kbGUgdGVtcDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwogCWludCBwc3dfZXJyb3I7CiAKKwkvKiBQcmVzZW5jZSBvZiBfUFJXIGluZGljYXRlcyB3YWtlIGNhcGFibGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfUFJXIiwgJnRlbXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuOworCiAJc3RhdHVzID0gYWNwaV9idXNfZXh0cmFjdF93YWtldXBfZGV2aWNlX3Bvd2VyX3BhY2thZ2UoZGV2aWNlLT5oYW5kbGUsCiAJCQkJCQkJICAgICAgJmRldmljZS0+d2FrZXVwKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkV4dHJhY3RpbmcgX1BSVyBwYWNrYWdlIikpOwotCQlnb3RvIGVuZDsKKwkJcmV0dXJuOwogCX0KIAogCWRldmljZS0+d2FrZXVwLmZsYWdzLnZhbGlkID0gMTsKQEAgLTg0MCwxMyArODQ2LDEwIEBACiAJaWYgKHBzd19lcnJvcikKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAogCQkJCSJlcnJvciBpbiBfRFNXIG9yIF9QU1cgZXZhbHVhdGlvblxuIikpOwotCi1lbmQ6Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlkZXZpY2UtPmZsYWdzLndha2VfY2FwYWJsZSA9IDA7Ci0JcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFjcGlfYnVzX2FkZF9wb3dlcl9yZXNvdXJjZShhY3BpX2hhbmRsZSBoYW5kbGUpOworCiBzdGF0aWMgaW50IGFjcGlfYnVzX2dldF9wb3dlcl9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwpAQCAtODc1LDggKzg3OCwxMiBAQAogCQlhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShkZXZpY2UtPmhhbmRsZSwgb2JqZWN0X25hbWUsIE5VTEwsCiAJCQkJCSZwcy0+cmVzb3VyY2VzKTsKIAkJaWYgKHBzLT5yZXNvdXJjZXMuY291bnQpIHsKKwkJCWludCBqOworCiAJCQlkZXZpY2UtPnBvd2VyLmZsYWdzLnBvd2VyX3Jlc291cmNlcyA9IDE7CiAJCQlwcy0+ZmxhZ3MudmFsaWQgPSAxOworCQkJZm9yIChqID0gMDsgaiA8IHBzLT5yZXNvdXJjZXMuY291bnQ7IGorKykKKwkJCQlhY3BpX2J1c19hZGRfcG93ZXJfcmVzb3VyY2UocHMtPnJlc291cmNlcy5oYW5kbGVzW2pdKTsKIAkJfQogCiAJCS8qIEV2YWx1YXRlICJfUFN4IiB0byBzZWUgaWYgd2UgY2FuIGRvIGV4cGxpY2l0IHNldHMgKi8KQEAgLTkwMSwxMCArOTA4LDcgQEAKIAlkZXZpY2UtPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0QzXS5mbGFncy52YWxpZCA9IDE7CiAJZGV2aWNlLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9EM10ucG93ZXIgPSAwOwogCi0JLyogVEJEOiBTeXN0ZW0gd2FrZSBzdXBwb3J0IGFuZCByZXNvdXJjZSByZXF1aXJlbWVudHMuICovCi0KLQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOwotCWFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJihkZXZpY2UtPnBvd2VyLnN0YXRlKSk7CisJYWNwaV9idXNfaW5pdF9wb3dlcihkZXZpY2UpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05NDcsMTEgKzk1MSw2IEBACiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlkZXZpY2UtPmZsYWdzLnBvd2VyX21hbmFnZWFibGUgPSAxOwogCi0JLyogUHJlc2VuY2Ugb2YgX1BSVyBpbmRpY2F0ZXMgd2FrZSBjYXBhYmxlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1BSVyIsICZ0ZW1wKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCWRldmljZS0+ZmxhZ3Mud2FrZV9jYXBhYmxlID0gMTsKLQogCS8qIFRCRDogUGVyZm9ybWFuY2UgbWFuYWdlbWVudCAqLwogCiAJcmV0dXJuIDA7CkBAIC0xMjc4LDExICsxMjc3LDcgQEAKIAkgKiBXYWtldXAgZGV2aWNlIG1hbmFnZW1lbnQKIAkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICovCi0JaWYgKGRldmljZS0+ZmxhZ3Mud2FrZV9jYXBhYmxlKSB7Ci0JCXJlc3VsdCA9IGFjcGlfYnVzX2dldF93YWtldXBfZGV2aWNlX2ZsYWdzKGRldmljZSk7Ci0JCWlmIChyZXN1bHQpCi0JCQlnb3RvIGVuZDsKLQl9CisJYWNwaV9idXNfZ2V0X3dha2V1cF9kZXZpY2VfZmxhZ3MoZGV2aWNlKTsKIAogCS8qCiAJICogUGVyZm9ybWFuY2UgTWFuYWdlbWVudApAQCAtMTMyNiw2ICsxMzIxLDIwIEBACiAjZGVmaW5lIEFDUElfU1RBX0RFRkFVTFQgKEFDUElfU1RBX0RFVklDRV9QUkVTRU5UIHwgQUNQSV9TVEFfREVWSUNFX0VOQUJMRUQgfCBcCiAJCQkgIEFDUElfU1RBX0RFVklDRV9VSSAgICAgIHwgQUNQSV9TVEFfREVWSUNFX0ZVTkNUSU9OSU5HKQogCitzdGF0aWMgdm9pZCBhY3BpX2J1c19hZGRfcG93ZXJfcmVzb3VyY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzID0geworCQkuYWNwaV9vcF9hZGQgPSAxLAorCQkuYWNwaV9vcF9zdGFydCA9IDEsCisJfTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisKKwlhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSk7CisJaWYgKCFkZXZpY2UpCisJCWFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgaGFuZGxlLCBBQ1BJX0JVU19UWVBFX1BPV0VSLAorCQkJCQlBQ1BJX1NUQV9ERUZBVUxULCAmb3BzKTsKK30KKwogc3RhdGljIGludCBhY3BpX2J1c190eXBlX2FuZF9zdGF0dXMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnR5cGUsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc3RhKQogewpAQCAtMTM3MSw3ICsxMzgwLDYgQEAKIAlzdHJ1Y3QgYWNwaV9idXNfb3BzICpvcHMgPSBjb250ZXh0OwogCWludCB0eXBlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGE7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cCB3YWtldXA7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCByZXN1bHQ7CkBAIC0xMzgyLDcgKzEzOTAsMTMgQEAKIAogCWlmICghKHN0YSAmIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UKSAmJgogCSAgICAhKHN0YSAmIEFDUElfU1RBX0RFVklDRV9GVU5DVElPTklORykpIHsKLQkJYWNwaV9idXNfZXh0cmFjdF93YWtldXBfZGV2aWNlX3Bvd2VyX3BhY2thZ2UoaGFuZGxlLCAmd2FrZXVwKTsKKwkJc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cCB3YWtldXA7CisJCWFjcGlfaGFuZGxlIHRlbXA7CisKKwkJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9QUlciLCAmdGVtcCk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJCWFjcGlfYnVzX2V4dHJhY3Rfd2FrZXVwX2RldmljZV9wb3dlcl9wYWNrYWdlKGhhbmRsZSwKKwkJCQkJCQkJICAgICAmd2FrZXVwKTsKIAkJcmV0dXJuIEFFX0NUUkxfREVQVEg7CiAJfQogCkBAIC0xNDY3LDcgKzE0ODEsNyBAQAogCiAJcmVzdWx0ID0gYWNwaV9idXNfc2NhbihkZXZpY2UtPmhhbmRsZSwgJm9wcywgTlVMTCk7CiAKLQlhY3BpX3VwZGF0ZV9ncGVzKCk7CisJYWNwaV91cGRhdGVfYWxsX2dwZXMoKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xNTczLDYgKzE1ODcsOCBAQAogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDb3VsZCBub3QgcmVnaXN0ZXIgYnVzIHR5cGVcbiIpOwogCX0KIAorCWFjcGlfcG93ZXJfaW5pdCgpOworCiAJLyoKIAkgKiBFbnVtZXJhdGUgZGV2aWNlcyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UuCiAJICovCkBAIC0xNTg0LDcgKzE2MDAsNyBAQAogCWlmIChyZXN1bHQpCiAJCWFjcGlfZGV2aWNlX3VucmVnaXN0ZXIoYWNwaV9yb290LCBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCk7CiAJZWxzZQotCQlhY3BpX3VwZGF0ZV9ncGVzKCk7CisJCWFjcGlfdXBkYXRlX2FsbF9ncGVzKCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAuYwppbmRleCBmZWJiMTUzLi5mZGQzYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAuYwpAQCAtMTI0LDggKzEyNCw3IEBACiBzdGF0aWMgaW50IGFjcGlfcG1fcHJlX3N1c3BlbmQodm9pZCkKIHsKIAlhY3BpX3BtX2ZyZWV6ZSgpOwotCXN1c3BlbmRfbnZzX3NhdmUoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3VzcGVuZF9udnNfc2F2ZSgpOwogfQogCiAvKioKQEAgLTE1MSw3ICsxNTAsNyBAQAogewogCWludCBlcnJvciA9IF9fYWNwaV9wbV9wcmVwYXJlKCk7CiAJaWYgKCFlcnJvcikKLQkJYWNwaV9wbV9wcmVfc3VzcGVuZCgpOworCQllcnJvciA9IGFjcGlfcG1fcHJlX3N1c3BlbmQoKTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTMxOSw3ICszMTgsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBhY3BpX3N1c3BlbmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBhY3BpX3N1c3BlbmRfb3BzID0gewogCS52YWxpZCA9IGFjcGlfc3VzcGVuZF9zdGF0ZV92YWxpZCwKIAkuYmVnaW4gPSBhY3BpX3N1c3BlbmRfYmVnaW4sCiAJLnByZXBhcmVfbGF0ZSA9IGFjcGlfcG1fcHJlcGFyZSwKQEAgLTM0Nyw3ICszNDYsNyBAQAogICogVGhlIGZvbGxvd2luZyBjYWxsYmFja3MgYXJlIHVzZWQgaWYgdGhlIHByZS1BQ1BJIDIuMCBzdXNwZW5kIG9yZGVyaW5nIGhhcwogICogYmVlbiByZXF1ZXN0ZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYWNwaV9zdXNwZW5kX29wc19vbGQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGFjcGlfc3VzcGVuZF9vcHNfb2xkID0gewogCS52YWxpZCA9IGFjcGlfc3VzcGVuZF9zdGF0ZV92YWxpZCwKIAkuYmVnaW4gPSBhY3BpX3N1c3BlbmRfYmVnaW5fb2xkLAogCS5wcmVwYXJlX2xhdGUgPSBhY3BpX3BtX3ByZV9zdXNwZW5kLApAQCAtNDM1LDYgKzQzNCwxNCBAQAogCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1OVzEzMEQiKSwKIAkJfSwKIAl9LAorCXsKKwkuY2FsbGJhY2sgPSBpbml0X252c19ub3NhdmUsCisJLmlkZW50ID0gIkF2ZXJhdGVjIEFWMTAyMC1FRDIiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBVkVSQVRFQyIpLAorCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjEwMDAgU2VyaWVzIiksCisJCX0sCisJfSwKIAl7fSwKIH07CiAjZW5kaWYgLyogQ09ORklHX1NVU1BFTkQgKi8KQEAgLTUwNiw3ICs1MTMsNyBAQAogCWFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMoKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyBhY3BpX2hpYmVybmF0aW9uX29wcyA9IHsKIAkuYmVnaW4gPSBhY3BpX2hpYmVybmF0aW9uX2JlZ2luLAogCS5lbmQgPSBhY3BpX3BtX2VuZCwKIAkucHJlX3NuYXBzaG90ID0gYWNwaV9wbV9wcmVwYXJlLApAQCAtNTQ5LDcgKzU1Niw3IEBACiAgKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgdXNlZCBpZiB0aGUgcHJlLUFDUEkgMi4wIHN1c3BlbmQgb3JkZXJpbmcgaGFzCiAgKiBiZWVuIHJlcXVlc3RlZC4KICAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHNfb2xkID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHNfb2xkID0gewogCS5iZWdpbiA9IGFjcGlfaGliZXJuYXRpb25fYmVnaW5fb2xkLAogCS5lbmQgPSBhY3BpX3BtX2VuZCwKIAkucHJlX3NuYXBzaG90ID0gYWNwaV9wbV9wcmVfc3VzcGVuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXNmcy5jIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKaW5kZXggZjg1ODhmOC4uNjE4OTFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogCXJldHVybjsKIH0KIAotdm9pZCBhY3BpX29zX2dwZV9jb3VudCh1MzIgZ3BlX251bWJlcikKK3N0YXRpYyB2b2lkIGdwZV9jb3VudCh1MzIgZ3BlX251bWJlcikKIHsKIAlhY3BpX2dwZV9jb3VudCsrOwogCkBAIC00NTQsNyArNDU0LDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgYWNwaV9vc19maXhlZF9ldmVudF9jb3VudCh1MzIgZXZlbnRfbnVtYmVyKQorc3RhdGljIHZvaWQgZml4ZWRfZXZlbnRfY291bnQodTMyIGV2ZW50X251bWJlcikKIHsKIAlpZiAoIWFsbF9jb3VudGVycykKIAkJcmV0dXJuOwpAQCAtNDY4LDYgKzQ2OCwxNiBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgYWNwaV9nYmxfZXZlbnRfaGFuZGxlcih1MzIgZXZlbnRfdHlwZSwgYWNwaV9oYW5kbGUgZGV2aWNlLAorCXUzMiBldmVudF9udW1iZXIsIHZvaWQgKmNvbnRleHQpCit7CisJaWYgKGV2ZW50X3R5cGUgPT0gQUNQSV9FVkVOVF9UWVBFX0dQRSkKKwkJZ3BlX2NvdW50KGV2ZW50X251bWJlcik7CisKKwlpZiAoZXZlbnRfdHlwZSA9PSBBQ1BJX0VWRU5UX1RZUEVfRklYRUQpCisJCWZpeGVkX2V2ZW50X2NvdW50KGV2ZW50X251bWJlcik7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X3N0YXR1cyh1MzIgaW5kZXgsIGFjcGlfZXZlbnRfc3RhdHVzICpzdGF0dXMsCiAJCSAgICAgIGFjcGlfaGFuZGxlICpoYW5kbGUpCiB7CkBAIC02MDEsNiArNjExLDcgQEAKIAogdm9pZCBhY3BpX2lycV9zdGF0c19pbml0KHZvaWQpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWludCBpOwogCiAJaWYgKGFsbF9jb3VudGVycykKQEAgLTYxOSw2ICs2MzAsMTAgQEAKIAlpZiAoYWxsX2NvdW50ZXJzID09IE5VTEwpCiAJCWdvdG8gZmFpbDsKIAorCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9nbG9iYWxfZXZlbnRfaGFuZGxlcihhY3BpX2dibF9ldmVudF9oYW5kbGVyLCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWdvdG8gZmFpbDsKKwogCWNvdW50ZXJfYXR0cnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga29ial9hdHRyaWJ1dGUpICogKG51bV9jb3VudGVycyksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKGNvdW50ZXJfYXR0cnMgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDVhMjdiMGEuLjI2MDdlMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtMTA1OSw4ICsxMDU5LDkgQEAKIAkJCWJyZWFrOwogCQl0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLmVuYWJsZWQgPSAxOwogCQlmb3IgKGogPSAwOyBqIDwgdHotPnRyaXBzLmFjdGl2ZVtpXS5kZXZpY2VzLmNvdW50OyBqKyspIHsKLQkJCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcih0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuCi0JCQkgICAgaGFuZGxlc1tqXSwgJnBvd2VyX3N0YXRlKTsKKwkJCXJlc3VsdCA9IGFjcGlfYnVzX3VwZGF0ZV9wb3dlcigKKwkJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5kZXZpY2VzLmhhbmRsZXNbal0sCisJCQkJCSZwb3dlcl9zdGF0ZSk7CiAJCQlpZiAocmVzdWx0IHx8IChwb3dlcl9zdGF0ZSAhPSBBQ1BJX1NUQVRFX0QwKSkgewogCQkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MuZW5hYmxlZCA9IDA7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW8uYyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCmluZGV4IDVjZDAyMjguLjkwZjhmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9fb3V0cHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KQEAgLTgxLDYgKzgwLDEzIEBACiBzdGF0aWMgaW50IGFsbG93X2R1cGxpY2F0ZXM7CiBtb2R1bGVfcGFyYW0oYWxsb3dfZHVwbGljYXRlcywgYm9vbCwgMDY0NCk7CiAKKy8qCisgKiBTb21lIEJJT1NlcyBjbGFpbSB0aGV5IHVzZSBtaW5pbXVtIGJhY2tsaWdodCBhdCBib290LAorICogYW5kIHRoaXMgbWF5IGJyaW5nIGRpbW1pbmcgc2NyZWVuIGFmdGVyIGJvb3QKKyAqLworc3RhdGljIGludCB1c2VfYmlvc19pbml0aWFsX2JhY2tsaWdodCA9IDE7Cittb2R1bGVfcGFyYW0odXNlX2Jpb3NfaW5pdGlhbF9iYWNrbGlnaHQsIGJvb2wsIDA2NDQpOworCiBzdGF0aWMgaW50IHJlZ2lzdGVyX2NvdW50ID0gMDsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CkBAIC0xNzIsOSArMTc4LDYgQEAKIAl1OCBfQlFDOjE7CQkvKiBHZXQgY3VycmVudCBicmlnaHRuZXNzIGxldmVsICovCiAJdTggX0JDUToxOwkJLyogU29tZSBidWdneSBCSU9TIHVzZXMgX0JDUSBpbnN0ZWFkIG9mIF9CUUMgKi8KIAl1OCBfRERDOjE7CQkvKlJldHVybiB0aGUgRURJRCBmb3IgdGhpcyBkZXZpY2UgKi8KLQl1OCBfRENTOjE7CQkvKlJldHVybiBzdGF0dXMgb2Ygb3V0cHV0IGRldmljZSAqLwotCXU4IF9ER1M6MTsJCS8qUXVlcnkgZ3JhcGhpY3Mgc3RhdGUgKi8KLQl1OCBfRFNTOjE7CQkvKkRldmljZSBzdGF0ZSBzZXQgKi8KIH07CiAKIHN0cnVjdCBhY3BpX3ZpZGVvX2JyaWdodG5lc3NfZmxhZ3MgewpAQCAtMjAyLDcgKzIwNSw2IEBACiAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgKmJyaWdodG5lc3M7CiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodDsKIAlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY29vbGluZ19kZXY7Ci0Jc3RydWN0IG91dHB1dF9kZXZpY2UgKm91dHB1dF9kZXY7CiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciBkZXZpY2VfZGVjb2RlW11bMzBdID0gewpAQCAtMjI2LDEwICsyMjgsNiBAQAogCQkJCSAgICAgdTMyIGxldmVsX2N1cnJlbnQsIHUzMiBldmVudCk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3Moc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCiAJCQkJCSBpbnQgZXZlbnQpOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBsb25nICpzdGF0ZSk7Ci1zdGF0aWMgaW50IGFjcGlfdmlkZW9fb3V0cHV0X2dldChzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqb2QpOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7CiAKIC8qYmFja2xpZ2h0IGRldmljZSBzeXNmcyBzdXBwb3J0Ki8KIHN0YXRpYyBpbnQgYWNwaV92aWRlb19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCkBAIC0yNjAsMzUgKzI1OCwxMSBAQAogCQkJCXZkLT5icmlnaHRuZXNzLT5sZXZlbHNbcmVxdWVzdF9sZXZlbF0pOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgYWNwaV9iYWNrbGlnaHRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFjcGlfYmFja2xpZ2h0X29wcyA9IHsKIAkuZ2V0X2JyaWdodG5lc3MgPSBhY3BpX3ZpZGVvX2dldF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzICA9IGFjcGlfdmlkZW9fc2V0X2JyaWdodG5lc3MsCiB9OwogCi0vKnZpZGVvIG91dHB1dCBkZXZpY2Ugc3lzZnMgc3VwcG9ydCovCi1zdGF0aWMgaW50IGFjcGlfdmlkZW9fb3V0cHV0X2dldChzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqb2QpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YXRlOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqdmQgPQotCQkoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopZGV2X2dldF9kcnZkYXRhKCZvZC0+ZGV2KTsKLQlhY3BpX3ZpZGVvX2RldmljZV9nZXRfc3RhdGUodmQsICZzdGF0ZSk7Ci0JcmV0dXJuIChpbnQpc3RhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV92aWRlb19vdXRwdXRfc2V0KHN0cnVjdCBvdXRwdXRfZGV2aWNlICpvZCkKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXRlID0gb2QtPnJlcXVlc3Rfc3RhdGU7Ci0Jc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICp2ZD0KLQkJKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKWRldl9nZXRfZHJ2ZGF0YSgmb2QtPmRldik7Ci0JcmV0dXJuIGFjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZSh2ZCwgc3RhdGUpOwotfQotCi1zdGF0aWMgc3RydWN0IG91dHB1dF9wcm9wZXJ0aWVzIGFjcGlfb3V0cHV0X3Byb3BlcnRpZXMgPSB7Ci0JLnNldF9zdGF0ZSA9IGFjcGlfdmlkZW9fb3V0cHV0X3NldCwKLQkuZ2V0X3N0YXR1cyA9IGFjcGlfdmlkZW9fb3V0cHV0X2dldCwKLX07Ci0KLQogLyogdGhlcm1hbCBjb29saW5nIGRldmljZSBjYWxsYmFja3MgKi8KIHN0YXRpYyBpbnQgdmlkZW9fZ2V0X21heF9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY29vbGluZ19kZXYsIHVuc2lnbmVkCiAJCQkgICAgICAgbG9uZyAqc3RhdGUpCkBAIC0zNDQsMzQgKzMxOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gTWFuYWdlbWVudAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyogZGV2aWNlICovCi0KLXN0YXRpYyBpbnQKLWFjcGlfdmlkZW9fZGV2aWNlX2dldF9zdGF0ZShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnN0YXRlKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9EQ1MiLCBOVUxMLCBzdGF0ZSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50Ci1hY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSkKLXsKLQlpbnQgc3RhdHVzOwotCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OwotCi0KLQlhcmcwLmludGVnZXIudmFsdWUgPSBzdGF0ZTsKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9EU1MiLCAmYXJncywgJnJldCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCiBzdGF0aWMgaW50CiBhY3BpX3ZpZGVvX2RldmljZV9sY2RfcXVlcnlfbGV2ZWxzKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAogCQkJCSAgIHVuaW9uIGFjcGlfb2JqZWN0ICoqbGV2ZWxzKQpAQCAtNzY2LDkgKzcxMiwxMSBAQAogCQkgKiB3aGVuIGludm9rZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBpLmUuIGxldmVsX29sZCBpcyBpbnZhbGlkLgogCQkgKiBzZXQgdGhlIGJhY2tsaWdodCB0byBtYXhfbGV2ZWwgaW4gdGhpcyBjYXNlCiAJCSAqLwotCQlmb3IgKGkgPSAyOyBpIDwgYnItPmNvdW50OyBpKyspCi0JCQlpZiAobGV2ZWxfb2xkID09IGJyLT5sZXZlbHNbaV0pCi0JCQkJbGV2ZWwgPSBsZXZlbF9vbGQ7CisJCWlmICh1c2VfYmlvc19pbml0aWFsX2JhY2tsaWdodCkgeworCQkJZm9yIChpID0gMjsgaSA8IGJyLT5jb3VudDsgaSsrKQorCQkJCWlmIChsZXZlbF9vbGQgPT0gYnItPmxldmVsc1tpXSkKKwkJCQkJbGV2ZWwgPSBsZXZlbF9vbGQ7CisJCX0KIAkJZ290byBzZXRfbGV2ZWw7CiAJfQogCkBAIC04MzEsMTUgKzc3OSw2IEBACiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9EREMiLCAmaF9kdW1teTEpKSkgewogCQlkZXZpY2UtPmNhcC5fRERDID0gMTsKIAl9Ci0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9EQ1MiLCAmaF9kdW1teTEpKSkgewotCQlkZXZpY2UtPmNhcC5fRENTID0gMTsKLQl9Ci0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9ER1MiLCAmaF9kdW1teTEpKSkgewotCQlkZXZpY2UtPmNhcC5fREdTID0gMTsKLQl9Ci0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5kZXYtPmhhbmRsZSwgIl9EU1MiLCAmaF9kdW1teTEpKSkgewotCQlkZXZpY2UtPmNhcC5fRFNTID0gMTsKLQl9CiAKIAlpZiAoYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpKSB7CiAJCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKQEAgLTkwNCwyMSArODQzLDYgQEAKIAkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNyZWF0ZSBzeXNmcyBsaW5rXG4iKTsKIAogCX0KLQotCWlmIChhY3BpX3ZpZGVvX2Rpc3BsYXlfc3dpdGNoX3N1cHBvcnQoKSkgewotCi0JCWlmIChkZXZpY2UtPmNhcC5fRENTICYmIGRldmljZS0+Y2FwLl9EU1MpIHsKLQkJCXN0YXRpYyBpbnQgY291bnQ7Ci0JCQljaGFyICpuYW1lOwotCQkJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiYWNwaV92aWRlbyVkIiwgY291bnQpOwotCQkJaWYgKCFuYW1lKQotCQkJCXJldHVybjsKLQkJCWNvdW50Kys7Ci0JCQlkZXZpY2UtPm91dHB1dF9kZXYgPSB2aWRlb19vdXRwdXRfcmVnaXN0ZXIobmFtZSwKLQkJCQkJTlVMTCwgZGV2aWNlLCAmYWNwaV9vdXRwdXRfcHJvcGVydGllcyk7Ci0JCQlrZnJlZShuYW1lKTsKLQkJfQotCX0KIH0KIAogLyoKQEAgLTEzNjAsNiArMTI4NCw5IEBACiAJCWlmICghdmlkZW9fZGV2aWNlKQogCQkJY29udGludWU7CiAKKwkJaWYgKCF2aWRlb19kZXZpY2UtPmNhcC5fRERDKQorCQkJY29udGludWU7CisKIAkJaWYgKHR5cGUpIHsKIAkJCXN3aXRjaCAodHlwZSkgewogCQkJY2FzZSBBQ1BJX1ZJREVPX0RJU1BMQVlfQ1JUOgpAQCAtMTQ1Miw3ICsxMzc5LDYgQEAKIAkJdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKGRldmljZS0+Y29vbGluZ19kZXYpOwogCQlkZXZpY2UtPmNvb2xpbmdfZGV2ID0gTlVMTDsKIAl9Ci0JdmlkZW9fb3V0cHV0X3VucmVnaXN0ZXIoZGV2aWNlLT5vdXRwdXRfZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCmluZGV4IGI4MzY3NjEuLjQyZDNkNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKQEAgLTE3LDE1ICsxNywxNCBAQAogICogY2FwYWJpbGl0aWVzIHRoZSBncmFwaGljcyBjYXJkcyBwbHVnZ2VkIGluIHN1cHBvcnQuIFRoZSBjaGVjayBmb3IgZ2VuZXJhbAogICogdmlkZW8gY2FwYWJpbGl0aWVzIHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBmaXJzdCBjYWxsZXIgb2YKICAqIGFjcGlfdmlkZW9fZ2V0X2NhcGFiaWxpdGllcyhOVUxMKTsgd2hpY2ggd2lsbCBoYXBwZW4gd2hlbiB0aGUgZmlyc3QKLSAqIGJhY2tsaWdodCAob3IgZGlzcGxheSBvdXRwdXQpIHN3aXRjaGluZyBzdXBwb3J0aW5nIGRyaXZlciBjYWxsczoKKyAqIGJhY2tsaWdodCBzd2l0Y2hpbmcgc3VwcG9ydGluZyBkcml2ZXIgY2FsbHM6CiAgKiBhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCk7CiAgKgogICogRGVwZW5kaW5nIG9uIHdoZXRoZXIgQUNQSSBncmFwaGljcyBleHRlbnNpb25zIChjbXAuIEFDUEkgc3BlYyBBcHBlbmRpeCBCKQogICogYXJlIGF2YWlsYWJsZSwgdmlkZW8ua28gc2hvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIHRoZSBkZXZpY2UuCiAgKgogICogT3RoZXJ3aXNlIHZlbmRvciBzcGVjaWZpYyBkcml2ZXJzIGxpa2UgdGhpbmtwYWRfYWNwaSwgYXN1c19hY3BpLAotICogc29ueV9hY3BpLC4uLiBjYW4gdGFrZSBjYXJlIGFib3V0IGJhY2tsaWdodCBicmlnaHRuZXNzIGFuZCBkaXNwbGF5IG91dHB1dAotICogc3dpdGNoaW5nLgorICogc29ueV9hY3BpLC4uLiBjYW4gdGFrZSBjYXJlIGFib3V0IGJhY2tsaWdodCBicmlnaHRuZXNzLgogICoKICAqIElmIENPTkZJR19BQ1BJX1ZJREVPIGlzIG5laXRoZXIgc2V0IGFzICJjb21waWxlZCBpbiIgKHkpIG5vciBhcyBhIG1vZHVsZSAobSkKICAqIHRoaXMgZmlsZSB3aWxsIG5vdCBiZSBjb21waWxlZCwgYWNwaV92aWRlb19nZXRfY2FwYWJpbGl0aWVzKCkgYW5kCkBAIC04MywxMSArODIsNiBAQAogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gMDsKIAotCS8qIElzIHRoaXMgZGV2aWNlIGFibGUgdG8gc3VwcG9ydCB2aWRlbyBzd2l0Y2hpbmcgPyAqLwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RPRCIsICZoX2R1bW15KSkgfHwKLQkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9ET1MiLCAmaF9kdW1teSkpKQotCQl2aWRlb19jYXBzIHw9IEFDUElfVklERU9fT1VUUFVUX1NXSVRDSElORzsKLQogCS8qIElzIHRoaXMgZGV2aWNlIGFibGUgdG8gcmV0cmlldmUgYSB2aWRlbyBST00gPyAqLwogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1JPTSIsICZoX2R1bW15KSkpCiAJCXZpZGVvX2NhcHMgfD0gQUNQSV9WSURFT19ST01fQVZBSUxBQkxFOwpAQCAtMTYxLDggKzE1NSw2IEBACiAJCSAqCiAJCSAqICAgaWYgKGRtaV9uYW1lX2luX3ZlbmRvcnMoIlhZIikpIHsKIAkJICoJYWNwaV92aWRlb19zdXBwb3J0IHw9Ci0JCSAqCQlBQ1BJX1ZJREVPX09VVFBVVF9TV0lUQ0hJTkdfRE1JX1ZFTkRPUjsKLQkJICoJYWNwaV92aWRlb19zdXBwb3J0IHw9CiAJCSAqCQlBQ1BJX1ZJREVPX0JBQ0tMSUdIVF9ETUlfVkVORE9SOwogCQkgKn0KIAkJICovCkBAIC0yMTIsMzMgKzIwNCw4IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQpOwogCiAvKgotICogUmV0dXJucyB0cnVlIGlmIHZpZGVvLmtvIGNhbiBkbyBkaXNwbGF5IG91dHB1dCBzd2l0Y2hpbmcuCi0gKiBUaGlzIGRvZXMgbm90IHdvcmsgd2VsbC9hdCBhbGwgd2l0aCBiaW5hcnkgZ3JhcGhpY3MgZHJpdmVycwotICogd2hpY2ggZGlzYWJsZSBzeXN0ZW0gaW8gcmFuZ2VzIGFuZCBkbyBpdCBvbiB0aGVpciBvd24uCi0gKi8KLWludCBhY3BpX3ZpZGVvX2Rpc3BsYXlfc3dpdGNoX3N1cHBvcnQodm9pZCkKLXsKLQlpZiAoIWFjcGlfdmlkZW9fY2Fwc19jaGVja2VkKQotCQlhY3BpX3ZpZGVvX2dldF9jYXBhYmlsaXRpZXMoTlVMTCk7Ci0KLQlpZiAoYWNwaV92aWRlb19zdXBwb3J0ICYgQUNQSV9WSURFT19PVVRQVVRfU1dJVENISU5HX0ZPUkNFX1ZFTkRPUikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAoYWNwaV92aWRlb19zdXBwb3J0ICYgQUNQSV9WSURFT19PVVRQVVRfU1dJVENISU5HX0ZPUkNFX1ZJREVPKQotCQlyZXR1cm4gMTsKLQotCWlmIChhY3BpX3ZpZGVvX3N1cHBvcnQgJiBBQ1BJX1ZJREVPX09VVFBVVF9TV0lUQ0hJTkdfRE1JX1ZFTkRPUikKLQkJcmV0dXJuIDA7Ci0JZWxzZSBpZiAoYWNwaV92aWRlb19zdXBwb3J0ICYgQUNQSV9WSURFT19PVVRQVVRfU1dJVENISU5HX0RNSV9WSURFTykKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gYWNwaV92aWRlb19zdXBwb3J0ICYgQUNQSV9WSURFT19PVVRQVVRfU1dJVENISU5HOwotfQotRVhQT1JUX1NZTUJPTChhY3BpX3ZpZGVvX2Rpc3BsYXlfc3dpdGNoX3N1cHBvcnQpOwotCi0vKgotICogVXNlIGFjcGlfZGlzcGxheV9vdXRwdXQ9dmVuZG9yL3ZpZGVvIG9yIGFjcGlfYmFja2xpZ2h0PXZlbmRvci92aWRlbwotICogVG8gZm9yY2UgdGhhdCBiYWNrbGlnaHQgb3IgZGlzcGxheSBvdXRwdXQgc3dpdGNoaW5nIGlzIHByb2Nlc3NlZCBieSB2ZW5kb3IKLSAqIHNwZWNpZmljIGFjcGkgZHJpdmVycyBvciB2aWRlby5rbyBkcml2ZXIuCisgKiBVc2UgYWNwaV9iYWNrbGlnaHQ9dmVuZG9yL3ZpZGVvIHRvIGZvcmNlIHRoYXQgYmFja2xpZ2h0IHN3aXRjaGluZworICogaXMgcHJvY2Vzc2VkIGJ5IHZlbmRvciBzcGVjaWZpYyBhY3BpIGRyaXZlcnMgb3IgdmlkZW8ua28gZHJpdmVyLgogICovCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2JhY2tsaWdodChjaGFyICpzdHIpCiB7CkBAIC0yNTUsMTkgKzIyMiwzIEBACiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJhY3BpX2JhY2tsaWdodD0iLCBhY3BpX2JhY2tsaWdodCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZGlzcGxheV9vdXRwdXQoY2hhciAqc3RyKQotewotCWlmIChzdHIgPT0gTlVMTCB8fCAqc3RyID09ICdcMCcpCi0JCXJldHVybiAxOwotCWVsc2UgewotCQlpZiAoIXN0cmNtcCgidmVuZG9yIiwgc3RyKSkKLQkJCWFjcGlfdmlkZW9fc3VwcG9ydCB8PQotCQkJCUFDUElfVklERU9fT1VUUFVUX1NXSVRDSElOR19GT1JDRV9WRU5ET1I7Ci0JCWlmICghc3RyY21wKCJ2aWRlbyIsIHN0cikpCi0JCQlhY3BpX3ZpZGVvX3N1cHBvcnQgfD0KLQkJCQlBQ1BJX1ZJREVPX09VVFBVVF9TV0lUQ0hJTkdfRk9SQ0VfVklERU87Ci0JfQotCXJldHVybiAxOwotfQotX19zZXR1cCgiYWNwaV9kaXNwbGF5X291dHB1dD0iLCBhY3BpX2Rpc3BsYXlfb3V0cHV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS93YWtldXAuYyBiL2RyaXZlcnMvYWNwaS93YWtldXAuYwppbmRleCBmNjJhNTBjLi5lZDY1MDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9hY3BpL3dha2V1cC5jCkBAIC0zNywxNSArMzcsMTYgQEAKIAkJCWNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKIAogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkCi0JCSAgICB8fCAhKGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgfHwgZGV2LT53YWtldXAucHJlcGFyZV9jb3VudCkKLQkJICAgIHx8IHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpCisJCSAgICB8fCBzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlCisJCSAgICB8fCAhKGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikKKwkJICAgICAgICB8fCBkZXYtPndha2V1cC5wcmVwYXJlX2NvdW50KSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKQorCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KSkKIAkJCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoZGV2LCBzbGVlcF9zdGF0ZSk7CiAKIAkJLyogVGhlIHdha2UtdXAgcG93ZXIgc2hvdWxkIGhhdmUgYmVlbiBlbmFibGVkIGFscmVhZHkuICovCi0JCWFjcGlfZ3BlX3dha2V1cChkZXYtPndha2V1cC5ncGVfZGV2aWNlLCBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQlhY3BpX3NldF9ncGVfd2FrZV9tYXNrKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCiAJCQkJQUNQSV9HUEVfRU5BQkxFKTsKIAl9CiB9CkBAIC02MywxNCArNjQsMTUgQEAKIAkJCWNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKIAogCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkCi0JCSAgICB8fCAhKGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgfHwgZGV2LT53YWtldXAucHJlcGFyZV9jb3VudCkKLQkJICAgIHx8IChzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKKwkJICAgIHx8IHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUKKwkJICAgIHx8ICEoZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KQorCQkgICAgICAgIHx8IGRldi0+d2FrZXVwLnByZXBhcmVfY291bnQpKQogCQkJY29udGludWU7CiAKLQkJYWNwaV9ncGVfd2FrZXVwKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCisJCWFjcGlfc2V0X2dwZV93YWtlX21hc2soZGV2LT53YWtldXAuZ3BlX2RldmljZSwgZGV2LT53YWtldXAuZ3BlX251bWJlciwKIAkJCQlBQ1BJX0dQRV9ESVNBQkxFKTsKIAotCQlpZiAoZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCkKKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpCiAJCQlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihkZXYpOwogCX0KIH0KQEAgLTg0LDggKzg2LDggQEAKIAkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobm9kZSwKIAkJCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UsCiAJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOwotCQlpZiAoZGV2LT53YWtldXAuZmxhZ3MuYWx3YXlzX2VuYWJsZWQpCi0JCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKKwkJaWYgKGRldmljZV9jYW5fd2FrZXVwKCZkZXYtPmRldikpCisJCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoJmRldi0+ZGV2LCB0cnVlKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDM2ZTIzMTkuLmM2YjI5OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtMiw2ICsyLDE0IEBACiAjIFNBVEEvUEFUQSBkcml2ZXIgY29uZmlndXJhdGlvbgogIwogCitjb25maWcgSEFWRV9QQVRBX1BMQVRGT1JNCisJYm9vbAorCWhlbHAKKwkgIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29uZmlndXJhdGlvbiBub2RlIGZvciBhbnkgbWFjaGluZSB0aGF0CisJICB1c2VzIHBhdGEtcGxhdGZvcm0gZHJpdmVyIHRvIGVuYWJsZSB0aGUgcmVsZXZhbnQgZHJpdmVyIGluIHRoZQorCSAgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgd2l0aG91dCBoYXZpbmcgdG8gc3VibWl0IGVuZGxlc3MgcGF0Y2hlcworCSAgdG8gdXBkYXRlIHRoZSBQQVRBX1BMQVRGT1JNIGVudHJ5LgorCiBtZW51Y29uZmlnIEFUQQogCXRyaXN0YXRlICJTZXJpYWwgQVRBIGFuZCBQYXJhbGxlbCBBVEEgZHJpdmVycyIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQpAQCAtOTAsNiArOTgsMTQgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEluaXRpbyAxNjJ4IFNlcmlhbCBBVEEuCiAKK2NvbmZpZyBTQVRBX0FDQVJEX0FIQ0kKKwl0cmlzdGF0ZSAiQUNhcmQgQUhDSSB2YXJpYW50IChBVFAgODYyMCkiCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIEFjYXJkLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgU0FUQV9TSUwyNAogCXRyaXN0YXRlICJTaWxpY29uIEltYWdlIDMxMjQvMzEzMiBTQVRBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKQEAgLTQwMCwxMSArNDE2LDExIEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUEFUQV9IUFQzWDJOCi0JdHJpc3RhdGUgIkhQVCAzNzJOLzMwMk4gUEFUQSBzdXBwb3J0IgorCXRyaXN0YXRlICJIUFQgMzcxTi8zNzJOLzMwMk4gUEFUQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTiB2YXJpYW50IEhQVCBQQVRBCi0JICBjb250cm9sbGVycyB2aWEgdGhlIG5ldyBBVEEgbGF5ZXIKKwkgIGNvbnRyb2xsZXJzIHZpYSB0aGUgbmV3IEFUQSBsYXllci4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApAQCAtNzY1LDE0ICs3ODEsNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSEFWRV9QQVRBX1BMQVRGT1JNCi0JYm9vbAotCWhlbHAKLQkgIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29uZmlndXJhdGlvbiBub2RlIGZvciBhbnkgbWFjaGluZSB0aGF0Ci0JICB1c2VzIHBhdGEtcGxhdGZvcm0gZHJpdmVyIHRvIGVuYWJsZSB0aGUgcmVsZXZhbnQgZHJpdmVyIGluIHRoZQotCSAgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgd2l0aG91dCBoYXZpbmcgdG8gc3VibWl0IGVuZGxlc3MgcGF0Y2hlcwotCSAgdG8gdXBkYXRlIHRoZSBQQVRBX1BMQVRGT1JNIGVudHJ5LgotCiBjb25maWcgUEFUQV9QTEFURk9STQogCXRyaXN0YXRlICJHZW5lcmljIHBsYXRmb3JtIGRldmljZSBQQVRBIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFTUJFRERFRCB8fCBQUEMgfHwgSEFWRV9QQVRBX1BMQVRGT1JNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IDJiNjdjOTAuLjI3MjkxYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogCiAjIG5vbi1TRkYgaW50ZXJmYWNlCiBvYmotJChDT05GSUdfU0FUQV9BSENJKQkJKz0gYWhjaS5vIGxpYmFoY2kubworb2JqLSQoQ09ORklHX1NBVEFfQUNBUkRfQUhDSSkJKz0gYWNhcmQtYWhjaS5vIGxpYmFoY2kubwogb2JqLSQoQ09ORklHX1NBVEFfQUhDSV9QTEFURk9STSkgKz0gYWhjaV9wbGF0Zm9ybS5vIGxpYmFoY2kubwogb2JqLSQoQ09ORklHX1NBVEFfRlNMKQkJKz0gc2F0YV9mc2wubwogb2JqLSQoQ09ORklHX1NBVEFfSU5JQzE2MlgpCSs9IHNhdGFfaW5pYzE2MngubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jIGIvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWMyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKQEAgLTAsMCArMSw1MjggQEAKKworLyoKKyAqICBhY2FyZC1haGNpLmMgLSBBQ2FyZCBBSENJIFNBVEEgc3VwcG9ydAorICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICoJCSAgICBQbGVhc2UgQUxXQVlTIGNvcHkgbGludXgtaWRlQHZnZXIua2VybmVsLm9yZworICoJCSAgICBvbiBlbWFpbHMuCisgKgorICogIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKiBsaWJhdGEgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdmlhICdtYWtlIHtwc3xwZGZ9ZG9jcycsCisgKiBhcyBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbGliYXRhLioKKyAqCisgKiBBSENJIGhhcmR3YXJlIGRvY3VtZW50YXRpb246CisgKiBodHRwOi8vd3d3LmludGVsLmNvbS90ZWNobm9sb2d5L3NlcmlhbGF0YS9wZGYvcmV2MV8wLnBkZgorICogaHR0cDovL3d3dy5pbnRlbC5jb20vdGVjaG5vbG9neS9zZXJpYWxhdGEvcGRmL3JldjFfMS5wZGYKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgorI2luY2x1ZGUgImFoY2kuaCIKKworI2RlZmluZSBEUlZfTkFNRQkiYWNhcmQtYWhjaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKKworLyoKKyAgUmVjZWl2ZWQgRklTIHN0cnVjdHVyZSBsaW1pdGVkIHRvIDgwaC4KKyovCisKKyNkZWZpbmUgQUNBUkRfQUhDSV9SWF9GSVNfU1ogMTI4CisKK2VudW0geworCUFIQ0lfUENJX0JBUgkJPSA1LAorfTsKKworZW51bSBib2FyZF9pZHMgeworCWJvYXJkX2FjYXJkX2FoY2ksCit9OworCitzdHJ1Y3QgYWNhcmRfc2cgeworCV9fbGUzMgkJCWFkZHI7CisJX19sZTMyCQkJYWRkcl9oaTsKKwlfX2xlMzIJCQlyZXNlcnZlZDsKKwlfX2xlMzIJCQlzaXplOwkgLyogYml0IDMxIChFT1QpIG1heD09MHgxMDAwMCAoNjRrKSAqLworfTsKKworc3RhdGljIHZvaWQgYWNhcmRfYWhjaV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworc3RhdGljIGJvb2wgYWNhcmRfYWhjaV9xY19maWxsX3J0ZihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIGludCBhY2FyZF9haGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhY2FyZF9haGNpX3BjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpOworc3RhdGljIGludCBhY2FyZF9haGNpX3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBhY2FyZF9haGNpX3NodCA9IHsKKwlBSENJX1NIVCgiYWNhcmQtYWhjaSIpLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFjYXJkX29wcyA9IHsKKwkuaW5oZXJpdHMJCT0gJmFoY2lfb3BzLAorCS5xY19wcmVwCQk9IGFjYXJkX2FoY2lfcWNfcHJlcCwKKwkucWNfZmlsbF9ydGYJCT0gYWNhcmRfYWhjaV9xY19maWxsX3J0ZiwKKwkucG9ydF9zdGFydCAgICAgICAgICAgICA9IGFjYXJkX2FoY2lfcG9ydF9zdGFydCwKK307CisKKyNkZWZpbmUgQUhDSV9IRkxBR1MoZmxhZ3MpCS5wcml2YXRlX2RhdGEJPSAodm9pZCAqKShmbGFncykKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGFjYXJkX2FoY2lfcG9ydF9pbmZvW10gPSB7CisJW2JvYXJkX2FjYXJkX2FoY2ldID0KKwl7CisJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX05PX05DUSksCisJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAorCQkucGlvX21hc2sJPSBBVEFfUElPNCwKKwkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzCT0gJmFjYXJkX29wcywKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFjYXJkX2FoY2lfcGNpX3RibFtdID0geworCS8qIEFDYXJkICovCisJeyBQQ0lfVkRFVklDRShBUlRPUCwgMHgwMDBkKSwgYm9hcmRfYWNhcmRfYWhjaSB9LCAvKiBBVFA4NjIwICovCisKKwl7IH0gICAgLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhY2FyZF9haGNpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQkJPSBhY2FyZF9haGNpX3BjaV90YmwsCisJLnByb2JlCQkJPSBhY2FyZF9haGNpX2luaXRfb25lLAorCS5yZW1vdmUJCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAkJPSBhY2FyZF9haGNpX3BjaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBhY2FyZF9haGNpX3BjaV9kZXZpY2VfcmVzdW1lLAorI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcGNpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBocHJpdi0+bW1pbzsKKwl1MzIgY3RsOworCisJaWYgKG1lc2cuZXZlbnQgJiBQTV9FVkVOVF9TVVNQRU5EICYmCisJICAgIGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fU1VTUEVORCkgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJICAgIkJJT1MgdXBkYXRlIHJlcXVpcmVkIGZvciBzdXNwZW5kL3Jlc3VtZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChtZXNnLmV2ZW50ICYgUE1fRVZFTlRfU0xFRVApIHsKKwkJLyogQUhDSSBzcGVjIHJldjEuMSBzZWN0aW9uIDguMy4zOgorCQkgKiBTb2Z0d2FyZSBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciB0byByZXF1ZXN0aW5nIGEKKwkJICogdHJhbnNpdGlvbiBvZiB0aGUgSEJBIHRvIEQzIHN0YXRlLgorCQkgKi8KKwkJY3RsID0gcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsKKwkJY3RsICY9IH5IT1NUX0lSUV9FTjsKKwkJd3JpdGVsKGN0bCwgbW1pbyArIEhPU1RfQ1RMKTsKKwkJcmVhZGwobW1pbyArIEhPU1RfQ1RMKTsgLyogZmx1c2ggKi8KKwl9CisKKwlyZXR1cm4gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZChwZGV2LCBtZXNnKTsKK30KKworc3RhdGljIGludCBhY2FyZF9haGNpX3BjaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmM7CisKKwlyYyA9IGF0YV9wY2lfZGV2aWNlX2RvX3Jlc3VtZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworCQlyYyA9IGFoY2lfcmVzZXRfY29udHJvbGxlcihob3N0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWFoY2lfaW5pdF9jb250cm9sbGVyKGhvc3QpOworCX0KKworCWF0YV9ob3N0X3Jlc3VtZShob3N0KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9jb25maWd1cmVfZG1hX21hc2tzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgdXNpbmdfZGFjKQoreworCWludCByYzsKKworCWlmICh1c2luZ19kYWMgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJCWlmIChyYykgeworCQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCQlpZiAocmMpIHsKKwkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCQkgICAiNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChyYykgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCSAgICIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFjYXJkX2FoY2lfcGNpX3ByaW50X2luZm8oc3RydWN0IGF0YV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXUxNiBjYzsKKwljb25zdCBjaGFyICpzY2NfczsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4MGEsICZjYyk7CisJaWYgKGNjID09IFBDSV9DTEFTU19TVE9SQUdFX0lERSkKKwkJc2NjX3MgPSAiSURFIjsKKwllbHNlIGlmIChjYyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9TQVRBKQorCQlzY2NfcyA9ICJTQVRBIjsKKwllbHNlIGlmIChjYyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9SQUlEKQorCQlzY2NfcyA9ICJSQUlEIjsKKwllbHNlCisJCXNjY19zID0gInVua25vd24iOworCisJYWhjaV9wcmludF9pbmZvKGhvc3QsIHNjY19zKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhY2FyZF9haGNpX2ZpbGxfc2coc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYywgdm9pZCAqY21kX3RibCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXN0cnVjdCBhY2FyZF9zZyAqYWNhcmRfc2cgPSBjbWRfdGJsICsgQUhDSV9DTURfVEJMX0hEUl9TWjsKKwl1bnNpZ25lZCBpbnQgc2ksIGxhc3Rfc2kgPSAwOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJLyoKKwkgKiBOZXh0LCB0aGUgUy9HIGxpc3QuCisJICovCisJZm9yX2VhY2hfc2cocWMtPnNnLCBzZywgcWMtPm5fZWxlbSwgc2kpIHsKKwkJZG1hX2FkZHJfdCBhZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQl1MzIgc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJLyoKKwkJICogQUNhcmQgbm90ZToKKwkJICogV2UgbXVzdCBzZXQgYW4gZW5kLW9mLXRhYmxlIChFT1QpIGJpdCwKKwkJICogYW5kIHRoZSBzZWdtZW50IGNhbm5vdCBleGNlZWQgNjRrICgweDEwMDAwKQorCQkgKi8KKwkJYWNhcmRfc2dbc2ldLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyICYgMHhmZmZmZmZmZik7CisJCWFjYXJkX3NnW3NpXS5hZGRyX2hpID0gY3B1X3RvX2xlMzIoKGFkZHIgPj4gMTYpID4+IDE2KTsKKwkJYWNhcmRfc2dbc2ldLnNpemUgPSBjcHVfdG9fbGUzMihzZ19sZW4pOworCQlsYXN0X3NpID0gc2k7CisJfQorCisJYWNhcmRfc2dbbGFzdF9zaV0uc2l6ZSB8PSBjcHVfdG9fbGUzMigxIDw8IDMxKTsJLyogc2V0IEVPVCAqLworCisJcmV0dXJuIHNpOworfQorCitzdGF0aWMgdm9pZCBhY2FyZF9haGNpX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOworCWludCBpc19hdGFwaSA9IGF0YV9pc19hdGFwaShxYy0+dGYucHJvdG9jb2wpOworCXZvaWQgKmNtZF90Ymw7CisJdTMyIG9wdHM7CisJY29uc3QgdTMyIGNtZF9maXNfbGVuID0gNTsgLyogZml2ZSBkd29yZHMgKi8KKwl1bnNpZ25lZCBpbnQgbl9lbGVtOworCisJLyoKKwkgKiBGaWxsIGluIGNvbW1hbmQgdGFibGUgaW5mb3JtYXRpb24uICBGaXJzdCwgdGhlIGhlYWRlciwKKwkgKiBhIFNBVEEgUmVnaXN0ZXIgLSBIb3N0IHRvIERldmljZSBjb21tYW5kIEZJUy4KKwkgKi8KKwljbWRfdGJsID0gcHAtPmNtZF90YmwgKyBxYy0+dGFnICogQUhDSV9DTURfVEJMX1NaOworCisJYXRhX3RmX3RvX2ZpcygmcWMtPnRmLCBxYy0+ZGV2LT5saW5rLT5wbXAsIDEsIGNtZF90YmwpOworCWlmIChpc19hdGFwaSkgeworCQltZW1zZXQoY21kX3RibCArIEFIQ0lfQ01EX1RCTF9DREIsIDAsIDMyKTsKKwkJbWVtY3B5KGNtZF90YmwgKyBBSENJX0NNRF9UQkxfQ0RCLCBxYy0+Y2RiLCBxYy0+ZGV2LT5jZGJfbGVuKTsKKwl9CisKKwluX2VsZW0gPSAwOworCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkKKwkJbl9lbGVtID0gYWNhcmRfYWhjaV9maWxsX3NnKHFjLCBjbWRfdGJsKTsKKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHNsb3QgaW5mb3JtYXRpb24uCisJICoKKwkgKiBBQ2FyZCBub3RlOiBwcmQgdGFibGUgbGVuZ3RoIG5vdCBmaWxsZWQgaW4KKwkgKi8KKwlvcHRzID0gY21kX2Zpc19sZW4gfCAocWMtPmRldi0+bGluay0+cG1wIDw8IDEyKTsKKwlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKQorCQlvcHRzIHw9IEFIQ0lfQ01EX1dSSVRFOworCWlmIChpc19hdGFwaSkKKwkJb3B0cyB8PSBBSENJX0NNRF9BVEFQSSB8IEFIQ0lfQ01EX1BSRUZFVENIOworCisJYWhjaV9maWxsX2NtZF9zbG90KHBwLCBxYy0+dGFnLCBvcHRzKTsKK30KKworc3RhdGljIGJvb2wgYWNhcmRfYWhjaV9xY19maWxsX3J0ZihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAgPSBxYy0+YXAtPnByaXZhdGVfZGF0YTsKKwl1OCAqcnhfZmlzID0gcHAtPnJ4X2ZpczsKKworCWlmIChwcC0+ZmJzX2VuYWJsZWQpCisJCXJ4X2ZpcyArPSBxYy0+ZGV2LT5saW5rLT5wbXAgKiBBQ0FSRF9BSENJX1JYX0ZJU19TWjsKKworCS8qCisJICogQWZ0ZXIgYSBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiBhbiBBVEEgUElPIGRhdGEtaW4gY29tbWFuZCwKKwkgKiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc2VuZCBEMkggUmVnIEZJUyB0byB1cGRhdGUgdGhlIFRGIGFuZAorCSAqIHRoZSBob3N0IHNob3VsZCB0YWtlIFRGIGFuZCBFX1N0YXR1cyBmcm9tIHRoZSBwcmVjZWRpbmcgUElPCisJICogU2V0dXAgRklTLgorCSAqLworCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfUElPICYmIHFjLT5kbWFfZGlyID09IERNQV9GUk9NX0RFVklDRSAmJgorCSAgICAhKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSkgeworCQlhdGFfdGZfZnJvbV9maXMocnhfZmlzICsgUlhfRklTX1BJT19TRVRVUCwgJnFjLT5yZXN1bHRfdGYpOworCQlxYy0+cmVzdWx0X3RmLmNvbW1hbmQgPSAocnhfZmlzICsgUlhfRklTX1BJT19TRVRVUClbMTVdOworCX0gZWxzZQorCQlhdGFfdGZfZnJvbV9maXMocnhfZmlzICsgUlhfRklTX0QySF9SRUcsICZxYy0+cmVzdWx0X3RmKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0LT5kZXY7CisJc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcDsKKwl2b2lkICptZW07CisJZG1hX2FkZHJfdCBtZW1fZG1hOworCXNpemVfdCBkbWFfc3osIHJ4X2Zpc19zejsKKworCXBwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcCksIEdGUF9LRVJORUwpOworCWlmICghcHApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY2hlY2sgRkJTIGNhcGFiaWxpdHkgKi8KKwlpZiAoKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9GQlMpICYmIHNhdGFfcG1wX3N1cHBvcnRlZChhcCkpIHsKKwkJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShhcCk7CisJCXUzMiBjbWQgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7CisJCWlmIChjbWQgJiBQT1JUX0NNRF9GQlNDUCkKKwkJCXBwLT5mYnNfc3VwcG9ydGVkID0gdHJ1ZTsKKwkJZWxzZSBpZiAoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19ZRVNfRkJTKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgZGV2LAorCQkJCSAgICJwb3J0ICVkIGNhbiBkbyBGQlMsIGZvcmNpbmcgRkJTQ1BcbiIsCisJCQkJICAgYXAtPnBvcnRfbm8pOworCQkJcHAtPmZic19zdXBwb3J0ZWQgPSB0cnVlOworCQl9IGVsc2UKKwkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBkZXYsCisJCQkJICAgInBvcnQgJWQgaXMgbm90IGNhcGFibGUgb2YgRkJTXG4iLAorCQkJCSAgIGFwLT5wb3J0X25vKTsKKwl9CisKKwlpZiAocHAtPmZic19zdXBwb3J0ZWQpIHsKKwkJZG1hX3N6ID0gQUhDSV9QT1JUX1BSSVZfRkJTX0RNQV9TWjsKKwkJcnhfZmlzX3N6ID0gQUNBUkRfQUhDSV9SWF9GSVNfU1ogKiAxNjsKKwl9IGVsc2UgeworCQlkbWFfc3ogPSBBSENJX1BPUlRfUFJJVl9ETUFfU1o7CisJCXJ4X2Zpc19zeiA9IEFDQVJEX0FIQ0lfUlhfRklTX1NaOworCX0KKworCW1lbSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBkbWFfc3osICZtZW1fZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG1lbSwgMCwgZG1hX3N6KTsKKworCS8qCisJICogRmlyc3QgaXRlbSBpbiBjaHVuayBvZiBETUEgbWVtb3J5OiAzMi1zbG90IGNvbW1hbmQgdGFibGUsCisJICogMzIgYnl0ZXMgZWFjaCBpbiBzaXplCisJICovCisJcHAtPmNtZF9zbG90ID0gbWVtOworCXBwLT5jbWRfc2xvdF9kbWEgPSBtZW1fZG1hOworCisJbWVtICs9IEFIQ0lfQ01EX1NMT1RfU1o7CisJbWVtX2RtYSArPSBBSENJX0NNRF9TTE9UX1NaOworCisJLyoKKwkgKiBTZWNvbmQgaXRlbTogUmVjZWl2ZWQtRklTIGFyZWEKKwkgKi8KKwlwcC0+cnhfZmlzID0gbWVtOworCXBwLT5yeF9maXNfZG1hID0gbWVtX2RtYTsKKworCW1lbSArPSByeF9maXNfc3o7CisJbWVtX2RtYSArPSByeF9maXNfc3o7CisKKwkvKgorCSAqIFRoaXJkIGl0ZW06IGRhdGEgYXJlYSBmb3Igc3RvcmluZyBhIHNpbmdsZSBjb21tYW5kCisJICogYW5kIGl0cyBzY2F0dGVyLWdhdGhlciB0YWJsZQorCSAqLworCXBwLT5jbWRfdGJsID0gbWVtOworCXBwLT5jbWRfdGJsX2RtYSA9IG1lbV9kbWE7CisKKwkvKgorCSAqIFNhdmUgb2ZmIGluaXRpYWwgbGlzdCBvZiBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQuCisJICogVGhpcyBjb3VsZCBiZSBjaGFuZ2VkIGxhdGVyCisJICovCisJcHAtPmludHJfbWFzayA9IERFRl9QT1JUX0lSUTsKKworCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKKworCS8qIGVuZ2FnZSBlbmdpbmVzLCBjYXB0YWluICovCisJcmV0dXJuIGFoY2lfcG9ydF9yZXN1bWUoYXApOworfQorCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJdW5zaWduZWQgaW50IGJvYXJkX2lkID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwaSA9IGFjYXJkX2FoY2lfcG9ydF9pbmZvW2JvYXJkX2lkXTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwaSwgTlVMTCB9OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdjsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CisJaW50IG5fcG9ydHMsIGksIHJjOworCisJVlBSSU5USygiRU5URVJcbiIpOworCisJV0FSTl9PTihBVEFfTUFYX1FVRVVFID4gQUhDSV9NQVhfQ01EUyk7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CisKKwkvKiBhY3F1aXJlIHJlc291cmNlcyAqLworCXJjID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogQUhDSSBjb250cm9sbGVycyBvZnRlbiBpbXBsZW1lbnQgU0ZGIGNvbXBhdGlibGUgaW50ZXJmYWNlLgorCSAqIEdyYWIgYWxsIFBDSSBCQVJzIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwlyYyA9IHBjaW1faW9tYXBfcmVnaW9uc19yZXF1ZXN0X2FsbChwZGV2LCAxIDw8IEFIQ0lfUENJX0JBUiwgRFJWX05BTUUpOworCWlmIChyYyA9PSAtRUJVU1kpCisJCXBjaW1fcGluX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWhwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOworCWlmICghaHByaXYpCisJCXJldHVybiAtRU5PTUVNOworCWhwcml2LT5mbGFncyB8PSAodW5zaWduZWQgbG9uZylwaS5wcml2YXRlX2RhdGE7CisKKwlpZiAoIShocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX01TSSkpCisJCXBjaV9lbmFibGVfbXNpKHBkZXYpOworCisJaHByaXYtPm1taW8gPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW0FIQ0lfUENJX0JBUl07CisKKwkvKiBzYXZlIGluaXRpYWwgY29uZmlnICovCisJYWhjaV9zYXZlX2luaXRpYWxfY29uZmlnKCZwZGV2LT5kZXYsIGhwcml2LCAwLCAwKTsKKworCS8qIHByZXBhcmUgaG9zdCAqLworCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfTkNRKQorCQlwaS5mbGFncyB8PSBBVEFfRkxBR19OQ1E7CisKKwlpZiAoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX1BNUCkKKwkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfUE1QOworCisJYWhjaV9zZXRfZW1fbWVzc2FnZXMoaHByaXYsICZwaSk7CisKKwkvKiBDQVAuTlAgc29tZXRpbWVzIGluZGljYXRlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBlbmFibGVkCisJICogcG9ydCwgYXQgb3RoZXIgdGltZXMsIHRoYXQgb2YgdGhlIGxhc3QgcG9zc2libGUgcG9ydCwgc28KKwkgKiBkZXRlcm1pbmluZyB0aGUgbWF4aW11bSBwb3J0IG51bWJlciByZXF1aXJlcyBsb29raW5nIGF0CisJICogYm90aCBDQVAuTlAgYW5kIHBvcnRfbWFwLgorCSAqLworCW5fcG9ydHMgPSBtYXgoYWhjaV9ucl9wb3J0cyhocHJpdi0+Y2FwKSwgZmxzKGhwcml2LT5wb3J0X21hcCkpOworCisJaG9zdCA9IGF0YV9ob3N0X2FsbG9jX3BpbmZvKCZwZGV2LT5kZXYsIHBwaSwgbl9wb3J0cyk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3N0LT5wcml2YXRlX2RhdGEgPSBocHJpdjsKKworCWlmICghKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9TU1MpIHx8IGFoY2lfaWdub3JlX3NzcykKKwkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfUEFSQUxMRUxfU0NBTjsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gImFoY2k6IFNTUyBmbGFnIHNldCwgcGFyYWxsZWwgYnVzIHNjYW4gZGlzYWJsZWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdC0+cG9ydHNbaV07CisKKwkJYXRhX3BvcnRfcGJhcl9kZXNjKGFwLCBBSENJX1BDSV9CQVIsIC0xLCAiYWJhciIpOworCQlhdGFfcG9ydF9wYmFyX2Rlc2MoYXAsIEFIQ0lfUENJX0JBUiwKKwkJCQkgICAweDEwMCArIGFwLT5wb3J0X25vICogMHg4MCwgInBvcnQiKTsKKworCQkvKiBzZXQgaW5pdGlhbCBsaW5rIHBtIHBvbGljeSAqLworCQkvKgorCQlhcC0+cG1fcG9saWN5ID0gTk9UX0FWQUlMQUJMRTsKKwkJKi8KKwkJLyogZGlzYWJsZWQvbm90LWltcGxlbWVudGVkIHBvcnQgKi8KKwkJaWYgKCEoaHByaXYtPnBvcnRfbWFwICYgKDEgPDwgaSkpKQorCQkJYXAtPm9wcyA9ICZhdGFfZHVtbXlfcG9ydF9vcHM7CisJfQorCisJLyogaW5pdGlhbGl6ZSBhZGFwdGVyICovCisJcmMgPSBhY2FyZF9haGNpX2NvbmZpZ3VyZV9kbWFfbWFza3MocGRldiwgaHByaXYtPmNhcCAmIEhPU1RfQ0FQXzY0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gYWhjaV9yZXNldF9jb250cm9sbGVyKGhvc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJYWhjaV9pbml0X2NvbnRyb2xsZXIoaG9zdCk7CisJYWNhcmRfYWhjaV9wY2lfcHJpbnRfaW5mbyhob3N0KTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXJldHVybiBhdGFfaG9zdF9hY3RpdmF0ZShob3N0LCBwZGV2LT5pcnEsIGFoY2lfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCQkgJmFjYXJkX2FoY2lfc2h0KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNhcmRfYWhjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFjYXJkX2FoY2lfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY2FyZF9haGNpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjYXJkX2FoY2lfcGNpX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDYXJkIEFIQ0kgU0FUQSBsb3ctbGV2ZWwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWNhcmRfYWhjaV9wY2lfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoYWNhcmRfYWhjaV9pbml0KTsKK21vZHVsZV9leGl0KGFjYXJkX2FoY2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmggYi9kcml2ZXJzL2F0YS9haGNpLmgKaW5kZXggMzI5Y2JiYi4uM2U2MDZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5oCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuaApAQCAtMzExLDYgKzMxMSw4IEBACiAKIGV4dGVybiBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhaGNpX29wczsKIAordm9pZCBhaGNpX2ZpbGxfY21kX3Nsb3Qoc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCwgdW5zaWduZWQgaW50IHRhZywKKwkJCXUzMiBvcHRzKTsKIHZvaWQgYWhjaV9zYXZlX2luaXRpYWxfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgZm9yY2VfcG9ydF9tYXAsCkBAIC0zMjYsNiArMzI4LDcgQEAKIHZvaWQgYWhjaV9zdGFydF9lbmdpbmUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBpbnQgYWhjaV9jaGVja19yZWFkeShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmspOwogaW50IGFoY2lfa2lja19lbmdpbmUoc3RydWN0IGF0YV9wb3J0ICphcCk7CitpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHZvaWQgYWhjaV9zZXRfZW1fbWVzc2FnZXMoc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiwKIAkJCSAgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBpKTsKIGludCBhaGNpX3Jlc2V0X2VtKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKaW5kZXggZWJjMDhkNjUuLjI2ZDQ1MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKQEAgLTg3LDEwICs4Nyw3IEBACiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MpOwogc3RhdGljIHZvaWQgYWhjaV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9wb3N0X2ludGVybmFsX2NtZChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLXN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIGFoY2lfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAotCQkJICAgICAgIHUzMiBvcHRzKTsKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpOwogI2VuZGlmCkBAIC0xMTMzLDggKzExMzAsOCBAQAogCXJldHVybiBhdGFfZGV2X2NsYXNzaWZ5KCZ0Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAotCQkJICAgICAgIHUzMiBvcHRzKQordm9pZCBhaGNpX2ZpbGxfY21kX3Nsb3Qoc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCwgdW5zaWduZWQgaW50IHRhZywKKwkJCXUzMiBvcHRzKQogewogCWRtYV9hZGRyX3QgY21kX3RibF9kbWE7CiAKQEAgLTExNDUsNiArMTE0Miw3IEBACiAJcHAtPmNtZF9zbG90W3RhZ10udGJsX2FkZHIgPSBjcHVfdG9fbGUzMihjbWRfdGJsX2RtYSAmIDB4ZmZmZmZmZmYpOwogCXBwLT5jbWRfc2xvdFt0YWddLnRibF9hZGRyX2hpID0gY3B1X3RvX2xlMzIoKGNtZF90YmxfZG1hID4+IDE2KSA+PiAxNik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX2ZpbGxfY21kX3Nsb3QpOwogCiBpbnQgYWhjaV9raWNrX2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewpAQCAtMTkxOCw3ICsxOTE2LDcgQEAKIAl3cml0ZWwocHAtPmludHJfbWFzaywgcG9ydF9tbWlvICsgUE9SVF9JUlFfTUFTSyk7CiB9CiAKLXN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoraW50IGFoY2lfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlhaGNpX3Bvd2VyX3VwKGFwKTsKIAlhaGNpX3N0YXJ0X3BvcnQoYXApOwpAQCAtMTkzMCw2ICsxOTI4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wb3J0X3Jlc3VtZSk7CiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCAwYTZhOTQzLi5hMzFmZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTIyNDAsNyArMjI0MCw3IEBACiAJCQlpZiAoaWRbQVRBX0lEX0NGQV9LRVlfTUdNVF0gJiAxKQogCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAogCQkJCQkgICAgICAgInN1cHBvcnRzIERSTSBmdW5jdGlvbnMgYW5kIG1heSAiCi0JCQkJCSAgICAgICAibm90IGJlIGZ1bGx5IGFjY2Vzc2FibGUuXG4iKTsKKwkJCQkJICAgICAgICJub3QgYmUgZnVsbHkgYWNjZXNzaWJsZS5cbiIpOwogCQkJc25wcmludGYocmV2YnVmLCA3LCAiQ0ZBIik7CiAJCX0gZWxzZSB7CiAJCQlzbnByaW50ZihyZXZidWYsIDcsICJBVEEtJWQiLCBhdGFfaWRfbWFqb3JfdmVyc2lvbihpZCkpOwpAQCAtMjI0OCw3ICsyMjQ4LDcgQEAKIAkJCWlmIChhdGFfaWRfaGFzX3RwbShpZCkpCiAJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCiAJCQkJCSAgICAgICAic3VwcG9ydHMgRFJNIGZ1bmN0aW9ucyBhbmQgbWF5ICIKLQkJCQkJICAgICAgICJub3QgYmUgZnVsbHkgYWNjZXNzYWJsZS5cbiIpOworCQkJCQkgICAgICAgIm5vdCBiZSBmdWxseSBhY2Nlc3NpYmxlLlxuIik7CiAJCX0KIAogCQlkZXYtPm5fc2VjdG9ycyA9IGF0YV9pZF9uX3NlY3RvcnMoaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggNjZhYTRiZS4uNWRlZmM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC0zNDYsMTIgKzM0NiwxMSBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9jb21tb25fc2Rldl9hdHRycyk7CiAKLXN0YXRpYyB2b2lkIGF0YV9zY3NpX2ludmFsaWRfZmllbGQoc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJCSAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQorc3RhdGljIHZvaWQgYXRhX3Njc2lfaW52YWxpZF9maWVsZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJYXRhX3Njc2lfc2V0X3NlbnNlKGNtZCwgSUxMRUdBTF9SRVFVRVNULCAweDI0LCAweDApOwogCS8qICJJbnZhbGlkIGZpZWxkIGluIGNiZCIgKi8KLQlkb25lKGNtZCk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKIH0KIAogLyoqCkBAIC03MTksNyArNzE4LDYgQEAKICAqCWF0YV9zY3NpX3FjX25ldyAtIGFjcXVpcmUgbmV3IGF0YV9xdWV1ZWRfY21kIHJlZmVyZW5jZQogICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgbmV3IGNvbW1hbmQgaXMgYXR0YWNoZWQKICAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0aGF0IG9yaWdpbmF0ZWQgdGhpcyBBVEEgY29tbWFuZAotICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1bmN0aW9uCiAgKgogICoJT2J0YWluIGEgcmVmZXJlbmNlIHRvIGFuIHVudXNlZCBhdGFfcXVldWVkX2NtZCBzdHJ1Y3R1cmUsCiAgKgl3aGljaCBpcyB0aGUgYmFzaWMgbGliYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSBzaW5nbGUKQEAgLTczNiwyMSArNzM0LDIwIEBACiAgKglDb21tYW5kIGFsbG9jYXRlZCwgb3IgJU5VTEwgaWYgbm9uZSBhdmFpbGFibGUuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9zY3NpX3FjX25ldyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQorCQkJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAogCXFjID0gYXRhX3FjX25ld19pbml0KGRldik7CiAJaWYgKHFjKSB7CiAJCXFjLT5zY3NpY21kID0gY21kOwotCQlxYy0+c2NzaWRvbmUgPSBkb25lOworCQlxYy0+c2NzaWRvbmUgPSBjbWQtPnNjc2lfZG9uZTsKIAogCQlxYy0+c2cgPSBzY3NpX3NnbGlzdChjbWQpOwogCQlxYy0+bl9lbGVtID0gc2NzaV9zZ19jb3VudChjbWQpOwogCX0gZWxzZSB7CiAJCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCAoUVVFVUVfRlVMTCA8PCAxKTsKLQkJZG9uZShjbWQpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOwogCX0KIAogCXJldHVybiBxYzsKQEAgLTE3MzUsNyArMTczMiw2IEBACiAgKglhdGFfc2NzaV90cmFuc2xhdGUgLSBUcmFuc2xhdGUgdGhlbiBpc3N1ZSBTQ1NJIGNvbW1hbmQgdG8gQVRBIGRldmljZQogICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBhZGRyZXNzZWQKICAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBleGVjdXRlCi0gKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KICAqCUB4bGF0X2Z1bmM6IEFjdG9yIHdoaWNoIHRyYW5zbGF0ZXMgQGNtZCB0byBhbiBBVEEgdGFza2ZpbGUKICAqCiAgKglPdXIgLT5xdWV1ZWNvbW1hbmQoKSBmdW5jdGlvbiBoYXMgZGVjaWRlZCB0aGF0IHRoZSBTQ1NJCkBAIC0xNzU5LDcgKzE3NTUsNiBAQAogICoJbmVlZHMgdG8gYmUgZGVmZXJyZWQuCiAgKi8KIHN0YXRpYyBpbnQgYXRhX3Njc2lfdHJhbnNsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAogCQkJICAgICAgYXRhX3hsYXRfZnVuY190IHhsYXRfZnVuYykKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5saW5rLT5hcDsKQEAgLTE3NjgsNyArMTc2Myw3IEBACiAKIAlWUFJJTlRLKCJFTlRFUlxuIik7CiAKLQlxYyA9IGF0YV9zY3NpX3FjX25ldyhkZXYsIGNtZCwgZG9uZSk7CisJcWMgPSBhdGFfc2NzaV9xY19uZXcoZGV2LCBjbWQpOwogCWlmICghcWMpCiAJCWdvdG8gZXJyX21lbTsKIApAQCAtMTgwNCwxNCArMTc5OSwxNCBAQAogCiBlYXJseV9maW5pc2g6CiAJYXRhX3FjX2ZyZWUocWMpOwotCXFjLT5zY3NpZG9uZShjbWQpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJRFBSSU5USygiRVhJVCAtIGVhcmx5IGZpbmlzaCAoZ29vZCBvciBlcnJvcilcbiIpOwogCXJldHVybiAwOwogCiBlcnJfZGlkOgogCWF0YV9xY19mcmVlKHFjKTsKIAljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwotCXFjLT5zY3NpZG9uZShjbWQpOworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiBlcnJfbWVtOgogCURQUklOVEsoIkVYSVQgLSBpbnRlcm5hbFxuIik7CiAJcmV0dXJuIDA7CkBAIC0zMTE2LDcgKzMxMTEsNiBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2F0YV9zY3NpX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsCi0JCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCiAJCQkJICAgICAgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKIAl1OCBzY3NpX29wID0gc2NtZC0+Y21uZFswXTsKQEAgLTMxNTAsOSArMzE0NCw5IEBACiAJfQogCiAJaWYgKHhsYXRfZnVuYykKLQkJcmMgPSBhdGFfc2NzaV90cmFuc2xhdGUoZGV2LCBzY21kLCBkb25lLCB4bGF0X2Z1bmMpOworCQlyYyA9IGF0YV9zY3NpX3RyYW5zbGF0ZShkZXYsIHNjbWQsIHhsYXRfZnVuYyk7CiAJZWxzZQotCQlhdGFfc2NzaV9zaW11bGF0ZShkZXYsIHNjbWQsIGRvbmUpOworCQlhdGFfc2NzaV9zaW11bGF0ZShkZXYsIHNjbWQpOwogCiAJcmV0dXJuIHJjOwogCkBAIC0zMTYwLDcgKzMxNTQsNyBAQAogCURQUklOVEsoImJhZCBDREIgbGVuPSV1LCBzY3NpX29wPTB4JTAyeCwgbWF4PSV1XG4iLAogCQlzY21kLT5jbWRfbGVuLCBzY3NpX29wLCBkZXYtPmNkYl9sZW4pOwogCXNjbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKLQlkb25lKHNjbWQpOworCXNjbWQtPnNjc2lfZG9uZShzY21kKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzE5OSw3ICszMTkzLDcgQEAKIAogCWRldiA9IGF0YV9zY3NpX2ZpbmRfZGV2KGFwLCBzY3NpZGV2KTsKIAlpZiAobGlrZWx5KGRldikpCi0JCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGNtZC0+c2NzaV9kb25lLCBkZXYpOworCQlyYyA9IF9fYXRhX3Njc2lfcXVldWVjbWQoY21kLCBkZXYpOwogCWVsc2UgewogCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7CiAJCWNtZC0+c2NzaV9kb25lKGNtZCk7CkBAIC0zMjE0LDcgKzMyMDgsNiBAQAogICoJYXRhX3Njc2lfc2ltdWxhdGUgLSBzaW11bGF0ZSBTQ1NJIGNvbW1hbmQgb24gQVRBIGRldmljZQogICoJQGRldjogdGhlIHRhcmdldCBkZXZpY2UKICAqCUBjbWQ6IFNDU0kgY29tbWFuZCBiZWluZyBzZW50IHRvIGRldmljZS4KLSAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbi4KICAqCiAgKglJbnRlcnByZXRzIGFuZCBkaXJlY3RseSBleGVjdXRlcyBhIHNlbGVjdCBsaXN0IG9mIFNDU0kgY29tbWFuZHMKICAqCXRoYXQgY2FuIGJlIGhhbmRsZWQgaW50ZXJuYWxseS4KQEAgLTMyMjMsOCArMzIxNiw3IEBACiAgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0IGxvY2spCiAgKi8KIAotdm9pZCBhdGFfc2NzaV9zaW11bGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQordm9pZCBhdGFfc2NzaV9zaW11bGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJc3RydWN0IGF0YV9zY3NpX2FyZ3MgYXJnczsKIAljb25zdCB1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKQEAgLTMyMzMsMTcgKzMyMjUsMTcgQEAKIAlhcmdzLmRldiA9IGRldjsKIAlhcmdzLmlkID0gZGV2LT5pZDsKIAlhcmdzLmNtZCA9IGNtZDsKLQlhcmdzLmRvbmUgPSBkb25lOworCWFyZ3MuZG9uZSA9IGNtZC0+c2NzaV9kb25lOwogCiAJc3dpdGNoKHNjc2ljbWRbMF0pIHsKIAkvKiBUT0RPOiB3b3J0aCBpbXByb3Zpbmc/ICovCiAJY2FzZSBGT1JNQVRfVU5JVDoKLQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBJTlFVSVJZOgogCQlpZiAoc2NzaWNtZFsxXSAmIDIpCSAgICAgICAgICAgLyogaXMgQ21kRHQgc2V0PyAgKi8KLQkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJZWxzZSBpZiAoKHNjc2ljbWRbMV0gJiAxKSA9PSAwKSAgICAvKiBpcyBFVlBEIGNsZWFyPyAqLwogCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX2lucV9zdGQpOwogCQllbHNlIHN3aXRjaCAoc2NzaWNtZFsyXSkgewpAQCAtMzI2OSw3ICszMjYxLDcgQEAKIAkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9pbnFfYjIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTMyODEsNyArMzI3Myw3IEBACiAKIAljYXNlIE1PREVfU0VMRUNUOgkvKiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuICovCiAJY2FzZSBNT0RFX1NFTEVDVF8xMDoJLyogYmFkLWZpZWxkLWluLWNkYiAqLwotCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFQURfQ0FQQUNJVFk6CkBAIC0zMjkyLDcgKzMyODQsNyBAQAogCQlpZiAoKHNjc2ljbWRbMV0gJiAweDFmKSA9PSBTQUlfUkVBRF9DQVBBQ0lUWV8xNikKIAkJCWF0YV9zY3NpX3JidWZfZmlsbCgmYXJncywgYXRhX3Njc2lvcF9yZWFkX2NhcCk7CiAJCWVsc2UKLQkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFUE9SVF9MVU5TOgpAQCAtMzMwMiw3ICszMjk0LDcgQEAKIAljYXNlIFJFUVVFU1RfU0VOU0U6CiAJCWF0YV9zY3NpX3NldF9zZW5zZShjbWQsIDAsIDAsIDApOwogCQljbWQtPnJlc3VsdCA9IChEUklWRVJfU0VOU0UgPDwgMjQpOwotCQlkb25lKGNtZCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJCWJyZWFrOwogCiAJLyogaWYgd2UgcmVhY2ggdGhpcywgdGhlbiB3cml0ZWJhY2sgY2FjaGluZyBpcyBkaXNhYmxlZCwKQEAgLTMzMjQsMTQgKzMzMTYsMTQgQEAKIAkJaWYgKCh0bXA4ID09IDB4NCkgJiYgKCFzY3NpY21kWzNdKSAmJiAoIXNjc2ljbWRbNF0pKQogCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX25vb3ApOwogCQllbHNlCi0JCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCk7CiAJCWJyZWFrOwogCiAJLyogYWxsIG90aGVyIGNvbW1hbmRzICovCiAJZGVmYXVsdDoKIAkJYXRhX3Njc2lfc2V0X3NlbnNlKGNtZCwgSUxMRUdBTF9SRVFVRVNULCAweDIwLCAweDApOwogCQkvKiAiSW52YWxpZCBjb21tYW5kIG9wZXJhdGlvbiBjb2RlIiAqLwotCQlkb25lKGNtZCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM4NTgsNyArMzg1MCw2IEBACiAvKioKICAqCWF0YV9zYXNfcXVldWVjbWQgLSBJc3N1ZSBTQ1NJIGNkYiB0byBsaWJhdGEtbWFuYWdlZCBkZXZpY2UKICAqCUBjbWQ6IFNDU0kgY29tbWFuZCB0byBiZSBzZW50Ci0gKglAZG9uZTogQ29tcGxldGlvbiBmdW5jdGlvbiwgY2FsbGVkIHdoZW4gY29tbWFuZCBpcyBjb21wbGV0ZQogICoJQGFwOglBVEEgcG9ydCB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBiZWluZyBzZW50CiAgKgogICoJUkVUVVJOUzoKQEAgLTM4NjYsMTggKzM4NTcsMTcgQEAKICAqCTAgb3RoZXJ3aXNlLgogICovCiAKLWludCBhdGFfc2FzX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCi0JCSAgICAgc3RydWN0IGF0YV9wb3J0ICphcCkKK2ludCBhdGFfc2FzX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlpbnQgcmMgPSAwOwogCiAJYXRhX3Njc2lfZHVtcF9jZGIoYXAsIGNtZCk7CiAKIAlpZiAobGlrZWx5KGF0YV9kZXZfZW5hYmxlZChhcC0+bGluay5kZXZpY2UpKSkKLQkJcmMgPSBfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgZG9uZSwgYXAtPmxpbmsuZGV2aWNlKTsKKwkJcmMgPSBfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgYXAtPmxpbmsuZGV2aWNlKTsKIAllbHNlIHsKIAkJY21kLT5yZXN1bHQgPSAoRElEX0JBRF9UQVJHRVQgPDwgMTYpOwotCQlkb25lKGNtZCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJfQogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCmluZGV4IDc2ODg4NjguLmQ3ZTU3ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM2NiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi44IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjkiCiAKIHN0cnVjdCBocHRfY2xvY2sgewogCXU4CXhmZXJfbW9kZTsKQEAgLTExMCwxOCArMTEwLDIzIEBACiAJewkwLAkJMHgwMTIwODU4NQl9CiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTMzW10gPSB7Ci0JIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwgIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKLQkiTWF4dG9yIDkxMzYwRDgiLCAiTWF4dG9yIDkxMTkwRDciLCAiTWF4dG9yIDkxMDIwRDYiLCAiTWF4dG9yIDkwODQ1RDUiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNTEwRDMiLCAiTWF4dG9yIDkwMzQwRDIiLAotCSJNYXh0b3IgOTExNTJEOCIsICJNYXh0b3IgOTEwMDhENyIsICJNYXh0b3IgOTA4NDVENiIsICJNYXh0b3IgOTA4NDBENiIsICJNYXh0b3IgOTA3MjBENSIsICJNYXh0b3IgOTA2NDhENSIsICJNYXh0b3IgOTA1NzZENCIsCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGEzM1tdID0geworCSJNYXh0b3IgOTI3MjBVOCIsICJNYXh0b3IgOTIwNDBVNiIsICJNYXh0b3IgOTEzNjBVNCIsICJNYXh0b3IgOTEwMjBVMyIsCisJIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKKwkiTWF4dG9yIDkxMzYwRDgiLCAiTWF4dG9yIDkxMTkwRDciLCAiTWF4dG9yIDkxMDIwRDYiLCAiTWF4dG9yIDkwODQ1RDUiLAorCSJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA1MTBEMyIsICJNYXh0b3IgOTAzNDBEMiIsCisJIk1heHRvciA5MTE1MkQ4IiwgIk1heHRvciA5MTAwOEQ3IiwgIk1heHRvciA5MDg0NUQ2IiwgIk1heHRvciA5MDg0MEQ2IiwKKwkiTWF4dG9yIDkwNzIwRDUiLCAiTWF4dG9yIDkwNjQ4RDUiLCAiTWF4dG9yIDkwNTc2RDQiLAogCSJNYXh0b3IgOTA1MTBENCIsCiAJIk1heHRvciA5MDQzMkQzIiwgIk1heHRvciA5MDI4OEQyIiwgIk1heHRvciA5MDI1NkQyIiwKLQkiTWF4dG9yIDkxMDAwRDgiLCAiTWF4dG9yIDkwOTEwRDgiLCAiTWF4dG9yIDkwODc1RDciLCAiTWF4dG9yIDkwODQwRDciLCAiTWF4dG9yIDkwNzUwRDYiLCAiTWF4dG9yIDkwNjI1RDUiLCAiTWF4dG9yIDkwNTAwRDQiLAotCSJNYXh0b3IgOTE3MjhEOCIsICJNYXh0b3IgOTE1MTJENyIsICJNYXh0b3IgOTEzMDNENiIsICJNYXh0b3IgOTEwODBENSIsICJNYXh0b3IgOTA4NDVENCIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA2NDhEMyIsICJNYXh0b3IgOTA0MzJEMiIsCisJIk1heHRvciA5MTAwMEQ4IiwgIk1heHRvciA5MDkxMEQ4IiwgIk1heHRvciA5MDg3NUQ3IiwgIk1heHRvciA5MDg0MEQ3IiwKKwkiTWF4dG9yIDkwNzUwRDYiLCAiTWF4dG9yIDkwNjI1RDUiLCAiTWF4dG9yIDkwNTAwRDQiLAorCSJNYXh0b3IgOTE3MjhEOCIsICJNYXh0b3IgOTE1MTJENyIsICJNYXh0b3IgOTEzMDNENiIsICJNYXh0b3IgOTEwODBENSIsCisJIk1heHRvciA5MDg0NUQ0IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDY0OEQzIiwgIk1heHRvciA5MDQzMkQyIiwKIAlOVUxMCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTY2XzRbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTY2XzRbXSA9IHsKIAkiSUJNLURUTEEtMzA3MDc1IiwKIAkiSUJNLURUTEEtMzA3MDYwIiwKIAkiSUJNLURUTEEtMzA3MDQ1IiwKQEAgLTE0MCwxMiArMTQ1LDEzIEBACiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGE2Nl8zW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGE2Nl8zW10gPSB7CiAJIldEQyBBQzMxMDIwMFIiLAogCU5VTEwKIH07CiAKLXN0YXRpYyBpbnQgaHB0X2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjaGFyICptb2Rlc3RyLCBjb25zdCBjaGFyICpsaXN0W10pCitzdGF0aWMgaW50IGhwdF9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgY2hhciAqbW9kZXN0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICogY29uc3QgbGlzdFtdKQogewogCXVuc2lnbmVkIGNoYXIgbW9kZWxfbnVtW0FUQV9JRF9QUk9EX0xFTiArIDFdOwogCWludCBpID0gMDsKQEAgLTI4OCw2ICsyOTQsNyBAQAogc3RhdGljIHZvaWQgaHB0MzZ4X2luaXRfY2hpcHNldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXU4IGRyaXZlX2Zhc3Q7CisKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAoTDFfQ0FDSEVfQllURVMgLyA0KSk7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4NzgpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NSU5fR05ULCAweDA4KTsKQEAgLTM0OSwxNiArMzU2LDE2IEBACiAKIAkvKiBQQ0kgY2xvY2tpbmcgZGV0ZXJtaW5lcyB0aGUgQVRBIHRpbWluZyB2YWx1ZXMgdG8gdXNlICovCiAJLyogaW5mb19ocHQzNjYgaXMgc2FmZSBhZ2FpbnN0IHJlLWVudHJ5IHNvIHdlIGNhbiBzY3JpYmJsZSBvbiBpdCAqLwotCXN3aXRjaCgocmVnMSAmIDB4NzAwKSA+PiA4KSB7Ci0JCWNhc2UgOToKLQkJCWhwcml2ID0gJmhwdDM2Nl80MDsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlocHJpdiA9ICZocHQzNjZfMjU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWhwcml2ID0gJmhwdDM2Nl8zMzsKLQkJCWJyZWFrOworCXN3aXRjaCAoKHJlZzEgJiAweDcwMCkgPj4gOCkgeworCWNhc2UgOToKKwkJaHByaXYgPSAmaHB0MzY2XzQwOworCQlicmVhazsKKwljYXNlIDU6CisJCWhwcml2ID0gJmhwdDM2Nl8yNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaHByaXYgPSAmaHB0MzY2XzMzOworCQlicmVhazsKIAl9CiAJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KIAlyZXR1cm4gYXRhX3BjaV9ibWRtYV9pbml0X29uZShkZXYsIHBwaSwgJmhwdDM2eF9zaHQsIGhwcml2LCAwKTsKQEAgLTM4NSw5ICszOTIsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhwdDM2eF9wY2lfZHJpdmVyID0gewotCS5uYW1lIAkJPSBEUlZfTkFNRSwKKwkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBocHQzNngsCi0JLnByb2JlIAkJPSBocHQzNnhfaW5pdF9vbmUsCisJLnByb2JlCQk9IGhwdDM2eF9pbml0X29uZSwKIAkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwppbmRleCA5YWU0YzA4Li5lZmRkMThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKQEAgLTgsNyArOCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMwkJQW5kcmUgSGVkcmljayA8YW5kcmVAbGludXgtaWRlLm9yZz4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMQkgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwMwkJUmVkIEhhdCBJbmMKLSAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNS0yMDA5CU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNS0yMDEwCU1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKiBUT0RPCiAgKglMb29rIGludG8gZW5naW5lIHJlc2V0IG9uIHRpbWVvdXQgZXJyb3JzLiBTaG91bGQgbm90IGJlCXJlcXVpcmVkLgpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2hwdDM3eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi4xNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNi4xOCIKIAogc3RydWN0IGhwdF9jbG9jayB7CiAJdTgJeGZlcl9zcGVlZDsKQEAgLTIxMCw3ICsyMTAsNyBAQAogewogCXN0cnVjdCBocHRfY2xvY2sgKmNsb2NrcyA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAKLQl3aGlsZShjbG9ja3MtPnhmZXJfc3BlZWQpIHsKKwl3aGlsZSAoY2xvY2tzLT54ZmVyX3NwZWVkKSB7CiAJCWlmIChjbG9ja3MtPnhmZXJfc3BlZWQgPT0gc3BlZWQpCiAJCQlyZXR1cm4gY2xvY2tzLT50aW1pbmc7CiAJCWNsb2NrcysrOwpAQCAtMjE5LDcgKzIxOSw4IEBACiAJcmV0dXJuIDB4ZmZmZmZmZmZVOwkvKiBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KIH0KIAotc3RhdGljIGludCBocHRfZG1hX2JsYWNrbGlzdGVkKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGNoYXIgKm1vZGVzdHIsIGNvbnN0IGNoYXIgKmxpc3RbXSkKK3N0YXRpYyBpbnQgaHB0X2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjaGFyICptb2Rlc3RyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBsaXN0W10pCiB7CiAJdW5zaWduZWQgY2hhciBtb2RlbF9udW1bQVRBX0lEX1BST0RfTEVOICsgMV07CiAJaW50IGkgPSAwOwpAQCAtMjM3LDE4ICsyMzgsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGEzM1tdID0gewotCSJNYXh0b3IgOTI3MjBVOCIsICJNYXh0b3IgOTIwNDBVNiIsICJNYXh0b3IgOTEzNjBVNCIsICJNYXh0b3IgOTEwMjBVMyIsICJNYXh0b3IgOTA4NDVVMyIsICJNYXh0b3IgOTA2NTBVMiIsCi0JIk1heHRvciA5MTM2MEQ4IiwgIk1heHRvciA5MTE5MEQ3IiwgIk1heHRvciA5MTAyMEQ2IiwgIk1heHRvciA5MDg0NUQ1IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDUxMEQzIiwgIk1heHRvciA5MDM0MEQyIiwKLQkiTWF4dG9yIDkxMTUyRDgiLCAiTWF4dG9yIDkxMDA4RDciLCAiTWF4dG9yIDkwODQ1RDYiLCAiTWF4dG9yIDkwODQwRDYiLCAiTWF4dG9yIDkwNzIwRDUiLCAiTWF4dG9yIDkwNjQ4RDUiLCAiTWF4dG9yIDkwNTc2RDQiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYWRfYXRhMzNbXSA9IHsKKwkiTWF4dG9yIDkyNzIwVTgiLCAiTWF4dG9yIDkyMDQwVTYiLCAiTWF4dG9yIDkxMzYwVTQiLCAiTWF4dG9yIDkxMDIwVTMiLAorCSJNYXh0b3IgOTA4NDVVMyIsICJNYXh0b3IgOTA2NTBVMiIsCisJIk1heHRvciA5MTM2MEQ4IiwgIk1heHRvciA5MTE5MEQ3IiwgIk1heHRvciA5MTAyMEQ2IiwgIk1heHRvciA5MDg0NUQ1IiwKKwkiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNTEwRDMiLCAiTWF4dG9yIDkwMzQwRDIiLAorCSJNYXh0b3IgOTExNTJEOCIsICJNYXh0b3IgOTEwMDhENyIsICJNYXh0b3IgOTA4NDVENiIsICJNYXh0b3IgOTA4NDBENiIsCisJIk1heHRvciA5MDcyMEQ1IiwgIk1heHRvciA5MDY0OEQ1IiwgIk1heHRvciA5MDU3NkQ0IiwKIAkiTWF4dG9yIDkwNTEwRDQiLAogCSJNYXh0b3IgOTA0MzJEMyIsICJNYXh0b3IgOTAyODhEMiIsICJNYXh0b3IgOTAyNTZEMiIsCi0JIk1heHRvciA5MTAwMEQ4IiwgIk1heHRvciA5MDkxMEQ4IiwgIk1heHRvciA5MDg3NUQ3IiwgIk1heHRvciA5MDg0MEQ3IiwgIk1heHRvciA5MDc1MEQ2IiwgIk1heHRvciA5MDYyNUQ1IiwgIk1heHRvciA5MDUwMEQ0IiwKLQkiTWF4dG9yIDkxNzI4RDgiLCAiTWF4dG9yIDkxNTEyRDciLCAiTWF4dG9yIDkxMzAzRDYiLCAiTWF4dG9yIDkxMDgwRDUiLCAiTWF4dG9yIDkwODQ1RDQiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNjQ4RDMiLCAiTWF4dG9yIDkwNDMyRDIiLAorCSJNYXh0b3IgOTEwMDBEOCIsICJNYXh0b3IgOTA5MTBEOCIsICJNYXh0b3IgOTA4NzVENyIsICJNYXh0b3IgOTA4NDBENyIsCisJIk1heHRvciA5MDc1MEQ2IiwgIk1heHRvciA5MDYyNUQ1IiwgIk1heHRvciA5MDUwMEQ0IiwKKwkiTWF4dG9yIDkxNzI4RDgiLCAiTWF4dG9yIDkxNTEyRDciLCAiTWF4dG9yIDkxMzAzRDYiLCAiTWF4dG9yIDkxMDgwRDUiLAorCSJNYXh0b3IgOTA4NDVENCIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA2NDhEMyIsICJNYXh0b3IgOTA0MzJEMiIsCiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmJhZF9hdGExMDBfNVtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYWRfYXRhMTAwXzVbXSA9IHsKIAkiSUJNLURUTEEtMzA3MDc1IiwKIAkiSUJNLURUTEEtMzA3MDYwIiwKIAkiSUJNLURUTEEtMzA3MDQ1IiwKQEAgLTMwMiw2ICszMDgsMjIgQEAKIH0KIAogLyoqCisgKglocHQzNzJfZmlsdGVyCS0JbW9kZSBzZWxlY3Rpb24gZmlsdGVyCisgKglAYWRldjogQVRBIGRldmljZQorICoJQG1hc2s6IG1vZGUgbWFzaworICoKKyAqCVRoZSBNYXJ2ZWxsIGJyaWRnZSBjaGlwcyB1c2VkIG9uIHRoZSBIaWdoUG9pbnQgU0FUQSBjYXJkcyBkbyBub3Qgc2VlbQorICoJdG8gc3VwcG9ydCB0aGUgVWx0cmFETUEgbW9kZXMgMSwgMiwgYW5kIDMgYXMgd2VsbCBhcyBhbnkgTVdETUEgbW9kZXMuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHB0MzcyX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWlmIChhdGFfaWRfaXNfc2F0YShhZGV2LT5pZCkpCisJCW1hc2sgJj0gfigoMHhFIDw8IEFUQV9TSElGVF9VRE1BKSB8IEFUQV9NQVNLX01XRE1BKTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKICAqCWhwdDM3eF9jYWJsZV9kZXRlY3QJLQlEZXRlY3QgdGhlIGNhYmxlIHR5cGUKICAqCUBhcDogQVRBIHBvcnQgdG8gZGV0ZWN0IG9uCiAgKgpAQCAtMzczLDYgKzM5NSw3IEBACiAJCXsgMHg1MCwgMSwgMHgwNCwgMHgwNCB9LAogCQl7IDB4NTQsIDEsIDB4MDQsIDB4MDQgfQogCX07CisKIAlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZocHQzN3hfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTU4NiwxMSArNjA5LDExIEBACiB9OwogCiAvKgotICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzcyLCBIUFQzNzEsIEhQVDMwMi4gU2xpZ2h0bHkgZGlmZmVyZW50IFBJTwotICoJYW5kIERNQSBtb2RlIHNldHRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3MSBhbmQgSFBUMzAyLiBTbGlnaHRseSBkaWZmZXJlbnQgUElPIGFuZCBETUEKKyAqCW1vZGUgc2V0dGluZyBmdW5jdGlvbmFsaXR5LgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzNzJfcG9ydF9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0MzAyX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCiAKIAkuYm1kbWFfc3RvcAk9IGhwdDM3eF9ibWRtYV9zdG9wLApAQCAtNjAyLDcgKzYyNSwxNyBAQAogfTsKIAogLyoKLSAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3NC4gTW9kZSBzZXR0aW5nIHdvcmtzIGxpa2UgMzcyIGFuZCBmcmllbmRzCisgKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzIuIE1vZGUgc2V0dGluZyB3b3JrcyBsaWtlIDM3MSBhbmQgMzAyCisgKglidXQgd2UgaGF2ZSBhIG1vZGUgZmlsdGVyLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzNzJfcG9ydF9vcHMgPSB7CisJLmluaGVyaXRzCT0gJmhwdDMwMl9wb3J0X29wcywKKwkubW9kZV9maWx0ZXIJPSBocHQzNzJfZmlsdGVyLAorfTsKKworLyoKKyAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3NC4gTW9kZSBzZXR0aW5nIGFuZCBmaWx0ZXJpbmcgd29ya3MgbGlrZSAzNzIKICAqCWJ1dCB3ZSBoYXZlIGEgZGlmZmVyZW50IGNhYmxlIGRldGVjdGlvbiBwcm9jZWR1cmUgZm9yIGZ1bmN0aW9uIDEuCiAgKi8KIApAQCAtNjQ3LDEyICs2ODAsMTIgQEAKIAl1MzIgcmVnNWM7CiAJaW50IHRyaWVzOwogCi0JZm9yKHRyaWVzID0gMDsgdHJpZXMgPCAweDUwMDA7IHRyaWVzKyspIHsKKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAweDUwMDA7IHRyaWVzKyspIHsKIAkJdWRlbGF5KDUwKTsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDViLCAmcmVnNWIpOwogCQlpZiAocmVnNWIgJiAweDgwKSB7CiAJCQkvKiBTZWUgaWYgaXQgc3RheXMgc2V0ICovCi0JCQlmb3IodHJpZXMgPSAwOyB0cmllcyA8IDB4MTAwMDsgdHJpZXMgKyspIHsKKwkJCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDB4MTAwMDsgdHJpZXMrKykgewogCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgJnJlZzViKTsKIAkJCQkvKiBGYWlsZWQgPyAqLwogCQkJCWlmICgocmVnNWIgJiAweDgwKSA9PSAwKQpAQCAtNjYwLDcgKzY5Myw3IEBACiAJCQl9CiAJCQkvKiBUdXJuIG9mZiB0dW5pbmcsIHdlIGhhdmUgdGhlIERQTEwgc2V0ICovCiAJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAmcmVnNWMpOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIHJlZzVjICYgfiAweDEwMCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgcmVnNWMgJiB+MHgxMDApOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CkBAIC02NzIsNiArNzA1LDcgQEAKIHsKIAl1MzIgZnJlcTsKIAl1bnNpZ25lZCBsb25nIGlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7CisKIAlpZiAoUENJX0ZVTkMocGRldi0+ZGV2Zm4pICYgMSkgewogCQlzdHJ1Y3QgcGNpX2RldiAqcGRldl8wOwogCkBAIC03MzcsMjMgKzc3MSwyMyBAQAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAogCQkucG9ydF9vcHMgPSAmaHB0MzcwYV9wb3J0X29wcwogCX07Ci0JLyogSFBUMzcwIC0gVURNQTEwMCAqLworCS8qIEhQVDM3MCAtIFVETUE2NiAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MF8zMyA9IHsKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrID0gQVRBX1BJTzQsCiAJCS5td2RtYV9tYXNrID0gQVRBX01XRE1BMiwKLQkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNSwKKwkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNCwKIAkJLnBvcnRfb3BzID0gJmhwdDM3MF9wb3J0X29wcwogCX07Ci0JLyogSFBUMzcwQSAtIFVETUExMDAgKi8KKwkvKiBIUFQzNzBBIC0gVURNQTY2ICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcwYV8zMyA9IHsKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrID0gQVRBX1BJTzQsCiAJCS5td2RtYV9tYXNrID0gQVRBX01XRE1BMiwKLQkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNSwKKwkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNCwKIAkJLnBvcnRfb3BzID0gJmhwdDM3MGFfcG9ydF9vcHMKIAl9OwotCS8qIEhQVDM3MSwgMzcyIGFuZCBmcmllbmRzIC0gVURNQTEzMyAqLworCS8qIEhQVDM3MiAtIFVETUExMzMgKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzIgPSB7CiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzayA9IEFUQV9QSU80LApAQCAtNzYxLDYgKzc5NSwxNCBAQAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMgPSAmaHB0MzcyX3BvcnRfb3BzCiAJfTsKKwkvKiBIUFQzNzEsIDMwMiAtIFVETUExMzMgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzMDIgPSB7CisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5waW9fbWFzayA9IEFUQV9QSU80LAorCQkubXdkbWFfbWFzayA9IEFUQV9NV0RNQTIsCisJCS51ZG1hX21hc2sgPSBBVEFfVURNQTYsCisJCS5wb3J0X29wcyA9ICZocHQzMDJfcG9ydF9vcHMKKwl9OwogCS8qIEhQVDM3NCAtIFVETUExMDAsIGZ1bmN0aW9uIDEgdXNlcyBkaWZmZXJlbnQgcHJlcmVzZXQgbWV0aG9kICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0Mzc0X2ZuMCA9IHsKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKQEAgLTgwNSw2NCArODQ3LDY4IEBACiAJCWlmIChyZXYgPT0gNikKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCXN3aXRjaChyZXYpIHsKLQkJCWNhc2UgMzoKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzA7Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzA7Ci0JCQkJcHJlZmVyX2RwbGwgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MGE7Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzBhOwotCQkJCXByZWZlcl9kcGxsID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNToKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUiAicGF0YV9ocHQzN3g6IFVua25vd24gSFBUMzY2ICIKLQkJCQkgICAgICAgInN1YnR5cGUsIHBsZWFzZSByZXBvcnQgKCVkKS5cbiIsIHJldik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7CisJCXN3aXRjaCAocmV2KSB7CisJCWNhc2UgMzoKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MDsKKwkJCWNoaXBfdGFibGUgPSAmaHB0MzcwOworCQkJcHJlZmVyX2RwbGwgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MGE7CisJCQljaGlwX3RhYmxlID0gJmhwdDM3MGE7CisJCQlwcmVmZXJfZHBsbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOworCQkJY2hpcF90YWJsZSA9ICZocHQzNzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAicGF0YV9ocHQzN3g6IFVua25vd24gSFBUMzY2IHN1YnR5cGUsICIKKwkJCSAgICAgICAicGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwgcmV2KTsKKwkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfSBlbHNlIHsKLQkJc3dpdGNoKGRldi0+ZGV2aWNlKSB7Ci0JCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjoKLQkJCQkvKiAzNzJOIGlmIHJldiA+PSAyKi8KLQkJCQlpZiAocmV2ID49IDIpCi0JCQkJCXJldHVybiAtRU5PREVWOwotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3MmE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDMwMjoKLQkJCQkvKiAzMDJOIGlmIHJldiA+IDEgKi8KLQkJCQlpZiAocmV2ID4gMSkKLQkJCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOwotCQkJCS8qIENoZWNrIHRoaXMgKi8KLQkJCQljaGlwX3RhYmxlID0gJmhwdDMwMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOgotCQkJCWlmIChyZXYgPiAxKQotCQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzE7Ci0JCQkJLyogU2luZ2xlIGNoYW5uZWwgZGV2aWNlLCBtYXN0ZXIgaXMgbm90IHByZXNlbnQKLQkJCQkgICBidXQgdGhlIEJJT1MgKG9yIHVzIGZvciBub24geDg2KSBtdXN0IG1hcmsgaXQKLQkJCQkgICBhYnNlbnQgKi8KLQkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTAsICZtY3IxKTsKLQkJCQltY3IxICY9IH4weDA0OwotCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIG1jcjEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzQ6Ci0JCQkJY2hpcF90YWJsZSA9ICZocHQzNzQ7Ci0JCQkJaWYgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkKLQkJCQkJKnBwaSA9ICZpbmZvX2hwdDM3NF9mbjA7Ci0JCQkJZWxzZQotCQkJCQkqcHBpID0gJmluZm9faHB0Mzc0X2ZuMTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJwYXRhX2hwdDM3eDogUENJIHRhYmxlIGlzIGJvZ3VzIHBsZWFzZSByZXBvcnQgKCVkKS5cbiIsIGRldi0+ZGV2aWNlKTsKKwkJc3dpdGNoIChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjoKKwkJCS8qIDM3Mk4gaWYgcmV2ID49IDIgKi8KKwkJCWlmIChyZXYgPj0gMikKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKKwkJCWNoaXBfdGFibGUgPSAmaHB0MzcyYTsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDMwMjoKKwkJCS8qIDMwMk4gaWYgcmV2ID4gMSAqLworCQkJaWYgKHJldiA+IDEpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzMDI7CisJCQkvKiBDaGVjayB0aGlzICovCisJCQljaGlwX3RhYmxlID0gJmhwdDMwMjsKKwkJCWJyZWFrOworCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MToKKwkJCWlmIChyZXYgPiAxKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJcHBpWzBdID0gJmluZm9faHB0MzAyOworCQkJY2hpcF90YWJsZSA9ICZocHQzNzE7CisJCQkvKgorCQkJICogU2luZ2xlIGNoYW5uZWwgZGV2aWNlLCBtYXN0ZXIgaXMgbm90IHByZXNlbnQKKwkJCSAqIGJ1dCB0aGUgQklPUyAob3IgdXMgZm9yIG5vbiB4ODYpIG11c3QgbWFyayBpdAorCQkJICogYWJzZW50CisJCQkgKi8KKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJm1jcjEpOworCQkJbWNyMSAmPSB+MHgwNDsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIG1jcjEpOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzc0OgorCQkJY2hpcF90YWJsZSA9ICZocHQzNzQ7CisJCQlpZiAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKQorCQkJCSpwcGkgPSAmaW5mb19ocHQzNzRfZm4wOworCQkJZWxzZQorCQkJCSpwcGkgPSAmaW5mb19ocHQzNzRfZm4xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAicGF0YV9ocHQzN3g6IFBDSSB0YWJsZSBpcyBib2d1cywgcGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwKKwkJCSAgICAgICBkZXYtPmRldmljZSk7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CkBAIC04OTMsOSArOTM5LDExIEBACiAJaWYgKGNoaXBfdGFibGUgPT0gJmhwdDM3MmEpCiAJCW91dGIoMHgwZSwgaW9iYXNlICsgMHg5Yyk7CiAKLQkvKiBTb21lIGRldmljZXMgZG8gbm90IGxldCB0aGlzIHZhbHVlIGJlIGFjY2Vzc2VkIHZpYSBQQ0kgc3BhY2UKLQkgICBhY2NvcmRpbmcgdG8gdGhlIG9sZCBkcml2ZXIuIEluIGFkZGl0aW9uIHdlIG11c3QgdXNlIHRoZSB2YWx1ZQotCSAgIGZyb20gRk4gMCBvbiB0aGUgSFBUMzc0ICovCisJLyoKKwkgKiBTb21lIGRldmljZXMgZG8gbm90IGxldCB0aGlzIHZhbHVlIGJlIGFjY2Vzc2VkIHZpYSBQQ0kgc3BhY2UKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIG9sZCBkcml2ZXIuIEluIGFkZGl0aW9uIHdlIG11c3QgdXNlIHRoZSB2YWx1ZQorCSAqIGZyb20gRk4gMCBvbiB0aGUgSFBUMzc0LgorCSAqLwogCiAJaWYgKGNoaXBfdGFibGUgPT0gJmhwdDM3NCkgewogCQlmcmVxID0gaHB0Mzc0X3JlYWRfZnJlcShkZXYpOwpAQCAtOTA5LDEwICs5NTcsMTEgQEAKIAkJdTggc3I7CiAJCXUzMiB0b3RhbCA9IDA7CiAKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGF0YV9ocHQzN3g6IEJJT1MgaGFzIG5vdCBzZXQgdGltaW5nIGNsb2Nrcy5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAicGF0YV9ocHQzN3g6IEJJT1MgaGFzIG5vdCBzZXQgdGltaW5nIGNsb2Nrcy5cbiIpOwogCiAJCS8qIFRoaXMgaXMgdGhlIHByb2Nlc3MgdGhlIEhQVDM3MSBCSU9TIGlzIHJlcG9ydGVkIHRvIHVzZSAqLwotCQlmb3IoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKIAkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg3OCwgJnNyKTsKIAkJCXRvdGFsICs9IHNyICYgMHgxRkY7CiAJCQl1ZGVsYXkoMTUpOwpAQCAtOTQ3LDE3ICs5OTYsMjIgQEAKIAogCQkvKiBTZWxlY3QgdGhlIERQTEwgY2xvY2suICovCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjEpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyB8IDB4MTAwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsCisJCQkJICAgICAgIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cgfCAweDEwMCk7CiAKLQkJZm9yKGFkanVzdCA9IDA7IGFkanVzdCA8IDg7IGFkanVzdCsrKSB7CisJCWZvciAoYWRqdXN0ID0gMDsgYWRqdXN0IDwgODsgYWRqdXN0KyspIHsKIAkJCWlmIChocHQzN3hfY2FsaWJyYXRlX2RwbGwoZGV2KSkKIAkJCQlicmVhazsKLQkJCS8qIFNlZSBpZiBpdCdsbCBzZXR0bGUgYXQgYSBmcmFjdGlvbmFsbHkgZGlmZmVyZW50IGNsb2NrICovCisJCQkvKgorCQkJICogU2VlIGlmIGl0J2xsIHNldHRsZSBhdCBhIGZyYWN0aW9uYWxseQorCQkJICogZGlmZmVyZW50IGNsb2NrCisJCQkgKi8KIAkJCWlmIChhZGp1c3QgJiAxKQogCQkJCWZfbG93IC09IGFkanVzdCA+PiAxOwogCQkJZWxzZQogCQkJCWZfaGlnaCArPSBhZGp1c3QgPj4gMTsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsCisJCQkJCSAgICAgICAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOwogCQl9CiAJCWlmIChhZGp1c3QgPT0gOCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJwYXRhX2hwdDM3eDogRFBMTCBkaWQgbm90IHN0YWJpbGl6ZSFcbiIpOwpAQCAtOTc2LDcgKzEwMzAsNyBAQAogCQkgKglQZXJmb3JtIGEgZmluYWwgZml4dXAuIE5vdGUgdGhhdCB3ZSB3aWxsIGhhdmUgdXNlZCB0aGUKIAkJICoJRFBMTCBvbiB0aGUgSFBUMzcyIHdoaWNoIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKIAkJICoJYWJvdXQgbGFjayBvZiBVRE1BMTMzIHN1cHBvcnQgb24gbG93ZXIgY2xvY2tzCi0gCQkgKi8KKwkJICovCiAKIAkJaWYgKGNsb2NrX3Nsb3QgPCAyICYmIHBwaVswXSA9PSAmaW5mb19ocHQzNzApCiAJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzBfMzM7CkBAIC0xMDAxLDkgKzEwNTUsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhwdDM3eF9wY2lfZHJpdmVyID0gewotCS5uYW1lIAkJPSBEUlZfTkFNRSwKKwkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBocHQzN3gsCi0JLnByb2JlIAkJPSBocHQzN3hfaW5pdF9vbmUsCisJLnByb2JlCQk9IGhwdDM3eF9pbml0X29uZSwKIAkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYwppbmRleCAzMmYzNDYzLi5kMjIzOWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaWJhdGEgZHJpdmVyIGZvciB0aGUgaGlnaHBvaW50IDM3Mk4gYW5kIDMwMk4gVURNQTY2IEFUQSBjb250cm9sbGVycy4KKyAqIExpYmF0YSBkcml2ZXIgZm9yIHRoZSBIaWdoUG9pbnQgMzcxTiwgMzcyTiwgYW5kIDMwMk4gVURNQTY2IEFUQSBjb250cm9sbGVycy4KICAqCiAgKiBUaGlzIGRyaXZlciBpcyBoZWF2aWx5IGJhc2VkIHVwb246CiAgKgpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxCSAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzCQlSZWQgSGF0IEluYwotICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqCiAgKiBUT0RPCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0M3gybiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMy4xMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMy4xMyIKIAogZW51bSB7CiAJSFBUX1BDSV9GQVNUCT0JKDEgPDwgMzEpLApAQCAtMTAzLDcgKzEwMyw3IEBACiB7CiAJc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gaHB0M3gybl9jbG9ja3M7CiAKLQl3aGlsZShjbG9ja3MtPnhmZXJfc3BlZWQpIHsKKwl3aGlsZSAoY2xvY2tzLT54ZmVyX3NwZWVkKSB7CiAJCWlmIChjbG9ja3MtPnhmZXJfc3BlZWQgPT0gc3BlZWQpCiAJCQlyZXR1cm4gY2xvY2tzLT50aW1pbmc7CiAJCWNsb2NrcysrOwpAQCAtMTEzLDYgKzExMywyMiBAQAogfQogCiAvKioKKyAqCWhwdDM3Mm5fZmlsdGVyCS0JbW9kZSBzZWxlY3Rpb24gZmlsdGVyCisgKglAYWRldjogQVRBIGRldmljZQorICoJQG1hc2s6IG1vZGUgbWFzaworICoKKyAqCVRoZSBNYXJ2ZWxsIGJyaWRnZSBjaGlwcyB1c2VkIG9uIHRoZSBIaWdoUG9pbnQgU0FUQSBjYXJkcyBkbyBub3Qgc2VlbQorICoJdG8gc3VwcG9ydCB0aGUgVWx0cmFETUEgbW9kZXMgMSwgMiwgYW5kIDMgYXMgd2VsbCBhcyBhbnkgTVdETUEgbW9kZXMuLi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHB0Mzcybl9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlpZiAoYXRhX2lkX2lzX3NhdGEoYWRldi0+aWQpKQorCQltYXNrICY9IH4oKDB4RSA8PCBBVEFfU0hJRlRfVURNQSkgfCBBVEFfTUFTS19NV0RNQSk7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoqCiAgKglocHQzeDJuX2NhYmxlX2RldGVjdAktCURldGVjdCB0aGUgY2FibGUgdHlwZQogICoJQGFwOiBBVEEgcG9ydCB0byBkZXRlY3Qgb24KICAqCkBAIC0xNTMsNiArMTY5LDcgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOworCiAJLyogUmVzZXQgdGhlIHN0YXRlIG1hY2hpbmUgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MCArIDQgKiBhcC0+cG9ydF9ubywgMHgzNyk7CiAJdWRlbGF5KDEwMCk7CkBAIC0zMjgsMTAgKzM0NSwxMCBAQAogfTsKIAogLyoKLSAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDN4Mm4uCisgKglDb25maWd1cmF0aW9uIGZvciBIUFQzMDJOLzM3MU4uCiAgKi8KIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDN4Mm5fcG9ydF9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0M3h4bl9wb3J0X29wcyA9IHsKIAkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAogCiAJLmJtZG1hX3N0b3AJPSBocHQzeDJuX2JtZG1hX3N0b3AsCkBAIC0zNDUsNiArMzYyLDE1IEBACiAJLnByZXJlc2V0CT0gaHB0M3gybl9wcmVfcmVzZXQsCiB9OwogCisvKgorICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzcyTi4gU2FtZSBhcyAzMDJOLzM3MU4gYnV0IHdlIGhhdmUgYSBtb2RlIGZpbHRlci4KKyAqLworCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0Mzcybl9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmaHB0M3h4bl9wb3J0X29wcywKKwkubW9kZV9maWx0ZXIJPSAmaHB0Mzcybl9maWx0ZXIsCit9OworCiAvKioKICAqCWhwdDN4bl9jYWxpYnJhdGVfZHBsbAkJLQlDYWxpYnJhdGUgdGhlIERQTEwgbG9vcAogICoJQGRldjogUENJIGRldmljZQpAQCAtMzU5LDEyICszODUsMTIgQEAKIAl1MzIgcmVnNWM7CiAJaW50IHRyaWVzOwogCi0JZm9yKHRyaWVzID0gMDsgdHJpZXMgPCAweDUwMDA7IHRyaWVzKyspIHsKKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAweDUwMDA7IHRyaWVzKyspIHsKIAkJdWRlbGF5KDUwKTsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDViLCAmcmVnNWIpOwogCQlpZiAocmVnNWIgJiAweDgwKSB7CiAJCQkvKiBTZWUgaWYgaXQgc3RheXMgc2V0ICovCi0JCQlmb3IodHJpZXMgPSAwOyB0cmllcyA8IDB4MTAwMDsgdHJpZXMgKyspIHsKKwkJCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDB4MTAwMDsgdHJpZXMrKykgewogCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgJnJlZzViKTsKIAkJCQkvKiBGYWlsZWQgPyAqLwogCQkJCWlmICgocmVnNWIgJiAweDgwKSA9PSAwKQpAQCAtMzcyLDcgKzM5OCw3IEBACiAJCQl9CiAJCQkvKiBUdXJuIG9mZiB0dW5pbmcsIHdlIGhhdmUgdGhlIERQTEwgc2V0ICovCiAJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAmcmVnNWMpOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsIHJlZzVjICYgfiAweDEwMCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgcmVnNWMgJiB+MHgxMDApOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CkBAIC0zODgsOCArNDE0LDE5IEBACiAKIAlmY250ID0gaW5sKGlvYmFzZSArIDB4OTApOwkvKiBOb3QgUENJIHJlYWRhYmxlIGZvciBzb21lIGNoaXBzICovCiAJaWYgKChmY250ID4+IDEyKSAhPSAweEFCQ0RFKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhwdDN4bjogQklPUyBjbG9jayBkYXRhIG5vdCBzZXQuXG4iKTsKLQkJcmV0dXJuIDMzOwkvKiBOb3QgQklPUyBzZXQgKi8KKwkJaW50IGk7CisJCXUxNiBzcjsKKwkJdTMyIHRvdGFsID0gMDsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwYXRhX2hwdDN4Mm46IEJJT1MgY2xvY2sgZGF0YSBub3Qgc2V0LlxuIik7CisKKwkJLyogVGhpcyBpcyB0aGUgcHJvY2VzcyB0aGUgSFBUMzcxIEJJT1MgaXMgcmVwb3J0ZWQgdG8gdXNlICovCisJCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHg3OCwgJnNyKTsKKwkJCXRvdGFsICs9IHNyICYgMHgxRkY7CisJCQl1ZGVsYXkoMTUpOworCQl9CisJCWZjbnQgPSB0b3RhbCAvIDEyODsKIAl9CiAJZmNudCAmPSAweDFGRjsKIApAQCAtNDMxLDIxICs0NjgsMjcgQEAKICAqCUhQVDM3Mk4JCQk5IChIUFQzNzJOKQkqCVVETUExMzMKICAqCiAgKgkoMSkgVURNQTEzMyBzdXBwb3J0IGRlcGVuZHMgb24gdGhlIGJ1cyBjbG9jawotICoKLSAqCVRvIHBpbiBkb3duCQlIUFQzNzFOCiAgKi8KIAogc3RhdGljIGludCBocHQzeDJuX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQkvKiBIUFQzNzJOIGFuZCBmcmllbmRzIC0gVURNQTEzMyAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCS8qIEhQVDM3Mk4gLSBVRE1BMTMzICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcybiA9IHsKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrID0gQVRBX1BJTzQsCiAJCS5td2RtYV9tYXNrID0gQVRBX01XRE1BMiwKIAkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNiwKLQkJLnBvcnRfb3BzID0gJmhwdDN4Mm5fcG9ydF9vcHMKKwkJLnBvcnRfb3BzID0gJmhwdDM3Mm5fcG9ydF9vcHMKIAl9OwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKKwkvKiBIUFQzMDJOIGFuZCBIUFQzNzFOIC0gVURNQTEzMyAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDN4eG4gPSB7CisJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5waW9fbWFzayA9IEFUQV9QSU80LAorCQkubXdkbWFfbWFzayA9IEFUQV9NV0RNQTIsCisJCS51ZG1hX21hc2sgPSBBVEFfVURNQTYsCisJCS5wb3J0X29wcyA9ICZocHQzeHhuX3BvcnRfb3BzCisJfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvX2hwdDN4eG4sIE5VTEwgfTsKIAl1OCByZXYgPSBkZXYtPnJldmlzaW9uOwogCXU4IGlycW1hc2s7CiAJdW5zaWduZWQgaW50IHBjaV9taHo7CkBAIC00NTksMzAgKzUwMiwzNiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0Jc3dpdGNoKGRldi0+ZGV2aWNlKSB7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzY2OgotCQkJaWYgKHJldiA8IDYpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6Ci0JCQlpZiAocmV2IDwgMikKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCS8qIDM3MU4gaWYgcmV2ID4gMSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyOgotCQkJLyogMzcyTiBpZiByZXYgPj0gMiovCi0JCQlpZiAocmV2IDwgMikKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDMwMjoKLQkJCWlmIChyZXYgPCAyKQotCQkJCXJldHVybiAtRU5PREVWOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyTjoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJwYXRhX2hwdDN4Mm46IFBDSSB0YWJsZSBpcyBib2d1cyBwbGVhc2UgcmVwb3J0ICglZCkuXG4iLCBkZXYtPmRldmljZSk7CisJc3dpdGNoIChkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzY2OgorCQkvKiAzNzJOIGlmIHJldiA+PSA2ICovCisJCWlmIChyZXYgPCA2KQogCQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gaHB0MzcybjsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MToKKwkJLyogMzcxTiBpZiByZXYgPj0gMiAqLworCQlpZiAocmV2IDwgMikKKwkJCXJldHVybiAtRU5PREVWOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MjoKKwkJLyogMzcyTiBpZiByZXYgPj0gMiAqLworCQlpZiAocmV2IDwgMikKKwkJCXJldHVybiAtRU5PREVWOworCQlnb3RvIGhwdDM3Mm47CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzMDI6CisJCS8qIDMwMk4gaWYgcmV2ID49IDIgKi8KKwkJaWYgKHJldiA8IDIpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzJOOgoraHB0MzcybjoKKwkJcHBpWzBdID0gJmluZm9faHB0MzcybjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicGF0YV9ocHQzeDJuOiBQQ0kgdGFibGUgaXMgYm9ndXMgcGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwKKwkJICAgICAgIGRldi0+ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJLyogT2sgc28gdGhpcyBpcyBhIGNoaXAgd2Ugc3VwcG9ydCAqLwpAQCAtNTA5LDggKzU1OCwxMCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCBtY3IxKTsKIAl9CiAKLQkvKiBUdW5lIHRoZSBQTEwuIEhQVCByZWNvbW1lbmQgdXNpbmcgNzUgZm9yIFNBVEEsIDY2IGZvciBVRE1BMTMzIG9yCi0JICAgNTAgZm9yIFVETUExMDAuIFJpZ2h0IG5vdyB3ZSBhbHdheXMgdXNlIDY2ICovCisJLyoKKwkgKiBUdW5lIHRoZSBQTEwuIEhQVCByZWNvbW1lbmQgdXNpbmcgNzUgZm9yIFNBVEEsIDY2IGZvciBVRE1BMTMzIG9yCisJICogNTAgZm9yIFVETUExMDAuIFJpZ2h0IG5vdyB3ZSBhbHdheXMgdXNlIDY2CisJICovCiAKIAlwY2lfbWh6ID0gaHB0M3gybl9wY2lfY2xvY2soZGV2KTsKIApAQCAtNTIyLDcgKzU3Myw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1QiwgMHgyMSk7CiAKIAkvKiBVbmxpa2UgdGhlIDM3eCB3ZSBkb24ndCB0cnkgamlnZ2xpbmcgdGhlIGZyZXF1ZW5jeSAqLwotCWZvcihhZGp1c3QgPSAwOyBhZGp1c3QgPCA4OyBhZGp1c3QrKykgeworCWZvciAoYWRqdXN0ID0gMDsgYWRqdXN0IDwgODsgYWRqdXN0KyspIHsKIAkJaWYgKGhwdDN4bl9jYWxpYnJhdGVfZHBsbChkZXYpKQogCQkJYnJlYWs7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93KTsKQEAgLTUzNCw4ICs1ODUsMTEgQEAKIAogCXByaW50ayhLRVJOX0lORk8gInBhdGFfaHB0Mzd4OiBidXMgY2xvY2sgJWRNSHosIHVzaW5nIDY2TUh6IERQTEwuXG4iLAogCSAgICAgICBwY2lfbWh6KTsKLQkvKiBTZXQgb3VyIHByaXZhdGUgZGF0YSB1cC4gV2Ugb25seSBuZWVkIGEgZmV3IGZsYWdzIHNvIHdlIHVzZQotCSAgIGl0IGRpcmVjdGx5ICovCisKKwkvKgorCSAqIFNldCBvdXIgcHJpdmF0ZSBkYXRhIHVwLiBXZSBvbmx5IG5lZWQgYSBmZXcgZmxhZ3MKKwkgKiBzbyB3ZSB1c2UgaXQgZGlyZWN0bHkuCisJICovCiAJaWYgKHBjaV9taHogPiA2MCkKIAkJaHByaXYgPSAodm9pZCAqKShQQ0k2NiB8IFVTRV9EUExMKTsKIApAQCAtNTYyLDkgKzYxNiw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaHB0M3gybl9wY2lfZHJpdmVyID0gewotCS5uYW1lIAkJPSBEUlZfTkFNRSwKKwkubmFtZQkJPSBEUlZfTkFNRSwKIAkuaWRfdGFibGUJPSBocHQzeDJuLAotCS5wcm9iZSAJCT0gaHB0M3gybl9pbml0X29uZSwKKwkucHJvYmUJCT0gaHB0M3gybl9pbml0X29uZSwKIAkucmVtb3ZlCQk9IGF0YV9wY2lfcmVtb3ZlX29uZQogfTsKIApAQCAtNTc5LDcgKzYzMyw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIHRoZSBIaWdocG9pbnQgSFBUM3gybi8zMHgiKTsKK01PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgdGhlIEhpZ2hwb2ludCBIUFQzeHhOIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaHB0M3gybik7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCBiNzc3MTc2Li5lMDc5Y2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApID09IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyogbWFwIElPIHJlZ2lvbnMgYW5kIGludGlhbGl6ZSBob3N0IGFjY29yZGluZ2x5ICovCisJLyogbWFwIElPIHJlZ2lvbnMgYW5kIGluaXRpYWxpemUgaG9zdCBhY2NvcmRpbmdseSAqLwogCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDEgPDwgVlNDX01NSU9fQkFSLCBEUlZfTkFNRSk7CiAJaWYgKHJjID09IC1FQlVTWSkKIAkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuaCBiL2RyaXZlcnMvYXRtL2lkdDc3MjUyLmgKaW5kZXggNTA0MmJiMi4uZjUzYTQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaWR0NzcyNTIuaAorKysgYi9kcml2ZXJzL2F0bS9pZHQ3NzI1Mi5oCkBAIC01NzIsNyArNTcyLDcgQEAKICNkZWZpbmUgU0FSX1NUQVRfVFNRRiAgICAgICAweDAwMDAxMDAwIC8qIFRyYW5zbWl0IFN0YXR1cyBRdWV1ZSBmdWxsICAgICAgKi8KICNkZWZpbmUgU0FSX1NUQVRfVE1ST0YgICAgICAweDAwMDAwODAwIC8qIFRpbWVyIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgU0FSX1NUQVRfUEhZSSAgICAgICAweDAwMDAwNDAwIC8qIFBIWSBkZXZpY2UgSW50ZXJydXB0IGZsYWcgICAgICAgKi8KLSNkZWZpbmUgU0FSX1NUQVRfQ01EQlogICAgICAweDAwMDAwMjAwIC8qIEFCUiBTQVIgQ29tYW5kIEJ1c3kgRmxhZyAgICAgICAgKi8KKyNkZWZpbmUgU0FSX1NUQVRfQ01EQlogICAgICAweDAwMDAwMjAwIC8qIEFCUiBTQVIgQ29tbWFuZCBCdXN5IEZsYWcgICAgICAgKi8KICNkZWZpbmUgU0FSX1NUQVRfRkJRM0EgICAgICAweDAwMDAwMTAwIC8qIEZyZWUgQnVmZmVyIFF1ZXVlIDMgQXR0ZW50aW9uICAgKi8KICNkZWZpbmUgU0FSX1NUQVRfRkJRMkEgICAgICAweDAwMDAwMDgwIC8qIEZyZWUgQnVmZmVyIFF1ZXVlIDIgQXR0ZW50aW9uICAgKi8KICNkZWZpbmUgU0FSX1NUQVRfUlNRRiAgICAgICAweDAwMDAwMDQwIC8qIFJlY2VpdmUgU3RhdHVzIFF1ZXVlIGZ1bGwgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKaW5kZXggNzI5MjU0MC4uZDgwZDUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaXBoYXNlLmMKKysrIGIvZHJpdmVycy9hdG0vaXBoYXNlLmMKQEAgLTIwNjMsNyArMjA2Myw3IEBACiAJCS0gVUJSIFRhYmxlIHNpemUgaXMgNEsgIAogCQktIFVCUiB3YWl0IHF1ZXVlIGlzIDRLICAKIAkgICBzaW5jZSB0aGUgdGFibGUgYW5kIHdhaXQgcXVldWVzIGFyZSBjb250aWd1b3VzLCBhbGwgdGhlIGJ5dGVzICAgCi0JICAgY2FuIGJlIGluaXRpYWxpemVkIGJ5IG9uZSBtZW1lc2V0LiAgCisJICAgY2FuIGJlIGluaXRpYWxpemVkIGJ5IG9uZSBtZW1lc2V0LgogCSovICAKICAgICAgICAgCiAgICAgICAgIHZjc2l6ZV9zZWwgPSAwOwpAQCAtMjA4OSw3ICsyMDg5LDcgQEAKIAkJLSBBQlIgVGFibGUgc2l6ZSBpcyAySyAgCiAJCS0gQUJSIHdhaXQgcXVldWUgaXMgMksgIAogCSAgIHNpbmNlIHRoZSB0YWJsZSBhbmQgd2FpdCBxdWV1ZXMgYXJlIGNvbnRpZ3VvdXMsIGFsbCB0aGUgYnl0ZXMgICAKLQkgICBjYW4gYmUgaW50aWFsaXplZCBieSBvbmUgbWVtZXNldC4gIAorCSAgIGNhbiBiZSBpbml0aWFsaXplZCBieSBvbmUgbWVtZXNldC4KIAkqLyAgCiAgICAgICAgIGkgPSBBQlJfU0NIRURfVEFCTEUgKiBpYWRldi0+bWVtU2l6ZTsKICAgICAgICAgd3JpdGV3KChpID4+IDExKSAmIDB4ZmZmZiwgaWFkZXYtPnNlZ19yZWcrQUJSX1NCUFRSX0JBU0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggMmNhN2Y1Yi4uMTlmNDllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC0xLDMxICsxLDQ2IEBACiAKIC8qKgotICogc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGJ1c190eXBlIHN0cnVjdHVyZS4KKyAqIHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAtIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgYnVzX3R5cGUvY2xhc3Mgc3RydWN0dXJlLgogICoKLSAqIEBzdWJzeXMgLSB0aGUgc3RydWN0IGtzZXQgdGhhdCBkZWZpbmVzIHRoaXMgYnVzLiAgVGhpcyBpcyB0aGUgbWFpbiBrb2JqZWN0Ci0gKiBAZHJpdmVyc19rc2V0IC0gdGhlIGxpc3Qgb2YgZHJpdmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidXMKLSAqIEBkZXZpY2VzX2tzZXQgLSB0aGUgbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1cworICogQHN1YnN5cyAtIHRoZSBzdHJ1Y3Qga3NldCB0aGF0IGRlZmluZXMgdGhpcyBzdWJzeXN0ZW0KKyAqIEBkZXZpY2VzX2tzZXQgLSB0aGUgbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQKKyAqCisgKiBAZHJpdmVyc19rc2V0IC0gdGhlIGxpc3Qgb2YgZHJpdmVycyBhc3NvY2lhdGVkCiAgKiBAa2xpc3RfZGV2aWNlcyAtIHRoZSBrbGlzdCB0byBpdGVyYXRlIG92ZXIgdGhlIEBkZXZpY2VzX2tzZXQKICAqIEBrbGlzdF9kcml2ZXJzIC0gdGhlIGtsaXN0IHRvIGl0ZXJhdGUgb3ZlciB0aGUgQGRyaXZlcnNfa3NldAogICogQGJ1c19ub3RpZmllciAtIHRoZSBidXMgbm90aWZpZXIgbGlzdCBmb3IgYW55dGhpbmcgdGhhdCBjYXJlcyBhYm91dCB0aGluZ3MKLSAqIG9uIHRoaXMgYnVzLgorICogICAgICAgICAgICAgICAgIG9uIHRoaXMgYnVzLgogICogQGJ1cyAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGJ1c190eXBlIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZAotICogd2l0aC4KKyAqICAgICAgICB3aXRoLgorICoKKyAqIEBjbGFzc19pbnRlcmZhY2VzIC0gbGlzdCBvZiBjbGFzc19pbnRlcmZhY2VzIGFzc29jaWF0ZWQKKyAqIEBnbHVlX2RpcnMgLSAiZ2x1ZSIgZGlyZWN0b3J5IHRvIHB1dCBpbi1iZXR3ZWVuIHRoZSBwYXJlbnQgZGV2aWNlIHRvCisgKiAgICAgICAgICAgICAgYXZvaWQgbmFtZXNwYWNlIGNvbmZsaWN0cworICogQGNsYXNzX211dGV4IC0gbXV0ZXggdG8gcHJvdGVjdCB0aGUgY2hpbGRyZW4sIGRldmljZXMsIGFuZCBpbnRlcmZhY2VzIGxpc3RzLgorICogQGNsYXNzIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICB3aXRoLgogICoKICAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgdGhhdCBpcyB0aGUgYWN0dWFsIGtvYmplY3QgYWxsb3dpbmcgc3RydWN0Ci0gKiBidXNfdHlwZSB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlcgotICogY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCisgKiBidXNfdHlwZS9jbGFzcyB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlCisgKiBkcml2ZXIgY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCiAgKi8KLXN0cnVjdCBidXNfdHlwZV9wcml2YXRlIHsKK3N0cnVjdCBzdWJzeXNfcHJpdmF0ZSB7CiAJc3RydWN0IGtzZXQgc3Vic3lzOwotCXN0cnVjdCBrc2V0ICpkcml2ZXJzX2tzZXQ7CiAJc3RydWN0IGtzZXQgKmRldmljZXNfa3NldDsKKworCXN0cnVjdCBrc2V0ICpkcml2ZXJzX2tzZXQ7CiAJc3RydWN0IGtsaXN0IGtsaXN0X2RldmljZXM7CiAJc3RydWN0IGtsaXN0IGtsaXN0X2RyaXZlcnM7CiAJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgYnVzX25vdGlmaWVyOwogCXVuc2lnbmVkIGludCBkcml2ZXJzX2F1dG9wcm9iZToxOwogCXN0cnVjdCBidXNfdHlwZSAqYnVzOworCisJc3RydWN0IGxpc3RfaGVhZCBjbGFzc19pbnRlcmZhY2VzOworCXN0cnVjdCBrc2V0IGdsdWVfZGlyczsKKwlzdHJ1Y3QgbXV0ZXggY2xhc3NfbXV0ZXg7CisJc3RydWN0IGNsYXNzICpjbGFzczsKIH07CisjZGVmaW5lIHRvX3N1YnN5c19wcml2YXRlKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHN1YnN5c19wcml2YXRlLCBzdWJzeXMua29iaikKIAogc3RydWN0IGRyaXZlcl9wcml2YXRlIHsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwpAQCAtMzYsMzMgKzUxLDYgQEAKIH07CiAjZGVmaW5lIHRvX2RyaXZlcihvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSwga29iaikKIAotCi0vKioKLSAqIHN0cnVjdCBjbGFzc19wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuCi0gKgotICogQGNsYXNzX3N1YnN5cyAtIHRoZSBzdHJ1Y3Qga3NldCB0aGF0IGRlZmluZXMgdGhpcyBjbGFzcy4gIFRoaXMgaXMgdGhlIG1haW4ga29iamVjdAotICogQGNsYXNzX2RldmljZXMgLSBsaXN0IG9mIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MKLSAqIEBjbGFzc19pbnRlcmZhY2VzIC0gbGlzdCBvZiBjbGFzc19pbnRlcmZhY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzCi0gKiBAY2xhc3NfZGlycyAtICJnbHVlIiBkaXJlY3RvcnkgZm9yIHZpcnR1YWwgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcwotICogQGNsYXNzX211dGV4IC0gbXV0ZXggdG8gcHJvdGVjdCB0aGUgY2hpbGRyZW4sIGRldmljZXMsIGFuZCBpbnRlcmZhY2VzIGxpc3RzLgotICogQGNsYXNzIC0gcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcyBhc3NvY2lhdGVkCi0gKiB3aXRoLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBvbmUgdGhhdCBpcyB0aGUgYWN0dWFsIGtvYmplY3QgYWxsb3dpbmcgc3RydWN0Ci0gKiBjbGFzcyB0byBiZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzYWZlbHkuICBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlcgotICogY29yZSBzaG91bGQgZXZlciB0b3VjaCB0aGVzZSBmaWVsZHMuCi0gKi8KLXN0cnVjdCBjbGFzc19wcml2YXRlIHsKLQlzdHJ1Y3Qga3NldCBjbGFzc19zdWJzeXM7Ci0Jc3RydWN0IGtsaXN0IGNsYXNzX2RldmljZXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjbGFzc19pbnRlcmZhY2VzOwotCXN0cnVjdCBrc2V0IGNsYXNzX2RpcnM7Ci0Jc3RydWN0IG11dGV4IGNsYXNzX211dGV4OwotCXN0cnVjdCBjbGFzcyAqY2xhc3M7Ci19OwotI2RlZmluZSB0b19jbGFzcyhvYmopCVwKLQljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSwgY2xhc3Nfc3Vic3lzLmtvYmopCi0KIC8qKgogICogc3RydWN0IGRldmljZV9wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCAzM2MyNzBhLi4wMDBlN2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAicG93ZXIvcG93ZXIuaCIKIAogI2RlZmluZSB0b19idXNfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSwgYXR0cikKLSNkZWZpbmUgdG9fYnVzKG9iaikgY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGJ1c190eXBlX3ByaXZhdGUsIHN1YnN5cy5rb2JqKQogCiAvKgogICogc3lzZnMgYmluZGluZ3MgZm9yIGRyaXZlcnMKQEAgLTk2LDExICs5NSwxMSBAQAogCQkJICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGJ1c19hdHRyaWJ1dGUgKmJ1c19hdHRyID0gdG9fYnVzX2F0dHIoYXR0cik7Ci0Jc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKmJ1c19wcml2ID0gdG9fYnVzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqc3Vic3lzX3ByaXYgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzc2l6ZV90IHJldCA9IDA7CiAKIAlpZiAoYnVzX2F0dHItPnNob3cpCi0JCXJldCA9IGJ1c19hdHRyLT5zaG93KGJ1c19wcml2LT5idXMsIGJ1Zik7CisJCXJldCA9IGJ1c19hdHRyLT5zaG93KHN1YnN5c19wcml2LT5idXMsIGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA4LDExICsxMDcsMTEgQEAKIAkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBidXNfYXR0cmlidXRlICpidXNfYXR0ciA9IHRvX2J1c19hdHRyKGF0dHIpOwotCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpidXNfcHJpdiA9IHRvX2J1cyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnN1YnN5c19wcml2ID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3NpemVfdCByZXQgPSAwOwogCiAJaWYgKGJ1c19hdHRyLT5zdG9yZSkKLQkJcmV0ID0gYnVzX2F0dHItPnN0b3JlKGJ1c19wcml2LT5idXMsIGJ1ZiwgY291bnQpOworCQlyZXQgPSBidXNfYXR0ci0+c3RvcmUoc3Vic3lzX3ByaXYtPmJ1cywgYnVmLCBjb3VudCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODU4LDkgKzg1Nyw5IEBACiBpbnQgYnVzX3JlZ2lzdGVyKHN0cnVjdCBidXNfdHlwZSAqYnVzKQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IGJ1c190eXBlX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpwcml2OwogCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidXNfdHlwZV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTk3Niw3ICs5NzUsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYnVzX2dldF9kZXZpY2Vfa2xpc3QpOwogCiAvKgotICogWWVzLCB0aGlzIGZvcmNhYmx5IGJyZWFrcyB0aGUga2xpc3QgYWJzdHJhY3Rpb24gdGVtcG9yYXJpbHkuICBJdAorICogWWVzLCB0aGlzIGZvcmNpYmx5IGJyZWFrcyB0aGUga2xpc3QgYWJzdHJhY3Rpb24gdGVtcG9yYXJpbHkuICBJdAogICoganVzdCB3YW50cyB0byBzb3J0IHRoZSBrbGlzdCwgbm90IGNoYW5nZSByZWZlcmVuY2UgY291bnRzIGFuZAogICogdGFrZS9kcm9wIGxvY2tzIHJhcGlkbHkgaW4gdGhlIHByb2Nlc3MuICBJdCBkb2VzIGFsbCB0aGlzIHdoaWxlCiAgKiBob2xkaW5nIHRoZSBsb2NrIGZvciB0aGUgbGlzdCwgc28gb2JqZWN0cyBjYW4ndCBvdGhlcndpc2UgYmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKaW5kZXggOWM2M2E1Ni4uNGYxZGYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAkJCSAgICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqY2xhc3NfYXR0ciA9IHRvX2NsYXNzX2F0dHIoYXR0cik7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwID0gdG9fY2xhc3Moa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpjcCA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXNzaXplX3QgcmV0ID0gLUVJTzsKIAogCWlmIChjbGFzc19hdHRyLT5zaG93KQpAQCAtMzksNyArMzksNyBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmNsYXNzX2F0dHIgPSB0b19jbGFzc19hdHRyKGF0dHIpOwotCXN0cnVjdCBjbGFzc19wcml2YXRlICpjcCA9IHRvX2NsYXNzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3AgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzc2l6ZV90IHJldCA9IC1FSU87CiAKIAlpZiAoY2xhc3NfYXR0ci0+c3RvcmUpCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0YXRpYyB2b2lkIGNsYXNzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwID0gdG9fY2xhc3Moa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpjcCA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBjcC0+Y2xhc3M7CiAKIAlwcl9kZWJ1ZygiY2xhc3MgJyVzJzogcmVsZWFzZS5cbiIsIGNsYXNzLT5uYW1lKTsKQEAgLTY1LDcgKzY1LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqY2xhc3NfY2hpbGRfbnNfdHlwZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqY3AgPSB0b19jbGFzcyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKmNwID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3RydWN0IGNsYXNzICpjbGFzcyA9IGNwLT5jbGFzczsKIAogCXJldHVybiBjbGFzcy0+bnNfdHlwZTsKQEAgLTgyLDcgKzgyLDcgQEAKIAkuY2hpbGRfbnNfdHlwZQk9IGNsYXNzX2NoaWxkX25zX3R5cGUsCiB9OwogCi0vKiBIb3RwbHVnIGV2ZW50cyBmb3IgY2xhc3NlcyBnbyB0byB0aGUgY2xhc3MgY2xhc3Nfc3Vic3lzICovCisvKiBIb3RwbHVnIGV2ZW50cyBmb3IgY2xhc3NlcyBnbyB0byB0aGUgY2xhc3Mgc3Vic3lzICovCiBzdGF0aWMgc3RydWN0IGtzZXQgKmNsYXNzX2tzZXQ7CiAKIApAQCAtOTAsNyArOTAsNyBAQAogewogCWludCBlcnJvcjsKIAlpZiAoY2xzKQotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjbHMtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAorCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjbHMtPnAtPnN1YnN5cy5rb2JqLAogCQkJCQkgICZhdHRyLT5hdHRyKTsKIAllbHNlCiAJCWVycm9yID0gLUVJTlZBTDsKQEAgLTEwMCwyMCArMTAwLDIwIEBACiB2b2lkIGNsYXNzX3JlbW92ZV9maWxlKHN0cnVjdCBjbGFzcyAqY2xzLCBjb25zdCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyKQogewogCWlmIChjbHMpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKCZjbHMtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCAmYXR0ci0+YXR0cik7CisJCXN5c2ZzX3JlbW92ZV9maWxlKCZjbHMtPnAtPnN1YnN5cy5rb2JqLCAmYXR0ci0+YXR0cik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmNsYXNzX2dldChzdHJ1Y3QgY2xhc3MgKmNscykKIHsKIAlpZiAoY2xzKQotCQlrc2V0X2dldCgmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCQlrc2V0X2dldCgmY2xzLT5wLT5zdWJzeXMpOwogCXJldHVybiBjbHM7CiB9CiAKIHN0YXRpYyB2b2lkIGNsYXNzX3B1dChzdHJ1Y3QgY2xhc3MgKmNscykKIHsKIAlpZiAoY2xzKQotCQlrc2V0X3B1dCgmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCQlrc2V0X3B1dCgmY2xzLT5wLT5zdWJzeXMpOwogfQogCiBzdGF0aWMgaW50IGFkZF9jbGFzc19hdHRycyhzdHJ1Y3QgY2xhc3MgKmNscykKQEAgLTE2Miw3ICsxNjIsNyBAQAogCiBpbnQgX19jbGFzc19yZWdpc3RlcihzdHJ1Y3QgY2xhc3MgKmNscywgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3A7CiAJaW50IGVycm9yOwogCiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiByZWdpc3RlcmluZ1xuIiwgY2xzLT5uYW1lKTsKQEAgLTE3MCwxMSArMTcwLDExIEBACiAJY3AgPSBremFsbG9jKHNpemVvZigqY3ApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwKQogCQlyZXR1cm4gLUVOT01FTTsKLQlrbGlzdF9pbml0KCZjcC0+Y2xhc3NfZGV2aWNlcywga2xpc3RfY2xhc3NfZGV2X2dldCwga2xpc3RfY2xhc3NfZGV2X3B1dCk7CisJa2xpc3RfaW5pdCgmY3AtPmtsaXN0X2RldmljZXMsIGtsaXN0X2NsYXNzX2Rldl9nZXQsIGtsaXN0X2NsYXNzX2Rldl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZjcC0+Y2xhc3NfaW50ZXJmYWNlcyk7Ci0Ja3NldF9pbml0KCZjcC0+Y2xhc3NfZGlycyk7CisJa3NldF9pbml0KCZjcC0+Z2x1ZV9kaXJzKTsKIAlfX211dGV4X2luaXQoJmNwLT5jbGFzc19tdXRleCwgInN0cnVjdCBjbGFzcyBtdXRleCIsIGtleSk7Ci0JZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZjcC0+Y2xhc3Nfc3Vic3lzLmtvYmosICIlcyIsIGNscy0+bmFtZSk7CisJZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKCZjcC0+c3Vic3lzLmtvYmosICIlcyIsIGNscy0+bmFtZSk7CiAJaWYgKGVycm9yKSB7CiAJCWtmcmVlKGNwKTsKIAkJcmV0dXJuIGVycm9yOwpAQCAtMTg3LDE1ICsxODcsMTUgQEAKICNpZiBkZWZpbmVkKENPTkZJR19CTE9DSykKIAkvKiBsZXQgdGhlIGJsb2NrIGNsYXNzIGRpcmVjdG9yeSBzaG93IHVwIGluIHRoZSByb290IG9mIHN5c2ZzICovCiAJaWYgKCFzeXNmc19kZXByZWNhdGVkIHx8IGNscyAhPSAmYmxvY2tfY2xhc3MpCi0JCWNwLT5jbGFzc19zdWJzeXMua29iai5rc2V0ID0gY2xhc3Nfa3NldDsKKwkJY3AtPnN1YnN5cy5rb2JqLmtzZXQgPSBjbGFzc19rc2V0OwogI2Vsc2UKLQljcC0+Y2xhc3Nfc3Vic3lzLmtvYmoua3NldCA9IGNsYXNzX2tzZXQ7CisJY3AtPnN1YnN5cy5rb2JqLmtzZXQgPSBjbGFzc19rc2V0OwogI2VuZGlmCi0JY3AtPmNsYXNzX3N1YnN5cy5rb2JqLmt0eXBlID0gJmNsYXNzX2t0eXBlOworCWNwLT5zdWJzeXMua29iai5rdHlwZSA9ICZjbGFzc19rdHlwZTsKIAljcC0+Y2xhc3MgPSBjbHM7CiAJY2xzLT5wID0gY3A7CiAKLQllcnJvciA9IGtzZXRfcmVnaXN0ZXIoJmNwLT5jbGFzc19zdWJzeXMpOworCWVycm9yID0ga3NldF9yZWdpc3RlcigmY3AtPnN1YnN5cyk7CiAJaWYgKGVycm9yKSB7CiAJCWtmcmVlKGNwKTsKIAkJcmV0dXJuIGVycm9yOwpAQCAtMjEwLDcgKzIxMCw3IEBACiB7CiAJcHJfZGVidWcoImRldmljZSBjbGFzcyAnJXMnOiB1bnJlZ2lzdGVyaW5nXG4iLCBjbHMtPm5hbWUpOwogCXJlbW92ZV9jbGFzc19hdHRycyhjbHMpOwotCWtzZXRfdW5yZWdpc3RlcigmY2xzLT5wLT5jbGFzc19zdWJzeXMpOworCWtzZXRfdW5yZWdpc3RlcigmY2xzLT5wLT5zdWJzeXMpOwogfQogCiBzdGF0aWMgdm9pZCBjbGFzc19jcmVhdGVfcmVsZWFzZShzdHJ1Y3QgY2xhc3MgKmNscykKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAJaWYgKHN0YXJ0KQogCQlzdGFydF9rbm9kZSA9ICZzdGFydC0+a25vZGVfY2xhc3M7Ci0Ja2xpc3RfaXRlcl9pbml0X25vZGUoJmNsYXNzLT5wLT5jbGFzc19kZXZpY2VzLCAmaXRlci0+a2ksIHN0YXJ0X2tub2RlKTsKKwlrbGlzdF9pdGVyX2luaXRfbm9kZSgmY2xhc3MtPnAtPmtsaXN0X2RldmljZXMsICZpdGVyLT5raSwgc3RhcnRfa25vZGUpOwogCWl0ZXItPnR5cGUgPSB0eXBlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xhc3NfZGV2X2l0ZXJfaW5pdCk7CkBAIC00ODIsOCArNDgyLDggQEAKIAljbGFzc19wdXQocGFyZW50KTsKIH0KIAotc3NpemVfdCBzaG93X2NsYXNzX2F0dHJfc3RyaW5nKHN0cnVjdCBjbGFzcyAqY2xhc3MsIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAJY2hhciAqYnVmKQorc3NpemVfdCBzaG93X2NsYXNzX2F0dHJfc3RyaW5nKHN0cnVjdCBjbGFzcyAqY2xhc3MsCisJCQkgICAgICAgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGVfc3RyaW5nICpjczsKIAljcyA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlX3N0cmluZywgYXR0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA2ZWQ2NDU0Li4wODBlOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTMzOCw2ICszMzgsMzUgQEAKIAkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZhdHRyc1tpXSk7CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2FkZF9iaW5fYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cnMpCit7CisJaW50IGVycm9yID0gMDsKKwlpbnQgaTsKKworCWlmIChhdHRycykgeworCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspIHsKKwkJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShkZXYsICZhdHRyc1tpXSk7CisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVycm9yKQorCQkJd2hpbGUgKC0taSA+PSAwKQorCQkJCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZGV2LCAmYXR0cnNbaV0pOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV9yZW1vdmVfYmluX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHJzKQoreworCWludCBpOworCisJaWYgKGF0dHJzKQorCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoYXR0cnNbaV0pOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmF0dHJzW2ldKTsKK30KKwogc3RhdGljIGludCBkZXZpY2VfYWRkX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCiB7CkBAIC0zNzgsMTIgKzQwNywxNSBAQAogCQllcnJvciA9IGRldmljZV9hZGRfYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYXR0cnMpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CisJCWVycm9yID0gZGV2aWNlX2FkZF9iaW5fYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYmluX2F0dHJzKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOwogCX0KIAogCWlmICh0eXBlKSB7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCB0eXBlLT5ncm91cHMpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGVycl9yZW1vdmVfY2xhc3NfYXR0cnM7CisJCQlnb3RvIGVycl9yZW1vdmVfY2xhc3NfYmluX2F0dHJzOwogCX0KIAogCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCBkZXYtPmdyb3Vwcyk7CkBAIC0zOTUsNiArNDI3LDkgQEAKICBlcnJfcmVtb3ZlX3R5cGVfZ3JvdXBzOgogCWlmICh0eXBlKQogCQlkZXZpY2VfcmVtb3ZlX2dyb3VwcyhkZXYsIHR5cGUtPmdyb3Vwcyk7CisgZXJyX3JlbW92ZV9jbGFzc19iaW5fYXR0cnM6CisJaWYgKGNsYXNzKQorCQlkZXZpY2VfcmVtb3ZlX2Jpbl9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9iaW5fYXR0cnMpOwogIGVycl9yZW1vdmVfY2xhc3NfYXR0cnM6CiAJaWYgKGNsYXNzKQogCQlkZXZpY2VfcmVtb3ZlX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2F0dHJzKTsKQEAgLTQxMiw4ICs0NDcsMTAgQEAKIAlpZiAodHlwZSkKIAkJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2LCB0eXBlLT5ncm91cHMpOwogCi0JaWYgKGNsYXNzKQorCWlmIChjbGFzcykgewogCQlkZXZpY2VfcmVtb3ZlX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2F0dHJzKTsKKwkJZGV2aWNlX3JlbW92ZV9iaW5fYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYmluX2F0dHJzKTsKKwl9CiB9CiAKIApAQCAtNjEwLDcgKzY0Nyw3IEBACiAJZGlyLT5jbGFzcyA9IGNsYXNzOwogCWtvYmplY3RfaW5pdCgmZGlyLT5rb2JqLCAmY2xhc3NfZGlyX2t0eXBlKTsKIAotCWRpci0+a29iai5rc2V0ID0gJmNsYXNzLT5wLT5jbGFzc19kaXJzOworCWRpci0+a29iai5rc2V0ID0gJmNsYXNzLT5wLT5nbHVlX2RpcnM7CiAKIAlyZXR2YWwgPSBrb2JqZWN0X2FkZCgmZGlyLT5rb2JqLCBwYXJlbnRfa29iaiwgIiVzIiwgY2xhc3MtPm5hbWUpOwogCWlmIChyZXR2YWwgPCAwKSB7CkBAIC02MzUsNyArNjcyLDcgQEAKIAkJaWYgKHN5c2ZzX2RlcHJlY2F0ZWQgJiYgZGV2LT5jbGFzcyA9PSAmYmxvY2tfY2xhc3MpIHsKIAkJCWlmIChwYXJlbnQgJiYgcGFyZW50LT5jbGFzcyA9PSAmYmxvY2tfY2xhc3MpCiAJCQkJcmV0dXJuICZwYXJlbnQtPmtvYmo7Ci0JCQlyZXR1cm4gJmJsb2NrX2NsYXNzLnAtPmNsYXNzX3N1YnN5cy5rb2JqOworCQkJcmV0dXJuICZibG9ja19jbGFzcy5wLT5zdWJzeXMua29iajsKIAkJfQogI2VuZGlmCiAKQEAgLTY1NCwxMyArNjkxLDEzIEBACiAJCW11dGV4X2xvY2soJmdkcF9tdXRleCk7CiAKIAkJLyogZmluZCBvdXIgY2xhc3MtZGlyZWN0b3J5IGF0IHRoZSBwYXJlbnQgYW5kIHJlZmVyZW5jZSBpdCAqLwotCQlzcGluX2xvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RpcnMubGlzdF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShrLCAmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfZGlycy5saXN0LCBlbnRyeSkKKwkJc3Bpbl9sb2NrKCZkZXYtPmNsYXNzLT5wLT5nbHVlX2RpcnMubGlzdF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShrLCAmZGV2LT5jbGFzcy0+cC0+Z2x1ZV9kaXJzLmxpc3QsIGVudHJ5KQogCQkJaWYgKGstPnBhcmVudCA9PSBwYXJlbnRfa29iaikgewogCQkJCWtvYmogPSBrb2JqZWN0X2dldChrKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJc3Bpbl91bmxvY2soJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RpcnMubGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycy5saXN0X2xvY2spOwogCQlpZiAoa29iaikgewogCQkJbXV0ZXhfdW5sb2NrKCZnZHBfbXV0ZXgpOwogCQkJcmV0dXJuIGtvYmo7CkBAIC02ODIsNyArNzE5LDcgQEAKIHsKIAkvKiBzZWUgaWYgd2UgbGl2ZSBpbiBhICJnbHVlIiBkaXJlY3RvcnkgKi8KIAlpZiAoIWdsdWVfZGlyIHx8ICFkZXYtPmNsYXNzIHx8Ci0JICAgIGdsdWVfZGlyLT5rc2V0ICE9ICZkZXYtPmNsYXNzLT5wLT5jbGFzc19kaXJzKQorCSAgICBnbHVlX2Rpci0+a3NldCAhPSAmZGV2LT5jbGFzcy0+cC0+Z2x1ZV9kaXJzKQogCQlyZXR1cm47CiAKIAlrb2JqZWN0X3B1dChnbHVlX2Rpcik7CkBAIC03MDksNyArNzQ2LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosCi0JCQkJICAmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCisJCQkJICAmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosCiAJCQkJICAic3Vic3lzdGVtIik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKQEAgLTcyOCw3ICs3NjUsNyBAQAogI2VuZGlmCiAKIAkvKiBsaW5rIGluIHRoZSBjbGFzcyBkaXJlY3RvcnkgcG9pbnRpbmcgdG8gdGhlIGRldmljZSAqLwotCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAorCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPnN1YnN5cy5rb2JqLAogCQkJCSAgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9kZXZpY2U7CkBAIC03NTYsNyArNzkzLDcgQEAKIAlpZiAoc3lzZnNfZGVwcmVjYXRlZCAmJiBkZXYtPmNsYXNzID09ICZibG9ja19jbGFzcykKIAkJcmV0dXJuOwogI2VuZGlmCi0Jc3lzZnNfZGVsZXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLCAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKKwlzeXNmc19kZWxldGVfbGluaygmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogfQogCiAvKioKQEAgLTk0Nyw3ICs5ODQsNyBAQAogCQltdXRleF9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CiAJCS8qIHRpZSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZSAqLwogCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9jbGFzcywKLQkJCSAgICAgICAmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfZGV2aWNlcyk7CisJCQkgICAgICAgJmRldi0+Y2xhc3MtPnAtPmtsaXN0X2RldmljZXMpOwogCiAJCS8qIG5vdGlmeSBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgaXMgaGVyZSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2ludGYsCkBAIC0xNTEzLDYgKzE1NTAsOCBAQAogICogZXhjbHVzaW9uIGJldHdlZW4gdHdvIGRpZmZlcmVudCBjYWxscyBvZiBkZXZpY2VfcmVuYW1lCiAgKiBvbiB0aGUgc2FtZSBkZXZpY2UgdG8gZW5zdXJlIHRoYXQgbmV3X25hbWUgaXMgdmFsaWQgYW5kCiAgKiB3b24ndCBjb25mbGljdCB3aXRoIG90aGVyIGRldmljZXMuCisgKgorICogIk5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIiAtIGdyZWdraAogICovCiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5ld19uYW1lKQogewpAQCAtMTUzNSw3ICsxNTc0LDcgQEAKIAl9CiAKIAlpZiAoZGV2LT5jbGFzcykgewotCQllcnJvciA9IHN5c2ZzX3JlbmFtZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKKwkJZXJyb3IgPSBzeXNmc19yZW5hbWVfbGluaygmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosCiAJCQkmZGV2LT5rb2JqLCBvbGRfZGV2aWNlX25hbWUsIG5ld19uYW1lKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCBjZTAxMmE5Li4zNmI0MzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9ub2RlLmMKQEAgLTExNywxMiArMTE3LDIxIEBACiAJCSAgICAgICAiTm9kZSAlZCBXcml0ZWJhY2tUbXA6ICAgJThsdSBrQlxuIgogCQkgICAgICAgIk5vZGUgJWQgU2xhYjogICAgICAgICAgICU4bHUga0JcbiIKIAkJICAgICAgICJOb2RlICVkIFNSZWNsYWltYWJsZTogICAlOGx1IGtCXG4iCi0JCSAgICAgICAiTm9kZSAlZCBTVW5yZWNsYWltOiAgICAgJThsdSBrQlxuIiwKKwkJICAgICAgICJOb2RlICVkIFNVbnJlY2xhaW06ICAgICAlOGx1IGtCXG4iCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJCSAgICAgICAiTm9kZSAlZCBBbm9uSHVnZVBhZ2VzOiAgJThsdSBrQlxuIgorI2VuZGlmCisJCQksCiAJCSAgICAgICBuaWQsIEsobm9kZV9wYWdlX3N0YXRlKG5pZCwgTlJfRklMRV9ESVJUWSkpLAogCQkgICAgICAgbmlkLCBLKG5vZGVfcGFnZV9zdGF0ZShuaWQsIE5SX1dSSVRFQkFDSykpLAogCQkgICAgICAgbmlkLCBLKG5vZGVfcGFnZV9zdGF0ZShuaWQsIE5SX0ZJTEVfUEFHRVMpKSwKIAkJICAgICAgIG5pZCwgSyhub2RlX3BhZ2Vfc3RhdGUobmlkLCBOUl9GSUxFX01BUFBFRCkpLAotCQkgICAgICAgbmlkLCBLKG5vZGVfcGFnZV9zdGF0ZShuaWQsIE5SX0FOT05fUEFHRVMpKSwKKwkJICAgICAgIG5pZCwgSyhub2RlX3BhZ2Vfc3RhdGUobmlkLCBOUl9BTk9OX1BBR0VTKQorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCQkJKyBub2RlX3BhZ2Vfc3RhdGUobmlkLCBOUl9BTk9OX1RSQU5TUEFSRU5UX0hVR0VQQUdFUykgKgorCQkJSFBBR0VfUE1EX05SCisjZW5kaWYKKwkJICAgICAgICksCiAJCSAgICAgICBuaWQsIEsobm9kZV9wYWdlX3N0YXRlKG5pZCwgTlJfU0hNRU0pKSwKIAkJICAgICAgIG5pZCwgbm9kZV9wYWdlX3N0YXRlKG5pZCwgTlJfS0VSTkVMX1NUQUNLKSAqCiAJCQkJVEhSRUFEX1NJWkUgLyAxMDI0LApAQCAtMTMzLDcgKzE0MiwxMyBAQAogCQkgICAgICAgbmlkLCBLKG5vZGVfcGFnZV9zdGF0ZShuaWQsIE5SX1NMQUJfUkVDTEFJTUFCTEUpICsKIAkJCQlub2RlX3BhZ2Vfc3RhdGUobmlkLCBOUl9TTEFCX1VOUkVDTEFJTUFCTEUpKSwKIAkJICAgICAgIG5pZCwgSyhub2RlX3BhZ2Vfc3RhdGUobmlkLCBOUl9TTEFCX1JFQ0xBSU1BQkxFKSksCi0JCSAgICAgICBuaWQsIEsobm9kZV9wYWdlX3N0YXRlKG5pZCwgTlJfU0xBQl9VTlJFQ0xBSU1BQkxFKSkpOworCQkgICAgICAgbmlkLCBLKG5vZGVfcGFnZV9zdGF0ZShuaWQsIE5SX1NMQUJfVU5SRUNMQUlNQUJMRSkpCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJCQksIG5pZCwKKwkJCUsobm9kZV9wYWdlX3N0YXRlKG5pZCwgTlJfQU5PTl9UUkFOU1BBUkVOVF9IVUdFUEFHRVMpICoKKwkJCUhQQUdFX1BNRF9OUikKKyNlbmRpZgorCQkgICAgICAgKTsKIAluICs9IGh1Z2V0bGJfcmVwb3J0X25vZGVfbWVtaW5mbyhuaWQsIGJ1ZiArIG4pOwogCXJldHVybiBuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwppbmRleCA4MWYyYzg0Li40MmY5N2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwpAQCAtMzksNyArMzksNyBAQAogICoKICAqIElmIFBNIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBAZGV2J3MgZHJpdmVyIGFuZCB0aGV5IGluY2x1ZGUKICAqIC0+cnVudGltZV9zdXNwZW5kKCksIGV4ZWN1dGUgaXQgYW5kIHJldHVybiBpdHMgZXJyb3IgY29kZS4gIE90aGVyd2lzZSwKLSAqIHJldHVybiAtRUlOVkFMLgorICogcmV0dXJuIDAuCiAgKi8KIGludCBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC01OCw3ICs1OCw3IEBACiAgKgogICogSWYgUE0gb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhlIEBkZXYncyBkcml2ZXIgYW5kIHRoZXkgaW5jbHVkZQogICogLT5ydW50aW1lX3Jlc3VtZSgpLCBleGVjdXRlIGl0IGFuZCByZXR1cm4gaXRzIGVycm9yIGNvZGUuICBPdGhlcndpc2UsCi0gKiByZXR1cm4gLUVJTlZBTC4KKyAqIHJldHVybiAwLgogICovCiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xODUsNyArMTg1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBjYWxsYmFjayhkZXYpOwotCWlmICghcmV0KSB7CisJaWYgKCFyZXQgJiYgcG1fcnVudGltZV9lbmFibGVkKGRldikpIHsKIAkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CiAJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOwogCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggZWFkM2U3OS4uODM0MDQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqCiAgKiBUaGUgZHJpdmVyIG1vZGVsIGNvcmUgY2FsbHMgZGV2aWNlX3BtX2FkZCgpIHdoZW4gYSBkZXZpY2UgaXMgcmVnaXN0ZXJlZC4KLSAqIFRoaXMgd2lsbCBpbnRpYWxpemUgdGhlIGVtYmVkZGVkIGRldmljZV9wbV9pbmZvIG9iamVjdCBpbiB0aGUgZGV2aWNlCisgKiBUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZW1iZWRkZWQgZGV2aWNlX3BtX2luZm8gb2JqZWN0IGluIHRoZSBkZXZpY2UKICAqIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcG93ZXItY29udHJvbGxlZCBkZXZpY2VzLiBzeXNmcyBlbnRyaWVzIGZvcgogICogY29udHJvbGxpbmcgZGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgd2lsbCBhbHNvIGJlIGFkZGVkLgogICoKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSAiLi4vYmFzZS5oIgogI2luY2x1ZGUgInBvd2VyLmgiCkBAIC00MSwxNiArNDIsMTMgQEAKICAqLwogCiBMSVNUX0hFQUQoZHBtX2xpc3QpOworTElTVF9IRUFEKGRwbV9wcmVwYXJlZF9saXN0KTsKK0xJU1RfSEVBRChkcG1fc3VzcGVuZGVkX2xpc3QpOworTElTVF9IRUFEKGRwbV9ub2lycV9saXN0KTsKIAogc3RhdGljIERFRklORV9NVVRFWChkcG1fbGlzdF9tdHgpOwogc3RhdGljIHBtX21lc3NhZ2VfdCBwbV90cmFuc2l0aW9uOwogCi0vKgotICogU2V0IG9uY2UgdGhlIHByZXBhcmF0aW9uIG9mIGRldmljZXMgZm9yIGEgUE0gdHJhbnNpdGlvbiBoYXMgc3RhcnRlZCwgcmVzZXQKLSAqIGJlZm9yZSBzdGFydGluZyB0byByZXN1bWUgZGV2aWNlcy4gIFByb3RlY3RlZCBieSBkcG1fbGlzdF9tdHguCi0gKi8KLXN0YXRpYyBib29sIHRyYW5zaXRpb25fc3RhcnRlZDsKLQogc3RhdGljIGludCBhc3luY19lcnJvcjsKIAogLyoqCkBAIC01OSw3ICs1Nyw3IEBACiAgKi8KIHZvaWQgZGV2aWNlX3BtX2luaXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09OOworCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IGZhbHNlOwogCWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJZGV2LT5wb3dlci53YWtldXAgPSBOVUxMOwpAQCAtOTAsMjIgKzg4LDExIEBACiB2b2lkIGRldmljZV9wbV9hZGQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogQWRkaW5nIGluZm8gZm9yICVzOiVzXG4iLAotCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQlpZiAoZGV2LT5wYXJlbnQpIHsKLQkJaWYgKGRldi0+cGFyZW50LT5wb3dlci5zdGF0dXMgPj0gRFBNX1NVU1BFTkRJTkcpCi0JCQlkZXZfd2FybihkZXYsICJwYXJlbnQgJXMgc2hvdWxkIG5vdCBiZSBzbGVlcGluZ1xuIiwKLQkJCQkgZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKLQl9IGVsc2UgaWYgKHRyYW5zaXRpb25fc3RhcnRlZCkgewotCQkvKgotCQkgKiBXZSByZWZ1c2UgdG8gcmVnaXN0ZXIgcGFyZW50bGVzcyBkZXZpY2VzIHdoaWxlIGEgUE0KLQkJICogdHJhbnNpdGlvbiBpcyBpbiBwcm9ncmVzcyBpbiBvcmRlciB0byBhdm9pZCBsZWF2aW5nIHRoZW0KLQkJICogdW5oYW5kbGVkIGRvd24gdGhlIHJvYWQKLQkJICovCi0JCWRldl9XQVJOKGRldiwgIlBhcmVudGxlc3MgZGV2aWNlIHJlZ2lzdGVyZWQgZHVyaW5nIGEgUE0gdHJhbnNhY3Rpb25cbiIpOwotCX0KLQorCWlmIChkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+cG93ZXIuaW5fc3VzcGVuZCkKKwkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCisJCQlkZXZfbmFtZShkZXYtPnBhcmVudCkpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogfQpAQCAtMTE3LDggKzEwNCw3IEBACiB2b2lkIGRldmljZV9wbV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogUmVtb3ZpbmcgaW5mbyBmb3IgJXM6JXNcbiIsCi0JCSBkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOworCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXYpKTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlsaXN0X2RlbF9pbml0KCZkZXYtPnBvd2VyLmVudHJ5KTsKQEAgLTEzNSwxMCArMTIxLDggQEAKIHZvaWQgZGV2aWNlX3BtX21vdmVfYmVmb3JlKHN0cnVjdCBkZXZpY2UgKmRldmEsIHN0cnVjdCBkZXZpY2UgKmRldmIpCiB7CiAJcHJfZGVidWcoIlBNOiBNb3ZpbmcgJXM6JXMgYmVmb3JlICVzOiVzXG4iLAotCQkgZGV2YS0+YnVzID8gZGV2YS0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmEtPmtvYmopLAotCQkgZGV2Yi0+YnVzID8gZGV2Yi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmItPmtvYmopKTsKKwkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZhKSwKKwkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZiKSk7CiAJLyogRGVsZXRlIGRldmEgZnJvbSBkcG1fbGlzdCBhbmQgcmVpbnNlcnQgYmVmb3JlIGRldmIuICovCiAJbGlzdF9tb3ZlX3RhaWwoJmRldmEtPnBvd2VyLmVudHJ5LCAmZGV2Yi0+cG93ZXIuZW50cnkpOwogfQpAQCAtMTUxLDEwICsxMzUsOCBAQAogdm9pZCBkZXZpY2VfcG1fbW92ZV9hZnRlcihzdHJ1Y3QgZGV2aWNlICpkZXZhLCBzdHJ1Y3QgZGV2aWNlICpkZXZiKQogewogCXByX2RlYnVnKCJQTTogTW92aW5nICVzOiVzIGFmdGVyICVzOiVzXG4iLAotCQkgZGV2YS0+YnVzID8gZGV2YS0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmEtPmtvYmopLAotCQkgZGV2Yi0+YnVzID8gZGV2Yi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsCi0JCSBrb2JqZWN0X25hbWUoJmRldmItPmtvYmopKTsKKwkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZhKSwKKwkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLCBkZXZfbmFtZShkZXZiKSk7CiAJLyogRGVsZXRlIGRldmEgZnJvbSBkcG1fbGlzdCBhbmQgcmVpbnNlcnQgYWZ0ZXIgZGV2Yi4gKi8KIAlsaXN0X21vdmUoJmRldmEtPnBvd2VyLmVudHJ5LCAmZGV2Yi0+cG93ZXIuZW50cnkpOwogfQpAQCAtMTY2LDggKzE0OCw3IEBACiB2b2lkIGRldmljZV9wbV9tb3ZlX2xhc3Qoc3RydWN0IGRldmljZSAqZGV2KQogewogCXByX2RlYnVnKCJQTTogTW92aW5nICVzOiVzIHRvIGVuZCBvZiBsaXN0XG4iLAotCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbGlzdCk7CiB9CiAKQEAgLTMwMyw3ICsyODQsNyBAQAogCQkJcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludCBlcnJvciA9IDA7Ci0Ja3RpbWVfdCBjYWxsdGltZSwgZGVsdGEsIHJldHRpbWU7CisJa3RpbWVfdCBjYWxsdGltZSA9IGt0aW1lX3NldCgwLCAwKSwgZGVsdGEsIHJldHRpbWU7CiAKIAlpZiAoaW5pdGNhbGxfZGVidWcpIHsKIAkJcHJfaW5mbygiY2FsbGluZyAgJXMrIEAgJWksIHBhcmVudDogJXNcbiIsCkBAIC00MDUsNyArMzg2LDcgQEAKIAkJCWludCBlcnJvcikKIHsKIAlwcmludGsoS0VSTl9FUlIgIlBNOiBEZXZpY2UgJXMgZmFpbGVkIHRvICVzJXM6IGVycm9yICVkXG4iLAotCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIHBtX3ZlcmIoc3RhdGUuZXZlbnQpLCBpbmZvLCBlcnJvcik7CisJCWRldl9uYW1lKGRldiksIHBtX3ZlcmIoc3RhdGUuZXZlbnQpLCBpbmZvLCBlcnJvcik7CiB9CiAKIHN0YXRpYyB2b2lkIGRwbV9zaG93X3RpbWUoa3RpbWVfdCBzdGFydHRpbWUsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgY2hhciAqaW5mbykKQEAgLTQ3NSwzMyArNDU2LDI0IEBACiAgKi8KIHZvaWQgZHBtX3Jlc3VtZV9ub2lycShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQl0cmFuc2l0aW9uX3N0YXJ0ZWQgPSBmYWxzZTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QubmV4dCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbm9pcnFfbGlzdCkpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9ub2lycV9saXN0Lm5leHQpOworCQlpbnQgZXJyb3I7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPiBEUE1fT0ZGKSB7Ci0JCQlpbnQgZXJyb3I7CisJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3N1c3BlbmRlZF9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCi0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PRkY7Ci0JCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CisJCWVycm9yID0gZGV2aWNlX3Jlc3VtZV9ub2lycShkZXYsIHN0YXRlKTsKKwkJaWYgKGVycm9yKQorCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIGVhcmx5IiwgZXJyb3IpOwogCi0JCQllcnJvciA9IGRldmljZV9yZXN1bWVfbm9pcnEoZGV2LCBzdGF0ZSk7Ci0KLQkJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIGVhcmx5IiwgZXJyb3IpOwotCQl9Ci0JCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQotCWxpc3Rfc3BsaWNlKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsICJlYXJseSIpOwogCXJlc3VtZV9kZXZpY2VfaXJxcygpOwpAQCAtNTQ0LDcgKzUxNiw3IEBACiAJZHBtX3dhaXQoZGV2LT5wYXJlbnQsIGFzeW5jKTsKIAlkZXZpY2VfbG9jayhkZXYpOwogCi0JZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fUkVTVU1JTkc7CisJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CiAKIAlpZiAoZGV2LT5idXMpIHsKIAkJaWYgKGRldi0+YnVzLT5wbSkgewpAQCAtNjEwLDE5ICs1ODIsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgZHBtX3Jlc3VtZShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCi0JSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJcG1fdHJhbnNpdGlvbiA9IHN0YXRlOwogCWFzeW5jX2Vycm9yID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZHBtX2xpc3QsIHBvd2VyLmVudHJ5KSB7Ci0JCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA8IERQTV9PRkYpCi0JCQljb250aW51ZTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmZHBtX3N1c3BlbmRlZF9saXN0LCBwb3dlci5lbnRyeSkgewogCQlJTklUX0NPTVBMRVRJT04oZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAkJaWYgKGlzX2FzeW5jKGRldikpIHsKIAkJCWdldF9kZXZpY2UoZGV2KTsKQEAgLTYzMCwyOCArNTk3LDI0IEBACiAJCX0KIAl9CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QubmV4dCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fc3VzcGVuZGVkX2xpc3QpKSB7CisJCWRldiA9IHRvX2RldmljZShkcG1fc3VzcGVuZGVkX2xpc3QubmV4dCk7CiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJaWYgKGRldi0+cG93ZXIuc3RhdHVzID49IERQTV9PRkYgJiYgIWlzX2FzeW5jKGRldikpIHsKKwkJaWYgKCFpc19hc3luYyhkZXYpKSB7CiAJCQlpbnQgZXJyb3I7CiAKIAkJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAogCQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lKGRldiwgc3RhdGUsIGZhbHNlKTsKLQotCQkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJCWlmIChlcnJvcikKIAkJCQlwbV9kZXZfZXJyKGRldiwgc3RhdGUsICIiLCBlcnJvcik7Ci0JCX0gZWxzZSBpZiAoZGV2LT5wb3dlci5zdGF0dXMgPT0gRFBNX1NVU1BFTkRJTkcpIHsKLQkJCS8qIEFsbG93IG5ldyBjaGlsZHJlbiBvZiB0aGUgZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQgKi8KLQkJCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX1JFU1VNSU5HOworCisJCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQl9CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fcHJlcGFyZWRfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9Ci0JbGlzdF9zcGxpY2UoJmxpc3QsICZkcG1fbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlkcG1fc2hvd190aW1lKHN0YXJ0dGltZSwgc3RhdGUsIE5VTEwpOwpAQCAtNjk3LDIyICs2NjAsMTggQEAKIAogCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXRyYW5zaXRpb25fc3RhcnRlZCA9IGZhbHNlOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5wcmV2KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9wcmVwYXJlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwotCQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPiBEUE1fT04pIHsKLQkJCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09OOwotCQkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOworCQlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKKwkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAotCQkJZGV2aWNlX2NvbXBsZXRlKGRldiwgc3RhdGUpOwotCQkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCQlkZXZpY2VfY29tcGxldGUoZGV2LCBzdGF0ZSk7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAotCQkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQkJfQotCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQotCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9CiAJbGlzdF9zcGxpY2UoJmxpc3QsICZkcG1fbGlzdCk7CkBAIC04MDIsMTUgKzc2MSwxMyBAQAogICovCiBpbnQgZHBtX3N1c3BlbmRfbm9pcnEocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCWludCBlcnJvciA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJc3VzcGVuZF9kZXZpY2VfaXJxcygpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0LnByZXYpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX3N1c3BlbmRlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3N1c3BlbmRlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwpAQCAtODIzLDEyICs3ODAsMTAgQEAKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWJyZWFrOwogCQl9Ci0JCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX09GRl9JUlE7CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKKwkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9ub2lycV9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KLQlsaXN0X3NwbGljZV90YWlsKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlpZiAoZXJyb3IpCiAJCWRwbV9yZXN1bWVfbm9pcnEocmVzdW1lX2V2ZW50KHN0YXRlKSk7CkBAIC04NzYsNiArODMxLDExIEBACiAJaWYgKGFzeW5jX2Vycm9yKQogCQlnb3RvIEVuZDsKIAorCWlmIChwbV93YWtldXBfcGVuZGluZygpKSB7CisJCWFzeW5jX2Vycm9yID0gLUVCVVNZOworCQlnb3RvIEVuZDsKKwl9CisKIAlpZiAoZGV2LT5jbGFzcykgewogCQlpZiAoZGV2LT5jbGFzcy0+cG0pIHsKIAkJCXBtX2Rldl9kYmcoZGV2LCBzdGF0ZSwgImNsYXNzICIpOwpAQCAtOTA3LDkgKzg2Nyw2IEBACiAJCX0KIAl9CiAKLQlpZiAoIWVycm9yKQotCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PRkY7Ci0KICBFbmQ6CiAJZGV2aWNlX3VubG9jayhkZXYpOwogCWNvbXBsZXRlX2FsbCgmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKQEAgLTk1MSwxNiArOTA4LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgZHBtX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCWludCBlcnJvciA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAlwbV90cmFuc2l0aW9uID0gc3RhdGU7CiAJYXN5bmNfZXJyb3IgPSAwOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5wcmV2KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9wcmVwYXJlZF9saXN0KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX3ByZXBhcmVkX2xpc3QucHJldik7CiAKIAkJZ2V0X2RldmljZShkZXYpOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CkBAIC05NzQsMTIgKzkyOSwxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKLQkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3N1c3BlbmRlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCQlpZiAoYXN5bmNfZXJyb3IpCiAJCQlicmVhazsKIAl9Ci0JbGlzdF9zcGxpY2UoJmxpc3QsIGRwbV9saXN0LnByZXYpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJaWYgKCFlcnJvcikKQEAgLTEwMzgsMjIgKzk5MiwyMCBAQAogICovCiBzdGF0aWMgaW50IGRwbV9wcmVwYXJlKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGVycm9yID0gMDsKIAotCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXRyYW5zaXRpb25fc3RhcnRlZCA9IHRydWU7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0Lm5leHQpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fUFJFUEFSSU5HOwogCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKIAkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKLQkJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpIHsKLQkJCS8qIFdha2UtdXAgcmVxdWVzdGVkIGR1cmluZyBzeXN0ZW0gc2xlZXAgdHJhbnNpdGlvbi4gKi8KKwkJaWYgKHBtX3J1bnRpbWVfYmFycmllcihkZXYpICYmIGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCQlwbV93YWtldXBfZXZlbnQoZGV2LCAwKTsKKworCQlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogCQkJZXJyb3IgPSAtRUJVU1k7CiAJCX0gZWxzZSB7CkBAIC0xMDYyLDI0ICsxMDE0LDIyIEBACiAKIAkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJaWYgKGVycm9yKSB7Ci0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PTjsKIAkJCWlmIChlcnJvciA9PSAtRUFHQUlOKSB7CiAJCQkJcHV0X2RldmljZShkZXYpOwogCQkJCWVycm9yID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCXByaW50ayhLRVJOX0VSUiAiUE06IEZhaWxlZCB0byBwcmVwYXJlIGRldmljZSAlcyAiCi0JCQkJImZvciBwb3dlciB0cmFuc2l0aW9uOiBlcnJvciAlZFxuIiwKLQkJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIGVycm9yKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBNOiBEZXZpY2UgJXMgbm90IHByZXBhcmVkICIKKwkJCQkiZm9yIHBvd2VyIHRyYW5zaXRpb246IGNvZGUgJWRcbiIsCisJCQkJZGV2X25hbWUoZGV2KSwgZXJyb3IpOwogCQkJcHV0X2RldmljZShkZXYpOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fU1VTUEVORElORzsKKwkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gdHJ1ZTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKLQkJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9wcmVwYXJlZF9saXN0KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KLQlsaXN0X3NwbGljZSgmbGlzdCwgJmRwbV9saXN0KTsKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggMDJjNjUyYi4uNjU2NDkzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC0yNTAsMTMgKzI1MCwxNiBAQAogCWlmICghY2IpCiAJCXJldHVybiAtRU5PU1lTOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCWlmIChkZXYtPnBvd2VyLmlycV9zYWZlKSB7CisJCXJldHZhbCA9IGNiKGRldik7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOwogCi0JcmV0dmFsID0gY2IoZGV2KTsKKwkJcmV0dmFsID0gY2IoZGV2KTsKIAotCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CisJfQogCWRldi0+cG93ZXIucnVudGltZV9lcnJvciA9IHJldHZhbDsKLQogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTQwNCw3ICs0MDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAocGFyZW50ICYmICFwYXJlbnQtPnBvd2VyLmlnbm9yZV9jaGlsZHJlbikgeworCWlmIChwYXJlbnQgJiYgIXBhcmVudC0+cG93ZXIuaWdub3JlX2NoaWxkcmVuICYmICFkZXYtPnBvd2VyLmlycV9zYWZlKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAogCQlwbV9yZXF1ZXN0X2lkbGUocGFyZW50KTsKQEAgLTUyNywxMCArNTMwLDEzIEBACiAKIAlpZiAoIXBhcmVudCAmJiBkZXYtPnBhcmVudCkgewogCQkvKgotCQkgKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIHJlc3VtZSBjb3VudGVyIGFuZCByZXN1bWUgaXQgaWYKLQkJICogbmVjZXNzYXJ5LgorCQkgKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIHVzYWdlIGNvdW50ZXIgYW5kIHJlc3VtZSBpdCBpZgorCQkgKiBuZWNlc3NhcnkuICBOb3QgbmVlZGVkIGlmIGRldiBpcyBpcnEtc2FmZTsgdGhlbiB0aGUKKwkJICogcGFyZW50IGlzIHBlcm1hbmVudGx5IHJlc3VtZWQuCiAJCSAqLwogCQlwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwkJaWYgKGRldi0+cG93ZXIuaXJxX3NhZmUpCisJCQlnb3RvIHNraXBfcGFyZW50OwogCQlzcGluX3VubG9jaygmZGV2LT5wb3dlci5sb2NrKTsKIAogCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShwYXJlbnQpOwpAQCAtNTUzLDYgKzU1OSw3IEBACiAJCQlnb3RvIG91dDsKIAkJZ290byByZXBlYXQ7CiAJfQorIHNraXBfcGFyZW50OgogCiAJaWYgKGRldi0+cG93ZXIubm9fY2FsbGJhY2tzKQogCQlnb3RvIG5vX2NhbGxiYWNrOwkvKiBBc3N1bWUgc3VjY2Vzcy4gKi8KQEAgLTU4NCw3ICs1OTEsNyBAQAogCQlycG1faWRsZShkZXYsIFJQTV9BU1lOQyk7CiAKICBvdXQ6Ci0JaWYgKHBhcmVudCkgeworCWlmIChwYXJlbnQgJiYgIWRldi0+cG93ZXIuaXJxX3NhZmUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOwogCiAJCXBtX3J1bnRpbWVfcHV0KHBhcmVudCk7CkBAIC0xMDY1LDcgKzEwNzIsNiBAQAogICogU2V0IHRoZSBwb3dlci5ub19jYWxsYmFja3MgZmxhZywgd2hpY2ggdGVsbHMgdGhlIFBNIGNvcmUgdGhhdCB0aGlzCiAgKiBkZXZpY2UgaXMgcG93ZXItbWFuYWdlZCB0aHJvdWdoIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBydW4tdGltZSBQTQogICogY2FsbGJhY2tzIG9mIGl0cyBvd24uICBUaGUgcnVuLXRpbWUgc3lzZnMgYXR0cmlidXRlcyB3aWxsIGJlIHJlbW92ZWQuCi0gKgogICovCiB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTEwNzgsNiArMTA4NCwyNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocG1fcnVudGltZV9ub19jYWxsYmFja3MpOwogCiAvKioKKyAqIHBtX3J1bnRpbWVfaXJxX3NhZmUgLSBMZWF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkIGR1cmluZyBjYWxsYmFja3MuCisgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlCisgKgorICogU2V0IHRoZSBwb3dlci5pcnFfc2FmZSBmbGFnLCB3aGljaCB0ZWxscyB0aGUgUE0gY29yZSB0aGF0IHRoZQorICogLT5ydW50aW1lX3N1c3BlbmQoKSBhbmQgLT5ydW50aW1lX3Jlc3VtZSgpIGNhbGxiYWNrcyBmb3IgdGhpcyBkZXZpY2Ugc2hvdWxkCisgKiBhbHdheXMgYmUgaW52b2tlZCB3aXRoIHRoZSBzcGlubG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgSXQgYWxzbworICogY2F1c2VzIHRoZSBwYXJlbnQncyB1c2FnZSBjb3VudGVyIHRvIGJlIHBlcm1hbmVudGx5IGluY3JlbWVudGVkLCBwcmV2ZW50aW5nCisgKiB0aGUgcGFyZW50IGZyb20gcnVudGltZSBzdXNwZW5kaW5nIC0tIG90aGVyd2lzZSBhbiBpcnEtc2FmZSBjaGlsZCBtaWdodCBoYXZlCisgKiB0byB3YWl0IGZvciBhIG5vbi1pcnEtc2FmZSBwYXJlbnQuCisgKi8KK3ZvaWQgcG1fcnVudGltZV9pcnFfc2FmZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cGFyZW50KQorCQlwbV9ydW50aW1lX2dldF9zeW5jKGRldi0+cGFyZW50KTsKKwlzcGluX2xvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCWRldi0+cG93ZXIuaXJxX3NhZmUgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX3J1bnRpbWVfaXJxX3NhZmUpOworCisvKioKICAqIHVwZGF0ZV9hdXRvc3VzcGVuZCAtIEhhbmRsZSBhIGNoYW5nZSB0byBhIGRldmljZSdzIGF1dG9zdXNwZW5kIHNldHRpbmdzLgogICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KICAqIEBvbGRfZGVsYXk6IFRoZSBmb3JtZXIgYXV0b3N1c3BlbmRfZGVsYXkgdmFsdWUuCkBAIC0xMTk5LDQgKzEyMjYsNiBAQAogCS8qIENoYW5nZSB0aGUgc3RhdHVzIGJhY2sgdG8gJ3N1c3BlbmRlZCcgdG8gbWF0Y2ggdGhlIGluaXRpYWwgc3RhdHVzLiAqLwogCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzID09IFJQTV9BQ1RJVkUpCiAJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCWlmIChkZXYtPnBvd2VyLmlycV9zYWZlICYmIGRldi0+cGFyZW50KQorCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldi0+cGFyZW50KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwppbmRleCA3MWM1NTI4Li44ZWM0MDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCkBAIC01NDIsMjYgKzU0MiwyNiBAQAogfQogCiAvKioKLSAqIHBtX2NoZWNrX3dha2V1cF9ldmVudHMgLSBDaGVjayBmb3IgbmV3IHdha2V1cCBldmVudHMuCisgKiBwbV93YWtldXBfcGVuZGluZyAtIENoZWNrIGlmIHBvd2VyIHRyYW5zaXRpb24gaW4gcHJvZ3Jlc3Mgc2hvdWxkIGJlIGFib3J0ZWQuCiAgKgogICogQ29tcGFyZSB0aGUgY3VycmVudCBudW1iZXIgb2YgcmVnaXN0ZXJlZCB3YWtldXAgZXZlbnRzIHdpdGggaXRzIHByZXNlcnZlZAotICogdmFsdWUgZnJvbSB0aGUgcGFzdCB0byBjaGVjayBpZiBuZXcgd2FrZXVwIGV2ZW50cyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBzaW5jZQotICogdGhlIG9sZCB2YWx1ZSB3YXMgc3RvcmVkLiAgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHdha2V1cCBldmVudHMgYmVpbmcKLSAqIHByb2Nlc3NlZCBpcyB6ZXJvLgorICogdmFsdWUgZnJvbSB0aGUgcGFzdCBhbmQgcmV0dXJuIHRydWUgaWYgbmV3IHdha2V1cCBldmVudHMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQKKyAqIHNpbmNlIHRoZSBvbGQgdmFsdWUgd2FzIHN0b3JlZC4gIEFsc28gcmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgbnVtYmVyIG9mCisgKiB3YWtldXAgZXZlbnRzIGJlaW5nIHByb2Nlc3NlZCBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLgogICovCi1ib29sIHBtX2NoZWNrX3dha2V1cF9ldmVudHModm9pZCkKK2Jvb2wgcG1fd2FrZXVwX3BlbmRpbmcodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgcmV0ID0gdHJ1ZTsKKwlib29sIHJldCA9IGZhbHNlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CiAJaWYgKGV2ZW50c19jaGVja19lbmFibGVkKSB7Ci0JCXJldCA9ICgodW5zaWduZWQgaW50KWF0b21pY19yZWFkKCZldmVudF9jb3VudCkgPT0gc2F2ZWRfY291bnQpCi0JCQkmJiAhYXRvbWljX3JlYWQoJmV2ZW50c19pbl9wcm9ncmVzcyk7Ci0JCWV2ZW50c19jaGVja19lbmFibGVkID0gcmV0OworCQlyZXQgPSAoKHVuc2lnbmVkIGludClhdG9taWNfcmVhZCgmZXZlbnRfY291bnQpICE9IHNhdmVkX2NvdW50KQorCQkJfHwgYXRvbWljX3JlYWQoJmV2ZW50c19pbl9wcm9ncmVzcyk7CisJCWV2ZW50c19jaGVja19lbmFibGVkID0gIXJldDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzX2xvY2ssIGZsYWdzKTsKLQlpZiAoIXJldCkKKwlpZiAocmV0KQogCQlwbV93YWtldXBfdXBkYXRlX2hpdF9jb3VudHMoKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9LY29uZmlnIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCmluZGV4IDRiOTM1OWEuLjgzYzMyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZworKysgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKQEAgLTQ2NCw2ICs0NjQsNyBAQAogCXRyaXN0YXRlICJYZW4gdmlydHVhbCBibG9jayBkZXZpY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFhFTgogCWRlZmF1bHQgeQorCXNlbGVjdCBYRU5fWEVOQlVTX0ZST05URU5ECiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgZnJvbnQtZW5kIG9mIHRoZSBYZW4gdmlydHVhbAogCSAgYmxvY2sgZGV2aWNlIGRyaXZlci4gIEl0IGNvbW11bmljYXRlcyB3aXRoIGEgYmFjay1lbmQgZHJpdmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggOGUwZjkyNS4uNTE2ZDViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMjM4LDkgKzIzOCw5IEBACiAvKgogICogRW5xdWV1aW5nIGFuZCBkZXF1ZXVpbmcgZnVuY3Rpb25zIGZvciBjbWRsaXN0cy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkZFEoc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKIHsKLQlobGlzdF9hZGRfaGVhZCgmYy0+bGlzdCwgbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmYy0+bGlzdCwgbGlzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVRKENvbW1hbmRMaXN0X3N0cnVjdCAqYykKQEAgLTI1MywxMiArMjUzLDEyIEBACiAJICogdGhlbSBvZmYgYXMgJ3N0YWxlJyB0byBwcmV2ZW50IHRoZSBkcml2ZXIgZnJvbQogCSAqIGZhbGxpbmcgb3Zlci4KIAkgKi8KLQlpZiAoV0FSTl9PTihobGlzdF91bmhhc2hlZCgmYy0+bGlzdCkpKSB7CisJaWYgKFdBUk5fT04obGlzdF9lbXB0eSgmYy0+bGlzdCkpKSB7CiAJCWMtPmNtZF90eXBlID0gQ01EX01TR19TVEFMRTsKIAkJcmV0dXJuOwogCX0KIAotCWhsaXN0X2RlbF9pbml0KCZjLT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZjLT5saXN0KTsKIH0KIAogc3RhdGljIHZvaWQgZW5xdWV1ZV9jbWRfYW5kX3N0YXJ0X2lvKGN0bHJfaW5mb190ICpoLApAQCAtOTA1LDcgKzkwNSw3IEBACiAKIAljLT5jbWRpbmRleCA9IGk7CiAKLQlJTklUX0hMSVNUX05PREUoJmMtPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5saXN0KTsKIAljLT5idXNhZGRyID0gKF9fdTMyKSBjbWRfZG1hX2hhbmRsZTsKIAl0ZW1wNjQudmFsID0gKF9fdTY0KSBlcnJfZG1hX2hhbmRsZTsKIAljLT5FcnJEZXNjLkFkZHIubG93ZXIgPSB0ZW1wNjQudmFsMzIubG93ZXI7CkBAIC05NDQsNyArOTQ0LDcgQEAKIAl9CiAJbWVtc2V0KGMtPmVycl9pbmZvLCAwLCBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCkpOwogCi0JSU5JVF9ITElTVF9OT0RFKCZjLT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+bGlzdCk7CiAJYy0+YnVzYWRkciA9IChfX3UzMikgY21kX2RtYV9oYW5kbGU7CiAJdGVtcDY0LnZhbCA9IChfX3U2NCkgZXJyX2RtYV9oYW5kbGU7CiAJYy0+RXJyRGVzYy5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwpAQCAtMjg4OCw4ICsyODg4LDggQEAKIHsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CiAKLQl3aGlsZSAoIWhsaXN0X2VtcHR5KCZoLT5yZXFRKSkgewotCQljID0gaGxpc3RfZW50cnkoaC0+cmVxUS5maXJzdCwgQ29tbWFuZExpc3Rfc3RydWN0LCBsaXN0KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmgtPnJlcVEpKSB7CisJCWMgPSBsaXN0X2VudHJ5KGgtPnJlcVEubmV4dCwgQ29tbWFuZExpc3Rfc3RydWN0LCBsaXN0KTsKIAkJLyogY2FuJ3QgZG8gYW55dGhpbmcgaWYgZmlmbyBpcyBmdWxsICovCiAJCWlmICgoaC0+YWNjZXNzLmZpZm9fZnVsbChoKSkpIHsKIAkJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJmaWZvIGZ1bGxcbiIpOwpAQCAtMzQwMiwxMSArMzQwMiwxMCBAQAogewogCXUzMiB0YWc7CiAJQ29tbWFuZExpc3Rfc3RydWN0ICpjID0gTlVMTDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwogCV9fdTMyIGJ1c2FkZHJfbWFza2VkLCB0YWdfbWFza2VkOwogCiAJdGFnID0gY2Npc3NfdGFnX2Rpc2NhcmRfZXJyb3JfYml0cyhyYXdfdGFnKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShjLCB0bXAsICZoLT5jbXBRLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaC0+Y21wUSwgbGlzdCkgewogCQlidXNhZGRyX21hc2tlZCA9IGNjaXNzX3RhZ19kaXNjYXJkX2Vycm9yX2JpdHMoYy0+YnVzYWRkcik7CiAJCXRhZ19tYXNrZWQgPSBjY2lzc190YWdfZGlzY2FyZF9lcnJvcl9iaXRzKHRhZyk7CiAJCWlmIChidXNhZGRyX21hc2tlZCA9PSB0YWdfbWFza2VkKSB7CkBAIC00NTcyLDggKzQ1NzEsOCBAQAogCWggPSBoYmFbaV07CiAJaC0+cGRldiA9IHBkZXY7CiAJaC0+YnVzeV9pbml0aWFsaXppbmcgPSAxOwotCUlOSVRfSExJU1RfSEVBRCgmaC0+Y21wUSk7Ci0JSU5JVF9ITElTVF9IRUFEKCZoLT5yZXFRKTsKKwlJTklUX0xJU1RfSEVBRCgmaC0+Y21wUSk7CisJSU5JVF9MSVNUX0hFQUQoJmgtPnJlcVEpOwogCW11dGV4X2luaXQoJmgtPmJ1c3lfc2h1dHRpbmdfZG93bik7CiAKIAlpZiAoY2Npc3NfcGNpX2luaXQoaCkgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3MuaCBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaAppbmRleCA0Yjg5MzNkLi41NzlmNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzcy5oCkBAIC0xMDMsOCArMTAzLDggQEAKIAlzdHJ1Y3QgYWNjZXNzX21ldGhvZCBhY2Nlc3M7CiAKIAkvKiBxdWV1ZSBhbmQgcXVldWUgSW5mbyAqLyAKLQlzdHJ1Y3QgaGxpc3RfaGVhZCByZXFROwotCXN0cnVjdCBobGlzdF9oZWFkIGNtcFE7CisJc3RydWN0IGxpc3RfaGVhZCByZXFROworCXN0cnVjdCBsaXN0X2hlYWQgY21wUTsKIAl1bnNpZ25lZCBpbnQgUWRlcHRoOwogCXVuc2lnbmVkIGludCBtYXhRc2luY2Vpbml0OwogCXVuc2lnbmVkIGludCBtYXhTRzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oCmluZGV4IGViMDYwZjEuLjM1NDYzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmgKKysrIGIvZHJpdmVycy9ibG9jay9jY2lzc19jbWQuaApAQCAtMTk1LDcgKzE5NSw3IEBACiAgIGludAkJCSAgIGN0bHI7CiAgIGludAkJCSAgIGNtZF90eXBlOyAKICAgbG9uZwkJCSAgIGNtZGluZGV4OwotICBzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OworICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAgIHN0cnVjdCByZXF1ZXN0ICoJICAgcnE7CiAgIHN0cnVjdCBjb21wbGV0aW9uICp3YWl0aW5nOwogICBpbnQJIHJldHJ5X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfaW50LmggYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAppbmRleCAxZWExYTM0Li4zODAzYTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9pbnQuaApAQCAtOTExLDggKzkxMSw2IEBACiBzdHJ1Y3QgZHJiZF9iYWNraW5nX2RldiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmFja2luZ19iZGV2OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKm1kX2JkZXY7Ci0Jc3RydWN0IGZpbGUgKmxvX2ZpbGU7Ci0Jc3RydWN0IGZpbGUgKm1kX2ZpbGU7CiAJc3RydWN0IGRyYmRfbWQgbWQ7CiAJc3RydWN0IGRpc2tfY29uZiBkYzsgLyogVGhlIHVzZXIgcHJvdmlkZWQgY29uZmlnLi4uICovCiAJc2VjdG9yX3Qga25vd25fc2l6ZTsgLyogbGFzdCBrbm93biBzaXplIG9mIHRoYXQgYmFja2luZyBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX21haW4uYwppbmRleCA2YmU1NDAxLi4yOWNkMGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9tYWluLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbWFpbi5jCkBAIC0zMzcyLDExICszMzcyLDggQEAKIAlpZiAobGRldiA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQliZF9yZWxlYXNlKGxkZXYtPmJhY2tpbmdfYmRldik7Ci0JYmRfcmVsZWFzZShsZGV2LT5tZF9iZGV2KTsKLQotCWZwdXQobGRldi0+bG9fZmlsZSk7Ci0JZnB1dChsZGV2LT5tZF9maWxlKTsKKwlibGtkZXZfcHV0KGxkZXYtPmJhY2tpbmdfYmRldiwgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCk7CisJYmxrZGV2X3B1dChsZGV2LT5tZF9iZGV2LCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMKTsKIAogCWtmcmVlKGxkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbmwuYyBiL2RyaXZlcnMvYmxvY2svZHJiZC9kcmJkX25sLmMKaW5kZXggMjllNWM3MC4uOGNiZmFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRfbmwuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9ubC5jCkBAIC04NTUsNyArODU1LDcgQEAKIAlzZWN0b3JfdCBtYXhfcG9zc2libGVfc2VjdG9yczsKIAlzZWN0b3JfdCBtaW5fbWRfZGV2aWNlX3NlY3RvcnM7CiAJc3RydWN0IGRyYmRfYmFja2luZ19kZXYgKm5iYyA9IE5VTEw7IC8qIG5ld19iYWNraW5nX2NvbmYgKi8KLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqaW5vZGUyOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGxydV9jYWNoZSAqcmVzeW5jX2xydSA9IE5VTEw7CiAJdW5pb24gZHJiZF9zdGF0ZSBucywgb3M7CiAJdW5zaWduZWQgaW50IG1heF9zZWdfczsKQEAgLTkwNyw0NiArOTA3LDQwIEBACiAJCX0KIAl9CiAKLQluYmMtPmxvX2ZpbGUgPSBmaWxwX29wZW4obmJjLT5kYy5iYWNraW5nX2RldiwgT19SRFdSLCAwKTsKLQlpZiAoSVNfRVJSKG5iYy0+bG9fZmlsZSkpIHsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKG5iYy0+ZGMuYmFja2luZ19kZXYsCisJCQkJICBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMLCBtZGV2KTsKKwlpZiAoSVNfRVJSKGJkZXYpKSB7CiAJCWRldl9lcnIoREVWLCAib3BlbihcIiVzXCIpIGZhaWxlZCB3aXRoICVsZFxuIiwgbmJjLT5kYy5iYWNraW5nX2RldiwKLQkJICAgIFBUUl9FUlIobmJjLT5sb19maWxlKSk7Ci0JCW5iYy0+bG9fZmlsZSA9IE5VTEw7CisJCQlQVFJfRVJSKGJkZXYpKTsKIAkJcmV0Y29kZSA9IEVSUl9PUEVOX0RJU0s7CiAJCWdvdG8gZmFpbDsKIAl9CisJbmJjLT5iYWNraW5nX2JkZXYgPSBiZGV2OwogCi0JaW5vZGUgPSBuYmMtPmxvX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCi0JaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7Ci0JCXJldGNvZGUgPSBFUlJfRElTS19OT1RfQkRFVjsKLQkJZ290byBmYWlsOwotCX0KLQotCW5iYy0+bWRfZmlsZSA9IGZpbHBfb3BlbihuYmMtPmRjLm1ldGFfZGV2LCBPX1JEV1IsIDApOwotCWlmIChJU19FUlIobmJjLT5tZF9maWxlKSkgeworCS8qCisJICogbWV0YV9kZXZfaWR4ID49IDA6IGV4dGVybmFsIGZpeGVkIHNpemUsIHBvc3NpYmx5IG11bHRpcGxlCisJICogZHJiZCBzaGFyaW5nIG9uZSBtZXRhIGRldmljZS4gIFRPRE8gaW4gdGhhdCBjYXNlLCBwYXJhbm9pYQorCSAqIGNoZWNrIHRoYXQgW21kX2JkZXYsIG1ldGFfZGV2X2lkeF0gaXMgbm90IHlldCB1c2VkIGJ5IHNvbWUKKwkgKiBvdGhlciBkcmJkIG1pbm9yISAgKGlmIHlvdSB1c2UgZHJiZC5jb25mICsgZHJiZGFkbSwgdGhhdAorCSAqIHNob3VsZCBjaGVjayBpdCBmb3IgeW91IGFscmVhZHk7IGJ1dCBpZiB5b3UgZG9uJ3QsIG9yCisJICogc29tZW9uZSBmb29sZWQgaXQsIHdlIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhlcmUpCisJICovCisJYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChuYmMtPmRjLm1ldGFfZGV2LAorCQkJCSAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCwKKwkJCQkgIChuYmMtPmRjLm1ldGFfZGV2X2lkeCA8IDApID8KKwkJCQkgICh2b2lkICopbWRldiA6ICh2b2lkICopZHJiZF9tX2hvbGRlcik7CisJaWYgKElTX0VSUihiZGV2KSkgewogCQlkZXZfZXJyKERFViwgIm9wZW4oXCIlc1wiKSBmYWlsZWQgd2l0aCAlbGRcbiIsIG5iYy0+ZGMubWV0YV9kZXYsCi0JCSAgICBQVFJfRVJSKG5iYy0+bWRfZmlsZSkpOwotCQluYmMtPm1kX2ZpbGUgPSBOVUxMOworCQkJUFRSX0VSUihiZGV2KSk7CiAJCXJldGNvZGUgPSBFUlJfT1BFTl9NRF9ESVNLOwogCQlnb3RvIGZhaWw7CiAJfQorCW5iYy0+bWRfYmRldiA9IGJkZXY7CiAKLQlpbm9kZTIgPSBuYmMtPm1kX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCi0JaWYgKCFTX0lTQkxLKGlub2RlMi0+aV9tb2RlKSkgewotCQlyZXRjb2RlID0gRVJSX01EX05PVF9CREVWOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JbmJjLT5iYWNraW5nX2JkZXYgPSBpbm9kZS0+aV9iZGV2OwotCWlmIChiZF9jbGFpbShuYmMtPmJhY2tpbmdfYmRldiwgbWRldikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkcmJkOiBiZF9jbGFpbSglcCwlcCk7IGZhaWxlZCBbJXA7JXA7JXVdXG4iLAotCQkgICAgICAgbmJjLT5iYWNraW5nX2JkZXYsIG1kZXYsCi0JCSAgICAgICBuYmMtPmJhY2tpbmdfYmRldi0+YmRfaG9sZGVyLAotCQkgICAgICAgbmJjLT5iYWNraW5nX2JkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIsCi0JCSAgICAgICBuYmMtPmJhY2tpbmdfYmRldi0+YmRfaG9sZGVycyk7Ci0JCXJldGNvZGUgPSBFUlJfQkRDTEFJTV9ESVNLOworCWlmICgobmJjLT5iYWNraW5nX2JkZXYgPT0gbmJjLT5tZF9iZGV2KSAhPQorCSAgICAobmJjLT5kYy5tZXRhX2Rldl9pZHggPT0gRFJCRF9NRF9JTkRFWF9JTlRFUk5BTCB8fAorCSAgICAgbmJjLT5kYy5tZXRhX2Rldl9pZHggPT0gRFJCRF9NRF9JTkRFWF9GTEVYX0lOVCkpIHsKKwkJcmV0Y29kZSA9IEVSUl9NRF9JRFhfSU5WQUxJRDsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtOTU1LDI4ICs5NDksNyBAQAogCQkJb2Zmc2V0b2Yoc3RydWN0IGJtX2V4dGVudCwgbGNlKSk7CiAJaWYgKCFyZXN5bmNfbHJ1KSB7CiAJCXJldGNvZGUgPSBFUlJfTk9NRU07Ci0JCWdvdG8gcmVsZWFzZV9iZGV2X2ZhaWw7Ci0JfQotCi0JLyogbWV0YV9kZXZfaWR4ID49IDA6IGV4dGVybmFsIGZpeGVkIHNpemUsCi0JICogcG9zc2libHkgbXVsdGlwbGUgZHJiZCBzaGFyaW5nIG9uZSBtZXRhIGRldmljZS4KLQkgKiBUT0RPIGluIHRoYXQgY2FzZSwgcGFyYW5vaWEgY2hlY2sgdGhhdCBbbWRfYmRldiwgbWV0YV9kZXZfaWR4XSBpcwotCSAqIG5vdCB5ZXQgdXNlZCBieSBzb21lIG90aGVyIGRyYmQgbWlub3IhCi0JICogKGlmIHlvdSB1c2UgZHJiZC5jb25mICsgZHJiZGFkbSwKLQkgKiB0aGF0IHNob3VsZCBjaGVjayBpdCBmb3IgeW91IGFscmVhZHk7IGJ1dCBpZiB5b3UgZG9uJ3QsIG9yIHNvbWVvbmUKLQkgKiBmb29sZWQgaXQsIHdlIG5lZWQgdG8gZG91YmxlIGNoZWNrIGhlcmUpICovCi0JbmJjLT5tZF9iZGV2ID0gaW5vZGUyLT5pX2JkZXY7Ci0JaWYgKGJkX2NsYWltKG5iYy0+bWRfYmRldiwgKG5iYy0+ZGMubWV0YV9kZXZfaWR4IDwgMCkgPyAodm9pZCAqKW1kZXYKLQkJCQk6ICh2b2lkICopIGRyYmRfbV9ob2xkZXIpKSB7Ci0JCXJldGNvZGUgPSBFUlJfQkRDTEFJTV9NRF9ESVNLOwotCQlnb3RvIHJlbGVhc2VfYmRldl9mYWlsOwotCX0KLQotCWlmICgobmJjLT5iYWNraW5nX2JkZXYgPT0gbmJjLT5tZF9iZGV2KSAhPQotCSAgICAobmJjLT5kYy5tZXRhX2Rldl9pZHggPT0gRFJCRF9NRF9JTkRFWF9JTlRFUk5BTCB8fAotCSAgICAgbmJjLT5kYy5tZXRhX2Rldl9pZHggPT0gRFJCRF9NRF9JTkRFWF9GTEVYX0lOVCkpIHsKLQkJcmV0Y29kZSA9IEVSUl9NRF9JRFhfSU5WQUxJRDsKLQkJZ290byByZWxlYXNlX2JkZXYyX2ZhaWw7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAkvKiBSVCAtIGZvciBkcmJkX2dldF9tYXhfY2FwYWNpdHkoKSBEUkJEX01EX0lOREVYX0ZMRVhfSU5UICovCkBAIC05ODcsNyArOTYwLDcgQEAKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRyYmRfZ2V0X21heF9jYXBhY2l0eShuYmMpLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJjLT5kYy5kaXNrX3NpemUpOwogCQlyZXRjb2RlID0gRVJSX0RJU0tfVE9fU01BTEw7Ci0JCWdvdG8gcmVsZWFzZV9iZGV2Ml9mYWlsOworCQlnb3RvIGZhaWw7CiAJfQogCiAJaWYgKG5iYy0+ZGMubWV0YV9kZXZfaWR4IDwgMCkgewpAQCAtMTAwNCw3ICs5NzcsNyBAQAogCQlkZXZfd2FybihERVYsICJyZWZ1c2luZyBhdHRhY2g6IG1kLWRldmljZSB0b28gc21hbGwsICIKIAkJICAgICAiYXQgbGVhc3QgJWxsdSBzZWN0b3JzIG5lZWRlZCBmb3IgdGhpcyBtZXRhLWRpc2sgdHlwZVxuIiwKIAkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBtaW5fbWRfZGV2aWNlX3NlY3RvcnMpOwotCQlnb3RvIHJlbGVhc2VfYmRldjJfZmFpbDsKKwkJZ290byBmYWlsOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGUgbmV3IGRpc2sgaXMgYmlnIGVub3VnaApAQCAtMTAxMiw3ICs5ODUsNyBAQAogCWlmIChkcmJkX2dldF9tYXhfY2FwYWNpdHkobmJjKSA8CiAJICAgIGRyYmRfZ2V0X2NhcGFjaXR5KG1kZXYtPnRoaXNfYmRldikpIHsKIAkJcmV0Y29kZSA9IEVSUl9ESVNLX1RPX1NNQUxMOwotCQlnb3RvIHJlbGVhc2VfYmRldjJfZmFpbDsKKwkJZ290byBmYWlsOwogCX0KIAogCW5iYy0+a25vd25fc2l6ZSA9IGRyYmRfZ2V0X2NhcGFjaXR5KG5iYy0+YmFja2luZ19iZGV2KTsKQEAgLTEwMzUsNyArMTAwOCw3IEBACiAJcmV0Y29kZSA9IF9kcmJkX3JlcXVlc3Rfc3RhdGUobWRldiwgTlMoZGlzaywgRF9BVFRBQ0hJTkcpLCBDU19WRVJCT1NFKTsKIAlkcmJkX3Jlc3VtZV9pbyhtZGV2KTsKIAlpZiAocmV0Y29kZSA8IFNTX1NVQ0NFU1MpCi0JCWdvdG8gcmVsZWFzZV9iZGV2Ml9mYWlsOworCQlnb3RvIGZhaWw7CiAKIAlpZiAoIWdldF9sZGV2X2lmX3N0YXRlKG1kZXYsIERfQVRUQUNISU5HKSkKIAkJZ290byBmb3JjZV9kaXNrbGVzczsKQEAgLTEyNjksMTggKzEyNDIsMTQgQEAKICBmb3JjZV9kaXNrbGVzczoKIAlkcmJkX2ZvcmNlX3N0YXRlKG1kZXYsIE5TKGRpc2ssIERfRkFJTEVEKSk7CiAJZHJiZF9tZF9zeW5jKG1kZXYpOwotIHJlbGVhc2VfYmRldjJfZmFpbDoKLQlpZiAobmJjKQotCQliZF9yZWxlYXNlKG5iYy0+bWRfYmRldik7Ci0gcmVsZWFzZV9iZGV2X2ZhaWw6Ci0JaWYgKG5iYykKLQkJYmRfcmVsZWFzZShuYmMtPmJhY2tpbmdfYmRldik7CiAgZmFpbDoKIAlpZiAobmJjKSB7Ci0JCWlmIChuYmMtPmxvX2ZpbGUpCi0JCQlmcHV0KG5iYy0+bG9fZmlsZSk7Ci0JCWlmIChuYmMtPm1kX2ZpbGUpCi0JCQlmcHV0KG5iYy0+bWRfZmlsZSk7CisJCWlmIChuYmMtPmJhY2tpbmdfYmRldikKKwkJCWJsa2Rldl9wdXQobmJjLT5iYWNraW5nX2JkZXYsCisJCQkJICAgRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwgRk1PREVfRVhDTCk7CisJCWlmIChuYmMtPm1kX2JkZXYpCisJCQlibGtkZXZfcHV0KG5iYy0+bWRfYmRldiwKKwkJCQkgICBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMKTsKIAkJa2ZyZWUobmJjKTsKIAl9CiAJbGNfZGVzdHJveShyZXN5bmNfbHJ1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCmluZGV4IDI1ZTRkZmYuLmI5YmEwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKKysrIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwpAQCAtNTk3LDYgKzU5NywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5fc2VjdG9yX29mZnNldDsJLyogb2Zmc2V0IHdpdGhpbiBwaHlzaWNhbCBzZWN0b3IsCiAJCQkJCSAqIGV4cHJlc3NlZCBpbiB1bml0cyBvZiA1MTIgYnl0ZXMgKi8KIAorc3RhdGljIGlubGluZSBib29sIGRyaXZlX25vX2dlb20oaW50IGRyaXZlKQoreworCXJldHVybiAhY3VycmVudF90eXBlW2RyaXZlXSAmJiAhSVRZUEUoVURSUy0+ZmRfZGV2aWNlKTsKK30KKwogI2lmbmRlZiBmZF9lamVjdAogc3RhdGljIGlubGluZSBpbnQgZmRfZWplY3QoaW50IGRyaXZlKQogewpAQCAtMzc4Miw3ICszNzg3LDcgQEAKIAlpZiAodGVzdF9iaXQoRkRfRElTS19DSEFOR0VEX0JJVCwgJlVEUlMtPmZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChGRF9WRVJJRllfQklULCAmVURSUy0+ZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KGRyaXZlLCAmZmFrZV9jaGFuZ2UpIHx8Ci0JICAgICghSVRZUEUoVURSUy0+ZmRfZGV2aWNlKSAmJiAhY3VycmVudF90eXBlW2RyaXZlXSkpCisJICAgIGRyaXZlX25vX2dlb20oZHJpdmUpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTM4NDgsMTMgKzM4NTMsMTMgQEAKIHN0YXRpYyBpbnQgZmxvcHB5X3JldmFsaWRhdGUoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CiAJaW50IGRyaXZlID0gKGxvbmcpZGlzay0+cHJpdmF0ZV9kYXRhOwotI2RlZmluZSBOT19HRU9NICghY3VycmVudF90eXBlW2RyaXZlXSAmJiAhSVRZUEUoVURSUy0+ZmRfZGV2aWNlKSkKIAlpbnQgY2Y7CiAJaW50IHJlcyA9IDA7CiAKIAlpZiAodGVzdF9iaXQoRkRfRElTS19DSEFOR0VEX0JJVCwgJlVEUlMtPmZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChGRF9WRVJJRllfQklULCAmVURSUy0+ZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KGRyaXZlLCAmZmFrZV9jaGFuZ2UpIHx8IE5PX0dFT00pIHsKKwkgICAgdGVzdF9iaXQoZHJpdmUsICZmYWtlX2NoYW5nZSkgfHwKKwkgICAgZHJpdmVfbm9fZ2VvbShkcml2ZSkpIHsKIAkJaWYgKFdBUk4oYXRvbWljX3JlYWQoJnVzYWdlX2NvdW50KSA9PSAwLAogCQkJICJWRlM6IHJldmFsaWRhdGUgY2FsbGVkIG9uIG5vbi1vcGVuIGRldmljZS5cbiIpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zODYyLDcgKzM4NjcsNyBAQAogCQlsb2NrX2ZkYyhkcml2ZSwgZmFsc2UpOwogCQljZiA9ICh0ZXN0X2JpdChGRF9ESVNLX0NIQU5HRURfQklULCAmVURSUy0+ZmxhZ3MpIHx8CiAJCSAgICAgIHRlc3RfYml0KEZEX1ZFUklGWV9CSVQsICZVRFJTLT5mbGFncykpOwotCQlpZiAoIShjZiB8fCB0ZXN0X2JpdChkcml2ZSwgJmZha2VfY2hhbmdlKSB8fCBOT19HRU9NKSkgeworCQlpZiAoIShjZiB8fCB0ZXN0X2JpdChkcml2ZSwgJmZha2VfY2hhbmdlKSB8fCBkcml2ZV9ub19nZW9tKGRyaXZlKSkpIHsKIAkJCXByb2Nlc3NfZmRfcmVxdWVzdCgpOwkvKmFscmVhZHkgZG9uZSBieSBhbm90aGVyIHRocmVhZCAqLwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM4NzQsNyArMzg3OSw3IEBACiAJCWNsZWFyX2JpdChGRF9ESVNLX0NIQU5HRURfQklULCAmVURSUy0+ZmxhZ3MpOwogCQlpZiAoY2YpCiAJCQlVRFJTLT5nZW5lcmF0aW9uKys7Ci0JCWlmIChOT19HRU9NKSB7CisJCWlmIChkcml2ZV9ub19nZW9tKGRyaXZlKSkgewogCQkJLyogYXV0by1zZW5zaW5nICovCiAJCQlyZXMgPSBfX2Zsb3BweV9yZWFkX2Jsb2NrXzAob3BlbmVkX2JkZXZbZHJpdmVdKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggN2VhMGJlYS4uNDRlMThjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTM5NSwxMSArMzk1LDcgQEAKIAlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gcC0+bG87CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidWYtPnBhZ2U7CiAJc2VjdG9yX3QgSVY7Ci0JaW50IHNpemUsIHJldDsKLQotCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7Ci0JaWYgKHVubGlrZWx5KHJldCkpCi0JCXJldHVybiByZXQ7CisJaW50IHNpemU7CiAKIAlJViA9ICgoc2VjdG9yX3QpIHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpICsKIAkJCQkJCQkoYnVmLT5vZmZzZXQgPj4gOSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IDE5YjM1NjguLjc3ZDcwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC0yMjk2LDE1ICsyMjk2LDEyIEBACiAJICogc28gYmRnZXQoKSBjYW4ndCBmYWlsLgogCSAqLwogCWJkZ2V0KHBkLT5iZGV2LT5iZF9kZXYpOwotCWlmICgocmV0ID0gYmxrZGV2X2dldChwZC0+YmRldiwgRk1PREVfUkVBRCkpKQorCWlmICgocmV0ID0gYmxrZGV2X2dldChwZC0+YmRldiwgRk1PREVfUkVBRCB8IEZNT0RFX0VYQ0wsIHBkKSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChyZXQgPSBiZF9jbGFpbShwZC0+YmRldiwgcGQpKSkKLQkJZ290byBvdXRfcHV0ZGV2OwotCiAJaWYgKChyZXQgPSBwa3RfZ2V0X2xhc3Rfd3JpdHRlbihwZCwgJmxiYSkpKSB7CiAJCXByaW50ayhEUklWRVJfTkFNRSI6IHBrdF9nZXRfbGFzdF93cml0dGVuIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X3VuY2xhaW07CisJCWdvdG8gb3V0X3B1dGRldjsKIAl9CiAKIAlzZXRfY2FwYWNpdHkocGQtPmRpc2ssIGxiYSA8PCAyKTsKQEAgLTIzMTQsNyArMjMxMSw3IEBACiAJcSA9IGJkZXZfZ2V0X3F1ZXVlKHBkLT5iZGV2KTsKIAlpZiAod3JpdGUpIHsKIAkJaWYgKChyZXQgPSBwa3Rfb3Blbl93cml0ZShwZCkpKQotCQkJZ290byBvdXRfdW5jbGFpbTsKKwkJCWdvdG8gb3V0X3B1dGRldjsKIAkJLyoKIAkJICogU29tZSBDRFJXIGRyaXZlcyBjYW4gbm90IGhhbmRsZSB3cml0ZXMgbGFyZ2VyIHRoYW4gb25lIHBhY2tldCwKIAkJICogZXZlbiBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBwYWNrZXQgc2l6ZS4KQEAgLTIzMjksMjMgKzIzMjYsMjEgQEAKIAl9CiAKIAlpZiAoKHJldCA9IHBrdF9zZXRfc2VnbWVudF9tZXJnaW5nKHBkLCBxKSkpCi0JCWdvdG8gb3V0X3VuY2xhaW07CisJCWdvdG8gb3V0X3B1dGRldjsKIAogCWlmICh3cml0ZSkgewogCQlpZiAoIXBrdF9ncm93X3BrdGxpc3QocGQsIENPTkZJR19DRFJPTV9QS1RDRFZEX0JVRkZFUlMpKSB7CiAJCQlwcmludGsoRFJJVkVSX05BTUUiOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgYnVmZmVyc1xuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfdW5jbGFpbTsKKwkJCWdvdG8gb3V0X3B1dGRldjsKIAkJfQogCQlwcmludGsoRFJJVkVSX05BTUUiOiAlbHVrQiBhdmFpbGFibGUgb24gZGlzY1xuIiwgbGJhIDw8IDEpOwogCX0KIAogCXJldHVybiAwOwogCi1vdXRfdW5jbGFpbToKLQliZF9yZWxlYXNlKHBkLT5iZGV2KTsKIG91dF9wdXRkZXY6Ci0JYmxrZGV2X3B1dChwZC0+YmRldiwgRk1PREVfUkVBRCk7CisJYmxrZGV2X3B1dChwZC0+YmRldiwgRk1PREVfUkVBRCB8IEZNT0RFX0VYQ0wpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0yMzYyLDggKzIzNTcsNyBAQAogCXBrdF9sb2NrX2Rvb3IocGQsIDApOwogCiAJcGt0X3NldF9zcGVlZChwZCwgTUFYX1NQRUVELCBNQVhfU1BFRUQpOwotCWJkX3JlbGVhc2UocGQtPmJkZXYpOwotCWJsa2Rldl9wdXQocGQtPmJkZXYsIEZNT0RFX1JFQUQpOworCWJsa2Rldl9wdXQocGQtPmJkZXYsIEZNT0RFX1JFQUQgfCBGTU9ERV9FWENMKTsKIAogCXBrdF9zaHJpbmtfcGt0bGlzdChwZCk7CiB9CkBAIC0yNzMzLDcgKzI3MjcsNyBAQAogCWJkZXYgPSBiZGdldChkZXYpOwogCWlmICghYmRldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0ID0gYmxrZGV2X2dldChiZGV2LCBGTU9ERV9SRUFEIHwgRk1PREVfTkRFTEFZKTsKKwlyZXQgPSBibGtkZXZfZ2V0KGJkZXYsIEZNT0RFX1JFQUQgfCBGTU9ERV9OREVMQVksIE5VTEwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcmJkLmMgYi9kcml2ZXJzL2Jsb2NrL3JiZC5jCmluZGV4IDAwOGQ0YTAuLmUxZTM4YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9yYmQuYwpAQCAtMTc5MCwxOCArMTc5MCwyOSBAQAogCiAJcmMgPSByYmRfYnVzX2FkZF9kZXYocmJkX2Rldik7CiAJaWYgKHJjKQotCQlnb3RvIGVycl9vdXRfZGlzazsKKwkJZ290byBlcnJfb3V0X2Jsa2RldjsKKwogCS8qIHNldCB1cCBhbmQgYW5ub3VuY2UgYmxrZGV2IG1hcHBpbmcgKi8KIAlyYyA9IHJiZF9pbml0X2Rpc2socmJkX2Rldik7CiAJaWYgKHJjKQotCQlnb3RvIGVycl9vdXRfYmxrZGV2OworCQlnb3RvIGVycl9vdXRfYnVzOwogCiAJcmV0dXJuIGNvdW50OwogCitlcnJfb3V0X2J1czoKKwltdXRleF9sb2NrX25lc3RlZCgmY3RsX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJbGlzdF9kZWxfaW5pdCgmcmJkX2Rldi0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZjdGxfbXV0ZXgpOworCisJLyogdGhpcyB3aWxsIGFsc28gY2xlYW4gdXAgcmVzdCBvZiByYmRfZGV2IHN0dWZmICovCisKKwlyYmRfYnVzX2RlbF9kZXYocmJkX2Rldik7CisJa2ZyZWUob3B0aW9ucyk7CisJa2ZyZWUobW9uX2Rldl9uYW1lKTsKKwlyZXR1cm4gcmM7CisKIGVycl9vdXRfYmxrZGV2OgogCXVucmVnaXN0ZXJfYmxrZGV2KHJiZF9kZXYtPm1ham9yLCByYmRfZGV2LT5uYW1lKTsKLWVycl9vdXRfZGlzazoKLQlyYmRfZnJlZV9kaXNrKHJiZF9kZXYpOwogZXJyX291dF9jbGllbnQ6CiAJcmJkX3B1dF9jbGllbnQocmJkX2Rldik7CiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmN0bF9tdXRleCwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCmluZGV4IGFmMTNjNjJkLi4xNDAzM2EzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMTM0OCw3ICsxMzQ4LDEwIEBACiAJaWYgKCFDRFJPTV9DQU4oQ0RDX1NFTEVDVF9ESVNDKSkKIAkJcmV0dXJuIC1FRFJJVkVfQ0FOVF9ET19USElTOwogCi0JKHZvaWQpIGNkaS0+b3BzLT5tZWRpYV9jaGFuZ2VkKGNkaSwgc2xvdCk7CisJaWYgKGNkaS0+b3BzLT5jaGVja19ldmVudHMpCisJCWNkaS0+b3BzLT5jaGVja19ldmVudHMoY2RpLCAwLCBzbG90KTsKKwllbHNlCisJCWNkaS0+b3BzLT5tZWRpYV9jaGFuZ2VkKGNkaSwgc2xvdCk7CiAKIAlpZiAoc2xvdCA9PSBDRFNMX05PTkUpIHsKIAkJLyogc2V0IG1lZGlhIGNoYW5nZWQgYml0cywgb24gYm90aCBxdWV1ZXMgKi8KQEAgLTEzOTIsNiArMTM5NSw0MiBAQAogCXJldHVybiBzbG90OwogfQogCisvKgorICogQXMgY2Ryb20gaW1wbGVtZW50cyBhbiBleHRyYSBpb2N0bCBjb25zdW1lciBmb3IgbWVkaWEgY2hhbmdlZAorICogZXZlbnQsIGl0IG5lZWRzIHRvIGJ1ZmZlciAtPmNoZWNrX2V2ZW50cygpIG91dHB1dCwgc3VjaCB0aGF0IGV2ZW50CisgKiBpcyBub3QgbG9zdCBmb3IgYm90aCB0aGUgdXN1YWwgVkZTIGFuZCBpb2N0bCBwYXRocy4KKyAqIGNkaS0+e3Zmc3xpb2N0bH1fZXZlbnRzIGFyZSB1c2VkIHRvIGJ1ZmZlciBwZW5kaW5nIGV2ZW50cyBmb3IgZWFjaAorICogcGF0aC4KKyAqCisgKiBYWFg6IExvY2tpbmcgaXMgbm9uLWV4aXN0ZW50LiAgY2RpLT5vcHMtPmNoZWNrX2V2ZW50cygpIGNhbiBiZQorICogY2FsbGVkIGluIHBhcmFsbGVsIGFuZCBidWZmZXJpbmcgZmllbGRzIGFyZSBhY2Nlc3NlZCB3aXRob3V0IGFueQorICogZXhjbHVzaW9uLiAgVGhlIG9yaWdpbmFsIG1lZGlhX2NoYW5nZWQgY29kZSBoYWQgdGhlIHNhbWUgcHJvYmxlbS4KKyAqIEl0IG1pZ2h0IGJlIGJldHRlciB0byBzaW1wbHkgZGVwcmVjYXRlIENEUk9NX01FRElBX0NIQU5HRUQgaW9jdGwKKyAqIGFuZCByZW1vdmUgdGhpcyBjcnVmdCBhbHRvZ2V0aGVyLiAgSXQgZG9lc24ndCBoYXZlIG11Y2ggdXNlZnVsbmVzcworICogYXQgdGhpcyBwb2ludC4KKyAqLworc3RhdGljIHZvaWQgY2Ryb21fdXBkYXRlX2V2ZW50cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQl1bnNpZ25lZCBpbnQgY2xlYXJpbmcpCit7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKworCWV2ZW50cyA9IGNkaS0+b3BzLT5jaGVja19ldmVudHMoY2RpLCBjbGVhcmluZywgQ0RTTF9DVVJSRU5UKTsKKwljZGktPnZmc19ldmVudHMgfD0gZXZlbnRzOworCWNkaS0+aW9jdGxfZXZlbnRzIHw9IGV2ZW50czsKK30KKwordW5zaWduZWQgaW50IGNkcm9tX2NoZWNrX2V2ZW50cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQl1bnNpZ25lZCBpbnQgY2xlYXJpbmcpCit7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKworCWNkcm9tX3VwZGF0ZV9ldmVudHMoY2RpLCBjbGVhcmluZyk7CisJZXZlbnRzID0gY2RpLT52ZnNfZXZlbnRzOworCWNkaS0+dmZzX2V2ZW50cyA9IDA7CisJcmV0dXJuIGV2ZW50czsKK30KK0VYUE9SVF9TWU1CT0woY2Ryb21fY2hlY2tfZXZlbnRzKTsKKwogLyogV2Ugd2FudCB0byBtYWtlIG1lZGlhX2NoYW5nZWQgYWNjZXNzaWJsZSB0byB0aGUgdXNlciB0aHJvdWdoIGFuCiAgKiBpb2N0bC4gVGhlIG1haW4gcHJvYmxlbSBub3cgaXMgdGhhdCB3ZSBtdXN0IGRvdWJsZS1idWZmZXIgdGhlCiAgKiBsb3ctbGV2ZWwgaW1wbGVtZW50YXRpb24sIHRvIGFzc3VyZSB0aGF0IHRoZSBWRlMgYW5kIHRoZSB1c2VyIGJvdGgKQEAgLTE0MDMsMTUgKzE0NDIsMjYgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IChxdWV1ZSAmIDEpKTsKIAlpbnQgcmV0ID0gISEoY2RpLT5tY19mbGFncyAmIG1hc2spOworCWJvb2wgY2hhbmdlZDsKIAogCWlmICghQ0RST01fQ0FOKENEQ19NRURJQV9DSEFOR0VEKSkKLQkgICAgcmV0dXJuIHJldDsKKwkJcmV0dXJuIHJldDsKKwogCS8qIGNoYW5nZWQgc2luY2UgbGFzdCBjYWxsPyAqLwotCWlmIChjZGktPm9wcy0+bWVkaWFfY2hhbmdlZChjZGksIENEU0xfQ1VSUkVOVCkpIHsKKwlpZiAoY2RpLT5vcHMtPmNoZWNrX2V2ZW50cykgeworCQlCVUdfT04oIXF1ZXVlKTsJLyogc2hvdWxkbid0IGJlIGNhbGxlZCBmcm9tIFZGUyBwYXRoICovCisJCWNkcm9tX3VwZGF0ZV9ldmVudHMoY2RpLCBESVNLX0VWRU5UX01FRElBX0NIQU5HRSk7CisJCWNoYW5nZWQgPSBjZGktPmlvY3RsX2V2ZW50cyAmIERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFOworCQljZGktPmlvY3RsX2V2ZW50cyA9IDA7CisJfSBlbHNlCisJCWNoYW5nZWQgPSBjZGktPm9wcy0+bWVkaWFfY2hhbmdlZChjZGksIENEU0xfQ1VSUkVOVCk7CisKKwlpZiAoY2hhbmdlZCkgewogCQljZGktPm1jX2ZsYWdzID0gMHgzOyAgICAvKiBzZXQgYml0IG9uIGJvdGggcXVldWVzICovCiAJCXJldCB8PSAxOwogCQljZGktPm1lZGlhX3dyaXR0ZW4gPSAwOwogCX0KKwogCWNkaS0+bWNfZmxhZ3MgJj0gfm1hc2s7ICAgICAgICAgLyogY2xlYXIgYml0ICovCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggZDRhNzc3Ni4uMGYxNzVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTEwNDcsMTUgKzEwNDcsNiBAQAogCSAgcGM4NzM2eF9ncGlvIGRyaXZlcnMuICBJZiB0aG9zZSBkcml2ZXJzIGFyZSBidWlsdCBhcwogCSAgbW9kdWxlcywgdGhpcyBvbmUgd2lsbCBiZSB0b28sIG5hbWVkIG5zY19ncGlvCiAKLWNvbmZpZyBDUzU1MzVfR1BJTwotCXRyaXN0YXRlICJBTUQgQ1M1NTM1L0NTNTUzNiBHUElPIChHZW9kZSBDb21wYW5pb24gRGV2aWNlKSIKLQlkZXBlbmRzIG9uIFg4Nl8zMgotCWhlbHAKLQkgIEdpdmUgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9uIHRoZSBBTUQgQ1M1NTM1IGFuZAotCSAgQ1M1NTM2IEdlb2RlIGNvbXBhbmlvbiBkZXZpY2VzLgotCi0JICBJZiBjb21waWxlZCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgY3M1NTM1X2dwaW8uCi0KIGNvbmZpZyBSQVdfRFJJVkVSCiAJdHJpc3RhdGUgIlJBVyBkcml2ZXIgKC9kZXYvcmF3L3Jhd04pIgogCWRlcGVuZHMgb24gQkxPQ0sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCBmYTBiODI0Li4xZTlkZmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC04Miw3ICs4Miw2IEBACiBvYmotJChDT05GSUdfU0N4MjAwX0dQSU8pCSs9IHNjeDIwMF9ncGlvLm8KIG9iai0kKENPTkZJR19QQzg3MzZ4X0dQSU8pCSs9IHBjODczNnhfZ3Bpby5vCiBvYmotJChDT05GSUdfTlNDX0dQSU8pCQkrPSBuc2NfZ3Bpby5vCi1vYmotJChDT05GSUdfQ1M1NTM1X0dQSU8pCSs9IGNzNTUzNV9ncGlvLm8KIG9iai0kKENPTkZJR19HUElPX1RCMDIxOSkJKz0gdGIwMjE5Lm8KIG9iai0kKENPTkZJR19URUxDTE9DSykJCSs9IHRsY2xrLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaCBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKaW5kZXggNTI1OTA2NS4uM2U2N2RkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCkBAIC0xMjAsNyArMTIwLDYgQEAKIAl2b2lkICgqYWdwX2Rlc3Ryb3lfcGFnZSkoc3RydWN0IHBhZ2UgKiwgaW50IGZsYWdzKTsKIAl2b2lkICgqYWdwX2Rlc3Ryb3lfcGFnZXMpKHN0cnVjdCBhZ3BfbWVtb3J5ICopOwogCWludCAoKmFncF90eXBlX3RvX21hc2tfdHlwZSkgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgaW50KTsKLQl2b2lkICgqY2hpcHNldF9mbHVzaCkoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKIH07CiAKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMKaW5kZXggOWQyYzk3YS4uYTQ4ZTA1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5jCkBAIC0yNzYsNyArMjc2LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFHUElPQ19DSElQU0VUX0ZMVVNIMzI6Ci0JCXJldF92YWwgPSBhZ3Bpb2NfY2hpcHNldF9mbHVzaF93cmFwKGN1cnJfcHJpdik7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaCBiL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmgKaW5kZXggMGM5Njc4YS4uZjMwZTBmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5oCkBAIC0xMDIsNiArMTAyLDUgQEAKIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfYWxsb2NhdGVfbWVtb3J5X3dyYXAoc2l6ZV90IHBnX2NvdW50LCB1MzIgdHlwZSk7CiBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KTsKIHN0cnVjdCBhZ3BfY2xpZW50ICphZ3BfZmluZF9jbGllbnRfYnlfcGlkKHBpZF90IGlkKTsKLWludCBhZ3Bpb2NfY2hpcHNldF9mbHVzaF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KTsKIAogI2VuZGlmIC8qIF9BR1BfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwppbmRleCAzY2I0NTM5Li4yZTA0NDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCkBAIC05NTcsMTMgKzk1Nyw2IEBACiAJcmV0dXJuIGFncF91bmJpbmRfbWVtb3J5KG1lbW9yeSk7CiB9CiAKLWludCBhZ3Bpb2NfY2hpcHNldF9mbHVzaF93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQotewotCURCRygiIik7Ci0JYWdwX2ZsdXNoX2NoaXBzZXQoYWdwX2JyaWRnZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBsb25nIGFncF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTEwMzksNyArMTAzMiw2IEBACiAJCWJyZWFrOwogCSAgICAgICAKIAljYXNlIEFHUElPQ19DSElQU0VUX0ZMVVNIOgotCQlyZXRfdmFsID0gYWdwaW9jX2NoaXBzZXRfZmx1c2hfd3JhcChjdXJyX3ByaXYpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKaW5kZXggNDk1NmYxYy4uMDEyY2JhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKQEAgLTgxLDEzICs4MSw2IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkIGFncF9mbHVzaF9jaGlwc2V0KHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKLXsKLQlpZiAoYnJpZGdlLT5kcml2ZXItPmNoaXBzZXRfZmx1c2gpCi0JCWJyaWRnZS0+ZHJpdmVyLT5jaGlwc2V0X2ZsdXNoKGJyaWRnZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGFncF9mbHVzaF9jaGlwc2V0KTsKLQogLyoKICAqIFVzZSBrbWFsbG9jIGlmIHBvc3NpYmxlIGZvciB0aGUgcGFnZSBsaXN0LiBPdGhlcndpc2UgZmFsbCBiYWNrIHRvCiAgKiB2bWFsbG9jLiBUaGlzIHNwZWVkcyB0aGluZ3MgdXAgYW5kIGFsc28gc2F2ZXMgbWVtb3J5IGZvciBzbWFsbCBBR1AKQEAgLTQ4NywyNiArNDgwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWdwX3VuYmluZF9tZW1vcnkpOwogCi0vKioKLSAqCWFncF9yZWJpbmRfZW1tb3J5ICAtICBSZXdyaXRlIHRoZSBlbnRpcmUgR0FUVCwgdXNlZnVsIG9uIHJlc3VtZQotICovCi1pbnQgYWdwX3JlYmluZF9tZW1vcnkodm9pZCkKLXsKLQlzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycjsKLQlpbnQgcmV0X3ZhbCA9IDA7Ci0KLQlzcGluX2xvY2soJmFncF9icmlkZ2UtPm1hcHBlZF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cnIsICZhZ3BfYnJpZGdlLT5tYXBwZWRfbGlzdCwgbWFwcGVkX2xpc3QpIHsKLQkJcmV0X3ZhbCA9IGN1cnItPmJyaWRnZS0+ZHJpdmVyLT5pbnNlcnRfbWVtb3J5KGN1cnIsCi0JCQkJCQkJICAgICAgY3Vyci0+cGdfc3RhcnQsCi0JCQkJCQkJICAgICAgY3Vyci0+dHlwZSk7Ci0JCWlmIChyZXRfdmFsICE9IDApCi0JCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFncF9icmlkZ2UtPm1hcHBlZF9sb2NrKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLUVYUE9SVF9TWU1CT0woYWdwX3JlYmluZF9tZW1vcnkpOwogCiAvKiBFbmQgLSBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgc3dhcHBpbmcgb2YgYWdwX21lbW9yeSBpbnRvIHRoZSBHQVRUICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCmluZGV4IGU3MmY0OWQuLjg1N2RmMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwpAQCAtNzE3LDggKzcxNyw4IEBACiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODIwX1VQX0hCLCAiaTgyMCIsICZpbnRlbF84MjBfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODMwX0hCLCAiODMwTSIsICZpbnRlbF84MzBtcF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDBfSEIsICJpODQwIiwgJmludGVsXzg0MF9kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIsICI4NDVHIiwgJmludGVsXzg0NV9kcml2ZXIgfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVHX0hCLCAiODMwTSIsICZpbnRlbF84NDVfZHJpdmVyIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1X0hCLCAiaTg0NSIsICZpbnRlbF84NDVfZHJpdmVyIH0sCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQiwgIjg0NUciLCAmaW50ZWxfODQ1X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1MF9IQiwgImk4NTAiLCAmaW50ZWxfODUwX2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1NF9IQiwgIjg1NCIsICZpbnRlbF84NDVfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIsICI4NTVQTSIsICZpbnRlbF84NDVfZHJpdmVyIH0sCkBAIC04MjgsMTQgKzgyOCw5IEBACiBzdGF0aWMgaW50IGFncF9pbnRlbF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCByZXRfdmFsOwogCiAJYnJpZGdlLT5kcml2ZXItPmNvbmZpZ3VyZSgpOwogCi0JcmV0X3ZhbCA9IGFncF9yZWJpbmRfbWVtb3J5KCk7Ci0JaWYgKHJldF92YWwgIT0gMCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaCBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKaW5kZXggOTA1MzlkZi4uYzE5NWJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaAorKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCkBAIC03NSw2ICs3NSw4IEBACiAjZGVmaW5lIEk4MTBfR01TX0RJU0FCTEUJMHgwMDAwMDAwMAogI2RlZmluZSBJODEwX1BHRVRCTF9DVEwJCTB4MjAyMAogI2RlZmluZSBJODEwX1BHRVRCTF9FTkFCTEVECTB4MDAwMDAwMDEKKy8qIE5vdGU6IFBHRVRCTF9DVEwyIGhhcyBhIGRpZmZlcmVudCBvZmZzZXQgb24gRzMzLiAqLworI2RlZmluZSBJOTY1X1BHRVRCTF9DVEwyCTB4MjBjNAogI2RlZmluZSBJOTY1X1BHRVRCTF9TSVpFX01BU0sJMHgwMDAwMDAwZQogI2RlZmluZSBJOTY1X1BHRVRCTF9TSVpFXzUxMktCCSgwIDw8IDEpCiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfMjU2S0IJKDEgPDwgMSkKQEAgLTgyLDkgKzg0LDE3IEBACiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfMU1CCSgzIDw8IDEpCiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfMk1CCSg0IDw8IDEpCiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfMV81TUIJKDUgPDwgMSkKLSNkZWZpbmUgRzMzX1BHRVRCTF9TSVpFX01BU0sgICAgKDMgPDwgOCkKLSNkZWZpbmUgRzMzX1BHRVRCTF9TSVpFXzFNICAgICAgKDEgPDwgOCkKLSNkZWZpbmUgRzMzX1BHRVRCTF9TSVpFXzJNICAgICAgKDIgPDwgOCkKKyNkZWZpbmUgRzMzX0dNQ0hfU0laRV9NQVNLCSgzIDw8IDgpCisjZGVmaW5lIEczM19HTUNIX1NJWkVfMU0JKDEgPDwgOCkKKyNkZWZpbmUgRzMzX0dNQ0hfU0laRV8yTQkoMiA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFX01BU0sJKDB4ZiA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFXzFNCSgweDEgPDwgOCkKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV8yTQkoMHgzIDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMU0JKDB4OSA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzFfNU0JKDB4YSA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFX1ZUXzJNCSgweGMgPDwgOCkKKworI2RlZmluZSBHRlhfRkxTSF9DTlRMCQkweDIxNzAgLyogOTE1KyAqLwogCiAjZGVmaW5lIEk4MTBfRFJBTV9DVEwJCTB4MzAwMAogI2RlZmluZSBJODEwX0RSQU1fUk9XXzAJCTB4MDAwMDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCmluZGV4IDI5YWM2ZDQuLjgyNmFiMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlICJhZ3AuaCIKICNpbmNsdWRlICJpbnRlbC1hZ3AuaCIKLSNpbmNsdWRlIDxsaW51eC9pbnRlbC1ndHQuaD4KICNpbmNsdWRlIDxkcm0vaW50ZWwtZ3R0Lmg+CiAKIC8qCkBAIC0zOSw0MCArMzgsMTIgQEAKICNkZWZpbmUgVVNFX1BDSV9ETUFfQVBJIDAKICNlbmRpZgogCi0vKiBNYXggYW1vdW50IG9mIHN0b2xlbiBzcGFjZSwgYW55dGhpbmcgYWJvdmUgd2lsbCBiZSByZXR1cm5lZCB0byBMaW51eCAqLwotaW50IGludGVsX21heF9zdG9sZW4gPSAzMiAqIDEwMjQgKiAxMDI0OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2k4MTBfc2l6ZXNbXSA9Ci17Ci0JezY0LCAxNjM4NCwgNH0sCi0JLyogVGhlIDMyTSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgNjRrIGdhdHQgKi8KLQl7MzIsIDgxOTIsIDR9Ci19OwotCi0jZGVmaW5lIEFHUF9EQ0FDSEVfTUVNT1JZCTEKLSNkZWZpbmUgQUdQX1BIWVNfTUVNT1JZCQkyCi0jZGVmaW5lIElOVEVMX0FHUF9DQUNIRURfTUVNT1JZIDMKLQotc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfaTgxMF9tYXNrc1tdID0KLXsKLQl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKLQl7Lm1hc2sgPSAoSTgxMF9QVEVfVkFMSUQgfCBJODEwX1BURV9MT0NBTCksIC50eXBlID0gQUdQX0RDQUNIRV9NRU1PUll9LAotCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9LAotCXsubWFzayA9IEk4MTBfUFRFX1ZBTElEIHwgSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRCwKLQkgLnR5cGUgPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWX0KLX07Ci0KLSNkZWZpbmUgSU5URUxfQUdQX1VOQ0FDSEVEX01FTU9SWSAgICAgICAgICAgICAgMAotI2RlZmluZSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWV9MTEMgICAgICAgICAgICAxCi0jZGVmaW5lIElOVEVMX0FHUF9DQUNIRURfTUVNT1JZX0xMQ19HRkRUICAgICAgIDIKLSNkZWZpbmUgSU5URUxfQUdQX0NBQ0hFRF9NRU1PUllfTExDX01MQyAgICAgICAgMwotI2RlZmluZSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWV9MTENfTUxDX0dGRFQgICA0Ci0KIHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIHsKIAl1bnNpZ25lZCBpbnQgZ2VuIDogODsKIAl1bnNpZ25lZCBpbnQgaXNfZzMzIDogMTsKIAl1bnNpZ25lZCBpbnQgaXNfcGluZXZpZXcgOiAxOwogCXVuc2lnbmVkIGludCBpc19pcm9ubGFrZSA6IDE7CisJdW5zaWduZWQgaW50IGhhc19wZ3RibF9lbmFibGUgOiAxOwogCXVuc2lnbmVkIGludCBkbWFfbWFza19zaXplIDogODsKIAkvKiBDaGlwc2V0IHNwZWNpZmljIEdUVCBzZXR1cCAqLwogCWludCAoKnNldHVwKSh2b2lkKTsKQEAgLTk1LDEzICs2NiwxNCBAQAogCXU4IF9faW9tZW0gKnJlZ2lzdGVyczsKIAlwaHlzX2FkZHJfdCBndHRfYnVzX2FkZHI7CiAJcGh5c19hZGRyX3QgZ21hX2J1c19hZGRyOwotCXBoeXNfYWRkcl90IHB0ZV9idXNfYWRkcjsKKwl1MzIgUEdFVEJMX3NhdmU7CiAJdTMyIF9faW9tZW0gKmd0dDsJCS8qIEk5MTVHICovCiAJaW50IG51bV9kY2FjaGVfZW50cmllczsKIAl1bmlvbiB7CiAJCXZvaWQgX19pb21lbSAqaTl4eF9mbHVzaF9wYWdlOwogCQl2b2lkICppOHh4X2ZsdXNoX3BhZ2U7CiAJfTsKKwljaGFyICppODF4X2d0dF90YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqaTh4eF9wYWdlOwogCXN0cnVjdCByZXNvdXJjZSBpZnBfcmVzb3VyY2U7CiAJaW50IHJlc291cmNlX3ZhbGlkOwpAQCAtMTEzLDQyICs4NSwzMSBAQAogI2RlZmluZSBJU19HMzMJCWludGVsX3ByaXZhdGUuZHJpdmVyLT5pc19nMzMKICNkZWZpbmUgSVNfUElORVZJRVcJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmlzX3BpbmV2aWV3CiAjZGVmaW5lIElTX0lST05MQUtFCWludGVsX3ByaXZhdGUuZHJpdmVyLT5pc19pcm9ubGFrZQorI2RlZmluZSBIQVNfUEdUQkxfRU4JaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmhhc19wZ3RibF9lbmFibGUKIAotc3RhdGljIHZvaWQgaW50ZWxfYWdwX2ZyZWVfc2dsaXN0KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCi17Ci0Jc3RydWN0IHNnX3RhYmxlIHN0OwotCi0Jc3Quc2dsID0gbWVtLT5zZ19saXN0OwotCXN0Lm9yaWdfbmVudHMgPSBzdC5uZW50cyA9IG1lbS0+cGFnZV9jb3VudDsKLQotCXNnX2ZyZWVfdGFibGUoJnN0KTsKLQotCW1lbS0+c2dfbGlzdCA9IE5VTEw7Ci0JbWVtLT5udW1fc2cgPSAwOwotfQotCi1zdGF0aWMgaW50IGludGVsX2FncF9tYXBfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCitpbnQgaW50ZWxfZ3R0X21hcF9tZW1vcnkoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLAorCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNnX2xpc3QsIGludCAqbnVtX3NnKQogewogCXN0cnVjdCBzZ190YWJsZSBzdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0JaWYgKG1lbS0+c2dfbGlzdCkKKwlpZiAoKnNnX2xpc3QpCiAJCXJldHVybiAwOyAvKiBhbHJlYWR5IG1hcHBlZCAoZm9yIGUuZy4gcmVzdW1lICovCiAKLQlEQkcoInRyeSBtYXBwaW5nICVsdSBwYWdlc1xuIiwgKHVuc2lnbmVkIGxvbmcpbWVtLT5wYWdlX2NvdW50KTsKKwlEQkcoInRyeSBtYXBwaW5nICVsdSBwYWdlc1xuIiwgKHVuc2lnbmVkIGxvbmcpbnVtX2VudHJpZXMpOwogCi0JaWYgKHNnX2FsbG9jX3RhYmxlKCZzdCwgbWVtLT5wYWdlX2NvdW50LCBHRlBfS0VSTkVMKSkKKwlpZiAoc2dfYWxsb2NfdGFibGUoJnN0LCBudW1fZW50cmllcywgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZXJyOwogCi0JbWVtLT5zZ19saXN0ID0gc2cgPSBzdC5zZ2w7CisJKnNnX2xpc3QgPSBzZyA9IHN0LnNnbDsKIAotCWZvciAoaSA9IDAgOyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIHNnID0gc2dfbmV4dChzZykpCi0JCXNnX3NldF9wYWdlKHNnLCBtZW0tPnBhZ2VzW2ldLCBQQUdFX1NJWkUsIDApOworCWZvciAoaSA9IDAgOyBpIDwgbnVtX2VudHJpZXM7IGkrKywgc2cgPSBzZ19uZXh0KHNnKSkKKwkJc2dfc2V0X3BhZ2Uoc2csIHBhZ2VzW2ldLCBQQUdFX1NJWkUsIDApOwogCi0JbWVtLT5udW1fc2cgPSBwY2lfbWFwX3NnKGludGVsX3ByaXZhdGUucGNpZGV2LCBtZW0tPnNnX2xpc3QsCi0JCQkJIG1lbS0+cGFnZV9jb3VudCwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAodW5saWtlbHkoIW1lbS0+bnVtX3NnKSkKKwkqbnVtX3NnID0gcGNpX21hcF9zZyhpbnRlbF9wcml2YXRlLnBjaWRldiwgKnNnX2xpc3QsCisJCQkJIG51bV9lbnRyaWVzLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICh1bmxpa2VseSghKm51bV9zZykpCiAJCWdvdG8gZXJyOwogCiAJcmV0dXJuIDA7CkBAIC0xNTcsOTAgKzExOCwyMiBAQAogCXNnX2ZyZWVfdGFibGUoJnN0KTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X21hcF9tZW1vcnkpOwogCi1zdGF0aWMgdm9pZCBpbnRlbF9hZ3BfdW5tYXBfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit2b2lkIGludGVsX2d0dF91bm1hcF9tZW1vcnkoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0LCBpbnQgbnVtX3NnKQogeworCXN0cnVjdCBzZ190YWJsZSBzdDsKIAlEQkcoInRyeSB1bm1hcHBpbmcgJWx1IHBhZ2VzXG4iLCAodW5zaWduZWQgbG9uZyltZW0tPnBhZ2VfY291bnQpOwogCi0JcGNpX3VubWFwX3NnKGludGVsX3ByaXZhdGUucGNpZGV2LCBtZW0tPnNnX2xpc3QsCi0JCSAgICAgbWVtLT5wYWdlX2NvdW50LCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWludGVsX2FncF9mcmVlX3NnbGlzdChtZW0pOworCXBjaV91bm1hcF9zZyhpbnRlbF9wcml2YXRlLnBjaWRldiwgc2dfbGlzdCwKKwkJICAgICBudW1fc2csIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwlzdC5zZ2wgPSBzZ19saXN0OworCXN0Lm9yaWdfbmVudHMgPSBzdC5uZW50cyA9IG51bV9zZzsKKworCXNnX2ZyZWVfdGFibGUoJnN0KTsKIH0KLQotc3RhdGljIGludCBpbnRlbF9pODEwX2ZldGNoX3NpemUodm9pZCkKLXsKLQl1MzIgc21yYW1fbWlzY2M7Ci0Jc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAotCQkJICAgICAgSTgxMF9TTVJBTV9NSVNDQywgJnNtcmFtX21pc2NjKTsKLQl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOwotCi0JaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR01TKSA9PSBJODEwX0dNU19ESVNBQkxFKSB7Ci0JCWRldl93YXJuKCZpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYtPmRldiwgImk4MTAgaXMgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR0ZYX01FTV9XSU5fU0laRSkgPT0gSTgxMF9HRlhfTUVNX1dJTl8zMk0pIHsKLQkJYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIDEpOwotCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDE7Ci0JCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKLQl9IGVsc2UgewotCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzKTsKLQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSAwOwotCQlyZXR1cm4gdmFsdWVzWzBdLnNpemU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfaTgxMF9jb25maWd1cmUodm9pZCkKLXsKLQlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKmN1cnJlbnRfc2l6ZTsKLQl1MzIgdGVtcDsKLQlpbnQgaTsKLQotCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKLQotCWlmICghaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBJODEwX01NQUREUiwgJnRlbXApOwotCQl0ZW1wICY9IDB4ZmZmODAwMDA7Ci0KLQkJaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMgPSBpb3JlbWFwKHRlbXAsIDEyOCAqIDQwOTYpOwotCQlpZiAoIWludGVsX3ByaXZhdGUucmVnaXN0ZXJzKSB7Ci0JCQlkZXZfZXJyKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAotCQkJCSJjYW4ndCByZW1hcCBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlpZiAoKHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfRFJBTV9DVEwpCi0JCSYgSTgxMF9EUkFNX1JPV18wKSA9PSBJODEwX0RSQU1fUk9XXzBfU0RSQU0pIHsKLQkJLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZHluYW1pY2FsbHkgYXNzaWduZWQgKi8KLQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCi0JCQkgImRldGVjdGVkIDRNQiBkZWRpY2F0ZWQgdmlkZW8gcmFtXG4iKTsKLQkJaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMgPSAxMDI0OwotCX0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5wY2lkZXYsIEk4MTBfR01BRERSLCAmdGVtcCk7Ci0JYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7Ci0Jd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgfCBJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwotCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CS8qIFBDSSBQb3N0aW5nLiAqLwotCi0JaWYgKGFncF9icmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X3NpemUtPm51bV9lbnRyaWVzOyBpKyspIHsKLQkJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwotCQl9Ci0JCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKChpLTEpKjQpKTsJLyogUENJIHBvc3RpbmcuICovCi0JfQotCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9pODEwX2NsZWFudXAodm9pZCkKLXsKLQl3cml0ZWwoMCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKLQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyk7CS8qIFBDSSBQb3N0aW5nLiAqLwotCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpOwotfQorRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfdW5tYXBfbWVtb3J5KTsKIAogc3RhdGljIHZvaWQgaW50ZWxfZmFrZV9hZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIG1vZGUpCiB7CkBAIC0yNzcsODAgKzE3MCw2NCBAQAogCWF0b21pY19kZWMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfaTgxMF9pbnNlcnRfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKLQkJCQlpbnQgdHlwZSkKKyNkZWZpbmUgSTgxMF9HVFRfT1JERVIgNAorc3RhdGljIGludCBpODEwX3NldHVwKHZvaWQpCiB7Ci0JaW50IGksIGosIG51bV9lbnRyaWVzOwotCXZvaWQgKnRlbXA7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IG1hc2tfdHlwZTsKKwl1MzIgcmVnX2FkZHI7CisJY2hhciAqZ3R0X3RhYmxlOwogCi0JaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQotCQlnb3RvIG91dDsKKwkvKiBpODF4IGRvZXMgbm90IHByZWFsbG9jYXRlIHRoZSBndHQuIEl0J3MgYWx3YXlzIDY0a2IgaW4gc2l6ZS4gKi8KKwlndHRfdGFibGUgPSBhbGxvY19nYXR0X3BhZ2VzKEk4MTBfR1RUX09SREVSKTsKKwlpZiAoZ3R0X3RhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWludGVsX3ByaXZhdGUuaTgxeF9ndHRfdGFibGUgPSBndHRfdGFibGU7CiAKLQl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwotCW51bV9lbnRyaWVzID0gQV9TSVpFX0ZJWCh0ZW1wKS0+bnVtX2VudHJpZXM7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBJODEwX01NQUREUiwgJnJlZ19hZGRyKTsKKwlyZWdfYWRkciAmPSAweGZmZjgwMDAwOwogCi0JaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKLQkJZ290byBvdXRfZXJyOworCWludGVsX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcChyZWdfYWRkciwgS0IoNjQpKTsKKwlpZiAoIWludGVsX3ByaXZhdGUucmVnaXN0ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKIAorCXdyaXRlbCh2aXJ0X3RvX3BoeXMoZ3R0X3RhYmxlKSB8IEk4MTBfUEdFVEJMX0VOQUJMRUQsCisJICAgICAgIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CiAKLQlmb3IgKGogPSBwZ19zdGFydDsgaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGorKykgewotCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXRfZXJyOwotCQl9CisJaW50ZWxfcHJpdmF0ZS5ndHRfYnVzX2FkZHIgPSByZWdfYWRkciArIEk4MTBfUFRFX0JBU0U7CisKKwlpZiAoKHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfRFJBTV9DVEwpCisJCSYgSTgxMF9EUkFNX1JPV18wKSA9PSBJODEwX0RSQU1fUk9XXzBfU0RSQU0pIHsKKwkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCisJCQkgImRldGVjdGVkIDRNQiBkZWRpY2F0ZWQgdmlkZW8gcmFtXG4iKTsKKwkJaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMgPSAxMDI0OwogCX0KIAotCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKLQkJZ290byBvdXRfZXJyOwotCi0JbWFza190eXBlID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSk7Ci0KLQlzd2l0Y2ggKG1hc2tfdHlwZSkgewotCWNhc2UgQUdQX0RDQUNIRV9NRU1PUlk6Ci0JCWlmICghbWVtLT5pc19mbHVzaGVkKQotCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KTsgaSsrKSB7Ci0JCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsCi0JCQkgICAgICAgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7Ci0JCX0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOwotCQlicmVhazsKLQljYXNlIEFHUF9QSFlTX01FTU9SWToKLQljYXNlIEFHUF9OT1JNQUxfTUVNT1JZOgotCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKLQkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7Ci0JCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAotCQkJCQlwYWdlX3RvX3BoeXMobWVtLT5wYWdlc1tpXSksIG1hc2tfdHlwZSksCi0JCQkgICAgICAgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7Ci0JCX0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi1vdXQ6Ci0JcmV0ID0gMDsKLW91dF9lcnI6Ci0JbWVtLT5pc19mbHVzaGVkID0gdHJ1ZTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGludGVsX2k4MTBfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCi0JCQkJaW50IHR5cGUpCitzdGF0aWMgdm9pZCBpODEwX2NsZWFudXAodm9pZCkKK3sKKwl3cml0ZWwoMCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKwlmcmVlX2dhdHRfcGFnZXMoaW50ZWxfcHJpdmF0ZS5pODF4X2d0dF90YWJsZSwgSTgxMF9HVFRfT1JERVIpOworfQorCitzdGF0aWMgaW50IGk4MTBfaW5zZXJ0X2RjYWNoZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCSAgICAgIGludCB0eXBlKQogewogCWludCBpOwogCi0JaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQotCQlyZXR1cm4gMDsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KQorCQkJPiBpbnRlbF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChtZW0tPnBhZ2VfY291bnQgKyBwZ19zdGFydCk7IGkrKykgewotCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsKKwlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGkrKykgeworCQlkbWFfYWRkcl90IGFkZHIgPSBpIDw8IFBBR0VfU0hJRlQ7CisJCWludGVsX3ByaXZhdGUuZHJpdmVyLT53cml0ZV9lbnRyeShhZGRyLAorCQkJCQkJICBpLCB0eXBlKTsKIAl9Ci0JcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOworCXJlYWRsKGludGVsX3ByaXZhdGUuZ3R0K2ktMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NywyOSArMjc0LDYgQEAKIAlyZXR1cm4gbmV3OwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmludGVsX2k4MTBfYWxsb2NfYnlfdHlwZShzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQotewotCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7Ci0KLQlpZiAodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkgewotCQlpZiAocGdfY291bnQgIT0gaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQluZXcgPSBhZ3BfY3JlYXRlX21lbW9yeSgxKTsKLQkJaWYgKG5ldyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJbmV3LT50eXBlID0gQUdQX0RDQUNIRV9NRU1PUlk7Ci0JCW5ldy0+cGFnZV9jb3VudCA9IHBnX2NvdW50OwotCQluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gMDsKLQkJYWdwX2ZyZWVfcGFnZV9hcnJheShuZXcpOwotCQlyZXR1cm4gbmV3OwotCX0KLQlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCi0JCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKIHsKIAlhZ3BfZnJlZV9rZXkoY3Vyci0+a2V5KTsKQEAgLTQzNywxMyArMjkxLDYgQEAKIAlrZnJlZShjdXJyKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTgxMF9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCi0JCQkJCSAgICBkbWFfYWRkcl90IGFkZHIsIGludCB0eXBlKQotewotCS8qIFR5cGUgY2hlY2tpbmcgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLwotCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7Ci19Ci0KIHN0YXRpYyBpbnQgaW50ZWxfZ3R0X3NldHVwX3NjcmF0Y2hfcGFnZSh2b2lkKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNDU1LDcgKzMwMiw3IEBACiAJZ2V0X3BhZ2UocGFnZSk7CiAJc2V0X3BhZ2VzX3VjKHBhZ2UsIDEpOwogCi0JaWYgKFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMikgeworCWlmIChpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hcikgewogCQlkbWFfYWRkciA9IHBjaV9tYXBfcGFnZShpbnRlbF9wcml2YXRlLnBjaWRldiwgcGFnZSwgMCwKIAkJCQkgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGludGVsX3ByaXZhdGUucGNpZGV2LCBkbWFfYWRkcikpCkBAIC00NzAsMzQgKzMxNyw0NSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGNvbnN0IGludGVsX2Zha2VfYWdwX3NpemVzW10gPSB7CitzdGF0aWMgdm9pZCBpODEwX3dyaXRlX2VudHJ5KGRtYV9hZGRyX3QgYWRkciwgdW5zaWduZWQgaW50IGVudHJ5LAorCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdTMyIHB0ZV9mbGFncyA9IEk4MTBfUFRFX1ZBTElEOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgQUdQX0RDQUNIRV9NRU1PUlk6CisJCXB0ZV9mbGFncyB8PSBJODEwX1BURV9MT0NBTDsKKwkJYnJlYWs7CisJY2FzZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOgorCQlwdGVfZmxhZ3MgfD0gSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRDsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKGFkZHIgfCBwdGVfZmxhZ3MsIGludGVsX3ByaXZhdGUuZ3R0ICsgZW50cnkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2Zha2VfYWdwX3NpemVzW10gPSB7CisJezMyLCA4MTkyLCAzfSwKKwl7NjQsIDE2Mzg0LCA0fSwKIAl7MTI4LCAzMjc2OCwgNX0sCi0JLyogVGhlIDY0TSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgMTI4ayBnYXR0ICovCi0JezY0LCAxNjM4NCwgNX0sCiAJezI1NiwgNjU1MzYsIDZ9LAogCXs1MTIsIDEzMTA3MiwgN30sCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGludGVsX2d0dF9zdG9sZW5fZW50cmllcyh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ndHRfc3RvbGVuX3NpemUodm9pZCkKIHsKIAl1MTYgZ21jaF9jdHJsOwogCXU4IHJkY3Q7CiAJaW50IGxvY2FsID0gMDsKIAlzdGF0aWMgY29uc3QgaW50IGRkdFs0XSA9IHsgMCwgMTYsIDMyLCA2NCB9OwotCXVuc2lnbmVkIGludCBvdmVyaGVhZF9lbnRyaWVzLCBzdG9sZW5fZW50cmllczsKIAl1bnNpZ25lZCBpbnQgc3RvbGVuX3NpemUgPSAwOwogCisJaWYgKElOVEVMX0dUVF9HRU4gPT0gMSkKKwkJcmV0dXJuIDA7IC8qIG5vIHN0b2xlbiBtZW0gb24gaTgxeCAqLworCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAogCQkJICAgICBJODMwX0dNQ0hfQ1RSTCwgJmdtY2hfY3RybCk7CiAKLQlpZiAoSU5URUxfR1RUX0dFTiA+IDQgfHwgSVNfUElORVZJRVcpCi0JCW92ZXJoZWFkX2VudHJpZXMgPSAwOwotCWVsc2UKLQkJb3ZlcmhlYWRfZW50cmllcyA9IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfbWFwcGFibGVfZW50cmllcwotCQkJLyAxMDI0OwotCi0Jb3ZlcmhlYWRfZW50cmllcyArPSAxOyAvKiBCSU9TIHBvcHVwICovCi0KIAlpZiAoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9IQiB8fAogCSAgICBpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQikgewogCQlzd2l0Y2ggKGdtY2hfY3RybCAmIEk4MzBfR01DSF9HTVNfTUFTSykgewpAQCAtNjIzLDEyICs0ODEsNyBAQAogCQl9CiAJfQogCi0JaWYgKCFsb2NhbCAmJiBzdG9sZW5fc2l6ZSA+IGludGVsX21heF9zdG9sZW4pIHsKLQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LAotCQkJICJkZXRlY3RlZCAlZEsgc3RvbGVuIG1lbW9yeSwgdHJpbW1pbmcgdG8gJWRLXG4iLAotCQkJIHN0b2xlbl9zaXplIC8gS0IoMSksIGludGVsX21heF9zdG9sZW4gLyBLQigxKSk7Ci0JCXN0b2xlbl9zaXplID0gaW50ZWxfbWF4X3N0b2xlbjsKLQl9IGVsc2UgaWYgKHN0b2xlbl9zaXplID4gMCkgeworCWlmIChzdG9sZW5fc2l6ZSA+IDApIHsKIAkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LCAiZGV0ZWN0ZWQgJWRLICVzIG1lbW9yeVxuIiwKIAkJICAgICAgIHN0b2xlbl9zaXplIC8gS0IoMSksIGxvY2FsID8gImxvY2FsIiA6ICJzdG9sZW4iKTsKIAl9IGVsc2UgewpAQCAtNjM3LDQ2ICs0OTAsODggQEAKIAkJc3RvbGVuX3NpemUgPSAwOwogCX0KIAotCXN0b2xlbl9lbnRyaWVzID0gc3RvbGVuX3NpemUvS0IoNCkgLSBvdmVyaGVhZF9lbnRyaWVzOworCXJldHVybiBzdG9sZW5fc2l6ZTsKK30KIAotCXJldHVybiBzdG9sZW5fZW50cmllczsKK3N0YXRpYyB2b2lkIGk5NjVfYWRqdXN0X3BnZXRibF9zaXplKHVuc2lnbmVkIGludCBzaXplX2ZsYWcpCit7CisJdTMyIHBnZXRibF9jdGwsIHBnZXRibF9jdGwyOworCisJLyogZW5zdXJlIHRoYXQgcHBndHQgaXMgZGlzYWJsZWQgKi8KKwlwZ2V0YmxfY3RsMiA9IHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k5NjVfUEdFVEJMX0NUTDIpOworCXBnZXRibF9jdGwyICY9IH5JODEwX1BHRVRCTF9FTkFCTEVEOworCXdyaXRlbChwZ2V0YmxfY3RsMiwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTk2NV9QR0VUQkxfQ1RMMik7CisKKwkvKiB3cml0ZSB0aGUgbmV3IGdndHQgc2l6ZSAqLworCXBnZXRibF9jdGwgPSByZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOworCXBnZXRibF9jdGwgJj0gfkk5NjVfUEdFVEJMX1NJWkVfTUFTSzsKKwlwZ2V0YmxfY3RsIHw9IHNpemVfZmxhZzsKKwl3cml0ZWwocGdldGJsX2N0bCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpOTY1X2d0dF90b3RhbF9lbnRyaWVzKHZvaWQpCit7CisJaW50IHNpemU7CisJdTMyIHBnZXRibF9jdGw7CisJdTE2IGdtY2hfY3RsOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJICAgICBJODMwX0dNQ0hfQ1RSTCwgJmdtY2hfY3RsKTsKKworCWlmIChJTlRFTF9HVFRfR0VOID09IDUpIHsKKwkJc3dpdGNoIChnbWNoX2N0bCAmIEc0eF9HTUNIX1NJWkVfTUFTSykgeworCQljYXNlIEc0eF9HTUNIX1NJWkVfMU06CisJCWNhc2UgRzR4X0dNQ0hfU0laRV9WVF8xTToKKwkJCWk5NjVfYWRqdXN0X3BnZXRibF9zaXplKEk5NjVfUEdFVEJMX1NJWkVfMU1CKTsKKwkJCWJyZWFrOworCQljYXNlIEc0eF9HTUNIX1NJWkVfVlRfMV81TToKKwkJCWk5NjVfYWRqdXN0X3BnZXRibF9zaXplKEk5NjVfUEdFVEJMX1NJWkVfMV81TUIpOworCQkJYnJlYWs7CisJCWNhc2UgRzR4X0dNQ0hfU0laRV8yTToKKwkJY2FzZSBHNHhfR01DSF9TSVpFX1ZUXzJNOgorCQkJaTk2NV9hZGp1c3RfcGdldGJsX3NpemUoSTk2NV9QR0VUQkxfU0laRV8yTUIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwZ2V0YmxfY3RsID0gcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKworCXN3aXRjaCAocGdldGJsX2N0bCAmIEk5NjVfUEdFVEJMX1NJWkVfTUFTSykgeworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xMjhLQjoKKwkJc2l6ZSA9IEtCKDEyOCk7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8yNTZLQjoKKwkJc2l6ZSA9IEtCKDI1Nik7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV81MTJLQjoKKwkJc2l6ZSA9IEtCKDUxMik7CisJCWJyZWFrOworCS8qIEdUVCBwYWdldGFibGUgc2l6ZXMgYmlnZ2VyIHRoYW4gNTEyS0IgYXJlIG5vdCBwb3NzaWJsZSBvbiBHMzMhICovCisJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzFNQjoKKwkJc2l6ZSA9IEtCKDEwMjQpOworCQlicmVhazsKKwljYXNlIEk5NjVfUEdFVEJMX1NJWkVfMk1COgorCQlzaXplID0gS0IoMjA0OCk7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xXzVNQjoKKwkJc2l6ZSA9IEtCKDEwMjQgKyA1MTIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfaW5mbygmaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldiwKKwkJCSAidW5rbm93biBwYWdlIHRhYmxlIHNpemUsIGFzc3VtaW5nIDUxMktCXG4iKTsKKwkJc2l6ZSA9IEtCKDUxMik7CisJfQorCisJcmV0dXJuIHNpemUvNDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ndHRfdG90YWxfZW50cmllcyh2b2lkKQogewogCWludCBzaXplOwogCi0JaWYgKElTX0czMyB8fCBJTlRFTF9HVFRfR0VOID09IDQgfHwgSU5URUxfR1RUX0dFTiA9PSA1KSB7Ci0JCXUzMiBwZ2V0YmxfY3RsOwotCQlwZ2V0YmxfY3RsID0gcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKLQotCQlzd2l0Y2ggKHBnZXRibF9jdGwgJiBJOTY1X1BHRVRCTF9TSVpFX01BU0spIHsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzEyOEtCOgotCQkJc2l6ZSA9IEtCKDEyOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzI1NktCOgotCQkJc2l6ZSA9IEtCKDI1Nik7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzUxMktCOgotCQkJc2l6ZSA9IEtCKDUxMik7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzFNQjoKLQkJCXNpemUgPSBLQigxMDI0KTsKLQkJCWJyZWFrOwotCQljYXNlIEk5NjVfUEdFVEJMX1NJWkVfMk1COgotCQkJc2l6ZSA9IEtCKDIwNDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xXzVNQjoKLQkJCXNpemUgPSBLQigxMDI0ICsgNTEyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCi0JCQkJICJ1bmtub3duIHBhZ2UgdGFibGUgc2l6ZSwgYXNzdW1pbmcgNTEyS0JcbiIpOwotCQkJc2l6ZSA9IEtCKDUxMik7Ci0JCX0KLQotCQlyZXR1cm4gc2l6ZS80OwotCX0gZWxzZSBpZiAoSU5URUxfR1RUX0dFTiA9PSA2KSB7CisJaWYgKElTX0czMyB8fCBJTlRFTF9HVFRfR0VOID09IDQgfHwgSU5URUxfR1RUX0dFTiA9PSA1KQorCQlyZXR1cm4gaTk2NV9ndHRfdG90YWxfZW50cmllcygpOworCWVsc2UgaWYgKElOVEVMX0dUVF9HRU4gPT0gNikgewogCQl1MTYgc25iX2dtY2hfY3RsOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBTTkJfR01DSF9DVFJMLCAmc25iX2dtY2hfY3RsKTsKQEAgLTcwNiw3ICs2MDEsMTggQEAKIHsKIAl1bnNpZ25lZCBpbnQgYXBlcnR1cmVfc2l6ZTsKIAotCWlmIChJTlRFTF9HVFRfR0VOID09IDIpIHsKKwlpZiAoSU5URUxfR1RUX0dFTiA9PSAxKSB7CisJCXUzMiBzbXJhbV9taXNjYzsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJCSAgICAgIEk4MTBfU01SQU1fTUlTQ0MsICZzbXJhbV9taXNjYyk7CisKKwkJaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR0ZYX01FTV9XSU5fU0laRSkKKwkJCQk9PSBJODEwX0dGWF9NRU1fV0lOXzMyTSkKKwkJCWFwZXJ0dXJlX3NpemUgPSBNQigzMik7CisJCWVsc2UKKwkJCWFwZXJ0dXJlX3NpemUgPSBNQig2NCk7CisJfSBlbHNlIGlmIChJTlRFTF9HVFRfR0VOID09IDIpIHsKIAkJdTE2IGdtY2hfY3RybDsKIAogCQlwY2lfcmVhZF9jb25maWdfd29yZChpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYsCkBAIC03MzksNyArNjQ1LDcgQEAKIAogCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOwogCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpOwotCQorCiAJaW50ZWxfZ3R0X3RlYXJkb3duX3NjcmF0Y2hfcGFnZSgpOwogfQogCkBAIC03NTUsNiArNjYxLDE0IEBACiAJaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9tYXBwYWJsZV9lbnRyaWVzID0gaW50ZWxfZ3R0X21hcHBhYmxlX2VudHJpZXMoKTsKIAlpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3RvdGFsX2VudHJpZXMgPSBpbnRlbF9ndHRfdG90YWxfZW50cmllcygpOwogCisJLyogc2F2ZSB0aGUgUEdFVEJMIHJlZyBmb3IgcmVzdW1lICovCisJaW50ZWxfcHJpdmF0ZS5QR0VUQkxfc2F2ZSA9CisJCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCkKKwkJCSYgfkk4MTBfUEdFVEJMX0VOQUJMRUQ7CisJLyogd2Ugb25seSBldmVyIHJlc3RvcmUgdGhlIHJlZ2lzdGVyIHdoZW4gZW5hYmxpbmcgdGhlIFBHVEJMLi4uICovCisJaWYgKEhBU19QR1RCTF9FTikKKwkJaW50ZWxfcHJpdmF0ZS5QR0VUQkxfc2F2ZSB8PSBJODEwX1BHRVRCTF9FTkFCTEVEOworCiAJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LAogCQkJImRldGVjdGVkIGd0dCBzaXplOiAlZEsgdG90YWwsICVkSyBtYXBwYWJsZVxuIiwKIAkJCWludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllcyAqIDQsCkBAIC03NzIsMTQgKzY4Niw5IEBACiAKIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsgICAvKiBGSVhNRTogPyAqLwogCi0JLyogd2UgaGF2ZSB0byBjYWxsIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUgYWZ0ZXIgdGhlIE1NSU8gYmFzZSBhZGRyZXNzIGlzIGtub3duICovCi0JaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllcyA9IGludGVsX2d0dF9zdG9sZW5fZW50cmllcygpOwotCWlmIChpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3N0b2xlbl9lbnRyaWVzID09IDApIHsKLQkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmNsZWFudXAoKTsKLQkJaW91bm1hcChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyk7Ci0JCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJaW50ZWxfcHJpdmF0ZS5iYXNlLnN0b2xlbl9zaXplID0gaW50ZWxfZ3R0X3N0b2xlbl9zaXplKCk7CisKKwlpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hciA9IFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMjsKIAogCXJldCA9IGludGVsX2d0dF9zZXR1cF9zY3JhdGNoX3BhZ2UoKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTg2MiwyNSArNzcxLDE5IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAl1MzIgcHRlX2ZsYWdzID0gSTgxMF9QVEVfVkFMSUQ7Ci0JCi0Jc3dpdGNoIChmbGFncykgewotCWNhc2UgQUdQX0RDQUNIRV9NRU1PUlk6Ci0JCXB0ZV9mbGFncyB8PSBJODEwX1BURV9MT0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOgorCisJaWYgKGZsYWdzID09ICBBR1BfVVNFUl9DQUNIRURfTUVNT1JZKQogCQlwdGVfZmxhZ3MgfD0gSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRDsKLQkJYnJlYWs7Ci0JfQogCiAJd3JpdGVsKGFkZHIgfCBwdGVfZmxhZ3MsIGludGVsX3ByaXZhdGUuZ3R0ICsgZW50cnkpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9lbmFibGVfZ3R0KHZvaWQpCitzdGF0aWMgYm9vbCBpbnRlbF9lbmFibGVfZ3R0KHZvaWQpCiB7CiAJdTMyIGdtYV9hZGRyOwotCXUxNiBnbWNoX2N0cmw7CisJdTggX19pb21lbSAqcmVnOwogCi0JaWYgKElOVEVMX0dUVF9HRU4gPT0gMikKKwlpZiAoSU5URUxfR1RUX0dFTiA8PSAyKQogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5wY2lkZXYsIEk4MTBfR01BRERSLAogCQkJCSAgICAgICZnbWFfYWRkcik7CiAJZWxzZQpAQCAtODg5LDEzICs3OTIsNDcgQEAKIAogCWludGVsX3ByaXZhdGUuZ21hX2J1c19hZGRyID0gKGdtYV9hZGRyICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7CiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYsIEk4MzBfR01DSF9DVFJMLCAmZ21jaF9jdHJsKTsKLQlnbWNoX2N0cmwgfD0gSTgzMF9HTUNIX0VOQUJMRUQ7Ci0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKGludGVsX3ByaXZhdGUuYnJpZGdlX2RldiwgSTgzMF9HTUNIX0NUUkwsIGdtY2hfY3RybCk7CisJaWYgKElOVEVMX0dUVF9HRU4gPj0gNikKKwkgICAgcmV0dXJuIHRydWU7CiAKLQl3cml0ZWwoaW50ZWxfcHJpdmF0ZS5wdGVfYnVzX2FkZHJ8STgxMF9QR0VUQkxfRU5BQkxFRCwKLQkgICAgICAgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKLQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwkvKiBQQ0kgUG9zdGluZy4gKi8KKwlpZiAoSU5URUxfR1RUX0dFTiA9PSAyKSB7CisJCXUxNiBnbWNoX2N0cmw7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJCSAgICAgSTgzMF9HTUNIX0NUUkwsICZnbWNoX2N0cmwpOworCQlnbWNoX2N0cmwgfD0gSTgzMF9HTUNIX0VOQUJMRUQ7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYsCisJCQkJICAgICAgSTgzMF9HTUNIX0NUUkwsIGdtY2hfY3RybCk7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJCSAgICAgSTgzMF9HTUNIX0NUUkwsICZnbWNoX2N0cmwpOworCQlpZiAoKGdtY2hfY3RybCAmIEk4MzBfR01DSF9FTkFCTEVEKSA9PSAwKSB7CisJCQlkZXZfZXJyKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZW5hYmxlIHRoZSBHVFQ6IEdNQ0hfQ1RSTD0leFxuIiwKKwkJCQlnbWNoX2N0cmwpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyogT24gdGhlIHJlc3VtZSBwYXRoIHdlIG1heSBiZSBhZGp1c3RpbmcgdGhlIFBHVEJMIHZhbHVlLCBzbworCSAqIGJlIHBhcmFub2lkIGFuZCBmbHVzaCBhbGwgY2hpcHNldCB3cml0ZSBidWZmZXJzLi4uCisJICovCisJaWYgKElOVEVMX0dUVF9HRU4gPj0gMykKKwkJd3JpdGVsKDAsIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0dGWF9GTFNIX0NOVEwpOworCisJcmVnID0gaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMOworCXdyaXRlbChpbnRlbF9wcml2YXRlLlBHRVRCTF9zYXZlLCByZWcpOworCWlmIChIQVNfUEdUQkxfRU4gJiYgKHJlYWRsKHJlZykgJiBJODEwX1BHRVRCTF9FTkFCTEVEKSA9PSAwKSB7CisJCWRldl9lcnIoJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGVuYWJsZSB0aGUgR1RUOiBQR0VUQkw9JXggW2V4cGVjdGVkICV4XVxuIiwKKwkJCXJlYWRsKHJlZyksIGludGVsX3ByaXZhdGUuUEdFVEJMX3NhdmUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKElOVEVMX0dUVF9HRU4gPj0gMykKKwkJd3JpdGVsKDAsIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0dGWF9GTFNIX0NOVEwpOworCisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgaTgzMF9zZXR1cCh2b2lkKQpAQCAtOTEwLDggKzg0Nyw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaW50ZWxfcHJpdmF0ZS5ndHRfYnVzX2FkZHIgPSByZWdfYWRkciArIEk4MTBfUFRFX0JBU0U7Ci0JaW50ZWxfcHJpdmF0ZS5wdGVfYnVzX2FkZHIgPQotCQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpICYgMHhmZmZmZjAwMDsKIAogCWludGVsX2k4MzBfc2V0dXBfZmx1c2goKTsKIApAQCAtOTM2LDEyICs4NzEsMTIgQEAKIHsKIAlpbnQgaTsKIAotCWludGVsX2VuYWJsZV9ndHQoKTsKKwlpZiAoIWludGVsX2VuYWJsZV9ndHQoKSkKKwkgICAgcmV0dXJuIC1FSU87CiAKIAlhZ3BfYnJpZGdlLT5nYXJ0X2J1c19hZGRyID0gaW50ZWxfcHJpdmF0ZS5nbWFfYnVzX2FkZHI7CiAKLQlmb3IgKGkgPSBpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3N0b2xlbl9lbnRyaWVzOwotCQkJaSA8IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllczsgaSsrKSB7CiAJCWludGVsX3ByaXZhdGUuZHJpdmVyLT53cml0ZV9lbnRyeShpbnRlbF9wcml2YXRlLnNjcmF0Y2hfcGFnZV9kbWEsCiAJCQkJCQkgIGksIDApOwogCX0KQEAgLTk2NSwxMCArOTAwLDEwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9ndHRfaW5zZXJ0X3NnX2VudHJpZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0LAotCQkJCQl1bnNpZ25lZCBpbnQgc2dfbGVuLAotCQkJCQl1bnNpZ25lZCBpbnQgcGdfc3RhcnQsCi0JCQkJCXVuc2lnbmVkIGludCBmbGFncykKK3ZvaWQgaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwKKwkJCQkgdW5zaWduZWQgaW50IHNnX2xlbiwKKwkJCQkgdW5zaWduZWQgaW50IHBnX3N0YXJ0LAorCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAl1bnNpZ25lZCBpbnQgbGVuLCBtOwpAQCAtOTg5LDI3ICs5MjQsMzQgQEAKIAl9CiAJcmVhZGwoaW50ZWxfcHJpdmF0ZS5ndHQrai0xKTsKIH0KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKTsKKwordm9pZCBpbnRlbF9ndHRfaW5zZXJ0X3BhZ2VzKHVuc2lnbmVkIGludCBmaXJzdF9lbnRyeSwgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLAorCQkJICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDAsIGogPSBmaXJzdF9lbnRyeTsgaSA8IG51bV9lbnRyaWVzOyBpKyssIGorKykgeworCQlkbWFfYWRkcl90IGFkZHIgPSBwYWdlX3RvX3BoeXMocGFnZXNbaV0pOworCQlpbnRlbF9wcml2YXRlLmRyaXZlci0+d3JpdGVfZW50cnkoYWRkciwKKwkJCQkJCSAgaiwgZmxhZ3MpOworCX0KKwlyZWFkbChpbnRlbF9wcml2YXRlLmd0dCtqLTEpOworfQorRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfaW5zZXJ0X3BhZ2VzKTsKIAogc3RhdGljIGludCBpbnRlbF9mYWtlX2FncF9pbnNlcnRfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAogCQkJCQkgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQogewotCWludCBpLCBqOwogCWludCByZXQgPSAtRUlOVkFMOwogCisJaWYgKElOVEVMX0dUVF9HRU4gPT0gMSAmJiB0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKQorCQlyZXR1cm4gaTgxMF9pbnNlcnRfZGNhY2hlX2VudHJpZXMobWVtLCBwZ19zdGFydCwgdHlwZSk7CisKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHBnX3N0YXJ0IDwgaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllcykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAotCQkJICAgInBnX3N0YXJ0ID09IDB4JS44bHgsIGd0dF9zdG9sZW5fZW50cmllcyA9PSAweCUuOHhcbiIsCi0JCQkgICBwZ19zdGFydCwgaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllcyk7Ci0KLQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCi0JCQkgInRyeWluZyB0byBpbnNlcnQgaW50byBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQotCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF90b3RhbF9lbnRyaWVzKQorCWlmIChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCA+IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllcykKIAkJZ290byBvdXRfZXJyOwogCiAJaWYgKHR5cGUgIT0gbWVtLT50eXBlKQpAQCAtMTAyMSwyMSArOTYzLDE3IEBACiAJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCiAJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwogCi0JaWYgKFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMikgewotCQlyZXQgPSBpbnRlbF9hZ3BfbWFwX21lbW9yeShtZW0pOworCWlmIChpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hcikgeworCQlyZXQgPSBpbnRlbF9ndHRfbWFwX21lbW9yeShtZW0tPnBhZ2VzLCBtZW0tPnBhZ2VfY291bnQsCisJCQkJCSAgICZtZW0tPnNnX2xpc3QsICZtZW0tPm51bV9zZyk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXJldHVybiByZXQ7CiAKIAkJaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKG1lbS0+c2dfbGlzdCwgbWVtLT5udW1fc2csCiAJCQkJCSAgICBwZ19zdGFydCwgdHlwZSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewotCQkJZG1hX2FkZHJfdCBhZGRyID0gcGFnZV90b19waHlzKG1lbS0+cGFnZXNbaV0pOwotCQkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPndyaXRlX2VudHJ5KGFkZHIsCi0JCQkJCQkJICBqLCB0eXBlKTsKLQkJfQotCQlyZWFkbChpbnRlbF9wcml2YXRlLmd0dCtqLTEpOwotCX0KKwl9IGVsc2UKKwkJaW50ZWxfZ3R0X2luc2VydF9wYWdlcyhwZ19zdGFydCwgbWVtLT5wYWdlX2NvdW50LCBtZW0tPnBhZ2VzLAorCQkJCSAgICAgICB0eXBlKTsKIAogb3V0OgogCXJldCA9IDA7CkBAIC0xMDQ0LDQwICs5ODIsNTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGludGVsX2Zha2VfYWdwX3JlbW92ZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCi0JCQkJCSBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit2b2lkIGludGVsX2d0dF9jbGVhcl9yYW5nZSh1bnNpZ25lZCBpbnQgZmlyc3RfZW50cnksIHVuc2lnbmVkIGludCBudW1fZW50cmllcykKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocGdfc3RhcnQgPCBpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3N0b2xlbl9lbnRyaWVzKSB7Ci0JCWRldl9pbmZvKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAotCQkJICJ0cnlpbmcgdG8gZGlzYWJsZSBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMikKLQkJaW50ZWxfYWdwX3VubWFwX21lbW9yeShtZW0pOwotCi0JZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAobWVtLT5wYWdlX2NvdW50ICsgcGdfc3RhcnQpOyBpKyspIHsKKwlmb3IgKGkgPSBmaXJzdF9lbnRyeTsgaSA8IChmaXJzdF9lbnRyeSArIG51bV9lbnRyaWVzKTsgaSsrKSB7CiAJCWludGVsX3ByaXZhdGUuZHJpdmVyLT53cml0ZV9lbnRyeShpbnRlbF9wcml2YXRlLnNjcmF0Y2hfcGFnZV9kbWEsCiAJCQkJCQkgIGksIDApOwogCX0KIAlyZWFkbChpbnRlbF9wcml2YXRlLmd0dCtpLTEpOworfQorRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfY2xlYXJfcmFuZ2UpOworCitzdGF0aWMgaW50IGludGVsX2Zha2VfYWdwX3JlbW92ZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sCisJCQkJCSBvZmZfdCBwZ19zdGFydCwgaW50IHR5cGUpCit7CisJaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWludGVsX2d0dF9jbGVhcl9yYW5nZShwZ19zdGFydCwgbWVtLT5wYWdlX2NvdW50KTsKKworCWlmIChpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hcikgeworCQlpbnRlbF9ndHRfdW5tYXBfbWVtb3J5KG1lbS0+c2dfbGlzdCwgbWVtLT5udW1fc2cpOworCQltZW0tPnNnX2xpc3QgPSBOVUxMOworCQltZW0tPm51bV9zZyA9IDA7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGludGVsX2Zha2VfYWdwX2NoaXBzZXRfZmx1c2goc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQotewotCWludGVsX3ByaXZhdGUuZHJpdmVyLT5jaGlwc2V0X2ZsdXNoKCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqaW50ZWxfZmFrZV9hZ3BfYWxsb2NfYnlfdHlwZShzaXplX3QgcGdfY291bnQsCiAJCQkJCQkgICAgICAgaW50IHR5cGUpCiB7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKworCWlmICh0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZICYmIElOVEVMX0dUVF9HRU4gPT0gMSkgeworCQlpZiAocGdfY291bnQgIT0gaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMpCisJCQlyZXR1cm4gTlVMTDsKKworCQluZXcgPSBhZ3BfY3JlYXRlX21lbW9yeSgxKTsKKwkJaWYgKG5ldyA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbmV3LT50eXBlID0gQUdQX0RDQUNIRV9NRU1PUlk7CisJCW5ldy0+cGFnZV9jb3VudCA9IHBnX2NvdW50OworCQluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gMDsKKwkJYWdwX2ZyZWVfcGFnZV9hcnJheShuZXcpOworCQlyZXR1cm4gbmV3OworCX0KIAlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCiAJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwogCS8qIGFsd2F5cyByZXR1cm4gTlVMTCBmb3Igb3RoZXIgYWxsb2NhdGlvbiB0eXBlcyBmb3Igbm93ICovCkBAIC0xMjc0LDQwICsxMjI2LDExIEBACiAJCWludGVsX3ByaXZhdGUuZ3R0X2J1c19hZGRyID0gcmVnX2FkZHIgKyBndHRfb2Zmc2V0OwogCX0KIAotCWludGVsX3ByaXZhdGUucHRlX2J1c19hZGRyID0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKSAmIDB4ZmZmZmYwMDA7Ci0KIAlpbnRlbF9pOXh4X3NldHVwX2ZsdXNoKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MTBfZHJpdmVyID0gewotCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLmFwZXJ0dXJlX3NpemVzCQk9IGludGVsX2k4MTBfc2l6ZXMsCi0JLnNpemVfdHlwZQkJPSBGSVhFRF9BUEVSX1NJWkUsCi0JLm51bV9hcGVydHVyZV9zaXplcwk9IDIsCi0JLm5lZWRzX3NjcmF0Y2hfcGFnZQk9IHRydWUsCi0JLmNvbmZpZ3VyZQkJPSBpbnRlbF9pODEwX2NvbmZpZ3VyZSwKLQkuZmV0Y2hfc2l6ZQkJPSBpbnRlbF9pODEwX2ZldGNoX3NpemUsCi0JLmNsZWFudXAJCT0gaW50ZWxfaTgxMF9jbGVhbnVwLAotCS5tYXNrX21lbW9yeQkJPSBpbnRlbF9pODEwX21hc2tfbWVtb3J5LAotCS5tYXNrcwkJCT0gaW50ZWxfaTgxMF9tYXNrcywKLQkuYWdwX2VuYWJsZQkJPSBpbnRlbF9mYWtlX2FncF9lbmFibGUsCi0JLmNhY2hlX2ZsdXNoCQk9IGdsb2JhbF9jYWNoZV9mbHVzaCwKLQkuY3JlYXRlX2dhdHRfdGFibGUJPSBhZ3BfZ2VuZXJpY19jcmVhdGVfZ2F0dF90YWJsZSwKLQkuZnJlZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfZnJlZV9nYXR0X3RhYmxlLAotCS5pbnNlcnRfbWVtb3J5CQk9IGludGVsX2k4MTBfaW5zZXJ0X2VudHJpZXMsCi0JLnJlbW92ZV9tZW1vcnkJCT0gaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcywKLQkuYWxsb2NfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2FsbG9jX2J5X3R5cGUsCi0JLmZyZWVfYnlfdHlwZQkJPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKLQkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKLQkuYWdwX2FsbG9jX3BhZ2VzICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAotCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAotCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKLQkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9mYWtlX2FncF9kcml2ZXIgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuc2l6ZV90eXBlCQk9IEZJWEVEX0FQRVJfU0laRSwKQEAgLTEzMjgsMTUgKzEyNTEsMjAgQEAKIAkuYWdwX2FsbG9jX3BhZ2VzICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2VzLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlcyAgICAgID0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlcywKLQkuY2hpcHNldF9mbHVzaAkJPSBpbnRlbF9mYWtlX2FncF9jaGlwc2V0X2ZsdXNoLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIGk4MXhfZ3R0X2RyaXZlciA9IHsKIAkuZ2VuID0gMSwKKwkuaGFzX3BndGJsX2VuYWJsZSA9IDEsCiAJLmRtYV9tYXNrX3NpemUgPSAzMiwKKwkuc2V0dXAgPSBpODEwX3NldHVwLAorCS5jbGVhbnVwID0gaTgxMF9jbGVhbnVwLAorCS5jaGVja19mbGFncyA9IGk4MzBfY2hlY2tfZmxhZ3MsCisJLndyaXRlX2VudHJ5ID0gaTgxMF93cml0ZV9lbnRyeSwKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2d0dF9kcml2ZXIgaTh4eF9ndHRfZHJpdmVyID0gewogCS5nZW4gPSAyLAorCS5oYXNfcGd0YmxfZW5hYmxlID0gMSwKIAkuc2V0dXAgPSBpODMwX3NldHVwLAogCS5jbGVhbnVwID0gaTgzMF9jbGVhbnVwLAogCS53cml0ZV9lbnRyeSA9IGk4MzBfd3JpdGVfZW50cnksCkBAIC0xMzQ2LDEwICsxMjc0LDExIEBACiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIGk5MTVfZ3R0X2RyaXZlciA9IHsKIAkuZ2VuID0gMywKKwkuaGFzX3BndGJsX2VuYWJsZSA9IDEsCiAJLnNldHVwID0gaTl4eF9zZXR1cCwKIAkuY2xlYW51cCA9IGk5eHhfY2xlYW51cCwKIAkvKiBpOTQ1IGlzIHRoZSBsYXN0IGdwdSB0byBuZWVkIHBoeXMgbWVtIChmb3Igb3ZlcmxheSBhbmQgY3Vyc29ycykuICovCi0JLndyaXRlX2VudHJ5ID0gaTgzMF93cml0ZV9lbnRyeSwgCisJLndyaXRlX2VudHJ5ID0gaTgzMF93cml0ZV9lbnRyeSwKIAkuZG1hX21hc2tfc2l6ZSA9IDMyLAogCS5jaGVja19mbGFncyA9IGk4MzBfY2hlY2tfZmxhZ3MsCiAJLmNoaXBzZXRfZmx1c2ggPSBpOXh4X2NoaXBzZXRfZmx1c2gsCkBAIC0xMzc2LDYgKzEzMDUsNyBAQAogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3R0X2RyaXZlciBpOTY1X2d0dF9kcml2ZXIgPSB7CiAJLmdlbiA9IDQsCisJLmhhc19wZ3RibF9lbmFibGUgPSAxLAogCS5zZXR1cCA9IGk5eHhfc2V0dXAsCiAJLmNsZWFudXAgPSBpOXh4X2NsZWFudXAsCiAJLndyaXRlX2VudHJ5ID0gaTk2NV93cml0ZV9lbnRyeSwKQEAgLTE0MTksOTMgKzEzNDksOTIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3R0X2RyaXZlcl9kZXNjcmlwdGlvbiB7CiAJdW5zaWduZWQgaW50IGdtY2hfY2hpcF9pZDsKIAljaGFyICpuYW1lOwotCWNvbnN0IHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciAqZ21jaF9kcml2ZXI7CiAJY29uc3Qgc3RydWN0IGludGVsX2d0dF9kcml2ZXIgKmd0dF9kcml2ZXI7CiB9IGludGVsX2d0dF9jaGlwc2V0c1tdID0gewotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzEsICJpODEwIiwgJmludGVsXzgxMF9kcml2ZXIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX0lHMSwgImk4MTAiLAogCQkmaTgxeF9ndHRfZHJpdmVyfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUczLCAiaTgxMCIsICZpbnRlbF84MTBfZHJpdmVyLAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzMsICJpODEwIiwKIAkJJmk4MXhfZ3R0X2RyaXZlcn0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwRV9JRywgImk4MTAiLCAmaW50ZWxfODEwX2RyaXZlciwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBFX0lHLCAiaTgxMCIsCiAJCSZpODF4X2d0dF9kcml2ZXJ9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxNV9DR0MsICJpODE1IiwgJmludGVsXzgxMF9kcml2ZXIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODE1X0NHQywgImk4MTUiLAogCQkmaTgxeF9ndHRfZHJpdmVyfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfQ0dDLCAiODMwTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOHh4X2d0dF9kcml2ZXJ9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSUcsICI4MzBNIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk4eHhfZ3R0X2RyaXZlcn0sCisJCSZpOHh4X2d0dF9kcml2ZXJ9LAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg0NUdfSUcsICI4NDVHIiwKKwkJJmk4eHhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU0X0lHLCAiODU0IiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk4eHhfZ3R0X2RyaXZlcn0sCisJCSZpOHh4X2d0dF9kcml2ZXJ9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1NUdNX0lHLCAiODU1R00iLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTh4eF9ndHRfZHJpdmVyfSwKKwkJJmk4eHhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODY1X0lHLCAiODY1IiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk4eHhfZ3R0X2RyaXZlcn0sCisJCSZpOHh4X2d0dF9kcml2ZXJ9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9FNzIyMV9JRywgIkU3MjIxIChpOTE1KSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdfSUcsICI5MTVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5MTVfZ3R0X2RyaXZlciB9LAorCQkmaTkxNV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R01fSUcsICI5MTVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdfSUcsICI5NDVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5MTVfZ3R0X2RyaXZlciB9LAorCQkmaTkxNV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01fSUcsICI5NDVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNRV9JRywgIjk0NUdNRSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NkdaX0lHLCAiOTQ2R1oiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODJHMzVfSUcsICJHMzUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVRX0lHLCAiOTY1USIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTY1X2d0dF9kcml2ZXIgfSwKKwkJJmk5NjVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSUcsICI5NjVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5NjVfZ3R0X2RyaXZlciB9LAorCQkmaTk2NV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01fSUcsICI5NjVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTY1X2d0dF9kcml2ZXIgfSwKKwkJJmk5NjVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNRV9JRywgIjk2NUdNRS9HTEUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0lHLCAiRzMzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmczM19ndHRfZHJpdmVyIH0sCisJCSZnMzNfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSUcsICJRMzUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzMzX2d0dF9kcml2ZXIgfSwKKwkJJmczM19ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1EzM19JRywgIlEzMyIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZnMzNfZ3R0X2RyaXZlciB9LAorCQkmZzMzX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfUElORVZJRVdfTV9JRywgIkdNQTMxNTAiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAorCQkmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19JRywgIkdNQTMxNTAiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAorCQkmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0lHLCAiR000NSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZnNHhfZ3R0X2RyaXZlciB9LAorCQkmZzR4X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0lHLCAiRWFnbGVsYWtlIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSUcsICJRNDUvUTQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSUcsICJHNDUvRzQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9CNDNfSUcsICJCNDMiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzR4X2d0dF9kcml2ZXIgfSwKKwkJJmc0eF9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M18xX0lHLCAiQjQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSUcsICJHNDEiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzR4X2d0dF9kcml2ZXIgfSwKKwkJJmc0eF9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSUcsCi0JICAgICJIRCBHcmFwaGljcyIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCisJICAgICJIRCBHcmFwaGljcyIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSUcsCi0JICAgICJIRCBHcmFwaGljcyIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCisJICAgICJIRCBHcmFwaGljcyIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1NBTkRZQlJJREdFX0dUMV9JRywKLQkgICAgIlNhbmR5YnJpZGdlIiwgJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKKwkgICAgIlNhbmR5YnJpZGdlIiwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfR1QyX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9HVDJfUExVU19JRywKLQkgICAgIlNhbmR5YnJpZGdlIiwgJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKKwkgICAgIlNhbmR5YnJpZGdlIiwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfTV9HVDFfSUcsCi0JICAgICJTYW5keWJyaWRnZSIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZzYW5keWJyaWRnZV9ndHRfZHJpdmVyIH0sCisJICAgICJTYW5keWJyaWRnZSIsICZzYW5keWJyaWRnZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1NBTkRZQlJJREdFX01fR1QyX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9NX0dUMl9QTFVTX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9TX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgMCwgTlVMTCwgTlVMTCB9CiB9OwogCkBAIC0xNTMwLDIxICsxNDU5LDIwIEBACiAJCQkJICAgICAgc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQogewogCWludCBpLCBtYXNrOwotCWJyaWRnZS0+ZHJpdmVyID0gTlVMTDsKKwlpbnRlbF9wcml2YXRlLmRyaXZlciA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpbnRlbF9ndHRfY2hpcHNldHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKIAkJaWYgKGZpbmRfZ21jaChpbnRlbF9ndHRfY2hpcHNldHNbaV0uZ21jaF9jaGlwX2lkKSkgewotCQkJYnJpZGdlLT5kcml2ZXIgPQotCQkJCWludGVsX2d0dF9jaGlwc2V0c1tpXS5nbWNoX2RyaXZlcjsKLQkJCWludGVsX3ByaXZhdGUuZHJpdmVyID0gCisJCQlpbnRlbF9wcml2YXRlLmRyaXZlciA9CiAJCQkJaW50ZWxfZ3R0X2NoaXBzZXRzW2ldLmd0dF9kcml2ZXI7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghYnJpZGdlLT5kcml2ZXIpCisJaWYgKCFpbnRlbF9wcml2YXRlLmRyaXZlcikKIAkJcmV0dXJuIDA7CiAKKwlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF9mYWtlX2FncF9kcml2ZXI7CiAJYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhID0gJmludGVsX3ByaXZhdGU7CiAJYnJpZGdlLT5kZXYgPSBwZGV2OwogCkBAIC0xNTYwLDggKzE0ODgsOCBAQAogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaW50ZWxfcHJpdmF0ZS5wY2lkZXYsCiAJCQkJCSAgICBETUFfQklUX01BU0sobWFzaykpOwogCi0JaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQotCQlyZXR1cm4gMTsKKwkvKmlmIChicmlkZ2UtPmRyaXZlciA9PSAmaW50ZWxfODEwX2RyaXZlcikKKwkJcmV0dXJuIDE7Ki8KIAogCWlmIChpbnRlbF9ndHRfaW5pdCgpICE9IDApCiAJCXJldHVybiAwOwpAQCAtMTU3MCwxMiArMTQ5OCwxOSBAQAogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9nbWNoX3Byb2JlKTsKIAotc3RydWN0IGludGVsX2d0dCAqaW50ZWxfZ3R0X2dldCh2b2lkKQorY29uc3Qgc3RydWN0IGludGVsX2d0dCAqaW50ZWxfZ3R0X2dldCh2b2lkKQogewogCXJldHVybiAmaW50ZWxfcHJpdmF0ZS5iYXNlOwogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfZ2V0KTsKIAordm9pZCBpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCh2b2lkKQoreworCWlmIChpbnRlbF9wcml2YXRlLmRyaXZlci0+Y2hpcHNldF9mbHVzaCkKKwkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmNoaXBzZXRfZmx1c2goKTsKK30KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2gpOworCiB2b2lkIGludGVsX2dtY2hfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWlmIChpbnRlbF9wcml2YXRlLnBjaWRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCmluZGV4IDI3MzcwZTkuLjVlMmY1MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y192aW8uYwpAQCAtMzksNyArMzksNyBAQAogCiAjaW5jbHVkZSAiaHZjX2NvbnNvbGUuaCIKIAotY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CitzdGF0aWMgY29uc3QgY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7InNlcmlhbCIsICJodnRlcm0xIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3ZpYS1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlhLXJuZy5jCmluZGV4IDc5NGFhY2IuLmQwMzg3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlhLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vdmlhLXJuZy5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KIAorI2luY2x1ZGUgPGNyeXB0by9wYWRsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CkBAIC0zNCw3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KIAogCi0jZGVmaW5lIFBGWAlLQlVJTERfTU9ETkFNRSAiOiAiCiAKIAogZW51bSB7CkBAIC04MSw4ICs4MSw3IEBACiAJdHNfc3RhdGUgPSBpcnFfdHNfc2F2ZSgpOwogCiAJYXNtKCIuYnl0ZSAweDBGLDB4QTcsMHhDMCAvKiB4c3RvcmUgJSVlZGkgKGFkZHI9JTApICovIgotCQk6Ij1tIigqYWRkciksICI9YSIoZWF4X291dCkKLQkJOiJEIihhZGRyKSwgImQiKGVkeF9pbikpOworCQk6ICI9bSIgKCphZGRyKSwgIj1hIiAoZWF4X291dCksICIrZCIgKGVkeF9pbiksICIrRCIgKGFkZHIpKTsKIAogCWlycV90c19yZXN0b3JlKHRzX3N0YXRlKTsKIAlyZXR1cm4gZWF4X291dDsKQEAgLTkwLDggKzg5LDEwIEBACiAKIHN0YXRpYyBpbnQgdmlhX3JuZ19kYXRhX3ByZXNlbnQoc3RydWN0IGh3cm5nICpybmcsIGludCB3YWl0KQogeworCWNoYXIgYnVmWzE2ICsgUEFETE9DS19BTElHTk1FTlQgLSBTVEFDS19BTElHTl0gX19hdHRyaWJ1dGVfXworCQkoKGFsaWduZWQoU1RBQ0tfQUxJR04pKSk7CisJdTMyICp2aWFfcm5nX2RhdHVtID0gKHUzMiAqKVBUUl9BTElHTigmYnVmWzBdLCBQQURMT0NLX0FMSUdOTUVOVCk7CiAJdTMyIGJ5dGVzX291dDsKLQl1MzIgKnZpYV9ybmdfZGF0dW0gPSAodTMyICopKCZybmctPnByaXYpOwogCWludCBpOwogCiAJLyogV2UgY2hvb3NlIHRoZSByZWNvbW1lbmRlZCAxLWJ5dGUtcGVyLWluc3RydWN0aW9uIFJORyByYXRlLApAQCAtMTE1LDYgKzExNiw3IEBACiAJCQlicmVhazsKIAkJdWRlbGF5KDEwKTsKIAl9CisJcm5nLT5wcml2ID0gKnZpYV9ybmdfZGF0dW07CiAJcmV0dXJuIGJ5dGVzX291dCA/IDEgOiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCmluZGV4IDJmZTcyZjguLjM4MjIzZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfbXNnaGFuZGxlci5jCkBAIC05NzAsNiArOTcwLDMzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwbWlfY3JlYXRlX3VzZXIpOwogCitpbnQgaXBtaV9nZXRfc21pX2luZm8oaW50IGlmX251bSwgc3RydWN0IGlwbWlfc21pX2luZm8gKmRhdGEpCit7CisJaW50ICAgICAgICAgICBydiA9IDA7CisJaXBtaV9zbWlfdCAgICBpbnRmOworCXN0cnVjdCBpcG1pX3NtaV9oYW5kbGVycyAqaGFuZGxlcnM7CisKKwltdXRleF9sb2NrKCZpcG1pX2ludGVyZmFjZXNfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGludGYsICZpcG1pX2ludGVyZmFjZXMsIGxpbmspIHsKKwkJaWYgKGludGYtPmludGZfbnVtID09IGlmX251bSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCS8qIE5vdCBmb3VuZCwgcmV0dXJuIGFuIGVycm9yICovCisJcnYgPSAtRUlOVkFMOworCW11dGV4X3VubG9jaygmaXBtaV9pbnRlcmZhY2VzX211dGV4KTsKKwlyZXR1cm4gcnY7CisKK2ZvdW5kOgorCWhhbmRsZXJzID0gaW50Zi0+aGFuZGxlcnM7CisJcnYgPSAtRU5PU1lTOworCWlmIChoYW5kbGVycy0+Z2V0X3NtaV9pbmZvKQorCQlydiA9IGhhbmRsZXJzLT5nZXRfc21pX2luZm8oaW50Zi0+c2VuZF9pbmZvLCBkYXRhKTsKKwltdXRleF91bmxvY2soJmlwbWlfaW50ZXJmYWNlc19tdXRleCk7CisKKwlyZXR1cm4gcnY7Cit9CitFWFBPUlRfU1lNQk9MKGlwbWlfZ2V0X3NtaV9pbmZvKTsKKwogc3RhdGljIHZvaWQgZnJlZV91c2VyKHN0cnVjdCBrcmVmICpyZWYpCiB7CiAJaXBtaV91c2VyX3QgdXNlciA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBpcG1pX3VzZXIsIHJlZmNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggMDM1ZGE5ZS4uYjZhZTZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CiAjaW5jbHVkZSA8bGludXgvaXBtaV9zbWkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJpcG1pX3NpX3NtLmgiCkBAIC02OSw2ICs3MCw4IEBACiAjaWZkZWYgQ09ORklHX1BQQ19PRgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2VuZGlmCiAKICNkZWZpbmUgUEZYICJpcG1pX3NpOiAiCkBAIC0xMDcsMTAgKzExMCw2IEBACiB9Owogc3RhdGljIGNoYXIgKnNpX3RvX3N0cltdID0geyAia2NzIiwgInNtaWMiLCAiYnQiIH07CiAKLWVudW0gaXBtaV9hZGRyX3NyYyB7Ci0JU0lfSU5WQUxJRCA9IDAsIFNJX0hPVE1PRCwgU0lfSEFSRENPREVELCBTSV9TUE1JLCBTSV9BQ1BJLCBTSV9TTUJJT1MsCi0JU0lfUENJLAlTSV9ERVZJQ0VUUkVFLCBTSV9ERUZBVUxUCi19Owogc3RhdGljIGNoYXIgKmlwbWlfYWRkcl9zcmNfdG9fc3RyW10gPSB7IE5VTEwsICJob3Rtb2QiLCAiaGFyZGNvZGVkIiwgIlNQTUkiLAogCQkJCQkiQUNQSSIsICJTTUJJT1MiLCAiUENJIiwKIAkJCQkJImRldmljZS10cmVlIiwgImRlZmF1bHQiIH07CkBAIC0yOTEsNiArMjkwLDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwl1bmlvbiBpcG1pX3NtaV9pbmZvX3VuaW9uIGFkZHJfaW5mbzsKIH07CiAKICNkZWZpbmUgc21pX2luY19zdGF0KHNtaSwgc3RhdCkgXApAQCAtMTE4Niw2ICsxMTg2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X3NtaV9pbmZvKHZvaWQgKnNlbmRfaW5mbywgc3RydWN0IGlwbWlfc21pX2luZm8gKmRhdGEpCit7CisJc3RydWN0IHNtaV9pbmZvICpzbWkgPSBzZW5kX2luZm87CisKKwlkYXRhLT5hZGRyX3NyYyA9IHNtaS0+YWRkcl9zb3VyY2U7CisJZGF0YS0+ZGV2ID0gc21pLT5kZXY7CisJZGF0YS0+YWRkcl9pbmZvID0gc21pLT5hZGRyX2luZm87CisJZ2V0X2RldmljZShzbWktPmRldik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgc2V0X21haW50ZW5hbmNlX21vZGUodm9pZCAqc2VuZF9pbmZvLCBpbnQgZW5hYmxlKQogewogCXN0cnVjdCBzbWlfaW5mbyAgICpzbWlfaW5mbyA9IHNlbmRfaW5mbzsKQEAgLTExOTcsNiArMTIwOSw3IEBACiBzdGF0aWMgc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzIGhhbmRsZXJzID0gewogCS5vd25lciAgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLnN0YXJ0X3Byb2Nlc3NpbmcgICAgICAgPSBzbWlfc3RhcnRfcHJvY2Vzc2luZywKKwkuZ2V0X3NtaV9pbmZvCQk9IGdldF9zbWlfaW5mbywKIAkuc2VuZGVyCQkJPSBzZW5kZXIsCiAJLnJlcXVlc3RfZXZlbnRzCQk9IHJlcXVlc3RfZXZlbnRzLAogCS5zZXRfbWFpbnRlbmFuY2VfbW9kZSAgID0gc2V0X21haW50ZW5hbmNlX21vZGUsCkBAIC0xOTI4LDcgKzE5NDEsOCBAQAogc3RhdGljIGludCBhY3BpX2ZhaWx1cmU7CiAKIC8qIEZvciBHUEUtdHlwZSBpbnRlcnJ1cHRzLiAqLwotc3RhdGljIHUzMiBpcG1pX2FjcGlfZ3BlKHZvaWQgKmNvbnRleHQpCitzdGF0aWMgdTMyIGlwbWlfYWNwaV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwl1MzIgZ3BlX251bWJlciwgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3Qgc21pX2luZm8gKnNtaV9pbmZvID0gY29udGV4dDsKIAl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CkBAIC0yMTU2LDYgKzIxNzAsNyBAQAogCXByaW50ayhLRVJOX0lORk8gUEZYICJwcm9iaW5nIHZpYSBBQ1BJXG4iKTsKIAogCWhhbmRsZSA9IGFjcGlfZGV2LT5oYW5kbGU7CisJaW5mby0+YWRkcl9pbmZvLmFjcGlfaW5mby5hY3BpX2hhbmRsZSA9IGhhbmRsZTsKIAogCS8qIF9JRlQgdGVsbHMgdXMgdGhlIGludGVyZmFjZSB0eXBlOiBLQ1MsIEJULCBldGMgKi8KIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0lGVCIsIE5VTEwsICZ0bXApOwpAQCAtMjU0Niw3ICsyNTYxLDcgQEAKIHsKIAlzdHJ1Y3Qgc21pX2luZm8gKmluZm87CiAJc3RydWN0IHJlc291cmNlIHJlc291cmNlOwotCWNvbnN0IGludCAqcmVnc2l6ZSwgKnJlZ3NwYWNpbmcsICpyZWdzaGlmdDsKKwljb25zdCBfX2JlMzIgKnJlZ3NpemUsICpyZWdzcGFjaW5nLCAqcmVnc2hpZnQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+ZGV2Lm9mX25vZGU7CiAJaW50IHJldDsKIAlpbnQgcHJvcGxlbjsKQEAgLTI1OTksOSArMjYxNCw5IEBACiAKIAlpbmZvLT5pby5hZGRyX2RhdGEJPSByZXNvdXJjZS5zdGFydDsKIAotCWluZm8tPmlvLnJlZ3NpemUJPSByZWdzaXplID8gKnJlZ3NpemUgOiBERUZBVUxUX1JFR1NJWkU7Ci0JaW5mby0+aW8ucmVnc3BhY2luZwk9IHJlZ3NwYWNpbmcgPyAqcmVnc3BhY2luZyA6IERFRkFVTFRfUkVHU1BBQ0lORzsKLQlpbmZvLT5pby5yZWdzaGlmdAk9IHJlZ3NoaWZ0ID8gKnJlZ3NoaWZ0IDogMDsKKwlpbmZvLT5pby5yZWdzaXplCT0gcmVnc2l6ZSA/IGJlMzJfdG9fY3B1cChyZWdzaXplKSA6IERFRkFVTFRfUkVHU0laRTsKKwlpbmZvLT5pby5yZWdzcGFjaW5nCT0gcmVnc3BhY2luZyA/IGJlMzJfdG9fY3B1cChyZWdzcGFjaW5nKSA6IERFRkFVTFRfUkVHU1BBQ0lORzsKKwlpbmZvLT5pby5yZWdzaGlmdAk9IHJlZ3NoaWZ0ID8gYmUzMl90b19jcHVwKHJlZ3NoaWZ0KSA6IDA7CiAKIAlpbmZvLT5pcnEJCT0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMCk7CiAJaW5mby0+ZGV2CQk9ICZkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYwppbmRleCBmNGQzMzRmLi4zMjA2NjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCkBAIC0xMDgxLDcgKzEwODEsNyBAQAogewogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IGRhdGE7CiAKLQlpZiAodmFsICE9IERJRV9OTUkpCisJaWYgKHZhbCAhPSBESUVfTk1JVU5LTk9XTikKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCS8qIEhhY2ssIGlmIGl0J3MgYSBtZW1vcnkgb3IgSS9PIGVycm9yLCBpZ25vcmUgaXQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFtb29wcy5jIGIvZHJpdmVycy9jaGFyL3JhbW9vcHMuYwppbmRleCBkM2Q2M2JlLi4xYTlmNWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2RlZmluZSBSQU1PT1BTX0tFUk5NU0dfSERSICI9PT09IgogCi0jZGVmaW5lIFJFQ09SRF9TSVpFIDQwOTYKKyNkZWZpbmUgUkVDT1JEX1NJWkUgNDA5NlVMCiAKIHN0YXRpYyB1bG9uZyBtZW1fYWRkcmVzczsKIG1vZHVsZV9wYXJhbShtZW1fYWRkcmVzcywgdWxvbmcsIDA0MDApOwpAQCAtNjgsMTEgKzY4LDE2IEBACiAJY2hhciAqYnVmLCAqYnVmX29yaWc7CiAJc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwogCisJaWYgKHJlYXNvbiAhPSBLTVNHX0RVTVBfT09QUyAmJgorCSAgICByZWFzb24gIT0gS01TR19EVU1QX1BBTklDICYmCisJICAgIHJlYXNvbiAhPSBLTVNHX0RVTVBfS0VYRUMpCisJCXJldHVybjsKKwogCS8qIE9ubHkgZHVtcCBvb3BzZXMgaWYgZHVtcF9vb3BzIGlzIHNldCAqLwogCWlmIChyZWFzb24gPT0gS01TR19EVU1QX09PUFMgJiYgIWR1bXBfb29wcykKIAkJcmV0dXJuOwogCi0JYnVmID0gKGNoYXIgKikoY3h0LT52aXJ0X2FkZHIgKyAoY3h0LT5jb3VudCAqIFJFQ09SRF9TSVpFKSk7CisJYnVmID0gY3h0LT52aXJ0X2FkZHIgKyAoY3h0LT5jb3VudCAqIFJFQ09SRF9TSVpFKTsKIAlidWZfb3JpZyA9IGJ1ZjsKIAogCW1lbXNldChidWYsICdcMCcsIFJFQ09SRF9TSVpFKTsKQEAgLTgzLDggKzg4LDggQEAKIAlidWYgKz0gcmVzOwogCiAJaGRyX3NpemUgPSBidWYgLSBidWZfb3JpZzsKLQlsMl9jcHkgPSBtaW4obDIsICh1bnNpZ25lZCBsb25nKShSRUNPUkRfU0laRSAtIGhkcl9zaXplKSk7Ci0JbDFfY3B5ID0gbWluKGwxLCAodW5zaWduZWQgbG9uZykoUkVDT1JEX1NJWkUgLSBoZHJfc2l6ZSkgLSBsMl9jcHkpOworCWwyX2NweSA9IG1pbihsMiwgUkVDT1JEX1NJWkUgLSBoZHJfc2l6ZSk7CisJbDFfY3B5ID0gbWluKGwxLCBSRUNPUkRfU0laRSAtIGhkcl9zaXplIC0gbDJfY3B5KTsKIAogCXMyX3N0YXJ0ID0gbDIgLSBsMl9jcHk7CiAJczFfc3RhcnQgPSBsMSAtIGwxX2NweTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYXcuYyBiL2RyaXZlcnMvY2hhci9yYXcuYwppbmRleCBiZmUyNWVhLi5iNGI5ZDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmF3LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jhdy5jCkBAIC02NSwxNSArNjUsMTIgQEAKIAlpZiAoIWJkZXYpCiAJCWdvdG8gb3V0OwogCWlncmFiKGJkZXYtPmJkX2lub2RlKTsKLQllcnIgPSBibGtkZXZfZ2V0KGJkZXYsIGZpbHAtPmZfbW9kZSk7CisJZXJyID0gYmxrZGV2X2dldChiZGV2LCBmaWxwLT5mX21vZGUgfCBGTU9ERV9FWENMLCByYXdfb3Blbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gYmRfY2xhaW0oYmRldiwgcmF3X29wZW4pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAllcnIgPSBzZXRfYmxvY2tzaXplKGJkZXYsIGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0MTsKIAlmaWxwLT5mX2ZsYWdzIHw9IE9fRElSRUNUOwogCWZpbHAtPmZfbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CiAJaWYgKCsrcmF3X2RldmljZXNbbWlub3JdLmludXNlID09IDEpCkBAIC04MywxMCArODAsOCBAQAogCW11dGV4X3VubG9jaygmcmF3X211dGV4KTsKIAlyZXR1cm4gMDsKIAotb3V0MjoKLQliZF9yZWxlYXNlKGJkZXYpOwogb3V0MToKLQlibGtkZXZfcHV0KGJkZXYsIGZpbHAtPmZfbW9kZSk7CisJYmxrZGV2X3B1dChiZGV2LCBmaWxwLT5mX21vZGUgfCBGTU9ERV9FWENMKTsKIG91dDoKIAltdXRleF91bmxvY2soJnJhd19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTExMCw4ICsxMDUsNyBAQAogCX0KIAltdXRleF91bmxvY2soJnJhd19tdXRleCk7CiAKLQliZF9yZWxlYXNlKGJkZXYpOwotCWJsa2Rldl9wdXQoYmRldiwgZmlscC0+Zl9tb2RlKTsKKwlibGtkZXZfcHV0KGJkZXYsIGZpbHAtPmZfbW9kZSB8IEZNT0RFX0VYQ0wpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5oIGIvZHJpdmVycy9jaGFyL3Nuc2MuaAppbmRleCA0YmU2MmVkLi5lOGM1MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc25zYy5oCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjLmgKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCmluZGV4IDBiM2FmM2YuLjFmNDZmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uYwpAQCAtNzM2LDcgKzczNiw3IEBACiAJaWYgKGNoaXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJcmMgPSBfX3RwbV9wY3JfcmVhZChjaGlwLCBwY3JfaWR4LCByZXNfYnVmKTsKLQltb2R1bGVfcHV0KGNoaXAtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJdHBtX2NoaXBfcHV0KGNoaXApOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9wY3JfcmVhZCk7CkBAIC03NzUsMTEgKzc3NSwyNyBAQAogCXJjID0gdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIEVYVEVORF9QQ1JfUkVTVUxUX1NJWkUsCiAJCQkgICJhdHRlbXB0aW5nIGV4dGVuZCBhIFBDUiB2YWx1ZSIpOwogCi0JbW9kdWxlX3B1dChjaGlwLT5kZXYtPmRyaXZlci0+b3duZXIpOworCXRwbV9jaGlwX3B1dChjaGlwKTsKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cG1fcGNyX2V4dGVuZCk7CiAKK2ludCB0cG1fc2VuZCh1MzIgY2hpcF9udW0sIHZvaWQgKmNtZCwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXA7CisJaW50IHJjOworCisJY2hpcCA9IHRwbV9jaGlwX2ZpbmRfZ2V0KGNoaXBfbnVtKTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjID0gdHJhbnNtaXRfY21kKGNoaXAsIGNtZCwgYnVmbGVuLCAiYXR0ZW1wdGluZyB0cG1fY21kIik7CisKKwl0cG1fY2hpcF9wdXQoY2hpcCk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBtX3NlbmQpOworCiBzc2l6ZV90IHRwbV9zaG93X3BjcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJICAgICAgY2hhciAqYnVmKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKaW5kZXggNzkyODY4ZC4uNzJkZGIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC0xMTMsNiArMTEzLDExIEBACiAKICNkZWZpbmUgdG9fdHBtX2NoaXAobikgY29udGFpbmVyX29mKG4sIHN0cnVjdCB0cG1fY2hpcCwgdmVuZG9yKQogCitzdGF0aWMgaW5saW5lIHZvaWQgdHBtX2NoaXBfcHV0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwltb2R1bGVfcHV0KGNoaXAtPmRldi0+ZHJpdmVyLT5vd25lcik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHRwbV9yZWFkX2luZGV4KGludCBiYXNlLCBpbnQgaW5kZXgpCiB7CiAJb3V0YihpbmRleCwgYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCAzODY4ODhmLi5iZjUwOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTk2LDcgKzk2LDE1IEBACiAKIAkvKiBlbnRlciB0aGUgc3RhdGUgYW5kIHVwZGF0ZSBzdGF0cyAqLwogCWRldi0+bGFzdF9zdGF0ZSA9IHRhcmdldF9zdGF0ZTsKKworCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgbmV4dF9zdGF0ZSwgZGV2LT5jcHUpOworCXRyYWNlX2NwdV9pZGxlKG5leHRfc3RhdGUsIGRldi0+Y3B1KTsKKwogCWRldi0+bGFzdF9yZXNpZGVuY3kgPSB0YXJnZXRfc3RhdGUtPmVudGVyKGRldiwgdGFyZ2V0X3N0YXRlKTsKKworCXRyYWNlX3Bvd2VyX2VuZChkZXYtPmNwdSk7CisJdHJhY2VfY3B1X2lkbGUoUFdSX0VWRU5UX0VYSVQsIGRldi0+Y3B1KTsKKwogCWlmIChkZXYtPmxhc3Rfc3RhdGUpCiAJCXRhcmdldF9zdGF0ZSA9IGRldi0+bGFzdF9zdGF0ZTsKIApAQCAtMTA2LDggKzExNCw2IEBACiAJLyogZ2l2ZSB0aGUgZ292ZXJub3IgYW4gb3Bwb3J0dW5pdHkgdG8gcmVmbGVjdCBvbiB0aGUgb3V0Y29tZSAqLwogCWlmIChjcHVpZGxlX2N1cnJfZ292ZXJub3ItPnJlZmxlY3QpCiAJCWNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdChkZXYpOwotCXRyYWNlX3Bvd2VyX2VuZChzbXBfcHJvY2Vzc29yX2lkKCkpOwotCXRyYWNlX2NwdV9pZGxlKFBXUl9FVkVOVF9FWElULCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogfQogCiAvKioKQEAgLTE1NSw2ICsxNjEsNDUgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jayk7CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYCitzdGF0aWMgaW50IHBvbGxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0KQoreworCWt0aW1lX3QJdDEsIHQyOworCXM2NCBkaWZmOworCWludCByZXQ7CisKKwl0MSA9IGt0aW1lX2dldCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQljcHVfcmVsYXgoKTsKKworCXQyID0ga3RpbWVfZ2V0KCk7CisJZGlmZiA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0MiwgdDEpKTsKKwlpZiAoZGlmZiA+IElOVF9NQVgpCisJCWRpZmYgPSBJTlRfTUFYOworCisJcmV0ID0gKGludCkgZGlmZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSAmZGV2LT5zdGF0ZXNbMF07CisKKwljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGUsIE5VTEwpOworCisJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJQT0xMIik7CisJc25wcmludGYoc3RhdGUtPmRlc2MsIENQVUlETEVfREVTQ19MRU4sICJDUFVJRExFIENPUkUgUE9MTCBJRExFIik7CisJc3RhdGUtPmV4aXRfbGF0ZW5jeSA9IDA7CisJc3RhdGUtPnRhcmdldF9yZXNpZGVuY3kgPSAwOworCXN0YXRlLT5wb3dlcl91c2FnZSA9IC0xOworCXN0YXRlLT5mbGFncyA9IDA7CisJc3RhdGUtPmVudGVyID0gcG9sbF9pZGxlOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBvbGxfaWRsZV9pbml0KHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KSB7fQorI2VuZGlmIC8qIENPTkZJR19BUkNIX0hBU19DUFVfUkVMQVggKi8KKwogLyoqCiAgKiBjcHVpZGxlX2VuYWJsZV9kZXZpY2UgLSBlbmFibGVzIGlkbGUgUE0gZm9yIGEgQ1BVCiAgKiBAZGV2OiB0aGUgQ1BVCkBAIC0xNzksNiArMjI0LDggQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCisJcG9sbF9pZGxlX2luaXQoZGV2KTsKKwogCWlmICgocmV0ID0gY3B1aWRsZV9hZGRfc3RhdGVfc3lzZnMoZGV2KSkpCiAJCXJldHVybiByZXQ7CiAKQEAgLTIzMyw0NSArMjgwLDYgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoY3B1aWRsZV9kaXNhYmxlX2RldmljZSk7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYCi1zdGF0aWMgaW50IHBvbGxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0KQotewotCWt0aW1lX3QJdDEsIHQyOwotCXM2NCBkaWZmOwotCWludCByZXQ7Ci0KLQl0MSA9IGt0aW1lX2dldCgpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQljcHVfcmVsYXgoKTsKLQotCXQyID0ga3RpbWVfZ2V0KCk7Ci0JZGlmZiA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0MiwgdDEpKTsKLQlpZiAoZGlmZiA+IElOVF9NQVgpCi0JCWRpZmYgPSBJTlRfTUFYOwotCi0JcmV0ID0gKGludCkgZGlmZjsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSAmZGV2LT5zdGF0ZXNbMF07Ci0KLQljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGUsIE5VTEwpOwotCi0Jc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDMCIpOwotCXNucHJpbnRmKHN0YXRlLT5kZXNjLCBDUFVJRExFX0RFU0NfTEVOLCAiQ1BVSURMRSBDT1JFIFBPTEwgSURMRSIpOwotCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAwOwotCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gMDsKLQlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAtMTsKLQlzdGF0ZS0+ZmxhZ3MgPSBDUFVJRExFX0ZMQUdfUE9MTDsKLQlzdGF0ZS0+ZW50ZXIgPSBwb2xsX2lkbGU7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgcG9sbF9pZGxlX2luaXQoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpIHt9Ci0jZW5kaWYgLyogQ09ORklHX0FSQ0hfSEFTX0NQVV9SRUxBWCAqLwotCiAvKioKICAqIF9fY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UgLSBpbnRlcm5hbCByZWdpc3RlciBmdW5jdGlvbiBjYWxsZWQgYmVmb3JlIHJlZ2lzdGVyCiAgKiBhbmQgZW5hYmxlIHJvdXRpbmVzCkBAIC0yOTIsOCArMzAwLDYgQEAKIAogCWluaXRfY29tcGxldGlvbigmZGV2LT5rb2JqX3VucmVnaXN0ZXIpOwogCi0JcG9sbF9pZGxlX2luaXQoZGV2KTsKLQogCS8qCiAJICogY3B1aWRsZSBkcml2ZXIgc2hvdWxkIHNldCB0aGUgZGV2LT5wb3dlcl9zcGVjaWZpZWQgYml0CiAJICogYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UgaWYgdGhlIGRyaXZlciBwcm92aWRlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jIGIvZHJpdmVycy9jcnlwdG8vbXZfY2VzYS5jCmluZGV4IDdkMjc5ZTUuLmM5OTMwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL212X2Nlc2EuYworKysgYi9kcml2ZXJzL2NyeXB0by9tdl9jZXNhLmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNVl9DRVNBCiAJCQkgICAgICAgIkJhc2UgZHJpdmVyICclcycgY291bGQgbm90IGJlIGxvYWRlZCFcbiIsCiAJCQkgICAgICAgYmFzZV9oYXNoX25hbWUpOwotCQkJZXJyID0gUFRSX0VSUihmYWxsYmFja190Zm0pOworCQkJZXJyID0gUFRSX0VSUihiYXNlX2hhc2gpOwogCQkJZ290byBlcnJfYmFkX2Jhc2U7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMgYi9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMKaW5kZXggNzYxNDEyNjIuLjgwZGMwOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL24yX2NvcmUuYworKysgYi9kcml2ZXJzL2NyeXB0by9uMl9jb3JlLmMKQEAgLTE1NDIsNyArMTU0Miw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG4yX3VucmVnaXN0ZXJfYWxncyh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZleGl0IG4yX3VucmVnaXN0ZXJfYWxncyh2b2lkKQogewogCW11dGV4X2xvY2soJnNwdV9sb2NrKTsKIAlpZiAoIS0tYWxnc19yZWdpc3RlcmVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vb21hcC1hZXMuYyBiL2RyaXZlcnMvY3J5cHRvL29tYXAtYWVzLmMKaW5kZXggNzk5Y2E1MS4uYWRkMmExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vb21hcC1hZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9vbWFwLWFlcy5jCkBAIC03NCwxMSArNzQsOSBAQAogI2RlZmluZSBGTEFHU19DQkMJCUJJVCgxKQogI2RlZmluZSBGTEFHU19HSVYJCUJJVCgyKQogCi0jZGVmaW5lIEZMQUdTX05FV19LRVkJCUJJVCg0KQotI2RlZmluZSBGTEFHU19ORVdfSVYJCUJJVCg1KQotI2RlZmluZSBGTEFHU19JTklUCQlCSVQoNikKLSNkZWZpbmUgRkxBR1NfRkFTVAkJQklUKDcpCi0jZGVmaW5lIEZMQUdTX0JVU1kJCTgKKyNkZWZpbmUgRkxBR1NfSU5JVAkJQklUKDQpCisjZGVmaW5lIEZMQUdTX0ZBU1QJCUJJVCg1KQorI2RlZmluZSBGTEFHU19CVVNZCQlCSVQoNikKIAogc3RydWN0IG9tYXBfYWVzX2N0eCB7CiAJc3RydWN0IG9tYXBfYWVzX2RldiAqZGQ7CkBAIC05OCwxOSArOTYsMTggQEAKIHN0cnVjdCBvbWFwX2Flc19kZXYgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAl1bnNpZ25lZCBsb25nCQlwaHlzX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtIAkJKmlvX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqaW9fYmFzZTsKIAlzdHJ1Y3QgY2xrCQkqaWNsazsKIAlzdHJ1Y3Qgb21hcF9hZXNfY3R4CSpjdHg7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQllcnI7CiAKLQl1MzIJCQkqaXY7Ci0JdTMyCQkJY3RybDsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBjcnlwdG9fcXVldWUJcXVldWU7CiAKLQlzcGlubG9ja190CQkJbG9jazsKLQlzdHJ1Y3QgY3J5cHRvX3F1ZXVlCQlxdWV1ZTsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlxdWV1ZV90YXNrOwogCiAJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdAkqcmVxOwogCXNpemVfdAkJCQl0b3RhbDsKQEAgLTE3OSw5ICsxNzYsMTMgQEAKIAogc3RhdGljIGludCBvbWFwX2Flc19od19pbml0KHN0cnVjdCBvbWFwX2Flc19kZXYgKmRkKQogewotCWludCBlcnIgPSAwOwotCisJLyoKKwkgKiBjbG9ja3MgYXJlIGVuYWJsZWQgd2hlbiByZXF1ZXN0IHN0YXJ0cyBhbmQgZGlzYWJsZWQgd2hlbiBmaW5pc2hlZC4KKwkgKiBJdCBtYXkgYmUgbG9uZyBkZWxheXMgYmV0d2VlbiByZXF1ZXN0cy4KKwkgKiBEZXZpY2UgbWlnaHQgZ28gdG8gb2ZmIG1vZGUgdG8gc2F2ZSBwb3dlci4KKwkgKi8KIAljbGtfZW5hYmxlKGRkLT5pY2xrKTsKKwogCWlmICghKGRkLT5mbGFncyAmIEZMQUdTX0lOSVQpKSB7CiAJCS8qIGlzIGl0IG5lY2Vzc2FyeSB0byByZXNldCBiZWZvcmUgZXZlcnkgb3BlcmF0aW9uPyAqLwogCQlvbWFwX2Flc193cml0ZV9tYXNrKGRkLCBBRVNfUkVHX01BU0ssIEFFU19SRUdfTUFTS19TT0ZUUkVTRVQsCkBAIC0xOTMsMzkgKzE5NCwyNiBAQAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibm9wIik7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKCJub3AiKTsKIAotCQllcnIgPSBvbWFwX2Flc193YWl0KGRkLCBBRVNfUkVHX1NZU1NUQVRVUywKLQkJCQlBRVNfUkVHX1NZU1NUQVRVU19SRVNFVERPTkUpOwotCQlpZiAoIWVycikKLQkJCWRkLT5mbGFncyB8PSBGTEFHU19JTklUOworCQlpZiAob21hcF9hZXNfd2FpdChkZCwgQUVTX1JFR19TWVNTVEFUVVMsCisJCQkJQUVTX1JFR19TWVNTVEFUVVNfUkVTRVRET05FKSkKKwkJCXJldHVybiAtRVRJTUVET1VUOworCisJCWRkLT5mbGFncyB8PSBGTEFHU19JTklUOworCQlkZC0+ZXJyID0gMDsKIAl9CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwX2Flc19od19jbGVhbnVwKHN0cnVjdCBvbWFwX2Flc19kZXYgKmRkKQotewotCWNsa19kaXNhYmxlKGRkLT5pY2xrKTsKLX0KLQotc3RhdGljIHZvaWQgb21hcF9hZXNfd3JpdGVfY3RybChzdHJ1Y3Qgb21hcF9hZXNfZGV2ICpkZCkKK3N0YXRpYyBpbnQgb21hcF9hZXNfd3JpdGVfY3RybChzdHJ1Y3Qgb21hcF9hZXNfZGV2ICpkZCkKIHsKIAl1bnNpZ25lZCBpbnQga2V5MzI7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAl1MzIgdmFsLCBtYXNrOwogCi0JdmFsID0gRkxEX1ZBTCgoKGRkLT5jdHgtPmtleWxlbiA+PiAzKSAtIDEpLCA0LCAzKTsKLQlpZiAoZGQtPmZsYWdzICYgRkxBR1NfQ0JDKQotCQl2YWwgfD0gQUVTX1JFR19DVFJMX0NCQzsKLQlpZiAoZGQtPmZsYWdzICYgRkxBR1NfRU5DUllQVCkKLQkJdmFsIHw9IEFFU19SRUdfQ1RSTF9ESVJFQ1RJT047Ci0KLQlpZiAoZGQtPmN0cmwgPT0gdmFsICYmICEoZGQtPmZsYWdzICYgRkxBR1NfTkVXX0lWKSAmJgotCQkgICAhKGRkLT5jdHgtPmZsYWdzICYgRkxBR1NfTkVXX0tFWSkpCi0JCWdvdG8gb3V0OwotCi0JLyogb25seSBuZWVkIHRvIHdyaXRlIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciBuZXcgc2V0dGluZ3MgKi8KLQotCWRkLT5jdHJsID0gdmFsOworCWVyciA9IG9tYXBfYWVzX2h3X2luaXQoZGQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAl2YWwgPSAwOwogCWlmIChkZC0+ZG1hX2xjaF9vdXQgPj0gMCkKQEAgLTIzNywzMCArMjI1LDQzIEBACiAKIAlvbWFwX2Flc193cml0ZV9tYXNrKGRkLCBBRVNfUkVHX01BU0ssIHZhbCwgbWFzayk7CiAKLQlwcl9kZWJ1ZygiU2V0IGtleVxuIik7CiAJa2V5MzIgPSBkZC0+Y3R4LT5rZXlsZW4gLyBzaXplb2YodTMyKTsKLQkvKiBzZXQgYSBrZXkgKi8KKworCS8qIGl0IHNlZW1zIGEga2V5IHNob3VsZCBhbHdheXMgYmUgc2V0IGV2ZW4gaWYgaXQgaGFzIG5vdCBjaGFuZ2VkICovCiAJZm9yIChpID0gMDsgaSA8IGtleTMyOyBpKyspIHsKIAkJb21hcF9hZXNfd3JpdGUoZGQsIEFFU19SRUdfS0VZKGkpLAogCQkJX19sZTMyX3RvX2NwdShkZC0+Y3R4LT5rZXlbaV0pKTsKIAl9Ci0JZGQtPmN0eC0+ZmxhZ3MgJj0gfkZMQUdTX05FV19LRVk7CiAKLQlpZiAoZGQtPmZsYWdzICYgRkxBR1NfTkVXX0lWKSB7Ci0JCXByX2RlYnVnKCJTZXQgSVZcbiIpOwotCQlvbWFwX2Flc193cml0ZV9uKGRkLCBBRVNfUkVHX0lWKDApLCBkZC0+aXYsIDQpOwotCQlkZC0+ZmxhZ3MgJj0gfkZMQUdTX05FV19JVjsKLQl9CisJaWYgKChkZC0+ZmxhZ3MgJiBGTEFHU19DQkMpICYmIGRkLT5yZXEtPmluZm8pCisJCW9tYXBfYWVzX3dyaXRlX24oZGQsIEFFU19SRUdfSVYoMCksIGRkLT5yZXEtPmluZm8sIDQpOworCisJdmFsID0gRkxEX1ZBTCgoKGRkLT5jdHgtPmtleWxlbiA+PiAzKSAtIDEpLCA0LCAzKTsKKwlpZiAoZGQtPmZsYWdzICYgRkxBR1NfQ0JDKQorCQl2YWwgfD0gQUVTX1JFR19DVFJMX0NCQzsKKwlpZiAoZGQtPmZsYWdzICYgRkxBR1NfRU5DUllQVCkKKwkJdmFsIHw9IEFFU19SRUdfQ1RSTF9ESVJFQ1RJT047CiAKIAltYXNrID0gQUVTX1JFR19DVFJMX0NCQyB8IEFFU19SRUdfQ1RSTF9ESVJFQ1RJT04gfAogCQkJQUVTX1JFR19DVFJMX0tFWV9TSVpFOwogCi0Jb21hcF9hZXNfd3JpdGVfbWFzayhkZCwgQUVTX1JFR19DVFJMLCBkZC0+Y3RybCwgbWFzayk7CisJb21hcF9hZXNfd3JpdGVfbWFzayhkZCwgQUVTX1JFR19DVFJMLCB2YWwsIG1hc2spOwogCi1vdXQ6Ci0JLyogc3RhcnQgRE1BIG9yIGRpc2FibGUgaWRsZSBtb2RlICovCi0Jb21hcF9hZXNfd3JpdGVfbWFzayhkZCwgQUVTX1JFR19NQVNLLCBBRVNfUkVHX01BU0tfU1RBUlQsCi0JCQkgICAgQUVTX1JFR19NQVNLX1NUQVJUKTsKKwkvKiBJTiAqLworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhkZC0+ZG1hX2xjaF9pbiwgMCwgT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCisJCQkJIGRkLT5waHlzX2Jhc2UgKyBBRVNfUkVHX0RBVEEsIDAsIDQpOworCisJb21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZShkZC0+ZG1hX2xjaF9pbiwgT01BUF9ETUFfREFUQV9CVVJTVF80KTsKKwlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoZGQtPmRtYV9sY2hfaW4sIE9NQVBfRE1BX0RBVEFfQlVSU1RfNCk7CisKKwkvKiBPVVQgKi8KKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhkZC0+ZG1hX2xjaF9vdXQsIDAsIE9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCWRkLT5waHlzX2Jhc2UgKyBBRVNfUkVHX0RBVEEsIDAsIDQpOworCisJb21hcF9zZXRfZG1hX3NyY19idXJzdF9tb2RlKGRkLT5kbWFfbGNoX291dCwgT01BUF9ETUFfREFUQV9CVVJTVF80KTsKKwlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKGRkLT5kbWFfbGNoX291dCwgT01BUF9ETUFfREFUQV9CVVJTVF80KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IG9tYXBfYWVzX2RldiAqb21hcF9hZXNfZmluZF9kZXYoc3RydWN0IG9tYXBfYWVzX2N0eCAqY3R4KQpAQCAtMjg4LDggKzI4OSwxNiBAQAogewogCXN0cnVjdCBvbWFwX2Flc19kZXYgKmRkID0gZGF0YTsKIAotCWlmIChsY2ggPT0gZGQtPmRtYV9sY2hfb3V0KQotCQl0YXNrbGV0X3NjaGVkdWxlKCZkZC0+dGFzayk7CisJaWYgKGNoX3N0YXR1cyAhPSBPTUFQX0RNQV9CTE9DS19JUlEpIHsKKwkJcHJfZXJyKCJvbWFwLWFlcyBETUEgZXJyb3Igc3RhdHVzOiAweCVoeFxuIiwgY2hfc3RhdHVzKTsKKwkJZGQtPmVyciA9IC1FSU87CisJCWRkLT5mbGFncyAmPSB+RkxBR1NfSU5JVDsgLyogcmVxdWVzdCB0byByZS1pbml0aWFsaXplICovCisJfSBlbHNlIGlmIChsY2ggPT0gZGQtPmRtYV9sY2hfaW4pIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGRtYV9sY2hfb3V0IC0gY29tcGxldGVkICovCisJdGFza2xldF9zY2hlZHVsZSgmZGQtPmRvbmVfdGFzayk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9hZXNfZG1hX2luaXQoc3RydWN0IG9tYXBfYWVzX2RldiAqZGQpCkBAIC0zMzksMTggKzM0OCw2IEBACiAJCWdvdG8gZXJyX2RtYV9vdXQ7CiAJfQogCi0Jb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKGRkLT5kbWFfbGNoX2luLCAwLCBPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKLQkJCQkgZGQtPnBoeXNfYmFzZSArIEFFU19SRUdfREFUQSwgMCwgNCk7Ci0KLQlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKGRkLT5kbWFfbGNoX2luLCBPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOwotCW9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZShkZC0+ZG1hX2xjaF9pbiwgT01BUF9ETUFfREFUQV9CVVJTVF80KTsKLQotCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKGRkLT5kbWFfbGNoX291dCwgMCwgT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCi0JCQkJZGQtPnBoeXNfYmFzZSArIEFFU19SRUdfREFUQSwgMCwgNCk7Ci0KLQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoZGQtPmRtYV9sY2hfb3V0LCBPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOwotCW9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUoZGQtPmRtYV9sY2hfb3V0LCBPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9kbWFfb3V0OgpAQCAtNDA2LDYgKzQwMywxMSBAQAogCQlpZiAoIWNvdW50KQogCQkJcmV0dXJuIG9mZjsKIAorCQkvKgorCQkgKiBidWZsZW4gYW5kIHRvdGFsIGFyZSBBRVNfQkxPQ0tfU0laRSBzaXplIGFsaWduZWQsCisJCSAqIHNvIGNvdW50IHNob3VsZCBiZSBhbHNvIGFsaWduZWQKKwkJICovCisKIAkJc2dfY29weV9idWYoYnVmICsgb2ZmLCAqc2csICpvZmZzZXQsIGNvdW50LCBvdXQpOwogCiAJCW9mZiArPSBjb3VudDsKQEAgLTQ2MSw3ICs0NjMsOSBAQAogCW9tYXBfc3RhcnRfZG1hKGRkLT5kbWFfbGNoX2luKTsKIAlvbWFwX3N0YXJ0X2RtYShkZC0+ZG1hX2xjaF9vdXQpOwogCi0Jb21hcF9hZXNfd3JpdGVfY3RybChkZCk7CisJLyogc3RhcnQgRE1BIG9yIGRpc2FibGUgaWRsZSBtb2RlICovCisJb21hcF9hZXNfd3JpdGVfbWFzayhkZCwgQUVTX1JFR19NQVNLLCBBRVNfUkVHX01BU0tfU1RBUlQsCisJCQkgICAgQUVTX1JFR19NQVNLX1NUQVJUKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDg4LDggKzQ5MiwxMCBAQAogCQljb3VudCA9IG1pbihkZC0+dG90YWwsIHNnX2RtYV9sZW4oZGQtPmluX3NnKSk7CiAJCWNvdW50ID0gbWluKGNvdW50LCBzZ19kbWFfbGVuKGRkLT5vdXRfc2cpKTsKIAotCQlpZiAoY291bnQgIT0gZGQtPnRvdGFsKQorCQlpZiAoY291bnQgIT0gZGQtPnRvdGFsKSB7CisJCQlwcl9lcnIoInJlcXVlc3QgbGVuZ3RoICE9IGJ1ZmZlciBsZW5ndGhcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAogCQlwcl9kZWJ1ZygiZmFzdFxuIik7CiAKQEAgLTUyNSwyMyArNTMxLDI1IEBACiAKIAlkZC0+dG90YWwgLT0gY291bnQ7CiAKLQllcnIgPSBvbWFwX2Flc19od19pbml0KGRkKTsKLQogCWVyciA9IG9tYXBfYWVzX2NyeXB0X2RtYSh0Zm0sIGFkZHJfaW4sIGFkZHJfb3V0LCBjb3VudCk7CisJaWYgKGVycikgeworCQlkbWFfdW5tYXBfc2coZGQtPmRldiwgZGQtPmluX3NnLCAxLCBETUFfVE9fREVWSUNFKTsKKwkJZG1hX3VubWFwX3NnKGRkLT5kZXYsIGRkLT5vdXRfc2csIDEsIERNQV9UT19ERVZJQ0UpOworCX0KIAogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfYWVzX2ZpbmlzaF9yZXEoc3RydWN0IG9tYXBfYWVzX2RldiAqZGQsIGludCBlcnIpCiB7Ci0Jc3RydWN0IG9tYXBfYWVzX2N0eCAqY3R4OworCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSA9IGRkLT5yZXE7CiAKIAlwcl9kZWJ1ZygiZXJyOiAlZFxuIiwgZXJyKTsKIAotCWN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eChjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0oZGQtPnJlcSkpOworCWNsa19kaXNhYmxlKGRkLT5pY2xrKTsKKwlkZC0+ZmxhZ3MgJj0gfkZMQUdTX0JVU1k7CiAKLQlpZiAoIWRkLT50b3RhbCkKLQkJZGQtPnJlcS0+YmFzZS5jb21wbGV0ZSgmZGQtPnJlcS0+YmFzZSwgZXJyKTsKKwlyZXEtPmJhc2UuY29tcGxldGUoJnJlcS0+YmFzZSwgZXJyKTsKIH0KIAogc3RhdGljIGludCBvbWFwX2Flc19jcnlwdF9kbWFfc3RvcChzdHJ1Y3Qgb21hcF9hZXNfZGV2ICpkZCkKQEAgLTU1Myw4ICs1NjEsNiBAQAogCiAJb21hcF9hZXNfd3JpdGVfbWFzayhkZCwgQUVTX1JFR19NQVNLLCAwLCBBRVNfUkVHX01BU0tfU1RBUlQpOwogCi0Jb21hcF9hZXNfaHdfY2xlYW51cChkZCk7Ci0KIAlvbWFwX3N0b3BfZG1hKGRkLT5kbWFfbGNoX2luKTsKIAlvbWFwX3N0b3BfZG1hKGRkLT5kbWFfbGNoX291dCk7CiAKQEAgLTU3NCw0MCArNTgwLDM5IEBACiAJCX0KIAl9CiAKLQlpZiAoZXJyIHx8ICFkZC0+dG90YWwpCi0JCW9tYXBfYWVzX2ZpbmlzaF9yZXEoZGQsIGVycik7Ci0KIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9tYXBfYWVzX2hhbmRsZV9yZXEoc3RydWN0IG9tYXBfYWVzX2RldiAqZGQpCitzdGF0aWMgaW50IG9tYXBfYWVzX2hhbmRsZV9xdWV1ZShzdHJ1Y3Qgb21hcF9hZXNfZGV2ICpkZCwKKwkJCSAgICAgICBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXEsICpiYWNrbG9nOwogCXN0cnVjdCBvbWFwX2Flc19jdHggKmN0eDsKIAlzdHJ1Y3Qgb21hcF9hZXNfcmVxY3R4ICpyY3R4OwotCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGRkLT50b3RhbCkKLQkJZ290byBzdGFydDsKKwlpbnQgZXJyLCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRkLT5sb2NrLCBmbGFncyk7CisJaWYgKHJlcSkKKwkJcmV0ID0gYWJsa2NpcGhlcl9lbnF1ZXVlX3JlcXVlc3QoJmRkLT5xdWV1ZSwgcmVxKTsKKwlpZiAoZGQtPmZsYWdzICYgRkxBR1NfQlVTWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KIAliYWNrbG9nID0gY3J5cHRvX2dldF9iYWNrbG9nKCZkZC0+cXVldWUpOwogCWFzeW5jX3JlcSA9IGNyeXB0b19kZXF1ZXVlX3JlcXVlc3QoJmRkLT5xdWV1ZSk7Ci0JaWYgKCFhc3luY19yZXEpCi0JCWNsZWFyX2JpdChGTEFHU19CVVNZLCAmZGQtPmZsYWdzKTsKKwlpZiAoYXN5bmNfcmVxKQorCQlkZC0+ZmxhZ3MgfD0gRkxBR1NfQlVTWTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFhc3luY19yZXEpCi0JCXJldHVybiAwOworCQlyZXR1cm4gcmV0OwogCiAJaWYgKGJhY2tsb2cpCiAJCWJhY2tsb2ctPmNvbXBsZXRlKGJhY2tsb2csIC1FSU5QUk9HUkVTUyk7CiAKIAlyZXEgPSBhYmxrY2lwaGVyX3JlcXVlc3RfY2FzdChhc3luY19yZXEpOwogCi0JcHJfZGVidWcoImdldCBuZXcgcmVxXG4iKTsKLQogCS8qIGFzc2lnbiBuZXcgcmVxdWVzdCB0byBkZXZpY2UgKi8KIAlkZC0+cmVxID0gcmVxOwogCWRkLT50b3RhbCA9IHJlcS0+bmJ5dGVzOwpAQCAtNjIxLDI3ICs2MjYsMjIgQEAKIAlyY3R4LT5tb2RlICY9IEZMQUdTX01PREVfTUFTSzsKIAlkZC0+ZmxhZ3MgPSAoZGQtPmZsYWdzICYgfkZMQUdTX01PREVfTUFTSykgfCByY3R4LT5tb2RlOwogCi0JZGQtPml2ID0gcmVxLT5pbmZvOwotCWlmICgoZGQtPmZsYWdzICYgRkxBR1NfQ0JDKSAmJiBkZC0+aXYpCi0JCWRkLT5mbGFncyB8PSBGTEFHU19ORVdfSVY7Ci0JZWxzZQotCQlkZC0+ZmxhZ3MgJj0gfkZMQUdTX05FV19JVjsKLQorCWRkLT5jdHggPSBjdHg7CiAJY3R4LT5kZCA9IGRkOwotCWlmIChkZC0+Y3R4ICE9IGN0eCkgewotCQkvKiBhc3NpZ24gbmV3IGNvbnRleHQgdG8gZGV2aWNlICovCi0JCWRkLT5jdHggPSBjdHg7Ci0JCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfTkVXX0tFWTsKKworCWVyciA9IG9tYXBfYWVzX3dyaXRlX2N0cmwoZGQpOworCWlmICghZXJyKQorCQllcnIgPSBvbWFwX2Flc19jcnlwdF9kbWFfc3RhcnQoZGQpOworCWlmIChlcnIpIHsKKwkJLyogYWVzX3Rhc2sgd2lsbCBub3QgZmluaXNoIGl0LCBzbyBkbyBpdCBoZXJlICovCisJCW9tYXBfYWVzX2ZpbmlzaF9yZXEoZGQsIGVycik7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmRkLT5xdWV1ZV90YXNrKTsKIAl9CiAKLQlpZiAoIUlTX0FMSUdORUQocmVxLT5uYnl0ZXMsIEFFU19CTE9DS19TSVpFKSkKLQkJcHJfZXJyKCJyZXF1ZXN0IHNpemUgaXMgbm90IGV4YWN0IGFtb3VudCBvZiBBRVMgYmxvY2tzXG4iKTsKLQotc3RhcnQ6Ci0JcmV0dXJuIG9tYXBfYWVzX2NyeXB0X2RtYV9zdGFydChkZCk7CisJcmV0dXJuIHJldDsgLyogcmV0dXJuIHJldCwgd2hpY2ggaXMgZW5xdWV1ZSByZXR1cm4gdmFsdWUgKi8KIH0KIAotc3RhdGljIHZvaWQgb21hcF9hZXNfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBvbWFwX2Flc19kb25lX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBvbWFwX2Flc19kZXYgKmRkID0gKHN0cnVjdCBvbWFwX2Flc19kZXYgKilkYXRhOwogCWludCBlcnI7CkBAIC02NTAsNDAgKzY1MCw1MCBAQAogCiAJZXJyID0gb21hcF9hZXNfY3J5cHRfZG1hX3N0b3AoZGQpOwogCi0JZXJyID0gb21hcF9hZXNfaGFuZGxlX3JlcShkZCk7CisJZXJyID0gZGQtPmVyciA/IDogZXJyOworCisJaWYgKGRkLT50b3RhbCAmJiAhZXJyKSB7CisJCWVyciA9IG9tYXBfYWVzX2NyeXB0X2RtYV9zdGFydChkZCk7CisJCWlmICghZXJyKQorCQkJcmV0dXJuOyAvKiBETUEgc3RhcnRlZC4gTm90IGZpbmluaXNoaW5nLiAqLworCX0KKworCW9tYXBfYWVzX2ZpbmlzaF9yZXEoZGQsIGVycik7CisJb21hcF9hZXNfaGFuZGxlX3F1ZXVlKGRkLCBOVUxMKTsKIAogCXByX2RlYnVnKCJleGl0XG4iKTsKIH0KIAorc3RhdGljIHZvaWQgb21hcF9hZXNfcXVldWVfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG9tYXBfYWVzX2RldiAqZGQgPSAoc3RydWN0IG9tYXBfYWVzX2RldiAqKWRhdGE7CisKKwlvbWFwX2Flc19oYW5kbGVfcXVldWUoZGQsIE5VTEwpOworfQorCiBzdGF0aWMgaW50IG9tYXBfYWVzX2NyeXB0KHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgbG9uZyBtb2RlKQogewogCXN0cnVjdCBvbWFwX2Flc19jdHggKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eCgKIAkJCWNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpKTsKIAlzdHJ1Y3Qgb21hcF9hZXNfcmVxY3R4ICpyY3R4ID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2N0eChyZXEpOwogCXN0cnVjdCBvbWFwX2Flc19kZXYgKmRkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVycjsKIAogCXByX2RlYnVnKCJuYnl0ZXM6ICVkLCBlbmM6ICVkLCBjYmM6ICVkXG4iLCByZXEtPm5ieXRlcywKIAkJICAhIShtb2RlICYgRkxBR1NfRU5DUllQVCksCiAJCSAgISEobW9kZSAmIEZMQUdTX0NCQykpOwogCisJaWYgKCFJU19BTElHTkVEKHJlcS0+bmJ5dGVzLCBBRVNfQkxPQ0tfU0laRSkpIHsKKwkJcHJfZXJyKCJyZXF1ZXN0IHNpemUgaXMgbm90IGV4YWN0IGFtb3VudCBvZiBBRVMgYmxvY2tzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZGQgPSBvbWFwX2Flc19maW5kX2RldihjdHgpOwogCWlmICghZGQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmN0eC0+bW9kZSA9IG1vZGU7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGQtPmxvY2ssIGZsYWdzKTsKLQllcnIgPSBhYmxrY2lwaGVyX2VucXVldWVfcmVxdWVzdCgmZGQtPnF1ZXVlLCByZXEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxBR1NfQlVTWSwgJmRkLT5mbGFncykpCi0JCW9tYXBfYWVzX2hhbmRsZV9yZXEoZGQpOwotCi0JcHJfZGVidWcoImV4aXRcbiIpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gb21hcF9hZXNfaGFuZGxlX3F1ZXVlKGRkLCByZXEpOwogfQogCiAvKiAqKioqKioqKioqKioqKioqKioqKioqIEFMRyBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC03MDEsNyArNzExLDYgQEAKIAogCW1lbWNweShjdHgtPmtleSwga2V5LCBrZXlsZW4pOwogCWN0eC0+a2V5bGVuID0ga2V5bGVuOwotCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfTkVXX0tFWTsKIAogCXJldHVybiAwOwogfQpAQCAtNzUwLDcgKzc1OSw3IEBACiAJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiB8IENSWVBUT19BTEdfQVNZTkMsCiAJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgb21hcF9hZXNfY3R4KSwKLQkuY3JhX2FsaWdubWFzawkgCT0gMCwKKwkuY3JhX2FsaWdubWFzawkJPSAwLAogCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2FibGtjaXBoZXJfdHlwZSwKIAkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKIAkuY3JhX2luaXQJCT0gb21hcF9hZXNfY3JhX2luaXQsCkBAIC03NzAsNyArNzc5LDcgQEAKIAkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSIHwgQ1JZUFRPX0FMR19BU1lOQywKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBvbWFwX2Flc19jdHgpLAotCS5jcmFfYWxpZ25tYXNrCSAJPSAwLAorCS5jcmFfYWxpZ25tYXNrCQk9IDAsCiAJLmNyYV90eXBlCQk9ICZjcnlwdG9fYWJsa2NpcGhlcl90eXBlLAogCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAogCS5jcmFfaW5pdAkJPSBvbWFwX2Flc19jcmFfaW5pdCwKQEAgLTg0OSw3ICs4NTgsOCBAQAogCQkgKHJlZyAmIEFFU19SRUdfUkVWX01BSk9SKSA+PiA0LCByZWcgJiBBRVNfUkVHX1JFVl9NSU5PUik7CiAJY2xrX2Rpc2FibGUoZGQtPmljbGspOwogCi0JdGFza2xldF9pbml0KCZkZC0+dGFzaywgb21hcF9hZXNfdGFzaywgKHVuc2lnbmVkIGxvbmcpZGQpOworCXRhc2tsZXRfaW5pdCgmZGQtPmRvbmVfdGFzaywgb21hcF9hZXNfZG9uZV90YXNrLCAodW5zaWduZWQgbG9uZylkZCk7CisJdGFza2xldF9pbml0KCZkZC0+cXVldWVfdGFzaywgb21hcF9hZXNfcXVldWVfdGFzaywgKHVuc2lnbmVkIGxvbmcpZGQpOwogCiAJZXJyID0gb21hcF9hZXNfZG1hX2luaXQoZGQpOwogCWlmIChlcnIpCkBAIC04NzYsNyArODg2LDggQEAKIAkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhbGdzW2pdKTsKIAlvbWFwX2Flc19kbWFfY2xlYW51cChkZCk7CiBlcnJfZG1hOgotCXRhc2tsZXRfa2lsbCgmZGQtPnRhc2spOworCXRhc2tsZXRfa2lsbCgmZGQtPmRvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZkZC0+cXVldWVfdGFzayk7CiAJaW91bm1hcChkZC0+aW9fYmFzZSk7CiBlcnJfaW86CiAJY2xrX3B1dChkZC0+aWNsayk7CkBAIC05MDMsNyArOTE0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbGdzKTsgaSsrKQogCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFsZ3NbaV0pOwogCi0JdGFza2xldF9raWxsKCZkZC0+dGFzayk7CisJdGFza2xldF9raWxsKCZkZC0+ZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmRkLT5xdWV1ZV90YXNrKTsKIAlvbWFwX2Flc19kbWFfY2xlYW51cChkZCk7CiAJaW91bm1hcChkZC0+aW9fYmFzZSk7CiAJY2xrX3B1dChkZC0+aWNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9vbWFwLXNoYW0uYyBiL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCmluZGV4IGEwODFjN2MuLjJlNzExMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL29tYXAtc2hhbS5jCkBAIC03MiwxMCArNzIsOSBAQAogCiAjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9JTlRFUlZBTAlIWgogCi0jZGVmaW5lIEZMQUdTX0ZJUlNUCQkweDAwMDEKICNkZWZpbmUgRkxBR1NfRklOVVAJCTB4MDAwMgogI2RlZmluZSBGTEFHU19GSU5BTAkJMHgwMDA0Ci0jZGVmaW5lIEZMQUdTX0ZBU1QJCTB4MDAwOAorI2RlZmluZSBGTEFHU19TRwkJMHgwMDA4CiAjZGVmaW5lIEZMQUdTX1NIQTEJCTB4MDAxMAogI2RlZmluZSBGTEFHU19ETUFfQUNUSVZFCTB4MDAyMAogI2RlZmluZSBGTEFHU19PVVRQVVRfUkVBRFkJMHgwMDQwCkBAIC04MywxMyArODIsMTcgQEAKICNkZWZpbmUgRkxBR1NfSU5JVAkJMHgwMTAwCiAjZGVmaW5lIEZMQUdTX0NQVQkJMHgwMjAwCiAjZGVmaW5lIEZMQUdTX0hNQUMJCTB4MDQwMAotCi0vKiAzcmQgYnl0ZSAqLwotI2RlZmluZSBGTEFHU19CVVNZCQkxNgorI2RlZmluZSBGTEFHU19FUlJPUgkJMHgwODAwCisjZGVmaW5lIEZMQUdTX0JVU1kJCTB4MTAwMAogCiAjZGVmaW5lIE9QX1VQREFURQkxCiAjZGVmaW5lIE9QX0ZJTkFMCTIKIAorI2RlZmluZSBPTUFQX0FMSUdOX01BU0sJCShzaXplb2YodTMyKS0xKQorI2RlZmluZSBPTUFQX0FMSUdORUQJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKHUzMikpKSkKKworI2RlZmluZSBCVUZMRU4JCVBBR0VfU0laRQorCiBzdHJ1Y3Qgb21hcF9zaGFtX2RldjsKIAogc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggewpAQCAtOTcsOCArMTAwLDggQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBsb25nCQlvcDsKIAorCXU4CQkJZGlnZXN0W1NIQTFfRElHRVNUX1NJWkVdIE9NQVBfQUxJR05FRDsKIAlzaXplX3QJCQlkaWdjbnQ7Ci0JdTgJCQkqYnVmZmVyOwogCXNpemVfdAkJCWJ1ZmNudDsKIAlzaXplX3QJCQlidWZsZW47CiAJZG1hX2FkZHJfdAkJZG1hX2FkZHI7CkBAIC0xMDcsNiArMTEwLDggQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXVuc2lnbmVkIGludAkJb2Zmc2V0OwkvKiBvZmZzZXQgaW4gY3VycmVudCBzZyAqLwogCXVuc2lnbmVkIGludAkJdG90YWw7CS8qIHRvdGFsIHJlcXVlc3QgKi8KKworCXU4CQkJYnVmZmVyWzBdIE9NQVBfQUxJR05FRDsKIH07CiAKIHN0cnVjdCBvbWFwX3NoYW1faG1hY19jdHggewpAQCAtMTM2LDYgKzE0MSw3IEBACiAJaW50CQkJaXJxOwogCXN0cnVjdCBjbGsJCSppY2xrOwogCXNwaW5sb2NrX3QJCWxvY2s7CisJaW50CQkJZXJyOwogCWludAkJCWRtYTsKIAlpbnQJCQlkbWFfbGNoOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkb25lX3Rhc2s7CkBAIC0xOTQsNTMgKzIwMCw2OCBAQAogc3RhdGljIHZvaWQgb21hcF9zaGFtX2NvcHlfaGFzaChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxLCBpbnQgb3V0KQogewogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXUzMiAqaGFzaCA9ICh1MzIgKiljdHgtPmRpZ2VzdDsKKwlpbnQgaTsKKworCS8qIE1ENSBpcyBhbG1vc3QgdW51c2VkLiBTbyBjb3B5IHNoYTEgc2l6ZSB0byByZWR1Y2UgY29kZSAqLworCWZvciAoaSA9IDA7IGkgPCBTSEExX0RJR0VTVF9TSVpFIC8gc2l6ZW9mKHUzMik7IGkrKykgeworCQlpZiAob3V0KQorCQkJaGFzaFtpXSA9IG9tYXBfc2hhbV9yZWFkKGN0eC0+ZGQsCisJCQkJCQlTSEFfUkVHX0RJR0VTVChpKSk7CisJCWVsc2UKKwkJCW9tYXBfc2hhbV93cml0ZShjdHgtPmRkLAorCQkJCQlTSEFfUkVHX0RJR0VTVChpKSwgaGFzaFtpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX3NoYW1fY29weV9yZWFkeV9oYXNoKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJdTMyICppbiA9ICh1MzIgKiljdHgtPmRpZ2VzdDsKIAl1MzIgKmhhc2ggPSAodTMyICopcmVxLT5yZXN1bHQ7CiAJaW50IGk7CiAKKwlpZiAoIWhhc2gpCisJCXJldHVybjsKKwogCWlmIChsaWtlbHkoY3R4LT5mbGFncyAmIEZMQUdTX1NIQTEpKSB7CiAJCS8qIFNIQTEgcmVzdWx0cyBhcmUgaW4gYmlnIGVuZGlhbiAqLwogCQlmb3IgKGkgPSAwOyBpIDwgU0hBMV9ESUdFU1RfU0laRSAvIHNpemVvZih1MzIpOyBpKyspCi0JCQlpZiAob3V0KQotCQkJCWhhc2hbaV0gPSBiZTMyX3RvX2NwdShvbWFwX3NoYW1fcmVhZChjdHgtPmRkLAotCQkJCQkJCVNIQV9SRUdfRElHRVNUKGkpKSk7Ci0JCQllbHNlCi0JCQkJb21hcF9zaGFtX3dyaXRlKGN0eC0+ZGQsIFNIQV9SRUdfRElHRVNUKGkpLAotCQkJCQkJCWNwdV90b19iZTMyKGhhc2hbaV0pKTsKKwkJCWhhc2hbaV0gPSBiZTMyX3RvX2NwdShpbltpXSk7CiAJfSBlbHNlIHsKIAkJLyogTUQ1IHJlc3VsdHMgYXJlIGluIGxpdHRsZSBlbmRpYW4gKi8KIAkJZm9yIChpID0gMDsgaSA8IE1ENV9ESUdFU1RfU0laRSAvIHNpemVvZih1MzIpOyBpKyspCi0JCQlpZiAob3V0KQotCQkJCWhhc2hbaV0gPSBsZTMyX3RvX2NwdShvbWFwX3NoYW1fcmVhZChjdHgtPmRkLAotCQkJCQkJCVNIQV9SRUdfRElHRVNUKGkpKSk7Ci0JCQllbHNlCi0JCQkJb21hcF9zaGFtX3dyaXRlKGN0eC0+ZGQsIFNIQV9SRUdfRElHRVNUKGkpLAotCQkJCQkJCWNwdV90b19sZTMyKGhhc2hbaV0pKTsKKwkJCWhhc2hbaV0gPSBsZTMyX3RvX2NwdShpbltpXSk7CiAJfQogfQogCi1zdGF0aWMgaW50IG9tYXBfc2hhbV93cml0ZV9jdHJsKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCwgc2l6ZV90IGxlbmd0aCwKK3N0YXRpYyBpbnQgb21hcF9zaGFtX2h3X2luaXQoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkKQoreworCWNsa19lbmFibGUoZGQtPmljbGspOworCisJaWYgKCEoZGQtPmZsYWdzICYgRkxBR1NfSU5JVCkpIHsKKwkJb21hcF9zaGFtX3dyaXRlX21hc2soZGQsIFNIQV9SRUdfTUFTSywKKwkJCVNIQV9SRUdfTUFTS19TT0ZUUkVTRVQsIFNIQV9SRUdfTUFTS19TT0ZUUkVTRVQpOworCisJCWlmIChvbWFwX3NoYW1fd2FpdChkZCwgU0hBX1JFR19TWVNTVEFUVVMsCisJCQkJCVNIQV9SRUdfU1lTU1RBVFVTX1JFU0VURE9ORSkpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQlkZC0+ZmxhZ3MgfD0gRkxBR1NfSU5JVDsKKwkJZGQtPmVyciA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfc2hhbV93cml0ZV9jdHJsKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCwgc2l6ZV90IGxlbmd0aCwKIAkJCQkgaW50IGZpbmFsLCBpbnQgZG1hKQogewogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChkZC0+cmVxKTsKIAl1MzIgdmFsID0gbGVuZ3RoIDw8IDUsIG1hc2s7CiAKLQlpZiAodW5saWtlbHkoIWN0eC0+ZGlnY250KSkgewotCi0JCWNsa19lbmFibGUoZGQtPmljbGspOwotCi0JCWlmICghKGRkLT5mbGFncyAmIEZMQUdTX0lOSVQpKSB7Ci0JCQlvbWFwX3NoYW1fd3JpdGVfbWFzayhkZCwgU0hBX1JFR19NQVNLLAotCQkJCVNIQV9SRUdfTUFTS19TT0ZUUkVTRVQsIFNIQV9SRUdfTUFTS19TT0ZUUkVTRVQpOwotCi0JCQlpZiAob21hcF9zaGFtX3dhaXQoZGQsIFNIQV9SRUdfU1lTU1RBVFVTLAotCQkJCQkJU0hBX1JFR19TWVNTVEFUVVNfUkVTRVRET05FKSkKLQkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQotCQkJZGQtPmZsYWdzIHw9IEZMQUdTX0lOSVQ7Ci0JCX0KLQl9IGVsc2UgeworCWlmIChsaWtlbHkoY3R4LT5kaWdjbnQpKQogCQlvbWFwX3NoYW1fd3JpdGUoZGQsIFNIQV9SRUdfRElHQ05ULCBjdHgtPmRpZ2NudCk7Ci0JfQogCiAJb21hcF9zaGFtX3dyaXRlX21hc2soZGQsIFNIQV9SRUdfTUFTSywKIAkJU0hBX1JFR19NQVNLX0lUX0VOIHwgKGRtYSA/IFNIQV9SRUdfTUFTS19ETUFfRU4gOiAwKSwKQEAgLTI2MCwyOSArMjgxLDI2IEBACiAJCQlTSEFfUkVHX0NUUkxfQUxHTyB8IFNIQV9SRUdfQ1RSTF9MRU5HVEg7CiAKIAlvbWFwX3NoYW1fd3JpdGVfbWFzayhkZCwgU0hBX1JFR19DVFJMLCB2YWwsIG1hc2spOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9zaGFtX3htaXRfY3B1KHN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCwgY29uc3QgdTggKmJ1ZiwKIAkJCSAgICAgIHNpemVfdCBsZW5ndGgsIGludCBmaW5hbCkKIHsKIAlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoZGQtPnJlcSk7Ci0JaW50IGVyciwgY291bnQsIGxlbjMyOworCWludCBjb3VudCwgbGVuMzI7CiAJY29uc3QgdTMyICpidWZmZXIgPSAoY29uc3QgdTMyICopYnVmOwogCiAJZGV2X2RiZyhkZC0+ZGV2LCAieG1pdF9jcHU6IGRpZ2NudDogJWQsIGxlbmd0aDogJWQsIGZpbmFsOiAlZFxuIiwKIAkJCQkJCWN0eC0+ZGlnY250LCBsZW5ndGgsIGZpbmFsKTsKIAotCWVyciA9IG9tYXBfc2hhbV93cml0ZV9jdHJsKGRkLCBsZW5ndGgsIGZpbmFsLCAwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCW9tYXBfc2hhbV93cml0ZV9jdHJsKGRkLCBsZW5ndGgsIGZpbmFsLCAwKTsKKworCS8qIHNob3VsZCBiZSBub24temVybyBiZWZvcmUgbmV4dCBsaW5lcyB0byBkaXNhYmxlIGNsb2NrcyBsYXRlciAqLworCWN0eC0+ZGlnY250ICs9IGxlbmd0aDsKIAogCWlmIChvbWFwX3NoYW1fd2FpdChkZCwgU0hBX1JFR19DVFJMLCBTSEFfUkVHX0NUUkxfSU5QVVRfUkVBRFkpKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAotCWN0eC0+ZGlnY250ICs9IGxlbmd0aDsKLQogCWlmIChmaW5hbCkKIAkJY3R4LT5mbGFncyB8PSBGTEFHU19GSU5BTDsgLyogY2F0Y2ggbGFzdCBpbnRlcnJ1cHQgKi8KIApAQCAtMjk4LDE2ICszMTYsMTEgQEAKIAkJCSAgICAgIHNpemVfdCBsZW5ndGgsIGludCBmaW5hbCkKIHsKIAlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoZGQtPnJlcSk7Ci0JaW50IGVyciwgbGVuMzI7CisJaW50IGxlbjMyOwogCiAJZGV2X2RiZyhkZC0+ZGV2LCAieG1pdF9kbWE6IGRpZ2NudDogJWQsIGxlbmd0aDogJWQsIGZpbmFsOiAlZFxuIiwKIAkJCQkJCWN0eC0+ZGlnY250LCBsZW5ndGgsIGZpbmFsKTsKIAotCS8qIGZsdXNoIGNhY2hlIGVudHJpZXMgcmVsYXRlZCB0byBvdXIgcGFnZSAqLwotCWlmIChkbWFfYWRkciA9PSBjdHgtPmRtYV9hZGRyKQotCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZC0+ZGV2LCBkbWFfYWRkciwgbGVuZ3RoLAotCQkJCQkgICBETUFfVE9fREVWSUNFKTsKLQogCWxlbjMyID0gRElWX1JPVU5EX1VQKGxlbmd0aCwgc2l6ZW9mKHUzMikpOwogCiAJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhkZC0+ZG1hX2xjaCwgT01BUF9ETUFfREFUQV9UWVBFX1MzMiwgbGVuMzIsCkBAIC0zMTcsOSArMzMwLDcgQEAKIAlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhkZC0+ZG1hX2xjaCwgMCwgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCiAJCQkJZG1hX2FkZHIsIDAsIDApOwogCi0JZXJyID0gb21hcF9zaGFtX3dyaXRlX2N0cmwoZGQsIGxlbmd0aCwgZmluYWwsIDEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJb21hcF9zaGFtX3dyaXRlX2N0cmwoZGQsIGxlbmd0aCwgZmluYWwsIDEpOwogCiAJY3R4LT5kaWdjbnQgKz0gbGVuZ3RoOwogCkBAIC0zNzEsMTUgKzM4MiwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9tYXBfc2hhbV94bWl0X2RtYV9tYXAoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkLAorCQkJCQlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4LAorCQkJCQlzaXplX3QgbGVuZ3RoLCBpbnQgZmluYWwpCit7CisJY3R4LT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGRkLT5kZXYsIGN0eC0+YnVmZmVyLCBjdHgtPmJ1ZmxlbiwKKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRkLT5kZXYsIGN0eC0+ZG1hX2FkZHIpKSB7CisJCWRldl9lcnIoZGQtPmRldiwgImRtYSAldSBieXRlcyBlcnJvclxuIiwgY3R4LT5idWZsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmZsYWdzICY9IH5GTEFHU19TRzsKKworCS8qIG5leHQgY2FsbCBkb2VzIG5vdCBmYWlsLi4uIHNvIG5vIHVubWFwIGluIHRoZSBjYXNlIG9mIGVycm9yICovCisJcmV0dXJuIG9tYXBfc2hhbV94bWl0X2RtYShkZCwgY3R4LT5kbWFfYWRkciwgbGVuZ3RoLCBmaW5hbCk7Cit9CisKIHN0YXRpYyBpbnQgb21hcF9zaGFtX3VwZGF0ZV9kbWFfc2xvdyhzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqZGQpCiB7CiAJc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGRkLT5yZXEpOwogCXVuc2lnbmVkIGludCBmaW5hbDsKIAlzaXplX3QgY291bnQ7CiAKLQlpZiAoIWN0eC0+dG90YWwpCi0JCXJldHVybiAwOwotCiAJb21hcF9zaGFtX2FwcGVuZF9zZyhjdHgpOwogCiAJZmluYWwgPSAoY3R4LT5mbGFncyAmIEZMQUdTX0ZJTlVQKSAmJiAhY3R4LT50b3RhbDsKQEAgLTM5MCwzMCArNDE1LDY4IEBACiAJaWYgKGZpbmFsIHx8IChjdHgtPmJ1ZmNudCA9PSBjdHgtPmJ1ZmxlbiAmJiBjdHgtPnRvdGFsKSkgewogCQljb3VudCA9IGN0eC0+YnVmY250OwogCQljdHgtPmJ1ZmNudCA9IDA7Ci0JCXJldHVybiBvbWFwX3NoYW1feG1pdF9kbWEoZGQsIGN0eC0+ZG1hX2FkZHIsIGNvdW50LCBmaW5hbCk7CisJCXJldHVybiBvbWFwX3NoYW1feG1pdF9kbWFfbWFwKGRkLCBjdHgsIGNvdW50LCBmaW5hbCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9zaGFtX3VwZGF0ZV9kbWFfZmFzdChzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqZGQpCisvKiBTdGFydCBhZGRyZXNzIGFsaWdubWVudCAqLworI2RlZmluZSBTR19BQShzZykJKElTX0FMSUdORUQoc2ctPm9mZnNldCwgc2l6ZW9mKHUzMikpKQorLyogU0hBMSBibG9jayBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBTR19TQShzZykJKElTX0FMSUdORUQoc2ctPmxlbmd0aCwgU0hBMV9NRDVfQkxPQ0tfU0laRSkpCisKK3N0YXRpYyBpbnQgb21hcF9zaGFtX3VwZGF0ZV9kbWFfc3RhcnQoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkKQogewogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChkZC0+cmVxKTsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGludCBsZW5ndGgsIGZpbmFsLCB0YWlsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAKLQljdHgtPmZsYWdzIHw9IEZMQUdTX0ZBU1Q7CisJaWYgKCFjdHgtPnRvdGFsKQorCQlyZXR1cm4gMDsKIAotCWxlbmd0aCA9IG1pbihjdHgtPnRvdGFsLCBzZ19kbWFfbGVuKGN0eC0+c2cpKTsKLQljdHgtPnRvdGFsID0gbGVuZ3RoOworCWlmIChjdHgtPmJ1ZmNudCB8fCBjdHgtPm9mZnNldCkKKwkJcmV0dXJuIG9tYXBfc2hhbV91cGRhdGVfZG1hX3Nsb3coZGQpOworCisJZGV2X2RiZyhkZC0+ZGV2LCAiZmFzdDogZGlnY250OiAlZCwgYnVmY250OiAldSwgdG90YWw6ICV1XG4iLAorCQkJY3R4LT5kaWdjbnQsIGN0eC0+YnVmY250LCBjdHgtPnRvdGFsKTsKKworCXNnID0gY3R4LT5zZzsKKworCWlmICghU0dfQUEoc2cpKQorCQlyZXR1cm4gb21hcF9zaGFtX3VwZGF0ZV9kbWFfc2xvdyhkZCk7CisKKwlpZiAoIXNnX2lzX2xhc3Qoc2cpICYmICFTR19TQShzZykpCisJCS8qIHNpemUgaXMgbm90IFNIQTFfQkxPQ0tfU0laRSBhbGlnbmVkICovCisJCXJldHVybiBvbWFwX3NoYW1fdXBkYXRlX2RtYV9zbG93KGRkKTsKKworCWxlbmd0aCA9IG1pbihjdHgtPnRvdGFsLCBzZy0+bGVuZ3RoKTsKKworCWlmIChzZ19pc19sYXN0KHNnKSkgeworCQlpZiAoIShjdHgtPmZsYWdzICYgRkxBR1NfRklOVVApKSB7CisJCQkvKiBub3QgbGFzdCBzZyBtdXN0IGJlIFNIQTFfTUQ1X0JMT0NLX1NJWkUgYWxpZ25lZCAqLworCQkJdGFpbCA9IGxlbmd0aCAmIChTSEExX01ENV9CTE9DS19TSVpFIC0gMSk7CisJCQkvKiB3aXRob3V0IGZpbnVwKCkgd2UgbmVlZCBvbmUgYmxvY2sgdG8gY2xvc2UgaGFzaCAqLworCQkJaWYgKCF0YWlsKQorCQkJCXRhaWwgPSBTSEExX01ENV9CTE9DS19TSVpFOworCQkJbGVuZ3RoIC09IHRhaWw7CisJCX0KKwl9CiAKIAlpZiAoIWRtYV9tYXBfc2coZGQtPmRldiwgY3R4LT5zZywgMSwgRE1BX1RPX0RFVklDRSkpIHsKIAkJZGV2X2VycihkZC0+ZGV2LCAiZG1hX21hcF9zZyAgZXJyb3JcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljdHgtPnRvdGFsIC09IGxlbmd0aDsKKwljdHgtPmZsYWdzIHw9IEZMQUdTX1NHOwogCi0JcmV0dXJuIG9tYXBfc2hhbV94bWl0X2RtYShkZCwgc2dfZG1hX2FkZHJlc3MoY3R4LT5zZyksIGxlbmd0aCwgMSk7CisJY3R4LT50b3RhbCAtPSBsZW5ndGg7CisJY3R4LT5vZmZzZXQgPSBsZW5ndGg7IC8qIG9mZnNldCB3aGVyZSB0byBzdGFydCBzbG93ICovCisKKwlmaW5hbCA9IChjdHgtPmZsYWdzICYgRkxBR1NfRklOVVApICYmICFjdHgtPnRvdGFsOworCisJLyogbmV4dCBjYWxsIGRvZXMgbm90IGZhaWwuLi4gc28gbm8gdW5tYXAgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgKi8KKwlyZXR1cm4gb21hcF9zaGFtX3htaXRfZG1hKGRkLCBzZ19kbWFfYWRkcmVzcyhjdHgtPnNnKSwgbGVuZ3RoLCBmaW5hbCk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9zaGFtX3VwZGF0ZV9jcHUoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkKQpAQCAtNDMzLDggKzQ5NiwxNyBAQAogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChkZC0+cmVxKTsKIAogCW9tYXBfc3RvcF9kbWEoZGQtPmRtYV9sY2gpOwotCWlmIChjdHgtPmZsYWdzICYgRkxBR1NfRkFTVCkKKwlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX1NHKSB7CiAJCWRtYV91bm1hcF9zZyhkZC0+ZGV2LCBjdHgtPnNnLCAxLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGN0eC0+c2ctPmxlbmd0aCA9PSBjdHgtPm9mZnNldCkgeworCQkJY3R4LT5zZyA9IHNnX25leHQoY3R4LT5zZyk7CisJCQlpZiAoY3R4LT5zZykKKwkJCQljdHgtPm9mZnNldCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlkbWFfdW5tYXBfc2luZ2xlKGRkLT5kZXYsIGN0eC0+ZG1hX2FkZHIsIGN0eC0+YnVmbGVuLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1NCwxNCArNTI2LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGN0eC0+ZGlnY250KQotCQljbGtfZGlzYWJsZShkZC0+aWNsayk7Ci0KLQlpZiAoY3R4LT5kbWFfYWRkcikKLQkJZG1hX3VubWFwX3NpbmdsZShkZC0+ZGV2LCBjdHgtPmRtYV9hZGRyLCBjdHgtPmJ1ZmxlbiwKLQkJCQkgRE1BX1RPX0RFVklDRSk7Ci0KLQlpZiAoY3R4LT5idWZmZXIpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljdHgtPmJ1ZmZlcik7CisJCW9tYXBfc2hhbV9jb3B5X3JlYWR5X2hhc2gocmVxKTsKIAogCWRldl9kYmcoZGQtPmRldiwgImRpZ2NudDogJWQsIGJ1ZmNudDogJWRcbiIsIGN0eC0+ZGlnY250LCBjdHgtPmJ1ZmNudCk7CiB9CkBAIC00ODksOCArNTU0LDYgQEAKIAogCWN0eC0+ZmxhZ3MgPSAwOwogCi0JY3R4LT5mbGFncyB8PSBGTEFHU19GSVJTVDsKLQogCWRldl9kYmcoZGQtPmRldiwgImluaXQ6IGRpZ2VzdCBzaXplOiAlZFxuIiwKIAkJY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKSk7CiAKQEAgLTQ5OSwyMSArNTYyLDcgQEAKIAogCWN0eC0+YnVmY250ID0gMDsKIAljdHgtPmRpZ2NudCA9IDA7Ci0KLQljdHgtPmJ1ZmxlbiA9IFBBR0VfU0laRTsKLQljdHgtPmJ1ZmZlciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKAotCQkJCShyZXEtPmJhc2UuZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVApID8KLQkJCQlHRlBfS0VSTkVMIDogR0ZQX0FUT01JQyk7Ci0JaWYgKCFjdHgtPmJ1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljdHgtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoZGQtPmRldiwgY3R4LT5idWZmZXIsIGN0eC0+YnVmbGVuLAotCQkJCQlETUFfVE9fREVWSUNFKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGQtPmRldiwgY3R4LT5kbWFfYWRkcikpIHsKLQkJZGV2X2VycihkZC0+ZGV2LCAiZG1hICV1IGJ5dGVzIGVycm9yXG4iLCBjdHgtPmJ1Zmxlbik7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljdHgtPmJ1ZmZlcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwljdHgtPmJ1ZmxlbiA9IEJVRkxFTjsKIAogCWlmICh0Y3R4LT5mbGFncyAmIEZMQUdTX0hNQUMpIHsKIAkJc3RydWN0IG9tYXBfc2hhbV9obWFjX2N0eCAqYmN0eCA9IHRjdHgtPmJhc2U7CkBAIC01MzgsMTAgKzU4Nyw4IEBACiAKIAlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX0NQVSkKIAkJZXJyID0gb21hcF9zaGFtX3VwZGF0ZV9jcHUoZGQpOwotCWVsc2UgaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19GQVNUKQotCQllcnIgPSBvbWFwX3NoYW1fdXBkYXRlX2RtYV9mYXN0KGRkKTsKIAllbHNlCi0JCWVyciA9IG9tYXBfc2hhbV91cGRhdGVfZG1hX3Nsb3coZGQpOworCQllcnIgPSBvbWFwX3NoYW1fdXBkYXRlX2RtYV9zdGFydChkZCk7CiAKIAkvKiB3YWl0IGZvciBkbWEgY29tcGxldGlvbiBiZWZvcmUgY2FuIHRha2UgbW9yZSBkYXRhICovCiAJZGV2X2RiZyhkZC0+ZGV2LCAidXBkYXRlOiBlcnI6ICVkLCBkaWdjbnQ6ICVkXG4iLCBlcnIsIGN0eC0+ZGlnY250KTsKQEAgLTU2MCwxNSArNjA3LDEyIEBACiAJCXVzZV9kbWEgPSAwOwogCiAJaWYgKHVzZV9kbWEpCi0JCWVyciA9IG9tYXBfc2hhbV94bWl0X2RtYShkZCwgY3R4LT5kbWFfYWRkciwgY3R4LT5idWZjbnQsIDEpOworCQllcnIgPSBvbWFwX3NoYW1feG1pdF9kbWFfbWFwKGRkLCBjdHgsIGN0eC0+YnVmY250LCAxKTsKIAllbHNlCiAJCWVyciA9IG9tYXBfc2hhbV94bWl0X2NwdShkZCwgY3R4LT5idWZmZXIsIGN0eC0+YnVmY250LCAxKTsKIAogCWN0eC0+YnVmY250ID0gMDsKIAotCWlmIChlcnIgIT0gLUVJTlBST0dSRVNTKQotCQlvbWFwX3NoYW1fY2xlYW51cChyZXEpOwotCiAJZGV2X2RiZyhkZC0+ZGV2LCAiZmluYWxfcmVxOiBlcnI6ICVkXG4iLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKQEAgLTU3Niw2ICs2MjAsNyBAQAogCiBzdGF0aWMgaW50IG9tYXBfc2hhbV9maW5pc2hfcmVxX2htYWMoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKIHsKKwlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKIAlzdHJ1Y3Qgb21hcF9zaGFtX2N0eCAqdGN0eCA9IGNyeXB0b190Zm1fY3R4KHJlcS0+YmFzZS50Zm0pOwogCXN0cnVjdCBvbWFwX3NoYW1faG1hY19jdHggKmJjdHggPSB0Y3R4LT5iYXNlOwogCWludCBicyA9IGNyeXB0b19zaGFzaF9ibG9ja3NpemUoYmN0eC0+c2hhc2gpOwpAQCAtNTkwLDQ4ICs2MzUsNTYgQEAKIAogCXJldHVybiBjcnlwdG9fc2hhc2hfaW5pdCgmZGVzYy5zaGFzaCkgPzoKIAkgICAgICAgY3J5cHRvX3NoYXNoX3VwZGF0ZSgmZGVzYy5zaGFzaCwgYmN0eC0+b3BhZCwgYnMpID86Ci0JICAgICAgIGNyeXB0b19zaGFzaF9maW51cCgmZGVzYy5zaGFzaCwgcmVxLT5yZXN1bHQsIGRzLCByZXEtPnJlc3VsdCk7CisJICAgICAgIGNyeXB0b19zaGFzaF9maW51cCgmZGVzYy5zaGFzaCwgY3R4LT5kaWdlc3QsIGRzLCBjdHgtPmRpZ2VzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfc2hhbV9maW5pc2hfcmVxKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsIGludCBlcnIpCiB7CiAJc3RydWN0IG9tYXBfc2hhbV9yZXFjdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkID0gY3R4LT5kZDsKIAogCWlmICghZXJyKSB7CiAJCW9tYXBfc2hhbV9jb3B5X2hhc2goY3R4LT5kZC0+cmVxLCAxKTsKIAkJaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19ITUFDKQogCQkJZXJyID0gb21hcF9zaGFtX2ZpbmlzaF9yZXFfaG1hYyhyZXEpOworCX0gZWxzZSB7CisJCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfRVJST1I7CiAJfQogCi0JaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19GSU5BTCkKKwlpZiAoKGN0eC0+ZmxhZ3MgJiBGTEFHU19GSU5BTCkgfHwgZXJyKQogCQlvbWFwX3NoYW1fY2xlYW51cChyZXEpOwogCi0JY2xlYXJfYml0KEZMQUdTX0JVU1ksICZjdHgtPmRkLT5mbGFncyk7CisJY2xrX2Rpc2FibGUoZGQtPmljbGspOworCWRkLT5mbGFncyAmPSB+RkxBR1NfQlVTWTsKIAogCWlmIChyZXEtPmJhc2UuY29tcGxldGUpCiAJCXJlcS0+YmFzZS5jb21wbGV0ZSgmcmVxLT5iYXNlLCBlcnIpOwogfQogCi1zdGF0aWMgaW50IG9tYXBfc2hhbV9oYW5kbGVfcXVldWUoc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkKQorc3RhdGljIGludCBvbWFwX3NoYW1faGFuZGxlX3F1ZXVlKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCwKKwkJCQkgIHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXEsICpiYWNrbG9nOwogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHg7Ci0Jc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSwgKnByZXZfcmVxOworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpwcmV2X3JlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxBR1NfQlVTWSwgJmRkLT5mbGFncykpCi0JCXJldHVybiAwOworCWludCBlcnIgPSAwLCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRkLT5sb2NrLCBmbGFncyk7CisJaWYgKHJlcSkKKwkJcmV0ID0gYWhhc2hfZW5xdWV1ZV9yZXF1ZXN0KCZkZC0+cXVldWUsIHJlcSk7CisJaWYgKGRkLT5mbGFncyAmIEZMQUdTX0JVU1kpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJYmFja2xvZyA9IGNyeXB0b19nZXRfYmFja2xvZygmZGQtPnF1ZXVlKTsKIAlhc3luY19yZXEgPSBjcnlwdG9fZGVxdWV1ZV9yZXF1ZXN0KCZkZC0+cXVldWUpOwotCWlmICghYXN5bmNfcmVxKQotCQljbGVhcl9iaXQoRkxBR1NfQlVTWSwgJmRkLT5mbGFncyk7CisJaWYgKGFzeW5jX3JlcSkKKwkJZGQtPmZsYWdzIHw9IEZMQUdTX0JVU1k7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPmxvY2ssIGZsYWdzKTsKIAogCWlmICghYXN5bmNfcmVxKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJldDsKIAogCWlmIChiYWNrbG9nKQogCQliYWNrbG9nLT5jb21wbGV0ZShiYWNrbG9nLCAtRUlOUFJPR1JFU1MpOwpAQCAtNjQ2LDcgKzY5OSwyMiBAQAogCWRldl9kYmcoZGQtPmRldiwgImhhbmRsaW5nIG5ldyByZXEsIG9wOiAlbHUsIG5ieXRlczogJWRcbiIsCiAJCQkJCQljdHgtPm9wLCByZXEtPm5ieXRlcyk7CiAKLQlpZiAocmVxICE9IHByZXZfcmVxICYmIGN0eC0+ZGlnY250KQorCisJZXJyID0gb21hcF9zaGFtX2h3X2luaXQoZGQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyMTsKKworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhkZC0+ZG1hX2xjaCwgMCwKKwkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJZGQtPnBoeXNfYmFzZSArIFNIQV9SRUdfRElOKDApLCAwLCAxNik7CisKKwlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKGRkLT5kbWFfbGNoLAorCQkJT01BUF9ETUFfREFUQV9CVVJTVF8xNik7CisKKwlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoZGQtPmRtYV9sY2gsCisJCQlPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOworCisJaWYgKGN0eC0+ZGlnY250KQogCQkvKiByZXF1ZXN0IGhhcyBjaGFuZ2VkIC0gcmVzdG9yZSBoYXNoICovCiAJCW9tYXBfc2hhbV9jb3B5X2hhc2gocmVxLCAwKTsKIApAQCAtNjU4LDcgKzcyNiw3IEBACiAJfSBlbHNlIGlmIChjdHgtPm9wID09IE9QX0ZJTkFMKSB7CiAJCWVyciA9IG9tYXBfc2hhbV9maW5hbF9yZXEoZGQpOwogCX0KLQorZXJyMToKIAlpZiAoZXJyICE9IC1FSU5QUk9HUkVTUykgewogCQkvKiBkb25lX3Rhc2sgd2lsbCBub3QgZmluaXNoIGl0LCBzbyBkbyBpdCBoZXJlICovCiAJCW9tYXBfc2hhbV9maW5pc2hfcmVxKHJlcSwgZXJyKTsKQEAgLTY2Nyw3ICs3MzUsNyBAQAogCiAJZGV2X2RiZyhkZC0+ZGV2LCAiZXhpdCwgZXJyOiAlZFxuIiwgZXJyKTsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBvbWFwX3NoYW1fZW5xdWV1ZShzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBpbnQgb3ApCkBAIC02NzUsMTggKzc0MywxMCBAQAogCXN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOwogCXN0cnVjdCBvbWFwX3NoYW1fY3R4ICp0Y3R4ID0gY3J5cHRvX3RmbV9jdHgocmVxLT5iYXNlLnRmbSk7CiAJc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkID0gdGN0eC0+ZGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXJyOwogCiAJY3R4LT5vcCA9IG9wOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRkLT5sb2NrLCBmbGFncyk7Ci0JZXJyID0gYWhhc2hfZW5xdWV1ZV9yZXF1ZXN0KCZkZC0+cXVldWUsIHJlcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPmxvY2ssIGZsYWdzKTsKLQotCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gb21hcF9zaGFtX2hhbmRsZV9xdWV1ZShkZCwgcmVxKTsKIH0KIAogc3RhdGljIGludCBvbWFwX3NoYW1fdXBkYXRlKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCkBAIC03MDksMjEgKzc2OSwxMyBAQAogCQkJKi8KIAkJCW9tYXBfc2hhbV9hcHBlbmRfc2coY3R4KTsKIAkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKGN0eC0+YnVmY250ICsgY3R4LT50b3RhbCA8PSA2NCkgeworCQl9IGVsc2UgaWYgKGN0eC0+YnVmY250ICsgY3R4LT50b3RhbCA8PSBTSEExX01ENV9CTE9DS19TSVpFKSB7CisJCQkvKgorCQkJKiBmYXN0ZXIgdG8gdXNlIENQVSBmb3Igc2hvcnQgdHJhbnNmZXJzCisJCQkqLwogCQkJY3R4LT5mbGFncyB8PSBGTEFHU19DUFU7Ci0JCX0gZWxzZSBpZiAoIWN0eC0+YnVmY250ICYmIHNnX2lzX2xhc3QoY3R4LT5zZykpIHsKLQkJCS8qIG1heSBiZSBjYW4gdXNlIGZhc3RlciBmdW5jdGlvbnMgKi8KLQkJCWludCBhbGlnbmVkID0gSVNfQUxJR05FRCgodTMyKWN0eC0+c2ctPm9mZnNldCwKLQkJCQkJCQkJc2l6ZW9mKHUzMikpOwotCi0JCQlpZiAoYWxpZ25lZCAmJiAoY3R4LT5mbGFncyAmIEZMQUdTX0ZJUlNUKSkKLQkJCQkvKiBkaWdlc3Q6IGZpcnN0IGFuZCBmaW5hbCAqLwotCQkJCWN0eC0+ZmxhZ3MgfD0gRkxBR1NfRkFTVDsKLQotCQkJY3R4LT5mbGFncyAmPSB+RkxBR1NfRklSU1Q7CiAJCX0KLQl9IGVsc2UgaWYgKGN0eC0+YnVmY250ICsgY3R4LT50b3RhbCA8PSBjdHgtPmJ1ZmxlbikgewotCQkvKiBpZiBub3QgZmluYXVwIC0+IG5vdCBmYXN0ICovCisJfSBlbHNlIGlmIChjdHgtPmJ1ZmNudCArIGN0eC0+dG90YWwgPCBjdHgtPmJ1ZmxlbikgewogCQlvbWFwX3NoYW1fYXBwZW5kX3NnKGN0eCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTc2MSwxMiArODEzLDE0IEBACiAKIAljdHgtPmZsYWdzIHw9IEZMQUdTX0ZJTlVQOwogCi0JLyogT01BUCBIVyBhY2NlbCB3b3JrcyBvbmx5IHdpdGggYnVmZmVycyA+PSA5ICovCi0JLyogSE1BQyBpcyBhbHdheXMgPj0gOSBiZWNhdXNlIG9mIGlwYWQgKi8KLQlpZiAoKGN0eC0+ZGlnY250ICsgY3R4LT5idWZjbnQpIDwgOSkKLQkJZXJyID0gb21hcF9zaGFtX2ZpbmFsX3NoYXNoKHJlcSk7Ci0JZWxzZSBpZiAoY3R4LT5idWZjbnQpCi0JCXJldHVybiBvbWFwX3NoYW1fZW5xdWV1ZShyZXEsIE9QX0ZJTkFMKTsKKwlpZiAoIShjdHgtPmZsYWdzICYgRkxBR1NfRVJST1IpKSB7CisJCS8qIE9NQVAgSFcgYWNjZWwgd29ya3Mgb25seSB3aXRoIGJ1ZmZlcnMgPj0gOSAqLworCQkvKiBITUFDIGlzIGFsd2F5cyA+PSA5IGJlY2F1c2Ugb2YgaXBhZCAqLworCQlpZiAoKGN0eC0+ZGlnY250ICsgY3R4LT5idWZjbnQpIDwgOSkKKwkJCWVyciA9IG9tYXBfc2hhbV9maW5hbF9zaGFzaChyZXEpOworCQllbHNlIGlmIChjdHgtPmJ1ZmNudCkKKwkJCXJldHVybiBvbWFwX3NoYW1fZW5xdWV1ZShyZXEsIE9QX0ZJTkFMKTsKKwl9CiAKIAlvbWFwX3NoYW1fY2xlYW51cChyZXEpOwogCkBAIC04MzYsNiArODkwLDggQEAKIAlzdHJ1Y3Qgb21hcF9zaGFtX2N0eCAqdGN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAJY29uc3QgY2hhciAqYWxnX25hbWUgPSBjcnlwdG9fdGZtX2FsZ19uYW1lKHRmbSk7CiAKKwlwcl9pbmZvKCJlbnRlclxuIik7CisKIAkvKiBBbGxvY2F0ZSBhIGZhbGxiYWNrIGFuZCBhYm9ydCBpZiBpdCBmYWlsZWQuICovCiAJdGN0eC0+ZmFsbGJhY2sgPSBjcnlwdG9fYWxsb2Nfc2hhc2goYWxnX25hbWUsIDAsCiAJCQkJCSAgICBDUllQVE9fQUxHX05FRURfRkFMTEJBQ0spOwpAQCAtODQ2LDcgKzkwMiw3IEBACiAJfQogCiAJY3J5cHRvX2FoYXNoX3NldF9yZXFzaXplKF9fY3J5cHRvX2FoYXNoX2Nhc3QodGZtKSwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBvbWFwX3NoYW1fcmVxY3R4KSk7CisJCQkJIHNpemVvZihzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCkgKyBCVUZMRU4pOwogCiAJaWYgKGFsZ19iYXNlKSB7CiAJCXN0cnVjdCBvbWFwX3NoYW1faG1hY19jdHggKmJjdHggPSB0Y3R4LT5iYXNlOwpAQCAtOTMyLDcgKzk4OCw3IEBACiAJCQkJCQlDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCiAJCS5jcmFfYmxvY2tzaXplCQk9IFNIQTFfQkxPQ0tfU0laRSwKIAkJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgb21hcF9zaGFtX2N0eCksCi0JCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCS5jcmFfYWxpZ25tYXNrCQk9IE9NQVBfQUxJR05fTUFTSywKIAkJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJCS5jcmFfaW5pdAkJPSBvbWFwX3NoYW1fY3JhX2luaXQsCiAJCS5jcmFfZXhpdAkJPSBvbWFwX3NoYW1fY3JhX2V4aXQsCkBAIC05NTYsNyArMTAxMiw3IEBACiAJCS5jcmFfYmxvY2tzaXplCQk9IFNIQTFfQkxPQ0tfU0laRSwKIAkJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgb21hcF9zaGFtX2N0eCkgKwogCQkJCQlzaXplb2Yoc3RydWN0IG9tYXBfc2hhbV9obWFjX2N0eCksCi0JCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCS5jcmFfYWxpZ25tYXNrCQk9IE9NQVBfQUxJR05fTUFTSywKIAkJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJCS5jcmFfaW5pdAkJPSBvbWFwX3NoYW1fY3JhX3NoYTFfaW5pdCwKIAkJLmNyYV9leGl0CQk9IG9tYXBfc2hhbV9jcmFfZXhpdCwKQEAgLTk4MCw3ICsxMDM2LDcgQEAKIAkJLmNyYV9ibG9ja3NpemUJCT0gU0hBMV9CTE9DS19TSVpFLAogCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBvbWFwX3NoYW1fY3R4KSArCiAJCQkJCXNpemVvZihzdHJ1Y3Qgb21hcF9zaGFtX2htYWNfY3R4KSwKLQkJLmNyYV9hbGlnbm1hc2sJCT0gMCwKKwkJLmNyYV9hbGlnbm1hc2sJCT0gT01BUF9BTElHTl9NQVNLLAogCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKIAkJLmNyYV9pbml0CQk9IG9tYXBfc2hhbV9jcmFfbWQ1X2luaXQsCiAJCS5jcmFfZXhpdAkJPSBvbWFwX3NoYW1fY3JhX2V4aXQsCkBAIC05OTMsNyArMTA0OSw3IEBACiAJc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkID0gKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICopZGF0YTsKIAlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxID0gZGQtPnJlcTsKIAlzdHJ1Y3Qgb21hcF9zaGFtX3JlcWN0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKLQlpbnQgcmVhZHkgPSAxOworCWludCByZWFkeSA9IDAsIGVyciA9IDA7CiAKIAlpZiAoY3R4LT5mbGFncyAmIEZMQUdTX09VVFBVVF9SRUFEWSkgewogCQljdHgtPmZsYWdzICY9IH5GTEFHU19PVVRQVVRfUkVBRFk7CkBAIC0xMDAzLDE1ICsxMDU5LDE4IEBACiAJaWYgKGRkLT5mbGFncyAmIEZMQUdTX0RNQV9BQ1RJVkUpIHsKIAkJZGQtPmZsYWdzICY9IH5GTEFHU19ETUFfQUNUSVZFOwogCQlvbWFwX3NoYW1fdXBkYXRlX2RtYV9zdG9wKGRkKTsKLQkJb21hcF9zaGFtX3VwZGF0ZV9kbWFfc2xvdyhkZCk7CisJCWlmICghZGQtPmVycikKKwkJCWVyciA9IG9tYXBfc2hhbV91cGRhdGVfZG1hX3N0YXJ0KGRkKTsKIAl9CiAKLQlpZiAocmVhZHkgJiYgIShkZC0+ZmxhZ3MgJiBGTEFHU19ETUFfQUNUSVZFKSkgewotCQlkZXZfZGJnKGRkLT5kZXYsICJ1cGRhdGUgZG9uZVxuIik7CisJZXJyID0gZGQtPmVyciA/IDogZXJyOworCisJaWYgKGVyciAhPSAtRUlOUFJPR1JFU1MgJiYgKHJlYWR5IHx8IGVycikpIHsKKwkJZGV2X2RiZyhkZC0+ZGV2LCAidXBkYXRlIGRvbmU6IGVycjogJWRcbiIsIGVycik7CiAJCS8qIGZpbmlzaCBjdXJlbnQgcmVxdWVzdCAqLwotCQlvbWFwX3NoYW1fZmluaXNoX3JlcShyZXEsIDApOworCQlvbWFwX3NoYW1fZmluaXNoX3JlcShyZXEsIGVycik7CiAJCS8qIHN0YXJ0IG5ldyByZXF1ZXN0ICovCi0JCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQpOworCQlvbWFwX3NoYW1faGFuZGxlX3F1ZXVlKGRkLCBOVUxMKTsKIAl9CiB9CiAKQEAgLTEwMTksNyArMTA3OCw3IEBACiB7CiAJc3RydWN0IG9tYXBfc2hhbV9kZXYgKmRkID0gKHN0cnVjdCBvbWFwX3NoYW1fZGV2ICopZGF0YTsKIAotCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQpOworCW9tYXBfc2hhbV9oYW5kbGVfcXVldWUoZGQsIE5VTEwpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9zaGFtX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC0xMDQxLDYgKzExMDAsNyBAQAogCW9tYXBfc2hhbV9yZWFkKGRkLCBTSEFfUkVHX0NUUkwpOwogCiAJY3R4LT5mbGFncyB8PSBGTEFHU19PVVRQVVRfUkVBRFk7CisJZGQtPmVyciA9IDA7CiAJdGFza2xldF9zY2hlZHVsZSgmZGQtPmRvbmVfdGFzayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMDUwLDggKzExMTAsMTMgQEAKIHsKIAlzdHJ1Y3Qgb21hcF9zaGFtX2RldiAqZGQgPSBkYXRhOwogCi0JaWYgKGxpa2VseShsY2ggPT0gZGQtPmRtYV9sY2gpKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZkZC0+ZG9uZV90YXNrKTsKKwlpZiAoY2hfc3RhdHVzICE9IE9NQVBfRE1BX0JMT0NLX0lSUSkgeworCQlwcl9lcnIoIm9tYXAtc2hhbSBETUEgZXJyb3Igc3RhdHVzOiAweCVoeFxuIiwgY2hfc3RhdHVzKTsKKwkJZGQtPmVyciA9IC1FSU87CisJCWRkLT5mbGFncyAmPSB+RkxBR1NfSU5JVDsgLyogcmVxdWVzdCB0byByZS1pbml0aWFsaXplICovCisJfQorCisJdGFza2xldF9zY2hlZHVsZSgmZGQtPmRvbmVfdGFzayk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9zaGFtX2RtYV9pbml0KHN0cnVjdCBvbWFwX3NoYW1fZGV2ICpkZCkKQEAgLTEwNjYsMTUgKzExMzEsNiBAQAogCQlkZXZfZXJyKGRkLT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbFxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhkZC0+ZG1hX2xjaCwgMCwKLQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAotCQkJZGQtPnBoeXNfYmFzZSArIFNIQV9SRUdfRElOKDApLCAwLCAxNik7Ci0KLQlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKGRkLT5kbWFfbGNoLAotCQkJT01BUF9ETUFfREFUQV9CVVJTVF8xNik7Ci0KLQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoZGQtPmRtYV9sY2gsCi0JCQlPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwppbmRleCA4YTUxNWJhLi5kYjMzZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgorI2luY2x1ZGUgPGNyeXB0by9wYWRsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0yMSw3ICsyMiw2IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vaTM4Ny5oPgotI2luY2x1ZGUgInBhZGxvY2suaCIKIAogLyoKICAqIE51bWJlciBvZiBkYXRhIGJsb2NrcyBhY3R1YWxseSBmZXRjaGVkIGZvciBlYWNoIHhjcnlwdCBpbnNuLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1zaGEuYyBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stc2hhLmMKaW5kZXggZDNhMjdlMC4uYWRmMDc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1zaGEuYworKysgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLXNoYS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3BhZGxvY2suaD4KICNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMiwxMyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KLSNpbmNsdWRlICJwYWRsb2NrLmgiCi0KLSNpZmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgU1RBQ0tfQUxJR04gMTYKLSNlbHNlCi0jZGVmaW5lIFNUQUNLX0FMSUdOIDQKLSNlbmRpZgogCiBzdHJ1Y3QgcGFkbG9ja19zaGFfZGVzYyB7CiAJc3RydWN0IHNoYXNoX2Rlc2MgZmFsbGJhY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jIGIvZHJpdmVycy9kY2EvZGNhLWNvcmUuYwppbmRleCBiOThjNjc2Li5jNDYxZWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCisrKyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCiAJLyogYXQgdGhpcyBwb2ludCBvbmx5IG9uZSBkb21haW4gaW4gdGhlIGxpc3QgaXMgZXhwZWN0ZWQgKi8KIAlkb21haW4gPSBsaXN0X2ZpcnN0X2VudHJ5KCZkY2FfZG9tYWlucywgc3RydWN0IGRjYV9kb21haW4sIG5vZGUpOwotCWlmICghZG9tYWluKQotCQlyZXR1cm47CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGNhLCBfZGNhLCAmZG9tYWluLT5kY2FfcHJvdmlkZXJzLCBub2RlKSB7CiAJCWxpc3RfZGVsKCZkY2EtPm5vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggNmVlMjM1OS4uZWYxMzg3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0xMDksNyArMTA5LDcgQEAKIAogY29uZmlnIE1QQzUxMlhfRE1BCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBNUEM1MTJ4IGJ1aWx0LWluIERNQSBlbmdpbmUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBQQ19NUEM1MTJ4CisJZGVwZW5kcyBvbiBQUENfTVBDNTEyeCB8fCBQUENfTVBDODMxeAogCXNlbGVjdCBETUFfRU5HSU5FCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgTVBDNTEyeCBidWlsdC1pbiBETUEgZW5naW5lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jIGIvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCmluZGV4IDMxMDliZDkuLjc4MjY2MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKQEAgLTEwNjAsOCArMTA2MCw4IEBACiAgKiBtaWRfc2V0dXBfZG1hIC0JU2V0dXAgdGhlIERNQSBjb250cm9sbGVyCiAgKiBAcGRldjogQ29udHJvbGxlciBQQ0kgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIEluaXRpbGl6ZSB0aGUgRE1BIGNvbnRyb2xsZXIsIGNoYW5uZWxzLCByZWdpc3RlcnMgd2l0aCBETUEgZW5naW5lLAotICogSVNSLiBJbml0aWxpemUgRE1BIGNvbnRyb2xsZXIgY2hhbm5lbHMuCisgKiBJbml0aWFsaXplIHRoZSBETUEgY29udHJvbGxlciwgY2hhbm5lbHMsIHJlZ2lzdGVycyB3aXRoIERNQSBlbmdpbmUsCisgKiBJU1IuIEluaXRpYWxpemUgRE1BIGNvbnRyb2xsZXIgY2hhbm5lbHMuCiAgKi8KIHN0YXRpYyBpbnQgbWlkX3NldHVwX2RtYShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAgKiBAcGRldjogQ29udHJvbGxlciBQQ0kgZGV2aWNlIHN0cnVjdHVyZQogICogQGlkOiBwY2kgZGV2aWNlIGlkIHN0cnVjdHVyZQogICoKLSAqIEluaXRpbGl6ZSB0aGUgUENJIGRldmljZSwgbWFwIEJBUnMsIHF1ZXJ5IGRyaXZlciBkYXRhLgorICogSW5pdGlhbGl6ZSB0aGUgUENJIGRldmljZSwgbWFwIEJBUnMsIHF1ZXJ5IGRyaXZlciBkYXRhLgogICogQ2FsbCBzZXR1cF9kbWEgdG8gY29tcGxldGUgY29udG9sbGVyIGFuZCBjaGFuIGluaXRpbHphdGlvbgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbnRlbF9taWRfZG1hX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYyBiL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKaW5kZXggNGU5Y2JmMy4uNTljMjcwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdXRvciwgSW5jLiAyMDA3LCAyMDA4LgogICogQ29weXJpZ2h0IChDKSBTZW1paGFsZiAyMDA5CisgKiBDb3B5cmlnaHQgKEMpIElseWEgWWFub2ssIEVtY3JhZnQgU3lzdGVtcyAyMDEwCiAgKgogICogV3JpdHRlbiBieSBQaW90ciBaaWVjaWsgPGtvc21vQHNlbWloYWxmLmNvbT4uIEhhcmR3YXJlIGRlc2NyaXB0aW9uCiAgKiAoZGVmaW5lcywgc3RydWN0dXJlcyBhbmQgY29tbWVudHMpIHdhcyB0YWtlbiBmcm9tIE1QQzUxMjEgRE1BIGRyaXZlcgpAQCAtNzAsNiArNzEsOCBAQAogI2RlZmluZSBNUENfRE1BX0RNQUVTX1NCRQkoMSA8PCAxKQogI2RlZmluZSBNUENfRE1BX0RNQUVTX0RCRQkoMSA8PCAwKQogCisjZGVmaW5lIE1QQ19ETUFfRE1BR1BPUl9TTk9PUF9FTkFCTEUJKDEgPDwgNikKKwogI2RlZmluZSBNUENfRE1BX1RTSVpFXzEJCTB4MDAKICNkZWZpbmUgTVBDX0RNQV9UU0laRV8yCQkweDAxCiAjZGVmaW5lIE1QQ19ETUFfVFNJWkVfNAkJMHgwMgpAQCAtMTA0LDcgKzEwNywxMCBAQAogCS8qIDB4MzAgKi8KIAl1MzIgZG1haHJzaDsJCS8qIERNQSBodyByZXF1ZXN0IHN0YXR1cyBoaWdoKGNoNjN+MzIpICovCiAJdTMyIGRtYWhyc2w7CQkvKiBETUEgaGFyZHdhcmUgcmVxdWVzdCBzdGF0dXMgbG93KGNoMzF+MCkgKi8KLQl1MzIgZG1haWhzYTsJCS8qIERNQSBpbnRlcnJ1cHQgaGlnaCBzZWxlY3QgQVhFKGNoNjN+MzIpICovCisJdW5pb24geworCQl1MzIgZG1haWhzYTsJLyogRE1BIGludGVycnVwdCBoaWdoIHNlbGVjdCBBWEUoY2g2M34zMikgKi8KKwkJdTMyIGRtYWdwb3I7CS8qIChHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgb24gTVBDODMwOCkgKi8KKwl9OwogCXUzMiBkbWFpbHNhOwkJLyogRE1BIGludGVycnVwdCBsb3cgc2VsZWN0IEFYRShjaDMxfjApICovCiAJLyogMHg0MCB+IDB4ZmYgKi8KIAl1MzIgcmVzZXJ2ZTBbNDhdOwkvKiBSZXNlcnZlZCAqLwpAQCAtMTk1LDcgKzIwMSw5IEBACiAJc3RydWN0IG1wY19kbWFfcmVncyBfX2lvbWVtCSpyZWdzOwogCXN0cnVjdCBtcGNfZG1hX3RjZCBfX2lvbWVtCSp0Y2Q7CiAJaW50CQkJCWlycTsKKwlpbnQJCQkJaXJxMjsKIAl1aW50CQkJCWVycm9yX3N0YXR1czsKKwlpbnQJCQkJaXNfbXBjODMwODsKIAogCS8qIExvY2sgZm9yIGVycm9yX3N0YXR1cyBmaWVsZCBpbiB0aGlzIHN0cnVjdHVyZSAqLwogCXNwaW5sb2NrX3QJCQllcnJvcl9zdGF0dXNfbG9jazsKQEAgLTI1MiwxMSArMjYwLDEzIEBACiAJCXByZXYgPSBtZGVzYzsKIAl9CiAKLQlwcmV2LT50Y2QtPnN0YXJ0ID0gMDsKIAlwcmV2LT50Y2QtPmludF9tYWogPSAxOwogCiAJLyogU2VuZCBmaXJzdCBkZXNjcmlwdG9yIGluIGNoYWluIGludG8gaGFyZHdhcmUgKi8KIAltZW1jcHlfdG9pbygmbWRtYS0+dGNkW2NpZF0sIGZpcnN0LT50Y2QsIHNpemVvZihzdHJ1Y3QgbXBjX2RtYV90Y2QpKTsKKworCWlmIChmaXJzdCAhPSBwcmV2KQorCQltZG1hLT50Y2RbY2lkXS5lX3NnID0gMTsKIAlvdXRfOCgmbWRtYS0+cmVncy0+ZG1hc3NydCwgY2lkKTsKIH0KIApAQCAtMjc0LDYgKzI4NCw5IEBACiAKIAkJc3Bpbl9sb2NrKCZtY2hhbi0+bG9jayk7CiAKKwkJb3V0XzgoJm1kbWEtPnJlZ3MtPmRtYWNpbnQsIGNoICsgb2ZmKTsKKwkJb3V0XzgoJm1kbWEtPnJlZ3MtPmRtYWNlcnIsIGNoICsgb2ZmKTsKKwogCQkvKiBDaGVjayBlcnJvciBzdGF0dXMgKi8KIAkJaWYgKGVzICYgKDEgPDwgY2gpKQogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZGVzYywgJm1jaGFuLT5hY3RpdmUsIG5vZGUpCkBAIC0zMDIsMzYgKzMxNSw2OCBAQAogCXNwaW5fdW5sb2NrKCZtZG1hLT5lcnJvcl9zdGF0dXNfbG9jayk7CiAKIAkvKiBIYW5kbGUgaW50ZXJydXB0IG9uIGVhY2ggY2hhbm5lbCAqLwotCW1wY19kbWFfaXJxX3Byb2Nlc3MobWRtYSwgaW5fYmUzMigmbWRtYS0+cmVncy0+ZG1haW50aCksCisJaWYgKG1kbWEtPmRtYS5jaGFuY250ID4gMzIpIHsKKwkJbXBjX2RtYV9pcnFfcHJvY2VzcyhtZG1hLCBpbl9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRoKSwKIAkJCQkJaW5fYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJyaCksIDMyKTsKKwl9CiAJbXBjX2RtYV9pcnFfcHJvY2VzcyhtZG1hLCBpbl9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRsKSwKIAkJCQkJaW5fYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJybCksIDApOwogCi0JLyogQWNrIGludGVycnVwdCBvbiBhbGwgY2hhbm5lbHMgKi8KLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haW50aCwgMHhGRkZGRkZGRik7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWludGwsIDB4RkZGRkZGRkYpOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlcnJoLCAweEZGRkZGRkZGKTsKLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJybCwgMHhGRkZGRkZGRik7Ci0KIAkvKiBTY2hlZHVsZSB0YXNrbGV0ICovCiAJdGFza2xldF9zY2hlZHVsZSgmbWRtYS0+dGFza2xldCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIERNQSBUYXNrbGV0ICovCi1zdGF0aWMgdm9pZCBtcGNfZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQorLyogcHJvY2Nlc3MgY29tcGxldGVkIGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9pZCBtcGNfZG1hX3Byb2Nlc3NfY29tcGxldGVkKHN0cnVjdCBtcGNfZG1hICptZG1hKQogewotCXN0cnVjdCBtcGNfZG1hICptZG1hID0gKHZvaWQgKilkYXRhOwogCWRtYV9jb29raWVfdCBsYXN0X2Nvb2tpZSA9IDA7CiAJc3RydWN0IG1wY19kbWFfY2hhbiAqbWNoYW47CiAJc3RydWN0IG1wY19kbWFfZGVzYyAqbWRlc2M7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJTElTVF9IRUFEKGxpc3QpOwotCXVpbnQgZXM7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgbWRtYS0+ZG1hLmNoYW5jbnQ7IGkrKykgeworCQltY2hhbiA9ICZtZG1hLT5jaGFubmVsc1tpXTsKKworCQkvKiBHZXQgYWxsIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZtY2hhbi0+Y29tcGxldGVkKSkKKwkJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbWNoYW4tPmNvbXBsZXRlZCwgJmxpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgZmxhZ3MpOworCisJCWlmIChsaXN0X2VtcHR5KCZsaXN0KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEV4ZWN1dGUgY2FsbGJhY2tzIGFuZCBydW4gZGVwZW5kZW5jaWVzICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRlc2MsICZsaXN0LCBub2RlKSB7CisJCQlkZXNjID0gJm1kZXNjLT5kZXNjOworCisJCQlpZiAoZGVzYy0+Y2FsbGJhY2spCisJCQkJZGVzYy0+Y2FsbGJhY2soZGVzYy0+Y2FsbGJhY2tfcGFyYW0pOworCisJCQlsYXN0X2Nvb2tpZSA9IGRlc2MtPmNvb2tpZTsKKwkJCWRtYV9ydW5fZGVwZW5kZW5jaWVzKGRlc2MpOworCQl9CisKKwkJLyogRnJlZSBkZXNjcmlwdG9ycyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZsaXN0LCAmbWNoYW4tPmZyZWUpOworCQltY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IGxhc3RfY29va2llOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyogRE1BIFRhc2tsZXQgKi8KK3N0YXRpYyB2b2lkIG1wY19kbWFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG1wY19kbWEgKm1kbWEgPSAodm9pZCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50IGVzOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWEtPmVycm9yX3N0YXR1c19sb2NrLCBmbGFncyk7CiAJZXMgPSBtZG1hLT5lcnJvcl9zdGF0dXM7CiAJbWRtYS0+ZXJyb3Jfc3RhdHVzID0gMDsKQEAgLTM3MCwzNSArNDE1LDcgQEAKIAkJCWRldl9lcnIobWRtYS0+ZG1hLmRldiwgIi0gRGVzdGluYXRpb24gQnVzIEVycm9yXG4iKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWRtYS0+ZG1hLmNoYW5jbnQ7IGkrKykgewotCQltY2hhbiA9ICZtZG1hLT5jaGFubmVsc1tpXTsKLQotCQkvKiBHZXQgYWxsIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZtY2hhbi0+Y29tcGxldGVkKSkKLQkJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbWNoYW4tPmNvbXBsZXRlZCwgJmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZsaXN0KSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEV4ZWN1dGUgY2FsbGJhY2tzIGFuZCBydW4gZGVwZW5kZW5jaWVzICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkobWRlc2MsICZsaXN0LCBub2RlKSB7Ci0JCQlkZXNjID0gJm1kZXNjLT5kZXNjOwotCi0JCQlpZiAoZGVzYy0+Y2FsbGJhY2spCi0JCQkJZGVzYy0+Y2FsbGJhY2soZGVzYy0+Y2FsbGJhY2tfcGFyYW0pOwotCi0JCQlsYXN0X2Nvb2tpZSA9IGRlc2MtPmNvb2tpZTsKLQkJCWRtYV9ydW5fZGVwZW5kZW5jaWVzKGRlc2MpOwotCQl9Ci0KLQkJLyogRnJlZSBkZXNjcmlwdG9ycyAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKLQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZsaXN0LCAmbWNoYW4tPmZyZWUpOwotCQltY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IGxhc3RfY29va2llOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgZmxhZ3MpOwotCX0KKwltcGNfZG1hX3Byb2Nlc3NfY29tcGxldGVkKG1kbWEpOwogfQogCiAvKiBTdWJtaXQgZGVzY3JpcHRvciB0byBoYXJkd2FyZSAqLwpAQCAtNTYzLDYgKzU4MCw3IEBACiBtcGNfZG1hX3ByZXBfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkc3QsIGRtYV9hZGRyX3Qgc3JjLAogCQkJCQlzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogeworCXN0cnVjdCBtcGNfZG1hICptZG1hID0gZG1hX2NoYW5fdG9fbXBjX2RtYShjaGFuKTsKIAlzdHJ1Y3QgbXBjX2RtYV9jaGFuICptY2hhbiA9IGRtYV9jaGFuX3RvX21wY19kbWFfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgbXBjX2RtYV9kZXNjICptZGVzYyA9IE5VTEw7CiAJc3RydWN0IG1wY19kbWFfdGNkICp0Y2Q7CkBAIC01NzcsOCArNTk1LDExIEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jaGFuLT5sb2NrLCBpZmxhZ3MpOwogCi0JaWYgKCFtZGVzYykKKwlpZiAoIW1kZXNjKSB7CisJCS8qIHRyeSB0byBmcmVlIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLworCQltcGNfZG1hX3Byb2Nlc3NfY29tcGxldGVkKG1kbWEpOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAltZGVzYy0+ZXJyb3IgPSAwOwogCXRjZCA9IG1kZXNjLT50Y2Q7CkBAIC01OTEsNyArNjEyLDggQEAKIAkJdGNkLT5kc2l6ZSA9IE1QQ19ETUFfVFNJWkVfMzI7CiAJCXRjZC0+c29mZiA9IDMyOwogCQl0Y2QtPmRvZmYgPSAzMjsKLQl9IGVsc2UgaWYgKElTX0FMSUdORUQoc3JjIHwgZHN0IHwgbGVuLCAxNikpIHsKKwl9IGVsc2UgaWYgKCFtZG1hLT5pc19tcGM4MzA4ICYmIElTX0FMSUdORUQoc3JjIHwgZHN0IHwgbGVuLCAxNikpIHsKKwkJLyogTVBDODMwOCBkb2Vzbid0IHN1cHBvcnQgMTYgYnl0ZSB0cmFuc2ZlcnMgKi8KIAkJdGNkLT5zc2l6ZSA9IE1QQ19ETUFfVFNJWkVfMTY7CiAJCXRjZC0+ZHNpemUgPSBNUENfRE1BX1RTSVpFXzE2OwogCQl0Y2QtPnNvZmYgPSAxNjsKQEAgLTY1MSw2ICs2NzMsMTUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGRuLCAiZnNsLG1wYzgzMDgtZG1hIikpIHsKKwkJbWRtYS0+aXNfbXBjODMwOCA9IDE7CisJCW1kbWEtPmlycTIgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkbiwgMSk7CisJCWlmIChtZG1hLT5pcnEyID09IE5PX0lSUSkgeworCQkJZGV2X2VycihkZXYsICJFcnJvciBtYXBwaW5nIElSUSFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKIAlyZXR2YWwgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRuLCAwLCAmcmVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoZGV2LCAiRXJyb3IgcGFyc2luZyBtZW1vcnkgcmVnaW9uIVxuIik7CkBAIC02ODEsMTEgKzcxMiwyMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAobWRtYS0+aXNfbXBjODMwOCkgeworCQlyZXR2YWwgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgbWRtYS0+aXJxMiwgJm1wY19kbWFfaXJxLCAwLAorCQkJCURSVl9OQU1FLCBtZG1hKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycihkZXYsICJFcnJvciByZXF1ZXN0aW5nIElSUTIhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJc3Bpbl9sb2NrX2luaXQoJm1kbWEtPmVycm9yX3N0YXR1c19sb2NrKTsKIAogCWRtYSA9ICZtZG1hLT5kbWE7CiAJZG1hLT5kZXYgPSBkZXY7Ci0JZG1hLT5jaGFuY250ID0gTVBDX0RNQV9DSEFOTkVMUzsKKwlpZiAoIW1kbWEtPmlzX21wYzgzMDgpCisJCWRtYS0+Y2hhbmNudCA9IE1QQ19ETUFfQ0hBTk5FTFM7CisJZWxzZQorCQlkbWEtPmNoYW5jbnQgPSAxNjsgLyogTVBDODMwOCBETUEgaGFzIG9ubHkgMTYgY2hhbm5lbHMgKi8KIAlkbWEtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IG1wY19kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CiAJZG1hLT5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9IG1wY19kbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKIAlkbWEtPmRldmljZV9pc3N1ZV9wZW5kaW5nID0gbXBjX2RtYV9pc3N1ZV9wZW5kaW5nOwpAQCAtNzIxLDI2ICs3NjQsNDAgQEAKIAkgKiAtIFJvdW5kLXJvYmluIGdyb3VwIGFyYml0cmF0aW9uLAogCSAqIC0gUm91bmQtcm9iaW4gY2hhbm5lbCBhcmJpdHJhdGlvbi4KIAkgKi8KLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hY3IsIE1QQ19ETUFfRE1BQ1JfRURDRyB8Ci0JCQkJTVBDX0RNQV9ETUFDUl9FUkdBIHwgTVBDX0RNQV9ETUFDUl9FUkNBKTsKKwlpZiAoIW1kbWEtPmlzX21wYzgzMDgpIHsKKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWNyLCBNUENfRE1BX0RNQUNSX0VEQ0cgfAorCQkJCQlNUENfRE1BX0RNQUNSX0VSR0EgfCBNUENfRE1BX0RNQUNSX0VSQ0EpOwogCi0JLyogRGlzYWJsZSBoYXJkd2FyZSBETUEgcmVxdWVzdHMgKi8KLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJxaCwgMCk7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycWwsIDApOworCQkvKiBEaXNhYmxlIGhhcmR3YXJlIERNQSByZXF1ZXN0cyAqLworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJxaCwgMCk7CisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlcnFsLCAwKTsKIAotCS8qIERpc2FibGUgZXJyb3IgaW50ZXJydXB0cyAqLwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlZWloLCAwKTsKLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZWVpbCwgMCk7CisJCS8qIERpc2FibGUgZXJyb3IgaW50ZXJydXB0cyAqLworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZWVpaCwgMCk7CisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlZWlsLCAwKTsKIAotCS8qIENsZWFyIGludGVycnVwdHMgc3RhdHVzICovCi0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWludGgsIDB4RkZGRkZGRkYpOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRsLCAweEZGRkZGRkZGKTsKLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJyaCwgMHhGRkZGRkZGRik7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmwsIDB4RkZGRkZGRkYpOworCQkvKiBDbGVhciBpbnRlcnJ1cHRzIHN0YXR1cyAqLworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haW50aCwgMHhGRkZGRkZGRik7CisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRsLCAweEZGRkZGRkZGKTsKKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmgsIDB4RkZGRkZGRkYpOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJybCwgMHhGRkZGRkZGRik7CiAKLQkvKiBSb3V0ZSBpbnRlcnJ1cHRzIHRvIElQSUMgKi8KLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haWhzYSwgMCk7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWlsc2EsIDApOworCQkvKiBSb3V0ZSBpbnRlcnJ1cHRzIHRvIElQSUMgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWloc2EsIDApOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haWxzYSwgMCk7CisJfSBlbHNlIHsKKwkJLyogTVBDODMwOCBoYXMgMTYgY2hhbm5lbHMgYW5kIGxhY2tzIHNvbWUgcmVnaXN0ZXJzICovCisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFjciwgTVBDX0RNQV9ETUFDUl9FUkNBKTsKKworCQkvKiBlbmFibGUgc25vb3BpbmcgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWdwb3IsIE1QQ19ETUFfRE1BR1BPUl9TTk9PUF9FTkFCTEUpOworCQkvKiBEaXNhYmxlIGVycm9yIGludGVycnVwdHMgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVlaWwsIDApOworCisJCS8qIENsZWFyIGludGVycnVwdHMgc3RhdHVzICovCisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRsLCAweEZGRkYpOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJybCwgMHhGRkZGKTsKKwl9CiAKIAkvKiBSZWdpc3RlciBETUEgZW5naW5lICovCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgbWRtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kODEzMV9lZGFjLmggYi9kcml2ZXJzL2VkYWMvYW1kODEzMV9lZGFjLmgKaW5kZXggNjBlMGQxYy4uNmY4YjA3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2FtZDgxMzFfZWRhYy5oCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ4MTMxX2VkYWMuaApAQCAtOTksNyArOTksNyBAQAogCiAvKgogICogQU1EODEzMSBjaGlwc2V0IGhhcyB0d28gcGFpcnMgb2YgUENJWCBCcmlkZ2UgYW5kIHJlbGF0ZWQgSU9BUElDCi0gKiBDb250cm9sZXIsIGFuZCBBVENBLTYxMDEgaGFzIHR3byBBTUQ4MTMxIGNoaXBzZXRzLCBzbyB0aGVyZSBhcmUKKyAqIENvbnRyb2xsZXIsIGFuZCBBVENBLTYxMDEgaGFzIHR3byBBTUQ4MTMxIGNoaXBzZXRzLCBzbyB0aGVyZSBhcmUKICAqIGZvdXIgUENJWCBCcmlkZ2VzIG9uIEFUQ0EtNjEwMSBhbHRvZ2V0aGVyLgogICoKICAqIFRoZXNlIFBDSVggQnJpZGdlcyBzaGFyZSB0aGUgc2FtZSBQQ0kgRGV2aWNlIElEIGFuZCBhcmUgYWxsIG9mCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvY2VsbF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvY2VsbF9lZGFjLmMKaW5kZXggYzk3MzAwNC4uZGIxZGY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2NlbGxfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9jZWxsX2VkYWMuYwpAQCAtNDcsNyArNDcsNyBAQAogCW9mZnNldCA9IGFkZHJlc3MgJiB+UEFHRV9NQVNLOwogCXN5bmRyb21lID0gKGFyICYgMHgwMDAwMDAwMDFmZTAwMDAwdWwpID4+IDIxOwogCi0JLyogVE9ETzogRGVjb2Rpbmcgb2YgdGhlIGVycm9yIGFkZHJlc3NzICovCisJLyogVE9ETzogRGVjb2Rpbmcgb2YgdGhlIGVycm9yIGFkZHJlc3MgKi8KIAllZGFjX21jX2hhbmRsZV9jZShtY2ksIGNzcm93LT5maXJzdF9wYWdlICsgcGZuLCBvZmZzZXQsCiAJCQkgIHN5bmRyb21lLCAwLCBjaGFuLCAiIik7CiB9CkBAIC02OCw3ICs2OCw3IEBACiAJcGZuID0gYWRkcmVzcyA+PiBQQUdFX1NISUZUOwogCW9mZnNldCA9IGFkZHJlc3MgJiB+UEFHRV9NQVNLOwogCi0JLyogVE9ETzogRGVjb2Rpbmcgb2YgdGhlIGVycm9yIGFkZHJlc3NzICovCisJLyogVE9ETzogRGVjb2Rpbmcgb2YgdGhlIGVycm9yIGFkZHJlc3MgKi8KIAllZGFjX21jX2hhbmRsZV91ZShtY2ksIGNzcm93LT5maXJzdF9wYWdlICsgcGZuLCBvZmZzZXQsIDAsICIiKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCmluZGV4IGZmMWViN2IuLjNkOTY1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKQEAgLTI1OSw3ICsyNTksNyBAQAogICoJCQlmb3Igc2luZ2xlIGNoYW5uZWwgYXJlIDY0IGJpdHMsIGZvciBkdWFsIGNoYW5uZWwgMTI4CiAgKgkJCWJpdHMuCiAgKgotICogU2luZ2xlLVJhbmtlZCBzdGljazoJQSBTaW5nbGUtcmFua2VkIHN0aWNrIGhhcyAxIGNoaXAtc2VsZWN0IHJvdyBvZiBtZW1tb3J5LgorICogU2luZ2xlLVJhbmtlZCBzdGljazoJQSBTaW5nbGUtcmFua2VkIHN0aWNrIGhhcyAxIGNoaXAtc2VsZWN0IHJvdyBvZiBtZW1vcnkuCiAgKgkJCU1vdGhlcmJvYXJkcyBjb21tb25seSBkcml2ZSB0d28gY2hpcC1zZWxlY3QgcGlucyB0bwogICoJCQlhIG1lbW9yeSBzdGljay4gQSBzaW5nbGUtcmFua2VkIHN0aWNrLCB3aWxsIG9jY3VweQogICoJCQlvbmx5IG9uZSBvZiB0aG9zZSByb3dzLiBUaGUgb3RoZXIgd2lsbCBiZSB1bnVzZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCmluZGV4IDM2Mjg2MWMuLjgxMTU0YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCkBAIC0xLDYgKzEsNiBAQAogLyogSW50ZWwgaTcgY29yZS9OZWhhbGVtIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKICAqCi0gKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB5aGUgbWVtb3J5IGNvbnRyb2xsZXJzIGZvdW5kIG9uIHRoZSBJbnRlbAorICogVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG1lbW9yeSBjb250cm9sbGVycyBmb3VuZCBvbiB0aGUgSW50ZWwKICAqIHByb2Nlc3NvciBmYW1pbGllcyBpN2NvcmUsIGk3Y29yZSA3eHgvOHh4LCBpNWNvcmUsIFhlb24gMzV4eCwKICAqIFhlb24gNTV4eCBhbmQgWGVvbiA1Nnh4IGFsc28ga25vd24gYXMgTmVoYWxlbSwgTmVoYWxlbS1FUCwgTHlubmZpZWxkCiAgKiBhbmQgV2VzdG1lcmUtRVAuCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogCWludCBpOwogCiAJLyoKLQkgKiBPbiBYZW9uIDU1eHgsIHRoZSBJbnRlbCBRdWNrcGF0aCBBcmNoIEdlbmVyaWMgTm9uLWNvcmUgcGNpIGJ1c2VzCisJICogT24gWGVvbiA1NXh4LCB0aGUgSW50ZWwgUXVpY2sgUGF0aCBBcmNoIEdlbmVyaWMgTm9uLWNvcmUgcGNpIGJ1c2VzCiAJICogYXJlbid0IGFubm91bmNlZCBieSBhY3BpLiBTbywgd2UgbmVlZCB0byB1c2UgYSBsZWdhY3kgc2NhbiBwcm9iaW5nCiAJICogdG8gZGV0ZWN0IHRoZW0KIAkgKi8KQEAgLTE4NjQsNyArMTg2NCw3IEBACiAJaWYgKG1jZS0+bWNnc3RhdHVzICYgMSkKIAkJaTdjb3JlX2NoZWNrX2Vycm9yKG1jaSk7CiAKLQkvKiBBZHZpY2UgbWNlbG9nIHRoYXQgdGhlIGVycm9yIHdlcmUgaGFuZGxlZCAqLworCS8qIEFkdmlzZSBtY2Vsb2cgdGhhdCB0aGUgZXJyb3JzIHdlcmUgaGFuZGxlZCAqLwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCmluZGV4IDA3MGNlYTQuLmI5ZjBjMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCkBAIC04NzMsNyArODczLDcgQEAKIH0KIAogLyoqCi0gKiBwcGM0eHhfZWRhY19pbml0X2Nzcm93cyAtIGludGlhbGl6ZSBkcml2ZXIgaW5zdGFuY2Ugcm93cworICogcHBjNHh4X2VkYWNfaW5pdF9jc3Jvd3MgLSBpbml0aWFsaXplIGRyaXZlciBpbnN0YW5jZSByb3dzCiAgKiBAbWNpOiBBIHBvaW50ZXIgdG8gdGhlIEVEQUMgbWVtb3J5IGNvbnRyb2xsZXIgaW5zdGFuY2UKICAqICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWJtLHNkcmFtLTR4eC1kZHIyIGNvbnRyb2xsZXIgZm9yIHdoaWNoCiAgKiAgICAgICB0aGUgY3Nyb3dzIChpLmUuIGJhbmtzL3JhbmtzKSBhcmUgYmVpbmcgaW5pdGlhbGl6ZWQuCkBAIC04ODEsNyArODgxLDcgQEAKICAqICAgICAgICAgIGN1cnJlbnRseSBzZXQgZm9yIHRoZSBjb250cm9sbGVyLCBmcm9tIHdoaWNoIGJhbmsgd2lkdGgKICAqICAgICAgICAgIGFuZCBtZW1vcnkgdHlwIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQuCiAgKgotICogVGhpcyByb3V0aW5lIGludGlhbGl6ZXMgdGhlIHZpcnR1YWwgImNoaXAgc2VsZWN0IHJvd3MiIGFzc29jaWF0ZWQKKyAqIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgdmlydHVhbCAiY2hpcCBzZWxlY3Qgcm93cyIgYXNzb2NpYXRlZAogICogd2l0aCB0aGUgRURBQyBtZW1vcnkgY29udHJvbGxlciBpbnN0YW5jZS4gQW4gaWJtLHNkcmFtLTR4eC1kZHIyCiAgKiBjb250cm9sbGVyIGJhbmsvcmFuayBpcyBtYXBwZWQgdG8gYSByb3cuCiAgKgpAQCAtOTkyLDcgKzk5Miw3IEBACiB9CiAKIC8qKgotICogcHBjNHh4X2VkYWNfbWNfaW5pdCAtIGludGlhbGl6ZSBkcml2ZXIgaW5zdGFuY2UKKyAqIHBwYzR4eF9lZGFjX21jX2luaXQgLSBpbml0aWFsaXplIGRyaXZlciBpbnN0YW5jZQogICogQG1jaTogQSBwb2ludGVyIHRvIHRoZSBFREFDIG1lbW9yeSBjb250cm9sbGVyIGluc3RhbmNlIGJlaW5nCiAgKiAgICAgICBpbml0aWFsaXplZC4KICAqIEBvcDogQSBwb2ludGVyIHRvIHRoZSBPcGVuRmlybXdhcmUgZGV2aWNlIHRyZWUgbm9kZSBhc3NvY2lhdGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL0tjb25maWcgYi9kcml2ZXJzL2ZpcmV3aXJlL0tjb25maWcKaW5kZXggNDBhMjIyZS4uNjhmOTQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvS2NvbmZpZwpAQCAtMTksNyArMTksNyBAQAogCiBjb25maWcgRklSRVdJUkVfT0hDSQogCXRyaXN0YXRlICJPSENJLTEzOTQgY29udHJvbGxlcnMiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgRklSRVdJUkUKKwlkZXBlbmRzIG9uIFBDSSAmJiBGSVJFV0lSRSAmJiBNTVUKIAloZWxwCiAJICBFbmFibGUgdGhpcyBkcml2ZXIgaWYgeW91IGhhdmUgYSBGaXJlV2lyZSBjb250cm9sbGVyIGJhc2VkCiAJICBvbiB0aGUgT0hDSSBzcGVjaWZpY2F0aW9uLiAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jCmluZGV4IDE0YmI3YjcuLjQ4YWU3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYwpAQCAtMTUwMSw5ICsxNTAxLDEwIEBACiAJZS0+Y2xpZW50CQk9IGNsaWVudDsKIAllLT5wLnNwZWVkCQk9IFNDT0RFXzEwMDsKIAllLT5wLmdlbmVyYXRpb24JCT0gYS0+Z2VuZXJhdGlvbjsKLQllLT5wLmhlYWRlclswXQkJPSBhLT5kYXRhWzBdOwotCWUtPnAuaGVhZGVyWzFdCQk9IGEtPmRhdGFbMV07Ci0JZS0+cC5oZWFkZXJfbGVuZ3RoCT0gODsKKwllLT5wLmhlYWRlclswXQkJPSBUQ09ERV9MSU5LX0lOVEVSTkFMIDw8IDQ7CisJZS0+cC5oZWFkZXJbMV0JCT0gYS0+ZGF0YVswXTsKKwllLT5wLmhlYWRlclsyXQkJPSBhLT5kYXRhWzFdOworCWUtPnAuaGVhZGVyX2xlbmd0aAk9IDEyOwogCWUtPnAuY2FsbGJhY2sJCT0gb3V0Ym91bmRfcGh5X3BhY2tldF9jYWxsYmFjazsKIAllLT5waHlfcGFja2V0LmNsb3N1cmUJPSBhLT5jbG9zdXJlOwogCWUtPnBoeV9wYWNrZXQudHlwZQk9IEZXX0NERVZfRVZFTlRfUEhZX1BBQ0tFVF9TRU5UOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYwppbmRleCBiNDJhMGJkLi5kMDBmOGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtdHJhbnNhY3Rpb24uYwpAQCAtNzIsNiArNzIsMTUgQEAKICNkZWZpbmUgUEhZX0NPTkZJR19ST09UX0lEKG5vZGVfaWQpCSgoKChub2RlX2lkKSAmIDB4M2YpIDw8IDI0KSB8ICgxIDw8IDIzKSkKICNkZWZpbmUgUEhZX0lERU5USUZJRVIoaWQpCQkoKGlkKSA8PCAzMCkKIAorLyogcmV0dXJucyAwIGlmIHRoZSBzcGxpdCB0aW1lb3V0IGhhbmRsZXIgaXMgYWxyZWFkeSBydW5uaW5nICovCitzdGF0aWMgaW50IHRyeV9jYW5jZWxfc3BsaXRfdGltZW91dChzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gKnQpCit7CisJaWYgKHQtPmlzX3NwbGl0X3RyYW5zYWN0aW9uKQorCQlyZXR1cm4gZGVsX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyKTsKKwllbHNlCisJCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGNsb3NlX3RyYW5zYWN0aW9uKHN0cnVjdCBmd190cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb24sCiAJCQkgICAgIHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQgcmNvZGUpCiB7CkBAIC04MSw3ICs5MCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZjYXJkLT50cmFuc2FjdGlvbl9saXN0LCBsaW5rKSB7CiAJCWlmICh0ID09IHRyYW5zYWN0aW9uKSB7Ci0JCQlpZiAoIWRlbF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lcikpIHsKKwkJCWlmICghdHJ5X2NhbmNlbF9zcGxpdF90aW1lb3V0KHQpKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCQkJCWdvdG8gdGltZWRfb3V0OwogCQkJfQpAQCAtMTQxLDE2ICsxNTAsMjggQEAKIAljYXJkLT50bGFiZWxfbWFzayAmPSB+KDFVTEwgPDwgdC0+dGxhYmVsKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKLQljYXJkLT5kcml2ZXItPmNhbmNlbF9wYWNrZXQoY2FyZCwgJnQtPnBhY2tldCk7Ci0KLQkvKgotCSAqIEF0IHRoaXMgcG9pbnQgY2FuY2VsX3BhY2tldCB3aWxsIG5ldmVyIGNhbGwgdGhlIHRyYW5zYWN0aW9uCi0JICogY2FsbGJhY2ssIHNpbmNlIHdlIGp1c3QgdG9vayB0aGUgdHJhbnNhY3Rpb24gb3V0IG9mIHRoZSBsaXN0LgotCSAqIFNvIGRvIGl0IGhlcmUuCi0JICovCiAJdC0+Y2FsbGJhY2soY2FyZCwgUkNPREVfQ0FOQ0VMTEVELCBOVUxMLCAwLCB0LT5jYWxsYmFja19kYXRhKTsKIH0KIAorc3RhdGljIHZvaWQgc3RhcnRfc3BsaXRfdHJhbnNhY3Rpb25fdGltZW91dChzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gKnQsCisJCQkJCSAgICBzdHJ1Y3QgZndfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KCZ0LT5saW5rKSB8fCBXQVJOX09OKHQtPmlzX3NwbGl0X3RyYW5zYWN0aW9uKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwl0LT5pc19zcGxpdF90cmFuc2FjdGlvbiA9IHRydWU7CisJbW9kX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyLAorCQkgIGppZmZpZXMgKyBjYXJkLT5zcGxpdF90aW1lb3V0X2ppZmZpZXMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCB0cmFuc21pdF9jb21wbGV0ZV9jYWxsYmFjayhzdHJ1Y3QgZndfcGFja2V0ICpwYWNrZXQsCiAJCQkJICAgICAgIHN0cnVjdCBmd19jYXJkICpjYXJkLCBpbnQgc3RhdHVzKQogewpAQCAtMTYyLDcgKzE4Myw3IEBACiAJCWNsb3NlX3RyYW5zYWN0aW9uKHQsIGNhcmQsIFJDT0RFX0NPTVBMRVRFKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ0tfUEVORElORzoKLQkJdC0+dGltZXN0YW1wID0gcGFja2V0LT50aW1lc3RhbXA7CisJCXN0YXJ0X3NwbGl0X3RyYW5zYWN0aW9uX3RpbWVvdXQodCwgY2FyZCk7CiAJCWJyZWFrOwogCWNhc2UgQUNLX0JVU1lfWDoKIAljYXNlIEFDS19CVVNZX0E6CkBAIC0yNTAsNyArMjcxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZCIsIHRjb2RlKTsKKwkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWRcbiIsIHRjb2RlKTsKIAl9CiAgY29tbW9uOgogCXBhY2tldC0+c3BlZWQgPSBzcGVlZDsKQEAgLTM0OSwxMSArMzcwLDkgQEAKIAl0LT5ub2RlX2lkID0gZGVzdGluYXRpb25faWQ7CiAJdC0+dGxhYmVsID0gdGxhYmVsOwogCXQtPmNhcmQgPSBjYXJkOworCXQtPmlzX3NwbGl0X3RyYW5zYWN0aW9uID0gZmFsc2U7CiAJc2V0dXBfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIsCiAJCSAgICBzcGxpdF90cmFuc2FjdGlvbl90aW1lb3V0X2NhbGxiYWNrLCAodW5zaWduZWQgbG9uZyl0KTsKLQkvKiBGSVhNRTogc3RhcnQgdGhpcyB0aW1lciBsYXRlciwgcmVsYXRpdmUgdG8gdC0+dGltZXN0YW1wICovCi0JbW9kX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyLAotCQkgIGppZmZpZXMgKyBjYXJkLT5zcGxpdF90aW1lb3V0X2ppZmZpZXMpOwogCXQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CiAJdC0+Y2FsbGJhY2tfZGF0YSA9IGNhbGxiYWNrX2RhdGE7CiAKQEAgLTQyMyw3ICs0NDIsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZ3X3BhY2tldCBwaHlfY29uZmlnX3BhY2tldCA9IHsKLQkuaGVhZGVyX2xlbmd0aAk9IDgsCisJLmhlYWRlcl9sZW5ndGgJPSAxMiwKKwkuaGVhZGVyWzBdCT0gVENPREVfTElOS19JTlRFUk5BTCA8PCA0LAogCS5wYXlsb2FkX2xlbmd0aAk9IDAsCiAJLnNwZWVkCQk9IFNDT0RFXzEwMCwKIAkuY2FsbGJhY2sJPSB0cmFuc21pdF9waHlfcGFja2V0X2NhbGxiYWNrLApAQCAtNDUxLDggKzQ3MSw4IEBACiAKIAltdXRleF9sb2NrKCZwaHlfY29uZmlnX211dGV4KTsKIAotCXBoeV9jb25maWdfcGFja2V0LmhlYWRlclswXSA9IGRhdGE7Ci0JcGh5X2NvbmZpZ19wYWNrZXQuaGVhZGVyWzFdID0gfmRhdGE7CisJcGh5X2NvbmZpZ19wYWNrZXQuaGVhZGVyWzFdID0gZGF0YTsKKwlwaHlfY29uZmlnX3BhY2tldC5oZWFkZXJbMl0gPSB+ZGF0YTsKIAlwaHlfY29uZmlnX3BhY2tldC5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKIAlJTklUX0NPTVBMRVRJT04ocGh5X2NvbmZpZ19kb25lKTsKIApAQCAtNjM4LDcgKzY1OCw3IEBACiAJCX0KIAogCWRlZmF1bHQ6Ci0JCVdBUk4oMSwgIndyb25nIHRjb2RlICVkIiwgdGNvZGUpOworCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZFxuIiwgdGNvZGUpOwogCQlyZXR1cm4gMDsKIAl9CiB9CkBAIC02OTQsNyArNzE0LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZCIsIHRjb2RlKTsKKwkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWRcbiIsIHRjb2RlKTsKIAl9CiAKIAlyZXNwb25zZS0+cGF5bG9hZF9tYXBwZWQgPSBmYWxzZTsKQEAgLTkyNSw3ICs5NDUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmY2FyZC0+dHJhbnNhY3Rpb25fbGlzdCwgbGluaykgewogCQlpZiAodC0+bm9kZV9pZCA9PSBzb3VyY2UgJiYgdC0+dGxhYmVsID09IHRsYWJlbCkgewotCQkJaWYgKCFkZWxfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIpKSB7CisJCQlpZiAoIXRyeV9jYW5jZWxfc3BsaXRfdGltZW91dCh0KSkgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlnb3RvIHRpbWVkX291dDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLmgKaW5kZXggZTYyMzlmOS4uZjhkZmNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9jb3JlLmgKKysrIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLmgKQEAgLTIxNSw5ICsyMTUsMTEgQEAKIAogLyogLXRyYW5zYWN0aW9uICovCiAKKyNkZWZpbmUgVENPREVfTElOS19JTlRFUk5BTAkJMHhlCisKICNkZWZpbmUgVENPREVfSVNfUkVBRF9SRVFVRVNUKHRjb2RlKQkoKCh0Y29kZSkgJiB+MSkgPT0gNCkKICNkZWZpbmUgVENPREVfSVNfQkxPQ0tfUEFDS0VUKHRjb2RlKQkoKCh0Y29kZSkgJiAgMSkgIT0gMCkKLSNkZWZpbmUgVENPREVfSVNfTElOS19JTlRFUk5BTCh0Y29kZSkJKCh0Y29kZSkgPT0gMHhlKQorI2RlZmluZSBUQ09ERV9JU19MSU5LX0lOVEVSTkFMKHRjb2RlKQkoKHRjb2RlKSA9PSBUQ09ERV9MSU5LX0lOVEVSTkFMKQogI2RlZmluZSBUQ09ERV9JU19SRVFVRVNUKHRjb2RlKQkJKCgodGNvZGUpICYgIDIpID09IDApCiAjZGVmaW5lIFRDT0RFX0lTX1JFU1BPTlNFKHRjb2RlKQkoKCh0Y29kZSkgJiAgMikgIT0gMCkKICNkZWZpbmUgVENPREVfSEFTX1JFUVVFU1RfREFUQSh0Y29kZSkJKCgodGNvZGUpICYgMTIpICE9IDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jIGIvZHJpdmVycy9maXJld2lyZS9uZXQuYwppbmRleCAxYTQ2N2E5Li5jMmUxOTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJld2lyZS1jb25zdGFudHMuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC0xNzksNiArMTgwLDcgQEAKIAkvKiBOdW1iZXIgb2YgdHggZGF0YWdyYW1zIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCBidXQgbm90IHlldCBhY2tlZCAqLwogCWludCBxdWV1ZWRfZGF0YWdyYW1zOwogCisJaW50IHBlZXJfY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBwZWVyX2xpc3Q7CiAJc3RydWN0IGZ3X2NhcmQgKmNhcmQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTk5NiwxNSArOTk4LDIzIEBACiBzdGF0aWMgdm9pZCBmd25ldF93cml0ZV9jb21wbGV0ZShzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgaW50IHJjb2RlLAogCQkJCSB2b2lkICpwYXlsb2FkLCBzaXplX3QgbGVuZ3RoLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBmd25ldF9wYWNrZXRfdGFzayAqcHRhc2s7Ci0KLQlwdGFzayA9IGRhdGE7CisJc3RydWN0IGZ3bmV0X3BhY2tldF90YXNrICpwdGFzayA9IGRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgajsKKwlzdGF0aWMgaW50IGxhc3RfcmNvZGUsIGVycm9yc19za2lwcGVkOwogCiAJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBMRVRFKSB7CiAJCWZ3bmV0X3RyYW5zbWl0X3BhY2tldF9kb25lKHB0YXNrKTsKIAl9IGVsc2UgewotCQlmd19lcnJvcigiZnduZXRfd3JpdGVfY29tcGxldGU6IGZhaWxlZDogJXhcbiIsIHJjb2RlKTsKIAkJZnduZXRfdHJhbnNtaXRfcGFja2V0X2ZhaWxlZChwdGFzayk7CisKKwkJaWYgKHByaW50a190aW1lZF9yYXRlbGltaXQoJmosICAxMDAwKSB8fCByY29kZSAhPSBsYXN0X3Jjb2RlKSB7CisJCQlmd19lcnJvcigiZnduZXRfd3JpdGVfY29tcGxldGU6ICIKKwkJCQkiZmFpbGVkOiAleCAoc2tpcHBlZCAlZClcbiIsIHJjb2RlLCBlcnJvcnNfc2tpcHBlZCk7CisKKwkJCWVycm9yc19za2lwcGVkID0gMDsKKwkJCWxhc3RfcmNvZGUgPSByY29kZTsKKwkJfSBlbHNlCisJCQllcnJvcnNfc2tpcHBlZCsrOwogCX0KIH0KIApAQCAtMTIxMyw2ICsxMjIzLDE0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIHZvaWQgc2V0X2NhcnJpZXJfc3RhdGUoc3RydWN0IGZ3bmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPnBlZXJfY291bnQgPiAxKQorCQluZXRpZl9jYXJyaWVyX29uKGRldi0+bmV0ZGV2KTsKKwllbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldi0+bmV0ZGV2KTsKK30KKwogLyogaWZ1cCAqLwogc3RhdGljIGludCBmd25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CkBAIC0xMjI2LDYgKzEyNDQsMTAgQEAKIAl9CiAJbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKIAorCXNwaW5fbG9ja19pcnEoJmRldi0+bG9jayk7CisJc2V0X2NhcnJpZXJfc3RhdGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+bG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM5Nyw2ICsxNDE5LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZnduZXRfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rCT0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZnduZXRfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4gICAgICAgPSBmd25ldF9vcGVuLAogCS5uZG9fc3RvcAk9IGZ3bmV0X3N0b3AsCkBAIC0xNDE1LDYgKzE0NDEsNyBAQAogCW5ldC0+aGFyZF9oZWFkZXJfbGVuCT0gRldORVRfSExFTjsKIAluZXQtPnR5cGUJCT0gQVJQSFJEX0lFRUUxMzk0OwogCW5ldC0+dHhfcXVldWVfbGVuCT0gRldORVRfVFhfUVVFVUVfTEVOOworCW5ldC0+ZXRodG9vbF9vcHMJPSAmZnduZXRfZXRodG9vbF9vcHM7CiB9CiAKIC8qIGNhbGxlciBtdXN0IGhvbGQgZnduZXRfZGV2aWNlX211dGV4ICovCkBAIC0xNDU1LDYgKzE0ODIsOCBAQAogCiAJc3Bpbl9sb2NrX2lycSgmZGV2LT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZwZWVyLT5wZWVyX2xpbmssICZkZXYtPnBlZXJfbGlzdCk7CisJZGV2LT5wZWVyX2NvdW50Kys7CisJc2V0X2NhcnJpZXJfc3RhdGUoZGV2KTsKIAlzcGluX3VubG9ja19pcnEoJmRldi0+bG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MzUsMTMgKzE1NjQsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBmd25ldF9yZW1vdmVfcGVlcihzdHJ1Y3QgZnduZXRfcGVlciAqcGVlcikKK3N0YXRpYyB2b2lkIGZ3bmV0X3JlbW92ZV9wZWVyKHN0cnVjdCBmd25ldF9wZWVyICpwZWVyLCBzdHJ1Y3QgZnduZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZ3bmV0X3BhcnRpYWxfZGF0YWdyYW0gKnBkLCAqcGRfbmV4dDsKIAotCXNwaW5fbG9ja19pcnEoJnBlZXItPmRldi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5sb2NrKTsKIAlsaXN0X2RlbCgmcGVlci0+cGVlcl9saW5rKTsKLQlzcGluX3VubG9ja19pcnEoJnBlZXItPmRldi0+bG9jayk7CisJZGV2LT5wZWVyX2NvdW50LS07CisJc2V0X2NhcnJpZXJfc3RhdGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+bG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGQsIHBkX25leHQsICZwZWVyLT5wZF9saXN0LCBwZF9saW5rKQogCQlmd25ldF9wZF9kZWxldGUocGQpOwpAQCAtMTU1OCw3ICsxNTg5LDcgQEAKIAogCW11dGV4X2xvY2soJmZ3bmV0X2RldmljZV9tdXRleCk7CiAKLQlmd25ldF9yZW1vdmVfcGVlcihwZWVyKTsKKwlmd25ldF9yZW1vdmVfcGVlcihwZWVyLCBkZXYpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmRldi0+cGVlcl9saXN0KSkgewogCQluZXQgPSBkZXYtPm5ldGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvbm9zeS5jIGIvZHJpdmVycy9maXJld2lyZS9ub3N5LmMKaW5kZXggYmYxODRmYi4uMDYxODE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9ub3N5LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9ub3N5LmMKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2xpZW50OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogZmFpbDoKIAlrZnJlZShjbGllbnQpOwogCWx5bnhfcHV0KGx5bngpOwpAQCAtNDA1LDcgKzQwNSw2IEBACiAJLnBvbGwgPQkJCW5vc3lfcG9sbCwKIAkub3BlbiA9CQkJbm9zeV9vcGVuLAogCS5yZWxlYXNlID0JCW5vc3lfcmVsZWFzZSwKLQkubGxzZWVrID0JCW5vb3BfbGxzZWVrLAogfTsKIAogI2RlZmluZSBQSFlfUEFDS0VUX1NJWkUgMTIgLyogMSBwYXlsb2FkLCAxIGludmVyc2UsIDEgYWNrID0gMyBxdWFkbGV0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwppbmRleCBlM2M4YjYwLi5iZDNjNjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL29oY2kuYwpAQCAtMTgsNiArMTgsNyBAQAogICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNDAsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtODAsMTcgKzgyLDIzIEBACiAjZGVmaW5lIENPTU1BTkRfUFRSKHJlZ3MpCSgocmVncykgKyAxMikKICNkZWZpbmUgQ09OVEVYVF9NQVRDSChyZWdzKQkoKHJlZ3MpICsgMTYpCiAKLXN0cnVjdCBhcl9idWZmZXIgewotCXN0cnVjdCBkZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqbmV4dDsKLQlfX2xlMzIgZGF0YVswXTsKLX07CisjZGVmaW5lIEFSX0JVRkZFUl9TSVpFCSgzMioxMDI0KQorI2RlZmluZSBBUl9CVUZGRVJTX01JTglESVZfUk9VTkRfVVAoQVJfQlVGRkVSX1NJWkUsIFBBR0VfU0laRSkKKy8qIHdlIG5lZWQgYXQgbGVhc3QgdHdvIHBhZ2VzIGZvciBwcm9wZXIgbGlzdCBtYW5hZ2VtZW50ICovCisjZGVmaW5lIEFSX0JVRkZFUlMJKEFSX0JVRkZFUlNfTUlOID49IDIgPyBBUl9CVUZGRVJTX01JTiA6IDIpCisKKyNkZWZpbmUgTUFYX0FTWU5DX1BBWUxPQUQJNDA5NgorI2RlZmluZSBNQVhfQVJfUEFDS0VUX1NJWkUJKDE2ICsgTUFYX0FTWU5DX1BBWUxPQUQgKyA0KQorI2RlZmluZSBBUl9XUkFQQVJPVU5EX1BBR0VTCURJVl9ST1VORF9VUChNQVhfQVJfUEFDS0VUX1NJWkUsIFBBR0VfU0laRSkKIAogc3RydWN0IGFyX2NvbnRleHQgewogCXN0cnVjdCBmd19vaGNpICpvaGNpOwotCXN0cnVjdCBhcl9idWZmZXIgKmN1cnJlbnRfYnVmZmVyOwotCXN0cnVjdCBhcl9idWZmZXIgKmxhc3RfYnVmZmVyOworCXN0cnVjdCBwYWdlICpwYWdlc1tBUl9CVUZGRVJTXTsKKwl2b2lkICpidWZmZXI7CisJc3RydWN0IGRlc2NyaXB0b3IgKmRlc2NyaXB0b3JzOworCWRtYV9hZGRyX3QgZGVzY3JpcHRvcnNfYnVzOwogCXZvaWQgKnBvaW50ZXI7CisJdW5zaWduZWQgaW50IGxhc3RfYnVmZmVyX2luZGV4OwogCXUzMiByZWdzOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogfTsKQEAgLTExNyw2ICsxMjUsOCBAQAogCXN0cnVjdCBmd19vaGNpICpvaGNpOwogCXUzMiByZWdzOwogCWludCB0b3RhbF9hbGxvY2F0aW9uOworCWJvb2wgcnVubmluZzsKKwlib29sIGZsdXNoaW5nOwogCiAJLyoKIAkgKiBMaXN0IG9mIHBhZ2Utc2l6ZWQgYnVmZmVycyBmb3Igc3RvcmluZyBETUEgZGVzY3JpcHRvcnMuCkBAIC0xNjEsNiArMTcxLDkgQEAKIAlpbnQgZXhjZXNzX2J5dGVzOwogCXZvaWQgKmhlYWRlcjsKIAlzaXplX3QgaGVhZGVyX2xlbmd0aDsKKworCXU4IHN5bmM7CisJdTggdGFnczsKIH07CiAKICNkZWZpbmUgQ09ORklHX1JPTV9TSVpFIDEwMjQKQEAgLTE3Nyw3ICsxOTAsOCBAQAogCXUzMiBidXNfdGltZTsKIAlib29sIGlzX3Jvb3Q7CiAJYm9vbCBjc3Jfc3RhdGVfc2V0Y2xlYXJfYWJkaWNhdGU7Ci0KKwlpbnQgbl9pcjsKKwlpbnQgbl9pdDsKIAkvKgogCSAqIFNwaW5sb2NrIGZvciBhY2Nlc3NpbmcgZndfb2hjaSBkYXRhLiAgTmV2ZXIgY2FsbCBvdXQgb2YKIAkgKiB0aGlzIGRyaXZlciB3aXRoIHRoaXMgbG9jayBoZWxkLgpAQCAtMTg2LDYgKzIwMCw5IEBACiAKIAlzdHJ1Y3QgbXV0ZXggcGh5X3JlZ19tdXRleDsKIAorCXZvaWQgKm1pc2NfYnVmZmVyOworCWRtYV9hZGRyX3QgbWlzY19idWZmZXJfYnVzOworCiAJc3RydWN0IGFyX2NvbnRleHQgYXJfcmVxdWVzdF9jdHg7CiAJc3RydWN0IGFyX2NvbnRleHQgYXJfcmVzcG9uc2VfY3R4OwogCXN0cnVjdCBjb250ZXh0IGF0X3JlcXVlc3RfY3R4OwpAQCAtNDExLDEwICs0MjgsNiBAQAogCVsweGNdID0gIi1yZXNlcnZlZC0iLAkJWzB4ZF0gPSAiLXJlc2VydmVkLSIsCiAJWzB4ZV0gPSAibGluayBpbnRlcm5hbCIsCVsweGZdID0gIi1yZXNlcnZlZC0iLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICpwaHlzW10gPSB7Ci0JWzB4MF0gPSAicGh5IGNvbmZpZyBwYWNrZXQiLAlbMHgxXSA9ICJsaW5rLW9uIHBhY2tldCIsCi0JWzB4Ml0gPSAic2VsZi1pZCBwYWNrZXQiLAlbMHgzXSA9ICItcmVzZXJ2ZWQtIiwKLX07CiAKIHN0YXRpYyB2b2lkIGxvZ19hcl9hdF9ldmVudChjaGFyIGRpciwgaW50IHNwZWVkLCB1MzIgKmhlYWRlciwgaW50IGV2dCkKIHsKQEAgLTQzMywxMiArNDQ2LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChoZWFkZXJbMF0gPT0gfmhlYWRlclsxXSkgewotCQlmd19ub3RpZnkoIkElYyAlcywgJXMsICUwOHhcbiIsCi0JCSAgICBkaXIsIGV2dHNbZXZ0XSwgcGh5c1toZWFkZXJbMF0gPj4gMzAgJiAweDNdLCBoZWFkZXJbMF0pOwotCQlyZXR1cm47Ci0JfQotCiAJc3dpdGNoICh0Y29kZSkgewogCWNhc2UgMHgwOiBjYXNlIDB4NjogY2FzZSAweDg6CiAJCXNucHJpbnRmKHNwZWNpZmljLCBzaXplb2Yoc3BlY2lmaWMpLCAiID0gJTA4eCIsCkBAIC00NTMsOSArNDYwLDEzIEBACiAJfQogCiAJc3dpdGNoICh0Y29kZSkgewotCWNhc2UgMHhlOiBjYXNlIDB4YToKKwljYXNlIDB4YToKIAkJZndfbm90aWZ5KCJBJWMgJXMsICVzXG4iLCBkaXIsIGV2dHNbZXZ0XSwgdGNvZGVzW3Rjb2RlXSk7CiAJCWJyZWFrOworCWNhc2UgMHhlOgorCQlmd19ub3RpZnkoIkElYyAlcywgUEhZICUwOHggJTA4eFxuIiwKKwkJCSAgZGlyLCBldnRzW2V2dF0sIGhlYWRlclsxXSwgaGVhZGVyWzJdKTsKKwkJYnJlYWs7CiAJY2FzZSAweDA6IGNhc2UgMHgxOiBjYXNlIDB4NDogY2FzZSAweDU6IGNhc2UgMHg5OgogCQlmd19ub3RpZnkoIkElYyBzcGQgJXggdGwgJTAyeCwgIgogCQkgICAgIiUwNHggLT4gJTA0eCwgJXMsICIKQEAgLTU5NCw1OSArNjA1LDE1MCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFyX2NvbnRleHRfbGlua19wYWdlKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsCi0JCQkJIHN0cnVjdCBhcl9idWZmZXIgKmFiLCBkbWFfYWRkcl90IGFiX2J1cykKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBhcl9idWZmZXJfYnVzKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGludCBpKQogewotCXNpemVfdCBvZmZzZXQ7CisJcmV0dXJuIHBhZ2VfcHJpdmF0ZShjdHgtPnBhZ2VzW2ldKTsKK30KIAotCWFiLT5uZXh0ID0gTlVMTDsKLQltZW1zZXQoJmFiLT5kZXNjcmlwdG9yLCAwLCBzaXplb2YoYWItPmRlc2NyaXB0b3IpKTsKLQlhYi0+ZGVzY3JpcHRvci5jb250cm9sICAgICAgICA9IGNwdV90b19sZTE2KERFU0NSSVBUT1JfSU5QVVRfTU9SRSB8Ci0JCQkJCQkgICAgREVTQ1JJUFRPUl9TVEFUVVMgfAotCQkJCQkJICAgIERFU0NSSVBUT1JfQlJBTkNIX0FMV0FZUyk7Ci0Jb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGFyX2J1ZmZlciwgZGF0YSk7Ci0JYWItPmRlc2NyaXB0b3IucmVxX2NvdW50ICAgICAgPSBjcHVfdG9fbGUxNihQQUdFX1NJWkUgLSBvZmZzZXQpOwotCWFiLT5kZXNjcmlwdG9yLmRhdGFfYWRkcmVzcyAgID0gY3B1X3RvX2xlMzIoYWJfYnVzICsgb2Zmc2V0KTsKLQlhYi0+ZGVzY3JpcHRvci5yZXNfY291bnQgICAgICA9IGNwdV90b19sZTE2KFBBR0VfU0laRSAtIG9mZnNldCk7Ci0JYWItPmRlc2NyaXB0b3IuYnJhbmNoX2FkZHJlc3MgPSAwOworc3RhdGljIHZvaWQgYXJfY29udGV4dF9saW5rX3BhZ2Uoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXN0cnVjdCBkZXNjcmlwdG9yICpkOworCisJZCA9ICZjdHgtPmRlc2NyaXB0b3JzW2luZGV4XTsKKwlkLT5icmFuY2hfYWRkcmVzcyAgJj0gY3B1X3RvX2xlMzIofjB4Zik7CisJZC0+cmVzX2NvdW50ICAgICAgID0gIGNwdV90b19sZTE2KFBBR0VfU0laRSk7CisJZC0+dHJhbnNmZXJfc3RhdHVzID0gIDA7CiAKIAl3bWIoKTsgLyogZmluaXNoIGluaXQgb2YgbmV3IGRlc2NyaXB0b3JzIGJlZm9yZSBicmFuY2hfYWRkcmVzcyB1cGRhdGUgKi8KLQljdHgtPmxhc3RfYnVmZmVyLT5kZXNjcmlwdG9yLmJyYW5jaF9hZGRyZXNzID0gY3B1X3RvX2xlMzIoYWJfYnVzIHwgMSk7Ci0JY3R4LT5sYXN0X2J1ZmZlci0+bmV4dCA9IGFiOwotCWN0eC0+bGFzdF9idWZmZXIgPSBhYjsKKwlkID0gJmN0eC0+ZGVzY3JpcHRvcnNbY3R4LT5sYXN0X2J1ZmZlcl9pbmRleF07CisJZC0+YnJhbmNoX2FkZHJlc3MgIHw9IGNwdV90b19sZTMyKDEpOworCisJY3R4LT5sYXN0X2J1ZmZlcl9pbmRleCA9IGluZGV4OwogCiAJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSwgQ09OVEVYVF9XQUtFKTsKIAlmbHVzaF93cml0ZXMoY3R4LT5vaGNpKTsKIH0KIAotc3RhdGljIGludCBhcl9jb250ZXh0X2FkZF9wYWdlKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY3R4LT5vaGNpLT5jYXJkLmRldmljZTsKLQlzdHJ1Y3QgYXJfYnVmZmVyICphYjsKLQlkbWFfYWRkcl90IHVuaW5pdGlhbGl6ZWRfdmFyKGFiX2J1cyk7Ci0KLQlhYiA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIFBBR0VfU0laRSwgJmFiX2J1cywgR0ZQX0FUT01JQyk7Ci0JaWYgKGFiID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXJfY29udGV4dF9saW5rX3BhZ2UoY3R4LCBhYiwgYWJfYnVzKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBhcl9jb250ZXh0X3JlbGVhc2Uoc3RydWN0IGFyX2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3QgYXJfYnVmZmVyICphYiwgKmFiX25leHQ7Ci0Jc2l6ZV90IG9mZnNldDsKLQlkbWFfYWRkcl90IGFiX2J1czsKKwl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoYWIgPSBjdHgtPmN1cnJlbnRfYnVmZmVyOyBhYjsgYWIgPSBhYl9uZXh0KSB7Ci0JCWFiX25leHQgPSBhYi0+bmV4dDsKLQkJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGFyX2J1ZmZlciwgZGF0YSk7Ci0JCWFiX2J1cyA9IGxlMzJfdG9fY3B1KGFiLT5kZXNjcmlwdG9yLmRhdGFfYWRkcmVzcykgLSBvZmZzZXQ7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2UsIFBBR0VfU0laRSwKLQkJCQkgIGFiLCBhYl9idXMpOworCWlmIChjdHgtPmJ1ZmZlcikKKwkJdm1fdW5tYXBfcmFtKGN0eC0+YnVmZmVyLCBBUl9CVUZGRVJTICsgQVJfV1JBUEFST1VORF9QQUdFUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJfQlVGRkVSUzsgaSsrKQorCQlpZiAoY3R4LT5wYWdlc1tpXSkgeworCQkJZG1hX3VubWFwX3BhZ2UoY3R4LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkgICAgICAgYXJfYnVmZmVyX2J1cyhjdHgsIGkpLAorCQkJCSAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCQlfX2ZyZWVfcGFnZShjdHgtPnBhZ2VzW2ldKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBhcl9jb250ZXh0X2Fib3J0KHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmVycm9yX21zZykKK3sKKwlpZiAocmVnX3JlYWQoY3R4LT5vaGNpLCBDT05UUk9MX0NMRUFSKGN0eC0+cmVncykpICYgQ09OVEVYVF9SVU4pIHsKKwkJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9DTEVBUihjdHgtPnJlZ3MpLCBDT05URVhUX1JVTik7CisJCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOworCisJCWZ3X2Vycm9yKCJBUiBlcnJvcjogJXM7IERNQSBzdG9wcGVkXG4iLCBlcnJvcl9tc2cpOwogCX0KKwkvKiBGSVhNRTogcmVzdGFydD8gKi8KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXJfbmV4dF9idWZmZXJfaW5kZXgodW5zaWduZWQgaW50IGluZGV4KQoreworCXJldHVybiAoaW5kZXggKyAxKSAlIEFSX0JVRkZFUlM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFyX3ByZXZfYnVmZmVyX2luZGV4KHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gKGluZGV4IC0gMSArIEFSX0JVRkZFUlMpICUgQVJfQlVGRkVSUzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXJfZmlyc3RfYnVmZmVyX2luZGV4KHN0cnVjdCBhcl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGFyX25leHRfYnVmZmVyX2luZGV4KGN0eC0+bGFzdF9idWZmZXJfaW5kZXgpOworfQorCisvKgorICogV2Ugc2VhcmNoIGZvciB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGxhc3QgQVIgcGFja2V0IERNQSBkYXRhIHdyaXR0ZW4KKyAqIGJ5IHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFyX3NlYXJjaF9sYXN0X2FjdGl2ZV9idWZmZXIoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwKKwkJCQkJCSB1bnNpZ25lZCBpbnQgKmJ1ZmZlcl9vZmZzZXQpCit7CisJdW5zaWduZWQgaW50IGksIG5leHRfaSwgbGFzdCA9IGN0eC0+bGFzdF9idWZmZXJfaW5kZXg7CisJX19sZTE2IHJlc19jb3VudCwgbmV4dF9yZXNfY291bnQ7CisKKwlpID0gYXJfZmlyc3RfYnVmZmVyX2luZGV4KGN0eCk7CisJcmVzX2NvdW50ID0gQUNDRVNTX09OQ0UoY3R4LT5kZXNjcmlwdG9yc1tpXS5yZXNfY291bnQpOworCisJLyogQSBidWZmZXIgdGhhdCBpcyBub3QgeWV0IGNvbXBsZXRlbHkgZmlsbGVkIG11c3QgYmUgdGhlIGxhc3Qgb25lLiAqLworCXdoaWxlIChpICE9IGxhc3QgJiYgcmVzX2NvdW50ID09IDApIHsKKworCQkvKiBQZWVrIGF0IHRoZSBuZXh0IGRlc2NyaXB0b3IuICovCisJCW5leHRfaSA9IGFyX25leHRfYnVmZmVyX2luZGV4KGkpOworCQlybWIoKTsgLyogcmVhZCBkZXNjcmlwdG9ycyBpbiBvcmRlciAqLworCQluZXh0X3Jlc19jb3VudCA9IEFDQ0VTU19PTkNFKAorCQkJCWN0eC0+ZGVzY3JpcHRvcnNbbmV4dF9pXS5yZXNfY291bnQpOworCQkvKgorCQkgKiBJZiB0aGUgbmV4dCBkZXNjcmlwdG9yIGlzIHN0aWxsIGVtcHR5LCB3ZSBtdXN0IHN0b3AgYXQgdGhpcworCQkgKiBkZXNjcmlwdG9yLgorCQkgKi8KKwkJaWYgKG5leHRfcmVzX2NvdW50ID09IGNwdV90b19sZTE2KFBBR0VfU0laRSkpIHsKKwkJCS8qCisJCQkgKiBUaGUgZXhjZXB0aW9uIGlzIHdoZW4gdGhlIERNQSBkYXRhIGZvciBvbmUgcGFja2V0IGlzCisJCQkgKiBzcGxpdCBvdmVyIHRocmVlIGJ1ZmZlcnM7IGluIHRoaXMgY2FzZSwgdGhlIG1pZGRsZQorCQkJICogYnVmZmVyJ3MgZGVzY3JpcHRvciBtaWdodCBiZSBuZXZlciB1cGRhdGVkIGJ5IHRoZQorCQkJICogY29udHJvbGxlciBhbmQgbG9vayBzdGlsbCBlbXB0eSwgYW5kIHdlIGhhdmUgdG8gcGVlaworCQkJICogYXQgdGhlIHRoaXJkIG9uZS4KKwkJCSAqLworCQkJaWYgKE1BWF9BUl9QQUNLRVRfU0laRSA+IFBBR0VfU0laRSAmJiBpICE9IGxhc3QpIHsKKwkJCQluZXh0X2kgPSBhcl9uZXh0X2J1ZmZlcl9pbmRleChuZXh0X2kpOworCQkJCXJtYigpOworCQkJCW5leHRfcmVzX2NvdW50ID0gQUNDRVNTX09OQ0UoCisJCQkJCWN0eC0+ZGVzY3JpcHRvcnNbbmV4dF9pXS5yZXNfY291bnQpOworCQkJCWlmIChuZXh0X3Jlc19jb3VudCAhPSBjcHVfdG9fbGUxNihQQUdFX1NJWkUpKQorCQkJCQlnb3RvIG5leHRfYnVmZmVyX2lzX2FjdGl2ZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworbmV4dF9idWZmZXJfaXNfYWN0aXZlOgorCQlpID0gbmV4dF9pOworCQlyZXNfY291bnQgPSBuZXh0X3Jlc19jb3VudDsKKwl9CisKKwlybWIoKTsgLyogcmVhZCByZXNfY291bnQgYmVmb3JlIHRoZSBETUEgZGF0YSAqLworCisJKmJ1ZmZlcl9vZmZzZXQgPSBQQUdFX1NJWkUgLSBsZTE2X3RvX2NwdShyZXNfY291bnQpOworCWlmICgqYnVmZmVyX29mZnNldCA+IFBBR0VfU0laRSkgeworCQkqYnVmZmVyX29mZnNldCA9IDA7CisJCWFyX2NvbnRleHRfYWJvcnQoY3R4LCAiY29ycnVwdGVkIGRlc2NyaXB0b3IiKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgYXJfc3luY19idWZmZXJzX2Zvcl9jcHUoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGVuZF9idWZmZXJfaW5kZXgsCisJCQkJICAgIHVuc2lnbmVkIGludCBlbmRfYnVmZmVyX29mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSBhcl9maXJzdF9idWZmZXJfaW5kZXgoY3R4KTsKKwl3aGlsZSAoaSAhPSBlbmRfYnVmZmVyX2luZGV4KSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCWFyX2J1ZmZlcl9idXMoY3R4LCBpKSwKKwkJCQkJUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpID0gYXJfbmV4dF9idWZmZXJfaW5kZXgoaSk7CisJfQorCWlmIChlbmRfYnVmZmVyX29mZnNldCA+IDApCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCWFyX2J1ZmZlcl9idXMoY3R4LCBpKSwKKwkJCQkJZW5kX2J1ZmZlcl9vZmZzZXQsIERNQV9GUk9NX0RFVklDRSk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpCkBAIC02ODksNiArNzkxLDEwIEBACiAJCXAuaGVhZGVyWzNdID0gY29uZF9sZTMyX3RvX2NwdShidWZmZXJbM10pOwogCQlwLmhlYWRlcl9sZW5ndGggPSAxNjsKIAkJcC5wYXlsb2FkX2xlbmd0aCA9IHAuaGVhZGVyWzNdID4+IDE2OworCQlpZiAocC5wYXlsb2FkX2xlbmd0aCA+IE1BWF9BU1lOQ19QQVlMT0FEKSB7CisJCQlhcl9jb250ZXh0X2Fib3J0KGN0eCwgImludmFsaWQgcGFja2V0IGxlbmd0aCIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFRDT0RFX1dSSVRFX1JFU1BPTlNFOgpAQCAtNjk5LDkgKzgwNSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJLyogRklYTUU6IFN0b3AgY29udGV4dCwgZGlzY2FyZCBldmVyeXRoaW5nLCBhbmQgcmVzdGFydD8gKi8KLQkJcC5oZWFkZXJfbGVuZ3RoID0gMDsKLQkJcC5wYXlsb2FkX2xlbmd0aCA9IDA7CisJCWFyX2NvbnRleHRfYWJvcnQoY3R4LCAiaW52YWxpZCB0Y29kZSIpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlwLnBheWxvYWQgPSAodm9pZCAqKSBidWZmZXIgKyBwLmhlYWRlcl9sZW5ndGg7CkBAIC03NTEsMTIxICs4NTYsMTQ3IEBACiAJcmV0dXJuIGJ1ZmZlciArIGxlbmd0aCArIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGFyX2NvbnRleHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCAqaGFuZGxlX2FyX3BhY2tldHMoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgdm9pZCAqcCwgdm9pZCAqZW5kKQogewotCXN0cnVjdCBhcl9jb250ZXh0ICpjdHggPSAoc3RydWN0IGFyX2NvbnRleHQgKilkYXRhOwotCXN0cnVjdCBhcl9idWZmZXIgKmFiOwotCXN0cnVjdCBkZXNjcmlwdG9yICpkOwotCXZvaWQgKmJ1ZmZlciwgKmVuZDsKLQlfX2xlMTYgcmVzX2NvdW50OworCXZvaWQgKm5leHQ7CiAKLQlhYiA9IGN0eC0+Y3VycmVudF9idWZmZXI7Ci0JZCA9ICZhYi0+ZGVzY3JpcHRvcjsKKwl3aGlsZSAocCA8IGVuZCkgeworCQluZXh0ID0gaGFuZGxlX2FyX3BhY2tldChjdHgsIHApOworCQlpZiAoIW5leHQpCisJCQlyZXR1cm4gcDsKKwkJcCA9IG5leHQ7CisJfQogCi0JcmVzX2NvdW50ID0gQUNDRVNTX09OQ0UoZC0+cmVzX2NvdW50KTsKLQlpZiAocmVzX2NvdW50ID09IDApIHsKLQkJc2l6ZV90IHNpemUsIHNpemUyLCByZXN0LCBwa3RzaXplLCBzaXplMywgb2Zmc2V0OwotCQlkbWFfYWRkcl90IHN0YXJ0X2J1czsKLQkJdm9pZCAqc3RhcnQ7CisJcmV0dXJuIHA7Cit9CiAKLQkJLyoKLQkJICogVGhpcyBkZXNjcmlwdG9yIGlzIGZpbmlzaGVkIGFuZCB3ZSBtYXkgaGF2ZSBhCi0JCSAqIHBhY2tldCBzcGxpdCBhY3Jvc3MgdGhpcyBhbmQgdGhlIG5leHQgYnVmZmVyLiBXZQotCQkgKiByZXVzZSB0aGUgcGFnZSBmb3IgcmVhc3NlbWJsaW5nIHRoZSBzcGxpdCBwYWNrZXQuCi0JCSAqLworc3RhdGljIHZvaWQgYXJfcmVjeWNsZV9idWZmZXJzKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGludCBlbmRfYnVmZmVyKQoreworCXVuc2lnbmVkIGludCBpOwogCi0JCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhcl9idWZmZXIsIGRhdGEpOwotCQlzdGFydCA9IGFiOwotCQlzdGFydF9idXMgPSBsZTMyX3RvX2NwdShhYi0+ZGVzY3JpcHRvci5kYXRhX2FkZHJlc3MpIC0gb2Zmc2V0OwotCQlidWZmZXIgPSBhYi0+ZGF0YTsKLQotCQlhYiA9IGFiLT5uZXh0OwotCQlkID0gJmFiLT5kZXNjcmlwdG9yOwotCQlzaXplID0gc3RhcnQgKyBQQUdFX1NJWkUgLSBjdHgtPnBvaW50ZXI7Ci0JCS8qIHZhbGlkIGJ1ZmZlciBkYXRhIGluIHRoZSBuZXh0IHBhZ2UgKi8KLQkJcmVzdCA9IGxlMTZfdG9fY3B1KGQtPnJlcV9jb3VudCkgLSBsZTE2X3RvX2NwdShkLT5yZXNfY291bnQpOwotCQkvKiB3aGF0IGFjdHVhbGx5IGZpdHMgaW4gdGhpcyBwYWdlICovCi0JCXNpemUyID0gbWluKHJlc3QsIChzaXplX3QpUEFHRV9TSVpFIC0gb2Zmc2V0IC0gc2l6ZSk7Ci0JCW1lbW1vdmUoYnVmZmVyLCBjdHgtPnBvaW50ZXIsIHNpemUpOwotCQltZW1jcHkoYnVmZmVyICsgc2l6ZSwgYWItPmRhdGEsIHNpemUyKTsKLQotCQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJCXZvaWQgKm5leHQgPSBoYW5kbGVfYXJfcGFja2V0KGN0eCwgYnVmZmVyKTsKLQkJCXBrdHNpemUgPSBuZXh0IC0gYnVmZmVyOwotCQkJaWYgKHBrdHNpemUgPj0gc2l6ZSkgewotCQkJCS8qCi0JCQkJICogV2UgaGF2ZSBoYW5kbGVkIGFsbCB0aGUgZGF0YSB0aGF0IHdhcwotCQkJCSAqIG9yaWdpbmFsbHkgaW4gdGhpcyBwYWdlLCBzbyB3ZSBjYW4gbm93Ci0JCQkJICogY29udGludWUgaW4gdGhlIG5leHQgcGFnZS4KLQkJCQkgKi8KLQkJCQlidWZmZXIgPSBuZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogbW92ZSB0aGUgbmV4dCBwYWNrZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLQkJCW1lbW1vdmUoYnVmZmVyLCBuZXh0LCBzaXplICsgc2l6ZTIgLSBwa3RzaXplKTsKLQkJCXNpemUgLT0gcGt0c2l6ZTsKLQkJCS8qIGZpbGwgdXAgdGhpcyBwYWdlIGFnYWluICovCi0JCQlzaXplMyA9IG1pbihyZXN0IC0gc2l6ZTIsCi0JCQkJICAgIChzaXplX3QpUEFHRV9TSVpFIC0gb2Zmc2V0IC0gc2l6ZSAtIHNpemUyKTsKLQkJCW1lbWNweShidWZmZXIgKyBzaXplICsgc2l6ZTIsCi0JCQkgICAgICAgKHZvaWQgKikgYWItPmRhdGEgKyBzaXplMiwgc2l6ZTMpOwotCQkJc2l6ZTIgKz0gc2l6ZTM7Ci0JCX0KLQotCQlpZiAocmVzdCA+IDApIHsKLQkJCS8qIGhhbmRsZSB0aGUgcGFja2V0cyB0aGF0IGFyZSBmdWxseSBpbiB0aGUgbmV4dCBwYWdlICovCi0JCQlidWZmZXIgPSAodm9pZCAqKSBhYi0+ZGF0YSArCi0JCQkJCShidWZmZXIgLSAoc3RhcnQgKyBvZmZzZXQgKyBzaXplKSk7Ci0JCQllbmQgPSAodm9pZCAqKSBhYi0+ZGF0YSArIHJlc3Q7Ci0KLQkJCXdoaWxlIChidWZmZXIgPCBlbmQpCi0JCQkJYnVmZmVyID0gaGFuZGxlX2FyX3BhY2tldChjdHgsIGJ1ZmZlcik7Ci0KLQkJCWN0eC0+Y3VycmVudF9idWZmZXIgPSBhYjsKLQkJCWN0eC0+cG9pbnRlciA9IGVuZDsKLQotCQkJYXJfY29udGV4dF9saW5rX3BhZ2UoY3R4LCBzdGFydCwgc3RhcnRfYnVzKTsKLQkJfSBlbHNlIHsKLQkJCWN0eC0+cG9pbnRlciA9IHN0YXJ0ICsgUEFHRV9TSVpFOwotCQl9Ci0JfSBlbHNlIHsKLQkJYnVmZmVyID0gY3R4LT5wb2ludGVyOwotCQljdHgtPnBvaW50ZXIgPSBlbmQgPQotCQkJKHZvaWQgKikgYWIgKyBQQUdFX1NJWkUgLSBsZTE2X3RvX2NwdShyZXNfY291bnQpOwotCi0JCXdoaWxlIChidWZmZXIgPCBlbmQpCi0JCQlidWZmZXIgPSBoYW5kbGVfYXJfcGFja2V0KGN0eCwgYnVmZmVyKTsKKwlpID0gYXJfZmlyc3RfYnVmZmVyX2luZGV4KGN0eCk7CisJd2hpbGUgKGkgIT0gZW5kX2J1ZmZlcikgeworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjdHgtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCQkgICBhcl9idWZmZXJfYnVzKGN0eCwgaSksCisJCQkJCSAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJYXJfY29udGV4dF9saW5rX3BhZ2UoY3R4LCBpKTsKKwkJaSA9IGFyX25leHRfYnVmZmVyX2luZGV4KGkpOwogCX0KIH0KIAotc3RhdGljIGludCBhcl9jb250ZXh0X2luaXQoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwKLQkJCSAgIHN0cnVjdCBmd19vaGNpICpvaGNpLCB1MzIgcmVncykKK3N0YXRpYyB2b2lkIGFyX2NvbnRleHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFyX2J1ZmZlciBhYjsKKwlzdHJ1Y3QgYXJfY29udGV4dCAqY3R4ID0gKHN0cnVjdCBhcl9jb250ZXh0ICopZGF0YTsKKwl1bnNpZ25lZCBpbnQgZW5kX2J1ZmZlcl9pbmRleCwgZW5kX2J1ZmZlcl9vZmZzZXQ7CisJdm9pZCAqcCwgKmVuZDsKKworCXAgPSBjdHgtPnBvaW50ZXI7CisJaWYgKCFwKQorCQlyZXR1cm47CisKKwllbmRfYnVmZmVyX2luZGV4ID0gYXJfc2VhcmNoX2xhc3RfYWN0aXZlX2J1ZmZlcihjdHgsCisJCQkJCQkJJmVuZF9idWZmZXJfb2Zmc2V0KTsKKwlhcl9zeW5jX2J1ZmZlcnNfZm9yX2NwdShjdHgsIGVuZF9idWZmZXJfaW5kZXgsIGVuZF9idWZmZXJfb2Zmc2V0KTsKKwllbmQgPSBjdHgtPmJ1ZmZlciArIGVuZF9idWZmZXJfaW5kZXggKiBQQUdFX1NJWkUgKyBlbmRfYnVmZmVyX29mZnNldDsKKworCWlmIChlbmRfYnVmZmVyX2luZGV4IDwgYXJfZmlyc3RfYnVmZmVyX2luZGV4KGN0eCkpIHsKKwkJLyoKKwkJICogVGhlIGZpbGxlZCBwYXJ0IG9mIHRoZSBvdmVyYWxsIGJ1ZmZlciB3cmFwcyBhcm91bmQ7IGhhbmRsZQorCQkgKiBhbGwgcGFja2V0cyB1cCB0byB0aGUgYnVmZmVyIGVuZCBoZXJlLiAgSWYgdGhlIGxhc3QgcGFja2V0CisJCSAqIHdyYXBzIGFyb3VuZCwgaXRzIHRhaWwgd2lsbCBiZSB2aXNpYmxlIGFmdGVyIHRoZSBidWZmZXIgZW5kCisJCSAqIGJlY2F1c2UgdGhlIGJ1ZmZlciBzdGFydCBwYWdlcyBhcmUgbWFwcGVkIHRoZXJlIGFnYWluLgorCQkgKi8KKwkJdm9pZCAqYnVmZmVyX2VuZCA9IGN0eC0+YnVmZmVyICsgQVJfQlVGRkVSUyAqIFBBR0VfU0laRTsKKwkJcCA9IGhhbmRsZV9hcl9wYWNrZXRzKGN0eCwgcCwgYnVmZmVyX2VuZCk7CisJCWlmIChwIDwgYnVmZmVyX2VuZCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGFkanVzdCBwIHRvIHBvaW50IGJhY2sgaW50byB0aGUgYWN0dWFsIGJ1ZmZlciAqLworCQlwIC09IEFSX0JVRkZFUlMgKiBQQUdFX1NJWkU7CisJfQorCisJcCA9IGhhbmRsZV9hcl9wYWNrZXRzKGN0eCwgcCwgZW5kKTsKKwlpZiAocCAhPSBlbmQpIHsKKwkJaWYgKHAgPiBlbmQpCisJCQlhcl9jb250ZXh0X2Fib3J0KGN0eCwgImluY29uc2lzdGVudCBkZXNjcmlwdG9yIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJY3R4LT5wb2ludGVyID0gcDsKKwlhcl9yZWN5Y2xlX2J1ZmZlcnMoY3R4LCBlbmRfYnVmZmVyX2luZGV4KTsKKworCXJldHVybjsKKworZXJyb3I6CisJY3R4LT5wb2ludGVyID0gTlVMTDsKK30KKworc3RhdGljIGludCBhcl9jb250ZXh0X2luaXQoc3RydWN0IGFyX2NvbnRleHQgKmN0eCwgc3RydWN0IGZ3X29oY2kgKm9oY2ksCisJCQkgICB1bnNpZ25lZCBpbnQgZGVzY3JpcHRvcnNfb2Zmc2V0LCB1MzIgcmVncykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXN0cnVjdCBwYWdlICpwYWdlc1tBUl9CVUZGRVJTICsgQVJfV1JBUEFST1VORF9QQUdFU107CisJc3RydWN0IGRlc2NyaXB0b3IgKmQ7CiAKIAljdHgtPnJlZ3MgICAgICAgID0gcmVnczsKIAljdHgtPm9oY2kgICAgICAgID0gb2hjaTsKLQljdHgtPmxhc3RfYnVmZmVyID0gJmFiOwogCXRhc2tsZXRfaW5pdCgmY3R4LT50YXNrbGV0LCBhcl9jb250ZXh0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWN0eCk7CiAKLQlhcl9jb250ZXh0X2FkZF9wYWdlKGN0eCk7Ci0JYXJfY29udGV4dF9hZGRfcGFnZShjdHgpOwotCWN0eC0+Y3VycmVudF9idWZmZXIgPSBhYi5uZXh0OwotCWN0eC0+cG9pbnRlciA9IGN0eC0+Y3VycmVudF9idWZmZXItPmRhdGE7CisJZm9yIChpID0gMDsgaSA8IEFSX0JVRkZFUlM7IGkrKykgeworCQljdHgtPnBhZ2VzW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyKTsKKwkJaWYgKCFjdHgtPnBhZ2VzW2ldKQorCQkJZ290byBvdXRfb2ZfbWVtb3J5OworCQlkbWFfYWRkciA9IGRtYV9tYXBfcGFnZShvaGNpLT5jYXJkLmRldmljZSwgY3R4LT5wYWdlc1tpXSwKKwkJCQkJMCwgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3Iob2hjaS0+Y2FyZC5kZXZpY2UsIGRtYV9hZGRyKSkgeworCQkJX19mcmVlX3BhZ2UoY3R4LT5wYWdlc1tpXSk7CisJCQljdHgtPnBhZ2VzW2ldID0gTlVMTDsKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJfQorCQlzZXRfcGFnZV9wcml2YXRlKGN0eC0+cGFnZXNbaV0sIGRtYV9hZGRyKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJfQlVGRkVSUzsgaSsrKQorCQlwYWdlc1tpXSAgICAgICAgICAgICAgPSBjdHgtPnBhZ2VzW2ldOworCWZvciAoaSA9IDA7IGkgPCBBUl9XUkFQQVJPVU5EX1BBR0VTOyBpKyspCisJCXBhZ2VzW0FSX0JVRkZFUlMgKyBpXSA9IGN0eC0+cGFnZXNbaV07CisJY3R4LT5idWZmZXIgPSB2bV9tYXBfcmFtKHBhZ2VzLCBBUl9CVUZGRVJTICsgQVJfV1JBUEFST1VORF9QQUdFUywKKwkJCQkgLTEsIFBBR0VfS0VSTkVMKTsKKwlpZiAoIWN0eC0+YnVmZmVyKQorCQlnb3RvIG91dF9vZl9tZW1vcnk7CisKKwljdHgtPmRlc2NyaXB0b3JzICAgICA9IG9oY2ktPm1pc2NfYnVmZmVyICAgICArIGRlc2NyaXB0b3JzX29mZnNldDsKKwljdHgtPmRlc2NyaXB0b3JzX2J1cyA9IG9oY2ktPm1pc2NfYnVmZmVyX2J1cyArIGRlc2NyaXB0b3JzX29mZnNldDsKKworCWZvciAoaSA9IDA7IGkgPCBBUl9CVUZGRVJTOyBpKyspIHsKKwkJZCA9ICZjdHgtPmRlc2NyaXB0b3JzW2ldOworCQlkLT5yZXFfY291bnQgICAgICA9IGNwdV90b19sZTE2KFBBR0VfU0laRSk7CisJCWQtPmNvbnRyb2wgICAgICAgID0gY3B1X3RvX2xlMTYoREVTQ1JJUFRPUl9JTlBVVF9NT1JFIHwKKwkJCQkJCURFU0NSSVBUT1JfU1RBVFVTIHwKKwkJCQkJCURFU0NSSVBUT1JfQlJBTkNIX0FMV0FZUyk7CisJCWQtPmRhdGFfYWRkcmVzcyAgID0gY3B1X3RvX2xlMzIoYXJfYnVmZmVyX2J1cyhjdHgsIGkpKTsKKwkJZC0+YnJhbmNoX2FkZHJlc3MgPSBjcHVfdG9fbGUzMihjdHgtPmRlc2NyaXB0b3JzX2J1cyArCisJCQlhcl9uZXh0X2J1ZmZlcl9pbmRleChpKSAqIHNpemVvZihzdHJ1Y3QgZGVzY3JpcHRvcikpOworCX0KIAogCXJldHVybiAwOworCitvdXRfb2ZfbWVtb3J5OgorCWFyX2NvbnRleHRfcmVsZWFzZShjdHgpOworCisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB2b2lkIGFyX2NvbnRleHRfcnVuKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqYWIgPSBjdHgtPmN1cnJlbnRfYnVmZmVyOwotCWRtYV9hZGRyX3QgYWJfYnVzOwotCXNpemVfdCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGk7CiAKLQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYXJfYnVmZmVyLCBkYXRhKTsKLQlhYl9idXMgPSBsZTMyX3RvX2NwdShhYi0+ZGVzY3JpcHRvci5kYXRhX2FkZHJlc3MpIC0gb2Zmc2V0OworCWZvciAoaSA9IDA7IGkgPCBBUl9CVUZGRVJTOyBpKyspCisJCWFyX2NvbnRleHRfbGlua19wYWdlKGN0eCwgaSk7CiAKLQlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT01NQU5EX1BUUihjdHgtPnJlZ3MpLCBhYl9idXMgfCAxKTsKKwljdHgtPnBvaW50ZXIgPSBjdHgtPmJ1ZmZlcjsKKworCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTU1BTkRfUFRSKGN0eC0+cmVncyksIGN0eC0+ZGVzY3JpcHRvcnNfYnVzIHwgMSk7CiAJcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSwgQ09OVEVYVF9SVU4pOwogCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOwogfQpAQCAtMTA0Miw2ICsxMTczLDcgQEAKIAkJICBsZTMyX3RvX2NwdShjdHgtPmxhc3QtPmJyYW5jaF9hZGRyZXNzKSk7CiAJcmVnX3dyaXRlKG9oY2ksIENPTlRST0xfQ0xFQVIoY3R4LT5yZWdzKSwgfjApOwogCXJlZ193cml0ZShvaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpLCBDT05URVhUX1JVTiB8IGV4dHJhKTsKKwljdHgtPnJ1bm5pbmcgPSB0cnVlOwogCWZsdXNoX3dyaXRlcyhvaGNpKTsKIH0KIApAQCAtMTA2OSw2ICsxMjAxLDcgQEAKIAlpbnQgaTsKIAogCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTlRST0xfQ0xFQVIoY3R4LT5yZWdzKSwgQ09OVEVYVF9SVU4pOworCWN0eC0+cnVubmluZyA9IGZhbHNlOwogCWZsdXNoX3dyaXRlcyhjdHgtPm9oY2kpOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKQEAgLTEwOTksNyArMTIzMiw2IEBACiAJc3RydWN0IGRlc2NyaXB0b3IgKmQsICpsYXN0OwogCV9fbGUzMiAqaGVhZGVyOwogCWludCB6LCB0Y29kZTsKLQl1MzIgcmVnOwogCiAJZCA9IGNvbnRleHRfZ2V0X2Rlc2NyaXB0b3JzKGN0eCwgNCwgJmRfYnVzKTsKIAlpZiAoZCA9PSBOVUxMKSB7CkBAIC0xMTEzLDIxICsxMjQ1LDI3IEBACiAJLyoKIAkgKiBUaGUgRE1BIGZvcm1hdCBmb3IgYXN5bmNyb25vdXMgbGluayBwYWNrZXRzIGlzIGRpZmZlcmVudAogCSAqIGZyb20gdGhlIElFRUUxMzk0IGxheW91dCwgc28gc2hpZnQgdGhlIGZpZWxkcyBhcm91bmQKLQkgKiBhY2NvcmRpbmdseS4gIElmIGhlYWRlcl9sZW5ndGggaXMgOCwgaXQncyBhIFBIWSBwYWNrZXQsIHRvCi0JICogd2hpY2ggd2UgbmVlZCB0byBwcmVwZW5kIGFuIGV4dHJhIHF1YWRsZXQuCisJICogYWNjb3JkaW5nbHkuCiAJICovCiAKKwl0Y29kZSA9IChwYWNrZXQtPmhlYWRlclswXSA+PiA0KSAmIDB4MGY7CiAJaGVhZGVyID0gKF9fbGUzMiAqKSAmZFsxXTsKLQlzd2l0Y2ggKHBhY2tldC0+aGVhZGVyX2xlbmd0aCkgewotCWNhc2UgMTY6Ci0JY2FzZSAxMjoKKwlzd2l0Y2ggKHRjb2RlKSB7CisJY2FzZSBUQ09ERV9XUklURV9RVUFETEVUX1JFUVVFU1Q6CisJY2FzZSBUQ09ERV9XUklURV9CTE9DS19SRVFVRVNUOgorCWNhc2UgVENPREVfV1JJVEVfUkVTUE9OU0U6CisJY2FzZSBUQ09ERV9SRUFEX1FVQURMRVRfUkVRVUVTVDoKKwljYXNlIFRDT0RFX1JFQURfQkxPQ0tfUkVRVUVTVDoKKwljYXNlIFRDT0RFX1JFQURfUVVBRExFVF9SRVNQT05TRToKKwljYXNlIFRDT0RFX1JFQURfQkxPQ0tfUkVTUE9OU0U6CisJY2FzZSBUQ09ERV9MT0NLX1JFUVVFU1Q6CisJY2FzZSBUQ09ERV9MT0NLX1JFU1BPTlNFOgogCQloZWFkZXJbMF0gPSBjcHVfdG9fbGUzMigocGFja2V0LT5oZWFkZXJbMF0gJiAweGZmZmYpIHwKIAkJCQkJKHBhY2tldC0+c3BlZWQgPDwgMTYpKTsKIAkJaGVhZGVyWzFdID0gY3B1X3RvX2xlMzIoKHBhY2tldC0+aGVhZGVyWzFdICYgMHhmZmZmKSB8CiAJCQkJCShwYWNrZXQtPmhlYWRlclswXSAmIDB4ZmZmZjAwMDApKTsKIAkJaGVhZGVyWzJdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMl0pOwogCi0JCXRjb2RlID0gKHBhY2tldC0+aGVhZGVyWzBdID4+IDQpICYgMHgwZjsKIAkJaWYgKFRDT0RFX0lTX0JMT0NLX1BBQ0tFVCh0Y29kZSkpCiAJCQloZWFkZXJbM10gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclszXSk7CiAJCWVsc2UKQEAgLTExMzYsMTggKzEyNzQsMTggQEAKIAkJZFswXS5yZXFfY291bnQgPSBjcHVfdG9fbGUxNihwYWNrZXQtPmhlYWRlcl9sZW5ndGgpOwogCQlicmVhazsKIAotCWNhc2UgODoKKwljYXNlIFRDT0RFX0xJTktfSU5URVJOQUw6CiAJCWhlYWRlclswXSA9IGNwdV90b19sZTMyKChPSENJMTM5NF9waHlfdGNvZGUgPDwgNCkgfAogCQkJCQkocGFja2V0LT5zcGVlZCA8PCAxNikpOwotCQloZWFkZXJbMV0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclswXSk7Ci0JCWhlYWRlclsyXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzFdKTsKKwkJaGVhZGVyWzFdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMV0pOworCQloZWFkZXJbMl0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclsyXSk7CiAJCWRbMF0ucmVxX2NvdW50ID0gY3B1X3RvX2xlMTYoMTIpOwogCi0JCWlmIChpc19waW5nX3BhY2tldChwYWNrZXQtPmhlYWRlcikpCisJCWlmIChpc19waW5nX3BhY2tldCgmcGFja2V0LT5oZWFkZXJbMV0pKQogCQkJZFswXS5jb250cm9sIHw9IGNwdV90b19sZTE2KERFU0NSSVBUT1JfUElORyk7CiAJCWJyZWFrOwogCi0JY2FzZSA0OgorCWNhc2UgVENPREVfU1RSRUFNX0RBVEE6CiAJCWhlYWRlclswXSA9IGNwdV90b19sZTMyKChwYWNrZXQtPmhlYWRlclswXSAmIDB4ZmZmZikgfAogCQkJCQkocGFja2V0LT5zcGVlZCA8PCAxNikpOwogCQloZWFkZXJbMV0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclswXSAmIDB4ZmZmZjAwMDApOwpAQCAtMTE5Nyw2ICsxMzM1LDggQEAKIAkgKiBzb21lIGNvbnRyb2xsZXJzIChsaWtlIGEgSk1pY3JvbiBKTUIzODEgUENJLWUpIG1pc2JlaGF2ZSBhbmQgd2luZAogCSAqIHVwIHN0YWxsaW5nIG91dC4gIFNvIHdlIGp1c3QgYmFpbCBvdXQgaW4gc29mdHdhcmUgYW5kIHRyeSBhZ2FpbgogCSAqIGxhdGVyLCBhbmQgZXZlcnlvbmUgaXMgaGFwcHkuCisJICogRklYTUU6IFRlc3Qgb2YgSW50RXZlbnQuYnVzUmVzZXQgbWF5IG5vIGxvbmdlciBiZSBuZWNlc3Nhcnkgc2luY2Ugd2UKKwkgKiAgICAgICAgZmx1c2ggQVQgcXVldWVzIGluIGJ1c19yZXNldF90YXNrbGV0LgogCSAqIEZJWE1FOiBEb2N1bWVudCBob3cgdGhlIGxvY2tpbmcgd29ya3MuCiAJICovCiAJaWYgKG9oY2ktPmdlbmVyYXRpb24gIT0gcGFja2V0LT5nZW5lcmF0aW9uIHx8CkBAIC0xMjEwLDE0ICsxMzUwLDIzIEBACiAKIAljb250ZXh0X2FwcGVuZChjdHgsIGQsIHosIDQgLSB6KTsKIAotCS8qIElmIHRoZSBjb250ZXh0IGlzbid0IGFscmVhZHkgcnVubmluZywgc3RhcnQgaXQgdXAuICovCi0JcmVnID0gcmVnX3JlYWQoY3R4LT5vaGNpLCBDT05UUk9MX1NFVChjdHgtPnJlZ3MpKTsKLQlpZiAoKHJlZyAmIENPTlRFWFRfUlVOKSA9PSAwKQorCWlmICghY3R4LT5ydW5uaW5nKQogCQljb250ZXh0X3J1bihjdHgsIDApOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGF0X2NvbnRleHRfZmx1c2goc3RydWN0IGNvbnRleHQgKmN0eCkKK3sKKwl0YXNrbGV0X2Rpc2FibGUoJmN0eC0+dGFza2xldCk7CisKKwljdHgtPmZsdXNoaW5nID0gdHJ1ZTsKKwljb250ZXh0X3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpY3R4KTsKKwljdHgtPmZsdXNoaW5nID0gZmFsc2U7CisKKwl0YXNrbGV0X2VuYWJsZSgmY3R4LT50YXNrbGV0KTsKK30KKwogc3RhdGljIGludCBoYW5kbGVfYXRfcGFja2V0KHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAogCQkJICAgIHN0cnVjdCBkZXNjcmlwdG9yICpkLAogCQkJICAgIHN0cnVjdCBkZXNjcmlwdG9yICpsYXN0KQpAQCAtMTIyNyw3ICsxMzc2LDcgQEAKIAlzdHJ1Y3QgZndfb2hjaSAqb2hjaSA9IGNvbnRleHQtPm9oY2k7CiAJaW50IGV2dDsKIAotCWlmIChsYXN0LT50cmFuc2Zlcl9zdGF0dXMgPT0gMCkKKwlpZiAobGFzdC0+dHJhbnNmZXJfc3RhdHVzID09IDAgJiYgIWNvbnRleHQtPmZsdXNoaW5nKQogCQkvKiBUaGlzIGRlc2NyaXB0b3IgaXNuJ3QgZG9uZSB5ZXQsIHN0b3AgaXRlcmF0aW9uLiAqLwogCQlyZXR1cm4gMDsKIApAQCAtMTI2MSwxMSArMTQxMCwxNSBAQAogCQlicmVhazsKIAogCWNhc2UgT0hDSTEzOTRfZXZ0X21pc3NpbmdfYWNrOgotCQkvKgotCQkgKiBVc2luZyBhIHZhbGlkIChjdXJyZW50KSBnZW5lcmF0aW9uIGNvdW50LCBidXQgdGhlCi0JCSAqIG5vZGUgaXMgbm90IG9uIHRoZSBidXMgb3Igbm90IHNlbmRpbmcgYWNrcy4KLQkJICovCi0JCXBhY2tldC0+YWNrID0gUkNPREVfTk9fQUNLOworCQlpZiAoY29udGV4dC0+Zmx1c2hpbmcpCisJCQlwYWNrZXQtPmFjayA9IFJDT0RFX0dFTkVSQVRJT047CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIFVzaW5nIGEgdmFsaWQgKGN1cnJlbnQpIGdlbmVyYXRpb24gY291bnQsIGJ1dCB0aGUKKwkJCSAqIG5vZGUgaXMgbm90IG9uIHRoZSBidXMgb3Igbm90IHNlbmRpbmcgYWNrcy4KKwkJCSAqLworCQkJcGFja2V0LT5hY2sgPSBSQ09ERV9OT19BQ0s7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEFDS19DT01QTEVURSArIDB4MTA6CkBAIC0xMjc4LDYgKzE0MzEsMTMgQEAKIAkJcGFja2V0LT5hY2sgPSBldnQgLSAweDEwOwogCQlicmVhazsKIAorCWNhc2UgT0hDSTEzOTRfZXZ0X25vX3N0YXR1czoKKwkJaWYgKGNvbnRleHQtPmZsdXNoaW5nKSB7CisJCQlwYWNrZXQtPmFjayA9IFJDT0RFX0dFTkVSQVRJT047CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwogCWRlZmF1bHQ6CiAJCXBhY2tldC0+YWNrID0gUkNPREVfU0VORF9FUlJPUjsKIAkJYnJlYWs7CkBAIC0xNTgzLDkgKzE3NDMsMjMgQEAKIAkvKiBGSVhNRTogRG9jdW1lbnQgaG93IHRoZSBsb2NraW5nIHdvcmtzLiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5sb2NrLCBmbGFncyk7CiAKLQlvaGNpLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKwlvaGNpLT5nZW5lcmF0aW9uID0gLTE7IC8qIHByZXZlbnQgQVQgcGFja2V0IHF1ZXVlaW5nICovCiAJY29udGV4dF9zdG9wKCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCk7CiAJY29udGV4dF9zdG9wKCZvaGNpLT5hdF9yZXNwb25zZV9jdHgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBQZXIgT0hDSSAxLjIgZHJhZnQsIGNsYXVzZSA3LjIuMy4zLCBoYXJkd2FyZSBtYXkgbGVhdmUgdW5zZW50CisJICogcGFja2V0cyBpbiB0aGUgQVQgcXVldWVzIGFuZCBzb2Z0d2FyZSBuZWVkcyB0byBkcmFpbiB0aGVtLgorCSAqIFNvbWUgT0hDSSAxLjEgY29udHJvbGxlcnMgKEpNaWNyb24pIGFwcGFyZW50bHkgcmVxdWlyZSB0aGlzIHRvby4KKwkgKi8KKwlhdF9jb250ZXh0X2ZsdXNoKCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCk7CisJYXRfY29udGV4dF9mbHVzaCgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5sb2NrLCBmbGFncyk7CisKKwlvaGNpLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgT0hDSTEzOTRfYnVzUmVzZXQpOwogCiAJaWYgKG9oY2ktPnF1aXJrcyAmIFFVSVJLX1JFU0VUX1BBQ0tFVCkKQEAgLTE2NTMsOCArMTgyNywxMiBAQAogCWlmICghZXZlbnQgfHwgIX5ldmVudCkKIAkJcmV0dXJuIElSUV9OT05FOwogCi0JLyogYnVzUmVzZXQgbXVzdCBub3QgYmUgY2xlYXJlZCB5ZXQsIHNlZSBPSENJIDEuMSBjbGF1c2UgNy4yLjMuMiAqLwotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCBldmVudCAmIH5PSENJMTM5NF9idXNSZXNldCk7CisJLyoKKwkgKiBidXNSZXNldCBhbmQgcG9zdGVkV3JpdGVFcnIgbXVzdCBub3QgYmUgY2xlYXJlZCB5ZXQKKwkgKiAoT0hDSSAxLjEgY2xhdXNlcyA3LjIuMy4yIGFuZCAxMy4yLjguMSkKKwkgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwKKwkJICBldmVudCAmIH4oT0hDSTEzOTRfYnVzUmVzZXQgfCBPSENJMTM5NF9wb3N0ZWRXcml0ZUVycikpOwogCWxvZ19pcnFzKGV2ZW50KTsKIAogCWlmIChldmVudCAmIE9IQ0kxMzk0X3NlbGZJRENvbXBsZXRlKQpAQCAtMTY3MiwzMCArMTg1MCw0MSBAQAogCWlmIChldmVudCAmIE9IQ0kxMzk0X3Jlc3BUeENvbXBsZXRlKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZvaGNpLT5hdF9yZXNwb25zZV9jdHgudGFza2xldCk7CiAKLQlpc29fZXZlbnQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhcik7Ci0JcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyLCBpc29fZXZlbnQpOworCWlmIChldmVudCAmIE9IQ0kxMzk0X2lzb2NoUngpIHsKKwkJaXNvX2V2ZW50ID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludEV2ZW50Q2xlYXIpOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludEV2ZW50Q2xlYXIsIGlzb19ldmVudCk7CiAKLQl3aGlsZSAoaXNvX2V2ZW50KSB7Ci0JCWkgPSBmZnMoaXNvX2V2ZW50KSAtIDE7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJm9oY2ktPmlyX2NvbnRleHRfbGlzdFtpXS5jb250ZXh0LnRhc2tsZXQpOwotCQlpc29fZXZlbnQgJj0gfigxIDw8IGkpOworCQl3aGlsZSAoaXNvX2V2ZW50KSB7CisJCQlpID0gZmZzKGlzb19ldmVudCkgLSAxOworCQkJdGFza2xldF9zY2hlZHVsZSgKKwkJCQkmb2hjaS0+aXJfY29udGV4dF9saXN0W2ldLmNvbnRleHQudGFza2xldCk7CisJCQlpc29fZXZlbnQgJj0gfigxIDw8IGkpOworCQl9CiAJfQogCi0JaXNvX2V2ZW50ID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIpOwotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhciwgaXNvX2V2ZW50KTsKKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9pc29jaFR4KSB7CisJCWlzb19ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRFdmVudENsZWFyKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRFdmVudENsZWFyLCBpc29fZXZlbnQpOwogCi0Jd2hpbGUgKGlzb19ldmVudCkgewotCQlpID0gZmZzKGlzb19ldmVudCkgLSAxOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZvaGNpLT5pdF9jb250ZXh0X2xpc3RbaV0uY29udGV4dC50YXNrbGV0KTsKLQkJaXNvX2V2ZW50ICY9IH4oMSA8PCBpKTsKKwkJd2hpbGUgKGlzb19ldmVudCkgeworCQkJaSA9IGZmcyhpc29fZXZlbnQpIC0gMTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoCisJCQkJJm9oY2ktPml0X2NvbnRleHRfbGlzdFtpXS5jb250ZXh0LnRhc2tsZXQpOworCQkJaXNvX2V2ZW50ICY9IH4oMSA8PCBpKTsKKwkJfQogCX0KIAogCWlmICh1bmxpa2VseShldmVudCAmIE9IQ0kxMzk0X3JlZ0FjY2Vzc0ZhaWwpKQogCQlmd19lcnJvcigiUmVnaXN0ZXIgYWNjZXNzIGZhaWx1cmUgLSAiCiAJCQkgInBsZWFzZSBub3RpZnkgbGludXgxMzk0LWRldmVsQGxpc3RzLnNmLm5ldFxuIik7CiAKLQlpZiAodW5saWtlbHkoZXZlbnQgJiBPSENJMTM5NF9wb3N0ZWRXcml0ZUVycikpCisJaWYgKHVubGlrZWx5KGV2ZW50ICYgT0hDSTEzOTRfcG9zdGVkV3JpdGVFcnIpKSB7CisJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1Bvc3RlZFdyaXRlQWRkcmVzc0hpKTsKKwkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfUG9zdGVkV3JpdGVBZGRyZXNzTG8pOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwKKwkJCSAgT0hDSTEzOTRfcG9zdGVkV3JpdGVFcnIpOwogCQlmd19lcnJvcigiUENJIHBvc3RlZCB3cml0ZSBlcnJvclxuIik7CisJfQogCiAJaWYgKHVubGlrZWx5KGV2ZW50ICYgT0hDSTEzOTRfY3ljbGVUb29Mb25nKSkgewogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQpAQCAtMTcxOSw3ICsxOTA4LDggQEAKIAkJc3Bpbl9sb2NrKCZvaGNpLT5sb2NrKTsKIAkJdXBkYXRlX2J1c190aW1lKG9oY2kpOwogCQlzcGluX3VubG9jaygmb2hjaS0+bG9jayk7Ci0JfQorCX0gZWxzZQorCQlmbHVzaF93cml0ZXMob2hjaSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yNDk1LDYgKzI2ODUsMTAgQEAKIAkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrU2V0LCAxIDw8IGluZGV4KTsKIAkJcmVnX3dyaXRlKG9oY2ksIENPTlRFWFRfTUFUQ0goY3R4LT5jb250ZXh0LnJlZ3MpLCBtYXRjaCk7CiAJCWNvbnRleHRfcnVuKCZjdHgtPmNvbnRleHQsIGNvbnRyb2wpOworCisJCWN0eC0+c3luYyA9IHN5bmM7CisJCWN0eC0+dGFncyA9IHRhZ3M7CisKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTkyLDYgKzI3ODYsMjYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBvaGNpX3Jlc3VtZV9pc29fZG1hKHN0cnVjdCBmd19vaGNpICpvaGNpKQoreworCWludCBpOworCXN0cnVjdCBpc29fY29udGV4dCAqY3R4OworCisJZm9yIChpID0gMCA7IGkgPCBvaGNpLT5uX2lyIDsgaSsrKSB7CisJCWN0eCA9ICZvaGNpLT5pcl9jb250ZXh0X2xpc3RbaV07CisJCWlmIChjdHgtPmNvbnRleHQucnVubmluZykKKwkJCW9oY2lfc3RhcnRfaXNvKCZjdHgtPmJhc2UsIDAsIGN0eC0+c3luYywgY3R4LT50YWdzKTsKKwl9CisKKwlmb3IgKGkgPSAwIDsgaSA8IG9oY2ktPm5faXQgOyBpKyspIHsKKwkJY3R4ID0gJm9oY2ktPml0X2NvbnRleHRfbGlzdFtpXTsKKwkJaWYgKGN0eC0+Y29udGV4dC5ydW5uaW5nKQorCQkJb2hjaV9zdGFydF9pc28oJmN0eC0+YmFzZSwgMCwgY3R4LT5zeW5jLCBjdHgtPnRhZ3MpOworCX0KK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IHF1ZXVlX2lzb190cmFuc21pdChzdHJ1Y3QgaXNvX2NvbnRleHQgKmN0eCwKIAkJCSAgICAgIHN0cnVjdCBmd19pc29fcGFja2V0ICpwYWNrZXQsCiAJCQkgICAgICBzdHJ1Y3QgZndfaXNvX2J1ZmZlciAqYnVmZmVyLApAQCAtMjkwMSw3ICszMTE1LDcgQEAKIAlzdHJ1Y3QgZndfb2hjaSAqb2hjaTsKIAl1MzIgYnVzX29wdGlvbnMsIG1heF9yZWNlaXZlLCBsaW5rX3NwZWVkLCB2ZXJzaW9uOwogCXU2NCBndWlkOwotCWludCBpLCBlcnIsIG5faXIsIG5faXQ7CisJaW50IGksIGVycjsKIAlzaXplX3Qgc2l6ZTsKIAogCW9oY2kgPSBremFsbG9jKHNpemVvZigqb2hjaSksIEdGUF9LRVJORUwpOwpAQCAtMjk1NSwzMSArMzE2OSw1NSBAQAogCWlmIChwYXJhbV9xdWlya3MpCiAJCW9oY2ktPnF1aXJrcyA9IHBhcmFtX3F1aXJrczsKIAotCWFyX2NvbnRleHRfaW5pdCgmb2hjaS0+YXJfcmVxdWVzdF9jdHgsIG9oY2ksCi0JCQlPSENJMTM5NF9Bc1JlcVJjdkNvbnRleHRDb250cm9sU2V0KTsKKwkvKgorCSAqIEJlY2F1c2UgZG1hX2FsbG9jX2NvaGVyZW50KCkgYWxsb2NhdGVzIGF0IGxlYXN0IG9uZSBwYWdlLAorCSAqIHdlIHNhdmUgc3BhY2UgYnkgdXNpbmcgYSBjb21tb24gYnVmZmVyIGZvciB0aGUgQVIgcmVxdWVzdC8KKwkgKiByZXNwb25zZSBkZXNjcmlwdG9ycyBhbmQgdGhlIHNlbGYgSURzIGJ1ZmZlci4KKwkgKi8KKwlCVUlMRF9CVUdfT04oQVJfQlVGRkVSUyAqIHNpemVvZihzdHJ1Y3QgZGVzY3JpcHRvcikgPiBQQUdFX1NJWkUvNCk7CisJQlVJTERfQlVHX09OKFNFTEZfSURfQlVGX1NJWkUgPiBQQUdFX1NJWkUvMik7CisJb2hjaS0+bWlzY19idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJCSAgICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgICAmb2hjaS0+bWlzY19idWZmZXJfYnVzLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFvaGNpLT5taXNjX2J1ZmZlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW91bm1hcDsKKwl9CiAKLQlhcl9jb250ZXh0X2luaXQoJm9oY2ktPmFyX3Jlc3BvbnNlX2N0eCwgb2hjaSwKLQkJCU9IQ0kxMzk0X0FzUnNwUmN2Q29udGV4dENvbnRyb2xTZXQpOworCWVyciA9IGFyX2NvbnRleHRfaW5pdCgmb2hjaS0+YXJfcmVxdWVzdF9jdHgsIG9oY2ksIDAsCisJCQkgICAgICBPSENJMTM5NF9Bc1JlcVJjdkNvbnRleHRDb250cm9sU2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX21pc2NfYnVmOwogCi0JY29udGV4dF9pbml0KCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCwgb2hjaSwKLQkJICAgICBPSENJMTM5NF9Bc1JlcVRyQ29udGV4dENvbnRyb2xTZXQsIGhhbmRsZV9hdF9wYWNrZXQpOworCWVyciA9IGFyX2NvbnRleHRfaW5pdCgmb2hjaS0+YXJfcmVzcG9uc2VfY3R4LCBvaGNpLCBQQUdFX1NJWkUvNCwKKwkJCSAgICAgIE9IQ0kxMzk0X0FzUnNwUmN2Q29udGV4dENvbnRyb2xTZXQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfYXJyZXFfY3R4OwogCi0JY29udGV4dF9pbml0KCZvaGNpLT5hdF9yZXNwb25zZV9jdHgsIG9oY2ksCi0JCSAgICAgT0hDSTEzOTRfQXNSc3BUckNvbnRleHRDb250cm9sU2V0LCBoYW5kbGVfYXRfcGFja2V0KTsKKwllcnIgPSBjb250ZXh0X2luaXQoJm9oY2ktPmF0X3JlcXVlc3RfY3R4LCBvaGNpLAorCQkJICAgT0hDSTEzOTRfQXNSZXFUckNvbnRleHRDb250cm9sU2V0LCBoYW5kbGVfYXRfcGFja2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX2FycnNwX2N0eDsKKworCWVyciA9IGNvbnRleHRfaW5pdCgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4LCBvaGNpLAorCQkJICAgT0hDSTEzOTRfQXNSc3BUckNvbnRleHRDb250cm9sU2V0LCBoYW5kbGVfYXRfcGFja2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX2F0cmVxX2N0eDsKIAogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza1NldCwgfjApOwogCW9oY2ktPmlyX2NvbnRleHRfY2hhbm5lbHMgPSB+MFVMTDsKIAlvaGNpLT5pcl9jb250ZXh0X21hc2sgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza1NldCk7CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrQ2xlYXIsIH4wKTsKLQluX2lyID0gaHdlaWdodDMyKG9oY2ktPmlyX2NvbnRleHRfbWFzayk7Ci0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNvX2NvbnRleHQpICogbl9pcjsKKwlvaGNpLT5uX2lyID0gaHdlaWdodDMyKG9oY2ktPmlyX2NvbnRleHRfbWFzayk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNvX2NvbnRleHQpICogb2hjaS0+bl9pcjsKIAlvaGNpLT5pcl9jb250ZXh0X2xpc3QgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrU2V0LCB+MCk7CiAJb2hjaS0+aXRfY29udGV4dF9tYXNrID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludE1hc2tTZXQpOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza0NsZWFyLCB+MCk7Ci0Jbl9pdCA9IGh3ZWlnaHQzMihvaGNpLT5pdF9jb250ZXh0X21hc2spOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGlzb19jb250ZXh0KSAqIG5faXQ7CisJb2hjaS0+bl9pdCA9IGh3ZWlnaHQzMihvaGNpLT5pdF9jb250ZXh0X21hc2spOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGlzb19jb250ZXh0KSAqIG9oY2ktPm5faXQ7CiAJb2hjaS0+aXRfY29udGV4dF9saXN0ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAogCWlmIChvaGNpLT5pdF9jb250ZXh0X2xpc3QgPT0gTlVMTCB8fCBvaGNpLT5pcl9jb250ZXh0X2xpc3QgPT0gTlVMTCkgewpAQCAtMjk4NywxNSArMzIyNSw4IEBACiAJCWdvdG8gZmFpbF9jb250ZXh0czsKIAl9CiAKLQkvKiBzZWxmLWlkIGRtYSBidWZmZXIgYWxsb2NhdGlvbiAqLwotCW9oY2ktPnNlbGZfaWRfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLAotCQkJCQkgICAgICAgU0VMRl9JRF9CVUZfU0laRSwKLQkJCQkJICAgICAgICZvaGNpLT5zZWxmX2lkX2J1cywKLQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmIChvaGNpLT5zZWxmX2lkX2NwdSA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9jb250ZXh0czsKLQl9CisJb2hjaS0+c2VsZl9pZF9jcHUgPSBvaGNpLT5taXNjX2J1ZmZlciAgICAgKyBQQUdFX1NJWkUvMjsKKwlvaGNpLT5zZWxmX2lkX2J1cyA9IG9oY2ktPm1pc2NfYnVmZmVyX2J1cyArIFBBR0VfU0laRS8yOwogCiAJYnVzX29wdGlvbnMgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKTsKIAltYXhfcmVjZWl2ZSA9IChidXNfb3B0aW9ucyA+PiAxMikgJiAweGY7CkBAIC0zMDA1LDI2ICszMjM2LDMwIEBACiAKIAllcnIgPSBmd19jYXJkX2FkZCgmb2hjaS0+Y2FyZCwgbWF4X3JlY2VpdmUsIGxpbmtfc3BlZWQsIGd1aWQpOwogCWlmIChlcnIpCi0JCWdvdG8gZmFpbF9zZWxmX2lkOworCQlnb3RvIGZhaWxfY29udGV4dHM7CiAKIAl2ZXJzaW9uID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfVmVyc2lvbikgJiAweDAwZmYwMGZmOwogCWZ3X25vdGlmeSgiQWRkZWQgZnctb2hjaSBkZXZpY2UgJXMsIE9IQ0kgdiV4LiV4LCAiCiAJCSAgIiVkIElSICsgJWQgSVQgY29udGV4dHMsIHF1aXJrcyAweCV4XG4iLAogCQkgIGRldl9uYW1lKCZkZXYtPmRldiksIHZlcnNpb24gPj4gMTYsIHZlcnNpb24gJiAweGZmLAotCQkgIG5faXIsIG5faXQsIG9oY2ktPnF1aXJrcyk7CisJCSAgb2hjaS0+bl9pciwgb2hjaS0+bl9pdCwgb2hjaS0+cXVpcmtzKTsKIAogCXJldHVybiAwOwogCi0gZmFpbF9zZWxmX2lkOgotCWRtYV9mcmVlX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLCBTRUxGX0lEX0JVRl9TSVpFLAotCQkJICBvaGNpLT5zZWxmX2lkX2NwdSwgb2hjaS0+c2VsZl9pZF9idXMpOwogIGZhaWxfY29udGV4dHM6CiAJa2ZyZWUob2hjaS0+aXJfY29udGV4dF9saXN0KTsKIAlrZnJlZShvaGNpLT5pdF9jb250ZXh0X2xpc3QpOwogCWNvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4KTsKKyBmYWlsX2F0cmVxX2N0eDoKIAljb250ZXh0X3JlbGVhc2UoJm9oY2ktPmF0X3JlcXVlc3RfY3R4KTsKKyBmYWlsX2FycnNwX2N0eDoKIAlhcl9jb250ZXh0X3JlbGVhc2UoJm9oY2ktPmFyX3Jlc3BvbnNlX2N0eCk7CisgZmFpbF9hcnJlcV9jdHg6CiAJYXJfY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hcl9yZXF1ZXN0X2N0eCk7CisgZmFpbF9taXNjX2J1ZjoKKwlkbWFfZnJlZV9jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwgUEFHRV9TSVpFLAorCQkJICBvaGNpLT5taXNjX2J1ZmZlciwgb2hjaS0+bWlzY19idWZmZXJfYnVzKTsKKyBmYWlsX2lvdW5tYXA6CiAJcGNpX2lvdW5tYXAoZGV2LCBvaGNpLT5yZWdpc3RlcnMpOwogIGZhaWxfaW9tZW06CiAJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7CkBAIC0zMDYzLDEwICszMjk4LDEwIEBACiAJaWYgKG9oY2ktPmNvbmZpZ19yb20pCiAJCWRtYV9mcmVlX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLCBDT05GSUdfUk9NX1NJWkUsCiAJCQkJICBvaGNpLT5jb25maWdfcm9tLCBvaGNpLT5jb25maWdfcm9tX2J1cyk7Ci0JZG1hX2ZyZWVfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsIFNFTEZfSURfQlVGX1NJWkUsCi0JCQkgIG9oY2ktPnNlbGZfaWRfY3B1LCBvaGNpLT5zZWxmX2lkX2J1cyk7CiAJYXJfY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hcl9yZXF1ZXN0X2N0eCk7CiAJYXJfY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hcl9yZXNwb25zZV9jdHgpOworCWRtYV9mcmVlX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLCBQQUdFX1NJWkUsCisJCQkgIG9oY2ktPm1pc2NfYnVmZmVyLCBvaGNpLT5taXNjX2J1ZmZlcl9idXMpOwogCWNvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXRfcmVxdWVzdF9jdHgpOwogCWNvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4KTsKIAlrZnJlZShvaGNpLT5pdF9jb250ZXh0X2xpc3QpOwpAQCAtMzExNyw3ICszMzUyLDIwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JcmV0dXJuIG9oY2lfZW5hYmxlKCZvaGNpLT5jYXJkLCBOVUxMLCAwKTsKKwkvKiBTb21lIHN5c3RlbXMgZG9uJ3Qgc2V0dXAgR1VJRCByZWdpc3RlciBvbiByZXN1bWUgZnJvbSByYW0gICovCisJaWYgKCFyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9HVUlETG8pICYmCisJCQkJCSFyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9HVUlESGkpKSB7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9HVUlETG8sICh1MzIpb2hjaS0+Y2FyZC5ndWlkKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0dVSURIaSwgKHUzMikob2hjaS0+Y2FyZC5ndWlkID4+IDMyKSk7CisJfQorCisJZXJyID0gb2hjaV9lbmFibGUoJm9oY2ktPmNhcmQsIE5VTEwsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlvaGNpX3Jlc3VtZV9pc29fZG1hKG9oY2kpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCAwODI0OTViLi42NjQ2NjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtMTE4LDcgKzExOCw3IEBACiAKIGNvbmZpZyBHUElPX1ZYODU1CiAJdHJpc3RhdGUgIlZJQSBWWDg1NS9WWDg3NSBHUElPIgotCWRlcGVuZHMgb24gR1BJT0xJQgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBNRkRfU1VQUE9SVCAmJiBQQ0kKIAlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgTUZEX1ZYODU1CiAJaGVscApAQCAtMjk1LDcgKzI5NSw3IEBACiAKIGNvbmZpZyBHUElPX0NTNTUzNQogCXRyaXN0YXRlICJBTUQgQ1M1NTM1L0NTNTUzNiBHUElPIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgIUNTNTUzNV9HUElPCisJZGVwZW5kcyBvbiBQQ0kgJiYgWDg2ICYmICFDUzU1MzVfR1BJTwogCWhlbHAKIAkgIFRoZSBBTUQgQ1M1NTM1IGFuZCBDUzU1MzYgc291dGhicmlkZ2VzIHN1cHBvcnQgMjggR1BJTyBwaW5zIHRoYXQKIAkgIGNhbiBiZSB1c2VkIGZvciBxdWl0ZSBhIG51bWJlciBvZiB0aGluZ3MuICBUaGUgQ1M1NTM1LzYgaXMgZm91bmQgb24KQEAgLTMzMyw2ICszMzMsMTUgQEAKIAkgIHdoaWNoIGlzIGFuIElPSChJbnB1dC9PdXRwdXQgSHViKSBmb3IgeDg2IGVtYmVkZGVkIHByb2Nlc3Nvci4KIAkgIFRoaXMgZHJpdmVyIGNhbiBhY2Nlc3MgUENIIEdQSU8gZGV2aWNlLgogCitjb25maWcgR1BJT19NTF9JT0gKKwl0cmlzdGF0ZSAiT0tJIFNFTUlDT05EVUNUT1IgTUw3MjEzIElPSCBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBNTDcyMTMgaXMgY29tcGFuaW9uIGNoaXAgZm9yIEludGVsIEF0b20gRTZ4eCBzZXJpZXMuCisJICBUaGlzIGRyaXZlciBjYW4gYmUgdXNlZCBmb3IgT0tJIFNFTUlDT05EVUNUT1IgTUw3MjEzIElPSChJbnB1dC9PdXRwdXQKKwkgIEh1Yikgd2hpY2ggaXMgZm9yIElWSShJbi1WZWhpY2xlIEluZm90YWlubWVudCkgdXNlLgorCSAgVGhpcyBkcml2ZXIgY2FuIGFjY2VzcyB0aGUgSU9IJ3MgR1BJTyBkZXZpY2UuCisKIGNvbmZpZyBHUElPX1RJTUJFUkRBTEUKIAlib29sICJTdXBwb3J0IGZvciB0aW1iZXJkYWxlIEdQSU8gSVAiCiAJZGVwZW5kcyBvbiBNRkRfVElNQkVSREFMRSAmJiBHUElPTElCICYmIEhBU19JT01FTQpAQCAtMzQyLDYgKzM1MSw3IEBACiBjb25maWcgR1BJT19SREMzMjFYCiAJdHJpc3RhdGUgIlJEQyBSLTMyMXggR1BJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIEdQSU9MSUIKKwlzZWxlY3QgTUZEX1NVUFBPUlQKIAlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgTUZEX1JEQzMyMVgKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKaW5kZXggMzliZmQ3YS4uMzM1MWNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQpAQCAtNDEsMyArNDEsNCBAQAogb2JqLSQoQ09ORklHX0dQSU9fSkFOWl9UVEwpCSs9IGphbnotdHRsLm8KIG9iai0kKENPTkZJR19HUElPX1NYMTUwWCkJKz0gc3gxNTB4Lm8KIG9iai0kKENPTkZJR19HUElPX1ZYODU1KQkrPSB2eDg1NV9ncGlvLm8KK29iai0kKENPTkZJR19HUElPX01MX0lPSCkJKz0gbWxfaW9oX2dwaW8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2FkcDU1ODgtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2FkcDU1ODgtZ3Bpby5jCmluZGV4IDA4NzFmNzguLjMzZmM2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9hZHA1NTg4LWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vYWRwNTU4OC1ncGlvLmMKQEAgLTE0Niw5ICsxNDYsMTAgQEAKIAlyZXR1cm4gZGV2LT5pcnFfYmFzZSArIG9mZjsKIH0KIAotc3RhdGljIHZvaWQgYWRwNTU4OF9pcnFfYnVzX2xvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFkcDU1ODhfaXJxX2J1c19sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgYWRwNTU4OF9ncGlvICpkZXYgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBhZHA1NTg4X2dwaW8gKmRldiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCiAJbXV0ZXhfbG9jaygmZGV2LT5pcnFfbG9jayk7CiB9CiAKQEAgLTE2MCw5ICsxNjEsOSBAQAogICAqIGFuZCB1bmxvY2tzIHRoZSBidXMuCiAgICovCiAKLXN0YXRpYyB2b2lkIGFkcDU1ODhfaXJxX2J1c19zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYWRwNTU4OF9pcnFfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgYWRwNTU4OF9ncGlvICpkZXYgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBhZHA1NTg4X2dwaW8gKmRldiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8PSBBRFA1NTg4X0JBTksoQURQNTU4OF9NQVhHUElPKTsgaSsrKQpAQCAtMTc1LDMxICsxNzYsMzEgQEAKIAltdXRleF91bmxvY2soJmRldi0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBhZHA1NTg4X2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhZHA1NTg4X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgYWRwNTU4OF9ncGlvICpkZXYgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXVuc2lnbmVkIGdwaW8gPSBpcnEgLSBkZXYtPmlycV9iYXNlOworCXN0cnVjdCBhZHA1NTg4X2dwaW8gKmRldiA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIGdwaW8gPSBkLT5pcnEgLSBkZXYtPmlycV9iYXNlOwogCiAJZGV2LT5pcnFfbWFza1tBRFA1NTg4X0JBTksoZ3BpbyldICY9IH5BRFA1NTg4X0JJVChncGlvKTsKIH0KIAotc3RhdGljIHZvaWQgYWRwNTU4OF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhZHA1NTg4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBhZHA1NTg4X2dwaW8gKmRldiA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JdW5zaWduZWQgZ3BpbyA9IGlycSAtIGRldi0+aXJxX2Jhc2U7CisJc3RydWN0IGFkcDU1ODhfZ3BpbyAqZGV2ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgZ3BpbyA9IGQtPmlycSAtIGRldi0+aXJxX2Jhc2U7CiAKIAlkZXYtPmlycV9tYXNrW0FEUDU1ODhfQkFOSyhncGlvKV0gfD0gQURQNTU4OF9CSVQoZ3Bpbyk7CiB9CiAKLXN0YXRpYyBpbnQgYWRwNTU4OF9pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCitzdGF0aWMgaW50IGFkcDU1ODhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IGFkcDU1ODhfZ3BpbyAqZGV2ID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQl1aW50MTZfdCBncGlvID0gaXJxIC0gZGV2LT5pcnFfYmFzZTsKKwlzdHJ1Y3QgYWRwNTU4OF9ncGlvICpkZXYgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1aW50MTZfdCBncGlvID0gZC0+aXJxIC0gZGV2LT5pcnFfYmFzZTsKIAl1bnNpZ25lZCBiYW5rLCBiaXQ7CiAKIAlpZiAoKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpKSB7CiAJCWRldl9lcnIoJmRldi0+Y2xpZW50LT5kZXYsICJpcnEgJWQ6IHVuc3VwcG9ydGVkIHR5cGUgJWRcbiIsCi0JCQlpcnEsIHR5cGUpOworCQkJZC0+aXJxLCB0eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjIsMTEgKzIyMywxMSBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFkcDU1ODhfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCQk9ICJhZHA1NTg4IiwKLQkubWFzawkJCT0gYWRwNTU4OF9pcnFfbWFzaywKLQkudW5tYXNrCQkJPSBhZHA1NTg4X2lycV91bm1hc2ssCi0JLmJ1c19sb2NrCQk9IGFkcDU1ODhfaXJxX2J1c19sb2NrLAotCS5idXNfc3luY191bmxvY2sJPSBhZHA1NTg4X2lycV9idXNfc3luY191bmxvY2ssCi0JLnNldF90eXBlCQk9IGFkcDU1ODhfaXJxX3NldF90eXBlLAorCS5pcnFfbWFzawkJPSBhZHA1NTg4X2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCQk9IGFkcDU1ODhfaXJxX3VubWFzaywKKwkuaXJxX2J1c19sb2NrCQk9IGFkcDU1ODhfaXJxX2J1c19sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gYWRwNTU4OF9pcnFfYnVzX3N5bmNfdW5sb2NrLAorCS5pcnFfc2V0X3R5cGUJCT0gYWRwNTU4OF9pcnFfc2V0X3R5cGUsCiB9OwogCiBzdGF0aWMgaW50IGFkcDU1ODhfZ3Bpb19yZWFkX2ludHN0YXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKmJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9jczU1MzUtZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2NzNTUzNS1ncGlvLmMKaW5kZXggZDNlNTVhMC4uMGQwNWVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2NzNTUzNS1ncGlvLmMKKysrIGIvZHJpdmVycy9ncGlvL2NzNTUzNS1ncGlvLmMKQEAgLTExLDEzICsxMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY3M1NTM1Lmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJjczU1MzUtZ3BpbyIKLSNkZWZpbmUgR1BJT19CQVIgMQogCiAvKgogICogU29tZSBHUElPIHBpbnMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CiAJcmVzb3VyY2Vfc2l6ZV90IGJhc2U7CiAKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXNwaW5sb2NrX3QgbG9jazsKIH0gY3M1NTM1X2dwaW9fY2hpcDsKIApAQCAtMTQ0LDYgKzE0NCw1NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3M1NTM1X2dwaW9faXNzZXQpOwogCitpbnQgY3M1NTM1X2dwaW9fc2V0X2lycSh1bnNpZ25lZCBncm91cCwgdW5zaWduZWQgaXJxKQoreworCXVpbnQzMl90IGxvLCBoaTsKKworCWlmIChncm91cCA+IDcgfHwgaXJxID4gMTUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmRtc3IoTVNSX1BJQ19aU0VMX0hJR0gsIGxvLCBoaSk7CisKKwlsbyAmPSB+KDB4RiA8PCAoZ3JvdXAgKiA0KSk7CisJbG8gfD0gKGlycSAmIDB4RikgPDwgKGdyb3VwICogNCk7CisKKwl3cm1zcihNU1JfUElDX1pTRUxfSElHSCwgbG8sIGhpKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNzNTUzNV9ncGlvX3NldF9pcnEpOworCit2b2lkIGNzNTUzNV9ncGlvX3NldHVwX2V2ZW50KHVuc2lnbmVkIG9mZnNldCwgaW50IHBhaXIsIGludCBwbWUpCit7CisJc3RydWN0IGNzNTUzNV9ncGlvX2NoaXAgKmNoaXAgPSAmY3M1NTM1X2dwaW9fY2hpcDsKKwl1aW50MzJfdCBzaGlmdCA9IChvZmZzZXQgJSA4KSAqIDQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50MzJfdCB2YWw7CisKKwlpZiAob2Zmc2V0ID49IDI0KQorCQlvZmZzZXQgPSBHUElPX01BUF9XOworCWVsc2UgaWYgKG9mZnNldCA+PSAxNikKKwkJb2Zmc2V0ID0gR1BJT19NQVBfWjsKKwllbHNlIGlmIChvZmZzZXQgPj0gOCkKKwkJb2Zmc2V0ID0gR1BJT19NQVBfWTsKKwllbHNlCisJCW9mZnNldCA9IEdQSU9fTUFQX1g7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCXZhbCA9IGlubChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKKworCS8qIENsZWFyIHdoYXRldmVyIHdhcyB0aGVyZSBiZWZvcmUgKi8KKwl2YWwgJj0gfigweEYgPDwgc2hpZnQpOworCisJLyogU2V0IHRoZSBuZXcgdmFsdWUgKi8KKwl2YWwgfD0gKChwYWlyICYgNykgPDwgc2hpZnQpOworCisJLyogU2V0IHRoZSBQTUUgYml0IGlmIHRoaXMgaXMgYSBQTUUgZXZlbnQgKi8KKwlpZiAocG1lKQorCQl2YWwgfD0gKDEgPDwgKHNoaWZ0ICsgMykpOworCisJb3V0bCh2YWwsIGNoaXAtPmJhc2UgKyBvZmZzZXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNzNTUzNV9ncGlvX3NldHVwX2V2ZW50KTsKKwogLyoKICAqIEdlbmVyaWMgZ3Bpb19jaGlwIEFQSSBzdXBwb3J0LgogICovCkBAIC0yNDksMTAgKzMwMCwxMCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBjczU1MzVfZ3Bpb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNTUzNV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyID0gLUVJTzsKIAl1bG9uZyBtYXNrX29yaWcgPSBtYXNrOwogCiAJLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGdldCB0aGUgR1BJTyBiYXNlIGFkZHJlc3M7IG9uZSBpcyBieQpAQCAtMjYyLDI1ICszMTMsMjMgQEAKIAkgKiBpdCB0dXJucyBvdXQgdG8gYmUgdW5yZWxpYWJsZSBpbiB0aGUgZmFjZSBvZiBjcmFwcHkgQklPU2VzLCB3ZQogCSAqIGNhbiBhbHdheXMgZ28gYmFjayB0byB1c2luZyBNU1JzLi4gKi8KIAotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlX2lvKHBkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZW5hYmxlIGRldmljZSBJT1xuIik7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGZldGNoIGRldmljZSByZXNvdXJjZSBpbmZvXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBHUElPX0JBUiwgRFJWX05BTUUpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgUENJIEJBUiAjJWRcbiIsIEdQSU9fQkFSKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVxdWVzdCByZWdpb25cbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogc2V0IHVwIHRoZSBkcml2ZXItc3BlY2lmaWMgc3RydWN0ICovCi0JY3M1NTM1X2dwaW9fY2hpcC5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEdQSU9fQkFSKTsKKwljczU1MzVfZ3Bpb19jaGlwLmJhc2UgPSByZXMtPnN0YXJ0OwogCWNzNTUzNV9ncGlvX2NoaXAucGRldiA9IHBkZXY7CiAJc3Bpbl9sb2NrX2luaXQoJmNzNTUzNV9ncGlvX2NoaXAubG9jayk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiYWxsb2NhdGVkIFBDSSBCQVIgIyVkOiBiYXNlIDB4JWxseFxuIiwgR1BJT19CQVIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKSBjczU1MzVfZ3Bpb19jaGlwLmJhc2UpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZXNlcnZlZCByZXNvdXJjZSByZWdpb24gJXBSXG4iLCByZXMpOwogCiAJLyogbWFzayBvdXQgcmVzZXJ2ZWQgcGlucyAqLwogCW1hc2sgJj0gMHgxRjdGRkZGRjsKQEAgLTI5OCw3OCArMzQ3LDQ5IEBACiAJaWYgKGVycikKIAkJZ290byByZWxlYXNlX3JlZ2lvbjsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsIERSVl9OQU1FICI6IEdQSU8gc3VwcG9ydCBzdWNjZXNzZnVsbHkgbG9hZGVkLlxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkdQSU8gc3VwcG9ydCBzdWNjZXNzZnVsbHkgbG9hZGVkLlxuIik7CiAJcmV0dXJuIDA7CiAKIHJlbGVhc2VfcmVnaW9uOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBHUElPX0JBUik7CisJcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIGRvbmU6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGNzNTUzNV9ncGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGNzNTUzNV9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgZXJyOwogCiAJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjczU1MzVfZ3Bpb19jaGlwLmNoaXApOwogCWlmIChlcnIpIHsKIAkJLyogdWhoPyAqLwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVtb3ZlIGdwaW9fY2hpcD9cbiIpOworCQlyZXR1cm4gZXJyOwogCX0KLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgR1BJT19CQVIpOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlyZWxlYXNlX3JlZ2lvbihyLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyKSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczU1MzVfZ3Bpb19wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfQ1M1NTM1X0lTQSkgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EpIH0sCi0JeyAwLCB9LAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3M1NTM1X2dwaW9fZHJ2ID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gY3M1NTM1X2dwaW9fcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNzNTUzNV9ncGlvX3JlbW92ZSksCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNTUzNV9ncGlvX3BjaV90YmwpOwotCi0vKgotICogV2UgY2FuJ3QgdXNlIHRoZSBzdGFuZGFyZCBQQ0kgZHJpdmVyIHJlZ2lzdHJhdGlvbiBzdHVmZiBoZXJlLCBzaW5jZQotICogdGhhdCBhbGxvd3Mgb25seSBvbmUgZHJpdmVyIHRvIGJpbmQgdG8gZWFjaCBQQ0kgZGV2aWNlIChhbmQgd2Ugd2FudAotICogbXVsdGlwbGUgZHJpdmVycyB0byBiZSBhYmxlIHRvIGJpbmQgdG8gdGhlIGRldmljZSkuICBJbnN0ZWFkLCBtYW51YWxseQotICogc2NhbiBmb3IgdGhlIFBDSSBkZXZpY2UsIHJlcXVlc3QgYSBzaW5nbGUgcmVnaW9uLCBhbmQga2VlcCB0cmFjayBvZiB0aGUKLSAqIGRldmljZXMgdGhhdCB3ZSdyZSB1c2luZy4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBjczU1MzVfZ3Bpb19zY2FuX3BjaSh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCWludCBlcnIgPSAtRU5PREVWOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3M1NTM1X2dwaW9fcGNpX3RibCk7IGkrKykgewotCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoY3M1NTM1X2dwaW9fcGNpX3RibFtpXS52ZW5kb3IsCi0JCQkJY3M1NTM1X2dwaW9fcGNpX3RibFtpXS5kZXZpY2UsIE5VTEwpOwotCQlpZiAocGRldikgewotCQkJZXJyID0gY3M1NTM1X2dwaW9fcHJvYmUocGRldiwgJmNzNTUzNV9ncGlvX3BjaV90YmxbaV0pOwotCQkJaWYgKGVycikKLQkJCQlwY2lfZGV2X3B1dChwZGV2KTsKLQotCQkJLyogd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIENTNTUzNS82IHNvdXRoYnJpZGdlICovCi0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjczU1MzVfZ3Bpb19mcmVlX3BjaSh2b2lkKQotewotCWNzNTUzNV9ncGlvX3JlbW92ZShjczU1MzVfZ3Bpb19jaGlwLnBkZXYpOwotCXBjaV9kZXZfcHV0KGNzNTUzNV9ncGlvX2NoaXAucGRldik7Ci19CiAKIHN0YXRpYyBpbnQgX19pbml0IGNzNTUzNV9ncGlvX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gY3M1NTM1X2dwaW9fc2Nhbl9wY2koKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjczU1MzVfZ3Bpb19kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY3M1NTM1X2dwaW9fZXhpdCh2b2lkKQogewotCWNzNTUzNV9ncGlvX2ZyZWVfcGNpKCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNzNTUzNV9ncGlvX2Rydik7CiB9CiAKIG1vZHVsZV9pbml0KGNzNTUzNV9ncGlvX2luaXQpOwpAQCAtMzc4LDMgKzM5OCw0IEBACiBNT0RVTEVfQVVUSE9SKCJBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQU1EIENTNTUzNS9DUzU1MzYgR1BJTyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2xhbmd3ZWxsX2dwaW8uYwppbmRleCA2NGRiOWRjLi5kODFjYzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vbGFuZ3dlbGxfZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby9sYW5nd2VsbF9ncGlvLmMKQEAgLTEzNCwxMCArMTM0LDEwIEBACiAJcmV0dXJuIGxudy0+aXJxX2Jhc2UgKyBvZmZzZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbG53X2lycV90eXBlKHVuc2lnbmVkIGlycSwgdW5zaWduZWQgdHlwZSkKK3N0YXRpYyBpbnQgbG53X2lycV90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgdHlwZSkKIHsKLQlzdHJ1Y3QgbG53X2dwaW8gKmxudyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JdTMyIGdwaW8gPSBpcnEgLSBsbnctPmlycV9iYXNlOworCXN0cnVjdCBsbndfZ3BpbyAqbG53ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIGdwaW8gPSBkLT5pcnEgLSBsbnctPmlycV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbHVlOwogCXZvaWQgX19pb21lbSAqZ3JlciA9IGdwaW9fcmVnKCZsbnctPmNoaXAsIGdwaW8sIEdSRVIpOwpAQCAtMTYyLDE5ICsxNjIsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbG53X2lycV91bm1hc2sodW5zaWduZWQgaXJxKQorc3RhdGljIHZvaWQgbG53X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewogfQogCi1zdGF0aWMgdm9pZCBsbndfaXJxX21hc2sodW5zaWduZWQgaXJxKQorc3RhdGljIHZvaWQgbG53X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBsbndfaXJxY2hpcCA9IHsKIAkubmFtZQkJPSAiTE5XLUdQSU8iLAotCS5tYXNrCQk9IGxud19pcnFfbWFzaywKLQkudW5tYXNrCQk9IGxud19pcnFfdW5tYXNrLAotCS5zZXRfdHlwZQk9IGxud19pcnFfdHlwZSwKKwkuaXJxX21hc2sJPSBsbndfaXJxX21hc2ssCisJLmlycV91bm1hc2sJPSBsbndfaXJxX3VubWFzaywKKwkuaXJxX3NldF90eXBlCT0gbG53X2lycV90eXBlLAogfTsKIAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGxud19ncGlvX2lkcykgPSB7ICAgLyogcGluIG51bWJlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21heDczMnguYyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzJ4LmMKaW5kZXggOWNhZDYwZi4uOWUxZDAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL21heDczMnguYworKysgYi9kcml2ZXJzL2dwaW8vbWF4NzMyeC5jCkBAIC0zMjcsNDAgKzMyNyw0MCBAQAogCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZjsKIH0KIAotc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCi0JY2hpcC0+aXJxX21hc2tfY3VyICY9IH4oMSA8PCAoaXJxIC0gY2hpcC0+aXJxX2Jhc2UpKTsKKwljaGlwLT5pcnFfbWFza19jdXIgJj0gfigxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSkpOwogfQogCi1zdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIG1heDczMnhfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCi0JY2hpcC0+aXJxX21hc2tfY3VyIHw9IDEgPDwgKGlycSAtIGNoaXAtPmlycV9iYXNlKTsKKwljaGlwLT5pcnFfbWFza19jdXIgfD0gMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpOwogfQogCi1zdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV9idXNfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPmlycV9sb2NrKTsKIAljaGlwLT5pcnFfbWFza19jdXIgPSBjaGlwLT5pcnFfbWFzazsKIH0KIAotc3RhdGljIHZvaWQgbWF4NzMyeF9pcnFfYnVzX3N5bmNfdW5sb2NrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXg3MzJ4X2lycV9idXNfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAogCW1heDczMnhfaXJxX3VwZGF0ZV9tYXNrKGNoaXApOwogCW11dGV4X3VubG9jaygmY2hpcC0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgaW50IG1heDczMnhfaXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQorc3RhdGljIGludCBtYXg3MzJ4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQogewotCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXVpbnQxNl90IG9mZiA9IGlycSAtIGNoaXAtPmlycV9iYXNlOworCXN0cnVjdCBtYXg3MzJ4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1aW50MTZfdCBvZmYgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKIAl1aW50MTZfdCBtYXNrID0gMSA8PCBvZmY7CiAKIAlpZiAoIShtYXNrICYgY2hpcC0+ZGlyX2lucHV0KSkgewpAQCAtMzcxLDcgKzM3MSw3IEBACiAKIAlpZiAoISh0eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSkgewogCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImlycSAlZDogdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKLQkJCWlycSwgdHlwZSk7CisJCQlkLT5pcnEsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM5MCwxMSArMzkwLDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbWF4NzMyeF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJCT0gIm1heDczMngiLAotCS5tYXNrCQkJPSBtYXg3MzJ4X2lycV9tYXNrLAotCS51bm1hc2sJCQk9IG1heDczMnhfaXJxX3VubWFzaywKLQkuYnVzX2xvY2sJCT0gbWF4NzMyeF9pcnFfYnVzX2xvY2ssCi0JLmJ1c19zeW5jX3VubG9jawk9IG1heDczMnhfaXJxX2J1c19zeW5jX3VubG9jaywKLQkuc2V0X3R5cGUJCT0gbWF4NzMyeF9pcnFfc2V0X3R5cGUsCisJLmlycV9tYXNrCQk9IG1heDczMnhfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gbWF4NzMyeF9pcnFfdW5tYXNrLAorCS5pcnFfYnVzX2xvY2sJCT0gbWF4NzMyeF9pcnFfYnVzX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSBtYXg3MzJ4X2lycV9idXNfc3luY191bmxvY2ssCisJLmlycV9zZXRfdHlwZQkJPSBtYXg3MzJ4X2lycV9zZXRfdHlwZSwKIH07CiAKIHN0YXRpYyB1aW50OF90IG1heDczMnhfaXJxX3BlbmRpbmcoc3RydWN0IG1heDczMnhfY2hpcCAqY2hpcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tbF9pb2hfZ3Bpby5jIGIvZHJpdmVycy9ncGlvL21sX2lvaF9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhZDhlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9tbF9pb2hfZ3Bpby5jCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE9LSSBTRU1JQ09ORFVDVE9SIENvLiwgTFRELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ST0hNICAgICAgICAgICAgIDB4MTBEQgorCitzdHJ1Y3QgaW9oX3JlZ19jb21uIHsKKwl1MzIJaWVuOworCXUzMglpc3RhdHVzOworCXUzMglpZGlzcDsKKwl1MzIJaWNscjsKKwl1MzIJaW1hc2s7CisJdTMyCWltYXNrY2xyOworCXUzMglwbzsKKwl1MzIJcGk7CisJdTMyCXBtOworCXUzMglpbV8wOworCXUzMglpbV8xOworCXUzMglyZXNlcnZlZDsKK307CisKK3N0cnVjdCBpb2hfcmVncyB7CisJc3RydWN0IGlvaF9yZWdfY29tbiByZWdzWzhdOworCXUzMiByZXNlcnZlMVsxNl07CisJdTMyIGlvaF9zZWxfcmVnWzRdOworCXUzMiByZXNlcnZlMlsxMV07CisJdTMyIHNyc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSAtIFRoZSByZWdpc3RlciBzdG9yZSBkYXRhLgorICogQHBvX3JlZzoJVG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIuCisgKiBAcG1fcmVnOglUbyBzdG9yZSBjb250ZW50cyBvZiBQTSByZWdpc3Rlci4KKyAqLworc3RydWN0IGlvaF9ncGlvX3JlZ19kYXRhIHsKKwl1MzIgcG9fcmVnOworCXUzMiBwbV9yZWc7Cit9OworCisvKioKKyAqIHN0cnVjdCBpb2hfZ3BpbyAtIEdQSU8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBiYXNlOgkJCVBDSSBiYXNlIGFkZHJlc3Mgb2YgTWVtb3J5IG1hcHBlZCBJL08gcmVnaXN0ZXIuCisgKiBAcmVnOgkJCU1lbW9yeSBtYXBwZWQgSU9IIEdQSU8gcmVnaXN0ZXIgbGlzdC4KKyAqIEBkZXY6CQkJUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlLgorICogQGdwaW86CQkJRGF0YSBmb3IgR1BJTyBpbmZyYXN0cnVjdHVyZS4KKyAqIEBpb2hfZ3Bpb19yZWc6CQlNZW1vcnkgbWFwcGVkIFJlZ2lzdGVyIGRhdGEgaXMgc2F2ZWQgaGVyZQorICoJCQkJd2hlbiBzdXNwZW5kLgorICogQGNoOgkJCQlJbmRpY2F0ZSBHUElPIGNoYW5uZWwKKyAqLworc3RydWN0IGlvaF9ncGlvIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGlvaF9yZWdzIF9faW9tZW0gKnJlZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGdwaW9fY2hpcCBncGlvOworCXN0cnVjdCBpb2hfZ3Bpb19yZWdfZGF0YSBpb2hfZ3Bpb19yZWc7CisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IGNoOworfTsKKworc3RhdGljIGNvbnN0IGludCBudW1fcG9ydHNbXSA9IHs2LCAxMiwgMTYsIDE2LCAxNSwgMTYsIDE2LCAxMn07CisKK3N0YXRpYyB2b2lkIGlvaF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvLCB1bnNpZ25lZCBuciwgaW50IHZhbCkKK3sKKwl1MzIgcmVnX3ZhbDsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPQljb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IGlvaF9ncGlvLCBncGlvKTsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXJlZ192YWwgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7CisJaWYgKHZhbCkKKwkJcmVnX3ZhbCB8PSAoMSA8PCBucik7CisJZWxzZQorCQlyZWdfdmFsICY9IH4oMSA8PCBucik7CisKKwlpb3dyaXRlMzIocmVnX3ZhbCwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaW9oX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOworCisJcmV0dXJuIGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBpKSAmICgxIDw8IG5yKTsKK30KKworc3RhdGljIGludCBpb2hfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yLAorCQkJCSAgICAgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPQljb250YWluZXJfb2YoZ3Bpbywgc3RydWN0IGlvaF9ncGlvLCBncGlvKTsKKwl1MzIgcG07CisJdTMyIHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlwbSA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKSAmCisJCQkJCSgoMSA8PCBudW1fcG9ydHNbY2hpcC0+Y2hdKSAtIDEpOworCXBtIHw9ICgxIDw8IG5yKTsKKwlpb3dyaXRlMzIocG0sICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKKworCXJlZ192YWwgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbyk7CisJaWYgKHZhbCkKKwkJcmVnX3ZhbCB8PSAoMSA8PCBucik7CisJZWxzZQorCQlyZWdfdmFsICY9IH4oMSA8PCBucik7CisKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9oX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdwaW8sIHVuc2lnbmVkIG5yKQoreworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9CWNvbnRhaW5lcl9vZihncGlvLCBzdHJ1Y3QgaW9oX2dwaW8sIGdwaW8pOworCXUzMiBwbTsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCXBtID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pICYKKwkJCQkoKDEgPDwgbnVtX3BvcnRzW2NoaXAtPmNoXSkgLSAxKTsKKwlwbSAmPSB+KDEgPDwgbnIpOworCWlvd3JpdGUzMihwbSwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG0pOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNhdmUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBpb2hfZ3Bpb19zYXZlX3JlZ19jb25mKHN0cnVjdCBpb2hfZ3BpbyAqY2hpcCkKK3sKKwljaGlwLT5pb2hfZ3Bpb19yZWcucG9fcmVnID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCWNoaXAtPmlvaF9ncGlvX3JlZy5wbV9yZWcgPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5wbSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSByZWdpc3RlciBjb25maWd1cmF0aW9uIG9mIHRoZSBHUElPIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgaW9oX2dwaW9fcmVzdG9yZV9yZWdfY29uZihzdHJ1Y3QgaW9oX2dwaW8gKmNoaXApCit7CisJLyogdG8gc3RvcmUgY29udGVudHMgb2YgUE8gcmVnaXN0ZXIgKi8KKwlpb3dyaXRlMzIoY2hpcC0+aW9oX2dwaW9fcmVnLnBvX3JlZywgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0ucG8pOworCS8qIHRvIHN0b3JlIGNvbnRlbnRzIG9mIFBNIHJlZ2lzdGVyICovCisJaW93cml0ZTMyKGNoaXAtPmlvaF9ncGlvX3JlZy5wbV9yZWcsICZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLnBtKTsKK30KKworc3RhdGljIHZvaWQgaW9oX2dwaW9fc2V0dXAoc3RydWN0IGlvaF9ncGlvICpjaGlwLCBpbnQgbnVtX3BvcnQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ3BpbyA9ICZjaGlwLT5ncGlvOworCisJZ3Bpby0+bGFiZWwgPSBkZXZfbmFtZShjaGlwLT5kZXYpOworCWdwaW8tPm93bmVyID0gVEhJU19NT0RVTEU7CisJZ3Bpby0+ZGlyZWN0aW9uX2lucHV0ID0gaW9oX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdwaW8tPmdldCA9IGlvaF9ncGlvX2dldDsKKwlncGlvLT5kaXJlY3Rpb25fb3V0cHV0ID0gaW9oX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlncGlvLT5zZXQgPSBpb2hfZ3Bpb19zZXQ7CisJZ3Bpby0+ZGJnX3Nob3cgPSBOVUxMOworCWdwaW8tPmJhc2UgPSAtMTsKKwlncGlvLT5uZ3BpbyA9IG51bV9wb3J0OworCWdwaW8tPmNhbl9zbGVlcCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlvaF9ncGlvX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXA7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfcGNpX2VuYWJsZTsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIEtCVUlMRF9NT0ROQU1FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbGVkLSVkIiwgcmV0KTsKKwkJZ290byBlcnJfcmVxdWVzdF9yZWdpb25zOworCX0KKworCWJhc2UgPSBwY2lfaW9tYXAocGRldiwgMSwgMCk7CisJaWYgKGJhc2UgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IHBjaV9pb21hcCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvbWFwOworCX0KKworCWNoaXBfc2F2ZSA9IGt6YWxsb2Moc2l6ZW9mKCpjaGlwKSAqIDgsIEdGUF9LRVJORUwpOworCWlmIChjaGlwX3NhdmUgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyA6IGt6YWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9remFsbG9jOworCX0KKworCWNoaXAgPSBjaGlwX3NhdmU7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgY2hpcCsrKSB7CisJCWNoaXAtPmRldiA9ICZwZGV2LT5kZXY7CisJCWNoaXAtPmJhc2UgPSBiYXNlOworCQljaGlwLT5yZWcgPSBjaGlwLT5iYXNlOworCQljaGlwLT5jaCA9IGk7CisJCW11dGV4X2luaXQoJmNoaXAtPmxvY2spOworCQlpb2hfZ3Bpb19zZXR1cChjaGlwLCBudW1fcG9ydHNbaV0pOworCQlyZXQgPSBncGlvY2hpcF9hZGQoJmNoaXAtPmdwaW8pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJT0ggZ3BpbzogRmFpbGVkIHRvIHJlZ2lzdGVyIEdQSU9cbiIpOworCQkJZ290byBlcnJfZ3Bpb2NoaXBfYWRkOworCQl9CisJfQorCisJY2hpcCA9IGNoaXBfc2F2ZTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2hpcCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2dwaW9jaGlwX2FkZDoKKwlmb3IgKDsgaSAhPSAwOyBpLS0pIHsKKwkJY2hpcC0tOworCQlyZXQgPSBncGlvY2hpcF9yZW1vdmUoJmNoaXAtPmdwaW8pOworCQlpZiAocmV0KQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIGdwaW9jaGlwX3JlbW92ZSglZClcbiIsIGkpOworCX0KKwlrZnJlZShjaGlwX3NhdmUpOworCitlcnJfa3phbGxvYzoKKwlwY2lfaW91bm1hcChwZGV2LCBiYXNlKTsKKworZXJyX2lvbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9yZXF1ZXN0X3JlZ2lvbnM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCitlcnJfcGNpX2VuYWJsZToKKworCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIEZhaWxlZCByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaW9oX2dwaW9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBlcnI7CisJaW50IGk7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqY2hpcF9zYXZlOworCisJY2hpcF9zYXZlID0gY2hpcDsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGlwKyspIHsKKwkJZXJyID0gZ3Bpb2NoaXBfcmVtb3ZlKCZjaGlwLT5ncGlvKTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBncGlvY2hpcF9yZW1vdmVcbiIpOworCX0KKworCWNoaXAgPSBjaGlwX3NhdmU7CisJcGNpX2lvdW5tYXAocGRldiwgY2hpcC0+YmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJa2ZyZWUoY2hpcCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaW9oX2dwaW9fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXMzMiByZXQ7CisJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaW9oX2dwaW9fc2F2ZV9yZWdfY29uZihjaGlwKTsKKwlpb2hfZ3Bpb19yZXN0b3JlX3JlZ19jb25mKGNoaXApOworCisJcmV0ID0gcGNpX3NhdmVfc3RhdGUocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfc2F2ZV9zdGF0ZSBGYWlsZWQtJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcmV0ID0gcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMSk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV93YWtlIEZhaWxlZCAtJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb2hfZ3Bpb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJczMyIHJldDsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXQgPSBwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QwLCAwKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9lbmFibGVfZGV2aWNlIEZhaWxlZC0lZCAiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlvd3JpdGUzMigweDAxLCAmY2hpcC0+cmVnLT5zcnN0KTsKKwlpb3dyaXRlMzIoMHgwMCwgJmNoaXAtPnJlZy0+c3JzdCk7CisJaW9oX2dwaW9fcmVzdG9yZV9yZWdfY29uZihjaGlwKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaW9oX2dwaW9fc3VzcGVuZCBOVUxMCisjZGVmaW5lIGlvaF9ncGlvX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlvaF9ncGlvX3BjaWRldl9pZCkgPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUk9ITSwgMHg4MDJFKSB9LAorCXsgMCwgfQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlvaF9ncGlvX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtbF9pb2hfZ3BpbyIsCisJLmlkX3RhYmxlID0gaW9oX2dwaW9fcGNpZGV2X2lkLAorCS5wcm9iZSA9IGlvaF9ncGlvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpb2hfZ3Bpb19yZW1vdmUpLAorCS5zdXNwZW5kID0gaW9oX2dwaW9fc3VzcGVuZCwKKwkucmVzdW1lID0gaW9oX2dwaW9fcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpb2hfZ3Bpb19wY2lfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpb2hfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaW9oX2dwaW9fcGNpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaW9oX2dwaW9fcGNpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlvaF9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChpb2hfZ3Bpb19wY2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT0tJIFNFTUlDT05EVUNUT1IgTUwtSU9IIHNlcmllcyBHUElPIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKaW5kZXggNTAxODY2Ni4uYTI2MTk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3BjYTk1M3guYworKysgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCkBAIC0yMjgsMzAgKzIyOCwzMCBAQAogCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZjsKIH0KIAotc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCi0JY2hpcC0+aXJxX21hc2sgJj0gfigxIDw8IChpcnEgLSBjaGlwLT5pcnFfYmFzZSkpOworCWNoaXAtPmlycV9tYXNrICY9IH4oMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpKTsKIH0KIAotc3RhdGljIHZvaWQgcGNhOTUzeF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBwY2E5NTN4X2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAotCWNoaXAtPmlycV9tYXNrIHw9IDEgPDwgKGlycSAtIGNoaXAtPmlycV9iYXNlKTsKKwljaGlwLT5pcnFfbWFzayB8PSAxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX2J1c19sb2NrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBwY2E5NTN4X2lycV9idXNfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBwY2E5NTN4X2lycV9idXNfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHBjYTk1M3hfaXJxX2J1c19zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXVpbnQxNl90IG5ld19pcnFzOwogCXVpbnQxNl90IGxldmVsOwogCkBAIC0yNjgsMTUgKzI2OCwxNSBAQAogCW11dGV4X3VubG9jaygmY2hpcC0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgaW50IHBjYTk1M3hfaXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQorc3RhdGljIGludCBwY2E5NTN4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQogewotCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXVpbnQxNl90IGxldmVsID0gaXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVpbnQxNl90IGxldmVsID0gZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2U7CiAJdWludDE2X3QgbWFzayA9IDEgPDwgbGV2ZWw7CiAKIAlpZiAoISh0eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSkgewogCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImlycSAlZDogdW5zdXBwb3J0ZWQgdHlwZSAlZFxuIiwKLQkJCWlycSwgdHlwZSk7CisJCQlkLT5pcnEsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI5NSwxMSArMjk1LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGNhOTUzeF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJCT0gInBjYTk1M3giLAotCS5tYXNrCQkJPSBwY2E5NTN4X2lycV9tYXNrLAotCS51bm1hc2sJCQk9IHBjYTk1M3hfaXJxX3VubWFzaywKLQkuYnVzX2xvY2sJCT0gcGNhOTUzeF9pcnFfYnVzX2xvY2ssCi0JLmJ1c19zeW5jX3VubG9jawk9IHBjYTk1M3hfaXJxX2J1c19zeW5jX3VubG9jaywKLQkuc2V0X3R5cGUJCT0gcGNhOTUzeF9pcnFfc2V0X3R5cGUsCisJLmlycV9tYXNrCQk9IHBjYTk1M3hfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gcGNhOTUzeF9pcnFfdW5tYXNrLAorCS5pcnFfYnVzX2xvY2sJCT0gcGNhOTUzeF9pcnFfYnVzX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSBwY2E5NTN4X2lycV9idXNfc3luY191bmxvY2ssCisJLmlycV9zZXRfdHlwZQkJPSBwY2E5NTN4X2lycV9zZXRfdHlwZSwKIH07CiAKIHN0YXRpYyB1aW50MTZfdCBwY2E5NTN4X2lycV9wZW5kaW5nKHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vcGwwNjEuYyBiL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCmluZGV4IDUwMDU5OTAuLjI5NzVkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9wbDA2MS5jCkBAIC0xMjksMTAgKzEyOSwxMCBAQAogLyoKICAqIFBMMDYxIEdQSU8gSVJRCiAgKi8KLXN0YXRpYyB2b2lkIHBsMDYxX2lycV9kaXNhYmxlKHVuc2lnbmVkIGlycSkKK3N0YXRpYyB2b2lkIHBsMDYxX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIGNoaXAtPmlycV9iYXNlOworCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IG9mZnNldCA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggZ3Bpb2llOwogCkBAIC0xNDMsMTAgKzE0MywxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmlycV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHBsMDYxX2lycV9lbmFibGUodW5zaWduZWQgaXJxKQorc3RhdGljIHZvaWQgcGwwNjFfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSBjaGlwLT5pcnFfYmFzZTsKKwlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IGdwaW9pZTsKIApAQCAtMTU3LDEwICsxNTcsMTAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5pcnFfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IHBsMDYxX2lycV90eXBlKHVuc2lnbmVkIGlycSwgdW5zaWduZWQgdHJpZ2dlcikKK3N0YXRpYyBpbnQgcGwwNjFfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0cmlnZ2VyKQogewotCXN0cnVjdCBwbDA2MV9ncGlvICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJc3RydWN0IHBsMDYxX2dwaW8gKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlpbnQgb2Zmc2V0ID0gZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBncGlvaXMsIGdwaW9pYmUsIGdwaW9pZXY7CiAKQEAgLTIwMyw5ICsyMDMsOSBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBsMDYxX2lycWNoaXAgPSB7CiAJLm5hbWUJCT0gIkdQSU8iLAotCS5lbmFibGUJCT0gcGwwNjFfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHBsMDYxX2lycV9kaXNhYmxlLAotCS5zZXRfdHlwZQk9IHBsMDYxX2lycV90eXBlLAorCS5pcnFfZW5hYmxlCT0gcGwwNjFfaXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJPSBwbDA2MV9pcnFfZGlzYWJsZSwKKwkuaXJxX3NldF90eXBlCT0gcGwwNjFfaXJxX3R5cGUsCiB9OwogCiBzdGF0aWMgdm9pZCBwbDA2MV9pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKQEAgLTIxNCw3ICsyMTQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3QgcGwwNjFfZ3BpbyAqY2hpcDsKIAotCWRlc2MtPmNoaXAtPmFjayhpcnEpOworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKIAlsaXN0X2Zvcl9lYWNoKHB0ciwgY2hpcF9saXN0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKIAkJaW50IG9mZnNldDsKQEAgLTIyOSw3ICsyMjksNyBAQAogCQlmb3JfZWFjaF9zZXRfYml0KG9mZnNldCwgJnBlbmRpbmcsIFBMMDYxX0dQSU9fTlIpCiAJCQlnZW5lcmljX2hhbmRsZV9pcnEocGwwNjFfdG9faXJxKCZjaGlwLT5nYywgb2Zmc2V0KSk7CiAJfQotCWRlc2MtPmNoaXAtPnVubWFzayhpcnEpOworCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV91bm1hc2soJmRlc2MtPmlycV9kYXRhKTsKIH0KIAogc3RhdGljIGludCBwbDA2MV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmRldiwgc3RydWN0IGFtYmFfaWQgKmlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3N0bXBlLWdwaW8uYyBiL2RyaXZlcnMvZ3Bpby9zdG1wZS1ncGlvLmMKaW5kZXggN2M5ZTZhMC4uZWIyOTAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3N0bXBlLWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vc3RtcGUtZ3Bpby5jCkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCS5jYW5fc2xlZXAJCT0gMSwKIH07CiAKLXN0YXRpYyBpbnQgc3RtcGVfZ3Bpb19pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCitzdGF0aWMgaW50IHN0bXBlX2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSBzdG1wZV9ncGlvLT5pcnFfYmFzZTsKKwlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSBzdG1wZV9ncGlvLT5pcnFfYmFzZTsKIAlpbnQgcmVnb2Zmc2V0ID0gb2Zmc2V0IC8gODsKIAlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOwogCkBAIC0xNDUsMTYgKzE0NSwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzdG1wZV9ncGlvX2lycV9sb2NrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdG1wZV9ncGlvX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAogCW11dGV4X2xvY2soJnN0bXBlX2dwaW8tPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgc3RtcGVfZ3Bpb19pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHN0bXBlX2dwaW9faXJxX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJaW50IG51bV9iYW5rcyA9IERJVl9ST1VORF9VUChzdG1wZS0+bnVtX2dwaW9zLCA4KTsKIAlzdGF0aWMgY29uc3QgdTggcmVnbWFwW10gPSB7CkBAIC0xODAsMjAgKzE4MCwyMCBAQAogCW11dGV4X3VubG9jaygmc3RtcGVfZ3Bpby0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzdG1wZV9ncGlvX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdG1wZV9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIHN0bXBlX2dwaW8tPmlycV9iYXNlOworCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IG9mZnNldCA9IGQtPmlycSAtIHN0bXBlX2dwaW8tPmlycV9iYXNlOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwogCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CiAKIAlzdG1wZV9ncGlvLT5yZWdzW1JFR19JRV1bcmVnb2Zmc2V0XSAmPSB+bWFzazsKIH0KIAotc3RhdGljIHZvaWQgc3RtcGVfZ3Bpb19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdG1wZV9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gc3RtcGVfZ3Bpby0+aXJxX2Jhc2U7CisJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlpbnQgb2Zmc2V0ID0gZC0+aXJxIC0gc3RtcGVfZ3Bpby0+aXJxX2Jhc2U7CiAJaW50IHJlZ29mZnNldCA9IG9mZnNldCAvIDg7CiAJaW50IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKIApAQCAtMjAyLDExICsyMDIsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdG1wZV9ncGlvX2lycV9jaGlwID0gewogCS5uYW1lCQkJPSAic3RtcGUtZ3BpbyIsCi0JLmJ1c19sb2NrCQk9IHN0bXBlX2dwaW9faXJxX2xvY2ssCi0JLmJ1c19zeW5jX3VubG9jawk9IHN0bXBlX2dwaW9faXJxX3N5bmNfdW5sb2NrLAotCS5tYXNrCQkJPSBzdG1wZV9ncGlvX2lycV9tYXNrLAotCS51bm1hc2sJCQk9IHN0bXBlX2dwaW9faXJxX3VubWFzaywKLQkuc2V0X3R5cGUJCT0gc3RtcGVfZ3Bpb19pcnFfc2V0X3R5cGUsCisJLmlycV9idXNfbG9jawkJPSBzdG1wZV9ncGlvX2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gc3RtcGVfZ3Bpb19pcnFfc3luY191bmxvY2ssCisJLmlycV9tYXNrCQk9IHN0bXBlX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gc3RtcGVfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJCT0gc3RtcGVfZ3Bpb19pcnFfc2V0X3R5cGUsCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtcGVfZ3Bpb19pcnEoaW50IGlycSwgdm9pZCAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3N4MTUweC5jIGIvZHJpdmVycy9ncGlvL3N4MTUweC5jCmluZGV4IDgyMzU1OWEuLmU2MGJlMDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vc3gxNTB4LmMKKysrIGIvZHJpdmVycy9ncGlvL3N4MTUweC5jCkBAIC0zMDQsMzYgKzMwNCwzNiBAQAogCXJldHVybiBjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKIH0KIAotc3RhdGljIHZvaWQgc3gxNTB4X2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzeDE1MHhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCBpcnFfY2hpcCAqaWMgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGQpOwogCXN0cnVjdCBzeDE1MHhfY2hpcCAqY2hpcDsKIAl1bnNpZ25lZCBuOwogCiAJY2hpcCA9IGNvbnRhaW5lcl9vZihpYywgc3RydWN0IHN4MTUweF9jaGlwLCBpcnFfY2hpcCk7Ci0JbiA9IGlycSAtIGNoaXAtPmlycV9iYXNlOworCW4gPSBkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZTsKIAogCXN4MTUweF93cml0ZV9jZmcoY2hpcCwgbiwgMSwgY2hpcC0+ZGV2X2NmZy0+cmVnX2lycV9tYXNrLCAxKTsKIAlzeDE1MHhfd3JpdGVfY2ZnKGNoaXAsIG4sIDIsIGNoaXAtPmRldl9jZmctPnJlZ19zZW5zZSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN4MTUweF9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzeDE1MHhfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IGlycV9jaGlwICppYyA9IGdldF9pcnFfY2hpcChpcnEpOworCXN0cnVjdCBpcnFfY2hpcCAqaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZCk7CiAJc3RydWN0IHN4MTUweF9jaGlwICpjaGlwOwogCXVuc2lnbmVkIG47CiAKIAljaGlwID0gY29udGFpbmVyX29mKGljLCBzdHJ1Y3Qgc3gxNTB4X2NoaXAsIGlycV9jaGlwKTsKLQluID0gaXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJbiA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwogCiAJc3gxNTB4X3dyaXRlX2NmZyhjaGlwLCBuLCAxLCBjaGlwLT5kZXZfY2ZnLT5yZWdfaXJxX21hc2ssIDApOwogCXN4MTUweF93cml0ZV9jZmcoY2hpcCwgbiwgMiwgY2hpcC0+ZGV2X2NmZy0+cmVnX3NlbnNlLAogCQkJIGNoaXAtPmlycV9zZW5zZSA+PiAobiAqIDIpKTsKIH0KIAotc3RhdGljIGludCBzeDE1MHhfaXJxX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCitzdGF0aWMgaW50IHN4MTUweF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewotCXN0cnVjdCBpcnFfY2hpcCAqaWMgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGQpOwogCXN0cnVjdCBzeDE1MHhfY2hpcCAqY2hpcDsKIAl1bnNpZ25lZCBuLCB2YWwgPSAwOwogCkBAIC0zNDEsNyArMzQxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljaGlwID0gY29udGFpbmVyX29mKGljLCBzdHJ1Y3Qgc3gxNTB4X2NoaXAsIGlycV9jaGlwKTsKLQluID0gaXJxIC0gY2hpcC0+aXJxX2Jhc2U7CisJbiA9IGQtPmlycSAtIGNoaXAtPmlycV9iYXNlOwogCiAJaWYgKGZsb3dfdHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQogCQl2YWwgfD0gMHgxOwpAQCAtMzg2LDkgKzM4Niw5IEBACiAJcmV0dXJuIChuaGFuZGxlZCA+IDAgPyBJUlFfSEFORExFRCA6IElSUV9OT05FKTsKIH0KIAotc3RhdGljIHZvaWQgc3gxNTB4X2lycV9idXNfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgc3gxNTB4X2lycV9idXNfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IGlycV9jaGlwICppYyA9IGdldF9pcnFfY2hpcChpcnEpOworCXN0cnVjdCBpcnFfY2hpcCAqaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZCk7CiAJc3RydWN0IHN4MTUweF9jaGlwICpjaGlwOwogCiAJY2hpcCA9IGNvbnRhaW5lcl9vZihpYywgc3RydWN0IHN4MTUweF9jaGlwLCBpcnFfY2hpcCk7CkBAIC0zOTYsOSArMzk2LDkgQEAKIAltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgc3gxNTB4X2lycV9idXNfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHN4MTUweF9pcnFfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmljID0gZ2V0X2lycV9jaGlwKGlycSk7CisJc3RydWN0IGlycV9jaGlwICppYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkKTsKIAlzdHJ1Y3Qgc3gxNTB4X2NoaXAgKmNoaXA7CiAJdW5zaWduZWQgbjsKIApAQCAtNDM3LDE2ICs0MzcsMTYgQEAKIAlpZiAocGRhdGEtPm9zY2lvX2lzX2dwbykKIAkJKytjaGlwLT5ncGlvX2NoaXAubmdwaW87CiAKLQljaGlwLT5pcnFfY2hpcC5uYW1lICAgICAgICAgICAgPSBjbGllbnQtPm5hbWU7Ci0JY2hpcC0+aXJxX2NoaXAubWFzayAgICAgICAgICAgID0gc3gxNTB4X2lycV9tYXNrOwotCWNoaXAtPmlycV9jaGlwLnVubWFzayAgICAgICAgICA9IHN4MTUweF9pcnFfdW5tYXNrOwotCWNoaXAtPmlycV9jaGlwLnNldF90eXBlICAgICAgICA9IHN4MTUweF9pcnFfc2V0X3R5cGU7Ci0JY2hpcC0+aXJxX2NoaXAuYnVzX2xvY2sgICAgICAgID0gc3gxNTB4X2lycV9idXNfbG9jazsKLQljaGlwLT5pcnFfY2hpcC5idXNfc3luY191bmxvY2sgPSBzeDE1MHhfaXJxX2J1c19zeW5jX3VubG9jazsKLQljaGlwLT5pcnFfc3VtbWFyeSAgICAgICAgICAgICAgPSAtMTsKLQljaGlwLT5pcnFfYmFzZSAgICAgICAgICAgICAgICAgPSAtMTsKLQljaGlwLT5pcnFfc2Vuc2UgICAgICAgICAgICAgICAgPSAwOwotCWNoaXAtPmlycV9zZXRfdHlwZV9wZW5kaW5nICAgICA9IDA7CisJY2hpcC0+aXJxX2NoaXAubmFtZSAgICAgICAgICAgICAgICA9IGNsaWVudC0+bmFtZTsKKwljaGlwLT5pcnFfY2hpcC5pcnFfbWFzayAgICAgICAgICAgID0gc3gxNTB4X2lycV9tYXNrOworCWNoaXAtPmlycV9jaGlwLmlycV91bm1hc2sgICAgICAgICAgPSBzeDE1MHhfaXJxX3VubWFzazsKKwljaGlwLT5pcnFfY2hpcC5pcnFfc2V0X3R5cGUgICAgICAgID0gc3gxNTB4X2lycV9zZXRfdHlwZTsKKwljaGlwLT5pcnFfY2hpcC5pcnFfYnVzX2xvY2sgICAgICAgID0gc3gxNTB4X2lycV9idXNfbG9jazsKKwljaGlwLT5pcnFfY2hpcC5pcnFfYnVzX3N5bmNfdW5sb2NrID0gc3gxNTB4X2lycV9idXNfc3luY191bmxvY2s7CisJY2hpcC0+aXJxX3N1bW1hcnkgICAgICAgICAgICAgICAgICA9IC0xOworCWNoaXAtPmlycV9iYXNlICAgICAgICAgICAgICAgICAgICAgPSAtMTsKKwljaGlwLT5pcnFfc2Vuc2UgICAgICAgICAgICAgICAgICAgID0gMDsKKwljaGlwLT5pcnFfc2V0X3R5cGVfcGVuZGluZyAgICAgICAgID0gMDsKIH0KIAogc3RhdGljIGludCBzeDE1MHhfaW5pdF9pbyhzdHJ1Y3Qgc3gxNTB4X2NoaXAgKmNoaXAsIHU4IGJhc2UsIHUxNiBjZmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vdGMzNTg5eC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vdGMzNTg5eC1ncGlvLmMKaW5kZXggMTgwZDU4NC4uMjcyMDBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL3RjMzU4OXgtZ3Bpby5jCisrKyBiL2RyaXZlcnMvZ3Bpby90YzM1ODl4LWdwaW8uYwpAQCAtMTEwLDEwICsxMTAsMTAgQEAKIAkuY2FuX3NsZWVwCQk9IDEsCiB9OwogCi1zdGF0aWMgaW50IHRjMzU4OXhfZ3Bpb19pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCitzdGF0aWMgaW50IHRjMzU4OXhfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSB0YzM1ODl4X2dwaW8tPmlycV9iYXNlOworCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSB0YzM1ODl4X2dwaW8tPmlycV9iYXNlOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwogCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CiAKQEAgLTEzNywxNiArMTM3LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdGMzNTg5eF9ncGlvX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCiAJbXV0ZXhfbG9jaygmdGMzNTg5eF9ncGlvLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkKQogewotCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CiAJc3RhdGljIGNvbnN0IHU4IHJlZ21hcFtdID0gewogCQlbUkVHX0lCRV0JPSBUQzM1ODl4X0dQSU9JQkUwLApAQCAtMTcyLDIwICsxNzIsMjAgQEAKIAltdXRleF91bmxvY2soJnRjMzU4OXhfZ3Bpby0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCB0YzM1ODl4X2dwaW9faXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gdGMzNTg5eF9ncGlvLT5pcnFfYmFzZTsKKwlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlpbnQgb2Zmc2V0ID0gZC0+aXJxIC0gdGMzNTg5eF9ncGlvLT5pcnFfYmFzZTsKIAlpbnQgcmVnb2Zmc2V0ID0gb2Zmc2V0IC8gODsKIAlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOwogCiAJdGMzNTg5eF9ncGlvLT5yZWdzW1JFR19JRV1bcmVnb2Zmc2V0XSAmPSB+bWFzazsKIH0KIAotc3RhdGljIHZvaWQgdGMzNTg5eF9ncGlvX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCBvZmZzZXQgPSBpcnEgLSB0YzM1ODl4X2dwaW8tPmlycV9iYXNlOworCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCWludCBvZmZzZXQgPSBkLT5pcnEgLSB0YzM1ODl4X2dwaW8tPmlycV9iYXNlOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwogCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CiAKQEAgLTE5NCwxMSArMTk0LDExIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdGMzNTg5eF9ncGlvX2lycV9jaGlwID0gewogCS5uYW1lCQkJPSAidGMzNTg5eC1ncGlvIiwKLQkuYnVzX2xvY2sJCT0gdGMzNTg5eF9ncGlvX2lycV9sb2NrLAotCS5idXNfc3luY191bmxvY2sJPSB0YzM1ODl4X2dwaW9faXJxX3N5bmNfdW5sb2NrLAotCS5tYXNrCQkJPSB0YzM1ODl4X2dwaW9faXJxX21hc2ssCi0JLnVubWFzawkJCT0gdGMzNTg5eF9ncGlvX2lycV91bm1hc2ssCi0JLnNldF90eXBlCQk9IHRjMzU4OXhfZ3Bpb19pcnFfc2V0X3R5cGUsCisJLmlycV9idXNfbG9jawkJPSB0YzM1ODl4X2dwaW9faXJxX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSB0YzM1ODl4X2dwaW9faXJxX3N5bmNfdW5sb2NrLAorCS5pcnFfbWFzawkJPSB0YzM1ODl4X2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gdGMzNTg5eF9ncGlvX2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZQkJPSB0YzM1ODl4X2dwaW9faXJxX3NldF90eXBlLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHRjMzU4OXhfZ3Bpb19pcnEoaW50IGlycSwgdm9pZCAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3RpbWJncGlvLmMgYi9kcml2ZXJzL2dwaW8vdGltYmdwaW8uYwppbmRleCA0NTI5MzY2Li41OGM4ZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vdGltYmdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vdGltYmdwaW8uYwpAQCAtMTA5LDEwICsxMDksMTAgQEAKIC8qCiAgKiBHUElPIElSUQogICovCi1zdGF0aWMgdm9pZCB0aW1iZ3Bpb19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpcnEpCitzdGF0aWMgdm9pZCB0aW1iZ3Bpb19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIHRncGlvLT5pcnFfYmFzZTsKKwlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRncGlvLT5sb2NrLCBmbGFncyk7CkBAIC0xMjEsMTAgKzEyMSwxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRncGlvLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIHRpbWJncGlvX2lycV9lbmFibGUodW5zaWduZWQgaXJxKQorc3RhdGljIHZvaWQgdGltYmdwaW9faXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIHRncGlvLT5pcnFfYmFzZTsKKwlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRncGlvLT5sb2NrLCBmbGFncyk7CkBAIC0xMzMsMTAgKzEzMywxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRncGlvLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgdGltYmdwaW9faXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0cmlnZ2VyKQorc3RhdGljIGludCB0aW1iZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHRyaWdnZXIpCiB7Ci0Jc3RydWN0IHRpbWJncGlvICp0Z3BpbyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIHRncGlvLT5pcnFfYmFzZTsKKwlzdHJ1Y3QgdGltYmdwaW8gKnRncGlvID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaW50IG9mZnNldCA9IGQtPmlycSAtIHRncGlvLT5pcnFfYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBsdnIsIGZsciwgYmZsciA9IDA7CiAJdTMyIHZlcjsKQEAgLTE5OSw3ICsxOTksNyBAQAogCXVuc2lnbmVkIGxvbmcgaXByOwogCWludCBvZmZzZXQ7CiAKLQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7CiAJaXByID0gaW9yZWFkMzIodGdwaW8tPm1lbWJhc2UgKyBUR1BJT19JUFIpOwogCWlvd3JpdGUzMihpcHIsIHRncGlvLT5tZW1iYXNlICsgVEdQSU9fSUNSKTsKIApAQCAtMjE3LDkgKzIxNyw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdGltYmdwaW9faXJxY2hpcCA9IHsKIAkubmFtZQkJPSAiR1BJTyIsCi0JLmVuYWJsZQkJPSB0aW1iZ3Bpb19pcnFfZW5hYmxlLAotCS5kaXNhYmxlCT0gdGltYmdwaW9faXJxX2Rpc2FibGUsCi0JLnNldF90eXBlCT0gdGltYmdwaW9faXJxX3R5cGUsCisJLmlycV9lbmFibGUJPSB0aW1iZ3Bpb19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IHRpbWJncGlvX2lycV9kaXNhYmxlLAorCS5pcnFfc2V0X3R5cGUJPSB0aW1iZ3Bpb19pcnFfdHlwZSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHRpbWJncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vdnI0MXh4X2dpdS5jIGIvZHJpdmVycy9ncGlvL3ZyNDF4eF9naXUuYwppbmRleCBiMTZjOWE4Li5jZmZhM2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vdnI0MXh4X2dpdS5jCisrKyBiL2RyaXZlcnMvZ3Bpby92cjQxeHhfZ2l1LmMKQEAgLTExMSw2OSArMTExLDY5IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyB2b2lkIGFja19naXVpbnRfbG93KHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhY2tfZ2l1aW50X2xvdyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0JZ2l1X3dyaXRlKEdJVUlOVFNUQVRMLCAxIDw8IEdQSU9fUElOX09GX0lSUShpcnEpKTsKKwlnaXVfd3JpdGUoR0lVSU5UU1RBVEwsIDEgPDwgR1BJT19QSU5fT0ZfSVJRKGQtPmlycSkpOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2dpdWludF9sb3codW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIG1hc2tfZ2l1aW50X2xvdyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0JZ2l1X2NsZWFyKEdJVUlOVEVOTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoaXJxKSk7CisJZ2l1X2NsZWFyKEdJVUlOVEVOTCwgMSA8PCBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hc2tfYWNrX2dpdWludF9sb3codW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIG1hc2tfYWNrX2dpdWludF9sb3coc3RydWN0IGlycV9kYXRhICpkKQogewogCXVuc2lnbmVkIGludCBwaW47CiAKLQlwaW4gPSBHUElPX1BJTl9PRl9JUlEoaXJxKTsKKwlwaW4gPSBHUElPX1BJTl9PRl9JUlEoZC0+aXJxKTsKIAlnaXVfY2xlYXIoR0lVSU5URU5MLCAxIDw8IHBpbik7CiAJZ2l1X3dyaXRlKEdJVUlOVFNUQVRMLCAxIDw8IHBpbik7CiB9CiAKLXN0YXRpYyB2b2lkIHVubWFza19naXVpbnRfbG93KHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB1bm1hc2tfZ2l1aW50X2xvdyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0JZ2l1X3NldChHSVVJTlRFTkwsIDEgPDwgR1BJT19QSU5fT0ZfSVJRKGlycSkpOworCWdpdV9zZXQoR0lVSU5URU5MLCAxIDw8IEdQSU9fUElOX09GX0lSUShkLT5pcnEpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBnaXVpbnRfbG93X2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJHSVVJTlRMIiwKLQkuYWNrCQk9IGFja19naXVpbnRfbG93LAotCS5tYXNrCQk9IG1hc2tfZ2l1aW50X2xvdywKLQkubWFza19hY2sJPSBtYXNrX2Fja19naXVpbnRfbG93LAotCS51bm1hc2sJCT0gdW5tYXNrX2dpdWludF9sb3csCisJLmlycV9hY2sJPSBhY2tfZ2l1aW50X2xvdywKKwkuaXJxX21hc2sJPSBtYXNrX2dpdWludF9sb3csCisJLmlycV9tYXNrX2Fjawk9IG1hc2tfYWNrX2dpdWludF9sb3csCisJLmlycV91bm1hc2sJPSB1bm1hc2tfZ2l1aW50X2xvdywKIH07CiAKLXN0YXRpYyB2b2lkIGFja19naXVpbnRfaGlnaCh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYWNrX2dpdWludF9oaWdoKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlnaXVfd3JpdGUoR0lVSU5UU1RBVEgsCi0JCSAgMSA8PCAoR1BJT19QSU5fT0ZfSVJRKGlycSkgLSBHSVVJTlRfSElHSF9PRkZTRVQpKTsKKwkJICAxIDw8IChHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2dpdWludF9oaWdoKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXNrX2dpdWludF9oaWdoKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQlnaXVfY2xlYXIoR0lVSU5URU5ILCAxIDw8IChHUElPX1BJTl9PRl9JUlEoaXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOworCWdpdV9jbGVhcihHSVVJTlRFTkgsIDEgPDwgKEdQSU9fUElOX09GX0lSUShkLT5pcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUKSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hc2tfYWNrX2dpdWludF9oaWdoKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXNrX2Fja19naXVpbnRfaGlnaChzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdW5zaWduZWQgaW50IHBpbjsKIAotCXBpbiA9IEdQSU9fUElOX09GX0lSUShpcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUOworCXBpbiA9IEdQSU9fUElOX09GX0lSUShkLT5pcnEpIC0gR0lVSU5UX0hJR0hfT0ZGU0VUOwogCWdpdV9jbGVhcihHSVVJTlRFTkgsIDEgPDwgcGluKTsKIAlnaXVfd3JpdGUoR0lVSU5UU1RBVEgsIDEgPDwgcGluKTsKIH0KIAotc3RhdGljIHZvaWQgdW5tYXNrX2dpdWludF9oaWdoKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB1bm1hc2tfZ2l1aW50X2hpZ2goc3RydWN0IGlycV9kYXRhICpkKQogewotCWdpdV9zZXQoR0lVSU5URU5ILCAxIDw8IChHUElPX1BJTl9PRl9JUlEoaXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOworCWdpdV9zZXQoR0lVSU5URU5ILCAxIDw8IChHUElPX1BJTl9PRl9JUlEoZC0+aXJxKSAtIEdJVUlOVF9ISUdIX09GRlNFVCkpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGdpdWludF9oaWdoX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJHSVVJTlRIIiwKLQkuYWNrCQk9IGFja19naXVpbnRfaGlnaCwKLQkubWFzawkJPSBtYXNrX2dpdWludF9oaWdoLAotCS5tYXNrX2Fjawk9IG1hc2tfYWNrX2dpdWludF9oaWdoLAotCS51bm1hc2sJCT0gdW5tYXNrX2dpdWludF9oaWdoLAorCS5pcnFfYWNrCT0gYWNrX2dpdWludF9oaWdoLAorCS5pcnFfbWFzawk9IG1hc2tfZ2l1aW50X2hpZ2gsCisJLmlycV9tYXNrX2Fjawk9IG1hc2tfYWNrX2dpdWludF9oaWdoLAorCS5pcnFfdW5tYXNrCT0gdW5tYXNrX2dpdWludF9oaWdoLAogfTsKIAogc3RhdGljIGludCBnaXVfZ2V0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL3dtODk5NC1ncGlvLmMgYi9kcml2ZXJzL2dwaW8vd204OTk0LWdwaW8uYwppbmRleCA2MTgzOThlLi5jODIyYmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vd204OTk0LWdwaW8uYworKysgYi9kcml2ZXJzL2dwaW8vd204OTk0LWdwaW8uYwpAQCAtMzUsNiArMzUsMjkgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCB3bTg5OTRfZ3BpbywgZ3Bpb19jaGlwKTsKIH0KIAorc3RhdGljIGludCB3bTg5OTRfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gd204OTk0X2dwaW8tPndtODk5NDsKKworCXN3aXRjaCAod204OTk0LT50eXBlKSB7CisJY2FzZSBXTTg5NTg6CisJCXN3aXRjaCAob2Zmc2V0KSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCWNhc2UgNDoKKwkJY2FzZSA2OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd204OTk0X2dwaW9fZGlyZWN0aW9uX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3Qgd204OTk0X2dwaW8gKndtODk5NF9ncGlvID0gdG9fd204OTk0X2dwaW8oY2hpcCk7CkBAIC0xMzYsNiArMTU5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204OTk0IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5yZXF1ZXN0CQk9IHdtODk5NF9ncGlvX3JlcXVlc3QsCiAJLmRpcmVjdGlvbl9pbnB1dAk9IHdtODk5NF9ncGlvX2RpcmVjdGlvbl9pbiwKIAkuZ2V0CQkJPSB3bTg5OTRfZ3Bpb19nZXQsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSB3bTg5OTRfZ3Bpb19kaXJlY3Rpb25fb3V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwppbmRleCA3YWY0NDM2Li42NDgyOGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwpAQCAtMTA3LDcgKzEwNyw2IEBACiAJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKIAkjIGk5MTUgZGVwZW5kcyBvbiBBQ1BJX1ZJREVPIHdoZW4gQUNQSSBpcyBlbmFibGVkCiAJIyBidXQgZm9yIHNlbGVjdCB0byB3b3JrLCBuZWVkIHRvIHNlbGVjdCBBQ1BJX1ZJREVPJ3MgZGVwZW5kZW5jaWVzLCBpY2sKLQlzZWxlY3QgVklERU9fT1VUUFVUX0NPTlRST0wgaWYgQUNQSQogCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFIGlmIEFDUEkKIAlzZWxlY3QgSU5QVVQgaWYgQUNQSQogCXNlbGVjdCBBQ1BJX1ZJREVPIGlmIEFDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKaW5kZXggMjUyZmRiOS4uMGNiMmJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTQ2NiwxMCArNDY2LDQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FncF9iaW5kX3BhZ2VzKTsKIAotdm9pZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlhZ3BfZmx1c2hfY2hpcHNldChkZXYtPmFncC0+YnJpZGdlKTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2FncF9jaGlwc2V0X2ZsdXNoKTsKLQogI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IDJkNGUxN2EuLjk1MmIzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsIHNhdmVkX21vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsIHNhdmVkX21vZGUsIHNhdmVkX2h3bW9kZTsKIAlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRjX2Z1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CiAJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jczsKIAlpbnQgc2F2ZWRfeCwgc2F2ZWRfeTsKQEAgLTM1MCw2ICszNTAsNyBAQAogCWlmICghY3J0Yy0+ZW5hYmxlZCkKIAkJcmV0dXJuIHRydWU7CiAKKwlzYXZlZF9od21vZGUgPSBjcnRjLT5od21vZGU7CiAJc2F2ZWRfbW9kZSA9IGNydGMtPm1vZGU7CiAJc2F2ZWRfeCA9IGNydGMtPng7CiAJc2F2ZWRfeSA9IGNydGMtPnk7CkBAIC00MjcsMTEgKzQyOCwyMSBAQAogCiAJfQogCisJLyogU3RvcmUgcmVhbCBwb3N0LWFkanVzdG1lbnQgaGFyZHdhcmUgbW9kZS4gKi8KKwljcnRjLT5od21vZGUgPSAqYWRqdXN0ZWRfbW9kZTsKKworCS8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdmFyaW91cyBjb25zdGFudHMgd2hpY2gKKwkgKiBhcmUgbGF0ZXIgbmVlZGVkIGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uCisJICogdGltZXN0YW1waW5nLiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gdHJ1ZSBod21vZGUuCisJICovCisJZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhjcnRjKTsKKwogCS8qIFhYWCBmcmVlIGFkanVzdGVkbW9kZSAqLwogCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBhZGp1c3RlZF9tb2RlKTsKIAkvKiBGSVhNRTogYWRkIHN1YnBpeGVsIG9yZGVyICovCiBkb25lOgogCWlmICghcmV0KSB7CisJCWNydGMtPmh3bW9kZSA9IHNhdmVkX2h3bW9kZTsKIAkJY3J0Yy0+bW9kZSA9IHNhdmVkX21vZGU7CiAJCWNydGMtPnggPSBzYXZlZF94OwogCQljcnRjLT55ID0gc2F2ZWRfeTsKQEAgLTY1MCw2ICs2NjEsNyBAQAogCQkJCQkJICAgICAgb2xkX2ZiKSkgewogCQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCBtb2RlIG9uIFtDUlRDOiVkXVxuIiwKIAkJCQkJICBzZXQtPmNydGMtPmJhc2UuaWQpOworCQkJCXNldC0+Y3J0Yy0+ZmIgPSBvbGRfZmI7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CkBAIC02NjQsOCArNjc2LDEwIEBACiAJCQlzZXQtPmNydGMtPmZiID0gc2V0LT5mYjsKIAkJcmV0ID0gY3J0Y19mdW5jcy0+bW9kZV9zZXRfYmFzZShzZXQtPmNydGMsCiAJCQkJCQlzZXQtPngsIHNldC0+eSwgb2xkX2ZiKTsKLQkJaWYgKHJldCAhPSAwKQorCQlpZiAocmV0ICE9IDApIHsKKwkJCXNldC0+Y3J0Yy0+ZmIgPSBvbGRfZmI7CiAJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAJRFJNX0RFQlVHX0tNUygiU2V0dGluZyBjb25uZWN0b3IgRFBNUyBzdGF0ZSB0byBvblxuIik7CiAJZm9yIChpID0gMDsgaSA8IHNldC0+bnVtX2Nvbm5lY3RvcnM7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggZDI4NDllNC4uMDMwN2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC02MDcsNiArNjA3LDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZmluaSk7CiAKK3ZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJaW5mby0+Zml4LnZpc3VhbCA9IGZiLT5kZXB0aCA9PSA4ID8gRkJfVklTVUFMX1BTRVVET0NPTE9SIDoKKwkJRkJfVklTVUFMX1RSVUVDT0xPUjsKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IDA7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gMDsKKwlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCWluZm8tPmZpeC54cGFuc3RlcCA9IDE7IC8qIGRvaW5nIGl0IGluIGh3ICovCisJaW5mby0+Zml4LnlwYW5zdGVwID0gMTsgLyogZG9pbmcgaXQgaW4gaHcgKi8KKwlpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKKwlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOworCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7CisKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBmYi0+cGl0Y2g7CisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2ZpbGxfZml4KTsKKwogc3RhdGljIGludCBzZXRjb2xyZWcoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCiAJCSAgICAgdTE2IGJsdWUsIHUxNiByZWdubywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CkBAIC04MTYsNiArODM1LDcgQEAKIAkJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CisJCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmJfaGVscGVyLT5mYik7CiAJfQogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKQEAgLTk1Myw2ICs5NzMsNyBAQAogCiAJaWYgKG5ld19mYikgewogCQlpbmZvLT52YXIucGl4Y2xvY2sgPSAwOworCQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiX2hlbHBlci0+ZmIpOwogCQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtOTc5LDI0ICsxMDAwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUpOwogCi12b2lkIGRybV9mYl9oZWxwZXJfZmlsbF9maXgoc3RydWN0IGZiX2luZm8gKmluZm8sIHVpbnQzMl90IHBpdGNoLAotCQkJICAgIHVpbnQzMl90IGRlcHRoKQotewotCWluZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwotCWluZm8tPmZpeC52aXN1YWwgPSBkZXB0aCA9PSA4ID8gRkJfVklTVUFMX1BTRVVET0NPTE9SIDoKLQkJRkJfVklTVUFMX1RSVUVDT0xPUjsKLQlpbmZvLT5maXgudHlwZV9hdXggPSAwOwotCWluZm8tPmZpeC54cGFuc3RlcCA9IDE7IC8qIGRvaW5nIGl0IGluIGh3ICovCi0JaW5mby0+Zml4LnlwYW5zdGVwID0gMTsgLyogZG9pbmcgaXQgaW4gaHcgKi8KLQlpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKLQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOwotCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7Ci0KLQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBwaXRjaDsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZmlsbF9maXgpOwotCiB2b2lkIGRybV9mYl9oZWxwZXJfZmlsbF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJCQkgICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCkKIHsKQEAgLTEwMDUsNiArMTAwOCw3IEBACiAJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGZiLT53aWR0aDsKIAlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gZmItPmhlaWdodDsKIAlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPSBmYi0+Yml0c19wZXJfcGl4ZWw7CisJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7CiAJaW5mby0+dmFyLnhvZmZzZXQgPSAwOwogCWluZm8tPnZhci55b2Zmc2V0ID0gMDsKIAlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CkBAIC0xNTMwLDMgKzE1MzQsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KTsKIAorLyogVGhlIEtjb25maWcgRFJNX0tNU19IRUxQRVIgc2VsZWN0cyBGUkFNRUJVRkZFUl9DT05TT0xFIChpZiAhRU1CRURERUQpCisgKiBidXQgdGhlIG1vZHVsZSBkb2Vzbid0IGRlcGVuZCBvbiBhbnkgZmIgY29uc29sZSBzeW1ib2xzLiAgQXQgbGVhc3QKKyAqIGF0dGVtcHQgdG8gbG9hZCBmYmNvbiB0byBhdm9pZCBsZWF2aW5nIHRoZSBzeXN0ZW0gd2l0aG91dCBhIHVzYWJsZSBjb25zb2xlLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9NT0RVTEUpICYmICFkZWZpbmVkKENPTkZJR19FTUJFRERFRCkKK3N0YXRpYyBpbnQgX19pbml0IGRybV9mYl9oZWxwZXJfbW9kaW5pdCh2b2lkKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSAiZmJjb24iOworCXN0cnVjdCBtb2R1bGUgKmZiY29uOworCisJbXV0ZXhfbG9jaygmbW9kdWxlX211dGV4KTsKKwlmYmNvbiA9IGZpbmRfbW9kdWxlKG5hbWUpOworCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKKworCWlmICghZmJjb24pCisJCXJlcXVlc3RfbW9kdWxlX25vd2FpdChuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoZHJtX2ZiX2hlbHBlcl9tb2Rpbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCBhMzk3OTRiLi4yZWM3ZDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMjM2LDYgKzIzNiw4IEBACiAJCXJldHVybiAtRUJVU1k7CS8qIE5vIGV4Y2x1c2l2ZSBvcGVucyAqLwogCWlmICghZHJtX2NwdV92YWxpZCgpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgIT0gRFJNX1NXSVRDSF9QT1dFUl9PTikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlEUk1fREVCVUcoInBpZCA9ICVkLCBtaW5vciA9ICVkXG4iLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgbWlub3JfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwppbmRleCAxNmQ1MTU1Li4wMDU0ZTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKQEAgLTQwLDYgKzQwLDIyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CisKKy8qIEFjY2VzcyBtYWNybyBmb3Igc2xvdHMgaW4gdmJsYW5rIHRpbWVzdGFtcCByaW5nYnVmZmVyLiAqLworI2RlZmluZSB2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCBjb3VudCkgKCBcCisJKGRldiktPl92YmxhbmtfdGltZVsoY3J0YykgKiBEUk1fVkJMQU5LVElNRV9SQlNJWkUgKyBcCisJKChjb3VudCkgJSBEUk1fVkJMQU5LVElNRV9SQlNJWkUpXSkKKworLyogUmV0cnkgdGltZXN0YW1wIGNhbGN1bGF0aW9uIHVwIHRvIDMgdGltZXMgdG8gc2F0aXNmeQorICogZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24gYmVmb3JlIGdpdmluZyB1cC4KKyAqLworI2RlZmluZSBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMgMworCisvKiBUaHJlc2hvbGQgaW4gbmFub3NlY29uZHMgZm9yIGRldGVjdGlvbiBvZiByZWR1bmRhbnQKKyAqIHZibGFuayBpcnEgaW4gZHJtX2hhbmRsZV92YmxhbmsoKS4gMSBtc2VjIHNob3VsZCBiZSBvay4KKyAqLworI2RlZmluZSBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMgMTAwMDAwMAorCiAvKioKICAqIEdldCBpbnRlcnJ1cHQgZnJvbSBidXMgaWQuCiAgKgpAQCAtNzcsNiArOTMsODcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENsZWFyIHZibGFuayB0aW1lc3RhbXAgYnVmZmVyIGZvciBhIGNydGMuCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX3ZibGFua190aW1lc3RhbXBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCW1lbXNldCgmZGV2LT5fdmJsYW5rX3RpbWVbY3J0YyAqIERSTV9WQkxBTktUSU1FX1JCU0laRV0sIDAsCisJCURSTV9WQkxBTktUSU1FX1JCU0laRSAqIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworfQorCisvKgorICogRGlzYWJsZSB2YmxhbmsgaXJxJ3Mgb24gY3J0YywgbWFrZSBzdXJlIHRoYXQgbGFzdCB2YmxhbmsgY291bnQKKyAqIG9mIGhhcmR3YXJlIGFuZCBjb3JyZXNwb25kaW5nIGNvbnNpc3RlbnQgc29mdHdhcmUgdmJsYW5rIGNvdW50ZXIKKyAqIGFyZSBwcmVzZXJ2ZWQsIGV2ZW4gaWYgdGhlcmUgYXJlIGFueSBzcHVyaW91cyB2YmxhbmsgaXJxJ3MgYWZ0ZXIKKyAqIGRpc2FibGUuCisgKi8KK3N0YXRpYyB2b2lkIHZibGFua19kaXNhYmxlX2FuZF9zYXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJdTMyIHZibGNvdW50OworCXM2NCBkaWZmX25zOworCWludCB2YmxyYzsKKwlzdHJ1Y3QgdGltZXZhbCB0dmJsYW5rOworCisJLyogUHJldmVudCB2YmxhbmsgaXJxIHByb2Nlc3Npbmcgd2hpbGUgZGlzYWJsaW5nIHZibGFuayBpcnFzLAorCSAqIHNvIG5vIHVwZGF0ZXMgb2YgdGltZXN0YW1wcyBvciBjb3VudCBjYW4gaGFwcGVuIGFmdGVyIHdlJ3ZlCisJICogZGlzYWJsZWQuIE5lZWRlZCB0byBwcmV2ZW50IHJhY2VzIGluIGNhc2Ugb2YgZGVsYXllZCBpcnEncy4KKwkgKiBEaXNhYmxlIHByZWVtcHRpb24sIHNvIHZibGFua190aW1lX2xvY2sgaXMgaGVsZCBhcyBzaG9ydCBhcworCSAqIHBvc3NpYmxlLCBldmVuIHVuZGVyIGEga2VybmVsIHdpdGggUFJFRU1QVF9SVCBwYXRjaGVzLgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKKworCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayhkZXYsIGNydGMpOworCWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10gPSAwOworCisJLyogTm8gZnVydGhlciB2YmxhbmsgaXJxJ3Mgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIKKwkgKiB0aGlzIHBvaW50LiBHZXQgY3VycmVudCBoYXJkd2FyZSB2YmxhbmsgY291bnQgYW5kCisJICogdmJsYW5rIHRpbWVzdGFtcCwgcmVwZWF0IHVudGlsIHRoZXkgYXJlIGNvbnNpc3RlbnQuCisJICoKKwkgKiBGSVhNRTogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGFuZCBpbgorCSAqIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgd2hpY2ggY2FuIGNhdXNlIG9mZi1ieS1vbmUKKwkgKiByZWluaXRpYWxpemF0aW9uIG9mIHNvZnR3YXJlIHZibGFuayBjb3VudGVyLiBJZiBncHUKKwkgKiB2YmxhbmsgY291bnRlciBkb2Vzbid0IGluY3JlbWVudCBleGFjdGx5IGF0IHRoZSBsZWFkaW5nCisJICogZWRnZSBvZiBhIHZibGFuayBpbnRlcnZhbCwgdGhlbiB3ZSBjYW4gbG9zZSAxIGNvdW50IGlmCisJICogd2UgaGFwcGVuIHRvIGV4ZWN1dGUgYmV0d2VlbiBzdGFydCBvZiB2YmxhbmsgYW5kIHRoZQorCSAqIGRlbGF5ZWQgZ3B1IGNvdW50ZXIgaW5jcmVtZW50LgorCSAqLworCWRvIHsKKwkJZGV2LT5sYXN0X3ZibGFua1tjcnRjXSA9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKTsKKwkJdmJscmMgPSBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wKGRldiwgY3J0YywgJnR2YmxhbmssIDApOworCX0gd2hpbGUgKGRldi0+bGFzdF92YmxhbmtbY3J0Y10gIT0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGNydGMpKTsKKworCS8qIENvbXB1dGUgdGltZSBkaWZmZXJlbmNlIHRvIHN0b3JlZCB0aW1lc3RhbXAgb2YgbGFzdCB2YmxhbmsKKwkgKiBhcyB1cGRhdGVkIGJ5IGxhc3QgaW52b2NhdGlvbiBvZiBkcm1faGFuZGxlX3ZibGFuaygpIGluIHZibGFuayBpcnEuCisJICovCisJdmJsY291bnQgPSBhdG9taWNfcmVhZCgmZGV2LT5fdmJsYW5rX2NvdW50W2NydGNdKTsKKwlkaWZmX25zID0gdGltZXZhbF90b19ucygmdHZibGFuaykgLQorCQkgIHRpbWV2YWxfdG9fbnMoJnZibGFua3RpbWVzdGFtcChkZXYsIGNydGMsIHZibGNvdW50KSk7CisKKwkvKiBJZiB0aGVyZSBpcyBhdCBsZWFzdCAxIG1zZWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsYXN0IHN0b3JlZAorCSAqIHRpbWVzdGFtcCBhbmQgdHZibGFuaywgdGhlbiB3ZSBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBvdXIKKwkgKiBkaXNhYmxlIGluc2lkZSBhIG5ldyB2YmxhbmsgaW50ZXJ2YWwsIHRoZSB0dmJsYW5rIHRpbWVzdGFtcAorCSAqIGNvcnJlc3BvbmRzIHRvIHRoaXMgbmV3IHZibGFuayBpbnRlcnZhbCBhbmQgdGhlIGlycSBoYW5kbGVyCisJICogZm9yIHRoaXMgdmJsYW5rIGRpZG4ndCBydW4geWV0IGFuZCB3b24ndCBydW4gZHVlIHRvIG91ciBkaXNhYmxlLgorCSAqIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGRvIHRoZSBqb2Igb2YgZHJtX2hhbmRsZV92YmxhbmsoKSBhbmQKKwkgKiBpbmNyZW1lbnQgdGhlIHZibGFuayBjb3VudGVyIGJ5IG9uZSB0byBhY2NvdW50IGZvciB0aGlzIHZibGFuay4KKwkgKgorCSAqIFNraXAgdGhpcyBzdGVwIGlmIHRoZXJlIGlzbid0IGFueSBoaWdoIHByZWNpc2lvbiB0aW1lc3RhbXAKKwkgKiBhdmFpbGFibGUuIEluIHRoYXQgY2FzZSB3ZSBjYW4ndCBhY2NvdW50IGZvciB0aGlzIGFuZCBqdXN0CisJICogaG9wZSBmb3IgdGhlIGJlc3QuCisJICovCisJaWYgKCh2YmxyYyA+IDApICYmIChhYnMoZGlmZl9ucykgPiAxMDAwMDAwKSkKKwkJYXRvbWljX2luYygmZGV2LT5fdmJsYW5rX2NvdW50W2NydGNdKTsKKworCS8qIEludmFsaWRhdGUgYWxsIHRpbWVzdGFtcHMgd2hpbGUgdmJsYW5rIGlycSdzIGFyZSBvZmYuICovCisJY2xlYXJfdmJsYW5rX3RpbWVzdGFtcHMoZGV2LCBjcnRjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKIHN0YXRpYyB2b2lkIHZibGFua19kaXNhYmxlX2ZuKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilhcmc7CkBAIC05MSwxMCArMTg4LDcgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZkZXYtPnZibGFua19yZWZjb3VudFtpXSkgPT0gMCAmJgogCQkgICAgZGV2LT52YmxhbmtfZW5hYmxlZFtpXSkgewogCQkJRFJNX0RFQlVHKCJkaXNhYmxpbmcgdmJsYW5rIG9uIGNydGMgJWRcbiIsIGkpOwotCQkJZGV2LT5sYXN0X3ZibGFua1tpXSA9Ci0JCQkJZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGkpOwotCQkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rKGRldiwgaSk7Ci0JCQlkZXYtPnZibGFua19lbmFibGVkW2ldID0gMDsKKwkJCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgaSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCX0KQEAgLTExNyw2ICsyMTEsNyBAQAogCWtmcmVlKGRldi0+bGFzdF92YmxhbmspOwogCWtmcmVlKGRldi0+bGFzdF92Ymxhbmtfd2FpdCk7CiAJa2ZyZWUoZGV2LT52YmxhbmtfaW5tb2Rlc2V0KTsKKwlrZnJlZShkZXYtPl92YmxhbmtfdGltZSk7CiAKIAlkZXYtPm51bV9jcnRjcyA9IDA7CiB9CkBAIC0xMjksNiArMjI0LDggQEAKIAlzZXR1cF90aW1lcigmZGV2LT52YmxhbmtfZGlzYWJsZV90aW1lciwgdmJsYW5rX2Rpc2FibGVfZm4sCiAJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT52YmxhbmtfdGltZV9sb2NrKTsKKwogCWRldi0+bnVtX2NydGNzID0gbnVtX2NydGNzOwogCiAJZGV2LT52YmxfcXVldWUgPSBrbWFsbG9jKHNpemVvZih3YWl0X3F1ZXVlX2hlYWRfdCkgKiBudW1fY3J0Y3MsCkBAIC0xNjEsNiArMjU4LDE5IEBACiAJaWYgKCFkZXYtPnZibGFua19pbm1vZGVzZXQpCiAJCWdvdG8gZXJyOwogCisJZGV2LT5fdmJsYW5rX3RpbWUgPSBrY2FsbG9jKG51bV9jcnRjcyAqIERSTV9WQkxBTktUSU1FX1JCU0laRSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPl92YmxhbmtfdGltZSkKKwkJZ290byBlcnI7CisKKwlEUk1fSU5GTygiU3VwcG9ydHMgdmJsYW5rIHRpbWVzdGFtcCBjYWNoaW5nIFJldiAxICgxMC4xMC4yMDEwKS5cbiIpOworCisJLyogRHJpdmVyIHNwZWNpZmljIGhpZ2gtcHJlY2lzaW9uIHZibGFuayB0aW1lc3RhbXBpbmcgc3VwcG9ydGVkPyAqLworCWlmIChkZXYtPmRyaXZlci0+Z2V0X3ZibGFua190aW1lc3RhbXApCisJCURSTV9JTkZPKCJEcml2ZXIgc3VwcG9ydHMgcHJlY2lzZSB2YmxhbmsgdGltZXN0YW1wIHF1ZXJ5LlxuIik7CisJZWxzZQorCQlEUk1fSU5GTygiTm8gZHJpdmVyIHN1cHBvcnQgZm9yIHZibGFuayB0aW1lc3RhbXAgcXVlcnkuXG4iKTsKKwogCS8qIFplcm8gcGVyLWNydGMgdmJsYW5rIHN0dWZmICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9jcnRjczsgaSsrKSB7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+dmJsX3F1ZXVlW2ldKTsKQEAgLTI3OSw3ICszODksNyBAQAogICoKICAqIENhbGxzIHRoZSBkcml2ZXIncyBcYyBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoKSBmdW5jdGlvbiwgYW5kIHN0b3BzIHRoZSBpcnEuCiAgKi8KLWludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJaW50IGlycV9lbmFibGVkLCBpOwpAQCAtMzM1LDcgKzQ0NSw5IEBACiB7CiAJc3RydWN0IGRybV9jb250cm9sICpjdGwgPSBkYXRhOwogCi0JLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaCAqLworCS8qIGlmIHdlIGhhdmVuJ3QgaXJxIHdlIGZhbGxiYWNrIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgLQorCSAqIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaAorCSAqLwogCiAKIAlzd2l0Y2ggKGN0bC0+ZnVuYykgewpAQCAtMzYwLDYgKzQ3MiwyODcgQEAKIH0KIAogLyoqCisgKiBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzIC0gQ2FsY3VsYXRlIGFuZAorICogc3RvcmUgdmFyaW91cyBjb25zdGFudHMgd2hpY2ggYXJlIGxhdGVyIG5lZWRlZCBieQorICogdmJsYW5rIGFuZCBzd2FwLWNvbXBsZXRpb24gdGltZXN0YW1waW5nLCBlLmcsIGJ5CisgKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKCkuCisgKiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gY3J0YydzIHRydWUgc2Nhbm91dCB0aW1pbmcsCisgKiBzbyB0aGV5IHRha2UgdGhpbmdzIGxpa2UgcGFuZWwgc2NhbGluZyBvciBvdGhlcgorICogYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgorICoKKyAqIEBjcnRjIGRybV9jcnRjIHdob3NlIHRpbWVzdGFtcCBjb25zdGFudHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKgorICovCit2b2lkIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXM2NCBsaW5lZHVyX25zID0gMCwgcGl4ZWxkdXJfbnMgPSAwLCBmcmFtZWR1cl9ucyA9IDA7CisJdTY0IGRvdGNsb2NrOworCisJLyogRG90IGNsb2NrIGluIEh6OiAqLworCWRvdGNsb2NrID0gKHU2NCkgY3J0Yy0+aHdtb2RlLmNsb2NrICogMTAwMDsKKworCS8qIFZhbGlkIGRvdGNsb2NrPyAqLworCWlmIChkb3RjbG9jayA+IDApIHsKKwkJLyogQ29udmVydCBzY2FubGluZSBsZW5ndGggaW4gcGl4ZWxzIGFuZCB2aWRlbyBkb3QgY2xvY2sgdG8KKwkJICogbGluZSBkdXJhdGlvbiwgZnJhbWUgZHVyYXRpb24gYW5kIHBpeGVsIGR1cmF0aW9uIGluCisJCSAqIG5hbm9zZWNvbmRzOgorCQkgKi8KKwkJcGl4ZWxkdXJfbnMgPSAoczY0KSBkaXY2NF91NjQoMTAwMDAwMDAwMCwgZG90Y2xvY2spOworCQlsaW5lZHVyX25zICA9IChzNjQpIGRpdjY0X3U2NCgoKHU2NCkgY3J0Yy0+aHdtb2RlLmNydGNfaHRvdGFsICoKKwkJCQkJICAgICAgMTAwMDAwMDAwMCksIGRvdGNsb2NrKTsKKwkJZnJhbWVkdXJfbnMgPSAoczY0KSBjcnRjLT5od21vZGUuY3J0Y192dG90YWwgKiBsaW5lZHVyX25zOworCX0gZWxzZQorCQlEUk1fRVJST1IoImNydGMgJWQ6IENhbid0IGNhbGN1bGF0ZSBjb25zdGFudHMsIGRvdGNsb2NrID0gMCFcbiIsCisJCQkgIGNydGMtPmJhc2UuaWQpOworCisJY3J0Yy0+cGl4ZWxkdXJfbnMgPSBwaXhlbGR1cl9uczsKKwljcnRjLT5saW5lZHVyX25zICA9IGxpbmVkdXJfbnM7CisJY3J0Yy0+ZnJhbWVkdXJfbnMgPSBmcmFtZWR1cl9uczsKKworCURSTV9ERUJVRygiY3J0YyAlZDogaHdtb2RlOiBodG90YWwgJWQsIHZ0b3RhbCAlZCwgdmRpc3BsYXkgJWRcbiIsCisJCSAgY3J0Yy0+YmFzZS5pZCwgY3J0Yy0+aHdtb2RlLmNydGNfaHRvdGFsLAorCQkgIGNydGMtPmh3bW9kZS5jcnRjX3Z0b3RhbCwgY3J0Yy0+aHdtb2RlLmNydGNfdmRpc3BsYXkpOworCURSTV9ERUJVRygiY3J0YyAlZDogY2xvY2sgJWQga0h6IGZyYW1lZHVyICVkIGxpbmVkdXIgJWQsIHBpeGVsZHVyICVkXG4iLAorCQkgIGNydGMtPmJhc2UuaWQsIChpbnQpIGRvdGNsb2NrLzEwMDAsIChpbnQpIGZyYW1lZHVyX25zLAorCQkgIChpbnQpIGxpbmVkdXJfbnMsIChpbnQpIHBpeGVsZHVyX25zKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyk7CisKKy8qKgorICogZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyAtIGhlbHBlciByb3V0aW5lIGZvciBrbXMKKyAqIGRyaXZlcnMuIEltcGxlbWVudHMgY2FsY3VsYXRpb24gb2YgZXhhY3QgdmJsYW5rIHRpbWVzdGFtcHMgZnJvbQorICogZ2l2ZW4gZHJtX2Rpc3BsYXlfbW9kZSB0aW1pbmdzIGFuZCBjdXJyZW50IHZpZGVvIHNjYW5vdXQgcG9zaXRpb24KKyAqIG9mIGEgY3J0Yy4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gd2l0aGluIGdldF92YmxhbmtfdGltZXN0YW1wKCkKKyAqIGltcGxlbWVudGF0aW9uIG9mIGEga21zIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCB0aW1lc3RhbXBpbmcuCisgKgorICogU2hvdWxkIHJldHVybiB0aW1lc3RhbXBzIGNvbmZvcm1pbmcgdG8gdGhlIE9NTF9zeW5jX2NvbnRyb2wgT3Blbk1MCisgKiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4gVGhlIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mCisgKiB0aGUgdmJsYW5rIGludGVydmFsLCBha2Egc3RhcnQgb2Ygc2Nhbm91dCBvZiB0b3Btb3N0LWxlZnRtb3N0IGRpc3BsYXkKKyAqIHBpeGVsIGluIHRoZSBmb2xsb3dpbmcgdmlkZW8gZnJhbWUuCisgKgorICogUmVxdWlyZXMgc3VwcG9ydCBmb3Igb3B0aW9uYWwgZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uKCkKKyAqIGluIGttcyBkcml2ZXIsIHBsdXMgYSBiaXQgb2Ygc2V0dXAgY29kZSB0byBwcm92aWRlIGEgZHJtX2Rpc3BsYXlfbW9kZQorICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdHJ1ZSBzY2Fub3V0IHRpbWluZy4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGhhbmRsZXMgc3RhbmRhcmQgdmlkZW8gbW9kZXMuIEl0CisgKiByZXR1cm5zIGFzIG5vIG9wZXJhdGlvbiBpZiBhIGRvdWJsZXNjYW4gb3IgaW50ZXJsYWNlZCB2aWRlbyBtb2RlIGlzCisgKiBhY3RpdmUuIEhpZ2hlciBsZXZlbCBjb2RlIGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGlzLgorICoKKyAqIEBkZXY6IERSTSBkZXZpY2UuCisgKiBAY3J0YzogV2hpY2ggY3J0YydzIHZibGFuayB0aW1lc3RhbXAgdG8gcmV0cmlldmUuCisgKiBAbWF4X2Vycm9yOiBEZXNpcmVkIG1heGltdW0gYWxsb3dhYmxlIGVycm9yIGluIHRpbWVzdGFtcHMgKG5hbm9zZWNzKS4KKyAqICAgICAgICAgICAgIE9uIHJldHVybiBjb250YWlucyB0cnVlIG1heGltdW0gZXJyb3Igb2YgdGltZXN0YW1wLgorICogQHZibGFua190aW1lOiBQb2ludGVyIHRvIHN0cnVjdCB0aW1ldmFsIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSB0aW1lc3RhbXAuCisgKiBAZmxhZ3M6IEZsYWdzIHRvIHBhc3MgdG8gZHJpdmVyOgorICogICAgICAgICAwID0gRGVmYXVsdC4KKyAqICAgICAgICAgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSA9IElmIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZibCBpcnEgaGFuZGxlci4KKyAqIEByZWZjcnRjOiBkcm1fY3J0Yyogb2YgY3J0YyB3aGljaCBkZWZpbmVzIHNjYW5vdXQgdGltaW5nLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IsIGZhaWx1cmUgb3IgaWYgbm90IHN1cHBvcnRlZCBpbiBjdXJyZW50CisgKiB2aWRlbyBtb2RlOgorICoKKyAqIC1FSU5WQUwgICAtIEludmFsaWQgY3J0Yy4KKyAqIC1FQUdBSU4gICAtIFRlbXBvcmFyeSB1bmF2YWlsYWJsZSwgZS5nLiwgY2FsbGVkIGJlZm9yZSBpbml0aWFsIG1vZGVzZXQuCisgKiAtRU5PVFNVUFAgLSBGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgZGlzcGxheSBtb2RlLgorICogLUVJTyAgICAgIC0gRmFpbGVkLCBlLmcuLCBkdWUgdG8gZmFpbGVkIHNjYW5vdXQgcG9zaXRpb24gcXVlcnkuCisgKgorICogUmV0dXJucyBvcidlZCBwb3NpdGl2ZSBzdGF0dXMgZmxhZ3Mgb24gc3VjY2VzczoKKyAqCisgKiBEUk1fVkJMQU5LVElNRV9TQ0FOT1VUUE9TX01FVEhPRCAtIFNpZ25hbCB0aGlzIG1ldGhvZCB1c2VkIGZvciB0aW1lc3RhbXBpbmcuCisgKiBEUk1fVkJMQU5LVElNRV9JTlZCTCAtIFRpbWVzdGFtcCB0YWtlbiB3aGlsZSBzY2Fub3V0IHdhcyBpbiB2YmxhbmsgaW50ZXJ2YWwuCisgKgorICovCitpbnQgZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCQkJICBpbnQgKm1heF9lcnJvciwKKwkJCQkJICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCisJCQkJCSAgdW5zaWduZWQgZmxhZ3MsCisJCQkJCSAgc3RydWN0IGRybV9jcnRjICpyZWZjcnRjKQoreworCXN0cnVjdCB0aW1ldmFsIHN0aW1lLCByYXdfdGltZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlpbnQgdmJsX3N0YXR1cywgdnRvdGFsLCB2ZGlzcGxheTsKKwlpbnQgdnBvcywgaHBvcywgaTsKKwlzNjQgZnJhbWVkdXJfbnMsIGxpbmVkdXJfbnMsIHBpeGVsZHVyX25zLCBkZWx0YV9ucywgZHVyYXRpb25fbnM7CisJYm9vbCBpbnZibDsKKworCWlmIChjcnRjIDwgMCB8fCBjcnRjID49IGRldi0+bnVtX2NydGNzKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBjcnRjICVkXG4iLCBjcnRjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2Nhbm91dCBwb3NpdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkPyBTaG91bGQgbm90IGhhcHBlbi4gKi8KKwlpZiAoIWRldi0+ZHJpdmVyLT5nZXRfc2Nhbm91dF9wb3NpdGlvbikgeworCQlEUk1fRVJST1IoIkNhbGxlZCBmcm9tIGRyaXZlciB3L28gZ2V0X3NjYW5vdXRfcG9zaXRpb24oKSE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbW9kZSA9ICZyZWZjcnRjLT5od21vZGU7CisJdnRvdGFsID0gbW9kZS0+Y3J0Y192dG90YWw7CisJdmRpc3BsYXkgPSBtb2RlLT5jcnRjX3ZkaXNwbGF5OworCisJLyogRHVyYXRpb25zIG9mIGZyYW1lcywgbGluZXMsIHBpeGVscyBpbiBuYW5vc2Vjb25kcy4gKi8KKwlmcmFtZWR1cl9ucyA9IHJlZmNydGMtPmZyYW1lZHVyX25zOworCWxpbmVkdXJfbnMgID0gcmVmY3J0Yy0+bGluZWR1cl9uczsKKwlwaXhlbGR1cl9ucyA9IHJlZmNydGMtPnBpeGVsZHVyX25zOworCisJLyogSWYgbW9kZSB0aW1pbmcgdW5kZWZpbmVkLCBqdXN0IHJldHVybiBhcyBuby1vcDoKKwkgKiBIYXBwZW5zIGR1cmluZyBpbml0aWFsIG1vZGVzZXR0aW5nIG9mIGEgY3J0Yy4KKwkgKi8KKwlpZiAodnRvdGFsIDw9IDAgfHwgdmRpc3BsYXkgPD0gMCB8fCBmcmFtZWR1cl9ucyA9PSAwKSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogTm9vcCBkdWUgdG8gdW5pbml0aWFsaXplZCBtb2RlLlxuIiwgY3J0Yyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIERvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgaW50ZXJsYWNlZCBvcgorCSAqIGRvdWJsZSBzY2FuIG1vZGVzLiBKdXN0IG5vLW9wIGZvciBub3cuCisJICovCisJaWYgKG1vZGUtPmZsYWdzICYgKERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxTQ0FOKSkgeworCQlEUk1fREVCVUcoImNydGMgJWQ6IE5vb3AgZHVlIHRvIHVuc3VwcG9ydGVkIG1vZGUuXG4iLCBjcnRjKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwkvKiBHZXQgY3VycmVudCBzY2Fub3V0IHBvc2l0aW9uIHdpdGggc3lzdGVtIHRpbWVzdGFtcC4KKwkgKiBSZXBlYXQgcXVlcnkgdXAgdG8gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTIHRpbWVzCisJICogaWYgc2luZ2xlIHF1ZXJ5IHRha2VzIGxvbmdlciB0aGFuIG1heF9lcnJvciBuYW5vc2Vjb25kcy4KKwkgKgorCSAqIFRoaXMgZ3VhcmFudGVlcyBhIHRpZ2h0IGJvdW5kIG9uIG1heGltdW0gZXJyb3IgaWYKKwkgKiBjb2RlIGdldHMgcHJlZW1wdGVkIG9yIGRlbGF5ZWQgZm9yIHNvbWUgcmVhc29uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVM7IGkrKykgeworCQkvKiBEaXNhYmxlIHByZWVtcHRpb24gdG8gbWFrZSBpdCB2ZXJ5IGxpa2VseSB0bworCQkgKiBzdWNjZWVkIGluIHRoZSBmaXJzdCBpdGVyYXRpb24gZXZlbiBvbiBQUkVFTVBUX1JUIGtlcm5lbC4KKwkJICovCisJCXByZWVtcHRfZGlzYWJsZSgpOworCisJCS8qIEdldCBzeXN0ZW0gdGltZXN0YW1wIGJlZm9yZSBxdWVyeS4gKi8KKwkJZG9fZ2V0dGltZW9mZGF5KCZzdGltZSk7CisKKwkJLyogR2V0IHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjYW5vdXQgcG9zLiB2cG9zLCBocG9zLiAqLworCQl2Ymxfc3RhdHVzID0gZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uKGRldiwgY3J0YywgJnZwb3MsICZocG9zKTsKKworCQkvKiBHZXQgc3lzdGVtIHRpbWVzdGFtcCBhZnRlciBxdWVyeS4gKi8KKwkJZG9fZ2V0dGltZW9mZGF5KCZyYXdfdGltZSk7CisKKwkJcHJlZW1wdF9lbmFibGUoKTsKKworCQkvKiBSZXR1cm4gYXMgbm8tb3AgaWYgc2Nhbm91dCBxdWVyeSB1bnN1cHBvcnRlZCBvciBmYWlsZWQuICovCisJCWlmICghKHZibF9zdGF0dXMgJiBEUk1fU0NBTk9VVFBPU19WQUxJRCkpIHsKKwkJCURSTV9ERUJVRygiY3J0YyAlZCA6IHNjYW5vdXRwb3MgcXVlcnkgZmFpbGVkIFslZF0uXG4iLAorCQkJCSAgY3J0YywgdmJsX3N0YXR1cyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWR1cmF0aW9uX25zID0gdGltZXZhbF90b19ucygmcmF3X3RpbWUpIC0gdGltZXZhbF90b19ucygmc3RpbWUpOworCisJCS8qIEFjY2VwdCByZXN1bHQgd2l0aCA8ICBtYXhfZXJyb3IgbnNlY3MgdGltaW5nIHVuY2VydGFpbnR5LiAqLworCQlpZiAoZHVyYXRpb25fbnMgPD0gKHM2NCkgKm1heF9lcnJvcikKKwkJCWJyZWFrOworCX0KKworCS8qIE5vaXN5IHN5c3RlbSB0aW1pbmc/ICovCisJaWYgKGkgPT0gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTKSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogTm9pc3kgdGltZXN0YW1wICVkIHVzID4gJWQgdXMgWyVkIHJlcHNdLlxuIiwKKwkJCSAgY3J0YywgKGludCkgZHVyYXRpb25fbnMvMTAwMCwgKm1heF9lcnJvci8xMDAwLCBpKTsKKwl9CisKKwkvKiBSZXR1cm4gdXBwZXIgYm91bmQgb2YgdGltZXN0YW1wIHByZWNpc2lvbiBlcnJvci4gKi8KKwkqbWF4X2Vycm9yID0gKGludCkgZHVyYXRpb25fbnM7CisKKwkvKiBDaGVjayBpZiBpbiB2YmxhbmsgYXJlYToKKwkgKiB2cG9zIGlzID49MCBpbiB2aWRlbyBzY2Fub3V0IGFyZWEsIGJ1dCBuZWdhdGl2ZQorCSAqIHdpdGhpbiB2YmxhbmsgYXJlYSwgY291bnRpbmcgZG93biB0aGUgbnVtYmVyIG9mIGxpbmVzIHVudGlsCisJICogc3RhcnQgb2Ygc2Nhbm91dC4KKwkgKi8KKwlpbnZibCA9IHZibF9zdGF0dXMgJiBEUk1fU0NBTk9VVFBPU19JTlZCTDsKKworCS8qIENvbnZlcnQgc2Nhbm91dCBwb3NpdGlvbiBpbnRvIGVsYXBzZWQgdGltZSBhdCByYXdfdGltZSBxdWVyeQorCSAqIHNpbmNlIHN0YXJ0IG9mIHNjYW5vdXQgYXQgZmlyc3QgZGlzcGxheSBzY2FubGluZS4gZGVsdGFfbnMKKwkgKiBjYW4gYmUgbmVnYXRpdmUgaWYgc3RhcnQgb2Ygc2Nhbm91dCBoYXNuJ3QgaGFwcGVuZWQgeWV0LgorCSAqLworCWRlbHRhX25zID0gKHM2NCkgdnBvcyAqIGxpbmVkdXJfbnMgKyAoczY0KSBocG9zICogcGl4ZWxkdXJfbnM7CisKKwkvKiBJcyB2cG9zIG91dHNpZGUgbm9taW5hbCB2YmxhbmsgYXJlYSwgYnV0IGxlc3MgdGhhbgorCSAqIDEvMTAwIG9mIGEgZnJhbWUgaGVpZ2h0IGF3YXkgZnJvbSBzdGFydCBvZiB2Ymxhbms/CisJICogSWYgc28sIGFzc3VtZSB0aGlzIGlzbid0IGEgbWFzc2l2ZWx5IGRlbGF5ZWQgdmJsYW5rCisJICogaW50ZXJydXB0LCBidXQgYSB2YmxhbmsgaW50ZXJydXB0IHRoYXQgZmlyZWQgYSBmZXcKKwkgKiBtaWNyb3NlY29uZHMgYmVmb3JlIHRydWUgc3RhcnQgb2YgdmJsYW5rLiBDb21wZW5zYXRlCisJICogYnkgYWRkaW5nIGEgZnVsbCBmcmFtZSBkdXJhdGlvbiB0byB0aGUgZmluYWwgdGltZXN0YW1wLgorCSAqIEhhcHBlbnMsIGUuZy4sIG9uIEFUSSBSNTAwLCBSNjAwLgorCSAqCisJICogV2Ugb25seSBkbyB0aGlzIGlmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEuCisJICovCisJaWYgKChmbGFncyAmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEpICYmICFpbnZibCAmJgorCSAgICAoKHZkaXNwbGF5IC0gdnBvcykgPCB2dG90YWwgLyAxMDApKSB7CisJCWRlbHRhX25zID0gZGVsdGFfbnMgLSBmcmFtZWR1cl9uczsKKworCQkvKiBTaWduYWwgdGhpcyBjb3JyZWN0aW9uIGFzICJhcHBsaWVkIi4gKi8KKwkJdmJsX3N0YXR1cyB8PSAweDg7CisJfQorCisJLyogU3VidHJhY3QgdGltZSBkZWx0YSBmcm9tIHJhdyB0aW1lc3RhbXAgdG8gZ2V0IGZpbmFsCisJICogdmJsYW5rX3RpbWUgdGltZXN0YW1wIGZvciBlbmQgb2YgdmJsYW5rLgorCSAqLworCSp2YmxhbmtfdGltZSA9IG5zX3RvX3RpbWV2YWwodGltZXZhbF90b19ucygmcmF3X3RpbWUpIC0gZGVsdGFfbnMpOworCisJRFJNX0RFQlVHKCJjcnRjICVkIDogdiAlZCBwKCVkLCVkKUAgJWQuJWQgLT4gJWQuJWQgW2UgJWQgdXMsICVkIHJlcF1cbiIsCisJCSAgY3J0YywgKGludCkgdmJsX3N0YXR1cywgaHBvcywgdnBvcywgcmF3X3RpbWUudHZfc2VjLAorCQkgIHJhd190aW1lLnR2X3VzZWMsIHZibGFua190aW1lLT50dl9zZWMsIHZibGFua190aW1lLT50dl91c2VjLAorCQkgIChpbnQpIGR1cmF0aW9uX25zLzEwMDAsIGkpOworCisJdmJsX3N0YXR1cyA9IERSTV9WQkxBTktUSU1FX1NDQU5PVVRQT1NfTUVUSE9EOworCWlmIChpbnZibCkKKwkJdmJsX3N0YXR1cyB8PSBEUk1fVkJMQU5LVElNRV9JTlZCTDsKKworCXJldHVybiB2Ymxfc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTChkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKTsKKworLyoqCisgKiBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wIC0gcmV0cmlldmUgcmF3IHRpbWVzdGFtcCBmb3IgdGhlIG1vc3QgcmVjZW50CisgKiB2YmxhbmsgaW50ZXJ2YWwuCisgKgorICogQGRldjogRFJNIGRldmljZQorICogQGNydGM6IHdoaWNoIGNydGMncyB2YmxhbmsgdGltZXN0YW1wIHRvIHJldHJpZXZlCisgKiBAdHZibGFuazogUG9pbnRlciB0byB0YXJnZXQgc3RydWN0IHRpbWV2YWwgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHRpbWVzdGFtcAorICogQGZsYWdzOiBGbGFncyB0byBwYXNzIHRvIGRyaXZlcjoKKyAqICAgICAgICAgMCA9IERlZmF1bHQuCisgKiAgICAgICAgIERSTV9DQUxMRURfRlJPTV9WQkxJUlEgPSBJZiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB2YmwgaXJxIGhhbmRsZXIuCisgKgorICogRmV0Y2hlcyB0aGUgc3lzdGVtIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudAorICogdmJsYW5rIGludGVydmFsIG9uIHNwZWNpZmllZCBjcnRjLiBNYXkgY2FsbCBpbnRvIGttcy1kcml2ZXIgdG8KKyAqIGNvbXB1dGUgdGhlIHRpbWVzdGFtcCB3aXRoIGEgaGlnaC1wcmVjaXNpb24gR1BVIHNwZWNpZmljIG1ldGhvZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGltZXN0YW1wIG9yaWdpbmF0ZXMgZnJvbSB1bmNvcnJlY3RlZCBkb19nZXR0aW1lb2ZkYXkoKQorICogY2FsbCwgaS5lLiwgaXQgaXNuJ3QgdmVyeSBwcmVjaXNlbHkgbG9ja2VkIHRvIHRoZSB0cnVlIHZibGFuay4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRpbWVzdGFtcCBpcyBjb25zaWRlcmVkIHRvIGJlIHZlcnkgcHJlY2lzZS4KKyAqLwordTMyIGRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdHZibGFuaywgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBEZWZpbmUgcmVxdWVzdGVkIG1heGltdW0gZXJyb3Igb24gdGltZXN0YW1wcyAobmFub3NlY29uZHMpLiAqLworCWludCBtYXhfZXJyb3IgPSAoaW50KSBkcm1fdGltZXN0YW1wX3ByZWNpc2lvbiAqIDEwMDA7CisKKwkvKiBRdWVyeSBkcml2ZXIgaWYgcG9zc2libGUgYW5kIHByZWNpc2lvbiB0aW1lc3RhbXBpbmcgZW5hYmxlZC4gKi8KKwlpZiAoZGV2LT5kcml2ZXItPmdldF92YmxhbmtfdGltZXN0YW1wICYmIChtYXhfZXJyb3IgPiAwKSkgeworCQlyZXQgPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua190aW1lc3RhbXAoZGV2LCBjcnRjLCAmbWF4X2Vycm9yLAorCQkJCQkJCXR2YmxhbmssIGZsYWdzKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gKHUzMikgcmV0OworCX0KKworCS8qIEdQVSBoaWdoIHByZWNpc2lvbiB0aW1lc3RhbXAgcXVlcnkgdW5zdXBwb3J0ZWQgb3IgZmFpbGVkLgorCSAqIFJldHVybiBnZXR0aW1lb2ZkYXkgdGltZXN0YW1wIGFzIGJlc3QgZXN0aW1hdGUuCisJICovCisJZG9fZ2V0dGltZW9mZGF5KHR2YmxhbmspOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXApOworCisvKioKICAqIGRybV92YmxhbmtfY291bnQgLSByZXRyaWV2ZSAiY29va2VkIiB2YmxhbmsgY291bnRlciB2YWx1ZQogICogQGRldjogRFJNIGRldmljZQogICogQGNydGM6IHdoaWNoIGNvdW50ZXIgdG8gcmV0cmlldmUKQEAgLTM3NSw2ICs3NjgsNDAgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19jb3VudCk7CiAKIC8qKgorICogZHJtX3ZibGFua19jb3VudF9hbmRfdGltZSAtIHJldHJpZXZlICJjb29rZWQiIHZibGFuayBjb3VudGVyIHZhbHVlCisgKiBhbmQgdGhlIHN5c3RlbSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGF0IHZibGFuayBjb3VudGVyIHZhbHVlLgorICoKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIHJldHJpZXZlCisgKiBAdmJsYW5rdGltZTogUG9pbnRlciB0byBzdHJ1Y3QgdGltZXZhbCB0byByZWNlaXZlIHRoZSB2YmxhbmsgdGltZXN0YW1wLgorICoKKyAqIEZldGNoZXMgdGhlICJjb29rZWQiIHZibGFuayBjb3VudCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZgorICogdmJsYW5rIGV2ZW50cyBzaW5jZSB0aGUgc3lzdGVtIHdhcyBib290ZWQsIGluY2x1ZGluZyBsb3N0IGV2ZW50cyBkdWUgdG8KKyAqIG1vZGVzZXR0aW5nIGFjdGl2aXR5LiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgc3lzdGVtIHRpbWVzdGFtcCBvZiB0aGUgdGltZQorICogb2YgdGhlIHZibGFuayBpbnRlcnZhbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIHZibGFuayBjb3VudGVyCisgKiB2YWx1ZS4KKyAqLwordTMyIGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSkKK3sKKwl1MzIgY3VyX3ZibGFuazsKKworCS8qIFJlYWQgdGltZXN0YW1wIGZyb20gc2xvdCBvZiBfdmJsYW5rX3RpbWUgcmluZ2J1ZmZlcgorCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gY3VycmVudCB2YmxhbmsgY291bnQuIFJldHJ5IGlmCisJICogY291bnQgaGFzIGluY3JlbWVudGVkIGR1cmluZyByZWFkb3V0LiBUaGlzIHdvcmtzIGxpa2UKKwkgKiBhIHNlcWxvY2suCisJICovCisJZG8geworCQljdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSk7CisJCSp2Ymxhbmt0aW1lID0gdmJsYW5rdGltZXN0YW1wKGRldiwgY3J0YywgY3VyX3ZibGFuayk7CisJCXNtcF9ybWIoKTsKKwl9IHdoaWxlIChjdXJfdmJsYW5rICE9IGF0b21pY19yZWFkKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pKTsKKworCXJldHVybiBjdXJfdmJsYW5rOworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKTsKKworLyoqCiAgKiBkcm1fdXBkYXRlX3ZibGFua19jb3VudCAtIHVwZGF0ZSB0aGUgbWFzdGVyIHZibGFuayBjb3VudGVyCiAgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKiBAY3J0YzogY291bnRlciB0byB1cGRhdGUKQEAgLTM5Miw3ICs4MTksOCBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdXBkYXRlX3ZibGFua19jb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKLQl1MzIgY3VyX3ZibGFuaywgZGlmZjsKKwl1MzIgY3VyX3ZibGFuaywgZGlmZiwgdHNsb3QsIHJjOworCXN0cnVjdCB0aW1ldmFsIHRfdmJsYW5rOwogCiAJLyoKIAkgKiBJbnRlcnJ1cHRzIHdlcmUgZGlzYWJsZWQgcHJpb3IgdG8gdGhpcyBjYWxsLCBzbyBkZWFsIHdpdGggY291bnRlcgpAQCAtNDAwLDggKzgyOCwxOCBAQAogCSAqIE5PVEUhICBJdCdzIHBvc3NpYmxlIHdlIGxvc3QgYSBmdWxsIGRldi0+bWF4X3ZibGFua19jb3VudCBldmVudHMKIAkgKiBoZXJlIGlmIHRoZSByZWdpc3RlciBpcyBzbWFsbCBvciB3ZSBoYWQgdmJsYW5rIGludGVycnVwdHMgb2ZmIGZvcgogCSAqIGEgbG9uZyB0aW1lLgorCSAqCisJICogV2UgcmVwZWF0IHRoZSBoYXJkd2FyZSB2YmxhbmsgY291bnRlciAmIHRpbWVzdGFtcCBxdWVyeSB1bnRpbAorCSAqIHdlIGdldCBjb25zaXN0ZW50IHJlc3VsdHMuIFRoaXMgdG8gcHJldmVudCByYWNlcyBiZXR3ZWVuIGdwdQorCSAqIHVwZGF0aW5nIGl0cyBoYXJkd2FyZSBjb3VudGVyIHdoaWxlIHdlIGFyZSByZXRyaWV2aW5nIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgdmJsYW5rIHRpbWVzdGFtcC4KIAkgKi8KLQljdXJfdmJsYW5rID0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGNydGMpOworCWRvIHsKKwkJY3VyX3ZibGFuayA9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKTsKKwkJcmMgPSBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wKGRldiwgY3J0YywgJnRfdmJsYW5rLCAwKTsKKwl9IHdoaWxlIChjdXJfdmJsYW5rICE9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKSk7CisKKwkvKiBEZWFsIHdpdGggY291bnRlciB3cmFwICovCiAJZGlmZiA9IGN1cl92YmxhbmsgLSBkZXYtPmxhc3RfdmJsYW5rW2NydGNdOwogCWlmIChjdXJfdmJsYW5rIDwgZGV2LT5sYXN0X3ZibGFua1tjcnRjXSkgewogCQlkaWZmICs9IGRldi0+bWF4X3ZibGFua19jb3VudDsKQEAgLTQxMyw2ICs4NTEsMTYgQEAKIAlEUk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBpbnRlcnJ1cHRzIG9uIGNydGMgJWQsIG1pc3NlZCAlZFxuIiwKIAkJICBjcnRjLCBkaWZmKTsKIAorCS8qIFJlaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHZibGFuayB0aW1lc3RhbXAgaWYgaGlnaC1wcmVjaXNpb24gcXVlcnkKKwkgKiBhdmFpbGFibGUuIFNraXAgdGhpcyBzdGVwIGlmIHF1ZXJ5IHVuc3VwcG9ydGVkIG9yIGZhaWxlZC4gV2lsbAorCSAqIHJlaW5pdGlhbGl6ZSBkZWxheWVkIGF0IG5leHQgdmJsYW5rIGludGVycnVwdCBpbiB0aGF0IGNhc2UuCisJICovCisJaWYgKHJjKSB7CisJCXRzbG90ID0gYXRvbWljX3JlYWQoJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSkgKyBkaWZmOworCQl2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCB0c2xvdCkgPSB0X3ZibGFuazsKKwkJc21wX3dtYigpOworCX0KKwogCWF0b21pY19hZGQoZGlmZiwgJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSk7CiB9CiAKQEAgLTQyOSwxNSArODc3LDI3IEBACiAgKi8KIGludCBkcm1fdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGlycWZsYWdzMjsKIAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAJLyogR29pbmcgZnJvbSAwLT4xIG1lYW5zIHdlIGhhdmUgdG8gZW5hYmxlIGludGVycnVwdHMgYWdhaW4gKi8KIAlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKSA9PSAxKSB7CisJCS8qIERpc2FibGUgcHJlZW1wdGlvbiB3aGlsZSBob2xkaW5nIHZibGFua190aW1lX2xvY2suIERvCisJCSAqIGl0IGV4cGxpY2l0ZWx5IHRvIGd1YXJkIGFnYWluc3QgUFJFRU1QVF9SVCBrZXJuZWwuCisJCSAqLworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MyKTsKIAkJaWYgKCFkZXYtPnZibGFua19lbmFibGVkW2NydGNdKSB7CisJCQkvKiBFbmFibGUgdmJsYW5rIGlycXMgdW5kZXIgdmJsYW5rX3RpbWVfbG9jayBwcm90ZWN0aW9uLgorCQkJICogQWxsIHZibGFuayBjb3VudCAmIHRpbWVzdGFtcCB1cGRhdGVzIGFyZSBoZWxkIG9mZgorCQkJICogdW50aWwgd2UgYXJlIGRvbmUgcmVpbml0aWFsaXppbmcgbWFzdGVyIGNvdW50ZXIgYW5kCisJCQkgKiB0aW1lc3RhbXBzLiBGaWx0ZXJjb2RlIGluIGRybV9oYW5kbGVfdmJsYW5rKCkgd2lsbAorCQkJICogcHJldmVudCBkb3VibGUtYWNjb3VudGluZyBvZiBzYW1lIHZibGFuayBpbnRlcnZhbC4KKwkJCSAqLwogCQkJcmV0ID0gZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsoZGV2LCBjcnRjKTsKLQkJCURSTV9ERUJVRygiZW5hYmxpbmcgdmJsYW5rIG9uIGNydGMgJWQsIHJldDogJWRcbiIsIGNydGMsIHJldCk7CisJCQlEUk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBvbiBjcnRjICVkLCByZXQ6ICVkXG4iLAorCQkJCSAgY3J0YywgcmV0KTsKIAkJCWlmIChyZXQpCiAJCQkJYXRvbWljX2RlYygmZGV2LT52YmxhbmtfcmVmY291bnRbY3J0Y10pOwogCQkJZWxzZSB7CkBAIC00NDUsNiArOTA1LDggQEAKIAkJCQlkcm1fdXBkYXRlX3ZibGFua19jb3VudChkZXYsIGNydGMpOwogCQkJfQogCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MyKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKIAl9IGVsc2UgewogCQlpZiAoIWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10pIHsKIAkJCWF0b21pY19kZWMoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKTsKQEAgLTQ2MywxNSArOTI1LDE3IEBACiAgKiBAY3J0Yzogd2hpY2ggY291bnRlciB0byBnaXZlIHVwCiAgKgogICogUmVsZWFzZSBvd25lcnNoaXAgb2YgYSBnaXZlbiB2YmxhbmsgY291bnRlciwgdHVybmluZyBvZmYgaW50ZXJydXB0cwotICogaWYgcG9zc2libGUuCisgKiBpZiBwb3NzaWJsZS4gRGlzYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGRybV92Ymxhbmtfb2ZmZGVsYXkgbWlsbGlzZWNvbmRzLgogICovCiB2b2lkIGRybV92YmxhbmtfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQogewotCUJVR19PTiAoYXRvbWljX3JlYWQgKCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgPT0gMCk7CisJQlVHX09OKGF0b21pY19yZWFkKCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgPT0gMCk7CiAKIAkvKiBMYXN0IHVzZXIgc2NoZWR1bGVzIGludGVycnVwdCBkaXNhYmxlICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKSkKLQkJbW9kX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLCBqaWZmaWVzICsgNSpEUk1fSFopOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgJiYKKwkgICAgKGRybV92Ymxhbmtfb2ZmZGVsYXkgPiAwKSkKKwkJbW9kX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLAorCQkJICBqaWZmaWVzICsgKChkcm1fdmJsYW5rX29mZmRlbGF5ICogRFJNX0haKS8xMDAwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV92YmxhbmtfcHV0KTsKIApAQCAtNDgwLDEwICs5NDQsOCBAQAogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayhkZXYsIGNydGMpOworCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgY3J0Yyk7CiAJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWVbY3J0Y10pOwotCWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10gPSAwOwotCWRldi0+bGFzdF92YmxhbmtbY3J0Y10gPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgY3J0Yyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX29mZik7CkBAIC02MDIsNyArMTA2NCw2IEBACiAJZS0+YmFzZS5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CiAJZS0+YmFzZS5kZXN0cm95ID0gKHZvaWQgKCopIChzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgKikpIGtmcmVlOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAogCWlmIChmaWxlX3ByaXYtPmV2ZW50X3NwYWNlIDwgc2l6ZW9mIGUtPmV2ZW50KSB7CkBAIC02MTEsNyArMTA3Miw4IEBACiAJfQogCiAJZmlsZV9wcml2LT5ldmVudF9zcGFjZSAtPSBzaXplb2YgZS0+ZXZlbnQ7Ci0Jc2VxID0gZHJtX3ZibGFua19jb3VudChkZXYsIHBpcGUpOworCXNlcSA9IGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoZGV2LCBwaXBlLCAmbm93KTsKKwogCWlmICgodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKIAkgICAgKHNlcSAtIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgewogCQl2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKQEAgLTYyNiwxNSArMTA4OCwxOCBAQAogCiAJZS0+ZXZlbnQuc2VxdWVuY2UgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlOwogCWlmICgoc2VxIC0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSB7CisJCWUtPmV2ZW50LnNlcXVlbmNlID0gc2VxOwogCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOwogCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CiAJCWRybV92YmxhbmtfcHV0KGRldiwgcGlwZSk7CiAJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gc2VxOwogCQl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50X2RlbGl2ZXJlZChjdXJyZW50LT5waWQsIHBpcGUsCiAJCQkJCQkgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCk7CisJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKQEAgLTcyNywxMSArMTE5MiwxMCBAQAogCWlmIChyZXQgIT0gLUVJTlRSKSB7CiAJCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAotCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7Ci0KKwkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgY3J0YywgJm5vdyk7CiAJCXZibHdhaXQtPnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKIAkJdmJsd2FpdC0+cmVwbHkudHZhbF91c2VjID0gbm93LnR2X3VzZWM7Ci0JCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gZHJtX3ZibGFua19jb3VudChkZXYsIGNydGMpOworCiAJCURSTV9ERUJVRygicmV0dXJuaW5nICVkIHRvIGNsaWVudFxuIiwKIAkJCSAgdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UpOwogCX0gZWxzZSB7CkBAIC03NTAsOCArMTIxNCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc2VxOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXNlcSA9IGRybV92YmxhbmtfY291bnQoZGV2LCBjcnRjKTsKKwlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgY3J0YywgJm5vdyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAKQEAgLTc4OSwxMSArMTI1Miw2NCBAQAogICovCiB2b2lkIGRybV9oYW5kbGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQogeworCXUzMiB2Ymxjb3VudDsKKwlzNjQgZGlmZl9uczsKKwlzdHJ1Y3QgdGltZXZhbCB0dmJsYW5rOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKIAlpZiAoIWRldi0+bnVtX2NydGNzKQogCQlyZXR1cm47CiAKLQlhdG9taWNfaW5jKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCS8qIE5lZWQgdGltZXN0YW1wIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGV4ZWN1dGlvbiB3aXRoCisJICogdmJsYW5rIGVuYWJsZS9kaXNhYmxlLCBhcyB0aGlzIHdvdWxkIGNhdXNlIGluY29uc2lzdGVudAorCSAqIG9yIGNvcnJ1cHRlZCB0aW1lc3RhbXBzIGFuZCB2YmxhbmsgY291bnRzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKKworCS8qIFZibGFuayBpcnEgaGFuZGxpbmcgZGlzYWJsZWQuIE5vdGhpbmcgdG8gZG8uICovCisJaWYgKCFkZXYtPnZibGFua19lbmFibGVkW2NydGNdKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogRmV0Y2ggY29ycmVzcG9uZGluZyB0aW1lc3RhbXAgZm9yIHRoaXMgdmJsYW5rIGludGVydmFsIGZyb20KKwkgKiBkcml2ZXIgYW5kIHN0b3JlIGl0IGluIHByb3BlciBzbG90IG9mIHRpbWVzdGFtcCByaW5nYnVmZmVyLgorCSAqLworCisJLyogR2V0IGN1cnJlbnQgdGltZXN0YW1wIGFuZCBjb3VudC4gKi8KKwl2Ymxjb3VudCA9IGF0b21pY19yZWFkKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCWRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoZGV2LCBjcnRjLCAmdHZibGFuaywgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSk7CisKKwkvKiBDb21wdXRlIHRpbWUgZGlmZmVyZW5jZSB0byB0aW1lc3RhbXAgb2YgbGFzdCB2YmxhbmsgKi8KKwlkaWZmX25zID0gdGltZXZhbF90b19ucygmdHZibGFuaykgLQorCQkgIHRpbWV2YWxfdG9fbnMoJnZibGFua3RpbWVzdGFtcChkZXYsIGNydGMsIHZibGNvdW50KSk7CisKKwkvKiBVcGRhdGUgdmJsYW5rIHRpbWVzdGFtcCBhbmQgY291bnQgaWYgYXQgbGVhc3QKKwkgKiBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMgbmFub3NlY29uZHMKKwkgKiBkaWZmZXJlbmNlIGJldHdlZW4gbGFzdCBzdG9yZWQgdGltZXN0YW1wIGFuZCBjdXJyZW50CisJICogdGltZXN0YW1wLiBBIHNtYWxsZXIgZGlmZmVyZW5jZSBtZWFucyBiYXNpY2FsbHkKKwkgKiBpZGVudGljYWwgdGltZXN0YW1wcy4gSGFwcGVucyBpZiB0aGlzIHZibGFuayBoYXMKKwkgKiBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCB0aGlzIGlzIGEgcmVkdW5kYW50IGNhbGwsCisJICogZS5nLiwgZHVlIHRvIHNwdXJpb3VzIHZibGFuayBpbnRlcnJ1cHRzLiBXZSBuZWVkIHRvCisJICogaWdub3JlIHRob3NlIGZvciBhY2NvdW50aW5nLgorCSAqLworCWlmIChhYnMoZGlmZl9ucykgPiBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMpIHsKKwkJLyogU3RvcmUgbmV3IHRpbWVzdGFtcCBpbiByaW5nYnVmZmVyLiAqLworCQl2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCB2Ymxjb3VudCArIDEpID0gdHZibGFuazsKKwkJc21wX3dtYigpOworCisJCS8qIEluY3JlbWVudCBjb29rZWQgdmJsYW5rIGNvdW50LiBUaGlzIGFsc28gYXRvbWljYWxseSBjb21taXRzCisJCSAqIHRoZSB0aW1lc3RhbXAgY29tcHV0ZWQgYWJvdmUuCisJCSAqLworCQlhdG9taWNfaW5jKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCX0gZWxzZSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogUmVkdW5kYW50IHZibGlycSBpZ25vcmVkLiBkaWZmX25zID0gJWRcbiIsCisJCQkgIGNydGMsIChpbnQpIGRpZmZfbnMpOworCX0KKwogCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlW2NydGNdKTsKIAlkcm1faGFuZGxlX3ZibGFua19ldmVudHMoZGV2LCBjcnRjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChkcm1faGFuZGxlX3ZibGFuayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKaW5kZXggYTZiZmMzMC4uYzU5NTE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwpAQCAtMzkyLDEwICszOTIsMzYgQEAKIAltbS0+c2Nhbm5lZF9ibG9ja3MgPSAwOwogCW1tLT5zY2FuX2hpdF9zdGFydCA9IDA7CiAJbW0tPnNjYW5faGl0X3NpemUgPSAwOworCW1tLT5zY2FuX2NoZWNrX3JhbmdlID0gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21tX2luaXRfc2Nhbik7CiAKIC8qKgorICogSW5pdGlhbGl6YSBscnUgc2Nhbm5pbmcuCisgKgorICogVGhpcyBzaW1wbHkgc2V0cyB1cCB0aGUgc2Nhbm5pbmcgcm91dGluZXMgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlc2lyZWQKKyAqIGhvbGUuIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmFuZ2UtcmVzdHJpY3RlZCBzY2Fucy4KKyAqCisgKiBXYXJuaW5nOiBBcyBsb25nIGFzIHRoZSBzY2FuIGxpc3QgaXMgbm9uLWVtcHR5LCBubyBvdGhlciBvcGVyYXRpb25zIHRoYW4KKyAqIGFkZGluZy9yZW1vdmluZyBub2RlcyB0by9mcm9tIHRoZSBzY2FuIGxpc3QgYXJlIGFsbG93ZWQuCisgKi8KK3ZvaWQgZHJtX21tX2luaXRfc2Nhbl93aXRoX3JhbmdlKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJbW0tPnNjYW5fYWxpZ25tZW50ID0gYWxpZ25tZW50OworCW1tLT5zY2FuX3NpemUgPSBzaXplOworCW1tLT5zY2FubmVkX2Jsb2NrcyA9IDA7CisJbW0tPnNjYW5faGl0X3N0YXJ0ID0gMDsKKwltbS0+c2Nhbl9oaXRfc2l6ZSA9IDA7CisJbW0tPnNjYW5fc3RhcnQgPSBzdGFydDsKKwltbS0+c2Nhbl9lbmQgPSBlbmQ7CisJbW0tPnNjYW5fY2hlY2tfcmFuZ2UgPSAxOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW1faW5pdF9zY2FuX3dpdGhfcmFuZ2UpOworCisvKioKICAqIEFkZCBhIG5vZGUgdG8gdGhlIHNjYW4gbGlzdCB0aGF0IG1pZ2h0IGJlIGZyZWVkIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBkZXNpcmVkCiAgKiBob2xlLgogICoKQEAgLTQwNiw2ICs0MzIsOCBAQAogCXN0cnVjdCBkcm1fbW0gKm1tID0gbm9kZS0+bW07CiAJc3RydWN0IGxpc3RfaGVhZCAqcHJldl9mcmVlLCAqbmV4dF9mcmVlOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqcHJldl9ub2RlLCAqbmV4dF9ub2RlOworCXVuc2lnbmVkIGxvbmcgYWRqX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgYWRqX2VuZDsKIAogCW1tLT5zY2FubmVkX2Jsb2NrcysrOwogCkBAIC00NTIsNyArNDgwLDE3IEBACiAJbm9kZS0+ZnJlZV9zdGFjay5wcmV2ID0gcHJldl9mcmVlOwogCW5vZGUtPmZyZWVfc3RhY2submV4dCA9IG5leHRfZnJlZTsKIAotCWlmIChjaGVja19mcmVlX2hvbGUobm9kZS0+c3RhcnQsIG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZSwKKwlpZiAobW0tPnNjYW5fY2hlY2tfcmFuZ2UpIHsKKwkJYWRqX3N0YXJ0ID0gbm9kZS0+c3RhcnQgPCBtbS0+c2Nhbl9zdGFydCA/CisJCQltbS0+c2Nhbl9zdGFydCA6IG5vZGUtPnN0YXJ0OworCQlhZGpfZW5kID0gbm9kZS0+c3RhcnQgKyBub2RlLT5zaXplID4gbW0tPnNjYW5fZW5kID8KKwkJCW1tLT5zY2FuX2VuZCA6IG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZTsKKwl9IGVsc2UgeworCQlhZGpfc3RhcnQgPSBub2RlLT5zdGFydDsKKwkJYWRqX2VuZCA9IG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZTsKKwl9CisKKwlpZiAoY2hlY2tfZnJlZV9ob2xlKGFkal9zdGFydCAsIGFkal9lbmQsCiAJCQkgICAgbW0tPnNjYW5fc2l6ZSwgbW0tPnNjYW5fYWxpZ25tZW50KSkgewogCQltbS0+c2Nhbl9oaXRfc3RhcnQgPSBub2RlLT5zdGFydDsKIAkJbW0tPnNjYW5faGl0X3NpemUgPSBub2RlLT5zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwppbmRleCBjZGM4OWVlLi5kNTllZGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwpAQCAtNDAsMTIgKzQwLDIyIEBACiB1bnNpZ25lZCBpbnQgZHJtX2RlYnVnID0gMDsJLyogMSB0byBlbmFibGUgZGVidWcgb3V0cHV0ICovCiBFWFBPUlRfU1lNQk9MKGRybV9kZWJ1Zyk7CiAKK3Vuc2lnbmVkIGludCBkcm1fdmJsYW5rX29mZmRlbGF5ID0gNTAwMDsgICAgLyogRGVmYXVsdCB0byA1MDAwIG1zZWNzLiAqLworRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX29mZmRlbGF5KTsKKwordW5zaWduZWQgaW50IGRybV90aW1lc3RhbXBfcHJlY2lzaW9uID0gMjA7ICAvKiBEZWZhdWx0IHRvIDIwIHVzZWNzLiAqLworRVhQT1JUX1NZTUJPTChkcm1fdGltZXN0YW1wX3ByZWNpc2lvbik7CisKIE1PRFVMRV9BVVRIT1IoQ09SRV9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKENPUkVfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBvdXRwdXQiKTsKK01PRFVMRV9QQVJNX0RFU0ModmJsYW5rb2ZmZGVsYXksICJEZWxheSB1bnRpbCB2YmxhbmsgaXJxIGF1dG8tZGlzYWJsZSBbbXNlY3NdIik7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVzdGFtcF9wcmVjaXNpb25fdXNlYywgIk1heC4gZXJyb3Igb24gdGltZXN0YW1wcyBbdXNlY3NdIik7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHJtX2RlYnVnLCBpbnQsIDA2MDApOworbW9kdWxlX3BhcmFtX25hbWVkKHZibGFua29mZmRlbGF5LCBkcm1fdmJsYW5rX29mZmRlbGF5LCBpbnQsIDA2MDApOworbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVzdGFtcF9wcmVjaXNpb25fdXNlYywgZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24sIGludCwgMDYwMCk7CiAKIHN0cnVjdCBpZHIgZHJtX21pbm9yc19pZHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKaW5kZXggZmRjODMzZC4uMGFlNmE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTksNiArOSw4IEBACiAJICBpOTE1X2dlbS5vIFwKIAkgIGk5MTVfZ2VtX2RlYnVnLm8gXAogCSAgaTkxNV9nZW1fZXZpY3QubyBcCisJICBpOTE1X2dlbV9leGVjYnVmZmVyLm8gXAorCSAgaTkxNV9nZW1fZ3R0Lm8gXAogCSAgaTkxNV9nZW1fdGlsaW5nLm8gXAogCSAgaTkxNV90cmFjZV9wb2ludHMubyBcCiAJICBpbnRlbF9kaXNwbGF5Lm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCAxZjRmM2NlLi4zNjAxNDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9yaW5nYnVmZmVyLmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogCkBAIC03Miw3ICs3Myw2IEBACiAJQihpc19icm9hZHdhdGVyKTsKIAlCKGlzX2NyZXN0bGluZSk7CiAJQihoYXNfZmJjKTsKLQlCKGhhc19yYzYpOwogCUIoaGFzX3BpcGVfY3hzcik7CiAJQihoYXNfaG90cGx1Zyk7CiAJQihjdXJzb3JfbmVlZHNfcGh5c2ljYWwpOwpAQCAtODYsMTkgKzg2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfcGluX2ZsYWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2KQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9waW5fZmxhZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCWlmIChvYmpfcHJpdi0+dXNlcl9waW5fY291bnQgPiAwKQorCWlmIChvYmotPnVzZXJfcGluX2NvdW50ID4gMCkKIAkJcmV0dXJuICJQIjsKLQllbHNlIGlmIChvYmpfcHJpdi0+cGluX2NvdW50ID4gMCkKKwllbHNlIGlmIChvYmotPnBpbl9jb3VudCA+IDApCiAJCXJldHVybiAicCI7CiAJZWxzZQogCQlyZXR1cm4gIiAiOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X3RpbGluZ19mbGFnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdikKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfdGlsaW5nX2ZsYWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLSAgICBzd2l0Y2ggKG9ial9wcml2LT50aWxpbmdfbW9kZSkgeworICAgIHN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgewogICAgIGRlZmF1bHQ6CiAgICAgY2FzZSBJOTE1X1RJTElOR19OT05FOiByZXR1cm4gIiAiOwogICAgIGNhc2UgSTkxNV9USUxJTkdfWDogcmV0dXJuICJYIjsKQEAgLTEwNiwxMCArMTA2LDE5IEBACiAgICAgfQogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYWdwX3R5cGVfc3RyKGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMDogcmV0dXJuICIgdW5jYWNoZWQiOworCWNhc2UgMTogcmV0dXJuICIgc25vb3BlZCI7CisJZGVmYXVsdDogcmV0dXJuICIiOworCX0KK30KKwogc3RhdGljIHZvaWQKIGRlc2NyaWJlX29iaihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc2VxX3ByaW50ZihtLCAiJXA6ICVzJXMgJTh6ZCAlMDh4ICUwOHggJWQlcyVzIiwKKwlzZXFfcHJpbnRmKG0sICIlcDogJXMlcyAlOHpkICUwNHggJTA0eCAlZCAlZCVzJXMlcyIsCiAJCSAgICZvYmotPmJhc2UsCiAJCSAgIGdldF9waW5fZmxhZyhvYmopLAogCQkgICBnZXRfdGlsaW5nX2ZsYWcob2JqKSwKQEAgLTExNyw2ICsxMjYsOCBAQAogCQkgICBvYmotPmJhc2UucmVhZF9kb21haW5zLAogCQkgICBvYmotPmJhc2Uud3JpdGVfZG9tYWluLAogCQkgICBvYmotPmxhc3RfcmVuZGVyaW5nX3NlcW5vLAorCQkgICBvYmotPmxhc3RfZmVuY2VkX3NlcW5vLAorCQkgICBhZ3BfdHlwZV9zdHIob2JqLT5hZ3BfdHlwZSA9PSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZKSwKIAkJICAgb2JqLT5kaXJ0eSA/ICIgZGlydHkiIDogIiIsCiAJCSAgIG9iai0+bWFkdiA9PSBJOTE1X01BRFZfRE9OVE5FRUQgPyAiIHB1cmdlYWJsZSIgOiAiIik7CiAJaWYgKG9iai0+YmFzZS5uYW1lKQpAQCAtMTI0LDcgKzEzNSwxNyBAQAogCWlmIChvYmotPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQogCQlzZXFfcHJpbnRmKG0sICIgKGZlbmNlOiAlZCkiLCBvYmotPmZlbmNlX3JlZyk7CiAJaWYgKG9iai0+Z3R0X3NwYWNlICE9IE5VTEwpCi0JCXNlcV9wcmludGYobSwgIiAoZ3R0X29mZnNldDogJTA4eCkiLCBvYmotPmd0dF9vZmZzZXQpOworCQlzZXFfcHJpbnRmKG0sICIgKGd0dCBvZmZzZXQ6ICUwOHgsIHNpemU6ICUwOHgpIiwKKwkJCSAgIG9iai0+Z3R0X29mZnNldCwgKHVuc2lnbmVkIGludClvYmotPmd0dF9zcGFjZS0+c2l6ZSk7CisJaWYgKG9iai0+cGluX21hcHBhYmxlIHx8IG9iai0+ZmF1bHRfbWFwcGFibGUpIHsKKwkJY2hhciBzWzNdLCAqdCA9IHM7CisJCWlmIChvYmotPnBpbl9tYXBwYWJsZSkKKwkJCSp0KysgPSAncCc7CisJCWlmIChvYmotPmZhdWx0X21hcHBhYmxlKQorCQkJKnQrKyA9ICdmJzsKKwkJKnQgPSAnXDAnOworCQlzZXFfcHJpbnRmKG0sICIgKCVzIG1hcHBhYmxlKSIsIHMpOworCX0KIAlpZiAob2JqLT5yaW5nICE9IE5VTEwpCiAJCXNlcV9wcmludGYobSwgIiAoJXMpIiwgb2JqLT5yaW5nLT5uYW1lKTsKIH0KQEAgLTEzNiw3ICsxNTcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc2l6ZV90IHRvdGFsX29ial9zaXplLCB0b3RhbF9ndHRfc2l6ZTsKIAlpbnQgY291bnQsIHJldDsKIApAQCAtMTcxLDEyICsxOTIsMTIgQEAKIAl9CiAKIAl0b3RhbF9vYmpfc2l6ZSA9IHRvdGFsX2d0dF9zaXplID0gY291bnQgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsIGhlYWQsIG1tX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgaGVhZCwgbW1fbGlzdCkgewogCQlzZXFfcHJpbnRmKG0sICIgICAiKTsKLQkJZGVzY3JpYmVfb2JqKG0sIG9ial9wcml2KTsKKwkJZGVzY3JpYmVfb2JqKG0sIG9iaik7CiAJCXNlcV9wcmludGYobSwgIlxuIik7Ci0JCXRvdGFsX29ial9zaXplICs9IG9ial9wcml2LT5iYXNlLnNpemU7Ci0JCXRvdGFsX2d0dF9zaXplICs9IG9ial9wcml2LT5ndHRfc3BhY2UtPnNpemU7CisJCXRvdGFsX29ial9zaXplICs9IG9iai0+YmFzZS5zaXplOworCQl0b3RhbF9ndHRfc2l6ZSArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKIAkJY291bnQrKzsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xODYsMzAgKzIwNywxMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBjb3VudF9vYmplY3RzKGxpc3QsIG1lbWJlcikgZG8geyBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIGxpc3QsIG1lbWJlcikgeyBcCisJCXNpemUgKz0gb2JqLT5ndHRfc3BhY2UtPnNpemU7IFwKKwkJKytjb3VudDsgXAorCQlpZiAob2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSkgeyBcCisJCQltYXBwYWJsZV9zaXplICs9IG9iai0+Z3R0X3NwYWNlLT5zaXplOyBcCisJCQkrK21hcHBhYmxlX2NvdW50OyBcCisJCX0gXAorCX0gXAorfSB3aGlsZSgwKQorCiBzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCogZGF0YSkKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGNvdW50LCBtYXBwYWJsZV9jb3VudDsKKwlzaXplX3Qgc2l6ZSwgbWFwcGFibGVfc2l6ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc2VxX3ByaW50ZihtLCAiJXUgb2JqZWN0c1xuIiwgZGV2X3ByaXYtPm1tLm9iamVjdF9jb3VudCk7Ci0Jc2VxX3ByaW50ZihtLCAiJXp1IG9iamVjdCBieXRlc1xuIiwgZGV2X3ByaXYtPm1tLm9iamVjdF9tZW1vcnkpOwotCXNlcV9wcmludGYobSwgIiV1IHBpbm5lZFxuIiwgZGV2X3ByaXYtPm1tLnBpbl9jb3VudCk7Ci0Jc2VxX3ByaW50ZihtLCAiJXp1IHBpbiBieXRlc1xuIiwgZGV2X3ByaXYtPm1tLnBpbl9tZW1vcnkpOwotCXNlcV9wcmludGYobSwgIiV1IG9iamVjdHMgaW4gZ3R0XG4iLCBkZXZfcHJpdi0+bW0uZ3R0X2NvdW50KTsKLQlzZXFfcHJpbnRmKG0sICIlenUgZ3R0IGJ5dGVzXG4iLCBkZXZfcHJpdi0+bW0uZ3R0X21lbW9yeSk7Ci0Jc2VxX3ByaW50ZihtLCAiJXp1IGd0dCB0b3RhbFxuIiwgZGV2X3ByaXYtPm1tLmd0dF90b3RhbCk7CisJc2VxX3ByaW50ZihtLCAiJXUgb2JqZWN0cywgJXp1IGJ5dGVzXG4iLAorCQkgICBkZXZfcHJpdi0+bW0ub2JqZWN0X2NvdW50LAorCQkgICBkZXZfcHJpdi0+bW0ub2JqZWN0X21lbW9yeSk7CisKKwlzaXplID0gY291bnQgPSBtYXBwYWJsZV9zaXplID0gbWFwcGFibGVfY291bnQgPSAwOworCWNvdW50X29iamVjdHMoJmRldl9wcml2LT5tbS5ndHRfbGlzdCwgZ3R0X2xpc3QpOworCXNlcV9wcmludGYobSwgIiV1IFsldV0gb2JqZWN0cywgJXp1IFslenVdIGJ5dGVzIGluIGd0dFxuIiwKKwkJICAgY291bnQsIG1hcHBhYmxlX2NvdW50LCBzaXplLCBtYXBwYWJsZV9zaXplKTsKKworCXNpemUgPSBjb3VudCA9IG1hcHBhYmxlX3NpemUgPSBtYXBwYWJsZV9jb3VudCA9IDA7CisJY291bnRfb2JqZWN0cygmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KTsKKwljb3VudF9vYmplY3RzKCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwgbW1fbGlzdCk7CisJc2VxX3ByaW50ZihtLCAiICAldSBbJXVdIGFjdGl2ZSBvYmplY3RzLCAlenUgWyV6dV0gYnl0ZXNcbiIsCisJCSAgIGNvdW50LCBtYXBwYWJsZV9jb3VudCwgc2l6ZSwgbWFwcGFibGVfc2l6ZSk7CisKKwlzaXplID0gY291bnQgPSBtYXBwYWJsZV9zaXplID0gbWFwcGFibGVfY291bnQgPSAwOworCWNvdW50X29iamVjdHMoJmRldl9wcml2LT5tbS5waW5uZWRfbGlzdCwgbW1fbGlzdCk7CisJc2VxX3ByaW50ZihtLCAiICAldSBbJXVdIHBpbm5lZCBvYmplY3RzLCAlenUgWyV6dV0gYnl0ZXNcbiIsCisJCSAgIGNvdW50LCBtYXBwYWJsZV9jb3VudCwgc2l6ZSwgbWFwcGFibGVfc2l6ZSk7CisKKwlzaXplID0gY291bnQgPSBtYXBwYWJsZV9zaXplID0gbWFwcGFibGVfY291bnQgPSAwOworCWNvdW50X29iamVjdHMoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LCBtbV9saXN0KTsKKwlzZXFfcHJpbnRmKG0sICIgICV1IFsldV0gaW5hY3RpdmUgb2JqZWN0cywgJXp1IFslenVdIGJ5dGVzXG4iLAorCQkgICBjb3VudCwgbWFwcGFibGVfY291bnQsIHNpemUsIG1hcHBhYmxlX3NpemUpOworCisJc2l6ZSA9IGNvdW50ID0gbWFwcGFibGVfc2l6ZSA9IG1hcHBhYmxlX2NvdW50ID0gMDsKKwljb3VudF9vYmplY3RzKCZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0LCBtbV9saXN0KTsKKwlzZXFfcHJpbnRmKG0sICIgICV1IFsldV0gZnJlZWQgb2JqZWN0cywgJXp1IFslenVdIGJ5dGVzXG4iLAorCQkgICBjb3VudCwgbWFwcGFibGVfY291bnQsIHNpemUsIG1hcHBhYmxlX3NpemUpOworCisJc2l6ZSA9IGNvdW50ID0gbWFwcGFibGVfc2l6ZSA9IG1hcHBhYmxlX2NvdW50ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5ndHRfbGlzdCwgZ3R0X2xpc3QpIHsKKwkJaWYgKG9iai0+ZmF1bHRfbWFwcGFibGUpIHsKKwkJCXNpemUgKz0gb2JqLT5ndHRfc3BhY2UtPnNpemU7CisJCQkrK2NvdW50OworCQl9CisJCWlmIChvYmotPnBpbl9tYXBwYWJsZSkgeworCQkJbWFwcGFibGVfc2l6ZSArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwkJCSsrbWFwcGFibGVfY291bnQ7CisJCX0KKwl9CisJc2VxX3ByaW50ZihtLCAiJXUgcGlubmVkIG1hcHBhYmxlIG9iamVjdHMsICV6dSBieXRlc1xuIiwKKwkJICAgbWFwcGFibGVfY291bnQsIG1hcHBhYmxlX3NpemUpOworCXNlcV9wcmludGYobSwgIiV1IGZhdWx0IG1hcHBhYmxlIG9iamVjdHMsICV6dSBieXRlc1xuIiwKKwkJICAgY291bnQsIHNpemUpOworCisJc2VxX3ByaW50ZihtLCAiJXp1IFslenVdIGd0dCB0b3RhbFxuIiwKKwkJICAgZGV2X3ByaXYtPm1tLmd0dF90b3RhbCwgZGV2X3ByaXYtPm1tLm1hcHBhYmxlX2d0dF90b3RhbCk7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGk5MTVfZ2VtX2d0dF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCogZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzaXplX3QgdG90YWxfb2JqX3NpemUsIHRvdGFsX2d0dF9zaXplOworCWludCBjb3VudCwgcmV0OworCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRvdGFsX29ial9zaXplID0gdG90YWxfZ3R0X3NpemUgPSBjb3VudCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uZ3R0X2xpc3QsIGd0dF9saXN0KSB7CisJCXNlcV9wcmludGYobSwgIiAgICIpOworCQlkZXNjcmliZV9vYmoobSwgb2JqKTsKKwkJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwkJdG90YWxfb2JqX3NpemUgKz0gb2JqLT5iYXNlLnNpemU7CisJCXRvdGFsX2d0dF9zaXplICs9IG9iai0+Z3R0X3NwYWNlLT5zaXplOworCQljb3VudCsrOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJc2VxX3ByaW50ZihtLCAiVG90YWwgJWQgb2JqZWN0cywgJXp1IGJ5dGVzLCAlenUgR1RUIHNpemVcbiIsCisJCSAgIGNvdW50LCB0b3RhbF9vYmpfc2l6ZSwgdG90YWxfZ3R0X3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKIAogc3RhdGljIGludCBpOTE1X2dlbV9wYWdlZmxpcF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKQEAgLTI0MywxNCArMzUwLDE0IEBACiAJCQlzZXFfcHJpbnRmKG0sICIlZCBwcmVwYXJlc1xuIiwgd29yay0+cGVuZGluZyk7CiAKIAkJCWlmICh3b3JrLT5vbGRfZmJfb2JqKSB7Ci0JCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8od29yay0+b2xkX2ZiX29iaik7Ci0JCQkJaWYob2JqX3ByaXYpCi0JCQkJCXNlcV9wcmludGYobSwgIk9sZCBmcmFtZWJ1ZmZlciBndHRfb2Zmc2V0IDB4JTA4eFxuIiwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgKTsKKwkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gd29yay0+b2xkX2ZiX29iajsKKwkJCQlpZiAob2JqKQorCQkJCQlzZXFfcHJpbnRmKG0sICJPbGQgZnJhbWVidWZmZXIgZ3R0X29mZnNldCAweCUwOHhcbiIsIG9iai0+Z3R0X29mZnNldCk7CiAJCQl9CiAJCQlpZiAod29yay0+cGVuZGluZ19mbGlwX29iaikgewotCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKHdvcmstPnBlbmRpbmdfZmxpcF9vYmopOwotCQkJCWlmKG9ial9wcml2KQotCQkJCQlzZXFfcHJpbnRmKG0sICJOZXcgZnJhbWVidWZmZXIgZ3R0X29mZnNldCAweCUwOHhcbiIsIG9ial9wcml2LT5ndHRfb2Zmc2V0ICk7CisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHdvcmstPnBlbmRpbmdfZmxpcF9vYmo7CisJCQkJaWYgKG9iaikKKwkJCQkJc2VxX3ByaW50ZihtLCAiTmV3IGZyYW1lYnVmZmVyIGd0dF9vZmZzZXQgMHglMDh4XG4iLCBvYmotPmd0dF9vZmZzZXQpOwogCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwpAQCAtMjY1LDQ0ICszNzIsODAgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKmdlbV9yZXF1ZXN0OwotCWludCByZXQ7CisJaW50IHJldCwgY291bnQ7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc2VxX3ByaW50ZihtLCAiUmVxdWVzdDpcbiIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2VtX3JlcXVlc3QsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0LAotCQkJbGlzdCkgewotCQlzZXFfcHJpbnRmKG0sICIgICAgJWQgQCAlZFxuIiwKLQkJCSAgIGdlbV9yZXF1ZXN0LT5zZXFubywKLQkJCSAgIChpbnQpIChqaWZmaWVzIC0gZ2VtX3JlcXVlc3QtPmVtaXR0ZWRfamlmZmllcykpOworCWNvdW50ID0gMDsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW1JDU10ucmVxdWVzdF9saXN0KSkgeworCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcmVxdWVzdHM6XG4iKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShnZW1fcmVxdWVzdCwKKwkJCQkgICAgJmRldl9wcml2LT5yaW5nW1JDU10ucmVxdWVzdF9saXN0LAorCQkJCSAgICBsaXN0KSB7CisJCQlzZXFfcHJpbnRmKG0sICIgICAgJWQgQCAlZFxuIiwKKwkJCQkgICBnZW1fcmVxdWVzdC0+c2Vxbm8sCisJCQkJICAgKGludCkgKGppZmZpZXMgLSBnZW1fcmVxdWVzdC0+ZW1pdHRlZF9qaWZmaWVzKSk7CisJCX0KKwkJY291bnQrKzsKKwl9CisJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmluZ1tWQ1NdLnJlcXVlc3RfbGlzdCkpIHsKKwkJc2VxX3ByaW50ZihtLCAiQlNEIHJlcXVlc3RzOlxuIik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2VtX3JlcXVlc3QsCisJCQkJICAgICZkZXZfcHJpdi0+cmluZ1tWQ1NdLnJlcXVlc3RfbGlzdCwKKwkJCQkgICAgbGlzdCkgeworCQkJc2VxX3ByaW50ZihtLCAiICAgICVkIEAgJWRcbiIsCisJCQkJICAgZ2VtX3JlcXVlc3QtPnNlcW5vLAorCQkJCSAgIChpbnQpIChqaWZmaWVzIC0gZ2VtX3JlcXVlc3QtPmVtaXR0ZWRfamlmZmllcykpOworCQl9CisJCWNvdW50Kys7CisJfQorCWlmICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJpbmdbQkNTXS5yZXF1ZXN0X2xpc3QpKSB7CisJCXNlcV9wcmludGYobSwgIkJMVCByZXF1ZXN0czpcbiIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdlbV9yZXF1ZXN0LAorCQkJCSAgICAmZGV2X3ByaXYtPnJpbmdbQkNTXS5yZXF1ZXN0X2xpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJCXNlcV9wcmludGYobSwgIiAgICAlZCBAICVkXG4iLAorCQkJCSAgIGdlbV9yZXF1ZXN0LT5zZXFubywKKwkJCQkgICAoaW50KSAoamlmZmllcyAtIGdlbV9yZXF1ZXN0LT5lbWl0dGVkX2ppZmZpZXMpKTsKKwkJfQorCQljb3VudCsrOwogCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAorCWlmIChjb3VudCA9PSAwKQorCQlzZXFfcHJpbnRmKG0sICJObyByZXF1ZXN0c1xuIik7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaTkxNV9yaW5nX3NlcW5vX2luZm8oc3RydWN0IHNlcV9maWxlICptLAorCQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJaWYgKHJpbmctPmdldF9zZXFubykgeworCQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IHNlcXVlbmNlICglcyk6ICVkXG4iLAorCQkJICAgcmluZy0+bmFtZSwgcmluZy0+Z2V0X3NlcW5vKHJpbmcpKTsKKwkJc2VxX3ByaW50ZihtLCAiV2FpdGVyIHNlcXVlbmNlICglcyk6ICAlZFxuIiwKKwkJCSAgIHJpbmctPm5hbWUsIHJpbmctPndhaXRpbmdfc2Vxbm8pOworCQlzZXFfcHJpbnRmKG0sICJJUlEgc2VxdWVuY2UgKCVzKTogICAgICVkXG4iLAorCQkJICAgcmluZy0+bmFtZSwgcmluZy0+aXJxX3NlcW5vKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9nZW1fc2Vxbm9faW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKGRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgIT0gTlVMTCkgewotCQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IHNlcXVlbmNlOiAlZFxuIiwKLQkJCSAgIGRldl9wcml2LT5yZW5kZXJfcmluZy5nZXRfc2Vxbm8oZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKSk7Ci0JfSBlbHNlIHsKLQkJc2VxX3ByaW50ZihtLCAiQ3VycmVudCBzZXF1ZW5jZTogaHdzIHVuaW5pdGlhbGl6ZWRcbiIpOwotCX0KLQlzZXFfcHJpbnRmKG0sICJXYWl0ZXIgc2VxdWVuY2U6ICAlZFxuIiwKLQkJCWRldl9wcml2LT5tbS53YWl0aW5nX2dlbV9zZXFubyk7Ci0Jc2VxX3ByaW50ZihtLCAiSVJRIHNlcXVlbmNlOiAgICAgJWRcbiIsIGRldl9wcml2LT5tbS5pcnFfZ2VtX3NlcW5vKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJaTkxNV9yaW5nX3NlcW5vX2luZm8obSwgJmRldl9wcml2LT5yaW5nW2ldKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCkBAIC0zMTUsNyArNDU4LDcgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChyZXQpCkBAIC0zNTQsMTYgKzQ5NywxNCBAQAogCX0KIAlzZXFfcHJpbnRmKG0sICJJbnRlcnJ1cHRzIHJlY2VpdmVkOiAlZFxuIiwKIAkJICAgYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQpKTsKLQlpZiAoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkciAhPSBOVUxMKSB7Ci0JCXNlcV9wcmludGYobSwgIkN1cnJlbnQgc2VxdWVuY2U6ICAgICVkXG4iLAotCQkJICAgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdldF9zZXFubyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpKTsKLQl9IGVsc2UgewotCQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IHNlcXVlbmNlOiAgICBod3MgdW5pbml0aWFsaXplZFxuIik7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsKKwkJaWYgKElTX0dFTjYoZGV2KSkgeworCQkJc2VxX3ByaW50ZihtLCAiR3JhcGhpY3MgSW50ZXJydXB0IG1hc2sgKCVzKToJJTA4eFxuIiwKKwkJCQkgICBkZXZfcHJpdi0+cmluZ1tpXS5uYW1lLAorCQkJCSAgIEk5MTVfUkVBRF9JTVIoJmRldl9wcml2LT5yaW5nW2ldKSk7CisJCX0KKwkJaTkxNV9yaW5nX3NlcW5vX2luZm8obSwgJmRldl9wcml2LT5yaW5nW2ldKTsKIAl9Ci0Jc2VxX3ByaW50ZihtLCAiV2FpdGVyIHNlcXVlbmNlOiAgICAgJWRcbiIsCi0JCSAgIGRldl9wcml2LT5tbS53YWl0aW5nX2dlbV9zZXFubyk7Ci0Jc2VxX3ByaW50ZihtLCAiSVJRIHNlcXVlbmNlOiAgICAgICAgJWRcbiIsCi0JCSAgIGRldl9wcml2LT5tbS5pcnFfZ2VtX3NlcW5vKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwpAQCAtMzgzLDI5ICs1MjQsMTcgQEAKIAlzZXFfcHJpbnRmKG0sICJSZXNlcnZlZCBmZW5jZXMgPSAlZFxuIiwgZGV2X3ByaXYtPmZlbmNlX3JlZ19zdGFydCk7CiAJc2VxX3ByaW50ZihtLCAiVG90YWwgZmVuY2VzID0gJWRcbiIsIGRldl9wcml2LT5udW1fZmVuY2VfcmVncyk7CiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV0ub2JqOworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV0ub2JqOwogCi0JCWlmIChvYmogPT0gTlVMTCkgewotCQkJc2VxX3ByaW50ZihtLCAiRmVuY2VkIG9iamVjdFslMmRdID0gdW51c2VkXG4iLCBpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQotCQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCQkJc2VxX3ByaW50ZihtLCAiRmVuY2VkIG9iamVjdFslMmRdID0gJXA6ICVzICIKLQkJCQkgICAiJTA4eCAlMDh6eCAlMDh4ICVzICUwOHggJTA4eCAlZCIsCi0JCQkJICAgaSwgb2JqLCBnZXRfcGluX2ZsYWcob2JqX3ByaXYpLAotCQkJCSAgIG9ial9wcml2LT5ndHRfb2Zmc2V0LAotCQkJCSAgIG9iai0+c2l6ZSwgb2JqX3ByaXYtPnN0cmlkZSwKLQkJCQkgICBnZXRfdGlsaW5nX2ZsYWcob2JqX3ByaXYpLAotCQkJCSAgIG9iai0+cmVhZF9kb21haW5zLCBvYmotPndyaXRlX2RvbWFpbiwKLQkJCQkgICBvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8pOwotCQkJaWYgKG9iai0+bmFtZSkKLQkJCQlzZXFfcHJpbnRmKG0sICIgKG5hbWU6ICVkKSIsIG9iai0+bmFtZSk7Ci0JCQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCQl9CisJCXNlcV9wcmludGYobSwgIkZlbmNlZCBvYmplY3RbJTJkXSA9ICIsIGkpOworCQlpZiAob2JqID09IE5VTEwpCisJCQlzZXFfcHJpbnRmKG0sICJ1bnVzZWQiKTsKKwkJZWxzZQorCQkJZGVzY3JpYmVfb2JqKG0sIG9iaik7CisJCXNlcV9wcmludGYobSwgIlxuIik7CiAJfQotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxNCwxMCArNTQzLDEyIEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgaTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAJdm9sYXRpbGUgdTMyICpod3M7CisJaW50IGk7CiAKLQlod3MgPSAodm9sYXRpbGUgdTMyICopZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkcjsKKwlyaW5nID0gJmRldl9wcml2LT5yaW5nWyh1aW50cHRyX3Qpbm9kZS0+aW5mb19lbnQtPmRhdGFdOworCWh3cyA9ICh2b2xhdGlsZSB1MzIgKilyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHI7CiAJaWYgKGh3cyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIApAQCAtNDMxLDE0ICs1NjIsMTQgQEAKIAogc3RhdGljIHZvaWQgaTkxNV9kdW1wX29iamVjdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCiAJCQkgICAgIHN0cnVjdCBpb19tYXBwaW5nICptYXBwaW5nLAotCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYpCisJCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CiAJaW50IHBhZ2UsIHBhZ2VfY291bnQsIGk7CiAKLQlwYWdlX2NvdW50ID0gb2JqX3ByaXYtPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRTsKKwlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IHBhZ2VfY291bnQ7IHBhZ2UrKykgewogCQl1MzIgKm1lbSA9IGlvX21hcHBpbmdfbWFwX3djKG1hcHBpbmcsCi0JCQkJCSAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBwYWdlICogUEFHRV9TSVpFKTsKKwkJCQkJICAgICBvYmotPmd0dF9vZmZzZXQgKyBwYWdlICogUEFHRV9TSVpFKTsKIAkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRTsgaSArPSA0KQogCQkJc2VxX3ByaW50ZihtLCAiJTA4eCA6ICAlMDh4XG4iLCBpLCBtZW1baSAvIDRdKTsKIAkJaW9fbWFwcGluZ191bm1hcChtZW0pOwpAQCAtNDUwLDI1ICs1ODEsMjEgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgewotCQlvYmogPSAmb2JqX3ByaXYtPmJhc2U7Ci0JCWlmIChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DT01NQU5EKSB7Ci0JCSAgICBzZXFfcHJpbnRmKG0sICItLS0gZ3R0X29mZnNldCA9IDB4JTA4eFxuIiwKLQkJCSAgICAgICBvYmpfcHJpdi0+Z3R0X29mZnNldCk7Ci0JCSAgICBpOTE1X2R1bXBfb2JqZWN0KG0sIGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywgb2JqX3ByaXYpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CisJCWlmIChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NPTU1BTkQpIHsKKwkJICAgIHNlcV9wcmludGYobSwgIi0tLSBndHRfb2Zmc2V0ID0gMHglMDh4XG4iLCBvYmotPmd0dF9vZmZzZXQpOworCQkgICAgaTkxNV9kdW1wX29iamVjdChtLCBkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcsIG9iaik7CiAJCX0KIAl9CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQogCXJldHVybiAwOwogfQogCkBAIC00NzcsMTkgKzYwNCwyMSBAQAogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOwogCWludCByZXQ7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKCFkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2VtX29iamVjdCkgeworCXJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbKHVpbnRwdHJfdClub2RlLT5pbmZvX2VudC0+ZGF0YV07CisJaWYgKCFyaW5nLT5vYmopIHsKIAkJc2VxX3ByaW50ZihtLCAiTm8gcmluZ2J1ZmZlciBzZXR1cFxuIik7CiAJfSBlbHNlIHsKLQkJdTggKnZpcnQgPSBkZXZfcHJpdi0+cmVuZGVyX3JpbmcudmlydHVhbF9zdGFydDsKKwkJdTggKnZpcnQgPSByaW5nLT52aXJ0dWFsX3N0YXJ0OwogCQl1aW50MzJfdCBvZmY7CiAKLQkJZm9yIChvZmYgPSAwOyBvZmYgPCBkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZTsgb2ZmICs9IDQpIHsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPCByaW5nLT5zaXplOyBvZmYgKz0gNCkgewogCQkJdWludDMyX3QgKnB0ciA9ICh1aW50MzJfdCAqKSh2aXJ0ICsgb2ZmKTsKIAkJCXNlcV9wcmludGYobSwgIiUwOHggOiAgJTA4eFxuIiwgb2ZmLCAqcHRyKTsKIAkJfQpAQCAtNTA0LDE5ICs2MzMsMzggQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKIAotCWhlYWQgPSBJOTE1X1JFQUQoUFJCMF9IRUFEKSAmIEhFQURfQUREUjsKLQl0YWlsID0gSTkxNV9SRUFEKFBSQjBfVEFJTCkgJiBUQUlMX0FERFI7CisJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1sodWludHB0cl90KW5vZGUtPmluZm9fZW50LT5kYXRhXTsKKwlpZiAocmluZy0+c2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKIAotCXNlcV9wcmludGYobSwgIlJpbmdIZWFkIDogICUwOHhcbiIsIGhlYWQpOwotCXNlcV9wcmludGYobSwgIlJpbmdUYWlsIDogICUwOHhcbiIsIHRhaWwpOwotCXNlcV9wcmludGYobSwgIlJpbmdTaXplIDogICUwOGx4XG4iLCBkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZSk7Ci0Jc2VxX3ByaW50ZihtLCAiQWN0aGQgOiAgICAgJTA4eFxuIiwgSTkxNV9SRUFEKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgPyBBQ1RIRF9JOTY1IDogQUNUSEQpKTsKKwlzZXFfcHJpbnRmKG0sICJSaW5nICVzOlxuIiwgcmluZy0+bmFtZSk7CisJc2VxX3ByaW50ZihtLCAiICBIZWFkIDogICAgJTA4eFxuIiwgSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFIpOworCXNlcV9wcmludGYobSwgIiAgVGFpbCA6ICAgICUwOHhcbiIsIEk5MTVfUkVBRF9UQUlMKHJpbmcpICYgVEFJTF9BRERSKTsKKwlzZXFfcHJpbnRmKG0sICIgIFNpemUgOiAgICAlMDh4XG4iLCByaW5nLT5zaXplKTsKKwlzZXFfcHJpbnRmKG0sICIgIEFjdGl2ZSA6ICAlMDh4XG4iLCBpbnRlbF9yaW5nX2dldF9hY3RpdmVfaGVhZChyaW5nKSk7CisJc2VxX3ByaW50ZihtLCAiICBOT1BJRCA6ICAgJTA4eFxuIiwgSTkxNV9SRUFEX05PUElEKHJpbmcpKTsKKwlpZiAoSVNfR0VONihkZXYpKSB7CisJCXNlcV9wcmludGYobSwgIiAgU3luYyAwIDogICAlMDh4XG4iLCBJOTE1X1JFQURfU1lOQ18wKHJpbmcpKTsKKwkJc2VxX3ByaW50ZihtLCAiICBTeW5jIDEgOiAgICUwOHhcbiIsIEk5MTVfUkVBRF9TWU5DXzEocmluZykpOworCX0KKwlzZXFfcHJpbnRmKG0sICIgIENvbnRyb2wgOiAlMDh4XG4iLCBJOTE1X1JFQURfQ1RMKHJpbmcpKTsKKwlzZXFfcHJpbnRmKG0sICIgIFN0YXJ0IDogICAlMDh4XG4iLCBJOTE1X1JFQURfU1RBUlQocmluZykpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpyaW5nX3N0cihpbnQgcmluZykKK3sKKwlzd2l0Y2ggKHJpbmcpIHsKKwljYXNlIFJJTkdfUkVOREVSOiByZXR1cm4gIiByZW5kZXIiOworCWNhc2UgUklOR19CU0Q6IHJldHVybiAiIGJzZCI7CisJY2FzZSBSSU5HX0JMVDogcmV0dXJuICIgYmx0IjsKKwlkZWZhdWx0OiByZXR1cm4gIiI7CisJfQorfQorCiBzdGF0aWMgY29uc3QgY2hhciAqcGluX2ZsYWcoaW50IHBpbm5lZCkKIHsKIAlpZiAocGlubmVkID4gMCkKQEAgLTU0Nyw2ICs2OTUsMzcgQEAKIAlyZXR1cm4gcHVyZ2VhYmxlID8gIiBwdXJnZWFibGUiIDogIiI7CiB9CiAKK3N0YXRpYyB2b2lkIHByaW50X2Vycm9yX2J1ZmZlcnMoc3RydWN0IHNlcV9maWxlICptLAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJc3RydWN0IGRybV9pOTE1X2Vycm9yX2J1ZmZlciAqZXJyLAorCQkJCWludCBjb3VudCkKK3sKKwlzZXFfcHJpbnRmKG0sICIlcyBbJWRdOlxuIiwgbmFtZSwgY291bnQpOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJc2VxX3ByaW50ZihtLCAiICAlMDh4ICU4dSAlMDR4ICUwNHggJTA4eCVzJXMlcyVzJXMlcyIsCisJCQkgICBlcnItPmd0dF9vZmZzZXQsCisJCQkgICBlcnItPnNpemUsCisJCQkgICBlcnItPnJlYWRfZG9tYWlucywKKwkJCSAgIGVyci0+d3JpdGVfZG9tYWluLAorCQkJICAgZXJyLT5zZXFubywKKwkJCSAgIHBpbl9mbGFnKGVyci0+cGlubmVkKSwKKwkJCSAgIHRpbGluZ19mbGFnKGVyci0+dGlsaW5nKSwKKwkJCSAgIGRpcnR5X2ZsYWcoZXJyLT5kaXJ0eSksCisJCQkgICBwdXJnZWFibGVfZmxhZyhlcnItPnB1cmdlYWJsZSksCisJCQkgICByaW5nX3N0cihlcnItPnJpbmcpLAorCQkJICAgYWdwX3R5cGVfc3RyKGVyci0+YWdwX3R5cGUpKTsKKworCQlpZiAoZXJyLT5uYW1lKQorCQkJc2VxX3ByaW50ZihtLCAiIChuYW1lOiAlZCkiLCBlcnItPm5hbWUpOworCQlpZiAoZXJyLT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkKKwkJCXNlcV9wcmludGYobSwgIiAoZmVuY2U6ICVkKSIsIGVyci0+ZmVuY2VfcmVnKTsKKworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCQllcnIrKzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9lcnJvcl9zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwpAQCAtNTY4LDQ3ICs3NDcsNTQgQEAKIAkJICAgZXJyb3ItPnRpbWUudHZfdXNlYyk7CiAJc2VxX3ByaW50ZihtLCAiUENJIElEOiAweCUwNHhcbiIsIGRldi0+cGNpX2RldmljZSk7CiAJc2VxX3ByaW50ZihtLCAiRUlSOiAweCUwOHhcbiIsIGVycm9yLT5laXIpOwotCXNlcV9wcmludGYobSwgIiAgUEdUQkxfRVI6IDB4JTA4eFxuIiwgZXJyb3ItPnBndGJsX2VyKTsKLQlzZXFfcHJpbnRmKG0sICIgIElOU1RQTTogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBtKTsKKwlzZXFfcHJpbnRmKG0sICJQR1RCTF9FUjogMHglMDh4XG4iLCBlcnJvci0+cGd0YmxfZXIpOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCXNlcV9wcmludGYobSwgIkVSUk9SOiAweCUwOHhcbiIsIGVycm9yLT5lcnJvcik7CisJCXNlcV9wcmludGYobSwgIkJsaXR0ZXIgY29tbWFuZCBzdHJlYW06XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2FjdGhkKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVJUjogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2lwZWlyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVIUjogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2lwZWhyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+YmNzX2luc3Rkb25lKTsKKwkJc2VxX3ByaW50ZihtLCAiICBzZXFubzogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX3NlcW5vKTsKKwkJc2VxX3ByaW50ZihtLCAiVmlkZW8gKEJTRCkgY29tbWFuZCBzdHJlYW06XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2FjdGhkKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVJUjogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2lwZWlyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVIUjogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2lwZWhyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+dmNzX2luc3Rkb25lKTsKKwkJc2VxX3ByaW50ZihtLCAiICBzZXFubzogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX3NlcW5vKTsKKwl9CisJc2VxX3ByaW50ZihtLCAiUmVuZGVyIGNvbW1hbmQgc3RyZWFtOlxuIik7CisJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogMHglMDh4XG4iLCBlcnJvci0+YWN0aGQpOwogCXNlcV9wcmludGYobSwgIiAgSVBFSVI6IDB4JTA4eFxuIiwgZXJyb3ItPmlwZWlyKTsKIAlzZXFfcHJpbnRmKG0sICIgIElQRUhSOiAweCUwOHhcbiIsIGVycm9yLT5pcGVocik7CiAJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+aW5zdGRvbmUpOwotCXNlcV9wcmludGYobSwgIiAgQUNUSEQ6IDB4JTA4eFxuIiwgZXJyb3ItPmFjdGhkKTsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQlzZXFfcHJpbnRmKG0sICIgIElOU1RQUzogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBzKTsKIAkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTE6IDB4JTA4eFxuIiwgZXJyb3ItPmluc3Rkb25lMSk7CisJCXNlcV9wcmludGYobSwgIiAgSU5TVFBTOiAweCUwOHhcbiIsIGVycm9yLT5pbnN0cHMpOwogCX0KLQlzZXFfcHJpbnRmKG0sICJzZXFubzogMHglMDh4XG4iLCBlcnJvci0+c2Vxbm8pOworCXNlcV9wcmludGYobSwgIiAgSU5TVFBNOiAweCUwOHhcbiIsIGVycm9yLT5pbnN0cG0pOworCXNlcV9wcmludGYobSwgIiAgc2Vxbm86IDB4JTA4eFxuIiwgZXJyb3ItPnNlcW5vKTsKIAotCWlmIChlcnJvci0+YWN0aXZlX2JvX2NvdW50KSB7Ci0JCXNlcV9wcmludGYobSwgIkJ1ZmZlcnMgWyVkXTpcbiIsIGVycm9yLT5hY3RpdmVfYm9fY291bnQpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlzZXFfcHJpbnRmKG0sICIgIGZlbmNlWyVkXSA9ICUwOGxseFxuIiwgaSwgZXJyb3ItPmZlbmNlW2ldKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgZXJyb3ItPmFjdGl2ZV9ib19jb3VudDsgaSsrKSB7Ci0JCQlzZXFfcHJpbnRmKG0sICIgICUwOHggJTh6ZCAlMDh4ICUwOHggJTA4eCVzJXMlcyVzIiwKLQkJCQkgICBlcnJvci0+YWN0aXZlX2JvW2ldLmd0dF9vZmZzZXQsCi0JCQkJICAgZXJyb3ItPmFjdGl2ZV9ib1tpXS5zaXplLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0ucmVhZF9kb21haW5zLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0ud3JpdGVfZG9tYWluLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0uc2Vxbm8sCi0JCQkJICAgcGluX2ZsYWcoZXJyb3ItPmFjdGl2ZV9ib1tpXS5waW5uZWQpLAotCQkJCSAgIHRpbGluZ19mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0udGlsaW5nKSwKLQkJCQkgICBkaXJ0eV9mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0uZGlydHkpLAotCQkJCSAgIHB1cmdlYWJsZV9mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0ucHVyZ2VhYmxlKSk7CisJaWYgKGVycm9yLT5hY3RpdmVfYm8pCisJCXByaW50X2Vycm9yX2J1ZmZlcnMobSwgIkFjdGl2ZSIsCisJCQkJICAgIGVycm9yLT5hY3RpdmVfYm8sCisJCQkJICAgIGVycm9yLT5hY3RpdmVfYm9fY291bnQpOwogCi0JCQlpZiAoZXJyb3ItPmFjdGl2ZV9ib1tpXS5uYW1lKQotCQkJCXNlcV9wcmludGYobSwgIiAobmFtZTogJWQpIiwgZXJyb3ItPmFjdGl2ZV9ib1tpXS5uYW1lKTsKLQkJCWlmIChlcnJvci0+YWN0aXZlX2JvW2ldLmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQkJCXNlcV9wcmludGYobSwgIiAoZmVuY2U6ICVkKSIsIGVycm9yLT5hY3RpdmVfYm9baV0uZmVuY2VfcmVnKTsKLQotCQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKLQkJfQotCX0KKwlpZiAoZXJyb3ItPnBpbm5lZF9ibykKKwkJcHJpbnRfZXJyb3JfYnVmZmVycyhtLCAiUGlubmVkIiwKKwkJCQkgICAgZXJyb3ItPnBpbm5lZF9ibywKKwkJCQkgICAgZXJyb3ItPnBpbm5lZF9ib19jb3VudCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlcnJvci0+YmF0Y2hidWZmZXIpOyBpKyspIHsKIAkJaWYgKGVycm9yLT5iYXRjaGJ1ZmZlcltpXSkgewogCQkJc3RydWN0IGRybV9pOTE1X2Vycm9yX29iamVjdCAqb2JqID0gZXJyb3ItPmJhdGNoYnVmZmVyW2ldOwogCi0JCQlzZXFfcHJpbnRmKG0sICItLS0gZ3R0X29mZnNldCA9IDB4JTA4eFxuIiwgb2JqLT5ndHRfb2Zmc2V0KTsKKwkJCXNlcV9wcmludGYobSwgIiVzIC0tLSBndHRfb2Zmc2V0ID0gMHglMDh4XG4iLAorCQkJCSAgIGRldl9wcml2LT5yaW5nW2ldLm5hbWUsCisJCQkJICAgb2JqLT5ndHRfb2Zmc2V0KTsKIAkJCW9mZnNldCA9IDA7CiAJCQlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgb2JqLT5wYWdlX2NvdW50OyBwYWdlKyspIHsKIAkJCQlmb3IgKGVsdCA9IDA7IGVsdCA8IFBBR0VfU0laRS80OyBlbHQrKykgewpAQCAtNjM1LDYgKzgyMSw5IEBACiAJaWYgKGVycm9yLT5vdmVybGF5KQogCQlpbnRlbF9vdmVybGF5X3ByaW50X2Vycm9yX3N0YXRlKG0sIGVycm9yLT5vdmVybGF5KTsKIAorCWlmIChlcnJvci0+ZGlzcGxheSkKKwkJaW50ZWxfZGlzcGxheV9wcmludF9lcnJvcl9zdGF0ZShtLCBkZXYsIGVycm9yLT5kaXNwbGF5KTsKKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5lcnJvcl9sb2NrLCBmbGFncyk7CiAKQEAgLTY1OCwxNSArODQ3LDUxIEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MTYgcmd2c3djdGwgPSBJOTE1X1JFQUQxNihNRU1TV0NUTCk7Ci0JdTE2IHJndnN0YXQgPSBJOTE1X1JFQUQxNihNRU1TVEFUX0lMSyk7CiAKLQlzZXFfcHJpbnRmKG0sICJSZXF1ZXN0ZWQgUC1zdGF0ZTogJWRcbiIsIChyZ3Zzd2N0bCA+PiA4KSAmIDB4Zik7Ci0Jc2VxX3ByaW50ZihtLCAiUmVxdWVzdGVkIFZJRDogJWRcbiIsIHJndnN3Y3RsICYgMHgzZik7Ci0Jc2VxX3ByaW50ZihtLCAiQ3VycmVudCBWSUQ6ICVkXG4iLCAocmd2c3RhdCAmIE1FTVNUQVRfVklEX01BU0spID4+Ci0JCSAgIE1FTVNUQVRfVklEX1NISUZUKTsKLQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IFAtc3RhdGU6ICVkXG4iLAotCQkgICAocmd2c3RhdCAmIE1FTVNUQVRfUFNUQVRFX01BU0spID4+IE1FTVNUQVRfUFNUQVRFX1NISUZUKTsKKwlpZiAoSVNfR0VONShkZXYpKSB7CisJCXUxNiByZ3Zzd2N0bCA9IEk5MTVfUkVBRDE2KE1FTVNXQ1RMKTsKKwkJdTE2IHJndnN0YXQgPSBJOTE1X1JFQUQxNihNRU1TVEFUX0lMSyk7CisKKwkJc2VxX3ByaW50ZihtLCAiUmVxdWVzdGVkIFAtc3RhdGU6ICVkXG4iLCAocmd2c3djdGwgPj4gOCkgJiAweGYpOworCQlzZXFfcHJpbnRmKG0sICJSZXF1ZXN0ZWQgVklEOiAlZFxuIiwgcmd2c3djdGwgJiAweDNmKTsKKwkJc2VxX3ByaW50ZihtLCAiQ3VycmVudCBWSUQ6ICVkXG4iLCAocmd2c3RhdCAmIE1FTVNUQVRfVklEX01BU0spID4+CisJCQkgICBNRU1TVEFUX1ZJRF9TSElGVCk7CisJCXNlcV9wcmludGYobSwgIkN1cnJlbnQgUC1zdGF0ZTogJWRcbiIsCisJCQkgICAocmd2c3RhdCAmIE1FTVNUQVRfUFNUQVRFX01BU0spID4+IE1FTVNUQVRfUFNUQVRFX1NISUZUKTsKKwl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgeworCQl1MzIgZ3RfcGVyZl9zdGF0dXMgPSBJOTE1X1JFQUQoR0VONl9HVF9QRVJGX1NUQVRVUyk7CisJCXUzMiBycF9zdGF0ZV9saW1pdHMgPSBJOTE1X1JFQUQoR0VONl9SUF9TVEFURV9MSU1JVFMpOworCQl1MzIgcnBfc3RhdGVfY2FwID0gSTkxNV9SRUFEKEdFTjZfUlBfU1RBVEVfQ0FQKTsKKwkJaW50IG1heF9mcmVxOworCisJCS8qIFJQU1RBVDEgaXMgaW4gdGhlIEdUIHBvd2VyIHdlbGwgKi8KKwkJX19nZW42X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKworCQlzZXFfcHJpbnRmKG0sICJHVF9QRVJGX1NUQVRVUzogMHglMDh4XG4iLCBndF9wZXJmX3N0YXR1cyk7CisJCXNlcV9wcmludGYobSwgIlJQU1RBVDE6IDB4JTA4eFxuIiwgSTkxNV9SRUFEKEdFTjZfUlBTVEFUMSkpOworCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcC1zdGF0ZSByYXRpbzogJWRcbiIsCisJCQkgICAoZ3RfcGVyZl9zdGF0dXMgJiAweGZmMDApID4+IDgpOworCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcC1zdGF0ZSBWSUQ6ICVkXG4iLAorCQkJICAgZ3RfcGVyZl9zdGF0dXMgJiAweGZmKTsKKwkJc2VxX3ByaW50ZihtLCAiUmVuZGVyIHAtc3RhdGUgbGltaXQ6ICVkXG4iLAorCQkJICAgcnBfc3RhdGVfbGltaXRzICYgMHhmZik7CisKKwkJbWF4X2ZyZXEgPSAocnBfc3RhdGVfY2FwICYgMHhmZjAwMDApID4+IDE2OworCQlzZXFfcHJpbnRmKG0sICJMb3dlc3QgKFJQTikgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQltYXhfZnJlcSA9IChycF9zdGF0ZV9jYXAgJiAweGZmMDApID4+IDg7CisJCXNlcV9wcmludGYobSwgIk5vbWluYWwgKFJQMSkgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQltYXhfZnJlcSA9IHJwX3N0YXRlX2NhcCAmIDB4ZmY7CisJCXNlcV9wcmludGYobSwgIk1heCBub24tb3ZlcmNsb2NrZWQgKFJQMCkgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQlfX2dlbjZfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYobSwgIm5vIFAtc3RhdGUgaW5mbyBhdmFpbGFibGVcbiIpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNzE1LDcgKzk0MCw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHJndm1vZGVjdGwgPSBJOTE1X1JFQUQoTUVNTU9ERUNUTCk7Ci0JdTMyIHJzdGRieWN0bCA9IEk5MTVfUkVBRChNQ0hCQVJfUkVOREVSX1NUQU5EQlkpOworCXUzMiByc3RkYnljdGwgPSBJOTE1X1JFQUQoUlNUREJZQ1RMKTsKIAl1MTYgY3JzdGFuZHZpZCA9IEk5MTVfUkVBRDE2KENSU1RBTkRWSUQpOwogCiAJc2VxX3ByaW50ZihtLCAiSEQgYm9vc3Q6ICVzXG4iLCAocmd2bW9kZWN0bCAmIE1FTU1PREVfQk9PU1RfRU4pID8KQEAgLTczOCw2ICs5NjMsMzAgQEAKIAlzZXFfcHJpbnRmKG0sICJSUzIgVklEOiAlZFxuIiwgKChjcnN0YW5kdmlkID4+IDgpICYgMHgzZikpOwogCXNlcV9wcmludGYobSwgIlJlbmRlciBzdGFuZGJ5IGVuYWJsZWQ6ICVzXG4iLAogCQkgICAocnN0ZGJ5Y3RsICYgUkNYX1NXX0VYSVQpID8gIm5vIiA6ICJ5ZXMiKTsKKwlzZXFfcHJpbnRmKG0sICJDdXJyZW50IFJTIHN0YXRlOiAiKTsKKwlzd2l0Y2ggKHJzdGRieWN0bCAmIFJTWF9TVEFUVVNfTUFTSykgeworCWNhc2UgUlNYX1NUQVRVU19PTjoKKwkJc2VxX3ByaW50ZihtLCAib25cbiIpOworCQlicmVhazsKKwljYXNlIFJTWF9TVEFUVVNfUkMxOgorCQlzZXFfcHJpbnRmKG0sICJSQzFcbiIpOworCQlicmVhazsKKwljYXNlIFJTWF9TVEFUVVNfUkMxRToKKwkJc2VxX3ByaW50ZihtLCAiUkMxRVxuIik7CisJCWJyZWFrOworCWNhc2UgUlNYX1NUQVRVU19SUzE6CisJCXNlcV9wcmludGYobSwgIlJTMVxuIik7CisJCWJyZWFrOworCWNhc2UgUlNYX1NUQVRVU19SUzI6CisJCXNlcV9wcmludGYobSwgIlJTMiAoUkM2KVxuIik7CisJCWJyZWFrOworCWNhc2UgUlNYX1NUQVRVU19SUzM6CisJCXNlcV9wcmludGYobSwgIlJDMyAoUkM2KylcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKG0sICJ1bmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC03OTQsNyArMTA0Myw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJYm9vbCBzcl9lbmFibGVkID0gZmFsc2U7CiAKLQlpZiAoSVNfR0VONShkZXYpKQorCWlmIChIQVNfUENIX1NQTElUKGRldikpCiAJCXNyX2VuYWJsZWQgPSBJOTE1X1JFQUQoV00xX0xQX0lMSykgJiBXTTFfTFBfU1JfRU47CiAJZWxzZSBpZiAoSVNfQ1JFU1RMSU5FKGRldikgfHwgSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSkKIAkJc3JfZW5hYmxlZCA9IEk5MTVfUkVBRChGV19CTENfU0VMRikgJiBGV19CTENfU0VMRl9FTjsKQEAgLTg4Niw3ICsxMTM1LDcgQEAKIAkJICAgZmItPmJhc2UuaGVpZ2h0LAogCQkgICBmYi0+YmFzZS5kZXB0aCwKIAkJICAgZmItPmJhc2UuYml0c19wZXJfcGl4ZWwpOwotCWRlc2NyaWJlX29iaihtLCB0b19pbnRlbF9ibyhmYi0+b2JqKSk7CisJZGVzY3JpYmVfb2JqKG0sIGZiLT5vYmopOwogCXNlcV9wcmludGYobSwgIlxuIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiLCAmZGV2LT5tb2RlX2NvbmZpZy5mYl9saXN0LCBiYXNlLmhlYWQpIHsKQEAgLTg5OCw3ICsxMTQ3LDcgQEAKIAkJCSAgIGZiLT5iYXNlLmhlaWdodCwKIAkJCSAgIGZiLT5iYXNlLmRlcHRoLAogCQkJICAgZmItPmJhc2UuYml0c19wZXJfcGl4ZWwpOwotCQlkZXNjcmliZV9vYmoobSwgdG9faW50ZWxfYm8oZmItPm9iaikpOworCQlkZXNjcmliZV9vYmoobSwgZmItPm9iaik7CiAJCXNlcV9wcmludGYobSwgIlxuIik7CiAJfQogCkBAIC05NDMsNyArMTE5Miw2IEBACiAJCSAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJY2hhciBidWZbMjBdOwogCWludCB2YWwgPSAxOwogCkBAIC05NTksMTIgKzEyMDcsNyBAQAogCX0KIAogCURSTV9JTkZPKCJNYW51YWxseSBzZXR0aW5nIHdlZGdlZCB0byAlZFxuIiwgdmFsKTsKLQotCWF0b21pY19zZXQoJmRldl9wcml2LT5tbS53ZWRnZWQsIHZhbCk7Ci0JaWYgKHZhbCkgewotCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Ci0JCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmVycm9yX3dvcmspOwotCX0KKwlpOTE1X2hhbmRsZV9lcnJvcihkZXYsIHZhbCk7CiAKIAlyZXR1cm4gY250OwogfQpAQCAtMTAxOCw2ICsxMjYxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZHJtX2luZm9fbGlzdCBpOTE1X2RlYnVnZnNfbGlzdFtdID0gewogCXsiaTkxNV9jYXBhYmlsaXRpZXMiLCBpOTE1X2NhcGFiaWxpdGllcywgMCwgMH0sCiAJeyJpOTE1X2dlbV9vYmplY3RzIiwgaTkxNV9nZW1fb2JqZWN0X2luZm8sIDB9LAorCXsiaTkxNV9nZW1fZ3R0IiwgaTkxNV9nZW1fZ3R0X2luZm8sIDB9LAogCXsiaTkxNV9nZW1fYWN0aXZlIiwgaTkxNV9nZW1fb2JqZWN0X2xpc3RfaW5mbywgMCwgKHZvaWQgKikgQUNUSVZFX0xJU1R9LAogCXsiaTkxNV9nZW1fZmx1c2hpbmciLCBpOTE1X2dlbV9vYmplY3RfbGlzdF9pbmZvLCAwLCAodm9pZCAqKSBGTFVTSElOR19MSVNUfSwKIAl7Imk5MTVfZ2VtX2luYWN0aXZlIiwgaTkxNV9nZW1fb2JqZWN0X2xpc3RfaW5mbywgMCwgKHZvaWQgKikgSU5BQ1RJVkVfTElTVH0sCkBAIC0xMDI4LDkgKzEyNzIsMTUgQEAKIAl7Imk5MTVfZ2VtX3NlcW5vIiwgaTkxNV9nZW1fc2Vxbm9faW5mbywgMH0sCiAJeyJpOTE1X2dlbV9mZW5jZV9yZWdzIiwgaTkxNV9nZW1fZmVuY2VfcmVnc19pbmZvLCAwfSwKIAl7Imk5MTVfZ2VtX2ludGVycnVwdCIsIGk5MTVfaW50ZXJydXB0X2luZm8sIDB9LAotCXsiaTkxNV9nZW1faHdzIiwgaTkxNV9od3NfaW5mbywgMH0sCi0JeyJpOTE1X3JpbmdidWZmZXJfZGF0YSIsIGk5MTVfcmluZ2J1ZmZlcl9kYXRhLCAwfSwKLQl7Imk5MTVfcmluZ2J1ZmZlcl9pbmZvIiwgaTkxNV9yaW5nYnVmZmVyX2luZm8sIDB9LAorCXsiaTkxNV9nZW1faHdzIiwgaTkxNV9od3NfaW5mbywgMCwgKHZvaWQgKilSQ1N9LAorCXsiaTkxNV9nZW1faHdzX2JsdCIsIGk5MTVfaHdzX2luZm8sIDAsICh2b2lkICopQkNTfSwKKwl7Imk5MTVfZ2VtX2h3c19ic2QiLCBpOTE1X2h3c19pbmZvLCAwLCAodm9pZCAqKVZDU30sCisJeyJpOTE1X3JpbmdidWZmZXJfZGF0YSIsIGk5MTVfcmluZ2J1ZmZlcl9kYXRhLCAwLCAodm9pZCAqKVJDU30sCisJeyJpOTE1X3JpbmdidWZmZXJfaW5mbyIsIGk5MTVfcmluZ2J1ZmZlcl9pbmZvLCAwLCAodm9pZCAqKVJDU30sCisJeyJpOTE1X2JzZF9yaW5nYnVmZmVyX2RhdGEiLCBpOTE1X3JpbmdidWZmZXJfZGF0YSwgMCwgKHZvaWQgKilWQ1N9LAorCXsiaTkxNV9ic2RfcmluZ2J1ZmZlcl9pbmZvIiwgaTkxNV9yaW5nYnVmZmVyX2luZm8sIDAsICh2b2lkICopVkNTfSwKKwl7Imk5MTVfYmx0X3JpbmdidWZmZXJfZGF0YSIsIGk5MTVfcmluZ2J1ZmZlcl9kYXRhLCAwLCAodm9pZCAqKUJDU30sCisJeyJpOTE1X2JsdF9yaW5nYnVmZmVyX2luZm8iLCBpOTE1X3JpbmdidWZmZXJfaW5mbywgMCwgKHZvaWQgKilCQ1N9LAogCXsiaTkxNV9iYXRjaGJ1ZmZlcnMiLCBpOTE1X2JhdGNoYnVmZmVyX2luZm8sIDB9LAogCXsiaTkxNV9lcnJvcl9zdGF0ZSIsIGk5MTVfZXJyb3Jfc3RhdGUsIDB9LAogCXsiaTkxNV9yc3RkYnlfZGVsYXlzIiwgaTkxNV9yc3RkYnlfZGVsYXlzLCAwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCmluZGV4IGNiOTAwZGMuLjg0NGYzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwpAQCAtNTAsNiArNTAsOCBAQAogc3RhdGljIGludCBpOTE1X2luaXRfcGh5c19od3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKKwogCS8qIFByb2dyYW0gSGFyZHdhcmUgU3RhdHVzIFBhZ2UgKi8KIAlkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCA9CiAJCWRybV9wY2lfYWxsb2MoZGV2LCBQQUdFX1NJWkUsIFBBR0VfU0laRSk7CkBAIC01OCwxMSArNjAsMTAgQEAKIAkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5wYWdlX2FkZHIKLQkJPSBkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haC0+dmFkZHI7CisJcmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyID0gZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgtPnZhZGRyOwogCWRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UgPSBkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haC0+YnVzYWRkcjsKIAotCW1lbXNldChkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UucGFnZV9hZGRyLCAwLCBQQUdFX1NJWkUpOworCW1lbXNldChyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIsIDAsIFBBR0VfU0laRSk7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKIAkJZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSB8PSAoZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSA+PiAyOCkgJgpAQCAtODAsMTMgKzgxLDE1IEBACiBzdGF0aWMgdm9pZCBpOTE1X2ZyZWVfaHdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CisKIAlpZiAoZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgpIHsKIAkJZHJtX3BjaV9mcmVlKGRldiwgZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgpOwogCQlkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCA9IE5VTEw7CiAJfQogCi0JaWYgKGRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5nZnhfYWRkcikgewotCQlkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UuZ2Z4X2FkZHIgPSAwOworCWlmIChyaW5nLT5zdGF0dXNfcGFnZS5nZnhfYWRkcikgeworCQlyaW5nLT5zdGF0dXNfcGFnZS5nZnhfYWRkciA9IDA7CiAJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZkZXZfcHJpdi0+aHdzX21hcCwgZGV2KTsKIAl9CiAKQEAgLTk4LDcgKzEwMSw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCiAJLyoKIAkgKiBXZSBzaG91bGQgbmV2ZXIgbG9zZSBjb250ZXh0IG9uIHRoZSByaW5nIHdpdGggbW9kZXNldHRpbmcKQEAgLTEwNyw4ICsxMTAsOCBAQAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CiAKLQlyaW5nLT5oZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7Ci0JcmluZy0+dGFpbCA9IEk5MTVfUkVBRChQUkIwX1RBSUwpICYgVEFJTF9BRERSOworCXJpbmctPmhlYWQgPSBJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUjsKKwlyaW5nLT50YWlsID0gSTkxNV9SRUFEX1RBSUwocmluZykgJiBUQUlMX0FERFI7CiAJcmluZy0+c3BhY2UgPSByaW5nLT5oZWFkIC0gKHJpbmctPnRhaWwgKyA4KTsKIAlpZiAocmluZy0+c3BhY2UgPCAwKQogCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOwpAQCAtMTI0LDYgKzEyNyw4IEBACiBzdGF0aWMgaW50IGk5MTVfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCiAJICogaXMgZnJlZWQsIGl0J3MgdG9vIGxhdGUuCkBAIC0xMzIsOSArMTM3LDggQEAKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOwotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbaV0pOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJLyogQ2xlYXIgdGhlIEhXUyB2aXJ0dWFsIGFkZHJlc3MgYXQgdGVhcmRvd24gKi8KQEAgLTE0OCw2ICsxNTIsNyBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CiAKIAltYXN0ZXJfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAobWFzdGVyX3ByaXYtPnNhcmVhKSB7CkBAIC0xNTgsMjQgKzE2MywyNCBAQAogCX0KIAogCWlmIChpbml0LT5yaW5nX3NpemUgIT0gMCkgewotCQlpZiAoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdlbV9vYmplY3QgIT0gTlVMTCkgeworCQlpZiAocmluZy0+b2JqICE9IE5VTEwpIHsKIAkJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIAkJCURSTV9FUlJPUigiQ2xpZW50IHRyaWVkIHRvIGluaXRpYWxpemUgcmluZ2J1ZmZlciBpbiAiCiAJCQkJICAiR0VNIG1vZGVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKwkJcmluZy0+c2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKIAotCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcubWFwLm9mZnNldCA9IGluaXQtPnJpbmdfc3RhcnQ7Ci0JCWRldl9wcml2LT5yZW5kZXJfcmluZy5tYXAuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKLQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcC50eXBlID0gMDsKLQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcC5mbGFncyA9IDA7Ci0JCWRldl9wcml2LT5yZW5kZXJfcmluZy5tYXAubXRyciA9IDA7CisJCXJpbmctPm1hcC5vZmZzZXQgPSBpbml0LT5yaW5nX3N0YXJ0OworCQlyaW5nLT5tYXAuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKKwkJcmluZy0+bWFwLnR5cGUgPSAwOworCQlyaW5nLT5tYXAuZmxhZ3MgPSAwOworCQlyaW5nLT5tYXAubXRyciA9IDA7CiAKLQkJZHJtX2NvcmVfaW9yZW1hcF93YygmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcCwgZGV2KTsKKwkJZHJtX2NvcmVfaW9yZW1hcF93YygmcmluZy0+bWFwLCBkZXYpOwogCi0JCWlmIChkZXZfcHJpdi0+cmVuZGVyX3JpbmcubWFwLmhhbmRsZSA9PSBOVUxMKSB7CisJCWlmIChyaW5nLT5tYXAuaGFuZGxlID09IE5VTEwpIHsKIAkJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIAkJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCiAJCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKQEAgLTE4Myw3ICsxODgsNyBAQAogCQl9CiAJfQogCi0JZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQgPSBkZXZfcHJpdi0+cmVuZGVyX3JpbmcubWFwLmhhbmRsZTsKKwlyaW5nLT52aXJ0dWFsX3N0YXJ0ID0gcmluZy0+bWFwLmhhbmRsZTsKIAogCWRldl9wcml2LT5jcHAgPSBpbml0LT5jcHA7CiAJZGV2X3ByaXYtPmJhY2tfb2Zmc2V0ID0gaW5pdC0+YmFja19vZmZzZXQ7CkBAIC0yMDIsMTIgKzIwNywxMCBAQAogc3RhdGljIGludCBpOTE1X2RtYV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKIAotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKIAlEUk1fREVCVUdfRFJJVkVSKCIlc1xuIiwgX19mdW5jX18pOwogCi0JcmluZyA9ICZkZXZfcHJpdi0+cmVuZGVyX3Jpbmc7Ci0KIAlpZiAocmluZy0+bWFwLmhhbmRsZSA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCiAJCQkgICIgcmluZyBidWZmZXJcbiIpOwpAQCAtMjIyLDcgKzIyNSw3IEBACiAJRFJNX0RFQlVHX0RSSVZFUigiaHcgc3RhdHVzIHBhZ2UgQCAlcFxuIiwKIAkJCQlyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIpOwogCWlmIChyaW5nLT5zdGF0dXNfcGFnZS5nZnhfYWRkciAhPSAwKQotCQlpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKGRldiwgcmluZyk7CisJCWludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2UocmluZyk7CiAJZWxzZQogCQlJOTE1X1dSSVRFKEhXU19QR0EsIGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UpOwogCkBAIC0yNjQsNyArMjY3LDcgQEAKICAqIGluc3RydWN0aW9uIGRldGVjdGVkIHdpbGwgYmUgZ2l2ZW4gYSBzaXplIG9mIHplcm8sIHdoaWNoIGlzIGEKICAqIHNpZ25hbCB0byBhYm9ydCB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLgogICovCi1zdGF0aWMgaW50IGRvX3ZhbGlkYXRlX2NtZChpbnQgY21kKQorc3RhdGljIGludCB2YWxpZGF0ZV9jbWQoaW50IGNtZCkKIHsKIAlzd2l0Y2ggKCgoY21kID4+IDI5KSAmIDB4NykpIHsKIAljYXNlIDB4MDoKQEAgLTMyMiw0MCArMzI1LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmFsaWRhdGVfY21kKGludCBjbWQpCi17Ci0JaW50IHJldCA9IGRvX3ZhbGlkYXRlX2NtZChjbWQpOwotCi0vKglwcmludGsoInZhbGlkYXRlX2NtZCggJXggKTogJWRcbiIsIGNtZCwgcmV0KTsgKi8KLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgaTkxNV9lbWl0X2NtZHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCAqYnVmZmVyLCBpbnQgZHdvcmRzKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBpOworCWludCBpLCByZXQ7CiAKLQlpZiAoKGR3b3JkcysxKSAqIHNpemVvZihpbnQpID49IGRldl9wcml2LT5yZW5kZXJfcmluZy5zaXplIC0gOCkKKwlpZiAoKGR3b3JkcysxKSAqIHNpemVvZihpbnQpID49IExQX1JJTkcoZGV2X3ByaXYpLT5zaXplIC0gOCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlCRUdJTl9MUF9SSU5HKChkd29yZHMrMSkmfjEpOwotCiAJZm9yIChpID0gMDsgaSA8IGR3b3JkczspIHsKLQkJaW50IGNtZCwgc3o7Ci0KLQkJY21kID0gYnVmZmVyW2ldOwotCi0JCWlmICgoc3ogPSB2YWxpZGF0ZV9jbWQoY21kKSkgPT0gMCB8fCBpICsgc3ogPiBkd29yZHMpCisJCWludCBzeiA9IHZhbGlkYXRlX2NtZChidWZmZXJbaV0pOworCQlpZiAoc3ogPT0gMCB8fCBpICsgc3ogPiBkd29yZHMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlPVVRfUklORyhjbWQpOwotCi0JCXdoaWxlICgrK2ksIC0tc3opIHsKLQkJCU9VVF9SSU5HKGJ1ZmZlcltpXSk7Ci0JCX0KKwkJaSArPSBzejsKIAl9CiAKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKChkd29yZHMrMSkmfjEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHdvcmRzOyBpKyspCisJCU9VVF9SSU5HKGJ1ZmZlcltpXSk7CiAJaWYgKGR3b3JkcyAmIDEpCiAJCU9VVF9SSU5HKDApOwogCkBAIC0zNjYsMzQgKzM1Niw0MSBAQAogCiBpbnQKIGk5MTVfZW1pdF9ib3goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkgICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ZXMsCi0JICAgICAgaW50IGksIGludCBEUjEsIGludCBEUjQpCisJICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCwKKwkgICAgICBpbnQgRFIxLCBpbnQgRFI0KQogewotCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveCA9IGJveGVzW2ldOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKIAotCWlmIChib3gueTIgPD0gYm94LnkxIHx8IGJveC54MiA8PSBib3gueDEgfHwgYm94LnkyIDw9IDAgfHwgYm94LngyIDw9IDApIHsKKwlpZiAoYm94LT55MiA8PSBib3gtPnkxIHx8IGJveC0+eDIgPD0gYm94LT54MSB8fAorCSAgICBib3gtPnkyIDw9IDAgfHwgYm94LT54MiA8PSAwKSB7CiAJCURSTV9FUlJPUigiQmFkIGJveCAlZCwlZC4uJWQsJWRcbiIsCi0JCQkgIGJveC54MSwgYm94LnkxLCBib3gueDIsIGJveC55Mik7CisJCQkgIGJveC0+eDEsIGJveC0+eTEsIGJveC0+eDIsIGJveC0+eTIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQlCRUdJTl9MUF9SSU5HKDQpOworCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlPVVRfUklORyhHRlhfT1BfRFJBV1JFQ1RfSU5GT19JOTY1KTsKLQkJT1VUX1JJTkcoKGJveC54MSAmIDB4ZmZmZikgfCAoYm94LnkxIDw8IDE2KSk7Ci0JCU9VVF9SSU5HKCgoYm94LngyIC0gMSkgJiAweGZmZmYpIHwgKChib3gueTIgLSAxKSA8PCAxNikpOworCQlPVVRfUklORygoYm94LT54MSAmIDB4ZmZmZikgfCAoYm94LT55MSA8PCAxNikpOworCQlPVVRfUklORygoKGJveC0+eDIgLSAxKSAmIDB4ZmZmZikgfCAoKGJveC0+eTIgLSAxKSA8PCAxNikpOwogCQlPVVRfUklORyhEUjQpOwotCQlBRFZBTkNFX0xQX1JJTkcoKTsKIAl9IGVsc2UgewotCQlCRUdJTl9MUF9SSU5HKDYpOworCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlPVVRfUklORyhHRlhfT1BfRFJBV1JFQ1RfSU5GTyk7CiAJCU9VVF9SSU5HKERSMSk7Ci0JCU9VVF9SSU5HKChib3gueDEgJiAweGZmZmYpIHwgKGJveC55MSA8PCAxNikpOwotCQlPVVRfUklORygoKGJveC54MiAtIDEpICYgMHhmZmZmKSB8ICgoYm94LnkyIC0gMSkgPDwgMTYpKTsKKwkJT1VUX1JJTkcoKGJveC0+eDEgJiAweGZmZmYpIHwgKGJveC0+eTEgPDwgMTYpKTsKKwkJT1VUX1JJTkcoKChib3gtPngyIC0gMSkgJiAweGZmZmYpIHwgKChib3gtPnkyIC0gMSkgPDwgMTYpKTsKIAkJT1VUX1JJTkcoRFI0KTsKIAkJT1VUX1JJTkcoMCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOwogCX0KKwlBRFZBTkNFX0xQX1JJTkcoKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDEzLDEyICs0MTAsMTMgQEAKIAlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCiAJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcjsKIAotCUJFR0lOX0xQX1JJTkcoNCk7Ci0JT1VUX1JJTkcoTUlfU1RPUkVfRFdPUkRfSU5ERVgpOwotCU9VVF9SSU5HKEk5MTVfQlJFQURDUlVNQl9JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7Ci0JT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOwotCU9VVF9SSU5HKDApOwotCUFEVkFOQ0VfTFBfUklORygpOworCWlmIChCRUdJTl9MUF9SSU5HKDQpID09IDApIHsKKwkJT1VUX1JJTkcoTUlfU1RPUkVfRFdPUkRfSU5ERVgpOworCQlPVVRfUklORyhJOTE1X0JSRUFEQ1JVTUJfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOworCQlPVVRfUklORyhkZXZfcHJpdi0+Y291bnRlcik7CisJCU9VVF9SSU5HKDApOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCkBAIC00NDAsNyArNDM4LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCWlmIChpIDwgbmJveCkgewotCQkJcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNsaXByZWN0cywgaSwKKwkJCXJldCA9IGk5MTVfZW1pdF9ib3goZGV2LCAmY2xpcHJlY3RzW2ldLAogCQkJCQkgICAgY21kLT5EUjEsIGNtZC0+RFI0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTQ1OSw4ICs0NTcsOSBAQAogCQkJCSAgICAgZHJtX2k5MTVfYmF0Y2hidWZmZXJfdCAqIGJhdGNoLAogCQkJCSAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cykKIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBuYm94ID0gYmF0Y2gtPm51bV9jbGlwcmVjdHM7Ci0JaW50IGkgPSAwLCBjb3VudDsKKwlpbnQgaSwgY291bnQsIHJldDsKIAogCWlmICgoYmF0Y2gtPnN0YXJ0IHwgYmF0Y2gtPnVzZWQpICYgMHg3KSB7CiAJCURSTV9FUlJPUigiYWxpZ25tZW50Iik7CkBAIC00NzAsMTcgKzQ2OSwxOSBAQAogCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOwogCiAJY291bnQgPSBuYm94ID8gbmJveCA6IDE7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlpZiAoaSA8IG5ib3gpIHsKLQkJCWludCByZXQgPSBpOTE1X2VtaXRfYm94KGRldiwgY2xpcHJlY3RzLCBpLAotCQkJCQkJYmF0Y2gtPkRSMSwgYmF0Y2gtPkRSNCk7CisJCQlyZXQgPSBpOTE1X2VtaXRfYm94KGRldiwgJmNsaXByZWN0c1tpXSwKKwkJCQkJICAgIGJhdGNoLT5EUjEsIGJhdGNoLT5EUjQpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSkgewotCQkJQkVHSU5fTFBfUklORygyKTsKKwkJCXJldCA9IEJFR0lOX0xQX1JJTkcoMik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKIAkJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CiAJCQkJT1VUX1JJTkcoTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwogCQkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCk7CkBAIC00ODgsMjYgKzQ4OSwyOSBAQAogCQkJCU9VVF9SSU5HKE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8ICgyIDw8IDYpKTsKIAkJCQlPVVRfUklORyhiYXRjaC0+c3RhcnQgfCBNSV9CQVRDSF9OT05fU0VDVVJFKTsKIAkJCX0KLQkJCUFEVkFOQ0VfTFBfUklORygpOwogCQl9IGVsc2UgewotCQkJQkVHSU5fTFBfUklORyg0KTsKKwkJCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKIAkJCU9VVF9SSU5HKE1JX0JBVENIX0JVRkZFUik7CiAJCQlPVVRfUklORyhiYXRjaC0+c3RhcnQgfCBNSV9CQVRDSF9OT05fU0VDVVJFKTsKIAkJCU9VVF9SSU5HKGJhdGNoLT5zdGFydCArIGJhdGNoLT51c2VkIC0gNCk7CiAJCQlPVVRfUklORygwKTsKLQkJCUFEVkFOQ0VfTFBfUklORygpOwogCQl9CisJCUFEVkFOQ0VfTFBfUklORygpOwogCX0KIAogCiAJaWYgKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSkgewotCQlCRUdJTl9MUF9SSU5HKDIpOwotCQlPVVRfUklORyhNSV9GTFVTSCB8IE1JX05PX1dSSVRFX0ZMVVNIIHwgTUlfSU5WQUxJREFURV9JU1ApOwotCQlPVVRfUklORyhNSV9OT09QKTsKLQkJQURWQU5DRV9MUF9SSU5HKCk7CisJCWlmIChCRUdJTl9MUF9SSU5HKDIpID09IDApIHsKKwkJCU9VVF9SSU5HKE1JX0ZMVVNIIHwgTUlfTk9fV1JJVEVfRkxVU0ggfCBNSV9JTlZBTElEQVRFX0lTUCk7CisJCQlPVVRfUklORyhNSV9OT09QKTsKKwkJCUFEVkFOQ0VfTFBfUklORygpOworCQl9CiAJfQotCWk5MTVfZW1pdF9icmVhZGNydW1iKGRldik7CiAKKwlpOTE1X2VtaXRfYnJlYWRjcnVtYihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC01MTYsNiArNTIwLDcgQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0KIAkJZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OworCWludCByZXQ7CiAKIAlpZiAoIW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUyNywxMiArNTMyLDEzIEBACiAKIAlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKIAotCUJFR0lOX0xQX1JJTkcoMik7CisJcmV0ID0gQkVHSU5fTFBfUklORygxMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCU9VVF9SSU5HKE1JX0ZMVVNIIHwgTUlfUkVBRF9GTFVTSCk7CiAJT1VUX1JJTkcoMCk7Ci0JQURWQU5DRV9MUF9SSU5HKCk7CiAKLQlCRUdJTl9MUF9SSU5HKDYpOwogCU9VVF9SSU5HKENNRF9PUF9ESVNQTEFZQlVGRkVSX0lORk8gfCBBU1lOQ19GTElQKTsKIAlPVVRfUklORygwKTsKIAlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CkBAIC01NDMsMzMgKzU0OSwzMiBAQAogCQlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKIAl9CiAJT1VUX1JJTkcoMCk7Ci0JQURWQU5DRV9MUF9SSU5HKCk7CiAKLQlCRUdJTl9MUF9SSU5HKDIpOwogCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQKTsKIAlPVVRfUklORygwKTsKKwogCUFEVkFOQ0VfTFBfUklORygpOwogCiAJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZW5xdWV1ZSA9IGRldl9wcml2LT5jb3VudGVyKys7CiAKLQlCRUdJTl9MUF9SSU5HKDQpOwotCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQlPVVRfUklORyhJOTE1X0JSRUFEQ1JVTUJfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOwotCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKLQlPVVRfUklORygwKTsKLQlBRFZBTkNFX0xQX1JJTkcoKTsKKwlpZiAoQkVHSU5fTFBfUklORyg0KSA9PSAwKSB7CisJCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKKwkJT1VUX1JJTkcoSTkxNV9CUkVBRENSVU1CX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOworCQlPVVRfUklORygwKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQogCiAJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXYtPmRldl9wcml2YXRlKTsKIAogCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkZXYpOwotCXJldHVybiBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZywKLQkJCQkgICAgICBkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZSAtIDgpOworCXJldHVybiBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHJpbmcsIHJpbmctPnNpemUgLSA4KTsKIH0KIAogc3RhdGljIGludCBpOTE1X2ZsdXNoX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCkBAIC03NjgsOSArNzczLDE1IEBACiAJY2FzZSBJOTE1X1BBUkFNX0hBU19CTFQ6CiAJCXZhbHVlID0gSEFTX0JMVChkZXYpOwogCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fSEFTX1JFTEFYRURfRkVOQ0lORzoKKwkJdmFsdWUgPSAxOworCQlicmVhazsKIAljYXNlIEk5MTVfUEFSQU1fSEFTX0NPSEVSRU5UX1JJTkdTOgogCQl2YWx1ZSA9IDE7CiAJCWJyZWFrOworCWNhc2UgSTkxNV9QQVJBTV9IQVNfRVhFQ19DT05TVEFOVFM6CisJCXZhbHVlID0gSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0RSSVZFUigiVW5rbm93biBwYXJhbWV0ZXIgJWRcbiIsCiAJCQkJIHBhcmFtLT5wYXJhbSk7CkBAIC04MjYsNyArODM3LDcgQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9od3NfYWRkcl90ICpod3MgPSBkYXRhOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9ICZkZXZfcHJpdi0+cmVuZGVyX3Jpbmc7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CiAKIAlpZiAoIUk5MTVfTkVFRF9HRlhfSFdTKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAwNSw3MyArMTAxNiw0NyBAQAogI2RlZmluZSBQVEVfVkFMSUQJCQkoMSA8PCAwKQogCiAvKioKLSAqIGk5MTVfZ3R0X3RvX3BoeXMgLSB0YWtlIGEgR1RUIGFkZHJlc3MgYW5kIHR1cm4gaXQgaW50byBhIHBoeXNpY2FsIG9uZQorICogaTkxNV9zdG9sZW5fdG9fcGh5cyAtIHRha2UgYW4gb2Zmc2V0IGludG8gc3RvbGVuIG1lbW9yeSBhbmQgdHVybiBpdCBpbnRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgYSBwaHlzaWNhbCBvbmUKICAqIEBkZXY6IGRybSBkZXZpY2UKLSAqIEBndHRfYWRkcjogYWRkcmVzcyB0byB0cmFuc2xhdGUKKyAqIEBvZmZzZXQ6IGFkZHJlc3MgdG8gdHJhbnNsYXRlCiAgKgotICogU29tZSBjaGlwIGZ1bmN0aW9ucyByZXF1aXJlIGFsbG9jYXRpb25zIGZyb20gc3RvbGVuIHNwYWNlIGJ1dCBuZWVkIHRoZQotICogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGluIHF1ZXN0aW9uLiAgV2UgdXNlIHRoaXMgcm91dGluZQotICogdG8gZ2V0IGEgcGh5c2ljYWwgYWRkcmVzcyBzdWl0YWJsZSBmb3IgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgZnJvbSBhIGdpdmVuCi0gKiBHVFQgYWRkcmVzcy4KKyAqIFNvbWUgY2hpcCBmdW5jdGlvbnMgcmVxdWlyZSBhbGxvY2F0aW9ucyBmcm9tIHN0b2xlbiBzcGFjZSBhbmQgbmVlZCB0aGUKKyAqIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBpbiBxdWVzdGlvbi4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaTkxNV9ndHRfdG9fcGh5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZ3R0X2FkZHIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpOTE1X3N0b2xlbl90b19waHlzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBvZmZzZXQpCiB7Ci0JdW5zaWduZWQgbG9uZyAqZ3R0OwotCXVuc2lnbmVkIGxvbmcgZW50cnksIHBoeXM7Ci0JaW50IGd0dF9iYXIgPSBJU19HRU4yKGRldikgPyAxIDogMDsKLQlpbnQgZ3R0X29mZnNldCwgZ3R0X3NpemU7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5icmlkZ2VfZGV2OworCXUzMiBiYXNlOwogCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKLQkJaWYgKElTX0c0WChkZXYpIHx8IElOVEVMX0lORk8oZGV2KS0+Z2VuID4gNCkgewotCQkJZ3R0X29mZnNldCA9IDIqMTAyNCoxMDI0OwotCQkJZ3R0X3NpemUgPSAyKjEwMjQqMTAyNDsKLQkJfSBlbHNlIHsKLQkJCWd0dF9vZmZzZXQgPSA1MTIqMTAyNDsKLQkJCWd0dF9zaXplID0gNTEyKjEwMjQ7Ci0JCX0KKyNpZiAwCisJLyogT24gdGhlIG1hY2hpbmVzIEkgaGF2ZSB0ZXN0ZWQgdGhlIEdyYXBoaWNzIEJhc2Ugb2YgU3RvbGVuIE1lbW9yeQorCSAqIGlzIHVucmVsaWFibGUsIHNvIGNvbXB1dGUgdGhlIGJhc2UgYnkgc3VidHJhY3RpbmcgdGhlIHN0b2xlbiBtZW1vcnkKKwkgKiBmcm9tIHRoZSBUb3Agb2YgTG93IFVzYWJsZSBEUkFNIHdoaWNoIGlzIHdoZXJlIHRoZSBCSU9TIHBsYWNlcworCSAqIHRoZSBncmFwaGljcyBzdG9sZW4gbWVtb3J5LgorCSAqLworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDMgfHwgSVNfRzMzKGRldikpIHsKKwkJLyogdG9wIDMyYml0cyBhcmUgcmVzZXJ2ZWQgPSAwICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweEE0LCAmYmFzZSk7CiAJfSBlbHNlIHsKLQkJZ3R0X2JhciA9IDM7Ci0JCWd0dF9vZmZzZXQgPSAwOwotCQlndHRfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBndHRfYmFyKTsKKwkJLyogWFhYIHByZXN1bWUgOHh4IGlzIHRoZSBzYW1lIGFzIGk5MTUgKi8KKwkJcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChwZGV2LT5idXMsIDIsIDB4NUMsICZiYXNlKTsKIAl9Ci0KLQlndHQgPSBpb3JlbWFwX3djKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIGd0dF9iYXIpICsgZ3R0X29mZnNldCwKLQkJCSBndHRfc2l6ZSk7Ci0JaWYgKCFndHQpIHsKLQkJRFJNX0VSUk9SKCJpb3JlbWFwIG9mIEdUVCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMDsKKyNlbHNlCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gMyB8fCBJU19HMzMoZGV2KSkgeworCQl1MTYgdmFsOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweGIwLCAmdmFsKTsKKwkJYmFzZSA9IHZhbCA+PiA0IDw8IDIwOworCX0gZWxzZSB7CisJCXU4IHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg5YywgJnZhbCk7CisJCWJhc2UgPSB2YWwgPj4gMyA8PCAyNzsKIAl9CisJYmFzZSAtPSBkZXZfcHJpdi0+bW0uZ3R0LT5zdG9sZW5fc2l6ZTsKKyNlbmRpZgogCi0JZW50cnkgPSAqKHZvbGF0aWxlIHUzMiAqKShndHQgKyAoZ3R0X2FkZHIgLyAxMDI0KSk7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJHVFQgYWRkcjogMHglMDhseCwgUFRFOiAweCUwOGx4XG4iLCBndHRfYWRkciwgZW50cnkpOwotCi0JLyogTWFzayBvdXQgdGhlc2UgcmVzZXJ2ZWQgYml0cyBvbiB0aGlzIGhhcmR3YXJlLiAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQgJiYgIUlTX0czMyhkZXYpKQotCQllbnRyeSAmPSB+UFRFX0FERFJFU1NfTUFTS19ISUdIOwotCi0JLyogSWYgaXQncyBub3QgYSBtYXBwaW5nIHR5cGUgd2Uga25vdywgdGhlbiBiYWlsLiAqLwotCWlmICgoZW50cnkgJiBQVEVfTUFQUElOR19UWVBFX01BU0spICE9IFBURV9NQVBQSU5HX1RZUEVfVU5DQUNIRUQgJiYKLQkgICAgKGVudHJ5ICYgUFRFX01BUFBJTkdfVFlQRV9NQVNLKSAhPSBQVEVfTUFQUElOR19UWVBFX0NBQ0hFRCkJewotCQlpb3VubWFwKGd0dCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghKGVudHJ5ICYgUFRFX1ZBTElEKSkgewotCQlEUk1fRVJST1IoImJhZCBHVFQgZW50cnkgaW4gc3RvbGVuIHNwYWNlXG4iKTsKLQkJaW91bm1hcChndHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpb3VubWFwKGd0dCk7Ci0KLQlwaHlzID0oZW50cnkgJiBQVEVfQUREUkVTU19NQVNLKSB8Ci0JCSgodWludDY0X3QpKGVudHJ5ICYgUFRFX0FERFJFU1NfTUFTS19ISUdIKSA8PCAoMzIgLSA0KSk7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJHVFQgYWRkcjogMHglMDhseCwgcGh5cyBhZGRyOiAweCUwOGx4XG4iLCBndHRfYWRkciwgcGh5cyk7Ci0KLQlyZXR1cm4gcGh5czsKKwlyZXR1cm4gYmFzZSArIG9mZnNldDsKIH0KIAogc3RhdGljIHZvaWQgaTkxNV93YXJuX3N0b2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTA4Nyw1NCArMTA3MiwzNSBAQAogCXVuc2lnbmVkIGxvbmcgY2ZiX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBsbF9iYXNlID0gMDsKIAotCS8qIExlYXZlIDFNIGZvciBsaW5lIGxlbmd0aCBidWZmZXIgJiBtaXNjLiAqLwotCWNvbXByZXNzZWRfZmIgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS52cmFtLCBzaXplLCA0MDk2LCAwKTsKLQlpZiAoIWNvbXByZXNzZWRfZmIpIHsKLQkJZGV2X3ByaXYtPm5vX2ZiY19yZWFzb24gPSBGQkNfU1RPTEVOX1RPT19TTUFMTDsKLQkJaTkxNV93YXJuX3N0b2xlbihkZXYpOwotCQlyZXR1cm47Ci0JfQorCWNvbXByZXNzZWRfZmIgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS5zdG9sZW4sIHNpemUsIDQwOTYsIDApOworCWlmIChjb21wcmVzc2VkX2ZiKQorCQljb21wcmVzc2VkX2ZiID0gZHJtX21tX2dldF9ibG9jayhjb21wcmVzc2VkX2ZiLCBzaXplLCA0MDk2KTsKKwlpZiAoIWNvbXByZXNzZWRfZmIpCisJCWdvdG8gZXJyOwogCi0JY29tcHJlc3NlZF9mYiA9IGRybV9tbV9nZXRfYmxvY2soY29tcHJlc3NlZF9mYiwgc2l6ZSwgNDA5Nik7Ci0JaWYgKCFjb21wcmVzc2VkX2ZiKSB7Ci0JCWk5MTVfd2Fybl9zdG9sZW4oZGV2KTsKLQkJZGV2X3ByaXYtPm5vX2ZiY19yZWFzb24gPSBGQkNfU1RPTEVOX1RPT19TTUFMTDsKLQkJcmV0dXJuOwotCX0KKwljZmJfYmFzZSA9IGk5MTVfc3RvbGVuX3RvX3BoeXMoZGV2LCBjb21wcmVzc2VkX2ZiLT5zdGFydCk7CisJaWYgKCFjZmJfYmFzZSkKKwkJZ290byBlcnJfZmI7CiAKLQljZmJfYmFzZSA9IGk5MTVfZ3R0X3RvX3BoeXMoZGV2LCBjb21wcmVzc2VkX2ZiLT5zdGFydCk7Ci0JaWYgKCFjZmJfYmFzZSkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgc3RvbGVuIHBoeXMgYWRkciwgZGlzYWJsaW5nIEZCQ1xuIik7Ci0JCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9mYik7Ci0JfQorCWlmICghKElTX0dNNDUoZGV2KSB8fCBIQVNfUENIX1NQTElUKGRldikpKSB7CisJCWNvbXByZXNzZWRfbGxiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uc3RvbGVuLAorCQkJCQkJICAgIDQwOTYsIDQwOTYsIDApOworCQlpZiAoY29tcHJlc3NlZF9sbGIpCisJCQljb21wcmVzc2VkX2xsYiA9IGRybV9tbV9nZXRfYmxvY2soY29tcHJlc3NlZF9sbGIsCisJCQkJCQkJICA0MDk2LCA0MDk2KTsKKwkJaWYgKCFjb21wcmVzc2VkX2xsYikKKwkJCWdvdG8gZXJyX2ZiOwogCi0JaWYgKCEoSVNfR000NShkZXYpIHx8IElTX0lST05MQUtFX00oZGV2KSkpIHsKLQkJY29tcHJlc3NlZF9sbGIgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS52cmFtLCA0MDk2LAotCQkJCQkJICAgIDQwOTYsIDApOwotCQlpZiAoIWNvbXByZXNzZWRfbGxiKSB7Ci0JCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljb21wcmVzc2VkX2xsYiA9IGRybV9tbV9nZXRfYmxvY2soY29tcHJlc3NlZF9sbGIsIDQwOTYsIDQwOTYpOwotCQlpZiAoIWNvbXByZXNzZWRfbGxiKSB7Ci0JCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsbF9iYXNlID0gaTkxNV9ndHRfdG9fcGh5cyhkZXYsIGNvbXByZXNzZWRfbGxiLT5zdGFydCk7Ci0JCWlmICghbGxfYmFzZSkgewotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IHN0b2xlbiBwaHlzIGFkZHIsIGRpc2FibGluZyBGQkNcbiIpOwotCQkJZHJtX21tX3B1dF9ibG9jayhjb21wcmVzc2VkX2ZiKTsKLQkJCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9sbGIpOwotCQl9CisJCWxsX2Jhc2UgPSBpOTE1X3N0b2xlbl90b19waHlzKGRldiwgY29tcHJlc3NlZF9sbGItPnN0YXJ0KTsKKwkJaWYgKCFsbF9iYXNlKQorCQkJZ290byBlcnJfbGxiOwogCX0KIAogCWRldl9wcml2LT5jZmJfc2l6ZSA9IHNpemU7CiAKIAlpbnRlbF9kaXNhYmxlX2ZiYyhkZXYpOwogCWRldl9wcml2LT5jb21wcmVzc2VkX2ZiID0gY29tcHJlc3NlZF9mYjsKLQlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKQorCWlmIChIQVNfUENIX1NQTElUKGRldikpCiAJCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ0JfQkFTRSwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOwogCWVsc2UgaWYgKElTX0dNNDUoZGV2KSkgewogCQlJOTE1X1dSSVRFKERQRkNfQ0JfQkFTRSwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOwpAQCAtMTE0NCw4ICsxMTEwLDE3IEBACiAJCWRldl9wcml2LT5jb21wcmVzc2VkX2xsYiA9IGNvbXByZXNzZWRfbGxiOwogCX0KIAotCURSTV9ERUJVR19LTVMoIkZCQyBiYXNlIDB4JTA4bHgsIGxsIGJhc2UgMHglMDhseCwgc2l6ZSAlZE1cbiIsIGNmYl9iYXNlLAotCQkgIGxsX2Jhc2UsIHNpemUgPj4gMjApOworCURSTV9ERUJVR19LTVMoIkZCQyBiYXNlIDB4JTA4bHgsIGxsIGJhc2UgMHglMDhseCwgc2l6ZSAlZE1cbiIsCisJCSAgICAgIGNmYl9iYXNlLCBsbF9iYXNlLCBzaXplID4+IDIwKTsKKwlyZXR1cm47CisKK2Vycl9sbGI6CisJZHJtX21tX3B1dF9ibG9jayhjb21wcmVzc2VkX2xsYik7CitlcnJfZmI6CisJZHJtX21tX3B1dF9ibG9jayhjb21wcmVzc2VkX2ZiKTsKK2VycjoKKwlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19TVE9MRU5fVE9PX1NNQUxMOworCWk5MTVfd2Fybl9zdG9sZW4oZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaTkxNV9jbGVhbnVwX2NvbXByZXNzaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0xMTc2LDEyICsxMTUxLDE2IEBACiAJcG1fbWVzc2FnZV90IHBtbSA9IHsgLmV2ZW50ID0gUE1fRVZFTlRfU1VTUEVORCB9OwogCWlmIChzdGF0ZSA9PSBWR0FfU1dJVENIRVJPT19PTikgewogCQlwcmludGsoS0VSTl9JTkZPICJpOTE1OiBzd2l0Y2hlZCBvblxuIik7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAkJLyogaTkxNSByZXN1bWUgaGFuZGxlciBkb2Vzbid0IHNldCB0byBEMCAqLwogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldi0+cGRldiwgUENJX0QwKTsKIAkJaTkxNV9yZXN1bWUoZGV2KTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX09OOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaTkxNTogc3dpdGNoZWQgb2ZmXG4iKTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCQlpOTE1X3N1c3BlbmQoZGV2LCBwbW0pOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfT0ZGOwogCX0KIH0KIApAQCAtMTE5NiwxNyArMTE3NSwyMCBAQAogCXJldHVybiBjYW5fc3dpdGNoOwogfQogCi1zdGF0aWMgaW50IGk5MTVfbG9hZF9tb2Rlc2V0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgcHJlYWxsb2Nfc2l6ZSwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWdwX3NpemUpCitzdGF0aWMgaW50IGk5MTVfbG9hZF9tb2Rlc2V0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgcHJlYWxsb2Nfc2l6ZSwgZ3R0X3NpemUsIG1hcHBhYmxlX3NpemU7CiAJaW50IHJldCA9IDA7CiAKLQkvKiBCYXNpYyBtZW1yYW5nZSBhbGxvY2F0b3IgZm9yIHN0b2xlbiBzcGFjZSAoYWthIG1tLnZyYW0pICovCi0JZHJtX21tX2luaXQoJmRldl9wcml2LT5tbS52cmFtLCAwLCBwcmVhbGxvY19zaXplKTsKKwlwcmVhbGxvY19zaXplID0gZGV2X3ByaXYtPm1tLmd0dC0+c3RvbGVuX3NpemU7CisJZ3R0X3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfdG90YWxfZW50cmllcyA8PCBQQUdFX1NISUZUOworCW1hcHBhYmxlX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfbWFwcGFibGVfZW50cmllcyA8PCBQQUdFX1NISUZUOwogCi0JLyogTGV0IEdFTSBNYW5hZ2UgZnJvbSBlbmQgb2YgcHJlYWxsb2Mgc3BhY2UgdG8gZW5kIG9mIGFwZXJ0dXJlLgorCS8qIEJhc2ljIG1lbXJhbmdlIGFsbG9jYXRvciBmb3Igc3RvbGVuIHNwYWNlICovCisJZHJtX21tX2luaXQoJmRldl9wcml2LT5tbS5zdG9sZW4sIDAsIHByZWFsbG9jX3NpemUpOworCisJLyogTGV0IEdFTSBNYW5hZ2UgYWxsIG9mIHRoZSBhcGVydHVyZS4KIAkgKgogCSAqIEhvd2V2ZXIsIGxlYXZlIG9uZSBwYWdlIGF0IHRoZSBlbmQgc3RpbGwgYm91bmQgdG8gdGhlIHNjcmF0Y2ggcGFnZS4KIAkgKiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcGxhY2VzIHdoZXJlIHRoZSBoYXJkd2FyZSBhcHBhcmVudGx5CkBAIC0xMjE1LDcgKzExOTcsNyBAQAogCSAqIGF0IHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIGFwZXJ0dXJlLiAgT25lIHBhZ2Ugc2hvdWxkIGJlIGVub3VnaCB0bwogCSAqIGtlZXAgYW55IHByZWZldGNoaW5nIGluc2lkZSBvZiB0aGUgYXBlcnR1cmUuCiAJICovCi0JaTkxNV9nZW1fZG9faW5pdChkZXYsIHByZWFsbG9jX3NpemUsIGFncF9zaXplIC0gNDA5Nik7CisJaTkxNV9nZW1fZG9faW5pdChkZXYsIDAsIG1hcHBhYmxlX3NpemUsIGd0dF9zaXplIC0gUEFHRV9TSVpFKTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXQgPSBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoZGV2KTsKQEAgLTEyMjcsMTYgKzEyMDksMTcgQEAKIAlpZiAoSTkxNV9IQVNfRkJDKGRldikgJiYgaTkxNV9wb3dlcnNhdmUpIHsKIAkJaW50IGNmYl9zaXplOwogCi0JCS8qIFRyeSB0byBnZXQgYW4gOE0gYnVmZmVyLi4uICovCi0JCWlmIChwcmVhbGxvY19zaXplID4gKDkqMTAyNCoxMDI0KSkKLQkJCWNmYl9zaXplID0gOCoxMDI0KjEwMjQ7CisJCS8qIExlYXZlIDFNIGZvciBsaW5lIGxlbmd0aCBidWZmZXIgJiBtaXNjLiAqLworCisJCS8qIFRyeSB0byBnZXQgYSAzMk0gYnVmZmVyLi4uICovCisJCWlmIChwcmVhbGxvY19zaXplID4gKDM2KjEwMjQqMTAyNCkpCisJCQljZmJfc2l6ZSA9IDMyKjEwMjQqMTAyNDsKIAkJZWxzZSAvKiBmYWxsIGJhY2sgdG8gNy84IG9mIHRoZSBzdG9sZW4gc3BhY2UgKi8KIAkJCWNmYl9zaXplID0gcHJlYWxsb2Nfc2l6ZSAqIDcgLyA4OwogCQlpOTE1X3NldHVwX2NvbXByZXNzaW9uKGRldiwgY2ZiX3NpemUpOwogCX0KIAotCS8qIEFsbG93IGhhcmR3YXJlIGJhdGNoYnVmZmVycyB1bmxlc3MgdG9sZCBvdGhlcndpc2UuCi0JICovCisJLyogQWxsb3cgaGFyZHdhcmUgYmF0Y2hidWZmZXJzIHVubGVzcyB0b2xkIG90aGVyd2lzZS4gKi8KIAlkZXZfcHJpdi0+YWxsb3dfYmF0Y2hidWZmZXIgPSAxOwogCiAJcmV0ID0gaW50ZWxfcGFyc2VfYmlvcyhkZXYpOwpAQCAtMTI1Miw2ICsxMjM1LDcgQEAKIAogCXJldCA9IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2NsaWVudChkZXYtPnBkZXYsCiAJCQkJCSAgICAgaTkxNV9zd2l0Y2hlcm9vX3NldF9zdGF0ZSwKKwkJCQkJICAgICBOVUxMLAogCQkJCQkgICAgIGk5MTVfc3dpdGNoZXJvb19jYW5fc3dpdGNoKTsKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfdmdhX2NsaWVudDsKQEAgLTE0MjYsMTUyICsxNDEwLDEyIEBACiAJfQogfQogCi1zdHJ1Y3Qgdl90YWJsZSB7Ci0JdTggdmlkOwotCXVuc2lnbmVkIGxvbmcgdmQ7IC8qIGluIC4xIG1pbCAqLwotCXVuc2lnbmVkIGxvbmcgdm07IC8qIGluIC4xIG1pbCAqLwotCXU4IHB2aWQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IHZfdGFibGUgdl90YWJsZVtdID0gewotCXsgMCwgMTYxMjUsIDE1MDAwLCAweDdmLCB9LAotCXsgMSwgMTYwMDAsIDE0ODc1LCAweDdlLCB9LAotCXsgMiwgMTU4NzUsIDE0NzUwLCAweDdkLCB9LAotCXsgMywgMTU3NTAsIDE0NjI1LCAweDdjLCB9LAotCXsgNCwgMTU2MjUsIDE0NTAwLCAweDdiLCB9LAotCXsgNSwgMTU1MDAsIDE0Mzc1LCAweDdhLCB9LAotCXsgNiwgMTUzNzUsIDE0MjUwLCAweDc5LCB9LAotCXsgNywgMTUyNTAsIDE0MTI1LCAweDc4LCB9LAotCXsgOCwgMTUxMjUsIDE0MDAwLCAweDc3LCB9LAotCXsgOSwgMTUwMDAsIDEzODc1LCAweDc2LCB9LAotCXsgMTAsIDE0ODc1LCAxMzc1MCwgMHg3NSwgfSwKLQl7IDExLCAxNDc1MCwgMTM2MjUsIDB4NzQsIH0sCi0JeyAxMiwgMTQ2MjUsIDEzNTAwLCAweDczLCB9LAotCXsgMTMsIDE0NTAwLCAxMzM3NSwgMHg3MiwgfSwKLQl7IDE0LCAxNDM3NSwgMTMyNTAsIDB4NzEsIH0sCi0JeyAxNSwgMTQyNTAsIDEzMTI1LCAweDcwLCB9LAotCXsgMTYsIDE0MTI1LCAxMzAwMCwgMHg2ZiwgfSwKLQl7IDE3LCAxNDAwMCwgMTI4NzUsIDB4NmUsIH0sCi0JeyAxOCwgMTM4NzUsIDEyNzUwLCAweDZkLCB9LAotCXsgMTksIDEzNzUwLCAxMjYyNSwgMHg2YywgfSwKLQl7IDIwLCAxMzYyNSwgMTI1MDAsIDB4NmIsIH0sCi0JeyAyMSwgMTM1MDAsIDEyMzc1LCAweDZhLCB9LAotCXsgMjIsIDEzMzc1LCAxMjI1MCwgMHg2OSwgfSwKLQl7IDIzLCAxMzI1MCwgMTIxMjUsIDB4NjgsIH0sCi0JeyAyNCwgMTMxMjUsIDEyMDAwLCAweDY3LCB9LAotCXsgMjUsIDEzMDAwLCAxMTg3NSwgMHg2NiwgfSwKLQl7IDI2LCAxMjg3NSwgMTE3NTAsIDB4NjUsIH0sCi0JeyAyNywgMTI3NTAsIDExNjI1LCAweDY0LCB9LAotCXsgMjgsIDEyNjI1LCAxMTUwMCwgMHg2MywgfSwKLQl7IDI5LCAxMjUwMCwgMTEzNzUsIDB4NjIsIH0sCi0JeyAzMCwgMTIzNzUsIDExMjUwLCAweDYxLCB9LAotCXsgMzEsIDEyMjUwLCAxMTEyNSwgMHg2MCwgfSwKLQl7IDMyLCAxMjEyNSwgMTEwMDAsIDB4NWYsIH0sCi0JeyAzMywgMTIwMDAsIDEwODc1LCAweDVlLCB9LAotCXsgMzQsIDExODc1LCAxMDc1MCwgMHg1ZCwgfSwKLQl7IDM1LCAxMTc1MCwgMTA2MjUsIDB4NWMsIH0sCi0JeyAzNiwgMTE2MjUsIDEwNTAwLCAweDViLCB9LAotCXsgMzcsIDExNTAwLCAxMDM3NSwgMHg1YSwgfSwKLQl7IDM4LCAxMTM3NSwgMTAyNTAsIDB4NTksIH0sCi0JeyAzOSwgMTEyNTAsIDEwMTI1LCAweDU4LCB9LAotCXsgNDAsIDExMTI1LCAxMDAwMCwgMHg1NywgfSwKLQl7IDQxLCAxMTAwMCwgOTg3NSwgMHg1NiwgfSwKLQl7IDQyLCAxMDg3NSwgOTc1MCwgMHg1NSwgfSwKLQl7IDQzLCAxMDc1MCwgOTYyNSwgMHg1NCwgfSwKLQl7IDQ0LCAxMDYyNSwgOTUwMCwgMHg1MywgfSwKLQl7IDQ1LCAxMDUwMCwgOTM3NSwgMHg1MiwgfSwKLQl7IDQ2LCAxMDM3NSwgOTI1MCwgMHg1MSwgfSwKLQl7IDQ3LCAxMDI1MCwgOTEyNSwgMHg1MCwgfSwKLQl7IDQ4LCAxMDEyNSwgOTAwMCwgMHg0ZiwgfSwKLQl7IDQ5LCAxMDAwMCwgODg3NSwgMHg0ZSwgfSwKLQl7IDUwLCA5ODc1LCA4NzUwLCAweDRkLCB9LAotCXsgNTEsIDk3NTAsIDg2MjUsIDB4NGMsIH0sCi0JeyA1MiwgOTYyNSwgODUwMCwgMHg0YiwgfSwKLQl7IDUzLCA5NTAwLCA4Mzc1LCAweDRhLCB9LAotCXsgNTQsIDkzNzUsIDgyNTAsIDB4NDksIH0sCi0JeyA1NSwgOTI1MCwgODEyNSwgMHg0OCwgfSwKLQl7IDU2LCA5MTI1LCA4MDAwLCAweDQ3LCB9LAotCXsgNTcsIDkwMDAsIDc4NzUsIDB4NDYsIH0sCi0JeyA1OCwgODg3NSwgNzc1MCwgMHg0NSwgfSwKLQl7IDU5LCA4NzUwLCA3NjI1LCAweDQ0LCB9LAotCXsgNjAsIDg2MjUsIDc1MDAsIDB4NDMsIH0sCi0JeyA2MSwgODUwMCwgNzM3NSwgMHg0MiwgfSwKLQl7IDYyLCA4Mzc1LCA3MjUwLCAweDQxLCB9LAotCXsgNjMsIDgyNTAsIDcxMjUsIDB4NDAsIH0sCi0JeyA2NCwgODEyNSwgNzAwMCwgMHgzZiwgfSwKLQl7IDY1LCA4MDAwLCA2ODc1LCAweDNlLCB9LAotCXsgNjYsIDc4NzUsIDY3NTAsIDB4M2QsIH0sCi0JeyA2NywgNzc1MCwgNjYyNSwgMHgzYywgfSwKLQl7IDY4LCA3NjI1LCA2NTAwLCAweDNiLCB9LAotCXsgNjksIDc1MDAsIDYzNzUsIDB4M2EsIH0sCi0JeyA3MCwgNzM3NSwgNjI1MCwgMHgzOSwgfSwKLQl7IDcxLCA3MjUwLCA2MTI1LCAweDM4LCB9LAotCXsgNzIsIDcxMjUsIDYwMDAsIDB4MzcsIH0sCi0JeyA3MywgNzAwMCwgNTg3NSwgMHgzNiwgfSwKLQl7IDc0LCA2ODc1LCA1NzUwLCAweDM1LCB9LAotCXsgNzUsIDY3NTAsIDU2MjUsIDB4MzQsIH0sCi0JeyA3NiwgNjYyNSwgNTUwMCwgMHgzMywgfSwKLQl7IDc3LCA2NTAwLCA1Mzc1LCAweDMyLCB9LAotCXsgNzgsIDYzNzUsIDUyNTAsIDB4MzEsIH0sCi0JeyA3OSwgNjI1MCwgNTEyNSwgMHgzMCwgfSwKLQl7IDgwLCA2MTI1LCA1MDAwLCAweDJmLCB9LAotCXsgODEsIDYwMDAsIDQ4NzUsIDB4MmUsIH0sCi0JeyA4MiwgNTg3NSwgNDc1MCwgMHgyZCwgfSwKLQl7IDgzLCA1NzUwLCA0NjI1LCAweDJjLCB9LAotCXsgODQsIDU2MjUsIDQ1MDAsIDB4MmIsIH0sCi0JeyA4NSwgNTUwMCwgNDM3NSwgMHgyYSwgfSwKLQl7IDg2LCA1Mzc1LCA0MjUwLCAweDI5LCB9LAotCXsgODcsIDUyNTAsIDQxMjUsIDB4MjgsIH0sCi0JeyA4OCwgNTEyNSwgNDAwMCwgMHgyNywgfSwKLQl7IDg5LCA1MDAwLCAzODc1LCAweDI2LCB9LAotCXsgOTAsIDQ4NzUsIDM3NTAsIDB4MjUsIH0sCi0JeyA5MSwgNDc1MCwgMzYyNSwgMHgyNCwgfSwKLQl7IDkyLCA0NjI1LCAzNTAwLCAweDIzLCB9LAotCXsgOTMsIDQ1MDAsIDMzNzUsIDB4MjIsIH0sCi0JeyA5NCwgNDM3NSwgMzI1MCwgMHgyMSwgfSwKLQl7IDk1LCA0MjUwLCAzMTI1LCAweDIwLCB9LAotCXsgOTYsIDQxMjUsIDMwMDAsIDB4MWYsIH0sCi0JeyA5NywgNDEyNSwgMzAwMCwgMHgxZSwgfSwKLQl7IDk4LCA0MTI1LCAzMDAwLCAweDFkLCB9LAotCXsgOTksIDQxMjUsIDMwMDAsIDB4MWMsIH0sCi0JeyAxMDAsIDQxMjUsIDMwMDAsIDB4MWIsIH0sCi0JeyAxMDEsIDQxMjUsIDMwMDAsIDB4MWEsIH0sCi0JeyAxMDIsIDQxMjUsIDMwMDAsIDB4MTksIH0sCi0JeyAxMDMsIDQxMjUsIDMwMDAsIDB4MTgsIH0sCi0JeyAxMDQsIDQxMjUsIDMwMDAsIDB4MTcsIH0sCi0JeyAxMDUsIDQxMjUsIDMwMDAsIDB4MTYsIH0sCi0JeyAxMDYsIDQxMjUsIDMwMDAsIDB4MTUsIH0sCi0JeyAxMDcsIDQxMjUsIDMwMDAsIDB4MTQsIH0sCi0JeyAxMDgsIDQxMjUsIDMwMDAsIDB4MTMsIH0sCi0JeyAxMDksIDQxMjUsIDMwMDAsIDB4MTIsIH0sCi0JeyAxMTAsIDQxMjUsIDMwMDAsIDB4MTEsIH0sCi0JeyAxMTEsIDQxMjUsIDMwMDAsIDB4MTAsIH0sCi0JeyAxMTIsIDQxMjUsIDMwMDAsIDB4MGYsIH0sCi0JeyAxMTMsIDQxMjUsIDMwMDAsIDB4MGUsIH0sCi0JeyAxMTQsIDQxMjUsIDMwMDAsIDB4MGQsIH0sCi0JeyAxMTUsIDQxMjUsIDMwMDAsIDB4MGMsIH0sCi0JeyAxMTYsIDQxMjUsIDMwMDAsIDB4MGIsIH0sCi0JeyAxMTcsIDQxMjUsIDMwMDAsIDB4MGEsIH0sCi0JeyAxMTgsIDQxMjUsIDMwMDAsIDB4MDksIH0sCi0JeyAxMTksIDQxMjUsIDMwMDAsIDB4MDgsIH0sCi0JeyAxMjAsIDExMjUsIDAsIDB4MDcsIH0sCi0JeyAxMjEsIDEwMDAsIDAsIDB4MDYsIH0sCi0JeyAxMjIsIDg3NSwgMCwgMHgwNSwgfSwKLQl7IDEyMywgNzUwLCAwLCAweDA0LCB9LAotCXsgMTI0LCA2MjUsIDAsIDB4MDMsIH0sCi0JeyAxMjUsIDUwMCwgMCwgMHgwMiwgfSwKLQl7IDEyNiwgMzc1LCAwLCAweDAxLCB9LAotCXsgMTI3LCAwLCAwLCAweDAwLCB9LAotfTsKLQotc3RydWN0IGNwYXJhbXMgewotCWludCBpOwotCWludCB0OwotCWludCBtOwotCWludCBjOwotfTsKLQotc3RhdGljIHN0cnVjdCBjcGFyYW1zIGNwYXJhbXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3BhcmFtcyB7CisJdTE2IGk7CisJdTE2IHQ7CisJdTE2IG07CisJdTE2IGM7Cit9IGNwYXJhbXNbXSA9IHsKIAl7IDEsIDEzMzMsIDMwMSwgMjg2NjQgfSwKIAl7IDEsIDEwNjYsIDI5NCwgMjQ0NjAgfSwKIAl7IDEsIDgwMCwgMjk0LCAyNTE5MiB9LApAQCAtMTYzNywyMSArMTQ4MSwxNDUgQEAKIAlyZXR1cm4gKChtICogeCkgLyAxMjcpIC0gYjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHZpZF90b19leHR2aWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1OCBweHZpZCkKK3N0YXRpYyB1MTYgcHZpZF90b19leHR2aWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1OCBweHZpZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCA9IDA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2X3RhYmxlKTsgaSsrKSB7Ci0JCWlmICh2X3RhYmxlW2ldLnB2aWQgPT0gcHh2aWQpIHsKLQkJCWlmIChJU19NT0JJTEUoZGV2X3ByaXYtPmRldikpCi0JCQkJdmFsID0gdl90YWJsZVtpXS52bTsKLQkJCWVsc2UKLQkJCQl2YWwgPSB2X3RhYmxlW2ldLnZkOwotCQl9Ci0JfQotCi0JcmV0dXJuIHZhbDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHZfdGFibGUgeworCQl1MTYgdmQ7IC8qIGluIC4xIG1pbCAqLworCQl1MTYgdm07IC8qIGluIC4xIG1pbCAqLworCX0gdl90YWJsZVtdID0geworCQl7IDAsIDAsIH0sCisJCXsgMzc1LCAwLCB9LAorCQl7IDUwMCwgMCwgfSwKKwkJeyA2MjUsIDAsIH0sCisJCXsgNzUwLCAwLCB9LAorCQl7IDg3NSwgMCwgfSwKKwkJeyAxMDAwLCAwLCB9LAorCQl7IDExMjUsIDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDI1MCwgMzEyNSwgfSwKKwkJeyA0Mzc1LCAzMjUwLCB9LAorCQl7IDQ1MDAsIDMzNzUsIH0sCisJCXsgNDYyNSwgMzUwMCwgfSwKKwkJeyA0NzUwLCAzNjI1LCB9LAorCQl7IDQ4NzUsIDM3NTAsIH0sCisJCXsgNTAwMCwgMzg3NSwgfSwKKwkJeyA1MTI1LCA0MDAwLCB9LAorCQl7IDUyNTAsIDQxMjUsIH0sCisJCXsgNTM3NSwgNDI1MCwgfSwKKwkJeyA1NTAwLCA0Mzc1LCB9LAorCQl7IDU2MjUsIDQ1MDAsIH0sCisJCXsgNTc1MCwgNDYyNSwgfSwKKwkJeyA1ODc1LCA0NzUwLCB9LAorCQl7IDYwMDAsIDQ4NzUsIH0sCisJCXsgNjEyNSwgNTAwMCwgfSwKKwkJeyA2MjUwLCA1MTI1LCB9LAorCQl7IDYzNzUsIDUyNTAsIH0sCisJCXsgNjUwMCwgNTM3NSwgfSwKKwkJeyA2NjI1LCA1NTAwLCB9LAorCQl7IDY3NTAsIDU2MjUsIH0sCisJCXsgNjg3NSwgNTc1MCwgfSwKKwkJeyA3MDAwLCA1ODc1LCB9LAorCQl7IDcxMjUsIDYwMDAsIH0sCisJCXsgNzI1MCwgNjEyNSwgfSwKKwkJeyA3Mzc1LCA2MjUwLCB9LAorCQl7IDc1MDAsIDYzNzUsIH0sCisJCXsgNzYyNSwgNjUwMCwgfSwKKwkJeyA3NzUwLCA2NjI1LCB9LAorCQl7IDc4NzUsIDY3NTAsIH0sCisJCXsgODAwMCwgNjg3NSwgfSwKKwkJeyA4MTI1LCA3MDAwLCB9LAorCQl7IDgyNTAsIDcxMjUsIH0sCisJCXsgODM3NSwgNzI1MCwgfSwKKwkJeyA4NTAwLCA3Mzc1LCB9LAorCQl7IDg2MjUsIDc1MDAsIH0sCisJCXsgODc1MCwgNzYyNSwgfSwKKwkJeyA4ODc1LCA3NzUwLCB9LAorCQl7IDkwMDAsIDc4NzUsIH0sCisJCXsgOTEyNSwgODAwMCwgfSwKKwkJeyA5MjUwLCA4MTI1LCB9LAorCQl7IDkzNzUsIDgyNTAsIH0sCisJCXsgOTUwMCwgODM3NSwgfSwKKwkJeyA5NjI1LCA4NTAwLCB9LAorCQl7IDk3NTAsIDg2MjUsIH0sCisJCXsgOTg3NSwgODc1MCwgfSwKKwkJeyAxMDAwMCwgODg3NSwgfSwKKwkJeyAxMDEyNSwgOTAwMCwgfSwKKwkJeyAxMDI1MCwgOTEyNSwgfSwKKwkJeyAxMDM3NSwgOTI1MCwgfSwKKwkJeyAxMDUwMCwgOTM3NSwgfSwKKwkJeyAxMDYyNSwgOTUwMCwgfSwKKwkJeyAxMDc1MCwgOTYyNSwgfSwKKwkJeyAxMDg3NSwgOTc1MCwgfSwKKwkJeyAxMTAwMCwgOTg3NSwgfSwKKwkJeyAxMTEyNSwgMTAwMDAsIH0sCisJCXsgMTEyNTAsIDEwMTI1LCB9LAorCQl7IDExMzc1LCAxMDI1MCwgfSwKKwkJeyAxMTUwMCwgMTAzNzUsIH0sCisJCXsgMTE2MjUsIDEwNTAwLCB9LAorCQl7IDExNzUwLCAxMDYyNSwgfSwKKwkJeyAxMTg3NSwgMTA3NTAsIH0sCisJCXsgMTIwMDAsIDEwODc1LCB9LAorCQl7IDEyMTI1LCAxMTAwMCwgfSwKKwkJeyAxMjI1MCwgMTExMjUsIH0sCisJCXsgMTIzNzUsIDExMjUwLCB9LAorCQl7IDEyNTAwLCAxMTM3NSwgfSwKKwkJeyAxMjYyNSwgMTE1MDAsIH0sCisJCXsgMTI3NTAsIDExNjI1LCB9LAorCQl7IDEyODc1LCAxMTc1MCwgfSwKKwkJeyAxMzAwMCwgMTE4NzUsIH0sCisJCXsgMTMxMjUsIDEyMDAwLCB9LAorCQl7IDEzMjUwLCAxMjEyNSwgfSwKKwkJeyAxMzM3NSwgMTIyNTAsIH0sCisJCXsgMTM1MDAsIDEyMzc1LCB9LAorCQl7IDEzNjI1LCAxMjUwMCwgfSwKKwkJeyAxMzc1MCwgMTI2MjUsIH0sCisJCXsgMTM4NzUsIDEyNzUwLCB9LAorCQl7IDE0MDAwLCAxMjg3NSwgfSwKKwkJeyAxNDEyNSwgMTMwMDAsIH0sCisJCXsgMTQyNTAsIDEzMTI1LCB9LAorCQl7IDE0Mzc1LCAxMzI1MCwgfSwKKwkJeyAxNDUwMCwgMTMzNzUsIH0sCisJCXsgMTQ2MjUsIDEzNTAwLCB9LAorCQl7IDE0NzUwLCAxMzYyNSwgfSwKKwkJeyAxNDg3NSwgMTM3NTAsIH0sCisJCXsgMTUwMDAsIDEzODc1LCB9LAorCQl7IDE1MTI1LCAxNDAwMCwgfSwKKwkJeyAxNTI1MCwgMTQxMjUsIH0sCisJCXsgMTUzNzUsIDE0MjUwLCB9LAorCQl7IDE1NTAwLCAxNDM3NSwgfSwKKwkJeyAxNTYyNSwgMTQ1MDAsIH0sCisJCXsgMTU3NTAsIDE0NjI1LCB9LAorCQl7IDE1ODc1LCAxNDc1MCwgfSwKKwkJeyAxNjAwMCwgMTQ4NzUsIH0sCisJCXsgMTYxMjUsIDE1MDAwLCB9LAorCX07CisJaWYgKGRldl9wcml2LT5pbmZvLT5pc19tb2JpbGUpCisJCXJldHVybiB2X3RhYmxlW3B4dmlkXS52bTsKKwllbHNlCisJCXJldHVybiB2X3RhYmxlW3B4dmlkXS52ZDsKIH0KIAogdm9pZCBpOTE1X3VwZGF0ZV9nZnhfdmFsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKQEAgLTE5MDUsOSArMTg3Myw5IEBACiBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKLQlyZXNvdXJjZV9zaXplX3QgYmFzZSwgc2l6ZTsKIAlpbnQgcmV0ID0gMCwgbW1pb19iYXI7Ci0JdWludDMyX3QgYWdwX3NpemUsIHByZWFsbG9jX3NpemU7CisJdWludDMyX3QgYWdwX3NpemU7CisKIAkvKiBpOTE1IGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CiAJZGV2LT50eXBlc1s2XSA9IF9EUk1fU1RBVF9JUlE7CkBAIC0xOTIzLDExICsxODkxLDYgQEAKIAlkZXZfcHJpdi0+ZGV2ID0gZGV2OwogCWRldl9wcml2LT5pbmZvID0gKHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyAqKSBmbGFnczsKIAotCS8qIEFkZCByZWdpc3RlciBtYXAgKG5lZWRlZCBmb3Igc3VzcGVuZC9yZXN1bWUpICovCi0JbW1pb19iYXIgPSBJU19HRU4yKGRldikgPyAxIDogMDsKLQliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgbW1pb19iYXIpOwotCXNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgbW1pb19iYXIpOwotCiAJaWYgKGk5MTVfZ2V0X2JyaWRnZV9kZXYoZGV2KSkgewogCQlyZXQgPSAtRUlPOwogCQlnb3RvIGZyZWVfcHJpdjsKQEAgLTE5MzcsMTYgKzE5MDAsMjUgQEAKIAlpZiAoSVNfR0VOMihkZXYpKQogCQlkbWFfc2V0X2NvaGVyZW50X21hc2soJmRldi0+cGRldi0+ZGV2LCBETUFfQklUX01BU0soMzApKTsKIAotCWRldl9wcml2LT5yZWdzID0gaW9yZW1hcChiYXNlLCBzaXplKTsKKwltbWlvX2JhciA9IElTX0dFTjIoZGV2KSA/IDEgOiAwOworCWRldl9wcml2LT5yZWdzID0gcGNpX2lvbWFwKGRldi0+cGRldiwgbW1pb19iYXIsIDApOwogCWlmICghZGV2X3ByaXYtPnJlZ3MpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gcHV0X2JyaWRnZTsKIAl9CiAKKwlkZXZfcHJpdi0+bW0uZ3R0ID0gaW50ZWxfZ3R0X2dldCgpOworCWlmICghZGV2X3ByaXYtPm1tLmd0dCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXplIEdUVFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2lvbWFwZnJlZTsKKwl9CisKKwlhZ3Bfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPmd0dF9tYXBwYWJsZV9lbnRyaWVzIDw8IFBBR0VfU0hJRlQ7CisKICAgICAgICAgZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nID0KLQkJaW9fbWFwcGluZ19jcmVhdGVfd2MoZGV2LT5hZ3AtPmJhc2UsCi0JCQkJICAgICBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplICogMTAyNCoxMDI0KTsKKwkJaW9fbWFwcGluZ19jcmVhdGVfd2MoZGV2LT5hZ3AtPmJhc2UsIGFncF9zaXplKTsKIAlpZiAoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nID09IE5VTEwpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXRfcm1tYXA7CkBAIC0xOTU4LDI0ICsxOTMwLDEzIEBACiAJICogTVRSUiBpZiBwcmVzZW50LiAgRXZlbiBpZiBhIFVDIE1UUlIgaXNuJ3QgcHJlc2VudC4KIAkgKi8KIAlkZXZfcHJpdi0+bW0uZ3R0X210cnIgPSBtdHJyX2FkZChkZXYtPmFncC0+YmFzZSwKLQkJCQkJIGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX3NpemUgKgotCQkJCQkgMTAyNCAqIDEwMjQsCisJCQkJCSBhZ3Bfc2l6ZSwKIAkJCQkJIE1UUlJfVFlQRV9XUkNPTUIsIDEpOwogCWlmIChkZXZfcHJpdi0+bW0uZ3R0X210cnIgPCAwKSB7CiAJCURSTV9JTkZPKCJNVFJSIGFsbG9jYXRpb24gZmFpbGVkLiAgR3JhcGhpY3MgIgogCQkJICJwZXJmb3JtYW5jZSBtYXkgc3VmZmVyLlxuIik7CiAJfQogCi0JZGV2X3ByaXYtPm1tLmd0dCA9IGludGVsX2d0dF9nZXQoKTsKLQlpZiAoIWRldl9wcml2LT5tbS5ndHQpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBHVFRcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF9pb21hcGZyZWU7Ci0JfQotCi0JcHJlYWxsb2Nfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPmd0dF9zdG9sZW5fZW50cmllcyA8PCBQQUdFX1NISUZUOwotCWFncF9zaXplID0gZGV2X3ByaXYtPm1tLmd0dC0+Z3R0X21hcHBhYmxlX2VudHJpZXMgPDwgUEFHRV9TSElGVDsKLQogCS8qIFRoZSBpOTE1IHdvcmtxdWV1ZSBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYmF0Y2hlZCByZXRpcmVtZW50IG9mCiAJICogcmVxdWVzdHMgKGFuZCB0aHVzIG1hbmFnaW5nIGJvKSBvbmNlIHRoZSB0YXNrIGhhcyBiZWVuIGNvbXBsZXRlZAogCSAqIGJ5IHRoZSBHUFUuIGk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cygpIGlzIGNhbGxlZCBkaXJlY3RseSB3aGVuIHdlCkBAIC0xOTgzLDcgKzE5NDQsNyBAQAogCSAqIGJvLgogCSAqCiAJICogSXQgaXMgYWxzbyB1c2VkIGZvciBwZXJpb2RpYyBsb3ctcHJpb3JpdHkgZXZlbnRzLCBzdWNoIGFzCi0JICogaWRsZS10aW1lcnMgYW5kIGhhbmdjaGVjay4KKwkgKiBpZGxlLXRpbWVycyBhbmQgcmVjb3JkaW5nIGVycm9yIHN0YXRlLgogCSAqCiAJICogQWxsIHRhc2tzIG9uIHRoZSB3b3JrcXVldWUgYXJlIGV4cGVjdGVkIHRvIGFjcXVpcmUgdGhlIGRldiBtdXRleAogCSAqIHNvIHRoZXJlIGlzIG5vIHBvaW50IGluIHJ1bm5pbmcgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiB0aGUKQEAgLTIwMDEsMjIgKzE5NjIsNiBAQAogCS8qIGVuYWJsZSBHRU0gYnkgZGVmYXVsdCAqLwogCWRldl9wcml2LT5oYXNfZ2VtID0gMTsKIAotCWlmIChwcmVhbGxvY19zaXplID4gYWdwX3NpemUgKiAzIC8gNCkgewotCQlEUk1fRVJST1IoIkRldGVjdGVkIGJyb2tlbiB2aWRlbyBCSU9TIHdpdGggJWQvJWRrQiBvZiB2aWRlbyAiCi0JCQkgICJtZW1vcnkgc3RvbGVuLlxuIiwKLQkJCSAgcHJlYWxsb2Nfc2l6ZSAvIDEwMjQsIGFncF9zaXplIC8gMTAyNCk7Ci0JCURSTV9FUlJPUigiRGlzYWJsaW5nIEdFTS4gKHRyeSByZWR1Y2luZyBzdG9sZW4gbWVtb3J5IG9yICIKLQkJCSAgInVwZGF0aW5nIHRoZSBCSU9TIHRvIGZpeCkuXG4iKTsKLQkJZGV2X3ByaXYtPmhhc19nZW0gPSAwOwotCX0KLQotCWlmIChkZXZfcHJpdi0+aGFzX2dlbSA9PSAwICYmCi0JICAgIGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJRFJNX0VSUk9SKCJrZXJuZWwgbW9kZXNldHRpbmcgcmVxdWlyZXMgR0VNLCBkaXNhYmxpbmcgZHJpdmVyLlxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2lvbWFwZnJlZTsKLQl9Ci0KIAlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyID0gaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXI7CiAJZGV2LT5tYXhfdmJsYW5rX2NvdW50ID0gMHhmZmZmZmY7IC8qIG9ubHkgMjQgYml0cyBvZiBmcmFtZSBjb3VudCAqLwogCWlmIChJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKSB7CkBAIC0yMDM3LDggKzE5ODIsOCBAQAogCS8qIEluaXQgSFdTICovCiAJaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7CiAJCXJldCA9IGk5MTVfaW5pdF9waHlzX2h3cyhkZXYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIG91dF93b3JrcXVldWVfZnJlZTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2dlbV91bmxvYWQ7CiAJfQogCiAJaWYgKElTX1BJTkVWSUVXKGRldikpCkBAIC0yMDYwLDE2ICsyMDA1LDEzIEBACiAJaWYgKCFJU19JOTQ1RyhkZXYpICYmICFJU19JOTQ1R00oZGV2KSkKIAkJcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKIAotCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5lcnJvcl9sb2NrKTsKIAlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gMDsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIEk5MTVfTlVNX1BJUEUpOwotCi0JaWYgKHJldCkgewotCQkodm9pZCkgaTkxNV9kcml2ZXJfdW5sb2FkKGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gb3V0X2dlbV91bmxvYWQ7CiAKIAkvKiBTdGFydCBvdXQgc3VzcGVuZGVkICovCiAJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDE7CkBAIC0yMDc3LDEwICsyMDE5LDEwIEBACiAJaW50ZWxfZGV0ZWN0X3BjaChkZXYpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYsIHByZWFsbG9jX3NpemUsIGFncF9zaXplKTsKKwkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYpOwogCQlpZiAocmV0IDwgMCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBtb2Rlc2V0XG4iKTsKLQkJCWdvdG8gb3V0X3dvcmtxdWV1ZV9mcmVlOworCQkJZ290byBvdXRfZ2VtX3VubG9hZDsKIAkJfQogCX0KIApAQCAtMjEwMCwxMiArMjA0MiwxNyBAQAogCiAJcmV0dXJuIDA7CiAKLW91dF93b3JrcXVldWVfZnJlZToKK291dF9nZW1fdW5sb2FkOgorCWlmIChkZXYtPnBkZXYtPm1zaV9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKKworCWludGVsX3RlYXJkb3duX2dtYnVzKGRldik7CisJaW50ZWxfdGVhcmRvd25fbWNoYmFyKGRldik7CiAJZGVzdHJveV93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKIG91dF9pb21hcGZyZWU6CiAJaW9fbWFwcGluZ19mcmVlKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyk7CiBvdXRfcm1tYXA6Ci0JaW91bm1hcChkZXZfcHJpdi0+cmVncyk7CisJcGNpX2lvdW5tYXAoZGV2LT5wZGV2LCBkZXZfcHJpdi0+cmVncyk7CiBwdXRfYnJpZGdlOgogCXBjaV9kZXZfcHV0KGRldl9wcml2LT5icmlkZ2VfZGV2KTsKIGZyZWVfcHJpdjoKQEAgLTIxMjIsNiArMjA2OSw5IEBACiAJaTkxNV9tY2hfZGV2ID0gTlVMTDsKIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOwogCisJaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zaHJpbmspCisJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0ID0gaTkxNV9ncHVfaWRsZShkZXYpOwogCWlmIChyZXQpCkBAIC0yMTc5LDcgKzIxMjksNyBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpICYmIGk5MTVfcG93ZXJzYXZlKQogCQkJaTkxNV9jbGVhbnVwX2NvbXByZXNzaW9uKGRldik7Ci0JCWRybV9tbV90YWtlZG93bigmZGV2X3ByaXYtPm1tLnZyYW0pOworCQlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5tbS5zdG9sZW4pOwogCiAJCWludGVsX2NsZWFudXBfb3ZlcmxheShkZXYpOwogCkBAIC0yMTg4LDcgKzIxMzgsNyBAQAogCX0KIAogCWlmIChkZXZfcHJpdi0+cmVncyAhPSBOVUxMKQotCQlpb3VubWFwKGRldl9wcml2LT5yZWdzKTsKKwkJcGNpX2lvdW5tYXAoZGV2LT5wZGV2LCBkZXZfcHJpdi0+cmVncyk7CiAKIAlpbnRlbF90ZWFyZG93bl9nbWJ1cyhkZXYpOwogCWludGVsX3RlYXJkb3duX21jaGJhcihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggZjczNzk2MC4uNzJmZWEyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC00OSw2ICs0OSwxMiBAQAogdW5zaWduZWQgaW50IGk5MTVfbHZkc19kb3duY2xvY2sgPSAwOwogbW9kdWxlX3BhcmFtX25hbWVkKGx2ZHNfZG93bmNsb2NrLCBpOTE1X2x2ZHNfZG93bmNsb2NrLCBpbnQsIDA0MDApOwogCit1bnNpZ25lZCBpbnQgaTkxNV9wYW5lbF91c2Vfc3NjID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZChsdmRzX3VzZV9zc2MsIGk5MTVfcGFuZWxfdXNlX3NzYywgaW50LCAwNjAwKTsKKworYm9vbCBpOTE1X3RyeV9yZXNldCA9IHRydWU7Cittb2R1bGVfcGFyYW1fbmFtZWQocmVzZXQsIGk5MTVfdHJ5X3Jlc2V0LCBib29sLCAwNjAwKTsKKwogc3RhdGljIHN0cnVjdCBkcm1fZHJpdmVyIGRyaXZlcjsKIGV4dGVybiBpbnQgaW50ZWxfYWdwX2VuYWJsZWQ7CiAKQEAgLTExMSw3ICsxMTcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2k5NjVnbV9pbmZvID0gewogCS5nZW4gPSA0LCAuaXNfY3Jlc3RsaW5lID0gMSwKLQkuaXNfbW9iaWxlID0gMSwgLmhhc19mYmMgPSAxLCAuaGFzX3JjNiA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCisJLmlzX21vYmlsZSA9IDEsIC5oYXNfZmJjID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkuaGFzX292ZXJsYXkgPSAxLAogCS5zdXBwb3J0c190diA9IDEsCiB9OwpAQCAtMTMwLDcgKzEzNiw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfZ200NV9pbmZvID0gewogCS5nZW4gPSA0LCAuaXNfZzR4ID0gMSwKLQkuaXNfbW9iaWxlID0gMSwgLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfZmJjID0gMSwgLmhhc19yYzYgPSAxLAorCS5pc19tb2JpbGUgPSAxLCAubmVlZF9nZnhfaHdzID0gMSwgLmhhc19mYmMgPSAxLAogCS5oYXNfcGlwZV9jeHNyID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkuc3VwcG9ydHNfdHYgPSAxLAogCS5oYXNfYnNkX3JpbmcgPSAxLApAQCAtMTUwLDcgKzE1Niw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gaW50ZWxfaXJvbmxha2VfbV9pbmZvID0gewogCS5nZW4gPSA1LCAuaXNfbW9iaWxlID0gMSwKLQkubmVlZF9nZnhfaHdzID0gMSwgLmhhc19yYzYgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAorCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAogCS5oYXNfZmJjID0gMCwgLyogZGlzYWJsZWQgZHVlIHRvIGJ1Z2d5IGhhcmR3YXJlICovCiAJLmhhc19ic2RfcmluZyA9IDEsCiB9OwpAQCAtMTY1LDYgKzE3MSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX3NhbmR5YnJpZGdlX21faW5mbyA9IHsKIAkuZ2VuID0gNiwgLmlzX21vYmlsZSA9IDEsCiAJLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCisJLmhhc19mYmMgPSAxLAogCS5oYXNfYnNkX3JpbmcgPSAxLAogCS5oYXNfYmx0X3JpbmcgPSAxLAogfTsKQEAgLTI0NCwxMCArMjUxLDM0IEBACiAJfQogfQogCit2b2lkIF9fZ2VuNl9mb3JjZV93YWtlX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IGNvdW50OworCisJY291bnQgPSAwOworCXdoaWxlIChjb3VudCsrIDwgNTAgJiYgKEk5MTVfUkVBRF9OT1RSQUNFKEZPUkNFV0FLRV9BQ0spICYgMSkpCisJCXVkZWxheSgxMCk7CisKKwlJOTE1X1dSSVRFX05PVFJBQ0UoRk9SQ0VXQUtFLCAxKTsKKwlQT1NUSU5HX1JFQUQoRk9SQ0VXQUtFKTsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoY291bnQrKyA8IDUwICYmIChJOTE1X1JFQURfTk9UUkFDRShGT1JDRVdBS0VfQUNLKSAmIDEpID09IDApCisJCXVkZWxheSgxMCk7Cit9CisKK3ZvaWQgX19nZW42X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlJOTE1X1dSSVRFX05PVFJBQ0UoRk9SQ0VXQUtFLCAwKTsKKwlQT1NUSU5HX1JFQUQoRk9SQ0VXQUtFKTsKK30KKwogc3RhdGljIGludCBpOTE1X2RybV9mcmVlemUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCisJZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRldik7CisKIAlwY2lfc2F2ZV9zdGF0ZShkZXYtPnBkZXYpOwogCiAJLyogSWYgS01TIGlzIGFjdGl2ZSwgd2UgZG8gdGhlIGxlYXZldnQgc3R1ZmYgaGVyZSAqLwpAQCAtMjg0LDcgKzMxNSw5IEBACiAJaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCiAJCXJldHVybiAwOwogCi0JZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRldik7CisKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCisJCXJldHVybiAwOwogCiAJZXJyb3IgPSBpOTE1X2RybV9mcmVlemUoZGV2KTsKIAlpZiAoZXJyb3IpCkBAIC0zMDQsNiArMzM3LDEyIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgZXJyb3IgPSAwOwogCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhkZXYpOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwl9CisKIAlpOTE1X3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAlpbnRlbF9vcHJlZ2lvbl9zZXR1cChkZXYpOwogCkBAIC0zMTksNiArMzU4LDkgQEAKIAogCQkvKiBSZXN1bWUgdGhlIG1vZGVzZXQgZm9yIGV2ZXJ5IGFjdGl2YXRlZCBDUlRDICovCiAJCWRybV9oZWxwZXJfcmVzdW1lX2ZvcmNlX21vZGUoZGV2KTsKKworCQlpZiAoZGV2X3ByaXYtPnJlbmRlcmN0eCAmJiBkZXZfcHJpdi0+cHdyY3R4KQorCQkJaXJvbmxha2VfZW5hYmxlX3JjNihkZXYpOwogCX0KIAogCWludGVsX29wcmVnaW9uX2luaXQoZGV2KTsKQEAgLTMzMiw2ICszNzQsOSBAQAogewogCWludCByZXQ7CiAKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCisJCXJldHVybiAwOworCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldi0+cGRldikpCiAJCXJldHVybiAtRUlPOwogCkBAIC00MDUsNiArNDUwLDE0IEBACiAJcmV0dXJuIHdhaXRfZm9yKEk5MTVfUkVBRChNQ0hCQVJfTUlSUk9SX0JBU0UgKyBJTEtfR0RTUikgJiAweDEsIDUwMCk7CiB9CiAKK3N0YXRpYyBpbnQgZ2VuNl9kb19yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJSTkxNV9XUklURShHRU42X0dEUlNULCBHRU42X0dSRE9NX0ZVTEwpOworCXJldHVybiB3YWl0X2ZvcigoSTkxNV9SRUFEKEdFTjZfR0RSU1QpICYgR0VONl9HUkRPTV9GVUxMKSA9PSAwLCA1MDApOworfQorCiAvKioKICAqIGk5NjVfcmVzZXQgLSByZXNldCBjaGlwIGFmdGVyIGEgaGFuZwogICogQGRldjogZHJtIGRldmljZSB0byByZXNldApAQCAtNDMxLDcgKzQ4NCwxMSBAQAogCWJvb2wgbmVlZF9kaXNwbGF5ID0gdHJ1ZTsKIAlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlmICghaTkxNV90cnlfcmVzZXQpCisJCXJldHVybiAwOworCisJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCisJCXJldHVybiAtRUJVU1k7CiAKIAlpOTE1X2dlbV9yZXNldChkZXYpOwogCkBAIC00MzksNiArNDk2LDkgQEAKIAlpZiAoZ2V0X3NlY29uZHMoKSAtIGRldl9wcml2LT5sYXN0X2dwdV9yZXNldCA8IDUpIHsKIAkJRFJNX0VSUk9SKCJHUFUgaGFuZ2luZyB0b28gZmFzdCwgZGVjbGFyaW5nIHdlZGdlZCFcbiIpOwogCX0gZWxzZSBzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJY2FzZSA2OgorCQlyZXQgPSBnZW42X2RvX3Jlc2V0KGRldiwgZmxhZ3MpOworCQlicmVhazsKIAljYXNlIDU6CiAJCXJldCA9IGlyb25sYWtlX2RvX3Jlc2V0KGRldiwgZmxhZ3MpOwogCQlicmVhazsKQEAgLTQ3Miw5ICs1MzIsMTQgQEAKIAkgKi8KIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSB8fAogCQkJIWRldl9wcml2LT5tbS5zdXNwZW5kZWQpIHsKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yZW5kZXJfcmluZzsKIAkJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDA7Ci0JCXJpbmctPmluaXQoZGV2LCByaW5nKTsKKworCQlkZXZfcHJpdi0+cmluZ1tSQ1NdLmluaXQoJmRldl9wcml2LT5yaW5nW1JDU10pOworCQlpZiAoSEFTX0JTRChkZXYpKQorCQkgICAgZGV2X3ByaXYtPnJpbmdbVkNTXS5pbml0KCZkZXZfcHJpdi0+cmluZ1tWQ1NdKTsKKwkJaWYgKEhBU19CTFQoZGV2KSkKKwkJICAgIGRldl9wcml2LT5yaW5nW0JDU10uaW5pdCgmZGV2X3ByaXYtPnJpbmdbQkNTXSk7CisKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAJCWRybV9pcnFfaW5zdGFsbChkZXYpOwpAQCAtNTIzLDYgKzU4OCw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWlmIChkcm1fZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCisJCXJldHVybiAwOworCiAJZXJyb3IgPSBpOTE1X2RybV9mcmVlemUoZHJtX2Rldik7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CkBAIC02MDYsNiArNjc0LDggQEAKIAkuZGV2aWNlX2lzX2FncCA9IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3AsCiAJLmVuYWJsZV92YmxhbmsgPSBpOTE1X2VuYWJsZV92YmxhbmssCiAJLmRpc2FibGVfdmJsYW5rID0gaTkxNV9kaXNhYmxlX3ZibGFuaywKKwkuZ2V0X3ZibGFua190aW1lc3RhbXAgPSBpOTE1X2dldF92YmxhbmtfdGltZXN0YW1wLAorCS5nZXRfc2Nhbm91dF9wb3NpdGlvbiA9IGk5MTVfZ2V0X2NydGNfc2Nhbm91dHBvcywKIAkuaXJxX3ByZWluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbCwKIAkuaXJxX3Bvc3RpbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLAogCS5pcnFfdW5pbnN0YWxsID0gaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKQEAgLTY2MSw4ICs3MzEsNiBAQAogCiAJZHJpdmVyLm51bV9pb2N0bHMgPSBpOTE1X21heF9pb2N0bDsKIAotCWk5MTVfZ2VtX3Nocmlua2VyX2luaXQoKTsKLQogCS8qCiAJICogSWYgQ09ORklHX0RSTV9JOTE1X0tNUyBpcyBzZXQsIGRlZmF1bHQgdG8gS01TIHVubGVzcwogCSAqIGV4cGxpY2l0bHkgZGlzYWJsZWQgd2l0aCB0aGUgbW9kdWxlIHBhcmFybWV0ZXIuCkBAIC02ODQsMTcgKzc1MiwxMSBAQAogCQlkcml2ZXIuZHJpdmVyX2ZlYXR1cmVzICY9IH5EUklWRVJfTU9ERVNFVDsKICNlbmRpZgogCi0JaWYgKCEoZHJpdmVyLmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9NT0RFU0VUKSkgewotCQlkcml2ZXIuc3VzcGVuZCA9IGk5MTVfc3VzcGVuZDsKLQkJZHJpdmVyLnJlc3VtZSA9IGk5MTVfcmVzdW1lOwotCX0KLQogCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGk5MTVfZXhpdCh2b2lkKQogewotCWk5MTVfZ2VtX3Nocmlua2VyX2V4aXQoKTsKIAlkcm1fZXhpdCgmZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggNDA5ODI2ZC4uNTk2OWY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC04OSw3ICs4OSw3IEBACiAJaW50IGlkOwogCXN0cnVjdCBwYWdlICoqcGFnZV9saXN0OwogCWRybV9kbWFfaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cl9vYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmN1cl9vYmo7CiB9OwogCiBzdHJ1Y3QgbWVtX2Jsb2NrIHsKQEAgLTEyNCw5ICsxMjQsOSBAQAogI2RlZmluZSBJOTE1X0ZFTkNFX1JFR19OT05FIC0xCiAKIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBsaXN0X2hlYWQgbHJ1X2xpc3Q7Ci0JYm9vbCBncHU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1aW50MzJfdCBzZXR1cF9zZXFubzsKIH07CiAKIHN0cnVjdCBzZHZvX2RldmljZV9tYXBwaW5nIHsKQEAgLTEzOSw2ICsxMzksOCBAQAogCXU4IGRkY19waW47CiB9OwogCitzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZTsKKwogc3RydWN0IGRybV9pOTE1X2Vycm9yX3N0YXRlIHsKIAl1MzIgZWlyOwogCXUzMiBwZ3RibF9lcjsKQEAgLTE0OCwzMiArMTUwLDQ3IEBACiAJdTMyIGlwZWhyOwogCXUzMiBpbnN0ZG9uZTsKIAl1MzIgYWN0aGQ7CisJdTMyIGVycm9yOyAvKiBnZW42KyAqLworCXUzMiBiY3NfYWN0aGQ7IC8qIGdlbjYrIGJsdCBlbmdpbmUgKi8KKwl1MzIgYmNzX2lwZWhyOworCXUzMiBiY3NfaXBlaXI7CisJdTMyIGJjc19pbnN0ZG9uZTsKKwl1MzIgYmNzX3NlcW5vOworCXUzMiB2Y3NfYWN0aGQ7IC8qIGdlbjYrIGJzZCBlbmdpbmUgKi8KKwl1MzIgdmNzX2lwZWhyOworCXUzMiB2Y3NfaXBlaXI7CisJdTMyIHZjc19pbnN0ZG9uZTsKKwl1MzIgdmNzX3NlcW5vOwogCXUzMiBpbnN0cG07CiAJdTMyIGluc3RwczsKIAl1MzIgaW5zdGRvbmUxOwogCXUzMiBzZXFubzsKIAl1NjQgYmJhZGRyOworCXU2NCBmZW5jZVsxNl07CiAJc3RydWN0IHRpbWV2YWwgdGltZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfb2JqZWN0IHsKIAkJaW50IHBhZ2VfY291bnQ7CiAJCXUzMiBndHRfb2Zmc2V0OwogCQl1MzIgKnBhZ2VzWzBdOwotCX0gKnJpbmdidWZmZXIsICpiYXRjaGJ1ZmZlclsyXTsKKwl9ICpyaW5nYnVmZmVyLCAqYmF0Y2hidWZmZXJbSTkxNV9OVU1fUklOR1NdOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9idWZmZXIgewotCQlzaXplX3Qgc2l6ZTsKKwkJdTMyIHNpemU7CiAJCXUzMiBuYW1lOwogCQl1MzIgc2Vxbm87CiAJCXUzMiBndHRfb2Zmc2V0OwogCQl1MzIgcmVhZF9kb21haW5zOwogCQl1MzIgd3JpdGVfZG9tYWluOwotCQl1MzIgZmVuY2VfcmVnOworCQlzMzIgZmVuY2VfcmVnOjU7CiAJCXMzMiBwaW5uZWQ6MjsKIAkJdTMyIHRpbGluZzoyOwogCQl1MzIgZGlydHk6MTsKIAkJdTMyIHB1cmdlYWJsZToxOwotCX0gKmFjdGl2ZV9ibzsKLQl1MzIgYWN0aXZlX2JvX2NvdW50OworCQl1MzIgcmluZzo0OworCQl1MzIgYWdwX3R5cGU6MTsKKwl9ICphY3RpdmVfYm8sICpwaW5uZWRfYm87CisJdTMyIGFjdGl2ZV9ib19jb3VudCwgcGlubmVkX2JvX2NvdW50OwogCXN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0YXRlICpvdmVybGF5OworCXN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICpkaXNwbGF5OwogfTsKIAogc3RydWN0IGRybV9pOTE1X2Rpc3BsYXlfZnVuY3MgewpAQCAtMjA3LDcgKzIyNCw2IEBACiAJdTggaXNfYnJvYWR3YXRlciA6IDE7CiAJdTggaXNfY3Jlc3RsaW5lIDogMTsKIAl1OCBoYXNfZmJjIDogMTsKLQl1OCBoYXNfcmM2IDogMTsKIAl1OCBoYXNfcGlwZV9jeHNyIDogMTsKIAl1OCBoYXNfaG90cGx1ZyA6IDE7CiAJdTggY3Vyc29yX25lZWRzX3BoeXNpY2FsIDogMTsKQEAgLTI0Myw2ICsyNTksNyBAQAogCWNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyAqaW5mbzsKIAogCWludCBoYXNfZ2VtOworCWludCByZWxhdGl2ZV9jb25zdGFudHNfbW9kZTsKIAogCXZvaWQgX19pb21lbSAqcmVnczsKIApAQCAtMjUzLDIwICsyNzAsMTUgQEAKIAl9ICpnbWJ1czsKIAogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciByZW5kZXJfcmluZzsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgYnNkX3Jpbmc7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIGJsdF9yaW5nOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciByaW5nW0k5MTVfTlVNX1JJTkdTXTsKIAl1aW50MzJfdCBuZXh0X3NlcW5vOwogCiAJZHJtX2RtYV9oYW5kbGVfdCAqc3RhdHVzX3BhZ2VfZG1haDsKLQl2b2lkICpzZXFub19wYWdlOwogCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOwogCXVpbnQzMl90IGNvdW50ZXI7Ci0JdW5zaWduZWQgaW50IHNlcW5vX2dmeF9hZGRyOwogCWRybV9sb2NhbF9tYXBfdCBod3NfbWFwOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqc2Vxbm9fb2JqOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcHdyY3R4OwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcmVuZGVyY3R4OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpwd3JjdHg7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnJlbmRlcmN0eDsKIAogCXN0cnVjdCByZXNvdXJjZSBtY2hfcmVzOwogCkBAIC0yNzUsMjUgKzI4NywxNyBAQAogCWludCBmcm9udF9vZmZzZXQ7CiAJaW50IGN1cnJlbnRfcGFnZTsKIAlpbnQgcGFnZV9mbGlwcGluZzsKLSNkZWZpbmUgSTkxNV9ERUJVR19SRUFEICgxPDwwKQotI2RlZmluZSBJOTE1X0RFQlVHX1dSSVRFICgxPDwxKQotCXVuc2lnbmVkIGxvbmcgZGVidWdfZmxhZ3M7CiAKLQl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CiAJYXRvbWljX3QgaXJxX3JlY2VpdmVkOwotCS8qKiBQcm90ZWN0cyB1c2VyX2lycV9yZWZjb3VudCBhbmQgaXJxX21hc2tfcmVnICovCi0Jc3BpbmxvY2tfdCB1c2VyX2lycV9sb2NrOwogCXUzMiB0cmFjZV9pcnFfc2Vxbm87CisKKwkvKiBwcm90ZWN0cyB0aGUgaXJxIG1hc2tzICovCisJc3BpbmxvY2tfdCBpcnFfbG9jazsKIAkvKiogQ2FjaGVkIHZhbHVlIG9mIElNUiB0byBhdm9pZCByZWFkcyBpbiB1cGRhdGluZyB0aGUgYml0ZmllbGQgKi8KLQl1MzIgaXJxX21hc2tfcmVnOwogCXUzMiBwaXBlc3RhdFsyXTsKLQkvKiogc3BsaXR0ZWQgaXJxIHJlZ3MgZm9yIGdyYXBoaWNzIGFuZCBkaXNwbGF5IGVuZ2luZSBvbiBJcm9ubGFrZSwKLQkgICAgaXJxX21hc2tfcmVnIGlzIHN0aWxsIHVzZWQgZm9yIGRpc3BsYXkgaXJxLiAqLwotCXUzMiBndF9pcnFfbWFza19yZWc7Ci0JdTMyIGd0X2lycV9lbmFibGVfcmVnOwotCXUzMiBkZV9pcnFfZW5hYmxlX3JlZzsKLQl1MzIgcGNoX2lycV9tYXNrX3JlZzsKLQl1MzIgcGNoX2lycV9lbmFibGVfcmVnOworCXUzMiBpcnFfbWFzazsKKwl1MzIgZ3RfaXJxX21hc2s7CisJdTMyIHBjaF9pcnFfbWFzazsKIAogCXUzMiBob3RwbHVnX3N1cHBvcnRlZF9tYXNrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBob3RwbHVnX3dvcms7CkBAIC0zMDYsNyArMzEwLDcgQEAKIAlpbnQgbnVtX3BpcGU7CiAKIAkvKiBGb3IgaGFuZ2NoZWNrIHRpbWVyICovCi0jZGVmaW5lIERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QgMjUwIC8qIGluIG1zICovCisjZGVmaW5lIERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QgMTUwMCAvKiBpbiBtcyAqLwogCXN0cnVjdCB0aW1lcl9saXN0IGhhbmdjaGVja190aW1lcjsKIAlpbnQgaGFuZ2NoZWNrX2NvdW50OwogCXVpbnQzMl90IGxhc3RfYWN0aGQ7CkBAIC0zMjksNiArMzMzLDcgQEAKIAogCS8qIExWRFMgaW5mbyAqLwogCWludCBiYWNrbGlnaHRfbGV2ZWw7ICAvKiByZXN0b3JlIGJhY2tsaWdodCB0byB0aGlzIHZhbHVlICovCisJYm9vbCBiYWNrbGlnaHRfZW5hYmxlZDsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbGZwX2x2ZHNfdmJ0X21vZGU7IC8qIGlmIGFueSAqLwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzZHZvX2x2ZHNfdmJ0X21vZGU7IC8qIGlmIGFueSAqLwpAQCAtNTMwLDIzICs1MzUsMjEgQEAKIAogCXN0cnVjdCB7CiAJCS8qKiBCcmlkZ2UgdG8gaW50ZWwtZ3R0LWtvICovCi0JCXN0cnVjdCBpbnRlbF9ndHQgKmd0dDsKKwkJY29uc3Qgc3RydWN0IGludGVsX2d0dCAqZ3R0OwogCQkvKiogTWVtb3J5IGFsbG9jYXRvciBmb3IgR1RUIHN0b2xlbiBtZW1vcnkgKi8KLQkJc3RydWN0IGRybV9tbSB2cmFtOworCQlzdHJ1Y3QgZHJtX21tIHN0b2xlbjsKIAkJLyoqIE1lbW9yeSBhbGxvY2F0b3IgZm9yIEdUVCAqLwogCQlzdHJ1Y3QgZHJtX21tIGd0dF9zcGFjZTsKKwkJLyoqIExpc3Qgb2YgYWxsIG9iamVjdHMgaW4gZ3R0X3NwYWNlLiBVc2VkIHRvIHJlc3RvcmUgZ3R0CisJCSAqIG1hcHBpbmdzIG9uIHJlc3VtZSAqLworCQlzdHJ1Y3QgbGlzdF9oZWFkIGd0dF9saXN0OworCQkvKiogRW5kIG9mIG1hcHBhYmxlIHBhcnQgb2YgR1RUICovCisJCXVuc2lnbmVkIGxvbmcgZ3R0X21hcHBhYmxlX2VuZDsKIAogCQlzdHJ1Y3QgaW9fbWFwcGluZyAqZ3R0X21hcHBpbmc7CiAJCWludCBndHRfbXRycjsKIAotCQkvKioKLQkJICogTWVtYmVyc2hpcCBvbiBsaXN0IG9mIGFsbCBsb2FkZWQgZGV2aWNlcywgdXNlZCB0byBldmljdAotCQkgKiBpbmFjdGl2ZSBidWZmZXJzIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS4KLQkJICoKLQkJICogTW9kaWZpY2F0aW9ucyBzaG91bGQgb25seSBiZSBkb25lIHdoaWxzdCBob2xkaW5nIHRoZQotCQkgKiBzaHJpbmtfbGlzdF9sb2NrIHNwaW5sb2NrLgotCQkgKi8KLQkJc3RydWN0IGxpc3RfaGVhZCBzaHJpbmtfbGlzdDsKKwkJc3RydWN0IHNocmlua2VyIGluYWN0aXZlX3Nocmlua2VyOwogCiAJCS8qKgogCQkgKiBMaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGludm9sdmVkIGluIHJlbmRlcmluZy4KQEAgLTYwOSwxNiArNjEyLDYgQEAKIAkJc3RydWN0IGRlbGF5ZWRfd29yayByZXRpcmVfd29yazsKIAogCQkvKioKLQkJICogV2FpdGluZyBzZXF1ZW5jZSBudW1iZXIsIGlmIGFueQotCQkgKi8KLQkJdWludDMyX3Qgd2FpdGluZ19nZW1fc2Vxbm87Ci0KLQkJLyoqCi0JCSAqIExhc3Qgc2VxIHNlZW4gYXQgaXJxIHRpbWUKLQkJICovCi0JCXVpbnQzMl90IGlycV9nZW1fc2Vxbm87Ci0KLQkJLyoqCiAJCSAqIEZsYWcgaWYgdGhlIFggU2VydmVyLCBhbmQgdGh1cyBEUk0sIGlzIG5vdCBjdXJyZW50bHkgaW4KIAkJICogY29udHJvbCBvZiB0aGUgZGV2aWNlLgogCQkgKgpAQCAtNjQ1LDE2ICs2MzgsMTEgQEAKIAkJLyogc3RvcmFnZSBmb3IgcGh5c2ljYWwgb2JqZWN0cyAqLwogCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0ICpwaHlzX29ianNbSTkxNV9NQVhfUEhZU19PQkpFQ1RdOwogCi0JCXVpbnQzMl90IGZsdXNoX3JpbmdzOwotCiAJCS8qIGFjY291bnRpbmcsIHVzZWZ1bCBmb3IgdXNlcmxhbmQgZGVidWdnaW5nICovCi0JCXNpemVfdCBvYmplY3RfbWVtb3J5OwotCQlzaXplX3QgcGluX21lbW9yeTsKLQkJc2l6ZV90IGd0dF9tZW1vcnk7CiAJCXNpemVfdCBndHRfdG90YWw7CisJCXNpemVfdCBtYXBwYWJsZV9ndHRfdG90YWw7CisJCXNpemVfdCBvYmplY3RfbWVtb3J5OwogCQl1MzIgb2JqZWN0X2NvdW50OwotCQl1MzIgcGluX2NvdW50OwotCQl1MzIgZ3R0X2NvdW50OwogCX0gbW07CiAJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgc2R2b19tYXBwaW5nc1syXTsKIAkvKiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBMVkRTX0JPUkRFUiBzaG91bGQgYmUgZW5hYmxlZCBvciBub3QgKi8KQEAgLTY4OCwxNCArNjc2LDE0IEBACiAJdTggZm1heDsKIAl1OCBmc3RhcnQ7CiAKLSAJdTY0IGxhc3RfY291bnQxOwotIAl1bnNpZ25lZCBsb25nIGxhc3RfdGltZTE7Ci0gCXU2NCBsYXN0X2NvdW50MjsKLSAJc3RydWN0IHRpbWVzcGVjIGxhc3RfdGltZTI7Ci0gCXVuc2lnbmVkIGxvbmcgZ2Z4X3Bvd2VyOwotIAlpbnQgY19tOwotIAlpbnQgcl90OwotIAl1OCBjb3JyOworCXU2NCBsYXN0X2NvdW50MTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdGltZTE7CisJdTY0IGxhc3RfY291bnQyOworCXN0cnVjdCB0aW1lc3BlYyBsYXN0X3RpbWUyOworCXVuc2lnbmVkIGxvbmcgZ2Z4X3Bvd2VyOworCWludCBjX207CisJaW50IHJfdDsKKwl1OCBjb3JyOwogCXNwaW5sb2NrX3QgKm1jaGRldl9sb2NrOwogCiAJZW51bSBub19mYmNfcmVhc29uIG5vX2ZiY19yZWFzb247CkBAIC03MDksMjAgKzY5NywyMCBAQAogCXN0cnVjdCBpbnRlbF9mYmRldiAqZmJkZXY7CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIAotLyoqIGRyaXZlciBwcml2YXRlIHN0cnVjdHVyZSBhdHRhY2hlZCB0byBlYWNoIGRybV9nZW1fb2JqZWN0ICovCiBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCB7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0IGJhc2U7CiAKIAkvKiogQ3VycmVudCBzcGFjZSBhbGxvY2F0ZWQgdG8gdGhpcyBvYmplY3QgaW4gdGhlIEdUVCwgaWYgYW55LiAqLwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqZ3R0X3NwYWNlOworCXN0cnVjdCBsaXN0X2hlYWQgZ3R0X2xpc3Q7CiAKIAkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBvbiB0aGUgYWN0aXZlL2ZsdXNoaW5nL2luYWN0aXZlIGxpc3RzICovCiAJc3RydWN0IGxpc3RfaGVhZCByaW5nX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBtbV9saXN0OwogCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIG9uIEdQVSB3cml0ZSBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBncHVfd3JpdGVfbGlzdDsKLQkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBvbiBldmljdGlvbiBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBldmljdF9saXN0OworCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIGluIHRoZSBiYXRjaGJ1ZmZlciBvciBvbiB0aGUgZXZpY3Rpb24gbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgZXhlY19saXN0OwogCiAJLyoqCiAJICogVGhpcyBpcyBzZXQgaWYgdGhlIG9iamVjdCBpcyBvbiB0aGUgYWN0aXZlIG9yIGZsdXNoaW5nIGxpc3RzCkBAIC03MzgsNiArNzI2LDEyIEBACiAJdW5zaWduZWQgaW50IGRpcnR5IDogMTsKIAogCS8qKgorCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gd3JpdHRlbiB0byBzaW5jZSB0aGUgbGFzdAorCSAqIEdQVSBmbHVzaC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcGVuZGluZ19ncHVfd3JpdGUgOiAxOworCisJLyoqCiAJICogRmVuY2UgcmVnaXN0ZXIgYml0cyAoaWYgYW55KSBmb3IgdGhpcyBvYmplY3QuICBXaWxsIGJlIHNldAogCSAqIGFzIG5lZWRlZCB3aGVuIG1hcHBlZCBpbnRvIHRoZSBHVFQuCiAJICogUHJvdGVjdGVkIGJ5IGRldi0+c3RydWN0X211dGV4LgpAQCAtNzQ3LDI5ICs3NDEsMTUgQEAKIAlzaWduZWQgaW50IGZlbmNlX3JlZyA6IDU7CiAKIAkvKioKLQkgKiBVc2VkIGZvciBjaGVja2luZyB0aGUgb2JqZWN0IGRvZXNuJ3QgYXBwZWFyIG1vcmUgdGhhbiBvbmNlCi0JICogaW4gYW4gZXhlY2J1ZmZlciBvYmplY3QgbGlzdC4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgaW5fZXhlY2J1ZmZlciA6IDE7Ci0KLQkvKioKIAkgKiBBZHZpY2U6IGFyZSB0aGUgYmFja2luZyBwYWdlcyBwdXJnZWFibGU/CiAJICovCiAJdW5zaWduZWQgaW50IG1hZHYgOiAyOwogCiAJLyoqCi0JICogUmVmY291bnQgZm9yIHRoZSBwYWdlcyBhcnJheS4gV2l0aCB0aGUgY3VycmVudCBsb2NraW5nIHNjaGVtZSwgdGhlcmUKLQkgKiBhcmUgYXQgbW9zdCB0d28gY29uY3VycmVudCB1c2VyczogQmluZGluZyBhIGJvIHRvIHRoZSBndHQgYW5kCi0JICogcHdyaXRlL3ByZWFkIHVzaW5nIHBoeXNpY2FsIGFkZHJlc3Nlcy4gU28gdHdvIGJpdHMgZm9yIGEgbWF4aW11bQotCSAqIG9mIHR3byB1c2VycyBhcmUgZW5vdWdoLgotCSAqLwotCXVuc2lnbmVkIGludCBwYWdlc19yZWZjb3VudCA6IDI7Ci0jZGVmaW5lIERSTV9JOTE1X0dFTV9PQkpFQ1RfTUFYX1BBR0VTX1JFRkNPVU5UIDB4MwotCi0JLyoqCiAJICogQ3VycmVudCB0aWxpbmcgbW9kZSBmb3IgdGhlIG9iamVjdC4KIAkgKi8KIAl1bnNpZ25lZCBpbnQgdGlsaW5nX21vZGUgOiAyOworCXVuc2lnbmVkIGludCB0aWxpbmdfY2hhbmdlZCA6IDE7CiAKIAkvKiogSG93IG1hbnkgdXNlcnMgaGF2ZSBwaW5uZWQgdGhpcyBvYmplY3QgaW4gR1RUIHNwYWNlLiBUaGUgZm9sbG93aW5nCiAJICogdXNlcnMgY2FuIGVhY2ggaG9sZCBhdCBtb3N0IG9uZSByZWZlcmVuY2U6IHB3cml0ZS9wcmVhZCwgcGluX2lvY3RsCkBAIC03ODMsMjggKzc2Myw1NSBAQAogCXVuc2lnbmVkIGludCBwaW5fY291bnQgOiA0OwogI2RlZmluZSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QSU5fQ09VTlQgMHhmCiAKLQkvKiogQUdQIG1lbW9yeSBzdHJ1Y3R1cmUgZm9yIG91ciBHVFQgYmluZGluZy4gKi8KLQlEUk1fQUdQX01FTSAqYWdwX21lbTsKKwkvKioKKwkgKiBJcyB0aGUgb2JqZWN0IGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBndHQgbWFwcGFibGUgYW5kCisJICogZmVuY2VhYmxlPyBVc2VkIHRvIGF2b2lkIGNvc3RseSByZWNhbGN1bGF0aW9ucy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbWFwX2FuZF9mZW5jZWFibGUgOiAxOworCisJLyoqCisJICogV2hldGhlciB0aGUgY3VycmVudCBndHQgbWFwcGluZyBuZWVkcyB0byBiZSBtYXBwYWJsZSAoYW5kIGlzbid0IGp1c3QKKwkgKiBtYXBwYWJsZSBieSBhY2NpZGVudCkuIFRyYWNrIHBpbiBhbmQgZmF1bHQgc2VwYXJhdGUgZm9yIGEgbW9yZQorCSAqIGFjY3VyYXRlIG1hcHBhYmxlIHdvcmtpbmcgc2V0LgorCSAqLworCXVuc2lnbmVkIGludCBmYXVsdF9tYXBwYWJsZSA6IDE7CisJdW5zaWduZWQgaW50IHBpbl9tYXBwYWJsZSA6IDE7CisKKwkvKgorCSAqIElzIHRoZSBHUFUgY3VycmVudGx5IHVzaW5nIGEgZmVuY2UgdG8gYWNjZXNzIHRoaXMgYnVmZmVyLAorCSAqLworCXVuc2lnbmVkIGludCBwZW5kaW5nX2ZlbmNlZF9ncHVfYWNjZXNzOjE7CisJdW5zaWduZWQgaW50IGZlbmNlZF9ncHVfYWNjZXNzOjE7CiAKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCiAJLyoqCisJICogRE1BUiBzdXBwb3J0CisJICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0OworCWludCBudW1fc2c7CisKKwkvKioKKwkgKiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmluZyBleGVjYnVmZmVyIGluc2VydGlvbi4KKwkgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBleGVjX25vZGU7CisJdW5zaWduZWQgbG9uZyBleGVjX2hhbmRsZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlY19lbnRyeTsKKworCS8qKgogCSAqIEN1cnJlbnQgb2Zmc2V0IG9mIHRoZSBvYmplY3QgaW4gR1RUIHNwYWNlLgogCSAqCiAJICogVGhpcyBpcyB0aGUgc2FtZSBhcyBndHRfc3BhY2UtPnN0YXJ0CiAJICovCiAJdWludDMyX3QgZ3R0X29mZnNldDsKIAotCS8qIFdoaWNoIHJpbmcgaXMgcmVmZXJpbmcgdG8gaXMgdGhpcyBvYmplY3QgKi8KLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7Ci0KLQkvKioKLQkgKiBGYWtlIG9mZnNldCBmb3IgdXNlIGJ5IG1tYXAoMikKLQkgKi8KLQl1aW50NjRfdCBtbWFwX29mZnNldDsKLQogCS8qKiBCcmVhZGNydW1iIG9mIGxhc3QgcmVuZGVyaW5nIHRvIHRoZSBidWZmZXIuICovCiAJdWludDMyX3QgbGFzdF9yZW5kZXJpbmdfc2Vxbm87CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOworCisJLyoqIEJyZWFkY3J1bWIgb2YgbGFzdCBmZW5jZWQgR1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyLiAqLworCXVpbnQzMl90IGxhc3RfZmVuY2VkX3NlcW5vOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqbGFzdF9mZW5jZWRfcmluZzsKIAogCS8qKiBDdXJyZW50IHRpbGluZyBzdHJpZGUgZm9yIHRoZSBvYmplY3QsIGlmIGl0J3MgdGlsZWQuICovCiAJdWludDMyX3Qgc3RyaWRlOwpAQCAtODgwLDExICs4ODcsNzQgQEAKIAlDSElQX0k5NjUgPSAweDA4LAogfTsKIAorI2RlZmluZSBJTlRFTF9JTkZPKGRldikJKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikgKGRldiktPmRldl9wcml2YXRlKS0+aW5mbykKKworI2RlZmluZSBJU19JODMwKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDM1NzcpCisjZGVmaW5lIElTXzg0NUcoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU2MikKKyNkZWZpbmUgSVNfSTg1WChkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pODV4KQorI2RlZmluZSBJU19JODY1RyhkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTcyKQorI2RlZmluZSBJU19JOTE1RyhkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTE1ZykKKyNkZWZpbmUgSVNfSTkxNUdNKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1OTIpCisjZGVmaW5lIElTX0k5NDVHKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI3NzIpCisjZGVmaW5lIElTX0k5NDVHTShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTQ1Z20pCisjZGVmaW5lIElTX0JST0FEV0FURVIoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19icm9hZHdhdGVyKQorI2RlZmluZSBJU19DUkVTVExJTkUoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19jcmVzdGxpbmUpCisjZGVmaW5lIElTX0dNNDUoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkE0MikKKyNkZWZpbmUgSVNfRzRYKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2c0eCkKKyNkZWZpbmUgSVNfUElORVZJRVdfRyhkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMDEpCisjZGVmaW5lIElTX1BJTkVWSUVXX00oZGV2KQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHhhMDExKQorI2RlZmluZSBJU19QSU5FVklFVyhkZXYpCShJTlRFTF9JTkZPKGRldiktPmlzX3BpbmV2aWV3KQorI2RlZmluZSBJU19HMzMoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfZzMzKQorI2RlZmluZSBJU19JUk9OTEFLRV9EKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0MikKKyNkZWZpbmUgSVNfSVJPTkxBS0VfTShkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDAwNDYpCisjZGVmaW5lIElTX01PQklMRShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19tb2JpbGUpCisKKyNkZWZpbmUgSVNfR0VOMihkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAyKQorI2RlZmluZSBJU19HRU4zKGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDMpCisjZGVmaW5lIElTX0dFTjQoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNCkKKyNkZWZpbmUgSVNfR0VONShkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA1KQorI2RlZmluZSBJU19HRU42KGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDYpCisKKyNkZWZpbmUgSEFTX0JTRChkZXYpICAgICAgICAgICAgKElOVEVMX0lORk8oZGV2KS0+aGFzX2JzZF9yaW5nKQorI2RlZmluZSBIQVNfQkxUKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5oYXNfYmx0X3JpbmcpCisjZGVmaW5lIEk5MTVfTkVFRF9HRlhfSFdTKGRldikJKElOVEVMX0lORk8oZGV2KS0+bmVlZF9nZnhfaHdzKQorCisjZGVmaW5lIEhBU19PVkVSTEFZKGRldikJCShJTlRFTF9JTkZPKGRldiktPmhhc19vdmVybGF5KQorI2RlZmluZSBPVkVSTEFZX05FRURTX1BIWVNJQ0FMKGRldikJKElOVEVMX0lORk8oZGV2KS0+b3ZlcmxheV9uZWVkc19waHlzaWNhbCkKKworLyogV2l0aCB0aGUgOTQ1IGFuZCBsYXRlciwgWSB0aWxpbmcgZ290IGFkanVzdGVkIHNvIHRoYXQgaXQgd2FzIDMyIDEyOC1ieXRlCisgKiByb3dzLCB3aGljaCBjaGFuZ2VkIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCBmZW5jZSBwcm9ncmFtbWluZy4KKyAqLworI2RlZmluZSBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSAoIUlTX0dFTjIoZGV2KSAmJiAhKElTX0k5MTVHKGRldikgfHwgXAorCQkJCQkJICAgICAgSVNfSTkxNUdNKGRldikpKQorI2RlZmluZSBTVVBQT1JUU19ESUdJVEFMX09VVFBVVFMoZGV2KQkoIUlTX0dFTjIoZGV2KSAmJiAhSVNfUElORVZJRVcoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpCShJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpCisjZGVmaW5lIFNVUFBPUlRTX0VEUChkZXYpCQkoSVNfSVJPTkxBS0VfTShkZXYpKQorI2RlZmluZSBTVVBQT1JUU19UVihkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5zdXBwb3J0c190dikKKyNkZWZpbmUgSTkxNV9IQVNfSE9UUExVRyhkZXYpCQkgKElOVEVMX0lORk8oZGV2KS0+aGFzX2hvdHBsdWcpCisvKiBkc3BhcmIgY29udHJvbGxlZCBieSBodyBvbmx5ICovCisjZGVmaW5lIERTUEFSQl9IV0NPTlRST0woZGV2KSAoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkKKworI2RlZmluZSBIQVNfRldfQkxDKGRldikgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gMikKKyNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19waXBlX2N4c3IpCisjZGVmaW5lIEk5MTVfSEFTX0ZCQyhkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19mYmMpCisKKyNkZWZpbmUgSEFTX1BDSF9TUExJVChkZXYpIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQorI2RlZmluZSBIQVNfUElQRV9DT05UUk9MKGRldikgKElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikpCisKKyNkZWZpbmUgSU5URUxfUENIX1RZUEUoZGV2KSAoKChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqKShkZXYpLT5kZXZfcHJpdmF0ZSktPnBjaF90eXBlKQorI2RlZmluZSBIQVNfUENIX0NQVChkZXYpIChJTlRFTF9QQ0hfVFlQRShkZXYpID09IFBDSF9DUFQpCisjZGVmaW5lIEhBU19QQ0hfSUJYKGRldikgKElOVEVMX1BDSF9UWVBFKGRldikgPT0gUENIX0lCWCkKKworI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKwogZXh0ZXJuIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpOTE1X2lvY3Rsc1tdOwogZXh0ZXJuIGludCBpOTE1X21heF9pb2N0bDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaTkxNV9mYnBlcmNydGM7CiBleHRlcm4gdW5zaWduZWQgaW50IGk5MTVfcG93ZXJzYXZlOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X2x2ZHNfZG93bmNsb2NrOworZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X3BhbmVsX3VzZV9zc2M7CiAKIGV4dGVybiBpbnQgaTkxNV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IGk5MTVfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtOTA3LDggKzk3Nyw4IEBACiBleHRlcm4gbG9uZyBpOTE1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQgaTkxNV9lbWl0X2JveChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlcywKLQkJCSBpbnQgaSwgaW50IERSMSwgaW50IERSNCk7CisJCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCwKKwkJCSBpbnQgRFIxLCBpbnQgRFI0KTsKIGV4dGVybiBpbnQgaTkxNV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCBmbGFncyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpOTE1X2NoaXBzZXRfdmFsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpOTE1X21jaF92YWwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKQEAgLTkxOCw2ICs5ODgsNyBAQAogCiAvKiBpOTE1X2lycS5jICovCiB2b2lkIGk5MTVfaGFuZ2NoZWNrX2VsYXBzZWQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgaTkxNV9oYW5kbGVfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCB3ZWRnZWQpOwogZXh0ZXJuIGludCBpOTE1X2lycV9lbWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCkBAIC05MzksMTIgKzEwMTAsNiBAQAogZXh0ZXJuIHUzMiBnbTQ1X2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gdm9pZCBpOTE1X2VuYWJsZV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spOwotZXh0ZXJuIHZvaWQgaTkxNV9kaXNhYmxlX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzayk7Ci1leHRlcm4gdm9pZCBpcm9ubGFrZV9lbmFibGVfZ3JhcGhpY3NfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCXUzMiBtYXNrKTsKLWV4dGVybiB2b2lkIGlyb25sYWtlX2Rpc2FibGVfZ3JhcGhpY3NfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCXUzMiBtYXNrKTsKIAogdm9pZAogaTkxNV9lbmFibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKQEAgLTk1Myw2ICsxMDE4LDEzIEBACiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAogdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCSAgICAgIGludCAqbWF4X2Vycm9yLAorCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpOworCitpbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAorCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGV4dGVybiB2b2lkIGk5MTVfZGVzdHJveV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTEwMTcsMTUgKzEwODksMjggQEAKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiB2b2lkIGk5MTVfZ2VtX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaTkxNV9nZW1faW5pdF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RydWN0IGRybV9nZW1fb2JqZWN0ICogaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplKTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9nZW1fZmx1c2hfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJCSAgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAorCQkJCSAgICAgdWludDMyX3QgZmx1c2hfZG9tYWlucyk7CitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgIHNpemVfdCBzaXplKTsKIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotaW50IGk5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IGFsaWdubWVudCk7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF91bnBpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgIHVpbnQzMl90IGFsaWdubWVudCwKKwkJCQkgICAgIGJvb2wgbWFwX2FuZF9mZW5jZWFibGUpOwordm9pZCBpOTE1X2dlbV9vYmplY3RfdW5waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF91bmJpbmQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIHZvaWQgaTkxNV9nZW1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCitpbnQgX19tdXN0X2NoZWNrIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkJCWJvb2wgaW50ZXJydXB0aWJsZSk7Cit2b2lkIGk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgIHUzMiBzZXFubyk7CisKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHNlcTEgaXMgbGF0ZXIgdGhhbiBzZXEyLgogICovCkBAIC0xMDM1LDczICsxMTIwLDg4IEBACiAJcmV0dXJuIChpbnQzMl90KShzZXExIC0gc2VxMikgPj0gMDsKIH0KIAotaW50IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKLWludCBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgIGJvb2wgaW50ZXJydXB0aWJsZSk7CitzdGF0aWMgaW5saW5lIHUzMgoraTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiByaW5nLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QgPSBkZXZfcHJpdi0+bmV4dF9zZXFubzsKK30KKworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkLAorCQkJCQkgICBib29sIGludGVycnVwdGlibGUpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworCiB2b2lkIGk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9nZW1fcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLWludCBpOTE1X2dlbV9vYmplY3Rfc2V0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgICAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCi0JCQkgICAgICAgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKLWludCBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICAgICBib29sIGludGVycnVwdGlibGUpOwotaW50IGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF9zZXRfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCisJCQkJCSAgICB1aW50MzJfdCB3cml0ZV9kb21haW4pOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgIGJvb2wgaW50ZXJydXB0aWJsZSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCk7Ci1pbnQgaTkxNV9ncHVfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWludCBpOTE1X2dlbV9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotdWludDMyX3QgaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0LAotCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotaW50IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgdWludDMyX3Qgc2Vxbm8sCi0JCQkgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBwYWJsZV9lbmQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9ncHVfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9nZW1faWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2RvX3dhaXRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHVpbnQzMl90IHNlcW5vLAorCQkJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogaW50IGk5MTVfZ2VtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgIGludCB3cml0ZSk7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19kaXNwbGF5X3BsYW5lKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCQkgYm9vbCBwaXBlbGluZWQpOworaW50IF9fbXVzdF9jaGVjaworaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICBib29sIHdyaXRlKTsKK2ludCBfX211c3RfY2hlY2sKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fZGlzcGxheV9wbGFuZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpOwogaW50IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJaW50IGlkLAogCQkJCWludCBhbGlnbik7CiB2b2lkIGk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogdm9pZCBpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLXZvaWQgaTkxNV9nZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwordm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiAKLXZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfaW5pdCh2b2lkKTsKLXZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCh2b2lkKTsKKy8qIGk5MTVfZ2VtX2d0dC5jICovCit2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ndHRfYmluZF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCiAvKiBpOTE1X2dlbV9ldmljdC5jICovCi1pbnQgaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBtaW5fc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KTsKLWludCBpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IGk5MTVfZ2VtX2V2aWN0X2luYWN0aXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLAorCQkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgYm9vbCBtYXBwYWJsZSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgYm9vbCBwdXJnZWFibGVfb25seSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2V2aWN0X2luYWN0aXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSBib29sIHB1cmdlYWJsZV9vbmx5KTsKIAogLyogaTkxNV9nZW1fdGlsaW5nLmMgKi8KIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLWJvb2wgaTkxNV90aWxpbmdfb2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHN0cmlkZSwgaW50IHNpemUsCi0JCSAgICBpbnQgdGlsaW5nX21vZGUpOwotYm9vbCBpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2Zmc2V0X29rKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgaW50IHRpbGluZ19tb2RlKTsKK3ZvaWQgaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwordm9pZCBpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAogLyogaTkxNV9nZW1fZGVidWcuYyAqLwotdm9pZCBpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IGxlbiwKK3ZvaWQgaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IGxlbiwKIAkJCSAgY29uc3QgY2hhciAqd2hlcmUsIHVpbnQzMl90IG1hcmspOwogI2lmIFdBVENIX0xJU1RTCiBpbnQgaTkxNV92ZXJpZnlfbGlzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAjZWxzZQogI2RlZmluZSBpOTE1X3ZlcmlmeV9saXN0cyhkZXYpIDAKICNlbmRpZgotdm9pZCBpOTE1X2dlbV9vYmplY3RfY2hlY2tfY29oZXJlbmN5KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBpbnQgaGFuZGxlKTsKLXZvaWQgaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBsZW4sCit2b2lkIGk5MTVfZ2VtX29iamVjdF9jaGVja19jb2hlcmVuY3koc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgIGludCBoYW5kbGUpOwordm9pZCBpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgbGVuLAogCQkJICBjb25zdCBjaGFyICp3aGVyZSwgdWludDMyX3QgbWFyayk7CiAKIC8qIGk5MTVfZGVidWdmcy5jICovCkBAIC0xMTYzLDYgKzEyNjMsOCBAQAogZXh0ZXJuIHZvaWQgaW50ZWxfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpOwogZXh0ZXJuIGJvb2wgaW50ZWxfZmJjX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gYm9vbCBpcm9ubGFrZV9zZXRfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpOworZXh0ZXJuIHZvaWQgaXJvbmxha2VfZW5hYmxlX3JjNihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGdlbjZfc2V0X3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZGV0ZWN0X3BjaCAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGludGVsX3RyYW5zX2RwX3BvcnRfc2VsIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwogCkBAIC0xMTcwLDc5ICsxMjcyLDEyMCBAQAogI2lmZGVmIENPTkZJR19ERUJVR19GUwogZXh0ZXJuIHN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0YXRlICppbnRlbF9vdmVybGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF9vdmVybGF5X3ByaW50X2Vycm9yX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGludGVsX292ZXJsYXlfZXJyb3Jfc3RhdGUgKmVycm9yKTsKKworZXh0ZXJuIHN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICppbnRlbF9kaXNwbGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbnRlbF9kaXNwbGF5X3ByaW50X2Vycm9yX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQkJICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqZXJyb3IpOwogI2VuZGlmCiAKKyNkZWZpbmUgTFBfUklORyhkKSAoJigoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikoZCkpLT5yaW5nW1JDU10pCisKKyNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSBcCisJaW50ZWxfcmluZ19iZWdpbihMUF9SSU5HKGRldl9wcml2KSwgKG4pKQorCisjZGVmaW5lIE9VVF9SSU5HKHgpIFwKKwlpbnRlbF9yaW5nX2VtaXQoTFBfUklORyhkZXZfcHJpdiksIHgpCisKKyNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgXAorCWludGVsX3JpbmdfYWR2YW5jZShMUF9SSU5HKGRldl9wcml2KSkKKwogLyoqCiAgKiBMb2NrIHRlc3QgZm9yIHdoZW4gaXQncyBqdXN0IGZvciBzeW5jaHJvbml6YXRpb24gb2YgcmluZyBhY2Nlc3MuCiAgKgogICogSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGl0IHdoZW4gR0VNIGlzIGluaXRpYWxpemVkIGFzIG5vYm9keSBlbHNlCiAgKiBoYXMgYWNjZXNzIHRvIHRoZSByaW5nLgogICovCi0jZGVmaW5lIFJJTkdfTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KSBkbyB7CQkJXAotCWlmICgoKGRybV9pOTE1X3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5yZW5kZXJfcmluZy5nZW1fb2JqZWN0IFwKLQkJCT09IE5VTEwpCQkJCQlcCi0JCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CQkJXAorI2RlZmluZSBSSU5HX0xPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGUpIGRvIHsJCQlcCisJaWYgKExQX1JJTkcoZGV2LT5kZXZfcHJpdmF0ZSktPm9iaiA9PSBOVUxMKQkJCVwKKwkJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZSk7CQkJXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSB1MzIgaTkxNV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykKKworI2RlZmluZSBfX2k5MTVfcmVhZCh4LCB5KSBcCitzdGF0aWMgaW5saW5lIHUjI3ggaTkxNV9yZWFkIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykgeyBcCisJdSMjeCB2YWwgPSByZWFkIyN5KGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAorCXRyYWNlX2k5MTVfcmVnX3J3KCdSJywgcmVnLCB2YWwsIHNpemVvZih2YWwpKTsgXAorCXJldHVybiB2YWw7IFwKK30KK19faTkxNV9yZWFkKDgsIGIpCitfX2k5MTVfcmVhZCgxNiwgdykKK19faTkxNV9yZWFkKDMyLCBsKQorX19pOTE1X3JlYWQoNjQsIHEpCisjdW5kZWYgX19pOTE1X3JlYWQKKworI2RlZmluZSBfX2k5MTVfd3JpdGUoeCwgeSkgXAorc3RhdGljIGlubGluZSB2b2lkIGk5MTVfd3JpdGUjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1IyN4IHZhbCkgeyBcCisJdHJhY2VfaTkxNV9yZWdfcncoJ1cnLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCisJd3JpdGUjI3kodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7IFwKK30KK19faTkxNV93cml0ZSg4LCBiKQorX19pOTE1X3dyaXRlKDE2LCB3KQorX19pOTE1X3dyaXRlKDMyLCBsKQorX19pOTE1X3dyaXRlKDY0LCBxKQorI3VuZGVmIF9faTkxNV93cml0ZQorCisjZGVmaW5lIEk5MTVfUkVBRDgocmVnKQkJaTkxNV9yZWFkOChkZXZfcHJpdiwgKHJlZykpCisjZGVmaW5lIEk5MTVfV1JJVEU4KHJlZywgdmFsKQlpOTE1X3dyaXRlOChkZXZfcHJpdiwgKHJlZyksICh2YWwpKQorCisjZGVmaW5lIEk5MTVfUkVBRDE2KHJlZykJaTkxNV9yZWFkMTYoZGV2X3ByaXYsIChyZWcpKQorI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLCB2YWwpCWk5MTVfd3JpdGUxNihkZXZfcHJpdiwgKHJlZyksICh2YWwpKQorI2RlZmluZSBJOTE1X1JFQUQxNl9OT1RSQUNFKHJlZykJcmVhZHcoZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgSTkxNV9XUklURTE2X05PVFJBQ0UocmVnLCB2YWwpCXdyaXRldyh2YWwsIGRldl9wcml2LT5yZWdzICsgKHJlZykpCisKKyNkZWZpbmUgSTkxNV9SRUFEKHJlZykJCWk5MTVfcmVhZDMyKGRldl9wcml2LCAocmVnKSkKKyNkZWZpbmUgSTkxNV9XUklURShyZWcsIHZhbCkJaTkxNV93cml0ZTMyKGRldl9wcml2LCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIEk5MTVfUkVBRF9OT1RSQUNFKHJlZykJCXJlYWRsKGRldl9wcml2LT5yZWdzICsgKHJlZykpCisjZGVmaW5lIEk5MTVfV1JJVEVfTk9UUkFDRShyZWcsIHZhbCkJd3JpdGVsKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKKworI2RlZmluZSBJOTE1X1dSSVRFNjQocmVnLCB2YWwpCWk5MTVfd3JpdGU2NChkZXZfcHJpdiwgKHJlZyksICh2YWwpKQorI2RlZmluZSBJOTE1X1JFQUQ2NChyZWcpCWk5MTVfcmVhZDY0KGRldl9wcml2LCAocmVnKSkKKworI2RlZmluZSBQT1NUSU5HX1JFQUQocmVnKQkodm9pZClJOTE1X1JFQURfTk9UUkFDRShyZWcpCisjZGVmaW5lIFBPU1RJTkdfUkVBRDE2KHJlZykJKHZvaWQpSTkxNV9SRUFEMTZfTk9UUkFDRShyZWcpCisKKworLyogT24gU05CIHBsYXRmb3JtLCBiZWZvcmUgcmVhZGluZyByaW5nIHJlZ2lzdGVycyBmb3JjZXdha2UgYml0CisgKiBtdXN0IGJlIHNldCB0byBwcmV2ZW50IEdUIGNvcmUgZnJvbSBwb3dlciBkb3duIGFuZCBzdGFsZSB2YWx1ZXMgYmVpbmcKKyAqIHJldHVybmVkLgorICovCit2b2lkIF9fZ2VuNl9mb3JjZV93YWtlX2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwordm9pZCBfX2dlbjZfZm9yY2Vfd2FrZV9wdXQgKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CitzdGF0aWMgaW5saW5lIHUzMiBpOTE1X3NhZmVfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpCiB7CiAJdTMyIHZhbDsKIAotCXZhbCA9IHJlYWRsKGRldl9wcml2LT5yZWdzICsgcmVnKTsKLQlpZiAoZGV2X3ByaXYtPmRlYnVnX2ZsYWdzICYgSTkxNV9ERUJVR19SRUFEKQotCQlwcmludGsoS0VSTl9FUlIgInJlYWQgMHglMDh4IGZyb20gMHglMDh4XG4iLCB2YWwsIHJlZyk7CisJaWYgKGRldl9wcml2LT5pbmZvLT5nZW4gPj0gNikgeworCQlfX2dlbjZfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOworCQl2YWwgPSBJOTE1X1JFQUQocmVnKTsKKwkJX19nZW42X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwl9IGVsc2UKKwkJdmFsID0gSTkxNV9SRUFEKHJlZyk7CisKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaTkxNV93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsCi0JCQkgICAgICB1MzIgdmFsKQorc3RhdGljIGlubGluZSB2b2lkCitpOTE1X3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywgdTY0IHZhbCwgaW50IGxlbikKIHsKLQl3cml0ZWwodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7Ci0JaWYgKGRldl9wcml2LT5kZWJ1Z19mbGFncyAmIEk5MTVfREVCVUdfV1JJVEUpCi0JCXByaW50ayhLRVJOX0VSUiAid3JvdGUgMHglMDh4IHRvIDB4JTA4eFxuIiwgdmFsLCByZWcpOworICAgICAgIC8qIFRyYWNlIGRvd24gdGhlIHdyaXRlIG9wZXJhdGlvbiBiZWZvcmUgdGhlIHJlYWwgd3JpdGUgKi8KKyAgICAgICB0cmFjZV9pOTE1X3JlZ19ydygnVycsIHJlZywgdmFsLCBsZW4pOworICAgICAgIHN3aXRjaCAobGVuKSB7CisgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgd3JpdGVxKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyByZWcpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgd3JpdGVsKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyByZWcpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgd3JpdGV3KHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyByZWcpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgd3JpdGViKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyByZWcpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQogfQogCi0jZGVmaW5lIEk5MTVfUkVBRChyZWcpICAgICAgICAgIGk5MTVfcmVhZChkZXZfcHJpdiwgKHJlZykpCi0jZGVmaW5lIEk5MTVfV1JJVEUocmVnLCB2YWwpICAgIGk5MTVfd3JpdGUoZGV2X3ByaXYsIChyZWcpLCAodmFsKSkKLSNkZWZpbmUgSTkxNV9SRUFEMTYocmVnKQlyZWFkdyhkZXZfcHJpdi0+cmVncyArIChyZWcpKQotI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLCB2YWwpCXdyaXRlbCh2YWwsIGRldl9wcml2LT5yZWdzICsgKHJlZykpCi0jZGVmaW5lIEk5MTVfUkVBRDgocmVnKQkJcmVhZGIoZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKLSNkZWZpbmUgSTkxNV9XUklURTgocmVnLCB2YWwpCXdyaXRlYih2YWwsIGRldl9wcml2LT5yZWdzICsgKHJlZykpCi0jZGVmaW5lIEk5MTVfV1JJVEU2NChyZWcsIHZhbCkJd3JpdGVxKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKLSNkZWZpbmUgSTkxNV9SRUFENjQocmVnKQlyZWFkcShkZXZfcHJpdi0+cmVncyArIChyZWcpKQotI2RlZmluZSBQT1NUSU5HX1JFQUQocmVnKQkodm9pZClJOTE1X1JFQUQocmVnKQotI2RlZmluZSBQT1NUSU5HX1JFQUQxNihyZWcpCSh2b2lkKUk5MTVfUkVBRDE2KHJlZykKLQotI2RlZmluZSBJOTE1X0RFQlVHX0VOQUJMRV9JTygpIChkZXZfcHJpdi0+ZGVidWdfZmxhZ3MgfD0gSTkxNV9ERUJVR19SRUFEIHwgXAotCQkJCUk5MTVfREVCVUdfV1JJVEUpCi0jZGVmaW5lIEk5MTVfREVCVUdfRElTQUJMRV9JTygpIChkZXZfcHJpdi0+ZGVidWdfZmxhZ3MgJj0gfihJOTE1X0RFQlVHX1JFQUQgfCBcCi0JCQkJCQkJICAgIEk5MTVfREVCVUdfV1JJVEUpKQotCi0jZGVmaW5lIEk5MTVfVkVSQk9TRSAwCi0KLSNkZWZpbmUgQkVHSU5fTFBfUklORyhuKSAgZG8geyBcCi0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdl9fID0gZGV2LT5kZXZfcHJpdmF0ZTsgICAgICAgICAgICAgICAgXAotCWlmIChJOTE1X1ZFUkJPU0UpCQkJCQkJXAotCQlEUk1fREVCVUcoIiAgIEJFR0lOX0xQX1JJTkcgJXhcbiIsIChpbnQpKG4pKTsJCVwKLQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgJmRldl9wcml2X18tPnJlbmRlcl9yaW5nLCAobikpOwkJXAotfSB3aGlsZSAoMCkKLQotCi0jZGVmaW5lIE9VVF9SSU5HKHgpIGRvIHsJCQkJCQlcCi0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdl9fID0gZGV2LT5kZXZfcHJpdmF0ZTsJCVwKLQlpZiAoSTkxNV9WRVJCT1NFKQkJCQkJCVwKLQkJRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkoeCkpOwkJXAotCWludGVsX3JpbmdfZW1pdChkZXYsICZkZXZfcHJpdl9fLT5yZW5kZXJfcmluZywgeCk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEFEVkFOQ0VfTFBfUklORygpIGRvIHsJCQkJCQlcCi0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdl9fID0gZGV2LT5kZXZfcHJpdmF0ZTsgICAgICAgICAgICAgICAgXAotCWlmIChJOTE1X1ZFUkJPU0UpCQkJCQkJXAotCQlEUk1fREVCVUcoIkFEVkFOQ0VfTFBfUklORyAleFxuIiwJCQlcCi0JCQkJZGV2X3ByaXZfXy0+cmVuZGVyX3JpbmcudGFpbCk7CQlcCi0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgJmRldl9wcml2X18tPnJlbmRlcl9yaW5nKTsJCVwKLX0gd2hpbGUoMCkKLQogLyoqCiAgKiBSZWFkcyBhIGR3b3JkIG91dCBvZiB0aGUgc3RhdHVzIHBhZ2UsIHdoaWNoIGlzIHdyaXR0ZW4gdG8gZnJvbSB0aGUgY29tbWFuZAogICogcXVldWUgYnkgYXV0b21hdGljIHVwZGF0ZXMsIE1JX1JFUE9SVF9IRUFELCBNSV9TVE9SRV9EQVRBX0lOREVYLCBvcgpAQCAtMTI1OSw3MiArMTQwMiw5IEBACiAgKiBUaGUgYXJlYSBmcm9tIGR3b3JkIDB4MjAgdG8gMHgzZmYgaXMgYXZhaWxhYmxlIGZvciBkcml2ZXIgdXNhZ2UuCiAgKi8KICNkZWZpbmUgUkVBRF9IV1NQKGRldl9wcml2LCByZWcpICAoKCh2b2xhdGlsZSB1MzIgKilcCi0JCQkoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkcikpW3JlZ10pCisJCQkoTFBfUklORyhkZXZfcHJpdiktPnN0YXR1c19wYWdlLnBhZ2VfYWRkcikpW3JlZ10pCiAjZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgUkVBRF9IV1NQKGRldl9wcml2LCBJOTE1X0JSRUFEQ1JVTUJfSU5ERVgpCiAjZGVmaW5lIEk5MTVfR0VNX0hXU19JTkRFWAkJMHgyMAogI2RlZmluZSBJOTE1X0JSRUFEQ1JVTUJfSU5ERVgJCTB4MjEKIAotI2RlZmluZSBJTlRFTF9JTkZPKGRldikJKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikgKGRldiktPmRldl9wcml2YXRlKS0+aW5mbykKLQotI2RlZmluZSBJU19JODMwKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDM1NzcpCi0jZGVmaW5lIElTXzg0NUcoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU2MikKLSNkZWZpbmUgSVNfSTg1WChkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pODV4KQotI2RlZmluZSBJU19JODY1RyhkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTcyKQotI2RlZmluZSBJU19JOTE1RyhkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTE1ZykKLSNkZWZpbmUgSVNfSTkxNUdNKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1OTIpCi0jZGVmaW5lIElTX0k5NDVHKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI3NzIpCi0jZGVmaW5lIElTX0k5NDVHTShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTQ1Z20pCi0jZGVmaW5lIElTX0JST0FEV0FURVIoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19icm9hZHdhdGVyKQotI2RlZmluZSBJU19DUkVTVExJTkUoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19jcmVzdGxpbmUpCi0jZGVmaW5lIElTX0dNNDUoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkE0MikKLSNkZWZpbmUgSVNfRzRYKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2c0eCkKLSNkZWZpbmUgSVNfUElORVZJRVdfRyhkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMDEpCi0jZGVmaW5lIElTX1BJTkVWSUVXX00oZGV2KQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHhhMDExKQotI2RlZmluZSBJU19QSU5FVklFVyhkZXYpCShJTlRFTF9JTkZPKGRldiktPmlzX3BpbmV2aWV3KQotI2RlZmluZSBJU19HMzMoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfZzMzKQotI2RlZmluZSBJU19JUk9OTEFLRV9EKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0MikKLSNkZWZpbmUgSVNfSVJPTkxBS0VfTShkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDAwNDYpCi0jZGVmaW5lIElTX01PQklMRShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19tb2JpbGUpCi0KLSNkZWZpbmUgSVNfR0VOMihkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAyKQotI2RlZmluZSBJU19HRU4zKGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDMpCi0jZGVmaW5lIElTX0dFTjQoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNCkKLSNkZWZpbmUgSVNfR0VONShkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA1KQotI2RlZmluZSBJU19HRU42KGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDYpCi0KLSNkZWZpbmUgSEFTX0JTRChkZXYpICAgICAgICAgICAgKElOVEVMX0lORk8oZGV2KS0+aGFzX2JzZF9yaW5nKQotI2RlZmluZSBIQVNfQkxUKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5oYXNfYmx0X3JpbmcpCi0jZGVmaW5lIEk5MTVfTkVFRF9HRlhfSFdTKGRldikJKElOVEVMX0lORk8oZGV2KS0+bmVlZF9nZnhfaHdzKQotCi0jZGVmaW5lIEhBU19PVkVSTEFZKGRldikgCQkoSU5URUxfSU5GTyhkZXYpLT5oYXNfb3ZlcmxheSkKLSNkZWZpbmUgT1ZFUkxBWV9ORUVEU19QSFlTSUNBTChkZXYpCShJTlRFTF9JTkZPKGRldiktPm92ZXJsYXlfbmVlZHNfcGh5c2ljYWwpCi0KLS8qIFdpdGggdGhlIDk0NSBhbmQgbGF0ZXIsIFkgdGlsaW5nIGdvdCBhZGp1c3RlZCBzbyB0aGF0IGl0IHdhcyAzMiAxMjgtYnl0ZQotICogcm93cywgd2hpY2ggY2hhbmdlZCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhbmQgZmVuY2UgcHJvZ3JhbW1pbmcuCi0gKi8KLSNkZWZpbmUgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGRldikgKCFJU19HRU4yKGRldikgJiYgIShJU19JOTE1RyhkZXYpIHx8IFwKLQkJCQkJCSAgICAgIElTX0k5MTVHTShkZXYpKSkKLSNkZWZpbmUgU1VQUE9SVFNfRElHSVRBTF9PVVRQVVRTKGRldikJKCFJU19HRU4yKGRldikgJiYgIUlTX1BJTkVWSUVXKGRldikpCi0jZGVmaW5lIFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpCShJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpCi0jZGVmaW5lIFNVUFBPUlRTX0lOVEVHUkFURURfRFAoZGV2KQkoSVNfRzRYKGRldikgfHwgSVNfR0VONShkZXYpKQotI2RlZmluZSBTVVBQT1JUU19FRFAoZGV2KQkJKElTX0lST05MQUtFX00oZGV2KSkKLSNkZWZpbmUgU1VQUE9SVFNfVFYoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+c3VwcG9ydHNfdHYpCi0jZGVmaW5lIEk5MTVfSEFTX0hPVFBMVUcoZGV2KQkJIChJTlRFTF9JTkZPKGRldiktPmhhc19ob3RwbHVnKQotLyogZHNwYXJiIGNvbnRyb2xsZWQgYnkgaHcgb25seSAqLwotI2RlZmluZSBEU1BBUkJfSFdDT05UUk9MKGRldikgKElTX0c0WChkZXYpIHx8IElTX0lST05MQUtFKGRldikpCi0KLSNkZWZpbmUgSEFTX0ZXX0JMQyhkZXYpIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDIpCi0jZGVmaW5lIEhBU19QSVBFX0NYU1IoZGV2KSAoSU5URUxfSU5GTyhkZXYpLT5oYXNfcGlwZV9jeHNyKQotI2RlZmluZSBJOTE1X0hBU19GQkMoZGV2KSAoSU5URUxfSU5GTyhkZXYpLT5oYXNfZmJjKQotI2RlZmluZSBJOTE1X0hBU19SQzYoZGV2KSAoSU5URUxfSU5GTyhkZXYpLT5oYXNfcmM2KQotCi0jZGVmaW5lIEhBU19QQ0hfU1BMSVQoZGV2KSAoSVNfR0VONShkZXYpIHx8IElTX0dFTjYoZGV2KSkKLSNkZWZpbmUgSEFTX1BJUEVfQ09OVFJPTChkZXYpIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQotCi0jZGVmaW5lIElOVEVMX1BDSF9UWVBFKGRldikgKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikoZGV2KS0+ZGV2X3ByaXZhdGUpLT5wY2hfdHlwZSkKLSNkZWZpbmUgSEFTX1BDSF9DUFQoZGV2KSAoSU5URUxfUENIX1RZUEUoZGV2KSA9PSBQQ0hfQ1BUKQotI2RlZmluZSBIQVNfUENIX0lCWChkZXYpIChJTlRFTF9QQ0hfVFlQRShkZXYpID09IFBDSF9JQlgpCi0KLSNkZWZpbmUgUFJJTUFSWV9SSU5HQlVGRkVSX1NJWkUgICAgICAgICAoMTI4KjEwMjQpCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggMjc1ZWM2ZS4uM2RmYzg0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0zNCwzOCArMzQsMzEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVsLWd0dC5oPgogCi1zdGF0aWMgdWludDMyX3QgaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotCi1zdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLXN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCQkgICAgIGludCB3cml0ZSk7Ci1zdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfY3B1X3JlYWRfZG9tYWluX3JhbmdlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCQkJICAgICB1aW50NjRfdCBvZmZzZXQsCi0JCQkJCQkgICAgIHVpbnQ2NF90IHNpemUpOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19mdWxsX2NwdV9yZWFkX2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci1zdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCQkJICBib29sIGludGVycnVwdGlibGUpOwotc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJCSAgIHVuc2lnbmVkIGFsaWdubWVudCk7Ci1zdGF0aWMgdm9pZCBpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIGludCBpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK3N0YXRpYyBfX211c3RfY2hlY2sgaW50IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgdm9pZCBpOTE1X2dlbV9vYmplY3RfZmx1c2hfY3B1X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyBfX211c3RfY2hlY2sgaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCQkJCSAgYm9vbCB3cml0ZSk7CitzdGF0aWMgX19tdXN0X2NoZWNrIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X2NwdV9yZWFkX2RvbWFpbl9yYW5nZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCQkJCQkgIHVpbnQ2NF90IG9mZnNldCwKKwkJCQkJCQkJICB1aW50NjRfdCBzaXplKTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZnVsbF9jcHVfcmVhZF9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgX19tdXN0X2NoZWNrIGludCBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkJCSAgICB1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkJCQkgICAgYm9vbCBtYXBfYW5kX2ZlbmNlYWJsZSk7CitzdGF0aWMgdm9pZCBpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyk7CitzdGF0aWMgaW50IGk5MTVfZ2VtX3BoeXNfcHdyaXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1zdGF0aWMgdm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpOworc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3RfdGFpbChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAotc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgZ2ZwX3QgZ2ZwbWFzayk7CitzdGF0aWMgaW50IGk5MTVfZ2VtX2luYWN0aXZlX3NocmluayhzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAorCQkJCSAgICBpbnQgbnJfdG9fc2NhbiwKKwkJCQkgICAgZ2ZwX3QgZ2ZwX21hc2spOwogCi1zdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoc2hyaW5rX2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzaHJpbmtfbGlzdF9sb2NrKTsKIAogLyogc29tZSBib29ra2VlcGluZyAqLwogc3RhdGljIHZvaWQgaTkxNV9nZW1faW5mb19hZGRfb2JqKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKQEAgLTgyLDM0ICs3NSw2IEBACiAJZGV2X3ByaXYtPm1tLm9iamVjdF9tZW1vcnkgLT0gc2l6ZTsKIH0KIAotc3RhdGljIHZvaWQgaTkxNV9nZW1faW5mb19hZGRfZ3R0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgIHNpemVfdCBzaXplKQotewotCWRldl9wcml2LT5tbS5ndHRfY291bnQrKzsKLQlkZXZfcHJpdi0+bW0uZ3R0X21lbW9yeSArPSBzaXplOwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2dlbV9pbmZvX3JlbW92ZV9ndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCSAgICAgc2l6ZV90IHNpemUpCi17Ci0JZGV2X3ByaXYtPm1tLmd0dF9jb3VudC0tOwotCWRldl9wcml2LT5tbS5ndHRfbWVtb3J5IC09IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX2luZm9fYWRkX3BpbihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICBzaXplX3Qgc2l6ZSkKLXsKLQlkZXZfcHJpdi0+bW0ucGluX2NvdW50Kys7Ci0JZGV2X3ByaXYtPm1tLnBpbl9tZW1vcnkgKz0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9nZW1faW5mb19yZW1vdmVfcGluKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgICAgIHNpemVfdCBzaXplKQotewotCWRldl9wcml2LT5tbS5waW5fY291bnQtLTsKLQlkZXZfcHJpdi0+bW0ucGluX21lbW9yeSAtPSBzaXplOwotfQotCiBpbnQKIGk5MTVfZ2VtX2NoZWNrX2lzX3dlZGdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMTQwLDcgKzEwNSw3IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK2ludCBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldDsKQEAgLTE2Myw3NSArMTI4LDc2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9nZW1fb2JqZWN0X2lzX2luYWN0aXZlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdikKK2k5MTVfZ2VtX29iamVjdF9pc19pbmFjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXJldHVybiBvYmpfcHJpdi0+Z3R0X3NwYWNlICYmCi0JCSFvYmpfcHJpdi0+YWN0aXZlICYmCi0JCW9ial9wcml2LT5waW5fY291bnQgPT0gMDsKKwlyZXR1cm4gb2JqLT5ndHRfc3BhY2UgJiYgIW9iai0+YWN0aXZlICYmIG9iai0+cGluX2NvdW50ID09IDA7CiB9CiAKLWludCBpOTE1X2dlbV9kb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKK3ZvaWQgaTkxNV9nZW1fZG9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIG1hcHBhYmxlX2VuZCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoc3RhcnQgPj0gZW5kIHx8Ci0JICAgIChzdGFydCAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCB8fAotCSAgICAoZW5kICYgKFBBR0VfU0laRSAtIDEpKSAhPSAwKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLCBzdGFydCwKIAkJICAgIGVuZCAtIHN0YXJ0KTsKIAogCWRldl9wcml2LT5tbS5ndHRfdG90YWwgPSBlbmQgLSBzdGFydDsKLQotCXJldHVybiAwOworCWRldl9wcml2LT5tbS5tYXBwYWJsZV9ndHRfdG90YWwgPSBtaW4oZW5kLCBtYXBwYWJsZV9lbmQpIC0gc3RhcnQ7CisJZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQgPSBtYXBwYWJsZV9lbmQ7CiB9CiAKIGludAogaTkxNV9nZW1faW5pdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9pbml0ICphcmdzID0gZGF0YTsKLQlpbnQgcmV0OworCisJaWYgKGFyZ3MtPmd0dF9zdGFydCA+PSBhcmdzLT5ndHRfZW5kIHx8CisJICAgIChhcmdzLT5ndHRfZW5kIHwgYXJncy0+Z3R0X3N0YXJ0KSAmIChQQUdFX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JcmV0ID0gaTkxNV9nZW1fZG9faW5pdChkZXYsIGFyZ3MtPmd0dF9zdGFydCwgYXJncy0+Z3R0X2VuZCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQKLWk5MTVfZ2VtX2dldF9hcGVydHVyZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfYXBlcnR1cmUgKmFyZ3MgPSBkYXRhOwotCi0JaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlhcmdzLT5hcGVyX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsOwotCWFyZ3MtPmFwZXJfYXZhaWxhYmxlX3NpemUgPSBhcmdzLT5hcGVyX3NpemUgLSBkZXZfcHJpdi0+bW0ucGluX21lbW9yeTsKKwlpOTE1X2dlbV9kb19pbml0KGRldiwgYXJncy0+Z3R0X3N0YXJ0LCBhcmdzLT5ndHRfZW5kLCBhcmdzLT5ndHRfZW5kKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwogfQogCitpbnQKK2k5MTVfZ2VtX2dldF9hcGVydHVyZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXNpemVfdCBwaW5uZWQ7CisKKwlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpCisJCXJldHVybiAtRU5PREVWOworCisJcGlubmVkID0gMDsKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QsIG1tX2xpc3QpCisJCXBpbm5lZCArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCWFyZ3MtPmFwZXJfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHRfdG90YWw7CisJYXJncy0+YXBlcl9hdmFpbGFibGVfc2l6ZSA9IGFyZ3MtPmFwZXJfc2l6ZSAtcGlubmVkOworCisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogQ3JlYXRlcyBhIG5ldyBtbSBvYmplY3QgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gaXQuCiAgKi8KIGludAogaTkxNV9nZW1fY3JlYXRlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9jcmVhdGUgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldDsKIAl1MzIgaGFuZGxlOwogCkBAIC0yNDIsNDUgKzIwOCwyOCBAQAogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBvYmosICZoYW5kbGUpOworCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlLCAmb2JqLT5iYXNlLCAmaGFuZGxlKTsKIAlpZiAocmV0KSB7Ci0JCWRybV9nZW1fb2JqZWN0X3JlbGVhc2Uob2JqKTsKLQkJaTkxNV9nZW1faW5mb19yZW1vdmVfb2JqKGRldi0+ZGV2X3ByaXZhdGUsIG9iai0+c2l6ZSk7CisJCWRybV9nZW1fb2JqZWN0X3JlbGVhc2UoJm9iai0+YmFzZSk7CisJCWk5MTVfZ2VtX2luZm9fcmVtb3ZlX29iaihkZXYtPmRldl9wcml2YXRlLCBvYmotPmJhc2Uuc2l6ZSk7CiAJCWtmcmVlKG9iaik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogZHJvcCByZWZlcmVuY2UgZnJvbSBhbGxvY2F0ZSAtIGhhbmRsZSBob2xkcyBpdCBub3cgKi8KLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jcmVhdGUob2JqKTsKIAogCWFyZ3MtPmhhbmRsZSA9IGhhbmRsZTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLWZhc3Rfc2htZW1fcmVhZChzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQlsb2ZmX3QgcGFnZV9iYXNlLCBpbnQgcGFnZV9vZmZzZXQsCi0JCWNoYXIgX191c2VyICpkYXRhLAotCQlpbnQgbGVuZ3RoKQorc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3RfbmVlZHNfYml0MTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCWNoYXIgKnZhZGRyOwotCWludCByZXQ7Ci0KLQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2VzW3BhZ2VfYmFzZSA+PiBQQUdFX1NISUZUXSk7Ci0JcmV0ID0gX19jb3B5X3RvX3VzZXJfaW5hdG9taWMoZGF0YSwgdmFkZHIgKyBwYWdlX29mZnNldCwgbGVuZ3RoKTsKLQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IG9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBvYmotPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKIAogCXJldHVybiBkZXZfcHJpdi0+bW0uYml0XzZfc3dpenpsZV94ID09IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3ICYmCi0JCW9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FOworCQlvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMzU2LDM4ICszMDUsNTEgQEAKICAqIGZhdWx0LCBpdCBmYWlscyBzbyB3ZSBjYW4gZmFsbCBiYWNrIHRvIGk5MTVfZ2VtX3NobWVtX3B3cml0ZV9zbG93KCkuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX3NobWVtX3ByZWFkX2Zhc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9zaG1lbV9wcmVhZF9mYXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQgKmFyZ3MsCi0JCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJc3NpemVfdCByZW1haW47Ci0JbG9mZl90IG9mZnNldCwgcGFnZV9iYXNlOworCWxvZmZfdCBvZmZzZXQ7CiAJY2hhciBfX3VzZXIgKnVzZXJfZGF0YTsKIAlpbnQgcGFnZV9vZmZzZXQsIHBhZ2VfbGVuZ3RoOwogCiAJdXNlcl9kYXRhID0gKGNoYXIgX191c2VyICopICh1aW50cHRyX3QpIGFyZ3MtPmRhdGFfcHRyOwogCXJlbWFpbiA9IGFyZ3MtPnNpemU7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJb2Zmc2V0ID0gYXJncy0+b2Zmc2V0OwogCiAJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWNoYXIgKnZhZGRyOworCQlpbnQgcmV0OworCiAJCS8qIE9wZXJhdGlvbiBpbiB0aGlzIHBhZ2UKIAkJICoKLQkJICogcGFnZV9iYXNlID0gcGFnZSBvZmZzZXQgd2l0aGluIGFwZXJ0dXJlCiAJCSAqIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlwYWdlX2Jhc2UgPSAob2Zmc2V0ICYgfihQQUdFX1NJWkUtMSkpOwogCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUtMSk7CiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHBhZ2Vfb2Zmc2V0ICsgcmVtYWluKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CiAKLQkJaWYgKGZhc3Rfc2htZW1fcmVhZChvYmpfcHJpdi0+cGFnZXMsCi0JCQkJICAgIHBhZ2VfYmFzZSwgcGFnZV9vZmZzZXQsCi0JCQkJICAgIHVzZXJfZGF0YSwgcGFnZV9sZW5ndGgpKQorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisKKwkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwkJcmV0ID0gX19jb3B5X3RvX3VzZXJfaW5hdG9taWModXNlcl9kYXRhLAorCQkJCQkgICAgICB2YWRkciArIHBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICBwYWdlX2xlbmd0aCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIpOworCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlpZiAocmV0KQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcmVtYWluIC09IHBhZ2VfbGVuZ3RoOwpAQCAtMzk4LDMwICszNjAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX29yX2V2aWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaiwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PV0FSTik7Ci0KLQkvKiBJZiB3ZSd2ZSBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIG1hcCBpbiB0aGUgcGFnZXMsIGF0dGVtcHQKLQkgKiB0byBtYWtlIHNvbWUgc3BhY2UgYnkgdGhyb3dpbmcgb3V0IHNvbWUgb2xkIGJ1ZmZlcnMuCi0JICovCi0JaWYgKHJldCA9PSAtRU5PTUVNKSB7Ci0JCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQotCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoZGV2LCBvYmotPnNpemUsCi0JCQkJCSAgICAgICBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmosIDApOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKgogICogVGhpcyBpcyB0aGUgZmFsbGJhY2sgc2htZW0gcHJlYWQgcGF0aCwgd2hpY2ggYWxsb2NhdGVzIHRlbXBvcmFyeSBzdG9yYWdlCiAgKiBpbiBrZXJuZWwgc3BhY2UgdG8gY29weV90b191c2VyIGludG8gb3V0c2lkZSBvZiB0aGUgc3RydWN0X211dGV4LCBzbyB3ZQpAQCAtNDI5LDE4ICszNjcsMTkgQEAKICAqIGFuZCBub3QgdGFrZSBwYWdlIGZhdWx0cy4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fc2htZW1fcHJlYWRfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK2k5MTVfZ2VtX3NobWVtX3ByZWFkX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCAqYXJncywKLQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCBwYWdlICoqdXNlcl9wYWdlczsKIAlzc2l6ZV90IHJlbWFpbjsKIAlsb2ZmX3Qgb2Zmc2V0LCBwaW5uZWRfcGFnZXMsIGk7CiAJbG9mZl90IGZpcnN0X2RhdGFfcGFnZSwgbGFzdF9kYXRhX3BhZ2UsIG51bV9wYWdlczsKLQlpbnQgc2htZW1fcGFnZV9pbmRleCwgc2htZW1fcGFnZV9vZmZzZXQ7Ci0JaW50IGRhdGFfcGFnZV9pbmRleCwgIGRhdGFfcGFnZV9vZmZzZXQ7CisJaW50IHNobWVtX3BhZ2Vfb2Zmc2V0OworCWludCBkYXRhX3BhZ2VfaW5kZXgsIGRhdGFfcGFnZV9vZmZzZXQ7CiAJaW50IHBhZ2VfbGVuZ3RoOwogCWludCByZXQ7CiAJdWludDY0X3QgZGF0YV9wdHIgPSBhcmdzLT5kYXRhX3B0cjsKQEAgLTQ3OSwxOSArNDE4LDE4IEBACiAKIAlkb19iaXQxN19zd2l6emxpbmcgPSBpOTE1X2dlbV9vYmplY3RfbmVlZHNfYml0MTdfc3dpenpsZShvYmopOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCW9mZnNldCA9IGFyZ3MtPm9mZnNldDsKIAogCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCiAJCS8qIE9wZXJhdGlvbiBpbiB0aGlzIHBhZ2UKIAkJICoKLQkJICogc2htZW1fcGFnZV9pbmRleCA9IHBhZ2UgbnVtYmVyIHdpdGhpbiBzaG1lbSBmaWxlCiAJCSAqIHNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlIGluIHNobWVtIGZpbGUKIAkJICogZGF0YV9wYWdlX2luZGV4ID0gcGFnZSBudW1iZXIgaW4gZ2V0X3VzZXJfcGFnZXMgcmV0dXJuCiAJCSAqIGRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aCBkYXRhX3BhZ2VfaW5kZXggcGFnZS4KIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXNobWVtX3BhZ2VfaW5kZXggPSBvZmZzZXQgLyBQQUdFX1NJWkU7CiAJCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfTUFTSzsKIAkJZGF0YV9wYWdlX2luZGV4ID0gZGF0YV9wdHIgLyBQQUdFX1NJWkUgLSBmaXJzdF9kYXRhX3BhZ2U7CiAJCWRhdGFfcGFnZV9vZmZzZXQgPSBkYXRhX3B0ciAmIH5QQUdFX01BU0s7CkBAIC01MDIsOCArNDQwLDEzIEBACiAJCWlmICgoZGF0YV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gZGF0YV9wYWdlX29mZnNldDsKIAorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisKIAkJaWYgKGRvX2JpdDE3X3N3aXp6bGluZykgewotCQkJc2xvd19zaG1lbV9iaXQxN19jb3B5KG9ial9wcml2LT5wYWdlc1tzaG1lbV9wYWdlX2luZGV4XSwKKwkJCXNsb3dfc2htZW1fYml0MTdfY29weShwYWdlLAogCQkJCQkgICAgICBzaG1lbV9wYWdlX29mZnNldCwKIAkJCQkJICAgICAgdXNlcl9wYWdlc1tkYXRhX3BhZ2VfaW5kZXhdLAogCQkJCQkgICAgICBkYXRhX3BhZ2Vfb2Zmc2V0LApAQCAtNTEyLDExICs0NTUsMTQgQEAKIAkJfSBlbHNlIHsKIAkJCXNsb3dfc2htZW1fY29weSh1c2VyX3BhZ2VzW2RhdGFfcGFnZV9pbmRleF0sCiAJCQkJCWRhdGFfcGFnZV9vZmZzZXQsCi0JCQkJCW9ial9wcml2LT5wYWdlc1tzaG1lbV9wYWdlX2luZGV4XSwKKwkJCQkJcGFnZSwKIAkJCQkJc2htZW1fcGFnZV9vZmZzZXQsCiAJCQkJCXBhZ2VfbGVuZ3RoKTsKIAkJfQogCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCiAJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKIAkJZGF0YV9wdHIgKz0gcGFnZV9sZW5ndGg7CiAJCW9mZnNldCArPSBwYWdlX2xlbmd0aDsKQEAgLTUyNSw2ICs0NzEsNyBAQAogb3V0OgogCWZvciAoaSA9IDA7IGkgPCBwaW5uZWRfcGFnZXM7IGkrKykgewogCQlTZXRQYWdlRGlydHkodXNlcl9wYWdlc1tpXSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZCh1c2VyX3BhZ2VzW2ldKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHVzZXJfcGFnZXNbaV0pOwogCX0KIAlkcm1fZnJlZV9sYXJnZSh1c2VyX3BhZ2VzKTsKQEAgLTUzOSwxMSArNDg2LDEwIEBACiAgKi8KIGludAogaTkxNV9nZW1fcHJlYWRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9wcmVhZCAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoYXJncy0+c2l6ZSA9PSAwKQpAQCAtNTYzLDM5ICs1MDksMzMgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCiAJLyogQm91bmRzIGNoZWNrIHNvdXJjZS4gICovCi0JaWYgKGFyZ3MtPm9mZnNldCA+IG9iai0+c2l6ZSB8fCBhcmdzLT5zaXplID4gb2JqLT5zaXplIC0gYXJncy0+b2Zmc2V0KSB7CisJaWYgKGFyZ3MtPm9mZnNldCA+IG9iai0+YmFzZS5zaXplIHx8CisJICAgIGFyZ3MtPnNpemUgPiBvYmotPmJhc2Uuc2l6ZSAtIGFyZ3MtPm9mZnNldCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX29yX2V2aWN0KG9iaik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KIAlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X2NwdV9yZWFkX2RvbWFpbl9yYW5nZShvYmosCiAJCQkJCQkJYXJncy0+b2Zmc2V0LAogCQkJCQkJCWFyZ3MtPnNpemUpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X3B1dDsKKwkJZ290byBvdXQ7CiAKIAlyZXQgPSAtRUZBVUxUOwogCWlmICghaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkKLQkJcmV0ID0gaTkxNV9nZW1fc2htZW1fcHJlYWRfZmFzdChkZXYsIG9iaiwgYXJncywgZmlsZV9wcml2KTsKKwkJcmV0ID0gaTkxNV9nZW1fc2htZW1fcHJlYWRfZmFzdChkZXYsIG9iaiwgYXJncywgZmlsZSk7CiAJaWYgKHJldCA9PSAtRUZBVUxUKQotCQlyZXQgPSBpOTE1X2dlbV9zaG1lbV9wcmVhZF9zbG93KGRldiwgb2JqLCBhcmdzLCBmaWxlX3ByaXYpOworCQlyZXQgPSBpOTE1X2dlbV9zaG1lbV9wcmVhZF9zbG93KGRldiwgb2JqLCBhcmdzLCBmaWxlKTsKIAotb3V0X3B1dDoKLQlpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7CiBvdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtNjQ1LDMyICs1ODUsMTYgQEAKIAlpb19tYXBwaW5nX3VubWFwKGRzdF92YWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1mYXN0X3NobWVtX3dyaXRlKHN0cnVjdCBwYWdlICoqcGFnZXMsCi0JCSBsb2ZmX3QgcGFnZV9iYXNlLCBpbnQgcGFnZV9vZmZzZXQsCi0JCSBjaGFyIF9fdXNlciAqZGF0YSwKLQkJIGludCBsZW5ndGgpCi17Ci0JY2hhciAqdmFkZHI7Ci0JaW50IHJldDsKLQotCXZhZGRyID0ga21hcF9hdG9taWMocGFnZXNbcGFnZV9iYXNlID4+IFBBR0VfU0hJRlRdKTsKLQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZhZGRyICsgcGFnZV9vZmZzZXQsIGRhdGEsIGxlbmd0aCk7Ci0Ja3VubWFwX2F0b21pYyh2YWRkcik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKioKICAqIFRoaXMgaXMgdGhlIGZhc3QgcHdyaXRlIHBhdGgsIHdoZXJlIHdlIGNvcHkgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUKICAqIHVzZXIgaW50byB0aGUgR1RULCB1bmNhY2hlZC4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzc2l6ZV90IHJlbWFpbjsKIAlsb2ZmX3Qgb2Zmc2V0LCBwYWdlX2Jhc2U7CkBAIC02ODAsOCArNjA0LDcgQEAKIAl1c2VyX2RhdGEgPSAoY2hhciBfX3VzZXIgKikgKHVpbnRwdHJfdCkgYXJncy0+ZGF0YV9wdHI7CiAJcmVtYWluID0gYXJncy0+c2l6ZTsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlvZmZzZXQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldCArIGFyZ3MtPm9mZnNldDsKKwlvZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQgKyBhcmdzLT5vZmZzZXQ7CiAKIAl3aGlsZSAocmVtYWluID4gMCkgewogCQkvKiBPcGVyYXRpb24gaW4gdGhpcyBwYWdlCkBAIC03MjEsMTEgKzY0NCwxMSBAQAogICogdGhhbiB1c2luZyBpOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qgb24gYSBHNDUgKDMyLWJpdCkuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX2d0dF9wd3JpdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK2k5MTVfZ2VtX2d0dF9wd3JpdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCi0JCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgc3RydWN0IGRybV9maWxlICpmaWxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3NpemVfdCByZW1haW47CiAJbG9mZl90IGd0dF9wYWdlX2Jhc2UsIG9mZnNldDsKQEAgLTc2MiwxMiArNjg1LDE1IEBACiAJCWdvdG8gb3V0X3VucGluX3BhZ2VzOwogCX0KIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIDEpOworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VucGluX3BhZ2VzOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCW9mZnNldCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgYXJncy0+b2Zmc2V0OworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnBpbl9wYWdlczsKKworCW9mZnNldCA9IG9iai0+Z3R0X29mZnNldCArIGFyZ3MtPm9mZnNldDsKIAogCXdoaWxlIChyZW1haW4gPiAwKSB7CiAJCS8qIE9wZXJhdGlvbiBpbiB0aGlzIHBhZ2UKQEAgLTgxMywzOSArNzM5LDU4IEBACiAgKiBjb3B5X2Zyb21fdXNlciBpbnRvIHRoZSBrbWFwcGVkIHBhZ2VzIGJhY2tpbmcgdGhlIG9iamVjdC4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fc2htZW1fcHdyaXRlX2Zhc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9zaG1lbV9wd3JpdGVfZmFzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzLAotCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJc3NpemVfdCByZW1haW47Ci0JbG9mZl90IG9mZnNldCwgcGFnZV9iYXNlOworCWxvZmZfdCBvZmZzZXQ7CiAJY2hhciBfX3VzZXIgKnVzZXJfZGF0YTsKIAlpbnQgcGFnZV9vZmZzZXQsIHBhZ2VfbGVuZ3RoOwogCiAJdXNlcl9kYXRhID0gKGNoYXIgX191c2VyICopICh1aW50cHRyX3QpIGFyZ3MtPmRhdGFfcHRyOwogCXJlbWFpbiA9IGFyZ3MtPnNpemU7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJb2Zmc2V0ID0gYXJncy0+b2Zmc2V0OwotCW9ial9wcml2LT5kaXJ0eSA9IDE7CisJb2JqLT5kaXJ0eSA9IDE7CiAKIAl3aGlsZSAocmVtYWluID4gMCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJY2hhciAqdmFkZHI7CisJCWludCByZXQ7CisKIAkJLyogT3BlcmF0aW9uIGluIHRoaXMgcGFnZQogCQkgKgotCQkgKiBwYWdlX2Jhc2UgPSBwYWdlIG9mZnNldCB3aXRoaW4gYXBlcnR1cmUKIAkJICogcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UKIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXBhZ2VfYmFzZSA9IChvZmZzZXQgJiB+KFBBR0VfU0laRS0xKSk7CiAJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBBR0VfU0laRS0xKTsKIAkJcGFnZV9sZW5ndGggPSByZW1haW47CiAJCWlmICgocGFnZV9vZmZzZXQgKyByZW1haW4pID4gUEFHRV9TSVpFKQogCQkJcGFnZV9sZW5ndGggPSBQQUdFX1NJWkUgLSBwYWdlX29mZnNldDsKIAotCQlpZiAoZmFzdF9zaG1lbV93cml0ZShvYmpfcHJpdi0+cGFnZXMsCi0JCQkJICAgICAgIHBhZ2VfYmFzZSwgcGFnZV9vZmZzZXQsCi0JCQkJICAgICAgIHVzZXJfZGF0YSwgcGFnZV9sZW5ndGgpKQorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisKKwkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCXJldCA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModmFkZHIgKyBwYWdlX29mZnNldCwKKwkJCQkJCXVzZXJfZGF0YSwKKwkJCQkJCXBhZ2VfbGVuZ3RoKTsKKwkJa3VubWFwX2F0b21pYyh2YWRkciwgS01fVVNFUjApOworCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworCQkvKiBJZiB3ZSBnZXQgYSBmYXVsdCB3aGlsZSBjb3B5aW5nIGRhdGEsIHRoZW4gKHByZXN1bWFibHkpIG91cgorCQkgKiBzb3VyY2UgcGFnZSBpc24ndCBhdmFpbGFibGUuICBSZXR1cm4gdGhlIGVycm9yIGFuZCB3ZSdsbAorCQkgKiByZXRyeSBpbiB0aGUgc2xvdyBwYXRoLgorCQkgKi8KKwkJaWYgKHJldCkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKQEAgLTg2NCwxNyArODA5LDE4IEBACiAgKiBzdHJ1Y3RfbXV0ZXggaXMgaGVsZC4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fc2htZW1fcHdyaXRlX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9zaG1lbV9wd3JpdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzLAotCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3QgcGFnZSAqKnVzZXJfcGFnZXM7CiAJc3NpemVfdCByZW1haW47CiAJbG9mZl90IG9mZnNldCwgcGlubmVkX3BhZ2VzLCBpOwogCWxvZmZfdCBmaXJzdF9kYXRhX3BhZ2UsIGxhc3RfZGF0YV9wYWdlLCBudW1fcGFnZXM7Ci0JaW50IHNobWVtX3BhZ2VfaW5kZXgsIHNobWVtX3BhZ2Vfb2Zmc2V0OworCWludCBzaG1lbV9wYWdlX29mZnNldDsKIAlpbnQgZGF0YV9wYWdlX2luZGV4LCAgZGF0YV9wYWdlX29mZnNldDsKIAlpbnQgcGFnZV9sZW5ndGg7CiAJaW50IHJldDsKQEAgLTkxMiwyMCArODU4LDE5IEBACiAKIAlkb19iaXQxN19zd2l6emxpbmcgPSBpOTE1X2dlbV9vYmplY3RfbmVlZHNfYml0MTdfc3dpenpsZShvYmopOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCW9mZnNldCA9IGFyZ3MtPm9mZnNldDsKLQlvYmpfcHJpdi0+ZGlydHkgPSAxOworCW9iai0+ZGlydHkgPSAxOwogCiAJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKIAkJLyogT3BlcmF0aW9uIGluIHRoaXMgcGFnZQogCQkgKgotCQkgKiBzaG1lbV9wYWdlX2luZGV4ID0gcGFnZSBudW1iZXIgd2l0aGluIHNobWVtIGZpbGUKIAkJICogc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UgaW4gc2htZW0gZmlsZQogCQkgKiBkYXRhX3BhZ2VfaW5kZXggPSBwYWdlIG51bWJlciBpbiBnZXRfdXNlcl9wYWdlcyByZXR1cm4KIAkJICogZGF0YV9wYWdlX29mZnNldCA9IG9mZnNldCB3aXRoIGRhdGFfcGFnZV9pbmRleCBwYWdlLgogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJc2htZW1fcGFnZV9pbmRleCA9IG9mZnNldCAvIFBBR0VfU0laRTsKIAkJc2htZW1fcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiB+UEFHRV9NQVNLOwogCQlkYXRhX3BhZ2VfaW5kZXggPSBkYXRhX3B0ciAvIFBBR0VfU0laRSAtIGZpcnN0X2RhdGFfcGFnZTsKIAkJZGF0YV9wYWdlX29mZnNldCA9IGRhdGFfcHRyICYgflBBR0VfTUFTSzsKQEAgLTkzNiwyMSArODgxLDMyIEBACiAJCWlmICgoZGF0YV9wYWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gZGF0YV9wYWdlX29mZnNldDsKIAorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KKwogCQlpZiAoZG9fYml0MTdfc3dpenpsaW5nKSB7Ci0JCQlzbG93X3NobWVtX2JpdDE3X2NvcHkob2JqX3ByaXYtPnBhZ2VzW3NobWVtX3BhZ2VfaW5kZXhdLAorCQkJc2xvd19zaG1lbV9iaXQxN19jb3B5KHBhZ2UsCiAJCQkJCSAgICAgIHNobWVtX3BhZ2Vfb2Zmc2V0LAogCQkJCQkgICAgICB1c2VyX3BhZ2VzW2RhdGFfcGFnZV9pbmRleF0sCiAJCQkJCSAgICAgIGRhdGFfcGFnZV9vZmZzZXQsCiAJCQkJCSAgICAgIHBhZ2VfbGVuZ3RoLAogCQkJCQkgICAgICAwKTsKIAkJfSBlbHNlIHsKLQkJCXNsb3dfc2htZW1fY29weShvYmpfcHJpdi0+cGFnZXNbc2htZW1fcGFnZV9pbmRleF0sCisJCQlzbG93X3NobWVtX2NvcHkocGFnZSwKIAkJCQkJc2htZW1fcGFnZV9vZmZzZXQsCiAJCQkJCXVzZXJfcGFnZXNbZGF0YV9wYWdlX2luZGV4XSwKIAkJCQkJZGF0YV9wYWdlX29mZnNldCwKIAkJCQkJcGFnZV9sZW5ndGgpOwogCQl9CiAKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCiAJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKIAkJZGF0YV9wdHIgKz0gcGFnZV9sZW5ndGg7CiAJCW9mZnNldCArPSBwYWdlX2xlbmd0aDsKQEAgLTk3NCw4ICs5MzAsNyBAQAogCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlpZiAoYXJncy0+c2l6ZSA9PSAwKQpAQCAtOTk1LDE1ICs5NTAsMTUgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAogCS8qIEJvdW5kcyBjaGVjayBkZXN0aW5hdGlvbi4gKi8KLQlpZiAoYXJncy0+b2Zmc2V0ID4gb2JqLT5zaXplIHx8IGFyZ3MtPnNpemUgPiBvYmotPnNpemUgLSBhcmdzLT5vZmZzZXQpIHsKKwlpZiAoYXJncy0+b2Zmc2V0ID4gb2JqLT5iYXNlLnNpemUgfHwKKwkgICAgYXJncy0+c2l6ZSA+IG9iai0+YmFzZS5zaXplIC0gYXJncy0+b2Zmc2V0KSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEwMTQsMTYgKzk2OSwxOSBAQAogCSAqIHByZWFkL3B3cml0ZSBjdXJyZW50bHkgYXJlIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSB0aGUgQ1BVCiAJICogcGVyc3BlY3RpdmUsIHJlcXVpcmluZyBtYW51YWwgZGV0aWxpbmcgYnkgdGhlIGNsaWVudC4KIAkgKi8KLQlpZiAob2JqX3ByaXYtPnBoeXNfb2JqKQorCWlmIChvYmotPnBoeXNfb2JqKQogCQlyZXQgPSBpOTE1X2dlbV9waHlzX3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZSk7Ci0JZWxzZSBpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUgJiYKLQkJIG9ial9wcml2LT5ndHRfc3BhY2UgJiYKLQkJIG9iai0+d3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDApOworCWVsc2UgaWYgKG9iai0+Z3R0X3NwYWNlICYmCisJCSBvYmotPmJhc2Uud3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDAsIHRydWUpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgMSk7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHRydWUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5waW47CisKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShvYmopOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfdW5waW47CiAKQEAgLTEwMzQsMjYgKzk5MiwxOSBAQAogb3V0X3VucGluOgogCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIAl9IGVsc2UgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX29yX2V2aWN0KG9iaik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4ob2JqLCAxKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3B1dDsKKwkJCWdvdG8gb3V0OwogCiAJCXJldCA9IC1FRkFVTFQ7CiAJCWlmICghaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkKIAkJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3B3cml0ZV9mYXN0KGRldiwgb2JqLCBhcmdzLCBmaWxlKTsKIAkJaWYgKHJldCA9PSAtRUZBVUxUKQogCQkJcmV0ID0gaTkxNV9nZW1fc2htZW1fcHdyaXRlX3Nsb3coZGV2LCBvYmosIGFyZ3MsIGZpbGUpOwotCi1vdXRfcHV0OgotCQlpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7CiAJfQogCiBvdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTA2NSwxMiArMTAxNiwxMCBAQAogICovCiBpbnQKIGk5MTVfZ2VtX3NldF9kb21haW5faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fc2V0X2RvbWFpbiAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJdWludDMyX3QgcmVhZF9kb21haW5zID0gYXJncy0+cmVhZF9kb21haW5zOwogCXVpbnQzMl90IHdyaXRlX2RvbWFpbiA9IGFyZ3MtPndyaXRlX2RvbWFpbjsKIAlpbnQgcmV0OwpAQCAtMTA5NSwyOCArMTA0NCwxNSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJb2JqID0gdG9faW50ZWxfYm8oZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgYXJncy0+aGFuZGxlKSk7CiAJaWYgKG9iaiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KLQlpbnRlbF9tYXJrX2J1c3koZGV2LCBvYmopOwogCiAJaWYgKHJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9HVFQpIHsKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgd3JpdGVfZG9tYWluICE9IDApOwogCi0JCS8qIFVwZGF0ZSB0aGUgTFJVIG9uIHRoZSBmZW5jZSBmb3IgdGhlIENQVSBhY2Nlc3MgdGhhdCdzCi0JCSAqIGFib3V0IHRvIG9jY3VyLgotCQkgKi8KLQkJaWYgKG9ial9wcml2LT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkgewotCQkJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0KLQkJCQkmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqX3ByaXYtPmZlbmNlX3JlZ107Ci0JCQlsaXN0X21vdmVfdGFpbCgmcmVnLT5scnVfbGlzdCwKLQkJCQkgICAgICAgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0KTsKLQkJfQotCiAJCS8qIFNpbGVudGx5IHByb21vdGUgInlvdSdyZSBub3QgYm91bmQsIHRoZXJlIHdhcyBub3RoaW5nIHRvIGRvIgogCQkgKiB0byBzdWNjZXNzLCBzaW5jZSB0aGUgY2xpZW50IHdhcyBqdXN0IGFza2luZyB1cyB0bwogCQkgKiBtYWtlIHN1cmUgZXZlcnl0aGluZyB3YXMgZG9uZS4KQEAgLTExMjcsMTEgKzEwNjMsNyBAQAogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4ob2JqLCB3cml0ZV9kb21haW4gIT0gMCk7CiAJfQogCi0JLyogTWFpbnRhaW4gTFJVIG9yZGVyIG9mICJpbmFjdGl2ZSIgb2JqZWN0cyAqLwotCWlmIChyZXQgPT0gMCAmJiBpOTE1X2dlbV9vYmplY3RfaXNfaW5hY3RpdmUob2JqX3ByaXYpKQotCQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7Ci0KLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xMTQyLDEwICsxMDc0LDEwIEBACiAgKi8KIGludAogaTkxNV9nZW1fc3dfZmluaXNoX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3N3X2ZpbmlzaCAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKSkKQEAgLTExNTUsMTcgKzEwODcsMTcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9CiAKIAkvKiBQaW5uZWQgYnVmZmVycyBtYXkgYmUgc2Nhbm91dCwgc28gZmx1c2ggdGhlIGNhY2hlICovCi0JaWYgKHRvX2ludGVsX2JvKG9iaiktPnBpbl9jb3VudCkKKwlpZiAob2JqLT5waW5fY291bnQpCiAJCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKG9iaik7CiAKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xMTgwLDggKzExMTIsOSBAQAogICovCiBpbnQKIGk5MTVfZ2VtX21tYXBfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOwogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwogCWxvZmZfdCBvZmZzZXQ7CkBAIC0xMTkwLDEwICsxMTIzLDE1IEBACiAJaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKKwlpZiAob2JqLT5zaXplID4gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQpIHsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKwkJcmV0dXJuIC1FMkJJRzsKKwl9CisKIAlvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7CiAKIAlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwpAQCAtMTIyOCwxMCArMTE2Niw5IEBACiAgKi8KIGludCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKHZtYS0+dm1fcHJpdmF0ZV9kYXRhKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXBnb2ZmX3QgcGFnZV9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBwZm47CiAJaW50IHJldCA9IDA7CkBAIC0xMjQzLDI3ICsxMTgwLDM1IEBACiAKIAkvKiBOb3cgYmluZCBpdCBpbnRvIHRoZSBHVFQgaWYgbmVlZGVkICovCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmICghb2JqX3ByaXYtPmd0dF9zcGFjZSkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCAwKTsKKworCWlmICghb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKLQotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7CisJfQorCWlmICghb2JqLT5ndHRfc3BhY2UpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgMCwgdHJ1ZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVubG9jazsKIAl9CiAKLQkvKiBOZWVkIGEgbmV3IGZlbmNlIHJlZ2lzdGVyPyAqLwotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlX3JlZyhvYmosIHRydWUpOwotCQlpZiAocmV0KQotCQkJZ290byB1bmxvY2s7Ci0JfQorCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHdyaXRlKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubG9jazsKIAotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfaW5hY3RpdmUob2JqX3ByaXYpKQotCQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShvYmopOworCWVsc2UKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZShvYmosIE5VTEwsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gdW5sb2NrOwogCi0JcGZuID0gKChkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0KSA+PiBQQUdFX1NISUZUKSArCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19pbmFjdGl2ZShvYmopKQorCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOworCisJb2JqLT5mYXVsdF9tYXBwYWJsZSA9IHRydWU7CisKKwlwZm4gPSAoKGRldi0+YWdwLT5iYXNlICsgb2JqLT5ndHRfb2Zmc2V0KSA+PiBQQUdFX1NISUZUKSArCiAJCXBhZ2Vfb2Zmc2V0OwogCiAJLyogRmluYWxseSwgcmVtYXAgaXQgdXNpbmcgdGhlIG5ldyBHVFQgb2Zmc2V0ICovCkBAIC0xMjcyLDExICsxMjE3LDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVBR0FJTjoKKwkJc2V0X25lZWRfcmVzY2hlZCgpOwogCWNhc2UgMDoKIAljYXNlIC1FUkVTVEFSVFNZUzoKIAkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKIAljYXNlIC1FTk9NRU06Ci0JY2FzZSAtRUFHQUlOOgogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwogCWRlZmF1bHQ6CiAJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CkBAIC0xMjk1LDM3ICsxMjQxLDM5IEBACiAgKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGFuZCBhdHRhY2hlcyBhIGZha2Ugb2Zmc2V0IGZvciBAb2JqLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKIAlzdHJ1Y3QgZHJtX2xvY2FsX21hcCAqbWFwOwogCWludCByZXQgPSAwOwogCiAJLyogU2V0IHRoZSBvYmplY3QgdXAgZm9yIG1tYXAnaW5nICovCi0JbGlzdCA9ICZvYmotPm1hcF9saXN0OworCWxpc3QgPSAmb2JqLT5iYXNlLm1hcF9saXN0OwogCWxpc3QtPm1hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcm1fbWFwX2xpc3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxpc3QtPm1hcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltYXAgPSBsaXN0LT5tYXA7CiAJbWFwLT50eXBlID0gX0RSTV9HRU07Ci0JbWFwLT5zaXplID0gb2JqLT5zaXplOworCW1hcC0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOwogCW1hcC0+aGFuZGxlID0gb2JqOwogCiAJLyogR2V0IGEgRFJNIEdFTSBtbWFwIG9mZnNldCBhbGxvY2F0ZWQuLi4gKi8KIAlsaXN0LT5maWxlX29mZnNldF9ub2RlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZtbS0+b2Zmc2V0X21hbmFnZXIsCi0JCQkJCQkgICAgb2JqLT5zaXplIC8gUEFHRV9TSVpFLCAwLCAwKTsKKwkJCQkJCSAgICBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRSwKKwkJCQkJCSAgICAwLCAwKTsKIAlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2Zmc2V0IGZvciBibyAlZFxuIiwgb2JqLT5uYW1lKTsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2Zmc2V0IGZvciBibyAlZFxuIiwKKwkJCSAgb2JqLT5iYXNlLm5hbWUpOwogCQlyZXQgPSAtRU5PU1BDOwogCQlnb3RvIG91dF9mcmVlX2xpc3Q7CiAJfQogCiAJbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSA9IGRybV9tbV9nZXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSwKLQkJCQkJCSAgb2JqLT5zaXplIC8gUEFHRV9TSVpFLCAwKTsKKwkJCQkJCSAgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsCisJCQkJCQkgIDApOwogCWlmICghbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9mcmVlX2xpc3Q7CkBAIC0xMzM4LDE2ICsxMjg2LDEzIEBACiAJCWdvdG8gb3V0X2ZyZWVfbW07CiAJfQogCi0JLyogQnkgbm93IHdlIHNob3VsZCBiZSBhbGwgc2V0LCBhbnkgZHJtX21tYXAgcmVxdWVzdCBvbiB0aGUgb2Zmc2V0Ci0JICogYmVsb3cgd2lsbCBnZXQgdG8gb3VyIG1tYXAgJiBmYXVsdCBoYW5kbGVyICovCi0Jb2JqX3ByaXYtPm1tYXBfb2Zmc2V0ID0gKCh1aW50NjRfdCkgbGlzdC0+aGFzaC5rZXkpIDw8IFBBR0VfU0hJRlQ7Ci0KIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWVfbW06CiAJZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKIG91dF9mcmVlX2xpc3Q6CiAJa2ZyZWUobGlzdC0+bWFwKTsKKwlsaXN0LT5tYXAgPSBOVUxMOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNjcsMzggKzEzMTIsNTEgQEAKICAqIGZpeHVwIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkuCiAgKi8KIHZvaWQKLWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOworCWlmICghb2JqLT5mYXVsdF9tYXBwYWJsZSkKKwkJcmV0dXJuOwogCi0JaWYgKGRldi0+ZGV2X21hcHBpbmcpCi0JCXVubWFwX21hcHBpbmdfcmFuZ2UoZGV2LT5kZXZfbWFwcGluZywKLQkJCQkgICAgb2JqX3ByaXYtPm1tYXBfb2Zmc2V0LCBvYmotPnNpemUsIDEpOworCXVubWFwX21hcHBpbmdfcmFuZ2Uob2JqLT5iYXNlLmRldi0+ZGV2X21hcHBpbmcsCisJCQkgICAgKGxvZmZfdClvYmotPmJhc2UubWFwX2xpc3QuaGFzaC5rZXk8PFBBR0VfU0hJRlQsCisJCQkgICAgb2JqLT5iYXNlLnNpemUsIDEpOworCisJb2JqLT5mYXVsdF9tYXBwYWJsZSA9IGZhbHNlOwogfQogCiBzdGF0aWMgdm9pZAotaTkxNV9nZW1fZnJlZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2dlbV9tbSAqbW0gPSBkZXYtPm1tX3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpsaXN0ID0gJm9iai0+YmFzZS5tYXBfbGlzdDsKIAotCWxpc3QgPSAmb2JqLT5tYXBfbGlzdDsKIAlkcm1faHRfcmVtb3ZlX2l0ZW0oJm1tLT5vZmZzZXRfaGFzaCwgJmxpc3QtPmhhc2gpOworCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7CisJa2ZyZWUobGlzdC0+bWFwKTsKKwlsaXN0LT5tYXAgPSBOVUxMOworfQogCi0JaWYgKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKLQkJZHJtX21tX3B1dF9ibG9jayhsaXN0LT5maWxlX29mZnNldF9ub2RlKTsKLQkJbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSA9IE5VTEw7Ci0JfQorc3RhdGljIHVpbnQzMl90CitpOTE1X2dlbV9nZXRfZ3R0X3NpemUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKKwl1aW50MzJfdCBzaXplOwogCi0JaWYgKGxpc3QtPm1hcCkgewotCQlrZnJlZShsaXN0LT5tYXApOwotCQlsaXN0LT5tYXAgPSBOVUxMOwotCX0KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCB8fAorCSAgICBvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldHVybiBvYmotPmJhc2Uuc2l6ZTsKIAotCW9ial9wcml2LT5tbWFwX29mZnNldCA9IDA7CisJLyogUHJldmlvdXMgY2hpcHMgbmVlZCBhIHBvd2VyLW9mLXR3byBmZW5jZSByZWdpb24gd2hlbiB0aWxpbmcgKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gMykKKwkJc2l6ZSA9IDEwMjQqMTAyNDsKKwllbHNlCisJCXNpemUgPSA1MTIqMTAyNDsKKworCXdoaWxlIChzaXplIDwgb2JqLT5iYXNlLnNpemUpCisJCXNpemUgPDw9IDE7CisKKwlyZXR1cm4gc2l6ZTsKIH0KIAogLyoqCkBAIC0xNDA2LDQyICsxMzY0LDY4IEBACiAgKiBAb2JqOiBvYmplY3QgdG8gY2hlY2sKICAqCiAgKiBSZXR1cm4gdGhlIHJlcXVpcmVkIEdUVCBhbGlnbm1lbnQgZm9yIGFuIG9iamVjdCwgdGFraW5nIGludG8gYWNjb3VudAotICogcG90ZW50aWFsIGZlbmNlIHJlZ2lzdGVyIG1hcHBpbmcgaWYgbmVlZGVkLgorICogcG90ZW50aWFsIGZlbmNlIHJlZ2lzdGVyIG1hcHBpbmcuCiAgKi8KIHN0YXRpYyB1aW50MzJfdAotaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCBzdGFydCwgaTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAogCS8qCiAJICogTWluaW11bSBhbGlnbm1lbnQgaXMgNGsgKEdUVCBwYWdlIHNpemUpLCBidXQgbWlnaHQgYmUgZ3JlYXRlcgogCSAqIGlmIGEgZmVuY2UgcmVnaXN0ZXIgaXMgbmVlZGVkIGZvciB0aGUgb2JqZWN0LgogCSAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0IHx8IG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0IHx8CisJICAgIG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJcmV0dXJuIDQwOTY7CiAKIAkvKgogCSAqIFByZXZpb3VzIGNoaXBzIG5lZWQgdG8gYmUgYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiB0aGUgc21hbGxlc3QKIAkgKiBmZW5jZSByZWdpc3RlciB0aGF0IGNhbiBjb250YWluIHRoZSBvYmplY3QuCiAJICovCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDMpCi0JCXN0YXJ0ID0gMTAyNCoxMDI0OworCXJldHVybiBpOTE1X2dlbV9nZXRfZ3R0X3NpemUob2JqKTsKK30KKworLyoqCisgKiBpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudCAtIHJldHVybiByZXF1aXJlZCBHVFQgYWxpZ25tZW50IGZvciBhbgorICoJCQkJCSB1bmZlbmNlZCBvYmplY3QKKyAqIEBvYmo6IG9iamVjdCB0byBjaGVjaworICoKKyAqIFJldHVybiB0aGUgcmVxdWlyZWQgR1RUIGFsaWdubWVudCBmb3IgYW4gb2JqZWN0LCBvbmx5IHRha2luZyBpbnRvIGFjY291bnQKKyAqIHVuZmVuY2VkIHRpbGVkIHN1cmZhY2UgcmVxdWlyZW1lbnRzLgorICovCitzdGF0aWMgdWludDMyX3QKK2k5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJaW50IHRpbGVfaGVpZ2h0OworCisJLyoKKwkgKiBNaW5pbXVtIGFsaWdubWVudCBpcyA0ayAoR1RUIHBhZ2Ugc2l6ZSkgZm9yIHNhbmUgaHcuCisJICovCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgfHwgSVNfRzMzKGRldikgfHwKKwkgICAgb2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCQlyZXR1cm4gNDA5NjsKKworCS8qCisJICogT2xkZXIgY2hpcHMgbmVlZCB1bmZlbmNlZCB0aWxlZCBidWZmZXJzIHRvIGJlIGFsaWduZWQgdG8gdGhlIGxlZnQKKwkgKiBlZGdlIG9mIGFuIGV2ZW4gdGlsZSByb3cgKHdoZXJlIHRpbGUgcm93cyBhcmUgY291bnRlZCBhcyBpZiB0aGUgYm8gaXMKKwkgKiBwbGFjZWQgaW4gYSBmZW5jZWQgZ3R0IHJlZ2lvbikuCisJICovCisJaWYgKElTX0dFTjIoZGV2KSB8fAorCSAgICAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZICYmIEhBU18xMjhfQllURV9ZX1RJTElORyhkZXYpKSkKKwkJdGlsZV9oZWlnaHQgPSAzMjsKIAllbHNlCi0JCXN0YXJ0ID0gNTEyKjEwMjQ7CisJCXRpbGVfaGVpZ2h0ID0gODsKIAotCWZvciAoaSA9IHN0YXJ0OyBpIDwgb2JqLT5zaXplOyBpIDw8PSAxKQotCQk7Ci0KLQlyZXR1cm4gaTsKKwlyZXR1cm4gdGlsZV9oZWlnaHQgKiBvYmotPnN0cmlkZSAqIDI7CiB9CiAKIC8qKgogICogaTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwgLSBwcmVwYXJlIGFuIG9iamVjdCBmb3IgR1RUIG1tYXAnaW5nCiAgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKiBAZGF0YTogR1RUIG1hcHBpbmcgaW9jdGwgZGF0YQotICogQGZpbGVfcHJpdjogR0VNIG9iamVjdCBpbmZvCisgKiBAZmlsZTogR0VNIG9iamVjdCBpbmZvCiAgKgogICogU2ltcGx5IHJldHVybnMgdGhlIGZha2Ugb2Zmc2V0IHRvIHVzZXJzcGFjZSBzbyBpdCBjYW4gbW1hcCBpdC4KICAqIFRoZSBtbWFwIGNhbGwgd2lsbCBlbmQgdXAgaW4gZHJtX2dlbV9tbWFwKCksIHdoaWNoIHdpbGwgc2V0IHRoaW5ncwpAQCAtMTQ1NCwxMSArMTQzOCwxMSBAQAogICovCiBpbnQKIGk5MTVfZ2VtX21tYXBfZ3R0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fbW1hcF9ndHQgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpCkBAIC0xNDY4LDEzMCArMTQ1MiwxOTYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKG9ial9wcml2LT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgeworCWlmIChvYmotPmJhc2Uuc2l6ZSA+IGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kKSB7CisJCXJldCA9IC1FMkJJRzsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKG9iai0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsKIAkJRFJNX0VSUk9SKCJBdHRlbXB0aW5nIHRvIG1tYXAgYSBwdXJnZWFibGUgYnVmZmVyXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFvYmpfcHJpdi0+bW1hcF9vZmZzZXQpIHsKKwlpZiAoIW9iai0+YmFzZS5tYXBfbGlzdC5tYXApIHsKIAkJcmV0ID0gaTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlhcmdzLT5vZmZzZXQgPSBvYmpfcHJpdi0+bW1hcF9vZmZzZXQ7Ci0KLQkvKgotCSAqIFB1bGwgaXQgaW50byB0aGUgR1RUIHNvIHRoYXQgd2UgaGF2ZSBhIHBhZ2UgbGlzdCAobWFrZXMgdGhlCi0JICogaW5pdGlhbCBmYXVsdCBmYXN0ZXIgYW5kIGFueSBzdWJzZXF1ZW50IGZsdXNoaW5nIHBvc3NpYmxlKS4KLQkgKi8KLQlpZiAoIW9ial9wcml2LT5hZ3BfbWVtKSB7Ci0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIDApOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQorCWFyZ3MtPm9mZnNldCA9ICh1NjQpb2JqLT5iYXNlLm1hcF9saXN0Lmhhc2gua2V5IDw8IFBBR0VfU0hJRlQ7CiAKIG91dDoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1pOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQorc3RhdGljIGludAoraTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlc19ndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgICAgIGdmcF90IGdmcG1hc2spCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlpbnQgcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKKwlpbnQgcGFnZV9jb3VudCwgaTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJLyogR2V0IHRoZSBsaXN0IG9mIHBhZ2VzIG91dCBvZiBvdXIgc3RydWN0IGZpbGUuICBUaGV5J2xsIGJlIHBpbm5lZAorCSAqIGF0IHRoaXMgcG9pbnQgdW50aWwgd2UgcmVsZWFzZSB0aGVtLgorCSAqLworCXBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRTsKKwlCVUdfT04ob2JqLT5wYWdlcyAhPSBOVUxMKTsKKwlvYmotPnBhZ2VzID0gZHJtX21hbGxvY19hYihwYWdlX2NvdW50LCBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCWlmIChvYmotPnBhZ2VzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5vZGUgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwltYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCisJCQkJCSAgIEdGUF9ISUdIVVNFUiB8CisJCQkJCSAgIF9fR0ZQX0NPTEQgfAorCQkJCQkgICBfX0dGUF9SRUNMQUlNQUJMRSB8CisJCQkJCSAgIGdmcG1hc2spOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJZ290byBlcnJfcGFnZXM7CisKKwkJb2JqLT5wYWdlc1tpXSA9IHBhZ2U7CisJfQorCisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKG9iaik7CisKKwlyZXR1cm4gMDsKKworZXJyX3BhZ2VzOgorCXdoaWxlIChpLS0pCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShvYmotPnBhZ2VzW2ldKTsKKworCWRybV9mcmVlX2xhcmdlKG9iai0+cGFnZXMpOworCW9iai0+cGFnZXMgPSBOVUxMOworCXJldHVybiBQVFJfRVJSKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlc19ndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwogCWludCBpOwogCi0JQlVHX09OKG9ial9wcml2LT5wYWdlc19yZWZjb3VudCA9PSAwKTsKLQlCVUdfT04ob2JqX3ByaXYtPm1hZHYgPT0gX19JOTE1X01BRFZfUFVSR0VEKTsKKwlCVUdfT04ob2JqLT5tYWR2ID09IF9fSTkxNV9NQURWX1BVUkdFRCk7CiAKLQlpZiAoLS1vYmpfcHJpdi0+cGFnZXNfcmVmY291bnQgIT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCiAJCWk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKG9iaik7CiAKLQlpZiAob2JqX3ByaXYtPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEKQotCQlvYmpfcHJpdi0+ZGlydHkgPSAwOworCWlmIChvYmotPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEKQorCQlvYmotPmRpcnR5ID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJaWYgKG9ial9wcml2LT5kaXJ0eSkKLQkJCXNldF9wYWdlX2RpcnR5KG9ial9wcml2LT5wYWdlc1tpXSk7CisJCWlmIChvYmotPmRpcnR5KQorCQkJc2V0X3BhZ2VfZGlydHkob2JqLT5wYWdlc1tpXSk7CiAKLQkJaWYgKG9ial9wcml2LT5tYWR2ID09IEk5MTVfTUFEVl9XSUxMTkVFRCkKLQkJCW1hcmtfcGFnZV9hY2Nlc3NlZChvYmpfcHJpdi0+cGFnZXNbaV0pOworCQlpZiAob2JqLT5tYWR2ID09IEk5MTVfTUFEVl9XSUxMTkVFRCkKKwkJCW1hcmtfcGFnZV9hY2Nlc3NlZChvYmotPnBhZ2VzW2ldKTsKIAotCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2JqX3ByaXYtPnBhZ2VzW2ldKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKG9iai0+cGFnZXNbaV0pOwogCX0KLQlvYmpfcHJpdi0+ZGlydHkgPSAwOworCW9iai0+ZGlydHkgPSAwOwogCi0JZHJtX2ZyZWVfbGFyZ2Uob2JqX3ByaXYtPnBhZ2VzKTsKLQlvYmpfcHJpdi0+cGFnZXMgPSBOVUxMOworCWRybV9mcmVlX2xhcmdlKG9iai0+cGFnZXMpOworCW9iai0+cGFnZXMgPSBOVUxMOwogfQogCi1zdGF0aWMgdWludDMyX3QKLWk5MTVfZ2VtX25leHRfcmVxdWVzdF9zZXFubyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQKK2k5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSAgICAgICB1MzIgc2Vxbm8pCiB7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QgPSB0cnVlOwotCXJldHVybiBkZXZfcHJpdi0+bmV4dF9zZXFubzsKLX0KLQotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQl1aW50MzJfdCBzZXFubyA9IGk5MTVfZ2VtX25leHRfcmVxdWVzdF9zZXFubyhkZXYsIHJpbmcpOwogCiAJQlVHX09OKHJpbmcgPT0gTlVMTCk7Ci0Jb2JqX3ByaXYtPnJpbmcgPSByaW5nOworCW9iai0+cmluZyA9IHJpbmc7CiAKIAkvKiBBZGQgYSByZWZlcmVuY2UgaWYgd2UncmUgbmV3bHkgZW50ZXJpbmcgdGhlIGFjdGl2ZSBsaXN0LiAqLwotCWlmICghb2JqX3ByaXYtPmFjdGl2ZSkgewotCQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uob2JqKTsKLQkJb2JqX3ByaXYtPmFjdGl2ZSA9IDE7CisJaWYgKCFvYmotPmFjdGl2ZSkgeworCQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJCW9iai0+YWN0aXZlID0gMTsKIAl9CiAKIAkvKiBNb3ZlIGZyb20gd2hhdGV2ZXIgbGlzdCB3ZSB3ZXJlIG9uIHRvIHRoZSB0YWlsIG9mIGV4ZWN1dGlvbi4gKi8KLQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpOwotCWxpc3RfbW92ZV90YWlsKCZvYmpfcHJpdi0+cmluZ19saXN0LCAmcmluZy0+YWN0aXZlX2xpc3QpOwotCW9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubyA9IHNlcW5vOworCWxpc3RfbW92ZV90YWlsKCZvYmotPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpOworCWxpc3RfbW92ZV90YWlsKCZvYmotPnJpbmdfbGlzdCwgJnJpbmctPmFjdGl2ZV9saXN0KTsKKworCW9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8gPSBzZXFubzsKKwlpZiAob2JqLT5mZW5jZWRfZ3B1X2FjY2VzcykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWc7CisKKwkJQlVHX09OKG9iai0+ZmVuY2VfcmVnID09IEk5MTVfRkVOQ0VfUkVHX05PTkUpOworCisJCW9iai0+bGFzdF9mZW5jZWRfc2Vxbm8gPSBzZXFubzsKKwkJb2JqLT5sYXN0X2ZlbmNlZF9yaW5nID0gcmluZzsKKworCQlyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddOworCQlsaXN0X21vdmVfdGFpbCgmcmVnLT5scnVfbGlzdCwgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCi1pOTE1X2dlbV9vYmplY3RfbW92ZV90b19mbHVzaGluZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX29iamVjdF9tb3ZlX29mZl9hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlsaXN0X2RlbF9pbml0KCZvYmotPnJpbmdfbGlzdCk7CisJb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubyA9IDA7Cit9CiAKLQlCVUdfT04oIW9ial9wcml2LT5hY3RpdmUpOwotCWxpc3RfbW92ZV90YWlsKCZvYmpfcHJpdi0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KTsKLQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+cmluZ19saXN0KTsKLQlvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8gPSAwOworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2ZsdXNoaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlCVUdfT04oIW9iai0+YWN0aXZlKTsKKwlsaXN0X21vdmVfdGFpbCgmb2JqLT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpOworCisJaTkxNV9nZW1fb2JqZWN0X21vdmVfb2ZmX2FjdGl2ZShvYmopOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKG9iai0+cGluX2NvdW50ICE9IDApCisJCWxpc3RfbW92ZV90YWlsKCZvYmotPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOworCWVsc2UKKwkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKKworCUJVR19PTighbGlzdF9lbXB0eSgmb2JqLT5ncHVfd3JpdGVfbGlzdCkpOworCUJVR19PTighb2JqLT5hY3RpdmUpOworCW9iai0+cmluZyA9IE5VTEw7CisKKwlpOTE1X2dlbV9vYmplY3RfbW92ZV9vZmZfYWN0aXZlKG9iaik7CisJb2JqLT5mZW5jZWRfZ3B1X2FjY2VzcyA9IGZhbHNlOworCisJb2JqLT5hY3RpdmUgPSAwOworCW9iai0+cGVuZGluZ19ncHVfd3JpdGUgPSBmYWxzZTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKworCVdBUk5fT04oaTkxNV92ZXJpZnlfbGlzdHMoZGV2KSk7CiB9CiAKIC8qIEltbWVkaWF0ZWx5IGRpc2NhcmQgdGhlIGJhY2tpbmcgc3RvcmFnZSAqLwogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF90cnVuY2F0ZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX29iamVjdF90cnVuY2F0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAogCS8qIE91ciBnb2FsIGhlcmUgaXMgdG8gcmV0dXJuIGFzIG11Y2ggb2YgdGhlIG1lbW9yeSBhcwpAQCAtMTYwMCw0MiArMTY1MCwxOCBAQAogCSAqIGJhY2tpbmcgcGFnZXMsICpub3cqLiBIZXJlIHdlIG1pcnJvciB0aGUgYWN0aW9ucyB0YWtlbgogCSAqIHdoZW4gYnkgc2htZW1fZGVsZXRlX2lub2RlKCkgdG8gcmVsZWFzZSB0aGUgYmFja2luZyBzdG9yZS4KIAkgKi8KLQlpbm9kZSA9IG9iai0+ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpbm9kZSA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwogCWlmIChpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UpCiAJCWlub2RlLT5pX29wLT50cnVuY2F0ZV9yYW5nZShpbm9kZSwgMCwgKGxvZmZfdCktMSk7CiAKLQlvYmpfcHJpdi0+bWFkdiA9IF9fSTkxNV9NQURWX1BVUkdFRDsKKwlvYmotPm1hZHYgPSBfX0k5MTVfTUFEVl9QVVJHRUQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1pOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdikKK2k5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlyZXR1cm4gb2JqX3ByaXYtPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEOwotfQotCi1zdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KLQlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCAhPSAwKQotCQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOwotCWVsc2UKLQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOwotCWxpc3RfZGVsX2luaXQoJm9ial9wcml2LT5yaW5nX2xpc3QpOwotCi0JQlVHX09OKCFsaXN0X2VtcHR5KCZvYmpfcHJpdi0+Z3B1X3dyaXRlX2xpc3QpKTsKLQotCW9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubyA9IDA7Ci0Jb2JqX3ByaXYtPnJpbmcgPSBOVUxMOwotCWlmIChvYmpfcHJpdi0+YWN0aXZlKSB7Ci0JCW9ial9wcml2LT5hY3RpdmUgPSAwOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOwotCX0KLQlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOworCXJldHVybiBvYmotPm1hZHYgPT0gSTkxNV9NQURWX0RPTlRORUVEOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY0MywzNyArMTY2OSwyNyBAQAogCQkJICAgICAgIHVpbnQzMl90IGZsdXNoX2RvbWFpbnMsCiAJCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiwgKm5leHQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqX3ByaXYsIG5leHQsCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgbmV4dCwKIAkJCQkgJnJpbmctPmdwdV93cml0ZV9saXN0LAogCQkJCSBncHVfd3JpdGVfbGlzdCkgewotCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZvYmpfcHJpdi0+YmFzZTsKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSB7CisJCQl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKIAotCQlpZiAob2JqLT53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSB7Ci0JCQl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0KLQkJCW9iai0+d3JpdGVfZG9tYWluID0gMDsKLQkJCWxpc3RfZGVsX2luaXQoJm9ial9wcml2LT5ncHVfd3JpdGVfbGlzdCk7Ci0JCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19hY3RpdmUob2JqLCByaW5nKTsKLQotCQkJLyogdXBkYXRlIHRoZSBmZW5jZSBscnUgbGlzdCAqLwotCQkJaWYgKG9ial9wcml2LT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkgewotCQkJCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9Ci0JCQkJCSZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tvYmpfcHJpdi0+ZmVuY2VfcmVnXTsKLQkJCQlsaXN0X21vdmVfdGFpbCgmcmVnLT5scnVfbGlzdCwKLQkJCQkJCSZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7Ci0JCQl9CisJCQlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gMDsKKwkJCWxpc3RfZGVsX2luaXQoJm9iai0+Z3B1X3dyaXRlX2xpc3QpOworCQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fYWN0aXZlKG9iaiwgcmluZywKKwkJCQkJCSAgICAgICBpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCByaW5nKSk7CiAKIAkJCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKLQkJCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCisJCQkJCQkJICAgIG9iai0+YmFzZS5yZWFkX2RvbWFpbnMsCiAJCQkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwogCQl9CiAJfQogfQogCi11aW50MzJfdAoraW50CiBpOTE1X2FkZF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCiAJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QsCkBAIC0xNjgzLDE3ICsxNjk5LDE3IEBACiAJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2ID0gTlVMTDsKIAl1aW50MzJfdCBzZXFubzsKIAlpbnQgd2FzX2VtcHR5OworCWludCByZXQ7CisKKwlCVUdfT04ocmVxdWVzdCA9PSBOVUxMKTsKIAogCWlmIChmaWxlICE9IE5VTEwpCiAJCWZpbGVfcHJpdiA9IGZpbGUtPmRyaXZlcl9wcml2OwogCi0JaWYgKHJlcXVlc3QgPT0gTlVMTCkgewotCQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHJlcXVlc3QgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KKwlyZXQgPSByaW5nLT5hZGRfcmVxdWVzdChyaW5nLCAmc2Vxbm8pOworCWlmIChyZXQpCisJICAgIHJldHVybiByZXQ7CiAKLQlzZXFubyA9IHJpbmctPmFkZF9yZXF1ZXN0KGRldiwgcmluZywgMCk7CiAJcmluZy0+b3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0ID0gZmFsc2U7CiAKIAlyZXF1ZXN0LT5zZXFubyA9IHNlcW5vOwpAQCAtMTcxNywyNiArMTczMyw3IEBACiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGV2X3ByaXYtPndxLAogCQkJCQkgICAmZGV2X3ByaXYtPm1tLnJldGlyZV93b3JrLCBIWik7CiAJfQotCXJldHVybiBzZXFubzsKLX0KLQotLyoqCi0gKiBDb21tYW5kIGV4ZWN1dGlvbiBiYXJyaWVyCi0gKgotICogRW5zdXJlcyB0aGF0IGFsbCBjb21tYW5kcyBpbiB0aGUgcmluZyBhcmUgZmluaXNoZWQKLSAqIGJlZm9yZSBzaWduYWxsaW5nIHRoZSBDUFUKLSAqLwotc3RhdGljIHZvaWQKLWk5MTVfcmV0aXJlX2NvbW1hbmRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKLXsKLQl1aW50MzJfdCBmbHVzaF9kb21haW5zID0gMDsKLQotCS8qIFRoZSBzYW1wbGVyIGFsd2F5cyBnZXRzIGZsdXNoZWQgb24gaTk2NSAoc2lnaCkgKi8KLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKLQkJZmx1c2hfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fU0FNUExFUjsKLQotCXJpbmctPmZsdXNoKGRldiwgcmluZywKLQkJCUk5MTVfR0VNX0RPTUFJTl9DT01NQU5ELCBmbHVzaF9kb21haW5zKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xNzY5LDYyICsxNzY2LDc2IEBACiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCi0JCW9ial9wcml2ID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+YWN0aXZlX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJICAgIHJpbmdfbGlzdCk7CisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCQkgICAgICAgcmluZ19saXN0KTsKIAotCQlvYmpfcHJpdi0+YmFzZS53cml0ZV9kb21haW4gPSAwOwotCQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+Z3B1X3dyaXRlX2xpc3QpOwotCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZSgmb2JqX3ByaXYtPmJhc2UpOworCQlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gMDsKKwkJbGlzdF9kZWxfaW5pdCgmb2JqLT5ncHVfd3JpdGVfbGlzdCk7CisJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKG9iaik7CisJfQorfQorCitzdGF0aWMgdm9pZCBpOTE1X2dlbV9yZXNldF9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW2ldOworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7CisKKwkJaWYgKCFvYmopCisJCQljb250aW51ZTsKKworCQlpZiAob2JqLT50aWxpbmdfbW9kZSkKKwkJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOworCisJCXJlZy0+b2JqLT5mZW5jZV9yZWcgPSBJOTE1X0ZFTkNFX1JFR19OT05FOworCQlyZWctPm9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgPSBmYWxzZTsKKwkJcmVnLT5vYmotPmxhc3RfZmVuY2VkX3NlcW5vID0gMDsKKwkJcmVnLT5vYmotPmxhc3RfZmVuY2VkX3JpbmcgPSBOVUxMOworCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoZGV2LCByZWcpOwogCX0KIH0KIAogdm9pZCBpOTE1X2dlbV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IGk7CiAKLQlpOTE1X2dlbV9yZXNldF9yaW5nX2xpc3RzKGRldl9wcml2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpOTE1X2dlbV9yZXNldF9yaW5nX2xpc3RzKGRldl9wcml2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKLQlpOTE1X2dlbV9yZXNldF9yaW5nX2xpc3RzKGRldl9wcml2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJaTkxNV9nZW1fcmVzZXRfcmluZ19saXN0cyhkZXZfcHJpdiwgJmRldl9wcml2LT5yaW5nW2ldKTsKIAogCS8qIFJlbW92ZSBhbnl0aGluZyBmcm9tIHRoZSBmbHVzaGluZyBsaXN0cy4gVGhlIEdQVSBjYWNoZSBpcyBsaWtlbHkKIAkgKiB0byBiZSBsb3N0IG9uIHJlc2V0IGFsb25nIHdpdGggdGhlIGRhdGEsIHNvIHNpbXBseSBtb3ZlIHRoZQogCSAqIGxvc3QgYm8gdG8gdGhlIGluYWN0aXZlIGxpc3QuCiAJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCkpIHsKLQkJb2JqX3ByaXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwKLQkJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAotCQkJCQkgICAgbW1fbGlzdCk7CisJCW9iaj0gbGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsCisJCQkJICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgbW1fbGlzdCk7CiAKLQkJb2JqX3ByaXYtPmJhc2Uud3JpdGVfZG9tYWluID0gMDsKLQkJbGlzdF9kZWxfaW5pdCgmb2JqX3ByaXYtPmdwdV93cml0ZV9saXN0KTsKLQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUoJm9ial9wcml2LT5iYXNlKTsKKwkJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CisJCWxpc3RfZGVsX2luaXQoJm9iai0+Z3B1X3dyaXRlX2xpc3QpOworCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZShvYmopOwogCX0KIAogCS8qIE1vdmUgZXZlcnl0aGluZyBvdXQgb2YgdGhlIEdQVSBkb21haW5zIHRvIGVuc3VyZSB3ZSBkbyBhbnkKIAkgKiBuZWNlc3NhcnkgaW52YWxpZGF0aW9uIHVwb24gcmV1c2UuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwKIAkJCSAgICAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsCiAJCQkgICAgbW1fbGlzdCkKIAl7Ci0JCW9ial9wcml2LT5iYXNlLnJlYWRfZG9tYWlucyAmPSB+STkxNV9HRU1fR1BVX0RPTUFJTlM7CisJCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJj0gfkk5MTVfR0VNX0dQVV9ET01BSU5TOwogCX0KIAogCS8qIFRoZSBmZW5jZSByZWdpc3RlcnMgYXJlIGludmFsaWRhdGVkIHNvIGNsZWFyIHRoZW0gb3V0ICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnOwotCi0JCXJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tpXTsKLQkJaWYgKCFyZWctPm9iaikKLQkJCWNvbnRpbnVlOwotCi0JCWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhyZWctPm9iaik7Ci0JfQorCWk5MTVfZ2VtX3Jlc2V0X2ZlbmNlcyhkZXYpOwogfQogCiAvKioKQEAgLTE4MzYsNiArMTg0Nyw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3Qgc2Vxbm87CisJaW50IGk7CiAKIAlpZiAoIXJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciB8fAogCSAgICBsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpKQpAQCAtMTg0Myw3ICsxODU1LDEyIEBACiAKIAlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogCi0Jc2Vxbm8gPSByaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKTsKKwlzZXFubyA9IHJpbmctPmdldF9zZXFubyhyaW5nKTsKKworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlpZiAoc2Vxbm8gPj0gcmluZy0+c3luY19zZXFub1tpXSkKKwkJCXJpbmctPnN5bmNfc2Vxbm9baV0gPSAwOworCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpKSB7CiAJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIApAQCAtMTg2NSwxOCArMTg4MiwxNiBAQAogCSAqIGJ5IHRoZSByaW5nYnVmZmVyIHRvIHRoZSBmbHVzaGluZy9pbmFjdGl2ZSBsaXN0cyBhcyBhcHByb3ByaWF0ZS4KIAkgKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPmFjdGl2ZV9saXN0KSkgewotCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCi0JCW9ial9wcml2ID0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+YWN0aXZlX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJICAgIHJpbmdfbGlzdCk7CisJCW9iaj0gbGlzdF9maXJzdF9lbnRyeSgmcmluZy0+YWN0aXZlX2xpc3QsCisJCQkJICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgcmluZ19saXN0KTsKIAotCQlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKHNlcW5vLCBvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8pKQorCQlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKHNlcW5vLCBvYmotPmxhc3RfcmVuZGVyaW5nX3NlcW5vKSkKIAkJCWJyZWFrOwogCi0JCW9iaiA9ICZvYmpfcHJpdi0+YmFzZTsKLQkJaWYgKG9iai0+d3JpdGVfZG9tYWluICE9IDApCisJCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICE9IDApCiAJCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19mbHVzaGluZyhvYmopOwogCQllbHNlCiAJCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZShvYmopOwpAQCAtMTg4NCw3ICsxODk5LDcgQEAKIAogCWlmICh1bmxpa2VseSAoZGV2X3ByaXYtPnRyYWNlX2lycV9zZXFubyAmJgogCQkgICAgICBpOTE1X3NlcW5vX3Bhc3NlZChkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vLCBzZXFubykpKSB7Ci0JCXJpbmctPnVzZXJfaXJxX3B1dChkZXYsIHJpbmcpOworCQlyaW5nLT5pcnFfcHV0KHJpbmcpOwogCQlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gMDsKIAl9CiAKQEAgLTE4OTUsMjQgKzE5MTAsMjQgQEAKIGk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0KSkgewotCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYsICp0bXA7CisJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosICpuZXh0OwogCiAJICAgIC8qIFdlIG11c3QgYmUgY2FyZWZ1bCB0aGF0IGR1cmluZyB1bmJpbmQoKSB3ZSBkbyBub3QKIAkgICAgICogYWNjaWRlbnRhbGx5IGluZmluaXRlbHkgcmVjdXJzZSBpbnRvIHJldGlyZSByZXF1ZXN0cy4KIAkgICAgICogQ3VycmVudGx5OgogCSAgICAgKiAgIHJldGlyZSAtPiBmcmVlIC0+IHVuYmluZCAtPiB3YWl0IC0+IHJldGlyZV9yaW5nCiAJICAgICAqLwotCSAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqX3ByaXYsIHRtcCwKKwkgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgbmV4dCwKIAkJCQkgICAgICZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0LAogCQkJCSAgICAgbW1fbGlzdCkKLQkJICAgIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0X3RhaWwoJm9ial9wcml2LT5iYXNlKTsKKwkJICAgIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0X3RhaWwob2JqKTsKIAl9CiAKLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOwotCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7Ci0JaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3JpbmcoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbaV0pOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTkyMCw2ICsxOTM1LDggQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisJYm9vbCBpZGxlOworCWludCBpOwogCiAJZGV2X3ByaXYgPSBjb250YWluZXJfb2Yod29yaywgZHJtX2k5MTVfcHJpdmF0ZV90LAogCQkJCW1tLnJldGlyZV93b3JrLndvcmspOwpAQCAtMTkzMywxMSArMTk1MCwzMSBAQAogCiAJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CiAKLQlpZiAoIWRldl9wcml2LT5tbS5zdXNwZW5kZWQgJiYKLQkJKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KSB8fAotCQkgIWxpc3RfZW1wdHkoJmRldl9wcml2LT5ic2RfcmluZy5yZXF1ZXN0X2xpc3QpIHx8Ci0JCSAhbGlzdF9lbXB0eSgmZGV2X3ByaXYtPmJsdF9yaW5nLnJlcXVlc3RfbGlzdCkpKQorCS8qIFNlbmQgYSBwZXJpb2RpYyBmbHVzaCBkb3duIHRoZSByaW5nIHNvIHdlIGRvbid0IGhvbGQgb250byBHRU0KKwkgKiBvYmplY3RzIGluZGVmaW5pdGVseS4KKwkgKi8KKwlpZGxlID0gdHJ1ZTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykgeworCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbaV07CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZyaW5nLT5ncHVfd3JpdGVfbGlzdCkpIHsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKKwkJCWludCByZXQ7CisKKwkJCXJldCA9IGk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCByaW5nLCAwLAorCQkJCQkJICBJOTE1X0dFTV9HUFVfRE9NQUlOUyk7CisJCQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZXQgfHwgcmVxdWVzdCA9PSBOVUxMIHx8CisJCQkgICAgaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIHJlcXVlc3QsIHJpbmcpKQorCQkJICAgIGtmcmVlKHJlcXVlc3QpOworCQl9CisKKwkJaWRsZSAmPSBsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpOworCX0KKworCWlmICghZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCAmJiAhaWRsZSkKIAkJcXVldWVfZGVsYXllZF93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5tbS5yZXRpcmVfd29yaywgSFopOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKQEAgLTE5NTQsMTQgKzE5OTEsMjMgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWlmIChyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QpIHsKLQkJc2Vxbm8gPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgTlVMTCwgcmluZyk7Ci0JCWlmIChzZXFubyA9PSAwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCUJVR19PTihzZXFubyA9PSBkZXZfcHJpdi0+bmV4dF9zZXFubyk7CisJaWYgKHNlcW5vID09IHJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CiAKLQlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKHJpbmctPmdldF9zZXFubyhkZXYsIHJpbmcpLCBzZXFubykpIHsKKwkJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXF1ZXN0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXQgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgcmVxdWVzdCwgcmluZyk7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHJlcXVlc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNlcW5vID0gcmVxdWVzdC0+c2Vxbm87CisJfQorCisJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksIHNlcW5vKSkgewogCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQkJaWVyID0gSTkxNV9SRUFEKERFSUVSKSB8IEk5MTVfUkVBRChHVElFUik7CiAJCWVsc2UKQEAgLTE5NzUsMjEgKzIwMjEsMjMgQEAKIAogCQl0cmFjZV9pOTE1X2dlbV9yZXF1ZXN0X3dhaXRfYmVnaW4oZGV2LCBzZXFubyk7CiAKLQkJcmluZy0+d2FpdGluZ19nZW1fc2Vxbm8gPSBzZXFubzsKLQkJcmluZy0+dXNlcl9pcnFfZ2V0KGRldiwgcmluZyk7Ci0JCWlmIChpbnRlcnJ1cHRpYmxlKQotCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJpbmctPmlycV9xdWV1ZSwKLQkJCQlpOTE1X3NlcW5vX3Bhc3NlZCgKLQkJCQkJcmluZy0+Z2V0X3NlcW5vKGRldiwgcmluZyksIHNlcW5vKQotCQkJCXx8IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7Ci0JCWVsc2UKLQkJCXdhaXRfZXZlbnQocmluZy0+aXJxX3F1ZXVlLAotCQkJCWk5MTVfc2Vxbm9fcGFzc2VkKAotCQkJCQlyaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKSwgc2Vxbm8pCi0JCQkJfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKKwkJcmluZy0+d2FpdGluZ19zZXFubyA9IHNlcW5vOworCQlpZiAocmluZy0+aXJxX2dldChyaW5nKSkgeworCQkJaWYgKGludGVycnVwdGlibGUpCisJCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJpbmctPmlycV9xdWV1ZSwKKwkJCQkJCQkgICAgICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykKKwkJCQkJCQkgICAgICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKKwkJCWVsc2UKKwkJCQl3YWl0X2V2ZW50KHJpbmctPmlycV9xdWV1ZSwKKwkJCQkJICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykKKwkJCQkJICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKIAotCQlyaW5nLT51c2VyX2lycV9wdXQoZGV2LCByaW5nKTsKLQkJcmluZy0+d2FpdGluZ19nZW1fc2Vxbm8gPSAwOworCQkJcmluZy0+aXJxX3B1dChyaW5nKTsKKwkJfSBlbHNlIGlmICh3YWl0X2ZvcihpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksCisJCQkJCQkgICAgICBzZXFubykgfHwKKwkJCQkgICAgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpLCAzMDAwKSkKKwkJCXJldCA9IC1FQlVTWTsKKwkJcmluZy0+d2FpdGluZ19zZXFubyA9IDA7CiAKIAkJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF93YWl0X2VuZChkZXYsIHNlcW5vKTsKIAl9CkBAIC0xOTk4LDcgKzIwNDYsNyBAQAogCiAJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQogCQlEUk1fRVJST1IoIiVzIHJldHVybnMgJWQgKGF3YWl0aW5nICVkIGF0ICVkLCBuZXh0ICVkKVxuIiwKLQkJCSAgX19mdW5jX18sIHJldCwgc2Vxbm8sIHJpbmctPmdldF9zZXFubyhkZXYsIHJpbmcpLAorCQkJICBfX2Z1bmNfXywgcmV0LCBzZXFubywgcmluZy0+Z2V0X3NlcW5vKHJpbmcpLAogCQkJICBkZXZfcHJpdi0+bmV4dF9zZXFubyk7CiAKIAkvKiBEaXJlY3RseSBkaXNwYXRjaCByZXF1ZXN0IHJldGlyaW5nLiAgV2hpbGUgd2UgaGF2ZSB0aGUgd29yayBxdWV1ZQpAQCAtMjAyMyw3MCArMjA3MSwzMCBAQAogCXJldHVybiBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIHNlcW5vLCAxLCByaW5nKTsKIH0KIAotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2ZsdXNoX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAotCQkgICAgdWludDMyX3QgZmx1c2hfZG9tYWlucykKLXsKLQlyaW5nLT5mbHVzaChkZXYsIHJpbmcsIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7Ci0JaTkxNV9nZW1fcHJvY2Vzc19mbHVzaGluZ19saXN0KGRldiwgZmx1c2hfZG9tYWlucywgcmluZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pOTE1X2dlbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAotCSAgICAgICB1aW50MzJfdCBmbHVzaF9kb21haW5zLAotCSAgICAgICB1aW50MzJfdCBmbHVzaF9yaW5ncykKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKLQkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7Ci0KLQlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpIHsKLQkJaWYgKGZsdXNoX3JpbmdzICYgUklOR19SRU5ERVIpCi0JCQlpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwgZmlsZV9wcml2LAotCQkJCQkgICAgJmRldl9wcml2LT5yZW5kZXJfcmluZywKLQkJCQkJICAgIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7Ci0JCWlmIChmbHVzaF9yaW5ncyAmIFJJTkdfQlNEKQotCQkJaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIGZpbGVfcHJpdiwKLQkJCQkJICAgICZkZXZfcHJpdi0+YnNkX3JpbmcsCi0JCQkJCSAgICBpbnZhbGlkYXRlX2RvbWFpbnMsIGZsdXNoX2RvbWFpbnMpOwotCQlpZiAoZmx1c2hfcmluZ3MgJiBSSU5HX0JMVCkKLQkJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBmaWxlX3ByaXYsCi0JCQkJCSAgICAmZGV2X3ByaXYtPmJsdF9yaW5nLAotCQkJCQkgICAgaW52YWxpZGF0ZV9kb21haW5zLCBmbHVzaF9kb21haW5zKTsKLQl9Ci19Ci0KIC8qKgogICogRW5zdXJlcyB0aGF0IGFsbCByZW5kZXJpbmcgdG8gdGhlIG9iamVjdCBoYXMgY29tcGxldGVkIGFuZCB0aGUgb2JqZWN0IGlzCiAgKiBzYWZlIHRvIHVuYmluZCBmcm9tIHRoZSBHVFQgb3IgYWNjZXNzIGZyb20gdGhlIENQVS4KICAqLwotc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraW50CitpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgICAgICBib29sIGludGVycnVwdGlibGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJaW50IHJldDsKIAogCS8qIFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgdG8gc3VwcG9ydCB3YWl0aW5nIGZvciBleGlzdGluZyByZW5kZXJpbmcsCiAJICogbm90IGZvciBlbWl0dGluZyByZXF1aXJlZCBmbHVzaGVzLgogCSAqLwotCUJVR19PTigob2JqLT53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgIT0gMCk7CisJQlVHX09OKChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpICE9IDApOwogCiAJLyogSWYgdGhlcmUgaXMgcmVuZGVyaW5nIHF1ZXVlZCBvbiB0aGUgYnVmZmVyIGJlaW5nIGV2aWN0ZWQsIHdhaXQgZm9yCiAJICogaXQuCiAJICovCi0JaWYgKG9ial9wcml2LT5hY3RpdmUpIHsKKwlpZiAob2JqLT5hY3RpdmUpIHsKIAkJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3QoZGV2LAotCQkJCQkgICBvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8sCisJCQkJCSAgIG9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8sCiAJCQkJCSAgIGludGVycnVwdGlibGUsCi0JCQkJCSAgIG9ial9wcml2LT5yaW5nKTsKKwkJCQkJICAgb2JqLT5yaW5nKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMjA5OCwxNyArMjEwNiwxNCBAQAogICogVW5iaW5kcyBhbiBvYmplY3QgZnJvbSB0aGUgR1RUIGFwZXJ0dXJlLgogICovCiBpbnQKLWk5MTVfZ2VtX29iamVjdF91bmJpbmQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfdW5iaW5kKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJaWYgKG9iai0+Z3R0X3NwYWNlID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQgIT0gMCkgeworCWlmIChvYmotPnBpbl9jb3VudCAhPSAwKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byB1bmJpbmQgcGlubmVkIGJ1ZmZlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIxMzEsMjcgKzIxMzYsMjcgQEAKIAkgKi8KIAlpZiAocmV0KSB7CiAJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7Ci0JCW9iai0+cmVhZF9kb21haW5zID0gb2JqLT53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCQlvYmotPmJhc2UucmVhZF9kb21haW5zID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAJfQogCiAJLyogcmVsZWFzZSB0aGUgZmVuY2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KLQlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcob2JqKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CisJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCXJldHVybiByZXQ7CiAKLQlkcm1fdW5iaW5kX2FncChvYmpfcHJpdi0+YWdwX21lbSk7Ci0JZHJtX2ZyZWVfYWdwKG9ial9wcml2LT5hZ3BfbWVtLCBvYmotPnNpemUgLyBQQUdFX1NJWkUpOworCWk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlc19ndHQob2JqKTsKIAotCWk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMob2JqKTsKLQlCVUdfT04ob2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50KTsKKwlsaXN0X2RlbF9pbml0KCZvYmotPmd0dF9saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZvYmotPm1tX2xpc3QpOworCS8qIEF2b2lkIGFuIHVubmVjZXNzYXJ5IGNhbGwgdG8gdW5iaW5kIG9uIHJlYmluZC4gKi8KKwlvYmotPm1hcF9hbmRfZmVuY2VhYmxlID0gdHJ1ZTsKIAotCWk5MTVfZ2VtX2luZm9fcmVtb3ZlX2d0dChkZXZfcHJpdiwgb2JqLT5zaXplKTsKLQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+bW1fbGlzdCk7CisJZHJtX21tX3B1dF9ibG9jayhvYmotPmd0dF9zcGFjZSk7CisJb2JqLT5ndHRfc3BhY2UgPSBOVUxMOworCW9iai0+Z3R0X29mZnNldCA9IDA7CiAKLQlkcm1fbW1fcHV0X2Jsb2NrKG9ial9wcml2LT5ndHRfc3BhY2UpOwotCW9ial9wcml2LT5ndHRfc3BhY2UgPSBOVUxMOwotCW9ial9wcml2LT5ndHRfb2Zmc2V0ID0gMDsKLQotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSkKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmopKQogCQlpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUob2JqKTsKIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKQEAgLTIxNTksMTQgKzIxNjQsMzcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitpbnQKK2k5MTVfZ2VtX2ZsdXNoX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJICAgIHVpbnQzMl90IGludmFsaWRhdGVfZG9tYWlucywKKwkJICAgIHVpbnQzMl90IGZsdXNoX2RvbWFpbnMpCit7CisJaW50IHJldDsKKworCXJldCA9IHJpbmctPmZsdXNoKHJpbmcsIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWk5MTVfZ2VtX3Byb2Nlc3NfZmx1c2hpbmdfbGlzdChkZXYsIGZsdXNoX2RvbWFpbnMsIHJpbmcpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGk5MTVfcmluZ19pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKKwlpbnQgcmV0OworCiAJaWYgKGxpc3RfZW1wdHkoJnJpbmctPmdwdV93cml0ZV9saXN0KSAmJiBsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpCiAJCXJldHVybiAwOwogCi0JaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIE5VTEwsIHJpbmcsCi0JCQkgICAgSTkxNV9HRU1fR1BVX0RPTUFJTlMsIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnJpbmctPmdwdV93cml0ZV9saXN0KSkgeworCQlyZXQgPSBpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwgcmluZywKKwkJCQkgICAgSTkxNV9HRU1fR1BVX0RPTUFJTlMsIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJcmV0dXJuIGk5MTVfd2FpdF9yZXF1ZXN0KGRldiwKIAkJCQkgaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcmluZyksCiAJCQkJIHJpbmcpOwpAQCAtMjE3Nyw3ICsyMjA1LDcgQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlib29sIGxpc3RzX2VtcHR5OwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCWxpc3RzX2VtcHR5ID0gKGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgogCQkgICAgICAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSk7CkBAIC0yMTg1LDI1OCArMjIxMywzMDUgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBGbHVzaCBldmVyeXRoaW5nIG9udG8gdGhlIGluYWN0aXZlIGxpc3QuICovCi0JcmV0ID0gaTkxNV9yaW5nX2lkbGUoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gaTkxNV9yaW5nX2lkbGUoZGV2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gaTkxNV9yaW5nX2lkbGUoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKSB7CisJCXJldCA9IGk5MTVfcmluZ19pZGxlKGRldiwgJmRldl9wcml2LT5yaW5nW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgIGdmcF90IGdmcG1hc2spCitzdGF0aWMgaW50IHNhbmR5YnJpZGdlX3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCBwYWdlX2NvdW50LCBpOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlCVUdfT04ob2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50Ci0JCQk9PSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QQUdFU19SRUZDT1VOVCk7Ci0KLQlpZiAob2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50KysgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBHZXQgdGhlIGxpc3Qgb2YgcGFnZXMgb3V0IG9mIG91ciBzdHJ1Y3QgZmlsZS4gIFRoZXknbGwgYmUgcGlubmVkCi0JICogYXQgdGhpcyBwb2ludCB1bnRpbCB3ZSByZWxlYXNlIHRoZW0uCi0JICovCi0JcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKLQlCVUdfT04ob2JqX3ByaXYtPnBhZ2VzICE9IE5VTEwpOwotCW9ial9wcml2LT5wYWdlcyA9IGRybV9jYWxsb2NfbGFyZ2UocGFnZV9jb3VudCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKLQlpZiAob2JqX3ByaXYtPnBhZ2VzID09IE5VTEwpIHsKLQkJb2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50LS07Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlub2RlID0gb2JqLT5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCW1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKLQkJCQkJICAgR0ZQX0hJR0hVU0VSIHwKLQkJCQkJICAgX19HRlBfQ09MRCB8Ci0JCQkJCSAgIF9fR0ZQX1JFQ0xBSU1BQkxFIHwKLQkJCQkJICAgZ2ZwbWFzayk7Ci0JCWlmIChJU19FUlIocGFnZSkpCi0JCQlnb3RvIGVycl9wYWdlczsKLQotCQlvYmpfcHJpdi0+cGFnZXNbaV0gPSBwYWdlOwotCX0KLQotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKLQkJaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKG9iaik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3BhZ2VzOgotCXdoaWxlIChpLS0pCi0JCXBhZ2VfY2FjaGVfcmVsZWFzZShvYmpfcHJpdi0+cGFnZXNbaV0pOwotCi0JZHJtX2ZyZWVfbGFyZ2Uob2JqX3ByaXYtPnBhZ2VzKTsKLQlvYmpfcHJpdi0+cGFnZXMgPSBOVUxMOwotCW9ial9wcml2LT5wYWdlc19yZWZjb3VudC0tOwotCXJldHVybiBQVFJfRVJSKHBhZ2UpOwotfQotCi1zdGF0aWMgdm9pZCBzYW5keWJyaWRnZV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnKQotewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHJlZ251bSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJdTMyIHNpemUgPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwlpbnQgcmVnbnVtID0gb2JqLT5mZW5jZV9yZWc7CiAJdWludDY0X3QgdmFsOwogCi0JdmFsID0gKHVpbnQ2NF90KSgob2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvYmotPnNpemUgLSA0MDk2KSAmCi0JCSAgICAweGZmZmZmMDAwKSA8PCAzMjsKLQl2YWwgfD0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiAweGZmZmZmMDAwOwotCXZhbCB8PSAodWludDY0X3QpKChvYmpfcHJpdi0+c3RyaWRlIC8gMTI4KSAtIDEpIDw8CisJdmFsID0gKHVpbnQ2NF90KSgob2JqLT5ndHRfb2Zmc2V0ICsgc2l6ZSAtIDQwOTYpICYKKwkJCSAweGZmZmZmMDAwKSA8PCAzMjsKKwl2YWwgfD0gb2JqLT5ndHRfb2Zmc2V0ICYgMHhmZmZmZjAwMDsKKwl2YWwgfD0gKHVpbnQ2NF90KSgob2JqLT5zdHJpZGUgLyAxMjgpIC0gMSkgPDwKIAkJU0FORFlCUklER0VfRkVOQ0VfUElUQ0hfU0hJRlQ7CiAKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCisJaWYgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkKIAkJdmFsIHw9IDEgPDwgSTk2NV9GRU5DRV9USUxJTkdfWV9TSElGVDsKIAl2YWwgfD0gSTk2NV9GRU5DRV9SRUdfVkFMSUQ7CiAKLQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyAocmVnbnVtICogOCksIHZhbCk7CisJaWYgKHBpcGVsaW5lZCkgeworCQlpbnQgcmV0ID0gaW50ZWxfcmluZ19iZWdpbihwaXBlbGluZWQsIDYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBNSV9OT09QKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTE9BRF9SRUdJU1RFUl9JTU0oMikpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIHJlZ251bSo4KTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgKHUzMil2YWwpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIHJlZ251bSo4ICsgNCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsICh1MzIpKHZhbCA+PiAzMikpOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocGlwZWxpbmVkKTsKKwl9IGVsc2UKKwkJSTkxNV9XUklURTY0KEZFTkNFX1JFR19TQU5EWUJSSURHRV8wICsgcmVnbnVtICogOCwgdmFsKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpOTY1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcpCitzdGF0aWMgaW50IGk5NjVfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpCiB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSByZWctPm9iajsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlpbnQgcmVnbnVtID0gb2JqX3ByaXYtPmZlbmNlX3JlZzsKKwl1MzIgc2l6ZSA9IG9iai0+Z3R0X3NwYWNlLT5zaXplOworCWludCByZWdudW0gPSBvYmotPmZlbmNlX3JlZzsKIAl1aW50NjRfdCB2YWw7CiAKLQl2YWwgPSAodWludDY0X3QpKChvYmpfcHJpdi0+Z3R0X29mZnNldCArIG9iai0+c2l6ZSAtIDQwOTYpICYKKwl2YWwgPSAodWludDY0X3QpKChvYmotPmd0dF9vZmZzZXQgKyBzaXplIC0gNDA5NikgJgogCQkgICAgMHhmZmZmZjAwMCkgPDwgMzI7Ci0JdmFsIHw9IG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgMHhmZmZmZjAwMDsKLQl2YWwgfD0gKChvYmpfcHJpdi0+c3RyaWRlIC8gMTI4KSAtIDEpIDw8IEk5NjVfRkVOQ0VfUElUQ0hfU0hJRlQ7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCXZhbCB8PSBvYmotPmd0dF9vZmZzZXQgJiAweGZmZmZmMDAwOworCXZhbCB8PSAoKG9iai0+c3RyaWRlIC8gMTI4KSAtIDEpIDw8IEk5NjVfRkVOQ0VfUElUQ0hfU0hJRlQ7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkKIAkJdmFsIHw9IDEgPDwgSTk2NV9GRU5DRV9USUxJTkdfWV9TSElGVDsKIAl2YWwgfD0gSTk2NV9GRU5DRV9SRUdfVkFMSUQ7CiAKLQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgKHJlZ251bSAqIDgpLCB2YWwpOworCWlmIChwaXBlbGluZWQpIHsKKwkJaW50IHJldCA9IGludGVsX3JpbmdfYmVnaW4ocGlwZWxpbmVkLCA2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTk9PUCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIE1JX0xPQURfUkVHSVNURVJfSU1NKDIpKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgRkVOQ0VfUkVHXzk2NV8wICsgcmVnbnVtKjgpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCAodTMyKXZhbCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIEZFTkNFX1JFR185NjVfMCArIHJlZ251bSo4ICsgNCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsICh1MzIpKHZhbCA+PiAzMikpOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocGlwZWxpbmVkKTsKKwl9IGVsc2UKKwkJSTkxNV9XUklURTY0KEZFTkNFX1JFR185NjVfMCArIHJlZ251bSAqIDgsIHZhbCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaTkxNV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnKQorc3RhdGljIGludCBpOTE1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHJlZ251bSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJdTMyIHNpemUgPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwl1MzIgZmVuY2VfcmVnLCB2YWwsIHBpdGNoX3ZhbDsKIAlpbnQgdGlsZV93aWR0aDsKLQl1aW50MzJfdCBmZW5jZV9yZWcsIHZhbDsKLQl1aW50MzJfdCBwaXRjaF92YWw7CiAKLQlpZiAoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKLQkgICAgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKSkgewotCQlXQVJOKDEsICIlczogb2JqZWN0IDB4JTA4eCBub3QgMU0gb3Igc2l6ZSAoMHglengpIGFsaWduZWRcbiIsCi0JCSAgICAgX19mdW5jX18sIG9ial9wcml2LT5ndHRfb2Zmc2V0LCBvYmotPnNpemUpOwotCQlyZXR1cm47Ci0JfQorCWlmIChXQVJOKChvYmotPmd0dF9vZmZzZXQgJiB+STkxNV9GRU5DRV9TVEFSVF9NQVNLKSB8fAorCQkgKHNpemUgJiAtc2l6ZSkgIT0gc2l6ZSB8fAorCQkgKG9iai0+Z3R0X29mZnNldCAmIChzaXplIC0gMSkpLAorCQkgIm9iamVjdCAweCUwOHggW2ZlbmNlYWJsZT8gJWRdIG5vdCAxTSBvciBwb3Qtc2l6ZSAoMHglMDh4KSBhbGlnbmVkXG4iLAorCQkgb2JqLT5ndHRfb2Zmc2V0LCBvYmotPm1hcF9hbmRfZmVuY2VhYmxlLCBzaXplKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kgJiYKLQkgICAgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGRldikpCisJaWYgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSAmJiBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSkKIAkJdGlsZV93aWR0aCA9IDEyODsKIAllbHNlCiAJCXRpbGVfd2lkdGggPSA1MTI7CiAKIAkvKiBOb3RlOiBwaXRjaCBiZXR0ZXIgYmUgYSBwb3dlciBvZiB0d28gdGlsZSB3aWR0aHMgKi8KLQlwaXRjaF92YWwgPSBvYmpfcHJpdi0+c3RyaWRlIC8gdGlsZV93aWR0aDsKKwlwaXRjaF92YWwgPSBvYmotPnN0cmlkZSAvIHRpbGVfd2lkdGg7CiAJcGl0Y2hfdmFsID0gZmZzKHBpdGNoX3ZhbCkgLSAxOwogCi0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZICYmCi0JICAgIEhBU18xMjhfQllURV9ZX1RJTElORyhkZXYpKQotCQlXQVJOX09OKHBpdGNoX3ZhbCA+IEk4MzBfRkVOQ0VfTUFYX1BJVENIX1ZBTCk7Ci0JZWxzZQotCQlXQVJOX09OKHBpdGNoX3ZhbCA+IEk5MTVfRkVOQ0VfTUFYX1BJVENIX1ZBTCk7Ci0KLQl2YWwgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCisJdmFsID0gb2JqLT5ndHRfb2Zmc2V0OworCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCiAJCXZhbCB8PSAxIDw8IEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQ7Ci0JdmFsIHw9IEk5MTVfRkVOQ0VfU0laRV9CSVRTKG9iai0+c2l6ZSk7CisJdmFsIHw9IEk5MTVfRkVOQ0VfU0laRV9CSVRTKHNpemUpOwogCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9TSElGVDsKIAl2YWwgfD0gSTgzMF9GRU5DRV9SRUdfVkFMSUQ7CiAKLQlpZiAocmVnbnVtIDwgOCkKLQkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzgzMF8wICsgKHJlZ251bSAqIDQpOworCWZlbmNlX3JlZyA9IG9iai0+ZmVuY2VfcmVnOworCWlmIChmZW5jZV9yZWcgPCA4KQorCQlmZW5jZV9yZWcgPSBGRU5DRV9SRUdfODMwXzAgKyBmZW5jZV9yZWcgKiA0OwogCWVsc2UKLQkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzk0NV84ICsgKChyZWdudW0gLSA4KSAqIDQpOwotCUk5MTVfV1JJVEUoZmVuY2VfcmVnLCB2YWwpOworCQlmZW5jZV9yZWcgPSBGRU5DRV9SRUdfOTQ1XzggKyAoZmVuY2VfcmVnIC0gOCkgKiA0OworCisJaWYgKHBpcGVsaW5lZCkgeworCQlpbnQgcmV0ID0gaW50ZWxfcmluZ19iZWdpbihwaXBlbGluZWQsIDQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBNSV9OT09QKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTE9BRF9SRUdJU1RFUl9JTU0oMSkpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBmZW5jZV9yZWcpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCB2YWwpOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocGlwZWxpbmVkKTsKKwl9IGVsc2UKKwkJSTkxNV9XUklURShmZW5jZV9yZWcsIHZhbCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnKQorc3RhdGljIGludCBpODMwX3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHJlZ251bSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJdTMyIHNpemUgPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwlpbnQgcmVnbnVtID0gb2JqLT5mZW5jZV9yZWc7CiAJdWludDMyX3QgdmFsOwogCXVpbnQzMl90IHBpdGNoX3ZhbDsKLQl1aW50MzJfdCBmZW5jZV9zaXplX2JpdHM7CiAKLQlpZiAoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk4MzBfRkVOQ0VfU1RBUlRfTUFTSykgfHwKLQkgICAgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKSkgewotCQlXQVJOKDEsICIlczogb2JqZWN0IDB4JTA4eCBub3QgNTEySyBvciBzaXplIGFsaWduZWRcbiIsCi0JCSAgICAgX19mdW5jX18sIG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoV0FSTigob2JqLT5ndHRfb2Zmc2V0ICYgfkk4MzBfRkVOQ0VfU1RBUlRfTUFTSykgfHwKKwkJIChzaXplICYgLXNpemUpICE9IHNpemUgfHwKKwkJIChvYmotPmd0dF9vZmZzZXQgJiAoc2l6ZSAtIDEpKSwKKwkJICJvYmplY3QgMHglMDh4IG5vdCA1MTJLIG9yIHBvdC1zaXplIDB4JTA4eCBhbGlnbmVkXG4iLAorCQkgb2JqLT5ndHRfb2Zmc2V0LCBzaXplKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwaXRjaF92YWwgPSBvYmpfcHJpdi0+c3RyaWRlIC8gMTI4OworCXBpdGNoX3ZhbCA9IG9iai0+c3RyaWRlIC8gMTI4OwogCXBpdGNoX3ZhbCA9IGZmcyhwaXRjaF92YWwpIC0gMTsKLQlXQVJOX09OKHBpdGNoX3ZhbCA+IEk4MzBfRkVOQ0VfTUFYX1BJVENIX1ZBTCk7CiAKLQl2YWwgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCisJdmFsID0gb2JqLT5ndHRfb2Zmc2V0OworCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCiAJCXZhbCB8PSAxIDw8IEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQ7Ci0JZmVuY2Vfc2l6ZV9iaXRzID0gSTgzMF9GRU5DRV9TSVpFX0JJVFMob2JqLT5zaXplKTsKLQlXQVJOX09OKGZlbmNlX3NpemVfYml0cyAmIH4weDAwMDAwZjAwKTsKLQl2YWwgfD0gZmVuY2Vfc2l6ZV9iaXRzOworCXZhbCB8PSBJODMwX0ZFTkNFX1NJWkVfQklUUyhzaXplKTsKIAl2YWwgfD0gcGl0Y2hfdmFsIDw8IEk4MzBfRkVOQ0VfUElUQ0hfU0hJRlQ7CiAJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwogCi0JSTkxNV9XUklURShGRU5DRV9SRUdfODMwXzAgKyAocmVnbnVtICogNCksIHZhbCk7CisJaWYgKHBpcGVsaW5lZCkgeworCQlpbnQgcmV0ID0gaW50ZWxfcmluZ19iZWdpbihwaXBlbGluZWQsIDQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBNSV9OT09QKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTE9BRF9SRUdJU1RFUl9JTU0oMSkpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBGRU5DRV9SRUdfODMwXzAgKyByZWdudW0qNCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIHZhbCk7CisJCWludGVsX3JpbmdfYWR2YW5jZShwaXBlbGluZWQpOworCX0gZWxzZQorCQlJOTE1X1dSSVRFKEZFTkNFX1JFR184MzBfMCArIHJlZ251bSAqIDQsIHZhbCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2ZpbmRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQorc3RhdGljIGJvb2wgcmluZ19wYXNzZWRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgc2Vxbm8pCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0gTlVMTDsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSBOVUxMOworCXJldHVybiBpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksIHNlcW5vKTsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQsCisJCQkgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQoreworCWludCByZXQ7CisKKwlpZiAob2JqLT5mZW5jZWRfZ3B1X2FjY2VzcykgeworCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSB7CisJCQlyZXQgPSBpOTE1X2dlbV9mbHVzaF9yaW5nKG9iai0+YmFzZS5kZXYsCisJCQkJCQkgIG9iai0+bGFzdF9mZW5jZWRfcmluZywKKwkJCQkJCSAgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlvYmotPmZlbmNlZF9ncHVfYWNjZXNzID0gZmFsc2U7CisJfQorCisJaWYgKG9iai0+bGFzdF9mZW5jZWRfc2Vxbm8gJiYgcGlwZWxpbmVkICE9IG9iai0+bGFzdF9mZW5jZWRfcmluZykgeworCQlpZiAoIXJpbmdfcGFzc2VkX3NlcW5vKG9iai0+bGFzdF9mZW5jZWRfcmluZywKKwkJCQkgICAgICAgb2JqLT5sYXN0X2ZlbmNlZF9zZXFubykpIHsKKwkJCXJldCA9IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KG9iai0+YmFzZS5kZXYsCisJCQkJCQkgICBvYmotPmxhc3RfZmVuY2VkX3NlcW5vLAorCQkJCQkJICAgaW50ZXJydXB0aWJsZSwKKwkJCQkJCSAgIG9iai0+bGFzdF9mZW5jZWRfcmluZyk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlvYmotPmxhc3RfZmVuY2VkX3NlcW5vID0gMDsKKwkJb2JqLT5sYXN0X2ZlbmNlZF9yaW5nID0gTlVMTDsKKwl9CisKKwkvKiBFbnN1cmUgdGhhdCBhbGwgQ1BVIHJlYWRzIGFyZSBjb21wbGV0ZWQgYmVmb3JlIGluc3RhbGxpbmcgYSBmZW5jZQorCSAqIGFuZCBhbGwgd3JpdGVzIGJlZm9yZSByZW1vdmluZyB0aGUgZmVuY2UuCisJICovCisJaWYgKG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fR1RUKQorCQltYigpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCWludCByZXQ7CisKKwlpZiAob2JqLT50aWxpbmdfbW9kZSkKKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZmVuY2Uob2JqLCBOVUxMLCB0cnVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG9iai0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKKwkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gb2JqLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CisJCWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhvYmotPmJhc2UuZGV2LAorCQkJCQkgJmRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXSk7CisKKwkJb2JqLT5mZW5jZV9yZWcgPSBJOTE1X0ZFTkNFX1JFR19OT05FOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqCitpOTE1X2ZpbmRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKK3sKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gTlVMTDsKLQlpbnQgaSwgYXZhaWwsIHJldDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcsICpmaXJzdCwgKmF2YWlsOworCWludCBpOwogCiAJLyogRmlyc3QgdHJ5IHRvIGZpbmQgYSBmcmVlIHJlZyAqLwotCWF2YWlsID0gMDsKKwlhdmFpbCA9IE5VTEw7CiAJZm9yIChpID0gZGV2X3ByaXYtPmZlbmNlX3JlZ19zdGFydDsgaSA8IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKSB7CiAJCXJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tpXTsKIAkJaWYgKCFyZWctPm9iaikKLQkJCXJldHVybiBpOworCQkJcmV0dXJuIHJlZzsKIAotCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKHJlZy0+b2JqKTsKLQkJaWYgKCFvYmpfcHJpdi0+cGluX2NvdW50KQotCQkgICAgYXZhaWwrKzsKKwkJaWYgKCFyZWctPm9iai0+cGluX2NvdW50KQorCQkJYXZhaWwgPSByZWc7CiAJfQogCi0JaWYgKGF2YWlsID09IDApCi0JCXJldHVybiAtRU5PU1BDOworCWlmIChhdmFpbCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAogCS8qIE5vbmUgYXZhaWxhYmxlLCB0cnkgdG8gc3RlYWwgb25lIG9yIHdhaXQgZm9yIGEgdXNlciB0byBmaW5pc2ggKi8KLQlpID0gSTkxNV9GRU5DRV9SRUdfTk9ORTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZywgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0LAotCQkJICAgIGxydV9saXN0KSB7Ci0JCW9iaiA9IHJlZy0+b2JqOwotCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KLQkJaWYgKG9ial9wcml2LT5waW5fY291bnQpCisJYXZhaWwgPSBmaXJzdCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWcsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCwgbHJ1X2xpc3QpIHsKKwkJaWYgKHJlZy0+b2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAotCQkvKiBmb3VuZCBvbmUhICovCi0JCWkgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOwotCQlicmVhazsKKwkJaWYgKGZpcnN0ID09IE5VTEwpCisJCQlmaXJzdCA9IHJlZzsKKworCQlpZiAoIXBpcGVsaW5lZCB8fAorCQkgICAgIXJlZy0+b2JqLT5sYXN0X2ZlbmNlZF9yaW5nIHx8CisJCSAgICByZWctPm9iai0+bGFzdF9mZW5jZWRfcmluZyA9PSBwaXBlbGluZWQpIHsKKwkJCWF2YWlsID0gcmVnOworCQkJYnJlYWs7CisJCX0KIAl9CiAKLQlCVUdfT04oaSA9PSBJOTE1X0ZFTkNFX1JFR19OT05FKTsKKwlpZiAoYXZhaWwgPT0gTlVMTCkKKwkJYXZhaWwgPSBmaXJzdDsKIAotCS8qIFdlIG9ubHkgaGF2ZSBhIHJlZmVyZW5jZSBvbiBvYmogZnJvbSB0aGUgYWN0aXZlIGxpc3QuIHB1dF9mZW5jZV9yZWcKLQkgKiBtaWdodCBkcm9wIHRoYXQgb25lLCBjYXVzaW5nIGEgdXNlLWFmdGVyLWZyZWUgaW4gaXQuIFNvIGhvbGQgYQotCSAqIHByaXZhdGUgcmVmZXJlbmNlIHRvIG9iaiBsaWtlIHRoZSBvdGhlciBjYWxsZXJzIG9mIHB1dF9mZW5jZV9yZWcKLQkgKiAoc2V0X3RpbGluZyBpb2N0bCkgZG8uICovCi0JZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7Ci0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZV9yZWcob2JqLCBpbnRlcnJ1cHRpYmxlKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBpOworCXJldHVybiBhdmFpbDsKIH0KIAogLyoqCi0gKiBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlX3JlZyAtIHNldCB1cCBhIGZlbmNlIHJlZyBmb3IgYW4gb2JqZWN0CisgKiBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlIC0gc2V0IHVwIGEgZmVuY2UgcmVnIGZvciBhbiBvYmplY3QKICAqIEBvYmo6IG9iamVjdCB0byBtYXAgdGhyb3VnaCBhIGZlbmNlIHJlZworICogQHBpcGVsaW5lZDogcmluZyBvbiB3aGljaCB0byBxdWV1ZSB0aGUgY2hhbmdlLCBvciBOVUxMIGZvciBDUFUgYWNjZXNzCisgKiBAaW50ZXJydXB0aWJsZTogbXVzdCB3ZSB3YWl0IHVuaW50ZXJydXB0aWJseSBmb3IgdGhlIHJlZ2lzdGVyIHRvIHJldGlyZT8KICAqCiAgKiBXaGVuIG1hcHBpbmcgb2JqZWN0cyB0aHJvdWdoIHRoZSBHVFQsIHVzZXJzcGFjZSB3YW50cyB0byBiZSBhYmxlIHRvIHdyaXRlCiAgKiB0byB0aGVtIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHN3aXp6bGluZyBpZiB0aGUgb2JqZWN0IGlzIHRpbGVkLgpAQCAtMjQ0OCw3MiArMjUyMywxNDEgQEAKICAqIGFuZCB0aWxpbmcgZm9ybWF0LgogICovCiBpbnQKLWk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQoraTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCwKKwkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWc7CiAJaW50IHJldDsKIAotCS8qIEp1c3QgdXBkYXRlIG91ciBwbGFjZSBpbiB0aGUgTFJVIGlmIG91ciBmZW5jZSBpcyBnZXR0aW5nIHVzZWQuICovCi0JaWYgKG9ial9wcml2LT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkgewotCQlyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqX3ByaXYtPmZlbmNlX3JlZ107CisJLyogWFhYIGRpc2FibGUgcGlwZWxpbmluZy4gVGhlcmUgYXJlIGJ1Z3MuIFNob2NraW5nLiAqLworCXBpcGVsaW5lZCA9IE5VTEw7CisKKwkvKiBKdXN0IHVwZGF0ZSBvdXIgcGxhY2UgaW4gdGhlIExSVSBpZiBvdXIgZmVuY2UgaXMgZ2V0dGluZyByZXVzZWQuICovCisJaWYgKG9iai0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKKwkJcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXTsKIAkJbGlzdF9tb3ZlX3RhaWwoJnJlZy0+bHJ1X2xpc3QsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CisKKwkJaWYgKCFvYmotPmZlbmNlZF9ncHVfYWNjZXNzICYmICFvYmotPmxhc3RfZmVuY2VkX3NlcW5vKQorCQkJcGlwZWxpbmVkID0gTlVMTDsKKworCQlpZiAoIXBpcGVsaW5lZCkgeworCQkJaWYgKHJlZy0+c2V0dXBfc2Vxbm8pIHsKKwkJCQlpZiAoIXJpbmdfcGFzc2VkX3NlcW5vKG9iai0+bGFzdF9mZW5jZWRfcmluZywKKwkJCQkJCSAgICAgICByZWctPnNldHVwX3NlcW5vKSkgeworCQkJCQlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChvYmotPmJhc2UuZGV2LAorCQkJCQkJCQkgICByZWctPnNldHVwX3NlcW5vLAorCQkJCQkJCQkgICBpbnRlcnJ1cHRpYmxlLAorCQkJCQkJCQkgICBvYmotPmxhc3RfZmVuY2VkX3JpbmcpOworCQkJCQlpZiAocmV0KQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisKKwkJCQlyZWctPnNldHVwX3NlcW5vID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChvYmotPmxhc3RfZmVuY2VkX3JpbmcgJiYKKwkJCSAgIG9iai0+bGFzdF9mZW5jZWRfcmluZyAhPSBwaXBlbGluZWQpIHsKKwkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9mZW5jZShvYmosCisJCQkJCQkJICBwaXBlbGluZWQsCisJCQkJCQkJICBpbnRlcnJ1cHRpYmxlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChvYmotPnRpbGluZ19jaGFuZ2VkKSB7CisJCQlpZiAob2JqLT5mZW5jZWRfZ3B1X2FjY2VzcykgeworCQkJCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpIHsKKwkJCQkJcmV0ID0gaTkxNV9nZW1fZmx1c2hfcmluZyhvYmotPmJhc2UuZGV2LCBvYmotPnJpbmcsCisJCQkJCQkJCSAgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CisJCQkJCWlmIChyZXQpCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKworCQkJCW9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWlmICghb2JqLT5mZW5jZWRfZ3B1X2FjY2VzcyAmJiAhb2JqLT5sYXN0X2ZlbmNlZF9zZXFubykKKwkJCXBpcGVsaW5lZCA9IE5VTEw7CisJCUJVR19PTighcGlwZWxpbmVkICYmIHJlZy0+c2V0dXBfc2Vxbm8pOworCisJCWlmIChvYmotPnRpbGluZ19jaGFuZ2VkKSB7CisJCQlpZiAocGlwZWxpbmVkKSB7CisJCQkJcmVnLT5zZXR1cF9zZXFubyA9CisJCQkJCWk5MTVfZ2VtX25leHRfcmVxdWVzdF9zZXFubyhkZXYsIHBpcGVsaW5lZCk7CisJCQkJb2JqLT5sYXN0X2ZlbmNlZF9zZXFubyA9IHJlZy0+c2V0dXBfc2Vxbm87CisJCQkJb2JqLT5sYXN0X2ZlbmNlZF9yaW5nID0gcGlwZWxpbmVkOworCQkJfQorCQkJZ290byB1cGRhdGU7CisJCX0KKwogCQlyZXR1cm4gMDsKIAl9CiAKLQlzd2l0Y2ggKG9ial9wcml2LT50aWxpbmdfbW9kZSkgewotCWNhc2UgSTkxNV9USUxJTkdfTk9ORToKLQkJV0FSTigxLCAiYWxsb2NhdGluZyBhIGZlbmNlIGZvciBub24tdGlsZWQgb2JqZWN0P1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9USUxJTkdfWDoKLQkJaWYgKCFvYmpfcHJpdi0+c3RyaWRlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCVdBUk4oKG9ial9wcml2LT5zdHJpZGUgJiAoNTEyIC0gMSkpLAotCQkgICAgICJvYmplY3QgMHglMDh4IGlzIFggdGlsZWQgYnV0IGhhcyBub24tNTEyQiBwaXRjaFxuIiwKLQkJICAgICBvYmpfcHJpdi0+Z3R0X29mZnNldCk7Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9USUxJTkdfWToKLQkJaWYgKCFvYmpfcHJpdi0+c3RyaWRlKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCVdBUk4oKG9ial9wcml2LT5zdHJpZGUgJiAoMTI4IC0gMSkpLAotCQkgICAgICJvYmplY3QgMHglMDh4IGlzIFkgdGlsZWQgYnV0IGhhcyBub24tMTI4QiBwaXRjaFxuIiwKLQkJICAgICBvYmpfcHJpdi0+Z3R0X29mZnNldCk7Ci0JCWJyZWFrOwotCX0KKwlyZWcgPSBpOTE1X2ZpbmRfZmVuY2VfcmVnKGRldiwgcGlwZWxpbmVkKTsKKwlpZiAocmVnID09IE5VTEwpCisJCXJldHVybiAtRU5PU1BDOwogCi0JcmV0ID0gaTkxNV9maW5kX2ZlbmNlX3JlZyhkZXYsIGludGVycnVwdGlibGUpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9mZW5jZShvYmosIHBpcGVsaW5lZCwgaW50ZXJydXB0aWJsZSk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9ial9wcml2LT5mZW5jZV9yZWcgPSByZXQ7Ci0JcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddOwotCWxpc3RfYWRkX3RhaWwoJnJlZy0+bHJ1X2xpc3QsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CisJaWYgKHJlZy0+b2JqKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvbGQgPSByZWctPm9iajsKKworCQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJm9sZC0+YmFzZSk7CisKKwkJaWYgKG9sZC0+dGlsaW5nX21vZGUpCisJCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2xkKTsKKworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZmVuY2Uob2xkLAorCQkJCQkJICBwaXBlbGluZWQsCisJCQkJCQkgIGludGVycnVwdGlibGUpOworCQlpZiAocmV0KSB7CisJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2xkLT5iYXNlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAob2xkLT5sYXN0X2ZlbmNlZF9zZXFubyA9PSAwICYmIG9iai0+bGFzdF9mZW5jZWRfc2Vxbm8gPT0gMCkKKwkJCXBpcGVsaW5lZCA9IE5VTEw7CisKKwkJb2xkLT5mZW5jZV9yZWcgPSBJOTE1X0ZFTkNFX1JFR19OT05FOworCQlvbGQtPmxhc3RfZmVuY2VkX3JpbmcgPSBwaXBlbGluZWQ7CisJCW9sZC0+bGFzdF9mZW5jZWRfc2Vxbm8gPQorCQkJcGlwZWxpbmVkID8gaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcGlwZWxpbmVkKSA6IDA7CisKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9sZC0+YmFzZSk7CisJfSBlbHNlIGlmIChvYmotPmxhc3RfZmVuY2VkX3NlcW5vID09IDApCisJCXBpcGVsaW5lZCA9IE5VTEw7CiAKIAlyZWctPm9iaiA9IG9iajsKKwlsaXN0X21vdmVfdGFpbCgmcmVnLT5scnVfbGlzdCwgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0KTsKKwlvYmotPmZlbmNlX3JlZyA9IHJlZyAtIGRldl9wcml2LT5mZW5jZV9yZWdzOworCW9iai0+bGFzdF9mZW5jZWRfcmluZyA9IHBpcGVsaW5lZDsKIAorCXJlZy0+c2V0dXBfc2Vxbm8gPQorCQlwaXBlbGluZWQgPyBpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCBwaXBlbGluZWQpIDogMDsKKwlvYmotPmxhc3RfZmVuY2VkX3NlcW5vID0gcmVnLT5zZXR1cF9zZXFubzsKKwordXBkYXRlOgorCW9iai0+dGlsaW5nX2NoYW5nZWQgPSBmYWxzZTsKIAlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CiAJY2FzZSA2OgotCQlzYW5keWJyaWRnZV93cml0ZV9mZW5jZV9yZWcocmVnKTsKKwkJcmV0ID0gc2FuZHlicmlkZ2Vfd3JpdGVfZmVuY2VfcmVnKG9iaiwgcGlwZWxpbmVkKTsKIAkJYnJlYWs7CiAJY2FzZSA1OgogCWNhc2UgNDoKLQkJaTk2NV93cml0ZV9mZW5jZV9yZWcocmVnKTsKKwkJcmV0ID0gaTk2NV93cml0ZV9mZW5jZV9yZWcob2JqLCBwaXBlbGluZWQpOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWk5MTVfd3JpdGVfZmVuY2VfcmVnKHJlZyk7CisJCXJldCA9IGk5MTVfd3JpdGVfZmVuY2VfcmVnKG9iaiwgcGlwZWxpbmVkKTsKIAkJYnJlYWs7CiAJY2FzZSAyOgotCQlpODMwX3dyaXRlX2ZlbmNlX3JlZyhyZWcpOworCQlyZXQgPSBpODMwX3dyaXRlX2ZlbmNlX3JlZyhvYmosIHBpcGVsaW5lZCk7CiAJCWJyZWFrOwogCX0KIAotCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2Uob2JqLCBvYmpfcHJpdi0+ZmVuY2VfcmVnLAotCQkJb2JqX3ByaXYtPnRpbGluZ19tb2RlKTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtMjUyMSwxNTQgKzI2NjUsMTI1IEBACiAgKiBAb2JqOiBvYmplY3QgdG8gY2xlYXIKICAqCiAgKiBaZXJvZXMgb3V0IHRoZSBmZW5jZSByZWdpc3RlciBpdHNlbGYgYW5kIGNsZWFycyBvdXQgdGhlIGFzc29jaWF0ZWQKLSAqIGRhdGEgc3RydWN0dXJlcyBpbiBkZXZfcHJpdiBhbmQgb2JqX3ByaXYuCisgKiBkYXRhIHN0cnVjdHVyZXMgaW4gZGV2X3ByaXYgYW5kIG9iai4KICAqLwogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZykKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcgPQotCQkmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqX3ByaXYtPmZlbmNlX3JlZ107Ci0JdWludDMyX3QgZmVuY2VfcmVnOworCXVpbnQzMl90IGZlbmNlX3JlZyA9IHJlZyAtIGRldl9wcml2LT5mZW5jZV9yZWdzOwogCiAJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewogCWNhc2UgNjoKLQkJSTkxNV9XUklURTY0KEZFTkNFX1JFR19TQU5EWUJSSURHRV8wICsKLQkJCSAgICAgKG9ial9wcml2LT5mZW5jZV9yZWcgKiA4KSwgMCk7CisJCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIGZlbmNlX3JlZyo4LCAwKTsKIAkJYnJlYWs7CiAJY2FzZSA1OgogCWNhc2UgNDoKLQkJSTkxNV9XUklURTY0KEZFTkNFX1JFR185NjVfMCArIChvYmpfcHJpdi0+ZmVuY2VfcmVnICogOCksIDApOworCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgZmVuY2VfcmVnKjgsIDApOwogCQlicmVhazsKIAljYXNlIDM6Ci0JCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnID49IDgpCi0JCQlmZW5jZV9yZWcgPSBGRU5DRV9SRUdfOTQ1XzggKyAob2JqX3ByaXYtPmZlbmNlX3JlZyAtIDgpICogNDsKKwkJaWYgKGZlbmNlX3JlZyA+PSA4KQorCQkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzk0NV84ICsgKGZlbmNlX3JlZyAtIDgpICogNDsKIAkJZWxzZQogCWNhc2UgMjoKLQkJCWZlbmNlX3JlZyA9IEZFTkNFX1JFR184MzBfMCArIG9ial9wcml2LT5mZW5jZV9yZWcgKiA0OworCQkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzgzMF8wICsgZmVuY2VfcmVnICogNDsKIAogCQlJOTE1X1dSSVRFKGZlbmNlX3JlZywgMCk7CiAJCWJyZWFrOwogCX0KIAotCXJlZy0+b2JqID0gTlVMTDsKLQlvYmpfcHJpdi0+ZmVuY2VfcmVnID0gSTkxNV9GRU5DRV9SRUdfTk9ORTsKIAlsaXN0X2RlbF9pbml0KCZyZWctPmxydV9saXN0KTsKLX0KLQotLyoqCi0gKiBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlX3JlZyAtIHdhaXRzIG9uIG91dHN0YW5kaW5nIGZlbmNlZCBhY2Nlc3MKLSAqIHRvIHRoZSBidWZmZXIgdG8gZmluaXNoLCBhbmQgdGhlbiByZXNldHMgdGhlIGZlbmNlIHJlZ2lzdGVyLgotICogQG9iajogdGlsZWQgb2JqZWN0IGhvbGRpbmcgYSBmZW5jZSByZWdpc3Rlci4KLSAqIEBib29sOiB3aGV0aGVyIHRoZSB3YWl0IHVwb24gdGhlIGZlbmNlIGlzIGludGVycnVwdGlibGUKLSAqCi0gKiBaZXJvZXMgb3V0IHRoZSBmZW5jZSByZWdpc3RlciBpdHNlbGYgYW5kIGNsZWFycyBvdXQgdGhlIGFzc29jaWF0ZWQKLSAqIGRhdGEgc3RydWN0dXJlcyBpbiBkZXZfcHJpdiBhbmQgb2JqX3ByaXYuCi0gKi8KLWludAotaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICAgICBib29sIGludGVycnVwdGlibGUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWc7Ci0KLQlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyA9PSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQlyZXR1cm4gMDsKLQotCS8qIElmIHdlJ3ZlIGNoYW5nZWQgdGlsaW5nLCBHVFQtbWFwcGluZ3Mgb2YgdGhlIG9iamVjdAotCSAqIG5lZWQgdG8gcmUtZmF1bHQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgZmVuY2UgcmVnaXN0ZXIKLQkgKiBzZXR1cCBpcyBpbiBwbGFjZS4KLQkgKi8KLQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKLQotCS8qIE9uIHRoZSBpOTE1LCBHUFUgYWNjZXNzIHRvIHRpbGVkIGJ1ZmZlcnMgaXMgdmlhIGEgZmVuY2UsCi0JICogdGhlcmVmb3JlIHdlIG11c3Qgd2FpdCBmb3IgYW55IG91dHN0YW5kaW5nIGFjY2VzcyB0byBjb21wbGV0ZQotCSAqIGJlZm9yZSBjbGVhcmluZyB0aGUgZmVuY2UuCi0JICovCi0JcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddOwotCWlmIChyZWctPmdwdSkgewotCQlpbnQgcmV0OwotCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhvYmosIGludGVycnVwdGlibGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlyZWctPmdwdSA9IGZhbHNlOwotCX0KLQotCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKG9iaik7Ci0JaTkxNV9nZW1fY2xlYXJfZmVuY2VfcmVnKG9iaik7Ci0KLQlyZXR1cm4gMDsKKwlyZWctPm9iaiA9IE5VTEw7CisJcmVnLT5zZXR1cF9zZXFubyA9IDA7CiB9CiAKIC8qKgogICogRmluZHMgZnJlZSBzcGFjZSBpbiB0aGUgR1RUIGFwZXJ0dXJlIGFuZCBiaW5kcyB0aGUgb2JqZWN0IHRoZXJlLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGFsaWdubWVudCkKK2k5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgIHVuc2lnbmVkIGFsaWdubWVudCwKKwkJCSAgICBib29sIG1hcF9hbmRfZmVuY2VhYmxlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqZnJlZV9zcGFjZTsKLQlnZnBfdCBnZnBtYXNrID0gIF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT1dBUk47CisJZ2ZwX3QgZ2ZwbWFzayA9IF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT1dBUk47CisJdTMyIHNpemUsIGZlbmNlX3NpemUsIGZlbmNlX2FsaWdubWVudCwgdW5mZW5jZWRfYWxpZ25tZW50OworCWJvb2wgbWFwcGFibGUsIGZlbmNlYWJsZTsKIAlpbnQgcmV0OwogCi0JaWYgKG9ial9wcml2LT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgeworCWlmIChvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byBiaW5kIGEgcHVyZ2VhYmxlIG9iamVjdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWZlbmNlX3NpemUgPSBpOTE1X2dlbV9nZXRfZ3R0X3NpemUob2JqKTsKKwlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopOworCXVuZmVuY2VkX2FsaWdubWVudCA9IGk5MTVfZ2VtX2dldF91bmZlbmNlZF9ndHRfYWxpZ25tZW50KG9iaik7CisKIAlpZiAoYWxpZ25tZW50ID09IDApCi0JCWFsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KG9iaik7Ci0JaWYgKGFsaWdubWVudCAmIChpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopIC0gMSkpIHsKKwkJYWxpZ25tZW50ID0gbWFwX2FuZF9mZW5jZWFibGUgPyBmZW5jZV9hbGlnbm1lbnQgOgorCQkJCQkJdW5mZW5jZWRfYWxpZ25tZW50OworCWlmIChtYXBfYW5kX2ZlbmNlYWJsZSAmJiBhbGlnbm1lbnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpIHsKIAkJRFJNX0VSUk9SKCJJbnZhbGlkIG9iamVjdCBhbGlnbm1lbnQgcmVxdWVzdGVkICV1XG4iLCBhbGlnbm1lbnQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlzaXplID0gbWFwX2FuZF9mZW5jZWFibGUgPyBmZW5jZV9zaXplIDogb2JqLT5iYXNlLnNpemU7CisKIAkvKiBJZiB0aGUgb2JqZWN0IGlzIGJpZ2dlciB0aGFuIHRoZSBlbnRpcmUgYXBlcnR1cmUsIHJlamVjdCBpdCBlYXJseQogCSAqIGJlZm9yZSBldmljdGluZyBldmVyeXRoaW5nIGluIGEgdmFpbiBhdHRlbXB0IHRvIGZpbmQgc3BhY2UuCiAJICovCi0JaWYgKG9iai0+c2l6ZSA+IGRldl9wcml2LT5tbS5ndHRfdG90YWwpIHsKKwlpZiAob2JqLT5iYXNlLnNpemUgPgorCSAgICAobWFwX2FuZF9mZW5jZWFibGUgPyBkZXZfcHJpdi0+bW0uZ3R0X21hcHBhYmxlX2VuZCA6IGRldl9wcml2LT5tbS5ndHRfdG90YWwpKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byBiaW5kIGFuIG9iamVjdCBsYXJnZXIgdGhhbiB0aGUgYXBlcnR1cmVcbiIpOwogCQlyZXR1cm4gLUUyQklHOwogCX0KIAogIHNlYXJjaF9mcmVlOgotCWZyZWVfc3BhY2UgPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsCi0JCQkJCW9iai0+c2l6ZSwgYWxpZ25tZW50LCAwKTsKLQlpZiAoZnJlZV9zcGFjZSAhPSBOVUxMKQotCQlvYmpfcHJpdi0+Z3R0X3NwYWNlID0gZHJtX21tX2dldF9ibG9jayhmcmVlX3NwYWNlLCBvYmotPnNpemUsCi0JCQkJCQkgICAgICAgYWxpZ25tZW50KTsKLQlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKSB7CisJaWYgKG1hcF9hbmRfZmVuY2VhYmxlKQorCQlmcmVlX3NwYWNlID0KKwkJCWRybV9tbV9zZWFyY2hfZnJlZV9pbl9yYW5nZSgmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwKKwkJCQkJCSAgICBzaXplLCBhbGlnbm1lbnQsIDAsCisJCQkJCQkgICAgZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQsCisJCQkJCQkgICAgMCk7CisJZWxzZQorCQlmcmVlX3NwYWNlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAorCQkJCQkJc2l6ZSwgYWxpZ25tZW50LCAwKTsKKworCWlmIChmcmVlX3NwYWNlICE9IE5VTEwpIHsKKwkJaWYgKG1hcF9hbmRfZmVuY2VhYmxlKQorCQkJb2JqLT5ndHRfc3BhY2UgPQorCQkJCWRybV9tbV9nZXRfYmxvY2tfcmFuZ2VfZ2VuZXJpYyhmcmVlX3NwYWNlLAorCQkJCQkJCSAgICAgICBzaXplLCBhbGlnbm1lbnQsIDAsCisJCQkJCQkJICAgICAgIGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kLAorCQkJCQkJCSAgICAgICAwKTsKKwkJZWxzZQorCQkJb2JqLT5ndHRfc3BhY2UgPQorCQkJCWRybV9tbV9nZXRfYmxvY2soZnJlZV9zcGFjZSwgc2l6ZSwgYWxpZ25tZW50KTsKKwl9CisJaWYgKG9iai0+Z3R0X3NwYWNlID09IE5VTEwpIHsKIAkJLyogSWYgdGhlIGd0dCBpcyBlbXB0eSBhbmQgd2UncmUgc3RpbGwgaGF2aW5nIHRyb3VibGUKIAkJICogZml0dGluZyBvdXIgb2JqZWN0IGluLCB3ZSdyZSBvdXQgb2YgbWVtb3J5LgogCQkgKi8KLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplLCBhbGlnbm1lbnQpOworCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoZGV2LCBzaXplLCBhbGlnbm1lbnQsCisJCQkJCSAgICAgICBtYXBfYW5kX2ZlbmNlYWJsZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCiAJCWdvdG8gc2VhcmNoX2ZyZWU7CiAJfQogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmosIGdmcG1hc2spOworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXNfZ3R0KG9iaiwgZ2ZwbWFzayk7CiAJaWYgKHJldCkgewotCQlkcm1fbW1fcHV0X2Jsb2NrKG9ial9wcml2LT5ndHRfc3BhY2UpOwotCQlvYmpfcHJpdi0+Z3R0X3NwYWNlID0gTlVMTDsKKwkJZHJtX21tX3B1dF9ibG9jayhvYmotPmd0dF9zcGFjZSk7CisJCW9iai0+Z3R0X3NwYWNlID0gTlVMTDsKIAogCQlpZiAocmV0ID09IC1FTk9NRU0pIHsKLQkJCS8qIGZpcnN0IHRyeSB0byBjbGVhciB1cCBzb21lIHNwYWNlIGZyb20gdGhlIEdUVCAqLwotCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplLAotCQkJCQkJICAgICAgIGFsaWdubWVudCk7CisJCQkvKiBmaXJzdCB0cnkgdG8gcmVjbGFpbSBzb21lIG1lbW9yeSBieSBjbGVhcmluZyB0aGUgR1RUICovCisJCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKGRldiwgZmFsc2UpOwogCQkJaWYgKHJldCkgewogCQkJCS8qIG5vdyB0cnkgdG8gc2hyaW5rIGV2ZXJ5b25lIGVsc2UgKi8KIAkJCQlpZiAoZ2ZwbWFzaykgewpAQCAtMjY3Niw3ICsyNzkxLDcgQEAKIAkJCQkJZ290byBzZWFyY2hfZnJlZTsKIAkJCQl9CiAKLQkJCQlyZXR1cm4gcmV0OworCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQogCiAJCQlnb3RvIHNlYXJjaF9mcmVlOwpAQCAtMjY4NSwxMjIgKzI4MDAsMTE2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogQ3JlYXRlIGFuIEFHUCBtZW1vcnkgc3RydWN0dXJlIHBvaW50aW5nIGF0IG91ciBwYWdlcywgYW5kIGJpbmQgaXQKLQkgKiBpbnRvIHRoZSBHVFQuCi0JICovCi0Jb2JqX3ByaXYtPmFncF9tZW0gPSBkcm1fYWdwX2JpbmRfcGFnZXMoZGV2LAotCQkJCQkgICAgICAgb2JqX3ByaXYtPnBhZ2VzLAotCQkJCQkgICAgICAgb2JqLT5zaXplID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgICAgICBvYmpfcHJpdi0+Z3R0X3NwYWNlLT5zdGFydCwKLQkJCQkJICAgICAgIG9ial9wcml2LT5hZ3BfdHlwZSk7Ci0JaWYgKG9ial9wcml2LT5hZ3BfbWVtID09IE5VTEwpIHsKLQkJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwotCQlkcm1fbW1fcHV0X2Jsb2NrKG9ial9wcml2LT5ndHRfc3BhY2UpOwotCQlvYmpfcHJpdi0+Z3R0X3NwYWNlID0gTlVMTDsKKwlyZXQgPSBpOTE1X2dlbV9ndHRfYmluZF9vYmplY3Qob2JqKTsKKwlpZiAocmV0KSB7CisJCWk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXNfZ3R0KG9iaik7CisJCWRybV9tbV9wdXRfYmxvY2sob2JqLT5ndHRfc3BhY2UpOworCQlvYmotPmd0dF9zcGFjZSA9IE5VTEw7CiAKLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplLCBhbGlnbm1lbnQpOwotCQlpZiAocmV0KQorCQlpZiAoaTkxNV9nZW1fZXZpY3RfZXZlcnl0aGluZyhkZXYsIGZhbHNlKSkKIAkJCXJldHVybiByZXQ7CiAKIAkJZ290byBzZWFyY2hfZnJlZTsKIAl9CiAKLQkvKiBrZWVwIHRyYWNrIG9mIGJvdW5kcyBvYmplY3QgYnkgYWRkaW5nIGl0IHRvIHRoZSBpbmFjdGl2ZSBsaXN0ICovCi0JbGlzdF9hZGRfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7Ci0JaTkxNV9nZW1faW5mb19hZGRfZ3R0KGRldl9wcml2LCBvYmotPnNpemUpOworCWxpc3RfYWRkX3RhaWwoJm9iai0+Z3R0X2xpc3QsICZkZXZfcHJpdi0+bW0uZ3R0X2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJm9iai0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKIAogCS8qIEFzc2VydCB0aGF0IHRoZSBvYmplY3QgaXMgbm90IGN1cnJlbnRseSBpbiBhbnkgR1BVIGRvbWFpbi4gQXMgaXQKIAkgKiB3YXNuJ3QgaW4gdGhlIEdUVCwgdGhlcmUgc2hvdWxkbid0IGJlIGFueSB3YXkgaXQgY291bGQgaGF2ZSBiZWVuIGluCiAJICogYSBHUFUgY2FjaGUKIAkgKi8KLQlCVUdfT04ob2JqLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUyk7Ci0JQlVHX09OKG9iai0+d3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOworCUJVR19PTihvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOworCUJVR19PTihvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOwogCi0Jb2JqX3ByaXYtPmd0dF9vZmZzZXQgPSBvYmpfcHJpdi0+Z3R0X3NwYWNlLT5zdGFydDsKLQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfYmluZChvYmosIG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKKwlvYmotPmd0dF9vZmZzZXQgPSBvYmotPmd0dF9zcGFjZS0+c3RhcnQ7CiAKKwlmZW5jZWFibGUgPQorCQlvYmotPmd0dF9zcGFjZS0+c2l6ZSA9PSBmZW5jZV9zaXplICYmCisJCShvYmotPmd0dF9zcGFjZS0+c3RhcnQgJiAoZmVuY2VfYWxpZ25tZW50IC0xKSkgPT0gMDsKKworCW1hcHBhYmxlID0KKwkJb2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUgPD0gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQ7CisKKwlvYmotPm1hcF9hbmRfZmVuY2VhYmxlID0gbWFwcGFibGUgJiYgZmVuY2VhYmxlOworCisJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2JpbmQob2JqLCBvYmotPmd0dF9vZmZzZXQsIG1hcF9hbmRfZmVuY2VhYmxlKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZAotaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9jbGZsdXNoX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0CSpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KIAkvKiBJZiB3ZSBkb24ndCBoYXZlIGEgcGFnZSBsaXN0IHNldCB1cCwgdGhlbiB3ZSdyZSBub3QgcGlubmVkCiAJICogdG8gR1BVLCBhbmQgd2UgY2FuIGlnbm9yZSB0aGUgY2FjaGUgZmx1c2ggYmVjYXVzZSBpdCdsbCBoYXBwZW4KIAkgKiBhZ2FpbiBhdCBiaW5kIHRpbWUuCiAJICovCi0JaWYgKG9ial9wcml2LT5wYWdlcyA9PSBOVUxMKQorCWlmIChvYmotPnBhZ2VzID09IE5VTEwpCiAJCXJldHVybjsKIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jbGZsdXNoKG9iaik7CiAKLQlkcm1fY2xmbHVzaF9wYWdlcyhvYmpfcHJpdi0+cGFnZXMsIG9iai0+c2l6ZSAvIFBBR0VfU0laRSk7CisJZHJtX2NsZmx1c2hfcGFnZXMob2JqLT5wYWdlcywgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUpOwogfQogCiAvKiogRmx1c2hlcyBhbnkgR1BVIHdyaXRlIGRvbWFpbiBmb3IgdGhlIG9iamVjdCBpZiBpdCdzIGRpcnR5LiAqLwogc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCi0JaWYgKChvYmotPndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSA9PSAwKQorCWlmICgob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCS8qIFF1ZXVlIHRoZSBHUFUgd3JpdGUgY2FjaGUgZmx1c2hpbmcgd2UgbmVlZC4gKi8KLQlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0JaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIE5VTEwsCi0JCQkgICAgdG9faW50ZWxfYm8ob2JqKS0+cmluZywKLQkJCSAgICAwLCBvYmotPndyaXRlX2RvbWFpbik7Ci0JQlVHX09OKG9iai0+d3JpdGVfZG9tYWluKTsKLQotCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKLQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAotCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIG9iai0+cmluZywgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CiB9CiAKIC8qKiBGbHVzaGVzIHRoZSBHVFQgd3JpdGUgZG9tYWluIGZvciB0aGUgb2JqZWN0IGlmIGl0J3MgZGlydHkuICovCiBzdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3R0X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewogCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW47CiAKLQlpZiAob2JqLT53cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0dUVCkKKwlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5fR1RUKQogCQlyZXR1cm47CiAKLQkvKiBObyBhY3R1YWwgZmx1c2hpbmcgaXMgcmVxdWlyZWQgZm9yIHRoZSBHVFQgd3JpdGUgZG9tYWluLiAgIFdyaXRlcworCS8qIE5vIGFjdHVhbCBmbHVzaGluZyBpcyByZXF1aXJlZCBmb3IgdGhlIEdUVCB3cml0ZSBkb21haW4uICBXcml0ZXMKIAkgKiB0byBpdCBpbW1lZGlhdGVseSBnbyB0byBtYWluIG1lbW9yeSBhcyBmYXIgYXMgd2Uga25vdywgc28gdGhlcmUncwogCSAqIG5vIGNoaXBzZXQgZmx1c2guICBJdCBhbHNvIGRvZXNuJ3QgbGFuZCBpbiByZW5kZXIgY2FjaGUuCisJICoKKwkgKiBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGVuZm9yY2UgdGhlIG9yZGVyIHNvIHRoYXQgYWxsIHdyaXRlcyB0aHJvdWdoCisJICogdGhlIEdUVCBsYW5kIGJlZm9yZSBhbnkgd3JpdGVzIHRvIHRoZSBkZXZpY2UsIHN1Y2ggYXMgdXBkYXRlcyB0bworCSAqIHRoZSBHQVRUIGl0c2VsZi4KIAkgKi8KLQlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0Jb2JqLT53cml0ZV9kb21haW4gPSAwOworCXdtYigpOworCisJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisKKwlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gMDsKIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKLQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkgICAgb2JqLT5iYXNlLnJlYWRfZG9tYWlucywKIAkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwogfQogCiAvKiogRmx1c2hlcyB0aGUgQ1BVIHdyaXRlIGRvbWFpbiBmb3IgdGhlIG9iamVjdCBpZiBpdCdzIGRpcnR5LiAqLwogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbjsKIAotCWlmIChvYmotPndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5fQ1BVKQorCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9DUFUpCiAJCXJldHVybjsKIAogCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7Ci0JZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7Ci0Jb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCW9iai0+d3JpdGVfZG9tYWluID0gMDsKKwlpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCgpOworCW9sZF93cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluOworCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSAwOwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAotCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCisJCQkJCSAgICBvYmotPmJhc2UucmVhZF9kb21haW5zLAogCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiB9CiAKQEAgLTI4MTEsMzcgKzI5MjAsMzkgQEAKICAqIGZsdXNoZXMgdG8gb2NjdXIuCiAgKi8KIGludAotaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBpbnQgd3JpdGUpCitpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgYm9vbCB3cml0ZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW4sIG9sZF9yZWFkX2RvbWFpbnM7CiAJaW50IHJldDsKIAogCS8qIE5vdCB2YWxpZCB0byBiZSBjYWxsZWQgb24gdW5ib3VuZCBvYmplY3RzLiAqLwotCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJaWYgKG9iai0+Z3R0X3NwYWNlID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlmIChvYmotPnBlbmRpbmdfZ3B1X3dyaXRlIHx8IHdyaXRlKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhvYmosIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlpOTE1X2dlbV9vYmplY3RfZmx1c2hfY3B1X3dyaXRlX2RvbWFpbihvYmopOwogCi0Jb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWluczsKKwlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5iYXNlLnJlYWRfZG9tYWluczsKIAogCS8qIEl0IHNob3VsZCBub3cgYmUgb3V0IG9mIGFueSBvdGhlciB3cml0ZSBkb21haW5zLCBhbmQgd2UgY2FuIHVwZGF0ZQogCSAqIHRoZSBkb21haW4gdmFsdWVzIGZvciBvdXIgY2hhbmdlcy4KIAkgKi8KLQlCVUdfT04oKG9iai0+d3JpdGVfZG9tYWluICYgfkk5MTVfR0VNX0RPTUFJTl9HVFQpICE9IDApOwotCW9iai0+cmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CisJQlVHX09OKChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgfkk5MTVfR0VNX0RPTUFJTl9HVFQpICE9IDApOworCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKIAlpZiAod3JpdGUpIHsKLQkJb2JqLT5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fR1RUOwotCQlvYmotPndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7Ci0JCW9ial9wcml2LT5kaXJ0eSA9IDE7CisJCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fR1RUOworCQlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwkJb2JqLT5kaXJ0eSA9IDE7CiAJfQogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLApAQCAtMjg1NiwyMyArMjk2NywyMyBAQAogICogd2FpdCwgYXMgaW4gbW9kZXNldHRpbmcgcHJvY2VzcyB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gYmUgaW50ZXJydXB0ZWQuCiAgKi8KIGludAotaTkxNV9nZW1fb2JqZWN0X3NldF90b19kaXNwbGF5X3BsYW5lKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgYm9vbCBwaXBlbGluZWQpCitpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Rpc3BsYXlfcGxhbmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJdWludDMyX3Qgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgcmV0OwogCiAJLyogTm90IHZhbGlkIHRvIGJlIGNhbGxlZCBvbiB1bmJvdW5kIG9iamVjdHMuICovCi0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkKKwlpZiAob2JqLT5ndHRfc3BhY2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwogCS8qIEN1cnJlbnRseSwgd2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBhbiBub24taW50ZXJydXB0aWJsZSBjb250ZXh0LiAqLwotCWlmICghcGlwZWxpbmVkKSB7CisJaWYgKHBpcGVsaW5lZCAhPSBvYmotPnJpbmcpIHsKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTI4ODAsMTIgKzI5OTEsMTIgQEAKIAogCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKG9iaik7CiAKLQlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnM7Ci0Jb2JqLT5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5iYXNlLnJlYWRfZG9tYWluczsKKwlvYmotPmJhc2UucmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCiAJCQkJCSAgICBvbGRfcmVhZF9kb21haW5zLAotCQkJCQkgICAgb2JqLT53cml0ZV9kb21haW4pOworCQkJCQkgICAgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4OTQsMTQgKzMwMDUsMTkgQEAKIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlKQogeworCWludCByZXQ7CisKIAlpZiAoIW9iai0+YWN0aXZlKQogCQlyZXR1cm4gMDsKIAotCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpCi0JCWk5MTVfZ2VtX2ZsdXNoX3Jpbmcob2JqLT5iYXNlLmRldiwgTlVMTCwgb2JqLT5yaW5nLAotCQkJCSAgICAwLCBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKKwlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSB7CisJCXJldCA9IGk5MTVfZ2VtX2ZsdXNoX3Jpbmcob2JqLT5iYXNlLmRldiwgb2JqLT5yaW5nLAorCQkJCQkgIDAsIG9iai0+YmFzZS53cml0ZV9kb21haW4pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKLQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKCZvYmotPmJhc2UsIGludGVycnVwdGlibGUpOworCXJldHVybiBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCBpbnRlcnJ1cHRpYmxlKTsKIH0KIAogLyoqCkBAIC0yOTExLDE0ICszMDI3LDE1IEBACiAgKiBmbHVzaGVzIHRvIG9jY3VyLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCB3cml0ZSkKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIHdyaXRlKQogewogCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW4sIG9sZF9yZWFkX2RvbWFpbnM7CiAJaW50IHJldDsKIAogCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7Ci0JaWYgKHJldCAhPSAwKQorCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjkzMCwyNyArMzA0NywyNyBAQAogCSAqLwogCWk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZnVsbF9jcHVfcmVhZF9kb21haW4ob2JqKTsKIAotCW9sZF93cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbjsKLQlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnM7CisJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CisJb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CiAKIAkvKiBGbHVzaCB0aGUgQ1BVIGNhY2hlIGlmIGl0J3Mgc3RpbGwgaW52YWxpZC4gKi8KLQlpZiAoKG9iai0+cmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgPT0gMCkgeworCWlmICgob2JqLT5iYXNlLnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpID09IDApIHsKIAkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKIAotCQlvYmotPnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCQlvYmotPmJhc2UucmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAJfQogCiAJLyogSXQgc2hvdWxkIG5vdyBiZSBvdXQgb2YgYW55IG90aGVyIHdyaXRlIGRvbWFpbnMsIGFuZCB3ZSBjYW4gdXBkYXRlCiAJICogdGhlIGRvbWFpbiB2YWx1ZXMgZm9yIG91ciBjaGFuZ2VzLgogCSAqLwotCUJVR19PTigob2JqLT53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0NQVSkgIT0gMCk7CisJQlVHX09OKChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgfkk5MTVfR0VNX0RPTUFJTl9DUFUpICE9IDApOwogCiAJLyogSWYgd2UncmUgd3JpdGluZyB0aHJvdWdoIHRoZSBDUFUsIHRoZW4gdGhlIEdQVSByZWFkIGRvbWFpbnMgd2lsbAogCSAqIG5lZWQgdG8gYmUgaW52YWxpZGF0ZWQgYXQgbmV4dCB1c2UuCiAJICovCiAJaWYgKHdyaXRlKSB7Ci0JCW9iai0+cmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKLQkJb2JqLT53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCQlvYmotPmJhc2UucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwkJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAJfQogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLApAQCAtMjk2MCwxODQgKzMwNzcsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IHRoZSBuZXh0IGRvbWFpbiBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoaXMKLSAqIG1heSBub3QgYWN0dWFsbHkgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGZsdXNoaW5nL2ludmFsaWRpbmcgdGhvdWdoLAotICogYXMgdGhhdCBtYXkgd2FudCB0byBiZSBiYXRjaGVkIHdpdGggb3RoZXIgc2V0X2RvbWFpbiBvcGVyYXRpb25zCi0gKgotICogVGhpcyBpcyAod2UgaG9wZSkgdGhlIG9ubHkgcmVhbGx5IHRyaWNreSBwYXJ0IG9mIGdlbS4gVGhlIGdvYWwKLSAqIGlzIGZhaXJseSBzaW1wbGUgLS0gdHJhY2sgd2hpY2ggY2FjaGVzIGhvbGQgYml0cyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgbWFrZSBzdXJlIHRoZXkgcmVtYWluIGNvaGVyZW50LiBBIGZldyBjb25jcmV0ZSBleGFtcGxlcyBtYXkKLSAqIGhlbHAgdG8gZXhwbGFpbiBob3cgaXQgd29ya3MuIEZvciBzaG9ydGhhbmQsIHdlIHVzZSB0aGUgbm90YXRpb24KLSAqIChyZWFkX2RvbWFpbnMsIHdyaXRlX2RvbWFpbiksIGUuZy4gKENQVSwgQ1BVKSB0byBpbmRpY2F0ZSB0aGUKLSAqIGEgcGFpciBvZiByZWFkIGFuZCB3cml0ZSBkb21haW4gbWFza3MuCi0gKgotICogQ2FzZSAxOiB0aGUgYmF0Y2ggYnVmZmVyCi0gKgotICoJMS4gQWxsb2NhdGVkCi0gKgkyLiBXcml0dGVuIGJ5IENQVQotICoJMy4gTWFwcGVkIHRvIEdUVAotICoJNC4gUmVhZCBieSBHUFUKLSAqCTUuIFVubWFwcGVkIGZyb20gR1RUCi0gKgk2LiBGcmVlZAotICoKLSAqCUxldCdzIHRha2UgdGhlc2UgYSBzdGVwIGF0IGEgdGltZQotICoKLSAqCTEuIEFsbG9jYXRlZAotICoJCVBhZ2VzIGFsbG9jYXRlZCBmcm9tIHRoZSBrZXJuZWwgbWF5IHN0aWxsIGhhdmUKLSAqCQljYWNoZSBjb250ZW50cywgc28gd2Ugc2V0IHRoZW0gdG8gKENQVSwgQ1BVKSBhbHdheXMuCi0gKgkyLiBXcml0dGVuIGJ5IENQVSAodXNpbmcgcHdyaXRlKQotICoJCVRoZSBwd3JpdGUgZnVuY3Rpb24gY2FsbHMgc2V0X2RvbWFpbiAoQ1BVLCBDUFUpIGFuZAotICoJCXRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIChhcyBub3RoaW5nIGNoYW5nZXMpCi0gKgkzLiBNYXBwZWQgYnkgR1RUCi0gKgkJVGhpcyBmdW5jdGlvbiBhc3NlcnRzIHRoYXQgdGhlIG9iamVjdCBpcyBub3QKLSAqCQljdXJyZW50bHkgaW4gYW55IEdQVS1iYXNlZCByZWFkIG9yIHdyaXRlIGRvbWFpbnMKLSAqCTQuIFJlYWQgYnkgR1BVCi0gKgkJaTkxNV9nZW1fZXhlY2J1ZmZlciBjYWxscyBzZXRfZG9tYWluIChDT01NQU5ELCAwKS4KLSAqCQlBcyB3cml0ZV9kb21haW4gaXMgemVybywgdGhpcyBmdW5jdGlvbiBhZGRzIGluIHRoZQotICoJCWN1cnJlbnQgcmVhZCBkb21haW5zIChDUFUrQ09NTUFORCwgMCkuCi0gKgkJZmx1c2hfZG9tYWlucyBpcyBzZXQgdG8gQ1BVLgotICoJCWludmFsaWRhdGVfZG9tYWlucyBpcyBzZXQgdG8gQ09NTUFORAotICoJCWNsZmx1c2ggaXMgcnVuIHRvIGdldCBkYXRhIG91dCBvZiB0aGUgQ1BVIGNhY2hlcwotICoJCXRoZW4gaTkxNV9kZXZfc2V0X2RvbWFpbiBjYWxscyBpOTE1X2dlbV9mbHVzaCB0bwotICoJCWVtaXQgYW4gTUlfRkxVU0ggYW5kIGRybV9hZ3BfY2hpcHNldF9mbHVzaAotICoJNS4gVW5tYXBwZWQgZnJvbSBHVFQKLSAqCQlpOTE1X2dlbV9vYmplY3RfdW5iaW5kIGNhbGxzIHNldF9kb21haW4gKENQVSwgQ1BVKQotICoJCWZsdXNoX2RvbWFpbnMgYW5kIGludmFsaWRhdGVfZG9tYWlucyBlbmQgdXAgYm90aCB6ZXJvCi0gKgkJc28gbm8gZmx1c2hpbmcvaW52YWxpZGF0aW5nIGhhcHBlbnMKLSAqCTYuIEZyZWVkCi0gKgkJeWF5LCBkb25lCi0gKgotICogQ2FzZSAyOiBUaGUgc2hhcmVkIHJlbmRlciBidWZmZXIKLSAqCi0gKgkxLiBBbGxvY2F0ZWQKLSAqCTIuIE1hcHBlZCB0byBHVFQKLSAqCTMuIFJlYWQvd3JpdHRlbiBieSBHUFUKLSAqCTQuIHNldF9kb21haW4gdG8gKENQVSxDUFUpCi0gKgk1LiBSZWFkL3dyaXR0ZW4gYnkgQ1BVCi0gKgk2LiBSZWFkL3dyaXR0ZW4gYnkgR1BVCi0gKgotICoJMS4gQWxsb2NhdGVkCi0gKgkJU2FtZSBhcyBsYXN0IGV4YW1wbGUsIChDUFUsIENQVSkKLSAqCTIuIE1hcHBlZCB0byBHVFQKLSAqCQlOb3RoaW5nIGNoYW5nZXMgKGFzc2VydGlvbnMgZmluZCB0aGF0IGl0IGlzIG5vdCBpbiB0aGUgR1BVKQotICoJMy4gUmVhZC93cml0dGVuIGJ5IEdQVQotICoJCWV4ZWNidWZmZXIgY2FsbHMgc2V0X2RvbWFpbiAoUkVOREVSLCBSRU5ERVIpCi0gKgkJZmx1c2hfZG9tYWlucyBnZXRzIENQVQotICoJCWludmFsaWRhdGVfZG9tYWlucyBnZXRzIEdQVQotICoJCWNsZmx1c2ggKG9iaikKLSAqCQlNSV9GTFVTSCBhbmQgZHJtX2FncF9jaGlwc2V0X2ZsdXNoCi0gKgk0LiBzZXRfZG9tYWluIChDUFUsIENQVSkKLSAqCQlmbHVzaF9kb21haW5zIGdldHMgR1BVCi0gKgkJaW52YWxpZGF0ZV9kb21haW5zIGdldHMgQ1BVCi0gKgkJd2FpdF9yZW5kZXJpbmcgKG9iaikgdG8gbWFrZSBzdXJlIGFsbCBkcmF3aW5nIGlzIGNvbXBsZXRlLgotICoJCVRoaXMgd2lsbCBpbmNsdWRlIGFuIE1JX0ZMVVNIIHRvIGdldCB0aGUgZGF0YSBmcm9tIEdQVQotICoJCXRvIG1lbW9yeQotICoJCWNsZmx1c2ggKG9iaikgdG8gaW52YWxpZGF0ZSB0aGUgQ1BVIGNhY2hlCi0gKgkJQW5vdGhlciBNSV9GTFVTSCBpbiBpOTE1X2dlbV9mbHVzaCAoZWxpbWluYXRlIHRoaXMgc29tZWhvdz8pCi0gKgk1LiBSZWFkL3dyaXR0ZW4gYnkgQ1BVCi0gKgkJY2FjaGUgbGluZXMgYXJlIGxvYWRlZCBhbmQgZGlydGllZAotICoJNi4gUmVhZCB3cml0dGVuIGJ5IEdQVQotICoJCVNhbWUgYXMgbGFzdCBHUFUgYWNjZXNzCi0gKgotICogQ2FzZSAzOiBUaGUgY29uc3RhbnQgYnVmZmVyCi0gKgotICoJMS4gQWxsb2NhdGVkCi0gKgkyLiBXcml0dGVuIGJ5IENQVQotICoJMy4gUmVhZCBieSBHUFUKLSAqCTQuIFVwZGF0ZWQgKHdyaXR0ZW4pIGJ5IENQVSBhZ2FpbgotICoJNS4gUmVhZCBieSBHUFUKLSAqCi0gKgkxLiBBbGxvY2F0ZWQKLSAqCQkoQ1BVLCBDUFUpCi0gKgkyLiBXcml0dGVuIGJ5IENQVQotICoJCShDUFUsIENQVSkKLSAqCTMuIFJlYWQgYnkgR1BVCi0gKgkJKENQVStSRU5ERVIsIDApCi0gKgkJZmx1c2hfZG9tYWlucyA9IENQVQotICoJCWludmFsaWRhdGVfZG9tYWlucyA9IFJFTkRFUgotICoJCWNsZmx1c2ggKG9iaikKLSAqCQlNSV9GTFVTSAotICoJCWRybV9hZ3BfY2hpcHNldF9mbHVzaAotICoJNC4gVXBkYXRlZCAod3JpdHRlbikgYnkgQ1BVIGFnYWluCi0gKgkJKENQVSwgQ1BVKQotICoJCWZsdXNoX2RvbWFpbnMgPSAwIChubyBwcmV2aW91cyB3cml0ZSBkb21haW4pCi0gKgkJaW52YWxpZGF0ZV9kb21haW5zID0gMCAobm8gbmV3IHJlYWQgZG9tYWlucykKLSAqCTUuIFJlYWQgYnkgR1BVCi0gKgkJKENQVStSRU5ERVIsIDApCi0gKgkJZmx1c2hfZG9tYWlucyA9IENQVQotICoJCWludmFsaWRhdGVfZG9tYWlucyA9IFJFTkRFUgotICoJCWNsZmx1c2ggKG9iaikKLSAqCQlNSV9GTFVTSAotICoJCWRybV9hZ3BfY2hpcHNldF9mbHVzaAotICovCi1zdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X3NldF90b19ncHVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXN0cnVjdCBkcm1fZGV2aWNlCQkqZGV2ID0gb2JqLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUJCSpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QJKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQl1aW50MzJfdAkJCWludmFsaWRhdGVfZG9tYWlucyA9IDA7Ci0JdWludDMyX3QJCQlmbHVzaF9kb21haW5zID0gMDsKLQl1aW50MzJfdAkJCW9sZF9yZWFkX2RvbWFpbnM7Ci0KLQlpbnRlbF9tYXJrX2J1c3koZGV2LCBvYmopOwotCi0JLyoKLQkgKiBJZiB0aGUgb2JqZWN0IGlzbid0IG1vdmluZyB0byBhIG5ldyB3cml0ZSBkb21haW4sCi0JICogbGV0IHRoZSBvYmplY3Qgc3RheSBpbiBtdWx0aXBsZSByZWFkIGRvbWFpbnMKLQkgKi8KLQlpZiAob2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiA9PSAwKQotCQlvYmotPnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IG9iai0+cmVhZF9kb21haW5zOwotCWVsc2UKLQkJb2JqX3ByaXYtPmRpcnR5ID0gMTsKLQotCS8qCi0JICogRmx1c2ggdGhlIGN1cnJlbnQgd3JpdGUgZG9tYWluIGlmCi0JICogdGhlIG5ldyByZWFkIGRvbWFpbnMgZG9uJ3QgbWF0Y2guIEludmFsaWRhdGUKLQkgKiBhbnkgcmVhZCBkb21haW5zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBvbGQKLQkgKiB3cml0ZSBkb21haW4KLQkgKi8KLQlpZiAob2JqLT53cml0ZV9kb21haW4gJiYKLQkgICAgKG9iai0+d3JpdGVfZG9tYWluICE9IG9iai0+cGVuZGluZ19yZWFkX2RvbWFpbnMgfHwKLQkgICAgIG9ial9wcml2LT5yaW5nICE9IHJpbmcpKSB7Ci0JCWZsdXNoX2RvbWFpbnMgfD0gb2JqLT53cml0ZV9kb21haW47Ci0JCWludmFsaWRhdGVfZG9tYWlucyB8PQotCQkJb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyAmIH5vYmotPndyaXRlX2RvbWFpbjsKLQl9Ci0JLyoKLQkgKiBJbnZhbGlkYXRlIGFueSByZWFkIGNhY2hlcyB3aGljaCBtYXkgaGF2ZQotCSAqIHN0YWxlIGRhdGEuIFRoYXQgaXMsIGFueSBuZXcgcmVhZCBkb21haW5zLgotCSAqLwotCWludmFsaWRhdGVfZG9tYWlucyB8PSBvYmotPnBlbmRpbmdfcmVhZF9kb21haW5zICYgfm9iai0+cmVhZF9kb21haW5zOwotCWlmICgoZmx1c2hfZG9tYWlucyB8IGludmFsaWRhdGVfZG9tYWlucykgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKQotCQlpOTE1X2dlbV9jbGZsdXNoX29iamVjdChvYmopOwotCi0Jb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOwotCi0JLyogVGhlIGFjdHVhbCBvYmotPndyaXRlX2RvbWFpbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aAotCSAqIHBlbmRpbmdfd3JpdGVfZG9tYWluIGFmdGVyIHdlIGVtaXQgdGhlIGFjY3VtdWxhdGVkIGZsdXNoIGZvciBhbGwKLQkgKiBvZiBvdXIgZG9tYWluIGNoYW5nZXMgaW4gZXhlY2J1ZmZlcnMgKHdoaWNoIGNsZWFycyBvYmplY3RzJwotCSAqIHdyaXRlX2RvbWFpbnMpLiAgU28gaWYgd2UgaGF2ZSBhIGN1cnJlbnQgd3JpdGUgZG9tYWluIHRoYXQgd2UKLQkgKiBhcmVuJ3QgY2hhbmdpbmcsIHNldCBwZW5kaW5nX3dyaXRlX2RvbWFpbiB0byB0aGF0LgotCSAqLwotCWlmIChmbHVzaF9kb21haW5zID09IDAgJiYgb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiA9PSAwKQotCQlvYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0Jb2JqLT5yZWFkX2RvbWFpbnMgPSBvYmotPnBlbmRpbmdfcmVhZF9kb21haW5zOwotCi0JZGV2LT5pbnZhbGlkYXRlX2RvbWFpbnMgfD0gaW52YWxpZGF0ZV9kb21haW5zOwotCWRldi0+Zmx1c2hfZG9tYWlucyB8PSBmbHVzaF9kb21haW5zOwotCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpCi0JCWRldl9wcml2LT5tbS5mbHVzaF9yaW5ncyB8PSBvYmpfcHJpdi0+cmluZy0+aWQ7Ci0JaWYgKGludmFsaWRhdGVfZG9tYWlucyAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQotCQlkZXZfcHJpdi0+bW0uZmx1c2hfcmluZ3MgfD0gcmluZy0+aWQ7Ci0KLQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCi0JCQkJCSAgICBvbGRfcmVhZF9kb21haW5zLAotCQkJCQkgICAgb2JqLT53cml0ZV9kb21haW4pOwotfQotCiAvKioKICAqIE1vdmVzIHRoZSBvYmplY3QgZnJvbSBhIHBhcnRpYWxseSBDUFUgcmVhZCB0byBhIGZ1bGwgb25lLgogICoKQEAgLTMxNDUsMzAgKzMwODQsMjggQEAKICAqIGFuZCBkb2Vzbid0IGhhbmRsZSB0cmFuc2l0aW9uaW5nIGZyb20gIShyZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKS4KICAqLwogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZnVsbF9jcHVfcmVhZF9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Z1bGxfY3B1X3JlYWRfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQotCWlmICghb2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkKQorCWlmICghb2JqLT5wYWdlX2NwdV92YWxpZCkKIAkJcmV0dXJuOwogCiAJLyogSWYgd2UncmUgcGFydGlhbGx5IGluIHRoZSBDUFUgcmVhZCBkb21haW4sIGZpbmlzaCBtb3ZpbmcgaXQgaW4uCiAJICovCi0JaWYgKG9iai0+cmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgeworCWlmIChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDw9IChvYmotPnNpemUgLSAxKSAvIFBBR0VfU0laRTsgaSsrKSB7Ci0JCQlpZiAob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkW2ldKQorCQlmb3IgKGkgPSAwOyBpIDw9IChvYmotPmJhc2Uuc2l6ZSAtIDEpIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJCWlmIChvYmotPnBhZ2VfY3B1X3ZhbGlkW2ldKQogCQkJCWNvbnRpbnVlOwotCQkJZHJtX2NsZmx1c2hfcGFnZXMob2JqX3ByaXYtPnBhZ2VzICsgaSwgMSk7CisJCQlkcm1fY2xmbHVzaF9wYWdlcyhvYmotPnBhZ2VzICsgaSwgMSk7CiAJCX0KIAl9CiAKIAkvKiBGcmVlIHRoZSBwYWdlX2NwdV92YWxpZCBtYXBwaW5ncyB3aGljaCBhcmUgbm93IHN0YWxlLCB3aGV0aGVyCiAJICogb3Igbm90IHdlJ3ZlIGdvdCBJOTE1X0dFTV9ET01BSU5fQ1BVLgogCSAqLwotCWtmcmVlKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCk7Ci0Jb2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkID0gTlVMTDsKKwlrZnJlZShvYmotPnBhZ2VfY3B1X3ZhbGlkKTsKKwlvYmotPnBhZ2VfY3B1X3ZhbGlkID0gTlVMTDsKIH0KIAogLyoqCkBAIC0zMTg0LDE5ICszMTIxLDE5IEBACiAgKiBmbHVzaGVzIHRvIG9jY3VyLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3Rfc2V0X2NwdV9yZWFkX2RvbWFpbl9yYW5nZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK2k5MTVfZ2VtX29iamVjdF9zZXRfY3B1X3JlYWRfZG9tYWluX3JhbmdlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJdWludDMyX3Qgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgaSwgcmV0OwogCi0JaWYgKG9mZnNldCA9PSAwICYmIHNpemUgPT0gb2JqLT5zaXplKQorCWlmIChvZmZzZXQgPT0gMCAmJiBzaXplID09IG9iai0+YmFzZS5zaXplKQogCQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgMCk7CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwotCWlmIChyZXQgIT0gMCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTMyMDQsNDU3ICszMTQxLDQ1IEBACiAJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4ob2JqKTsKIAogCS8qIElmIHdlJ3JlIGFscmVhZHkgZnVsbHkgaW4gdGhlIENQVSByZWFkIGRvbWFpbiwgd2UncmUgZG9uZS4gKi8KLQlpZiAob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkID09IE5VTEwgJiYKLQkgICAgKG9iai0+cmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgIT0gMCkKKwlpZiAob2JqLT5wYWdlX2NwdV92YWxpZCA9PSBOVUxMICYmCisJICAgIChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgIT0gMCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBPdGhlcndpc2UsIGNyZWF0ZS9jbGVhciB0aGUgcGVyLXBhZ2UgQ1BVIHJlYWQgZG9tYWluIGZsYWcgaWYgd2UncmUKIAkgKiBuZXdseSBhZGRpbmcgSTkxNV9HRU1fRE9NQUlOX0NQVQogCSAqLwotCWlmIChvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQgPT0gTlVMTCkgewotCQlvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQgPSBremFsbG9jKG9iai0+c2l6ZSAvIFBBR0VfU0laRSwKLQkJCQkJCSAgIEdGUF9LRVJORUwpOwotCQlpZiAob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkID09IE5VTEwpCisJaWYgKG9iai0+cGFnZV9jcHVfdmFsaWQgPT0gTlVMTCkgeworCQlvYmotPnBhZ2VfY3B1X3ZhbGlkID0ga3phbGxvYyhvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChvYmotPnBhZ2VfY3B1X3ZhbGlkID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgaWYgKChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpID09IDApCi0JCW1lbXNldChvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQsIDAsIG9iai0+c2l6ZSAvIFBBR0VfU0laRSk7CisJfSBlbHNlIGlmICgob2JqLT5iYXNlLnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpID09IDApCisJCW1lbXNldChvYmotPnBhZ2VfY3B1X3ZhbGlkLCAwLCBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRSk7CiAKIAkvKiBGbHVzaCB0aGUgY2FjaGUgb24gYW55IHBhZ2VzIHRoYXQgYXJlIHN0aWxsIGludmFsaWQgZnJvbSB0aGUgQ1BVJ3MKIAkgKiBwZXJzcGVjdGl2ZS4KIAkgKi8KIAlmb3IgKGkgPSBvZmZzZXQgLyBQQUdFX1NJWkU7IGkgPD0gKG9mZnNldCArIHNpemUgLSAxKSAvIFBBR0VfU0laRTsKIAkgICAgIGkrKykgewotCQlpZiAob2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkW2ldKQorCQlpZiAob2JqLT5wYWdlX2NwdV92YWxpZFtpXSkKIAkJCWNvbnRpbnVlOwogCi0JCWRybV9jbGZsdXNoX3BhZ2VzKG9ial9wcml2LT5wYWdlcyArIGksIDEpOworCQlkcm1fY2xmbHVzaF9wYWdlcyhvYmotPnBhZ2VzICsgaSwgMSk7CiAKLQkJb2JqX3ByaXYtPnBhZ2VfY3B1X3ZhbGlkW2ldID0gMTsKKwkJb2JqLT5wYWdlX2NwdV92YWxpZFtpXSA9IDE7CiAJfQogCiAJLyogSXQgc2hvdWxkIG5vdyBiZSBvdXQgb2YgYW55IG90aGVyIHdyaXRlIGRvbWFpbnMsIGFuZCB3ZSBjYW4gdXBkYXRlCiAJICogdGhlIGRvbWFpbiB2YWx1ZXMgZm9yIG91ciBjaGFuZ2VzLgogCSAqLwotCUJVR19PTigob2JqLT53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0NQVSkgIT0gMCk7CisJQlVHX09OKChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgfkk5MTVfR0VNX0RPTUFJTl9DUFUpICE9IDApOwogCi0Jb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOwotCW9iai0+cmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CisJb2JqLT5iYXNlLnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fQ1BVOwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAogCQkJCQkgICAgb2xkX3JlYWRfZG9tYWlucywKLQkJCQkJICAgIG9iai0+d3JpdGVfZG9tYWluKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX2VudHJ5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCi0JCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmVudHJ5LAotCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2MpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICp0YXJnZXRfb2JqOwotCXVpbnQzMl90IHRhcmdldF9vZmZzZXQ7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQl0YXJnZXRfb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LAotCQkJCQkgICByZWxvYy0+dGFyZ2V0X2hhbmRsZSk7Ci0JaWYgKHRhcmdldF9vYmogPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQl0YXJnZXRfb2Zmc2V0ID0gdG9faW50ZWxfYm8odGFyZ2V0X29iaiktPmd0dF9vZmZzZXQ7Ci0KLSNpZiBXQVRDSF9SRUxPQwotCURSTV9JTkZPKCIlczogb2JqICVwIG9mZnNldCAlMDh4IHRhcmdldCAlZCAiCi0JCSAicmVhZCAlMDh4IHdyaXRlICUwOHggZ3R0ICUwOHggIgotCQkgInByZXN1bWVkICUwOHggZGVsdGEgJTA4eFxuIiwKLQkJIF9fZnVuY19fLAotCQkgb2JqLAotCQkgKGludCkgcmVsb2MtPm9mZnNldCwKLQkJIChpbnQpIHJlbG9jLT50YXJnZXRfaGFuZGxlLAotCQkgKGludCkgcmVsb2MtPnJlYWRfZG9tYWlucywKLQkJIChpbnQpIHJlbG9jLT53cml0ZV9kb21haW4sCi0JCSAoaW50KSB0YXJnZXRfb2Zmc2V0LAotCQkgKGludCkgcmVsb2MtPnByZXN1bWVkX29mZnNldCwKLQkJIHJlbG9jLT5kZWx0YSk7Ci0jZW5kaWYKLQotCS8qIFRoZSB0YXJnZXQgYnVmZmVyIHNob3VsZCBoYXZlIGFwcGVhcmVkIGJlZm9yZSB1cyBpbiB0aGUKLQkgKiBleGVjX29iamVjdCBsaXN0LCBzbyBpdCBzaG91bGQgaGF2ZSBhIEdUVCBzcGFjZSBib3VuZCBieSBub3cuCi0JICovCi0JaWYgKHRhcmdldF9vZmZzZXQgPT0gMCkgewotCQlEUk1fRVJST1IoIk5vIEdUVCBzcGFjZSBmb3VuZCBmb3Igb2JqZWN0ICVkXG4iLAotCQkJICByZWxvYy0+dGFyZ2V0X2hhbmRsZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIFZhbGlkYXRlIHRoYXQgdGhlIHRhcmdldCBpcyBpbiBhIHZhbGlkIHIvdyBHUFUgZG9tYWluICovCi0JaWYgKHJlbG9jLT53cml0ZV9kb21haW4gJiAocmVsb2MtPndyaXRlX2RvbWFpbiAtIDEpKSB7Ci0JCURSTV9FUlJPUigicmVsb2Mgd2l0aCBtdWx0aXBsZSB3cml0ZSBkb21haW5zOiAiCi0JCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCi0JCQkgICJyZWFkICUwOHggd3JpdGUgJTA4eCIsCi0JCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCi0JCQkgIHJlbG9jLT5yZWFkX2RvbWFpbnMsCi0JCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKHJlbG9jLT53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9ET01BSU5fQ1BVIHx8Ci0JICAgIHJlbG9jLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7Ci0JCURSTV9FUlJPUigicmVsb2Mgd2l0aCByZWFkL3dyaXRlIENQVSBkb21haW5zOiAiCi0JCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCi0JCQkgICJyZWFkICUwOHggd3JpdGUgJTA4eCIsCi0JCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCi0JCQkgIHJlbG9jLT5yZWFkX2RvbWFpbnMsCi0JCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKHJlbG9jLT53cml0ZV9kb21haW4gJiYgdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4gJiYKLQkgICAgcmVsb2MtPndyaXRlX2RvbWFpbiAhPSB0YXJnZXRfb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbikgewotCQlEUk1fRVJST1IoIldyaXRlIGRvbWFpbiBjb25mbGljdDogIgotCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQgIgotCQkJICAibmV3ICUwOHggb2xkICUwOHhcbiIsCi0JCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCi0JCQkgIHJlbG9jLT53cml0ZV9kb21haW4sCi0JCQkgIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JdGFyZ2V0X29iai0+cGVuZGluZ19yZWFkX2RvbWFpbnMgfD0gcmVsb2MtPnJlYWRfZG9tYWluczsKLQl0YXJnZXRfb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiB8PSByZWxvYy0+d3JpdGVfZG9tYWluOwotCi0JLyogSWYgdGhlIHJlbG9jYXRpb24gYWxyZWFkeSBoYXMgdGhlIHJpZ2h0IHZhbHVlIGluIGl0LCBubwotCSAqIG1vcmUgd29yayBuZWVkcyB0byBiZSBkb25lLgotCSAqLwotCWlmICh0YXJnZXRfb2Zmc2V0ID09IHJlbG9jLT5wcmVzdW1lZF9vZmZzZXQpCi0JCWdvdG8gb3V0OwotCi0JLyogQ2hlY2sgdGhhdCB0aGUgcmVsb2NhdGlvbiBhZGRyZXNzIGlzIHZhbGlkLi4uICovCi0JaWYgKHJlbG9jLT5vZmZzZXQgPiBvYmotPmJhc2Uuc2l6ZSAtIDQpIHsKLQkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIGJleW9uZCBvYmplY3QgYm91bmRzOiAiCi0JCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCBzaXplICVkLlxuIiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKLQkJCSAgKGludCkgb2JqLT5iYXNlLnNpemUpOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKHJlbG9jLT5vZmZzZXQgJiAzKSB7Ci0JCURSTV9FUlJPUigiUmVsb2NhdGlvbiBub3QgNC1ieXRlIGFsaWduZWQ6ICIKLQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkLlxuIiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPm9mZnNldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGFuZCBwb2ludHMgdG8gc29tZXdoZXJlIHdpdGhpbiB0aGUgdGFyZ2V0IG9iamVjdC4gKi8KLQlpZiAocmVsb2MtPmRlbHRhID49IHRhcmdldF9vYmotPnNpemUpIHsKLQkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIGJleW9uZCB0YXJnZXQgb2JqZWN0IGJvdW5kczogIgotCQkJICAib2JqICVwIHRhcmdldCAlZCBkZWx0YSAlZCBzaXplICVkLlxuIiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPmRlbHRhLAotCQkJICAoaW50KSB0YXJnZXRfb2JqLT5zaXplKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmVsb2MtPmRlbHRhICs9IHRhcmdldF9vZmZzZXQ7Ci0JaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gPT0gSTkxNV9HRU1fRE9NQUlOX0NQVSkgewotCQl1aW50MzJfdCBwYWdlX29mZnNldCA9IHJlbG9jLT5vZmZzZXQgJiB+UEFHRV9NQVNLOwotCQljaGFyICp2YWRkcjsKLQotCQl2YWRkciA9IGttYXBfYXRvbWljKG9iai0+cGFnZXNbcmVsb2MtPm9mZnNldCA+PiBQQUdFX1NISUZUXSk7Ci0JCSoodWludDMyX3QgKikodmFkZHIgKyBwYWdlX29mZnNldCkgPSByZWxvYy0+ZGVsdGE7Ci0JCWt1bm1hcF9hdG9taWModmFkZHIpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JCXVpbnQzMl90IF9faW9tZW0gKnJlbG9jX2VudHJ5OwotCQl2b2lkIF9faW9tZW0gKnJlbG9jX3BhZ2U7Ci0KLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKCZvYmotPmJhc2UsIDEpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0KLQkJLyogTWFwIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIHJlbG9jYXRpb24gd2UncmUgZ29pbmcgdG8gcGVyZm9ybS4gICovCi0JCXJlbG9jLT5vZmZzZXQgKz0gb2JqLT5ndHRfb2Zmc2V0OwotCQlyZWxvY19wYWdlID0gaW9fbWFwcGluZ19tYXBfYXRvbWljX3djKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywKLQkJCQkJCSAgICAgIHJlbG9jLT5vZmZzZXQgJiBQQUdFX01BU0spOwotCQlyZWxvY19lbnRyeSA9ICh1aW50MzJfdCBfX2lvbWVtICopCi0JCQkocmVsb2NfcGFnZSArIChyZWxvYy0+b2Zmc2V0ICYgflBBR0VfTUFTSykpOwotCQlpb3dyaXRlMzIocmVsb2MtPmRlbHRhLCByZWxvY19lbnRyeSk7Ci0JCWlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHJlbG9jX3BhZ2UpOwotCX0KLQotCS8qIGFuZCB1cGRhdGUgdGhlIHVzZXIncyByZWxvY2F0aW9uIGVudHJ5ICovCi0JcmVsb2MtPnByZXN1bWVkX29mZnNldCA9IHRhcmdldF9vZmZzZXQ7Ci0KLW91dDoKLQlyZXQgPSAwOwotZXJyOgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHRhcmdldF9vYmopOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnkpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7Ci0JaW50IGksIHJldDsKLQotCXVzZXJfcmVsb2NzID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCllbnRyeS0+cmVsb2NzX3B0cjsKLQlmb3IgKGkgPSAwOyBpIDwgZW50cnktPnJlbG9jYXRpb25fY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgcmVsb2M7Ci0KLQkJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoJnJlbG9jLAotCQkJCQkgICAgICB1c2VyX3JlbG9jcytpLAotCQkJCQkgICAgICBzaXplb2YocmVsb2MpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkob2JqLCBmaWxlX3ByaXYsIGVudHJ5LCAmcmVsb2MpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpZiAoX19jb3B5X3RvX3VzZXJfaW5hdG9taWMoJnVzZXJfcmVsb2NzW2ldLnByZXN1bWVkX29mZnNldCwKLQkJCQkJICAgICZyZWxvYy5wcmVzdW1lZF9vZmZzZXQsCi0JCQkJCSAgICBzaXplb2YocmVsb2MucHJlc3VtZWRfb2Zmc2V0KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9vYmplY3Rfc2xvdyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCi0JCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnksCi0JCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jcykKLXsKLQlpbnQgaSwgcmV0OwotCi0JZm9yIChpID0gMDsgaSA8IGVudHJ5LT5yZWxvY2F0aW9uX2NvdW50OyBpKyspIHsKLQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9lbnRyeShvYmosIGZpbGVfcHJpdiwgZW50cnksICZyZWxvY3NbaV0pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCi0JCQkgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iamVjdF9saXN0LAotCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlY19saXN0LAotCQkJICAgICBpbnQgY291bnQpCi17Ci0JaW50IGksIHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyhvYmplY3RfbGlzdFtpXSk7Ci0JCW9iai0+YmFzZS5wZW5kaW5nX3JlYWRfZG9tYWlucyA9IDA7Ci0JCW9iai0+YmFzZS5wZW5kaW5nX3dyaXRlX2RvbWFpbiA9IDA7Ci0JCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfb2JqZWN0KG9iaiwgZmlsZSwKLQkJCQkJCQkgICZleGVjX2xpc3RbaV0pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlLAotCQkJICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iamVjdF9saXN0LAotCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjX2xpc3QsCi0JCQkgICAgaW50IGNvdW50KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldCwgaSwgcmV0cnk7Ci0KLQkvKiBhdHRlbXB0IHRvIHBpbiBhbGwgb2YgdGhlIGJ1ZmZlcnMgaW50byB0aGUgR1RUICovCi0JZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMjsgcmV0cnkrKykgewotCQlyZXQgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmVudHJ5ID0gJmV4ZWNfbGlzdFtpXTsKLQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo9IHRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKTsKLQkJCWJvb2wgbmVlZF9mZW5jZSA9Ci0JCQkJZW50cnktPmZsYWdzICYgRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0UgJiYKLQkJCQlvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkU7Ci0KLQkJCS8qIENoZWNrIGZlbmNlIHJlZyBjb25zdHJhaW50cyBhbmQgcmViaW5kIGlmIG5lY2Vzc2FyeSAqLwotCQkJaWYgKG5lZWRfZmVuY2UgJiYKLQkJCSAgICAhaTkxNV9nZW1fb2JqZWN0X2ZlbmNlX29mZnNldF9vaygmb2JqLT5iYXNlLAotCQkJCQkJCSAgICAgb2JqLT50aWxpbmdfbW9kZSkpIHsKLQkJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKCZvYmotPmJhc2UpOwotCQkJCWlmIChyZXQpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKCZvYmotPmJhc2UsIGVudHJ5LT5hbGlnbm1lbnQpOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQotCQkJLyoKLQkJCSAqIFByZS05NjUgY2hpcHMgbmVlZCBhIGZlbmNlIHJlZ2lzdGVyIHNldCB1cCBpbiBvcmRlcgotCQkJICogdG8gcHJvcGVybHkgaGFuZGxlIGJsaXRzIHRvL2Zyb20gdGlsZWQgc3VyZmFjZXMuCi0JCQkgKi8KLQkJCWlmIChuZWVkX2ZlbmNlKSB7Ci0JCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcoJm9iai0+YmFzZSwgdHJ1ZSk7Ci0JCQkJaWYgKHJldCkgewotCQkJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4oJm9iai0+YmFzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXS5ncHUgPSB0cnVlOwotCQkJfQotCi0JCQllbnRyeS0+b2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0OwotCQl9Ci0KLQkJd2hpbGUgKGktLSkKLQkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmplY3RfbGlzdFtpXSk7Ci0KLQkJaWYgKHJldCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHJldCAhPSAtRU5PU1BDIHx8IHJldHJ5KQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKGRldik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKLQkJCQkgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iamVjdF9saXN0LAotCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWNfbGlzdCwKLQkJCQkgIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jOwotCWludCBpLCB0b3RhbCwgcmV0OwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKTsKLQkJb2JqLT5pbl9leGVjYnVmZmVyID0gZmFsc2U7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQl0b3RhbCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXRvdGFsICs9IGV4ZWNfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50OwotCi0JcmVsb2MgPSBkcm1fbWFsbG9jX2FiKHRvdGFsLCBzaXplb2YoKnJlbG9jKSk7Ci0JaWYgKHJlbG9jID09IE5VTEwpIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl0b3RhbCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7Ci0KLQkJdXNlcl9yZWxvY3MgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KWV4ZWNfbGlzdFtpXS5yZWxvY3NfcHRyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihyZWxvYyt0b3RhbCwgdXNlcl9yZWxvY3MsCi0JCQkJICAgZXhlY19saXN0W2ldLnJlbG9jYXRpb25fY291bnQgKgotCQkJCSAgIHNpemVvZigqcmVsb2MpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJdG90YWwgKz0gZXhlY19saXN0W2ldLnJlbG9jYXRpb25fY291bnQ7Ci0JfQotCi0JcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKLQlpZiAocmV0KSB7Ci0JCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKGRldiwgZmlsZSwKLQkJCQkJICBvYmplY3RfbGlzdCwgZXhlY19saXN0LAotCQkJCQkgIGNvdW50KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCXRvdGFsID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfYm8ob2JqZWN0X2xpc3RbaV0pOwotCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgPSAwOwotCQlvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPSAwOwotCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdF9zbG93KG9iaiwgZmlsZSwKLQkJCQkJCQkgICAgICAgJmV4ZWNfbGlzdFtpXSwKLQkJCQkJCQkgICAgICAgcmVsb2MgKyB0b3RhbCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQotCQl0b3RhbCArPSBleGVjX2xpc3RbaV0ucmVsb2NhdGlvbl9jb3VudDsKLQl9Ci0KLQkvKiBMZWF2ZSB0aGUgdXNlciByZWxvY2F0aW9ucyBhcyBhcmUsIHRoaXMgaXMgdGhlIHBhaW5mdWxseSBzbG93IHBhdGgsCi0JICogYW5kIHdlIHdhbnQgdG8gYXZvaWQgdGhlIGNvbXBsaWNhdGlvbiBvZiBkcm9wcGluZyB0aGUgbG9jayB3aGlsc3QKLQkgKiBoYXZpbmcgYnVmZmVycyByZXNlcnZlZCBpbiB0aGUgYXBlcnR1cmUgYW5kIHNvIGNhdXNpbmcgc3B1cmlvdXMKLQkgKiBFTk9TUEMgZm9yIHJhbmRvbSBvcGVyYXRpb25zLgotCSAqLwotCi1lcnI6Ci0JZHJtX2ZyZWVfbGFyZ2UocmVsb2MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2V4ZWNidWZmZXJfbW92ZV90b19ncHUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCi0JCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9iamVjdHMsCi0JCQkJaW50IGNvdW50KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldCwgaTsKLQotCS8qIFplcm8gdGhlIGdsb2JhbCBmbHVzaC9pbnZhbGlkYXRlIGZsYWdzLiBUaGVzZQotCSAqIHdpbGwgYmUgbW9kaWZpZWQgYXMgbmV3IGRvbWFpbnMgYXJlIGNvbXB1dGVkCi0JICogZm9yIGVhY2ggb2JqZWN0Ci0JICovCi0JZGV2LT5pbnZhbGlkYXRlX2RvbWFpbnMgPSAwOwotCWRldi0+Zmx1c2hfZG9tYWlucyA9IDA7Ci0JZGV2X3ByaXYtPm1tLmZsdXNoX3JpbmdzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJaTkxNV9nZW1fb2JqZWN0X3NldF90b19ncHVfZG9tYWluKG9iamVjdHNbaV0sIHJpbmcpOwotCi0JaWYgKGRldi0+aW52YWxpZGF0ZV9kb21haW5zIHwgZGV2LT5mbHVzaF9kb21haW5zKSB7Ci0jaWYgV0FUQ0hfRVhFQwotCQlEUk1fSU5GTygiJXM6IGludmFsaWRhdGVfZG9tYWlucyAlMDh4IGZsdXNoX2RvbWFpbnMgJTA4eFxuIiwKLQkJCSAgX19mdW5jX18sCi0JCQkgZGV2LT5pbnZhbGlkYXRlX2RvbWFpbnMsCi0JCQkgZGV2LT5mbHVzaF9kb21haW5zKTsKLSNlbmRpZgotCQlpOTE1X2dlbV9mbHVzaChkZXYsIGZpbGUsCi0JCQkgICAgICAgZGV2LT5pbnZhbGlkYXRlX2RvbWFpbnMsCi0JCQkgICAgICAgZGV2LT5mbHVzaF9kb21haW5zLAotCQkJICAgICAgIGRldl9wcml2LT5tbS5mbHVzaF9yaW5ncyk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKG9iamVjdHNbaV0pOwotCQkvKiBYWFggcmVwbGFjZSB3aXRoIHNlbWFwaG9yZXMgKi8KLQkJaWYgKG9iai0+cmluZyAmJiByaW5nICE9IG9iai0+cmluZykgewotCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKCZvYmotPmJhc2UsIHRydWUpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCQkJCQkgICAgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2OTQsMjAgKzMyMTksMjEgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSAwOwotCWlmICghaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKGRldiwgcmluZyksIHNlcW5vKSkgeworCWlmICghaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykpIHsKIAkJLyogQW5kIHdhaXQgZm9yIHRoZSBzZXFubyBwYXNzaW5nIHdpdGhvdXQgaG9sZGluZyBhbnkgbG9ja3MgYW5kCiAJCSAqIGNhdXNpbmcgZXh0cmEgbGF0ZW5jeSBmb3Igb3RoZXJzLiBUaGlzIGlzIHNhZmUgYXMgdGhlIGlycQogCQkgKiBnZW5lcmF0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIHJ1biBhdG9taWNhbGx5IGFuZCBzbyBpcwogCQkgKiBsb2NrbGVzcy4KIAkJICovCi0JCXJpbmctPnVzZXJfaXJxX2dldChkZXYsIHJpbmcpOwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmluZy0+aXJxX3F1ZXVlLAotCQkJCQkgICAgICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKGRldiwgcmluZyksIHNlcW5vKQotCQkJCQkgICAgICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKLQkJcmluZy0+dXNlcl9pcnFfcHV0KGRldiwgcmluZyk7CisJCWlmIChyaW5nLT5pcnFfZ2V0KHJpbmcpKSB7CisJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmluZy0+aXJxX3F1ZXVlLAorCQkJCQkJICAgICAgIGk5MTVfc2Vxbm9fcGFzc2VkKHJpbmctPmdldF9zZXFubyhyaW5nKSwgc2Vxbm8pCisJCQkJCQkgICAgICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKKwkJCXJpbmctPmlycV9wdXQocmluZyk7CiAKLQkJaWYgKHJldCA9PSAwICYmIGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkKLQkJCXJldCA9IC1FSU87CisJCQlpZiAocmV0ID09IDAgJiYgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKQorCQkJCXJldCA9IC1FSU87CisJCX0KIAl9CiAKIAlpZiAocmV0ID09IDApCkBAIC0zNzE2LDU3NyArMzI0MiwxMDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9jaGVja19leGVjYnVmZmVyKHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgKmV4ZWMsCi0JCQkgIHVpbnQ2NF90IGV4ZWNfb2Zmc2V0KQotewotCXVpbnQzMl90IGV4ZWNfc3RhcnQsIGV4ZWNfbGVuOwotCi0JZXhlY19zdGFydCA9ICh1aW50MzJfdCkgZXhlY19vZmZzZXQgKyBleGVjLT5iYXRjaF9zdGFydF9vZmZzZXQ7Ci0JZXhlY19sZW4gPSAodWludDMyX3QpIGV4ZWMtPmJhdGNoX2xlbjsKLQotCWlmICgoZXhlY19zdGFydCB8IGV4ZWNfbGVuKSAmIDB4NykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWV4ZWNfc3RhcnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4ZWNfbGlzdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYywKLQkJICAgaW50IGNvdW50KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJY2hhciBfX3VzZXIgKnB0ciA9IChjaGFyIF9fdXNlciAqKSh1aW50cHRyX3QpZXhlY1tpXS5yZWxvY3NfcHRyOwotCQlpbnQgbGVuZ3RoOyAvKiBsaW1pdGVkIGJ5IGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKCkgKi8KLQotCQkvKiBGaXJzdCBjaGVjayBmb3IgbWFsaWNpb3VzIGlucHV0IGNhdXNpbmcgb3ZlcmZsb3cgKi8KLQkJaWYgKGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCA+Ci0JCSAgICBJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlsZW5ndGggPSBleGVjW2ldLnJlbG9jYXRpb25fY291bnQgKgotCQkJc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSk7Ci0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwdHIsIGxlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkvKiB3ZSBtYXkgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJlc3VtZWQgb2Zmc2V0cyAqLwotCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHB0ciwgbGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChmYXVsdF9pbl9wYWdlc19yZWFkYWJsZShwdHIsIGxlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZG9fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlLAotCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqYXJncywKLQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjX2xpc3QpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqZWN0X2xpc3QgPSBOVUxMOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqYmF0Y2hfb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzID0gTlVMTDsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwotCWludCByZXQsIGksIGZsaXBzOwotCXVpbnQ2NF90IGV4ZWNfb2Zmc2V0OwotCi0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTlVMTDsKLQotCXJldCA9IGk5MTVfZ2VtX2NoZWNrX2lzX3dlZGdlZChkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB2YWxpZGF0ZV9leGVjX2xpc3QoZXhlY19saXN0LCBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLSNpZiBXQVRDSF9FWEVDCi0JRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKLQkJICAoaW50KSBhcmdzLT5idWZmZXJzX3B0ciwgYXJncy0+YnVmZmVyX2NvdW50LCBhcmdzLT5iYXRjaF9sZW4pOwotI2VuZGlmCi0Jc3dpdGNoIChhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spIHsKLQljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgotCWNhc2UgSTkxNV9FWEVDX1JFTkRFUjoKLQkJcmluZyA9ICZkZXZfcHJpdi0+cmVuZGVyX3Jpbmc7Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9FWEVDX0JTRDoKLQkJaWYgKCFIQVNfQlNEKGRldikpIHsKLQkJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIGludmFsaWQgcmluZyAoQlNEKVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyaW5nID0gJmRldl9wcml2LT5ic2RfcmluZzsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0VYRUNfQkxUOgotCQlpZiAoIUhBU19CTFQoZGV2KSkgewotCQkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggaW52YWxpZCByaW5nIChCTFQpXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXJpbmcgPSAmZGV2X3ByaXYtPmJsdF9yaW5nOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCB1bmtub3duIHJpbmc6ICVkXG4iLAotCQkJICAoaW50KShhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGFyZ3MtPmJ1ZmZlcl9jb3VudCA8IDEpIHsKLQkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggJWQgYnVmZmVyc1xuIiwgYXJncy0+YnVmZmVyX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW9iamVjdF9saXN0ID0gZHJtX21hbGxvY19hYihzaXplb2YoKm9iamVjdF9saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKLQlpZiAob2JqZWN0X2xpc3QgPT0gTlVMTCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBvYmplY3QgbGlzdCBmb3IgJWQgYnVmZmVyc1xuIiwKLQkJCSAgYXJncy0+YnVmZmVyX2NvdW50KTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBwcmVfbXV0ZXhfZXJyOwotCX0KLQotCWlmIChhcmdzLT5udW1fY2xpcHJlY3RzICE9IDApIHsKLQkJY2xpcHJlY3RzID0ga2NhbGxvYyhhcmdzLT5udW1fY2xpcHJlY3RzLCBzaXplb2YoKmNsaXByZWN0cyksCi0JCQkJICAgIEdGUF9LRVJORUwpOwotCQlpZiAoY2xpcHJlY3RzID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIHByZV9tdXRleF9lcnI7Ci0JCX0KLQotCQlyZXQgPSBjb3B5X2Zyb21fdXNlcihjbGlwcmVjdHMsCi0JCQkJICAgICAoc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICopCi0JCQkJICAgICAodWludHB0cl90KSBhcmdzLT5jbGlwcmVjdHNfcHRyLAotCQkJCSAgICAgc2l6ZW9mKCpjbGlwcmVjdHMpICogYXJncy0+bnVtX2NsaXByZWN0cyk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJRFJNX0VSUk9SKCJjb3B5ICVkIGNsaXByZWN0cyBmYWlsZWQ6ICVkXG4iLAotCQkJCSAgYXJncy0+bnVtX2NsaXByZWN0cywgcmV0KTsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIHByZV9tdXRleF9lcnI7Ci0JCX0KLQl9Ci0KLQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVxdWVzdCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gcHJlX211dGV4X2VycjsKLQl9Ci0KLQlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gcHJlX211dGV4X2VycjsKLQotCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKSB7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gcHJlX211dGV4X2VycjsKLQl9Ci0KLQkvKiBMb29rIHVwIG9iamVjdCBoYW5kbGVzICovCi0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCW9iamVjdF9saXN0W2ldID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwKLQkJCQkJCSAgICAgICBleGVjX2xpc3RbaV0uaGFuZGxlKTsKLQkJaWYgKG9iamVjdF9saXN0W2ldID09IE5VTEwpIHsKLQkJCURSTV9FUlJPUigiSW52YWxpZCBvYmplY3QgaGFuZGxlICVkIGF0IGluZGV4ICVkXG4iLAotCQkJCSAgIGV4ZWNfbGlzdFtpXS5oYW5kbGUsIGkpOwotCQkJLyogcHJldmVudCBlcnJvciBwYXRoIGZyb20gcmVhZGluZyB1bmluaXRpYWxpemVkIGRhdGEgKi8KLQkJCWFyZ3MtPmJ1ZmZlcl9jb3VudCA9IGkgKyAxOwotCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmplY3RfbGlzdFtpXSk7Ci0JCWlmIChvYmpfcHJpdi0+aW5fZXhlY2J1ZmZlcikgewotCQkJRFJNX0VSUk9SKCJPYmplY3QgJXAgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiBvYmplY3QgbGlzdFxuIiwKLQkJCQkgICBvYmplY3RfbGlzdFtpXSk7Ci0JCQkvKiBwcmV2ZW50IGVycm9yIHBhdGggZnJvbSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSAqLwotCQkJYXJncy0+YnVmZmVyX2NvdW50ID0gaSArIDE7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJb2JqX3ByaXYtPmluX2V4ZWNidWZmZXIgPSB0cnVlOwotCX0KLQotCS8qIE1vdmUgdGhlIG9iamVjdHMgZW4tbWFzc2UgaW50byB0aGUgR1RULCBldmljdGluZyBpZiBuZWNlc3NhcnkuICovCi0JcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKGRldiwgZmlsZSwKLQkJCQkJICBvYmplY3RfbGlzdCwgZXhlY19saXN0LAotCQkJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQkvKiBUaGUgb2JqZWN0cyBhcmUgaW4gdGhlaXIgZmluYWwgbG9jYXRpb25zLCBhcHBseSB0aGUgcmVsb2NhdGlvbnMuICovCi0JcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZShkZXYsIGZpbGUsCi0JCQkJCSAgIG9iamVjdF9saXN0LCBleGVjX2xpc3QsCi0JCQkJCSAgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJldCkgewotCQlpZiAocmV0ID09IC1FRkFVTFQpIHsKLQkJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfc2xvdyhkZXYsIGZpbGUsCi0JCQkJCQkJCW9iamVjdF9saXN0LAotCQkJCQkJCQlleGVjX2xpc3QsCi0JCQkJCQkJCWFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCQlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKLQkJfQotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0JfQotCi0JLyogU2V0IHRoZSBwZW5kaW5nIHJlYWQgZG9tYWlucyBmb3IgdGhlIGJhdGNoIGJ1ZmZlciB0byBDT01NQU5EICovCi0JYmF0Y2hfb2JqID0gb2JqZWN0X2xpc3RbYXJncy0+YnVmZmVyX2NvdW50LTFdOwotCWlmIChiYXRjaF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKSB7Ci0JCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byB1c2Ugc2VsZi1tb2RpZnlpbmcgYmF0Y2ggYnVmZmVyXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCWJhdGNoX29iai0+cGVuZGluZ19yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0NPTU1BTkQ7Ci0KLQkvKiBTYW5pdHkgY2hlY2sgdGhlIGJhdGNoIGJ1ZmZlciAqLwotCWV4ZWNfb2Zmc2V0ID0gdG9faW50ZWxfYm8oYmF0Y2hfb2JqKS0+Z3R0X29mZnNldDsKLQlyZXQgPSBpOTE1X2dlbV9jaGVja19leGVjYnVmZmVyKGFyZ3MsIGV4ZWNfb2Zmc2V0KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggaW52YWxpZCBvZmZzZXQvbGVuZ3RoXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9tb3ZlX3RvX2dwdShkZXYsIGZpbGUsIHJpbmcsCi0JCQkJCSAgICAgIG9iamVjdF9saXN0LCBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gb2JqZWN0X2xpc3RbaV07Ci0JCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbjsKLQkJb2JqLT53cml0ZV9kb21haW4gPSBvYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluOwotCQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCi0JCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCi0JCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7Ci0JfQotCi0jaWYgV0FUQ0hfQ09IRVJFTkNZCi0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCWk5MTVfZ2VtX29iamVjdF9jaGVja19jb2hlcmVuY3kob2JqZWN0X2xpc3RbaV0sCi0JCQkJCQlleGVjX2xpc3RbaV0uaGFuZGxlKTsKLQl9Ci0jZW5kaWYKLQotI2lmIFdBVENIX0VYRUMKLQlpOTE1X2dlbV9kdW1wX29iamVjdChiYXRjaF9vYmosCi0JCQkgICAgICBhcmdzLT5iYXRjaF9sZW4sCi0JCQkgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgIH4wKTsKLSNlbmRpZgotCi0JLyogQ2hlY2sgZm9yIGFueSBwZW5kaW5nIGZsaXBzLiBBcyB3ZSBvbmx5IG1haW50YWluIGEgZmxpcCBxdWV1ZSBkZXB0aAotCSAqIG9mIDEsIHdlIGNhbiBzaW1wbHkgaW5zZXJ0IGEgV0FJVCBmb3IgdGhlIG5leHQgZGlzcGxheSBmbGlwIHByaW9yCi0JICogdG8gZXhlY3V0aW5nIHRoZSBiYXRjaCBhbmQgYXZvaWQgc3RhbGxpbmcgdGhlIENQVS4KLQkgKi8KLQlmbGlwcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCWlmIChvYmplY3RfbGlzdFtpXS0+d3JpdGVfZG9tYWluKQotCQkJZmxpcHMgfD0gYXRvbWljX3JlYWQoJnRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKS0+cGVuZGluZ19mbGlwKTsKLQl9Ci0JaWYgKGZsaXBzKSB7Ci0JCWludCBwbGFuZSwgZmxpcF9tYXNrOwotCi0JCWZvciAocGxhbmUgPSAwOyBmbGlwcyA+PiBwbGFuZTsgcGxhbmUrKykgewotCQkJaWYgKCgoZmxpcHMgPj4gcGxhbmUpICYgMSkgPT0gMCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHBsYW5lKQotCQkJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUDsKLQkJCWVsc2UKLQkJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVA7Ci0KLQkJCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCAyKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQkJCU1JX1dBSVRfRk9SX0VWRU5UIHwgZmxpcF9tYXNrKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX05PT1ApOwotCQkJaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7Ci0JCX0KLQl9Ci0KLQkvKiBFeGVjIHRoZSBiYXRjaGJ1ZmZlciAqLwotCXJldCA9IHJpbmctPmRpc3BhdGNoX2dlbV9leGVjYnVmZmVyKGRldiwgcmluZywgYXJncywKLQkJCQkJICAgIGNsaXByZWN0cywgZXhlY19vZmZzZXQpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJkaXNwYXRjaCBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvbW1hbmRzIGluIHRoZSBiYXRjaCBidWZmZXIgYXJlCi0JICogZmluaXNoZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgZmlyZXMKLQkgKi8KLQlpOTE1X3JldGlyZV9jb21tYW5kcyhkZXYsIHJpbmcpOwotCi0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gb2JqZWN0X2xpc3RbaV07Ci0KLQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fYWN0aXZlKG9iaiwgcmluZyk7Ci0JCWlmIChvYmotPndyaXRlX2RvbWFpbikKLQkJCWxpc3RfbW92ZV90YWlsKCZ0b19pbnRlbF9ibyhvYmopLT5ncHVfd3JpdGVfbGlzdCwKLQkJCQkgICAgICAgJnJpbmctPmdwdV93cml0ZV9saXN0KTsKLQl9Ci0KLQlpOTE1X2FkZF9yZXF1ZXN0KGRldiwgZmlsZSwgcmVxdWVzdCwgcmluZyk7Ci0JcmVxdWVzdCA9IE5VTEw7Ci0KLWVycjoKLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJaWYgKG9iamVjdF9saXN0W2ldKSB7Ci0JCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKTsKLQkJCW9ial9wcml2LT5pbl9leGVjYnVmZmVyID0gZmFsc2U7Ci0JCX0KLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqZWN0X2xpc3RbaV0pOwotCX0KLQotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi1wcmVfbXV0ZXhfZXJyOgotCWRybV9mcmVlX2xhcmdlKG9iamVjdF9saXN0KTsKLQlrZnJlZShjbGlwcmVjdHMpOwotCWtmcmVlKHJlcXVlc3QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIExlZ2FjeSBleGVjYnVmZmVyIGp1c3QgY3JlYXRlcyBhbiBleGVjMiBsaXN0IGZyb20gdGhlIG9yaWdpbmFsIGV4ZWMgb2JqZWN0Ci0gKiBsaXN0IGFycmF5IGFuZCBwYXNzZXMgaXQgdG8gdGhlIHJlYWwgZnVuY3Rpb24uCi0gKi8KIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCitpOTE1X2dlbV9vYmplY3RfcGluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCSAgICB1aW50MzJfdCBhbGlnbm1lbnQsCisJCSAgICBib29sIG1hcF9hbmRfZmVuY2VhYmxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjMjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0ICpleGVjX2xpc3QgPSBOVUxMOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9saXN0ID0gTlVMTDsKLQlpbnQgcmV0LCBpOwotCi0jaWYgV0FUQ0hfRVhFQwotCURSTV9JTkZPKCJidWZmZXJzX3B0ciAlZCBidWZmZXJfY291bnQgJWQgbGVuICUwOHhcbiIsCi0JCSAgKGludCkgYXJncy0+YnVmZmVyc19wdHIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgYXJncy0+YmF0Y2hfbGVuKTsKLSNlbmRpZgotCi0JaWYgKGFyZ3MtPmJ1ZmZlcl9jb3VudCA8IDEpIHsKLQkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggJWQgYnVmZmVyc1xuIiwgYXJncy0+YnVmZmVyX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQ29weSBpbiB0aGUgZXhlYyBsaXN0IGZyb20gdXNlcmxhbmQgKi8KLQlleGVjX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlY19saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKLQlleGVjMl9saXN0ID0gZHJtX21hbGxvY19hYihzaXplb2YoKmV4ZWMyX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChleGVjX2xpc3QgPT0gTlVMTCB8fCBleGVjMl9saXN0ID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXhlYyBsaXN0IGZvciAlZCBidWZmZXJzXG4iLAotCQkJICBhcmdzLT5idWZmZXJfY291bnQpOwotCQlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOwotCQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJldCA9IGNvcHlfZnJvbV91c2VyKGV4ZWNfbGlzdCwKLQkJCSAgICAgKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQotCQkJICAgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKLQkJCSAgICAgc2l6ZW9mKCpleGVjX2xpc3QpICogYXJncy0+YnVmZmVyX2NvdW50KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJRFJNX0VSUk9SKCJjb3B5ICVkIGV4ZWMgZW50cmllcyBmYWlsZWQgJWRcbiIsCi0JCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKLQkJZHJtX2ZyZWVfbGFyZ2UoZXhlY19saXN0KTsKLQkJZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykgewotCQlleGVjMl9saXN0W2ldLmhhbmRsZSA9IGV4ZWNfbGlzdFtpXS5oYW5kbGU7Ci0JCWV4ZWMyX2xpc3RbaV0ucmVsb2NhdGlvbl9jb3VudCA9IGV4ZWNfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50OwotCQlleGVjMl9saXN0W2ldLnJlbG9jc19wdHIgPSBleGVjX2xpc3RbaV0ucmVsb2NzX3B0cjsKLQkJZXhlYzJfbGlzdFtpXS5hbGlnbm1lbnQgPSBleGVjX2xpc3RbaV0uYWxpZ25tZW50OwotCQlleGVjMl9saXN0W2ldLm9mZnNldCA9IGV4ZWNfbGlzdFtpXS5vZmZzZXQ7Ci0JCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCi0JCQlleGVjMl9saXN0W2ldLmZsYWdzID0gRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0U7Ci0JCWVsc2UKLQkJCWV4ZWMyX2xpc3RbaV0uZmxhZ3MgPSAwOwotCX0KLQotCWV4ZWMyLmJ1ZmZlcnNfcHRyID0gYXJncy0+YnVmZmVyc19wdHI7Ci0JZXhlYzIuYnVmZmVyX2NvdW50ID0gYXJncy0+YnVmZmVyX2NvdW50OwotCWV4ZWMyLmJhdGNoX3N0YXJ0X29mZnNldCA9IGFyZ3MtPmJhdGNoX3N0YXJ0X29mZnNldDsKLQlleGVjMi5iYXRjaF9sZW4gPSBhcmdzLT5iYXRjaF9sZW47Ci0JZXhlYzIuRFIxID0gYXJncy0+RFIxOwotCWV4ZWMyLkRSNCA9IGFyZ3MtPkRSNDsKLQlleGVjMi5udW1fY2xpcHJlY3RzID0gYXJncy0+bnVtX2NsaXByZWN0czsKLQlleGVjMi5jbGlwcmVjdHNfcHRyID0gYXJncy0+Y2xpcHJlY3RzX3B0cjsKLQlleGVjMi5mbGFncyA9IEk5MTVfRVhFQ19SRU5ERVI7Ci0KLQlyZXQgPSBpOTE1X2dlbV9kb19leGVjYnVmZmVyKGRldiwgZGF0YSwgZmlsZV9wcml2LCAmZXhlYzIsIGV4ZWMyX2xpc3QpOwotCWlmICghcmV0KSB7Ci0JCS8qIENvcHkgdGhlIG5ldyBidWZmZXIgb2Zmc2V0cyBiYWNrIHRvIHRoZSB1c2VyJ3MgZXhlYyBsaXN0LiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspCi0JCQlleGVjX2xpc3RbaV0ub2Zmc2V0ID0gZXhlYzJfbGlzdFtpXS5vZmZzZXQ7Ci0JCS8qIC4uLiBhbmQgYmFjayBvdXQgdG8gdXNlcnNwYWNlICovCi0JCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCi0JCQkJICAgKHVpbnRwdHJfdCkgYXJncy0+YnVmZmVyc19wdHIsCi0JCQkJICAgZXhlY19saXN0LAotCQkJCSAgIHNpemVvZigqZXhlY19saXN0KSAqIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlEUk1fRVJST1IoImZhaWxlZCB0byBjb3B5ICVkIGV4ZWMgZW50cmllcyAiCi0JCQkJICAiYmFjayB0byB1c2VyICglZClcbiIsCi0JCQkJICBhcmdzLT5idWZmZXJfY291bnQsIHJldCk7Ci0JCX0KLQl9Ci0KLQlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOwotCWRybV9mcmVlX2xhcmdlKGV4ZWMyX2xpc3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludAotaTkxNV9nZW1fZXhlY2J1ZmZlcjIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYzJfbGlzdCA9IE5VTEw7Ci0JaW50IHJldDsKLQotI2lmIFdBVENIX0VYRUMKLQlEUk1fSU5GTygiYnVmZmVyc19wdHIgJWQgYnVmZmVyX2NvdW50ICVkIGxlbiAlMDh4XG4iLAotCQkgIChpbnQpIGFyZ3MtPmJ1ZmZlcnNfcHRyLCBhcmdzLT5idWZmZXJfY291bnQsIGFyZ3MtPmJhdGNoX2xlbik7Ci0jZW5kaWYKLQotCWlmIChhcmdzLT5idWZmZXJfY291bnQgPCAxKSB7Ci0JCURSTV9FUlJPUigiZXhlY2J1ZjIgd2l0aCAlZCBidWZmZXJzXG4iLCBhcmdzLT5idWZmZXJfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlleGVjMl9saXN0ID0gZHJtX21hbGxvY19hYihzaXplb2YoKmV4ZWMyX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChleGVjMl9saXN0ID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXhlYyBsaXN0IGZvciAlZCBidWZmZXJzXG4iLAotCQkJICBhcmdzLT5idWZmZXJfY291bnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0ID0gY29weV9mcm9tX3VzZXIoZXhlYzJfbGlzdCwKLQkJCSAgICAgKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQotCQkJICAgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKLQkJCSAgICAgc2l6ZW9mKCpleGVjMl9saXN0KSAqIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCURSTV9FUlJPUigiY29weSAlZCBleGVjIGVudHJpZXMgZmFpbGVkICVkXG4iLAotCQkJICBhcmdzLT5idWZmZXJfY291bnQsIHJldCk7Ci0JCWRybV9mcmVlX2xhcmdlKGV4ZWMyX2xpc3QpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9kb19leGVjYnVmZmVyKGRldiwgZGF0YSwgZmlsZV9wcml2LCBhcmdzLCBleGVjMl9saXN0KTsKLQlpZiAoIXJldCkgewotCQkvKiBDb3B5IHRoZSBuZXcgYnVmZmVyIG9mZnNldHMgYmFjayB0byB0aGUgdXNlcidzIGV4ZWMgbGlzdC4gKi8KLQkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2k5MTVfcmVsb2NhdGlvbl9lbnRyeSBfX3VzZXIgKikKLQkJCQkgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKLQkJCQkgICBleGVjMl9saXN0LAotCQkJCSAgIHNpemVvZigqZXhlYzJfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY29weSAlZCBleGVjIGVudHJpZXMgIgotCQkJCSAgImJhY2sgdG8gdXNlciAoJWQpXG4iLAotCQkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOwotCQl9Ci0JfQotCi0JZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1pOTE1X2dlbV9vYmplY3RfcGluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCB1aW50MzJfdCBhbGlnbm1lbnQpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlpbnQgcmV0OwogCi0JQlVHX09OKG9ial9wcml2LT5waW5fY291bnQgPT0gRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUElOX0NPVU5UKTsKKwlCVUdfT04ob2JqLT5waW5fY291bnQgPT0gRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUElOX0NPVU5UKTsKIAlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogCi0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgIT0gTlVMTCkgewotCQlpZiAoYWxpZ25tZW50ID09IDApCi0JCQlhbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopOwotCQlpZiAob2JqX3ByaXYtPmd0dF9vZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkpIHsKLQkJCVdBUk4ob2JqX3ByaXYtPnBpbl9jb3VudCwKLQkJCSAgICAgImJvIGlzIGFscmVhZHkgcGlubmVkIHdpdGggaW5jb3JyZWN0IGFsaWdubWVudDogb2Zmc2V0PSV4LCByZXEuYWxpZ25tZW50PSV4XG4iLAotCQkJICAgICBvYmpfcHJpdi0+Z3R0X29mZnNldCwgYWxpZ25tZW50KTsKKwlpZiAob2JqLT5ndHRfc3BhY2UgIT0gTlVMTCkgeworCQlpZiAoKGFsaWdubWVudCAmJiBvYmotPmd0dF9vZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkpIHx8CisJCSAgICAobWFwX2FuZF9mZW5jZWFibGUgJiYgIW9iai0+bWFwX2FuZF9mZW5jZWFibGUpKSB7CisJCQlXQVJOKG9iai0+cGluX2NvdW50LAorCQkJICAgICAiYm8gaXMgYWxyZWFkeSBwaW5uZWQgd2l0aCBpbmNvcnJlY3QgYWxpZ25tZW50OiIKKwkJCSAgICAgIiBvZmZzZXQ9JXgsIHJlcS5hbGlnbm1lbnQ9JXgsIHJlcS5tYXBfYW5kX2ZlbmNlYWJsZT0lZCwiCisJCQkgICAgICIgb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZT0lZFxuIiwKKwkJCSAgICAgb2JqLT5ndHRfb2Zmc2V0LCBhbGlnbm1lbnQsCisJCQkgICAgIG1hcF9hbmRfZmVuY2VhYmxlLAorCQkJICAgICBvYmotPm1hcF9hbmRfZmVuY2VhYmxlKTsKIAkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAotCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgYWxpZ25tZW50KTsKKwlpZiAob2JqLT5ndHRfc3BhY2UgPT0gTlVMTCkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBhbGlnbm1lbnQsCisJCQkJCQkgIG1hcF9hbmRfZmVuY2VhYmxlKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQogCi0Jb2JqX3ByaXYtPnBpbl9jb3VudCsrOwotCi0JLyogSWYgdGhlIG9iamVjdCBpcyBub3QgYWN0aXZlIGFuZCBub3QgcGVuZGluZyBhIGZsdXNoLAotCSAqIHJlbW92ZSBpdCBmcm9tIHRoZSBpbmFjdGl2ZSBsaXN0Ci0JICovCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQgPT0gMSkgewotCQlpOTE1X2dlbV9pbmZvX2FkZF9waW4oZGV2X3ByaXYsIG9iai0+c2l6ZSk7Ci0JCWlmICghb2JqX3ByaXYtPmFjdGl2ZSkKLQkJCWxpc3RfbW92ZV90YWlsKCZvYmpfcHJpdi0+bW1fbGlzdCwKKwlpZiAob2JqLT5waW5fY291bnQrKyA9PSAwKSB7CisJCWlmICghb2JqLT5hY3RpdmUpCisJCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5tbV9saXN0LAogCQkJCSAgICAgICAmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0KTsKIAl9CisJb2JqLT5waW5fbWFwcGFibGUgfD0gbWFwX2FuZF9mZW5jZWFibGU7CiAKIAlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogCXJldHVybiAwOwogfQogCiB2b2lkCi1pOTE1X2dlbV9vYmplY3RfdW5waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfdW5waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAogCVdBUk5fT04oaTkxNV92ZXJpZnlfbGlzdHMoZGV2KSk7Ci0Jb2JqX3ByaXYtPnBpbl9jb3VudC0tOwotCUJVR19PTihvYmpfcHJpdi0+cGluX2NvdW50IDwgMCk7Ci0JQlVHX09OKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCk7CisJQlVHX09OKG9iai0+cGluX2NvdW50ID09IDApOworCUJVR19PTihvYmotPmd0dF9zcGFjZSA9PSBOVUxMKTsKIAotCS8qIElmIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIHBpbm5lZCwgYW5kIGlzCi0JICogbmVpdGhlciBhY3RpdmUgbm9yIGJlaW5nIGZsdXNoZWQsIHRoZW4gc3RpY2sgaXQgb24KLQkgKiB0aGUgaW5hY3RpdmUgbGlzdAotCSAqLwotCWlmIChvYmpfcHJpdi0+cGluX2NvdW50ID09IDApIHsKLQkJaWYgKCFvYmpfcHJpdi0+YWN0aXZlKQotCQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LAorCWlmICgtLW9iai0+cGluX2NvdW50ID09IDApIHsKKwkJaWYgKCFvYmotPmFjdGl2ZSkKKwkJCWxpc3RfbW92ZV90YWlsKCZvYmotPm1tX2xpc3QsCiAJCQkJICAgICAgICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7Ci0JCWk5MTVfZ2VtX2luZm9fcmVtb3ZlX3BpbihkZXZfcHJpdiwgb2JqLT5zaXplKTsKKwkJb2JqLT5waW5fbWFwcGFibGUgPSBmYWxzZTsKIAl9CiAJV0FSTl9PTihpOTE1X3ZlcmlmeV9saXN0cyhkZXYpKTsKIH0KIAogaW50CiBpOTE1X2dlbV9waW5faW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BpbiAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldDsKIAogCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWlmIChvYmpfcHJpdi0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsKKwlpZiAob2JqLT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgewogCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gcGluIGEgcHVyZ2VhYmxlIGJ1ZmZlclxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChvYmpfcHJpdi0+cGluX2ZpbHAgIT0gTlVMTCAmJiBvYmpfcHJpdi0+cGluX2ZpbHAgIT0gZmlsZV9wcml2KSB7CisJaWYgKG9iai0+cGluX2ZpbHAgIT0gTlVMTCAmJiBvYmotPnBpbl9maWxwICE9IGZpbGUpIHsKIAkJRFJNX0VSUk9SKCJBbHJlYWR5IHBpbm5lZCBpbiBpOTE1X2dlbV9waW5faW9jdGwoKTogJWRcbiIsCiAJCQkgIGFyZ3MtPmhhbmRsZSk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAotCW9ial9wcml2LT51c2VyX3Bpbl9jb3VudCsrOwotCW9ial9wcml2LT5waW5fZmlscCA9IGZpbGVfcHJpdjsKLQlpZiAob2JqX3ByaXYtPnVzZXJfcGluX2NvdW50ID09IDEpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIGFyZ3MtPmFsaWdubWVudCk7CisJb2JqLT51c2VyX3Bpbl9jb3VudCsrOworCW9iai0+cGluX2ZpbHAgPSBmaWxlOworCWlmIChvYmotPnVzZXJfcGluX2NvdW50ID09IDEpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIGFyZ3MtPmFsaWdubWVudCwgdHJ1ZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC00Mjk1LDkgKzMzNTAsOSBAQAogCSAqIGFzIHRoZSBYIHNlcnZlciBkb2Vzbid0IG1hbmFnZSBkb21haW5zIHlldAogCSAqLwogCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKG9iaik7Ci0JYXJncy0+b2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJYXJncy0+b2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0Owogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTQzMDUsMzggKzMzNjAsMzYgQEAKIAogaW50CiBpOTE1X2dlbV91bnBpbl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BpbiAqYXJncyA9IGRhdGE7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldDsKIAogCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWlmIChvYmpfcHJpdi0+cGluX2ZpbHAgIT0gZmlsZV9wcml2KSB7CisJaWYgKG9iai0+cGluX2ZpbHAgIT0gZmlsZSkgewogCQlEUk1fRVJST1IoIk5vdCBwaW5uZWQgYnkgY2FsbGVyIGluIGk5MTVfZ2VtX3Bpbl9pb2N0bCgpOiAlZFxuIiwKIAkJCSAgYXJncy0+aGFuZGxlKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQotCW9ial9wcml2LT51c2VyX3Bpbl9jb3VudC0tOwotCWlmIChvYmpfcHJpdi0+dXNlcl9waW5fY291bnQgPT0gMCkgewotCQlvYmpfcHJpdi0+cGluX2ZpbHAgPSBOVUxMOworCW9iai0+dXNlcl9waW5fY291bnQtLTsKKwlpZiAob2JqLT51c2VyX3Bpbl9jb3VudCA9PSAwKSB7CisJCW9iai0+cGluX2ZpbHAgPSBOVUxMOwogCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIAl9CiAKIG91dDoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC00MzQ0LDQ4ICszMzk3LDUwIEBACiAKIGludAogaTkxNV9nZW1fYnVzeV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9idXN5ICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCiAJLyogQ291bnQgYWxsIGFjdGl2ZSBvYmplY3RzIGFzIGJ1c3ksIGV2ZW4gaWYgdGhleSBhcmUgY3VycmVudGx5IG5vdCB1c2VkCiAJICogYnkgdGhlIGdwdS4gVXNlcnMgb2YgdGhpcyBpbnRlcmZhY2UgZXhwZWN0IG9iamVjdHMgdG8gZXZlbnR1YWxseQogCSAqIGJlY29tZSBub24tYnVzeSB3aXRob3V0IGFueSBmdXJ0aGVyIGFjdGlvbnMsIHRoZXJlZm9yZSBlbWl0IGFueQogCSAqIG5lY2Vzc2FyeSBmbHVzaGVzIGhlcmUuCiAJICovCi0JYXJncy0+YnVzeSA9IG9ial9wcml2LT5hY3RpdmU7CisJYXJncy0+YnVzeSA9IG9iai0+YWN0aXZlOwogCWlmIChhcmdzLT5idXN5KSB7CiAJCS8qIFVuY29uZGl0aW9uYWxseSBmbHVzaCBvYmplY3RzLCBldmVuIHdoZW4gdGhlIGdwdSBzdGlsbCB1c2VzIHRoaXMKIAkJICogb2JqZWN0LiBVc2Vyc3BhY2UgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluZGljYXRlcyB0aGF0IGl0IHdhbnRzIHRvCiAJCSAqIHVzZSB0aGlzIGJ1ZmZlciByYXRoZXIgc29vbmVyIHRoYW4gbGF0ZXIsIHNvIGlzc3VpbmcgdGhlIHJlcXVpcmVkCiAJCSAqIGZsdXNoIGVhcmxpZXIgaXMgYmVuZWZpY2lhbC4KIAkJICovCi0JCWlmIChvYmotPndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSB7Ci0JCQlpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwgZmlsZV9wcml2LAotCQkJCQkgICAgb2JqX3ByaXYtPnJpbmcsCi0JCQkJCSAgICAwLCBvYmotPndyaXRlX2RvbWFpbik7Ci0JCX0gZWxzZSBpZiAob2JqX3ByaXYtPnJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCkgeworCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSB7CisJCQlyZXQgPSBpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwgb2JqLT5yaW5nLAorCQkJCQkJICAwLCBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKKwkJfSBlbHNlIGlmIChvYmotPnJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCA9PQorCQkJICAgb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubykgeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OworCiAJCQkvKiBUaGlzIHJpbmcgaXMgbm90IGJlaW5nIGNsZWFyZWQgYnkgYWN0aXZlIHVzYWdlLAogCQkJICogc28gZW1pdCBhIHJlcXVlc3QgdG8gZG8gc28uCiAJCQkgKi8KLQkJCXUzMiBzZXFubyA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LAotCQkJCQkJICAgICBOVUxMLCBOVUxMLAotCQkJCQkJICAgICBvYmpfcHJpdi0+cmluZyk7Ci0JCQlpZiAoc2Vxbm8gPT0gMCkKKwkJCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCQkJaWYgKHJlcXVlc3QpCisJCQkJcmV0ID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsCisJCQkJCQkgICAgICAgTlVMTCwgcmVxdWVzdCwKKwkJCQkJCSAgICAgICBvYmotPnJpbmcpOworCQkJZWxzZQogCQkJCXJldCA9IC1FTk9NRU07CiAJCX0KIApAQCAtNDM5NCwxMiArMzQ0OSwxMiBAQAogCQkgKiBhcmUgYWN0dWFsbHkgdW5tYXNrZWQsIGFuZCBvdXIgd29ya2luZyBzZXQgZW5kcyB1cCBiZWluZwogCQkgKiBsYXJnZXIgdGhhbiByZXF1aXJlZC4KIAkJICovCi0JCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgb2JqX3ByaXYtPnJpbmcpOworCQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhkZXYsIG9iai0+cmluZyk7CiAKLQkJYXJncy0+YnVzeSA9IG9ial9wcml2LT5hY3RpdmU7CisJCWFyZ3MtPmJ1c3kgPSBvYmotPmFjdGl2ZTsKIAl9CiAKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC00NDE3LDggKzM0NzIsNyBAQAogCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChhcmdzLT5tYWR2KSB7CkBAIC00NDMzLDM3ICszNDg3LDM2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQpIHsKKwlpZiAob2JqLT5waW5fY291bnQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG9ial9wcml2LT5tYWR2ICE9IF9fSTkxNV9NQURWX1BVUkdFRCkKLQkJb2JqX3ByaXYtPm1hZHYgPSBhcmdzLT5tYWR2OworCWlmIChvYmotPm1hZHYgIT0gX19JOTE1X01BRFZfUFVSR0VEKQorCQlvYmotPm1hZHYgPSBhcmdzLT5tYWR2OwogCiAJLyogaWYgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYm91bmQsIGRpc2NhcmQgaXRzIGJhY2tpbmcgc3RvcmFnZSAqLwotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSAmJgotCSAgICBvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqKSAmJgorCSAgICBvYmotPmd0dF9zcGFjZSA9PSBOVUxMKQogCQlpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUob2JqKTsKIAotCWFyZ3MtPnJldGFpbmVkID0gb2JqX3ByaXYtPm1hZHYgIT0gX19JOTE1X01BRFZfUFVSR0VEOworCWFyZ3MtPnJldGFpbmVkID0gb2JqLT5tYWR2ICE9IF9fSTkxNV9NQURWX1BVUkdFRDsKIAogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IGRybV9nZW1fb2JqZWN0ICogaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplKQorc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmk5MTVfZ2VtX2FsbG9jX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJICBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CkBAIC00NDg2LDExICszNTM5LDE1IEBACiAJb2JqLT5iYXNlLmRyaXZlcl9wcml2YXRlID0gTlVMTDsKIAlvYmotPmZlbmNlX3JlZyA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7CiAJSU5JVF9MSVNUX0hFQUQoJm9iai0+bW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+Z3R0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZvYmotPnJpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+ZXhlY19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmb2JqLT5ncHVfd3JpdGVfbGlzdCk7CiAJb2JqLT5tYWR2ID0gSTkxNV9NQURWX1dJTExORUVEOworCS8qIEF2b2lkIGFuIHVubmVjZXNzYXJ5IGNhbGwgdG8gdW5iaW5kIG9uIHRoZSBmaXJzdCBiaW5kLiAqLworCW9iai0+bWFwX2FuZF9mZW5jZWFibGUgPSB0cnVlOwogCi0JcmV0dXJuICZvYmotPmJhc2U7CisJcmV0dXJuIG9iajsKIH0KIAogaW50IGk5MTVfZ2VtX2luaXRfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQpAQCAtNDUwMCw0MiArMzU1Nyw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQorc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3RfdGFpbChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCWludCByZXQ7CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpIHsKLQkJbGlzdF9tb3ZlKCZvYmpfcHJpdi0+bW1fbGlzdCwKKwkJbGlzdF9tb3ZlKCZvYmotPm1tX2xpc3QsCiAJCQkgICZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0KTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChvYmpfcHJpdi0+bW1hcF9vZmZzZXQpCisJaWYgKG9iai0+YmFzZS5tYXBfbGlzdC5tYXApCiAJCWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKIAotCWRybV9nZW1fb2JqZWN0X3JlbGVhc2Uob2JqKTsKLQlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+c2l6ZSk7CisJZHJtX2dlbV9vYmplY3RfcmVsZWFzZSgmb2JqLT5iYXNlKTsKKwlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+YmFzZS5zaXplKTsKIAotCWtmcmVlKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCk7Ci0Ja2ZyZWUob2JqX3ByaXYtPmJpdF8xNyk7Ci0Ja2ZyZWUob2JqX3ByaXYpOworCWtmcmVlKG9iai0+cGFnZV9jcHVfdmFsaWQpOworCWtmcmVlKG9iai0+Yml0XzE3KTsKKwlrZnJlZShvYmopOwogfQogCi12b2lkIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQordm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbV9vYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKGdlbV9vYmopOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2Rlc3Ryb3kob2JqKTsKIAotCXdoaWxlIChvYmpfcHJpdi0+cGluX2NvdW50ID4gMCkKKwl3aGlsZSAob2JqLT5waW5fY291bnQgPiAwKQogCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIAotCWlmIChvYmpfcHJpdi0+cGh5c19vYmopCisJaWYgKG9iai0+cGh5c19vYmopCiAJCWk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChkZXYsIG9iaik7CiAKIAlpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKG9iaik7CkBAIC00NTYyLDEzICszNjE4LDE1IEBACiAKIAkvKiBVbmRlciBVTVMsIGJlIHBhcmFub2lkIGFuZCBldmljdC4gKi8KIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2KTsKKwkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2LCBmYWxzZSk7CiAJCWlmIChyZXQpIHsKIAkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAorCWk5MTVfZ2VtX3Jlc2V0X2ZlbmNlcyhkZXYpOworCiAJLyogSGFjayEgIERvbid0IGxldCBhbnlib2R5IGRvIGV4ZWNidWYgd2hpbGUgd2UgZG9uJ3QgY29udHJvbCB0aGUgY2hpcC4KIAkgKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhpcyB3aXRoIGEgc2VtYXBob3JlLCBvciBzb21ldGhpbmcuCiAJICogQW5kIG5vdCBjb25mb3VuZCBtbS5zdXNwZW5kZWQhCkBAIC00NTg3LDgyICszNjQ1LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiA5NjUrIHN1cHBvcnQgUElQRV9DT05UUk9MIGNvbW1hbmRzLCB3aGljaCBwcm92aWRlIGZpbmVyIGdyYWluZWQgY29udHJvbAotICogb3ZlciBjYWNoZSBmbHVzaGluZy4KLSAqLwotc3RhdGljIGludAotaTkxNV9nZW1faW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0JaW50IHJldDsKLQotCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIDQwOTYpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzZXFubyBwYWdlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlvYmpfcHJpdi0+YWdwX3R5cGUgPSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOwotCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDQwOTYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucmVmOwotCi0JZGV2X3ByaXYtPnNlcW5vX2dmeF9hZGRyID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JZGV2X3ByaXYtPnNlcW5vX3BhZ2UgPSAga21hcChvYmpfcHJpdi0+cGFnZXNbMF0pOwotCWlmIChkZXZfcHJpdi0+c2Vxbm9fcGFnZSA9PSBOVUxMKQotCQlnb3RvIGVycl91bnBpbjsKLQotCWRldl9wcml2LT5zZXFub19vYmogPSBvYmo7Ci0JbWVtc2V0KGRldl9wcml2LT5zZXFub19wYWdlLCAwLCBQQUdFX1NJWkUpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLWVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2NsZWFudXBfcGlwZV9jb250cm9sKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCi0Jb2JqID0gZGV2X3ByaXYtPnNlcW5vX29iajsKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Ja3VubWFwKG9ial9wcml2LT5wYWdlc1swXSk7Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQlkZXZfcHJpdi0+c2Vxbm9fb2JqID0gTlVMTDsKLQotCWRldl9wcml2LT5zZXFub19wYWdlID0gTlVMTDsKLX0KLQogaW50CiBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0OwogCi0JaWYgKEhBU19QSVBFX0NPTlRST0woZGV2KSkgewotCQlyZXQgPSBpOTE1X2dlbV9pbml0X3BpcGVfY29udHJvbChkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSBpbnRlbF9pbml0X3JlbmRlcl9yaW5nX2J1ZmZlcihkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF9waXBlX2NvbnRyb2w7CisJCXJldHVybiByZXQ7CiAKIAlpZiAoSEFTX0JTRChkZXYpKSB7CiAJCXJldCA9IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKGRldik7CkBAIC00NjgxLDEyICszNjcyLDkgQEAKIAlyZXR1cm4gMDsKIAogY2xlYW51cF9ic2RfcmluZzoKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7CisJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CiBjbGVhbnVwX3JlbmRlcl9yaW5nOgotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLWNsZWFudXBfcGlwZV9jb250cm9sOgotCWlmIChIQVNfUElQRV9DT05UUk9MKGRldikpCi0JCWk5MTVfZ2VtX2NsZWFudXBfcGlwZV9jb250cm9sKGRldik7CisJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbUkNTXSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDY5NCwxMiArMzY4MiwxMCBAQAogaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CiAKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOwotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKLQlpZiAoSEFTX1BJUEVfQ09OVFJPTChkZXYpKQotCQlpOTE1X2dlbV9jbGVhbnVwX3BpcGVfY29udHJvbChkZXYpOworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKCZkZXZfcHJpdi0+cmluZ1tpXSk7CiB9CiAKIGludApAQCAtNDcwNyw3ICszNjkzLDcgQEAKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm4gMDsKQEAgLTQ3MjcsMTQgKzM3MTMsMTIgQEAKIAl9CiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+YnNkX3JpbmcuYWN0aXZlX2xpc3QpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5ibHRfcmluZy5hY3RpdmVfbGlzdCkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+YnNkX3JpbmcucmVxdWVzdF9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+Ymx0X3JpbmcucmVxdWVzdF9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmluZ1tpXS5hY3RpdmVfbGlzdCkpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW2ldLnJlcXVlc3RfbGlzdCkpOworCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOwpAQCAtNDc5NiwxNyArMzc4MCwxNCBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5tbS5kZWZlcnJlZF9mcmVlX2xpc3QpOwotCWluaXRfcmluZ19saXN0cygmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpbml0X3JpbmdfbGlzdHMoJmRldl9wcml2LT5ic2RfcmluZyk7Ci0JaW5pdF9yaW5nX2xpc3RzKCZkZXZfcHJpdi0+Ymx0X3JpbmcpOworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0uZ3R0X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlpbml0X3JpbmdfbGlzdHMoJmRldl9wcml2LT5yaW5nW2ldKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5mZW5jZV9yZWdzW2ldLmxydV9saXN0KTsKIAlJTklUX0RFTEFZRURfV09SSygmZGV2X3ByaXYtPm1tLnJldGlyZV93b3JrLAogCQkJICBpOTE1X2dlbV9yZXRpcmVfd29ya19oYW5kbGVyKTsKIAlpbml0X2NvbXBsZXRpb24oJmRldl9wcml2LT5lcnJvcl9jb21wbGV0aW9uKTsKLQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOwotCWxpc3RfYWRkKCZkZXZfcHJpdi0+bW0uc2hyaW5rX2xpc3QsICZzaHJpbmtfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNocmlua19saXN0X2xvY2spOwogCiAJLyogT24gR0VOMyB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIEFSQiBDMyBMUCBiaXQgaXMgc2V0ICovCiAJaWYgKElTX0dFTjMoZGV2KSkgewpAQCAtNDgxOCw2ICszNzk5LDggQEAKIAkJfQogCX0KIAorCWRldl9wcml2LT5yZWxhdGl2ZV9jb25zdGFudHNfbW9kZSA9IEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX0dFTkVSQUw7CisKIAkvKiBPbGQgWCBkcml2ZXJzIHdpbGwgdGFrZSAwLTIgZm9yIGZyb250LCBiYWNrLCBkZXB0aCBidWZmZXJzICovCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlkZXZfcHJpdi0+ZmVuY2VfcmVnX3N0YXJ0ID0gMzsKQEAgLTQ4NDksNiArMzgzMiwxMCBAQAogCX0KIAlpOTE1X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZShkZXYpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOworCisJZGV2X3ByaXYtPm1tLmluYWN0aXZlX3Nocmlua2VyLnNocmluayA9IGk5MTVfZ2VtX2luYWN0aXZlX3NocmluazsKKwlkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIuc2Vla3MgPSBERUZBVUxUX1NFRUtTOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIpOwogfQogCiAvKgpAQCAtNDkxOCw0NyArMzkwNSw0NyBAQAogfQogCiB2b2lkIGk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWNoYXIgKnZhZGRyOwogCWludCBpOwotCWludCByZXQ7CiAJaW50IHBhZ2VfY291bnQ7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaWYgKCFvYmpfcHJpdi0+cGh5c19vYmopCisJaWYgKCFvYmotPnBoeXNfb2JqKQogCQlyZXR1cm47CisJdmFkZHIgPSBvYmotPnBoeXNfb2JqLT5oYW5kbGUtPnZhZGRyOwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmosIDApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKLQorCXBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCWNoYXIgKmRzdCA9IGttYXBfYXRvbWljKG9ial9wcml2LT5wYWdlc1tpXSk7Ci0JCWNoYXIgKnNyYyA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCisJCQkJCQkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoIUlTX0VSUihwYWdlKSkgeworCQkJY2hhciAqZHN0ID0ga21hcF9hdG9taWMocGFnZSk7CisJCQltZW1jcHkoZHN0LCB2YWRkciArIGkqUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQkJa3VubWFwX2F0b21pYyhkc3QpOwogCi0JCW1lbWNweShkc3QsIHNyYywgUEFHRV9TSVpFKTsKLQkJa3VubWFwX2F0b21pYyhkc3QpOworCQkJZHJtX2NsZmx1c2hfcGFnZXMoJnBhZ2UsIDEpOworCisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfQogCX0KLQlkcm1fY2xmbHVzaF9wYWdlcyhvYmpfcHJpdi0+cGFnZXMsIHBhZ2VfY291bnQpOwotCWRybV9hZ3BfY2hpcHNldF9mbHVzaChkZXYpOworCWludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKCk7CiAKLQlpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7Ci1vdXQ6Ci0Jb2JqX3ByaXYtPnBoeXNfb2JqLT5jdXJfb2JqID0gTlVMTDsKLQlvYmpfcHJpdi0+cGh5c19vYmogPSBOVUxMOworCW9iai0+cGh5c19vYmotPmN1cl9vYmogPSBOVUxMOworCW9iai0+cGh5c19vYmogPSBOVUxMOwogfQogCiBpbnQKIGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICAgaW50IGlkLAogCQkJICAgIGludCBhbGlnbikKIHsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwogCWludCByZXQgPSAwOwogCWludCBwYWdlX2NvdW50OwogCWludCBpOwpAQCAtNDk2NiwxMCArMzk1Myw4IEBACiAJaWYgKGlkID4gSTkxNV9NQVhfUEhZU19PQkpFQ1QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JaWYgKG9ial9wcml2LT5waHlzX29iaikgewotCQlpZiAob2JqX3ByaXYtPnBoeXNfb2JqLT5pZCA9PSBpZCkKKwlpZiAob2JqLT5waHlzX29iaikgeworCQlpZiAob2JqLT5waHlzX29iai0+aWQgPT0gaWQpCiAJCQlyZXR1cm4gMDsKIAkJaTkxNV9nZW1fZGV0YWNoX3BoeXNfb2JqZWN0KGRldiwgb2JqKTsKIAl9CkBAIC00OTc3LDUxICszOTYyLDUwIEBACiAJLyogY3JlYXRlIGEgbmV3IG9iamVjdCAqLwogCWlmICghZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdKSB7CiAJCXJldCA9IGk5MTVfZ2VtX2luaXRfcGh5c19vYmplY3QoZGV2LCBpZCwKLQkJCQkJCW9iai0+c2l6ZSwgYWxpZ24pOworCQkJCQkJb2JqLT5iYXNlLnNpemUsIGFsaWduKTsKIAkJaWYgKHJldCkgewotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBwaHlzIG9iamVjdCAlZCBzaXplOiAlenVcbiIsIGlkLCBvYmotPnNpemUpOwotCQkJZ290byBvdXQ7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IHBoeXMgb2JqZWN0ICVkIHNpemU6ICV6dVxuIiwKKwkJCQkgIGlkLCBvYmotPmJhc2Uuc2l6ZSk7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJLyogYmluZCB0byB0aGUgb2JqZWN0ICovCi0Jb2JqX3ByaXYtPnBoeXNfb2JqID0gZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdOwotCW9ial9wcml2LT5waHlzX29iai0+Y3VyX29iaiA9IG9iajsKKwlvYmotPnBoeXNfb2JqID0gZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdOworCW9iai0+cGh5c19vYmotPmN1cl9vYmogPSBvYmo7CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaiwgMCk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgcGFnZSBsaXN0XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKKwlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCWNoYXIgKnNyYyA9IGttYXBfYXRvbWljKG9ial9wcml2LT5wYWdlc1tpXSk7Ci0JCWNoYXIgKmRzdCA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWNoYXIgKmRzdCwgKnNyYzsKIAorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpLAorCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKworCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwkJZHN0ID0gb2JqLT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKIAkJbWVtY3B5KGRzdCwgc3JjLCBQQUdFX1NJWkUpOwogCQlrdW5tYXBfYXRvbWljKHNyYyk7CisKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQogCi0JaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwotCiAJcmV0dXJuIDA7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAotaTkxNV9nZW1fcGh5c19wd3JpdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCiAJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQl2b2lkICp2YWRkciA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIGFyZ3MtPm9mZnNldDsKKwl2b2lkICp2YWRkciA9IG9iai0+cGh5c19vYmotPmhhbmRsZS0+dmFkZHIgKyBhcmdzLT5vZmZzZXQ7CiAJY2hhciBfX3VzZXIgKnVzZXJfZGF0YSA9IChjaGFyIF9fdXNlciAqKSAodWludHB0cl90KSBhcmdzLT5kYXRhX3B0cjsKIAotCURSTV9ERUJVR19EUklWRVIoInZhZGRyICVwLCAlbGxkXG4iLCB2YWRkciwgYXJncy0+c2l6ZSk7Ci0KIAlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pY19ub2NhY2hlKHZhZGRyLCB1c2VyX2RhdGEsIGFyZ3MtPnNpemUpKSB7CiAJCXVuc2lnbmVkIGxvbmcgdW53cml0dGVuOwogCkBAIC01MDM2LDcgKzQwMjAsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7CisJaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA3NCwxNDQgKzQwNTgsNjggQEAKIH0KIAogc3RhdGljIGludAotaTkxNV9nZW1fc2hyaW5rKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLCBpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spCitpOTE1X2dlbV9pbmFjdGl2ZV9zaHJpbmsoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKKwkJCSBpbnQgbnJfdG9fc2NhbiwKKwkJCSBnZnBfdCBnZnBfbWFzaykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCAqbmV4dF9kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2LCAqbmV4dF9vYmo7Ci0JaW50IGNudCA9IDA7Ci0JaW50IHdvdWxkX2RlYWRsb2NrID0gMTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQljb250YWluZXJfb2Yoc2hyaW5rZXIsCisJCQkgICAgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLAorCQkJICAgICBtbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm5leHQ7CisJaW50IGNudDsKKworCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpKQorCQlyZXR1cm4gMDsKIAogCS8qICJmYXN0LXBhdGgiIHRvIGNvdW50IG51bWJlciBvZiBhdmFpbGFibGUgb2JqZWN0cyAqLwogCWlmIChucl90b19zY2FuID09IDApIHsKLQkJc3Bpbl9sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfcHJpdiwgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgewotCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0KLQkJCWlmIChtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpIHsKLQkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LAotCQkJCQkJICAgICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJCSAgICBtbV9saXN0KQotCQkJCQljbnQrKzsKLQkJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQkJcmV0dXJuIChjbnQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKKwkJY250ID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosCisJCQkJICAgICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgICAgbW1fbGlzdCkKKwkJCWNudCsrOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0dXJuIGNudCAvIDEwMCAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiAJfQogCi0Jc3Bpbl9sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQogcmVzY2FuOgogCS8qIGZpcnN0IHNjYW4gZm9yIGNsZWFuIGJ1ZmZlcnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2X3ByaXYsIG5leHRfZGV2LAotCQkJCSAmc2hyaW5rX2xpc3QsIG1tLnNocmlua19saXN0KSB7Ci0JCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOwogCi0JCWlmICghIG11dGV4X3RyeWxvY2soJmRldi0+c3RydWN0X211dGV4KSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKLQkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJIG1tX2xpc3QpIHsKLQkJCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSkgewotCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQoJm9ial9wcml2LT5iYXNlKTsKLQkJCQlpZiAoLS1ucl90b19zY2FuIDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCisJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgbW1fbGlzdCkgeworCQlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmopKSB7CisJCQlpZiAoaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopID09IDAgJiYKKwkJCSAgICAtLW5yX3RvX3NjYW4gPT0gMCkKKwkJCQlicmVhazsKIAkJfQotCi0JCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JCXdvdWxkX2RlYWRsb2NrID0gMDsKLQotCQlpZiAobnJfdG9fc2NhbiA8PSAwKQotCQkJYnJlYWs7CiAJfQogCiAJLyogc2Vjb25kIHBhc3MsIGV2aWN0L2NvdW50IGFueXRoaW5nIHN0aWxsIG9uIHRoZSBpbmFjdGl2ZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9wcml2LCBuZXh0X2RldiwKLQkJCQkgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgewotCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQotCQlpZiAoISBtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKLQkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJIG1tX2xpc3QpIHsKLQkJCWlmIChucl90b19zY2FuID4gMCkgewotCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQoJm9ial9wcml2LT5iYXNlKTsKLQkJCQlucl90b19zY2FuLS07Ci0JCQl9IGVsc2UKLQkJCQljbnQrKzsKLQkJfQotCi0JCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JCXdvdWxkX2RlYWRsb2NrID0gMDsKKwljbnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCisJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgbW1fbGlzdCkgeworCQlpZiAobnJfdG9fc2NhbiAmJgorCQkgICAgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopID09IDApCisJCQlucl90b19zY2FuLS07CisJCWVsc2UKKwkJCWNudCsrOwogCX0KIAotCWlmIChucl90b19zY2FuKSB7Ci0JCWludCBhY3RpdmUgPSAwOwotCisJaWYgKG5yX3RvX3NjYW4gJiYgaTkxNV9ncHVfaXNfYWN0aXZlKGRldikpIHsKIAkJLyoKIAkJICogV2UgYXJlIGRlc3BlcmF0ZSBmb3IgcGFnZXMsIHNvIGFzIGEgbGFzdCByZXNvcnQsIHdhaXQKIAkJICogZm9yIHRoZSBHUFUgdG8gZmluaXNoIGFuZCBkaXNjYXJkIHdoYXRldmVyIHdlIGNhbi4KIAkJICogVGhpcyBoYXMgYSBkcmFtYXRpYyBpbXBhY3QgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YKIAkJICogT09NLWtpbGxlciBldmVudHMgd2hpbHN0IHJ1bm5pbmcgdGhlIEdQVSBhZ2dyZXNzaXZlbHkuCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9wcml2LCAmc2hyaW5rX2xpc3QsIG1tLnNocmlua19saXN0KSB7Ci0JCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQotCQkJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCi0JCQkJY29udGludWU7Ci0KLQkJCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQotCQkJaWYgKGk5MTVfZ3B1X2lzX2FjdGl2ZShkZXYpKSB7Ci0JCQkJaTkxNV9ncHVfaWRsZShkZXYpOwotCQkJCWFjdGl2ZSsrOwotCQkJfQotCi0JCQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCX0KLQotCQlpZiAoYWN0aXZlKQorCQlpZiAoaTkxNV9ncHVfaWRsZShkZXYpID09IDApCiAJCQlnb3RvIHJlc2NhbjsKIAl9Ci0KLQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQlpZiAod291bGRfZGVhZGxvY2spCi0JCXJldHVybiAtMTsKLQllbHNlIGlmIChjbnQgPiAwKQotCQlyZXR1cm4gKGNudCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgc2hyaW5rZXIgPSB7Ci0JLnNocmluayA9IGk5MTVfZ2VtX3NocmluaywKLQkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAotfTsKLQotX19pbml0IHZvaWQKLWk5MTVfZ2VtX3Nocmlua2VyX2luaXQodm9pZCkKLXsKLSAgICByZWdpc3Rlcl9zaHJpbmtlcigmc2hyaW5rZXIpOwotfQotCi1fX2V4aXQgdm9pZAotaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCh2b2lkKQotewotICAgIHVucmVnaXN0ZXJfc2hyaW5rZXIoJnNocmlua2VyKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gY250IC8gMTAwICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kZWJ1Zy5jCmluZGV4IDQ4NjQ0YjguLjI5ZDAxNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZGVidWcuYwpAQCAtMTUyLDEzICsxNTIsMTIgQEAKIH0KIAogdm9pZAotaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBsZW4sCitpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgbGVuLAogCQkgICAgIGNvbnN0IGNoYXIgKndoZXJlLCB1aW50MzJfdCBtYXJrKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJaW50IHBhZ2U7CiAKLQlEUk1fSU5GTygiJXM6IG9iamVjdCBhdCBvZmZzZXQgJTA4eFxuIiwgd2hlcmUsIG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKKwlEUk1fSU5GTygiJXM6IG9iamVjdCBhdCBvZmZzZXQgJTA4eFxuIiwgd2hlcmUsIG9iai0+Z3R0X29mZnNldCk7CiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IChsZW4gKyBQQUdFX1NJWkUtMSkgLyBQQUdFX1NJWkU7IHBhZ2UrKykgewogCQlpbnQgcGFnZV9sZW4sIGNodW5rLCBjaHVua19sZW47CiAKQEAgLTE3MCw5ICsxNjksOSBAQAogCQkJY2h1bmtfbGVuID0gcGFnZV9sZW4gLSBjaHVuazsKIAkJCWlmIChjaHVua19sZW4gPiAxMjgpCiAJCQkJY2h1bmtfbGVuID0gMTI4OwotCQkJaTkxNV9nZW1fZHVtcF9wYWdlKG9ial9wcml2LT5wYWdlc1twYWdlXSwKKwkJCWk5MTVfZ2VtX2R1bXBfcGFnZShvYmotPnBhZ2VzW3BhZ2VdLAogCQkJCQkgICBjaHVuaywgY2h1bmsgKyBjaHVua19sZW4sCi0JCQkJCSAgIG9ial9wcml2LT5ndHRfb2Zmc2V0ICsKKwkJCQkJICAgb2JqLT5ndHRfb2Zmc2V0ICsKIAkJCQkJICAgcGFnZSAqIFBBR0VfU0laRSwKIAkJCQkJICAgbWFyayk7CiAJCX0KQEAgLTE4MiwyMSArMTgxLDE5IEBACiAKICNpZiBXQVRDSF9DT0hFUkVOQ1kKIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9jaGVja19jb2hlcmVuY3koc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBoYW5kbGUpCitpOTE1X2dlbV9vYmplY3RfY2hlY2tfY29oZXJlbmN5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIGludCBoYW5kbGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJaW50IHBhZ2U7CiAJdWludDMyX3QgKmd0dF9tYXBwaW5nOwogCXVpbnQzMl90ICpiYWNraW5nX21hcCA9IE5VTEw7CiAJaW50IGJhZF9jb3VudCA9IDA7CiAKIAlEUk1fSU5GTygiJXM6IGNoZWNraW5nIGNvaGVyZW5jeSBvZiBvYmplY3QgJXBAMHglMDh4ICglZCwgJXpka2IpOlxuIiwKLQkJIF9fZnVuY19fLCBvYmosIG9ial9wcml2LT5ndHRfb2Zmc2V0LCBoYW5kbGUsCisJCSBfX2Z1bmNfXywgb2JqLCBvYmotPmd0dF9vZmZzZXQsIGhhbmRsZSwKIAkJIG9iai0+c2l6ZSAvIDEwMjQpOwogCi0JZ3R0X21hcHBpbmcgPSBpb3JlbWFwKGRldi0+YWdwLT5iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQsCi0JCQkgICAgICBvYmotPnNpemUpOworCWd0dF9tYXBwaW5nID0gaW9yZW1hcChkZXYtPmFncC0+YmFzZSArIG9iai0+Z3R0X29mZnNldCwgb2JqLT5iYXNlLnNpemUpOwogCWlmIChndHRfbWFwcGluZyA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCBHVFQgc3BhY2VcbiIpOwogCQlyZXR1cm47CkBAIC0yMDUsNyArMjAyLDcgQEAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgb2JqLT5zaXplIC8gUEFHRV9TSVpFOyBwYWdlKyspIHsKIAkJaW50IGk7CiAKLQkJYmFja2luZ19tYXAgPSBrbWFwX2F0b21pYyhvYmpfcHJpdi0+cGFnZXNbcGFnZV0sIEtNX1VTRVIwKTsKKwkJYmFja2luZ19tYXAgPSBrbWFwX2F0b21pYyhvYmotPnBhZ2VzW3BhZ2VdLCBLTV9VU0VSMCk7CiAKIAkJaWYgKGJhY2tpbmdfbWFwID09IE5VTEwpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCBiYWNraW5nIHBhZ2VcbiIpOwpAQCAtMjIwLDcgKzIxNyw3IEBACiAJCQlpZiAoY3B1dmFsICE9IGd0dHZhbCkgewogCQkJCURSTV9JTkZPKCJpbmNvaGVyZW50IENQVSB2cyBHUFUgYXQgMHglMDh4OiAiCiAJCQkJCSAiMHglMDh4IHZzIDB4JTA4eFxuIiwKLQkJCQkJIChpbnQpKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsKKwkJCQkJIChpbnQpKG9iai0+Z3R0X29mZnNldCArCiAJCQkJCSAgICAgICBwYWdlICogUEFHRV9TSVpFICsgaSAqIDQpLAogCQkJCQkgY3B1dmFsLCBndHR2YWwpOwogCQkJCWlmIChiYWRfY291bnQrKyA+PSA4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYwppbmRleCBkOGFlN2QxLi4zZDM5MDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKQEAgLTMyLDI4ICszMiwzNiBAQAogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAKIHN0YXRpYyBib29sCi1tYXJrX2ZyZWUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2LAotCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnVud2luZCkKK21hcmtfZnJlZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBzdHJ1Y3QgbGlzdF9oZWFkICp1bndpbmQpCiB7Ci0JbGlzdF9hZGQoJm9ial9wcml2LT5ldmljdF9saXN0LCB1bndpbmQpOwotCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOwotCXJldHVybiBkcm1fbW1fc2Nhbl9hZGRfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSk7CisJbGlzdF9hZGQoJm9iai0+ZXhlY19saXN0LCB1bndpbmQpOworCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwlyZXR1cm4gZHJtX21tX3NjYW5fYWRkX2Jsb2NrKG9iai0+Z3R0X3NwYWNlKTsKIH0KIAogaW50Ci1pOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQpCitpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLAorCQkJIHVuc2lnbmVkIGFsaWdubWVudCwgYm9vbCBtYXBwYWJsZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGV2aWN0aW9uX2xpc3QsIHVud2luZF9saXN0OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQgPSAwOwogCiAJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CiAKIAkvKiBSZS1jaGVjayBmb3IgZnJlZSBzcGFjZSBhZnRlciByZXRpcmluZyByZXF1ZXN0cyAqLwotCWlmIChkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsCi0JCQkgICAgICAgbWluX3NpemUsIGFsaWdubWVudCwgMCkpCi0JCXJldHVybiAwOworCWlmIChtYXBwYWJsZSkgeworCQlpZiAoZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAorCQkJCQkJbWluX3NpemUsIGFsaWdubWVudCwgMCwKKwkJCQkJCWRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kLAorCQkJCQkJMCkpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAorCQkJCSAgICAgICBtaW5fc2l6ZSwgYWxpZ25tZW50LCAwKSkKKwkJCXJldHVybiAwOworCX0KIAogCS8qCiAJICogVGhlIGdvYWwgaXMgdG8gZXZpY3Qgb2JqZWN0cyBhbmQgYW1hbGdhbWF0ZSBzcGFjZSBpbiBMUlUgb3JkZXIuCkBAIC03OSw0NSArODcsNTYgQEAKIAkgKi8KIAogCUlOSVRfTElTVF9IRUFEKCZ1bndpbmRfbGlzdCk7Ci0JZHJtX21tX2luaXRfc2NhbigmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwgbWluX3NpemUsIGFsaWdubWVudCk7CisJaWYgKG1hcHBhYmxlKQorCQlkcm1fbW1faW5pdF9zY2FuX3dpdGhfcmFuZ2UoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsIG1pbl9zaXplLAorCQkJCQkgICAgYWxpZ25tZW50LCAwLAorCQkJCQkgICAgZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQpOworCWVsc2UKKwkJZHJtX21tX2luaXRfc2NhbigmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwgbWluX3NpemUsIGFsaWdubWVudCk7CiAKIAkvKiBGaXJzdCBzZWUgaWYgdGhlcmUgaXMgYSBsYXJnZSBlbm91Z2ggY29udGlndW91cyBpZGxlIHJlZ2lvbi4uLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgewotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKG1hcmtfZnJlZShvYmosICZ1bndpbmRfbGlzdCkpCiAJCQlnb3RvIGZvdW5kOwogCX0KIAogCS8qIE5vdyBtZXJnZSBpbiB0aGUgc29vbi10by1iZS1leHBpcmVkIG9iamVjdHMuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKIAkJLyogRG9lcyB0aGUgb2JqZWN0IHJlcXVpcmUgYW4gb3V0c3RhbmRpbmcgZmx1c2g/ICovCi0JCWlmIChvYmpfcHJpdi0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqX3ByaXYtPnBpbl9jb3VudCkKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCQlpZiAobWFya19mcmVlKG9iaiwgJnVud2luZF9saXN0KSkKIAkJCWdvdG8gZm91bmQ7CiAJfQogCiAJLyogRmluYWxseSBhZGQgYW55dGhpbmcgd2l0aCBhIHBlbmRpbmcgZmx1c2ggKGluIG9yZGVyIG9mIHJldGlyZW1lbnQpICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LCBtbV9saXN0KSB7Ci0JCWlmIChvYmpfcHJpdi0+cGluX2NvdW50KQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKG9iai0+cGluX2NvdW50KQogCQkJY29udGludWU7CiAKLQkJaWYgKG1hcmtfZnJlZShvYmpfcHJpdiwgJnVud2luZF9saXN0KSkKKwkJaWYgKG1hcmtfZnJlZShvYmosICZ1bndpbmRfbGlzdCkpCiAJCQlnb3RvIGZvdW5kOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7Ci0JCWlmICghIG9ial9wcml2LT5iYXNlLndyaXRlX2RvbWFpbiB8fCBvYmpfcHJpdi0+cGluX2NvdW50KQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CisJCWlmICghIG9iai0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCQlpZiAobWFya19mcmVlKG9iaiwgJnVud2luZF9saXN0KSkKIAkJCWdvdG8gZm91bmQ7CiAJfQogCiAJLyogTm90aGluZyBmb3VuZCwgY2xlYW4gdXAgYW5kIGJhaWwgb3V0ISAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZ1bndpbmRfbGlzdCwgZXZpY3RfbGlzdCkgewotCQlyZXQgPSBkcm1fbW1fc2Nhbl9yZW1vdmVfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ1bndpbmRfbGlzdCkpIHsKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmdW53aW5kX2xpc3QsCisJCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgICBleGVjX2xpc3QpOworCisJCXJldCA9IGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayhvYmotPmd0dF9zcGFjZSk7CiAJCUJVR19PTihyZXQpOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOworCisJCWxpc3RfZGVsX2luaXQoJm9iai0+ZXhlY19saXN0KTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJfQogCiAJLyogV2UgZXhwZWN0IHRoZSBjYWxsZXIgdG8gdW5waW4sIGV2aWN0IGFsbCBhbmQgdHJ5IGFnYWluLCBvciBnaXZlIHVwLgpAQCAtMTMxLDMzICsxNTAsMzQgQEAKIAkgKiB0ZW1wb3JhcnkgbGlzdC4gKi8KIAlJTklUX0xJU1RfSEVBRCgmZXZpY3Rpb25fbGlzdCk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ1bndpbmRfbGlzdCkpIHsKLQkJb2JqX3ByaXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ1bndpbmRfbGlzdCwKLQkJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAotCQkJCQkgICAgZXZpY3RfbGlzdCk7Ci0JCWlmIChkcm1fbW1fc2Nhbl9yZW1vdmVfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSkpIHsKLQkJCWxpc3RfbW92ZSgmb2JqX3ByaXYtPmV2aWN0X2xpc3QsICZldmljdGlvbl9saXN0KTsKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmdW53aW5kX2xpc3QsCisJCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgICBleGVjX2xpc3QpOworCQlpZiAoZHJtX21tX3NjYW5fcmVtb3ZlX2Jsb2NrKG9iai0+Z3R0X3NwYWNlKSkgeworCQkJbGlzdF9tb3ZlKCZvYmotPmV4ZWNfbGlzdCwgJmV2aWN0aW9uX2xpc3QpOwogCQkJY29udGludWU7CiAJCX0KLQkJbGlzdF9kZWwoJm9ial9wcml2LT5ldmljdF9saXN0KTsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9ial9wcml2LT5iYXNlKTsKKwkJbGlzdF9kZWxfaW5pdCgmb2JqLT5leGVjX2xpc3QpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAl9CiAKIAkvKiBVbmJpbmRpbmcgd2lsbCBlbWl0IGFueSByZXF1aXJlZCBmbHVzaGVzICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZldmljdGlvbl9saXN0KSkgewotCQlvYmpfcHJpdiA9IGxpc3RfZmlyc3RfZW50cnkoJmV2aWN0aW9uX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJICAgIGV2aWN0X2xpc3QpOworCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZldmljdGlvbl9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCQkgICAgICAgZXhlY19saXN0KTsKIAkJaWYgKHJldCA9PSAwKQotCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZCgmb2JqX3ByaXYtPmJhc2UpOwotCQlsaXN0X2RlbCgmb2JqX3ByaXYtPmV2aWN0X2xpc3QpOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOworCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOworCisJCWxpc3RfZGVsX2luaXQoJm9iai0+ZXhlY19saXN0KTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAogaW50Ci1pOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgcHVyZ2VhYmxlX29ubHkpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldDsKQEAgLTE3NiwzNiArMTk2LDIyIEBACiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSk7CiAKLQlyZXQgPSBpOTE1X2dlbV9ldmljdF9pbmFjdGl2ZShkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCkgJiYKLQkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgotCQkgICAgICAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0c19lbXB0eSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2LCBwdXJnZWFibGVfb25seSk7CiB9CiAKIC8qKiBVbmJpbmRzIGFsbCBpbmFjdGl2ZSBvYmplY3RzLiAqLwogaW50Ci1pOTE1X2dlbV9ldmljdF9pbmFjdGl2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoraTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBwdXJnZWFibGVfb25seSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqbmV4dDsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpKSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCQlpbnQgcmV0OwotCi0JCW9iaiA9ICZsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCW1tX2xpc3QpLT5iYXNlOwotCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlEUk1fRVJST1IoIkVycm9yIHVuYmluZGluZyBvYmplY3Q6ICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCBuZXh0LAorCQkJCSAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKCFwdXJnZWFibGVfb25seSB8fCBvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CisJCQlpbnQgcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmZGY0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtMCwwICsxLDEzNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCwyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICogICAgQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKworc3RydWN0IGNoYW5nZV9kb21haW5zIHsKKwl1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnM7CisJdWludDMyX3QgZmx1c2hfZG9tYWluczsKKwl1aW50MzJfdCBmbHVzaF9yaW5nczsKK307CisKKy8qCisgKiBTZXQgdGhlIG5leHQgZG9tYWluIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhpcworICogbWF5IG5vdCBhY3R1YWxseSBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgZmx1c2hpbmcvaW52YWxpZGluZyB0aG91Z2gsCisgKiBhcyB0aGF0IG1heSB3YW50IHRvIGJlIGJhdGNoZWQgd2l0aCBvdGhlciBzZXRfZG9tYWluIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGlzICh3ZSBob3BlKSB0aGUgb25seSByZWFsbHkgdHJpY2t5IHBhcnQgb2YgZ2VtLiBUaGUgZ29hbAorICogaXMgZmFpcmx5IHNpbXBsZSAtLSB0cmFjayB3aGljaCBjYWNoZXMgaG9sZCBiaXRzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBtYWtlIHN1cmUgdGhleSByZW1haW4gY29oZXJlbnQuIEEgZmV3IGNvbmNyZXRlIGV4YW1wbGVzIG1heQorICogaGVscCB0byBleHBsYWluIGhvdyBpdCB3b3Jrcy4gRm9yIHNob3J0aGFuZCwgd2UgdXNlIHRoZSBub3RhdGlvbgorICogKHJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluKSwgZS5nLiAoQ1BVLCBDUFUpIHRvIGluZGljYXRlIHRoZQorICogYSBwYWlyIG9mIHJlYWQgYW5kIHdyaXRlIGRvbWFpbiBtYXNrcy4KKyAqCisgKiBDYXNlIDE6IHRoZSBiYXRjaCBidWZmZXIKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkzLiBNYXBwZWQgdG8gR1RUCisgKgk0LiBSZWFkIGJ5IEdQVQorICoJNS4gVW5tYXBwZWQgZnJvbSBHVFQKKyAqCTYuIEZyZWVkCisgKgorICoJTGV0J3MgdGFrZSB0aGVzZSBhIHN0ZXAgYXQgYSB0aW1lCisgKgorICoJMS4gQWxsb2NhdGVkCisgKgkJUGFnZXMgYWxsb2NhdGVkIGZyb20gdGhlIGtlcm5lbCBtYXkgc3RpbGwgaGF2ZQorICoJCWNhY2hlIGNvbnRlbnRzLCBzbyB3ZSBzZXQgdGhlbSB0byAoQ1BVLCBDUFUpIGFsd2F5cy4KKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVICh1c2luZyBwd3JpdGUpCisgKgkJVGhlIHB3cml0ZSBmdW5jdGlvbiBjYWxscyBzZXRfZG9tYWluIChDUFUsIENQVSkgYW5kCisgKgkJdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgKGFzIG5vdGhpbmcgY2hhbmdlcykKKyAqCTMuIE1hcHBlZCBieSBHVFQKKyAqCQlUaGlzIGZ1bmN0aW9uIGFzc2VydHMgdGhhdCB0aGUgb2JqZWN0IGlzIG5vdAorICoJCWN1cnJlbnRseSBpbiBhbnkgR1BVLWJhc2VkIHJlYWQgb3Igd3JpdGUgZG9tYWlucworICoJNC4gUmVhZCBieSBHUFUKKyAqCQlpOTE1X2dlbV9leGVjYnVmZmVyIGNhbGxzIHNldF9kb21haW4gKENPTU1BTkQsIDApLgorICoJCUFzIHdyaXRlX2RvbWFpbiBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIGFkZHMgaW4gdGhlCisgKgkJY3VycmVudCByZWFkIGRvbWFpbnMgKENQVStDT01NQU5ELCAwKS4KKyAqCQlmbHVzaF9kb21haW5zIGlzIHNldCB0byBDUFUuCisgKgkJaW52YWxpZGF0ZV9kb21haW5zIGlzIHNldCB0byBDT01NQU5ECisgKgkJY2xmbHVzaCBpcyBydW4gdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBDUFUgY2FjaGVzCisgKgkJdGhlbiBpOTE1X2Rldl9zZXRfZG9tYWluIGNhbGxzIGk5MTVfZ2VtX2ZsdXNoIHRvCisgKgkJZW1pdCBhbiBNSV9GTFVTSCBhbmQgZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKgk1LiBVbm1hcHBlZCBmcm9tIEdUVAorICoJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQgY2FsbHMgc2V0X2RvbWFpbiAoQ1BVLCBDUFUpCisgKgkJZmx1c2hfZG9tYWlucyBhbmQgaW52YWxpZGF0ZV9kb21haW5zIGVuZCB1cCBib3RoIHplcm8KKyAqCQlzbyBubyBmbHVzaGluZy9pbnZhbGlkYXRpbmcgaGFwcGVucworICoJNi4gRnJlZWQKKyAqCQl5YXksIGRvbmUKKyAqCisgKiBDYXNlIDI6IFRoZSBzaGFyZWQgcmVuZGVyIGJ1ZmZlcgorICoKKyAqCTEuIEFsbG9jYXRlZAorICoJMi4gTWFwcGVkIHRvIEdUVAorICoJMy4gUmVhZC93cml0dGVuIGJ5IEdQVQorICoJNC4gc2V0X2RvbWFpbiB0byAoQ1BVLENQVSkKKyAqCTUuIFJlYWQvd3JpdHRlbiBieSBDUFUKKyAqCTYuIFJlYWQvd3JpdHRlbiBieSBHUFUKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCQlTYW1lIGFzIGxhc3QgZXhhbXBsZSwgKENQVSwgQ1BVKQorICoJMi4gTWFwcGVkIHRvIEdUVAorICoJCU5vdGhpbmcgY2hhbmdlcyAoYXNzZXJ0aW9ucyBmaW5kIHRoYXQgaXQgaXMgbm90IGluIHRoZSBHUFUpCisgKgkzLiBSZWFkL3dyaXR0ZW4gYnkgR1BVCisgKgkJZXhlY2J1ZmZlciBjYWxscyBzZXRfZG9tYWluIChSRU5ERVIsIFJFTkRFUikKKyAqCQlmbHVzaF9kb21haW5zIGdldHMgQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zIGdldHMgR1BVCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNIIGFuZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2gKKyAqCTQuIHNldF9kb21haW4gKENQVSwgQ1BVKQorICoJCWZsdXNoX2RvbWFpbnMgZ2V0cyBHUFUKKyAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgZ2V0cyBDUFUKKyAqCQl3YWl0X3JlbmRlcmluZyAob2JqKSB0byBtYWtlIHN1cmUgYWxsIGRyYXdpbmcgaXMgY29tcGxldGUuCisgKgkJVGhpcyB3aWxsIGluY2x1ZGUgYW4gTUlfRkxVU0ggdG8gZ2V0IHRoZSBkYXRhIGZyb20gR1BVCisgKgkJdG8gbWVtb3J5CisgKgkJY2xmbHVzaCAob2JqKSB0byBpbnZhbGlkYXRlIHRoZSBDUFUgY2FjaGUKKyAqCQlBbm90aGVyIE1JX0ZMVVNIIGluIGk5MTVfZ2VtX2ZsdXNoIChlbGltaW5hdGUgdGhpcyBzb21laG93PykKKyAqCTUuIFJlYWQvd3JpdHRlbiBieSBDUFUKKyAqCQljYWNoZSBsaW5lcyBhcmUgbG9hZGVkIGFuZCBkaXJ0aWVkCisgKgk2LiBSZWFkIHdyaXR0ZW4gYnkgR1BVCisgKgkJU2FtZSBhcyBsYXN0IEdQVSBhY2Nlc3MKKyAqCisgKiBDYXNlIDM6IFRoZSBjb25zdGFudCBidWZmZXIKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkzLiBSZWFkIGJ5IEdQVQorICoJNC4gVXBkYXRlZCAod3JpdHRlbikgYnkgQ1BVIGFnYWluCisgKgk1LiBSZWFkIGJ5IEdQVQorICoKKyAqCTEuIEFsbG9jYXRlZAorICoJCShDUFUsIENQVSkKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkJKENQVSwgQ1BVKQorICoJMy4gUmVhZCBieSBHUFUKKyAqCQkoQ1BVK1JFTkRFUiwgMCkKKyAqCQlmbHVzaF9kb21haW5zID0gQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zID0gUkVOREVSCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNICisgKgkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKgk0LiBVcGRhdGVkICh3cml0dGVuKSBieSBDUFUgYWdhaW4KKyAqCQkoQ1BVLCBDUFUpCisgKgkJZmx1c2hfZG9tYWlucyA9IDAgKG5vIHByZXZpb3VzIHdyaXRlIGRvbWFpbikKKyAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgPSAwIChubyBuZXcgcmVhZCBkb21haW5zKQorICoJNS4gUmVhZCBieSBHUFUKKyAqCQkoQ1BVK1JFTkRFUiwgMCkKKyAqCQlmbHVzaF9kb21haW5zID0gQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zID0gUkVOREVSCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNICisgKgkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2dwdV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgIHN0cnVjdCBjaGFuZ2VfZG9tYWlucyAqY2QpCit7CisJdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zID0gMCwgZmx1c2hfZG9tYWlucyA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBvYmplY3QgaXNuJ3QgbW92aW5nIHRvIGEgbmV3IHdyaXRlIGRvbWFpbiwKKwkgKiBsZXQgdGhlIG9iamVjdCBzdGF5IGluIG11bHRpcGxlIHJlYWQgZG9tYWlucworCSAqLworCWlmIChvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKKwkJb2JqLT5iYXNlLnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CisKKwkvKgorCSAqIEZsdXNoIHRoZSBjdXJyZW50IHdyaXRlIGRvbWFpbiBpZgorCSAqIHRoZSBuZXcgcmVhZCBkb21haW5zIGRvbid0IG1hdGNoLiBJbnZhbGlkYXRlCisJICogYW55IHJlYWQgZG9tYWlucyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgb2xkCisJICogd3JpdGUgZG9tYWluCisJICovCisJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiYKKwkgICAgKCgob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSBvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgfHwKKwkgICAgICAgb2JqLT5yaW5nICE9IHJpbmcpKSB8fAorCSAgICAgKG9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgJiYgIW9iai0+cGVuZGluZ19mZW5jZWRfZ3B1X2FjY2VzcykpKSB7CisJCWZsdXNoX2RvbWFpbnMgfD0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwkJaW52YWxpZGF0ZV9kb21haW5zIHw9CisJCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgJiB+b2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwl9CisJLyoKKwkgKiBJbnZhbGlkYXRlIGFueSByZWFkIGNhY2hlcyB3aGljaCBtYXkgaGF2ZQorCSAqIHN0YWxlIGRhdGEuIFRoYXQgaXMsIGFueSBuZXcgcmVhZCBkb21haW5zLgorCSAqLworCWludmFsaWRhdGVfZG9tYWlucyB8PSBvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgJiB+b2JqLT5iYXNlLnJlYWRfZG9tYWluczsKKwlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKKwkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKKworCS8qIGJsb3cgYXdheSBtYXBwaW5ncyBpZiBtYXBwZWQgdGhyb3VnaCBHVFQgKi8KKwlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fRE9NQUlOX0dUVCkKKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisKKwkvKiBUaGUgYWN0dWFsIG9iai0+d3JpdGVfZG9tYWluIHdpbGwgYmUgdXBkYXRlZCB3aXRoCisJICogcGVuZGluZ193cml0ZV9kb21haW4gYWZ0ZXIgd2UgZW1pdCB0aGUgYWNjdW11bGF0ZWQgZmx1c2ggZm9yIGFsbAorCSAqIG9mIG91ciBkb21haW4gY2hhbmdlcyBpbiBleGVjYnVmZmVycyAod2hpY2ggY2xlYXJzIG9iamVjdHMnCisJICogd3JpdGVfZG9tYWlucykuICBTbyBpZiB3ZSBoYXZlIGEgY3VycmVudCB3cml0ZSBkb21haW4gdGhhdCB3ZQorCSAqIGFyZW4ndCBjaGFuZ2luZywgc2V0IHBlbmRpbmdfd3JpdGVfZG9tYWluIHRvIHRoYXQuCisJICovCisJaWYgKGZsdXNoX2RvbWFpbnMgPT0gMCAmJiBvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKKwkJb2JqLT5iYXNlLnBlbmRpbmdfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKworCWNkLT5pbnZhbGlkYXRlX2RvbWFpbnMgfD0gaW52YWxpZGF0ZV9kb21haW5zOworCWNkLT5mbHVzaF9kb21haW5zIHw9IGZsdXNoX2RvbWFpbnM7CisJaWYgKGZsdXNoX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykKKwkJY2QtPmZsdXNoX3JpbmdzIHw9IG9iai0+cmluZy0+aWQ7CisJaWYgKGludmFsaWRhdGVfZG9tYWlucyAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQorCQljZC0+Zmx1c2hfcmluZ3MgfD0gcmluZy0+aWQ7Cit9CisKK3N0cnVjdCBlYl9vYmplY3RzIHsKKwlpbnQgYW5kOworCXN0cnVjdCBobGlzdF9oZWFkIGJ1Y2tldHNbMF07Cit9OworCitzdGF0aWMgc3RydWN0IGViX29iamVjdHMgKgorZWJfY3JlYXRlKGludCBzaXplKQoreworCXN0cnVjdCBlYl9vYmplY3RzICplYjsKKwlpbnQgY291bnQgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpIC8gMjsKKwl3aGlsZSAoY291bnQgPiBzaXplKQorCQljb3VudCA+Pj0gMTsKKwllYiA9IGt6YWxsb2MoY291bnQqc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSArCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBlYl9vYmplY3RzKSwKKwkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoZWIgPT0gTlVMTCkKKwkJcmV0dXJuIGViOworCisJZWItPmFuZCA9IGNvdW50IC0gMTsKKwlyZXR1cm4gZWI7Cit9CisKK3N0YXRpYyB2b2lkCitlYl9yZXNldChzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIpCit7CisJbWVtc2V0KGViLT5idWNrZXRzLCAwLCAoZWItPmFuZCsxKSpzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKK30KKworc3RhdGljIHZvaWQKK2ViX2FkZF9vYmplY3Qoc3RydWN0IGViX29iamVjdHMgKmViLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCWhsaXN0X2FkZF9oZWFkKCZvYmotPmV4ZWNfbm9kZSwKKwkJICAgICAgICZlYi0+YnVja2V0c1tvYmotPmV4ZWNfaGFuZGxlICYgZWItPmFuZF0pOworfQorCitzdGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgorZWJfZ2V0X29iamVjdChzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsIHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwloZWFkID0gJmViLT5idWNrZXRzW2hhbmRsZSAmIGViLT5hbmRdOworCWhsaXN0X2Zvcl9lYWNoKG5vZGUsIGhlYWQpIHsKKwkJb2JqID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGV4ZWNfbm9kZSk7CisJCWlmIChvYmotPmV4ZWNfaGFuZGxlID09IGhhbmRsZSkKKwkJCXJldHVybiBvYmo7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitlYl9kZXN0cm95KHN0cnVjdCBlYl9vYmplY3RzICplYikKK3sKKwlrZnJlZShlYik7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICBzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsCisJCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvYykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnRhcmdldF9vYmo7CisJdWludDMyX3QgdGFyZ2V0X29mZnNldDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qIHdlJ3ZlIGFscmVhZHkgaG9sZCBhIHJlZmVyZW5jZSB0byBhbGwgdmFsaWQgb2JqZWN0cyAqLworCXRhcmdldF9vYmogPSAmZWJfZ2V0X29iamVjdChlYiwgcmVsb2MtPnRhcmdldF9oYW5kbGUpLT5iYXNlOworCWlmICh1bmxpa2VseSh0YXJnZXRfb2JqID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXRhcmdldF9vZmZzZXQgPSB0b19pbnRlbF9ibyh0YXJnZXRfb2JqKS0+Z3R0X29mZnNldDsKKworI2lmIFdBVENIX1JFTE9DCisJRFJNX0lORk8oIiVzOiBvYmogJXAgb2Zmc2V0ICUwOHggdGFyZ2V0ICVkICIKKwkJICJyZWFkICUwOHggd3JpdGUgJTA4eCBndHQgJTA4eCAiCisJCSAicHJlc3VtZWQgJTA4eCBkZWx0YSAlMDh4XG4iLAorCQkgX19mdW5jX18sCisJCSBvYmosCisJCSAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkgKGludCkgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCSAoaW50KSByZWxvYy0+cmVhZF9kb21haW5zLAorCQkgKGludCkgcmVsb2MtPndyaXRlX2RvbWFpbiwKKwkJIChpbnQpIHRhcmdldF9vZmZzZXQsCisJCSAoaW50KSByZWxvYy0+cHJlc3VtZWRfb2Zmc2V0LAorCQkgcmVsb2MtPmRlbHRhKTsKKyNlbmRpZgorCisJLyogVGhlIHRhcmdldCBidWZmZXIgc2hvdWxkIGhhdmUgYXBwZWFyZWQgYmVmb3JlIHVzIGluIHRoZQorCSAqIGV4ZWNfb2JqZWN0IGxpc3QsIHNvIGl0IHNob3VsZCBoYXZlIGEgR1RUIHNwYWNlIGJvdW5kIGJ5IG5vdy4KKwkgKi8KKwlpZiAodW5saWtlbHkodGFyZ2V0X29mZnNldCA9PSAwKSkgeworCQlEUk1fRVJST1IoIk5vIEdUVCBzcGFjZSBmb3VuZCBmb3Igb2JqZWN0ICVkXG4iLAorCQkJICByZWxvYy0+dGFyZ2V0X2hhbmRsZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogVmFsaWRhdGUgdGhhdCB0aGUgdGFyZ2V0IGlzIGluIGEgdmFsaWQgci93IEdQVSBkb21haW4gKi8KKwlpZiAodW5saWtlbHkocmVsb2MtPndyaXRlX2RvbWFpbiAmIChyZWxvYy0+d3JpdGVfZG9tYWluIC0gMSkpKSB7CisJCURSTV9FUlJPUigicmVsb2Mgd2l0aCBtdWx0aXBsZSB3cml0ZSBkb21haW5zOiAiCisJCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCisJCQkgICJyZWFkICUwOHggd3JpdGUgJTA4eCIsCisJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCisJCQkgIHJlbG9jLT5yZWFkX2RvbWFpbnMsCisJCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAodW5saWtlbHkoKHJlbG9jLT53cml0ZV9kb21haW4gfCByZWxvYy0+cmVhZF9kb21haW5zKSAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpKSB7CisJCURSTV9FUlJPUigicmVsb2Mgd2l0aCByZWFkL3dyaXRlIENQVSBkb21haW5zOiAiCisJCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCisJCQkgICJyZWFkICUwOHggd3JpdGUgJTA4eCIsCisJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCisJCQkgIHJlbG9jLT5yZWFkX2RvbWFpbnMsCisJCQkgIHJlbG9jLT53cml0ZV9kb21haW4pOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAodW5saWtlbHkocmVsb2MtPndyaXRlX2RvbWFpbiAmJiB0YXJnZXRfb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiAmJgorCQkgICAgIHJlbG9jLT53cml0ZV9kb21haW4gIT0gdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4pKSB7CisJCURSTV9FUlJPUigiV3JpdGUgZG9tYWluIGNvbmZsaWN0OiAiCisJCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCisJCQkgICJuZXcgJTA4eCBvbGQgJTA4eFxuIiwKKwkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKKwkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKKwkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbiwKKwkJCSAgdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXRhcmdldF9vYmotPnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IHJlbG9jLT5yZWFkX2RvbWFpbnM7CisJdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4gfD0gcmVsb2MtPndyaXRlX2RvbWFpbjsKKworCS8qIElmIHRoZSByZWxvY2F0aW9uIGFscmVhZHkgaGFzIHRoZSByaWdodCB2YWx1ZSBpbiBpdCwgbm8KKwkgKiBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgZG9uZS4KKwkgKi8KKwlpZiAodGFyZ2V0X29mZnNldCA9PSByZWxvYy0+cHJlc3VtZWRfb2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBpcyB2YWxpZC4uLiAqLworCWlmICh1bmxpa2VseShyZWxvYy0+b2Zmc2V0ID4gb2JqLT5iYXNlLnNpemUgLSA0KSkgeworCQlEUk1fRVJST1IoIlJlbG9jYXRpb24gYmV5b25kIG9iamVjdCBib3VuZHM6ICIKKwkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkIHNpemUgJWQuXG4iLAorCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJICAoaW50KSBvYmotPmJhc2Uuc2l6ZSk7CisJCXJldHVybiByZXQ7CisJfQorCWlmICh1bmxpa2VseShyZWxvYy0+b2Zmc2V0ICYgMykpIHsKKwkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIG5vdCA0LWJ5dGUgYWxpZ25lZDogIgorCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQuXG4iLAorCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBhbmQgcG9pbnRzIHRvIHNvbWV3aGVyZSB3aXRoaW4gdGhlIHRhcmdldCBvYmplY3QuICovCisJaWYgKHVubGlrZWx5KHJlbG9jLT5kZWx0YSA+PSB0YXJnZXRfb2JqLT5zaXplKSkgeworCQlEUk1fRVJST1IoIlJlbG9jYXRpb24gYmV5b25kIHRhcmdldCBvYmplY3QgYm91bmRzOiAiCisJCQkgICJvYmogJXAgdGFyZ2V0ICVkIGRlbHRhICVkIHNpemUgJWQuXG4iLAorCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJICAoaW50KSByZWxvYy0+ZGVsdGEsCisJCQkgIChpbnQpIHRhcmdldF9vYmotPnNpemUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlbG9jLT5kZWx0YSArPSB0YXJnZXRfb2Zmc2V0OworCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluID09IEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKKwkJdWludDMyX3QgcGFnZV9vZmZzZXQgPSByZWxvYy0+b2Zmc2V0ICYgflBBR0VfTUFTSzsKKwkJY2hhciAqdmFkZHI7CisKKwkJdmFkZHIgPSBrbWFwX2F0b21pYyhvYmotPnBhZ2VzW3JlbG9jLT5vZmZzZXQgPj4gUEFHRV9TSElGVF0pOworCQkqKHVpbnQzMl90ICopKHZhZGRyICsgcGFnZV9vZmZzZXQpID0gcmVsb2MtPmRlbHRhOworCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQl1aW50MzJfdCBfX2lvbWVtICpyZWxvY19lbnRyeTsKKwkJdm9pZCBfX2lvbWVtICpyZWxvY19wYWdlOworCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBNYXAgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbiB3ZSdyZSBnb2luZyB0byBwZXJmb3JtLiAgKi8KKwkJcmVsb2MtPm9mZnNldCArPSBvYmotPmd0dF9vZmZzZXQ7CisJCXJlbG9jX3BhZ2UgPSBpb19tYXBwaW5nX21hcF9hdG9taWNfd2MoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nLAorCQkJCQkJICAgICAgcmVsb2MtPm9mZnNldCAmIFBBR0VfTUFTSyk7CisJCXJlbG9jX2VudHJ5ID0gKHVpbnQzMl90IF9faW9tZW0gKikKKwkJCShyZWxvY19wYWdlICsgKHJlbG9jLT5vZmZzZXQgJiB+UEFHRV9NQVNLKSk7CisJCWlvd3JpdGUzMihyZWxvYy0+ZGVsdGEsIHJlbG9jX2VudHJ5KTsKKwkJaW9fbWFwcGluZ191bm1hcF9hdG9taWMocmVsb2NfcGFnZSk7CisJfQorCisJLyogYW5kIHVwZGF0ZSB0aGUgdXNlcidzIHJlbG9jYXRpb24gZW50cnkgKi8KKwlyZWxvYy0+cHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X29mZnNldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICBzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmVudHJ5ID0gb2JqLT5leGVjX2VudHJ5OworCWludCBpLCByZXQ7CisKKwl1c2VyX3JlbG9jcyA9ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpZW50cnktPnJlbG9jc19wdHI7CisJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5yZWxvY2F0aW9uX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IHJlbG9jOworCisJCWlmIChfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCZyZWxvYywKKwkJCQkJICAgICAgdXNlcl9yZWxvY3MraSwKKwkJCQkJICAgICAgc2l6ZW9mKHJlbG9jKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX2VudHJ5KG9iaiwgZWIsICZyZWxvYyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChfX2NvcHlfdG9fdXNlcl9pbmF0b21pYygmdXNlcl9yZWxvY3NbaV0ucHJlc3VtZWRfb2Zmc2V0LAorCQkJCQkgICAgJnJlbG9jLnByZXN1bWVkX29mZnNldCwKKwkJCQkJICAgIHNpemVvZihyZWxvYy5wcmVzdW1lZF9vZmZzZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdF9zbG93KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSBzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsCisJCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jcykKK3sKKwljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnkgPSBvYmotPmV4ZWNfZW50cnk7CisJaW50IGksIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+cmVsb2NhdGlvbl9jb3VudDsgaSsrKSB7CisJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkob2JqLCBlYiwgJnJlbG9jc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBlYl9vYmplY3RzICplYiwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCByZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgb2JqZWN0cywgZXhlY19saXN0KSB7CisJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfb2JqZWN0KG9iaiwgZWIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCByZXQsIHJldHJ5OworCWJvb2wgaGFzX2ZlbmNlZF9ncHVfYWNjZXNzID0gSU5URUxfSU5GTyhyaW5nLT5kZXYpLT5nZW4gPCA0OworCXN0cnVjdCBsaXN0X2hlYWQgb3JkZXJlZF9vYmplY3RzOworCisJSU5JVF9MSVNUX0hFQUQoJm9yZGVyZWRfb2JqZWN0cyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KG9iamVjdHMpKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICplbnRyeTsKKwkJYm9vbCBuZWVkX2ZlbmNlLCBuZWVkX21hcHBhYmxlOworCisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkob2JqZWN0cywKKwkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgIGV4ZWNfbGlzdCk7CisJCWVudHJ5ID0gb2JqLT5leGVjX2VudHJ5OworCisJCW5lZWRfZmVuY2UgPQorCQkJaGFzX2ZlbmNlZF9ncHVfYWNjZXNzICYmCisJCQllbnRyeS0+ZmxhZ3MgJiBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAmJgorCQkJb2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FOworCQluZWVkX21hcHBhYmxlID0KKwkJCWVudHJ5LT5yZWxvY2F0aW9uX2NvdW50ID8gdHJ1ZSA6IG5lZWRfZmVuY2U7CisKKwkJaWYgKG5lZWRfbWFwcGFibGUpCisJCQlsaXN0X21vdmUoJm9iai0+ZXhlY19saXN0LCAmb3JkZXJlZF9vYmplY3RzKTsKKwkJZWxzZQorCQkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+ZXhlY19saXN0LCAmb3JkZXJlZF9vYmplY3RzKTsKKworCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgPSAwOworCQlvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPSAwOworCX0KKwlsaXN0X3NwbGljZSgmb3JkZXJlZF9vYmplY3RzLCBvYmplY3RzKTsKKworCS8qIEF0dGVtcHQgdG8gcGluIGFsbCBvZiB0aGUgYnVmZmVycyBpbnRvIHRoZSBHVFQuCisJICogVGhpcyBpcyBkb25lIGluIDMgcGhhc2VzOgorCSAqCisJICogMWEuIFVuYmluZCBhbGwgb2JqZWN0cyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgR1RUIGNvbnN0cmFpbnRzIGZvcgorCSAqICAgICB0aGUgZXhlY2J1ZmZlciAoZmVuY2VhYmxlLCBtYXBwYWJsZSwgYWxpZ25tZW50IGV0YykuCisJICogMWIuIEluY3JlbWVudCBwaW4gY291bnQgZm9yIGFscmVhZHkgYm91bmQgb2JqZWN0cy4KKwkgKiAyLiAgQmluZCBuZXcgb2JqZWN0cy4KKwkgKiAzLiAgRGVjcmVtZW50IHBpbiBjb3VudC4KKwkgKgorCSAqIFRoaXMgYXZvaWQgdW5uZWNlc3NhcnkgdW5iaW5kaW5nIG9mIGxhdGVyIG9iamVjdHMgaW4gb3JkZXIgdG8gbWFrcgorCSAqIHJvb20gZm9yIHRoZSBlYXJsaWVyIG9iamVjdHMgKnVubGVzcyogd2UgbmVlZCB0byBkZWZyYWdtZW50LgorCSAqLworCXJldHJ5ID0gMDsKKwlkbyB7CisJCXJldCA9IDA7CisKKwkJLyogVW5iaW5kIGFueSBpbGwtZml0dGluZyBvYmplY3RzIG9yIHBpbi4gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmVudHJ5ID0gb2JqLT5leGVjX2VudHJ5OworCQkJYm9vbCBuZWVkX2ZlbmNlLCBuZWVkX21hcHBhYmxlOworCQkJaWYgKCFvYmotPmd0dF9zcGFjZSkKKwkJCQljb250aW51ZTsKKworCQkJbmVlZF9mZW5jZSA9CisJCQkJaGFzX2ZlbmNlZF9ncHVfYWNjZXNzICYmCisJCQkJZW50cnktPmZsYWdzICYgRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0UgJiYKKwkJCQlvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkU7CisJCQluZWVkX21hcHBhYmxlID0KKwkJCQllbnRyeS0+cmVsb2NhdGlvbl9jb3VudCA/IHRydWUgOiBuZWVkX2ZlbmNlOworCisJCQlpZiAoKGVudHJ5LT5hbGlnbm1lbnQgJiYgb2JqLT5ndHRfb2Zmc2V0ICYgKGVudHJ5LT5hbGlnbm1lbnQgLSAxKSkgfHwKKwkJCSAgICAobmVlZF9tYXBwYWJsZSAmJiAhb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSkpCisJCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOworCQkJZWxzZQorCQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLAorCQkJCQkJCSAgZW50cnktPmFsaWdubWVudCwKKwkJCQkJCQkgIG5lZWRfbWFwcGFibGUpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKworCQkJZW50cnkrKzsKKwkJfQorCisJCS8qIEJpbmQgZnJlc2ggb2JqZWN0cyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgb2JqZWN0cywgZXhlY19saXN0KSB7CisJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnkgPSBvYmotPmV4ZWNfZW50cnk7CisJCQlib29sIG5lZWRfZmVuY2U7CisKKwkJCW5lZWRfZmVuY2UgPQorCQkJCWhhc19mZW5jZWRfZ3B1X2FjY2VzcyAmJgorCQkJCWVudHJ5LT5mbGFncyAmIEVYRUNfT0JKRUNUX05FRURTX0ZFTkNFICYmCisJCQkJb2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FOworCisJCQlpZiAoIW9iai0+Z3R0X3NwYWNlKSB7CisJCQkJYm9vbCBuZWVkX21hcHBhYmxlID0KKwkJCQkJZW50cnktPnJlbG9jYXRpb25fY291bnQgPyB0cnVlIDogbmVlZF9mZW5jZTsKKworCQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLAorCQkJCQkJCSAgZW50cnktPmFsaWdubWVudCwKKwkJCQkJCQkgIG5lZWRfbWFwcGFibGUpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaGFzX2ZlbmNlZF9ncHVfYWNjZXNzKSB7CisJCQkJaWYgKG5lZWRfZmVuY2UpIHsKKwkJCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZShvYmosIHJpbmcsIDEpOworCQkJCQlpZiAocmV0KQorCQkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChlbnRyeS0+ZmxhZ3MgJiBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAmJgorCQkJCQkgICBvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpIHsKKwkJCQkJLyogWFhYIHBpcGVsaW5lZCEgKi8KKwkJCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShvYmopOworCQkJCQlpZiAocmV0KQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW9iai0+cGVuZGluZ19mZW5jZWRfZ3B1X2FjY2VzcyA9IG5lZWRfZmVuY2U7CisJCQl9CisKKwkJCWVudHJ5LT5vZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQ7CisJCX0KKworCQkvKiBEZWNyZW1lbnQgcGluIGNvdW50IGZvciBib3VuZCBvYmplY3RzICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCBvYmplY3RzLCBleGVjX2xpc3QpIHsKKwkJCWlmIChvYmotPmd0dF9zcGFjZSkKKwkJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwkJfQorCisJCWlmIChyZXQgIT0gLUVOT1NQQyB8fCByZXRyeSA+IDEpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIEZpcnN0IGF0dGVtcHQsIGp1c3QgY2xlYXIgYW55dGhpbmcgdGhhdCBpcyBwdXJnZWFibGUuCisJCSAqIFNlY29uZCBhdHRlbXB0LCBjbGVhciB0aGUgZW50aXJlIEdUVC4KKwkJICovCisJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcocmluZy0+ZGV2LCByZXRyeSA9PSAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0cnkrKzsKKwl9IHdoaWxlICgxKTsKKworZXJyOgorCW9iaiA9IGxpc3RfZW50cnkob2JqLT5leGVjX2xpc3QucHJldiwKKwkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCSBleGVjX2xpc3QpOworCXdoaWxlIChvYmplY3RzICE9ICZvYmotPmV4ZWNfbGlzdCkgeworCQlpZiAob2JqLT5ndHRfc3BhY2UpCisJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKworCQlvYmogPSBsaXN0X2VudHJ5KG9iai0+ZXhlY19saXN0LnByZXYsCisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSBleGVjX2xpc3QpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlLAorCQkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cywKKwkJCQkgIHN0cnVjdCBlYl9vYmplY3RzICplYiwKKwkJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjLAorCQkJCSAgaW50IGNvdW50KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2M7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlpbnQgKnJlbG9jX29mZnNldDsKKwlpbnQgaSwgdG90YWwsIHJldDsKKworCS8qIFdlIG1heSBwcm9jZXNzIGFub3RoZXIgZXhlY2J1ZmZlciBkdXJpbmcgdGhlIHVubG9jay4uLiAqLworCXdoaWxlICghbGlzdF9lbXB0eShvYmplY3RzKSkgeworCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KG9iamVjdHMsCisJCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgICBleGVjX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZvYmotPmV4ZWNfbGlzdCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJdG90YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl0b3RhbCArPSBleGVjW2ldLnJlbG9jYXRpb25fY291bnQ7CisKKwlyZWxvY19vZmZzZXQgPSBkcm1fbWFsbG9jX2FiKGNvdW50LCBzaXplb2YoKnJlbG9jX29mZnNldCkpOworCXJlbG9jID0gZHJtX21hbGxvY19hYih0b3RhbCwgc2l6ZW9mKCpyZWxvYykpOworCWlmIChyZWxvYyA9PSBOVUxMIHx8IHJlbG9jX29mZnNldCA9PSBOVUxMKSB7CisJCWRybV9mcmVlX2xhcmdlKHJlbG9jKTsKKwkJZHJtX2ZyZWVfbGFyZ2UocmVsb2Nfb2Zmc2V0KTsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0b3RhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7CisKKwkJdXNlcl9yZWxvY3MgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KWV4ZWNbaV0ucmVsb2NzX3B0cjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocmVsb2MrdG90YWwsIHVzZXJfcmVsb2NzLAorCQkJCSAgIGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCAqIHNpemVvZigqcmVsb2MpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJcmVsb2Nfb2Zmc2V0W2ldID0gdG90YWw7CisJCXRvdGFsICs9IGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudDsKKwl9CisKKwlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiByZWFjcXVpcmUgdGhlIG9iamVjdHMgKi8KKwllYl9yZXNldChlYik7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCQlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLAorCQkJCQkJCWV4ZWNbaV0uaGFuZGxlKSk7CisJCWlmIChvYmogPT0gTlVMTCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIG9iamVjdCBoYW5kbGUgJWQgYXQgaW5kZXggJWRcbiIsCisJCQkJICAgZXhlY1tpXS5oYW5kbGUsIGkpOworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmb2JqLT5leGVjX2xpc3QsIG9iamVjdHMpOworCQlvYmotPmV4ZWNfaGFuZGxlID0gZXhlY1tpXS5oYW5kbGU7CisJCW9iai0+ZXhlY19lbnRyeSA9ICZleGVjW2ldOworCQllYl9hZGRfb2JqZWN0KGViLCBvYmopOworCX0KKworCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVzZXJ2ZShyaW5nLCBmaWxlLCBvYmplY3RzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCBvYmplY3RzLCBleGVjX2xpc3QpIHsKKwkJaW50IG9mZnNldCA9IG9iai0+ZXhlY19lbnRyeSAtIGV4ZWM7CisJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfb2JqZWN0X3Nsb3cob2JqLCBlYiwKKwkJCQkJCQkgICAgICAgcmVsb2MgKyByZWxvY19vZmZzZXRbb2Zmc2V0XSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBMZWF2ZSB0aGUgdXNlciByZWxvY2F0aW9ucyBhcyBhcmUsIHRoaXMgaXMgdGhlIHBhaW5mdWxseSBzbG93IHBhdGgsCisJICogYW5kIHdlIHdhbnQgdG8gYXZvaWQgdGhlIGNvbXBsaWNhdGlvbiBvZiBkcm9wcGluZyB0aGUgbG9jayB3aGlsc3QKKwkgKiBoYXZpbmcgYnVmZmVycyByZXNlcnZlZCBpbiB0aGUgYXBlcnR1cmUgYW5kIHNvIGNhdXNpbmcgc3B1cmlvdXMKKwkgKiBFTk9TUEMgZm9yIHJhbmRvbSBvcGVyYXRpb25zLgorCSAqLworCitlcnI6CisJZHJtX2ZyZWVfbGFyZ2UocmVsb2MpOworCWRybV9mcmVlX2xhcmdlKHJlbG9jX29mZnNldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICB1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnMsCisJCQkgIHVpbnQzMl90IGZsdXNoX2RvbWFpbnMsCisJCQkgIHVpbnQzMl90IGZsdXNoX3JpbmdzKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpLCByZXQ7CisKKwlpZiAoZmx1c2hfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpCisJCWludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKCk7CisKKwlpZiAoZmx1c2hfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9HVFQpCisJCXdtYigpOworCisJaWYgKChmbHVzaF9kb21haW5zIHwgaW52YWxpZGF0ZV9kb21haW5zKSAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSB7CisJCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQkJaWYgKGZsdXNoX3JpbmdzICYgKDEgPDwgaSkpIHsKKwkJCQlyZXQgPSBpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwKKwkJCQkJCQkgICZkZXZfcHJpdi0+cmluZ1tpXSwKKwkJCQkJCQkgIGludmFsaWRhdGVfZG9tYWlucywKKwkJCQkJCQkgIGZsdXNoX2RvbWFpbnMpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfc3luY19yaW5ncyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqdG8pCit7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpmcm9tID0gb2JqLT5yaW5nOworCXUzMiBzZXFubzsKKwlpbnQgcmV0LCBpZHg7CisKKwlpZiAoZnJvbSA9PSBOVUxMIHx8IHRvID09IGZyb20pCisJCXJldHVybiAwOworCisJLyogWFhYIGdwdSBzZW1hcGhvcmVzIGFyZSBjdXJyZW50bHkgY2F1c2luZyBoYXJkIGhhbmdzIG9uIFNOQiBtb2JpbGUgKi8KKwlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuIDwgNiB8fCBJU19NT0JJTEUob2JqLT5iYXNlLmRldikpCisJCXJldHVybiBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCB0cnVlKTsKKworCWlkeCA9IGludGVsX3Jpbmdfc3luY19pbmRleChmcm9tLCB0byk7CisKKwlzZXFubyA9IG9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm87CisJaWYgKHNlcW5vIDw9IGZyb20tPnN5bmNfc2Vxbm9baWR4XSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2Vxbm8gPT0gZnJvbS0+b3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0KSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKKworCQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJlcXVlc3QgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJldCA9IGk5MTVfYWRkX3JlcXVlc3Qob2JqLT5iYXNlLmRldiwgTlVMTCwgcmVxdWVzdCwgZnJvbSk7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHJlcXVlc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNlcW5vID0gcmVxdWVzdC0+c2Vxbm87CisJfQorCisJZnJvbS0+c3luY19zZXFub1tpZHhdID0gc2Vxbm87CisJcmV0dXJuIGludGVsX3Jpbmdfc3luYyh0bywgZnJvbSwgc2Vxbm8gLSAxKTsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9tb3ZlX3RvX2dwdShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBjaGFuZ2VfZG9tYWlucyBjZDsKKwlpbnQgcmV0OworCisJY2QuaW52YWxpZGF0ZV9kb21haW5zID0gMDsKKwljZC5mbHVzaF9kb21haW5zID0gMDsKKwljZC5mbHVzaF9yaW5ncyA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkKKwkJaTkxNV9nZW1fb2JqZWN0X3NldF90b19ncHVfZG9tYWluKG9iaiwgcmluZywgJmNkKTsKKworCWlmIChjZC5pbnZhbGlkYXRlX2RvbWFpbnMgfCBjZC5mbHVzaF9kb21haW5zKSB7CisjaWYgV0FUQ0hfRVhFQworCQlEUk1fSU5GTygiJXM6IGludmFsaWRhdGVfZG9tYWlucyAlMDh4IGZsdXNoX2RvbWFpbnMgJTA4eFxuIiwKKwkJCSAgX19mdW5jX18sCisJCQkgY2QuaW52YWxpZGF0ZV9kb21haW5zLAorCQkJIGNkLmZsdXNoX2RvbWFpbnMpOworI2VuZGlmCisJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfZmx1c2gocmluZy0+ZGV2LAorCQkJCQkJY2QuaW52YWxpZGF0ZV9kb21haW5zLAorCQkJCQkJY2QuZmx1c2hfZG9tYWlucywKKwkJCQkJCWNkLmZsdXNoX3JpbmdzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3N5bmNfcmluZ3Mob2JqLCByaW5nKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sCitpOTE1X2dlbV9jaGVja19leGVjYnVmZmVyKHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgKmV4ZWMpCit7CisJcmV0dXJuICgoZXhlYy0+YmF0Y2hfc3RhcnRfb2Zmc2V0IHwgZXhlYy0+YmF0Y2hfbGVuKSAmIDB4NykgPT0gMDsKK30KKworc3RhdGljIGludAordmFsaWRhdGVfZXhlY19saXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjLAorCQkgICBpbnQgY291bnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQljaGFyIF9fdXNlciAqcHRyID0gKGNoYXIgX191c2VyICopKHVpbnRwdHJfdClleGVjW2ldLnJlbG9jc19wdHI7CisJCWludCBsZW5ndGg7IC8qIGxpbWl0ZWQgYnkgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSAqLworCisJCS8qIEZpcnN0IGNoZWNrIGZvciBtYWxpY2lvdXMgaW5wdXQgY2F1c2luZyBvdmVyZmxvdyAqLworCQlpZiAoZXhlY1tpXS5yZWxvY2F0aW9uX2NvdW50ID4KKwkJICAgIElOVF9NQVggLyBzaXplb2Yoc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxlbmd0aCA9IGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCAqCisJCQlzaXplb2Yoc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5KTsKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHB0ciwgbGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIHdlIG1heSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBwcmVzdW1lZCBvZmZzZXRzICovCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcHRyLCBsZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKHB0ciwgbGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3dhaXRfZm9yX2ZsaXBzKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpvYmplY3RzKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGZsaXBzOworCisJLyogQ2hlY2sgZm9yIGFueSBwZW5kaW5nIGZsaXBzLiBBcyB3ZSBvbmx5IG1haW50YWluIGEgZmxpcCBxdWV1ZSBkZXB0aAorCSAqIG9mIDEsIHdlIGNhbiBzaW1wbHkgaW5zZXJ0IGEgV0FJVCBmb3IgdGhlIG5leHQgZGlzcGxheSBmbGlwIHByaW9yCisJICogdG8gZXhlY3V0aW5nIHRoZSBiYXRjaCBhbmQgYXZvaWQgc3RhbGxpbmcgdGhlIENQVS4KKwkgKi8KKwlmbGlwcyA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbikKKwkJCWZsaXBzIHw9IGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCk7CisJfQorCWlmIChmbGlwcykgeworCQlpbnQgcGxhbmUsIGZsaXBfbWFzaywgcmV0OworCisJCWZvciAocGxhbmUgPSAwOyBmbGlwcyA+PiBwbGFuZTsgcGxhbmUrKykgeworCQkJaWYgKCgoZmxpcHMgPj4gcGxhbmUpICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHBsYW5lKQorCQkJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0JfRkxJUDsKKwkJCWVsc2UKKwkJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZMSVA7CisKKwkJCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgMik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9XQUlUX0ZPUl9FVkVOVCB8IGZsaXBfbWFzayk7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfTk9PUCk7CisJCQlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfbW92ZV90b19hY3RpdmUoc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cywKKwkJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgdTMyIHNlcW5vKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgb2JqZWN0cywgZXhlY19saXN0KSB7CisJCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnM7CisJCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSBvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW47CisJCW9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgPSBvYmotPnBlbmRpbmdfZmVuY2VkX2dwdV9hY2Nlc3M7CisKKwkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fYWN0aXZlKG9iaiwgcmluZywgc2Vxbm8pOworCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbikgeworCQkJb2JqLT5kaXJ0eSA9IDE7CisJCQlvYmotPnBlbmRpbmdfZ3B1X3dyaXRlID0gdHJ1ZTsKKwkJCWxpc3RfbW92ZV90YWlsKCZvYmotPmdwdV93cml0ZV9saXN0LAorCQkJCSAgICAgICAmcmluZy0+Z3B1X3dyaXRlX2xpc3QpOworCQkJaW50ZWxfbWFya19idXN5KHJpbmctPmRldiwgb2JqKTsKKwkJfQorCisJCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKKwkJCQkJCSAgICBvYmotPmJhc2UucmVhZF9kb21haW5zLAorCQkJCQkJICAgIG9iai0+YmFzZS53cml0ZV9kb21haW4pOworCX0KK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmV0aXJlX2NvbW1hbmRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKKwkJCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKKwl1MzIgaW52YWxpZGF0ZTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIGNvbW1hbmRzIGluIHRoZSBiYXRjaCBidWZmZXIgYXJlCisJICogZmluaXNoZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgZmlyZXMuCisJICoKKwkgKiBUaGUgc2FtcGxlciBhbHdheXMgZ2V0cyBmbHVzaGVkIG9uIGk5NjUgKHNpZ2gpLgorCSAqLworCWludmFsaWRhdGUgPSBJOTE1X0dFTV9ET01BSU5fQ09NTUFORDsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKKwkJaW52YWxpZGF0ZSB8PSBJOTE1X0dFTV9ET01BSU5fU0FNUExFUjsKKwlpZiAocmluZy0+Zmx1c2gocmluZywgaW52YWxpZGF0ZSwgMCkpIHsKKwkJaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcmluZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBZGQgYSBicmVhZGNydW1iIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgYmF0Y2ggYnVmZmVyICovCisJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcXVlc3QgPT0gTlVMTCB8fCBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgZmlsZSwgcmVxdWVzdCwgcmluZykpIHsKKwkJaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcmluZyk7CisJCWtmcmVlKHJlcXVlc3QpOworCX0KK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZG9fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlLAorCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqYXJncywKKwkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBsaXN0X2hlYWQgb2JqZWN0czsKKwlzdHJ1Y3QgZWJfb2JqZWN0cyAqZWI7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmJhdGNoX29iajsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzID0gTlVMTDsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CisJdTMyIGV4ZWNfc3RhcnQsIGV4ZWNfbGVuOworCXUzMiBzZXFubzsKKwlpbnQgcmV0LCBtb2RlLCBpOworCisJaWYgKCFpOTE1X2dlbV9jaGVja19leGVjYnVmZmVyKGFyZ3MpKSB7CisJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIGludmFsaWQgb2Zmc2V0L2xlbmd0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHZhbGlkYXRlX2V4ZWNfbGlzdChleGVjLCBhcmdzLT5idWZmZXJfY291bnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKyNpZiBXQVRDSF9FWEVDCisJRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKKwkJICAoaW50KSBhcmdzLT5idWZmZXJzX3B0ciwgYXJncy0+YnVmZmVyX2NvdW50LCBhcmdzLT5iYXRjaF9sZW4pOworI2VuZGlmCisJc3dpdGNoIChhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spIHsKKwljYXNlIEk5MTVfRVhFQ19ERUZBVUxUOgorCWNhc2UgSTkxNV9FWEVDX1JFTkRFUjoKKwkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19CU0Q6CisJCWlmICghSEFTX0JTRChkZXYpKSB7CisJCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCBpbnZhbGlkIHJpbmcgKEJTRClcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tWQ1NdOworCQlicmVhazsKKwljYXNlIEk5MTVfRVhFQ19CTFQ6CisJCWlmICghSEFTX0JMVChkZXYpKSB7CisJCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCBpbnZhbGlkIHJpbmcgKEJMVClcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1tCQ1NdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCB1bmtub3duIHJpbmc6ICVkXG4iLAorCQkJICAoaW50KShhcmdzLT5mbGFncyAmIEk5MTVfRVhFQ19SSU5HX01BU0spKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbW9kZSA9IGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX0NPTlNUQU5UU19NQVNLOworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSTkxNV9FWEVDX0NPTlNUQU5UU19SRUxfR0VORVJBTDoKKwljYXNlIEk5MTVfRVhFQ19DT05TVEFOVFNfQUJTT0xVVEU6CisJY2FzZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9TVVJGQUNFOgorCQlpZiAocmluZyA9PSAmZGV2X3ByaXYtPnJpbmdbUkNTXSAmJgorCQkgICAgbW9kZSAhPSBkZXZfcHJpdi0+cmVsYXRpdmVfY29uc3RhbnRzX21vZGUpIHsKKwkJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDUgJiYKKwkJCSAgICBtb2RlID09IEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0UpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9MT0FEX1JFR0lTVEVSX0lNTSgxKSk7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgSU5TVFBNKTsKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLAorCQkJCQlJOTE1X0VYRUNfQ09OU1RBTlRTX01BU0sgPDwgMTYgfCBtb2RlKTsKKwkJCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCQkJZGV2X3ByaXYtPnJlbGF0aXZlX2NvbnN0YW50c19tb2RlID0gbW9kZTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCB1bmtub3duIGNvbnN0YW50czogJWRcbiIsIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXJncy0+YnVmZmVyX2NvdW50IDwgMSkgeworCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCAlZCBidWZmZXJzXG4iLCBhcmdzLT5idWZmZXJfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXJncy0+bnVtX2NsaXByZWN0cyAhPSAwKSB7CisJCWlmIChyaW5nICE9ICZkZXZfcHJpdi0+cmluZ1tSQ1NdKSB7CisJCQlEUk1fRVJST1IoImNsaXAgcmVjdGFuZ2xlcyBhcmUgb25seSB2YWxpZCB3aXRoIHRoZSByZW5kZXIgcmluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNsaXByZWN0cyA9IGttYWxsb2MoYXJncy0+bnVtX2NsaXByZWN0cyAqIHNpemVvZigqY2xpcHJlY3RzKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChjbGlwcmVjdHMgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gcHJlX211dGV4X2VycjsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihjbGlwcmVjdHMsCisJCQkJICAgICAoc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICopKHVpbnRwdHJfdCkKKwkJCQkgICAgIGFyZ3MtPmNsaXByZWN0c19wdHIsCisJCQkJICAgICBzaXplb2YoKmNsaXByZWN0cykqYXJncy0+bnVtX2NsaXByZWN0cykpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHByZV9tdXRleF9lcnI7CisJCX0KKwl9CisKKwlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOworCWlmIChyZXQpCisJCWdvdG8gcHJlX211dGV4X2VycjsKKworCWlmIChkZXZfcHJpdi0+bW0uc3VzcGVuZGVkKSB7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gcHJlX211dGV4X2VycjsKKwl9CisKKwllYiA9IGViX2NyZWF0ZShhcmdzLT5idWZmZXJfY291bnQpOworCWlmIChlYiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHByZV9tdXRleF9lcnI7CisJfQorCisJLyogTG9vayB1cCBvYmplY3QgaGFuZGxlcyAqLworCUlOSVRfTElTVF9IRUFEKCZvYmplY3RzKTsKKwlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCQlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLAorCQkJCQkJCWV4ZWNbaV0uaGFuZGxlKSk7CisJCWlmIChvYmogPT0gTlVMTCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIG9iamVjdCBoYW5kbGUgJWQgYXQgaW5kZXggJWRcbiIsCisJCQkJICAgZXhlY1tpXS5oYW5kbGUsIGkpOworCQkJLyogcHJldmVudCBlcnJvciBwYXRoIGZyb20gcmVhZGluZyB1bmluaXRpYWxpemVkIGRhdGEgKi8KKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmICghbGlzdF9lbXB0eSgmb2JqLT5leGVjX2xpc3QpKSB7CisJCQlEUk1fRVJST1IoIk9iamVjdCAlcCBbaGFuZGxlICVkLCBpbmRleCAlZF0gYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiBvYmplY3QgbGlzdFxuIiwKKwkJCQkgICBvYmosIGV4ZWNbaV0uaGFuZGxlLCBpKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJm9iai0+ZXhlY19saXN0LCAmb2JqZWN0cyk7CisJCW9iai0+ZXhlY19oYW5kbGUgPSBleGVjW2ldLmhhbmRsZTsKKwkJb2JqLT5leGVjX2VudHJ5ID0gJmV4ZWNbaV07CisJCWViX2FkZF9vYmplY3QoZWIsIG9iaik7CisJfQorCisJLyogdGFrZSBub3RlIG9mIHRoZSBiYXRjaCBidWZmZXIgYmVmb3JlIHdlIG1pZ2h0IHJlb3JkZXIgdGhlIGxpc3RzICovCisJYmF0Y2hfb2JqID0gbGlzdF9lbnRyeShvYmplY3RzLnByZXYsCisJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkgICAgICAgZXhlY19saXN0KTsKKworCS8qIE1vdmUgdGhlIG9iamVjdHMgZW4tbWFzc2UgaW50byB0aGUgR1RULCBldmljdGluZyBpZiBuZWNlc3NhcnkuICovCisJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHJpbmcsIGZpbGUsICZvYmplY3RzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIFRoZSBvYmplY3RzIGFyZSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIGFwcGx5IHRoZSByZWxvY2F0aW9ucy4gKi8KKwlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKGRldiwgZWIsICZvYmplY3RzKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPT0gLUVGQVVMVCkgeworCQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9zbG93KGRldiwgZmlsZSwgcmluZywKKwkJCQkJCQkJJm9iamVjdHMsIGViLAorCQkJCQkJCQlleGVjLAorCQkJCQkJCQlhcmdzLT5idWZmZXJfY291bnQpOworCQkJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+c3RydWN0X211dGV4KSk7CisJCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB0aGUgcGVuZGluZyByZWFkIGRvbWFpbnMgZm9yIHRoZSBiYXRjaCBidWZmZXIgdG8gQ09NTUFORCAqLworCWlmIChiYXRjaF9vYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4pIHsKKwkJRFJNX0VSUk9SKCJBdHRlbXB0aW5nIHRvIHVzZSBzZWxmLW1vZGlmeWluZyBiYXRjaCBidWZmZXJcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJYmF0Y2hfb2JqLT5iYXNlLnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9DT01NQU5EOworCisJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9tb3ZlX3RvX2dwdShyaW5nLCAmb2JqZWN0cyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3dhaXRfZm9yX2ZsaXBzKHJpbmcsICZvYmplY3RzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXNlcW5vID0gaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcmluZyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTLTE7IGkrKykgeworCQlpZiAoc2Vxbm8gPCByaW5nLT5zeW5jX3NlcW5vW2ldKSB7CisJCQkvKiBUaGUgR1BVIGNhbiBub3QgaGFuZGxlIGl0cyBzZW1hcGhvcmUgdmFsdWUgd3JhcHBpbmcsCisJCQkgKiBzbyBldmVyeSBiaWxsaW9uIG9yIHNvIGV4ZWNidWZmZXJzLCB3ZSBuZWVkIHRvIHN0YWxsCisJCQkgKiB0aGUgR1BVIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBjb3VudGVycy4KKwkJCSAqLworCQkJcmV0ID0gaTkxNV9ncHVfaWRsZShkZXYpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKworCQkJQlVHX09OKHJpbmctPnN5bmNfc2Vxbm9baV0pOworCQl9CisJfQorCisJZXhlY19zdGFydCA9IGJhdGNoX29iai0+Z3R0X29mZnNldCArIGFyZ3MtPmJhdGNoX3N0YXJ0X29mZnNldDsKKwlleGVjX2xlbiA9IGFyZ3MtPmJhdGNoX2xlbjsKKwlpZiAoY2xpcHJlY3RzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5udW1fY2xpcHJlY3RzOyBpKyspIHsKKwkJCXJldCA9IGk5MTVfZW1pdF9ib3goZGV2LCAmY2xpcHJlY3RzW2ldLAorCQkJCQkgICAgYXJncy0+RFIxLCBhcmdzLT5EUjQpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKworCQkJcmV0ID0gcmluZy0+ZGlzcGF0Y2hfZXhlY2J1ZmZlcihyaW5nLAorCQkJCQkJCWV4ZWNfc3RhcnQsIGV4ZWNfbGVuKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSByaW5nLT5kaXNwYXRjaF9leGVjYnVmZmVyKHJpbmcsIGV4ZWNfc3RhcnQsIGV4ZWNfbGVuKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCWk5MTVfZ2VtX2V4ZWNidWZmZXJfbW92ZV90b19hY3RpdmUoJm9iamVjdHMsIHJpbmcsIHNlcW5vKTsKKwlpOTE1X2dlbV9leGVjYnVmZmVyX3JldGlyZV9jb21tYW5kcyhkZXYsIGZpbGUsIHJpbmcpOworCitlcnI6CisJZWJfZGVzdHJveShlYik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZvYmplY3RzKSkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJm9iamVjdHMsCisJCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgICBleGVjX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZvYmotPmV4ZWNfbGlzdCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCitwcmVfbXV0ZXhfZXJyOgorCWtmcmVlKGNsaXByZWN0cyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExlZ2FjeSBleGVjYnVmZmVyIGp1c3QgY3JlYXRlcyBhbiBleGVjMiBsaXN0IGZyb20gdGhlIG9yaWdpbmFsIGV4ZWMgb2JqZWN0CisgKiBsaXN0IGFycmF5IGFuZCBwYXNzZXMgaXQgdG8gdGhlIHJlYWwgZnVuY3Rpb24uCisgKi8KK2ludAoraTkxNV9nZW1fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAorCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlciAqYXJncyA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjMjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0ICpleGVjX2xpc3QgPSBOVUxMOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9saXN0ID0gTlVMTDsKKwlpbnQgcmV0LCBpOworCisjaWYgV0FUQ0hfRVhFQworCURSTV9JTkZPKCJidWZmZXJzX3B0ciAlZCBidWZmZXJfY291bnQgJWQgbGVuICUwOHhcbiIsCisJCSAgKGludCkgYXJncy0+YnVmZmVyc19wdHIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgYXJncy0+YmF0Y2hfbGVuKTsKKyNlbmRpZgorCisJaWYgKGFyZ3MtPmJ1ZmZlcl9jb3VudCA8IDEpIHsKKwkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggJWQgYnVmZmVyc1xuIiwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSBpbiB0aGUgZXhlYyBsaXN0IGZyb20gdXNlcmxhbmQgKi8KKwlleGVjX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlY19saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwlleGVjMl9saXN0ID0gZHJtX21hbGxvY19hYihzaXplb2YoKmV4ZWMyX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOworCWlmIChleGVjX2xpc3QgPT0gTlVMTCB8fCBleGVjMl9saXN0ID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXhlYyBsaXN0IGZvciAlZCBidWZmZXJzXG4iLAorCQkJICBhcmdzLT5idWZmZXJfY291bnQpOworCQlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOworCQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IGNvcHlfZnJvbV91c2VyKGV4ZWNfbGlzdCwKKwkJCSAgICAgKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQorCQkJICAgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKKwkJCSAgICAgc2l6ZW9mKCpleGVjX2xpc3QpICogYXJncy0+YnVmZmVyX2NvdW50KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJRFJNX0VSUk9SKCJjb3B5ICVkIGV4ZWMgZW50cmllcyBmYWlsZWQgJWRcbiIsCisJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKKwkJZHJtX2ZyZWVfbGFyZ2UoZXhlY19saXN0KTsKKwkJZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykgeworCQlleGVjMl9saXN0W2ldLmhhbmRsZSA9IGV4ZWNfbGlzdFtpXS5oYW5kbGU7CisJCWV4ZWMyX2xpc3RbaV0ucmVsb2NhdGlvbl9jb3VudCA9IGV4ZWNfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50OworCQlleGVjMl9saXN0W2ldLnJlbG9jc19wdHIgPSBleGVjX2xpc3RbaV0ucmVsb2NzX3B0cjsKKwkJZXhlYzJfbGlzdFtpXS5hbGlnbm1lbnQgPSBleGVjX2xpc3RbaV0uYWxpZ25tZW50OworCQlleGVjMl9saXN0W2ldLm9mZnNldCA9IGV4ZWNfbGlzdFtpXS5vZmZzZXQ7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpCisJCQlleGVjMl9saXN0W2ldLmZsYWdzID0gRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0U7CisJCWVsc2UKKwkJCWV4ZWMyX2xpc3RbaV0uZmxhZ3MgPSAwOworCX0KKworCWV4ZWMyLmJ1ZmZlcnNfcHRyID0gYXJncy0+YnVmZmVyc19wdHI7CisJZXhlYzIuYnVmZmVyX2NvdW50ID0gYXJncy0+YnVmZmVyX2NvdW50OworCWV4ZWMyLmJhdGNoX3N0YXJ0X29mZnNldCA9IGFyZ3MtPmJhdGNoX3N0YXJ0X29mZnNldDsKKwlleGVjMi5iYXRjaF9sZW4gPSBhcmdzLT5iYXRjaF9sZW47CisJZXhlYzIuRFIxID0gYXJncy0+RFIxOworCWV4ZWMyLkRSNCA9IGFyZ3MtPkRSNDsKKwlleGVjMi5udW1fY2xpcHJlY3RzID0gYXJncy0+bnVtX2NsaXByZWN0czsKKwlleGVjMi5jbGlwcmVjdHNfcHRyID0gYXJncy0+Y2xpcHJlY3RzX3B0cjsKKwlleGVjMi5mbGFncyA9IEk5MTVfRVhFQ19SRU5ERVI7CisKKwlyZXQgPSBpOTE1X2dlbV9kb19leGVjYnVmZmVyKGRldiwgZGF0YSwgZmlsZSwgJmV4ZWMyLCBleGVjMl9saXN0KTsKKwlpZiAoIXJldCkgeworCQkvKiBDb3B5IHRoZSBuZXcgYnVmZmVyIG9mZnNldHMgYmFjayB0byB0aGUgdXNlcidzIGV4ZWMgbGlzdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKQorCQkJZXhlY19saXN0W2ldLm9mZnNldCA9IGV4ZWMyX2xpc3RbaV0ub2Zmc2V0OworCQkvKiAuLi4gYW5kIGJhY2sgb3V0IHRvIHVzZXJzcGFjZSAqLworCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQorCQkJCSAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAorCQkJCSAgIGV4ZWNfbGlzdCwKKwkJCQkgICBzaXplb2YoKmV4ZWNfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY29weSAlZCBleGVjIGVudHJpZXMgIgorCQkJCSAgImJhY2sgdG8gdXNlciAoJWQpXG4iLAorCQkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOworCQl9CisJfQorCisJZHJtX2ZyZWVfbGFyZ2UoZXhlY19saXN0KTsKKwlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2k5MTVfZ2VtX2V4ZWNidWZmZXIyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgKmFyZ3MgPSBkYXRhOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9saXN0ID0gTlVMTDsKKwlpbnQgcmV0OworCisjaWYgV0FUQ0hfRVhFQworCURSTV9JTkZPKCJidWZmZXJzX3B0ciAlZCBidWZmZXJfY291bnQgJWQgbGVuICUwOHhcbiIsCisJCSAgKGludCkgYXJncy0+YnVmZmVyc19wdHIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgYXJncy0+YmF0Y2hfbGVuKTsKKyNlbmRpZgorCisJaWYgKGFyZ3MtPmJ1ZmZlcl9jb3VudCA8IDEpIHsKKwkJRFJNX0VSUk9SKCJleGVjYnVmMiB3aXRoICVkIGJ1ZmZlcnNcbiIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV4ZWMyX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlYzJfbGlzdCksIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJaWYgKGV4ZWMyX2xpc3QgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBleGVjIGxpc3QgZm9yICVkIGJ1ZmZlcnNcbiIsCisJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXQgPSBjb3B5X2Zyb21fdXNlcihleGVjMl9saXN0LAorCQkJICAgICAoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCisJCQkgICAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAorCQkJICAgICBzaXplb2YoKmV4ZWMyX2xpc3QpICogYXJncy0+YnVmZmVyX2NvdW50KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJRFJNX0VSUk9SKCJjb3B5ICVkIGV4ZWMgZW50cmllcyBmYWlsZWQgJWRcbiIsCisJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKKwkJZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldCA9IGk5MTVfZ2VtX2RvX2V4ZWNidWZmZXIoZGV2LCBkYXRhLCBmaWxlLCBhcmdzLCBleGVjMl9saXN0KTsKKwlpZiAoIXJldCkgeworCQkvKiBDb3B5IHRoZSBuZXcgYnVmZmVyIG9mZnNldHMgYmFjayB0byB0aGUgdXNlcidzIGV4ZWMgbGlzdC4gKi8KKwkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2k5MTVfcmVsb2NhdGlvbl9lbnRyeSBfX3VzZXIgKikKKwkJCQkgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKKwkJCQkgICBleGVjMl9saXN0LAorCQkJCSAgIHNpemVvZigqZXhlYzJfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY29weSAlZCBleGVjIGVudHJpZXMgIgorCQkJCSAgImJhY2sgdG8gdXNlciAoJWQpXG4iLAorCQkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOworCQl9CisJfQorCisJZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0MzNhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxMCBEYW5pZWwgVmV0dGVyCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgImk5MTVfZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisKK3ZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5ndHRfbGlzdCwgZ3R0X2xpc3QpIHsKKwkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKKworCQlpZiAoZGV2X3ByaXYtPm1tLmd0dC0+bmVlZHNfZG1hcikgeworCQkJQlVHX09OKCFvYmotPnNnX2xpc3QpOworCisJCQlpbnRlbF9ndHRfaW5zZXJ0X3NnX2VudHJpZXMob2JqLT5zZ19saXN0LAorCQkJCQkJICAgIG9iai0+bnVtX3NnLAorCQkJCQkJICAgIG9iai0+Z3R0X3NwYWNlLT5zdGFydAorCQkJCQkJCT4+IFBBR0VfU0hJRlQsCisJCQkJCQkgICAgb2JqLT5hZ3BfdHlwZSk7CisJCX0gZWxzZQorCQkJaW50ZWxfZ3R0X2luc2VydF9wYWdlcyhvYmotPmd0dF9zcGFjZS0+c3RhcnQKKwkJCQkJCSAgID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgICAgb2JqLT5wYWdlcywKKwkJCQkJICAgICAgIG9iai0+YWdwX3R5cGUpOworCX0KKworCWludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKCk7Cit9CisKK2ludCBpOTE1X2dlbV9ndHRfYmluZF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPm1tLmd0dC0+bmVlZHNfZG1hcikgeworCQlyZXQgPSBpbnRlbF9ndHRfbWFwX21lbW9yeShvYmotPnBhZ2VzLAorCQkJCQkgICBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZULAorCQkJCQkgICAmb2JqLT5zZ19saXN0LAorCQkJCQkgICAmb2JqLT5udW1fc2cpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCisJCWludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyhvYmotPnNnX2xpc3QsCisJCQkJCSAgICBvYmotPm51bV9zZywKKwkJCQkJICAgIG9iai0+Z3R0X3NwYWNlLT5zdGFydCA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgb2JqLT5hZ3BfdHlwZSk7CisJfSBlbHNlCisJCWludGVsX2d0dF9pbnNlcnRfcGFnZXMob2JqLT5ndHRfc3BhY2UtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCisJCQkJICAgICAgIG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQsCisJCQkJICAgICAgIG9iai0+cGFnZXMsCisJCQkJICAgICAgIG9iai0+YWdwX3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTkxNV9nZW1fZ3R0X3VuYmluZF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpbnRlbF9ndHRfY2xlYXJfcmFuZ2Uob2JqLT5ndHRfc3BhY2UtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCisJCQkgICAgICBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKTsKKworCWlmIChvYmotPnNnX2xpc3QpIHsKKwkJaW50ZWxfZ3R0X3VubWFwX21lbW9yeShvYmotPnNnX2xpc3QsIG9iai0+bnVtX3NnKTsKKwkJb2JqLT5zZ19saXN0ID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCmluZGV4IGFmMzUyZGUuLjIyYTMyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jCkBAIC0xODEsNyArMTgxLDcgQEAKIH0KIAogLyogQ2hlY2sgcGl0Y2ggY29uc3RyaWFudHMgZm9yIGFsbCBjaGlwcyAmIHRpbGluZyBmb3JtYXRzICovCi1ib29sCitzdGF0aWMgYm9vbAogaTkxNV90aWxpbmdfb2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHN0cmlkZSwgaW50IHNpemUsIGludCB0aWxpbmdfbW9kZSkKIHsKIAlpbnQgdGlsZV93aWR0aDsKQEAgLTIzMiwzMiArMjMyLDQ0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wKLWk5MTVfZ2VtX29iamVjdF9mZW5jZV9vZmZzZXRfb2soc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCB0aWxpbmdfbW9kZSkKKy8qIElzIHRoZSBjdXJyZW50IEdUVCBhbGxvY2F0aW9uIHZhbGlkIGZvciB0aGUgY2hhbmdlIGluIHRpbGluZz8gKi8KK3N0YXRpYyBib29sCitpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2soc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IHRpbGluZ19tb2RlKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkKLQkJcmV0dXJuIHRydWU7CisJdTMyIHNpemU7CiAKIAlpZiAodGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJcmV0dXJuIHRydWU7CiAKLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKKwlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuID49IDQpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoSVNfR0VOMyhkZXYpKSB7Ci0JCWlmIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spCisJaWYgKElOVEVMX0lORk8ob2JqLT5iYXNlLmRldiktPmdlbiA9PSAzKSB7CisJCWlmIChvYmotPmd0dF9vZmZzZXQgJiB+STkxNV9GRU5DRV9TVEFSVF9NQVNLKQogCQkJcmV0dXJuIGZhbHNlOwogCX0gZWxzZSB7Ci0JCWlmIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JODMwX0ZFTkNFX1NUQVJUX01BU0spCisJCWlmIChvYmotPmd0dF9vZmZzZXQgJiB+STgzMF9GRU5DRV9TVEFSVF9NQVNLKQogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAorCS8qCisJICogUHJldmlvdXMgY2hpcHMgbmVlZCB0byBiZSBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIHRoZSBzbWFsbGVzdAorCSAqIGZlbmNlIHJlZ2lzdGVyIHRoYXQgY2FuIGNvbnRhaW4gdGhlIG9iamVjdC4KKwkgKi8KKwlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuID09IDMpCisJCXNpemUgPSAxMDI0KjEwMjQ7CisJZWxzZQorCQlzaXplID0gNTEyKjEwMjQ7CisKKwl3aGlsZSAoc2l6ZSA8IG9iai0+YmFzZS5zaXplKQorCQlzaXplIDw8PSAxOworCisJaWYgKG9iai0+Z3R0X3NwYWNlLT5zaXplICE9IHNpemUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChvYmotPmd0dF9vZmZzZXQgJiAoc2l6ZSAtIDEpKQorCQlyZXR1cm4gZmFsc2U7CisKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjY3LDMwICsyNzksMjkgQEAKICAqLwogaW50CiBpOTE1X2dlbV9zZXRfdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfdGlsaW5nICphcmdzID0gZGF0YTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaTkxNV9nZW1fY2hlY2tfaXNfd2VkZ2VkKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWlmICghaTkxNV90aWxpbmdfb2soZGV2LCBhcmdzLT5zdHJpZGUsIG9iai0+c2l6ZSwgYXJncy0+dGlsaW5nX21vZGUpKSB7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CisJaWYgKCFpOTE1X3RpbGluZ19vayhkZXYsCisJCQkgICAgYXJncy0+c3RyaWRlLCBvYmotPmJhc2Uuc2l6ZSwgYXJncy0+dGlsaW5nX21vZGUpKSB7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZvYmotPmJhc2UpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCkgewotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCWlmIChvYmotPnBpbl9jb3VudCkgeworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmb2JqLT5iYXNlKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTMyNCwzNCArMzM1LDI4IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmIChhcmdzLT50aWxpbmdfbW9kZSAhPSBvYmpfcHJpdi0+dGlsaW5nX21vZGUgfHwKLQkgICAgYXJncy0+c3RyaWRlICE9IG9ial9wcml2LT5zdHJpZGUpIHsKKwlpZiAoYXJncy0+dGlsaW5nX21vZGUgIT0gb2JqLT50aWxpbmdfbW9kZSB8fAorCSAgICBhcmdzLT5zdHJpZGUgIT0gb2JqLT5zdHJpZGUpIHsKIAkJLyogV2UgbmVlZCB0byByZWJpbmQgdGhlIG9iamVjdCBpZiBpdHMgY3VycmVudCBhbGxvY2F0aW9uCiAJCSAqIG5vIGxvbmdlciBtZWV0cyB0aGUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBmb3IgaXRzIG5ldwogCQkgKiB0aWxpbmcgbW9kZS4gT3RoZXJ3aXNlIHdlIGNhbiBqdXN0IGxlYXZlIGl0IGFsb25lLCBidXQKIAkJICogbmVlZCB0byBlbnN1cmUgdGhhdCBhbnkgZmVuY2UgcmVnaXN0ZXIgaXMgY2xlYXJlZC4KIAkJICovCi0JCWlmICghaTkxNV9nZW1fb2JqZWN0X2ZlbmNlX29mZnNldF9vayhvYmosIGFyZ3MtPnRpbGluZ19tb2RlKSkKLQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKLQkJZWxzZSBpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZV9yZWcob2JqLCB0cnVlKTsKLQkJZWxzZQotCQkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwogCi0JCWlmIChyZXQgIT0gMCkgewotCQkJYXJncy0+dGlsaW5nX21vZGUgPSBvYmpfcHJpdi0+dGlsaW5nX21vZGU7Ci0JCQlhcmdzLT5zdHJpZGUgPSBvYmpfcHJpdi0+c3RyaWRlOwotCQkJZ290byBlcnI7Ci0JCX0KKwkJb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSA9CisJCQlvYmotPmd0dF9zcGFjZSA9PSBOVUxMIHx8CisJCQkob2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUgPD0gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQgJiYKKwkJCSBpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2sob2JqLCBhcmdzLT50aWxpbmdfbW9kZSkpOwogCi0JCW9ial9wcml2LT50aWxpbmdfbW9kZSA9IGFyZ3MtPnRpbGluZ19tb2RlOwotCQlvYmpfcHJpdi0+c3RyaWRlID0gYXJncy0+c3RyaWRlOworCQlvYmotPnRpbGluZ19jaGFuZ2VkID0gdHJ1ZTsKKwkJb2JqLT50aWxpbmdfbW9kZSA9IGFyZ3MtPnRpbGluZ19tb2RlOworCQlvYmotPnN0cmlkZSA9IGFyZ3MtPnN0cmlkZTsKIAl9Ci1lcnI6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzU5LDIyICszNjQsMjAgQEAKICAqLwogaW50CiBpOTE1X2dlbV9nZXRfdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nICphcmdzID0gZGF0YTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCWFyZ3MtPnRpbGluZ19tb2RlID0gb2JqX3ByaXYtPnRpbGluZ19tb2RlOwotCXN3aXRjaCAob2JqX3ByaXYtPnRpbGluZ19tb2RlKSB7CisJYXJncy0+dGlsaW5nX21vZGUgPSBvYmotPnRpbGluZ19tb2RlOworCXN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgewogCWNhc2UgSTkxNV9USUxJTkdfWDoKIAkJYXJncy0+c3dpenpsZV9tb2RlID0gZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeDsKIAkJYnJlYWs7CkBAIC0zOTQsNyArMzk3LDcgQEAKIAlpZiAoYXJncy0+c3dpenpsZV9tb2RlID09IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3KQogCQlhcmdzLT5zd2l6emxlX21vZGUgPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKIAotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTQyNCw0NiArNDI3LDQ0IEBACiB9CiAKIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCBwYWdlX2NvdW50ID0gb2JqLT5zaXplID4+IFBBR0VfU0hJRlQ7CisJaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOwogCWludCBpOwogCiAJaWYgKGRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3ggIT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcpCiAJCXJldHVybjsKIAotCWlmIChvYmpfcHJpdi0+Yml0XzE3ID09IE5VTEwpCisJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpCiAJCXJldHVybjsKIAogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJY2hhciBuZXdfYml0XzE3ID0gcGFnZV90b19waHlzKG9ial9wcml2LT5wYWdlc1tpXSkgPj4gMTc7CisJCWNoYXIgbmV3X2JpdF8xNyA9IHBhZ2VfdG9fcGh5cyhvYmotPnBhZ2VzW2ldKSA+PiAxNzsKIAkJaWYgKChuZXdfYml0XzE3ICYgMHgxKSAhPQotCQkgICAgKHRlc3RfYml0KGksIG9ial9wcml2LT5iaXRfMTcpICE9IDApKSB7Ci0JCQlpOTE1X2dlbV9zd2l6emxlX3BhZ2Uob2JqX3ByaXYtPnBhZ2VzW2ldKTsKLQkJCXNldF9wYWdlX2RpcnR5KG9ial9wcml2LT5wYWdlc1tpXSk7CisJCSAgICAodGVzdF9iaXQoaSwgb2JqLT5iaXRfMTcpICE9IDApKSB7CisJCQlpOTE1X2dlbV9zd2l6emxlX3BhZ2Uob2JqLT5wYWdlc1tpXSk7CisJCQlzZXRfcGFnZV9kaXJ0eShvYmotPnBhZ2VzW2ldKTsKIAkJfQogCX0KIH0KIAogdm9pZAotaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCBwYWdlX2NvdW50ID0gb2JqLT5zaXplID4+IFBBR0VfU0hJRlQ7CisJaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOwogCWludCBpOwogCiAJaWYgKGRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3ggIT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcpCiAJCXJldHVybjsKIAotCWlmIChvYmpfcHJpdi0+Yml0XzE3ID09IE5VTEwpIHsKLQkJb2JqX3ByaXYtPmJpdF8xNyA9IGttYWxsb2MoQklUU19UT19MT05HUyhwYWdlX2NvdW50KSAqCisJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpIHsKKwkJb2JqLT5iaXRfMTcgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1MocGFnZV9jb3VudCkgKgogCQkJCQkgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOwotCQlpZiAob2JqX3ByaXYtPmJpdF8xNyA9PSBOVUxMKSB7CisJCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKSB7CiAJCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJpdCAxNyAiCiAJCQkJICAicmVjb3JkXG4iKTsKIAkJCXJldHVybjsKQEAgLTQ3MSw5ICs0NzIsOSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKLQkJaWYgKHBhZ2VfdG9fcGh5cyhvYmpfcHJpdi0+cGFnZXNbaV0pICYgKDEgPDwgMTcpKQotCQkJX19zZXRfYml0KGksIG9ial9wcml2LT5iaXRfMTcpOworCQlpZiAocGFnZV90b19waHlzKG9iai0+cGFnZXNbaV0pICYgKDEgPDwgMTcpKQorCQkJX19zZXRfYml0KGksIG9iai0+Yml0XzE3KTsKIAkJZWxzZQotCQkJX19jbGVhcl9iaXQoaSwgb2JqX3ByaXYtPmJpdF8xNyk7CisJCQlfX2NsZWFyX2JpdChpLCBvYmotPmJpdF8xNyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKaW5kZXggNzI5ZmQwYy4uYjhlNTA5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC02NCw2NCArNjQsMjQgQEAKICNkZWZpbmUgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQUxMCShEUk1fSTkxNV9WQkxBTktfUElQRV9BIHwgXAogCQkJCQkgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQikKIAotdm9pZAotaXJvbmxha2VfZW5hYmxlX2dyYXBoaWNzX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKLXsKLQlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7Ci0JCWRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJj0gfm1hc2s7Ci0JCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcpOwotCQkodm9pZCkgSTkxNV9SRUFEKEdUSU1SKTsKLQl9Ci19Ci0KLXZvaWQKLWlyb25sYWtlX2Rpc2FibGVfZ3JhcGhpY3NfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIHUzMiBtYXNrKQotewotCWlmICgoZGV2X3ByaXYtPmd0X2lycV9tYXNrX3JlZyAmIG1hc2spICE9IG1hc2spIHsKLQkJZGV2X3ByaXYtPmd0X2lycV9tYXNrX3JlZyB8PSBtYXNrOwotCQlJOTE1X1dSSVRFKEdUSU1SLCBkZXZfcHJpdi0+Z3RfaXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChHVElNUik7Ci0JfQotfQotCiAvKiBGb3IgZGlzcGxheSBob3RwbHVnIGludGVycnVwdCAqLwogc3RhdGljIHZvaWQKIGlyb25sYWtlX2VuYWJsZV9kaXNwbGF5X2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKLQlpZiAoKGRldl9wcml2LT5pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7Ci0JCWRldl9wcml2LT5pcnFfbWFza19yZWcgJj0gfm1hc2s7Ci0JCUk5MTVfV1JJVEUoREVJTVIsIGRldl9wcml2LT5pcnFfbWFza19yZWcpOwotCQkodm9pZCkgSTkxNV9SRUFEKERFSU1SKTsKKwlpZiAoKGRldl9wcml2LT5pcnFfbWFzayAmIG1hc2spICE9IDApIHsKKwkJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5tYXNrOworCQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+aXJxX21hc2spOworCQlQT1NUSU5HX1JFQUQoREVJTVIpOwogCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBpcm9ubGFrZV9kaXNhYmxlX2Rpc3BsYXlfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIHUzMiBtYXNrKQogewotCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrX3JlZyAmIG1hc2spICE9IG1hc2spIHsKLQkJZGV2X3ByaXYtPmlycV9tYXNrX3JlZyB8PSBtYXNrOwotCQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChERUlNUik7Ci0JfQotfQotCi12b2lkCi1pOTE1X2VuYWJsZV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCi17Ci0JaWYgKChkZXZfcHJpdi0+aXJxX21hc2tfcmVnICYgbWFzaykgIT0gMCkgewotCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnICY9IH5tYXNrOwotCQlJOTE1X1dSSVRFKElNUiwgZGV2X3ByaXYtPmlycV9tYXNrX3JlZyk7Ci0JCSh2b2lkKSBJOTE1X1JFQUQoSU1SKTsKLQl9Ci19Ci0KLXZvaWQKLWk5MTVfZGlzYWJsZV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCi17Ci0JaWYgKChkZXZfcHJpdi0+aXJxX21hc2tfcmVnICYgbWFzaykgIT0gbWFzaykgewotCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnIHw9IG1hc2s7Ci0JCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChJTVIpOworCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gbWFzaykgeworCQlkZXZfcHJpdi0+aXJxX21hc2sgfD0gbWFzazsKKwkJSTkxNV9XUklURShERUlNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwkJUE9TVElOR19SRUFEKERFSU1SKTsKIAl9CiB9CiAKQEAgLTE0NCw3ICsxMDQsNyBAQAogCQlkZXZfcHJpdi0+cGlwZXN0YXRbcGlwZV0gfD0gbWFzazsKIAkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQsIGNsZWFyIGFueSBwZW5kaW5nIHN0YXR1cyAqLwogCQlJOTE1X1dSSVRFKHJlZywgZGV2X3ByaXYtPnBpcGVzdGF0W3BpcGVdIHwgKG1hc2sgPj4gMTYpKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChyZWcpOworCQlQT1NUSU5HX1JFQUQocmVnKTsKIAl9CiB9CiAKQEAgLTE1NiwxNiArMTE2LDE5IEBACiAKIAkJZGV2X3ByaXYtPnBpcGVzdGF0W3BpcGVdICY9IH5tYXNrOwogCQlJOTE1X1dSSVRFKHJlZywgZGV2X3ByaXYtPnBpcGVzdGF0W3BpcGVdKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChyZWcpOworCQlQT1NUSU5HX1JFQUQocmVnKTsKIAl9CiB9CiAKIC8qKgogICogaW50ZWxfZW5hYmxlX2FzbGUgLSBlbmFibGUgQVNMRSBpbnRlcnJ1cHQgZm9yIE9wUmVnaW9uCiAgKi8KLXZvaWQgaW50ZWxfZW5hYmxlX2FzbGUgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkIGludGVsX2VuYWJsZV9hc2xlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKIAkJaXJvbmxha2VfZW5hYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCBERV9HU0UpOwpAQCAtMTc2LDYgKzEzOSw4IEBACiAJCQlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMCwKIAkJCQkJICAgICBQSVBFX0xFR0FDWV9CTENfRVZFTlRfRU5BQkxFKTsKIAl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIH0KIAogLyoqCkBAIC0yNDMsNiArMjA4LDkyIEBACiAJcmV0dXJuIEk5MTVfUkVBRChyZWcpOwogfQogCitpbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAorCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcykKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUzMiB2YmwgPSAwLCBwb3NpdGlvbiA9IDA7CisJaW50IHZibF9zdGFydCwgdmJsX2VuZCwgaHRvdGFsLCB2dG90YWw7CisJYm9vbCBpbl92YmwgPSB0cnVlOworCWludCByZXQgPSAwOworCisJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKSB7CisJCURSTV9ERUJVR19EUklWRVIoInRyeWluZyB0byBnZXQgc2Nhbm91dHBvcyBmb3IgZGlzYWJsZWQgIgorCQkJCQkicGlwZSAlZFxuIiwgcGlwZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCB2dG90YWwuICovCisJdnRvdGFsID0gMSArICgoSTkxNV9SRUFEKFZUT1RBTChwaXBlKSkgPj4gMTYpICYgMHgxZmZmKTsKKworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CisJCS8qIE5vIG9idmlvdXMgcGl4ZWxjb3VudCByZWdpc3Rlci4gT25seSBxdWVyeSB2ZXJ0aWNhbAorCQkgKiBzY2Fub3V0IHBvc2l0aW9uIGZyb20gRGlzcGxheSBzY2FuIGxpbmUgcmVnaXN0ZXIuCisJCSAqLworCQlwb3NpdGlvbiA9IEk5MTVfUkVBRChQSVBFRFNMKHBpcGUpKTsKKworCQkvKiBEZWNvZGUgaW50byB2ZXJ0aWNhbCBzY2Fub3V0IHBvc2l0aW9uLiBEb24ndCBoYXZlCisJCSAqIGhvcml6b250YWwgc2Nhbm91dCBwb3NpdGlvbi4KKwkJICovCisJCSp2cG9zID0gcG9zaXRpb24gJiAweDFmZmY7CisJCSpocG9zID0gMDsKKwl9IGVsc2UgeworCQkvKiBIYXZlIGFjY2VzcyB0byBwaXhlbGNvdW50IHNpbmNlIHN0YXJ0IG9mIGZyYW1lLgorCQkgKiBXZSBjYW4gc3BsaXQgdGhpcyBpbnRvIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsCisJCSAqIHNjYW5vdXQgcG9zaXRpb24uCisJCSAqLworCQlwb3NpdGlvbiA9IChJOTE1X1JFQUQoUElQRUZSQU1FUElYRUwocGlwZSkpICYgUElQRV9QSVhFTF9NQVNLKSA+PiBQSVBFX1BJWEVMX1NISUZUOworCisJCWh0b3RhbCA9IDEgKyAoKEk5MTVfUkVBRChIVE9UQUwocGlwZSkpID4+IDE2KSAmIDB4MWZmZik7CisJCSp2cG9zID0gcG9zaXRpb24gLyBodG90YWw7CisJCSpocG9zID0gcG9zaXRpb24gLSAoKnZwb3MgKiBodG90YWwpOworCX0KKworCS8qIFF1ZXJ5IHZibGFuayBhcmVhLiAqLworCXZibCA9IEk5MTVfUkVBRChWQkxBTksocGlwZSkpOworCisJLyogVGVzdCBwb3NpdGlvbiBhZ2FpbnN0IHZibGFuayByZWdpb24uICovCisJdmJsX3N0YXJ0ID0gdmJsICYgMHgxZmZmOworCXZibF9lbmQgPSAodmJsID4+IDE2KSAmIDB4MWZmZjsKKworCWlmICgoKnZwb3MgPCB2Ymxfc3RhcnQpIHx8ICgqdnBvcyA+IHZibF9lbmQpKQorCQlpbl92YmwgPSBmYWxzZTsKKworCS8qIEluc2lkZSAidXBwZXIgcGFydCIgb2YgdmJsYW5rIGFyZWE/IEFwcGx5IGNvcnJlY3RpdmUgb2Zmc2V0OiAqLworCWlmIChpbl92YmwgJiYgKCp2cG9zID49IHZibF9zdGFydCkpCisJCSp2cG9zID0gKnZwb3MgLSB2dG90YWw7CisKKwkvKiBSZWFkb3V0cyB2YWxpZD8gKi8KKwlpZiAodmJsID4gMCkKKwkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEIHwgRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEU7CisKKwkvKiBJbiB2Ymxhbms/ICovCisJaWYgKGluX3ZibCkKKwkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX0lOVkJMOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkgICAgICBpbnQgKm1heF9lcnJvciwKKwkJCSAgICAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKKwkJCSAgICAgIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBkcm1fY3J0YyAqZHJtY3J0YzsKKworCWlmIChjcnRjIDwgMCB8fCBjcnRjID49IGRldi0+bnVtX2NydGNzKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBjcnRjICVkXG4iLCBjcnRjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IGRybV9jcnRjIHRvIHRpbWVzdGFtcDogKi8KKwlkcm1jcnRjID0gaW50ZWxfZ2V0X2NydGNfZm9yX3BpcGUoZGV2LCBjcnRjKTsKKworCS8qIEhlbHBlciByb3V0aW5lIGluIERSTSBjb3JlIGRvZXMgYWxsIHRoZSB3b3JrOiAqLworCXJldHVybiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKGRldiwgY3J0YywgbWF4X2Vycm9yLAorCQkJCQkJICAgICB2YmxhbmtfdGltZSwgZmxhZ3MsIGRybWNydGMpOworfQorCiAvKgogICogSGFuZGxlIGhvdHBsdWcgZXZlbnRzIG91dHNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyIHByb3Blci4KICAqLwpAQCAtMjk3LDIwICszNDgsMTA1IEBACiAJCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgc2Vxbm8gPSByaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKTsKLQlyaW5nLT5pcnFfZ2VtX3NlcW5vID0gc2Vxbm87CisJdTMyIHNlcW5vID0gcmluZy0+Z2V0X3NlcW5vKHJpbmcpOworCiAJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF9jb21wbGV0ZShkZXYsIHNlcW5vKTsKKworCXJpbmctPmlycV9zZXFubyA9IHNlcW5vOwogCXdha2VfdXBfYWxsKCZyaW5nLT5pcnFfcXVldWUpOworCiAJZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCA9IDA7CiAJbW9kX3RpbWVyKCZkZXZfcHJpdi0+aGFuZ2NoZWNrX3RpbWVyLAogCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKERSTV9JOTE1X0hBTkdDSEVDS19QRVJJT0QpKTsKIH0KIAorc3RhdGljIHZvaWQgZ2VuNl9wbV9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTggbmV3X2RlbGF5ID0gZGV2X3ByaXYtPmN1cl9kZWxheTsKKwl1MzIgcG1faWlyOworCisJcG1faWlyID0gSTkxNV9SRUFEKEdFTjZfUE1JSVIpOworCWlmICghcG1faWlyKQorCQlyZXR1cm47CisKKwlpZiAocG1faWlyICYgR0VONl9QTV9SUF9VUF9USFJFU0hPTEQpIHsKKwkJaWYgKGRldl9wcml2LT5jdXJfZGVsYXkgIT0gZGV2X3ByaXYtPm1heF9kZWxheSkKKwkJCW5ld19kZWxheSA9IGRldl9wcml2LT5jdXJfZGVsYXkgKyAxOworCQlpZiAobmV3X2RlbGF5ID4gZGV2X3ByaXYtPm1heF9kZWxheSkKKwkJCW5ld19kZWxheSA9IGRldl9wcml2LT5tYXhfZGVsYXk7CisJfSBlbHNlIGlmIChwbV9paXIgJiAoR0VONl9QTV9SUF9ET1dOX1RIUkVTSE9MRCB8IEdFTjZfUE1fUlBfRE9XTl9USU1FT1VUKSkgeworCQlpZiAoZGV2X3ByaXYtPmN1cl9kZWxheSAhPSBkZXZfcHJpdi0+bWluX2RlbGF5KQorCQkJbmV3X2RlbGF5ID0gZGV2X3ByaXYtPmN1cl9kZWxheSAtIDE7CisJCWlmIChuZXdfZGVsYXkgPCBkZXZfcHJpdi0+bWluX2RlbGF5KSB7CisJCQluZXdfZGVsYXkgPSBkZXZfcHJpdi0+bWluX2RlbGF5OworCQkJSTkxNV9XUklURShHRU42X1JQX0lOVEVSUlVQVF9MSU1JVFMsCisJCQkJICAgSTkxNV9SRUFEKEdFTjZfUlBfSU5URVJSVVBUX0xJTUlUUykgfAorCQkJCSAgICgobmV3X2RlbGF5IDw8IDE2KSAmIDB4M2YwMDAwKSk7CisJCX0gZWxzZSB7CisJCQkvKiBNYWtlIHN1cmUgd2UgY29udGludWUgdG8gZ2V0IGRvd24gaW50ZXJydXB0cworCQkJICogdW50aWwgd2UgaGl0IHRoZSBtaW5pbXVtIGZyZXF1ZW5jeSAqLworCQkJSTkxNV9XUklURShHRU42X1JQX0lOVEVSUlVQVF9MSU1JVFMsCisJCQkJICAgSTkxNV9SRUFEKEdFTjZfUlBfSU5URVJSVVBUX0xJTUlUUykgJiB+MHgzZjAwMDApOworCQl9CisKKwl9CisKKwlnZW42X3NldF9ycHMoZGV2LCBuZXdfZGVsYXkpOworCWRldl9wcml2LT5jdXJfZGVsYXkgPSBuZXdfZGVsYXk7CisKKwlJOTE1X1dSSVRFKEdFTjZfUE1JSVIsIHBtX2lpcik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaF9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHBjaF9paXI7CisKKwlwY2hfaWlyID0gSTkxNV9SRUFEKFNERUlJUik7CisKKwlpZiAocGNoX2lpciAmIFNERV9BVURJT19QT1dFUl9NQVNLKQorCQlEUk1fREVCVUdfRFJJVkVSKCJQQ0ggYXVkaW8gcG93ZXIgY2hhbmdlIG9uIHBvcnQgJWRcbiIsCisJCQkJIChwY2hfaWlyICYgU0RFX0FVRElPX1BPV0VSX01BU0spID4+CisJCQkJIFNERV9BVURJT19QT1dFUl9TSElGVCk7CisKKwlpZiAocGNoX2lpciAmIFNERV9HTUJVUykKKwkJRFJNX0RFQlVHX0RSSVZFUigiUENIIEdNQlVTIGludGVycnVwdFxuIik7CisKKwlpZiAocGNoX2lpciAmIFNERV9BVURJT19IRENQX01BU0spCisJCURSTV9ERUJVR19EUklWRVIoIlBDSCBIRENQIGF1ZGlvIGludGVycnVwdFxuIik7CisKKwlpZiAocGNoX2lpciAmIFNERV9BVURJT19UUkFOU19NQVNLKQorCQlEUk1fREVCVUdfRFJJVkVSKCJQQ0ggdHJhbnNjb2RlciBhdWRpbyBpbnRlcnJ1cHRcbiIpOworCisJaWYgKHBjaF9paXIgJiBTREVfUE9JU09OKQorCQlEUk1fRVJST1IoIlBDSCBwb2lzb24gaW50ZXJydXB0XG4iKTsKKworCWlmIChwY2hfaWlyICYgU0RFX0ZESV9NQVNLKSB7CisJCXUzMiBmZGlhLCBmZGliOworCisJCWZkaWEgPSBJOTE1X1JFQUQoRkRJX1JYQV9JSVIpOworCQlmZGliID0gSTkxNV9SRUFEKEZESV9SWEJfSUlSKTsKKwkJRFJNX0RFQlVHX0RSSVZFUigiUENIIEZESSBSWCBpbnRlcnJ1cHQ7IEZESSBSWEEgSUlSOiAweCUwOHgsIEZESSBSWEIgSUlSOiAweCUwOHhcbiIsIGZkaWEsIGZkaWIpOworCX0KKworCWlmIChwY2hfaWlyICYgKFNERV9UUkFOU0JfQ1JDX0RPTkUgfCBTREVfVFJBTlNBX0NSQ19ET05FKSkKKwkJRFJNX0RFQlVHX0RSSVZFUigiUENIIHRyYW5zY29kZXIgQ1JDIGRvbmUgaW50ZXJydXB0XG4iKTsKKworCWlmIChwY2hfaWlyICYgKFNERV9UUkFOU0JfQ1JDX0VSUiB8IFNERV9UUkFOU0FfQ1JDX0VSUikpCisJCURSTV9ERUJVR19EUklWRVIoIlBDSCB0cmFuc2NvZGVyIENSQyBlcnJvciBpbnRlcnJ1cHRcbiIpOworCisJaWYgKHBjaF9paXIgJiBTREVfVFJBTlNCX0ZJRk9fVU5ERVIpCisJCURSTV9ERUJVR19EUklWRVIoIlBDSCB0cmFuc2NvZGVyIEIgdW5kZXJydW4gaW50ZXJydXB0XG4iKTsKKwlpZiAocGNoX2lpciAmIFNERV9UUkFOU0FfRklGT19VTkRFUikKKwkJRFJNX0RFQlVHX0RSSVZFUigiUENIIHRyYW5zY29kZXIgQSB1bmRlcnJ1biBpbnRlcnJ1cHRcbiIpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXJvbmxha2VfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSBJUlFfTk9ORTsKLQl1MzIgZGVfaWlyLCBndF9paXIsIGRlX2llciwgcGNoX2lpcjsKKwl1MzIgZGVfaWlyLCBndF9paXIsIGRlX2llciwgcGNoX2lpciwgcG1faWlyOwogCXUzMiBob3RwbHVnX21hc2s7CiAJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdjsKIAl1MzIgYnNkX3Vzcl9pbnRlcnJ1cHQgPSBHVF9CU0RfVVNFUl9JTlRFUlJVUFQ7CkBAIC0zMjEsMTMgKzQ1NywxNSBAQAogCS8qIGRpc2FibGUgbWFzdGVyIGludGVycnVwdCBiZWZvcmUgY2xlYXJpbmcgaWlyICAqLwogCWRlX2llciA9IEk5MTVfUkVBRChERUlFUik7CiAJSTkxNV9XUklURShERUlFUiwgZGVfaWVyICYgfkRFX01BU1RFUl9JUlFfQ09OVFJPTCk7Ci0JKHZvaWQpSTkxNV9SRUFEKERFSUVSKTsKKwlQT1NUSU5HX1JFQUQoREVJRVIpOwogCiAJZGVfaWlyID0gSTkxNV9SRUFEKERFSUlSKTsKIAlndF9paXIgPSBJOTE1X1JFQUQoR1RJSVIpOwogCXBjaF9paXIgPSBJOTE1X1JFQUQoU0RFSUlSKTsKKwlwbV9paXIgPSBJOTE1X1JFQUQoR0VONl9QTUlJUik7CiAKLQlpZiAoZGVfaWlyID09IDAgJiYgZ3RfaWlyID09IDAgJiYgcGNoX2lpciA9PSAwKQorCWlmIChkZV9paXIgPT0gMCAmJiBndF9paXIgPT0gMCAmJiBwY2hfaWlyID09IDAgJiYKKwkgICAgKCFJU19HRU42KGRldikgfHwgcG1faWlyID09IDApKQogCQlnb3RvIGRvbmU7CiAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkKQEAgLTM0NCwxMiArNDgyLDEyIEBACiAJCQkJUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KTsKIAl9CiAKLQlpZiAoZ3RfaWlyICYgR1RfUElQRV9OT1RJRlkpCi0JCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJaWYgKGd0X2lpciAmIChHVF9VU0VSX0lOVEVSUlVQVCB8IEdUX1BJUEVfTk9USUZZKSkKKwkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbUkNTXSk7CiAJaWYgKGd0X2lpciAmIGJzZF91c3JfaW50ZXJydXB0KQotCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOwotCWlmIChIQVNfQkxUKGRldikgJiYgZ3RfaWlyICYgR1RfQkxUX1VTRVJfSU5URVJSVVBUKQotCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+Ymx0X3JpbmcpOworCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+cmluZ1tWQ1NdKTsKKwlpZiAoZ3RfaWlyICYgR1RfQkxUX1VTRVJfSU5URVJSVVBUKQorCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+cmluZ1tCQ1NdKTsKIAogCWlmIChkZV9paXIgJiBERV9HU0UpCiAJCWludGVsX29wcmVnaW9uX2dzZV9pbnRyKGRldik7CkBAIC0zNzEsMTQgKzUwOSwyMCBAQAogCQlkcm1faGFuZGxlX3ZibGFuayhkZXYsIDEpOwogCiAJLyogY2hlY2sgZXZlbnQgZnJvbSBQQ0ggKi8KLQlpZiAoKGRlX2lpciAmIERFX1BDSF9FVkVOVCkgJiYgKHBjaF9paXIgJiBob3RwbHVnX21hc2spKQotCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5ob3RwbHVnX3dvcmspOworCWlmIChkZV9paXIgJiBERV9QQ0hfRVZFTlQpIHsKKwkJaWYgKHBjaF9paXIgJiBob3RwbHVnX21hc2spCisJCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5ob3RwbHVnX3dvcmspOworCQlwY2hfaXJxX2hhbmRsZXIoZGV2KTsKKwl9CiAKIAlpZiAoZGVfaWlyICYgREVfUENVX0VWRU5UKSB7CiAJCUk5MTVfV1JJVEUxNihNRU1JTlRSU1RTLCBJOTE1X1JFQUQoTUVNSU5UUlNUUykpOwogCQlpOTE1X2hhbmRsZV9ycHNfY2hhbmdlKGRldik7CiAJfQogCisJaWYgKElTX0dFTjYoZGV2KSkKKwkJZ2VuNl9wbV9pcnFfaGFuZGxlcihkZXYpOworCiAJLyogc2hvdWxkIGNsZWFyIFBDSCBob3RwbHVnIGV2ZW50IGJlZm9yZSBjbGVhciBDUFUgaXJxICovCiAJSTkxNV9XUklURShTREVJSVIsIHBjaF9paXIpOwogCUk5MTVfV1JJVEUoR1RJSVIsIGd0X2lpcik7CkBAIC0zODYsNyArNTMwLDcgQEAKIAogZG9uZToKIAlJOTE1X1dSSVRFKERFSUVSLCBkZV9pZXIpOwotCSh2b2lkKUk5MTVfUkVBRChERUlFUik7CisJUE9TVElOR19SRUFEKERFSUVSKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00MjIsMjkgKzU2NiwyMyBAQAogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBzdGF0aWMgc3RydWN0IGRybV9pOTE1X2Vycm9yX29iamVjdCAqCi1pOTE1X2Vycm9yX29iamVjdF9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnNyYykKK2k5MTVfZXJyb3Jfb2JqZWN0X2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnNyYykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfb2JqZWN0ICpkc3Q7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnNyY19wcml2OwogCWludCBwYWdlLCBwYWdlX2NvdW50OwogCXUzMiByZWxvY19vZmZzZXQ7CiAKLQlpZiAoc3JjID09IE5VTEwpCisJaWYgKHNyYyA9PSBOVUxMIHx8IHNyYy0+cGFnZXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlzcmNfcHJpdiA9IHRvX2ludGVsX2JvKHNyYyk7Ci0JaWYgKHNyY19wcml2LT5wYWdlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXBhZ2VfY291bnQgPSBzcmMtPnNpemUgLyBQQUdFX1NJWkU7CisJcGFnZV9jb3VudCA9IHNyYy0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwogCiAJZHN0ID0ga21hbGxvYyhzaXplb2YoKmRzdCkgKyBwYWdlX2NvdW50ICogc2l6ZW9mICh1MzIgKiksIEdGUF9BVE9NSUMpOwogCWlmIChkc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZWxvY19vZmZzZXQgPSBzcmNfcHJpdi0+Z3R0X29mZnNldDsKKwlyZWxvY19vZmZzZXQgPSBzcmMtPmd0dF9vZmZzZXQ7CiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IHBhZ2VfY291bnQ7IHBhZ2UrKykgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl2b2lkIF9faW9tZW0gKnM7CkBAIC00NjYsNyArNjA0LDcgQEAKIAkJcmVsb2Nfb2Zmc2V0ICs9IFBBR0VfU0laRTsKIAl9CiAJZHN0LT5wYWdlX2NvdW50ID0gcGFnZV9jb3VudDsKLQlkc3QtPmd0dF9vZmZzZXQgPSBzcmNfcHJpdi0+Z3R0X29mZnNldDsKKwlkc3QtPmd0dF9vZmZzZXQgPSBzcmMtPmd0dF9vZmZzZXQ7CiAKIAlyZXR1cm4gZHN0OwogCkBAIC01MDMsNTMgKzY0MSw5OCBAQAogCWtmcmVlKGVycm9yKTsKIH0KIAotc3RhdGljIHUzMgotaTkxNV9nZXRfYmJhZGRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiAqcmluZykKK3N0YXRpYyB1MzIgY2FwdHVyZV9ib19saXN0KHN0cnVjdCBkcm1faTkxNV9lcnJvcl9idWZmZXIgKmVyciwKKwkJCSAgIGludCBjb3VudCwKKwkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0JdTMyIGNtZDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCBpID0gMDsKIAotCWlmIChJU19JODMwKGRldikgfHwgSVNfODQ1RyhkZXYpKQotCQljbWQgPSBNSV9CQVRDSF9CVUZGRVI7Ci0JZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKLQkJY21kID0gKE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8ICgyIDw8IDYpIHwKLQkJICAgICAgIE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NSk7Ci0JZWxzZQotCQljbWQgPSAoTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCBoZWFkLCBtbV9saXN0KSB7CisJCWVyci0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOworCQllcnItPm5hbWUgPSBvYmotPmJhc2UubmFtZTsKKwkJZXJyLT5zZXFubyA9IG9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm87CisJCWVyci0+Z3R0X29mZnNldCA9IG9iai0+Z3R0X29mZnNldDsKKwkJZXJyLT5yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucmVhZF9kb21haW5zOworCQllcnItPndyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CisJCWVyci0+ZmVuY2VfcmVnID0gb2JqLT5mZW5jZV9yZWc7CisJCWVyci0+cGlubmVkID0gMDsKKwkJaWYgKG9iai0+cGluX2NvdW50ID4gMCkKKwkJCWVyci0+cGlubmVkID0gMTsKKwkJaWYgKG9iai0+dXNlcl9waW5fY291bnQgPiAwKQorCQkJZXJyLT5waW5uZWQgPSAtMTsKKwkJZXJyLT50aWxpbmcgPSBvYmotPnRpbGluZ19tb2RlOworCQllcnItPmRpcnR5ID0gb2JqLT5kaXJ0eTsKKwkJZXJyLT5wdXJnZWFibGUgPSBvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEOworCQllcnItPnJpbmcgPSBvYmotPnJpbmcgPyBvYmotPnJpbmctPmlkIDogMDsKKwkJZXJyLT5hZ3BfdHlwZSA9IG9iai0+YWdwX3R5cGUgPT0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKIAotCXJldHVybiByaW5nWzBdID09IGNtZCA/IHJpbmdbMV0gOiAwOworCQlpZiAoKytpID09IGNvdW50KQorCQkJYnJlYWs7CisKKwkJZXJyKys7CisJfQorCisJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyB1MzIKLWk5MTVfcmluZ2J1ZmZlcl9sYXN0X2JhdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X2dlbV9yZWNvcmRfZmVuY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRybV9pOTE1X2Vycm9yX3N0YXRlICplcnJvcikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiBoZWFkLCBiYmFkZHI7Ci0JdTMyICpyaW5nOworCWludCBpOwogCi0JLyogTG9jYXRlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSByaW5nYnVmZmVyIGFuZCB3YWxrIGJhY2sKLQkgKiB0byBmaW5kIHRoZSBtb3N0IHJlY2VudGx5IGRpc3BhdGNoZWQgYmF0Y2ggYnVmZmVyLgotCSAqLwotCWJiYWRkciA9IDA7Ci0JaGVhZCA9IEk5MTVfUkVBRChQUkIwX0hFQUQpICYgSEVBRF9BRERSOwotCXJpbmcgPSAodTMyICopKGRldl9wcml2LT5yZW5kZXJfcmluZy52aXJ0dWFsX3N0YXJ0ICsgaGVhZCk7CisJLyogRmVuY2VzICovCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNjoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQllcnJvci0+ZmVuY2VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCkpOworCQlicmVhazsKKwljYXNlIDU6CisJY2FzZSA0OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWVycm9yLT5mZW5jZVtpXSA9IEk5MTVfUkVBRDY0KEZFTkNFX1JFR185NjVfMCArIChpICogOCkpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQorCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQllcnJvci0+ZmVuY2VbaSs4XSA9IEk5MTVfUkVBRChGRU5DRV9SRUdfOTQ1XzggKyAoaSAqIDQpKTsKKwljYXNlIDI6CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQllcnJvci0+ZmVuY2VbaV0gPSBJOTE1X1JFQUQoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSk7CisJCWJyZWFrOwogCi0Jd2hpbGUgKC0tcmluZyA+PSAodTMyICopZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQpIHsKLQkJYmJhZGRyID0gaTkxNV9nZXRfYmJhZGRyKGRldiwgcmluZyk7Ci0JCWlmIChiYmFkZHIpCi0JCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfb2JqZWN0ICoKK2k5MTVfZXJyb3JfZmlyc3RfYmF0Y2hidWZmZXIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1MzIgc2Vxbm87CisKKwlpZiAoIXJpbmctPmdldF9zZXFubykKKwkJcmV0dXJuIE5VTEw7CisKKwlzZXFubyA9IHJpbmctPmdldF9zZXFubyhyaW5nKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgeworCQlpZiAob2JqLT5yaW5nICE9IHJpbmcpCisJCQljb250aW51ZTsKKworCQlpZiAoaTkxNV9zZXFub19wYXNzZWQoc2Vxbm8sIG9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8pKQorCQkJY29udGludWU7CisKKwkJaWYgKChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NPTU1BTkQpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBXZSBuZWVkIHRvIGNvcHkgdGhlc2UgdG8gYW4gYW5vbnltb3VzIGJ1ZmZlciBhcyB0aGUgc2ltcGxlc3QKKwkJICogbWV0aG9kIHRvIGF2b2lkIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHVzZXJzcGFjZS4KKwkJICovCisJCXJldHVybiBpOTE1X2Vycm9yX29iamVjdF9jcmVhdGUoZGV2X3ByaXYsIG9iaik7CiAJfQogCi0JaWYgKGJiYWRkciA9PSAwKSB7Ci0JCXJpbmcgPSAodTMyICopKGRldl9wcml2LT5yZW5kZXJfcmluZy52aXJ0dWFsX3N0YXJ0Ci0JCQkJKyBkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZSk7Ci0JCXdoaWxlICgtLXJpbmcgPj0gKHUzMiAqKWRldl9wcml2LT5yZW5kZXJfcmluZy52aXJ0dWFsX3N0YXJ0KSB7Ci0JCQliYmFkZHIgPSBpOTE1X2dldF9iYmFkZHIoZGV2LCByaW5nKTsKLQkJCWlmIChiYmFkZHIpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gYmJhZGRyOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTU2NCwxMiArNzQ3LDEwIEBACiBzdGF0aWMgdm9pZCBpOTE1X2NhcHR1cmVfZXJyb3Jfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9zdGF0ZSAqZXJyb3I7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpiYXRjaGJ1ZmZlclsyXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBiYmFkZHI7Ci0JaW50IGNvdW50OworCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5lcnJvcl9sb2NrLCBmbGFncyk7CiAJZXJyb3IgPSBkZXZfcHJpdi0+Zmlyc3RfZXJyb3I7CkBAIC01ODUsMjAgKzc2NiwzMyBAQAogCiAJRFJNX0RFQlVHX0RSSVZFUigiZ2VuZXJhdGluZyBlcnJvciBldmVudFxuIik7CiAKLQllcnJvci0+c2Vxbm8gPQotCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2V0X3NlcW5vKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJZXJyb3ItPnNlcW5vID0gZGV2X3ByaXYtPnJpbmdbUkNTXS5nZXRfc2Vxbm8oJmRldl9wcml2LT5yaW5nW1JDU10pOwogCWVycm9yLT5laXIgPSBJOTE1X1JFQUQoRUlSKTsKIAllcnJvci0+cGd0YmxfZXIgPSBJOTE1X1JFQUQoUEdUQkxfRVIpOwogCWVycm9yLT5waXBlYXN0YXQgPSBJOTE1X1JFQUQoUElQRUFTVEFUKTsKIAllcnJvci0+cGlwZWJzdGF0ID0gSTkxNV9SRUFEKFBJUEVCU1RBVCk7CiAJZXJyb3ItPmluc3RwbSA9IEk5MTVfUkVBRChJTlNUUE0pOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpIHsKLQkJZXJyb3ItPmlwZWlyID0gSTkxNV9SRUFEKElQRUlSKTsKLQkJZXJyb3ItPmlwZWhyID0gSTkxNV9SRUFEKElQRUhSKTsKLQkJZXJyb3ItPmluc3Rkb25lID0gSTkxNV9SRUFEKElOU1RET05FKTsKLQkJZXJyb3ItPmFjdGhkID0gSTkxNV9SRUFEKEFDVEhEKTsKLQkJZXJyb3ItPmJiYWRkciA9IDA7Ci0JfSBlbHNlIHsKKwllcnJvci0+ZXJyb3IgPSAwOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCWVycm9yLT5lcnJvciA9IEk5MTVfUkVBRChFUlJPUl9HRU42KTsKKworCQllcnJvci0+YmNzX2FjdGhkID0gSTkxNV9SRUFEKEJDU19BQ1RIRCk7CisJCWVycm9yLT5iY3NfaXBlaHIgPSBJOTE1X1JFQUQoQkNTX0lQRUhSKTsKKwkJZXJyb3ItPmJjc19pcGVpciA9IEk5MTVfUkVBRChCQ1NfSVBFSVIpOworCQllcnJvci0+YmNzX2luc3Rkb25lID0gSTkxNV9SRUFEKEJDU19JTlNURE9ORSk7CisJCWVycm9yLT5iY3Nfc2Vxbm8gPSAwOworCQlpZiAoZGV2X3ByaXYtPnJpbmdbQkNTXS5nZXRfc2Vxbm8pCisJCQllcnJvci0+YmNzX3NlcW5vID0gZGV2X3ByaXYtPnJpbmdbQkNTXS5nZXRfc2Vxbm8oJmRldl9wcml2LT5yaW5nW0JDU10pOworCisJCWVycm9yLT52Y3NfYWN0aGQgPSBJOTE1X1JFQUQoVkNTX0FDVEhEKTsKKwkJZXJyb3ItPnZjc19pcGVociA9IEk5MTVfUkVBRChWQ1NfSVBFSFIpOworCQllcnJvci0+dmNzX2lwZWlyID0gSTkxNV9SRUFEKFZDU19JUEVJUik7CisJCWVycm9yLT52Y3NfaW5zdGRvbmUgPSBJOTE1X1JFQUQoVkNTX0lOU1RET05FKTsKKwkJZXJyb3ItPnZjc19zZXFubyA9IDA7CisJCWlmIChkZXZfcHJpdi0+cmluZ1tWQ1NdLmdldF9zZXFubykKKwkJCWVycm9yLT52Y3Nfc2Vxbm8gPSBkZXZfcHJpdi0+cmluZ1tWQ1NdLmdldF9zZXFubygmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CisJfQorCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CiAJCWVycm9yLT5pcGVpciA9IEk5MTVfUkVBRChJUEVJUl9JOTY1KTsKIAkJZXJyb3ItPmlwZWhyID0gSTkxNV9SRUFEKElQRUhSX0k5NjUpOwogCQllcnJvci0+aW5zdGRvbmUgPSBJOTE1X1JFQUQoSU5TVERPTkVfSTk2NSk7CkBAIC02MDYsMTE4ICs4MDAsNjEgQEAKIAkJZXJyb3ItPmluc3Rkb25lMSA9IEk5MTVfUkVBRChJTlNURE9ORTEpOwogCQllcnJvci0+YWN0aGQgPSBJOTE1X1JFQUQoQUNUSERfSTk2NSk7CiAJCWVycm9yLT5iYmFkZHIgPSBJOTE1X1JFQUQ2NChCQl9BRERSKTsKKwl9IGVsc2UgeworCQllcnJvci0+aXBlaXIgPSBJOTE1X1JFQUQoSVBFSVIpOworCQllcnJvci0+aXBlaHIgPSBJOTE1X1JFQUQoSVBFSFIpOworCQllcnJvci0+aW5zdGRvbmUgPSBJOTE1X1JFQUQoSU5TVERPTkUpOworCQllcnJvci0+YWN0aGQgPSBJOTE1X1JFQUQoQUNUSEQpOworCQllcnJvci0+YmJhZGRyID0gMDsKIAl9CisJaTkxNV9nZW1fcmVjb3JkX2ZlbmNlcyhkZXYsIGVycm9yKTsKIAotCWJiYWRkciA9IGk5MTVfcmluZ2J1ZmZlcl9sYXN0X2JhdGNoKGRldik7Ci0KLQkvKiBHcmFiIHRoZSBjdXJyZW50IGJhdGNoYnVmZmVyLCBtb3N0IGxpa2VseSB0byBoYXZlIGNyYXNoZWQuICovCi0JYmF0Y2hidWZmZXJbMF0gPSBOVUxMOwotCWJhdGNoYnVmZmVyWzFdID0gTlVMTDsKLQljb3VudCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgewotCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZvYmpfcHJpdi0+YmFzZTsKLQotCQlpZiAoYmF0Y2hidWZmZXJbMF0gPT0gTlVMTCAmJgotCQkgICAgYmJhZGRyID49IG9ial9wcml2LT5ndHRfb2Zmc2V0ICYmCi0JCSAgICBiYmFkZHIgPCBvYmpfcHJpdi0+Z3R0X29mZnNldCArIG9iai0+c2l6ZSkKLQkJCWJhdGNoYnVmZmVyWzBdID0gb2JqOwotCi0JCWlmIChiYXRjaGJ1ZmZlclsxXSA9PSBOVUxMICYmCi0JCSAgICBlcnJvci0+YWN0aGQgPj0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiYKLQkJICAgIGVycm9yLT5hY3RoZCA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQotCQkJYmF0Y2hidWZmZXJbMV0gPSBvYmo7Ci0KLQkJY291bnQrKzsKLQl9Ci0JLyogU2NhbiB0aGUgb3RoZXIgbGlzdHMgZm9yIGNvbXBsZXRlbmVzcyBmb3IgdGhvc2UgYml6YXJyZSBlcnJvcnMuICovCi0JaWYgKGJhdGNoYnVmZmVyWzBdID09IE5VTEwgfHwgYmF0Y2hidWZmZXJbMV0gPT0gTlVMTCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsIG1tX2xpc3QpIHsKLQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gJm9ial9wcml2LT5iYXNlOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMF0gPT0gTlVMTCAmJgotCQkJICAgIGJiYWRkciA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkJICAgIGJiYWRkciA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQotCQkJCWJhdGNoYnVmZmVyWzBdID0gb2JqOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMV0gPT0gTlVMTCAmJgotCQkJICAgIGVycm9yLT5hY3RoZCA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkJICAgIGVycm9yLT5hY3RoZCA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQotCQkJCWJhdGNoYnVmZmVyWzFdID0gb2JqOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMF0gJiYgYmF0Y2hidWZmZXJbMV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGJhdGNoYnVmZmVyWzBdID09IE5VTEwgfHwgYmF0Y2hidWZmZXJbMV0gPT0gTlVMTCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKLQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gJm9ial9wcml2LT5iYXNlOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMF0gPT0gTlVMTCAmJgotCQkJICAgIGJiYWRkciA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkJICAgIGJiYWRkciA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQotCQkJCWJhdGNoYnVmZmVyWzBdID0gb2JqOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMV0gPT0gTlVMTCAmJgotCQkJICAgIGVycm9yLT5hY3RoZCA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkJICAgIGVycm9yLT5hY3RoZCA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQotCQkJCWJhdGNoYnVmZmVyWzFdID0gb2JqOwotCi0JCQlpZiAoYmF0Y2hidWZmZXJbMF0gJiYgYmF0Y2hidWZmZXJbMV0pCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBXZSBuZWVkIHRvIGNvcHkgdGhlc2UgdG8gYW4gYW5vbnltb3VzIGJ1ZmZlciBhcyB0aGUgc2ltcGxlc3QKLQkgKiBtZXRob2QgdG8gYXZvaWQgYmVpbmcgb3ZlcndyaXR0ZW4gYnkgdXNlcnNwYWNlLgotCSAqLwotCWVycm9yLT5iYXRjaGJ1ZmZlclswXSA9IGk5MTVfZXJyb3Jfb2JqZWN0X2NyZWF0ZShkZXYsIGJhdGNoYnVmZmVyWzBdKTsKLQlpZiAoYmF0Y2hidWZmZXJbMV0gIT0gYmF0Y2hidWZmZXJbMF0pCi0JCWVycm9yLT5iYXRjaGJ1ZmZlclsxXSA9IGk5MTVfZXJyb3Jfb2JqZWN0X2NyZWF0ZShkZXYsIGJhdGNoYnVmZmVyWzFdKTsKLQllbHNlCi0JCWVycm9yLT5iYXRjaGJ1ZmZlclsxXSA9IE5VTEw7CisJLyogUmVjb3JkIHRoZSBhY3RpdmUgYmF0Y2hidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWVycm9yLT5iYXRjaGJ1ZmZlcltpXSA9CisJCQlpOTE1X2Vycm9yX2ZpcnN0X2JhdGNoYnVmZmVyKGRldl9wcml2LAorCQkJCQkJICAgICAmZGV2X3ByaXYtPnJpbmdbaV0pOwogCiAJLyogUmVjb3JkIHRoZSByaW5nYnVmZmVyICovCi0JZXJyb3ItPnJpbmdidWZmZXIgPSBpOTE1X2Vycm9yX29iamVjdF9jcmVhdGUoZGV2LAotCQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdlbV9vYmplY3QpOworCWVycm9yLT5yaW5nYnVmZmVyID0gaTkxNV9lcnJvcl9vYmplY3RfY3JlYXRlKGRldl9wcml2LAorCQkJCQkJICAgICBkZXZfcHJpdi0+cmluZ1tSQ1NdLm9iaik7CiAKLQkvKiBSZWNvcmQgYnVmZmVycyBvbiB0aGUgYWN0aXZlIGxpc3QuICovCisJLyogUmVjb3JkIGJ1ZmZlcnMgb24gdGhlIGFjdGl2ZSBhbmQgcGlubmVkIGxpc3RzLiAqLwogCWVycm9yLT5hY3RpdmVfYm8gPSBOVUxMOwotCWVycm9yLT5hY3RpdmVfYm9fY291bnQgPSAwOworCWVycm9yLT5waW5uZWRfYm8gPSBOVUxMOwogCi0JaWYgKGNvdW50KQotCQllcnJvci0+YWN0aXZlX2JvID0ga21hbGxvYyhzaXplb2YoKmVycm9yLT5hY3RpdmVfYm8pKmNvdW50LAorCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KQorCQlpKys7CisJZXJyb3ItPmFjdGl2ZV9ib19jb3VudCA9IGk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QsIG1tX2xpc3QpCisJCWkrKzsKKwllcnJvci0+cGlubmVkX2JvX2NvdW50ID0gaSAtIGVycm9yLT5hY3RpdmVfYm9fY291bnQ7CisKKwlpZiAoaSkgeworCQllcnJvci0+YWN0aXZlX2JvID0ga21hbGxvYyhzaXplb2YoKmVycm9yLT5hY3RpdmVfYm8pKmksCiAJCQkJCSAgIEdGUF9BVE9NSUMpOwotCi0JaWYgKGVycm9yLT5hY3RpdmVfYm8pIHsKLQkJaW50IGkgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7Ci0JCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZvYmpfcHJpdi0+YmFzZTsKLQotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5zaXplID0gb2JqLT5zaXplOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5uYW1lID0gb2JqLT5uYW1lOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5zZXFubyA9IG9ial9wcml2LT5sYXN0X3JlbmRlcmluZ19zZXFubzsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0uZ3R0X29mZnNldCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWluczsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0ud3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLmZlbmNlX3JlZyA9IG9ial9wcml2LT5mZW5jZV9yZWc7Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLnBpbm5lZCA9IDA7Ci0JCQlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCA+IDApCi0JCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5waW5uZWQgPSAxOwotCQkJaWYgKG9ial9wcml2LT51c2VyX3Bpbl9jb3VudCA+IDApCi0JCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5waW5uZWQgPSAtMTsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0udGlsaW5nID0gb2JqX3ByaXYtPnRpbGluZ19tb2RlOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5kaXJ0eSA9IG9ial9wcml2LT5kaXJ0eTsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0ucHVyZ2VhYmxlID0gb2JqX3ByaXYtPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEOwotCi0JCQlpZiAoKytpID09IGNvdW50KQotCQkJCWJyZWFrOwotCQl9Ci0JCWVycm9yLT5hY3RpdmVfYm9fY291bnQgPSBpOworCQlpZiAoZXJyb3ItPmFjdGl2ZV9ibykKKwkJCWVycm9yLT5waW5uZWRfYm8gPQorCQkJCWVycm9yLT5hY3RpdmVfYm8gKyBlcnJvci0+YWN0aXZlX2JvX2NvdW50OwogCX0KIAorCWlmIChlcnJvci0+YWN0aXZlX2JvKQorCQllcnJvci0+YWN0aXZlX2JvX2NvdW50ID0KKwkJCWNhcHR1cmVfYm9fbGlzdChlcnJvci0+YWN0aXZlX2JvLAorCQkJCQllcnJvci0+YWN0aXZlX2JvX2NvdW50LAorCQkJCQkmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KTsKKworCWlmIChlcnJvci0+cGlubmVkX2JvKQorCQllcnJvci0+cGlubmVkX2JvX2NvdW50ID0KKwkJCWNhcHR1cmVfYm9fbGlzdChlcnJvci0+cGlubmVkX2JvLAorCQkJCQllcnJvci0+cGlubmVkX2JvX2NvdW50LAorCQkJCQkmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0KTsKKwogCWRvX2dldHRpbWVvZmRheSgmZXJyb3ItPnRpbWUpOwogCiAJZXJyb3ItPm92ZXJsYXkgPSBpbnRlbF9vdmVybGF5X2NhcHR1cmVfZXJyb3Jfc3RhdGUoZGV2KTsKKwllcnJvci0+ZGlzcGxheSA9IGludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5lcnJvcl9sb2NrLCBmbGFncyk7CiAJaWYgKGRldl9wcml2LT5maXJzdF9lcnJvciA9PSBOVUxMKSB7CkBAIC03NzUsNyArOTEyLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiICBBQ1RIRDogMHglMDh4XG4iLAogCQkJICAgICAgIEk5MTVfUkVBRChBQ1RIRF9JOTY1KSk7CiAJCQlJOTE1X1dSSVRFKElQRUlSX0k5NjUsIGlwZWlyKTsKLQkJCSh2b2lkKUk5MTVfUkVBRChJUEVJUl9JOTY1KTsKKwkJCVBPU1RJTkdfUkVBRChJUEVJUl9JOTY1KTsKIAkJfQogCQlpZiAoZWlyICYgR000NV9FUlJPUl9QQUdFX1RBQkxFKSB7CiAJCQl1MzIgcGd0YmxfZXJyID0gSTkxNV9SRUFEKFBHVEJMX0VSKTsKQEAgLTc4Myw3ICs5MjAsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICIgIFBHVEJMX0VSOiAweCUwOHhcbiIsCiAJCQkgICAgICAgcGd0YmxfZXJyKTsKIAkJCUk5MTVfV1JJVEUoUEdUQkxfRVIsIHBndGJsX2Vycik7Ci0JCQkodm9pZClJOTE1X1JFQUQoUEdUQkxfRVIpOworCQkJUE9TVElOR19SRUFEKFBHVEJMX0VSKTsKIAkJfQogCX0KIApAQCAtNzk0LDcgKzkzMSw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiAgUEdUQkxfRVI6IDB4JTA4eFxuIiwKIAkJCSAgICAgICBwZ3RibF9lcnIpOwogCQkJSTkxNV9XUklURShQR1RCTF9FUiwgcGd0YmxfZXJyKTsKLQkJCSh2b2lkKUk5MTVfUkVBRChQR1RCTF9FUik7CisJCQlQT1NUSU5HX1JFQUQoUEdUQkxfRVIpOwogCQl9CiAJfQogCkBAIC04MjUsNyArOTYyLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiICBBQ1RIRDogMHglMDh4XG4iLAogCQkJICAgICAgIEk5MTVfUkVBRChBQ1RIRCkpOwogCQkJSTkxNV9XUklURShJUEVJUiwgaXBlaXIpOwotCQkJKHZvaWQpSTkxNV9SRUFEKElQRUlSKTsKKwkJCVBPU1RJTkdfUkVBRChJUEVJUik7CiAJCX0gZWxzZSB7CiAJCQl1MzIgaXBlaXIgPSBJOTE1X1JFQUQoSVBFSVJfSTk2NSk7CiAKQEAgLTg0MiwxMiArOTc5LDEyIEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiAgQUNUSEQ6IDB4JTA4eFxuIiwKIAkJCSAgICAgICBJOTE1X1JFQUQoQUNUSERfSTk2NSkpOwogCQkJSTkxNV9XUklURShJUEVJUl9JOTY1LCBpcGVpcik7Ci0JCQkodm9pZClJOTE1X1JFQUQoSVBFSVJfSTk2NSk7CisJCQlQT1NUSU5HX1JFQUQoSVBFSVJfSTk2NSk7CiAJCX0KIAl9CiAKIAlJOTE1X1dSSVRFKEVJUiwgZWlyKTsKLQkodm9pZClJOTE1X1JFQUQoRUlSKTsKKwlQT1NUSU5HX1JFQUQoRUlSKTsKIAllaXIgPSBJOTE1X1JFQUQoRUlSKTsKIAlpZiAoZWlyKSB7CiAJCS8qCkBAIC04NzAsNyArMTAwNyw3IEBACiAgKiBzbyB1c2Vyc3BhY2Uga25vd3Mgc29tZXRoaW5nIGJhZCBoYXBwZW5lZCAoc2hvdWxkIHRyaWdnZXIgY29sbGVjdGlvbgogICogb2YgYSByaW5nIGR1bXAgZXRjLikuCiAgKi8KLXN0YXRpYyB2b2lkIGk5MTVfaGFuZGxlX2Vycm9yKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgd2VkZ2VkKQordm9pZCBpOTE1X2hhbmRsZV9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHdlZGdlZCkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC04ODQsMTEgKzEwMjEsMTEgQEAKIAkJLyoKIAkJICogV2FrZXVwIHdhaXRpbmcgcHJvY2Vzc2VzIHNvIHRoZXkgZG9uJ3QgaGFuZwogCQkgKi8KLQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5yZW5kZXJfcmluZy5pcnFfcXVldWUpOworCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPnJpbmdbUkNTXS5pcnFfcXVldWUpOwogCQlpZiAoSEFTX0JTRChkZXYpKQotCQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5ic2RfcmluZy5pcnFfcXVldWUpOworCQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5yaW5nW1ZDU10uaXJxX3F1ZXVlKTsKIAkJaWYgKEhBU19CTFQoZGV2KSkKLQkJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+Ymx0X3JpbmcuaXJxX3F1ZXVlKTsKKwkJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+cmluZ1tCQ1NdLmlycV9xdWV1ZSk7CiAJfQogCiAJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+ZXJyb3Jfd29yayk7CkBAIC04OTksNyArMTAzNiw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZGV2X3ByaXYtPnBpcGVfdG9fY3J0Y19tYXBwaW5nW3BpcGVdOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayAqd29yazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgc3RhbGxfZGV0ZWN0ZWQ7CkBAIC05MTgsMTMgKzEwNTUsMTMgQEAKIAl9CiAKIAkvKiBQb3RlbnRpYWwgc3RhbGwgLSBpZiB3ZSBzZWUgdGhhdCB0aGUgZmxpcCBoYXMgaGFwcGVuZWQsIGFzc3VtZSBhIG1pc3NlZCBpbnRlcnJ1cHQgKi8KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKHdvcmstPnBlbmRpbmdfZmxpcF9vYmopOworCW9iaiA9IHdvcmstPnBlbmRpbmdfZmxpcF9vYmo7CiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKIAkJaW50IGRzcHN1cmYgPSBpbnRlbF9jcnRjLT5wbGFuZSA9PSAwID8gRFNQQVNVUkYgOiBEU1BCU1VSRjsKLQkJc3RhbGxfZGV0ZWN0ZWQgPSBJOTE1X1JFQUQoZHNwc3VyZikgPT0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJCXN0YWxsX2RldGVjdGVkID0gSTkxNV9SRUFEKGRzcHN1cmYpID09IG9iai0+Z3R0X29mZnNldDsKIAl9IGVsc2UgewogCQlpbnQgZHNwYWRkciA9IGludGVsX2NydGMtPnBsYW5lID09IDAgPyBEU1BBQUREUiA6IERTUEJBRERSOwotCQlzdGFsbF9kZXRlY3RlZCA9IEk5MTVfUkVBRChkc3BhZGRyKSA9PSAob2JqX3ByaXYtPmd0dF9vZmZzZXQgKworCQlzdGFsbF9kZXRlY3RlZCA9IEk5MTVfUkVBRChkc3BhZGRyKSA9PSAob2JqLT5ndHRfb2Zmc2V0ICsKIAkJCQkJCQljcnRjLT55ICogY3J0Yy0+ZmItPnBpdGNoICsKIAkJCQkJCQljcnRjLT54ICogY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsLzgpOwogCX0KQEAgLTk3MCw3ICsxMTA3LDcgQEAKIAkJICogSXQgZG9lc24ndCBzZXQgdGhlIGJpdCBpbiBpaXIgYWdhaW4sIGJ1dCBpdCBzdGlsbCBwcm9kdWNlcwogCQkgKiBpbnRlcnJ1cHRzIChmb3Igbm9uLU1TSSkuCiAJCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCQlwaXBlYV9zdGF0cyA9IEk5MTVfUkVBRChQSVBFQVNUQVQpOwogCQlwaXBlYl9zdGF0cyA9IEk5MTVfUkVBRChQSVBFQlNUQVQpOwogCkBAIC05OTMsNyArMTEzMCw3IEBACiAJCQlJOTE1X1dSSVRFKFBJUEVCU1RBVCwgcGlwZWJfc3RhdHMpOwogCQkJaXJxX3JlY2VpdmVkID0gMTsKIAkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCQlpZiAoIWlycV9yZWNlaXZlZCkKIAkJCWJyZWFrOwpAQCAtMTAyNiw5ICsxMTYzLDkgQEAKIAkJfQogCiAJCWlmIChpaXIgJiBJOTE1X1VTRVJfSU5URVJSVVBUKQotCQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQkJaWYgKEhBU19CU0QoZGV2KSAmJiAoaWlyICYgSTkxNV9CU0RfVVNFUl9JTlRFUlJVUFQpKQotCQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKKwkJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yaW5nW1JDU10pOworCQlpZiAoaWlyICYgSTkxNV9CU0RfVVNFUl9JTlRFUlJVUFQpCisJCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+cmluZ1tWQ1NdKTsKIAogCQlpZiAoaWlyICYgSTkxNV9ESVNQTEFZX1BMQU5FX0FfRkxJUF9QRU5ESU5HX0lOVEVSUlVQVCkgewogCQkJaW50ZWxfcHJlcGFyZV9wYWdlX2ZsaXAoZGV2LCAwKTsKQEAgLTExMDEsMTIgKzEyMzgsMTMgQEAKIAlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCiAJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcjsKIAotCUJFR0lOX0xQX1JJTkcoNCk7Ci0JT1VUX1JJTkcoTUlfU1RPUkVfRFdPUkRfSU5ERVgpOwotCU9VVF9SSU5HKEk5MTVfQlJFQURDUlVNQl9JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7Ci0JT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOwotCU9VVF9SSU5HKE1JX1VTRVJfSU5URVJSVVBUKTsKLQlBRFZBTkNFX0xQX1JJTkcoKTsKKwlpZiAoQkVHSU5fTFBfUklORyg0KSA9PSAwKSB7CisJCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKKwkJT1VUX1JJTkcoSTkxNV9CUkVBRENSVU1CX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOworCQlPVVRfUklORyhNSV9VU0VSX0lOVEVSUlVQVCk7CisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KIAogCXJldHVybiBkZXZfcHJpdi0+Y291bnRlcjsKIH0KQEAgLTExMTQsMTIgKzEyNTIsMTEgQEAKIHZvaWQgaTkxNV90cmFjZV9pcnFfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzZXFubykKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmVuZGVyX3JpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCi0JaWYgKGRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPT0gMCkKLQkJcmVuZGVyX3JpbmctPnVzZXJfaXJxX2dldChkZXYsIHJlbmRlcl9yaW5nKTsKLQotCWRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPSBzZXFubzsKKwlpZiAoZGV2X3ByaXYtPnRyYWNlX2lycV9zZXFubyA9PSAwICYmCisJICAgIHJpbmctPmlycV9nZXQocmluZykpCisJCWRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPSBzZXFubzsKIH0KIAogc3RhdGljIGludCBpOTE1X3dhaXRfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgaXJxX25yKQpAQCAtMTEyNyw3ICsxMjY0LDcgQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyZW5kZXJfcmluZyA9ICZkZXZfcHJpdi0+cmVuZGVyX3Jpbmc7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CiAKIAlEUk1fREVCVUdfRFJJVkVSKCJpcnFfbnI9JWQgYnJlYWRjcnVtYj0lZFxuIiwgaXJxX25yLAogCQkgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikpOwpAQCAtMTE0MSwxMCArMTI3OCwxMiBAQAogCWlmIChtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdikKIAkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfV0FJVDsKIAotCXJlbmRlcl9yaW5nLT51c2VyX2lycV9nZXQoZGV2LCByZW5kZXJfcmluZyk7Ci0JRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+cmVuZGVyX3JpbmcuaXJxX3F1ZXVlLCAzICogRFJNX0haLAotCQkgICAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpOwotCXJlbmRlcl9yaW5nLT51c2VyX2lycV9wdXQoZGV2LCByZW5kZXJfcmluZyk7CisJcmV0ID0gLUVOT0RFVjsKKwlpZiAocmluZy0+aXJxX2dldChyaW5nKSkgeworCQlEUk1fV0FJVF9PTihyZXQsIHJpbmctPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKKwkJCSAgICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucik7CisJCXJpbmctPmlycV9wdXQocmluZyk7CisJfQogCiAJaWYgKHJldCA9PSAtRUJVU1kpIHsKIAkJRFJNX0VSUk9SKCJFQlVTWSAtLSByZWM6ICVkIGVtaXR0ZWQ6ICVkXG4iLApAQCAtMTE2Myw3ICsxMzAyLDcgQEAKIAlkcm1faTkxNV9pcnFfZW1pdF90ICplbWl0ID0gZGF0YTsKIAlpbnQgcmVzdWx0OwogCi0JaWYgKCFkZXZfcHJpdiB8fCAhZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQpIHsKKwlpZiAoIWRldl9wcml2IHx8ICFMUF9SSU5HKGRldl9wcml2KS0+dmlydHVhbF9zdGFydCkgewogCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTIwOSw5ICsxMzQ4LDkgQEAKIAlpZiAoIWk5MTVfcGlwZV9lbmFibGVkKGRldiwgcGlwZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCWlmIChIQVNfUENIX1NQTElUKGRldikpCi0JCWlyb25sYWtlX2VuYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgKHBpcGUgPT0gMCkgPyAKKwkJaXJvbmxha2VfZW5hYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCAocGlwZSA9PSAwKSA/CiAJCQkJCSAgICBERV9QSVBFQV9WQkxBTks6IERFX1BJUEVCX1ZCTEFOSyk7CiAJZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKIAkJaTkxNV9lbmFibGVfcGlwZXN0YXQoZGV2X3ByaXYsIHBpcGUsCkBAIC0xMjE5LDcgKzEzNTgsNyBAQAogCWVsc2UKIAkJaTkxNV9lbmFibGVfcGlwZXN0YXQoZGV2X3ByaXYsIHBpcGUsCiAJCQkJICAgICBQSVBFX1ZCTEFOS19JTlRFUlJVUFRfRU5BQkxFKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjMxLDE1ICsxMzcwLDE1IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCWlmIChIQVNfUENIX1NQTElUKGRldikpCi0JCWlyb25sYWtlX2Rpc2FibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIChwaXBlID09IDApID8gCisJCWlyb25sYWtlX2Rpc2FibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIChwaXBlID09IDApID8KIAkJCQkJICAgICBERV9QSVBFQV9WQkxBTks6IERFX1BJUEVCX1ZCTEFOSyk7CiAJZWxzZQogCQlpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZGV2X3ByaXYsIHBpcGUsCiAJCQkJICAgICAgUElQRV9WQkxBTktfSU5URVJSVVBUX0VOQUJMRSB8CiAJCQkJICAgICAgUElQRV9TVEFSVF9WQkxBTktfSU5URVJSVVBUX0VOQUJMRSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIH0KIAogdm9pZCBpOTE1X2VuYWJsZV9pbnRlcnJ1cHQgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0xMzA2LDEyICsxNDQ1LDUwIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKgotaTkxNV9nZXRfdGFpbF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdTMyCityaW5nX2xhc3Rfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXJldHVybiBsaXN0X2VudHJ5KGRldl9wcml2LT5yZW5kZXJfcmluZy5yZXF1ZXN0X2xpc3QucHJldiwKLQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCwgbGlzdCk7CisJcmV0dXJuIGxpc3RfZW50cnkocmluZy0+cmVxdWVzdF9saXN0LnByZXYsCisJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCwgbGlzdCktPnNlcW5vOworfQorCitzdGF0aWMgYm9vbCBpOTE1X2hhbmdjaGVja19yaW5nX2lkbGUoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBib29sICplcnIpCit7CisJaWYgKGxpc3RfZW1wdHkoJnJpbmctPnJlcXVlc3RfbGlzdCkgfHwKKwkgICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCByaW5nX2xhc3Rfc2Vxbm8ocmluZykpKSB7CisJCS8qIElzc3VlIGEgd2FrZS11cCB0byBjYXRjaCBzdHVjayBoL3cuICovCisJCWlmIChyaW5nLT53YWl0aW5nX3NlcW5vICYmIHdhaXRxdWV1ZV9hY3RpdmUoJnJpbmctPmlycV9xdWV1ZSkpIHsKKwkJCURSTV9FUlJPUigiSGFuZ2NoZWNrIHRpbWVyIGVsYXBzZWQuLi4gJXMgaWRsZSBbd2FpdGluZyBvbiAlZCwgYXQgJWRdLCBtaXNzZWQgSVJRP1xuIiwKKwkJCQkgIHJpbmctPm5hbWUsCisJCQkJICByaW5nLT53YWl0aW5nX3NlcW5vLAorCQkJCSAgcmluZy0+Z2V0X3NlcW5vKHJpbmcpKTsKKwkJCXdha2VfdXBfYWxsKCZyaW5nLT5pcnFfcXVldWUpOworCQkJKmVyciA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wga2lja19yaW5nKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHRtcCA9IEk5MTVfUkVBRF9DVEwocmluZyk7CisJaWYgKHRtcCAmIFJJTkdfV0FJVCkgeworCQlEUk1fRVJST1IoIktpY2tpbmcgc3R1Y2sgd2FpdCBvbiAlc1xuIiwKKwkJCSAgcmluZy0+bmFtZSk7CisJCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIHRtcCk7CisJCXJldHVybiB0cnVlOworCX0KKwlpZiAoSVNfR0VONihkZXYpICYmCisJICAgICh0bXAgJiBSSU5HX1dBSVRfU0VNQVBIT1JFKSkgeworCQlEUk1fRVJST1IoIktpY2tpbmcgc3R1Y2sgc2VtYXBob3JlIG9uICVzXG4iLAorCQkJICByaW5nLT5uYW1lKTsKKwkJSTkxNV9XUklURV9DVEwocmluZywgdG1wKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKIH0KIAogLyoqCkBAIC0xMzI1LDYgKzE1MDIsMTcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopZGF0YTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBhY3RoZCwgaW5zdGRvbmUsIGluc3Rkb25lMTsKKwlib29sIGVyciA9IGZhbHNlOworCisJLyogSWYgYWxsIHdvcmsgaXMgZG9uZSB0aGVuIEFDVEhEIGNsZWFybHkgaGFzbid0IGFkdmFuY2VkLiAqLworCWlmIChpOTE1X2hhbmdjaGVja19yaW5nX2lkbGUoJmRldl9wcml2LT5yaW5nW1JDU10sICZlcnIpICYmCisJICAgIGk5MTVfaGFuZ2NoZWNrX3JpbmdfaWRsZSgmZGV2X3ByaXYtPnJpbmdbVkNTXSwgJmVycikgJiYKKwkgICAgaTkxNV9oYW5nY2hlY2tfcmluZ19pZGxlKCZkZXZfcHJpdi0+cmluZ1tCQ1NdLCAmZXJyKSkgeworCQlkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50ID0gMDsKKwkJaWYgKGVycikKKwkJCWdvdG8gcmVwZWF0OworCQlyZXR1cm47CisJfQogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkgewogCQlhY3RoZCA9IEk5MTVfUkVBRChBQ1RIRCk7CkBAIC0xMzM2LDM4ICsxNTI0LDYgQEAKIAkJaW5zdGRvbmUxID0gSTkxNV9SRUFEKElOU1RET05FMSk7CiAJfQogCi0JLyogSWYgYWxsIHdvcmsgaXMgZG9uZSB0aGVuIEFDVEhEIGNsZWFybHkgaGFzbid0IGFkdmFuY2VkLiAqLwotCWlmIChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KSB8fAotCQlpOTE1X3NlcW5vX3Bhc3NlZChkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2V0X3NlcW5vKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyksCi0JCQkJICBpOTE1X2dldF90YWlsX3JlcXVlc3QoZGV2KS0+c2Vxbm8pKSB7Ci0JCWJvb2wgbWlzc2VkX3dha2V1cCA9IGZhbHNlOwotCi0JCWRldl9wcml2LT5oYW5nY2hlY2tfY291bnQgPSAwOwotCi0JCS8qIElzc3VlIGEgd2FrZS11cCB0byBjYXRjaCBzdHVjayBoL3cuICovCi0JCWlmIChkZXZfcHJpdi0+cmVuZGVyX3Jpbmcud2FpdGluZ19nZW1fc2Vxbm8gJiYKLQkJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJmRldl9wcml2LT5yZW5kZXJfcmluZy5pcnFfcXVldWUpKSB7Ci0JCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmlycV9xdWV1ZSk7Ci0JCQltaXNzZWRfd2FrZXVwID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChkZXZfcHJpdi0+YnNkX3Jpbmcud2FpdGluZ19nZW1fc2Vxbm8gJiYKLQkJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJmRldl9wcml2LT5ic2RfcmluZy5pcnFfcXVldWUpKSB7Ci0JCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmJzZF9yaW5nLmlycV9xdWV1ZSk7Ci0JCQltaXNzZWRfd2FrZXVwID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChkZXZfcHJpdi0+Ymx0X3Jpbmcud2FpdGluZ19nZW1fc2Vxbm8gJiYKLQkJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJmRldl9wcml2LT5ibHRfcmluZy5pcnFfcXVldWUpKSB7Ci0JCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmJsdF9yaW5nLmlycV9xdWV1ZSk7Ci0JCQltaXNzZWRfd2FrZXVwID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChtaXNzZWRfd2FrZXVwKQotCQkJRFJNX0VSUk9SKCJIYW5nY2hlY2sgdGltZXIgZWxhcHNlZC4uLiBHUFUgaWRsZSwgbWlzc2VkIElSUS5cbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJaWYgKGRldl9wcml2LT5sYXN0X2FjdGhkID09IGFjdGhkICYmCiAJICAgIGRldl9wcml2LT5sYXN0X2luc3Rkb25lID09IGluc3Rkb25lICYmCiAJICAgIGRldl9wcml2LT5sYXN0X2luc3Rkb25lMSA9PSBpbnN0ZG9uZTEpIHsKQEAgLTEzODAsMTIgKzE1MzYsMTcgQEAKIAkJCQkgKiBhbmQgYnJlYWsgdGhlIGhhbmcuIFRoaXMgc2hvdWxkIHdvcmsgb24KIAkJCQkgKiBhbGwgYnV0IHRoZSBzZWNvbmQgZ2VuZXJhdGlvbiBjaGlwc2V0cy4KIAkJCQkgKi8KLQkJCQl1MzIgdG1wID0gSTkxNV9SRUFEKFBSQjBfQ1RMKTsKLQkJCQlpZiAodG1wICYgUklOR19XQUlUKSB7Ci0JCQkJCUk5MTVfV1JJVEUoUFJCMF9DVEwsIHRtcCk7Ci0JCQkJCVBPU1RJTkdfUkVBRChQUkIwX0NUTCk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KKworCQkJCWlmIChraWNrX3JpbmcoJmRldl9wcml2LT5yaW5nW1JDU10pKQorCQkJCQlnb3RvIHJlcGVhdDsKKworCQkJCWlmIChIQVNfQlNEKGRldikgJiYKKwkJCQkgICAga2lja19yaW5nKCZkZXZfcHJpdi0+cmluZ1tWQ1NdKSkKKwkJCQkJZ290byByZXBlYXQ7CisKKwkJCQlpZiAoSEFTX0JMVChkZXYpICYmCisJCQkJICAgIGtpY2tfcmluZygmZGV2X3ByaXYtPnJpbmdbQkNTXSkpCisJCQkJCWdvdG8gcmVwZWF0OwogCQkJfQogCiAJCQlpOTE1X2hhbmRsZV9lcnJvcihkZXYsIHRydWUpOwpAQCAtMTM5OSw3ICsxNTYwLDcgQEAKIAkJZGV2X3ByaXYtPmxhc3RfaW5zdGRvbmUxID0gaW5zdGRvbmUxOwogCX0KIAotb3V0OgorcmVwZWF0OgogCS8qIFJlc2V0IHRpbWVyIGNhc2UgY2hpcCBoYW5ncyB3aXRob3V0IGFub3RoZXIgcmVxdWVzdCBiZWluZyBhZGRlZCAqLwogCW1vZF90aW1lcigmZGV2X3ByaXYtPmhhbmdjaGVja190aW1lciwKIAkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhEUk1fSTkxNV9IQU5HQ0hFQ0tfUEVSSU9EKSk7CkBAIC0xNDE3LDE3ICsxNTc4LDE3IEBACiAKIAlJOTE1X1dSSVRFKERFSU1SLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKERFSUVSLCAweDApOwotCSh2b2lkKSBJOTE1X1JFQUQoREVJRVIpOworCVBPU1RJTkdfUkVBRChERUlFUik7CiAKIAkvKiBhbmQgR1QgKi8KIAlJOTE1X1dSSVRFKEdUSU1SLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKEdUSUVSLCAweDApOwotCSh2b2lkKSBJOTE1X1JFQUQoR1RJRVIpOworCVBPU1RJTkdfUkVBRChHVElFUik7CiAKIAkvKiBzb3V0aCBkaXNwbGF5IGlycSAqLwogCUk5MTVfV1JJVEUoU0RFSU1SLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKFNERUlFUiwgMHgwKTsKLQkodm9pZCkgSTkxNV9SRUFEKFNERUlFUik7CisJUE9TVElOR19SRUFEKFNERUlFUik7CiB9CiAKIHN0YXRpYyBpbnQgaXJvbmxha2VfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC0xNDM2LDM4ICsxNTk3LDM0IEBACiAJLyogZW5hYmxlIGtpbmQgb2YgaW50ZXJydXB0cyBhbHdheXMgZW5hYmxlZCAqLwogCXUzMiBkaXNwbGF5X21hc2sgPSBERV9NQVNURVJfSVJRX0NPTlRST0wgfCBERV9HU0UgfCBERV9QQ0hfRVZFTlQgfAogCQkJICAgREVfUExBTkVBX0ZMSVBfRE9ORSB8IERFX1BMQU5FQl9GTElQX0RPTkU7Ci0JdTMyIHJlbmRlcl9tYXNrID0gR1RfUElQRV9OT1RJRlkgfCBHVF9CU0RfVVNFUl9JTlRFUlJVUFQ7CisJdTMyIHJlbmRlcl9pcnFzOwogCXUzMiBob3RwbHVnX21hc2s7CiAKLQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnID0gfmRpc3BsYXlfbWFzazsKLQlkZXZfcHJpdi0+ZGVfaXJxX2VuYWJsZV9yZWcgPSBkaXNwbGF5X21hc2sgfCBERV9QSVBFQV9WQkxBTksgfCBERV9QSVBFQl9WQkxBTks7CisJZGV2X3ByaXYtPmlycV9tYXNrID0gfmRpc3BsYXlfbWFzazsKIAogCS8qIHNob3VsZCBhbHdheXMgY2FuIGdlbmVyYXRlIGlycSAqLwogCUk5MTVfV1JJVEUoREVJSVIsIEk5MTVfUkVBRChERUlJUikpOwotCUk5MTVfV1JJVEUoREVJTVIsIGRldl9wcml2LT5pcnFfbWFza19yZWcpOwotCUk5MTVfV1JJVEUoREVJRVIsIGRldl9wcml2LT5kZV9pcnFfZW5hYmxlX3JlZyk7Ci0JKHZvaWQpIEk5MTVfUkVBRChERUlFUik7CisJSTkxNV9XUklURShERUlNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwlJOTE1X1dSSVRFKERFSUVSLCBkaXNwbGF5X21hc2sgfCBERV9QSVBFQV9WQkxBTksgfCBERV9QSVBFQl9WQkxBTkspOworCVBPU1RJTkdfUkVBRChERUlFUik7CiAKLQlpZiAoSVNfR0VONihkZXYpKSB7Ci0JCXJlbmRlcl9tYXNrID0KLQkJCUdUX1BJUEVfTk9USUZZIHwKLQkJCUdUX0dFTjZfQlNEX1VTRVJfSU5URVJSVVBUIHwKLQkJCUdUX0JMVF9VU0VSX0lOVEVSUlVQVDsKLQl9Ci0KLQlkZXZfcHJpdi0+Z3RfaXJxX21hc2tfcmVnID0gfnJlbmRlcl9tYXNrOwotCWRldl9wcml2LT5ndF9pcnFfZW5hYmxlX3JlZyA9IHJlbmRlcl9tYXNrOworCWRldl9wcml2LT5ndF9pcnFfbWFzayA9IH4wOwogCiAJSTkxNV9XUklURShHVElJUiwgSTkxNV9SRUFEKEdUSUlSKSk7Ci0JSTkxNV9XUklURShHVElNUiwgZGV2X3ByaXYtPmd0X2lycV9tYXNrX3JlZyk7Ci0JaWYgKElTX0dFTjYoZGV2KSkgewotCQlJOTE1X1dSSVRFKEdFTjZfUkVOREVSX0lNUiwgfkdFTjZfUkVOREVSX1BJUEVfQ09OVFJPTF9OT1RJRllfSU5URVJSVVBUKTsKLQkJSTkxNV9XUklURShHRU42X0JTRF9JTVIsIH5HRU42X0JTRF9JTVJfVVNFUl9JTlRFUlJVUFQpOwotCQlJOTE1X1dSSVRFKEdFTjZfQkxJVFRFUl9JTVIsIH5HRU42X0JMSVRURVJfVVNFUl9JTlRFUlJVUFQpOwotCX0KKwlJOTE1X1dSSVRFKEdUSU1SLCBkZXZfcHJpdi0+Z3RfaXJxX21hc2spOwogCi0JSTkxNV9XUklURShHVElFUiwgZGV2X3ByaXYtPmd0X2lycV9lbmFibGVfcmVnKTsKLQkodm9pZCkgSTkxNV9SRUFEKEdUSUVSKTsKKwlpZiAoSVNfR0VONihkZXYpKQorCQlyZW5kZXJfaXJxcyA9CisJCQlHVF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9CTFRfVVNFUl9JTlRFUlJVUFQ7CisJZWxzZQorCQlyZW5kZXJfaXJxcyA9CisJCQlHVF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9QSVBFX05PVElGWSB8CisJCQlHVF9CU0RfVVNFUl9JTlRFUlJVUFQ7CisJSTkxNV9XUklURShHVElFUiwgcmVuZGVyX2lycXMpOworCVBPU1RJTkdfUkVBRChHVElFUik7CiAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewogCQlob3RwbHVnX21hc2sgPSBTREVfQ1JUX0hPVFBMVUdfQ1BUIHwgU0RFX1BPUlRCX0hPVFBMVUdfQ1BUICB8CkBAIC0xNDc1LDE1ICsxNjMyLDE3IEBACiAJfSBlbHNlIHsKIAkJaG90cGx1Z19tYXNrID0gU0RFX0NSVF9IT1RQTFVHIHwgU0RFX1BPUlRCX0hPVFBMVUcgfAogCQkJICAgICAgIFNERV9QT1JUQ19IT1RQTFVHIHwgU0RFX1BPUlREX0hPVFBMVUc7CisJCWhvdHBsdWdfbWFzayB8PSBTREVfQVVYX01BU0sgfCBTREVfRkRJX01BU0sgfCBTREVfVFJBTlNfTUFTSzsKKwkJSTkxNV9XUklURShGRElfUlhBX0lNUiwgMCk7CisJCUk5MTVfV1JJVEUoRkRJX1JYQl9JTVIsIDApOwogCX0KIAotCWRldl9wcml2LT5wY2hfaXJxX21hc2tfcmVnID0gfmhvdHBsdWdfbWFzazsKLQlkZXZfcHJpdi0+cGNoX2lycV9lbmFibGVfcmVnID0gaG90cGx1Z19tYXNrOworCWRldl9wcml2LT5wY2hfaXJxX21hc2sgPSB+aG90cGx1Z19tYXNrOwogCiAJSTkxNV9XUklURShTREVJSVIsIEk5MTVfUkVBRChTREVJSVIpKTsKLQlJOTE1X1dSSVRFKFNERUlNUiwgZGV2X3ByaXYtPnBjaF9pcnFfbWFza19yZWcpOwotCUk5MTVfV1JJVEUoU0RFSUVSLCBkZXZfcHJpdi0+cGNoX2lycV9lbmFibGVfcmVnKTsKLQkodm9pZCkgSTkxNV9SRUFEKFNERUlFUik7CisJSTkxNV9XUklURShTREVJTVIsIGRldl9wcml2LT5wY2hfaXJxX21hc2spOworCUk5MTVfV1JJVEUoU0RFSUVSLCBob3RwbHVnX21hc2spOworCVBPU1RJTkdfUkVBRChTREVJRVIpOwogCiAJaWYgKElTX0lST05MQUtFX00oZGV2KSkgewogCQkvKiBDbGVhciAmIGVuYWJsZSBQQ1UgZXZlbnQgaW50ZXJydXB0cyAqLwpAQCAtMTUxOSw3ICsxNjc4LDcgQEAKIAlJOTE1X1dSSVRFKFBJUEVCU1RBVCwgMCk7CiAJSTkxNV9XUklURShJTVIsIDB4ZmZmZmZmZmYpOwogCUk5MTVfV1JJVEUoSUVSLCAweDApOwotCSh2b2lkKSBJOTE1X1JFQUQoSUVSKTsKKwlQT1NUSU5HX1JFQUQoSUVSKTsKIH0KIAogLyoKQEAgLTE1MzIsMTEgKzE2OTEsMTEgQEAKIAl1MzIgZW5hYmxlX21hc2sgPSBJOTE1X0lOVEVSUlVQVF9FTkFCTEVfRklYIHwgSTkxNV9JTlRFUlJVUFRfRU5BQkxFX1ZBUjsKIAl1MzIgZXJyb3JfbWFzazsKIAotCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmlycV9xdWV1ZSk7CisJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+cmluZ1tSQ1NdLmlycV9xdWV1ZSk7CiAJaWYgKEhBU19CU0QoZGV2KSkKLQkJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+YnNkX3JpbmcuaXJxX3F1ZXVlKTsKKwkJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+cmluZ1tWQ1NdLmlycV9xdWV1ZSk7CiAJaWYgKEhBU19CTFQoZGV2KSkKLQkJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+Ymx0X3JpbmcuaXJxX3F1ZXVlKTsKKwkJRFJNX0lOSVRfV0FJVFFVRVVFKCZkZXZfcHJpdi0+cmluZ1tCQ1NdLmlycV9xdWV1ZSk7CiAKIAlkZXZfcHJpdi0+dmJsYW5rX3BpcGUgPSBEUk1fSTkxNV9WQkxBTktfUElQRV9BIHwgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQjsKIApAQCAtMTU0NCw3ICsxNzAzLDcgQEAKIAkJcmV0dXJuIGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChkZXYpOwogCiAJLyogVW5tYXNrIHRoZSBpbnRlcnJ1cHRzIHRoYXQgd2UgYWx3YXlzIHdhbnQgb24uICovCi0JZGV2X3ByaXYtPmlycV9tYXNrX3JlZyA9IH5JOTE1X0lOVEVSUlVQVF9FTkFCTEVfRklYOworCWRldl9wcml2LT5pcnFfbWFzayA9IH5JOTE1X0lOVEVSUlVQVF9FTkFCTEVfRklYOwogCiAJZGV2X3ByaXYtPnBpcGVzdGF0WzBdID0gMDsKIAlkZXZfcHJpdi0+cGlwZXN0YXRbMV0gPSAwOwpAQCAtMTU1Myw3ICsxNzEyLDcgQEAKIAkJLyogRW5hYmxlIGluIElFUi4uLiAqLwogCQllbmFibGVfbWFzayB8PSBJOTE1X0RJU1BMQVlfUE9SVF9JTlRFUlJVUFQ7CiAJCS8qIGFuZCB1bm1hc2sgaW4gSU1SICovCi0JCWRldl9wcml2LT5pcnFfbWFza19yZWcgJj0gfkk5MTVfRElTUExBWV9QT1JUX0lOVEVSUlVQVDsKKwkJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5JOTE1X0RJU1BMQVlfUE9SVF9JTlRFUlJVUFQ7CiAJfQogCiAJLyoKQEAgLTE1NzEsOSArMTczMCw5IEBACiAJfQogCUk5MTVfV1JJVEUoRU1SLCBlcnJvcl9tYXNrKTsKIAotCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKKwlJOTE1X1dSSVRFKElNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKIAlJOTE1X1dSSVRFKElFUiwgZW5hYmxlX21hc2spOwotCSh2b2lkKSBJOTE1X1JFQUQoSUVSKTsKKwlQT1NUSU5HX1JFQUQoSUVSKTsKIAogCWlmIChJOTE1X0hBU19IT1RQTFVHKGRldikpIHsKIAkJdTMyIGhvdHBsdWdfZW4gPSBJOTE1X1JFQUQoUE9SVF9IT1RQTFVHX0VOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCmluZGV4IGNiOGY0MzQuLjQwYTQwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaApAQCAtNzgsNiArNzgsMTIgQEAKICNkZWZpbmUgIEdSRE9NX1JFTkRFUgkoMTw8MikKICNkZWZpbmUgIEdSRE9NX01FRElBCSgzPDwyKQogCisjZGVmaW5lIEdFTjZfR0RSU1QJMHg5NDFjCisjZGVmaW5lICBHRU42X0dSRE9NX0ZVTEwJCSgxIDw8IDApCisjZGVmaW5lICBHRU42X0dSRE9NX1JFTkRFUgkJKDEgPDwgMSkKKyNkZWZpbmUgIEdFTjZfR1JET01fTUVESUEJCSgxIDw8IDIpCisjZGVmaW5lICBHRU42X0dSRE9NX0JMVAkJCSgxIDw8IDMpCisKIC8qIFZHQSBzdHVmZiAqLwogCiAjZGVmaW5lIFZHQV9TVDAxX01EQSAweDNiYQpAQCAtMTM5LDYgKzE0NSw4IEBACiAjZGVmaW5lICAgTUlfRU5EX1NDRU5FCQkoMSA8PCA0KSAvKiBmbHVzaCBiaW5uZXIgYW5kIGluY3Igc2NlbmUgY291bnQgKi8KICNkZWZpbmUgICBNSV9JTlZBTElEQVRFX0lTUAkoMSA8PCA1KSAvKiBpbnZhbGlkYXRlIGluZGlyZWN0IHN0YXRlIHBvaW50ZXJzICovCiAjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9FTkQJTUlfSU5TVFIoMHgwYSwgMCkKKyNkZWZpbmUgTUlfU1VTUEVORF9GTFVTSAlNSV9JTlNUUigweDBiLCAwKQorI2RlZmluZSAgIE1JX1NVU1BFTkRfRkxVU0hfRU4JKDE8PDApCiAjZGVmaW5lIE1JX1JFUE9SVF9IRUFECQlNSV9JTlNUUigweDA3LCAwKQogI2RlZmluZSBNSV9PVkVSTEFZX0ZMSVAJCU1JX0lOU1RSKDB4MTEsMCkKICNkZWZpbmUgICBNSV9PVkVSTEFZX0NPTlRJTlVFCSgweDA8PDIxKQpAQCAtMTUzLDE3ICsxNjEsMjkgQEAKICNkZWZpbmUgICBNSV9NTV9TUEFDRV9QSFlTSUNBTAkJKDA8PDgpCiAjZGVmaW5lICAgTUlfU0FWRV9FWFRfU1RBVEVfRU4JCSgxPDwzKQogI2RlZmluZSAgIE1JX1JFU1RPUkVfRVhUX1NUQVRFX0VOCSgxPDwyKQorI2RlZmluZSAgIE1JX0ZPUkNFX1JFU1RPUkUJCSgxPDwxKQogI2RlZmluZSAgIE1JX1JFU1RPUkVfSU5ISUJJVAkJKDE8PDApCiAjZGVmaW5lIE1JX1NUT1JFX0RXT1JEX0lNTQlNSV9JTlNUUigweDIwLCAxKQogI2RlZmluZSAgIE1JX01FTV9WSVJUVUFMCSgxIDw8IDIyKSAvKiA5NjUrIG9ubHkgKi8KICNkZWZpbmUgTUlfU1RPUkVfRFdPUkRfSU5ERVgJTUlfSU5TVFIoMHgyMSwgMSkKICNkZWZpbmUgICBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCAyCi0jZGVmaW5lIE1JX0xPQURfUkVHSVNURVJfSU1NCU1JX0lOU1RSKDB4MjIsIDEpCisvKiBPZmZpY2lhbCBpbnRlbCBkb2NzIGFyZSBzb21ld2hhdCBzbG9wcHkgY29uY2VybmluZyBNSV9MT0FEX1JFR0lTVEVSX0lNTToKKyAqIC0gQWx3YXlzIGlzc3VlIGEgTUlfTk9PUCBfYmVmb3JlXyB0aGUgTUlfTE9BRF9SRUdJU1RFUl9JTU0gLSBvdGhlcndpc2UgaHcKKyAqICAgc2ltcGx5IGlnbm9yZXMgdGhlIHJlZ2lzdGVyIGxvYWQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgorICogLSBPbmUgY2FuIGFjdHVhbGx5IGxvYWQgYXJiaXRyYXJ5IG1hbnkgYXJiaXRyYXJ5IHJlZ2lzdGVyczogU2ltcGx5IGlzc3VlIHgKKyAqICAgYWRkcmVzcy92YWx1ZSBwYWlycy4gRG9uJ3Qgb3ZlcmR1ZSBpdCwgdGhvdWdoLCB4IDw9IDJeNCBtdXN0IGhvbGQhCisgKi8KKyNkZWZpbmUgTUlfTE9BRF9SRUdJU1RFUl9JTU0oeCkJTUlfSU5TVFIoMHgyMiwgMip4LTEpCiAjZGVmaW5lIE1JX0ZMVVNIX0RXCQlNSV9JTlNUUigweDI2LCAyKSAvKiBmb3IgR0VONiAqLwogI2RlZmluZSBNSV9CQVRDSF9CVUZGRVIJCU1JX0lOU1RSKDB4MzAsIDEpCiAjZGVmaW5lICAgTUlfQkFUQ0hfTk9OX1NFQ1VSRQkoMSkKICNkZWZpbmUgICBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUgKDE8PDgpCiAjZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVAlNSV9JTlNUUigweDMxLCAwKQorI2RlZmluZSBNSV9TRU1BUEhPUkVfTUJPWAlNSV9JTlNUUigweDE2LCAxKSAvKiBnZW42KyAqLworI2RlZmluZSAgTUlfU0VNQVBIT1JFX0dMT0JBTF9HVFQgICAgKDE8PDIyKQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1VQREFURQkgICAgKDE8PDIxKQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX0NPTVBBUkUJICAgICgxPDwyMCkKKyNkZWZpbmUgIE1JX1NFTUFQSE9SRV9SRUdJU1RFUgkgICAgKDE8PDE4KQogLyoKICAqIDNEIGluc3RydWN0aW9ucyB1c2VkIGJ5IHRoZSBrZXJuZWwKICAqLwpAQCAtMjU2LDEwICsyNzYsNiBAQAogICogSW5zdHJ1Y3Rpb24gYW5kIGludGVycnVwdCBjb250cm9sIHJlZ3MKICAqLwogI2RlZmluZSBQR1RCTF9FUgkweDAyMDI0Ci0jZGVmaW5lIFBSQjBfVEFJTAkweDAyMDMwCi0jZGVmaW5lIFBSQjBfSEVBRAkweDAyMDM0Ci0jZGVmaW5lIFBSQjBfU1RBUlQJMHgwMjAzOAotI2RlZmluZSBQUkIwX0NUTAkweDAyMDNjCiAjZGVmaW5lIFJFTkRFUl9SSU5HX0JBU0UJMHgwMjAwMAogI2RlZmluZSBCU0RfUklOR19CQVNFCQkweDA0MDAwCiAjZGVmaW5lIEdFTjZfQlNEX1JJTkdfQkFTRQkweDEyMDAwCkBAIC0yNjgsOSArMjg0LDE0IEBACiAjZGVmaW5lIFJJTkdfSEVBRChiYXNlKQkJKChiYXNlKSsweDM0KQogI2RlZmluZSBSSU5HX1NUQVJUKGJhc2UpCSgoYmFzZSkrMHgzOCkKICNkZWZpbmUgUklOR19DVEwoYmFzZSkJCSgoYmFzZSkrMHgzYykKKyNkZWZpbmUgUklOR19TWU5DXzAoYmFzZSkJKChiYXNlKSsweDQwKQorI2RlZmluZSBSSU5HX1NZTkNfMShiYXNlKQkoKGJhc2UpKzB4NDQpCisjZGVmaW5lIFJJTkdfTUFYX0lETEUoYmFzZSkJKChiYXNlKSsweDU0KQogI2RlZmluZSBSSU5HX0hXU19QR0EoYmFzZSkJKChiYXNlKSsweDgwKQogI2RlZmluZSBSSU5HX0hXU19QR0FfR0VONihiYXNlKQkoKGJhc2UpKzB4MjA4MCkKICNkZWZpbmUgUklOR19BQ1RIRChiYXNlKQkoKGJhc2UpKzB4NzQpCisjZGVmaW5lIFJJTkdfTk9QSUQoYmFzZSkJKChiYXNlKSsweDk0KQorI2RlZmluZSBSSU5HX0lNUihiYXNlKQkJKChiYXNlKSsweGE4KQogI2RlZmluZSAgIFRBSUxfQUREUgkJMHgwMDFGRkZGOAogI2RlZmluZSAgIEhFQURfV1JBUF9DT1VOVAkweEZGRTAwMDAwCiAjZGVmaW5lICAgSEVBRF9XUkFQX09ORQkJMHgwMDIwMDAwMApAQCAtMjg1LDEwICszMDYsMTcgQEAKICNkZWZpbmUgICBSSU5HX0lOVkFMSUQJCTB4MDAwMDAwMDAKICNkZWZpbmUgICBSSU5HX1dBSVRfSThYWAkoMTw8MCkgLyogZ2VuMiwgUFJCeF9IRUFEICovCiAjZGVmaW5lICAgUklOR19XQUlUCQkoMTw8MTEpIC8qIGdlbjMrLCBQUkJ4X0NUTCAqLworI2RlZmluZSAgIFJJTkdfV0FJVF9TRU1BUEhPUkUJKDE8PDEwKSAvKiBnZW42KyAqLworI2lmIDAKKyNkZWZpbmUgUFJCMF9UQUlMCTB4MDIwMzAKKyNkZWZpbmUgUFJCMF9IRUFECTB4MDIwMzQKKyNkZWZpbmUgUFJCMF9TVEFSVAkweDAyMDM4CisjZGVmaW5lIFBSQjBfQ1RMCTB4MDIwM2MKICNkZWZpbmUgUFJCMV9UQUlMCTB4MDIwNDAgLyogOTE1KyBvbmx5ICovCiAjZGVmaW5lIFBSQjFfSEVBRAkweDAyMDQ0IC8qIDkxNSsgb25seSAqLwogI2RlZmluZSBQUkIxX1NUQVJUCTB4MDIwNDggLyogOTE1KyBvbmx5ICovCiAjZGVmaW5lIFBSQjFfQ1RMCTB4MDIwNGMgLyogOTE1KyBvbmx5ICovCisjZW5kaWYKICNkZWZpbmUgSVBFSVJfSTk2NQkweDAyMDY0CiAjZGVmaW5lIElQRUhSX0k5NjUJMHgwMjA2OAogI2RlZmluZSBJTlNURE9ORV9JOTY1CTB4MDIwNmMKQEAgLTMwNSwxMSArMzMzLDQyIEBACiAjZGVmaW5lIElOU1RET05FCTB4MDIwOTAKICNkZWZpbmUgTk9QSUQJCTB4MDIwOTQKICNkZWZpbmUgSFdTVEFNCQkweDAyMDk4CisjZGVmaW5lIFZDU19JTlNURE9ORQkweDEyMDZDCisjZGVmaW5lIFZDU19JUEVJUgkweDEyMDY0CisjZGVmaW5lIFZDU19JUEVIUgkweDEyMDY4CisjZGVmaW5lIFZDU19BQ1RIRAkweDEyMDc0CisjZGVmaW5lIEJDU19JTlNURE9ORQkweDIyMDZDCisjZGVmaW5lIEJDU19JUEVJUgkweDIyMDY0CisjZGVmaW5lIEJDU19JUEVIUgkweDIyMDY4CisjZGVmaW5lIEJDU19BQ1RIRAkweDIyMDc0CisKKyNkZWZpbmUgRVJST1JfR0VONgkweDA0MGEwCisKKy8qIEdNNDUrIGNoaWNrZW4gYml0cyAtLSBkZWJ1ZyB3b3JrYXJvdW5kIGJpdHMgdGhhdCBtYXkgYmUgcmVxdWlyZWQKKyAqIGZvciB2YXJpb3VzIHNvcnRzIG9mIGNvcnJlY3QgYmVoYXZpb3IuICBUaGUgdG9wIDE2IGJpdHMgb2YgZWFjaCBhcmUKKyAqIHRoZSBlbmFibGVzIGZvciB3cml0aW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxvdyBiaXQuCisgKi8KKyNkZWZpbmUgXzNEX0NISUNLRU4JMHgwMjA4NAorI2RlZmluZSBfM0RfQ0hJQ0tFTjIJMHgwMjA4YworLyogRGlzYWJsZXMgcGlwZWxpbmluZyBvZiByZWFkIGZsdXNoZXMgcGFzdCB0aGUgU0YtV0laIGludGVyZmFjZS4KKyAqIFJlcXVpcmVkIG9uIGFsbCBJcm9ubGFrZSBzdGVwcGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBCLVNwZWMsIGJ1dCB0aGUKKyAqIHBhcnRpY3VsYXIgZGFuZ2VyIG9mIG5vdCBkb2luZyBzbyBpcyBub3Qgc3BlY2lmaWVkLgorICovCisjIGRlZmluZSBfM0RfQ0hJQ0tFTjJfV01fUkVBRF9QSVBFTElORUQJCQkoMSA8PCAxNCkKKyNkZWZpbmUgXzNEX0NISUNLRU4zCTB4MDIwOTAKIAogI2RlZmluZSBNSV9NT0RFCQkweDAyMDljCiAjIGRlZmluZSBWU19USU1FUl9ESVNQQVRDSAkJCQkoMSA8PCA2KQogIyBkZWZpbmUgTUlfRkxVU0hfRU5BQkxFCQkJCSgxIDw8IDExKQogCisjZGVmaW5lIEdGWF9NT0RFCTB4MDI1MjAKKyNkZWZpbmUgICBHRlhfUlVOX0xJU1RfRU5BQkxFCQkoMTw8MTUpCisjZGVmaW5lICAgR0ZYX1RMQl9JTlZBTElEQVRFX0FMV0FZUwkoMTw8MTMpCisjZGVmaW5lICAgR0ZYX1NVUkZBQ0VfRkFVTFRfRU5BQkxFCSgxPDwxMikKKyNkZWZpbmUgICBHRlhfUkVQTEFZX01PREUJCSgxPDwxMSkKKyNkZWZpbmUgICBHRlhfUFNNSV9HUkFOVUxBUklUWQkJKDE8PDEwKQorI2RlZmluZSAgIEdGWF9QUEdUVF9FTkFCTEUJCSgxPDw5KQorCiAjZGVmaW5lIFNDUEQwCQkweDAyMDljIC8qIDkxNSsgb25seSAqLwogI2RlZmluZSBJRVIJCTB4MDIwYTAKICNkZWZpbmUgSUlSCQkweDAyMGE0CkBAIC00NjEsNyArNTIwLDcgQEAKICNkZWZpbmUgICBHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0xfSURMRV9JTkRJQ0FUT1IJCQkoMSA8PCAzKQogCiAjZGVmaW5lIEdFTjZfQlNEX0lNUgkJCTB4MTIwYTgKLSNkZWZpbmUgICBHRU42X0JTRF9JTVJfVVNFUl9JTlRFUlJVUFQJKDEgPDwgMTIpCisjZGVmaW5lICAgR0VONl9CU0RfVVNFUl9JTlRFUlJVUFQJKDEgPDwgMTIpCiAKICNkZWZpbmUgR0VONl9CU0RfUk5DSUQJCQkweDEyMTk4CiAKQEAgLTU0MSw2ICs2MDAsMTggQEAKIAogI2RlZmluZSBJTEtfRElTUExBWV9DSElDS0VOMQkweDQyMDAwCiAjZGVmaW5lICAgSUxLX0ZCQ1FfRElTCQkoMTw8MjIpCisjZGVmaW5lICAgSUxLX1BBQlNUUkVUQ0hfRElTIAkoMTw8MjEpCisKKworLyoKKyAqIEZyYW1lYnVmZmVyIGNvbXByZXNzaW9uIGZvciBTYW5keWJyaWRnZQorICoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHJlZ2lzdGVycyBhcmUgb2YgdHlwZSBHVFRNTUFEUgorICovCisjZGVmaW5lIFNOQl9EUEZDX0NUTF9TQQkJMHgxMDAxMDAKKyNkZWZpbmUgICBTTkJfQ1BVX0ZFTkNFX0VOQUJMRQkoMTw8MjkpCisjZGVmaW5lIERQRkNfQ1BVX0ZFTkNFX09GRlNFVAkweDEwMDEwNAorCiAKIC8qCiAgKiBHUElPIHJlZ3MKQEAgLTkwMCw2ICs5NzEsOCBAQAogICovCiAjZGVmaW5lIE1DSEJBUl9NSVJST1JfQkFTRQkweDEwMDAwCiAKKyNkZWZpbmUgTUNIQkFSX01JUlJPUl9CQVNFX1NOQgkweDE0MDAwMAorCiAvKiogOTE1LTk0NSBhbmQgR005NjUgTUNIIHJlZ2lzdGVyIGNvbnRyb2xsaW5nIERSQU0gY2hhbm5lbCBhY2Nlc3MgKi8KICNkZWZpbmUgRENDCQkJMHgxMDIwMAogI2RlZmluZSBEQ0NfQUREUkVTU0lOR19NT0RFX1NJTkdMRV9DSEFOTkVMCQkoMCA8PCAwKQpAQCAtMTA2MSw5ICsxMTM0LDUwIEBACiAjZGVmaW5lIFJDQk1JTkFWRwkJMHgxMTFhMAogI2RlZmluZSBSQ1VQRUkJCQkweDExMWIwCiAjZGVmaW5lIFJDRE5FSQkJCTB4MTExYjQKLSNkZWZpbmUgTUNIQkFSX1JFTkRFUl9TVEFOREJZCQkweDExMWI4Ci0jZGVmaW5lICAgUkNYX1NXX0VYSVQJCSgxPDwyMykKLSNkZWZpbmUgICBSU1hfU1RBVFVTX01BU0sJMHgwMDcwMDAwMAorI2RlZmluZSBSU1REQllDVEwJCTB4MTExYjgKKyNkZWZpbmUgICBSUzFFTgkJCSgxPDwzMSkKKyNkZWZpbmUgICBSUzJFTgkJCSgxPDwzMCkKKyNkZWZpbmUgICBSUzNFTgkJCSgxPDwyOSkKKyNkZWZpbmUgICBEM1JTM0VOCQkoMTw8MjgpIC8qIERpc3BsYXkgRDMgaW1saWVzIFJTMyAqLworI2RlZmluZSAgIFNXUFJPTU9SU1gJCSgxPDwyNykgLyogUlN4IHByb21vdGlvbiB0aW1lcnMgaWdub3JlZCAqLworI2RlZmluZSAgIFJDV0FLRVJXCQkoMTw8MjYpIC8qIFJlc2V0d2FybiBmcm9tIFBDSCBjYXVzZXMgd2FrZXVwICovCisjZGVmaW5lICAgRFBSU0xQVlJFTgkJKDE8PDI1KSAvKiBGYXN0IHZvbHRhZ2UgcmFtcCBlbmFibGUgKi8KKyNkZWZpbmUgICBHRlhUR0hZU1QJCSgxPDwyNCkgLyogSHlzdGVyZXNpcyB0byBhbGxvdyB0cnVuayBnYXRpbmcgKi8KKyNkZWZpbmUgICBSQ1hfU1dfRVhJVAkJKDE8PDIzKSAvKiBMZWF2ZSBSU3ggYW5kIHByZXZlbnQgcmUtZW50cnkgKi8KKyNkZWZpbmUgICBSU1hfU1RBVFVTX01BU0sJKDc8PDIwKQorI2RlZmluZSAgIFJTWF9TVEFUVVNfT04JCSgwPDwyMCkKKyNkZWZpbmUgICBSU1hfU1RBVFVTX1JDMQkoMTw8MjApCisjZGVmaW5lICAgUlNYX1NUQVRVU19SQzFFCSgyPDwyMCkKKyNkZWZpbmUgICBSU1hfU1RBVFVTX1JTMQkoMzw8MjApCisjZGVmaW5lICAgUlNYX1NUQVRVU19SUzIJKDQ8PDIwKSAvKiBha2EgcmM2ICovCisjZGVmaW5lICAgUlNYX1NUQVRVU19SU1ZECSg1PDwyMCkgLyogZGVlcCByYzYgdW5zdXBwb3J0ZWQgb24gaWxrICovCisjZGVmaW5lICAgUlNYX1NUQVRVU19SUzMJKDY8PDIwKSAvKiByczMgdW5zdXBwb3J0ZWQgb24gaWxrICovCisjZGVmaW5lICAgUlNYX1NUQVRVU19SU1ZEMgkoNzw8MjApCisjZGVmaW5lICAgVVdSQ1JTWEUJCSgxPDwxOSkgLyogd2FrZSBjb3VudGVyIGxpbWl0IHByZXZlbnRzIHJzeCAqLworI2RlZmluZSAgIFJTQ1JQCQkJKDE8PDE4KSAvKiBycyByZXF1ZXN0cyBjb250cm9sIG9uIHJzMS8yIHJlcXMgKi8KKyNkZWZpbmUgICBKUlNDCQkJKDE8PDE3KSAvKiByc3ggY291cGxlZCB0byBjcHUgYy1zdGF0ZSAqLworI2RlZmluZSAgIFJTMklOQzAJCSgxPDwxNikgLyogYWxsb3cgcnMyIGluIGNwdSBjMCAqLworI2RlZmluZSAgIFJTMUNPTlRTQVZfTUFTSwkoMzw8MTQpCisjZGVmaW5lICAgUlMxQ09OVFNBVl9OT19SUzEJKDA8PDE0KSAvKiByczEgZG9lc24ndCBzYXZlL3Jlc3RvcmUgY29udGV4dCAqLworI2RlZmluZSAgIFJTMUNPTlRTQVZfUlNWRAkoMTw8MTQpCisjZGVmaW5lICAgUlMxQ09OVFNBVl9TQVZFX1JTMQkoMjw8MTQpIC8qIHJzMSBzYXZlcyBjb250ZXh0ICovCisjZGVmaW5lICAgUlMxQ09OVFNBVl9GVUxMX1JTMQkoMzw8MTQpIC8qIHJzMSBzYXZlcyBhbmQgcmVzdG9yZXMgY29udGV4dCAqLworI2RlZmluZSAgIE5PUk1TTEVYTEFUX01BU0sJKDM8PDEyKQorI2RlZmluZSAgIFNMT1dfUlMxMjMJCSgwPDwxMikKKyNkZWZpbmUgICBTTE9XX1JTMjMJCSgxPDwxMikKKyNkZWZpbmUgICBTTE9XX1JTMwkJKDI8PDEyKQorI2RlZmluZSAgIE5PUk1BTF9SUzEyMwkJKDM8PDEyKQorI2RlZmluZSAgIFJDTU9ERV9USU1FT1VUCSgxPDwxMSkgLyogMCBpcyBldmFsIGludGVydmFsIG1ldGhvZCAqLworI2RlZmluZSAgIElNUFJPTU9FTgkJKDE8PDEwKSAvKiBwcm9tbyBpcyBpbW1lZGlhdGUgb3IgZGVsYXllZCB1bnRpbCBuZXh0IGlkbGUgaW50ZXJ2YWwgKG9ubHkgZm9yIHRpbWVvdXQgbWV0aG9kIGFib3ZlKSAqLworI2RlZmluZSAgIFJDRU5UU1lOQwkJKDE8PDkpIC8qIHJzIGNvdXBsZWQgdG8gY3B1IGMtc3RhdGUgKDMvNi83KSAqLworI2RlZmluZSAgIFNUQVRFTE9DSwkJKDE8PDcpIC8qIGxvY2tlZCB0byByc19jc3RhdGUgaWYgMCAqLworI2RlZmluZSAgIFJTX0NTVEFURV9NQVNLCSgzPDw0KQorI2RlZmluZSAgIFJTX0NTVEFURV9DMzY3X1JTMQkoMDw8NCkKKyNkZWZpbmUgICBSU19DU1RBVEVfQzM2X1JTMV9DN19SUzIgKDE8PDQpCisjZGVmaW5lICAgUlNfQ1NUQVRFX1JTVkQJKDI8PDQpCisjZGVmaW5lICAgUlNfQ1NUQVRFX0MzNjdfUlMyCSgzPDw0KQorI2RlZmluZSAgIFJFRFNBVkVTCQkoMTw8MykgLyogbm8gY29udGV4dCBzYXZlIGlmIHdhcyBpZGxlIGR1cmluZyByczAgKi8KKyNkZWZpbmUgICBSRURSRVNUT1JFUwkJKDE8PDIpIC8qIG5vIHJlc3RvcmUgaWYgd2FzIGlkbGUgZHVyaW5nIHJzMCAqLwogI2RlZmluZSBWSURDVEwJCQkweDExMWMwCiAjZGVmaW5lIFZJRFNUUwkJCTB4MTExYzgKICNkZWZpbmUgVklEU1RBUlQJCTB4MTExY2MgLyogOCBiaXRzICovCkBAIC0xMTE5LDYgKzEyMzMsMTAgQEAKICNkZWZpbmUgRERSTVBMTDEJCTBYMTJjMjAKICNkZWZpbmUgUEVHX0JBTkRfR0FQX0RBVEEJMHgxNGQ2OAogCisjZGVmaW5lIEdFTjZfR1RfUEVSRl9TVEFUVVMJMHgxNDU5NDgKKyNkZWZpbmUgR0VONl9SUF9TVEFURV9MSU1JVFMJMHgxNDU5OTQKKyNkZWZpbmUgR0VONl9SUF9TVEFURV9DQVAJMHgxNDU5OTgKKwogLyoKICAqIExvZ2ljYWwgQ29udGV4dCByZWdzCiAgKi8KQEAgLTExNjgsNyArMTI4Niw2IEBACiAjZGVmaW5lIFZUT1RBTChwaXBlKSBfUElQRShwaXBlLCBWVE9UQUxfQSwgVlRPVEFMX0IpCiAjZGVmaW5lIFZCTEFOSyhwaXBlKSBfUElQRShwaXBlLCBWQkxBTktfQSwgVkJMQU5LX0IpCiAjZGVmaW5lIFZTWU5DKHBpcGUpIF9QSVBFKHBpcGUsIFZTWU5DX0EsIFZTWU5DX0IpCi0jZGVmaW5lIFBJUEVTUkMocGlwZSkgX1BJUEUocGlwZSwgUElQRUFTUkMsIFBJUEVCU1JDKQogI2RlZmluZSBCQ0xSUEFUKHBpcGUpIF9QSVBFKHBpcGUsIEJDTFJQQVRfQSwgQkNMUlBBVF9CKQogCiAvKiBWR0EgcG9ydCBjb250cm9sICovCkBAIC0yMTgyLDggKzIyOTksMTAgQEAKICNkZWZpbmUgICBQSVBFXzZCUEMJCQkJKDIgPDwgNSkKICNkZWZpbmUgICBQSVBFXzEyQlBDCQkJCSgzIDw8IDUpCiAKKyNkZWZpbmUgUElQRVNSQyhwaXBlKSBfUElQRShwaXBlLCBQSVBFQVNSQywgUElQRUJTUkMpCiAjZGVmaW5lIFBJUEVDT05GKHBpcGUpIF9QSVBFKHBpcGUsIFBJUEVBQ09ORiwgUElQRUJDT05GKQogI2RlZmluZSBQSVBFRFNMKHBpcGUpICBfUElQRShwaXBlLCBQSVBFQURTTCwgUElQRUJEU0wpCisjZGVmaW5lIFBJUEVGUkFNRVBJWEVMKHBpcGUpICBfUElQRShwaXBlLCBQSVBFQUZSQU1FUElYRUwsIFBJUEVCRlJBTUVQSVhFTCkKIAogI2RlZmluZSBEU1BBUkIJCQkweDcwMDMwCiAjZGVmaW5lICAgRFNQQVJCX0NTVEFSVF9NQVNLCSgweDdmIDw8IDcpCkBAIC0yMjcxLDggKzIzOTAsMTMgQEAKIAogLyogTWVtb3J5IGxhdGVuY3kgdGltZXIgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTUxUUl9JTEsJCTB4MTEyMjIKKyNkZWZpbmUgIE1MVFJfV00xX1NISUZUCQkwCisjZGVmaW5lICBNTFRSX1dNMl9TSElGVAkJOAogLyogdGhlIHVuaXQgb2YgbWVtb3J5IHNlbGYtcmVmcmVzaCBsYXRlbmN5IHRpbWUgaXMgMC41dXMgKi8KICNkZWZpbmUgIElMS19TUkxUX01BU0sJCTB4M2YKKyNkZWZpbmUgSUxLX0xBVEVOQ1koc2hpZnQpCShJOTE1X1JFQUQoTUxUUl9JTEspID4+IChzaGlmdCkgJiBJTEtfU1JMVF9NQVNLKQorI2RlZmluZSBJTEtfUkVBRF9XTTFfTEFURU5DWSgpCUlMS19MQVRFTkNZKE1MVFJfV00xX1NISUZUKQorI2RlZmluZSBJTEtfUkVBRF9XTTJfTEFURU5DWSgpCUlMS19MQVRFTkNZKE1MVFJfV00yX1NISUZUKQogCiAvKiBkZWZpbmUgdGhlIGZpZm8gc2l6ZSBvbiBJcm9ubGFrZSAqLwogI2RlZmluZSBJTEtfRElTUExBWV9GSUZPCTEyOApAQCAtMjI5MSw2ICsyNDE1LDQwIEBACiAKICNkZWZpbmUgSUxLX0ZJRk9fTElORV9TSVpFCTY0CiAKKy8qIGRlZmluZSB0aGUgV00gaW5mbyBvbiBTYW5keWJyaWRnZSAqLworI2RlZmluZSBTTkJfRElTUExBWV9GSUZPCTEyOAorI2RlZmluZSBTTkJfRElTUExBWV9NQVhXTQkweDdmCS8qIGJpdCAxNjoyMiAqLworI2RlZmluZSBTTkJfRElTUExBWV9ERlRXTQk4CisjZGVmaW5lIFNOQl9DVVJTT1JfRklGTwkJMzIKKyNkZWZpbmUgU05CX0NVUlNPUl9NQVhXTQkweDFmCS8qIGJpdCA0OjAgKi8KKyNkZWZpbmUgU05CX0NVUlNPUl9ERlRXTQk4CisKKyNkZWZpbmUgU05CX0RJU1BMQVlfU1JfRklGTwk1MTIKKyNkZWZpbmUgU05CX0RJU1BMQVlfTUFYX1NSV00JMHgxZmYJLyogYml0IDE2OjggKi8KKyNkZWZpbmUgU05CX0RJU1BMQVlfREZUX1NSV00JMHgzZgorI2RlZmluZSBTTkJfQ1VSU09SX1NSX0ZJRk8JNjQKKyNkZWZpbmUgU05CX0NVUlNPUl9NQVhfU1JXTQkweDNmCS8qIGJpdCA1OjAgKi8KKyNkZWZpbmUgU05CX0NVUlNPUl9ERlRfU1JXTQk4CisKKyNkZWZpbmUgU05CX0ZCQ19NQVhfU1JXTQkweGYJLyogYml0IDIzOjIwICovCisKKyNkZWZpbmUgU05CX0ZJRk9fTElORV9TSVpFCTY0CisKKworLyogdGhlIGFkZHJlc3Mgd2hlcmUgd2UgZ2V0IGFsbCBraW5kcyBvZiBsYXRlbmN5IHZhbHVlICovCisjZGVmaW5lIFNTS1BECQkJMHg1ZDEwCisjZGVmaW5lIFNTS1BEX1dNX01BU0sJCTB4M2YKKyNkZWZpbmUgU1NLUERfV00wX1NISUZUCQkwCisjZGVmaW5lIFNTS1BEX1dNMV9TSElGVAkJOAorI2RlZmluZSBTU0tQRF9XTTJfU0hJRlQJCTE2CisjZGVmaW5lIFNTS1BEX1dNM19TSElGVAkJMjQKKworI2RlZmluZSBTTkJfTEFURU5DWShzaGlmdCkJKEk5MTVfUkVBRChNQ0hCQVJfTUlSUk9SX0JBU0VfU05CICsgU1NLUEQpID4+IChzaGlmdCkgJiBTU0tQRF9XTV9NQVNLKQorI2RlZmluZSBTTkJfUkVBRF9XTTBfTEFURU5DWSgpCQlTTkJfTEFURU5DWShTU0tQRF9XTTBfU0hJRlQpCisjZGVmaW5lIFNOQl9SRUFEX1dNMV9MQVRFTkNZKCkJCVNOQl9MQVRFTkNZKFNTS1BEX1dNMV9TSElGVCkKKyNkZWZpbmUgU05CX1JFQURfV00yX0xBVEVOQ1koKQkJU05CX0xBVEVOQ1koU1NLUERfV00yX1NISUZUKQorI2RlZmluZSBTTkJfUkVBRF9XTTNfTEFURU5DWSgpCQlTTkJfTEFURU5DWShTU0tQRF9XTTNfU0hJRlQpCisKIC8qCiAgKiBUaGUgdHdvIHBpcGUgZnJhbWUgY291bnRlciByZWdpc3RlcnMgYXJlIG5vdCBzeW5jaHJvbml6ZWQsIHNvCiAgKiByZWFkaW5nIGEgc3RhYmxlIHZhbHVlIGlzIHNvbWV3aGF0IHRyaWNreS4gVGhlIGZvbGxvd2luZyBjb2RlCkBAIC0yMzUxLDYgKzI1MDksMTAgQEAKICNkZWZpbmUgQ1VSQkJBU0UJCTB4NzAwYzQKICNkZWZpbmUgQ1VSQlBPUwkJCTB4NzAwYzgKIAorI2RlZmluZSBDVVJDTlRSKHBpcGUpIF9QSVBFKHBpcGUsIENVUkFDTlRSLCBDVVJCQ05UUikKKyNkZWZpbmUgQ1VSQkFTRShwaXBlKSBfUElQRShwaXBlLCBDVVJBQkFTRSwgQ1VSQkJBU0UpCisjZGVmaW5lIENVUlBPUyhwaXBlKSBfUElQRShwaXBlLCBDVVJBUE9TLCBDVVJCUE9TKQorCiAvKiBEaXNwbGF5IEEgY29udHJvbCAqLwogI2RlZmluZSBEU1BBQ05UUiAgICAgICAgICAgICAgICAweDcwMTgwCiAjZGVmaW5lICAgRElTUExBWV9QTEFORV9FTkFCTEUJCQkoMTw8MzEpCkBAIC0yNTg5LDYgKzI3NTEsOCBAQAogI2RlZmluZSBHVElFUiAgIDB4NDQwMWMKIAogI2RlZmluZSBJTEtfRElTUExBWV9DSElDS0VOMgkweDQyMDA0CisvKiBSZXF1aXJlZCBvbiBhbGwgSXJvbmxha2UgYW5kIFNhbmR5YnJpZGdlIGFjY29yZGluZyB0byB0aGUgQi1TcGVjLiAqLworI2RlZmluZSAgSUxLX0VMUElOXzQwOV9TRUxFQ1QJKDEgPDwgMjUpCiAjZGVmaW5lICBJTEtfRFBBUkJfR0FURQkoMTw8MjIpCiAjZGVmaW5lICBJTEtfVlNEUEZEX0ZVTEwJKDE8PDIxKQogI2RlZmluZSBJTEtfRElTUExBWV9DSElDS0VOX0ZVU0VTCTB4NDIwMTQKQEAgLTI2MDAsNiArMjc2NCw4IEBACiAjZGVmaW5lICBJTEtfREVTS1RPUAkJCSgxPDwyMykKICNkZWZpbmUgSUxLX0RTUENMS19HQVRFCQkweDQyMDIwCiAjZGVmaW5lICBJTEtfRFBBUkJfQ0xLX0dBVEUJKDE8PDUpCisjZGVmaW5lICBJTEtfRFBGRF9DTEtfR0FURQkoMTw8NykKKwogLyogQWNjb3JkaW5nIHRvIHNwZWMgdGhpcyBiaXQgNy84Lzkgb2YgMHg0MjAyMCBzaG91bGQgYmUgc2V0IHRvIGVuYWJsZSBGQkMgKi8KICNkZWZpbmUgICBJTEtfQ0xLX0ZCQwkJKDE8PDcpCiAjZGVmaW5lICAgSUxLX0RQRkNfRElTMQkJKDE8PDgpCkBAIC0yNjEyLDEyICsyNzc4LDQxIEBACiAvKiBQQ0ggKi8KIAogLyogc291dGggZGlzcGxheSBlbmdpbmUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNERV9BVURJT19QT1dFUl9ECSgxIDw8IDI3KQorI2RlZmluZSBTREVfQVVESU9fUE9XRVJfQwkoMSA8PCAyNikKKyNkZWZpbmUgU0RFX0FVRElPX1BPV0VSX0IJKDEgPDwgMjUpCisjZGVmaW5lIFNERV9BVURJT19QT1dFUl9TSElGVAkoMjUpCisjZGVmaW5lIFNERV9BVURJT19QT1dFUl9NQVNLCSg3IDw8IFNERV9BVURJT19QT1dFUl9TSElGVCkKKyNkZWZpbmUgU0RFX0dNQlVTCQkoMSA8PCAyNCkKKyNkZWZpbmUgU0RFX0FVRElPX0hEQ1BfVFJBTlNCCSgxIDw8IDIzKQorI2RlZmluZSBTREVfQVVESU9fSERDUF9UUkFOU0EJKDEgPDwgMjIpCisjZGVmaW5lIFNERV9BVURJT19IRENQX01BU0sJKDMgPDwgMjIpCisjZGVmaW5lIFNERV9BVURJT19UUkFOU0IJKDEgPDwgMjEpCisjZGVmaW5lIFNERV9BVURJT19UUkFOU0EJKDEgPDwgMjApCisjZGVmaW5lIFNERV9BVURJT19UUkFOU19NQVNLCSgzIDw8IDIwKQorI2RlZmluZSBTREVfUE9JU09OCQkoMSA8PCAxOSkKKy8qIDE4IHJlc2VydmVkICovCisjZGVmaW5lIFNERV9GRElfUlhCCQkoMSA8PCAxNykKKyNkZWZpbmUgU0RFX0ZESV9SWEEJCSgxIDw8IDE2KQorI2RlZmluZSBTREVfRkRJX01BU0sJCSgzIDw8IDE2KQorI2RlZmluZSBTREVfQVVYRAkJKDEgPDwgMTUpCisjZGVmaW5lIFNERV9BVVhDCQkoMSA8PCAxNCkKKyNkZWZpbmUgU0RFX0FVWEIJCSgxIDw8IDEzKQorI2RlZmluZSBTREVfQVVYX01BU0sJCSg3IDw8IDEzKQorLyogMTIgcmVzZXJ2ZWQgKi8KICNkZWZpbmUgU0RFX0NSVF9IT1RQTFVHICAgICAgICAgKDEgPDwgMTEpCiAjZGVmaW5lIFNERV9QT1JURF9IT1RQTFVHICAgICAgICgxIDw8IDEwKQogI2RlZmluZSBTREVfUE9SVENfSE9UUExVRyAgICAgICAoMSA8PCA5KQogI2RlZmluZSBTREVfUE9SVEJfSE9UUExVRyAgICAgICAoMSA8PCA4KQogI2RlZmluZSBTREVfU0RWT0JfSE9UUExVRyAgICAgICAoMSA8PCA2KQogI2RlZmluZSBTREVfSE9UUExVR19NQVNLCSgweGYgPDwgOCkKKyNkZWZpbmUgU0RFX1RSQU5TQl9DUkNfRE9ORQkoMSA8PCA1KQorI2RlZmluZSBTREVfVFJBTlNCX0NSQ19FUlIJKDEgPDwgNCkKKyNkZWZpbmUgU0RFX1RSQU5TQl9GSUZPX1VOREVSCSgxIDw8IDMpCisjZGVmaW5lIFNERV9UUkFOU0FfQ1JDX0RPTkUJKDEgPDwgMikKKyNkZWZpbmUgU0RFX1RSQU5TQV9DUkNfRVJSCSgxIDw8IDEpCisjZGVmaW5lIFNERV9UUkFOU0FfRklGT19VTkRFUgkoMSA8PCAwKQorI2RlZmluZSBTREVfVFJBTlNfTUFTSwkJKDB4M2YpCiAvKiBDUFQgKi8KICNkZWZpbmUgU0RFX0NSVF9IT1RQTFVHX0NQVAkoMSA8PCAxOSkKICNkZWZpbmUgU0RFX1BPUlREX0hPVFBMVUdfQ1BUCSgxIDw8IDIzKQpAQCAtMjY3OSw2ICsyODc0LDcgQEAKICNkZWZpbmUgUENIX0RQTEwocGlwZSkgX1BJUEUocGlwZSwgUENIX0RQTExfQSwgUENIX0RQTExfQikKIAogI2RlZmluZSBQQ0hfRlBBMCAgICAgICAgICAgICAgICAweGM2MDQwCisjZGVmaW5lICBGUF9DQl9UVU5FCQkoMHgzPDwyMikKICNkZWZpbmUgUENIX0ZQQTEgICAgICAgICAgICAgICAgMHhjNjA0NAogI2RlZmluZSBQQ0hfRlBCMCAgICAgICAgICAgICAgICAweGM2MDQ4CiAjZGVmaW5lIFBDSF9GUEIxICAgICAgICAgICAgICAgIDB4YzYwNGMKQEAgLTMwNTcsMTAgKzMyNTMsNzQgQEAKICNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOXzYwME1WXzNfNURCX1NOQl9BCSgweDAxPDwyMikKICNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOXzgwME1WXzBEQl9TTkJfQQkJKDB4MDw8MjIpCiAvKiBTTkIgQi1zdGVwcGluZyAqLwotI2RlZmluZSAgRURQX0xJTktfVFJBSU5fNDAwTVZfMERCX1NOQl9CCQkoMHgwPDwyMikKLSNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOXzQwME1WXzZEQl9TTkJfQgkJKDB4M2E8PDIyKQotI2RlZmluZSAgRURQX0xJTktfVFJBSU5fNjAwTVZfM181REJfU05CX0IJKDB4Mzk8PDIyKQotI2RlZmluZSAgRURQX0xJTktfVFJBSU5fODAwTVZfMERCX1NOQl9CCQkoMHgzODw8MjIpCisjZGVmaW5lICBFRFBfTElOS19UUkFJTl80MDBfNjAwTVZfMERCX1NOQl9CCSgweDA8PDIyKQorI2RlZmluZSAgRURQX0xJTktfVFJBSU5fNDAwTVZfM181REJfU05CX0IJKDB4MTw8MjIpCisjZGVmaW5lICBFRFBfTElOS19UUkFJTl80MDBfNjAwTVZfNkRCX1NOQl9CCSgweDNhPDwyMikKKyNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOXzYwMF84MDBNVl8zXzVEQl9TTkJfQgkoMHgzOTw8MjIpCisjZGVmaW5lICBFRFBfTElOS19UUkFJTl84MDBfMTIwME1WXzBEQl9TTkJfQgkoMHgzODw8MjIpCiAjZGVmaW5lICBFRFBfTElOS19UUkFJTl9WT0xfRU1QX01BU0tfU05CCSgweDNmPDwyMikKIAorI2RlZmluZSAgRk9SQ0VXQUtFCQkJCTB4QTE4QworI2RlZmluZSAgRk9SQ0VXQUtFX0FDSwkJCQkweDEzMDA5MAorCisjZGVmaW5lIEdFTjZfUlBOU1dSRVEJCQkJMHhBMDA4CisjZGVmaW5lICAgR0VONl9UVVJCT19ESVNBQkxFCQkJKDE8PDMxKQorI2RlZmluZSAgIEdFTjZfRlJFUVVFTkNZKHgpCQkJKCh4KTw8MjUpCisjZGVmaW5lICAgR0VONl9PRkZTRVQoeCkJCQkoKHgpPDwxOSkKKyNkZWZpbmUgICBHRU42X0FHR1JFU1NJVkVfVFVSQk8JCQkoMDw8MTUpCisjZGVmaW5lIEdFTjZfUkNfVklERU9fRlJFUQkJCTB4QTAwQworI2RlZmluZSBHRU42X1JDX0NPTlRST0wJCQkJMHhBMDkwCisjZGVmaW5lICAgR0VONl9SQ19DVExfUkM2cHBfRU5BQkxFCQkoMTw8MTYpCisjZGVmaW5lICAgR0VONl9SQ19DVExfUkM2cF9FTkFCTEUJCSgxPDwxNykKKyNkZWZpbmUgICBHRU42X1JDX0NUTF9SQzZfRU5BQkxFCQkoMTw8MTgpCisjZGVmaW5lICAgR0VONl9SQ19DVExfUkMxZV9FTkFCTEUJCSgxPDwyMCkKKyNkZWZpbmUgICBHRU42X1JDX0NUTF9SQzdfRU5BQkxFCQkoMTw8MjIpCisjZGVmaW5lICAgR0VONl9SQ19DVExfRUlfTU9ERSh4KQkJKCh4KTw8MjcpCisjZGVmaW5lICAgR0VONl9SQ19DVExfSFdfRU5BQkxFCQkJKDE8PDMxKQorI2RlZmluZSBHRU42X1JQX0RPV05fVElNRU9VVAkJCTB4QTAxMAorI2RlZmluZSBHRU42X1JQX0lOVEVSUlVQVF9MSU1JVFMJCTB4QTAxNAorI2RlZmluZSBHRU42X1JQU1RBVDEJCQkJMHhBMDFDCisjZGVmaW5lIEdFTjZfUlBfQ09OVFJPTAkJCQkweEEwMjQKKyNkZWZpbmUgICBHRU42X1JQX01FRElBX1RVUkJPCQkJKDE8PDExKQorI2RlZmluZSAgIEdFTjZfUlBfVVNFX05PUk1BTF9GUkVRCQkoMTw8OSkKKyNkZWZpbmUgICBHRU42X1JQX01FRElBX0lTX0dGWAkJCSgxPDw4KQorI2RlZmluZSAgIEdFTjZfUlBfRU5BQkxFCQkJKDE8PDcpCisjZGVmaW5lICAgR0VONl9SUF9VUF9CVVNZX01BWAkJCSgweDI8PDMpCisjZGVmaW5lICAgR0VONl9SUF9ET1dOX0JVU1lfTUlOCQkJKDB4Mjw8MCkKKyNkZWZpbmUgR0VONl9SUF9VUF9USFJFU0hPTEQJCQkweEEwMkMKKyNkZWZpbmUgR0VONl9SUF9ET1dOX1RIUkVTSE9MRAkJCTB4QTAzMAorI2RlZmluZSBHRU42X1JQX1VQX0VJCQkJCTB4QTA2OAorI2RlZmluZSBHRU42X1JQX0RPV05fRUkJCQkJMHhBMDZDCisjZGVmaW5lIEdFTjZfUlBfSURMRV9IWVNURVJTSVMJCQkweEEwNzAKKyNkZWZpbmUgR0VONl9SQ19TVEFURQkJCQkweEEwOTQKKyNkZWZpbmUgR0VONl9SQzFfV0FLRV9SQVRFX0xJTUlUCQkweEEwOTgKKyNkZWZpbmUgR0VONl9SQzZfV0FLRV9SQVRFX0xJTUlUCQkweEEwOUMKKyNkZWZpbmUgR0VONl9SQzZwcF9XQUtFX1JBVEVfTElNSVQJCTB4QTBBMAorI2RlZmluZSBHRU42X1JDX0VWQUxVQVRJT05fSU5URVJWQUwJCTB4QTBBOAorI2RlZmluZSBHRU42X1JDX0lETEVfSFlTVEVSU0lTCQkJMHhBMEFDCisjZGVmaW5lIEdFTjZfUkNfU0xFRVAJCQkJMHhBMEIwCisjZGVmaW5lIEdFTjZfUkMxZV9USFJFU0hPTEQJCQkweEEwQjQKKyNkZWZpbmUgR0VONl9SQzZfVEhSRVNIT0xECQkJMHhBMEI4CisjZGVmaW5lIEdFTjZfUkM2cF9USFJFU0hPTEQJCQkweEEwQkMKKyNkZWZpbmUgR0VONl9SQzZwcF9USFJFU0hPTEQJCQkweEEwQzAKKyNkZWZpbmUgR0VONl9QTUlOVFJNU0sJCQkJMHhBMTY4CisKKyNkZWZpbmUgR0VONl9QTUlTUgkJCQkweDQ0MDIwCisjZGVmaW5lIEdFTjZfUE1JTVIJCQkJMHg0NDAyNAorI2RlZmluZSBHRU42X1BNSUlSCQkJCTB4NDQwMjgKKyNkZWZpbmUgR0VONl9QTUlFUgkJCQkweDQ0MDJDCisjZGVmaW5lICBHRU42X1BNX01CT1hfRVZFTlQJCQkoMTw8MjUpCisjZGVmaW5lICBHRU42X1BNX1RIRVJNQUxfRVZFTlQJCQkoMTw8MjQpCisjZGVmaW5lICBHRU42X1BNX1JQX0RPV05fVElNRU9VVAkJKDE8PDYpCisjZGVmaW5lICBHRU42X1BNX1JQX1VQX1RIUkVTSE9MRAkJKDE8PDUpCisjZGVmaW5lICBHRU42X1BNX1JQX0RPV05fVEhSRVNIT0xECQkoMTw8NCkKKyNkZWZpbmUgIEdFTjZfUE1fUlBfVVBfRUlfRVhQSVJFRAkJKDE8PDIpCisjZGVmaW5lICBHRU42X1BNX1JQX0RPV05fRUlfRVhQSVJFRAkJKDE8PDEpCisKKyNkZWZpbmUgR0VONl9QQ09ERV9NQUlMQk9YCQkJMHgxMzgxMjQKKyNkZWZpbmUgICBHRU42X1BDT0RFX1JFQURZCQkJKDE8PDMxKQorI2RlZmluZSAgIEdFTjZfUkVBRF9PQ19QQVJBTVMJCQkweGMKKyNkZWZpbmUgICBHRU42X1BDT0RFX1dSSVRFX01JTl9GUkVRX1RBQkxFCTB4OQorI2RlZmluZSBHRU42X1BDT0RFX0RBVEEJCQkJMHgxMzgxMjgKKwogI2VuZGlmIC8qIF9JOTE1X1JFR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCA0MjcyOWQyLi4wNTIxZWNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMKQEAgLTIzNSw2ICsyMzUsNyBAQAogc3RhdGljIHZvaWQgaTkxNV9zYXZlX21vZGVzZXRfcmVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CkBAIC0zNjcsNiArMzY4LDI4IEBACiAJfQogCWk5MTVfc2F2ZV9wYWxldHRlKGRldiwgUElQRV9CKTsKIAlkZXZfcHJpdi0+c2F2ZVBJUEVCU1RBVCA9IEk5MTVfUkVBRChQSVBFQlNUQVQpOworCisJLyogRmVuY2VzICovCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNjoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldID0gSTkxNV9SRUFENjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyAoaSAqIDgpKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCWNhc2UgNDoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldID0gSTkxNV9SRUFENjQoRkVOQ0VfUkVHXzk2NV8wICsgKGkgKiA4KSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfRzMzKGRldikpCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaSs4XSA9IEk5MTVfUkVBRChGRU5DRV9SRUdfOTQ1XzggKyAoaSAqIDQpKTsKKwljYXNlIDI6CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldID0gSTkxNV9SRUFEKEZFTkNFX1JFR184MzBfMCArIChpICogNCkpOworCQlicmVhazsKKwl9CisKIAlyZXR1cm47CiB9CiAKQEAgLTM3NSwxMCArMzk4LDMzIEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgZHBsbF9hX3JlZywgZnBhMF9yZWcsIGZwYTFfcmVnOwogCWludCBkcGxsX2JfcmVnLCBmcGIwX3JlZywgZnBiMV9yZWc7CisJaW50IGk7CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJcmV0dXJuOwogCisJLyogRmVuY2VzICovCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNjoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyAoaSAqIDgpLCBkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCWNhc2UgNDoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgKGkgKiA4KSwgZGV2X3ByaXYtPnNhdmVGRU5DRVtpXSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwljYXNlIDI6CisJCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQorCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlJOTE1X1dSSVRFKEZFTkNFX1JFR185NDVfOCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaSs4XSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlJOTE1X1dSSVRFKEZFTkNFX1JFR184MzBfMCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaV0pOworCQlicmVhazsKKwl9CisKKwogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKIAkJZHBsbF9hX3JlZyA9IFBDSF9EUExMX0E7CiAJCWRwbGxfYl9yZWcgPSBQQ0hfRFBMTF9COwpAQCAtNjk0LDcgKzc0MCw3IEBACiAJCUk5MTVfV1JJVEUoUENIX1BQX09GRl9ERUxBWVMsIGRldl9wcml2LT5zYXZlUFBfT0ZGX0RFTEFZUyk7CiAJCUk5MTVfV1JJVEUoUENIX1BQX0RJVklTT1IsIGRldl9wcml2LT5zYXZlUFBfRElWSVNPUik7CiAJCUk5MTVfV1JJVEUoUENIX1BQX0NPTlRST0wsIGRldl9wcml2LT5zYXZlUFBfQ09OVFJPTCk7Ci0JCUk5MTVfV1JJVEUoTUNIQkFSX1JFTkRFUl9TVEFOREJZLAorCQlJOTE1X1dSSVRFKFJTVERCWUNUTCwKIAkJCSAgIGRldl9wcml2LT5zYXZlTUNIQkFSX1JFTkRFUl9TVEFOREJZKTsKIAl9IGVsc2UgewogCQlJOTE1X1dSSVRFKFBGSVRfUEdNX1JBVElPUywgZGV2X3ByaXYtPnNhdmVQRklUX1BHTV9SQVRJT1MpOwpAQCAtNzY1LDE0ICs4MTEsMTYgQEAKIAkJZGV2X3ByaXYtPnNhdmVGRElfUlhBX0lNUiA9IEk5MTVfUkVBRChGRElfUlhBX0lNUik7CiAJCWRldl9wcml2LT5zYXZlRkRJX1JYQl9JTVIgPSBJOTE1X1JFQUQoRkRJX1JYQl9JTVIpOwogCQlkZXZfcHJpdi0+c2F2ZU1DSEJBUl9SRU5ERVJfU1RBTkRCWSA9Ci0JCQlJOTE1X1JFQUQoTUNIQkFSX1JFTkRFUl9TVEFOREJZKTsKKwkJCUk5MTVfUkVBRChSU1REQllDVEwpOwogCX0gZWxzZSB7CiAJCWRldl9wcml2LT5zYXZlSUVSID0gSTkxNV9SRUFEKElFUik7CiAJCWRldl9wcml2LT5zYXZlSU1SID0gSTkxNV9SRUFEKElNUik7CiAJfQogCi0JaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKQogCQlpcm9ubGFrZV9kaXNhYmxlX2RycHMoZGV2KTsKKwlpZiAoSVNfR0VONihkZXYpKQorCQlnZW42X2Rpc2FibGVfcnBzKGRldik7CiAKIAkvKiBDYWNoZSBtb2RlIHN0YXRlICovCiAJZGV2X3ByaXYtPnNhdmVDQUNIRV9NT0RFXzAgPSBJOTE1X1JFQUQoQ0FDSEVfTU9ERV8wKTsKQEAgLTc4OCwyOCArODM2LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlkZXZfcHJpdi0+c2F2ZVNXRjJbaV0gPSBJOTE1X1JFQUQoU1dGMzAgKyAoaSA8PCAyKSk7CiAKLQkvKiBGZW5jZXMgKi8KLQlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7Ci0JY2FzZSA2OgotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCkpOwotCQlicmVhazsKLQljYXNlIDU6Ci0JY2FzZSA0OgotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfOTY1XzAgKyAoaSAqIDgpKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSB8fCBJU19HMzMoZGV2KSkKLQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQkJZGV2X3ByaXYtPnNhdmVGRU5DRVtpKzhdID0gSTkxNV9SRUFEKEZFTkNFX1JFR185NDVfOCArIChpICogNCkpOwotCWNhc2UgMjoKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSk7Ci0JCWJyZWFrOwotCi0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyMywyNyArODQ5LDYgQEAKIAkvKiBIYXJkd2FyZSBzdGF0dXMgcGFnZSAqLwogCUk5MTVfV1JJVEUoSFdTX1BHQSwgZGV2X3ByaXYtPnNhdmVIV1MpOwogCi0JLyogRmVuY2VzICovCi0Jc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewotCWNhc2UgNjoKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyAoaSAqIDgpLCBkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCWNhc2UgNDoKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgKGkgKiA4KSwgZGV2X3ByaXYtPnNhdmVGRU5DRVtpXSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQljYXNlIDI6Ci0JCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCQlJOTE1X1dSSVRFKEZFTkNFX1JFR185NDVfOCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaSs4XSk7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlJOTE1X1dSSVRFKEZFTkNFX1JFR184MzBfMCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaV0pOwotCQlicmVhazsKLQl9Ci0KIAlpOTE1X3Jlc3RvcmVfZGlzcGxheShkZXYpOwogCiAJLyogSW50ZXJydXB0IHN0YXRlICovCkBAIC04NjAsMTMgKzg2NSwxNiBAQAogCX0KIAogCS8qIENsb2NrIGdhdGluZyBzdGF0ZSAqLwotCWludGVsX2luaXRfY2xvY2tfZ2F0aW5nKGRldik7CisJaW50ZWxfZW5hYmxlX2Nsb2NrX2dhdGluZyhkZXYpOwogCi0JaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKIAkJaXJvbmxha2VfZW5hYmxlX2RycHMoZGV2KTsKIAkJaW50ZWxfaW5pdF9lbW9uKGRldik7CiAJfQogCisJaWYgKElTX0dFTjYoZGV2KSkKKwkJZ2VuNl9lbmFibGVfcnBzKGRldl9wcml2KTsKKwogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaAppbmRleCBmZWE5N2EyLi43ZjBmYzNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaApAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIGk5MTUKQEAgLTE2LDE4ICsxNywxOCBAQAogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfY3JlYXRlLAogCi0JICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiksCiAKIAkgICAgVFBfQVJHUyhvYmopLAogCiAJICAgIFRQX1NUUlVDVF9fZW50cnkoCi0JCQkgICAgIF9fZmllbGQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICosIG9iaikKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqLCBvYmopCiAJCQkgICAgIF9fZmllbGQodTMyLCBzaXplKQogCQkJICAgICApLAogCiAJICAgIFRQX2Zhc3RfYXNzaWduKAogCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOwotCQkJICAgX19lbnRyeS0+c2l6ZSA9IG9iai0+c2l6ZTsKKwkJCSAgIF9fZW50cnktPnNpemUgPSBvYmotPmJhc2Uuc2l6ZTsKIAkJCSAgICksCiAKIAkgICAgVFBfcHJpbnRrKCJvYmo9JXAsIHNpemU9JXUiLCBfX2VudHJ5LT5vYmosIF9fZW50cnktPnNpemUpCkBAIC0zNSw0MCArMzYsNDMgQEAKIAogVFJBQ0VfRVZFTlQoaTkxNV9nZW1fb2JqZWN0X2JpbmQsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHUzMiBndHRfb2Zmc2V0KSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdTMyIGd0dF9vZmZzZXQsIGJvb2wgbWFwcGFibGUpLAogCi0JICAgIFRQX0FSR1Mob2JqLCBndHRfb2Zmc2V0KSwKKwkgICAgVFBfQVJHUyhvYmosIGd0dF9vZmZzZXQsIG1hcHBhYmxlKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAotCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgIF9fZmllbGQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgb2JqKQogCQkJICAgICBfX2ZpZWxkKHUzMiwgZ3R0X29mZnNldCkKKwkJCSAgICAgX19maWVsZChib29sLCBtYXBwYWJsZSkKIAkJCSAgICAgKSwKIAogCSAgICBUUF9mYXN0X2Fzc2lnbigKIAkJCSAgIF9fZW50cnktPm9iaiA9IG9iajsKIAkJCSAgIF9fZW50cnktPmd0dF9vZmZzZXQgPSBndHRfb2Zmc2V0OworCQkJICAgX19lbnRyeS0+bWFwcGFibGUgPSBtYXBwYWJsZTsKIAkJCSAgICksCiAKLQkgICAgVFBfcHJpbnRrKCJvYmo9JXAsIGd0dF9vZmZzZXQ9JTA4eCIsCi0JCSAgICAgIF9fZW50cnktPm9iaiwgX19lbnRyeS0+Z3R0X29mZnNldCkKKwkgICAgVFBfcHJpbnRrKCJvYmo9JXAsIGd0dF9vZmZzZXQ9JTA4eCVzIiwKKwkJICAgICAgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5ndHRfb2Zmc2V0LAorCQkgICAgICBfX2VudHJ5LT5tYXBwYWJsZSA/ICIsIG1hcHBhYmxlIiA6ICIiKQogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4sCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IG9sZF9yZWFkX2RvbWFpbnMsIHVpbnQzMl90IG9sZF93cml0ZV9kb21haW4pLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1aW50MzJfdCBvbGRfcmVhZF9kb21haW5zLCB1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluKSwKIAogCSAgICBUUF9BUkdTKG9iaiwgb2xkX3JlYWRfZG9tYWlucywgb2xkX3dyaXRlX2RvbWFpbiksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKLQkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIG9iaikKIAkJCSAgICAgX19maWVsZCh1MzIsIHJlYWRfZG9tYWlucykKIAkJCSAgICAgX19maWVsZCh1MzIsIHdyaXRlX2RvbWFpbikKIAkJCSAgICAgKSwKIAogCSAgICBUUF9mYXN0X2Fzc2lnbigKIAkJCSAgIF9fZW50cnktPm9iaiA9IG9iajsKLQkJCSAgIF9fZW50cnktPnJlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zIHwgKG9sZF9yZWFkX2RvbWFpbnMgPDwgMTYpOwotCQkJICAgX19lbnRyeS0+d3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW4gfCAob2xkX3dyaXRlX2RvbWFpbiA8PCAxNik7CisJCQkgICBfX2VudHJ5LT5yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucmVhZF9kb21haW5zIHwgKG9sZF9yZWFkX2RvbWFpbnMgPDwgMTYpOworCQkJICAgX19lbnRyeS0+d3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbiB8IChvbGRfd3JpdGVfZG9tYWluIDw8IDE2KTsKIAkJCSAgICksCiAKIAkgICAgVFBfcHJpbnRrKCJvYmo9JXAsIHJlYWQ9JTA0eCwgd3JpdGU9JTA0eCIsCkBAIC03NiwzNiArODAsMTQgQEAKIAkJICAgICAgX19lbnRyeS0+cmVhZF9kb21haW5zLCBfX2VudHJ5LT53cml0ZV9kb21haW4pCiApOwogCi1UUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlLAotCi0JICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBpbnQgZmVuY2UsIGludCB0aWxpbmdfbW9kZSksCi0KLQkgICAgVFBfQVJHUyhvYmosIGZlbmNlLCB0aWxpbmdfbW9kZSksCi0KLQkgICAgVFBfU1RSVUNUX19lbnRyeSgKLQkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQotCQkJICAgICBfX2ZpZWxkKGludCwgZmVuY2UpCi0JCQkgICAgIF9fZmllbGQoaW50LCB0aWxpbmdfbW9kZSkKLQkJCSAgICAgKSwKLQotCSAgICBUUF9mYXN0X2Fzc2lnbigKLQkJCSAgIF9fZW50cnktPm9iaiA9IG9iajsKLQkJCSAgIF9fZW50cnktPmZlbmNlID0gZmVuY2U7Ci0JCQkgICBfX2VudHJ5LT50aWxpbmdfbW9kZSA9IHRpbGluZ19tb2RlOwotCQkJICAgKSwKLQotCSAgICBUUF9wcmludGsoIm9iaj0lcCwgZmVuY2U9JWQsIHRpbGluZz0lZCIsCi0JCSAgICAgIF9fZW50cnktPm9iaiwgX19lbnRyeS0+ZmVuY2UsIF9fZW50cnktPnRpbGluZ19tb2RlKQotKTsKLQogREVDTEFSRV9FVkVOVF9DTEFTUyhpOTE1X2dlbV9vYmplY3QsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKG9iaiksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKLQkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIG9iaikKIAkJCSAgICAgKSwKIAogCSAgICBUUF9mYXN0X2Fzc2lnbigKQEAgLTExNywyMSArOTksMjEgQEAKIAogREVGSU5FX0VWRU5UKGk5MTVfZ2VtX29iamVjdCwgaTkxNV9nZW1fb2JqZWN0X2NsZmx1c2gsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKG9iaikKICk7CiAKIERFRklORV9FVkVOVChpOTE1X2dlbV9vYmplY3QsIGk5MTVfZ2VtX29iamVjdF91bmJpbmQsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKG9iaikKICk7CiAKIERFRklORV9FVkVOVChpOTE1X2dlbV9vYmplY3QsIGk5MTVfZ2VtX29iamVjdF9kZXN0cm95LAogCi0JICAgIFRQX1BST1RPKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiksCiAKIAkgICAgVFBfQVJHUyhvYmopCiApOwpAQCAtMjYzLDEzICsyNDUsMTMgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGk5MTVfZmxpcF9yZXF1ZXN0LAotCSAgICBUUF9QUk9UTyhpbnQgcGxhbmUsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKwkgICAgVFBfUFJPVE8oaW50IHBsYW5lLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKHBsYW5lLCBvYmopLAogCiAJICAgIFRQX1NUUlVDVF9fZW50cnkoCiAJCSAgICBfX2ZpZWxkKGludCwgcGxhbmUpCi0JCSAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCSAgICBfX2ZpZWxkKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIG9iaikKIAkJICAgICksCiAKIAkgICAgVFBfZmFzdF9hc3NpZ24oCkBAIC0yODEsMTMgKzI2MywxMyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9mbGlwX2NvbXBsZXRlLAotCSAgICBUUF9QUk9UTyhpbnQgcGxhbmUsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKSwKKwkgICAgVFBfUFJPVE8oaW50IHBsYW5lLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKHBsYW5lLCBvYmopLAogCiAJICAgIFRQX1NUUlVDVF9fZW50cnkoCiAJCSAgICBfX2ZpZWxkKGludCwgcGxhbmUpCi0JCSAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCSAgICBfX2ZpZWxkKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIG9iaikKIAkJICAgICksCiAKIAkgICAgVFBfZmFzdF9hc3NpZ24oCkBAIC0yOTgsNiArMjgwLDI5IEBACiAJICAgIFRQX3ByaW50aygicGxhbmU9JWQsIG9iaj0lcCIsIF9fZW50cnktPnBsYW5lLCBfX2VudHJ5LT5vYmopCiApOwogCitUUkFDRV9FVkVOVChpOTE1X3JlZ19ydywKKyAgICAgICAgICAgVFBfUFJPVE8oaW50IGNtZCwgdWludDMyX3QgcmVnLCB1aW50NjRfdCB2YWwsIGludCBsZW4pLAorCisgICAgICAgICAgIFRQX0FSR1MoY21kLCByZWcsIHZhbCwgbGVuKSwKKworICAgICAgICAgICBUUF9TVFJVQ1RfX2VudHJ5KAorICAgICAgICAgICAgICAgICAgIF9fZmllbGQoaW50LCBjbWQpCisgICAgICAgICAgICAgICAgICAgX19maWVsZCh1aW50MzJfdCwgcmVnKQorICAgICAgICAgICAgICAgICAgIF9fZmllbGQodWludDY0X3QsIHZhbCkKKyAgICAgICAgICAgICAgICAgICBfX2ZpZWxkKGludCwgbGVuKQorICAgICAgICAgICAgICAgICAgICksCisKKyAgICAgICAgICAgVFBfZmFzdF9hc3NpZ24oCisgICAgICAgICAgICAgICAgICAgX19lbnRyeS0+Y21kID0gY21kOworICAgICAgICAgICAgICAgICAgIF9fZW50cnktPnJlZyA9IHJlZzsKKyAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT52YWwgPSAodWludDY0X3QpdmFsOworICAgICAgICAgICAgICAgICAgIF9fZW50cnktPmxlbiA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICApLAorCisgICAgICAgICAgIFRQX3ByaW50aygiY21kPSVjLCByZWc9MHgleCwgdmFsPTB4JWxseCwgbGVuPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fZW50cnktPmNtZCwgX19lbnRyeS0+cmVnLCBfX2VudHJ5LT52YWwsIF9fZW50cnktPmxlbikKKyk7CisKICNlbmRpZiAvKiBfSTkxNV9UUkFDRV9IXyAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Jpb3MuYwppbmRleCBiMGIxMjAwLi4wYjQ0OTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYmlvcy5jCkBAIC0yNjQsMTcgKzI2NCwxMiBAQAogCQlkZXZfcHJpdi0+aW50X2NydF9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X2NydF9zdXBwb3J0OwogCQlkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gZ2VuZXJhbC0+ZW5hYmxlX3NzYzsKIAotCQlpZiAoZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYykgewotCQkJaWYgKElTX0k4NVgoZGV2KSkKLQkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9Ci0JCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gNjYgOiA0ODsKLQkJCWVsc2UgaWYgKElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikpCi0JCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPQotCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDEyMDsKLQkJCWVsc2UKLQkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9Ci0JCQkJCWdlbmVyYWwtPnNzY19mcmVxID8gMTAwIDogOTY7Ci0JCX0KKwkJaWYgKElTX0k4NVgoZGV2KSkKKwkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0gZ2VuZXJhbC0+c3NjX2ZyZXEgPyA2NiA6IDQ4OworCQllbHNlIGlmIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQorCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPSBnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDEyMDsKKwkJZWxzZQorCQkJZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPSBnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDk2OwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwppbmRleCA4ZGY1NzQzLi4xNzAzNWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jcnQuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgImRybV9jcnRjLmgiCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSAiZHJtX2VkaWQuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCkBAIC0yODcsOCArMjg4LDkgQEAKIAlyZXR1cm4gaTJjX3RyYW5zZmVyKCZkZXZfcHJpdi0+Z21idXNbZGRjX2J1c10uYWRhcHRlciwgbXNncywgMSkgPT0gMTsKIH0KIAotc3RhdGljIGJvb2wgaW50ZWxfY3J0X2RldGVjdF9kZGMoc3RydWN0IGludGVsX2NydCAqY3J0KQorc3RhdGljIGJvb2wgaW50ZWxfY3J0X2RldGVjdF9kZGMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKIHsKKwlzdHJ1Y3QgaW50ZWxfY3J0ICpjcnQgPSBpbnRlbF9hdHRhY2hlZF9jcnQoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjcnQtPmJhc2UuYmFzZS5kZXYtPmRldl9wcml2YXRlOwogCiAJLyogQ1JUIHNob3VsZCBhbHdheXMgYmUgYXQgMCwgYnV0IGNoZWNrIGFueXdheSAqLwpAQCAtMzAxLDggKzMwMywyNiBAQAogCX0KIAogCWlmIChpbnRlbF9kZGNfcHJvYmUoJmNydC0+YmFzZSwgZGV2X3ByaXYtPmNydF9kZGNfcGluKSkgewotCQlEUk1fREVCVUdfS01TKCJDUlQgZGV0ZWN0ZWQgdmlhIEREQzoweDUwIFtFRElEXVxuIik7Ci0JCXJldHVybiB0cnVlOworCQlzdHJ1Y3QgZWRpZCAqZWRpZDsKKwkJYm9vbCBpc19kaWdpdGFsID0gZmFsc2U7CisKKwkJZWRpZCA9IGRybV9nZXRfZWRpZChjb25uZWN0b3IsCisJCQkmZGV2X3ByaXYtPmdtYnVzW2Rldl9wcml2LT5jcnRfZGRjX3Bpbl0uYWRhcHRlcik7CisJCS8qCisJCSAqIFRoaXMgbWF5IGJlIGEgRFZJLUkgY29ubmVjdG9yIHdpdGggYSBzaGFyZWQgRERDCisJCSAqIGxpbmsgYmV0d2VlbiBhbmFsb2cgYW5kIGRpZ2l0YWwgb3V0cHV0cywgc28gd2UKKwkJICogaGF2ZSB0byBjaGVjayB0aGUgRURJRCBpbnB1dCBzcGVjIG9mIHRoZSBhdHRhY2hlZCBkZXZpY2UuCisJCSAqLworCQlpZiAoZWRpZCAhPSBOVUxMKSB7CisJCQlpc19kaWdpdGFsID0gZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMOworCQkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucmF3X2VkaWQgPSBOVUxMOworCQkJa2ZyZWUoZWRpZCk7CisJCX0KKworCQlpZiAoIWlzX2RpZ2l0YWwpIHsKKwkJCURSTV9ERUJVR19LTVMoIkNSVCBkZXRlY3RlZCB2aWEgRERDOjB4NTAgW0VESURdXG4iKTsKKwkJCXJldHVybiB0cnVlOworCQl9CiAJfQogCiAJcmV0dXJuIGZhbHNlOwpAQCAtNDU4LDcgKzQ3OCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoaW50ZWxfY3J0X2RldGVjdF9kZGMoY3J0KSkKKwlpZiAoaW50ZWxfY3J0X2RldGVjdF9kZGMoY29ubmVjdG9yKSkKIAkJcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwogCiAJaWYgKCFmb3JjZSkKQEAgLTQ3Miw3ICs0OTIsNyBAQAogCQljcnRjID0gaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoJmNydC0+YmFzZSwgY29ubmVjdG9yLAogCQkJCQkJICBOVUxMLCAmZHBtc19tb2RlKTsKIAkJaWYgKGNydGMpIHsKLQkJCWlmIChpbnRlbF9jcnRfZGV0ZWN0X2RkYyhjcnQpKQorCQkJaWYgKGludGVsX2NydF9kZXRlY3RfZGRjKGNvbm5lY3RvcikpCiAJCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CiAJCQllbHNlCiAJCQkJc3RhdHVzID0gaW50ZWxfY3J0X2xvYWRfZGV0ZWN0KGNydGMsIGNydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKaW5kZXggZmNhNTIzMi4uOTg5NjdmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtNjQyLDI2ICs2NDIsMjMgQEAKICAgICAgICAgLmZpbmRfcGxsID0gaW50ZWxfZmluZF9wbGxfaXJvbmxha2VfZHAsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCAqaW50ZWxfaXJvbmxha2VfbGltaXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQorc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgKmludGVsX2lyb25sYWtlX2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkJCWludCByZWZjbGspCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0OwotCWludCByZWZjbGsgPSAxMjA7CiAKIAlpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykpIHsKLQkJaWYgKGRldl9wcml2LT5sdmRzX3VzZV9zc2MgJiYgZGV2X3ByaXYtPmx2ZHNfc3NjX2ZyZXEgPT0gMTAwKQotCQkJcmVmY2xrID0gMTAwOwotCiAJCWlmICgoSTkxNV9SRUFEKFBDSF9MVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PQogCQkgICAgTFZEU19DTEtCX1BPV0VSX1VQKSB7CiAJCQkvKiBMVkRTIGR1YWwgY2hhbm5lbCAqLwotCQkJaWYgKHJlZmNsayA9PSAxMDApCisJCQlpZiAocmVmY2xrID09IDEwMDAwMCkKIAkJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfaXJvbmxha2VfZHVhbF9sdmRzXzEwMG07CiAJCQllbHNlCiAJCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lyb25sYWtlX2R1YWxfbHZkczsKIAkJfSBlbHNlIHsKLQkJCWlmIChyZWZjbGsgPT0gMTAwKQorCQkJaWYgKHJlZmNsayA9PSAxMDAwMDApCiAJCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lyb25sYWtlX3NpbmdsZV9sdmRzXzEwMG07CiAJCQllbHNlCiAJCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lyb25sYWtlX3NpbmdsZV9sdmRzOwpAQCAtNzAyLDEzICs2OTksMTMgQEAKIAlyZXR1cm4gbGltaXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90ICppbnRlbF9saW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCAqaW50ZWxfbGltaXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgcmVmY2xrKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQ7CiAKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQotCQlsaW1pdCA9IGludGVsX2lyb25sYWtlX2xpbWl0KGNydGMpOworCQlsaW1pdCA9IGludGVsX2lyb25sYWtlX2xpbWl0KGNydGMsIHJlZmNsayk7CiAJZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKIAkJbGltaXQgPSBpbnRlbF9nNHhfbGltaXQoY3J0Yyk7CiAJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CkBAIC03NzMsMTEgKzc3MCwxMCBAQAogICogdGhlIGdpdmVuIGNvbm5lY3RvcnMuCiAgKi8KIAotc3RhdGljIGJvb2wgaW50ZWxfUExMX2lzX3ZhbGlkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCitzdGF0aWMgYm9vbCBpbnRlbF9QTExfaXNfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwKKwkJCSAgICAgICBjb25zdCBpbnRlbF9jbG9ja190ICpjbG9jaykKIHsKLQljb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCA9IGludGVsX2xpbWl0IChjcnRjKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCiAJaWYgKGNsb2NrLT5wMSAgPCBsaW1pdC0+cDEubWluICB8fCBsaW1pdC0+cDEubWF4ICA8IGNsb2NrLT5wMSkKIAkJSU5URUxQbGxJbnZhbGlkICgicDEgb3V0IG9mIHJhbmdlXG4iKTsKIAlpZiAoY2xvY2stPnAgICA8IGxpbWl0LT5wLm1pbiAgIHx8IGxpbWl0LT5wLm1heCAgIDwgY2xvY2stPnApCkBAIC04NDksOCArODQ1LDggQEAKIAkJCQkJaW50IHRoaXNfZXJyOwogCiAJCQkJCWludGVsX2Nsb2NrKGRldiwgcmVmY2xrLCAmY2xvY2spOwotCi0JCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGNydGMsICZjbG9jaykpCisJCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGRldiwgbGltaXQsCisJCQkJCQkJCSZjbG9jaykpCiAJCQkJCQljb250aW51ZTsKIAogCQkJCQl0aGlzX2VyciA9IGFicyhjbG9jay5kb3QgLSB0YXJnZXQpOwpAQCAtOTEyLDkgKzkwOCwxMSBAQAogCQkJCQlpbnQgdGhpc19lcnI7CiAKIAkJCQkJaW50ZWxfY2xvY2soZGV2LCByZWZjbGssICZjbG9jayk7Ci0JCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGNydGMsICZjbG9jaykpCisJCQkJCWlmICghaW50ZWxfUExMX2lzX3ZhbGlkKGRldiwgbGltaXQsCisJCQkJCQkJCSZjbG9jaykpCiAJCQkJCQljb250aW51ZTsKLQkJCQkJdGhpc19lcnIgPSBhYnMoY2xvY2suZG90IC0gdGFyZ2V0KSA7CisKKwkJCQkJdGhpc19lcnIgPSBhYnMoY2xvY2suZG90IC0gdGFyZ2V0KTsKIAkJCQkJaWYgKHRoaXNfZXJyIDwgZXJyX21vc3QpIHsKIAkJCQkJCSpiZXN0X2Nsb2NrID0gY2xvY2s7CiAJCQkJCQllcnJfbW9zdCA9IHRoaXNfZXJyOwpAQCAtMTA2NiwxMyArMTA2NCwxMyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBjcnRjLT5mYjsKIAlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGludGVsX2ZiLT5vYmopOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBpbnRlbF9mYi0+b2JqOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgcGxhbmUsIGk7CiAJdTMyIGZiY19jdGwsIGZiY19jdGwyOwogCiAJaWYgKGZiLT5waXRjaCA9PSBkZXZfcHJpdi0+Y2ZiX3BpdGNoICYmCi0JICAgIG9ial9wcml2LT5mZW5jZV9yZWcgPT0gZGV2X3ByaXYtPmNmYl9mZW5jZSAmJgorCSAgICBvYmotPmZlbmNlX3JlZyA9PSBkZXZfcHJpdi0+Y2ZiX2ZlbmNlICYmCiAJICAgIGludGVsX2NydGMtPnBsYW5lID09IGRldl9wcml2LT5jZmJfcGxhbmUgJiYKIAkgICAgSTkxNV9SRUFEKEZCQ19DT05UUk9MKSAmIEZCQ19DVExfRU4pCiAJCXJldHVybjsKQEAgLTEwODYsNyArMTA4NCw3IEBACiAKIAkvKiBGQkNfQ1RMIHdhbnRzIDY0QiB1bml0cyAqLwogCWRldl9wcml2LT5jZmJfcGl0Y2ggPSAoZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0KSAtIDE7Ci0JZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9iai0+ZmVuY2VfcmVnOwogCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAlwbGFuZSA9IGRldl9wcml2LT5jZmJfcGxhbmUgPT0gMCA/IEZCQ19DVExfUExBTkVBIDogRkJDX0NUTF9QTEFORUI7CiAKQEAgLTEwOTYsNyArMTA5NCw3IEBACiAKIAkvKiBTZXQgaXQgdXAuLi4gKi8KIAlmYmNfY3RsMiA9IEZCQ19DVExfRkVOQ0VfREJMIHwgRkJDX0NUTF9JRExFX0lNTSB8IHBsYW5lOwotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQogCQlmYmNfY3RsMiB8PSBGQkNfQ1RMX0NQVV9GRU5DRTsKIAlJOTE1X1dSSVRFKEZCQ19DT05UUk9MMiwgZmJjX2N0bDIpOwogCUk5MTVfV1JJVEUoRkJDX0ZFTkNFX09GRiwgY3J0Yy0+eSk7CkBAIC0xMTA3LDcgKzExMDUsNyBAQAogCQlmYmNfY3RsIHw9IEZCQ19DVExfQzNfSURMRTsgLyogOTQ1IG5lZWRzIHNwZWNpYWwgU1IgaGFuZGxpbmcgKi8KIAlmYmNfY3RsIHw9IChkZXZfcHJpdi0+Y2ZiX3BpdGNoICYgMHhmZikgPDwgRkJDX0NUTF9TVFJJREVfU0hJRlQ7CiAJZmJjX2N0bCB8PSAoaW50ZXJ2YWwgJiAweDJmZmYpIDw8IEZCQ19DVExfSU5URVJWQUxfU0hJRlQ7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCiAJCWZiY19jdGwgfD0gZGV2X3ByaXYtPmNmYl9mZW5jZTsKIAlJOTE1X1dSSVRFKEZCQ19DT05UUk9MLCBmYmNfY3RsKTsKIApAQCAtMTE1MCw3ICsxMTQ4LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhpbnRlbF9mYi0+b2JqKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IERQRkNfQ1RMX1BMQU5FQSA6IERQRkNfQ1RMX1BMQU5FQjsKIAl1bnNpZ25lZCBsb25nIHN0YWxsX3dhdGVybWFyayA9IDIwMDsKQEAgLTExNTksNyArMTE1Nyw3IEBACiAJZHBmY19jdGwgPSBJOTE1X1JFQUQoRFBGQ19DT05UUk9MKTsKIAlpZiAoZHBmY19jdGwgJiBEUEZDX0NUTF9FTikgewogCQlpZiAoZGV2X3ByaXYtPmNmYl9waXRjaCA9PSBkZXZfcHJpdi0+Y2ZiX3BpdGNoIC8gNjQgLSAxICYmCi0JCSAgICBkZXZfcHJpdi0+Y2ZiX2ZlbmNlID09IG9ial9wcml2LT5mZW5jZV9yZWcgJiYKKwkJICAgIGRldl9wcml2LT5jZmJfZmVuY2UgPT0gb2JqLT5mZW5jZV9yZWcgJiYKIAkJICAgIGRldl9wcml2LT5jZmJfcGxhbmUgPT0gaW50ZWxfY3J0Yy0+cGxhbmUgJiYKIAkJICAgIGRldl9wcml2LT5jZmJfeSA9PSBjcnRjLT55KQogCQkJcmV0dXJuOwpAQCAtMTE3MCwxMiArMTE2OCwxMiBAQAogCX0KIAogCWRldl9wcml2LT5jZmJfcGl0Y2ggPSAoZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0KSAtIDE7Ci0JZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9iai0+ZmVuY2VfcmVnOwogCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAlkZXZfcHJpdi0+Y2ZiX3kgPSBjcnRjLT55OwogCiAJZHBmY19jdGwgPSBwbGFuZSB8IERQRkNfU1JfRU4gfCBEUEZDX0NUTF9MSU1JVF8xWDsKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CiAJCWRwZmNfY3RsIHw9IERQRkNfQ1RMX0ZFTkNFX0VOIHwgZGV2X3ByaXYtPmNmYl9mZW5jZTsKIAkJSTkxNV9XUklURShEUEZDX0NISUNLRU4sIERQRkNfSFRfTU9ESUZZKTsKIAl9IGVsc2UgewpAQCAtMTIyMSw3ICsxMjE5LDcgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhpbnRlbF9mYi0+b2JqKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IERQRkNfQ1RMX1BMQU5FQSA6IERQRkNfQ1RMX1BMQU5FQjsKIAl1bnNpZ25lZCBsb25nIHN0YWxsX3dhdGVybWFyayA9IDIwMDsKQEAgLTEyMzAsOSArMTIyOCw5IEBACiAJZHBmY19jdGwgPSBJOTE1X1JFQUQoSUxLX0RQRkNfQ09OVFJPTCk7CiAJaWYgKGRwZmNfY3RsICYgRFBGQ19DVExfRU4pIHsKIAkJaWYgKGRldl9wcml2LT5jZmJfcGl0Y2ggPT0gZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0IC0gMSAmJgotCQkgICAgZGV2X3ByaXYtPmNmYl9mZW5jZSA9PSBvYmpfcHJpdi0+ZmVuY2VfcmVnICYmCisJCSAgICBkZXZfcHJpdi0+Y2ZiX2ZlbmNlID09IG9iai0+ZmVuY2VfcmVnICYmCiAJCSAgICBkZXZfcHJpdi0+Y2ZiX3BsYW5lID09IGludGVsX2NydGMtPnBsYW5lICYmCi0JCSAgICBkZXZfcHJpdi0+Y2ZiX29mZnNldCA9PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgorCQkgICAgZGV2X3ByaXYtPmNmYl9vZmZzZXQgPT0gb2JqLT5ndHRfb2Zmc2V0ICYmCiAJCSAgICBkZXZfcHJpdi0+Y2ZiX3kgPT0gY3J0Yy0+eSkKIAkJCXJldHVybjsKIApAQCAtMTI0MiwxNCArMTI0MCwxNCBAQAogCX0KIAogCWRldl9wcml2LT5jZmJfcGl0Y2ggPSAoZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0KSAtIDE7Ci0JZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9iai0+ZmVuY2VfcmVnOwogCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKLQlkZXZfcHJpdi0+Y2ZiX29mZnNldCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCWRldl9wcml2LT5jZmJfb2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0OwogCWRldl9wcml2LT5jZmJfeSA9IGNydGMtPnk7CiAKIAlkcGZjX2N0bCAmPSBEUEZDX1JFU0VSVkVEOwogCWRwZmNfY3RsIHw9IChwbGFuZSB8IERQRkNfQ1RMX0xJTUlUXzFYKTsKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CiAJCWRwZmNfY3RsIHw9IChEUEZDX0NUTF9GRU5DRV9FTiB8IGRldl9wcml2LT5jZmJfZmVuY2UpOwogCQlJOTE1X1dSSVRFKElMS19EUEZDX0NISUNLRU4sIERQRkNfSFRfTU9ESUZZKTsKIAl9IGVsc2UgewpAQCAtMTI2MCwxMCArMTI1OCwxNiBAQAogCQkgICAoc3RhbGxfd2F0ZXJtYXJrIDw8IERQRkNfUkVDT01QX1NUQUxMX1dNX1NISUZUKSB8CiAJCSAgIChpbnRlcnZhbCA8PCBEUEZDX1JFQ09NUF9USU1FUl9DT1VOVF9TSElGVCkpOwogCUk5MTVfV1JJVEUoSUxLX0RQRkNfRkVOQ0VfWU9GRiwgY3J0Yy0+eSk7Ci0JSTkxNV9XUklURShJTEtfRkJDX1JUX0JBU0UsIG9ial9wcml2LT5ndHRfb2Zmc2V0IHwgSUxLX0ZCQ19SVF9WQUxJRCk7CisJSTkxNV9XUklURShJTEtfRkJDX1JUX0JBU0UsIG9iai0+Z3R0X29mZnNldCB8IElMS19GQkNfUlRfVkFMSUQpOwogCS8qIGVuYWJsZSBpdC4uLiAqLwogCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ09OVFJPTCwgZHBmY19jdGwgfCBEUEZDX0NUTF9FTik7CiAKKwlpZiAoSVNfR0VONihkZXYpKSB7CisJCUk5MTVfV1JJVEUoU05CX0RQRkNfQ1RMX1NBLAorCQkJICAgU05CX0NQVV9GRU5DRV9FTkFCTEUgfCBkZXZfcHJpdi0+Y2ZiX2ZlbmNlKTsKKwkJSTkxNV9XUklURShEUEZDX0NQVV9GRU5DRV9PRkZTRVQsIGNydGMtPnkpOworCX0KKwogCURSTV9ERUJVR19LTVMoImVuYWJsZWQgZmJjIG9uIHBsYW5lICVkXG4iLCBpbnRlbF9jcnRjLT5wbGFuZSk7CiB9CiAKQEAgLTEzNDUsNyArMTM0OSw3IEBACiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAogCURSTV9ERUJVR19LTVMoIlxuIik7CiAKQEAgLTEzODQsOSArMTM4OCw5IEBACiAJaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJZmIgPSBjcnRjLT5mYjsKIAlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGludGVsX2ZiLT5vYmopOworCW9iaiA9IGludGVsX2ZiLT5vYmo7CiAKLQlpZiAoaW50ZWxfZmItPm9iai0+c2l6ZSA+IGRldl9wcml2LT5jZmJfc2l6ZSkgeworCWlmIChpbnRlbF9mYi0+b2JqLT5iYXNlLnNpemUgPiBkZXZfcHJpdi0+Y2ZiX3NpemUpIHsKIAkJRFJNX0RFQlVHX0tNUygiZnJhbWVidWZmZXIgdG9vIGxhcmdlLCBkaXNhYmxpbmcgIgogCQkJICAgICAgImNvbXByZXNzaW9uXG4iKTsKIAkJZGV2X3ByaXYtPm5vX2ZiY19yZWFzb24gPSBGQkNfU1RPTEVOX1RPT19TTUFMTDsKQEAgLTE0MTAsNyArMTQxNCw3IEBACiAJCWRldl9wcml2LT5ub19mYmNfcmVhc29uID0gRkJDX0JBRF9QTEFORTsKIAkJZ290byBvdXRfZGlzYWJsZTsKIAl9Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19YKSB7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfWCkgewogCQlEUk1fREVCVUdfS01TKCJmcmFtZWJ1ZmZlciBub3QgdGlsZWQsIGRpc2FibGluZyBjb21wcmVzc2lvblxuIik7CiAJCWRldl9wcml2LT5ub19mYmNfcmVhc29uID0gRkJDX05PVF9USUxFRDsKIAkJZ290byBvdXRfZGlzYWJsZTsKQEAgLTE0MzMsMTQgKzE0MzcsMTMgQEAKIAogaW50CiBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICBib29sIHBpcGVsaW5lZCkKKwkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXUzMiBhbGlnbm1lbnQ7CiAJaW50IHJldDsKIAotCXN3aXRjaCAob2JqX3ByaXYtPnRpbGluZ19tb2RlKSB7CisJc3dpdGNoIChvYmotPnRpbGluZ19tb2RlKSB7CiAJY2FzZSBJOTE1X1RJTElOR19OT05FOgogCQlpZiAoSVNfQlJPQURXQVRFUihkZXYpIHx8IElTX0NSRVNUTElORShkZXYpKQogCQkJYWxpZ25tZW50ID0gMTI4ICogMTAyNDsKQEAgLTE0NjEsNyArMTQ2NCw3IEBACiAJCUJVRygpOwogCX0KIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBhbGlnbm1lbnQpOworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBhbGlnbm1lbnQsIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE0NzQsOSArMTQ3Nyw4IEBACiAJICogZnJhbWVidWZmZXIgY29tcHJlc3Npb24uICBGb3Igc2ltcGxpY2l0eSwgd2UgYWx3YXlzIGluc3RhbGwKIAkgKiBhIGZlbmNlIGFzIHRoZSBjb3N0IGlzIG5vdCB0aGF0IG9uZXJvdXMuCiAJICovCi0JaWYgKG9ial9wcml2LT5mZW5jZV9yZWcgPT0gSTkxNV9GRU5DRV9SRUdfTk9ORSAmJgotCSAgICBvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlX3JlZyhvYmosIGZhbHNlKTsKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2Uob2JqLCBwaXBlbGluZWQsIGZhbHNlKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyX3VucGluOwogCX0KQEAgLTE0OTcsOCArMTQ5OSw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKIAl1bnNpZ25lZCBsb25nIFN0YXJ0LCBPZmZzZXQ7CiAJdTMyIGRzcGNudHI7CkBAIC0xNTE1LDcgKzE1MTYsNiBAQAogCiAJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CiAJb2JqID0gaW50ZWxfZmItPm9iajsKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAKIAlyZWcgPSBEU1BDTlRSKHBsYW5lKTsKIAlkc3BjbnRyID0gSTkxNV9SRUFEKHJlZyk7CkBAIC0xNTQwLDcgKzE1NDAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKLQkJaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQorCQlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQogCQkJZHNwY250ciB8PSBESVNQUExBTkVfVElMRUQ7CiAJCWVsc2UKIAkJCWRzcGNudHIgJj0gfkRJU1BQTEFORV9USUxFRDsKQEAgLTE1NTIsNyArMTU1Miw3IEBACiAKIAlJOTE1X1dSSVRFKHJlZywgZHNwY250cik7CiAKLQlTdGFydCA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCVN0YXJ0ID0gb2JqLT5ndHRfb2Zmc2V0OwogCU9mZnNldCA9IHkgKiBmYi0+cGl0Y2ggKyB4ICogKGZiLT5iaXRzX3Blcl9waXhlbCAvIDgpOwogCiAJRFJNX0RFQlVHX0tNUygiV3JpdGluZyBiYXNlICUwOGxYICUwOGxYICVkICVkICVkXG4iLApAQCAtMTU5OCw3ICsxNTk4LDcgQEAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LAogCQkJCQkgdG9faW50ZWxfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5vYmosCi0JCQkJCSBmYWxzZSk7CisJCQkJCSBOVUxMKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCXJldHVybiByZXQ7CkBAIC0xNjA2LDE4ICsxNjA2LDE3IEBACiAKIAlpZiAob2xkX2ZiKSB7CiAJCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfZnJhbWVidWZmZXIob2xkX2ZiKS0+b2JqOwotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfZnJhbWVidWZmZXIob2xkX2ZiKS0+b2JqOwogCiAJCXdhaXRfZXZlbnQoZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSwKLQkJCSAgIGF0b21pY19yZWFkKCZvYmpfcHJpdi0+cGVuZGluZ19mbGlwKSA9PSAwKTsKKwkJCSAgIGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCkgPT0gMCk7CiAKIAkJLyogQmlnIEhhbW1lciwgd2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBwZW5kaW5nCiAJCSAqIE1JX1dBSVRfRk9SX0VWRU5UIGluc2lkZSBhIHVzZXIgYmF0Y2ggYnVmZmVyIG9uIHRoZQogCQkgKiBjdXJyZW50IHNjYW5vdXQgaXMgcmV0aXJlZCBiZWZvcmUgdW5waW5uaW5nIHRoZSBvbGQKIAkJICogZnJhbWVidWZmZXIuCiAJCSAqLwotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KG9ial9wcml2LCBmYWxzZSk7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHUob2JqLCBmYWxzZSk7CiAJCWlmIChyZXQpIHsKIAkJCWk5MTVfZ2VtX29iamVjdF91bnBpbih0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYiktPm9iaik7CiAJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTE2MzMsOCArMTYzMiwxMCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChvbGRfZmIpCisJaWYgKG9sZF9mYikgeworCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKIAkJaTkxNV9nZW1fb2JqZWN0X3VucGluKHRvX2ludGVsX2ZyYW1lYnVmZmVyKG9sZF9mYiktPm9iaik7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTE5OTYsMzEgKzE5OTcsMzEgQEAKIHN0YXRpYyB2b2lkIGludGVsX2NsZWFyX3NjYW5saW5lX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKIAl1MzIgdG1wOwogCiAJaWYgKElTX0dFTjIoZGV2KSkKIAkJLyogQ2FuJ3QgYnJlYWsgdGhlIGhhbmcgb24gaTh4eCAqLwogCQlyZXR1cm47CiAKLQl0bXAgPSBJOTE1X1JFQUQoUFJCMF9DVEwpOwotCWlmICh0bXAgJiBSSU5HX1dBSVQpIHsKLQkJSTkxNV9XUklURShQUkIwX0NUTCwgdG1wKTsKLQkJUE9TVElOR19SRUFEKFBSQjBfQ1RMKTsKLQl9CisJcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOworCXRtcCA9IEk5MTVfUkVBRF9DVEwocmluZyk7CisJaWYgKHRtcCAmIFJJTkdfV0FJVCkKKwkJSTkxNV9XUklURV9DVEwocmluZywgdG1wKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfY3J0Y193YWl0X2Zvcl9wZW5kaW5nX2ZsaXBzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CiAKIAlpZiAoY3J0Yy0+ZmIgPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyh0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYiktPm9iaik7CisJb2JqID0gdG9faW50ZWxfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5vYmo7CiAJZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwogCXdhaXRfZXZlbnQoZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSwKLQkJICAgYXRvbWljX3JlYWQoJm9ial9wcml2LT5wZW5kaW5nX2ZsaXApID09IDApOworCQkgICBhdG9taWNfcmVhZCgmb2JqLT5wZW5kaW5nX2ZsaXApID09IDApOwogfQogCiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9jcnRjX2VuYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0yODUwLDYgKzI4NTEsMzkgQEAKIAlJTEtfRklGT19MSU5FX1NJWkUKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8gPSB7CisJU05CX0RJU1BMQVlfRklGTywKKwlTTkJfRElTUExBWV9NQVhXTSwKKwlTTkJfRElTUExBWV9ERlRXTSwKKwkyLAorCVNOQl9GSUZPX0xJTkVfU0laRQorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvID0geworCVNOQl9DVVJTT1JfRklGTywKKwlTTkJfQ1VSU09SX01BWFdNLAorCVNOQl9DVVJTT1JfREZUV00sCisJMiwKKwlTTkJfRklGT19MSU5FX1NJWkUKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBzYW5keWJyaWRnZV9kaXNwbGF5X3Nyd21faW5mbyA9IHsKKwlTTkJfRElTUExBWV9TUl9GSUZPLAorCVNOQl9ESVNQTEFZX01BWF9TUldNLAorCVNOQl9ESVNQTEFZX0RGVF9TUldNLAorCTIsCisJU05CX0ZJRk9fTElORV9TSVpFCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfY3Vyc29yX3Nyd21faW5mbyA9IHsKKwlTTkJfQ1VSU09SX1NSX0ZJRk8sCisJU05CX0NVUlNPUl9NQVhfU1JXTSwKKwlTTkJfQ1VSU09SX0RGVF9TUldNLAorCTIsCisJU05CX0ZJRk9fTElORV9TSVpFCit9OworCisKIC8qKgogICogaW50ZWxfY2FsY3VsYXRlX3dtIC0gY2FsY3VsYXRlIHdhdGVybWFyayBsZXZlbAogICogQGNsb2NrX2luX2toejogcGl4ZWwgY2xvY2sKQEAgLTMzODMsMTIgKzM0MTcsMTcgQEAKIAogc3RhdGljIGJvb2wgaXJvbmxha2VfY29tcHV0ZV93bTAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgaW50IHBpcGUsCisJCQkJIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAorCQkJCSBpbnQgZGlzcGxheV9sYXRlbmN5X25zLAorCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yLAorCQkJCSBpbnQgY3Vyc29yX2xhdGVuY3lfbnMsCiAJCQkJIGludCAqcGxhbmVfd20sCiAJCQkJIGludCAqY3Vyc29yX3dtKQogewogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKLQlpbnQgaHRvdGFsLCBoZGlzcGxheSwgY2xvY2ssIHBpeGVsX3NpemUgPSAwOwotCWludCBsaW5lX3RpbWVfdXMsIGxpbmVfY291bnQsIGVudHJpZXM7CisJaW50IGh0b3RhbCwgaGRpc3BsYXksIGNsb2NrLCBwaXhlbF9zaXplOworCWludCBsaW5lX3RpbWVfdXMsIGxpbmVfY291bnQ7CisJaW50IGVudHJpZXMsIHRsYl9taXNzOwogCiAJY3J0YyA9IGludGVsX2dldF9jcnRjX2Zvcl9waXBlKGRldiwgcGlwZSk7CiAJaWYgKGNydGMtPmZiID09IE5VTEwgfHwgIWNydGMtPmVuYWJsZWQpCkBAIC0zNDAwLDM3ICszNDM5LDE0MSBAQAogCXBpeGVsX3NpemUgPSBjcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwgLyA4OwogCiAJLyogVXNlIHRoZSBzbWFsbCBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBwbGFuZSB3YXRlcm1hcmsgKi8KLQllbnRyaWVzID0gKChjbG9jayAqIHBpeGVsX3NpemUgLyAxMDAwKSAqIElMS19MUDBfUExBTkVfTEFURU5DWSkgLyAxMDAwOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywKLQkJCSAgICAgICBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8uY2FjaGVsaW5lX3NpemUpOwotCSpwbGFuZV93bSA9IGVudHJpZXMgKyBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8uZ3VhcmRfc2l6ZTsKLQlpZiAoKnBsYW5lX3dtID4gKGludClpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8ubWF4X3dtKQotCQkqcGxhbmVfd20gPSBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8ubWF4X3dtOworCWVudHJpZXMgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogZGlzcGxheV9sYXRlbmN5X25zKSAvIDEwMDA7CisJdGxiX21pc3MgPSBkaXNwbGF5LT5maWZvX3NpemUqZGlzcGxheS0+Y2FjaGVsaW5lX3NpemUgLSBoZGlzcGxheSAqIDg7CisJaWYgKHRsYl9taXNzID4gMCkKKwkJZW50cmllcyArPSB0bGJfbWlzczsKKwllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKKwkqcGxhbmVfd20gPSBlbnRyaWVzICsgZGlzcGxheS0+Z3VhcmRfc2l6ZTsKKwlpZiAoKnBsYW5lX3dtID4gKGludClkaXNwbGF5LT5tYXhfd20pCisJCSpwbGFuZV93bSA9IGRpc3BsYXktPm1heF93bTsKIAogCS8qIFVzZSB0aGUgbGFyZ2UgYnVmZmVyIG1ldGhvZCB0byBjYWxjdWxhdGUgY3Vyc29yIHdhdGVybWFyayAqLwogCWxpbmVfdGltZV91cyA9ICgoaHRvdGFsICogMTAwMCkgLyBjbG9jayk7Ci0JbGluZV9jb3VudCA9IChJTEtfTFAwX0NVUlNPUl9MQVRFTkNZIC8gbGluZV90aW1lX3VzICsgMTAwMCkgLyAxMDAwOworCWxpbmVfY291bnQgPSAoY3Vyc29yX2xhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKSAvIDEwMDA7CiAJZW50cmllcyA9IGxpbmVfY291bnQgKiA2NCAqIHBpeGVsX3NpemU7Ci0JZW50cmllcyA9IERJVl9ST1VORF9VUChlbnRyaWVzLAotCQkJICAgICAgIGlyb25sYWtlX2N1cnNvcl93bV9pbmZvLmNhY2hlbGluZV9zaXplKTsKLQkqY3Vyc29yX3dtID0gZW50cmllcyArIGlyb25sYWtlX2N1cnNvcl93bV9pbmZvLmd1YXJkX3NpemU7Ci0JaWYgKCpjdXJzb3Jfd20gPiBpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5tYXhfd20pCi0JCSpjdXJzb3Jfd20gPSBpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5tYXhfd207CisJdGxiX21pc3MgPSBjdXJzb3ItPmZpZm9fc2l6ZSpjdXJzb3ItPmNhY2hlbGluZV9zaXplIC0gaGRpc3BsYXkgKiA4OworCWlmICh0bGJfbWlzcyA+IDApCisJCWVudHJpZXMgKz0gdGxiX21pc3M7CisJZW50cmllcyA9IERJVl9ST1VORF9VUChlbnRyaWVzLCBjdXJzb3ItPmNhY2hlbGluZV9zaXplKTsKKwkqY3Vyc29yX3dtID0gZW50cmllcyArIGN1cnNvci0+Z3VhcmRfc2l6ZTsKKwlpZiAoKmN1cnNvcl93bSA+IChpbnQpY3Vyc29yLT5tYXhfd20pCisJCSpjdXJzb3Jfd20gPSAoaW50KWN1cnNvci0+bWF4X3dtOwogCiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiBDaGVjayB0aGUgd20gcmVzdWx0LgorICoKKyAqIElmIGFueSBjYWxjdWxhdGVkIHdhdGVybWFyayB2YWx1ZXMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgdGhhdAorICogY2FuIGJlIHByb2dyYW1tZWQgaW50byB0aGUgYXNzb2NpYXRlZCB3YXRlcm1hcmsgcmVnaXN0ZXIsIHRoYXQgd2F0ZXJtYXJrCisgKiBtdXN0IGJlIGRpc2FibGVkLgorICovCitzdGF0aWMgYm9vbCBpcm9ubGFrZV9jaGVja19zcndtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZlbCwKKwkJCQlpbnQgZmJjX3dtLCBpbnQgZGlzcGxheV93bSwgaW50IGN1cnNvcl93bSwKKwkJCQljb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKKwkJCQljb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlEUk1fREVCVUdfS01TKCJ3YXRlcm1hcmsgJWQ6IGRpc3BsYXkgcGxhbmUgJWQsIGZiYyBsaW5lcyAlZCwiCisJCSAgICAgICIgY3Vyc29yICVkXG4iLCBsZXZlbCwgZGlzcGxheV93bSwgZmJjX3dtLCBjdXJzb3Jfd20pOworCisJaWYgKGZiY193bSA+IFNOQl9GQkNfTUFYX1NSV00pIHsKKwkJRFJNX0RFQlVHX0tNUygiZmJjIHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4iLAorCQkJICAgICAgZmJjX3dtLCBTTkJfRkJDX01BWF9TUldNLCBsZXZlbCk7CisKKwkJLyogZmJjIGhhcyBpdCdzIG93biB3YXkgdG8gZGlzYWJsZSBGQkMgV00gKi8KKwkJSTkxNV9XUklURShESVNQX0FSQl9DVEwsCisJCQkgICBJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKSB8IERJU1BfRkJDX1dNX0RJUyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoZGlzcGxheV93bSA+IGRpc3BsYXktPm1heF93bSkgeworCQlEUk1fREVCVUdfS01TKCJkaXNwbGF5IHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4iLAorCQkJICAgICAgZGlzcGxheV93bSwgU05CX0RJU1BMQVlfTUFYX1NSV00sIGxldmVsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjdXJzb3Jfd20gPiBjdXJzb3ItPm1heF93bSkgeworCQlEUk1fREVCVUdfS01TKCJjdXJzb3Igd2F0ZXJtYXJrKCVkKSBpcyB0b28gbGFyZ2UoJWQpLCBkaXNhYmxpbmcgd20lZCtcbiIsCisJCQkgICAgICBjdXJzb3Jfd20sIFNOQl9DVVJTT1JfTUFYX1NSV00sIGxldmVsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghKGZiY193bSB8fCBkaXNwbGF5X3dtIHx8IGN1cnNvcl93bSkpIHsKKwkJRFJNX0RFQlVHX0tNUygibGF0ZW5jeSAlZCBpcyAwLCBkaXNhYmxpbmcgd20lZCtcbiIsIGxldmVsLCBsZXZlbCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENvbXB1dGUgd2F0ZXJtYXJrIHZhbHVlcyBvZiBXTVsxLTNdLAorICovCitzdGF0aWMgYm9vbCBpcm9ubGFrZV9jb21wdXRlX3Nyd20oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGxldmVsLAorCQkJCSAgaW50IGhkaXNwbGF5LCBpbnQgaHRvdGFsLAorCQkJCSAgaW50IHBpeGVsX3NpemUsIGludCBjbG9jaywgaW50IGxhdGVuY3lfbnMsCisJCQkJICBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpjdXJzb3IsCisJCQkJICBpbnQgKmZiY193bSwgaW50ICpkaXNwbGF5X3dtLCBpbnQgKmN1cnNvcl93bSkKK3sKKworCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3VzOworCWludCBsaW5lX2NvdW50LCBsaW5lX3NpemU7CisJaW50IHNtYWxsLCBsYXJnZTsKKwlpbnQgZW50cmllczsKKworCWlmICghbGF0ZW5jeV9ucykgeworCQkqZmJjX3dtID0gKmRpc3BsYXlfd20gPSAqY3Vyc29yX3dtID0gMDsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWxpbmVfdGltZV91cyA9IChodG90YWwgKiAxMDAwKSAvIGNsb2NrOworCWxpbmVfY291bnQgPSAobGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cyArIDEwMDApIC8gMTAwMDsKKwlsaW5lX3NpemUgPSBoZGlzcGxheSAqIHBpeGVsX3NpemU7CisKKwkvKiBVc2UgdGhlIG1pbmltdW0gb2YgdGhlIHNtYWxsIGFuZCBsYXJnZSBidWZmZXIgbWV0aG9kIGZvciBwcmltYXJ5ICovCisJc21hbGwgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogbGF0ZW5jeV9ucykgLyAxMDAwOworCWxhcmdlID0gbGluZV9jb3VudCAqIGxpbmVfc2l6ZTsKKworCWVudHJpZXMgPSBESVZfUk9VTkRfVVAobWluKHNtYWxsLCBsYXJnZSksIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKKwkqZGlzcGxheV93bSA9IGVudHJpZXMgKyBkaXNwbGF5LT5ndWFyZF9zaXplOworCisJLyoKKwkgKiBTcGVjIHNheXM6CisJICogRkJDIFdNID0gKChGaW5hbCBQcmltYXJ5IFdNICogNjQpIC8gbnVtYmVyIG9mIGJ5dGVzIHBlciBsaW5lKSArIDIKKwkgKi8KKwkqZmJjX3dtID0gRElWX1JPVU5EX1VQKCpkaXNwbGF5X3dtICogNjQsIGxpbmVfc2l6ZSkgKyAyOworCisJLyogY2FsY3VsYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrIGZvciBkaXNwbGF5IGN1cnNvciAqLworCWVudHJpZXMgPSBsaW5lX2NvdW50ICogcGl4ZWxfc2l6ZSAqIDY0OworCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSk7CisJKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7CisKKwlyZXR1cm4gaXJvbmxha2VfY2hlY2tfc3J3bShkZXYsIGxldmVsLAorCQkJCSAgICpmYmNfd20sICpkaXNwbGF5X3dtLCAqY3Vyc29yX3dtLAorCQkJCSAgIGRpc3BsYXksIGN1cnNvcik7Cit9CisKIHN0YXRpYyB2b2lkIGlyb25sYWtlX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICAgIGludCBwbGFuZWFfY2xvY2ssIGludCBwbGFuZWJfY2xvY2ssCi0JCQkgICAgICAgaW50IHNyX2hkaXNwbGF5LCBpbnQgc3JfaHRvdGFsLAorCQkJICAgICAgIGludCBoZGlzcGxheSwgaW50IGh0b3RhbCwKIAkJCSAgICAgICBpbnQgcGl4ZWxfc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBwbGFuZV93bSwgY3Vyc29yX3dtLCBlbmFibGVkOwotCWludCB0bXA7CisJaW50IGZiY193bSwgcGxhbmVfd20sIGN1cnNvcl93bSwgZW5hYmxlZDsKKwlpbnQgY2xvY2s7CiAKIAllbmFibGVkID0gMDsKLQlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMCwKKwkJCQkgJmlyb25sYWtlX2Rpc3BsYXlfd21faW5mbywKKwkJCQkgSUxLX0xQMF9QTEFORV9MQVRFTkNZLAorCQkJCSAmaXJvbmxha2VfY3Vyc29yX3dtX2luZm8sCisJCQkJIElMS19MUDBfQ1VSU09SX0xBVEVOQ1ksCisJCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKIAkJSTkxNV9XUklURShXTTBfUElQRUFfSUxLLAogCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CiAJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBBIC0iCkBAIC0zNDM5LDcgKzM1ODIsMTIgQEAKIAkJZW5hYmxlZCsrOwogCX0KIAotCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDEsICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAxLAorCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAorCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCisJCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKKwkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQl9JTEssCiAJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKIAkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKQEAgLTM0NTIsNTcgKzM2MDAsMTUxIEBACiAJICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgb25seSB3aGVuIG9uZQogCSAqIGRpc3BsYXkgcGxhbmUgaXMgdXNlZC4KIAkgKi8KLQl0bXAgPSAwOwotCWlmIChlbmFibGVkID09IDEgJiYgLyogWFhYIGRpc2FibGVkIGR1ZSB0byBidWdneSBpbXBsbWVudGF0aW9uPyAqLyAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3VzOwotCQlpbnQgc21hbGwsIGxhcmdlLCBwbGFuZV9mYmM7Ci0JCWludCBzcl9jbG9jaywgZW50cmllczsKLQkJaW50IGxpbmVfY291bnQsIGxpbmVfc2l6ZTsKLQkJLyogUmVhZCB0aGUgc2VsZi1yZWZyZXNoIGxhdGVuY3kuIFRoZSB1bml0IGlzIDAuNXVzICovCi0JCWludCBpbGtfc3JfbGF0ZW5jeSA9IEk5MTVfUkVBRChNTFRSX0lMSykgJiBJTEtfU1JMVF9NQVNLOworCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7CisJSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKKwlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOwogCi0JCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwotCQlsaW5lX3RpbWVfdXMgPSAoc3JfaHRvdGFsICogMTAwMCkgLyBzcl9jbG9jazsKKwlpZiAoZW5hYmxlZCAhPSAxKQorCQlyZXR1cm47CiAKLQkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZlIHByZWNpc2lvbiAqLwotCQlsaW5lX2NvdW50ID0gKChpbGtfc3JfbGF0ZW5jeSAqIDUwMCkgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKQotCQkJLyAxMDAwOwotCQlsaW5lX3NpemUgPSBzcl9oZGlzcGxheSAqIHBpeGVsX3NpemU7CisJY2xvY2sgPSBwbGFuZWFfY2xvY2sgPyBwbGFuZWFfY2xvY2sgOiBwbGFuZWJfY2xvY2s7CiAKLQkJLyogVXNlIHRoZSBtaW5pbXVtIG9mIHRoZSBzbWFsbCBhbmQgbGFyZ2UgYnVmZmVyIG1ldGhvZCBmb3IgcHJpbWFyeSAqLwotCQlzbWFsbCA9ICgoc3JfY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiAoaWxrX3NyX2xhdGVuY3kgKiA1MDApKSAvIDEwMDA7Ci0JCWxhcmdlID0gbGluZV9jb3VudCAqIGxpbmVfc2l6ZTsKKwkvKiBXTTEgKi8KKwlpZiAoIWlyb25sYWtlX2NvbXB1dGVfc3J3bShkZXYsIDEsIGhkaXNwbGF5LCBodG90YWwsIHBpeGVsX3NpemUsCisJCQkJICAgY2xvY2ssIElMS19SRUFEX1dNMV9MQVRFTkNZKCkgKiA1MDAsCisJCQkJICAgJmlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvLAorCQkJCSAgICZpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLAorCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCisJCXJldHVybjsKIAotCQllbnRyaWVzID0gRElWX1JPVU5EX1VQKG1pbihzbWFsbCwgbGFyZ2UpLAotCQkJCSAgICAgICBpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CisJSTkxNV9XUklURShXTTFfTFBfSUxLLAorCQkgICBXTTFfTFBfU1JfRU4gfAorCQkgICAoSUxLX1JFQURfV00xX0xBVEVOQ1koKSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAorCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwKKwkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElGVCkgfAorCQkgICBjdXJzb3Jfd20pOwogCi0JCXBsYW5lX2ZiYyA9IGVudHJpZXMgKiA2NDsKLQkJcGxhbmVfZmJjID0gRElWX1JPVU5EX1VQKHBsYW5lX2ZiYywgbGluZV9zaXplKTsKKwkvKiBXTTIgKi8KKwlpZiAoIWlyb25sYWtlX2NvbXB1dGVfc3J3bShkZXYsIDIsIGhkaXNwbGF5LCBodG90YWwsIHBpeGVsX3NpemUsCisJCQkJICAgY2xvY2ssIElMS19SRUFEX1dNMl9MQVRFTkNZKCkgKiA1MDAsCisJCQkJICAgJmlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvLAorCQkJCSAgICZpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLAorCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCisJCXJldHVybjsKIAotCQlwbGFuZV93bSA9IGVudHJpZXMgKyBpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mby5ndWFyZF9zaXplOwotCQlpZiAocGxhbmVfd20gPiAoaW50KWlyb25sYWtlX2Rpc3BsYXlfc3J3bV9pbmZvLm1heF93bSkKLQkJCXBsYW5lX3dtID0gaXJvbmxha2VfZGlzcGxheV9zcndtX2luZm8ubWF4X3dtOworCUk5MTVfV1JJVEUoV00yX0xQX0lMSywKKwkJICAgV00yX0xQX0VOIHwKKwkJICAgKElMS19SRUFEX1dNMl9MQVRFTkNZKCkgPDwgV00xX0xQX0xBVEVOQ1lfU0hJRlQpIHwKKwkJICAgKGZiY193bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8CisJCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKKwkJICAgY3Vyc29yX3dtKTsKIAotCQkvKiBjYWxjdWxhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgZm9yIGRpc3BsYXkgY3Vyc29yICovCi0JCWVudHJpZXMgPSBsaW5lX2NvdW50ICogcGl4ZWxfc2l6ZSAqIDY0OwotCQllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsCi0JCQkJICAgICAgIGlyb25sYWtlX2N1cnNvcl9zcndtX2luZm8uY2FjaGVsaW5lX3NpemUpOworCS8qCisJICogV00zIGlzIHVuc3VwcG9ydGVkIG9uIElMSywgcHJvYmFibHkgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGxhdGVuY3kKKwkgKiBkYXRhIGZvciB0aGF0IHBvd2VyIHN0YXRlCisJICovCit9CiAKLQkJY3Vyc29yX3dtID0gZW50cmllcyArIGlyb25sYWtlX2N1cnNvcl9zcndtX2luZm8uZ3VhcmRfc2l6ZTsKLQkJaWYgKGN1cnNvcl93bSA+IChpbnQpaXJvbmxha2VfY3Vyc29yX3Nyd21faW5mby5tYXhfd20pCi0JCQljdXJzb3Jfd20gPSBpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLm1heF93bTsKK3N0YXRpYyB2b2lkIHNhbmR5YnJpZGdlX3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgIGludCBwbGFuZWFfY2xvY2ssIGludCBwbGFuZWJfY2xvY2ssCisJCQkgICAgICAgaW50IGhkaXNwbGF5LCBpbnQgaHRvdGFsLAorCQkJICAgICAgIGludCBwaXhlbF9zaXplKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGxhdGVuY3kgPSBTTkJfUkVBRF9XTTBfTEFURU5DWSgpICogMTAwOwkvKiBJbiB1bml0IDAuMXVzICovCisJaW50IGZiY193bSwgcGxhbmVfd20sIGN1cnNvcl93bSwgZW5hYmxlZDsKKwlpbnQgY2xvY2s7CiAKLQkJLyogY29uZmlndXJlIHdhdGVybWFyayBhbmQgZW5hYmxlIHNlbGYtcmVmcmVzaCAqLwotCQl0bXAgPSAoV00xX0xQX1NSX0VOIHwKLQkJICAgICAgIChpbGtfc3JfbGF0ZW5jeSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAotCQkgICAgICAgKHBsYW5lX2ZiYyA8PCBXTTFfTFBfRkJDX1NISUZUKSB8Ci0JCSAgICAgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8Ci0JCSAgICAgICBjdXJzb3Jfd20pOwotCQlEUk1fREVCVUdfS01TKCJzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrOiBkaXNwbGF5IHBsYW5lICVkLCBmYmMgbGluZXMgJWQsIgotCQkJICAgICAgIiBjdXJzb3IgJWRcbiIsIHBsYW5lX3dtLCBwbGFuZV9mYmMsIGN1cnNvcl93bSk7CisJZW5hYmxlZCA9IDA7CisJaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMCwKKwkJCQkgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKKwkJCQkgJnNhbmR5YnJpZGdlX2N1cnNvcl93bV9pbmZvLCBsYXRlbmN5LAorCQkJCSAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CisJCUk5MTVfV1JJVEUoV00wX1BJUEVBX0lMSywKKwkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOworCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgorCQkJICAgICAgIiBwbGFuZSAlZCwgIiAiY3Vyc29yOiAlZFxuIiwKKwkJCSAgICAgIHBsYW5lX3dtLCBjdXJzb3Jfd20pOworCQllbmFibGVkKys7CiAJfQotCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgdG1wKTsKLQkvKiBYWFggc2V0dXAgV00yIGFuZCBXTTMgKi8KKworCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDEsCisJCQkJICZzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8sIGxhdGVuY3ksCisJCQkJICZzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbywgbGF0ZW5jeSwKKwkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCQlJOTE1X1dSSVRFKFdNMF9QSVBFQl9JTEssCisJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKKwkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKKwkJCSAgICAgICIgcGxhbmUgJWQsIGN1cnNvcjogJWRcbiIsCisJCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKKwkJZW5hYmxlZCsrOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHNlbGYtcmVmcmVzaCB3YXRlcm1hcmsgb25seSB3aGVuIG9uZQorCSAqIGRpc3BsYXkgcGxhbmUgaXMgdXNlZC4KKwkgKgorCSAqIFNOQiBzdXBwb3J0IDMgbGV2ZWxzIG9mIHdhdGVybWFyay4KKwkgKgorCSAqIFdNMS9XTTIvV00yIHdhdGVybWFya3MgaGF2ZSB0byBiZSBlbmFibGVkIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIsCisJICogYW5kIGRpc2FibGVkIGluIHRoZSBkZXNjZW5kaW5nIG9yZGVyCisJICoKKwkgKi8KKwlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOworCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7CisJSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKKworCWlmIChlbmFibGVkICE9IDEpCisJCXJldHVybjsKKworCWNsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOworCisJLyogV00xICovCisJaWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAxLCBoZGlzcGxheSwgaHRvdGFsLCBwaXhlbF9zaXplLAorCQkJCSAgIGNsb2NrLCBTTkJfUkVBRF9XTTFfTEFURU5DWSgpICogNTAwLAorCQkJCSAgICZzYW5keWJyaWRnZV9kaXNwbGF5X3Nyd21faW5mbywKKwkJCQkgICAmc2FuZHlicmlkZ2VfY3Vyc29yX3Nyd21faW5mbywKKwkJCQkgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFKFdNMV9MUF9JTEssCisJCSAgIFdNMV9MUF9TUl9FTiB8CisJCSAgIChTTkJfUkVBRF9XTTFfTEFURU5DWSgpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CisJCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAorCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8CisJCSAgIGN1cnNvcl93bSk7CisKKwkvKiBXTTIgKi8KKwlpZiAoIWlyb25sYWtlX2NvbXB1dGVfc3J3bShkZXYsIDIsCisJCQkJICAgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKKwkJCQkgICBjbG9jaywgU05CX1JFQURfV00yX0xBVEVOQ1koKSAqIDUwMCwKKwkJCQkgICAmc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8sCisJCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8sCisJCQkJICAgJmZiY193bSwgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkKKwkJcmV0dXJuOworCisJSTkxNV9XUklURShXTTJfTFBfSUxLLAorCQkgICBXTTJfTFBfRU4gfAorCQkgICAoU05CX1JFQURfV00yX0xBVEVOQ1koKSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAorCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwKKwkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElGVCkgfAorCQkgICBjdXJzb3Jfd20pOworCisJLyogV00zICovCisJaWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAzLAorCQkJCSAgIGhkaXNwbGF5LCBodG90YWwsIHBpeGVsX3NpemUsCisJCQkJICAgY2xvY2ssIFNOQl9SRUFEX1dNM19MQVRFTkNZKCkgKiA1MDAsCisJCQkJICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAorCQkJCSAgICZzYW5keWJyaWRnZV9jdXJzb3Jfc3J3bV9pbmZvLAorCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCisJCXJldHVybjsKKworCUk5MTVfV1JJVEUoV00zX0xQX0lMSywKKwkJICAgV00zX0xQX0VOIHwKKwkJICAgKFNOQl9SRUFEX1dNM19MQVRFTkNZKCkgPDwgV00xX0xQX0xBVEVOQ1lfU0hJRlQpIHwKKwkJICAgKGZiY193bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8CisJCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKKwkJICAgY3Vyc29yX3dtKTsKIH0KIAogLyoqCkBAIC0zNTgwLDYgKzM4MjIsMTEgQEAKIAkJCQkgICAgc3JfaGRpc3BsYXksIHNyX2h0b3RhbCwgcGl4ZWxfc2l6ZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wYW5lbF91c2Vfc3NjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlyZXR1cm4gZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYyAmJiBpOTE1X3BhbmVsX3VzZV9zc2M7Cit9CisKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsCkBAIC0zNjQyLDcgKzM4ODksNyBAQAogCQludW1fY29ubmVjdG9ycysrOwogCX0KIAotCWlmIChpc19sdmRzICYmIGRldl9wcml2LT5sdmRzX3VzZV9zc2MgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKSB7CisJaWYgKGlzX2x2ZHMgJiYgaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKSB7CiAJCXJlZmNsayA9IGRldl9wcml2LT5sdmRzX3NzY19mcmVxICogMTAwMDsKIAkJRFJNX0RFQlVHX0tNUygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBNSHpcbiIsCiAJCQkgICAgICByZWZjbGsgLyAxMDAwKTsKQEAgLTM2NjAsNyArMzkwNyw3IEBACiAJICogcmVmY2xrLCBvciBGQUxTRS4gIFRoZSByZXR1cm5lZCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBjbG9jayBlcXVhdGlvbjoKIAkgKiByZWZsY2sgKiAoNSAqIChtMSArIDIpICsgKG0yICsgMikpIC8gKG4gKyAyKSAvIHAxIC8gcDIuCiAJICovCi0JbGltaXQgPSBpbnRlbF9saW1pdChjcnRjKTsKKwlsaW1pdCA9IGludGVsX2xpbWl0KGNydGMsIHJlZmNsayk7CiAJb2sgPSBsaW1pdC0+ZmluZF9wbGwobGltaXQsIGNydGMsIGFkanVzdGVkX21vZGUtPmNsb2NrLCByZWZjbGssICZjbG9jayk7CiAJaWYgKCFvaykgewogCQlEUk1fRVJST1IoIkNvdWxkbid0IGZpbmQgUExMIHNldHRpbmdzIGZvciBtb2RlIVxuIik7CkBAIC0zNzE0LDcgKzM5NjEsNyBAQAogCQlpbnQgbGFuZSA9IDAsIGxpbmtfYncsIGJwcDsKIAkJLyogQ1BVIGVEUCBkb2Vzbid0IHJlcXVpcmUgRkRJIGxpbmssIHNvIGp1c3Qgc2V0IERQIE0vTgogCQkgICBhY2NvcmRpbmcgdG8gY3VycmVudCBsaW5rIGNvbmZpZyAqLwotCQlpZiAoaGFzX2VkcF9lbmNvZGVyICYmICFpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmVuY29kZXItPmJhc2UpKSB7CisJCWlmIChoYXNfZWRwX2VuY29kZXIgJiYgIWludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewogCQkJdGFyZ2V0X2Nsb2NrID0gbW9kZS0+Y2xvY2s7CiAJCQlpbnRlbF9lZHBfbGlua19jb25maWcoaGFzX2VkcF9lbmNvZGVyLAogCQkJCQkgICAgICAmbGFuZSwgJmxpbmtfYncpOwpAQCAtMzgxNyw3ICs0MDY0LDcgQEAKIAkJdWRlbGF5KDIwMCk7CiAKIAkJaWYgKGhhc19lZHBfZW5jb2RlcikgewotCQkJaWYgKGRldl9wcml2LT5sdmRzX3VzZV9zc2MpIHsKKwkJCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgewogCQkJCXRlbXAgfD0gRFJFRl9TU0MxX0VOQUJMRTsKIAkJCQlJOTE1X1dSSVRFKFBDSF9EUkVGX0NPTlRST0wsIHRlbXApOwogCkBAIC0zODI4LDEzICs0MDc1LDEzIEBACiAKIAkJCS8qIEVuYWJsZSBDUFUgc291cmNlIG9uIENQVSBhdHRhY2hlZCBlRFAgKi8KIAkJCWlmICghaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7Ci0JCQkJaWYgKGRldl9wcml2LT5sdmRzX3VzZV9zc2MpCisJCQkJaWYgKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpKQogCQkJCQl0ZW1wIHw9IERSRUZfQ1BVX1NPVVJDRV9PVVRQVVRfRE9XTlNQUkVBRDsKIAkJCQllbHNlCiAJCQkJCXRlbXAgfD0gRFJFRl9DUFVfU09VUkNFX09VVFBVVF9OT05TUFJFQUQ7CiAJCQl9IGVsc2UgewogCQkJCS8qIEVuYWJsZSBTU0Mgb24gUENIIGVEUCBpZiBuZWVkZWQgKi8KLQkJCQlpZiAoZGV2X3ByaXYtPmx2ZHNfdXNlX3NzYykgeworCQkJCWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgewogCQkJCQlEUk1fRVJST1IoImVuYWJsaW5nIFNTQyBvbiBQQ0hcbiIpOwogCQkJCQl0ZW1wIHw9IERSRUZfU1VQRVJTUFJFQURfU09VUkNFX0VOQUJMRTsKIAkJCQl9CkBAIC0zODU3LDYgKzQxMDQsMjIgQEAKIAkJCQlyZWR1Y2VkX2Nsb2NrLm0yOwogCX0KIAorCS8qIEVuYWJsZSBhdXRvdHVuaW5nIG9mIHRoZSBQTEwgY2xvY2sgKGlmIHBlcm1pc3NpYmxlKSAqLworCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJaW50IGZhY3RvciA9IDIxOworCisJCWlmIChpc19sdmRzKSB7CisJCQlpZiAoKGludGVsX3BhbmVsX3VzZV9zc2MoZGV2X3ByaXYpICYmCisJCQkgICAgIGRldl9wcml2LT5sdmRzX3NzY19mcmVxID09IDEwMCkgfHwKKwkJCSAgICAoSTkxNV9SRUFEKFBDSF9MVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PSBMVkRTX0NMS0JfUE9XRVJfVVApCisJCQkJZmFjdG9yID0gMjU7CisJCX0gZWxzZSBpZiAoaXNfc2R2byAmJiBpc190dikKKwkJCWZhY3RvciA9IDIwOworCisJCWlmIChjbG9jay5tMSA8IGZhY3RvciAqIGNsb2NrLm4pCisJCQlmcCB8PSBGUF9DQl9UVU5FOworCX0KKwogCWRwbGwgPSAwOwogCWlmICghSEFTX1BDSF9TUExJVChkZXYpKQogCQlkcGxsID0gRFBMTF9WR0FfTU9ERV9ESVM7CkBAIC0zOTI1LDcgKzQxODgsNyBAQAogCQkvKiBYWFg6IGp1c3QgbWF0Y2hpbmcgQklPUyBmb3Igbm93ICovCiAJCS8qCWRwbGwgfD0gUExMX1JFRl9JTlBVVF9UVkNMS0lOQkM7ICovCiAJCWRwbGwgfD0gMzsKLQllbHNlIGlmIChpc19sdmRzICYmIGRldl9wcml2LT5sdmRzX3VzZV9zc2MgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKQorCWVsc2UgaWYgKGlzX2x2ZHMgJiYgaW50ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKQogCQlkcGxsIHw9IFBMTEJfUkVGX0lOUFVUX1NQUkVBRFNQRUNUUlVNSU47CiAJZWxzZQogCQlkcGxsIHw9IFBMTF9SRUZfSU5QVVRfRFJFRkNMSzsKQEAgLTQwNzEsNyArNDMzNCw2IEBACiAJfQogCiAJaWYgKCFoYXNfZWRwX2VuY29kZXIgfHwgaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7Ci0JCUk5MTVfV1JJVEUoZnBfcmVnLCBmcCk7CiAJCUk5MTVfV1JJVEUoZHBsbF9yZWcsIGRwbGwpOwogCiAJCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLwpAQCAtNDA4OSwxMyArNDM1MSwxMyBAQAogCQkJfQogCQkJSTkxNV9XUklURShEUExMX01EKHBpcGUpLCB0ZW1wKTsKIAkJfSBlbHNlIHsKLQkJCS8qIHdyaXRlIGl0IGFnYWluIC0tIHRoZSBCSU9TIGRvZXMsIGFmdGVyIGFsbCAqLworCQkJLyogVGhlIHBpeGVsIG11bHRpcGxpZXIgY2FuIG9ubHkgYmUgdXBkYXRlZCBvbmNlIHRoZQorCQkJICogRFBMTCBpcyBlbmFibGVkIGFuZCB0aGUgY2xvY2tzIGFyZSBzdGFibGUuCisJCQkgKgorCQkJICogU28gd3JpdGUgaXQgYWdhaW4uCisJCQkgKi8KIAkJCUk5MTVfV1JJVEUoZHBsbF9yZWcsIGRwbGwpOwogCQl9Ci0KLQkJLyogV2FpdCBmb3IgdGhlIGNsb2NrcyB0byBzdGFiaWxpemUuICovCi0JCVBPU1RJTkdfUkVBRChkcGxsX3JlZyk7Ci0JCXVkZWxheSgxNTApOwogCX0KIAogCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSBmYWxzZTsKQEAgLTQzMzEsMTUgKzQ1OTMsMTQgQEAKIH0KIAogc3RhdGljIGludCBpbnRlbF9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlLAogCQkJCSB1aW50MzJfdCBoYW5kbGUsCiAJCQkJIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmJvOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXVpbnQzMl90IGFkZHI7CiAJaW50IHJldDsKIApAQCAtNDM0OSw3ICs0NjEwLDcgQEAKIAlpZiAoIWhhbmRsZSkgewogCQlEUk1fREVCVUdfS01TKCJjdXJzb3Igb2ZmXG4iKTsKIAkJYWRkciA9IDA7Ci0JCWJvID0gTlVMTDsKKwkJb2JqID0gTlVMTDsKIAkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlnb3RvIGZpbmlzaDsKIAl9CkBAIC00MzYwLDEzICs0NjIxLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWJvID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBoYW5kbGUpOwotCWlmICghYm8pCisJb2JqID0gdG9faW50ZWxfYm8oZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgaGFuZGxlKSk7CisJaWYgKCFvYmopCiAJCXJldHVybiAtRU5PRU5UOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhibyk7Ci0KLQlpZiAoYm8tPnNpemUgPCB3aWR0aCAqIGhlaWdodCAqIDQpIHsKKwlpZiAob2JqLT5iYXNlLnNpemUgPCB3aWR0aCAqIGhlaWdodCAqIDQpIHsKIAkJRFJNX0VSUk9SKCJidWZmZXIgaXMgdG8gc21hbGxcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CkBAIC00Mzc1LDI5ICs0NjM0LDQxIEBACiAJLyogd2Ugb25seSBuZWVkIHRvIHBpbiBpbnNpZGUgR1RUIGlmIGN1cnNvciBpcyBub24tcGh5ICovCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmICghZGV2X3ByaXYtPmluZm8tPmN1cnNvcl9uZWVkc19waHlzaWNhbCkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGJvLCBQQUdFX1NJWkUpOworCQlpZiAob2JqLT50aWxpbmdfbW9kZSkgeworCQkJRFJNX0VSUk9SKCJjdXJzb3IgY2Fubm90IGJlIHRpbGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWxfbG9ja2VkOworCQl9CisKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIFBBR0VfU0laRSwgdHJ1ZSk7CiAJCWlmIChyZXQpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBjdXJzb3IgYm9cbiIpOwogCQkJZ290byBmYWlsX2xvY2tlZDsKIAkJfQogCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihibywgMCk7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIDApOwogCQlpZiAocmV0KSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtb3ZlIGN1cnNvciBibyBpbnRvIHRoZSBHVFRcbiIpOwogCQkJZ290byBmYWlsX3VucGluOwogCQl9CiAKLQkJYWRkciA9IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1vdmUgY3Vyc29yIGJvIGludG8gdGhlIEdUVFxuIik7CisJCQlnb3RvIGZhaWxfdW5waW47CisJCX0KKworCQlhZGRyID0gb2JqLT5ndHRfb2Zmc2V0OwogCX0gZWxzZSB7CiAJCWludCBhbGlnbiA9IElTX0k4MzAoZGV2KSA/IDE2ICogMTAyNCA6IDI1NjsKLQkJcmV0ID0gaTkxNV9nZW1fYXR0YWNoX3BoeXNfb2JqZWN0KGRldiwgYm8sCisJCXJldCA9IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChkZXYsIG9iaiwKIAkJCQkJCSAgKGludGVsX2NydGMtPnBpcGUgPT0gMCkgPyBJOTE1X0dFTV9QSFlTX0NVUlNPUl8wIDogSTkxNV9HRU1fUEhZU19DVVJTT1JfMSwKIAkJCQkJCSAgYWxpZ24pOwogCQlpZiAocmV0KSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBhdHRhY2ggcGh5cyBvYmplY3RcbiIpOwogCQkJZ290byBmYWlsX2xvY2tlZDsKIAkJfQotCQlhZGRyID0gb2JqX3ByaXYtPnBoeXNfb2JqLT5oYW5kbGUtPmJ1c2FkZHI7CisJCWFkZHIgPSBvYmotPnBoeXNfb2JqLT5oYW5kbGUtPmJ1c2FkZHI7CiAJfQogCiAJaWYgKElTX0dFTjIoZGV2KSkKQEAgLTQ0MDYsMTcgKzQ2NzcsMTcgQEAKICBmaW5pc2g6CiAJaWYgKGludGVsX2NydGMtPmN1cnNvcl9ibykgewogCQlpZiAoZGV2X3ByaXYtPmluZm8tPmN1cnNvcl9uZWVkc19waHlzaWNhbCkgewotCQkJaWYgKGludGVsX2NydGMtPmN1cnNvcl9ibyAhPSBibykKKwkJCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfYm8gIT0gb2JqKQogCQkJCWk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChkZXYsIGludGVsX2NydGMtPmN1cnNvcl9ibyk7CiAJCX0gZWxzZQogCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKGludGVsX2NydGMtPmN1cnNvcl9ibyk7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGludGVsX2NydGMtPmN1cnNvcl9ibyk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZpbnRlbF9jcnRjLT5jdXJzb3JfYm8tPmJhc2UpOwogCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHIgPSBhZGRyOwotCWludGVsX2NydGMtPmN1cnNvcl9ibyA9IGJvOworCWludGVsX2NydGMtPmN1cnNvcl9ibyA9IG9iajsKIAlpbnRlbF9jcnRjLT5jdXJzb3Jfd2lkdGggPSB3aWR0aDsKIAlpbnRlbF9jcnRjLT5jdXJzb3JfaGVpZ2h0ID0gaGVpZ2h0OwogCkBAIC00NDI0LDExICs0Njk1LDExIEBACiAKIAlyZXR1cm4gMDsKIGZhaWxfdW5waW46Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluKGJvKTsKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIGZhaWxfbG9ja2VkOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogZmFpbDoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChibyk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJm9iai0+YmFzZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDczOSw4ICs1MDEwLDE0IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWRldl9wcml2LT5idXN5ID0gZmFsc2U7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpKSB7CisJCS8qIFN0aWxsIHByb2Nlc3NpbmcgcmVxdWVzdHMsIHNvIGp1c3QgcmUtYXJtIHRoZSB0aW1lci4gKi8KKwkJbW9kX3RpbWVyKCZkZXZfcHJpdi0+aWRsZV90aW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoR1BVX0lETEVfVElNRU9VVCkpOworCQlyZXR1cm47CisJfQogCisJZGV2X3ByaXYtPmJ1c3kgPSBmYWxzZTsKIAlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5pZGxlX3dvcmspOwogfQogCkBAIC00NzUxLDkgKzUwMjgsMTcgQEAKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IChzdHJ1Y3QgaW50ZWxfY3J0YyAqKWFyZzsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSAmaW50ZWxfY3J0Yy0+YmFzZTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOworCisJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYik7CisJaWYgKGludGVsX2ZiICYmIGludGVsX2ZiLT5vYmotPmFjdGl2ZSkgeworCQkvKiBUaGUgZnJhbWVidWZmZXIgaXMgc3RpbGwgYmVpbmcgYWNjZXNzZWQgYnkgdGhlIEdQVS4gKi8KKwkJbW9kX3RpbWVyKCZpbnRlbF9jcnRjLT5pZGxlX3RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhDUlRDX0lETEVfVElNRU9VVCkpOworCQlyZXR1cm47CisJfQogCiAJaW50ZWxfY3J0Yy0+YnVzeSA9IGZhbHNlOwotCiAJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+aWRsZV93b3JrKTsKIH0KIApAQCAtNDc2Myw4ICs1MDQ4LDggQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwotCWludCBkcGxsX3JlZyA9IChwaXBlID09IDApID8gRFBMTF9BIDogRFBMTF9COwotCWludCBkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwlpbnQgZHBsbF9yZWcgPSBEUExMKHBpcGUpOworCWludCBkcGxsOwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKIAkJcmV0dXJuOwpAQCAtNDc3MiwxNyArNTA1NywxOSBAQAogCWlmICghZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrX2F2YWlsKQogCQlyZXR1cm47CiAKKwlkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKIAlpZiAoIUhBU19QSVBFX0NYU1IoZGV2KSAmJiAoZHBsbCAmIERJU1BMQVlfUkFURV9TRUxFQ1RfRlBBMSkpIHsKIAkJRFJNX0RFQlVHX0RSSVZFUigidXBjbG9ja2luZyBMVkRTXG4iKTsKIAogCQkvKiBVbmxvY2sgcGFuZWwgcmVncyAqLwotCQlJOTE1X1dSSVRFKFBQX0NPTlRST0wsIEk5MTVfUkVBRChQUF9DT05UUk9MKSB8Ci0JCQkgICBQQU5FTF9VTkxPQ0tfUkVHUyk7CisJCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwKKwkJCSAgIEk5MTVfUkVBRChQUF9DT05UUk9MKSB8IFBBTkVMX1VOTE9DS19SRUdTKTsKIAogCQlkcGxsICY9IH5ESVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTE7CiAJCUk5MTVfV1JJVEUoZHBsbF9yZWcsIGRwbGwpOwotCQlkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKKwkJUE9TVElOR19SRUFEKGRwbGxfcmVnKTsKIAkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgcGlwZSk7CisKIAkJZHBsbCA9IEk5MTVfUkVBRChkcGxsX3JlZyk7CiAJCWlmIChkcGxsICYgRElTUExBWV9SQVRFX1NFTEVDVF9GUEExKQogCQkJRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRvIHVwY2xvY2sgTFZEUyFcbiIpOwpAQCAtNDg4OCw3ICs1MTc1LDcgQEAKICAqIGJ1ZmZlciksIHdlJ2xsIGFsc28gbWFyayB0aGUgZGlzcGxheSBhcyBidXN5LCBzbyB3ZSBrbm93IHRvIGluY3JlYXNlIGl0cwogICogY2xvY2sgZnJlcXVlbmN5LgogICovCi12b2lkIGludGVsX21hcmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3ZvaWQgaW50ZWxfbWFya19idXN5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gTlVMTDsKQEAgLTQ5NjksOCArNTI1Niw5IEBACiAKIAltdXRleF9sb2NrKCZ3b3JrLT5kZXYtPnN0cnVjdF9tdXRleCk7CiAJaTkxNV9nZW1fb2JqZWN0X3VucGluKHdvcmstPm9sZF9mYl9vYmopOwotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHdvcmstPnBlbmRpbmdfZmxpcF9vYmopOwotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHdvcmstPm9sZF9mYl9vYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqLT5iYXNlKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7CisKIAltdXRleF91bmxvY2soJndvcmstPmRldi0+c3RydWN0X211dGV4KTsKIAlrZnJlZSh3b3JrKTsKIH0KQEAgLTQ5ODEsMTUgKzUyNjksMTcgQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX3VucGluX3dvcmsgKndvcms7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZTsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3RydWN0IHRpbWV2YWwgdG5vdywgdHZibDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogSWdub3JlIGVhcmx5IHZibGFuayBpcnFzICovCiAJaWYgKGludGVsX2NydGMgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJZG9fZ2V0dGltZW9mZGF5KCZ0bm93KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAl3b3JrID0gaW50ZWxfY3J0Yy0+dW5waW5fd29yazsKIAlpZiAod29yayA9PSBOVUxMIHx8ICF3b3JrLT5wZW5kaW5nKSB7CkBAIC00OTk4LDI2ICs1Mjg4LDQ5IEBACiAJfQogCiAJaW50ZWxfY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7Ci0JZHJtX3ZibGFua19wdXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKIAogCWlmICh3b3JrLT5ldmVudCkgewogCQllID0gd29yay0+ZXZlbnQ7Ci0JCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQkJZS0+ZXZlbnQuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7Ci0JCWUtPmV2ZW50LnR2X3NlYyA9IG5vdy50dl9zZWM7Ci0JCWUtPmV2ZW50LnR2X3VzZWMgPSBub3cudHZfdXNlYzsKKwkJZS0+ZXZlbnQuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSwgJnR2YmwpOworCisJCS8qIENhbGxlZCBiZWZvcmUgdmJsYW5rIGNvdW50IGFuZCB0aW1lc3RhbXBzIGhhdmUKKwkJICogYmVlbiB1cGRhdGVkIGZvciB0aGUgdmJsYW5rIGludGVydmFsIG9mIGZsaXAKKwkJICogY29tcGxldGlvbj8gTmVlZCB0byBpbmNyZW1lbnQgdmJsYW5rIGNvdW50IGFuZAorCQkgKiBhZGQgb25lIHZpZGVvcmVmcmVzaCBkdXJhdGlvbiB0byByZXR1cm5lZCB0aW1lc3RhbXAKKwkJICogdG8gYWNjb3VudCBmb3IgdGhpcy4gV2UgYXNzdW1lIHRoaXMgaGFwcGVuZWQgaWYgd2UKKwkJICogZ2V0IGNhbGxlZCBvdmVyIDAuOSBmcmFtZSBkdXJhdGlvbnMgYWZ0ZXIgdGhlIGxhc3QKKwkJICogdGltZXN0YW1wZWQgdmJsYW5rLgorCQkgKgorCQkgKiBUaGlzIGNhbGN1bGF0aW9uIGNhbiBub3QgYmUgdXNlZCB3aXRoIHZyZWZyZXNoIHJhdGVzCisJCSAqIGJlbG93IDVIeiAoMTBIeiB0byBiZSBvbiB0aGUgc2FmZSBzaWRlKSB3aXRob3V0CisJCSAqIHByb21vdGluZyB0byA2NCBpbnRlZ2Vycy4KKwkJICovCisJCWlmICgxMCAqICh0aW1ldmFsX3RvX25zKCZ0bm93KSAtIHRpbWV2YWxfdG9fbnMoJnR2YmwpKSA+CisJCSAgICA5ICogY3J0Yy0+ZnJhbWVkdXJfbnMpIHsKKwkJCWUtPmV2ZW50LnNlcXVlbmNlKys7CisJCQl0dmJsID0gbnNfdG9fdGltZXZhbCh0aW1ldmFsX3RvX25zKCZ0dmJsKSArCisJCQkJCSAgICAgY3J0Yy0+ZnJhbWVkdXJfbnMpOworCQl9CisKKwkJZS0+ZXZlbnQudHZfc2VjID0gdHZibC50dl9zZWM7CisJCWUtPmV2ZW50LnR2X3VzZWMgPSB0dmJsLnR2X3VzZWM7CisKIAkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLAogCQkJICAgICAgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CiAJfQogCisJZHJtX3ZibGFua19wdXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyh3b3JrLT5vbGRfZmJfb2JqKTsKKwlvYmogPSB3b3JrLT5vbGRfZmJfb2JqOworCiAJYXRvbWljX2NsZWFyX21hc2soMSA8PCBpbnRlbF9jcnRjLT5wbGFuZSwKLQkJCSAgJm9ial9wcml2LT5wZW5kaW5nX2ZsaXAuY291bnRlcik7Ci0JaWYgKGF0b21pY19yZWFkKCZvYmpfcHJpdi0+cGVuZGluZ19mbGlwKSA9PSAwKQorCQkJICAmb2JqLT5wZW5kaW5nX2ZsaXAuY291bnRlcik7CisJaWYgKGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCkgPT0gMCkKIAkJd2FrZV91cCgmZGV2X3ByaXYtPnBlbmRpbmdfZmxpcF9xdWV1ZSk7CisKIAlzY2hlZHVsZV93b3JrKCZ3b3JrLT53b3JrKTsKIAogCXRyYWNlX2k5MTVfZmxpcF9jb21wbGV0ZShpbnRlbF9jcnRjLT5wbGFuZSwgd29yay0+cGVuZGluZ19mbGlwX29iaik7CkBAIC01MDYzLDggKzUzNzYsNyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayAqd29yazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBvZmZzZXQ7CkBAIC01MDk4LDEzICs1NDEwLDEzIEBACiAJb2JqID0gaW50ZWxfZmItPm9iajsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwgdHJ1ZSk7CisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIExQX1JJTkcoZGV2X3ByaXYpKTsKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfd29yazsKIAogCS8qIFJlZmVyZW5jZSB0aGUgb2JqZWN0cyBmb3IgdGhlIHNjaGVkdWxlZCB3b3JrLiAqLwotCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSh3b3JrLT5vbGRfZmJfb2JqKTsKLQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJndvcmstPm9sZF9mYl9vYmotPmJhc2UpOworCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAogCWNydGMtPmZiID0gZmI7CiAKQEAgLTUxMTIsMjIgKzU0MjQsMTYgQEAKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfb2JqczsKIAotCS8qIEJsb2NrIGNsaWVudHMgZnJvbSByZW5kZXJpbmcgdG8gdGhlIG5ldyBiYWNrIGJ1ZmZlciB1bnRpbAotCSAqIHRoZSBmbGlwIG9jY3VycyBhbmQgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgdmlzaWJsZS4KLQkgKi8KLQlhdG9taWNfYWRkKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsCi0JCSAgICZ0b19pbnRlbF9ibyh3b3JrLT5vbGRfZmJfb2JqKS0+cGVuZGluZ19mbGlwKTsKLQotCXdvcmstPnBlbmRpbmdfZmxpcF9vYmogPSBvYmo7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCiAJaWYgKElTX0dFTjMoZGV2KSB8fCBJU19HRU4yKGRldikpIHsKIAkJdTMyIGZsaXBfbWFzazsKIAogCQkvKiBDYW4ndCBxdWV1ZSBtdWx0aXBsZSBmbGlwcywgc28gd2FpdCBmb3IgdGhlIHByZXZpb3VzCiAJCSAqIG9uZSB0byBmaW5pc2ggYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dC4KIAkJICovCi0JCUJFR0lOX0xQX1JJTkcoMik7CisJCXJldCA9IEJFR0lOX0xQX1JJTkcoMik7CisJCWlmIChyZXQpCisJCQlnb3RvIGNsZWFudXBfb2JqczsKKwogCQlpZiAoaW50ZWxfY3J0Yy0+cGxhbmUpCiAJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7CiAJCWVsc2UKQEAgLTUxMzcsMTggKzU0NDMsMjggQEAKIAkJQURWQU5DRV9MUF9SSU5HKCk7CiAJfQogCisJd29yay0+cGVuZGluZ19mbGlwX29iaiA9IG9iajsKKwogCXdvcmstPmVuYWJsZV9zdGFsbF9jaGVjayA9IHRydWU7CiAKIAkvKiBPZmZzZXQgaW50byB0aGUgbmV3IGJ1ZmZlciBmb3IgY2FzZXMgb2Ygc2hhcmVkIGZicyBiZXR3ZWVuIENSVENzICovCiAJb2Zmc2V0ID0gY3J0Yy0+eSAqIGZiLT5waXRjaCArIGNydGMtPnggKiBmYi0+Yml0c19wZXJfcGl4ZWwvODsKIAotCUJFR0lOX0xQX1JJTkcoNCk7Ci0Jc3dpdGNoKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJcmV0ID0gQkVHSU5fTFBfUklORyg0KTsKKwlpZiAocmV0KQorCQlnb3RvIGNsZWFudXBfb2JqczsKKworCS8qIEJsb2NrIGNsaWVudHMgZnJvbSByZW5kZXJpbmcgdG8gdGhlIG5ldyBiYWNrIGJ1ZmZlciB1bnRpbAorCSAqIHRoZSBmbGlwIG9jY3VycyBhbmQgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgdmlzaWJsZS4KKwkgKi8KKwlhdG9taWNfYWRkKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsICZ3b3JrLT5vbGRfZmJfb2JqLT5wZW5kaW5nX2ZsaXApOworCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewogCWNhc2UgMjoKIAkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKIAkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKIAkJT1VUX1JJTkcoZmItPnBpdGNoKTsKLQkJT1VUX1JJTkcob2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvZmZzZXQpOworCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOwogCQlPVVRfUklORyhNSV9OT09QKTsKIAkJYnJlYWs7CiAKQEAgLTUxNTYsNyArNTQ3Miw3IEBACiAJCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUF9JOTE1IHwKIAkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKIAkJT1VUX1JJTkcoZmItPnBpdGNoKTsKLQkJT1VUX1JJTkcob2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvZmZzZXQpOworCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOwogCQlPVVRfUklORyhNSV9OT09QKTsKIAkJYnJlYWs7CiAKQEAgLTUxNjksNyArNTQ4NSw3IEBACiAJCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CiAJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CiAJCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9ial9wcml2LT5ndHRfb2Zmc2V0IHwgb2JqX3ByaXYtPnRpbGluZ19tb2RlKTsKKwkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0IHwgb2JqLT50aWxpbmdfbW9kZSk7CiAKIAkJLyogWFhYIEVuYWJsaW5nIHRoZSBwYW5lbC1maXR0ZXIgYWNyb3NzIHBhZ2UtZmxpcCBpcyBzbyBmYXIKIAkJICogdW50ZXN0ZWQgb24gbm9uLW5hdGl2ZSBtb2Rlcywgc28gaWdub3JlIGl0IGZvciBub3cuCkBAIC01MTgzLDggKzU0OTksOCBAQAogCWNhc2UgNjoKIAkJT1VUX1JJTkcoTUlfRElTUExBWV9GTElQIHwKIAkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKLQkJT1VUX1JJTkcoZmItPnBpdGNoIHwgb2JqX3ByaXYtPnRpbGluZ19tb2RlKTsKLQkJT1VUX1JJTkcob2JqX3ByaXYtPmd0dF9vZmZzZXQpOworCQlPVVRfUklORyhmYi0+cGl0Y2ggfCBvYmotPnRpbGluZ19tb2RlKTsKKwkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0KTsKIAogCQlwZiA9IEk5MTVfUkVBRChwaXBlID09IDAgPyBQRkFfQ1RMXzEgOiBQRkJfQ1RMXzEpICYgUEZfRU5BQkxFOwogCQlwaXBlc3JjID0gSTkxNV9SRUFEKHBpcGUgPT0gMCA/IFBJUEVBU1JDIDogUElQRUJTUkMpICYgMHgwZmZmMGZmZjsKQEAgLTUyMDAsOCArNTUxNiw4IEBACiAJcmV0dXJuIDA7CiAKIGNsZWFudXBfb2JqczoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSh3b3JrLT5vbGRfZmJfb2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5iYXNlKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIGNsZWFudXBfd29yazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtNTMzOCw3ICs1NjU0LDcgQEAKIH0KIAogaW50IGludGVsX2dldF9waXBlX2Zyb21fY3J0Y19pZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2V0X3BpcGVfZnJvbV9jcnRjX2lkICpwaXBlX2Zyb21fY3J0Y19pZCA9IGRhdGE7CkBAIC01NDk4LDYgKzU4MTQsOCBAQAogCQllbmNvZGVyLT5iYXNlLnBvc3NpYmxlX2Nsb25lcyA9CiAJCQlpbnRlbF9lbmNvZGVyX2Nsb25lcyhkZXYsIGVuY29kZXItPmNsb25lX21hc2spOwogCX0KKworCWludGVsX3BhbmVsX3NldHVwX2JhY2tsaWdodChkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3koc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCkBAIC01NTA1LDE5ICs1ODIzLDE5IEBACiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKIAogCWRybV9mcmFtZWJ1ZmZlcl9jbGVhbnVwKGZiKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChpbnRlbF9mYi0+b2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmaW50ZWxfZmItPm9iai0+YmFzZSk7CiAKIAlrZnJlZShpbnRlbF9mYik7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGVfaGFuZGxlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAotCQkJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCiAJCQkJCQl1bnNpZ25lZCBpbnQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqZWN0ID0gaW50ZWxfZmItPm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAotCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZV9wcml2LCBvYmplY3QsIGhhbmRsZSk7CisJcmV0dXJuIGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlLCAmb2JqLT5iYXNlLCBoYW5kbGUpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBpbnRlbF9mYl9mdW5jcyA9IHsKQEAgLTU1MjgsMTIgKzU4NDYsMTEgQEAKIGludCBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiLAogCQkJICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQsCi0JCQkgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKKwkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlpbnQgcmV0OwogCi0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG1vZGVfY21kLT5waXRjaCAmIDYzKQpAQCAtNTU2NSwxMSArNTg4MiwxMSBAQAogCQkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxwLAogCQkJICAgICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQpCiB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2ZiOwogCWludCByZXQ7CiAKLQlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxwLCBtb2RlX2NtZC0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxwLCBtb2RlX2NtZC0+aGFuZGxlKSk7CiAJaWYgKCFvYmopCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCkBAIC01NTc3LDEwICs1ODk0LDkgQEAKIAlpZiAoIWludGVsX2ZiKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXJldCA9IGludGVsX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCBpbnRlbF9mYiwKLQkJCQkgICAgIG1vZGVfY21kLCBvYmopOworCXJldCA9IGludGVsX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCBpbnRlbF9mYiwgbW9kZV9jbWQsIG9iaik7CiAJaWYgKHJldCkgewotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChvYmopOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmb2JqLT5iYXNlKTsKIAkJa2ZyZWUoaW50ZWxfZmIpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KQEAgLTU1OTMsMTAgKzU5MDksMTAgQEAKIAkub3V0cHV0X3BvbGxfY2hhbmdlZCA9IGludGVsX2ZiX291dHB1dF9wb2xsX2NoYW5nZWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCiBpbnRlbF9hbGxvY19jb250ZXh0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN0eDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqY3R4OwogCWludCByZXQ7CiAKIAljdHggPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCA0MDk2KTsKQEAgLTU2MDYsNyArNTkyMiw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4oY3R4LCA0MDk2KTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGN0eCwgNDA5NiwgdHJ1ZSk7CiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gcG93ZXIgY29udGV4dDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX3VucmVmOwpAQCAtNTYyNCw3ICs1OTQwLDcgQEAKIGVycl91bnBpbjoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4oY3R4KTsKIGVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShjdHgpOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZjdHgtPmJhc2UpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNTczNiw2ICs2MDUyLDI1IEBACiAKIH0KIAordm9pZCBnZW42X3NldF9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggdmFsKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHN3cmVxOworCisJc3dyZXEgPSAodmFsICYgMHgzZmYpIDw8IDI1OworCUk5MTVfV1JJVEUoR0VONl9SUE5TV1JFUSwgc3dyZXEpOworfQorCit2b2lkIGdlbjZfZGlzYWJsZV9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJSTkxNV9XUklURShHRU42X1JQTlNXUkVRLCAxIDw8IDMxKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JTlRSTVNLLCAweGZmZmZmZmZmKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JRVIsIDApOworCUk5MTVfV1JJVEUoR0VONl9QTUlJUiwgSTkxNV9SRUFEKEdFTjZfUE1JSVIpKTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfcHhmcmVxKHUzMiB2aWRmcmVxKQogewogCXVuc2lnbmVkIGxvbmcgZnJlcTsKQEAgLTU4MjIsNyArNjE1NywxMjMgQEAKIAlkZXZfcHJpdi0+Y29yciA9IChsY2Z1c2UgJiBMQ0ZVU0VfSElWX01BU0spOwogfQogCi12b2lkIGludGVsX2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkIGdlbjZfZW5hYmxlX3JwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdTMyIHJwX3N0YXRlX2NhcCA9IEk5MTVfUkVBRChHRU42X1JQX1NUQVRFX0NBUCk7CisJdTMyIGd0X3BlcmZfc3RhdHVzID0gSTkxNV9SRUFEKEdFTjZfR1RfUEVSRl9TVEFUVVMpOworCXUzMiBwY3VfbWJveDsKKwlpbnQgY3VyX2ZyZXEsIG1pbl9mcmVxLCBtYXhfZnJlcTsKKwlpbnQgaTsKKworCS8qIEhlcmUgYmVnaW5zIGEgbWFnaWMgc2VxdWVuY2Ugb2YgcmVnaXN0ZXIgd3JpdGVzIHRvIGVuYWJsZQorCSAqIGF1dG8tZG93bmNsb2NraW5nLgorCSAqCisJICogUGVyaGFwcyB0aGVyZSBtaWdodCBiZSBzb21lIHZhbHVlIGluIGV4cG9zaW5nIHRoZXNlIHRvCisJICogdXNlcnNwYWNlLi4uCisJICovCisJSTkxNV9XUklURShHRU42X1JDX1NUQVRFLCAwKTsKKwlfX2dlbjZfZm9yY2Vfd2FrZV9nZXQoZGV2X3ByaXYpOworCisJLyogZGlzYWJsZSB0aGUgY291bnRlcnMgYW5kIHNldCBkZXRlcm1pbmlzdGljIHRocmVzaG9sZHMgKi8KKwlJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwgMCk7CisKKwlJOTE1X1dSSVRFKEdFTjZfUkMxX1dBS0VfUkFURV9MSU1JVCwgMTAwMCA8PCAxNik7CisJSTkxNV9XUklURShHRU42X1JDNl9XQUtFX1JBVEVfTElNSVQsIDQwIDw8IDE2IHwgMzApOworCUk5MTVfV1JJVEUoR0VONl9SQzZwcF9XQUtFX1JBVEVfTElNSVQsIDMwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNfRVZBTFVBVElPTl9JTlRFUlZBTCwgMTI1MDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNfSURMRV9IWVNURVJTSVMsIDI1KTsKKworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlJOTE1X1dSSVRFKFJJTkdfTUFYX0lETEUoZGV2X3ByaXYtPnJpbmdbaV0ubW1pb19iYXNlKSwgMTApOworCisJSTkxNV9XUklURShHRU42X1JDX1NMRUVQLCAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkMxZV9USFJFU0hPTEQsIDEwMDApOworCUk5MTVfV1JJVEUoR0VONl9SQzZfVEhSRVNIT0xELCA1MDAwMCk7CisJSTkxNV9XUklURShHRU42X1JDNnBfVEhSRVNIT0xELCAxMDAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SQzZwcF9USFJFU0hPTEQsIDY0MDAwKTsgLyogdW51c2VkICovCisKKwlJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwKKwkJICAgR0VONl9SQ19DVExfUkM2cF9FTkFCTEUgfAorCQkgICBHRU42X1JDX0NUTF9SQzZfRU5BQkxFIHwKKwkJICAgR0VONl9SQ19DVExfRUlfTU9ERSgxKSB8CisJCSAgIEdFTjZfUkNfQ1RMX0hXX0VOQUJMRSk7CisKKwlJOTE1X1dSSVRFKEdFTjZfUlBOU1dSRVEsCisJCSAgIEdFTjZfRlJFUVVFTkNZKDEwKSB8CisJCSAgIEdFTjZfT0ZGU0VUKDApIHwKKwkJICAgR0VONl9BR0dSRVNTSVZFX1RVUkJPKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkNfVklERU9fRlJFUSwKKwkJICAgR0VONl9GUkVRVUVOQ1koMTIpKTsKKworCUk5MTVfV1JJVEUoR0VONl9SUF9ET1dOX1RJTUVPVVQsIDEwMDAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTLAorCQkgICAxOCA8PCAyNCB8CisJCSAgIDYgPDwgMTYpOworCUk5MTVfV1JJVEUoR0VONl9SUF9VUF9USFJFU0hPTEQsIDkwMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfRE9XTl9USFJFU0hPTEQsIDEwMDAwMCk7CisJSTkxNV9XUklURShHRU42X1JQX1VQX0VJLCAxMDAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SUF9ET1dOX0VJLCAzMDAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SUF9JRExFX0hZU1RFUlNJUywgMTApOworCUk5MTVfV1JJVEUoR0VONl9SUF9DT05UUk9MLAorCQkgICBHRU42X1JQX01FRElBX1RVUkJPIHwKKwkJICAgR0VONl9SUF9VU0VfTk9STUFMX0ZSRVEgfAorCQkgICBHRU42X1JQX01FRElBX0lTX0dGWCB8CisJCSAgIEdFTjZfUlBfRU5BQkxFIHwKKwkJICAgR0VONl9SUF9VUF9CVVNZX01BWCB8CisJCSAgIEdFTjZfUlBfRE9XTl9CVVNZX01JTik7CisKKwlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X1BDT0RFX01BSUxCT1gpICYgR0VONl9QQ09ERV9SRUFEWSkgPT0gMCwKKwkJICAgICA1MDApKQorCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgcGNvZGUgbWFpbGJveCB0byBiZWNvbWUgaWRsZVxuIik7CisKKwlJOTE1X1dSSVRFKEdFTjZfUENPREVfREFUQSwgMCk7CisJSTkxNV9XUklURShHRU42X1BDT0RFX01BSUxCT1gsCisJCSAgIEdFTjZfUENPREVfUkVBRFkgfAorCQkgICBHRU42X1BDT0RFX1dSSVRFX01JTl9GUkVRX1RBQkxFKTsKKwlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X1BDT0RFX01BSUxCT1gpICYgR0VONl9QQ09ERV9SRUFEWSkgPT0gMCwKKwkJICAgICA1MDApKQorCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgcGNvZGUgbWFpbGJveCB0byBmaW5pc2hcbiIpOworCisJbWluX2ZyZXEgPSAocnBfc3RhdGVfY2FwICYgMHhmZjAwMDApID4+IDE2OworCW1heF9mcmVxID0gcnBfc3RhdGVfY2FwICYgMHhmZjsKKwljdXJfZnJlcSA9IChndF9wZXJmX3N0YXR1cyAmIDB4ZmYwMCkgPj4gODsKKworCS8qIENoZWNrIGZvciBvdmVyY2xvY2sgc3VwcG9ydCAqLworCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKEdFTjZfUENPREVfTUFJTEJPWCkgJiBHRU42X1BDT0RFX1JFQURZKSA9PSAwLAorCQkgICAgIDUwMCkpCisJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBwY29kZSBtYWlsYm94IHRvIGJlY29tZSBpZGxlXG4iKTsKKwlJOTE1X1dSSVRFKEdFTjZfUENPREVfTUFJTEJPWCwgR0VONl9SRUFEX09DX1BBUkFNUyk7CisJcGN1X21ib3ggPSBJOTE1X1JFQUQoR0VONl9QQ09ERV9EQVRBKTsKKwlpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X1BDT0RFX01BSUxCT1gpICYgR0VONl9QQ09ERV9SRUFEWSkgPT0gMCwKKwkJICAgICA1MDApKQorCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgcGNvZGUgbWFpbGJveCB0byBmaW5pc2hcbiIpOworCWlmIChwY3VfbWJveCAmICgxPDwzMSkpIHsgLyogT0Mgc3VwcG9ydGVkICovCisJCW1heF9mcmVxID0gcGN1X21ib3ggJiAweGZmOworCQlEUk1fREVCVUdfRFJJVkVSKCJvdmVyY2xvY2tpbmcgc3VwcG9ydGVkLCBhZGp1c3RpbmcgZnJlcXVlbmN5IG1heCB0byAlZE1IelxuIiwgcGN1X21ib3ggKiAxMDApOworCX0KKworCS8qIEluIHVuaXRzIG9mIDEwME1IeiAqLworCWRldl9wcml2LT5tYXhfZGVsYXkgPSBtYXhfZnJlcTsKKwlkZXZfcHJpdi0+bWluX2RlbGF5ID0gbWluX2ZyZXE7CisJZGV2X3ByaXYtPmN1cl9kZWxheSA9IGN1cl9mcmVxOworCisJLyogcmVxdWlyZXMgTVNJIGVuYWJsZWQgKi8KKwlJOTE1X1dSSVRFKEdFTjZfUE1JRVIsCisJCSAgIEdFTjZfUE1fTUJPWF9FVkVOVCB8CisJCSAgIEdFTjZfUE1fVEhFUk1BTF9FVkVOVCB8CisJCSAgIEdFTjZfUE1fUlBfRE9XTl9USU1FT1VUIHwKKwkJICAgR0VONl9QTV9SUF9VUF9USFJFU0hPTEQgfAorCQkgICBHRU42X1BNX1JQX0RPV05fVEhSRVNIT0xEIHwKKwkJICAgR0VONl9QTV9SUF9VUF9FSV9FWFBJUkVEIHwKKwkJICAgR0VONl9QTV9SUF9ET1dOX0VJX0VYUElSRUQpOworCUk5MTVfV1JJVEUoR0VONl9QTUlNUiwgMCk7CisJLyogZW5hYmxlIGFsbCBQTSBpbnRlcnJ1cHRzICovCisJSTkxNV9XUklURShHRU42X1BNSU5UUk1TSywgMCk7CisKKwlfX2dlbjZfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworfQorCit2b2lkIGludGVsX2VuYWJsZV9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC01ODcyLDkgKzYzMjMsOSBAQAogCQkJSTkxNV9XUklURShESVNQX0FSQl9DVEwsCiAJCQkJCShJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKSB8CiAJCQkJCQlESVNQX0ZCQ19XTV9ESVMpKTsKLQkJSTkxNV9XUklURShXTTNfTFBfSUxLLCAwKTsKLQkJSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKLQkJSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKKwkJCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7CisJCQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOworCQkJSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKIAkJfQogCQkvKgogCQkgKiBCYXNlZCBvbiB0aGUgZG9jdW1lbnQgZnJvbSBoYXJkd2FyZSBndXlzIHRoZSBmb2xsb3dpbmcgYml0cwpAQCAtNTg5Niw3ICs2MzQ3LDQ5IEBACiAJCQkJICAgSUxLX0RQRkNfRElTMiB8CiAJCQkJICAgSUxLX0NMS19GQkMpOwogCQl9Ci0JCXJldHVybjsKKworCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4yLAorCQkJICAgSTkxNV9SRUFEKElMS19ESVNQTEFZX0NISUNLRU4yKSB8CisJCQkgICBJTEtfRUxQSU5fNDA5X1NFTEVDVCk7CisKKwkJaWYgKElTX0dFTjUoZGV2KSkgeworCQkJSTkxNV9XUklURShfM0RfQ0hJQ0tFTjIsCisJCQkJICAgXzNEX0NISUNLRU4yX1dNX1JFQURfUElQRUxJTkVEIDw8IDE2IHwKKwkJCQkgICBfM0RfQ0hJQ0tFTjJfV01fUkVBRF9QSVBFTElORUQpOworCQl9CisKKwkJaWYgKElTX0dFTjYoZGV2KSkgeworCQkJSTkxNV9XUklURShXTTNfTFBfSUxLLCAwKTsKKwkJCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7CisJCQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOworCisJCQkvKgorCQkJICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHRoZSBmb2xsb3dpbmcgYml0cyBzaG91bGQgYmUKKwkJCSAqIHNldCBpbiBvcmRlciB0byBlbmFibGUgbWVtb3J5IHNlbGYtcmVmcmVzaCBhbmQgZmJjOgorCQkJICogVGhlIGJpdDIxIGFuZCBiaXQyMiBvZiAweDQyMDAwCisJCQkgKiBUaGUgYml0MjEgYW5kIGJpdDIyIG9mIDB4NDIwMDQKKwkJCSAqIFRoZSBiaXQ1IGFuZCBiaXQ3IG9mIDB4NDIwMjAKKwkJCSAqIFRoZSBiaXQxNCBvZiAweDcwMTgwCisJCQkgKiBUaGUgYml0MTQgb2YgMHg3MTE4MAorCQkJICovCisJCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4xLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElDS0VOMSkgfAorCQkJCSAgIElMS19GQkNRX0RJUyB8IElMS19QQUJTVFJFVENIX0RJUyk7CisJCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4yLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElDS0VOMikgfAorCQkJCSAgIElMS19EUEFSQl9HQVRFIHwgSUxLX1ZTRFBGRF9GVUxMKTsKKwkJCUk5MTVfV1JJVEUoSUxLX0RTUENMS19HQVRFLAorCQkJCSAgIEk5MTVfUkVBRChJTEtfRFNQQ0xLX0dBVEUpIHwKKwkJCQkgICBJTEtfRFBBUkJfQ0xLX0dBVEUgIHwKKwkJCQkgICBJTEtfRFBGRF9DTEtfR0FURSk7CisKKwkJCUk5MTVfV1JJVEUoRFNQQUNOVFIsCisJCQkJICAgSTkxNV9SRUFEKERTUEFDTlRSKSB8CisJCQkJICAgRElTUFBMQU5FX1RSSUNLTEVfRkVFRF9ESVNBQkxFKTsKKwkJCUk5MTVfV1JJVEUoRFNQQkNOVFIsCisJCQkJICAgSTkxNV9SRUFEKERTUEJDTlRSKSB8CisJCQkJICAgRElTUFBMQU5FX1RSSUNLTEVfRkVFRF9ESVNBQkxFKTsKKwkJfQogCX0gZWxzZSBpZiAoSVNfRzRYKGRldikpIHsKIAkJdWludDMyX3QgZHNwY2xrX2dhdGU7CiAJCUk5MTVfV1JJVEUoUkVOQ0xLX0dBVEVfRDEsIDApOwpAQCAtNTkzNCw1NSArNjQyNyw4NCBAQAogCX0gZWxzZSBpZiAoSVNfSTgzMChkZXYpKSB7CiAJCUk5MTVfV1JJVEUoRFNQQ0xLX0dBVEVfRCwgT1ZSVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOwogCX0KK30KKwordm9pZCBpbnRlbF9kaXNhYmxlX2Nsb2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPnJlbmRlcmN0eCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gZGV2X3ByaXYtPnJlbmRlcmN0eDsKKworCQlJOTE1X1dSSVRFKENDSUQsIDApOworCQlQT1NUSU5HX1JFQUQoQ0NJRCk7CisKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCQlkZXZfcHJpdi0+cmVuZGVyY3R4ID0gTlVMTDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPnB3cmN0eCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gZGV2X3ByaXYtPnB3cmN0eDsKKworCQlJOTE1X1dSSVRFKFBXUkNUWEEsIDApOworCQlQT1NUSU5HX1JFQUQoUFdSQ1RYQSk7CisKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCQlkZXZfcHJpdi0+cHdyY3R4ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlyb25sYWtlX2Rpc2FibGVfcmM2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8qIFdha2UgdGhlIEdQVSwgcHJldmVudCBSQzYsIHRoZW4gcmVzdG9yZSBSU1REQllDVEwgKi8KKwlJOTE1X1dSSVRFKFJTVERCWUNUTCwgSTkxNV9SRUFEKFJTVERCWUNUTCkgfCBSQ1hfU1dfRVhJVCk7CisJd2FpdF9mb3IoKChJOTE1X1JFQUQoUlNUREJZQ1RMKSAmIFJTWF9TVEFUVVNfTUFTSykgPT0gUlNYX1NUQVRVU19PTiksCisJCSAxMCk7CisJUE9TVElOR19SRUFEKENDSUQpOworCUk5MTVfV1JJVEUoUFdSQ1RYQSwgMCk7CisJUE9TVElOR19SRUFEKFBXUkNUWEEpOworCUk5MTVfV1JJVEUoUlNUREJZQ1RMLCBJOTE1X1JFQUQoUlNUREJZQ1RMKSAmIH5SQ1hfU1dfRVhJVCk7CisJUE9TVElOR19SRUFEKFJTVERCWUNUTCk7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluKGRldl9wcml2LT5yZW5kZXJjdHgpOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZkZXZfcHJpdi0+cmVuZGVyY3R4LT5iYXNlKTsKKwlkZXZfcHJpdi0+cmVuZGVyY3R4ID0gTlVMTDsKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4oZGV2X3ByaXYtPnB3cmN0eCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJmRldl9wcml2LT5wd3JjdHgtPmJhc2UpOworCWRldl9wcml2LT5wd3JjdHggPSBOVUxMOworfQorCit2b2lkIGlyb25sYWtlX2VuYWJsZV9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CiAKIAkvKgogCSAqIEdQVSBjYW4gYXV0b21hdGljYWxseSBwb3dlciBkb3duIHRoZSByZW5kZXIgdW5pdCBpZiBnaXZlbiBhIHBhZ2UKIAkgKiB0byBzYXZlIHN0YXRlLgogCSAqLwotCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKLQkJaWYgKGRldl9wcml2LT5yZW5kZXJjdHggPT0gTlVMTCkKLQkJCWRldl9wcml2LT5yZW5kZXJjdHggPSBpbnRlbF9hbGxvY19jb250ZXh0X3BhZ2UoZGV2KTsKLQkJaWYgKGRldl9wcml2LT5yZW5kZXJjdHgpIHsKLQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQkJCW9ial9wcml2ID0gdG9faW50ZWxfYm8oZGV2X3ByaXYtPnJlbmRlcmN0eCk7Ci0JCQlpZiAob2JqX3ByaXYpIHsKLQkJCQlCRUdJTl9MUF9SSU5HKDQpOwotCQkJCU9VVF9SSU5HKE1JX1NFVF9DT05URVhUKTsKLQkJCQlPVVRfUklORyhvYmpfcHJpdi0+Z3R0X29mZnNldCB8Ci0JCQkJCQlNSV9NTV9TUEFDRV9HVFQgfAotCQkJCQkJTUlfU0FWRV9FWFRfU1RBVEVfRU4gfAotCQkJCQkJTUlfUkVTVE9SRV9FWFRfU1RBVEVfRU4gfAotCQkJCQkJTUlfUkVTVE9SRV9JTkhJQklUKTsKLQkJCQlPVVRfUklORyhNSV9OT09QKTsKLQkJCQlPVVRfUklORyhNSV9GTFVTSCk7Ci0JCQkJQURWQU5DRV9MUF9SSU5HKCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRvIGFsbG9jYXRlIHJlbmRlciBjb250ZXh0LiIKLQkJCQkgICAgICAgIkRpc2FibGUgUkM2XG4iKTsKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDYpOworCWlmIChyZXQpIHsKKwkJaXJvbmxha2VfZGlzYWJsZV9yYzYoZGV2KTsKKwkJcmV0dXJuOwogCX0KKwlPVVRfUklORyhNSV9TVVNQRU5EX0ZMVVNIIHwgTUlfU1VTUEVORF9GTFVTSF9FTik7CisJT1VUX1JJTkcoTUlfU0VUX0NPTlRFWFQpOworCU9VVF9SSU5HKGRldl9wcml2LT5yZW5kZXJjdHgtPmd0dF9vZmZzZXQgfAorCQkgTUlfTU1fU1BBQ0VfR1RUIHwKKwkJIE1JX1NBVkVfRVhUX1NUQVRFX0VOIHwKKwkJIE1JX1JFU1RPUkVfRVhUX1NUQVRFX0VOIHwKKwkJIE1JX1JFU1RPUkVfSU5ISUJJVCk7CisJT1VUX1JJTkcoTUlfU1VTUEVORF9GTFVTSCk7CisJT1VUX1JJTkcoTUlfTk9PUCk7CisJT1VUX1JJTkcoTUlfRkxVU0gpOworCUFEVkFOQ0VfTFBfUklORygpOwogCi0JaWYgKEk5MTVfSEFTX1JDNihkZXYpICYmIGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gTlVMTDsKLQotCQlpZiAoZGV2X3ByaXYtPnB3cmN0eCkgewotCQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhkZXZfcHJpdi0+cHdyY3R4KTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcHdyY3R4OwotCi0JCQlwd3JjdHggPSBpbnRlbF9hbGxvY19jb250ZXh0X3BhZ2UoZGV2KTsKLQkJCWlmIChwd3JjdHgpIHsKLQkJCQlkZXZfcHJpdi0+cHdyY3R4ID0gcHdyY3R4OwotCQkJCW9ial9wcml2ID0gdG9faW50ZWxfYm8ocHdyY3R4KTsKLQkJCX0KLQkJfQotCi0JCWlmIChvYmpfcHJpdikgewotCQkJSTkxNV9XUklURShQV1JDVFhBLCBvYmpfcHJpdi0+Z3R0X29mZnNldCB8IFBXUkNUWF9FTik7Ci0JCQlJOTE1X1dSSVRFKE1DSEJBUl9SRU5ERVJfU1RBTkRCWSwKLQkJCQkgICBJOTE1X1JFQUQoTUNIQkFSX1JFTkRFUl9TVEFOREJZKSAmIH5SQ1hfU1dfRVhJVCk7Ci0JCX0KLQl9CisJSTkxNV9XUklURShQV1JDVFhBLCBkZXZfcHJpdi0+cHdyY3R4LT5ndHRfb2Zmc2V0IHwgUFdSQ1RYX0VOKTsKKwlJOTE1X1dSSVRFKFJTVERCWUNUTCwgSTkxNV9SRUFEKFJTVERCWUNUTCkgJiB+UkNYX1NXX0VYSVQpOwogfQogCiAvKiBTZXQgdXAgY2hpcCBzcGVjaWZpYyBkaXNwbGF5IGZ1bmN0aW9ucyAqLwpAQCAtNTk5Nyw3ICs2NTE5LDcgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGk5eHhfY3J0Y19kcG1zOwogCiAJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpKSB7Ci0JCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKKwkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgPSBpcm9ubGFrZV9mYmNfZW5hYmxlZDsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpcm9ubGFrZV9lbmFibGVfZmJjOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBpcm9ubGFrZV9kaXNhYmxlX2ZiYzsKQEAgLTYwNDYsNiArNjU2OCwxNCBAQAogCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKIAkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwogCQkJfQorCQl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgeworCQkJaWYgKFNOQl9SRUFEX1dNMF9MQVRFTkNZKCkpIHsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBzYW5keWJyaWRnZV91cGRhdGVfd207CisJCQl9IGVsc2UgeworCQkJCURSTV9ERUJVR19LTVMoIkZhaWxlZCB0byByZWFkIGRpc3BsYXkgcGxhbmUgbGF0ZW5jeS4gIgorCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOworCQkJfQogCQl9IGVsc2UKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CkBAIC02MTkxLDEyICs2NzIxLDcgQEAKIAkJZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwogCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOwogCX0KLQotCS8qIHNldCBtZW1vcnkgYmFzZSAqLwotCWlmIChJU19HRU4yKGRldikpCi0JCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApOwotCWVsc2UKLQkJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMik7CisJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZGV2LT5hZ3AtPmJhc2U7CiAKIAlpZiAoSVNfTU9CSUxFKGRldikgfHwgIUlTX0dFTjIoZGV2KSkKIAkJZGV2X3ByaXYtPm51bV9waXBlID0gMjsKQEAgLTYyMTEsNyArNjczNiw3IEBACiAKIAlpbnRlbF9zZXR1cF9vdXRwdXRzKGRldik7CiAKLQlpbnRlbF9pbml0X2Nsb2NrX2dhdGluZyhkZXYpOworCWludGVsX2VuYWJsZV9jbG9ja19nYXRpbmcoZGV2KTsKIAogCS8qIEp1c3QgZGlzYWJsZSBpdCBvbmNlIGF0IHN0YXJ0dXAgKi8KIAlpOTE1X2Rpc2FibGVfdmdhKGRldik7CkBAIC02MjIxLDYgKzY3NDYsMjQgQEAKIAkJaW50ZWxfaW5pdF9lbW9uKGRldik7CiAJfQogCisJaWYgKElTX0dFTjYoZGV2KSkKKwkJZ2VuNl9lbmFibGVfcnBzKGRldl9wcml2KTsKKworCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKKwkJZGV2X3ByaXYtPnJlbmRlcmN0eCA9IGludGVsX2FsbG9jX2NvbnRleHRfcGFnZShkZXYpOworCQlpZiAoIWRldl9wcml2LT5yZW5kZXJjdHgpCisJCQlnb3RvIHNraXBfcmM2OworCQlkZXZfcHJpdi0+cHdyY3R4ID0gaW50ZWxfYWxsb2NfY29udGV4dF9wYWdlKGRldik7CisJCWlmICghZGV2X3ByaXYtPnB3cmN0eCkgeworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKGRldl9wcml2LT5yZW5kZXJjdHgpOworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJmRldl9wcml2LT5yZW5kZXJjdHgtPmJhc2UpOworCQkJZGV2X3ByaXYtPnJlbmRlcmN0eCA9IE5VTEw7CisJCQlnb3RvIHNraXBfcmM2OworCQl9CisJCWlyb25sYWtlX2VuYWJsZV9yYzYoZGV2KTsKKwl9CisKK3NraXBfcmM2OgogCUlOSVRfV09SSygmZGV2X3ByaXYtPmlkbGVfd29yaywgaW50ZWxfaWRsZV91cGRhdGUpOwogCXNldHVwX3RpbWVyKCZkZXZfcHJpdi0+aWRsZV90aW1lciwgaW50ZWxfZ3B1X2lkbGVfdGltZXIsCiAJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwpAQCAtNjI1MiwyOCArNjc5NSwxMyBAQAogCWlmIChkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYykKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMoZGV2KTsKIAotCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4KSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQotCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGRldl9wcml2LT5yZW5kZXJjdHgpOwotCQlJOTE1X1dSSVRFKENDSUQsIG9ial9wcml2LT5ndHRfb2Zmc2V0ICZ+IENDSURfRU4pOwotCQlJOTE1X1JFQUQoQ0NJRCk7Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbihkZXZfcHJpdi0+cmVuZGVyY3R4KTsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZGV2X3ByaXYtPnJlbmRlcmN0eCk7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5wd3JjdHgpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCi0JCW9ial9wcml2ID0gdG9faW50ZWxfYm8oZGV2X3ByaXYtPnB3cmN0eCk7Ci0JCUk5MTVfV1JJVEUoUFdSQ1RYQSwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgJn4gUFdSQ1RYX0VOKTsKLQkJSTkxNV9SRUFEKFBXUkNUWEEpOwotCQlpOTE1X2dlbV9vYmplY3RfdW5waW4oZGV2X3ByaXYtPnB3cmN0eCk7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGRldl9wcml2LT5wd3JjdHgpOwotCX0KLQogCWlmIChJU19JUk9OTEFLRV9NKGRldikpCiAJCWlyb25sYWtlX2Rpc2FibGVfZHJwcyhkZXYpOworCWlmIChJU19HRU42KGRldikpCisJCWdlbjZfZGlzYWJsZV9ycHMoZGV2KTsKKworCWlmIChJU19JUk9OTEFLRV9NKGRldikpCisJCWlyb25sYWtlX2Rpc2FibGVfcmM2KGRldik7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtNjMyNSwzICs2ODUzLDExMyBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXZfcHJpdi0+YnJpZGdlX2RldiwgSU5URUxfR01DSF9DVFJMLCBnbWNoX2N0cmwpOwogCXJldHVybiAwOwogfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jfc3RhdGUgeworCXN0cnVjdCBpbnRlbF9jdXJzb3JfZXJyb3Jfc3RhdGUgeworCQl1MzIgY29udHJvbDsKKwkJdTMyIHBvc2l0aW9uOworCQl1MzIgYmFzZTsKKwkJdTMyIHNpemU7CisJfSBjdXJzb3JbMl07CisKKwlzdHJ1Y3QgaW50ZWxfcGlwZV9lcnJvcl9zdGF0ZSB7CisJCXUzMiBjb25mOworCQl1MzIgc291cmNlOworCisJCXUzMiBodG90YWw7CisJCXUzMiBoYmxhbms7CisJCXUzMiBoc3luYzsKKwkJdTMyIHZ0b3RhbDsKKwkJdTMyIHZibGFuazsKKwkJdTMyIHZzeW5jOworCX0gcGlwZVsyXTsKKworCXN0cnVjdCBpbnRlbF9wbGFuZV9lcnJvcl9zdGF0ZSB7CisJCXUzMiBjb250cm9sOworCQl1MzIgc3RyaWRlOworCQl1MzIgc2l6ZTsKKwkJdTMyIHBvczsKKwkJdTMyIGFkZHI7CisJCXUzMiBzdXJmYWNlOworCQl1MzIgdGlsZV9vZmZzZXQ7CisJfSBwbGFuZVsyXTsKK307CisKK3N0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICoKK2ludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqZXJyb3I7CisJaW50IGk7CisKKwllcnJvciA9IGttYWxsb2Moc2l6ZW9mKCplcnJvciksIEdGUF9BVE9NSUMpOworCWlmIChlcnJvciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZXJyb3ItPmN1cnNvcltpXS5jb250cm9sID0gSTkxNV9SRUFEKENVUkNOVFIoaSkpOworCQllcnJvci0+Y3Vyc29yW2ldLnBvc2l0aW9uID0gSTkxNV9SRUFEKENVUlBPUyhpKSk7CisJCWVycm9yLT5jdXJzb3JbaV0uYmFzZSA9IEk5MTVfUkVBRChDVVJCQVNFKGkpKTsKKworCQllcnJvci0+cGxhbmVbaV0uY29udHJvbCA9IEk5MTVfUkVBRChEU1BDTlRSKGkpKTsKKwkJZXJyb3ItPnBsYW5lW2ldLnN0cmlkZSA9IEk5MTVfUkVBRChEU1BTVFJJREUoaSkpOworCQllcnJvci0+cGxhbmVbaV0uc2l6ZSA9IEk5MTVfUkVBRChEU1BTSVpFKGkpKTsKKwkJZXJyb3ItPnBsYW5lW2ldLnBvcz0gSTkxNV9SRUFEKERTUFBPUyhpKSk7CisJCWVycm9yLT5wbGFuZVtpXS5hZGRyID0gSTkxNV9SRUFEKERTUEFERFIoaSkpOworCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgeworCQkJZXJyb3ItPnBsYW5lW2ldLnN1cmZhY2UgPSBJOTE1X1JFQUQoRFNQU1VSRihpKSk7CisJCQllcnJvci0+cGxhbmVbaV0udGlsZV9vZmZzZXQgPSBJOTE1X1JFQUQoRFNQVElMRU9GRihpKSk7CisJCX0KKworCQllcnJvci0+cGlwZVtpXS5jb25mID0gSTkxNV9SRUFEKFBJUEVDT05GKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0uc291cmNlID0gSTkxNV9SRUFEKFBJUEVTUkMoaSkpOworCQllcnJvci0+cGlwZVtpXS5odG90YWwgPSBJOTE1X1JFQUQoSFRPVEFMKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0uaGJsYW5rID0gSTkxNV9SRUFEKEhCTEFOSyhpKSk7CisJCWVycm9yLT5waXBlW2ldLmhzeW5jID0gSTkxNV9SRUFEKEhTWU5DKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0udnRvdGFsID0gSTkxNV9SRUFEKFZUT1RBTChpKSk7CisJCWVycm9yLT5waXBlW2ldLnZibGFuayA9IEk5MTVfUkVBRChWQkxBTksoaSkpOworCQllcnJvci0+cGlwZVtpXS52c3luYyA9IEk5MTVfUkVBRChWU1lOQyhpKSk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkCitpbnRlbF9kaXNwbGF5X3ByaW50X2Vycm9yX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICplcnJvcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc2VxX3ByaW50ZihtLCAiUGlwZSBbJWRdOlxuIiwgaSk7CisJCXNlcV9wcmludGYobSwgIiAgQ09ORjogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0uY29uZik7CisJCXNlcV9wcmludGYobSwgIiAgU1JDOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS5zb3VyY2UpOworCQlzZXFfcHJpbnRmKG0sICIgIEhUT1RBTDogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0uaHRvdGFsKTsKKwkJc2VxX3ByaW50ZihtLCAiICBIQkxBTks6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLmhibGFuayk7CisJCXNlcV9wcmludGYobSwgIiAgSFNZTkM6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLmhzeW5jKTsKKwkJc2VxX3ByaW50ZihtLCAiICBWVE9UQUw6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLnZ0b3RhbCk7CisJCXNlcV9wcmludGYobSwgIiAgVkJMQU5LOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS52YmxhbmspOworCQlzZXFfcHJpbnRmKG0sICIgIFZTWU5DOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS52c3luYyk7CisKKwkJc2VxX3ByaW50ZihtLCAiUGxhbmUgWyVkXTpcbiIsIGkpOworCQlzZXFfcHJpbnRmKG0sICIgIENOVFI6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5jb250cm9sKTsKKwkJc2VxX3ByaW50ZihtLCAiICBTVFJJREU6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5zdHJpZGUpOworCQlzZXFfcHJpbnRmKG0sICIgIFNJWkU6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5zaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiICBQT1M6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5wb3MpOworCQlzZXFfcHJpbnRmKG0sICIgIEFERFI6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5hZGRyKTsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKKwkJCXNlcV9wcmludGYobSwgIiAgU1VSRjogJTA4eFxuIiwgZXJyb3ItPnBsYW5lW2ldLnN1cmZhY2UpOworCQkJc2VxX3ByaW50ZihtLCAiICBUSUxFT0ZGOiAlMDh4XG4iLCBlcnJvci0+cGxhbmVbaV0udGlsZV9vZmZzZXQpOworCQl9CisKKwkJc2VxX3ByaW50ZihtLCAiQ3Vyc29yIFslZF06XG4iLCBpKTsKKwkJc2VxX3ByaW50ZihtLCAiICBDTlRSOiAlMDh4XG4iLCBlcnJvci0+Y3Vyc29yW2ldLmNvbnRyb2wpOworCQlzZXFfcHJpbnRmKG0sICIgIFBPUzogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5wb3NpdGlvbik7CisJCXNlcV9wcmludGYobSwgIiAgQkFTRTogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5iYXNlKTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDg2NDQxN2MuLjFmNDI0MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtMTE1MywxOCArMTE1MywyNyBAQAogc3RhdGljIHVpbnQzMl90CiBpbnRlbF9nZW42X2VkcF9zaWduYWxfbGV2ZWxzKHVpbnQ4X3QgdHJhaW5fc2V0KQogewotCXN3aXRjaCAodHJhaW5fc2V0ICYgKERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfTUFTS3xEUF9UUkFJTl9QUkVfRU1QSEFTSVNfTUFTSykpIHsKKwlpbnQgc2lnbmFsX2xldmVscyA9IHRyYWluX3NldCAmIChEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0sgfAorCQkJCQkgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spOworCXN3aXRjaCAoc2lnbmFsX2xldmVscykgewogCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR180MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDoKLQkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzQwME1WXzBEQl9TTkJfQjsKKwljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfNjAwIHwgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzA6CisJCXJldHVybiBFRFBfTElOS19UUkFJTl80MDBfNjAwTVZfMERCX1NOQl9COworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR180MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181OgorCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fNDAwTVZfM181REJfU05CX0I7CiAJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMCB8IERQX1RSQUlOX1BSRV9FTVBIQVNJU182OgotCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fNDAwTVZfNkRCX1NOQl9COworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfNjoKKwkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzQwMF82MDBNVl82REJfU05CX0I7CiAJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzYwMCB8IERQX1RSQUlOX1BSRV9FTVBIQVNJU18zXzU6Ci0JCXJldHVybiBFRFBfTElOS19UUkFJTl82MDBNVl8zXzVEQl9TTkJfQjsKKwljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwIHwgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzNfNToKKwkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzYwMF84MDBNVl8zXzVEQl9TTkJfQjsKIAljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwIHwgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzA6Ci0JCXJldHVybiBFRFBfTElOS19UUkFJTl84MDBNVl8wREJfU05CX0I7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDoKKwkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzgwMF8xMjAwTVZfMERCX1NOQl9COwogCWRlZmF1bHQ6Ci0JCURSTV9ERUJVR19LTVMoIlVuc3VwcG9ydGVkIHZvbHRhZ2Ugc3dpbmcvcHJlLWVtcGhhc2lzIGxldmVsXG4iKTsKLQkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzQwME1WXzBEQl9TTkJfQjsKKwkJRFJNX0RFQlVHX0tNUygiVW5zdXBwb3J0ZWQgdm9sdGFnZSBzd2luZy9wcmUtZW1waGFzaXMgbGV2ZWw6IgorCQkJICAgICAgIjB4JXhcbiIsIHNpZ25hbF9sZXZlbHMpOworCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fNDAwXzYwME1WXzBEQl9TTkJfQjsKIAl9CiB9CiAKQEAgLTEzMzQsMTcgKzEzNDMsMjQgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlib29sIGNoYW5uZWxfZXEgPSBmYWxzZTsKLQlpbnQgdHJpZXM7CisJaW50IHRyaWVzLCBjcl90cmllczsKIAl1MzIgcmVnOwogCXVpbnQzMl90IERQID0gaW50ZWxfZHAtPkRQOwogCiAJLyogY2hhbm5lbCBlcXVhbGl6YXRpb24gKi8KIAl0cmllcyA9IDA7CisJY3JfdHJpZXMgPSAwOwogCWNoYW5uZWxfZXEgPSBmYWxzZTsKIAlmb3IgKDs7KSB7CiAJCS8qIFVzZSBpbnRlbF9kcC0+dHJhaW5fc2V0WzBdIHRvIHNldCB0aGUgdm9sdGFnZSBhbmQgcHJlIGVtcGhhc2lzIHZhbHVlcyAqLwogCQl1aW50MzJfdCAgICBzaWduYWxfbGV2ZWxzOwogCisJCWlmIChjcl90cmllcyA+IDUpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHRyYWluIERQLCBhYm9ydGluZ1xuIik7CisJCQlpbnRlbF9kcF9saW5rX2Rvd24oaW50ZWxfZHApOworCQkJYnJlYWs7CisJCX0KKwogCQlpZiAoSVNfR0VONihkZXYpICYmIGlzX2VkcChpbnRlbF9kcCkpIHsKIAkJCXNpZ25hbF9sZXZlbHMgPSBpbnRlbF9nZW42X2VkcF9zaWduYWxfbGV2ZWxzKGludGVsX2RwLT50cmFpbl9zZXRbMF0pOwogCQkJRFAgPSAoRFAgJiB+RURQX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLX1NOQikgfCBzaWduYWxfbGV2ZWxzOwpAQCAtMTM2NywxNCArMTM4MywyNiBAQAogCQlpZiAoIWludGVsX2RwX2dldF9saW5rX3N0YXR1cyhpbnRlbF9kcCkpCiAJCQlicmVhazsKIAorCQkvKiBNYWtlIHN1cmUgY2xvY2sgaXMgc3RpbGwgb2sgKi8KKwkJaWYgKCFpbnRlbF9jbG9ja19yZWNvdmVyeV9vayhpbnRlbF9kcC0+bGlua19zdGF0dXMsIGludGVsX2RwLT5sYW5lX2NvdW50KSkgeworCQkJaW50ZWxfZHBfc3RhcnRfbGlua190cmFpbihpbnRlbF9kcCk7CisJCQljcl90cmllcysrOworCQkJY29udGludWU7CisJCX0KKwogCQlpZiAoaW50ZWxfY2hhbm5lbF9lcV9vayhpbnRlbF9kcCkpIHsKIAkJCWNoYW5uZWxfZXEgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiBUcnkgNSB0aW1lcyAqLwotCQlpZiAodHJpZXMgPiA1KQotCQkJYnJlYWs7CisJCS8qIFRyeSA1IHRpbWVzLCB0aGVuIHRyeSBjbG9jayByZWNvdmVyeSBpZiB0aGF0IGZhaWxzICovCisJCWlmICh0cmllcyA+IDUpIHsKKwkJCWludGVsX2RwX2xpbmtfZG93bihpbnRlbF9kcCk7CisJCQlpbnRlbF9kcF9zdGFydF9saW5rX3RyYWluKGludGVsX2RwKTsKKwkJCXRyaWVzID0gMDsKKwkJCWNyX3RyaWVzKys7CisJCQljb250aW51ZTsKKwkJfQogCiAJCS8qIENvbXB1dGUgbmV3IGludGVsX2RwLT50cmFpbl9zZXQgYXMgcmVxdWVzdGVkIGJ5IHRhcmdldCAqLwogCQlpbnRlbF9nZXRfYWRqdXN0X3RyYWluKGludGVsX2RwKTsKQEAgLTE0NDIsOCArMTQ3MCw3IEBACiAJCS8qIENoYW5nZXMgdG8gZW5hYmxlIG9yIHNlbGVjdCB0YWtlIHBsYWNlIHRoZSB2YmxhbmsKIAkJICogYWZ0ZXIgYmVpbmcgd3JpdHRlbi4KIAkJICovCi0JCWludGVsX3dhaXRfZm9yX3ZibGFuayhpbnRlbF9kcC0+YmFzZS5iYXNlLmRldiwKLQkJCQkgICAgICBpbnRlbF9jcnRjLT5waXBlKTsKKwkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CiAJfQogCiAJSTkxNV9XUklURShpbnRlbF9kcC0+b3V0cHV0X3JlZywgRFAgJiB+RFBfUE9SVF9FTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCmluZGV4IGU1MmM2MTIuLjc0ZGIyNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyIHsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyIGJhc2U7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIH07CiAKIHN0cnVjdCBpbnRlbF9mYmRldiB7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayAqdW5waW5fd29yazsKIAlpbnQgZmRpX2xhbmVzOwogCi0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpjdXJzb3JfYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKIAl1aW50MzJfdCBjdXJzb3JfYWRkcjsKIAlpbnQxNl90IGN1cnNvcl94LCBjdXJzb3JfeTsKIAlpbnQxNl90IGN1cnNvcl93aWR0aCwgY3Vyc29yX2hlaWdodDsKQEAgLTIyMCw4ICsyMjAsOCBAQAogc3RydWN0IGludGVsX3VucGluX3dvcmsgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvbGRfZmJfb2JqOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcGVuZGluZ19mbGlwX29iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2xkX2ZiX29iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqcGVuZGluZ19mbGlwX29iajsKIAlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudDsKIAlpbnQgcGVuZGluZzsKIAlib29sIGVuYWJsZV9zdGFsbF9jaGVjazsKQEAgLTIzNiw3ICsyMzYsOCBAQAogZXh0ZXJuIGJvb2wgaW50ZWxfc2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBvdXRwdXRfZGV2aWNlKTsKIGV4dGVybiB2b2lkIGludGVsX2R2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfdHZfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIGludGVsX21hcmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitleHRlcm4gdm9pZCBpbnRlbF9tYXJrX2J1c3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIGV4dGVybiBib29sIGludGVsX2x2ZHNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2RwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGRwX3JlZyk7CiB2b2lkCkBAIC0yNTYsNiArMjU3LDkgQEAKIGV4dGVybiB1MzIgaW50ZWxfcGFuZWxfZ2V0X21heF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdTMyIGludGVsX3BhbmVsX2dldF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBsZXZlbCk7CitleHRlcm4gdm9pZCBpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbnRlbF9wYW5lbF9lbmFibGVfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfcGFuZWxfZGlzYWJsZV9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiB2b2lkIGludGVsX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIGV4dGVybiB2b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZSAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKQEAgLTI5MywxOSArMjk3LDIyIEBACiAJCQkJICAgIHUxNiBibHVlLCBpbnQgcmVnbm8pOwogZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19mYl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKIAkJCQkgICAgdTE2ICpibHVlLCBpbnQgcmVnbm8pOwotZXh0ZXJuIHZvaWQgaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbnRlbF9lbmFibGVfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfZGlzYWJsZV9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpcm9ubGFrZV9lbmFibGVfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGlyb25sYWtlX2Rpc2FibGVfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGdlbjZfZW5hYmxlX3JwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgZ2VuNl9kaXNhYmxlX3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2luaXRfZW1vbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgIGJvb2wgcGlwZWxpbmVkKTsKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKTsKIAogZXh0ZXJuIGludCBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmlmYiwKIAkJCQkgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kLAotCQkJCSAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiBleHRlcm4gaW50IGludGVsX2ZiZGV2X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwppbmRleCBhZjJhMWRkLi5lZTE0NWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKQEAgLTYyLDEzICs2MiwxMyBAQAogCQkJICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlcl9zdXJmYWNlX3NpemUgKnNpemVzKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpZmJkZXYtPmhlbHBlci5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKIAlzdHJ1Y3QgZHJtX21vZGVfZmJfY21kIG1vZGVfY21kOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZmJvID0gTlVMTDsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmZGV2LT5wZGV2LT5kZXY7Ci0JaW50IHNpemUsIHJldCwgbW1pb19iYXIgPSBJU19HRU4yKGRldikgPyAxIDogMDsKKwlpbnQgc2l6ZSwgcmV0OwogCiAJLyogd2UgZG9uJ3QgZG8gcGFja2VkIDI0YnBwICovCiAJaWYgKHNpemVzLT5zdXJmYWNlX2JwcCA9PSAyNCkKQEAgLTc4LDIzICs3OCwyMiBAQAogCW1vZGVfY21kLmhlaWdodCA9IHNpemVzLT5zdXJmYWNlX2hlaWdodDsKIAogCW1vZGVfY21kLmJwcCA9IHNpemVzLT5zdXJmYWNlX2JwcDsKLQltb2RlX2NtZC5waXRjaCA9IEFMSUdOKG1vZGVfY21kLndpZHRoICogKChtb2RlX2NtZC5icHAgKyAxKSAvIDgpLCA2NCk7CisJbW9kZV9jbWQucGl0Y2ggPSBBTElHTihtb2RlX2NtZC53aWR0aCAqICgobW9kZV9jbWQuYnBwICsgNykgLyA4KSwgNjQpOwogCW1vZGVfY21kLmRlcHRoID0gc2l6ZXMtPnN1cmZhY2VfZGVwdGg7CiAKIAlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CiAJc2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7Ci0JZmJvID0gaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KGRldiwgc2l6ZSk7Ci0JaWYgKCFmYm8pIHsKKwlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCBzaXplKTsKKwlpZiAoIW9iaikgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGZibyk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAkvKiBGbHVzaCBldmVyeXRoaW5nIG91dCwgd2UnbGwgYmUgZG9pbmcgR1RUIG9ubHkgZnJvbSBub3cgb24gKi8KLQlyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIGZibywgZmFsc2UpOworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBmYWxzZSk7CiAJaWYgKHJldCkgewogCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gZmI6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dF91bnJlZjsKQEAgLTEwOCw3ICsxMDcsNyBAQAogCiAJaW5mby0+cGFyID0gaWZiZGV2OwogCi0JcmV0ID0gaW50ZWxfZnJhbWVidWZmZXJfaW5pdChkZXYsICZpZmJkZXYtPmlmYiwgJm1vZGVfY21kLCBmYm8pOworCXJldCA9IGludGVsX2ZyYW1lYnVmZmVyX2luaXQoZGV2LCAmaWZiZGV2LT5pZmIsICZtb2RlX2NtZCwgb2JqKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF91bnBpbjsKIApAQCAtMTIyLDYgKzEyMSwxMSBAQAogCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fQ0FOX0ZPUkNFX09VVFBVVDsKIAlpbmZvLT5mYm9wcyA9ICZpbnRlbGZiX29wczsKIAorCXJldCA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bnBpbjsKKwl9CiAJLyogc2V0dXAgYXBlcnR1cmUgYmFzZS9zaXplIGZvciB2ZXNhZmIgdGFrZW92ZXIgKi8KIAlpbmZvLT5hcGVydHVyZXMgPSBhbGxvY19hcGVydHVyZXMoMSk7CiAJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKQEAgLTEyOSwzNyArMTMzLDIzIEBACiAJCWdvdG8gb3V0X3VucGluOwogCX0KIAlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5iYXNlID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlOwotCWlmICghSVNfR0VOMihkZXYpKQotCQlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDIpOwotCWVsc2UKLQkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKTsKKwlpbmZvLT5hcGVydHVyZXMtPnJhbmdlc1swXS5zaXplID0KKwkJZGV2X3ByaXYtPm1tLmd0dC0+Z3R0X21hcHBhYmxlX2VudHJpZXMgPDwgUEFHRV9TSElGVDsKIAotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgKyBvYmotPmd0dF9vZmZzZXQ7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKIAotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF93YyhkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0LAotCQkJCSAgICAgICBzaXplKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfd2MoZGV2LT5hZ3AtPmJhc2UgKyBvYmotPmd0dF9vZmZzZXQsIHNpemUpOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcmV0ID0gLUVOT1NQQzsKIAkJZ290byBvdXRfdW5waW47CiAJfQotCi0JcmV0ID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3VucGluOwotCX0KIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IHNpemU7CiAKIC8vCW1lbXNldChpbmZvLT5zY3JlZW5fYmFzZSwgMCwgc2l6ZSk7CiAKLQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKIAlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sICZpZmJkZXYtPmhlbHBlciwgc2l6ZXMtPmZiX3dpZHRoLCBzaXplcy0+ZmJfaGVpZ2h0KTsKIAotCS8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkbid0IGV4cG9zZSBtbWlvIHNwYWNlIGF0IGFsbCAqLwotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgbW1pb19iYXIpOwotCWluZm8tPmZpeC5tbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBtbWlvX2Jhcik7Ci0KIAlpbmZvLT5waXhtYXAuc2l6ZSA9IDY0KjEwMjQ7CiAJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CiAJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwpAQCAtMTY4LDcgKzE1OCw3IEBACiAKIAlEUk1fREVCVUdfS01TKCJhbGxvY2F0ZWQgJWR4JWQgZmI6IDB4JTA4eCwgYm8gJXBcbiIsCiAJCSAgICAgIGZiLT53aWR0aCwgZmItPmhlaWdodCwKLQkJICAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQsIGZibyk7CisJCSAgICAgIG9iai0+Z3R0X29mZnNldCwgb2JqKTsKIAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xNzYsOSArMTY2LDkgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VucGluOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbihmYm8pOworCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogb3V0X3VucmVmOgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGZibyk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTIyNSw3ICsyMTUsNyBAQAogCiAJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoJmlmYi0+YmFzZSk7CiAJaWYgKGlmYi0+b2JqKSB7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGlmYi0+b2JqKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJmlmYi0+b2JqLT5iYXNlKTsKIAkJaWZiLT5vYmogPSBOVUxMOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKaW5kZXggM2RiYTA4Ni4uNTgwNDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKQEAgLTg1LDggKzg1LDkgQEAKIAogCS8qIE9uIG1vc3QgY2hpcHMsIHRoZXNlIGJpdHMgbXVzdCBiZSBwcmVzZXJ2ZWQgaW4gc29mdHdhcmUuICovCiAJaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSkKLQkJcmVzZXJ2ZWQgPSBJOTE1X1JFQUQoZ3Bpby0+cmVnKSAmIChHUElPX0RBVEFfUFVMTFVQX0RJU0FCTEUgfAotCQkJCQkJICAgR1BJT19DTE9DS19QVUxMVVBfRElTQUJMRSk7CisJCXJlc2VydmVkID0gSTkxNV9SRUFEX05PVFJBQ0UoZ3Bpby0+cmVnKSAmCisJCQkJCSAgICAgKEdQSU9fREFUQV9QVUxMVVBfRElTQUJMRSB8CisJCQkJCSAgICAgIEdQSU9fQ0xPQ0tfUFVMTFVQX0RJU0FCTEUpOwogCiAJcmV0dXJuIHJlc2VydmVkOwogfQpAQCAtOTYsOSArOTcsOSBAQAogCXN0cnVjdCBpbnRlbF9ncGlvICpncGlvID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBncGlvLT5kZXZfcHJpdjsKIAl1MzIgcmVzZXJ2ZWQgPSBnZXRfcmVzZXJ2ZWQoZ3Bpbyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19DTE9DS19ESVJfTUFTSyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkKTsKLQlyZXR1cm4gKEk5MTVfUkVBRChncGlvLT5yZWcpICYgR1BJT19DTE9DS19WQUxfSU4pICE9IDA7CisJSTkxNV9XUklURV9OT1RSQUNFKGdwaW8tPnJlZywgcmVzZXJ2ZWQgfCBHUElPX0NMT0NLX0RJUl9NQVNLKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCk7CisJcmV0dXJuIChJOTE1X1JFQURfTk9UUkFDRShncGlvLT5yZWcpICYgR1BJT19DTE9DS19WQUxfSU4pICE9IDA7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2RhdGEodm9pZCAqZGF0YSkKQEAgLTEwNiw5ICsxMDcsOSBAQAogCXN0cnVjdCBpbnRlbF9ncGlvICpncGlvID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBncGlvLT5kZXZfcHJpdjsKIAl1MzIgcmVzZXJ2ZWQgPSBnZXRfcmVzZXJ2ZWQoZ3Bpbyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19EQVRBX0RJUl9NQVNLKTsKLQlJOTE1X1dSSVRFKGdwaW8tPnJlZywgcmVzZXJ2ZWQpOwotCXJldHVybiAoSTkxNV9SRUFEKGdwaW8tPnJlZykgJiBHUElPX0RBVEFfVkFMX0lOKSAhPSAwOworCUk5MTVfV1JJVEVfTk9UUkFDRShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19EQVRBX0RJUl9NQVNLKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCk7CisJcmV0dXJuIChJOTE1X1JFQURfTk9UUkFDRShncGlvLT5yZWcpICYgR1BJT19EQVRBX1ZBTF9JTikgIT0gMDsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2Nsb2NrKHZvaWQgKmRhdGEsIGludCBzdGF0ZV9oaWdoKQpAQCAtMTI0LDcgKzEyNSw3IEBACiAJCWNsb2NrX2JpdHMgPSBHUElPX0NMT0NLX0RJUl9PVVQgfCBHUElPX0NMT0NLX0RJUl9NQVNLIHwKIAkJCUdQSU9fQ0xPQ0tfVkFMX01BU0s7CiAKLQlJOTE1X1dSSVRFKGdwaW8tPnJlZywgcmVzZXJ2ZWQgfCBjbG9ja19iaXRzKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCB8IGNsb2NrX2JpdHMpOwogCVBPU1RJTkdfUkVBRChncGlvLT5yZWcpOwogfQogCkBAIC0xNDEsNyArMTQyLDcgQEAKIAkJZGF0YV9iaXRzID0gR1BJT19EQVRBX0RJUl9PVVQgfCBHUElPX0RBVEFfRElSX01BU0sgfAogCQkJR1BJT19EQVRBX1ZBTF9NQVNLOwogCi0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgZGF0YV9iaXRzKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCB8IGRhdGFfYml0cyk7CiAJUE9TVElOR19SRUFEKGdwaW8tPnJlZyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCAyNWJjZWRmLi5hY2U4ZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlJOTE1X1dSSVRFKGN0bF9yZWcsIEk5MTVfUkVBRChjdGxfcmVnKSB8IFBPV0VSX1RBUkdFVF9PTik7CiAJUE9TVElOR19SRUFEKGx2ZHNfcmVnKTsKIAotCWludGVsX3BhbmVsX3NldF9iYWNrbGlnaHQoZGV2LCBkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsKTsKKwlpbnRlbF9wYW5lbF9lbmFibGVfYmFja2xpZ2h0KGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX2x2ZHNfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfbHZkcyAqaW50ZWxfbHZkcykKQEAgLTEyMyw4ICsxMjMsNyBAQAogCQlsdmRzX3JlZyA9IExWRFM7CiAJfQogCi0JZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGludGVsX3BhbmVsX2dldF9iYWNrbGlnaHQoZGV2KTsKLQlpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgMCk7CisJaW50ZWxfcGFuZWxfZGlzYWJsZV9iYWNrbGlnaHQoZGV2KTsKIAogCUk5MTVfV1JJVEUoY3RsX3JlZywgSTkxNV9SRUFEKGN0bF9yZWcpICYgflBPV0VSX1RBUkdFVF9PTik7CiAKQEAgLTMwNCwxNCArMzAzLDEzIEBACiAJCQl1MzIgc2NhbGVkX3dpZHRoID0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgKiBtb2RlLT52ZGlzcGxheTsKIAkJCXUzMiBzY2FsZWRfaGVpZ2h0ID0gbW9kZS0+aGRpc3BsYXkgKiBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKIAotCQkJcGZpdF9jb250cm9sIHw9IFBGSVRfRU5BQkxFOwogCQkJLyogOTY1KyBpcyBlYXN5LCBpdCBkb2VzIGV2ZXJ5dGhpbmcgaW4gaHcgKi8KIAkJCWlmIChzY2FsZWRfd2lkdGggPiBzY2FsZWRfaGVpZ2h0KQotCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfUElMTEFSOworCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRSB8IFBGSVRfU0NBTElOR19QSUxMQVI7CiAJCQllbHNlIGlmIChzY2FsZWRfd2lkdGggPCBzY2FsZWRfaGVpZ2h0KQotCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfTEVUVEVSOwotCQkJZWxzZQotCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfQVVUTzsKKwkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9FTkFCTEUgfCBQRklUX1NDQUxJTkdfTEVUVEVSOworCQkJZWxzZSBpZiAoYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgIT0gbW9kZS0+aGRpc3BsYXkpCisJCQkJcGZpdF9jb250cm9sIHw9IFBGSVRfRU5BQkxFIHwgUEZJVF9TQ0FMSU5HX0FVVE87CiAJCX0gZWxzZSB7CiAJCQl1MzIgc2NhbGVkX3dpZHRoID0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgKiBtb2RlLT52ZGlzcGxheTsKIAkJCXUzMiBzY2FsZWRfaGVpZ2h0ID0gbW9kZS0+aGRpc3BsYXkgKiBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheTsKQEAgLTM1OCwxMyArMzU2LDE3IEBACiAJCSAqIEZ1bGwgc2NhbGluZywgZXZlbiBpZiBpdCBjaGFuZ2VzIHRoZSBhc3BlY3QgcmF0aW8uCiAJCSAqIEZvcnR1bmF0ZWx5IHRoaXMgaXMgYWxsIGRvbmUgZm9yIHVzIGluIGh3LgogCQkgKi8KLQkJcGZpdF9jb250cm9sIHw9IFBGSVRfRU5BQkxFOwotCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKLQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfQVVUTzsKLQkJZWxzZQotCQkJcGZpdF9jb250cm9sIHw9IChWRVJUX0FVVE9fU0NBTEUgfCBIT1JJWl9BVVRPX1NDQUxFIHwKLQkJCQkJIFZFUlRfSU5URVJQX0JJTElORUFSIHwKLQkJCQkJIEhPUklaX0lOVEVSUF9CSUxJTkVBUik7CisJCWlmIChtb2RlLT52ZGlzcGxheSAhPSBhZGp1c3RlZF9tb2RlLT52ZGlzcGxheSB8fAorCQkgICAgbW9kZS0+aGRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkpIHsKKwkJCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRTsKKwkJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQorCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX1NDQUxJTkdfQVVUTzsKKwkJCWVsc2UKKwkJCQlwZml0X2NvbnRyb2wgfD0gKFZFUlRfQVVUT19TQ0FMRSB8CisJCQkJCQkgVkVSVF9JTlRFUlBfQklMSU5FQVIgfAorCQkJCQkJIEhPUklaX0FVVE9fU0NBTEUgfAorCQkJCQkJIEhPUklaX0lOVEVSUF9CSUxJTkVBUik7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzcyLDYgKzM3NCwxMCBAQAogCX0KIAogb3V0OgorCWlmICgocGZpdF9jb250cm9sICYgUEZJVF9FTkFCTEUpID09IDApIHsKKwkJcGZpdF9jb250cm9sID0gMDsKKwkJcGZpdF9wZ21fcmF0aW9zID0gMDsKKwl9CiAJaWYgKHBmaXRfY29udHJvbCAhPSBpbnRlbF9sdmRzLT5wZml0X2NvbnRyb2wgfHwKIAkgICAgcGZpdF9wZ21fcmF0aW9zICE9IGludGVsX2x2ZHMtPnBmaXRfcGdtX3JhdGlvcykgewogCQlpbnRlbF9sdmRzLT5wZml0X2NvbnRyb2wgPSBwZml0X2NvbnRyb2w7CkBAIC0zOTUsOCArNDAxLDYgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9sdmRzICppbnRlbF9sdmRzID0gdG9faW50ZWxfbHZkcyhlbmNvZGVyKTsKIAotCWRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwgPSBpbnRlbF9wYW5lbF9nZXRfYmFja2xpZ2h0KGRldik7Ci0KIAkvKiBXZSB0cnkgdG8gZG8gdGhlIG1pbmltdW0gdGhhdCBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gdW5sb2NrCiAJICogdGhlIHJlZ2lzdGVycyBmb3IgbW9kZSBzZXR0aW5nLgogCSAqCkBAIC00MjcsOSArNDMxLDYgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9sdmRzICppbnRlbF9sdmRzID0gdG9faW50ZWxfbHZkcyhlbmNvZGVyKTsKIAotCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsID09IDApCi0JCWRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwgPSBpbnRlbF9wYW5lbF9nZXRfbWF4X2JhY2tsaWdodChkZXYpOwotCiAJLyogVW5kbyBhbnkgdW5sb2NraW5nIGRvbmUgaW4gcHJlcGFyZSB0byBwcmV2ZW50IGFjY2lkZW50YWwKIAkgKiBhZGp1c3RtZW50IG9mIHRoZSByZWdpc3RlcnMuCiAJICovCkBAIC03MDMsNiArNzA0LDE0IEBACiAJfSwKIAl7CiAJCS5jYWxsYmFjayA9IGludGVsX25vX2x2ZHNfZG1pX2NhbGxiYWNrLAorCQkuaWRlbnQgPSAiQU9wZW4gaTkxNUdNbS1IRlMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQU9wZW4iKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImk5MTVHTW0tSEZTIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGludGVsX25vX2x2ZHNfZG1pX2NhbGxiYWNrLAogCQkuaWRlbnQgPSAiQW9wZW4gaTk0NUdUdC1WRkEiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiQU8wMDAwMUpXIiksCkBAIC05MTQsNiArOTIzLDggQEAKIAogCWludGVsX2VuY29kZXItPmNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9MVkRTX0NMT05FX0JJVCk7CiAJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrID0gKDEgPDwgMSk7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDUpCisJCWludGVsX2VuY29kZXItPmNydGNfbWFzayB8PSAoMSA8PCAwKTsKIAlkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZpbnRlbF9sdmRzX2hlbHBlcl9mdW5jcyk7CiAJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmludGVsX2x2ZHNfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CiAJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uc3VicGl4ZWxfb3JkZXIgPSBTdWJQaXhlbEhvcml6b250YWxSR0I7CkBAIC0xMDE5LDEwICsxMDMwLDE4IEBACiBvdXQ6CiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQl1MzIgcHdtOwotCQkvKiBtYWtlIHN1cmUgUFdNIGlzIGVuYWJsZWQgKi8KKworCQlwaXBlID0gKEk5MTVfUkVBRChQQ0hfTFZEUykgJiBMVkRTX1BJUEVCX1NFTEVDVCkgPyAxIDogMDsKKworCQkvKiBtYWtlIHN1cmUgUFdNIGlzIGVuYWJsZWQgYW5kIGxvY2tlZCB0byB0aGUgTFZEUyBwaXBlICovCiAJCXB3bSA9IEk5MTVfUkVBRChCTENfUFdNX0NQVV9DVEwyKTsKLQkJcHdtIHw9IChQV01fRU5BQkxFIHwgUFdNX1BJUEVfQik7Ci0JCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMMiwgcHdtKTsKKwkJaWYgKHBpcGUgPT0gMCAmJiAocHdtICYgUFdNX1BJUEVfQikpCisJCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTDIsIHB3bSAmIH5QV01fRU5BQkxFKTsKKwkJaWYgKHBpcGUpCisJCQlwd20gfD0gUFdNX1BJUEVfQjsKKwkJZWxzZQorCQkJcHdtICY9IH5QV01fUElQRV9COworCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1BVX0NUTDIsIHB3bSB8IFBXTV9FTkFCTEUpOwogCiAJCXB3bSA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwxKTsKIAkJcHdtIHw9IFBXTV9QQ0hfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKaW5kZXggOWIwZDlhOC4uZjI5NWE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCkBAIC0yNzMsMTQgKzI3Myw4IEBACiAJc3RydWN0IG9wcmVnaW9uX2FzbGUgKmFzbGUgPSBkZXZfcHJpdi0+b3ByZWdpb24uYXNsZTsKIAogCWlmIChhc2xlKSB7Ci0JCWlmIChJU19NT0JJTEUoZGV2KSkgewotCQkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJCWlmIChJU19NT0JJTEUoZGV2KSkKIAkJCWludGVsX2VuYWJsZV9hc2xlKGRldik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywKLQkJCQkJICAgICAgIGlycWZsYWdzKTsKLQkJfQogCiAJCWFzbGUtPnRjaGUgPSBBU0xFX0FMU19FTiB8IEFTTEVfQkxDX0VOIHwgQVNMRV9QRklUX0VOIHwKIAkJCUFTTEVfUEZNQl9FTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYwppbmRleCAwMmZmMGE0Li4zZmJiOThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCkBAIC0yMjEsMTUgKzIyMSwxNiBAQAogCWludCByZXQ7CiAKIAlCVUdfT04ob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSk7Ci0Jb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9Ci0JCWk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCByZXF1ZXN0LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpZiAob3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9PSAwKQotCQlyZXR1cm4gLUVOT01FTTsKLQorCXJldCA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCByZXF1ZXN0LCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkgeworCSAgICBrZnJlZShyZXF1ZXN0KTsKKwkgICAgcmV0dXJuIHJldDsKKwl9CisJb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSA9IHJlcXVlc3QtPnNlcW5vOwogCW92ZXJsYXktPmZsaXBfdGFpbCA9IHRhaWw7CiAJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3QoZGV2LAogCQkJCSAgIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsIHRydWUsCi0JCQkJICAgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJCQkJICAgTFBfUklORyhkZXZfcHJpdikpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTI4OSw2ICsyOTAsNyBAQAogc3RhdGljIGludCBpbnRlbF9vdmVybGF5X29uKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CiAJaW50IHBpcGVfYV9xdWlyayA9IDA7CiAJaW50IHJldDsKQEAgLTMwOCw3ICszMTAsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JQkVHSU5fTFBfUklORyg0KTsKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUocmVxdWVzdCk7CisJCWdvdG8gb3V0OworCX0KKwogCU9VVF9SSU5HKE1JX09WRVJMQVlfRkxJUCB8IE1JX09WRVJMQVlfT04pOwogCU9VVF9SSU5HKG92ZXJsYXktPmZsaXBfYWRkciB8IE9GQ19VUERBVEUpOwogCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQKTsKQEAgLTMzMiw2ICszMzksNyBAQAogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIAl1MzIgZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOwogCXUzMiB0bXA7CisJaW50IHJldDsKIAogCUJVR19PTighb3ZlcmxheS0+YWN0aXZlKTsKIApAQCAtMzQ3LDM2ICszNTUsNDQgQEAKIAlpZiAodG1wICYgKDEgPDwgMTcpKQogCQlEUk1fREVCVUcoIm92ZXJsYXkgdW5kZXJydW4sIERPVlNUQTogJXhcbiIsIHRtcCk7CiAKLQlCRUdJTl9MUF9SSU5HKDIpOworCXJldCA9IEJFR0lOX0xQX1JJTkcoMik7CisJaWYgKHJldCkgeworCQlrZnJlZShyZXF1ZXN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJT1VUX1JJTkcoTUlfT1ZFUkxBWV9GTElQIHwgTUlfT1ZFUkxBWV9DT05USU5VRSk7CiAJT1VUX1JJTkcoZmxpcF9hZGRyKTsKICAgICAgICAgQURWQU5DRV9MUF9SSU5HKCk7CiAKLQlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0KLQkJaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIHJlcXVlc3QsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOworCXJldCA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBOVUxMLCByZXF1ZXN0LCBMUF9SSU5HKGRldl9wcml2KSk7CisJaWYgKHJldCkgeworCQlrZnJlZShyZXF1ZXN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0gcmVxdWVzdC0+c2Vxbm87CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX292ZXJsYXlfcmVsZWFzZV9vbGRfdmlkX3RhaWwoc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCiB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSAmb3ZlcmxheS0+b2xkX3ZpZF9iby0+YmFzZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gb3ZlcmxheS0+b2xkX3ZpZF9ibzsKIAogCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAKIAlvdmVybGF5LT5vbGRfdmlkX2JvID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfb3ZlcmxheV9vZmZfdGFpbChzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSkKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gb3ZlcmxheS0+dmlkX2JvOwogCiAJLyogbmV2ZXIgaGF2ZSB0aGUgb3ZlcmxheSBodyBvbiB3aXRob3V0IHNob3dpbmcgYSBmcmFtZSAqLwogCUJVR19PTighb3ZlcmxheS0+dmlkX2JvKTsKLQlvYmogPSAmb3ZlcmxheS0+dmlkX2JvLT5iYXNlOwogCiAJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAlvdmVybGF5LT52aWRfYm8gPSBOVUxMOwogCiAJb3ZlcmxheS0+Y3J0Yy0+b3ZlcmxheSA9IE5VTEw7CkBAIC0zODksOCArNDA1LDEwIEBACiAJCQkgICAgIGJvb2wgaW50ZXJydXB0aWJsZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGZsaXBfYWRkciA9IG92ZXJsYXktPmZsaXBfYWRkcjsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJldDsKIAogCUJVR19PTighb3ZlcmxheS0+YWN0aXZlKTsKIApAQCAtNDA0LDcgKzQyMiwxMSBAQAogCSAqIG9mIHRoZSBody4gRG8gaXQgaW4gYm90aCBjYXNlcyAqLwogCWZsaXBfYWRkciB8PSBPRkNfVVBEQVRFOwogCi0JQkVHSU5fTFBfUklORyg2KTsKKwlyZXQgPSBCRUdJTl9MUF9SSU5HKDYpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUocmVxdWVzdCk7CisJCXJldHVybiByZXQ7CisJfQogCS8qIHdhaXQgZm9yIG92ZXJsYXkgdG8gZ28gaWRsZSAqLwogCU9VVF9SSU5HKE1JX09WRVJMQVlfRkxJUCB8IE1JX09WRVJMQVlfQ09OVElOVUUpOwogCU9VVF9SSU5HKGZsaXBfYWRkcik7CkBAIC00MzIsNyArNDU0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIG92ZXJsYXktPmxhc3RfZmxpcF9yZXEsCi0JCQkJICAgaW50ZXJydXB0aWJsZSwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJCQkJICAgaW50ZXJydXB0aWJsZSwgTFBfUklORyhkZXZfcHJpdikpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTQ2Nyw3ICs0ODksMTIgQEAKIAkJaWYgKHJlcXVlc3QgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCUJFR0lOX0xQX1JJTkcoMik7CisJCXJldCA9IEJFR0lOX0xQX1JJTkcoMik7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHJlcXVlc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCiAJCU9VVF9SSU5HKE1JX1dBSVRfRk9SX0VWRU5UIHwgTUlfV0FJVF9GT1JfT1ZFUkxBWV9GTElQKTsKIAkJT1VUX1JJTkcoTUlfTk9PUCk7CiAJCUFEVkFOQ0VfTFBfUklORygpOwpAQCAtNzM2LDEzICs3NjMsMTIgQEAKIH0KIAogc3RhdGljIGludCBpbnRlbF9vdmVybGF5X2RvX3B1dF9pbWFnZShzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSwKLQkJCQkgICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5ld19ibywKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqbmV3X2JvLAogCQkJCSAgICAgIHN0cnVjdCBwdXRfaW1hZ2VfcGFyYW1zICpwYXJhbXMpCiB7CiAJaW50IHJldCwgdG1wX3dpZHRoOwogCXN0cnVjdCBvdmVybGF5X3JlZ2lzdGVycyAqcmVnczsKIAlib29sIHNjYWxlX2NoYW5nZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqYm9fcHJpdiA9IHRvX2ludGVsX2JvKG5ld19ibyk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKIAogCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwpAQCAtNzUzLDcgKzc3OSw3IEBACiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihuZXdfYm8sIFBBR0VfU0laRSk7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihuZXdfYm8sIFBBR0VfU0laRSwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03NjEsNiArNzg3LDEwIEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIG91dF91bnBpbjsKIAorCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2UobmV3X2JvKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnBpbjsKKwogCWlmICghb3ZlcmxheS0+YWN0aXZlKSB7CiAJCXJlZ3MgPSBpbnRlbF9vdmVybGF5X21hcF9yZWdzKG92ZXJsYXkpOwogCQlpZiAoIXJlZ3MpIHsKQEAgLTc5Nyw3ICs4MjcsNyBAQAogCXJlZ3MtPlNXSURUSFNXID0gY2FsY19zd2lkdGhzdyhvdmVybGF5LT5kZXYsCiAJCQkJICAgICAgIHBhcmFtcy0+b2Zmc2V0X1ksIHRtcF93aWR0aCk7CiAJcmVncy0+U0hFSUdIVCA9IHBhcmFtcy0+c3JjX2g7Ci0JcmVncy0+T0JVRl8wWSA9IGJvX3ByaXYtPmd0dF9vZmZzZXQgKyBwYXJhbXMtPiBvZmZzZXRfWTsKKwlyZWdzLT5PQlVGXzBZID0gbmV3X2JvLT5ndHRfb2Zmc2V0ICsgcGFyYW1zLT4gb2Zmc2V0X1k7CiAJcmVncy0+T1NUUklERSA9IHBhcmFtcy0+c3RyaWRlX1k7CiAKIAlpZiAocGFyYW1zLT5mb3JtYXQgJiBJOTE1X09WRVJMQVlfWVVWX1BMQU5BUikgewpAQCAtODExLDggKzg0MSw4IEBACiAJCQkJICAgICAgcGFyYW1zLT5zcmNfdy91dl9oc2NhbGUpOwogCQlyZWdzLT5TV0lEVEhTVyB8PSBtYXhfdCh1MzIsIHRtcF9VLCB0bXBfVikgPDwgMTY7CiAJCXJlZ3MtPlNIRUlHSFQgfD0gKHBhcmFtcy0+c3JjX2gvdXZfdnNjYWxlKSA8PCAxNjsKLQkJcmVncy0+T0JVRl8wVSA9IGJvX3ByaXYtPmd0dF9vZmZzZXQgKyBwYXJhbXMtPm9mZnNldF9VOwotCQlyZWdzLT5PQlVGXzBWID0gYm9fcHJpdi0+Z3R0X29mZnNldCArIHBhcmFtcy0+b2Zmc2V0X1Y7CisJCXJlZ3MtPk9CVUZfMFUgPSBuZXdfYm8tPmd0dF9vZmZzZXQgKyBwYXJhbXMtPm9mZnNldF9VOworCQlyZWdzLT5PQlVGXzBWID0gbmV3X2JvLT5ndHRfb2Zmc2V0ICsgcGFyYW1zLT5vZmZzZXRfVjsKIAkJcmVncy0+T1NUUklERSB8PSBwYXJhbXMtPnN0cmlkZV9VViA8PCAxNjsKIAl9CiAKQEAgLTgyOSw3ICs4NTksNyBAQAogCQlnb3RvIG91dF91bnBpbjsKIAogCW92ZXJsYXktPm9sZF92aWRfYm8gPSBvdmVybGF5LT52aWRfYm87Ci0Jb3ZlcmxheS0+dmlkX2JvID0gdG9faW50ZWxfYm8obmV3X2JvKTsKKwlvdmVybGF5LT52aWRfYm8gPSBuZXdfYm87CiAKIAlyZXR1cm4gMDsKIApAQCAtOTQyLDcgKzk3Miw3IEBACiAKIHN0YXRpYyBpbnQgY2hlY2tfb3ZlcmxheV9zcmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IGRybV9pbnRlbF9vdmVybGF5X3B1dF9pbWFnZSAqcmVjLAotCQkJICAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5ld19ibykKKwkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm5ld19ibykKIHsKIAlpbnQgdXZfaHNjYWxlID0gdXZfaHN1YnNhbXBsaW5nKHJlYy0+ZmxhZ3MpOwogCWludCB1dl92c2NhbGUgPSB1dl92c3Vic2FtcGxpbmcocmVjLT5mbGFncyk7CkBAIC0xMDI3LDcgKzEwNTcsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJdG1wID0gcmVjLT5zdHJpZGVfWSpyZWMtPnNyY19oZWlnaHQ7Ci0JCWlmIChyZWMtPm9mZnNldF9ZICsgdG1wID4gbmV3X2JvLT5zaXplKQorCQlpZiAocmVjLT5vZmZzZXRfWSArIHRtcCA+IG5ld19iby0+YmFzZS5zaXplKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCkBAIC0xMDM4LDEyICsxMDY4LDEyIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQl0bXAgPSByZWMtPnN0cmlkZV9ZICogcmVjLT5zcmNfaGVpZ2h0OwotCQlpZiAocmVjLT5vZmZzZXRfWSArIHRtcCA+IG5ld19iby0+c2l6ZSkKKwkJaWYgKHJlYy0+b2Zmc2V0X1kgKyB0bXAgPiBuZXdfYm8tPmJhc2Uuc2l6ZSkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXRtcCA9IHJlYy0+c3RyaWRlX1VWICogKHJlYy0+c3JjX2hlaWdodCAvIHV2X3ZzY2FsZSk7Ci0JCWlmIChyZWMtPm9mZnNldF9VICsgdG1wID4gbmV3X2JvLT5zaXplIHx8Ci0JCSAgICByZWMtPm9mZnNldF9WICsgdG1wID4gbmV3X2JvLT5zaXplKQorCQlpZiAocmVjLT5vZmZzZXRfVSArIHRtcCA+IG5ld19iby0+YmFzZS5zaXplIHx8CisJCSAgICByZWMtPm9mZnNldF9WICsgdG1wID4gbmV3X2JvLT5iYXNlLnNpemUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQpAQCAtMTA4Niw3ICsxMTE2LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheTsKIAlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpkcm1tb2RlX29iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm5ld19ibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqbmV3X2JvOwogCXN0cnVjdCBwdXRfaW1hZ2VfcGFyYW1zICpwYXJhbXM7CiAJaW50IHJldDsKIApAQCAtMTEyNSw4ICsxMTU1LDggQEAKIAl9CiAJY3J0YyA9IHRvX2ludGVsX2NydGMob2JqX3RvX2NydGMoZHJtbW9kZV9vYmopKTsKIAotCW5ld19ibyA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwKLQkJCQkgICAgICAgcHV0X2ltYWdlX3JlYy0+Ym9faGFuZGxlKTsKKwluZXdfYm8gPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsCisJCQkJCQkgICBwdXRfaW1hZ2VfcmVjLT5ib19oYW5kbGUpKTsKIAlpZiAoIW5ld19ibykgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIG91dF9mcmVlOwpAQCAtMTEzNSw2ICsxMTY1LDEyIEBACiAJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCisJaWYgKG5ld19iby0+dGlsaW5nX21vZGUpIHsKKwkJRFJNX0VSUk9SKCJidWZmZXIgdXNlZCBmb3Igb3ZlcmxheSBpbWFnZSBjYW4gbm90IGJlIHRpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwogCXJldCA9IGludGVsX292ZXJsYXlfcmVjb3Zlcl9mcm9tX2ludGVycnVwdChvdmVybGF5LCB0cnVlKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTEyMTcsNyArMTI1Myw3IEBACiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQobmV3X2JvKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmbmV3X2JvLT5iYXNlKTsKIG91dF9mcmVlOgogCWtmcmVlKHBhcmFtcyk7CiAKQEAgLTEzNzAsNyArMTQwNiw3IEBACiB7CiAgICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqcmVnX2JvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpyZWdfYm87CiAJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOwogCWludCByZXQ7CiAKQEAgLTEzODUsNyArMTQyMSw3IEBACiAJcmVnX2JvID0gaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KGRldiwgUEFHRV9TSVpFKTsKIAlpZiAoIXJlZ19ibykKIAkJZ290byBvdXRfZnJlZTsKLQlvdmVybGF5LT5yZWdfYm8gPSB0b19pbnRlbF9ibyhyZWdfYm8pOworCW92ZXJsYXktPnJlZ19ibyA9IHJlZ19ibzsKIAogCWlmIChPVkVSTEFZX05FRURTX1BIWVNJQ0FMKGRldikpIHsKIAkJcmV0ID0gaTkxNV9nZW1fYXR0YWNoX3BoeXNfb2JqZWN0KGRldiwgcmVnX2JvLApAQCAtMTM5NSwxNCArMTQzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIHBoeXMgb3ZlcmxheSByZWdzXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0X2ZyZWVfYm87CiAgICAgICAgICAgICAgICAgfQotCQlvdmVybGF5LT5mbGlwX2FkZHIgPSBvdmVybGF5LT5yZWdfYm8tPnBoeXNfb2JqLT5oYW5kbGUtPmJ1c2FkZHI7CisJCW92ZXJsYXktPmZsaXBfYWRkciA9IHJlZ19iby0+cGh5c19vYmotPmhhbmRsZS0+YnVzYWRkcjsKIAl9IGVsc2UgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKHJlZ19ibywgUEFHRV9TSVpFKTsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihyZWdfYm8sIFBBR0VfU0laRSwgdHJ1ZSk7CiAJCWlmIChyZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBvdmVybGF5IHJlZ2lzdGVyIGJvXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0X2ZyZWVfYm87CiAgICAgICAgICAgICAgICAgfQotCQlvdmVybGF5LT5mbGlwX2FkZHIgPSBvdmVybGF5LT5yZWdfYm8tPmd0dF9vZmZzZXQ7CisJCW92ZXJsYXktPmZsaXBfYWRkciA9IHJlZ19iby0+Z3R0X29mZnNldDsKIAogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ocmVnX2JvLCB0cnVlKTsKIAkJaWYgKHJldCkgewpAQCAtMTQzNCw3ICsxNDcwLDcgQEAKIG91dF91bnBpbl9ibzoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ocmVnX2JvKTsKIG91dF9mcmVlX2JvOgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHJlZ19ibyk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJnJlZ19iby0+YmFzZSk7CiBvdXRfZnJlZToKIAlrZnJlZShvdmVybGF5KTsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwppbmRleCA5MmZmOGYzLi5jNjU5OTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKQEAgLTEyNSwxNSArMTI1LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1MzIgaTkxNV9yZWFkX2JsY19wd21fY3RsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1MzIgdmFsOworCisJLyogUmVzdG9yZSB0aGUgQ1RMIHZhbHVlIGlmIGl0IGxvc3QsIGUuZy4gR1BVIHJlc2V0ICovCisKKwlpZiAoSEFTX1BDSF9TUExJVChkZXZfcHJpdi0+ZGV2KSkgeworCQl2YWwgPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMik7CisJCWlmIChkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMMiA9PSAwKSB7CisJCQlkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMMiA9IHZhbDsKKwkJfSBlbHNlIGlmICh2YWwgPT0gMCkgeworCQkJSTkxNV9XUklURShCTENfUFdNX1BDSF9DVEwyLAorCQkJCSAgIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwpOworCQkJdmFsID0gZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDsKKwkJfQorCX0gZWxzZSB7CisJCXZhbCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7CisJCWlmIChkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMID09IDApIHsKKwkJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgPSB2YWw7CisJCQlkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMMiA9IEk5MTVfUkVBRChCTENfUFdNX0NUTDIpOworCQl9IGVsc2UgaWYgKHZhbCA9PSAwKSB7CisJCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLAorCQkJCSAgIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwpOworCQkJSTkxNV9XUklURShCTENfUFdNX0NUTDIsCisJCQkJICAgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDIpOworCQkJdmFsID0gZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTDsKKwkJfQorCX0KKworCXJldHVybiB2YWw7Cit9CisKIHUzMiBpbnRlbF9wYW5lbF9nZXRfbWF4X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIG1heDsKIAorCW1heCA9IGk5MTVfcmVhZF9ibGNfcHdtX2N0bChkZXZfcHJpdik7CisJaWYgKG1heCA9PSAwKSB7CisJCS8qIFhYWCBhZGQgY29kZSBoZXJlIHRvIHF1ZXJ5IG1vZGUgY2xvY2sgb3IgaGFyZHdhcmUgY2xvY2sKKwkJICogYW5kIHByb2dyYW0gbWF4IFBXTSBhcHByb3ByaWF0ZWx5LgorCQkgKi8KKwkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HICJmaXhtZTogbWF4IFBXTSBpcyB6ZXJvLlxuIik7CisJCXJldHVybiAxOworCX0KKwogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKLQkJbWF4ID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDIpID4+IDE2OworCQltYXggPj49IDE2OwogCX0gZWxzZSB7Ci0JCW1heCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7CiAJCWlmIChJU19QSU5FVklFVyhkZXYpKSB7CiAJCQltYXggPj49IDE3OwogCQl9IGVsc2UgewpAQCAtMTQ2LDE0ICsxODYsNiBAQAogCQkJbWF4ICo9IDB4ZmY7CiAJfQogCi0JaWYgKG1heCA9PSAwKSB7Ci0JCS8qIFhYWCBhZGQgY29kZSBoZXJlIHRvIHF1ZXJ5IG1vZGUgY2xvY2sgb3IgaGFyZHdhcmUgY2xvY2sKLQkJICogYW5kIHByb2dyYW0gbWF4IFBXTSBhcHByb3ByaWF0ZWx5LgotCQkgKi8KLQkJRFJNX0VSUk9SKCJmaXhtZTogbWF4IFBXTSBpcyB6ZXJvLlxuIik7Ci0JCW1heCA9IDE7Ci0JfQotCiAJRFJNX0RFQlVHX0RSSVZFUigibWF4IGJhY2tsaWdodCBQV00gPSAlZFxuIiwgbWF4KTsKIAlyZXR1cm4gbWF4OwogfQpAQCAtMjE4LDMgKzI1MCwzNCBAQAogCQl0bXAgJj0gfkJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CiAJSTkxNV9XUklURShCTENfUFdNX0NUTCwgdG1wIHwgbGV2ZWwpOwogfQorCit2b2lkIGludGVsX3BhbmVsX2Rpc2FibGVfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQpIHsKKwkJZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGludGVsX3BhbmVsX2dldF9iYWNrbGlnaHQoZGV2KTsKKwkJZGV2X3ByaXYtPmJhY2tsaWdodF9lbmFibGVkID0gZmFsc2U7CisJfQorCisJaW50ZWxfcGFuZWxfc2V0X2JhY2tsaWdodChkZXYsIDApOworfQorCit2b2lkIGludGVsX3BhbmVsX2VuYWJsZV9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5iYWNrbGlnaHRfbGV2ZWwgPT0gMCkKKwkJZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGludGVsX3BhbmVsX2dldF9tYXhfYmFja2xpZ2h0KGRldik7CisKKwlpbnRlbF9wYW5lbF9zZXRfYmFja2xpZ2h0KGRldiwgZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCk7CisJZGV2X3ByaXYtPmJhY2tsaWdodF9lbmFibGVkID0gdHJ1ZTsKK30KKwordm9pZCBpbnRlbF9wYW5lbF9zZXR1cF9iYWNrbGlnaHQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPmJhY2tsaWdodF9sZXZlbCA9IGludGVsX3BhbmVsX2dldF9iYWNrbGlnaHQoZGV2KTsKKwlkZXZfcHJpdi0+YmFja2xpZ2h0X2VuYWJsZWQgPSBkZXZfcHJpdi0+YmFja2xpZ2h0X2xldmVsICE9IDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKaW5kZXggMzFjZDdlMy4uMDNlMzM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYwpAQCAtNDgsMTQgKzQ4LDE1IEBACiAJcmV0dXJuIHNlcW5vOwogfQogCi1zdGF0aWMgdm9pZAotcmVuZGVyX3JpbmdfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgaW50CityZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCSAgdTMyCWludmFsaWRhdGVfZG9tYWlucywKIAkJICB1MzIJZmx1c2hfZG9tYWlucykKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBjbWQ7CisJaW50IHJldDsKIAogI2lmIFdBVENIX0VYRUMKIAlEUk1fSU5GTygiJXM6IGludmFsaWRhdGUgJTA4eCBmbHVzaCAlMDh4XG4iLCBfX2Z1bmNfXywKQEAgLTEwOSw0OSArMTEwLDU0IEBACiAJCWlmIChpbnZhbGlkYXRlX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04pCiAJCQljbWQgfD0gTUlfRVhFX0ZMVVNIOwogCisJCWlmIChpbnZhbGlkYXRlX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ09NTUFORCAmJgorCQkgICAgKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSkpCisJCQljbWQgfD0gTUlfSU5WQUxJREFURV9JU1A7CisKICNpZiBXQVRDSF9FWEVDCiAJCURSTV9JTkZPKCIlczogcXVldWUgZmx1c2ggJTA4eCB0byByaW5nXG4iLCBfX2Z1bmNfXywgY21kKTsKICNlbmRpZgotCQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgMik7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGNtZCk7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX05PT1ApOwotCQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKKwkJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIGNtZCk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwkJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCX0KKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3dyaXRlX3RhaWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgdm9pZCByaW5nX3dyaXRlX3RhaWwoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAogCQkJICAgIHUzMiB2YWx1ZSkKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAlJOTE1X1dSSVRFX1RBSUwocmluZywgdmFsdWUpOwogfQogCi11MzIgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit1MzIgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiBhY3RoZF9yZWcgPSBJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0ID8KKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgYWN0aGRfcmVnID0gSU5URUxfSU5GTyhyaW5nLT5kZXYpLT5nZW4gPj0gNCA/CiAJCQlSSU5HX0FDVEhEKHJpbmctPm1taW9fYmFzZSkgOiBBQ1RIRDsKIAogCXJldHVybiBJOTE1X1JFQUQoYWN0aGRfcmVnKTsKIH0KIAotc3RhdGljIGludCBpbml0X3JpbmdfY29tbW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbml0X3JpbmdfY29tbW9uKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gcmluZy0+b2JqOwogCXUzMiBoZWFkOwotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKHJpbmctPmdlbV9vYmplY3QpOwogCiAJLyogU3RvcCB0aGUgcmluZyBpZiBpdCdzIHJ1bm5pbmcuICovCiAJSTkxNV9XUklURV9DVEwocmluZywgMCk7CiAJSTkxNV9XUklURV9IRUFEKHJpbmcsIDApOwotCXJpbmctPndyaXRlX3RhaWwoZGV2LCByaW5nLCAwKTsKKwlyaW5nLT53cml0ZV90YWlsKHJpbmcsIDApOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcmluZy4gKi8KLQlJOTE1X1dSSVRFX1NUQVJUKHJpbmcsIG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKKwlJOTE1X1dSSVRFX1NUQVJUKHJpbmcsIG9iai0+Z3R0X29mZnNldCk7CiAJaGVhZCA9IEk5MTVfUkVBRF9IRUFEKHJpbmcpICYgSEVBRF9BRERSOwogCiAJLyogRzQ1IHJpbmcgaW5pdGlhbGl6YXRpb24gZmFpbHMgdG8gcmVzZXQgaGVhZCB0byB6ZXJvICovCkBAIC0xNzgsMTIgKzE4NCwxMyBAQAogCX0KIAogCUk5MTVfV1JJVEVfQ1RMKHJpbmcsCi0JCQkoKHJpbmctPmdlbV9vYmplY3QtPnNpemUgLSBQQUdFX1NJWkUpICYgUklOR19OUl9QQUdFUykKKwkJCSgocmluZy0+c2l6ZSAtIFBBR0VfU0laRSkgJiBSSU5HX05SX1BBR0VTKQogCQkJfCBSSU5HX1JFUE9SVF82NEsgfCBSSU5HX1ZBTElEKTsKIAotCWhlYWQgPSBJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUjsKIAkvKiBJZiB0aGUgaGVhZCBpcyBzdGlsbCBub3QgemVybywgdGhlIHJpbmcgaXMgZGVhZCAqLwotCWlmIChoZWFkICE9IDApIHsKKwlpZiAoKEk5MTVfUkVBRF9DVEwocmluZykgJiBSSU5HX1ZBTElEKSA9PSAwIHx8CisJICAgIEk5MTVfUkVBRF9TVEFSVChyaW5nKSAhPSBvYmotPmd0dF9vZmZzZXQgfHwKKwkgICAgKEk5MTVfUkVBRF9IRUFEKHJpbmcpICYgSEVBRF9BRERSKSAhPSAwKSB7CiAJCURSTV9FUlJPUigiJXMgaW5pdGlhbGl6YXRpb24gZmFpbGVkICIKIAkJCQkiY3RsICUwOHggaGVhZCAlMDh4IHRhaWwgJTA4eCBzdGFydCAlMDh4XG4iLAogCQkJCXJpbmctPm5hbWUsCkBAIC0xOTQsOCArMjAxLDggQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQotCQlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKKwlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUocmluZy0+ZGV2LCBEUklWRVJfTU9ERVNFVCkpCisJCWk5MTVfa2VybmVsX2xvc3RfY29udGV4dChyaW5nLT5kZXYpOwogCWVsc2UgewogCQlyaW5nLT5oZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFI7CiAJCXJpbmctPnRhaWwgPSBJOTE1X1JFQURfVEFJTChyaW5nKSAmIFRBSUxfQUREUjsKQEAgLTIwMywzMzUgKzIxMCw1NjIgQEAKIAkJaWYgKHJpbmctPnNwYWNlIDwgMCkKIAkJCXJpbmctPnNwYWNlICs9IHJpbmctPnNpemU7CiAJfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9yZW5kZXJfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKKy8qCisgKiA5NjUrIHN1cHBvcnQgUElQRV9DT05UUk9MIGNvbW1hbmRzLCB3aGljaCBwcm92aWRlIGZpbmVyIGdyYWluZWQgY29udHJvbAorICogb3ZlciBjYWNoZSBmbHVzaGluZy4KKyAqLworc3RydWN0IHBpcGVfY29udHJvbCB7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl2b2xhdGlsZSB1MzIgKmNwdV9wYWdlOworCXUzMiBndHRfb2Zmc2V0OworfTsKKworc3RhdGljIGludAoraW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQgPSBpbml0X3JpbmdfY29tbW9uKGRldiwgcmluZyk7Ci0JaW50IG1vZGU7CisJc3RydWN0IHBpcGVfY29udHJvbCAqcGM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlpbnQgcmV0OworCisJaWYgKHJpbmctPnByaXZhdGUpCisJCXJldHVybiAwOworCisJcGMgPSBrbWFsbG9jKHNpemVvZigqcGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChyaW5nLT5kZXYsIDQwOTYpOworCWlmIChvYmogPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzZXFubyBwYWdlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCW9iai0+YWdwX3R5cGUgPSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDQwOTYsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VucmVmOworCisJcGMtPmd0dF9vZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQ7CisJcGMtPmNwdV9wYWdlID0gIGttYXAob2JqLT5wYWdlc1swXSk7CisJaWYgKHBjLT5jcHVfcGFnZSA9PSBOVUxMKQorCQlnb3RvIGVycl91bnBpbjsKKworCXBjLT5vYmogPSBvYmo7CisJcmluZy0+cHJpdmF0ZSA9IHBjOworCXJldHVybiAwOworCitlcnJfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CitlcnJfdW5yZWY6CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CitlcnI6CisJa2ZyZWUocGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitjbGVhbnVwX3BpcGVfY29udHJvbChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IHBpcGVfY29udHJvbCAqcGMgPSByaW5nLT5wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwlpZiAoIXJpbmctPnByaXZhdGUpCisJCXJldHVybjsKKworCW9iaiA9IHBjLT5vYmo7CisJa3VubWFwKG9iai0+cGFnZXNbMF0pOworCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCisJa2ZyZWUocGMpOworCXJpbmctPnByaXZhdGUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGluaXRfcmVuZGVyX3Jpbmcoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0ID0gaW5pdF9yaW5nX2NvbW1vbihyaW5nKTsKIAogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDMpIHsKLQkJbW9kZSA9IFZTX1RJTUVSX0RJU1BBVENIIDw8IDE2IHwgVlNfVElNRVJfRElTUEFUQ0g7CisJCWludCBtb2RlID0gVlNfVElNRVJfRElTUEFUQ0ggPDwgMTYgfCBWU19USU1FUl9ESVNQQVRDSDsKIAkJaWYgKElTX0dFTjYoZGV2KSkKIAkJCW1vZGUgfD0gTUlfRkxVU0hfRU5BQkxFIDw8IDE2IHwgTUlfRkxVU0hfRU5BQkxFOwogCQlJOTE1X1dSSVRFKE1JX01PREUsIG1vZGUpOwogCX0KKworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJfSBlbHNlIGlmIChJU19HRU41KGRldikpIHsKKwkJcmV0ID0gaW5pdF9waXBlX2NvbnRyb2wocmluZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgUElQRV9DT05UUk9MX0ZMVVNIKGFkZHIpCQkJCQlcCitzdGF0aWMgdm9pZCByZW5kZXJfcmluZ19jbGVhbnVwKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlpZiAoIXJpbmctPnByaXZhdGUpCisJCXJldHVybjsKKworCWNsZWFudXBfcGlwZV9jb250cm9sKHJpbmcpOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3NlbWFwaG9yZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBpLCB1MzIgc2Vxbm8pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpZDsKKworCS8qCisJICogY3MgLT4gMSA9IHZjcywgMCA9IGJjcworCSAqIHZjcyAtPiAxID0gYmNzLCAwID0gY3MsCisJICogYmNzIC0+IDEgPSBjcywgMCA9IHZjcy4KKwkgKi8KKwlpZCA9IHJpbmcgLSBkZXZfcHJpdi0+cmluZzsKKwlpZCArPSAyIC0gaTsKKwlpZCAlPSAzOworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQlNSV9TRU1BUEhPUkVfTUJPWCB8CisJCQlNSV9TRU1BUEhPUkVfUkVHSVNURVIgfAorCQkJTUlfU0VNQVBIT1JFX1VQREFURSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywKKwkJCVJJTkdfU1lOQ18wKGRldl9wcml2LT5yaW5nW2lkXS5tbWlvX2Jhc2UpICsgNCppKTsKK30KKworc3RhdGljIGludAorZ2VuNl9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSB1MzIgKnJlc3VsdCkKK3sKKwl1MzIgc2Vxbm87CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgMTApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhyaW5nLT5kZXYpOworCXVwZGF0ZV9zZW1hcGhvcmUocmluZywgMCwgc2Vxbm8pOworCXVwZGF0ZV9zZW1hcGhvcmUocmluZywgMSwgc2Vxbm8pOworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9VU0VSX0lOVEVSUlVQVCk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCisJKnJlc3VsdCA9IHNlcW5vOworCXJldHVybiAwOworfQorCitpbnQKK2ludGVsX3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqdG8sCisJCXUzMiBzZXFubykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQlNSV9TRU1BUEhPUkVfTUJPWCB8CisJCQlNSV9TRU1BUEhPUkVfUkVHSVNURVIgfAorCQkJaW50ZWxfcmluZ19zeW5jX2luZGV4KHJpbmcsIHRvKSA8PCAxNyB8CisJCQlNSV9TRU1BUEhPUkVfQ09NUEFSRSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFBJUEVfQ09OVFJPTF9GTFVTSChyaW5nX18sIGFkZHJfXykJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JT1VUX1JJTkcoR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CQlcCisJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CQlcCiAJCSBQSVBFX0NPTlRST0xfREVQVEhfU1RBTEwgfCAyKTsJCQkJXAotCU9VVF9SSU5HKGFkZHIgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CQkJXAotCU9VVF9SSU5HKDApOwkJCQkJCQlcCi0JT1VUX1JJTkcoMCk7CQkJCQkJCVwKKwlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCAoYWRkcl9fKSB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsJCQlcCisJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgMCk7CQkJCQkJCVwKKwlpbnRlbF9yaW5nX2VtaXQocmluZ19fLCAwKTsJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIG51bWJlciwgZW1pdHRpbmcgYSB3cml0ZSBvZiBpdCB0byB0aGUgc3RhdHVzIHBhZ2UKLSAqIHBsdXMgYW4gaW50ZXJydXB0LCB3aGljaCB3aWxsIHRyaWdnZXIgaTkxNV91c2VyX2ludGVycnVwdF9oYW5kbGVyLgotICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggc3RydWN0X2xvY2sgaGVsZC4KLSAqCi0gKiBSZXR1cm5lZCBzZXF1ZW5jZSBudW1iZXJzIGFyZSBub256ZXJvIG9uIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyB1MzIKLXJlbmRlcl9yaW5nX2FkZF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQl1MzIgZmx1c2hfZG9tYWlucykKK3N0YXRpYyBpbnQKK3BjX3JlbmRlcl9hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSAgICAgIHUzMiAqcmVzdWx0KQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiBzZXFubzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCXUzMiBzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhkZXYpOworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjID0gcmluZy0+cHJpdmF0ZTsKKwl1MzIgc2NyYXRjaF9hZGRyID0gcGMtPmd0dF9vZmZzZXQgKyAxMjg7CisJaW50IHJldDsKIAotCXNlcW5vID0gaTkxNV9nZW1fZ2V0X3NlcW5vKGRldik7CisJLyogRm9yIElyb25sYWtlLCBNSV9VU0VSX0lOVEVSUlVQVCB3YXMgZGVwcmVjYXRlZCBhbmQgYXBwYXJlbnRseQorCSAqIGluY29oZXJlbnQgd2l0aCB3cml0ZXMgdG8gbWVtb3J5LCBpLmUuIGNvbXBsZXRlbHkgZnViYXIsCisJICogc28gd2UgbmVlZCB0byB1c2UgUElQRV9OT1RJRlkgaW5zdGVhZC4KKwkgKgorCSAqIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCB0byB3b3JrYXJvdW5kIHRoZSBxd29yZCB3cml0ZQorCSAqIGluY29oZXJlbmNlIGJ5IGZsdXNoaW5nIHRoZSA2IFBJUEVfTk9USUZZIGJ1ZmZlcnMgb3V0IHRvCisJICogbWVtb3J5IGJlZm9yZSByZXF1ZXN0aW5nIGFuIGludGVycnVwdC4KKwkgKi8KKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDMyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JaWYgKElTX0dFTjYoZGV2KSkgewotCQlCRUdJTl9MUF9SSU5HKDYpOwotCQlPVVRfUklORyhHRlhfT1BfUElQRV9DT05UUk9MIHwgMyk7Ci0JCU9VVF9SSU5HKFBJUEVfQ09OVFJPTF9RV19XUklURSB8Ci0JCQkgUElQRV9DT05UUk9MX1dDX0ZMVVNIIHwgUElQRV9DT05UUk9MX0lTX0ZMVVNIIHwKLQkJCSBQSVBFX0NPTlRST0xfTk9USUZZKTsKLQkJT1VUX1JJTkcoZGV2X3ByaXYtPnNlcW5vX2dmeF9hZGRyIHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOwotCQlPVVRfUklORyhzZXFubyk7Ci0JCU9VVF9SSU5HKDApOwotCQlPVVRfUklORygwKTsKLQkJQURWQU5DRV9MUF9SSU5HKCk7Ci0JfSBlbHNlIGlmIChIQVNfUElQRV9DT05UUk9MKGRldikpIHsKLQkJdTMyIHNjcmF0Y2hfYWRkciA9IGRldl9wcml2LT5zZXFub19nZnhfYWRkciArIDEyODsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CisJCQlQSVBFX0NPTlRST0xfV0NfRkxVU0ggfCBQSVBFX0NPTlRST0xfVENfRkxVU0gpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBwYy0+Z3R0X29mZnNldCB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKKwlzY3JhdGNoX2FkZHIgKz0gMTI4OyAvKiB3cml0ZSB0byBzZXBhcmF0ZSBjYWNoZWxpbmVzICovCisJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7CisJc2NyYXRjaF9hZGRyICs9IDEyODsKKwlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKKwlzY3JhdGNoX2FkZHIgKz0gMTI4OworCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOworCXNjcmF0Y2hfYWRkciArPSAxMjg7CisJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7CisJc2NyYXRjaF9hZGRyICs9IDEyODsKKwlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8CisJCQlQSVBFX0NPTlRST0xfV0NfRkxVU0ggfCBQSVBFX0NPTlRST0xfVENfRkxVU0ggfAorCQkJUElQRV9DT05UUk9MX05PVElGWSk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHBjLT5ndHRfb2Zmc2V0IHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKIAotCQkvKgotCQkgKiBXb3JrYXJvdW5kIHF3b3JkIHdyaXRlIGluY29oZXJlbmNlIGJ5IGZsdXNoaW5nIHRoZQotCQkgKiBQSVBFX05PVElGWSBidWZmZXJzIG91dCB0byBtZW1vcnkgYmVmb3JlIHJlcXVlc3RpbmcKLQkJICogYW4gaW50ZXJydXB0LgotCQkgKi8KLQkJQkVHSU5fTFBfUklORygzMik7Ci0JCU9VVF9SSU5HKEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAotCQkJIFBJUEVfQ09OVFJPTF9XQ19GTFVTSCB8IFBJUEVfQ09OVFJPTF9UQ19GTFVTSCk7Ci0JCU9VVF9SSU5HKGRldl9wcml2LT5zZXFub19nZnhfYWRkciB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsKLQkJT1VUX1JJTkcoc2Vxbm8pOwotCQlPVVRfUklORygwKTsKLQkJUElQRV9DT05UUk9MX0ZMVVNIKHNjcmF0Y2hfYWRkcik7Ci0JCXNjcmF0Y2hfYWRkciArPSAxMjg7IC8qIHdyaXRlIHRvIHNlcGFyYXRlIGNhY2hlbGluZXMgKi8KLQkJUElQRV9DT05UUk9MX0ZMVVNIKHNjcmF0Y2hfYWRkcik7Ci0JCXNjcmF0Y2hfYWRkciArPSAxMjg7Ci0JCVBJUEVfQ09OVFJPTF9GTFVTSChzY3JhdGNoX2FkZHIpOwotCQlzY3JhdGNoX2FkZHIgKz0gMTI4OwotCQlQSVBFX0NPTlRST0xfRkxVU0goc2NyYXRjaF9hZGRyKTsKLQkJc2NyYXRjaF9hZGRyICs9IDEyODsKLQkJUElQRV9DT05UUk9MX0ZMVVNIKHNjcmF0Y2hfYWRkcik7Ci0JCXNjcmF0Y2hfYWRkciArPSAxMjg7Ci0JCVBJUEVfQ09OVFJPTF9GTFVTSChzY3JhdGNoX2FkZHIpOwotCQlPVVRfUklORyhHRlhfT1BfUElQRV9DT05UUk9MIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKLQkJCSBQSVBFX0NPTlRST0xfV0NfRkxVU0ggfCBQSVBFX0NPTlRST0xfVENfRkxVU0ggfAotCQkJIFBJUEVfQ09OVFJPTF9OT1RJRlkpOwotCQlPVVRfUklORyhkZXZfcHJpdi0+c2Vxbm9fZ2Z4X2FkZHIgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7Ci0JCU9VVF9SSU5HKHNlcW5vKTsKLQkJT1VUX1JJTkcoMCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOwotCX0gZWxzZSB7Ci0JCUJFR0lOX0xQX1JJTkcoNCk7Ci0JCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQkJT1VUX1JJTkcoSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKLQkJT1VUX1JJTkcoc2Vxbm8pOworCSpyZXN1bHQgPSBzZXFubzsKKwlyZXR1cm4gMDsKK30KIAotCQlPVVRfUklORyhNSV9VU0VSX0lOVEVSUlVQVCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOwotCX0KLQlyZXR1cm4gc2Vxbm87CitzdGF0aWMgaW50CityZW5kZXJfcmluZ19hZGRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQl1MzIgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCXUzMiBzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfU1RPUkVfRFdPUkRfSU5ERVgpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBJOTE1X0dFTV9IV1NfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1VTRVJfSU5URVJSVVBUKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisKKwkqcmVzdWx0ID0gc2Vxbm87CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1MzIKLXJlbmRlcl9yaW5nX2dldF9zZXFubyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQlpZiAoSEFTX1BJUEVfQ09OVFJPTChkZXYpKQotCQlyZXR1cm4gKCh2b2xhdGlsZSB1MzIgKikoZGV2X3ByaXYtPnNlcW5vX3BhZ2UpKVswXTsKLQllbHNlCi0JCXJldHVybiBpbnRlbF9yZWFkX3N0YXR1c19wYWdlKHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW5kZXJfcmluZ19nZXRfdXNlcl9pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7Ci0JaWYgKGRldi0+aXJxX2VuYWJsZWQgJiYgKCsrcmluZy0+dXNlcl9pcnFfcmVmY291bnQgPT0gMSkpIHsKLQkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJCWlyb25sYWtlX2VuYWJsZV9ncmFwaGljc19pcnEoZGV2X3ByaXYsIEdUX1BJUEVfTk9USUZZKTsKLQkJZWxzZQotCQkJaTkxNV9lbmFibGVfaXJxKGRldl9wcml2LCBJOTE1X1VTRVJfSU5URVJSVVBUKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbmRlcl9yaW5nX3B1dF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKLQlCVUdfT04oZGV2LT5pcnFfZW5hYmxlZCAmJiByaW5nLT51c2VyX2lycV9yZWZjb3VudCA8PSAwKTsKLQlpZiAoZGV2LT5pcnFfZW5hYmxlZCAmJiAoLS1yaW5nLT51c2VyX2lycV9yZWZjb3VudCA9PSAwKSkgewotCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQotCQkJaXJvbmxha2VfZGlzYWJsZV9ncmFwaGljc19pcnEoZGV2X3ByaXYsIEdUX1BJUEVfTk9USUZZKTsKLQkJZWxzZQotCQkJaTkxNV9kaXNhYmxlX2lycShkZXZfcHJpdiwgSTkxNV9VU0VSX0lOVEVSUlVQVCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7Ci19Ci0KLXZvaWQgaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWlmIChJU19HRU42KGRldikpIHsKLQkJSTkxNV9XUklURShSSU5HX0hXU19QR0FfR0VONihyaW5nLT5tbWlvX2Jhc2UpLAotCQkJICAgcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpOwotCQlJOTE1X1JFQUQoUklOR19IV1NfUEdBX0dFTjYocmluZy0+bW1pb19iYXNlKSk7IC8qIHBvc3RpbmcgcmVhZCAqLwotCX0gZWxzZSB7Ci0JCUk5MTVfV1JJVEUoUklOR19IV1NfUEdBKHJpbmctPm1taW9fYmFzZSksCi0JCQkgICByaW5nLT5zdGF0dXNfcGFnZS5nZnhfYWRkcik7Ci0JCUk5MTVfUkVBRChSSU5HX0hXU19QR0EocmluZy0+bW1pb19iYXNlKSk7IC8qIHBvc3RpbmcgcmVhZCAqLwotCX0KLQotfQotCi1zdGF0aWMgdm9pZAotYnNkX3JpbmdfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQl1MzIgICAgIGludmFsaWRhdGVfZG9tYWlucywKLQkJdTMyICAgICBmbHVzaF9kb21haW5zKQotewotCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCAyKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9GTFVTSCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfTk9PUCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9ic2RfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlyZXR1cm4gaW5pdF9yaW5nX2NvbW1vbihkZXYsIHJpbmcpOwotfQotCi1zdGF0aWMgdTMyCi1yaW5nX2FkZF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCSB1MzIgZmx1c2hfZG9tYWlucykKLXsKLQl1MzIgc2Vxbm87Ci0KLQlzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhkZXYpOwotCi0JaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLAotCQkJSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBzZXFubyk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfVVNFUl9JTlRFUlJVUFQpOwotCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOwotCi0JRFJNX0RFQlVHX0RSSVZFUigiJXMgJWRcbiIsIHJpbmctPm5hbWUsIHNlcW5vKTsKLQotCXJldHVybiBzZXFubzsKLX0KLQotc3RhdGljIHZvaWQKLWJzZF9yaW5nX2dldF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JLyogZG8gbm90aGluZyAqLwotfQotc3RhdGljIHZvaWQKLWJzZF9yaW5nX3B1dF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JLyogZG8gbm90aGluZyAqLwotfQotCi1zdGF0aWMgdTMyCi1yaW5nX3N0YXR1c19wYWdlX2dldF9zZXFubyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorcmluZ19nZXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewogCXJldHVybiBpbnRlbF9yZWFkX3N0YXR1c19wYWdlKHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCk7CiB9CiAKLXN0YXRpYyBpbnQKLXJpbmdfZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICpleGVjLAotCQkJICAgICBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHJlY3RzLAotCQkJICAgICB1aW50NjRfdCBleGVjX29mZnNldCkKK3N0YXRpYyB1MzIKK3BjX3JlbmRlcl9nZXRfc2Vxbm8oc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCXVpbnQzMl90IGV4ZWNfc3RhcnQ7Ci0JZXhlY19zdGFydCA9ICh1aW50MzJfdCkgZXhlY19vZmZzZXQgKyBleGVjLT5iYXRjaF9zdGFydF9vZmZzZXQ7Ci0JaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDIpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8Ci0JCQkoMiA8PCA2KSB8IE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NSk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgZXhlY19zdGFydCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7CisJc3RydWN0IHBpcGVfY29udHJvbCAqcGMgPSByaW5nLT5wcml2YXRlOworCXJldHVybiBwYy0+Y3B1X3BhZ2VbMF07Cit9CisKK3N0YXRpYyB2b2lkCitpcm9ubGFrZV9lbmFibGVfaXJxKGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYsIHUzMiBtYXNrKQoreworCWRldl9wcml2LT5ndF9pcnFfbWFzayAmPSB+bWFzazsKKwlJOTE1X1dSSVRFKEdUSU1SLCBkZXZfcHJpdi0+Z3RfaXJxX21hc2spOworCVBPU1RJTkdfUkVBRChHVElNUik7Cit9CisKK3N0YXRpYyB2b2lkCitpcm9ubGFrZV9kaXNhYmxlX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKK3sKKwlkZXZfcHJpdi0+Z3RfaXJxX21hc2sgfD0gbWFzazsKKwlJOTE1X1dSSVRFKEdUSU1SLCBkZXZfcHJpdi0+Z3RfaXJxX21hc2spOworCVBPU1RJTkdfUkVBRChHVElNUik7Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X2VuYWJsZV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCit7CisJZGV2X3ByaXYtPmlycV9tYXNrICY9IH5tYXNrOworCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2spOworCVBPU1RJTkdfUkVBRChJTVIpOworfQorCitzdGF0aWMgdm9pZAoraTkxNV9kaXNhYmxlX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKK3sKKwlkZXZfcHJpdi0+aXJxX21hc2sgfD0gbWFzazsKKwlJOTE1X1dSSVRFKElNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwlQT1NUSU5HX1JFQUQoSU1SKTsKK30KKworc3RhdGljIGJvb2wKK3JlbmRlcl9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIWRldi0+aXJxX2VuYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9jaygmcmluZy0+aXJxX2xvY2spOworCWlmIChyaW5nLT5pcnFfcmVmY291bnQrKyA9PSAwKSB7CisJCWlmIChIQVNfUENIX1NQTElUKGRldikpCisJCQlpcm9ubGFrZV9lbmFibGVfaXJxKGRldl9wcml2LAorCQkJCQkgICAgR1RfUElQRV9OT1RJRlkgfCBHVF9VU0VSX0lOVEVSUlVQVCk7CisJCWVsc2UKKwkJCWk5MTVfZW5hYmxlX2lycShkZXZfcHJpdiwgSTkxNV9VU0VSX0lOVEVSUlVQVCk7CisJfQorCXNwaW5fdW5sb2NrKCZyaW5nLT5pcnFfbG9jayk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQKK3JlbmRlcl9yaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlzcGluX2xvY2soJnJpbmctPmlycV9sb2NrKTsKKwlpZiAoLS1yaW5nLT5pcnFfcmVmY291bnQgPT0gMCkgeworCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQorCQkJaXJvbmxha2VfZGlzYWJsZV9pcnEoZGV2X3ByaXYsCisJCQkJCSAgICAgR1RfVVNFUl9JTlRFUlJVUFQgfAorCQkJCQkgICAgIEdUX1BJUEVfTk9USUZZKTsKKwkJZWxzZQorCQkJaTkxNV9kaXNhYmxlX2lycShkZXZfcHJpdiwgSTkxNV9VU0VSX0lOVEVSUlVQVCk7CisJfQorCXNwaW5fdW5sb2NrKCZyaW5nLT5pcnFfbG9jayk7Cit9CisKK3ZvaWQgaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIG1taW8gPSBJU19HRU42KHJpbmctPmRldikgPworCQlSSU5HX0hXU19QR0FfR0VONihyaW5nLT5tbWlvX2Jhc2UpIDoKKwkJUklOR19IV1NfUEdBKHJpbmctPm1taW9fYmFzZSk7CisJSTkxNV9XUklURShtbWlvLCAodTMyKXJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyKTsKKwlQT1NUSU5HX1JFQUQobW1pbyk7Cit9CisKK3N0YXRpYyBpbnQKK2JzZF9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkgICAgICAgdTMyICAgICBpbnZhbGlkYXRlX2RvbWFpbnMsCisJICAgICAgIHUzMiAgICAgZmx1c2hfZG9tYWlucykKK3sKKwlpbnQgcmV0OworCisJaWYgKChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUikgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRkxVU0gpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXJlbmRlcl9yaW5nX2Rpc3BhdGNoX2dlbV9leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhlYywKLQkJCQkgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cywKLQkJCQkgICAgdWludDY0X3QgZXhlY19vZmZzZXQpCityaW5nX2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJIHUzMiAqcmVzdWx0KQogeworCXUzMiBzZXFubzsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8ocmluZy0+ZGV2KTsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfVVNFUl9JTlRFUlJVUFQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCURSTV9ERUJVR19EUklWRVIoIiVzICVkXG4iLCByaW5nLT5uYW1lLCBzZXFubyk7CisJKnJlc3VsdCA9IHNlcW5vOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbAorcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIGZsYWcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgbmJveCA9IGV4ZWMtPm51bV9jbGlwcmVjdHM7Ci0JaW50IGkgPSAwLCBjb3VudDsKLQl1aW50MzJfdCBleGVjX3N0YXJ0LCBleGVjX2xlbjsKLQlleGVjX3N0YXJ0ID0gKHVpbnQzMl90KSBleGVjX29mZnNldCArIGV4ZWMtPmJhdGNoX3N0YXJ0X29mZnNldDsKLQlleGVjX2xlbiA9ICh1aW50MzJfdCkgZXhlYy0+YmF0Y2hfbGVuOworCisJaWYgKCFkZXYtPmlycV9lbmFibGVkKQorCSAgICAgICByZXR1cm4gZmFsc2U7CisKKwlzcGluX2xvY2soJnJpbmctPmlycV9sb2NrKTsKKwlpZiAocmluZy0+aXJxX3JlZmNvdW50KysgPT0gMCkKKwkJaXJvbmxha2VfZW5hYmxlX2lycShkZXZfcHJpdiwgZmxhZyk7CisJc3Bpbl91bmxvY2soJnJpbmctPmlycV9sb2NrKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIGZsYWcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXNwaW5fbG9jaygmcmluZy0+aXJxX2xvY2spOworCWlmICgtLXJpbmctPmlycV9yZWZjb3VudCA9PSAwKQorCQlpcm9ubGFrZV9kaXNhYmxlX2lycShkZXZfcHJpdiwgZmxhZyk7CisJc3Bpbl91bmxvY2soJnJpbmctPmlycV9sb2NrKTsKK30KKworc3RhdGljIGJvb2wKK2dlbjZfcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIGdmbGFnLCB1MzIgcmZsYWcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghZGV2LT5pcnFfZW5hYmxlZCkKKwkgICAgICAgcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrKCZyaW5nLT5pcnFfbG9jayk7CisJaWYgKHJpbmctPmlycV9yZWZjb3VudCsrID09IDApIHsKKwkJcmluZy0+aXJxX21hc2sgJj0gfnJmbGFnOworCQlJOTE1X1dSSVRFX0lNUihyaW5nLCByaW5nLT5pcnFfbWFzayk7CisJCWlyb25sYWtlX2VuYWJsZV9pcnEoZGV2X3ByaXYsIGdmbGFnKTsKKwl9CisJc3Bpbl91bmxvY2soJnJpbmctPmlycV9sb2NrKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorZ2VuNl9yaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgZ2ZsYWcsIHUzMiByZmxhZykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJc3Bpbl9sb2NrKCZyaW5nLT5pcnFfbG9jayk7CisJaWYgKC0tcmluZy0+aXJxX3JlZmNvdW50ID09IDApIHsKKwkJcmluZy0+aXJxX21hc2sgfD0gcmZsYWc7CisJCUk5MTVfV1JJVEVfSU1SKHJpbmcsIHJpbmctPmlycV9tYXNrKTsKKwkJaXJvbmxha2VfZGlzYWJsZV9pcnEoZGV2X3ByaXYsIGdmbGFnKTsKKwl9CisJc3Bpbl91bmxvY2soJnJpbmctPmlycV9sb2NrKTsKK30KKworc3RhdGljIGJvb2wKK2JzZF9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiByaW5nX2dldF9pcnEocmluZywgR1RfQlNEX1VTRVJfSU5URVJSVVBUKTsKK30KK3N0YXRpYyB2b2lkCitic2RfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyaW5nX3B1dF9pcnEocmluZywgR1RfQlNEX1VTRVJfSU5URVJSVVBUKTsKK30KKworc3RhdGljIGludAorcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQlNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMiA8PCA2KSB8CisJCQlNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBvZmZzZXQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZW5kZXJfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQl1MzIgb2Zmc2V0LCB1MzIgbGVuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldDsKIAogCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3Rfc3VibWl0KGRldiwgZGV2X3ByaXYtPm5leHRfc2Vxbm8gKyAxKTsKIAotCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOworCWlmIChJU19JODMwKGRldikgfHwgSVNfODQ1RyhkZXYpKSB7CisJCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKGkgPCBuYm94KSB7Ci0JCQlpbnQgcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNsaXByZWN0cywgaSwKLQkJCQkJCWV4ZWMtPkRSMSwgZXhlYy0+RFI0KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQorCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfQkFUQ0hfQlVGRkVSKTsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgb2Zmc2V0ICsgbGVuIC0gOCk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwl9IGVsc2UgeworCQlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoSVNfSTgzMChkZXYpIHx8IElTXzg0NUcoZGV2KSkgewotCQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfQkFUQ0hfQlVGRkVSKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQkJCWV4ZWNfc3RhcnQgfCBNSV9CQVRDSF9OT05fU0VDVVJFKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQgKyBleGVjX2xlbiAtIDQpOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywKKwkJCQkJTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikgfAorCQkJCQlNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCk7CiAJCX0gZWxzZSB7Ci0JCQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgMik7Ci0JCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQkJCQlNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMiA8PCA2KQotCQkJCQkJfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQKLQkJCQkJCXwgKDIgPDwgNikpOwotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQgfAotCQkJCQkJTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7Ci0JCQl9CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywKKwkJCQkJTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikpOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOwogCQl9Ci0JCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOwogCX0KLQotCWlmIChJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpIHsKLQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDIpOwotCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9GTFVTSCB8Ci0JCQkJTUlfTk9fV1JJVEVfRkxVU0ggfAotCQkJCU1JX0lOVkFMSURBVEVfSVNQICk7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX05PT1ApOwotCQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKLQl9Ci0JLyogWFhYIGJyZWFkY3J1bWIgKi8KKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9zdGF0dXNfcGFnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyB2b2lkIGNsZWFudXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCiAJb2JqID0gcmluZy0+c3RhdHVzX3BhZ2Uub2JqOwogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuOwotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWt1bm1hcChvYmpfcHJpdi0+cGFnZXNbMF0pOworCWt1bm1hcChvYmotPnBhZ2VzWzBdKTsKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCXJpbmctPnN0YXR1c19wYWdlLm9iaiA9IE5VTEw7CiAKIAltZW1zZXQoJmRldl9wcml2LT5od3NfbWFwLCAwLCBzaXplb2YoZGV2X3ByaXYtPmh3c19tYXApKTsKIH0KIAotc3RhdGljIGludCBpbml0X3N0YXR1c19wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbml0X3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCA0MDk2KTsKQEAgLTU0MCwxNiArNzc0LDE1IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jb2JqX3ByaXYtPmFncF90eXBlID0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKKwlvYmotPmFncF90eXBlID0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCA0MDk2KTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgNDA5NiwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWdvdG8gZXJyX3VucmVmOwogCX0KIAotCXJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JcmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyID0ga21hcChvYmpfcHJpdi0+cGFnZXNbMF0pOworCXJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyID0gb2JqLT5ndHRfb2Zmc2V0OworCXJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9IGttYXAob2JqLT5wYWdlc1swXSk7CiAJaWYgKHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9PSBOVUxMKSB7CiAJCW1lbXNldCgmZGV2X3ByaXYtPmh3c19tYXAsIDAsIHNpemVvZihkZXZfcHJpdi0+aHdzX21hcCkpOwogCQlnb3RvIGVycl91bnBpbjsKQEAgLTU1Nyw3ICs3OTAsNyBAQAogCXJpbmctPnN0YXR1c19wYWdlLm9iaiA9IG9iajsKIAltZW1zZXQocmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyLCAwLCBQQUdFX1NJWkUpOwogCi0JaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShkZXYsIHJpbmcpOworCWludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2UocmluZyk7CiAJRFJNX0RFQlVHX0RSSVZFUigiJXMgaHdzIG9mZnNldDogMHglMDh4XG4iLAogCQkJcmluZy0+bmFtZSwgcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpOwogCkBAIC01NjYsNyArNzk5LDcgQEAKIGVycl91bnBpbjoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIGVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogZXJyOgogCXJldHVybiByZXQ7CiB9CkBAIC01NzQsOSArODA3LDcgQEAKIGludCBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmluZy0+ZGV2ID0gZGV2OwpAQCAtNTg0LDggKzgxNSwxMSBAQAogCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5yZXF1ZXN0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5ncHVfd3JpdGVfbGlzdCk7CiAKKwlzcGluX2xvY2tfaW5pdCgmcmluZy0+aXJxX2xvY2spOworCXJpbmctPmlycV9tYXNrID0gfjA7CisKIAlpZiAoSTkxNV9ORUVEX0dGWF9IV1MoZGV2KSkgewotCQlyZXQgPSBpbml0X3N0YXR1c19wYWdlKGRldiwgcmluZyk7CisJCXJldCA9IGluaXRfc3RhdHVzX3BhZ2UocmluZyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTU5NywxNSArODMxLDE0IEBACiAJCWdvdG8gZXJyX2h3czsKIAl9CiAKLQlyaW5nLT5nZW1fb2JqZWN0ID0gb2JqOworCXJpbmctPm9iaiA9IG9iajsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBQQUdFX1NJWkUpOworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBQQUdFX1NJWkUsIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3VucmVmOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXJpbmctPm1hcC5zaXplID0gcmluZy0+c2l6ZTsKLQlyaW5nLT5tYXAub2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2UgKyBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwlyaW5nLT5tYXAub2Zmc2V0ID0gZGV2LT5hZ3AtPmJhc2UgKyBvYmotPmd0dF9vZmZzZXQ7CiAJcmluZy0+bWFwLnR5cGUgPSAwOwogCXJpbmctPm1hcC5mbGFncyA9IDA7CiAJcmluZy0+bWFwLm10cnIgPSAwOwpAQCAtNjE4LDYwICs4NTEsNjQgQEAKIAl9CiAKIAlyaW5nLT52aXJ0dWFsX3N0YXJ0ID0gcmluZy0+bWFwLmhhbmRsZTsKLQlyZXQgPSByaW5nLT5pbml0KGRldiwgcmluZyk7CisJcmV0ID0gcmluZy0+aW5pdChyaW5nKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bm1hcDsKIAotCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7Ci0JZWxzZSB7Ci0JCXJpbmctPmhlYWQgPSBJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUjsKLQkJcmluZy0+dGFpbCA9IEk5MTVfUkVBRF9UQUlMKHJpbmcpICYgVEFJTF9BRERSOwotCQlyaW5nLT5zcGFjZSA9IHJpbmctPmhlYWQgLSAocmluZy0+dGFpbCArIDgpOwotCQlpZiAocmluZy0+c3BhY2UgPCAwKQotCQkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKLQl9Ci0JcmV0dXJuIHJldDsKKwkvKiBXb3JrYXJvdW5kIGFuIGVycmF0dW0gb24gdGhlIGk4MzAgd2hpY2ggY2F1c2VzIGEgaGFuZyBpZgorCSAqIHRoZSBUQUlMIHBvaW50ZXIgcG9pbnRzIHRvIHdpdGhpbiB0aGUgbGFzdCAyIGNhY2hlbGluZXMKKwkgKiBvZiB0aGUgYnVmZmVyLgorCSAqLworCXJpbmctPmVmZmVjdGl2ZV9zaXplID0gcmluZy0+c2l6ZTsKKwlpZiAoSVNfSTgzMChyaW5nLT5kZXYpKQorCQlyaW5nLT5lZmZlY3RpdmVfc2l6ZSAtPSAxMjg7CisKKwlyZXR1cm4gMDsKIAogZXJyX3VubWFwOgogCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZyaW5nLT5tYXAsIGRldik7CiBlcnJfdW5waW46CiAJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CiBlcnJfdW5yZWY6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQlyaW5nLT5nZW1fb2JqZWN0ID0gTlVMTDsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwlyaW5nLT5vYmogPSBOVUxMOwogZXJyX2h3czoKLQljbGVhbnVwX3N0YXR1c19wYWdlKGRldiwgcmluZyk7CisJY2xlYW51cF9zdGF0dXNfcGFnZShyaW5nKTsKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit2b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWlmIChyaW5nLT5nZW1fb2JqZWN0ID09IE5VTEwpCisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OworCWludCByZXQ7CisKKwlpZiAocmluZy0+b2JqID09IE5VTEwpCiAJCXJldHVybjsKIAotCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZyaW5nLT5tYXAsIGRldik7CisJLyogRGlzYWJsZSB0aGUgcmluZyBidWZmZXIuIFRoZSByaW5nIG11c3QgYmUgaWRsZSBhdCB0aGlzIHBvaW50ICovCisJZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOworCXJldCA9IGludGVsX3dhaXRfcmluZ19idWZmZXIocmluZywgcmluZy0+c2l6ZSAtIDgpOworCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIDApOwogCi0JaTkxNV9nZW1fb2JqZWN0X3VucGluKHJpbmctPmdlbV9vYmplY3QpOwotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHJpbmctPmdlbV9vYmplY3QpOwotCXJpbmctPmdlbV9vYmplY3QgPSBOVUxMOworCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZyaW5nLT5tYXAsIHJpbmctPmRldik7CisKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4ocmluZy0+b2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmcmluZy0+b2JqLT5iYXNlKTsKKwlyaW5nLT5vYmogPSBOVUxMOwogCiAJaWYgKHJpbmctPmNsZWFudXApCiAJCXJpbmctPmNsZWFudXAocmluZyk7CiAKLQljbGVhbnVwX3N0YXR1c19wYWdlKGRldiwgcmluZyk7CisJY2xlYW51cF9zdGF0dXNfcGFnZShyaW5nKTsKIH0KIAotc3RhdGljIGludCBpbnRlbF93cmFwX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW50IGludGVsX3dyYXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewogCXVuc2lnbmVkIGludCAqdmlydDsKLQlpbnQgcmVtOwotCXJlbSA9IHJpbmctPnNpemUgLSByaW5nLT50YWlsOworCWludCByZW0gPSByaW5nLT5zaXplIC0gcmluZy0+dGFpbDsKIAogCWlmIChyaW5nLT5zcGFjZSA8IHJlbSkgewotCQlpbnQgcmV0ID0gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcsIHJlbSk7CisJCWludCByZXQgPSBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHJpbmcsIHJlbSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTY4OSwxMSArOTI2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKQoraW50IGludGVsX3dhaXRfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBlbmQ7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGhlYWQ7CiAKIAl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9iZWdpbiAoZGV2KTsKQEAgLTcxMSw3ICs5NDgsNyBAQAogCQlpZiAocmluZy0+c3BhY2UgPCAwKQogCQkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKIAkJaWYgKHJpbmctPnNwYWNlID49IG4pIHsKLQkJCXRyYWNlX2k5MTVfcmluZ193YWl0X2VuZCAoZGV2KTsKKwkJCXRyYWNlX2k5MTVfcmluZ193YWl0X2VuZChkZXYpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNzIyLDI5ICs5NTksMzkgQEAKIAkJfQogCiAJCW1zbGVlcCgxKTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSkKKwkJCXJldHVybiAtRUFHQUlOOwogCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGVuZCkpOwogCXRyYWNlX2k5MTVfcmluZ193YWl0X2VuZCAoZGV2KTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCi12b2lkIGludGVsX3JpbmdfYmVnaW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgICAgICBpbnQgbnVtX2R3b3JkcykKK2ludCBpbnRlbF9yaW5nX2JlZ2luKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJICAgICBpbnQgbnVtX2R3b3JkcykKIHsKIAlpbnQgbiA9IDQqbnVtX2R3b3JkczsKLQlpZiAodW5saWtlbHkocmluZy0+dGFpbCArIG4gPiByaW5nLT5zaXplKSkKLQkJaW50ZWxfd3JhcF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOwotCWlmICh1bmxpa2VseShyaW5nLT5zcGFjZSA8IG4pKQotCQlpbnRlbF93YWl0X3JpbmdfYnVmZmVyKGRldiwgcmluZywgbik7CisJaW50IHJldDsKKworCWlmICh1bmxpa2VseShyaW5nLT50YWlsICsgbiA+IHJpbmctPmVmZmVjdGl2ZV9zaXplKSkgeworCQlyZXQgPSBpbnRlbF93cmFwX3JpbmdfYnVmZmVyKHJpbmcpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHVubGlrZWx5KHJpbmctPnNwYWNlIDwgbikpIHsKKwkJcmV0ID0gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCBuKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJpbmctPnNwYWNlIC09IG47CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit2b2lkIGludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CiAJcmluZy0+dGFpbCAmPSByaW5nLT5zaXplIC0gMTsKLQlyaW5nLT53cml0ZV90YWlsKGRldiwgcmluZywgcmluZy0+dGFpbCk7CisJcmluZy0+d3JpdGVfdGFpbChyaW5nLCByaW5nLT50YWlsKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciByZW5kZXJfcmluZyA9IHsKQEAgLTc1NiwxMCArMTAwMywxMSBAQAogCS53cml0ZV90YWlsCQk9IHJpbmdfd3JpdGVfdGFpbCwKIAkuZmx1c2gJCQk9IHJlbmRlcl9yaW5nX2ZsdXNoLAogCS5hZGRfcmVxdWVzdAkJPSByZW5kZXJfcmluZ19hZGRfcmVxdWVzdCwKLQkuZ2V0X3NlcW5vCQk9IHJlbmRlcl9yaW5nX2dldF9zZXFubywKLQkudXNlcl9pcnFfZ2V0CQk9IHJlbmRlcl9yaW5nX2dldF91c2VyX2lycSwKLQkudXNlcl9pcnFfcHV0CQk9IHJlbmRlcl9yaW5nX3B1dF91c2VyX2lycSwKLQkuZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIgPSByZW5kZXJfcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlciwKKwkuZ2V0X3NlcW5vCQk9IHJpbmdfZ2V0X3NlcW5vLAorCS5pcnFfZ2V0CQk9IHJlbmRlcl9yaW5nX2dldF9pcnEsCisJLmlycV9wdXQJCT0gcmVuZGVyX3JpbmdfcHV0X2lycSwKKwkuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IHJlbmRlcl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIsCisgICAgICAgLmNsZWFudXAJCQk9IHJlbmRlcl9yaW5nX2NsZWFudXAsCiB9OwogCiAvKiByaW5nIGJ1ZmZlciBmb3IgYml0LXN0cmVhbSBkZWNvZGVyICovCkBAIC03NjksMjIgKzEwMTcsMjEgQEAKIAkuaWQJCQk9IFJJTkdfQlNELAogCS5tbWlvX2Jhc2UJCT0gQlNEX1JJTkdfQkFTRSwKIAkuc2l6ZQkJCT0gMzIgKiBQQUdFX1NJWkUsCi0JLmluaXQJCQk9IGluaXRfYnNkX3JpbmcsCisJLmluaXQJCQk9IGluaXRfcmluZ19jb21tb24sCiAJLndyaXRlX3RhaWwJCT0gcmluZ193cml0ZV90YWlsLAogCS5mbHVzaAkJCT0gYnNkX3JpbmdfZmx1c2gsCiAJLmFkZF9yZXF1ZXN0CQk9IHJpbmdfYWRkX3JlcXVlc3QsCi0JLmdldF9zZXFubwkJPSByaW5nX3N0YXR1c19wYWdlX2dldF9zZXFubywKLQkudXNlcl9pcnFfZ2V0CQk9IGJzZF9yaW5nX2dldF91c2VyX2lycSwKLQkudXNlcl9pcnFfcHV0CQk9IGJzZF9yaW5nX3B1dF91c2VyX2lycSwKLQkuZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIgPSByaW5nX2Rpc3BhdGNoX2dlbV9leGVjYnVmZmVyLAorCS5nZXRfc2Vxbm8JCT0gcmluZ19nZXRfc2Vxbm8sCisJLmlycV9nZXQJCT0gYnNkX3JpbmdfZ2V0X2lycSwKKwkuaXJxX3B1dAkJPSBic2RfcmluZ19wdXRfaXJxLAorCS5kaXNwYXRjaF9leGVjYnVmZmVyCT0gcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAogfTsKIAogCi1zdGF0aWMgdm9pZCBnZW42X2JzZF9yaW5nX3dyaXRlX3RhaWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK3N0YXRpYyB2b2lkIGdlbjZfYnNkX3Jpbmdfd3JpdGVfdGFpbChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJICAgICB1MzIgdmFsdWUpCiB7Ci0gICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAKICAgICAgICAvKiBFdmVyeSB0YWlsIG1vdmUgbXVzdCBmb2xsb3cgdGhlIHNlcXVlbmNlIGJlbG93ICovCiAgICAgICAgSTkxNV9XUklURShHRU42X0JTRF9TTEVFUF9QU01JX0NPTlRST0wsCkBAIC04MDMsNjkgKzEwNTAsMTA5IEBACiAJICAgICAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9SQ19JTERMX01FU1NBR0VfRU5BQkxFKTsKIH0KIAotc3RhdGljIHZvaWQgZ2VuNl9yaW5nX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJICAgIHUzMiBpbnZhbGlkYXRlX2RvbWFpbnMsCi0JCQkgICAgdTMyIGZsdXNoX2RvbWFpbnMpCitzdGF0aWMgaW50IGdlbjZfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkgICB1MzIgaW52YWxpZGF0ZV9kb21haW5zLAorCQkJICAgdTMyIGZsdXNoX2RvbWFpbnMpCiB7Ci0gICAgICAgaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotICAgICAgIGludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX0ZMVVNIX0RXKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKKwlpbnQgcmV0OworCisJaWYgKChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUikgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRkxVU0hfRFcpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotZ2VuNl9yaW5nX2Rpc3BhdGNoX2dlbV9leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICpleGVjLAotCQkJCSAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cywKLQkJCQkgIHVpbnQ2NF90IGV4ZWNfb2Zmc2V0KQorZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJICAgICAgdTMyIG9mZnNldCwgdTMyIGxlbikKIHsKLSAgICAgICB1aW50MzJfdCBleGVjX3N0YXJ0OworICAgICAgIGludCByZXQ7CiAKLSAgICAgICBleGVjX3N0YXJ0ID0gKHVpbnQzMl90KSBleGVjX29mZnNldCArIGV4ZWMtPmJhdGNoX3N0YXJ0X29mZnNldDsKKyAgICAgICByZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworICAgICAgIGlmIChyZXQpCisJICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAgICBpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgMik7Ci0gICAgICAgaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywKLQkJICAgICAgIE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8IE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NSk7CisgICAgICAgaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8IE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NSk7CiAgICAgICAgLyogYml0MC03IGlzIHRoZSBsZW5ndGggb24gR0VONisgKi8KLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBleGVjX3N0YXJ0KTsKLSAgICAgICBpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKKyAgICAgICBpbnRlbF9yaW5nX2VtaXQocmluZywgb2Zmc2V0KTsKKyAgICAgICBpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKICAgICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wKK2dlbjZfcmVuZGVyX3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGdlbjZfcmluZ19nZXRfaXJxKHJpbmcsCisJCQkJIEdUX1VTRVJfSU5URVJSVVBULAorCQkJCSBHRU42X1JFTkRFUl9VU0VSX0lOVEVSUlVQVCk7Cit9CisKK3N0YXRpYyB2b2lkCitnZW42X3JlbmRlcl9yaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiBnZW42X3JpbmdfcHV0X2lycShyaW5nLAorCQkJCSBHVF9VU0VSX0lOVEVSUlVQVCwKKwkJCQkgR0VONl9SRU5ERVJfVVNFUl9JTlRFUlJVUFQpOworfQorCitzdGF0aWMgYm9vbAorZ2VuNl9ic2RfcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gZ2VuNl9yaW5nX2dldF9pcnEocmluZywKKwkJCQkgR1RfR0VONl9CU0RfVVNFUl9JTlRFUlJVUFQsCisJCQkJIEdFTjZfQlNEX1VTRVJfSU5URVJSVVBUKTsKK30KKworc3RhdGljIHZvaWQKK2dlbjZfYnNkX3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGdlbjZfcmluZ19wdXRfaXJxKHJpbmcsCisJCQkJIEdUX0dFTjZfQlNEX1VTRVJfSU5URVJSVVBULAorCQkJCSBHRU42X0JTRF9VU0VSX0lOVEVSUlVQVCk7Cit9CisKIC8qIHJpbmcgYnVmZmVyIGZvciBWaWRlbyBDb2RlYyBmb3IgR2VuNisgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgZ2VuNl9ic2RfcmluZyA9IHsKLSAgICAgICAubmFtZQkJCT0gImdlbjYgYnNkIHJpbmciLAotICAgICAgIC5pZAkJCT0gUklOR19CU0QsCi0gICAgICAgLm1taW9fYmFzZQkJPSBHRU42X0JTRF9SSU5HX0JBU0UsCi0gICAgICAgLnNpemUJCQk9IDMyICogUEFHRV9TSVpFLAotICAgICAgIC5pbml0CQkJPSBpbml0X2JzZF9yaW5nLAotICAgICAgIC53cml0ZV90YWlsCQk9IGdlbjZfYnNkX3Jpbmdfd3JpdGVfdGFpbCwKLSAgICAgICAuZmx1c2gJCQk9IGdlbjZfcmluZ19mbHVzaCwKLSAgICAgICAuYWRkX3JlcXVlc3QJCT0gcmluZ19hZGRfcmVxdWVzdCwKLSAgICAgICAuZ2V0X3NlcW5vCQk9IHJpbmdfc3RhdHVzX3BhZ2VfZ2V0X3NlcW5vLAotICAgICAgIC51c2VyX2lycV9nZXQJCT0gYnNkX3JpbmdfZ2V0X3VzZXJfaXJxLAotICAgICAgIC51c2VyX2lycV9wdXQJCT0gYnNkX3JpbmdfcHV0X3VzZXJfaXJxLAotICAgICAgIC5kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlciwKKwkubmFtZQkJCT0gImdlbjYgYnNkIHJpbmciLAorCS5pZAkJCT0gUklOR19CU0QsCisJLm1taW9fYmFzZQkJPSBHRU42X0JTRF9SSU5HX0JBU0UsCisJLnNpemUJCQk9IDMyICogUEFHRV9TSVpFLAorCS5pbml0CQkJPSBpbml0X3JpbmdfY29tbW9uLAorCS53cml0ZV90YWlsCQk9IGdlbjZfYnNkX3Jpbmdfd3JpdGVfdGFpbCwKKwkuZmx1c2gJCQk9IGdlbjZfcmluZ19mbHVzaCwKKwkuYWRkX3JlcXVlc3QJCT0gZ2VuNl9hZGRfcmVxdWVzdCwKKwkuZ2V0X3NlcW5vCQk9IHJpbmdfZ2V0X3NlcW5vLAorCS5pcnFfZ2V0CQk9IGdlbjZfYnNkX3JpbmdfZ2V0X2lycSwKKwkuaXJxX3B1dAkJPSBnZW42X2JzZF9yaW5nX3B1dF9pcnEsCisJLmRpc3BhdGNoX2V4ZWNidWZmZXIJPSBnZW42X3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlciwKIH07CiAKIC8qIEJsaXR0ZXIgc3VwcG9ydCAoU2FuZHlCcmlkZ2UrKSAqLwogCi1zdGF0aWMgdm9pZAotYmx0X3JpbmdfZ2V0X3VzZXJfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBib29sCitibHRfcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQkvKiBkbyBub3RoaW5nICovCisJcmV0dXJuIGdlbjZfcmluZ19nZXRfaXJxKHJpbmcsCisJCQkJIEdUX0JMVF9VU0VSX0lOVEVSUlVQVCwKKwkJCQkgR0VONl9CTElUVEVSX1VTRVJfSU5URVJSVVBUKTsKIH0KKwogc3RhdGljIHZvaWQKLWJsdF9yaW5nX3B1dF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitibHRfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQkvKiBkbyBub3RoaW5nICovCisJZ2VuNl9yaW5nX3B1dF9pcnEocmluZywKKwkJCSAgR1RfQkxUX1VTRVJfSU5URVJSVVBULAorCQkJICBHRU42X0JMSVRURVJfVVNFUl9JTlRFUlJVUFQpOwogfQogCiAKQEAgLTg4MywzMiArMTE3MCwzMSBAQAogCXJldHVybiByaW5nLT5wcml2YXRlOwogfQogCi1zdGF0aWMgaW50IGJsdF9yaW5nX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW50IGJsdF9yaW5nX2luaXQoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWlmIChORUVEX0JMVF9XT1JLQVJPVU5EKGRldikpIHsKKwlpZiAoTkVFRF9CTFRfV09SS0FST1VORChyaW5nLT5kZXYpKSB7CiAJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0JCXUzMiBfX2lvbWVtICpwdHI7CisJCXUzMiAqcHRyOwogCQlpbnQgcmV0OwogCi0JCW9iaiA9IHRvX2ludGVsX2JvKGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIDQwOTYpKTsKKwkJb2JqID0gaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHJpbmctPmRldiwgNDA5Nik7CiAJCWlmIChvYmogPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4oJm9iai0+YmFzZSwgNDA5Nik7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCA0MDk2LCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJcHRyID0ga21hcChvYmotPnBhZ2VzWzBdKTsKLQkJaW93cml0ZTMyKE1JX0JBVENIX0JVRkZFUl9FTkQsIHB0cik7Ci0JCWlvd3JpdGUzMihNSV9OT09QLCBwdHIrMSk7CisJCSpwdHIrKyA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJCSpwdHIrKyA9IE1JX05PT1A7CiAJCWt1bm1hcChvYmotPnBhZ2VzWzBdKTsKIAotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oJm9iai0+YmFzZSwgZmFsc2UpOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCBmYWxzZSk7CiAJCWlmIChyZXQpIHsKLQkJCWk5MTVfZ2VtX29iamVjdF91bnBpbigmb2JqLT5iYXNlKTsKKwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC05MTYsNTEgKzEyMDIsNDQgQEAKIAkJcmluZy0+cHJpdmF0ZSA9IG9iajsKIAl9CiAKLQlyZXR1cm4gaW5pdF9yaW5nX2NvbW1vbihkZXYsIHJpbmcpOworCXJldHVybiBpbml0X3JpbmdfY29tbW9uKHJpbmcpOwogfQogCi1zdGF0aWMgdm9pZCBibHRfcmluZ19iZWdpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIGludCBibHRfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkgIGludCBudW1fZHdvcmRzKQogewogCWlmIChyaW5nLT5wcml2YXRlKSB7Ci0JCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCBudW1fZHdvcmRzKzIpOwotCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQpOwotCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCB0b19ibHRfd29ya2Fyb3VuZChyaW5nKS0+Z3R0X29mZnNldCk7CisJCWludCByZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIG51bV9kd29yZHMrMik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQpOworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgdG9fYmx0X3dvcmthcm91bmQocmluZyktPmd0dF9vZmZzZXQpOworCisJCXJldHVybiAwOwogCX0gZWxzZQotCQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgNCk7CisJCXJldHVybiBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDQpOwogfQogCi1zdGF0aWMgdm9pZCBibHRfcmluZ19mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIGludCBibHRfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkgICB1MzIgaW52YWxpZGF0ZV9kb21haW5zLAogCQkJICAgdTMyIGZsdXNoX2RvbWFpbnMpCiB7Ci0JYmx0X3JpbmdfYmVnaW4oZGV2LCByaW5nLCA0KTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9GTFVTSF9EVyk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7Ci19CisJaW50IHJldDsKIAotc3RhdGljIHUzMgotYmx0X3JpbmdfYWRkX3JlcXVlc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCSAgICAgdTMyIGZsdXNoX2RvbWFpbnMpCi17Ci0JdTMyIHNlcW5vID0gaTkxNV9nZW1fZ2V0X3NlcW5vKGRldik7CisJaWYgKChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUikgPT0gMCkKKwkJcmV0dXJuIDA7CiAKLQlibHRfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLAotCQkJSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBzZXFubyk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfVVNFUl9JTlRFUlJVUFQpOwotCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOworCXJldCA9IGJsdF9yaW5nX2JlZ2luKHJpbmcsIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlEUk1fREVCVUdfRFJJVkVSKCIlcyAlZFxuIiwgcmluZy0+bmFtZSwgc2Vxbm8pOwotCXJldHVybiBzZXFubzsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRkxVU0hfRFcpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYmx0X3JpbmdfY2xlYW51cChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCkBAIC05ODEsNDcgKzEyNjAsNTYgQEAKICAgICAgICAuaW5pdAkJCT0gYmx0X3JpbmdfaW5pdCwKICAgICAgICAud3JpdGVfdGFpbAkJPSByaW5nX3dyaXRlX3RhaWwsCiAgICAgICAgLmZsdXNoCQkJPSBibHRfcmluZ19mbHVzaCwKLSAgICAgICAuYWRkX3JlcXVlc3QJCT0gYmx0X3JpbmdfYWRkX3JlcXVlc3QsCi0gICAgICAgLmdldF9zZXFubwkJPSByaW5nX3N0YXR1c19wYWdlX2dldF9zZXFubywKLSAgICAgICAudXNlcl9pcnFfZ2V0CQk9IGJsdF9yaW5nX2dldF91c2VyX2lycSwKLSAgICAgICAudXNlcl9pcnFfcHV0CQk9IGJsdF9yaW5nX3B1dF91c2VyX2lycSwKLSAgICAgICAuZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIJPSBnZW42X3JpbmdfZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIsCisgICAgICAgLmFkZF9yZXF1ZXN0CQk9IGdlbjZfYWRkX3JlcXVlc3QsCisgICAgICAgLmdldF9zZXFubwkJPSByaW5nX2dldF9zZXFubywKKyAgICAgICAuaXJxX2dldAkJCT0gYmx0X3JpbmdfZ2V0X2lycSwKKyAgICAgICAuaXJxX3B1dAkJCT0gYmx0X3JpbmdfcHV0X2lycSwKKyAgICAgICAuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyLAogICAgICAgIC5jbGVhbnVwCQkJPSBibHRfcmluZ19jbGVhbnVwLAogfTsKIAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CiAKLQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcgPSByZW5kZXJfcmluZzsKLQotCWlmICghSTkxNV9ORUVEX0dGWF9IV1MoZGV2KSkgewotCQlkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UucGFnZV9hZGRyCi0JCQk9IGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoLT52YWRkcjsKLQkJbWVtc2V0KGRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5wYWdlX2FkZHIsCi0JCQkJMCwgUEFHRV9TSVpFKTsKKwkqcmluZyA9IHJlbmRlcl9yaW5nOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCXJpbmctPmFkZF9yZXF1ZXN0ID0gZ2VuNl9hZGRfcmVxdWVzdDsKKwkJcmluZy0+aXJxX2dldCA9IGdlbjZfcmVuZGVyX3JpbmdfZ2V0X2lycTsKKwkJcmluZy0+aXJxX3B1dCA9IGdlbjZfcmVuZGVyX3JpbmdfcHV0X2lycTsKKwl9IGVsc2UgaWYgKElTX0dFTjUoZGV2KSkgeworCQlyaW5nLT5hZGRfcmVxdWVzdCA9IHBjX3JlbmRlcl9hZGRfcmVxdWVzdDsKKwkJcmluZy0+Z2V0X3NlcW5vID0gcGNfcmVuZGVyX2dldF9zZXFubzsKIAl9CiAKLQlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOworCWlmICghSTkxNV9ORUVEX0dGWF9IV1MoZGV2KSkgeworCQlyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgPSBkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haC0+dmFkZHI7CisJCW1lbXNldChyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIsIDAsIFBBR0VfU0laRSk7CisJfQorCisJcmV0dXJuIGludGVsX2luaXRfcmluZ19idWZmZXIoZGV2LCByaW5nKTsKIH0KIAogaW50IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW1ZDU107CiAKIAlpZiAoSVNfR0VONihkZXYpKQotCQlkZXZfcHJpdi0+YnNkX3JpbmcgPSBnZW42X2JzZF9yaW5nOworCQkqcmluZyA9IGdlbjZfYnNkX3Jpbmc7CiAJZWxzZQotCQlkZXZfcHJpdi0+YnNkX3JpbmcgPSBic2RfcmluZzsKKwkJKnJpbmcgPSBic2RfcmluZzsKIAotCXJldHVybiBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7CisJcmV0dXJuIGludGVsX2luaXRfcmluZ19idWZmZXIoZGV2LCByaW5nKTsKIH0KIAogaW50IGludGVsX2luaXRfYmx0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yaW5nW0JDU107CiAKLQlkZXZfcHJpdi0+Ymx0X3JpbmcgPSBnZW42X2JsdF9yaW5nOworCSpyaW5nID0gZ2VuNl9ibHRfcmluZzsKIAotCXJldHVybiBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5ibHRfcmluZyk7CisJcmV0dXJuIGludGVsX2luaXRfcmluZ19idWZmZXIoZGV2LCByaW5nKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAppbmRleCBkMmNkMGYxLi5iZTkwODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCkBAIC0xLDIyICsxLDQwIEBACiAjaWZuZGVmIF9JTlRFTF9SSU5HQlVGRkVSX0hfCiAjZGVmaW5lIF9JTlRFTF9SSU5HQlVGRkVSX0hfCiAKLXN0cnVjdCAgaW50ZWxfaHdfc3RhdHVzX3BhZ2UgewotCXZvaWQJCSpwYWdlX2FkZHI7Ci0JdW5zaWduZWQgaW50CWdmeF9hZGRyOwotCXN0cnVjdAkJZHJtX2dlbV9vYmplY3QgKm9iajsKK2VudW0geworICAgIFJDUyA9IDB4MCwKKyAgICBWQ1MsCisgICAgQkNTLAorICAgIEk5MTVfTlVNX1JJTkdTLAogfTsKIAotI2RlZmluZSBJOTE1X1JFQURfVEFJTChyaW5nKSBJOTE1X1JFQUQoUklOR19UQUlMKHJpbmctPm1taW9fYmFzZSkpCi0jZGVmaW5lIEk5MTVfV1JJVEVfVEFJTChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19UQUlMKHJpbmctPm1taW9fYmFzZSksIHZhbCkKLSNkZWZpbmUgSTkxNV9SRUFEX1NUQVJUKHJpbmcpIEk5MTVfUkVBRChSSU5HX1NUQVJUKHJpbmctPm1taW9fYmFzZSkpCi0jZGVmaW5lIEk5MTVfV1JJVEVfU1RBUlQocmluZywgdmFsKSBJOTE1X1dSSVRFKFJJTkdfU1RBUlQocmluZy0+bW1pb19iYXNlKSwgdmFsKQotI2RlZmluZSBJOTE1X1JFQURfSEVBRChyaW5nKSBJOTE1X1JFQUQoUklOR19IRUFEKHJpbmctPm1taW9fYmFzZSkpCi0jZGVmaW5lIEk5MTVfV1JJVEVfSEVBRChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19IRUFEKHJpbmctPm1taW9fYmFzZSksIHZhbCkKLSNkZWZpbmUgSTkxNV9SRUFEX0NUTChyaW5nKSBJOTE1X1JFQUQoUklOR19DVEwocmluZy0+bW1pb19iYXNlKSkKLSNkZWZpbmUgSTkxNV9XUklURV9DVEwocmluZywgdmFsKSBJOTE1X1dSSVRFKFJJTkdfQ1RMKHJpbmctPm1taW9fYmFzZSksIHZhbCkKK3N0cnVjdCAgaW50ZWxfaHdfc3RhdHVzX3BhZ2UgeworCXUzMglfX2lvbWVtCSpwYWdlX2FkZHI7CisJdW5zaWduZWQgaW50CWdmeF9hZGRyOworCXN0cnVjdAkJZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworfTsKIAotc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMjsKKyNkZWZpbmUgSTkxNV9SSU5HX1JFQUQocmVnKSBpOTE1X3NhZmVfcmVhZChkZXZfcHJpdiwgcmVnKQorCisjZGVmaW5lIEk5MTVfUkVBRF9UQUlMKHJpbmcpIEk5MTVfUklOR19SRUFEKFJJTkdfVEFJTCgocmluZyktPm1taW9fYmFzZSkpCisjZGVmaW5lIEk5MTVfV1JJVEVfVEFJTChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19UQUlMKChyaW5nKS0+bW1pb19iYXNlKSwgdmFsKQorCisjZGVmaW5lIEk5MTVfUkVBRF9TVEFSVChyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX1NUQVJUKChyaW5nKS0+bW1pb19iYXNlKSkKKyNkZWZpbmUgSTkxNV9XUklURV9TVEFSVChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19TVEFSVCgocmluZyktPm1taW9fYmFzZSksIHZhbCkKKworI2RlZmluZSBJOTE1X1JFQURfSEVBRChyaW5nKSAgSTkxNV9SSU5HX1JFQUQoUklOR19IRUFEKChyaW5nKS0+bW1pb19iYXNlKSkKKyNkZWZpbmUgSTkxNV9XUklURV9IRUFEKHJpbmcsIHZhbCkgSTkxNV9XUklURShSSU5HX0hFQUQoKHJpbmcpLT5tbWlvX2Jhc2UpLCB2YWwpCisKKyNkZWZpbmUgSTkxNV9SRUFEX0NUTChyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX0NUTCgocmluZyktPm1taW9fYmFzZSkpCisjZGVmaW5lIEk5MTVfV1JJVEVfQ1RMKHJpbmcsIHZhbCkgSTkxNV9XUklURShSSU5HX0NUTCgocmluZyktPm1taW9fYmFzZSksIHZhbCkKKworI2RlZmluZSBJOTE1X1dSSVRFX0lNUihyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19JTVIoKHJpbmcpLT5tbWlvX2Jhc2UpLCB2YWwpCisjZGVmaW5lIEk5MTVfUkVBRF9JTVIocmluZykgSTkxNV9SSU5HX1JFQUQoUklOR19JTVIoKHJpbmcpLT5tbWlvX2Jhc2UpKQorCisjZGVmaW5lIEk5MTVfUkVBRF9OT1BJRChyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX05PUElEKChyaW5nKS0+bW1pb19iYXNlKSkKKyNkZWZpbmUgSTkxNV9SRUFEX1NZTkNfMChyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX1NZTkNfMCgocmluZyktPm1taW9fYmFzZSkpCisjZGVmaW5lIEk5MTVfUkVBRF9TWU5DXzEocmluZykgSTkxNV9SSU5HX1JFQUQoUklOR19TWU5DXzEoKHJpbmcpLT5tbWlvX2Jhc2UpKQorCiBzdHJ1Y3QgIGludGVsX3JpbmdfYnVmZmVyIHsKIAljb25zdCBjaGFyCSpuYW1lOwogCWVudW0gaW50ZWxfcmluZ19pZCB7CkBAIC0yNSw0NSArNDMsMzkgQEAKIAkJUklOR19CTFQgPSAweDQsCiAJfSBpZDsKIAl1MzIJCW1taW9fYmFzZTsKLQl1bnNpZ25lZCBsb25nCXNpemU7CiAJdm9pZAkJKnZpcnR1YWxfc3RhcnQ7CiAJc3RydWN0CQlkcm1fZGV2aWNlICpkZXY7Ci0Jc3RydWN0CQlkcm1fZ2VtX29iamVjdCAqZ2VtX29iamVjdDsKKwlzdHJ1Y3QJCWRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAogCXUzMgkJYWN0dWFsX2hlYWQ7CiAJdTMyCQloZWFkOwogCXUzMgkJdGFpbDsKIAlpbnQJCXNwYWNlOworCWludAkJc2l6ZTsKKwlpbnQJCWVmZmVjdGl2ZV9zaXplOwogCXN0cnVjdCBpbnRlbF9od19zdGF0dXNfcGFnZSBzdGF0dXNfcGFnZTsKIAotCXUzMgkJaXJxX2dlbV9zZXFubzsJCS8qIGxhc3Qgc2VxIHNlZW0gYXQgaXJxIHRpbWUgKi8KLQl1MzIJCXdhaXRpbmdfZ2VtX3NlcW5vOwotCWludAkJdXNlcl9pcnFfcmVmY291bnQ7Ci0Jdm9pZAkJKCp1c2VyX2lycV9nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotCXZvaWQJCSgqdXNlcl9pcnFfcHV0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKKwlzcGlubG9ja190CWlycV9sb2NrOworCXUzMgkJaXJxX3JlZmNvdW50OworCXUzMgkJaXJxX21hc2s7CisJdTMyCQlpcnFfc2Vxbm87CQkvKiBsYXN0IHNlcSBzZWVtIGF0IGlycSB0aW1lICovCisJdTMyCQl3YWl0aW5nX3NlcW5vOworCXUzMgkJc3luY19zZXFub1tJOTE1X05VTV9SSU5HUy0xXTsKKwlib29sIF9fbXVzdF9jaGVjayAoKmlycV9nZXQpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CisJdm9pZAkJKCppcnFfcHV0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogCi0JaW50CQkoKmluaXQpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCWludAkJKCppbml0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogCi0Jdm9pZAkJKCp3cml0ZV90YWlsKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwl2b2lkCQkoKndyaXRlX3RhaWwpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCQkgICAgICB1MzIgdmFsdWUpOwotCXZvaWQJCSgqZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQl1MzIJaW52YWxpZGF0ZV9kb21haW5zLAotCQkJdTMyCWZsdXNoX2RvbWFpbnMpOwotCXUzMgkJKCphZGRfcmVxdWVzdCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCXUzMiBmbHVzaF9kb21haW5zKTsKLQl1MzIJCSgqZ2V0X3NlcW5vKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLQlpbnQJCSgqZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICpleGVjLAotCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cywKLQkJCXVpbnQ2NF90IGV4ZWNfb2Zmc2V0KTsKKwlpbnQgX19tdXN0X2NoZWNrICgqZmx1c2gpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgIHUzMglpbnZhbGlkYXRlX2RvbWFpbnMsCisJCQkJICB1MzIJZmx1c2hfZG9tYWlucyk7CisJaW50CQkoKmFkZF9yZXF1ZXN0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgICAgIHUzMiAqc2Vxbm8pOworCXUzMgkJKCpnZXRfc2Vxbm8pKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CisJaW50CQkoKmRpc3BhdGNoX2V4ZWNidWZmZXIpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgpOwogCXZvaWQJCSgqY2xlYW51cCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogCS8qKgpAQCAtOTYsNyArMTA4LDcgQEAKIAkvKioKIAkgKiBEbyB3ZSBoYXZlIHNvbWUgbm90IHlldCBlbWl0dGVkIHJlcXVlc3RzIG91dHN0YW5kaW5nPwogCSAqLwotCWJvb2wgb3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0OworCXUzMiBvdXRzdGFuZGluZ19sYXp5X3JlcXVlc3Q7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CiAJZHJtX2xvY2FsX21hcF90IG1hcDsKQEAgLTEwNSw0NCArMTE3LDU0IEBACiB9OwogCiBzdGF0aWMgaW5saW5lIHUzMgotaW50ZWxfcmVhZF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCWludCByZWcpCitpbnRlbF9yaW5nX3N5bmNfaW5kZXgoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKm90aGVyKQogewotCXUzMiAqcmVncyA9IHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkcjsKLQlyZXR1cm4gcmVnc1tyZWddOworCWludCBpZHg7CisKKwkvKgorCSAqIGNzIC0+IDAgPSB2Y3MsIDEgPSBiY3MKKwkgKiB2Y3MgLT4gMCA9IGJjcywgMSA9IGNzLAorCSAqIGJjcyAtPiAwID0gY3MsIDEgPSB2Y3MuCisJICovCisKKwlpZHggPSAob3RoZXIgLSByaW5nKSAtIDE7CisJaWYgKGlkeCA8IDApCisJCWlkeCArPSBJOTE1X05VTV9SSU5HUzsKKworCXJldHVybiBpZHg7CiB9CiAKLWludCBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLWludCBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKLXZvaWQgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGludGVsX3JpbmdfZW1pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YSkKK3N0YXRpYyBpbmxpbmUgdTMyCitpbnRlbF9yZWFkX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJICAgICAgIGludCByZWcpCiB7Ci0JdW5zaWduZWQgaW50ICp2aXJ0ID0gcmluZy0+dmlydHVhbF9zdGFydCArIHJpbmctPnRhaWw7Ci0JKnZpcnQgPSBkYXRhOworCXJldHVybiBpb3JlYWQzMihyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgKyByZWcpOworfQorCit2b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKK2ludCBfX211c3RfY2hlY2sgaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKK2ludCBfX211c3RfY2hlY2sgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX3JpbmdfZW1pdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgdTMyIGRhdGEpCit7CisJaW93cml0ZTMyKGRhdGEsIHJpbmctPnZpcnR1YWxfc3RhcnQgKyByaW5nLT50YWlsKTsKIAlyaW5nLT50YWlsICs9IDQ7CiB9CiAKLXZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogCi11MzIgaW50ZWxfcmluZ19nZXRfc2Vxbm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKK3UzMiBpbnRlbF9yaW5nX2dldF9zZXFubyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworaW50IGludGVsX3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAorCQkgICAgdTMyIHNlcW5vKTsKIAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYmx0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi11MzIgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwordTMyIGludGVsX3JpbmdfZ2V0X2FjdGl2ZV9oZWFkKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogI2VuZGlmIC8qIF9JTlRFTF9SSU5HQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNmJjNDJmYS4uNDVjZDM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMTAyNCw5ICsxMDI0LDEzIEBACiAJaWYgKCFpbnRlbF9zZHZvX3NldF90YXJnZXRfaW5wdXQoaW50ZWxfc2R2bykpCiAJCXJldHVybjsKIAotCWlmIChpbnRlbF9zZHZvLT5oYXNfaGRtaV9tb25pdG9yICYmCi0JICAgICFpbnRlbF9zZHZvX3NldF9hdmlfaW5mb2ZyYW1lKGludGVsX3Nkdm8pKQotCQlyZXR1cm47CisJaWYgKGludGVsX3Nkdm8tPmhhc19oZG1pX21vbml0b3IpIHsKKwkJaW50ZWxfc2R2b19zZXRfZW5jb2RlKGludGVsX3Nkdm8sIFNEVk9fRU5DT0RFX0hETUkpOworCQlpbnRlbF9zZHZvX3NldF9jb2xvcmltZXRyeShpbnRlbF9zZHZvLAorCQkJCQkgICBTRFZPX0NPTE9SSU1FVFJZX1JHQjI1Nik7CisJCWludGVsX3Nkdm9fc2V0X2F2aV9pbmZvZnJhbWUoaW50ZWxfc2R2byk7CisJfSBlbHNlCisJCWludGVsX3Nkdm9fc2V0X2VuY29kZShpbnRlbF9zZHZvLCBTRFZPX0VOQ09ERV9EVkkpOwogCiAJaWYgKGludGVsX3Nkdm8tPmlzX3R2ICYmCiAJICAgICFpbnRlbF9zZHZvX3NldF90dl9mb3JtYXQoaW50ZWxfc2R2bykpCkBAIC0xMDQ1LDcgKzEwNDksOSBAQAogCiAJLyogU2V0IHRoZSBTRFZPIGNvbnRyb2wgcmVncy4gKi8KIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQlzZHZveCA9IFNEVk9fQk9SREVSX0VOQUJMRTsKKwkJc2R2b3ggPSAwOworCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1KQorCQkJc2R2b3ggfD0gU0RWT19CT1JERVJfRU5BQkxFOwogCQlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKIAkJCXNkdm94IHw9IFNEVk9fVlNZTkNfQUNUSVZFX0hJR0g7CiAJCWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQpAQCAtMTA3NSw3ICsxMDgxLDggQEAKIAkJc2R2b3ggfD0gKHBpeGVsX211bHRpcGxpZXIgLSAxKSA8PCBTRFZPX1BPUlRfTVVMVElQTFlfU0hJRlQ7CiAJfQogCi0JaWYgKGlucHV0X2R0ZC5wYXJ0Mi5zZHZvX2ZsYWdzICYgU0RWT19ORUVEX1RPX1NUQUxMKQorCWlmIChpbnB1dF9kdGQucGFydDIuc2R2b19mbGFncyAmIFNEVk9fTkVFRF9UT19TVEFMTCAmJgorCSAgICBJTlRFTF9JTkZPKGRldiktPmdlbiA8IDUpCiAJCXNkdm94IHw9IFNEVk9fU1RBTExfU0VMRUNUOwogCWludGVsX3Nkdm9fd3JpdGVfc2R2b3goaW50ZWxfc2R2bywgc2R2b3gpOwogfQpAQCAtMTM5NSw2ICsxNDAyLDkgQEAKIAogCWludGVsX3Nkdm8tPmF0dGFjaGVkX291dHB1dCA9IHJlc3BvbnNlOwogCisJaW50ZWxfc2R2by0+aGFzX2hkbWlfbW9uaXRvciA9IGZhbHNlOworCWludGVsX3Nkdm8tPmhhc19oZG1pX2F1ZGlvID0gZmFsc2U7CisKIAlpZiAoKGludGVsX3Nkdm9fY29ubmVjdG9yLT5vdXRwdXRfZmxhZyAmIHJlc3BvbnNlKSA9PSAwKQogCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKIAllbHNlIGlmIChyZXNwb25zZSAmIFNEVk9fVE1EU19NQVNLKQpAQCAtMTkxOSwyMCArMTkyOSw3IEBACiBzdGF0aWMgYm9vbAogaW50ZWxfc2R2b19pc19oZG1pX2Nvbm5lY3RvcihzdHJ1Y3QgaW50ZWxfc2R2byAqaW50ZWxfc2R2bywgaW50IGRldmljZSkKIHsKLQlpbnQgaXNfaGRtaTsKLQotCWlmICghaW50ZWxfc2R2b19jaGVja19zdXBwX2VuY29kZShpbnRlbF9zZHZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFpbnRlbF9zZHZvX3NldF90YXJnZXRfb3V0cHV0KGludGVsX3Nkdm8sCi0JCQkJCSAgZGV2aWNlID09IDAgPyBTRFZPX09VVFBVVF9UTURTMCA6IFNEVk9fT1VUUFVUX1RNRFMxKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaXNfaGRtaSA9IDA7Ci0JaWYgKCFpbnRlbF9zZHZvX2dldF92YWx1ZShpbnRlbF9zZHZvLCBTRFZPX0NNRF9HRVRfRU5DT0RFLCAmaXNfaGRtaSwgMSkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiAhIWlzX2hkbWk7CisJcmV0dXJuIGludGVsX3Nkdm9fY2hlY2tfc3VwcF9lbmNvZGUoaW50ZWxfc2R2byk7CiB9CiAKIHN0YXRpYyB1OApAQCAtMjAzNCwxMiArMjAzMSw3IEBACiAJY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOwogCiAJaWYgKGludGVsX3Nkdm9faXNfaGRtaV9jb25uZWN0b3IoaW50ZWxfc2R2bywgZGV2aWNlKSkgewotCQkvKiBlbmFibGUgaGRtaSBlbmNvZGluZyBtb2RlIGlmIHN1cHBvcnRlZCAqLwotCQlpbnRlbF9zZHZvX3NldF9lbmNvZGUoaW50ZWxfc2R2bywgU0RWT19FTkNPREVfSERNSSk7Ci0JCWludGVsX3Nkdm9fc2V0X2NvbG9yaW1ldHJ5KGludGVsX3Nkdm8sCi0JCQkJCSAgIFNEVk9fQ09MT1JJTUVUUllfUkdCMjU2KTsKIAkJY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQTsKLQogCQlpbnRlbF9zZHZvLT5pc19oZG1pID0gdHJ1ZTsKIAl9CiAJaW50ZWxfc2R2by0+YmFzZS5jbG9uZV9tYXNrID0gKCgxIDw8IElOVEVMX1NEVk9fTk9OX1RWX0NMT05FX0JJVCkgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKaW5kZXggMmY3NjgxOS4uOTMyMDZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCkBAIC0xMjQ1LDEwICsxMjQ1LDExIEBACiAJaW50IHR5cGU7CiAKIAkvKiBEaXNhYmxlIFRWIGludGVycnVwdHMgYXJvdW5kIGxvYWQgZGV0ZWN0IG9yIHdlJ2xsIHJlY3Vyc2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKLQlpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZGV2X3ByaXYsIDAsIFBJUEVfSE9UUExVR19JTlRFUlJVUFRfRU5BQkxFIHwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLAorCQkJICAgICAgUElQRV9IT1RQTFVHX0lOVEVSUlVQVF9FTkFCTEUgfAogCQkJICAgICAgUElQRV9IT1RQTFVHX1RWX0lOVEVSUlVQVF9FTkFCTEUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAKIAlzYXZlX3R2X2RhYyA9IHR2X2RhYyA9IEk5MTVfUkVBRChUVl9EQUMpOwogCXNhdmVfdHZfY3RsID0gdHZfY3RsID0gSTkxNV9SRUFEKFRWX0NUTCk7CkBAIC0xMzAxLDEwICsxMzAyLDExIEBACiAJSTkxNV9XUklURShUVl9DVEwsIHNhdmVfdHZfY3RsKTsKIAogCS8qIFJlc3RvcmUgaW50ZXJydXB0IGNvbmZpZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOwotCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLCBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRSB8CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLAorCQkJICAgICBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRSB8CiAJCQkgICAgIFBJUEVfSE9UUExVR19UVl9JTlRFUlJVUFRfRU5BQkxFKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCiAJcmV0dXJuIHR5cGU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZwppbmRleCA3MjczMGU5Li4yMWQ2YzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKQEAgLTEwLDcgKzEwLDcgQEAKIAlzZWxlY3QgRkIKIAlzZWxlY3QgRlJBTUVCVUZGRVJfQ09OU09MRSBpZiAhRU1CRURERUQKIAlzZWxlY3QgRkJfQkFDS0xJR0hUIGlmIERSTV9OT1VWRUFVX0JBQ0tMSUdIVAotCXNlbGVjdCBBQ1BJX1ZJREVPIGlmIEFDUEkKKwlzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJICYmIFg4NiAmJiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIFZJREVPX09VVFBVVF9DT05UUk9MICYmIElOUFVUCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGZvciBvcGVuLXNvdXJjZSBuVmlkaWEgc3VwcG9ydC4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQppbmRleCAyM2ZhODJkLi5lMTJjOTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9NYWtlZmlsZQpAQCAtNSwyNyArNSwzMiBAQAogY2NmbGFncy15IDo9IC1JaW5jbHVkZS9kcm0KIG5vdXZlYXUteSA6PSBub3V2ZWF1X2Rydi5vIG5vdXZlYXVfc3RhdGUubyBub3V2ZWF1X2NoYW5uZWwubyBub3V2ZWF1X21lbS5vIFwKICAgICAgICAgICAgICBub3V2ZWF1X29iamVjdC5vIG5vdXZlYXVfaXJxLm8gbm91dmVhdV9ub3RpZmllci5vIFwKLSAgICAgICAgICAgICBub3V2ZWF1X3NnZG1hLm8gbm91dmVhdV9kbWEubyBcCisgICAgICAgICAgICAgbm91dmVhdV9zZ2RtYS5vIG5vdXZlYXVfZG1hLm8gbm91dmVhdV91dGlsLm8gXAogICAgICAgICAgICAgIG5vdXZlYXVfYm8ubyBub3V2ZWF1X2ZlbmNlLm8gbm91dmVhdV9nZW0ubyBub3V2ZWF1X3R0bS5vIFwKICAgICAgICAgICAgICBub3V2ZWF1X2h3Lm8gbm91dmVhdV9jYWxjLm8gbm91dmVhdV9iaW9zLm8gbm91dmVhdV9pMmMubyBcCiAgICAgICAgICAgICAgbm91dmVhdV9kaXNwbGF5Lm8gbm91dmVhdV9jb25uZWN0b3IubyBub3V2ZWF1X2ZiY29uLm8gXAogICAgICAgICAgICAgIG5vdXZlYXVfZHAubyBub3V2ZWF1X3JhbWh0Lm8gXAogCSAgICAgbm91dmVhdV9wbS5vIG5vdXZlYXVfdm9sdC5vIG5vdXZlYXVfcGVyZi5vIG5vdXZlYXVfdGVtcC5vIFwKKwkgICAgIG5vdXZlYXVfbW0ubyBub3V2ZWF1X3ZtLm8gXAogICAgICAgICAgICAgIG52MDRfdGltZXIubyBcCiAgICAgICAgICAgICAgbnYwNF9tYy5vIG52NDBfbWMubyBudjUwX21jLm8gXAogICAgICAgICAgICAgIG52MDRfZmIubyBudjEwX2ZiLm8gbnYzMF9mYi5vIG52NDBfZmIubyBudjUwX2ZiLm8gbnZjMF9mYi5vIFwKICAgICAgICAgICAgICBudjA0X2ZpZm8ubyBudjEwX2ZpZm8ubyBudjQwX2ZpZm8ubyBudjUwX2ZpZm8ubyBudmMwX2ZpZm8ubyBcCiAgICAgICAgICAgICAgbnYwNF9ncmFwaC5vIG52MTBfZ3JhcGgubyBudjIwX2dyYXBoLm8gXAogICAgICAgICAgICAgIG52NDBfZ3JhcGgubyBudjUwX2dyYXBoLm8gbnZjMF9ncmFwaC5vIFwKLSAgICAgICAgICAgICBudjQwX2dyY3R4Lm8gbnY1MF9ncmN0eC5vIFwKKyAgICAgICAgICAgICBudjQwX2dyY3R4Lm8gbnY1MF9ncmN0eC5vIG52YzBfZ3JjdHgubyBcCisgICAgICAgICAgICAgbnY4NF9jcnlwdC5vIFwKICAgICAgICAgICAgICBudjA0X2luc3RtZW0ubyBudjUwX2luc3RtZW0ubyBudmMwX2luc3RtZW0ubyBcCi0gICAgICAgICAgICAgbnY1MF9jcnRjLm8gbnY1MF9kYWMubyBudjUwX3Nvci5vIFwKLSAgICAgICAgICAgICBudjUwX2N1cnNvci5vIG52NTBfZGlzcGxheS5vIG52NTBfZmJjb24ubyBcCisgICAgICAgICAgICAgbnY1MF9ldm8ubyBudjUwX2NydGMubyBudjUwX2RhYy5vIG52NTBfc29yLm8gXAorICAgICAgICAgICAgIG52NTBfY3Vyc29yLm8gbnY1MF9kaXNwbGF5Lm8gXAogICAgICAgICAgICAgIG52MDRfZGFjLm8gbnYwNF9kZnAubyBudjA0X3R2Lm8gbnYxN190di5vIG52MTdfdHZfbW9kZXMubyBcCi0gICAgICAgICAgICAgbnYwNF9jcnRjLm8gbnYwNF9kaXNwbGF5Lm8gbnYwNF9jdXJzb3IubyBudjA0X2ZiY29uLm8gXAorICAgICAgICAgICAgIG52MDRfY3J0Yy5vIG52MDRfZGlzcGxheS5vIG52MDRfY3Vyc29yLm8gXAorICAgICAgICAgICAgIG52MDRfZmJjb24ubyBudjUwX2ZiY29uLm8gbnZjMF9mYmNvbi5vIFwKICAgICAgICAgICAgICBudjEwX2dwaW8ubyBudjUwX2dwaW8ubyBcCiAJICAgICBudjUwX2NhbGMubyBcCi0JICAgICBudjA0X3BtLm8gbnY1MF9wbS5vIG52YTNfcG0ubworCSAgICAgbnYwNF9wbS5vIG52NTBfcG0ubyBudmEzX3BtLm8gXAorCSAgICAgbnY1MF92cmFtLm8gbnZjMF92cmFtLm8gXAorCSAgICAgbnY1MF92bS5vIG52YzBfdm0ubwogCiBub3V2ZWF1LSQoQ09ORklHX0RSTV9OT1VWRUFVX0RFQlVHKSArPSBub3V2ZWF1X2RlYnVnZnMubwogbm91dmVhdS0kKENPTkZJR19DT01QQVQpICs9IG5vdXZlYXVfaW9jMzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwppbmRleCAxMTkxNTI2Li5hNTQyMzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYwpAQCAtMTMwLDEwICsxMzAsMTUgQEAKIAogc3RhdGljIGludCBub3V2ZWF1X2RzbV9nZXRfY2xpZW50X2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWlmIChub3V2ZWF1X2RzbV9wcml2LmRoYW5kbGUgPT0gREVWSUNFX0FDUElfSEFORExFKCZwZGV2LT5kZXYpKQorCS8qIGVhc3kgb3B0aW9uIG9uZSAtIGludGVsIHZlbmRvciBJRCBtZWFucyBJbnRlZ3JhdGVkICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKQogCQlyZXR1cm4gVkdBX1NXSVRDSEVST09fSUdEOwotCWVsc2UKLQkJcmV0dXJuIFZHQV9TV0lUQ0hFUk9PX0RJUzsKKworCS8qIGlzIHRoaXMgZGV2aWNlIG9uIEJ1cyAwPyAtIHRoaXMgbWF5IG5lZWQgaW1wcm92aW5nICovCisJaWYgKHBkZXYtPmJ1cy0+bnVtYmVyID09IDApCisJCXJldHVybiBWR0FfU1dJVENIRVJPT19JR0Q7CisKKwlyZXR1cm4gVkdBX1NXSVRDSEVST09fRElTOwogfQogCiBzdGF0aWMgc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2hhbmRsZXIgbm91dmVhdV9kc21faGFuZGxlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmFja2xpZ2h0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JhY2tsaWdodC5jCmluZGV4IGIxNGM4MTEuLmQzYTljNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iYWNrbGlnaHQuYwpAQCAtNTksNyArNTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY0MF9ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY0MF9ibF9vcHMgPSB7CiAJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCiAJLmdldF9icmlnaHRuZXNzID0gbnY0MF9nZXRfaW50ZW5zaXR5LAogCS51cGRhdGVfc3RhdHVzID0gbnY0MF9zZXRfaW50ZW5zaXR5LApAQCAtODIsNyArODIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY1MF9ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnY1MF9ibF9vcHMgPSB7CiAJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCiAJLmdldF9icmlnaHRuZXNzID0gbnY1MF9nZXRfaW50ZW5zaXR5LAogCS51cGRhdGVfc3RhdHVzID0gbnY1MF9zZXRfaW50ZW5zaXR5LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwppbmRleCBiMjI5MzU3Li4yYWVmNWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYwpAQCAtMTkyNyw3ICsxOTI3LDcgQEAKIAkgKiBvZmZzZXQgICAgICAoOCAgYml0KTogb3Bjb2RlCiAJICogb2Zmc2V0ICsgMSAgKDE2IGJpdCk6IHRpbWUKIAkgKgotCSAqIFNsZWVwIGZvciAidGltZSIgbWlsaXNlY29uZHMuCisJICogU2xlZXAgZm9yICJ0aW1lIiBtaWxsaXNlY29uZHMuCiAJICovCiAKIAl1bnNpZ25lZCB0aW1lID0gUk9NMTYoYmlvcy0+ZGF0YVtvZmZzZXQgKyAxXSk7CkBAIC0xOTM1LDcgKzE5MzUsNyBAQAogCWlmICghaWV4ZWMtPmV4ZWN1dGUpCiAJCXJldHVybiAzOwogCi0JQklPU0xPRyhiaW9zLCAiMHglMDRYOiBTbGVlcGluZyBmb3IgMHglMDRYIG1pbGlzZWNvbmRzXG4iLAorCUJJT1NMT0coYmlvcywgIjB4JTA0WDogU2xlZXBpbmcgZm9yIDB4JTA0WCBtaWxsaXNlY29uZHNcbiIsCiAJCW9mZnNldCwgdGltZSk7CiAKIAltc2xlZXAodGltZSk7CkBAIC02MDUzLDUyICs2MDUzLDE3IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCi1zdGF0aWMgdm9pZCBmYWJyaWNhdGVfdmdhX291dHB1dChzdHJ1Y3QgZGNiX3RhYmxlICpkY2IsIGludCBpMmMsIGludCBoZWFkcykKK3N0YXRpYyB2b2lkIGZhYnJpY2F0ZV9kY2Jfb3V0cHV0KHN0cnVjdCBkY2JfdGFibGUgKmRjYiwgaW50IHR5cGUsIGludCBpMmMsCisJCQkJIGludCBoZWFkcywgaW50IG9yKQogewogCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gbmV3X2RjYl9lbnRyeShkY2IpOwogCi0JZW50cnktPnR5cGUgPSAwOworCWVudHJ5LT50eXBlID0gdHlwZTsKIAllbnRyeS0+aTJjX2luZGV4ID0gaTJjOwogCWVudHJ5LT5oZWFkcyA9IGhlYWRzOwotCWVudHJ5LT5sb2NhdGlvbiA9IERDQl9MT0NfT05fQ0hJUDsKLQllbnRyeS0+b3IgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBmYWJyaWNhdGVfZHZpX2lfb3V0cHV0KHN0cnVjdCBkY2JfdGFibGUgKmRjYiwgYm9vbCB0d29IZWFkcykKLXsKLQlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9IG5ld19kY2JfZW50cnkoZGNiKTsKLQotCWVudHJ5LT50eXBlID0gMjsKLQllbnRyeS0+aTJjX2luZGV4ID0gTEVHQUNZX0kyQ19QQU5FTDsKLQllbnRyeS0+aGVhZHMgPSB0d29IZWFkcyA/IDMgOiAxOwotCWVudHJ5LT5sb2NhdGlvbiA9ICFEQ0JfTE9DX09OX0NISVA7CS8qIGllIE9GRiBDSElQICovCi0JZW50cnktPm9yID0gMTsJLyogbWVhbnMgfDB4MTAgZ2V0cyBzZXQgb24gQ1JFX0xDRF9fSU5ERVggKi8KLQllbnRyeS0+ZHVhbGxpbmtfcG9zc2libGUgPSBmYWxzZTsgLyogU2lJMTY0IGFuZCBjby4gYXJlIHNpbmdsZSBsaW5rICovCi0KLSNpZiAwCi0JLyoKLQkgKiBGb3IgZHZpLWEgZWl0aGVyIGNydGMgcHJvYmFibHkgd29ya3MsIGJ1dCBteSBjYXJkIGFwcGVhcnMgdG8gb25seQotCSAqIHN1cHBvcnQgZHZpLWQuICAibnZpZGlhIiBzdGlsbCBhdHRlbXB0cyB0byBwcm9ncmFtIGl0IGZvciBkdmktYSwKLQkgKiBkb2luZyB0aGUgZnVsbCBmcCBvdXRwdXQgc2V0dXAgKHByb2dyYW0gMHg2ODA4Li4gZnAgZGltZW5zaW9uIHJlZ3MsCi0JICogc2V0dGluZyAweDY4MDg0OCB0byAweDEwMDAwMTExIHRvIGVuYWJsZSwgbWF5YmUgc2V0dGluZyAweDY4MDg4MCk7Ci0JICogdGhlIG1vbml0b3IgcGlja3MgdXAgdGhlIG1vZGUgcmVzIG9rIGFuZCBsaWdodHMgdXAsIGJ1dCBubyBwaXhlbAotCSAqIGRhdGEgYXBwZWFycywgc28gdGhlIGJvYXJkIG1hbnVmYWN0dXJlciBwcm9iYWJseSBjb25uZWN0ZWQgdXAgdGhlCi0JICogc3luYyBsaW5lcywgYnV0IG1pc3NlZCB0aGUgdmlkZW8gdHJhY2VzIC8gY29tcG9uZW50cwotCSAqCi0JICogd2l0aCB0aGlzIGludHJvZHVjdGlvbiwgZHZpLWEgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4KLQkgKi8KLQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfUEFORUwsIGVudHJ5LT5oZWFkcyk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgZmFicmljYXRlX3R2X291dHB1dChzdHJ1Y3QgZGNiX3RhYmxlICpkY2IsIGJvb2wgdHdvSGVhZHMpCi17Ci0Jc3RydWN0IGRjYl9lbnRyeSAqZW50cnkgPSBuZXdfZGNiX2VudHJ5KGRjYik7Ci0KLQllbnRyeS0+dHlwZSA9IDE7Ci0JZW50cnktPmkyY19pbmRleCA9IExFR0FDWV9JMkNfVFY7Ci0JZW50cnktPmhlYWRzID0gdHdvSGVhZHMgPyAzIDogMTsKLQllbnRyeS0+bG9jYXRpb24gPSAhRENCX0xPQ19PTl9DSElQOwkvKiBpZSBPRkYgQ0hJUCAqLworCWlmICh0eXBlICE9IE9VVFBVVF9BTkFMT0cpCisJCWVudHJ5LT5sb2NhdGlvbiA9ICFEQ0JfTE9DX09OX0NISVA7IC8qIGllIE9GRiBDSElQICovCisJZW50cnktPm9yID0gb3I7CiB9CiAKIHN0YXRpYyBib29sCkBAIC02MzY1LDggKzYzMzAsMzYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQKK2ZhYnJpY2F0ZV9kY2JfZW5jb2Rlcl90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZiaW9zLT5kY2I7CisJaW50IGFsbF9oZWFkcyA9IChudl90d29faGVhZHMoZGV2KSA/IDMgOiAxKTsKKworI2lmZGVmIF9fcG93ZXJwY19fCisJLyogQXBwbGUgaU1hYyBHNCBOVjE3ICovCisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM0LDUiKSkgeworCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9UTURTLCAwLCBhbGxfaGVhZHMsIDEpOworCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9BTkFMT0csIDEsIGFsbF9oZWFkcywgMik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIE1ha2UgdXAgc29tZSBzYW5lIGRlZmF1bHRzICovCisJZmFicmljYXRlX2RjYl9vdXRwdXQoZGNiLCBPVVRQVVRfQU5BTE9HLCBMRUdBQ1lfSTJDX0NSVCwgMSwgMSk7CisKKwlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsIGJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy50dikgPj0gMCkKKwkJZmFicmljYXRlX2RjYl9vdXRwdXQoZGNiLCBPVVRQVVRfVFYsIExFR0FDWV9JMkNfVFYsCisJCQkJICAgICBhbGxfaGVhZHMsIDApOworCisJZWxzZSBpZiAoYmlvcy0+dG1kcy5vdXRwdXQwX3NjcmlwdF9wdHIgfHwKKwkJIGJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyKQorCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9UTURTLCBMRUdBQ1lfSTJDX1BBTkVMLAorCQkJCSAgICAgYWxsX2hlYWRzLCAxKTsKK30KKwogc3RhdGljIGludAotcGFyc2VfZGNiX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIGJvb2wgdHdvSGVhZHMpCitwYXJzZV9kY2JfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZiaW9zLT5kY2I7CkBAIC02Mzg2LDEyICs2Mzc5LDcgQEAKIAogCS8qIHRoaXMgc2l0dWF0aW9uIGxpa2VseSBtZWFucyBhIHJlYWxseSBvbGQgY2FyZCwgcHJlIERDQiAqLwogCWlmIChkY2JwdHIgPT0gMHgwKSB7Ci0JCU5WX0lORk8oZGV2LCAiQXNzdW1pbmcgYSBDUlQgb3V0cHV0IGV4aXN0c1xuIik7Ci0JCWZhYnJpY2F0ZV92Z2Ffb3V0cHV0KGRjYiwgTEVHQUNZX0kyQ19DUlQsIDEpOwotCi0JCWlmIChudjA0X3R2X2lkZW50aWZ5KGRldiwgYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2KSA+PSAwKQotCQkJZmFicmljYXRlX3R2X291dHB1dChkY2IsIHR3b0hlYWRzKTsKLQorCQlmYWJyaWNhdGVfZGNiX2VuY29kZXJfdGFibGUoZGV2LCBiaW9zKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02NDUxLDIxICs2NDM5LDcgQEAKIAkJICovCiAJCU5WX1RSQUNFV0FSTihkZXYsICJObyB1c2VmdWwgaW5mb3JtYXRpb24gaW4gQklPUyBvdXRwdXQgdGFibGU7ICIKIAkJCQkgICJhZGRpbmcgYWxsIHBvc3NpYmxlIG91dHB1dHNcbiIpOwotCQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfQ1JULCAxKTsKLQotCQkvKgotCQkgKiBBdHRlbXB0IHRvIGRldGVjdCBUViBiZWZvcmUgRFZJIGJlY2F1c2UgdGhlIHRlc3QKLQkJICogZm9yIHRoZSBmb3JtZXIgaXMgbW9yZSBhY2N1cmF0ZSBhbmQgaXQgcnVsZXMgdGhlCi0JCSAqIGxhdHRlciBvdXQuCi0JCSAqLwotCQlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsCi0JCQkJICAgICBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMudHYpID49IDApCi0JCQlmYWJyaWNhdGVfdHZfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOwotCi0JCWVsc2UgaWYgKGJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyIHx8Ci0JCQkgYmlvcy0+dG1kcy5vdXRwdXQxX3NjcmlwdF9wdHIpCi0JCQlmYWJyaWNhdGVfZHZpX2lfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOwotCisJCWZhYnJpY2F0ZV9kY2JfZW5jb2Rlcl90YWJsZShkZXYsIGJpb3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY4NTksNyArNjgzMyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHBhcnNlX2RjYl90YWJsZShkZXYsIGJpb3MsIG52X3R3b19oZWFkcyhkZXYpKTsKKwlyZXQgPSBwYXJzZV9kY2JfdGFibGUoZGV2LCBiaW9zKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKaW5kZXggYzQxZTFjMi4uYTdmYWUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwpAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDYsODIgKzQ4LDUxIEBACiAJaWYgKHVubGlrZWx5KG52Ym8tPmdlbSkpCiAJCURSTV9FUlJPUigiYm8gJXAgc3RpbGwgYXR0YWNoZWQgdG8gR0VNIG9iamVjdFxuIiwgYm8pOwogCi0JaWYgKG52Ym8tPnRpbGUpCi0JCW52MTBfbWVtX2V4cGlyZV90aWxpbmcoZGV2LCBudmJvLT50aWxlLCBOVUxMKTsKLQorCW52MTBfbWVtX3B1dF90aWxlX3JlZ2lvbihkZXYsIG52Ym8tPnRpbGUsIE5VTEwpOworCW5vdXZlYXVfdm1fcHV0KCZudmJvLT52bWEpOwogCWtmcmVlKG52Ym8pOwogfQogCiBzdGF0aWMgdm9pZAotbm91dmVhdV9ib19maXh1cF9hbGlnbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICAgdWludDMyX3QgdGlsZV9tb2RlLCB1aW50MzJfdCB0aWxlX2ZsYWdzLAotCQkgICAgICAgaW50ICphbGlnbiwgaW50ICpzaXplKQorbm91dmVhdV9ib19maXh1cF9hbGlnbihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgaW50ICphbGlnbiwgaW50ICpzaXplLAorCQkgICAgICAgaW50ICpwYWdlX3NoaWZ0KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KG52Ym8tPmJvLmJkZXYpOwogCi0JLyoKLQkgKiBTb21lIG9mIHRoZSB0aWxlX2ZsYWdzIGhhdmUgYSBwZXJpb2RpYyBzdHJ1Y3R1cmUgb2YgTio0MDk2IGJ5dGVzLAotCSAqIGFsaWduIHRvIHRvIHRoYXQgYXMgd2VsbCBhcyB0aGUgcGFnZSBzaXplLiBBbGlnbiB0aGUgc2l6ZSB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBib3VuZGFyaWVzLiBUaGlzIGRvZXMgaW1wbHkgdGhhdCBzaXplcyBhcmUgcm91bmRlZCB1cAotCSAqIDMtNyBwYWdlcywgc28gYmUgYXdhcmUgb2YgdGhpcyBhbmQgZG8gbm90IHdhc3RlIG1lbW9yeSBieSBhbGxvY2F0aW5nCi0JICogbWFueSBzbWFsbCBidWZmZXJzLgotCSAqLwotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCXVpbnQzMl90IGJsb2NrX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9zaXplID4+IDE1OwotCQlpbnQgaTsKLQotCQlzd2l0Y2ggKHRpbGVfZmxhZ3MpIHsKLQkJY2FzZSAweDE4MDA6Ci0JCWNhc2UgMHgyODAwOgotCQljYXNlIDB4NDgwMDoKLQkJY2FzZSAweDdhMDA6Ci0JCQlpZiAoaXNfcG93ZXJfb2ZfMihibG9ja19zaXplKSkgewotCQkJCWZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJCSphbGlnbiA9IDEyICogaSAqIGJsb2NrX3NpemU7Ci0JCQkJCWlmICghKCphbGlnbiAlIDY1NTM2KSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMTsgaSA8IDEwOyBpKyspIHsKLQkJCQkJKmFsaWduID0gOCAqIGkgKiBibG9ja19zaXplOwotCQkJCQlpZiAoISgqYWxpZ24gJSA2NTUzNikpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsICphbGlnbik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQl9IGVsc2UgewotCQlpZiAodGlsZV9tb2RlKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlpZiAobnZiby0+dGlsZV9tb2RlKSB7CiAJCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg0MCkgewogCQkJCSphbGlnbiA9IDY1NTM2OwotCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjQgKiB0aWxlX21vZGUpOworCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjQgKiBudmJvLT50aWxlX21vZGUpOwogCiAJCQl9IGVsc2UgaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MzApIHsKIAkJCQkqYWxpZ24gPSAzMjc2ODsKLQkJCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsIDY0ICogdGlsZV9tb2RlKTsKKwkJCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsIDY0ICogbnZiby0+dGlsZV9tb2RlKTsKIAogCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDIwKSB7CiAJCQkJKmFsaWduID0gMTYzODQ7Ci0JCQkJKnNpemUgPSByb3VuZHVwKCpzaXplLCA2NCAqIHRpbGVfbW9kZSk7CisJCQkJKnNpemUgPSByb3VuZHVwKCpzaXplLCA2NCAqIG52Ym8tPnRpbGVfbW9kZSk7CiAKIAkJCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxMCkgewogCQkJCSphbGlnbiA9IDE2Mzg0OwotCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgMzIgKiB0aWxlX21vZGUpOworCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgMzIgKiBudmJvLT50aWxlX21vZGUpOwogCQkJfQogCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxpa2VseShkZXZfcHJpdi0+Y2hhbl92bSkpIHsKKwkJCWlmICgqc2l6ZSA+IDI1NiAqIDEwMjQpCisJCQkJKnBhZ2Vfc2hpZnQgPSBkZXZfcHJpdi0+Y2hhbl92bS0+bHBnX3NoaWZ0OworCQkJZWxzZQorCQkJCSpwYWdlX3NoaWZ0ID0gZGV2X3ByaXYtPmNoYW5fdm0tPnNwZ19zaGlmdDsKKwkJfSBlbHNlIHsKKwkJCSpwYWdlX3NoaWZ0ID0gMTI7CisJCX0KKworCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsICgxIDw8ICpwYWdlX3NoaWZ0KSk7CisJCSphbGlnbiA9IG1heCgoMSA8PCAqcGFnZV9zaGlmdCksICphbGlnbik7CiAJfQogCi0JLyogQUxJR04gd29ya3Mgb25seSBvbiBwb3dlcnMgb2YgdHdvLiAqLwogCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgUEFHRV9TSVpFKTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjU1MzYpOwotCQkqYWxpZ24gPSBtYXgoNjU1MzYsICphbGlnbik7Ci0JfQogfQogCiBpbnQKQEAgLTEzMiw3ICsxMDMsNyBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIHBhZ2Vfc2hpZnQgPSAwOwogCiAJbnZibyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2JvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudmJvKQpAQCAtMTQ1LDEwICsxMTYsMTggQEAKIAludmJvLT50aWxlX2ZsYWdzID0gdGlsZV9mbGFnczsKIAludmJvLT5iby5iZGV2ID0gJmRldl9wcml2LT50dG0uYmRldjsKIAotCW5vdXZlYXVfYm9fZml4dXBfYWxpZ24oZGV2LCB0aWxlX21vZGUsIG5vdXZlYXVfYm9fdGlsZV9sYXlvdXQobnZibyksCi0JCQkgICAgICAgJmFsaWduLCAmc2l6ZSk7CisJbm91dmVhdV9ib19maXh1cF9hbGlnbihudmJvLCAmYWxpZ24sICZzaXplLCAmcGFnZV9zaGlmdCk7CiAJYWxpZ24gPj49IFBBR0VfU0hJRlQ7CiAKKwlpZiAoIW52Ym8tPm5vX3ZtICYmIGRldl9wcml2LT5jaGFuX3ZtKSB7CisJCXJldCA9IG5vdXZlYXVfdm1fZ2V0KGRldl9wcml2LT5jaGFuX3ZtLCBzaXplLCBwYWdlX3NoaWZ0LAorCQkJCSAgICAgTlZfTUVNX0FDQ0VTU19SVywgJm52Ym8tPnZtYSk7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKG52Ym8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwogCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBmbGFncywgMCk7CiAKIAludmJvLT5jaGFubmVsID0gY2hhbjsKQEAgLTE2MSw2ICsxNDAsMTEgQEAKIAl9CiAJbnZiby0+Y2hhbm5lbCA9IE5VTEw7CiAKKwlpZiAobnZiby0+dm1hLm5vZGUpIHsKKwkJaWYgKG52Ym8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKKwkJCW52Ym8tPmJvLm9mZnNldCA9IG52Ym8tPnZtYS5vZmZzZXQ7CisJfQorCiAJKnBudmJvID0gbnZibzsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NCw3ICsyMjgsNyBAQAogCiAJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIG1lbXR5cGUsIDApOwogCi0JcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmbnZiby0+cGxhY2VtZW50LCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwlyZXQgPSBub3V2ZWF1X2JvX3ZhbGlkYXRlKG52Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogCWlmIChyZXQgPT0gMCkgewogCQlzd2l0Y2ggKGJvLT5tZW0ubWVtX3R5cGUpIHsKIAkJY2FzZSBUVE1fUExfVlJBTToKQEAgLTI4MCw3ICsyNjQsNyBAQAogCiAJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIGJvLT5tZW0ucGxhY2VtZW50LCAwKTsKIAotCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJm52Ym8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJcmV0ID0gbm91dmVhdV9ib192YWxpZGF0ZShudmJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKIAlpZiAocmV0ID09IDApIHsKIAkJc3dpdGNoIChiby0+bWVtLm1lbV90eXBlKSB7CiAJCWNhc2UgVFRNX1BMX1ZSQU06CkBAIC0zMTksNiArMzAzLDI1IEBACiAJCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOwogfQogCitpbnQKK25vdXZlYXVfYm9fdmFsaWRhdGUoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJICAgIGJvb2wgbm9fd2FpdF9yZXNlcnZlLCBib29sIG5vX3dhaXRfZ3B1KQoreworCWludCByZXQ7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJm52Ym8tPmJvLCAmbnZiby0+cGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLAorCQkJICAgICAgbm9fd2FpdF9yZXNlcnZlLCBub193YWl0X2dwdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChudmJvLT52bWEubm9kZSkgeworCQlpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKQorCQkJbnZiby0+Ym8ub2Zmc2V0ID0gbnZiby0+dm1hLm9mZnNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdTE2CiBub3V2ZWF1X2JvX3JkMTYoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHVuc2lnbmVkIGluZGV4KQogewpAQCAtNDEwLDM3ICs0MTMsNDAgQEAKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1ZSQU06Ci0JCW1hbi0+ZnVuYyA9ICZ0dG1fYm9fbWFuYWdlcl9mdW5jOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQkJbWFuLT5mdW5jID0gJm5vdXZlYXVfdnJhbV9tYW5hZ2VyOworCQkJbWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoID0gZmFsc2U7CisJCQltYW4tPnVzZV9pb19yZXNlcnZlX2xydSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQltYW4tPmZ1bmMgPSAmdHRtX2JvX21hbmFnZXJfZnVuYzsKKwkJfQogCQltYW4tPmZsYWdzID0gVFRNX01FTVRZUEVfRkxBR19GSVhFRCB8CiAJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEU7CiAJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CiAJCQkJCSBUVE1fUExfRkxBR19XQzsKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19XQzsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApCi0JCQltYW4tPmdwdV9vZmZzZXQgPSAweDQwMDAwMDAwOwotCQllbHNlCi0JCQltYW4tPmdwdV9vZmZzZXQgPSAwOwogCQlicmVhazsKIAljYXNlIFRUTV9QTF9UVDoKIAkJbWFuLT5mdW5jID0gJnR0bV9ib19tYW5hZ2VyX2Z1bmM7CiAJCXN3aXRjaCAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKSB7CiAJCWNhc2UgTk9VVkVBVV9HQVJUX0FHUDoKIAkJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFOwotCQkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1VOQ0FDSEVEOwotCQkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRDsKKwkJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CisJCQkJVFRNX1BMX0ZMQUdfV0M7CisJCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1dDOwogCQkJYnJlYWs7CiAJCWNhc2UgTk9VVkVBVV9HQVJUX1NHRE1BOgogCQkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfAogCQkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19DTUE7CiAJCQltYW4tPmF2YWlsYWJsZV9jYWNoaW5nID0gVFRNX1BMX01BU0tfQ0FDSElORzsKIAkJCW1hbi0+ZGVmYXVsdF9jYWNoaW5nID0gVFRNX1BMX0ZMQUdfQ0FDSEVEOworCQkJbWFuLT5ncHVfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCU5WX0VSUk9SKGRldiwgIlVua25vd24gR0FSVCB0eXBlOiAlZFxuIiwKIAkJCQkgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCW1hbi0+Z3B1X29mZnNldCA9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCU5WX0VSUk9SKGRldiwgIlVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlICV1XG4iLCAodW5zaWduZWQpdHlwZSk7CkBAIC00ODUsMTYgKzQ5MSw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChudmJvLT5jaGFubmVsKSB7Ci0JCXJldCA9IG5vdXZlYXVfZmVuY2Vfc3luYyhmZW5jZSwgbnZiby0+Y2hhbm5lbCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KIAlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKCZudmJvLT5ibywgZmVuY2UsIE5VTEwsIGV2aWN0LAogCQkJCQlub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKLW91dDoKLQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTE2LDYgKzUxNSw1OCBAQAogfQogCiBzdGF0aWMgaW50CitudmMwX2JvX21vdmVfbTJtZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwl1NjQgc3JjX29mZnNldCA9IG9sZF9tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJdTY0IGRzdF9vZmZzZXQgPSBuZXdfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCXUzMiBwYWdlX2NvdW50ID0gbmV3X21lbS0+bnVtX3BhZ2VzOworCWludCByZXQ7CisKKwlpZiAoIW52Ym8tPm5vX3ZtKSB7CisJCWlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKKwkJCXNyY19vZmZzZXQgID0gbnZiby0+dm1hLm9mZnNldDsKKwkJZWxzZQorCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKworCQlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJCQlkc3Rfb2Zmc2V0ICA9IG52Ym8tPnZtYS5vZmZzZXQ7CisJCWVsc2UKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CisJfQorCisJcGFnZV9jb3VudCA9IG5ld19tZW0tPm51bV9wYWdlczsKKwl3aGlsZSAocGFnZV9jb3VudCkgeworCQlpbnQgbGluZV9jb3VudCA9IChwYWdlX2NvdW50ID4gMjA0NykgPyAyMDQ3IDogcGFnZV9jb3VudDsKKworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDEyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDIzOCwgMik7CisJCU9VVF9SSU5HICAoY2hhbiwgdXBwZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWJNMk1GLCAweDAzMGMsIDYpOworCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQlPVVRfUklORyAgKGNoYW4sIGxvd2VyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIHNyY19waXRjaCAqLworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIGRzdF9waXRjaCAqLworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIGxpbmVfbGVuZ3RoICovCisJCU9VVF9SSU5HICAoY2hhbiwgbGluZV9jb3VudCk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWJNMk1GLCAweDAzMDAsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIDB4MDAxMDAxMTApOworCisJCXBhZ2VfY291bnQgLT0gbGluZV9jb3VudDsKKwkJc3JjX29mZnNldCArPSAoUEFHRV9TSVpFICogbGluZV9jb3VudCk7CisJCWRzdF9vZmZzZXQgKz0gKFBBR0VfU0laRSAqIGxpbmVfY291bnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBudjUwX2JvX21vdmVfbTJtZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQogewpAQCAtNTI5LDE0ICs1ODAsMTQgQEAKIAlkc3Rfb2Zmc2V0ID0gbmV3X21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKIAlpZiAoIW52Ym8tPm5vX3ZtKSB7CiAJCWlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKLQkJCXNyY19vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwkJCXNyY19vZmZzZXQgID0gbnZiby0+dm1hLm9mZnNldDsKIAkJZWxzZQotCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlOworCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKIAogCQlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCi0JCQlkc3Rfb2Zmc2V0ICs9IGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisJCQlkc3Rfb2Zmc2V0ICA9IG52Ym8tPnZtYS5vZmZzZXQ7CiAJCWVsc2UKLQkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CiAJfQogCiAJcmV0ID0gUklOR19TUEFDRShjaGFuLCAzKTsKQEAgLTY4MywxNyArNzM0LDI3IEBACiAJaW50IHJldDsKIAogCWNoYW4gPSBudmJvLT5jaGFubmVsOwotCWlmICghY2hhbiB8fCBudmJvLT5ub192bSkKKwlpZiAoIWNoYW4gfHwgbnZiby0+bm9fdm0pIHsKIAkJY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCQltdXRleF9sb2NrX25lc3RlZCgmY2hhbi0+bXV0ZXgsIE5PVVZFQVVfS0NIQU5ORUxfTVVURVgpOworCX0KIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCiAJCXJldCA9IG52MDRfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CiAJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApCiAJCXJldCA9IG52NTBfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldCA9IG52YzBfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IG5vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGNoYW4sIG52Ym8sIGV2aWN0LAorCQkJCQkJICAgIG5vX3dhaXRfcmVzZXJ2ZSwKKwkJCQkJCSAgICBub193YWl0X2dwdSwgbmV3X21lbSk7CisJfQogCi0JcmV0dXJuIG5vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGNoYW4sIG52Ym8sIGV2aWN0LCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKKwlpZiAoY2hhbiA9PSBkZXZfcHJpdi0+Y2hhbm5lbCkKKwkJbXV0ZXhfdW5sb2NrKCZjaGFuLT5tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludApAQCAtNzcxLDcgKzgzMiw2IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKIAl1aW50NjRfdCBvZmZzZXQ7Ci0JaW50IHJldDsKIAogCWlmIChudmJvLT5ub192bSB8fCBuZXdfbWVtLT5tZW1fdHlwZSAhPSBUVE1fUExfVlJBTSkgewogCQkvKiBOb3RoaW5nIHRvIGRvLiAqLwpAQCAtNzgxLDE4ICs4NDEsMTIgQEAKIAogCW9mZnNldCA9IG5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQlyZXQgPSBudjUwX21lbV92bV9iaW5kX2xpbmVhcihkZXYsCi0JCQkJCSAgICAgIG9mZnNldCArIGRldl9wcml2LT52bV92cmFtX2Jhc2UsCi0JCQkJCSAgICAgIG5ld19tZW0tPnNpemUsCi0JCQkJCSAgICAgIG5vdXZlYXVfYm9fdGlsZV9sYXlvdXQobnZibyksCi0JCQkJCSAgICAgIG9mZnNldCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCisJaWYgKGRldl9wcml2LT5jaGFuX3ZtKSB7CisJCW5vdXZlYXVfdm1fbWFwKCZudmJvLT52bWEsIG5ld19tZW0tPm1tX25vZGUpOwogCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkgewogCQkqbmV3X3RpbGUgPSBudjEwX21lbV9zZXRfdGlsaW5nKGRldiwgb2Zmc2V0LCBuZXdfbWVtLT5zaXplLAotCQkJCQkJbnZiby0+dGlsZV9tb2RlKTsKKwkJCQkJCW52Ym8tPnRpbGVfbW9kZSwKKwkJCQkJCW52Ym8tPnRpbGVfZmxhZ3MpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODA4LDkgKzg2Miw3IEBACiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCAmJgogCSAgICBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJaWYgKCpvbGRfdGlsZSkKLQkJCW52MTBfbWVtX2V4cGlyZV90aWxpbmcoZGV2LCAqb2xkX3RpbGUsIGJvLT5zeW5jX29iaik7Ci0KKwkJbnYxMF9tZW1fcHV0X3RpbGVfcmVnaW9uKGRldiwgKm9sZF90aWxlLCBiby0+c3luY19vYmopOwogCQkqb2xkX3RpbGUgPSBuZXdfdGlsZTsKIAl9CiB9CkBAIC04NzksNiArOTMxLDcgQEAKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtLT5tZW1fdHlwZV07CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJkZXYpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWludCByZXQ7CiAKIAltZW0tPmJ1cy5hZGRyID0gTlVMTDsKIAltZW0tPmJ1cy5vZmZzZXQgPSAwOwpAQCAtOTAxLDkgKzk1NCw0MCBAQAogI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1ZSQU06Ci0JCW1lbS0+YnVzLm9mZnNldCA9IG1lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwl7CisJCXN0cnVjdCBub3V2ZWF1X3ZyYW0gKnZyYW0gPSBtZW0tPm1tX25vZGU7CisJCXU4IHBhZ2Vfc2hpZnQ7CisKKwkJaWYgKCFkZXZfcHJpdi0+YmFyMV92bSkgeworCQkJbWVtLT5idXMub2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCQkJbWVtLT5idXMuYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOworCQkJbWVtLT5idXMuaXNfaW9tZW0gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkKKwkJCXBhZ2Vfc2hpZnQgPSB2cmFtLT5wYWdlX3NoaWZ0OworCQllbHNlCisJCQlwYWdlX3NoaWZ0ID0gMTI7CisKKwkJcmV0ID0gbm91dmVhdV92bV9nZXQoZGV2X3ByaXYtPmJhcjFfdm0sIG1lbS0+YnVzLnNpemUsCisJCQkJICAgICBwYWdlX3NoaWZ0LCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCSAgICAgJnZyYW0tPmJhcl92bWEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlub3V2ZWF1X3ZtX21hcCgmdnJhbS0+YmFyX3ZtYSwgdnJhbSk7CisJCWlmIChyZXQpIHsKKwkJCW5vdXZlYXVfdm1fcHV0KCZ2cmFtLT5iYXJfdm1hKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQltZW0tPmJ1cy5vZmZzZXQgPSB2cmFtLT5iYXJfdm1hLm9mZnNldDsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIC8qWFhYKi8KKwkJCW1lbS0+YnVzLm9mZnNldCAtPSAweDAwMjAwMDAwMDBVTEw7CiAJCW1lbS0+YnVzLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKTsKIAkJbWVtLT5idXMuaXNfaW9tZW0gPSB0cnVlOworCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MTQsNiArOTk4LDE3IEBACiBzdGF0aWMgdm9pZAogbm91dmVhdV90dG1faW9fbWVtX2ZyZWUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtID0gbWVtLT5tbV9ub2RlOworCisJaWYgKCFkZXZfcHJpdi0+YmFyMV92bSB8fCBtZW0tPm1lbV90eXBlICE9IFRUTV9QTF9WUkFNKQorCQlyZXR1cm47CisKKwlpZiAoIXZyYW0tPmJhcl92bWEubm9kZSkKKwkJcmV0dXJuOworCisJbm91dmVhdV92bV91bm1hcCgmdnJhbS0+YmFyX3ZtYSk7CisJbm91dmVhdV92bV9wdXQoJnZyYW0tPmJhcl92bWEpOwogfQogCiBzdGF0aWMgaW50CkBAIC05MzksNyArMTAzNCwyMyBAQAogCW52Ym8tPnBsYWNlbWVudC5mcGZuID0gMDsKIAludmJvLT5wbGFjZW1lbnQubHBmbiA9IGRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlczsKIAlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQobnZibywgVFRNX1BMX1ZSQU0sIDApOwotCXJldHVybiB0dG1fYm9fdmFsaWRhdGUoYm8sICZudmJvLT5wbGFjZW1lbnQsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisJcmV0dXJuIG5vdXZlYXVfYm9fdmFsaWRhdGUobnZibywgZmFsc2UsIHRydWUsIGZhbHNlKTsKK30KKwordm9pZAorbm91dmVhdV9ib19mZW5jZShzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvbGRfZmVuY2U7CisKKwlpZiAobGlrZWx5KGZlbmNlKSkKKwkJbm91dmVhdV9mZW5jZV9yZWYoZmVuY2UpOworCisJc3Bpbl9sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKKwlvbGRfZmVuY2UgPSBudmJvLT5iby5zeW5jX29iajsKKwludmJvLT5iby5zeW5jX29iaiA9IGZlbmNlOworCXNwaW5fdW5sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKKworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJm9sZF9mZW5jZSk7CiB9CiAKIHN0cnVjdCB0dG1fYm9fZHJpdmVyIG5vdXZlYXVfYm9fZHJpdmVyID0gewpAQCAtOTQ5LDExICsxMDYwLDExIEBACiAJLmV2aWN0X2ZsYWdzID0gbm91dmVhdV9ib19ldmljdF9mbGFncywKIAkubW92ZSA9IG5vdXZlYXVfYm9fbW92ZSwKIAkudmVyaWZ5X2FjY2VzcyA9IG5vdXZlYXVfYm9fdmVyaWZ5X2FjY2VzcywKLQkuc3luY19vYmpfc2lnbmFsZWQgPSBub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCwKLQkuc3luY19vYmpfd2FpdCA9IG5vdXZlYXVfZmVuY2Vfd2FpdCwKLQkuc3luY19vYmpfZmx1c2ggPSBub3V2ZWF1X2ZlbmNlX2ZsdXNoLAotCS5zeW5jX29ial91bnJlZiA9IG5vdXZlYXVfZmVuY2VfdW5yZWYsCi0JLnN5bmNfb2JqX3JlZiA9IG5vdXZlYXVfZmVuY2VfcmVmLAorCS5zeW5jX29ial9zaWduYWxlZCA9IF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQsCisJLnN5bmNfb2JqX3dhaXQgPSBfX25vdXZlYXVfZmVuY2Vfd2FpdCwKKwkuc3luY19vYmpfZmx1c2ggPSBfX25vdXZlYXVfZmVuY2VfZmx1c2gsCisJLnN5bmNfb2JqX3VucmVmID0gX19ub3V2ZWF1X2ZlbmNlX3VucmVmLAorCS5zeW5jX29ial9yZWYgPSBfX25vdXZlYXVfZmVuY2VfcmVmLAogCS5mYXVsdF9yZXNlcnZlX25vdGlmeSA9ICZub3V2ZWF1X3R0bV9mYXVsdF9yZXNlcnZlX25vdGlmeSwKIAkuaW9fbWVtX3Jlc2VydmUgPSAmbm91dmVhdV90dG1faW9fbWVtX3Jlc2VydmUsCiAJLmlvX21lbV9mcmVlID0gJm5vdXZlYXVfdHRtX2lvX21lbV9mcmVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwppbmRleCAzNzM5NTBlLi4zOTYwZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwpAQCAtMzgsMjMgKzM4LDI4IEBACiAJaW50IHJldDsKIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7Ci0JCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKLQkJCQkJICAgICBkZXZfcHJpdi0+dm1fZW5kLCBOVl9ETUFfQUNDRVNTX1JPLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmcHVzaGJ1Zik7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwKKwkJCQkJCSAgICAgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKKwkJCQkJCSAgICAgKDFVTEwgPDwgNDApLAorCQkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JPLAorCQkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZNLAorCQkJCQkJICAgICAmcHVzaGJ1Zik7CisJCX0KIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm9mZnNldDsKIAl9IGVsc2UKIAlpZiAocGItPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGNoYW4sIDAsCi0JCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAotCQkJCQkJICBOVl9ETUFfQUNDRVNTX1JPLCAmcHVzaGJ1ZiwKLQkJCQkJCSAgTlVMTCk7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKKwkJCQkJICAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JPLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfR0FSVCwgJnB1c2hidWYpOwogCQljaGFuLT5wdXNoYnVmX2Jhc2UgPSBwYi0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAJfSBlbHNlCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgIT0gTlZfMDQpIHsKIAkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLCAwLAogCQkJCQkgICAgIGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JPLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfVklETUVNLCAmcHVzaGJ1Zik7CisJCQkJCSAgICAgTlZfTUVNX0FDQ0VTU19STywKKwkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZSQU0sICZwdXNoYnVmKTsKIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCX0gZWxzZSB7CiAJCS8qIE5WMDQgY21kYnVmIGhhY2ssIGZyb20gb3JpZ2luYWwgZGR4Li4gbm90IHN1cmUgb2YgaXQncwpAQCAtNjIsMTcgKzY3LDE2IEBACiAJCSAqIFZSQU0uCiAJCSAqLwogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwKLQkJCQkJICAgICAxKSwKKwkJCQkJICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKSwKIAkJCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCi0JCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19STywKLQkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1BDSSwgJnB1c2hidWYpOworCQkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUk8sCisJCQkJCSAgICAgTlZfTUVNX1RBUkdFVF9QQ0ksICZwdXNoYnVmKTsKIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCX0KIAogCW5vdXZlYXVfZ3B1b2JqX3JlZihwdXNoYnVmLCAmY2hhbi0+cHVzaGJ1Zik7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwdXNoYnVmKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IG5vdXZlYXVfYm8gKgpAQCAtMTAwLDYgKzEwNCwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlyZXQgPSBub3V2ZWF1X2JvX21hcChwdXNoYnVmKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfYm9fdW5waW4ocHVzaGJ1Zik7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZwdXNoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJcmV0dXJuIHB1c2hidWY7CiB9CiAKQEAgLTEwNyw3NCArMTE4LDU5IEBACiBpbnQKIG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqY2hhbl9yZXQsCiAJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkgICAgICB1aW50MzJfdCB2cmFtX2hhbmRsZSwgdWludDMyX3QgdHRfaGFuZGxlKQorCQkgICAgICB1aW50MzJfdCB2cmFtX2hhbmRsZSwgdWludDMyX3QgZ2FydF9oYW5kbGUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47Ci0JaW50IGNoYW5uZWwsIHVzZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBBbHJpZ2h0LCBoZXJlIGlzIHRoZSBmdWxsIHN0b3J5Ci0JICogTnZpZGlhIGNhcmRzIGhhdmUgbXVsdGlwbGUgaHcgZmlmbyBjb250ZXh0cyAocHJhaXNlIHRoZW0gZm9yIHRoYXQsCi0JICogbm8gY29tcGxpY2F0ZWQgY3Jhc2gtcHJvbmUgY29udGV4dCBzd2l0Y2hlcykKLQkgKiBXZSBhbGxvY2F0ZSBhIG5ldyBjb250ZXh0IGZvciBlYWNoIGFwcCBhbmQgbGV0IGl0IHdyaXRlIHRvIGl0Ci0JICogZGlyZWN0bHkgKHdvbywgZnVsbCB1c2Vyc3BhY2UgY29tbWFuZCBzdWJtaXNzaW9uICEpCi0JICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb250ZXh0cywgeW91IGxvc3QKLQkgKi8KLQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcGZpZm8tPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogbm8gbW9yZSBmaWZvcy4geW91IGxvc3QuICovCi0JaWYgKGNoYW5uZWwgPT0gcGZpZm8tPmNoYW5uZWxzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwpLAotCQkJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9wcml2LT5maWZvc1tjaGFubmVsXSkKKwkvKiBhbGxvY2F0ZSBhbmQgbG9jayBjaGFubmVsIHN0cnVjdHVyZSAqLworCWNoYW4gPSBremFsbG9jKHNpemVvZigqY2hhbiksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGFubmVsXTsKLQlJTklUX0xJU1RfSEVBRCgmY2hhbi0+bnZzdy52Ymxfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNoYW4tPmZlbmNlLnBlbmRpbmcpOwogCWNoYW4tPmRldiA9IGRldjsKLQljaGFuLT5pZCA9IGNoYW5uZWw7CiAJY2hhbi0+ZmlsZV9wcml2ID0gZmlsZV9wcml2OwogCWNoYW4tPnZyYW1faGFuZGxlID0gdnJhbV9oYW5kbGU7Ci0JY2hhbi0+Z2FydF9oYW5kbGUgPSB0dF9oYW5kbGU7CisJY2hhbi0+Z2FydF9oYW5kbGUgPSBnYXJ0X2hhbmRsZTsKIAotCU5WX0lORk8oZGV2LCAiQWxsb2NhdGluZyBGSUZPIG51bWJlciAlZFxuIiwgY2hhbm5lbCk7CisJa3JlZl9pbml0KCZjaGFuLT5yZWYpOworCWF0b21pY19zZXQoJmNoYW4tPnVzZXJzLCAxKTsKKwltdXRleF9pbml0KCZjaGFuLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmY2hhbi0+bXV0ZXgpOworCisJLyogYWxsb2NhdGUgaHcgY2hhbm5lbCBpZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoY2hhbi0+aWQgPSAwOyBjaGFuLT5pZCA8IHBmaWZvLT5jaGFubmVsczsgY2hhbi0+aWQrKykgeworCQlpZiAoIWRldl9wcml2LT5jaGFubmVscy5wdHJbY2hhbi0+aWRdKSB7CisJCQlub3V2ZWF1X2NoYW5uZWxfcmVmKGNoYW4sICZkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoYW4tPmlkXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCisJaWYgKGNoYW4tPmlkID09IHBmaWZvLT5jaGFubmVscykgeworCQltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCU5WX0RFQlVHKGRldiwgImluaXRpYWxpc2luZyBjaGFubmVsICVkXG4iLCBjaGFuLT5pZCk7CisJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPm52c3cudmJsX3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5udnN3LmZsaXApOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKIAogCS8qIEFsbG9jYXRlIERNQSBwdXNoIGJ1ZmZlciAqLwogCWNoYW4tPnB1c2hidWZfYm8gPSBub3V2ZWF1X2NoYW5uZWxfdXNlcl9wdXNoYnVmX2FsbG9jKGRldik7CiAJaWYgKCFjaGFuLT5wdXNoYnVmX2JvKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCU5WX0VSUk9SKGRldiwgInB1c2hidWYgJWRcbiIsIHJldCk7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub3V2ZWF1X2RtYV9wcmVfaW5pdChjaGFuKTsKLQotCS8qIExvY2F0ZSBjaGFubmVsJ3MgdXNlciBjb250cm9sIHJlZ3MgKi8KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQotCQl1c2VyID0gTlYwM19VU0VSKGNoYW5uZWwpOwotCWVsc2UKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQotCQl1c2VyID0gTlY0MF9VU0VSKGNoYW5uZWwpOwotCWVsc2UKLQkJdXNlciA9IE5WNTBfVVNFUihjaGFubmVsKTsKLQotCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsgdXNlciwKLQkJCQkJCQkJUEFHRV9TSVpFKTsKLQlpZiAoIWNoYW4tPnVzZXIpIHsKLQkJTlZfRVJST1IoZGV2LCAiaW9yZW1hcCBvZiByZWdzIGZhaWxlZC5cbiIpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWNoYW4tPnVzZXJfcHV0ID0gMHg0MDsKIAljaGFuLT51c2VyX2dldCA9IDB4NDQ7CiAKQEAgLTE4MiwxNSArMTc4LDE1IEBACiAJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9pbml0X2NoYW5uZWwoY2hhbik7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJudGZ5ICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogU2V0dXAgY2hhbm5lbCdzIGRlZmF1bHQgb2JqZWN0cyAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChjaGFuLCB2cmFtX2hhbmRsZSwgdHRfaGFuZGxlKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXQoY2hhbiwgdnJhbV9oYW5kbGUsIGdhcnRfaGFuZGxlKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgImdwdW9iaiAlZFxuIiwgcmV0KTsKLQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTk4LDI0ICsxOTQsMTcgQEAKIAlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfcHVzaGJ1Zl9jdHhkbWFfaW5pdChjaGFuKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgInBiY3R4ZG1hICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogZGlzYWJsZSB0aGUgZmlmbyBjYWNoZXMgKi8KIAlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CiAKLQkvKiBDcmVhdGUgYSBncmFwaGljcyBjb250ZXh0IGZvciBuZXcgY2hhbm5lbCAqLwotCXJldCA9IHBncmFwaC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7Ci0JaWYgKHJldCkgewotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBDb25zdHJ1Y3QgaW5pdGFsIFJBTUZDIGZvciBuZXcgY2hhbm5lbCAqLwogCXJldCA9IHBmaWZvLT5jcmVhdGVfY29udGV4dChjaGFuKTsKIAlpZiAocmV0KSB7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIyNSw4MyArMjE0LDExMSBAQAogCWlmICghcmV0KQogCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX2NoYW5uZWxfaW5pdChjaGFuKTsKIAlpZiAocmV0KSB7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbml0KGNoYW4pOwogCi0JTlZfSU5GTyhkZXYsICIlczogaW5pdGlhbGlzZWQgRklGTyAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworCU5WX0RFQlVHKGRldiwgImNoYW5uZWwgJWQgaW5pdGlhbGlzZWRcbiIsIGNoYW4tPmlkKTsKIAkqY2hhbl9yZXQgPSBjaGFuOwogCXJldHVybiAwOwogfQogCi0vKiBzdG9wcyBhIGZpZm8gKi8KLXZvaWQKLW5vdXZlYXVfY2hhbm5lbF9mcmVlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKK25vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqcmVmKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisKKwlpZiAobGlrZWx5KHJlZiAmJiBhdG9taWNfaW5jX25vdF96ZXJvKCZyZWYtPnVzZXJzKSkpCisJCW5vdXZlYXVfY2hhbm5lbF9yZWYocmVmLCAmY2hhbik7CisKKwlyZXR1cm4gY2hhbjsKK30KKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitub3V2ZWF1X2NoYW5uZWxfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBpbnQgaWQpCit7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwogCi0JTlZfSU5GTyhkZXYsICIlczogZnJlZWluZyBmaWZvICVkXG4iLCBfX2Z1bmNfXywgY2hhbi0+aWQpOworCWlmICh1bmxpa2VseShpZCA8IDAgfHwgaWQgPj0gTk9VVkVBVV9NQVhfQ0hBTk5FTF9OUikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0Jbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfZmluaShjaGFuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldF91bmxvY2tlZChkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2lkXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKIAotCS8qIEdpdmUgb3V0c3RhbmRpbmcgcHVzaCBidWZmZXJzIGEgY2hhbmNlIHRvIGNvbXBsZXRlICovCi0Jbm91dmVhdV9mZW5jZV91cGRhdGUoY2hhbik7Ci0JaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlICE9IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykgewotCQlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBOVUxMOworCWlmICh1bmxpa2VseSghY2hhbikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sICZmZW5jZSwgdHJ1ZSk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwotCQkJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZmZW5jZSk7Ci0JCX0KLQotCQlpZiAocmV0KQotCQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGlkbGUgY2hhbm5lbCAlZC5cbiIsIGNoYW4tPmlkKTsKKwlpZiAodW5saWtlbHkoZmlsZV9wcml2ICYmIGNoYW4tPmZpbGVfcHJpdiAhPSBmaWxlX3ByaXYpKSB7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmNoYW4pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQkvKiBFbnN1cmUgYWxsIG91dHN0YW5kaW5nIGZlbmNlcyBhcmUgc2lnbmFsZWQuICBUaGV5IHNob3VsZCBiZSBpZiB0aGUKKwltdXRleF9sb2NrKCZjaGFuLT5tdXRleCk7CisJcmV0dXJuIGNoYW47Cit9CisKK3ZvaWQKK25vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSAqcGNoYW47CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lICpwY3J5cHQgPSAmZGV2X3ByaXYtPmVuZ2luZS5jcnlwdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZGVjcmVtZW50IHRoZSByZWZjb3VudCwgYW5kIHdlJ3JlIGRvbmUgaWYgdGhlcmUncyBzdGlsbCByZWZzICovCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2hhbi0+dXNlcnMpKSkgeworCQlub3V2ZWF1X2NoYW5uZWxfcmVmKE5VTEwsIHBjaGFuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG5vb25lIHdhbnRzIHRoZSBjaGFubmVsIGFueW1vcmUgKi8KKwlOVl9ERUJVRyhkZXYsICJmcmVlaW5nIGNoYW5uZWwgJWRcbiIsIGNoYW4tPmlkKTsKKwlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9maW5pKGNoYW4pOworCisJLyogZ2l2ZSBpdCBjaGFuY2UgdG8gaWRsZSAqLworCW5vdXZlYXVfY2hhbm5lbF9pZGxlKGNoYW4pOworCisJLyogZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBmZW5jZXMgYXJlIHNpZ25hbGVkLiAgdGhleSBzaG91bGQgYmUgaWYgdGhlCiAJICogYWJvdmUgYXR0ZW1wdHMgYXQgaWRsaW5nIHdlcmUgT0ssIGJ1dCBpZiB3ZSBmYWlsZWQgdGhpcydsbCB0ZWxsIFRUTQogCSAqIHdlJ3JlIGRvbmUgd2l0aCB0aGUgYnVmZmVycy4KIAkgKi8KIAlub3V2ZWF1X2ZlbmNlX2NoYW5uZWxfZmluaShjaGFuKTsKIAotCS8qIFRoaXMgd2lsbCBwcmV2ZW50IHBmaWZvIGZyb20gc3dpdGNoaW5nIGNoYW5uZWxzLiAqLworCS8qIGJvb3QgaXQgb2ZmIHRoZSBoYXJkd2FyZSAqLwogCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKIAotCS8qIFdlIHdhbnQgdG8gZ2l2ZSBwZ3JhcGggYSBjaGFuY2UgdG8gaWRsZSBhbmQgZ2V0IHJpZCBvZiBhbGwgcG90ZW50aWFsCi0JICogZXJyb3JzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBsb2NrLCBvdGhlcndpc2UgdGhlIGlycSBoYW5kbGVyCi0JICogaXMgdW5hYmxlIHRvIHByb2Nlc3MgdGhlbS4KKwkvKiBXZSB3YW50IHRvIGdpdmUgcGdyYXBoIGEgY2hhbmNlIHRvIGlkbGUgYW5kIGdldCByaWQgb2YgYWxsCisJICogcG90ZW50aWFsIGVycm9ycy4gV2UgbmVlZCB0byBkbyB0aGlzIHdpdGhvdXQgdGhlIGNvbnRleHQKKwkgKiBzd2l0Y2ggbG9jayBoZWxkLCBvdGhlcndpc2UgdGhlIGlycSBoYW5kbGVyIGlzIHVuYWJsZSB0bworCSAqIHByb2Nlc3MgdGhlbS4KIAkgKi8KIAlpZiAocGdyYXBoLT5jaGFubmVsKGRldikgPT0gY2hhbikKIAkJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7Ci0JaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCi0JCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKLQlwZ3JhcGgtPmRlc3Ryb3lfY29udGV4dChjaGFuKTsKLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7Ci0KLQlpZiAocGZpZm8tPmNoYW5uZWxfaWQoZGV2KSA9PSBjaGFuLT5pZCkgewotCQlwZmlmby0+ZGlzYWJsZShkZXYpOwotCQlwZmlmby0+dW5sb2FkX2NvbnRleHQoZGV2KTsKLQkJcGZpZm8tPmVuYWJsZShkZXYpOwotCX0KKwkvKiBkZXN0cm95IHRoZSBlbmdpbmUgc3BlY2lmaWMgY29udGV4dHMgKi8KIAlwZmlmby0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCXBncmFwaC0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCWlmIChwY3J5cHQtPmRlc3Ryb3lfY29udGV4dCkKKwkJcGNyeXB0LT5kZXN0cm95X2NvbnRleHQoY2hhbik7CiAKIAlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJLyogYXNpZGUgZnJvbSBpdHMgcmVzb3VyY2VzLCB0aGUgY2hhbm5lbCBzaG91bGQgbm93IGJlIGRlYWQsCisJICogcmVtb3ZlIGl0IGZyb20gdGhlIGNoYW5uZWwgbGlzdAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCW5vdXZlYXVfY2hhbm5lbF9yZWYoTlVMTCwgJmRldl9wcml2LT5jaGFubmVscy5wdHJbY2hhbi0+aWRdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOwogCi0JLyogUmVsZWFzZSB0aGUgY2hhbm5lbCdzIHJlc291cmNlcyAqLworCS8qIGRlc3Ryb3kgYW55IHJlc291cmNlcyB0aGUgY2hhbm5lbCBvd25lZCAqLwogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cHVzaGJ1Zik7CiAJaWYgKGNoYW4tPnB1c2hidWZfYm8pIHsKIAkJbm91dmVhdV9ib191bm1hcChjaGFuLT5wdXNoYnVmX2JvKTsKQEAgLTMxMCw0NCArMzI3LDgwIEBACiAJfQogCW5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfdGFrZWRvd24oY2hhbik7CiAJbm91dmVhdV9ub3RpZmllcl90YWtlZG93bl9jaGFubmVsKGNoYW4pOwotCWlmIChjaGFuLT51c2VyKQotCQlpb3VubWFwKGNoYW4tPnVzZXIpOwogCi0JZGV2X3ByaXYtPmZpZm9zW2NoYW4tPmlkXSA9IE5VTEw7CisJbm91dmVhdV9jaGFubmVsX3JlZihOVUxMLCBwY2hhbik7Cit9CisKK3ZvaWQKK25vdXZlYXVfY2hhbm5lbF9wdXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCW11dGV4X3VubG9jaygmKCpwY2hhbiktPm11dGV4KTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0X3VubG9ja2VkKHBjaGFuKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY2hhbm5lbF9kZWwoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCwgcmVmKTsKKwogCWtmcmVlKGNoYW4pOwogfQogCit2b2lkCitub3V2ZWF1X2NoYW5uZWxfcmVmKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCit7CisJaWYgKGNoYW4pCisJCWtyZWZfZ2V0KCZjaGFuLT5yZWYpOworCisJaWYgKCpwY2hhbikKKwkJa3JlZl9wdXQoJigqcGNoYW4pLT5yZWYsIG5vdXZlYXVfY2hhbm5lbF9kZWwpOworCisJKnBjaGFuID0gY2hhbjsKK30KKwordm9pZAorbm91dmVhdV9jaGFubmVsX2lkbGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisJaW50IHJldDsKKworCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCisJaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlICE9IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykgeworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX25ldyhjaGFuLCAmZmVuY2UsIHRydWUpOworCQlpZiAoIXJldCkgeworCQkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBmYWxzZSwgZmFsc2UpOworCQkJbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOworCQl9CisKKwkJaWYgKHJldCkKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpZGxlIGNoYW5uZWwgJWQuXG4iLCBjaGFuLT5pZCk7CisJfQorfQorCiAvKiBjbGVhbnMgdXAgYWxsIHRoZSBmaWZvcyBmcm9tIGZpbGVfcHJpdiAqLwogdm9pZAogbm91dmVhdV9jaGFubmVsX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJjbGVhcmluZyBGSUZPIGVuYWJsZXMgZnJvbSBmaWxlX3ByaXZcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBlbmdpbmUtPmZpZm8uY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCQljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgaSk7CisJCWlmIChJU19FUlIoY2hhbikpCisJCQljb250aW51ZTsKIAotCQlpZiAoY2hhbiAmJiBjaGFuLT5maWxlX3ByaXYgPT0gZmlsZV9wcml2KQotCQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCWF0b21pY19kZWMoJmNoYW4tPnVzZXJzKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJfQogfQogCi1pbnQKLW5vdXZlYXVfY2hhbm5lbF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJICAgICAgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOwotCi0JaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzKQotCQlyZXR1cm4gMDsKLQlpZiAoZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIChkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0tPmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGlvY3RscyB3cmFwcGluZyB0aGUgZnVuY3Rpb25zCkBAIC0zODMsMzYgKzQzNiw0NCBAQAogCWVsc2UKIAkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CiAKLQlpbml0LT5zdWJjaGFuWzBdLmhhbmRsZSA9IE52TTJNRjsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQotCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDAwMzk7Ci0JZWxzZQotCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDUwMzk7Ci0JaW5pdC0+c3ViY2hhblsxXS5oYW5kbGUgPSBOdlN3OwotCWluaXQtPnN1YmNoYW5bMV0uZ3JjbGFzcyA9IE5WX1NXOwotCWluaXQtPm5yX3N1YmNoYW4gPSAyOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgPSBOdk0yTUY7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDAwMzk7CisJCWVsc2UKKwkJCWluaXQtPnN1YmNoYW5bMF0uZ3JjbGFzcyA9IDB4NTAzOTsKKwkJaW5pdC0+c3ViY2hhblsxXS5oYW5kbGUgPSBOdlN3OworCQlpbml0LT5zdWJjaGFuWzFdLmdyY2xhc3MgPSBOVl9TVzsKKwkJaW5pdC0+bnJfc3ViY2hhbiA9IDI7CisJfSBlbHNlIHsKKwkJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgID0gMHg5MDM5OworCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDkwMzk7CisJCWluaXQtPm5yX3N1YmNoYW4gPSAxOworCX0KIAogCS8qIE5hbWVkIG1lbW9yeSBvYmplY3QgYXJlYSAqLwogCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsIGNoYW4tPm5vdGlmaWVyX2JvLT5nZW0sCiAJCQkJICAgICZpbml0LT5ub3RpZmllcl9oYW5kbGUpOwotCWlmIChyZXQpIHsKLQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7Ci0JCXJldHVybiByZXQ7Ci0JfQogCi0JcmV0dXJuIDA7CisJaWYgKHJldCA9PSAwKQorCQlhdG9taWNfaW5jKCZjaGFuLT51c2Vycyk7IC8qIHVzZXJzcGFjZSByZWZlcmVuY2UgKi8KKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBub3V2ZWF1X2lvY3RsX2ZpZm9fZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfZnJlZSAqY2ZyZWUgPSBkYXRhOworCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgKnJlcSA9IGRhdGE7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihjZnJlZS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgcmVxLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAotCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCWF0b21pY19kZWMoJmNoYW4tPnVzZXJzKTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDIxLDE4ICs0ODIsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGRybV9pb2N0bF9kZXNjIG5vdXZlYXVfaW9jdGxzW10gPSB7Ci0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9nZXRwYXJhbSwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfU0VUUEFSQU0sIG5vdXZlYXVfaW9jdGxfc2V0cGFyYW0sIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCi0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9DSEFOTkVMX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2ZpZm9fYWxsb2MsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfRlJFRSwgbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2dyb2JqX2FsbG9jLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQywgbm91dmVhdV9pb2N0bF9ub3RpZmllcl9hbGxvYywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR1BVT0JKX0ZSRUUsIG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9ORVcsIG5vdXZlYXVfZ2VtX2lvY3RsX25ldywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR0VNX1BVU0hCVUYsIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWYsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfUFJFUCwgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfRklOSSwgbm91dmVhdV9nZW1faW9jdGxfY3B1X2ZpbmksIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9JTkZPLCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9nZXRwYXJhbSwgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX1NFVFBBUkFNLCBub3V2ZWF1X2lvY3RsX3NldHBhcmFtLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfQUxMT0MsIG5vdXZlYXVfaW9jdGxfZmlmb19hbGxvYywgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfRlJFRSwgbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HUk9CSl9BTExPQywgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYywgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX05PVElGSUVST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2FsbG9jLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR1BVT0JKX0ZSRUUsIG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fTkVXLCBub3V2ZWF1X2dlbV9pb2N0bF9uZXcsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fUFVTSEJVRiwgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1ZiwgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfUFJFUCwgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fQ1BVX0ZJTkksIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR0VNX0lORk8sIG5vdXZlYXVfZ2VtX2lvY3RsX2luZm8sIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCiB9OwogCiBpbnQgbm91dmVhdV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShub3V2ZWF1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYwppbmRleCA1MmMzNTZlLi5hMjFlMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgogI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKIAorc3RhdGljIHZvaWQgbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICosIGludCk7CisKIHN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoKIGZpbmRfZW5jb2Rlcl9ieV90eXBlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCB0eXBlKQogewpAQCAtOTQsMjIgKzk2LDMwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1ub3V2ZWF1X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fY29ubmVjdG9yKQorbm91dmVhdV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewotCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KLQkJbm91dmVhdV9jb25uZWN0b3IoZHJtX2Nvbm5lY3Rvcik7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW87CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAogCWlmICghbnZfY29ubmVjdG9yKQogCQlyZXR1cm47CiAKIAlkZXYgPSBudl9jb25uZWN0b3ItPmJhc2UuZGV2OworCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAorCXBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKwlpZiAocGdwaW8tPmlycV91bnJlZ2lzdGVyKSB7CisJCXBncGlvLT5pcnFfdW5yZWdpc3RlcihkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZywKKwkJCQkgICAgICBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnLCBjb25uZWN0b3IpOworCX0KKwogCWtmcmVlKG52X2Nvbm5lY3Rvci0+ZWRpZCk7Ci0JZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoZHJtX2Nvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGRybV9jb25uZWN0b3IpOwotCWtmcmVlKGRybV9jb25uZWN0b3IpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKIH0KIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICoKQEAgLTc2MCw2ICs3NzAsNyBAQAogewogCWNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzICpmdW5jcyA9ICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jczsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBOVUxMOwogCXN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5ICpkY2IgPSBOVUxMOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CkBAIC04NzYsNiArODg3LDExIEBACiAJCWJyZWFrOwogCX0KIAorCWlmIChwZ3Bpby0+aXJxX3JlZ2lzdGVyKSB7CisJCXBncGlvLT5pcnFfcmVnaXN0ZXIoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsCisJCQkJICAgIG5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcsIGNvbm5lY3Rvcik7CisJfQorCiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKIAlkY2ItPmRybSA9IGNvbm5lY3RvcjsKIAlyZXR1cm4gZGNiLT5kcm07CkBAIC04ODYsMyArOTAyLDI5IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAogfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICpkYXRhLCBpbnQgcGx1Z2dlZCkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlOVl9JTkZPKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKKwkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKworCWlmIChjb25uZWN0b3ItPmVuY29kZXIgJiYgY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjICYmCisJICAgIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yy0+ZW5hYmxlZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9CisJCQljb25uZWN0b3ItPmVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0RQKSB7CisJCQlpZiAocGx1Z2dlZCkKKwkJCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwkJCWVsc2UKKwkJCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCX0KKwl9CisKKwlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKaW5kZXggMmUxMWZkNi4uNTA1YzZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKICNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCiAKIHN0YXRpYyB2b2lkCiBub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpkcm1fZmIpCkBAIC0xMDQsMyArMTA3LDIwNyBAQAogCS5vdXRwdXRfcG9sbF9jaGFuZ2VkID0gbm91dmVhdV9mYmNvbl9vdXRwdXRfcG9sbF9jaGFuZ2VkLAogfTsKIAoraW50Citub3V2ZWF1X3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOXzEsIDAsCisJCQlOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18oY3J0YykpOworCWVsc2UKKwkJTlZXcml0ZUNSVEMoZGV2LCBjcnRjLCBOVl9QQ1JUQ19JTlRSX0VOXzAsCisJCQkgICAgTlZfUENSVENfSU5UUl8wX1ZCTEFOSyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV92YmxhbmtfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMSwKKwkJCU5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDXyhjcnRjKSwgMCk7CisJZWxzZQorCQlOVldyaXRlQ1JUQyhkZXYsIGNydGMsIE5WX1BDUlRDX0lOVFJfRU5fMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfcGFnZV9mbGlwX3Jlc2VydmUoc3RydWN0IG5vdXZlYXVfYm8gKm9sZF9ibywKKwkJCSAgc3RydWN0IG5vdXZlYXVfYm8gKm5ld19ibykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ib19waW4obmV3X2JvLCBUVE1fUExfRkxBR19WUkFNKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm5ld19iby0+Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKCZvbGRfYm8tPmJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfdW5yZXNlcnZlOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUoJm5ld19iby0+Ym8pOworZmFpbDoKKwlub3V2ZWF1X2JvX3VucGluKG5ld19ibyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfcGFnZV9mbGlwX3VucmVzZXJ2ZShzdHJ1Y3Qgbm91dmVhdV9ibyAqb2xkX2JvLAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X2JvICpuZXdfYm8sCisJCQkgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCW5vdXZlYXVfYm9fZmVuY2UobmV3X2JvLCBmZW5jZSk7CisJdHRtX2JvX3VucmVzZXJ2ZSgmbmV3X2JvLT5ibyk7CisKKwlub3V2ZWF1X2JvX2ZlbmNlKG9sZF9ibywgZmVuY2UpOworCXR0bV9ib191bnJlc2VydmUoJm9sZF9iby0+Ym8pOworCisJbm91dmVhdV9ib191bnBpbihvbGRfYm8pOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3BhZ2VfZmxpcF9lbWl0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqb2xkX2JvLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKm5ld19ibywKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSAqcywKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICoqcGZlbmNlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogUXVldWUgaXQgdG8gdGhlIHBlbmRpbmcgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZzLT5oZWFkLCAmY2hhbi0+bnZzdy5mbGlwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCS8qIFN5bmNocm9uaXplIHdpdGggdGhlIG9sZCBmcmFtZWJ1ZmZlciAqLworCXJldCA9IG5vdXZlYXVfZmVuY2Vfc3luYyhvbGRfYm8tPmJvLnN5bmNfb2JqLCBjaGFuKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwkvKiBFbWl0IHRoZSBwYWdlZmxpcCAqLworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19QQUdFX0ZMSVAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCUZJUkVfUklORyhjaGFuKTsKKworCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sIHBmZW5jZSwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CitmYWlsOgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcy0+aGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCSAgICAgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfYm8gKm9sZF9ibyA9IG5vdXZlYXVfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5udmJvOworCXN0cnVjdCBub3V2ZWF1X2JvICpuZXdfYm8gPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGZiKS0+bnZibzsKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgKnM7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2U7CisJaW50IHJldDsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmFjY2VsX2Jsb2NrZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcyA9IGt6YWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERvbid0IGxldCB0aGUgYnVmZmVycyBnbyBhd2F5IHdoaWxlIHdlIGZsaXAgKi8KKwlyZXQgPSBub3V2ZWF1X3BhZ2VfZmxpcF9yZXNlcnZlKG9sZF9ibywgbmV3X2JvKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZnJlZTsKKworCS8qIEluaXRpYWxpemUgYSBwYWdlIGZsaXAgc3RydWN0ICovCisJKnMgPSAoc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlKQorCQl7IHsgfSwgcy0+ZXZlbnQsIG5vdXZlYXVfY3J0YyhjcnRjKS0+aW5kZXgsCisJCSAgZmItPmJpdHNfcGVyX3BpeGVsLCBmYi0+cGl0Y2gsIGNydGMtPngsIGNydGMtPnksCisJCSAgbmV3X2JvLT5iby5vZmZzZXQgfTsKKworCS8qIENob29zZSB0aGUgY2hhbm5lbCB0aGUgZmxpcCB3aWxsIGJlIGhhbmRsZWQgaW4gKi8KKwljaGFuID0gbm91dmVhdV9mZW5jZV9jaGFubmVsKG5ld19iby0+Ym8uc3luY19vYmopOworCWlmICghY2hhbikKKwkJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoZGV2X3ByaXYtPmNoYW5uZWwpOworCW11dGV4X2xvY2soJmNoYW4tPm11dGV4KTsKKworCS8qIEVtaXQgYSBwYWdlIGZsaXAgKi8KKwlyZXQgPSBub3V2ZWF1X3BhZ2VfZmxpcF9lbWl0KGNoYW4sIG9sZF9ibywgbmV3X2JvLCBzLCAmZmVuY2UpOworCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF91bnJlc2VydmU7CisKKwkvKiBVcGRhdGUgdGhlIGNydGMgc3RydWN0IGFuZCBjbGVhbnVwICovCisJY3J0Yy0+ZmIgPSBmYjsKKworCW5vdXZlYXVfcGFnZV9mbGlwX3VucmVzZXJ2ZShvbGRfYm8sIG5ld19ibywgZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJmZlbmNlKTsKKwlyZXR1cm4gMDsKKworZmFpbF91bnJlc2VydmU6CisJbm91dmVhdV9wYWdlX2ZsaXBfdW5yZXNlcnZlKG9sZF9ibywgbmV3X2JvLCBOVUxMKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZmluaXNoX3BhZ2VfZmxpcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSAqcHMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KCZjaGFuLT5udnN3LmZsaXApKSB7CisJCU5WX0VSUk9SKGRldiwgIlVuZXhwZWN0ZWQgcGFnZWZsaXAgaW4gY2hhbm5lbCAlZC5cbiIsIGNoYW4tPmlkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjaGFuLT5udnN3LmZsaXAsCisJCQkgICAgIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSwgaGVhZCk7CisJaWYgKHMtPmV2ZW50KSB7CisJCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUgPSBzLT5ldmVudDsKKwkJc3RydWN0IHRpbWV2YWwgbm93OworCisJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwkJZS0+ZXZlbnQuc2VxdWVuY2UgPSAwOworCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOworCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CisJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJfQorCisJbGlzdF9kZWwoJnMtPmhlYWQpOworCSpwcyA9ICpzOworCWtmcmVlKHMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYwppbmRleCA4MjU4MWU2Li42NTY5OWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2JvICpwdXNoYnVmID0gY2hhbi0+cHVzaGJ1Zl9ibzsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKIAkJY29uc3QgaW50IGliX3NpemUgPSBwdXNoYnVmLT5iby5tZW0uc2l6ZSAvIDI7CiAKIAkJY2hhbi0+ZG1hLmliX2Jhc2UgPSAocHVzaGJ1Zi0+Ym8ubWVtLnNpemUgLSBpYl9zaXplKSA+PiAyOwpAQCAtNTksMTcgKzU5LDI2IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKIAlpbnQgcmV0LCBpOwogCi0JLyogQ3JlYXRlIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUIGZvciBidWZmZXIgbW92ZXMgKi8KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwID8KLQkJCQkgICAgMHgwMDM5IDogMHg1MDM5LCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCAweDkwMzksIDB4OTAzOSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoY2hhbiwgTnZNMk1GLCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDAwMCwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMHgwMDAwOTAzOSk7CisJCUZJUkVfUklORyAoY2hhbik7CisJCXJldHVybiAwOworCX0KKworCS8qIENyZWF0ZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCBmb3IgYnVmZmVyIG1vdmVzICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52TTJNRiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwID8KKwkJCQkgICAgMHgwMDM5IDogMHg1MDM5KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC03OCwxMSArODcsNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBNYXAgcHVzaCBidWZmZXIgKi8KLQlyZXQgPSBub3V2ZWF1X2JvX21hcChjaGFuLT5wdXNoYnVmX2JvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJLyogSW5zZXJ0IE5PUFMgZm9yIE5PVVZFQVVfRE1BX1NLSVBTICovCiAJcmV0ID0gUklOR19TUEFDRShjaGFuLCBOT1VWRUFVX0RNQV9TS0lQUyk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5oCmluZGV4IGQ1NzhjMjEuLmMzNmYxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaApAQCAtNzcsNyArNzcsOCBAQAogCS8qIEc4MCsgZGlzcGxheSBvYmplY3RzICovCiAJTnZFdm9WUkFNCT0gMHgwMTAwMDAwMCwKIAlOdkV2b0ZCMTYJPSAweDAxMDAwMDAxLAotCU52RXZvRkIzMgk9IDB4MDEwMDAwMDIKKwlOdkV2b0ZCMzIJPSAweDAxMDAwMDAyLAorCU52RXZvVlJBTV9MUAk9IDB4MDEwMDAwMDMKIH07CiAKICNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM5CkBAIC0xMjUsNiArMTI2LDEyIEBACiBPVVRfUklOR3Aoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnJfZHdvcmRzKTsKIAogc3RhdGljIGlubGluZSB2b2lkCitCRUdJTl9OVkMwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBvcCwgaW50IHN1YmMsIGludCBtdGhkLCBpbnQgc2l6ZSkKK3sKKwlPVVRfUklORyhjaGFuLCAob3AgPDwgMjgpIHwgKHNpemUgPDwgMTYpIHwgKHN1YmMgPDwgMTMpIHwgKG10aGQgPj4gMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIEJFR0lOX1JJTkcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IHN1YmMsIGludCBtdGhkLCBpbnQgc2l6ZSkKIHsKIAlPVVRfUklORyhjaGFuLCAoc3ViYyA8PCAxMykgfCAoc2l6ZSA8PCAxOCkgfCBtdGhkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwppbmRleCA0NTYyZjMwLi4zOGQ1OTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKIAlpbnQgZHBlX2hlYWRlcmxlbjsKIAl1aW50OF90IGNvbmZpZ1s0XSwgc3RhdHVzWzNdOwotCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lOworCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lLCBocGRfc3RhdGU7CiAJaW50IHJldCA9IDAsIGksIHRyaWVzLCB2b2x0YWdlOwogCiAJTlZfREVCVUdfS01TKGRldiwgImxpbmsgdHJhaW5pbmchIVxuIik7CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkvKiBkaXNhYmxlIGhvdHBsdWcgZGV0ZWN0LCB0aGlzIGZsaXBzIGFyb3VuZCBvbiBzb21lIHBhbmVscyBkdXJpbmcKIAkgKiBsaW5rIHRyYWluaW5nLgogCSAqLwotCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBmYWxzZSk7CisJaHBkX3N0YXRlID0gcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGZhbHNlKTsKIAogCWlmIChkcGUtPnNjcmlwdDApIHsKIAkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMFxuIiwgbnZfZW5jb2Rlci0+b3IpOwpAQCAtNDM5LDcgKzQzOSw3IEBACiAJfQogCiAJLyogcmUtZW5hYmxlIGhvdHBsdWcgZGV0ZWN0ICovCi0JcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIHRydWUpOworCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBocGRfc3RhdGUpOwogCiAJcmV0dXJuIGVxX2RvbmU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYwppbmRleCA5MDg3NTQ5Li4xM2JiNjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKQEAgLTExNSw2ICsxMTUsMTAgQEAKIGludCBub3V2ZWF1X3BlcmZsdmxfd3I7CiBtb2R1bGVfcGFyYW1fbmFtZWQocGVyZmx2bF93ciwgbm91dmVhdV9wZXJmbHZsX3dyLCBpbnQsIDA0MDApOwogCitNT0RVTEVfUEFSTV9ERVNDKG1zaSwgIkVuYWJsZSBNU0kgKGRlZmF1bHQ6IG9mZilcbiIpOworaW50IG5vdXZlYXVfbXNpOworbW9kdWxlX3BhcmFtX25hbWVkKG1zaSwgbm91dmVhdV9tc2ksIGludCwgMDQwMCk7CisKIGludCBub3V2ZWF1X2ZicGVyY3J0YzsKICNpZiAwCiBtb2R1bGVfcGFyYW1fbmFtZWQoZmJwZXJjcnRjLCBub3V2ZWF1X2ZicGVyY3J0YywgaW50LCAwNDAwKTsKQEAgLTE2Nyw2ICsxNzEsOSBAQAogCWlmIChwbV9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQogCQlyZXR1cm4gMDsKIAorCWlmIChkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKKwkJcmV0dXJuIDA7CisKIAlOVl9JTkZPKGRldiwgIkRpc2FibGluZyBmYmNvbiBhY2NlbGVyYXRpb24uLi5cbiIpOwogCW5vdXZlYXVfZmJjb25fc2F2ZV9kaXNhYmxlX2FjY2VsKGRldik7CiAKQEAgLTE5MywyMyArMjAwLDEwIEBACiAKIAlOVl9JTkZPKGRldiwgIklkbGluZyBjaGFubmVscy4uLlxuIik7CiAJZm9yIChpID0gMDsgaSA8IHBmaWZvLT5jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisJCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldOwogCi0JCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07Ci0JCWlmICghY2hhbiB8fCAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgotCQkJICAgICAgY2hhbiA9PSBkZXZfcHJpdi0+Zmlmb3NbMF0pKQotCQkJY29udGludWU7Ci0KLQkJcmV0ID0gbm91dmVhdV9mZW5jZV9uZXcoY2hhbiwgJmZlbmNlLCB0cnVlKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQoZmVuY2UsIE5VTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKLQkJfQotCi0JCWlmIChyZXQpIHsKLQkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpZGxlIGNoYW5uZWwgJWQgZm9yIHN1c3BlbmRcbiIsCi0JCQkJIGNoYW4tPmlkKTsKLQkJfQorCQlpZiAoY2hhbiAmJiBjaGFuLT5wdXNoYnVmX2JvKQorCQkJbm91dmVhdV9jaGFubmVsX2lkbGUoY2hhbik7CiAJfQogCiAJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKQEAgLTIxOSwxNyArMjEzLDE3IEBACiAJcGZpZm8tPnVubG9hZF9jb250ZXh0KGRldik7CiAJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOwogCi0JTlZfSU5GTyhkZXYsICJTdXNwZW5kaW5nIEdQVSBvYmplY3RzLi4uXG4iKTsKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zdXNwZW5kKGRldik7CisJcmV0ID0gcGluc3RtZW0tPnN1c3BlbmQoZGV2KTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgIi4uLiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dF9hYm9ydDsKIAl9CiAKLQlyZXQgPSBwaW5zdG1lbS0+c3VzcGVuZChkZXYpOworCU5WX0lORk8oZGV2LCAiU3VzcGVuZGluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfc3VzcGVuZChkZXYpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiLi4uIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCW5vdXZlYXVfZ3B1b2JqX3N1c3BlbmRfY2xlYW51cChkZXYpOworCQlwaW5zdG1lbS0+cmVzdW1lKGRldik7CiAJCWdvdG8gb3V0X2Fib3J0OwogCX0KIApAQCAtMjYzLDYgKzI1Nyw5IEBACiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCWludCByZXQsIGk7CiAKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCisJCXJldHVybiAwOworCiAJbm91dmVhdV9mYmNvbl9zYXZlX2Rpc2FibGVfYWNjZWwoZGV2KTsKIAogCU5WX0lORk8oZGV2LCAiV2UncmUgYmFjaywgZW5hYmxpbmcgZGV2aWNlLi4uXG4iKTsKQEAgLTI5NCwxNyArMjkxLDE4IEBACiAJCX0KIAl9CiAKKwlOVl9JTkZPKGRldiwgIlJlc3RvcmluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CisKIAlOVl9JTkZPKGRldiwgIlJlaW5pdGlhbGlzaW5nIGVuZ2luZXMuLi5cbiIpOwogCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUoZGV2KTsKIAllbmdpbmUtPm1jLmluaXQoZGV2KTsKIAllbmdpbmUtPnRpbWVyLmluaXQoZGV2KTsKIAllbmdpbmUtPmZiLmluaXQoZGV2KTsKIAllbmdpbmUtPmdyYXBoLmluaXQoZGV2KTsKKwllbmdpbmUtPmNyeXB0LmluaXQoZGV2KTsKIAllbmdpbmUtPmZpZm8uaW5pdChkZXYpOwogCi0JTlZfSU5GTyhkZXYsICJSZXN0b3JpbmcgR1BVIG9iamVjdHMuLi5cbiIpOwotCW5vdXZlYXVfZ3B1b2JqX3Jlc3VtZShkZXYpOwotCiAJbm91dmVhdV9pcnFfcG9zdGluc3RhbGwoZGV2KTsKIAogCS8qIFJlLXdyaXRlIFNLSVBTLCB0aGV5J2xsIGhhdmUgYmVlbiBsb3N0IG92ZXIgdGhlIHN1c3BlbmQgKi8KQEAgLTMxMyw3ICszMTEsNyBAQAogCQlpbnQgajsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisJCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKIAkJCWlmICghY2hhbiB8fCAhY2hhbi0+cHVzaGJ1Zl9ibykKIAkJCQljb250aW51ZTsKIApAQCAtMzQ3LDEzICszNDUsMTEgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJCXUzMiBvZmZzZXQgPSBudl9jcnRjLT5jdXJzb3IubnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKLQkJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywKLQkJCQkJbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm9mZnNldCAtCi0JCQkJCWRldl9wcml2LT52bV92cmFtX2Jhc2UpOwotCisJCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0KG52X2NydGMsIG9mZnNldCk7CiAJCW52X2NydGMtPmN1cnNvci5zZXRfcG9zKG52X2NydGMsIG52X2NydGMtPmN1cnNvcl9zYXZlZF94LAotCQkJbnZfY3J0Yy0+Y3Vyc29yX3NhdmVkX3kpOworCQkJCQkJIG52X2NydGMtPmN1cnNvcl9zYXZlZF95KTsKIAl9CiAKIAkvKiBGb3JjZSBDTFVUIHRvIGdldCByZS1sb2FkZWQgZHVyaW5nIG1vZGVzZXQgKi8KQEAgLTM5Myw2ICszODksOSBAQAogCS5pcnFfcG9zdGluc3RhbGwgPSBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbCwKIAkuaXJxX3VuaW5zdGFsbCA9IG5vdXZlYXVfaXJxX3VuaW5zdGFsbCwKIAkuaXJxX2hhbmRsZXIgPSBub3V2ZWF1X2lycV9oYW5kbGVyLAorCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSBkcm1fdmJsYW5rX2NvdW50LAorCS5lbmFibGVfdmJsYW5rID0gbm91dmVhdV92YmxhbmtfZW5hYmxlLAorCS5kaXNhYmxlX3ZibGFuayA9IG5vdXZlYXVfdmJsYW5rX2Rpc2FibGUsCiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkuaW9jdGxzID0gbm91dmVhdV9pb2N0bHMsCiAJLmZvcHMgPSB7CkBAIC00MDMsNiArNDAyLDcgQEAKIAkJLm1tYXAgPSBub3V2ZWF1X3R0bV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwkJLnJlYWQgPSBkcm1fcmVhZCwKICNpZiBkZWZpbmVkKENPTkZJR19DT01QQVQpCiAJCS5jb21wYXRfaW9jdGwgPSBub3V2ZWF1X2NvbXBhdF9pb2N0bCwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKaW5kZXggMWM3ZGI2NC4uNDZlMzI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCkBAIC01NCwyMiArNTQsMzcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCiAjaW5jbHVkZSAibm91dmVhdV9iaW9zLmgiCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCisKIHN0cnVjdCBub3V2ZWF1X2dyY3R4Oworc3RydWN0IG5vdXZlYXVfdnJhbTsKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKICNkZWZpbmUgTUFYX05VTV9EQ0JfRU5UUklFUyAxNgogCiAjZGVmaW5lIE5PVVZFQVVfTUFYX0NIQU5ORUxfTlIgMTI4CiAjZGVmaW5lIE5PVVZFQVVfTUFYX1RJTEVfTlIgMTUKIAotI2RlZmluZSBOVjUwX1ZNX01BWF9WUkFNICgyKjEwMjQqMTAyNCoxMDI0VUxMKQotI2RlZmluZSBOVjUwX1ZNX0JMT0NLICAgICg1MTIqMTAyNCoxMDI0VUxMKQotI2RlZmluZSBOVjUwX1ZNX1ZSQU1fTlIgIChOVjUwX1ZNX01BWF9WUkFNIC8gTlY1MF9WTV9CTE9DSykKK3N0cnVjdCBub3V2ZWF1X3ZyYW0geworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisKKwlzdHJ1Y3Qgbm91dmVhdV92bWEgYmFyX3ZtYTsKKwl1OCAgcGFnZV9zaGlmdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgcmVnaW9uczsKKwl1MzIgbWVtdHlwZTsKKwl1NjQgb2Zmc2V0OworCXU2NCBzaXplOworfTsKIAogc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgewotCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHNpemU7CiAJYm9vbCB1c2VkOworCXVpbnQzMl90IGFkZHI7CisJdWludDMyX3QgbGltaXQ7CisJdWludDMyX3QgcGl0Y2g7CisJdWludDMyX3QgemNvbXA7CisJc3RydWN0IGRybV9tbV9ub2RlICp0YWdfbWVtOworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X2JvIHsKQEAgLTg4LDYgKzEwMyw3IEBACiAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFubmVsOwogCisJc3RydWN0IG5vdXZlYXVfdm1hIHZtYTsKIAlib29sIG1hcHBhYmxlOwogCWJvb2wgbm9fdm07CiAKQEAgLTk2LDcgKzExMiw2IEBACiAJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGU7CiAKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKmNwdV9maWxwOwogCWludCBwaW5fcmVmY250OwogfTsKIApAQCAtMTMzLDIwICsxNDgsMjggQEAKIAogI2RlZmluZSBOVk9CSl9FTkdJTkVfU1cJCTAKICNkZWZpbmUgTlZPQkpfRU5HSU5FX0dSCQkxCi0jZGVmaW5lIE5WT0JKX0VOR0lORV9ESVNQTEFZCTIKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX1BQUAkyCisjZGVmaW5lIE5WT0JKX0VOR0lORV9DT1BZCTMKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX1ZQCQk0CisjZGVmaW5lIE5WT0JKX0VOR0lORV9DUllQVCAgICAgIDUKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX0JTUAk2CisjZGVmaW5lIE5WT0JKX0VOR0lORV9ESVNQTEFZCTB4Y2FmZTAwMDEKICNkZWZpbmUgTlZPQkpfRU5HSU5FX0lOVAkweGRlYWRiZWVmCiAKKyNkZWZpbmUgTlZPQkpfRkxBR19ET05UX01BUCAgICAgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MJCSgxIDw8IDEpCiAjZGVmaW5lIE5WT0JKX0ZMQUdfWkVST19GUkVFCQkoMSA8PCAyKQorI2RlZmluZSBOVk9CSl9GTEFHX1ZNCQkJKDEgPDwgMykKKworI2RlZmluZSBOVk9CSl9DSU5TVF9HTE9CQUwJMHhkZWFkYmVlZgorCiBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCi0Jc3RydWN0IGRybV9tbV9ub2RlICppbV9wcmFtaW47Ci0Jc3RydWN0IG5vdXZlYXVfYm8gKmltX2JhY2tpbmc7Ci0JdWludDMyX3QgKmltX2JhY2tpbmdfc3VzcGVuZDsKLQlpbnQgaW1fYm91bmQ7CisJdm9pZCAqbm9kZTsKKwl1MzIgKnN1c3BlbmQ7CiAKIAl1aW50MzJfdCBmbGFnczsKIApAQCAtMTYyLDEwICsxODUsMjkgQEAKIAl2b2lkICpwcml2OwogfTsKIAorc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQ7CisJaW50IGNydGMsIGJwcCwgcGl0Y2gsIHgsIHk7CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworZW51bSBub3V2ZWF1X2NoYW5uZWxfbXV0ZXhfY2xhc3MgeworCU5PVVZFQVVfVUNIQU5ORUxfTVVURVgsCisJTk9VVkVBVV9LQ0hBTk5FTF9NVVRFWAorfTsKKwogc3RydWN0IG5vdXZlYXVfY2hhbm5lbCB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlpbnQgaWQ7CiAKKwkvKiByZWZlcmVuY2VzIHRvIHRoZSBjaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IGtyZWYgcmVmOworCS8qIHVzZXJzIG9mIHRoZSBoYXJkd2FyZSBjaGFubmVsIHJlc291cmNlcywgdGhlIGhhcmR3YXJlCisJICogY29udGV4dCB3aWxsIGJlIGtpY2tlZCBvZmYgd2hlbiBpdCByZWFjaGVzIHplcm8uICovCisJYXRvbWljX3QgdXNlcnM7CisJc3RydWN0IG11dGV4IG11dGV4OworCiAJLyogb3duZXIgb2YgdGhpcyBmaWZvICovCiAJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CiAJLyogbWFwcGluZyBvZiB0aGUgZmlmbyBpdHNlbGYgKi8KQEAgLTE5OCwxNiArMjQwLDE3IEBACiAJLyogUEZJRk8gY29udGV4dCAqLwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtZmM7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjYWNoZTsKKwl2b2lkICpmaWZvX3ByaXY7CiAKIAkvKiBQR1JBUEggY29udGV4dCAqLwogCS8qIFhYWCBtYXkgYmUgbWVyZ2UgMiBwb2ludGVycyBhcyBwcml2YXRlIGRhdGEgPz8/ICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbl9ncmN0eDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmNyeXB0X2N0eDsKIAl2b2lkICpwZ3JhcGhfY3R4OwogCiAJLyogTlY1MCBWTSAqLworCXN0cnVjdCBub3V2ZWF1X3ZtICAgICAqdm07CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV9wZDsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnZtX2dhcnRfcHQ7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV92cmFtX3B0W05WNTBfVk1fVlJBTV9OUl07CiAKIAkvKiBPYmplY3RzICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbjsgLyogUHJpdmF0ZSBpbnN0bWVtICovCkBAIC0yMzgsOSArMjgxLDExIEBACiAKIAlzdHJ1Y3QgewogCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnZibHNlbTsKKwkJdWludDMyX3QgdmJsc2VtX2hlYWQ7CiAJCXVpbnQzMl90IHZibHNlbV9vZmZzZXQ7CiAJCXVpbnQzMl90IHZibHNlbV9ydmFsOwogCQlzdHJ1Y3QgbGlzdF9oZWFkIHZibF93YWl0OworCQlzdHJ1Y3QgbGlzdF9oZWFkIGZsaXA7CiAJfSBudnN3OwogCiAJc3RydWN0IHsKQEAgLTI1OCwxMSArMzAzLDExIEBACiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJdm9pZAkoKnJlc3VtZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLQlpbnQJKCpwb3B1bGF0ZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCi0JCQkgICAgdWludDMyX3QgKnNpemUpOwotCXZvaWQJKCpjbGVhcikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotCWludAkoKmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLQlpbnQJKCp1bmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKwlpbnQJKCpnZXQpKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKTsKKwl2b2lkCSgqcHV0KShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJaW50CSgqbWFwKShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJdm9pZAkoKnVubWFwKShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisKIAl2b2lkCSgqZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogfTsKIApAQCAtMjc5LDE1ICszMjQsMjEgQEAKIAogc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lIHsKIAlpbnQgbnVtX3RpbGVzOworCXN0cnVjdCBkcm1fbW0gdGFnX2hlYXA7CisJdm9pZCAqcHJpdjsKIAogCWludCAgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqdGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi0Jdm9pZCAoKnNldF9yZWdpb25fdGlsaW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCQkgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpOworCXZvaWQgKCppbml0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwKKwkJCQkgdWludDMyX3QgYWRkciwgdWludDMyX3Qgc2l6ZSwKKwkJCQkgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGZsYWdzKTsKKwl2b2lkICgqc2V0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CisJdm9pZCAoKmZyZWVfdGlsZV9yZWdpb24pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lIHsKKwl2b2lkICpwcml2OwogCWludCAgY2hhbm5lbHM7CiAKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBsYXlsaXN0WzJdOwpAQCAtMzEwLDIyICszNjEsMTEgQEAKIAl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIH07CiAKLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIHsKLQlpbnQgaWQ7Ci0JaW50ICgqZXhlYykoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsIGludCBtdGhkLAotCQkgICAgICB1aW50MzJfdCBkYXRhKTsKLX07Ci0KLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgewotCWludCBpZDsKLQlib29sIHNvZnR3YXJlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kICptZXRob2RzOwotfTsKLQogc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSB7Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyAqZ3JjbGFzczsKIAlib29sIGFjY2VsX2Jsb2NrZWQ7CisJYm9vbCByZWdpc3RlcmVkOwogCWludCBncmN0eF9zaXplOworCXZvaWQgKnByaXY7CiAKIAkvKiBOVjJ4L05WM3ggY29udGV4dCB0YWJsZSAoMHg0MDA3ODApICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHhfdGFibGU7CkBAIC0zNDIsOCArMzgyLDcgQEAKIAlpbnQgICgqdW5sb2FkX2NvbnRleHQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCXZvaWQgKCp0bGJfZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi0Jdm9pZCAoKnNldF9yZWdpb25fdGlsaW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCQkgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKTsKKwl2b2lkICgqc2V0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5X2VuZ2luZSB7CkBAIC0zNTUsMTMgKzM5NCwxOSBAQAogfTsKIAogc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgeworCXZvaWQgKnByaXY7CisKIAlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogCWludCAgKCpnZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnKTsKIAlpbnQgICgqc2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgaW50IHN0YXRlKTsKIAotCXZvaWQgKCppcnFfZW5hYmxlKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgYm9vbCBvbik7CisJaW50ICAoKmlycV9yZWdpc3Rlcikoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgIHZvaWQgKCopKHZvaWQgKiwgaW50KSwgdm9pZCAqKTsKKwl2b2lkICgqaXJxX3VucmVnaXN0ZXIpKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLAorCQkJICAgICAgIHZvaWQgKCopKHZvaWQgKiwgaW50KSwgdm9pZCAqKTsKKwlib29sICgqaXJxX2VuYWJsZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsIGJvb2wgb24pOwogfTsKIAogc3RydWN0IG5vdXZlYXVfcG1fdm9sdGFnZV9sZXZlbCB7CkBAIC00MzcsNiArNDgyLDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqY3VyOwogCiAJc3RydWN0IGRldmljZSAqaHdtb247CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfbmI7CiAKIAlpbnQgKCpjbG9ja19nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiBpZCk7CiAJdm9pZCAqKCpjbG9ja19wcmUpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICosCkBAIC00NDksNiArNDk1LDI1IEBACiAJaW50ICgqdGVtcF9nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogfTsKIAorc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lIHsKKwlib29sIHJlZ2lzdGVyZWQ7CisKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgICgqY3JlYXRlX2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJdm9pZCAoKmRlc3Ryb3lfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3ZyYW1fZW5naW5lIHsKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICAoKmdldCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0LCB1MzIgYWxpZ24sIHUzMiBzaXplX25jLAorCQkgICAgdTMyIHR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworCXZvaWQgKCpwdXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworCisJYm9vbCAoKmZsYWdzX3ZhbGlkKShzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgdGlsZV9mbGFncyk7Cit9OworCiBzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgewogCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lIGluc3RtZW07CiAJc3RydWN0IG5vdXZlYXVfbWNfZW5naW5lICAgICAgbWM7CkBAIC00NTksNiArNTI0LDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5X2VuZ2luZSBkaXNwbGF5OwogCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICAgIGdwaW87CiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICAgICAgcG07CisJc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lICAgY3J5cHQ7CisJc3RydWN0IG5vdXZlYXVfdnJhbV9lbmdpbmUgICAgdnJhbTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHsKQEAgLTU3NywxOCArNjQ0LDE1IEBACiAJYm9vbCByYW1pbl9hdmFpbGFibGU7CiAJc3RydWN0IGRybV9tbSByYW1pbl9oZWFwOwogCXN0cnVjdCBsaXN0X2hlYWQgZ3B1b2JqX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjbGFzc2VzOwogCiAJc3RydWN0IG5vdXZlYXVfYm8gKnZnYV9yYW07CiAKKwkvKiBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl2b2lkICgqaXJxX2hhbmRsZXJbMzJdKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlib29sIG1zaV9lbmFibGVkOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGhwZF93b3JrOwotCi0Jc3RydWN0IHsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQl1aW50MzJfdCBocGQwX2JpdHM7Ci0JCXVpbnQzMl90IGhwZDFfYml0czsKLQl9IGhwZF9zdGF0ZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3dhaXRpbmc7CiAKQEAgLTYwNSw4ICs2NjksMTAgQEAKIAkJc3RydWN0IG5vdXZlYXVfYm8gKmJvOwogCX0gZmVuY2U7CiAKLQlpbnQgZmlmb19hbGxvY19jb3VudDsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpmaWZvc1tOT1VWRUFVX01BWF9DSEFOTkVMX05SXTsKKwlzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKnB0cltOT1VWRUFVX01BWF9DSEFOTkVMX05SXTsKKwl9IGNoYW5uZWxzOwogCiAJc3RydWN0IG5vdXZlYXVfZW5naW5lIGVuZ2luZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFubmVsOwpAQCAtNjMyLDEyICs2OTgsMTQgQEAKIAkJdWludDY0X3QgYXBlcl9mcmVlOwogCiAJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqc2dfY3R4ZG1hOwotCQlzdHJ1Y3QgcGFnZSAqc2dfZHVtbXlfcGFnZTsKLQkJZG1hX2FkZHJfdCBzZ19kdW1teV9idXM7CisJCXN0cnVjdCBub3V2ZWF1X3ZtYSB2bWE7CiAJfSBnYXJ0X2luZm87CiAKIAkvKiBudjEwLW52NDAgdGlsaW5nIHJlZ2lvbnMgKi8KLQlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyB0aWxlW05PVVZFQVVfTUFYX1RJTEVfTlJdOworCXN0cnVjdCB7CisJCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnIHJlZ1tOT1VWRUFVX01BWF9USUxFX05SXTsKKwkJc3BpbmxvY2tfdCBsb2NrOworCX0gdGlsZTsKIAogCS8qIFZSQU0vZmIgY29uZmlndXJhdGlvbiAqLwogCXVpbnQ2NF90IHZyYW1fc2l6ZTsKQEAgLTY1MCwxNCArNzE4LDEyIEBACiAJdWludDY0X3QgZmJfYXBlcl9mcmVlOwogCWludCBmYl9tdHJyOwogCisJLyogQkFSIGNvbnRyb2wgKE5WNTAtKSAqLworCXN0cnVjdCBub3V2ZWF1X3ZtICpiYXIxX3ZtOworCXN0cnVjdCBub3V2ZWF1X3ZtICpiYXIzX3ZtOworCiAJLyogRzh4L0c5eCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLQl1aW50NjRfdCB2bV9nYXJ0X2Jhc2U7Ci0JdWludDY0X3Qgdm1fZ2FydF9zaXplOwotCXVpbnQ2NF90IHZtX3ZyYW1fYmFzZTsKLQl1aW50NjRfdCB2bV92cmFtX3NpemU7Ci0JdWludDY0X3Qgdm1fZW5kOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdm1fdnJhbV9wdFtOVjUwX1ZNX1ZSQU1fTlJdOwotCWludCB2bV92cmFtX3B0X25yOworCXN0cnVjdCBub3V2ZWF1X3ZtICpjaGFuX3ZtOwogCiAJc3RydWN0IG52YmlvcyB2YmlvczsKIApAQCAtNjc0LDYgKzc0MCw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodDsKIAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKKwl1MzIgZXZvX2FsbG9jOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKIAkJdTE2IHNjcmlwdDsKQEAgLTY4Niw2ICs3NTMsOCBAQAogCiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldjsKIAlzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYXBlcnR1cmVzOworCisJYm9vbCBwb3dlcmVkX2Rvd247CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICoKQEAgLTcxOSwxNiArNzg4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4oaWQsIGNsLCBjaCkgZG8geyAgICBcCi0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKm52ID0gZGV2LT5kZXZfcHJpdmF0ZTsgICAgICAgXAotCWlmICghbm91dmVhdV9jaGFubmVsX293bmVyKGRldiwgKGNsKSwgKGlkKSkpIHsgICAgICAgICAgIFwKLQkJTlZfRVJST1IoZGV2LCAicGlkICVkIGRvZXNuJ3Qgb3duIGNoYW5uZWwgJWRcbiIsIFwKLQkJCSBEUk1fQ1VSUkVOVFBJRCwgKGlkKSk7ICAgICAgICAgICAgICAgICAgXAotCQlyZXR1cm4gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoY2gpID0gbnYtPmZpZm9zWyhpZCldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCiAvKiBub3V2ZWF1X2Rydi5jICovCiBleHRlcm4gaW50IG5vdXZlYXVfYWdwbW9kZTsKIGV4dGVybiBpbnQgbm91dmVhdV9kdWFsbGluazsKQEAgLTc0OCw2ICs4MDcsNyBAQAogZXh0ZXJuIGludCBub3V2ZWF1X292ZXJyaWRlX2Nvbm50eXBlOwogZXh0ZXJuIGNoYXIgKm5vdXZlYXVfcGVyZmx2bDsKIGV4dGVybiBpbnQgbm91dmVhdV9wZXJmbHZsX3dyOworZXh0ZXJuIGludCBub3V2ZWF1X21zaTsKIAogZXh0ZXJuIGludCBub3V2ZWF1X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpOwogZXh0ZXJuIGludCBub3V2ZWF1X3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwpAQCAtNzYyLDggKzgyMiwxMCBAQAogCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKIGV4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfc2V0cGFyYW0oc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKIAkJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7Ci1leHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfdW50aWwoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKLQkJCSAgICAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CitleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfZXEoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKKwkJCSAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CitleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfbmUoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKKwkJCSAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CiBleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2NhcmRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIApAQCAtNzc1LDE4ICs4MzcsMTggQEAKIGV4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbm91dmVhdV9tZW1fcmVzZXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9tZW1fY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKm52MTBfbWVtX3NldF90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJCSAgICB1aW50MzJfdCBhZGRyLAotCQkJCQkJICAgIHVpbnQzMl90IHNpemUsCi0JCQkJCQkgICAgdWludDMyX3QgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgbnYxMF9tZW1fZXhwaXJlX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAotCQkJCSAgIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSk7Ci1leHRlcm4gaW50ICBudjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50NjRfdCB2aXJ0LAotCQkJCSAgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncywKLQkJCQkgICAgdWludDY0X3QgcGh5cyk7Ci1leHRlcm4gdm9pZCBudjUwX21lbV92bV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdmlydCwKLQkJCSAgICAgICB1aW50MzJfdCBzaXplKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBib29sIG5vdXZlYXVfbWVtX2ZsYWdzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiB0aWxlX2ZsYWdzKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqbnYxMF9tZW1fc2V0X3RpbGluZygKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAorCXVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncyk7CitleHRlcm4gdm9pZCBudjEwX21lbV9wdXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAorCQkJCSAgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXJfZnVuYyBub3V2ZWF1X3ZyYW1fbWFuYWdlcjsKKworLyogbnZjMF92cmFtLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXJfZnVuYyBudmMwX3ZyYW1fbWFuYWdlcjsKIAogLyogbm91dmVhdV9ub3RpZmllci5jICovCiBleHRlcm4gaW50ICBub3V2ZWF1X25vdGlmaWVyX2luaXRfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtODAzLDIxICs4NjUsNDQgQEAKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2Mgbm91dmVhdV9pb2N0bHNbXTsKIGV4dGVybiBpbnQgbm91dmVhdV9tYXhfaW9jdGw7CiBleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7Ci1leHRlcm4gaW50ICBub3V2ZWF1X2NoYW5uZWxfb3duZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICosCi0JCQkJICBpbnQgY2hhbm5lbCk7CiBleHRlcm4gaW50ICBub3V2ZWF1X2NoYW5uZWxfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipjaGFuLAogCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJICB1aW50MzJfdCBmYl9jdHhkbWEsIHVpbnQzMl90IHR0X2N0eGRtYSk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfZnJlZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbm91dmVhdV9jaGFubmVsX2dldF91bmxvY2tlZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbm91dmVhdV9jaGFubmVsX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKiwgaW50IGlkKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfcHV0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9jaGFubmVsX3JlZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfaWRsZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKTsKIAogLyogbm91dmVhdV9vYmplY3QuYyAqLworI2RlZmluZSBOVk9CSl9DTEFTUyhkLGMsZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgcmV0ID0gbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KChkKSwgKGMpLCBOVk9CSl9FTkdJTkVfIyNlKTsgICAgICAgIFwKKwlpZiAocmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE5WT0JKX01USEQoZCxjLG0sZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCByZXQgPSBub3V2ZWF1X2dwdW9ial9tdGhkX25ldygoZCksIChjKSwgKG0pLCAoZSkpOyAgICAgICAgICAgICAgICAgXAorCWlmIChyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKIGV4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX2Vhcmx5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiBjbGFzcywgdTMyIGVuZyk7CitleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9tdGhkX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgY2xhc3MsIHUzMiBtdGhkLAorCQkJCSAgICBpbnQgKCpleGVjKShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCisJCQkJCSAgICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiwgdTMyLCB1MzIpOworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHUzMiwgdTMyLCB1MzIpOwogZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAogCQkJCSAgICAgICB1aW50MzJfdCB2cmFtX2gsIHVpbnQzMl90IHR0X2gpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtODMyLDIxICs5MTcsMjUgQEAKIGV4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywKIAkJCQkgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwgaW50IGFjY2VzcywKIAkJCQkgIGludCB0YXJnZXQsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7Ci1leHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2dhcnRfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCi0JCQkJICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwKLQkJCQkgICAgICAgaW50IGFjY2Vzcywgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqLAotCQkJCSAgICAgICB1aW50MzJfdCAqb19yZXQpOwotZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9ncl9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCBpbnQgY2xhc3MsCi0JCQkJIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7Ci1leHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX3N3X25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywKLQkJCQkgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZ3JfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdTMyIGhhbmRsZSwgaW50IGNsYXNzKTsKK2V4dGVybiBpbnQgbnY1MF9ncHVvYmpfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywgdTY0IGJhc2UsCisJCQkgICAgICAgdTY0IHNpemUsIGludCB0YXJnZXQsIGludCBhY2Nlc3MsIHUzMiB0eXBlLAorCQkJICAgICAgIHUzMiBjb21wLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwb2JqKTsKK2V4dGVybiB2b2lkIG52NTBfZ3B1b2JqX2RtYV9pbml0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgb2Zmc2V0LAorCQkJCSBpbnQgY2xhc3MsIHU2NCBiYXNlLCB1NjQgc2l6ZSwgaW50IHRhcmdldCwKKwkJCQkgaW50IGFjY2VzcywgdTMyIHR5cGUsIHUzMiBjb21wKTsKIGV4dGVybiBpbnQgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAogCQkJCSAgICAgc3RydWN0IGRybV9maWxlICopOwogZXh0ZXJuIGludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCiAJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAKIC8qIG5vdXZlYXVfaXJxLmMgKi8KK2V4dGVybiBpbnQgICAgICAgICBub3V2ZWF1X2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgICAgICAgIG5vdXZlYXVfaXJxX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaXJxcmV0dXJuX3Qgbm91dmVhdV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIHZvaWQgICAgICAgIG5vdXZlYXVfaXJxX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBzdGF0dXNfYml0LAorCQkJCQl2b2lkICgqKShzdHJ1Y3QgZHJtX2RldmljZSAqKSk7CitleHRlcm4gdm9pZCAgICAgICAgbm91dmVhdV9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgc3RhdHVzX2JpdCk7CiBleHRlcm4gdm9pZCAgICAgICAgbm91dmVhdV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgICAgICAgICBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkICAgICAgICBub3V2ZWF1X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC04NTQsOCArOTQzLDggQEAKIC8qIG5vdXZlYXVfc2dkbWEuYyAqLwogZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBub3V2ZWF1X3NnZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2dldF9wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQzMl90IG9mZnNldCwKLQkJCQkgIHVpbnQzMl90ICpwYWdlKTsKK2V4dGVybiB1aW50MzJfdCBub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCQkgICB1aW50MzJfdCBvZmZzZXQpOwogZXh0ZXJuIHN0cnVjdCB0dG1fYmFja2VuZCAqbm91dmVhdV9zZ2RtYV9pbml0X3R0bShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogLyogbm91dmVhdV9kZWJ1Z2ZzLmMgKi8KQEAgLTk2NiwxOCArMTA1NSwyNSBAQAogLyogbnYxMF9mYi5jICovCiBleHRlcm4gaW50ICBudjEwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjEwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYxMF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCSAgICAgIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjEwX2ZiX2luaXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksCisJCQkJICAgICB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAorCQkJCSAgICAgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGZsYWdzKTsKK2V4dGVybiB2b2lkIG52MTBfZmJfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKK2V4dGVybiB2b2lkIG52MTBfZmJfZnJlZV90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiAKIC8qIG52MzBfZmIuYyAqLwogZXh0ZXJuIGludCAgbnYzMF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnYzMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MzBfZmJfaW5pdF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwKKwkJCQkgICAgIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHNpemUsCisJCQkJICAgICB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgbnYzMF9mYl9mcmVlX3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIAogLyogbnY0MF9mYi5jICovCiBleHRlcm4gaW50ICBudjQwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjQwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnY0MF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCSAgICAgIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjQwX2ZiX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CisKIC8qIG52NTBfZmIuYyAqLwogZXh0ZXJuIGludCAgbnY1MF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnY1MF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTk4OSw2ICsxMDg1LDcgQEAKIAogLyogbnYwNF9maWZvLmMgKi8KIGV4dGVybiBpbnQgIG52MDRfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9maWZvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2ZpZm9fZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfZmlmb19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gYm9vbCBudjA0X2ZpZm9fcmVhc3NpZ24oc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CkBAIC05OTgsMTkgKzEwOTUsMTggQEAKIGV4dGVybiB2b2lkIG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZmlmb19pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CiAKIC8qIG52MTBfZmlmby5jICovCiBleHRlcm4gaW50ICBudjEwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52MTBfZmlmb19jaGFubmVsX2lkKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7Ci1leHRlcm4gdm9pZCBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2ZpZm9fbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKIC8qIG52NDBfZmlmby5jICovCiBleHRlcm4gaW50ICBudjQwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52NDBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwotZXh0ZXJuIHZvaWQgbnY0MF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCkBAIC0xMDM4LDcgKzExMzQsNiBAQAogZXh0ZXJuIGludCAgbnZjMF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBudjA0X2dyYXBoLmMgKi8KLWV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MDRfZ3JhcGhfZ3JjbGFzc1tdOwogZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnYwNF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfZ3JhcGhfZmlmb19hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CkBAIC0xMDQ3LDEwICsxMTQyLDExIEBACiBleHRlcm4gdm9pZCBudjA0X2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gdm9pZCBudjA0X2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9tdGhkX3BhZ2VfZmxpcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudjA0X2dyYXBoX25zb3VyY2VbXTsKIAogLyogbnYxMF9ncmFwaC5jICovCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjEwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52MTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqbnYxMF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTA1OCwxMyArMTE1NCwxMSBAQAogZXh0ZXJuIHZvaWQgbnYxMF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MTBfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52MTBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCB1aW50MzJfdCwKLQkJCQkJIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjEwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9pbnRyW107CitleHRlcm4gc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9uc3RhdHVzW107CiAKIC8qIG52MjBfZ3JhcGguYyAqLwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYyMF9ncmFwaF9ncmNsYXNzW107Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjMwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiB2b2lkIG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjIwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtMTA3MiwxMSArMTE2Niw5IEBACiBleHRlcm4gaW50ICBudjIwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjIwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnYzMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCQkgdWludDMyX3QsIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkIG52MjBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIAogLyogbnY0MF9ncmFwaC5jICovCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjQwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52NDBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52NDBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqbnY0MF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTA4NSwxMSArMTE3Nyw5IEBACiBleHRlcm4gaW50ICBudjQwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52NDBfZ3JjdHhfaW5pdChzdHJ1Y3Qgbm91dmVhdV9ncmN0eCAqKTsKLWV4dGVybiB2b2lkIG52NDBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCB1aW50MzJfdCwKLQkJCQkJIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjQwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiAKIC8qIG52NTBfZ3JhcGguYyAqLwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY1MF9ncmFwaF9ncmNsYXNzW107CiBleHRlcm4gaW50ICBudjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjUwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnY1MF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sKTsKQEAgLTEwOTgsMTAgKzExODgsMTAgQEAKIGV4dGVybiB2b2lkIG52NTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjUwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY1MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBudjUwX2dyY3R4X2luaXQoc3RydWN0IG5vdXZlYXVfZ3JjdHggKik7CiBleHRlcm4gdm9pZCBudjUwX2dyYXBoX3RsYl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG52ODZfZ3JhcGhfdGxiX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2VudW0gbnY1MF9kYXRhX2Vycm9yX25hbWVzW107CiAKIC8qIG52YzBfZ3JhcGguYyAqLwogZXh0ZXJuIGludCAgbnZjMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTExMywxNiArMTIwMywyMiBAQAogZXh0ZXJuIGludCAgbnZjMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52YzBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKKy8qIG52ODRfY3J5cHQuYyAqLworZXh0ZXJuIGludCAgbnY4NF9jcnlwdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbnY4NF9jcnlwdF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCAgbnY4NF9jcnlwdF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbnY4NF9jcnlwdF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52ODRfY3J5cHRfdGxiX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiAvKiBudjA0X2luc3RtZW0uYyAqLwogZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBudjA0X2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gaW50ICBudjA0X2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCi0JCQkJICB1aW50MzJfdCAqc2l6ZSk7Ci1leHRlcm4gdm9pZCBudjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fZ2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9wdXQoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX21hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fdW5tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwogZXh0ZXJuIHZvaWQgbnYwNF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBudjUwX2luc3RtZW0uYyAqLwpAQCAtMTEzMCwyNiArMTIyNiwxOCBAQAogZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAotCQkJCSAgdWludDMyX3QgKnNpemUpOwotZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiBpbnQgIG52NTBfaW5zdG1lbV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX2dldChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwgdTMyIHNpemUsIHUzMiBhbGlnbik7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcHV0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKK2V4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKIGV4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52ODRfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52NTBfdm1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGVuZ2luZSk7CiAKIC8qIG52YzBfaW5zdG1lbS5jICovCiBleHRlcm4gaW50ICBudmMwX2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52YzBfaW5zdG1lbV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnZjMF9pbnN0bWVtX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiBpbnQgIG52YzBfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKLQkJCQkgIHVpbnQzMl90ICpzaXplKTsKLWV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gaW50ICBudmMwX2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gaW50ICBudmMwX2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogLyogbnYwNF9tYy5jICovCiBleHRlcm4gaW50ICBudjA0X21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC0xMjE5LDYgKzEzMDcsOSBAQAogZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTE2IHZhbCk7CiBleHRlcm4gdTMyIG5vdXZlYXVfYm9fcmQzMihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTMyIHZhbCk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JvX2ZlbmNlKHN0cnVjdCBub3V2ZWF1X2JvICosIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX3ZhbGlkYXRlKHN0cnVjdCBub3V2ZWF1X2JvICosIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCSAgICAgICBib29sIG5vX3dhaXRfcmVzZXJ2ZSwgYm9vbCBub193YWl0X2dwdSk7CiAKIC8qIG5vdXZlYXVfZmVuY2UuYyAqLwogc3RydWN0IG5vdXZlYXVfZmVuY2U7CkBAIC0xMjM0LDEyICsxMzI1LDM1IEBACiAJCQkgICAgICAgdm9pZCAoKndvcmspKHZvaWQgKnByaXYsIGJvb2wgc2lnbmFsbGVkKSwKIAkJCSAgICAgICB2b2lkICpwcml2KTsKIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm5vdXZlYXVfZmVuY2VfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKTsKLWV4dGVybiBib29sIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgbm91dmVhdV9mZW5jZV93YWl0KHZvaWQgKm9iaiwgdm9pZCAqYXJnLCBib29sIGxhenksIGJvb2wgaW50cik7CisKK2V4dGVybiBib29sIF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQodm9pZCAqb2JqLCB2b2lkICphcmcpOworZXh0ZXJuIGludCBfX25vdXZlYXVfZmVuY2Vfd2FpdCh2b2lkICpvYmosIHZvaWQgKmFyZywgYm9vbCBsYXp5LCBib29sIGludHIpOworZXh0ZXJuIGludCBfX25vdXZlYXVfZmVuY2VfZmx1c2godm9pZCAqb2JqLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX19ub3V2ZWF1X2ZlbmNlX3VucmVmKHZvaWQgKipvYmopOworZXh0ZXJuIHZvaWQgKl9fbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKKworc3RhdGljIGlubGluZSBib29sIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvYmopCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQob2JqLCBOVUxMKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50Citub3V2ZWF1X2ZlbmNlX3dhaXQoc3RydWN0IG5vdXZlYXVfZmVuY2UgKm9iaiwgYm9vbCBsYXp5LCBib29sIGludHIpCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV93YWl0KG9iaiwgTlVMTCwgbGF6eSwgaW50cik7Cit9CiBleHRlcm4gaW50IG5vdXZlYXVfZmVuY2Vfc3luYyhzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqLCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwotZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX2ZsdXNoKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfdW5yZWYodm9pZCAqKm9iaik7Ci1leHRlcm4gdm9pZCAqbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKK3N0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfZmVuY2VfZmx1c2goc3RydWN0IG5vdXZlYXVfZmVuY2UgKm9iaikKK3sKKwlyZXR1cm4gX19ub3V2ZWF1X2ZlbmNlX2ZsdXNoKG9iaiwgTlVMTCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9mZW5jZV91bnJlZihzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKm9iaikKK3sKKwlfX25vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKiopb2JqKTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfZmVuY2UgKm5vdXZlYXVfZmVuY2VfcmVmKHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvYmopCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV9yZWYob2JqKTsKK30KIAogLyogbm91dmVhdV9nZW0uYyAqLwogZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLApAQCAtMTI1OSwxNSArMTM3MywyOCBAQAogZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKIAorLyogbm91dmVhdV9kaXNwbGF5LmMgKi8KK2ludCBub3V2ZWF1X3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwordm9pZCBub3V2ZWF1X3ZibGFua19kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2ludCBub3V2ZWF1X2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCk7CitpbnQgbm91dmVhdV9maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCSAgICAgc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlICopOworCiAvKiBudjEwX2dwaW8uYyAqLwogaW50IG52MTBfZ3Bpb19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKTsKIGludCBudjEwX2dwaW9fc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgaW50IHN0YXRlKTsKIAogLyogbnY1MF9ncGlvLmMgKi8KIGludCBudjUwX2dwaW9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgbnY1MF9ncGlvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOwogaW50IG52NTBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOwotdm9pZCBudjUwX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgYm9vbCBvbik7CitpbnQgIG52NTBfZ3Bpb19pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgdm9pZCAoKikodm9pZCAqLCBpbnQpLCB2b2lkICopOwordm9pZCBudjUwX2dwaW9faXJxX3VucmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgICB2b2lkICgqKSh2b2lkICosIGludCksIHZvaWQgKik7Citib29sIG52NTBfZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLCBib29sIG9uKTsKIAogLyogbnY1MF9jYWxjLiAqLwogaW50IG52NTBfY2FsY19wbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IHBsbF9saW1zICosIGludCBjbGssCkBAIC0xMzM0LDcgKzE0NjEsOSBAQAogfQogCiAjZGVmaW5lIG52X3dhaXQoZGV2LCByZWcsIG1hc2ssIHZhbCkgXAotCW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDIwMDAwMDAwMDBVTEwsIChyZWcpLCAobWFzayksICh2YWwpKQorCW5vdXZlYXVfd2FpdF9lcShkZXYsIDIwMDAwMDAwMDBVTEwsIChyZWcpLCAobWFzayksICh2YWwpKQorI2RlZmluZSBudl93YWl0X25lKGRldiwgcmVnLCBtYXNrLCB2YWwpIFwKKwlub3V2ZWF1X3dhaXRfbmUoZGV2LCAyMDAwMDAwMDAwVUxMLCAocmVnKSwgKG1hc2spLCAodmFsKSkKIAogLyogUFJBTUlOIGFjY2VzcyAqLwogc3RhdGljIGlubGluZSB1MzIgbnZfcmkzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQpCkBAIC0xNDQ3LDYgKzE1NzYsMjMgQEAKIAkJZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IHN1Yl9kZXZpY2U7CiB9CiAKKy8qIG1lbW9yeSB0eXBlL2FjY2VzcyBmbGFncywgZG8gbm90IG1hdGNoIGhhcmR3YXJlIHZhbHVlcyAqLworI2RlZmluZSBOVl9NRU1fQUNDRVNTX1JPICAxCisjZGVmaW5lIE5WX01FTV9BQ0NFU1NfV08gIDIKKyNkZWZpbmUgTlZfTUVNX0FDQ0VTU19SVyAoTlZfTUVNX0FDQ0VTU19STyB8IE5WX01FTV9BQ0NFU1NfV08pCisjZGVmaW5lIE5WX01FTV9BQ0NFU1NfU1lTIDQKKyNkZWZpbmUgTlZfTUVNX0FDQ0VTU19WTSAgOAorCisjZGVmaW5lIE5WX01FTV9UQVJHRVRfVlJBTSAgICAgICAgMAorI2RlZmluZSBOVl9NRU1fVEFSR0VUX1BDSSAgICAgICAgIDEKKyNkZWZpbmUgTlZfTUVNX1RBUkdFVF9QQ0lfTk9TTk9PUCAyCisjZGVmaW5lIE5WX01FTV9UQVJHRVRfVk0gICAgICAgICAgMworI2RlZmluZSBOVl9NRU1fVEFSR0VUX0dBUlQgICAgICAgIDQKKworI2RlZmluZSBOVl9NRU1fVFlQRV9WTSAweDdmCisjZGVmaW5lIE5WX01FTV9DT01QX1ZNIDB4MDMKKworLyogTlZfU1cgb2JqZWN0IGNsYXNzICovCiAjZGVmaW5lIE5WX1NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1MDZlCiAjZGVmaW5lIE5WX1NXX0RNQV9TRU1BUEhPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDYwCiAjZGVmaW5lIE5WX1NXX1NFTUFQSE9SRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDY0CkBAIC0xNDU3LDUgKzE2MDMsNiBAQAogI2RlZmluZSBOVl9TV19WQkxTRU1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBOVl9TV19WQkxTRU1fUkVMRUFTRV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAogI2RlZmluZSBOVl9TV19WQkxTRU1fUkVMRUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAorI2RlZmluZSBOVl9TV19QQUdFX0ZMSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAogCiAjZW5kaWYgLyogX19OT1VWRUFVX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwppbmRleCAwMmE0ZDFmLi5hMjZkMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCkBAIC00OSw2ICs0OSwxMDIgQEAKICNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKIAorc3RhdGljIHZvaWQKK25vdXZlYXVfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiAhKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmCisJICAgIG11dGV4X3RyeWxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCkpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJCXJldCA9IG52MDRfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCWVsc2UKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCXJldCA9IG52NTBfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNoYW5uZWwtPm11dGV4KTsKKwl9CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybjsKKworCWlmIChyZXQgIT0gLUVOT0RFVikKKwkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOworCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqaW1hZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlyZXQgPSAtRU5PREVWOworCWlmICghaW5faW50ZXJydXB0KCkgJiYgIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJgorCSAgICBtdXRleF90cnlsb2NrKCZkZXZfcHJpdi0+Y2hhbm5lbC0+bXV0ZXgpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlyZXQgPSBudjA0X2ZiY29uX2NvcHlhcmVhKGluZm8sIGltYWdlKTsKKwkJZWxzZQorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKQorCQkJcmV0ID0gbnY1MF9mYmNvbl9jb3B5YXJlYShpbmZvLCBpbWFnZSk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fY29weWFyZWEoaW5mbywgaW1hZ2UpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocmV0ICE9IC1FTk9ERVYpCisJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKKwljZmJfY29weWFyZWEoaW5mbywgaW1hZ2UpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9mYmNvbl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlyZXQgPSAtRU5PREVWOworCWlmICghaW5faW50ZXJydXB0KCkgJiYgIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJgorCSAgICBtdXRleF90cnlsb2NrKCZkZXZfcHJpdi0+Y2hhbm5lbC0+bXV0ZXgpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlyZXQgPSBudjA0X2ZiY29uX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCWVsc2UKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCXJldCA9IG52NTBfZmJjb25faW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJZWxzZQorCQkJcmV0ID0gbnZjMF9mYmNvbl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocmV0ICE9IC1FTk9ERVYpCisJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKKwljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKK30KKwogc3RhdGljIGludAogbm91dmVhdV9mYmNvbl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtNTgsMjIgKzE1NCwzNiBAQAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKIAlpbnQgcmV0LCBpOwogCi0JaWYgKCFjaGFuIHx8ICFjaGFuLT5hY2NlbF9kb25lIHx8CisJaWYgKCFjaGFuIHx8ICFjaGFuLT5hY2NlbF9kb25lIHx8IGluX2ludGVycnVwdCgpIHx8CiAJICAgIGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CiAJICAgIGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpCiAJCXJldHVybiAwOwogCi0JaWYgKFJJTkdfU1BBQ0UoY2hhbiwgNCkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmNoYW4tPm11dGV4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDQpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGFuLT5tdXRleCk7CiAJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JQkVHSU5fUklORyhjaGFuLCAwLCAweDAxMDQsIDEpOwotCU9VVF9SSU5HKGNoYW4sIDApOwotCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTAwLCAxKTsKLQlPVVRfUklORyhjaGFuLCAwKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkgeworCQlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDEwYywgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMTAwLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwl9IGVsc2UgeworCQlCRUdJTl9SSU5HKGNoYW4sIDAsIDB4MDEwNCwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTAwLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwl9CisKIAlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm0ybWZfbnRmeSArIDMsIDB4ZmZmZmZmZmYpOwogCUZJUkVfUklORyhjaGFuKTsKKwltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKIAogCXJldCA9IC1FQlVTWTsKIAlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKQEAgLTk3LDQwICsyMDcsMjQgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCiAJLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCisJLmZiX2ZpbGxyZWN0ID0gbm91dmVhdV9mYmNvbl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBub3V2ZWF1X2ZiY29uX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQgPSBub3V2ZWF1X2ZiY29uX2ltYWdlYmxpdCwKKwkuZmJfc3luYyA9IG5vdXZlYXVfZmJjb25fc3luYywKKwkuZmJfcGFuX2Rpc3BsYXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAorCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCisJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCisJLmZiX2RlYnVnX2VudGVyID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19lbnRlciwKKwkuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlLAorfTsKKworc3RhdGljIHN0cnVjdCBmYl9vcHMgbm91dmVhdV9mYmNvbl9zd19vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyLAogCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCi0JLmZiX3N5bmMgPSBub3V2ZWF1X2ZiY29uX3N5bmMsCi0JLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKLQkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAotCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAotCS5mYl9kZWJ1Z19lbnRlciA9IGRybV9mYl9oZWxwZXJfZGVidWdfZW50ZXIsCi0JLmZiX2RlYnVnX2xlYXZlID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19sZWF2ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG52MDRfZmJjb25fb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIgPSBkcm1fZmJfaGVscGVyX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3BhciA9IGRybV9mYl9oZWxwZXJfc2V0X3BhciwKLQkuZmJfZmlsbHJlY3QgPSBudjA0X2ZiY29uX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYSA9IG52MDRfZmJjb25fY29weWFyZWEsCi0JLmZiX2ltYWdlYmxpdCA9IG52MDRfZmJjb25faW1hZ2VibGl0LAotCS5mYl9zeW5jID0gbm91dmVhdV9mYmNvbl9zeW5jLAotCS5mYl9wYW5fZGlzcGxheSA9IGRybV9mYl9oZWxwZXJfcGFuX2Rpc3BsYXksCi0JLmZiX2JsYW5rID0gZHJtX2ZiX2hlbHBlcl9ibGFuaywKLQkuZmJfc2V0Y21hcCA9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKLQkuZmJfZGVidWdfZW50ZXIgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2VudGVyLAotCS5mYl9kZWJ1Z19sZWF2ZSA9IGRybV9mYl9oZWxwZXJfZGVidWdfbGVhdmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGZiX29wcyBudjUwX2ZiY29uX29wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCi0JLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCi0JLmZiX2ZpbGxyZWN0ID0gbnY1MF9mYmNvbl9maWxscmVjdCwKLQkuZmJfY29weWFyZWEgPSBudjUwX2ZiY29uX2NvcHlhcmVhLAotCS5mYl9pbWFnZWJsaXQgPSBudjUwX2ZiY29uX2ltYWdlYmxpdCwKLQkuZmJfc3luYyA9IG5vdXZlYXVfZmJjb25fc3luYywKIAkuZmJfcGFuX2Rpc3BsYXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAogCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCiAJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCkBAIC0yNTcsMjEgKzM1MSwxNiBAQAogCQkJICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAogCQkJICAgICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUOwogCWluZm8tPmZsYWdzIHw9IEZCSU5GT19DQU5fRk9SQ0VfT1VUUFVUOwotCWluZm8tPmZib3BzID0gJm5vdXZlYXVfZmJjb25fb3BzOwotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsgbnZiby0+Ym8ub2Zmc2V0IC0KLQkJCSAgICAgICBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCWluZm8tPmZib3BzID0gJm5vdXZlYXVfZmJjb25fc3dfb3BzOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsKKwkJCSAgICAgICAobnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQpOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHNpemU7CiAKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IG52Ym9fa21hcF9vYmpfaW92aXJ0dWFsKG5vdXZlYXVfZmItPm52Ym8pOwogCWluZm8tPnNjcmVlbl9zaXplID0gc2l6ZTsKIAotCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwogCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoaW5mbywgJm5mYmRldi0+aGVscGVyLCBzaXplcy0+ZmJfd2lkdGgsIHNpemVzLT5mYl9oZWlnaHQpOwogCi0JLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGRuJ3QgZXhwb3NlIG1taW8gc3BhY2UgYXQgYWxsICovCi0JaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0JaW5mby0+Zml4Lm1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKLQogCS8qIFNldCBhcGVydHVyZSBiYXNlL3NpemUgZm9yIHZlc2FmYiB0YWtlb3ZlciAqLwogCWluZm8tPmFwZXJ0dXJlcyA9IGRldl9wcml2LT5hcGVydHVyZXM7CiAJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKQEAgLTI4NSwxOSArMzc0LDIwIEBACiAJaW5mby0+cGl4bWFwLmZsYWdzID0gRkJfUElYTUFQX1NZU1RFTTsKIAlpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDE7CiAKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCAmJiAhbm91dmVhdV9ub2ZiYWNjZWwpIHsKLQkJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JCWNhc2UgTlZfQzA6Ci0JCQlicmVhazsKLQkJY2FzZSBOVl81MDoKLQkJCW52NTBfZmJjb25fYWNjZWxfaW5pdChpbmZvKTsKLQkJCWluZm8tPmZib3BzID0gJm52NTBfZmJjb25fb3BzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQludjA0X2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7Ci0JCQlpbmZvLT5mYm9wcyA9ICZudjA0X2ZiY29uX29wczsKLQkJCWJyZWFrOwotCQl9OworCQlyZXQgPSAtRU5PREVWOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQkJcmV0ID0gbnYwNF9mYmNvbl9hY2NlbF9pbml0KGluZm8pOworCQllbHNlCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApCisJCQlyZXQgPSBudjUwX2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fYWNjZWxfaW5pdChpbmZvKTsKKworCQlpZiAocmV0ID09IDApCisJCQlpbmZvLT5mYm9wcyA9ICZub3V2ZWF1X2ZiY29uX29wczsKIAl9CiAKIAlub3V2ZWF1X2ZiY29uX3pmaWxsKGRldiwgbmZiZGV2KTsKQEAgLTMwOCw3ICszOTgsNiBAQAogCQkJCQkJbm91dmVhdV9mYi0+YmFzZS5oZWlnaHQsCiAJCQkJCQludmJvLT5iby5vZmZzZXQsIG52Ym8pOwogCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJdmdhX3N3aXRjaGVyb29fY2xpZW50X2ZiX3NldChkZXYtPnBkZXYsIGluZm8pOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmgKaW5kZXggZTdlMTI2OC4uYjczYzI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmgKQEAgLTQwLDE1ICs0MCwyMSBAQAogCiB2b2lkIG5vdXZlYXVfZmJjb25fcmVzdG9yZSh2b2lkKTsKIAotdm9pZCBudjA0X2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7Ci12b2lkIG52MDRfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7Ci12b2lkIG52MDRfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKK2ludCBudjA0X2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7CitpbnQgbnYwNF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKK2ludCBudjA0X2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CiBpbnQgbnYwNF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXZvaWQgbnY1MF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKLXZvaWQgbnY1MF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pOwotdm9pZCBudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CisKK2ludCBudjUwX2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOworaW50IG52NTBfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKTsKK2ludCBudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CiBpbnQgbnY1MF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAoraW50IG52YzBfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CitpbnQgbnZjMF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pOworaW50IG52YzBfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKK2ludCBudmMwX2ZiY29uX2FjY2VsX2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pOworCiB2b2lkIG5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKIGludCBub3V2ZWF1X2ZiY29uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKaW5kZXggYWIxYmJmYi4uMjIxYjg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwpAQCAtMzIsNyArMzIsOCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCiAKICNkZWZpbmUgVVNFX1JFRkNOVChkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDEwKQotI2RlZmluZSBVU0VfU0VNQShkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDE3KQorI2RlZmluZSBVU0VfU0VNQShkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDE3ICYmIFwKKwkJICAgICAgIG5vdXZlYXVfcHJpdmF0ZShkZXYpLT5jYXJkX3R5cGUgPCBOVl9DMCkKIAogc3RydWN0IG5vdXZlYXVfZmVuY2UgewogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW5uZWw7CkBAIC02NCw2ICs2NSw3IEBACiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0KIAkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfZmVuY2UsIHJlZmNvdW50KTsKIAorCW5vdXZlYXVfY2hhbm5lbF9yZWYoTlVMTCwgJmZlbmNlLT5jaGFubmVsKTsKIAlrZnJlZShmZW5jZSk7CiB9CiAKQEAgLTc2LDE0ICs3OCwxNyBAQAogCiAJc3Bpbl9sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIAotCWlmIChVU0VfUkVGQ05UKGRldikpCi0JCXNlcXVlbmNlID0gbnZjaGFuX3JkMzIoY2hhbiwgMHg0OCk7Ci0JZWxzZQotCQlzZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZjaGFuLT5mZW5jZS5sYXN0X3NlcXVlbmNlX2lycSk7CisJLyogRmV0Y2ggdGhlIGxhc3Qgc2VxdWVuY2UgaWYgdGhlIGNoYW5uZWwgaXMgc3RpbGwgdXAgYW5kIHJ1bm5pbmcgKi8KKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZjaGFuLT5mZW5jZS5wZW5kaW5nKSkpIHsKKwkJaWYgKFVTRV9SRUZDTlQoZGV2KSkKKwkJCXNlcXVlbmNlID0gbnZjaGFuX3JkMzIoY2hhbiwgMHg0OCk7CisJCWVsc2UKKwkJCXNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxKTsKIAotCWlmIChjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPT0gc2VxdWVuY2UpCi0JCWdvdG8gb3V0OwotCWNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9IHNlcXVlbmNlOworCQlpZiAoY2hhbi0+ZmVuY2Uuc2VxdWVuY2VfYWNrID09IHNlcXVlbmNlKQorCQkJZ290byBvdXQ7CisJCWNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9IHNlcXVlbmNlOworCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZywgZW50cnkpIHsKIAkJc2VxdWVuY2UgPSBmZW5jZS0+c2VxdWVuY2U7CkBAIC0xMTMsMTMgKzExOCwxMyBAQAogCWlmICghZmVuY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCWtyZWZfaW5pdCgmZmVuY2UtPnJlZmNvdW50KTsKLQlmZW5jZS0+Y2hhbm5lbCA9IGNoYW47CisJbm91dmVhdV9jaGFubmVsX3JlZihjaGFuLCAmZmVuY2UtPmNoYW5uZWwpOwogCiAJaWYgKGVtaXQpCiAJCXJldCA9IG5vdXZlYXVfZmVuY2VfZW1pdChmZW5jZSk7CiAKIAlpZiAocmV0KQotCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwkJbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOwogCSpwZmVuY2UgPSBmZW5jZTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI3LDcgKzEzMiw3IEBACiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKIG5vdXZlYXVfZmVuY2VfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UpCiB7Ci0JcmV0dXJuIGZlbmNlID8gZmVuY2UtPmNoYW5uZWwgOiBOVUxMOworCXJldHVybiBmZW5jZSA/IG5vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoZmVuY2UtPmNoYW5uZWwpIDogTlVMTDsKIH0KIAogaW50CkBAIC0xMzUsNiArMTQwLDcgQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CiAKIAlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDIpOwpAQCAtMTU1LDggKzE2MSwxNSBAQAogCWxpc3RfYWRkX3RhaWwoJmZlbmNlLT5lbnRyeSwgJmNoYW4tPmZlbmNlLnBlbmRpbmcpOwogCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIAotCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgVVNFX1JFRkNOVChkZXYpID8gMHgwMDUwIDogMHgwMTUwLCAxKTsKLQlPVVRfUklORyhjaGFuLCBmZW5jZS0+c2VxdWVuY2UpOworCWlmIChVU0VfUkVGQ05UKGRldikpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMHgwMDUwLCAxKTsKKwkJZWxzZQorCQkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDA1MCwgMSk7CisJfSBlbHNlIHsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCAweDAxNTAsIDEpOworCX0KKwlPVVRfUklORyAoY2hhbiwgZmVuY2UtPnNlcXVlbmNlKTsKIAlGSVJFX1JJTkcoY2hhbik7CiAKIAlyZXR1cm4gMDsKQEAgLTE4Miw3ICsxOTUsNyBAQAogfQogCiB2b2lkCi1ub3V2ZWF1X2ZlbmNlX3VucmVmKHZvaWQgKipzeW5jX29iaikKK19fbm91dmVhdV9mZW5jZV91bnJlZih2b2lkICoqc3luY19vYmopCiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZSgqc3luY19vYmopOwogCkBAIC0xOTIsNyArMjA1LDcgQEAKIH0KIAogdm9pZCAqCi1ub3V2ZWF1X2ZlbmNlX3JlZih2b2lkICpzeW5jX29iaikKK19fbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqc3luY19vYmopCiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZShzeW5jX29iaik7CiAKQEAgLTIwMSw3ICsyMTQsNyBAQAogfQogCiBib29sCi1ub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCitfX25vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZykKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBub3V2ZWF1X2ZlbmNlKHN5bmNfb2JqKTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7CkBAIC0yMTQsMTMgKzIyNywxNCBAQAogfQogCiBpbnQKLW5vdXZlYXVfZmVuY2Vfd2FpdCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcsIGJvb2wgbGF6eSwgYm9vbCBpbnRyKQorX19ub3V2ZWF1X2ZlbmNlX3dhaXQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnLCBib29sIGxhenksIGJvb2wgaW50cikKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKDMgKiBEUk1fSFopOworCXVuc2lnbmVkIGxvbmcgc2xlZXBfdGltZSA9IGppZmZpZXMgKyAxOwogCWludCByZXQgPSAwOwogCiAJd2hpbGUgKDEpIHsKLQkJaWYgKG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN5bmNfb2JqLCBzeW5jX2FyZykpCisJCWlmIChfX25vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN5bmNfb2JqLCBzeW5jX2FyZykpCiAJCQlicmVhazsKIAogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewpAQCAtMjMwLDcgKzI0NCw3IEBACiAKIAkJX19zZXRfY3VycmVudF9zdGF0ZShpbnRyID8gVEFTS19JTlRFUlJVUFRJQkxFCiAJCQk6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGxhenkpCisJCWlmIChsYXp5ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc2xlZXBfdGltZSkpCiAJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCiAJCWlmIChpbnRyICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC0zNjgsNyArMzgyLDcgQEAKIAogCWtyZWZfZ2V0KCZzZW1hLT5yZWYpOwogCW5vdXZlYXVfZmVuY2Vfd29yayhmZW5jZSwgc2VtYXBob3JlX3dvcmssIHNlbWEpOwotCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJmZlbmNlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzgwLDMzICszOTQsNDkgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gbm91dmVhdV9mZW5jZV9jaGFubmVsKGZlbmNlKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gd2NoYW4tPmRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9zZW1hcGhvcmUgKnNlbWE7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChsaWtlbHkoIWZlbmNlIHx8IGNoYW4gPT0gd2NoYW4gfHwKLQkJICAgbm91dmVhdV9mZW5jZV9zaWduYWxsZWQoZmVuY2UsIE5VTEwpKSkKLQkJcmV0dXJuIDA7CisJaWYgKGxpa2VseSghY2hhbiB8fCBjaGFuID09IHdjaGFuIHx8CisJCSAgIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKGZlbmNlKSkpCisJCWdvdG8gb3V0OwogCiAJc2VtYSA9IGFsbG9jX3NlbWFwaG9yZShkZXYpOwogCWlmICghc2VtYSkgewogCQkvKiBFYXJseSBjYXJkIG9yIGJyb2tlbiB1c2Vyc3BhY2UsIGZhbGwgYmFjayB0bwogCQkgKiBzb2Z0d2FyZSBzeW5jLiAqLwotCQlyZXR1cm4gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQoZmVuY2UsIHRydWUsIGZhbHNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogdHJ5IHRvIHRha2UgY2hhbidzIG11dGV4LCBpZiB3ZSBjYW4ndCB0YWtlIGl0IHJpZ2h0IGF3YXkKKwkgKiB3ZSBoYXZlIHRvIGZhbGxiYWNrIHRvIHNvZnR3YXJlIHN5bmMgdG8gcHJldmVudCBsb2NraW5nCisJICogb3JkZXIgaXNzdWVzCisJICovCisJaWYgKCFtdXRleF90cnlsb2NrKCZjaGFuLT5tdXRleCkpIHsKKwkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCB0cnVlLCBmYWxzZSk7CisJCWdvdG8gb3V0X3VucmVmOwogCX0KIAogCS8qIE1ha2Ugd2NoYW4gd2FpdCB1bnRpbCBpdCBnZXRzIHNpZ25hbGxlZCAqLwogCXJldCA9IGVtaXRfc2VtYXBob3JlKHdjaGFuLCBOVl9TV19TRU1BUEhPUkVfQUNRVUlSRSwgc2VtYSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCS8qIFNpZ25hbCB0aGUgc2VtYXBob3JlIGZyb20gY2hhbiAqLwogCXJldCA9IGVtaXRfc2VtYXBob3JlKGNoYW4sIE5WX1NXX1NFTUFQSE9SRV9SRUxFQVNFLCBzZW1hKTsKLW91dDoKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKK291dF91bnJlZjoKIAlrcmVmX3B1dCgmc2VtYS0+cmVmLCBmcmVlX3NlbWFwaG9yZSk7CitvdXQ6CisJaWYgKGNoYW4pCisJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmNoYW4pOwogCXJldHVybiByZXQ7CiB9CiAKIGludAotbm91dmVhdV9mZW5jZV9mbHVzaCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCitfX25vdXZlYXVfZmVuY2VfZmx1c2godm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnKQogewogCXJldHVybiAwOwogfQpAQCAtNDIwLDMwICs0NTAsMjcgQEAKIAlpbnQgcmV0OwogCiAJLyogQ3JlYXRlIGFuIE5WX1NXIG9iamVjdCBmb3IgdmFyaW91cyBzeW5jIHB1cnBvc2VzICovCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfc3dfbmV3KGNoYW4sIE5WX1NXLCAmb2JqKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZTdywgTlZfU1cpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChjaGFuLCBOdlN3LCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7Ci0JT1VUX1JJTkcoY2hhbiwgTnZTdyk7CisJLyogd2UgbGVhdmUgc3ViY2hhbm5lbCBlbXB0eSBmb3IgbnZjMCAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7CisJCU9VVF9SSU5HKGNoYW4sIE52U3cpOworCX0KIAogCS8qIENyZWF0ZSBhIERNQSBvYmplY3QgZm9yIHRoZSBzaGFyZWQgY3Jvc3MtY2hhbm5lbCBzeW5jIGFyZWEuICovCiAJaWYgKFVTRV9TRU1BKGRldikpIHsKLQkJc3RydWN0IGRybV9tbV9ub2RlICptZW0gPSBkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbS5tbV9ub2RlOworCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbTsKIAogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCiAJCQkJCSAgICAgbWVtLT5zdGFydCA8PCBQQUdFX1NISUZULAotCQkJCQkgICAgIG1lbS0+c2l6ZSA8PCBQQUdFX1NISUZULAotCQkJCQkgICAgIE5WX0RNQV9BQ0NFU1NfUlcsCi0JCQkJCSAgICAgTlZfRE1BX1RBUkdFVF9WSURNRU0sICZvYmopOworCQkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfTUVNX0FDQ0VTU19SVywKKwkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZSQU0sICZvYmopOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNDczLDYgKzUwMCw4IEBACiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKnRtcCwgKmZlbmNlOwogCisJc3Bpbl9sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZywgZW50cnkpIHsKIAkJZmVuY2UtPnNpZ25hbGxlZCA9IHRydWU7CiAJCWxpc3RfZGVsKCZmZW5jZS0+ZW50cnkpOwpAQCAtNDgyLDYgKzUxMSw4IEBACiAKIAkJa3JlZl9wdXQoJmZlbmNlLT5yZWZjb3VudCwgbm91dmVhdV9mZW5jZV9kZWwpOwogCX0KKworCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYwppbmRleCA5YTFmZGNmLi41MDZjNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKQEAgLTQ4LDkgKzQ4LDYgQEAKIAkJcmV0dXJuOwogCW52Ym8tPmdlbSA9IE5VTEw7CiAKLQlpZiAodW5saWtlbHkobnZiby0+Y3B1X2ZpbHApKQotCQl0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKGJvKTsKLQogCWlmICh1bmxpa2VseShudmJvLT5waW5fcmVmY250KSkgewogCQludmJvLT5waW5fcmVmY250ID0gMTsKIAkJbm91dmVhdV9ib191bnBpbihudmJvKTsKQEAgLTEwNiwzMiArMTAzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wKLW5vdXZlYXVfZ2VtX3RpbGVfZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgdGlsZV9mbGFncykKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKLQkJc3dpdGNoICh0aWxlX2ZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9MQVlPVVRfTUFTSykgewotCQljYXNlIDB4MDAwMDoKLQkJY2FzZSAweDE4MDA6Ci0JCWNhc2UgMHgyODAwOgotCQljYXNlIDB4NDgwMDoKLQkJY2FzZSAweDcwMDA6Ci0JCWNhc2UgMHg3NDAwOgotCQljYXNlIDB4N2EwMDoKLQkJY2FzZSAweGUwMDA6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghKHRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX0xBWU9VVF9NQVNLKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCU5WX0VSUk9SKGRldiwgImJhZCBwYWdlIGZsYWdzOiAweCUwOHhcbiIsIHRpbGVfZmxhZ3MpOwotCXJldHVybiBmYWxzZTsKLX0KLQogaW50CiBub3V2ZWF1X2dlbV9pb2N0bF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC0xNDYsMTEgKzExNyw2IEBACiAJaWYgKHVubGlrZWx5KGRldl9wcml2LT50dG0uYmRldi5kZXZfbWFwcGluZyA9PSBOVUxMKSkKIAkJZGV2X3ByaXYtPnR0bS5iZGV2LmRldl9tYXBwaW5nID0gZGV2X3ByaXYtPmRldi0+ZGV2X21hcHBpbmc7CiAKLQlpZiAocmVxLT5jaGFubmVsX2hpbnQpIHsKLQkJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKHJlcS0+Y2hhbm5lbF9oaW50LAotCQkJCQkJICAgICBmaWxlX3ByaXYsIGNoYW4pOwotCX0KLQogCWlmIChyZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCiAJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1ZSQU07CiAJaWYgKHJlcS0+aW5mby5kb21haW4gJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkKQEAgLTE1OCwxMyArMTI0LDIzIEBACiAJaWYgKCFmbGFncyB8fCByZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0NQVSkKIAkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfU1lTVEVNOwogCi0JaWYgKCFub3V2ZWF1X2dlbV90aWxlX2ZsYWdzX3ZhbGlkKGRldiwgcmVxLT5pbmZvLnRpbGVfZmxhZ3MpKQorCWlmICghZGV2X3ByaXYtPmVuZ2luZS52cmFtLmZsYWdzX3ZhbGlkKGRldiwgcmVxLT5pbmZvLnRpbGVfZmxhZ3MpKSB7CisJCU5WX0VSUk9SKGRldiwgImJhZCBwYWdlIGZsYWdzOiAweCUwOHhcbiIsIHJlcS0+aW5mby50aWxlX2ZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcS0+Y2hhbm5lbF9oaW50KSB7CisJCWNoYW4gPSBub3V2ZWF1X2NoYW5uZWxfZ2V0KGRldiwgZmlsZV9wcml2LCByZXEtPmNoYW5uZWxfaGludCk7CisJCWlmIChJU19FUlIoY2hhbikpCisJCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKKwl9CiAKIAlyZXQgPSBub3V2ZWF1X2dlbV9uZXcoZGV2LCBjaGFuLCByZXEtPmluZm8uc2l6ZSwgcmVxLT5hbGlnbiwgZmxhZ3MsCiAJCQkgICAgICByZXEtPmluZm8udGlsZV9tb2RlLCByZXEtPmluZm8udGlsZV9mbGFncywgZmFsc2UsCiAJCQkgICAgICAocmVxLT5pbmZvLmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSksCiAJCQkgICAgICAmbnZibyk7CisJaWYgKGNoYW4pCisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTIzMSwxNSArMjA3LDggQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCBsaXN0KSB7CiAJCW52Ym8gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9ibywgZW50cnkpOwotCQlpZiAobGlrZWx5KGZlbmNlKSkgewotCQkJc3RydWN0IG5vdXZlYXVfZmVuY2UgKnByZXZfZmVuY2U7CiAKLQkJCXNwaW5fbG9jaygmbnZiby0+Ym8ubG9jayk7Ci0JCQlwcmV2X2ZlbmNlID0gbnZiby0+Ym8uc3luY19vYmo7Ci0JCQludmJvLT5iby5zeW5jX29iaiA9IG5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKLQkJCXNwaW5fdW5sb2NrKCZudmJvLT5iby5sb2NrKTsKLQkJCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmcHJldl9mZW5jZSk7Ci0JCX0KKwkJbm91dmVhdV9ib19mZW5jZShudmJvLCBmZW5jZSk7CiAKIAkJaWYgKHVubGlrZWx5KG52Ym8tPnZhbGlkYXRlX21hcHBlZCkpIHsKIAkJCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOwpAQCAtMjk5LDE0ICsyNjgsMTUgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIHRydWUsIHNlcXVlbmNlKTsKKwkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgc2VxdWVuY2UpOwogCQlpZiAocmV0KSB7CiAJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKCZudmJvLT5ibywgZmFsc2UpOworCQkJaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKKwkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKCZudmJvLT5ibywgdHJ1ZSk7CiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChnZW0pOwotCQkJaWYgKHJldCkgewotCQkJCU5WX0VSUk9SKGRldiwgImZhaWwgcmVzZXJ2ZVxuIik7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJCQlOVl9FUlJPUihkZXYsICJmYWlsIHJlc2VydmVcbiIpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCQlnb3RvIHJldHJ5OwpAQCAtMzMxLDI1ICszMDEsNiBAQAogCQkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCi0JCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmbnZiby0+Ym8uY3B1X3dyaXRlcnMpID4gMCkpIHsKLQkJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOwotCi0JCQlpZiAobnZiby0+Y3B1X2ZpbHAgPT0gZmlsZV9wcml2KSB7Ci0JCQkJTlZfRVJST1IoZGV2LCAiYm8gJXAgbWFwcGVkIGJ5IHByb2Nlc3MgdHJ5aW5nICIKLQkJCQkJICAgICAgInRvIHZhbGlkYXRlIGl0IVxuIiwgbnZibyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCW11dGV4X3VubG9jaygmZHJtX2dsb2JhbF9tdXRleCk7Ci0JCQlyZXQgPSB0dG1fYm9fd2FpdF9jcHUoJm52Ym8tPmJvLCBmYWxzZSk7Ci0JCQltdXRleF9sb2NrKCZkcm1fZ2xvYmFsX211dGV4KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlOVl9FUlJPUihkZXYsICJmYWlsIHdhaXRfY3B1XG4iKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJZ290byByZXRyeTsKLQkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMzgzLDExICszMzQsMTEgQEAKIAkJfQogCiAJCW52Ym8tPmNoYW5uZWwgPSAoYi0+cmVhZF9kb21haW5zICYgKDEgPDwgMzEpKSA/IE5VTEwgOiBjaGFuOwotCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJm52Ym8tPmJvLCAmbnZiby0+cGxhY2VtZW50LAotCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCQlyZXQgPSBub3V2ZWF1X2JvX3ZhbGlkYXRlKG52Ym8sIHRydWUsIGZhbHNlLCBmYWxzZSk7CiAJCW52Ym8tPmNoYW5uZWwgPSBOVUxMOwogCQlpZiAodW5saWtlbHkocmV0KSkgewotCQkJTlZfRVJST1IoZGV2LCAiZmFpbCB0dG1fdmFsaWRhdGVcbiIpOworCQkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQkJTlZfRVJST1IoZGV2LCAiZmFpbCB0dG1fdmFsaWRhdGVcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC00MzksMTMgKzM5MCwxNSBAQAogCiAJcmV0ID0gdmFsaWRhdGVfaW5pdChjaGFuLCBmaWxlX3ByaXYsIHBiYm8sIG5yX2J1ZmZlcnMsIG9wKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZV9pbml0XG4iKTsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZV9pbml0XG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSB2YWxpZGF0ZV9saXN0KGNoYW4sICZvcC0+dnJhbV9saXN0LCBwYmJvLCB1c2VyX2J1ZmZlcnMpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZSB2cmFtX2xpc3RcbiIpOworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlIHZyYW1fbGlzdFxuIik7CiAJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTQ1Myw3ICs0MDYsOCBAQAogCiAJcmV0ID0gdmFsaWRhdGVfbGlzdChjaGFuLCAmb3AtPmdhcnRfbGlzdCwgcGJibywgdXNlcl9idWZmZXJzKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGUgZ2FydF9saXN0XG4iKTsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZSBnYXJ0X2xpc3RcbiIpOwogCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC00NjEsNyArNDE1LDggQEAKIAogCXJldCA9IHZhbGlkYXRlX2xpc3QoY2hhbiwgJm9wLT5ib3RoX2xpc3QsIHBiYm8sIHVzZXJfYnVmZmVycyk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlIGJvdGhfbGlzdFxuIik7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGUgYm90aF9saXN0XG4iKTsKIAkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNTU3LDkgKzUxMiw5IEBACiAJCQkJZGF0YSB8PSByLT52b3I7CiAJCX0KIAotCQlzcGluX2xvY2soJm52Ym8tPmJvLmxvY2spOworCQlzcGluX2xvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOwogCQlyZXQgPSB0dG1fYm9fd2FpdCgmbnZiby0+Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7CisJCXNwaW5fdW5sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZGV2LCAicmVsb2Mgd2FpdF9pZGxlIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCQlicmVhazsKQEAgLTU4NSw3ICs1NDAsOSBAQAogCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CiAJaW50IGksIGosIHJldCA9IDAsIGRvX3JlbG9jID0gMDsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihyZXEtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXQoZGV2LCBmaWxlX3ByaXYsIHJlcS0+Y2hhbm5lbCk7CisJaWYgKElTX0VSUihjaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbik7CiAKIAlyZXEtPnZyYW1fYXZhaWxhYmxlID0gZGV2X3ByaXYtPmZiX2FwZXJfZnJlZTsKIAlyZXEtPmdhcnRfYXZhaWxhYmxlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2ZyZWU7CkBAIC01OTUsMjggKzU1MiwzNCBAQAogCWlmICh1bmxpa2VseShyZXEtPm5yX3B1c2ggPiBOT1VWRUFVX0dFTV9NQVhfUFVTSCkpIHsKIAkJTlZfRVJST1IoZGV2LCAicHVzaGJ1ZiBwdXNoIGNvdW50IGV4Y2VlZHMgbGltaXQ6ICVkIG1heCAlZFxuIiwKIAkJCSByZXEtPm5yX3B1c2gsIE5PVVZFQVVfR0VNX01BWF9QVVNIKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICh1bmxpa2VseShyZXEtPm5yX2J1ZmZlcnMgPiBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUykpIHsKIAkJTlZfRVJST1IoZGV2LCAicHVzaGJ1ZiBibyBjb3VudCBleGNlZWRzIGxpbWl0OiAlZCBtYXggJWRcbiIsCiAJCQkgcmVxLT5ucl9idWZmZXJzLCBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAodW5saWtlbHkocmVxLT5ucl9yZWxvY3MgPiBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTKSkgewogCQlOVl9FUlJPUihkZXYsICJwdXNoYnVmIHJlbG9jIGNvdW50IGV4Y2VlZHMgbGltaXQ6ICVkIG1heCAlZFxuIiwKIAkJCSByZXEtPm5yX3JlbG9jcywgTk9VVkVBVV9HRU1fTUFYX1JFTE9DUyk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlwdXNoID0gdV9tZW1jcHlhKHJlcS0+cHVzaCwgcmVxLT5ucl9wdXNoLCBzaXplb2YoKnB1c2gpKTsKLQlpZiAoSVNfRVJSKHB1c2gpKQorCWlmIChJU19FUlIocHVzaCkpIHsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiBQVFJfRVJSKHB1c2gpOworCX0KIAogCWJvID0gdV9tZW1jcHlhKHJlcS0+YnVmZmVycywgcmVxLT5ucl9idWZmZXJzLCBzaXplb2YoKmJvKSk7CiAJaWYgKElTX0VSUihibykpIHsKIAkJa2ZyZWUocHVzaCk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gUFRSX0VSUihibyk7CiAJfQogCkBAIC02MzksNyArNjAyLDggQEAKIAlyZXQgPSBub3V2ZWF1X2dlbV9wdXNoYnVmX3ZhbGlkYXRlKGNoYW4sIGZpbGVfcHJpdiwgYm8sIHJlcS0+YnVmZmVycywKIAkJCQkJICAgcmVxLT5ucl9idWZmZXJzLCAmb3AsICZkb19yZWxvYyk7CiAJaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZTogJWRcbiIsIHJldCk7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGU6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTczMiw3ICs2OTYsNyBAQAogCiBvdXQ6CiAJdmFsaWRhdGVfZmluaSgmb3AsIGZlbmNlKTsKLQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkKiopJmZlbmNlKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAJa2ZyZWUoYm8pOwogCWtmcmVlKHB1c2gpOwogCkBAIC03NTAsNiArNzE0LDcgQEAKIAkJcmVxLT5zdWZmaXgxID0gMHgwMDAwMDAwMDsKIAl9CiAKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03ODEsMjYgKzc0Niw5IEBACiAJCXJldHVybiAtRU5PRU5UOwogCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKIAotCWlmIChudmJvLT5jcHVfZmlscCkgewotCQlpZiAobnZiby0+Y3B1X2ZpbHAgPT0gZmlsZV9wcml2KQotCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gdHRtX2JvX3dhaXRfY3B1KCZudmJvLT5ibywgbm9fd2FpdCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocmVxLT5mbGFncyAmIE5PVVZFQVVfR0VNX0NQVV9QUkVQX05PQkxPQ0spIHsKLQkJc3Bpbl9sb2NrKCZudmJvLT5iby5sb2NrKTsKLQkJcmV0ID0gdHRtX2JvX3dhaXQoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIG5vX3dhaXQpOwotCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gdHRtX2JvX3N5bmNjcHVfd3JpdGVfZ3JhYigmbnZiby0+Ym8sIG5vX3dhaXQpOwotCQlpZiAocmV0ID09IDApCi0JCQludmJvLT5jcHVfZmlscCA9IGZpbGVfcHJpdjsKLQl9Ci0KLW91dDoKKwlzcGluX2xvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOworCXJldCA9IHR0bV9ib193YWl0KCZudmJvLT5ibywgdHJ1ZSwgdHJ1ZSwgbm9fd2FpdCk7CisJc3Bpbl91bmxvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGdlbSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgwOSwyNiArNzU3LDcgQEAKIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2NwdV9wcmVwICpyZXEgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOwotCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7Ci0JaWYgKCFnZW0pCi0JCXJldHVybiAtRU5PRU5UOwotCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKLQotCWlmIChudmJvLT5jcHVfZmlscCAhPSBmaWxlX3ByaXYpCi0JCWdvdG8gb3V0OwotCW52Ym8tPmNwdV9maWxwID0gTlVMTDsKLQotCXR0bV9ib19zeW5jY3B1X3dyaXRlX3JlbGVhc2UoJm52Ym8tPmJvKTsKLQlyZXQgPSAwOwotCi1vdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoZ2VtKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYwppbmRleCBiOTY3MmEwLi4wNTNlZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jCkBAIC05NTMsNyArOTUzLDcgQEAKIAkJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODUwLCByZWdwLT5jcnRjXzg1MCk7CiAKIAkJCXJlZzkwMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwKTsKLQkJCWlmIChyZWdwLT5jcnRjX2NmZyA9PSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQykKKwkJCWlmIChyZWdwLT5jcnRjX2NmZyA9PSBOVjEwX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DKQogCQkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzkwMCwgcmVnOTAwIHwgMHgxMDAwMCk7CiAJCQllbHNlCiAJCQkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwLCByZWc5MDAgJiB+MHgxMDAwMCk7CkBAIC05OTksOCArOTk5LDggQEAKIAkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMTApIHsKIAkJCS8qIE5vdCB3YWl0aW5nIGZvciB2ZXJ0aWNhbCByZXRyYWNlIGJlZm9yZSBtb2RpZnlpbmcKIAkJCSAgIENSRV81My9DUkVfNTQgY2F1c2VzIGxvY2t1cHMuICovCi0JCQlub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCA2NTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwgMHg4LCAweDgpOwotCQkJbm91dmVhdV93YWl0X3VudGlsKGRldiwgNjUwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsIDB4OCwgMHgwKTsKKwkJCW5vdXZlYXVfd2FpdF9lcShkZXYsIDY1MDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLCAweDgsIDB4OCk7CisJCQlub3V2ZWF1X3dhaXRfZXEoZGV2LCA2NTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwgMHg4LCAweDApOwogCQl9CiAKIAkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CkBAIC0xMDE3LDggKzEwMTcsOSBAQAogCiAJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19TVEFSVCwgcmVncC0+ZmJfc3RhcnQpOwogCi0JLyogU2V0dGluZyAxIG9uIHRoaXMgdmFsdWUgZ2l2ZXMgeW91IGludGVycnVwdHMgZm9yIGV2ZXJ5IHZibGFuayBwZXJpb2QuICovCi0JTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19JTlRSX0VOXzAsIDApOworCS8qIEVuYWJsZSB2YmxhbmsgaW50ZXJydXB0cy4gKi8KKwlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfRU5fMCwKKwkJICAgIChkZXYtPnZibGFua19lbmFibGVkW2hlYWRdID8gMSA6IDApKTsKIAlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfMCwgTlZfUENSVENfSU5UUl8wX1ZCTEFOSyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lycS5jCmluZGV4IDdiZmQ5ZTYuLjJiYTcyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pcnEuYwpAQCAtMzYsMTggKzM2LDcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCiAjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotCi0vKiBuZWVkZWQgZm9yIGhvdHBsdWcgaXJxICovCi0jaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKLSNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKLQotc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUobm91dmVhdV9yYXRlbGltaXRfc3RhdGUsIDMgKiBIWiwgMjApOwotCi1zdGF0aWMgaW50IG5vdXZlYXVfcmF0ZWxpbWl0KHZvaWQpCi17Ci0JcmV0dXJuIF9fcmF0ZWxpbWl0KCZub3V2ZWF1X3JhdGVsaW1pdF9zdGF0ZSk7Ci19CisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCiAKIHZvaWQKIG5vdXZlYXVfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTU3LDE5ICs0NiwxOSBAQAogCS8qIE1hc3RlciBkaXNhYmxlICovCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewotCQlJTklUX1dPUksoJmRldl9wcml2LT5pcnFfd29yaywgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKTsKLQkJSU5JVF9XT1JLKCZkZXZfcHJpdi0+aHBkX3dvcmssIG52NTBfZGlzcGxheV9pcnFfaG90cGx1Z19iaCk7Ci0JCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+aHBkX3N0YXRlLmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPnZibF93YWl0aW5nKTsKLQl9CisJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT52Ymxfd2FpdGluZyk7CiB9CiAKIGludAogbm91dmVhdV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCiAJLyogTWFzdGVyIGVuYWJsZSAqLwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIE5WX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0VOQUJMRSk7CisJaWYgKGRldl9wcml2LT5tc2lfZW5hYmxlZCkKKwkJbnZfd3IwOChkZXYsIDB4MDAwODgwNjgsIDB4ZmYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwLDExNzggKzY5LDgzIEBACiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQKLW5vdXZlYXVfY2FsbF9tZXRob2Qoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLCBpbnQgbXRoZCwgaW50IGRhdGEpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCAqZ3JtOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgKmdyYzsKLQotCWdyYyA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjbGFzczsKLQl3aGlsZSAoZ3JjLT5pZCkgewotCQlpZiAoZ3JjLT5pZCA9PSBjbGFzcykKLQkJCWJyZWFrOwotCQlncmMrKzsKLQl9Ci0KLQlpZiAoZ3JjLT5pZCAhPSBjbGFzcyB8fCAhZ3JjLT5tZXRob2RzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWdybSA9IGdyYy0+bWV0aG9kczsKLQl3aGlsZSAoZ3JtLT5pZCkgewotCQlpZiAoZ3JtLT5pZCA9PSBtdGhkKQotCQkJcmV0dXJuIGdybS0+ZXhlYyhjaGFuLCBjbGFzcywgbXRoZCwgZGF0YSk7Ci0JCWdybSsrOwotCX0KLQotCXJldHVybiAtRU5PRU5UOwotfQotCi1zdGF0aWMgYm9vbAotbm91dmVhdV9maWZvX3N3bXRoZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBkYXRhKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0JY29uc3QgaW50IHN1YmMgPSAoYWRkciA+PiAxMykgJiAweDc7Ci0JY29uc3QgaW50IG10aGQgPSBhZGRyICYgMHgxZmZjOwotCi0JaWYgKG10aGQgPT0gMHgwMDAwKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwotCi0JCWdwdW9iaiA9IG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBkYXRhKTsKLQkJaWYgKCFncHVvYmopCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdwdW9iai0+ZW5naW5lICE9IE5WT0JKX0VOR0lORV9TVykKLQkJCXJldHVybiBmYWxzZTsKLQotCQljaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdID0gZ3B1b2JqLT5jbGFzczsKLQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgbnZfcmQzMihkZXYsCi0JCQlOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgfigweGYgPDwgc3ViYyAqIDQpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogaHcgb2JqZWN0ICovCi0JaWYgKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgKDEgPDwgKHN1YmMqNCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAobm91dmVhdV9jYWxsX21ldGhvZChjaGFuLCBjaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdLCBtdGhkLCBkYXRhKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X2ZpZm9faXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7Ci0JdWludDMyX3Qgc3RhdHVzLCByZWFzc2lnbjsKLQlpbnQgY250ID0gMDsKLQotCXJlYXNzaWduID0gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTKSAmIDE7Ci0Jd2hpbGUgKChzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19JTlRSXzApKSAmJiAoY250KysgPCAxMDApKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOwotCQl1aW50MzJfdCBjaGlkLCBnZXQ7Ci0KLQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCAwKTsKLQotCQljaGlkID0gZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KTsKLQkJaWYgKGNoaWQgPj0gMCAmJiBjaGlkIDwgZW5naW5lLT5maWZvLmNoYW5uZWxzKQotCQkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKLQkJZ2V0ICA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQpOwotCi0JCWlmIChzdGF0dXMgJiBOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKSB7Ci0JCQl1aW50MzJfdCBtdGhkLCBkYXRhOwotCQkJaW50IHB0cjsKLQotCQkJLyogTlZfUEZJRk9fQ0FDSEUxX0dFVCBhY3R1YWxseSBnb2VzIHRvIDB4ZmZjIGJlZm9yZQotCQkJICogd3JhcHBpbmcgb24gbXkgRzgwIGNoaXBzLCBidXQgQ0FDSEUxIGlzbid0IGJpZwotCQkJICogZW5vdWdoIGZvciB0aGlzIG11Y2ggZGF0YS4uIFRlc3RzIHNob3cgdGhhdCBpdAotCQkJICogd3JhcHMgYXJvdW5kIHRvIHRoZSBzdGFydCBhdCBHRVQ9MHg4MDAuLiBObyBjbHVlCi0JCQkgKiBhcyB0byB3aHkuLgotCQkJICovCi0JCQlwdHIgPSAoZ2V0ICYgMHg3ZmYpID4+IDI7Ci0KLQkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKLQkJCQltdGhkID0gbnZfcmQzMihkZXYsCi0JCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpKTsKLQkJCQlkYXRhID0gbnZfcmQzMihkZXYsCi0JCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX0RBVEEocHRyKSk7Ci0JCQl9IGVsc2UgewotCQkJCW10aGQgPSBudl9yZDMyKGRldiwKLQkJCQkJTlY0MF9QRklGT19DQUNIRTFfTUVUSE9EKHB0cikpOwotCQkJCWRhdGEgPSBudl9yZDMyKGRldiwKLQkJCQkJTlY0MF9QRklGT19DQUNIRTFfREFUQShwdHIpKTsKLQkJCX0KLQotCQkJaWYgKCFjaGFuIHx8ICFub3V2ZWF1X2ZpZm9fc3dtdGhkKGNoYW4sIG10aGQsIGRhdGEpKSB7Ci0JCQkJTlZfSU5GTyhkZXYsICJQRklGT19DQUNIRV9FUlJPUiAtIENoICVkLyVkICIKLQkJCQkJICAgICAiTXRoZCAweCUwNHggRGF0YSAweCUwOHhcbiIsCi0JCQkJCWNoaWQsIChtdGhkID4+IDEzKSAmIDcsIG10aGQgJiAweDFmZmMsCi0JCQkJCWRhdGEpOwotCQkJfQotCi0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDApOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAotCQkJCQkJTlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUik7Ci0KLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKLQkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApICYgfjEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsCi0JCQkJbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwKSB8IDEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0hBU0gsIDApOwotCi0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsCi0JCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIKSB8IDEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwLCAxKTsKLQotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUikgewotCQkJdTMyIGRtYV9nZXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDQpOwotCQkJdTMyIGRtYV9wdXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDApOwotCQkJdTMyIHB1c2ggPSBudl9yZDMyKGRldiwgMHgwMDMyMjApOwotCQkJdTMyIHN0YXRlID0gbnZfcmQzMihkZXYsIDB4MDAzMjI4KTsKLQotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCQl1MzIgaG9fZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzI4KTsKLQkJCQl1MzIgaG9fcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzIwKTsKLQkJCQl1MzIgaWJfZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzM0KTsKLQkJCQl1MzIgaWJfcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzMwKTsKLQotCQkJCWlmIChub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDJ4JTA4eCAiCi0JCQkJCSAgICAgIlB1dCAweCUwMnglMDh4IEliR2V0IDB4JTA4eCBJYlB1dCAweCUwOHggIgotCQkJCQkgICAgICJTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCi0JCQkJCQljaGlkLCBob19nZXQsIGRtYV9nZXQsIGhvX3B1dCwKLQkJCQkJCWRtYV9wdXQsIGliX2dldCwgaWJfcHV0LCBzdGF0ZSwKLQkJCQkJCXB1c2gpOwotCi0JCQkJLyogTUVUSE9EX0NPVU5ULCBpbiBETUFfU1RBVEUgb24gZWFybGllciBjaGlwc2V0cyAqLwotCQkJCW52X3dyMzIoZGV2LCAweDAwMzM2NCwgMHgwMDAwMDAwMCk7Ci0JCQkJaWYgKGRtYV9nZXQgIT0gZG1hX3B1dCB8fCBob19nZXQgIT0gaG9fcHV0KSB7Ci0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7Ci0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzMyOCwgaG9fcHV0KTsKLQkJCQl9IGVsc2UKLQkJCQlpZiAoaWJfZ2V0ICE9IGliX3B1dCkgewotCQkJCQludl93cjMyKGRldiwgMHgwMDMzMzQsIGliX3B1dCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDh4ICIKLQkJCQkJICAgICAiUHV0IDB4JTA4eCBTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCi0JCQkJCWNoaWQsIGRtYV9nZXQsIGRtYV9wdXQsIHN0YXRlLCBwdXNoKTsKLQotCQkJCWlmIChkbWFfZ2V0ICE9IGRtYV9wdXQpCi0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7Ci0JCQl9Ci0KLQkJCW52X3dyMzIoZGV2LCAweDAwMzIyOCwgMHgwMDAwMDAwMCk7Ci0JCQludl93cjMyKGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMDEpOwotCQkJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCBOVl9QRklGT19JTlRSX0RNQV9QVVNIRVIpOwotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0RNQV9QVVNIRVI7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUpIHsKLQkJCXVpbnQzMl90IHNlbTsKLQotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX1NFTUFQSE9SRTsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwKLQkJCQlOVl9QRklGT19JTlRSX1NFTUFQSE9SRSk7Ci0KLQkJCXNlbSA9IG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpOwotCQkJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgc2VtIHwgMHgxKTsKLQotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7Ci0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOwotCQl9Ci0KLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7Ci0JCQkJbnY1MF9mYl92bV90cmFwKGRldiwgMSwgIlBGSUZPX0JBUl9GQVVMVCIpOwotCQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKLQkJCQludl93cjMyKGRldiwgMHgwMDIxMDAsIDB4MDAwMDAwMTApOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cykgewotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJTlZfSU5GTyhkZXYsICJQRklGT19JTlRSIDB4JTA4eCAtIENoICVkXG4iLAotCQkJCQlzdGF0dXMsIGNoaWQpOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLCBzdGF0dXMpOwotCQkJc3RhdHVzID0gMDsKLQkJfQotCi0JCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgcmVhc3NpZ24pOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJTlZfSU5GTyhkZXYsICJQRklGTyBzdGlsbCBhbmdyeSBhZnRlciAlZCBzcGlucywgaGFsdFxuIiwgY250KTsKLQkJbnZfd3IzMihkZXYsIDB4MjE0MCwgMCk7Ci0JCW52X3dyMzIoZGV2LCAweDE0MCwgMCk7Ci0JfQotCi0JbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCwgTlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HKTsKLX0KLQotc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgewotCXVpbnQzMl90IG1hc2s7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyBuc3RhdHVzX25hbWVzW10gPQotewotCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UsICAgICAgICJTVEFURV9JTl9VU0UiIH0sCi0JeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUsICAgICAgIklOVkFMSURfU1RBVEUiIH0sCi0JeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCwgICAgICAgIkJBRF9BUkdVTUVOVCIgfSwKLQl7IE5WMDRfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCwgICAiUFJPVEVDVElPTl9GQVVMVCIgfQotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzIG5zdGF0dXNfbmFtZXNfbnYxMFtdID0KLXsKLQl7IE5WMTBfUEdSQVBIX05TVEFUVVNfU1RBVEVfSU5fVVNFLCAgICAgICAiU1RBVEVfSU5fVVNFIiB9LAotCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19JTlZBTElEX1NUQVRFLCAgICAgICJJTlZBTElEX1NUQVRFIiB9LAotCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQsICAgICAgICJCQURfQVJHVU1FTlQiIH0sCi0JeyBOVjEwX1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQsICAgIlBST1RFQ1RJT05fRkFVTFQiIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyBuc291cmNlX25hbWVzW10gPQotewotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRklDQVRJT04sICAgICAgICJOT1RJRklDQVRJT04iIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RBVEFfRVJST1IsICAgICAgICAgIkRBVEFfRVJST1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX1BST1RFQ1RJT05fRVJST1IsICAgIlBST1RFQ1RJT05fRVJST1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX1JBTkdFX0VYQ0VQVElPTiwgICAgIlJBTkdFX0VYQ0VQVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfQ09MT1IsICAgICAgICAiTElNSVRfQ09MT1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX1pFVEEsICAgICAgICAgIkxJTUlUX1pFVEEiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCwgICAgICAgIklMTEVHQUxfTVRIRCIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1JfUFJPVEVDVElPTiwgICAiRE1BX1JfUFJPVEVDVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dfUFJPVEVDVElPTiwgICAiRE1BX1dfUFJPVEVDVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRk9STUFUX0VYQ0VQVElPTiwgICAiRk9STUFUX0VYQ0VQVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfUEFUQ0hfRVhDRVBUSU9OLCAgICAiUEFUQ0hfRVhDRVBUSU9OIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9TVEFURV9JTlZBTElELCAgICAgICJTVEFURV9JTlZBTElEIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ET1VCTEVfTk9USUZZLCAgICAgICJET1VCTEVfTk9USUZZIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRllfSU5fVVNFLCAgICAgICJOT1RJRllfSU5fVVNFIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9NRVRIT0RfQ05ULCAgICAgICAgICJNRVRIT0RfQ05UIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9CRlJfTk9USUZJQ0FUSU9OLCAgICJCRlJfTk9USUZJQ0FUSU9OIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfVlRYX1BST1RFQ1RJT04sICJETUFfVlRYX1BST1RFQ1RJT04iIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XSURUSF9BLCAgICAgICAgIkRNQV9XSURUSF9BIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQiwgICAgICAgICJETUFfV0lEVEhfQiIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzXyh1aW50MzJfdCB2YWx1ZSwKLQkJCQljb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyAqbmFtZWxpc3QsCi0JCQkJY29uc3QgaW50IG5hbWVsaXN0X2xlbikKLXsKLQkvKgotCSAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBwcmludGVkIHRoZSBLRVJOXyogbG9nIGxldmVsIGZvciB1cy4KLQkgKiBBbHNvIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgbmV3bGluZS4KLQkgKi8KLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFtZWxpc3RfbGVuOyArK2kpIHsKLQkJdWludDMyX3QgbWFzayA9IG5hbWVsaXN0W2ldLm1hc2s7Ci0JCWlmICh2YWx1ZSAmIG1hc2spIHsKLQkJCXByaW50aygiICVzIiwgbmFtZWxpc3RbaV0ubmFtZSk7Ci0JCQl2YWx1ZSAmPSB+bWFzazsKLQkJfQotCX0KLQlpZiAodmFsdWUpCi0JCXByaW50aygiICh1bmtub3duIGJpdHMgMHglMDh4KSIsIHZhbHVlKTsKLX0KLSNkZWZpbmUgbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyh2YWwsIG5hbWVsaXN0KSBcCi0Jbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lc18oKHZhbCksIChuYW1lbGlzdCksIEFSUkFZX1NJWkUobmFtZWxpc3QpKQotCi1zdHJ1Y3Qgbm91dmVhdV9lbnVtX25hbWVzIHsKLQl1aW50MzJfdCB2YWx1ZTsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfcHJpbnRfZW51bV9uYW1lc18odWludDMyX3QgdmFsdWUsCi0JCQkJY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bV9uYW1lcyAqbmFtZWxpc3QsCi0JCQkJY29uc3QgaW50IG5hbWVsaXN0X2xlbikKLXsKLQkvKgotCSAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBwcmludGVkIHRoZSBLRVJOXyogbG9nIGxldmVsIGZvciB1cy4KLQkgKiBBbHNvIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgbmV3bGluZS4KLQkgKi8KLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFtZWxpc3RfbGVuOyArK2kpIHsKLQkJaWYgKHZhbHVlID09IG5hbWVsaXN0W2ldLnZhbHVlKSB7Ci0JCQlwcmludGsoIiVzIiwgbmFtZWxpc3RbaV0ubmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JcHJpbnRrKCJ1bmtub3duIHZhbHVlIDB4JTA4eCIsIHZhbHVlKTsKLX0KLSNkZWZpbmUgbm91dmVhdV9wcmludF9lbnVtX25hbWVzKHZhbCwgbmFtZWxpc3QpIFwKLQlub3V2ZWF1X3ByaW50X2VudW1fbmFtZXNfKCh2YWwpLCAobmFtZWxpc3QpLCBBUlJBWV9TSVpFKG5hbWVsaXN0KSkKLQotc3RhdGljIGludAotbm91dmVhdV9ncmFwaF9jaGlkX2Zyb21fZ3JjdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGluc3Q7Ci0JaW50IGk7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQotCQlyZXR1cm4gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOwotCWVsc2UKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWluc3QgPSAobnZfcmQzMihkZXYsIDB4NDAwMzJjKSAmIDB4ZmZmZmYpIDw8IDQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOwotCi0JCQlpZiAoIWNoYW4gfHwgIWNoYW4tPnJhbWluX2dyY3R4KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoaW5zdCA9PSBjaGFuLT5yYW1pbl9ncmN0eC0+cGluc3QpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnN0ID0gKG52X3JkMzIoZGV2LCAweDQwMDMyYykgJiAweGZmZmZmKSA8PCAxMjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07Ci0KLQkJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW4pCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluLT52aW5zdCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCAqY2hhbm5lbF9yZXQpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOwotCWludCBjaGFubmVsOwotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKLQkJY2hhbm5lbCA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAyNCkgJiAweGY7Ci0JZWxzZQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCi0JCWNoYW5uZWwgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUikgPj4gMjApICYgMHgxZjsKLQllbHNlCi0JCWNoYW5uZWwgPSBub3V2ZWF1X2dyYXBoX2NoaWRfZnJvbV9ncmN0eChkZXYpOwotCi0JaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzIHx8ICFkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0pIHsKLQkJTlZfRVJST1IoZGV2LCAiQUlJSSwgaW52YWxpZC9pbmFjdGl2ZSBjaGFubmVsIGlkICVkXG4iLCBjaGFubmVsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKmNoYW5uZWxfcmV0ID0gY2hhbm5lbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgewotCWludCBjaGFubmVsOwotCWludCBjbGFzczsKLQlpbnQgc3ViYywgbXRoZCwgc2l6ZTsKLQl1aW50MzJfdCBkYXRhLCBkYXRhMjsKLQl1aW50MzJfdCBuc291cmNlLCBuc3RhdHVzOwotfTsKLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGFkZHJlc3M7Ci0KLQl0cmFwLT5uc291cmNlID0gdHJhcC0+bnN0YXR1cyA9IDA7Ci0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQl0cmFwLT5uc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOwotCQl0cmFwLT5uc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TVEFUVVMpOwotCX0KLQotCWlmIChub3V2ZWF1X2dyYXBoX3RyYXBwZWRfY2hhbm5lbChkZXYsICZ0cmFwLT5jaGFubmVsKSkKLQkJdHJhcC0+Y2hhbm5lbCA9IC0xOwotCWFkZHJlc3MgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKLQotCXRyYXAtPm10aGQgPSBhZGRyZXNzICYgMHgxRkZDOwotCXRyYXAtPmRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKSB7Ci0JCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTMpICYgMHg3OwotCX0gZWxzZSB7Ci0JCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTYpICYgMHg3OwotCQl0cmFwLT5kYXRhMiA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9UUkFQUEVEX0RBVEFfSElHSCk7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxODAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRjsKLQllbHNlIGlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCi0JCXRyYXAtPmNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTYwICsgdHJhcC0+c3ViYyo0KSAmIDB4RkZGOwotCWVsc2UgaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRkZGOwotCWVsc2UKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOwotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCwKLQkJCSAgICAgc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgKnRyYXApCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBuc291cmNlID0gdHJhcC0+bnNvdXJjZSwgbnN0YXR1cyA9IHRyYXAtPm5zdGF0dXM7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCU5WX0lORk8oZGV2LCAiJXMgLSBuU291cmNlOiIsIGlkKTsKLQkJbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyhuc291cmNlLCBuc291cmNlX25hbWVzKTsKLQkJcHJpbnRrKCIsIG5TdGF0dXM6Iik7Ci0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMTApCi0JCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXMpOwotCQllbHNlCi0JCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXNfbnYxMCk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlOVl9JTkZPKGRldiwgIiVzIC0gQ2ggJWQvJWQgQ2xhc3MgMHglMDR4IE10aGQgMHglMDR4ICIKLQkJCQkJIkRhdGEgMHglMDh4OjB4JTA4eFxuIiwKLQkJCQkJaWQsIHRyYXAtPmNoYW5uZWwsIHRyYXAtPnN1YmMsCi0JCQkJCXRyYXAtPmNsYXNzLCB0cmFwLT5tdGhkLAotCQkJCQl0cmFwLT5kYXRhMiwgdHJhcC0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKHRyYXAtPmNoYW5uZWwgPCAwIHx8Ci0JICAgIHRyYXAtPmNoYW5uZWwgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzIHx8Ci0JICAgICFkZXZfcHJpdi0+Zmlmb3NbdHJhcC0+Y2hhbm5lbF0pCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIG5vdXZlYXVfY2FsbF9tZXRob2QoZGV2X3ByaXYtPmZpZm9zW3RyYXAtPmNoYW5uZWxdLAotCQkJCSAgIHRyYXAtPmNsYXNzLCB0cmFwLT5tdGhkLCB0cmFwLT5kYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1ub3V2ZWF1X3BncmFwaF9pbnRyX25vdGlmeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBuc291cmNlKQotewotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF90cmFwIHRyYXA7Ci0JaW50IHVuaGFuZGxlZCA9IDA7Ci0KLQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQotCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKLQkJaWYgKG5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKGRldiwgJnRyYXApKQotCQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgewotCQl1bmhhbmRsZWQgPSAxOwotCX0KLQotCWlmICh1bmhhbmRsZWQpCi0JCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LCAiUEdSQVBIX05PVElGWSIsICZ0cmFwKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgbnNvdXJjZSkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCB0cmFwOwotCWludCB1bmhhbmRsZWQgPSAwOwotCi0Jbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JdHJhcC5uc291cmNlID0gbnNvdXJjZTsKLQotCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKLQkJaWYgKG5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKGRldiwgJnRyYXApKQotCQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9WVFhfUFJPVEVDVElPTikgewotCQl1aW50MzJfdCB2ID0gbnZfcmQzMihkZXYsIDB4NDAyMDAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAyMDAwLCB2KTsKLQotCQkvKiBkdW1wIHRoZSBlcnJvciBhbnl3YXkgZm9yIG5vdzogaXQncyB1c2VmdWwgZm9yCi0JCSAgIEdhbGxpdW0gZGV2ZWxvcG1lbnQgKi8KLQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgewotCQl1bmhhbmRsZWQgPSAxOwotCX0KLQotCWlmICh1bmhhbmRsZWQgJiYgbm91dmVhdV9yYXRlbGltaXQoKSkKLQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsICJQR1JBUEhfRVJST1IiLCAmdHJhcCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbm91dmVhdV9wZ3JhcGhfaW50cl9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKLQl1aW50MzJfdCBjaGlkOwotCi0JY2hpZCA9IGVuZ2luZS0+Zmlmby5jaGFubmVsX2lkKGRldik7Ci0JTlZfREVCVUcoZGV2LCAiUEdSQVBIIGNvbnRleHQgc3dpdGNoIGludGVycnVwdCBjaGFubmVsICV4XG4iLCBjaGlkKTsKLQotCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgewotCWNhc2UgTlZfMDQ6Ci0JCW52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8xMDoKLQkJbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlOVl9FUlJPUihkZXYsICJDb250ZXh0IHN3aXRjaCBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXVpbnQzMl90IHN0YXR1czsKLQotCXdoaWxlICgoc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgewotCQl1aW50MzJfdCBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOwotCi0JCWlmIChzdGF0dXMgJiBOVl9QR1JBUEhfSU5UUl9OT1RJRlkpIHsKLQkJCW5vdXZlYXVfcGdyYXBoX2ludHJfbm90aWZ5KGRldiwgbnNvdXJjZSk7Ci0KLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfTk9USUZZOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX05PVElGWSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfRVJST1IpIHsKLQkJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlKTsKLQotCQkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBOVl9QR1JBUEhfSU5UUl9FUlJPUik7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpIHsKLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwKLQkJCQkgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpOwotCi0JCQlub3V2ZWF1X3BncmFwaF9pbnRyX2NvbnRleHRfc3dpdGNoKGRldik7Ci0JCX0KLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlOVl9JTkZPKGRldiwgIlVuaGFuZGxlZCBQR1JBUEhfSU5UUiAtIDB4JTA4eFxuIiwgc3RhdHVzKTsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0dXMpOwotCQl9Ci0KLQkJaWYgKChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRklGTykgJiAoMSA8PCAwKSkgPT0gMCkKLQkJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAxKTsKLQl9Ci0KLQludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HKTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VudW1fbmFtZXMgbnY1MF9tcF9leGVjX2Vycm9yX25hbWVzW10gPQotewotCXsgMywgIlNUQUNLX1VOREVSRkxPVyIgfSwKLQl7IDQsICJRVUFET05fQUNUSVZFIiB9LAotCXsgOCwgIlRJTUVPVVQiIH0sCi0JeyAweDEwLCAiSU5WQUxJRF9PUENPREUiIH0sCi0JeyAweDQwLCAiQlJFQUtQT0lOVCIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1udjUwX3BncmFwaF9tcF90cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB0cGlkLCBpbnQgZGlzcGxheSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MTU0MCk7Ci0JdWludDMyX3QgYWRkciwgbXAxMCwgc3RhdHVzLCBwYywgb3Bsb3csIG9waGlnaDsKLQlpbnQgaTsKLQlpbnQgbXBzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICghKHVuaXRzICYgMSA8PCAoaSsyNCkpKQotCQkJY29udGludWU7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApCi0JCQlhZGRyID0gMHg0MDgyMDAgKyAodHBpZCA8PCAxMikgKyAoaSA8PCA3KTsKLQkJZWxzZQotCQkJYWRkciA9IDB4NDA4MTAwICsgKHRwaWQgPDwgMTEpICsgKGkgPDwgNyk7Ci0JCW1wMTAgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTApOwotCQlzdGF0dXMgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTQpOwotCQlpZiAoIXN0YXR1cykKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGlzcGxheSkgewotCQkJbnZfcmQzMihkZXYsIGFkZHIgKyAweDIwKTsKLQkJCXBjID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDI0KTsKLQkJCW9wbG93ID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDcwKTsKLQkJCW9waGlnaD0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDc0KTsKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtICIKLQkJCQkJIlRQICVkIE1QICVkOiAiLCB0cGlkLCBpKTsKLQkJCW5vdXZlYXVfcHJpbnRfZW51bV9uYW1lcyhzdGF0dXMsCi0JCQkJCW52NTBfbXBfZXhlY19lcnJvcl9uYW1lcyk7Ci0JCQlwcmludGsoIiBhdCAlMDZ4IHdhcnAgJWQsIG9wY29kZSAlMDh4ICUwOHhcbiIsCi0JCQkJCXBjJjB4ZmZmZmZmLCBwYyA+PiAyNCwKLQkJCQkJb3Bsb3csIG9waGlnaCk7Ci0JCX0KLQkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDEwLCBtcDEwKTsKLQkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDE0LCAwKTsKLQkJbXBzKys7Ci0JfQotCWlmICghbXBzICYmIGRpc3BsYXkpCi0JCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtIFRQICVkOiAiCi0JCQkJIk5vIE1QcyBjbGFpbWluZyBlcnJvcnM/XG4iLCB0cGlkKTsKLX0KLQotc3RhdGljIHZvaWQKLW52NTBfcGdyYXBoX3RwX3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHR5cGUsIHVpbnQzMl90IHVzdGF0dXNfb2xkLAotCQl1aW50MzJfdCB1c3RhdHVzX25ldywgaW50IGRpc3BsYXksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgdHBzID0gMDsKLQl1aW50MzJfdCB1bml0cyA9IG52X3JkMzIoZGV2LCAweDE1NDApOwotCWludCBpLCByOwotCXVpbnQzMl90IHVzdGF0dXNfYWRkciwgdXN0YXR1czsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlpZiAoISh1bml0cyAmICgxIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweGEwKQotCQkJdXN0YXR1c19hZGRyID0gdXN0YXR1c19vbGQgKyAoaSA8PCAxMik7Ci0JCWVsc2UKLQkJCXVzdGF0dXNfYWRkciA9IHVzdGF0dXNfbmV3ICsgKGkgPDwgMTEpOwotCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkcikgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMpCi0JCQljb250aW51ZTsKLQkJdHBzKys7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDY6IC8qIHRleHR1cmUgZXJyb3IuLi4gdW5rbm93biBmb3Igbm93ICovCi0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCBuYW1lKTsKLQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJTlZfRVJST1IoZGV2LCAibWFnaWMgc2V0ICVkOlxuIiwgaSk7Ci0JCQkJZm9yIChyID0gdXN0YXR1c19hZGRyICsgNDsgciA8PSB1c3RhdHVzX2FkZHIgKyAweDEwOyByICs9IDQpCi0JCQkJCU5WX0VSUk9SKGRldiwgIlx0MHglMDh4OiAweCUwOHhcbiIsIHIsCi0JCQkJCQludl9yZDMyKGRldiwgcikpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgNzogLyogTVAgZXJyb3IgKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAxMDAwMCkgewotCQkJCW52NTBfcGdyYXBoX21wX3RyYXAoZGV2LCBpLCBkaXNwbGF5KTsKLQkJCQl1c3RhdHVzICY9IH4weDAwMDEwMDAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODogLyogVFBETUEgZXJyb3IgKi8KLQkJCXsKLQkJCXVpbnQzMl90IGUwYyA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA0KTsKLQkJCXVpbnQzMl90IGUxMCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA4KTsKLQkJCXVpbnQzMl90IGUxNCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyAweGMpOwotCQkJdWludDMyX3QgZTE4ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTApOwotCQkJdWludDMyX3QgZTFjID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTQpOwotCQkJdWludDMyX3QgZTIwID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTgpOwotCQkJdWludDMyX3QgZTI0ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MWMpOwotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgbmFtZSk7Ci0JCQkvKiAyZCBlbmdpbmUgZGVzdGluYXRpb24gKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDAxMCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQlpLCBlMTQsIGUxMCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKLQkJCX0KLQkJCS8qIFJlbmRlciB0YXJnZXQgKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA0MCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQlpLCBlMTQsIGUxMCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA0MDsKLQkJCX0KLQkJCS8qIENVREEgbWVtb3J5OiBsW10sIGdbXSBvciBzdGFjay4gKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA4MCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCWlmIChlMTggJiAweDgwMDAwMDAwKSB7Ci0JCQkJCQkvKiBnW10gcmVhZCBmYXVsdD8gKi8KLQkJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIEdsb2JhbCByZWFkIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gMjQpICYgMHgxZikpOwotCQkJCQkJZTE4ICY9IH4weDFmMDAwMDAwOwotCQkJCQl9IGVsc2UgaWYgKGUxOCAmIDB4YykgewotCQkJCQkJLyogZ1tdIHdyaXRlIGZhdWx0PyAqLwotCQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQSAtIFRQICVkIC0gR2xvYmFsIHdyaXRlIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gNykgJiAweDFmKSk7Ci0JCQkJCQllMTggJj0gfjB4MDAwMDBmODA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1RQRE1BIC0gVFAgJWQgLSBVbmtub3duIENVREEgZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQkJaSwgZTE0LCBlMTApOwotCQkJCQl9Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA4MDsKLQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh1c3RhdHVzKSB7Ci0JCQlpZiAoZGlzcGxheSkKLQkJCQlOVl9JTkZPKGRldiwgIiVzIC0gVFAlZDogVW5oYW5kbGVkIHVzdGF0dXMgMHglMDh4XG4iLCBuYW1lLCBpLCB1c3RhdHVzKTsKLQkJfQotCQludl93cjMyKGRldiwgdXN0YXR1c19hZGRyLCAweGMwMDAwMDAwKTsKLQl9Ci0KLQlpZiAoIXRwcyAmJiBkaXNwbGF5KQotCQlOVl9JTkZPKGRldiwgIiVzIC0gTm8gVFBzIGNsYWltaW5nIGVycm9ycz9cbiIsIG5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotbnY1MF9wZ3JhcGhfdHJhcF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgdHJhcDsKLQl1aW50MzJfdCBzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDAxMDgpOwotCXVpbnQzMl90IHVzdGF0dXM7Ci0JaW50IGRpc3BsYXkgPSBub3V2ZWF1X3JhdGVsaW1pdCgpOwotCi0KLQlpZiAoIXN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwgIlBHUkFQSF9UUkFQIiwgJnRyYXApOwotCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQIC0gbm8gdW5pdHMgcmVwb3J0aW5nIHRyYXBzP1xuIik7Ci0JfQotCi0JLyogRElTUEFUQ0g6IFJlbGF5cyBjb21tYW5kcyB0byBvdGhlciB1bml0cyBhbmQgaGFuZGxlcyBOT1RJRlksCi0JICogQ09ORCwgUVVFUlkuIElmIHlvdSBnZXQgYSB0cmFwIGZyb20gaXQsIHRoZSBjb21tYW5kIGlzIHN0aWxsIHN0dWNrCi0JICogaW4gRElTUEFUQ0ggYW5kIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCBpdC4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMDEpIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwMDgwNCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCi0JCS8qIEtub3duIHRvIGJlIHRyaWdnZXJlZCBieSBzY3Jld2VkIHVwIE5PVElGWSBhbmQgQ09ORC4uLiAqLwotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9ESVNQQVRDSF9GQVVMVCIpOwotCQkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAwKTsKLQkJCWlmIChudl9yZDMyKGRldiwgMHg0MDA4MDgpICYgMHg4MDAwMDAwMCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCWlmIChub3V2ZWF1X2dyYXBoX3RyYXBwZWRfY2hhbm5lbChkZXYsICZ0cmFwLmNoYW5uZWwpKQotCQkJCQkJdHJhcC5jaGFubmVsID0gLTE7Ci0JCQkJCXRyYXAuY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOwotCQkJCQl0cmFwLm10aGQgPSBudl9yZDMyKGRldiwgMHg0MDA4MDgpICYgMHgxZmZjOwotCQkJCQl0cmFwLnN1YmMgPSAobnZfcmQzMihkZXYsIDB4NDAwODA4KSA+PiAxNikgJiAweDc7Ci0JCQkJCXRyYXAuZGF0YSA9IG52X3JkMzIoZGV2LCAweDQwMDgwYyk7Ci0JCQkJCXRyYXAuZGF0YTIgPSBudl9yZDMyKGRldiwgMHg0MDA4MTApOwotCQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCQkiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQiLCAmdHJhcCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQgLSA0MDA4MDg6ICUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDQwMDgwOCkpOwotCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX0ZBVUxUIC0gNDAwODQ4OiAlMDh4XG4iLCBudl9yZDMyKGRldiwgMHg0MDA4NDgpKTsKLQkJCQl9Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDAwODA4LCAwKTsKLQkJCX0gZWxzZSBpZiAoZGlzcGxheSkgewotCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQgLSBObyBzdHVjayBjb21tYW5kP1xuIik7Ci0JCQl9Ci0JCQludl93cjMyKGRldiwgMHg0MDA4ZTgsIG52X3JkMzIoZGV2LCAweDQwMDhlOCkgJiAzKTsKLQkJCW52X3dyMzIoZGV2LCAweDQwMDg0OCwgMCk7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX1FVRVJZIik7Ci0JCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDApOwotCQkJaWYgKG52X3JkMzIoZGV2LCAweDQwMDg0YykgJiAweDgwMDAwMDAwKSB7Ci0JCQkJaWYgKGRpc3BsYXkpIHsKLQkJCQkJaWYgKG5vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKGRldiwgJnRyYXAuY2hhbm5lbCkpCi0JCQkJCQl0cmFwLmNoYW5uZWwgPSAtMTsKLQkJCQkJdHJhcC5jbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7Ci0JCQkJCXRyYXAubXRoZCA9IG52X3JkMzIoZGV2LCAweDQwMDg0YykgJiAweDFmZmM7Ci0JCQkJCXRyYXAuc3ViYyA9IChudl9yZDMyKGRldiwgMHg0MDA4NGMpID4+IDE2KSAmIDB4NzsKLQkJCQkJdHJhcC5kYXRhID0gbnZfcmQzMihkZXYsIDB4NDAwODVjKTsKLQkJCQkJdHJhcC5kYXRhMiA9IDA7Ci0JCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJCSJQR1JBUEhfVFJBUF9ESVNQQVRDSF9RVUVSWSIsICZ0cmFwKTsKLQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSF9RVUVSWSAtIDQwMDg0YzogJTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4NDAwODRjKSk7Ci0JCQkJfQotCQkJCW52X3dyMzIoZGV2LCAweDQwMDg0YywgMCk7Ci0JCQl9IGVsc2UgaWYgKGRpc3BsYXkpIHsKLQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX1FVRVJZIC0gTm8gc3R1Y2sgY29tbWFuZD9cbiIpOwotCQkJfQotCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAwMjsKLQkJfQotCQlpZiAodXN0YXR1cyAmJiBkaXNwbGF5KQotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSCAtIFVuaGFuZGxlZCB1c3RhdHVzIDB4JTA4eFxuIiwgdXN0YXR1cyk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDgwNCwgMHhjMDAwMDAwMCk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMDEpOwotCQlzdGF0dXMgJj0gfjB4MDAxOwotCX0KLQotCS8qIFRSQVBzIG90aGVyIHRoYW4gZGlzcGF0Y2ggdXNlIHRoZSAibm9ybWFsIiB0cmFwIHJlZ3MuICovCi0JaWYgKHN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkiUEdSQVBIX1RSQVAiLCAmdHJhcCk7Ci0JfQotCi0JLyogTTJNRjogTWVtb3J5IHRvIG1lbW9yeSBjb3B5IGVuZ2luZS4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMDIpIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwNjgwMCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9NMk1GIC0gbm8gdXN0YXR1cz9cbiIpOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMSkgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX00yTUZfTk9USUZZIik7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX00yTUZfSU4iKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDI7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDA0KSB7Ci0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfTTJNRl9PVVQiKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDQ7Ci0JCX0KLQkJTlZfSU5GTyAoZGV2LCAiUEdSQVBIX1RSQVBfTTJNRiAtICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkJbnZfcmQzMihkZXYsIDB4NDA2ODA0KSwKLQkJCQludl9yZDMyKGRldiwgMHg0MDY4MDgpLAotCQkJCW52X3JkMzIoZGV2LCAweDQwNjgwYyksCi0JCQkJbnZfcmQzMihkZXYsIDB4NDA2ODEwKSk7Ci0JCWlmICh1c3RhdHVzICYmIGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX00yTUYgLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQkvKiBObyBzYW5lIHdheSBmb3VuZCB5ZXQgLS0ganVzdCByZXNldCB0aGUgYnVnZ2VyLiAqLwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDIpOwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDApOwotCQludl93cjMyKGRldiwgMHg0MDY4MDAsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDAyKTsKLQkJc3RhdHVzICY9IH4weDAwMjsKLQl9Ci0KLQkvKiBWRkVUQ0g6IEZldGNoZXMgZGF0YSBmcm9tIHZlcnRleCBidWZmZXJzLiAqLwotCWlmIChzdGF0dXMgJiAweDAwNCkgewotCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDAwYzA0KSAmIDB4N2ZmZmZmZmY7Ci0JCWlmICghdXN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1ZGRVRDSCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9WRkVUQ0hfRkFVTFQiKTsKLQkJCU5WX0lORk8gKGRldiwgIlBHUkFQSF9UUkFQX1ZGRVRDSF9GQVVMVCAtICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwMCksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwOCksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwYyksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMxMCkpOwotCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAwMTsKLQkJfQotCQlpZiAodXN0YXR1cyAmJiBkaXNwbGF5KQotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9WRkVUQ0ggLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQludl93cjMyKGRldiwgMHg0MDBjMDQsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA0KTsKLQkJc3RhdHVzICY9IH4weDAwNDsKLQl9Ci0KLQkvKiBTVFJNT1VUOiBEaXJlY3RYIHN0cmVhbW91dCAvIE9wZW5HTCB0cmFuc2Zvcm0gZmVlZGJhY2suICovCi0JaWYgKHN0YXR1cyAmIDB4MDA4KSB7Ci0JCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDE4MDApICYgMHg3ZmZmZmZmZjsKLQkJaWYgKCF1c3RhdHVzICYmIGRpc3BsYXkpIHsKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfU1RSTU9VVCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9TVFJNT1VUX0ZBVUxUIik7Ci0JCQlOVl9JTkZPIChkZXYsICJQR1JBUEhfVFJBUF9TVFJNT1VUX0ZBVUxUIC0gJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODA0KSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODA4KSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODBjKSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODEwKSk7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYmIGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1NUUk1PVVQgLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQkvKiBObyBzYW5lIHdheSBmb3VuZCB5ZXQgLS0ganVzdCByZXNldCB0aGUgYnVnZ2VyLiAqLwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDB4ODApOwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDApOwotCQludl93cjMyKGRldiwgMHg0MDE4MDAsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA4KTsKLQkJc3RhdHVzICY9IH4weDAwODsKLQl9Ci0KLQkvKiBDQ0FDSEU6IEhhbmRsZXMgY29kZSBhbmQgY1tdIGNhY2hlcyBhbmQgZmlsbHMgdGhlbS4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMTApIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwNTAxOCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9DQ0FDSEUgLSBubyB1c3RhdHVzP1xuIik7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDAxKSB7Ci0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfQ0NBQ0hFX0ZBVUxUIik7Ci0JCQlOVl9JTkZPIChkZXYsICJQR1JBUEhfVFJBUF9DQ0FDSEVfRkFVTFQgLSAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDApLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDQpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDgpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MGMpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MTApLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MTQpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MWMpKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDE7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiYgZGlzcGxheSkKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfQ0NBQ0hFIC0gVW5oYW5kbGVkIHVzdGF0dXMgMHglMDh4XG4iLCB1c3RhdHVzKTsKLQkJbnZfd3IzMihkZXYsIDB4NDA1MDE4LCAweGMwMDAwMDAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDAxMCk7Ci0JCXN0YXR1cyAmPSB+MHgwMTA7Ci0JfQotCi0JLyogVW5rbm93biwgbm90IHNlZW4geWV0Li4uIDB4NDAyMDAwIGlzIHRoZSBvbmx5IHRyYXAgc3RhdHVzIHJlZwotCSAqIHJlbWFpbmluZywgc28gdHJ5IHRvIGhhbmRsZSBpdCBhbnl3YXkuIFBlcmhhcHMgcmVsYXRlZCB0byB0aGF0Ci0JICogdW5rbm93biBETUEgc2xvdCBvbiB0ZXNsYT8gKi8KLQlpZiAoc3RhdHVzICYgMHgyMCkgewotCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfVU5LQzA0Iik7Ci0JCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDIwMDApICYgMHg3ZmZmZmZmZjsKLQkJaWYgKGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1VOS0MwNCAtIFVuaGFuZGxlZCB1c3RhdHVzIDB4JTA4eFxuIiwgdXN0YXR1cyk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMjAwMCwgMHhjMDAwMDAwMCk7Ci0JCS8qIG5vIHN0YXR1cyBtb2RpZmljdGlvbiBvbiBwdXJwb3NlICovCi0JfQotCi0JLyogVEVYVFVSRTogQ1VEQSB0ZXh0dXJpbmcgdW5pdHMgKi8KLQlpZiAoc3RhdHVzICYgMHgwNDApIHsKLQkJbnY1MF9wZ3JhcGhfdHBfdHJhcCAoZGV2LCA2LCAweDQwODkwMCwgMHg0MDg2MDAsIGRpc3BsYXksCi0JCQkJIlBHUkFQSF9UUkFQX1RFWFRVUkUiKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDA0MCk7Ci0JCXN0YXR1cyAmPSB+MHgwNDA7Ci0JfQotCi0JLyogTVA6IENVREEgZXhlY3V0aW9uIGVuZ2luZXMuICovCi0JaWYgKHN0YXR1cyAmIDB4MDgwKSB7Ci0JCW52NTBfcGdyYXBoX3RwX3RyYXAgKGRldiwgNywgMHg0MDgzMTQsIDB4NDA4MzFjLCBkaXNwbGF5LAotCQkJCSJQR1JBUEhfVFJBUF9NUCIpOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDgwKTsKLQkJc3RhdHVzICY9IH4weDA4MDsKLQl9Ci0KLQkvKiBUUERNQTogIEhhbmRsZXMgVFAtaW5pdGlhdGVkIHVuY2FjaGVkIG1lbW9yeSBhY2Nlc3NlczoKLQkgKiBsW10sIGdbXSwgc3RhY2ssIDJkIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cy4gKi8KLQlpZiAoc3RhdHVzICYgMHgxMDApIHsKLQkJbnY1MF9wZ3JhcGhfdHBfdHJhcCAoZGV2LCA4LCAweDQwOGUwOCwgMHg0MDg3MDgsIGRpc3BsYXksCi0JCQkJIlBHUkFQSF9UUkFQX1RQRE1BIik7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgxMDApOwotCQlzdGF0dXMgJj0gfjB4MTAwOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJaWYgKGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQIC0gVW5rbm93biB0cmFwIDB4JTA4eFxuIiwKLQkJCQlzdGF0dXMpOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIHN0YXR1cyk7Ci0JfQotfQotCi0vKiBUaGVyZSBtdXN0IGJlIGEgKmxvdCogb2YgdGhlc2UuIFdpbGwgdGFrZSBzb21lIHRpbWUgdG8gZ2F0aGVyIHRoZW0gdXAuICovCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfZW51bV9uYW1lcyBudjUwX2RhdGFfZXJyb3JfbmFtZXNbXSA9Ci17Ci0JeyA0LAkiSU5WQUxJRF9WQUxVRSIgfSwKLQl7IDUsCSJJTlZBTElEX0VOVU0iIH0sCi0JeyA4LAkiSU5WQUxJRF9PQkpFQ1QiIH0sCi0JeyAweGMsCSJJTlZBTElEX0JJVEZJRUxEIiB9LAotCXsgMHgyOCwJIk1QX05PX1JFR19TUEFDRSIgfSwKLQl7IDB4MmIsCSJNUF9CTE9DS19TSVpFX01JU01BVENIIiB9LAotfTsKLQotc3RhdGljIHZvaWQKLW52NTBfcGdyYXBoX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgdHJhcDsKLQlpbnQgdW5oYW5kbGVkID0gMDsKLQl1aW50MzJfdCBzdGF0dXM7Ci0KLQl3aGlsZSAoKHN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSKSkpIHsKLQkJLyogTk9USUZZOiBZb3UndmUgc2V0IGEgTk9USUZZIGFuIGEgY29tbWFuZCBhbmQgaXQncyBkb25lLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAwMSkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfTk9USUZZIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwMDEpOwotCQl9Ci0KLQkJLyogQ09NUFVURV9RVUVSWTogUHVycG9zZSBhbmQgZXhhY3QgY2F1c2UgdW5rbm93biwgaGFwcGVucwotCQkgKiB3aGVuIHlvdSB3cml0ZSAweDIwMCB0byAweDUwYzAgbWV0aG9kIDB4MzFjLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfQ09NUFVURV9RVUVSWSIsICZ0cmFwKTsKLQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAwMjsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMDAwMDAyKTsKLQkJfQotCi0JCS8qIFVua25vd24sIG5ldmVyIHNlZW46IDB4NCAqLwotCi0JCS8qIElMTEVHQUxfTVRIRDogWW91IHVzZWQgYSB3cm9uZyBtZXRob2QgZm9yIHRoaXMgY2xhc3MuICovCi0JCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7Ci0JCQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQkJCWlmIChub3V2ZWF1X3BncmFwaF9pbnRyX3N3bXRoZChkZXYsICZ0cmFwKSkKLQkJCQl1bmhhbmRsZWQgPSAxOwotCQkJaWYgKHVuaGFuZGxlZCAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9JTExFR0FMX01USEQiLCAmdHJhcCk7Ci0JCQlzdGF0dXMgJj0gfjB4MDAwMDAwMTA7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDAwMDAxMCk7Ci0JCX0KLQotCQkvKiBJTExFR0FMX0NMQVNTOiBZb3UgdXNlZCBhIHdyb25nIGNsYXNzLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAyMCkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfSUxMRUdBTF9DTEFTUyIsICZ0cmFwKTsKLQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAyMDsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMDAwMDIwKTsKLQkJfQotCi0JCS8qIERPVUJMRV9OT1RJRlk6IFlvdSB0cmllZCB0byBzZXQgYSBOT1RJRlkgb24gYW5vdGhlciBOT1RJRlkuICovCi0JCWlmIChzdGF0dXMgJiAweDAwMDAwMDQwKSB7Ci0JCQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQkJCWlmIChub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9ET1VCTEVfTk9USUZZIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAwMDAwMDQwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwNDApOwotCQl9Ci0KLQkJLyogQ09OVEVYVF9TV0lUQ0g6IFBHUkFQSCBuZWVkcyB1cyB0byBsb2FkIGEgbmV3IGNvbnRleHQgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAwMDEwMDApIHsKLQkJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMCk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwKLQkJCQlOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7Ci0JCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgbnZfcmQzMihkZXYsCi0JCQkJTlY0MF9QR1JBUEhfSU5UUl9FTikgJgotCQkJCX5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7Ci0JCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOwotCi0JCQludjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7Ci0KLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7Ci0JCX0KLQotCQkvKiBCVUZGRVJfTk9USUZZOiBZb3VyIG0ybWYgdHJhbnNmZXIgZmluaXNoZWQgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAwMTAwMDApIHsKLQkJCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsCi0JCQkJCQkiUEdSQVBIX0JVRkZFUl9OT1RJRlkiLCAmdHJhcCk7Ci0JCQlzdGF0dXMgJj0gfjB4MDAwMTAwMDA7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDAxMDAwMCk7Ci0JCX0KLQotCQkvKiBEQVRBX0VSUk9SOiBJbnZhbGlkIHZhbHVlIGZvciB0aGlzIG1ldGhvZCwgb3IgaW52YWxpZAotCQkgKiBzdGF0ZSBpbiBjdXJyZW50IFBHUkFQSCBjb250ZXh0IGZvciB0aGlzIG9wZXJhdGlvbiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDEwMDAwMCkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkgewotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9EQVRBX0VSUk9SIiwgJnRyYXApOwotCQkJCU5WX0lORk8gKGRldiwgIlBHUkFQSF9EQVRBX0VSUk9SIC0gIik7Ci0JCQkJbm91dmVhdV9wcmludF9lbnVtX25hbWVzKG52X3JkMzIoZGV2LCAweDQwMDExMCksCi0JCQkJCQludjUwX2RhdGFfZXJyb3JfbmFtZXMpOwotCQkJCXByaW50aygiXG4iKTsKLQkJCX0KLQkJCXN0YXR1cyAmPSB+MHgwMDEwMDAwMDsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMTAwMDAwKTsKLQkJfQotCi0JCS8qIFRSQVA6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgaW4gdGhlIG1pZGRsZSBvZiBjb21tYW5kCi0JCSAqIGV4ZWN1dGlvbi4gIEhhcyBhIGJpbGxpb24gdHlwZXMsIHN1YnR5cGVzLCBhbmQgZXZlbgotCQkgKiBzdWJzdWJ0eXBlcy4gKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAyMDAwMDApIHsKLQkJCW52NTBfcGdyYXBoX3RyYXBfaGFuZGxlcihkZXYpOwotCQkJc3RhdHVzICY9IH4weDAwMjAwMDAwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAyMDAwMDApOwotCQl9Ci0KLQkJLyogVW5rbm93biwgbmV2ZXIgc2VlbjogMHgwMDQwMDAwMCAqLwotCi0JCS8qIFNJTkdMRV9TVEVQOiBIYXBwZW5zIG9uIGV2ZXJ5IG1ldGhvZCBpZiB5b3UgdHVybmVkIG9uCi0JCSAqIHNpbmdsZSBzdGVwcGluZyBpbiA0MDAwOGMgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDEwMDAwMDApIHsKLQkJCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsCi0JCQkJCQkiUEdSQVBIX1NJTkdMRV9TVEVQIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAxMDAwMDAwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDEwMDAwMDApOwotCQl9Ci0KLQkJLyogMHgwMjAwMDAwMCBoYXBwZW5zIHdoZW4geW91IHBhdXNlIGEgY3R4cHJvZy4uLgotCQkgKiBidXQgdGhlIG9ubHkgd2F5IHRoaXMgY2FuIGhhcHBlbiB0aGF0IEkga25vdyBpcyBieQotCQkgKiBwb2tpbmcgdGhlIHJlbGV2YW50IE1NSU8gcmVnaXN0ZXIsIGFuZCB3ZSBkb24ndAotCQkgKiBkbyB0aGF0LiAqLwotCi0JCWlmIChzdGF0dXMpIHsKLQkJCU5WX0lORk8oZGV2LCAiVW5oYW5kbGVkIFBHUkFQSF9JTlRSIC0gMHglMDh4XG4iLAotCQkJCXN0YXR1cyk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdHVzKTsKLQkJfQotCi0JCXsKLQkJCWNvbnN0IGludCBpc2IgPSAoMSA8PCAxNikgfCAoMSA8PCAwKTsKLQotCQkJaWYgKChudl9yZDMyKGRldiwgMHg0MDA1MDApICYgaXNiKSAhPSBpc2IpCi0JCQkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDA1MDApIHwgaXNiKTsKLQkJfQotCX0KLQotCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzAsIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpOwotCWlmIChudl9yZDMyKGRldiwgMHg0MDA4MjQpICYgKDEgPDwgMzEpKQotCQludl93cjMyKGRldiwgMHg0MDA4MjQsIG52X3JkMzIoZGV2LCAweDQwMDgyNCkgJiB+KDEgPDwgMzEpKTsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKLXsKLQlpZiAoY3J0YyAmIDEpCi0JCW52X3dyMzIoZGV2LCBOVl9DUlRDMF9JTlRTVEFULCBOVl9DUlRDX0lOVFJfVkJMQU5LKTsKLQotCWlmIChjcnRjICYgMikKLQkJbnZfd3IzMihkZXYsIE5WX0NSVEMxX0lOVFNUQVQsIE5WX0NSVENfSU5UUl9WQkxBTkspOwotfQotCiBpcnFyZXR1cm5fdAogbm91dmVhdV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0OworCWludCBpOwogCi0Jc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCk7Ci0JaWYgKCFzdGF0dXMpCisJc3RhdCA9IG52X3JkMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzApOworCWlmICghc3RhdCkKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IDMyICYmIHN0YXQ7IGkrKykgeworCQlpZiAoIShzdGF0ICYgKDEgPDwgaSkpIHx8ICFkZXZfcHJpdi0+aXJxX2hhbmRsZXJbaV0pCisJCQljb250aW51ZTsKIAotCWlmIChzdGF0dXMgJiBOVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkcpIHsKLQkJbm91dmVhdV9maWZvX2lycV9oYW5kbGVyKGRldik7Ci0JCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HOworCQlkZXZfcHJpdi0+aXJxX2hhbmRsZXJbaV0oZGV2KTsKKwkJc3RhdCAmPSB+KDEgPDwgaSk7CiAJfQogCi0JaWYgKHN0YXR1cyAmIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpIHsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQludjUwX3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOwotCQllbHNlCi0JCQlub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOwotCi0JCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QR1JBUEhfUEVORElORzsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgTlZfUE1DX0lOVFJfMF9DUlRDbl9QRU5ESU5HKSB7Ci0JCW5vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihkZXYsIChzdGF0dXM+PjI0KSYzKTsKLQkJc3RhdHVzICY9IH5OVl9QTUNfSU5UUl8wX0NSVENuX1BFTkRJTkc7Ci0JfQotCi0JaWYgKHN0YXR1cyAmIChOVl9QTUNfSU5UUl8wX05WNTBfRElTUExBWV9QRU5ESU5HIHwKLQkJICAgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKSkgewotCQludjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoZGV2KTsKLQkJc3RhdHVzICY9IH4oTlZfUE1DX0lOVFJfMF9OVjUwX0RJU1BMQVlfUEVORElORyB8Ci0JCQkgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKTsKLQl9Ci0KLQlpZiAoc3RhdHVzKQotCQlOVl9FUlJPUihkZXYsICJVbmhhbmRsZWQgUE1DIElOVFIgc3RhdHVzIGJpdHMgMHglMDh4XG4iLCBzdGF0dXMpOwotCisJaWYgKGRldl9wcml2LT5tc2lfZW5hYmxlZCkKKwkJbnZfd3IwOChkZXYsIDB4MDAwODgwNjgsIDB4ZmYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKKwlpZiAoc3RhdCAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKQorCQlOVl9FUlJPUihkZXYsICJQTUMgLSB1bmhhbmRsZWQgSU5UUiAweCUwOHhcbiIsIHN0YXQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KKworaW50Citub3V2ZWF1X2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKG5vdXZlYXVfbXNpICE9IDAgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQlyZXQgPSBwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOworCQlpZiAocmV0ID09IDApIHsKKwkJCU5WX0lORk8oZGV2LCAiZW5hYmxlZCBNU0lcbiIpOworCQkJZGV2X3ByaXYtPm1zaV9lbmFibGVkID0gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBkcm1faXJxX2luc3RhbGwoZGV2KTsKK30KKwordm9pZAorbm91dmVhdV9pcnFfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCWlmIChkZXZfcHJpdi0+bXNpX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOworfQorCit2b2lkCitub3V2ZWF1X2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzX2JpdCwKKwkJICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGRybV9kZXZpY2UgKikpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJZGV2X3ByaXYtPmlycV9oYW5kbGVyW3N0YXR1c19iaXRdID0gaGFuZGxlcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworfQorCit2b2lkCitub3V2ZWF1X2lycV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBzdGF0dXNfYml0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCWRldl9wcml2LT5pcnFfaGFuZGxlcltzdGF0dXNfYml0XSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCmluZGV4IGZlNGEzMGQuLjY5MDQ0ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpAQCAtMzYsMTgzICszNiwxMTIgQEAKIAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9wbS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKIC8qCiAgKiBOVjEwLU5WNDAgdGlsaW5nIGhlbHBlcnMKICAqLwogCiBzdGF0aWMgdm9pZAotbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBwaXRjaCkKK252MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLCB1aW50MzJfdCBhZGRyLAorCQkJICAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CiAJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICpwZmIgPSAmZGV2X3ByaXYtPmVuZ2luZS5mYjsKIAlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZVtpXTsKKwlpbnQgaSA9IHRpbGUgLSBkZXZfcHJpdi0+dGlsZS5yZWc7CisJdW5zaWduZWQgbG9uZyBzYXZlOwogCi0JdGlsZS0+YWRkciA9IGFkZHI7Ci0JdGlsZS0+c2l6ZSA9IHNpemU7Ci0JdGlsZS0+dXNlZCA9ICEhcGl0Y2g7Ci0Jbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKikmdGlsZS0+ZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJnRpbGUtPmZlbmNlKTsKIAorCWlmICh0aWxlLT5waXRjaCkKKwkJcGZiLT5mcmVlX3RpbGVfcmVnaW9uKGRldiwgaSk7CisKKwlpZiAocGl0Y2gpCisJCXBmYi0+aW5pdF90aWxlX3JlZ2lvbihkZXYsIGksIGFkZHIsIHNpemUsIHBpdGNoLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIHNhdmUpOwogCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKIAlwZmlmby0+Y2FjaGVfcHVsbChkZXYsIGZhbHNlKTsKIAogCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOwogCi0JcGdyYXBoLT5zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIGFkZHIsIHNpemUsIHBpdGNoKTsKLQlwZmItPnNldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgYWRkciwgc2l6ZSwgcGl0Y2gpOworCXBmYi0+c2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CisJcGdyYXBoLT5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAogCXBmaWZvLT5jYWNoZV9wdWxsKGRldiwgdHJ1ZSk7CiAJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIHNhdmUpOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKgorbnYxMF9tZW1fZ2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCisJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKKworCWlmICghdGlsZS0+dXNlZCAmJgorCSAgICAoIXRpbGUtPmZlbmNlIHx8IG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHRpbGUtPmZlbmNlKSkpCisJCXRpbGUtPnVzZWQgPSB0cnVlOworCWVsc2UKKwkJdGlsZSA9IE5VTEw7CisKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisJcmV0dXJuIHRpbGU7Cit9CisKK3ZvaWQKK252MTBfbWVtX3B1dF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSwKKwkJCSBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICh0aWxlKSB7CisJCXNwaW5fbG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisJCWlmIChmZW5jZSkgeworCQkJLyogTWFyayBpdCBhcyBwZW5kaW5nLiAqLworCQkJdGlsZS0+ZmVuY2UgPSBmZW5jZTsKKwkJCW5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKKwkJfQorCisJCXRpbGUtPnVzZWQgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJmRldl9wcml2LT50aWxlLmxvY2spOworCX0KIH0KIAogc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKgogbnYxMF9tZW1fc2V0X3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAotCQkgICAgdWludDMyX3QgcGl0Y2gpCisJCSAgICB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgZmxhZ3MpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOwotCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICpmb3VuZCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspIHsKLQkJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGVbaV07Ci0KLQkJaWYgKHRpbGUtPnVzZWQpCi0JCQkvKiBUaWxlIHJlZ2lvbiBpbiB1c2UuICovCi0JCQljb250aW51ZTsKLQotCQlpZiAodGlsZS0+ZmVuY2UgJiYKLQkJICAgICFub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh0aWxlLT5mZW5jZSwgTlVMTCkpCi0JCQkvKiBQZW5kaW5nIHRpbGUgcmVnaW9uLiAqLwotCQkJY29udGludWU7Ci0KLQkJaWYgKG1heCh0aWxlLT5hZGRyLCBhZGRyKSA8Ci0JCSAgICBtaW4odGlsZS0+YWRkciArIHRpbGUtPnNpemUsIGFkZHIgKyBzaXplKSkKLQkJCS8qIEtpbGwgYW4gaW50ZXJzZWN0aW5nIHRpbGUgcmVnaW9uLiAqLwotCQkJbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKLQotCQlpZiAocGl0Y2ggJiYgIWZvdW5kKSB7Ci0JCQkvKiBGcmVlIHRpbGUgcmVnaW9uLiAqLwotCQkJbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCBhZGRyLCBzaXplLCBwaXRjaCk7Ci0JCQlmb3VuZCA9IHRpbGU7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGZvdW5kOwotfQotCi12b2lkCi1udjEwX21lbV9leHBpcmVfdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAotCQkgICAgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQotewotCWlmIChmZW5jZSkgewotCQkvKiBNYXJrIGl0IGFzIHBlbmRpbmcuICovCi0JCXRpbGUtPmZlbmNlID0gZmVuY2U7Ci0JCW5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKLQl9Ci0KLQl0aWxlLT51c2VkID0gZmFsc2U7Ci19Ci0KLS8qCi0gKiBOVjUwIFZNIGhlbHBlcnMKLSAqLwotaW50Ci1udjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplLAotCQkJdWludDMyX3QgZmxhZ3MsIHVpbnQ2NF90IHBoeXMpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndDsKLQl1bnNpZ25lZCBibG9jazsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSwgKmZvdW5kID0gTlVMTDsKIAlpbnQgaTsKIAotCXZpcnQgPSAoKHZpcnQgLSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlKSA+PiAxNikgPDwgMTsKLQlzaXplID0gKHNpemUgPj4gMTYpIDw8IDE7CisJZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspIHsKKwkJdGlsZSA9IG52MTBfbWVtX2dldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCi0JcGh5cyB8PSAoKHVpbnQ2NF90KWZsYWdzIDw8IDMyKTsKLQlwaHlzIHw9IDE7Ci0JaWYgKGRldl9wcml2LT52cmFtX3N5c19iYXNlKSB7Ci0JCXBoeXMgKz0gZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2U7Ci0JCXBoeXMgfD0gMHgzMDsKKwkJaWYgKHBpdGNoICYmICFmb3VuZCkgeworCQkJZm91bmQgPSB0aWxlOworCQkJY29udGludWU7CisKKwkJfSBlbHNlIGlmICh0aWxlICYmIHRpbGUtPnBpdGNoKSB7CisJCQkvKiBLaWxsIGFuIHVudXNlZCB0aWxlIHJlZ2lvbi4gKi8KKwkJCW52MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihkZXYsIHRpbGUsIDAsIDAsIDAsIDApOworCQl9CisKKwkJbnYxMF9tZW1fcHV0X3RpbGVfcmVnaW9uKGRldiwgdGlsZSwgTlVMTCk7CiAJfQogCi0Jd2hpbGUgKHNpemUpIHsKLQkJdW5zaWduZWQgb2Zmc2V0X2ggPSB1cHBlcl8zMl9iaXRzKHBoeXMpOwotCQl1bnNpZ25lZCBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMocGh5cyk7Ci0JCXVuc2lnbmVkIHB0ZSwgZW5kOwotCi0JCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7Ci0JCQlibG9jayA9IDEgPDwgKGkgKyAxKTsKLQkJCWlmIChzaXplID49IGJsb2NrICYmICEodmlydCAmIChibG9jayAtIDEpKSkKLQkJCQlicmVhazsKLQkJfQotCQlvZmZzZXRfbCB8PSAoaSA8PCA3KTsKLQotCQlwaHlzICs9IGJsb2NrIDw8IDE1OwotCQlzaXplIC09IGJsb2NrOwotCi0JCXdoaWxlIChibG9jaykgewotCQkJcGd0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fcHRbdmlydCA+PiAxNF07Ci0JCQlwdGUgPSB2aXJ0ICYgMHgzZmZlOwotCi0JCQllbmQgPSBwdGUgKyBibG9jazsKLQkJCWlmIChlbmQgPiAxNjM4NCkKLQkJCQllbmQgPSAxNjM4NDsKLQkJCWJsb2NrIC09IChlbmQgLSBwdGUpOwotCQkJdmlydCAgKz0gKGVuZCAtIHB0ZSk7Ci0KLQkJCXdoaWxlIChwdGUgPCBlbmQpIHsKLQkJCQludl93bzMyKHBndCwgKHB0ZSAqIDQpICsgMCwgb2Zmc2V0X2wpOwotCQkJCW52X3dvMzIocGd0LCAocHRlICogNCkgKyA0LCBvZmZzZXRfaCk7Ci0JCQkJcHRlICs9IDI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQlkZXZfcHJpdi0+ZW5naW5lLmZpZm8udGxiX2ZsdXNoKGRldik7Ci0JZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC50bGJfZmx1c2goZGV2KTsKLQludjUwX3ZtX2ZsdXNoKGRldiwgNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW52NTBfbWVtX3ZtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3Q7Ci0JdW5zaWduZWQgcGFnZXMsIHB0ZSwgZW5kOwotCi0JdmlydCAtPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOwotCXBhZ2VzID0gKHNpemUgPj4gMTYpIDw8IDE7Ci0KLQl3aGlsZSAocGFnZXMpIHsKLQkJcGd0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fcHRbdmlydCA+PiAyOV07Ci0JCXB0ZSA9ICh2aXJ0ICYgMHgxZmZlMDAwMFVMTCkgPj4gMTU7Ci0KLQkJZW5kID0gcHRlICsgcGFnZXM7Ci0JCWlmIChlbmQgPiAxNjM4NCkKLQkJCWVuZCA9IDE2Mzg0OwotCQlwYWdlcyAtPSAoZW5kIC0gcHRlKTsKLQkJdmlydCAgKz0gKGVuZCAtIHB0ZSkgPDwgMTU7Ci0KLQkJd2hpbGUgKHB0ZSA8IGVuZCkgewotCQkJbnZfd28zMihwZ3QsIChwdGUgKiA0KSwgMCk7Ci0JCQlwdGUrKzsKLQkJfQotCX0KLQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCWRldl9wcml2LT5lbmdpbmUuZmlmby50bGJfZmx1c2goZGV2KTsKLQlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnRsYl9mbHVzaChkZXYpOwotCW52NTBfdm1fZmx1c2goZGV2LCA2KTsKKwlpZiAoZm91bmQpCisJCW52MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihkZXYsIGZvdW5kLCBhZGRyLCBzaXplLAorCQkJCQkgICAgcGl0Y2gsIGZsYWdzKTsKKwlyZXR1cm4gZm91bmQ7CiB9CiAKIC8qCkBAIC0zMTIsNjIgKzI0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1udjUwX3ZyYW1fcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGksIHBhcnRzLCBjb2xiaXRzLCByb3diaXRzYSwgcm93Yml0c2IsIGJhbmtzOwotCXU2NCByb3dzaXplLCBwcmVkaWN0ZWQ7Ci0JdTMyIHIwLCByNCwgcnQsIHJ1OwotCi0JcjAgPSBudl9yZDMyKGRldiwgMHgxMDAyMDApOwotCXI0ID0gbnZfcmQzMihkZXYsIDB4MTAwMjA0KTsKLQlydCA9IG52X3JkMzIoZGV2LCAweDEwMDI1MCk7Ci0JcnUgPSBudl9yZDMyKGRldiwgMHgwMDE1NDApOwotCU5WX0RFQlVHKGRldiwgIm1lbWNmZyAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsIHIwLCByNCwgcnQsIHJ1KTsKLQotCWZvciAoaSA9IDAsIHBhcnRzID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAocnUgJiAoMHgwMDAxMDAwMCA8PCBpKSkKLQkJCXBhcnRzKys7Ci0JfQotCi0JY29sYml0cyAgPSAgKHI0ICYgMHgwMDAwZjAwMCkgPj4gMTI7Ci0Jcm93Yml0c2EgPSAoKHI0ICYgMHgwMDBmMDAwMCkgPj4gMTYpICsgODsKLQlyb3diaXRzYiA9ICgocjQgJiAweDAwZjAwMDAwKSA+PiAyMCkgKyA4OwotCWJhbmtzICAgID0gKChyNCAmIDB4MDEwMDAwMDApID8gOCA6IDQpOwotCi0Jcm93c2l6ZSA9IHBhcnRzICogYmFua3MgKiAoMSA8PCBjb2xiaXRzKSAqIDg7Ci0JcHJlZGljdGVkID0gcm93c2l6ZSA8PCByb3diaXRzYTsKLQlpZiAocjAgJiAweDAwMDAwMDA0KQotCQlwcmVkaWN0ZWQgKz0gcm93c2l6ZSA8PCByb3diaXRzYjsKLQotCWlmIChwcmVkaWN0ZWQgIT0gZGV2X3ByaXYtPnZyYW1fc2l6ZSkgewotCQlOVl9XQVJOKGRldiwgIm1lbW9yeSBjb250cm9sbGVyIHJlcG9ydHMgJWRNaUIgVlJBTVxuIiwKLQkJCSh1MzIpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKLQkJTlZfV0FSTihkZXYsICJ3ZSBjYWxjdWxhdGVkICVkTWlCIFZSQU1cbiIsCi0JCQkodTMyKShwcmVkaWN0ZWQgPj4gMjApKTsKLQl9Ci0KLQlkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA9IHJvd3NpemUgPj4gMTI7Ci0JaWYgKHJ0ICYgMSkKLQkJZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgKj0gMzsKLQotCU5WX0RFQlVHKGRldiwgInJibG9jayAlbGxkIGJ5dGVzXG4iLAotCQkgKHU2NClkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA8PCAxMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udmFhX3ZyYW1fcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkvKiBUbyBvdXIga25vd2xlZGdlLCB0aGVyZSdzIG5vIGxhcmdlIHNjYWxlIHJlb3JkZXJpbmcgb2YgcGFnZXMKLQkgKiB0aGF0IG9jY3VycyBvbiBJR1AgY2hpcHNldHMuCi0JICovCi0JZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgPSAxOwotfQotCi1zdGF0aWMgaW50CitpbnQKIG5vdXZlYXVfbWVtX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zODEsMzMgKzI1NSw2IEBACiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewogCQlkZXZfcHJpdi0+dnJhbV9zaXplICA9IG52X3JkMzIoZGV2LCBOVjA0X1BGQl9GSUZPX0RBVEEpOwogCQlkZXZfcHJpdi0+dnJhbV9zaXplICY9IE5WMTBfUEZCX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX01BU0s7Ci0JfSBlbHNlCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkgewotCQlkZXZfcHJpdi0+dnJhbV9zaXplID0gbnZfcmQzMihkZXYsIE5WMDRfUEZCX0ZJRk9fREFUQSk7Ci0JCWRldl9wcml2LT52cmFtX3NpemUgfD0gKGRldl9wcml2LT52cmFtX3NpemUgJiAweGZmKSA8PCAzMjsKLQkJZGV2X3ByaXYtPnZyYW1fc2l6ZSAmPSAweGZmZmZmZmZmMDBsbDsKLQotCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7Ci0JCWNhc2UgMHhhYToKLQkJY2FzZSAweGFjOgotCQljYXNlIDB4YWY6Ci0JCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA9IG52X3JkMzIoZGV2LCAweDEwMGUxMCk7Ci0JCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA8PD0gMTI7Ci0JCQludmFhX3ZyYW1fcHJlaW5pdChkZXYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQludjUwX3ZyYW1fcHJlaW5pdChkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfcHJpdi0+dnJhbV9zaXplICA9IG52X3JkMzIoZGV2LCAweDEwZjIwYykgPDwgMjA7Ci0JCWRldl9wcml2LT52cmFtX3NpemUgKj0gbnZfcmQzMihkZXYsIDB4MTIxYzc0KTsKLQl9Ci0KLQlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVkTWlCIFZSQU1cbiIsIChpbnQpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKLQlpZiAoZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKLQkJTlZfSU5GTyhkZXYsICJTdG9sZW4gc3lzdGVtIG1lbW9yeSBhdDogMHglMDEwbGx4XG4iLAotCQkJZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpOwogCX0KIAogCWlmIChkZXZfcHJpdi0+dnJhbV9zaXplKQpAQCAtNDE1LDYgKzI2MiwxNSBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCitib29sCitub3V2ZWF1X21lbV9mbGFnc192YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgdGlsZV9mbGFncykKK3sKKwlpZiAoISh0aWxlX2ZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9MQVlPVVRfTUFTSykpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAjaWYgX19PU19IQVNfQUdQCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogZ2V0X2FncF9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgbW9kZSkKQEAgLTU0NywxMCArNDAzLDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbm91dmVhdV9tZW1fZGV0ZWN0KGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWRldl9wcml2LT5mYl9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CiAKIAlyZXQgPSBub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChkZXZfcHJpdik7CkBAIC01NjYsMTMgKzQxOCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKLQlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPSBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemU7Ci0JaWYgKGRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA+IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSkKLQkJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0KLQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKLQlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPj49IFBBR0VfU0hJRlQ7Ci0KIAkvKiByZXNlcnZlIHNwYWNlIGF0IGVuZCBvZiBWUkFNIGZvciBQUkFNSU4gKi8KIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0MCB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQ3IHx8CiAJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4NDkgfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0YikKQEAgLTU4Myw2ICs0MjgsMjIgQEAKIAllbHNlCiAJCWRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gPSAoNTEyICogMTAyNCk7CiAKKwlyZXQgPSBkZXZfcHJpdi0+ZW5naW5lLnZyYW0uaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVkTWlCIFZSQU1cbiIsIChpbnQpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKKwlpZiAoZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKKwkJTlZfSU5GTyhkZXYsICJTdG9sZW4gc3lzdGVtIG1lbW9yeSBhdDogMHglMDEwbGx4XG4iLAorCQkJZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpOworCX0KKworCWRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSA9IGRldl9wcml2LT52cmFtX3NpemU7CisJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOworCWlmIChkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpCisJCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKKwlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPj49IFBBR0VfU0hJRlQ7CisKIAlkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLT0gZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsKIAlkZXZfcHJpdi0+ZmJfYXBlcl9mcmVlID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOwogCkBAIC03OTksMyArNjYwLDExOCBAQAogCiAJa2ZyZWUobWVtLT50aW1pbmcpOwogfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3ZyYW1fbWFuYWdlcl9pbml0KHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLCB1bnNpZ25lZCBsb25nIHBfc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW07CisJdTMyIGJfc2l6ZTsKKwlpbnQgcmV0OworCisJcF9zaXplID0gKHBfc2l6ZSA8PCBQQUdFX1NISUZUKSA+PiAxMjsKKwliX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA+PiAxMjsKKworCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmbW0sIDAsIHBfc2l6ZSwgYl9zaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFuLT5wcml2ID0gbW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2Zpbmkoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gbWFuLT5wcml2OworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X21tX2ZpbmkoJm1tKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFuLT5wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlbChzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiwKKwkJCSBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisKKwl2cmFtLT5wdXQoZGV2LCAoc3RydWN0IG5vdXZlYXVfdnJhbSAqKikmbWVtLT5tbV9ub2RlKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV92cmFtX21hbmFnZXJfbmV3KHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLAorCQkJIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkgc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCSBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICpub2RlOworCXUzMiBzaXplX25jID0gMDsKKwlpbnQgcmV0OworCisJaWYgKG52Ym8tPnRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX05PTkNPTlRJRykKKwkJc2l6ZV9uYyA9IDEgPDwgbnZiby0+dm1hLm5vZGUtPnR5cGU7CisKKwlyZXQgPSB2cmFtLT5nZXQoZGV2LCBtZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZULAorCQkJbWVtLT5wYWdlX2FsaWdubWVudCA8PCBQQUdFX1NISUZULCBzaXplX25jLAorCQkJKG52Ym8tPnRpbGVfZmxhZ3MgPj4gOCkgJiAweGZmLCAmbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW5vZGUtPnBhZ2Vfc2hpZnQgPSAxMjsKKwlpZiAobnZiby0+dm1hLm5vZGUpCisJCW5vZGUtPnBhZ2Vfc2hpZnQgPSBudmJvLT52bWEubm9kZS0+dHlwZTsKKworCW1lbS0+bW1fbm9kZSA9IG5vZGU7CisJbWVtLT5zdGFydCAgID0gbm9kZS0+b2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlYnVnKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gbWFuLT5wcml2OworCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnI7CisJdTY0IHRvdGFsID0gMCwgdHRvdGFsWzNdID0ge30sIHR1c2VkWzNdID0ge30sIHRmcmVlWzNdID0ge307CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZtbS0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJm1tLT5ub2RlcywgbmxfZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzICVzLSVkOiAweCUwMTBsbHggMHglMDEwbGx4XG4iLAorCQkgICAgICAgcHJlZml4LCByLT5mcmVlID8gImZyZWUiIDogInVzZWQiLCByLT50eXBlLAorCQkgICAgICAgKCh1NjQpci0+b2Zmc2V0IDw8IDEyKSwKKwkJICAgICAgICgoKHU2NClyLT5vZmZzZXQgKyByLT5sZW5ndGgpIDw8IDEyKSk7CisJCXRvdGFsICs9IHItPmxlbmd0aDsKKwkJdHRvdGFsW3ItPnR5cGVdICs9IHItPmxlbmd0aDsKKwkJaWYgKHItPmZyZWUpCisJCQl0ZnJlZVtyLT50eXBlXSArPSByLT5sZW5ndGg7CisJCWVsc2UKKwkJCXR1c2VkW3ItPnR5cGVdICs9IHItPmxlbmd0aDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtbS0+bXV0ZXgpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzICB0b3RhbDogMHglMDEwbGx4XG4iLCBwcmVmaXgsIHRvdGFsIDw8IDEyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyB0eXBlICVkOiAweCUwMTBsbHgsICIKKwkJCQkgICJ1c2VkIDB4JTAxMGxseCwgZnJlZSAweCUwMTBsbHhcbiIsIHByZWZpeCwKKwkJICAgICAgIGksIHR0b3RhbFtpXSA8PCAxMiwgdHVzZWRbaV0gPDwgMTIsIHRmcmVlW2ldIDw8IDEyKTsKKwl9Cit9CisKK2NvbnN0IHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcl9mdW5jIG5vdXZlYXVfdnJhbV9tYW5hZ2VyID0geworCW5vdXZlYXVfdnJhbV9tYW5hZ2VyX2luaXQsCisJbm91dmVhdV92cmFtX21hbmFnZXJfZmluaSwKKwlub3V2ZWF1X3ZyYW1fbWFuYWdlcl9uZXcsCisJbm91dmVhdV92cmFtX21hbmFnZXJfZGVsLAorCW5vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlYnVnCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYmIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKworc3RhdGljIGlubGluZSB2b2lkCityZWdpb25fcHV0KHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmEpCit7CisJbGlzdF9kZWwoJmEtPm5sX2VudHJ5KTsKKwlsaXN0X2RlbCgmYS0+ZmxfZW50cnkpOworCWtmcmVlKGEpOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqCityZWdpb25fc3BsaXQoc3RydWN0IG5vdXZlYXVfbW0gKnJtbSwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYSwgdTMyIHNpemUpCit7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYjsKKworCWlmIChhLT5sZW5ndGggPT0gc2l6ZSkKKwkJcmV0dXJuIGE7CisKKwliID0ga21hbGxvYyhzaXplb2YoKmIpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoYiA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwliLT5vZmZzZXQgPSBhLT5vZmZzZXQ7CisJYi0+bGVuZ3RoID0gc2l6ZTsKKwliLT5mcmVlICAgPSBhLT5mcmVlOworCWItPnR5cGUgICA9IGEtPnR5cGU7CisJYS0+b2Zmc2V0ICs9IHNpemU7CisJYS0+bGVuZ3RoIC09IHNpemU7CisJbGlzdF9hZGRfdGFpbCgmYi0+bmxfZW50cnksICZhLT5ubF9lbnRyeSk7CisJaWYgKGItPmZyZWUpCisJCWxpc3RfYWRkX3RhaWwoJmItPmZsX2VudHJ5LCAmYS0+ZmxfZW50cnkpOworCXJldHVybiBiOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqCitub3V2ZWF1X21tX21lcmdlKHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXMpCit7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcHJldiwgKm5leHQ7CisKKwkvKiB0cnkgdG8gbWVyZ2Ugd2l0aCBmcmVlIGFkamFjZW50IGVudHJpZXMgb2Ygc2FtZSB0eXBlICovCisJcHJldiA9IGxpc3RfZW50cnkodGhpcy0+bmxfZW50cnkucHJldiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpOworCWlmICh0aGlzLT5ubF9lbnRyeS5wcmV2ICE9ICZybW0tPm5vZGVzKSB7CisJCWlmIChwcmV2LT5mcmVlICYmIHByZXYtPnR5cGUgPT0gdGhpcy0+dHlwZSkgeworCQkJcHJldi0+bGVuZ3RoICs9IHRoaXMtPmxlbmd0aDsKKwkJCXJlZ2lvbl9wdXQocm1tLCB0aGlzKTsKKwkJCXRoaXMgPSBwcmV2OworCQl9CisJfQorCisJbmV4dCA9IGxpc3RfZW50cnkodGhpcy0+bmxfZW50cnkubmV4dCwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpOworCWlmICh0aGlzLT5ubF9lbnRyeS5uZXh0ICE9ICZybW0tPm5vZGVzKSB7CisJCWlmIChuZXh0LT5mcmVlICYmIG5leHQtPnR5cGUgPT0gdGhpcy0+dHlwZSkgeworCQkJbmV4dC0+b2Zmc2V0ICA9IHRoaXMtPm9mZnNldDsKKwkJCW5leHQtPmxlbmd0aCArPSB0aGlzLT5sZW5ndGg7CisJCQlyZWdpb25fcHV0KHJtbSwgdGhpcyk7CisJCQl0aGlzID0gbmV4dDsKKwkJfQorCX0KKworCXJldHVybiB0aGlzOworfQorCit2b2lkCitub3V2ZWF1X21tX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzKQoreworCXUzMiBibG9ja19zLCBibG9ja19sOworCisJdGhpcy0+ZnJlZSA9IHRydWU7CisJbGlzdF9hZGQoJnRoaXMtPmZsX2VudHJ5LCAmcm1tLT5mcmVlKTsKKwl0aGlzID0gbm91dmVhdV9tbV9tZXJnZShybW0sIHRoaXMpOworCisJLyogYW55IGVudGlyZWx5IGZyZWUgYmxvY2tzIG5vdz8gIHdlJ2xsIHdhbnQgdG8gcmVtb3ZlIHR5cGluZworCSAqIG9uIHRoZW0gbm93IHNvIHRoZXkgY2FuIGJlIHVzZSBmb3IgYW55IG1lbW9yeSBhbGxvY2F0aW9uCisJICovCisJYmxvY2tfcyA9IHJvdW5kdXAodGhpcy0+b2Zmc2V0LCBybW0tPmJsb2NrX3NpemUpOworCWlmIChibG9ja19zICsgcm1tLT5ibG9ja19zaXplID4gdGhpcy0+b2Zmc2V0ICsgdGhpcy0+bGVuZ3RoKQorCQlyZXR1cm47CisKKwkvKiBzcGxpdCBvZmYgYW55IHN0aWxsLXR5cGVkIHJlZ2lvbiBhdCB0aGUgc3RhcnQgKi8KKwlpZiAoYmxvY2tfcyAhPSB0aGlzLT5vZmZzZXQpIHsKKwkJaWYgKCFyZWdpb25fc3BsaXQocm1tLCB0aGlzLCBibG9ja19zIC0gdGhpcy0+b2Zmc2V0KSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBzcGxpdCBvZmYgdGhlIHNvb24tdG8tYmUtdW50eXBlZCBibG9jayhzKSAqLworCWJsb2NrX2wgPSByb3VuZGRvd24odGhpcy0+bGVuZ3RoLCBybW0tPmJsb2NrX3NpemUpOworCWlmIChibG9ja19sICE9IHRoaXMtPmxlbmd0aCkgeworCQl0aGlzID0gcmVnaW9uX3NwbGl0KHJtbSwgdGhpcywgYmxvY2tfbCk7CisJCWlmICghdGhpcykKKwkJCXJldHVybjsKKwl9CisKKwkvKiBtYXJrIGFzIGhhdmluZyBubyB0eXBlLCBhbmQgcmV0cnkgbWVyZ2Ugd2l0aCBhbnkgYWRqYWNlbnQKKwkgKiB1bnR5cGVkIGJsb2NrcworCSAqLworCXRoaXMtPnR5cGUgPSAwOworCW5vdXZlYXVfbW1fbWVyZ2Uocm1tLCB0aGlzKTsKK30KKworaW50Citub3V2ZWF1X21tX2dldChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBpbnQgdHlwZSwgdTMyIHNpemUsIHUzMiBzaXplX25jLAorCSAgICAgICB1MzIgYWxpZ24sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKipwbm9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzLCAqdG1wLCAqbmV4dDsKKwl1MzIgc3BsaXRvZmYsIGF2YWlsLCBhbGxvYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzLCB0bXAsICZybW0tPmZyZWUsIGZsX2VudHJ5KSB7CisJCW5leHQgPSBsaXN0X2VudHJ5KHRoaXMtPm5sX2VudHJ5Lm5leHQsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KTsKKwkJaWYgKHRoaXMtPm5sX2VudHJ5Lm5leHQgPT0gJnJtbS0+bm9kZXMpCisJCQluZXh0ID0gTlVMTDsKKworCQkvKiBza2lwIHdyb25nbHkgdHlwZWQgYmxvY2tzICovCisJCWlmICh0aGlzLT50eXBlICYmIHRoaXMtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGFjY291bnQgZm9yIGFsaWdubWVudCAqLworCQlzcGxpdG9mZiA9IHRoaXMtPm9mZnNldCAmIChhbGlnbiAtIDEpOworCQlpZiAoc3BsaXRvZmYpCisJCQlzcGxpdG9mZiA9IGFsaWduIC0gc3BsaXRvZmY7CisKKwkJaWYgKHRoaXMtPmxlbmd0aCA8PSBzcGxpdG9mZikKKwkJCWNvbnRpbnVlOworCisJCS8qIGRldGVybWluZSB0b3RhbCBtZW1vcnkgYXZhaWxhYmxlIGZyb20gdGhpcywgYW5kCisJCSAqIHRoZSBuZXh0IGJsb2NrIChpZiBhcHByb3ByaWF0ZSkKKwkJICovCisJCWF2YWlsID0gdGhpcy0+bGVuZ3RoOworCQlpZiAobmV4dCAmJiBuZXh0LT5mcmVlICYmICghbmV4dC0+dHlwZSB8fCBuZXh0LT50eXBlID09IHR5cGUpKQorCQkJYXZhaWwgKz0gbmV4dC0+bGVuZ3RoOworCisJCWF2YWlsIC09IHNwbGl0b2ZmOworCisJCS8qIGRldGVybWluZSBhbGxvY2F0aW9uIHNpemUgKi8KKwkJaWYgKHNpemVfbmMpIHsKKwkJCWFsbG9jID0gbWluKGF2YWlsLCBzaXplKTsKKwkJCWFsbG9jID0gcm91bmRkb3duKGFsbG9jLCBzaXplX25jKTsKKwkJCWlmIChhbGxvYyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYWxsb2MgPSBzaXplOworCQkJaWYgKGF2YWlsIDwgYWxsb2MpCisJCQkJY29udGludWU7CisJCX0KKworCQkvKiB1bnR5cGVkIGJsb2NrLCBzcGxpdCBvZmYgYSBjaHVuayB0aGF0J3MgYSBtdWx0aXBsZQorCQkgKiBvZiBibG9ja19zaXplIGFuZCB0eXBlIGl0CisJCSAqLworCQlpZiAoIXRoaXMtPnR5cGUpIHsKKwkJCXUzMiBibG9jayA9IHJvdW5kdXAoYWxsb2MgKyBzcGxpdG9mZiwgcm1tLT5ibG9ja19zaXplKTsKKwkJCWlmICh0aGlzLT5sZW5ndGggPCBibG9jaykKKwkJCQljb250aW51ZTsKKworCQkJdGhpcyA9IHJlZ2lvbl9zcGxpdChybW0sIHRoaXMsIGJsb2NrKTsKKwkJCWlmICghdGhpcykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJdGhpcy0+dHlwZSA9IHR5cGU7CisJCX0KKworCQkvKiBzdGVhbGluZyBtZW1vcnkgZnJvbSBhZGphY2VudCBibG9jayAqLworCQlpZiAoYWxsb2MgPiB0aGlzLT5sZW5ndGgpIHsKKwkJCXUzMiBhbW91bnQgPSBhbGxvYyAtICh0aGlzLT5sZW5ndGggLSBzcGxpdG9mZik7CisKKwkJCWlmICghbmV4dC0+dHlwZSkgeworCQkJCWFtb3VudCA9IHJvdW5kdXAoYW1vdW50LCBybW0tPmJsb2NrX3NpemUpOworCisJCQkJbmV4dCA9IHJlZ2lvbl9zcGxpdChybW0sIG5leHQsIGFtb3VudCk7CisJCQkJaWYgKCFuZXh0KQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCW5leHQtPnR5cGUgPSB0eXBlOworCQkJfQorCisJCQl0aGlzLT5sZW5ndGggKz0gYW1vdW50OworCQkJbmV4dC0+b2Zmc2V0ICs9IGFtb3VudDsKKwkJCW5leHQtPmxlbmd0aCAtPSBhbW91bnQ7CisJCQlpZiAoIW5leHQtPmxlbmd0aCkgeworCQkJCWxpc3RfZGVsKCZuZXh0LT5ubF9lbnRyeSk7CisJCQkJbGlzdF9kZWwoJm5leHQtPmZsX2VudHJ5KTsKKwkJCQlrZnJlZShuZXh0KTsKKwkJCX0KKwkJfQorCisJCWlmIChzcGxpdG9mZikgeworCQkJaWYgKCFyZWdpb25fc3BsaXQocm1tLCB0aGlzLCBzcGxpdG9mZikpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl0aGlzID0gcmVnaW9uX3NwbGl0KHJtbSwgdGhpcywgYWxsb2MpOworCQlpZiAodGhpcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdGhpcy0+ZnJlZSA9IGZhbHNlOworCQlsaXN0X2RlbCgmdGhpcy0+ZmxfZW50cnkpOworCQkqcG5vZGUgPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50Citub3V2ZWF1X21tX2luaXQoc3RydWN0IG5vdXZlYXVfbW0gKipwcm1tLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKnJtbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpoZWFwOworCisJaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKCpoZWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwloZWFwLT5mcmVlID0gdHJ1ZTsKKwloZWFwLT5vZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgYmxvY2spOworCWhlYXAtPmxlbmd0aCA9IHJvdW5kZG93bihvZmZzZXQgKyBsZW5ndGgsIGJsb2NrKSAtIGhlYXAtPm9mZnNldDsKKworCXJtbSA9IGt6YWxsb2Moc2l6ZW9mKCpybW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJtbSkgeworCQlrZnJlZShoZWFwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJtbS0+YmxvY2tfc2l6ZSA9IGJsb2NrOworCW11dGV4X2luaXQoJnJtbS0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZybW0tPm5vZGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmcm1tLT5mcmVlKTsKKwlsaXN0X2FkZCgmaGVhcC0+bmxfZW50cnksICZybW0tPm5vZGVzKTsKKwlsaXN0X2FkZCgmaGVhcC0+ZmxfZW50cnksICZybW0tPmZyZWUpOworCisJKnBybW0gPSBybW07CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9tbV9maW5pKHN0cnVjdCBub3V2ZWF1X21tICoqcHJtbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tID0gKnBybW07CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqaGVhcCA9CisJCWxpc3RfZmlyc3RfZW50cnkoJnJtbS0+bm9kZXMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KTsKKworCWlmICghbGlzdF9pc19zaW5ndWxhcigmcm1tLT5ub2RlcykpCisJCXJldHVybiAtRUJVU1k7CisKKwlrZnJlZShoZWFwKTsKKwlrZnJlZShybW0pOworCSpwcm1tID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM4NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfUkVHSU9OX0hfXworI2RlZmluZSBfX05PVVZFQVVfUkVHSU9OX0hfXworCitzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5sX2VudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBybF9lbnRyeTsKKworCWJvb2wgZnJlZTsKKwlpbnQgIHR5cGU7CisKKwl1MzIgb2Zmc2V0OworCXUzMiBsZW5ndGg7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9tbSB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWU7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwl1MzIgYmxvY2tfc2l6ZTsKK307CisKK2ludCAgbm91dmVhdV9tbV9pbml0KHN0cnVjdCBub3V2ZWF1X21tICoqLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spOworaW50ICBub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKiopOworaW50ICBub3V2ZWF1X21tX3ByZShzdHJ1Y3Qgbm91dmVhdV9tbSAqKTsKK2ludCAgbm91dmVhdV9tbV9nZXQoc3RydWN0IG5vdXZlYXVfbW0gKiwgaW50IHR5cGUsIHUzMiBzaXplLCB1MzIgc2l6ZV9uYywKKwkJICAgIHUzMiBhbGlnbiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqKik7Cit2b2lkIG5vdXZlYXVfbW1fcHV0KHN0cnVjdCBub3V2ZWF1X21tICosIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKik7CisKK2ludCAgbnY1MF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitpbnQgIG52NTBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIHNpemVfbmMsCisJCSAgICB1MzIgbWVtdHlwZSwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKik7Cit2b2lkIG52NTBfdnJhbV9kZWwoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKik7Citib29sIG52NTBfdnJhbV9mbGFnc192YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgdGlsZV9mbGFncyk7CisKK2ludCAgbnZjMF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitpbnQgIG52YzBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIG5jbWluLAorCQkgICAgdTMyIG1lbXR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworYm9vbCBudmMwX3ZyYW1fZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdTMyIHRpbGVfZmxhZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYwppbmRleCAyY2M1OWY4Li5mZTI5ZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ub3RpZmllci5jCkBAIC05OSw3ICs5OSw2IEBACiAJCSAgICAgICBpbnQgc2l6ZSwgdWludDMyX3QgKmJfb2Zmc2V0KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm5vYmogPSBOVUxMOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqbWVtOwogCXVpbnQzMl90IG9mZnNldDsKQEAgLTExMywzMSArMTEyLDE1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW9mZnNldCA9IGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVDsKLQlpZiAoY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkgewotCQl0YXJnZXQgPSBOVl9ETUFfVEFSR0VUX1ZJRE1FTTsKLQl9IGVsc2UKLQlpZiAoY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpIHsKLQkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfU0dETUEgJiYKLQkJICAgIGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJcmV0ID0gbm91dmVhdV9zZ2RtYV9nZXRfcGFnZShkZXYsIG9mZnNldCwgJm9mZnNldCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQl0YXJnZXQgPSBOVl9ETUFfVEFSR0VUX1BDSTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldCA9IE5WX0RNQV9UQVJHRVRfQUdQOwotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQkJb2Zmc2V0ICs9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7Ci0JCX0KLQl9IGVsc2UgewotCQlOVl9FUlJPUihkZXYsICJCYWQgRE1BIHRhcmdldCwgbWVtX3R5cGUgJWQhXG4iLAotCQkJIGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfVlJBTTsKKwllbHNlCisJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfR0FSVDsKKwlvZmZzZXQgID0gY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCW9mZnNldCArPSBtZW0tPnN0YXJ0OwogCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLCBvZmZzZXQsCi0JCQkJICAgICBtZW0tPnNpemUsIE5WX0RNQV9BQ0NFU1NfUlcsIHRhcmdldCwKKwkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfTUVNX0FDQ0VTU19SVywgdGFyZ2V0LAogCQkJCSAgICAgJm5vYmopOwogCWlmIChyZXQpIHsKIAkJZHJtX21tX3B1dF9ibG9jayhtZW0pOwpAQCAtMTgxLDE1ICsxNjQsMjAgQEAKIG5vdXZlYXVfaW9jdGxfbm90aWZpZXJfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgKm5hID0gZGF0YTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCWludCByZXQ7CiAKLQlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4obmEtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisJLyogY29tcGxldGVseSB1bm5lY2Vzc2FyeSBmb3IgdGhlc2UgY2hpcHNldHMuLi4gKi8KKwlpZiAodW5saWtlbHkoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXQoZGV2LCBmaWxlX3ByaXYsIG5hLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAogCXJldCA9IG5vdXZlYXVfbm90aWZpZXJfYWxsb2MoY2hhbiwgbmEtPmhhbmRsZSwgbmEtPnNpemUsICZuYS0+b2Zmc2V0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCmluZGV4IGRkNTcyYWQuLjMwYjY1NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpAQCAtMzUsNiArMzUsMTAyIEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCisKK3N0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl1MzIgbXRoZDsKKwlpbnQgKCpleGVjKShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgbWV0aG9kczsKKwl1MzIgaWQ7CisJdTMyIGVuZ2luZTsKK307CisKK2ludAorbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjbGFzcywgdTMyIGVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlvYyA9IGt6YWxsb2Moc2l6ZW9mKCpvYyksIEdGUF9LRVJORUwpOworCWlmICghb2MpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJm9jLT5tZXRob2RzKTsKKwlvYy0+aWQgPSBjbGFzczsKKwlvYy0+ZW5naW5lID0gZW5naW5lOworCWxpc3RfYWRkKCZvYy0+aGVhZCwgJmRldl9wcml2LT5jbGFzc2VzKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9tdGhkX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgY2xhc3MsIHUzMiBtdGhkLAorCQkJaW50ICgqZXhlYykoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCB1MzIsIHUzMiwgdTMyKSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgKm9tOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9jLCAmZGV2X3ByaXYtPmNsYXNzZXMsIGhlYWQpIHsKKwkJaWYgKG9jLT5pZCA9PSBjbGFzcykKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCW9tID0ga3phbGxvYyhzaXplb2YoKm9tKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbS0+bXRoZCA9IG10aGQ7CisJb20tPmV4ZWMgPSBleGVjOworCWxpc3RfYWRkKCZvbS0+aGVhZCwgJm9jLT5tZXRob2RzKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgKm9tOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9jLCAmZGV2X3ByaXYtPmNsYXNzZXMsIGhlYWQpIHsKKwkJaWYgKG9jLT5pZCAhPSBjbGFzcykKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkob20sICZvYy0+bWV0aG9kcywgaGVhZCkgeworCQkJaWYgKG9tLT5tdGhkID09IG10aGQpCisJCQkJcmV0dXJuIG9tLT5leGVjKGNoYW4sIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJfQorCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoaWQsCisJCQkgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWlmIChjaGlkID4gMCAmJiBjaGlkIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKKwlpZiAoY2hhbikKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsKGNoYW4sIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CiAKIC8qIE5WaWRpYSB1c2VzIGNvbnRleHQgb2JqZWN0cyB0byBkcml2ZSBkcmF3aW5nIG9wZXJhdGlvbnMuCiAKQEAgLTczLDE3ICsxNjksMTQgQEAKIAkJICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqX3JldCkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqcmFtaW4gPSBOVUxMOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCU5WX0RFQlVHKGRldiwgImNoJWQgc2l6ZT0ldSBhbGlnbj0lZCBmbGFncz0weCUwOHhcbiIsCiAJCSBjaGFuID8gY2hhbi0+aWQgOiAtMSwgc2l6ZSwgYWxpZ24sIGZsYWdzKTsKIAotCWlmICghZGV2X3ByaXYgfHwgIWdwdW9ial9yZXQgfHwgKmdwdW9ial9yZXQgIT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlncHVvYmogPSBremFsbG9jKHNpemVvZigqZ3B1b2JqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFncHVvYmopCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTgsODggKzE5MSw0MSBAQAogCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7CiAKIAlpZiAoY2hhbikgewotCQlOVl9ERUJVRyhkZXYsICJjaGFubmVsIGhlYXBcbiIpOwotCiAJCXJhbWluID0gZHJtX21tX3NlYXJjaF9mcmVlKCZjaGFuLT5yYW1pbl9oZWFwLCBzaXplLCBhbGlnbiwgMCk7CiAJCWlmIChyYW1pbikKIAkJCXJhbWluID0gZHJtX21tX2dldF9ibG9jayhyYW1pbiwgc2l6ZSwgYWxpZ24pOwotCiAJCWlmICghcmFtaW4pIHsKIAkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JfSBlbHNlIHsKLQkJTlZfREVCVUcoZGV2LCAiZ2xvYmFsIGhlYXBcbiIpOwogCi0JCS8qIGFsbG9jYXRlIGJhY2tpbmcgcGFnZXMsIHNldHMgdmluc3QgKi8KLQkJcmV0ID0gZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlKGRldiwgZ3B1b2JqLCAmc2l6ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiB0cnkgYW5kIGdldCBhcGVydHVyZSBzcGFjZSAqLwotCQlkbyB7Ci0JCQlpZiAoZHJtX21tX3ByZV9nZXQoJmRldl9wcml2LT5yYW1pbl9oZWFwKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7Ci0JCQlyYW1pbiA9IGRybV9tbV9zZWFyY2hfZnJlZSgmZGV2X3ByaXYtPnJhbWluX2hlYXAsIHNpemUsCi0JCQkJCQkgICBhbGlnbiwgMCk7Ci0JCQlpZiAocmFtaW4gPT0gTlVMTCkgewotCQkJCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7Ci0JCQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncHVvYmopOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCi0JCQlyYW1pbiA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljKHJhbWluLCBzaXplLCBhbGlnbik7Ci0JCQlzcGluX3VubG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOwotCQl9IHdoaWxlIChyYW1pbiA9PSBOVUxMKTsKLQotCQkvKiBvbiBudjUwIGl0J3Mgb2sgdG8gZmFpbCwgd2UgaGF2ZSBhIGZhbGxiYWNrIHBhdGggKi8KLQkJaWYgKCFyYW1pbiAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JLyogaWYgd2UgZ290IGEgY2h1bmsgb2YgdGhlIGFwZXJ0dXJlLCBtYXAgcGFnZXMgaW50byBpdCAqLwotCWdwdW9iai0+aW1fcHJhbWluID0gcmFtaW47Ci0JaWYgKCFjaGFuICYmIGdwdW9iai0+aW1fcHJhbWluICYmIGRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUpIHsKLQkJcmV0ID0gZW5naW5lLT5pbnN0bWVtLmJpbmQoZGV2LCBncHVvYmopOwotCQlpZiAocmV0KSB7Ci0JCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdwdW9iaik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JLyogY2FsY3VsYXRlIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBhZGRyZXNzZXMgZm9yIHRoZSBvYmplY3QgKi8KLQlpZiAoY2hhbikgewogCQlncHVvYmotPnBpbnN0ID0gY2hhbi0+cmFtaW4tPnBpbnN0OwogCQlpZiAoZ3B1b2JqLT5waW5zdCAhPSB+MCkKLQkJCWdwdW9iai0+cGluc3QgKz0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OworCQkJZ3B1b2JqLT5waW5zdCArPSByYW1pbi0+c3RhcnQ7CiAKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJZ3B1b2JqLT5jaW5zdCA9IGdwdW9iai0+cGluc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlncHVvYmotPmNpbnN0ID0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OwotCQkJZ3B1b2JqLT52aW5zdCA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCArCi0JCQkJCWNoYW4tPnJhbWluLT52aW5zdDsKLQkJfQorCQlncHVvYmotPmNpbnN0ID0gcmFtaW4tPnN0YXJ0OworCQlncHVvYmotPnZpbnN0ID0gcmFtaW4tPnN0YXJ0ICsgY2hhbi0+cmFtaW4tPnZpbnN0OworCQlncHVvYmotPm5vZGUgID0gcmFtaW47CiAJfSBlbHNlIHsKLQkJaWYgKGdwdW9iai0+aW1fcHJhbWluKQotCQkJZ3B1b2JqLT5waW5zdCA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydDsKLQkJZWxzZQorCQlyZXQgPSBpbnN0bWVtLT5nZXQoZ3B1b2JqLCBzaXplLCBhbGlnbik7CisJCWlmIChyZXQpIHsKKwkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSAtRU5PU1lTOworCQlpZiAoIShmbGFncyAmIE5WT0JKX0ZMQUdfRE9OVF9NQVApKQorCQkJcmV0ID0gaW5zdG1lbS0+bWFwKGdwdW9iaik7CisJCWlmIChyZXQpCiAJCQlncHVvYmotPnBpbnN0ID0gfjA7Ci0JCWdwdW9iai0+Y2luc3QgPSAweGRlYWRiZWVmOworCisJCWdwdW9iai0+Y2luc3QgPSBOVk9CSl9DSU5TVF9HTE9CQUw7CiAJfQogCiAJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fQUxMT0MpIHsKLQkJaW50IGk7Ci0KIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+c2l6ZTsgaSArPSA0KQogCQkJbnZfd28zMihncHVvYmosIGksIDApOwotCQllbmdpbmUtPmluc3RtZW0uZmx1c2goZGV2KTsKKwkJaW5zdG1lbS0+Zmx1c2goZGV2KTsKIAl9CiAKIApAQCAtMTk1LDYgKzI0MSw3IEBACiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+Y2xhc3Nlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKIAlkZXZfcHJpdi0+cmFtaW5fYmFzZSA9IH4wOwogCkBAIC0yMDUsOSArMjUyLDIwIEBACiBub3V2ZWF1X2dwdW9ial90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX21ldGhvZCAqb20sICp0bTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfY2xhc3MgKm9jLCAqdGM7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9jLCB0YywgJmRldl9wcml2LT5jbGFzc2VzLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvbSwgdG0sICZvYy0+bWV0aG9kcywgaGVhZCkgeworCQkJbGlzdF9kZWwoJm9tLT5oZWFkKTsKKwkJCWtmcmVlKG9tKTsKKwkJfQorCQlsaXN0X2RlbCgmb2MtPmhlYWQpOworCQlrZnJlZShvYyk7CisJfQorCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpKTsKIH0KIApAQCAtMjE5LDI2ICsyNzcsMzQgQEAKIAkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqLCByZWZjb3VudCk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGdwdW9iai0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CiAJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJncHVvYmogJXBcbiIsIGdwdW9iaik7CiAKLQlpZiAoZ3B1b2JqLT5pbV9wcmFtaW4gJiYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fRlJFRSkpIHsKKwlpZiAoZ3B1b2JqLT5ub2RlICYmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19aRVJPX0ZSRUUpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPnNpemU7IGkgKz0gNCkKIAkJCW52X3dvMzIoZ3B1b2JqLCBpLCAwKTsKLQkJZW5naW5lLT5pbnN0bWVtLmZsdXNoKGRldik7CisJCWluc3RtZW0tPmZsdXNoKGRldik7CiAJfQogCiAJaWYgKGdwdW9iai0+ZHRvcikKIAkJZ3B1b2JqLT5kdG9yKGRldiwgZ3B1b2JqKTsKIAotCWlmIChncHVvYmotPmltX2JhY2tpbmcpCi0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcihkZXYsIGdwdW9iaik7CisJaWYgKGdwdW9iai0+Y2luc3QgPT0gTlZPQkpfQ0lOU1RfR0xPQkFMKSB7CisJCWlmIChncHVvYmotPm5vZGUpIHsKKwkJCWluc3RtZW0tPnVubWFwKGdwdW9iaik7CisJCQlpbnN0bWVtLT5wdXQoZ3B1b2JqKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChncHVvYmotPm5vZGUpIHsKKwkJCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworCQkJZHJtX21tX3B1dF9ibG9jayhncHVvYmotPm5vZGUpOworCQkJc3Bpbl91bmxvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKKwkJfQorCX0KIAogCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOwotCWlmIChncHVvYmotPmltX3ByYW1pbikKLQkJZHJtX21tX3B1dF9ibG9jayhncHVvYmotPmltX3ByYW1pbik7CiAJbGlzdF9kZWwoJmdwdW9iai0+bGlzdCk7CiAJc3Bpbl91bmxvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKIApAQCAtMjc4LDcgKzM0NCw3IEBACiAJa3JlZl9pbml0KCZncHVvYmotPnJlZmNvdW50KTsKIAlncHVvYmotPnNpemUgID0gc2l6ZTsKIAlncHVvYmotPnBpbnN0ID0gcGluc3Q7Ci0JZ3B1b2JqLT5jaW5zdCA9IDB4ZGVhZGJlZWY7CisJZ3B1b2JqLT5jaW5zdCA9IE5WT0JKX0NJTlNUX0dMT0JBTDsKIAlncHVvYmotPnZpbnN0ID0gdmluc3Q7CiAKIAlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfWkVST19BTExPQykgewpAQCAtMzM1LDExNSArNDAxLDE1MiBAQAogICAgVGhlIG1ldGhvZCBiZWxvdyBjcmVhdGVzIGEgRE1BIG9iamVjdCBpbiBpbnN0YW5jZSBSQU0gYW5kIHJldHVybnMgYSBoYW5kbGUKICAgIHRvIGl0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0IHVwIGNvbnRleHQgb2JqZWN0cy4KICovCi1pbnQKLW5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAotCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplLCBpbnQgYWNjZXNzLAotCQkgICAgICAgaW50IHRhcmdldCwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07Ci0JaW50IHJldDsKIAotCU5WX0RFQlVHKGRldiwgImNoJWQgY2xhc3M9MHglMDR4IG9mZnNldD0weCVsbHggc2l6ZT0weCVsbHhcbiIsCi0JCSBjaGFuLT5pZCwgY2xhc3MsIG9mZnNldCwgc2l6ZSk7Ci0JTlZfREVCVUcoZGV2LCAiYWNjZXNzPSVkIHRhcmdldD0lZFxuIiwgYWNjZXNzLCB0YXJnZXQpOwordm9pZAorbnY1MF9ncHVvYmpfZG1hX2luaXQoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmosIHUzMiBvZmZzZXQsIGludCBjbGFzcywKKwkJICAgICB1NjQgYmFzZSwgdTY0IHNpemUsIGludCB0YXJnZXQsIGludCBhY2Nlc3MsCisJCSAgICAgdTMyIHR5cGUsIHUzMiBjb21wKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXUzMiBmbGFnczA7CisKKwlmbGFnczAgID0gKGNvbXAgPDwgMjkpIHwgKHR5cGUgPDwgMjIpIHwgY2xhc3M7CisJZmxhZ3MwIHw9IDB4MDAxMDAwMDA7CisKKwlzd2l0Y2ggKGFjY2VzcykgeworCWNhc2UgTlZfTUVNX0FDQ0VTU19STzogZmxhZ3MwIHw9IDB4MDAwNDAwMDA7IGJyZWFrOworCWNhc2UgTlZfTUVNX0FDQ0VTU19SVzoKKwljYXNlIE5WX01FTV9BQ0NFU1NfV086IGZsYWdzMCB8PSAweDAwMDgwMDAwOyBicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlzd2l0Y2ggKHRhcmdldCkgewotCWNhc2UgTlZfRE1BX1RBUkdFVF9BR1A6Ci0JCW9mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwljYXNlIE5WX01FTV9UQVJHRVRfVlJBTToKKwkJZmxhZ3MwIHw9IDB4MDAwMTAwMDA7CisJCWJyZWFrOworCWNhc2UgTlZfTUVNX1RBUkdFVF9QQ0k6CisJCWZsYWdzMCB8PSAweDAwMDIwMDAwOworCQlicmVhazsKKwljYXNlIE5WX01FTV9UQVJHRVRfUENJX05PU05PT1A6CisJCWZsYWdzMCB8PSAweDAwMDMwMDAwOworCQlicmVhazsKKwljYXNlIE5WX01FTV9UQVJHRVRfR0FSVDoKKwkJYmFzZSArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwlkZWZhdWx0OgorCQlmbGFnczAgJj0gfjB4MDAxMDAwMDA7CisJCWJyZWFrOworCX0KKworCS8qIGNvbnZlcnQgdG8gYmFzZSArIGxpbWl0ICovCisJc2l6ZSA9IChiYXNlICsgc2l6ZSkgLSAxOworCisJbnZfd28zMihvYmosIG9mZnNldCArIDB4MDAsIGZsYWdzMCk7CisJbnZfd28zMihvYmosIG9mZnNldCArIDB4MDQsIGxvd2VyXzMyX2JpdHMoc2l6ZSkpOworCW52X3dvMzIob2JqLCBvZmZzZXQgKyAweDA4LCBsb3dlcl8zMl9iaXRzKGJhc2UpKTsKKwludl93bzMyKG9iaiwgb2Zmc2V0ICsgMHgwYywgdXBwZXJfMzJfYml0cyhzaXplKSA8PCAyNCB8CisJCQkJICAgIHVwcGVyXzMyX2JpdHMoYmFzZSkpOworCW52X3dvMzIob2JqLCBvZmZzZXQgKyAweDEwLCAweDAwMDAwMDAwKTsKKwludl93bzMyKG9iaiwgb2Zmc2V0ICsgMHgxNCwgMHgwMDAwMDAwMCk7CisKKwlwaW5zdG1lbS0+Zmx1c2gob2JqLT5kZXYpOworfQorCitpbnQKK252NTBfZ3B1b2JqX2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLCB1NjQgYmFzZSwgdTY0IHNpemUsCisJCSAgICBpbnQgdGFyZ2V0LCBpbnQgYWNjZXNzLCB1MzIgdHlwZSwgdTMyIGNvbXAsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDI0LCAxNiwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIHBvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludjUwX2dwdW9ial9kbWFfaW5pdCgqcG9iaiwgMCwgY2xhc3MsIGJhc2UsIHNpemUsIHRhcmdldCwKKwkJCSAgICAgYWNjZXNzLCB0eXBlLCBjb21wKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywgdTY0IGJhc2UsCisJCSAgICAgICB1NjQgc2l6ZSwgaW50IGFjY2VzcywgaW50IHRhcmdldCwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKnBvYmopCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqOworCXUzMiBmbGFnczAsIGZsYWdzMjsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJdTMyIGNvbXAgPSAodGFyZ2V0ID09IE5WX01FTV9UQVJHRVRfVk0pID8gTlZfTUVNX0NPTVBfVk0gOiAwOworCQl1MzIgdHlwZSA9ICh0YXJnZXQgPT0gTlZfTUVNX1RBUkdFVF9WTSkgPyBOVl9NRU1fVFlQRV9WTSA6IDA7CisKKwkJcmV0dXJuIG52NTBfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgY2xhc3MsIGJhc2UsIHNpemUsCisJCQkJCSAgIHRhcmdldCwgYWNjZXNzLCB0eXBlLCBjb21wLCBwb2JqKTsKKwl9CisKKwlpZiAodGFyZ2V0ID09IE5WX01FTV9UQVJHRVRfR0FSVCkgeworCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9BR1ApIHsKKwkJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfUENJX05PU05PT1A7CisJCQliYXNlICArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwkJfSBlbHNlCisJCWlmIChiYXNlICE9IDApIHsKKwkJCWJhc2UgPSBub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChkZXYsIGJhc2UpOworCQkJdGFyZ2V0ID0gTlZfTUVNX1RBUkdFVF9QQ0k7CisJCX0gZWxzZSB7CisJCQlub3V2ZWF1X2dwdW9ial9yZWYoZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEsIHBvYmopOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlmbGFnczAgID0gY2xhc3M7CisJZmxhZ3MwIHw9IDB4MDAwMDMwMDA7IC8qIFBUIHByZXNlbnQsIFBUIGxpbmVhciAqLworCWZsYWdzMiAgPSAwOworCisJc3dpdGNoICh0YXJnZXQpIHsKKwljYXNlIE5WX01FTV9UQVJHRVRfUENJOgorCQlmbGFnczAgfD0gMHgwMDAyMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBOVl9NRU1fVEFSR0VUX1BDSV9OT1NOT09QOgorCQlmbGFnczAgfD0gMHgwMDAzMDAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKLQkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAotCQkJCSAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIGdwdW9iaik7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBncHVvYmo6ICVkXG4iLCByZXQpOworCXN3aXRjaCAoYWNjZXNzKSB7CisJY2FzZSBOVl9NRU1fQUNDRVNTX1JPOgorCQlmbGFnczAgfD0gMHgwMDAwNDAwMDsKKwkJYnJlYWs7CisJY2FzZSBOVl9NRU1fQUNDRVNTX1dPOgorCQlmbGFnczAgfD0gMHgwMDAwODAwMDsKKwlkZWZhdWx0OgorCQlmbGFnczIgfD0gMHgwMDAwMDAwMjsKKwkJYnJlYWs7CisJfQorCisJZmxhZ3MwIHw9IChiYXNlICYgMHgwMDAwMGZmZikgPDwgMjA7CisJZmxhZ3MyIHw9IChiYXNlICYgMHhmZmZmZjAwMCk7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAxNiwgMTYsIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmb2JqKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCX0KIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJdWludDMyX3QgZnJhbWUsIGFkanVzdCwgcHRlX2ZsYWdzID0gMDsKKwludl93bzMyKG9iaiwgMHgwMCwgZmxhZ3MwKTsKKwludl93bzMyKG9iaiwgMHgwNCwgc2l6ZSAtIDEpOworCW52X3dvMzIob2JqLCAweDA4LCBmbGFnczIpOworCW52X3dvMzIob2JqLCAweDBjLCBmbGFnczIpOwogCi0JCWlmIChhY2Nlc3MgIT0gTlZfRE1BX0FDQ0VTU19STykKLQkJCXB0ZV9mbGFncyB8PSAoMTw8MSk7Ci0JCWFkanVzdCA9IG9mZnNldCAmICAweDAwMDAwZmZmOwotCQlmcmFtZSAgPSBvZmZzZXQgJiB+MHgwMDAwMGZmZjsKLQotCQludl93bzMyKCpncHVvYmosICAwLCAoKDE8PDEyKSB8ICgxPDwxMykgfCAoYWRqdXN0IDw8IDIwKSB8Ci0JCQkJICAgICAgKGFjY2VzcyA8PCAxNCkgfCAodGFyZ2V0IDw8IDE2KSB8Ci0JCQkJICAgICAgY2xhc3MpKTsKLQkJbnZfd28zMigqZ3B1b2JqLCAgNCwgc2l6ZSAtIDEpOwotCQludl93bzMyKCpncHVvYmosICA4LCBmcmFtZSB8IHB0ZV9mbGFncyk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMTIsIGZyYW1lIHwgcHRlX2ZsYWdzKTsKLQl9IGVsc2UgewotCQl1aW50NjRfdCBsaW1pdCA9IG9mZnNldCArIHNpemUgLSAxOwotCQl1aW50MzJfdCBmbGFnczAsIGZsYWdzNTsKLQotCQlpZiAodGFyZ2V0ID09IE5WX0RNQV9UQVJHRVRfVklETUVNKSB7Ci0JCQlmbGFnczAgPSAweDAwMTkwMDAwOwotCQkJZmxhZ3M1ID0gMHgwMDAxMDAwMDsKLQkJfSBlbHNlIHsKLQkJCWZsYWdzMCA9IDB4N2ZjMDAwMDA7Ci0JCQlmbGFnczUgPSAweDAwMDgwMDAwOwotCQl9Ci0KLQkJbnZfd28zMigqZ3B1b2JqLCAgMCwgZmxhZ3MwIHwgY2xhc3MpOwotCQludl93bzMyKCpncHVvYmosICA0LCBsb3dlcl8zMl9iaXRzKGxpbWl0KSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgIDgsIGxvd2VyXzMyX2JpdHMob2Zmc2V0KSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMTIsICgodXBwZXJfMzJfYml0cyhsaW1pdCkgJiAweGZmKSA8PCAyNCkgfAotCQkJCSAgICAgICh1cHBlcl8zMl9iaXRzKG9mZnNldCkgJiAweGZmKSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMjAsIGZsYWdzNSk7Ci0JfQotCi0JaW5zdG1lbS0+Zmx1c2goZGV2KTsKLQotCSgqZ3B1b2JqKS0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX1NXOwotCSgqZ3B1b2JqKS0+Y2xhc3MgID0gY2xhc3M7CisJb2JqLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfU1c7CisJb2JqLT5jbGFzcyAgPSBjbGFzczsKKwkqcG9iaiA9IG9iajsKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1ub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKLQkJCSAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUsIGludCBhY2Nlc3MsCi0JCQkgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqLAotCQkJICAgIHVpbnQzMl90ICpvX3JldCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldDsKLQotCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX0FHUCB8fAotCSAgICAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgotCSAgICAgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9TR0RNQSkpIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAotCQkJCQkgICAgIG9mZnNldCArIGRldl9wcml2LT52bV9nYXJ0X2Jhc2UsCi0JCQkJCSAgICAgc2l6ZSwgYWNjZXNzLCBOVl9ETUFfVEFSR0VUX0FHUCwKLQkJCQkJICAgICBncHVvYmopOwotCQlpZiAob19yZXQpCi0JCQkqb19yZXQgPSAwOwotCX0gZWxzZQotCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX1NHRE1BKSB7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSwgZ3B1b2JqKTsKLQkJaWYgKG9mZnNldCAmIH4weGZmZmZmZmZmVUxMKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJvYmogb2Zmc2V0IGV4Y2VlZHMgMzItYml0c1xuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAob19yZXQpCi0JCQkqb19yZXQgPSAodWludDMyX3Qpb2Zmc2V0OwotCQlyZXQgPSAoKmdwdW9iaiAhPSBOVUxMKSA/IDAgOiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCU5WX0VSUk9SKGRldiwgIkludmFsaWQgR0FSVCB0eXBlICVkXG4iLCBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKiBDb250ZXh0IG9iamVjdHMgaW4gdGhlIGluc3RhbmNlIFJBTSBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgogICogT24gTlY0MCB0aGV5IGFyZSAzMiBieXRlIGxvbmcsIG9uIE5WMzAgYW5kIHNtYWxsZXIgMTYgYnl0ZXMuCiAKQEAgLTQ5NSw2OCArNTk4LDEzIEBACiAgICBlbnRyeVs1XToKICAgIHNldCB0byAwPwogKi8KLWludAotbm91dmVhdV9ncHVvYmpfZ3JfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywKLQkJICAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0OwotCi0JTlZfREVCVUcoZGV2LCAiY2glZCBjbGFzcz0weCUwNHhcbiIsIGNoYW4tPmlkLCBjbGFzcyk7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLAotCQkJCSBub3V2ZWF1X2dwdW9ial9jbGFzc19pbnN0bWVtX3NpemUoZGV2LCBjbGFzcyksCi0JCQkJIDE2LAotCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfCBOVk9CSl9GTEFHX1pFUk9fRlJFRSwKLQkJCQkgZ3B1b2JqKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIGdwdW9iajogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKLQkJbnZfd28zMigqZ3B1b2JqLCAgMCwgY2xhc3MpOwotCQludl93bzMyKCpncHVvYmosIDIwLCAweDAwMDEwMDAwKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGNsYXNzKSB7Ci0JCWNhc2UgTlZfQ0xBU1NfTlVMTDoKLQkJCW52X3dvMzIoKmdwdW9iaiwgMCwgMHgwMDAwMTAzMCk7Ci0JCQludl93bzMyKCpncHVvYmosIDQsIDB4RkZGRkZGRkYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkgewotCQkJCW52X3dvMzIoKmdwdW9iaiwgMCwgY2xhc3MpOwotI2lmZGVmIF9fQklHX0VORElBTgotCQkJCW52X3dvMzIoKmdwdW9iaiwgOCwgMHgwMTAwMDAwMCk7Ci0jZW5kaWYKLQkJCX0gZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQkJbnZfd28zMigqZ3B1b2JqLCAwLCBjbGFzcyB8IDB4MDAwODAwMDApOwotI2Vsc2UKLQkJCQludl93bzMyKCpncHVvYmosIDAsIGNsYXNzKTsKLSNlbmRpZgotCQkJfQotCQl9Ci0JfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JKCpncHVvYmopLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfR1I7Ci0JKCpncHVvYmopLT5jbGFzcyAgPSBjbGFzczsKLQlyZXR1cm4gMDsKLX0KLQotaW50CitzdGF0aWMgaW50CiBub3V2ZWF1X2dwdW9ial9zd19uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAogCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmpfcmV0KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCi0JaWYgKCFjaGFuIHx8ICFncHVvYmpfcmV0IHx8ICpncHVvYmpfcmV0ICE9IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCWRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQogCWdwdW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpncHVvYmopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdwdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzMsNiArNjIxLDEwOSBAQAogCXJldHVybiAwOwogfQogCitpbnQKK25vdXZlYXVfZ3B1b2JqX2dyX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgaGFuZGxlLCBpbnQgY2xhc3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWQgY2xhc3M9MHglMDR4XG4iLCBjaGFuLT5pZCwgY2xhc3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYywgJmRldl9wcml2LT5jbGFzc2VzLCBoZWFkKSB7CisJCWlmIChvYy0+aWQgPT0gY2xhc3MpCisJCQlnb3RvIGZvdW5kOworCX0KKworCU5WX0VSUk9SKGRldiwgImlsbGVnYWwgb2JqZWN0IGNsYXNzOiAweCV4XG4iLCBjbGFzcyk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCXN3aXRjaCAob2MtPmVuZ2luZSkgeworCWNhc2UgTlZPQkpfRU5HSU5FX1NXOgorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKSB7CisJCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zd19uZXcoY2hhbiwgY2xhc3MsICZncHVvYmopOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZ290byBpbnNlcnQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOVk9CSl9FTkdJTkVfR1I6CisJCWlmICgoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8yMCAmJiAhY2hhbi0+cmFtaW5fZ3JjdHgpIHx8CisJCSAgICAoZGV2X3ByaXYtPmNhcmRfdHlwZSAgPCBOVl8yMCAmJiAhY2hhbi0+cGdyYXBoX2N0eCkpIHsKKwkJCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9CisJCQkJJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisKKwkJCXJldCA9IHBncmFwaC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOVk9CSl9FTkdJTkVfQ1JZUFQ6CisJCWlmICghY2hhbi0+Y3J5cHRfY3R4KSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9jcnlwdF9lbmdpbmUgKnBjcnlwdCA9CisJCQkJJmRldl9wcml2LT5lbmdpbmUuY3J5cHQ7CisKKwkJCXJldCA9IHBjcnlwdC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogd2UncmUgZG9uZSBpZiB0aGlzIGlzIGZlcm1pICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCisJCXJldHVybiAwOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKKwkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAorCQkJCSAxNiwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsCisJCQkJICZncHVvYmopOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgY3JlYXRpbmcgZ3B1b2JqOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQludl93bzMyKGdwdW9iaiwgIDAsIGNsYXNzKTsKKwkJbnZfd28zMihncHVvYmosIDIwLCAweDAwMDEwMDAwKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgTlZfQ0xBU1NfTlVMTDoKKwkJCW52X3dvMzIoZ3B1b2JqLCAwLCAweDAwMDAxMDMwKTsKKwkJCW52X3dvMzIoZ3B1b2JqLCA0LCAweEZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApIHsKKwkJCQludl93bzMyKGdwdW9iaiwgMCwgY2xhc3MpOworI2lmZGVmIF9fQklHX0VORElBTgorCQkJCW52X3dvMzIoZ3B1b2JqLCA4LCAweDAxMDAwMDAwKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQludl93bzMyKGdwdW9iaiwgMCwgY2xhc3MgfCAweDAwMDgwMDAwKTsKKyNlbHNlCisJCQkJbnZfd28zMihncHVvYmosIDAsIGNsYXNzKTsKKyNlbmRpZgorCQkJfQorCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOworCisJZ3B1b2JqLT5lbmdpbmUgPSBvYy0+ZW5naW5lOworCWdwdW9iai0+Y2xhc3MgID0gb2MtPmlkOworCitpbnNlcnQ6CisJcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoY2hhbiwgaGFuZGxlLCBncHVvYmopOworCWlmIChyZXQpCisJCU5WX0VSUk9SKGRldiwgImVycm9yIGFkZGluZyBncHVvYmogdG8gUkFNSFQ6ICVkXG4iLCByZXQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50CiBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CkBAIC01ODUsNyArNzM2LDcgQEAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKIAkvKiBCYXNlIGFtb3VudCBmb3Igb2JqZWN0IHN0b3JhZ2UgKDRLaUIgZW5vdWdoPykgKi8KLQlzaXplID0gMHgxMDAwOworCXNpemUgPSAweDIwMDA7CiAJYmFzZSA9IDA7CiAKIAkvKiBQR1JBUEggY29udGV4dCAqLwpAQCAtNjI0LDEyICs3NzUsMzAgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdnJhbSA9IE5VTEwsICp0dCA9IE5VTEw7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0OwogCiAJTlZfREVCVUcoZGV2LCAiY2glZCB2cmFtPTB4JTA4eCB0dD0weCUwOHhcbiIsIGNoYW4tPmlkLCB2cmFtX2gsIHR0X2gpOwogCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfQzApIHsKKwkJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gZGV2X3ByaXYtPmNoYW5fdm07CisJCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKKworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCA0MDk2LCAweDEwMDAsIDAsCisJCQkJCSAmY2hhbi0+cmFtaW4pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlub3V2ZWF1X3ZtX3JlZih2bSwgJmNoYW4tPnZtLCBOVUxMKTsKKworCQl2cGdkID0gbGlzdF9maXJzdF9lbnRyeSgmdm0tPnBnZF9saXN0LCBzdHJ1Y3Qgbm91dmVhdV92bV9wZ2QsIGhlYWQpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDAsIGxvd2VyXzMyX2JpdHModnBnZC0+b2JqLT52aW5zdCkpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDQsIHVwcGVyXzMyX2JpdHModnBnZC0+b2JqLT52aW5zdCkpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDgsIDB4ZmZmZmZmZmYpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMGMsIDB4MDAwMDAwZmYpOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBBbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeSBmb3IgcGVyLWNoYW5uZWwgb2JqZWN0IHN0b3JhZ2UgKi8KIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKGNoYW4pOwogCWlmIChyZXQpIHsKQEAgLTYzOSwxNCArODA4LDEyIEBACiAKIAkvKiBOVjUwIFZNCiAJICogIC0gQWxsb2NhdGUgcGVyLWNoYW5uZWwgcGFnZS1kaXJlY3RvcnkKLQkgKiAgLSBNYXAgR0FSVCBhbmQgVlJBTSBpbnRvIHRoZSBjaGFubmVsJ3MgYWRkcmVzcyBzcGFjZSBhdCB0aGUKLQkgKiAgICBsb2NhdGlvbnMgZGV0ZXJtaW5lZCBkdXJpbmcgaW5pdC4KKwkgKiAgLSBMaW5rIHdpdGggc2hhcmVkIGNoYW5uZWwgVk0KIAkgKi8KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCWlmIChkZXZfcHJpdi0+Y2hhbl92bSkgewogCQl1MzIgcGdkX29mZnMgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkgPyAweDE0MDAgOiAweDAyMDA7CiAJCXU2NCB2bV92aW5zdCA9IGNoYW4tPnJhbWluLT52aW5zdCArIHBnZF9vZmZzOwogCQl1MzIgdm1fcGluc3QgPSBjaGFuLT5yYW1pbi0+cGluc3Q7Ci0JCXUzMiBwZGU7CiAKIAkJaWYgKHZtX3BpbnN0ICE9IH4wKQogCQkJdm1fcGluc3QgKz0gcGdkX29mZnM7CkBAIC02NTUsMjkgKzgyMiw4IEBACiAJCQkJCSAgICAgIDAsICZjaGFuLT52bV9wZCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDAwOyBpICs9IDgpIHsKLQkJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyAwLCAweDAwMDAwMDAwKTsKLQkJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyA0LCAweGRlYWRjYWZlKTsKLQkJfQogCi0JCW5vdXZlYXVfZ3B1b2JqX3JlZihkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSwKLQkJCQkgICAmY2hhbi0+dm1fZ2FydF9wdCk7Ci0JCXBkZSA9IChkZXZfcHJpdi0+dm1fZ2FydF9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDg7Ci0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIHBkZSArIDAsIGNoYW4tPnZtX2dhcnRfcHQtPnZpbnN0IHwgMyk7Ci0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIHBkZSArIDQsIDB4MDAwMDAwMDApOwotCi0JCXBkZSA9IChkZXZfcHJpdi0+dm1fdnJhbV9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDg7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKSB7Ci0JCQlub3V2ZWF1X2dwdW9ial9yZWYoZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0sCi0JCQkJCSAgICZjaGFuLT52bV92cmFtX3B0W2ldKTsKLQotCQkJbnZfd28zMihjaGFuLT52bV9wZCwgcGRlICsgMCwKLQkJCQljaGFuLT52bV92cmFtX3B0W2ldLT52aW5zdCB8IDB4NjEpOwotCQkJbnZfd28zMihjaGFuLT52bV9wZCwgcGRlICsgNCwgMHgwMDAwMDAwMCk7Ci0JCQlwZGUgKz0gODsKLQkJfQotCi0JCWluc3RtZW0tPmZsdXNoKGRldik7CisJCW5vdXZlYXVfdm1fcmVmKGRldl9wcml2LT5jaGFuX3ZtLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKIAl9CiAKIAkvKiBSQU1IVCAqLwpAQCAtNzAwLDkgKzg0Niw4IEBACiAJLyogVlJBTSBjdHhkbWEgKi8KIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZtX2VuZCwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmdnJhbSk7CisJCQkJCSAgICAgMCwgKDFVTEwgPDwgNDApLCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfVk0sICZ2cmFtKTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgVlJBTSBjdHhkbWE6ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKQEAgLTcxMCw4ICs4NTUsOCBAQAogCX0gZWxzZSB7CiAJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKIAkJCQkJICAgICAwLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCi0JCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19SVywKLQkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1ZJRE1FTSwgJnZyYW0pOworCQkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcsCisJCQkJCSAgICAgTlZfTUVNX1RBUkdFVF9WUkFNLCAmdnJhbSk7CiAJCWlmIChyZXQpIHsKIAkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gY3R4ZG1hOiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC03MjgsMjEgKzg3MywxMyBAQAogCS8qIFRUIG1lbW9yeSBjdHhkbWEgKi8KIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZtX2VuZCwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmdHQpOwotCQlpZiAocmV0KSB7Ci0JCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBWUkFNIGN0eGRtYTogJWRcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlCi0JaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSAhPSBOT1VWRUFVX0dBUlRfTk9ORSkgewotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoY2hhbiwgMCwKLQkJCQkJCSAgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUsCi0JCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUlcsICZ0dCwgTlVMTCk7CisJCQkJCSAgICAgMCwgKDFVTEwgPDwgNDApLCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfVk0sICZ0dCk7CiAJfSBlbHNlIHsKLQkJTlZfRVJST1IoZGV2LCAiSW52YWxpZCBHQVJUIHR5cGUgJWRcbiIsIGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKKwkJCQkJICAgICAwLCBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfR0FSVCwgJnR0KTsKIAl9CiAKIAlpZiAocmV0KSB7CkBAIC03NjMsMjEgKzkwMCwxNCBAQAogdm9pZAogbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQlpbnQgaTsKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKIAotCWlmICghY2hhbi0+cmFtaHQpCi0JCXJldHVybjsKLQogCW5vdXZlYXVfcmFtaHRfcmVmKE5VTEwsICZjaGFuLT5yYW1odCwgY2hhbik7CiAKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3BkKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX2dhcnRfcHQpOwotCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKQotCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwogCiAJaWYgKGNoYW4tPnJhbWluX2hlYXAuZnJlZV9zdGFjay5uZXh0KQogCQlkcm1fbW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOwpAQCAtNzkxLDE0NyArOTIxLDkxIEBACiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSA9IHZtYWxsb2MoZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSk7Ci0JCWlmICghZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07IGkgKz0gNCkKLQkJCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weVtpLzRdID0gbnZfcmkzMihkZXYsIGkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwdW9iaiwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCwgbGlzdCkgewotCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZykKKwkJaWYgKGdwdW9iai0+Y2luc3QgIT0gTlZPQkpfQ0lOU1RfR0xPQkFMKQogCQkJY29udGludWU7CiAKLQkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQgPSB2bWFsbG9jKGdwdW9iai0+c2l6ZSk7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpIHsKKwkJZ3B1b2JqLT5zdXNwZW5kID0gdm1hbGxvYyhncHVvYmotPnNpemUpOworCQlpZiAoIWdwdW9iai0+c3VzcGVuZCkgewogCQkJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPnNpemU7IGkgKz0gNCkKLQkJCWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0gPSBudl9ybzMyKGdwdW9iaiwgaSk7CisJCQlncHVvYmotPnN1c3BlbmRbaS80XSA9IG52X3JvMzIoZ3B1b2JqLCBpKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZAotbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJdmZyZWUoZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KTsKLQkJZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5ID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCi0JCQljb250aW51ZTsKLQotCQl2ZnJlZShncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCk7Ci0JCWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQKIG5vdXZlYXVfZ3B1b2JqX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQpCi0JCQludl93aTMyKGRldiwgaSwgZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5W2kvNF0pOwotCQlub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoZGV2KTsKLQkJcmV0dXJuOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCisJCWlmICghZ3B1b2JqLT5zdXNwZW5kKQogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+c2l6ZTsgaSArPSA0KQotCQkJbnZfd28zMihncHVvYmosIGksIGdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0pOwotCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKwkJCW52X3dvMzIoZ3B1b2JqLCBpLCBncHVvYmotPnN1c3BlbmRbaS80XSk7CisKKwkJdmZyZWUoZ3B1b2JqLT5zdXNwZW5kKTsKKwkJZ3B1b2JqLT5zdXNwZW5kID0gTlVMTDsKIAl9CiAKLQlub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoZGV2KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIH0KIAogaW50IG5vdXZlYXVfaW9jdGxfZ3JvYmpfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jICppbml0ID0gZGF0YTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzICpncmM7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpnciA9IE5VTEw7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKIAlpbnQgcmV0OwogCi0JTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGluaXQtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7Ci0KIAlpZiAoaW5pdC0+aGFuZGxlID09IH4wKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWdyYyA9IHBncmFwaC0+Z3JjbGFzczsKLQl3aGlsZSAoZ3JjLT5pZCkgewotCQlpZiAoZ3JjLT5pZCA9PSBpbml0LT5jbGFzcykKLQkJCWJyZWFrOwotCQlncmMrKzsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgaW5pdC0+Y2hhbm5lbCk7CisJaWYgKElTX0VSUihjaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbik7CisKKwlpZiAobm91dmVhdV9yYW1odF9maW5kKGNoYW4sIGluaXQtPmhhbmRsZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFncmMtPmlkKSB7Ci0JCU5WX0VSUk9SKGRldiwgIklsbGVnYWwgb2JqZWN0IGNsYXNzOiAweCV4XG4iLCBpbml0LT5jbGFzcyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JaWYgKG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBpbml0LT5oYW5kbGUpKQotCQlyZXR1cm4gLUVFWElTVDsKLQotCWlmICghZ3JjLT5zb2Z0d2FyZSkKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIGdyYy0+aWQsICZncik7Ci0JZWxzZQotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zd19uZXcoY2hhbiwgZ3JjLT5pZCwgJmdyKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgaW5pdC0+aGFuZGxlLCBpbml0LT5jbGFzcyk7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBvYmplY3Q6ICVkICglZC8weCUwOHgpXG4iLAogCQkJIHJldCwgaW5pdC0+Y2hhbm5lbCwgaW5pdC0+aGFuZGxlKTsKLQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChjaGFuLCBpbml0LT5oYW5kbGUsIGdyKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIG9iamVjdDogJWQgKCVkLzB4JTA4eClcbiIsCi0JCQkgcmV0LCBpbml0LT5jaGFubmVsLCBpbml0LT5oYW5kbGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOworb3V0OgorCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOworCXJldHVybiByZXQ7CiB9CiAKIGludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgKm9iamZyZWUgPSBkYXRhOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihvYmpmcmVlLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCWNoYW4gPSBub3V2ZWF1X2NoYW5uZWxfZ2V0KGRldiwgZmlsZV9wcml2LCBvYmpmcmVlLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAotCWdwdW9iaiA9IG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBvYmpmcmVlLT5oYW5kbGUpOwotCWlmICghZ3B1b2JqKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkvKiBTeW5jaHJvbml6ZSB3aXRoIHRoZSB1c2VyIGNoYW5uZWwgKi8KKwlub3V2ZWF1X2NoYW5uZWxfaWRsZShjaGFuKTsKIAotCW5vdXZlYXVfcmFtaHRfcmVtb3ZlKGNoYW4sIG9iamZyZWUtPmhhbmRsZSk7Ci0JcmV0dXJuIDA7CisJcmV0ID0gbm91dmVhdV9yYW1odF9yZW1vdmUoY2hhbiwgb2JqZnJlZS0+aGFuZGxlKTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKKwlyZXR1cm4gcmV0OwogfQogCiB1MzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYwppbmRleCA5ZjdiMTU4Li5mYjg0NmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5jCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9wbS5oIgogCisjaWZkZWYgQ09ORklHX0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKQEAgLTQxOCw4ICs0MjIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAlkZXZfc2V0X2RydmRhdGEoaHdtb25fZGV2LCBkZXYpOwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaHdtb25fZGV2LT5rb2JqLAotCQkJCQkmaHdtb25fYXR0cmdyb3VwKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+cGRldi0+ZGV2LmtvYmosICZod21vbl9hdHRyZ3JvdXApOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LAogCQkJIlVuYWJsZSB0byBjcmVhdGUgaHdtb24gc3lzZnMgZmlsZTogJWRcbiIsIHJldCk7CkBAIC00NDYsNiArNDQ5LDI1IEBACiAjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW50Citub3V2ZWF1X3BtX2FjcGlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSwgZW5naW5lLnBtLmFjcGlfbmIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCBhY3BpX2J1c19ldmVudCAqZW50cnkgPSAoc3RydWN0IGFjcGlfYnVzX2V2ZW50ICopZGF0YTsKKworCWlmIChzdHJjbXAoZW50cnktPmRldmljZV9jbGFzcywgImFjX2FkYXB0ZXIiKSA9PSAwKSB7CisJCWJvb2wgYWMgPSBwb3dlcl9zdXBwbHlfaXNfc3lzdGVtX3N1cHBsaWVkKCk7CisKKwkJTlZfREVCVUcoZGV2LCAicG93ZXIgc3VwcGx5IGNoYW5nZWQ6ICVzXG4iLCBhYyA/ICJBQyIgOiAiREMiKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmCisKIGludAogbm91dmVhdV9wbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC00ODUsNiArNTA3LDEwIEBACiAKIAlub3V2ZWF1X3N5c2ZzX2luaXQoZGV2KTsKIAlub3V2ZWF1X2h3bW9uX2luaXQoZGV2KTsKKyNpZmRlZiBDT05GSUdfQUNQSQorCXBtLT5hY3BpX25iLm5vdGlmaWVyX2NhbGwgPSBub3V2ZWF1X3BtX2FjcGlfZXZlbnQ7CisJcmVnaXN0ZXJfYWNwaV9ub3RpZmllcigmcG0tPmFjcGlfbmIpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMyw2ICs1MjksOSBAQAogCW5vdXZlYXVfcGVyZl9maW5pKGRldik7CiAJbm91dmVhdV92b2x0X2ZpbmkoZGV2KTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCisJdW5yZWdpc3Rlcl9hY3BpX25vdGlmaWVyKCZwbS0+YWNwaV9uYik7CisjZW5kaWYKIAlub3V2ZWF1X2h3bW9uX2ZpbmkoZGV2KTsKIAlub3V2ZWF1X3N5c2ZzX2ZpbmkoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuYwppbmRleCAyZDg1ODA5Li5iZWYzZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yYW1odC5jCkBAIC0xMDQsMTcgKzEwNCwxNyBAQAogCW5vdXZlYXVfZ3B1b2JqX3JlZihncHVvYmosICZlbnRyeS0+Z3B1b2JqKTsKIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKLQkJY3R4ID0gTlZfUkFNSFRfQ09OVEVYVF9WQUxJRCB8IChncHVvYmotPmNpbnN0ID4+IDQpIHwKKwkJY3R4ID0gTlZfUkFNSFRfQ09OVEVYVF9WQUxJRCB8IChncHVvYmotPnBpbnN0ID4+IDQpIHwKIAkJICAgICAgKGNoYW4tPmlkIDw8IE5WX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCkgfAogCQkgICAgICAoZ3B1b2JqLT5lbmdpbmUgPDwgTlZfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU0hJRlQpOwogCX0gZWxzZQogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJY3R4ID0gKGdwdW9iai0+Y2luc3QgPj4gNCkgfAorCQljdHggPSAoZ3B1b2JqLT5waW5zdCA+PiA0KSB8CiAJCSAgICAgIChjaGFuLT5pZCA8PCBOVjQwX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCkgfAogCQkgICAgICAoZ3B1b2JqLT5lbmdpbmUgPDwgTlY0MF9SQU1IVF9DT05URVhUX0VOR0lORV9TSElGVCk7CiAJfSBlbHNlIHsKIAkJaWYgKGdwdW9iai0+ZW5naW5lID09IE5WT0JKX0VOR0lORV9ESVNQTEFZKSB7Ci0JCQljdHggPSAoZ3B1b2JqLT5jaW5zdCA8PCAxMCkgfCAyOworCQkJY3R4ID0gKGdwdW9iai0+Y2luc3QgPDwgMTApIHwgY2hhbi0+aWQ7CiAJCX0gZWxzZSB7CiAJCQljdHggPSAoZ3B1b2JqLT5jaW5zdCA+PiA0KSB8CiAJCQkgICAgICAoKGdwdW9iai0+ZW5naW5lIDw8CkBAIC0yMTQsMTggKzIxNCwxOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPnJhbWh0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQKK2ludAogbm91dmVhdV9yYW1odF9yZW1vdmUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIGhhbmRsZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9yYW1odF9lbnRyeSAqZW50cnk7CiAKIAllbnRyeSA9IG5vdXZlYXVfcmFtaHRfcmVtb3ZlX2VudHJ5KGNoYW4sIGhhbmRsZSk7CiAJaWYgKCFlbnRyeSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVOT0VOVDsKIAogCW5vdXZlYXVfcmFtaHRfcmVtb3ZlX2hhc2goY2hhbiwgZW50cnktPmhhbmRsZSk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZlbnRyeS0+Z3B1b2JqKTsKIAlrZnJlZShlbnRyeSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmgKaW5kZXggYjc5Y2I1ZS4uYzgyZGU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yYW1odC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuaApAQCAtNDgsNyArNDgsNyBAQAogCiBleHRlcm4gaW50ICBub3V2ZWF1X3JhbWh0X2luc2VydChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBoYW5kbGUsCiAJCQkJIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfcmFtaHRfcmVtb3ZlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdTMyIGhhbmRsZSk7CitleHRlcm4gaW50ICBub3V2ZWF1X3JhbWh0X3JlbW92ZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBoYW5kbGUpOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqCiBub3V2ZWF1X3JhbWh0X2ZpbmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCmluZGV4IDFiNDI1NDEuLjA0ZThmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaApAQCAtNDUsNiArNDUsMTEgQEAKICMJZGVmaW5lIE5WMDRfUEZCX1JFRl9DTURfUkVGUkVTSAkJCQkoMSA8PCAwKQogI2RlZmluZSBOVjA0X1BGQl9QUkUJCQkJCQkweDAwMTAwMmQ0CiAjCWRlZmluZSBOVjA0X1BGQl9QUkVfQ01EX1BSRUNIQVJHRQkJCSgxIDw8IDApCisjZGVmaW5lIE5WMjBfUEZCX1pDT01QKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAzMDAgKyA0KihpKSkKKyMJZGVmaW5lIE5WMjBfUEZCX1pDT01QX01PREVfMzIJCQkJKDQgPDwgMjQpCisjCWRlZmluZSBOVjIwX1BGQl9aQ09NUF9FTgkJCQkoMSA8PCAzMSkKKyMJZGVmaW5lIE5WMjVfUEZCX1pDT01QX01PREVfMTYJCQkJKDEgPDwgMjApCisjCWRlZmluZSBOVjI1X1BGQl9aQ09NUF9NT0RFXzMyCQkJCSgyIDw8IDIwKQogI2RlZmluZSBOVjEwX1BGQl9DTE9TRV9QQUdFMgkJCQkJMHgwMDEwMDMzYwogI2RlZmluZSBOVjA0X1BGQl9TQ1JBTUJMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDQwMCArIDQgKiAoaSkpCiAjZGVmaW5lIE5WNDBfUEZCX1RJTEUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwMCArIChpKjE2KSkKQEAgLTc0LDE3ICs3OSw2IEBACiAjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUICAgICAgICAgICAgICAgIDIwCiAjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfSU5TVEFOQ0VfU0hJRlQgICAgICAgICAgICAgIDAKIAotLyogRE1BIG9iamVjdCBkZWZpbmVzICovCi0jZGVmaW5lIE5WX0RNQV9BQ0NFU1NfUlcgMAotI2RlZmluZSBOVl9ETUFfQUNDRVNTX1JPIDEKLSNkZWZpbmUgTlZfRE1BX0FDQ0VTU19XTyAyCi0jZGVmaW5lIE5WX0RNQV9UQVJHRVRfVklETUVNIDAKLSNkZWZpbmUgTlZfRE1BX1RBUkdFVF9QQ0kgICAgMgotI2RlZmluZSBOVl9ETUFfVEFSR0VUX0FHUCAgICAzCi0vKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhIHJlYWwgdmFsdWUgdXNlZCBieSB0aGUgY2FyZCwgaXQncyBjaGFuZ2VkIGJ5Ci0gKiBub3V2ZWF1X29iamVjdF9kbWFfY3JlYXRlICovCi0jZGVmaW5lIE5WX0RNQV9UQVJHRVRfUENJX05PTkxJTkVBUiA4Ci0KIC8qIFNvbWUgb2JqZWN0IGNsYXNzZXMgd2UgY2FyZSBhYm91dCBpbiB0aGUgZHJtICovCiAjZGVmaW5lIE5WX0NMQVNTX0RNQV9GUk9NX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgTlZfQ0xBU1NfRE1BX1RPX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwpAQCAtMzMyLDYgKzMyNiw3IEBACiAjZGVmaW5lIE5WMDRfUEdSQVBIX0JTV0laWkxFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2QTAKICNkZWZpbmUgTlYwM19QR1JBUEhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDZCMAogI2RlZmluZSBOVjA0X1BHUkFQSF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzAwCisjICAgIGRlZmluZSBOVjQwX1BHUkFQSF9TVEFUVVNfU1lOQ19TVEFMTCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKICNkZWZpbmUgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcwNAogI2RlZmluZSBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzA4CiAjZGVmaW5lIE5WMDRfUEdSQVBIX1NVUkZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MEMKQEAgLTM3OCw2ICszNzMsNyBAQAogI2RlZmluZSBOVjIwX1BHUkFQSF9UTElNSVQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDkwNCArIChpKjE2KSkKICNkZWZpbmUgTlYyMF9QR1JBUEhfVFNJWkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDA5MDggKyAoaSoxNikpCiAjZGVmaW5lIE5WMjBfUEdSQVBIX1RTVEFUVVMoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwOTBDICsgKGkqMTYpKQorI2RlZmluZSBOVjIwX1BHUkFQSF9aQ09NUChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDk4MCArIDQqKGkpKQogI2RlZmluZSBOVjEwX1BHUkFQSF9USUxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEIwMCArIChpKjE2KSkKICNkZWZpbmUgTlYxMF9QR1JBUEhfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBCMDQgKyAoaSoxNikpCiAjZGVmaW5lIE5WMTBfUEdSQVBIX1RTSVpFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwQjA4ICsgKGkqMTYpKQpAQCAtNzE0LDMxICs3MTAsMzIgQEAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMmMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhuKSAgICAgICAgICAgICAgICAgICAoMSA8PCAoKG4pICsgMikpCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDI4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDJjCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDXyhuKSAgICAgICAgICAgICAgICAgKDEgPDwgKChuKSArIDIpKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAzMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfVVBEQVRFX1ZDTEswICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfVVBEQVRFX1ZDTEsxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDA4MAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1RSQVBQRURfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDA4NAotI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVChpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwMCkKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQihpKSAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDQpCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT05fVlJBTSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT05fU1lTVEVNICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTksyKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjA4KQotI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfVU5LMyhpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwYykKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHgwOCArIDB4MDA2MTAwODApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9EQVRBKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MDggKyAweDAwNjEwMDg0KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGkpICAgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fRE1BX0NCKGkpICAgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDQpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTl9WUkFNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTl9TWVNURU0gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX1VOSzIoaSkgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjA4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0VWT19IQVNIX1RBRyhpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwYykKIAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDI3MAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSkgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDI3MCkKQEAgLTc0NiwxNSArNzQzLDExIEBACiAjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCiAjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAweDAwMDEwMDAwCiAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFmZmMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDQKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9SQU1fQU1PVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODQKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODgKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzOGMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9NVEhEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFmZmMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDQKIAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfUChpLCByKSAgICAgICAgKChpKSAqIDB4NTQwICsgTlY1MF9QRElTUExBWV9DUlRDXyMjcikKICNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0MoaSwgcikgICAgKDQgKyAoaSkgKiAweDU0MCArIE5WNTBfUERJU1BMQVlfQ1JUQ18jI3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKaW5kZXggZDRhYzk3MC4uOWEyNTBlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtMTQsNyArMTQsNyBAQAogCWRtYV9hZGRyX3QgKnBhZ2VzOwogCXVuc2lnbmVkIG5yX3BhZ2VzOwogCi0JdW5zaWduZWQgcHRlX3N0YXJ0OworCXU2NCBvZmZzZXQ7CiAJYm9vbCBib3VuZDsKIH07CiAKQEAgLTc0LDE4ICs3NCw2IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkCi1ub3V2ZWF1X3NnZG1hX3B0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBwdGUgPSAob2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCi0JCXJldHVybiBwdGUgKyAyOwotCi0JcmV0dXJuIHB0ZSA8PCAxOwotfQotCiBzdGF0aWMgaW50CiBub3V2ZWF1X3NnZG1hX2JpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCiB7CkBAIC05NywzMiArODUsMTcgQEAKIAogCU5WX0RFQlVHKGRldiwgInBnPTB4JWx4XG4iLCBtZW0tPnN0YXJ0KTsKIAotCXB0ZSA9IG5vdXZlYXVfc2dkbWFfcHRlKG52YmUtPmRldiwgbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUKTsKLQludmJlLT5wdGVfc3RhcnQgPSBwdGU7CisJbnZiZS0+b2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCXB0ZSA9IChudmJlLT5vZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICsgMjsKIAlmb3IgKGkgPSAwOyBpIDwgbnZiZS0+bnJfcGFnZXM7IGkrKykgewogCQlkbWFfYWRkcl90IGRtYV9vZmZzZXQgPSBudmJlLT5wYWdlc1tpXTsKIAkJdWludDMyX3Qgb2Zmc2V0X2wgPSBsb3dlcl8zMl9iaXRzKGRtYV9vZmZzZXQpOwotCQl1aW50MzJfdCBvZmZzZXRfaCA9IHVwcGVyXzMyX2JpdHMoZG1hX29mZnNldCk7CiAKLQkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgewotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCBvZmZzZXRfbCB8IDMpOwotCQkJCXB0ZSArPSAxOwotCQkJfSBlbHNlIHsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgMCwgb2Zmc2V0X2wgfCAweDIxKTsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgNCwgb2Zmc2V0X2ggJiAweGZmKTsKLQkJCQlwdGUgKz0gMjsKLQkJCX0KLQorCQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gTlZfQ1RYRE1BX1BBR0VfU0laRTsgaisrLCBwdGUrKykgeworCQkJbnZfd28zMihncHVvYmosIChwdGUgKiA0KSArIDAsIG9mZnNldF9sIHwgMyk7CiAJCQlkbWFfb2Zmc2V0ICs9IE5WX0NUWERNQV9QQUdFX1NJWkU7CiAJCX0KIAl9Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKG52YmUtPmRldik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQlkZXZfcHJpdi0+ZW5naW5lLmZpZm8udGxiX2ZsdXNoKGRldik7Ci0JCWRldl9wcml2LT5lbmdpbmUuZ3JhcGgudGxiX2ZsdXNoKGRldik7Ci0JfQogCiAJbnZiZS0+Ym91bmQgPSB0cnVlOwogCXJldHVybiAwOwpAQCAtMTQyLDI4ICsxMTUsMTAgQEAKIAlpZiAoIW52YmUtPmJvdW5kKQogCQlyZXR1cm4gMDsKIAotCXB0ZSA9IG52YmUtPnB0ZV9zdGFydDsKKwlwdGUgPSAobnZiZS0+b2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKSArIDI7CiAJZm9yIChpID0gMDsgaSA8IG52YmUtPm5yX3BhZ2VzOyBpKyspIHsKLQkJZG1hX2FkZHJfdCBkbWFfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXM7Ci0KLQkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgewotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCBkbWFfb2Zmc2V0IHwgMyk7Ci0JCQkJcHRlICs9IDE7Ci0JCQl9IGVsc2UgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCAweDAwMDAwMDAwKTsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgNCwgMHgwMDAwMDAwMCk7Ci0JCQkJcHRlICs9IDI7Ci0JCQl9Ci0KLQkJCWRtYV9vZmZzZXQgKz0gTlZfQ1RYRE1BX1BBR0VfU0laRTsKLQkJfQotCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2gobnZiZS0+ZGV2KTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCWRldl9wcml2LT5lbmdpbmUuZmlmby50bGJfZmx1c2goZGV2KTsKLQkJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC50bGJfZmx1c2goZGV2KTsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKywgcHRlKyspCisJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgMCwgMHgwMDAwMDAwMCk7CiAJfQogCiAJbnZiZS0+Ym91bmQgPSBmYWxzZTsKQEAgLTE4Niw2ICsxNDEsMzUgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQKK252NTBfc2dkbWFfYmluZChzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlLCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG52YmUtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwludmJlLT5vZmZzZXQgPSBtZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisKKwlub3V2ZWF1X3ZtX21hcF9zZygmZGV2X3ByaXYtPmdhcnRfaW5mby52bWEsIG52YmUtPm9mZnNldCwKKwkJCSAgbnZiZS0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCwgbnZiZS0+cGFnZXMpOworCW52YmUtPmJvdW5kID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9zZ2RtYV91bmJpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG52YmUtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIW52YmUtPmJvdW5kKQorCQlyZXR1cm4gMDsKKworCW5vdXZlYXVfdm1fdW5tYXBfYXQoJmRldl9wcml2LT5nYXJ0X2luZm8udm1hLCBudmJlLT5vZmZzZXQsCisJCQkgICAgbnZiZS0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJbnZiZS0+Ym91bmQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIG5vdXZlYXVfc2dkbWFfYmFja2VuZCA9IHsKIAkucG9wdWxhdGUJCT0gbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZSwKIAkuY2xlYXIJCQk9IG5vdXZlYXVfc2dkbWFfY2xlYXIsCkBAIC0xOTQsMjMgKzE3OCwzMCBAQAogCS5kZXN0cm95CQk9IG5vdXZlYXVfc2dkbWFfZGVzdHJveQogfTsKIAorc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIG52NTBfc2dkbWFfYmFja2VuZCA9IHsKKwkucG9wdWxhdGUJCT0gbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZSwKKwkuY2xlYXIJCQk9IG5vdXZlYXVfc2dkbWFfY2xlYXIsCisJLmJpbmQJCQk9IG52NTBfc2dkbWFfYmluZCwKKwkudW5iaW5kCQkJPSBudjUwX3NnZG1hX3VuYmluZCwKKwkuZGVzdHJveQkJPSBub3V2ZWF1X3NnZG1hX2Rlc3Ryb3kKK307CisKIHN0cnVjdCB0dG1fYmFja2VuZCAqCiBub3V2ZWF1X3NnZG1hX2luaXRfdHRtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZTsKIAotCWlmICghZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEpCi0JCXJldHVybiBOVUxMOwotCiAJbnZiZSA9IGt6YWxsb2Moc2l6ZW9mKCpudmJlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudmJlKQogCQlyZXR1cm4gTlVMTDsKIAogCW52YmUtPmRldiA9IGRldjsKIAotCW52YmUtPmJhY2tlbmQuZnVuYwk9ICZub3V2ZWF1X3NnZG1hX2JhY2tlbmQ7Ci0KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQludmJlLT5iYWNrZW5kLmZ1bmMgPSAmbm91dmVhdV9zZ2RtYV9iYWNrZW5kOworCWVsc2UKKwkJbnZiZS0+YmFja2VuZC5mdW5jID0gJm52NTBfc2dkbWFfYmFja2VuZDsKIAlyZXR1cm4gJm52YmUtPmJhY2tlbmQ7CiB9CiAKQEAgLTIxOCw3ICsyMDksNiBAQAogbm91dmVhdV9zZ2RtYV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IE5VTEw7CiAJdWludDMyX3QgYXBlcl9zaXplLCBvYmpfc2l6ZTsKIAlpbnQgaSwgcmV0OwpAQCAtMjMxLDY4ICsyMjEsNDAgQEAKIAogCQlvYmpfc2l6ZSAgPSAoYXBlcl9zaXplID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKSAqIDQ7CiAJCW9ial9zaXplICs9IDg7IC8qIGN0eGRtYSBoZWFkZXIgKi8KLQl9IGVsc2UgewotCQkvKiAxIGVudGlyZSBWTSBwYWdlIHRhYmxlICovCi0JCWFwZXJfc2l6ZSA9ICg1MTIgKiAxMDI0ICogMTAyNCk7Ci0JCW9ial9zaXplICA9IChhcGVyX3NpemUgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICogODsKLQl9CiAKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCBvYmpfc2l6ZSwgMTYsCi0JCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmdwdW9iaik7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBzZ2RtYSBvYmplY3Q6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgb2JqX3NpemUsIDE2LAorCQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmdwdW9iaik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIHNnZG1hIG9iamVjdDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UgPQotCQlhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfRE1BMzJ8X19HRlBfWkVSTyk7Ci0JaWYgKCFkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UpIHsKLQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncHVvYmopOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzZXRfYml0KFBHX2xvY2tlZCwgJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZS0+ZmxhZ3MpOwotCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID0KLQkJcGNpX21hcF9wYWdlKHBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSwgMCwKLQkJCSAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocGRldiwgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMpKSB7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkvKiBzcGVjaWFsIGNhc2UsIGFsbG9jYXRlZCBmcm9tIGdsb2JhbCBpbnN0bWVtIGhlYXAgc28KLQkJICogY2luc3QgaXMgaW52YWxpZCwgd2UgdXNlIGl0IG9uIGFsbCBjaGFubmVscyB0aG91Z2ggc28KLQkJICogY2luc3QgbmVlZHMgdG8gYmUgdmFsaWQsIHNldCBpdCB0aGUgc2FtZSBhcyBwaW5zdAotCQkgKi8KLQkJZ3B1b2JqLT5jaW5zdCA9IGdwdW9iai0+cGluc3Q7Ci0KLQkJLyogTWF5YmUgdXNlIE5WX0RNQV9UQVJHRVRfQUdQIGZvciBQQ0lFPyBOVklESUEgZG8gdGhpcywgYW5kCi0JCSAqIGNvbmZpcm1lZCB0byB3b3JrIG9uIGM1MS4gIFBlcmhhcHMgbWVhbnMgTlZfRE1BX1RBUkdFVF9QQ0lFCi0JCSAqIG9uIHRob3NlIGNhcmRzPyAqLwogCQludl93bzMyKGdwdW9iaiwgMCwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSB8CiAJCQkJICAgKDEgPDwgMTIpIC8qIFBUIHByZXNlbnQgKi8gfAogCQkJCSAgICgwIDw8IDEzKSAvKiBQVCAqbm90KiBsaW5lYXIgKi8gfAotCQkJCSAgIChOVl9ETUFfQUNDRVNTX1JXICA8PCAxNCkgfAotCQkJCSAgIChOVl9ETUFfVEFSR0VUX1BDSSA8PCAxNikpOworCQkJCSAgICgwIDw8IDE0KSAvKiBSVyAqLyB8CisJCQkJICAgKDIgPDwgMTYpIC8qIFBDSSAqLyk7CiAJCW52X3dvMzIoZ3B1b2JqLCA0LCBhcGVyX3NpemUgLSAxKTsKLQkJZm9yIChpID0gMjsgaSA8IDIgKyAoYXBlcl9zaXplID4+IDEyKTsgaSsrKSB7Ci0JCQludl93bzMyKGdwdW9iaiwgaSAqIDQsCi0JCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMgfCAzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBvYmpfc2l6ZTsgaSArPSA4KSB7Ci0JCQludl93bzMyKGdwdW9iaiwgaSArIDAsIDB4MDAwMDAwMDApOwotCQkJbnZfd28zMihncHVvYmosIGkgKyA0LCAweDAwMDAwMDAwKTsKLQkJfQorCQlmb3IgKGkgPSAyOyBpIDwgMiArIChhcGVyX3NpemUgPj4gMTIpOyBpKyspCisJCQludl93bzMyKGdwdW9iaiwgaSAqIDQsIDB4MDAwMDAwMDApOworCisJCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hID0gZ3B1b2JqOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZSA9IDA7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplID0gYXBlcl9zaXplOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hhbl92bSkgeworCQlyZXQgPSBub3V2ZWF1X3ZtX2dldChkZXZfcHJpdi0+Y2hhbl92bSwgNTEyICogMTAyNCAqIDEwMjQsCisJCQkJICAgICAxMiwgTlZfTUVNX0FDQ0VTU19SVywKKwkJCQkgICAgICZkZXZfcHJpdi0+Z2FydF9pbmZvLnZtYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlID0gZGV2X3ByaXYtPmdhcnRfaW5mby52bWEub2Zmc2V0OworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSA9IDUxMiAqIDEwMjQgKiAxMDI0OwogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIAogCWRldl9wcml2LT5nYXJ0X2luZm8udHlwZSAgICAgID0gTk9VVkVBVV9HQVJUX1NHRE1BOwotCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlID0gMDsKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSA9IGFwZXJfc2l6ZTsKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSA9IGdwdW9iajsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAxLDMxICsyNjMsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSkgewotCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzLAotCQkJICAgICAgIE5WX0NUWERNQV9QQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCXVubG9ja19wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7Ci0JCV9fZnJlZV9wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7Ci0JCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSA9IE5VTEw7Ci0JCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID0gMDsKLQl9Ci0KIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hKTsKKwlub3V2ZWF1X3ZtX3B1dCgmZGV2X3ByaXYtPmdhcnRfaW5mby52bWEpOwogfQogCi1pbnQKLW5vdXZlYXVfc2dkbWFfZ2V0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqcGFnZSkKK3VpbnQzMl90Citub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOwotCWludCBwdGU7CisJaW50IHB0ZSA9IChvZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICsgMjsKIAotCXB0ZSA9IChvZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpIDw8IDI7Ci0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkqcGFnZSA9IG52X3JvMzIoZ3B1b2JqLCAocHRlICsgOCkpICYgfk5WX0NUWERNQV9QQUdFX01BU0s7Ci0JCXJldHVybiAwOwotCX0KKwlCVUdfT04oZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCk7CiAKLQlOVl9FUlJPUihkZXYsICJVbmltcGxlbWVudGVkIG9uIE5WNTBcbiIpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiAobnZfcm8zMihncHVvYmosIDQgKiBwdGUpICYgfk5WX0NUWERNQV9QQUdFX01BU0spIHwKKwkJKG9mZnNldCAmIE5WX0NUWERNQV9QQUdFX01BU0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCmluZGV4IDA0OWY3NTUuLmE1NGZjNDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCkBAIC01MywxMCArNTMsMTAgQEAKIAkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnYwNF9pbnN0bWVtX3Rha2Vkb3duOwogCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjA0X2luc3RtZW1fc3VzcGVuZDsKIAkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudjA0X2luc3RtZW1fcmVzdW1lOwotCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudjA0X2luc3RtZW1fcG9wdWxhdGU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7Ci0JCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOwotCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5nZXQJCT0gbnYwNF9pbnN0bWVtX2dldDsKKwkJZW5naW5lLT5pbnN0bWVtLnB1dAkJPSBudjA0X2luc3RtZW1fcHV0OworCQllbmdpbmUtPmluc3RtZW0ubWFwCQk9IG52MDRfaW5zdG1lbV9tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS51bm1hcAkJPSBudjA0X2luc3RtZW1fdW5tYXA7CiAJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjA0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CkBAIC02NSw3ICs2NSw2IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudjA0X2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYwNF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MDRfZ3JhcGhfZ3JjbGFzczsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MDRfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjA0X2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKQEAgLTc2LDcgKzc1LDcgQEAKIAkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52MDRfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAxNjsKIAkJZW5naW5lLT5maWZvLmluaXQJCT0gbnYwNF9maWZvX2luaXQ7Ci0JCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBudjA0X2ZpZm9fZmluaTsKIAkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CiAJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKIAkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKQEAgLTk5LDE2ICs5OCwyMCBAQAogCQllbmdpbmUtPnBtLmNsb2NrX2dldAkJPSBudjA0X3BtX2Nsb2NrX2dldDsKIAkJZW5naW5lLT5wbS5jbG9ja19wcmUJCT0gbnYwNF9wbV9jbG9ja19wcmU7CiAJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CQk9IG52MDRfcG1fY2xvY2tfc2V0OworCQllbmdpbmUtPmNyeXB0LmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPnZyYW0uaW5pdAkJPSBub3V2ZWF1X21lbV9kZXRlY3Q7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG5vdXZlYXVfbWVtX2ZsYWdzX3ZhbGlkOwogCQlicmVhazsKIAljYXNlIDB4MTA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OwogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOwogCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKLQkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKLQkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjA0X2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52MDRfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnYwNF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52MDRfaW5zdG1lbV91bm1hcDsKIAkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52MDRfaW5zdG1lbV9mbHVzaDsKIAkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CiAJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKQEAgLTExNyw4ICsxMjAsOSBAQAogCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CiAJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYxMF9mYl9pbml0OwogCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MTBfZmJfdGFrZWRvd247Ci0JCWVuZ2luZS0+ZmIuc2V0X3JlZ2lvbl90aWxpbmcJPSBudjEwX2ZiX3NldF9yZWdpb25fdGlsaW5nOwotCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYxMF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmZiLmluaXRfdGlsZV9yZWdpb24JPSBudjEwX2ZiX2luaXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuc2V0X3RpbGVfcmVnaW9uCT0gbnYxMF9mYl9zZXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuZnJlZV90aWxlX3JlZ2lvbgk9IG52MTBfZmJfZnJlZV90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MTBfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjEwX2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmNoYW5uZWwJCT0gbnYxMF9ncmFwaF9jaGFubmVsOwpAQCAtMTI3LDE3ICsxMzEsMTcgQEAKIAkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CiAJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnYxMF9ncmFwaF9sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjEwX2dyYXBoX3VubG9hZF9jb250ZXh0OwotCQllbmdpbmUtPmdyYXBoLnNldF9yZWdpb25fdGlsaW5nCT0gbnYxMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZzsKKwkJZW5naW5lLT5ncmFwaC5zZXRfdGlsZV9yZWdpb24JPSBudjEwX2dyYXBoX3NldF90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOwogCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjEwX2ZpZm9faW5pdDsKLQkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG52MDRfZmlmb19maW5pOwogCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKIAkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOwogCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOwogCQllbmdpbmUtPmZpZm8uY2FjaGVfcHVsbAkJPSBudjA0X2ZpZm9fY2FjaGVfcHVsbDsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CiAJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52MTBfZmlmb19jcmVhdGVfY29udGV4dDsKLQkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MTBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjA0X2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX3VubG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OwpAQCAtMTUzLDE2ICsxNTcsMjAgQEAKIAkJZW5naW5lLT5wbS5jbG9ja19nZXQJCT0gbnYwNF9wbV9jbG9ja19nZXQ7CiAJCWVuZ2luZS0+cG0uY2xvY2tfcHJlCQk9IG52MDRfcG1fY2xvY2tfcHJlOwogCQllbmdpbmUtPnBtLmNsb2NrX3NldAkJPSBudjA0X3BtX2Nsb2NrX3NldDsKKwkJZW5naW5lLT5jcnlwdC5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbm91dmVhdV9tZW1fZGV0ZWN0OworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBub3V2ZWF1X21lbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJY2FzZSAweDIwOgogCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjA0X2luc3RtZW1faW5pdDsKIAkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnYwNF9pbnN0bWVtX3Rha2Vkb3duOwogCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjA0X2luc3RtZW1fc3VzcGVuZDsKIAkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudjA0X2luc3RtZW1fcmVzdW1lOwotCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudjA0X2luc3RtZW1fcG9wdWxhdGU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7Ci0JCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOwotCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5nZXQJCT0gbnYwNF9pbnN0bWVtX2dldDsKKwkJZW5naW5lLT5pbnN0bWVtLnB1dAkJPSBudjA0X2luc3RtZW1fcHV0OworCQllbmdpbmUtPmluc3RtZW0ubWFwCQk9IG52MDRfaW5zdG1lbV9tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS51bm1hcAkJPSBudjA0X2luc3RtZW1fdW5tYXA7CiAJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjA0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CkBAIC0xNzEsOCArMTc5LDkgQEAKIAkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOwogCQllbmdpbmUtPmZiLmluaXQJCQk9IG52MTBfZmJfaW5pdDsKIAkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudjEwX2ZiX3Rha2Vkb3duOwotCQllbmdpbmUtPmZiLnNldF9yZWdpb25fdGlsaW5nCT0gbnYxMF9mYl9zZXRfcmVnaW9uX3RpbGluZzsKLQkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MjBfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5mYi5pbml0X3RpbGVfcmVnaW9uCT0gbnYxMF9mYl9pbml0X3RpbGVfcmVnaW9uOworCQllbmdpbmUtPmZiLnNldF90aWxlX3JlZ2lvbgk9IG52MTBfZmJfc2V0X3RpbGVfcmVnaW9uOworCQllbmdpbmUtPmZiLmZyZWVfdGlsZV9yZWdpb24JPSBudjEwX2ZiX2ZyZWVfdGlsZV9yZWdpb247CiAJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjIwX2dyYXBoX2luaXQ7CiAJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnYyMF9ncmFwaF90YWtlZG93bjsKIAkJZW5naW5lLT5ncmFwaC5jaGFubmVsCQk9IG52MTBfZ3JhcGhfY2hhbm5lbDsKQEAgLTE4MSwxNyArMTkwLDE3IEBACiAJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzOwogCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfbG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF91bmxvYWRfY29udGV4dDsKLQkJZW5naW5lLT5ncmFwaC5zZXRfcmVnaW9uX3RpbGluZwk9IG52MjBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmc7CisJCWVuZ2luZS0+Z3JhcGguc2V0X3RpbGVfcmVnaW9uCT0gbnYyMF9ncmFwaF9zZXRfdGlsZV9yZWdpb247CiAJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAzMjsKIAkJZW5naW5lLT5maWZvLmluaXQJCT0gbnYxMF9maWZvX2luaXQ7Ci0JCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBudjA0X2ZpZm9fZmluaTsKIAkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CiAJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKIAkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKIAkJZW5naW5lLT5maWZvLmNhY2hlX3B1bGwJCT0gbnYwNF9maWZvX2NhY2hlX3B1bGw7CiAJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52MTBfZmlmb19jaGFubmVsX2lkOwogCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7Ci0JCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYwNF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKIAkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQJPSBudjA0X2Rpc3BsYXlfZWFybHlfaW5pdDsKQEAgLTIwNywxNiArMjE2LDIwIEBACiAJCWVuZ2luZS0+cG0uY2xvY2tfZ2V0CQk9IG52MDRfcG1fY2xvY2tfZ2V0OwogCQllbmdpbmUtPnBtLmNsb2NrX3ByZQkJPSBudjA0X3BtX2Nsb2NrX3ByZTsKIAkJZW5naW5lLT5wbS5jbG9ja19zZXQJCT0gbnYwNF9wbV9jbG9ja19zZXQ7CisJCWVuZ2luZS0+Y3J5cHQuaW5pdAkJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5jcnlwdC50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+dnJhbS5pbml0CQk9IG5vdXZlYXVfbWVtX2RldGVjdDsKKwkJZW5naW5lLT52cmFtLmZsYWdzX3ZhbGlkCT0gbm91dmVhdV9tZW1fZmxhZ3NfdmFsaWQ7CiAJCWJyZWFrOwogCWNhc2UgMHgzMDoKIAkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKLQkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOwotCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOwotCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0uZ2V0CQk9IG52MDRfaW5zdG1lbV9nZXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wdXQJCT0gbnYwNF9pbnN0bWVtX3B1dDsKKwkJZW5naW5lLT5pbnN0bWVtLm1hcAkJPSBudjA0X2luc3RtZW1fbWFwOworCQllbmdpbmUtPmluc3RtZW0udW5tYXAJCT0gbnYwNF9pbnN0bWVtX3VubWFwOwogCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnYwNF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOwpAQCAtMjI1LDggKzIzOCw5IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudjMwX2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYzMF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5mYi5zZXRfcmVnaW9uX3RpbGluZwk9IG52MTBfZmJfc2V0X3JlZ2lvbl90aWxpbmc7Ci0JCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjMwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+ZmIuaW5pdF90aWxlX3JlZ2lvbgk9IG52MzBfZmJfaW5pdF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5zZXRfdGlsZV9yZWdpb24JPSBudjEwX2ZiX3NldF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5mcmVlX3RpbGVfcmVnaW9uCT0gbnYzMF9mYl9mcmVlX3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYzMF9ncmFwaF9pbml0OwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52MjBfZ3JhcGhfdGFrZWRvd247CiAJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzOwpAQCAtMjM1LDE3ICsyNDksMTcgQEAKIAkJZW5naW5lLT5ncmFwaC5kZXN0cm95X2NvbnRleHQJPSBudjIwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjIwX2dyYXBoX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7Ci0JCWVuZ2luZS0+Z3JhcGguc2V0X3JlZ2lvbl90aWxpbmcJPSBudjIwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nOworCQllbmdpbmUtPmdyYXBoLnNldF90aWxlX3JlZ2lvbgk9IG52MjBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CiAJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52MTBfZmlmb19pbml0OwotCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbnYwNF9maWZvX2Zpbmk7CiAJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOwogCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CiAJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CiAJCWVuZ2luZS0+Zmlmby5jYWNoZV9wdWxsCQk9IG52MDRfZmlmb19jYWNoZV9wdWxsOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKIAkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0OwotCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fbG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+ZGlzcGxheS5lYXJseV9pbml0CT0gbnYwNF9kaXNwbGF5X2Vhcmx5X2luaXQ7CkBAIC0yNjMsNiArMjc3LDEwIEBACiAJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CQk9IG52MDRfcG1fY2xvY2tfc2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKIAkJZW5naW5lLT5wbS52b2x0YWdlX3NldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19zZXQ7CisJCWVuZ2luZS0+Y3J5cHQuaW5pdAkJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5jcnlwdC50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+dnJhbS5pbml0CQk9IG5vdXZlYXVfbWVtX2RldGVjdDsKKwkJZW5naW5lLT52cmFtLmZsYWdzX3ZhbGlkCT0gbm91dmVhdV9tZW1fZmxhZ3NfdmFsaWQ7CiAJCWJyZWFrOwogCWNhc2UgMHg0MDoKIAljYXNlIDB4NjA6CkBAIC0yNzAsMTAgKzI4OCwxMCBAQAogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOwogCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKLQkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKLQkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjA0X2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52MDRfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnYwNF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52MDRfaW5zdG1lbV91bm1hcDsKIAkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52MDRfaW5zdG1lbV9mbHVzaDsKIAkJZW5naW5lLT5tYy5pbml0CQkJPSBudjQwX21jX2luaXQ7CiAJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnY0MF9tY190YWtlZG93bjsKQEAgLTI4Miw4ICszMDAsOSBAQAogCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CiAJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnY0MF9mYl9pbml0OwogCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52NDBfZmJfdGFrZWRvd247Ci0JCWVuZ2luZS0+ZmIuc2V0X3JlZ2lvbl90aWxpbmcJPSBudjQwX2ZiX3NldF9yZWdpb25fdGlsaW5nOwotCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnY0MF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmZiLmluaXRfdGlsZV9yZWdpb24JPSBudjMwX2ZiX2luaXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuc2V0X3RpbGVfcmVnaW9uCT0gbnY0MF9mYl9zZXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuZnJlZV90aWxlX3JlZ2lvbgk9IG52MzBfZmJfZnJlZV90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52NDBfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjQwX2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKQEAgLTI5MiwxNyArMzExLDE3IEBACiAJCWVuZ2luZS0+Z3JhcGguZGVzdHJveV9jb250ZXh0CT0gbnY0MF9ncmFwaF9kZXN0cm95X2NvbnRleHQ7CiAJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnY0MF9ncmFwaF9sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjQwX2dyYXBoX3VubG9hZF9jb250ZXh0OwotCQllbmdpbmUtPmdyYXBoLnNldF9yZWdpb25fdGlsaW5nCT0gbnY0MF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZzsKKwkJZW5naW5lLT5ncmFwaC5zZXRfdGlsZV9yZWdpb24JPSBudjQwX2dyYXBoX3NldF90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOwogCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjQwX2ZpZm9faW5pdDsKLQkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG52MDRfZmlmb19maW5pOwogCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKIAkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOwogCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOwogCQllbmdpbmUtPmZpZm8uY2FjaGVfcHVsbAkJPSBudjA0X2ZpZm9fY2FjaGVfcHVsbDsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CiAJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52NDBfZmlmb19jcmVhdGVfY29udGV4dDsKLQkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52NDBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjA0X2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnY0MF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnY0MF9maWZvX3VubG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OwpAQCAtMzIxLDYgKzM0MCwxMCBAQAogCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKIAkJZW5naW5lLT5wbS52b2x0YWdlX3NldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19zZXQ7CiAJCWVuZ2luZS0+cG0udGVtcF9nZXQJCT0gbnY0MF90ZW1wX2dldDsKKwkJZW5naW5lLT5jcnlwdC5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbm91dmVhdV9tZW1fZGV0ZWN0OworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBub3V2ZWF1X21lbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJY2FzZSAweDUwOgogCWNhc2UgMHg4MDogLyogZ290dGEgbG92ZSBOVklESUEncyBjb25zaXN0ZW5jeS4uICovCkBAIC0zMzAsMTAgKzM1MywxMCBAQAogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjUwX2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52NTBfaW5zdG1lbV9zdXNwZW5kOwogCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52NTBfaW5zdG1lbV9yZXN1bWU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52NTBfaW5zdG1lbV9wb3B1bGF0ZTsKLQkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52NTBfaW5zdG1lbV9jbGVhcjsKLQkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnY1MF9pbnN0bWVtX2JpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnY1MF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjUwX2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52NTBfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnY1MF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52NTBfaW5zdG1lbV91bm1hcDsKIAkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApCiAJCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJPSBudjUwX2luc3RtZW1fZmx1c2g7CiAJCWVsc2UKQEAgLTM0NSw3ICszNjgsNiBAQAogCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CiAJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnY1MF9mYl9pbml0OwogCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52NTBfZmJfdGFrZWRvd247Ci0JCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjUwX2dyYXBoX2dyY2xhc3M7CiAJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjUwX2dyYXBoX2luaXQ7CiAJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnY1MF9ncmFwaF90YWtlZG93bjsKIAkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52NTBfZ3JhcGhfZmlmb19hY2Nlc3M7CkBAIC0zODEsMjQgKzQwMywzMiBAQAogCQllbmdpbmUtPmRpc3BsYXkuaW5pdAkJPSBudjUwX2Rpc3BsYXlfaW5pdDsKIAkJZW5naW5lLT5kaXNwbGF5LmRlc3Ryb3kJCT0gbnY1MF9kaXNwbGF5X2Rlc3Ryb3k7CiAJCWVuZ2luZS0+Z3Bpby5pbml0CQk9IG52NTBfZ3Bpb19pbml0OwotCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbnY1MF9ncGlvX2Zpbmk7CiAJCWVuZ2luZS0+Z3Bpby5nZXQJCT0gbnY1MF9ncGlvX2dldDsKIAkJZW5naW5lLT5ncGlvLnNldAkJPSBudjUwX2dwaW9fc2V0OworCQllbmdpbmUtPmdwaW8uaXJxX3JlZ2lzdGVyCT0gbnY1MF9ncGlvX2lycV9yZWdpc3RlcjsKKwkJZW5naW5lLT5ncGlvLmlycV91bnJlZ2lzdGVyCT0gbnY1MF9ncGlvX2lycV91bnJlZ2lzdGVyOwogCQllbmdpbmUtPmdwaW8uaXJxX2VuYWJsZQkJPSBudjUwX2dwaW9faXJxX2VuYWJsZTsKIAkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewotCQljYXNlIDB4YTM6Ci0JCWNhc2UgMHhhNToKLQkJY2FzZSAweGE4OgotCQljYXNlIDB4YWY6Ci0JCQllbmdpbmUtPnBtLmNsb2NrX2dldAk9IG52YTNfcG1fY2xvY2tfZ2V0OwotCQkJZW5naW5lLT5wbS5jbG9ja19wcmUJPSBudmEzX3BtX2Nsb2NrX3ByZTsKLQkJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CT0gbnZhM19wbV9jbG9ja19zZXQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwkJY2FzZSAweDg0OgorCQljYXNlIDB4ODY6CisJCWNhc2UgMHg5MjoKKwkJY2FzZSAweDk0OgorCQljYXNlIDB4OTY6CisJCWNhc2UgMHg5ODoKKwkJY2FzZSAweGEwOgorCQljYXNlIDB4YWE6CisJCWNhc2UgMHhhYzoKKwkJY2FzZSAweDUwOgogCQkJZW5naW5lLT5wbS5jbG9ja19nZXQJPSBudjUwX3BtX2Nsb2NrX2dldDsKIAkJCWVuZ2luZS0+cG0uY2xvY2tfcHJlCT0gbnY1MF9wbV9jbG9ja19wcmU7CiAJCQllbmdpbmUtPnBtLmNsb2NrX3NldAk9IG52NTBfcG1fY2xvY2tfc2V0OwogCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllbmdpbmUtPnBtLmNsb2NrX2dldAk9IG52YTNfcG1fY2xvY2tfZ2V0OworCQkJZW5naW5lLT5wbS5jbG9ja19wcmUJPSBudmEzX3BtX2Nsb2NrX3ByZTsKKwkJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CT0gbnZhM19wbV9jbG9ja19zZXQ7CisJCQlicmVhazsKIAkJfQogCQllbmdpbmUtPnBtLnZvbHRhZ2VfZ2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX2dldDsKIAkJZW5naW5lLT5wbS52b2x0YWdlX3NldAkJPSBub3V2ZWF1X3ZvbHRhZ2VfZ3Bpb19zZXQ7CkBAIC00MDYsMTcgKzQzNiwzOSBAQAogCQkJZW5naW5lLT5wbS50ZW1wX2dldAk9IG52ODRfdGVtcF9nZXQ7CiAJCWVsc2UKIAkJCWVuZ2luZS0+cG0udGVtcF9nZXQJPSBudjQwX3RlbXBfZ2V0OworCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJCWNhc2UgMHg4NDoKKwkJY2FzZSAweDg2OgorCQljYXNlIDB4OTI6CisJCWNhc2UgMHg5NDoKKwkJY2FzZSAweDk2OgorCQljYXNlIDB4YTA6CisJCQllbmdpbmUtPmNyeXB0LmluaXQJPSBudjg0X2NyeXB0X2luaXQ7CisJCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCT0gbnY4NF9jcnlwdF9maW5pOworCQkJZW5naW5lLT5jcnlwdC5jcmVhdGVfY29udGV4dCA9IG52ODRfY3J5cHRfY3JlYXRlX2NvbnRleHQ7CisJCQllbmdpbmUtPmNyeXB0LmRlc3Ryb3lfY29udGV4dCA9IG52ODRfY3J5cHRfZGVzdHJveV9jb250ZXh0OworCQkJZW5naW5lLT5jcnlwdC50bGJfZmx1c2gJPSBudjg0X2NyeXB0X3RsYl9mbHVzaDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZW5naW5lLT5jcnlwdC5pbml0CT0gbm91dmVhdV9zdHViX2luaXQ7CisJCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQkJYnJlYWs7CisJCX0KKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbnY1MF92cmFtX2luaXQ7CisJCWVuZ2luZS0+dnJhbS5nZXQJCT0gbnY1MF92cmFtX25ldzsKKwkJZW5naW5lLT52cmFtLnB1dAkJPSBudjUwX3ZyYW1fZGVsOworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBudjUwX3ZyYW1fZmxhZ3NfdmFsaWQ7CiAJCWJyZWFrOwogCWNhc2UgMHhDMDoKIAkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnZjMF9pbnN0bWVtX2luaXQ7CiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52YzBfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnZjMF9pbnN0bWVtX3N1c3BlbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnZjMF9pbnN0bWVtX3Jlc3VtZTsKLQkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnZjMF9pbnN0bWVtX3BvcHVsYXRlOwotCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnZjMF9pbnN0bWVtX2NsZWFyOwotCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudmMwX2luc3RtZW1fYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudmMwX2luc3RtZW1fdW5iaW5kOwotCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnZjMF9pbnN0bWVtX2ZsdXNoOworCQllbmdpbmUtPmluc3RtZW0uZ2V0CQk9IG52NTBfaW5zdG1lbV9nZXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wdXQJCT0gbnY1MF9pbnN0bWVtX3B1dDsKKwkJZW5naW5lLT5pbnN0bWVtLm1hcAkJPSBudjUwX2luc3RtZW1fbWFwOworCQllbmdpbmUtPmluc3RtZW0udW5tYXAJCT0gbnY1MF9pbnN0bWVtX3VubWFwOworCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnY4NF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52NTBfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjUwX21jX3Rha2Vkb3duOwogCQllbmdpbmUtPnRpbWVyLmluaXQJCT0gbnYwNF90aW1lcl9pbml0OwpAQCAtNDI0LDcgKzQ3Niw2IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudmMwX2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnZjMF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IE5VTEw7ICAvL252YzBfZ3JhcGhfZ3JjbGFzczsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52YzBfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudmMwX2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnZjMF9ncmFwaF9maWZvX2FjY2VzczsKQEAgLTQ1Myw3ICs1MDQsMTUgQEAKIAkJZW5naW5lLT5ncGlvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKIAkJZW5naW5lLT5ncGlvLmdldAkJPSBudjUwX2dwaW9fZ2V0OwogCQllbmdpbmUtPmdwaW8uc2V0CQk9IG52NTBfZ3Bpb19zZXQ7CisJCWVuZ2luZS0+Z3Bpby5pcnFfcmVnaXN0ZXIJPSBudjUwX2dwaW9faXJxX3JlZ2lzdGVyOworCQllbmdpbmUtPmdwaW8uaXJxX3VucmVnaXN0ZXIJPSBudjUwX2dwaW9faXJxX3VucmVnaXN0ZXI7CiAJCWVuZ2luZS0+Z3Bpby5pcnFfZW5hYmxlCQk9IG52NTBfZ3Bpb19pcnFfZW5hYmxlOworCQllbmdpbmUtPmNyeXB0LmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPnZyYW0uaW5pdAkJPSBudmMwX3ZyYW1faW5pdDsKKwkJZW5naW5lLT52cmFtLmdldAkJPSBudmMwX3ZyYW1fbmV3OworCQllbmdpbmUtPnZyYW0ucHV0CQk9IG52NTBfdnJhbV9kZWw7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG52YzBfdnJhbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJTlZfRVJST1IoZGV2LCAiTlYlMDJ4IHVuc3VwcG9ydGVkXG4iLCBkZXZfcHJpdi0+Y2hpcHNldCk7CkBAIC00OTMsOSArNTUyLDEzIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIG5vIGRtYSBvYmplY3RzIG9uIGZlcm1pLi4uICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCisJCWdvdG8gb3V0X2RvbmU7CisKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGRldl9wcml2LT5jaGFubmVsLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAogCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZyYW1fc2l6ZSwKLQkJCQkgICAgIE5WX0RNQV9BQ0NFU1NfUlcsIE5WX0RNQV9UQVJHRVRfVklETUVNLAorCQkJCSAgICAgTlZfTUVNX0FDQ0VTU19SVywgTlZfTUVNX1RBUkdFVF9WUkFNLAogCQkJCSAgICAgJmdwdW9iaik7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZXJyOwpAQCAtNTA1LDkgKzU2OCwxMCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2VycjsKIAotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dhcnRfZG1hX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgMCwKLQkJCQkJICBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKLQkJCQkJICBOVl9ETUFfQUNDRVNTX1JXLCAmZ3B1b2JqLCBOVUxMKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGRldl9wcml2LT5jaGFubmVsLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAorCQkJCSAgICAgMCwgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUsCisJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXLCBOVl9NRU1fVEFSR0VUX0dBUlQsCisJCQkJICAgICAmZ3B1b2JqKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CiAKQEAgLTUxNiwxMSArNTgwLDEyIEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfZXJyOwogCitvdXRfZG9uZToKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7CiAJcmV0dXJuIDA7CiAKIG91dF9lcnI6Ci0Jbm91dmVhdV9jaGFubmVsX2ZyZWUoZGV2X3ByaXYtPmNoYW5uZWwpOwotCWRldl9wcml2LT5jaGFubmVsID0gTlVMTDsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZkZXZfcHJpdi0+Y2hhbm5lbCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTMxLDE1ICs1OTYsMjUgQEAKIAlwbV9tZXNzYWdlX3QgcG1tID0geyAuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EIH07CiAJaWYgKHN0YXRlID09IFZHQV9TV0lUQ0hFUk9PX09OKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVkdBIHN3aXRjaGVyb286IHN3aXRjaGVkIG5vdXZlYXUgb25cbiIpOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfQ0hBTkdJTkc7CiAJCW5vdXZlYXVfcGNpX3Jlc3VtZShwZGV2KTsKIAkJZHJtX2ttc19oZWxwZXJfcG9sbF9lbmFibGUoZGV2KTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX09OOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0VSUiAiVkdBIHN3aXRjaGVyb286IHN3aXRjaGVkIG5vdXZlYXUgb2ZmXG4iKTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCQlkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZGV2KTsKIAkJbm91dmVhdV9wY2lfc3VzcGVuZChwZGV2LCBwbW0pOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfT0ZGOwogCX0KIH0KIAorc3RhdGljIHZvaWQgbm91dmVhdV9zd2l0Y2hlcm9vX3JlcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlub3V2ZWF1X2ZiY29uX291dHB1dF9wb2xsX2NoYW5nZWQoZGV2KTsKK30KKwogc3RhdGljIGJvb2wgbm91dmVhdV9zd2l0Y2hlcm9vX2Nhbl9zd2l0Y2goc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTU2MCw2ICs2MzUsNyBAQAogCiAJdmdhX2NsaWVudF9yZWdpc3RlcihkZXYtPnBkZXYsIGRldiwgTlVMTCwgbm91dmVhdV92Z2Ffc2V0X2RlY29kZSk7CiAJdmdhX3N3aXRjaGVyb29fcmVnaXN0ZXJfY2xpZW50KGRldi0+cGRldiwgbm91dmVhdV9zd2l0Y2hlcm9vX3NldF9zdGF0ZSwKKwkJCQkgICAgICAgbm91dmVhdV9zd2l0Y2hlcm9vX3JlcHJvYmUsCiAJCQkJICAgICAgIG5vdXZlYXVfc3dpdGNoZXJvb19jYW5fc3dpdGNoKTsKIAogCS8qIEluaXRpYWxpc2UgaW50ZXJuYWwgZHJpdmVyIEFQSSBob29rcyAqLwpAQCAtNTY3LDYgKzY0Myw4IEBACiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAJZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5jaGFubmVscy5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPnRpbGUubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrKTsKIAogCS8qIE1ha2UgdGhlIENSVENzIGFuZCBJMkMgYnVzZXMgYWNjZXNzaWJsZSAqLwpAQCAtNjI1LDI2ICs3MDMsMjggQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2ZiOwogCisJCS8qIFBDUllQVCAqLworCQlyZXQgPSBlbmdpbmUtPmNyeXB0LmluaXQoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2dyYXBoOworCiAJCS8qIFBGSUZPICovCiAJCXJldCA9IGVuZ2luZS0+Zmlmby5pbml0KGRldik7CiAJCWlmIChyZXQpCi0JCQlnb3RvIG91dF9ncmFwaDsKKwkJCWdvdG8gb3V0X2NyeXB0OwogCX0KIAogCXJldCA9IGVuZ2luZS0+ZGlzcGxheS5jcmVhdGUoZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9maWZvOwogCi0JLyogdGhpcyBjYWxsIGlycV9wcmVpbnN0YWxsLCByZWdpc3RlciBpcnEgaGFuZGxlciBhbmQKLQkgKiBjYWxsIGlycV9wb3N0aW5zdGFsbAotCSAqLwotCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOworCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIG52X3R3b19oZWFkcyhkZXYpID8gMiA6IDEpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X2Rpc3BsYXk7CisJCWdvdG8gb3V0X3ZibGFuazsKIAotCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIDApOworCXJldCA9IG5vdXZlYXVfaXJxX2luaXQoZGV2KTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9pcnE7CisJCWdvdG8gb3V0X3ZibGFuazsKIAogCS8qIHdoYXQgYWJvdXQgUFZJREVPL1BDUlRDL1BSQU1EQUMgZXRjPyAqLwogCkBAIC02NjksMTIgKzc0OSwxNiBAQAogb3V0X2ZlbmNlOgogCW5vdXZlYXVfZmVuY2VfZmluaShkZXYpOwogb3V0X2lycToKLQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOwotb3V0X2Rpc3BsYXk6CisJbm91dmVhdV9pcnFfZmluaShkZXYpOworb3V0X3ZibGFuazoKKwlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIAllbmdpbmUtPmRpc3BsYXkuZGVzdHJveShkZXYpOwogb3V0X2ZpZm86CiAJaWYgKCFub3V2ZWF1X25vYWNjZWwpCiAJCWVuZ2luZS0+Zmlmby50YWtlZG93bihkZXYpOworb3V0X2NyeXB0OgorCWlmICghbm91dmVhdV9ub2FjY2VsKQorCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duKGRldik7CiBvdXRfZ3JhcGg6CiAJaWYgKCFub3V2ZWF1X25vYWNjZWwpCiAJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24oZGV2KTsKQEAgLTcxMywxMiArNzk3LDEyIEBACiAKIAlpZiAoIWVuZ2luZS0+Z3JhcGguYWNjZWxfYmxvY2tlZCkgewogCQlub3V2ZWF1X2ZlbmNlX2ZpbmkoZGV2KTsKLQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoZGV2X3ByaXYtPmNoYW5uZWwpOwotCQlkZXZfcHJpdi0+Y2hhbm5lbCA9IE5VTEw7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmRldl9wcml2LT5jaGFubmVsKTsKIAl9CiAKIAlpZiAoIW5vdXZlYXVfbm9hY2NlbCkgewogCQllbmdpbmUtPmZpZm8udGFrZWRvd24oZGV2KTsKKwkJZW5naW5lLT5jcnlwdC50YWtlZG93bihkZXYpOwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duKGRldik7CiAJfQogCWVuZ2luZS0+ZmIudGFrZWRvd24oZGV2KTsKQEAgLTczNyw3ICs4MjEsOCBAQAogCW5vdXZlYXVfZ3B1b2JqX3Rha2Vkb3duKGRldik7CiAJbm91dmVhdV9tZW1fdnJhbV9maW5pKGRldik7CiAKLQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCW5vdXZlYXVfaXJxX2ZpbmkoZGV2KTsKKwlkcm1fdmJsYW5rX2NsZWFudXAoZGV2KTsKIAogCW5vdXZlYXVfcG1fZmluaShkZXYpOwogCW5vdXZlYXVfYmlvc190YWtlZG93bihkZXYpOwpAQCAtOTgwLDYgKzEwNjUsNyBAQAogCiB2b2lkIG5vdXZlYXVfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJdmdhX3N3aXRjaGVyb29fcHJvY2Vzc19kZWxheWVkX3N3aXRjaCgpOwogfQogCiBpbnQgbm91dmVhdV91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTEwMjQsMjEgKzExMTAsNiBAQAogCQllbHNlCiAJCQlnZXRwYXJhbS0+dmFsdWUgPSBOVl9QQ0k7CiAJCWJyZWFrOwotCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9GQl9QSFlTSUNBTDoKLQkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmZiX3BoeXM7Ci0JCWJyZWFrOwotCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9BR1BfUEhZU0lDQUw6Ci0JCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlOwotCQlicmVhazsKLQljYXNlIE5PVVZFQVVfR0VUUEFSQU1fUENJX1BIWVNJQ0FMOgotCQlpZiAoZGV2LT5zZykgewotCQkJZ2V0cGFyYW0tPnZhbHVlID0gKHVuc2lnbmVkIGxvbmcpZGV2LT5zZy0+dmlydHVhbDsKLQkJfSBlbHNlIHsKLQkJCU5WX0VSUk9SKGRldiwgIlJlcXVlc3RlZCBQQ0lHQVJUIGFkZHJlc3MsICIKLQkJCQkJIndoaWxlIG5vIFBDSUdBUlQgd2FzIGNyZWF0ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1NJWkU6CiAJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZTsKIAkJYnJlYWs7CkBAIC0xMDQ2LDcgKzExMTcsNyBAQAogCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZTsKIAkJYnJlYWs7CiAJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX1ZNX1ZSQU1fQkFTRToKLQkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwkJZ2V0cGFyYW0tPnZhbHVlID0gMDsgLyogZGVwcmVjYXRlZCAqLwogCQlicmVhazsKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fUFRJTUVSX1RJTUU6CiAJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5lbmdpbmUudGltZXIucmVhZChkZXYpOwpAQCAtMTA1NCw2ICsxMTI1LDkgQEAKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fSEFTX0JPX1VTQUdFOgogCQlnZXRwYXJhbS0+dmFsdWUgPSAxOwogCQlicmVhazsKKwljYXNlIE5PVVZFQVVfR0VUUEFSQU1fSEFTX1BBR0VGTElQOgorCQlnZXRwYXJhbS0+dmFsdWUgPSAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKTsKKwkJYnJlYWs7CiAJY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0dSQVBIX1VOSVRTOgogCQkvKiBOVjQwIGFuZCBOVjUwIHZlcnNpb25zIGFyZSBxdWl0ZSBkaWZmZXJlbnQsIGJ1dCByZWdpc3RlcgogCQkgKiBhZGRyZXNzIGlzIHRoZSBzYW1lLiBVc2VyIGlzIHN1cHBvc2VkIHRvIGtub3cgdGhlIGNhcmQKQEAgLTEwODcsOCArMTE2MSw5IEBACiB9CiAKIC8qIFdhaXQgdW50aWwgKHZhbHVlKHJlZykgJiBtYXNrKSA9PSB2YWwsIHVwIHVudGlsIHRpbWVvdXQgaGFzIGhpdCAqLwotYm9vbCBub3V2ZWF1X3dhaXRfdW50aWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDY0X3QgdGltZW91dCwKLQkJCXVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQorYm9vbAorbm91dmVhdV93YWl0X2VxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ2NF90IHRpbWVvdXQsCisJCXVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICpwdGltZXIgPSAmZGV2X3ByaXYtPmVuZ2luZS50aW1lcjsKQEAgLTExMDIsMTAgKzExNzcsMzMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKy8qIFdhaXQgdW50aWwgKHZhbHVlKHJlZykgJiBtYXNrKSAhPSB2YWwsIHVwIHVudGlsIHRpbWVvdXQgaGFzIGhpdCAqLworYm9vbAorbm91dmVhdV93YWl0X25lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQ2NF90IHRpbWVvdXQsCisJCXVpbnQzMl90IHJlZywgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGltZXJfZW5naW5lICpwdGltZXIgPSAmZGV2X3ByaXYtPmVuZ2luZS50aW1lcjsKKwl1aW50NjRfdCBzdGFydCA9IHB0aW1lci0+cmVhZChkZXYpOworCisJZG8geworCQlpZiAoKG52X3JkMzIoZGV2LCByZWcpICYgbWFzaykgIT0gdmFsKQorCQkJcmV0dXJuIHRydWU7CisJfSB3aGlsZSAocHRpbWVyLT5yZWFkKGRldikgLSBzdGFydCA8IHRpbWVvdXQpOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKiBXYWl0cyBmb3IgUEdSQVBIIHRvIGdvIGNvbXBsZXRlbHkgaWRsZSAqLwogYm9vbCBub3V2ZWF1X3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlpZiAoIW52X3dhaXQoZGV2LCBOVjA0X1BHUkFQSF9TVEFUVVMsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDApKSB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBtYXNrID0gfjA7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkKKwkJbWFzayAmPSB+TlY0MF9QR1JBUEhfU1RBVFVTX1NZTkNfU1RBTEw7CisKKwlpZiAoIW52X3dhaXQoZGV2LCBOVjA0X1BHUkFQSF9TVEFUVVMsIG1hc2ssIDApKSB7CiAJCU5WX0VSUk9SKGRldiwgIlBHUkFQSCBpZGxlIHRpbWVkIG91dCB3aXRoIHN0YXR1cyAweCUwOHhcbiIsCiAJCQkgbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1NUQVRVUykpOwogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTBmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3V0aWwuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5vdXZlYXUgUHJvamVjdAorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKworI2luY2x1ZGUgIm5vdXZlYXVfdXRpbC5oIgorCitzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShub3V2ZWF1X3JhdGVsaW1pdF9zdGF0ZSwgMyAqIEhaLCAyMCk7CisKK3ZvaWQKK25vdXZlYXVfYml0ZmllbGRfcHJpbnQoY29uc3Qgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgKmJmLCB1MzIgdmFsdWUpCit7CisJd2hpbGUgKGJmLT5uYW1lKSB7CisJCWlmICh2YWx1ZSAmIGJmLT5tYXNrKSB7CisJCQlwcmludGsoIiAlcyIsIGJmLT5uYW1lKTsKKwkJCXZhbHVlICY9IH5iZi0+bWFzazsKKwkJfQorCisJCWJmKys7CisJfQorCisJaWYgKHZhbHVlKQorCQlwcmludGsoIiAodW5rbm93biBiaXRzIDB4JTA4eCkiLCB2YWx1ZSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfZW51bV9wcmludChjb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtICplbiwgdTMyIHZhbHVlKQoreworCXdoaWxlIChlbi0+bmFtZSkgeworCQlpZiAodmFsdWUgPT0gZW4tPnZhbHVlKSB7CisJCQlwcmludGsoIiVzIiwgZW4tPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisKKwkJZW4rKzsKKwl9CisKKwlwcmludGsoIih1bmtub3duIGVudW0gMHglMDh4KSIsIHZhbHVlKTsKK30KKworaW50Citub3V2ZWF1X3JhdGVsaW1pdCh2b2lkKQoreworCXJldHVybiBfX3JhdGVsaW1pdCgmbm91dmVhdV9yYXRlbGltaXRfc3RhdGUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV91dGlsLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNlYWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV91dGlsLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb3V2ZWF1IFByb2plY3QKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbAorICogcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSKFMpIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAqIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9VVElMX0hfXworI2RlZmluZSBfX05PVVZFQVVfVVRJTF9IX18KKworc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgeworCXUzMiBtYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9lbnVtIHsKKwl1MzIgdmFsdWU7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3ZvaWQgbm91dmVhdV9iaXRmaWVsZF9wcmludChjb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCAqLCB1MzIgdmFsdWUpOwordm9pZCBub3V2ZWF1X2VudW1fcHJpbnQoY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bSAqLCB1MzIgdmFsdWUpOworaW50IG5vdXZlYXVfcmF0ZWxpbWl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q4MmFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCisjaW5jbHVkZSAibm91dmVhdV92bS5oIgorCit2b2lkCitub3V2ZWF1X3ZtX21hcF9hdChzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgdTY0IGRlbHRhLCBzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bSA9IHZtYS0+dm07CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcjsKKwlpbnQgYmlnID0gdm1hLT5ub2RlLT50eXBlICE9IHZtLT5zcGdfc2hpZnQ7CisJdTMyIG9mZnNldCA9IHZtYS0+bm9kZS0+b2Zmc2V0ICsgKGRlbHRhID4+IDEyKTsKKwl1MzIgYml0cyA9IHZtYS0+bm9kZS0+dHlwZSAtIDEyOworCXUzMiBwZGUgID0gKG9mZnNldCA+PiB2bS0+cGd0X2JpdHMpIC0gdm0tPmZwZGU7CisJdTMyIHB0ZSAgPSAob2Zmc2V0ICYgKCgxIDw8IHZtLT5wZ3RfYml0cykgLSAxKSkgPj4gYml0czsKKwl1MzIgbWF4ICA9IDEgPDwgKHZtLT5wZ3RfYml0cyAtIGJpdHMpOworCXUzMiBlbmQsIGxlbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJnZyYW0tPnJlZ2lvbnMsIHJsX2VudHJ5KSB7CisJCXU2NCBwaHlzID0gKHU2NClyLT5vZmZzZXQgPDwgMTI7CisJCXUzMiBudW0gID0gci0+bGVuZ3RoID4+IGJpdHM7CisKKwkJd2hpbGUgKG51bSkgeworCQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QgPSB2bS0+cGd0W3BkZV0ub2JqW2JpZ107CisKKwkJCWVuZCA9IChwdGUgKyBudW0pOworCQkJaWYgKHVubGlrZWx5KGVuZCA+PSBtYXgpKQorCQkJCWVuZCA9IG1heDsKKwkJCWxlbiA9IGVuZCAtIHB0ZTsKKworCQkJdm0tPm1hcCh2bWEsIHBndCwgdnJhbSwgcHRlLCBsZW4sIHBoeXMpOworCisJCQludW0gLT0gbGVuOworCQkJcHRlICs9IGxlbjsKKwkJCWlmICh1bmxpa2VseShlbmQgPj0gbWF4KSkgeworCQkJCXBkZSsrOworCQkJCXB0ZSA9IDA7CisJCQl9CisJCX0KKwl9CisKKwl2bS0+Zmx1c2godm0pOworfQorCit2b2lkCitub3V2ZWF1X3ZtX21hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgc3RydWN0IG5vdXZlYXVfdnJhbSAqdnJhbSkKK3sKKwlub3V2ZWF1X3ZtX21hcF9hdCh2bWEsIDAsIHZyYW0pOworfQorCit2b2lkCitub3V2ZWF1X3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgdTY0IGRlbHRhLCB1NjQgbGVuZ3RoLAorCQkgIGRtYV9hZGRyX3QgKmxpc3QpCit7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gdm1hLT52bTsKKwlpbnQgYmlnID0gdm1hLT5ub2RlLT50eXBlICE9IHZtLT5zcGdfc2hpZnQ7CisJdTMyIG9mZnNldCA9IHZtYS0+bm9kZS0+b2Zmc2V0ICsgKGRlbHRhID4+IDEyKTsKKwl1MzIgYml0cyA9IHZtYS0+bm9kZS0+dHlwZSAtIDEyOworCXUzMiBudW0gID0gbGVuZ3RoID4+IHZtYS0+bm9kZS0+dHlwZTsKKwl1MzIgcGRlICA9IChvZmZzZXQgPj4gdm0tPnBndF9iaXRzKSAtIHZtLT5mcGRlOworCXUzMiBwdGUgID0gKG9mZnNldCAmICgoMSA8PCB2bS0+cGd0X2JpdHMpIC0gMSkpID4+IGJpdHM7CisJdTMyIG1heCAgPSAxIDw8ICh2bS0+cGd0X2JpdHMgLSBiaXRzKTsKKwl1MzIgZW5kLCBsZW47CisKKwl3aGlsZSAobnVtKSB7CisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0ID0gdm0tPnBndFtwZGVdLm9ialtiaWddOworCisJCWVuZCA9IChwdGUgKyBudW0pOworCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpCisJCQllbmQgPSBtYXg7CisJCWxlbiA9IGVuZCAtIHB0ZTsKKworCQl2bS0+bWFwX3NnKHZtYSwgcGd0LCBwdGUsIGxpc3QsIGxlbik7CisKKwkJbnVtICAtPSBsZW47CisJCXB0ZSAgKz0gbGVuOworCQlsaXN0ICs9IGxlbjsKKwkJaWYgKHVubGlrZWx5KGVuZCA+PSBtYXgpKSB7CisJCQlwZGUrKzsKKwkJCXB0ZSA9IDA7CisJCX0KKwl9CisKKwl2bS0+Zmx1c2godm0pOworfQorCit2b2lkCitub3V2ZWF1X3ZtX3VubWFwX2F0KHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCB1NjQgZGVsdGEsIHU2NCBsZW5ndGgpCit7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gdm1hLT52bTsKKwlpbnQgYmlnID0gdm1hLT5ub2RlLT50eXBlICE9IHZtLT5zcGdfc2hpZnQ7CisJdTMyIG9mZnNldCA9IHZtYS0+bm9kZS0+b2Zmc2V0ICsgKGRlbHRhID4+IDEyKTsKKwl1MzIgYml0cyA9IHZtYS0+bm9kZS0+dHlwZSAtIDEyOworCXUzMiBudW0gID0gbGVuZ3RoID4+IHZtYS0+bm9kZS0+dHlwZTsKKwl1MzIgcGRlICA9IChvZmZzZXQgPj4gdm0tPnBndF9iaXRzKSAtIHZtLT5mcGRlOworCXUzMiBwdGUgID0gKG9mZnNldCAmICgoMSA8PCB2bS0+cGd0X2JpdHMpIC0gMSkpID4+IGJpdHM7CisJdTMyIG1heCAgPSAxIDw8ICh2bS0+cGd0X2JpdHMgLSBiaXRzKTsKKwl1MzIgZW5kLCBsZW47CisKKwl3aGlsZSAobnVtKSB7CisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0ID0gdm0tPnBndFtwZGVdLm9ialtiaWddOworCisJCWVuZCA9IChwdGUgKyBudW0pOworCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpCisJCQllbmQgPSBtYXg7CisJCWxlbiA9IGVuZCAtIHB0ZTsKKworCQl2bS0+dW5tYXAocGd0LCBwdGUsIGxlbik7CisKKwkJbnVtIC09IGxlbjsKKwkJcHRlICs9IGxlbjsKKwkJaWYgKHVubGlrZWx5KGVuZCA+PSBtYXgpKSB7CisJCQlwZGUrKzsKKwkJCXB0ZSA9IDA7CisJCX0KKwl9CisKKwl2bS0+Zmx1c2godm0pOworfQorCit2b2lkCitub3V2ZWF1X3ZtX3VubWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hKQoreworCW5vdXZlYXVfdm1fdW5tYXBfYXQodm1hLCAwLCAodTY0KXZtYS0+bm9kZS0+bGVuZ3RoIDw8IDEyKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfdm1fdW5tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwgaW50IGJpZywgdTMyIGZwZGUsIHUzMiBscGRlKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKKwlzdHJ1Y3Qgbm91dmVhdV92bV9wZ3QgKnZwZ3Q7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3Q7CisJdTMyIHBkZTsKKworCWZvciAocGRlID0gZnBkZTsgcGRlIDw9IGxwZGU7IHBkZSsrKSB7CisJCXZwZ3QgPSAmdm0tPnBndFtwZGUgLSB2bS0+ZnBkZV07CisJCWlmICgtLXZwZ3QtPnJlZmNvdW50W2JpZ10pCisJCQljb250aW51ZTsKKworCQlwZ3QgPSB2cGd0LT5vYmpbYmlnXTsKKwkJdnBndC0+b2JqW2JpZ10gPSBOVUxMOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnBnZCwgJnZtLT5wZ2RfbGlzdCwgaGVhZCkgeworCQkJdm0tPm1hcF9wZ3QodnBnZC0+b2JqLCBwZGUsIHZwZ3QtPm9iaik7CisJCX0KKworCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBndCk7CisJCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCX0KK30KKworc3RhdGljIGludAorbm91dmVhdV92bV9tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwgdTMyIHBkZSwgdTMyIHR5cGUpCit7CisJc3RydWN0IG5vdXZlYXVfdm1fcGd0ICp2cGd0ID0gJnZtLT5wZ3RbcGRlIC0gdm0tPmZwZGVdOworCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndDsKKwlpbnQgYmlnID0gKHR5cGUgIT0gdm0tPnNwZ19zaGlmdCk7CisJdTMyIHBndF9zaXplOworCWludCByZXQ7CisKKwlwZ3Rfc2l6ZSAgPSAoMSA8PCAodm0tPnBndF9iaXRzICsgMTIpKSA+PiB0eXBlOworCXBndF9zaXplICo9IDg7CisKKwltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyh2bS0+ZGV2LCBOVUxMLCBwZ3Rfc2l6ZSwgMHgxMDAwLAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwZ3QpOworCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJLyogc29tZW9uZSBiZWF0IHVzIHRvIGZpbGxpbmcgdGhlIFBERSB3aGlsZSB3ZSBkaWRuJ3QgaGF2ZSB0aGUgbG9jayAqLworCWlmICh1bmxpa2VseSh2cGd0LT5yZWZjb3VudFtiaWddKyspKSB7CisJCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGd0KTsKKwkJbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXZwZ3QtPm9ialtiaWddID0gcGd0OworCWxpc3RfZm9yX2VhY2hfZW50cnkodnBnZCwgJnZtLT5wZ2RfbGlzdCwgaGVhZCkgeworCQl2bS0+bWFwX3BndCh2cGdkLT5vYmosIHBkZSwgdnBndC0+b2JqKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X3ZtX2dldChzdHJ1Y3Qgbm91dmVhdV92bSAqdm0sIHU2NCBzaXplLCB1MzIgcGFnZV9zaGlmdCwKKwkgICAgICAgdTMyIGFjY2Vzcywgc3RydWN0IG5vdXZlYXVfdm1hICp2bWEpCit7CisJdTMyIGFsaWduID0gKDEgPDwgcGFnZV9zaGlmdCkgPj4gMTI7CisJdTMyIG1zaXplID0gc2l6ZSA+PiAxMjsKKwl1MzIgZnBkZSwgbHBkZSwgcGRlOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwlyZXQgPSBub3V2ZWF1X21tX2dldCh2bS0+bW0sIHBhZ2Vfc2hpZnQsIG1zaXplLCAwLCBhbGlnbiwgJnZtYS0+bm9kZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgPj4gdm0tPnBndF9iaXRzKTsKKwlscGRlID0gKHZtYS0+bm9kZS0+b2Zmc2V0ICsgdm1hLT5ub2RlLT5sZW5ndGggLSAxKSA+PiB2bS0+cGd0X2JpdHM7CisJZm9yIChwZGUgPSBmcGRlOyBwZGUgPD0gbHBkZTsgcGRlKyspIHsKKwkJc3RydWN0IG5vdXZlYXVfdm1fcGd0ICp2cGd0ID0gJnZtLT5wZ3RbcGRlIC0gdm0tPmZwZGVdOworCQlpbnQgYmlnID0gKHZtYS0+bm9kZS0+dHlwZSAhPSB2bS0+c3BnX3NoaWZ0KTsKKworCQlpZiAobGlrZWx5KHZwZ3QtPnJlZmNvdW50W2JpZ10pKSB7CisJCQl2cGd0LT5yZWZjb3VudFtiaWddKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IG5vdXZlYXVfdm1fbWFwX3BndCh2bSwgcGRlLCB2bWEtPm5vZGUtPnR5cGUpOworCQlpZiAocmV0KSB7CisJCQlpZiAocGRlICE9IGZwZGUpCisJCQkJbm91dmVhdV92bV91bm1hcF9wZ3Qodm0sIGJpZywgZnBkZSwgcGRlIC0gMSk7CisJCQlub3V2ZWF1X21tX3B1dCh2bS0+bW0sIHZtYS0+bm9kZSk7CisJCQltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCQkJdm1hLT5ub2RlID0gTlVMTDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKworCXZtYS0+dm0gICAgID0gdm07CisJdm1hLT5vZmZzZXQgPSAodTY0KXZtYS0+bm9kZS0+b2Zmc2V0IDw8IDEyOworCXZtYS0+YWNjZXNzID0gYWNjZXNzOworCXJldHVybiAwOworfQorCit2b2lkCitub3V2ZWF1X3ZtX3B1dChzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSB2bWEtPnZtOworCXUzMiBmcGRlLCBscGRlOworCisJaWYgKHVubGlrZWx5KHZtYS0+bm9kZSA9PSBOVUxMKSkKKwkJcmV0dXJuOworCWZwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgPj4gdm0tPnBndF9iaXRzKTsKKwlscGRlID0gKHZtYS0+bm9kZS0+b2Zmc2V0ICsgdm1hLT5ub2RlLT5sZW5ndGggLSAxKSA+PiB2bS0+cGd0X2JpdHM7CisKKwltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwlub3V2ZWF1X3ZtX3VubWFwX3BndCh2bSwgdm1hLT5ub2RlLT50eXBlICE9IHZtLT5zcGdfc2hpZnQsIGZwZGUsIGxwZGUpOworCW5vdXZlYXVfbW1fcHV0KHZtLT5tbSwgdm1hLT5ub2RlKTsKKwl2bWEtPm5vZGUgPSBOVUxMOworCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7Cit9CisKK2ludAorbm91dmVhdV92bV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCwgdTY0IG1tX29mZnNldCwKKwkgICAgICAgc3RydWN0IG5vdXZlYXVfdm0gKipwdm0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm07CisJdTY0IG1tX2xlbmd0aCA9IChvZmZzZXQgKyBsZW5ndGgpIC0gbW1fb2Zmc2V0OworCXUzMiBibG9jaywgcGd0X2JpdHM7CisJaW50IHJldDsKKworCXZtID0ga3phbGxvYyhzaXplb2YoKnZtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2bSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQl2bS0+bWFwX3BndCA9IG52NTBfdm1fbWFwX3BndDsKKwkJdm0tPm1hcCA9IG52NTBfdm1fbWFwOworCQl2bS0+bWFwX3NnID0gbnY1MF92bV9tYXBfc2c7CisJCXZtLT51bm1hcCA9IG52NTBfdm1fdW5tYXA7CisJCXZtLT5mbHVzaCA9IG52NTBfdm1fZmx1c2g7CisJCXZtLT5zcGdfc2hpZnQgPSAxMjsKKwkJdm0tPmxwZ19zaGlmdCA9IDE2OworCisJCXBndF9iaXRzID0gMjk7CisJCWJsb2NrID0gKDEgPDwgcGd0X2JpdHMpOworCQlpZiAobGVuZ3RoIDwgYmxvY2spCisJCQlibG9jayA9IGxlbmd0aDsKKworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WX0MwKSB7CisJCXZtLT5tYXBfcGd0ID0gbnZjMF92bV9tYXBfcGd0OworCQl2bS0+bWFwID0gbnZjMF92bV9tYXA7CisJCXZtLT5tYXBfc2cgPSBudmMwX3ZtX21hcF9zZzsKKwkJdm0tPnVubWFwID0gbnZjMF92bV91bm1hcDsKKwkJdm0tPmZsdXNoID0gbnZjMF92bV9mbHVzaDsKKwkJdm0tPnNwZ19zaGlmdCA9IDEyOworCQl2bS0+bHBnX3NoaWZ0ID0gMTc7CisJCXBndF9iaXRzID0gMjc7CisKKwkJLyogU2hvdWxkIGJlIDQwOTYgZXZlcnl3aGVyZSwgdGhpcyBpcyBhIGhhY2sgdGhhdCdzCisJCSAqIGN1cnJlbnRseSBuZWNlc3NhcnkgdG8gYXZvaWQgYW4gZWx1c2l2ZSBidWcgdGhhdAorCQkgKiBjYXVzZXMgY29ycnVwdGlvbiB3aGVuIG1peGluZyBzbWFsbC9sYXJnZSBwYWdlcworCQkgKi8KKwkJaWYgKGxlbmd0aCA8ICgxVUxMIDw8IDQwKSkKKwkJCWJsb2NrID0gNDA5NjsKKwkJZWxzZSB7CisJCQlibG9jayA9ICgxIDw8IHBndF9iaXRzKTsKKwkJCWlmIChsZW5ndGggPCBibG9jaykKKwkJCQlibG9jayA9IGxlbmd0aDsKKwkJfQorCX0gZWxzZSB7CisJCWtmcmVlKHZtKTsKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJdm0tPmZwZGUgICA9IG9mZnNldCA+PiBwZ3RfYml0czsKKwl2bS0+bHBkZSAgID0gKG9mZnNldCArIGxlbmd0aCAtIDEpID4+IHBndF9iaXRzOworCXZtLT5wZ3QgPSBrY2FsbG9jKHZtLT5scGRlIC0gdm0tPmZwZGUgKyAxLCBzaXplb2YoKnZtLT5wZ3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZtLT5wZ3QpIHsKKwkJa2ZyZWUodm0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmdm0tPnBnZF9saXN0KTsKKwl2bS0+ZGV2ID0gZGV2OworCXZtLT5yZWZjb3VudCA9IDE7CisJdm0tPnBndF9iaXRzID0gcGd0X2JpdHMgLSAxMjsKKworCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmdm0tPm1tLCBtbV9vZmZzZXQgPj4gMTIsIG1tX2xlbmd0aCA+PiAxMiwKKwkJCSAgICAgIGJsb2NrID4+IDEyKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHZtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqcHZtID0gdm07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfdm1fbGluayhzdHJ1Y3Qgbm91dmVhdV92bSAqdm0sIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKKwlpbnQgaTsKKworCWlmICghcGdkKQorCQlyZXR1cm4gMDsKKworCXZwZ2QgPSBremFsbG9jKHNpemVvZigqdnBnZCksIEdGUF9LRVJORUwpOworCWlmICghdnBnZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub3V2ZWF1X2dwdW9ial9yZWYocGdkLCAmdnBnZC0+b2JqKTsKKworCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCWZvciAoaSA9IHZtLT5mcGRlOyBpIDw9IHZtLT5scGRlOyBpKyspCisJCXZtLT5tYXBfcGd0KHBnZCwgaSwgdm0tPnBndFtpIC0gdm0tPmZwZGVdLm9iaik7CisJbGlzdF9hZGQoJnZwZ2QtPmhlYWQsICZ2bS0+cGdkX2xpc3QpOworCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3ZtX3VubGluayhzdHJ1Y3Qgbm91dmVhdV92bSAqdm0sIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZCwgKnRtcDsKKworCWlmICghcGdkKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnBnZCwgdG1wLCAmdm0tPnBnZF9saXN0LCBoZWFkKSB7CisJCWlmICh2cGdkLT5vYmogIT0gcGdkKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwoJnZwZ2QtPmhlYWQpOworCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnZwZ2QtPm9iaik7CisJCWtmcmVlKHZwZ2QpOworCX0KKwltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV92bV9kZWwoc3RydWN0IG5vdXZlYXVfdm0gKnZtKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZCwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2cGdkLCB0bXAsICZ2bS0+cGdkX2xpc3QsIGhlYWQpIHsKKwkJbm91dmVhdV92bV91bmxpbmsodm0sIHZwZ2QtPm9iaik7CisJfQorCVdBUk5fT04obm91dmVhdV9tbV9maW5pKCZ2bS0+bW0pICE9IDApOworCisJa2ZyZWUodm0tPnBndCk7CisJa2ZyZWUodm0pOworfQorCitpbnQKK25vdXZlYXVfdm1fcmVmKHN0cnVjdCBub3V2ZWF1X3ZtICpyZWYsIHN0cnVjdCBub3V2ZWF1X3ZtICoqcHRyLAorCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm07CisJaW50IHJldDsKKworCXZtID0gcmVmOworCWlmICh2bSkgeworCQlyZXQgPSBub3V2ZWF1X3ZtX2xpbmsodm0sIHBnZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXZtLT5yZWZjb3VudCsrOworCX0KKworCXZtID0gKnB0cjsKKwkqcHRyID0gcmVmOworCisJaWYgKHZtKSB7CisJCW5vdXZlYXVfdm1fdW5saW5rKHZtLCBwZ2QpOworCisJCWlmICgtLXZtLT5yZWZjb3VudCA9PSAwKQorCQkJbm91dmVhdV92bV9kZWwodm0pOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTkzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfVk1fSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9WTV9IX18KKworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorCitzdHJ1Y3Qgbm91dmVhdV92bV9wZ3QgeworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqWzJdOworCXUzMiByZWZjb3VudFsyXTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3ZtX3BnZCB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqOworfTsKKworc3RydWN0IG5vdXZlYXVfdm1hIHsKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm07CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqbm9kZTsKKwl1NjQgb2Zmc2V0OworCXUzMiBhY2Nlc3M7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV92bSB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW07CisJaW50IHJlZmNvdW50OworCisJc3RydWN0IGxpc3RfaGVhZCBwZ2RfbGlzdDsKKwlhdG9taWNfdCBwZ3JhcGhfcmVmczsKKwlhdG9taWNfdCBwY3J5cHRfcmVmczsKKworCXN0cnVjdCBub3V2ZWF1X3ZtX3BndCAqcGd0OworCXUzMiBmcGRlOworCXUzMiBscGRlOworCisJdTMyIHBndF9iaXRzOworCXU4ICBzcGdfc2hpZnQ7CisJdTggIGxwZ19zaGlmdDsKKworCXZvaWQgKCptYXBfcGd0KShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCwgdTMyIHBkZSwKKwkJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0WzJdKTsKKwl2b2lkICgqbWFwKShzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV92cmFtICosIHUzMiBwdGUsIHUzMiBjbnQsIHU2NCBwaHlzKTsKKwl2b2lkICgqbWFwX3NnKShzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCSAgICAgICB1MzIgcHRlLCBkbWFfYWRkcl90ICosIHUzMiBjbnQpOworCXZvaWQgKCp1bm1hcCkoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QsIHUzMiBwdGUsIHUzMiBjbnQpOworCXZvaWQgKCpmbHVzaCkoc3RydWN0IG5vdXZlYXVfdm0gKik7Cit9OworCisvKiBub3V2ZWF1X3ZtLmMgKi8KK2ludCAgbm91dmVhdV92bV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCwgdTY0IG1tX29mZnNldCwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X3ZtICoqKTsKK2ludCAgbm91dmVhdV92bV9yZWYoc3RydWN0IG5vdXZlYXVfdm0gKiwgc3RydWN0IG5vdXZlYXVfdm0gKiosCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCk7CitpbnQgIG5vdXZlYXVfdm1fZ2V0KHN0cnVjdCBub3V2ZWF1X3ZtICosIHU2NCBzaXplLCB1MzIgcGFnZV9zaGlmdCwKKwkJICAgIHUzMiBhY2Nlc3MsIHN0cnVjdCBub3V2ZWF1X3ZtYSAqKTsKK3ZvaWQgbm91dmVhdV92bV9wdXQoc3RydWN0IG5vdXZlYXVfdm1hICopOwordm9pZCBub3V2ZWF1X3ZtX21hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKTsKK3ZvaWQgbm91dmVhdV92bV9tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICosIHU2NCBvZmZzZXQsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKik7Cit2b2lkIG5vdXZlYXVfdm1fdW5tYXAoc3RydWN0IG5vdXZlYXVfdm1hICopOwordm9pZCBub3V2ZWF1X3ZtX3VubWFwX2F0KHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCB1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoKTsKK3ZvaWQgbm91dmVhdV92bV9tYXBfc2coc3RydWN0IG5vdXZlYXVfdm1hICosIHU2NCBvZmZzZXQsIHU2NCBsZW5ndGgsCisJCSAgICAgICBkbWFfYWRkcl90ICopOworCisvKiBudjUwX3ZtLmMgKi8KK3ZvaWQgbnY1MF92bV9tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkLCB1MzIgcGRlLAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0WzJdKTsKK3ZvaWQgbnY1MF92bV9tYXAoc3RydWN0IG5vdXZlYXVfdm1hICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAorCQkgc3RydWN0IG5vdXZlYXVfdnJhbSAqLCB1MzIgcHRlLCB1MzIgY250LCB1NjQgcGh5cyk7Cit2b2lkIG52NTBfdm1fbWFwX3NnKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJICAgIHUzMiBwdGUsIGRtYV9hZGRyX3QgKiwgdTMyIGNudCk7Cit2b2lkIG52NTBfdm1fdW5tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosIHUzMiBwdGUsIHUzMiBjbnQpOwordm9pZCBudjUwX3ZtX2ZsdXNoKHN0cnVjdCBub3V2ZWF1X3ZtICopOwordm9pZCBudjUwX3ZtX2ZsdXNoX2VuZ2luZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgZW5naW5lKTsKKworLyogbnZjMF92bS5jICovCit2b2lkIG52YzBfdm1fbWFwX3BndChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCwgdTMyIHBkZSwKKwkJICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndFsyXSk7Cit2b2lkIG52YzBfdm1fbWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiwgdTMyIHB0ZSwgdTMyIGNudCwgdTY0IHBoeXMpOwordm9pZCBudmMwX3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCSAgICB1MzIgcHRlLCBkbWFfYWRkcl90ICosIHUzMiBjbnQpOwordm9pZCBudmMwX3ZtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgcHRlLCB1MzIgY250KTsKK3ZvaWQgbnZjMF92bV9mbHVzaChzdHJ1Y3Qgbm91dmVhdV92bSAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jCmluZGV4IDQwZTE4MDcuLjI5NzUwNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jCkBAIC01NTEsNyArNTUxLDEwIEBACiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMzApCiAJCXJlZ3AtPmdwaW9fZXh0ID0gTlZSZWFkQ1JUQyhkZXYsIDAsIE5WX1BDUlRDX0dQSU9fRVhUKTsKIAotCXJlZ3AtPmNydGNfY2ZnID0gTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkM7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTApCisJCXJlZ3AtPmNydGNfY2ZnID0gTlYxMF9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQzsKKwllbHNlCisJCXJlZ3AtPmNydGNfY2ZnID0gTlYwNF9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQzsKIAogCS8qIFNvbWUgbWlzYyByZWdzICovCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNDApIHsKQEAgLTY2OSw2ICs2NzIsNyBAQAogCWlmIChudl90d29faGVhZHMoZGV2KSkKIAkJTlZTZXRPd25lcihkZXYsIG52X2NydGMtPmluZGV4KTsKIAorCWRybV92YmxhbmtfcHJlX21vZGVzZXQoZGV2LCBudl9jcnRjLT5pbmRleCk7CiAJZnVuY3MtPmRwbXMoY3J0YywgRFJNX01PREVfRFBNU19PRkYpOwogCiAJTlZCbGFua1NjcmVlbihkZXYsIG52X2NydGMtPmluZGV4LCB0cnVlKTsKQEAgLTcwMSw2ICs3MDUsNyBAQAogI2VuZGlmCiAKIAlmdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKKwlkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChkZXYsIG52X2NydGMtPmluZGV4KTsKIH0KIAogc3RhdGljIHZvaWQgbnZfY3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKQEAgLTk4Niw2ICs5OTEsNyBAQAogCS5jdXJzb3JfbW92ZSA9IG52MDRfY3J0Y19jdXJzb3JfbW92ZSwKIAkuZ2FtbWFfc2V0ID0gbnZfY3J0Y19nYW1tYV9zZXQsCiAJLnNldF9jb25maWcgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKKwkucGFnZV9mbGlwID0gbm91dmVhdV9jcnRjX3BhZ2VfZmxpcCwKIAkuZGVzdHJveSA9IG52X2NydGNfZGVzdHJveSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RhYy5jCmluZGV4IGJhNjQyM2YuLmUwMDA0NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYwpAQCAtNzQsMTQgKzc0LDE0IEBACiAJCSAqIHVzZSBhIDEwbXMgdGltZW91dCAoZ3VhcmRzIGFnYWluc3QgY3J0YyBiZWluZyBpbmFjdGl2ZSwgaW4KIAkJICogd2hpY2ggY2FzZSBibGFuayBzdGF0ZSB3b3VsZCBuZXZlciBjaGFuZ2UpCiAJCSAqLwotCQlpZiAoIW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCi0JCQkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQorCQlpZiAoIW5vdXZlYXVfd2FpdF9lcShkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCisJCQkJICAgICAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKIAkJCXJldHVybiAtRUJVU1k7Ci0JCWlmICghbm91dmVhdV93YWl0X3VudGlsKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKLQkJCQkJMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSkpCisJCWlmICghbm91dmVhdV93YWl0X2VxKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKKwkJCQkgICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKCFub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAotCQkJCQkweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKKwkJaWYgKCFub3V2ZWF1X3dhaXRfZXEoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAorCQkJCSAgICAgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCiAJCQlyZXR1cm4gLUVCVVNZOwogCiAJCXVkZWxheSgxMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwppbmRleCA5ZTI4Y2Y3Li4xNzE1ZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYwpAQCAtMzIsNiArMzIsOSBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZW5jb2Rlci5oIgogI2luY2x1ZGUgIm5vdXZlYXVfY29ubmVjdG9yLmgiCiAKK3N0YXRpYyB2b2lkIG52MDRfdmJsYW5rX2NydGMwX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIG52MDRfdmJsYW5rX2NydGMxX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwogc3RhdGljIHZvaWQKIG52MDRfZGlzcGxheV9zdG9yZV9pbml0aWFsX2hlYWRfb3duZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTE5Nyw2ICsyMDAsOCBAQAogCQlmdW5jLT5zYXZlKGVuY29kZXIpOwogCX0KIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMjQsIG52MDRfdmJsYW5rX2NydGMwX2lzcik7CisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNSwgbnYwNF92YmxhbmtfY3J0YzFfaXNyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA4LDYgKzIxMyw5IEBACiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAorCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAyNCk7CisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDI1KTsKKwogCS8qIFR1cm4gZXZlcnkgQ1JUQyBvZmYuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnRjLCAmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKIAkJc3RydWN0IGRybV9tb2RlX3NldCBtb2Rlc2V0ID0gewpAQCAtMjU4LDMgKzI2NiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAorbnYwNF92YmxhbmtfY3J0YzBfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIE5WX0NSVEMwX0lOVFNUQVQsIE5WX0NSVENfSU5UUl9WQkxBTkspOworCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjA0X3ZibGFua19jcnRjMV9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlZfQ1JUQzFfSU5UU1RBVCwgTlZfQ1JUQ19JTlRSX1ZCTEFOSyk7CisJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmJjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmJjb24uYwppbmRleCAzM2U0YzkzLi43YTExODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiY29uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYmNvbi5jCkBAIC0yOCw1MiArMjgsMzkgQEAKICNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCiAjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgogCi12b2lkCitpbnQKIG52MDRfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKQogewogCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCWludCByZXQ7CiAKLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybjsKLQotCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgNCkpIHsKLQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7Ci0JCWNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJJbWFnZUJsaXQsIDB4MDMwMCwgMyk7CiAJT1VUX1JJTkcoY2hhbiwgKHJlZ2lvbi0+c3kgPDwgMTYpIHwgcmVnaW9uLT5zeCk7CiAJT1VUX1JJTkcoY2hhbiwgKHJlZ2lvbi0+ZHkgPDwgMTYpIHwgcmVnaW9uLT5keCk7CiAJT1VUX1JJTkcoY2hhbiwgKHJlZ2lvbi0+aGVpZ2h0IDw8IDE2KSB8IHJlZ2lvbi0+d2lkdGgpOwogCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZAoraW50CiBudjA0X2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCiB7CiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCA3KSkgewotCQlub3V2ZWF1X2ZiY29uX2dwdV9sb2NrdXAoaW5mbyk7Ci0JfQotCi0JaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKLQkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJHZGlSZWN0LCAweDAyZmMsIDEpOwogCU9VVF9SSU5HKGNoYW4sIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpID8gMSA6IDMpOwpAQCAtODcsOSArNzQsMTAgQEAKIAlPVVRfUklORyhjaGFuLCAocmVjdC0+ZHggPDwgMTYpIHwgcmVjdC0+ZHkpOwogCU9VVF9SSU5HKGNoYW4sIChyZWN0LT53aWR0aCA8PCAxNikgfCByZWN0LT5oZWlnaHQpOwogCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZAoraW50CiBudjA0X2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOwpAQCAtMTAxLDIzICs4OSwxNCBAQAogCXVpbnQzMl90IGRzaXplOwogCXVpbnQzMl90IHdpZHRoOwogCXVpbnQzMl90ICpkYXRhID0gKHVpbnQzMl90ICopaW1hZ2UtPmRhdGE7CisJaW50IHJldDsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuOworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoaW1hZ2UtPmRlcHRoICE9IDEpIHsKLQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDgpKSB7Ci0JCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKLQl9Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgewotCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKLQkJcmV0dXJuOwotCX0KKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAl3aWR0aCA9IEFMSUdOKGltYWdlLT53aWR0aCwgOCk7CiAJZHNpemUgPSBBTElHTih3aWR0aCAqIGltYWdlLT5oZWlnaHQsIDMyKSA+PiA1OwpAQCAtMTQ0LDExICsxMjMsOSBAQAogCXdoaWxlIChkc2l6ZSkgewogCQlpbnQgaXRlcl9sZW4gPSBkc2l6ZSA+IDEyOCA/IDEyOCA6IGRzaXplOwogCi0JCWlmIChSSU5HX1NQQUNFKGNoYW4sIGl0ZXJfbGVuICsgMSkpIHsKLQkJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKLQkJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOwotCQkJcmV0dXJuOwotCQl9CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgaXRlcl9sZW4gKyAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MGMwMCwgaXRlcl9sZW4pOwogCQlPVVRfUklOR3AoY2hhbiwgZGF0YSwgaXRlcl9sZW4pOwpAQCAtMTU3LDIyICsxMzQsNyBAQAogCX0KIAogCUZJUkVfUklORyhjaGFuKTsKLX0KLQotc3RhdGljIGludAotbnYwNF9mYmNvbl9ncm9ial9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNsYXNzLCB1aW50MzJfdCBoYW5kbGUpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgY2xhc3MsICZvYmopOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChkZXZfcHJpdi0+Y2hhbm5lbCwgaGFuZGxlLCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBpbnQKQEAgLTIxNCwyOSArMTc2LDMxIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCA/Ci0JCQkJICAgMHgwMDYyIDogMHgwMDQyLCBOdkN0eFN1cmYyRCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52Q3R4U3VyZjJELAorCQkJCSAgICBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwID8KKwkJCQkgICAgMHgwMDYyIDogMHgwMDQyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwMTksIE52Q2xpcFJlY3QpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBOdkNsaXBSZWN0LCAweDAwMTkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDA0MywgTnZSb3ApOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBOdlJvcCwgMHgwMDQzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwNDQsIE52SW1hZ2VQYXR0KTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZJbWFnZVBhdHQsIDB4MDA0NCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgMHgwMDRhLCBOdkdkaVJlY3QpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBOdkdkaVJlY3QsIDB4MDA0YSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxMSA/Ci0JCQkJICAgMHgwMDlmIDogMHgwMDVmLCBOdkltYWdlQmxpdCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52SW1hZ2VCbGl0LAorCQkJCSAgICBkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDExID8KKwkJCQkgICAgMHgwMDlmIDogMHgwMDVmKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmlmby5jCmluZGV4IDcwODI5M2IuLmY4OWQxMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmlmby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmlmby5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCiAKICNkZWZpbmUgTlYwNF9SQU1GQyhjKSAoZGV2X3ByaXYtPnJhbWZjLT5waW5zdCArICgoYykgKiBOVjA0X1JBTUZDX19TSVpFKSkKICNkZWZpbmUgTlYwNF9SQU1GQ19fU0laRSAzMgpAQCAtMTI4LDYgKzEyOSwxMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwljaGFuLT51c2VyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArCisJCQkgICAgIE5WMDNfVVNFUihjaGFuLT5pZCksIFBBR0VfU0laRSk7CisJaWYgKCFjaGFuLT51c2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogCiAJLyogU2V0dXAgaW5pdGlhbCBzdGF0ZSAqLwpAQCAtMTUxLDEwICsxNTcsMzEgQEAKIG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKLQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CiAKKwkvKiBVbmxvYWQgdGhlIGNvbnRleHQgaWYgaXQncyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAocGZpZm8tPmNoYW5uZWxfaWQoZGV2KSA9PSBjaGFuLT5pZCkgeworCQlwZmlmby0+ZGlzYWJsZShkZXYpOworCQlwZmlmby0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKwkJcGZpZm8tPmVuYWJsZShkZXYpOworCX0KKworCS8qIEtlZXAgaXQgZnJvbSBiZWluZyByZXNjaGVkdWxlZCAqLworCW52X21hc2soZGV2LCBOVjA0X1BGSUZPX01PREUsIDEgPDwgY2hhbi0+aWQsIDApOworCisJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKworCS8qIEZyZWUgdGhlIGNoYW5uZWwgcmVzb3VyY2VzICovCisJaWYgKGNoYW4tPnVzZXIpIHsKKwkJaW91bm1hcChjaGFuLT51c2VyKTsKKwkJY2hhbi0+dXNlciA9IE5VTEw7CisJfQogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtZmMpOwogfQogCkBAIC0yMDgsNyArMjM1LDcgQEAKIAlpZiAoY2hpZCA8IDAgfHwgY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCiAJCXJldHVybiAwOwogCi0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIAlpZiAoIWNoYW4pIHsKIAkJTlZfRVJST1IoZGV2LCAiSW5hY3RpdmUgY2hhbm5lbCBvbiBQRklGTzogJWRcbiIsIGNoaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI2Nyw2ICsyOTQsNyBAQAogc3RhdGljIHZvaWQKIG52MDRfZmlmb19pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDgsIG52MDRfZmlmb19pc3IpOwogCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKIH0KQEAgLTI4OSw3ICszMTcsNyBAQAogCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOwogCiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pIHsKKwkJaWYgKGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0pIHsKIAkJCXVpbnQzMl90IG1vZGUgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKTsKIAkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsIG1vZGUgfCAoMSA8PCBpKSk7CiAJCX0KQEAgLTI5OCwzICszMjYsMjA3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQKK252MDRfZmlmb19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4MjE0MCwgMHgwMDAwMDAwMCk7CisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDgpOworfQorCitzdGF0aWMgYm9vbAorbm91dmVhdV9maWZvX3N3bXRoZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgY2hpZCwgdTMyIGFkZHIsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCBpbnQgc3ViYyA9IChhZGRyID4+IDEzKSAmIDB4NzsKKwljb25zdCBpbnQgbXRoZCA9IGFkZHIgJiAweDFmZmM7CisJYm9vbCBoYW5kbGVkID0gZmFsc2U7CisJdTMyIGVuZ2luZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoY2hpZCA+PSAwICYmIGNoaWQgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpKQorCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKKwlpZiAodW5saWtlbHkoIWNoYW4pKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAobXRoZCkgeworCWNhc2UgMHgwMDAwOiAvKiBiaW5kIG9iamVjdCB0byBzdWJjaGFubmVsICovCisJCW9iaiA9IG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBkYXRhKTsKKwkJaWYgKHVubGlrZWx5KCFvYmogfHwgb2JqLT5lbmdpbmUgIT0gTlZPQkpfRU5HSU5FX1NXKSkKKwkJCWJyZWFrOworCisJCWNoYW4tPnN3X3N1YmNoYW5uZWxbc3ViY10gPSBvYmotPmNsYXNzOworCQllbmdpbmUgPSAweDAwMDAwMDBmIDw8IChzdWJjICogNCk7CisKKwkJbnZfbWFzayhkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgZW5naW5lLCAweDAwMDAwMDAwKTsKKwkJaGFuZGxlZCA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVuZ2luZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpOworCQlpZiAodW5saWtlbHkoKChlbmdpbmUgPj4gKHN1YmMgKiA0KSkgJiAweGYpICE9IDApKQorCQkJYnJlYWs7CisKKwkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwoY2hhbiwgY2hhbi0+c3dfc3ViY2hhbm5lbFtzdWJjXSwKKwkJCQkJICAgICAgbXRoZCwgZGF0YSkpCisJCQloYW5kbGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKwordm9pZAorbnYwNF9maWZvX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwl1aW50MzJfdCBzdGF0dXMsIHJlYXNzaWduOworCWludCBjbnQgPSAwOworCisJcmVhc3NpZ24gPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRVMpICYgMTsKKwl3aGlsZSAoKHN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCkpICYmIChjbnQrKyA8IDEwMCkpIHsKKwkJdWludDMyX3QgY2hpZCwgZ2V0OworCisJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgMCk7CisKKwkJY2hpZCA9IGVuZ2luZS0+Zmlmby5jaGFubmVsX2lkKGRldik7CisJCWdldCAgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VUKTsKKworCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUikgeworCQkJdWludDMyX3QgbXRoZCwgZGF0YTsKKwkJCWludCBwdHI7CisKKwkJCS8qIE5WX1BGSUZPX0NBQ0hFMV9HRVQgYWN0dWFsbHkgZ29lcyB0byAweGZmYyBiZWZvcmUKKwkJCSAqIHdyYXBwaW5nIG9uIG15IEc4MCBjaGlwcywgYnV0IENBQ0hFMSBpc24ndCBiaWcKKwkJCSAqIGVub3VnaCBmb3IgdGhpcyBtdWNoIGRhdGEuLiBUZXN0cyBzaG93IHRoYXQgaXQKKwkJCSAqIHdyYXBzIGFyb3VuZCB0byB0aGUgc3RhcnQgYXQgR0VUPTB4ODAwLi4gTm8gY2x1ZQorCQkJICogYXMgdG8gd2h5Li4KKwkJCSAqLworCQkJcHRyID0gKGdldCAmIDB4N2ZmKSA+PiAyOworCisJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKSB7CisJCQkJbXRoZCA9IG52X3JkMzIoZGV2LAorCQkJCQlOVjA0X1BGSUZPX0NBQ0hFMV9NRVRIT0QocHRyKSk7CisJCQkJZGF0YSA9IG52X3JkMzIoZGV2LAorCQkJCQlOVjA0X1BGSUZPX0NBQ0hFMV9EQVRBKHB0cikpOworCQkJfSBlbHNlIHsKKwkJCQltdGhkID0gbnZfcmQzMihkZXYsCisJCQkJCU5WNDBfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpKTsKKwkJCQlkYXRhID0gbnZfcmQzMihkZXYsCisJCQkJCU5WNDBfUEZJRk9fQ0FDSEUxX0RBVEEocHRyKSk7CisJCQl9CisKKwkJCWlmICghbm91dmVhdV9maWZvX3N3bXRoZChkZXYsIGNoaWQsIG10aGQsIGRhdGEpKSB7CisJCQkJTlZfSU5GTyhkZXYsICJQRklGT19DQUNIRV9FUlJPUiAtIENoICVkLyVkICIKKwkJCQkJICAgICAiTXRoZCAweCUwNHggRGF0YSAweCUwOHhcbiIsCisJCQkJCWNoaWQsIChtdGhkID4+IDEzKSAmIDcsIG10aGQgJiAweDFmZmMsCisJCQkJCWRhdGEpOworCQkJfQorCisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDApOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAorCQkJCQkJTlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUik7CisKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKKwkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApICYgfjEpOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsCisJCQkJbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwKSB8IDEpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0hBU0gsIDApOworCisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsCisJCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIKSB8IDEpOworCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwLCAxKTsKKworCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUikgeworCQkJdTMyIGRtYV9nZXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDQpOworCQkJdTMyIGRtYV9wdXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDApOworCQkJdTMyIHB1c2ggPSBudl9yZDMyKGRldiwgMHgwMDMyMjApOworCQkJdTMyIHN0YXRlID0gbnZfcmQzMihkZXYsIDB4MDAzMjI4KTsKKworCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJCQl1MzIgaG9fZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzI4KTsKKwkJCQl1MzIgaG9fcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzIwKTsKKwkJCQl1MzIgaWJfZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzM0KTsKKwkJCQl1MzIgaWJfcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzMwKTsKKworCQkJCWlmIChub3V2ZWF1X3JhdGVsaW1pdCgpKQorCQkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDJ4JTA4eCAiCisJCQkJCSAgICAgIlB1dCAweCUwMnglMDh4IEliR2V0IDB4JTA4eCBJYlB1dCAweCUwOHggIgorCQkJCQkgICAgICJTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCisJCQkJCQljaGlkLCBob19nZXQsIGRtYV9nZXQsIGhvX3B1dCwKKwkJCQkJCWRtYV9wdXQsIGliX2dldCwgaWJfcHV0LCBzdGF0ZSwKKwkJCQkJCXB1c2gpOworCisJCQkJLyogTUVUSE9EX0NPVU5ULCBpbiBETUFfU1RBVEUgb24gZWFybGllciBjaGlwc2V0cyAqLworCQkJCW52X3dyMzIoZGV2LCAweDAwMzM2NCwgMHgwMDAwMDAwMCk7CisJCQkJaWYgKGRtYV9nZXQgIT0gZG1hX3B1dCB8fCBob19nZXQgIT0gaG9fcHV0KSB7CisJCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7CisJCQkJCW52X3dyMzIoZGV2LCAweDAwMzMyOCwgaG9fcHV0KTsKKwkJCQl9IGVsc2UKKwkJCQlpZiAoaWJfZ2V0ICE9IGliX3B1dCkgeworCQkJCQludl93cjMyKGRldiwgMHgwMDMzMzQsIGliX3B1dCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDh4ICIKKwkJCQkJICAgICAiUHV0IDB4JTA4eCBTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCisJCQkJCWNoaWQsIGRtYV9nZXQsIGRtYV9wdXQsIHN0YXRlLCBwdXNoKTsKKworCQkJCWlmIChkbWFfZ2V0ICE9IGRtYV9wdXQpCisJCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7CisJCQl9CisKKwkJCW52X3dyMzIoZGV2LCAweDAwMzIyOCwgMHgwMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMDEpOworCQkJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCBOVl9QRklGT19JTlRSX0RNQV9QVVNIRVIpOworCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0RNQV9QVVNIRVI7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUpIHsKKwkJCXVpbnQzMl90IHNlbTsKKworCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX1NFTUFQSE9SRTsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwKKwkJCQlOVl9QRklGT19JTlRSX1NFTUFQSE9SRSk7CisKKwkJCXNlbSA9IG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpOworCQkJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgc2VtIHwgMHgxKTsKKworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOworCQl9CisKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKKwkJCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7CisJCQkJbnY1MF9mYl92bV90cmFwKGRldiwgMSwgIlBGSUZPX0JBUl9GQVVMVCIpOworCQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKKwkJCQludl93cjMyKGRldiwgMHgwMDIxMDAsIDB4MDAwMDAwMTApOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCisJCQkJTlZfSU5GTyhkZXYsICJQRklGT19JTlRSIDB4JTA4eCAtIENoICVkXG4iLAorCQkJCQlzdGF0dXMsIGNoaWQpOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLCBzdGF0dXMpOworCQkJc3RhdHVzID0gMDsKKwkJfQorCisJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgcmVhc3NpZ24pOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJTlZfSU5GTyhkZXYsICJQRklGTyBzdGlsbCBhbmdyeSBhZnRlciAlZCBzcGlucywgaGFsdFxuIiwgY250KTsKKwkJbnZfd3IzMihkZXYsIDB4MjE0MCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDE0MCwgMCk7CisJfQorCisJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCwgTlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYwppbmRleCBjODk3MzQyLi5hZjc1MDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9ncmFwaC5jCkBAIC0yNiw2ICsyNiwxMSBAQAogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCisKK3N0YXRpYyBpbnQgIG52MDRfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBudjA0X2dyYXBoX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogc3RhdGljIHVpbnQzMl90IG52MDRfZ3JhcGhfY3R4X3JlZ3NbXSA9IHsKIAkweDAwNDAwNTNjLApAQCAtMzU3LDEwICszNjIsMTAgQEAKIAlpZiAoY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwlyZXR1cm4gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzY4LDcgKzM3Myw2IEBACiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CiAJaW50IGNoaWQ7CiAKLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOwogCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOwogCiAJLyogSWYgcHJldmlvdXMgY29udGV4dCBpcyB2YWxpZCwgd2UgbmVlZCB0byBzYXZlIGl0ICovCkBAIC0zNzYsMTEgKzM4MCw5IEBACiAKIAkvKiBMb2FkIGNvbnRleHQgZm9yIG5leHQgY2hhbm5lbCAqLwogCWNoaWQgPSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbF9pZChkZXYpOwotCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbY2hpZF07CiAJaWYgKGNoYW4pCiAJCW52MDRfZ3JhcGhfbG9hZF9jb250ZXh0KGNoYW4pOwotCi0JcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOwogfQogCiBzdGF0aWMgdWludDMyX3QgKmN0eF9yZWcoc3RydWN0IGdyYXBoX3N0YXRlICpjdHgsIHVpbnQzMl90IHJlZykKQEAgLTQxMiwxMCArNDE0LDI1IEBACiAKIHZvaWQgbnYwNF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJc3RydWN0IGdyYXBoX3N0YXRlICpwZ3JhcGhfY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKworCS8qIFVubG9hZCB0aGUgY29udGV4dCBpZiBpdCdzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAqLworCWlmIChwZ3JhcGgtPmNoYW5uZWwoZGV2KSA9PSBjaGFuKQorCQlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKKwkvKiBGcmVlIHRoZSBjb250ZXh0IHJlc291cmNlcyAqLwogCWtmcmVlKHBncmFwaF9jdHgpOwogCWNoYW4tPnBncmFwaF9jdHggPSBOVUxMOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiB9CiAKIGludCBudjA0X2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQpAQCAtNDY4LDEzICs0ODUsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IHRtcDsKKwlpbnQgcmV0OwogCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJgogCQkJfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8CiAJCQkgTlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCisJcmV0ID0gbnYwNF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBFbmFibGUgUEdSQVBIIGludGVycnVwdHMgKi8KKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDEyLCBudjA0X2dyYXBoX2lzcik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4RkZGRkZGRkYpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweEZGRkZGRkZGKTsKIApAQCAtNTEwLDYgKzUzMyw4IEBACiAKIHZvaWQgbnYwNF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOwogfQogCiB2b2lkCkBAIC01MjQsMTMgKzU0OSwyNyBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfc2V0X3JlZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCWludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX3NldF9yZWYoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCXUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCWF0b21pY19zZXQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxLCBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIAoraW50CitudjA0X2dyYXBoX210aGRfcGFnZV9mbGlwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlIHM7CisKKwlpZiAoIW5vdXZlYXVfZmluaXNoX3BhZ2VfZmxpcChjaGFuLCAmcykpCisJCW52X3NldF9jcnRjX2Jhc2UoZGV2LCBzLmNydGMsCisJCQkJIHMub2Zmc2V0ICsgcy55ICogcy5waXRjaCArIHMueCAqIHMuYnBwIC8gOCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFNvZnR3YXJlIG1ldGhvZHMsIHdoeSB0aGV5IGFyZSBuZWVkZWQsIGFuZCBob3cgdGhleSBhbGwgd29yazoKICAqCkBAIC02MDYsMTIgKzY0NSwxMiBAQAogICovCiAKIHN0YXRpYyB2b2lkCi1udjA0X2dyYXBoX3NldF9jdHgxKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbHVlKQorbnYwNF9ncmFwaF9zZXRfY3R4MShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgbWFzaywgdTMyIHZhbHVlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0JdWludDMyX3QgaW5zdGFuY2UgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0g0KSAmIDB4ZmZmZikgPDwgNDsKKwl1MzIgaW5zdGFuY2UgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0g0KSAmIDB4ZmZmZikgPDwgNDsKIAlpbnQgc3ViYyA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAxMykgJiAweDc7Ci0JdWludDMyX3QgdG1wOworCXUzMiB0bXA7CiAKIAl0bXAgID0gbnZfcmkzMihkZXYsIGluc3RhbmNlKTsKIAl0bXAgJj0gfm1hc2s7CkBAIC02MjMsMTEgKzY2MiwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAotbnYwNF9ncmFwaF9zZXRfY3R4X3ZhbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWx1ZSkKK252MDRfZ3JhcGhfc2V0X2N0eF92YWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIG1hc2ssIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXVpbnQzMl90IGluc3RhbmNlID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfU1dJVENINCkgJiAweGZmZmYpIDw8IDQ7Ci0JdWludDMyX3QgdG1wLCBjdHgxOworCXUzMiBpbnN0YW5jZSA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDQpICYgMHhmZmZmKSA8PCA0OworCXUzMiB0bXAsIGN0eDE7CiAJaW50IGNsYXNzLCBvcCwgdmFsaWQgPSAxOwogCiAJY3R4MSA9IG52X3JpMzIoZGV2LCBpbnN0YW5jZSk7CkBAIC02NzIsMTMgKzcxMSwxMyBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24oc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCWlmIChkYXRhID4gNSkKIAkJcmV0dXJuIDE7CiAJLyogT2xkIHZlcnNpb25zIG9mIHRoZSBvYmplY3RzIG9ubHkgYWNjZXB0IGZpcnN0IHRocmVlIG9wZXJhdGlvbnMuICovCi0JaWYgKGRhdGEgPiAyICYmIGdyY2xhc3MgPCAweDQwKQorCWlmIChkYXRhID4gMiAmJiBjbGFzcyA8IDB4NDApCiAJCXJldHVybiAxOwogCW52MDRfZ3JhcGhfc2V0X2N0eDEoY2hhbiwgMHgwMDAzODAwMCwgZGF0YSA8PCAxNSk7CiAJLyogY2hhbmdpbmcgb3BlcmF0aW9uIGNoYW5nZXMgc2V0IG9mIG9iamVjdHMgbmVlZGVkIGZvciB2YWxpZGF0aW9uICovCkBAIC02ODcsOCArNzI2LDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX2goc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9zdXJmM2RfY2xpcF9oKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAl1aW50MzJfdCBtaW4gPSBkYXRhICYgMHhmZmZmLCBtYXg7CiAJdWludDMyX3QgdyA9IGRhdGEgPj4gMTY7CkBAIC03MDYsOCArNzQ1LDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX3Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9zdXJmM2RfY2xpcF92KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAl1aW50MzJfdCBtaW4gPSBkYXRhICYgMHhmZmZmLCBtYXg7CiAJdWludDMyX3QgdyA9IGRhdGEgPj4gMTY7CkBAIC03MjUsOCArNzY0LDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTc0Miw4ICs3ODEsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmRfc3d6c3VyZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkX3N3enN1cmYoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCQkgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC03NjMsOCArODAyLDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTc3OCw4ICs4MTcsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtNzkzLDggKzgzMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC04MDgsOCArODQ3LDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTgyMyw4ICs4NjIsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9iZXRhNChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtODM4LDggKzg3Nyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC04NTMsOCArODkyLDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9zcmMoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfc3JjKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTg2OCw4ICs5MDcsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2NvbG9yKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2NvbG9yKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkJdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC04ODMsOCArOTIyLDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl96ZXRhKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3pldGEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTg5OCw4ICs5MzcsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9jbGlwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtOTEzLDggKzk1Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC05MzAsMTk0ICs5NjksMzQ2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX3N3W10gPSB7Ci0JeyAweDAxNTAsIG52MDRfZ3JhcGhfbXRoZF9zZXRfcmVmIH0sCitzdGF0aWMgaW50CitudjA0X2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQpCisJCXJldHVybiAwOworCisJLyogZHZkIHN1YnBpY3R1cmUgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzOCwgR1IpOworCisJLyogbTJtZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM5LCBHUik7CisKKwkvKiBudjAzIGdkaXJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0YiwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRiLCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGIsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YiwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGIsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRiLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgZ2RpcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDRhLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGEsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YSwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRhLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YSwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGEsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YSwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjAxIGltYWdlYmxpdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDFmLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWYsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFmLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWYsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFmLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMTljLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3NyYyk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWYsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNCBpbWFnZWJsaXQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1ZiwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVmLCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWYsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWYsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVmLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWYsIDB4MDE5YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IGlpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA2MCwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYwLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MCwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYwLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MCwgMHgwMTljLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDFhMCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkX3N3enN1cmYpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYwLCAweDAzZTQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDUgaWlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDY0LCBHUik7CisKKwkvKiBudjAxIGlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDIxLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMjEsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAyMSwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAyMSwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDIxLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMjEsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDIxLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAyMSwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IGlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDYxLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjEsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MSwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MSwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjEsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MSwgMHgwMTljLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDUgaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjUsIEdSKTsKKworCS8qIG52MDMgc2lmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM2LCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzYsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNiwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM2LCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzYsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM2LCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNiwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IHNpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA3NiwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc2LCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzYsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NiwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc2LCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NiwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzYsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NiwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA1IHNpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA2NiwgR1IpOworCisJLyogbnYwMyBzaWZtICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzcsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNywgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM3LCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzcsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM3LCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNywgMHgwMzA0LCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA3NywgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc3LCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzcsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NywgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzcsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc3LCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZF9zd3pzdXJmKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NywgMHgwMzA0LCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudWxsICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzAsIEdSKTsKKworCS8qIHN1cmYyZCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQyLCBHUik7CisKKwkvKiByb3AgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0MywgR1IpOworCisJLyogYmV0YTEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxMiwgR1IpOworCisJLyogYmV0YTQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA3MiwgR1IpOworCisJLyogY2xpcHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxOSwgR1IpOworCisJLyogbnYwMSBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTgsIEdSKTsKKworCS8qIG52MDQgcGF0dGVybiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQ0LCBHUik7CisKKwkvKiBzd3pzdXJmICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTIsIEdSKTsKKworCS8qIHN1cmYzZCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDUzLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNTMsIDB4MDJmOCwgbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX2gpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDUzLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zdXJmM2RfY2xpcF92KTsKKworCS8qIG52MDMgdGV4X3RyaSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQ4LCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNDgsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNDgsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9jb2xvcik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNDgsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl96ZXRhKTsKKworCS8qIHRleF90cmkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1NCwgR1IpOworCisJLyogbXVsdGl0ZXhfdHJpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTUsIEdSKTsKKworCS8qIG52MDEgY2hyb21hICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTcsIEdSKTsKKworCS8qIG52MDQgY2hyb21hICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTcsIEdSKTsKKworCS8qIHN1cmZfZHN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTgsIEdSKTsKKworCS8qIHN1cmZfc3JjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTksIEdSKTsKKworCS8qIHN1cmZfY29sb3IgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1YSwgR1IpOworCisJLyogc3VyZl96ZXRhICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNWIsIEdSKTsKKworCS8qIG52MDEgbGluZSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDFjLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWMsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWMsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxYywgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFjLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxYywgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWMsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNCBsaW5lICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNWMsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1YywgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1YywgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWMsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1YywgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDEgdHJpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMWQsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZCwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZCwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFkLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWQsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFkLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZCwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IHRyaSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDVkLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWQsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWQsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVkLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWQsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjAxIHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxZSwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFlLCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFlLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWUsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZSwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWUsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFlLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDVlLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWUsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWUsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVlLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWUsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwMTUwLCBudjA0X2dyYXBoX210aGRfc2V0X3JlZik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDUwMCwgbnYwNF9ncmFwaF9tdGhkX3BhZ2VfZmxpcCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiAwOworfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52MDRfZ3JhcGhfaW50cltdID0geworCXsgTlZfUEdSQVBIX0lOVFJfTk9USUZZLCAiTk9USUZZIiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAzX2dkaXJlY3RbXSA9IHsKLQl7IDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0IH0sCi0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9nZGlyZWN0W10gPSB7Ci0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQgfSwKLQl7IDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkIH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAxX2ltYWdlYmxpdFtdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0IH0sCi0JeyAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfc3JjIH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjA0X2ltYWdlYmxpdF9pZmNbXSA9IHsKLQl7IDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hIH0sCi0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXAgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0IH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCB9LAotCXsgMHgwMTljLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDRfaWlmY1tdID0gewotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0IH0sCi0JeyAweDAxYTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZF9zd3pzdXJmIH0sCi0JeyAweDAzZTQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAxX2lmY1tdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0IH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAzX3NpZmNbXSA9IHsKLQl7IDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hIH0sCi0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDRfc2lmY1tdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0IH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCB9LAotCXsgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDNfc2lmbVtdID0gewotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0IH0sCi0JeyAweDAzMDQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjA0X3NpZm1bXSA9IHsKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0IH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCB9LAotCXsgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmRfc3d6c3VyZiB9LAotCXsgMHgwMzA0LCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwMV9zaGFwZVtdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwIH0sCi0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDRfc2hhcGVbXSA9IHsKLQl7IDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0IH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwM190ZXhfdHJpW10gPSB7Ci0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXAgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9jb2xvciB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3pldGEgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX3N1cmYzZFtdID0gewotCXsgMHgwMmY4LCBudjA0X2dyYXBoX210aGRfc3VyZjNkX2NsaXBfaCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc3VyZjNkX2NsaXBfdiB9LAotCXt9LAotfTsKLQotc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjA0X2dyYXBoX2dyY2xhc3NbXSA9IHsKLQl7IDB4MDAzOCwgZmFsc2UsIE5VTEwgfSwgLyogZHZkIHN1YnBpY3R1cmUgKi8KLQl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLwotCXsgMHgwMDRiLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAzX2dkaXJlY3QgfSwgLyogbnYwMyBnZGlyZWN0ICovCi0JeyAweDAwNGEsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfZ2RpcmVjdCB9LCAvKiBudjA0IGdkaXJlY3QgKi8KLQl7IDB4MDAxZiwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwMV9pbWFnZWJsaXQgfSwgLyogbnYwMSBpbWFnZWJsaXQgKi8KLQl7IDB4MDA1ZiwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9pbWFnZWJsaXRfaWZjIH0sIC8qIG52MDQgaW1hZ2VibGl0ICovCi0JeyAweDAwNjAsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfaWlmYyB9LCAvKiBudjA0IGlpZmMgKi8KLQl7IDB4MDA2NCwgZmFsc2UsIE5VTEwgfSwgLyogbnYwNSBpaWZjICovCi0JeyAweDAwMjEsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDFfaWZjIH0sIC8qIG52MDEgaWZjICovCi0JeyAweDAwNjEsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfaW1hZ2VibGl0X2lmYyB9LCAvKiBudjA0IGlmYyAqLwotCXsgMHgwMDY1LCBmYWxzZSwgTlVMTCB9LCAvKiBudjA1IGlmYyAqLwotCXsgMHgwMDM2LCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAzX3NpZmMgfSwgLyogbnYwMyBzaWZjICovCi0JeyAweDAwNzYsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfc2lmYyB9LCAvKiBudjA0IHNpZmMgKi8KLQl7IDB4MDA2NiwgZmFsc2UsIE5VTEwgfSwgLyogbnYwNSBzaWZjICovCi0JeyAweDAwMzcsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDNfc2lmbSB9LCAvKiBudjAzIHNpZm0gKi8KLQl7IDB4MDA3NywgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaWZtIH0sIC8qIG52MDQgc2lmbSAqLwotCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCi0JeyAweDAwNDIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLwotCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KLQl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KLQl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KLQl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KLQl7IDB4MDAxOCwgZmFsc2UsIE5VTEwgfSwgLyogbnYwMSBwYXR0ZXJuICovCi0JeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIG52MDQgcGF0dGVybiAqLwotCXsgMHgwMDUyLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCi0JeyAweDAwNTMsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX3N1cmYzZCB9LCAvKiBzdXJmM2QgKi8KLQl7IDB4MDA0OCwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwM190ZXhfdHJpIH0sIC8qIG52MDMgdGV4X3RyaSAqLwotCXsgMHgwMDU0LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXhfdHJpICovCi0JeyAweDAwNTUsIGZhbHNlLCBOVUxMIH0sIC8qIG11bHRpdGV4X3RyaSAqLwotCXsgMHgwMDE3LCBmYWxzZSwgTlVMTCB9LCAvKiBudjAxIGNocm9tYSAqLwotCXsgMHgwMDU3LCBmYWxzZSwgTlVMTCB9LCAvKiBudjA0IGNocm9tYSAqLwotCXsgMHgwMDU4LCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmX2RzdCAqLwotCXsgMHgwMDU5LCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmX3NyYyAqLwotCXsgMHgwMDVhLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmX2NvbG9yICovCi0JeyAweDAwNWIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmZfemV0YSAqLwotCXsgMHgwMDFjLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAxX3NoYXBlIH0sIC8qIG52MDEgbGluZSAqLwotCXsgMHgwMDVjLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjA0X3NoYXBlIH0sIC8qIG52MDQgbGluZSAqLwotCXsgMHgwMDFkLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAxX3NoYXBlIH0sIC8qIG52MDEgdHJpICovCi0JeyAweDAwNWQsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfc2hhcGUgfSwgLyogbnYwNCB0cmkgKi8KLQl7IDB4MDAxZSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwMV9zaGFwZSB9LCAvKiBudjAxIHJlY3QgKi8KLQl7IDB4MDA1ZSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaGFwZSB9LCAvKiBudjA0IHJlY3QgKi8KLQl7IDB4NTA2ZSwgdHJ1ZSwgbnYwNF9ncmFwaF9tdGhkc19zdyB9LAorc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52MDRfZ3JhcGhfbnN0YXR1c1tdID0KK3sKKwl7IE5WMDRfUEdSQVBIX05TVEFUVVNfU1RBVEVfSU5fVVNFLCAgICAgICAiU1RBVEVfSU5fVVNFIiB9LAorCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19JTlZBTElEX1NUQVRFLCAgICAgICJJTlZBTElEX1NUQVRFIiB9LAorCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQsICAgICAgICJCQURfQVJHVU1FTlQiIH0sCisJeyBOVjA0X1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQsICAgIlBST1RFQ1RJT05fRkFVTFQiIH0sCiAJe30KIH07CiAKK3N0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52MDRfZ3JhcGhfbnNvdXJjZVtdID0KK3sKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTk9USUZJQ0FUSU9OLCAgICAgICAiTk9USUZJQ0FUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9EQVRBX0VSUk9SLCAgICAgICAgICJEQVRBX0VSUk9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9QUk9URUNUSU9OX0VSUk9SLCAgICJQUk9URUNUSU9OX0VSUk9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9SQU5HRV9FWENFUFRJT04sICAgICJSQU5HRV9FWENFUFRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX0NPTE9SLCAgICAgICAgIkxJTUlUX0NPTE9SIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9MSU1JVF9aRVRBLCAgICAgICAgICJMSU1JVF9aRVRBIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQsICAgICAgICJJTExFR0FMX01USEQiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9SX1BST1RFQ1RJT04sICAgIkRNQV9SX1BST1RFQ1RJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XX1BST1RFQ1RJT04sICAgIkRNQV9XX1BST1RFQ1RJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0ZPUk1BVF9FWENFUFRJT04sICAgIkZPUk1BVF9FWENFUFRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX1BBVENIX0VYQ0VQVElPTiwgICAgIlBBVENIX0VYQ0VQVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfU1RBVEVfSU5WQUxJRCwgICAgICAiU1RBVEVfSU5WQUxJRCIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE9VQkxFX05PVElGWSwgICAgICAiRE9VQkxFX05PVElGWSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTk9USUZZX0lOX1VTRSwgICAgICAiTk9USUZZX0lOX1VTRSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTUVUSE9EX0NOVCwgICAgICAgICAiTUVUSE9EX0NOVCIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfQkZSX05PVElGSUNBVElPTiwgICAiQkZSX05PVElGSUNBVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1ZUWF9QUk9URUNUSU9OLCAiRE1BX1ZUWF9QUk9URUNUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQSwgICAgICAgICJETUFfV0lEVEhfQSIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dJRFRIX0IsICAgICAgICAiRE1BX1dJRFRIX0IiIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkCitudjA0X2dyYXBoX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzdGF0OworCisJd2hpbGUgKChzdGF0ID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgeworCQl1MzIgbnNvdXJjZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU09VUkNFKTsKKwkJdTMyIG5zdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNUQVRVUyk7CisJCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUik7CisJCXUzMiBjaGlkID0gKGFkZHIgJiAweDBmMDAwMDAwKSA+PiAyNDsKKwkJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwMGUwMDApID4+IDEzOworCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfREFUQSk7CisJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDE4MCArIHN1YmMgKiA0KSAmIDB4ZmY7CisJCXUzMiBzaG93ID0gc3RhdDsKKworCQlpZiAoc3RhdCAmIE5WX1BHUkFQSF9JTlRSX05PVElGWSkgeworCQkJaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCkgeworCQkJCWlmICghbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihkZXYsIGNoaWQsIGNsYXNzLCBtdGhkLCBkYXRhKSkKKwkJCQkJc2hvdyAmPSB+TlZfUEdSQVBIX0lOVFJfTk9USUZZOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXQgJiBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCkgeworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKTsKKwkJCXN0YXQgJj0gfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIOworCQkJc2hvdyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7CisJCQludjA0X2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7CisJCX0KKworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAweDAwMDAwMDAxKTsKKworCQlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MDRfZ3JhcGhfaW50ciwgc2hvdyk7CisJCQlwcmludGsoIiBuc291cmNlOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjA0X2dyYXBoX25zb3VyY2UsIG5zb3VyY2UpOworCQkJcHJpbnRrKCIgbnN0YXR1czoiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYwNF9ncmFwaF9uc3RhdHVzLCBuc3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQvJWQgY2xhc3MgMHglMDR4ICIKKwkJCQkgICAgICJtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCQljaGlkLCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2luc3RtZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jCmluZGV4IDBiNWFlMjkuLmI4ZTNlZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jCkBAIC05OCwzNSArOTgsNiBAQAogfQogCiBpbnQKLW52MDRfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwKLQkJICAgICAgdWludDMyX3QgKnN6KQotewotCXJldHVybiAwOwotfQotCi12b2lkCi1udjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCi17Ci19Ci0KLWludAotbnYwNF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotbnYwNF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci19Ci0KLWludAogbnYwNF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKQEAgLTEzNywzICsxMDgsNTYgQEAKIHsKIH0KIAoraW50CitudjA0X2luc3RtZW1fZ2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGdwdW9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKnJhbWluID0gTlVMTDsKKworCWRvIHsKKwkJaWYgKGRybV9tbV9wcmVfZ2V0KCZkZXZfcHJpdi0+cmFtaW5faGVhcCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzcGluX2xvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKKwkJcmFtaW4gPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5yYW1pbl9oZWFwLCBzaXplLCBhbGlnbiwgMCk7CisJCWlmIChyYW1pbiA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlyYW1pbiA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljKHJhbWluLCBzaXplLCBhbGlnbik7CisJCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7CisJfSB3aGlsZSAocmFtaW4gPT0gTlVMTCk7CisKKwlncHVvYmotPm5vZGUgID0gcmFtaW47CisJZ3B1b2JqLT52aW5zdCA9IHJhbWluLT5zdGFydDsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX3B1dChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBncHVvYmotPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlzcGluX2xvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKKwlkcm1fbW1fcHV0X2Jsb2NrKGdwdW9iai0+bm9kZSk7CisJZ3B1b2JqLT5ub2RlID0gTlVMTDsKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworfQorCitpbnQKK252MDRfaW5zdG1lbV9tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCit7CisJZ3B1b2JqLT5waW5zdCA9IGdwdW9iai0+dmluc3Q7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252MDRfaW5zdG1lbV91bm1hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMKaW5kZXggY2M1Y2RhNC4uZjc4MTgxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmIuYwpAQCAtMywyMyArMywxMDkgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAKLXZvaWQKLW52MTBfZmJfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKQorc3RhdGljIHN0cnVjdCBkcm1fbW1fbm9kZSAqCitudjIwX2ZiX2FsbG9jX3RhZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBzaXplKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdWludDMyX3QgbGltaXQgPSBtYXgoMXUsIGFkZHIgKyBzaXplKSAtIDE7CisJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICpwZmIgPSAmZGV2X3ByaXYtPmVuZ2luZS5mYjsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm1lbTsKKwlpbnQgcmV0OwogCi0JaWYgKHBpdGNoKSB7Ci0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzIwKQotCQkJYWRkciB8PSAxOwotCQllbHNlCi0JCQlhZGRyIHw9IDEgPDwgMzE7CisJcmV0ID0gZHJtX21tX3ByZV9nZXQoJnBmYi0+dGFnX2hlYXApOworCWlmIChyZXQpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKKwltZW0gPSBkcm1fbW1fc2VhcmNoX2ZyZWUoJnBmYi0+dGFnX2hlYXAsIHNpemUsIDAsIDApOworCWlmIChtZW0pCisJCW1lbSA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljKG1lbSwgc2l6ZSwgMCk7CisJc3Bpbl91bmxvY2soJmRldl9wcml2LT50aWxlLmxvY2spOworCisJcmV0dXJuIG1lbTsKK30KKworc3RhdGljIHZvaWQKK252MjBfZmJfZnJlZV90YWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9tbV9ub2RlICptZW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXNwaW5fbG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisJZHJtX21tX3B1dF9ibG9jayhtZW0pOworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKK30KKwordm9pZAorbnYxMF9mYl9pbml0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpLCB1aW50MzJfdCBhZGRyLAorCQkJIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKKwlpbnQgYnBwID0gKGZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV8zMkJQUCA/IDMyIDogMTYpOworCisJdGlsZS0+YWRkciA9IGFkZHI7CisJdGlsZS0+bGltaXQgPSBtYXgoMXUsIGFkZHIgKyBzaXplKSAtIDE7CisJdGlsZS0+cGl0Y2ggPSBwaXRjaDsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwKSB7CisJCWlmIChmbGFncyAmIE5PVVZFQVVfR0VNX1RJTEVfWkVUQSkgeworCQkJLyoKKwkJCSAqIEFsbG9jYXRlIHNvbWUgb2YgdGhlIG9uLWRpZSB0YWcgbWVtb3J5LAorCQkJICogdXNlZCB0byBzdG9yZSBaIGNvbXByZXNzaW9uIG1ldGEtZGF0YSAobW9zdAorCQkJICogbGlrZWx5IGp1c3QgYSBiaXRtYXAgZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbgorCQkJICogdGlsZSBpcyBjb21wcmVzc2VkIG9yIG5vdCkuCisJCQkgKi8KKwkJCXRpbGUtPnRhZ19tZW0gPSBudjIwX2ZiX2FsbG9jX3RhZyhkZXYsIHNpemUgLyAyNTYpOworCisJCQlpZiAodGlsZS0+dGFnX21lbSkgeworCQkJCS8qIEVuYWJsZSBaIGNvbXByZXNzaW9uICovCisJCQkJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MjUpCisJCQkJCXRpbGUtPnpjb21wID0gdGlsZS0+dGFnX21lbS0+c3RhcnQgfAorCQkJCQkJKGJwcCA9PSAxNiA/CisJCQkJCQkgTlYyNV9QRkJfWkNPTVBfTU9ERV8xNiA6CisJCQkJCQkgTlYyNV9QRkJfWkNPTVBfTU9ERV8zMik7CisJCQkJZWxzZQorCQkJCQl0aWxlLT56Y29tcCA9IHRpbGUtPnRhZ19tZW0tPnN0YXJ0IHwKKwkJCQkJCU5WMjBfUEZCX1pDT01QX0VOIHwKKwkJCQkJCShicHAgPT0gMTYgPyAwIDoKKwkJCQkJCSBOVjIwX1BGQl9aQ09NUF9NT0RFXzMyKTsKKwkJCX0KKworCQkJdGlsZS0+YWRkciB8PSAzOworCQl9IGVsc2UgeworCQkJdGlsZS0+YWRkciB8PSAxOworCQl9CisKKwl9IGVsc2UgeworCQl0aWxlLT5hZGRyIHw9IDEgPDwgMzE7CisJfQorfQorCit2b2lkCitudjEwX2ZiX2ZyZWVfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CisKKwlpZiAodGlsZS0+dGFnX21lbSkgeworCQludjIwX2ZiX2ZyZWVfdGFnKGRldiwgdGlsZS0+dGFnX21lbSk7CisJCXRpbGUtPnRhZ19tZW0gPSBOVUxMOwogCX0KIAotCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSksIGxpbWl0KTsKLQludl93cjMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSksIHBpdGNoKTsKLQludl93cjMyKGRldiwgTlYxMF9QRkJfVElMRShpKSwgYWRkcik7CisJdGlsZS0+YWRkciA9IHRpbGUtPmxpbWl0ID0gdGlsZS0+cGl0Y2ggPSB0aWxlLT56Y29tcCA9IDA7Cit9CisKK3ZvaWQKK252MTBfZmJfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCisJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpLCB0aWxlLT5hZGRyKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwKQorCQludl93cjMyKGRldiwgTlYyMF9QRkJfWkNPTVAoaSksIHRpbGUtPnpjb21wKTsKIH0KIAogaW50CkBAIC0zMSw5ICsxMTcsMTQgQEAKIAogCXBmYi0+bnVtX3RpbGVzID0gTlYxMF9QRkJfVElMRV9fU0laRTsKIAorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwKQorCQlkcm1fbW1faW5pdCgmcGZiLT50YWdfaGVhcCwgMCwKKwkJCSAgICAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgyNSA/CisJCQkgICAgIDY0ICogMTAyNCA6IDMyICogMTAyNCkpOworCiAJLyogVHVybiBhbGwgdGhlIHRpbGluZyByZWdpb25zIG9mZi4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGZiLT5udW1fdGlsZXM7IGkrKykKLQkJcGZiLT5zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQlwZmItPnNldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MSw0ICsxMzIsMTMgQEAKIHZvaWQKIG52MTBfZmJfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZiX2VuZ2luZSAqcGZiID0gJmRldl9wcml2LT5lbmdpbmUuZmI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGZiLT5udW1fdGlsZXM7IGkrKykKKwkJcGZiLT5mcmVlX3RpbGVfcmVnaW9uKGRldiwgaSk7CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl8yMCkKKwkJZHJtX21tX3Rha2Vkb3duKCZwZmItPnRhZ19oZWFwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMKaW5kZXggZjFiMDNhZC4uZDJlY2JmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMKQEAgLTUzLDYgKzUzLDExIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKKwkJCSAgICAgTlYwM19VU0VSKGNoYW4tPmlkKSwgUEFHRV9TSVpFKTsKKwlpZiAoIWNoYW4tPnVzZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogRmlsbCBlbnRyaWVzIHRoYXQgYXJlIHNlZW4gZmlsbGVkIGluIGR1bXBzIG9mIG52aWRpYSBkcml2ZXIganVzdAogCSAqIGFmdGVyIGNoYW5uZWwncyBpcyBwdXQgaW50byBETUEgbW9kZQogCSAqLwpAQCAtNzMsMTcgKzc4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAotbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0KLQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAotCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKLQotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtZmMpOwotfQotCiBzdGF0aWMgdm9pZAogbnYxMF9maWZvX2RvX2xvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hpZCkKIHsKQEAgLTIxOSw2ICsyMTMsNyBAQAogc3RhdGljIHZvaWQKIG52MTBfZmlmb19pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDgsIG52MDRfZmlmb19pc3IpOwogCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKIH0KQEAgLTI0MSw3ICsyMzYsNyBAQAogCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOwogCiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pIHsKKwkJaWYgKGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0pIHsKIAkJCXVpbnQzMl90IG1vZGUgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKTsKIAkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsIG1vZGUgfCAoMSA8PCBpKSk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYwppbmRleCA4ZTY4Yzk3Li44YzkyZWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9ncmFwaC5jCkBAIC0yNiw2ICsyNiwxMCBAQAogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3V0aWwuaCIKKworc3RhdGljIGludCAgbnYxMF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIG52MTBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAjZGVmaW5lIE5WMTBfRklGT19OVU1CRVIgMzIKIApAQCAtNzg2LDE1ICs3OTAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG52MTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOwogCWludCBjaGlkOwogCi0JcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKIAlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKIAogCS8qIElmIHByZXZpb3VzIGNvbnRleHQgaXMgdmFsaWQsIHdlIG5lZWQgdG8gc2F2ZSBpdCAqLwpAQCAtODAyLDExICs4MDQsOSBAQAogCiAJLyogTG9hZCBjb250ZXh0IGZvciBuZXh0IGNoYW5uZWwgKi8KIAljaGlkID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpID4+IDIwKSAmIDB4MWY7Ci0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIAlpZiAoY2hhbiAmJiBjaGFuLT5wZ3JhcGhfY3R4KQogCQludjEwX2dyYXBoX2xvYWRfY29udGV4dChjaGFuKTsKLQotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKIH0KIAogI2RlZmluZSBOVl9XUklURV9DVFgocmVnLCB2YWwpIGRvIHsgXApAQCAtODMzLDcgKzgzMyw3IEBACiAJaWYgKGNoaWQgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJcmV0dXJuIGRldl9wcml2LT5jaGFubmVscy5wdHJbY2hpZF07CiB9CiAKIGludCBudjEwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCkBAIC04NzUsMzcgKzg3NSw1NCBAQAogCiB2b2lkIG52MTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwogCXN0cnVjdCBncmFwaF9zdGF0ZSAqcGdyYXBoX2N0eCA9IGNoYW4tPnBncmFwaF9jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7CisKKwkvKiBVbmxvYWQgdGhlIGNvbnRleHQgaWYgaXQncyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAocGdyYXBoLT5jaGFubmVsKGRldikgPT0gY2hhbikKKwkJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOworCisJLyogRnJlZSB0aGUgY29udGV4dCByZXNvdXJjZXMgKi8KIAlrZnJlZShwZ3JhcGhfY3R4KTsKIAljaGFuLT5wZ3JhcGhfY3R4ID0gTlVMTDsKKworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogfQogCiB2b2lkCi1udjEwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpLCB1aW50MzJfdCBhZGRyLAotCQkJICAgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBwaXRjaCkKK252MTBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQogewotCXVpbnQzMl90IGxpbWl0ID0gbWF4KDF1LCBhZGRyICsgc2l6ZSkgLSAxOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOwogCi0JaWYgKHBpdGNoKQotCQlhZGRyIHw9IDEgPDwgMzE7Ci0KLQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVExJTUlUKGkpLCBsaW1pdCk7Ci0JbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RTSVpFKGkpLCBwaXRjaCk7Ci0JbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RJTEUoaSksIGFkZHIpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9UTElNSVQoaSksIHRpbGUtPmxpbWl0KTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVFNJWkUoaSksIHRpbGUtPnBpdGNoKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVElMRShpKSwgdGlsZS0+YWRkcik7CiB9CiAKIGludCBudjEwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IHRtcDsKLQlpbnQgaTsKKwlpbnQgcmV0LCBpOwogCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSwgbnZfcmQzMihkZXYsIE5WMDNfUE1DX0VOQUJMRSkgJgogCQkJfk5WX1BNQ19FTkFCTEVfUEdSQVBIKTsKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSB8CiAJCQkgTlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCisJcmV0ID0gbnYxMF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDEyLCBudjEwX2dyYXBoX2lzcik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIgICAsIDB4RkZGRkZGRkYpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweEZGRkZGRkZGKTsKIApAQCAtOTI4LDcgKzk0NSw3IEBACiAKIAkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLwogCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspCi0JCW52MTBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKKwkJbnYxMF9ncmFwaF9zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfU1dJVENIKDApLCAweDAwMDAwMDAwKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX1NXSVRDSCgxKSwgMHgwMDAwMDAwMCk7CkBAIC05NDgsMTcgKzk2NSwxNyBAQAogCiB2b2lkIG52MTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHgwMDAwMDAwMCk7CisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDEyKTsKIH0KIAogc3RhdGljIGludAotbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3coc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBncmFwaF9zdGF0ZSAqY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKIAlzdHJ1Y3QgcGlwZV9zdGF0ZSAqcGlwZSA9ICZjdHgtPnBpcGVfc3RhdGU7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAl1aW50MzJfdCBwaXBlXzB4MDA0MFsxXSwgcGlwZV8weDY0YzBbOF0sIHBpcGVfMHg2YTgwWzNdLCBwaXBlXzB4NmFiMFszXTsKIAl1aW50MzJfdCB4Zm1vZGUwLCB4Zm1vZGUxOwogCWludCBpOwpAQCAtMTAyNSwxOCArMTA0MiwxNCBAQAogCiAJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CiAKLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotbnYxN19ncmFwaF9tdGhkX2xtYV9lbmFibGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MTdfZ3JhcGhfbXRoZF9sbWFfZW5hYmxlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAKIAlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKIApAQCAtMTA0NSw0MCArMTA1OCwxMTggQEAKIAludl93cjMyKGRldiwgMHgwMDQwMDZiMCwKIAkJbnZfcmQzMihkZXYsIDB4MDA0MDA2YjApIHwgMHg4IDw8IDI0KTsKIAotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYxN19ncmFwaF9jZWxzaXVzX210aGRzW10gPSB7Ci0JeyAweDE2MzgsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93IH0sCi0JeyAweDE2M2MsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93IH0sCi0JeyAweDE2NDAsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93IH0sCi0JeyAweDE2NDQsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93IH0sCi0JeyAweDE2NTgsIG52MTdfZ3JhcGhfbXRoZF9sbWFfZW5hYmxlIH0sCitzdGF0aWMgaW50CitudjEwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQpCisJCXJldHVybiAwOworCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsgLyogbnZzdyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDMwLCBHUik7IC8qIG51bGwgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzOSwgR1IpOyAvKiBtMm1mICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNGEsIEdSKTsgLyogZ2RpcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDVmLCBHUik7IC8qIGltYWdlYmxpdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDlmLCBHUik7IC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA4YSwgR1IpOyAvKiBpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA4OSwgR1IpOyAvKiBzaWZtICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjIsIEdSKTsgLyogc3VyZjJkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDMsIEdSKTsgLyogcm9wICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTIsIEdSKTsgLyogYmV0YTEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA3MiwgR1IpOyAvKiBiZXRhNCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDE5LCBHUik7IC8qIGNsaXByZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDQsIEdSKTsgLyogcGF0dGVybiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDUyLCBHUik7IC8qIHN3enN1cmYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5MywgR1IpOyAvKiBzdXJmM2QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5NCwgR1IpOyAvKiB0ZXhfdHJpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOTUsIEdSKTsgLyogbXVsdGl0ZXhfdHJpICovCisKKwkvKiBjZWxjaXVzICovCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDw9IDB4MTApIHsKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTYsIEdSKTsKKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDE3IHx8IGRldl9wcml2LT5jaGlwc2V0ID09IDB4MWEpIHsKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOTYsIEdSKTsKKwl9IGVsc2UgeworCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5OSwgR1IpOworCQlOVk9CSl9NVEhEIChkZXYsIDB4MDA5OSwgMHgxNjM4LCBudjE3X2dyYXBoX210aGRfbG1hX3dpbmRvdyk7CisJCU5WT0JKX01USEQgKGRldiwgMHgwMDk5LCAweDE2M2MsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93KTsKKwkJTlZPQkpfTVRIRCAoZGV2LCAweDAwOTksIDB4MTY0MCwgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cpOworCQlOVk9CSl9NVEhEIChkZXYsIDB4MDA5OSwgMHgxNjQ0LCBudjE3X2dyYXBoX210aGRfbG1hX3dpbmRvdyk7CisJCU5WT0JKX01USEQgKGRldiwgMHgwMDk5LCAweDE2NTgsIG52MTdfZ3JhcGhfbXRoZF9sbWFfZW5hYmxlKTsKKwl9CisKKwkvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNTAwLCBudjA0X2dyYXBoX210aGRfcGFnZV9mbGlwKTsKKworCWRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52MTBfZ3JhcGhfaW50cltdID0geworCXsgTlZfUEdSQVBIX0lOVFJfTk9USUZZLCAiTk9USUZZIiB9LAorCXsgTlZfUEdSQVBIX0lOVFJfRVJST1IsICAiRVJST1IiICB9LAogCXt9CiB9OwogCi1zdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MTBfZ3JhcGhfZ3JjbGFzc1tdID0gewotCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCi0JeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KLQl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLwotCXsgMHgwMDVmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKi8KLQl7IDB4MDA5ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0IChudjEyKSAqLwotCXsgMHgwMDhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKi8KLQl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLwotCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KLQl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCi0JeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCi0JeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCi0JeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCi0JeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KLQl7IDB4MDA1MiwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLwotCXsgMHgwMDkzLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmM2QgKi8KLQl7IDB4MDA5NCwgZmFsc2UsIE5VTEwgfSwgLyogdGV4X3RyaSAqLwotCXsgMHgwMDk1LCBmYWxzZSwgTlVMTCB9LCAvKiBtdWx0aXRleF90cmkgKi8KLQl7IDB4MDA1NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAobnYxMCkgKi8KLQl7IDB4MDA5NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAobnYxMSkgKi8KLQl7IDB4MDA5OSwgZmFsc2UsIG52MTdfZ3JhcGhfY2Vsc2l1c19tdGhkcyB9LCAvKiBjZWxjaXVzIChudjE3KSAqLworc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9uc3RhdHVzW10gPQoreworCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UsICAgICAgICJTVEFURV9JTl9VU0UiIH0sCisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUsICAgICAgIklOVkFMSURfU1RBVEUiIH0sCisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCwgICAgICAgIkJBRF9BUkdVTUVOVCIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCwgICAiUFJPVEVDVElPTl9GQVVMVCIgfSwKIAl7fQogfTsKKworc3RhdGljIHZvaWQKK252MTBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIHN0YXQ7CisKKwl3aGlsZSAoKHN0YXQgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfSU5UUikpKSB7CisJCXUzMiBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOworCQl1MzIgbnN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU1RBVFVTKTsKKwkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKwkJdTMyIGNoaWQgPSAoYWRkciAmIDB4MDFmMDAwMDApID4+IDIwOworCQl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAxZmZjKTsKKwkJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKKwkJdTMyIGNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTYwICsgc3ViYyAqIDQpICYgMHhmZmY7CisJCXUzMiBzaG93ID0gc3RhdDsKKworCQlpZiAoc3RhdCAmIE5WX1BHUkFQSF9JTlRSX0VSUk9SKSB7CisJCQlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhEKSB7CisJCQkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwyKGRldiwgY2hpZCwgY2xhc3MsIG10aGQsIGRhdGEpKQorCQkJCQlzaG93ICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKKwkJCX0KKwkJfQorCisJCWlmIChzdGF0ICYgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpIHsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7CisJCQlzdGF0ICY9IH5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSDsKKwkJCXNob3cgJj0gfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIOworCQkJbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChkZXYpOworCQl9CisKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIHN0YXQpOworCQludl93cjMyKGRldiwgTlYwNF9QR1JBUEhfRklGTywgMHgwMDAwMDAwMSk7CisKKwkJaWYgKHNob3cgJiYgbm91dmVhdV9yYXRlbGltaXQoKSkgeworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjEwX2dyYXBoX2ludHIsIHNob3cpOworCQkJcHJpbnRrKCIgbnNvdXJjZToiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYwNF9ncmFwaF9uc291cmNlLCBuc291cmNlKTsKKwkJCXByaW50aygiIG5zdGF0dXM6Iik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MTBfZ3JhcGhfbnN0YXR1cywgbnN0YXR1cyk7CisJCQlwcmludGsoIlxuIik7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIGNoICVkLyVkIGNsYXNzIDB4JTA0eCAiCisJCQkJICAgICAibXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCQkJY2hpZCwgc3ViYywgY2xhc3MsIG10aGQsIGRhdGEpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jCmluZGV4IDEyYWI5Y2QuLjg0NjRiNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjIwX2dyYXBoLmMKQEAgLTMyLDYgKzMyLDEwIEBACiAjZGVmaW5lIE5WMzRfR1JDVFhfU0laRSAgICAoMTgxNDApCiAjZGVmaW5lIE5WMzVfMzZfR1JDVFhfU0laRSAoMjIzOTYpCiAKK3N0YXRpYyBpbnQgbnYyMF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbnYzMF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIG52MjBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworCiBzdGF0aWMgdm9pZAogbnYyMF9ncmFwaF9jb250ZXh0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHgpCiB7CkBAIC00MjUsOSArNDI5LDIxIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWluX2dyY3R4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCisJLyogVW5sb2FkIHRoZSBjb250ZXh0IGlmIGl0J3MgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lICovCisJaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCisJCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJLyogRnJlZSB0aGUgY29udGV4dCByZXNvdXJjZXMgKi8KIAludl93bzMyKHBncmFwaC0+Y3R4X3RhYmxlLCBjaGFuLT5pZCAqIDQsIDApOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtaW5fZ3JjdHgpOwogfQogCiBpbnQKQEAgLTQ5NiwyNCArNTEyLDI3IEBACiB9CiAKIHZvaWQKLW52MjBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgICAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKQorbnYyMF9ncmFwaF9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCiB7Ci0JdWludDMyX3QgbGltaXQgPSBtYXgoMXUsIGFkZHIgKyBzaXplKSAtIDE7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CiAKLQlpZiAocGl0Y2gpCi0JCWFkZHIgfD0gMTsKLQotCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UTElNSVQoaSksIGxpbWl0KTsKLQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVFNJWkUoaSksIHBpdGNoKTsKLQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVElMRShpKSwgYWRkcik7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9USUxFKGkpLCB0aWxlLT5hZGRyKTsKIAogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMzAgKyA0ICogaSk7Ci0JbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCBsaW1pdCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCB0aWxlLT5saW1pdCk7CiAJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDA1MCArIDQgKiBpKTsKLQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIHBpdGNoKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIHRpbGUtPnBpdGNoKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDEwICsgNCAqIGkpOwotCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgYWRkcik7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCB0aWxlLT5hZGRyKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwKSB7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9aQ09NUChpKSwgdGlsZS0+emNvbXApOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwZWEwMDkwICsgNCAqIGkpOworCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIHRpbGUtPnpjb21wKTsKKwl9CiB9CiAKIGludApAQCAtNTYwLDYgKzU3OSwxMyBAQAogCiAJbnYyMF9ncmFwaF9yZGkoZGV2KTsKIAorCXJldCA9IG52MjBfZ3JhcGhfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGdyYXBoLT5jdHhfdGFibGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52MjBfZ3JhcGhfaXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiAgICwgMHhGRkZGRkZGRik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOwogCkBAIC01NzEsMTYgKzU5NywxNyBAQAogCW52X3dyMzIoZGV2LCAweDQwMDA5QyAgICAgICAgICAgLCAweDAwMDAwMDQwKTsKIAogCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDI1KSB7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDg5MCwgMHgwMDA4MDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDg5MCwgMHgwMGE4Y2ZmZik7CiAJCW52X3dyMzIoZGV2LCAweDQwMDYxMCwgMHgzMDRCMUZCNik7Ci0JCW52X3dyMzIoZGV2LCAweDQwMEI4MCwgMHgxOEI4Mjg4MCk7CisJCW52X3dyMzIoZGV2LCAweDQwMEI4MCwgMHgxY2JkMzg4Myk7CiAJCW52X3dyMzIoZGV2LCAweDQwMEI4NCwgMHg0NDAwMDAwMCk7CiAJCW52X3dyMzIoZGV2LCAweDQwMDA5OCwgMHg0MDAwMDA4MCk7CiAJCW52X3dyMzIoZGV2LCAweDQwMEI4OCwgMHgwMDAwMDBmZik7CisKIAl9IGVsc2UgewotCQludl93cjMyKGRldiwgMHg0MDA4ODAsIDB4MDAwODAwMDApOyAvKiAweDAwMDhjN2RmICovCisJCW52X3dyMzIoZGV2LCAweDQwMDg4MCwgMHgwMDA4YzdkZik7CiAJCW52X3dyMzIoZGV2LCAweDQwMDA5NCwgMHgwMDAwMDAwNSk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMEI4MCwgMHg0NUNBQTIwOCk7IC8qIDB4NDVlYWUyMGUgKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDQ1ZWFlMjBlKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwQjg0LCAweDI0MDAwMDAwKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwMDk4LCAweDAwMDAwMDQwKTsKIAkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEUwMDAzOCk7CkBAIC01OTEsMTQgKzYxOCw4IEBACiAKIAkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLwogCWZvciAoaSA9IDA7IGkgPCBOVjEwX1BGQl9USUxFX19TSVpFOyBpKyspCi0JCW52MjBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKKwkJbnYyMF9ncmFwaF9zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJbnZfd3IzMihkZXYsIDB4NDAwOTgwICsgaSAqIDQsIG52X3JkMzIoZGV2LCAweDEwMDMwMCArIGkgKiA0KSk7Ci0JCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwOTAgKyBpICogNCk7Ci0JCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4MTAwMzAwICsgaSAqIDQpKTsKLQl9CiAJbnZfd3IzMihkZXYsIDB4NDAwOWEwLCBudl9yZDMyKGRldiwgMHgxMDAzMjQpKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDBDKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIG52X3JkMzIoZGV2LCAweDEwMDMyNCkpOwpAQCAtNjQyLDYgKzY2Myw5IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAorCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOworCiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZ3JhcGgtPmN0eF90YWJsZSk7CiB9CiAKQEAgLTY4NCw5ICs3MDgsMTYgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCisJcmV0ID0gbnYzMF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZ3JhcGgtPmN0eF90YWJsZSk7CisJCXJldHVybiByZXQ7CisJfQorCiAJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX0NIQU5ORUxfQ1RYX1RBQkxFLAogCQkgICAgIHBncmFwaC0+Y3R4X3RhYmxlLT5waW5zdCA+PiA0KTsKIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52MjBfZ3JhcGhfaXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiAgICwgMHhGRkZGRkZGRik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOwogCkBAIC03MjQsNyArNzU1LDcgQEAKIAogCS8qIFR1cm4gYWxsIHRoZSB0aWxpbmcgcmVnaW9ucyBvZmYuICovCiAJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykKLQkJbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQludjIwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCiAJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9DT05UUk9MLCAweDEwMDAwMTAwKTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfU1RBVEUgICAgICAsIDB4RkZGRkZGRkYpOwpAQCAtNzQ0LDQ2ICs3NzUsMTI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYyMF9ncmFwaF9ncmNsYXNzW10gPSB7Ci0JeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KLQl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLwotCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCi0JeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KLQl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCi0JeyAweDAwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKi8KLQl7IDB4MDA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCi0JeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLwotCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLwotCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLwotCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLwotCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCi0JeyAweDAwOWUsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KLQl7IDB4MDA5NiwgZmFsc2UsIE5VTEwgfSwgLyogY2VsY2l1cyAqLwotCXsgMHgwMDk3LCBmYWxzZSwgTlVMTCB9LCAvKiBrZWx2aW4gKG52MjApICovCi0JeyAweDA1OTcsIGZhbHNlLCBOVUxMIH0sIC8qIGtlbHZpbiAobnYyNSkgKi8KLQl7fQotfTsKK3N0YXRpYyBpbnQKK252MjBfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi1zdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MzBfZ3JhcGhfZ3JjbGFzc1tdID0gewotCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCi0JeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KLQl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLwotCXsgMHgwMDlmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKG52MTIpICovCi0JeyAweDAwOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAqLwotCXsgMHgwMzhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKG52MzApICovCi0JeyAweDAwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKi8KLQl7IDB4MDM4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAobnYzMCkgKi8KLQl7IDB4MDA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCi0JeyAweDAzNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAobnYzMCkgKi8KLQl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCi0JeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCi0JeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCi0JeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCi0JeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KLQl7IDB4MDM5ZSwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLwotCXsgMHgwMzk3LCBmYWxzZSwgTlVMTCB9LCAvKiByYW5raW5lIChudjMwKSAqLwotCXsgMHgwNDk3LCBmYWxzZSwgTlVMTCB9LCAvKiByYW5raW5lIChudjM1KSAqLwotCXsgMHgwNjk3LCBmYWxzZSwgTlVMTCB9LCAvKiByYW5raW5lIChudjM0KSAqLwotCXt9Ci19OworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQpCisJCXJldHVybiAwOwogCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsgLyogbnZzdyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDMwLCBHUik7IC8qIG51bGwgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzOSwgR1IpOyAvKiBtMm1mICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNGEsIEdSKTsgLyogZ2RpcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDlmLCBHUik7IC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA4YSwgR1IpOyAvKiBpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA4OSwgR1IpOyAvKiBzaWZtICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjIsIEdSKTsgLyogc3VyZjJkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDMsIEdSKTsgLyogcm9wICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTIsIEdSKTsgLyogYmV0YTEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA3MiwgR1IpOyAvKiBiZXRhNCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDE5LCBHUik7IC8qIGNsaXByZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDQsIEdSKTsgLyogcGF0dGVybiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDllLCBHUik7IC8qIHN3enN1cmYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5NiwgR1IpOyAvKiBjZWxjaXVzICovCisKKwkvKiBrZWx2aW4gKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweDI1KQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5NywgR1IpOworCWVsc2UKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDA1OTcsIEdSKTsKKworCS8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA1MDAsIG52MDRfZ3JhcGhfbXRoZF9wYWdlX2ZsaXApOworCisJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnYzMF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkKQorCQlyZXR1cm4gMDsKKworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDZlLCBTVyk7IC8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzMCwgR1IpOyAvKiBudWxsICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzksIEdSKTsgLyogbTJtZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDRhLCBHUik7IC8qIGdkaXJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5ZiwgR1IpOyAvKiBpbWFnZWJsaXQgKG52MTIpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOGEsIEdSKTsgLyogaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAzOGEsIEdSKTsgLyogaWZjIChudjMwKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDg5LCBHUik7IC8qIHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDM4OSwgR1IpOyAvKiBzaWZtIChudjMwKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDYyLCBHUik7IC8qIHN1cmYyZCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMzYyLCBHUik7IC8qIHN1cmYyZCAobnYzMCkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0MywgR1IpOyAvKiByb3AgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxMiwgR1IpOyAvKiBiZXRhMSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDcyLCBHUik7IC8qIGJldGE0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTksIEdSKTsgLyogY2xpcHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0NCwgR1IpOyAvKiBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAzOWUsIEdSKTsgLyogc3d6c3VyZiAqLworCisJLyogcmFua2luZSAqLworCWlmICgweDAwMDAwMDAzICYgKDEgPDwgKGRldl9wcml2LT5jaGlwc2V0ICYgMHgwZikpKQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDM5NywgR1IpOworCWVsc2UKKwlpZiAoMHgwMDAwMDAxMCAmICgxIDw8IChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4MGYpKSkKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDA2OTcsIEdSKTsKKwllbHNlCisJaWYgKDB4MDAwMDAxZTAgJiAoMSA8PCAoZGV2X3ByaXYtPmNoaXBzZXQgJiAweDBmKSkpCisJCU5WT0JKX0NMQVNTKGRldiwgMHgwNDk3LCBHUik7CisKKwkvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNTAwLCBudjA0X2dyYXBoX210aGRfcGFnZV9mbGlwKTsKKworCWRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjIwX2dyYXBoX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzdGF0OworCisJd2hpbGUgKChzdGF0ID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgeworCQl1MzIgbnNvdXJjZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU09VUkNFKTsKKwkJdTMyIG5zdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNUQVRVUyk7CisJCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUik7CisJCXUzMiBjaGlkID0gKGFkZHIgJiAweDAxZjAwMDAwKSA+PiAyMDsKKwkJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApID4+IDE2OworCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfREFUQSk7CisJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDE2MCArIHN1YmMgKiA0KSAmIDB4ZmZmOworCQl1MzIgc2hvdyA9IHN0YXQ7CisKKwkJaWYgKHN0YXQgJiBOVl9QR1JBUEhfSU5UUl9FUlJPUikgeworCQkJaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCkgeworCQkJCWlmICghbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihkZXYsIGNoaWQsIGNsYXNzLCBtdGhkLCBkYXRhKSkKKwkJCQkJc2hvdyAmPSB+TlZfUEdSQVBIX0lOVFJfRVJST1I7CisJCQl9CisJCX0KKworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAweDAwMDAwMDAxKTsKKworCQlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MTBfZ3JhcGhfaW50ciwgc2hvdyk7CisJCQlwcmludGsoIiBuc291cmNlOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjA0X2dyYXBoX25zb3VyY2UsIG5zb3VyY2UpOworCQkJcHJpbnRrKCIgbnN0YXR1czoiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYxMF9ncmFwaF9uc3RhdHVzLCBuc3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQvJWQgY2xhc3MgMHglMDR4ICIKKwkJCQkgICAgICJtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCQljaGlkLCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMwX2ZiLmMKaW5kZXggNGEzZjJmMC4uZTAxMzVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYzMF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzBfZmIuYwpAQCAtMjksNiArMjksMjcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAKK3ZvaWQKK252MzBfZmJfaW5pdF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKKwkJCSB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CisKKwl0aWxlLT5hZGRyID0gYWRkciB8IDE7CisJdGlsZS0+bGltaXQgPSBtYXgoMXUsIGFkZHIgKyBzaXplKSAtIDE7CisJdGlsZS0+cGl0Y2ggPSBwaXRjaDsKK30KKwordm9pZAorbnYzMF9mYl9mcmVlX3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCisJdGlsZS0+YWRkciA9IHRpbGUtPmxpbWl0ID0gdGlsZS0+cGl0Y2ggPSAwOworfQorCiBzdGF0aWMgaW50CiBjYWxjX2JpYXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGssIGludCBpLCBpbnQgaikKIHsKQEAgLTY1LDcgKzg2LDcgQEAKIAogCS8qIFR1cm4gYWxsIHRoZSB0aWxpbmcgcmVnaW9ucyBvZmYuICovCiAJZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspCi0JCXBmYi0+c2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKKwkJcGZiLT5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAogCS8qIEluaXQgdGhlIG1lbW9yeSB0aW1pbmcgcmVncyBhdCAweDEwMDM3Yy8weDEwMDNhYyAqLwogCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDMwIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZiLmMKaW5kZXggM2NkMDdkOC4uZjNkOWMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmIuYwpAQCAtNCwyNiArNCwyMiBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAKIHZvaWQKLW52NDBfZmJfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKQorbnY0MF9mYl9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBsaW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKLQotCWlmIChwaXRjaCkKLQkJYWRkciB8PSAxOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKIAogCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKIAljYXNlIDB4NDA6Ci0JCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UTElNSVQoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RTSVpFKGkpLCBwaXRjaCk7Ci0JCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpLCBhZGRyKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCQludl93cjMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSksIHRpbGUtPnBpdGNoKTsKKwkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSksIHRpbGUtPmFkZHIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9UTElNSVQoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEZCX1RTSVpFKGkpLCBwaXRjaCk7Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9USUxFKGkpLCBhZGRyKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEZCX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCQludl93cjMyKGRldiwgTlY0MF9QRkJfVFNJWkUoaSksIHRpbGUtPnBpdGNoKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEZCX1RJTEUoaSksIHRpbGUtPmFkZHIpOwogCQlicmVhazsKIAl9CiB9CkBAIC02NCw3ICs2MCw3IEBACiAKIAkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLwogCWZvciAoaSA9IDA7IGkgPCBwZmItPm51bV90aWxlczsgaSsrKQotCQlwZmItPnNldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgMCwgMCwgMCk7CisJCXBmYi0+c2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMKaW5kZXggZDMzN2I4Yi4uNDliOWEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMKQEAgLTQ3LDYgKzQ3LDExIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKKwkJCSAgICAgTlY0MF9VU0VSKGNoYW4tPmlkKSwgUEFHRV9TSVpFKTsKKwlpZiAoIWNoYW4tPnVzZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKIAludl93aTMyKGRldiwgZmMgKyAgMCwgY2hhbi0+cHVzaGJ1Zl9iYXNlKTsKQEAgLTU5LDcgKzY0LDYgQEAKIAkJCSAgICAgIE5WX1BGSUZPX0NBQ0hFMV9CSUdfRU5ESUFOIHwKICNlbmRpZgogCQkJICAgICAgMHgzMDAwMDAwMCAvKiBubyBpZGVhLi4gKi8pOwotCW52X3dpMzIoZGV2LCBmYyArIDU2LCBjaGFuLT5yYW1pbl9ncmN0eC0+cGluc3QgPj4gNCk7CiAJbnZfd2kzMihkZXYsIGZjICsgNjAsIDB4MDAwMUZGRkYpOwogCiAJLyogZW5hYmxlIHRoZSBmaWZvIGRtYSBvcGVyYXRpb24gKi8KQEAgLTcwLDE3ICs3NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLW52NDBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCi0JbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwKLQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSkgJiB+KDEgPDwgY2hhbi0+aWQpKTsKLQotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtZmMpOwotfQotCiBzdGF0aWMgdm9pZAogbnY0MF9maWZvX2RvX2xvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hpZCkKIHsKQEAgLTI3OSw2ICsyNzIsNyBAQAogc3RhdGljIHZvaWQKIG52NDBfZmlmb19pbml0X2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDgsIG52MDRfZmlmb19pc3IpOwogCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGZmZmZmZmZmKTsKIH0KQEAgLTMwMSw3ICsyOTUsNyBAQAogCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOwogCiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pIHsKKwkJaWYgKGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0pIHsKIAkJCXVpbnQzMl90IG1vZGUgPSBudl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKTsKIAkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsIG1vZGUgfCAoMSA8PCBpKSk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYwppbmRleCA3ZWUxYjkxLi4xOWVmOTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jCkBAIC0yOSw2ICsyOSw5IEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2dyY3R4LmgiCiAKK3N0YXRpYyBpbnQgbnY0MF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIG52NDBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworCiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKIG52NDBfZ3JhcGhfY2hhbm5lbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtNDIsNyArNDUsNyBAQAogCWluc3QgPSAoaW5zdCAmIE5WNDBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UpIDw8IDQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tpXTsKKwkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbaV07CiAKIAkJaWYgKGNoYW4gJiYgY2hhbi0+cmFtaW5fZ3JjdHggJiYKIAkJICAgIGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCA9PSBpbnN0KQpAQCAtNTksNiArNjIsNyBAQAogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJc3RydWN0IG5vdXZlYXVfZ3JjdHggY3R4ID0ge307CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwgcGdyYXBoLT5ncmN0eF9zaXplLCAxNiwKQEAgLTczLDEyICs3NywzOSBAQAogCW52NDBfZ3JjdHhfaW5pdCgmY3R4KTsKIAogCW52X3dvMzIoY2hhbi0+cmFtaW5fZ3JjdHgsIDAsIGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCk7CisKKwkvKiBpbml0IGdyY3R4IHBvaW50ZXIgaW4gcmFtZmMsIGFuZCBvbiBQRklGTyBpZiBjaGFubmVsIGlzCisJICogYWxyZWFkeSBhY3RpdmUgdGhlcmUKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwludl93bzMyKGNoYW4tPnJhbWZjLCAweDM4LCBjaGFuLT5yYW1pbl9ncmN0eC0+cGluc3QgPj4gNCk7CisJbnZfbWFzayhkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwlpZiAoKG52X3JkMzIoZGV2LCAweDAwMzIwNCkgJiAweDAwMDAwMDFmKSA9PSBjaGFuLT5pZCkKKwkJbnZfd3IzMihkZXYsIDB4MDAzMmUwLCBjaGFuLT5yYW1pbl9ncmN0eC0+cGluc3QgPj4gNCk7CisJbnZfbWFzayhkZXYsIDB4MDAyNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCiB2b2lkCiBudjQwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKworCS8qIFVubG9hZCB0aGUgY29udGV4dCBpZiBpdCdzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAqLworCWlmIChwZ3JhcGgtPmNoYW5uZWwoZGV2KSA9PSBjaGFuKQorCQlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKworCS8qIEZyZWUgdGhlIGNvbnRleHQgcmVzb3VyY2VzICovCiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1pbl9ncmN0eCk7CiB9CiAKQEAgLTE3NCw0MyArMjA1LDM5IEBACiB9CiAKIHZvaWQKLW52NDBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgICAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKQorbnY0MF9ncmFwaF9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBsaW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKLQotCWlmIChwaXRjaCkKLQkJYWRkciB8PSAxOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKIAogCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKIAljYXNlIDB4NDQ6CiAJY2FzZSAweDRhOgogCWNhc2UgMHg0ZToKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RTSVpFKGkpLCBwaXRjaCk7Ci0JCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UTElNSVQoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RJTEUoaSksIGFkZHIpOworCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVFNJWkUoaSksIHRpbGUtPnBpdGNoKTsKKwkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVElMRShpKSwgdGlsZS0+YWRkcik7CiAJCWJyZWFrOwogCiAJY2FzZSAweDQ2OgogCWNhc2UgMHg0NzoKIAljYXNlIDB4NDk6CiAJY2FzZSAweDRiOgotCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVFNJWkUoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RMSU1JVChpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVElMRShpKSwgYWRkcik7Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTEoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDEoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCBhZGRyKTsKKwkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RTSVpFKGkpLCB0aWxlLT5waXRjaCk7CisJCW52X3dyMzIoZGV2LCBOVjQ3X1BHUkFQSF9UTElNSVQoaSksIHRpbGUtPmxpbWl0KTsKKwkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RJTEUoaSksIHRpbGUtPmFkZHIpOworCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCB0aWxlLT5waXRjaCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9USUxFMShpKSwgdGlsZS0+YWRkcik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RTSVpFKGkpLCBwaXRjaCk7Ci0JCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UTElNSVQoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RJTEUoaSksIGFkZHIpOwotCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCBwaXRjaCk7Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCBsaW1pdCk7Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9USUxFMShpKSwgYWRkcik7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9USUxFKGkpLCB0aWxlLT5hZGRyKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTSVpFMShpKSwgdGlsZS0+cGl0Y2gpOworCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMShpKSwgdGlsZS0+bGltaXQpOworCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTEoaSksIHRpbGUtPmFkZHIpOwogCQlicmVhazsKIAl9CiB9CkBAIC0yMzIsNyArMjU5LDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOwogCXN0cnVjdCBub3V2ZWF1X2dyY3R4IGN0eCA9IHt9OwogCXVpbnQzMl90IHZyYW1zeiwgKmNwOwotCWludCBpLCBqOworCWludCByZXQsIGksIGo7CiAKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmCiAJCQl+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOwpAQCAtMjU2LDkgKzI4MywxNCBAQAogCiAJa2ZyZWUoY3ApOwogCisJcmV0ID0gbnY0MF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBObyBjb250ZXh0IHByZXNlbnQgY3VycmVudGx5ICovCiAJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0NUWENUTF9DVVIsIDB4MDAwMDAwMDApOwogCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAxMiwgbnY0MF9ncmFwaF9pc3IpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKIAludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CiAKQEAgLTM0Nyw3ICszNzksNyBAQAogCiAJLyogVHVybiBhbGwgdGhlIHRpbGluZyByZWdpb25zIG9mZi4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGZiLT5udW1fdGlsZXM7IGkrKykKLQkJbnY0MF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQludjQwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCiAJLyogYmVnaW4gUkFNIGNvbmZpZyAqLwogCXZyYW1zeiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDE7CkBAIC0zOTAsMjYgKzQyMiwxMTEgQEAKIAogdm9pZCBudjQwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDEyKTsKIH0KIAotc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjQwX2dyYXBoX2dyY2xhc3NbXSA9IHsKLQl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLwotCXsgMHgwMDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCi0JeyAweDAwNGEsIGZhbHNlLCBOVUxMIH0sIC8qIGdkaXJlY3QgKi8KLQl7IDB4MDA5ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0IChudjEyKSAqLwotCXsgMHgwMDhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKi8KLQl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLwotCXsgMHgzMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtIChudjQwKSAqLwotCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KLQl7IDB4MzA2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkIChudjQwKSAqLwotCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KLQl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KLQl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KLQl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KLQl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogcGF0dGVybiAqLwotCXsgMHgzMDllLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCi0JeyAweDQwOTcsIGZhbHNlLCBOVUxMIH0sIC8qIGN1cmllIChudjQwKSAqLwotCXsgMHg0NDk3LCBmYWxzZSwgTlVMTCB9LCAvKiBjdXJpZSAobnY0NCkgKi8KLQl7fQotfTsKK3N0YXRpYyBpbnQKK252NDBfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCisJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CisKKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOyAvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzAsIEdSKTsgLyogbnVsbCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM5LCBHUik7IC8qIG0ybWYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0YSwgR1IpOyAvKiBnZGlyZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOWYsIEdSKTsgLyogaW1hZ2VibGl0IChudjEyKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDhhLCBHUik7IC8qIGlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDg5LCBHUik7IC8qIHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MzA4OSwgR1IpOyAvKiBzaWZtIChudjQwKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDYyLCBHUik7IC8qIHN1cmYyZCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgzMDYyLCBHUik7IC8qIHN1cmYyZCAobnY0MCkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0MywgR1IpOyAvKiByb3AgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxMiwgR1IpOyAvKiBiZXRhMSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDcyLCBHUik7IC8qIGJldGE0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTksIEdSKTsgLyogY2xpcHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0NCwgR1IpOyAvKiBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDMwOWUsIEdSKTsgLyogc3d6c3VyZiAqLworCisJLyogY3VyaWUgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg2MCB8fAorCSAgICAweDAwMDA1NDUwICYgKDEgPDwgKGRldl9wcml2LT5jaGlwc2V0ICYgMHgwZikpKQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4NDQ5NywgR1IpOworCWVsc2UKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDQwOTcsIEdSKTsKKworCS8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA1MDAsIG52MDRfZ3JhcGhfbXRoZF9wYWdlX2ZsaXApOworCisJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY0MF9ncmFwaF9pc3JfY2hpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgaW5zdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKKwkJaWYgKCFjaGFuIHx8ICFjaGFuLT5yYW1pbl9ncmN0eCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZAorbnY0MF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3RhdDsKKworCXdoaWxlICgoc3RhdCA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSKSkpIHsKKwkJdTMyIG5zb3VyY2UgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNPVVJDRSk7CisJCXUzMiBuc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TVEFUVVMpOworCQl1MzIgaW5zdCA9IChudl9yZDMyKGRldiwgMHg0MDAzMmMpICYgMHgwMDBmZmZmZikgPDwgNDsKKwkJdTMyIGNoaWQgPSBudjQwX2dyYXBoX2lzcl9jaGlkKGRldiwgaW5zdCk7CisJCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUik7CisJCXUzMiBzdWJjID0gKGFkZHIgJiAweDAwMDcwMDAwKSA+PiAxNjsKKwkJdTMyIG10aGQgPSAoYWRkciAmIDB4MDAwMDFmZmMpOworCQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEpOworCQl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyBzdWJjICogNCkgJiAweGZmZmY7CisJCXUzMiBzaG93ID0gc3RhdDsKKworCQlpZiAoc3RhdCAmIE5WX1BHUkFQSF9JTlRSX0VSUk9SKSB7CisJCQlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhEKSB7CisJCQkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwyKGRldiwgY2hpZCwgY2xhc3MsIG10aGQsIGRhdGEpKQorCQkJCQlzaG93ICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKKwkJCX0gZWxzZQorCQkJaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9WVFhfUFJPVEVDVElPTikgeworCQkJCW52X21hc2soZGV2LCAweDQwMjAwMCwgMCwgMCk7CisJCQl9CisJCX0KKworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAweDAwMDAwMDAxKTsKKworCQlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MTBfZ3JhcGhfaW50ciwgc2hvdyk7CisJCQlwcmludGsoIiBuc291cmNlOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjA0X2dyYXBoX25zb3VyY2UsIG5zb3VyY2UpOworCQkJcHJpbnRrKCIgbnN0YXR1czoiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYxMF9ncmFwaF9uc3RhdHVzLCBuc3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQgKDB4JTA4eCkgc3ViYyAlZCAiCisJCQkJICAgICAiY2xhc3MgMHglMDR4IG10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQkJCWNoaWQsIGluc3QsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKaW5kZXggNTY0NzZkMC4uOTAyM2M0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMKQEAgLTExNSwxNSArMTE1LDE2IEBACiAJCU9VVF9SSU5HKGV2bywgMCk7CiAJCUJFR0lOX1JJTkcoZXZvLCAwLCBOVjUwX0VWT19DUlRDKGluZGV4LCBGQl9ETUEpLCAxKTsKIAkJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4NTApCi0JCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDdhMDApCisJCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDdhMDAgfHwKKwkJCSAgICBudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4ZmUwMCkKIAkJCQlPVVRfUklORyhldm8sIE52RXZvRkIzMik7CiAJCQllbHNlCiAJCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDcwMDApCiAJCQkJT1VUX1JJTkcoZXZvLCBOdkV2b0ZCMTYpOwogCQkJZWxzZQotCQkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwkJCQlPVVRfUklORyhldm8sIE52RXZvVlJBTV9MUCk7CiAJCWVsc2UKLQkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNX0xQKTsKIAl9CiAKIAludl9jcnRjLT5mYi5ibGFua2VkID0gYmxhbmtlZDsKQEAgLTM0NSw3ICszNDYsNiBAQAogCQkgICAgIHVpbnQzMl90IGJ1ZmZlcl9oYW5kbGUsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CiAJc3RydWN0IG5vdXZlYXVfYm8gKmN1cnNvciA9IE5VTEw7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW07CkBAIC0zNzQsOCArMzc0LDcgQEAKIAogCW5vdXZlYXVfYm9fdW5tYXAoY3Vyc29yKTsKIAotCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0KG52X2NydGMsIG52X2NydGMtPmN1cnNvci5udmJvLT5iby5vZmZzZXQgLQotCQkJCQkgICAgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSk7CisJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUKTsKIAludl9jcnRjLT5jdXJzb3Iuc2hvdyhudl9jcnRjLCB0cnVlKTsKIAogb3V0OgpAQCAtNDM3LDYgKzQzNiw3IEBACiAJLmN1cnNvcl9tb3ZlID0gbnY1MF9jcnRjX2N1cnNvcl9tb3ZlLAogCS5nYW1tYV9zZXQgPSBudjUwX2NydGNfZ2FtbWFfc2V0LAogCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCisJLnBhZ2VfZmxpcCA9IG5vdXZlYXVfY3J0Y19wYWdlX2ZsaXAsCiAJLmRlc3Ryb3kgPSBudjUwX2NydGNfZGVzdHJveSwKIH07CiAKQEAgLTQ1Myw2ICs0NTMsNyBAQAogCiAJTlZfREVCVUdfS01TKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CiAKKwlkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgpOwogCW52NTBfY3J0Y19ibGFuayhudl9jcnRjLCB0cnVlKTsKIH0KIApAQCAtNDY4LDYgKzQ2OSw3IEBACiAJTlZfREVCVUdfS01TKGRldiwgImluZGV4ICVkXG4iLCBudl9jcnRjLT5pbmRleCk7CiAKIAludjUwX2NydGNfYmxhbmsobnZfY3J0YywgZmFsc2UpOworCWRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgpOwogCiAJcmV0ID0gUklOR19TUEFDRShldm8sIDIpOwogCWlmIChyZXQpIHsKQEAgLTU0NSw3ICs1NDcsNyBAQAogCQkgcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbnZfY3J0Yy0+ZmIub2Zmc2V0ID0gZmItPm52Ym8tPmJvLm9mZnNldCAtIGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisJbnZfY3J0Yy0+ZmIub2Zmc2V0ID0gZmItPm52Ym8tPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCW52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPSBub3V2ZWF1X2JvX3RpbGVfbGF5b3V0KGZiLT5udmJvKTsKIAludl9jcnRjLT5mYi5jcHAgPSBkcm1fZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKIAlpZiAoIW52X2NydGMtPmZiLmJsYW5rZWQgJiYgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgewpAQCAtNTU0LDEzICs1NTYsMTQgQEAKIAkJCXJldHVybiByZXQ7CiAKIAkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMobnZfY3J0Yy0+aW5kZXgsIEZCX0RNQSksIDEpOwotCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDdhMDApCisJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4N2EwMCB8fAorCQkgICAgbnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweGZlMDApCiAJCQlPVVRfUklORyhldm8sIE52RXZvRkIzMik7CiAJCWVsc2UKIAkJaWYgKG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHg3MDAwKQogCQkJT1VUX1JJTkcoZXZvLCBOdkV2b0ZCMTYpOwogCQllbHNlCi0JCQlPVVRfUklORyhldm8sIE52RXZvVlJBTSk7CisJCQlPVVRfUklORyhldm8sIE52RXZvVlJBTV9MUCk7CiAJfQogCiAJcmV0ID0gUklOR19TUEFDRShldm8sIDEyKTsKQEAgLTU3NCw4ICs1NzcsMTAgQEAKIAlpZiAoIW52X2NydGMtPmZiLnRpbGVfZmxhZ3MpIHsKIAkJT1VUX1JJTkcoZXZvLCBkcm1fZmItPnBpdGNoIHwgKDEgPDwgMjApKTsKIAl9IGVsc2UgewotCQlPVVRfUklORyhldm8sICgoZHJtX2ZiLT5waXRjaCAvIDQpIDw8IDQpIHwKLQkJCQkgIGZiLT5udmJvLT50aWxlX21vZGUpOworCQl1MzIgdGlsZV9tb2RlID0gZmItPm52Ym8tPnRpbGVfbW9kZTsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCisJCQl0aWxlX21vZGUgPj49IDQ7CisJCU9VVF9SSU5HKGV2bywgKChkcm1fZmItPnBpdGNoIC8gNCkgPDwgNCkgfCB0aWxlX21vZGUpOwogCX0KIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKIAkJT1VUX1JJTkcoZXZvLCAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA8PCA4KSB8IGZvcm1hdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCmluZGV4IGY2MjRjNjEuLjdjYzk0ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgogI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgogCitzdGF0aWMgdm9pZCBudjUwX2Rpc3BsYXlfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworCiBzdGF0aWMgaW5saW5lIGludAogbnY1MF9zb3JfbnIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTQ2LDE1OSArNDgsNiBAQAogCXJldHVybiA0OwogfQogCi1zdGF0aWMgdm9pZAotbnY1MF9ldm9fY2hhbm5lbF9kZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQotewotCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSAqcGNoYW47Ci0KLQlpZiAoIWNoYW4pCi0JCXJldHVybjsKLQkqcGNoYW4gPSBOVUxMOwotCi0Jbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihjaGFuKTsKLQlub3V2ZWF1X2JvX3VubWFwKGNoYW4tPnB1c2hidWZfYm8pOwotCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZjaGFuLT5wdXNoYnVmX2JvKTsKLQotCWlmIChjaGFuLT51c2VyKQotCQlpb3VubWFwKGNoYW4tPnVzZXIpOwotCi0Ja2ZyZWUoY2hhbik7Ci19Ci0KLXN0YXRpYyBpbnQKLW52NTBfZXZvX2RtYW9ial9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvLCB1aW50MzJfdCBjbGFzcywgdWludDMyX3QgbmFtZSwKLQkJICAgIHVpbnQzMl90IHRpbGVfZmxhZ3MsIHVpbnQzMl90IG1hZ2ljX2ZsYWdzLAotCQkgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsaW1pdCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBldm8tPmRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGV2by0+ZGV2OwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgZXZvLCA2KjQsIDMyLCAwLCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCW9iai0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX0RJU1BMQVk7Ci0KLQludl93bzMyKG9iaiwgIDAsICh0aWxlX2ZsYWdzIDw8IDIyKSB8IChtYWdpY19mbGFncyA8PCAxNikgfCBjbGFzcyk7Ci0JbnZfd28zMihvYmosICA0LCBsaW1pdCk7Ci0JbnZfd28zMihvYmosICA4LCBvZmZzZXQpOwotCW52X3dvMzIob2JqLCAxMiwgMHgwMDAwMDAwMCk7Ci0JbnZfd28zMihvYmosIDE2LCAweDAwMDAwMDAwKTsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKQotCQludl93bzMyKG9iaiwgMjAsIDB4MDAwMTAwMDApOwotCWVsc2UKLQkJbnZfd28zMihvYmosIDIwLCAweDAwMDIwMDAwKTsKLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQotCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGV2bywgbmFtZSwgb2JqKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJm9iaik7Ci0JaWYgKHJldCkgewotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1udjUwX2V2b19jaGFubmVsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWh0ID0gTlVMTDsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwotCWludCByZXQ7Ci0KLQljaGFuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCksIEdGUF9LRVJORUwpOwotCWlmICghY2hhbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JKnBjaGFuID0gY2hhbjsKLQotCWNoYW4tPmlkID0gLTE7Ci0JY2hhbi0+ZGV2ID0gZGV2OwotCWNoYW4tPnVzZXJfZ2V0ID0gNDsKLQljaGFuLT51c2VyX3B1dCA9IDA7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAzMjc2OCwgMHgxMDAwLAotCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZjaGFuLT5yYW1pbik7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBhbGxvY2F0aW5nIEVWTyBjaGFubmVsIG1lbW9yeTogJWRcbiIsIHJldCk7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBkcm1fbW1faW5pdCgmY2hhbi0+cmFtaW5faGVhcCwgMCwgMzI3NjgpOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgaW5pdGlhbGlzaW5nIEVWTyBQUkFNSU4gaGVhcDogJWRcbiIsIHJldCk7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCA0MDk2LCAxNiwgMCwgJnJhbWh0KTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBFVk8gUkFNSFQ6ICVkXG4iLCByZXQpOwotCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gbm91dmVhdV9yYW1odF9uZXcoZGV2LCByYW1odCwgJmNoYW4tPnJhbWh0KTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnJhbWh0KTsKLQlpZiAocmV0KSB7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgewotCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGNoYW4sIDB4M2QsIE52RXZvRkIxNiwgMHg3MCwgMHgxOSwKLQkJCQkJICAwLCAweGZmZmZmZmZmKTsKLQkJaWYgKHJldCkgewotCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0KLQkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhjaGFuLCAweDNkLCBOdkV2b0ZCMzIsIDB4N2EsIDB4MTksCi0JCQkJCSAgMCwgMHhmZmZmZmZmZik7Ci0JCWlmIChyZXQpIHsKLQkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGNoYW4sIDB4M2QsIE52RXZvVlJBTSwgMCwgMHgxOSwKLQkJCQkgIDAsIGRldl9wcml2LT52cmFtX3NpemUpOwotCWlmIChyZXQpIHsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgTlVMTCwgNDA5NiwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwgMCwgMCwKLQkJCSAgICAgZmFsc2UsIHRydWUsICZjaGFuLT5wdXNoYnVmX2JvKTsKLQlpZiAocmV0ID09IDApCi0JCXJldCA9IG5vdXZlYXVfYm9fcGluKGNoYW4tPnB1c2hidWZfYm8sIFRUTV9QTF9GTEFHX1ZSQU0pOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgRVZPIERNQSBwdXNoIGJ1ZmZlcjogJWRcbiIsIHJldCk7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBub3V2ZWF1X2JvX21hcChjaGFuLT5wdXNoYnVmX2JvKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIG1hcHBpbmcgRVZPIERNQSBwdXNoIGJ1ZmZlcjogJWRcbiIsIHJldCk7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljaGFuLT51c2VyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArCi0JCQkJCU5WNTBfUERJU1BMQVlfVVNFUigwKSwgUEFHRV9TSVpFKTsKLQlpZiAoIWNoYW4tPnVzZXIpIHsKLQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgbWFwcGluZyBFVk8gY29udHJvbCByZWdzLlxuIik7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIGludAogbnY1MF9kaXNwbGF5X2Vhcmx5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTIxNCwxNyArNjMsMTYgQEAKIG52NTBfZGlzcGxheV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgKnB0aW1lciA9ICZkZXZfcHJpdi0+ZW5naW5lLnRpbWVyOwogCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87Ci0Jc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gZGV2X3ByaXYtPmV2bzsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCXVpbnQzMl90IHZhbCwgcmFtX2Ftb3VudDsKLQl1aW50NjRfdCBzdGFydDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm87CiAJaW50IHJldCwgaTsKKwl1MzIgdmFsOwogCiAJTlZfREVCVUdfS01TKGRldiwgIlxuIik7CiAKIAludl93cjMyKGRldiwgMHgwMDYxMDE4NCwgbnZfcmQzMihkZXYsIDB4MDA2MTQwMDQpKTsKKwogCS8qCiAJICogSSB0aGluayB0aGUgMHgwMDYxMDFYWCByYW5nZSBpcyBzb21lIGtpbmQgb2YgbWFpbiBjb250cm9sIGFyZWEKIAkgKiB0aGF0IGVuYWJsZXMgdGhpbmdzLgpAQCAtMjQwLDE2ICs4OCwxOSBAQAogCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxNjEwYyArIChpICogMHg4MDApKTsKIAkJbnZfd3IzMihkZXYsIDB4MDA2MTAxOWMgKyAoaSAqIDB4MTApLCB2YWwpOwogCX0KKwogCS8qIERBQyAqLwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MWEwMDAgKyAoaSAqIDB4ODAwKSk7CiAJCW52X3dyMzIoZGV2LCAweDAwNjEwMWQwICsgKGkgKiAweDA0KSwgdmFsKTsKIAl9CisKIAkvKiBTT1IgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnY1MF9zb3JfbnIoZGV2KTsgaSsrKSB7CiAJCXZhbCA9IG52X3JkMzIoZGV2LCAweDAwNjFjMDAwICsgKGkgKiAweDgwMCkpOwogCQludl93cjMyKGRldiwgMHgwMDYxMDFlMCArIChpICogMHgwNCksIHZhbCk7CiAJfQorCiAJLyogRVhUICovCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxZTAwMCArIChpICogMHg4MDApKTsKQEAgLTI2MiwxNyArMTEzLDYgQEAKIAkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfREFDX0NMS19DVFJMMShpKSwgMHgwMDAwMDAwMSk7CiAJfQogCi0JLyogVGhpcyB1c2VkIHRvIGJlIGluIGNydGMgdW5ibGFuaywgYnV0IHNlZW1zIG91dCBvZiBwbGFjZSB0aGVyZS4gKi8KLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VTktfMzgwLCAwKTsKLQkvKiBSQU0gaXMgY2xhbXBlZCB0byAyNTYgTWlCLiAqLwotCXJhbV9hbW91bnQgPSBkZXZfcHJpdi0+dnJhbV9zaXplOwotCU5WX0RFQlVHX0tNUyhkZXYsICJyYW1fYW1vdW50ICVkXG4iLCByYW1fYW1vdW50KTsKLQlpZiAocmFtX2Ftb3VudCA+IDI1NioxMDI0KjEwMjQpCi0JCXJhbV9hbW91bnQgPSAyNTYqMTAyNCoxMDI0OwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1JBTV9BTU9VTlQsIHJhbV9hbW91bnQgLSAxKTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VTktfMzg4LCAweDE1MDAwMCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVU5LXzM4QywgMCk7Ci0KIAkvKiBUaGUgcHJlY2lzZSBwdXJwb3NlIGlzIHVua25vd24sIGkgc3VzcGVjdCBpdCBoYXMgc29tZXRoaW5nIHRvIGRvCiAJICogd2l0aCB0ZXh0IG1vZGUuCiAJICovCkBAIC0yODcsMzcgKzEyNyw2IEBACiAJCX0KIAl9CiAKLQkvKiB0YWtlbiBmcm9tIG52IGJ1ZyAjMTI2MzcsIGF0dGVtcHRzIHRvIHVuLXdlZGdlIHRoZSBodyBpZiBpdCdzCi0JICogc3R1Y2sgaW4gc29tZSB1bnNwZWNpZmllZCBzdGF0ZQotCSAqLwotCXN0YXJ0ID0gcHRpbWVyLT5yZWFkKGRldik7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDJiMDApOwotCXdoaWxlICgodmFsID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSkgJiAweDFlMDAwMCkgewotCQlpZiAoKHZhbCAmIDB4OWYwMDAwKSA9PSAweDIwMDAwKQotCQkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAotCQkJCQkJCXZhbCB8IDB4ODAwMDAwKTsKLQotCQlpZiAoKHZhbCAmIDB4M2YwMDAwKSA9PSAweDMwMDAwKQotCQkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAotCQkJCQkJCXZhbCB8IDB4MjAwMDAwKTsKLQotCQlpZiAocHRpbWVyLT5yZWFkKGRldikgLSBzdGFydCA+IDEwMDAwMDAwMDBVTEwpIHsKLQkJCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxMDIwMCAmIDB4MWUwMDAwKSAhPSAwXG4iKTsKLQkJCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLCB2YWwpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NUUkxfU1RBVEUsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURV9FTkFCTEUpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHgxMDAwYjAzKTsKLQlpZiAoIW52X3dhaXQoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwKLQkJICAgICAweDQwMDAwMDAwLCAweDQwMDAwMDAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHg2MTAyMDAgJiAweDQwMDAwMDAwKSA9PSAweDQwMDAwMDAwXG4iKTsKLQkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsCi0JCQkgIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSkpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMihpKSwgMHgyMDAwKTsKIAkJaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLApAQCAtMzQxLDM5ICsxNTAsMzEgQEAKIAkJfQogCX0KIAotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX09CSkVDVFMsIChldm8tPnJhbWluLT52aW5zdCA+PiA4KSB8IDkpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1BJT19DVFJMLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMCwgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOXzEsCisJCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOXzFfQ0xLX1VOSzEwIHwKKwkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMjAgfAorCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX0NMS19VTks0MCk7CiAKLQkvKiBpbml0aWFsaXNlIGZpZm8gKi8KLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQigwKSwKLQkJKChldm8tPnB1c2hidWZfYm8tPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUKSA+PiA4KSB8Ci0JCU5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT05fVlJBTSB8Ci0JCU5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfVkFMSUQpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfVU5LMigwKSwgMHgwMDAxMDAwMCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTkszKDApLCAweDAwMDAwMDAyKTsKLQlpZiAoIW52X3dhaXQoZGV2LCAweDYxMDIwMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHg4MDAwMDAwMCkgPT0gMFxuIik7Ci0JCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHg2MTAyMDApKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkvKiBlbmFibGUgaG90cGx1ZyBpbnRlcnJ1cHRzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubiA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisKKwkJaWYgKGNvbm4tPmRjYi0+Z3Bpb190YWcgPT0gMHhmZikKKwkJCWNvbnRpbnVlOworCisJCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgY29ubi0+ZGNiLT5ncGlvX3RhZywgdHJ1ZSk7CiAJfQotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwKLQkJKG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSkgJiB+MHgwMDAwMDAwMykgfAotCQkgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0VOQUJMRUQpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VTRVJfUFVUKDApLCAwKTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDB4MDEwMDAwMDMgfAotCQlOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUFfRU5BQkxFRCk7Ci0JbnZfd3IzMihkZXYsIDB4NjEwMzAwLCBudl9yZDMyKGRldiwgMHg2MTAzMDApICYgfjEpOwogCi0JZXZvLT5kbWEubWF4ID0gKDQwOTYvNCkgLSAyOwotCWV2by0+ZG1hLnB1dCA9IDA7Ci0JZXZvLT5kbWEuY3VyID0gZXZvLT5kbWEucHV0OwotCWV2by0+ZG1hLmZyZWUgPSBldm8tPmRtYS5tYXggLSBldm8tPmRtYS5jdXI7Ci0KLQlyZXQgPSBSSU5HX1NQQUNFKGV2bywgTk9VVkVBVV9ETUFfU0tJUFMpOworCXJldCA9IG52NTBfZXZvX2luaXQoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWV2byA9IGRldl9wcml2LT5ldm87CiAKLQlmb3IgKGkgPSAwOyBpIDwgTk9VVkVBVV9ETUFfU0tJUFM7IGkrKykKLQkJT1VUX1JJTkcoZXZvLCAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9PQkpFQ1RTLCAoZXZvLT5yYW1pbi0+dmluc3QgPj4gOCkgfCA5KTsKIAogCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCAxMSk7CiAJaWYgKHJldCkKQEAgLTM5MywyMSArMTk0LDYgQEAKIAlpZiAoIW52X3dhaXQoZGV2LCAweDY0MDAwNCwgMHhmZmZmZmZmZiwgZXZvLT5kbWEucHV0IDw8IDIpKQogCQlOVl9FUlJPUihkZXYsICJldm8gcHVzaGJ1ZiBzdGFsbGVkXG4iKTsKIAotCS8qIGVuYWJsZSBjbG9jayBjaGFuZ2UgaW50ZXJydXB0cy4gKi8KLQludl93cjMyKGRldiwgMHg2MTAwMjgsIDB4MDAwMTAwMDEpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4sIChOVjUwX1BESVNQTEFZX0lOVFJfRU5fQ0xLX1VOSzEwIHwKLQkJCQkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fQ0xLX1VOSzIwIHwKLQkJCQkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fQ0xLX1VOSzQwKSk7Ci0KLQkvKiBlbmFibGUgaG90cGx1ZyBpbnRlcnJ1cHRzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0b3IsICZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqY29ubiA9IG5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0KLQkJaWYgKGNvbm4tPmRjYi0+Z3Bpb190YWcgPT0gMHhmZikKLQkJCWNvbnRpbnVlOwotCi0JCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgY29ubi0+ZGNiLT5ncGlvX3RhZywgdHJ1ZSk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTIsMTMgKzIzOCw3IEBACiAJCX0KIAl9CiAKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDApOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NUUkxfU1RBVEUsIDApOwotCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDFlMDAwMCwgMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHgxZTAwMDApID09IDBcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDYxMDIwMCA9IDB4JTA4eFxuIiwKLQkJCSAgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSk7Ci0JfQorCW52NTBfZXZvX2ZpbmkoZGV2KTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9TT1JfRFBNU19TVEFURShpKSwKQEAgLTQ3MCw3ICsyNTAsNyBAQAogCX0KIAogCS8qIGRpc2FibGUgaW50ZXJydXB0cy4gKi8KLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOXzEsIDB4MDAwMDAwMDApOwogCiAJLyogZGlzYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KIAludl93cjMyKGRldiwgMHhlMDU0LCAweGZmZmZmZmZmKTsKQEAgLTUwOCwxMyArMjg4LDYgQEAKIAogCWRldi0+bW9kZV9jb25maWcuZmJfYmFzZSA9IGRldl9wcml2LT5mYl9waHlzOwogCi0JLyogQ3JlYXRlIEVWTyBjaGFubmVsICovCi0JcmV0ID0gbnY1MF9ldm9fY2hhbm5lbF9uZXcoZGV2LCAmZGV2X3ByaXYtPmV2byk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBFVk8gY2hhbm5lbDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJLyogQ3JlYXRlIENSVEMgb2JqZWN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCiAJCW52NTBfY3J0Y19jcmVhdGUoZGV2LCBpKTsKQEAgLTU1Nyw2ICszMzAsOSBAQAogCQl9CiAJfQogCisJSU5JVF9XT1JLKCZkZXZfcHJpdi0+aXJxX3dvcmssIG52NTBfZGlzcGxheV9pcnFfaGFuZGxlcl9iaCk7CisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNiwgbnY1MF9kaXNwbGF5X2lzcik7CisKIAlyZXQgPSBudjUwX2Rpc3BsYXlfaW5pdChkZXYpOwogCWlmIChyZXQpIHsKIAkJbnY1MF9kaXNwbGF5X2Rlc3Ryb3koZGV2KTsKQEAgLTU2OSwxNCArMzQ1LDEyIEBACiB2b2lkCiBudjUwX2Rpc3BsYXlfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAogCWRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKGRldik7CiAKIAludjUwX2Rpc3BsYXlfZGlzYWJsZShkZXYpOwotCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMjYpOwogfQogCiBzdGF0aWMgdTE2CkBAIC02NjAsMzIgKzQzNCwzMiBAQAogbnY1MF9kaXNwbGF5X3ZibGFua19jcnRjX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sICp0bXA7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmRldl9wcml2LT52Ymxfd2FpdGluZykgewotCQljaGFuID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCwgbnZzdy52Ymxfd2FpdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIHRtcCwgJmRldl9wcml2LT52Ymxfd2FpdGluZywKKwkJCQkgbnZzdy52Ymxfd2FpdCkgeworCQlpZiAoY2hhbi0+bnZzdy52YmxzZW1faGVhZCAhPSBjcnRjKQorCQkJY29udGludWU7CiAKIAkJbm91dmVhdV9ib193cjMyKGNoYW4tPm5vdGlmaWVyX2JvLCBjaGFuLT5udnN3LnZibHNlbV9vZmZzZXQsCiAJCQkJCQljaGFuLT5udnN3LnZibHNlbV9ydmFsKTsKIAkJbGlzdF9kZWwoJmNoYW4tPm52c3cudmJsX3dhaXQpOworCQlkcm1fdmJsYW5rX3B1dChkZXYsIGNydGMpOwogCX0KKworCWRybV9oYW5kbGVfdmJsYW5rKGRldiwgY3J0Yyk7CiB9CiAKIHN0YXRpYyB2b2lkCiBudjUwX2Rpc3BsYXlfdmJsYW5rX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaW50cikKIHsKLQlpbnRyICY9IE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDOwotCiAJaWYgKGludHIgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18wKQogCQludjUwX2Rpc3BsYXlfdmJsYW5rX2NydGNfaGFuZGxlcihkZXYsIDApOwogCiAJaWYgKGludHIgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18xKQogCQludjUwX2Rpc3BsYXlfdmJsYW5rX2NydGNfaGFuZGxlcihkZXYsIDEpOwogCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTiwgbnZfcmQzMihkZXYsCi0JCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOKSAmIH5pbnRyKTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIGludHIpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTAxMSwxMDggKzc4NSwzMSBAQAogc3RhdGljIHZvaWQKIG52NTBfZGlzcGxheV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JdWludDMyX3QgYWRkciwgZGF0YTsKKwl1MzIgY2hhbm5lbHMgPSAobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wKSAmIDB4MDAxZjAwMDApID4+IDE2OworCXUzMiBhZGRyLCBkYXRhOworCWludCBjaGlkOwogCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wLCAweDAwMDEwMDAwKTsKLQlhZGRyID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9BRERSKTsKLQlkYXRhID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9EQVRBKTsKLQotCU5WX0VSUk9SKGRldiwgIkV2b0NoICVkIE10aGQgMHglMDR4IERhdGEgMHglMDh4ICgweCUwNHggMHglMDJ4KVxuIiwKLQkJIDAsIGFkZHIgJiAweGZmYywgZGF0YSwgYWRkciA+PiAxNiwgKGFkZHIgPj4gMTIpICYgMHhmKTsKLQotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUiwgMHg5MDAwMDAwMCk7Ci19Ci0KLXZvaWQKLW52NTBfZGlzcGxheV9pcnFfaG90cGx1Z19iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlLCBocGRfd29yayk7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQljb25zdCB1aW50MzJfdCBncGlvX3JlZ1s0XSA9IHsgMHhlMTA0LCAweGUxMDgsIDB4ZTI4MCwgMHhlMjg0IH07Ci0JdWludDMyX3QgdW5wbHVnX21hc2ssIHBsdWdfbWFzaywgY2hhbmdlX21hc2s7Ci0JdWludDMyX3QgaHBkMCwgaHBkMTsKLQotCXNwaW5fbG9ja19pcnEoJmRldl9wcml2LT5ocGRfc3RhdGUubG9jayk7Ci0JaHBkMCA9IGRldl9wcml2LT5ocGRfc3RhdGUuaHBkMF9iaXRzOwotCWRldl9wcml2LT5ocGRfc3RhdGUuaHBkMF9iaXRzID0gMDsKLQlocGQxID0gZGV2X3ByaXYtPmhwZF9zdGF0ZS5ocGQxX2JpdHM7Ci0JZGV2X3ByaXYtPmhwZF9zdGF0ZS5ocGQxX2JpdHMgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmZGV2X3ByaXYtPmhwZF9zdGF0ZS5sb2NrKTsKLQotCWhwZDAgJj0gbnZfcmQzMihkZXYsIDB4ZTA1MCk7Ci0JaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApCi0JCWhwZDEgJj0gbnZfcmQzMihkZXYsIDB4ZTA3MCk7Ci0KLQlwbHVnX21hc2sgICA9IChocGQwICYgMHgwMDAwZmZmZikgfCAoaHBkMSA8PCAxNik7Ci0JdW5wbHVnX21hc2sgPSAoaHBkMCA+PiAxNikgfCAoaHBkMSAmIDB4ZmZmZjAwMDApOwotCWNoYW5nZV9tYXNrID0gcGx1Z19tYXNrIHwgdW5wbHVnX21hc2s7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqaGVscGVyOwotCQlzdHJ1Y3Qgbm91dmVhdV9jb25uZWN0b3IgKm52X2Nvbm5lY3RvciA9Ci0JCQlub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyOwotCQlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87Ci0JCXVpbnQzMl90IHJlZzsKLQkJYm9vbCBwbHVnZ2VkOwotCi0JCWlmICghbnZfY29ubmVjdG9yLT5kY2IpCisJZm9yIChjaGlkID0gMDsgY2hpZCA8IDU7IGNoaWQrKykgeworCQlpZiAoIShjaGFubmVscyAmICgxIDw8IGNoaWQpKSkKIAkJCWNvbnRpbnVlOwogCi0JCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZyk7Ci0JCWlmICghZ3BpbyB8fCAhKGNoYW5nZV9tYXNrICYgKDEgPDwgZ3Bpby0+bGluZSkpKQotCQkJY29udGludWU7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCwgMHgwMDAxMDAwMCA8PCBjaGlkKTsKKwkJYWRkciA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUihjaGlkKSk7CisJCWRhdGEgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9UUkFQUEVEX0RBVEEoY2hpZCkpOworCQlOVl9FUlJPUihkZXYsICJFdm9DaCAlZCBNdGhkIDB4JTA0eCBEYXRhIDB4JTA4eCAiCisJCQkgICAgICAiKDB4JTA0eCAweCUwMngpXG4iLCBjaGlkLAorCQkJIGFkZHIgJiAweGZmYywgZGF0YSwgYWRkciA+PiAxNiwgKGFkZHIgPj4gMTIpICYgMHhmKTsKIAotCQlyZWcgPSBudl9yZDMyKGRldiwgZ3Bpb19yZWdbZ3Bpby0+bGluZSA+PiAzXSk7Ci0JCXBsdWdnZWQgPSAhIShyZWcgJiAoNCA8PCAoKGdwaW8tPmxpbmUgJiA3KSA8PCAyKSkpOwotCQlOVl9JTkZPKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKLQkJCWRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSkgOwotCi0JCWlmICghY29ubmVjdG9yLT5lbmNvZGVyIHx8ICFjb25uZWN0b3ItPmVuY29kZXItPmNydGMgfHwKLQkJICAgICFjb25uZWN0b3ItPmVuY29kZXItPmNydGMtPmVuYWJsZWQpCi0JCQljb250aW51ZTsKLQkJbnZfZW5jb2RlciA9IG5vdXZlYXVfZW5jb2Rlcihjb25uZWN0b3ItPmVuY29kZXIpOwotCQloZWxwZXIgPSBjb25uZWN0b3ItPmVuY29kZXItPmhlbHBlcl9wcml2YXRlOwotCi0JCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgIT0gT1VUUFVUX0RQKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBsdWdnZWQpCi0JCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKLQkJZWxzZQotCQkJaGVscGVyLT5kcG1zKGNvbm5lY3Rvci0+ZW5jb2RlciwgRFJNX01PREVfRFBNU19PRkYpOworCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIoY2hpZCksIDB4OTAwMDAwMDApOwogCX0KLQotCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkZXYpOwogfQogCi12b2lkCi1udjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkCitudjUwX2Rpc3BsYXlfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBkZWxheWVkID0gMDsKIAotCWlmIChudl9yZDMyKGRldiwgTlY1MF9QTUNfSU5UUl8wKSAmIE5WNTBfUE1DX0lOVFJfMF9IT1RQTFVHKSB7Ci0JCXVpbnQzMl90IGhwZDBfYml0cywgaHBkMV9iaXRzID0gMDsKLQotCQlocGQwX2JpdHMgPSBudl9yZDMyKGRldiwgMHhlMDU0KTsKLQkJbnZfd3IzMihkZXYsIDB4ZTA1NCwgaHBkMF9iaXRzKTsKLQotCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkgewotCQkJaHBkMV9iaXRzID0gbnZfcmQzMihkZXYsIDB4ZTA3NCk7Ci0JCQludl93cjMyKGRldiwgMHhlMDc0LCBocGQxX2JpdHMpOwotCQl9Ci0KLQkJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+aHBkX3N0YXRlLmxvY2spOwotCQlkZXZfcHJpdi0+aHBkX3N0YXRlLmhwZDBfYml0cyB8PSBocGQwX2JpdHM7Ci0JCWRldl9wcml2LT5ocGRfc3RhdGUuaHBkMV9iaXRzIHw9IGhwZDFfYml0czsKLQkJc3Bpbl91bmxvY2soJmRldl9wcml2LT5ocGRfc3RhdGUubG9jayk7Ci0KLQkJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+aHBkX3dvcmspOwotCX0KLQogCXdoaWxlIChudl9yZDMyKGRldiwgTlY1MF9QTUNfSU5UUl8wKSAmIE5WNTBfUE1DX0lOVFJfMF9ESVNQTEFZKSB7CiAJCXVpbnQzMl90IGludHIwID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wKTsKIAkJdWludDMyX3QgaW50cjEgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEpOwpAQCAtMTEyMyw5ICs4MjAsOSBAQAogCQlpZiAoIWludHIwICYmICEoaW50cjEgJiB+ZGVsYXllZCkpCiAJCQlicmVhazsKIAotCQlpZiAoaW50cjAgJiAweDAwMDEwMDAwKSB7CisJCWlmIChpbnRyMCAmIDB4MDAxZjAwMDApIHsKIAkJCW52NTBfZGlzcGxheV9lcnJvcl9oYW5kbGVyKGRldik7Ci0JCQlpbnRyMCAmPSB+MHgwMDAxMDAwMDsKKwkJCWludHIwICY9IH4weDAwMWYwMDAwOwogCQl9CiAKIAkJaWYgKGludHIxICYgTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEMpIHsKQEAgLTExNTYsNCArODUzLDMgQEAKIAkJfQogCX0KIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaAppbmRleCBjNTUxZjBiLi5mMGUzMGI3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmgKQEAgLTM1LDkgKzM1LDcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2NydGMuaCIKICNpbmNsdWRlICJudjUwX2V2by5oIgogCi12b2lkIG52NTBfZGlzcGxheV9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIG52NTBfZGlzcGxheV9pcnFfaG90cGx1Z19iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IG52NTBfZGlzcGxheV9lYXJseV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBudjUwX2Rpc3BsYXlfbGF0ZV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGludCBudjUwX2Rpc3BsYXlfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMjRlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCisKK3N0YXRpYyB2b2lkCitudjUwX2V2b19jaGFubmVsX2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGV2bykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvID0gKnBldm87CisKKwlpZiAoIWV2bykKKwkJcmV0dXJuOworCSpwZXZvID0gTlVMTDsKKworCWRldl9wcml2ID0gZXZvLT5kZXYtPmRldl9wcml2YXRlOworCWRldl9wcml2LT5ldm9fYWxsb2MgJj0gfigxIDw8IGV2by0+aWQpOworCisJbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihldm8pOworCW5vdXZlYXVfYm9fdW5tYXAoZXZvLT5wdXNoYnVmX2JvKTsKKwlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZXZvLT5wdXNoYnVmX2JvKTsKKworCWlmIChldm8tPnVzZXIpCisJCWlvdW5tYXAoZXZvLT51c2VyKTsKKworCWtmcmVlKGV2byk7Cit9CisKK2ludAorbnY1MF9ldm9fZG1hb2JqX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8sIHUzMiBjbGFzcywgdTMyIG5hbWUsCisJCSAgICB1MzIgdGlsZV9mbGFncywgdTMyIG1hZ2ljX2ZsYWdzLCB1MzIgb2Zmc2V0LCB1MzIgbGltaXQsCisJCSAgICB1MzIgZmxhZ3M1KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGV2by0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZXZvLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBkZXZfcHJpdi0+ZXZvLCA2KjQsIDMyLCAwLCAmb2JqKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW9iai0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX0RJU1BMQVk7CisKKwludl93bzMyKG9iaiwgIDAsICh0aWxlX2ZsYWdzIDw8IDIyKSB8IChtYWdpY19mbGFncyA8PCAxNikgfCBjbGFzcyk7CisJbnZfd28zMihvYmosICA0LCBsaW1pdCk7CisJbnZfd28zMihvYmosICA4LCBvZmZzZXQpOworCW52X3dvMzIob2JqLCAxMiwgMHgwMDAwMDAwMCk7CisJbnZfd28zMihvYmosIDE2LCAweDAwMDAwMDAwKTsKKwludl93bzMyKG9iaiwgMjAsIGZsYWdzNSk7CisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CisKKwlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChldm8sIG5hbWUsIG9iaik7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZvYmopOworCWlmIChyZXQpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9ldm9fY2hhbm5lbF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBldm8pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm87CisJaW50IHJldDsKKworCWV2byA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV2bykKKwkJcmV0dXJuIC1FTk9NRU07CisJKnBldm8gPSBldm87CisKKwlmb3IgKGV2by0+aWQgPSAwOyBldm8tPmlkIDwgNTsgZXZvLT5pZCsrKSB7CisJCWlmIChkZXZfcHJpdi0+ZXZvX2FsbG9jICYgKDEgPDwgZXZvLT5pZCkpCisJCQljb250aW51ZTsKKworCQlkZXZfcHJpdi0+ZXZvX2FsbG9jIHw9ICgxIDw8IGV2by0+aWQpOworCQlicmVhazsKKwl9CisKKwlpZiAoZXZvLT5pZCA9PSA1KSB7CisJCWtmcmVlKGV2byk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWV2by0+ZGV2ID0gZGV2OworCWV2by0+dXNlcl9nZXQgPSA0OworCWV2by0+dXNlcl9wdXQgPSAwOworCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA0MDk2LCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAwLAorCQkJICAgICBmYWxzZSwgdHJ1ZSwgJmV2by0+cHVzaGJ1Zl9ibyk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBub3V2ZWF1X2JvX3Bpbihldm8tPnB1c2hidWZfYm8sIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgRVZPIERNQSBwdXNoIGJ1ZmZlcjogJWRcbiIsIHJldCk7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKGV2by0+cHVzaGJ1Zl9ibyk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBtYXBwaW5nIEVWTyBETUEgcHVzaCBidWZmZXI6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbChwZXZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlldm8tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKKwkJCSAgICBOVjUwX1BESVNQTEFZX1VTRVIoZXZvLT5pZCksIFBBR0VfU0laRSk7CisJaWYgKCFldm8tPnVzZXIpIHsKKwkJTlZfRVJST1IoZGV2LCAiRXJyb3IgbWFwcGluZyBFVk8gY29udHJvbCByZWdzLlxuIik7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBldm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBiaW5kIHByaW1hcnkgZXZvIGNoYW5uZWwncyByYW1odCB0byB0aGUgY2hhbm5lbCAqLworCWlmIChkZXZfcHJpdi0+ZXZvICYmIGV2byAhPSBkZXZfcHJpdi0+ZXZvKQorCQlub3V2ZWF1X3JhbWh0X3JlZihkZXZfcHJpdi0+ZXZvLT5yYW1odCwgJmV2by0+cmFtaHQsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZXZvX2NoYW5uZWxfaW5pdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGV2by0+ZGV2OworCWludCBpZCA9IGV2by0+aWQsIHJldCwgaTsKKwl1NjQgcHVzaGJ1ZiA9IGV2by0+cHVzaGJ1Zl9iby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJdTMyIHRtcDsKKworCXRtcCA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSk7CisJaWYgKCh0bXAgJiAweDAwOWYwMDAwKSA9PSAweDAwMDIwMDAwKQorCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIHRtcCB8IDB4MDA4MDAwMDApOworCisJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpKTsKKwlpZiAoKHRtcCAmIDB4MDAzZjAwMDApID09IDB4MDAwMzAwMDApCisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgdG1wIHwgMHgwMDYwMDAwMCk7CisKKwkvKiBpbml0aWFsaXNlIGZpZm8gKi8KKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fRE1BX0NCKGlkKSwgcHVzaGJ1ZiA+PiA4IHwKKwkJICAgICBOVjUwX1BESVNQTEFZX0VWT19ETUFfQ0JfTE9DQVRJT05fVlJBTSB8CisJCSAgICAgTlY1MF9QRElTUExBWV9FVk9fRE1BX0NCX1ZBTElEKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fVU5LMihpZCksIDB4MDAwMTAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19IQVNIX1RBRyhpZCksIGlkKTsKKwludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIE5WNTBfUERJU1BMQVlfRVZPX0NUUkxfRE1BLAorCQkgICAgIE5WNTBfUERJU1BMQVlfRVZPX0NUUkxfRE1BX0VOQUJMRUQpOworCisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVVNFUl9QVVQoaWQpLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIDB4MDEwMDAwMDMgfAorCQkgICAgIE5WNTBfUERJU1BMQVlfRVZPX0NUUkxfRE1BX0VOQUJMRUQpOworCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJFdm9DaCAlZCBpbml0IHRpbWVvdXQ6IDB4JTA4eFxuIiwgaWQsCisJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpKSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogZW5hYmxlIGVycm9yIHJlcG9ydGluZyBvbiB0aGUgY2hhbm5lbCAqLworCW52X21hc2soZGV2LCAweDYxMDAyOCwgMHgwMDAwMDAwMCwgMHgwMDAxMDAwMSA8PCBpZCk7CisKKwlldm8tPmRtYS5tYXggPSAoNDA5Ni80KSAtIDI7CisJZXZvLT5kbWEucHV0ID0gMDsKKwlldm8tPmRtYS5jdXIgPSBldm8tPmRtYS5wdXQ7CisJZXZvLT5kbWEuZnJlZSA9IGV2by0+ZG1hLm1heCAtIGV2by0+ZG1hLmN1cjsKKworCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCBOT1VWRUFVX0RNQV9TS0lQUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBOT1VWRUFVX0RNQV9TS0lQUzsgaSsrKQorCQlPVVRfUklORyhldm8sIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2V2b19jaGFubmVsX2Zpbmkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqZXZvKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBldm8tPmRldjsKKwlpbnQgaWQgPSBldm8tPmlkOworCisJbnZfbWFzayhkZXYsIDB4NjEwMDI4LCAweDAwMDEwMDAxIDw8IGlkLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIDB4MDAwMDEwMTAsIDB4MDAwMDEwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCwgKDEgPDwgaWQpKTsKKwludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDApOworCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpLCAweDAwMWUwMDAwLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJFdm9DaCAlZCB0YWtlZG93biB0aW1lb3V0OiAweCUwOHhcbiIsIGlkLAorCQkJIG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSkpOworCX0KK30KKworc3RhdGljIGludAorbnY1MF9ldm9fY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWh0ID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm87CisJaW50IHJldDsKKworCS8qIGNyZWF0ZSBwcmltYXJ5IGV2byBjaGFubmVsLCB0aGUgb25lIHdlIHVzZSBmb3IgbW9kZXNldHRpbmcKKwkgKiBwdXJwb3JzZXMKKwkgKi8KKwlyZXQgPSBudjUwX2V2b19jaGFubmVsX25ldyhkZXYsICZkZXZfcHJpdi0+ZXZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWV2byA9IGRldl9wcml2LT5ldm87CisKKwkvKiBzZXR1cCBvYmplY3QgbWFuYWdlbWVudCBvbiBpdCwgYW55IG90aGVyIGV2byBjaGFubmVsIHdpbGwKKwkgKiB1c2UgdGhpcyBhbHNvIGFzIHRoZXJlJ3Mgbm8gcGVyLWNoYW5uZWwgc3VwcG9ydCBvbiB0aGUKKwkgKiBoYXJkd2FyZQorCSAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDMyNzY4LCA2NTUzNiwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmZXZvLT5yYW1pbik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBhbGxvY2F0aW5nIEVWTyBjaGFubmVsIG1lbW9yeTogJWRcbiIsIHJldCk7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkcm1fbW1faW5pdCgmZXZvLT5yYW1pbl9oZWFwLCAwLCAzMjc2OCk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBpbml0aWFsaXNpbmcgRVZPIFBSQU1JTiBoZWFwOiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGV2bywgNDA5NiwgMTYsIDAsICZyYW1odCk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgRVZPIFJBTUhUOiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfcmFtaHRfbmV3KGRldiwgcmFtaHQsICZldm8tPnJhbWh0KTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnJhbWh0KTsKKwlpZiAocmV0KSB7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBjcmVhdGUgc29tZSBkZWZhdWx0IG9iamVjdHMgZm9yIHRoZSBzY2Fub3V0IG1lbXR5cGVzIHdlIHN1cHBvcnQgKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkgeworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGV2bywgMHgzZCwgTnZFdm9GQjMyLCAweGZlLCAweDE5LAorCQkJCQkgIDAsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDApOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhldm8sIDB4M2QsIE52RXZvVlJBTSwgMCwgMHgxOSwKKwkJCQkJICAwLCBkZXZfcHJpdi0+dnJhbV9zaXplLCAweDAwMDIwMDAwKTsKKwkJaWYgKHJldCkgeworCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoZXZvLCAweDNkLCBOdkV2b1ZSQU1fTFAsIDAsIDB4MTksCisJCQkJCSAgMCwgZGV2X3ByaXYtPnZyYW1fc2l6ZSwgMHgwMDAwMDAwMCk7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkgeworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGV2bywgMHgzZCwgTnZFdm9GQjE2LCAweDcwLCAweDE5LAorCQkJCQkgIDAsIDB4ZmZmZmZmZmYsIDB4MDAwMTAwMDApOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGV2bywgMHgzZCwgTnZFdm9GQjMyLCAweDdhLCAweDE5LAorCQkJCQkgIDAsIDB4ZmZmZmZmZmYsIDB4MDAwMTAwMDApOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhldm8sIDB4M2QsIE52RXZvVlJBTSwgMCwgMHgxOSwKKwkJCQkJICAwLCBkZXZfcHJpdi0+dnJhbV9zaXplLCAweDAwMDEwMDAwKTsKKwkJaWYgKHJldCkgeworCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoZXZvLCAweDNkLCBOdkV2b1ZSQU1fTFAsIDAsIDB4MTksCisJCQkJCSAgMCwgZGV2X3ByaXYtPnZyYW1fc2l6ZSwgMHgwMDAxMDAwMCk7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitudjUwX2V2b19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZfcHJpdi0+ZXZvKSB7CisJCXJldCA9IG52NTBfZXZvX2NyZWF0ZShkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gbnY1MF9ldm9fY2hhbm5lbF9pbml0KGRldl9wcml2LT5ldm8pOworfQorCit2b2lkCitudjUwX2V2b19maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+ZXZvKSB7CisJCW52NTBfZXZvX2NoYW5uZWxfZmluaShkZXZfcHJpdi0+ZXZvKTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2V2by5oCmluZGV4IGFhZTEzMzQuLmFhNGYwZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaApAQCAtMjQsNiArMjQsMTUgQEAKICAqCiAgKi8KIAorI2lmbmRlZiBfX05WNTBfRVZPX0hfXworI2RlZmluZSBfX05WNTBfRVZPX0hfXworCitpbnQgIG52NTBfZXZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cit2b2lkIG52NTBfZXZvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgIG52NTBfZXZvX2RtYW9ial9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCB1MzIgY2xhc3MsIHUzMiBuYW1lLAorCQkJIHUzMiB0aWxlX2ZsYWdzLCB1MzIgbWFnaWNfZmxhZ3MsCisJCQkgdTMyIG9mZnNldCwgdTMyIGxpbWl0KTsKKwogI2RlZmluZSBOVjUwX0VWT19VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAogI2RlZmluZSBOVjUwX0VWT19VTks4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4NAogI2RlZmluZSBOVjUwX0VWT19VTks4NF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMApAQCAtMTExLDMgKzEyMCw0IEBACiAjZGVmaW5lIE5WNTBfRVZPX0NSVENfU0NBTEVfUkVTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwOGQ4CiAjZGVmaW5lIE5WNTBfRVZPX0NSVENfU0NBTEVfUkVTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwOGRjCiAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYi5jCmluZGV4IGNkMTk4OGIuLjUwMjkwZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiLmMKQEAgLTMsMzAgKzMsNzUgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAKK3N0cnVjdCBudjUwX2ZiX3ByaXYgeworCXN0cnVjdCBwYWdlICpyMTAwYzA4X3BhZ2U7CisJZG1hX2FkZHJfdCByMTAwYzA4OworfTsKKworc3RhdGljIGludAorbnY1MF9mYl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2ZiX3ByaXYgKnByaXY7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+cjEwMGMwOF9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJaWYgKCFwcml2LT5yMTAwYzA4X3BhZ2UpIHsKKwkJa2ZyZWUocHJpdik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaXYtPnIxMDBjMDggPSBwY2lfbWFwX3BhZ2UoZGV2LT5wZGV2LCBwcml2LT5yMTAwYzA4X3BhZ2UsIDAsCisJCQkJICAgICBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihkZXYtPnBkZXYsIHByaXYtPnIxMDBjMDgpKSB7CisJCV9fZnJlZV9wYWdlKHByaXYtPnIxMDBjMDhfcGFnZSk7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkZXZfcHJpdi0+ZW5naW5lLmZiLnByaXYgPSBwcml2OworCXJldHVybiAwOworfQorCiBpbnQKIG52NTBfZmJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfZmJfcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZfcHJpdi0+ZW5naW5lLmZiLnByaXYpIHsKKwkJcmV0ID0gbnY1MF9mYl9jcmVhdGUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmZiLnByaXY7CiAKIAkvKiBOb3QgYSBjbHVlIHdoYXQgdGhpcyBpcyBleGFjdGx5LiAgV2l0aG91dCBwb2ludGluZyBpdCBhdCBhCiAJICogc2NyYXRjaCBwYWdlLCBWUkFNLT5HQVJUIGJsaXRzIHdpdGggTTJNRiAoYXMgaW4gRERYIERGUykKIAkgKiBjYXVzZSBJT01NVSAicmVhZCBmcm9tIGFkZHJlc3MgMCIgZXJyb3JzIChyaCM1NjEyNjcpCiAJICovCi0JbnZfd3IzMihkZXYsIDB4MTAwYzA4LCBkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X2J1cyA+PiA4KTsKKwludl93cjMyKGRldiwgMHgxMDBjMDgsIHByaXYtPnIxMDBjMDggPj4gOCk7CiAKIAkvKiBUaGlzIGlzIG5lZWRlZCB0byBnZXQgbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbiBmcm9tIDEwMGM5MAogCSAqIG9uIHRyYXBzLiBObyBpZGVhIHdoYXQgdGhlc2UgdmFsdWVzIG1lYW4gZXhhY3RseS4gKi8KIAlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CiAJY2FzZSAweDUwOgotCQludl93cjMyKGRldiwgMHgxMDBjOTAsIDB4MDcwN2ZmKTsKKwkJbnZfd3IzMihkZXYsIDB4MTAwYzkwLCAweDAwMDcwN2ZmKTsKIAkJYnJlYWs7CiAJY2FzZSAweGEzOgogCWNhc2UgMHhhNToKIAljYXNlIDB4YTg6Ci0JCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgwZDBmZmYpOworCQludl93cjMyKGRldiwgMHgxMDBjOTAsIDB4MDAwZDBmZmYpOworCQlicmVhazsKKwljYXNlIDB4YWY6CisJCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgwODlkMWZmZik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgxZDA3ZmYpOworCQludl93cjMyKGRldiwgMHgxMDBjOTAsIDB4MDAxZDA3ZmYpOwogCQlicmVhazsKIAl9CiAKQEAgLTM2LDEyICs4MSwyNSBAQAogdm9pZAogbnY1MF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfZmJfcHJpdiAqcHJpdjsKKworCXByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmZiLnByaXY7CisJaWYgKCFwcml2KQorCQlyZXR1cm47CisJZGV2X3ByaXYtPmVuZ2luZS5mYi5wcml2ID0gTlVMTDsKKworCXBjaV91bm1hcF9wYWdlKGRldi0+cGRldiwgcHJpdi0+cjEwMGMwOCwgUEFHRV9TSVpFLAorCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlfX2ZyZWVfcGFnZShwcml2LT5yMTAwYzA4X3BhZ2UpOworCWtmcmVlKHByaXYpOwogfQogCiB2b2lkCiBudjUwX2ZiX3ZtX3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGRpc3BsYXksIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB0cmFwWzZdLCBpZHgsIGNoaW5zdDsKIAlpbnQgaSwgY2g7CiAKQEAgLTYwLDggKzExOCwxMCBAQAogCQlyZXR1cm47CiAKIAljaGluc3QgPSAodHJhcFsyXSA8PCAxNikgfCB0cmFwWzFdOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7CiAJZm9yIChjaCA9IDA7IGNoIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBjaCsrKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hdOworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaF07CiAKIAkJaWYgKCFjaGFuIHx8ICFjaGFuLT5yYW1pbikKIAkJCWNvbnRpbnVlOwpAQCAtNjksNiArMTI5LDcgQEAKIAkJaWYgKGNoaW5zdCA9PSBjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpCiAJCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKIAogCU5WX0lORk8oZGV2LCAiJXMgLSBWTTogVHJhcHBlZCAlcyBhdCAlMDJ4JTA0eCUwNHggc3RhdHVzICUwOHggIgogCQkgICAgICJjaGFubmVsICVkICgweCUwOHgpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYmNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYmNvbi5jCmluZGV4IDZkY2YwNDguLjc5MWRlZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmJjb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiY29uLmMKQEAgLTEsMjkgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKwogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCiAjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCiAKLXZvaWQKK2ludAogbnY1MF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQogewogCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCWludCByZXQ7CiAKLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybjsKLQotCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmCi0JICAgICBSSU5HX1NQQUNFKGNoYW4sIHJlY3QtPnJvcCA9PSBST1BfQ09QWSA/IDcgOiAxMSkpIHsKLQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7Ci0JCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKLQkJcmV0dXJuOwotCX0KKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIHJlY3QtPnJvcCA9PSBST1BfQ09QWSA/IDcgOiAxMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpIHsKIAkJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyYWMsIDEpOwpAQCAtNDUsMjcgKzYyLDIxIEBACiAJCU9VVF9SSU5HKGNoYW4sIDMpOwogCX0KIAlGSVJFX1JJTkcoY2hhbik7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK2ludAogbnY1MF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCiB7CiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCAxMikpIHsKLQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7Ci0JCWNmYl9jb3B5YXJlYShpbmZvLCByZWdpb24pOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMTIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDExMCwgMSk7CiAJT1VUX1JJTkcoY2hhbiwgMCk7CkBAIC04MCw5ICs5MSwxMCBAQAogCU9VVF9SSU5HKGNoYW4sIDApOwogCU9VVF9SSU5HKGNoYW4sIHJlZ2lvbi0+c3kpOwogCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZAoraW50CiBudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOwpAQCAtOTIsMjMgKzEwNCwxNCBAQAogCXVpbnQzMl90IHdpZHRoLCBkd29yZHMsICpkYXRhID0gKHVpbnQzMl90ICopaW1hZ2UtPmRhdGE7CiAJdWludDMyX3QgbWFzayA9IH4ofjAgPj4gKDMyIC0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSk7CiAJdWludDMyX3QgKnBhbGV0dGUgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKwlpbnQgcmV0OwogCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm47CisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgewotCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgMTEpKSB7Ci0JCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKLQl9Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgewotCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKLQkJcmV0dXJuOwotCX0KKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJd2lkdGggPSBBTElHTihpbWFnZS0+d2lkdGgsIDMyKTsKIAlkd29yZHMgPSAod2lkdGggKiBpbWFnZS0+aGVpZ2h0KSA+PiA1OwpAQCAtMTM0LDExICsxMzcsOSBAQAogCXdoaWxlIChkd29yZHMpIHsKIAkJaW50IHB1c2ggPSBkd29yZHMgPiAyMDQ3ID8gMjA0NyA6IGR3b3JkczsKIAotCQlpZiAoUklOR19TUEFDRShjaGFuLCBwdXNoICsgMSkpIHsKLQkJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKLQkJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOwotCQkJcmV0dXJuOwotCQl9CisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgcHVzaCArIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlkd29yZHMgLT0gcHVzaDsKIApAQCAtMTQ4LDYgKzE0OSw3IEBACiAJfQogCiAJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOwogfQogCiBpbnQKQEAgLTE1NywxMiArMTU5LDkgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICplbmcyZCA9IE5VTEw7Ci0JdWludDY0X3QgZmI7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBuZmJkZXYtPm5vdXZlYXVfZmIubnZibzsKIAlpbnQgcmV0LCBmb3JtYXQ7CiAKLQlmYiA9IGluZm8tPmZpeC5zbWVtX3N0YXJ0IC0gZGV2X3ByaXYtPmZiX3BoeXMgKyBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOwotCiAJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDg6CiAJCWZvcm1hdCA9IDB4ZjM7CkBAIC0xOTAsMTIgKzE4OSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgMHg1MDJkLCAmZW5nMmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChkZXZfcHJpdi0+Y2hhbm5lbCwgTnYyRCwgZW5nMmQpOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZW5nMmQpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhkZXZfcHJpdi0+Y2hhbm5lbCwgTnYyRCwgMHg1MDJkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0yNTMsOCArMjQ3LDggQEAKIAlPVVRfUklORyhjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOwogCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOwogCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOwotCU9VVF9SSU5HKGNoYW4sIHVwcGVyXzMyX2JpdHMoZmIpKTsKLQlPVVRfUklORyhjaGFuLCBsb3dlcl8zMl9iaXRzKGZiKSk7CisJT1VUX1JJTkcoY2hhbiwgdXBwZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CisJT1VUX1JJTkcoY2hhbiwgbG93ZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CiAJQkVHSU5fUklORyhjaGFuLCBOdlN1YjJELCAweDAyMzAsIDIpOwogCU9VVF9SSU5HKGNoYW4sIGZvcm1hdCk7CiAJT1VUX1JJTkcoY2hhbiwgMSk7CkBAIC0yNjIsOCArMjU2LDggQEAKIAlPVVRfUklORyhjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOwogCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOwogCU9VVF9SSU5HKGNoYW4sIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOwotCU9VVF9SSU5HKGNoYW4sIHVwcGVyXzMyX2JpdHMoZmIpKTsKLQlPVVRfUklORyhjaGFuLCBsb3dlcl8zMl9iaXRzKGZiKSk7CisJT1VUX1JJTkcoY2hhbiwgdXBwZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CisJT1VUX1JJTkcoY2hhbiwgbG93ZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMKaW5kZXggMWRhNjViZC4uOGRkMDRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKIHN0YXRpYyB2b2lkCiBudjUwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC00NCw3ICs0NSw4IEBACiAKIAkvKiBXZSBuZXZlciBzY2hlZHVsZSBjaGFubmVsIDAgb3IgMTI3ICovCiAJZm9yIChpID0gMSwgbnIgPSAwOyBpIDwgMTI3OyBpKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tpXSAmJiBkZXZfcHJpdi0+Zmlmb3NbaV0tPnJhbWZjKSB7CisJCWlmIChkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldICYmCisJCSAgICBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldLT5yYW1mYykgewogCQkJbnZfd28zMihjdXIsIChuciAqIDQpLCBpKTsKIAkJCW5yKys7CiAJCX0KQEAgLTYwLDcgKzYyLDcgQEAKIG52NTBfZmlmb19jaGFubmVsX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF07CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbY2hhbm5lbF07CiAJdWludDMyX3QgaW5zdDsKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW5uZWwpOwpAQCAtMTA1LDYgKzEwNyw3IEBACiB7CiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgOCwgbnYwNF9maWZvX2lzcik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLCAweEZGRkZGRkZGKTsKIAludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSX0VOXzAsIDB4RkZGRkZGRkYpOwogfQpAQCAtMTE4LDcgKzEyMSw3IEBACiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVjUwX1BGSUZPX0NUWF9UQUJMRV9fU0laRTsgaSsrKSB7Ci0JCWlmIChkZXZfcHJpdi0+Zmlmb3NbaV0pCisJCWlmIChkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldKQogCQkJbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKGRldiwgaSk7CiAJCWVsc2UKIAkJCW52NTBfZmlmb19jaGFubmVsX2Rpc2FibGUoZGV2LCBpKTsKQEAgLTIwNiw2ICsyMDksOSBAQAogCWlmICghcGZpZm8tPnBsYXlsaXN0WzBdKQogCQlyZXR1cm47CiAKKwludl93cjMyKGRldiwgMHgyMTQwLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgOCk7CisKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBmaWZvLT5wbGF5bGlzdFswXSk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZmlmby0+cGxheWxpc3RbMV0pOwogfQpAQCAtMjU2LDYgKzI2MiwxMSBAQAogCX0KIAlyYW1mYyA9IGNoYW4tPnJhbWZjOwogCisJY2hhbi0+dXNlciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKworCQkJICAgICBOVjUwX1VTRVIoY2hhbi0+aWQpLCBQQUdFX1NJWkUpOworCWlmICghY2hhbi0+dXNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKIAogCW52X3dvMzIocmFtZmMsIDB4NDgsIGNoYW4tPnB1c2hidWYtPmNpbnN0ID4+IDQpOwpAQCAtMjkxLDEwICszMDIsMjMgQEAKIG52NTBfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWZjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJcGZpZm8tPnJlYXNzaWduKGRldiwgZmFsc2UpOworCisJLyogVW5sb2FkIHRoZSBjb250ZXh0IGlmIGl0J3MgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lICovCisJaWYgKHBmaWZvLT5jaGFubmVsX2lkKGRldikgPT0gY2hhbi0+aWQpIHsKKwkJcGZpZm8tPmRpc2FibGUoZGV2KTsKKwkJcGZpZm8tPnVubG9hZF9jb250ZXh0KGRldik7CisJCXBmaWZvLT5lbmFibGUoZGV2KTsKKwl9CisKIAkvKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBjaGFubmVsIGlzIHNlZW4gYXMgZGlzYWJsZWQuICovCiAJbm91dmVhdV9ncHVvYmpfcmVmKGNoYW4tPnJhbWZjLCAmcmFtZmMpOwogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtZmMpOwpAQCAtMzA1LDYgKzMyOSwxNCBAQAogCQludjUwX2ZpZm9fY2hhbm5lbF9kaXNhYmxlKGRldiwgMTI3KTsKIAludjUwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKGRldik7CiAKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJLyogRnJlZSB0aGUgY2hhbm5lbCByZXNvdXJjZXMgKi8KKwlpZiAoY2hhbi0+dXNlcikgeworCQlpb3VubWFwKGNoYW4tPnVzZXIpOworCQljaGFuLT51c2VyID0gTlVMTDsKKwl9CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZyYW1mYyk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5jYWNoZSk7CiB9CkBAIC0zOTIsNyArNDI0LDcgQEAKIAlpZiAoY2hpZCA8IDEgfHwgY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMgLSAxKQogCQlyZXR1cm4gMDsKIAotCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbY2hpZF07CisJY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbY2hpZF07CiAJaWYgKCFjaGFuKSB7CiAJCU5WX0VSUk9SKGRldiwgIkluYWN0aXZlIGNoYW5uZWwgb24gUEZJRk86ICVkXG4iLCBjaGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NjcsNSArNDk5LDUgQEAKIHZvaWQKIG52NTBfZmlmb190bGJfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQludjUwX3ZtX2ZsdXNoKGRldiwgNSk7CisJbnY1MF92bV9mbHVzaF9lbmdpbmUoZGV2LCA1KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3Bpby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKaW5kZXggYjJmYWIyYi4uNmIxNDljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMKQEAgLTI2LDYgKzI2LDI4IEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2h3LmgiCiAKKyNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKKworc3RhdGljIHZvaWQgbnY1MF9ncGlvX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG52NTBfZ3Bpb19pc3JfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworc3RydWN0IG52NTBfZ3Bpb19wcml2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhbmRsZXJzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0cnVjdCBudjUwX2dwaW9faGFuZGxlciB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJYm9vbCBpbmhpYml0OworCisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCisJdm9pZCAoKmhhbmRsZXIpKHZvaWQgKmRhdGEsIGludCBzdGF0ZSk7CisJdm9pZCAqZGF0YTsKK307CisKIHN0YXRpYyBpbnQKIG52NTBfZ3Bpb19sb2NhdGlvbihzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW8sIHVpbnQzMl90ICpyZWcsIHVpbnQzMl90ICpzaGlmdCkKIHsKQEAgLTc1LDI5ICs5NywxMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50CitudjUwX2dwaW9faXJxX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywKKwkJICAgICAgIHZvaWQgKCpoYW5kbGVyKSh2b2lkICosIGludCksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOworCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdiA9IHBncGlvLT5wcml2OworCXN0cnVjdCBudjUwX2dwaW9faGFuZGxlciAqZ3Bpb2g7CisJc3RydWN0IGRjYl9ncGlvX2VudHJ5ICpncGlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlncGlvID0gbm91dmVhdV9iaW9zX2dwaW9fZW50cnkoZGV2LCB0YWcpOworCWlmICghZ3BpbykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlncGlvaCA9IGt6YWxsb2Moc2l6ZW9mKCpncGlvaCksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb2gpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9XT1JLKCZncGlvaC0+d29yaywgbnY1MF9ncGlvX2lzcl9iaCk7CisJZ3Bpb2gtPmRldiAgPSBkZXY7CisJZ3Bpb2gtPmdwaW8gPSBncGlvOworCWdwaW9oLT5oYW5kbGVyID0gaGFuZGxlcjsKKwlncGlvaC0+ZGF0YSA9IGRhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZncGlvaC0+aGVhZCwgJnByaXYtPmhhbmRsZXJzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQKK252NTBfZ3Bpb19pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcsCisJCQkgdm9pZCAoKmhhbmRsZXIpKHZvaWQgKiwgaW50KSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisJc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2ID0gcGdwaW8tPnByaXY7CisJc3RydWN0IG52NTBfZ3Bpb19oYW5kbGVyICpncGlvaCwgKnRtcDsKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJaWYgKCFncGlvKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShncGlvaCwgdG1wLCAmcHJpdi0+aGFuZGxlcnMsIGhlYWQpIHsKKwkJaWYgKGdwaW9oLT5ncGlvICE9IGdwaW8gfHwKKwkJICAgIGdwaW9oLT5oYW5kbGVyICE9IGhhbmRsZXIgfHwKKwkJICAgIGdwaW9oLT5kYXRhICE9IGRhdGEpCisJCQljb250aW51ZTsKKwkJbGlzdF9kZWwoJmdwaW9oLT5oZWFkKTsKKwkJa2ZyZWUoZ3Bpb2gpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKK2Jvb2wKIG52NTBfZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgYm9vbCBvbikKIHsKIAlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CiAJdTMyIHJlZywgbWFzazsKIAogCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7Ci0JaWYgKCFncGlvKSB7Ci0JCU5WX0VSUk9SKGRldiwgImdwaW8gdGFnIDB4JTAyeCBub3QgZm91bmRcbiIsIHRhZyk7Ci0JCXJldHVybjsKLQl9CisJaWYgKCFncGlvKQorCQlyZXR1cm4gZmFsc2U7CiAKIAlyZWcgID0gZ3Bpby0+bGluZSA8IDE2ID8gMHhlMDUwIDogMHhlMDcwOwogCW1hc2sgPSAweDAwMDEwMDAxIDw8IChncGlvLT5saW5lICYgMHhmKTsKIAogCW52X3dyMzIoZGV2LCByZWcgKyA0LCBtYXNrKTsKLQludl9tYXNrKGRldiwgcmVnICsgMCwgbWFzaywgb24gPyBtYXNrIDogMCk7CisJcmVnID0gbnZfbWFzayhkZXYsIHJlZyArIDAsIG1hc2ssIG9uID8gbWFzayA6IDApOworCXJldHVybiAocmVnICYgbWFzaykgPT0gbWFzazsKK30KKworc3RhdGljIGludAorbnY1MF9ncGlvX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKwlzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgKnByaXY7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmhhbmRsZXJzKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcGdwaW8tPnByaXYgPSBwcml2OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9ncGlvX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisKKwlrZnJlZShwZ3Bpby0+cHJpdik7CisJcGdwaW8tPnByaXYgPSBOVUxMOwogfQogCiBpbnQKIG52NTBfZ3Bpb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOworCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCisJaWYgKCFwZ3Bpby0+cHJpdikgeworCQlyZXQgPSBudjUwX2dwaW9fY3JlYXRlKGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlwcml2ID0gcGdwaW8tPnByaXY7CiAKIAkvKiBkaXNhYmxlLCBhbmQgYWNrIGFueSBwZW5kaW5nIGdwaW8gaW50ZXJydXB0cyAqLwogCW52X3dyMzIoZGV2LCAweGUwNTAsIDB4MDAwMDAwMDApOwpAQCAtMTA3LDUgKzIyMyw3NyBAQAogCQludl93cjMyKGRldiwgMHhlMDc0LCAweGZmZmZmZmZmKTsKIAl9CiAKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDIxLCBudjUwX2dwaW9faXNyKTsKIAlyZXR1cm4gMDsKIH0KKwordm9pZAorbnY1MF9ncGlvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJbnZfd3IzMihkZXYsIDB4ZTA1MCwgMHgwMDAwMDAwMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApCisJCW52X3dyMzIoZGV2LCAweGUwNzAsIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAyMSk7CisKKwludjUwX2dwaW9fZGVzdHJveShkZXYpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9ncGlvX2lzcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG52NTBfZ3Bpb19oYW5kbGVyICpncGlvaCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbnY1MF9ncGlvX2hhbmRsZXIsIHdvcmspOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGdwaW9oLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisJc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2ID0gcGdwaW8tPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdGU7CisKKwlzdGF0ZSA9IHBncGlvLT5nZXQoZ3Bpb2gtPmRldiwgZ3Bpb2gtPmdwaW8tPnRhZyk7CisJaWYgKHN0YXRlIDwgMCkKKwkJcmV0dXJuOworCisJZ3Bpb2gtPmhhbmRsZXIoZ3Bpb2gtPmRhdGEsIHN0YXRlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJZ3Bpb2gtPmluaGliaXQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2dwaW9faXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOworCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdiA9IHBncGlvLT5wcml2OworCXN0cnVjdCBudjUwX2dwaW9faGFuZGxlciAqZ3Bpb2g7CisJdTMyIGludHIwLCBpbnRyMSA9IDA7CisJdTMyIGhpLCBsbywgY2g7CisKKwlpbnRyMCA9IG52X3JkMzIoZGV2LCAweGUwNTQpICYgbnZfcmQzMihkZXYsIDB4ZTA1MCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4OTApCisJCWludHIxID0gbnZfcmQzMihkZXYsIDB4ZTA3NCkgJiBudl9yZDMyKGRldiwgMHhlMDcwKTsKKworCWhpID0gKGludHIwICYgMHgwMDAwZmZmZikgfCAoaW50cjEgPDwgMTYpOworCWxvID0gKGludHIwID4+IDE2KSB8IChpbnRyMSAmIDB4ZmZmZjAwMDApOworCWNoID0gaGkgfCBsbzsKKworCW52X3dyMzIoZGV2LCAweGUwNTQsIGludHIwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkKKwkJbnZfd3IzMihkZXYsIDB4ZTA3NCwgaW50cjEpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwaW9oLCAmcHJpdi0+aGFuZGxlcnMsIGhlYWQpIHsKKwkJaWYgKCEoY2ggJiAoMSA8PCBncGlvaC0+Z3Bpby0+bGluZSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGdwaW9oLT5pbmhpYml0KQorCQkJY29udGludWU7CisJCWdwaW9oLT5pbmhpYml0ID0gdHJ1ZTsKKworCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmdwaW9oLT53b3JrKTsKKwl9CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCmluZGV4IDhiNjY5ZDAuLjJkN2VhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKQEAgLTI5LDYgKzI5LDEyIEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCiAjaW5jbHVkZSAibm91dmVhdV9ncmN0eC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV92bS5oIgorI2luY2x1ZGUgIm52NTBfZXZvLmgiCisKK3N0YXRpYyBpbnQgIG52NTBfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBudjUwX2dyYXBoX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogc3RhdGljIHZvaWQKIG52NTBfZ3JhcGhfaW5pdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtNDYsNiArNTIsNyBAQAogewogCU5WX0RFQlVHKGRldiwgIlxuIik7CiAKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDEyLCBudjUwX2dyYXBoX2lzcik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4ZmZmZmZmZmYpOwogCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX0lOVFJfRU4sIDB4ZmZmZmZmZmYpOwpAQCAtMTQ1LDEyICsxNTIsMTUgQEAKIAludjUwX2dyYXBoX2luaXRfcmVzZXQoZGV2KTsKIAludjUwX2dyYXBoX2luaXRfcmVnc19fbnYoZGV2KTsKIAludjUwX2dyYXBoX2luaXRfcmVncyhkZXYpOwotCW52NTBfZ3JhcGhfaW5pdF9pbnRyKGRldik7CiAKIAlyZXQgPSBudjUwX2dyYXBoX2luaXRfY3R4Y3RsKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IG52NTBfZ3JhcGhfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW52NTBfZ3JhcGhfaW5pdF9pbnRyKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OCw2ICsxNjgsOCBAQAogbnY1MF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCU5WX0RFQlVHKGRldiwgIlxuIik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTNjLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOwogfQogCiB2b2lkCkBAIC0xOTAsNyArMjAyLDcgQEAKIAlpbnN0ID0gKGluc3QgJiBOVjUwX1BHUkFQSF9DVFhDVExfQ1VSX0lOU1RBTkNFKSA8PCAxMjsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKIAogCQlpZiAoY2hhbiAmJiBjaGFuLT5yYW1pbiAmJiBjaGFuLT5yYW1pbi0+dmluc3QgPT0gaW5zdCkKIAkJCXJldHVybiBjaGFuOwpAQCAtMjExLDcgKzIyMyw3IEBACiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCBwZ3JhcGgtPmdyY3R4X3NpemUsIDB4MTAwMCwKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCBwZ3JhcGgtPmdyY3R4X3NpemUsIDAsCiAJCQkJIE5WT0JKX0ZMQUdfWkVST19BTExPQyB8CiAJCQkJIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmY2hhbi0+cmFtaW5fZ3JjdHgpOwogCWlmIChyZXQpCkBAIC0yMzQsNiArMjQ2LDcgQEAKIAludl93bzMyKGNoYW4tPnJhbWluX2dyY3R4LCAweDAwMDAwLCBjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpOwogCiAJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CisJYXRvbWljX2luYygmY2hhbi0+dm0tPnBncmFwaF9yZWZzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQyLDE4ICsyNTUsMzEgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJaW50IGksIGhkciA9IChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKSA/IDB4MjAwIDogMHgyMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOwogCiAJaWYgKCFjaGFuLT5yYW1pbikKIAkJcmV0dXJuOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKworCWlmIChwZ3JhcGgtPmNoYW5uZWwoZGV2KSA9PSBjaGFuKQorCQlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKIAlmb3IgKGkgPSBoZHI7IGkgPCBoZHIgKyAyNDsgaSArPSA0KQogCQludl93bzMyKGNoYW4tPnJhbWluLCBpLCAwKTsKIAlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIAorCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1pbl9ncmN0eCk7CisKKwlhdG9taWNfZGVjKCZjaGFuLT52bS0+cGdyYXBoX3JlZnMpOwogfQogCiBzdGF0aWMgaW50CkBAIC0zMDYsNyArMzMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAl1aW50MzJfdCBpbnN0OwpAQCAtMzIyLDggKzM0OCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjUwX2dyYXBoX252c3dfZG1hX3ZibHNlbShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CiAKQEAgLTM0MCw4ICszNjYsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjUwX2dyYXBoX252c3dfdmJsc2VtX29mZnNldChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9vZmZzZXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCWlmIChub3V2ZWF1X25vdGlmaWVyX29mZnNldChjaGFuLT5udnN3LnZibHNlbSwgJmRhdGEpKQogCQlyZXR1cm4gLUVSQU5HRTsKQEAgLTM1MSwxNiArMzc3LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZV92YWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkJICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2VfdmFsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkJICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJY2hhbi0+bnZzdy52YmxzZW1fcnZhbCA9IGRhdGE7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTM2OCw0NSArMzk0LDg1IEBACiAJaWYgKCFjaGFuLT5udnN3LnZibHNlbSB8fCBjaGFuLT5udnN3LnZibHNlbV9vZmZzZXQgPT0gfjAgfHwgZGF0YSA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCEobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTikgJgotCQkgICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fVkJMQU5LX0NSVENfKGRhdGEpKSkgewotCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsCi0JCQlOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQ18oZGF0YSkpOwotCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCBudl9yZDMyKGRldiwKLQkJCU5WNTBfUERJU1BMQVlfSU5UUl9FTikgfAotCQkJTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhkYXRhKSk7Ci0JfQorCWRybV92YmxhbmtfZ2V0KGRldiwgZGF0YSk7CiAKKwljaGFuLT5udnN3LnZibHNlbV9oZWFkID0gZGF0YTsKIAlsaXN0X2FkZCgmY2hhbi0+bnZzdy52Ymxfd2FpdCwgJmRldl9wcml2LT52Ymxfd2FpdGluZyk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52NTBfZ3JhcGhfbnZzd19tZXRob2RzW10gPSB7Ci0JeyAweDAxOGMsIG52NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtIH0sCi0JeyAweDA0MDAsIG52NTBfZ3JhcGhfbnZzd192YmxzZW1fb2Zmc2V0IH0sCi0JeyAweDA0MDQsIG52NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZV92YWwgfSwKLQl7IDB4MDQwOCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlIH0sCi0Je30KLX07CitzdGF0aWMgaW50CitudjUwX2dyYXBoX252c3dfbXRoZF9wYWdlX2ZsaXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgczsKIAotc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjUwX2dyYXBoX2dyY2xhc3NbXSA9IHsKLQl7IDB4NTA2ZSwgdHJ1ZSwgbnY1MF9ncmFwaF9udnN3X21ldGhvZHMgfSwgLyogbnZzdyAqLwotCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCi0JeyAweDUwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KLQl7IDB4NTAyZCwgZmFsc2UsIE5VTEwgfSwgLyogMmQgKi8KLQl7IDB4NTBjMCwgZmFsc2UsIE5VTEwgfSwgLyogY29tcHV0ZSAqLwotCXsgMHg4NWMwLCBmYWxzZSwgTlVMTCB9LCAvKiBjb21wdXRlIChudmEzLCBudmE1LCBudmE4KSAqLwotCXsgMHg1MDk3LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXNsYSAobnY1MCkgKi8KLQl7IDB4ODI5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52OHgvbnY5eCkgKi8KLQl7IDB4ODM5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52YTAsIG52YWEsIG52YWMpICovCi0JeyAweDg1OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHRlc2xhIChudmEzLCBudmE1LCBudmE4KSAqLwotCXt9Ci19OworCWlmICghbm91dmVhdV9maW5pc2hfcGFnZV9mbGlwKGNoYW4sICZzKSkgeworCQkvKiBYWFggLSBEbyBzb21ldGhpbmcgaGVyZSAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQpCisJCXJldHVybiAwOworCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsgLyogbnZzdyAqLworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDAxOGMsIG52NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNDAwLCBudjUwX2dyYXBoX252c3dfdmJsc2VtX29mZnNldCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDQwNCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlX3ZhbCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDQwOCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNTAwLCBudjUwX2dyYXBoX252c3dfbXRoZF9wYWdlX2ZsaXApOworCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzAsIEdSKTsgLyogbnVsbCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDM5LCBHUik7IC8qIG0ybWYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTAyZCwgR1IpOyAvKiAyZCAqLworCisJLyogdGVzbGEgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDUwOTcsIEdSKTsgLyogdGVzbGEgKG52NTApICovCisJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApCisJCU5WT0JKX0NMQVNTKGRldiwgMHg4Mjk3LCBHUik7IC8qIHRlc2xhIChudjh4L252OXgpICovCisJZWxzZSB7CisJCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwkJY2FzZSAweGEwOgorCQljYXNlIDB4YWE6CisJCWNhc2UgMHhhYzoKKwkJCU5WT0JKX0NMQVNTKGRldiwgMHg4Mzk3LCBHUik7CisJCQlicmVhazsKKwkJY2FzZSAweGEzOgorCQljYXNlIDB4YTU6CisJCWNhc2UgMHhhODoKKwkJCU5WT0JKX0NMQVNTKGRldiwgMHg4NTk3LCBHUik7CisJCQlicmVhazsKKwkJY2FzZSAweGFmOgorCQkJTlZPQkpfQ0xBU1MoZGV2LCAweDg2OTcsIEdSKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogY29tcHV0ZSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg1MGMwLCBHUik7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICA+IDB4YTAgJiYKKwkgICAgZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHhhYSAmJgorCSAgICBkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGFjKQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4ODVjMCwgR1IpOworCisJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KIAogdm9pZAogbnY1MF9ncmFwaF90bGJfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQludjUwX3ZtX2ZsdXNoKGRldiwgMCk7CisJbnY1MF92bV9mbHVzaF9lbmdpbmUoZGV2LCAwKTsKIH0KIAogdm9pZApAQCAtNDQ5LDggKzUxNSw1MzUgQEAKIAkJCSBudl9yZDMyKGRldiwgMHg0MDAzODQpLCBudl9yZDMyKGRldiwgMHg0MDAzODgpKTsKIAl9CiAKLQludjUwX3ZtX2ZsdXNoKGRldiwgMCk7CisJbnY1MF92bV9mbHVzaF9lbmdpbmUoZGV2LCAwKTsKIAogCW52X21hc2soZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKIH0KKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VudW0gbnY1MF9tcF9leGVjX2Vycm9yX25hbWVzW10gPQoreworCXsgMywgIlNUQUNLX1VOREVSRkxPVyIgfSwKKwl7IDQsICJRVUFET05fQUNUSVZFIiB9LAorCXsgOCwgIlRJTUVPVVQiIH0sCisJeyAweDEwLCAiSU5WQUxJRF9PUENPREUiIH0sCisJeyAweDQwLCAiQlJFQUtQT0lOVCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfdHJhcF9tMm1mW10gPSB7CisJeyAweDAwMDAwMDAxLCAiTk9USUZZIiB9LAorCXsgMHgwMDAwMDAwMiwgIklOIiB9LAorCXsgMHgwMDAwMDAwNCwgIk9VVCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfdHJhcF92ZmV0Y2hbXSA9IHsKKwl7IDB4MDAwMDAwMDEsICJGQVVMVCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfdHJhcF9zdHJtb3V0W10gPSB7CisJeyAweDAwMDAwMDAxLCAiRkFVTFQiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudjUwX2dyYXBoX3RyYXBfY2NhY2hlW10gPSB7CisJeyAweDAwMDAwMDAxLCAiRkFVTFQiIH0sCisJe30KK307CisKKy8qIFRoZXJlIG11c3QgYmUgYSAqbG90KiBvZiB0aGVzZS4gV2lsbCB0YWtlIHNvbWUgdGltZSB0byBnYXRoZXIgdGhlbSB1cC4gKi8KK3N0cnVjdCBub3V2ZWF1X2VudW0gbnY1MF9kYXRhX2Vycm9yX25hbWVzW10gPSB7CisJeyAweDAwMDAwMDAzLCAiSU5WQUxJRF9RVUVSWV9PUl9URVhUVVJFIiB9LAorCXsgMHgwMDAwMDAwNCwgIklOVkFMSURfVkFMVUUiIH0sCisJeyAweDAwMDAwMDA1LCAiSU5WQUxJRF9FTlVNIiB9LAorCXsgMHgwMDAwMDAwOCwgIklOVkFMSURfT0JKRUNUIiB9LAorCXsgMHgwMDAwMDAwOSwgIlJFQURfT05MWV9PQkpFQ1QiIH0sCisJeyAweDAwMDAwMDBhLCAiU1VQRVJWSVNPUl9PQkpFQ1QiIH0sCisJeyAweDAwMDAwMDBiLCAiSU5WQUxJRF9BRERSRVNTX0FMSUdOTUVOVCIgfSwKKwl7IDB4MDAwMDAwMGMsICJJTlZBTElEX0JJVEZJRUxEIiB9LAorCXsgMHgwMDAwMDAwZCwgIkJFR0lOX0VORF9BQ1RJVkUiIH0sCisJeyAweDAwMDAwMDBlLCAiU0VNQU5USUNfQ09MT1JfQkFDS19PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDAwZiwgIlZJRVdQT1JUX0lEX05FRURTX0dQIiB9LAorCXsgMHgwMDAwMDAxMCwgIlJUX0RPVUJMRV9CSU5EIiB9LAorCXsgMHgwMDAwMDAxMSwgIlJUX1RZUEVTX01JU01BVENIIiB9LAorCXsgMHgwMDAwMDAxMiwgIlJUX0xJTkVBUl9XSVRIX1pFVEEiIH0sCisJeyAweDAwMDAwMDE1LCAiRlBfVE9PX0ZFV19SRUdTIiB9LAorCXsgMHgwMDAwMDAxNiwgIlpFVEFfRk9STUFUX0NTQUFfTUlTTUFUQ0giIH0sCisJeyAweDAwMDAwMDE3LCAiUlRfTElORUFSX1dJVEhfTVNBQSIgfSwKKwl7IDB4MDAwMDAwMTgsICJGUF9JTlRFUlBPTEFOVF9TVEFSVF9PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDAxOSwgIlNFTUFOVElDX0xBWUVSX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDFhLCAiUlRfSU5WQUxJRF9BTElHTk1FTlQiIH0sCisJeyAweDAwMDAwMDFiLCAiU0FNUExFUl9PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDAxYywgIlRFWFRVUkVfT1ZFUl9MSU1JVCIgfSwKKwl7IDB4MDAwMDAwMWUsICJHUF9UT09fTUFOWV9PVVRQVVRTIiB9LAorCXsgMHgwMDAwMDAxZiwgIlJUX0JQUDEyOF9XSVRIX01TOCIgfSwKKwl7IDB4MDAwMDAwMjEsICJaX09VVF9PRl9CT1VORFMiIH0sCisJeyAweDAwMDAwMDIzLCAiWFlfT1VUX09GX0JPVU5EUyIgfSwKKwl7IDB4MDAwMDAwMjcsICJDUF9NT1JFX1BBUkFNU19USEFOX1NIQVJFRCIgfSwKKwl7IDB4MDAwMDAwMjgsICJDUF9OT19SRUdfU1BBQ0VfU1RSSVBFRCIgfSwKKwl7IDB4MDAwMDAwMjksICJDUF9OT19SRUdfU1BBQ0VfUEFDS0VEIiB9LAorCXsgMHgwMDAwMDAyYSwgIkNQX05PVF9FTk9VR0hfV0FSUFMiIH0sCisJeyAweDAwMDAwMDJiLCAiQ1BfQkxPQ0tfU0laRV9NSVNNQVRDSCIgfSwKKwl7IDB4MDAwMDAwMmMsICJDUF9OT1RfRU5PVUdIX0xPQ0FMX1dBUlBTIiB9LAorCXsgMHgwMDAwMDAyZCwgIkNQX05PVF9FTk9VR0hfU1RBQ0tfV0FSUFMiIH0sCisJeyAweDAwMDAwMDJlLCAiQ1BfTk9fQkxPQ0tESU1fTEFUQ0giIH0sCisJeyAweDAwMDAwMDMxLCAiRU5HMkRfRk9STUFUX01JU01BVENIIiB9LAorCXsgMHgwMDAwMDAzZiwgIlBSSU1JVElWRV9JRF9ORUVEU19HUCIgfSwKKwl7IDB4MDAwMDAwNDQsICJTRU1BTlRJQ19WSUVXUE9SVF9PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDA0NSwgIlNFTUFOVElDX0NPTE9SX0ZST05UX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDQ2LCAiTEFZRVJfSURfTkVFRFNfR1AiIH0sCisJeyAweDAwMDAwMDQ3LCAiU0VNQU5USUNfQ0xJUF9PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDA0OCwgIlNFTUFOVElDX1BUU1pfT1ZFUl9MSU1JVCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfaW50cltdID0geworCXsgMHgwMDAwMDAwMSwgIk5PVElGWSIgfSwKKwl7IDB4MDAwMDAwMDIsICJDT01QVVRFX1FVRVJZIiB9LAorCXsgMHgwMDAwMDAxMCwgIklMTEVHQUxfTVRIRCIgfSwKKwl7IDB4MDAwMDAwMjAsICJJTExFR0FMX0NMQVNTIiB9LAorCXsgMHgwMDAwMDA0MCwgIkRPVUJMRV9OT1RJRlkiIH0sCisJeyAweDAwMDAxMDAwLCAiQ09OVEVYVF9TV0lUQ0giIH0sCisJeyAweDAwMDEwMDAwLCAiQlVGRkVSX05PVElGWSIgfSwKKwl7IDB4MDAxMDAwMDAsICJEQVRBX0VSUk9SIiB9LAorCXsgMHgwMDIwMDAwMCwgIlRSQVAiIH0sCisJeyAweDAxMDAwMDAwLCAiU0lOR0xFX1NURVAiIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkCitudjUwX3BncmFwaF9tcF90cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB0cGlkLCBpbnQgZGlzcGxheSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MTU0MCk7CisJdWludDMyX3QgYWRkciwgbXAxMCwgc3RhdHVzLCBwYywgb3Bsb3csIG9waGlnaDsKKwlpbnQgaTsKKwlpbnQgbXBzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICghKHVuaXRzICYgMSA8PCAoaSsyNCkpKQorCQkJY29udGludWU7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApCisJCQlhZGRyID0gMHg0MDgyMDAgKyAodHBpZCA8PCAxMikgKyAoaSA8PCA3KTsKKwkJZWxzZQorCQkJYWRkciA9IDB4NDA4MTAwICsgKHRwaWQgPDwgMTEpICsgKGkgPDwgNyk7CisJCW1wMTAgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTApOworCQlzdGF0dXMgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTQpOworCQlpZiAoIXN0YXR1cykKKwkJCWNvbnRpbnVlOworCQlpZiAoZGlzcGxheSkgeworCQkJbnZfcmQzMihkZXYsIGFkZHIgKyAweDIwKTsKKwkJCXBjID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDI0KTsKKwkJCW9wbG93ID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDcwKTsKKwkJCW9waGlnaD0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDc0KTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtICIKKwkJCQkJIlRQICVkIE1QICVkOiAiLCB0cGlkLCBpKTsKKwkJCW5vdXZlYXVfZW51bV9wcmludChudjUwX21wX2V4ZWNfZXJyb3JfbmFtZXMsIHN0YXR1cyk7CisJCQlwcmludGsoIiBhdCAlMDZ4IHdhcnAgJWQsIG9wY29kZSAlMDh4ICUwOHhcbiIsCisJCQkJCXBjJjB4ZmZmZmZmLCBwYyA+PiAyNCwKKwkJCQkJb3Bsb3csIG9waGlnaCk7CisJCX0KKwkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDEwLCBtcDEwKTsKKwkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDE0LCAwKTsKKwkJbXBzKys7CisJfQorCWlmICghbXBzICYmIGRpc3BsYXkpCisJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtIFRQICVkOiAiCisJCQkJIk5vIE1QcyBjbGFpbWluZyBlcnJvcnM/XG4iLCB0cGlkKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfcGdyYXBoX3RwX3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHR5cGUsIHVpbnQzMl90IHVzdGF0dXNfb2xkLAorCQl1aW50MzJfdCB1c3RhdHVzX25ldywgaW50IGRpc3BsYXksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgdHBzID0gMDsKKwl1aW50MzJfdCB1bml0cyA9IG52X3JkMzIoZGV2LCAweDE1NDApOworCWludCBpLCByOworCXVpbnQzMl90IHVzdGF0dXNfYWRkciwgdXN0YXR1czsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAoISh1bml0cyAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweGEwKQorCQkJdXN0YXR1c19hZGRyID0gdXN0YXR1c19vbGQgKyAoaSA8PCAxMik7CisJCWVsc2UKKwkJCXVzdGF0dXNfYWRkciA9IHVzdGF0dXNfbmV3ICsgKGkgPDwgMTEpOworCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkcikgJiAweDdmZmZmZmZmOworCQlpZiAoIXVzdGF0dXMpCisJCQljb250aW51ZTsKKwkJdHBzKys7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIDY6IC8qIHRleHR1cmUgZXJyb3IuLi4gdW5rbm93biBmb3Igbm93ICovCisJCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCBuYW1lKTsKKwkJCWlmIChkaXNwbGF5KSB7CisJCQkJTlZfRVJST1IoZGV2LCAibWFnaWMgc2V0ICVkOlxuIiwgaSk7CisJCQkJZm9yIChyID0gdXN0YXR1c19hZGRyICsgNDsgciA8PSB1c3RhdHVzX2FkZHIgKyAweDEwOyByICs9IDQpCisJCQkJCU5WX0VSUk9SKGRldiwgIlx0MHglMDh4OiAweCUwOHhcbiIsIHIsCisJCQkJCQludl9yZDMyKGRldiwgcikpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNzogLyogTVAgZXJyb3IgKi8KKwkJCWlmICh1c3RhdHVzICYgMHgwMDAxMDAwMCkgeworCQkJCW52NTBfcGdyYXBoX21wX3RyYXAoZGV2LCBpLCBkaXNwbGF5KTsKKwkJCQl1c3RhdHVzICY9IH4weDAwMDEwMDAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgODogLyogVFBETUEgZXJyb3IgKi8KKwkJCXsKKwkJCXVpbnQzMl90IGUwYyA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA0KTsKKwkJCXVpbnQzMl90IGUxMCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA4KTsKKwkJCXVpbnQzMl90IGUxNCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyAweGMpOworCQkJdWludDMyX3QgZTE4ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTApOworCQkJdWludDMyX3QgZTFjID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTQpOworCQkJdWludDMyX3QgZTIwID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTgpOworCQkJdWludDMyX3QgZTI0ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MWMpOworCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgbmFtZSk7CisJCQkvKiAyZCBlbmdpbmUgZGVzdGluYXRpb24gKi8KKwkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDAxMCkgeworCQkJCWlmIChkaXNwbGF5KSB7CisJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKKwkJCQkJCQlpLCBlMTQsIGUxMCk7CisJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAorCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKKwkJCQl9CisJCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKKwkJCX0KKwkJCS8qIFJlbmRlciB0YXJnZXQgKi8KKwkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA0MCkgeworCQkJCWlmIChkaXNwbGF5KSB7CisJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKKwkJCQkJCQlpLCBlMTQsIGUxMCk7CisJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAorCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKKwkJCQl9CisJCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA0MDsKKwkJCX0KKwkJCS8qIENVREEgbWVtb3J5OiBsW10sIGdbXSBvciBzdGFjay4gKi8KKwkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA4MCkgeworCQkJCWlmIChkaXNwbGF5KSB7CisJCQkJCWlmIChlMTggJiAweDgwMDAwMDAwKSB7CisJCQkJCQkvKiBnW10gcmVhZCBmYXVsdD8gKi8KKwkJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIEdsb2JhbCByZWFkIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCisJCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gMjQpICYgMHgxZikpOworCQkJCQkJZTE4ICY9IH4weDFmMDAwMDAwOworCQkJCQl9IGVsc2UgaWYgKGUxOCAmIDB4YykgeworCQkJCQkJLyogZ1tdIHdyaXRlIGZhdWx0PyAqLworCQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQSAtIFRQICVkIC0gR2xvYmFsIHdyaXRlIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCisJCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gNykgJiAweDFmKSk7CisJCQkJCQllMTggJj0gfjB4MDAwMDBmODA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1RQRE1BIC0gVFAgJWQgLSBVbmtub3duIENVREEgZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKKwkJCQkJCQkJaSwgZTE0LCBlMTApOworCQkJCQl9CisJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAorCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKKwkJCQl9CisJCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA4MDsKKwkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICh1c3RhdHVzKSB7CisJCQlpZiAoZGlzcGxheSkKKwkJCQlOVl9JTkZPKGRldiwgIiVzIC0gVFAlZDogVW5oYW5kbGVkIHVzdGF0dXMgMHglMDh4XG4iLCBuYW1lLCBpLCB1c3RhdHVzKTsKKwkJfQorCQludl93cjMyKGRldiwgdXN0YXR1c19hZGRyLCAweGMwMDAwMDAwKTsKKwl9CisKKwlpZiAoIXRwcyAmJiBkaXNwbGF5KQorCQlOVl9JTkZPKGRldiwgIiVzIC0gTm8gVFBzIGNsYWltaW5nIGVycm9ycz9cbiIsIG5hbWUpOworfQorCitzdGF0aWMgaW50CitudjUwX3BncmFwaF90cmFwX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGRpc3BsYXksIHU2NCBpbnN0LCB1MzIgY2hpZCkKK3sKKwl1MzIgc3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDAwMTA4KTsKKwl1MzIgdXN0YXR1czsKKworCWlmICghc3RhdHVzICYmIGRpc3BsYXkpIHsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBUUkFQOiBubyB1bml0cyByZXBvcnRpbmcgdHJhcHM/XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogRElTUEFUQ0g6IFJlbGF5cyBjb21tYW5kcyB0byBvdGhlciB1bml0cyBhbmQgaGFuZGxlcyBOT1RJRlksCisJICogQ09ORCwgUVVFUlkuIElmIHlvdSBnZXQgYSB0cmFwIGZyb20gaXQsIHRoZSBjb21tYW5kIGlzIHN0aWxsIHN0dWNrCisJICogaW4gRElTUEFUQ0ggYW5kIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCBpdC4gKi8KKwlpZiAoc3RhdHVzICYgMHgwMDEpIHsKKwkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwMDgwNCkgJiAweDdmZmZmZmZmOworCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgeworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSCAtIG5vIHVzdGF0dXM/XG4iKTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMCk7CisKKwkJLyogS25vd24gdG8gYmUgdHJpZ2dlcmVkIGJ5IHNjcmV3ZWQgdXAgTk9USUZZIGFuZCBDT05ELi4uICovCisJCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMSkgeworCQkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgMHg0MDA4MDgpOworCQkJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApID4+IDE2OworCQkJdTMyIG10aGQgPSAoYWRkciAmIDB4MDAwMDFmZmMpOworCQkJdTMyIGRhdGFsID0gbnZfcmQzMihkZXYsIDB4NDAwODBjKTsKKwkJCXUzMiBkYXRhaCA9IG52X3JkMzIoZGV2LCAweDQwMDgxMCk7CisJCQl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOworCQkJdTMyIHI4NDggPSBudl9yZDMyKGRldiwgMHg0MDA4NDgpOworCisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVAgRElTUEFUQ0hfRkFVTFRcbiIpOworCQkJaWYgKGRpc3BsYXkgJiYgKGFkZHIgJiAweDgwMDAwMDAwKSkgeworCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQgKDB4JTAxMGxseCkgIgorCQkJCQkgICAgICJzdWJjICVkIGNsYXNzIDB4JTA0eCBtdGhkIDB4JTA0eCAiCisJCQkJCSAgICAgImRhdGEgMHglMDh4JTA4eCAiCisJCQkJCSAgICAgIjQwMDgwOCAweCUwOHggNDAwODQ4IDB4JTA4eFxuIiwKKwkJCQkJY2hpZCwgaW5zdCwgc3ViYywgY2xhc3MsIG10aGQsIGRhdGFoLAorCQkJCQlkYXRhbCwgYWRkciwgcjg0OCk7CisJCQl9IGVsc2UKKwkJCWlmIChkaXNwbGF5KSB7CisJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBubyBzdHVjayBjb21tYW5kP1xuIik7CisJCQl9CisKKwkJCW52X3dyMzIoZGV2LCAweDQwMDgwOCwgMCk7CisJCQludl93cjMyKGRldiwgMHg0MDA4ZTgsIG52X3JkMzIoZGV2LCAweDQwMDhlOCkgJiAzKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwMDg0OCwgMCk7CisJCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOworCQl9CisKKwkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDAyKSB7CisJCQl1MzIgYWRkciA9IG52X3JkMzIoZGV2LCAweDQwMDg0Yyk7CisJCQl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCAweDQwMDg1Yyk7CisJCQl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOworCisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVAgRElTUEFUQ0hfUVVFUllcbiIpOworCQkJaWYgKGRpc3BsYXkgJiYgKGFkZHIgJiAweDgwMDAwMDAwKSkgeworCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQgKDB4JTAxMGxseCkgIgorCQkJCQkgICAgICJzdWJjICVkIGNsYXNzIDB4JTA0eCBtdGhkIDB4JTA0eCAiCisJCQkJCSAgICAgImRhdGEgMHglMDh4IDQwMDg0YyAweCUwOHhcbiIsCisJCQkJCWNoaWQsIGluc3QsIHN1YmMsIGNsYXNzLCBtdGhkLAorCQkJCQlkYXRhLCBhZGRyKTsKKwkJCX0gZWxzZQorCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIG5vIHN0dWNrIGNvbW1hbmQ/XG4iKTsKKwkJCX0KKworCQkJbnZfd3IzMihkZXYsIDB4NDAwODRjLCAwKTsKKwkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDI7CisJCX0KKworCQlpZiAodXN0YXR1cyAmJiBkaXNwbGF5KSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfRElTUEFUQ0ggKHVua25vd24gIgorCQkJCSAgICAgICIweCUwOHgpXG4iLCB1c3RhdHVzKTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDQwMDgwNCwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMDEpOworCQlzdGF0dXMgJj0gfjB4MDAxOworCQlpZiAoIXN0YXR1cykKKwkJCXJldHVybiAwOworCX0KKworCS8qIE0yTUY6IE1lbW9yeSB0byBtZW1vcnkgY29weSBlbmdpbmUuICovCisJaWYgKHN0YXR1cyAmIDB4MDAyKSB7CisJCXUzMiB1c3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDA2ODAwKSAmIDB4N2ZmZmZmZmY7CisJCWlmIChkaXNwbGF5KSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfTTJNRiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjUwX2dyYXBoX3RyYXBfbTJtZiwgdXN0YXR1cyk7CisJCQlwcmludGsoIlxuIik7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfTTJNRiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJCW52X3JkMzIoZGV2LCAweDQwNjgwNCksIG52X3JkMzIoZGV2LCAweDQwNjgwOCksCisJCQkJbnZfcmQzMihkZXYsIDB4NDA2ODBjKSwgbnZfcmQzMihkZXYsIDB4NDA2ODEwKSk7CisKKwkJfQorCisJCS8qIE5vIHNhbmUgd2F5IGZvdW5kIHlldCAtLSBqdXN0IHJlc2V0IHRoZSBidWdnZXIuICovCisJCW52X3dyMzIoZGV2LCAweDQwMDA0MCwgMik7CisJCW52X3dyMzIoZGV2LCAweDQwMDA0MCwgMCk7CisJCW52X3dyMzIoZGV2LCAweDQwNjgwMCwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMDIpOworCQlzdGF0dXMgJj0gfjB4MDAyOworCX0KKworCS8qIFZGRVRDSDogRmV0Y2hlcyBkYXRhIGZyb20gdmVydGV4IGJ1ZmZlcnMuICovCisJaWYgKHN0YXR1cyAmIDB4MDA0KSB7CisJCXUzMiB1c3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDAwYzA0KSAmIDB4N2ZmZmZmZmY7CisJCWlmIChkaXNwbGF5KSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfVkZFVENIIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfdHJhcF92ZmV0Y2gsIHVzdGF0dXMpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBUUkFQX1ZGRVRDSCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwMCksIG52X3JkMzIoZGV2LCAweDQwMGMwOCksCisJCQkJbnZfcmQzMihkZXYsIDB4NDAwYzBjKSwgbnZfcmQzMihkZXYsIDB4NDAwYzEwKSk7CisJCX0KKworCQludl93cjMyKGRldiwgMHg0MDBjMDQsIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA0KTsKKwkJc3RhdHVzICY9IH4weDAwNDsKKwl9CisKKwkvKiBTVFJNT1VUOiBEaXJlY3RYIHN0cmVhbW91dCAvIE9wZW5HTCB0cmFuc2Zvcm0gZmVlZGJhY2suICovCisJaWYgKHN0YXR1cyAmIDB4MDA4KSB7CisJCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDE4MDApICYgMHg3ZmZmZmZmZjsKKwkJaWYgKGRpc3BsYXkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9TVFJNT1VUIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfdHJhcF9zdHJtb3V0LCB1c3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9TVFJNT1VUICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkJbnZfcmQzMihkZXYsIDB4NDAxODA0KSwgbnZfcmQzMihkZXYsIDB4NDAxODA4KSwKKwkJCQludl9yZDMyKGRldiwgMHg0MDE4MGMpLCBudl9yZDMyKGRldiwgMHg0MDE4MTApKTsKKworCQl9CisKKwkJLyogTm8gc2FuZSB3YXkgZm91bmQgeWV0IC0tIGp1c3QgcmVzZXQgdGhlIGJ1Z2dlci4gKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwMDQwLCAweDgwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMDQwLCAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAxODAwLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDAwOCk7CisJCXN0YXR1cyAmPSB+MHgwMDg7CisJfQorCisJLyogQ0NBQ0hFOiBIYW5kbGVzIGNvZGUgYW5kIGNbXSBjYWNoZXMgYW5kIGZpbGxzIHRoZW0uICovCisJaWYgKHN0YXR1cyAmIDB4MDEwKSB7CisJCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDUwMTgpICYgMHg3ZmZmZmZmZjsKKwkJaWYgKGRpc3BsYXkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9DQ0FDSEUiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnY1MF9ncmFwaF90cmFwX2NjYWNoZSwgdXN0YXR1cyk7CisJCQlwcmludGsoIlxuIik7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfQ0NBQ0hFICUwOHggJTA4eCAlMDh4ICUwOHgiCisJCQkJICAgICAiICUwOHggJTA4eCAlMDh4XG4iLAorCQkJCW52X3JkMzIoZGV2LCAweDQwNTgwMCksIG52X3JkMzIoZGV2LCAweDQwNTgwNCksCisJCQkJbnZfcmQzMihkZXYsIDB4NDA1ODA4KSwgbnZfcmQzMihkZXYsIDB4NDA1ODBjKSwKKwkJCQludl9yZDMyKGRldiwgMHg0MDU4MTApLCBudl9yZDMyKGRldiwgMHg0MDU4MTQpLAorCQkJCW52X3JkMzIoZGV2LCAweDQwNTgxYykpOworCisJCX0KKworCQludl93cjMyKGRldiwgMHg0MDUwMTgsIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDEwKTsKKwkJc3RhdHVzICY9IH4weDAxMDsKKwl9CisKKwkvKiBVbmtub3duLCBub3Qgc2VlbiB5ZXQuLi4gMHg0MDIwMDAgaXMgdGhlIG9ubHkgdHJhcCBzdGF0dXMgcmVnCisJICogcmVtYWluaW5nLCBzbyB0cnkgdG8gaGFuZGxlIGl0IGFueXdheS4gUGVyaGFwcyByZWxhdGVkIHRvIHRoYXQKKwkgKiB1bmtub3duIERNQSBzbG90IG9uIHRlc2xhPyAqLworCWlmIChzdGF0dXMgJiAweDIwKSB7CisJCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDIwMDApICYgMHg3ZmZmZmZmZjsKKwkJaWYgKGRpc3BsYXkpCisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfVU5LQzA0IDB4JTA4eFxuIiwgdXN0YXR1cyk7CisJCW52X3dyMzIoZGV2LCAweDQwMjAwMCwgMHhjMDAwMDAwMCk7CisJCS8qIG5vIHN0YXR1cyBtb2RpZmljdGlvbiBvbiBwdXJwb3NlICovCisJfQorCisJLyogVEVYVFVSRTogQ1VEQSB0ZXh0dXJpbmcgdW5pdHMgKi8KKwlpZiAoc3RhdHVzICYgMHgwNDApIHsKKwkJbnY1MF9wZ3JhcGhfdHBfdHJhcChkZXYsIDYsIDB4NDA4OTAwLCAweDQwODYwMCwgZGlzcGxheSwKKwkJCQkgICAgIlBHUkFQSCAtIFRSQVBfVEVYVFVSRSIpOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDQwKTsKKwkJc3RhdHVzICY9IH4weDA0MDsKKwl9CisKKwkvKiBNUDogQ1VEQSBleGVjdXRpb24gZW5naW5lcy4gKi8KKwlpZiAoc3RhdHVzICYgMHgwODApIHsKKwkJbnY1MF9wZ3JhcGhfdHBfdHJhcChkZXYsIDcsIDB4NDA4MzE0LCAweDQwODMxYywgZGlzcGxheSwKKwkJCQkgICAgIlBHUkFQSCAtIFRSQVBfTVAiKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDA4MCk7CisJCXN0YXR1cyAmPSB+MHgwODA7CisJfQorCisJLyogVFBETUE6ICBIYW5kbGVzIFRQLWluaXRpYXRlZCB1bmNhY2hlZCBtZW1vcnkgYWNjZXNzZXM6CisJICogbFtdLCBnW10sIHN0YWNrLCAyZCBzdXJmYWNlcywgcmVuZGVyIHRhcmdldHMuICovCisJaWYgKHN0YXR1cyAmIDB4MTAwKSB7CisJCW52NTBfcGdyYXBoX3RwX3RyYXAoZGV2LCA4LCAweDQwOGUwOCwgMHg0MDg3MDgsIGRpc3BsYXksCisJCQkJICAgICJQR1JBUEggLSBUUkFQX1RQRE1BIik7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgxMDApOworCQlzdGF0dXMgJj0gfjB4MTAwOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJaWYgKGRpc3BsYXkpCisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVA6IHVua25vd24gMHglMDh4XG4iLCBzdGF0dXMpOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIHN0YXR1cyk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfaXNyX2NoaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IGluc3QpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbaV07CisJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW4pCisJCQljb250aW51ZTsKKworCQlpZiAoaW5zdCA9PSBjaGFuLT5yYW1pbi0+dmluc3QpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIHN0YXQ7CisKKwl3aGlsZSAoKHN0YXQgPSBudl9yZDMyKGRldiwgMHg0MDAxMDApKSkgeworCQl1NjQgaW5zdCA9ICh1NjQpKG52X3JkMzIoZGV2LCAweDQwMDMyYykgJiAweDBmZmZmZmZmKSA8PCAxMjsKKwkJdTMyIGNoaWQgPSBudjUwX2dyYXBoX2lzcl9jaGlkKGRldiwgaW5zdCk7CisJCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUik7CisJCXUzMiBzdWJjID0gKGFkZHIgJiAweDAwMDcwMDAwKSA+PiAxNjsKKwkJdTMyIG10aGQgPSAoYWRkciAmIDB4MDAwMDFmZmMpOworCQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEpOworCQl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOworCQl1MzIgc2hvdyA9IHN0YXQ7CisKKwkJaWYgKHN0YXQgJiAweDAwMDAwMDEwKSB7CisJCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoZGV2LCBjaGlkLCBjbGFzcywKKwkJCQkJCSAgICAgICBtdGhkLCBkYXRhKSkKKwkJCQlzaG93ICY9IH4weDAwMDAwMDEwOworCQl9CisKKwkJaWYgKHN0YXQgJiAweDAwMDAxMDAwKSB7CisJCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMDAwMDApOworCQkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMDAxMDAwKTsKKwkJCW52X21hc2soZGV2LCAweDQwMDEzYywgMHgwMDAwMTAwMCwgMHgwMDAwMDAwMCk7CisJCQludjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7CisJCQlzdGF0ICY9IH4weDAwMDAxMDAwOworCQkJc2hvdyAmPSB+MHgwMDAwMTAwMDsKKwkJfQorCisJCXNob3cgPSAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSA/IHNob3cgOiAwOworCisJCWlmIChzaG93ICYgMHgwMDEwMDAwMCkgeworCQkJdTMyIGVjb2RlID0gbnZfcmQzMihkZXYsIDB4NDAwMTEwKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gREFUQV9FUlJPUiAiKTsKKwkJCW5vdXZlYXVfZW51bV9wcmludChudjUwX2RhdGFfZXJyb3JfbmFtZXMsIGVjb2RlKTsKKwkJCXByaW50aygiXG4iKTsKKwkJfQorCisJCWlmIChzdGF0ICYgMHgwMDIwMDAwMCkgeworCQkJaWYgKCFudjUwX3BncmFwaF90cmFwX2hhbmRsZXIoZGV2LCBzaG93LCBpbnN0LCBjaGlkKSkKKwkJCQlzaG93ICY9IH4weDAwMjAwMDAwOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCBzdGF0KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKKworCQlpZiAoc2hvdykgeworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjUwX2dyYXBoX2ludHIsIHNob3cpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZCAoMHglMDEwbGx4KSBzdWJjICVkICIKKwkJCQkgICAgICJjbGFzcyAweCUwNHggbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCQkJY2hpZCwgaW5zdCwgc3ViYywgY2xhc3MsIG10aGQsIGRhdGEpOworCQl9CisJfQorCisJaWYgKG52X3JkMzIoZGV2LCAweDQwMDgyNCkgJiAoMSA8PCAzMSkpCisJCW52X3dyMzIoZGV2LCAweDQwMDgyNCwgbnZfcmQzMihkZXYsIDB4NDAwODI0KSAmIH4oMSA8PCAzMSkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9pbnN0bWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYwppbmRleCBiNzczMjI5Li4yZTFiMWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYwpAQCAtMjcsMTQgKzI3LDIwIEBACiAKICNpbmNsdWRlICJkcm1QLmgiCiAjaW5jbHVkZSAiZHJtLmgiCisKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKKworI2RlZmluZSBCQVIxX1ZNX0JBU0UgMHgwMDIwMDAwMDAwVUxMCisjZGVmaW5lIEJBUjFfVk1fU0laRSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkKKyNkZWZpbmUgQkFSM19WTV9CQVNFIDB4MDAwMDAwMDAwMFVMTAorI2RlZmluZSBCQVIzX1ZNX1NJWkUgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDMpCiAKIHN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiB7CiAJdWludDMyX3Qgc2F2ZTE3MDBbNV07IC8qIDB4MTcwMC0+MHgxNzEwICovCiAKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnByYW1pbl9wdDsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnByYW1pbl9iYXI7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpmYl9iYXI7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpiYXIxX2RtYW9iajsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmJhcjNfZG1hb2JqOwogfTsKIAogc3RhdGljIHZvaWQKQEAgLTQ4LDYgKzU0LDcgQEAKIAkJcmV0dXJuOwogCiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1mYyk7CisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmNoYW4tPnZtLCBjaGFuLT52bV9wZCk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT52bV9wZCk7CiAJaWYgKGNoYW4tPnJhbWluX2hlYXAuZnJlZV9zdGFjay5uZXh0KQogCQlkcm1fbW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOwpAQCAtNTYsMTQgKzYzLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfY2hhbm5lbF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNpemUsCitudjUwX2NoYW5uZWxfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzaXplLCBzdHJ1Y3Qgbm91dmVhdV92bSAqdm0sCiAJCSBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgcGdkID0gKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApID8gMHgxNDAwIDogMHgwMjAwOwogCXUzMiAgZmMgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkgPyAweDAwMDAgOiAweDQyMDA7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAKIAljaGFuID0ga3phbGxvYyhzaXplb2YoKmNoYW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoYW4pCkBAIC05Miw2ICs5OSwxNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCAweDQwMDA7IGkgKz0gOCkgeworCQludl93bzMyKGNoYW4tPnZtX3BkLCBpICsgMCwgMHgwMDAwMDAwMCk7CisJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyA0LCAweGRlYWRjYWZlKTsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJmNoYW4tPnZtLCBjaGFuLT52bV9wZCk7CisJaWYgKHJldCkgeworCQludjUwX2NoYW5uZWxfZGVsKCZjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIGNoYW4tPnJhbWluLT5waW5zdCA9PSB+MCA/IH4wIDoKIAkJCQkgICAgICBjaGFuLT5yYW1pbi0+cGluc3QgKyBmYywKIAkJCQkgICAgICBjaGFuLT5yYW1pbi0+dmluc3QgKyBmYywgMHgxMDAsCkBAIC0xMTEsNiArMTI5LDcgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdjsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKIAlpbnQgcmV0LCBpOwogCXUzMiB0bXA7CiAKQEAgLTEyNywxMTIgKzE0Niw4NyBAQAogCXJldCA9IGRybV9tbV9pbml0KCZkZXZfcHJpdi0+cmFtaW5faGVhcCwgMCwgZGV2X3ByaXYtPnJhbWluX3NpemUpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGluaXQgUkFNSU4gaGVhcFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGVycm9yOwogCX0KIAotCS8qIHdlIG5lZWQgYSBjaGFubmVsIHRvIHBsdWcgaW50byB0aGUgaHcgdG8gY29udHJvbCB0aGUgQkFScyAqLwotCXJldCA9IG52NTBfY2hhbm5lbF9uZXcoZGV2LCAxMjgqMTAyNCwgJmRldl9wcml2LT5maWZvc1swXSk7CisJLyogQkFSMyAqLworCXJldCA9IG5vdXZlYXVfdm1fbmV3KGRldiwgQkFSM19WTV9CQVNFLCBCQVIzX1ZNX1NJWkUsIEJBUjNfVk1fQkFTRSwKKwkJCSAgICAgJmRldl9wcml2LT5iYXIzX3ZtKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbMTI3XSA9IGRldl9wcml2LT5maWZvc1swXTsKKwkJZ290byBlcnJvcjsKIAotCS8qIGFsbG9jYXRlIHBhZ2UgdGFibGUgZm9yIFBSQU1JTiBCQVIgKi8KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAoZGV2X3ByaXYtPnJhbWluX3NpemUgPj4gMTIpICogOCwKLQkJCQkgMHgxMDAwLCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCi0JCQkJICZwcml2LT5wcmFtaW5fcHQpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIChCQVIzX1ZNX1NJWkUgPj4gMTIpICogOCwKKwkJCQkgMHgxMDAwLCBOVk9CSl9GTEFHX0RPTlRfTUFQIHwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCSAmZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3I7CisJZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5yZWZjb3VudFswXSA9IDE7CiAKLQludl93bzMyKGNoYW4tPnZtX3BkLCAweDAwMDAsIHByaXYtPnByYW1pbl9wdC0+dmluc3QgfCAweDYzKTsKLQludl93bzMyKGNoYW4tPnZtX3BkLCAweDAwMDQsIDApOworCW52NTBfaW5zdG1lbV9tYXAoZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOwogCi0JLyogRE1BIG9iamVjdCBmb3IgUFJBTUlOIEJBUiAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDYqNCwgMTYsIDAsICZwcml2LT5wcmFtaW5fYmFyKTsKKwlyZXQgPSBudjUwX2NoYW5uZWxfbmV3KGRldiwgMTI4ICogMTAyNCwgZGV2X3ByaXYtPmJhcjNfdm0sICZjaGFuKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCW52X3dvMzIocHJpdi0+cHJhbWluX2JhciwgMHgwMCwgMHg3ZmMwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5wcmFtaW5fYmFyLCAweDA0LCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSAtIDEpOwotCW52X3dvMzIocHJpdi0+cHJhbWluX2JhciwgMHgwOCwgMHgwMDAwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5wcmFtaW5fYmFyLCAweDBjLCAweDAwMDAwMDAwKTsKLQludl93bzMyKHByaXYtPnByYW1pbl9iYXIsIDB4MTAsIDB4MDAwMDAwMDApOwotCW52X3dvMzIocHJpdi0+cHJhbWluX2JhciwgMHgxNCwgMHgwMDAwMDAwMCk7CisJCWdvdG8gZXJyb3I7CisJZGV2X3ByaXYtPmNoYW5uZWxzLnB0clswXSA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbMTI3XSA9IGNoYW47CiAKLQkvKiBtYXAgY2hhbm5lbCBpbnRvIFBSQU1JTiwgZ3B1b2JqIGRpZG4ndCBkbyBpdCBmb3IgdXMgKi8KLQlyZXQgPSBudjUwX2luc3RtZW1fYmluZChkZXYsIGNoYW4tPnJhbWluKTsKKwlyZXQgPSBudjUwX2dwdW9ial9kbWFfbmV3KGNoYW4sIDB4MDAwMCwgQkFSM19WTV9CQVNFLCBCQVIzX1ZNX1NJWkUsCisJCQkJICBOVl9NRU1fVEFSR0VUX1ZNLCBOVl9NRU1fQUNDRVNTX1ZNLAorCQkJCSAgTlZfTUVNX1RZUEVfVk0sIE5WX01FTV9DT01QX1ZNLAorCQkJCSAgJnByaXYtPmJhcjNfZG1hb2JqKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yOwogCi0JLyogcG9rZSByZWdzLi4uICovCiAJbnZfd3IzMihkZXYsIDB4MDAxNzA0LCAweDAwMDAwMDAwIHwgKGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikpOwogCW52X3dyMzIoZGV2LCAweDAwMTcwNCwgMHg0MDAwMDAwMCB8IChjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpKTsKLQludl93cjMyKGRldiwgMHgwMDE3MGMsIDB4ODAwMDAwMDAgfCAocHJpdi0+cHJhbWluX2Jhci0+Y2luc3QgPj4gNCkpOwotCi0JdG1wID0gbnZfcmkzMihkZXYsIDApOwotCW52X3dpMzIoZGV2LCAwLCB+dG1wKTsKLQlpZiAobnZfcmkzMihkZXYsIDApICE9IH50bXApIHsKLQkJTlZfRVJST1IoZGV2LCAiUFJBTUlOIHJlYWRiYWNrIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQludl93aTMyKGRldiwgMCwgdG1wKTsKLQotCWRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUgPSB0cnVlOwotCi0JLyogRGV0ZXJtaW5lIFZNIGxheW91dCAqLwotCWRldl9wcml2LT52bV9nYXJ0X2Jhc2UgPSByb3VuZHVwKE5WNTBfVk1fQkxPQ0ssIE5WNTBfVk1fQkxPQ0spOwotCWRldl9wcml2LT52bV9nYXJ0X3NpemUgPSBOVjUwX1ZNX0JMT0NLOwotCi0JZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSA9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2UgKyBkZXZfcHJpdi0+dm1fZ2FydF9zaXplOwotCWRldl9wcml2LT52bV92cmFtX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9zaXplOwotCWlmIChkZXZfcHJpdi0+dm1fdnJhbV9zaXplID4gTlY1MF9WTV9NQVhfVlJBTSkKLQkJZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IE5WNTBfVk1fTUFYX1ZSQU07Ci0JZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IHJvdW5kdXAoZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSwgTlY1MF9WTV9CTE9DSyk7Ci0JZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnIgPSBkZXZfcHJpdi0+dm1fdnJhbV9zaXplIC8gTlY1MF9WTV9CTE9DSzsKLQotCWRldl9wcml2LT52bV9lbmQgPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlICsgZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZTsKLQotCU5WX0RFQlVHKGRldiwgIk5WNTBWTTogR0FSVCAweCUwMTZsbHgtMHglMDE2bGx4XG4iLAotCQkgZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSwKLQkJIGRldl9wcml2LT52bV9nYXJ0X2Jhc2UgKyBkZXZfcHJpdi0+dm1fZ2FydF9zaXplIC0gMSk7Ci0JTlZfREVCVUcoZGV2LCAiTlY1MFZNOiBWUkFNIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCi0JCSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlLAotCQkgZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZSArIGRldl9wcml2LT52bV92cmFtX3NpemUgLSAxKTsKLQotCS8qIFZSQU0gcGFnZSB0YWJsZShzKSwgbWFwcGVkIGludG8gVk0gYXQgKzFHaUIgICovCi0JZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52bV92cmFtX3B0X25yOyBpKyspIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgTlY1MF9WTV9CTE9DSyAvIDB4MTAwMDAgKiA4LAotCQkJCQkgMCwgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAotCQkJCQkgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwotCQlpZiAocmV0KSB7Ci0JCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBWUkFNIFBHVDogJWRcbiIsIHJldCk7Ci0JCQlkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciA9IGk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWRldl9wcml2LT52bV92cmFtX3B0W2ldID0gY2hhbi0+dm1fdnJhbV9wdFtpXTsKLQotCQludl93bzMyKGNoYW4tPnZtX3BkLCAweDEwICsgKGkqOCksCi0JCQljaGFuLT52bV92cmFtX3B0W2ldLT52aW5zdCB8IDB4NjEpOwotCQludl93bzMyKGNoYW4tPnZtX3BkLCAweDE0ICsgKGkqOCksIDApOwotCX0KLQotCS8qIERNQSBvYmplY3QgZm9yIEZCIEJBUiAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDYqNCwgMTYsIDAsICZwcml2LT5mYl9iYXIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JbnZfd28zMihwcml2LT5mYl9iYXIsIDB4MDAsIDB4N2ZjMDAwMDApOwotCW52X3dvMzIocHJpdi0+ZmJfYmFyLCAweDA0LCAweDQwMDAwMDAwICsKLQkJCQkgICAgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDEpIC0gMSk7Ci0JbnZfd28zMihwcml2LT5mYl9iYXIsIDB4MDgsIDB4NDAwMDAwMDApOwotCW52X3dvMzIocHJpdi0+ZmJfYmFyLCAweDBjLCAweDAwMDAwMDAwKTsKLQludl93bzMyKHByaXYtPmZiX2JhciwgMHgxMCwgMHgwMDAwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5mYl9iYXIsIDB4MTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMTcwYywgMHg4MDAwMDAwMCB8IChwcml2LT5iYXIzX2RtYW9iai0+Y2luc3QgPj4gNCkpOwogCiAJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7CisJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IHRydWU7CiAKLQludl93cjMyKGRldiwgMHgwMDE3MDgsIDB4ODAwMDAwMDAgfCAocHJpdi0+ZmJfYmFyLT5jaW5zdCA+PiA0KSk7CisJdG1wID0gbnZfcm8zMihjaGFuLT5yYW1pbiwgMCk7CisJbnZfd28zMihjaGFuLT5yYW1pbiwgMCwgfnRtcCk7CisJaWYgKG52X3JvMzIoY2hhbi0+cmFtaW4sIDApICE9IH50bXApIHsKKwkJTlZfRVJST1IoZGV2LCAiUFJBTUlOIHJlYWRiYWNrIGZhaWxlZFxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCW52X3dvMzIoY2hhbi0+cmFtaW4sIDAsIHRtcCk7CisKKwkvKiBCQVIxICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCBCQVIxX1ZNX0JBU0UsIEJBUjFfVk1fU0laRSwgQkFSMV9WTV9CQVNFLCAmdm0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJmRldl9wcml2LT5iYXIxX3ZtLCBjaGFuLT52bV9wZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmdm0sIE5VTEwpOworCisJcmV0ID0gbnY1MF9ncHVvYmpfZG1hX25ldyhjaGFuLCAweDAwMDAsIEJBUjFfVk1fQkFTRSwgQkFSMV9WTV9TSVpFLAorCQkJCSAgTlZfTUVNX1RBUkdFVF9WTSwgTlZfTUVNX0FDQ0VTU19WTSwKKwkJCQkgIE5WX01FTV9UWVBFX1ZNLCBOVl9NRU1fQ09NUF9WTSwKKwkJCQkgICZwcml2LT5iYXIxX2RtYW9iaik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCW52X3dyMzIoZGV2LCAweDAwMTcwOCwgMHg4MDAwMDAwMCB8IChwcml2LT5iYXIxX2RtYW9iai0+Y2luc3QgPj4gNCkpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCW52X3dyMzIoZGV2LCAweDE5MDAgKyAoaSo0KSwgMCk7CiAKKwkvKiBDcmVhdGUgc2hhcmVkIGNoYW5uZWwgVk0sIHNwYWNlIGlzIHJlc2VydmVkIGF0IHRoZSBiZWdpbm5pbmcKKwkgKiB0byBjYXRjaCAiTlVMTCBwb2ludGVyIiByZWZlcmVuY2VzCisJICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCAwLCAoMVVMTCA8PCA0MCksIDB4MDAyMDAwMDAwMFVMTCwKKwkJCSAgICAgJmRldl9wcml2LT5jaGFuX3ZtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIDA7CisKK2Vycm9yOgorCW52NTBfaW5zdG1lbV90YWtlZG93bihkZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQKQEAgLTI0MCw3ICsyMzQsNyBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7Ci0Jc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1swXTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0clswXTsKIAlpbnQgaTsKIAogCU5WX0RFQlVHKGRldiwgIlxuIik7CkBAIC0yNTAsMjMgKzI0NCwyMyBAQAogCiAJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IGZhbHNlOwogCi0JLyogUmVzdG9yZSBzdGF0ZSBmcm9tIGJlZm9yZSBpbml0ICovCisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmRldl9wcml2LT5jaGFuX3ZtLCBOVUxMKTsKKwogCWZvciAoaSA9IDB4MTcwMDsgaSA8PSAweDE3MTA7IGkgKz0gNCkKIAkJbnZfd3IzMihkZXYsIGksIHByaXYtPnNhdmUxNzAwWyhpIC0gMHgxNzAwKSAvIDRdKTsKIAotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+ZmJfYmFyKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnByYW1pbl9iYXIpOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+cHJhbWluX3B0KTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPmJhcjNfZG1hb2JqKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPmJhcjFfZG1hb2JqKTsKIAotCS8qIERlc3Ryb3kgZHVtbXkgY2hhbm5lbCAqLwotCWlmIChjaGFuKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKQotCQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT52bV92cmFtX3B0W2ldKTsKLQkJZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnIgPSAwOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZkZXZfcHJpdi0+YmFyMV92bSwgY2hhbi0+dm1fcGQpOworCWRldl9wcml2LT5jaGFubmVscy5wdHJbMTI3XSA9IDA7CisJbnY1MF9jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmNoYW5uZWxzLnB0clswXSk7CiAKLQkJbnY1MF9jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmZpZm9zWzBdKTsKLQkJZGV2X3ByaXYtPmZpZm9zWzEyN10gPSBOVUxMOwotCX0KKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmRldl9wcml2LT5iYXIzX3ZtLT5wZ3RbMF0ub2JqWzBdKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmZGV2X3ByaXYtPmJhcjNfdm0sIE5VTEwpOworCisJaWYgKGRldl9wcml2LT5yYW1pbl9oZWFwLmZyZWVfc3RhY2submV4dCkKKwkJZHJtX21tX3Rha2Vkb3duKCZkZXZfcHJpdi0+cmFtaW5faGVhcCk7CiAKIAlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdiA9IE5VTEw7CiAJa2ZyZWUocHJpdik7CkBAIC0yNzYsMTYgKzI3MCw4IEBACiBudjUwX2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1swXTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWluID0gY2hhbi0+cmFtaW47Ci0JaW50IGk7CiAKLQlyYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kID0gdm1hbGxvYyhyYW1pbi0+c2l6ZSk7Ci0JaWYgKCFyYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCByYW1pbi0+c2l6ZTsgaSArPSA0KQotCQlyYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0gPSBudl9yaTMyKGRldiwgaSk7CisJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IGZhbHNlOwogCXJldHVybiAwOwogfQogCkBAIC0yOTQsMTQ2ICsyODAsMTIxIEBACiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zWzBdOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbjsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0clswXTsKIAlpbnQgaTsKIAotCWRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUgPSBmYWxzZTsKLQlkZXZfcHJpdi0+cmFtaW5fYmFzZSA9IH4wOwotCWZvciAoaSA9IDA7IGkgPCByYW1pbi0+c2l6ZTsgaSArPSA0KQotCQludl93bzMyKHJhbWluLCBpLCByYW1pbi0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0pOwotCWRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUgPSB0cnVlOwotCXZmcmVlKHJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQpOwotCXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQgPSBOVUxMOwotCiAJLyogUG9rZSB0aGUgcmVsZXZhbnQgcmVncywgYW5kIHByYXkgaXQgd29ya3MgOikgKi8KIAludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSwgKGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikpOwogCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfVU5LMTcxMCwgMCk7CiAJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0UsIChjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpIHwKIAkJCQkJIE5WNTBfUFVOS19CQVJfQ0ZHX0JBU0VfVkFMSUQpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSMV9DVFhETUEsIChwcml2LT5mYl9iYXItPmNpbnN0ID4+IDQpIHwKKwludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjFfQ1RYRE1BLCAocHJpdi0+YmFyMV9kbWFvYmotPmNpbnN0ID4+IDQpIHwKIAkJCQkJTlY1MF9QVU5LX0JBUjFfQ1RYRE1BX1ZBTElEKTsKLQludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUjNfQ1RYRE1BLCAocHJpdi0+cHJhbWluX2Jhci0+Y2luc3QgPj4gNCkgfAorCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSM19DVFhETUEsIChwcml2LT5iYXIzX2RtYW9iai0+Y2luc3QgPj4gNCkgfAogCQkJCQlOVjUwX1BVTktfQkFSM19DVFhETUFfVkFMSUQpOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJbnZfd3IzMihkZXYsIDB4MTkwMCArIChpKjQpLCAwKTsKKworCWRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUgPSB0cnVlOwogfQogCitzdHJ1Y3QgbnY1MF9ncHVvYmpfbm9kZSB7CisJc3RydWN0IG5vdXZlYXVfdnJhbSAqdnJhbTsKKwlzdHJ1Y3Qgbm91dmVhdV92bWEgY2hhbl92bWE7CisJdTMyIGFsaWduOworfTsKKworCiBpbnQKLW52NTBfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwKLQkJICAgICAgdWludDMyX3QgKnN6KQorbnY1MF9pbnN0bWVtX2dldChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiwgdTMyIHNpemUsIHUzMiBhbGlnbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZ3B1b2JqLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IG52NTBfZ3B1b2JqX25vZGUgKm5vZGUgPSBOVUxMOwogCWludCByZXQ7CiAKLQlpZiAoZ3B1b2JqLT5pbV9iYWNraW5nKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlub2RlID0ga3phbGxvYyhzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCW5vZGUtPmFsaWduID0gYWxpZ247CiAKLQkqc3ogPSBBTElHTigqc3osIDQwOTYpOwotCWlmICgqc3ogPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSAgPSAoc2l6ZSArIDQwOTUpICYgfjQwOTU7CisJYWxpZ24gPSBtYXgoYWxpZ24sICh1MzIpNDA5Nik7CiAKLQlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsICpzeiwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwgMCwgMHgwMDAwLAotCQkJICAgICB0cnVlLCBmYWxzZSwgJmdwdW9iai0+aW1fYmFja2luZyk7CisJcmV0ID0gdnJhbS0+Z2V0KGRldiwgc2l6ZSwgYWxpZ24sIDAsIDAsICZub2RlLT52cmFtKTsKIAlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgImVycm9yIGdldHRpbmcgUFJBTUlOIGJhY2tpbmcgcGFnZXM6ICVkXG4iLCByZXQpOworCQlrZnJlZShub2RlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBub3V2ZWF1X2JvX3BpbihncHVvYmotPmltX2JhY2tpbmcsIFRUTV9QTF9GTEFHX1ZSQU0pOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiZXJyb3IgcGlubmluZyBQUkFNSU4gYmFja2luZyBWUkFNOiAlZFxuIiwgcmV0KTsKLQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmdwdW9iai0+aW1fYmFja2luZyk7Ci0JCXJldHVybiByZXQ7CisJZ3B1b2JqLT52aW5zdCA9IG5vZGUtPnZyYW0tPm9mZnNldDsKKworCWlmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19WTSkgeworCQlyZXQgPSBub3V2ZWF1X3ZtX2dldChkZXZfcHJpdi0+Y2hhbl92bSwgc2l6ZSwgMTIsCisJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXIHwgTlZfTUVNX0FDQ0VTU19TWVMsCisJCQkJICAgICAmbm9kZS0+Y2hhbl92bWEpOworCQlpZiAocmV0KSB7CisJCQl2cmFtLT5wdXQoZGV2LCAmbm9kZS0+dnJhbSk7CisJCQlrZnJlZShub2RlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlub3V2ZWF1X3ZtX21hcCgmbm9kZS0+Y2hhbl92bWEsIG5vZGUtPnZyYW0pOworCQlncHVvYmotPnZpbnN0ID0gbm9kZS0+Y2hhbl92bWEub2Zmc2V0OwogCX0KIAotCWdwdW9iai0+dmluc3QgPSBncHVvYmotPmltX2JhY2tpbmctPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOworCWdwdW9iai0+c2l6ZSA9IHNpemU7CisJZ3B1b2JqLT5ub2RlID0gbm9kZTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZAotbnY1MF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQorbnY1MF9pbnN0bWVtX3B1dChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZ3B1b2JqLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IG52NTBfZ3B1b2JqX25vZGUgKm5vZGU7CiAKLQlpZiAoZ3B1b2JqICYmIGdwdW9iai0+aW1fYmFja2luZykgewotCQlpZiAoZ3B1b2JqLT5pbV9ib3VuZCkKLQkJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS51bmJpbmQoZGV2LCBncHVvYmopOwotCQlub3V2ZWF1X2JvX3VucGluKGdwdW9iai0+aW1fYmFja2luZyk7Ci0JCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZncHVvYmotPmltX2JhY2tpbmcpOwotCQlncHVvYmotPmltX2JhY2tpbmcgPSBOVUxMOworCW5vZGUgPSBncHVvYmotPm5vZGU7CisJZ3B1b2JqLT5ub2RlID0gTlVMTDsKKworCWlmIChub2RlLT5jaGFuX3ZtYS5ub2RlKSB7CisJCW5vdXZlYXVfdm1fdW5tYXAoJm5vZGUtPmNoYW5fdm1hKTsKKwkJbm91dmVhdV92bV9wdXQoJm5vZGUtPmNoYW5fdm1hKTsKIAl9CisJdnJhbS0+cHV0KGRldiwgJm5vZGUtPnZyYW0pOworCWtmcmVlKG5vZGUpOwogfQogCiBpbnQKLW52NTBfaW5zdG1lbV9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQorbnY1MF9pbnN0bWVtX21hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHJhbWluX3B0ID0gcHJpdi0+cHJhbWluX3B0OwotCXVpbnQzMl90IHB0ZSwgcHRlX2VuZDsKLQl1aW50NjRfdCB2cmFtOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGdwdW9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9ncHVvYmpfbm9kZSAqbm9kZSA9IGdwdW9iai0+bm9kZTsKKwlpbnQgcmV0OwogCi0JaWYgKCFncHVvYmotPmltX2JhY2tpbmcgfHwgIWdwdW9iai0+aW1fcHJhbWluIHx8IGdwdW9iai0+aW1fYm91bmQpCi0JCXJldHVybiAtRUlOVkFMOworCXJldCA9IG5vdXZlYXVfdm1fZ2V0KGRldl9wcml2LT5iYXIzX3ZtLCBncHVvYmotPnNpemUsIDEyLAorCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXLCAmbm9kZS0+dnJhbS0+YmFyX3ZtYSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCU5WX0RFQlVHKGRldiwgInN0PTB4JWx4IHN6PTB4JWx4XG4iLAotCQkgZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0LCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZSk7Ci0KLQlwdGUgICAgID0gKGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA+PiAxMikgPDwgMTsKLQlwdGVfZW5kID0gKChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgPDwgMSkgKyBwdGU7Ci0JdnJhbSAgICA9IGdwdW9iai0+dmluc3Q7Ci0KLQlOVl9ERUJVRyhkZXYsICJwcmFtaW49MHglbHgsIHB0ZT0lZCwgcHRlX2VuZD0lZFxuIiwKLQkJIGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCwgcHRlLCBwdGVfZW5kKTsKLQlOVl9ERUJVRyhkZXYsICJmaXJzdCB2cmFtIHBhZ2U6IDB4JTAxMGxseFxuIiwgZ3B1b2JqLT52aW5zdCk7Ci0KLQl2cmFtIHw9IDE7Ci0JaWYgKGRldl9wcml2LT52cmFtX3N5c19iYXNlKSB7Ci0JCXZyYW0gKz0gZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2U7Ci0JCXZyYW0gfD0gMHgzMDsKLQl9Ci0KLQl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewotCQludl93bzMyKHByYW1pbl9wdCwgKHB0ZSAqIDQpICsgMCwgbG93ZXJfMzJfYml0cyh2cmFtKSk7Ci0JCW52X3dvMzIocHJhbWluX3B0LCAocHRlICogNCkgKyA0LCB1cHBlcl8zMl9iaXRzKHZyYW0pKTsKLQkJdnJhbSArPSAweDEwMDA7Ci0JCXB0ZSArPSAyOwotCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQotCW52NTBfdm1fZmx1c2goZGV2LCA2KTsKLQotCWdwdW9iai0+aW1fYm91bmQgPSAxOworCW5vdXZlYXVfdm1fbWFwKCZub2RlLT52cmFtLT5iYXJfdm1hLCBub2RlLT52cmFtKTsKKwlncHVvYmotPnBpbnN0ID0gbm9kZS0+dnJhbS0+YmFyX3ZtYS5vZmZzZXQ7CiAJcmV0dXJuIDA7CiB9CiAKLWludAotbnY1MF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3ZvaWQKK252NTBfaW5zdG1lbV91bm1hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OwotCXVpbnQzMl90IHB0ZSwgcHRlX2VuZDsKKwlzdHJ1Y3QgbnY1MF9ncHVvYmpfbm9kZSAqbm9kZSA9IGdwdW9iai0+bm9kZTsKIAotCWlmIChncHVvYmotPmltX2JvdW5kID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogY2FuIGhhcHBlbiBkdXJpbmcgbGF0ZSB0YWtlZG93biAqLwotCWlmICh1bmxpa2VseSghZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSkpCi0JCXJldHVybiAwOwotCi0JcHRlICAgICA9IChncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgPj4gMTIpIDw8IDE7Ci0JcHRlX2VuZCA9ICgoZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgPj4gMTIpIDw8IDEpICsgcHRlOwotCi0Jd2hpbGUgKHB0ZSA8IHB0ZV9lbmQpIHsKLQkJbnZfd28zMihwcml2LT5wcmFtaW5fcHQsIChwdGUgKiA0KSArIDAsIDB4MDAwMDAwMDApOwotCQludl93bzMyKHByaXYtPnByYW1pbl9wdCwgKHB0ZSAqIDQpICsgNCwgMHgwMDAwMDAwMCk7Ci0JCXB0ZSArPSAyOworCWlmIChub2RlLT52cmFtLT5iYXJfdm1hLm5vZGUpIHsKKwkJbm91dmVhdV92bV91bm1hcCgmbm9kZS0+dnJhbS0+YmFyX3ZtYSk7CisJCW5vdXZlYXVfdm1fcHV0KCZub2RlLT52cmFtLT5iYXJfdm1hKTsKIAl9Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7Ci0KLQlncHVvYmotPmltX2JvdW5kID0gMDsKLQlyZXR1cm4gMDsKIH0KIAogdm9pZApAQCAtNDUyLDExICs0MTMsMyBAQAogCQlOVl9FUlJPUihkZXYsICJQUkFNSU4gZmx1c2ggdGltZW91dFxuIik7CiB9CiAKLXZvaWQKLW52NTBfdm1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKLXsKLQludl93cjMyKGRldiwgMHgxMDBjODAsIChlbmdpbmUgPDwgMTYpIHwgMSk7Ci0JaWYgKCFudl93YWl0KGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQotCQlOVl9FUlJPUihkZXYsICJ2bSBmbHVzaCB0aW1lb3V0OiBlbmdpbmUgJWRcbiIsIGVuZ2luZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU1MjNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92bS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKKwordm9pZAorbnY1MF92bV9tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkLCB1MzIgcGRlLAorCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndFsyXSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBwZ2QtPmRldi0+ZGV2X3ByaXZhdGU7CisJdTY0IHBoeXMgPSAweGRlYWRjYWZlMDAwMDAwMDBVTEw7CisJdTMyIGNvdmVyYWdlID0gMDsKKworCWlmIChwZ3RbMF0pIHsKKwkJcGh5cyA9IDB4MDAwMDAwMDMgfCBwZ3RbMF0tPnZpbnN0OyAvKiBwcmVzZW50LCA0S2lCIHBhZ2VzICovCisJCWNvdmVyYWdlID0gKHBndFswXS0+c2l6ZSA+PiAzKSA8PCAxMjsKKwl9IGVsc2UKKwlpZiAocGd0WzFdKSB7CisJCXBoeXMgPSAweDAwMDAwMDAxIHwgcGd0WzFdLT52aW5zdDsgLyogcHJlc2VudCAqLworCQljb3ZlcmFnZSA9IChwZ3RbMV0tPnNpemUgPj4gMykgPDwgMTY7CisJfQorCisJaWYgKHBoeXMgJiAxKSB7CisJCWlmIChkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSkgeworCQkJcGh5cyArPSBkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZTsKKwkJCXBoeXMgfD0gMHgzMDsKKwkJfQorCisJCWlmIChjb3ZlcmFnZSA8PSAzMiAqIDEwMjQgKiAxMDI0KQorCQkJcGh5cyB8PSAweDYwOworCQllbHNlIGlmIChjb3ZlcmFnZSA8PSA2NCAqIDEwMjQgKiAxMDI0KQorCQkJcGh5cyB8PSAweDQwOworCQllbHNlIGlmIChjb3ZlcmFnZSA8IDEyOCAqIDEwMjQgKiAxMDI0KQorCQkJcGh5cyB8PSAweDIwOworCX0KKworCW52X3dvMzIocGdkLCAocGRlICogOCkgKyAwLCBsb3dlcl8zMl9iaXRzKHBoeXMpKTsKKwludl93bzMyKHBnZCwgKHBkZSAqIDgpICsgNCwgdXBwZXJfMzJfYml0cyhwaHlzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitudjUwX3ZtX2FkZHIoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LAorCSAgICAgdTY0IHBoeXMsIHUzMiBtZW10eXBlLCB1MzIgdGFyZ2V0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IHBndC0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCXBoeXMgfD0gMTsgLyogcHJlc2VudCAqLworCXBoeXMgfD0gKHU2NCltZW10eXBlIDw8IDQwOworCisJLyogSUdQcyBkb24ndCBoYXZlIHJlYWwgVlJBTSwgcmUtdGFyZ2V0IHRvIHN0b2xlbiBzeXN0ZW0gbWVtb3J5ICovCisJaWYgKHRhcmdldCA9PSAwICYmIGRldl9wcml2LT52cmFtX3N5c19iYXNlKSB7CisJCXBoeXMgICs9IGRldl9wcml2LT52cmFtX3N5c19iYXNlOworCQl0YXJnZXQgPSAzOworCX0KKworCXBoeXMgfD0gdGFyZ2V0IDw8IDQ7CisKKwlpZiAodm1hLT5hY2Nlc3MgJiBOVl9NRU1fQUNDRVNTX1NZUykKKwkJcGh5cyB8PSAoMSA8PCA2KTsKKworCWlmICghKHZtYS0+YWNjZXNzICYgTlZfTUVNX0FDQ0VTU19XTykpCisJCXBoeXMgfD0gKDEgPDwgMyk7CisKKwlyZXR1cm4gcGh5czsKK30KKwordm9pZAorbnY1MF92bV9tYXAoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LAorCSAgICBzdHJ1Y3Qgbm91dmVhdV92cmFtICptZW0sIHUzMiBwdGUsIHUzMiBjbnQsIHU2NCBwaHlzKQoreworCXUzMiBibG9jazsKKwlpbnQgaTsKKworCXBoeXMgID0gbnY1MF92bV9hZGRyKHZtYSwgcGd0LCBwaHlzLCBtZW0tPm1lbXR5cGUsIDApOworCXB0ZSA8PD0gMzsKKwljbnQgPDw9IDM7CisKKwl3aGlsZSAoY250KSB7CisJCXUzMiBvZmZzZXRfaCA9IHVwcGVyXzMyX2JpdHMocGh5cyk7CisJCXUzMiBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMocGh5cyk7CisKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJCWJsb2NrID0gMSA8PCAoaSArIDMpOworCQkJaWYgKGNudCA+PSBibG9jayAmJiAhKHB0ZSAmIChibG9jayAtIDEpKSkKKwkJCQlicmVhazsKKwkJfQorCQlvZmZzZXRfbCB8PSAoaSA8PCA3KTsKKworCQlwaHlzICs9IGJsb2NrIDw8ICh2bWEtPm5vZGUtPnR5cGUgLSAzKTsKKwkJY250ICAtPSBibG9jazsKKworCQl3aGlsZSAoYmxvY2spIHsKKwkJCW52X3dvMzIocGd0LCBwdGUgKyAwLCBvZmZzZXRfbCk7CisJCQludl93bzMyKHBndCwgcHRlICsgNCwgb2Zmc2V0X2gpOworCQkJcHRlICs9IDg7CisJCQlibG9jayAtPSA4OworCQl9CisJfQorfQorCit2b2lkCitudjUwX3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QsCisJICAgICAgIHUzMiBwdGUsIGRtYV9hZGRyX3QgKmxpc3QsIHUzMiBjbnQpCit7CisJcHRlIDw8PSAzOworCXdoaWxlIChjbnQtLSkgeworCQl1NjQgcGh5cyA9IG52NTBfdm1fYWRkcih2bWEsIHBndCwgKHU2NCkqbGlzdCsrLCAwLCAyKTsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIGxvd2VyXzMyX2JpdHMocGh5cykpOworCQludl93bzMyKHBndCwgcHRlICsgNCwgdXBwZXJfMzJfYml0cyhwaHlzKSk7CisJCXB0ZSArPSA4OworCX0KK30KKwordm9pZAorbnY1MF92bV91bm1hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCwgdTMyIHB0ZSwgdTMyIGNudCkKK3sKKwlwdGUgPDw9IDM7CisJd2hpbGUgKGNudC0tKSB7CisJCW52X3dvMzIocGd0LCBwdGUgKyAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDQsIDB4MDAwMDAwMDApOworCQlwdGUgKz0gODsKKwl9Cit9CisKK3ZvaWQKK252NTBfdm1fZmx1c2goc3RydWN0IG5vdXZlYXVfdm0gKnZtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IHZtLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICpwaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnlwdF9lbmdpbmUgKnBjcnlwdCA9ICZkZXZfcHJpdi0+ZW5naW5lLmNyeXB0OworCisJcGluc3RtZW0tPmZsdXNoKHZtLT5kZXYpOworCisJLyogQkFSICovCisJaWYgKHZtICE9IGRldl9wcml2LT5jaGFuX3ZtKSB7CisJCW52NTBfdm1fZmx1c2hfZW5naW5lKHZtLT5kZXYsIDYpOworCQlyZXR1cm47CisJfQorCisJcGZpZm8tPnRsYl9mbHVzaCh2bS0+ZGV2KTsKKworCWlmIChhdG9taWNfcmVhZCgmdm0tPnBncmFwaF9yZWZzKSkKKwkJcGdyYXBoLT50bGJfZmx1c2godm0tPmRldik7CisJaWYgKGF0b21pY19yZWFkKCZ2bS0+cGNyeXB0X3JlZnMpKQorCQlwY3J5cHQtPnRsYl9mbHVzaCh2bS0+ZGV2KTsKK30KKwordm9pZAorbnY1MF92bV9mbHVzaF9lbmdpbmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKK3sKKwludl93cjMyKGRldiwgMHgxMDBjODAsIChlbmdpbmUgPDwgMTYpIHwgMSk7CisJaWYgKCFudl93YWl0KGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQorCQlOVl9FUlJPUihkZXYsICJ2bSBmbHVzaCB0aW1lb3V0OiBlbmdpbmUgJWRcbiIsIGVuZ2luZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3ZyYW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTk4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3ZyYW0uYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorCitzdGF0aWMgaW50IHR5cGVzWzB4ODBdID0geworCTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMiwgMiwgMiwgMiwgMCwgMCwgMCwgMCwKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMCwgMCwKKwkwLCAwLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsCisJMSwgMCwgMiwgMCwgMSwgMCwgMiwgMCwgMSwgMSwgMiwgMiwgMSwgMSwgMCwgMAorfTsKKworYm9vbAorbnY1MF92cmFtX2ZsYWdzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiB0aWxlX2ZsYWdzKQoreworCWludCB0eXBlID0gKHRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX0xBWU9VVF9NQVNLKSA+PiA4OworCisJaWYgKGxpa2VseSh0eXBlIDwgQVJSQVlfU0laRSh0eXBlcykgJiYgdHlwZXNbdHlwZV0pKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQKK252NTBfdnJhbV9kZWwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKnB2cmFtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSAmZGV2X3ByaXYtPnR0bS5iZGV2OworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hbltUVE1fUExfVlJBTV07CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gbWFuLT5wcml2OworCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXM7CisJc3RydWN0IG5vdXZlYXVfdnJhbSAqdnJhbTsKKworCXZyYW0gPSAqcHZyYW07CisJKnB2cmFtID0gTlVMTDsKKwlpZiAodW5saWtlbHkodnJhbSA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbW0tPm11dGV4KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnZyYW0tPnJlZ2lvbnMpKSB7CisJCXRoaXMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2cmFtLT5yZWdpb25zLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlLCBybF9lbnRyeSk7CisKKwkJbGlzdF9kZWwoJnRoaXMtPnJsX2VudHJ5KTsKKwkJbm91dmVhdV9tbV9wdXQobW0sIHRoaXMpOworCX0KKwltdXRleF91bmxvY2soJm1tLT5tdXRleCk7CisKKwlrZnJlZSh2cmFtKTsKK30KKworaW50CitudjUwX3ZyYW1fbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU2NCBzaXplLCB1MzIgYWxpZ24sIHUzMiBzaXplX25jLAorCSAgICAgIHUzMiB0eXBlLCBzdHJ1Y3Qgbm91dmVhdV92cmFtICoqcHZyYW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+dHRtLmJkZXY7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW1RUTV9QTF9WUkFNXTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBtYW4tPnByaXY7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcjsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtOworCWludCByZXQ7CisKKwlpZiAoIXR5cGVzW3R5cGVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplID4+PSAxMjsKKwlhbGlnbiA+Pj0gMTI7CisJc2l6ZV9uYyA+Pj0gMTI7CisKKwl2cmFtID0ga3phbGxvYyhzaXplb2YoKnZyYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZyYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnZyYW0tPnJlZ2lvbnMpOworCXZyYW0tPmRldiA9IGRldl9wcml2LT5kZXY7CisJdnJhbS0+bWVtdHlwZSA9IHR5cGU7CisJdnJhbS0+c2l6ZSA9IHNpemU7CisKKwltdXRleF9sb2NrKCZtbS0+bXV0ZXgpOworCWRvIHsKKwkJcmV0ID0gbm91dmVhdV9tbV9nZXQobW0sIHR5cGVzW3R5cGVdLCBzaXplLCBzaXplX25jLCBhbGlnbiwgJnIpOworCQlpZiAocmV0KSB7CisJCQltdXRleF91bmxvY2soJm1tLT5tdXRleCk7CisJCQludjUwX3ZyYW1fZGVsKGRldiwgJnZyYW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJnItPnJsX2VudHJ5LCAmdnJhbS0+cmVnaW9ucyk7CisJCXNpemUgLT0gci0+bGVuZ3RoOworCX0gd2hpbGUgKHNpemUpOworCW11dGV4X3VubG9jaygmbW0tPm11dGV4KTsKKworCXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2cmFtLT5yZWdpb25zLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlLCBybF9lbnRyeSk7CisJdnJhbS0+b2Zmc2V0ID0gKHU2NClyLT5vZmZzZXQgPDwgMTI7CisJKnB2cmFtID0gdnJhbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMgorbnY1MF92cmFtX3JibG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGksIHBhcnRzLCBjb2xiaXRzLCByb3diaXRzYSwgcm93Yml0c2IsIGJhbmtzOworCXU2NCByb3dzaXplLCBwcmVkaWN0ZWQ7CisJdTMyIHIwLCByNCwgcnQsIHJ1LCByYmxvY2tfc2l6ZTsKKworCXIwID0gbnZfcmQzMihkZXYsIDB4MTAwMjAwKTsKKwlyNCA9IG52X3JkMzIoZGV2LCAweDEwMDIwNCk7CisJcnQgPSBudl9yZDMyKGRldiwgMHgxMDAyNTApOworCXJ1ID0gbnZfcmQzMihkZXYsIDB4MDAxNTQwKTsKKwlOVl9ERUJVRyhkZXYsICJtZW1jZmcgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLCByMCwgcjQsIHJ0LCBydSk7CisKKwlmb3IgKGkgPSAwLCBwYXJ0cyA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKHJ1ICYgKDB4MDAwMTAwMDAgPDwgaSkpCisJCQlwYXJ0cysrOworCX0KKworCWNvbGJpdHMgID0gIChyNCAmIDB4MDAwMGYwMDApID4+IDEyOworCXJvd2JpdHNhID0gKChyNCAmIDB4MDAwZjAwMDApID4+IDE2KSArIDg7CisJcm93Yml0c2IgPSAoKHI0ICYgMHgwMGYwMDAwMCkgPj4gMjApICsgODsKKwliYW5rcyAgICA9ICgocjQgJiAweDAxMDAwMDAwKSA/IDggOiA0KTsKKworCXJvd3NpemUgPSBwYXJ0cyAqIGJhbmtzICogKDEgPDwgY29sYml0cykgKiA4OworCXByZWRpY3RlZCA9IHJvd3NpemUgPDwgcm93Yml0c2E7CisJaWYgKHIwICYgMHgwMDAwMDAwNCkKKwkJcHJlZGljdGVkICs9IHJvd3NpemUgPDwgcm93Yml0c2I7CisKKwlpZiAocHJlZGljdGVkICE9IGRldl9wcml2LT52cmFtX3NpemUpIHsKKwkJTlZfV0FSTihkZXYsICJtZW1vcnkgY29udHJvbGxlciByZXBvcnRzICVkTWlCIFZSQU1cbiIsCisJCQkodTMyKShkZXZfcHJpdi0+dnJhbV9zaXplID4+IDIwKSk7CisJCU5WX1dBUk4oZGV2LCAid2UgY2FsY3VsYXRlZCAlZE1pQiBWUkFNXG4iLAorCQkJKHUzMikocHJlZGljdGVkID4+IDIwKSk7CisJfQorCisJcmJsb2NrX3NpemUgPSByb3dzaXplOworCWlmIChydCAmIDEpCisJCXJibG9ja19zaXplICo9IDM7CisKKwlOVl9ERUJVRyhkZXYsICJyYmxvY2sgJWQgYnl0ZXNcbiIsIHJibG9ja19zaXplKTsKKwlyZXR1cm4gcmJsb2NrX3NpemU7Cit9CisKK2ludAorbnY1MF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPnZyYW1fc2l6ZSAgPSBudl9yZDMyKGRldiwgMHgxMDAyMGMpOworCWRldl9wcml2LT52cmFtX3NpemUgfD0gKGRldl9wcml2LT52cmFtX3NpemUgJiAweGZmKSA8PCAzMjsKKwlkZXZfcHJpdi0+dnJhbV9zaXplICY9IDB4ZmZmZmZmZmYwMFVMTDsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4YWE6CisJY2FzZSAweGFjOgorCWNhc2UgMHhhZjoKKwkJZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UgPSAodTY0KW52X3JkMzIoZGV2LCAweDEwMGUxMCkgPDwgMTI7CisJCWRldl9wcml2LT52cmFtX3JibG9ja19zaXplID0gNDA5NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgPSBudjUwX3ZyYW1fcmJsb2NrKGRldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY4NF9jcnlwdC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY4NF9jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMThhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjg0X2NyeXB0LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdXRpbC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKKworc3RhdGljIHZvaWQgbnY4NF9jcnlwdF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CisKK2ludAorbnY4NF9jcnlwdF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWluID0gY2hhbi0+cmFtaW47CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDI1NiwgMCwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsCisJCQkJICZjaGFuLT5jcnlwdF9jdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludl93bzMyKHJhbWluLCAweGEwLCAweDAwMTkwMDAwKTsKKwludl93bzMyKHJhbWluLCAweGE0LCBjaGFuLT5jcnlwdF9jdHgtPnZpbnN0ICsgMHhmZik7CisJbnZfd28zMihyYW1pbiwgMHhhOCwgY2hhbi0+Y3J5cHRfY3R4LT52aW5zdCk7CisJbnZfd28zMihyYW1pbiwgMHhhYywgMCk7CisJbnZfd28zMihyYW1pbiwgMHhiMCwgMCk7CisJbnZfd28zMihyYW1pbiwgMHhiNCwgMCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKwlhdG9taWNfaW5jKCZjaGFuLT52bS0+cGNyeXB0X3JlZnMpOworCXJldHVybiAwOworfQorCit2b2lkCitudjg0X2NyeXB0X2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdTMyIGluc3Q7CisKKwlpZiAoIWNoYW4tPmNyeXB0X2N0eCkKKwkJcmV0dXJuOworCisJaW5zdCAgPSAoY2hhbi0+cmFtaW4tPnZpbnN0ID4+IDEyKTsKKwlpbnN0IHw9IDB4ODAwMDAwMDA7CisKKwkvKiBtYXJrIGNvbnRleHQgYXMgaW52YWxpZCBpZiBzdGlsbCBvbiB0aGUgaGFyZHdhcmUsIG5vdAorCSAqIGRvaW5nIHRoaXMgY2F1c2VzIGlzc3VlcyB0aGUgbmV4dCB0aW1lIFBDUllQVCBpcyB1c2VkLAorCSAqIHVuc3VycHJpc2luZ2x5IDopCisJICovCisJbnZfd3IzMihkZXYsIDB4MTAyMDBjLCAweDAwMDAwMDAwKTsKKwlpZiAobnZfcmQzMihkZXYsIDB4MTAyMTg4KSA9PSBpbnN0KQorCQludl9tYXNrKGRldiwgMHgxMDIxODgsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApOworCWlmIChudl9yZDMyKGRldiwgMHgxMDIxOGMpID09IGluc3QpCisJCW52X21hc2soZGV2LCAweDEwMjE4YywgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MTAyMDBjLCAweDAwMDAwMDEwKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+Y3J5cHRfY3R4KTsKKwlhdG9taWNfZGVjKCZjaGFuLT52bS0+cGNyeXB0X3JlZnMpOworfQorCit2b2lkCitudjg0X2NyeXB0X3RsYl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52NTBfdm1fZmx1c2hfZW5naW5lKGRldiwgMHgwYSk7Cit9CisKK2ludAorbnY4NF9jcnlwdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jcnlwdF9lbmdpbmUgKnBjcnlwdCA9ICZkZXZfcHJpdi0+ZW5naW5lLmNyeXB0OworCisJaWYgKCFwY3J5cHQtPnJlZ2lzdGVyZWQpIHsKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDc0YzEsIENSWVBUKTsKKwkJcGNyeXB0LT5yZWdpc3RlcmVkID0gdHJ1ZTsKKwl9CisKKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAwMDQwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwNDAwMCwgMHgwMDAwNDAwMCk7CisKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDE0LCBudjg0X2NyeXB0X2lzcik7CisJbnZfd3IzMihkZXYsIDB4MTAyMTMwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgxMDIxNDAsIDB4ZmZmZmZmYmYpOworCisJbnZfd3IzMihkZXYsIDB4MTAyMDBjLCAweDAwMDAwMDEwKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnY4NF9jcnlwdF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4MTAyMTQwLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTQpOworfQorCitzdGF0aWMgdm9pZAorbnY4NF9jcnlwdF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDEwMjEzMCk7CisJdTMyIG10aGQgPSBudl9yZDMyKGRldiwgMHgxMDIxOTApOworCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIDB4MTAyMTk0KTsKKwl1MzIgaW5zdCA9IG52X3JkMzIoZGV2LCAweDEwMjE4OCkgJiAweDdmZmZmZmZmOworCWludCBzaG93ID0gbm91dmVhdV9yYXRlbGltaXQoKTsKKworCWlmIChzaG93KSB7CisJCU5WX0lORk8oZGV2LCAiUENSWVBUX0lOVFI6IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKwkJCSAgICAgc3RhdCwgbXRoZCwgZGF0YSwgaW5zdCk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4MTAyMTMwLCBzdGF0KTsKKwludl93cjMyKGRldiwgMHgxMDIwMGMsIDB4MTApOworCisJbnY1MF9mYl92bV90cmFwKGRldiwgc2hvdywgIlBDUllQVCIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9mYmNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9mYmNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWQ0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiY29uLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCisjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZmJjb24uaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCisKK2ludAorbnZjMF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KQoreworCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCWludCByZXQ7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIHJlY3QtPnJvcCA9PSBST1BfQ09QWSA/IDcgOiAxMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpIHsKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyYWMsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIDEpOworCX0KKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDU4OCwgMSk7CisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikKKwkJT1VUX1JJTkcgIChjaGFuLCAoKHVpbnQzMl90ICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlY3QtPmNvbG9yXSk7CisJZWxzZQorCQlPVVRfUklORyAgKGNoYW4sIHJlY3QtPmNvbG9yKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDYwMCwgNCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWN0LT5keCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWN0LT5keSk7CisJT1VUX1JJTkcgIChjaGFuLCByZWN0LT5keCArIHJlY3QtPndpZHRoKTsKKwlPVVRfUklORyAgKGNoYW4sIHJlY3QtPmR5ICsgcmVjdC0+aGVpZ2h0KTsKKwlpZiAocmVjdC0+cm9wICE9IFJPUF9DT1BZKSB7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMmFjLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCAzKTsKKwl9CisJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOworfQorCitpbnQKK252YzBfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCWludCByZXQ7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDEyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAxMTAsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4YjAsIDQpOworCU9VVF9SSU5HICAoY2hhbiwgcmVnaW9uLT5keCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWdpb24tPmR5KTsKKwlPVVRfUklORyAgKGNoYW4sIHJlZ2lvbi0+d2lkdGgpOworCU9VVF9SSU5HICAoY2hhbiwgcmVnaW9uLT5oZWlnaHQpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwOGQwLCA0KTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgcmVnaW9uLT5zeCk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIHJlZ2lvbi0+c3kpOworCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudmMwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwl1aW50MzJfdCB3aWR0aCwgZHdvcmRzLCAqZGF0YSA9ICh1aW50MzJfdCAqKWltYWdlLT5kYXRhOworCXVpbnQzMl90IG1hc2sgPSB+KH4wID4+ICgzMiAtIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkpOworCXVpbnQzMl90ICpwYWxldHRlID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CisJaW50IHJldDsKKworCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2lkdGggPSBBTElHTihpbWFnZS0+d2lkdGgsIDMyKTsKKwlkd29yZHMgPSAod2lkdGggKiBpbWFnZS0+aGVpZ2h0KSA+PiA1OworCisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4MTQsIDIpOworCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9UUlVFQ09MT1IgfHwKKwkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IpIHsKKwkJT1VUX1JJTkcgIChjaGFuLCBwYWxldHRlW2ltYWdlLT5iZ19jb2xvcl0gfCBtYXNrKTsKKwkJT1VUX1JJTkcgIChjaGFuLCBwYWxldHRlW2ltYWdlLT5mZ19jb2xvcl0gfCBtYXNrKTsKKwl9IGVsc2UgeworCQlPVVRfUklORyAgKGNoYW4sIGltYWdlLT5iZ19jb2xvcik7CisJCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPmZnX2NvbG9yKTsKKwl9CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4MzgsIDIpOworCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPndpZHRoKTsKKwlPVVRfUklORyAgKGNoYW4sIGltYWdlLT5oZWlnaHQpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODUwLCA0KTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPmR4KTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPmR5KTsKKworCXdoaWxlIChkd29yZHMpIHsKKwkJaW50IHB1c2ggPSBkd29yZHMgPiAyMDQ3ID8gMjA0NyA6IGR3b3JkczsKKworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIHB1c2ggKyAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZHdvcmRzIC09IHB1c2g7CisKKwkJQkVHSU5fTlZDMChjaGFuLCA2LCBOdlN1YjJELCAweDA4NjAsIHB1c2gpOworCQlPVVRfUklOR3AoY2hhbiwgZGF0YSwgcHVzaCk7CisJCWRhdGEgKz0gcHVzaDsKKwl9CisKKwlGSVJFX1JJTkcoY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnZjMF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvID0gbmZiZGV2LT5ub3V2ZWF1X2ZiLm52Ym87CisJaW50IHJldCwgZm9ybWF0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIDB4OTAyZCwgMHg5MDJkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWZvcm1hdCA9IDB4ZjM7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWZvcm1hdCA9IDB4Zjg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWZvcm1hdCA9IDB4ZTg7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXN3aXRjaCAoaW5mby0+dmFyLnRyYW5zcC5sZW5ndGgpIHsKKwkJY2FzZSAwOiAvKiBkZXB0aCAyNCAqLworCQljYXNlIDg6IC8qIGRlcHRoIDMyLCBqdXN0IHVzZSAyNC4uICovCisJCQlmb3JtYXQgPSAweGU2OworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogZGVwdGggMzAgKi8KKwkJCWZvcm1hdCA9IDB4ZDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgNjApOworCWlmIChyZXQpIHsKKwkJV0FSTl9PTigxKTsKKwkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMDAwLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDB4MDAwMDkwMmQpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMTA0LCAyKTsKKwlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMoY2hhbi0+bm90aWZpZXJfYm8tPmJvLm9mZnNldCkpOworCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhjaGFuLT5ub3RpZmllcl9iby0+Ym8ub2Zmc2V0KSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyOTAsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4ODgsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyYWMsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMyk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyYTAsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMHg1NSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4YzAsIDQpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA1ODAsIDIpOworCU9VVF9SSU5HICAoY2hhbiwgNCk7CisJT1VUX1JJTkcgIChjaGFuLCBmb3JtYXQpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMmU4LCAyKTsKKwlPVVRfUklORyAgKGNoYW4sIDIpOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDgwNCwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCBmb3JtYXQpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODAwLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODA4LCAzKTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDgxYywgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDg0MCwgNCk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDIwMCwgMTApOworCU9VVF9SSU5HICAoY2hhbiwgZm9ybWF0KTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgaW5mby0+Zml4LmxpbmVfbGVuZ3RoKTsKKwlPVVRfUklORyAgKGNoYW4sIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HICAoY2hhbiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcgIChjaGFuLCB1cHBlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKKwlPVVRfUklORyAgKGNoYW4sIGxvd2VyXzMyX2JpdHMobnZiby0+dm1hLm9mZnNldCkpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMjMwLCAxMCk7CisJT1VUX1JJTkcgIChjaGFuLCBmb3JtYXQpOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOworCU9VVF9SSU5HICAoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbmZvLT52YXIueXJlc192aXJ0dWFsKTsKKwlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMobnZiby0+dm1hLm9mZnNldCkpOworCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CisJRklSRV9SSU5HIChjaGFuKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmlmby5jCmluZGV4IDg5MGMyYjkuLmU2ZjkyYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZpZm8uYwpAQCAtMjUsNiArMjUsNDkgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKworc3RhdGljIHZvaWQgbnZjMF9maWZvX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworc3RydWN0IG52YzBfZmlmb19wcml2IHsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBsYXlsaXN0WzJdOworCWludCBjdXJfcGxheWxpc3Q7CisJc3RydWN0IG5vdXZlYXVfdm1hIHVzZXJfdm1hOworCWludCBzcG9vbl9ucjsKK307CisKK3N0cnVjdCBudmMwX2ZpZm9fY2hhbiB7CisJc3RydWN0IG5vdXZlYXVfYm8gKnVzZXI7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1mYzsKK307CisKK3N0YXRpYyB2b2lkCitudmMwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG52YzBfZmlmb19wcml2ICpwcml2ID0gcGZpZm8tPnByaXY7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdXI7CisJaW50IGksIHA7CisKKwljdXIgPSBwcml2LT5wbGF5bGlzdFtwcml2LT5jdXJfcGxheWxpc3RdOworCXByaXYtPmN1cl9wbGF5bGlzdCA9ICFwcml2LT5jdXJfcGxheWxpc3Q7CisKKwlmb3IgKGkgPSAwLCBwID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWlmICghKG52X3JkMzIoZGV2LCAweDMwMDQgKyAoaSAqIDgpKSAmIDEpKQorCQkJY29udGludWU7CisJCW52X3dvMzIoY3VyLCBwICsgMCwgaSk7CisJCW52X3dvMzIoY3VyLCBwICsgNCwgMHgwMDAwMDAwNCk7CisJCXAgKz0gODsKKwl9CisJcGluc3RtZW0tPmZsdXNoKGRldik7CisKKwludl93cjMyKGRldiwgMHgwMDIyNzAsIGN1ci0+dmluc3QgPj4gMTIpOworCW52X3dyMzIoZGV2LCAweDAwMjI3NCwgMHgwMWYwMDAwMCB8IChwID4+IDMpKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDAwMjI3YywgMHgwMDEwMDAwMCwgMHgwMDAwMDAwMCkpCisJCU5WX0VSUk9SKGRldiwgIlBGSUZPIC0gcGxheWxpc3QgdXBkYXRlIGZhaWxlZFxuIik7Cit9CiAKIHZvaWQKIG52YzBfZmlmb19kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC01NywxMiArMTAwLDEzNSBAQAogaW50CiBudmMwX2ZpZm9fY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBudmMwX2ZpZm9fcHJpdiAqcHJpdiA9IHBmaWZvLT5wcml2OworCXN0cnVjdCBudmMwX2ZpZm9fY2hhbiAqZmlmb2NoOworCXU2NCBpYl92aXJ0LCB1c2VyX3ZpbnN0OworCWludCByZXQ7CisKKwljaGFuLT5maWZvX3ByaXYgPSBremFsbG9jKHNpemVvZigqZmlmb2NoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuLT5maWZvX3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCWZpZm9jaCA9IGNoYW4tPmZpZm9fcHJpdjsKKworCS8qIGFsbG9jYXRlIHZyYW0gZm9yIGNvbnRyb2wgcmVncywgbWFwIGludG8gcG9sbGluZyBhcmVhICovCisJcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCAweDEwMDAsIDAsIFRUTV9QTF9GTEFHX1ZSQU0sCisJCQkgICAgIDAsIDAsIHRydWUsIHRydWUsICZmaWZvY2gtPnVzZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X2JvX3BpbihmaWZvY2gtPnVzZXIsIFRUTV9QTF9GTEFHX1ZSQU0pOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmZpZm9jaC0+dXNlcik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdXNlcl92aW5zdCA9IGZpZm9jaC0+dXNlci0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisKKwlyZXQgPSBub3V2ZWF1X2JvX21hcChmaWZvY2gtPnVzZXIpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ib191bnBpbihmaWZvY2gtPnVzZXIpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZmlmb2NoLT51c2VyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlub3V2ZWF1X3ZtX21hcF9hdCgmcHJpdi0+dXNlcl92bWEsIGNoYW4tPmlkICogMHgxMDAwLAorCQkJICBmaWZvY2gtPnVzZXItPmJvLm1lbS5tbV9ub2RlKTsKKworCWNoYW4tPnVzZXIgPSBpb3JlbWFwX3djKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpICsKKwkJCQlwcml2LT51c2VyX3ZtYS5vZmZzZXQgKyAoY2hhbi0+aWQgKiAweDEwMDApLAorCQkJCVBBR0VfU0laRSk7CisJaWYgKCFjaGFuLT51c2VyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWJfdmlydCA9IGNoYW4tPnB1c2hidWZfYmFzZSArIGNoYW4tPmRtYS5pYl9iYXNlICogNDsKKworCS8qIHplcm8gY2hhbm5lbCByZWdzICovCisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDQwLzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA0NC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwNDgvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDRjLzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA1MC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwNTgvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDVjLzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA2MC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwODgvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDhjLzQsIDApOworCisJLyogcmFtZmMgKi8KKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXdfZmFrZShkZXYsIGNoYW4tPnJhbWluLT5waW5zdCwKKwkJCQkgICAgICBjaGFuLT5yYW1pbi0+dmluc3QsIDB4MTAwLAorCQkJCSAgICAgIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJmZpZm9jaC0+cmFtZmMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4MDgsIGxvd2VyXzMyX2JpdHModXNlcl92aW5zdCkpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHgwYywgdXBwZXJfMzJfYml0cyh1c2VyX3ZpbnN0KSk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDEwLCAweDAwMDBmYWNlKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4MzAsIDB4ZmZmZmY5MDIpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHg0OCwgbG93ZXJfMzJfYml0cyhpYl92aXJ0KSk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDRjLCBkcm1fb3JkZXIoY2hhbi0+ZG1hLmliX21heCArIDEpIDw8IDE2IHwKKwkJCQkgICB1cHBlcl8zMl9iaXRzKGliX3ZpcnQpKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4NTQsIDB4MDAwMDAwMDIpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHg4NCwgMHgyMDQwMDAwMCk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDk0LCAweDMwMDAwMDAxKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4OWMsIDB4MDAwMDAxMDApOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHhhNCwgMHgxZjFmMWYxZik7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweGE4LCAweDFmMWYxZjFmKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4YWMsIDB4MDAwMDAwMWYpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHhiOCwgMHhmODAwMDAwMCk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweGY4LCAweDEwMDAzMDgwKTsgLyogMHgwMDIzMTAgKi8KKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4ZmMsIDB4MTAwMDAwMTApOyAvKiAweDAwMjM1MCAqLworCXBpbnN0bWVtLT5mbHVzaChkZXYpOworCisJbnZfd3IzMihkZXYsIDB4MDAzMDAwICsgKGNoYW4tPmlkICogOCksIDB4YzAwMDAwMDAgfAorCQkJCQkJKGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikpOworCW52X3dyMzIoZGV2LCAweDAwMzAwNCArIChjaGFuLT5pZCAqIDgpLCAweDAwMWYwMDAxKTsKKwludmMwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKGRldik7CiAJcmV0dXJuIDA7CisKK2Vycm9yOgorCXBmaWZvLT5kZXN0cm95X2NvbnRleHQoY2hhbik7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZAogbnZjMF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG52YzBfZmlmb19jaGFuICpmaWZvY2g7CisKKwludl9tYXNrKGRldiwgMHgwMDMwMDQgKyAoY2hhbi0+aWQgKiA4KSwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAyNjM0LCBjaGFuLT5pZCk7CisJaWYgKCFudl93YWl0KGRldiwgMHgwMDAyNjM0LCAweGZmZmZmZmZmLCBjaGFuLT5pZCkpCisJCU5WX1dBUk4oZGV2LCAiMHgyNjM0ICE9IGNoaWQ6IDB4JTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4MjYzNCkpOworCisJbnZjMF9maWZvX3BsYXlsaXN0X3VwZGF0ZShkZXYpOworCisJbnZfd3IzMihkZXYsIDB4MDAzMDAwICsgKGNoYW4tPmlkICogOCksIDB4MDAwMDAwMDApOworCisJaWYgKGNoYW4tPnVzZXIpIHsKKwkJaW91bm1hcChjaGFuLT51c2VyKTsKKwkJY2hhbi0+dXNlciA9IE5VTEw7CisJfQorCisJZmlmb2NoID0gY2hhbi0+Zmlmb19wcml2OworCWNoYW4tPmZpZm9fcHJpdiA9IE5VTEw7CisJaWYgKCFmaWZvY2gpCisJCXJldHVybjsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZmlmb2NoLT5yYW1mYyk7CisJaWYgKGZpZm9jaC0+dXNlcikgeworCQlub3V2ZWF1X2JvX3VubWFwKGZpZm9jaC0+dXNlcik7CisJCW5vdXZlYXVfYm9fdW5waW4oZmlmb2NoLT51c2VyKTsKKwkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmZpZm9jaC0+dXNlcik7CisJfQorCWtmcmVlKGZpZm9jaCk7CiB9CiAKIGludApAQCAtNzcsMTQgKzI0MywyMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK252YzBfZmlmb19kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBudmMwX2ZpZm9fcHJpdiAqcHJpdjsKKworCXByaXYgPSBwZmlmby0+cHJpdjsKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKworCW5vdXZlYXVfdm1fcHV0KCZwcml2LT51c2VyX3ZtYSk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5wbGF5bGlzdFsxXSk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5wbGF5bGlzdFswXSk7CisJa2ZyZWUocHJpdik7Cit9CisKIHZvaWQKIG52YzBfZmlmb190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW52X3dyMzIoZGV2LCAweDAwMjE0MCwgMHgwMDAwMDAwMCk7CisJbnZjMF9maWZvX2Rlc3Ryb3koZGV2KTsKK30KKworc3RhdGljIGludAorbnZjMF9maWZvX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3QgbnZjMF9maWZvX3ByaXYgKnByaXY7CisJaW50IHJldDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcGZpZm8tPnByaXYgPSBwcml2OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHgxMDAwLCAweDEwMDAsIDAsCisJCQkJICZwcml2LT5wbGF5bGlzdFswXSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDB4MTAwMCwgMHgxMDAwLCAwLAorCQkJCSAmcHJpdi0+cGxheWxpc3RbMV0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X3ZtX2dldChkZXZfcHJpdi0+YmFyMV92bSwgcGZpZm8tPmNoYW5uZWxzICogMHgxMDAwLAorCQkJICAgICAxMiwgTlZfTUVNX0FDQ0VTU19SVywgJnByaXYtPnVzZXJfdm1hKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCA4LCBudmMwX2ZpZm9faXNyKTsKKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOyAvKiBudnN3ICovCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCW52YzBfZmlmb19kZXN0cm95KGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogaW50CiBudmMwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3QgbnZjMF9maWZvX3ByaXYgKnByaXY7CisJaW50IHJldCwgaTsKKworCWlmICghcGZpZm8tPnByaXYpIHsKKwkJcmV0ID0gbnZjMF9maWZvX2NyZWF0ZShkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcHJpdiA9IHBmaWZvLT5wcml2OworCisJLyogcmVzZXQgUEZJRk8sIGVuYWJsZSBhbGwgYXZhaWxhYmxlIFBTVUJGSUZPIGFyZWFzICovCisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMDAwMTAwLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAwMDAxMDAsIDB4MDAwMDAxMDApOworCW52X3dyMzIoZGV2LCAweDAwMDIwNCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMjA0LCAweGZmZmZmZmZmKTsKKworCXByaXYtPnNwb29uX25yID0gaHdlaWdodDMyKG52X3JkMzIoZGV2LCAweDAwMjIwNCkpOworCU5WX0RFQlVHKGRldiwgIlBGSUZPOiAlZCBzdWJmaWZvKHMpXG4iLCBwcml2LT5zcG9vbl9ucik7CisKKwkvKiBhc3NpZ24gZW5naW5lcyB0byBzdWJmaWZvcyAqLworCWlmIChwcml2LT5zcG9vbl9uciA+PSAzKSB7CisJCW52X3dyMzIoZGV2LCAweDAwMjIwOCwgfigxIDw8IDApKTsgLyogUEdSQVBIICovCisJCW52X3dyMzIoZGV2LCAweDAwMjIwYywgfigxIDw8IDEpKTsgLyogUFZQICovCisJCW52X3dyMzIoZGV2LCAweDAwMjIxMCwgfigxIDw8IDEpKTsgLyogUFBQICovCisJCW52X3dyMzIoZGV2LCAweDAwMjIxNCwgfigxIDw8IDEpKTsgLyogUEJTUCAqLworCQludl93cjMyKGRldiwgMHgwMDIyMTgsIH4oMSA8PCAyKSk7IC8qIFBDRTAgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDAyMjFjLCB+KDEgPDwgMSkpOyAvKiBQQ0UxICovCisJfQorCisJLyogUFNVQkZJRk9bbl0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCW52X21hc2soZGV2LCAweDA0MDEzYyArIChpICogMHgyMDAwKSwgMHgxMDAwMDEwMCwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDA0MDEwOCArIChpICogMHgyMDAwKSwgMHhmZmZmZmZmZik7IC8qIElOVFIgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDQwMTBjICsgKGkgKiAweDIwMDApLCAweGZmZmZmZWZmKTsgLyogSU5UUl9FTiAqLworCX0KKworCW52X21hc2soZGV2LCAweDAwMjIwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4MDAyMjU0LCAweDEwMDAwMDAwIHwgcHJpdi0+dXNlcl92bWEub2Zmc2V0ID4+IDEyKTsKKworCW52X3dyMzIoZGV2LCAweDAwMmEwMCwgMHhmZmZmZmZmZik7IC8qIGNsZWFycyBQRklGTy5JTlRSIGJpdCAzMCAqLworCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweGJmZmZmZmZmKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IG5vdXZlYXVfZW51bSBudmMwX2ZpZm9fZmF1bHRfdW5pdFtdID0geworCXsgMCwgIlBHUkFQSCIgfSwKKwl7IDMsICJQRUVQSE9MRSIgfSwKKwl7IDQsICJCQVIxIiB9LAorCXsgNSwgIkJBUjMiIH0sCisJeyA3LCAiUEZJRk8iIH0sCisJe30KK307CisKK3N0cnVjdCBub3V2ZWF1X2VudW0gbnZjMF9maWZvX2ZhdWx0X3JlYXNvbltdID0geworCXsgMCwgIlBUX05PVF9QUkVTRU5UIiB9LAorCXsgMSwgIlBUX1RPT19TSE9SVCIgfSwKKwl7IDIsICJQQUdFX05PVF9QUkVTRU5UIiB9LAorCXsgMywgIlZNX0xJTUlUX0VYQ0VFREVEIiB9LAorCXt9Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudmMwX2ZpZm9fc3ViZmlmb19pbnRyW10gPSB7CisvKgl7IDB4MDAwMDgwMDAsICIiIH0Jc2VlbiB3aXRoIG51bGwgaWIgcHVzaCAqLworCXsgMHgwMDIwMDAwMCwgIklMTEVHQUxfTVRIRCIgfSwKKwl7IDB4MDA4MDAwMDAsICJFTVBUWV9TVUJDIiB9LAorCXt9Cit9OworCitzdGF0aWMgdm9pZAorbnZjMF9maWZvX2lzcl92bV9mYXVsdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdW5pdCkKK3sKKwl1MzIgaW5zdCA9IG52X3JkMzIoZGV2LCAweDI4MDAgKyAodW5pdCAqIDB4MTApKTsKKwl1MzIgdmFsbyA9IG52X3JkMzIoZGV2LCAweDI4MDQgKyAodW5pdCAqIDB4MTApKTsKKwl1MzIgdmFoaSA9IG52X3JkMzIoZGV2LCAweDI4MDggKyAodW5pdCAqIDB4MTApKTsKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDI4MGMgKyAodW5pdCAqIDB4MTApKTsKKworCU5WX0lORk8oZGV2LCAiUEZJRk86ICVzIGZhdWx0IGF0IDB4JTAxMGxseCBbIiwKKwkJKHN0YXQgJiAweDAwMDAwMDgwKSA/ICJ3cml0ZSIgOiAicmVhZCIsICh1NjQpdmFoaSA8PCAzMiB8IHZhbG8pOworCW5vdXZlYXVfZW51bV9wcmludChudmMwX2ZpZm9fZmF1bHRfcmVhc29uLCBzdGF0ICYgMHgwMDAwMDAwZik7CisJcHJpbnRrKCJdIGZyb20gIik7CisJbm91dmVhdV9lbnVtX3ByaW50KG52YzBfZmlmb19mYXVsdF91bml0LCB1bml0KTsKKwlwcmludGsoIiBvbiBjaGFubmVsIDB4JTAxMGxseFxuIiwgKHU2NClpbnN0IDw8IDEyKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZmlmb19pc3Jfc3ViZmlmb19pbnRyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB1bml0KQoreworCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MDQwMTA4ICsgKHVuaXQgKiAweDIwMDApKTsKKwl1MzIgYWRkciA9IG52X3JkMzIoZGV2LCAweDA0MDBjMCArICh1bml0ICogMHgyMDAwKSk7CisJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgMHgwNDAwYzQgKyAodW5pdCAqIDB4MjAwMCkpOworCXUzMiBjaGlkID0gbnZfcmQzMihkZXYsIDB4MDQwMTIwICsgKHVuaXQgKiAweDIwMDApKSAmIDB4N2Y7CisJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApOworCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAzZmZjKTsKKworCU5WX0lORk8oZGV2LCAiUFNVQkZJRk8gJWQ6IiwgdW5pdCk7CisJbm91dmVhdV9iaXRmaWVsZF9wcmludChudmMwX2ZpZm9fc3ViZmlmb19pbnRyLCBzdGF0KTsKKwlOVl9JTkZPKGRldiwgIlBTVUJGSUZPICVkOiBjaCAlZCBzdWJjICVkIG10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQl1bml0LCBjaGlkLCBzdWJjLCBtdGhkLCBkYXRhKTsKKworCW52X3dyMzIoZGV2LCAweDA0MDBjMCArICh1bml0ICogMHgyMDAwKSwgMHg4MDYwMDAwOCk7CisJbnZfd3IzMihkZXYsIDB4MDQwMTA4ICsgKHVuaXQgKiAweDIwMDApLCBzdGF0KTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZmlmb19pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDAwMjEwMCk7CisKKwlpZiAoc3RhdCAmIDB4MTAwMDAwMDApIHsKKwkJdTMyIHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MDAyNTljKTsKKwkJdTMyIHUgPSB1bml0czsKKworCQl3aGlsZSAodSkgeworCQkJaW50IGkgPSBmZnModSkgLSAxOworCQkJbnZjMF9maWZvX2lzcl92bV9mYXVsdChkZXYsIGkpOworCQkJdSAmPSB+KDEgPDwgaSk7CisJCX0KKworCQludl93cjMyKGRldiwgMHgwMDI1OWMsIHVuaXRzKTsKKwkJc3RhdCAmPSB+MHgxMDAwMDAwMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MjAwMDAwMDApIHsKKwkJdTMyIHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MDAyNWEwKTsKKwkJdTMyIHUgPSB1bml0czsKKworCQl3aGlsZSAodSkgeworCQkJaW50IGkgPSBmZnModSkgLSAxOworCQkJbnZjMF9maWZvX2lzcl9zdWJmaWZvX2ludHIoZGV2LCBpKTsKKwkJCXUgJj0gfigxIDw8IGkpOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4MDAyNWEwLCB1bml0cyk7CisJCXN0YXQgJj0gfjB4MjAwMDAwMDA7CisJfQorCisJaWYgKHN0YXQpIHsKKwkJTlZfSU5GTyhkZXYsICJQRklGTzogdW5oYW5kbGVkIHN0YXR1cyAweCUwOHhcbiIsIHN0YXQpOworCQludl93cjMyKGRldiwgMHgwMDIxMDAsIHN0YXQpOworCX0KKworCW52X3dyMzIoZGV2LCAweDIxNDAsIDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jCmluZGV4IDcxN2E1MTcuLjVmZWFjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMKQEAgLTIyLDkgKzIyLDE2IEBACiAgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKICNpbmNsdWRlICJkcm1QLmgiCiAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJudmMwX2dyYXBoLmgiCisKK3N0YXRpYyB2b2lkIG52YzBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIGludCAgbnZjMF9ncmFwaF91bmxvYWRfY29udGV4dF90byhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgY2hhbik7CiAKIHZvaWQKIG52YzBfZ3JhcGhfZmlmb19hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVkKQpAQCAtMzcsMzkgKzQ0LDczNSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50CitudmMwX2dyYXBoX2NvbnN0cnVjdF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5wcml2OworCXN0cnVjdCBudmMwX2dyYXBoX2NoYW4gKmdyY2ggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IHJldCwgaTsKKwl1MzIgKmN0eDsKKworCWN0eCA9IGttYWxsb2MocHJpdi0+Z3JjdHhfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJbnZjMF9ncmFwaF9sb2FkX2NvbnRleHQoY2hhbik7CisKKwludl93bzMyKGdyY2gtPmdyY3R4LCAweDFjLCAxKTsKKwludl93bzMyKGdyY2gtPmdyY3R4LCAweDIwLCAwKTsKKwludl93bzMyKGdyY2gtPmdyY3R4LCAweDI4LCAwKTsKKwludl93bzMyKGdyY2gtPmdyY3R4LCAweDJjLCAwKTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKworCXJldCA9IG52YzBfZ3JjdHhfZ2VuZXJhdGUoY2hhbik7CisJaWYgKHJldCkgeworCQlrZnJlZShjdHgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG52YzBfZ3JhcGhfdW5sb2FkX2NvbnRleHRfdG8oZGV2LCBjaGFuLT5yYW1pbi0+dmluc3QpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoY3R4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Z3JjdHhfc2l6ZTsgaSArPSA0KQorCQljdHhbaSAvIDRdID0gbnZfcm8zMihncmNoLT5ncmN0eCwgaSk7CisKKwlwcml2LT5ncmN0eF92YWxzID0gY3R4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudmMwX2dyYXBoX2NyZWF0ZV9jb250ZXh0X21taW9fbGlzdChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucHJpdjsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9jaGFuICpncmNoID0gY2hhbi0+cGdyYXBoX2N0eDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCWludCBpID0gMCwgZ3BjLCB0cCwgcmV0OworCXUzMiBtYWdpYzsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDB4MjAwMCwgMjU2LCBOVk9CSl9GTEFHX1ZNLAorCQkJCSAmZ3JjaC0+dW5rNDA4MDA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHg4MDAwLCAyNTYsIE5WT0JKX0ZMQUdfVk0sCisJCQkJICZncmNoLT51bms0MDgwMGMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAzODQgKiAxMDI0LCA0MDk2LCBOVk9CSl9GTEFHX1ZNLAorCQkJCSAmZ3JjaC0+dW5rNDE4ODEwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHgxMDAwLCAwLCBOVk9CSl9GTEFHX1ZNLAorCQkJCSAmZ3JjaC0+bW1pbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA4MDA0KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIGdyY2gtPnVuazQwODAwNC0+dmluc3QgPj4gOCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA4MDA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4ODAwMDAwMTgpOworCisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA4MDBjKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIGdyY2gtPnVuazQwODAwYy0+dmluc3QgPj4gOCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA4MDEwKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4ODAwMDAwMDApOworCisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE4ODEwKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4ODAwMDAwMDAgfCBncmNoLT51bms0MTg4MTAtPnZpbnN0ID4+IDEyKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTk4NDgpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgxMDAwMDAwMCB8IGdyY2gtPnVuazQxODgxMC0+dmluc3QgPj4gMTIpOworCisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE5MDA0KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIGdyY2gtPnVuazQwODAwYy0+dmluc3QgPj4gOCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE5MDA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDAwMDAwMDApOworCisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE4ODA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIGdyY2gtPnVuazQwODAwNC0+dmluc3QgPj4gOCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDE4ODBjKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4ODAwMDAwMTgpOworCisJbWFnaWMgPSAweDAyMTgwMDAwOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQwNTgzMCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7CisJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyssIG1hZ2ljICs9IDB4MDJmYykgeworCQkJdTMyIHJlZyA9IDB4NTA0NTIwICsgKGdwYyAqIDB4ODAwMCkgKyAodHAgKiAweDA4MDApOworCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCByZWcpOworCQkJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCBtYWdpYyk7CisJCX0KKwl9CisKKwlncmNoLT5tbWlvX25yID0gaSAvIDI7CisJcmV0dXJuIDA7Cit9CisKIGludAogbnZjMF9ncmFwaF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gcGdyYXBoLT5wcml2OworCXN0cnVjdCBudmMwX2dyYXBoX2NoYW4gKmdyY2g7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdyY3R4OworCWludCByZXQsIGk7CisKKwljaGFuLT5wZ3JhcGhfY3R4ID0ga3phbGxvYyhzaXplb2YoKmdyY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4tPnBncmFwaF9jdHgpCisJCXJldHVybiAtRU5PTUVNOworCWdyY2ggPSBjaGFuLT5wZ3JhcGhfY3R4OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgcHJpdi0+Z3JjdHhfc2l6ZSwgMjU2LAorCQkJCSBOVk9CSl9GTEFHX1ZNIHwgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCSAmZ3JjaC0+Z3JjdHgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJY2hhbi0+cmFtaW5fZ3JjdHggPSBncmNoLT5ncmN0eDsKKwlncmN0eCA9IGdyY2gtPmdyY3R4OworCisJcmV0ID0gbnZjMF9ncmFwaF9jcmVhdGVfY29udGV4dF9tbWlvX2xpc3QoY2hhbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCW52X3dvMzIoY2hhbi0+cmFtaW4sIDB4MDIxMCwgbG93ZXJfMzJfYml0cyhncmN0eC0+dmluc3QpIHwgNCk7CisJbnZfd28zMihjaGFuLT5yYW1pbiwgMHgwMjE0LCB1cHBlcl8zMl9iaXRzKGdyY3R4LT52aW5zdCkpOworCXBpbnN0bWVtLT5mbHVzaChkZXYpOworCisJaWYgKCFwcml2LT5ncmN0eF92YWxzKSB7CisJCXJldCA9IG52YzBfZ3JhcGhfY29uc3RydWN0X2NvbnRleHQoY2hhbik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5ncmN0eF9zaXplOyBpICs9IDQpCisJCW52X3dvMzIoZ3JjdHgsIGksIHByaXYtPmdyY3R4X3ZhbHNbaSAvIDRdKTsKKworICAgICAgICBudl93bzMyKGdyY3R4LCAweGY0LCAwKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHhmOCwgMCk7CisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4MTAsIGdyY2gtPm1taW9fbnIpOworICAgICAgICBudl93bzMyKGdyY3R4LCAweDE0LCBsb3dlcl8zMl9iaXRzKGdyY2gtPm1taW8tPnZpbnN0KSk7CisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4MTgsIHVwcGVyXzMyX2JpdHMoZ3JjaC0+bW1pby0+dmluc3QpKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHgxYywgMSk7CisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4MjAsIDApOworICAgICAgICBudl93bzMyKGdyY3R4LCAweDI4LCAwKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHgyYywgMCk7CisJcGluc3RtZW0tPmZsdXNoKGRldik7CiAJcmV0dXJuIDA7CisKK2Vycm9yOgorCXBncmFwaC0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQKIG52YzBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CisJc3RydWN0IG52YzBfZ3JhcGhfY2hhbiAqZ3JjaDsKKworCWdyY2ggPSBjaGFuLT5wZ3JhcGhfY3R4OworCWNoYW4tPnBncmFwaF9jdHggPSBOVUxMOworCWlmICghZ3JjaCkKKwkJcmV0dXJuOworCisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncmNoLT5tbWlvKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyY2gtPnVuazQxODgxMCk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncmNoLT51bms0MDgwMGMpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3JjaC0+dW5rNDA4MDA0KTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyY2gtPmdyY3R4KTsKKwljaGFuLT5yYW1pbl9ncmN0eCA9IE5VTEw7CiB9CiAKIGludAogbnZjMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweDAwMDAwMDMwKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDAsIDB4ODAwMDAwMDAgfCBjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpOworCW52X3dyMzIoZGV2LCAweDQwOTUwNCwgMHgwMDAwMDAwMyk7CisJaWYgKCFudl93YWl0KGRldiwgMHg0MDk4MDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTApKQorCQlOVl9FUlJPUihkZXYsICJQR1JBUEg6IGxvYWRfY3R4IHRpbWVvdXRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252YzBfZ3JhcGhfdW5sb2FkX2NvbnRleHRfdG8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IGNoYW4pCit7CisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweDAwMDAwMDAzKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDAsIDB4ODAwMDAwMDAgfCBjaGFuID4+IDEyKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDQsIDB4MDAwMDAwMDkpOworCWlmICghbnZfd2FpdChkZXYsIDB4NDA5ODAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJQR1JBUEg6IHVubG9hZF9jdHggdGltZW91dFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIGludAogbnZjMF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXJldHVybiAwOworCXU2NCBpbnN0ID0gKHU2NCkobnZfcmQzMihkZXYsIDB4NDA5YjAwKSAmIDB4MGZmZmZmZmYpIDw8IDEyOworCXJldHVybiBudmMwX2dyYXBoX3VubG9hZF9jb250ZXh0X3RvKGRldiwgaW5zdCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyYXBoX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXY7CisKKwlwcml2ID0gcGdyYXBoLT5wcml2OworCWlmICghcHJpdikKKwkJcmV0dXJuOworCisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDEyKTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+dW5rNDE4OGI4KTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnVuazQxODhiNCk7CisKKwlpZiAocHJpdi0+Z3JjdHhfdmFscykKKwkJa2ZyZWUocHJpdi0+Z3JjdHhfdmFscyk7CisJa2ZyZWUocHJpdik7CiB9CiAKIHZvaWQKIG52YzBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwludmMwX2dyYXBoX2Rlc3Ryb3koZGV2KTsKK30KKworc3RhdGljIGludAorbnZjMF9ncmFwaF9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXY7CisJaW50IHJldCwgZ3BjLCBpOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwZ3JhcGgtPnByaXYgPSBwcml2OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHgxMDAwLCAyNTYsIDAsICZwcml2LT51bms0MTg4YjQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDEwMDAsIDI1NiwgMCwgJnByaXYtPnVuazQxODhiOCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWZvciAoaSA9IDA7IGkgPCAweDEwMDA7IGkgKz0gNCkgeworCQludl93bzMyKHByaXYtPnVuazQxODhiNCwgaSwgMHgwMDAwMDAxMCk7CisJCW52X3dvMzIocHJpdi0+dW5rNDE4OGI4LCBpLCAweDAwMDAwMDEwKTsKKwl9CisKKwlwcml2LT5ncGNfbnIgID0gIG52X3JkMzIoZGV2LCAweDQwOTYwNCkgJiAweDAwMDAwMDFmOworCXByaXYtPnJvcF9uciA9IChudl9yZDMyKGRldiwgMHg0MDk2MDQpICYgMHgwMDFmMDAwMCkgPj4gMTY7CisJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7CisJCXByaXYtPnRwX25yW2dwY10gPSBudl9yZDMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDI2MDgpKTsKKwkJcHJpdi0+dHBfdG90YWwgKz0gcHJpdi0+dHBfbnJbZ3BjXTsKKwl9CisKKwkvKlhYWDogdGhlc2UgbmVlZCBmaWd1cmluZyBvdXQuLi4gKi8KKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweGMwOgorCQlpZiAocHJpdi0+dHBfdG90YWwgPT0gMTEpIHsgLyogNDY1LCAzLzQvNC8wLCA0ICovCisJCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwNzsKKwkJCS8qIGZpbGxlZCB2YWx1ZXMgdXAgdG8gdHBfdG90YWwsIHRoZSByZXN0IDAgKi8KKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzBdICAgPSAweDIyMTExMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbMV0gICA9IDB4MDAwMDAyMzM7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzNdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5MTggICAgICA9IDB4MDAwYmEyZTk7CisJCX0gZWxzZQorCQlpZiAocHJpdi0+dHBfdG90YWwgPT0gMTQpIHsgLyogNDcwLCAzLzMvNC80LCA1ICovCisJCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwNTsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzBdICAgPSAweDExMTEwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbMV0gICA9IDB4MDAyMzMyMjI7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzNdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5MTggICAgICA9IDB4MDAwOTI0OTM7CisJCX0gZWxzZQorCQlpZiAocHJpdi0+dHBfdG90YWwgPT0gMTUpIHsgLyogNDgwLCAzLzQvNC80LCA2ICovCisJCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwNjsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzBdICAgPSAweDExMTEwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbMV0gICA9IDB4MDMzMzIyMjI7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzNdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5MTggICAgICA9IDB4MDAwODg4ODk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweGMzOiAvKiA0NTAsIDQvMC8wLzAsIDIgKi8KKwkJcHJpdi0+bWFnaWNfbm90X3JvcF9uciA9IDB4MDM7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzBdICAgPSAweDAwMDAzMjEwOworCQlwcml2LT5tYWdpY2dwYzk4MFsxXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMl0gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzNdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzkxOCAgICAgID0gMHgwMDIwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAweGM0OiAvKiA0NjAsIDMvNC8wLzAsIDQgKi8KKwkJcHJpdi0+bWFnaWNfbm90X3JvcF9uciA9IDB4MDE7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzBdICAgPSAweDAyMzIxMTAwOworCQlwcml2LT5tYWdpY2dwYzk4MFsxXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMl0gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzNdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzkxOCAgICAgID0gMHgwMDEyNDkyNTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFwcml2LT5tYWdpY19ub3Rfcm9wX25yKSB7CisJCU5WX0VSUk9SKGRldiwgIlBHUkFQSDogdW5rbm93biBjb25maWc6ICVkLyVkLyVkLyVkLCAlZFxuIiwKKwkJCSBwcml2LT50cF9uclswXSwgcHJpdi0+dHBfbnJbMV0sIHByaXYtPnRwX25yWzJdLAorCQkJIHByaXYtPnRwX25yWzNdLCBwcml2LT5yb3BfbnIpOworCQkvKiB1c2UgMHhjMydzIHZhbHVlcy4uLiAqLworCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwMzsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MDAwMDMyMTA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzFdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTE4ICAgICAgPSAweDAwMjAwMDAwOworCX0KKworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52YzBfZ3JhcGhfaXNyKTsKKwlOVk9CSl9DTEFTUyhkZXYsIDB4OTAyZCwgR1IpOyAvKiAyRCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg5MDM5LCBHUik7IC8qIE0yTUYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4OTA5NywgR1IpOyAvKiAzRCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg5MGMwLCBHUik7IC8qIENPTVBVVEUgKi8KKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbnZjMF9ncmFwaF9kZXN0cm95KGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaW5pdF9vYmo0MTg4ODAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBwZ3JhcGgtPnByaXY7CisJaW50IGk7CisKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDg4MCksIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOGE0KSwgMHgwMDAwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4ODgpICsgKGkgKiA0KSwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YjQpLCBwcml2LT51bms0MTg4YjQtPnZpbnN0ID4+IDgpOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOGI4KSwgcHJpdi0+dW5rNDE4OGI4LT52aW5zdCA+PiA4KTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaW5pdF9yZWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDAwMDgwLCAweDAwMzA4M2MyKTsKKwludl93cjMyKGRldiwgMHg0MDAwODgsIDB4MDAwMDZmZTcpOworCW52X3dyMzIoZGV2LCAweDQwMDA4YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMDkwLCAweDAwMDAwMDMwKTsKKwludl93cjMyKGRldiwgMHg0MDAxM2MsIDB4MDEzOTAxZjcpOworCW52X3dyMzIoZGV2LCAweDQwMDE0MCwgMHgwMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAxNDgsIDB4MDAwMDAxMTApOworCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAxMzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDEyNCwgMHgwMDAwMDAwMik7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyYXBoX2luaXRfZ3BjXzAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJaW50IGdwYzsKKwkKKwkvLyAgICAgIFRQICAgICAgUk9QIFVOS1ZBTChtYWdpY19ub3Rfcm9wX25yKQorCS8vIDQ1MDogNC8wLzAvMCAyICAgICAgICAzCisJLy8gNDYwOiAzLzQvMC8wIDQgICAgICAgIDEKKwkvLyA0NjU6IDMvNC80LzAgNCAgICAgICAgNworCS8vIDQ3MDogMy8zLzQvNCA1ICAgICAgICA1CisJLy8gNDgwOiAzLzQvNC80IDYgICAgICAgIDYKKworCS8vIG1hZ2ljZ3BjOTE4CisJLy8gNDUwOiAwMDIwMDAwMCAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCS8vIDQ2MDogMDAxMjQ5MjUgMDAwMDAwMDAwMDAxMDAxMDAxMDAxMDAxMDAxMDAxMDEKKwkvLyA0NjU6IDAwMGJhMmU5IDAwMDAwMDAwMDAwMDEwMTExMDEwMDAxMDExMTAxMDAxCisJLy8gNDcwOiAwMDA5MjQ5MyAwMDAwMDAwMDAwMDAxMDAxMDAxMDAxMDAxMDAxMDAxMQorCS8vIDQ4MDogMDAwODg4ODkgMDAwMDAwMDAwMDAwMTAwMDEwMDAxMDAwMTAwMDEwMDEKKworCS8qIGZpbGxlZCB2YWx1ZXMgdXAgdG8gdHBfdG90YWwsIHJlbWFpbmRlciAwICovCisJLy8gNDUwOiAwMDAwMzIxMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMAorCS8vIDQ2MDogMDIzMjExMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAKKwkvLyA0NjU6IDIyMTExMDAwIDAwMDAwMjMzIDAwMDAwMDAwIDAwMDAwMDAwCisJLy8gNDcwOiAxMTExMDAwMCAwMDIzMzIyMiAwMDAwMDAwMCAwMDAwMDAwMAorCS8vIDQ4MDogMTExMTAwMDAgMDMzMzIyMjIgMDAwMDAwMDAgMDAwMDAwMDAKKwkKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDk4MCksIHByaXYtPm1hZ2ljZ3BjOTgwWzBdKTsKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDk4NCksIHByaXYtPm1hZ2ljZ3BjOTgwWzFdKTsKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDk4OCksIHByaXYtPm1hZ2ljZ3BjOTgwWzJdKTsKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDk4YyksIHByaXYtPm1hZ2ljZ3BjOTgwWzNdKTsKKworCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgeworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDA5MTQpLCBwcml2LT5tYWdpY19ub3Rfcm9wX25yIDw8IDggfAorCQkJCQkJICBwcml2LT50cF9ucltncGNdKTsKKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgwOTEwKSwgMHgwMDA0MDAwMCB8IHByaXYtPnRwX3RvdGFsKTsKKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgwOTE4KSwgcHJpdi0+bWFnaWNncGM5MTgpOworCX0KKworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgxYmQ0KSwgcHJpdi0+bWFnaWNncGM5MTgpOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOGFjKSwgcHJpdi0+cm9wX25yKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaW5pdF91bml0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDQwOWMyNCwgMHgwMDBmMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDAwLCAweGMwMDAwMDAwKTsgLyogRElTUEFUQ0ggKi8KKwludl93cjMyKGRldiwgMHg0MDQ2MDAsIDB4YzAwMDAwMDApOyAvKiBNMk1GICovCisJbnZfd3IzMihkZXYsIDB4NDA4MDMwLCAweGMwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDYwMWMsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQ5MCwgMHhjMDAwMDAwMCk7IC8qIE1BQ1JPICovCisJbnZfd3IzMihkZXYsIDB4NDA2MDE4LCAweGMwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4NDAsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTg0NCwgMHgwMGZmZmZmZik7CisJbnZfbWFzayhkZXYsIDB4NDE5Y2MwLCAweDAwMDAwMDA4LCAweDAwMDAwMDA4KTsKKwludl9tYXNrKGRldiwgMHg0MTllYjQsIDB4MDAwMDEwMDAsIDB4MDAwMDEwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmFwaF9pbml0X2dwY18xKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5wcml2OworCWludCBncGMsIHRwOworCisJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MDQyMCksIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDA5MDApLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgxMDI4KSwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MDgyNCksIDB4YzAwMDAwMDApOworCQlmb3IgKHRwID0gMDsgdHAgPCBwcml2LT50cF9ucltncGNdOyB0cCsrKSB7CisJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDUwOCksIDB4ZmZmZmZmZmYpOworCQkJbnZfd3IzMihkZXYsIFRQX1VOSVQoZ3BjLCB0cCwgMHg1MGMpLCAweGZmZmZmZmZmKTsKKwkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4MjI0KSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDQ4YyksIDB4YzAwMDAwMDApOworCQkJbnZfd3IzMihkZXYsIFRQX1VOSVQoZ3BjLCB0cCwgMHgwODQpLCAweGMwMDAwMDAwKTsKKwkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4ZTQ0KSwgMHgwMDFmZmZmZSk7CisJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweGU0YyksIDB4MDAwMDAwMGYpOworCQl9CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MmM5MCksIDB4ZmZmZmZmZmYpOworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDJjOTQpLCAweGZmZmZmZmZmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyYXBoX2luaXRfcm9wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5wcml2OworCWludCByb3A7CisKKwlmb3IgKHJvcCA9IDA7IHJvcCA8IHByaXYtPnJvcF9ucjsgcm9wKyspIHsKKwkJbnZfd3IzMihkZXYsIFJPUF9VTklUKHJvcCwgMHgxNDQpLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIFJPUF9VTklUKHJvcCwgMHgwNzApLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIFJPUF9VTklUKHJvcCwgMHgyMDQpLCAweGZmZmZmZmZmKTsKKwkJbnZfd3IzMihkZXYsIFJPUF9VTklUKHJvcCwgMHgyMDgpLCAweGZmZmZmZmZmKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK252YzBfZnVjX2xvYWRfZncoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGZ1Y19iYXNlLAorCQkgY29uc3QgY2hhciAqY29kZV9mdywgY29uc3QgY2hhciAqZGF0YV9mdykKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNoYXIgbmFtZVszMl07CisJaW50IHJldCwgaTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm5vdXZlYXUvJXMiLCBkYXRhX2Z3KTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgJmRldi0+cGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImZhaWxlZCB0byBsb2FkICVzXG4iLCBkYXRhX2Z3KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwludl93cjMyKGRldiwgZnVjX2Jhc2UgKyAweDAxYzAsIDB4MDEwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZSAvIDQ7IGkrKykKKwkJbnZfd3IzMihkZXYsIGZ1Y19iYXNlICsgMHgwMWM0LCAoKHUzMiAqKWZ3LT5kYXRhKVtpXSk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJub3V2ZWF1LyVzIiwgY29kZV9mdyk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZkZXYtPnBkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJmYWlsZWQgdG8gbG9hZCAlc1xuIiwgY29kZV9mdyk7CisJCXJldHVybiByZXQ7CisJfQorCisJbnZfd3IzMihkZXYsIGZ1Y19iYXNlICsgMHgwMTgwLCAweDAxMDAwMDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgZnctPnNpemUgLyA0OyBpKyspIHsKKwkJaWYgKChpICYgMHgzZikgPT0gMCkKKwkJCW52X3dyMzIoZGV2LCBmdWNfYmFzZSArIDB4MDE4OCwgaSA+PiA2KTsKKwkJbnZfd3IzMihkZXYsIGZ1Y19iYXNlICsgMHgwMTg0LCAoKHUzMiAqKWZ3LT5kYXRhKVtpXSk7CisJfQorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252YzBfZ3JhcGhfaW5pdF9jdHhjdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJdTMyIHIwMDAyNjA7CisJaW50IHJldDsKKworCS8qIGxvYWQgZnVjIG1pY3JvY29kZSAqLworCXIwMDAyNjAgPSBudl9tYXNrKGRldiwgMHgwMDAyNjAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCXJldCA9IG52YzBfZnVjX2xvYWRfZncoZGV2LCAweDQwOTAwMCwgImZ1YzQwOWMiLCAiZnVjNDA5ZCIpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gbnZjMF9mdWNfbG9hZF9mdyhkZXYsIDB4NDFhMDAwLCAiZnVjNDFhYyIsICJmdWM0MWFkIik7CisJbnZfd3IzMihkZXYsIDB4MDAwMjYwLCByMDAwMjYwKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzdGFydCBib3RoIG9mIHRoZW0gcnVubmluZyAqLworCW52X3dyMzIoZGV2LCAweDQwOTg0MCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDFhMTBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDkxMGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxYTEwMCwgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4NDA5MTAwLCAweDAwMDAwMDAyKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDQwOTgwMCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSkpCisJCU5WX0lORk8oZGV2LCAiMHg0MDk4MDAgd2FpdCBmYWlsZWRcbiIpOworCisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDAsIDB4N2ZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwOTUwNCwgMHgwMDAwMDAyMSk7CisKKwludl93cjMyKGRldiwgMHg0MDk4NDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwOTUwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA5NTA0LCAweDAwMDAwMDEwKTsKKwlpZiAoIW52X3dhaXRfbmUoZGV2LCAweDQwOTgwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiZnVjMDkgcmVxIDB4MTAgdGltZW91dFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXByaXYtPmdyY3R4X3NpemUgPSBudl9yZDMyKGRldiwgMHg0MDk4MDApOworCisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwOTUwNCwgMHgwMDAwMDAxNik7CisJaWYgKCFudl93YWl0X25lKGRldiwgMHg0MDk4MDAsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgImZ1YzA5IHJlcSAweDE2IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW52X3dyMzIoZGV2LCAweDQwOTg0MCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDA5NTAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDQsIDB4MDAwMDAwMjUpOworCWlmICghbnZfd2FpdF9uZShkZXYsIDB4NDA5ODAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJmdWMwOSByZXEgMHgyNSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogaW50CiBudmMwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXY7CisJaW50IHJldDsKKwogCWRldl9wcml2LT5lbmdpbmUuZ3JhcGguYWNjZWxfYmxvY2tlZCA9IHRydWU7CisKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweGMwOgorCWNhc2UgMHhjMzoKKwljYXNlIDB4YzQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU5WX0VSUk9SKGRldiwgIlBHUkFQSDogdW5zdXBwb3J0ZWQgY2hpcHNldCwgcGxlYXNlIHJlcG9ydCFcbiIpOworCQlpZiAobm91dmVhdV9ub2FjY2VsICE9IDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDE4MDAxMDAwLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MTgwMDEwMDAsIDB4MTgwMDEwMDApOworCisJaWYgKCFwZ3JhcGgtPnByaXYpIHsKKwkJcmV0ID0gbnZjMF9ncmFwaF9jcmVhdGUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXByaXYgPSBwZ3JhcGgtPnByaXY7CisKKwludmMwX2dyYXBoX2luaXRfb2JqNDE4ODgwKGRldik7CisJbnZjMF9ncmFwaF9pbml0X3JlZ3MoZGV2KTsKKwkvL252YzBfZ3JhcGhfaW5pdF91bml0cGxlbWVudGVkX21hZ2ljcyhkZXYpOworCW52YzBfZ3JhcGhfaW5pdF9ncGNfMChkZXYpOworCS8vbnZjMF9ncmFwaF9pbml0X3VuaXRwbGVtZW50ZWRfYzI0MihkZXYpOworCisJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDAxMDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDEzYywgMHhmZmZmZmZmZik7CisKKwludmMwX2dyYXBoX2luaXRfdW5pdHMoZGV2KTsKKwludmMwX2dyYXBoX2luaXRfZ3BjXzEoZGV2KTsKKwludmMwX2dyYXBoX2luaXRfcm9wKGRldik7CisKKwludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDEzOCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTE4LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxMzAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDExYywgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTM0LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAwNTQsIDB4MzRjZTM0NjQpOworCisJcmV0ID0gbnZjMF9ncmFwaF9pbml0X2N0eGN0bChkZXYpOworCWlmIChyZXQgPT0gMCkKKwkJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5hY2NlbF9ibG9ja2VkID0gZmFsc2U7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK252YzBfZ3JhcGhfaXNyX2NoaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IGluc3QpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKKwkJY2hhbiA9IGRldl9wcml2LT5jaGFubmVscy5wdHJbaV07CisJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW4pCisJCQljb250aW51ZTsKKworCQlpZiAoaW5zdCA9PSBjaGFuLT5yYW1pbi0+dmluc3QpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTY0IGluc3QgPSAodTY0KShudl9yZDMyKGRldiwgMHg0MDliMDApICYgMHgwZmZmZmZmZikgPDwgMTI7CisJdTMyIGNoaWQgPSBudmMwX2dyYXBoX2lzcl9jaGlkKGRldiwgaW5zdCk7CisJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHg0MDAxMDApOworCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIDB4NDAwNzA0KTsKKwl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwM2ZmYyk7CisJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApID4+IDE2OworCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIDB4NDAwNzA4KTsKKwl1MzIgY29kZSA9IG52X3JkMzIoZGV2LCAweDQwMDExMCk7CisJdTMyIGNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDA0MjAwICsgKHN1YmMgKiA0KSk7CisKKwlpZiAoc3RhdCAmIDB4MDAwMDAwMTApIHsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IElMTEVHQUxfTVRIRCBjaCAlZCBbMHglMDEwbGx4XSBzdWJjICVkICIKKwkJCSAgICAgImNsYXNzIDB4JTA0eCBtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCWNoaWQsIGluc3QsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMDAwMDEwKTsKKwkJc3RhdCAmPSB+MHgwMDAwMDAxMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MDAwMDAwMjApIHsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IElMTEVHQUxfQ0xBU1MgY2ggJWQgWzB4JTAxMGxseF0gc3ViYyAlZCAiCisJCQkgICAgICJjbGFzcyAweCUwNHggbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCQljaGlkLCBpbnN0LCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgMHgwMDAwMDAyMCk7CisJCXN0YXQgJj0gfjB4MDAwMDAwMjA7CisJfQorCisJaWYgKHN0YXQgJiAweDAwMTAwMDAwKSB7CisJCU5WX0lORk8oZGV2LCAiUEdSQVBIOiBEQVRBX0VSUk9SIFsiKTsKKwkJbm91dmVhdV9lbnVtX3ByaW50KG52NTBfZGF0YV9lcnJvcl9uYW1lcywgY29kZSk7CisJCXByaW50aygiXSBjaCAlZCBbMHglMDEwbGx4XSBzdWJjICVkIGNsYXNzIDB4JTA0eCAiCisJCSAgICAgICAibXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCSAgICAgICBjaGlkLCBpbnN0LCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgMHgwMDEwMDAwMCk7CisJCXN0YXQgJj0gfjB4MDAxMDAwMDA7CisJfQorCisJaWYgKHN0YXQgJiAweDAwMjAwMDAwKSB7CisJCXUzMiB0cmFwID0gbnZfcmQzMihkZXYsIDB4NDAwMTA4KTsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IFRSQVAgY2ggJWQgc3RhdHVzIDB4JTA4eFxuIiwgY2hpZCwgdHJhcCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgdHJhcCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgMHgwMDIwMDAwMCk7CisJCXN0YXQgJj0gfjB4MDAyMDAwMDA7CisJfQorCisJaWYgKHN0YXQgJiAweDAwMDgwMDAwKSB7CisJCXUzMiB1c3RhdCA9IG52X3JkMzIoZGV2LCAweDQwOWMxOCk7CisKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IENUWENUUkwgdXN0YXQgMHglMDh4XG4iLCB1c3RhdCk7CisKKwkJbnZfd3IzMihkZXYsIDB4NDA5YzIwLCB1c3RhdCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgMHgwMDA4MDAwMCk7CisJCXN0YXQgJj0gfjB4MDAwODAwMDA7CisJfQorCisJaWYgKHN0YXQpIHsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IHVua25vd24gc3RhdCAweCUwOHhcbiIsIHN0YXQpOworCQludl93cjMyKGRldiwgMHg0MDAxMDAsIHN0YXQpOworCX0KKworCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAxMDAwMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlMjZmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpZm5kZWYgX19OVkMwX0dSQVBIX0hfXworI2RlZmluZSBfX05WQzBfR1JBUEhfSF9fCisKKyNkZWZpbmUgR1BDX01BWCA0CisjZGVmaW5lIFRQX01BWCAzMgorCisjZGVmaW5lIFJPUF9CQ0FTVChyKSAgICgweDQwODgwMCArIChyKSkKKyNkZWZpbmUgUk9QX1VOSVQodSxyKSAgKDB4NDEwMDAwICsgKHUpICogMHg0MDAgKyAocikpCisjZGVmaW5lIEdQQ19CQ0FTVChyKSAgICgweDQxODAwMCArIChyKSkKKyNkZWZpbmUgR1BDX1VOSVQodCxyKSAgKDB4NTAwMDAwICsgKHQpICogMHg4MDAwICsgKHIpKQorI2RlZmluZSBUUF9VTklUKHQsbSxyKSAoMHg1MDQwMDAgKyAodCkgKiAweDgwMDAgKyAobSkgKiAweDgwMCArIChyKSkKKworc3RydWN0IG52YzBfZ3JhcGhfcHJpdiB7CisJdTggZ3BjX25yOworCXU4IHJvcF9ucjsKKwl1OCB0cF9ucltHUENfTUFYXTsKKwl1OCB0cF90b3RhbDsKKworCXUzMiAgZ3JjdHhfc2l6ZTsKKwl1MzIgKmdyY3R4X3ZhbHM7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp1bms0MTg4YjQ7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp1bms0MTg4Yjg7CisKKwl1OCAgbWFnaWNfbm90X3JvcF9ucjsKKwl1MzIgbWFnaWNncGM5ODBbNF07CisJdTMyIG1hZ2ljZ3BjOTE4OworfTsKKworc3RydWN0IG52YzBfZ3JhcGhfY2hhbiB7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncmN0eDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnVuazQwODAwNDsgLy8gMHg0MTg4MTAgdG9vCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp1bms0MDgwMGM7IC8vIDB4NDE5MDA0IHRvbworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdW5rNDE4ODEwOyAvLyAweDQxOTg0OCB0b28KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm1taW87CisJaW50IG1taW9fbnI7Cit9OworCitpbnQgbnZjMF9ncmN0eF9nZW5lcmF0ZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JjdHguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JjdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWU2OGIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jCkBAIC0wLDAgKzEsMjg3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorI2luY2x1ZGUgIm52YzBfZ3JhcGguaCIKKworc3RhdGljIHZvaWQKK252X2ljbWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGljbWQsIHUzMiBkYXRhKQoreworCW52X3dyMzIoZGV2LCAweDQwMDIwNCwgZGF0YSk7CisJbnZfd3IzMihkZXYsIDB4NDAwMjAwLCBpY21kKTsKKwl3aGlsZSAobnZfcmQzMihkZXYsIDB4NDAwNzAwKSAmIDIpIHt9Cit9CisKK3N0YXRpYyB2b2lkCitudl9tdGhkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCW52X3dyMzIoZGV2LCAweDQwNDQ4YywgZGF0YSk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDg4LCAweDgwMDAwMDAwIHwgKG10aGQgPDwgMTQpIHwgY2xhc3MpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV85MDk3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MDgsIDB4MDAwMDA0MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg0OCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODg4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4YzgsIDB4MDAwMDA0MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkwOCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTQ4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5ODgsIDB4MDAwMDA0MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDljOCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODBjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NGMsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg4YywgMHgwMDAwMDMwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGNjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MGMsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk0YywgMHgwMDAwMDMwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOThjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5Y2MsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgxMCwgMHgwMDAwMDBjZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg1NCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODk0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4ZDQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkxNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTU0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5OTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDlkNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODE4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg5OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGQ4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk1OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTk4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5ZDgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4ZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDllMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2MwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2U0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2E4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2NjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcxMCwgMHgwMDAxNDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzMwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NTAsIDB4MDAwMTQwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc3MCwgMHgwMDAxNDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzkwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YjAsIDB4MDAwMTQwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdkMCwgMHgwMDAxNDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2YwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjczNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzU0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NzQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc5NCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2I0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ZDQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdmNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2MwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2YwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjOTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2I0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2U0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2E4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2Q4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjN2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNiYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2NjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2ZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRiOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkM2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkOWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY3OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmM2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmOTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZiOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmOTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMjAwLCAweDAwMDAwMDIyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIyMTAsIDB4MDAwMDAwMjIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjIyMCwgMHgwMDAwMDAyMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMjMwLCAweDAwMDAwMDIyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIyNDAsIDB4MDAwMDAwMjIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjAwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDQwLCAweDAwMDAwMDExKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwODAsIDB4MDAwMDAwMjApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjBjMCwgMHgwMDAwMDAzMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMTAwLCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxNDAsIDB4MDAwMDAwNTEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjAwYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDRjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwOGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjBjYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMTBjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxNGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjAxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwOTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjBkMCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMTEwLCAweDAwMDAwMDAzKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxNTAsIDB4MDAwMDAwMDQpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2EwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2U0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2M4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2FjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDczOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4OTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhiYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5M2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOThjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjliOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjljNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjllOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYThjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiOTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2EwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2QwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2M0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2Y0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM3OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjOTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2I4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2U4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMwYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzFjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMmMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMzYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzRjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNWMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM2YywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzdjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjOGMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM5YywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2FjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYmMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNjYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2RjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZWMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNmYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDAwLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMDgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQxMCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDE4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMjAsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQyOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDMwLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMzgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQwNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDBjLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMTQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQxYywgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDI0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMmMsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQzNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDNjLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUwNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTE0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMjQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUzNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTQ0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNTQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU2NCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTc0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlODQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU5NCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWE0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYjQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVjNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWQ0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZTQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVmNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTA4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMTgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUyOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTM4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNDgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU1OCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTY4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNzgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU4OCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTk4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYTgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGViOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWM4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZDgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVlOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWY4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTAwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMjAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU0MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTYwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlODAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVhMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWMwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUwNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTI0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNDQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU2NCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTg0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVjNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWU0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMDgsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUyOCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTQ4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNjgsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU4OCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWE4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYzgsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVlOCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTBjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMmMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU0YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTZjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlOGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVhYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWNjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZWMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUxMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTMwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU3MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTkwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYjAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVkMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWYwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMTQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUzNCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTU0LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNzQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU5NCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWI0LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZDQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVmNCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTE4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMzgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU1OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTc4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlOTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWViOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWQ4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZjgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ3OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0OTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1OTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzViMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzViYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNjgsIDB4MDAwMGZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTIxYywgMHgwZmFjNjg4MSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmFjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MzgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZTgsIDB4MDAwMDAwMTQpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZlYywgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTIyOCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMjJjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyMzAsIDB4MDAwMTAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWI0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1ZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNmI0LCAweDAwMDAwMDAzKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmYmMsIDB4MDAwMGZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZjMCwgMHgwMDAwZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmM0LCAweDAwMDBmZmZmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmYzgsIDB4MDAwMGZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk3MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjFjLCAweDAwMDAwOWYwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkY2MsIDB4MDAwMDAwMTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTYzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNjAsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE2NCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTY4LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNmMsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE3MCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTc0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNzgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE3YywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTgwLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExODQsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE4OCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMThjLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExOTAsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE5NCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTk4LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExOWMsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFhMCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWE0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYTgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFhYywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWIwLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYjQsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFiOCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWJjLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYzAsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFjNCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWM4LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExY2MsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFkMCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWQ0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExZDgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFkYywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxODgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxODhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxODk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThiOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3YzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2QwLCAweDAwMDAwMGZmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3ZDQsIDB4ZmZmZmZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdkOCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2RjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1ZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNDM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0MzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGVjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMxOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTEyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTEyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTEwLCAweDAwMDAwMjkwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY1YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxM2IwLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzYjQsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDIwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjcwLCAweDMwMjAxMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NzQsIDB4NzA2MDUwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY3OCwgMHhiOGE4OTg4OCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjdjLCAweGY4ZThkOGM4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY4MCwgMHgwMGZmZmYwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmQwLCAweDAwMDAwMDAzKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyZDQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkYWMsIDB4MDAwMDFiMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRiMCwgMHgwMDAwMWIwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTViYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTExMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMjM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJhYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMmM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMDAsIDB4MDAwMDAwMTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTBmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMjkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyMTgsIDB4MDAwMDAwMTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmRjLCAweDAwMDAwMDEwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkOTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1NjQsIDB4MDAwMDFmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1N2MsIDB4MDAzZmZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2MTAsIDB4MDAwMDAwMTIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTYwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2MmMsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDIxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMjQsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMyOCwgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzJjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMzAsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMzNCwgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzM4LCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc2MCwgMHgzOTI5MTkwOSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzY0LCAweDc5Njk1OTQ5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NjgsIDB4YjlhOTk5ODkpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc2YywgMHhmOWU5ZDljOSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzcwLCAweDMwMjAxMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NzQsIDB4NzA2MDUwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc3OCwgMHgwMDAwOTA4MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzgwLCAweDM5MjkxOTA5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ODQsIDB4Nzk2OTU5NDkpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc4OCwgMHhiOWE5OTk4OSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzhjLCAweGY5ZTlkOWM5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ZDAsIDB4MzAyMDEwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdkNCwgMHg3MDYwNTA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2Q4LCAweDAwMDA5MDgwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzN2MsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI2MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTkxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTFjLCAweDAwMDAwOTAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5MjAsIDB4MDAwMDA0MDUpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMwOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTkyYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTNjLCAweDAwMDAyYzFjKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkN2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMmMwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5NjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU5MCwgMHgwMDAwMDAzZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2U4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2Y0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5NmMsIDB4MDAwMDAwMTEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDJkOCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTgwLCAweDAwMDAwMDgwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MDQsIDB4MDAwMDAwODApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzAwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzYTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzMTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzg0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzODgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM4YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzkwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzOTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1OTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU5OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTljLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1YTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVhNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmNTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmOWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMwYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzN2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMzYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzQwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNDQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM0OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzRjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNTAsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM1OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzMWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTljMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5YzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTljOCwgMHgwMDAwMTUwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTllMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWU0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ZTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTllYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWYwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ZjQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTlmOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWZjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5Y2MsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTViOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYTAwLCAweDAwMDAxMTExKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWEwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYTBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWExNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYTE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ2YywgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDcwLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwZjgsIDB4MDAwMDEwMTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUwOCwgMHg4MDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTBjLCAweDQwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMxOCwgMHgwMDAwMDAwOCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzFjLCAweDAwMDAwMDA4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkOWMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzRjLCAweDAwMDAwMDU1KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0MjAsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdiYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2MwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3YzQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAwOCwgMHgwMDAwMDAwOCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMDBjLCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMTAsIDB4MDAwMDAxMmMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ2MCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzVjLCAweDAwMDAwMDAzKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMTgsIDB4MDAwMDAwMjApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAxYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMDIwLCAweDAwMDAwMDIwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMjQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTQ0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNDQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM2MCwgMHgyMDE2NDAxMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzY0LCAweDAwMDAwMDIwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMjA0LCAweDAwMDAwMDA2KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDJjYywgMHgwMDNmZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMmQwLCAweDAwMDAwYzQ4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyMjAsIDB4MDAwMDAwMDUpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjk4LCAweDAwMzAwMDA4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyODQsIDB4MDQwMDAwODApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTQ1MCwgMHgwMDMwMDAwOCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNDU0LCAweDA0MDAwMDgwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyMTQsIDB4MDAwMDAwMDApOworCS8qIGluIHRyYWNlLCByaWdodCBhZnRlciAweDkwYzAsIG5vdCBoZXJlICovCisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDEwLCAweDgwMDAyMDA2KTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfOTAyZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIwMCwgMHgwMDAwMDBjZik7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjA0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMDgsIDB4MDAwMDAwMjApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIwYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMTQsIDB4MDAwMDAwODApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIxOCwgMHgwMDAwMDEwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjFjLCAweDAwMDAwMTAwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjMwLCAweDAwMDAwMGNmKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMzQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIzOCwgMHgwMDAwMDAyMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjNjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyNDQsIDB4MDAwMDAwODApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDI0OCwgMHgwMDAwMDEwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjRjLCAweDAwMDAwMTAwKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfOTAzOShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X210aGQoZGV2LCAweDkwMzksIDB4MDMwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMzEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDM5LCAweDAzMTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMzksIDB4MDMyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMjM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDM5LCAweDAyM2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMzksIDB4MDMxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMzFjLCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfOTBjMChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MjcwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyNzJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDI3NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4Mjc2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyNzhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDI3YWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MjdjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyN2VjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDAzMGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MTk0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwNzU4LCAweDAwMDAwMTAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDAyYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDc5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwNzk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDA3OTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDc5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwN2EwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDA3N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDIwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwMjA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDAyMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDIxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwMjRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDBkOTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MTYwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgxNjBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDE2NjQsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV9kaXNwYXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJbnZfd3IzMihkZXYsIDB4NDA0MDA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAwYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAxOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDA0NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDk0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwOTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDA5YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBhOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBiNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBjMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGM0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYzgsIDB4ZjAwMDAwODcpOworCW52X3dyMzIoZGV2LCAweDQwNDBkNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGQ4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwZGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBlMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGU0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwZTgsIDB4MDAwMDEwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBmOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQxMzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDEzOCwgMHgyMDAwMDA0MCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTUwLCAweDAwMDAwMDJlKTsKKwludl93cjMyKGRldiwgMHg0MDQxNTQsIDB4MDAwMDA0MDApOworCW52X3dyMzIoZGV2LCAweDQwNDE1OCwgMHgwMDAwMDIwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTY0LCAweDAwMDAwMDU1KTsKKwludl93cjMyKGRldiwgMHg0MDQxNjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDE3NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTc4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQxN2MsIDB4MDAwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW52X3dyMzIoZGV2LCAweDQwNDIwMCArIChpICogNCksIDB4MDAwMDAwMDApOyAvKiBzdWJjICovCit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX21hY3JvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA0NDA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQwYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQxOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQzMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDM0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQ2MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDY0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0NjgsIDB4MDBmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwNDQ2YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDgwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDQ0OTgsIDB4MDAwMDAwMDEpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV9tMm1mKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA0NjA0LCAweDAwMDAwMDE1KTsKKwludl93cjMyKGRldiwgMHg0MDQ2MDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYwYywgMHgwMDAwMmUwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjEwLCAweDAwMDAwMTAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYxYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYyOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYzNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjM4LCAweDAwMDAwMDA0KTsKKwludl93cjMyKGRldiwgMHg0MDQ2M2MsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY0MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY0YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY1OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjVjLCAweDAwN2YwMTAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY2NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjY4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY3MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0Njc0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY3YywgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4NDA0NjgwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ODQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY4OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjhjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2OTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY5NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0Njk4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2OWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZhMCwgMHgwMDdmMDA4MCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmE0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZhYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZiOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZjNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmM4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2Y2MsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZkMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZkYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZlOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmYwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZjQsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms0N3h4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA0NzAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcxNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcyMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MzQsIDB4MDAwMDAxMDApOworCW52X3dyMzIoZGV2LCAweDQwNDczOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzNjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3NDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDc0NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzQ4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3NGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDc1MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzU0LCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfc2hhZGVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDQwNTgwMCwgMHgwNzgwMDBiZik7CisJbnZfd3IzMihkZXYsIDB4NDA1ODMwLCAweDAyMTgwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4MzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTgzOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODU0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4NzAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNTg3NCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODc4LCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDU4N2MsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNWEwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1YTA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDVhMTgsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms2MHh4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA2MDIwLCAweDAwMDEwM2MxKTsKKwludl93cjMyKGRldiwgMHg0MDYwMjgsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNjAyYywgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA2MDMwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDYwMzQsIDB4MDAwMDAwMDEpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms2NHh4KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA2NGE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDY0YWMsIDB4MDAwMDNmZmYpOworCW52X3dyMzIoZGV2LCAweDQwNjRiNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA2NGI4LCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfdHBidXMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDc4MDQsIDB4MDAwMDAwMjMpOworCW52X3dyMzIoZGV2LCAweDQwNzgwYywgMHgwYTQxODgyMCk7CisJbnZfd3IzMihkZXYsIDB4NDA3ODEwLCAweDA2MjA4MGU2KTsKKwludl93cjMyKGRldiwgMHg0MDc4MTQsIDB4MDIwMzk4YTQpOworCW52X3dyMzIoZGV2LCAweDQwNzgxOCwgMHgwZTYyOTA2Mik7CisJbnZfd3IzMihkZXYsIDB4NDA3ODFjLCAweDBhNDE4ODIwKTsKKwludl93cjMyKGRldiwgMHg0MDc4MjAsIDB4MDAwMDAwZTYpOworCW52X3dyMzIoZGV2LCAweDQwNzhiYywgMHgwMDAwMDEwMyk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX2NjYWNoZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDQwODAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA4MDA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDgwMDgsIDB4MDAwMDAwMTgpOworCW52X3dyMzIoZGV2LCAweDQwODAwYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA4MDEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDgwMTQsIDB4MDAwMDAwNjkpOworCW52X3dyMzIoZGV2LCAweDQwODAxOCwgMHhlMTAwZTEwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA4MDY0LCAweDAwMDAwMDAwKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfcm9wKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8vIFJPUENfQlJPQURDQVNUCisJbnZfd3IzMihkZXYsIDB4NDA4ODAwLCAweDAyODAyYTNjKTsKKwludl93cjMyKGRldiwgMHg0MDg4MDQsIDB4MDAwMDAwNDApOworCW52X3dyMzIoZGV2LCAweDQwODgwOCwgMHgwMDAzZTAwZCk7CisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHhjMDoKKwkJbnZfd3IzMihkZXYsIDB4NDA4OTAwLCAweDAwODBiODAxKTsKKwkJYnJlYWs7CisJY2FzZSAweGMzOgorCWNhc2UgMHhjNDoKKwkJbnZfd3IzMihkZXYsIDB4NDA4OTAwLCAweDMwODBiODAxKTsKKwkJYnJlYWs7CisJfQorCW52X3dyMzIoZGV2LCAweDQwODkwNCwgMHgwMjAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA4OTA4LCAweDAwYzgwOTI5KTsKKwludl93cjMyKGRldiwgMHg0MDg5MGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwODk4MCwgMHgwMDAwMDExZCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX2dwYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJLy8gR1BDX0JST0FEQ0FTVAorCW52X3dyMzIoZGV2LCAweDQxODM4MCwgMHgwMDAwMDAxNik7CisJbnZfd3IzMihkZXYsIDB4NDE4NDAwLCAweDM4MDA0ZTAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0MDQsIDB4NzFlMGZmZmYpOworCW52X3dyMzIoZGV2LCAweDQxODQwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDBjLCAweDAwMDAxMDA4KTsKKwludl93cjMyKGRldiwgMHg0MTg0MTAsIDB4MGZmZjBmZmYpOworCW52X3dyMzIoZGV2LCAweDQxODQxNCwgMHgwMDIwMGZmZik7CisJbnZfd3IzMihkZXYsIDB4NDE4NDUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0NTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODQ1OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDVjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0NjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODQ2NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDY4LCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MTg0NmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODQ3MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NjAwLCAweDAwMDAwMDFmKTsKKwludl93cjMyKGRldiwgMHg0MTg2ODQsIDB4MDAwMDAwMGYpOworCW52X3dyMzIoZGV2LCAweDQxODcwMCwgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4NDE4NzA0LCAweDAwMDAwMDgwKTsKKwludl93cjMyKGRldiwgMHg0MTg3MDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODcwYywgMHgwN2M4MDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NzEwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4MDAsIDB4MDAwNjg2MGEpOworCW52X3dyMzIoZGV2LCAweDQxODgwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4ODBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4MTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODgyOCwgMHgwMDAwODQ0Mik7CisJbnZfd3IzMihkZXYsIDB4NDE4ODMwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MTg4ZDgsIDB4MDAwMDAwMDgpOworCW52X3dyMzIoZGV2LCAweDQxODhlMCwgMHgwMTAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OGU4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4ZWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODhmMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OGY0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4ZjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODhmYywgMHgwMDEwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OTFjLCAweDAwZmYwMGZmKTsKKwludl93cjMyKGRldiwgMHg0MTg5MjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODkyOCwgMHgwMGZmZmYwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OTJjLCAweDAwMDBmZjAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCW52X3dyMzIoZGV2LCAweDQxOGEwMCArIChpICogMHgyMCksIDB4MDAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MThhMDQgKyAoaSAqIDB4MjApLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDE4YTA4ICsgKGkgKiAweDIwKSwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQxOGEwYyArIChpICogMHgyMCksIDB4MDAwMTAwMDApOworCQludl93cjMyKGRldiwgMHg0MThhMTAgKyAoaSAqIDB4MjApLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDE4YTE0ICsgKGkgKiAweDIwKSwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQxOGExOCArIChpICogMHgyMCksIDB4MDAwMDAwMDApOworCX0KKwludl93cjMyKGRldiwgMHg0MThiMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGIwOCwgMHgwYTQxODgyMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YjBjLCAweDA2MjA4MGU2KTsKKwludl93cjMyKGRldiwgMHg0MThiMTAsIDB4MDIwMzk4YTQpOworCW52X3dyMzIoZGV2LCAweDQxOGIxNCwgMHgwZTYyOTA2Mik7CisJbnZfd3IzMihkZXYsIDB4NDE4YjE4LCAweDBhNDE4ODIwKTsKKwludl93cjMyKGRldiwgMHg0MThiMWMsIDB4MDAwMDAwZTYpOworCW52X3dyMzIoZGV2LCAweDQxOGJiOCwgMHgwMDAwMDEwMyk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzA4LCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MThjMTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGMxNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MThjMWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGMyMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MThjMjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGMyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzgwLCAweDIwMjAwMDA0KTsKKwludl93cjMyKGRldiwgMHg0MThjOGMsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQxOTAwMCwgMHgwMDAwMDc4MCk7CisJbnZfd3IzMihkZXYsIDB4NDE5MDA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTkwMDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOTAxNCwgMHgwMDAwMDAwNCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX3RwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCS8vIEdQQ19CUk9BRENBU1QuVFBfQlJPQURDQVNUCisJbnZfd3IzMihkZXYsIDB4NDE5ODQ4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTk4NjQsIDB4MDAwMDAxMmEpOworCW52X3dyMzIoZGV2LCAweDQxOTg4OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5YTAwLCAweDAwMDAwMWYwKTsKKwludl93cjMyKGRldiwgMHg0MTlhMDQsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQxOWEwOCwgMHgwMDAwMDAyMyk7CisJbnZfd3IzMihkZXYsIDB4NDE5YTBjLCAweDAwMDIwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTlhMTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWExNCwgMHgwMDAwMDIwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5YTFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTlhMjAsIDB4MDAwMDA4MDApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGMwKQorCQludl93cjMyKGRldiwgMHgwMDQxOWFjNCwgMHgwMDA3ZjQ0MCk7IC8vIDB4YzMKKwludl93cjMyKGRldiwgMHg0MTliMDAsIDB4MGE0MTg4MjApOworCW52X3dyMzIoZGV2LCAweDQxOWIwNCwgMHgwNjIwODBlNik7CisJbnZfd3IzMihkZXYsIDB4NDE5YjA4LCAweDAyMDM5OGE0KTsKKwludl93cjMyKGRldiwgMHg0MTliMGMsIDB4MGU2MjkwNjIpOworCW52X3dyMzIoZGV2LCAweDQxOWIxMCwgMHgwYTQxODgyMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5YjE0LCAweDAwMDAwMGU2KTsKKwludl93cjMyKGRldiwgMHg0MTliZDAsIDB4MDA5MDAxMDMpOworCW52X3dyMzIoZGV2LCAweDQxOWJlMCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDE5YmU0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTljMDAsIDB4MDAwMDAwMDIpOworCW52X3dyMzIoZGV2LCAweDQxOWMwNCwgMHgwMDAwMDAwNik7CisJbnZfd3IzMihkZXYsIDB4NDE5YzA4LCAweDAwMDAwMDAyKTsKKwludl93cjMyKGRldiwgMHg0MTljMjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWNiYywgMHgyODEzNzYwNik7CisJbnZfd3IzMihkZXYsIDB4NDE5Y2U4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTljZjQsIDB4MDAwMDAxODMpOworCW52X3dyMzIoZGV2LCAweDQxOWQyMCwgMHgwMjE4MDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZDI0LCAweDAwMDAxZmZmKTsKKwludl93cjMyKGRldiwgMHg0MTllMDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWUwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllMTAsIDB4MDAwMDAwMDIpOworCW52X3dyMzIoZGV2LCAweDQxOWU0NCwgMHgwMDFiZWZmMik7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTQ4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNGMsIDB4MDAwMDAwMGYpOworCW52X3dyMzIoZGV2LCAweDQxOWU1MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTU0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU1YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTYwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU2OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTZjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU3NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTc4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllN2MsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU4MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTg0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllODgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU4YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTkwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllOTgsIDB4MDAwMDAwMDApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGMwKQorCQludl93cjMyKGRldiwgMHg0MTllZTAsIDB4MDAwMTExMTApOworCW52X3dyMzIoZGV2LCAweDQxOWY1MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZjU0LCAweDAwMDAwMDAwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHhjMCkKKwkJbnZfd3IzMihkZXYsIDB4NDE5ZjU4LCAweDAwMDAwMDAwKTsKK30KKworaW50CitudmMwX2dyY3R4X2dlbmVyYXRlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5wcml2OworCXN0cnVjdCBudmMwX2dyYXBoX2NoYW4gKmdyY2ggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IGksIGdwYywgdHAsIGlkOworCXUzMiByMDAwMjYwLCB0bXA7CisKKwlyMDAwMjYwID0gbnZfcmQzMihkZXYsIDB4MDAwMjYwKTsKKwludl93cjMyKGRldiwgMHgwMDAyNjAsIHIwMDAyNjAgJiB+MSk7CisJbnZfd3IzMihkZXYsIDB4NDAwMjA4LCAweDAwMDAwMDAwKTsKKworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfZGlzcGF0Y2goZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX21hY3JvKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV9tMm1mKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms0N3h4KGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV9zaGFkZXJzKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms2MHh4KGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV91bms2NHh4KGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV90cGJ1cyhkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfY2NhY2hlKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV9yb3AoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX2dwYyhkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfdHAoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDQwNDE1NCwgMHgwMDAwMDAwMCk7CisKKwkvKiBmdWMgIm1taW8gbGlzdCIgd3JpdGVzICovCisJZm9yIChpID0gMDsgaSA8IGdyY2gtPm1taW9fbnIgKiA4OyBpICs9IDgpIHsKKwkJdTMyIHJlZyA9IG52X3JvMzIoZ3JjaC0+bW1pbywgaSArIDApOworCQludl93cjMyKGRldiwgcmVnLCBudl9ybzMyKGdyY2gtPm1taW8sIGkgKyA0KSk7CisJfQorCisJZm9yICh0cCA9IDAsIGlkID0gMDsgdHAgPCA0OyB0cCsrKSB7CisJCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykgeworCQkJaWYgKHRwIDw9IHByaXYtPnRwX25yW2dwY10pIHsKKwkJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDY5OCksIGlkKTsKKwkJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDRlOCksIGlkKTsKKwkJCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDBjMTAgKyB0cCAqIDQpLCBpZCk7CisJCQkJbnZfd3IzMihkZXYsIFRQX1VOSVQoZ3BjLCB0cCwgMHgwODgpLCBpZCk7CisJCQkJaWQrKzsKKwkJCX0KKworCQkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgwYzA4KSwgcHJpdi0+dHBfbnJbZ3BjXSk7CisJCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDBjOGMpLCBwcml2LT50cF9ucltncGNdKTsKKwkJfQorCX0KKworCXRtcCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPmdwY19ucjsgaSsrKQorCQl0bXAgfD0gcHJpdi0+dHBfbnJbaV0gPDwgKGkgKiA0KTsKKwludl93cjMyKGRldiwgMHg0MDYwMjgsIHRtcCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODcwLCB0bXApOworCisJbnZfd3IzMihkZXYsIDB4NDA2MDJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4NzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNjAzMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODc4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDYwMzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTg3YywgMHgwMDAwMDAwMCk7CisKKwlpZiAoMSkgeworCQljb25zdCB1OCBjaGlwc2V0X3RwX21heFtdID0geyAxNiwgMCwgMCwgNCwgOCB9OworCQl1OCBtYXggPSBjaGlwc2V0X3RwX21heFtkZXZfcHJpdi0+Y2hpcHNldCAmIDB4MGZdOworCQl1OCB0cG5yW0dQQ19NQVhdOworCQl1OCBkYXRhWzMyXTsKKworCQltZW1jcHkodHBuciwgcHJpdi0+dHBfbnIsIHNpemVvZihwcml2LT50cF9ucikpOworCQltZW1zZXQoZGF0YSwgMHgxZiwgc2l6ZW9mKGRhdGEpKTsKKworCQlncGMgPSAtMTsKKwkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfdG90YWw7IHRwKyspIHsKKwkJCWRvIHsKKwkJCQlncGMgPSAoZ3BjICsgMSkgJSBwcml2LT5ncGNfbnI7CisJCQl9IHdoaWxlICghdHBucltncGNdKTsKKwkJCXRwbnJbZ3BjXS0tOworCQkJZGF0YVt0cF0gPSBncGM7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4IC8gNDsgaSsrKQorCQkJbnZfd3IzMihkZXYsIDB4NDA2MGE4ICsgKGkgKiA0KSwgKCh1MzIgKilkYXRhKVtpXSk7CisJfQorCisJaWYgKDEpIHsKKwkJdTMyIGRhdGFbNl0gPSB7fSwgZGF0YTJbMl0gPSB7fTsKKwkJdTggdHBucltHUENfTUFYXTsKKwkJdTggc2hpZnQsIG50cGN2OworCisJCS8qIGNhbGN1bGF0ZSBmaXJzdCBzZXQgb2YgbWFnaWNzICovCisJCW1lbWNweSh0cG5yLCBwcml2LT50cF9uciwgc2l6ZW9mKHByaXYtPnRwX25yKSk7CisKKwkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfdG90YWw7IHRwKyspIHsKKwkJCWRvIHsKKwkJCQlncGMgPSAoZ3BjICsgMSkgJSBwcml2LT5ncGNfbnI7CisJCQl9IHdoaWxlICghdHBucltncGNdKTsKKwkJCXRwbnJbZ3BjXS0tOworCisJCQlkYXRhW3RwIC8gNl0gfD0gZ3BjIDw8ICgodHAgJSA2KSAqIDUpOworCQl9CisKKwkJZm9yICg7IHRwIDwgMzI7IHRwKyspCisJCQlkYXRhW3RwIC8gNl0gfD0gNyA8PCAoKHRwICUgNikgKiA1KTsKKworCQkvKiBhbmQgdGhlIHNlY29uZC4uLiAqLworCQlzaGlmdCA9IDA7CisJCW50cGN2ID0gcHJpdi0+dHBfdG90YWw7CisJCXdoaWxlICghKG50cGN2ICYgKDEgPDwgNCkpKSB7CisJCQludHBjdiA8PD0gMTsKKwkJCXNoaWZ0Kys7CisJCX0KKworCQlkYXRhMlswXSAgPSAobnRwY3YgPDwgMTYpOworCQlkYXRhMlswXSB8PSAoc2hpZnQgPDwgMjEpOworCQlkYXRhMlswXSB8PSAoKCgxIDw8ICgwICsgNSkpICUgbnRwY3YpIDw8IDI0KTsKKwkJZm9yIChpID0gMTsgaSA8IDc7IGkrKykKKwkJCWRhdGEyWzFdIHw9ICgoMSA8PCAoaSArIDUpKSAlIG50cGN2KSA8PCAoKGkgLSAxKSAqIDUpOworCisJCS8vIEdQQ19CUk9BRENBU1QKKwkJbnZfd3IzMihkZXYsIDB4NDE4YmI4LCAocHJpdi0+dHBfdG90YWwgPDwgOCkgfAorCQkJCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW52X3dyMzIoZGV2LCAweDQxOGIwOCArIChpICogNCksIGRhdGFbaV0pOworCisJCS8vIEdQQ19CUk9BRENBU1QuVFBfQlJPQURDQVNUCisJCW52X3dyMzIoZGV2LCAweDQxOWJkMCwgKHByaXYtPnRwX3RvdGFsIDw8IDgpIHwKKwkJCQkgICAgICAgcHJpdi0+bWFnaWNfbm90X3JvcF9uciB8CisJCQkJICAgICAgIGRhdGEyWzBdKTsKKwkJbnZfd3IzMihkZXYsIDB4NDE5YmU0LCBkYXRhMlsxXSk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQludl93cjMyKGRldiwgMHg0MTliMDAgKyAoaSAqIDQpLCBkYXRhW2ldKTsKKworCQkvLyBVTks3OHh4CisJCW52X3dyMzIoZGV2LCAweDQwNzhiYywgKHByaXYtPnRwX3RvdGFsIDw8IDgpIHwKKwkJCQkJcHJpdi0+bWFnaWNfbm90X3JvcF9ucik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQludl93cjMyKGRldiwgMHg0MDc4MGMgKyAoaSAqIDQpLCBkYXRhW2ldKTsKKwl9CisKKwlpZiAoMSkgeworCQl1MzIgdHBfbWFzayA9IDAsIHRwX3NldCA9IDA7CisJCXU4ICB0cG5yW0dQQ19NQVhdOworCisJCW1lbWNweSh0cG5yLCBwcml2LT50cF9uciwgc2l6ZW9mKHByaXYtPnRwX25yKSk7CisJCWZvciAoZ3BjID0gMDsgZ3BjIDwgcHJpdi0+Z3BjX25yOyBncGMrKykKKwkJCXRwX21hc2sgfD0gKCgxIDw8IHByaXYtPnRwX25yW2dwY10pIC0gMSkgPDwgKGdwYyAqIDgpOworCisJCWdwYyA9IC0xOworCQlmb3IgKGkgPSAwLCBncGMgPSAtMTsgaSA8IDMyOyBpKyspIHsKKwkJCWludCBsdHAgPSBpICogKHByaXYtPnRwX3RvdGFsIC0gMSkgLyAzMjsKKwkJCQorCQkJZG8geworCQkJCWdwYyA9IChncGMgKyAxKSAlIHByaXYtPmdwY19ucjsKKwkJCX0gd2hpbGUgKCF0cG5yW2dwY10pOworCQkJdHAgPSBwcml2LT50cF9ucltncGNdIC0gdHBucltncGNdLS07CisKKwkJCXRwX3NldCB8PSAxIDw8ICgoZ3BjICogOCkgKyB0cCk7CisKKwkJCWRvIHsKKwkJCQludl93cjMyKGRldiwgMHg0MDY4MDAgKyAoaSAqIDB4MjApLCB0cF9zZXQpOworCQkJCXRwX3NldCBePSB0cF9tYXNrOworCQkJCW52X3dyMzIoZGV2LCAweDQwNmMwMCArIChpICogMHgyMCksIHRwX3NldCk7CisJCQkJdHBfc2V0IF49IHRwX21hc2s7CisJCQl9IHdoaWxlIChsdHAgPT0gKCsraSAqIChwcml2LT50cF90b3RhbCAtIDEpIC8gMzIpKTsKKwkJCWktLTsKKwkJfQorCX0KKworCW52X3dyMzIoZGV2LCAweDQwMDIwOCwgMHg4MDAwMDAwMCk7CisKKwludl9pY21kKGRldiwgMHgwMDAwMTAwMCwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYTksIDB4MDAwMGZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDM4LCAweDBmYWM2ODgxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDAzZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZTgsIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGU5LCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlYSwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZWIsIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGVjLCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlZCwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZWUsIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGVmLCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3OCwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNzksIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDdhLCAweDAwMDAwMzAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3YiwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwN2MsIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDdkLCAweDAwMDAwMzAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3ZSwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwN2YsIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDUwLCAweDAwMDAwMDExKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1OCwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNTksIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDVhLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1YiwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNWMsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDVkLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1ZSwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNWYsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjA4LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIwOSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMGEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjBiLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIwYywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMGQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjBlLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIwZiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwODEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDg1LCAweDAwMDAwMDA0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA4OCwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwOTAsIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDk4LCAweDAwMDAxMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZGEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGY4LCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBmYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwOWYsIDB4MDAwMGZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGEwLCAweDAwMDBmZmZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBhMSwgMHgwMDAwZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYTIsIDB4MDAwMGZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGIxLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGI0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGI3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGJhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGJkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGMwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGMzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGM2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGM5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwY2IsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGNjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwY2UsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGNmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQ1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQ4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTAsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjExLCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxMiwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTMsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjE0LCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxNSwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTYsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjE3LCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxOCwgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTksIDB4MDAwMGMwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjFhLCAweDAwMDBjMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxYiwgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMWMsIDB4MDAwMGMwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjFkLCAweDAwMDBjMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxZSwgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMWYsIDB4MDAwMGMwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGFkLCAweDAwMDAwMTNlKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlMSwgMHgwMDAwMDAxMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjkxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjk0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjk3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5OCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjlhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5YiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjlkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5ZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2IwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2IzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2I2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2I5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2JjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2JmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmEyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmE1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmE4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmFiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmFlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDIxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDI0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDI3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDJhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDJkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmIwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmIzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmI2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmI5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmJjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmJmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDMyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDM1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDM4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0M2EsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDNiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0M2QsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDNlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmMxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmM0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmM3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmNhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyY2MsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmNkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyY2YsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQ2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQ5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZGIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGRjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZGUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGRmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzIyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzI1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzI4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MmEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzJiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MmQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzJlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGMxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGM0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGM3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGNhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4Y2MsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGNkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4Y2YsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODkwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5MSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODkzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5NCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODk2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5NywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODk5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODljLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODlmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGUyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGU1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGU4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGViLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGVlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGExLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGE0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGE3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGFhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGFkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGYwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGYzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGY2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGY5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGZjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGZmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk0YywgMHgwMDAwMDBmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NGQsIDB4ZmZmZmZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTRlLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJlYywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMDMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmU2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ2NiwgMHgwMDAwMDA1Mik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMDEsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzA0LCAweDMwMjAxMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwNSwgMHg3MDYwNTA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMDYsIDB4YjhhODk4ODgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzA3LCAweGY4ZThkOGM4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwYSwgMHgwMGZmZmYwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMGIsIDB4MDAwMDAwMWEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzBjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMxOCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNDAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzc1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM1MSwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzN2QsIDB4MDAwMDAwMDYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2EwLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNhYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYTksIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzgwLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM2MCwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzY3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM2OCwgMHgwMDAwMWZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNzAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzcxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM3MiwgMHgwMDNmZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzN2EsIDB4MDAwMDAwMTIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNWUwLCAweDAwMDAwMDIyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDVlMSwgMHgwMDAwMDAyMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ZTIsIDB4MDAwMDAwMjIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNWUzLCAweDAwMDAwMDIyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDVlNCwgMHgwMDAwMDAyMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MTksIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODExLCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxMiwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MTMsIDB4MDAwMDAwMDYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODE0LCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxNSwgMHgwMDAwMDAwYik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODAxLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwMiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MDMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODA0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MzIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjMzLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzNCwgMHgwMDAwMDAwMyk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MzUsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjU0LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY1NywgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NTUsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjU2LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZjZCwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZjUsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2RjLCAweDM5MjkxOTA5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdkZCwgMHg3OTY5NTk0OSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZGUsIDB4YjlhOTk5ODkpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2RmLCAweGY5ZTlkOWM5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdlOCwgMHgwMDAwMzIxMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZTksIDB4MDAwMDc2NTQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2VhLCAweDAwMDAwMDk4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdlYywgMHgzOTI5MTkwOSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZWQsIDB4Nzk2OTU5NDkpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2VlLCAweGI5YTk5OTg5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdlZiwgMHhmOWU5ZDljOSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZjAsIDB4MDAwMDMyMTApOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2YxLCAweDAwMDA3NjU0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdmMiwgMHgwMDAwMDA5OCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1YTUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTgwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4MSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTgzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4NCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTg2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4NywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTg5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OGIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOThjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OGUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOThmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTkyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5MywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTk1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTk4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5OSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTliLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5YywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTllLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5ZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWExLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWE0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWE3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWFhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWFkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWIwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWIzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWI2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWI5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWJjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWJmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWMyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWM1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWM4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5Y2EsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWNiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5Y2QsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWNlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQ0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQ3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWRhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZGMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWRkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZGYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWUwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWUzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWU2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWU5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWVjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWVmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWYyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWY1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWY4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZmEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWZiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZmQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWZlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NjgsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDZjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDcyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3MywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDc1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDc4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3OSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0N2EsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDdiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3YywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0N2QsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDdlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3ZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDgxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDg0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDg3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4OCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDhhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4YiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OGMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDhkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4ZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OGYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDkwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5MSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDkzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5NCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDk2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5NywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDk5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDljLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDlmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGEyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGE1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGE4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGFiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGFlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGIxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGI0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGI3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGJhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGJkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGMwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGMzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGM2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGM5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0Y2IsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGNjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0Y2UsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGNmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxMCwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTEsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTEyLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxMywgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTQsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTE1LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxNiwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTcsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTE4LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxOSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MWEsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTFiLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxYywgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MWQsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTFlLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxZiwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MjAsIDB4MDAwMDAyYjYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTI5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzMCwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzEsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTMyLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzMywgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzQsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTM1LCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzNiwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzcsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTM4LCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzOSwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1M2EsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTNiLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzYywgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1M2QsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTNlLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzZiwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ODUsIDB4MDAwMDAwM2YpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTc2LCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDU4NiwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ODIsIDB4MDAwMDAwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTgzLCAweDAwMDAwMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDVjMiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MzgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjM5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzYSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2M2IsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjNjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzZCwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2M2UsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGI4LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhiOSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YmEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGJiLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhiYywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YmQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGJlLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhiZiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTAxLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwMiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTA0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTA3LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwOCwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDksIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTBhLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwYiwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MGMsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTBkLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwZSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MGYsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTEwLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxMSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTEzLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxNCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTE2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxNywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTE5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MWIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTFjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MWUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTFmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyMCwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjEsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTIyLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyMywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjQsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTI1LCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyNiwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjcsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTI4LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyOSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MmEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTJiLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyYywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MmQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTJlLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyZiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NDgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjQ5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY0YSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NGIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjRjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY0ZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NGUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjRmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY1MCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NTgsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2ZmLCAweDAwMDAwMDBhKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY2YSwgMHg0MDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NmIsIDB4MTAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjZjLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY2ZCwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YWYsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2IwLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdmNiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YjIsIDB4MDAwMDAwNTUpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2FkLCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkzNywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NzEsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTcyLCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3MywgMHgwMDAwMDEyYyk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5N2MsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTc5LCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3NSwgMHgwMDAwMDAyMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NzYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTc3LCAweDAwMDAwMDIwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3OCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NTcsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTVlLCAweDIwMTY0MDEwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk1ZiwgMHgwMDAwMDAyMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2ODMsIDB4MDAwMDAwMDYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjg1LCAweDAwM2ZmZmZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY4NywgMHgwMDAwMGM0OCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YTAsIDB4MDAwMDAwMDUpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODQwLCAweDAwMzAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0MSwgMHgwNDAwMDA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NDIsIDB4MDAzMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODQzLCAweDA0MDAwMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODFhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODFkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODQ4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0OSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NGEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODRiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0YywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NGQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODRlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0ZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODUxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg1MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODU0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg1NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODU3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDczOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmFiLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhYywgMHgwMDAwMDA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWQsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmFlLCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZiMSwgMHgwMDAwMDAxMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YmIsIDB4MDAwMDAwY2YpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmNlLCAweDJhNzEyNDg4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDczOSwgMHg0MDg1YzAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3M2EsIDB4MDAwMDAwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzg2LCAweDgwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDczYywgMHgwMDAxMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3M2QsIDB4MDI4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzg3LCAweDAwMDAwMGNmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc4YywgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5NSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk3LCAweDAwMDAwMGNmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgzNiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OWEsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODMzLCAweDA0NDQ0NDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhMSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YTMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2E0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzEsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBjLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwZCwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MGUsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyMywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MjQsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODI1LCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyNiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NWQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODJiLCAweDAwMDAwMDA0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk0MiwgMHgwMDAxMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NDMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTQ0LCAweDAwMDAwMDIyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdjNSwgMHgwMDAxMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2M3LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiMCwgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjEsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWIyLCAweDAwMDAwMDBmKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiMywgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjQsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWI1LCAweDAwMDAwMDBmKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiNiwgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjcsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWI4LCAweDBmYWM2ODgxKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiOSwgMHgwMGZhYzY4OCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMWUxMDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAxMDAwLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWQsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmFlLCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZiMSwgMHgwMDAwMDAxMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OGMsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzkyLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5NCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5NywgMHgwMDAwMDBjZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OWEsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODMzLCAweDA0NDQ0NDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhMSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YTMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2E0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzEsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDFlMTAwLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMTAwMCwgMHgwMDAwMDAxNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNTEsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTU3LCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk1ZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MmIsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTQyLCAweDAwMDEwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk0MywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YzUsIDB4MDAwMTAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODM0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdjNywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMWUxMDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAxMDAwLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwYywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MGQsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBlLCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwZiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MjMsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODI0LCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyNSwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MjYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDFlMTAwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDAyMDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDE1NCwgMHgwMDAwMDQwMCk7CisKKwludmMwX2dyY3R4X2dlbmVyYXRlXzkwOTcoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlXzkwMmQoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlXzkwMzkoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlXzkwYzAoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDAwMDI2MCwgcjAwMDI2MCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2luc3RtZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfaW5zdG1lbS5jCmluZGV4IDEzYTBmNzguLmMwOTA5MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfaW5zdG1lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfaW5zdG1lbS5jCkBAIC0yNSwxMzIgKzI1LDIyIEBACiAjaW5jbHVkZSAiZHJtUC5oIgogCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKLWludAotbnZjMF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLAotCQkgICAgICB1aW50MzJfdCAqc2l6ZSkKLXsKLQlpbnQgcmV0OwotCi0JKnNpemUgPSBBTElHTigqc2l6ZSwgNDA5Nik7Ci0JaWYgKCpzaXplID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCAqc2l6ZSwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwgMCwgMHgwMDAwLAotCQkJICAgICB0cnVlLCBmYWxzZSwgJmdwdW9iai0+aW1fYmFja2luZyk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJlcnJvciBnZXR0aW5nIFBSQU1JTiBiYWNraW5nIHBhZ2VzOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBub3V2ZWF1X2JvX3BpbihncHVvYmotPmltX2JhY2tpbmcsIFRUTV9QTF9GTEFHX1ZSQU0pOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiZXJyb3IgcGlubmluZyBQUkFNSU4gYmFja2luZyBWUkFNOiAlZFxuIiwgcmV0KTsKLQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmdwdW9iai0+aW1fYmFja2luZyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZ3B1b2JqLT52aW5zdCA9IGdwdW9iai0+aW1fYmFja2luZy0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW52YzBfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKGdwdW9iaiAmJiBncHVvYmotPmltX2JhY2tpbmcpIHsKLQkJaWYgKGdwdW9iai0+aW1fYm91bmQpCi0JCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0udW5iaW5kKGRldiwgZ3B1b2JqKTsKLQkJbm91dmVhdV9ib191bnBpbihncHVvYmotPmltX2JhY2tpbmcpOwotCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKLQkJZ3B1b2JqLT5pbV9iYWNraW5nID0gTlVMTDsKLQl9Ci19Ci0KLWludAotbnZjMF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBwdGUsIHB0ZV9lbmQ7Ci0JdWludDY0X3QgdnJhbTsKLQotCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nIHx8ICFncHVvYmotPmltX3ByYW1pbiB8fCBncHVvYmotPmltX2JvdW5kKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCU5WX0RFQlVHKGRldiwgInN0PTB4JWx4IHN6PTB4JWx4XG4iLAotCQkgZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0LCBncHVvYmotPmltX3ByYW1pbi0+c2l6ZSk7Ci0KLQlwdGUgICAgID0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0ID4+IDEyOwotCXB0ZV9lbmQgPSAoZ3B1b2JqLT5pbV9wcmFtaW4tPnNpemUgPj4gMTIpICsgcHRlOwotCXZyYW0gICAgPSBncHVvYmotPnZpbnN0OwotCi0JTlZfREVCVUcoZGV2LCAicHJhbWluPTB4JWx4LCBwdGU9JWQsIHB0ZV9lbmQ9JWRcbiIsCi0JCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIHB0ZSwgcHRlX2VuZCk7Ci0JTlZfREVCVUcoZGV2LCAiZmlyc3QgdnJhbSBwYWdlOiAweCUwMTBsbHhcbiIsIGdwdW9iai0+dmluc3QpOwotCi0Jd2hpbGUgKHB0ZSA8IHB0ZV9lbmQpIHsKLQkJbnZfd3IzMihkZXYsIDB4NzAyMDAwICsgKHB0ZSAqIDgpLCAodnJhbSA+PiA4KSB8IDEpOwotCQludl93cjMyKGRldiwgMHg3MDIwMDQgKyAocHRlICogOCksIDApOwotCQl2cmFtICs9IDQwOTY7Ci0JCXB0ZSsrOwotCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQotCWlmICgxKSB7Ci0JCXUzMiBjaGFuID0gbnZfcmQzMihkZXYsIDB4MTcwMCkgPDwgMTY7Ci0JCW52X3dyMzIoZGV2LCAweDEwMGNiOCwgKGNoYW4gKyAweDEwMDApID4+IDgpOwotCQludl93cjMyKGRldiwgMHgxMDBjYmMsIDB4ODAwMDAwMDUpOwotCX0KLQotCWdwdW9iai0+aW1fYm91bmQgPSAxOwotCXJldHVybiAwOwotfQotCi1pbnQKLW52YzBfaW5zdG1lbV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBwdGUsIHB0ZV9lbmQ7Ci0KLQlpZiAoZ3B1b2JqLT5pbV9ib3VuZCA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXB0ZSAgICAgPSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgPj4gMTI7Ci0JcHRlX2VuZCA9IChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgKyBwdGU7Ci0Jd2hpbGUgKHB0ZSA8IHB0ZV9lbmQpIHsKLQkJbnZfd3IzMihkZXYsIDB4NzAyMDAwICsgKHB0ZSAqIDgpLCAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NzAyMDA0ICsgKHB0ZSAqIDgpLCAwKTsKLQkJcHRlKys7Ci0JfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JZ3B1b2JqLT5pbV9ib3VuZCA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW52YzBfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCW52X3dyMzIoZGV2LCAweDA3MDAwMCwgMSk7Ci0JaWYgKCFudl93YWl0KGRldiwgMHgwNzAwMDAsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDApKQotCQlOVl9FUlJPUihkZXYsICJQUkFNSU4gZmx1c2ggdGltZW91dFxuIik7Ci19CitzdHJ1Y3QgbnZjMF9pbnN0bWVtX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAgKmJhcjFfcGdkOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmJhcjE7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICAqYmFyM19wZ2Q7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqYmFyMzsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogICpjaGFuX3BnZDsKK307CiAKIGludAogbnZjMF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiAqYnVmOwotCWludCBpOwogCi0JZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5ID0gdm1hbGxvYyg2NTUzNik7Ci0JaWYgKCFkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkpCi0JCXJldHVybiAtRU5PTUVNOwotCWJ1ZiA9IGRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weTsKLQotCWZvciAoaSA9IDA7IGkgPCA2NTUzNjsgaSArPSA0KQotCQlidWZbaS80XSA9IG52X3JkMzIoZGV2LCBOVjA0X1BSQU1JTiArIGkpOworCWRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4LDczICs0OCwxODQgQEAKIG52YzBfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiAqYnVmID0gZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5OwotCXU2NCBjaGFuOwotCWludCBpOworCXN0cnVjdCBudmMwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OwogCi0JY2hhbiA9IGRldl9wcml2LT52cmFtX3NpemUgLSBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOwotCW52X3dyMzIoZGV2LCAweDAwMTcwMCwgY2hhbiA+PiAxNik7CisJbnZfbWFzayhkZXYsIDB4MTAwYzgwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDE3MDQsIDB4ODAwMDAwMDAgfCBwcml2LT5iYXIxLT5yYW1pbi0+dmluc3QgPj4gMTIpOworCW52X3dyMzIoZGV2LCAweDAwMTcxNCwgMHhjMDAwMDAwMCB8IHByaXYtPmJhcjMtPnJhbWluLT52aW5zdCA+PiAxMik7CisJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IHRydWU7Cit9CiAKLQlmb3IgKGkgPSAwOyBpIDwgNjU1MzY7IGkgKz0gNCkKLQkJbnZfd3IzMihkZXYsIE5WMDRfUFJBTUlOICsgaSwgYnVmW2kvNF0pOwotCXZmcmVlKGRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSk7Ci0JZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5ID0gTlVMTDsKK3N0YXRpYyB2b2lkCitudmMwX2NoYW5uZWxfZGVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCi0JbnZfd3IzMihkZXYsIDB4MDAxNzE0LCAweGMwMDAwMDAwIHwgKGNoYW4gPj4gMTIpKTsKKwljaGFuID0gKnBjaGFuOworCSpwY2hhbiA9IE5VTEw7CisJaWYgKCFjaGFuKQorCQlyZXR1cm47CisKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmY2hhbi0+dm0sIE5VTEwpOworCWlmIChjaGFuLT5yYW1pbl9oZWFwLmZyZWVfc3RhY2submV4dCkKKwkJZHJtX21tX3Rha2Vkb3duKCZjaGFuLT5yYW1pbl9oZWFwKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWluKTsKKwlrZnJlZShjaGFuKTsKK30KKworc3RhdGljIGludAorbnZjMF9jaGFubmVsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2l6ZSwgc3RydWN0IG5vdXZlYXVfdm0gKnZtLAorCQkgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuLAorCQkgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QsIHU2NCB2bV9zaXplKQoreworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKKworCWNoYW4gPSBremFsbG9jKHNpemVvZigqY2hhbiksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKKwkJcmV0dXJuIC1FTk9NRU07CisJY2hhbi0+ZGV2ID0gZGV2OworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgc2l6ZSwgMHgxMDAwLCAwLCAmY2hhbi0+cmFtaW4pOworCWlmIChyZXQpIHsKKwkJbnZjMF9jaGFubmVsX2RlbCgmY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZHJtX21tX2luaXQoJmNoYW4tPnJhbWluX2hlYXAsIDB4MTAwMCwgc2l6ZSAtIDB4MTAwMCk7CisJaWYgKHJldCkgeworCQludmMwX2NoYW5uZWxfZGVsKCZjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBub3V2ZWF1X3ZtX3JlZih2bSwgJmNoYW4tPnZtLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCW52YzBfY2hhbm5lbF9kZWwoJmNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCW52X3dvMzIoY2hhbi0+cmFtaW4sIDB4MDIwMCwgbG93ZXJfMzJfYml0cyhwZ2QtPnZpbnN0KSk7CisJbnZfd28zMihjaGFuLT5yYW1pbiwgMHgwMjA0LCB1cHBlcl8zMl9iaXRzKHBnZC0+dmluc3QpKTsKKwludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDgsIGxvd2VyXzMyX2JpdHModm1fc2l6ZSAtIDEpKTsKKwludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMGMsIHVwcGVyXzMyX2JpdHModm1fc2l6ZSAtIDEpKTsKKworCSpwY2hhbiA9IGNoYW47CisJcmV0dXJuIDA7CiB9CiAKIGludAogbnZjMF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXU2NCBjaGFuLCBwZ3QzLCBpbWVtLCBsaW0zID0gZGV2X3ByaXYtPnJhbWluX3NpemUgLSAxOwotCWludCByZXQsIGk7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlzdHJ1Y3QgbnZjMF9pbnN0bWVtX3ByaXYgKnByaXY7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gTlVMTDsKKwlpbnQgcmV0OwogCi0JZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSA9IDEgKiAxMDI0ICogMTAyNDsKLQljaGFuID0gZGV2X3ByaXYtPnZyYW1fc2l6ZSAtIGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07Ci0JaW1lbSA9IDQwOTYgKyA0MDk2ICsgMzI3Njg7Ci0KLQludl93cjMyKGRldiwgMHgwMDE3MDAsIGNoYW4gPj4gMTYpOwotCi0JLyogY2hhbm5lbCBzZXR1cCAqLwotCW52X3dyMzIoZGV2LCAweDcwMDIwMCwgbG93ZXJfMzJfYml0cyhjaGFuICsgMHgxMDAwKSk7Ci0JbnZfd3IzMihkZXYsIDB4NzAwMjA0LCB1cHBlcl8zMl9iaXRzKGNoYW4gKyAweDEwMDApKTsKLQludl93cjMyKGRldiwgMHg3MDAyMDgsIGxvd2VyXzMyX2JpdHMobGltMykpOwotCW52X3dyMzIoZGV2LCAweDcwMDIwYywgdXBwZXJfMzJfYml0cyhsaW0zKSk7Ci0KLQkvKiBwb2ludCBwZ2QgLT4gcGd0ICovCi0JbnZfd3IzMihkZXYsIDB4NzAxMDAwLCAwKTsKLQludl93cjMyKGRldiwgMHg3MDEwMDQsICgoY2hhbiArIDB4MjAwMCkgPj4gOCkgfCAxKTsKLQotCS8qIHBvaW50IHBndCAtPiBwaHlzaWNhbCB2cmFtIGZvciBjaGFubmVsICovCi0JcGd0MyA9IDB4MjAwMDsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsgaSArPSA0MDk2LCBwZ3QzICs9IDgpIHsKLQkJbnZfd3IzMihkZXYsIDB4NzAwMDAwICsgcGd0MywgKChjaGFuICsgaSkgPj4gOCkgfCAxKTsKLQkJbnZfd3IzMihkZXYsIDB4NzAwMDA0ICsgcGd0MywgMCk7Ci0JfQotCi0JLyogY2xlYXIgcmVzdCBvZiBwZ3QgKi8KLQlmb3IgKDsgaSA8IGRldl9wcml2LT5yYW1pbl9zaXplOyBpICs9IDQwOTYsIHBndDMgKz0gOCkgewotCQludl93cjMyKGRldiwgMHg3MDAwMDAgKyBwZ3QzLCAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NzAwMDA0ICsgcGd0MywgMCk7Ci0JfQotCi0JLyogcG9pbnQgYmFyMyBhdCB0aGUgY2hhbm5lbCAqLwotCW52X3dyMzIoZGV2LCAweDAwMTcxNCwgMHhjMDAwMDAwMCB8IChjaGFuID4+IDEyKSk7Ci0KLQkvKiBHbG9iYWwgUFJBTUlOIGhlYXAgKi8KLQlyZXQgPSBkcm1fbW1faW5pdCgmZGV2X3ByaXYtPnJhbWluX2hlYXAsIGltZW0sCi0JCQkgIGRldl9wcml2LT5yYW1pbl9zaXplIC0gaW1lbSk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaW5pdCBSQU1JTiBoZWFwXG4iKTsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KKwlwaW5zdG1lbS0+cHJpdiA9IHByaXY7CiAKKwkvKiBCQVIzIFZNICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpLCAwLAorCQkJICAgICAmZGV2X3ByaXYtPmJhcjNfdm0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLAorCQkJCSAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSA+PiAxMikgKiA4LCAwLAorCQkJCSBOVk9CSl9GTEFHX0RPTlRfTUFQIHwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLAorCQkJCSAmZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5yZWZjb3VudFswXSA9IDE7CisKKwludjUwX2luc3RtZW1fbWFwKGRldl9wcml2LT5iYXIzX3ZtLT5wZ3RbMF0ub2JqWzBdKTsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDB4ODAwMCwgNDA5NiwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmcHJpdi0+YmFyM19wZ2QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X3ZtX3JlZihkZXZfcHJpdi0+YmFyM192bSwgJnZtLCBwcml2LT5iYXIzX3BnZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmdm0sIE5VTEwpOworCisJcmV0ID0gbnZjMF9jaGFubmVsX25ldyhkZXYsIDgxOTIsIGRldl9wcml2LT5iYXIzX3ZtLCAmcHJpdi0+YmFyMywKKwkJCSAgICAgICBwcml2LT5iYXIzX3BnZCwgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDMpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogQkFSMSBWTSAqLworCXJldCA9IG5vdXZlYXVfdm1fbmV3KGRldiwgMCwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgMCwgJnZtKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHg4MDAwLCA0MDk2LAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT5iYXIxX3BnZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfdm1fcmVmKHZtLCAmZGV2X3ByaXYtPmJhcjFfdm0sIHByaXYtPmJhcjFfcGdkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZ2bSwgTlVMTCk7CisKKwlyZXQgPSBudmMwX2NoYW5uZWxfbmV3KGRldiwgODE5MiwgZGV2X3ByaXYtPmJhcjFfdm0sICZwcml2LT5iYXIxLAorCQkJICAgICAgIHByaXYtPmJhcjFfcGdkLCBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjaGFubmVsIHZtICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCAwLCAoMVVMTCA8PCA0MCksIDB4MDAwODAwMDAwMFVMTCwgJnZtKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHg4MDAwLCA0MDk2LCAwLCAmcHJpdi0+Y2hhbl9wZ2QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlub3V2ZWF1X3ZtX3JlZih2bSwgJmRldl9wcml2LT5jaGFuX3ZtLCBwcml2LT5jaGFuX3BnZCk7CisJbm91dmVhdV92bV9yZWYoTlVMTCwgJnZtLCBOVUxMKTsKKworCW52YzBfaW5zdG1lbV9yZXN1bWUoZGV2KTsKIAlyZXR1cm4gMDsKK2Vycm9yOgorCW52YzBfaW5zdG1lbV90YWtlZG93bihkZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQKIG52YzBfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YzBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gTlVMTDsKKworCW52YzBfaW5zdG1lbV9zdXNwZW5kKGRldik7CisKKwludl93cjMyKGRldiwgMHgxNzA0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgxNzE0LCAweDAwMDAwMDAwKTsKKworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZkZXZfcHJpdi0+Y2hhbl92bSwgcHJpdi0+Y2hhbl9wZ2QpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+Y2hhbl9wZ2QpOworCisJbnZjMF9jaGFubmVsX2RlbCgmcHJpdi0+YmFyMSk7CisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmRldl9wcml2LT5iYXIxX3ZtLCBwcml2LT5iYXIxX3BnZCk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5iYXIxX3BnZCk7CisKKwludmMwX2NoYW5uZWxfZGVsKCZwcml2LT5iYXIzKTsKKwlub3V2ZWF1X3ZtX3JlZihkZXZfcHJpdi0+YmFyM192bSwgJnZtLCBOVUxMKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmdm0sIHByaXYtPmJhcjNfcGdkKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPmJhcjNfcGdkKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmRldl9wcml2LT5iYXIzX3ZtLT5wZ3RbMF0ub2JqWzBdKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmZGV2X3ByaXYtPmJhcjNfdm0sIE5VTEwpOworCisJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXYgPSBOVUxMOworCWtmcmVlKHByaXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5MjUxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdm0uYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCisKK3ZvaWQKK252YzBfdm1fbWFwX3BndChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCwgdTMyIGluZGV4LAorCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndFsyXSkKK3sKKwl1MzIgcGRlWzJdID0geyAwLCAwIH07CisKKwlpZiAocGd0WzBdKQorCQlwZGVbMV0gPSAweDAwMDAwMDAxIHwgKHBndFswXS0+dmluc3QgPj4gOCk7CisJaWYgKHBndFsxXSkKKwkJcGRlWzBdID0gMHgwMDAwMDAwMSB8IChwZ3RbMV0tPnZpbnN0ID4+IDgpOworCisJbnZfd28zMihwZ2QsIChpbmRleCAqIDgpICsgMCwgcGRlWzBdKTsKKwludl93bzMyKHBnZCwgKGluZGV4ICogOCkgKyA0LCBwZGVbMV0pOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorbnZjMF92bV9hZGRyKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCB1NjQgcGh5cywgdTMyIG1lbXR5cGUsIHUzMiB0YXJnZXQpCit7CisJcGh5cyA+Pj0gODsKKworCXBoeXMgfD0gMHgwMDAwMDAwMTsgLyogcHJlc2VudCAqLworLy8JaWYgKHZtYS0+YWNjZXNzICYgTlZfTUVNX0FDQ0VTU19TWVMpCisvLwkJcGh5cyB8PSAweDAwMDAwMDAyOworCisJcGh5cyB8PSAoKHU2NCl0YXJnZXQgIDw8IDMyKTsKKwlwaHlzIHw9ICgodTY0KW1lbXR5cGUgPDwgMzYpOworCisJcmV0dXJuIHBoeXM7Cit9CisKK3ZvaWQKK252YzBfdm1fbWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCwKKwkgICAgc3RydWN0IG5vdXZlYXVfdnJhbSAqbWVtLCB1MzIgcHRlLCB1MzIgY250LCB1NjQgcGh5cykKK3sKKwl1MzIgbmV4dCA9IDEgPDwgKHZtYS0+bm9kZS0+dHlwZSAtIDgpOworCisJcGh5cyAgPSBudmMwX3ZtX2FkZHIodm1hLCBwaHlzLCBtZW0tPm1lbXR5cGUsIDApOworCXB0ZSA8PD0gMzsKKwl3aGlsZSAoY250LS0pIHsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIGxvd2VyXzMyX2JpdHMocGh5cykpOworCQludl93bzMyKHBndCwgcHRlICsgNCwgdXBwZXJfMzJfYml0cyhwaHlzKSk7CisJCXBoeXMgKz0gbmV4dDsKKwkJcHRlICArPSA4OworCX0KK30KKwordm9pZAorbnZjMF92bV9tYXBfc2coc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LAorCSAgICAgICB1MzIgcHRlLCBkbWFfYWRkcl90ICpsaXN0LCB1MzIgY250KQoreworCXB0ZSA8PD0gMzsKKwl3aGlsZSAoY250LS0pIHsKKwkJdTY0IHBoeXMgPSBudmMwX3ZtX2FkZHIodm1hLCAqbGlzdCsrLCAwLCA1KTsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIGxvd2VyXzMyX2JpdHMocGh5cykpOworCQludl93bzMyKHBndCwgcHRlICsgNCwgdXBwZXJfMzJfYml0cyhwaHlzKSk7CisJCXB0ZSArPSA4OworCX0KK30KKwordm9pZAorbnZjMF92bV91bm1hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCwgdTMyIHB0ZSwgdTMyIGNudCkKK3sKKwlwdGUgPDw9IDM7CisJd2hpbGUgKGNudC0tKSB7CisJCW52X3dvMzIocGd0LCBwdGUgKyAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDQsIDB4MDAwMDAwMDApOworCQlwdGUgKz0gODsKKwl9Cit9CisKK3ZvaWQKK252YzBfdm1fZmx1c2goc3RydWN0IG5vdXZlYXVfdm0gKnZtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IHZtLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICpwaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHZtLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkOworCXUzMiByMTAwYzgwLCBlbmdpbmU7CisKKwlwaW5zdG1lbS0+Zmx1c2godm0tPmRldik7CisKKwlpZiAodm0gPT0gZGV2X3ByaXYtPmNoYW5fdm0pCisJCWVuZ2luZSA9IDE7CisJZWxzZQorCQllbmdpbmUgPSA1OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cGdkLCAmdm0tPnBnZF9saXN0LCBoZWFkKSB7CisJCXIxMDBjODAgPSBudl9yZDMyKGRldiwgMHgxMDBjODApOworCQludl93cjMyKGRldiwgMHgxMDBjYjgsIHZwZ2QtPm9iai0+dmluc3QgPj4gOCk7CisJCW52X3dyMzIoZGV2LCAweDEwMGNiYywgMHg4MDAwMDAwMCB8IGVuZ2luZSk7CisJCWlmICghbnZfd2FpdChkZXYsIDB4MTAwYzgwLCAweGZmZmZmZmZmLCByMTAwYzgwKSkKKwkJCU5WX0VSUk9SKGRldiwgInZtIGZsdXNoIHRpbWVvdXQgZW5nICVkXG4iLCBlbmdpbmUpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdnJhbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF92cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4ZWRhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdnJhbS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKworYm9vbAorbnZjMF92cmFtX2ZsYWdzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiB0aWxlX2ZsYWdzKQoreworCXN3aXRjaCAodGlsZV9mbGFncyAmIE5PVVZFQVVfR0VNX1RJTEVfTEFZT1VUX01BU0spIHsKKwljYXNlIDB4MDAwMDoKKwljYXNlIDB4ZmUwMDoKKwljYXNlIDB4ZGIwMDoKKwljYXNlIDB4MTEwMDoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitpbnQKK252YzBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIG5jbWluLAorCSAgICAgIHUzMiB0eXBlLCBzdHJ1Y3Qgbm91dmVhdV92cmFtICoqcHZyYW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+dHRtLmJkZXY7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW1RUTV9QTF9WUkFNXTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBtYW4tPnByaXY7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcjsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtOworCWludCByZXQ7CisKKwlzaXplICA+Pj0gMTI7CisJYWxpZ24gPj49IDEyOworCW5jbWluID4+PSAxMjsKKworCXZyYW0gPSBremFsbG9jKHNpemVvZigqdnJhbSksIEdGUF9LRVJORUwpOworCWlmICghdnJhbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmdnJhbS0+cmVnaW9ucyk7CisJdnJhbS0+ZGV2ID0gZGV2X3ByaXYtPmRldjsKKwl2cmFtLT5tZW10eXBlID0gdHlwZTsKKwl2cmFtLT5zaXplID0gc2l6ZTsKKworCW11dGV4X2xvY2soJm1tLT5tdXRleCk7CisJZG8geworCQlyZXQgPSBub3V2ZWF1X21tX2dldChtbSwgMSwgc2l6ZSwgbmNtaW4sIGFsaWduLCAmcik7CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygmbW0tPm11dGV4KTsKKwkJCW52NTBfdnJhbV9kZWwoZGV2LCAmdnJhbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmci0+cmxfZW50cnksICZ2cmFtLT5yZWdpb25zKTsKKwkJc2l6ZSAtPSByLT5sZW5ndGg7CisJfSB3aGlsZSAoc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZtbS0+bXV0ZXgpOworCisJciA9IGxpc3RfZmlyc3RfZW50cnkoJnZyYW0tPnJlZ2lvbnMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIHJsX2VudHJ5KTsKKwl2cmFtLT5vZmZzZXQgPSAodTY0KXItPm9mZnNldCA8PCAxMjsKKwkqcHZyYW0gPSB2cmFtOworCXJldHVybiAwOworfQorCitpbnQKK252YzBfdnJhbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWRldl9wcml2LT52cmFtX3NpemUgID0gbnZfcmQzMihkZXYsIDB4MTBmMjBjKSA8PCAyMDsKKwlkZXZfcHJpdi0+dnJhbV9zaXplICo9IG52X3JkMzIoZGV2LCAweDEyMWM3NCk7CisJZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgPSA0MDk2OworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKaW5kZXggODgxZjhhNS4uZmUwZjI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oCkBAIC0xNTMsNyArMTUzLDggQEAKICNkZWZpbmUgTlZfUENSVENfU1RBUlQJCQkJCTB4MDA2MDA4MDAKICNkZWZpbmUgTlZfUENSVENfQ09ORklHCQkJCQkweDAwNjAwODA0CiAjCWRlZmluZSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19OT05fVkdBCQkoMSA8PCAwKQotIwlkZWZpbmUgTlZfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkMJCSgyIDw8IDApCisjCWRlZmluZSBOVjA0X1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DCQkoNCA8PCAwKQorIwlkZWZpbmUgTlYxMF9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQwkJKDIgPDwgMCkKICNkZWZpbmUgTlZfUENSVENfQ1VSU09SX0NPTkZJRwkJCQkweDAwNjAwODEwCiAjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0VOQUJMRV9FTkFCTEUJCSgxIDw8IDApCiAjCWRlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHX0RPVUJMRV9TQ0FOX0VOQUJMRQkoMSA8PCA0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKaW5kZXggNmNhZTRmMi4uZTQ3ZWVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCkBAIC02NSwxMCArNjUsMTMgQEAKIAlyczQwMC5vIHJzNjAwLm8gcnM2OTAubyBydjUxNS5vIHI1MjAubyByNjAwLm8gcnY3NzAubyByYWRlb25fdGVzdC5vIFwKIAlyMjAwLm8gcmFkZW9uX2xlZ2FjeV90di5vIHI2MDBfY3MubyByNjAwX2JsaXQubyByNjAwX2JsaXRfc2hhZGVycy5vIFwKIAlyNjAwX2JsaXRfa21zLm8gcmFkZW9uX3BtLm8gYXRvbWJpb3NfZHAubyByNjAwX2F1ZGlvLm8gcjYwMF9oZG1pLm8gXAotCWV2ZXJncmVlbi5vIGV2ZXJncmVlbl9jcy5vIGV2ZXJncmVlbl9ibGl0X3NoYWRlcnMubyBldmVyZ3JlZW5fYmxpdF9rbXMubworCWV2ZXJncmVlbi5vIGV2ZXJncmVlbl9jcy5vIGV2ZXJncmVlbl9ibGl0X3NoYWRlcnMubyBldmVyZ3JlZW5fYmxpdF9rbXMubyBcCisJcmFkZW9uX3RyYWNlX3BvaW50cy5vIG5pLm8KIAogcmFkZW9uLSQoQ09ORklHX0NPTVBBVCkgKz0gcmFkZW9uX2lvYzMyLm8KIHJhZGVvbi0kKENPTkZJR19WR0FfU1dJVENIRVJPTykgKz0gcmFkZW9uX2F0cHhfaGFuZGxlci5vCiByYWRlb24tJChDT05GSUdfQUNQSSkgKz0gcmFkZW9uX2FjcGkubwogCiBvYmotJChDT05GSUdfRFJNX1JBREVPTikrPSByYWRlb24ubworCitDRkxBR1NfcmFkZW9uX3RyYWNlX3BvaW50cy5vIDo9IC1JJChzcmMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9PYmplY3RJRC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9PYmplY3RJRC5oCmluZGV4IGM3MTQxNzkuLmM2MWMzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vT2JqZWN0SUQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL09iamVjdElELmgKQEAgLTM3LDYgKzM3LDggQEAKICNkZWZpbmUgR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SICAgICAgICAgICAgICAgMHgzCiAjZGVmaW5lIEdSQVBIX09CSkVDVF9UWVBFX1JPVVRFUiAgICAgICAgICAgICAgICAgIDB4NAogLyogZGVsZXRlZCAqLworI2RlZmluZSBHUkFQSF9PQkpFQ1RfVFlQRV9ESVNQTEFZX1BBVEggICAgICAgICAgICAweDYgIAorI2RlZmluZSBHUkFQSF9PQkpFQ1RfVFlQRV9HRU5FUklDICAgICAgICAgICAgICAgICAweDcKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBFbmNvZGVyIE9iamVjdCBJRCBEZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY0LDYgKzY2LDkgQEAKICNkZWZpbmUgRU5DT0RFUl9PQkpFQ1RfSURfVlQxNjIzICAgICAgICAgICAgICAgICAgMHgxMAogI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9IRE1JX1NJMTkzMCAgICAgICAgICAgICAweDExCiAjZGVmaW5lIEVOQ09ERVJfT0JKRUNUX0lEX0hETUlfSU5URVJOQUwgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgRU5DT0RFUl9PQkpFQ1RfSURfQUxNT05EICAgICAgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVMgICAgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRyAgICAgICAgICAgICAgICAgIDB4MjIKIC8qIEthbGVpZG9zY29wZSAoS0xEU0NQKSBDbGFzcyBEaXNwbGF5IEhhcmR3YXJlIChpbnRlcm5hbCkgKi8KICNkZWZpbmUgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX1RNRFMxICAgMHgxMwogI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMSAgICAweDE0CkBAIC0xMDgsNiArMTEzLDcgQEAKICNkZWZpbmUgQ09OTkVDVE9SX09CSkVDVF9JRF9ESVNQTEFZUE9SVCAgICAgICAgICAgMHgxMwogI2RlZmluZSBDT05ORUNUT1JfT0JKRUNUX0lEX2VEUCAgICAgICAgICAgICAgICAgICAweDE0CiAjZGVmaW5lIENPTk5FQ1RPUl9PQkpFQ1RfSURfTVhNICAgICAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgQ09OTkVDVE9SX09CSkVDVF9JRF9MVkRTX2VEUCAgICAgICAgICAgICAgMHgxNgogCiAvKiBkZWxldGVkICovCiAKQEAgLTEyNCw2ICsxMzAsNyBAQAogI2RlZmluZSBHRU5FUklDX09CSkVDVF9JRF9HTFNZTkMgICAgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIEdFTkVSSUNfT0JKRUNUX0lEX1BYMl9OT05fRFJJVkFCTEUgICAgICAgIDB4MDIKICNkZWZpbmUgR0VORVJJQ19PQkpFQ1RfSURfTVhNX09QTSAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBHRU5FUklDX09CSkVDVF9JRF9TVEVSRU9fUElOICAgICAgICAgICAgICAweDA0ICAgICAgICAvL1RoaXMgb2JqZWN0IGNvdWxkIHNob3cgdXAgZnJvbSBNaXNjIE9iamVjdCB0YWJsZSwgaXQgZm9sbG93cyBBVE9NX09CSkVDVCBmb3JtYXQsIGFuZCBjb250YWlucyBvbmUgQVRPTV9PQkpFQ1RfR1BJT19DTlRMX1JFQ09SRCBmb3IgdGhlIHN0ZXJlbyBwaW4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBHcmFwaGljcyBPYmplY3QgRU5VTSBJRCBEZWZpbml0aW9uICAgICAgICAgICAgICAgKi8KQEAgLTM2MCw2ICszNjcsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQxIDw8IEVOVU1fSURfU0hJRlQgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFUl9PQkpFQ1RfSURfR0VORVJBTF9FWFRFUk5BTF9EVk8gPDwgT0JKRUNUX0lEX1NISUZUKQogCisjZGVmaW5lIEVOQ09ERVJfQUxNT05EX0VOVU1fSUQxICAgICAgICAgICAgICAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9FTkNPREVSIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERVJfT0JKRUNUX0lEX0FMTU9ORCA8PCBPQkpFQ1RfSURfU0hJRlQpCisKKyNkZWZpbmUgRU5DT0RFUl9BTE1PTkRfRU5VTV9JRDIgICAgICAgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0VOQ09ERVIgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQyIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFUl9PQkpFQ1RfSURfQUxNT05EIDw8IE9CSkVDVF9JRF9TSElGVCkKKworI2RlZmluZSBFTkNPREVSX1RSQVZJU19FTlVNX0lEMSAgICAgICAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfRU5DT0RFUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVSX09CSkVDVF9JRF9UUkFWSVMgPDwgT0JKRUNUX0lEX1NISUZUKQorCisjZGVmaW5lIEVOQ09ERVJfVFJBVklTX0VOVU1fSUQyICAgICAgICAgICAgICAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9FTkNPREVSIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMiA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUyA8PCBPQkpFQ1RfSURfU0hJRlQpCisKKyNkZWZpbmUgRU5DT0RFUl9OVVRNRUdfRU5VTV9JRDEgICAgICAgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0VOQ09ERVIgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQxIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHIDw8IE9CSkVDVF9JRF9TSElGVCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBDb25uZWN0b3IgT2JqZWN0IElEIGRlZmluaXRpb24gLSBTaGFyZWQgd2l0aCBCSU9TICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQyMSw2ICs0NDgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDIgPDwgRU5VTV9JRF9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU0lOR0xFX0xJTktfRFZJX0QgPDwgT0JKRUNUX0lEX1NISUZUKQogCisjZGVmaW5lIENPTk5FQ1RPUl9TSU5HTEVfTElOS19EVklfRF9FTlVNX0lEMyAgICggR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQzIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9EIDw8IE9CSkVDVF9JRF9TSElGVCkKKworI2RlZmluZSBDT05ORUNUT1JfU0lOR0xFX0xJTktfRFZJX0RfRU5VTV9JRDQgICAoIEdSQVBIX09CSkVDVF9UWVBFX0NPTk5FQ1RPUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lENCA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfRCA8PCBPQkpFQ1RfSURfU0hJRlQpCisKICNkZWZpbmUgQ09OTkVDVE9SX0RVQUxfTElOS19EVklfRF9FTlVNX0lEMSAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9DT05ORUNUT1IgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfRFVBTF9MSU5LX0RWSV9EIDw8IE9CSkVDVF9JRF9TSElGVCkKQEAgLTUxMiw2ICs1NDcsNyBAQAogI2RlZmluZSBDT05ORUNUT1JfN1BJTl9ESU5fRU5VTV9JRDEgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0NPTk5FQ1RPUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF83UElOX0RJTiA8PCBPQkpFQ1RfSURfU0hJRlQpCisKICNkZWZpbmUgQ09OTkVDVE9SXzdQSU5fRElOX0VOVU1fSUQyICAgICAgICAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9DT05ORUNUT1IgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDIgPDwgRU5VTV9JRF9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfN1BJTl9ESU4gPDwgT0JKRUNUX0lEX1NISUZUKQpAQCAtNTkzLDYgKzYyOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lENyA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9NWE0gPDwgT0JKRUNUX0lEX1NISUZUKSAgICAgICAgICAvL01hcHBpbmcgdG8gTVhNX0RBQwogCisjZGVmaW5lIENPTk5FQ1RPUl9MVkRTX2VEUF9FTlVNX0lEMSAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQxIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFNfZURQIDw8IE9CSkVDVF9JRF9TSElGVCkKKworI2RlZmluZSBDT05ORUNUT1JfTFZEU19lRFBfRU5VTV9JRDIgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0NPTk5FQ1RPUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMiA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9MVkRTX2VEUCA8PCBPQkpFQ1RfSURfU0hJRlQpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUm91dGVyIE9iamVjdCBJRCBkZWZpbml0aW9uIC0gU2hhcmVkIHdpdGggQklPUyAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYyMSw2ICs2NjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfT0JKRUNUX0lEX01YTV9PUE0gPDwgT0JKRUNUX0lEX1NISUZUKQogCisjZGVmaW5lIEdFTkVSSUNPQkpFQ1RfU1RFUkVPX1BJTl9FTlVNX0lEMSAgICAgICAgKEdSQVBIX09CSkVDVF9UWVBFX0dFTkVSSUMgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfT0JKRUNUX0lEX1NURVJFT19QSU4gPDwgT0JKRUNUX0lEX1NISUZUKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE9iamVjdCBDYXAgZGVmaW5pdGlvbiAtIFNoYXJlZCB3aXRoIEJJT1MgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b20uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jCmluZGV4IDA1ZWZiNWIuLjI1OGZhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jCkBAIC03MzQsMTYgKzczNCwxNiBAQAogc3RhdGljIHZvaWQgYXRvbV9vcF9tYXNrKGF0b21fZXhlY19jb250ZXh0ICpjdHgsIGludCAqcHRyLCBpbnQgYXJnKQogewogCXVpbnQ4X3QgYXR0ciA9IFU4KCgqcHRyKSsrKTsKLQl1aW50MzJfdCBkc3QsIHNyYzEsIHNyYzIsIHNhdmVkOworCXVpbnQzMl90IGRzdCwgbWFzaywgc3JjLCBzYXZlZDsKIAlpbnQgZHB0ciA9ICpwdHI7CiAJU0RFQlVHKCIgICBkc3Q6ICIpOwogCWRzdCA9IGF0b21fZ2V0X2RzdChjdHgsIGFyZywgYXR0ciwgcHRyLCAmc2F2ZWQsIDEpOwotCVNERUJVRygiICAgc3JjMTogIik7Ci0Jc3JjMSA9IGF0b21fZ2V0X3NyY19kaXJlY3QoY3R4LCAoKGF0dHIgPj4gMykgJiA3KSwgcHRyKTsKLQlTREVCVUcoIiAgIHNyYzI6ICIpOwotCXNyYzIgPSBhdG9tX2dldF9zcmMoY3R4LCBhdHRyLCBwdHIpOwotCWRzdCAmPSBzcmMxOwotCWRzdCB8PSBzcmMyOworCW1hc2sgPSBhdG9tX2dldF9zcmNfZGlyZWN0KGN0eCwgKChhdHRyID4+IDMpICYgNyksIHB0cik7CisJU0RFQlVHKCIgICBtYXNrOiAweCUwOHgiLCBtYXNrKTsKKwlTREVCVUcoIiAgIHNyYzogIik7CisJc3JjID0gYXRvbV9nZXRfc3JjKGN0eCwgYXR0ciwgcHRyKTsKKwlkc3QgJj0gbWFzazsKKwlkc3QgfD0gc3JjOwogCVNERUJVRygiICAgZHN0OiAiKTsKIAlhdG9tX3B1dF9kc3QoY3R4LCBhcmcsIGF0dHIsICZkcHRyLCBkc3QsIHNhdmVkKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaAppbmRleCBmZTM1OWEyLi4wNGIyNjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCkBAIC03Myw4ICs3MywxOCBAQAogI2RlZmluZSBBVE9NX1BQTEwxICAgICAgICAgICAgMAogI2RlZmluZSBBVE9NX1BQTEwyICAgICAgICAgICAgMQogI2RlZmluZSBBVE9NX0RDUExMICAgICAgICAgICAgMgorI2RlZmluZSBBVE9NX1BQTEwwICAgICAgICAgICAgMgorI2RlZmluZSBBVE9NX0VYVF9QTEwxICAgICAgICAgOAorI2RlZmluZSBBVE9NX0VYVF9QTEwyICAgICAgICAgOQorI2RlZmluZSBBVE9NX0VYVF9DTE9DSyAgICAgICAgMTAKICNkZWZpbmUgQVRPTV9QUExMX0lOVkFMSUQgICAgIDB4RkYKIAorI2RlZmluZSBFTkNPREVSX1JFRkNMS19TUkNfUDFQTEwgICAgICAgMCAgICAgICAKKyNkZWZpbmUgRU5DT0RFUl9SRUZDTEtfU1JDX1AyUExMICAgICAgIDEKKyNkZWZpbmUgRU5DT0RFUl9SRUZDTEtfU1JDX0RDUExMICAgICAgIDIKKyNkZWZpbmUgRU5DT0RFUl9SRUZDTEtfU1JDX0VYVENMSyAgICAgIDMKKyNkZWZpbmUgRU5DT0RFUl9SRUZDTEtfU1JDX0lOVkFMSUQgICAgIDB4RkYKKwogI2RlZmluZSBBVE9NX1NDQUxFUjEgICAgICAgICAgMAogI2RlZmluZSBBVE9NX1NDQUxFUjIgICAgICAgICAgMQogCkBAIC0xOTIsNiArMjAyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkltYWdlIGNhbid0IGJlIHVwZGF0ZWQsIHdoaWxlIERyaXZlciBuZWVkcyB0byBjYXJyeSB0aGUgbmV3IHRhYmxlISAqLwogfUFUT01fQ09NTU9OX1RBQkxFX0hFQURFUjsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQorLy8gU3RydWN0dXJlIHN0b3JlcyB0aGUgUk9NIGhlYWRlci4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1JPTV9IRUFERVIKIHsKICAgQVRPTV9DT01NT05fVEFCTEVfSEVBREVSCQlzSGVhZGVyOwpAQCAtMjIxLDYgKzIzNCw5IEBACiAJI2RlZmluZQlVU0hPUlQJdm9pZCoKICNlbmRpZgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisvLyBTdHJ1Y3R1cmVzIHVzZWQgaW4gQ29tbWFuZC5tdGIgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9NQVNURVJfTElTVF9PRl9DT01NQU5EX1RBQkxFU3sKICAgVVNIT1JUIEFTSUNfSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Z1bmN0aW9uIFRhYmxlLCB1c2VkIGJ5IHZhcmlvdXMgU1cgY29tcG9uZW50cyxsYXRlc3QgdmVyc2lvbiAxLjEKICAgVVNIT1JUIEdldERpc3BsYXlTdXJmYWNlU2l6ZTsgICAgICAgICAgICAgICAgICAvL0F0b21pYyBUYWJsZSwgIFVzZWQgYnkgQmlvcyB3aGVuIGVuYWJsaW5nIEhXIElDT04KQEAgLTMxMiw2ICszMjgsNyBAQAogI2RlZmluZSBTZXRVbmlwaHlJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgIEFTSUNfU3RhdGljUHdyTWd0U3RhdHVzQ2hhbmdlCiAjZGVmaW5lIEhQREludGVycnVwdFNlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgUmVhZEhXQXNzaXN0ZWRJMkNTdGF0dXMKICNkZWZpbmUgRW5hYmxlVkdBX0FjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTQ0xLT3Zlck1DTEtSYXRpbworI2RlZmluZSBHZXREaXNwT2JqZWN0SW5mbyAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZVlVViAKIAogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fTUFTVEVSX0NPTU1BTkRfVEFCTEUKIHsKQEAgLTM1Nyw2ICszNzQsMjQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKICNkZWZpbmUgQ09NUFVURV9NRU1PUllfUExMX1BBUkFNICAgICAgICAxCiAjZGVmaW5lIENPTVBVVEVfRU5HSU5FX1BMTF9QQVJBTSAgICAgICAgMgorI2RlZmluZSBBREpVU1RfTUNfU0VUVElOR19QQVJBTSAgICAgICAgIDMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQorLy8gU3RydWN0dXJlcyB1c2VkIGJ5IEFkanVzdE1lbW9yeUNvbnRyb2xsZXJUYWJsZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQordHlwZWRlZiBzdHJ1Y3QgX0FUT01fQURKVVNUX01FTU9SWV9DTE9DS19GUkVRCit7CisjaWYgQVRPTV9CSUdfRU5ESUFOCisgIFVMT05HIHVsUG9pbnRlclJldHVybkZsYWc6MTsgICAgICAvLyBCWVRFXzNbN109MSAtIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgcmlnaHQgRGF0YSBCbG9jazsgQllURV8zWzddPTAgLSBQcm9ncmFtIHRoZSByaWdodCBEYXRhIEJsb2NrIAorICBVTE9ORyB1bE1lbW9yeU1vZHVsZU51bWJlcjo3OyAgICAgLy8gQllURV8zWzY6MF0KKyAgVUxPTkcgdWxDbG9ja0ZyZXE6MjQ7CisjZWxzZQorICBVTE9ORyB1bENsb2NrRnJlcToyNDsKKyAgVUxPTkcgdWxNZW1vcnlNb2R1bGVOdW1iZXI6NzsgICAgIC8vIEJZVEVfM1s2OjBdCisgIFVMT05HIHVsUG9pbnRlclJldHVybkZsYWc6MTsgICAgICAvLyBCWVRFXzNbN109MSAtIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgcmlnaHQgRGF0YSBCbG9jazsgQllURV8zWzddPTAgLSBQcm9ncmFtIHRoZSByaWdodCBEYXRhIEJsb2NrIAorI2VuZGlmCit9QVRPTV9BREpVU1RfTUVNT1JZX0NMT0NLX0ZSRVE7CisjZGVmaW5lIFBPSU5URVJfUkVUVVJOX0ZMQUcgICAgICAgICAgICAgMHg4MAogCiB0eXBlZGVmIHN0cnVjdCBfQ09NUFVURV9NRU1PUllfRU5HSU5FX1BMTF9QQVJBTUVURVJTCiB7CkBAIC00NDAsNiArNDc1LDI2IEBACiAjZW5kaWYKIH1DT01QVVRFX01FTU9SWV9FTkdJTkVfUExMX1BBUkFNRVRFUlNfVjQ7CiAKK3R5cGVkZWYgc3RydWN0IF9DT01QVVRFX01FTU9SWV9FTkdJTkVfUExMX1BBUkFNRVRFUlNfVjUKK3sKKyAgdW5pb24KKyAgeworICAgIEFUT01fQ09NUFVURV9DTE9DS19GUkVRICB1bENsb2NrOyAgICAgICAgIC8vSW5wdXQgUGFyYW1ldGVyCisgICAgQVRPTV9TX01QTExfRkJfRElWSURFUiAgIHVsRmJEaXY7ICAgICAgICAgLy9PdXRwdXQgUGFyYW1ldGVyCisgIH07CisgIFVDSEFSICAgdWNSZWZEaXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PdXRwdXQgUGFyYW1ldGVyICAgICAgCisgIFVDSEFSICAgdWNQb3N0RGl2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PdXRwdXQgUGFyYW1ldGVyICAgICAgCisgIHVuaW9uCisgIHsKKyAgICBVQ0hBUiAgIHVjQ250bEZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAvL091dHB1dCBGbGFncworICAgIFVDSEFSICAgdWNJbnB1dEZsYWc7ICAgICAgICAgICAgICAgICAgICAgIC8vSW5wdXQgRmxhZ3MuIHVjSW5wdXRGbGFnWzBdIC0gU3Ryb2JlKDEpL1BlcmZvcm1hbmNlKDApIG1vZGUKKyAgfTsKKyAgVUNIQVIgICB1Y1Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgCit9Q09NUFVURV9NRU1PUllfRU5HSU5FX1BMTF9QQVJBTUVURVJTX1Y1OworCisvLyB1Y0lucHV0RmxhZworI2RlZmluZSBBVE9NX1BMTF9JTlBVVF9GTEFHX1BMTF9TVFJPQkVfTU9ERV9FTiAgMSAgIC8vIDEtU3Ryb2JlTW9kZSwgMC1QZXJmb3JtYW5jZU1vZGUKKwogdHlwZWRlZiBzdHJ1Y3QgX0RZTkFNSUNFX01FTU9SWV9TRVRUSU5HU19QQVJBTUVURVIKIHsKICAgQVRPTV9DT01QVVRFX0NMT0NLX0ZSRVEgdWxDbG9jazsKQEAgLTU4Myw2ICs2MzgsNyBAQAogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfTUFTSwkJCQkweDAxCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV8xXzYyR0haCQkweDAwCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV8yXzcwR0haCQkweDAxCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV81XzQwR0haCQkweDAyCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfTElOS19TRUxfTUFTSwkJCQkgIDB4MDQKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LQQkJCQkJCQkJICAweDAwCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfTElOS0IJCQkJCQkJCSAgMHgwNApAQCAtNjA4LDYgKzY2NCw5IEBACiAjZGVmaW5lIEFUT01fRU5DT0RFUl9NT0RFX1RWCQkJCQkJCQkJCQkxMwogI2RlZmluZSBBVE9NX0VOQ09ERVJfTU9ERV9DVgkJCQkJCQkJCQkJMTQKICNkZWZpbmUgQVRPTV9FTkNPREVSX01PREVfQ1JUCQkJCQkJCQkJCQkxNQorI2RlZmluZSBBVE9NX0VOQ09ERVJfTU9ERV9EVk8JCQkJCQkJCQkJCTE2CisjZGVmaW5lIEFUT01fRU5DT0RFUl9NT0RFX0RQX1NTVCAgICAgICAgICAgICAgICAgIEFUT01fRU5DT0RFUl9NT0RFX0RQICAgIC8vIEZvciBEUDEuMgorI2RlZmluZSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRFAxLjIKIAogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fRElHX0VOQ09ERVJfQ09ORklHX1YyCiB7CkBAIC02NjEsNiArNzIwLDcgQEAKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9MSU5LX1RSQUlOSU5HX1NUQVJUICAgICAgIDB4MDgKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9MSU5LX1RSQUlOSU5HX1BBVFRFUk4xICAgIDB4MDkKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9MSU5LX1RSQUlOSU5HX1BBVFRFUk4yICAgIDB4MGEKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9MSU5LX1RSQUlOSU5HX1BBVFRFUk4zICAgIDB4MTMKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9MSU5LX1RSQUlOSU5HX0NPTVBMRVRFICAgIDB4MGIKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PRkYgICAgICAgICAgICAgICAgIDB4MGMKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NNRF9EUF9WSURFT19PTiAgICAgICAgICAgICAgICAgIDB4MGQKQEAgLTY3MSwyNCArNzMxLDM0IEBACiAjZGVmaW5lIEFUT01fRU5DT0RFUl9TVEFUVVNfTElOS19UUkFJTklOR19DT01QTEVURSAgICAweDEwCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9TVEFUVVNfTElOS19UUkFJTklOR19JTkNPTVBMRVRFICAweDAwCiAKKy8vdWNUYWJsZUZvcm1hdFJldmlzaW9uPTEKKy8vdWNUYWJsZUNvbnRlbnRSZXZpc2lvbj0zCiAvLyBGb2xsb3dpbmcgZnVuY3Rpb24gRU5BQkxFIHN1Yi1mdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgZHJpdmVyIHdoZW4gVE1EUy9IRE1JL0xWRFMgaXMgdXNlZCwgZGlzYWJsZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgZHJpdmVyCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjMKIHsKICNpZiBBVE9NX0JJR19FTkRJQU4KICAgICBVQ0hBUiB1Y1Jlc2VydmVkMToxOwotICAgIFVDSEFSIHVjRGlnU2VsOjM7ICAgICAgICAgICAgIC8vID0wOiBESUdBL0IvQy9EL0UvRgorICAgIFVDSEFSIHVjRGlnU2VsOjM7ICAgICAgICAgICAgIC8vID0wLzEvMi8zLzQvNTogRElHMC8xLzIvMy80LzUgKEluIHJlZ2lzdGVyIHNwZWMgYWxzbyByZWZlcmVkIGFzIERJR0EvQi9DL0QvRS9GKQogICAgIFVDSEFSIHVjUmVzZXJ2ZWQ6MzsKICAgICBVQ0hBUiB1Y0RQTGlua1JhdGU6MTsgICAgICAgICAvLyA9MDogMS42MkdoeiwgPTE6IDIuN0doegogI2Vsc2UKICAgICBVQ0hBUiB1Y0RQTGlua1JhdGU6MTsgICAgICAgICAvLyA9MDogMS42MkdoeiwgPTE6IDIuN0doegogICAgIFVDSEFSIHVjUmVzZXJ2ZWQ6MzsKLSAgICBVQ0hBUiB1Y0RpZ1NlbDozOyAgICAgICAgICAgICAvLyA9MDogRElHQS9CL0MvRC9FL0YKKyAgICBVQ0hBUiB1Y0RpZ1NlbDozOyAgICAgICAgICAgICAvLyA9MC8xLzIvMy80LzU6IERJRzAvMS8yLzMvNC81IChJbiByZWdpc3RlciBzcGVjIGFsc28gcmVmZXJlZCBhcyBESUdBL0IvQy9EL0UvRikKICAgICBVQ0hBUiB1Y1Jlc2VydmVkMToxOwogI2VuZGlmCiB9QVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjM7CiAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFX01BU0sJCQkJMHgwMworI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMV82MkdIWgkJICAweDAwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8yXzcwR0haCQkgIDB4MDEKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSX1NFTAkJCQkJICAweDcwCi0KKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19ESUcwX0VOQ09ERVIJCQkJCSAgMHgwMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RJRzFfRU5DT0RFUgkJCQkJICAweDEwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRElHMl9FTkNPREVSCQkJCQkgIDB4MjAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19ESUczX0VOQ09ERVIJCQkJCSAgMHgzMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RJRzRfRU5DT0RFUgkJCQkJICAweDQwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRElHNV9FTkNPREVSCQkJCQkgIDB4NTAKIAogdHlwZWRlZiBzdHJ1Y3QgX0RJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMwogewpAQCAtNzA3LDYgKzc3Nyw1NiBAQAogICBVQ0hBUiB1Y1Jlc2VydmVkOwogfURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMzsKIAorLy91Y1RhYmxlRm9ybWF0UmV2aXNpb249MQorLy91Y1RhYmxlQ29udGVudFJldmlzaW9uPTQKKy8vIHN0YXJ0IGZyb20gTkkgICAgICAgICAgIAorLy8gRm9sbG93aW5nIGZ1bmN0aW9uIEVOQUJMRSBzdWItZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IGRyaXZlciB3aGVuIFRNRFMvSERNSS9MVkRTIGlzIHVzZWQsIGRpc2FibGUgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IGRyaXZlcgordHlwZWRlZiBzdHJ1Y3QgX0FUT01fRElHX0VOQ09ERVJfQ09ORklHX1Y0Cit7CisjaWYgQVRPTV9CSUdfRU5ESUFOCisgICAgVUNIQVIgdWNSZXNlcnZlZDE6MTsKKyAgICBVQ0hBUiB1Y0RpZ1NlbDozOyAgICAgICAgICAgICAvLyA9MC8xLzIvMy80LzU6IERJRzAvMS8yLzMvNC81IChJbiByZWdpc3RlciBzcGVjIGFsc28gcmVmZXJlZCBhcyBESUdBL0IvQy9EL0UvRikKKyAgICBVQ0hBUiB1Y1Jlc2VydmVkOjI7CisgICAgVUNIQVIgdWNEUExpbmtSYXRlOjI7ICAgICAgICAgLy8gPTA6IDEuNjJHaHosID0xOiAyLjdHaHosIDI9NS40R2h6ICAgIDw9IENoYW5nZWQgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KKyNlbHNlCisgICAgVUNIQVIgdWNEUExpbmtSYXRlOjI7ICAgICAgICAgLy8gPTA6IDEuNjJHaHosID0xOiAyLjdHaHosIDI9NS40R2h6ICAgIDw9IENoYW5nZWQgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KKyAgICBVQ0hBUiB1Y1Jlc2VydmVkOjI7CisgICAgVUNIQVIgdWNEaWdTZWw6MzsgICAgICAgICAgICAgLy8gPTAvMS8yLzMvNC81OiBESUcwLzEvMi8zLzQvNSAoSW4gcmVnaXN0ZXIgc3BlYyBhbHNvIHJlZmVyZWQgYXMgRElHQS9CL0MvRC9FL0YpCisgICAgVUNIQVIgdWNSZXNlcnZlZDE6MTsKKyNlbmRpZgorfUFUT01fRElHX0VOQ09ERVJfQ09ORklHX1Y0OworCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV9NQVNLCQkJCTB4MDMKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzFfNjJHSFoJCSAgMHgwMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfMl83MEdIWgkJICAweDAxCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV81XzQwR0haCQkgIDB4MDIKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9FTkNPREVSX1NFTAkJCQkJICAweDcwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRElHMF9FTkNPREVSCQkJCQkgIDB4MDAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9ESUcxX0VOQ09ERVIJCQkJCSAgMHgxMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RJRzJfRU5DT0RFUgkJCQkJICAweDIwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRElHM19FTkNPREVSCQkJCQkgIDB4MzAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9ESUc0X0VOQ09ERVIJCQkJCSAgMHg0MAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RJRzVfRU5DT0RFUgkJCQkJICAweDUwCisKK3R5cGVkZWYgc3RydWN0IF9ESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQKK3sKKyAgVVNIT1JUIHVzUGl4ZWxDbG9jazsgICAgICAvLyBpbiAxMEtIejsgZm9yIGJpb3MgY29udmVuaWVudAorICB1bmlvbnsKKyAgQVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjQgYWNDb25maWc7CisgIFVDSEFSIHVjQ29uZmlnOworICB9OworICBVQ0hBUiB1Y0FjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgVUNIQVIgdWNFbmNvZGVyTW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9MDogRFAgICBlbmNvZGVyICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPTE6IExWRFMgZW5jb2RlciAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9MjogRFZJICBlbmNvZGVyICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9MzogSERNSSBlbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPTQ6IFNEVk8gZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID01OiBEUCBhdWRpbworICBVQ0hBUiB1Y0xhbmVOdW07ICAgICAgICAgIC8vIGhvdyBtYW55IGxhbmVzIHRvIGVuYWJsZQorICBVQ0hBUiB1Y0JpdFBlckNvbG9yOyAgICAgIC8vIG9ubHkgdmFsaWQgZm9yIERQIG1vZGUgd2hlbiB1Y0FjdGlvbiA9IEFUT01fRU5DT0RFUl9DTURfU0VUVVAKKyAgVUNIQVIgdWNIUERfSUQ7ICAgICAgICAgICAvLyBIUEQgSUQgKDEtNikuID0wIG1lYW5zIHRvIHNraXAgSERQIHByb2dyYW1taW5nLiBOZXcgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KK31ESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQ7CiAKIC8vIGRlZmluZSB1Y0JpdFBlckNvbG9yOiAKICNkZWZpbmUgUEFORUxfQlBDX1VOREVGSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKQEAgLTg5Myw2ICsxMDEzLDcgQEAKICNlbmRpZgogfUFUT01fRElHX1RSQU5TTUlUVEVSX0NPTkZJR19WMzsKIAorCiB0eXBlZGVmIHN0cnVjdCBfRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMwogewogCXVuaW9uCkBAIC05MzYsNiArMTA1NywxNDkgQEAKICNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjNfVFJBTlNNSVRURVIyICAgICAgICAgICAJMHg0MAkvL0NECiAjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1YzX1RSQU5TTUlUVEVSMyAgICAgICAgICAgCTB4ODAJLy9FRgogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKKy8vIFN0cnVjdHVyZXMgdXNlZCBieSBVTklQSFlUcmFuc21pdHRlckNvbnRyb2xUYWJsZSBWMS40CisvLyBBU0lDIEZhbWlsaWVzOiBOSQorLy8gdWNUYWJsZUZvcm1hdFJldmlzaW9uPTEKKy8vIHVjVGFibGVDb250ZW50UmV2aXNpb249NAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQordHlwZWRlZiBzdHJ1Y3QgX0FUT01fRFBfVlNfTU9ERV9WNAoreworICBVQ0hBUiB1Y0xhbmVTZWw7CisgCXVuaW9uCisgCXsgIAorIAkgIFVDSEFSIHVjTGFuZVNldDsKKyAJICBzdHJ1Y3QgeworI2lmIEFUT01fQklHX0VORElBTgorIAkJICBVQ0hBUiB1Y1BPU1RfQ1VSU09SMjoyOyAgICAgICAgIC8vQml0Wzc6Nl0gUG9zdCBDdXJzb3IyIExldmVsICAgICAgPD0gTmV3IGluIFY0CisgCQkgIFVDSEFSIHVjUFJFX0VNUEhBU0lTOjM7ICAgICAgICAgLy9CaXRbNTozXSBQcmUtZW1waGFzaXMgTGV2ZWwKKyAJCSAgVUNIQVIgdWNWT0xUQUdFX1NXSU5HOjM7ICAgICAgICAvL0JpdFsyOjBdIFZvbHRhZ2UgU3dpbmcgTGV2ZWwKKyNlbHNlCisgCQkgIFVDSEFSIHVjVk9MVEFHRV9TV0lORzozOyAgICAgICAgLy9CaXRbMjowXSBWb2x0YWdlIFN3aW5nIExldmVsCisgCQkgIFVDSEFSIHVjUFJFX0VNUEhBU0lTOjM7ICAgICAgICAgLy9CaXRbNTozXSBQcmUtZW1waGFzaXMgTGV2ZWwKKyAJCSAgVUNIQVIgdWNQT1NUX0NVUlNPUjI6MjsgICAgICAgICAvL0JpdFs3OjZdIFBvc3QgQ3Vyc29yMiBMZXZlbCAgICAgIDw9IE5ldyBpbiBWNAorI2VuZGlmCisgCQl9OworIAl9OyAKK31BVE9NX0RQX1ZTX01PREVfVjQ7CisgCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9ESUdfVFJBTlNNSVRURVJfQ09ORklHX1Y0Cit7CisjaWYgQVRPTV9CSUdfRU5ESUFOCisgIFVDSEFSIHVjVHJhbnNtaXR0ZXJTZWw6MjsgICAgICAgICAvL2JpdDc6NjogPTAgRGlnIFRyYW5zbWl0dGVyIDEgKCBVbmlwaHkgQUIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgID0xIERpZyBUcmFuc21pdHRlciAyICggVW5pcGh5IENEICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICA9MiBEaWcgVHJhbnNtaXR0ZXIgMyAoIFVuaXBoeSBFRiApCisgIFVDSEFSIHVjUmVmQ2xrU291cmNlOjI7ICAgICAgICAgICAvL2JpdDU6NDogUFBMTDEgPTAsIFBQTEwyPTEsIERDUExMPTIsIEVYVF9DTEs9MyAgIDw9IE5ldworICBVQ0hBUiB1Y0VuY29kZXJTZWw6MTsgICAgICAgICAgICAgLy9iaXQzPTA6IERhdGEvQ2xrIHBhdGggc291cmNlIGZyb20gRElHQS9DL0UuID0xOiBEYXRhL2NsayBwYXRoIHNvdXJjZSBmcm9tIERJR0IvRC9GCisgIFVDSEFSIHVjTGlua1NlbDoxOyAgICAgICAgICAgICAgICAvL2JpdDI9MDogVW5pcGh5IExJTktBIG9yIEMgb3IgRSB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0wLiB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0xLCBpdCBtZWFucyBtYXN0ZXIgbGluayBvZiBkdWFsIGxpbmsgaXMgQSBvciBDIG9yIEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgID0xOiBVbmlwaHkgTElOS0Igb3IgRCBvciBGIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTAuIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTEsIGl0IG1lYW5zIG1hc3RlciBsaW5rIG9mIGR1YWwgbGluayBpcyBCIG9yIEQgb3IgRgorICBVQ0hBUiBmQ29oZXJlbnRNb2RlOjE7ICAgICAgICAgICAgLy9iaXQxPTE6IENvaGVyZW50IE1vZGUgKCBmb3IgRFZJL0hETUkgbW9kZSApCisgIFVDSEFSIGZEdWFsTGlua0Nvbm5lY3RvcjoxOyAgICAgICAvL2JpdDA9MTogRHVhbCBMaW5rIERWSSBjb25uZWN0b3IKKyNlbHNlCisgIFVDSEFSIGZEdWFsTGlua0Nvbm5lY3RvcjoxOyAgICAgICAvL2JpdDA9MTogRHVhbCBMaW5rIERWSSBjb25uZWN0b3IKKyAgVUNIQVIgZkNvaGVyZW50TW9kZToxOyAgICAgICAgICAgIC8vYml0MT0xOiBDb2hlcmVudCBNb2RlICggZm9yIERWSS9IRE1JIG1vZGUgKQorICBVQ0hBUiB1Y0xpbmtTZWw6MTsgICAgICAgICAgICAgICAgLy9iaXQyPTA6IFVuaXBoeSBMSU5LQSBvciBDIG9yIEUgd2hlbiBmRHVhbExpbmtDb25uZWN0b3I9MC4gd2hlbiBmRHVhbExpbmtDb25uZWN0b3I9MSwgaXQgbWVhbnMgbWFzdGVyIGxpbmsgb2YgZHVhbCBsaW5rIGlzIEEgb3IgQyBvciBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICA9MTogVW5pcGh5IExJTktCIG9yIEQgb3IgRiB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0wLiB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0xLCBpdCBtZWFucyBtYXN0ZXIgbGluayBvZiBkdWFsIGxpbmsgaXMgQiBvciBEIG9yIEYKKyAgVUNIQVIgdWNFbmNvZGVyU2VsOjE7ICAgICAgICAgICAgIC8vYml0Mz0wOiBEYXRhL0NsayBwYXRoIHNvdXJjZSBmcm9tIERJR0EvQy9FLiA9MTogRGF0YS9jbGsgcGF0aCBzb3VyY2UgZnJvbSBESUdCL0QvRgorICBVQ0hBUiB1Y1JlZkNsa1NvdXJjZToyOyAgICAgICAgICAgLy9iaXQ1OjQ6IFBQTEwxID0wLCBQUExMMj0xLCBEQ1BMTD0yLCBFWFRfQ0xLPTMgICA8PSBOZXcKKyAgVUNIQVIgdWNUcmFuc21pdHRlclNlbDoyOyAgICAgICAgIC8vYml0Nzo2OiA9MCBEaWcgVHJhbnNtaXR0ZXIgMSAoIFVuaXBoeSBBQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgPTEgRGlnIFRyYW5zbWl0dGVyIDIgKCBVbmlwaHkgQ0QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgID0yIERpZyBUcmFuc21pdHRlciAzICggVW5pcGh5IEVGICkKKyNlbmRpZgorfUFUT01fRElHX1RSQU5TTUlUVEVSX0NPTkZJR19WNDsKKwordHlwZWRlZiBzdHJ1Y3QgX0RJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQKK3sKKyAgdW5pb24KKyAgeworICAgIFVTSE9SVCB1c1BpeGVsQ2xvY2s7CQkvLyBpbiAxMEtIejsgZm9yIGJpb3MgY29udmVuaWVudAorICAgIFVTSE9SVCB1c0luaXRJbmZvOwkJCS8vIHdoZW4gaW5pdCB1bmlwaHksbG93ZXIgOGJpdCBpcyB1c2VkIGZvciBjb25uZWN0b3IgdHlwZSBkZWZpbmVkIGluIG9iamVjdGlkLmgKKyAgICBBVE9NX0RQX1ZTX01PREVfVjQgYXNNb2RlOyAvLyBEUCBWb2x0YWdlIHN3aW5nIG1vZGUgICAgIFJlZGVmaW5lZCBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorICB9OworICB1bmlvbgorICB7CisgIEFUT01fRElHX1RSQU5TTUlUVEVSX0NPTkZJR19WNCBhY0NvbmZpZzsKKyAgVUNIQVIgdWNDb25maWc7CisgIH07CisgIFVDSEFSIHVjQWN0aW9uOwkJCQkgICAgLy8gZGVmaW5lIGFzIEFUT01fVFJBTlNNSVRFUl9BQ1RJT05fWFhYCSAgICAgICAgICAgICAgICAgICAgICAgIAorICBVQ0hBUiB1Y0xhbmVOdW07CisgIFVDSEFSIHVjUmVzZXJ2ZWRbM107Cit9RElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WNDsKKworLy91Y0NvbmZpZyAKKy8vQml0MAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9EVUFMX0xJTktfQ09OTkVDVE9SCQkJMHgwMQorLy9CaXQxCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X0NPSEVSRU5UCQkJCSAgICAgICAgICAweDAyCisvL0JpdDIKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfTElOS19TRUxfTUFTSwkJICAgICAgICAweDA0CisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X0xJTktBICAJCQkgICAgICAgICAgICAweDAwCQkJCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X0xJTktCCQkJCSAgICAgICAgICAgIDB4MDQKKy8vIEJpdDMKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfRU5DT0RFUl9TRUxfTUFTSwkgICAgICAgIDB4MDgKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfRElHMV9FTkNPREVSCQkgICAgICAgICAgMHgwMAkJCQkgCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X0RJRzJfRU5DT0RFUgkJICAgICAgICAgIDB4MDgJCQkJCisvLyBCaXQ1OjQKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfUkVGQ0xLX1NFTF9NQVNLIAkgICAgICAgIDB4MzAKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfUDFQTEwgICAgICAgICAJCSAgICAgICAgMHgwMAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9QMlBMTAkJICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfRENQTEwJCSAgICAgICAgICAgICAgICAweDIwICAgLy8gTmV3IGluIF9WNAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9SRUZDTEtfU1JDX0VYVCAgICAgICAgICAgMHgzMCAgIC8vIENoYW5nZWQgY29tcGFyaW5nIHRvIFYzCisvLyBCaXQ3OjYKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfVFJBTlNNSVRURVJfU0VMX01BU0sgICAgIDB4QzAKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfVFJBTlNNSVRURVIxICAgICAgICAgICAJMHgwMAkvL0FCCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X1RSQU5TTUlUVEVSMiAgICAgICAgICAgCTB4NDAJLy9DRAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9UUkFOU01JVFRFUjMgICAgICAgICAgIAkweDgwCS8vRUYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisvLyBTdHJ1Y3R1cmVzIHVzZWQgYnkgRXh0ZXJuYWxFbmNvZGVyQ29udHJvbFRhYmxlIFYxLjMKKy8vIEFTSUMgRmFtaWxpZXM6IEV2ZXJncmVlbiwgTGxhbm8sIE5JCisvLyB1Y1RhYmxlRm9ybWF0UmV2aXNpb249MQorLy8gdWNUYWJsZUNvbnRlbnRSZXZpc2lvbj0zCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisKK3R5cGVkZWYgc3RydWN0IF9FWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMworeworICB1bmlvbnsKKyAgVVNIT1JUIHVzUGl4ZWxDbG9jazsgICAgICAvLyBwaXhlbCBjbG9jayBpbiAxMEtoeiwgdmFsaWQgd2hlbiB1Y0FjdGlvbj1TRVRVUC9FTkFCTEVfT1VUUFVUIAorICBVU0hPUlQgdXNDb25uZWN0b3JJZDsgICAgIC8vIGNvbm5lY3RvciBpZCwgdmFsaWQgd2hlbiB1Y0FjdGlvbiA9IElOSVQKKyAgfTsKKyAgVUNIQVIgIHVjQ29uZmlnOyAgICAgICAgICAvLyBpbmRpY2F0ZSB3aGljaCBlbmNvZGVyLCBhbmQgRFAgbGluayByYXRlIHdoZW4gdWNBY3Rpb24gPSBTRVRVUC9FTkFCTEVfT1VUUFVUICAKKyAgVUNIQVIgIHVjQWN0aW9uOyAgICAgICAgICAvLyAKKyAgVUNIQVIgIHVjRW5jb2Rlck1vZGU7ICAgICAvLyBlbmNvZGVyIG1vZGUsIG9ubHkgdXNlZCB3aGVuIHVjQWN0aW9uID0gU0VUVVAvRU5BQkxFX09VVFBVVAorICBVQ0hBUiAgdWNMYW5lTnVtOyAgICAgICAgIC8vIGxhbmUgbnVtYmVyLCBvbmx5IHVzZWQgd2hlbiB1Y0FjdGlvbiA9IFNFVFVQL0VOQUJMRV9PVVRQVVQgIAorICBVQ0hBUiAgdWNCaXRQZXJDb2xvcjsgICAgIC8vIG91dHB1dCBiaXQgcGVyIGNvbG9yLCBvbmx5IHZhbGlkIHdoZW4gdWNBY3Rpb24gPSBTRVRVUC9FTkFCTEVfT1VUUFVUIGFuZCB1Y0VuY29kZU1vZGU9IERQCisgIFVDSEFSICB1Y1Jlc2VydmVkOyAgICAgICAgCit9RVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjM7CisKKy8vIHVjQWN0aW9uCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RJU0FCTEVfT1VUUFVUICAgICAgICAgMHgwMAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkFCTEVfT1VUUFVUICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9JTklUICAgICAgICAgICAweDA3CisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfU0VUVVAgICAgICAgICAgMHgwZgorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HX09GRiAgIDB4MTAKKyNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9CTEFOS0lORyAgICAgICAweDExCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0RBQ0xPQURfREVURUNUSU9OICAgICAgMHgxMgorCisvLyB1Y0NvbmZpZworI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFX01BU0sJCQkJMHgwMworI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzFfNjJHSFoJCSAgMHgwMAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzJfNzBHSFoJCSAgMHgwMQorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzVfNDBHSFoJCSAgMHgwMgorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSX1NFTF9NQVNLCQkgICAgMHg3MAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMQkJICAgICAgICAgICAgMHgwMAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMgkJICAgICAgICAgICAgMHgxMAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMwkJICAgICAgICAgICAgMHgyMAorCit0eXBlZGVmIHN0cnVjdCBfRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjMKK3sKKyAgRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjMgc0V4dEVuY29kZXI7CisgIFVMT05HIHVsUmVzZXJ2ZWRbMl07Cit9RVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjM7CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQogLy8gU3RydWN0dXJlcyB1c2VkIGJ5IERBQzFPdXB1dENvbnRyb2xUYWJsZQogLy8gICAgICAgICAgICAgICAgICAgIERBQzJPdXB1dENvbnRyb2xUYWJsZQpAQCAtMTE0Miw2ICsxNDA2LDcgQEAKICNkZWZpbmUgUElYRUxfQ0xPQ0tfVjRfTUlTQ19TU19FTkFCTEUgICAgICAgICAgICAgICAweDEwCiAjZGVmaW5lIFBJWEVMX0NMT0NLX1Y0X01JU0NfQ09IRVJFTlRfTU9ERSAgICAgICAgICAgMHgyMAogCisKIHR5cGVkZWYgc3RydWN0IF9QSVhFTF9DTE9DS19QQVJBTUVURVJTX1YzCiB7CiAgIFVTSE9SVCB1c1BpeGVsQ2xvY2s7ICAgICAgICAgICAgICAgIC8vIGluIDEwa0h6IHVuaXQ7IGZvciBiaW9zIGNvbnZlbmllbnQgPSAoUmVmQ2xrKkZCX0RpdikvKFJlZl9EaXYqUG9zdF9EaXYpCkBAIC0xMjAyLDYgKzE0NjcsNTUgQEAKICNkZWZpbmUgUElYRUxfQ0xPQ0tfVjVfTUlTQ19IRE1JXzMyQlBQICAgICAgICAgICAgICAweDA4CiAjZGVmaW5lIFBJWEVMX0NMT0NLX1Y1X01JU0NfUkVGX0RJVl9TUkMgICAgICAgICAgICAgMHgxMAogCit0eXBlZGVmIHN0cnVjdCBfQ1JUQ19QSVhFTF9DTE9DS19GUkVRCit7CisjaWYgQVRPTV9CSUdfRU5ESUFOCisgIFVMT05HICB1Y0NSVEM6ODsgICAgICAgICAgICAvLyBBVE9NX0NSVEMxfjYsIGluZGljYXRlIHRoZSBDUlRDIGNvbnRyb2xsZXIgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcml2ZSB0aGUgcGl4ZWwgY2xvY2suIG5vdCB1c2VkIGZvciBEQ1BMTCBjYXNlLgorICBVTE9ORyAgdWxQaXhlbENsb2NrOjI0OyAgICAgLy8gdGFyZ2V0IHRoZSBwaXhlbCBjbG9jayB0byBkcml2ZSB0aGUgQ1JUQyB0aW1pbmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCBtZWFucyBkaXNhYmxlIFBQTEwvRENQTEwuIEV4cGFuZGVkIHRvIDI0IGJpdHMgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24uCisjZWxzZQorICBVTE9ORyAgdWxQaXhlbENsb2NrOjI0OyAgICAgLy8gdGFyZ2V0IHRoZSBwaXhlbCBjbG9jayB0byBkcml2ZSB0aGUgQ1JUQyB0aW1pbmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCBtZWFucyBkaXNhYmxlIFBQTEwvRENQTEwuIEV4cGFuZGVkIHRvIDI0IGJpdHMgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24uCisgIFVMT05HICB1Y0NSVEM6ODsgICAgICAgICAgICAvLyBBVE9NX0NSVEMxfjYsIGluZGljYXRlIHRoZSBDUlRDIGNvbnRyb2xsZXIgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcml2ZSB0aGUgcGl4ZWwgY2xvY2suIG5vdCB1c2VkIGZvciBEQ1BMTCBjYXNlLgorI2VuZGlmCit9Q1JUQ19QSVhFTF9DTE9DS19GUkVROworCit0eXBlZGVmIHN0cnVjdCBfUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WNgoreworICB1bmlvbnsKKyAgICBDUlRDX1BJWEVMX0NMT0NLX0ZSRVEgdWxDcnRjUGNsa0ZyZXE7ICAgIC8vIHBpeGVsIGNsb2NrIGFuZCBDUlRDIGlkIGZyZXF1ZW5jeSAKKyAgICBVTE9ORyB1bERpc3BFbmdDbGtGcmVxOyAgICAgICAgICAgICAgICAgIC8vIGRpc3BjbGsgZnJlcXVlbmN5CisgIH07CisgIFVTSE9SVCB1c0ZiRGl2OyAgICAgICAgICAgIC8vIGZlZWRiYWNrIGRpdmlkZXIgaW50ZWdlciBwYXJ0LiAKKyAgVUNIQVIgIHVjUG9zdERpdjsgICAgICAgICAgLy8gcG9zdCBkaXZpZGVyLiAKKyAgVUNIQVIgIHVjUmVmRGl2OyAgICAgICAgICAgLy8gUmVmZXJlbmNlIGRpdmlkZXIKKyAgVUNIQVIgIHVjUHBsbDsgICAgICAgICAgICAgLy8gQVRPTV9QUExMMS9BVE9NX1BQTEwyL0FUT01fRENQTEwKKyAgVUNIQVIgIHVjVHJhbnNtaXR0ZXJJRDsgICAgLy8gQVNJQyBlbmNvZGVyIGlkIGRlZmluZWQgaW4gb2JqZWN0SWQuaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHdoaWNoIGdyYXBoaWMgZW5jb2RlciB3aWxsIGJlIHVzZWQuIAorICBVQ0hBUiAgdWNFbmNvZGVyTW9kZTsgICAgICAvLyBFbmNvZGVyIG1vZGU6IAorICBVQ0hBUiAgdWNNaXNjSW5mbzsgICAgICAgICAvLyBiaXRbMF09IEZvcmNlIHByb2dyYW0gUFBMTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0WzFdPSB3aGVuIFZHQSB0aW1pbmcgaXMgdXNlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdFszOjJdPSBIRE1JIHBhbmVsIGJpdCBkZXB0aDogPTA6IDI0YnBwID0xOjMwYnBwLCA9MjozMmJwcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRbNF09IFJlZkNsb2NrIHNvdXJjZSBmb3IgUFBMTC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0wOiBYVExBSU4oIGRlZmF1bHQgbW9kZSApCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPTE6IG90aGVyIGV4dGVybmFsIGNsb2NrIHNvdXJjZSwgd2hpY2ggaXMgcHJlLWRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYnkgVkJJT1MgZGVwZW5kIG9uIHRoZSBmZWF0dXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRbNzo1XTogcmVzZXJ2ZWQuCisgIFVMT05HICB1bEZiRGl2RGVjRnJhYzsgICAgIC8vIDIwIGJpdCBmZWVkYmFjayBkaXZpZGVyIGRlY2ltYWwgZnJhY3Rpb24gcGFydCwgcmFuZ2UgZnJvbSAxfjk5OTk5OSAoIDAuMDAwMDAxIHRvIDAuOTk5OTk5ICkKKworfVBJWEVMX0NMT0NLX1BBUkFNRVRFUlNfVjY7CisKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19GT1JDRV9QUk9HX1BQTEwJCQkJCTB4MDEKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19WR0FfTU9ERQkJCQkJCQkJMHgwMgorI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfQlBQX01BU0sgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19IRE1JXzI0QlBQICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV8zNkJQUCAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfMzBCUFAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19IRE1JXzQ4QlBQICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIFBJWEVMX0NMT0NLX1Y2X01JU0NfUkVGX0RJVl9TUkMgICAgICAgICAgICAgMHgxMAorCiB0eXBlZGVmIHN0cnVjdCBfR0VUX0RJU1BfUExMX1NUQVRVU19JTlBVVF9QQVJBTUVURVJTX1YyCiB7CiAgIFBJWEVMX0NMT0NLX1BBUkFNRVRFUlNfVjMgc0Rpc3BDbGtJbnB1dDsKQEAgLTEyNDEsMTAgKzE1NTUsMTEgQEAKIHR5cGVkZWYgc3RydWN0IF9BREpVU1RfRElTUExBWV9QTExfSU5QVVRfUEFSQU1FVEVSU19WMwogewogCVVTSE9SVCB1c1BpeGVsQ2xvY2s7ICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgcGl4ZWwgY2xvY2sKLQlVQ0hBUiB1Y1RyYW5zbWl0dGVySUQ7ICAgICAgICAgICAgICAgICAgLy8gdHJhbnNtaXR0ZXIgaWQgZGVmaW5lZCBpbiBvYmplY3RpZC5oCisJVUNIQVIgdWNUcmFuc21pdHRlcklEOyAgICAgICAgICAgICAgICAgIC8vIEdQVSB0cmFuc21pdHRlciBpZCBkZWZpbmVkIGluIG9iamVjdGlkLmgKIAlVQ0hBUiB1Y0VuY29kZU1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb2RlciBtb2RlOiBDUlQsIExWRFMsIERQLCBUTURTIG9yIEhETUkKICAgVUNIQVIgdWNEaXNwUGxsQ29uZmlnOyAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBwbGwgY29uZmlndXJlIHBhcmFtZXRlciBkZWZpbmVkIGFzIGZvbGxvd2luZyBESVNQUExMX0NPTkZJR19YWFhYCi0JVUNIQVIgdWNSZXNlcnZlZFszXTsKKyAgVUNIQVIgdWNFeHRUcmFuc21pdHRlcklEOyAgICAgICAgICAgICAgIC8vIGV4dGVybmFsIGVuY29kZXIgaWQuCisJVUNIQVIgdWNSZXNlcnZlZFsyXTsKIH1BREpVU1RfRElTUExBWV9QTExfSU5QVVRfUEFSQU1FVEVSU19WMzsKIAogLy8gdXNEaXNwUGxsQ29uZmlnIHYxLjIgZm9yIFJvYWRSdW5uZXIKQEAgLTEzMTQsNyArMTYyOSw3IEBACiB0eXBlZGVmIHN0cnVjdCBfUkVBRF9FRElEX0ZST01fSFdfSTJDX0RBVEFfUEFSQU1FVEVSUwogewogICBVU0hPUlQgICAgdXNQcmVzY2FsZTsgICAgICAgICAvL1JhdGlvIGJldHdlZW4gRW5naW5lIGNsb2NrIGFuZCBJMkMgY2xvY2sKLSAgVVNIT1JUICAgIHVzVlJBTUFkZHJlc3M7ICAgICAgLy9BZHJlc3MgaW4gRnJhbWUgQnVmZmVyIHdoZXJlIHRvIHBhY2UgcmF3IEVESUQKKyAgVVNIT1JUICAgIHVzVlJBTUFkZHJlc3M7ICAgICAgLy9BZGRyZXNzIGluIEZyYW1lIEJ1ZmZlciB3aGVyZSB0byBwYWNlIHJhdyBFRElECiAgIFVTSE9SVCAgICB1c1N0YXR1czsgICAgICAgICAgIC8vV2hlbiB1c2Ugb3V0cHV0OiBsb3dlciBieXRlIEVESUQgY2hlY2tzdW0sIGhpZ2ggYnl0ZSBoYXJkd2FyZSBzdGF0dXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9XSGVuIHVzZSBpbnB1dDogIGxvd2VyIGJ5dGUgYXMgJ2J5dGUgdG8gcmVhZCc6Y3VycmVudGx5IGxpbWl0ZWQgdG8gMTI4Ynl0ZSBvciAxYnl0ZQogICBVQ0hBUiAgICAgdWNTbGF2ZUFkZHI7ICAgICAgICAvL1JlYWQgZnJvbSB3aGljaCBzbGF2ZQpAQCAtMTM1OCw2ICsxNjczLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgU1BFRURfRkFOX0NPTlRST0xfUFNfQUxMT0NBVElPTiAgIFdSSVRFX09ORV9CWVRFX0hXX0kyQ19EQVRBX1BBUkFNRVRFUlMKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCiAvLyBTdHJ1Y3R1cmVzIHVzZWQgYnkgUG93ZXJDb25uZWN0b3JEZXRlY3Rpb25UYWJsZQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQpAQCAtMTQzOCw2ICsxNzU0LDMxIEBACiAjZGVmaW5lIEFUT01fUFBMTF9TU19BTU9VTlRfVjJfTkZSQUNfTUFTSyAgICAgMHgwRjAwCiAjZGVmaW5lIEFUT01fUFBMTF9TU19BTU9VTlRfVjJfTkZSQUNfU0hJRlQgICAgOAogCisvLyBVc2VkIGJ5IERDRTUuMAorIHR5cGVkZWYgc3RydWN0IF9FTkFCTEVfU1BSRUFEX1NQRUNUUlVNX09OX1BQTExfVjMKK3sKKyAgVVNIT1JUICB1c1NwcmVhZFNwZWN0cnVtQW1vdW50RnJhYzsgICAvLyBTU19BTU9VTlRfRFNGUkFDIE5ldyBpbiBEQ0U1LjAKKyAgVUNIQVIgICB1Y1NwcmVhZFNwZWN0cnVtVHlwZTsJICAgICAgICAvLyBCaXRbMF06IDAtRG93biBTcHJlYWQsMS1DZW50ZXIgU3ByZWFkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXRbMV06IDEtRXh0LiAwLUludC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0WzM6Ml06ID0wIFAxUExMID0xIFAyUExMID0yIERDUExMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0c1s3OjRdIHJlc2VydmVkCisgIFVDSEFSICAgdWNFbmFibGU7CSAgICAgICAgICAgICAgICAgICAgLy8gQVRPTV9FTkFCTEUgb3IgQVRPTV9ESVNBQkxFCisgIFVTSE9SVCAgdXNTcHJlYWRTcGVjdHJ1bUFtb3VudDsgICAgICAJLy8gSW5jbHVkZXMgU1NfQU1PVU5UX0ZCRElWWzc6MF0gYW5kIFNTX0FNT1VOVF9ORlJBQ19TTElQWzExOjhdICAgIAorICBVU0hPUlQgIHVzU3ByZWFkU3BlY3RydW1TdGVwOwkgICAgICAgIC8vIFNTX1NURVBfU0laRV9EU0ZSQUMKK31FTkFCTEVfU1BSRUFEX1NQRUNUUlVNX09OX1BQTExfVjM7CisgICAgCisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX0RPV05fU1BSRUFEICAgICAgMHgwMAorI2RlZmluZSBBVE9NX1BQTExfU1NfVFlQRV9WM19DRU5UUkVfU1BSRUFEICAgIDB4MDEKKyNkZWZpbmUgQVRPTV9QUExMX1NTX1RZUEVfVjNfRVhUX1NQUkVBRCAgICAgICAweDAyCisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX1BQTExfU0VMX01BU0sgICAgMHgwYworI2RlZmluZSBBVE9NX1BQTExfU1NfVFlQRV9WM19QMVBMTCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX1RZUEVfVjNfUDJQTEwgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX0RDUExMICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBVE9NX1BQTExfU1NfQU1PVU5UX1YzX0ZCRElWX01BU0sgICAgIDB4MDBGRgorI2RlZmluZSBBVE9NX1BQTExfU1NfQU1PVU5UX1YzX0ZCRElWX1NISUZUICAgIDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX0FNT1VOVF9WM19ORlJBQ19NQVNLICAgICAweDBGMDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX0FNT1VOVF9WM19ORlJBQ19TSElGVCAgICA4CisKICNkZWZpbmUgRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1BTX0FMTE9DQVRJT04gIEVOQUJMRV9TUFJFQURfU1BFQ1RSVU1fT05fUFBMTAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzA2LDcgKzIwNDcsNyBAQAogICBVU0hPUlQgICAgICAgIFN0YW5kYXJkVkVTQV9UaW1pbmc7ICAgICAgLy8gT25seSB1c2VkIGJ5IEJpb3MKICAgVVNIT1JUICAgICAgICBGaXJtd2FyZUluZm87ICAgICAgICAgICAgIC8vIFNoYXJlZCBieSB2YXJpb3VzIFNXIGNvbXBvbmVudHMsbGF0ZXN0IHZlcnNpb24gMS40CiAgIFVTSE9SVCAgICAgICAgREFDX0luZm87ICAgICAgICAgICAgICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMAotICBVU0hPUlQgICAgICAgIExWRFNfSW5mbzsgICAgICAgICAgICAgICAgLy8gU2hhcmVkIGJ5IHZhcmlvdXMgU1cgY29tcG9uZW50cyxsYXRlc3QgdmVyc2lvbiAxLjEgCisgIFVTSE9SVCAgICAgICAgTENEX0luZm87ICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgYnkgdmFyaW91cyBTVyBjb21wb25lbnRzLGxhdGVzdCB2ZXJzaW9uIDEuMywgd2FzIGNhbGxlZCBMVkRTX0luZm8gCiAgIFVTSE9SVCAgICAgICAgVE1EU19JbmZvOyAgICAgICAgICAgICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMAogICBVU0hPUlQgICAgICAgIEFuYWxvZ1RWX0luZm87ICAgICAgICAgICAgLy8gU2hhcmVkIGJ5IHZhcmlvdXMgU1cgY29tcG9uZW50cyxsYXRlc3QgdmVyc2lvbiAxLjEgCiAgIFVTSE9SVCAgICAgICAgU3VwcG9ydGVkRGV2aWNlc0luZm87ICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMApAQCAtMTczNiwxMiArMjA3NywxNiBAQAogCVVTSE9SVAkJCQlQb3dlclNvdXJjZUluZm87CQkJCQkvLyBTaGFyZWQgYnkgdmFyaW91cyBTVyBjb21wb25lbnRzLCBsYXRlc3QgdmVyc29pbiAxLjEKIH1BVE9NX01BU1RFUl9MSVNUX09GX0RBVEFfVEFCTEVTOwogCisvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJsZSAKKyNkZWZpbmUgTFZEU19JbmZvICAgICAgICAgICAgICAgIExDRF9JbmZvCisKIHR5cGVkZWYgc3RydWN0IF9BVE9NX01BU1RFUl9EQVRBX1RBQkxFCiB7IAogICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgc0hlYWRlcjsgIAogICBBVE9NX01BU1RFUl9MSVNUX09GX0RBVEFfVEFCTEVTICAgTGlzdE9mRGF0YVRhYmxlczsKIH1BVE9NX01BU1RFUl9EQVRBX1RBQkxFOwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vIFN0cnVjdHVyZSB1c2VkIGluIE11bHRpbWVkaWFDYXBhYmlsaXR5SW5mb1RhYmxlCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCkBAIC0xNzc2LDYgKzIxMjEsNyBAQAogICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgdWNWaWRlb0lucHV0NEluZm87Ly8gVmlkZW8gSW5wdXQgNCBUeXBlICgxOjApIEYvQiBzZXR0aW5nICgyKSBwaHlzaWNhbCBjb25uZWN0b3IgSUQgKDU6MykgcmVzZXJ2ZWQgKDc6NikKIH1BVE9NX01VTFRJTUVESUFfQ09ORklHX0lORk87CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQogLy8gU3RydWN0dXJlcyB1c2VkIGluIEZpcm13YXJlSW5mb1RhYmxlCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCkBAIC0yMDMxLDggKzIzNzcsNDcgQEAKICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1Jlc2VydmVkNFszXTsKIH1BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMTsKIAorLy90aGUgc3RydWN0dXJlIGJlbG93IHRvIGJlIHVzZWQgZnJvbSBOSQorLy91Y1RhYmxlRm9ybWF0UmV2aXNpb249MgorLy91Y1RhYmxlQ29udGVudFJldmlzaW9uPTIKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMgoreworICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgICAgICAgIHNIZWFkZXI7IAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsRmlybXdhcmVSZXZpc2lvbjsKKyAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICB1bERlZmF1bHRFbmdpbmVDbG9jazsgICAgICAgLy9JbiAxMEtoeiB1bml0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxEZWZhdWx0TWVtb3J5Q2xvY2s7ICAgICAgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWRbMl07CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDE7ICAgICAgICAgICAgICAgIC8vV2FzIHVsTWF4RW5naW5lQ2xvY2tQTExfT3V0cHV0OyAvL0luIDEwS2h6IHVuaXQqCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDI7ICAgICAgICAgICAgICAgIC8vV2FzIHVsTWF4TWVtb3J5Q2xvY2tQTExfT3V0cHV0OyAvL0luIDEwS2h6IHVuaXQqCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxNYXhQaXhlbENsb2NrUExMX091dHB1dDsgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQmluYXJ5QWx0ZXJlZEluZm87ICAgICAgICAvL1dhcyB1bEFTSUNNYXhFbmdpbmVDbG9jayAgPworICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsRGVmYXVsdERpc3BFbmdpbmVDbGtGcmVxOyAvL0luIDEwS2h6IHVuaXQuIFRoaXMgaXMgdGhlIGZyZXF1ZW5jeSBiZWZvcmUgRENEVE8sIGNvcnJlc3BvbmRpbmcgdG8gdXNCb290VXBWRERDVm9sdGFnZS4gICAgICAgICAgCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDM7ICAgICAgICAgICAgICAgIC8vV2FzIHVjQVNJQ01heFRlbXBlcmF0dXJlOworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTWluQWxsb3dlZEJMX0xldmVsOworICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQm9vdFVwVkREQ1ZvbHRhZ2U7ICAgICAgICAvL0luIE1WIHVuaXQKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c0xjZE1pblBpeGVsQ2xvY2tQTExfT3V0cHV0OyAvLyBJbiBNSHogdW5pdAorICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzTGNkTWF4UGl4ZWxDbG9ja1BMTF9PdXRwdXQ7IC8vIEluIE1IeiB1bml0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgIC8vV2FzIHVsQXNpY01heGltdW1Wb2x0YWdlCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxNaW5QaXhlbENsb2NrUExMX091dHB1dDsgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAvL1dhcyB1c01pbkVuZ2luZUNsb2NrUExMX0lucHV0IGFuZCB1c01heEVuZ2luZUNsb2NrUExMX0lucHV0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDY7ICAgICAgICAgICAgICAgIC8vV2FzIHVzTWluRW5naW5lQ2xvY2tQTExfT3V0cHV0IGFuZCB1c01pbk1lbW9yeUNsb2NrUExMX0lucHV0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDc7ICAgICAgICAgICAgICAgIC8vV2FzIHVzTWF4TWVtb3J5Q2xvY2tQTExfSW5wdXQgYW5kIHVzTWluTWVtb3J5Q2xvY2tQTExfT3V0cHV0CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNSZXNlcnZlZDExOyAgICAgICAgICAgICAgIC8vV2FzIHVzTWF4UGl4ZWxDbG9jazsgIC8vSW4gMTBLaHogdW5pdCwgTWF4LiAgUGNsayB1c2VkIG9ubHkgZm9yIERBQworICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzTWluUGl4ZWxDbG9ja1BMTF9JbnB1dDsgICAvL0luIDEwS2h6IHVuaXQKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c01heFBpeGVsQ2xvY2tQTExfSW5wdXQ7ICAgLy9JbiAxMEtoeiB1bml0CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNCb290VXBWRERDSVZvbHRhZ2U7ICAgICAgIC8vSW4gdW5pdCBvZiBtdjsgV2FzIHVzTWluUGl4ZWxDbG9ja1BMTF9PdXRwdXQ7CisgIEFUT01fRklSTVdBUkVfQ0FQQUJJTElUWV9BQ0NFU1MgdXNGaXJtd2FyZUNhcGFiaWxpdHk7CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDb3JlUmVmZXJlbmNlQ2xvY2s7ICAgICAgIC8vSW4gMTBLaHogdW5pdAkKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c01lbW9yeVJlZmVyZW5jZUNsb2NrOyAgICAgLy9JbiAxMEtoeiB1bml0CQorICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzVW5pcGh5RFBNb2RlRXh0Q2xrRnJlcTsgICAvL0luIDEwS2h6IHVuaXQsIGlmIGl0IGlzIDAsIEluIERQIE1vZGUgVW5pcGh5IElucHV0IGNsb2NrIGZyb20gaW50ZXJuYWwgUFBMTCwgb3RoZXJ3aXNlIElucHV0IGNsb2NrIGZyb20gZXh0ZXJuYWwgU3ByZWFkIGNsb2NrCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNNZW1vcnlNb2R1bGVfSUQ7ICAgICAgICAgIC8vSW5kaWNhdGUgd2hhdCBpcyB0aGUgYm9hcmQgZGVzaWduCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDlbM107CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNCb290VXBNVkREQ1ZvbHRhZ2U7ICAgICAgIC8vSW4gdW5pdCBvZiBtdjsgV2FzIHVzTWluUGl4ZWxDbG9ja1BMTF9PdXRwdXQ7CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNSZXNlcnZlZDEyOworICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWQxMFszXTsgICAgICAgICAgICAvLyBOZXcgYWRkZWQgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KK31BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMjsKIAotI2RlZmluZSBBVE9NX0ZJUk1XQVJFX0lORk9fTEFTVCAgQVRPTV9GSVJNV0FSRV9JTkZPX1YyXzEKKyNkZWZpbmUgQVRPTV9GSVJNV0FSRV9JTkZPX0xBU1QgIEFUT01fRklSTVdBUkVfSU5GT19WMl8yCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vIFN0cnVjdHVyZXMgdXNlZCBpbiBJbnRlZ3JhdGVkU3lzdGVtSW5mb1RhYmxlCkBAIC0yMjEyLDcgKzI1OTcsNyBAQAogdWNEb2NraW5nUGluQml0OiAgICAgd2hpY2ggYml0IGluIHRoaXMgcmVnaXN0ZXIgdG8gcmVhZCB0aGUgcGluIHN0YXR1czsKIHVjRG9ja2luZ1BpblBvbGFyaXR5OlBvbGFyaXR5IG9mIHRoZSBwaW4gd2hlbiBkb2NrZWQ7CiAKLXVsQ1BVQ2FwSW5mbzogICAgICAgIFs3OjBdPTE6R3JpZmZpbjtbNzowXT0yOkdyZXlob3VuZDtbNzowXT0zOks4LCBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBub3cgYW5kIG11c3QgYmUgMHgwCit1bENQVUNhcEluZm86ICAgICAgICBbNzowXT0xOkdyaWZmaW47Wzc6MF09MjpHcmV5aG91bmQ7Wzc6MF09MzpLOCwgWzc6MF09NDpQaGFyYW9oLCBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBub3cgYW5kIG11c3QgYmUgMHgwCiAKIHVzTnVtYmVyT2ZDeWNsZXNJblBlcmlvZDpJbmRpY2F0ZSBob3cgbWFueSBjeWNsZXMgd2hlbiBQV00gZHV0eSBpcyAxMDAlLgogCkBAIC0yMjUwLDYgKzI2MzUsMTQgQEAKIHVzTWluRG93blN0cmVhbUhUTGlua1dpZHRoOiAgc2FtZSBhcyBhYm92ZS4KICovCiAKKy8vIEFUT01fSU5URUdSQVRFRF9TWVNURU1fSU5GTzo6dWxDUFVDYXBJbmZvICAtIENQVSB0eXBlIGRlZmluaXRpb24gCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX1VOS05PV05fQ1BVICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgSU5URUdSQVRFRF9TWVNURU1fSU5GT19fQU1EX0NQVV9fR1JJRkZJTiAgICAgICAgMQorI2RlZmluZSAgICBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX19BTURfQ1BVX19HUkVZSE9VTkQgICAgICAyCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX0s4ICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgSU5URUdSQVRFRF9TWVNURU1fSU5GT19fQU1EX0NQVV9fUEhBUkFPSCAgICAgICAgNAorCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX01BWF9DT0RFICAgICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX1BIQVJBT0ggICAgLy8gdGhpcyBkZWZmIHJlZmxlY3RzIG1heCBkZWZpbmVkIENQVSBjb2RlCiAKICNkZWZpbmUgU1lTVEVNX0NPTkZJR19QT1dFUkVYUFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIFNZU1RFTV9DT05GSUdfUlVOX0FUX09WRVJEUklWRV9FTkdJTkUgICAgICAgICAgICAgMHgwMDAwMDAwMgpAQCAtMjc3OCw4ICszMTcxLDg4IEBACiAjZGVmaW5lIFBBTkVMX1JBTkRPTV9ESVRIRVIgICAweDgwCiAjZGVmaW5lIFBBTkVMX1JBTkRPTV9ESVRIRVJfTUFTSyAgIDB4ODAKIAorI2RlZmluZSBBVE9NX0xWRFNfSU5GT19MQVNUICBBVE9NX0xWRFNfSU5GT19WMTIgICAvLyBubyBuZWVkIHRvIGNoYW5nZSB0aGlzIAogCi0jZGVmaW5lIEFUT01fTFZEU19JTkZPX0xBU1QgIEFUT01fTFZEU19JTkZPX1YxMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQorLy8gU3RydWN0dXJlcyB1c2VkIGJ5IExDRF9JbmZvVGFibGUgVjEuMyAgICBOb3RlOiBwcmV2aW91cyB2ZXJzaW9uIHdhcyBjYWxsZWQgQVRPTV9MVkRTX0lORk9fVjEyCisvLyBBU0lDIEZhbWlsaWVzOiAgTkkKKy8vIHVjVGFibGVGb3JtYXRSZXZpc2lvbj0xCisvLyB1Y1RhYmxlQ29udGVudFJldmlzaW9uPTMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0xDRF9JTkZPX1YxMworeworICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgc0hlYWRlcjsgIAorICBBVE9NX0RURF9GT1JNQVQgICAgIHNMQ0RUaW1pbmc7CisgIFVTSE9SVCAgICAgICAgICAgICAgdXNFeHRJbmZvVGFibGVPZmZzZXQ7CisgIFVTSE9SVCAgICAgICAgICAgICAgdXNTdXBwb3J0ZWRSZWZyZXNoUmF0ZTsgICAgIC8vUmVmZXIgdG8gcGFuZWwgaW5mbyB0YWJsZSBpbiBBVE9NQklPUyBleHRlbnNpb24gU3BlYy4KKyAgVUxPTkcgICAgICAgICAgICAgICB1bFJlc2VydmVkMDsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y0xDRF9NaXNjOyAgICAgICAgICAgICAgICAvLyBSZW9yZ2FuaXplZCBpbiBWMTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQwOiB7PTA6c2luZ2xlLCA9MTpkdWFsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQxOiB7PTA6TERJIGZvcm1hdCBmb3IgUkdCODg4LCA9MSBGUERJIGZvcm1hdCBmb3IgUkdCODg4fSAgLy8gd2FzIHs9MDo2NjZSR0IsID0xOjg4OFJHQn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MzoyOiB7R3JleSBsZXZlbH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQ2OjQgQ29sb3IgQml0IERlcHRoIGRlZmluaXRpb24gKHNlZSBiZWxvdyBkZWZpbml0aW9uIGluIEVESUQgVjEuNCBAQllURSAxNGgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpdDcgICBSZXNlcnZlZC4gIHdhcyBmb3IgQVRPTV9QQU5FTF9NSVNDX0FQSV9FTkFCTEVELCBzdGlsbCBuZWVkIGl0PyAgCisgIFVDSEFSICAgICAgICAgICAgICAgdWNQYW5lbERlZmF1bHRSZWZyZXNoUmF0ZTsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1BhbmVsSWRlbnRpZmljYXRpb247CisgIFVDSEFSICAgICAgICAgICAgICAgdWNTU19JZDsKKyAgVVNIT1JUICAgICAgICAgICAgICB1c0xDRFZlbmRlcklEOworICBVU0hPUlQgICAgICAgICAgICAgIHVzTENEUHJvZHVjdElEOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjTENEUGFuZWxfU3BlY2lhbEhhbmRsaW5nQ2FwOyAgLy8gUmVvcmdhbml6ZWQgaW4gVjEzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpdDA6IE9uY2UgREFMIHNlZXMgdGhpcyBDQVAgaXMgc2V0LCBpdCB3aWxsIHJlYWQgRURJRCBmcm9tIExDRCBvbiBpdHMgb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MTogU2VlIExDRFBBTkVMX0NBUF9EUlJfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MjogYSBxdWljayByZWZlcmVuY2Ugd2hldGhlciBhbiBlbWJhZGRlZCBwYW5lbCAoTENEMSApIGlzIExWRFMgKDApIG9yIGVEUCAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQ3LTM6IFJlc2VydmVkIAorICBVQ0hBUiAgICAgICAgICAgICAgIHVjUGFuZWxJbmZvU2l6ZTsJCQkJCSAvLyAgc3RhcnQgZnJvbSBBVE9NX0RURF9GT1JNQVQgdG8gZW5kIG9mIHBhbmVsIGluZm8sIGluY2x1ZGUgRXh0SW5mb1RhYmxlCisgIFVTSE9SVCAgICAgICAgICAgICAgdXNCYWNrbGlnaHRQV007ICAgICAgICAgICAgLy8gIEJhY2tsaWdodCBQV00gaW4gSHouIE5ldyBpbiBfVjEzCisKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1Bvd2VyU2VxdWVuY2VESUdPTnRvREVfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNQb3dlclNlcXVlbmNlREV0b1ZBUllfQkxfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNQb3dlclNlcXVlbmNlREV0b0RJR09OX2luNE1zOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjUG93ZXJTZXF1ZW5jZVZBUllfQkx0b0RFX2luNE1zOworCisgIFVDSEFSICAgICAgICAgICAgICAgdWNPZmZEZWxheV9pbjRNczsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1Bvd2VyU2VxdWVuY2VWQVJZX0JMdG9CTE9OX2luNE1zOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjUG93ZXJTZXF1ZW5jZUJMT050b1ZBUllfQkxfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNSZXNlcnZlZDE7CisKKyAgVUxPTkcgICAgICAgICAgICAgICB1bFJlc2VydmVkWzRdOworfUFUT01fTENEX0lORk9fVjEzOyAgCisKKyNkZWZpbmUgQVRPTV9MQ0RfSU5GT19MQVNUICBBVE9NX0xDRF9JTkZPX1YxMyAgICAKKworLy9EZWZpbml0aW9ucyBmb3IgdWNMQ0RfTWlzYworI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0RVQUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0ZQREkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0dSRVlfTEVWRUwgICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0dSRVlfTEVWRUxfU0hJRlQgICAgICAgMgorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0NPTE9SX0JJVF9ERVBUSF9NQVNLICAgMHg3MAorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzXzZCSVRfUEVSX0NPTE9SICAgICAgICAgMHgxMAorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzXzhCSVRfUEVSX0NPTE9SICAgICAgICAgMHgyMAorCisvL0NvbG9yIEJpdCBEZXB0aCBkZWZpbml0aW9uIGluIEVESUQgVjEuNCBAQllURSAxNGgKKy8vQml0IDYgIDUgIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMCAgMCAgMCAgLSAgQ29sb3IgYml0IGRlcHRoIGlzIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAwICAwICAxICAtICA2IEJpdHMgcGVyIFByaW1hcnkgQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMCAgMSAgMCAgLSAgOCBCaXRzIHBlciBQcmltYXJ5IENvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDAgIDEgIDEgIC0gMTAgQml0cyBwZXIgUHJpbWFyeSBDb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxICAwICAwICAtIDEyIEJpdHMgcGVyIFByaW1hcnkgQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMSAgMCAgMSAgLSAxNCBCaXRzIHBlciBQcmltYXJ5IENvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDEgIDEgIDAgIC0gMTYgQml0cyBwZXIgUHJpbWFyeSBDb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxICAxICAxICAtIFJlc2VydmVkCisgCisvL0RlZmluaXRpb25zIGZvciB1Y0xDRFBhbmVsX1NwZWNpYWxIYW5kbGluZ0NhcDoKKworLy9PbmNlIERBTCBzZWVzIHRoaXMgQ0FQIGlzIHNldCwgaXQgd2lsbCByZWFkIEVESUQgZnJvbSBMQ0Qgb24gaXRzIG93biBpbnN0ZWFkIG9mIHVzaW5nIHNMQ0RUaW1pbmcgaW4gQVRPTV9MVkRTX0lORk9fVjEyLiAKKy8vT3RoZXIgZW50cmllcyBpbiBBVE9NX0xWRFNfSU5GT19WMTIgYXJlIHN0aWxsIHZhbGlkL3VzZWZ1bCB0byBEQUwgCisjZGVmaW5lCUxDRFBBTkVMX0NBUF9WMTNfUkVBRF9FRElEICAgICAgICAgICAgICAweDEgICAgICAgIC8vID0gTENEUEFORUxfQ0FQX1JFQURfRURJRCBubyBjaGFuZ2UgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KKworLy9JZiBhIGRlc2lnbiBzdXBwb3J0cyBEUlIgKGR5bmFtaWMgcmVmcmVzaCByYXRlKSBvbiBpbnRlcm5hbCBwYW5lbHMgKExWRFMgb3IgRURQKSwgdGhpcyBjYXAgaXMgc2V0IGluIHVjTENEUGFuZWxfU3BlY2lhbEhhbmRsaW5nQ2FwIHRvZ2V0aGVyCisvL3dpdGggbXVsdGlwbGUgc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZXNAdXNTdXBwb3J0ZWRSZWZyZXNoUmF0ZS4gVGhpcyBjYXAgc2hvdWxkIG5vdCBiZSBzZXQgd2hlbiBvbmx5IHNsb3cgcmVmcmVzaCByYXRlIGlzIHN1cHBvcnRlZCAoc3RhdGljCisvL3JlZnJlc2ggcmF0ZSBzd2l0Y2ggYnkgU1cuIFRoaXMgaXMgb25seSB2YWxpZCBmcm9tIEFUT01fTFZEU19JTkZPX1YxMgorI2RlZmluZQlMQ0RQQU5FTF9DQVBfVjEzX0RSUl9TVVBQT1JURUQgICAgICAgICAgMHgyICAgICAgICAvLyA9IExDRFBBTkVMX0NBUF9EUlJfU1VQUE9SVEVEIG5vIGNoYW5nZSBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorCisvL1VzZSB0aGlzIGNhcCBiaXQgZm9yIGEgcXVpY2sgcmVmZXJlbmNlIHdoZXRoZXIgYW4gZW1iYWRkZWQgcGFuZWwgKExDRDEgKSBpcyBMVkRTIG9yIGVEUC4KKyNkZWZpbmUJTENEUEFORUxfQ0FQX1YxM19lRFAgICAgICAgICAgICAgICAgICAgIDB4NCAgICAgICAgLy8gPSBMQ0RQQU5FTF9DQVBfZURQIG5vIGNoYW5nZSBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgogCiB0eXBlZGVmIHN0cnVjdCAgX0FUT01fUEFUQ0hfUkVDT1JEX01PREUKIHsKQEAgLTI5NDQsOSArMzQxNyw5IEBACiAjZGVmaW5lIE1BWF9EVERfTU9ERV9JTl9WUkFNICAgICAgICAgICAgNgogI2RlZmluZSBBVE9NX0RURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUgIChNQVhfRFREX01PREVfSU5fVlJBTSoyOCkgICAgLy8yOD0gKFNJWkVPRiBBVE9NX0RURF9GT1JNQVQpIAogI2RlZmluZSBBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUgIDMyKjggICAgICAgICAgICAgICAgICAgICAgICAgLy8zMiBpcyBhIHByZWRlZmluZWQgbnVtYmVyLDg9IChTSVpFT0YgQVRPTV9TVERfRk9STUFUKQotI2RlZmluZSBERlBfRU5DT0RFUl9UWVBFX09GRlNFVAkJCQkJMHg4MAotI2RlZmluZSBEUF9FTkNPREVSX0xBTkVfTlVNX09GRlNFVAkJCTB4ODQKLSNkZWZpbmUgRFBfRU5DT0RFUl9MSU5LX1JBVEVfT0ZGU0VUCQkJMHg4OAorLy8yMCBieXRlcyBmb3IgRW5jb2RlciBUeXBlIGFuZCBEUENEIGluIFNURCBFRElEIGFyZWEKKyNkZWZpbmUgREZQX0VOQ09ERVJfVFlQRV9PRkZTRVQgICAgICAgICAoQVRPTV9FRElEX1JBV19EQVRBU0laRSArIEFUT01fRFREX01PREVfU1VQUE9SVF9UQkxfU0laRSArIEFUT01fU1REX01PREVfU1VQUE9SVF9UQkxfU0laRSAtIDIwKSAgICAKKyNkZWZpbmUgQVRPTV9EUF9EUENEX09GRlNFVCAgICAgICAgICAgICAoREZQX0VOQ09ERVJfVFlQRV9PRkZTRVQgKyA0ICkgICAgICAgIAogCiAjZGVmaW5lIEFUT01fSFdJQ09OMV9TVVJGQUNFX0FERFIgICAgICAgMAogI2RlZmluZSBBVE9NX0hXSUNPTjJfU1VSRkFDRV9BRERSICAgICAgIChBVE9NX0hXSUNPTjFfU1VSRkFDRV9BRERSICsgQVRPTV9IV0lDT05fU1VSRkFDRV9TSVpFKQpAQCAtMjk5NywxNCArMzQ3MCwxNiBAQAogI2RlZmluZSBBVE9NX0RGUDVfRFREX01PREVfVEJMX0FERFIgICAgIChBVE9NX0RGUDVfRURJRF9BRERSICsgQVRPTV9FRElEX1JBV19EQVRBU0laRSkKICNkZWZpbmUgQVRPTV9ERlA1X1NURF9NT0RFX1RCTF9BRERSICAgICAoQVRPTV9ERlA1X0RURF9NT0RFX1RCTF9BRERSICsgQVRPTV9EVERfTU9ERV9TVVBQT1JUX1RCTF9TSVpFKQogCi0jZGVmaW5lIEFUT01fRFBfVFJBSU5JTkdfVEJMX0FERFIJCQkJKEFUT01fREZQNV9TVERfTU9ERV9UQkxfQUREUitBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUpICAgICAgIAorI2RlZmluZSBBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICAgICAgIChBVE9NX0RGUDVfU1REX01PREVfVEJMX0FERFIgKyBBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUpCiAKLSNkZWZpbmUgQVRPTV9TVEFDS19TVE9SQUdFX1NUQVJUICAgICAgICAoQVRPTV9EUF9UUkFJTklOR19UQkxfQUREUisyNTYpICAgICAgIAotI2RlZmluZSBBVE9NX1NUQUNLX1NUT1JBR0VfRU5EICAgICAgICAgIEFUT01fU1RBQ0tfU1RPUkFHRV9TVEFSVCs1MTIgICAgICAgIAorI2RlZmluZSBBVE9NX1NUQUNLX1NUT1JBR0VfU1RBUlQgICAgICAgIChBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICsgMTAyNCkgICAgICAgCisjZGVmaW5lIEFUT01fU1RBQ0tfU1RPUkFHRV9FTkQgICAgICAgICAgQVRPTV9TVEFDS19TVE9SQUdFX1NUQVJUICsgNTEyICAgICAgICAKIAogLy9UaGUgc2l6ZSBiZWxvdyBpcyBpbiBLYiEKICNkZWZpbmUgQVRPTV9WUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICgoKChBVE9NX1NUQUNLX1NUT1JBR0VfRU5EIC0gQVRPTV9IV0lDT04xX1NVUkZBQ0VfQUREUik+PjEwKSs0KSYweEZGRkMpCiAgICAKKyNkZWZpbmUgQVRPTV9WUkFNX1JFU0VSVkVfVjJfU0laRSAgICAgIDMyCisKICNkZWZpbmUJQVRPTV9WUkFNX09QRVJBVElPTl9GTEFHU19NQVNLICAgICAgICAgMHhDMDAwMDAwMEwKICNkZWZpbmUgQVRPTV9WUkFNX09QRVJBVElPTl9GTEFHU19TSElGVCAgICAgICAgMzAKICNkZWZpbmUJQVRPTV9WUkFNX0JMT0NLX05FRURTX05PX1JFU0VSVkFUSU9OICAgMHgxCkBAIC0zMjA2LDYgKzM2ODEsMTUgQEAKICAgVVNIT1JUICAgIHVzR3JhcGhpY09iaklkc1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMXN0IEVuY29kZXIgT2JqIHNvdXJjZSBmcm9tIEdQVSB0byBsYXN0IEdyYXBoaWMgT2JqIGRlc3RpbmF0ZSB0byBjb25uZWN0b3IuCiB9QVRPTV9ESVNQTEFZX09CSkVDVF9QQVRIOwogCit0eXBlZGVmIHN0cnVjdCAgX0FUT01fRElTUExBWV9FWFRFUk5BTF9PQkpFQ1RfUEFUSAoreworICBVU0hPUlQgICAgdXNEZXZpY2VUYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnRlZCBkZXZpY2UgCisgIFVTSE9SVCAgICB1c1NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHNpemUgb2YgQVRPTV9ESVNQTEFZX09CSkVDVF9QQVRICisgIFVTSE9SVCAgICB1c0Nvbm5PYmplY3RJZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29ubmVjdG9yIE9iamVjdCBJRCAKKyAgVVNIT1JUICAgIHVzR1BVT2JqZWN0SWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HUFUgSUQgCisgIFVTSE9SVCAgICB1c0dyYXBoaWNPYmpJZHNbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNHcmFwaGljT2JqSWRzWzBdPSBHUFUgaW50ZXJuYWwgZW5jb2RlciwgdXNHcmFwaGljT2JqSWRzWzFdPSBleHRlcm5hbCBlbmNvZGVyIAorfUFUT01fRElTUExBWV9FWFRFUk5BTF9PQkpFQ1RfUEFUSDsKKwogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fRElTUExBWV9PQkpFQ1RfUEFUSF9UQUJMRQogewogICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTnVtT2ZEaXNwUGF0aDsKQEAgLTMyNjEsNiArMzc0NSw0NyBAQAogI2RlZmluZSBFWFRfQVVYRERDX0xVVElOREVYXzcgICAgICAgICAgICAgICAgICAgNwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0VYVF9BVVhERENfTFVUX0VOVFJJRVMgICAoRVhUX0FVWEREQ19MVVRJTkRFWF83KzEpCiAKKy8vdWNDaGFubmVsTWFwcGluZyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dpbmcKKy8vZm9yIERQIGNvbm5lY3RvciwgZURQLCBEUCB0byBWR0EvTFZEUyAKKy8vQml0WzE6MF06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEUCBjb25uZWN0b3IgRFBfTGFuZTAsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCisvL0JpdFszOjJdOiBEZWZpbmUgd2hpY2ggcGluIGNvbm5lY3QgdG8gRFAgY29ubmVjdG9yIERQX0xhbmUxLCA9MDogc291cmNlIGZyb20gR1BVIHBpbiBUWDAsID0xOiBmcm9tIEdQVSBwaW4gVFgxLCA9MjogZnJvbSBHUFUgcGluIFRYMiwgPTMgZnJvbSBHUFUgcGluIFRYMworLy9CaXRbNTo0XTogRGVmaW5lIHdoaWNoIHBpbiBjb25uZWN0IHRvIERQIGNvbm5lY3RvciBEUF9MYW5lMiwgPTA6IHNvdXJjZSBmcm9tIEdQVSBwaW4gVFgwLCA9MTogZnJvbSBHUFUgcGluIFRYMSwgPTI6IGZyb20gR1BVIHBpbiBUWDIsID0zIGZyb20gR1BVIHBpbiBUWDMKKy8vQml0Wzc6Nl06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEUCBjb25uZWN0b3IgRFBfTGFuZTMsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9EUF9DT05OX0NIQU5ORUxfTUFQUElORworeworI2lmIEFUT01fQklHX0VORElBTgorICBVQ0hBUiB1Y0RQX0xhbmUzX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUyX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUxX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUwX1NvdXJjZToyOworI2Vsc2UKKyAgVUNIQVIgdWNEUF9MYW5lMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lMV9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lMl9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lM19Tb3VyY2U6MjsKKyNlbmRpZgorfUFUT01fRFBfQ09OTl9DSEFOTkVMX01BUFBJTkc7CisKKy8vZm9yIERWSS9IRE1JLCBpbiBkdWFsIGxpbmsgY2FzZSwgYm90aCBsaW5rcyBoYXZlIHRvIGhhdmUgc2FtZSBtYXBwaW5nLiAKKy8vQml0WzE6MF06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEVkkgY29ubmVjdG9yIGRhdGEgTGFuZTIsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCisvL0JpdFszOjJdOiBEZWZpbmUgd2hpY2ggcGluIGNvbm5lY3QgdG8gRFZJIGNvbm5lY3RvciBkYXRhIExhbmUxLCA9MDogc291cmNlIGZyb20gR1BVIHBpbiBUWDAsID0xOiBmcm9tIEdQVSBwaW4gVFgxLCA9MjogZnJvbSBHUFUgcGluIFRYMiwgPTMgZnJvbSBHUFUgcGluIFRYMworLy9CaXRbNTo0XTogRGVmaW5lIHdoaWNoIHBpbiBjb25uZWN0IHRvIERWSSBjb25uZWN0b3IgZGF0YSBMYW5lMCwgPTA6IHNvdXJjZSBmcm9tIEdQVSBwaW4gVFgwLCA9MTogZnJvbSBHUFUgcGluIFRYMSwgPTI6IGZyb20gR1BVIHBpbiBUWDIsID0zIGZyb20gR1BVIHBpbiBUWDMKKy8vQml0Wzc6Nl06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEVkkgY29ubmVjdG9yIGNsb2NrIGxhbmUsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9EVklfQ09OTl9DSEFOTkVMX01BUFBJTkcKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgVUNIQVIgdWNEVklfQ0xLX1NvdXJjZToyOworICBVQ0hBUiB1Y0RWSV9EQVRBMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEVklfREFUQTFfU291cmNlOjI7CisgIFVDSEFSIHVjRFZJX0RBVEEyX1NvdXJjZToyOworI2Vsc2UKKyAgVUNIQVIgdWNEVklfREFUQTJfU291cmNlOjI7CisgIFVDSEFSIHVjRFZJX0RBVEExX1NvdXJjZToyOworICBVQ0hBUiB1Y0RWSV9EQVRBMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEVklfQ0xLX1NvdXJjZToyOworI2VuZGlmCit9QVRPTV9EVklfQ09OTl9DSEFOTkVMX01BUFBJTkc7CisKIHR5cGVkZWYgc3RydWN0IF9FWFRfRElTUExBWV9QQVRICiB7CiAgIFVTSE9SVCAgdXNEZXZpY2VUYWc7ICAgICAgICAgICAgICAgICAgICAvL0EgYml0IHZlY3RvciB0byBzaG93IHdoYXQgZGV2aWNlcyBhcmUgc3VwcG9ydGVkIApAQCAtMzI2OSw3ICszNzk0LDEzIEBACiAgIFVDSEFSICAgdWNFeHRBVVhERENMdXRJbmRleDsgICAgICAgICAgICAvL0FuIGluZGV4IGludG8gZXh0ZXJuYWwgQVVYL0REQyBjaGFubmVsIExVVAogICBVQ0hBUiAgIHVjRXh0SFBEUElOTHV0SW5kZXg7ICAgICAgICAgICAgLy9BbiBpbmRleCBpbnRvIGV4dGVybmFsIEhQRCBwaW4gTFVUCiAgIFVTSE9SVCAgdXNFeHRFbmNvZGVyT2JqSWQ7ICAgICAgICAgICAgICAvL2V4dGVybmFsIGVuY29kZXIgb2JqZWN0IGlkCi0gIFVTSE9SVCAgdXNSZXNlcnZlZFszXTsgCisgIHVuaW9ueworICAgIFVDSEFSICAgdWNDaGFubmVsTWFwcGluZzsgICAgICAgICAgICAgICAgICAvLyBpZiB1Y0NoYW5uZWxNYXBwaW5nPTAsIHVzaW5nIGRlZmF1bHQgb25lIHRvIG9uZSBtYXBwaW5nCisgICAgQVRPTV9EUF9DT05OX0NIQU5ORUxfTUFQUElORyBhc0RQTWFwcGluZzsKKyAgICBBVE9NX0RWSV9DT05OX0NIQU5ORUxfTUFQUElORyBhc0RWSU1hcHBpbmc7CisgIH07CisgIFVDSEFSICAgdWNSZXNlcnZlZDsKKyAgVVNIT1JUICB1c1Jlc2VydmVkWzJdOyAKIH1FWFRfRElTUExBWV9QQVRIOwogICAgCiAjZGVmaW5lIE5VTUJFUl9PRl9VQ0hBUl9GT1JfR1VJRCAgICAgICAgICAxNgpAQCAtMzI4MSw3ICszODEyLDggQEAKICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjR3VpZCBbTlVNQkVSX09GX1VDSEFSX0ZPUl9HVUlEXTsgICAgIC8vIGEgR1VJRCBpcyBhIDE2IGJ5dGUgbG9uZyBzdHJpbmcKICAgRVhUX0RJU1BMQVlfUEFUSCAgICAgICAgIHNQYXRoW01BWF9OVU1CRVJfT0ZfRVhUX0RJU1BMQVlfUEFUSF07IC8vIHRvdGFsIG9mIGZpeGVkIDcgZW50cmllcy4KICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjQ2hlY2tzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgIHNpbXBsZSBDaGVja3N1bSBvZiB0aGUgc3VtIG9mIHdob2xlIHN0cnVjdHVyZSBlcXVhbCB0byAweDAuIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgWzddOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBvdGVudGlhbCBleHBhbnNpb24KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjM0RTdGVyZW9QaW5JZDsgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBmb3IgZURQIHBhbmVsCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcG90ZW50aWFsIGV4cGFuc2lvbgogfUFUT01fRVhURVJOQUxfRElTUExBWV9DT05ORUNUSU9OX0lORk87CiAKIC8vUmVsYXRlZCBkZWZpbml0aW9ucywgYWxsIHJlY29yZHMgYXJlIGRpZmZlcm50IGJ1dCB0aGV5IGhhdmUgYSBjb21tb25kIGhlYWRlcgpAQCAtMzMxMSwxMCArMzg0MywxMSBAQAogI2RlZmluZSBBVE9NX0NPTk5FQ1RPUl9BVVhERENfTFVUX1JFQ09SRF9UWVBFICAgICAgICAgIDE3IC8vVGhpcyBpcyBmb3IgdGhlIGNhc2Ugd2hlbiBjb25uZWN0b3JzIGFyZSBub3Qga25vd24gdG8gb2JqZWN0IHRhYmxlCiAjZGVmaW5lIEFUT01fT0JKRUNUX0xJTktfUkVDT1JEX1RZUEUgICAgICAgICAgICAgICAgICAgMTggLy9PbmNlIHRoaXMgcmVjb3JkIGlzIHByZXNlbnQgdW5kZXIgb25lIG9iamVjdCwgaXQgaW5kaWNhdHMgdGhlIG9vYmplY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgb2JqIGRlc2NyaWJlZCBieSB0aGUgcmVjb3JkCiAjZGVmaW5lIEFUT01fQ09OTkVDVE9SX1JFTU9URV9DQVBfUkVDT1JEX1RZUEUgICAgICAgICAgMTkKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfVFlQRSAgICAgICAgICAgICAgICAgICAyMAogCiAKIC8vTXVzdCBiZSB1cGRhdGVkIHdoZW4gbmV3IHJlY29yZCB0eXBlIGlzIGFkZGVkLGVxdWFsIHRvIHRoYXQgcmVjb3JkIGRlZmluaXRpb24hCi0jZGVmaW5lIEFUT01fTUFYX09CSkVDVF9SRUNPUkRfTlVNQkVSICAgICAgICAgICAgIEFUT01fQ09OTkVDVE9SX1JFTU9URV9DQVBfUkVDT1JEX1RZUEUKKyNkZWZpbmUgQVRPTV9NQVhfT0JKRUNUX1JFQ09SRF9OVU1CRVIgICAgICAgICAgICAgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfVFlQRQogCiB0eXBlZGVmIHN0cnVjdCAgX0FUT01fSTJDX1JFQ09SRAogewpAQCAtMzQ0MSw2ICszOTc0LDI2IEBACiAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICB1Y1BhZGRpbmdbMl07CiB9QVRPTV9FTkNPREVSX0RWT19DRl9SRUNPUkQ7CiAKKy8vIEJpdCBtYXBzIGZvciBBVE9NX0VOQ09ERVJfQ0FQX1JFQ09SRC51Y0VuY29kZXJDYXAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfSEJSMiAgICAgMHgwMSAgICAgICAgIC8vIERQMS4yIEhCUjIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGF0aAorCit0eXBlZGVmIHN0cnVjdCAgX0FUT01fRU5DT0RFUl9DQVBfUkVDT1JECit7CisgIEFUT01fQ09NTU9OX1JFQ09SRF9IRUFERVIgICBzaGVhZGVyOworICB1bmlvbiB7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICB1c0VuY29kZXJDYXA7ICAgICAgICAgCisgICAgc3RydWN0IHsKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWQ6MTU7ICAgICAgICAvLyBCaXQxLTE1IG1heSBiZSBkZWZpbmVkIGZvciBvdGhlciBjYXBhYmlsaXR5IGluIGZ1dHVyZQorICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIQlIyQ2FwOjE7ICAgICAgICAgIC8vIEJpdDAgaXMgZm9yIERQMS4yIEhCUjIgY2FwYWJpbGl0eS4gCisjZWxzZQorICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIQlIyQ2FwOjE7ICAgICAgICAgIC8vIEJpdDAgaXMgZm9yIERQMS4yIEhCUjIgY2FwYWJpbGl0eS4gCisgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICB1c1Jlc2VydmVkOjE1OyAgICAgICAgLy8gQml0MS0xNSBtYXkgYmUgZGVmaW5lZCBmb3Igb3RoZXIgY2FwYWJpbGl0eSBpbiBmdXR1cmUKKyNlbmRpZgorICAgIH07CisgIH07IAorfUFUT01fRU5DT0RFUl9DQVBfUkVDT1JEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIC8vIHZhbHVlIGZvciBBVE9NX0NPTk5FQ1RPUl9DRl9SRUNPUkQudWNDb25uZWN0ZWREdm9CdW5kbGUKICNkZWZpbmUgQVRPTV9DT05ORUNUT1JfQ0ZfUkVDT1JEX0NPTk5FQ1RFRF9VUFBFUjEyQklUQlVORExFQSAgIDEKICNkZWZpbmUgQVRPTV9DT05ORUNUT1JfQ0ZfUkVDT1JEX0NPTk5FQ1RFRF9MT1dFUjEyQklUQlVORExFQiAgIDIKQEAgLTM1ODAsNiArNDEzMywxMSBAQAogI2RlZmluZQlWT0xUQUdFX0NPTlRST0xfSURfREFDCQkJCQkJCQkweDAyCQkJCQkJCQkJLy9JMkMgY29udHJvbCwgdXNlZCBmb3IgUjV4eC9SNnh4IE1WRERDLE1WRERRIG9yIFZERENJCiAjZGVmaW5lCVZPTFRBR0VfQ09OVFJPTF9JRF9WVDExNnhNCQkJCQkJMHgwMwkJCQkJCQkJCS8vSTJDIGNvbnRyb2wsIHVzZWQgZm9yIFI2eHggQ29yZSBWb2x0YWdlCiAjZGVmaW5lIFZPTFRBR0VfQ09OVFJPTF9JRF9EUzQ0MDIJCQkJCQkJMHgwNAkJCQkJCQkJCQorI2RlZmluZSBWT0xUQUdFX0NPTlRST0xfSURfVVA2MjY2IAkJCQkJCTB4MDUJCQkJCQkJCQkKKyNkZWZpbmUgVk9MVEFHRV9DT05UUk9MX0lEX1NDT1JQSU8JCQkJCQkweDA2CisjZGVmaW5lCVZPTFRBR0VfQ09OVFJPTF9JRF9WVDE1NTZNCQkJCQkJMHgwNwkJCQkJCQkJCQorI2RlZmluZQlWT0xUQUdFX0NPTlRST0xfSURfQ0hMODIyeAkJCQkJCTB4MDgJCQkJCQkJCQkKKyNkZWZpbmUJVk9MVEFHRV9DT05UUk9MX0lEX1ZUMTU4Nk0JCQkJCQkweDA5CiAKIHR5cGVkZWYgc3RydWN0ICBfQVRPTV9WT0xUQUdFX09CSkVDVAogewpAQCAtMzY3MCw2NiArNDIyOCwxNTcgQEAKICNkZWZpbmUgUE9XRVJfU0VOU09SX0dQSU8JCQkJCQkJCTB4MDEKICNkZWZpbmUgUE9XRVJfU0VOU09SX0kyQwkJCQkJCQkJMHgwMgogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9DTEtfVk9MVF9DQVBBQklMSVRZCit7CisgIFVMT05HICAgICAgdWxWb2x0YWdlSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBWb2x0YWdlIEluZGV4IGluZGljYXRlZCBieSBGVVNFLCBzYW1lIHZvbHRhZ2UgaW5kZXggc2hhcmVkIHdpdGggU0NMSyBEUE0gZnVzZSB0YWJsZSAgICAgICAgCisgIFVMT05HICAgICAgdWxNYXhpbXVtU3VwcG9ydGVkQ0xLOyAgICAgICAgICAgICAgIC8vIE1heGltdW0gY2xvY2sgc3VwcG9ydGVkIHdpdGggc3BlY2lmaWVkIHZvbHRhZ2UgaW5kZXgsIHVuaXQgaW4gMTBrSHoKK31BVE9NX0NMS19WT0xUX0NBUEFCSUxJVFk7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0FWQUlMQUJMRV9TQ0xLX0xJU1QKK3sKKyAgVUxPTkcgICAgICB1bFN1cHBvcnRlZFNDTEs7ICAgICAgICAgICAgICAgLy8gTWF4aW11bSBjbG9jayBzdXBwb3J0ZWQgd2l0aCBzcGVjaWZpZWQgdm9sdGFnZSBpbmRleCwgIHVuaXQgaW4gMTBrSHoKKyAgVVNIT1JUICAgICB1c1ZvbHRhZ2VJbmRleDsgICAgICAgICAgICAgICAgLy8gVGhlIFZvbHRhZ2UgSW5kZXggaW5kaWNhdGVkIGJ5IEZVU0UgZm9yIHNwZWNpZmllZCBTQ0xLICAKKyAgVVNIT1JUICAgICB1c1ZvbHRhZ2VJRDsgICAgICAgICAgICAgICAgICAgLy8gVGhlIFZvbHRhZ2UgSUQgaW5kaWNhdGVkIGJ5IEZVU0UgZm9yIHNwZWNpZmllZCBTQ0xLIAorfUFUT01fQVZBSUxBQkxFX1NDTEtfTElTVDsKKworLy8gQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2IHVsU3lzdGVtQ29uZmlnIGNhcCBkZWZpbml0aW9uCisjZGVmaW5lIEFUT01fSUdQX0lORk9fVjZfU1lTVEVNX0NPTkZJR19fUENJRV9QT1dFUl9HQVRJTkdfRU5BQkxFICAgICAgICAgICAgIDEgICAgICAgLy8gcmVmZXIgdG8gdWxTeXN0ZW1Db25maWcgYml0WzBdCisKKy8vIHRoaXMgSW50ZWdyYXRlU3lzdGVtSW5mb1RhYmxlIGlzIHVzZWQgZm9yIExpYW5vL09udGFyaW8gQVBVCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2CiB7CiAgIEFUT01fQ09NTU9OX1RBQkxFX0hFQURFUiAgIHNIZWFkZXI7CiAgIFVMT05HICB1bEJvb3RVcEVuZ2luZUNsb2NrOwogICBVTE9ORyAgdWxEZW50aXN0VkNPRnJlcTsgICAgICAgICAgCiAgIFVMT05HICB1bEJvb3RVcFVNQUNsb2NrOyAgICAgICAgICAKLSAgVUxPTkcgIHVsUmVzZXJ2ZWQxWzhdOyAgICAgICAgICAgIAorICBBVE9NX0NMS19WT0xUX0NBUEFCSUxJVFkgICBzRElTUENMS19Wb2x0YWdlWzRdOyAgICAgICAgICAgIAogICBVTE9ORyAgdWxCb290VXBSZXFEaXNwbGF5VmVjdG9yOwogICBVTE9ORyAgdWxPdGhlckRpc3BsYXlNaXNjOwogICBVTE9ORyAgdWxHUFVDYXBJbmZvOwotICBVTE9ORyAgdWxSZXNlcnZlZDJbM107ICAgICAgICAgICAgCisgIFVMT05HICB1bFNCX01NSU9fQmFzZV9BZGRyOworICBVU0hPUlQgdXNSZXF1ZXN0ZWRQV01GcmVxSW5IejsKKyAgVUNIQVIgIHVjSHRjVG1wTG10OyAgIAorICBVQ0hBUiAgdWNIdGNIeXN0TG10OworICBVTE9ORyAgdWxNaW5FbmdpbmVDbG9jazsgICAgICAgICAgIAogICBVTE9ORyAgdWxTeXN0ZW1Db25maWc7ICAgICAgICAgICAgCiAgIFVMT05HICB1bENQVUNhcEluZm87ICAgICAgICAgICAgICAKLSAgVVNIT1JUIHVzTWF4TkJWb2x0YWdlOyAgCi0gIFVTSE9SVCB1c01pbk5CVm9sdGFnZTsgIAotICBVU0hPUlQgdXNCb290VXBOQlZvbHRhZ2U7ICAgICAgICAgCi0gIFVTSE9SVCB1c0V4dERpc3BDb25uSW5mb09mZnNldDsgIAotICBVQ0hBUiAgdWNIdGNUbXBMbXQ7ICAgCi0gIFVDSEFSICB1Y1RqT2Zmc2V0OyAgICAKKyAgVVNIT1JUIHVzTkJQMFZvbHRhZ2U7ICAgICAgICAgICAgICAgCisgIFVTSE9SVCB1c05CUDFWb2x0YWdlOworICBVU0hPUlQgdXNCb290VXBOQlZvbHRhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgVVNIT1JUIHVzRXh0RGlzcENvbm5JbmZvT2Zmc2V0OworICBVU0hPUlQgdXNQYW5lbFJlZnJlc2hSYXRlUmFuZ2U7ICAgICAKICAgVUNIQVIgIHVjTWVtb3J5VHlwZTsgIAogICBVQ0hBUiAgdWNVTUFDaGFubmVsTnVtYmVyOwogICBVTE9ORyAgdWxDU1JfTTNfQVJCX0NOVExfREVGQVVMVFsxMF07ICAKICAgVUxPTkcgIHVsQ1NSX00zX0FSQl9DTlRMX1VWRFsxMF07IAogICBVTE9ORyAgdWxDU1JfTTNfQVJCX0NOVExfRlMzRFsxMF07Ci0gIFVMT05HICB1bFJlc2VydmVkM1s0Ml07IAorICBBVE9NX0FWQUlMQUJMRV9TQ0xLX0xJU1QgICBzQXZhaWxfU0NMS1s1XTsKKyAgVUxPTkcgIHVsR01DUmVzdG9yZVJlc2V0VGltZTsKKyAgVUxPTkcgIHVsTWluaW11bU5DbGs7CisgIFVMT05HICB1bElkbGVOQ2xrOworICBVTE9ORyAgdWxERFJfRExMX1Bvd2VyVXBUaW1lOworICBVTE9ORyAgdWxERFJfUExMX1Bvd2VyVXBUaW1lOworICBVU0hPUlQgdXNQQ0lFQ2xrU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNQQ0lFQ2xrU1NUeXBlOworICBVU0hPUlQgdXNMdmRzU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNMdmRzU1NwcmVhZFJhdGVJbjEwSHo7CisgIFVTSE9SVCB1c0hETUlTU1BlcmNlbnRhZ2U7CisgIFVTSE9SVCB1c0hETUlTU3ByZWFkUmF0ZUluMTBIejsKKyAgVVNIT1JUIHVzRFZJU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNEVklTU3ByZWFkUmF0ZUluMTBIejsKKyAgVUxPTkcgIHVsUmVzZXJ2ZWQzWzIxXTsgCiAgIEFUT01fRVhURVJOQUxfRElTUExBWV9DT05ORUNUSU9OX0lORk8gc0V4dERpc3BDb25uSW5mbzsgICAKIH1BVE9NX0lOVEVHUkFURURfU1lTVEVNX0lORk9fVjY7ICAgCiAKKy8vIHVsR1BVQ2FwSW5mbworI2RlZmluZSBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2X0dQVUNBUElORk9fX1RNRFNIRE1JX0NPSEVSRU5UX1NJTkdMRVBMTF9NT0RFICAgICAgIDB4MDEKKyNkZWZpbmUgSU5URUdSQVRFRF9TWVNURU1fSU5GT19WNl9HUFVDQVBJTkZPX19ESVNBQkxFX0FVWF9IV19NT0RFX0RFVEVDVElPTiAgICAgICAgICAweDA4CisKKy8vIHVsT3RoZXJEaXNwbGF5TWlzYworI2RlZmluZSBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX19HRVRfRURJRF9DQUxMQkFDS19GVU5DX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2IERlc2NyaXB0aW9uCi0vL3VsQm9vdFVwRW5naW5lQ2xvY2s6ICAgICAgICAgICAgICBWQklPUyBib290dXAgRW5naW5lIGNsb2NrIGZyZXF1ZW5jeSwgaW4gMTBrSHogdW5pdC4gCi0vL3VsRGVudGlzdFZDT0ZyZXE6ICAgICAgICAgICAgICAgICBEZW50aXN0IFZDTyBjbG9jayBpbiAxMGtIeiB1bml0LiAKLS8vdWxCb290VXBVTUFDbG9jazogICAgICAgICAgICAgICAgIFN5c3RlbSBtZW1vcnkgYm9vdCB1cCBjbG9jayBmcmVxdWVuY3kgaW4gMTBLaHogdW5pdC4gCi0vL3VsUmVzZXJ2ZWQxWzhdICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBieSBub3csIG11c3QgYmUgMHgwLiAKLS8vdWxCb290VXBSZXFEaXNwbGF5VmVjdG9yCSAgICAgICAgVkJJT1MgYm9vdCB1cCBkaXNwbGF5IElEcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUICAgICAgICAgICAgICAgICAgMHgwMDAxCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDAwMTAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwOCAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDZfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDA0MCAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDA4MCAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDIwMCAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDRfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDQwMCAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA1X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDA4MDAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMgotLy91bE90aGVyRGlzcGxheU1pc2MgICAgICAJICAgICAgICBPdGhlciBkaXNwbGF5IHJlbGF0ZWQgZmxhZ3MsIG5vdCBkZWZpbmVkIHlldC4gCi0vL3VsR1BVQ2FwSW5mbyAgICAgICAgICAgICAgICAgICAgICBUQkQKLS8vdWxSZXNlcnZlZDJbM10gICAgICAgICAgICAgICAgICAgIG11c3QgYmUgMHgwIGZvciB0aGUgcmVzZXJ2ZWQuCi0vL3VsU3lzdGVtQ29uZmlnICAgICAgICAgICAgICAgICAgICBUQkQKLS8vdWxDUFVDYXBJbmZvICAgICAgICAgICAgICAgICAgICAgIFRCRAotLy91c01heE5CVm9sdGFnZSAgICAgICAgICAgICAgICAgICAgSGlnaCBOQiB2b2x0YWdlIGluIHVuaXQgb2YgbXYsIGNhbGN1bGF0ZWQgdXNpbmcgY3VycmVudCBWREROQiAoRDI0RjJ4REMpIGFuZCBWREROQiBvZmZzZXQgZnVzZS4gCi0vL3VzTWluTkJWb2x0YWdlICAgICAgICAgICAgICAgICAgICBMb3cgTkIgdm9sdGFnZSBpbiB1bml0IG9mIG12LCBjYWxjdWxhdGVkIHVzaW5nIGN1cnJlbnQgVkRETkIgKEQyNEYyeERDKSBhbmQgVkRETkIgb2Zmc2V0IGZ1c2UuCi0vL3VzQm9vdFVwTkJWb2x0YWdlICAgICAgICAgICAgICAgICBCb290IHVwIE5CIHZvbHRhZ2UgaW4gdW5pdCBvZiBtdi4KLS8vdWNIdGNUbXBMbXQgICAgICAgICAgICAgICAgICAgICAgIEJpdCBbMjI6MTZdIG9mIEQyNEYzeDY0IFRoZXJtYWwgQ29udHJvbCAoSFRDKSBSZWdpc3Rlci4KLS8vdWNUak9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgIEJpdCBbMjg6MjJdIG9mIEQyNEYzeEU0IFRoZXJtdHJpcCBTdGF0dXMgUmVnaXN0ZXIsbWF5IG5vdCBiZSBuZWVkZWQuCi0vL3VjTWVtb3J5VHlwZSAgICAgICAgICAgICAgICAgICAgICBbMzowXT0xOkREUjE7PTI6RERSMjs9MzpERFIzLls3OjRdIGlzIHJlc2VydmVkLgotLy91Y1VNQUNoYW5uZWxOdW1iZXIgICAgICAJICAgICAgICBTeXN0ZW0gbWVtb3J5IGNoYW5uZWwgbnVtYmVycy4gCi0vL3VzRXh0RGlzcENvbm5lY3Rpb25JbmZvT2Zmc2V0ICAgICBBVE9NX0VYVEVSTkFMX0RJU1BMQVlfQ09OTkVDVElPTl9JTkZPIG9mZnNldCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgdGhpcyB0YWJsZS4gCi0vL3VsQ1NSX00zX0FSQl9DTlRMX0RFRkFVTFRbMTBdICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBkZWZhdWx0Ci0vL3VsQ1NSX00zX0FSQl9DTlRMX1VWRFsxMF0gICAgICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBVVkQgcGxheWJhY2suCi0vL3VsQ1NSX00zX0FSQl9DTlRMX0ZTM0RbMTBdICAgICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBGdWxsIFNjcmVlbiAzRCBhcHBsaWNhdGlvbnMuCisgIEFUT01fSU5URUdSQVRFRF9TWVNURU1fSU5GT19WNiBEZXNjcmlwdGlvbgordWxCb290VXBFbmdpbmVDbG9jazogICAgICAgICAgICAgIFZCSU9TIGJvb3R1cCBFbmdpbmUgY2xvY2sgZnJlcXVlbmN5LCBpbiAxMGtIeiB1bml0LiBpZiBpdCBpcyBlcXVhbCAwLCB0aGVuIFZCSU9TIHVzZSBwcmUtZGVmaW5lZCBib290dXAgZW5naW5lIGNsb2NrCit1bERlbnRpc3RWQ09GcmVxOiAgICAgICAgICAgICAgICAgRGVudGlzdCBWQ08gY2xvY2sgaW4gMTBrSHogdW5pdC4gCit1bEJvb3RVcFVNQUNsb2NrOiAgICAgICAgICAgICAgICAgU3lzdGVtIG1lbW9yeSBib290IHVwIGNsb2NrIGZyZXF1ZW5jeSBpbiAxMEtoeiB1bml0LiAKK3NESVNQQ0xLX1ZvbHRhZ2U6ICAgICAgICAgICAgICAgICBSZXBvcnQgRGlzcGxheSBjbG9jayB2b2x0YWdlIHJlcXVpcmVtZW50LgorIAordWxCb290VXBSZXFEaXNwbGF5VmVjdG9yOiAgICAgICAgIFZCSU9TIGJvb3QgdXAgZGlzcGxheSBJRHMsIGZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIGRldmljZXMgaW4gTGlhbm8vT250YWlvIHByb2plY3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwOCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA2X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDAwNDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUICAgICAgICAgICAgICAgICAgMHgwMDgwICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDIwMCAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA0X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDA0MDAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDVfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDgwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMgordWxPdGhlckRpc3BsYXlNaXNjOiAgICAgIAkgICAgICAgIE90aGVyIGRpc3BsYXkgcmVsYXRlZCBmbGFncywgbm90IGRlZmluZWQgeWV0LiAKK3VsR1BVQ2FwSW5mbzogICAgICAgICAgICAgICAgICAgICBiaXRbMF09MDogVE1EUy9IRE1JIENvaGVyZW50IE1vZGUgdXNlIGNhc2NhZGUgUExMIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPTE6IFRNRFMvSERNSSBDb2hlcmVudCBNb2RlIHVzZSBzaWduZWwgUExMIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0WzNdPTA6IEVuYWJsZSBIVyBBVVggbW9kZSBkZXRlY3Rpb24gbG9naWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9MTogRGlzYWJsZSBIVyBBVVggbW9kZSBkZXR0aW9uIGxvZ2ljCit1bFNCX01NSU9fQmFzZV9BZGRyOiAgICAgICAgICAgICAgUGh5c2ljYWwgQmFzZSBhZGRyZXNzIHRvIFNCIE1NSU8gc3BhY2UuIERyaXZlciBuZWVkcyB0byBpbml0aWFsaXplIGl0IGZvciBTTVUgdXNhZ2UuCisKK3VzUmVxdWVzdGVkUFdNRnJlcUluSHo6ICAgICAgICAgICBXaGVuIGl0J3Mgc2V0IHRvIDB4MCBieSBTQklPUzogdGhlIExDRCBCYWNrTGlnaHQgaXMgbm90IGNvbnRyb2xsZWQgYnkgR1BVKFNXKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW55IGF0dGVtcHQgdG8gY2hhbmdlIEJMIHVzaW5nIFZCSU9TIGZ1bmN0aW9uIG9yIGVuYWJsZSBWYXJpQnJpIGZyb20gUFAgdGFibGUgaXMgbm90IGVmZmVjdGl2ZSBzaW5jZSBBVE9NX0JJT1NfSU5GT19CTF9DT05UUk9MTEVEX0JZX0dQVT09MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGl0J3Mgc2V0IHRvIGEgbm9uLXplcm8gZnJlcXVlbmN5LCB0aGUgQmFja0xpZ2h0IGlzIGNvbnRyb2xsZWQgYnkgR1BVIChTVykgaW4gb25lIG9mIHR3byB3YXlzIGJlbG93OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFNXIHVzZXMgdGhlIEdQVSBCTCBQV00gb3V0cHV0IHRvIGNvbnRyb2wgdGhlIEJMLCBpbiBjaGlzIGNhc2UsIHRoaXMgbm9uLXplcm8gZnJlcXVlbmN5IGRldGVybWluZXMgd2hhdCBmcmVxIEdQVSBzaG91bGQgdXNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCSU9TIHdpbGwgc2V0IHVwIHByb3BlciBQV00gZnJlcXVlbmN5IGFuZCBBVE9NX0JJT1NfSU5GT19CTF9DT05UUk9MTEVEX0JZX0dQVT09MSxhcyB0aGUgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5naW5nIEJMIHVzaW5nIFZCSU9TIGZ1bmN0aW9uIGlzIGZ1bmN0aW9uYWwgaW4gYm90aCBkcml2ZXIgYW5kIG5vbi1kcml2ZXIgcHJlc2VudCBlbnZpcm9ubWVudDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVuYWJsaW5nIFZhcmlCcmkgdW5kZXIgdGhlIGRyaXZlciBlbnZpcm9ubWVudCBmcm9tIFBQIHRhYmxlIGlzIG9wdGlvbmFsLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU1cgdXNlcyBvdGhlciBtZWFucyB0byBjb250cm9sIEJMIChsaWtlIERQQ0QpLHRoaXMgbm9uLXplcm8gZnJlcXVlbmN5IHNlcnZlcyBhcyBhIGZsYWcgb25seSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBCTCBjb250cm9sIGZyb20gR1BVIGlzIGV4cGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCSU9TIHdpbGwgTk9UIHNldCB1cCBQV00gZnJlcXVlbmN5IGJ1dCBtYWtlIEFUT01fQklPU19JTkZPX0JMX0NPTlRST0xMRURfQllfR1BVPT0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdpbmcgQkwgdXNpbmcgVkJJT1MgZnVuY3Rpb24gY291bGQgYmUgZnVuY3Rpb25hbCBpbiBib3RoIGRyaXZlciBhbmQgbm9uLWRyaXZlciBwcmVzZW50IGVudmlyb25tZW50LGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0J3MgcGVyIHBsYXRmb3JtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmFibGluZyBWYXJpQnJpIHVuZGVyIHRoZSBkcml2ZXIgZW52aXJvbm1lbnQgZnJvbSBQUCB0YWJsZSBpcyBvcHRpb25hbC4KKwordWNIdGNUbXBMbXQ6ICAgICAgICAgICAgICAgICAgICAgIFJlZmVyIHRvIEQxOEYzeDY0IGJpdFsyMjoxNl0sIEh0Y1RtcExtdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkIG9uIHZhbHVlIHRvIGVudGVyIEhUQ19hY3RpdmUgc3RhdGUuCit1Y0h0Y0h5c3RMbXQ6ICAgICAgICAgICAgICAgICAgICAgUmVmZXIgdG8gRDE4RjN4NjQgYml0WzI3OjI0XSwgSHRjSHlzdExtdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRocmVzaG9sZCBvZmYgdmFsdWUgdG8gZXhpdCBIVENfYWN0aXZlIHN0YXRlLCB3aGljaCBpcyBUaHJlc2hvbGQgb24gdmxhdWUgbWludXMgdWNIdGNIeXN0TG10LgordWxNaW5FbmdpbmVDbG9jazogICAgICAgICAgICAgICAgIE1pbmltdW0gU0NMSyBhbGxvd2VkIGluIDEwa0h6IHVuaXQuIFRoaXMgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBXUkNLIEZ1c2Ugc2V0dGluZ3MuCit1bFN5c3RlbUNvbmZpZzogICAgICAgICAgICAgICAgICAgQml0WzBdPTA6IFBDSUUgUG93ZXIgR2F0aW5nIERpc2FibGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0xOiBQQ0lFIFBvd2VyIEdhdGluZyBFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0WzFdPTA6IEREUi1ETEwgc2h1dC1kb3duIGZlYXR1cmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEREUi1ETEwgc2h1dC1kb3duIGZlYXR1cmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRbMl09MDogRERSLVBMTCBQb3dlciBkb3duIGZlYXR1cmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEREUi1QTEwgUG93ZXIgZG93biBmZWF0dXJlIGVuYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit1bENQVUNhcEluZm86ICAgICAgICAgICAgICAgICAgICAgVEJECit1c05CUDBWb2x0YWdlOiAgICAgICAgICAgICAgICAgICAgVklEIGZvciB2b2x0YWdlIG9uIE5CIFAwIFN0YXRlCit1c05CUDFWb2x0YWdlOiAgICAgICAgICAgICAgICAgICAgVklEIGZvciB2b2x0YWdlIG9uIE5CIFAxIFN0YXRlICAKK3VzQm9vdFVwTkJWb2x0YWdlOiAgICAgICAgICAgICAgICBWb2x0YWdlIEluZGV4IG9mIEdOQiB2b2x0YWdlIGNvbmZpZ3VyZWQgYnkgU0JJT1MsIHdoaWNoIGlzIHN1ZmZjaWVudCB0byBzdXBwb3J0IFZCSU9TIERJU1BDTEsgcmVxdWlyZW1lbnQuCit1c0V4dERpc3BDb25uSW5mb09mZnNldDogICAgICAgICAgT2Zmc2V0IHRvIHNFeHREaXNwQ29ubkluZm8gaW5zaWRlIHRoZSBzdHJ1Y3R1cmUKK3VzUGFuZWxSZWZyZXNoUmF0ZVJhbmdlOiAgICAgICAgICBCaXQgdmVjdG9yIGZvciBMQ0Qgc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZSByYW5nZS4gSWYgRFJSIGlzIHJlcXVlc3RkIGJ5IHRoZSBwbGF0Zm9ybSwgYXQgbGVhc3QgdHdvIGJpdHMgbmVlZCB0byBiZSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHJhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9MQ0RfUkVGUkVTSFJBVEVfMzBIeiAgICAgICAgICAweDAwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfTENEX1JFRlJFU0hSQVRFXzQwSHogICAgICAgICAgMHgwMDA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0xDRF9SRUZSRVNIUkFURV81MEh6ICAgICAgICAgIDB4MDAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9MQ0RfUkVGUkVTSFJBVEVfNjBIeiAgICAgICAgICAweDAwMjAKK3VjTWVtb3J5VHlwZTogICAgICAgICAgICAgICAgICAgICBbMzowXT0xOkREUjE7PTI6RERSMjs9MzpERFIzLls3OjRdIGlzIHJlc2VydmVkLgordWNVTUFDaGFubmVsTnVtYmVyOiAgICAgIAkgICAgICAgIFN5c3RlbSBtZW1vcnkgY2hhbm5lbCBudW1iZXJzLiAKK3VsQ1NSX00zX0FSQl9DTlRMX0RFRkFVTFRbMTBdOiAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBkZWZhdWx0Cit1bENTUl9NM19BUkJfQ05UTF9VVkRbMTBdOiAgICAgICAgQXJyYXlzIHdpdGggdmFsdWVzIGZvciBDU1IgTTMgYXJiaXRlciBmb3IgVVZEIHBsYXliYWNrLgordWxDU1JfTTNfQVJCX0NOVExfRlMzRFsxMF06ICAgICAgIEFycmF5cyB3aXRoIHZhbHVlcyBmb3IgQ1NSIE0zIGFyYml0ZXIgZm9yIEZ1bGwgU2NyZWVuIDNEIGFwcGxpY2F0aW9ucy4KK3NBdmFpbF9TQ0xLWzVdOiAgICAgICAgICAgICAgICAgICBBcnJheXMgdG8gcHJvdmlkZSBhdmFpbGFiZSBsaXN0IG9mIFNMQ0sgYW5kIGNvcnJlc3BvbmRpbmcgdm9sdGFnZSwgb3JkZXIgZnJvbSBsb3cgdG8gaGlnaCAgCit1bEdNQ1Jlc3RvcmVSZXNldFRpbWU6ICAgICAgICAgICAgR01DIHBvd2VyIHJlc3RvcmUgYW5kIEdNQyByZXNldCB0aW1lIHRvIGNhbGN1bGF0ZSBkYXRhIHJlY29ubmVjdGlvbiBsYXRlbmN5LiBVbml0IGluIG5zLiAKK3VsTWluaW11bU5DbGs6ICAgICAgICAgICAgICAgICAgICBNaW5pbXVtIE5DTEsgc3BlZWQgYW1vbmcgYWxsIE5CLVBzdGF0ZXMgdG8gY2FsY3VhbHRlIGRhdGEgcmVjb25uZWN0aW9uIGxhdGVuY3kuIFVuaXQgaW4gMTBrSHouIAordWxJZGxlTkNsazogICAgICAgICAgICAgICAgICAgICAgIE5DTEsgc3BlZWQgd2hpbGUgbWVtb3J5IHJ1bnMgaW4gc2VsZi1yZWZyZXNoIHN0YXRlLiBVbml0IGluIDEwa0h6LgordWxERFJfRExMX1Bvd2VyVXBUaW1lOiAgICAgICAgICAgIEREUiBQSFkgRExMIHBvd2VyIHVwIHRpbWUuIFVuaXQgaW4gbnMuCit1bEREUl9QTExfUG93ZXJVcFRpbWU6ICAgICAgICAgICAgRERSIFBIWSBQTEwgcG93ZXIgdXAgdGltZS4gVW5pdCBpbiBucy4KK3VzUENJRUNsa1NTUGVyY2VudGFnZTogICAgICAgICAgICBQQ0lFIENsb2NrIFNwcmVkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUuCit1c1BDSUVDbGtTU1R5cGU6ICAgICAgICAgICAgICAgICAgUENJRSBDbG9jayBTcHJlZCBTcGVjdHJ1bSBUeXBlLiAwIGZvciBEb3duIHNwcmVhZChkZWZhdWx0KTsgMSBmb3IgQ2VudGVyIHNwcmVhZC4KK3VzTHZkc1NTUGVyY2VudGFnZTogICAgICAgICAgICAgICBMVkRTIHBhbmVsICggbm90IGluY2x1ZGUgZURQICkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCBvZiAwLjAxJSwgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAordXNMdmRzU1NwcmVhZFJhdGVJbjEwSHo6ICAgICAgICAgIExWRFMgcGFuZWwgKCBub3QgaW5jbHVkZSBlRFAgKSBTcHJlYWQgU3BlY3RydW0gZnJlcXVlbmN5IGluIHVuaXQgb2YgMTBIeiwgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAordXNIRE1JU1NQZXJjZW50YWdlOiAgICAgICAgICAgICAgIEhETUkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUsICA9MCwgdXNlIFZCSU9TIGRlZmF1bHQgc2V0dGluZy4gCit1c0hETUlTU3ByZWFkUmF0ZUluMTBIejogICAgICAgICAgSERNSSBTcHJlYWQgU3BlY3RydW0gZnJlcXVlbmN5IGluIHVuaXQgb2YgMTBIeiwgID0wLCB1c2UgVkJJT1MgZGVmYXVsdCBzZXR0aW5nLiAKK3VzRFZJU1NQZXJjZW50YWdlOiAgICAgICAgICAgICAgICBEVkkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUsICA9MCwgdXNlIFZCSU9TIGRlZmF1bHQgc2V0dGluZy4gCit1c0RWSVNTcHJlYWRSYXRlSW4xMEh6OiAgICAgICAgICAgRFZJIFNwcmVhZCBTcGVjdHJ1bSBmcmVxdWVuY3kgaW4gdW5pdCBvZiAxMEh6LCAgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzc5MCw2ICs0NDM5LDcgQEAKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9MVkRTICAgIDYKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9EUCAgICAgIDcKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9EQ1BMTCAgIDgKKyNkZWZpbmUgQVNJQ19FWFRFUk5BTF9TU19PTl9EUF9DTE9DSyA5CiAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX0FTSUNfU1NfQVNTSUdOTUVOVF9WMgogewpAQCAtMzkwMyw2ICs0NTUzLDcgQEAKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfQUMgICAgIDEKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfREMgICAgIDIKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfTElURUFDIDMKKyNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfTElUMkFDIDQKIAogLy9CeXRlIGFsaWduZWQgZGVmaW50aW9uIGZvciBCSU9TIHVzYWdlCiAjZGVmaW5lIEFUT01fUzBfQ1JUMV9NT05PYjAgICAgICAgICAgICAgMHgwMQpAQCAtNDUyOSw3ICs1MTgwLDggQEAKICNkZWZpbmUgSU5ERVhfQUNDRVNTX1JBTkdFX0JFR0lOCSAgICAoVkFMVUVfRFdPUkQgKyAxKQogI2RlZmluZSBJTkRFWF9BQ0NFU1NfUkFOR0VfRU5ECQkgICAgKElOREVYX0FDQ0VTU19SQU5HRV9CRUdJTiArIDEpCiAjZGVmaW5lIFZBTFVFX0lOREVYX0FDQ0VTU19TSU5HTEUJICAgIChJTkRFWF9BQ0NFU1NfUkFOR0VfRU5EICsgMSkKLQorLy8jZGVmaW5lIEFDQ0VTU19NQ0lPREVCVUdJTkQgICAgICAgICAgICAweDQwICAgICAgIC8vZGVmaW5lZCBpbiBCSU9TIGNvZGUKKyNkZWZpbmUgQUNDRVNTX1BMQUNFSE9MREVSICAgICAgICAgICAgIDB4ODAKIAogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fTUNfSU5JVF9QQVJBTV9UQUJMRQogeyAKQEAgLTQ1NTQsNiArNTIwNiwxMCBAQAogI2RlZmluZSBfMzJNeDMyICAgICAgICAgICAgIDB4MzMKICNkZWZpbmUgXzY0TXg4ICAgICAgICAgICAgICAweDQxCiAjZGVmaW5lIF82NE14MTYgICAgICAgICAgICAgMHg0MgorI2RlZmluZSBfNjRNeDMyICAgICAgICAgICAgIDB4NDMKKyNkZWZpbmUgXzEyOE14OCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIF8xMjhNeDE2ICAgICAgICAgICAgMHg1MgorI2RlZmluZSBfMjU2TXg4ICAgICAgICAgICAgIDB4NjEKIAogI2RlZmluZSBTQU1TVU5HICAgICAgICAgICAgIDB4MQogI2RlZmluZSBJTkZJTkVPTiAgICAgICAgICAgIDB4MgpAQCAtNDU2OSwxMCArNTIyNSwxMSBAQAogI2RlZmluZSBRSU1PTkRBICAgICAgICAgICAgIElORklORU9OCiAjZGVmaW5lIFBST01PUyAgICAgICAgICAgICAgTU9TRUwKICNkZWZpbmUgS1JFVE9OICAgICAgICAgICAgICBJTkZJTkVPTgorI2RlZmluZSBFTElYSVIgICAgICAgICAgICAgIE5BTllBCiAKIC8vLy8vLy8vLy8vLy9TdXBwb3J0IGZvciBHRERSNSBNQyB1Q29kZSB0byByZXNpZGUgaW4gdXBwZXIgNjRLIG9mIFJPTS8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBVQ09ERV9ST01fU1RBUlRfQUREUkVTUwkJMHgxYzAwMAorI2RlZmluZSBVQ09ERV9ST01fU1RBUlRfQUREUkVTUwkJMHgxYjgwMAogI2RlZmluZQlVQ09ERV9TSUdOQVRVUkUJCQkweDQzNzU0MzRkIC8vICdNQ3VDJyAtIE1DIHVDb2RlCiAKIC8vdUNvZGUgYmxvY2sgaGVhZGVyIGZvciByZWZlcmVuY2UKQEAgLTQ5MDMsNyArNTU2MCwzNCBAQAogICBBVE9NX01FTU9SWV9USU1JTkdfRk9STUFUX1YyICBhc01lbVRpbWluZ1s1XTsvL01lbW9yeSBUaW1pbmcgYmxvY2sgc29ydCBmcm9tIGxvd2VyIGNsb2NrIHRvIGhpZ2hlciBjbG9jawogfUFUT01fVlJBTV9NT0RVTEVfVjY7CiAKLQordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVlJBTV9NT0RVTEVfVjcKK3sKKy8vIERlc2lnbiBTcGVjaWZpYyBWYWx1ZXMKKyAgVUxPTkcJICB1bENoYW5uZWxNYXBDZmc7CSAgICAgICAgICAgICAgICAvLyBtbU1DX1NIQVJFRF9DSFJFTUFQCisgIFVTSE9SVCAgdXNNb2R1bGVTaXplOyAgICAgICAgICAgICAgICAgICAgIC8vIFNpemUgb2YgQVRPTV9WUkFNX01PRFVMRV9WNworICBVU0hPUlQgIHVzUHJpdmF0ZVJlc2VydmVkOyAgICAgICAgICAgICAgICAvLyBNQ19BUkJfUkFNQ0ZHIChpbmNsdWRlcyBOT09GQkFOSyxOT09GUkFOS1MsTk9PRlJPV1MsTk9PRkNPTFMpCisgIFVTSE9SVCAgdXNSZXNlcnZlZDsKKyAgVUNIQVIgICB1Y0V4dE1lbW9yeUlEOyAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBtZW1vcnkgbW9kdWxlIElECisgIFVDSEFSICAgdWNNZW1vcnlUeXBlOyAgICAgICAgICAgICAgICAgICAgIC8vIE1FTV9UWVBFX0REUjIvRERSMy9HRERSMy9HRERSNQorICBVQ0hBUiAgIHVjQ2hhbm5lbE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVtLiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gdGhpcyBtb2R1bGUKKyAgVUNIQVIgICB1Y0NoYW5uZWxXaWR0aDsgICAgICAgICAgICAgICAgICAgLy8gQ0hBTk5FTF8xNkJJVC9DSEFOTkVMXzMyQklUL0NIQU5ORUxfNjRCSVQKKyAgVUNIQVIgICB1Y0RlbnNpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gXzhNeDMyLCBfMTZNeDMyLCBfMTZNeDE2LCBfMzJNeDE2CisgIFVDSEFSCSAgdWNSZXNlcnZlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1lciBjb250YWluZXIgZm9yIE14X0ZMQUdTIGxpa2UgREJJX0FDX01PREVfRU5BQkxFX0FTSUMgZm9yIEdERFI0LiBOb3QgdXNlZCBub3cuCisgIFVDSEFSCSAgdWNNaXNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJBTktfT0ZfVEhJU01FTU9SWSBldGMuCisgIFVDSEFSCSAgdWNWUkVGSTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB1c2VkLgorICBVQ0hBUiAgIHVjTlBMX1JUOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZCB0cmlwIGRlbGF5IChNQ19TRVFfQ0FTX1RJTUlORyBbMjg6MjRdOlRDTD1DTCtOUExfUlQtMikuIEFsd2F5cyAyLgorICBVQ0hBUgkgIHVjUHJlYW1ibGU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbNzo0XSBXcml0ZSBQcmVhbWJsZSwgWzM6MF0gUmVhZCBQcmVhbWJsZQorICBVQ0hBUiAgIHVjTWVtb3J5U2l6ZTsgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBtZW1vcnkgc2l6ZSBpbiB1bml0IG9mIDE2TUIgZm9yIENPTkZJR19NRU1TSVpFIC0gYml0WzIzOjBdIHplcm9zCisgIFVDSEFSICAgdWNSZXNlcnZlZFszXTsKKy8vIE1lbW9yeSBNb2R1bGUgc3BlY2lmaWMgdmFsdWVzCisgIFVTSE9SVCAgdXNFTVJTMlZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEVNUlMyL01SMiBWYWx1ZS4gCisgIFVTSE9SVCAgdXNFTVJTM1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEVNUlMzL01SMyBWYWx1ZS4KKyAgVUNIQVIgICB1Y01lbW9yeVZlbmRlcklEOyAgICAgICAgICAgICAgICAgLy8gWzc6NF0gUmV2aXNpb24sIFszOjBdIFZlbmRvciBjb2RlCisgIFVDSEFSCSAgdWNSZWZyZXNoUmF0ZUZhY3RvcjsgICAgICAgICAgICAgIC8vIFsxOjBdPVJlZnJlc2hGYWN0b3IgKDAwPThtcywgMDE9MTZtcywgMTA9MzJtcywxMT02NG1zKQorICBVQ0hBUgkgIHVjRklGT0RlcHRoOyAgICAgICAgICAgICAgICAgICAgICAvLyBGSUZPIGRlcHRoIGNhbiBiZSBkZXRlY3RlZCBkdXJpbmcgdmVuZG9yIGRldGVjdGlvbiwgaGVyZSBpcyBoYXJkY29kZWQgcGVyIG1lbW9yeQorICBVQ0hBUiAgIHVjQ0RSX0JhbmR3aWR0aDsgICAgICAgICAgICAgICAgICAvLyBbMDozXT1SZWFkIENEUiBiYW5kd2lkdGgsIFs0OjddIC0gV3JpdGUgQ0RSIEJhbmR3aWR0aAorICBjaGFyICAgIHN0ck1lbVBOU3RyaW5nWzIwXTsgICAgICAgICAgICAgICAvLyBwYXJ0IG51bWJlciBlbmQgd2l0aCAnMCcuIAorfUFUT01fVlJBTV9NT0RVTEVfVjc7CiAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1ZSQU1fSU5GT19WMgogewpAQCAtNDk0Miw2ICs1NjI2LDIwIEBACiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLwlBVE9NX0lOSVRfUkVHX0JMT0NLCQkJCSBhTWVtQWRqdXN0OwogfUFUT01fVlJBTV9JTkZPX1Y0OwogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9WUkFNX0lORk9fSEVBREVSX1YyXzEKK3sKKyAgQVRPTV9DT01NT05fVEFCTEVfSEVBREVSICAgc0hlYWRlcjsKKwlVU0hPUlQJCQkJCQkJCQkJIHVzTWVtQWRqdXN0VGJsT2Zmc2V0OwkJCQkJCQkJCQkJCQkgLy8gb2Zmc2V0IG9mIEFUT01fSU5JVF9SRUdfQkxPQ0sgc3RydWN0dXJlIGZvciBtZW1vcnkgdmVuZG9yIHNwZWNpZmljIE1DIGFkanVzdCBzZXR0aW5nCisJVVNIT1JUCQkJCQkJCQkJCSB1c01lbUNsa1BhdGNoVGJsT2Zmc2V0OwkJCQkJCQkJCQkJCSAvLwlvZmZzZXQgb2YgQVRPTV9JTklUX1JFR19CTE9DSyBzdHJ1Y3R1cmUgZm9yIG1lbW9yeSBjbG9jayBzcGVjaWZpYyBNQyBzZXR0aW5nCisJVVNIT1JUCQkJCQkJCQkJCSB1c1Jlc2VydmVkWzRdOworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICB1Y051bU9mVlJBTU1vZHVsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSBudW1iZXIgb2YgVlJBTSBtb2R1bGUKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNNZW1vcnlDbGtQYXRjaFRibFZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBvZiBtZW1vcnkgQUMgdGltaW5nIHJlZ2lzdGVyIGxpc3QKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNWcmFtTW9kdWxlVmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgQVRPTV9WUkFNX01PRFVFIHZlcnNpb24KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDsgCisgIEFUT01fVlJBTV9NT0RVTEVfVjcJCSAgICAgYVZyYW1JbmZvW0FUT01fTUFYX05VTUJFUl9PRl9WUkFNX01PRFVMRV07ICAgICAgLy8ganVzdCBmb3IgYWxsb2NhdGlvbiwgcmVhbCBudW1iZXIgb2YgYmxvY2tzIGlzIGluIHVjTnVtT2ZWUkFNTW9kdWxlOworfUFUT01fVlJBTV9JTkZPX0hFQURFUl9WMl8xOworCisKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1ZSQU1fR1BJT19ERVRFQ1RJT05fSU5GTwogewogICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgICBzSGVhZGVyOwpAQCAtNTE4Miw2ICs1ODgwLDE2IEBACiAJVUNIQVIgIHVjUmVzZXJ2ZWQ7CiB9QVNJQ19UUkFOU01JVFRFUl9JTkZPOwogCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0RWT19TRFJfTU9ERSAgICAgICAgICAweDAxCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0NPSEVSRU5UX01PREUgICAgICAgICAweDAyCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJPQkpfSURfTUFTSyAgICAweGM0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQSAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQiAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQyAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRCAgICAgICAgICAgICAweDQ0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRiAgICAgICAgICAgICAweDg0CisKIHR5cGVkZWYgc3RydWN0IF9BU0lDX0VOQ09ERVJfSU5GTwogewogCVVDSEFSIHVjRW5jb2RlcklEOwpAQCAtNTI4NCw2ICs1OTkyLDI4IEBACiAvKiAvb2JzZWxldGUgKi8KICNkZWZpbmUgRFBfRU5DT0RFUl9TRVJWSUNFX1BTX0FMTE9DQVRJT04JCQkJV1JJVEVfT05FX0JZVEVfSFdfSTJDX0RBVEFfUEFSQU1FVEVSUwogCisKK3R5cGVkZWYgc3RydWN0IF9EUF9FTkNPREVSX1NFUlZJQ0VfUEFSQU1FVEVSU19WMgoreworCVVTSE9SVCB1c0V4dEVuY29kZXJPYmpJZDsgICAvLyBFeHRlcm5hbCBFbmNvZGVyIE9iamVjdCBJZCwgb3V0cHV0IHBhcmFtZXRlciBvbmx5LCB1c2Ugd2hlbiB1Y0FjdGlvbiA9IERQX1NFUlZJQ0VfVjJfQUNUSU9OX0RFVF9FWFRfQ09OTkVDVElPTgorICBVQ0hBUiAgdWNBdXhJZDsKKyAgVUNIQVIgIHVjQWN0aW9uOworICBVQ0hBUiAgdWNTaW5rVHlwZTsgICAgICAgICAgLy8gSXB1dCBhbmQgT3V0cHV0IHBhcmFtZXRlcnMuIAorICBVQ0hBUiAgdWNIUERJZDsgICAgICAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyLCB1c2VkIHdoZW4gdWNBY3Rpb24gPSBEUF9TRVJWSUNFX1YyX0FDVElPTl9ERVRfRVhUX0NPTk5FQ1RJT04KKwlVQ0hBUiAgdWNSZXNlcnZlZFsyXTsKK31EUF9FTkNPREVSX1NFUlZJQ0VfUEFSQU1FVEVSU19WMjsKKwordHlwZWRlZiBzdHJ1Y3QgX0RQX0VOQ09ERVJfU0VSVklDRV9QU19BTExPQ0FUSU9OX1YyCit7CisgIERQX0VOQ09ERVJfU0VSVklDRV9QQVJBTUVURVJTX1YyIGFzRFBTZXJ2aWNlUGFyYW07CisgIFBST0NFU1NfQVVYX0NIQU5ORUxfVFJBTlNBQ1RJT05fUEFSQU1FVEVSU19WMiBhc0F1eFBhcmFtOworfURQX0VOQ09ERVJfU0VSVklDRV9QU19BTExPQ0FUSU9OX1YyOworCisvLyB1Y0FjdGlvbgorI2RlZmluZSBEUF9TRVJWSUNFX1YyX0FDVElPTl9HRVRfU0lOS19UWVBFCQkJCQkJCTB4MDEKKyNkZWZpbmUgRFBfU0VSVklDRV9WMl9BQ1RJT05fREVUX0xDRF9DT05ORUNUSU9OCQkJICAgIDB4MDIKKworCiAvLyBEUF9UUkFJTklOR19UQUJMRQogI2RlZmluZSBEUENEX1NFVF9MSU5LUkFURV9MQU5FTlVNX1BBVFRFUk4xX1RCTF9BRERSCQkJCUFUT01fRFBfVFJBSU5JTkdfVEJMX0FERFIJCQogI2RlZmluZSBEUENEX1NFVF9TU19DTlRMX1RCTF9BRERSCQkJCQkJCQkJCQkJCShBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICsgOCApCkBAIC01MzM5LDYgKzYwNjksNyBAQAogI2RlZmluZSBTRUxFQ1RfRENJT19JTVBDQUwgICAgICAgICAgICA0CiAjZGVmaW5lIFNFTEVDVF9EQ0lPX0RJRyAgICAgICAgICAgICAgIDYKICNkZWZpbmUgU0VMRUNUX0NSVENfUElYRUxfUkFURSAgICAgICAgNworI2RlZmluZSBTRUxFQ1RfVkdBX0JMSyAgICAgICAgICAgICAgICA4CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vUG9ydGlvbiBWSTogRGVmaW5pdGlub3MgZm9yIHZiaW9zIE1DIHNjcmF0Y2ggcmVnaXN0ZXJzIHRoYXQgZHJpdmVyIHVzZWQKQEAgLTU3NDQsNyArNjQ3NSwxNyBAQAogI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0FEVDc0NzMgICA5CiAjZGVmaW5lIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfRVhURVJOQUxfR1BJTyAgICAgMTEKICNkZWZpbmUgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FVkVSR1JFRU4gMTIKKyNkZWZpbmUgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FTUMyMTAzICAgMTMgIC8qIDB4MEQgKi8gLy8gT25seSBmYW4gY29udHJvbCB3aWxsIGJlIGltcGxlbWVudGVkLCBkbyBOT1Qgc2hvdyB0aGlzIGluIFBQR2VuLgorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX1NVTU8gICAgICAxNCAgLyogMHgwRSAqLyAvLyBTdW1vIHR5cGUsIHVzZWQgaW50ZXJuYWxseQorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX05JU0xBTkRTICAxNQorCisvLyBUaGVybWFsIGNvbnRyb2xsZXIgJ2NvbWJvIHR5cGUnIHRvIHVzZSBhbiBleHRlcm5hbCBjb250cm9sbGVyIGZvciBGYW4gY29udHJvbCBhbmQgYW4gaW50ZXJuYWwgY29udHJvbGxlciBmb3IgdGhlcm1hbC4KKy8vIFdlIHByb2JhYmx5IHNob3VsZCByZXNlcnZlIHRoZSBiaXQgMHg4MCBmb3IgdGhpcyB1c2UuCisvLyBUbyBrZWVwIHRoZSBudW1iZXIgb2YgdGhlc2UgdHlwZXMgbG93IHdlIHNob3VsZCBhbHNvIHVzZSB0aGUgc2FtZSBjb2RlIGZvciBhbGwgQVNJQ3MgKGkuZS4gZG8gbm90IGRpc3Rpbmd1aXNoIFJWNnh4IGFuZCBSVjd4eCBJbnRlcm5hbCBoZXJlKS4KKy8vIFRoZSBkcml2ZXIgY2FuIHBpY2sgdGhlIGNvcnJlY3QgaW50ZXJuYWwgY29udHJvbGxlciBiYXNlZCBvbiB0aGUgQVNJQy4KKwogI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0FEVDc0NzNfV0lUSF9JTlRFUk5BTCAgIDB4ODkgICAgLy8gQURUNzQ3MyBGYW4gQ29udHJvbCArIEludGVybmFsIFRoZXJtYWwgQ29udHJvbGxlcgorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VNQzIxMDNfV0lUSF9JTlRFUk5BTCAgIDB4OEQgICAgLy8gRU1DMjEwMyBGYW4gQ29udHJvbCArIEludGVybmFsIFRoZXJtYWwgQ29udHJvbGxlcgogCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVEFURQogewpAQCAtNTg0MSw2ICs2NTgyLDI5IEBACiAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgdXNFeHRlbmRlbmRlZEhlYWRlck9mZnNldDsKIH0gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTMsICpMUEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEUzOwogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTQKK3sKKyAgICBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFMyBiYXNpY1RhYmxlMzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bEdvbGRlblBQSUQ7ICAgICAgICAgICAgICAgICAgICAvLyBQUEdlbiB1c2Ugb25seSAgICAgCisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdWxHb2xkZW5SZXZpc2lvbjsgICAgICAgICAgICAgICAgLy8gUFBHZW4gdXNlIG9ubHkKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICB1c1ZkZGNEZXBlbmRlbmN5T25TQ0xLT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzVmRkY2lEZXBlbmRlbmN5T25NQ0xLT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzVmRkY0RlcGVuZGVuY3lPbk1DTEtPZmZzZXQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgdXNNYXhDbG9ja1ZvbHRhZ2VPbkRDT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWRbMl07ICAKK30gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTQsICpMUEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEU0OworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTUKK3sKKyAgICBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFNCBiYXNpY1RhYmxlNDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bFREUExpbWl0OworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgIHVsTmVhclREUExpbWl0OworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgIHVsU1FSYW1waW5nVGhyZXNob2xkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzQ0FDTGVha2FnZVRhYmxlT2Zmc2V0OyAgICAgICAgIC8vIFBvaW50cyB0byBBVE9NX1BQTElCX0NBQ19MZWFrYWdlX1RhYmxlCisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdWxDQUNMZWFrYWdlOyAgICAgICAgICAgICAgICAgICAgLy8gVEJELCB0aGlzIHBhcmFtZXRlciBpcyBzdGlsbCB1bmRlciBkaXNjdXNzaW9uLiAgQ2hhbmdlIHRvIHVsUmVzZXJ2ZWQgaWYgbm90IG5lZWRlZC4KKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bFJlc2VydmVkOworfSBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFNSwgKkxQQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTU7CisKIC8vLy8gQVRPTV9QUExJQl9OT05DTE9DS19JTkZPOjp1c0NsYXNzaWZpY2F0aW9uCiAjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTUFTSyAgICAgICAgICAweDAwMDcKICNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9TSElGVCAgICAgICAgIDAKQEAgLTU4NjQsNiArNjYyOCwxMCBAQAogI2RlZmluZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX0hEU1RBVEUgICAgICAgICAgICAgICAgMHg0MDAwCiAjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fU0RTVEFURSAgICAgICAgICAgICAgICAweDgwMDAKIAorLy8vLyBBVE9NX1BQTElCX05PTkNMT0NLX0lORk86OnVzQ2xhc3NpZmljYXRpb24yCisjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT04yX0xJTUlURURQT1dFUlNPVVJDRV8yICAgICAweDAwMDEKKyNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTjJfVUxWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorCiAvLy8vIEFUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTzo6dWxDYXBzQW5kU2V0dGluZ3MKICNkZWZpbmUgQVRPTV9QUExJQl9TSU5HTEVfRElTUExBWV9PTkxZICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEFUT01fUFBMSUJfU1VQUE9SVFNfVklERU9fUExBWUJBQ0sgICAgICAgICAweDAwMDAwMDAyCkBAIC01ODk2LDkgKzY2NjQsMjEgQEAKICNkZWZpbmUgQVRPTV9QUExJQl9NM0FSQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDYwMDAwCiAjZGVmaW5lIEFUT01fUFBMSUJfTTNBUkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTcKIAorI2RlZmluZSBBVE9NX1BQTElCX0VOQUJMRV9EUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKworLy8gcmVtYWluaW5nIDE2IGJpdHMgYXJlIHJlc2VydmVkCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9USEVSTUFMX1NUQVRFCit7CisgICAgVUNIQVIgICB1Y01pblRlbXBlcmF0dXJlOworICAgIFVDSEFSICAgdWNNYXhUZW1wZXJhdHVyZTsKKyAgICBVQ0hBUiAgIHVjVGhlcm1hbEFjdGlvbjsKK31BVE9NX1BQTElCX1RIRVJNQUxfU1RBVEUsICpMUEFUT01fUFBMSUJfVEhFUk1BTF9TVEFURTsKKwogLy8gQ29udGFpbmVkIGluIGFuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQKIC8vIGluIEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEU6OnVzTm9uQ2xvY2tJbmZvQXJyYXlPZmZzZXQuCiAvLyByZWZlcmVuY2VkIGZyb20gQVRPTV9QUExJQl9TVEFURV9JTkZPOjp1Y05vbkNsb2NrU3RhdGVJbmRleAorI2RlZmluZSBBVE9NX1BQTElCX05PTkNMT0NLSU5GT19WRVIxICAgICAgMTIKKyNkZWZpbmUgQVRPTV9QUExJQl9OT05DTE9DS0lORk9fVkVSMiAgICAgIDI0CiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPCiB7CiAgICAgICBVU0hPUlQgdXNDbGFzc2lmaWNhdGlvbjsKQEAgLTU5MDYsMTUgKzY2ODYsMTUgQEAKICAgICAgIFVDSEFSICB1Y01heFRlbXBlcmF0dXJlOwogICAgICAgVUxPTkcgIHVsQ2Fwc0FuZFNldHRpbmdzOwogICAgICAgVUNIQVIgIHVjUmVxdWlyZWRQb3dlcjsKLSAgICAgIFVDSEFSICB1Y1VudXNlZDFbM107CisgICAgICBVU0hPUlQgdXNDbGFzc2lmaWNhdGlvbjI7CisgICAgICBVTE9ORyAgdWxWQ0xLOworICAgICAgVUxPTkcgIHVsRENMSzsKKyAgICAgIFVDSEFSICB1Y1VudXNlZFs1XTsKIH0gQVRPTV9QUExJQl9OT05DTE9DS19JTkZPOwogCiAvLyBDb250YWluZWQgaW4gYW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIG9mZnNldAogLy8gaW4gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTo6dXNDbG9ja0luZm9BcnJheU9mZnNldC4KIC8vIHJlZmVyZW5jZWQgZnJvbSBBVE9NX1BQTElCX1NUQVRFOjp1Y0Nsb2NrU3RhdGVJbmRpY2VzCi0jZGVmaW5lIEFUT01fUFBMSUJfTk9OQ0xPQ0tJTkZPX1ZFUjEgICAgICAxMgotI2RlZmluZSBBVE9NX1BQTElCX05PTkNMT0NLSU5GT19WRVIyICAgICAgMjQKLQogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfUjYwMF9DTE9DS19JTkZPCiB7CiAgICAgICBVU0hPUlQgdXNFbmdpbmVDbG9ja0xvdzsKQEAgLTU5ODUsNiArNjc2NSw5MyBAQAogI2RlZmluZSBBVE9NX1BQTElCX1JTNzgwX0hUTElOS0ZSRVFfTE9XICAgICAgICAxIAogI2RlZmluZSBBVE9NX1BQTElCX1JTNzgwX0hUTElOS0ZSRVFfSElHSCAgICAgICAyIAogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVU1PX0NMT0NLX0lORk97CisgICAgICBVU0hPUlQgdXNFbmdpbmVDbG9ja0xvdzsgIC8vY2xvY2tmcmVxdWVuY3kgJiAweEZGRkYuIFRoZSB1bml0IGlzIGluIDEwa2h6CisgICAgICBVQ0hBUiAgdWNFbmdpbmVDbG9ja0hpZ2g7IC8vY2xvY2tmcmVxdWVuY3kgPj4gMTYuIAorICAgICAgVUNIQVIgIHZkZGNJbmRleDsgICAgICAgICAvLzItYml0IHZkZGMgaW5kZXg7CisgICAgICBVQ0hBUiAgbGVha2FnZTsgICAgICAgICAgLy9wbGVhc2UgdXNlIDgtYml0IGFic29sdXRlIHZhbHVlLCBub3QgdGhlIDYtYml0ICUgdmFsdWUgCisgICAgICAvL3BsZWFzZSBpbml0YWxpemUgdG8gMAorICAgICAgVUNIQVIgIHJzdjsKKyAgICAgIC8vcGxlYXNlIGluaXRhbGl6ZSB0byAwCisgICAgICBVU0hPUlQgcnN2MTsKKyAgICAgIC8vcGxlYXNlIGluaXRpYWxpemUgdG8gMHMKKyAgICAgIFVMT05HIHJzdjJbMl07Cit9QVRPTV9QUExJQl9TVU1PX0NMT0NLX0lORk87CisKKworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVEFURV9WMgoreworICAgICAgLy9udW1iZXIgb2YgdmFsaWQgZHBtIGxldmVscyBpbiB0aGlzIHN0YXRlOyBEcml2ZXIgdXNlcyBpdCB0byBjYWxjdWxhdGUgdGhlIHdob2xlIAorICAgICAgLy9zaXplIG9mIHRoZSBzdGF0ZTogc2l6ZW9mKEFUT01fUFBMSUJfU1RBVEVfVjIpICsgKHVjTnVtRFBNTGV2ZWxzIC0gMSkgKiBzaXplb2YoVUNIQVIpCisgICAgICBVQ0hBUiB1Y051bURQTUxldmVsczsKKyAgICAgIAorICAgICAgLy9hIGluZGV4IHRvIHRoZSBhcnJheSBvZiBub25DbG9ja0luZm9zCisgICAgICBVQ0hBUiBub25DbG9ja0luZm9JbmRleDsKKyAgICAgIC8qKgorICAgICAgKiBEcml2ZXIgd2lsbCByZWFkIHRoZSBmaXJzdCB1Y051bURQTUxldmVscyBpbiB0aGlzIGFycmF5CisgICAgICAqLworICAgICAgVUNIQVIgY2xvY2tJbmZvSW5kZXhbMV07Cit9IEFUT01fUFBMSUJfU1RBVEVfVjI7CisKK3R5cGVkZWYgc3RydWN0IFN0YXRlQXJyYXl7CisgICAgLy9ob3cgbWFueSBzdGF0ZXMgd2UgaGF2ZSAKKyAgICBVQ0hBUiB1Y051bUVudHJpZXM7CisgICAgCisgICAgQVRPTV9QUExJQl9TVEFURV9WMiBzdGF0ZXNbMV07Cit9U3RhdGVBcnJheTsKKworCit0eXBlZGVmIHN0cnVjdCBDbG9ja0luZm9BcnJheXsKKyAgICAvL2hvdyBtYW55IGNsb2NrIGxldmVscyB3ZSBoYXZlCisgICAgVUNIQVIgdWNOdW1FbnRyaWVzOworICAgIAorICAgIC8vc2l6ZW9mKEFUT01fUFBMSUJfU1VNT19DTE9DS19JTkZPKQorICAgIFVDSEFSIHVjRW50cnlTaXplOworICAgIAorICAgIC8vdGhpcyBpcyBmb3IgU3VtbworICAgIEFUT01fUFBMSUJfU1VNT19DTE9DS19JTkZPIGNsb2NrSW5mb1sxXTsKK31DbG9ja0luZm9BcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgTm9uQ2xvY2tJbmZvQXJyYXl7CisKKyAgICAvL2hvdyBtYW55IG5vbi1jbG9jayBsZXZlbHMgd2UgaGF2ZS4gbm9ybWFsbHkgc2hvdWxkIGJlIHNhbWUgYXMgbnVtYmVyIG9mIHN0YXRlcworICAgIFVDSEFSIHVjTnVtRW50cmllczsKKyAgICAvL3NpemVvZihBVE9NX1BQTElCX05PTkNMT0NLX0lORk8pCisgICAgVUNIQVIgdWNFbnRyeVNpemU7CisgICAgCisgICAgQVRPTV9QUExJQl9OT05DTE9DS19JTkZPIG5vbkNsb2NrSW5mb1sxXTsKK31Ob25DbG9ja0luZm9BcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZAoreworICAgIFVTSE9SVCB1c0Nsb2NrTG93OworICAgIFVDSEFSICB1Y0Nsb2NrSGlnaDsKKyAgICBVU0hPUlQgdXNWb2x0YWdlOworfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1RhYmxlCit7CisgICAgVUNIQVIgdWNOdW1FbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzLgorICAgIEFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZCBlbnRyaWVzWzFdOyAgICAgICAgICAgICAvLyBEeW5hbWljYWxseSBhbGxvY2F0ZSBlbnRyaWVzLgorfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1RhYmxlOworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1JlY29yZAoreworICAgIFVTSE9SVCB1c1NjbGtMb3c7CisgICAgVUNIQVIgIHVjU2Nsa0hpZ2g7CisgICAgVVNIT1JUIHVzTWNsa0xvdzsKKyAgICBVQ0hBUiAgdWNNY2xrSGlnaDsKKyAgICBVU0hPUlQgdXNWZGRjOworICAgIFVTSE9SVCB1c1ZkZGNpOworfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9MaW1pdF9SZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1BQTElCX0Nsb2NrX1ZvbHRhZ2VfTGltaXRfVGFibGUKK3sKKyAgICBVQ0hBUiB1Y051bUVudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMuCisgICAgQVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1JlY29yZCBlbnRyaWVzWzFdOyAgICAgICAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGFsbG9jYXRlIGVudHJpZXMuCit9QVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1RhYmxlOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwppbmRleCA5ZmJhYmFhLi5iMGFiMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJRU5BQkxFX0xWRFNfU1NfUEFSQU1FVEVSU19WMiBsdmRzX3NzXzI7CiAJRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1BTX0FMTE9DQVRJT04gdjE7CiAJRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1YyIHYyOworCUVOQUJMRV9TUFJFQURfU1BFQ1RSVU1fT05fUFBMTF9WMyB2MzsKIH07CiAKIHN0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfcHJvZ3JhbV9zcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC00MTcsNyArNDE4LDMwIEBACiAKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CiAKLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlhcmdzLnYzLnVzU3ByZWFkU3BlY3RydW1BbW91bnRGcmFjID0gMDsKKwkJYXJncy52My51Y1NwcmVhZFNwZWN0cnVtVHlwZSA9IHNzLT50eXBlOworCQlzd2l0Y2ggKHBsbF9pZCkgeworCQljYXNlIEFUT01fUFBMTDE6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX1AxUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gc3MtPmFtb3VudDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSBzcy0+c3RlcDsKKwkJCWJyZWFrOworCQljYXNlIEFUT01fUFBMTDI6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX1AyUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gc3MtPmFtb3VudDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSBzcy0+c3RlcDsKKwkJCWJyZWFrOworCQljYXNlIEFUT01fRENQTEw6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX0RDUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gMDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQVRPTV9QUExMX0lOVkFMSUQ6CisJCQlyZXR1cm47CisJCX0KKwkJYXJncy52Mi51Y0VuYWJsZSA9IGVuYWJsZTsKKwl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewogCQlhcmdzLnYyLnVzU3ByZWFkU3BlY3RydW1QZXJjZW50YWdlID0gY3B1X3RvX2xlMTYoc3MtPnBlcmNlbnRhZ2UpOwogCQlhcmdzLnYyLnVjU3ByZWFkU3BlY3RydW1UeXBlID0gc3MtPnR5cGU7CiAJCXN3aXRjaCAocGxsX2lkKSB7CkBAIC02NzMsOSArNjk3LDE0IEBACiAJUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WMiB2MjsKIAlQSVhFTF9DTE9DS19QQVJBTUVURVJTX1YzIHYzOwogCVBJWEVMX0NMT0NLX1BBUkFNRVRFUlNfVjUgdjU7CisJUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WNiB2NjsKIH07CiAKLXN0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfc2V0X2RjcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKKy8qIG9uIERDRTUsIG1ha2Ugc3VyZSB0aGUgdm9sdGFnZSBpcyBoaWdoIGVub3VnaCB0byBzdXBwb3J0IHRoZQorICogcmVxdWlyZWQgZGlzcCBjbGsuCisgKi8KK3N0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfc2V0X2RjcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgdTMyIGRpc3BjbGspCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02OTgsOSArNzI3LDE2IEBACiAJCQkgKiBTZXRQaXhlbENsb2NrIHByb3ZpZGVzIHRoZSBkaXZpZGVycwogCQkJICovCiAJCQlhcmdzLnY1LnVjQ1JUQyA9IEFUT01fQ1JUQ19JTlZBTElEOwotCQkJYXJncy52NS51c1BpeGVsQ2xvY2sgPSByZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGs7CisJCQlhcmdzLnY1LnVzUGl4ZWxDbG9jayA9IGRpc3BjbGs7CiAJCQlhcmdzLnY1LnVjUHBsbCA9IEFUT01fRENQTEw7CiAJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJLyogaWYgdGhlIGRlZmF1bHQgZGNwbGwgY2xvY2sgaXMgc3BlY2lmaWVkLAorCQkJICogU2V0UGl4ZWxDbG9jayBwcm92aWRlcyB0aGUgZGl2aWRlcnMKKwkJCSAqLworCQkJYXJncy52Ni51bERpc3BFbmdDbGtGcmVxID0gZGlzcGNsazsKKwkJCWFyZ3MudjYudWNQcGxsID0gQVRPTV9EQ1BMTDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQgJWRcbiIsIGZyZXYsIGNyZXYpOwogCQkJcmV0dXJuOwpAQCAtNzg0LDYgKzgyMCwxOCBAQAogCQkJYXJncy52NS51Y0VuY29kZXJNb2RlID0gZW5jb2Rlcl9tb2RlOwogCQkJYXJncy52NS51Y1BwbGwgPSBwbGxfaWQ7CiAJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXJncy52Ni51bENydGNQY2xrRnJlcS51Y0NSVEMgPSBjcnRjX2lkOworCQkJYXJncy52Ni51bENydGNQY2xrRnJlcS51bFBpeGVsQ2xvY2sgPSBjcHVfdG9fbGUzMihjbG9jayAvIDEwKTsKKwkJCWFyZ3MudjYudWNSZWZEaXYgPSByZWZfZGl2OworCQkJYXJncy52Ni51c0ZiRGl2ID0gY3B1X3RvX2xlMTYoZmJfZGl2KTsKKwkJCWFyZ3MudjYudWxGYkRpdkRlY0ZyYWMgPSBjcHVfdG9fbGUzMihmcmFjX2ZiX2RpdiAqIDEwMDAwMCk7CisJCQlhcmdzLnY2LnVjUG9zdERpdiA9IHBvc3RfZGl2OworCQkJYXJncy52Ni51Y01pc2NJbmZvID0gMDsgLyogSERNSSBkZXB0aCwgZXRjLiAqLworCQkJYXJncy52Ni51Y1RyYW5zbWl0dGVySUQgPSBlbmNvZGVyX2lkOworCQkJYXJncy52Ni51Y0VuY29kZXJNb2RlID0gZW5jb2Rlcl9tb2RlOworCQkJYXJncy52Ni51Y1BwbGwgPSBwbGxfaWQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkICVkXG4iLCBmcmV2LCBjcmV2KTsKIAkJCXJldHVybjsKQEAgLTEzNzcsNyArMTQyNSw4IEBACiAJCQkJCQkJCSAgIHJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayk7CiAJCWlmIChzc19lbmFibGVkKQogCQkJYXRvbWJpb3NfY3J0Y19wcm9ncmFtX3NzKGNydGMsIEFUT01fRElTQUJMRSwgQVRPTV9EQ1BMTCwgJnNzKTsKLQkJYXRvbWJpb3NfY3J0Y19zZXRfZGNwbGwoY3J0Yyk7CisJCS8qIFhYWDogRENFNSwgbWFrZSBzdXJlIHZvbHRhZ2UsIGRpc3BjbGsgaXMgaGlnaCBlbm91Z2ggKi8KKwkJYXRvbWJpb3NfY3J0Y19zZXRfZGNwbGwoY3J0YywgcmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrKTsKIAkJaWYgKHNzX2VuYWJsZWQpCiAJCQlhdG9tYmlvc19jcnRjX3Byb2dyYW1fc3MoY3J0YywgQVRPTV9FTkFCTEUsIEFUT01fRENQTEwsICZzcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKaW5kZXggN2IzMzdjMy4uN2ZlOGViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCkBAIC0zOSw2ICszOSw2MiBAQAogCiBzdGF0aWMgdm9pZCBldmVyZ3JlZW5fZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBldmVyZ3JlZW5fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitzdGF0aWMgdm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKK3ZvaWQgZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y107CisJdTMyIHRtcDsKKworCS8qIG1ha2Ugc3VyZSBmbGlwIGlzIGF0IHZiIHJhdGhlciB0aGFuIGhiICovCisJdG1wID0gUlJFRzMyKEVWRVJHUkVFTl9HUlBIX0ZMSVBfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisJdG1wICY9IH5FVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9IX1JFVFJBQ0VfRU47CisJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX0ZMSVBfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHNldCBwYWdlZmxpcCB0byBoYXBwZW4gYW55d2hlcmUgaW4gdmJsYW5rIGludGVydmFsICovCisJV1JFRzMyKEVWRVJHUkVFTl9NQVNURVJfVVBEQVRFX01PREUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJLyogZW5hYmxlIHRoZSBwZmxpcCBpbnQgKi8KKwlyYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHJkZXYsIGNydGMpOworfQorCit2b2lkIGV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJLyogZGlzYWJsZSB0aGUgcGZsaXAgaW50ICovCisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChyZGV2LCBjcnRjKTsKK30KKwordTMyIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CisJdTMyIHRtcCA9IFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCisJLyogTG9jayB0aGUgZ3JhcGhpY3MgdXBkYXRlIGxvY2sgKi8KKwl0bXAgfD0gRVZFUkdSRUVOX0dSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHVwZGF0ZSB0aGUgc2Nhbm91dCBhZGRyZXNzZXMgKi8KKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICB1cHBlcl8zMl9iaXRzKGNydGNfYmFzZSkpOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWNydGNfYmFzZSk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgdXBwZXJfMzJfYml0cyhjcnRjX2Jhc2UpKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKKworCS8qIFdhaXQgZm9yIHVwZGF0ZV9wZW5kaW5nIHRvIGdvIGhpZ2guICovCisJd2hpbGUgKCEoUlJFRzMyKEVWRVJHUkVFTl9HUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBFVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKSk7CisJRFJNX0RFQlVHKCJVcGRhdGUgcGVuZGluZyBub3cgaGlnaC4gVW5sb2NraW5nIHZ1cGRhdGVfbG9jay5cbiIpOworCisJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KKwl0bXAgJj0gfkVWRVJHUkVFTl9HUlBIX1VQREFURV9MT0NLOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBSZXR1cm4gY3VycmVudCB1cGRhdGVfcGVuZGluZyBzdGF0dXM6ICovCisJcmV0dXJuIFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORzsKK30KIAogLyogZ2V0IHRlbXBlcmF0dXJlIGluIG1pbGxpZGVncmVlcyAqLwogdTMyIGV2ZXJncmVlbl9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTU3LDYgKzExMywxNCBAQAogCXJldHVybiBhY3R1YWxfdGVtcCAqIDEwMDA7CiB9CiAKK3UzMiBzdW1vX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0ZW1wID0gUlJFRzMyKENHX1RIRVJNQUxfU1RBVFVTKSAmIDB4ZmY7CisJdTMyIGFjdHVhbF90ZW1wID0gKHRlbXAgPj4gMSkgJiAweGZmOworCisJcmV0dXJuIGFjdHVhbF90ZW1wICogMTAwMDsKK30KKwogdm9pZCBldmVyZ3JlZW5fcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcmVxX3BzX2lkeCA9IHJkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleDsKQEAgLTMzNywxNiArNDAxLDI4IEBACiAJY2FzZSAwOgogCWNhc2UgNDoKIAlkZWZhdWx0OgotCQlyZXR1cm4gMzg0MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gNDA5NiAqIDI7CisJCWVsc2UKKwkJCXJldHVybiAzODQwICogMjsKIAljYXNlIDE6CiAJY2FzZSA1OgotCQlyZXR1cm4gNTc2MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gNjE0NCAqIDI7CisJCWVsc2UKKwkJCXJldHVybiA1NzYwICogMjsKIAljYXNlIDI6CiAJY2FzZSA2OgotCQlyZXR1cm4gNzY4MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gODE5MiAqIDI7CisJCWVsc2UKKwkJCXJldHVybiA3NjgwICogMjsKIAljYXNlIDM6CiAJY2FzZSA3OgotCQlyZXR1cm4gMTkyMCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gMjA0OCAqIDI7CisJCWVsc2UKKwkJCXJldHVybiAxOTIwICogMjsKIAl9CiB9CiAKQEAgLTg5MCwzMSArOTY2LDM5IEBACiAJc2F2ZS0+dmdhX2hkcF9jb250cm9sID0gUlJFRzMyKFZHQV9IRFBfQ09OVFJPTCk7CiAJc2F2ZS0+Y3J0Y19jb250cm9sWzBdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VUKTsKIAlzYXZlLT5jcnRjX2NvbnRyb2xbMV0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpOwotCXNhdmUtPmNydGNfY29udHJvbFsyXSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCk7Ci0Jc2F2ZS0+Y3J0Y19jb250cm9sWzNdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKLQlzYXZlLT5jcnRjX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOwotCXNhdmUtPmNydGNfY29udHJvbFs1XSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlzYXZlLT5jcnRjX2NvbnRyb2xbMl0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbNV0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQpOworCX0KIAogCS8qIFN0b3AgYWxsIHZpZGVvICovCiAJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMSk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDEpOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAogCVdSRUczMihEMVZHQV9DT05UUk9MLCAwKTsKIAlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgMCk7CkBAIC05NDQsNDEgKzEwMjgsNDMgQEAKIAlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsCiAJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKIAotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwogCi0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwl9CiAKIAlXUkVHMzIoRVZFUkdSRUVOX1ZHQV9NRU1PUllfQkFTRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwogCVdSRUczMihFVkVSR1JFRU5fVkdBX01FTU9SWV9CQVNFX0FERFJFU1MsICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CkBAIC05OTQsMjIgKzEwODAsMjggQEAKIAlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzVdKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDEpOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDEpOworCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFswXSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbMV0pOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzJdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFszXSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbNF0pOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzVdKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzJdKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbM10pOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFs0XSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzVdKTsKKwl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CiAJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgc2F2ZS0+dmdhX3JlbmRlcl9jb250cm9sKTsKIH0KIApAQCAtMTA1NywxMSArMTE0OSwxNyBAQAogCQkJcmRldi0+bWMudnJhbV9lbmQgPj4gMTIpOwogCX0KIAlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgMCk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQl0bXAgPSBSUkVHMzIoTUNfRlVTX1ZNX0ZCX09GRlNFVCkgJiAweDAwMEZGRkZGOworCQl0bXAgfD0gKChyZGV2LT5tYy52cmFtX2VuZCA+PiAyMCkgJiAweEYpIDw8IDI0OworCQl0bXAgfD0gKChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDIwKSAmIDB4RikgPDwgMjA7CisJCVdSRUczMihNQ19GVVNfVk1fRkJfT0ZGU0VULCB0bXApOworCX0KIAl0bXAgPSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDI0KSAmIDB4RkZGRikgPDwgMTY7CiAJdG1wIHw9ICgocmRldi0+bWMudnJhbV9zdGFydCA+PiAyNCkgJiAweEZGRkYpOwogCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKIAlXUkVHMzIoSERQX05PTlNVUkZBQ0VfQkFTRSwgKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gOCkpOwotCVdSRUczMihIRFBfTk9OU1VSRkFDRV9JTkZPLCAoMiA8PCA3KSk7CisJV1JFRzMyKEhEUF9OT05TVVJGQUNFX0lORk8sICgyIDw8IDcpIHwgKDEgPDwgMzApKTsKIAlXUkVHMzIoSERQX05PTlNVUkZBQ0VfU0laRSwgMHgzRkZGRkZGRik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlXUkVHMzIoTUNfVk1fQUdQX1RPUCwgcmRldi0+bWMuZ3R0X2VuZCA+PiAxNik7CkBAIC0xMjg1LDExICsxMzgzLDE1IEBACiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1JFRFdPT0Q6CisJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1RVUktTOgorCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCWZvcmNlX25vX3N3aXp6bGUgPSBmYWxzZTsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0NZUFJFU1M6CiAJY2FzZSBDSElQX0hFTUxPQ0s6CiAJY2FzZSBDSElQX0pVTklQRVI6CisJY2FzZSBDSElQX0JBUlRTOgogCWRlZmF1bHQ6CiAJCWZvcmNlX25vX3N3aXp6bGUgPSB0cnVlOwogCQlicmVhazsKQEAgLTEzODQsNiArMTQ4Niw0NiBAQAogCXJldHVybiBiYWNrZW5kX21hcDsKIH0KIAorc3RhdGljIHZvaWQgZXZlcmdyZWVuX3Byb2dyYW1fY2hhbm5lbF9yZW1hcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdGNwX2NoYW5fc3RlZXJfbG8sIHRjcF9jaGFuX3N0ZWVyX2hpLCBtY19zaGFyZWRfY2hyZW1hcCwgdG1wOworCisJdG1wID0gUlJFRzMyKE1DX1NIQVJFRF9DSE1BUCk7CisJc3dpdGNoICgodG1wICYgTk9PRkNIQU5fTUFTSykgPj4gTk9PRkNIQU5fU0hJRlQpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJLyogZGVmYXVsdCBtYXBwaW5nICovCisJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGZhYzY4ODsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwljYXNlIENISVBfSEVNTE9DSzoKKwljYXNlIENISVBfQ1lQUkVTUzoKKwljYXNlIENISVBfQkFSVFM6CisJCXRjcF9jaGFuX3N0ZWVyX2xvID0gMHg1NDc2MzIxMDsKKwkJdGNwX2NoYW5fc3RlZXJfaGkgPSAweDAwMDBiYTk4OworCQlicmVhazsKKwljYXNlIENISVBfSlVOSVBFUjoKKwljYXNlIENISVBfUkVEV09PRDoKKwljYXNlIENISVBfQ0VEQVI6CisJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1RVUktTOgorCWNhc2UgQ0hJUF9DQUlDT1M6CisJZGVmYXVsdDoKKwkJdGNwX2NoYW5fc3RlZXJfbG8gPSAweDc2NTQzMjEwOworCQl0Y3BfY2hhbl9zdGVlcl9oaSA9IDB4MDAwMGJhOTg7CisJCWJyZWFrOworCX0KKworCVdSRUczMihUQ1BfQ0hBTl9TVEVFUl9MTywgdGNwX2NoYW5fc3RlZXJfbG8pOworCVdSRUczMihUQ1BfQ0hBTl9TVEVFUl9ISSwgdGNwX2NoYW5fc3RlZXJfaGkpOworCVdSRUczMihNQ19TSEFSRURfQ0hSRU1BUCwgbWNfc2hhcmVkX2NocmVtYXApOworfQorCiBzdGF0aWMgdm9pZCBldmVyZ3JlZW5fZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIGNjX3JiX2JhY2tlbmRfZGlzYWJsZSA9IDA7CkBAIC0xNDk1LDYgKzE2MzcsOTAgQEAKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19oaXpfdGlsZV9maWZvX3NpemUgPSAweDMwOwogCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2Vhcmx5el90aWxlX2ZpZm9fc2l6ZSA9IDB4MTMwOwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMTsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aWxlX3BpcGVzID0gMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9iYWNrZW5kcyA9IDEgKiByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RocmVhZHMgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dzX3RocmVhZHMgPSAxNjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc3RhY2tfZW50cmllcyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9udW1fb2Zfc2V0cyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zaXplID0gMTI4OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfcG9zX3NpemUgPSAzMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NteF9zaXplID0gOTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAxOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDQwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2hpel90aWxlX2ZpZm9fc2l6ZSA9IDB4MzA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfZWFybHl6X3RpbGVfZmlmb19zaXplID0gMHgxMzA7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aWxlX3BpcGVzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSA3OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9iYWNrZW5kcyA9IDQgKiByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RocmVhZHMgPSAyNDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dzX3RocmVhZHMgPSAzMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc3RhY2tfZW50cmllcyA9IDUxMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9udW1fb2Zfc2V0cyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zaXplID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfcG9zX3NpemUgPSA2NDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NteF9zaXplID0gMTkyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9od19jb250ZXh0cyA9IDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3FfbnVtX2NmX2luc3RzID0gMjsKKworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX3ByaW1fZmlmb19zaXplID0gMHgxMDA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1RVUktTOgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMiAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDI0ODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDY0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAyOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDEwMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19oaXpfdGlsZV9maWZvX3NpemUgPSAweDMwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2Vhcmx5el90aWxlX2ZpZm9fc2l6ZSA9IDB4MTMwOworCQlicmVhazsKKwljYXNlIENISVBfQ0FJQ09TOgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMSAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDE5MjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDE2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAxMjg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSA5NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfaHdfY29udGV4dHMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNxX251bV9jZl9pbnN0cyA9IDE7CisKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19wcmltX2ZpZm9fc2l6ZSA9IDB4NDA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKKwkJYnJlYWs7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBIRFAgKi8KQEAgLTE2MzYsNiArMTg2Miw3IEBACiAJCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJCWNhc2UgQ0hJUF9DWVBSRVNTOgogCQljYXNlIENISVBfSEVNTE9DSzoKKwkJY2FzZSBDSElQX0JBUlRTOgogCQkJZ2JfYmFja2VuZF9tYXAgPSAweDY2NDQyMjAwOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hJUF9KVU5JUEVSOgpAQCAtMTY4Nyw2ICsxOTE0LDggQEAKIAlXUkVHMzIoRE1JRl9BRERSX0NPTkZJRywgZ2JfYWRkcl9jb25maWcpOwogCVdSRUczMihIRFBfQUREUl9DT05GSUcsIGdiX2FkZHJfY29uZmlnKTsKIAorCWV2ZXJncmVlbl9wcm9ncmFtX2NoYW5uZWxfcmVtYXAocmRldik7CisKIAludW1fc2hhZGVyX2VuZ2luZXMgPSAoKFJSRUczMihHQl9BRERSX0NPTkZJRykgJiBOVU1fU0hBREVSX0VOR0lORVMoMykpID4+IDEyKSArIDE7CiAJZ3JibV9nZnhfaW5kZXggPSBJTlNUQU5DRV9CUk9BRENBU1RfV1JJVEVTOwogCkBAIC0xNzY5LDkgKzE5OTgsMTYgQEAKIAkJICAgICAgR1NfUFJJTygyKSB8CiAJCSAgICAgIEVTX1BSSU8oMykpOwogCi0JaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJY2FzZSBDSElQX0NFREFSOgorCWNhc2UgQ0hJUF9QQUxNOgorCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCS8qIG5vIHZlcnRleCBjYWNoZSAqLwogCQlzcV9jb25maWcgJj0gflZDX0VOQUJMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJc3FfbGRzX3Jlc291cmNlX21nbXQgPSBSUkVHMzIoU1FfTERTX1JFU09VUkNFX01HTVQpOwogCkBAIC0xNzgzLDEwICsyMDE5LDE1IEBACiAJc3FfZ3ByX3Jlc291cmNlX21nbXRfMyA9IE5VTV9IU19HUFJTKChyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9ncHJzIC0gKDQgKiAyKSkgKiAzIC8gMzIpOwogCXNxX2dwcl9yZXNvdXJjZV9tZ210XzMgfD0gTlVNX0xTX0dQUlMoKHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgLSAoNCAqIDIpKSAqIDMgLyAzMik7CiAKLQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpCisJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwljYXNlIENISVBfQ0VEQVI6CisJY2FzZSBDSElQX1BBTE06CiAJCXBzX3RocmVhZF9jb3VudCA9IDk2OwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcHNfdGhyZWFkX2NvdW50ID0gMTI4OworCQlicmVhazsKKwl9CiAKIAlzcV90aHJlYWRfcmVzb3VyY2VfbWdtdCA9IE5VTV9QU19USFJFQURTKHBzX3RocmVhZF9jb3VudCk7CiAJc3FfdGhyZWFkX3Jlc291cmNlX21nbXQgfD0gTlVNX1ZTX1RIUkVBRFMoKCgocmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyAtIHBzX3RocmVhZF9jb3VudCkgLyA2KSAvIDgpICogOCk7CkBAIC0xODE3LDEwICsyMDU4LDE2IEBACiAJV1JFRzMyKFBBX1NDX0ZPUkNFX0VPVl9NQVhfQ05UUywgKEZPUkNFX0VPVl9NQVhfQ0xLX0NOVCg0MDk1KSB8CiAJCQkJCSAgRk9SQ0VfRU9WX01BWF9SRVpfQ05UKDI1NSkpKTsKIAotCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikKKwlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgeworCWNhc2UgQ0hJUF9DRURBUjoKKwljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfQ0FJQ09TOgogCQl2Z3RfY2FjaGVfaW52YWxpZGF0aW9uID0gQ0FDSEVfSU5WQUxJREFUSU9OKFRDX09OTFkpOwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJdmd0X2NhY2hlX2ludmFsaWRhdGlvbiA9IENBQ0hFX0lOVkFMSURBVElPTihWQ19BTkRfVEMpOworCQlicmVhazsKKwl9CiAJdmd0X2NhY2hlX2ludmFsaWRhdGlvbiB8PSBBVVRPX0lOVkxEX0VOKEVTX0FORF9HU19BVVRPKTsKIAlXUkVHMzIoVkdUX0NBQ0hFX0lOVkFMSURBVElPTiwgdmd0X2NhY2hlX2ludmFsaWRhdGlvbik7CiAKQEAgLTE5MDQsMTIgKzIxNTEsMTggQEAKIAlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocmRldi0+cGRldiwgMCk7CiAJcmRldi0+bWMuYXBlcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAwKTsKIAkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCi0JLyogc2l6ZSBpbiBNQiBvbiBldmVyZ3JlZW4gKi8KLQlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpICogMTAyNCAqIDEwMjQ7Ci0JcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpICogMTAyNCAqIDEwMjQ7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQkvKiBzaXplIGluIGJ5dGVzIG9uIGZ1c2lvbiAqLworCQlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpOworCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSk7CisJfSBlbHNlIHsKKwkJLyogc2l6ZSBpbiBNQiBvbiBldmVyZ3JlZW4gKi8KKwkJcmRldi0+bWMubWNfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKSAqIDEwMjQgKiAxMDI0OworCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSkgKiAxMDI0ICogMTAyNDsKKwl9CiAJcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CiAJcmRldi0+bWMuYWN0aXZlX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplOwotCXI2MDBfdnJhbV9ndHRfbG9jYXRpb24ocmRldiwgJnJkZXYtPm1jKTsKKwlyNzAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHJkZXYsICZyZGV2LT5tYyk7CiAJcmFkZW9uX3VwZGF0ZV9iYW5kd2lkdGhfaW5mbyhyZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTkxNyw4ICsyMTcwLDMwIEBACiAKIGJvb2wgZXZlcmdyZWVuX2dwdV9pc19sb2NrdXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JLyogRklYTUU6IGltcGxlbWVudCBmb3IgZXZlcmdyZWVuICovCi0JcmV0dXJuIGZhbHNlOworCXUzMiBzcmJtX3N0YXR1czsKKwl1MzIgZ3JibV9zdGF0dXM7CisJdTMyIGdyYm1fc3RhdHVzX3NlMCwgZ3JibV9zdGF0dXNfc2UxOworCXN0cnVjdCByMTAwX2dwdV9sb2NrdXAgKmxvY2t1cCA9ICZyZGV2LT5jb25maWcuZXZlcmdyZWVuLmxvY2t1cDsKKwlpbnQgcjsKKworCXNyYm1fc3RhdHVzID0gUlJFRzMyKFNSQk1fU1RBVFVTKTsKKwlncmJtX3N0YXR1cyA9IFJSRUczMihHUkJNX1NUQVRVUyk7CisJZ3JibV9zdGF0dXNfc2UwID0gUlJFRzMyKEdSQk1fU1RBVFVTX1NFMCk7CisJZ3JibV9zdGF0dXNfc2UxID0gUlJFRzMyKEdSQk1fU1RBVFVTX1NFMSk7CisJaWYgKCEoZ3JibV9zdGF0dXMgJiBHVUlfQUNUSVZFKSkgeworCQlyMTAwX2dwdV9sb2NrdXBfdXBkYXRlKGxvY2t1cCwgJnJkZXYtPmNwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBmb3JjZSBDUCBhY3Rpdml0aWVzICovCisJciA9IHJhZGVvbl9yaW5nX2xvY2socmRldiwgMik7CisJaWYgKCFyKSB7CisJCS8qIFBBQ0tFVDIgTk9QICovCisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4ODAwMDAwMDApOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAweDgwMDAwMDAwKTsKKwkJcmFkZW9uX3JpbmdfdW5sb2NrX2NvbW1pdChyZGV2KTsKKwl9CisJcmRldi0+Y3AucnB0ciA9IFJSRUczMihDUF9SQl9SUFRSKTsKKwlyZXR1cm4gcjEwMF9ncHVfY3BfaXNfbG9ja3VwKHJkZXYsIGxvY2t1cCwgJnJkZXYtPmNwKTsKIH0KIAogc3RhdGljIGludCBldmVyZ3JlZW5fZ3B1X3NvZnRfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0yMDExLDE3ICsyMjg2LDIxIEBACiAJV1JFRzMyKEdSQk1fSU5UX0NOVEwsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQogCiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAogCVdSRUczMihEQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwogCVdSRUczMihEQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwpAQCAtMjA0Nyw2ICsyMzI2LDcgQEAKIAl1MzIgY3J0YzEgPSAwLCBjcnRjMiA9IDAsIGNydGMzID0gMCwgY3J0YzQgPSAwLCBjcnRjNSA9IDAsIGNydGM2ID0gMDsKIAl1MzIgaHBkMSwgaHBkMiwgaHBkMywgaHBkNCwgaHBkNSwgaHBkNjsKIAl1MzIgZ3JibV9pbnRfY250bCA9IDA7CisJdTMyIGdycGgxID0gMCwgZ3JwaDIgPSAwLCBncnBoMyA9IDAsIGdycGg0ID0gMCwgZ3JwaDUgPSAwLCBncnBoNiA9IDA7CiAKIAlpZiAoIXJkZXYtPmlycS5pbnN0YWxsZWQpIHsKIAkJV0FSTigxLCAiQ2FuJ3QgZW5hYmxlIElSUS9NU0kgYmVjYXVzZSBubyBoYW5kbGVyIGlzIGluc3RhbGxlZFxuIik7CkBAIC0yMDcyLDI3ICsyMzUyLDMzIEBACiAJCWNwX2ludF9jbnRsIHw9IFJCX0lOVF9FTkFCTEU7CiAJCWNwX2ludF9jbnRsIHw9IFRJTUVfU1RBTVBfSU5UX0VOQUJMRTsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMF0pIHsKIAkJRFJNX0RFQlVHKCJldmVyZ3JlZW5faXJxX3NldDogdmJsYW5rIDBcbiIpOwogCQljcnRjMSB8PSBWQkxBTktfSU5UX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzFdKSB7CiAJCURSTV9ERUJVRygiZXZlcmdyZWVuX2lycV9zZXQ6IHZibGFuayAxXG4iKTsKIAkJY3J0YzIgfD0gVkJMQU5LX0lOVF9NQVNLOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsyXSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzJdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFsyXSkgewogCQlEUk1fREVCVUcoImV2ZXJncmVlbl9pcnFfc2V0OiB2YmxhbmsgMlxuIik7CiAJCWNydGMzIHw9IFZCTEFOS19JTlRfTUFTSzsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbM10pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFszXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbM10pIHsKIAkJRFJNX0RFQlVHKCJldmVyZ3JlZW5faXJxX3NldDogdmJsYW5rIDNcbiIpOwogCQljcnRjNCB8PSBWQkxBTktfSU5UX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzRdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbNF0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzRdKSB7CiAJCURSTV9ERUJVRygiZXZlcmdyZWVuX2lycV9zZXQ6IHZibGFuayA0XG4iKTsKIAkJY3J0YzUgfD0gVkJMQU5LX0lOVF9NQVNLOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFs1XSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzVdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFs1XSkgewogCQlEUk1fREVCVUcoImV2ZXJncmVlbl9pcnFfc2V0OiB2YmxhbmsgNVxuIik7CiAJCWNydGM2IHw9IFZCTEFOS19JTlRfTUFTSzsKIAl9CkBAIC0yMTMwLDEwICsyNDE2LDE5IEBACiAKIAlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBjcnRjMSk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgY3J0YzIpOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGNydGMzKTsKLQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBjcnRjNCk7Ci0JV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgY3J0YzUpOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGNydGM2KTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGNydGMzKTsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgY3J0YzQpOworCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBjcnRjNSk7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGNydGM2KTsKKwl9CisKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIGdycGgxKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIGdycGgyKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGdycGgzKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIGdycGg0KTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIGdycGg1KTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGdycGg2KTsKIAogCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCBocGQxKTsKIAlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgaHBkMik7CkBAIC0yMTQ1LDc5ICsyNDQwLDkyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBldmVyZ3JlZW5faXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkgICAgIHUzMiAqZGlzcF9pbnQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQyLAotCQkJCSAgICAgdTMyICpkaXNwX2ludF9jb250MywKLQkJCQkgICAgIHUzMiAqZGlzcF9pbnRfY29udDQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQ1KQorc3RhdGljIGlubGluZSB2b2lkIGV2ZXJncmVlbl9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7CiAKLQkqZGlzcF9pbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKLQkqZGlzcF9pbnRfY29udCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUpOwotCSpkaXNwX2ludF9jb250MiA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKLQkqZGlzcF9pbnRfY29udDMgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFMyk7Ci0JKmRpc3BfaW50X2NvbnQ0ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTQpOwotCSpkaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVMpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUzKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU0KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CisJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7CisJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAotCWlmICgqZGlzcF9pbnQgJiBMQl9EMV9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwogCi0JaWYgKCpkaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkJMQU5LX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKQogCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmICgqZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKIAotCWlmICgqZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCiAJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKCpkaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwogCi0JaWYgKCpkaXNwX2ludF9jb250NSAmIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50ICYgRENfSFBEMV9JTlRFUlJVUFQpIHsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgewogCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CiAJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CiAJCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCB0bXApOwogCX0KLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgRENfSFBEMl9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDJfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250MiAmIERDX0hQRDNfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgRENfSFBEM19JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBEM19JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250MyAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgRENfSFBENF9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250NCAmIERDX0hQRDVfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgRENfSFBENV9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250NSAmIERDX0hQRDZfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgRENfSFBENl9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENl9JTlRfQ09OVFJPTCwgdG1wKTsKQEAgLTIyMjYsMTQgKzI1MzQsMTAgQEAKIAogdm9pZCBldmVyZ3JlZW5faXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIGRpc3BfaW50LCBkaXNwX2ludF9jb250LCBkaXNwX2ludF9jb250MjsKLQl1MzIgZGlzcF9pbnRfY29udDMsIGRpc3BfaW50X2NvbnQ0LCBkaXNwX2ludF9jb250NTsKLQogCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRzKHJkZXYpOwogCS8qIFdhaXQgYW5kIGFja25vd2xlZGdlIGlycSAqLwogCW1kZWxheSgxKTsKLQlldmVyZ3JlZW5faXJxX2FjayhyZGV2LCAmZGlzcF9pbnQsICZkaXNwX2ludF9jb250LCAmZGlzcF9pbnRfY29udDIsCi0JCQkgICZkaXNwX2ludF9jb250MywgJmRpc3BfaW50X2NvbnQ0LCAmZGlzcF9pbnRfY29udDUpOworCWV2ZXJncmVlbl9pcnFfYWNrKHJkZXYpOwogCWV2ZXJncmVlbl9kaXNhYmxlX2ludGVycnVwdF9zdGF0ZShyZGV2KTsKIH0KIApAQCAtMjI3Myw4ICsyNTc3LDYgQEAKIAl1MzIgcnB0ciA9IHJkZXYtPmloLnJwdHI7CiAJdTMyIHNyY19pZCwgc3JjX2RhdGE7CiAJdTMyIHJpbmdfaW5kZXg7Ci0JdTMyIGRpc3BfaW50LCBkaXNwX2ludF9jb250LCBkaXNwX2ludF9jb250MjsKLQl1MzIgZGlzcF9pbnRfY29udDMsIGRpc3BfaW50X2NvbnQ0LCBkaXNwX2ludF9jb250NTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcXVldWVfaG90cGx1ZyA9IGZhbHNlOwogCkBAIC0yMjk1LDggKzI1OTcsNyBAQAogCiByZXN0YXJ0X2loOgogCS8qIGRpc3BsYXkgaW50ZXJydXB0cyAqLwotCWV2ZXJncmVlbl9pcnFfYWNrKHJkZXYsICZkaXNwX2ludCwgJmRpc3BfaW50X2NvbnQsICZkaXNwX2ludF9jb250MiwKLQkJCSAgJmRpc3BfaW50X2NvbnQzLCAmZGlzcF9pbnRfY29udDQsICZkaXNwX2ludF9jb250NSk7CisJZXZlcmdyZWVuX2lycV9hY2socmRldik7CiAKIAlyZGV2LT5paC53cHRyID0gd3B0cjsKIAl3aGlsZSAocnB0ciAhPSB3cHRyKSB7CkBAIC0yMzA5LDE3ICsyNjEwLDIxIEBACiAJCWNhc2UgMTogLyogRDEgdmJsYW5rL3ZsaW5lICovCiAJCQlzd2l0Y2ggKHNyY19kYXRhKSB7CiAJCQljYXNlIDA6IC8qIEQxIHZibGFuayAqLwotCQkJCWlmIChkaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKLQkJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7Ci0JCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKLQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMV9WQkxBTktfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFswXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmPSB+TEJfRDFfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDEgdmJsYW5rXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6IC8qIEQxIHZsaW5lICovCi0JCQkJaWYgKGRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZsaW5lXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yMzMxLDE3ICsyNjM2LDIxIEBACiAJCWNhc2UgMjogLyogRDIgdmJsYW5rL3ZsaW5lICovCiAJCQlzd2l0Y2ggKHNyY19kYXRhKSB7CiAJCQljYXNlIDA6IC8qIEQyIHZibGFuayAqLwotCQkJCWlmIChkaXNwX2ludF9jb250ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkgewotCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKLQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKLQkJCQkJZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFsxXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICY9IH5MQl9EMl9WQkxBTktfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2YmxhbmtcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgMTogLyogRDIgdmxpbmUgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5MQl9EMl9WTElORV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM1MywxNyArMjY2MiwyMSBAQAogCQljYXNlIDM6IC8qIEQzIHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBEMyB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDIpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzJdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAyKTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbMl0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAyKTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJj0gfkxCX0QzX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQzIHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBEMyB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMyB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM3NSwxNyArMjY4OCwyMSBAQAogCQljYXNlIDQ6IC8qIEQ0IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENCB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDMpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzNdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAzKTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbM10pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAzKTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJj0gfkxCX0Q0X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ0IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENCB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENCB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM5NywxNyArMjcxNCwyMSBAQAogCQljYXNlIDU6IC8qIEQ1IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENSB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDQpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzRdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCA0KTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbNF0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCA0KTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJj0gfkxCX0Q1X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ1IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENSB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENSB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQxOSwxNyArMjc0MCwyMSBAQAogCQljYXNlIDY6IC8qIEQ2IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENiB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDUpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzVdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCA1KTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbNV0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCA1KTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJj0gfkxCX0Q2X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ2IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENiB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENiB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQ0MSw0MyArMjc2Niw0MyBAQAogCQljYXNlIDQyOiAvKiBIUEQgaG90cGx1ZyAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOgotCQkJCWlmIChkaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5EQ19IUEQxX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmPSB+RENfSFBEMV9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQxXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQyX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmIERDX0hQRDJfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJj0gfkRDX0hQRDJfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBEMlxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAyOgotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIERDX0hQRDNfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQzX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmPSB+RENfSFBEM19JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQzXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQzICYgRENfSFBENF9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnRfY29udDMgJj0gfkRDX0hQRDRfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICY9IH5EQ19IUEQ0X0lOVEVSUlVQVDsKIAkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQkJCURSTV9ERUJVRygiSUg6IEhQRDRcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgNDoKLQkJCQlpZiAoZGlzcF9pbnRfY29udDQgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+RENfSFBENV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgRENfSFBENV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJj0gfkRDX0hQRDVfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBENVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSA1OgotCQkJCWlmIChkaXNwX2ludF9jb250NSAmIERDX0hQRDZfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQ1ICY9IH5EQ19IUEQ2X0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBEQ19IUEQ2X0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmPSB+RENfSFBENl9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQ2XG4iKTsKIAkJCQl9CkBAIC0yNTE2LDcgKzI4NDEsNyBAQAogCWlmICh3cHRyICE9IHJkZXYtPmloLndwdHIpCiAJCWdvdG8gcmVzdGFydF9paDsKIAlpZiAocXVldWVfaG90cGx1ZykKLQkJcXVldWVfd29yayhyZGV2LT53cSwgJnJkZXYtPmhvdHBsdWdfd29yayk7CisJCXNjaGVkdWxlX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29yayk7CiAJcmRldi0+aWgucnB0ciA9IHJwdHI7CiAJV1JFRzMyKElIX1JCX1JQVFIsIHJkZXYtPmloLnJwdHIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKQEAgLTI1MjcsMTIgKzI4NTIsMzEgQEAKIHsKIAlpbnQgcjsKIAotCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7Ci0JCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOworCS8qIGVuYWJsZSBwY2llIGdlbjIgbGluayAqLworCWlmICghQVNJQ19JU19EQ0U1KHJkZXYpKQorCQlldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShyZGV2KTsKKworCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7CisJCQlyID0gbmlfaW5pdF9taWNyb2NvZGUocmRldik7CisJCQlpZiAocikgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCQlyID0gYnRjX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBNQyBmaXJtd2FyZSFcbiIpOwogCQkJcmV0dXJuIHI7CiAJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgeworCQkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CisJCQlpZiAocikgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQogCX0KIAogCWV2ZXJncmVlbl9tY19wcm9ncmFtKHJkZXYpOwpAQCAtMjU1MSw2ICsyODk1LDExIEBACiAJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOwogCQlkZXZfd2FybihyZGV2LT5kZXYsICJmYWlsZWQgYmxpdHRlciAoJWQpIGZhbGxpbmcgYmFjayB0byBtZW1jcHlcbiIsIHIpOwogCX0KKwkvKiBYWFg6IG9udGFyaW8gaGFzIHByb2JsZW1zIGJsaXR0aW5nIHRvIGdhcnQgYXQgdGhlIG1vbWVudCAqLworCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB7CisJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOworCQlyZGV2LT5tYy5hY3RpdmVfdnJhbV9zaXplID0gcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemU7CisJfQogCiAJLyogYWxsb2NhdGUgd2IgYnVmZmVyICovCiAJciA9IHJhZGVvbl93Yl9pbml0KHJkZXYpOwpAQCAtMjY1OCwxMiArMzAwNywxNiBAQAogCXUzMiByZWc7CiAKIAkvKiBmaXJzdCBjaGVjayBDUlRDcyAqLwotCXJlZyA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCkgfAotCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpIHwKLQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKSB8Ci0JCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCkgfAotCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpIHwKLQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQorCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CisJZWxzZQorCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCkgfAorCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKSB8CisJCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCkgfAorCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAlpZiAocmVnICYgRVZFUkdSRUVOX0NSVENfTUFTVEVSX0VOKQogCQlyZXR1cm4gdHJ1ZTsKIApAQCAtMjgwMCwzICszMTUzLDUyIEBACiAJcmRldi0+YmlvcyA9IE5VTEw7CiAJcmFkZW9uX2R1bW15X3BhZ2VfZmluaShyZGV2KTsKIH0KKworc3RhdGljIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bCwgc3BlZWRfY250bDsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpKQorCQlyZXR1cm47CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm47CisKKwlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCWlmICgoc3BlZWRfY250bCAmIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIpIHx8CisJICAgIChzcGVlZF9jbnRsICYgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yKSkgeworCisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQlsaW5rX3dpZHRoX2NudGwgJj0gfkxDX1VQQ09ORklHVVJFX0RJUzsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsICY9IH5MQ19UQVJHRVRfTElOS19TUEVFRF9PVkVSUklERV9FTjsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgfD0gTENfQ0xSX0ZBSUxFRF9TUERfQ0hBTkdFX0NOVDsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgJj0gfkxDX0NMUl9GQUlMRURfU1BEX0NIQU5HRV9DTlQ7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsIHw9IExDX0dFTjJfRU5fU1RSQVA7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCX0gZWxzZSB7CisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQkvKiBYWFg6IG9ubHkgZGlzYWJsZSBpdCBpZiBnZW4xIGJyaWRnZSB2ZW5kb3IgPT0gMHgxMTFkIG9yIDB4MTEwNiAqLworCQlpZiAoMSkKKwkJCWxpbmtfd2lkdGhfY250bCB8PSBMQ19VUENPTkZJR1VSRV9ESVM7CisJCWVsc2UKKwkJCWxpbmtfd2lkdGhfY250bCAmPSB+TENfVVBDT05GSUdVUkVfRElTOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCmluZGV4IGUwZTU5MDEuLmI3NThkYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYwpAQCAtMTQ3LDcgKzE0Nyw5IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgU1FfVEVYX1ZUWF9WQUxJRF9CVUZGRVIgPDwgMzApOwogCi0JaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fAorCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKSkKIAkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAogCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIDQ4LCBncHVfYWRkcik7CiAJZWxzZQpAQCAtMzMxLDkgKzMzMyw5NSBAQAogCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OwogCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gOTY7CisJCW51bV92c190aHJlYWRzID0gMTY7CisJCW51bV9nc190aHJlYWRzID0gMTY7CisJCW51bV9lc190aHJlYWRzID0gMTY7CisJCW51bV9oc190aHJlYWRzID0gMTY7CisJCW51bV9sc190aHJlYWRzID0gMTY7CisJCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gMTI4OworCQludW1fdnNfdGhyZWFkcyA9IDIwOworCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQludW1fZXNfdGhyZWFkcyA9IDIwOworCQludW1faHNfdGhyZWFkcyA9IDIwOworCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OworCQlicmVhazsKKwljYXNlIENISVBfVFVSS1M6CisJCW51bV9wc19ncHJzID0gOTM7CisJCW51bV92c19ncHJzID0gNDY7CisJCW51bV90ZW1wX2dwcnMgPSA0OworCQludW1fZ3NfZ3BycyA9IDMxOworCQludW1fZXNfZ3BycyA9IDMxOworCQludW1faHNfZ3BycyA9IDIzOworCQludW1fbHNfZ3BycyA9IDIzOworCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2dzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2hzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2xzX3RocmVhZHMgPSAyMDsKKwkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX0NBSUNPUzoKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gMTI4OworCQludW1fdnNfdGhyZWFkcyA9IDEwOworCQludW1fZ3NfdGhyZWFkcyA9IDEwOworCQludW1fZXNfdGhyZWFkcyA9IDEwOworCQludW1faHNfdGhyZWFkcyA9IDEwOworCQludW1fbHNfdGhyZWFkcyA9IDEwOworCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQlicmVhazsKIAl9CiAKLQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpCisJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikgfHwKKwkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQUlDT1MpKQogCQlzcV9jb25maWcgPSAwOwogCWVsc2UKIAkJc3FfY29uZmlnID0gVkNfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9yZWcuaAppbmRleCAyMzMwZjNhLi5jNzgxYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9yZWcuaApAQCAtMTA1LDYgKzEwNSwxMSBAQAogI2RlZmluZSBFVkVSR1JFRU5fR1JQSF9ZX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAweDY4MzAKICNkZWZpbmUgRVZFUkdSRUVOX0dSUEhfWF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODM0CiAjZGVmaW5lIEVWRVJHUkVFTl9HUlBIX1lfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgzOAorI2RlZmluZSBFVkVSR1JFRU5fR1JQSF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY4NDQKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcgICAgKDEgPDwgMikKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX1VQREFURV9MT0NLICAgICAgICAgICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0ZMSVBfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4Njg0OAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9VUERBVEVfSF9SRVRSQUNFX0VOICgxIDw8IDApCiAKIC8qIENVUiBibG9ja3MgYXQgMHg2OTk4LCAweDc1OTgsIDB4MTAxOTgsIDB4MTBkOTgsIDB4MTE5OTgsIDB4MTI1OTggKi8KICNkZWZpbmUgRVZFUkdSRUVOX0NVUl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2OTk4CkBAIC0xNzgsNiArMTgzLDcgQEAKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9DUlRDX0RJU1BfUkVBRF9SRVFVRVNUX0RJU0FCTEUgKDEgPDwgMjQpCiAjZGVmaW5lIEVWRVJHUkVFTl9DUlRDX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmU4YwogI2RlZmluZSBFVkVSR1JFRU5fQ1JUQ19TVEFUVVNfUE9TSVRJT04gICAgICAgICAgICAgICAgICAweDZlOTAKKyNkZWZpbmUgRVZFUkdSRUVOX01BU1RFUl9VUERBVEVfTU9ERSAgICAgICAgICAgICAgICAgICAgMHg2ZWY4CiAjZGVmaW5lIEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICAgICAgICAgICAgICAgICAgICAgIDB4NmVkNAogCiAjZGVmaW5lIEVWRVJHUkVFTl9EQ19HUElPX0hQRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NjRiMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5kLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaAppbmRleCBhNzNiNTNjLi4zNmQzMmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaApAQCAtMTY0LDExICsxNjQsMTMgQEAKICNkZWZpbmUJCVNFX1NDX0JVU1kJCQkJCSgxIDw8IDI5KQogI2RlZmluZQkJU0VfREJfQlVTWQkJCQkJKDEgPDwgMzApCiAjZGVmaW5lCQlTRV9DQl9CVVNZCQkJCQkoMSA8PCAzMSkKLQorLyogZXZlcmdyZWVuICovCiAjZGVmaW5lCUNHX01VTFRfVEhFUk1BTF9TVEFUVVMJCQkJMHg3NDAKICNkZWZpbmUJCUFTSUNfVCh4KQkJCSAgICAgICAgKCh4KSA8PCAxNikKICNkZWZpbmUJCUFTSUNfVF9NQVNLCQkJICAgICAgICAweDdGRjAwMDAKICNkZWZpbmUJCUFTSUNfVF9TSElGVAkJCSAgICAgICAgMTYKKy8qIEFQVSAqLworI2RlZmluZQlDR19USEVSTUFMX1NUQVRVUwkJCSAgICAgICAgMHg2NzgKIAogI2RlZmluZQlIRFBfSE9TVF9QQVRIX0NOVEwJCQkJMHgyQzAwCiAjZGVmaW5lCUhEUF9OT05TVVJGQUNFX0JBU0UJCQkJMHgyQzA0CkBAIC0xODEsNiArMTgzLDcgQEAKICNkZWZpbmUgTUNfU0hBUkVEX0NITUFQCQkJCQkJMHgyMDA0CiAjZGVmaW5lCQlOT09GQ0hBTl9TSElGVAkJCQkJMTIKICNkZWZpbmUJCU5PT0ZDSEFOX01BU0sJCQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgTUNfU0hBUkVEX0NIUkVNQVAJCQkJCTB4MjAwOAogCiAjZGVmaW5lCU1DX0FSQl9SQU1DRkcJCQkJCTB4Mjc2MAogI2RlZmluZQkJTk9PRkJBTktfU0hJRlQJCQkJCTAKQEAgLTIwMCw2ICsyMDMsNyBAQAogI2RlZmluZQlNQ19WTV9BR1BfQk9UCQkJCQkweDIwMkMKICNkZWZpbmUJTUNfVk1fQUdQX0JBU0UJCQkJCTB4MjAzMAogI2RlZmluZQlNQ19WTV9GQl9MT0NBVElPTgkJCQkweDIwMjQKKyNkZWZpbmUJTUNfRlVTX1ZNX0ZCX09GRlNFVAkJCQkweDI4OTgKICNkZWZpbmUJTUNfVk1fTUJfTDFfVExCMF9DTlRMCQkJCTB4MjIzNAogI2RlZmluZQlNQ19WTV9NQl9MMV9UTEIxX0NOVEwJCQkJMHgyMjM4CiAjZGVmaW5lCU1DX1ZNX01CX0wxX1RMQjJfQ05UTAkJCQkweDIyM0MKQEAgLTM0OSw2ICszNTMsOSBAQAogI2RlZmluZQkJU1lOQ19XQUxLRVIJCQkJCSgxIDw8IDI1KQogI2RlZmluZQkJU1lOQ19BTElHTkVSCQkJCQkoMSA8PCAyNikKIAorI2RlZmluZQlUQ1BfQ0hBTl9TVEVFUl9MTwkJCQkweDk2MGMKKyNkZWZpbmUJVENQX0NIQU5fU1RFRVJfSEkJCQkJMHg5NjEwCisKICNkZWZpbmUJVkdUX0NBQ0hFX0lOVkFMSURBVElPTgkJCQkweDg4QzQKICNkZWZpbmUJCUNBQ0hFX0lOVkFMSURBVElPTih4KQkJCQkoKHgpIDw8IDApCiAjZGVmaW5lCQkJVkNfT05MWQkJCQkJCTAKQEAgLTU3NCw2ICs1ODEsNDQgQEAKICMgICAgICAgZGVmaW5lIERDX0hQRHhfUlhfSU5UX1RJTUVSKHgpICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDE2KQogIyAgICAgICBkZWZpbmUgRENfSFBEeF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI4KQogCisvKiBQQ0lFIGxpbmsgc3R1ZmYgKi8KKyNkZWZpbmUgUENJRV9MQ19UUkFJTklOR19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGExIC8qIFBDSUVfUCAqLworI2RlZmluZSBQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTIgLyogUENJRV9QICovCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4NworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDEgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gyICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDggICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gxNiAgICAgICAgICAgICAgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDcwCisjICAgICAgIGRlZmluZSBMQ19SRUNPTkZJR19BUkNfTUlTU0lOR19FU0NBUEUgICAgICAgICAgICAgKDEgPDwgNykKKyMgICAgICAgZGVmaW5lIExDX1JFQ09ORklHX05PVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorIyAgICAgICBkZWZpbmUgTENfUkVORUdPVElBVElPTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBMQ19SRU5FR09USUFURV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTApCisjICAgICAgIGRlZmluZSBMQ19TSE9SVF9SRUNPTkZJR19FTiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBMQ19VUENPTkZJR1VSRV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBMQ19VUENPTkZJR1VSRV9ESVMgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCisjZGVmaW5lIFBDSUVfTENfU1BFRURfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCAvKiBQQ0lFX1AgKi8KKyMgICAgICAgZGVmaW5lIExDX0dFTjJfRU5fU1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgTENfVEFSR0VUX0xJTktfU1BFRURfT1ZFUlJJREVfRU4gICAgICAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBMQ19GT1JDRV9FTl9IV19TUEVFRF9DSEFOR0UgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIExDX0ZPUkNFX0RJU19IV19TUEVFRF9DSEFOR0UgICAgICAgICAgICAgICAoMSA8PCA2KQorIyAgICAgICBkZWZpbmUgTENfU1BFRURfQ0hBTkdFX0FUVEVNUFRTX0FMTE9XRURfTUFTSyAgICAgICgweDMgPDwgOCkKKyMgICAgICAgZGVmaW5lIExDX1NQRUVEX0NIQU5HRV9BVFRFTVBUU19BTExPV0VEX1NISUZUICAgICAzCisjICAgICAgIGRlZmluZSBMQ19DVVJSRU5UX0RBVEFfUkFURSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBMQ19WT0xUQUdFX1RJTUVSX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAxNCkKKyMgICAgICAgZGVmaW5lIExDX0NMUl9GQUlMRURfU1BEX0NIQU5HRV9DTlQgICAgICAgICAgICAgICAoMSA8PCAyMSkKKyMgICAgICAgZGVmaW5lIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIExDX09USEVSX1NJREVfU1VQUE9SVFNfR0VOMiAgICAgICAgICAgICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgTU1fQ0ZHUkVHU19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0NGMKKyMgICAgICAgZGVmaW5lIE1NX1dSX1RPX0NGR19FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBMSU5LX0NOVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODggLyogRjAgKi8KKyMgICAgICAgZGVmaW5lIFRBUkdFVF9MSU5LX1NQRUVEX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHhmIDw8IDApCisjICAgICAgIGRlZmluZSBTRUxFQ1RBQkxFX0RFRU1QSEFTSVMgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKwogLyoKICAqIFBNNAogICovCkBAIC02MDMsNyArNjQ4LDcgQEAKICNkZWZpbmUJUEFDS0VUM19OT1AJCQkJCTB4MTAKICNkZWZpbmUJUEFDS0VUM19TRVRfQkFTRQkJCQkweDExCiAjZGVmaW5lCVBBQ0tFVDNfQ0xFQVJfU1RBVEUJCQkJMHgxMgotI2RlZmluZQlQQUNLRVQzX0lORElSRUNUX0JVRkZFUl9TSVpFCQkJMHgxMworI2RlZmluZQlQQUNLRVQzX0lOREVYX0JVRkZFUl9TSVpFCQkJMHgxMwogI2RlZmluZQlQQUNLRVQzX0RJU1BBVENIX0RJUkVDVAkJCQkweDE1CiAjZGVmaW5lCVBBQ0tFVDNfRElTUEFUQ0hfSU5ESVJFQ1QJCQkweDE2CiAjZGVmaW5lCVBBQ0tFVDNfSU5ESVJFQ1RfQlVGRkVSX0VORAkJCTB4MTcKQEAgLTY0NCwxNCArNjg5LDE0IEBACiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19DQjhfREVTVF9CQVNFX0VOQSAgICAoMSA8PCAxNSkKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCOV9ERVNUX0JBU0VfRU5BICAgICgxIDw8IDE2KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfQ0IxMF9ERVNUX0JBU0VfRU5BICAgKDEgPDwgMTcpCi0jICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19DQjExX0RFU1RfQkFTRV9FTkEgICAoMSA8PCAxNykKKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCMTFfREVTVF9CQVNFX0VOQSAgICgxIDw8IDE4KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfRlVMTF9DQUNIRV9FTkEgICAgICAgKDEgPDwgMjApCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19UQ19BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyMykKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX1ZDX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI0KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfQ0JfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjUpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19EQl9BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyNikKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX1NIX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI3KQotIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfU01YX0FDVElPTl9FTkEgICAgICAgKDEgPDwgMjgpCisjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19TWF9BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyOCkKICNkZWZpbmUJUEFDS0VUM19NRV9JTklUSUFMSVpFCQkJCTB4NDQKICNkZWZpbmUJCVBBQ0tFVDNfTUVfSU5JVElBTElaRV9ERVZJQ0VfSUQoeCkgKCh4KSA8PCAxNikKICNkZWZpbmUJUEFDS0VUM19DT05EX1dSSVRFCQkJCTB4NDUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTBiZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEFsZXggRGV1Y2hlcgorICovCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInJhZGVvbi5oIgorI2luY2x1ZGUgInJhZGVvbl9hc2ljLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgIm5pZC5oIgorI2luY2x1ZGUgImF0b20uaCIKKyNpbmNsdWRlICJuaV9yZWcuaCIKKworI2RlZmluZSBFVkVSR1JFRU5fUEZQX1VDT0RFX1NJWkUgMTEyMAorI2RlZmluZSBFVkVSR1JFRU5fUE00X1VDT0RFX1NJWkUgMTM3NgorI2RlZmluZSBFVkVSR1JFRU5fUkxDX1VDT0RFX1NJWkUgNzY4CisjZGVmaW5lIEJUQ19NQ19VQ09ERV9TSVpFIDYwMjQKKworLyogRmlybXdhcmUgTmFtZXMgKi8KK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0JBUlRTX3BmcC5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0JBUlRTX21lLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vQkFSVFNfbWMuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9CVENfcmxjLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vVFVSS1NfcGZwLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vVFVSS1NfbWUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9UVVJLU19tYy5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NBSUNPU19wZnAuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9DQUlDT1NfbWUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9DQUlDT1NfbWMuYmluIik7CisKKyNkZWZpbmUgQlRDX0lPX01DX1JFR1NfU0laRSAyOQorCitzdGF0aWMgY29uc3QgdTMyIGJhcnRzX2lvX21jX3JlZ3NbQlRDX0lPX01DX1JFR1NfU0laRV1bMl0gPSB7CisJezB4MDAwMDAwNzcsIDB4ZmYwMTAxMDB9LAorCXsweDAwMDAwMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA3OSwgMHgwMDAwMTQzNH0sCisJezB4MDAwMDAwN2EsIDB4Y2MwOGVjMDh9LAorCXsweDAwMDAwMDdiLCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwMDA3YywgMHgwMDAwODBjMH0sCisJezB4MDAwMDAwN2QsIDB4MDkwMDAwMDB9LAorCXsweDAwMDAwMDdlLCAweDAwMjEwNDA0fSwKKwl7MHgwMDAwMDA4MSwgMHgwOGE4ZTgwMH0sCisJezB4MDAwMDAwODIsIDB4MDAwMzA0NDR9LAorCXsweDAwMDAwMDgzLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA4NSwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDAwODYsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDAwMDg3LCAweDQ4NDkwMDAwfSwKKwl7MHgwMDAwMDA4OCwgMHgyMDI0NDY0N30sCisJezB4MDAwMDAwODksIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDhiLCAweDY2MDMwMDAwfSwKKwl7MHgwMDAwMDA4YywgMHgwMDAwNjYwM30sCisJezB4MDAwMDAwOGQsIDB4MDAwMDAxMDB9LAorCXsweDAwMDAwMDhmLCAweDAwMDAxYzBhfSwKKwl7MHgwMDAwMDA5MCwgMHhmZjAwMDAwMX0sCisJezB4MDAwMDAwOTQsIDB4MDAxMDExMDF9LAorCXsweDAwMDAwMDk1LCAweDAwMDAwZmZmfSwKKwl7MHgwMDAwMDA5NiwgMHgwMDExNmZmZn0sCisJezB4MDAwMDAwOTcsIDB4NjAwMTAwMDB9LAorCXsweDAwMDAwMDk4LCAweDEwMDEwMDAwfSwKKwl7MHgwMDAwMDA5OSwgMHgwMDAwNjAwMH0sCisJezB4MDAwMDAwOWEsIDB4MDAwMDEwMDB9LAorCXsweDAwMDAwMDlmLCAweDAwOTQ2YTAwfQorfTsKKworc3RhdGljIGNvbnN0IHUzMiB0dXJrc19pb19tY19yZWdzW0JUQ19JT19NQ19SRUdTX1NJWkVdWzJdID0geworCXsweDAwMDAwMDc3LCAweGZmMDEwMTAwfSwKKwl7MHgwMDAwMDA3OCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwNzksIDB4MDAwMDE0MzR9LAorCXsweDAwMDAwMDdhLCAweGNjMDhlYzA4fSwKKwl7MHgwMDAwMDA3YiwgMHgwMDA0MDAwMH0sCisJezB4MDAwMDAwN2MsIDB4MDAwMDgwYzB9LAorCXsweDAwMDAwMDdkLCAweDA5MDAwMDAwfSwKKwl7MHgwMDAwMDA3ZSwgMHgwMDIxMDQwNH0sCisJezB4MDAwMDAwODEsIDB4MDhhOGU4MDB9LAorCXsweDAwMDAwMDgyLCAweDAwMDMwNDQ0fSwKKwl7MHgwMDAwMDA4MywgMHgwMDAwMDAwMH0sCisJezB4MDAwMDAwODUsIDB4MDAwMDAwMDF9LAorCXsweDAwMDAwMDg2LCAweDAwMDAwMDAyfSwKKwl7MHgwMDAwMDA4NywgMHg0ODQ5MDAwMH0sCisJezB4MDAwMDAwODgsIDB4MjAyNDQ2NDd9LAorCXsweDAwMDAwMDg5LCAweDAwMDAwMDA1fSwKKwl7MHgwMDAwMDA4YiwgMHg2NjAzMDAwMH0sCisJezB4MDAwMDAwOGMsIDB4MDAwMDY2MDN9LAorCXsweDAwMDAwMDhkLCAweDAwMDAwMTAwfSwKKwl7MHgwMDAwMDA4ZiwgMHgwMDAwMWMwYX0sCisJezB4MDAwMDAwOTAsIDB4ZmYwMDAwMDF9LAorCXsweDAwMDAwMDk0LCAweDAwMTAxMTAxfSwKKwl7MHgwMDAwMDA5NSwgMHgwMDAwMGZmZn0sCisJezB4MDAwMDAwOTYsIDB4MDAxMTZmZmZ9LAorCXsweDAwMDAwMDk3LCAweDYwMDEwMDAwfSwKKwl7MHgwMDAwMDA5OCwgMHgxMDAxMDAwMH0sCisJezB4MDAwMDAwOTksIDB4MDAwMDYwMDB9LAorCXsweDAwMDAwMDlhLCAweDAwMDAxMDAwfSwKKwl7MHgwMDAwMDA5ZiwgMHgwMDkzNmEwMH0KK307CisKK3N0YXRpYyBjb25zdCB1MzIgY2FpY29zX2lvX21jX3JlZ3NbQlRDX0lPX01DX1JFR1NfU0laRV1bMl0gPSB7CisJezB4MDAwMDAwNzcsIDB4ZmYwMTAxMDB9LAorCXsweDAwMDAwMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA3OSwgMHgwMDAwMTQzNH0sCisJezB4MDAwMDAwN2EsIDB4Y2MwOGVjMDh9LAorCXsweDAwMDAwMDdiLCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwMDA3YywgMHgwMDAwODBjMH0sCisJezB4MDAwMDAwN2QsIDB4MDkwMDAwMDB9LAorCXsweDAwMDAwMDdlLCAweDAwMjEwNDA0fSwKKwl7MHgwMDAwMDA4MSwgMHgwOGE4ZTgwMH0sCisJezB4MDAwMDAwODIsIDB4MDAwMzA0NDR9LAorCXsweDAwMDAwMDgzLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA4NSwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDAwODYsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDAwMDg3LCAweDQ4NDkwMDAwfSwKKwl7MHgwMDAwMDA4OCwgMHgyMDI0NDY0N30sCisJezB4MDAwMDAwODksIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDhiLCAweDY2MDMwMDAwfSwKKwl7MHgwMDAwMDA4YywgMHgwMDAwNjYwM30sCisJezB4MDAwMDAwOGQsIDB4MDAwMDAxMDB9LAorCXsweDAwMDAwMDhmLCAweDAwMDAxYzBhfSwKKwl7MHgwMDAwMDA5MCwgMHhmZjAwMDAwMX0sCisJezB4MDAwMDAwOTQsIDB4MDAxMDExMDF9LAorCXsweDAwMDAwMDk1LCAweDAwMDAwZmZmfSwKKwl7MHgwMDAwMDA5NiwgMHgwMDExNmZmZn0sCisJezB4MDAwMDAwOTcsIDB4NjAwMTAwMDB9LAorCXsweDAwMDAwMDk4LCAweDEwMDEwMDAwfSwKKwl7MHgwMDAwMDA5OSwgMHgwMDAwNjAwMH0sCisJezB4MDAwMDAwOWEsIDB4MDAwMDEwMDB9LAorCXsweDAwMDAwMDlmLCAweDAwOTE2YTAwfQorfTsKKworaW50IGJ0Y19tY19sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwljb25zdCBfX2JlMzIgKmZ3X2RhdGE7CisJdTMyIG1lbV90eXBlLCBydW5uaW5nLCBibGFja291dCA9IDA7CisJdTMyICppb19tY19yZWdzOworCWludCBpOworCisJaWYgKCFyZGV2LT5tY19mdykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgeworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJaW9fbWNfcmVncyA9ICh1MzIgKikmYmFydHNfaW9fbWNfcmVnczsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1RVUktTOgorCQlpb19tY19yZWdzID0gKHUzMiAqKSZ0dXJrc19pb19tY19yZWdzOworCQlicmVhazsKKwljYXNlIENISVBfQ0FJQ09TOgorCWRlZmF1bHQ6CisJCWlvX21jX3JlZ3MgPSAodTMyICopJmNhaWNvc19pb19tY19yZWdzOworCQlicmVhazsKKwl9CisKKwltZW1fdHlwZSA9IChSUkVHMzIoTUNfU0VRX01JU0MwKSAmIE1DX1NFUV9NSVNDMF9HRERSNV9NQVNLKSA+PiBNQ19TRVFfTUlTQzBfR0REUjVfU0hJRlQ7CisJcnVubmluZyA9IFJSRUczMihNQ19TRVFfU1VQX0NOVEwpICYgUlVOX01BU0s7CisKKwlpZiAoKG1lbV90eXBlID09IE1DX1NFUV9NSVNDMF9HRERSNV9WQUxVRSkgJiYgKHJ1bm5pbmcgPT0gMCkpIHsKKwkJaWYgKHJ1bm5pbmcpIHsKKwkJCWJsYWNrb3V0ID0gUlJFRzMyKE1DX1NIQVJFRF9CTEFDS09VVF9DTlRMKTsKKwkJCVdSRUczMihNQ19TSEFSRURfQkxBQ0tPVVRfQ05UTCwgMSk7CisJCX0KKworCQkvKiByZXNldCB0aGUgZW5naW5lIGFuZCBzZXQgdG8gd3JpdGFibGUgKi8KKwkJV1JFRzMyKE1DX1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAwOCk7CisJCVdSRUczMihNQ19TRVFfU1VQX0NOVEwsIDB4MDAwMDAwMTApOworCisJCS8qIGxvYWQgbWMgaW8gcmVncyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQlRDX0lPX01DX1JFR1NfU0laRTsgaSsrKSB7CisJCQlXUkVHMzIoTUNfU0VRX0lPX0RFQlVHX0lOREVYLCBpb19tY19yZWdzWyhpIDw8IDEpXSk7CisJCQlXUkVHMzIoTUNfU0VRX0lPX0RFQlVHX0RBVEEsIGlvX21jX3JlZ3NbKGkgPDwgMSkgKyAxXSk7CisJCX0KKwkJLyogbG9hZCB0aGUgTUMgdWNvZGUgKi8KKwkJZndfZGF0YSA9IChjb25zdCBfX2JlMzIgKilyZGV2LT5tY19mdy0+ZGF0YTsKKwkJZm9yIChpID0gMDsgaSA8IEJUQ19NQ19VQ09ERV9TSVpFOyBpKyspCisJCQlXUkVHMzIoTUNfU0VRX1NVUF9QR00sIGJlMzJfdG9fY3B1cChmd19kYXRhKyspKTsKKworCQkvKiBwdXQgdGhlIGVuZ2luZSBiYWNrIGludG8gdGhlIGFjdGl2ZSBzdGF0ZSAqLworCQlXUkVHMzIoTUNfU0VRX1NVUF9DTlRMLCAweDAwMDAwMDA4KTsKKwkJV1JFRzMyKE1DX1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAwNCk7CisJCVdSRUczMihNQ19TRVFfU1VQX0NOVEwsIDB4MDAwMDAwMDEpOworCisJCS8qIHdhaXQgZm9yIHRyYWluaW5nIHRvIGNvbXBsZXRlICovCisJCXdoaWxlICghKFJSRUczMihNQ19JT19QQURfQ05UTF9EMCkgJiBNRU1fRkFMTF9PVVRfQ01EKSkKKwkJCXVkZWxheSgxMCk7CisKKwkJaWYgKHJ1bm5pbmcpCisJCQlXUkVHMzIoTUNfU0hBUkVEX0JMQUNLT1VUX0NOVEwsIGJsYWNrb3V0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5pX2luaXRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJY29uc3QgY2hhciAqY2hpcF9uYW1lOworCWNvbnN0IGNoYXIgKnJsY19jaGlwX25hbWU7CisJc2l6ZV90IHBmcF9yZXFfc2l6ZSwgbWVfcmVxX3NpemUsIHJsY19yZXFfc2l6ZSwgbWNfcmVxX3NpemU7CisJY2hhciBmd19uYW1lWzMwXTsKKwlpbnQgZXJyOworCisJRFJNX0RFQlVHKCJcbiIpOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJhZGVvbl9jcCIsIDAsIE5VTEwsIDApOworCWVyciA9IElTX0VSUihwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFkZW9uX2NwOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgeworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJY2hpcF9uYW1lID0gIkJBUlRTIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJCVEMiOworCQlicmVhazsKKwljYXNlIENISVBfVFVSS1M6CisJCWNoaXBfbmFtZSA9ICJUVVJLUyI7CisJCXJsY19jaGlwX25hbWUgPSAiQlRDIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX0NBSUNPUzoKKwkJY2hpcF9uYW1lID0gIkNBSUNPUyI7CisJCXJsY19jaGlwX25hbWUgPSAiQlRDIjsKKwkJYnJlYWs7CisJZGVmYXVsdDogQlVHKCk7CisJfQorCisJcGZwX3JlcV9zaXplID0gRVZFUkdSRUVOX1BGUF9VQ09ERV9TSVpFICogNDsKKwltZV9yZXFfc2l6ZSA9IEVWRVJHUkVFTl9QTTRfVUNPREVfU0laRSAqIDQ7CisJcmxjX3JlcV9zaXplID0gRVZFUkdSRUVOX1JMQ19VQ09ERV9TSVpFICogNDsKKwltY19yZXFfc2l6ZSA9IEJUQ19NQ19VQ09ERV9TSVpFICogNDsKKworCURSTV9JTkZPKCJMb2FkaW5nICVzIE1pY3JvY29kZVxuIiwgY2hpcF9uYW1lKTsKKworCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19wZnAuYmluIiwgY2hpcF9uYW1lKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZyZGV2LT5wZnBfZncsIGZ3X25hbWUsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChyZGV2LT5wZnBfZnctPnNpemUgIT0gcGZwX3JlcV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm5pX2NwOiBCb2d1cyBsZW5ndGggJXp1IGluIGZpcm13YXJlIFwiJXNcIlxuIiwKKwkJICAgICAgIHJkZXYtPnBmcF9mdy0+c2l6ZSwgZndfbmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19tZS5iaW4iLCBjaGlwX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnJkZXYtPm1lX2Z3LCBmd19uYW1lLCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAocmRldi0+bWVfZnctPnNpemUgIT0gbWVfcmVxX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAibmlfY3A6IEJvZ3VzIGxlbmd0aCAlenUgaW4gZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgcmRldi0+bWVfZnctPnNpemUsIGZ3X25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19ybGMuYmluIiwgcmxjX2NoaXBfbmFtZSk7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmcmRldi0+cmxjX2Z3LCBmd19uYW1lLCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAocmRldi0+cmxjX2Z3LT5zaXplICE9IHJsY19yZXFfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJuaV9ybGM6IEJvZ3VzIGxlbmd0aCAlenUgaW4gZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgcmRldi0+cmxjX2Z3LT5zaXplLCBmd19uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlzbnByaW50Zihmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJyYWRlb24vJXNfbWMuYmluIiwgY2hpcF9uYW1lKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZyZGV2LT5tY19mdywgZndfbmFtZSwgJnBkZXYtPmRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKHJkZXYtPm1jX2Z3LT5zaXplICE9IG1jX3JlcV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm5pX21jOiBCb2d1cyBsZW5ndGggJXp1IGluIGZpcm13YXJlIFwiJXNcIlxuIiwKKwkJICAgICAgIHJkZXYtPm1jX2Z3LT5zaXplLCBmd19uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CitvdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgIT0gLUVJTlZBTCkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJuaV9jcDogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgXCIlc1wiXG4iLAorCQkJICAgICAgIGZ3X25hbWUpOworCQlyZWxlYXNlX2Zpcm13YXJlKHJkZXYtPnBmcF9mdyk7CisJCXJkZXYtPnBmcF9mdyA9IE5VTEw7CisJCXJlbGVhc2VfZmlybXdhcmUocmRldi0+bWVfZncpOworCQlyZGV2LT5tZV9mdyA9IE5VTEw7CisJCXJlbGVhc2VfZmlybXdhcmUocmRldi0+cmxjX2Z3KTsKKwkJcmRldi0+cmxjX2Z3ID0gTlVMTDsKKwkJcmVsZWFzZV9maXJtd2FyZShyZGV2LT5tY19mdyk7CisJCXJkZXYtPm1jX2Z3ID0gTlVMTDsKKwl9CisJcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiN2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlfcmVnLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBBbGV4IERldWNoZXIKKyAqLworI2lmbmRlZiBfX05JX1JFR19IX18KKyNkZWZpbmUgX19OSV9SRUdfSF9fCisKKy8qIG5vcnRoZXJuIGlzbGFuZHMgLSBEQ0U1ICovCisKKyNkZWZpbmUgTklfSU5QVVRfR0FNTUFfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDY4NDAKKyMgICAgICAgZGVmaW5lIE5JX0dSUEhfSU5QVVRfR0FNTUFfTU9ERSh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMCkKKyMgICAgICAgZGVmaW5lIE5JX0lOUFVUX0dBTU1BX1VTRV9MVVQgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9HQU1NQV9CWVBBU1MgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfR0FNTUFfU1JHQl8yNCAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIE5JX0lOUFVUX0dBTU1BX1hWWUNDXzIyMiAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBOSV9PVkxfSU5QVVRfR0FNTUFfTU9ERSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDQpCisKKyNkZWZpbmUgTklfUFJFU0NBTEVfR1JQSF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAweDY4YjQKKyMgICAgICAgZGVmaW5lIE5JX0dSUEhfUFJFU0NBTEVfQllQQVNTICAgICAgICAgICAgICAgICAoMSA8PCA0KQorCisjZGVmaW5lIE5JX1BSRVNDQUxFX09WTF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgMHg2OGM0CisjICAgICAgIGRlZmluZSBOSV9PVkxfUFJFU0NBTEVfQllQQVNTICAgICAgICAgICAgICAgICAgKDEgPDwgNCkKKworI2RlZmluZSBOSV9JTlBVVF9DU0NfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjhkNAorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfQ1NDX0dSUEhfTU9ERSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAwKQorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfQ1NDX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIE5JX0lOUFVUX0NTQ19QUk9HX0NPRUZGICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9DU0NfUFJPR19TSEFSRURfTUFUUklYQSAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfQ1NDX09WTF9NT0RFKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCA0KQorCisjZGVmaW5lIE5JX09VVFBVVF9DU0NfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2OGYwCisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX0dSUEhfTU9ERSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDApCisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTklfT1VUUFVUX0NTQ19UVl9SR0IgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfWUNCQ1JfNjAxICAgICAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX1lDQkNSXzcwOSAgICAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgTklfT1VUUFVUX0NTQ19QUk9HX0NPRUZGICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfUFJPR19TSEFSRURfTUFUUklYQiAgICAgICA1CisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX09WTF9NT0RFKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDQpCisKKyNkZWZpbmUgTklfREVHQU1NQV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY5NjAKKyMgICAgICAgZGVmaW5lIE5JX0dSUEhfREVHQU1NQV9NT0RFKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMCkKKyMgICAgICAgZGVmaW5lIE5JX0RFR0FNTUFfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBOSV9ERUdBTU1BX1NSR0JfMjQgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTklfREVHQU1NQV9YVllDQ18yMjIgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIE5JX09WTF9ERUdBTU1BX01PREUoeCkgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgNCkKKyMgICAgICAgZGVmaW5lIE5JX0lDT05fREVHQU1NQV9NT0RFKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgOCkKKyMgICAgICAgZGVmaW5lIE5JX0NVUlNPUl9ERUdBTU1BX01PREUoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMTIpCisKKyNkZWZpbmUgTklfR0FNVVRfUkVNQVBfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDY5NjQKKyMgICAgICAgZGVmaW5lIE5JX0dSUEhfR0FNVVRfUkVNQVBfTU9ERSh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMCkKKyMgICAgICAgZGVmaW5lIE5JX0dBTVVUX1JFTUFQX0JZUEFTUyAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBOSV9HQU1VVF9SRU1BUF9QUk9HX0NPRUZGICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTklfR0FNVVRfUkVNQVBfUFJPR19TSEFSRURfTUFUUklYQSAgICAgIDIKKyMgICAgICAgZGVmaW5lIE5JX0dBTVVUX1JFTUFQX1BST0dfU0hBUkVEX01BVFJJWEIgICAgICAzCisjICAgICAgIGRlZmluZSBOSV9PVkxfR0FNVVRfUkVNQVBfTU9ERSh4KSAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDQpCisKKyNkZWZpbmUgTklfUkVHQU1NQV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZhODAKKyMgICAgICAgZGVmaW5lIE5JX0dSUEhfUkVHQU1NQV9NT0RFKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgMCkKKyMgICAgICAgZGVmaW5lIE5JX1JFR0FNTUFfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBOSV9SRUdBTU1BX1NSR0JfMjQgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTklfUkVHQU1NQV9YVllDQ18yMjIgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIE5JX1JFR0FNTUFfUFJPR19BICAgICAgICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBOSV9SRUdBTU1BX1BST0dfQiAgICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTklfT1ZMX1JFR0FNTUFfTU9ERSh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCA0KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjQ0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pZC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQWxleCBEZXVjaGVyCisgKi8KKyNpZm5kZWYgTklfSAorI2RlZmluZSBOSV9ICisKKyNkZWZpbmUgTUNfU0hBUkVEX0JMQUNLT1VUX0NOVEwgICAgICAgICAgIAkJMHgyMGFjCisjZGVmaW5lIE1DX1NFUV9TVVBfQ05UTCAgICAgICAgICAgCQkJMHgyOGM4CisjZGVmaW5lCQlSVU5fTUFTSyAgICAgIAkJCQkoMSA8PCAwKQorI2RlZmluZSBNQ19TRVFfU1VQX1BHTSAgICAgICAgICAgCQkJMHgyOGNjCisjZGVmaW5lIE1DX0lPX1BBRF9DTlRMX0QwICAgICAgICAgICAJCQkweDI5ZDAKKyNkZWZpbmUJCU1FTV9GQUxMX09VVF9DTUQgICAgICAJCQkoMSA8PCA4KQorI2RlZmluZSBNQ19TRVFfTUlTQzAgICAgICAgICAgIAkJCQkweDJhMDAKKyNkZWZpbmUJCU1DX1NFUV9NSVNDMF9HRERSNV9TSElGVCAgICAgIAkJMjgKKyNkZWZpbmUJCU1DX1NFUV9NSVNDMF9HRERSNV9NQVNLICAgICAgCQkweGYwMDAwMDAwCisjZGVmaW5lCQlNQ19TRVFfTUlTQzBfR0REUjVfVkFMVUUgICAgICAJCTUKKyNkZWZpbmUgTUNfU0VRX0lPX0RFQlVHX0lOREVYICAgICAgICAgICAJCTB4MmE0NAorI2RlZmluZSBNQ19TRVFfSU9fREVCVUdfREFUQSAgICAgICAgICAgCQkJMHgyYTQ4CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCmluZGV4IDhlMTBhYTlmLi5mNjM3NTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYwpAQCAtNjgsNiArNjgsNTYgQEAKICAqIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MAogICovCiAKK3ZvaWQgcjEwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdOworCXUzMiB0bXA7CisKKwkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLworCXRtcCA9IFJSRUczMihSQURFT05fQ1JUQ19PRkZTRVRfQ05UTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisJdG1wICY9IH5SQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMOworCS8qIG1ha2Ugc3VyZSBwZW5kaW5nIGJpdCBpcyBhc3NlcnRlZCAqLworCXRtcCB8PSBSQURFT05fQ1JUQ19HVUlfVFJJR19PRkZTRVRfTEVGVF9FTjsKKwlXUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBzZXQgcGFnZWZsaXAgdG8gaGFwcGVuIGFzIGxhdGUgYXMgcG9zc2libGUgaW4gdGhlIHZibGFuayBpbnRlcnZhbC4KKwkgKiBzYW1lIGZpZWxkIGZvciBjcnRjMS8yCisJICovCisJdG1wID0gUlJFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMKTsKKwl0bXAgJj0gflJBREVPTl9DUlRDX1ZTVEFUX01PREVfTUFTSzsKKwlXUkVHMzIoUkFERU9OX0NSVENfR0VOX0NOVEwsIHRtcCk7CisKKwkvKiBlbmFibGUgdGhlIHBmbGlwIGludCAqLworCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQocmRldiwgY3J0Yyk7Cit9CisKK3ZvaWQgcjEwMF9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJLyogZGlzYWJsZSB0aGUgcGZsaXAgaW50ICovCisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChyZGV2LCBjcnRjKTsKK30KKwordTMyIHIxMDBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOworCXUzMiB0bXAgPSAoKHUzMiljcnRjX2Jhc2UpIHwgUkFERU9OX0NSVENfT0ZGU0VUX19PRkZTRVRfTE9DSzsKKworCS8qIExvY2sgdGhlIGdyYXBoaWNzIHVwZGF0ZSBsb2NrICovCisJLyogdXBkYXRlIHRoZSBzY2Fub3V0IGFkZHJlc3NlcyAqLworCVdSRUczMihSQURFT05fQ1JUQ19PRkZTRVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBXYWl0IGZvciB1cGRhdGVfcGVuZGluZyB0byBnbyBoaWdoLiAqLworCXdoaWxlICghKFJSRUczMihSQURFT05fQ1JUQ19PRkZTRVQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgUkFERU9OX0NSVENfT0ZGU0VUX19HVUlfVFJJR19PRkZTRVQpKTsKKwlEUk1fREVCVUcoIlVwZGF0ZSBwZW5kaW5nIG5vdyBoaWdoLiBVbmxvY2tpbmcgdnVwZGF0ZV9sb2NrLlxuIik7CisKKwkvKiBVbmxvY2sgdGhlIGxvY2ssIHNvIGRvdWJsZS1idWZmZXJpbmcgY2FuIHRha2UgcGxhY2UgaW5zaWRlIHZibGFuayAqLworCXRtcCAmPSB+UkFERU9OX0NSVENfT0ZGU0VUX19PRkZTRVRfTE9DSzsKKwlXUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworCisJLyogUmV0dXJuIGN1cnJlbnQgdXBkYXRlX3BlbmRpbmcgc3RhdHVzOiAqLworCXJldHVybiBSUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIFJBREVPTl9DUlRDX09GRlNFVF9fR1VJX1RSSUdfT0ZGU0VUOworfQorCiB2b2lkIHIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWludCBpOwpAQCAtNTI2LDEwICs1NzYsMTIgQEAKIAlpZiAocmRldi0+aXJxLmd1aV9pZGxlKSB7CiAJCXRtcCB8PSBSQURFT05fR1VJX0lETEVfTUFTSzsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMF0pIHsKIAkJdG1wIHw9IFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFsxXSkgewogCQl0bXAgfD0gUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLOwogCX0KIAlpZiAocmRldi0+aXJxLmhwZFswXSkgewpAQCAtNjAwLDE0ICs2NTIsMjIgQEAKIAkJfQogCQkvKiBWZXJ0aWNhbCBibGFuayBpbnRlcnJ1cHRzICovCiAJCWlmIChzdGF0dXMgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkgewotCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7Ci0JCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7CisJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJfQorCQkJaWYgKHJkZXYtPmlycS5wZmxpcFswXSkKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAwKTsKIAkJfQogCQlpZiAoc3RhdHVzICYgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSB7Ci0JCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKLQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKLQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKKwkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7CisJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQl9CisJCQlpZiAocmRldi0+aXJxLnBmbGlwWzFdKQorCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOwogCQl9CiAJCWlmIChzdGF0dXMgJiBSQURFT05fRlBfREVURUNUX1NUQVQpIHsKIAkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwpAQCAtNjIyLDcgKzY4Miw3IEBACiAJLyogcmVzZXQgZ3VpIGlkbGUgYWNrLiAgdGhlIHN0YXR1cyBiaXQgaXMgYnJva2VuICovCiAJcmRldi0+aXJxLmd1aV9pZGxlX2Fja2VkID0gZmFsc2U7CiAJaWYgKHF1ZXVlX2hvdHBsdWcpCi0JCXF1ZXVlX3dvcmsocmRldi0+d3EsICZyZGV2LT5ob3RwbHVnX3dvcmspOworCQlzY2hlZHVsZV93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwogCWlmIChyZGV2LT5tc2lfZW5hYmxlZCkgewogCQlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCQljYXNlIENISVBfUlM0MDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBkLmgKaW5kZXggYjEyMWI2Yy4uZWFiOTE3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMGQuaApAQCAtNTUxLDcgKzU1MSw3IEBACiAjZGVmaW5lICAgU18wMDAzNjBfQ1VSMl9MT0NLKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDMxKQogI2RlZmluZSAgIEdfMDAwMzYwX0NVUjJfTE9DSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IDMxKSAmIDB4MSkKICNkZWZpbmUgICBDXzAwMDM2MF9DVVIyX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGRkZGRkZGCi0jZGVmaW5lIFJfMDAwM0MyX0dFTk1PX1dUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM0MwCisjZGVmaW5lIFJfMDAwM0MyX0dFTk1PX1dUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwM0MyCiAjZGVmaW5lICAgU18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgJiAweDEpIDw8IDApCiAjZGVmaW5lICAgR18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IoeCkgICAgICAgICAgICAgKCgoeCkgPj4gMCkgJiAweDEpCiAjZGVmaW5lICAgQ18wMDAzQzJfR0VOTU9fTU9OT19BRERSRVNTX0IgICAgICAgICAgICAgICAgMHhGRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwppbmRleCBjZGUxZDM0Li5mYWU1ZTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDAuYwpAQCAtNTU4LDEwICs1NTgsNyBAQAogCiAJLyogRklYTUUgd2FpdCBmb3IgaWRsZSAqLwogCi0JaWYgKHJkZXYtPmZhbWlseSA8IENISVBfUjYwMCkKLQkJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUUoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMKTsKLQllbHNlCi0JCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKwlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRShSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOwogCiAJc3dpdGNoICgobGlua193aWR0aF9jbnRsICYgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9SRF9NQVNLKSA+PiBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1JEX1NISUZUKSB7CiAJY2FzZSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gwOgpAQCAtNzQ1LDYgKzc0MiwxMSBAQAogCQlicmVhazsKIAljYXNlIDB4NEUwMDoKIAkJLyogUkIzRF9DQ1RMICovCisJCWlmICgoaWR4X3ZhbHVlICYgKDEgPDwgMTApKSAmJiAvKiBDTUFTS19FTkFCTEUgKi8KKwkJICAgIHAtPnJkZXYtPmNtYXNrX2ZpbHAgIT0gcC0+ZmlscCkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFJCM0RfQ0NUTDogQ2Fubm90IGVuYWJsZSBDTUFTSy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJdHJhY2stPm51bV9jYiA9ICgoaWR4X3ZhbHVlID4+IDUpICYgMHgzKSArIDE7CiAJCWJyZWFrOwogCWNhc2UgMHg0RTM4OgpAQCAtNzg3LDYgKzc4OSwxMyBAQAogCQljYXNlIDE1OgogCQkJdHJhY2stPmNiW2ldLmNwcCA9IDI7CiAJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaWYgKHAtPnJkZXYtPmZhbWlseSA8IENISVBfUlY1MTUpIHsKKwkJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3IgYnVmZmVyIGZvcm1hdCAoJWQpIVxuIiwKKwkJCQkJICAoKGlkeF92YWx1ZSA+PiAyMSkgJiAweEYpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIFBhc3MgdGhyb3VnaC4gKi8KIAkJY2FzZSA2OgogCQkJdHJhY2stPmNiW2ldLmNwcCA9IDQ7CiAJCQlicmVhazsKQEAgLTExOTksNiArMTIwOCwxMCBAQAogCQlpZiAocC0+cmRldi0+aHlwZXJ6X2ZpbHAgIT0gcC0+ZmlscCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIFBBQ0tFVDNfM0RfQ0xFQVJfQ01BU0s6CisJCWlmIChwLT5yZGV2LT5jbWFza19maWxwICE9IHAtPmZpbHApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CiAJY2FzZSBQQUNLRVQzX05PUDoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaAppbmRleCAwYzAzNmM2MGQuLjFmNTE5YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBkLmgKQEAgLTU0LDYgKzU0LDcgQEAKICNkZWZpbmUJCVBBQ0tFVDNfM0RfRFJBV19JTU1EXzIJCTB4MzUKICNkZWZpbmUJCVBBQ0tFVDNfM0RfRFJBV19JTkRYXzIJCTB4MzYKICNkZWZpbmUJCVBBQ0tFVDNfM0RfQ0xFQVJfSElaCQkweDM3CisjZGVmaW5lCQlQQUNLRVQzXzNEX0NMRUFSX0NNQVNLCQkweDM4CiAjZGVmaW5lCQlQQUNLRVQzX0JJVEJMVF9NVUxUSQkJMHg5QgogCiAjZGVmaW5lIFBBQ0tFVDAocmVnLCBuKQkoQ1BfUEFDS0VUMCB8CQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmgKaW5kZXggNmFjMWY2MC4uZmM0MzcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTAwX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaApAQCAtMzU1LDYgKzM1NSw4IEBACiAjZGVmaW5lIEFWSVZPX0QxQ1JUQ19GUkFNRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MGE0CiAjZGVmaW5lIEFWSVZPX0QxQ1JUQ19TVEVSRU9fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MGM0CiAKKyNkZWZpbmUgQVZJVk9fRDFNT0RFX01BU1RFUl9VUERBVEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDYwZTQKKwogLyogbWFzdGVyIGNvbnRyb2xzICovCiAjZGVmaW5lIEFWSVZPX0RDX0NSVENfTUFTVEVSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MGY4CiAjZGVmaW5lIEFWSVZPX0RDX0NSVENfVFZfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MGZjCkBAIC00MDksOCArNDExLDEwIEBACiAjZGVmaW5lIEFWSVZPX0QxR1JQSF9YX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MTM0CiAjZGVmaW5lIEFWSVZPX0QxR1JQSF9ZX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MTM4CiAjZGVmaW5lIEFWSVZPX0QxR1JQSF9VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MTQ0CisjICAgICAgIGRlZmluZSBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORyAgICAgICAgICAgICAgKDEgPDwgMikKICMgICAgICAgZGVmaW5lIEFWSVZPX0QxR1JQSF9VUERBVEVfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNikKICNkZWZpbmUgQVZJVk9fRDFHUlBIX0ZMSVBfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxNDgKKyMgICAgICAgZGVmaW5lIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9IX1JFVFJBQ0VfRU4gICAgICAgICAoMSA8PCAwKQogCiAjZGVmaW5lIEFWSVZPX0QxQ1VSX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAweDY0MDAKICMgICAgICAgZGVmaW5lIEFWSVZPX0QxQ1VSU09SX0VOICAgICAgICAgICAgICAgICgxIDw8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCmluZGV4IDljOTJkYjcuLjZiNTA3MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCkBAIC04Myw2ICs4Myw5IEBACiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9DWVBSRVNTX3BmcC5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NZUFJFU1NfbWUuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9DWVBSRVNTX3JsYy5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1BBTE1fcGZwLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUEFMTV9tZS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1NVTU9fcmxjLmJpbiIpOwogCiBpbnQgcjYwMF9kZWJ1Z2ZzX21jX2luZm9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKQEAgLTkxLDYgKzk0LDcgQEAKIHZvaWQgcjYwMF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHI2MDBfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHI2MDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworc3RhdGljIHZvaWQgcjYwMF9wY2llX2dlbjJfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyogZ2V0IHRlbXBlcmF0dXJlIGluIG1pbGxpZGVncmVlcyAqLwogdTMyIHJ2Nnh4X2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtMTE2NCw3ICsxMTY4LDcgQEAKICAqIE5vdGU6IEdUVCBzdGFydCwgZW5kLCBzaXplIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyB0aGlzCiAgKiBmdW5jdGlvbiBvbiBBR1AgcGxhdGZvcm0uCiAgKi8KLXZvaWQgcjYwMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpCitzdGF0aWMgdm9pZCByNjAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX21jICptYykKIHsKIAl1NjQgc2l6ZV9iZiwgc2l6ZV9hZjsKIApAQCAtMjAwOSw2ICsyMDEzLDEwIEBACiAJCWNoaXBfbmFtZSA9ICJDWVBSRVNTIjsKIAkJcmxjX2NoaXBfbmFtZSA9ICJDWVBSRVNTIjsKIAkJYnJlYWs7CisJY2FzZSBDSElQX1BBTE06CisJCWNoaXBfbmFtZSA9ICJQQUxNIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJTVU1PIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDogQlVHKCk7CiAJfQogCkBAIC0yMzcyLDYgKzIzODAsOSBAQAogewogCWludCByOwogCisJLyogZW5hYmxlIHBjaWUgZ2VuMiBsaW5rICovCisJcjYwMF9wY2llX2dlbjJfZW5hYmxlKHJkZXYpOworCiAJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncpIHsKIAkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CiAJCWlmIChyKSB7CkBAIC0yODc0LDYgKzI4ODUsOCBAQAogCVdSRUczMihDUF9JTlRfQ05UTCwgQ05UWF9CVVNZX0lOVF9FTkFCTEUgfCBDTlRYX0VNUFRZX0lOVF9FTkFCTEUpOwogCVdSRUczMihHUkJNX0lOVF9DTlRMLCAwKTsKIAlXUkVHMzIoRHhNT0RFX0lOVF9NQVNLLCAwKTsKKwlXUkVHMzIoRDFHUlBIX0lOVEVSUlVQVF9DT05UUk9MLCAwKTsKKwlXUkVHMzIoRDJHUlBIX0lOVEVSUlVQVF9DT05UUk9MLCAwKTsKIAlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CiAJCVdSRUczMihEQ0UzX0RBQ0FfQVVUT0RFVEVDVF9JTlRfQ09OVFJPTCwgMCk7CiAJCVdSRUczMihEQ0UzX0RBQ0JfQVVUT0RFVEVDVF9JTlRfQ09OVFJPTCwgMCk7CkBAIC0yOTk4LDYgKzMwMTEsNyBAQAogCXUzMiBocGQxLCBocGQyLCBocGQzLCBocGQ0ID0gMCwgaHBkNSA9IDAsIGhwZDYgPSAwOwogCXUzMiBncmJtX2ludF9jbnRsID0gMDsKIAl1MzIgaGRtaTEsIGhkbWkyOworCXUzMiBkMWdycGggPSAwLCBkMmdycGggPSAwOwogCiAJaWYgKCFyZGV2LT5pcnEuaW5zdGFsbGVkKSB7CiAJCVdBUk4oMSwgIkNhbid0IGVuYWJsZSBJUlEvTVNJIGJlY2F1c2Ugbm8gaGFuZGxlciBpcyBpbnN0YWxsZWRcbiIpOwpAQCAtMzAzNCwxMSArMzA0OCwxMyBAQAogCQljcF9pbnRfY250bCB8PSBSQl9JTlRfRU5BQkxFOwogCQljcF9pbnRfY250bCB8PSBUSU1FX1NUQU1QX0lOVF9FTkFCTEU7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzBdKSB7CiAJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiB2YmxhbmsgMFxuIik7CiAJCW1vZGVfaW50IHw9IEQxTU9ERV9WQkxBTktfSU5UX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzFdKSB7CiAJCURSTV9ERUJVRygicjYwMF9pcnFfc2V0OiB2YmxhbmsgMVxuIik7CiAJCW1vZGVfaW50IHw9IEQyTU9ERV9WQkxBTktfSU5UX01BU0s7CiAJfQpAQCAtMzA4MSw2ICszMDk3LDggQEAKIAogCVdSRUczMihDUF9JTlRfQ05UTCwgY3BfaW50X2NudGwpOwogCVdSRUczMihEeE1PREVfSU5UX01BU0ssIG1vZGVfaW50KTsKKwlXUkVHMzIoRDFHUlBIX0lOVEVSUlVQVF9DT05UUk9MLCBkMWdycGgpOworCVdSRUczMihEMkdSUEhfSU5URVJSVVBUX0NPTlRST0wsIGQyZ3JwaCk7CiAJV1JFRzMyKEdSQk1fSU5UX0NOVEwsIGdyYm1faW50X2NudGwpOwogCVdSRUczMihSNjAwX0hETUlfQkxPQ0sxICsgUjYwMF9IRE1JX0NOVEwsIGhkbWkxKTsKIAlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CkBAIC0zMTAzLDMyICszMTIxLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByNjAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJdTMyICpkaXNwX2ludCwKLQkJCQl1MzIgKmRpc3BfaW50X2NvbnQsCi0JCQkJdTMyICpkaXNwX2ludF9jb250MikKK3N0YXRpYyBpbmxpbmUgdm9pZCByNjAwX2lycV9hY2soc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKIAogCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKLQkJKmRpc3BfaW50ID0gUlJFRzMyKERDRTNfRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKLQkJKmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUpOwotCQkqZGlzcF9pbnRfY29udDIgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ID0gUlJFRzMyKERDRTNfRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udDIgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKIAl9IGVsc2UgewotCQkqZGlzcF9pbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKLQkJKmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFKTsKLQkJKmRpc3BfaW50X2NvbnQyID0gMDsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVUyk7CisJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRSk7CisJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250MiA9IDA7CiAJfQorCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kMWdycGhfaW50ID0gUlJFRzMyKEQxR1JQSF9JTlRFUlJVUFRfU1RBVFVTKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZDJncnBoX2ludCA9IFJSRUczMihEMkdSUEhfSU5URVJSVVBUX1NUQVRVUyk7CiAKLQlpZiAoKmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmQxZ3JwaF9pbnQgJiBEeEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQlXUkVHMzIoRDFHUlBIX0lOVEVSUlVQVF9TVEFUVVMsIER4R1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZDJncnBoX2ludCAmIER4R1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihEMkdSUEhfSU5URVJSVVBUX1NUQVRVUywgRHhHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpCiAJCVdSRUczMihEMU1PREVfVkJMQU5LX1NUQVRVUywgRHhNT0RFX1ZCTEFOS19BQ0spOwotCWlmICgqZGlzcF9pbnQgJiBMQl9EMV9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKEQxTU9ERV9WTElORV9TVEFUVVMsIER4TU9ERV9WTElORV9BQ0spOwotCWlmICgqZGlzcF9pbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQogCQlXUkVHMzIoRDJNT0RFX1ZCTEFOS19TVEFUVVMsIER4TU9ERV9WQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50ICYgTEJfRDJfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihEMk1PREVfVkxJTkVfU1RBVFVTLCBEeE1PREVfVkxJTkVfQUNLKTsKLQlpZiAoKmRpc3BfaW50ICYgRENfSFBEMV9JTlRFUlJVUFQpIHsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgRENfSFBEMV9JTlRFUlJVUFQpIHsKIAkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewogCQkJdG1wID0gUlJFRzMyKERDX0hQRDFfSU5UX0NPTlRST0wpOwogCQkJdG1wIHw9IERDX0hQRHhfSU5UX0FDSzsKQEAgLTMxMzksNyArMzE2MCw3IEBACiAJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQogCX0KLQlpZiAoKmRpc3BfaW50ICYgRENfSFBEMl9JTlRFUlJVUFQpIHsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgRENfSFBEMl9JTlRFUlJVUFQpIHsKIAkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewogCQkJdG1wID0gUlJFRzMyKERDX0hQRDJfSU5UX0NPTlRST0wpOwogCQkJdG1wIHw9IERDX0hQRHhfSU5UX0FDSzsKQEAgLTMxNTAsNyArMzE3MSw3IEBACiAJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQogCX0KLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udCAmIERDX0hQRDNfSU5URVJSVVBUKSB7CiAJCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKIAkJCXRtcCA9IFJSRUczMihEQ19IUEQzX0lOVF9DT05UUk9MKTsKIAkJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CkBAIC0zMTYxLDE4ICszMTgyLDE4IEBACiAJCQlXUkVHMzIoRENfSE9UX1BMVUdfREVURUNUM19JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQogCX0KLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBEQ19IUEQ0X0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udCAmIERDX0hQRDRfSU5URVJSVVBUKSB7CiAJCXRtcCA9IFJSRUczMihEQ19IUEQ0X0lOVF9DT05UUk9MKTsKIAkJdG1wIHw9IERDX0hQRHhfSU5UX0FDSzsKIAkJV1JFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wsIHRtcCk7CiAJfQogCWlmIChBU0lDX0lTX0RDRTMyKHJkZXYpKSB7Ci0JCWlmICgqZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICYgRENfSFBENV9JTlRFUlJVUFQpIHsKIAkJCXRtcCA9IFJSRUczMihEQ19IUEQ1X0lOVF9DT05UUk9MKTsKIAkJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CiAJCQlXUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQotCQlpZiAoKmRpc3BfaW50X2NvbnQyICYgRENfSFBENl9JTlRFUlJVUFQpIHsKKwkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250MiAmIERDX0hQRDZfSU5URVJSVVBUKSB7CiAJCQl0bXAgPSBSUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCk7CiAJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQkJV1JFRzMyKERDX0hQRDZfSU5UX0NPTlRST0wsIHRtcCk7CkBAIC0zMTk0LDEyICszMjE1LDEwIEBACiAKIHZvaWQgcjYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1MzIgZGlzcF9pbnQsIGRpc3BfaW50X2NvbnQsIGRpc3BfaW50X2NvbnQyOwotCiAJcjYwMF9kaXNhYmxlX2ludGVycnVwdHMocmRldik7CiAJLyogV2FpdCBhbmQgYWNrbm93bGVkZ2UgaXJxICovCiAJbWRlbGF5KDEpOwotCXI2MDBfaXJxX2FjayhyZGV2LCAmZGlzcF9pbnQsICZkaXNwX2ludF9jb250LCAmZGlzcF9pbnRfY29udDIpOworCXI2MDBfaXJxX2FjayhyZGV2KTsKIAlyNjAwX2Rpc2FibGVfaW50ZXJydXB0X3N0YXRlKHJkZXYpOwogfQogCkBAIC0zMjYyLDcgKzMyODEsNyBAQAogCXUzMiB3cHRyID0gcjYwMF9nZXRfaWhfd3B0cihyZGV2KTsKIAl1MzIgcnB0ciA9IHJkZXYtPmloLnJwdHI7CiAJdTMyIHNyY19pZCwgc3JjX2RhdGE7Ci0JdTMyIHJpbmdfaW5kZXgsIGRpc3BfaW50LCBkaXNwX2ludF9jb250LCBkaXNwX2ludF9jb250MjsKKwl1MzIgcmluZ19pbmRleDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcXVldWVfaG90cGx1ZyA9IGZhbHNlOwogCkBAIC0zMjgzLDcgKzMzMDIsNyBAQAogCiByZXN0YXJ0X2loOgogCS8qIGRpc3BsYXkgaW50ZXJydXB0cyAqLwotCXI2MDBfaXJxX2FjayhyZGV2LCAmZGlzcF9pbnQsICZkaXNwX2ludF9jb250LCAmZGlzcF9pbnRfY29udDIpOworCXI2MDBfaXJxX2FjayhyZGV2KTsKIAogCXJkZXYtPmloLndwdHIgPSB3cHRyOwogCXdoaWxlIChycHRyICE9IHdwdHIpIHsKQEAgLTMyOTYsMTcgKzMzMTUsMjEgQEAKIAkJY2FzZSAxOiAvKiBEMSB2YmxhbmsvdmxpbmUgKi8KIAkJCXN3aXRjaCAoc3JjX2RhdGEpIHsKIAkJCWNhc2UgMDogLyogRDEgdmJsYW5rICovCi0JCQkJaWYgKGRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkgewotCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAwKTsKLQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKLQkJCQkJZGlzcF9pbnQgJj0gfkxCX0QxX1ZCTEFOS19JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFswXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJj0gfkxCX0QxX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBEMSB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludCAmPSB+TEJfRDFfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBMQl9EMV9WTElORV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZsaW5lXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0zMzE4LDE3ICszMzQxLDIxIEBACiAJCWNhc2UgNTogLyogRDIgdmJsYW5rL3ZsaW5lICovCiAJCQlzd2l0Y2ggKHNyY19kYXRhKSB7CiAJCQljYXNlIDA6IC8qIEQyIHZibGFuayAqLwotCQkJCWlmIChkaXNwX2ludCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKLQkJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7Ci0JCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKLQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMl9WQkxBTktfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbMV0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAxKTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICY9IH5MQl9EMl9WQkxBTktfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2YmxhbmtcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgMTogLyogRDEgdmxpbmUgKi8KLQkJCQlpZiAoZGlzcF9pbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnQgJj0gfkxCX0QyX1ZMSU5FX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgTEJfRDJfVkxJTkVfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmPSB+TEJfRDJfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMzM0MCw0MyArMzM2Nyw0MyBAQAogCQljYXNlIDE5OiAvKiBIUEQvREFDIGhvdHBsdWcgKi8KIAkJCXN3aXRjaCAoc3JjX2RhdGEpIHsKIAkJCWNhc2UgMDoKLQkJCQlpZiAoZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludCAmPSB+RENfSFBEMV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmPSB+RENfSFBEMV9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQxXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6Ci0JCQkJaWYgKGRpc3BfaW50ICYgRENfSFBEMl9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnQgJj0gfkRDX0hQRDJfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJj0gfkRDX0hQRDJfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBEMlxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSA0OgotCQkJCWlmIChkaXNwX2ludF9jb250ICYgRENfSFBEM19JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnRfY29udCAmPSB+RENfSFBEM19JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250ICYgRENfSFBEM19JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgJj0gfkRDX0hQRDNfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBEM1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSA1OgotCQkJCWlmIChkaXNwX2ludF9jb250ICYgRENfSFBENF9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnRfY29udCAmPSB+RENfSFBENF9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250ICYgRENfSFBENF9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgJj0gfkRDX0hQRDRfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBENFxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxMDoKLQkJCQlpZiAoZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250MiAmPSB+RENfSFBENV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250MiAmIERDX0hQRDVfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250MiAmPSB+RENfSFBENV9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQ1XG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDEyOgotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIERDX0hQRDZfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQ2X0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICYgRENfSFBENl9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQ2X0lOVEVSUlVQVDsKIAkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQkJCURSTV9ERUJVRygiSUg6IEhQRDZcbiIpOwogCQkJCX0KQEAgLTM0MTksNyArMzQ0Niw3IEBACiAJaWYgKHdwdHIgIT0gcmRldi0+aWgud3B0cikKIAkJZ290byByZXN0YXJ0X2loOwogCWlmIChxdWV1ZV9ob3RwbHVnKQotCQlxdWV1ZV93b3JrKHJkZXYtPndxLCAmcmRldi0+aG90cGx1Z193b3JrKTsKKwkJc2NoZWR1bGVfd29yaygmcmRldi0+aG90cGx1Z193b3JrKTsKIAlyZGV2LT5paC5ycHRyID0gcnB0cjsKIAlXUkVHMzIoSUhfUkJfUlBUUiwgcmRldi0+aWgucnB0cik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aWgubG9jaywgZmxhZ3MpOwpAQCAtMzUwOCwzICszNTM1LDIxOSBAQAogCX0gZWxzZQogCQlXUkVHMzIoUl8wMDU0ODBfSERQX01FTV9DT0hFUkVOQ1lfRkxVU0hfQ05UTCwgMHgxKTsKIH0KKwordm9pZCByNjAwX3NldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgbGFuZXMpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bCwgbWFzaywgdGFyZ2V0X3JlZzsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpKQorCQlyZXR1cm47CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm47CisKKwkvKiBGSVhNRSB3YWl0IGZvciBpZGxlICovCisKKwlzd2l0Y2ggKGxhbmVzKSB7CisJY2FzZSAwOgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YNDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YODsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJbWFzayA9IFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDEyOworCQlicmVhazsKKwljYXNlIDE2OgorCWRlZmF1bHQ6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gxNjsKKwkJYnJlYWs7CisJfQorCisJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCisJaWYgKChsaW5rX3dpZHRoX2NudGwgJiBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1JEX01BU0spID09CisJICAgIChtYXNrIDw8IFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfUkRfU0hJRlQpKQorCQlyZXR1cm47CisKKwlpZiAobGlua193aWR0aF9jbnRsICYgUjYwMF9QQ0lFX0xDX1VQQ09ORklHVVJFX0RJUykKKwkJcmV0dXJuOworCisJbGlua193aWR0aF9jbnRsICY9IH4oUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9NQVNLIHwKKwkJCSAgICAgUkFERU9OX1BDSUVfTENfUkVDT05GSUdfTk9XIHwKKwkJCSAgICAgUjYwMF9QQ0lFX0xDX1JFTkVHT1RJQVRFX0VOIHwKKwkJCSAgICAgUjYwMF9QQ0lFX0xDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRSk7CisJbGlua193aWR0aF9jbnRsIHw9IG1hc2s7CisKKwlXUkVHMzJfUENJRV9QKFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKworICAgICAgICAvKiBzb21lIG5vcnRoYnJpZGdlcyBjYW4gcmVuZWdvdGlhdGUgdGhlIGxpbmsgcmF0aGVyIHRoYW4gcmVxdWlyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgKiBhIGNvbXBsZXRlIHJlLWNvbmZpZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgKiBlLmcuLCBBTUQgNzgwLzc5MCBub3J0aGJyaWRnZXMgKHBjaSBpZHM6IDB4NTk1NiwgMHg1OTU3LCAweDU5NTgsIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxpbmtfd2lkdGhfY250bCAmIFI2MDBfUENJRV9MQ19SRU5FR09USUFUSU9OX1NVUFBPUlQpCisJCWxpbmtfd2lkdGhfY250bCB8PSBSNjAwX1BDSUVfTENfUkVORUdPVElBVEVfRU4gfCBSNjAwX1BDSUVfTENfVVBDT05GSUdVUkVfU1VQUE9SVDsKKyAgICAgICAgZWxzZQorCQlsaW5rX3dpZHRoX2NudGwgfD0gUjYwMF9QQ0lFX0xDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRTsKKworCVdSRUczMl9QQ0lFX1AoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMLCAobGlua193aWR0aF9jbnRsIHwKKwkJCQkJCSAgICAgICBSQURFT05fUENJRV9MQ19SRUNPTkZJR19OT1cpKTsKKworICAgICAgICBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCisJCXRhcmdldF9yZWcgPSBSNzAwX1RBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVYOworICAgICAgICBlbHNlCisJCXRhcmdldF9yZWcgPSBSNjAwX1RBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVYOworCisgICAgICAgIC8qIHdhaXQgZm9yIGxhbmUgc2V0IHRvIGNvbXBsZXRlICovCisgICAgICAgIGxpbmtfd2lkdGhfY250bCA9IFJSRUczMih0YXJnZXRfcmVnKTsKKyAgICAgICAgd2hpbGUgKGxpbmtfd2lkdGhfY250bCA9PSAweGZmZmZmZmZmKQorCQlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzIodGFyZ2V0X3JlZyk7CisKK30KKworaW50IHI2MDBfZ2V0X3BjaWVfbGFuZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bDsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybiAwOworCisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkpCisJCXJldHVybiAwOworCisJLyogeDIgY2FyZHMgaGF2ZSBhIHNwZWNpYWwgc2VxdWVuY2UgKi8KKwlpZiAoQVNJQ19JU19YMihyZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRSB3YWl0IGZvciBpZGxlICovCisKKwlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisKKwlzd2l0Y2ggKChsaW5rX3dpZHRoX2NudGwgJiBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1JEX01BU0spID4+IFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfUkRfU0hJRlQpIHsKKwljYXNlIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDA6CisJCXJldHVybiAwOworCWNhc2UgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMToKKwkJcmV0dXJuIDE7CisJY2FzZSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gyOgorCQlyZXR1cm4gMjsKKwljYXNlIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDQ6CisJCXJldHVybiA0OworCWNhc2UgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YODoKKwkJcmV0dXJuIDg7CisJY2FzZSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gxNjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTY7CisJfQorfQorCitzdGF0aWMgdm9pZCByNjAwX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bCwgbGFuZXMsIHNwZWVkX2NudGwsIHRyYWluaW5nX2NudGwsIHRtcDsKKwl1MTYgbGlua19jbnRsMjsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpKQorCQlyZXR1cm47CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm47CisKKwkvKiBvbmx5IFJWNnh4KyBjaGlwcyBhcmUgc3VwcG9ydGVkICovCisJaWYgKHJkZXYtPmZhbWlseSA8PSBDSElQX1I2MDApCisJCXJldHVybjsKKworCS8qIDU1IG5tIHI2eHggYXNpY3MgKi8KKwlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjcwKSB8fAorCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfUlY2MjApIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYzNSkpIHsKKwkJLyogYWR2ZXJ0aXNlIHVwY29uZmlnIGNhcGFiaWxpdHkgKi8KKwkJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJCWxpbmtfd2lkdGhfY250bCAmPSB+TENfVVBDT05GSUdVUkVfRElTOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCQlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKwkJaWYgKGxpbmtfd2lkdGhfY250bCAmIExDX1JFTkVHT1RJQVRJT05fU1VQUE9SVCkgeworCQkJbGFuZXMgPSAobGlua193aWR0aF9jbnRsICYgTENfTElOS19XSURUSF9SRF9NQVNLKSA+PiBMQ19MSU5LX1dJRFRIX1JEX1NISUZUOworCQkJbGlua193aWR0aF9jbnRsICY9IH4oTENfTElOS19XSURUSF9NQVNLIHwKKwkJCQkJICAgICBMQ19SRUNPTkZJR19BUkNfTUlTU0lOR19FU0NBUEUpOworCQkJbGlua193aWR0aF9jbnRsIHw9IGxhbmVzIHwgTENfUkVDT05GSUdfTk9XIHwgTENfUkVORUdPVElBVEVfRU47CisJCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCQl9IGVsc2UgeworCQkJbGlua193aWR0aF9jbnRsIHw9IExDX1VQQ09ORklHVVJFX0RJUzsKKwkJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJCX0KKwl9CisKKwlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCWlmICgoc3BlZWRfY250bCAmIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIpICYmCisJICAgIChzcGVlZF9jbnRsICYgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yKSkgeworCisJCS8qIDU1IG5tIHI2eHggYXNpY3MgKi8KKwkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjY3MCkgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYyMCkgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYzNSkpIHsKKwkJCVdSRUczMihNTV9DRkdSRUdTX0NOVEwsIDB4OCk7CisJCQlsaW5rX2NudGwyID0gUlJFRzMyKDB4NDA4OCk7CisJCQlXUkVHMzIoTU1fQ0ZHUkVHU19DTlRMLCAwKTsKKwkJCS8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCisJCQlpZiAobGlua19jbnRsMiAmIFNFTEVDVEFCTEVfREVFTVBIQVNJUykKKwkJCQlyZXR1cm47CisJCX0KKworCQlzcGVlZF9jbnRsICY9IH5MQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9NQVNLOworCQlzcGVlZF9jbnRsIHw9ICgweDMgPDwgTENfU1BFRURfQ0hBTkdFX0FUVEVNUFRTX0FMTE9XRURfU0hJRlQpOworCQlzcGVlZF9jbnRsICY9IH5MQ19WT0xUQUdFX1RJTUVSX1NFTF9NQVNLOworCQlzcGVlZF9jbnRsICY9IH5MQ19GT1JDRV9ESVNfSFdfU1BFRURfQ0hBTkdFOworCQlzcGVlZF9jbnRsIHw9IExDX0ZPUkNFX0VOX0hXX1NQRUVEX0NIQU5HRTsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXRtcCA9IFJSRUczMigweDU0MWMpOworCQlXUkVHMzIoMHg1NDFjLCB0bXAgfCAweDgpOworCQlXUkVHMzIoTU1fQ0ZHUkVHU19DTlRMLCBNTV9XUl9UT19DRkdfRU4pOworCQlsaW5rX2NudGwyID0gUlJFRzE2KDB4NDA4OCk7CisJCWxpbmtfY250bDIgJj0gflRBUkdFVF9MSU5LX1NQRUVEX01BU0s7CisJCWxpbmtfY250bDIgfD0gMHgyOworCQlXUkVHMTYoMHg0MDg4LCBsaW5rX2NudGwyKTsKKwkJV1JFRzMyKE1NX0NGR1JFR1NfQ05UTCwgMCk7CisKKwkJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjY3MCkgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYyMCkgfHwKKwkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYzNSkpIHsKKwkJCXRyYWluaW5nX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfVFJBSU5JTkdfQ05UTCk7CisJCQl0cmFpbmluZ19jbnRsICY9IH5MQ19QT0lOVF83X1BMVVNfRU47CisJCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfVFJBSU5JTkdfQ05UTCwgdHJhaW5pbmdfY250bCk7CisJCX0gZWxzZSB7CisJCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQkJc3BlZWRfY250bCAmPSB+TENfVEFSR0VUX0xJTktfU1BFRURfT1ZFUlJJREVfRU47CisJCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisJCX0KKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsIHw9IExDX0dFTjJfRU5fU1RSQVA7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCX0gZWxzZSB7CisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQkvKiBYWFg6IG9ubHkgZGlzYWJsZSBpdCBpZiBnZW4xIGJyaWRnZSB2ZW5kb3IgPT0gMHgxMTFkIG9yIDB4MTEwNiAqLworCQlpZiAoMSkKKwkJCWxpbmtfd2lkdGhfY250bCB8PSBMQ19VUENPTkZJR1VSRV9ESVM7CisJCWVsc2UKKwkJCWxpbmtfd2lkdGhfY250bCAmPSB+TENfVVBDT05GSUdVUkVfRElTOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAppbmRleCBiZmY0ZGM0Li5hNWQ4OThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCkBAIC03MjgsNiArNzI4LDU0IEBACiAvKiBEQ0UgMy4yICovCiAjICAgICAgIGRlZmluZSBEQ19IUER4X0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpCiAKKyNkZWZpbmUgRDFHUlBIX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxNTgKKyNkZWZpbmUgRDJHUlBIX0lOVEVSUlVQVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY5NTgKKyMgICAgICAgZGVmaW5lIER4R1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgRHhHUlBIX1BGTElQX0lOVF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEQxR1JQSF9JTlRFUlJVUFRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MTVjCisjZGVmaW5lIEQyR1JQSF9JTlRFUlJVUFRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2OTVjCisjICAgICAgIGRlZmluZSBEeEdSUEhfUEZMSVBfSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIER4R1JQSF9QRkxJUF9JTlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorCisvKiBQQ0lFIGxpbmsgc3R1ZmYgKi8KKyNkZWZpbmUgUENJRV9MQ19UUkFJTklOR19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGExIC8qIFBDSUVfUCAqLworIyAgICAgICBkZWZpbmUgTENfUE9JTlRfN19QTFVTX0VOICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFBDSUVfTENfTElOS19XSURUSF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMiAvKiBQQ0lFX1AgKi8KKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHg3CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gwICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDIgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDE2ICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1JEX1NISUZUICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9SRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NzAKKyMgICAgICAgZGVmaW5lIExDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRSAgICAgICAgICAgICAoMSA8PCA3KQorIyAgICAgICBkZWZpbmUgTENfUkVDT05GSUdfTk9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjICAgICAgIGRlZmluZSBMQ19SRU5FR09USUFUSU9OX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyMgICAgICAgZGVmaW5lIExDX1JFTkVHT1RJQVRFX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyMgICAgICAgZGVmaW5lIExDX1NIT1JUX1JFQ09ORklHX0VOICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIExDX1VQQ09ORklHVVJFX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIExDX1VQQ09ORklHVVJFX0RJUyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgUENJRV9MQ19TUEVFRF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGE0IC8qIFBDSUVfUCAqLworIyAgICAgICBkZWZpbmUgTENfR0VOMl9FTl9TVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBMQ19UQVJHRVRfTElOS19TUEVFRF9PVkVSUklERV9FTiAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIExDX0ZPUkNFX0VOX0hXX1NQRUVEX0NIQU5HRSAgICAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgTENfRk9SQ0VfRElTX0hXX1NQRUVEX0NIQU5HRSAgICAgICAgICAgICAgICgxIDw8IDYpCisjICAgICAgIGRlZmluZSBMQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9NQVNLICAgICAgKDB4MyA8PCA4KQorIyAgICAgICBkZWZpbmUgTENfU1BFRURfQ0hBTkdFX0FUVEVNUFRTX0FMTE9XRURfU0hJRlQgICAgIDMKKyMgICAgICAgZGVmaW5lIExDX0NVUlJFTlRfREFUQV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIExDX1ZPTFRBR0VfVElNRVJfU0VMX01BU0sgICAgICAgICAgICAgICAgICAoMHhmIDw8IDE0KQorIyAgICAgICBkZWZpbmUgTENfQ0xSX0ZBSUxFRF9TUERfQ0hBTkdFX0NOVCAgICAgICAgICAgICAgICgxIDw8IDIxKQorIyAgICAgICBkZWZpbmUgTENfT1RIRVJfU0lERV9FVkVSX1NFTlRfR0VOMiAgICAgICAgICAgICAgICgxIDw8IDIzKQorIyAgICAgICBkZWZpbmUgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yICAgICAgICAgICAgICAgICgxIDw8IDI0KQorI2RlZmluZSBNTV9DRkdSRUdTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQ0YworIyAgICAgICBkZWZpbmUgTU1fV1JfVE9fQ0ZHX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIExJTktfQ05UTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OCAvKiBGMCAqLworIyAgICAgICBkZWZpbmUgVEFSR0VUX0xJTktfU1BFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweGYgPDwgMCkKKyMgICAgICAgZGVmaW5lIFNFTEVDVEFCTEVfREVFTVBIQVNJUyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorCiAvKgogICogUE00CiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCmluZGV4IDNhNzA5NTcuLmU5NDg2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaApAQCAtNjksNiArNjksNyBAQAogI2luY2x1ZGUgPHR0bS90dG1fYm9fZHJpdmVyLmg+CiAjaW5jbHVkZSA8dHRtL3R0bV9wbGFjZW1lbnQuaD4KICNpbmNsdWRlIDx0dG0vdHRtX21vZHVsZS5oPgorI2luY2x1ZGUgPHR0bS90dG1fZXhlY2J1Zl91dGlsLmg+CiAKICNpbmNsdWRlICJyYWRlb25fZmFtaWx5LmgiCiAjaW5jbHVkZSAicmFkZW9uX21vZGUuaCIKQEAgLTE4MCw2ICsxODEsNyBAQAogZXh0ZXJuIHUzMiBydjZ4eF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdTMyIHJ2NzcwX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB1MzIgZXZlcmdyZWVuX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB1MzIgc3Vtb19nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiBGZW5jZXMuCkBAIC0yNTksMTMgKzI2MSwxMiBAQAogfTsKIAogc3RydWN0IHJhZGVvbl9ib19saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgdHY7CiAJc3RydWN0IHJhZGVvbl9ibwkqYm87CiAJdWludDY0X3QJCWdwdV9vZmZzZXQ7CiAJdW5zaWduZWQJCXJkb21haW47CiAJdW5zaWduZWQJCXdkb21haW47CiAJdTMyCQkJdGlsaW5nX2ZsYWdzOwotCWJvb2wJCQlyZXNlcnZlZDsKIH07CiAKIC8qCkBAIC0zNzcsMTEgKzM3OCw1NiBAQAogLyoKICAqIElSUVMuCiAgKi8KKworc3RydWN0IHJhZGVvbl91bnBpbl93b3JrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldjsKKwlpbnQgY3J0Y19pZDsKKwlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpmZW5jZTsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpvbGRfcmJvOworCXU2NCBuZXdfY3J0Y19iYXNlOworfTsKKworc3RydWN0IHI1MDBfaXJxX3N0YXRfcmVncyB7CisJdTMyIGRpc3BfaW50OworfTsKKworc3RydWN0IHI2MDBfaXJxX3N0YXRfcmVncyB7CisJdTMyIGRpc3BfaW50OworCXUzMiBkaXNwX2ludF9jb250OworCXUzMiBkaXNwX2ludF9jb250MjsKKwl1MzIgZDFncnBoX2ludDsKKwl1MzIgZDJncnBoX2ludDsKK307CisKK3N0cnVjdCBldmVyZ3JlZW5faXJxX3N0YXRfcmVncyB7CisJdTMyIGRpc3BfaW50OworCXUzMiBkaXNwX2ludF9jb250OworCXUzMiBkaXNwX2ludF9jb250MjsKKwl1MzIgZGlzcF9pbnRfY29udDM7CisJdTMyIGRpc3BfaW50X2NvbnQ0OworCXUzMiBkaXNwX2ludF9jb250NTsKKwl1MzIgZDFncnBoX2ludDsKKwl1MzIgZDJncnBoX2ludDsKKwl1MzIgZDNncnBoX2ludDsKKwl1MzIgZDRncnBoX2ludDsKKwl1MzIgZDVncnBoX2ludDsKKwl1MzIgZDZncnBoX2ludDsKK307CisKK3VuaW9uIHJhZGVvbl9pcnFfc3RhdF9yZWdzIHsKKwlzdHJ1Y3QgcjUwMF9pcnFfc3RhdF9yZWdzIHI1MDA7CisJc3RydWN0IHI2MDBfaXJxX3N0YXRfcmVncyByNjAwOworCXN0cnVjdCBldmVyZ3JlZW5faXJxX3N0YXRfcmVncyBldmVyZ3JlZW47Cit9OworCiBzdHJ1Y3QgcmFkZW9uX2lycSB7CiAJYm9vbAkJaW5zdGFsbGVkOwogCWJvb2wJCXN3X2ludDsKIAkvKiBGSVhNRTogdXNlIGEgZGVmaW5lIG1heCBjcnRjIHJhdGhlciB0aGFuIGhhcmRjb2RlIGl0ICovCiAJYm9vbAkJY3J0Y192YmxhbmtfaW50WzZdOworCWJvb2wJCXBmbGlwWzZdOwogCXdhaXRfcXVldWVfaGVhZF90CXZibGFua19xdWV1ZTsKIAkvKiBGSVhNRTogdXNlIGRlZmluZXMgZm9yIG1heCBocGQvZGFjcyAqLwogCWJvb2wgICAgICAgICAgICBocGRbNl07CkBAIC0zOTIsMTIgKzQzOCwxNyBAQAogCWJvb2wJCWhkbWlbMl07CiAJc3BpbmxvY2tfdCBzd19sb2NrOwogCWludCBzd19yZWZjb3VudDsKKwl1bmlvbiByYWRlb25faXJxX3N0YXRfcmVncyBzdGF0X3JlZ3M7CisJc3BpbmxvY2tfdCBwZmxpcF9sb2NrWzZdOworCWludCBwZmxpcF9yZWZjb3VudFs2XTsKIH07CiAKIGludCByYWRlb25faXJxX2ttc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2lycV9rbXNfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9pcnFfa21zX3N3X2lycV9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25faXJxX2ttc19zd19pcnFfcHV0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX2dldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwordm9pZCByYWRlb25faXJxX2ttc19wZmxpcF9pcnFfcHV0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiAKIC8qCiAgKiBDUCAmIHJpbmcuCkBAIC02ODcsNiArNzM4LDggQEAKIAlUSEVSTUFMX1RZUEVfUlY2WFgsCiAJVEhFUk1BTF9UWVBFX1JWNzcwLAogCVRIRVJNQUxfVFlQRV9FVkVSR1JFRU4sCisJVEhFUk1BTF9UWVBFX1NVTU8sCisJVEhFUk1BTF9UWVBFX05JLAogfTsKIAogc3RydWN0IHJhZGVvbl92b2x0YWdlIHsKQEAgLTc3MCw2ICs4MjMsOSBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2NsazsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X21jbGs7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgY3VycmVudF92ZGRjOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfc2NsazsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X21jbGs7CisJdTMyICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92ZGRjOwogCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyY19idXM7CiAJLyogc2VsZWN0ZWQgcG0gbWV0aG9kICovCiAJZW51bSByYWRlb25fcG1fbWV0aG9kICAgICBwbV9tZXRob2Q7CkBAIC04ODEsNiArOTM3LDEwIEBACiAJdm9pZCAoKnBtX2ZpbmlzaCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCXZvaWQgKCpwbV9pbml0X3Byb2ZpbGUpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAl2b2lkICgqcG1fZ2V0X2R5bnBtX3N0YXRlKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisJLyogcGFnZWZsaXBwaW5nICovCisJdm9pZCAoKnByZV9wYWdlX2ZsaXApKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CisJdTMyICgqcGFnZV9mbGlwKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOworCXZvaWQgKCpwb3N0X3BhZ2VfZmxpcCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKIH07CiAKIC8qCkBAIC05NzUsNiArMTAzNSw3IEBACiAJdW5zaWduZWQgdGlsaW5nX25waXBlczsKIAl1bnNpZ25lZCB0aWxpbmdfZ3JvdXBfc2l6ZTsKIAl1bnNpZ25lZCB0aWxlX2NvbmZpZzsKKwlzdHJ1Y3QgcjEwMF9ncHVfbG9ja3VwCWxvY2t1cDsKIH07CiAKIHVuaW9uIHJhZGVvbl9hc2ljX2NvbmZpZyB7CkBAIC0xMDkxLDExICsxMTUyLDExIEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICptZV9mdzsJLyogYWxsIGZhbWlseSBNRSBmaXJtd2FyZSAqLwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqcGZwX2Z3OwkvKiByNi83MDAgUEZQIGZpcm13YXJlICovCiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpybGNfZnc7CS8qIHI2LzcwMCBSTEMgZmlybXdhcmUgKi8KKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm1jX2Z3OwkvKiBOSSBNQyBmaXJtd2FyZSAqLwogCXN0cnVjdCByNjAwX2JsaXQgcjYwMF9ibGl0OwogCXN0cnVjdCByNzAwX3ZyYW1fc2NyYXRjaCB2cmFtX3NjcmF0Y2g7CiAJaW50IG1zaV9lbmFibGVkOyAvKiBtc2kgZW5hYmxlZCAqLwogCXN0cnVjdCByNjAwX2loIGloOyAvKiByNi83MDAgaW50ZXJydXB0IHJpbmcgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAJc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKIAlpbnQgbnVtX2NydGM7IC8qIG51bWJlciBvZiBjcnRjcyAqLwogCXN0cnVjdCBtdXRleCBkY19od19pMmNfbXV0ZXg7IC8qIGRpc3BsYXkgY29udHJvbGxlciBodyBpMmMgbXV0ZXggKi8KQEAgLTExMTAsMTAgKzExNzEsMTAgQEAKIAl1aW50OF90CQkJYXVkaW9fc3RhdHVzX2JpdHM7CiAJdWludDhfdAkJCWF1ZGlvX2NhdGVnb3J5X2NvZGU7CiAKLQlib29sIHBvd2VyZWRfZG93bjsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWNwaV9uYjsKLQkvKiBvbmx5IG9uZSB1c2Vyc3BhY2UgY2FuIHVzZSBIeXBlcnogZmVhdHVyZXMgYXQgYSB0aW1lICovCisJLyogb25seSBvbmUgdXNlcnNwYWNlIGNhbiB1c2UgSHlwZXJ6IGZlYXR1cmVzIG9yIENNQVNLIGF0IGEgdGltZSAqLwogCXN0cnVjdCBkcm1fZmlsZSAqaHlwZXJ6X2ZpbHA7CisJc3RydWN0IGRybV9maWxlICpjbWFza19maWxwOwogCS8qIGkyYyBidXNlcyAqLwogCXN0cnVjdCByYWRlb25faTJjX2NoYW4gKmkyY19idXNbUkFERU9OX01BWF9JMkNfQlVTXTsKIH07CkBAIC0xMTg4LDYgKzEyNDksOCBAQAogICovCiAjZGVmaW5lIFJSRUc4KHJlZykgcmVhZGIoKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyAocmVnKSkKICNkZWZpbmUgV1JFRzgocmVnLCB2KSB3cml0ZWIodiwgKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyAocmVnKSkKKyNkZWZpbmUgUlJFRzE2KHJlZykgcmVhZHcoKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyAocmVnKSkKKyNkZWZpbmUgV1JFRzE2KHJlZywgdikgd3JpdGV3KHYsICgodm9pZCBfX2lvbWVtICopcmRldi0+cm1taW8pICsgKHJlZykpCiAjZGVmaW5lIFJSRUczMihyZWcpIHIxMDBfbW1fcnJlZyhyZGV2LCAocmVnKSkKICNkZWZpbmUgRFJFRzMyKHJlZykgcHJpbnRrKEtFUk5fSU5GTyAiUkVHSVNURVI6ICIgI3JlZyAiIDogMHglMDhYXG4iLCByMTAwX21tX3JyZWcocmRldiwgKHJlZykpKQogI2RlZmluZSBXUkVHMzIocmVnLCB2KSByMTAwX21tX3dyZWcocmRldiwgKHJlZyksICh2KSkKQEAgLTEyNjEsNiArMTMyNCwxNCBAQAogCQkocmRldi0+ZmFtaWx5ID09IENISVBfUlY0MTApIHx8CQkJXAogCQkocmRldi0+ZmFtaWx5ID09IENISVBfUlM0MDApIHx8CQkJXAogCQkocmRldi0+ZmFtaWx5ID09IENISVBfUlM0ODApKQorI2RlZmluZSBBU0lDX0lTX1gyKHJkZXYpICgocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTQ0MSkgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTQ0MykgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTQ0QikgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTUwNikgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTUwOSkgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTUwRikgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4Njg5QykgfHwgXAorCQkocmRldi0+ZGRldi0+cGRldi0+ZGV2aWNlID09IDB4Njg5RCkpCiAjZGVmaW5lIEFTSUNfSVNfQVZJVk8ocmRldikgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SUzYwMCkpCiAjZGVmaW5lIEFTSUNfSVNfRENFMihyZGV2KSAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjAwKSAgfHwJXAogCQkJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzY5MCkgIHx8CVwKQEAgLTEyNjksNiArMTM0MCw5IEBACiAjZGVmaW5lIEFTSUNfSVNfRENFMyhyZGV2KSAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNjIwKSkKICNkZWZpbmUgQVNJQ19JU19EQ0UzMihyZGV2KSAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzMwKSkKICNkZWZpbmUgQVNJQ19JU19EQ0U0KHJkZXYpICgocmRldi0+ZmFtaWx5ID49IENISVBfQ0VEQVIpKQorI2RlZmluZSBBU0lDX0lTX0RDRTQxKHJkZXYpICgocmRldi0+ZmFtaWx5ID49IENISVBfUEFMTSkgJiYgXAorCQkJICAgICAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkKKyNkZWZpbmUgQVNJQ19JU19EQ0U1KHJkZXYpICgocmRldi0+ZmFtaWx5ID49IENISVBfQkFSVFMpKQogCiAvKgogICogQklPUyBoZWxwZXJzLgpAQCAtMTM0NCw2ICsxNDE4LDkgQEAKICNkZWZpbmUgcmFkZW9uX3BtX2ZpbmlzaChyZGV2KSAocmRldiktPmFzaWMtPnBtX2ZpbmlzaCgocmRldikpCiAjZGVmaW5lIHJhZGVvbl9wbV9pbml0X3Byb2ZpbGUocmRldikgKHJkZXYpLT5hc2ljLT5wbV9pbml0X3Byb2ZpbGUoKHJkZXYpKQogI2RlZmluZSByYWRlb25fcG1fZ2V0X2R5bnBtX3N0YXRlKHJkZXYpIChyZGV2KS0+YXNpYy0+cG1fZ2V0X2R5bnBtX3N0YXRlKChyZGV2KSkKKyNkZWZpbmUgcmFkZW9uX3ByZV9wYWdlX2ZsaXAocmRldiwgY3J0YykgcmRldi0+YXNpYy0+cHJlX3BhZ2VfZmxpcCgocmRldiksIChjcnRjKSkKKyNkZWZpbmUgcmFkZW9uX3BhZ2VfZmxpcChyZGV2LCBjcnRjLCBiYXNlKSByZGV2LT5hc2ljLT5wYWdlX2ZsaXAoKHJkZXYpLCAoY3J0YyksIChiYXNlKSkKKyNkZWZpbmUgcmFkZW9uX3Bvc3RfcGFnZV9mbGlwKHJkZXYsIGNydGMpIHJkZXYtPmFzaWMtPnBvc3RfcGFnZV9mbGlwKChyZGV2KSwgKGNydGMpKQogCiAvKiBDb21tb24gZnVuY3Rpb25zICovCiAvKiBBR1AgKi8KQEAgLTEzNzIsNjcgKzE0NDksNyBAQAogZXh0ZXJuIGludCByYWRlb25fcmVzdW1lX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcmFkZW9uX3N1c3BlbmRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAKLS8qIHIxMDAscnYxMDAscnMxMDAscnYyMDAscnMyMDAscjIwMCxydjI1MCxyczMwMCxydjI4MCAqLwotZXh0ZXJuIHZvaWQgcjEwMF9ncHVfbG9ja3VwX3VwZGF0ZShzdHJ1Y3QgcjEwMF9ncHVfbG9ja3VwICpsb2NrdXAsIHN0cnVjdCByYWRlb25fY3AgKmNwKTsKLWV4dGVybiBib29sIHIxMDBfZ3B1X2NwX2lzX2xvY2t1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHIxMDBfZ3B1X2xvY2t1cCAqbG9ja3VwLCBzdHJ1Y3QgcmFkZW9uX2NwICpjcCk7Ci0KLS8qIHJ2MjAwLHJ2MjUwLHJ2MjgwICovCi1leHRlcm4gdm9pZCByMjAwX3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0KLS8qIHIzMDAscjM1MCxydjM1MCxydjM3MCxydjM4MCAqLwotZXh0ZXJuIHZvaWQgcjMwMF9zZXRfcmVnX3NhZmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcjMwMF9tY19wcm9ncmFtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHIzMDBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByMzAwX2Nsb2NrX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCByMzAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCBydjM3MF9wY2llX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBydjM3MF9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCi0vKiByNDIwLHI0MjMscnY0MTAgKi8KLWV4dGVybiB1MzIgcjQyMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnKTsKLWV4dGVybiB2b2lkIHI0MjBfbWNfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZywgdTMyIHYpOwotZXh0ZXJuIGludCByNDIwX2RlYnVnZnNfcGlwZXNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHI0MjBfcGlwZXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0KLS8qIHJ2NTE1ICovCi1zdHJ1Y3QgcnY1MTVfbWNfc2F2ZSB7Ci0JdTMyIGQxdmdhX2NvbnRyb2w7Ci0JdTMyIGQydmdhX2NvbnRyb2w7Ci0JdTMyIHZnYV9yZW5kZXJfY29udHJvbDsKLQl1MzIgdmdhX2hkcF9jb250cm9sOwotCXUzMiBkMWNydGNfY29udHJvbDsKLQl1MzIgZDJjcnRjX2NvbnRyb2w7Ci19OwotZXh0ZXJuIHZvaWQgcnY1MTVfYmFuZHdpZHRoX2F2aXZvX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBydjUxNV92Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnY1MTVfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJ2NTE1X21jX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBydjUxNV9tY19zYXZlICpzYXZlKTsKLWV4dGVybiB2b2lkIHJ2NTE1X21jX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJ2NTE1X21jX3NhdmUgKnNhdmUpOwotZXh0ZXJuIHZvaWQgcnY1MTVfY2xvY2tfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBydjUxNV9kZWJ1Z2ZzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiBpbnQgcnY1MTVfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0KLS8qIHJzNDAwICovCi1leHRlcm4gaW50IHJzNDAwX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHJzNDAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJzNDAwX2dhcnRfYWRqdXN0X3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnM0MDBfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJzNDAwX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0KLS8qIHJzNjAwICovCi1leHRlcm4gdm9pZCByczYwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCByczYwMF9pcnFfc2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJzNjAwX2lycV9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogcnM2OTAsIHJzNzQwICovCi1leHRlcm4gdm9pZCByczY5MF9saW5lX2J1ZmZlcl9hZGp1c3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMSwKLQkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUyKTsKLQogLyogcjYwMCwgcnY2MTAsIHJ2NjMwLCBydjYyMCwgcnY2MzUsIHJ2NjcwLCByczc4MCwgcnM4ODAgKi8KLWV4dGVybiB2b2lkIHI2MDBfdnJhbV9ndHRfbG9jYXRpb24oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fbWMgKm1jKTsKIGV4dGVybiBib29sIHI2MDBfY2FyZF9wb3N0ZWQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjYwMF9jcF9zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcjYwMF9jcF9zdGFydChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC0xNDc4LDYgKzE0OTUsNyBAQAogZXh0ZXJuIGludCByNjAwX2hkbWlfYnVmZmVyX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiBleHRlcm4gdm9pZCByNjAwX2hkbWlfdXBkYXRlX2F1ZGlvX3NldHRpbmdzKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7CiAKK2V4dGVybiB2b2lkIHI3MDBfdnJhbV9ndHRfbG9jYXRpb24oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fbWMgKm1jKTsKIGV4dGVybiB2b2lkIHI3MDBfY3Bfc3RvcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByNzAwX2NwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX2Rpc2FibGVfaW50ZXJydXB0X3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE0ODUsNiArMTUwMyw5IEBACiBleHRlcm4gaW50IGV2ZXJncmVlbl9ibGl0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX2JsaXRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKK2V4dGVybiBpbnQgbmlfaW5pdF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCBidGNfbWNfbG9hZF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCiAvKiByYWRlb25fYWNwaS5jICovIAogI2lmIGRlZmluZWQoQ09ORklHX0FDUEkpIAogZXh0ZXJuIGludCByYWRlb25fYWNwaV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsgCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKaW5kZXggNjRmYjg5ZS4uM2ExYjE2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwpAQCAtOTQsNyArOTQsNyBAQAogCQlyZGV2LT5tY19ycmVnID0gJnJzNjAwX21jX3JyZWc7CiAJCXJkZXYtPm1jX3dyZWcgPSAmcnM2MDBfbWNfd3JlZzsKIAl9Ci0JaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKSAmJiAocmRldi0+ZmFtaWx5IDw9IENISVBfUlY3NDApKSB7CisJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SNjAwKSAmJiAocmRldi0+ZmFtaWx5IDw9IENISVBfSEVNTE9DSykpIHsKIAkJcmRldi0+cGNpZXBfcnJlZyA9ICZyNjAwX3BjaWVwX3JyZWc7CiAJCXJkZXYtPnBjaWVwX3dyZWcgPSAmcjYwMF9wY2llcF93cmVnOwogCX0KQEAgLTE3MSw2ICsxNzEsOSBAQAogCS5wbV9maW5pc2ggPSAmcjEwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyMTAwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnIxMDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyMTAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByMjAwX2FzaWMgPSB7CkBAIC0yMTUsNiArMjE4LDkgQEAKIAkucG1fZmluaXNoID0gJnIxMDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjEwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyMTAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjMwMF9hc2ljID0gewpAQCAtMjYwLDYgKzI2Niw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyMTAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnIxMDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHIzMDBfYXNpY19wY2llID0gewpAQCAtMzA0LDYgKzMxMyw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyMTAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnIxMDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHI0MjBfYXNpYyA9IHsKQEAgLTM0OSw2ICszNjEsOSBAQAogCS5wbV9maW5pc2ggPSAmcjEwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyNDIwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnIxMDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyMTAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByczQwMF9hc2ljID0gewpAQCAtMzk0LDYgKzQwOSw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyMTAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnIxMDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJzNjAwX2FzaWMgPSB7CkBAIC00MzksNiArNDU3LDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI0MjBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnJzNjAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJzNjkwX2FzaWMgPSB7CkBAIC00ODQsNiArNTA1LDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI0MjBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnJzNjAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJ2NTE1X2FzaWMgPSB7CkBAIC01MjksNiArNTUzLDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI0MjBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnJzNjAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHI1MjBfYXNpYyA9IHsKQEAgLTU3NCw2ICs2MDEsOSBAQAogCS5wbV9maW5pc2ggPSAmcnM2MDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjQyMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjYwMF9hc2ljID0gewpAQCAtNjAxLDggKzYzMSw4IEBACiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLAogCS5zZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9tZW1vcnlfY2xvY2ssCi0JLmdldF9wY2llX2xhbmVzID0gJnJ2MzcwX2dldF9wY2llX2xhbmVzLAotCS5zZXRfcGNpZV9sYW5lcyA9IE5VTEwsCisJLmdldF9wY2llX2xhbmVzID0gJnI2MDBfZ2V0X3BjaWVfbGFuZXMsCisJLnNldF9wY2llX2xhbmVzID0gJnI2MDBfc2V0X3BjaWVfbGFuZXMsCiAJLnNldF9jbG9ja19nYXRpbmcgPSBOVUxMLAogCS5zZXRfc3VyZmFjZV9yZWcgPSByNjAwX3NldF9zdXJmYWNlX3JlZywKIAkuY2xlYXJfc3VyZmFjZV9yZWcgPSByNjAwX2NsZWFyX3N1cmZhY2VfcmVnLApAQCAtNjE4LDYgKzY0OCw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyczYwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyNjAwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnI2MDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnJzNjAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnJzNjAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByczc4MF9hc2ljID0gewpAQCAtNjYyLDYgKzY5NSw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyczYwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyczc4MF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyNjAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcnY3NzBfYXNpYyA9IHsKQEAgLTY4OSw4ICs3MjUsOCBAQAogCS5zZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9lbmdpbmVfY2xvY2ssCiAJLmdldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X21lbW9yeV9jbG9jaywKIAkuc2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfbWVtb3J5X2Nsb2NrLAotCS5nZXRfcGNpZV9sYW5lcyA9ICZydjM3MF9nZXRfcGNpZV9sYW5lcywKLQkuc2V0X3BjaWVfbGFuZXMgPSBOVUxMLAorCS5nZXRfcGNpZV9sYW5lcyA9ICZyNjAwX2dldF9wY2llX2xhbmVzLAorCS5zZXRfcGNpZV9sYW5lcyA9ICZyNjAwX3NldF9wY2llX2xhbmVzLAogCS5zZXRfY2xvY2tfZ2F0aW5nID0gJnJhZGVvbl9hdG9tX3NldF9jbG9ja19nYXRpbmcsCiAJLnNldF9zdXJmYWNlX3JlZyA9IHI2MDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHI2MDBfY2xlYXJfc3VyZmFjZV9yZWcsCkBAIC03MDYsNiArNzQyLDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI2MDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnJ2NzcwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIGV2ZXJncmVlbl9hc2ljID0gewpAQCAtNzMzLDYgKzc3Miw5NSBAQAogCS5zZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9lbmdpbmVfY2xvY2ssCiAJLmdldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X21lbW9yeV9jbG9jaywKIAkuc2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfbWVtb3J5X2Nsb2NrLAorCS5nZXRfcGNpZV9sYW5lcyA9ICZyNjAwX2dldF9wY2llX2xhbmVzLAorCS5zZXRfcGNpZV9sYW5lcyA9ICZyNjAwX3NldF9wY2llX2xhbmVzLAorCS5zZXRfY2xvY2tfZ2F0aW5nID0gTlVMTCwKKwkuc2V0X3N1cmZhY2VfcmVnID0gcjYwMF9zZXRfc3VyZmFjZV9yZWcsCisJLmNsZWFyX3N1cmZhY2VfcmVnID0gcjYwMF9jbGVhcl9zdXJmYWNlX3JlZywKKwkuYmFuZHdpZHRoX3VwZGF0ZSA9ICZldmVyZ3JlZW5fYmFuZHdpZHRoX3VwZGF0ZSwKKwkuaHBkX2luaXQgPSAmZXZlcmdyZWVuX2hwZF9pbml0LAorCS5ocGRfZmluaSA9ICZldmVyZ3JlZW5faHBkX2ZpbmksCisJLmhwZF9zZW5zZSA9ICZldmVyZ3JlZW5faHBkX3NlbnNlLAorCS5ocGRfc2V0X3BvbGFyaXR5ID0gJmV2ZXJncmVlbl9ocGRfc2V0X3BvbGFyaXR5LAorCS5ndWlfaWRsZSA9ICZyNjAwX2d1aV9pZGxlLAorCS5wbV9taXNjID0gJmV2ZXJncmVlbl9wbV9taXNjLAorCS5wbV9wcmVwYXJlID0gJmV2ZXJncmVlbl9wbV9wcmVwYXJlLAorCS5wbV9maW5pc2ggPSAmZXZlcmdyZWVuX3BtX2ZpbmlzaCwKKwkucG1faW5pdF9wcm9maWxlID0gJnI2MDBfcG1faW5pdF9wcm9maWxlLAorCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAsCit9OworCitzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHN1bW9fYXNpYyA9IHsKKwkuaW5pdCA9ICZldmVyZ3JlZW5faW5pdCwKKwkuZmluaSA9ICZldmVyZ3JlZW5fZmluaSwKKwkuc3VzcGVuZCA9ICZldmVyZ3JlZW5fc3VzcGVuZCwKKwkucmVzdW1lID0gJmV2ZXJncmVlbl9yZXN1bWUsCisJLmNwX2NvbW1pdCA9ICZyNjAwX2NwX2NvbW1pdCwKKwkuZ3B1X2lzX2xvY2t1cCA9ICZldmVyZ3JlZW5fZ3B1X2lzX2xvY2t1cCwKKwkuYXNpY19yZXNldCA9ICZldmVyZ3JlZW5fYXNpY19yZXNldCwKKwkudmdhX3NldF9zdGF0ZSA9ICZyNjAwX3ZnYV9zZXRfc3RhdGUsCisJLmdhcnRfdGxiX2ZsdXNoID0gJmV2ZXJncmVlbl9wY2llX2dhcnRfdGxiX2ZsdXNoLAorCS5nYXJ0X3NldF9wYWdlID0gJnJzNjAwX2dhcnRfc2V0X3BhZ2UsCisJLnJpbmdfdGVzdCA9ICZyNjAwX3JpbmdfdGVzdCwKKwkucmluZ19pYl9leGVjdXRlID0gJnI2MDBfcmluZ19pYl9leGVjdXRlLAorCS5pcnFfc2V0ID0gJmV2ZXJncmVlbl9pcnFfc2V0LAorCS5pcnFfcHJvY2VzcyA9ICZldmVyZ3JlZW5faXJxX3Byb2Nlc3MsCisJLmdldF92YmxhbmtfY291bnRlciA9ICZldmVyZ3JlZW5fZ2V0X3ZibGFua19jb3VudGVyLAorCS5mZW5jZV9yaW5nX2VtaXQgPSAmcjYwMF9mZW5jZV9yaW5nX2VtaXQsCisJLmNzX3BhcnNlID0gJmV2ZXJncmVlbl9jc19wYXJzZSwKKwkuY29weV9ibGl0ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHlfZG1hID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmNvcHkgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuZ2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfZW5naW5lX2Nsb2NrLAorCS5zZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9lbmdpbmVfY2xvY2ssCisJLmdldF9tZW1vcnlfY2xvY2sgPSBOVUxMLAorCS5zZXRfbWVtb3J5X2Nsb2NrID0gTlVMTCwKKwkuZ2V0X3BjaWVfbGFuZXMgPSBOVUxMLAorCS5zZXRfcGNpZV9sYW5lcyA9IE5VTEwsCisJLnNldF9jbG9ja19nYXRpbmcgPSBOVUxMLAorCS5zZXRfc3VyZmFjZV9yZWcgPSByNjAwX3NldF9zdXJmYWNlX3JlZywKKwkuY2xlYXJfc3VyZmFjZV9yZWcgPSByNjAwX2NsZWFyX3N1cmZhY2VfcmVnLAorCS5iYW5kd2lkdGhfdXBkYXRlID0gJmV2ZXJncmVlbl9iYW5kd2lkdGhfdXBkYXRlLAorCS5ocGRfaW5pdCA9ICZldmVyZ3JlZW5faHBkX2luaXQsCisJLmhwZF9maW5pID0gJmV2ZXJncmVlbl9ocGRfZmluaSwKKwkuaHBkX3NlbnNlID0gJmV2ZXJncmVlbl9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmZXZlcmdyZWVuX2hwZF9zZXRfcG9sYXJpdHksCisJLmd1aV9pZGxlID0gJnI2MDBfZ3VpX2lkbGUsCisJLnBtX21pc2MgPSAmZXZlcmdyZWVuX3BtX21pc2MsCisJLnBtX3ByZXBhcmUgPSAmZXZlcmdyZWVuX3BtX3ByZXBhcmUsCisJLnBtX2ZpbmlzaCA9ICZldmVyZ3JlZW5fcG1fZmluaXNoLAorCS5wbV9pbml0X3Byb2ZpbGUgPSAmcnM3ODBfcG1faW5pdF9wcm9maWxlLAorCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCit9OworCitzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIGJ0Y19hc2ljID0geworCS5pbml0ID0gJmV2ZXJncmVlbl9pbml0LAorCS5maW5pID0gJmV2ZXJncmVlbl9maW5pLAorCS5zdXNwZW5kID0gJmV2ZXJncmVlbl9zdXNwZW5kLAorCS5yZXN1bWUgPSAmZXZlcmdyZWVuX3Jlc3VtZSwKKwkuY3BfY29tbWl0ID0gJnI2MDBfY3BfY29tbWl0LAorCS5ncHVfaXNfbG9ja3VwID0gJmV2ZXJncmVlbl9ncHVfaXNfbG9ja3VwLAorCS5hc2ljX3Jlc2V0ID0gJmV2ZXJncmVlbl9hc2ljX3Jlc2V0LAorCS52Z2Ffc2V0X3N0YXRlID0gJnI2MDBfdmdhX3NldF9zdGF0ZSwKKwkuZ2FydF90bGJfZmx1c2ggPSAmZXZlcmdyZWVuX3BjaWVfZ2FydF90bGJfZmx1c2gsCisJLmdhcnRfc2V0X3BhZ2UgPSAmcnM2MDBfZ2FydF9zZXRfcGFnZSwKKwkucmluZ190ZXN0ID0gJnI2MDBfcmluZ190ZXN0LAorCS5yaW5nX2liX2V4ZWN1dGUgPSAmcjYwMF9yaW5nX2liX2V4ZWN1dGUsCisJLmlycV9zZXQgPSAmZXZlcmdyZWVuX2lycV9zZXQsCisJLmlycV9wcm9jZXNzID0gJmV2ZXJncmVlbl9pcnFfcHJvY2VzcywKKwkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCisJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKKwkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAorCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9kbWEgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCisJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKKwkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLAorCS5zZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9tZW1vcnlfY2xvY2ssCiAJLmdldF9wY2llX2xhbmVzID0gTlVMTCwKIAkuc2V0X3BjaWVfbGFuZXMgPSBOVUxMLAogCS5zZXRfY2xvY2tfZ2F0aW5nID0gTlVMTCwKQEAgLTc0OSw2ICs4NzcsOSBAQAogCS5wbV9maW5pc2ggPSAmZXZlcmdyZWVuX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI2MDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBpbnQgcmFkZW9uX2FzaWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTgzNSw2ICs5NjYsMTQgQEAKIAljYXNlIENISVBfSEVNTE9DSzoKIAkJcmRldi0+YXNpYyA9ICZldmVyZ3JlZW5fYXNpYzsKIAkJYnJlYWs7CisJY2FzZSBDSElQX1BBTE06CisJCXJkZXYtPmFzaWMgPSAmc3Vtb19hc2ljOworCQlicmVhazsKKwljYXNlIENISVBfQkFSVFM6CisJY2FzZSBDSElQX1RVUktTOgorCWNhc2UgQ0hJUF9DQUlDT1M6CisJCXJkZXYtPmFzaWMgPSAmYnRjX2FzaWM7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIEZJWE1FOiBub3Qgc3VwcG9ydGVkIHlldCAqLwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg0OSw3ICs5ODgsOSBAQAogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9TSU5HTEVfQ1JUQykKIAkJcmRldi0+bnVtX2NydGMgPSAxOwogCWVsc2UgewotCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKKwkJCXJkZXYtPm51bV9jcnRjID0gMjsKKwkJZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQogCQkJcmRldi0+bnVtX2NydGMgPSA2OwogCQllbHNlCiAJCQlyZGV2LT5udW1fY3J0YyA9IDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKaW5kZXggNzQwOTg4Mi4uZTAxZjA3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKQEAgLTEwMiw2ICsxMDIsMTEgQEAKIHZvaWQgcjEwMF9wY2lfZ2FydF9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByMTAwX2RlYnVnZnNfbWNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByMTAwX2d1aV93YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcjEwMF9ncHVfbG9ja3VwX3VwZGF0ZShzdHJ1Y3QgcjEwMF9ncHVfbG9ja3VwICpsb2NrdXAsCisJCQkgICAgc3RydWN0IHJhZGVvbl9jcCAqY3ApOworYm9vbCByMTAwX2dwdV9jcF9pc19sb2NrdXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkgICBzdHJ1Y3QgcjEwMF9ncHVfbG9ja3VwICpsb2NrdXAsCisJCQkgICBzdHJ1Y3QgcmFkZW9uX2NwICpjcCk7CiB2b2lkIHIxMDBfaWJfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcjEwMF9pYl9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjEwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC0xMzAsMTUgKzEzNSwxOSBAQAogZXh0ZXJuIHZvaWQgcjEwMF9wbV9maW5pc2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjEwMF9wbV9pbml0X3Byb2ZpbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjEwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gdTMyIHIxMDBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7CitleHRlcm4gdm9pZCByMTAwX3Bvc3RfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiAKIC8qCiAgKiByMjAwLHJ2MjUwLHJzMzAwLHJ2MjgwCiAgKi8KIGV4dGVybiBpbnQgcjIwMF9jb3B5X2RtYShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCXVpbnQ2NF90IHNyY19vZmZzZXQsCi0JCQl1aW50NjRfdCBkc3Rfb2Zmc2V0LAotCQkJdW5zaWduZWQgbnVtX3BhZ2VzLAorCQkJIHVpbnQ2NF90IHNyY19vZmZzZXQsCisJCQkgdWludDY0X3QgZHN0X29mZnNldCwKKwkJCSB1bnNpZ25lZCBudW1fcGFnZXMsCiAJCQkgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpOwordm9pZCByMjAwX3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiByMzAwLHIzNTAscnYzNTAscnYzODAKQEAgLTE1OSw2ICsxNjgsMTUgQEAKIGV4dGVybiB2b2lkIHJ2MzcwX3BjaWVfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2KTsKIGV4dGVybiB2b2lkIHJ2MzcwX3NldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgbGFuZXMpOwogZXh0ZXJuIGludCBydjM3MF9nZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX3NldF9yZWdfc2FmZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjMwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHIzMDBfY2xvY2tfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHIzMDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiBpbnQgcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBydjM3MF9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiByNDIwLHI0MjMscnY0MTAKQEAgLTE2OCw2ICsxODYsMTAgQEAKIGV4dGVybiBpbnQgcjQyMF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiBpbnQgcjQyMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjQyMF9wbV9pbml0X3Byb2ZpbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHUzMiByNDIwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcpOworZXh0ZXJuIHZvaWQgcjQyMF9tY193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnLCB1MzIgdik7CitleHRlcm4gaW50IHI0MjBfZGVidWdmc19waXBlc19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjQyMF9waXBlc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyoKICAqIHJzNDAwLHJzNDgwCkBAIC0xODAsNiArMjAyLDEyIEBACiBpbnQgcnM0MDBfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpOwogdWludDMyX3QgcnM0MDBfbWNfcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKTsKIHZvaWQgcnM0MDBfbWNfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2KTsKK2ludCByczQwMF9nYXJ0X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworaW50IHJzNDAwX2dhcnRfZW5hYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnM0MDBfZ2FydF9hZGp1c3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJzNDAwX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJzNDAwX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKIAogLyoKICAqIHJzNjAwLgpAQCAtMTkxLDYgKzIxOSw3IEBACiBleHRlcm4gaW50IHJzNjAwX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnM2MDBfaXJxX3NldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnM2MDBfaXJxX3Byb2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByczYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB1MzIgcnM2MDBfZ2V0X3ZibGFua19jb3VudGVyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiB2b2lkIHJzNjAwX2dhcnRfdGxiX2ZsdXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByczYwMF9nYXJ0X3NldF9wYWdlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgaSwgdWludDY0X3QgYWRkcik7CkBAIC0yMDUsNiArMjM0LDExIEBACiBleHRlcm4gdm9pZCByczYwMF9wbV9taXNjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJzNjAwX3BtX3ByZXBhcmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcnM2MDBfcG1fZmluaXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHJzNjAwX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK2V4dGVybiB1MzIgcnM2MDBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7CitleHRlcm4gdm9pZCByczYwMF9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwordm9pZCByczYwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCiAKIC8qCiAgKiByczY5MCxyczc0MApAQCAtMjE2LDEwICsyNTAsMjEgQEAKIHVpbnQzMl90IHJzNjkwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJzNjkwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiB2b2lkIHJzNjkwX2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByczY5MF9saW5lX2J1ZmZlcl9hZGp1c3Qoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMSwKKwkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUyKTsKIAogLyoKICAqIHJ2NTE1CiAgKi8KK3N0cnVjdCBydjUxNV9tY19zYXZlIHsKKwl1MzIgZDF2Z2FfY29udHJvbDsKKwl1MzIgZDJ2Z2FfY29udHJvbDsKKwl1MzIgdmdhX3JlbmRlcl9jb250cm9sOworCXUzMiB2Z2FfaGRwX2NvbnRyb2w7CisJdTMyIGQxY3J0Y19jb250cm9sOworCXUzMiBkMmNydGNfY29udHJvbDsKK307CiBpbnQgcnY1MTVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJ2NTE1X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdWludDMyX3QgcnY1MTVfbWNfcnJlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdWludDMyX3QgcmVnKTsKQEAgLTIzMCw2ICsyNzUsMTQgQEAKIHZvaWQgcnY1MTVfYmFuZHdpZHRoX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnY1MTVfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjUxNV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnY1MTVfYmFuZHdpZHRoX2F2aXZvX3VwZGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJ2NTE1X3ZnYV9yZW5kZXJfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJ2NTE1X3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJ2NTE1X21jX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCBydjUxNV9tY19zYXZlICpzYXZlKTsKK3ZvaWQgcnY1MTVfbWNfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSAqc2F2ZSk7Cit2b2lkIHJ2NTE1X2Nsb2NrX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBydjUxNV9kZWJ1Z2ZzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwogCiAvKgogICogcjUyMCxydjUzMCxydjU2MCxydjU3MCxyNTgwCkBAIC0yNzgsNiArMzMxLDggQEAKIGV4dGVybiB2b2lkIHI2MDBfcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJzNzgwX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByNjAwX3BtX2dldF9keW5wbV9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByNjAwX3NldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgbGFuZXMpOworZXh0ZXJuIGludCByNjAwX2dldF9wY2llX2xhbmVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyoKICAqIHJ2NzcwLHJ2NzMwLHJ2NzEwLHJ2NzQwCkBAIC0yODcsNiArMzQyLDcgQEAKIGludCBydjc3MF9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCBydjc3MF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcnY3NzBfcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdTMyIHJ2NzcwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOwogCiAvKgogICogZXZlcmdyZWVuCkBAIC0zMTQsNSArMzcwLDggQEAKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wbV9taXNjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wbV9wcmVwYXJlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIGV2ZXJncmVlbl9wbV9maW5pc2goc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK2V4dGVybiB1MzIgZXZlcmdyZWVuX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOworZXh0ZXJuIHZvaWQgZXZlcmdyZWVuX3Bvc3RfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKaW5kZXggYmM1YTJjMy4uMTU3MzIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gdm9pZCByYWRlb25fbGlua19lbmNvZGVyX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCiByYWRlb25fYWRkX2F0b21fZW5jb2RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBlbmNvZGVyX2VudW0sCi0JCQl1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlKTsKKwkJCXVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsIHUxNiBjYXBzKTsKIAogLyogZnJvbSByYWRlb25fY29ubmVjdG9yLmMgKi8KIGV4dGVybiB2b2lkCkBAIC0zMTMsNyArMzEzLDYgQEAKIAkJCQkgICAgIHVpbnQxNl90ICpsaW5lX211eCwKIAkJCQkgICAgIHN0cnVjdCByYWRlb25faHBkICpocGQpCiB7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJLyogQXN1cyBNMkEtVk0gSERNSSBib2FyZCBsaXN0cyB0aGUgRFZJIHBvcnQgYXMgSERNSSAqLwogCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg3OTFlKSAmJgpAQCAtMzg4LDYgKzM4NywxNyBAQAogCQkJKmxpbmVfbXV4ID0gMHg5MDsKIAl9CiAKKwkvKiBtYWMgcnY2MzAgKi8KKwlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTU4OCkgJiYKKwkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNmIpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMGE2KSkgeworCQlpZiAoKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfVFYxX1NVUFBPUlQpICYmCisJCSAgICAoKmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSkgeworCQkJKmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SXzlQaW5ESU47CisJCQkqbGluZV9tdXggPSBDT05ORUNUT1JfN1BJTl9ESU5fRU5VTV9JRDE7CisJCX0KKwl9CisKIAkvKiBBU1VTIEhEIDM2MDAgWFQgYm9hcmQgbGlzdHMgdGhlIERWSSBwb3J0IGFzIEhETUkgKi8KIAlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4OTU5OCkgJiYKIAkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwNDMpICYmCkBAIC00MjUsMjEgKzQzNSwyMyBAQAogCQl9CiAJfQogCi0JLyogQWNlciBsYXB0b3AgcmVwb3J0cyBEVkktRCBhcyBEVkktSSBhbmQgaHBkIHBpbnMgcmV2ZXJzZWQgKi8KKwkvKiBBY2VyIGxhcHRvcCAoQWNlciBUcmF2ZWxNYXRlIDU3MzBHKSBoYXMgYW4gSERNSSBwb3J0CisJICogb24gdGhlIGxhcHRvcCBhbmQgYSBEVkkgcG9ydCBvbiB0aGUgZG9ja2luZyBzdGF0aW9uIGFuZAorCSAqIGJvdGggc2hhcmUgdGhlIHNhbWUgZW5jb2RlciwgaHBkIHBpbiwgYW5kIGRkYyBsaW5lLgorCSAqIFNvIHdoaWxlIHRoZSBiaW9zIHRhYmxlIGlzIHRlY2huaWNhbGx5IGNvcnJlY3QsCisJICogd2UgZHJvcCB0aGUgRFZJIHBvcnQgaGVyZSBzaW5jZSB4cmFuZHIgaGFzIG5vIGNvbmNlcHQgb2YKKwkgKiBlbmNvZGVycyBhbmQgd2lsbCB0cnkgYW5kIGRyaXZlIGJvdGggY29ubmVjdG9ycworCSAqIHdpdGggZGlmZmVyZW50IGNydGNzIHdoaWNoIGlzbid0IHBvc3NpYmxlIG9uIHRoZSBoYXJkd2FyZQorCSAqIHNpZGUgYW5kIGxlYXZlcyBubyBjcnRjcyBmb3IgTFZEUyBvciBWR0EuCisJICovCiAJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDk1YzQpICYmCiAJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDI1KSAmJgogCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDEzYykpIHsKLQkJc3RydWN0IHJhZGVvbl9ncGlvX3JlYyBncGlvOwotCiAJCWlmICgoKmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJKSAmJgogCQkgICAgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKSkgewotCQkJZ3BpbyA9IHJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LCA2KTsKLQkJCSpocGQgPSByYWRlb25fYXRvbV9nZXRfaHBkX2luZm9fZnJvbV9ncGlvKHJkZXYsICZncGlvKTsKKwkJCS8qIGFjdHVhbGx5IGl0J3MgYSBEVkktRCBwb3J0IG5vdCBEVkktSSAqLwogCQkJKmNvbm5lY3Rvcl90eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX0RWSUQ7Ci0JCX0gZWxzZSBpZiAoKCpjb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpICYmCi0JCQkgICAoc3VwcG9ydGVkX2RldmljZSA9PSBBVE9NX0RFVklDRV9ERlAxX1NVUFBPUlQpKSB7Ci0JCQlncGlvID0gcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsIDcpOwotCQkJKmhwZCA9IHJhZGVvbl9hdG9tX2dldF9ocGRfaW5mb19mcm9tX2dwaW8ocmRldiwgJmdwaW8pOworCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJfQogCkBAIC01MjUsNiArNTM3LDcgQEAKIAl1MTYgc2l6ZSwgZGF0YV9vZmZzZXQ7CiAJdTggZnJldiwgY3JldjsKIAlBVE9NX0NPTk5FQ1RPUl9PQkpFQ1RfVEFCTEUgKmNvbl9vYmo7CisJQVRPTV9FTkNPREVSX09CSkVDVF9UQUJMRSAqZW5jX29iajsKIAlBVE9NX09CSkVDVF9UQUJMRSAqcm91dGVyX29iajsKIAlBVE9NX0RJU1BMQVlfT0JKRUNUX1BBVEhfVEFCTEUgKnBhdGhfb2JqOwogCUFUT01fT0JKRUNUX0hFQURFUiAqb2JqX2hlYWRlcjsKQEAgLTU0OSw2ICs1NjIsOSBAQAogCWNvbl9vYmogPSAoQVRPTV9DT05ORUNUT1JfT0JKRUNUX1RBQkxFICopCiAJICAgIChjdHgtPmJpb3MgKyBkYXRhX29mZnNldCArCiAJICAgICBsZTE2X3RvX2NwdShvYmpfaGVhZGVyLT51c0Nvbm5lY3Rvck9iamVjdFRhYmxlT2Zmc2V0KSk7CisJZW5jX29iaiA9IChBVE9NX0VOQ09ERVJfT0JKRUNUX1RBQkxFICopCisJICAgIChjdHgtPmJpb3MgKyBkYXRhX29mZnNldCArCisJICAgICBsZTE2X3RvX2NwdShvYmpfaGVhZGVyLT51c0VuY29kZXJPYmplY3RUYWJsZU9mZnNldCkpOwogCXJvdXRlcl9vYmogPSAoQVRPTV9PQkpFQ1RfVEFCTEUgKikKIAkJKGN0eC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKIAkJIGxlMTZfdG9fY3B1KG9ial9oZWFkZXItPnVzUm91dGVyT2JqZWN0VGFibGVPZmZzZXQpKTsKQEAgLTY1NCwxNCArNjcwLDM1IEBACiAJCQkJICAgICBPQkpFQ1RfVFlQRV9NQVNLKSA+PiBPQkpFQ1RfVFlQRV9TSElGVDsKIAogCQkJCWlmIChncnBoX29ial90eXBlID09IEdSQVBIX09CSkVDVF9UWVBFX0VOQ09ERVIpIHsKLQkJCQkJdTE2IGVuY29kZXJfb2JqID0gbGUxNl90b19jcHUocGF0aC0+dXNHcmFwaGljT2JqSWRzW2pdKTsKKwkJCQkJZm9yIChrID0gMDsgayA8IGVuY19vYmotPnVjTnVtYmVyT2ZPYmplY3RzOyBrKyspIHsKKwkJCQkJCXUxNiBlbmNvZGVyX29iaiA9IGxlMTZfdG9fY3B1KGVuY19vYmotPmFzT2JqZWN0c1trXS51c09iamVjdElEKTsKKwkJCQkJCWlmIChsZTE2X3RvX2NwdShwYXRoLT51c0dyYXBoaWNPYmpJZHNbal0pID09IGVuY29kZXJfb2JqKSB7CisJCQkJCQkJQVRPTV9DT01NT05fUkVDT1JEX0hFQURFUiAqcmVjb3JkID0gKEFUT01fQ09NTU9OX1JFQ09SRF9IRUFERVIgKikKKwkJCQkJCQkJKGN0eC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKKwkJCQkJCQkJIGxlMTZfdG9fY3B1KGVuY19vYmotPmFzT2JqZWN0c1trXS51c1JlY29yZE9mZnNldCkpOworCQkJCQkJCUFUT01fRU5DT0RFUl9DQVBfUkVDT1JEICpjYXBfcmVjb3JkOworCQkJCQkJCXUxNiBjYXBzID0gMDsKIAotCQkJCQlyYWRlb25fYWRkX2F0b21fZW5jb2RlcihkZXYsCi0JCQkJCQkJCWVuY29kZXJfb2JqLAotCQkJCQkJCQlsZTE2X3RvX2NwdQotCQkJCQkJCQkocGF0aC0+Ci0JCQkJCQkJCSB1c0RldmljZVRhZykpOwotCisJCQkJCQkJd2hpbGUgKHJlY29yZC0+dWNSZWNvcmRUeXBlID4gMCAmJgorCQkJCQkJCSAgICAgICByZWNvcmQtPnVjUmVjb3JkVHlwZSA8PSBBVE9NX01BWF9PQkpFQ1RfUkVDT1JEX05VTUJFUikgeworCQkJCQkJCQlzd2l0Y2ggKHJlY29yZC0+dWNSZWNvcmRUeXBlKSB7CisJCQkJCQkJCWNhc2UgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfVFlQRToKKwkJCQkJCQkJCWNhcF9yZWNvcmQgPShBVE9NX0VOQ09ERVJfQ0FQX1JFQ09SRCAqKQorCQkJCQkJCQkJCXJlY29yZDsKKwkJCQkJCQkJCWNhcHMgPSBsZTE2X3RvX2NwdShjYXBfcmVjb3JkLT51c0VuY29kZXJDYXApOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCX0KKwkJCQkJCQkJcmVjb3JkID0gKEFUT01fQ09NTU9OX1JFQ09SRF9IRUFERVIgKikKKwkJCQkJCQkJCSgoY2hhciAqKXJlY29yZCArIHJlY29yZC0+dWNSZWNvcmRTaXplKTsKKwkJCQkJCQl9CisJCQkJCQkJcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoZGV2LAorCQkJCQkJCQkJCWVuY29kZXJfb2JqLAorCQkJCQkJCQkJCWxlMTZfdG9fY3B1CisJCQkJCQkJCQkJKHBhdGgtPgorCQkJCQkJCQkJCSB1c0RldmljZVRhZyksCisJCQkJCQkJCQkJY2Fwcyk7CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKGdycGhfb2JqX3R5cGUgPT0gR1JBUEhfT0JKRUNUX1RZUEVfUk9VVEVSKSB7CiAJCQkJCWZvciAoayA9IDA7IGsgPCByb3V0ZXJfb2JqLT51Y051bWJlck9mT2JqZWN0czsgaysrKSB7CiAJCQkJCQl1MTYgcm91dGVyX29ial9pZCA9IGxlMTZfdG9fY3B1KHJvdXRlcl9vYmotPmFzT2JqZWN0c1trXS51c09iamVjdElEKTsKQEAgLTk5NSw3ICsxMDMyLDggQEAKIAkJCQkJCXJhZGVvbl9nZXRfZW5jb2Rlcl9lbnVtKGRldiwKIAkJCQkJCQkJICAgICAgKDEgPDwgaSksCiAJCQkJCQkJCSAgICAgIGRhYyksCi0JCQkJCQkoMSA8PCBpKSk7CisJCQkJCQkoMSA8PCBpKSwKKwkJCQkJCTApOwogCQllbHNlCiAJCQlyYWRlb25fYWRkX2xlZ2FjeV9lbmNvZGVyKGRldiwKIAkJCQkJCSAgcmFkZW9uX2dldF9lbmNvZGVyX2VudW0oZGV2LApAQCAtMTA3NCw2ICsxMTEyLDcgQEAKIAlBVE9NX0ZJUk1XQVJFX0lORk9fVjFfMyBpbmZvXzEzOwogCUFUT01fRklSTVdBUkVfSU5GT19WMV80IGluZm9fMTQ7CiAJQVRPTV9GSVJNV0FSRV9JTkZPX1YyXzEgaW5mb18yMTsKKwlBVE9NX0ZJUk1XQVJFX0lORk9fVjJfMiBpbmZvXzIyOwogfTsKIAogYm9vbCByYWRlb25fYXRvbV9nZXRfY2xvY2tfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTE0OCw4ICsxMTg3LDEyIEBACiAJCSpwMnBsbCA9ICpwMXBsbDsKIAogCQkvKiBzeXN0ZW0gY2xvY2sgKi8KLQkJc3BsbC0+cmVmZXJlbmNlX2ZyZXEgPQotCQkgICAgbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mby51c1JlZmVyZW5jZUNsb2NrKTsKKwkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCXNwbGwtPnJlZmVyZW5jZV9mcmVxID0KKwkJCQlsZTE2X3RvX2NwdShmaXJtd2FyZV9pbmZvLT5pbmZvXzIxLnVzQ29yZVJlZmVyZW5jZUNsb2NrKTsKKwkJZWxzZQorCQkJc3BsbC0+cmVmZXJlbmNlX2ZyZXEgPQorCQkJCWxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNSZWZlcmVuY2VDbG9jayk7CiAJCXNwbGwtPnJlZmVyZW5jZV9kaXYgPSAwOwogCiAJCXNwbGwtPnBsbF9vdXRfbWluID0KQEAgLTExNzEsOCArMTIxNCwxMiBAQAogCQkgICAgbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mby51c01heEVuZ2luZUNsb2NrUExMX0lucHV0KTsKIAogCQkvKiBtZW1vcnkgY2xvY2sgKi8KLQkJbXBsbC0+cmVmZXJlbmNlX2ZyZXEgPQotCQkgICAgbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mby51c1JlZmVyZW5jZUNsb2NrKTsKKwkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKKwkJCW1wbGwtPnJlZmVyZW5jZV9mcmVxID0KKwkJCQlsZTE2X3RvX2NwdShmaXJtd2FyZV9pbmZvLT5pbmZvXzIxLnVzTWVtb3J5UmVmZXJlbmNlQ2xvY2spOworCQllbHNlCisJCQltcGxsLT5yZWZlcmVuY2VfZnJlcSA9CisJCQkJbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mby51c1JlZmVyZW5jZUNsb2NrKTsKIAkJbXBsbC0+cmVmZXJlbmNlX2RpdiA9IDA7CiAKIAkJbXBsbC0+cGxsX291dF9taW4gPQpAQCAtMTIwMSw4ICsxMjQ4LDEyIEBACiAJCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKIAkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayA9CiAJCQkJbGUzMl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mb18yMS51bERlZmF1bHREaXNwRW5naW5lQ2xrRnJlcSk7Ci0JCQlpZiAocmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrID09IDApCi0JCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrID0gNjAwMDA7IC8qIDYwMCBNaHogKi8KKwkJCWlmIChyZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGsgPT0gMCkgeworCQkJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayA9IDU0MDAwOyAvKiA1NDAgTWh6ICovCisJCQkJZWxzZQorCQkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGsgPSA2MDAwMDsgLyogNjAwIE1oeiAqLworCQkJfQogCQkJcmRldi0+Y2xvY2suZHBfZXh0Y2xrID0KIAkJCQlsZTE2X3RvX2NwdShmaXJtd2FyZV9pbmZvLT5pbmZvXzIxLnVzVW5pcGh5RFBNb2RlRXh0Q2xrRnJlcSk7CiAJCX0KQEAgLTEzMzcsNiArMTM4OCw0MyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIHZvaWQgcmFkZW9uX2F0b21iaW9zX2dldF9pZ3Bfc3Nfb3ZlcnJpZGVzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJIHN0cnVjdCByYWRlb25fYXRvbV9zcyAqc3MsCisJCQkJCQkgaW50IGlkKQoreworCXN0cnVjdCByYWRlb25fbW9kZV9pbmZvICptb2RlX2luZm8gPSAmcmRldi0+bW9kZV9pbmZvOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIEludGVncmF0ZWRTeXN0ZW1JbmZvKTsKKwl1MTYgZGF0YV9vZmZzZXQsIHNpemU7CisJc3RydWN0IF9BVE9NX0lOVEVHUkFURURfU1lTVEVNX0lORk9fVjYgKmlncF9pbmZvOworCXU4IGZyZXYsIGNyZXY7CisJdTE2IHBlcmNlbnRhZ2UgPSAwLCByYXRlID0gMDsKKworCS8qIGdldCBhbnkgaWdwIHNwZWNpZmljIG92ZXJyaWRlcyAqLworCWlmIChhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LCBpbmRleCwgJnNpemUsCisJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKSB7CisJCWlncF9pbmZvID0gKHN0cnVjdCBfQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2ICopCisJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCk7CisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSBBU0lDX0lOVEVSTkFMX1NTX09OX1RNRFM6CisJCQlwZXJjZW50YWdlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzRFZJU1NQZXJjZW50YWdlKTsKKwkJCXJhdGUgPSBsZTE2X3RvX2NwdShpZ3BfaW5mby0+dXNEVklTU3ByZWFkUmF0ZUluMTBIeik7CisJCQlicmVhazsKKwkJY2FzZSBBU0lDX0lOVEVSTkFMX1NTX09OX0hETUk6CisJCQlwZXJjZW50YWdlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzSERNSVNTUGVyY2VudGFnZSk7CisJCQlyYXRlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzSERNSVNTcHJlYWRSYXRlSW4xMEh6KTsKKwkJCWJyZWFrOworCQljYXNlIEFTSUNfSU5URVJOQUxfU1NfT05fTFZEUzoKKwkJCXBlcmNlbnRhZ2UgPSBsZTE2X3RvX2NwdShpZ3BfaW5mby0+dXNMdmRzU1NQZXJjZW50YWdlKTsKKwkJCXJhdGUgPSBsZTE2X3RvX2NwdShpZ3BfaW5mby0+dXNMdmRzU1NwcmVhZFJhdGVJbjEwSHopOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBlcmNlbnRhZ2UpCisJCQlzcy0+cGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisJCWlmIChyYXRlKQorCQkJc3MtPnJhdGUgPSByYXRlOworCX0KK30KKwogdW5pb24gYXNpY19zc19pbmZvIHsKIAlzdHJ1Y3QgX0FUT01fQVNJQ19JTlRFUk5BTF9TU19JTkZPIGluZm87CiAJc3RydWN0IF9BVE9NX0FTSUNfSU5URVJOQUxfU1NfSU5GT19WMiBpbmZvXzI7CkBAIC0xNDAxLDYgKzE0ODksOCBAQAogCQkJCQkJbGUxNl90b19jcHUoc3NfaW5mby0+aW5mb18zLmFzU3ByZWFkU3BlY3RydW1baV0udXNTcHJlYWRTcGVjdHJ1bVBlcmNlbnRhZ2UpOwogCQkJCQlzcy0+dHlwZSA9IHNzX2luZm8tPmluZm9fMy5hc1NwcmVhZFNwZWN0cnVtW2ldLnVjU3ByZWFkU3BlY3RydW1Nb2RlOwogCQkJCQlzcy0+cmF0ZSA9IGxlMTZfdG9fY3B1KHNzX2luZm8tPmluZm9fMy5hc1NwcmVhZFNwZWN0cnVtW2ldLnVzU3ByZWFkUmF0ZUluMTBIeik7CisJCQkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCQkJCQlyYWRlb25fYXRvbWJpb3NfZ2V0X2lncF9zc19vdmVycmlkZXMocmRldiwgc3MsIGlkKTsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQogCQkJfQpAQCAtMTQ3Nyw2ICsxNTY3LDkgQEAKIAkJaWYgKG1pc2MgJiBBVE9NX0RPVUJMRV9DTE9DS19NT0RFKQogCQkJbHZkcy0+bmF0aXZlX21vZGUuZmxhZ3MgfD0gRFJNX01PREVfRkxBR19EQkxTQ0FOOwogCisJCWx2ZHMtPm5hdGl2ZV9tb2RlLndpZHRoX21tID0gbHZkc19pbmZvLT5pbmZvLnNMQ0RUaW1pbmcudXNJbWFnZUhTaXplOworCQlsdmRzLT5uYXRpdmVfbW9kZS5oZWlnaHRfbW0gPSBsdmRzX2luZm8tPmluZm8uc0xDRFRpbWluZy51c0ltYWdlVlNpemU7CisKIAkJLyogc2V0IGNydGMgdmFsdWVzICovCiAJCWRybV9tb2RlX3NldF9jcnRjaW5mbygmbHZkcy0+bmF0aXZlX21vZGUsIENSVENfSU5URVJMQUNFX0hBTFZFX1YpOwogCkBAIC0xNDg5LDYgKzE1ODIsNTkgQEAKIAkJZWxzZQogCQkJbHZkcy0+bGlua2IgPSBmYWxzZTsKIAorCQkvKiBwYXJzZSB0aGUgbGNkIHJlY29yZCB0YWJsZSAqLworCQlpZiAobHZkc19pbmZvLT5pbmZvLnVzTW9kZVBhdGNoVGFibGVPZmZzZXQpIHsKKwkJCUFUT01fRkFLRV9FRElEX1BBVENIX1JFQ09SRCAqZmFrZV9lZGlkX3JlY29yZDsKKwkJCUFUT01fUEFORUxfUkVTT0xVVElPTl9QQVRDSF9SRUNPUkQgKnBhbmVsX3Jlc19yZWNvcmQ7CisJCQlib29sIGJhZF9yZWNvcmQgPSBmYWxzZTsKKwkJCXU4ICpyZWNvcmQgPSAodTggKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKworCQkJCQkgICAgZGF0YV9vZmZzZXQgKworCQkJCQkgICAgbHZkc19pbmZvLT5pbmZvLnVzTW9kZVBhdGNoVGFibGVPZmZzZXQpOworCQkJd2hpbGUgKCpyZWNvcmQgIT0gQVRPTV9SRUNPUkRfRU5EX1RZUEUpIHsKKwkJCQlzd2l0Y2ggKCpyZWNvcmQpIHsKKwkJCQljYXNlIExDRF9NT0RFX1BBVENIX1JFQ09SRF9NT0RFX1RZUEU6CisJCQkJCXJlY29yZCArPSBzaXplb2YoQVRPTV9QQVRDSF9SRUNPUkRfTU9ERSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTENEX1JUU19SRUNPUkRfVFlQRToKKwkJCQkJcmVjb3JkICs9IHNpemVvZihBVE9NX0xDRF9SVFNfUkVDT1JEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMQ0RfQ0FQX1JFQ09SRF9UWVBFOgorCQkJCQlyZWNvcmQgKz0gc2l6ZW9mKEFUT01fTENEX01PREVfQ09OVFJPTF9DQVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIExDRF9GQUtFX0VESURfUEFUQ0hfUkVDT1JEX1RZUEU6CisJCQkJCWZha2VfZWRpZF9yZWNvcmQgPSAoQVRPTV9GQUtFX0VESURfUEFUQ0hfUkVDT1JEICopcmVjb3JkOworCQkJCQlpZiAoZmFrZV9lZGlkX3JlY29yZC0+dWNGYWtlRURJRExlbmd0aCkgeworCQkJCQkJc3RydWN0IGVkaWQgKmVkaWQ7CisJCQkJCQlpbnQgZWRpZF9zaXplID0KKwkJCQkJCQltYXgoKGludClFRElEX0xFTkdUSCwgKGludClmYWtlX2VkaWRfcmVjb3JkLT51Y0Zha2VFRElETGVuZ3RoKTsKKwkJCQkJCWVkaWQgPSBrbWFsbG9jKGVkaWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJCQlpZiAoZWRpZCkgeworCQkJCQkJCW1lbWNweSgodTggKillZGlkLCAodTggKikmZmFrZV9lZGlkX3JlY29yZC0+dWNGYWtlRURJRFN0cmluZ1swXSwKKwkJCQkJCQkgICAgICAgZmFrZV9lZGlkX3JlY29yZC0+dWNGYWtlRURJRExlbmd0aCk7CisKKwkJCQkJCQlpZiAoZHJtX2VkaWRfaXNfdmFsaWQoZWRpZCkpCisJCQkJCQkJCXJkZXYtPm1vZGVfaW5mby5iaW9zX2hhcmRjb2RlZF9lZGlkID0gZWRpZDsKKwkJCQkJCQllbHNlCisJCQkJCQkJCWtmcmVlKGVkaWQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXJlY29yZCArPSBzaXplb2YoQVRPTV9GQUtFX0VESURfUEFUQ0hfUkVDT1JEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMQ0RfUEFORUxfUkVTT0xVVElPTl9SRUNPUkRfVFlQRToKKwkJCQkJcGFuZWxfcmVzX3JlY29yZCA9IChBVE9NX1BBTkVMX1JFU09MVVRJT05fUEFUQ0hfUkVDT1JEICopcmVjb3JkOworCQkJCQlsdmRzLT5uYXRpdmVfbW9kZS53aWR0aF9tbSA9IHBhbmVsX3Jlc19yZWNvcmQtPnVzSFNpemU7CisJCQkJCWx2ZHMtPm5hdGl2ZV9tb2RlLmhlaWdodF9tbSA9IHBhbmVsX3Jlc19yZWNvcmQtPnVzVlNpemU7CisJCQkJCXJlY29yZCArPSBzaXplb2YoQVRPTV9QQU5FTF9SRVNPTFVUSU9OX1BBVENIX1JFQ09SRCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCURSTV9FUlJPUigiQmFkIExDRCByZWNvcmQgJWRcbiIsICpyZWNvcmQpOworCQkJCQliYWRfcmVjb3JkID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChiYWRfcmVjb3JkKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KIAlyZXR1cm4gbHZkczsKIH0KQEAgLTE3NDAsNDk1ICsxODg2LDYxMyBAQAogCSJSVjZ4eCIsCiAJIlJWNzcwIiwKIAkiYWR0NzQ3MyIsCisJIk5PTkUiLAogCSJFeHRlcm5hbCBHUElPIiwKIAkiRXZlcmdyZWVuIiwKLQkiYWR0NzQ3MyB3aXRoIGludGVybmFsIiwKLQorCSJlbWMyMTAzIiwKKwkiU3VtbyIsCisJIk5vcnRoZXJuIElzbGFuZHMiLAogfTsKIAogdW5pb24gcG93ZXJfaW5mbyB7CiAJc3RydWN0IF9BVE9NX1BPV0VSUExBWV9JTkZPIGluZm87CiAJc3RydWN0IF9BVE9NX1BPV0VSUExBWV9JTkZPX1YyIGluZm9fMjsKIAlzdHJ1Y3QgX0FUT01fUE9XRVJQTEFZX0lORk9fVjMgaW5mb18zOwotCXN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRSBpbmZvXzQ7CisJc3RydWN0IF9BVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFIHBwbGliOworCXN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTIgcHBsaWIyOworCXN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTMgcHBsaWIzOwogfTsKIAordW5pb24gcHBsaWJfY2xvY2tfaW5mbyB7CisJc3RydWN0IF9BVE9NX1BQTElCX1I2MDBfQ0xPQ0tfSU5GTyByNjAwOworCXN0cnVjdCBfQVRPTV9QUExJQl9SUzc4MF9DTE9DS19JTkZPIHJzNzgwOworCXN0cnVjdCBfQVRPTV9QUExJQl9FVkVSR1JFRU5fQ0xPQ0tfSU5GTyBldmVyZ3JlZW47CisJc3RydWN0IF9BVE9NX1BQTElCX1NVTU9fQ0xPQ0tfSU5GTyBzdW1vOworfTsKKwordW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgeworCXN0cnVjdCBfQVRPTV9QUExJQl9TVEFURSB2MTsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfU1RBVEVfVjIgdjI7Cit9OworCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbWJpb3NfcGFyc2VfbWlzY19mbGFnc18xXzMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCQkgaW50IHN0YXRlX2luZGV4LAorCQkJCQkJIHUzMiBtaXNjLCB1MzIgbWlzYzIpCit7CisJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSBtaXNjOworCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IG1pc2MyOworCS8qIG9yZGVyIG1hdHRlcnMhICovCisJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BPV0VSX1NBVklOR19NT0RFKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX1BPV0VSU0FWRTsKKwlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9EQ19TVEFURV9FTlRSWV9UUlVFKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7CisJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RFRkFVTFRfTE9XX0RDX1NUQVRFX0VOVFJZX1RSVUUpCisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWTsKKwlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fTE9BRF9CQUxBTkNFX0VOKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOworCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT18zRF9BQ0NFTEVSQVRJT05fRU4pIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRTsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9CisJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7CisJfQorCWlmIChtaXNjMiAmIEFUT01fUE1fTUlTQ0lORk8yX1NZU1RFTV9BQ19MSVRFX01PREUpCisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7CisJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RSSVZFUl9ERUZBVUxUX01PREUpIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOworCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5kZWZhdWx0X2Nsb2NrX21vZGUgPQorCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdOworCX0gZWxzZSBpZiAoc3RhdGVfaW5kZXggPT0gMCkgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5mbGFncyB8PQorCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2F0b21iaW9zX3BhcnNlX3Bvd2VyX3RhYmxlXzFfMyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKKwl1MzIgbWlzYywgbWlzYzIgPSAwOworCWludCBudW1fbW9kZXMgPSAwLCBpOworCWludCBzdGF0ZV9pbmRleCA9IDA7CisJc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBpMmNfYnVzOworCXVuaW9uIHBvd2VyX2luZm8gKnBvd2VyX2luZm87CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgUG93ZXJQbGF5SW5mbyk7CisgICAgICAgIHUxNiBkYXRhX29mZnNldDsKKwl1OCBmcmV2LCBjcmV2OworCisJaWYgKCFhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LCBpbmRleCwgTlVMTCwKKwkJCQkgICAmZnJldiwgJmNyZXYsICZkYXRhX29mZnNldCkpCisJCXJldHVybiBzdGF0ZV9pbmRleDsKKwlwb3dlcl9pbmZvID0gKHVuaW9uIHBvd2VyX2luZm8gKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCk7CisKKwkvKiBhZGQgdGhlIGkyYyBidXMgZm9yIHRoZXJtYWwvZmFuIGNoaXAgKi8KKwlpZiAocG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZVRoZXJtYWxDb250cm9sbGVyID4gMCkgeworCQlEUk1fSU5GTygiUG9zc2libGUgJXMgdGhlcm1hbCBjb250cm9sbGVyIGF0IDB4JTAyeFxuIiwKKwkJCSB0aGVybWFsX2NvbnRyb2xsZXJfbmFtZXNbcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZVRoZXJtYWxDb250cm9sbGVyXSwKKwkJCSBwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlQ29udHJvbGxlckFkZHJlc3MgPj4gMSk7CisJCWkyY19idXMgPSByYWRlb25fbG9va3VwX2kyY19ncGlvKHJkZXYsIHBvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVJMmNMaW5lKTsKKwkJcmRldi0+cG0uaTJjX2J1cyA9IHJhZGVvbl9pMmNfbG9va3VwKHJkZXYsICZpMmNfYnVzKTsKKwkJaWYgKHJkZXYtPnBtLmkyY19idXMpIHsKKwkJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvID0geyB9OworCQkJY29uc3QgY2hhciAqbmFtZSA9IHRoZXJtYWxfY29udHJvbGxlcl9uYW1lc1twb3dlcl9pbmZvLT5pbmZvLgorCQkJCQkJCQkgICAgdWNPdmVyZHJpdmVUaGVybWFsQ29udHJvbGxlcl07CisJCQlpbmZvLmFkZHIgPSBwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlQ29udHJvbGxlckFkZHJlc3MgPj4gMTsKKwkJCXN0cmxjcHkoaW5mby50eXBlLCBuYW1lLCBzaXplb2YoaW5mby50eXBlKSk7CisJCQlpMmNfbmV3X2RldmljZSgmcmRldi0+cG0uaTJjX2J1cy0+YWRhcHRlciwgJmluZm8pOworCQl9CisJfQorCW51bV9tb2RlcyA9IHBvd2VyX2luZm8tPmluZm8udWNOdW1PZlBvd2VyTW9kZUVudHJpZXM7CisJaWYgKG51bV9tb2RlcyA+IEFUT01fTUFYX05VTUJFUk9GX1BPV0VSX0JMT0NLKQorCQludW1fbW9kZXMgPSBBVE9NX01BWF9OVU1CRVJPRl9QT1dFUl9CTE9DSzsKKwkvKiBsYXN0IG1vZGUgaXMgdXN1YWxseSBkZWZhdWx0LCBhcnJheSBpcyBsb3cgdG8gaGlnaCAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbW9kZXM7IGkrKykgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPSBWT0xUQUdFX05PTkU7CisJCXN3aXRjaCAoZnJldikgeworCQljYXNlIDE6CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQorCQkJCWxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVzTWVtb3J5Q2xvY2spOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9CisJCQkJbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udXNFbmdpbmVDbG9jayk7CisJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KKwkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9PSAwKSB8fAorCQkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID09IDApKQorCQkJCWNvbnRpbnVlOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPQorCQkJCXBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOworCQkJbWlzYyA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVsTWlzY0luZm8pOworCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKKwkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9CisJCQkJCVZPTFRBR0VfR1BJTzsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQorCQkJCQlyYWRlb25fbG9va3VwX2dwaW8ocmRldiwKKwkJCQkJCQkgICBwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXgpOworCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpCisJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQorCQkJCQkJdHJ1ZTsKKwkJCQllbHNlCisJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQorCQkJCQkJZmFsc2U7CisJCQl9IGVsc2UgaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BST0dSQU1fVk9MVEFHRSkgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9CisJCQkJCVZPTFRBR0VfVkREQzsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNfaWQgPQorCQkJCQlwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXg7CisJCQl9CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSBSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKKwkJCXJhZGVvbl9hdG9tYmlvc19wYXJzZV9taXNjX2ZsYWdzXzFfMyhyZGV2LCBzdGF0ZV9pbmRleCwgbWlzYywgMCk7CisJCQlzdGF0ZV9pbmRleCsrOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9CisJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1lbW9yeUNsb2NrKTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQorCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxFbmdpbmVDbG9jayk7CisJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KKwkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9PSAwKSB8fAorCQkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID09IDApKQorCQkJCWNvbnRpbnVlOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPQorCQkJCXBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWNOdW1QY2lFTGFuZXM7CisJCQltaXNjID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvKTsKKwkJCW1pc2MyID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvMik7CisJCQlpZiAoKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9TVVBQT1JUKSB8fAorCQkJICAgIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpKSB7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KKwkJCQkJVk9MVEFHRV9HUElPOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuZ3BpbyA9CisJCQkJCXJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LAorCQkJCQkJCSAgIHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4KTsKKwkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKQorCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KKwkJCQkJCXRydWU7CisJCQkJZWxzZQorCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KKwkJCQkJCWZhbHNlOworCQkJfSBlbHNlIGlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19QUk9HUkFNX1ZPTFRBR0UpIHsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQorCQkJCQlWT0xUQUdFX1ZEREM7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjX2lkID0KKwkJCQkJcG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXg7CisJCQl9CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSBSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKKwkJCXJhZGVvbl9hdG9tYmlvc19wYXJzZV9taXNjX2ZsYWdzXzFfMyhyZGV2LCBzdGF0ZV9pbmRleCwgbWlzYywgbWlzYzIpOworCQkJc3RhdGVfaW5kZXgrKzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQorCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNZW1vcnlDbG9jayk7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID0KKwkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsRW5naW5lQ2xvY2spOworCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCisJCQlpZiAoKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPT0gMCkgfHwKKwkJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9PSAwKSkKKwkJCQljb250aW51ZTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KKwkJCQlwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOworCQkJbWlzYyA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbyk7CisJCQltaXNjMiA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbzIpOworCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKKwkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9CisJCQkJCVZPTFRBR0VfR1BJTzsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQorCQkJCQlyYWRlb25fbG9va3VwX2dwaW8ocmRldiwKKwkJCQkJCQkgICBwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjVm9sdGFnZURyb3BJbmRleCk7CisJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9CisJCQkJCQl0cnVlOworCQkJCWVsc2UKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9CisJCQkJCQlmYWxzZTsKKwkJCX0gZWxzZSBpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUFJPR1JBTV9WT0xUQUdFKSB7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KKwkJCQkJVk9MVEFHRV9WRERDOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY19pZCA9CisJCQkJCXBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4OworCQkJCWlmIChtaXNjMiAmIEFUT01fUE1fTUlTQ0lORk8yX1ZERENJX0RZTkFNSUNfVk9MVEFHRV9FTikgeworCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNpX2VuYWJsZWQgPQorCQkJCQkJdHJ1ZTsKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjaV9pZCA9CisJCQkJCQlwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjVkREQ0lfVm9sdGFnZURyb3BJbmRleDsKKwkJCQl9CisJCQl9CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSBSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKKwkJCXJhZGVvbl9hdG9tYmlvc19wYXJzZV9taXNjX2ZsYWdzXzFfMyhyZGV2LCBzdGF0ZV9pbmRleCwgbWlzYywgbWlzYzIpOworCQkJc3RhdGVfaW5kZXgrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIGxhc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQgKi8KKwlpZiAocmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9PSAtMSkgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleCAtIDFdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOworCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXggLSAxOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleCAtIDFdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CisJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS5jbG9ja19pbmZvWzBdOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KKwkJCX5SQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSAwOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYzIgPSAwOworCX0KKwlyZXR1cm4gc3RhdGVfaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl9hdG9tYmlvc19hZGRfcHBsaWJfdGhlcm1hbF9jb250cm9sbGVyKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJCSBBVE9NX1BQTElCX1RIRVJNQUxDT05UUk9MTEVSICpjb250cm9sbGVyKQoreworCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgaTJjX2J1czsKKworCS8qIGFkZCB0aGUgaTJjIGJ1cyBmb3IgdGhlcm1hbC9mYW4gY2hpcCAqLworCWlmIChjb250cm9sbGVyLT51Y1R5cGUgPiAwKSB7CisJCWlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9SVjZ4eCkgeworCQkJRFJNX0lORk8oIkludGVybmFsIHRoZXJtYWwgY29udHJvbGxlciAlcyBmYW4gY29udHJvbFxuIiwKKwkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCisJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKKwkJCXJkZXYtPnBtLmludF90aGVybWFsX3R5cGUgPSBUSEVSTUFMX1RZUEVfUlY2WFg7CisJCX0gZWxzZSBpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfUlY3NzApIHsKKwkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCisJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX1JWNzcwOworCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VWRVJHUkVFTikgeworCQkJRFJNX0lORk8oIkludGVybmFsIHRoZXJtYWwgY29udHJvbGxlciAlcyBmYW4gY29udHJvbFxuIiwKKwkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCisJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKKwkJCXJkZXYtPnBtLmludF90aGVybWFsX3R5cGUgPSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOworCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX1NVTU8pIHsKKwkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCisJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX1NVTU87CisJCX0gZWxzZSBpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfTklTTEFORFMpIHsKKwkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCisJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX05JOworCQl9IGVsc2UgaWYgKChjb250cm9sbGVyLT51Y1R5cGUgPT0KKwkJCSAgICBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VYVEVSTkFMX0dQSU8pIHx8CisJCQkgICAoY29udHJvbGxlci0+dWNUeXBlID09CisJCQkgICAgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9BRFQ3NDczX1dJVEhfSU5URVJOQUwpIHx8CisJCQkgICAoY29udHJvbGxlci0+dWNUeXBlID09CisJCQkgICAgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FTUMyMTAzX1dJVEhfSU5URVJOQUwpKSB7CisJCQlEUk1fSU5GTygiU3BlY2lhbCB0aGVybWFsIGNvbnRyb2xsZXIgY29uZmlnXG4iKTsKKwkJfSBlbHNlIHsKKwkJCURSTV9JTkZPKCJQb3NzaWJsZSAlcyB0aGVybWFsIGNvbnRyb2xsZXIgYXQgMHglMDJ4ICVzIGZhbiBjb250cm9sXG4iLAorCQkJCSBwcF9saWJfdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW2NvbnRyb2xsZXItPnVjVHlwZV0sCisJCQkJIGNvbnRyb2xsZXItPnVjSTJjQWRkcmVzcyA+PiAxLAorCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKKwkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOworCQkJaTJjX2J1cyA9IHJhZGVvbl9sb29rdXBfaTJjX2dwaW8ocmRldiwgY29udHJvbGxlci0+dWNJMmNMaW5lKTsKKwkJCXJkZXYtPnBtLmkyY19idXMgPSByYWRlb25faTJjX2xvb2t1cChyZGV2LCAmaTJjX2J1cyk7CisJCQlpZiAocmRldi0+cG0uaTJjX2J1cykgeworCQkJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvID0geyB9OworCQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwcF9saWJfdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW2NvbnRyb2xsZXItPnVjVHlwZV07CisJCQkJaW5mby5hZGRyID0gY29udHJvbGxlci0+dWNJMmNBZGRyZXNzID4+IDE7CisJCQkJc3RybGNweShpbmZvLnR5cGUsIG5hbWUsIHNpemVvZihpbmZvLnR5cGUpKTsKKwkJCQlpMmNfbmV3X2RldmljZSgmcmRldi0+cG0uaTJjX2J1cy0+YWRhcHRlciwgJmluZm8pOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdTE2IHJhZGVvbl9hdG9tYmlvc19nZXRfZGVmYXVsdF92ZGRjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCByYWRlb25fbW9kZV9pbmZvICptb2RlX2luZm8gPSAmcmRldi0+bW9kZV9pbmZvOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIEZpcm13YXJlSW5mbyk7CisJdTggZnJldiwgY3JldjsKKwl1MTYgZGF0YV9vZmZzZXQ7CisJdW5pb24gZmlybXdhcmVfaW5mbyAqZmlybXdhcmVfaW5mbzsKKwl1MTYgdmRkYyA9IDA7CisKKwlpZiAoYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCisJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKSB7CisJCWZpcm13YXJlX2luZm8gPQorCQkJKHVuaW9uIGZpcm13YXJlX2luZm8gKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKworCQkJCQkJZGF0YV9vZmZzZXQpOworCQl2ZGRjID0gZmlybXdhcmVfaW5mby0+aW5mb18xNC51c0Jvb3RVcFZERENWb2x0YWdlOworCX0KKworCXJldHVybiB2ZGRjOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfbm9uX2Nsb2NrX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCQkgICAgICAgaW50IHN0YXRlX2luZGV4LCBpbnQgbW9kZV9pbmRleCwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqbm9uX2Nsb2NrX2luZm8pCit7CisJaW50IGo7CisJdTMyIG1pc2MgPSBsZTMyX3RvX2NwdShub25fY2xvY2tfaW5mby0+dWxDYXBzQW5kU2V0dGluZ3MpOworCXUzMiBtaXNjMiA9IGxlMTZfdG9fY3B1KG5vbl9jbG9ja19pbmZvLT51c0NsYXNzaWZpY2F0aW9uKTsKKwl1MTYgdmRkYyA9IHJhZGVvbl9hdG9tYmlvc19nZXRfZGVmYXVsdF92ZGRjKHJkZXYpOworCisJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSBtaXNjOworCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IG1pc2MyOworCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KKwkJKChtaXNjICYgQVRPTV9QUExJQl9QQ0lFX0xJTktfV0lEVEhfTUFTSykgPj4KKwkJIEFUT01fUFBMSUJfUENJRV9MSU5LX1dJRFRIX1NISUZUKSArIDE7CisJc3dpdGNoIChtaXNjMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTUFTSykgeworCWNhc2UgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9CQVRURVJZOgorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7CisJCWJyZWFrOworCWNhc2UgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9CQUxBTkNFRDoKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKKwkJYnJlYWs7CisJY2FzZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX1BFUkZPUk1BTkNFOgorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFOworCQlicmVhazsKKwljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTk9ORToKKwkJaWYgKG1pc2MyICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl8zRFBFUkZPUk1BTkNFKQorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7CisJCWJyZWFrOworCX0KKwlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSAwOworCWlmIChtaXNjICYgQVRPTV9QUExJQl9TSU5HTEVfRElTUExBWV9PTkxZKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgfD0KKwkJCVJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOworCWlmIChtaXNjMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fQk9PVCkgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7CisJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CisJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleCAtIDFdOworCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCQkvKiBOSSBjaGlwcyBwb3N0IHdpdGhvdXQgTUMgdWNvZGUsIHNvIGRlZmF1bHQgY2xvY2tzIGFyZSBzdHJvYmUgbW9kZSBvbmx5ICovCisJCQlyZGV2LT5wbS5kZWZhdWx0X3NjbGsgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrOworCQkJcmRldi0+cG0uZGVmYXVsdF9tY2xrID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsazsKKwkJCXJkZXYtPnBtLmRlZmF1bHRfdmRkYyA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2Uudm9sdGFnZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHBhdGNoIHRoZSB0YWJsZSB2YWx1ZXMgd2l0aCB0aGUgZGVmYXVsdCBzbGNrL21jbGsgZnJvbSBmaXJtd2FyZSBpbmZvICovCisJCQlmb3IgKGogPSAwOyBqIDwgbW9kZV9pbmRleDsgaisrKSB7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bal0ubWNsayA9CisJCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1tqXS5zY2xrID0KKwkJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOworCQkJCWlmICh2ZGRjKQorCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1tqXS52b2x0YWdlLnZvbHRhZ2UgPQorCQkJCQkJdmRkYzsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGJvb2wgcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX2Nsb2NrX2luZm8oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCisJCQkJCQkgICBpbnQgc3RhdGVfaW5kZXgsIGludCBtb2RlX2luZGV4LAorCQkJCQkJICAgdW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqY2xvY2tfaW5mbykKK3sKKwl1MzIgc2NsaywgbWNsazsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKKwkJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1BBTE0pIHsKKwkJCXNjbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT5zdW1vLnVzRW5naW5lQ2xvY2tMb3cpOworCQkJc2NsayB8PSBjbG9ja19pbmZvLT5zdW1vLnVjRW5naW5lQ2xvY2tIaWdoIDw8IDE2OworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7CisJCX0gZWxzZSB7CisJCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+cnM3ODAudXNMb3dFbmdpbmVDbG9ja0xvdyk7CisJCQlzY2xrIHw9IGNsb2NrX2luZm8tPnJzNzgwLnVjTG93RW5naW5lQ2xvY2tIaWdoIDw8IDE2OworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7CisJCX0KKwl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+ZXZlcmdyZWVuLnVzRW5naW5lQ2xvY2tMb3cpOworCQlzY2xrIHw9IGNsb2NrX2luZm8tPmV2ZXJncmVlbi51Y0VuZ2luZUNsb2NrSGlnaCA8PCAxNjsKKwkJbWNsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPmV2ZXJncmVlbi51c01lbW9yeUNsb2NrTG93KTsKKwkJbWNsayB8PSBjbG9ja19pbmZvLT5ldmVyZ3JlZW4udWNNZW1vcnlDbG9ja0hpZ2ggPDwgMTY7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLm1jbGsgPSBtY2xrOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID0gc2NsazsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS50eXBlID0KKwkJCVZPTFRBR0VfU1c7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2Uudm9sdGFnZSA9CisJCQljbG9ja19pbmZvLT5ldmVyZ3JlZW4udXNWRERDOworCX0gZWxzZSB7CisJCXNjbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT5yNjAwLnVzRW5naW5lQ2xvY2tMb3cpOworCQlzY2xrIHw9IGNsb2NrX2luZm8tPnI2MDAudWNFbmdpbmVDbG9ja0hpZ2ggPDwgMTY7CisJCW1jbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT5yNjAwLnVzTWVtb3J5Q2xvY2tMb3cpOworCQltY2xrIHw9IGNsb2NrX2luZm8tPnI2MDAudWNNZW1vcnlDbG9ja0hpZ2ggPDwgMTY7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLm1jbGsgPSBtY2xrOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID0gc2NsazsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS50eXBlID0KKwkJCVZPTFRBR0VfU1c7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2Uudm9sdGFnZSA9CisJCQljbG9ja19pbmZvLT5yNjAwLnVzVkREQzsKKwl9CisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CisJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLworCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLworCQlpZiAoKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLm1jbGsgPT0gMCkgfHwKKwkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCByYWRlb25fYXRvbWJpb3NfcGFyc2VfcG93ZXJfdGFibGVfNF81KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCByYWRlb25fbW9kZV9pbmZvICptb2RlX2luZm8gPSAmcmRldi0+bW9kZV9pbmZvOworCXN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICpub25fY2xvY2tfaW5mbzsKKwl1bmlvbiBwcGxpYl9wb3dlcl9zdGF0ZSAqcG93ZXJfc3RhdGU7CisJaW50IGksIGo7CisJaW50IHN0YXRlX2luZGV4ID0gMCwgbW9kZV9pbmRleCA9IDA7CisJdW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqY2xvY2tfaW5mbzsKKwlib29sIHZhbGlkOworCXVuaW9uIHBvd2VyX2luZm8gKnBvd2VyX2luZm87CisJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgUG93ZXJQbGF5SW5mbyk7CisgICAgICAgIHUxNiBkYXRhX29mZnNldDsKKwl1OCBmcmV2LCBjcmV2OworCisJaWYgKCFhdG9tX3BhcnNlX2RhdGFfaGVhZGVyKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LCBpbmRleCwgTlVMTCwKKwkJCQkgICAmZnJldiwgJmNyZXYsICZkYXRhX29mZnNldCkpCisJCXJldHVybiBzdGF0ZV9pbmRleDsKKwlwb3dlcl9pbmZvID0gKHVuaW9uIHBvd2VyX2luZm8gKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCk7CisKKwlyYWRlb25fYXRvbWJpb3NfYWRkX3BwbGliX3RoZXJtYWxfY29udHJvbGxlcihyZGV2LCAmcG93ZXJfaW5mby0+cHBsaWIuc1RoZXJtYWxDb250cm9sbGVyKTsKKwkvKiBmaXJzdCBtb2RlIGlzIHVzdWFsbHkgZGVmYXVsdCwgZm9sbG93ZWQgYnkgbG93IHRvIGhpZ2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgcG93ZXJfaW5mby0+cHBsaWIudWNOdW1TdGF0ZXM7IGkrKykgeworCQltb2RlX2luZGV4ID0gMDsKKwkJcG93ZXJfc3RhdGUgPSAodW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgKikKKwkJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKKwkJCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5wcGxpYi51c1N0YXRlQXJyYXlPZmZzZXQpICsKKwkJCSBpICogcG93ZXJfaW5mby0+cHBsaWIudWNTdGF0ZUVudHJ5U2l6ZSk7CisJCW5vbl9jbG9ja19pbmZvID0gKHN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICopCisJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNOb25DbG9ja0luZm9BcnJheU9mZnNldCkgKworCQkJIChwb3dlcl9zdGF0ZS0+djEudWNOb25DbG9ja1N0YXRlSW5kZXggKgorCQkJICBwb3dlcl9pbmZvLT5wcGxpYi51Y05vbkNsb2NrU2l6ZSkpOworCQlmb3IgKGogPSAwOyBqIDwgKHBvd2VyX2luZm8tPnBwbGliLnVjU3RhdGVFbnRyeVNpemUgLSAxKTsgaisrKSB7CisJCQljbG9ja19pbmZvID0gKHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKikKKwkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPnBwbGliLnVzQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKKwkJCQkgKHBvd2VyX3N0YXRlLT52MS51Y0Nsb2NrU3RhdGVJbmRpY2VzW2pdICoKKwkJCQkgIHBvd2VyX2luZm8tPnBwbGliLnVjQ2xvY2tJbmZvU2l6ZSkpOworCQkJdmFsaWQgPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfY2xvY2tfaW5mbyhyZGV2LAorCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCSAgICAgICBjbG9ja19pbmZvKTsKKwkJCWlmICh2YWxpZCkKKwkJCQltb2RlX2luZGV4Kys7CisJCX0KKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IG1vZGVfaW5kZXg7CisJCWlmIChtb2RlX2luZGV4KSB7CisJCQlyYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfbm9uX2Nsb2NrX2luZm8ocmRldiwgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCSAgIG5vbl9jbG9ja19pbmZvKTsKKwkJCXN0YXRlX2luZGV4Kys7CisJCX0KKwl9CisJLyogaWYgbXVsdGlwbGUgY2xvY2sgbW9kZXMsIG1hcmsgdGhlIGxvd2VzdCBhcyBubyBkaXNwbGF5ICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlX2luZGV4OyBpKyspIHsKKwkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLm51bV9jbG9ja19tb2RlcyA+IDEpCisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5jbG9ja19pbmZvWzBdLmZsYWdzIHw9CisJCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKKwl9CisJLyogZmlyc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQgKi8KKwlpZiAocmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9PSAtMSkgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKKwkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IDA7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CisJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mb1swXTsKKwl9CisJcmV0dXJuIHN0YXRlX2luZGV4OworfQorCitzdGF0aWMgaW50IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wb3dlcl90YWJsZV82KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXN0cnVjdCByYWRlb25fbW9kZV9pbmZvICptb2RlX2luZm8gPSAmcmRldi0+bW9kZV9pbmZvOworCXN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICpub25fY2xvY2tfaW5mbzsKKwl1bmlvbiBwcGxpYl9wb3dlcl9zdGF0ZSAqcG93ZXJfc3RhdGU7CisJaW50IGksIGosIG5vbl9jbG9ja19hcnJheV9pbmRleCwgY2xvY2tfYXJyYXlfaW5kZXg7CisJaW50IHN0YXRlX2luZGV4ID0gMCwgbW9kZV9pbmRleCA9IDA7CisJdW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqY2xvY2tfaW5mbzsKKwlzdHJ1Y3QgU3RhdGVBcnJheSAqc3RhdGVfYXJyYXk7CisJc3RydWN0IENsb2NrSW5mb0FycmF5ICpjbG9ja19pbmZvX2FycmF5OworCXN0cnVjdCBOb25DbG9ja0luZm9BcnJheSAqbm9uX2Nsb2NrX2luZm9fYXJyYXk7CisJYm9vbCB2YWxpZDsKKwl1bmlvbiBwb3dlcl9pbmZvICpwb3dlcl9pbmZvOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIFBvd2VyUGxheUluZm8pOworICAgICAgICB1MTYgZGF0YV9vZmZzZXQ7CisJdTggZnJldiwgY3JldjsKKworCWlmICghYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCisJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKQorCQlyZXR1cm4gc3RhdGVfaW5kZXg7CisJcG93ZXJfaW5mbyA9ICh1bmlvbiBwb3dlcl9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQpOworCisJcmFkZW9uX2F0b21iaW9zX2FkZF9wcGxpYl90aGVybWFsX2NvbnRyb2xsZXIocmRldiwgJnBvd2VyX2luZm8tPnBwbGliLnNUaGVybWFsQ29udHJvbGxlcik7CisJc3RhdGVfYXJyYXkgPSAoc3RydWN0IFN0YXRlQXJyYXkgKikKKwkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkgcG93ZXJfaW5mby0+cHBsaWIudXNTdGF0ZUFycmF5T2Zmc2V0KTsKKwljbG9ja19pbmZvX2FycmF5ID0gKHN0cnVjdCBDbG9ja0luZm9BcnJheSAqKQorCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCSBwb3dlcl9pbmZvLT5wcGxpYi51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KTsKKwlub25fY2xvY2tfaW5mb19hcnJheSA9IChzdHJ1Y3QgTm9uQ2xvY2tJbmZvQXJyYXkgKikKKwkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkgcG93ZXJfaW5mby0+cHBsaWIudXNOb25DbG9ja0luZm9BcnJheU9mZnNldCk7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlX2FycmF5LT51Y051bUVudHJpZXM7IGkrKykgeworCQltb2RlX2luZGV4ID0gMDsKKwkJcG93ZXJfc3RhdGUgPSAodW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgKikmc3RhdGVfYXJyYXktPnN0YXRlc1tpXTsKKwkJLyogWFhYIHRoaXMgbWlnaHQgYmUgYW4gaW5hZ3VhIGJ1Zy4uLiAqLworCQlub25fY2xvY2tfYXJyYXlfaW5kZXggPSBpOyAvKiBwb3dlcl9zdGF0ZS0+djIubm9uQ2xvY2tJbmZvSW5kZXggKi8KKwkJbm9uX2Nsb2NrX2luZm8gPSAoc3RydWN0IF9BVE9NX1BQTElCX05PTkNMT0NLX0lORk8gKikKKwkJCSZub25fY2xvY2tfaW5mb19hcnJheS0+bm9uQ2xvY2tJbmZvW25vbl9jbG9ja19hcnJheV9pbmRleF07CisJCWZvciAoaiA9IDA7IGogPCBwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZlbHM7IGorKykgeworCQkJY2xvY2tfYXJyYXlfaW5kZXggPSBwb3dlcl9zdGF0ZS0+djIuY2xvY2tJbmZvSW5kZXhbal07CisJCQkvKiBYWFggdGhpcyBtaWdodCBiZSBhbiBpbmFndWEgYnVnLi4uICovCisJCQlpZiAoY2xvY2tfYXJyYXlfaW5kZXggPj0gY2xvY2tfaW5mb19hcnJheS0+dWNOdW1FbnRyaWVzKQorCQkJCWNvbnRpbnVlOworCQkJY2xvY2tfaW5mbyA9ICh1bmlvbiBwcGxpYl9jbG9ja19pbmZvICopCisJCQkJJmNsb2NrX2luZm9fYXJyYXktPmNsb2NrSW5mb1tjbG9ja19hcnJheV9pbmRleF07CisJCQl2YWxpZCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9jbG9ja19pbmZvKHJkZXYsCisJCQkJCQkJCSAgICAgICBzdGF0ZV9pbmRleCwgbW9kZV9pbmRleCwKKwkJCQkJCQkJICAgICAgIGNsb2NrX2luZm8pOworCQkJaWYgKHZhbGlkKQorCQkJCW1vZGVfaW5kZXgrKzsKKwkJfQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gbW9kZV9pbmRleDsKKwkJaWYgKG1vZGVfaW5kZXgpIHsKKwkJCXJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9ub25fY2xvY2tfaW5mbyhyZGV2LCBzdGF0ZV9pbmRleCwgbW9kZV9pbmRleCwKKwkJCQkJCQkJICAgbm9uX2Nsb2NrX2luZm8pOworCQkJc3RhdGVfaW5kZXgrKzsKKwkJfQorCX0KKwkvKiBpZiBtdWx0aXBsZSBjbG9jayBtb2RlcywgbWFyayB0aGUgbG93ZXN0IGFzIG5vIGRpc3BsYXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGVfaW5kZXg7IGkrKykgeworCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGVbaV0ubnVtX2Nsb2NrX21vZGVzID4gMSkKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLmNsb2NrX2luZm9bMF0uZmxhZ3MgfD0KKwkJCQlSQURFT05fUE1fTU9ERV9OT19ESVNQTEFZOworCX0KKwkvKiBmaXJzdCBtb2RlIGlzIHVzdWFsbHkgZGVmYXVsdCAqLworCWlmIChyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID09IC0xKSB7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOworCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gMDsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uZGVmYXVsdF9jbG9ja19tb2RlID0KKwkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS5jbG9ja19pbmZvWzBdOworCX0KKwlyZXR1cm4gc3RhdGVfaW5kZXg7Cit9CisKIHZvaWQgcmFkZW9uX2F0b21iaW9zX2dldF9wb3dlcl9tb2RlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKIAlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBQb3dlclBsYXlJbmZvKTsKIAl1MTYgZGF0YV9vZmZzZXQ7CiAJdTggZnJldiwgY3JldjsKLQl1MzIgbWlzYywgbWlzYzIgPSAwLCBzY2xrLCBtY2xrOwotCXVuaW9uIHBvd2VyX2luZm8gKnBvd2VyX2luZm87Ci0Jc3RydWN0IF9BVE9NX1BQTElCX05PTkNMT0NLX0lORk8gKm5vbl9jbG9ja19pbmZvOwotCXN0cnVjdCBfQVRPTV9QUExJQl9TVEFURSAqcG93ZXJfc3RhdGU7Ci0JaW50IG51bV9tb2RlcyA9IDAsIGksIGo7Ci0JaW50IHN0YXRlX2luZGV4ID0gMCwgbW9kZV9pbmRleCA9IDA7Ci0Jc3RydWN0IHJhZGVvbl9pMmNfYnVzX3JlYyBpMmNfYnVzOworCWludCBzdGF0ZV9pbmRleCA9IDA7CiAKIAlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gLTE7CiAKIAlpZiAoYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCiAJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKSB7Ci0JCXBvd2VyX2luZm8gPSAodW5pb24gcG93ZXJfaW5mbyAqKShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0KTsKLQkJaWYgKGZyZXYgPCA0KSB7Ci0JCQkvKiBhZGQgdGhlIGkyYyBidXMgZm9yIHRoZXJtYWwvZmFuIGNoaXAgKi8KLQkJCWlmIChwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlVGhlcm1hbENvbnRyb2xsZXIgPiAwKSB7Ci0JCQkJRFJNX0lORk8oIlBvc3NpYmxlICVzIHRoZXJtYWwgY29udHJvbGxlciBhdCAweCUwMnhcbiIsCi0JCQkJCSB0aGVybWFsX2NvbnRyb2xsZXJfbmFtZXNbcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZVRoZXJtYWxDb250cm9sbGVyXSwKLQkJCQkJIHBvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVDb250cm9sbGVyQWRkcmVzcyA+PiAxKTsKLQkJCQlpMmNfYnVzID0gcmFkZW9uX2xvb2t1cF9pMmNfZ3BpbyhyZGV2LCBwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlSTJjTGluZSk7Ci0JCQkJcmRldi0+cG0uaTJjX2J1cyA9IHJhZGVvbl9pMmNfbG9va3VwKHJkZXYsICZpMmNfYnVzKTsKLQkJCQlpZiAocmRldi0+cG0uaTJjX2J1cykgewotCQkJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbyA9IHsgfTsKLQkJCQkJY29uc3QgY2hhciAqbmFtZSA9IHRoZXJtYWxfY29udHJvbGxlcl9uYW1lc1twb3dlcl9pbmZvLT5pbmZvLgotCQkJCQkJCQkJCSAgICB1Y092ZXJkcml2ZVRoZXJtYWxDb250cm9sbGVyXTsKLQkJCQkJaW5mby5hZGRyID0gcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZUNvbnRyb2xsZXJBZGRyZXNzID4+IDE7Ci0JCQkJCXN0cmxjcHkoaW5mby50eXBlLCBuYW1lLCBzaXplb2YoaW5mby50eXBlKSk7Ci0JCQkJCWkyY19uZXdfZGV2aWNlKCZyZGV2LT5wbS5pMmNfYnVzLT5hZGFwdGVyLCAmaW5mbyk7Ci0JCQkJfQotCQkJfQotCQkJbnVtX21vZGVzID0gcG93ZXJfaW5mby0+aW5mby51Y051bU9mUG93ZXJNb2RlRW50cmllczsKLQkJCWlmIChudW1fbW9kZXMgPiBBVE9NX01BWF9OVU1CRVJPRl9QT1dFUl9CTE9DSykKLQkJCQludW1fbW9kZXMgPSBBVE9NX01BWF9OVU1CRVJPRl9QT1dFUl9CTE9DSzsKLQkJCS8qIGxhc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQsIGFycmF5IGlzIGxvdyB0byBoaWdoICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspIHsKLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPSBWT0xUQUdFX05PTkU7Ci0JCQkJc3dpdGNoIChmcmV2KSB7Ci0JCQkJY2FzZSAxOgotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9Ci0JCQkJCQlsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51c01lbW9yeUNsb2NrKTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9Ci0JCQkJCQlsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51c0VuZ2luZUNsb2NrKTsKLQkJCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCi0JCQkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9PSAwKSB8fAotCQkJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPT0gMCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPQotCQkJCQkJcG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udWNOdW1QY2lFTGFuZXM7Ci0JCQkJCW1pc2MgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvKTsKLQkJCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKLQkJCQkJICAgIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfR1BJTzsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuZ3BpbyA9Ci0JCQkJCQkJcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCi0JCQkJCQkJcG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4KTsKLQkJCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCXRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCWZhbHNlOwotCQkJCQl9IGVsc2UgaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BST0dSQU1fVk9MVEFHRSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX1ZEREM7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNfaWQgPQotCQkJCQkJCXBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVjVm9sdGFnZURyb3BJbmRleDsKLQkJCQkJfQotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSBSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSBtaXNjOwotCQkJCQkvKiBvcmRlciBtYXR0ZXJzISAqLwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUE9XRVJfU0FWSU5HX01PREUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9QT1dFUlNBVkU7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19ERUZBVUxUX0RDX1NUQVRFX0VOVFJZX1RSVUUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9MT1dfRENfU1RBVEVfRU5UUllfVFJVRSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19MT0FEX0JBTEFOQ0VfRU4pCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPXzNEX0FDQ0VMRVJBVElPTl9FTikgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RSSVZFUl9ERUZBVUxUX01PREUpIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KLQkJCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF07Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCX0gZWxzZSBpZiAoc3RhdGVfaW5kZXggPT0gMCkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uZmxhZ3MgfD0KLQkJCQkJCQlSQURFT05fUE1fTU9ERV9OT19ESVNQTEFZOwotCQkJCQl9Ci0JCQkJCXN0YXRlX2luZGV4Kys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQotCQkJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1lbW9yeUNsb2NrKTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9Ci0JCQkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVsRW5naW5lQ2xvY2spOwotCQkJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KLQkJCQkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID09IDApIHx8Ci0JCQkJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9PSAwKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9Ci0JCQkJCQlwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOwotCQkJCQltaXNjID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvKTsKLQkJCQkJbWlzYzIgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWlzY0luZm8yKTsKLQkJCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKLQkJCQkJICAgIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfR1BJTzsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuZ3BpbyA9Ci0JCQkJCQkJcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCi0JCQkJCQkJcG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXgpOwotCQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KLQkJCQkJCQkJdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KLQkJCQkJCQkJZmFsc2U7Ci0JCQkJCX0gZWxzZSBpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUFJPR1JBTV9WT0xUQUdFKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfVkREQzsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY19pZCA9Ci0JCQkJCQkJcG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXg7Ci0JCQkJCX0KLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gbWlzYzsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MyID0gbWlzYzI7Ci0JCQkJCS8qIG9yZGVyIG1hdHRlcnMhICovCi0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19QT1dFUl9TQVZJTkdfTU9ERSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX1BPV0VSU0FWRTsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RFRkFVTFRfRENfU1RBVEVfRU5UUllfVFJVRSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19ERUZBVUxUX0xPV19EQ19TVEFURV9FTlRSWV9UUlVFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWTsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0xPQURfQkFMQU5DRV9FTikKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fM0RfQUNDRUxFUkFUSU9OX0VOKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRTsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyAmPQotCQkJCQkJCX5SQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQkJfQotCQkJCQlpZiAobWlzYzIgJiBBVE9NX1BNX01JU0NJTkZPMl9TWVNURU1fQUNfTElURV9NT0RFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7Ci0JCQkJCWlmIChtaXNjMiAmIEFUT01fUE1fTUlTQ0lORk8yX01VTFRJX0RJU1BMQVlfU1VQUE9SVCkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyAmPQotCQkJCQkJCX5SQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RSSVZFUl9ERUZBVUxUX01PREUpIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KLQkJCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF07Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCX0gZWxzZSBpZiAoc3RhdGVfaW5kZXggPT0gMCkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uZmxhZ3MgfD0KLQkJCQkJCQlSQURFT05fUE1fTU9ERV9OT19ESVNQTEFZOwotCQkJCQl9Ci0JCQkJCXN0YXRlX2luZGV4Kys7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQotCQkJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1lbW9yeUNsb2NrKTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9Ci0JCQkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsRW5naW5lQ2xvY2spOwotCQkJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KLQkJCQkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID09IDApIHx8Ci0JCQkJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9PSAwKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9Ci0JCQkJCQlwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOwotCQkJCQltaXNjID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvKTsKLQkJCQkJbWlzYzIgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWlzY0luZm8yKTsKLQkJCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKLQkJCQkJICAgIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfR1BJTzsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuZ3BpbyA9Ci0JCQkJCQkJcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCi0JCQkJCQkJcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXgpOwotCQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KLQkJCQkJCQkJdHJ1ZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KLQkJCQkJCQkJZmFsc2U7Ci0JCQkJCX0gZWxzZSBpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUFJPR1JBTV9WT0xUQUdFKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfVkREQzsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY19pZCA9Ci0JCQkJCQkJcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXg7Ci0JCQkJCQlpZiAobWlzYzIgJiBBVE9NX1BNX01JU0NJTkZPMl9WRERDSV9EWU5BTUlDX1ZPTFRBR0VfRU4pIHsKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNpX2VuYWJsZWQgPQotCQkJCQkJCQl0cnVlOwotCQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY2lfaWQgPQotCQkJCQkJCXBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWNWRERDSV9Wb2x0YWdlRHJvcEluZGV4OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyA9IFJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYyA9IG1pc2M7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IG1pc2MyOwotCQkJCQkvKiBvcmRlciBtYXR0ZXJzISAqLwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUE9XRVJfU0FWSU5HX01PREUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9QT1dFUlNBVkU7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19ERUZBVUxUX0RDX1NUQVRFX0VOVFJZX1RSVUUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9MT1dfRENfU1RBVEVfRU5UUllfVFJVRSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19MT0FEX0JBTEFOQ0VfRU4pCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPXzNEX0FDQ0VMRVJBVElPTl9FTikgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1pc2MyICYgQVRPTV9QTV9NSVNDSU5GTzJfU1lTVEVNX0FDX0xJVEVfTU9ERSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fRFJJVkVSX0RFRkFVTFRfTU9ERSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKLQkJCQkJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleDsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5kZWZhdWx0X2Nsb2NrX21vZGUgPQotCQkJCQkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXTsKLQkJCQkJfSBlbHNlIGlmIChzdGF0ZV9pbmRleCA9PSAwKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5mbGFncyB8PQotCQkJCQkJCVJBREVPTl9QTV9NT0RFX05PX0RJU1BMQVk7Ci0JCQkJCX0KLQkJCQkJc3RhdGVfaW5kZXgrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLyogbGFzdCBtb2RlIGlzIHVzdWFsbHkgZGVmYXVsdCAqLwotCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPT0gLTEpIHsKLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleCAtIDFdLnR5cGUgPQotCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4IC0gMTsKLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleCAtIDFdLmRlZmF1bHRfY2xvY2tfbW9kZSA9Ci0JCQkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleCAtIDFdLmNsb2NrX2luZm9bMF07Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkJCX5SQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYyA9IDA7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MyID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBmd19pbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIEZpcm13YXJlSW5mbyk7Ci0JCQl1aW50OF90IGZ3X2ZyZXYsIGZ3X2NyZXY7Ci0JCQl1aW50MTZfdCBmd19kYXRhX29mZnNldCwgdmRkYyA9IDA7Ci0JCQl1bmlvbiBmaXJtd2FyZV9pbmZvICpmaXJtd2FyZV9pbmZvOwotCQkJQVRPTV9QUExJQl9USEVSTUFMQ09OVFJPTExFUiAqY29udHJvbGxlciA9ICZwb3dlcl9pbmZvLT5pbmZvXzQuc1RoZXJtYWxDb250cm9sbGVyOwotCi0JCQlpZiAoYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgZndfaW5kZXgsIE5VTEwsCi0JCQkJCQkgICAmZndfZnJldiwgJmZ3X2NyZXYsICZmd19kYXRhX29mZnNldCkpIHsKLQkJCQlmaXJtd2FyZV9pbmZvID0KLQkJCQkJKHVuaW9uIGZpcm13YXJlX2luZm8gKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkJCQlmd19kYXRhX29mZnNldCk7Ci0JCQkJdmRkYyA9IGZpcm13YXJlX2luZm8tPmluZm9fMTQudXNCb290VXBWRERDVm9sdGFnZTsKLQkJCX0KLQotCQkJLyogYWRkIHRoZSBpMmMgYnVzIGZvciB0aGVybWFsL2ZhbiBjaGlwICovCi0JCQlpZiAoY29udHJvbGxlci0+dWNUeXBlID4gMCkgewotCQkJCWlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9SVjZ4eCkgewotCQkJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAotCQkJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgotCQkJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKLQkJCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9SVjZYWDsKLQkJCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX1JWNzcwKSB7Ci0JCQkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCi0JCQkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCi0JCQkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOwotCQkJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX1JWNzcwOwotCQkJCX0gZWxzZSBpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfRVZFUkdSRUVOKSB7Ci0JCQkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCi0JCQkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCi0JCQkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOwotCQkJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX0VWRVJHUkVFTjsKLQkJCQl9IGVsc2UgaWYgKChjb250cm9sbGVyLT51Y1R5cGUgPT0KLQkJCQkJICAgIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfRVhURVJOQUxfR1BJTykgfHwKLQkJCQkJICAgKGNvbnRyb2xsZXItPnVjVHlwZSA9PQotCQkJCQkgICAgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9BRFQ3NDczX1dJVEhfSU5URVJOQUwpKSB7Ci0JCQkJCURSTV9JTkZPKCJTcGVjaWFsIHRoZXJtYWwgY29udHJvbGxlciBjb25maWdcbiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCURSTV9JTkZPKCJQb3NzaWJsZSAlcyB0aGVybWFsIGNvbnRyb2xsZXIgYXQgMHglMDJ4ICVzIGZhbiBjb250cm9sXG4iLAotCQkJCQkJIHBwX2xpYl90aGVybWFsX2NvbnRyb2xsZXJfbmFtZXNbY29udHJvbGxlci0+dWNUeXBlXSwKLQkJCQkJCSBjb250cm9sbGVyLT51Y0kyY0FkZHJlc3MgPj4gMSwKLQkJCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKLQkJCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7Ci0JCQkJCWkyY19idXMgPSByYWRlb25fbG9va3VwX2kyY19ncGlvKHJkZXYsIGNvbnRyb2xsZXItPnVjSTJjTGluZSk7Ci0JCQkJCXJkZXYtPnBtLmkyY19idXMgPSByYWRlb25faTJjX2xvb2t1cChyZGV2LCAmaTJjX2J1cyk7Ci0JCQkJCWlmIChyZGV2LT5wbS5pMmNfYnVzKSB7Ci0JCQkJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbyA9IHsgfTsKLQkJCQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwcF9saWJfdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW2NvbnRyb2xsZXItPnVjVHlwZV07Ci0JCQkJCQlpbmZvLmFkZHIgPSBjb250cm9sbGVyLT51Y0kyY0FkZHJlc3MgPj4gMTsKLQkJCQkJCXN0cmxjcHkoaW5mby50eXBlLCBuYW1lLCBzaXplb2YoaW5mby50eXBlKSk7Ci0JCQkJCQlpMmNfbmV3X2RldmljZSgmcmRldi0+cG0uaTJjX2J1cy0+YWRhcHRlciwgJmluZm8pOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkvKiBmaXJzdCBtb2RlIGlzIHVzdWFsbHkgZGVmYXVsdCwgZm9sbG93ZWQgYnkgbG93IHRvIGhpZ2ggKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBwb3dlcl9pbmZvLT5pbmZvXzQudWNOdW1TdGF0ZXM7IGkrKykgewotCQkJCW1vZGVfaW5kZXggPSAwOwotCQkJCXBvd2VyX3N0YXRlID0gKHN0cnVjdCBfQVRPTV9QUExJQl9TVEFURSAqKQotCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkgZGF0YV9vZmZzZXQgKwotCQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mb180LnVzU3RhdGVBcnJheU9mZnNldCkgKwotCQkJCQkgaSAqIHBvd2VyX2luZm8tPmluZm9fNC51Y1N0YXRlRW50cnlTaXplKTsKLQkJCQlub25fY2xvY2tfaW5mbyA9IChzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqKQotCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkgZGF0YV9vZmZzZXQgKwotCQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mb180LnVzTm9uQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKLQkJCQkJIChwb3dlcl9zdGF0ZS0+dWNOb25DbG9ja1N0YXRlSW5kZXggKgotCQkJCQkgIHBvd2VyX2luZm8tPmluZm9fNC51Y05vbkNsb2NrU2l6ZSkpOwotCQkJCWZvciAoaiA9IDA7IGogPCAocG93ZXJfaW5mby0+aW5mb180LnVjU3RhdGVFbnRyeVNpemUgLSAxKTsgaisrKSB7Ci0JCQkJCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApIHsKLQkJCQkJCXN0cnVjdCBfQVRPTV9QUExJQl9SUzc4MF9DTE9DS19JTkZPICpjbG9ja19pbmZvID0KLQkJCQkJCQkoc3RydWN0IF9BVE9NX1BQTElCX1JTNzgwX0NMT0NLX0lORk8gKikKLQkJCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkJCSBkYXRhX29mZnNldCArCi0JCQkJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fNC51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KSArCi0JCQkJCQkJIChwb3dlcl9zdGF0ZS0+dWNDbG9ja1N0YXRlSW5kaWNlc1tqXSAqCi0JCQkJCQkJICBwb3dlcl9pbmZvLT5pbmZvXzQudWNDbG9ja0luZm9TaXplKSk7Ci0JCQkJCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+dXNMb3dFbmdpbmVDbG9ja0xvdyk7Ci0JCQkJCQlzY2xrIHw9IGNsb2NrX2luZm8tPnVjTG93RW5naW5lQ2xvY2tIaWdoIDw8IDE2OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7Ci0JCQkJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KLQkJCQkJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQkvKiB2b2x0YWdlIHdvcmtzIGRpZmZlcmVudGx5IG9uIElHUHMgKi8KLQkJCQkJCW1vZGVfaW5kZXgrKzsKLQkJCQkJfSBlbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKLQkJCQkJCXN0cnVjdCBfQVRPTV9QUExJQl9FVkVSR1JFRU5fQ0xPQ0tfSU5GTyAqY2xvY2tfaW5mbyA9Ci0JCQkJCQkJKHN0cnVjdCBfQVRPTV9QUExJQl9FVkVSR1JFRU5fQ0xPQ0tfSU5GTyAqKQotCQkJCQkJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArCi0JCQkJCQkJIGRhdGFfb2Zmc2V0ICsKLQkJCQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mb180LnVzQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKLQkJCQkJCQkgKHBvd2VyX3N0YXRlLT51Y0Nsb2NrU3RhdGVJbmRpY2VzW2pdICoKLQkJCQkJCQkgIHBvd2VyX2luZm8tPmluZm9fNC51Y0Nsb2NrSW5mb1NpemUpKTsKLQkJCQkJCXNjbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT51c0VuZ2luZUNsb2NrTG93KTsKLQkJCQkJCXNjbGsgfD0gY2xvY2tfaW5mby0+dWNFbmdpbmVDbG9ja0hpZ2ggPDwgMTY7Ci0JCQkJCQltY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+dXNNZW1vcnlDbG9ja0xvdyk7Ci0JCQkJCQltY2xrIHw9IGNsb2NrX2luZm8tPnVjTWVtb3J5Q2xvY2tIaWdoIDw8IDE2OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0ubWNsayA9IG1jbGs7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID0gc2NsazsKLQkJCQkJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLwotCQkJCQkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5tY2xrID09IDApIHx8Ci0JCQkJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPT0gMCkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfU1c7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPQotCQkJCQkJCWNsb2NrX2luZm8tPnVzVkREQzsKLQkJCQkJCS8qIFhYWCB1c1ZERENJICovCi0JCQkJCQltb2RlX2luZGV4Kys7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdHJ1Y3QgX0FUT01fUFBMSUJfUjYwMF9DTE9DS19JTkZPICpjbG9ja19pbmZvID0KLQkJCQkJCQkoc3RydWN0IF9BVE9NX1BQTElCX1I2MDBfQ0xPQ0tfSU5GTyAqKQotCQkJCQkJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArCi0JCQkJCQkJIGRhdGFfb2Zmc2V0ICsKLQkJCQkJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mb180LnVzQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKLQkJCQkJCQkgKHBvd2VyX3N0YXRlLT51Y0Nsb2NrU3RhdGVJbmRpY2VzW2pdICoKLQkJCQkJCQkgIHBvd2VyX2luZm8tPmluZm9fNC51Y0Nsb2NrSW5mb1NpemUpKTsKLQkJCQkJCXNjbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT51c0VuZ2luZUNsb2NrTG93KTsKLQkJCQkJCXNjbGsgfD0gY2xvY2tfaW5mby0+dWNFbmdpbmVDbG9ja0hpZ2ggPDwgMTY7Ci0JCQkJCQltY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+dXNNZW1vcnlDbG9ja0xvdyk7Ci0JCQkJCQltY2xrIHw9IGNsb2NrX2luZm8tPnVjTWVtb3J5Q2xvY2tIaWdoIDw8IDE2OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0ubWNsayA9IG1jbGs7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID0gc2NsazsKLQkJCQkJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLwotCQkJCQkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5tY2xrID09IDApIHx8Ci0JCQkJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPT0gMCkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnR5cGUgPQotCQkJCQkJCVZPTFRBR0VfU1c7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPQotCQkJCQkJCWNsb2NrX2luZm8tPnVzVkREQzsKLQkJCQkJCW1vZGVfaW5kZXgrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gbW9kZV9pbmRleDsKLQkJCQlpZiAobW9kZV9pbmRleCkgewotCQkJCQltaXNjID0gbGUzMl90b19jcHUobm9uX2Nsb2NrX2luZm8tPnVsQ2Fwc0FuZFNldHRpbmdzKTsKLQkJCQkJbWlzYzIgPSBsZTE2X3RvX2NwdShub25fY2xvY2tfaW5mby0+dXNDbGFzc2lmaWNhdGlvbik7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gbWlzYzsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MyID0gbWlzYzI7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KLQkJCQkJCSgobWlzYyAmIEFUT01fUFBMSUJfUENJRV9MSU5LX1dJRFRIX01BU0spID4+Ci0JCQkJCQlBVE9NX1BQTElCX1BDSUVfTElOS19XSURUSF9TSElGVCkgKyAxOwotCQkJCQlzd2l0Y2ggKG1pc2MyICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9NQVNLKSB7Ci0JCQkJCWNhc2UgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9CQVRURVJZOgotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfQkFMQU5DRUQ6Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfUEVSRk9STUFOQ0U6Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTk9ORToKLQkJCQkJCWlmIChtaXNjMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fM0RQRVJGT1JNQU5DRSkKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSAwOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUFBMSUJfU0lOR0xFX0RJU1BMQVlfT05MWSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyB8PQotCQkJCQkJCVJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQlpZiAobWlzYzIgJiBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX0JPT1QpIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KLQkJCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleCAtIDFdOwotCQkJCQkJLyogcGF0Y2ggdGhlIHRhYmxlIHZhbHVlcyB3aXRoIHRoZSBkZWZhdWx0IHNsY2svbWNsayBmcm9tIGZpcm13YXJlIGluZm8gKi8KLQkJCQkJCWZvciAoaiA9IDA7IGogPCBtb2RlX2luZGV4OyBqKyspIHsKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1tqXS5tY2xrID0KLQkJCQkJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9tY2xrOwotCQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW2pdLnNjbGsgPQotCQkJCQkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X3NjbGs7Ci0JCQkJCQkJaWYgKHZkZGMpCi0JCQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW2pdLnZvbHRhZ2Uudm9sdGFnZSA9Ci0JCQkJCQkJCQl2ZGRjOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXN0YXRlX2luZGV4Kys7Ci0JCQkJfQotCQkJfQotCQkJLyogaWYgbXVsdGlwbGUgY2xvY2sgbW9kZXMsIG1hcmsgdGhlIGxvd2VzdCBhcyBubyBkaXNwbGF5ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgc3RhdGVfaW5kZXg7IGkrKykgewotCQkJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5udW1fY2xvY2tfbW9kZXMgPiAxKQotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5jbG9ja19pbmZvWzBdLmZsYWdzIHw9Ci0JCQkJCQlSQURFT05fUE1fTU9ERV9OT19ESVNQTEFZOwotCQkJfQotCQkJLyogZmlyc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQgKi8KLQkJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID09IC0xKSB7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0udHlwZSA9Ci0JCQkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKLQkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gMDsKLQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS5kZWZhdWx0X2Nsb2NrX21vZGUgPQotCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mb1swXTsKLQkJCX0KKwkJc3dpdGNoIChmcmV2KSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQlzdGF0ZV9pbmRleCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wb3dlcl90YWJsZV8xXzMocmRldik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCQlzdGF0ZV9pbmRleCA9IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wb3dlcl90YWJsZV80XzUocmRldik7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJc3RhdGVfaW5kZXggPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcG93ZXJfdGFibGVfNihyZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBhZGQgdGhlIGRlZmF1bHQgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCmluZGV4IDhmMmM3YjUuLjFhYmE4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKQEAgLTEzMSw2ICsxMzEsNDUgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgbmlfcmVhZF9kaXNhYmxlZF9iaW9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiBidXNfY250bDsKKwl1MzIgZDF2Z2FfY29udHJvbDsKKwl1MzIgZDJ2Z2FfY29udHJvbDsKKwl1MzIgdmdhX3JlbmRlcl9jb250cm9sOworCXUzMiByb21fY250bDsKKwlib29sIHI7CisKKwlidXNfY250bCA9IFJSRUczMihSNjAwX0JVU19DTlRMKTsKKwlkMXZnYV9jb250cm9sID0gUlJFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wpOworCWQydmdhX2NvbnRyb2wgPSBSUkVHMzIoQVZJVk9fRDJWR0FfQ09OVFJPTCk7CisJdmdhX3JlbmRlcl9jb250cm9sID0gUlJFRzMyKEFWSVZPX1ZHQV9SRU5ERVJfQ09OVFJPTCk7CisJcm9tX2NudGwgPSBSUkVHMzIoUjYwMF9ST01fQ05UTCk7CisKKwkvKiBlbmFibGUgdGhlIHJvbSAqLworCVdSRUczMihSNjAwX0JVU19DTlRMLCAoYnVzX2NudGwgJiB+UjYwMF9CSU9TX1JPTV9ESVMpKTsKKwkvKiBEaXNhYmxlIFZHQSBtb2RlICovCisJV1JFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wsCisJICAgICAgIChkMXZnYV9jb250cm9sICYgfihBVklWT19EVkdBX0NPTlRST0xfTU9ERV9FTkFCTEUgfAorCQlBVklWT19EVkdBX0NPTlRST0xfVElNSU5HX1NFTEVDVCkpKTsKKwlXUkVHMzIoQVZJVk9fRDJWR0FfQ09OVFJPTCwKKwkgICAgICAgKGQydmdhX2NvbnRyb2wgJiB+KEFWSVZPX0RWR0FfQ09OVFJPTF9NT0RFX0VOQUJMRSB8CisJCUFWSVZPX0RWR0FfQ09OVFJPTF9USU1JTkdfU0VMRUNUKSkpOworCVdSRUczMihBVklWT19WR0FfUkVOREVSX0NPTlRST0wsCisJICAgICAgICh2Z2FfcmVuZGVyX2NvbnRyb2wgJiB+QVZJVk9fVkdBX1ZTVEFUVVNfQ05UTF9NQVNLKSk7CisJV1JFRzMyKFI2MDBfUk9NX0NOVEwsIHJvbV9jbnRsIHwgUjYwMF9TQ0tfT1ZFUldSSVRFKTsKKworCXIgPSByYWRlb25fcmVhZF9iaW9zKHJkZXYpOworCisJLyogcmVzdG9yZSByZWdzICovCisJV1JFRzMyKFI2MDBfQlVTX0NOVEwsIGJ1c19jbnRsKTsKKwlXUkVHMzIoQVZJVk9fRDFWR0FfQ09OVFJPTCwgZDF2Z2FfY29udHJvbCk7CisJV1JFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wsIGQydmdhX2NvbnRyb2wpOworCVdSRUczMihBVklWT19WR0FfUkVOREVSX0NPTlRST0wsIHZnYV9yZW5kZXJfY29udHJvbCk7CisJV1JFRzMyKFI2MDBfUk9NX0NOVEwsIHJvbV9jbnRsKTsKKwlyZXR1cm4gcjsKK30KKwogc3RhdGljIGJvb2wgcjcwMF9yZWFkX2Rpc2FibGVkX2Jpb3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdWludDMyX3QgdmlwaF9jb250cm9sOwpAQCAtNDE2LDYgKzQ1NSw4IEBACiB7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKIAkJcmV0dXJuIGlncF9yZWFkX2Jpb3NfZnJvbV92cmFtKHJkZXYpOworCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0JBUlRTKQorCQlyZXR1cm4gbmlfcmVhZF9kaXNhYmxlZF9iaW9zKHJkZXYpOwogCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWNzcwKQogCQlyZXR1cm4gcjcwMF9yZWFkX2Rpc2FibGVkX2Jpb3MocmRldik7CiAJZWxzZSBpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUjYwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwppbmRleCAxMzdiODA3Li41OTFmY2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCkBAIC00NzEsOCArNDcxLDkgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorLyogdGhpcyBpcyB1c2VkIGZvciBhdG9tIExDRHMgYXMgd2VsbCAqLwogc3RydWN0IGVkaWQgKgotcmFkZW9uX2NvbWJpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQorcmFkZW9uX2Jpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWlmIChyZGV2LT5tb2RlX2luZm8uYmlvc19oYXJkY29kZWRfZWRpZCkKIAkJcmV0dXJuIHJkZXYtPm1vZGVfaW5mby5iaW9zX2hhcmRjb2RlZF9lZGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCmluZGV4IDhhZmFmN2EuLjIyYjdlM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKQEAgLTQ3Miw2ICs0NzIsOSBAQAogCWlmIChtb2RlKSB7CiAJCXJldCA9IDE7CiAJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJLyogYWRkIHRoZSB3aWR0aC9oZWlnaHQgZnJvbSB2YmlvcyB0YWJsZXMgaWYgYXZhaWxhYmxlICovCisJCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tID0gbW9kZS0+d2lkdGhfbW07CisJCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmhlaWdodF9tbSA9IG1vZGUtPmhlaWdodF9tbTsKIAkJLyogYWRkIHNjYWxlZCBtb2RlcyAqLwogCQlyYWRlb25fYWRkX2NvbW1vbl9tb2RlcyhlbmNvZGVyLCBjb25uZWN0b3IpOwogCX0KQEAgLTEyMTYsNyArMTIxOSw3IEBACiAJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKSB7CiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby51bmRlcnNjYW5fcHJvcGVydHksCi0JCQkJCQkgICAgICBVTkRFUlNDQU5fQVVUTyk7CisJCQkJCQkgICAgICBVTkRFUlNDQU5fT0ZGKTsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9oYm9yZGVyX3Byb3BlcnR5LAogCQkJCQkJICAgICAgMCk7CkBAIC0xMjU2LDcgKzEyNTksNyBAQAogCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgewogCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX3Byb3BlcnR5LAotCQkJCQkJICAgICAgVU5ERVJTQ0FOX0FVVE8pOworCQkJCQkJICAgICAgVU5ERVJTQ0FOX09GRik7CiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby51bmRlcnNjYW5faGJvcmRlcl9wcm9wZXJ0eSwKIAkJCQkJCSAgICAgIDApOwpAQCAtMTI5OSw3ICsxMzAyLDcgQEAKIAkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpIHsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9wcm9wZXJ0eSwKLQkJCQkJCSAgICAgIFVOREVSU0NBTl9BVVRPKTsKKwkJCQkJCSAgICAgIFVOREVSU0NBTl9PRkYpOwogCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX2hib3JkZXJfcHJvcGVydHksCiAJCQkJCQkgICAgICAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCmluZGV4IDZkNjRhMjcuLjM1YjVlYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYwpAQCAtNzcsMTMgKzc3LDEzIEBACiAJCQlwLT5yZWxvY3NfcHRyW2ldID0gJnAtPnJlbG9jc1tpXTsKIAkJCXAtPnJlbG9jc1tpXS5yb2JqID0gcC0+cmVsb2NzW2ldLmdvYmotPmRyaXZlcl9wcml2YXRlOwogCQkJcC0+cmVsb2NzW2ldLmxvYmouYm8gPSBwLT5yZWxvY3NbaV0ucm9iajsKLQkJCXAtPnJlbG9jc1tpXS5sb2JqLnJkb21haW4gPSByLT5yZWFkX2RvbWFpbnM7CiAJCQlwLT5yZWxvY3NbaV0ubG9iai53ZG9tYWluID0gci0+d3JpdGVfZG9tYWluOworCQkJcC0+cmVsb2NzW2ldLmxvYmoucmRvbWFpbiA9IHItPnJlYWRfZG9tYWluczsKKwkJCXAtPnJlbG9jc1tpXS5sb2JqLnR2LmJvID0gJnAtPnJlbG9jc1tpXS5yb2JqLT50Ym87CiAJCQlwLT5yZWxvY3NbaV0uaGFuZGxlID0gci0+aGFuZGxlOwogCQkJcC0+cmVsb2NzW2ldLmZsYWdzID0gci0+ZmxhZ3M7Ci0JCQlJTklUX0xJU1RfSEVBRCgmcC0+cmVsb2NzW2ldLmxvYmoubGlzdCk7CiAJCQlyYWRlb25fYm9fbGlzdF9hZGRfb2JqZWN0KCZwLT5yZWxvY3NbaV0ubG9iaiwKLQkJCQkJCSZwLT52YWxpZGF0ZWQpOworCQkJCQkJICAmcC0+dmFsaWRhdGVkKTsKIAkJfQogCX0KIAlyZXR1cm4gcmFkZW9uX2JvX2xpc3RfdmFsaWRhdGUoJnAtPnZhbGlkYXRlZCk7CkBAIC0xODksMTAgKzE4OSwxMyBAQAogewogCXVuc2lnbmVkIGk7CiAKLQlpZiAoIWVycm9yICYmIHBhcnNlci0+aWIpIHsKLQkJcmFkZW9uX2JvX2xpc3RfZmVuY2UoJnBhcnNlci0+dmFsaWRhdGVkLCBwYXJzZXItPmliLT5mZW5jZSk7Ci0JfQotCXJhZGVvbl9ib19saXN0X3VucmVzZXJ2ZSgmcGFyc2VyLT52YWxpZGF0ZWQpOworCisJaWYgKCFlcnJvciAmJiBwYXJzZXItPmliKQorCQl0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoJnBhcnNlci0+dmFsaWRhdGVkLAorCQkJCQkgICAgcGFyc2VyLT5pYi0+ZmVuY2UpOworCWVsc2UKKwkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24oJnBhcnNlci0+dmFsaWRhdGVkKTsKKwogCWlmIChwYXJzZXItPnJlbG9jcyAhPSBOVUxMKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwYXJzZXItPm5yZWxvY3M7IGkrKykgewogCQkJaWYgKHBhcnNlci0+cmVsb2NzW2ldLmdvYmopCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCmluZGV4IDUwMTk2NmEuLjI2MDkxZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2RldmljZS5jCkBAIC04MSw2ICs4MSwxMCBAQAogCSJKVU5JUEVSIiwKIAkiQ1lQUkVTUyIsCiAJIkhFTUxPQ0siLAorCSJQQUxNIiwKKwkiQkFSVFMiLAorCSJUVVJLUyIsCisJIkNBSUNPUyIsCiAJIkxBU1QiLAogfTsKIApAQCAtMjI0LDYgKzIyOCwxMSBAQAogCQkJCXJkZXYtPndiLnVzZV9ldmVudCA9IHRydWU7CiAJCX0KIAl9CisJLyogYWx3YXlzIHVzZSB3cml0ZWJhY2svZXZlbnRzIG9uIE5JICovCisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlyZGV2LT53Yi5lbmFibGVkID0gdHJ1ZTsKKwkJcmRldi0+d2IudXNlX2V2ZW50ID0gdHJ1ZTsKKwl9CiAKIAlkZXZfaW5mbyhyZGV2LT5kZXYsICJXQiAlc2FibGVkXG4iLCByZGV2LT53Yi5lbmFibGVkID8gImVuIiA6ICJkaXMiKTsKIApAQCAtMzM1LDcgKzM0NCwxMiBAQAogCXVpbnQzMl90IHJlZzsKIAogCS8qIGZpcnN0IGNoZWNrIENSVENzICovCi0JaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKSB7CisJCXJlZyA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCkgfAorCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VUKTsKKwkJaWYgKHJlZyAmIEVWRVJHUkVFTl9DUlRDX01BU1RFUl9FTikKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CiAJCXJlZyA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCkgfAogCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VUKSB8CiAJCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpIHwKQEAgLTYzNiwyMCArNjUwLDIwIEBACiBzdGF0aWMgdm9pZCByYWRlb25fc3dpdGNoZXJvb19zZXRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGVudW0gdmdhX3N3aXRjaGVyb29fc3RhdGUgc3RhdGUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJcG1fbWVzc2FnZV90IHBtbSA9IHsgLmV2ZW50ID0gUE1fRVZFTlRfU1VTUEVORCB9OwogCWlmIChzdGF0ZSA9PSBWR0FfU1dJVENIRVJPT19PTikgewogCQlwcmludGsoS0VSTl9JTkZPICJyYWRlb246IHN3aXRjaGVkIG9uXG4iKTsKIAkJLyogZG9uJ3Qgc3VzcGVuZCBvciByZXN1bWUgY2FyZCBub3JtYWxseSAqLwotCQlyZGV2LT5wb3dlcmVkX2Rvd24gPSBmYWxzZTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCQlyYWRlb25fcmVzdW1lX2ttcyhkZXYpOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfT047CiAJCWRybV9rbXNfaGVscGVyX3BvbGxfZW5hYmxlKGRldik7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAicmFkZW9uOiBzd2l0Y2hlZCBvZmZcbiIpOwogCQlkcm1fa21zX2hlbHBlcl9wb2xsX2Rpc2FibGUoZGV2KTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HOwogCQlyYWRlb25fc3VzcGVuZF9rbXMoZGV2LCBwbW0pOwotCQkvKiBkb24ndCBzdXNwZW5kIG9yIHJlc3VtZSBjYXJkIG5vcm1hbGx5ICovCi0JCXJkZXYtPnBvd2VyZWRfZG93biA9IHRydWU7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9PRkY7CiAJfQogfQogCkBAIC03MDQsMTEgKzcxOCw2IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcmRldi0+aXJxLmlkbGVfcXVldWUpOwogCi0JLyogc2V0dXAgd29ya3F1ZXVlICovCi0JcmRldi0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJyYWRlb24iKTsKLQlpZiAocmRldi0+d3EgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkvKiBTZXQgYXNpYyBmdW5jdGlvbnMgKi8KIAlyID0gcmFkZW9uX2FzaWNfaW5pdChyZGV2KTsKIAlpZiAocikKQEAgLTc3Myw2ICs3ODIsNyBAQAogCXZnYV9jbGllbnRfcmVnaXN0ZXIocmRldi0+cGRldiwgcmRldiwgTlVMTCwgcmFkZW9uX3ZnYV9zZXRfZGVjb2RlKTsKIAl2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9jbGllbnQocmRldi0+cGRldiwKIAkJCQkgICAgICAgcmFkZW9uX3N3aXRjaGVyb29fc2V0X3N0YXRlLAorCQkJCSAgICAgICBOVUxMLAogCQkJCSAgICAgICByYWRlb25fc3dpdGNoZXJvb19jYW5fc3dpdGNoKTsKIAogCXIgPSByYWRlb25faW5pdChyZGV2KTsKQEAgLTgwNiw3ICs4MTYsNiBAQAogCS8qIGV2aWN0IHZyYW0gbWVtb3J5ICovCiAJcmFkZW9uX2JvX2V2aWN0X3ZyYW0ocmRldik7CiAJcmFkZW9uX2ZpbmkocmRldik7Ci0JZGVzdHJveV93b3JrcXVldWUocmRldi0+d3EpOwogCXZnYV9zd2l0Y2hlcm9vX3VucmVnaXN0ZXJfY2xpZW50KHJkZXYtPnBkZXYpOwogCXZnYV9jbGllbnRfcmVnaXN0ZXIocmRldi0+cGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJkZXYtPnJpb19tZW0pCkBAIC04MzUsNyArODQ0LDcgQEAKIAl9CiAJcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAocmRldi0+cG93ZXJlZF9kb3duKQorCWlmIChkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKIAkJcmV0dXJuIDA7CiAKIAkvKiB0dXJuIG9mZiBkaXNwbGF5IGh3ICovCkBAIC04OTMsNyArOTAyLDcgQEAKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCWlmIChyZGV2LT5wb3dlcmVkX2Rvd24pCisJaWYgKGRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfT0ZGKQogCQlyZXR1cm4gMDsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwppbmRleCAxZGY0ZGM2Li5kMjZkYWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCkBAIC02OCw3ICs2OCw3IEBACiAJV1JFRzMyKEFWSVZPX0QxR1JQSF9MVVRfU0VMICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CiB9CiAKLXN0YXRpYyB2b2lkIGV2ZXJncmVlbl9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGRjZTRfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CkBAIC05OCw2ICs5OCw2NiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZGNlNV9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisKKwlEUk1fREVCVUdfS01TKCIlZFxuIiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCisJV1JFRzMyKE5JX0lOUFVUX0NTQ19DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfSU5QVVRfQ1NDX0dSUEhfTU9ERShOSV9JTlBVVF9DU0NfQllQQVNTKSB8CisJCU5JX0lOUFVUX0NTQ19PVkxfTU9ERShOSV9JTlBVVF9DU0NfQllQQVNTKSkpOworCVdSRUczMihOSV9QUkVTQ0FMRV9HUlBIX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgIE5JX0dSUEhfUFJFU0NBTEVfQllQQVNTKTsKKwlXUkVHMzIoTklfUFJFU0NBTEVfT1ZMX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgIE5JX09WTF9QUkVTQ0FMRV9CWVBBU1MpOworCVdSRUczMihOSV9JTlBVVF9HQU1NQV9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfR1JQSF9JTlBVVF9HQU1NQV9NT0RFKE5JX0lOUFVUX0dBTU1BX1VTRV9MVVQpIHwKKwkJTklfT1ZMX0lOUFVUX0dBTU1BX01PREUoTklfSU5QVVRfR0FNTUFfVVNFX0xVVCkpKTsKKworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfQkxBQ0tfT0ZGU0VUX0JMVUUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX0JMQUNLX09GRlNFVF9HUkVFTiArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfQkxBQ0tfT0ZGU0VUX1JFRCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9XSElURV9PRkZTRVRfQkxVRSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMHhmZmZmKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9XSElURV9PRkZTRVRfR1JFRU4gKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDB4ZmZmZik7CisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfV0hJVEVfT0ZGU0VUX1JFRCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMHhmZmZmKTsKKworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX1JXX01PREUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX1dSSVRFX0VOX01BU0sgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDB4MDAwMDAwMDcpOworCisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfUldfSU5ERVggKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF8zMF9DT0xPUiArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkJICAgICAgIChyYWRlb25fY3J0Yy0+bHV0X3JbaV0gPDwgMjApIHwKKwkJICAgICAgIChyYWRlb25fY3J0Yy0+bHV0X2dbaV0gPDwgMTApIHwKKwkJICAgICAgIChyYWRlb25fY3J0Yy0+bHV0X2JbaV0gPDwgMCkpOworCX0KKworCVdSRUczMihOSV9ERUdBTU1BX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgIChOSV9HUlBIX0RFR0FNTUFfTU9ERShOSV9ERUdBTU1BX0JZUEFTUykgfAorCQlOSV9PVkxfREVHQU1NQV9NT0RFKE5JX0RFR0FNTUFfQllQQVNTKSB8CisJCU5JX0lDT05fREVHQU1NQV9NT0RFKE5JX0RFR0FNTUFfQllQQVNTKSB8CisJCU5JX0NVUlNPUl9ERUdBTU1BX01PREUoTklfREVHQU1NQV9CWVBBU1MpKSk7CisJV1JFRzMyKE5JX0dBTVVUX1JFTUFQX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgIChOSV9HUlBIX0dBTVVUX1JFTUFQX01PREUoTklfR0FNVVRfUkVNQVBfQllQQVNTKSB8CisJCU5JX09WTF9HQU1VVF9SRU1BUF9NT0RFKE5JX0dBTVVUX1JFTUFQX0JZUEFTUykpKTsKKwlXUkVHMzIoTklfUkVHQU1NQV9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfR1JQSF9SRUdBTU1BX01PREUoTklfUkVHQU1NQV9CWVBBU1MpIHwKKwkJTklfT1ZMX1JFR0FNTUFfTU9ERShOSV9SRUdBTU1BX0JZUEFTUykpKTsKKwlXUkVHMzIoTklfT1VUUFVUX0NTQ19DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfT1VUUFVUX0NTQ19HUlBIX01PREUoTklfT1VUUFVUX0NTQ19CWVBBU1MpIHwKKwkJTklfT1VUUFVUX0NTQ19PVkxfTU9ERShOSV9PVVRQVVRfQ1NDX0JZUEFTUykpKTsKKwkvKiBYWFggbWF0Y2ggdGhpcyB0byB0aGUgZGVwdGggb2YgdGhlIGNydGMgZm10IGJsb2NrLCBtb3ZlIHRvIG1vZGVzZXQ/ICovCisJV1JFRzMyKDB4Njk0MCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgMCk7CisKK30KKwogc3RhdGljIHZvaWQgbGVnYWN5X2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKQEAgLTEzMCw4ICsxOTAsMTAgQEAKIAlpZiAoIWNydGMtPmVuYWJsZWQpCiAJCXJldHVybjsKIAotCWlmIChBU0lDX0lTX0RDRTQocmRldikpCi0JCWV2ZXJncmVlbl9jcnRjX2xvYWRfbHV0KGNydGMpOworCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCWRjZTVfY3J0Y19sb2FkX2x1dChjcnRjKTsKKwllbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCWRjZTRfY3J0Y19sb2FkX2x1dChjcnRjKTsKIAllbHNlIGlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKQogCQlhdml2b19jcnRjX2xvYWRfbHV0KGNydGMpOwogCWVsc2UKQEAgLTE4MywxMiArMjQ1LDI3MiBAQAogCWtmcmVlKHJhZGVvbl9jcnRjKTsKIH0KIAorLyoKKyAqIEhhbmRsZSB1bnBpbiBldmVudHMgb3V0c2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgcHJvcGVyLgorICovCitzdGF0aWMgdm9pZCByYWRlb25fdW5waW5fd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqX193b3JrKQoreworCXN0cnVjdCByYWRlb25fdW5waW5fd29yayAqd29yayA9CisJCWNvbnRhaW5lcl9vZihfX3dvcmssIHN0cnVjdCByYWRlb25fdW5waW5fd29yaywgd29yayk7CisJaW50IHI7CisKKwkvKiB1bnBpbiBvZiB0aGUgb2xkIGJ1ZmZlciAqLworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZSh3b3JrLT5vbGRfcmJvLCBmYWxzZSk7CisJaWYgKGxpa2VseShyID09IDApKSB7CisJCXIgPSByYWRlb25fYm9fdW5waW4od29yay0+b2xkX3Jibyk7CisJCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byB1bnBpbiBidWZmZXIgYWZ0ZXIgZmxpcFxuIik7CisJCX0KKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZSh3b3JrLT5vbGRfcmJvKTsKKwl9IGVsc2UKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVzZXJ2ZSBidWZmZXIgYWZ0ZXIgZmxpcFxuIik7CisJa2ZyZWUod29yayk7Cit9CisKK3ZvaWQgcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CisJc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp3b3JrOworCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmU7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHVwZGF0ZV9wZW5kaW5nOworCWludCB2cG9zLCBocG9zOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmRkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwl3b3JrID0gcmFkZW9uX2NydGMtPnVucGluX3dvcms7CisJaWYgKHdvcmsgPT0gTlVMTCB8fAorCSAgICAhcmFkZW9uX2ZlbmNlX3NpZ25hbGVkKHdvcmstPmZlbmNlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5kZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLyogTmV3IHBhZ2VmbGlwLCBvciBqdXN0IGNvbXBsZXRpb24gb2YgYSBwcmV2aW91cyBvbmU/ICovCisJaWYgKCFyYWRlb25fY3J0Yy0+ZGVmZXJyZWRfZmxpcF9jb21wbGV0aW9uKSB7CisJCS8qIGRvIHRoZSBmbGlwIChtbWlvKSAqLworCQl1cGRhdGVfcGVuZGluZyA9IHJhZGVvbl9wYWdlX2ZsaXAocmRldiwgY3J0Y19pZCwgd29yay0+bmV3X2NydGNfYmFzZSk7CisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyBqdXN0IGEgY29tcGxldGlvbiBvZiBhIGZsaXAgcXVldWVkIGluIGNydGMKKwkJICogYXQgbGFzdCBpbnZvY2F0aW9uLiBNYWtlIHN1cmUgd2UgZ28gZGlyZWN0bHkgdG8KKwkJICogY29tcGxldGlvbiByb3V0aW5lLgorCQkgKi8KKwkJdXBkYXRlX3BlbmRpbmcgPSAwOworCQlyYWRlb25fY3J0Yy0+ZGVmZXJyZWRfZmxpcF9jb21wbGV0aW9uID0gMDsKKwl9CisKKwkvKiBIYXMgdGhlIHBhZ2VmbGlwIGFscmVhZHkgY29tcGxldGVkIGluIGNydGMsIG9yIGlzIGl0IGNlcnRhaW4KKwkgKiB0byBjb21wbGV0ZSBpbiB0aGlzIHZibGFuaz8KKwkgKi8KKwlpZiAodXBkYXRlX3BlbmRpbmcgJiYKKwkgICAgKERSTV9TQ0FOT1VUUE9TX1ZBTElEICYgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0Y19pZCwKKwkJCQkJCQkgICAgICAgJnZwb3MsICZocG9zKSkgJiYKKwkgICAgKHZwb3MgPj0wKSAmJgorCSAgICAodnBvcyA8ICg5OSAqIHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXS0+YmFzZS5od21vZGUuY3J0Y192ZGlzcGxheSkvMTAwKSkgeworCQkvKiBjcnRjIGRpZG4ndCBmbGlwIGluIHRoaXMgdGFyZ2V0IHZibGFuayBpbnRlcnZhbCwKKwkJICogYnV0IGZsaXAgaXMgcGVuZGluZyBpbiBjcnRjLiBJdCB3aWxsIGNvbXBsZXRlIGl0CisJCSAqIGluIG5leHQgdmJsYW5rIGludGVydmFsLCBzbyBjb21wbGV0ZSB0aGUgZmxpcCBhdAorCQkgKiBuZXh0IHZibGFuayBpcnEuCisJCSAqLworCQlyYWRlb25fY3J0Yy0+ZGVmZXJyZWRfZmxpcF9jb21wbGV0aW9uID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogUGFnZWZsaXAgKHdpbGwgYmUpIGNlcnRhaW5seSBjb21wbGV0ZWQgaW4gdGhpcyB2YmxhbmsuIENsZWFuIHVwLiAqLworCXJhZGVvbl9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKKworCS8qIHdha2V1cCB1c2Vyc3BhY2UgKi8KKwlpZiAod29yay0+ZXZlbnQpIHsKKwkJZSA9IHdvcmstPmV2ZW50OworCQllLT5ldmVudC5zZXF1ZW5jZSA9IGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUocmRldi0+ZGRldiwgY3J0Y19pZCwgJm5vdyk7CisJCWUtPmV2ZW50LnR2X3NlYyA9IG5vdy50dl9zZWM7CisJCWUtPmV2ZW50LnR2X3VzZWMgPSBub3cudHZfdXNlYzsKKwkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLCAmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X2xpc3QpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF93YWl0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJZHJtX3ZibGFua19wdXQocmRldi0+ZGRldiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCXJhZGVvbl9mZW5jZV91bnJlZigmd29yay0+ZmVuY2UpOworCXJhZGVvbl9wb3N0X3BhZ2VfZmxpcCh3b3JrLT5yZGV2LCB3b3JrLT5jcnRjX2lkKTsKKwlzY2hlZHVsZV93b3JrKCZ3b3JrLT53b3JrKTsKK30KKworc3RhdGljIGludCByYWRlb25fY3J0Y19wYWdlX2ZsaXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKKwkJCQkgc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOworCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKm9sZF9yYWRlb25fZmI7CisJc3RydWN0IHJhZGVvbl9mcmFtZWJ1ZmZlciAqbmV3X3JhZGVvbl9mYjsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgcmFkZW9uX2JvICpyYm87CisJc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2U7CisJc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp3b3JrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRpbGluZ19mbGFncywgcGl0Y2hfcGl4ZWxzOworCXU2NCBiYXNlOworCWludCByOworCisJd29yayA9IGt6YWxsb2Moc2l6ZW9mICp3b3JrLCBHRlBfS0VSTkVMKTsKKwlpZiAod29yayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXIgPSByYWRlb25fZmVuY2VfY3JlYXRlKHJkZXYsICZmZW5jZSk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKKwkJa2ZyZWUod29yayk7CisJCURSTV9FUlJPUigiZmxpcCBxdWV1ZTogZmFpbGVkIHRvIGNyZWF0ZSBmZW5jZS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJd29yay0+ZXZlbnQgPSBldmVudDsKKwl3b3JrLT5yZGV2ID0gcmRldjsKKwl3b3JrLT5jcnRjX2lkID0gcmFkZW9uX2NydGMtPmNydGNfaWQ7CisJd29yay0+ZmVuY2UgPSByYWRlb25fZmVuY2VfcmVmKGZlbmNlKTsKKwlvbGRfcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGNydGMtPmZiKTsKKwluZXdfcmFkZW9uX2ZiID0gdG9fcmFkZW9uX2ZyYW1lYnVmZmVyKGZiKTsKKwkvKiBzY2hlZHVsZSB1bnBpbiBvZiB0aGUgb2xkIGJ1ZmZlciAqLworCW9iaiA9IG9sZF9yYWRlb25fZmItPm9iajsKKwlyYm8gPSBvYmotPmRyaXZlcl9wcml2YXRlOworCXdvcmstPm9sZF9yYm8gPSByYm87CisJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCByYWRlb25fdW5waW5fd29ya19mdW5jKTsKKworCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIHVucGluX3dvcmsgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJaWYgKHJhZGVvbl9jcnRjLT51bnBpbl93b3JrKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlrZnJlZSh3b3JrKTsKKwkJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CisKKwkJRFJNX0RFQlVHX0RSSVZFUigiZmxpcCBxdWV1ZTogY3J0YyBhbHJlYWR5IGJ1c3lcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IHdvcms7CisJcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbiA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwkvKiBwaW4gdGhlIG5ldyBidWZmZXIgKi8KKwlvYmogPSBuZXdfcmFkZW9uX2ZiLT5vYmo7CisJcmJvID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKworCURSTV9ERUJVR19EUklWRVIoImZsaXAtaW9jdGwoKSBjdXJfZmJvID0gJXAsIGN1cl9iYm8gPSAlcFxuIiwKKwkJCSB3b3JrLT5vbGRfcmJvLCByYm8pOworCisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJibywgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc2VydmUgbmV3IHJibyBidWZmZXIgYmVmb3JlIGZsaXBcbiIpOworCQlnb3RvIHBmbGlwX2NsZWFudXA7CisJfQorCXIgPSByYWRlb25fYm9fcGluKHJibywgUkFERU9OX0dFTV9ET01BSU5fVlJBTSwgJmJhc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKKwkJciA9IC1FSU5WQUw7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBuZXcgcmJvIGJ1ZmZlciBiZWZvcmUgZmxpcFxuIik7CisJCWdvdG8gcGZsaXBfY2xlYW51cDsKKwl9CisJcmFkZW9uX2JvX2dldF90aWxpbmdfZmxhZ3MocmJvLCAmdGlsaW5nX2ZsYWdzLCBOVUxMKTsKKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CisKKwlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikpIHsKKwkJLyogY3J0YyBvZmZzZXQgaXMgZnJvbSBkaXNwbGF5IGJhc2UgYWRkciBub3QgRkIgbG9jYXRpb24gKi8KKwkJYmFzZSAtPSByYWRlb25fY3J0Yy0+bGVnYWN5X2Rpc3BsYXlfYmFzZV9hZGRyOworCQlwaXRjaF9waXhlbHMgPSBmYi0+cGl0Y2ggLyAoZmItPmJpdHNfcGVyX3BpeGVsIC8gOCk7CisKKwkJaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pIHsKKwkJCWlmIChBU0lDX0lTX1IzMDAocmRldikpIHsKKwkJCQliYXNlICY9IH4weDdmZjsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGJ5dGVzaGlmdCA9IGZiLT5iaXRzX3Blcl9waXhlbCA+PiA0OworCQkJCWludCB0aWxlX2FkZHIgPSAoKChjcnRjLT55ID4+IDMpICogcGl0Y2hfcGl4ZWxzICsgIGNydGMtPngpID4+ICg4IC0gYnl0ZXNoaWZ0KSkgPDwgMTE7CisJCQkJYmFzZSArPSB0aWxlX2FkZHIgKyAoKGNydGMtPnggPDwgYnl0ZXNoaWZ0KSAlIDI1NikgKyAoKGNydGMtPnkgJSA4KSA8PCA4KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBvZmZzZXQgPSBjcnRjLT55ICogcGl0Y2hfcGl4ZWxzICsgY3J0Yy0+eDsKKwkJCXN3aXRjaCAoZmItPmJpdHNfcGVyX3BpeGVsKSB7CisJCQljYXNlIDg6CisJCQlkZWZhdWx0OgorCQkJCW9mZnNldCAqPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCWNhc2UgMTY6CisJCQkJb2Zmc2V0ICo9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0OgorCQkJCW9mZnNldCAqPSAzOworCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCQlvZmZzZXQgKj0gNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJhc2UgKz0gb2Zmc2V0OworCQl9CisJCWJhc2UgJj0gfjc7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCXdvcmstPm5ld19jcnRjX2Jhc2UgPSBiYXNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJLyogdXBkYXRlIGNydGMgZmIgKi8KKwljcnRjLT5mYiA9IGZiOworCisJciA9IGRybV92YmxhbmtfZ2V0KGRldiwgcmFkZW9uX2NydGMtPmNydGNfaWQpOworCWlmIChyKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCB2YmxhbmsgYmVmb3JlIGZsaXBcbiIpOworCQlnb3RvIHBmbGlwX2NsZWFudXAxOworCX0KKworCS8qIDMyIG91Z2h0IHRvIGNvdmVyIHVzICovCisJciA9IHJhZGVvbl9yaW5nX2xvY2socmRldiwgMzIpOworCWlmIChyKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGxvY2sgdGhlIHJpbmcgYmVmb3JlIGZsaXBcbiIpOworCQlnb3RvIHBmbGlwX2NsZWFudXAyOworCX0KKworCS8qIGVtaXQgdGhlIGZlbmNlICovCisJcmFkZW9uX2ZlbmNlX2VtaXQocmRldiwgZmVuY2UpOworCS8qIHNldCB0aGUgcHJvcGVyIGludGVycnVwdCAqLworCXJhZGVvbl9wcmVfcGFnZV9mbGlwKHJkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKKwkvKiBmaXJlIHRoZSByaW5nICovCisJcmFkZW9uX3JpbmdfdW5sb2NrX2NvbW1pdChyZGV2KTsKKworCXJldHVybiAwOworCitwZmxpcF9jbGVhbnVwMjoKKwlkcm1fdmJsYW5rX3B1dChkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKKworcGZsaXBfY2xlYW51cDE6CisJciA9IHJhZGVvbl9ib19yZXNlcnZlKHJibywgZmFsc2UpOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc2VydmUgbmV3IHJibyBpbiBlcnJvciBwYXRoXG4iKTsKKwkJZ290byBwZmxpcF9jbGVhbnVwOworCX0KKwlyID0gcmFkZW9uX2JvX3VucGluKHJibyk7CisJaWYgKHVubGlrZWx5KHIgIT0gMCkpIHsKKwkJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCQlyID0gLUVJTlZBTDsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gdW5waW4gbmV3IHJibyBpbiBlcnJvciBwYXRoXG4iKTsKKwkJZ290byBwZmxpcF9jbGVhbnVwOworCX0KKwlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CisKK3BmbGlwX2NsZWFudXA6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCXJhZGVvbl9jcnRjLT51bnBpbl93b3JrID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlyYWRlb25fZmVuY2VfdW5yZWYoJmZlbmNlKTsKKwlrZnJlZSh3b3JrKTsKKworCXJldHVybiByOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHJhZGVvbl9jcnRjX2Z1bmNzID0gewogCS5jdXJzb3Jfc2V0ID0gcmFkZW9uX2NydGNfY3Vyc29yX3NldCwKIAkuY3Vyc29yX21vdmUgPSByYWRlb25fY3J0Y19jdXJzb3JfbW92ZSwKIAkuZ2FtbWFfc2V0ID0gcmFkZW9uX2NydGNfZ2FtbWFfc2V0LAogCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcsCiAJLmRlc3Ryb3kgPSByYWRlb25fY3J0Y19kZXN0cm95LAorCS5wYWdlX2ZsaXAgPSByYWRlb25fY3J0Y19wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgdm9pZCByYWRlb25fY3J0Y19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpbmRleCkKQEAgLTIyNSw3ICs1NDcsNyBAQAogCQlyYWRlb25fbGVnYWN5X2luaXRfY3J0YyhkZXYsIHJhZGVvbl9jcnRjKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmVuY29kZXJfbmFtZXNbMzRdID0geworc3RhdGljIGNvbnN0IGNoYXIgKmVuY29kZXJfbmFtZXNbMzZdID0gewogCSJOT05FIiwKIAkiSU5URVJOQUxfTFZEUyIsCiAJIklOVEVSTkFMX1RNRFMxIiwKQEAgLTI2MCw2ICs1ODIsOCBAQAogCSJJTlRFUk5BTF9LTERTQ1BfTFZUTUEiLAogCSJJTlRFUk5BTF9VTklQSFkxIiwKIAkiSU5URVJOQUxfVU5JUEhZMiIsCisJIk5VVE1FRyIsCisJIlRSQVZJUyIsCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29ubmVjdG9yX25hbWVzWzE1XSA9IHsKQEAgLTQxNyw5ICs3NDEsMTcgQEAKIAlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKIAkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IGRybV9nZXRfZWRpZCgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgJnJhZGVvbl9jb25uZWN0b3ItPmRkY19idXMtPmFkYXB0ZXIpOwogCX0KLQkvKiBzb21lIHNlcnZlcnMgcHJvdmlkZSBhIGhhcmRjb2RlZCBlZGlkIGluIHJvbSBmb3IgS1ZNcyAqLwotCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkKLQkJcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCA9IHJhZGVvbl9jb21iaW9zX2dldF9oYXJkY29kZWRfZWRpZChyZGV2KTsKKworCWlmICghcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgeworCQlpZiAocmRldi0+aXNfYXRvbV9iaW9zKSB7CisJCQkvKiBzb21lIGxhcHRvcHMgcHJvdmlkZSBhIGhhcmRjb2RlZCBlZGlkIGluIHJvbSBmb3IgTENEcyAqLworCQkJaWYgKCgocmFkZW9uX2Nvbm5lY3Rvci0+YmFzZS5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfTFZEUykgfHwKKwkJCSAgICAgKHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX2VEUCkpKQorCQkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSByYWRlb25fYmlvc19nZXRfaGFyZGNvZGVkX2VkaWQocmRldik7CisJCX0gZWxzZQorCQkJLyogc29tZSBzZXJ2ZXJzIHByb3ZpZGUgYSBoYXJkY29kZWQgZWRpZCBpbiByb20gZm9yIEtWTXMgKi8KKwkJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSByYWRlb25fYmlvc19nZXRfaGFyZGNvZGVkX2VkaWQocmRldik7CisJfQogCWlmIChyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CiAJCXJldCA9IGRybV9hZGRfZWRpZF9tb2RlcygmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwgcmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCk7CkBAIC04NDksNyArMTE4MSwxMCBAQAogCiAJcmRldi0+ZGRldi0+bW9kZV9jb25maWcuZnVuY3MgPSAodm9pZCAqKSZyYWRlb25fbW9kZV9mdW5jczsKIAotCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKSB7CisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlyZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSAxNjM4NDsKKwkJcmRldi0+ZGRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDE2Mzg0OworCX0gZWxzZSBpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgewogCQlyZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA4MTkyOwogCQlyZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0ID0gODE5MjsKIAl9IGVsc2UgewpAQCAtMTAxOSw3ICsxMzU0LDcgQEAKIC8qCiAgKiBSZXRyaWV2ZSBjdXJyZW50IHZpZGVvIHNjYW5vdXQgcG9zaXRpb24gb2YgY3J0YyBvbiBhIGdpdmVuIGdwdS4KICAqCi0gKiBccGFyYW0gcmRldiBEZXZpY2UgdG8gcXVlcnkuCisgKiBccGFyYW0gZGV2IERldmljZSB0byBxdWVyeS4KICAqIFxwYXJhbSBjcnRjIENydGMgdG8gcXVlcnkuCiAgKiBccGFyYW0gKnZwb3MgTG9jYXRpb24gd2hlcmUgdmVydGljYWwgc2Nhbm91dCBwb3NpdGlvbiBzaG91bGQgYmUgc3RvcmVkLgogICogXHBhcmFtICpocG9zIExvY2F0aW9uIHdoZXJlIGhvcml6b250YWwgc2Nhbm91dCBwb3NpdGlvbiBzaG91bGQgZ28uCkBAIC0xMDMxLDcyICsxMzY2LDc0IEBACiAgKgogICogXHJldHVybiBGbGFncywgb3InZWQgdG9nZXRoZXIgYXMgZm9sbG93czoKICAqCi0gKiBSQURFT05fU0NBTk9VVFBPU19WQUxJRCA9IFF1ZXJ5IHN1Y2Nlc3NmdWxsLgotICogUkFERU9OX1NDQU5PVVRQT1NfSU5WQkwgPSBJbnNpZGUgdmJsYW5rLgotICogUkFERU9OX1NDQU5PVVRQT1NfQUNDVVJBVEUgPSBSZXR1cm5lZCBwb3NpdGlvbiBpcyBhY2N1cmF0ZS4gQSBsYWNrIG9mCisgKiBEUk1fU0NBTk9VVFBPU19WQUxJRCA9IFF1ZXJ5IHN1Y2Nlc3NmdWxsLgorICogRFJNX1NDQU5PVVRQT1NfSU5WQkwgPSBJbnNpZGUgdmJsYW5rLgorICogRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEUgPSBSZXR1cm5lZCBwb3NpdGlvbiBpcyBhY2N1cmF0ZS4gQSBsYWNrIG9mCiAgKiB0aGlzIGZsYWcgbWVhbnMgdGhhdCByZXR1cm5lZCBwb3NpdGlvbiBtYXkgYmUgb2Zmc2V0IGJ5IGEgY29uc3RhbnQgYnV0CiAgKiB1bmtub3duIHNtYWxsIG51bWJlciBvZiBzY2FubGluZXMgd3J0LiByZWFsIHNjYW5vdXQgcG9zaXRpb24uCiAgKgogICovCi1pbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCBpbnQgKnZwb3MsIGludCAqaHBvcykKK2ludCByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywgaW50ICp2cG9zLCBpbnQgKmhwb3MpCiB7CiAJdTMyIHN0YXRfY3J0YyA9IDAsIHZibCA9IDAsIHBvc2l0aW9uID0gMDsKIAlpbnQgdmJsX3N0YXJ0LCB2YmxfZW5kLCB2dG90YWwsIHJldCA9IDA7CiAJYm9vbCBpbl92YmwgPSB0cnVlOwogCisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCiAJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewogCQlpZiAoY3J0YyA9PSAwKSB7CiAJCQl2YmwgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfVl9CTEFOS19TVEFSVF9FTkQgKwogCQkJCSAgICAgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCk7CiAJCQlwb3NpdGlvbiA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19TVEFUVVNfUE9TSVRJT04gKwogCQkJCQkgIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDEpIHsKIAkJCXZibCA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCArCiAJCQkJICAgICBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VUKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiArCiAJCQkJCSAgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7Ci0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAkJaWYgKGNydGMgPT0gMikgewogCQkJdmJsID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1ZfQkxBTktfU1RBUlRfRU5EICsKIAkJCQkgICAgIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOwogCQkJcG9zaXRpb24gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfU1RBVFVTX1BPU0lUSU9OICsKIAkJCQkJICBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCQlpZiAoY3J0YyA9PSAzKSB7CiAJCQl2YmwgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfVl9CTEFOS19TVEFSVF9FTkQgKwogCQkJCSAgICAgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCk7CiAJCQlwb3NpdGlvbiA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19TVEFUVVNfUE9TSVRJT04gKwogCQkJCQkgIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDQpIHsKIAkJCXZibCA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCArCiAJCQkJICAgICBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VUKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiArCiAJCQkJCSAgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7Ci0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAkJaWYgKGNydGMgPT0gNSkgewogCQkJdmJsID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1ZfQkxBTktfU1RBUlRfRU5EICsKIAkJCQkgICAgIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQpOwogCQkJcG9zaXRpb24gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfU1RBVFVTX1BPU0lUSU9OICsKIAkJCQkJICBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCX0gZWxzZSBpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgewogCQlpZiAoY3J0YyA9PSAwKSB7CiAJCQl2YmwgPSBSUkVHMzIoQVZJVk9fRDFDUlRDX1ZfQkxBTktfU1RBUlRfRU5EKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEFWSVZPX0QxQ1JUQ19TVEFUVVNfUE9TSVRJT04pOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDEpIHsKIAkJCXZibCA9IFJSRUczMihBVklWT19EMkNSVENfVl9CTEFOS19TVEFSVF9FTkQpOwogCQkJcG9zaXRpb24gPSBSUkVHMzIoQVZJVk9fRDJDUlRDX1NUQVRVU19QT1NJVElPTik7Ci0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBQcmUtQVZJVk86IERpZmZlcmVudCBlbmNvZGluZyBvZiBzY2Fub3V0IHBvcyBhbmQgdmJsYW5rIGludGVydmFsLiAqLwpAQCAtMTExMiw3ICsxNDQ5LDcgQEAKIAkJCWlmICghKHN0YXRfY3J0YyAmIDEpKQogCQkJCWluX3ZibCA9IGZhbHNlOwogCi0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAkJaWYgKGNydGMgPT0gMSkgewogCQkJdmJsID0gKFJSRUczMihSQURFT05fQ1JUQzJfVl9UT1RBTF9ESVNQKSAmCkBAIC0xMTIyLDcgKzE0NTksNyBAQAogCQkJaWYgKCEoc3RhdF9jcnRjICYgMSkpCiAJCQkJaW5fdmJsID0gZmFsc2U7CiAKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCX0KIApAQCAtMTEzMywxMyArMTQ3MCwxMyBAQAogCS8qIFZhbGlkIHZibGFuayBhcmVhIGJvdW5kYXJpZXMgZnJvbSBncHUgcmV0cmlldmVkPyAqLwogCWlmICh2YmwgPiAwKSB7CiAJCS8qIFllczogRGVjb2RlLiAqLwotCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfQUNDVVJBVEU7CisJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19BQ0NVUkFURTsKIAkJdmJsX3N0YXJ0ID0gdmJsICYgMHgxZmZmOwogCQl2YmxfZW5kID0gKHZibCA+PiAxNikgJiAweDFmZmY7CiAJfQogCWVsc2UgewogCQkvKiBObzogRmFrZSBzb21ldGhpbmcgcmVhc29uYWJsZSB3aGljaCBnaXZlcyBhdCBsZWFzdCBvayByZXN1bHRzLiAqLwotCQl2Ymxfc3RhcnQgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y10tPmJhc2UubW9kZS5jcnRjX3ZkaXNwbGF5OworCQl2Ymxfc3RhcnQgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y10tPmJhc2UuaHdtb2RlLmNydGNfdmRpc3BsYXk7CiAJCXZibF9lbmQgPSAwOwogCX0KIApAQCAtMTE1NSw3ICsxNDkyLDcgQEAKIAogCS8qIEluc2lkZSAidXBwZXIgcGFydCIgb2YgdmJsYW5rIGFyZWE/IEFwcGx5IGNvcnJlY3RpdmUgb2Zmc2V0IGlmIHNvOiAqLwogCWlmIChpbl92YmwgJiYgKCp2cG9zID49IHZibF9zdGFydCkpIHsKLQkJdnRvdGFsID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdLT5iYXNlLm1vZGUuY3J0Y192dG90YWw7CisJCXZ0b3RhbCA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjXS0+YmFzZS5od21vZGUuY3J0Y192dG90YWw7CiAJCSp2cG9zID0gKnZwb3MgLSB2dG90YWw7CiAJfQogCkBAIC0xMTY0LDcgKzE1MDEsNyBAQAogCiAJLyogSW4gdmJsYW5rPyAqLwogCWlmIChpbl92YmwpCi0JCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19JTlZCTDsKKwkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX0lOVkJMOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKaW5kZXggNjBlNjg5Zi4uYmU1Y2I0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZHJ2LmMKQEAgLTQ4LDkgKzQ4LDEwIEBACiAgKiAtIDIuNS4wIC0gYWRkIGdldCBhY2NlbCAyIHRvIHdvcmsgYXJvdW5kIGRkeCBicmVha2FnZSBmb3IgZXZlcmdyZWVuCiAgKiAtIDIuNi4wIC0gYWRkIHRpbGluZyBjb25maWcgcXVlcnkgKHI2eHgrKSwgYWRkIGluaXRpYWwgSGlaIHN1cHBvcnQgKHIzMDAtPnI1MDApCiAgKiAgIDIuNy4wIC0gZml4dXBzIGZvciByNjAwIDJEIHRpbGluZyBzdXBwb3J0LiAobm8gZXh0ZXJuYWwgQUJJIGNoYW5nZSksIGFkZCBlZyBkeW4gZ3ByIHJlZ3MKKyAqICAgMi44LjAgLSBwYWdlZmxpcCBzdXBwb3J0LCByNTAwIFVTX0ZPUk1BVCByZWdzLiByNTAwIEFSR0IyMTAxMDEwIGNvbG9yYnVmLCByMzAwLT5yNTAwIENNQVNLCiAgKi8KICNkZWZpbmUgS01TX0RSSVZFUl9NQUpPUgkyCi0jZGVmaW5lIEtNU19EUklWRVJfTUlOT1IJNworI2RlZmluZSBLTVNfRFJJVkVSX01JTk9SCTgKICNkZWZpbmUgS01TX0RSSVZFUl9QQVRDSExFVkVMCTAKIGludCByYWRlb25fZHJpdmVyX2xvYWRfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogaW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTY2LDYgKzY3LDEwIEBACiB1MzIgcmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogaW50IHJhZGVvbl9lbmFibGVfdmJsYW5rX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiB2b2lkIHJhZGVvbl9kaXNhYmxlX3ZibGFua19rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOworaW50IHJhZGVvbl9nZXRfdmJsYW5rX3RpbWVzdGFtcF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgIGludCAqbWF4X2Vycm9yLAorCQkJCSAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCisJCQkJICAgIHVuc2lnbmVkIGZsYWdzKTsKIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtNzQsNiArNzksOCBAQAogCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGludCByYWRlb25fZ2VtX29iamVjdF9pbml0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKIHZvaWQgcmFkZW9uX2dlbV9vYmplY3RfZnJlZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitleHRlcm4gaW50IHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICAgIGludCAqdnBvcywgaW50ICpocG9zKTsKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgcmFkZW9uX2lvY3Rsc19rbXNbXTsKIGV4dGVybiBpbnQgcmFkZW9uX21heF9rbXNfaW9jdGw7CiBpbnQgcmFkZW9uX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKQEAgLTI5Niw2ICszMDMsOCBAQAogCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSByYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttcywKIAkuZW5hYmxlX3ZibGFuayA9IHJhZGVvbl9lbmFibGVfdmJsYW5rX2ttcywKIAkuZGlzYWJsZV92YmxhbmsgPSByYWRlb25fZGlzYWJsZV92Ymxhbmtfa21zLAorCS5nZXRfdmJsYW5rX3RpbWVzdGFtcCA9IHJhZGVvbl9nZXRfdmJsYW5rX3RpbWVzdGFtcF9rbXMsCisJLmdldF9zY2Fub3V0X3Bvc2l0aW9uID0gcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MsCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCiAJLmRlYnVnZnNfaW5pdCA9IHJhZGVvbl9kZWJ1Z2ZzX2luaXQsCiAJLmRlYnVnZnNfY2xlYW51cCA9IHJhZGVvbl9kZWJ1Z2ZzX2NsZWFudXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYwppbmRleCAwNDE5NDNkLi44ZmQxODQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKQEAgLTY0MSw3ICs2NDEsNyBAQAogCXN3aXRjaCAoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSkgewogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0RWSUk6CiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUI6IC8qIEhETUktQiBpcyBiYXNpY2FsbHkgREwtRFZJOyBhbmFsb2cgd29ya3MgZmluZSAqLwotCQlpZiAoZHJtX2RldGVjdF9oZG1pX21vbml0b3IocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpIHsKKwkJaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSkgewogCQkJLyogZml4IG1lICovCiAJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQogCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CkBAIC02NTUsNyArNjU1LDcgQEAKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOgogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBOgogCWRlZmF1bHQ6Ci0JCWlmIChkcm1fZGV0ZWN0X2hkbWlfbW9uaXRvcihyYWRlb25fY29ubmVjdG9yLT5lZGlkKSkgeworCQlpZiAoZHJtX2RldGVjdF9tb25pdG9yX2F1ZGlvKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKSB7CiAJCQkvKiBmaXggbWUgKi8KIAkJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCiAJCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RWSTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCQlpZiAoKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUKSB8fAogCQkgICAgKGRpZ19jb25uZWN0b3ItPmRwX3NpbmtfdHlwZSA9PSBDT05ORUNUT1JfT0JKRUNUX0lEX2VEUCkpCiAJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFA7Ci0JCWVsc2UgaWYgKGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKSB7CisJCWVsc2UgaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSkgewogCQkJLyogZml4IG1lICovCiAJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQogCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CkBAIC03MTIsOCArNzEyLDggQEAKICAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCiAgKiBESUcxLzIgY2FuIGRyaXZlIFVOSVBIWTAvMS8yIGxpbmsgQSBvciBsaW5rIEIKICAqCi0gKiBEQ0UgNC4wCi0gKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTlBIWTAvMS8yIChsaW5rcyBBIGFuZCBCKS4KKyAqIERDRSA0LjAvNS4wCisgKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCiAgKiBTdXBwb3J0cyB1cCB0byA2IGRpZ2l0YWwgb3V0cHV0cwogICogLSA2IERJRyBlbmNvZGVyIGJsb2Nrcy4KICAqIC0gRElHIHRvIFBIWSBtYXBwaW5nIGlzIGhhcmRjb2RlZApAQCAtNzI0LDYgKzcyNCwxMiBAQAogICogRElHNSBkcml2ZXMgVU5JUEhZMiBsaW5rIEEsIEErQgogICogRElHNiBkcml2ZXMgVU5JUEhZMiBsaW5rIEIKICAqCisgKiBEQ0UgNC4xCisgKiAtIDMgRElHIHRyYW5zbWl0dGVyIGJsb2NrcyBVTklQSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBTdXBwb3J0cyB1cCB0byA2IGRpZ2l0YWwgb3V0cHV0cworICogLSAyIERJRyBlbmNvZGVyIGJsb2Nrcy4KKyAqIERJRzEvMiBjYW4gZHJpdmUgVU5JUEhZMC8xLzIgbGluayBBIG9yIGxpbmsgQgorICoKICAqIFJvdXRpbmcKICAqIGNydGMgLT4gZGlnIGVuY29kZXIgLT4gVU5JUEhZL0xWVE1BICgxIG9yIDIgbGlua3MpCiAgKiBFeGFtcGxlczoKQEAgLTczNyw2ICs3NDMsNyBAQAogCURJR19FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKIAlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjIgdjI7CiAJRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzIHYzOworCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WNCB2NDsKIH07CiAKIHZvaWQKQEAgLTc1Miw2ICs3NTksNyBAQAogCXVpbnQ4X3QgZnJldiwgY3JldjsKIAlpbnQgZHBfY2xvY2sgPSAwOwogCWludCBkcF9sYW5lX2NvdW50ID0gMDsKKwlpbnQgaHBkX2lkID0gUkFERU9OX0hQRF9OT05FOwogCiAJaWYgKGNvbm5lY3RvcikgewogCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKQEAgLTc2MCw2ICs3NjgsNyBAQAogCiAJCWRwX2Nsb2NrID0gZGlnX2Nvbm5lY3Rvci0+ZHBfY2xvY2s7CiAJCWRwX2xhbmVfY291bnQgPSBkaWdfY29ubmVjdG9yLT5kcF9sYW5lX2NvdW50OworCQlocGRfaWQgPSByYWRlb25fY29ubmVjdG9yLT5ocGQuaHBkOwogCX0KIAogCS8qIG5vIGRpZyBlbmNvZGVyIGFzc2lnbmVkICovCkBAIC03ODQsMTkgKzc5MywzNiBAQAogCWFyZ3MudjEudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOwogCWFyZ3MudjEudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CiAKLQlpZiAoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB7Ci0JCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCi0JCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV8yXzcwR0haOworCWlmICgoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB8fAorCSAgICAoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQX01TVCkpCiAJCWFyZ3MudjEudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKLQl9IGVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayA+IDE2NTAwMCkKKwllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCiAJCWFyZ3MudjEudWNMYW5lTnVtID0gODsKIAllbHNlCiAJCWFyZ3MudjEudWNMYW5lTnVtID0gNDsKIAotCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKKwlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCWlmICgoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSB8fAorCQkgICAgKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QpKSB7CisJCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzJfNzBHSFo7CisJCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCisJCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfNV80MEdIWjsKKwkJfQorCQlhcmdzLnY0LmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKKwkJYXJncy52NC51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7CisJCWlmIChocGRfaWQgPT0gUkFERU9OX0hQRF9OT05FKQorCQkJYXJncy52NC51Y0hQRF9JRCA9IDA7CisJCWVsc2UKKwkJCWFyZ3MudjQudWNIUERfSUQgPSBocGRfaWQgKyAxOworCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJCWlmICgoYXJncy52MS51Y0VuY29kZXJNb2RlID09IEFUT01fRU5DT0RFUl9NT0RFX0RQKSAmJiAoZHBfY2xvY2sgPT0gMjcwMDAwKSkKKwkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzJfNzBHSFo7CiAJCWFyZ3MudjMuYWNDb25maWcudWNEaWdTZWwgPSBkaWctPmRpZ19lbmNvZGVyOwogCQlhcmdzLnYzLnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKIAl9IGVsc2UgeworCQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCisJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV8yXzcwR0haOwogCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgogCQkJYXJncy52MS51Y0NvbmZpZyA9IEFUT01fRU5DT0RFUl9DT05GSUdfVjJfVFJBTlNNSVRURVIxOwpAQCAtODIzLDYgKzg0OSw3IEBACiAJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKIAlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YyIHYyOwogCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjMgdjM7CisJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WNCB2NDsKIH07CiAKIHZvaWQKQEAgLTkxNywxMCArOTQ0LDE4IEBACiAJCQlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoZW5jb2Rlci0+Y3J0Yyk7CiAJCQlwbGxfaWQgPSByYWRlb25fY3J0Yy0+cGxsX2lkOwogCQl9Ci0JCWlmIChpc19kcCAmJiByZGV2LT5jbG9jay5kcF9leHRjbGspCi0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gMjsgLyogZXh0ZXJuYWwgc3JjICovCi0JCWVsc2UKLQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBwbGxfaWQ7CisKKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQkJaWYgKGlzX2RwICYmIHJkZXYtPmNsb2NrLmRwX2V4dGNsaykKKwkJCQlhcmdzLnY0LmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gMzsgLyogZXh0ZXJuYWwgc3JjICovCisJCQllbHNlCisJCQkJYXJncy52NC5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IHBsbF9pZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19kcCAmJiByZGV2LT5jbG9jay5kcF9leHRjbGspCisJCQkJYXJncy52My5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IDI7IC8qIGV4dGVybmFsIHNyYyAqLworCQkJZWxzZQorCQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBwbGxfaWQ7CisJCX0KIAogCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgpAQCAtMTA0NCw2ICsxMDc5LDcgQEAKIAogdW5pb24gZXh0ZXJuYWxfZW5jb2Rlcl9jb250cm9sIHsKIAlFWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTiB2MTsKKwlFWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMyB2MzsKIH07CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDU0LDYgKzEwOTAsNyBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCByYWRlb25fZW5jb2RlciAqcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihlbmNvZGVyKTsKKwlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKmV4dF9yYWRlb25fZW5jb2RlciA9IHRvX3JhZGVvbl9lbmNvZGVyKGV4dF9lbmNvZGVyKTsKIAl1bmlvbiBleHRlcm5hbF9lbmNvZGVyX2NvbnRyb2wgYXJnczsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gcmFkZW9uX2dldF9jb25uZWN0b3JfZm9yX2VuY29kZXIoZW5jb2Rlcik7CiAJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgRXh0ZXJuYWxFbmNvZGVyQ29udHJvbCk7CkBAIC0xMDYxLDYgKzEwOTgsNyBAQAogCWludCBkcF9jbG9jayA9IDA7CiAJaW50IGRwX2xhbmVfY291bnQgPSAwOwogCWludCBjb25uZWN0b3Jfb2JqZWN0X2lkID0gMDsKKwl1MzIgZXh0X2VudW0gPSAoZXh0X3JhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2VudW0gJiBFTlVNX0lEX01BU0spID4+IEVOVU1fSURfU0hJRlQ7CiAKIAlpZiAoY29ubmVjdG9yKSB7CiAJCXN0cnVjdCByYWRlb25fY29ubmVjdG9yICpyYWRlb25fY29ubmVjdG9yID0gdG9fcmFkZW9uX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwpAQCAtMTA5OSw2ICsxMTM3LDM3IEBACiAJCQllbHNlCiAJCQkJYXJncy52MS5zRGlnRW5jb2Rlci51Y0xhbmVOdW0gPSA0OwogCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNBY3Rpb24gPSBhY3Rpb247CisJCQlpZiAoYWN0aW9uID09IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfSU5JVCkKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzQ29ubmVjdG9ySWQgPSBjb25uZWN0b3Jfb2JqZWN0X2lkOworCQkJZWxzZQorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudXNQaXhlbENsb2NrID0gY3B1X3RvX2xlMTYocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrIC8gMTApOworCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0VuY29kZXJNb2RlID0gYXRvbWJpb3NfZ2V0X2VuY29kZXJfbW9kZShlbmNvZGVyKTsKKworCQkJaWYgKGFyZ3MudjMuc0V4dEVuY29kZXIudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgeworCQkJCWlmIChkcF9jbG9jayA9PSAyNzAwMDApCisJCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8yXzcwR0haOworCQkJCWVsc2UgaWYgKGRwX2Nsb2NrID09IDU0MDAwMCkKKwkJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzVfNDBHSFo7CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0xhbmVOdW0gPSBkcF9sYW5lX2NvdW50OworCQkJfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0xhbmVOdW0gPSA4OworCQkJZWxzZQorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gNDsKKwkJCXN3aXRjaCAoZXh0X2VudW0pIHsKKwkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQxOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjE7CisJCQkJYnJlYWs7CisJCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMjoKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIyOworCQkJCWJyZWFrOworCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDM6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlEUk1fRVJST1IoIlVua25vd24gdGFibGUgdmVyc2lvbjogJWQsICVkXG4iLCBmcmV2LCBjcmV2KTsKIAkJCXJldHVybjsKQEAgLTExNTgsNiArMTIyNyw4IEBACiAJRElTUExBWV9ERVZJQ0VfT1VUUFVUX0NPTlRST0xfUFNfQUxMT0NBVElPTiBhcmdzOwogCWludCBpbmRleCA9IDA7CiAJYm9vbCBpc19kaWcgPSBmYWxzZTsKKwlib29sIGlzX2RjZTVfZGFjID0gZmFsc2U7CisJYm9vbCBpc19kY2U1X2R2byA9IGZhbHNlOwogCiAJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwogCkBAIC0xMTgwLDcgKzEyNTEsOSBAQAogCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERWT091dHB1dENvbnRyb2wpOwogCQlicmVhazsKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xOgotCQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKQorCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKQorCQkJaXNfZGNlNV9kdm8gPSB0cnVlOworCQllbHNlIGlmIChBU0lDX0lTX0RDRTMocmRldikpCiAJCQlpc19kaWcgPSB0cnVlOwogCQllbHNlCiAJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERWT091dHB1dENvbnRyb2wpOwpAQCAtMTE5NiwxMiArMTI2OSwxNiBAQAogCQlicmVhazsKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0RBQzE6CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfREFDMToKLQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVjFPdXRwdXRDb250cm9sKTsKLQkJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIENWMU91dHB1dENvbnRyb2wpOwotCQllbHNlCi0JCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIERBQzFPdXRwdXRDb250cm9sKTsKKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkKKwkJCWlzX2RjZTVfZGFjID0gdHJ1ZTsKKwkJZWxzZSB7CisJCQlpZiAocmFkZW9uX2VuY29kZXItPmFjdGl2ZV9kZXZpY2UgJiAoQVRPTV9ERVZJQ0VfVFZfU1VQUE9SVCkpCisJCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBUVjFPdXRwdXRDb250cm9sKTsKKwkJCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQorCQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgQ1YxT3V0cHV0Q29udHJvbCk7CisJCQllbHNlCisJCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMxT3V0cHV0Q29udHJvbCk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMyOgogCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzI6CkBAIC0xMjYwLDYgKzEzMzcsMjggQEAKIAkJCQlhdG9tYmlvc19kaWdfdHJhbnNtaXR0ZXJfc2V0dXAoZW5jb2RlciwgQVRPTV9UUkFOU01JVFRFUl9BQ1RJT05fTENEX0JMT0ZGLCAwLCAwKTsKIAkJCWJyZWFrOwogCQl9CisJfSBlbHNlIGlmIChpc19kY2U1X2RhYykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCQlhdG9tYmlvc19kYWNfc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChpc19kY2U1X2R2bykgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgorCQkJYXRvbWJpb3NfZHZvX3NldHVwKGVuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6CisJCQlhdG9tYmlvc19kdm9fc2V0dXAoZW5jb2RlciwgQVRPTV9ESVNBQkxFKTsKKwkJCWJyZWFrOworCQl9CiAJfSBlbHNlIHsKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKQEAgLTEyODksMTIgKzEzODgsMTggQEAKIAkJc3dpdGNoIChtb2RlKSB7CiAJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKIAkJZGVmYXVsdDoKLQkJCWFjdGlvbiA9IEFUT01fRU5BQkxFOworCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCisJCQkJYWN0aW9uID0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5BQkxFX09VVFBVVDsKKwkJCWVsc2UKKwkJCQlhY3Rpb24gPSBBVE9NX0VOQUJMRTsKIAkJCWJyZWFrOwogCQljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CiAJCWNhc2UgRFJNX01PREVfRFBNU19PRkY6Ci0JCQlhY3Rpb24gPSBBVE9NX0RJU0FCTEU7CisJCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkKKwkJCQlhY3Rpb24gPSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19ESVNBQkxFX09VVFBVVDsKKwkJCWVsc2UKKwkJCQlhY3Rpb24gPSBBVE9NX0RJU0FCTEU7CiAJCQlicmVhazsKIAkJfQogCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBhY3Rpb24pOwpAQCAtMTQ4MywyNyArMTU4OCwzNSBAQAogCXN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqZGlnOwogCXVpbnQzMl90IGRpZ19lbmNfaW5fdXNlID0gMDsKIAorCS8qIERDRTQvNSAqLwogCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKIAkJZGlnID0gcmFkZW9uX2VuY29kZXItPmVuY19wcml2OwotCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgewogCQkJaWYgKGRpZy0+bGlua2IpCiAJCQkJcmV0dXJuIDE7CiAJCQllbHNlCiAJCQkJcmV0dXJuIDA7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgotCQkJaWYgKGRpZy0+bGlua2IpCi0JCQkJcmV0dXJuIDM7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgotCQkJaWYgKGRpZy0+bGlua2IpCi0JCQkJcmV0dXJuIDU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDQ7Ci0JCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZOgorCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlyZXR1cm4gMTsKKwkJCQllbHNlCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkxOgorCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlyZXR1cm4gMzsKKwkJCQllbHNlCisJCQkJCXJldHVybiAyOworCQkJCWJyZWFrOworCQkJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9VTklQSFkyOgorCQkJCWlmIChkaWctPmxpbmtiKQorCQkJCQlyZXR1cm4gNTsKKwkJCQllbHNlCisJCQkJCXJldHVybiA0OworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJfQogCkBAIC0xNjEwLDcgKzE3MjMsMTMgQEAKIAl9CiAKIAlpZiAoZXh0X2VuY29kZXIpIHsKLQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOworCQlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgeworCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpOworCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwKKwkJCQkJCQlFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX1NFVFVQKTsKKwkJfSBlbHNlCisJCQlhdG9tYmlvc19leHRlcm5hbF9lbmNvZGVyX3NldHVwKGVuY29kZXIsIGV4dF9lbmNvZGVyLCBBVE9NX0VOQUJMRSk7CiAJfQogCiAJYXRvbWJpb3NfYXBwbHlfZW5jb2Rlcl9xdWlya3MoZW5jb2RlciwgYWRqdXN0ZWRfbW9kZSk7CkBAIC0xOTI3LDcgKzIwNDYsMTAgQEAKIH0KIAogdm9pZAotcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZW5jb2Rlcl9lbnVtLCB1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlKQorcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCXVpbnQzMl90IGVuY29kZXJfZW51bSwKKwkJCXVpbnQzMl90IHN1cHBvcnRlZF9kZXZpY2UsCisJCQl1MTYgY2FwcykKIHsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwpAQCAtMTk3MCw2ICsyMDkyLDcgQEAKIAlyYWRlb25fZW5jb2Rlci0+cm14X3R5cGUgPSBSTVhfT0ZGOwogCXJhZGVvbl9lbmNvZGVyLT51bmRlcnNjYW5fdHlwZSA9IFVOREVSU0NBTl9PRkY7CiAJcmFkZW9uX2VuY29kZXItPmlzX2V4dF9lbmNvZGVyID0gZmFsc2U7CisJcmFkZW9uX2VuY29kZXItPmNhcHMgPSBjYXBzOwogCiAJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewogCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfTFZEUzoKQEAgLTIwMjksNiArMjE1Miw4IEBACiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9USVRGUDUxMzoKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1ZUMTYyMzoKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0hETUlfU0kxOTMwOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVFJBVklTOgorCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHOgogCQkvKiB0aGVzZSBhcmUgaGFuZGxlZCBieSB0aGUgcHJpbWFyeSBlbmNvZGVycyAqLwogCQlyYWRlb25fZW5jb2Rlci0+aXNfZXh0X2VuY29kZXIgPSB0cnVlOwogCQlpZiAocmFkZW9uX2VuY29kZXItPmRldmljZXMgJiAoQVRPTV9ERVZJQ0VfTENEX1NVUFBPUlQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaAppbmRleCBlMzI5MDY2Li4xY2E1NWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYW1pbHkuaApAQCAtODAsNiArODAsMTAgQEAKIAlDSElQX0pVTklQRVIsCiAJQ0hJUF9DWVBSRVNTLAogCUNISVBfSEVNTE9DSywKKwlDSElQX1BBTE0sCisJQ0hJUF9CQVJUUywKKwlDSElQX1RVUktTLAorCUNISVBfQ0FJQ09TLAogCUNISVBfTEFTVCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jCmluZGV4IDZhYmVhMzIuLmNhMzJlOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYwpAQCAtMjI1LDggKzIyNSw2IEBACiAKIAlzdHJjcHkoaW5mby0+Zml4LmlkLCAicmFkZW9uZHJtZmIiKTsKIAotCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwotCiAJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19DQU5fRk9SQ0VfT1VUUFVUOwogCWluZm8tPmZib3BzID0gJnJhZGVvbmZiX29wczsKIApAQCAtMjQ3LDggKzI0NSw2IEBACiAJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uYmFzZSA9IHJkZXYtPmRkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CiAJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKIAotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gMDsKLQlpbmZvLT5maXgubW1pb19sZW4gPSAwOwogCWluZm8tPnBpeG1hcC5zaXplID0gNjQqMTAyNDsKIAlpbmZvLT5waXhtYXAuYnVmX2FsaWduID0gODsKIAlpbmZvLT5waXhtYXAuYWNjZXNzX2FsaWduID0gMzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYwppbmRleCBkYWFjYjI4Li4xNzFiMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJyYWRlb25fcmVnLmgiCiAjaW5jbHVkZSAicmFkZW9uLmgiCisjaW5jbHVkZSAicmFkZW9uX3RyYWNlLmgiCiAKIGludCByYWRlb25fZmVuY2VfZW1pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9mZW5jZSAqZmVuY2UpCiB7CkBAIC01Nyw2ICs1OCw3IEBACiAJfSBlbHNlCiAJCXJhZGVvbl9mZW5jZV9yaW5nX2VtaXQocmRldiwgZmVuY2UpOwogCisJdHJhY2VfcmFkZW9uX2ZlbmNlX2VtaXQocmRldi0+ZGRldiwgZmVuY2UtPnNlcSk7CiAJZmVuY2UtPmVtaXRlZCA9IHRydWU7CiAJbGlzdF9kZWwoJmZlbmNlLT5saXN0KTsKIAlsaXN0X2FkZF90YWlsKCZmZW5jZS0+bGlzdCwgJnJkZXYtPmZlbmNlX2Rydi5lbWl0ZWQpOwpAQCAtMjEzLDYgKzIxNSw3IEBACiByZXRyeToKIAkvKiBzYXZlIGN1cnJlbnQgc2VxdWVuY2UgdXNlZCB0byBjaGVjayBmb3IgR1BVIGxvY2t1cCAqLwogCXNlcSA9IHJkZXYtPmZlbmNlX2Rydi5sYXN0X3NlcTsKKwl0cmFjZV9yYWRlb25fZmVuY2Vfd2FpdF9iZWdpbihyZGV2LT5kZGV2LCBzZXEpOwogCWlmIChpbnRyKSB7CiAJCXJhZGVvbl9pcnFfa21zX3N3X2lycV9nZXQocmRldik7CiAJCXIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChyZGV2LT5mZW5jZV9kcnYucXVldWUsCkBAIC0yMjcsNiArMjMwLDcgQEAKIAkJCSByYWRlb25fZmVuY2Vfc2lnbmFsZWQoZmVuY2UpLCB0aW1lb3V0KTsKIAkJcmFkZW9uX2lycV9rbXNfc3dfaXJxX3B1dChyZGV2KTsKIAl9CisJdHJhY2VfcmFkZW9uX2ZlbmNlX3dhaXRfZW5kKHJkZXYtPmRkZXYsIHNlcSk7CiAJaWYgKHVubGlrZWx5KCFyYWRlb25fZmVuY2Vfc2lnbmFsZWQoZmVuY2UpKSkgewogCQkvKiB3ZSB3ZXJlIGludGVycnVwdGVkIGZvciBzb21lIHJlYXNvbiBhbmQgZmVuY2UgaXNuJ3QKIAkJICogaXNuJ3Qgc2lnbmFsZWQgeWV0LCByZXN1bWUgd2FpdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCmluZGV4IGExMDhjN2UuLmEyODk2NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKQEAgLTY0LDE1ICs2NCwxNSBAQAogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpOwogCi0JSU5JVF9XT1JLKCZyZGV2LT5ob3RwbHVnX3dvcmssIHJhZGVvbl9ob3RwbHVnX3dvcmtfZnVuYyk7Ci0KIAkvKiBEaXNhYmxlICphbGwqIGludGVycnVwdHMgKi8KIAlyZGV2LT5pcnEuc3dfaW50ID0gZmFsc2U7CiAJcmRldi0+aXJxLmd1aV9pZGxlID0gZmFsc2U7CiAJZm9yIChpID0gMDsgaSA8IHJkZXYtPm51bV9jcnRjOyBpKyspCiAJCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJcmRldi0+aXJxLmhwZFtpXSA9IGZhbHNlOworCQlyZGV2LT5pcnEucGZsaXBbaV0gPSBmYWxzZTsKKwl9CiAJcmFkZW9uX2lycV9zZXQocmRldik7CiAJLyogQ2xlYXIgYml0cyAqLwogCXJhZGVvbl9pcnFfcHJvY2VzcyhyZGV2KTsKQEAgLTEwMSw4ICsxMDEsMTAgQEAKIAlyZGV2LT5pcnEuZ3VpX2lkbGUgPSBmYWxzZTsKIAlmb3IgKGkgPSAwOyBpIDwgcmRldi0+bnVtX2NydGM7IGkrKykKIAkJcmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFtpXSA9IGZhbHNlOwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQlyZGV2LT5pcnEuaHBkW2ldID0gZmFsc2U7CisJCXJkZXYtPmlycS5wZmxpcFtpXSA9IGZhbHNlOworCX0KIAlyYWRlb25faXJxX3NldChyZGV2KTsKIH0KIApAQCAtMTEwLDYgKzExMiw4IEBACiB7CiAJaW50IHIgPSAwOwogCisJSU5JVF9XT1JLKCZyZGV2LT5ob3RwbHVnX3dvcmssIHJhZGVvbl9ob3RwbHVnX3dvcmtfZnVuYyk7CisKIAlzcGluX2xvY2tfaW5pdCgmcmRldi0+aXJxLnN3X2xvY2spOwogCXIgPSBkcm1fdmJsYW5rX2luaXQocmRldi0+ZGRldiwgcmRldi0+bnVtX2NydGMpOwogCWlmIChyKSB7CkBAIC0xMjEsNyArMTI1LDcgQEAKIAkgKiBjaGlwcy4gIERpc2FibGUgTVNJIG9uIHRoZW0gZm9yIG5vdy4KIAkgKi8KIAlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JWMzgwKSAmJgotCSAgICAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSAmJgorCSAgICAoKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgfHwgKHJkZXYtPmZhbWlseSA+PSBDSElQX1BBTE0pKSAmJgogCSAgICAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApKSkgewogCQlpbnQgcmV0ID0gcGNpX2VuYWJsZV9tc2kocmRldi0+cGRldik7CiAJCWlmICghcmV0KSB7CkBAIC0xNDgsNiArMTUyLDcgQEAKIAkJaWYgKHJkZXYtPm1zaV9lbmFibGVkKQogCQkJcGNpX2Rpc2FibGVfbXNpKHJkZXYtPnBkZXYpOwogCX0KKwlmbHVzaF93b3JrX3N5bmMoJnJkZXYtPmhvdHBsdWdfd29yayk7CiB9CiAKIHZvaWQgcmFkZW9uX2lycV9rbXNfc3dfaXJxX2dldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTE3NSwzICsxODAsMzQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5pcnEuc3dfbG9jaywgaXJxZmxhZ3MpOwogfQogCit2b2lkIHJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlpZiAoY3J0YyA8IDAgfHwgY3J0YyA+PSByZGV2LT5udW1fY3J0YykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJkZXYtPmlycS5wZmxpcF9sb2NrW2NydGNdLCBpcnFmbGFncyk7CisJaWYgKHJkZXYtPmRkZXYtPmlycV9lbmFibGVkICYmICgrK3JkZXYtPmlycS5wZmxpcF9yZWZjb3VudFtjcnRjXSA9PSAxKSkgeworCQlyZGV2LT5pcnEucGZsaXBbY3J0Y10gPSB0cnVlOworCQlyYWRlb25faXJxX3NldChyZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aXJxLnBmbGlwX2xvY2tbY3J0Y10sIGlycWZsYWdzKTsKK30KKwordm9pZCByYWRlb25faXJxX2ttc19wZmxpcF9pcnFfcHV0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKK3sKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gcmRldi0+bnVtX2NydGMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5pcnEucGZsaXBfbG9ja1tjcnRjXSwgaXJxZmxhZ3MpOworCUJVR19PTihyZGV2LT5kZGV2LT5pcnFfZW5hYmxlZCAmJiByZGV2LT5pcnEucGZsaXBfcmVmY291bnRbY3J0Y10gPD0gMCk7CisJaWYgKHJkZXYtPmRkZXYtPmlycV9lbmFibGVkICYmICgtLXJkZXYtPmlycS5wZmxpcF9yZWZjb3VudFtjcnRjXSA9PSAwKSkgeworCQlyZGV2LT5pcnEucGZsaXBbY3J0Y10gPSBmYWxzZTsKKwkJcmFkZW9uX2lycV9zZXQocmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmlycS5wZmxpcF9sb2NrW2NydGNdLCBpcnFmbGFncyk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa21zLmMKaW5kZXggOGZiYmUxYy4uMjhhNTNlNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCkBAIC05Niw5ICs5NiwyNyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgdm9pZCByYWRlb25fc2V0X2ZpbHBfcmlnaHRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRybV9maWxlICoqb3duZXIsCisJCQkJICAgc3RydWN0IGRybV9maWxlICphcHBsaWVyLAorCQkJCSAgIHVpbnQzMl90ICp2YWx1ZSkKK3sKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKCp2YWx1ZSA9PSAxKSB7CisJCS8qIHdhbnRzIHJpZ2h0cyAqLworCQlpZiAoISpvd25lcikKKwkJCSpvd25lciA9IGFwcGxpZXI7CisJfSBlbHNlIGlmICgqdmFsdWUgPT0gMCkgeworCQkvKiByZXZva2VzIHJpZ2h0cyAqLworCQlpZiAoKm93bmVyID09IGFwcGxpZXIpCisJCQkqb3duZXIgPSBOVUxMOworCX0KKwkqdmFsdWUgPSAqb3duZXIgPT0gYXBwbGllciA/IDEgOiAwOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworfQogCiAvKgotICogVXNlcnNwYWNlIGdldCBpbmZvcm1hdGlvbnMgaW9jdGwKKyAqIFVzZXJzcGFjZSBnZXQgaW5mb3JtYXRpb24gaW9jdGwKICAqLwogaW50IHJhZGVvbl9pbmZvX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlscCkKIHsKQEAgLTE3MywxOCArMTkxLDE1IEBACiAJCQlEUk1fREVCVUdfS01TKCJXQU5UX0hZUEVSWjogaW52YWxpZCB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlpZiAodmFsdWUgPT0gMSkgewotCQkJLyogd2FudHMgaHlwZXIteiAqLwotCQkJaWYgKCFyZGV2LT5oeXBlcnpfZmlscCkKLQkJCQlyZGV2LT5oeXBlcnpfZmlscCA9IGZpbHA7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gMCkgewotCQkJLyogcmV2b2tlcyBoeXBlci16ICovCi0JCQlpZiAocmRldi0+aHlwZXJ6X2ZpbHAgPT0gZmlscCkKLQkJCQlyZGV2LT5oeXBlcnpfZmlscCA9IE5VTEw7CisJCXJhZGVvbl9zZXRfZmlscF9yaWdodHMoZGV2LCAmcmRldi0+aHlwZXJ6X2ZpbHAsIGZpbHAsICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0lORk9fV0FOVF9DTUFTSzoKKwkJLyogVGhlIHNhbWUgbG9naWMgYXMgSHlwZXItWi4gKi8KKwkJaWYgKHZhbHVlID49IDIpIHsKKwkJCURSTV9ERUJVR19LTVMoIldBTlRfQ01BU0s6IGludmFsaWQgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXZhbHVlID0gcmRldi0+aHlwZXJ6X2ZpbHAgPT0gZmlscCA/ICAxIDogMDsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJhZGVvbl9zZXRfZmlscF9yaWdodHMoZGV2LCAmcmRldi0+Y21hc2tfZmlscCwgZmlscCwgJnZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0tNUygiSW52YWxpZCByZXF1ZXN0ICVkXG4iLCBpbmZvLT5yZXF1ZXN0KTsKQEAgLTIwMywxMCArMjE4LDYgQEAKICAqLwogaW50IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChyZGV2LT5wb3dlcmVkX2Rvd24pCi0JCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQogCkBAIC0yNzcsNiArMjg4LDI3IEBACiAJcmFkZW9uX2lycV9zZXQocmRldik7CiB9CiAKK2ludCByYWRlb25fZ2V0X3ZibGFua190aW1lc3RhbXBfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICBpbnQgKm1heF9lcnJvciwKKwkJCQkgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJCSAgICB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmRybWNydGM7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gZGV2LT5udW1fY3J0Y3MpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGNydGMgJWRcbiIsIGNydGMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgYXNzb2NpYXRlZCBkcm1fY3J0YzogKi8KKwlkcm1jcnRjID0gJnJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjXS0+YmFzZTsKKworCS8qIEhlbHBlciByb3V0aW5lIGluIERSTSBjb3JlIGRvZXMgYWxsIHRoZSB3b3JrOiAqLworCXJldHVybiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKGRldiwgY3J0YywgbWF4X2Vycm9yLAorCQkJCQkJICAgICB2YmxhbmtfdGltZSwgZmxhZ3MsCisJCQkJCQkgICAgIGRybWNydGMpOworfQogCiAvKgogICogSU9DVEwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKaW5kZXggZTMwMWM2Zi4uMTJiZGVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaApAQCAtMjc3LDYgKzI3Nyw5IEBACiAJZml4ZWQyMF8xMiBoc2M7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbmF0aXZlX21vZGU7CiAJaW50IHBsbF9pZDsKKwkvKiBwYWdlIGZsaXBwaW5nICovCisJc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp1bnBpbl93b3JrOworCWludCBkZWZlcnJlZF9mbGlwX2NvbXBsZXRpb247CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfcHJpbWFyeV9kYWMgewpAQCAtMzc2LDYgKzM3OSw3IEBACiAJaW50IGhkbWlfYXVkaW9fd29ya2Fyb3VuZDsKIAlpbnQgaGRtaV9idWZmZXJfc3RhdHVzOwogCWJvb2wgaXNfZXh0X2VuY29kZXI7CisJdTE2IGNhcHM7CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyB7CkBAIC00NDIsMTAgKzQ0Niw2IEBACiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiB9OwogCi0vKiByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcygpIHJldHVybiBmbGFncyAqLwotI2RlZmluZSBSQURFT05fU0NBTk9VVFBPU19WQUxJRCAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgUkFERU9OX1NDQU5PVVRQT1NfSU5WQkwgICAgICAgICgxIDw8IDEpCi0jZGVmaW5lIFJBREVPTl9TQ0FOT1VUUE9TX0FDQ1VSQVRFICAgICAoMSA8PCAyKQogCiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCiByYWRlb25fY29tYmlvc19nZXRfdHZfaW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC01NjIsMTEgKzU2MiwxMiBAQAogZXh0ZXJuIGludCByYWRlb25fY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJICAgaW50IHgsIGludCB5KTsKIAotZXh0ZXJuIGludCByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIGludCAqdnBvcywgaW50ICpocG9zKTsKK2V4dGVybiBpbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICAgaW50ICp2cG9zLCBpbnQgKmhwb3MpOwogCiBleHRlcm4gYm9vbCByYWRlb25fY29tYmlvc19jaGVja19oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gc3RydWN0IGVkaWQgKgotcmFkZW9uX2NvbWJpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3JhZGVvbl9iaW9zX2dldF9oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gYm9vbCByYWRlb25fYXRvbV9nZXRfY2xvY2tfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBib29sIHJhZGVvbl9jb21iaW9zX2dldF9jbG9ja19pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqCkBAIC02NjIsNCArNjYzLDcgQEAKIGJvb2wgcmFkZW9uX2ZiZGV2X3JvYmpfaXNfZmIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fYm8gKnJvYmopOwogCiB2b2lkIHJhZGVvbl9mYl9vdXRwdXRfcG9sbF9jaGFuZ2VkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwordm9pZCByYWRlb25fY3J0Y19oYW5kbGVfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKaW5kZXggYTU5OGQwMC4uN2Q2YjhlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKICNpbmNsdWRlICJyYWRlb24uaCIKKyNpbmNsdWRlICJyYWRlb25fdHJhY2UuaCIKIAogCiBpbnQgcmFkZW9uX3R0bV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE0Niw2ICsxNDcsNyBAQAogCQlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJnJkZXYtPmdlbS5vYmplY3RzKTsKIAkJbXV0ZXhfdW5sb2NrKCZiby0+cmRldi0+Z2VtLm11dGV4KTsKIAl9CisJdHJhY2VfcmFkZW9uX2JvX2NyZWF0ZShibyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMiwzNCArMzA0LDkgQEAKIAkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWlmIChsb2JqLT53ZG9tYWluKSB7Ci0JCWxpc3RfYWRkKCZsb2JqLT5saXN0LCBoZWFkKTsKKwkJbGlzdF9hZGQoJmxvYmotPnR2LmhlYWQsIGhlYWQpOwogCX0gZWxzZSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvYmotPmxpc3QsIGhlYWQpOwotCX0KLX0KLQotaW50IHJhZGVvbl9ib19saXN0X3Jlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7Ci0JaW50IHI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUobG9iai0+Ym8sIGZhbHNlKTsKLQkJaWYgKHVubGlrZWx5KHIgIT0gMCkpCi0JCQlyZXR1cm4gcjsKLQkJbG9iai0+cmVzZXJ2ZWQgPSB0cnVlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByYWRlb25fYm9fbGlzdF91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKLQkJLyogb25seSB1bnJlc2VydmUgb2JqZWN0IHdlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZCAqLwotCQlpZiAobG9iai0+cmVzZXJ2ZWQgJiYgcmFkZW9uX2JvX2lzX3Jlc2VydmVkKGxvYmotPmJvKSkKLQkJCXJhZGVvbl9ib191bnJlc2VydmUobG9iai0+Ym8pOworCQlsaXN0X2FkZF90YWlsKCZsb2JqLT50di5oZWFkLCBoZWFkKTsKIAl9CiB9CiAKQEAgLTM0MCwxNCArMzE3LDExIEBACiAJdTMyIGRvbWFpbjsKIAlpbnQgcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgewotCQlsb2JqLT5yZXNlcnZlZCA9IGZhbHNlOwotCX0KLQlyID0gcmFkZW9uX2JvX2xpc3RfcmVzZXJ2ZShoZWFkKTsKKwlyID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhoZWFkKTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkgewogCQlyZXR1cm4gcjsKIAl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCB0di5oZWFkKSB7CiAJCWJvID0gbG9iai0+Ym87CiAJCWlmICghYm8tPnBpbl9jb3VudCkgewogCQkJZG9tYWluID0gbG9iai0+d2RvbWFpbiA/IGxvYmotPndkb21haW4gOiBsb2JqLT5yZG9tYWluOwpAQCAtMzcwLDI1ICszNDQsNiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9ib19saXN0X2ZlbmNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKQotewotCXN0cnVjdCByYWRlb25fYm9fbGlzdCAqbG9iajsKLQlzdHJ1Y3QgcmFkZW9uX2JvICpibzsKLQlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpvbGRfZmVuY2UgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KSB7Ci0JCWJvID0gbG9iai0+Ym87Ci0JCXNwaW5fbG9jaygmYm8tPnRiby5sb2NrKTsKLQkJb2xkX2ZlbmNlID0gKHN0cnVjdCByYWRlb25fZmVuY2UgKiliby0+dGJvLnN5bmNfb2JqOwotCQliby0+dGJvLnN5bmNfb2JqID0gcmFkZW9uX2ZlbmNlX3JlZihmZW5jZSk7Ci0JCWJvLT50Ym8uc3luY19vYmpfYXJnID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJmJvLT50Ym8ubG9jayk7Ci0JCWlmIChvbGRfZmVuY2UpIHsKLQkJCXJhZGVvbl9mZW5jZV91bnJlZigmb2xkX2ZlbmNlKTsKLQkJfQotCX0KLX0KLQogaW50IHJhZGVvbl9ib19mYmRldl9tbWFwKHN0cnVjdCByYWRlb25fYm8gKmJvLAogCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKaW5kZXggZDE0MzcwMi4uMjJkNGMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAJciA9IHR0bV9ib19yZXNlcnZlKCZiby0+dGJvLCB0cnVlLCBub193YWl0LCBmYWxzZSwgMCk7CiAJaWYgKHVubGlrZWx5KHIgIT0gMCkpCiAJCXJldHVybiByOwotCXNwaW5fbG9jaygmYm8tPnRiby5sb2NrKTsKKwlzcGluX2xvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7CiAJaWYgKG1lbV90eXBlKQogCQkqbWVtX3R5cGUgPSBiby0+dGJvLm1lbS5tZW1fdHlwZTsKIAlpZiAoYm8tPnRiby5zeW5jX29iaikKIAkJciA9IHR0bV9ib193YWl0KCZiby0+dGJvLCB0cnVlLCB0cnVlLCBub193YWl0KTsKLQlzcGluX3VubG9jaygmYm8tPnRiby5sb2NrKTsKKwlzcGluX3VubG9jaygmYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKIAl0dG1fYm9fdW5yZXNlcnZlKCZiby0+dGJvKTsKIAlyZXR1cm4gcjsKIH0KQEAgLTE1MiwxMCArMTUyLDcgQEAKIGV4dGVybiB2b2lkIHJhZGVvbl9ib19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9ib19saXN0X2FkZF9vYmplY3Qoc3RydWN0IHJhZGVvbl9ib19saXN0ICpsb2JqLAogCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotZXh0ZXJuIGludCByYWRlb25fYm9fbGlzdF9yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX2xpc3RfdW5yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogZXh0ZXJuIGludCByYWRlb25fYm9fbGlzdF92YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9ib19saXN0X2ZlbmNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKTsKIGV4dGVybiBpbnQgcmFkZW9uX2JvX2ZiZGV2X21tYXAoc3RydWN0IHJhZGVvbl9ibyAqYm8sCiAJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIGludCByYWRlb25fYm9fc2V0X3RpbGluZ19mbGFncyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCmluZGV4IDhjOWIyZWYuLjNiMWIyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwpAQCAtMTY3LDEzICsxNjcsMTMgQEAKIAlpZiAocmFkZW9uX2d1aV9pZGxlKHJkZXYpKSB7CiAJCXNjbGsgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtyZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXhdLgogCQkJY2xvY2tfaW5mb1tyZGV2LT5wbS5yZXF1ZXN0ZWRfY2xvY2tfbW9kZV9pbmRleF0uc2NsazsKLQkJaWYgKHNjbGsgPiByZGV2LT5jbG9jay5kZWZhdWx0X3NjbGspCi0JCQlzY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOworCQlpZiAoc2NsayA+IHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKKwkJCXNjbGsgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGs7CiAKIAkJbWNsayA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleF0uCiAJCQljbG9ja19pbmZvW3JkZXYtPnBtLnJlcXVlc3RlZF9jbG9ja19tb2RlX2luZGV4XS5tY2xrOwotCQlpZiAobWNsayA+IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsaykKLQkJCW1jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCWlmIChtY2xrID4gcmRldi0+cG0uZGVmYXVsdF9tY2xrKQorCQkJbWNsayA9IHJkZXYtPnBtLmRlZmF1bHRfbWNsazsKIAogCQkvKiB1cHZvbHQgYmVmb3JlIHJhaXNpbmcgY2xvY2tzLCBkb3dudm9sdCBhZnRlciBsb3dlcmluZyBjbG9ja3MgKi8KIAkJaWYgKHNjbGsgPCByZGV2LT5wbS5jdXJyZW50X3NjbGspCkBAIC00MDUsMjAgKzQwNSwxMyBAQAogCQlyZGV2LT5wbS5keW5wbV9wbGFubmVkX2FjdGlvbiA9IERZTlBNX0FDVElPTl9ERUZBVUxUOwogCQltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoInByb2ZpbGUiLCBidWYsIHN0cmxlbigicHJvZmlsZSIpKSA9PSAwKSB7Ci0JCWJvb2wgZmx1c2hfd3EgPSBmYWxzZTsKLQogCQltdXRleF9sb2NrKCZyZGV2LT5wbS5tdXRleCk7Ci0JCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNKSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwotCQkJZmx1c2hfd3EgPSB0cnVlOwotCQl9CiAJCS8qIGRpc2FibGUgZHlucG0gKi8KIAkJcmRldi0+cG0uZHlucG1fc3RhdGUgPSBEWU5QTV9TVEFURV9ESVNBQkxFRDsKIAkJcmRldi0+cG0uZHlucG1fcGxhbm5lZF9hY3Rpb24gPSBEWU5QTV9BQ1RJT05fTk9ORTsKIAkJcmRldi0+cG0ucG1fbWV0aG9kID0gUE1fTUVUSE9EX1BST0ZJTEU7CiAJCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwotCQlpZiAoZmx1c2hfd3EpCi0JCQlmbHVzaF93b3JrcXVldWUocmRldi0+d3EpOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiAJfSBlbHNlIHsKIAkJRFJNX0VSUk9SKCJpbnZhbGlkIHBvd2VyIG1ldGhvZCFcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC00NDcsOCArNDQwLDEyIEBACiAJCXRlbXAgPSBydjc3MF9nZXRfdGVtcChyZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOgorCWNhc2UgVEhFUk1BTF9UWVBFX05JOgogCQl0ZW1wID0gZXZlcmdyZWVuX2dldF90ZW1wKHJkZXYpOwogCQlicmVhazsKKwljYXNlIFRIRVJNQUxfVFlQRV9TVU1POgorCQl0ZW1wID0gc3Vtb19nZXRfdGVtcChyZGV2KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdGVtcCA9IDA7CiAJCWJyZWFrOwpAQCAtNDg3LDYgKzQ4NCw3IEBACiAJY2FzZSBUSEVSTUFMX1RZUEVfUlY2WFg6CiAJY2FzZSBUSEVSTUFMX1RZUEVfUlY3NzA6CiAJY2FzZSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOgorCWNhc2UgVEhFUk1BTF9UWVBFX1NVTU86CiAJCXJkZXYtPnBtLmludF9od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIocmRldi0+ZGV2KTsKIAkJaWYgKElTX0VSUihyZGV2LT5wbS5pbnRfaHdtb25fZGV2KSkgewogCQkJZXJyID0gUFRSX0VSUihyZGV2LT5wbS5pbnRfaHdtb25fZGV2KTsKQEAgLTUyMCwzNCArNTE4LDM5IEBACiAKIHZvaWQgcmFkZW9uX3BtX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JYm9vbCBmbHVzaF93cSA9IGZhbHNlOwotCiAJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNKSB7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiAJCWlmIChyZGV2LT5wbS5keW5wbV9zdGF0ZSA9PSBEWU5QTV9TVEFURV9BQ1RJVkUpCiAJCQlyZGV2LT5wbS5keW5wbV9zdGF0ZSA9IERZTlBNX1NUQVRFX1NVU1BFTkRFRDsKLQkJZmx1c2hfd3EgPSB0cnVlOwogCX0KIAltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKLQlpZiAoZmx1c2hfd3EpCi0JCWZsdXNoX3dvcmtxdWV1ZShyZGV2LT53cSk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiB9CiAKIHZvaWQgcmFkZW9uX3BtX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwkvKiBzZXQgdXAgdGhlIGRlZmF1bHQgY2xvY2tzIGlmIHRoZSBNQyB1Y29kZSBpcyBsb2FkZWQgKi8KKwlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpICYmIHJkZXYtPm1jX2Z3KSB7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3ZkZGMpCisJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMpOworCQlpZiAocmRldi0+cG0uZGVmYXVsdF9zY2xrKQorCQkJcmFkZW9uX3NldF9lbmdpbmVfY2xvY2socmRldiwgcmRldi0+cG0uZGVmYXVsdF9zY2xrKTsKKwkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfbWNsaykKKwkJCXJhZGVvbl9zZXRfbWVtb3J5X2Nsb2NrKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfbWNsayk7CisJfQogCS8qIGFzaWMgaW5pdCB3aWxsIHJlc2V0IHRoZSBkZWZhdWx0IHBvd2VyIHN0YXRlICovCiAJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCXJkZXYtPnBtLmN1cnJlbnRfcG93ZXJfc3RhdGVfaW5kZXggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OwogCXJkZXYtPnBtLmN1cnJlbnRfY2xvY2tfbW9kZV9pbmRleCA9IDA7Ci0JcmRldi0+cG0uY3VycmVudF9zY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwotCXJkZXYtPnBtLmN1cnJlbnRfbWNsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKKwlyZGV2LT5wbS5jdXJyZW50X3NjbGsgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGs7CisJcmRldi0+cG0uY3VycmVudF9tY2xrID0gcmRldi0+cG0uZGVmYXVsdF9tY2xrOwogCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52b2x0YWdlOwogCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNCiAJICAgICYmIHJkZXYtPnBtLmR5bnBtX3N0YXRlID09IERZTlBNX1NUQVRFX1NVU1BFTkRFRCkgewogCQlyZGV2LT5wbS5keW5wbV9zdGF0ZSA9IERZTlBNX1NUQVRFX0FDVElWRTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHJkZXYtPndxLCAmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFJBREVPTl9JRExFX0xPT1BfTVMpKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CiAJfQogCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKQEAgLTU2NCw2ICs1NjcsOCBAQAogCXJkZXYtPnBtLmR5bnBtX3BsYW5uZWRfYWN0aW9uID0gRFlOUE1fQUNUSU9OX05PTkU7CiAJcmRldi0+cG0uZHlucG1fY2FuX3VwY2xvY2sgPSB0cnVlOwogCXJkZXYtPnBtLmR5bnBtX2Nhbl9kb3duY2xvY2sgPSB0cnVlOworCXJkZXYtPnBtLmRlZmF1bHRfc2NsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKKwlyZGV2LT5wbS5kZWZhdWx0X21jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CiAJcmRldi0+cG0uY3VycmVudF9zY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwogCXJkZXYtPnBtLmN1cnJlbnRfbWNsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKIAlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX05PTkU7CkBAIC01NzUsMTIgKzU4MCwyNCBAQAogCQkJcmFkZW9uX2NvbWJpb3NfZ2V0X3Bvd2VyX21vZGVzKHJkZXYpOwogCQlyYWRlb25fcG1fcHJpbnRfc3RhdGVzKHJkZXYpOwogCQlyYWRlb25fcG1faW5pdF9wcm9maWxlKHJkZXYpOworCQkvKiBzZXQgdXAgdGhlIGRlZmF1bHQgY2xvY2tzIGlmIHRoZSBNQyB1Y29kZSBpcyBsb2FkZWQgKi8KKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSAmJiByZGV2LT5tY19mdykgeworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkYykKKwkJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMpOworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKKwkJCQlyYWRlb25fc2V0X2VuZ2luZV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfbWNsaykKKwkJCQlyYWRlb25fc2V0X21lbW9yeV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X21jbGspOworCQl9CiAJfQogCiAJLyogc2V0IHVwIHRoZSBpbnRlcm5hbCB0aGVybWFsIHNlbnNvciBpZiBhcHBsaWNhYmxlICovCiAJcmV0ID0gcmFkZW9uX2h3bW9uX2luaXQocmRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssIHJhZGVvbl9keW5wbV9pZGxlX3dvcmtfaGFuZGxlcik7CisKIAlpZiAocmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA+IDEpIHsKIAkJLyogd2hlcmUncyB0aGUgYmVzdCBwbGFjZSB0byBwdXQgdGhlc2U/ICovCiAJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9wcm9maWxlKTsKQEAgLTU5NCw4ICs2MTEsNiBAQAogCQlyZGV2LT5hY3BpX25iLm5vdGlmaWVyX2NhbGwgPSByYWRlb25fYWNwaV9ldmVudDsKIAkJcmVnaXN0ZXJfYWNwaV9ub3RpZmllcigmcmRldi0+YWNwaV9uYik7CiAjZW5kaWYKLQkJSU5JVF9ERUxBWUVEX1dPUksoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yaywgcmFkZW9uX2R5bnBtX2lkbGVfd29ya19oYW5kbGVyKTsKLQogCQlpZiAocmFkZW9uX2RlYnVnZnNfcG1faW5pdChyZGV2KSkgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBQTSFcbiIpOwogCQl9CkBAIC02MDksMjUgKzYyNCwyMCBAQAogdm9pZCByYWRlb25fcG1fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA+IDEpIHsKLQkJYm9vbCBmbHVzaF93cSA9IGZhbHNlOwotCiAJCW11dGV4X2xvY2soJnJkZXYtPnBtLm11dGV4KTsKIAkJaWYgKHJkZXYtPnBtLnBtX21ldGhvZCA9PSBQTV9NRVRIT0RfUFJPRklMRSkgewogCQkJcmRldi0+cG0ucHJvZmlsZSA9IFBNX1BST0ZJTEVfREVGQVVMVDsKIAkJCXJhZGVvbl9wbV91cGRhdGVfcHJvZmlsZShyZGV2KTsKIAkJCXJhZGVvbl9wbV9zZXRfY2xvY2tzKHJkZXYpOwogCQl9IGVsc2UgaWYgKHJkZXYtPnBtLnBtX21ldGhvZCA9PSBQTV9NRVRIT0RfRFlOUE0pIHsKLQkJCS8qIGNhbmNlbCB3b3JrICovCi0JCQljYW5jZWxfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwotCQkJZmx1c2hfd3EgPSB0cnVlOwogCQkJLyogcmVzZXQgZGVmYXVsdCBjbG9ja3MgKi8KIAkJCXJkZXYtPnBtLmR5bnBtX3N0YXRlID0gRFlOUE1fU1RBVEVfRElTQUJMRUQ7CiAJCQlyZGV2LT5wbS5keW5wbV9wbGFubmVkX2FjdGlvbiA9IERZTlBNX0FDVElPTl9ERUZBVUxUOwogCQkJcmFkZW9uX3BtX3NldF9jbG9ja3MocmRldik7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5wbS5tdXRleCk7Ci0JCWlmIChmbHVzaF93cSkKLQkJCWZsdXNoX3dvcmtxdWV1ZShyZGV2LT53cSk7CisKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwogCiAJCWRldmljZV9yZW1vdmVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9wcm9maWxlKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKHJkZXYtPmRldiwgJmRldl9hdHRyX3Bvd2VyX21ldGhvZCk7CkBAIC02ODYsMTIgKzY5NiwxMiBAQAogCQkJCQlyYWRlb25fcG1fZ2V0X2R5bnBtX3N0YXRlKHJkZXYpOwogCQkJCQlyYWRlb25fcG1fc2V0X2Nsb2NrcyhyZGV2KTsKIAotCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCQkJICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAorCQkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOwogCQkJCX0gZWxzZSBpZiAocmRldi0+cG0uZHlucG1fc3RhdGUgPT0gRFlOUE1fU1RBVEVfUEFVU0VEKSB7CiAJCQkJCXJkZXYtPnBtLmR5bnBtX3N0YXRlID0gRFlOUE1fU1RBVEVfQUNUSVZFOwotCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCQkJICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAorCQkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOwogCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJyYWRlb246IGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBhY3RpdmF0ZWRcbiIpOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qIGNvdW50ID09IDAgKi8KQEAgLTcyMCw5ICs3MzAsOSBAQAogCSAqLwogCWZvciAoY3J0YyA9IDA7IChjcnRjIDwgcmRldi0+bnVtX2NydGMpICYmIGluX3ZibDsgY3J0YysrKSB7CiAJCWlmIChyZGV2LT5wbS5hY3RpdmVfY3J0Y3MgJiAoMSA8PCBjcnRjKSkgewotCQkJdmJsX3N0YXR1cyA9IHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zKHJkZXYsIGNydGMsICZ2cG9zLCAmaHBvcyk7Ci0JCQlpZiAoKHZibF9zdGF0dXMgJiBSQURFT05fU0NBTk9VVFBPU19WQUxJRCkgJiYKLQkJCSAgICAhKHZibF9zdGF0dXMgJiBSQURFT05fU0NBTk9VVFBPU19JTlZCTCkpCisJCQl2Ymxfc3RhdHVzID0gcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0YywgJnZwb3MsICZocG9zKTsKKwkJCWlmICgodmJsX3N0YXR1cyAmIERSTV9TQ0FOT1VUUE9TX1ZBTElEKSAmJgorCQkJICAgICEodmJsX3N0YXR1cyAmIERSTV9TQ0FOT1VUUE9TX0lOVkJMKSkKIAkJCQlpbl92YmwgPSBmYWxzZTsKIAkJfQogCX0KQEAgLTc5Niw4ICs4MDYsOCBAQAogCQkJcmFkZW9uX3BtX3NldF9jbG9ja3MocmRldik7CiAJCX0KIAotCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJBREVPTl9JRExFX0xPT1BfTVMpKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5wbS5tdXRleCk7CiAJdHRtX2JvX3VubG9ja19kZWxheWVkX3dvcmtxdWV1ZSgmcmRldi0+bW1hbi5iZGV2LCByZXNjaGVkKTsKQEAgLTgxNCw5ICs4MjQsOSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCXNlcV9wcmludGYobSwgImRlZmF1bHQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByZGV2LT5jbG9jay5kZWZhdWx0X3NjbGspOworCXNlcV9wcmludGYobSwgImRlZmF1bHQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOwogCXNlcV9wcmludGYobSwgImN1cnJlbnQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByYWRlb25fZ2V0X2VuZ2luZV9jbG9jayhyZGV2KSk7Ci0Jc2VxX3ByaW50ZihtLCAiZGVmYXVsdCBtZW1vcnkgY2xvY2s6ICV1MCBrSHpcbiIsIHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsayk7CisJc2VxX3ByaW50ZihtLCAiZGVmYXVsdCBtZW1vcnkgY2xvY2s6ICV1MCBrSHpcbiIsIHJkZXYtPnBtLmRlZmF1bHRfbWNsayk7CiAJaWYgKHJkZXYtPmFzaWMtPmdldF9tZW1vcnlfY2xvY2spCiAJCXNlcV9wcmludGYobSwgImN1cnJlbnQgbWVtb3J5IGNsb2NrOiAldTAga0h6XG4iLCByYWRlb25fZ2V0X21lbW9yeV9jbG9jayhyZGV2KSk7CiAJaWYgKHJkZXYtPnBtLmN1cnJlbnRfdmRkYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKaW5kZXggNjQ5Mjg4MS4uM2NkNGRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlICJyNTAwX3JlZy5oIgogI2luY2x1ZGUgInI2MDBfcmVnLmgiCiAjaW5jbHVkZSAiZXZlcmdyZWVuX3JlZy5oIgorI2luY2x1ZGUgIm5pX3JlZy5oIgogCiAjZGVmaW5lIFJBREVPTl9NQ19BR1BfTE9DQVRJT04JCTB4MDE0YwogI2RlZmluZQkJUkFERU9OX01DX0FHUF9TVEFSVF9NQVNLCTB4MDAwMEZGRkYKQEAgLTMyMCw2ICszMjEsMTUgQEAKICMgICAgICAgZGVmaW5lIFJBREVPTl9QQ0lFX0xDX1JFQ09ORklHX05PVyAgICAgICAgICgxIDw8IDgpCiAjICAgICAgIGRlZmluZSBSQURFT05fUENJRV9MQ19SRUNPTkZJR19MQVRFUiAgICAgICAoMSA8PCA5KQogIyAgICAgICBkZWZpbmUgUkFERU9OX1BDSUVfTENfU0hPUlRfUkVDT05GSUdfRU4gICAgKDEgPDwgMTApCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFICAgKDEgPDwgNykKKyMgICAgICAgZGVmaW5lIFI2MDBfUENJRV9MQ19SRU5FR09USUFUSU9OX1NVUFBPUlQgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfUkVORUdPVElBVEVfRU4gICAgICAgICAoMSA8PCAxMCkKKyMgICAgICAgZGVmaW5lIFI2MDBfUENJRV9MQ19TSE9SVF9SRUNPTkZJR19FTiAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgUjYwMF9QQ0lFX0xDX1VQQ09ORklHVVJFX1NVUFBPUlQgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfVVBDT05GSUdVUkVfRElTICAgICAgICAoMSA8PCAxMykKKworI2RlZmluZSBSNjAwX1RBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVYICAgICAgMHg3MGMKKyNkZWZpbmUgUjcwMF9UQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWCAgICAgIDB4NjZjCiAKICNkZWZpbmUgUkFERU9OX0NBQ0hFX0NOVEwgICAgICAgICAgICAgICAgICAgMHgxNzI0CiAjZGVmaW5lIFJBREVPTl9DQUNIRV9MSU5FICAgICAgICAgICAgICAgICAgIDB4MGYwYyAvKiBQQ0kgKi8KQEAgLTQyMiw2ICs0MzIsNyBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfQ1NZTkNfRU4gICAgICAgICAoMSA8PCAgNCkKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0lDT05fRU4gICAgICAgICAgKDEgPDwgMTUpCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfRU4gICAgICAgICAgICgxIDw8IDE2KQorIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfVlNUQVRfTU9ERV9NQVNLICAoMyA8PCAxNykKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0NVUl9NT0RFX01BU0sgICAgKDcgPDwgMjApCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfTU9ERV9TSElGVCAgIDIwCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfTU9ERV9NT05PICAgIDAKQEAgLTUwOSw2ICs1MjAsOCBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfVElMRV9FTiAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgICAgICAgICAgICAgKDEgPDwgMTYpCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19TVEVSRU9fT0ZGU0VUX0VOICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfR1VJX1RSSUdfT0ZGU0VUX0xFRlRfRU4gICAgICAoMSA8PCAyOCkKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0dVSV9UUklHX09GRlNFVF9SSUdIVF9FTiAgICAgKDEgPDwgMjkpCiAKICNkZWZpbmUgUjMwMF9DUlRDX1RJTEVfWDBfWTAJICAgICAgICAgICAgMHgwMzUwCiAjZGVmaW5lIFIzMDBfQ1JUQzJfVElMRV9YMF9ZMAkgICAgICAgICAgICAweDAzNTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmQ4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCkBAIC0wLDAgKzEsODIgQEAKKyNpZiAhZGVmaW5lZChfUkFERU9OX1RSQUNFX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9SQURFT05fVFJBQ0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gcmFkZW9uCisjZGVmaW5lIFRSQUNFX1NZU1RFTV9TVFJJTkcgX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKQorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgcmFkZW9uX3RyYWNlCisKK1RSQUNFX0VWRU5UKHJhZGVvbl9ib19jcmVhdGUsCisJICAgIFRQX1BST1RPKHN0cnVjdCByYWRlb25fYm8gKmJvKSwKKwkgICAgVFBfQVJHUyhibyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQoc3RydWN0IHJhZGVvbl9ibyAqLCBibykKKwkJCSAgICAgX19maWVsZCh1MzIsIHBhZ2VzKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+Ym8gPSBibzsKKwkJCSAgIF9fZW50cnktPnBhZ2VzID0gYm8tPnRiby5udW1fcGFnZXM7CisJCQkgICApLAorCSAgICBUUF9wcmludGsoImJvPSVwLCBwYWdlcz0ldSIsIF9fZW50cnktPmJvLCBfX2VudHJ5LT5wYWdlcykKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MocmFkZW9uX2ZlbmNlX3JlcXVlc3QsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworREVGSU5FX0VWRU5UKHJhZGVvbl9mZW5jZV9yZXF1ZXN0LCByYWRlb25fZmVuY2VfZW1pdCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKK0RFRklORV9FVkVOVChyYWRlb25fZmVuY2VfcmVxdWVzdCwgcmFkZW9uX2ZlbmNlX3JldGlyZSwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKK0RFRklORV9FVkVOVChyYWRlb25fZmVuY2VfcmVxdWVzdCwgcmFkZW9uX2ZlbmNlX3dhaXRfYmVnaW4sCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pCispOworCitERUZJTkVfRVZFTlQocmFkZW9uX2ZlbmNlX3JlcXVlc3QsIHJhZGVvbl9mZW5jZV93YWl0X2VuZCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKKyNlbmRpZgorCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlX3BvaW50cy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHJhY2VfcG9pbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3NTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlX3BvaW50cy5jCkBAIC0wLDAgKzEsOSBAQAorLyogQ29weXJpZ2h0IFJlZCBIYXQgSW5jIDIwMTAuCisgKiBBdXRob3IgOiBEYXZlIEFpcmxpZSA8YWlybGllZEByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uLmgiCisKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgInJhZGVvbl90cmFjZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcnY1MTUKaW5kZXggYjNmOWYxZC4uZWY0MjJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3J2NTE1CkBAIC0zMDQsNiArMzA0LDIyIEBACiAweDQ2MzAgVVNfQ09ERV9BRERSCiAweDQ2MzQgVVNfQ09ERV9SQU5HRQogMHg0NjM4IFVTX0NPREVfT0ZGU0VUCisweDQ2NDAgVVNfRk9STUFUMF8wCisweDQ2NDQgVVNfRk9STUFUMF8xCisweDQ2NDggVVNfRk9STUFUMF8yCisweDQ2NEMgVVNfRk9STUFUMF8zCisweDQ2NTAgVVNfRk9STUFUMF80CisweDQ2NTQgVVNfRk9STUFUMF81CisweDQ2NTggVVNfRk9STUFUMF82CisweDQ2NUMgVVNfRk9STUFUMF83CisweDQ2NjAgVVNfRk9STUFUMF84CisweDQ2NjQgVVNfRk9STUFUMF85CisweDQ2NjggVVNfRk9STUFUMF8xMAorMHg0NjZDIFVTX0ZPUk1BVDBfMTEKKzB4NDY3MCBVU19GT1JNQVQwXzEyCisweDQ2NzQgVVNfRk9STUFUMF8xMworMHg0Njc4IFVTX0ZPUk1BVDBfMTQKKzB4NDY3QyBVU19GT1JNQVQwXzE1CiAweDQ2QTQgVVNfT1VUX0ZNVF8wCiAweDQ2QTggVVNfT1VUX0ZNVF8xCiAweDQ2QUMgVVNfT1VUX0ZNVF8yCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggZjFjNmUwMmMuLmI0MTkyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTQ2LDYgKzQ2LDU2IEBACiB2b2lkIHJzNjAwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGludCByczYwMF9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAordm9pZCByczYwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdOworCXUzMiB0bXA7CisKKwkvKiBtYWtlIHN1cmUgZmxpcCBpcyBhdCB2YiByYXRoZXIgdGhhbiBoYiAqLworCXRtcCA9IFJSRUczMihBVklWT19EMUdSUEhfRkxJUF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KTsKKwl0bXAgJj0gfkFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9IX1JFVFJBQ0VfRU47CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9GTElQX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBzZXQgcGFnZWZsaXAgdG8gaGFwcGVuIGFueXdoZXJlIGluIHZibGFuayBpbnRlcnZhbCAqLworCVdSRUczMihBVklWT19EMU1PREVfTUFTVEVSX1VQREFURV9NT0RFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKworCS8qIGVuYWJsZSB0aGUgcGZsaXAgaW50ICovCisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX2dldChyZGV2LCBjcnRjKTsKK30KKwordm9pZCByczYwMF9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJLyogZGlzYWJsZSB0aGUgcGZsaXAgaW50ICovCisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChyZGV2LCBjcnRjKTsKK30KKwordTMyIHJzNjAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQsIHU2NCBjcnRjX2Jhc2UpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKKwl1MzIgdG1wID0gUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCisJLyogTG9jayB0aGUgZ3JhcGhpY3MgdXBkYXRlIGxvY2sgKi8KKwl0bXAgfD0gQVZJVk9fRDFHUlBIX1VQREFURV9MT0NLOworCVdSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworCisJLyogdXBkYXRlIHRoZSBzY2Fub3V0IGFkZHJlc3NlcyAqLworCVdSRUczMihBVklWT19EMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKHUzMiljcnRjX2Jhc2UpOworCVdSRUczMihBVklWT19EMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKKworCS8qIFdhaXQgZm9yIHVwZGF0ZV9wZW5kaW5nIHRvIGdvIGhpZ2guICovCisJd2hpbGUgKCEoUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpKTsKKwlEUk1fREVCVUcoIlVwZGF0ZSBwZW5kaW5nIG5vdyBoaWdoLiBVbmxvY2tpbmcgdnVwZGF0ZV9sb2NrLlxuIik7CisKKwkvKiBVbmxvY2sgdGhlIGxvY2ssIHNvIGRvdWJsZS1idWZmZXJpbmcgY2FuIHRha2UgcGxhY2UgaW5zaWRlIHZibGFuayAqLworCXRtcCAmPSB+QVZJVk9fRDFHUlBIX1VQREFURV9MT0NLOworCVdSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworCisJLyogUmV0dXJuIGN1cnJlbnQgdXBkYXRlX3BlbmRpbmcgc3RhdHVzOiAqLworCXJldHVybiBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORzsKK30KKwogdm9pZCByczYwMF9wbV9taXNjKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCWludCByZXF1ZXN0ZWRfaW5kZXggPSByZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXg7CkBAIC01MTUsMTAgKzU2NSwxMiBAQAogCWlmIChyZGV2LT5pcnEuZ3VpX2lkbGUpIHsKIAkJdG1wIHw9IFNfMDAwMDQwX0dVSV9JRExFKDEpOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFswXSkgewogCQltb2RlX2ludCB8PSBTXzAwNjU0MF9EMU1PREVfVkJMQU5LX0lOVF9NQVNLKDEpOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFsxXSkgewogCQltb2RlX2ludCB8PSBTXzAwNjU0MF9EMk1PREVfVkJMQU5LX0lOVF9NQVNLKDEpOwogCX0KIAlpZiAocmRldi0+aXJxLmhwZFswXSkgewpAQCAtNTM0LDcgKzU4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgcnM2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyICpyNTAwX2Rpc3BfaW50KQorc3RhdGljIGlubGluZSB1MzIgcnM2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1aW50MzJfdCBpcnFzID0gUlJFRzMyKFJfMDAwMDQ0X0dFTl9JTlRfU1RBVFVTKTsKIAl1aW50MzJfdCBpcnFfbWFzayA9IFNfMDAwMDQ0X1NXX0lOVCgxKTsKQEAgLTU0NywyNyArNTk5LDI3IEBACiAJfQogCiAJaWYgKEdfMDAwMDQ0X0RJU1BMQVlfSU5UX1NUQVQoaXJxcykpIHsKLQkJKnI1MDBfZGlzcF9pbnQgPSBSUkVHMzIoUl8wMDdFRENfRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKLQkJaWYgKEdfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQoKnI1MDBfZGlzcF9pbnQpKSB7CisJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCA9IFJSRUczMihSXzAwN0VEQ19ESVNQX0lOVEVSUlVQVF9TVEFUVVMpOworCQlpZiAoR18wMDdFRENfTEJfRDFfVkJMQU5LX0lOVEVSUlVQVChyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpKSB7CiAJCQlXUkVHMzIoUl8wMDY1MzRfRDFNT0RFX1ZCTEFOS19TVEFUVVMsCiAJCQkJU18wMDY1MzRfRDFNT0RFX1ZCTEFOS19BQ0soMSkpOwogCQl9Ci0JCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKCpyNTAwX2Rpc3BfaW50KSkgeworCQlpZiAoR18wMDdFRENfTEJfRDJfVkJMQU5LX0lOVEVSUlVQVChyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpKSB7CiAJCQlXUkVHMzIoUl8wMDZEMzRfRDJNT0RFX1ZCTEFOS19TVEFUVVMsCiAJCQkJU18wMDZEMzRfRDJNT0RFX1ZCTEFOS19BQ0soMSkpOwogCQl9Ci0JCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QxX0lOVEVSUlVQVCgqcjUwMF9kaXNwX2ludCkpIHsKKwkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCXRtcCA9IFJSRUczMihSXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MKTsKIAkJCXRtcCB8PSBTXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9BQ0soMSk7CiAJCQlXUkVHMzIoUl8wMDdEMDhfRENfSE9UX1BMVUdfREVURUNUMV9JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQotCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMl9JTlRFUlJVUFQoKnI1MDBfZGlzcF9pbnQpKSB7CisJCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QyX0lOVEVSUlVQVChyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpKSB7CiAJCQl0bXAgPSBSUkVHMzIoUl8wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCk7CiAJCQl0bXAgfD0gU18wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQUNLKDEpOwogCQkJV1JFRzMyKFJfMDA3RDE4X0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5UX0NPTlRST0wsIHRtcCk7CiAJCX0KIAl9IGVsc2UgewotCQkqcjUwMF9kaXNwX2ludCA9IDA7CisJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCA9IDA7CiAJfQogCiAJaWYgKGlycXMpIHsKQEAgLTU3OCwzMiArNjMwLDMwIEBACiAKIHZvaWQgcnM2MDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIHRtcDsKLQogCVdSRUczMihSXzAwMDA0MF9HRU5fSU5UX0NOVEwsIDApOwogCVdSRUczMihSXzAwNjU0MF9EeE1PREVfSU5UX01BU0ssIDApOwogCS8qIFdhaXQgYW5kIGFja25vd2xlZGdlIGlycSAqLwogCW1kZWxheSgxKTsKLQlyczYwMF9pcnFfYWNrKHJkZXYsICZ0bXApOworCXJzNjAwX2lycV9hY2socmRldik7CiB9CiAKIGludCByczYwMF9pcnFfcHJvY2VzcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1aW50MzJfdCBzdGF0dXMsIG1zaV9yZWFybTsKLQl1aW50MzJfdCByNTAwX2Rpc3BfaW50OworCXUzMiBzdGF0dXMsIG1zaV9yZWFybTsKIAlib29sIHF1ZXVlX2hvdHBsdWcgPSBmYWxzZTsKIAogCS8qIHJlc2V0IGd1aSBpZGxlIGFjay4gIHRoZSBzdGF0dXMgYml0IGlzIGJyb2tlbiAqLwogCXJkZXYtPmlycS5ndWlfaWRsZV9hY2tlZCA9IGZhbHNlOwogCi0Jc3RhdHVzID0gcnM2MDBfaXJxX2FjayhyZGV2LCAmcjUwMF9kaXNwX2ludCk7Ci0JaWYgKCFzdGF0dXMgJiYgIXI1MDBfZGlzcF9pbnQpIHsKKwlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYpOworCWlmICghc3RhdHVzICYmICFyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpIHsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KLQl3aGlsZSAoc3RhdHVzIHx8IHI1MDBfZGlzcF9pbnQpIHsKKwl3aGlsZSAoc3RhdHVzIHx8IHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkgewogCQkvKiBTVyBpbnRlcnJ1cHQgKi8KLQkJaWYgKEdfMDAwMDQ0X1NXX0lOVChzdGF0dXMpKQorCQlpZiAoR18wMDAwNDRfU1dfSU5UKHN0YXR1cykpIHsKIAkJCXJhZGVvbl9mZW5jZV9wcm9jZXNzKHJkZXYpOworCQl9CiAJCS8qIEdVSSBpZGxlICovCiAJCWlmIChHXzAwMDA0MF9HVUlfSURMRShzdGF0dXMpKSB7CiAJCQlyZGV2LT5pcnEuZ3VpX2lkbGVfYWNrZWQgPSB0cnVlOwpAQCAtNjExLDMwICs2NjEsMzggQEAKIAkJCXdha2VfdXAoJnJkZXYtPmlycS5pZGxlX3F1ZXVlKTsKIAkJfQogCQkvKiBWZXJ0aWNhbCBibGFuayBpbnRlcnJ1cHRzICovCi0JCWlmIChHXzAwN0VEQ19MQl9EMV9WQkxBTktfSU5URVJSVVBUKHI1MDBfZGlzcF9pbnQpKSB7Ci0JCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAwKTsKLQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKLQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQlpZiAoR18wMDdFRENfTEJfRDFfVkJMQU5LX0lOVEVSUlVQVChyZGV2LT5pcnEuc3RhdF9yZWdzLnI1MDAuZGlzcF9pbnQpKSB7CisJCQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSkgeworCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOworCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJCX0KKwkJCWlmIChyZGV2LT5pcnEucGZsaXBbMF0pCisJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMCk7CiAJCX0KLQkJaWYgKEdfMDA3RURDX0xCX0QyX1ZCTEFOS19JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpIHsKLQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOwotCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKKwkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7CisJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJfQorCQkJaWYgKHJkZXYtPmlycS5wZmxpcFsxXSkKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAxKTsKIAkJfQotCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMV9JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpIHsKKwkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJRFJNX0RFQlVHKCJIUEQxXG4iKTsKIAkJfQotCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMl9JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpIHsKKwkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJRFJNX0RFQlVHKCJIUEQyXG4iKTsKIAkJfQotCQlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYsICZyNTAwX2Rpc3BfaW50KTsKKwkJc3RhdHVzID0gcnM2MDBfaXJxX2FjayhyZGV2KTsKIAl9CiAJLyogcmVzZXQgZ3VpIGlkbGUgYWNrLiAgdGhlIHN0YXR1cyBiaXQgaXMgYnJva2VuICovCiAJcmRldi0+aXJxLmd1aV9pZGxlX2Fja2VkID0gZmFsc2U7CiAJaWYgKHF1ZXVlX2hvdHBsdWcpCi0JCXF1ZXVlX3dvcmsocmRldi0+d3EsICZyZGV2LT5ob3RwbHVnX3dvcmspOworCQlzY2hlZHVsZV93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwogCWlmIChyZGV2LT5tc2lfZW5hYmxlZCkgewogCQlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgewogCQljYXNlIENISVBfUlM2MDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggNGRmZWFkOC4uM2EyNjRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwpAQCAtNDEsNiArNDEsNDEgQEAKIAogc3RhdGljIHZvaWQgcnY3NzBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBydjc3MF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3N0YXRpYyB2b2lkIHJ2NzcwX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCit1MzIgcnY3NzBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOworCXUzMiB0bXAgPSBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisKKwkvKiBMb2NrIHRoZSBncmFwaGljcyB1cGRhdGUgbG9jayAqLworCXRtcCB8PSBBVklWT19EMUdSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiB1cGRhdGUgdGhlIHNjYW5vdXQgYWRkcmVzc2VzICovCisJaWYgKHJhZGVvbl9jcnRjLT5jcnRjX2lkKSB7CisJCVdSRUczMihEMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdILCB1cHBlcl8zMl9iaXRzKGNydGNfYmFzZSkpOworCQlXUkVHMzIoRDJHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMoY3J0Y19iYXNlKSk7CisJfSBlbHNlIHsKKwkJV1JFRzMyKEQxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMoY3J0Y19iYXNlKSk7CisJCVdSRUczMihEMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCwgdXBwZXJfMzJfYml0cyhjcnRjX2Jhc2UpKTsKKwl9CisJV1JFRzMyKEQxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWNydGNfYmFzZSk7CisJV1JFRzMyKEQxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKHUzMiljcnRjX2Jhc2UpOworCisJLyogV2FpdCBmb3IgdXBkYXRlX3BlbmRpbmcgdG8gZ28gaGlnaC4gKi8KKwl3aGlsZSAoIShSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORykpOworCURSTV9ERUJVRygiVXBkYXRlIHBlbmRpbmcgbm93IGhpZ2guIFVubG9ja2luZyB2dXBkYXRlX2xvY2suXG4iKTsKKworCS8qIFVubG9jayB0aGUgbG9jaywgc28gZG91YmxlLWJ1ZmZlcmluZyBjYW4gdGFrZSBwbGFjZSBpbnNpZGUgdmJsYW5rICovCisJdG1wICY9IH5BVklWT19EMUdSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBSZXR1cm4gY3VycmVudCB1cGRhdGVfcGVuZGluZyBzdGF0dXM6ICovCisJcmV0dXJuIFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HOworfQogCiAvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCiB1MzIgcnY3NzBfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC00ODksNiArNTI0LDQ5IEBACiAJcmV0dXJuIGJhY2tlbmRfbWFwOwogfQogCitzdGF0aWMgdm9pZCBydjc3MF9wcm9ncmFtX2NoYW5uZWxfcmVtYXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIHRjcF9jaGFuX3N0ZWVyLCBtY19zaGFyZWRfY2hyZW1hcCwgdG1wOworCWJvb2wgZm9yY2Vfbm9fc3dpenpsZTsKKworCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJY2FzZSBDSElQX1JWNzcwOgorCWNhc2UgQ0hJUF9SVjczMDoKKwkJZm9yY2Vfbm9fc3dpenpsZSA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIENISVBfUlY3MTA6CisJY2FzZSBDSElQX1JWNzQwOgorCWRlZmF1bHQ6CisJCWZvcmNlX25vX3N3aXp6bGUgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwl0bXAgPSBSUkVHMzIoTUNfU0hBUkVEX0NITUFQKTsKKwlzd2l0Y2ggKCh0bXAgJiBOT09GQ0hBTl9NQVNLKSA+PiBOT09GQ0hBTl9TSElGVCkgeworCWNhc2UgMDoKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJLyogZGVmYXVsdCBtYXBwaW5nICovCisJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGZhYzY4ODsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJaWYgKGZvcmNlX25vX3N3aXp6bGUpCisJCQltY19zaGFyZWRfY2hyZW1hcCA9IDB4MDBmYWM2ODg7CisJCWVsc2UKKwkJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGJiYzI5ODsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNzQwKQorCQl0Y3BfY2hhbl9zdGVlciA9IDB4MDBlZjJhNjA7CisJZWxzZQorCQl0Y3BfY2hhbl9zdGVlciA9IDB4MDBmYWM2ODg7CisKKwlXUkVHMzIoVENQX0NIQU5fU1RFRVIsIHRjcF9jaGFuX3N0ZWVyKTsKKwlXUkVHMzIoTUNfU0hBUkVEX0NIUkVNQVAsIG1jX3NoYXJlZF9jaHJlbWFwKTsKK30KKwogc3RhdGljIHZvaWQgcnY3NzBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IGksIGosIG51bV9xZF9waXBlczsKQEAgLTY4OCw2ICs3NjYsOCBAQAogCVdSRUczMihEQ1BfVElMSU5HX0NPTkZJRywgKGdiX3RpbGluZ19jb25maWcgJiAweGZmZmYpKTsKIAlXUkVHMzIoSERQX1RJTElOR19DT05GSUcsIChnYl90aWxpbmdfY29uZmlnICYgMHhmZmZmKSk7CiAKKwlydjc3MF9wcm9ncmFtX2NoYW5uZWxfcmVtYXAocmRldik7CisKIAlXUkVHMzIoQ0NfUkJfQkFDS0VORF9ESVNBQkxFLCAgICAgIGNjX3JiX2JhY2tlbmRfZGlzYWJsZSk7CiAJV1JFRzMyKENDX0dDX1NIQURFUl9QSVBFX0NPTkZJRywgICBjY19nY19zaGFkZXJfcGlwZV9jb25maWcpOwogCVdSRUczMihHQ19VU0VSX1NIQURFUl9QSVBFX0NPTkZJRywgY2NfZ2Nfc2hhZGVyX3BpcGVfY29uZmlnKTsKQEAgLTk1Niw2ICsxMDM2LDQ1IEBACiAJcmFkZW9uX2JvX3VucmVmKCZyZGV2LT52cmFtX3NjcmF0Y2gucm9iaik7CiB9CiAKK3ZvaWQgcjcwMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpCit7CisJdTY0IHNpemVfYmYsIHNpemVfYWY7CisKKwlpZiAobWMtPm1jX3ZyYW1fc2l6ZSA+IDB4RTAwMDAwMDApIHsKKwkJLyogbGVhdmUgcm9vbSBmb3IgYXQgbGVhc3QgNTEyTSBHVFQgKi8KKwkJZGV2X3dhcm4ocmRldi0+ZGV2LCAibGltaXRpbmcgVlJBTVxuIik7CisJCW1jLT5yZWFsX3ZyYW1fc2l6ZSA9IDB4RTAwMDAwMDA7CisJCW1jLT5tY192cmFtX3NpemUgPSAweEUwMDAwMDAwOworCX0KKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSB7CisJCXNpemVfYmYgPSBtYy0+Z3R0X3N0YXJ0OworCQlzaXplX2FmID0gMHhGRkZGRkZGRiAtIG1jLT5ndHRfZW5kICsgMTsKKwkJaWYgKHNpemVfYmYgPiBzaXplX2FmKSB7CisJCQlpZiAobWMtPm1jX3ZyYW1fc2l6ZSA+IHNpemVfYmYpIHsKKwkJCQlkZXZfd2FybihyZGV2LT5kZXYsICJsaW1pdGluZyBWUkFNXG4iKTsKKwkJCQltYy0+cmVhbF92cmFtX3NpemUgPSBzaXplX2JmOworCQkJCW1jLT5tY192cmFtX3NpemUgPSBzaXplX2JmOworCQkJfQorCQkJbWMtPnZyYW1fc3RhcnQgPSBtYy0+Z3R0X3N0YXJ0IC0gbWMtPm1jX3ZyYW1fc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtYy0+bWNfdnJhbV9zaXplID4gc2l6ZV9hZikgeworCQkJCWRldl93YXJuKHJkZXYtPmRldiwgImxpbWl0aW5nIFZSQU1cbiIpOworCQkJCW1jLT5yZWFsX3ZyYW1fc2l6ZSA9IHNpemVfYWY7CisJCQkJbWMtPm1jX3ZyYW1fc2l6ZSA9IHNpemVfYWY7CisJCQl9CisJCQltYy0+dnJhbV9zdGFydCA9IG1jLT5ndHRfZW5kOworCQl9CisJCW1jLT52cmFtX2VuZCA9IG1jLT52cmFtX3N0YXJ0ICsgbWMtPm1jX3ZyYW1fc2l6ZSAtIDE7CisJCWRldl9pbmZvKHJkZXYtPmRldiwgIlZSQU06ICVsbHVNIDB4JTA4bGxYIC0gMHglMDhsbFggKCVsbHVNIHVzZWQpXG4iLAorCQkJCW1jLT5tY192cmFtX3NpemUgPj4gMjAsIG1jLT52cmFtX3N0YXJ0LAorCQkJCW1jLT52cmFtX2VuZCwgbWMtPnJlYWxfdnJhbV9zaXplID4+IDIwKTsKKwl9IGVsc2UgeworCQlyYWRlb25fdnJhbV9sb2NhdGlvbihyZGV2LCAmcmRldi0+bWMsIDApOworCQlyZGV2LT5tYy5ndHRfYmFzZV9hbGlnbiA9IDA7CisJCXJhZGVvbl9ndHRfbG9jYXRpb24ocmRldiwgbWMpOworCX0KK30KKwogaW50IHJ2NzcwX21jX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIHRtcDsKQEAgLTk5Niw3ICsxMTE1LDcgQEAKIAlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSk7CiAJcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CiAJcmRldi0+bWMuYWN0aXZlX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplOwotCXI2MDBfdnJhbV9ndHRfbG9jYXRpb24ocmRldiwgJnJkZXYtPm1jKTsKKwlyNzAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHJkZXYsICZyZGV2LT5tYyk7CiAJcmFkZW9uX3VwZGF0ZV9iYW5kd2lkdGhfaW5mbyhyZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTAwNiw2ICsxMTI1LDkgQEAKIHsKIAlpbnQgcjsKIAorCS8qIGVuYWJsZSBwY2llIGdlbjIgbGluayAqLworCXJ2NzcwX3BjaWVfZ2VuMl9lbmFibGUocmRldik7CisKIAlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgewogCQlyID0gcjYwMF9pbml0X21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKQEAgLTEyNDQsMyArMTM2Niw3NSBAQAogCXJkZXYtPmJpb3MgPSBOVUxMOwogCXJhZGVvbl9kdW1teV9wYWdlX2ZpbmkocmRldik7CiB9CisKK3N0YXRpYyB2b2lkIHJ2NzcwX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bCwgbGFuZXMsIHNwZWVkX2NudGwsIHRtcDsKKwl1MTYgbGlua19jbnRsMjsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpKQorCQlyZXR1cm47CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm47CisKKwkvKiBhZHZlcnRpc2UgdXBjb25maWcgY2FwYWJpbGl0eSAqLworCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCWxpbmtfd2lkdGhfY250bCAmPSB+TENfVVBDT05GSUdVUkVfRElTOworCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJaWYgKGxpbmtfd2lkdGhfY250bCAmIExDX1JFTkVHT1RJQVRJT05fU1VQUE9SVCkgeworCQlsYW5lcyA9IChsaW5rX3dpZHRoX2NudGwgJiBMQ19MSU5LX1dJRFRIX1JEX01BU0spID4+IExDX0xJTktfV0lEVEhfUkRfU0hJRlQ7CisJCWxpbmtfd2lkdGhfY250bCAmPSB+KExDX0xJTktfV0lEVEhfTUFTSyB8CisJCQkJICAgICBMQ19SRUNPTkZJR19BUkNfTUlTU0lOR19FU0NBUEUpOworCQlsaW5rX3dpZHRoX2NudGwgfD0gbGFuZXMgfCBMQ19SRUNPTkZJR19OT1cgfAorCQkJTENfUkVORUdPVElBVEVfRU4gfCBMQ19VUENPTkZJR1VSRV9TVVBQT1JUOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCX0gZWxzZSB7CisJCWxpbmtfd2lkdGhfY250bCB8PSBMQ19VUENPTkZJR1VSRV9ESVM7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJfQorCisJc3BlZWRfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMKTsKKwlpZiAoKHNwZWVkX2NudGwgJiBMQ19PVEhFUl9TSURFX0VWRVJfU0VOVF9HRU4yKSAmJgorCSAgICAoc3BlZWRfY250bCAmIExDX09USEVSX1NJREVfU1VQUE9SVFNfR0VOMikpIHsKKworCQl0bXAgPSBSUkVHMzIoMHg1NDFjKTsKKwkJV1JFRzMyKDB4NTQxYywgdG1wIHwgMHg4KTsKKwkJV1JFRzMyKE1NX0NGR1JFR1NfQ05UTCwgTU1fV1JfVE9fQ0ZHX0VOKTsKKwkJbGlua19jbnRsMiA9IFJSRUcxNigweDQwODgpOworCQlsaW5rX2NudGwyICY9IH5UQVJHRVRfTElOS19TUEVFRF9NQVNLOworCQlsaW5rX2NudGwyIHw9IDB4MjsKKwkJV1JFRzE2KDB4NDA4OCwgbGlua19jbnRsMik7CisJCVdSRUczMihNTV9DRkdSRUdTX0NOVEwsIDApOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgJj0gfkxDX1RBUkdFVF9MSU5LX1NQRUVEX09WRVJSSURFX0VOOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisKKwkJc3BlZWRfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMKTsKKwkJc3BlZWRfY250bCB8PSBMQ19DTFJfRkFJTEVEX1NQRF9DSEFOR0VfQ05UOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisKKwkJc3BlZWRfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMKTsKKwkJc3BlZWRfY250bCAmPSB+TENfQ0xSX0ZBSUxFRF9TUERfQ0hBTkdFX0NOVDsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgfD0gTENfR0VOMl9FTl9TVFJBUDsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJfSBlbHNlIHsKKwkJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJCS8qIFhYWDogb25seSBkaXNhYmxlIGl0IGlmIGdlbjEgYnJpZGdlIHZlbmRvciA9PSAweDExMWQgb3IgMHgxMTA2ICovCisJCWlmICgxKQorCQkJbGlua193aWR0aF9jbnRsIHw9IExDX1VQQ09ORklHVVJFX0RJUzsKKwkJZWxzZQorCQkJbGlua193aWR0aF9jbnRsICY9IH5MQ19VUENPTkZJR1VSRV9ESVM7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBkLmgKaW5kZXggYjdhNWEyMC4uYWJjOGNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oCkBAIC0xMzgsNiArMTM4LDcgQEAKICNkZWZpbmUgTUNfU0hBUkVEX0NITUFQCQkJCQkJMHgyMDA0CiAjZGVmaW5lCQlOT09GQ0hBTl9TSElGVAkJCQkJMTIKICNkZWZpbmUJCU5PT0ZDSEFOX01BU0sJCQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgTUNfU0hBUkVEX0NIUkVNQVAJCQkJCTB4MjAwOAogCiAjZGVmaW5lCU1DX0FSQl9SQU1DRkcJCQkJCTB4Mjc2MAogI2RlZmluZQkJTk9PRkJBTktfU0hJRlQJCQkJCTAKQEAgLTMwMyw2ICszMDQsNyBAQAogI2RlZmluZQkJQklMSU5FQVJfUFJFQ0lTSU9OXzhfQklUCQkJKDEgPDwgMzEpCiAKICNkZWZpbmUJVENQX0NOVEwJCQkJCTB4OTYxMAorI2RlZmluZQlUQ1BfQ0hBTl9TVEVFUgkJCQkJMHg5NjE0CiAKICNkZWZpbmUJVkdUX0NBQ0hFX0lOVkFMSURBVElPTgkJCQkweDg4QzQKICNkZWZpbmUJCUNBQ0hFX0lOVkFMSURBVElPTih4KQkJCQkoKHgpPDwwKQpAQCAtMzUxLDQgKzM1Myw0OSBAQAogCiAjZGVmaW5lCVNSQk1fU1RBVFVTCQkJCSAgICAgICAgMHgwRTUwCiAKKyNkZWZpbmUgRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAweDYxMTAKKyNkZWZpbmUgRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggICAgICAgICAgICAgICAweDY5MTQKKyNkZWZpbmUgRDJHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggICAgICAgICAgICAgICAweDYxMTQKKyNkZWZpbmUgRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAweDYxMTgKKyNkZWZpbmUgRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCAgICAgICAgICAgICAweDY5MWMKKyNkZWZpbmUgRDJHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCAgICAgICAgICAgICAweDYxMWMKKworLyogUENJRSBsaW5rIHN0dWZmICovCisjZGVmaW5lIFBDSUVfTENfVFJBSU5JTkdfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMSAvKiBQQ0lFX1AgKi8KKyNkZWZpbmUgUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEyIC8qIFBDSUVfUCAqLworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gxICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDQgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1g4ICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1JEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg3MAorIyAgICAgICBkZWZpbmUgTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFICAgICAgICAgICAgICgxIDw8IDcpCisjICAgICAgIGRlZmluZSBMQ19SRUNPTkZJR19OT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIExDX1JFTkVHT1RJQVRJT05fU1VQUE9SVCAgICAgICAgICAgICAgICAgICAoMSA8PCA5KQorIyAgICAgICBkZWZpbmUgTENfUkVORUdPVElBVEVfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEwKQorIyAgICAgICBkZWZpbmUgTENfU0hPUlRfUkVDT05GSUdfRU4gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgTENfVVBDT05GSUdVUkVfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEyKQorIyAgICAgICBkZWZpbmUgTENfVVBDT05GSUdVUkVfRElTICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEzKQorI2RlZmluZSBQQ0lFX0xDX1NQRUVEX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTQgLyogUENJRV9QICovCisjICAgICAgIGRlZmluZSBMQ19HRU4yX0VOX1NUUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIExDX1RBUkdFVF9MSU5LX1NQRUVEX09WRVJSSURFX0VOICAgICAgICAgICAoMSA8PCAxKQorIyAgICAgICBkZWZpbmUgTENfRk9SQ0VfRU5fSFdfU1BFRURfQ0hBTkdFICAgICAgICAgICAgICAgICgxIDw8IDUpCisjICAgICAgIGRlZmluZSBMQ19GT1JDRV9ESVNfSFdfU1BFRURfQ0hBTkdFICAgICAgICAgICAgICAgKDEgPDwgNikKKyMgICAgICAgZGVmaW5lIExDX1NQRUVEX0NIQU5HRV9BVFRFTVBUU19BTExPV0VEX01BU0sgICAgICAoMHgzIDw8IDgpCisjICAgICAgIGRlZmluZSBMQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9TSElGVCAgICAgMworIyAgICAgICBkZWZpbmUgTENfQ1VSUkVOVF9EQVRBX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgTENfVk9MVEFHRV9USU1FUl9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICgweGYgPDwgMTQpCisjICAgICAgIGRlZmluZSBMQ19DTFJfRkFJTEVEX1NQRF9DSEFOR0VfQ05UICAgICAgICAgICAgICAgKDEgPDwgMjEpCisjICAgICAgIGRlZmluZSBMQ19PVEhFUl9TSURFX0VWRVJfU0VOVF9HRU4yICAgICAgICAgICAgICAgKDEgPDwgMjMpCisjICAgICAgIGRlZmluZSBMQ19PVEhFUl9TSURFX1NVUFBPUlRTX0dFTjIgICAgICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIE1NX0NGR1JFR1NfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NDRjCisjICAgICAgIGRlZmluZSBNTV9XUl9UT19DRkdfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgTElOS19DTlRMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4IC8qIEYwICovCisjICAgICAgIGRlZmluZSBUQVJHRVRfTElOS19TUEVFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAwKQorIyAgICAgICBkZWZpbmUgU0VMRUNUQUJMRV9ERUVNUEhBU0lTICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKaW5kZXggOTM0YTk2YS4uYWY2MWZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wodHRtX2JvX3dhaXRfdW5yZXNlcnZlZCk7CiAKLXN0YXRpYyB2b2lkIHR0bV9ib19hZGRfdG9fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit2b2lkIHR0bV9ib19hZGRfdG9fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CiAJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbjsKQEAgLTE5MSwxMSArMTkxLDcgQEAKIAl9CiB9CiAKLS8qKgotICogQ2FsbCB3aXRoIHRoZSBscnVfbG9jayBoZWxkLgotICovCi0KLXN0YXRpYyBpbnQgdHRtX2JvX2RlbF9mcm9tX2xydShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoraW50IHR0bV9ib19kZWxfZnJvbV9scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlpbnQgcHV0X2NvdW50ID0gMDsKIApAQCAtMjI3LDkgKzIyMywxOCBAQAogCQkvKioKIAkJICogRGVhZGxvY2sgYXZvaWRhbmNlIGZvciBtdWx0aS1ibyByZXNlcnZpbmcuCiAJCSAqLwotCQlpZiAodXNlX3NlcXVlbmNlICYmIGJvLT5zZXFfdmFsaWQgJiYKLQkJCShzZXF1ZW5jZSAtIGJvLT52YWxfc2VxIDwgKDEgPDwgMzEpKSkgewotCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmICh1c2Vfc2VxdWVuY2UgJiYgYm8tPnNlcV92YWxpZCkgeworCQkJLyoqCisJCQkgKiBXZSd2ZSBhbHJlYWR5IHJlc2VydmVkIHRoaXMgb25lLgorCQkJICovCisJCQlpZiAodW5saWtlbHkoc2VxdWVuY2UgPT0gYm8tPnZhbF9zZXEpKQorCQkJCXJldHVybiAtRURFQURMSzsKKwkJCS8qKgorCQkJICogQWxyZWFkeSByZXNlcnZlZCBieSBhIHRocmVhZCB0aGF0IHdpbGwgbm90IGJhY2sKKwkJCSAqIG9mZiBmb3IgdXMuIFdlIG5lZWQgdG8gYmFjayBvZmYuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseShzZXF1ZW5jZSAtIGJvLT52YWxfc2VxIDwgKDEgPDwgMzEpKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCiAJCWlmIChub193YWl0KQpAQCAtMjY3LDYgKzI3MiwxMyBAQAogCUJVRygpOwogfQogCit2b2lkIHR0bV9ib19saXN0X3JlZl9zdWIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgaW50IGNvdW50LAorCQkJIGJvb2wgbmV2ZXJfZnJlZSkKK3sKKwlrcmVmX3N1YigmYm8tPmxpc3Rfa3JlZiwgY291bnQsCisJCSAobmV2ZXJfZnJlZSkgPyB0dG1fYm9fcmVmX2J1ZyA6IHR0bV9ib19yZWxlYXNlX2xpc3QpOworfQorCiBpbnQgdHRtX2JvX3Jlc2VydmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJICAgYm9vbCBpbnRlcnJ1cHRpYmxlLAogCQkgICBib29sIG5vX3dhaXQsIGJvb2wgdXNlX3NlcXVlbmNlLCB1aW50MzJfdCBzZXF1ZW5jZSkKQEAgLTI4MiwyMCArMjk0LDI0IEBACiAJCXB1dF9jb3VudCA9IHR0bV9ib19kZWxfZnJvbV9scnUoYm8pOwogCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAKLQl3aGlsZSAocHV0X2NvdW50LS0pCi0JCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CisJdHRtX2JvX2xpc3RfcmVmX3N1YihibywgcHV0X2NvdW50LCB0cnVlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgdHRtX2JvX3VucmVzZXJ2ZV9sb2NrZWQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3sKKwl0dG1fYm9fYWRkX3RvX2xydShibyk7CisJYXRvbWljX3NldCgmYm8tPnJlc2VydmVkLCAwKTsKKwl3YWtlX3VwX2FsbCgmYm8tPmV2ZW50X3F1ZXVlKTsKK30KKwogdm9pZCB0dG1fYm9fdW5yZXNlcnZlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CiAJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiby0+Z2xvYjsKIAogCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCXR0bV9ib19hZGRfdG9fbHJ1KGJvKTsKLQlhdG9taWNfc2V0KCZiby0+cmVzZXJ2ZWQsIDApOwotCXdha2VfdXBfYWxsKCZiby0+ZXZlbnRfcXVldWUpOworCXR0bV9ib191bnJlc2VydmVfbG9ja2VkKGJvKTsKIAlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fdW5yZXNlcnZlKTsKQEAgLTM2Miw4ICszNzgsMTMgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChvbGRfaXNfcGNpIHx8IG5ld19pc19wY2kgfHwKLQkgICAgKChtZW0tPnBsYWNlbWVudCAmIGJvLT5tZW0ucGxhY2VtZW50ICYgVFRNX1BMX01BU0tfQ0FDSElORykgPT0gMCkpCi0JCXR0bV9ib191bm1hcF92aXJ0dWFsKGJvKTsKKwkgICAgKChtZW0tPnBsYWNlbWVudCAmIGJvLT5tZW0ucGxhY2VtZW50ICYgVFRNX1BMX01BU0tfQ0FDSElORykgPT0gMCkpIHsKKwkJcmV0ID0gdHRtX21lbV9pb19sb2NrKG9sZF9tYW4sIHRydWUpOworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQkJZ290byBvdXRfZXJyOworCQl0dG1fYm9fdW5tYXBfdmlydHVhbF9sb2NrZWQoYm8pOworCQl0dG1fbWVtX2lvX3VubG9jayhvbGRfbWFuKTsKKwl9CiAKIAkvKgogCSAqIENyZWF0ZSBhbmQgYmluZCBhIHR0bSBpZiByZXF1aXJlZC4KQEAgLTQxNiwxMSArNDM3LDkgQEAKIAl9CiAKIAlpZiAoYm8tPm1lbS5tbV9ub2RlKSB7Ci0JCXNwaW5fbG9jaygmYm8tPmxvY2spOwogCQliby0+b2Zmc2V0ID0gKGJvLT5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVCkgKwogCQkgICAgYmRldi0+bWFuW2JvLT5tZW0ubWVtX3R5cGVdLmdwdV9vZmZzZXQ7CiAJCWJvLT5jdXJfcGxhY2VtZW50ID0gYm8tPm1lbS5wbGFjZW1lbnQ7Ci0JCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CiAJfSBlbHNlCiAJCWJvLT5vZmZzZXQgPSAwOwogCkBAIC00NTIsNyArNDcxLDYgQEAKIAkJdHRtX3R0X2Rlc3Ryb3koYm8tPnR0bSk7CiAJCWJvLT50dG0gPSBOVUxMOwogCX0KLQogCXR0bV9ib19tZW1fcHV0KGJvLCAmYm8tPm1lbSk7CiAKIAlhdG9taWNfc2V0KCZiby0+cmVzZXJ2ZWQsIDApOwpAQCAtNDc0LDE0ICs0OTIsMTQgQEAKIAlpbnQgcHV0X2NvdW50OwogCWludCByZXQ7CiAKLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCSh2b2lkKSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKIAlpZiAoIWJvLT5zeW5jX29iaikgewogCiAJCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCiAJCS8qKgotCQkgKiBMb2NrIGludmVyc2lvbiBiZXR3ZWVuIGJvOjpyZXNlcnZlIGFuZCBibzo6bG9jayBoZXJlLAorCQkgKiBMb2NrIGludmVyc2lvbiBiZXR3ZWVuIGJvOnJlc2VydmUgYW5kIGJkZXY6OmZlbmNlX2xvY2sgaGVyZSwKIAkJICogYnV0IHRoYXQncyBPSywgc2luY2Ugd2UncmUgb25seSB0cnlsb2NraW5nLgogCQkgKi8KIApAQCAtNDkwLDE0ICs1MDgsMTMgQEAKIAkJaWYgKHVubGlrZWx5KHJldCA9PSAtRUJVU1kpKQogCQkJZ290byBxdWV1ZTsKIAotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCXB1dF9jb3VudCA9IHR0bV9ib19kZWxfZnJvbV9scnUoYm8pOwogCiAJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAJCXR0bV9ib19jbGVhbnVwX21lbXR5cGVfdXNlKGJvKTsKIAotCQl3aGlsZSAocHV0X2NvdW50LS0pCi0JCQlrcmVmX3B1dCgmYm8tPmxpc3Rfa3JlZiwgdHRtX2JvX3JlZl9idWcpOworCQl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBwdXRfY291bnQsIHRydWUpOwogCiAJCXJldHVybjsKIAl9IGVsc2UgewpAQCAtNTEyLDcgKzUyOSw3IEBACiAJa3JlZl9nZXQoJmJvLT5saXN0X2tyZWYpOwogCWxpc3RfYWRkX3RhaWwoJmJvLT5kZGVzdHJveSwgJmJkZXYtPmRkZXN0cm95KTsKIAlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwotCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCiAJaWYgKHN5bmNfb2JqKSB7CiAJCWRyaXZlci0+c3luY19vYmpfZmx1c2goc3luY19vYmosIHN5bmNfb2JqX2FyZyk7CkBAIC01MzcsMTQgKzU1NCwxNSBAQAogCQkJICAgICAgIGJvb2wgbm9fd2FpdF9yZXNlcnZlLAogCQkJICAgICAgIGJvb2wgbm9fd2FpdF9ncHUpCiB7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAlzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYiA9IGJvLT5nbG9iOwogCWludCBwdXRfY291bnQ7CiAJaW50IHJldCA9IDA7CiAKIHJldHJ5OgotCXNwaW5fbG9jaygmYm8tPmxvY2spOworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBpbnRlcnJ1cHRpYmxlLCBub193YWl0X2dwdSk7Ci0Jc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlyZXR1cm4gcmV0OwpAQCAtNTgwLDggKzU5OCw3IEBACiAJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKIAl0dG1fYm9fY2xlYW51cF9tZW10eXBlX3VzZShibyk7CiAKLQl3aGlsZSAocHV0X2NvdW50LS0pCi0JCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CisJdHRtX2JvX2xpc3RfcmVmX3N1YihibywgcHV0X2NvdW50LCB0cnVlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjUyLDYgKzY2OSw3IEBACiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9CiAJICAgIGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QsIGtyZWYpOwogCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gYm8tPmJkZXY7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW2JvLT5tZW0ubWVtX3R5cGVdOwogCiAJaWYgKGxpa2VseShiby0+dm1fbm9kZSAhPSBOVUxMKSkgewogCQlyYl9lcmFzZSgmYm8tPnZtX3JiLCAmYmRldi0+YWRkcl9zcGFjZV9yYik7CkBAIC02NTksNiArNjc3LDkgQEAKIAkJYm8tPnZtX25vZGUgPSBOVUxMOwogCX0KIAl3cml0ZV91bmxvY2soJmJkZXYtPnZtX2xvY2spOworCXR0bV9tZW1faW9fbG9jayhtYW4sIGZhbHNlKTsKKwl0dG1fbWVtX2lvX2ZyZWVfdm0oYm8pOworCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7CiAJdHRtX2JvX2NsZWFudXBfcmVmc19vcl9xdWV1ZShibyk7CiAJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWxlYXNlX2xpc3QpOwogCXdyaXRlX2xvY2soJmJkZXYtPnZtX2xvY2spOwpAQCAtNjk4LDkgKzcxOSw5IEBACiAJc3RydWN0IHR0bV9wbGFjZW1lbnQgcGxhY2VtZW50OwogCWludCByZXQgPSAwOwogCi0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGludGVycnVwdGlibGUsIG5vX3dhaXRfZ3B1KTsKLQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpIHsKQEAgLTcxNSw3ICs3MzYsOCBAQAogCiAJZXZpY3RfbWVtID0gYm8tPm1lbTsKIAlldmljdF9tZW0ubW1fbm9kZSA9IE5VTEw7Ci0JZXZpY3RfbWVtLmJ1cy5pb19yZXNlcnZlZCA9IGZhbHNlOworCWV2aWN0X21lbS5idXMuaW9fcmVzZXJ2ZWRfdm0gPSBmYWxzZTsKKwlldmljdF9tZW0uYnVzLmlvX3Jlc2VydmVkX2NvdW50ID0gMDsKIAogCXBsYWNlbWVudC5mcGZuID0gMDsKIAlwbGFjZW1lbnQubHBmbiA9IDA7CkBAIC04MDIsOCArODI0LDcgQEAKIAogCUJVR19PTihyZXQgIT0gMCk7CiAKLQl3aGlsZSAocHV0X2NvdW50LS0pCi0JCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CisJdHRtX2JvX2xpc3RfcmVmX3N1YihibywgcHV0X2NvdW50LCB0cnVlKTsKIAogCXJldCA9IHR0bV9ib19ldmljdChibywgaW50ZXJydXB0aWJsZSwgbm9fd2FpdF9yZXNlcnZlLCBub193YWl0X2dwdSk7CiAJdHRtX2JvX3VucmVzZXJ2ZShibyk7CkBAIC0xMDM2LDYgKzEwNTcsNyBAQAogewogCWludCByZXQgPSAwOwogCXN0cnVjdCB0dG1fbWVtX3JlZyBtZW07CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAogCUJVR19PTighYXRvbWljX3JlYWQoJmJvLT5yZXNlcnZlZCkpOwogCkBAIC0xMDQ0LDE1ICsxMDY2LDE2IEBACiAJICogSGF2ZSB0aGUgZHJpdmVyIG1vdmUgZnVuY3Rpb24gd2FpdCBmb3IgaWRsZSB3aGVuIG5lY2Vzc2FyeSwKIAkgKiBpbnN0ZWFkIG9mIGRvaW5nIGl0IGhlcmUuCiAJICovCi0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGludGVycnVwdGlibGUsIG5vX3dhaXRfZ3B1KTsKLQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCW1lbS5udW1fcGFnZXMgPSBiby0+bnVtX3BhZ2VzOwogCW1lbS5zaXplID0gbWVtLm51bV9wYWdlcyA8PCBQQUdFX1NISUZUOwogCW1lbS5wYWdlX2FsaWdubWVudCA9IGJvLT5tZW0ucGFnZV9hbGlnbm1lbnQ7Ci0JbWVtLmJ1cy5pb19yZXNlcnZlZCA9IGZhbHNlOworCW1lbS5idXMuaW9fcmVzZXJ2ZWRfdm0gPSBmYWxzZTsKKwltZW0uYnVzLmlvX3Jlc2VydmVkX2NvdW50ID0gMDsKIAkvKgogCSAqIERldGVybWluZSB3aGVyZSB0byBtb3ZlIHRoZSBidWZmZXIuCiAJICovCkBAIC0xMTYzLDcgKzExODYsNiBAQAogCX0KIAliby0+ZGVzdHJveSA9IGRlc3Ryb3k7CiAKLQlzcGluX2xvY2tfaW5pdCgmYm8tPmxvY2spOwogCWtyZWZfaW5pdCgmYm8tPmtyZWYpOwogCWtyZWZfaW5pdCgmYm8tPmxpc3Rfa3JlZik7CiAJYXRvbWljX3NldCgmYm8tPmNwdV93cml0ZXJzLCAwKTsKQEAgLTExNzIsNiArMTE5NCw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmJvLT5scnUpOwogCUlOSVRfTElTVF9IRUFEKCZiby0+ZGRlc3Ryb3kpOwogCUlOSVRfTElTVF9IRUFEKCZiby0+c3dhcCk7CisJSU5JVF9MSVNUX0hFQUQoJmJvLT5pb19yZXNlcnZlX2xydSk7CiAJYm8tPmJkZXYgPSBiZGV2OwogCWJvLT5nbG9iID0gYmRldi0+Z2xvYjsKIAliby0+dHlwZSA9IHR5cGU7CkBAIC0xMTgxLDcgKzEyMDQsOCBAQAogCWJvLT5tZW0ubnVtX3BhZ2VzID0gYm8tPm51bV9wYWdlczsKIAliby0+bWVtLm1tX25vZGUgPSBOVUxMOwogCWJvLT5tZW0ucGFnZV9hbGlnbm1lbnQgPSBwYWdlX2FsaWdubWVudDsKLQliby0+bWVtLmJ1cy5pb19yZXNlcnZlZCA9IGZhbHNlOworCWJvLT5tZW0uYnVzLmlvX3Jlc2VydmVkX3ZtID0gZmFsc2U7CisJYm8tPm1lbS5idXMuaW9fcmVzZXJ2ZWRfY291bnQgPSAwOwogCWJvLT5idWZmZXJfc3RhcnQgPSBidWZmZXJfc3RhcnQgJiBQQUdFX01BU0s7CiAJYm8tPnByaXZfZmxhZ3MgPSAwOwogCWJvLT5tZW0ucGxhY2VtZW50ID0gKFRUTV9QTF9GTEFHX1NZU1RFTSB8IFRUTV9QTF9GTEFHX0NBQ0hFRCk7CkBAIC0xMzU1LDYgKzEzNzksMTAgQEAKIAlCVUdfT04odHlwZSA+PSBUVE1fTlVNX01FTV9UWVBFUyk7CiAJbWFuID0gJmJkZXYtPm1hblt0eXBlXTsKIAlCVUdfT04obWFuLT5oYXNfdHlwZSk7CisJbWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoID0gdHJ1ZTsKKwltYW4tPnVzZV9pb19yZXNlcnZlX2xydSA9IGZhbHNlOworCW11dGV4X2luaXQoJm1hbi0+aW9fcmVzZXJ2ZV9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJm1hbi0+aW9fcmVzZXJ2ZV9scnUpOwogCiAJcmV0ID0gYmRldi0+ZHJpdmVyLT5pbml0X21lbV90eXBlKGJkZXYsIHR5cGUsIG1hbik7CiAJaWYgKHJldCkKQEAgLTE1MjYsNyArMTU1NCw4IEBACiAJYmRldi0+ZGV2X21hcHBpbmcgPSBOVUxMOwogCWJkZXYtPmdsb2IgPSBnbG9iOwogCWJkZXYtPm5lZWRfZG1hMzIgPSBuZWVkX2RtYTMyOwotCisJYmRldi0+dmFsX3NlcSA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmJkZXYtPmZlbmNlX2xvY2spOwogCW11dGV4X2xvY2soJmdsb2ItPmRldmljZV9saXN0X211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZiZGV2LT5kZXZpY2VfbGlzdCwgJmdsb2ItPmRldmljZV9saXN0KTsKIAltdXRleF91bmxvY2soJmdsb2ItPmRldmljZV9saXN0X211dGV4KTsKQEAgLTE1NjAsNyArMTU4OSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgdHRtX2JvX3VubWFwX3ZpcnR1YWwoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3ZvaWQgdHRtX2JvX3VubWFwX3ZpcnR1YWxfbG9ja2VkKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7CiAJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAlsb2ZmX3Qgb2Zmc2V0ID0gKGxvZmZfdCkgYm8tPmFkZHJfc3BhY2Vfb2Zmc2V0OwpAQCAtMTU2OSw4ICsxNTk4LDIwIEBACiAJaWYgKCFiZGV2LT5kZXZfbWFwcGluZykKIAkJcmV0dXJuOwogCXVubWFwX21hcHBpbmdfcmFuZ2UoYmRldi0+ZGV2X21hcHBpbmcsIG9mZnNldCwgaG9sZWxlbiwgMSk7Ci0JdHRtX21lbV9pb19mcmVlKGJkZXYsICZiby0+bWVtKTsKKwl0dG1fbWVtX2lvX2ZyZWVfdm0oYm8pOwogfQorCit2b2lkIHR0bV9ib191bm1hcF92aXJ0dWFsKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bYm8tPm1lbS5tZW1fdHlwZV07CisKKwl0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CisJdHRtX2JvX3VubWFwX3ZpcnR1YWxfbG9ja2VkKGJvKTsKKwl0dG1fbWVtX2lvX3VubG9jayhtYW4pOworfQorCisKIEVYUE9SVF9TWU1CT0wodHRtX2JvX3VubWFwX3ZpcnR1YWwpOwogCiBzdGF0aWMgdm9pZCB0dG1fYm9fdm1faW5zZXJ0X3JiKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCkBAIC0xNjUwLDYgKzE2OTEsNyBAQAogCQlib29sIGxhenksIGJvb2wgaW50ZXJydXB0aWJsZSwgYm9vbCBub193YWl0KQogewogCXN0cnVjdCB0dG1fYm9fZHJpdmVyICpkcml2ZXIgPSBiby0+YmRldi0+ZHJpdmVyOworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gYm8tPmJkZXY7CiAJdm9pZCAqc3luY19vYmo7CiAJdm9pZCAqc3luY19vYmpfYXJnOwogCWludCByZXQgPSAwOwpAQCAtMTY2Myw5ICsxNzA1LDkgQEAKIAkJCXZvaWQgKnRtcF9vYmogPSBiby0+c3luY19vYmo7CiAJCQliby0+c3luY19vYmogPSBOVUxMOwogCQkJY2xlYXJfYml0KFRUTV9CT19QUklWX0ZMQUdfTU9WSU5HLCAmYm8tPnByaXZfZmxhZ3MpOwotCQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAkJCWRyaXZlci0+c3luY19vYmpfdW5yZWYoJnRtcF9vYmopOwotCQkJc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJCQlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTY3NCwyOSArMTcxNiwyOSBAQAogCiAJCXN5bmNfb2JqID0gZHJpdmVyLT5zeW5jX29ial9yZWYoYm8tPnN5bmNfb2JqKTsKIAkJc3luY19vYmpfYXJnID0gYm8tPnN5bmNfb2JqX2FyZzsKLQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQlyZXQgPSBkcml2ZXItPnN5bmNfb2JqX3dhaXQoc3luY19vYmosIHN5bmNfb2JqX2FyZywKIAkJCQkJICAgIGxhenksIGludGVycnVwdGlibGUpOwogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZzeW5jX29iaik7Ci0JCQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCXNwaW5fbG9jaygmYm8tPmxvY2spOworCQlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQlpZiAobGlrZWx5KGJvLT5zeW5jX29iaiA9PSBzeW5jX29iaiAmJgogCQkJICAgYm8tPnN5bmNfb2JqX2FyZyA9PSBzeW5jX29ial9hcmcpKSB7CiAJCQl2b2lkICp0bXBfb2JqID0gYm8tPnN5bmNfb2JqOwogCQkJYm8tPnN5bmNfb2JqID0gTlVMTDsKIAkJCWNsZWFyX2JpdChUVE1fQk9fUFJJVl9GTEFHX01PVklORywKIAkJCQkgICZiby0+cHJpdl9mbGFncyk7Ci0JCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmc3luY19vYmopOwogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmdG1wX29iaik7Ci0JCQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmc3luY19vYmopOwotCQkJc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJCQlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMTcwNSw2ICsxNzQ3LDcgQEAKIAogaW50IHR0bV9ib19zeW5jY3B1X3dyaXRlX2dyYWIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9vbCBub193YWl0KQogeworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gYm8tPmJkZXY7CiAJaW50IHJldCA9IDA7CiAKIAkvKgpAQCAtMTcxNCw5ICsxNzU3LDkgQEAKIAlyZXQgPSB0dG1fYm9fcmVzZXJ2ZShibywgdHJ1ZSwgbm9fd2FpdCwgZmFsc2UsIDApOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7Ci0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIHRydWUsIG5vX3dhaXQpOwotCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCWlmIChsaWtlbHkocmV0ID09IDApKQogCQlhdG9taWNfaW5jKCZiby0+Y3B1X3dyaXRlcnMpOwogCXR0bV9ib191bnJlc2VydmUoYm8pOwpAQCAtMTc4MiwxNiArMTgyNSwxNSBAQAogCXB1dF9jb3VudCA9IHR0bV9ib19kZWxfZnJvbV9scnUoYm8pOwogCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAKLQl3aGlsZSAocHV0X2NvdW50LS0pCi0JCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CisJdHRtX2JvX2xpc3RfcmVmX3N1YihibywgcHV0X2NvdW50LCB0cnVlKTsKIAogCS8qKgogCSAqIFdhaXQgZm9yIEdQVSwgdGhlbiBtb3ZlIHRvIHN5c3RlbSBjYWNoZWQuCiAJICovCiAKLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJvLT5iZGV2LT5mZW5jZV9sb2NrKTsKIAlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0Jc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwlzcGluX3VubG9jaygmYm8tPmJkZXYtPmZlbmNlX2xvY2spOwogCiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKaW5kZXggMzEwNmQ1Yi4uNzdkYmY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwpAQCAtNzUsMzcgKzc1LDEyMyBAQAogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fbW92ZV90dG0pOwogCi1pbnQgdHRtX21lbV9pb19yZXNlcnZlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK2ludCB0dG1fbWVtX2lvX2xvY2soc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4sIGJvb2wgaW50ZXJydXB0aWJsZSkKIHsKKwlpZiAobGlrZWx5KG1hbi0+aW9fcmVzZXJ2ZV9mYXN0cGF0aCkpCisJCXJldHVybiAwOworCisJaWYgKGludGVycnVwdGlibGUpCisJCXJldHVybiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1hbi0+aW9fcmVzZXJ2ZV9tdXRleCk7CisKKwltdXRleF9sb2NrKCZtYW4tPmlvX3Jlc2VydmVfbXV0ZXgpOworCXJldHVybiAwOworfQorCit2b2lkIHR0bV9tZW1faW9fdW5sb2NrKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuKQoreworCWlmIChsaWtlbHkobWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfdW5sb2NrKCZtYW4tPmlvX3Jlc2VydmVfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHR0bV9tZW1faW9fZXZpY3Qoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCit7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKKworCWlmICghbWFuLT51c2VfaW9fcmVzZXJ2ZV9scnUgfHwgbGlzdF9lbXB0eSgmbWFuLT5pb19yZXNlcnZlX2xydSkpCisJCXJldHVybiAtRUFHQUlOOworCisJYm8gPSBsaXN0X2ZpcnN0X2VudHJ5KCZtYW4tPmlvX3Jlc2VydmVfbHJ1LAorCQkJICAgICAgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LAorCQkJICAgICAgaW9fcmVzZXJ2ZV9scnUpOworCWxpc3RfZGVsX2luaXQoJmJvLT5pb19yZXNlcnZlX2xydSk7CisJdHRtX2JvX3VubWFwX3ZpcnR1YWxfbG9ja2VkKGJvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR0bV9tZW1faW9fcmVzZXJ2ZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKKwkJCSAgICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hblttZW0tPm1lbV90eXBlXTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYmRldi0+ZHJpdmVyLT5pb19tZW1fcmVzZXJ2ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGxpa2VseShtYW4tPmlvX3Jlc2VydmVfZmFzdHBhdGgpKQorCQlyZXR1cm4gYmRldi0+ZHJpdmVyLT5pb19tZW1fcmVzZXJ2ZShiZGV2LCBtZW0pOworCisJaWYgKGJkZXYtPmRyaXZlci0+aW9fbWVtX3Jlc2VydmUgJiYKKwkgICAgbWVtLT5idXMuaW9fcmVzZXJ2ZWRfY291bnQrKyA9PSAwKSB7CityZXRyeToKKwkJcmV0ID0gYmRldi0+ZHJpdmVyLT5pb19tZW1fcmVzZXJ2ZShiZGV2LCBtZW0pOworCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJCXJldCA9IHR0bV9tZW1faW9fZXZpY3QobWFuKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR0bV9tZW1faW9fZnJlZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKKwkJCSAgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtLT5tZW1fdHlwZV07CisKKwlpZiAobGlrZWx5KG1hbi0+aW9fcmVzZXJ2ZV9mYXN0cGF0aCkpCisJCXJldHVybjsKKworCWlmIChiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlICYmCisJICAgIC0tbWVtLT5idXMuaW9fcmVzZXJ2ZWRfY291bnQgPT0gMCAmJgorCSAgICBiZGV2LT5kcml2ZXItPmlvX21lbV9mcmVlKQorCQliZGV2LT5kcml2ZXItPmlvX21lbV9mcmVlKGJkZXYsIG1lbSk7CisKK30KKworaW50IHR0bV9tZW1faW9fcmVzZXJ2ZV92bShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoreworCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtID0gJmJvLT5tZW07CiAJaW50IHJldDsKIAotCWlmICghbWVtLT5idXMuaW9fcmVzZXJ2ZWQpIHsKLQkJbWVtLT5idXMuaW9fcmVzZXJ2ZWQgPSB0cnVlOwotCQlyZXQgPSBiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlKGJkZXYsIG1lbSk7CisJaWYgKCFtZW0tPmJ1cy5pb19yZXNlcnZlZF92bSkgeworCQlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9CisJCQkmYm8tPmJkZXYtPm1hblttZW0tPm1lbV90eXBlXTsKKworCQlyZXQgPSB0dG1fbWVtX2lvX3Jlc2VydmUoYm8tPmJkZXYsIG1lbSk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCQlyZXR1cm4gcmV0OworCQltZW0tPmJ1cy5pb19yZXNlcnZlZF92bSA9IHRydWU7CisJCWlmIChtYW4tPnVzZV9pb19yZXNlcnZlX2xydSkKKwkJCWxpc3RfYWRkX3RhaWwoJmJvLT5pb19yZXNlcnZlX2xydSwKKwkJCQkgICAgICAmbWFuLT5pb19yZXNlcnZlX2xydSk7CiAJfQogCXJldHVybiAwOwogfQogCi12b2lkIHR0bV9tZW1faW9fZnJlZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCit2b2lkIHR0bV9tZW1faW9fZnJlZV92bShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewotCWlmIChiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlKSB7Ci0JCWlmIChtZW0tPmJ1cy5pb19yZXNlcnZlZCkgewotCQkJbWVtLT5idXMuaW9fcmVzZXJ2ZWQgPSBmYWxzZTsKLQkJCWJkZXYtPmRyaXZlci0+aW9fbWVtX2ZyZWUoYmRldiwgbWVtKTsKLQkJfQorCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtID0gJmJvLT5tZW07CisKKwlpZiAobWVtLT5idXMuaW9fcmVzZXJ2ZWRfdm0pIHsKKwkJbWVtLT5idXMuaW9fcmVzZXJ2ZWRfdm0gPSBmYWxzZTsKKwkJbGlzdF9kZWxfaW5pdCgmYm8tPmlvX3Jlc2VydmVfbHJ1KTsKKwkJdHRtX21lbV9pb19mcmVlKGJvLT5iZGV2LCBtZW0pOwogCX0KIH0KIAogaW50IHR0bV9tZW1fcmVnX2lvcmVtYXAoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtLAogCQkJdm9pZCAqKnZpcnR1YWwpCiB7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW21lbS0+bWVtX3R5cGVdOwogCWludCByZXQ7CiAJdm9pZCAqYWRkcjsKIAogCSp2aXJ0dWFsID0gTlVMTDsKKwkodm9pZCkgdHRtX21lbV9pb19sb2NrKG1hbiwgZmFsc2UpOwogCXJldCA9IHR0bV9tZW1faW9fcmVzZXJ2ZShiZGV2LCBtZW0pOworCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7CiAJaWYgKHJldCB8fCAhbWVtLT5idXMuaXNfaW9tZW0pCiAJCXJldHVybiByZXQ7CiAKQEAgLTExNyw3ICsyMDMsOSBAQAogCQllbHNlCiAJCQlhZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+YnVzLmJhc2UgKyBtZW0tPmJ1cy5vZmZzZXQsIG1lbS0+YnVzLnNpemUpOwogCQlpZiAoIWFkZHIpIHsKKwkJCSh2b2lkKSB0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CiAJCQl0dG1fbWVtX2lvX2ZyZWUoYmRldiwgbWVtKTsKKwkJCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTEzNCw3ICsyMjIsOSBAQAogCiAJaWYgKHZpcnR1YWwgJiYgbWVtLT5idXMuYWRkciA9PSBOVUxMKQogCQlpb3VubWFwKHZpcnR1YWwpOworCSh2b2lkKSB0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CiAJdHRtX21lbV9pb19mcmVlKGJkZXYsIG1lbSk7CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIH0KIAogc3RhdGljIGludCB0dG1fY29weV9pb19wYWdlKHZvaWQgKmRzdCwgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIHBhZ2UpCkBAIC0yMzEsNyArMzIxLDcgQEAKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbmV3X21lbS0+bWVtX3R5cGVdOwogCXN0cnVjdCB0dG1fdHQgKnR0bSA9IGJvLT50dG07CiAJc3RydWN0IHR0bV9tZW1fcmVnICpvbGRfbWVtID0gJmJvLT5tZW07Ci0Jc3RydWN0IHR0bV9tZW1fcmVnIG9sZF9jb3B5ID0gKm9sZF9tZW07CisJc3RydWN0IHR0bV9tZW1fcmVnIG9sZF9jb3B5OwogCXZvaWQgKm9sZF9pb21hcDsKIAl2b2lkICpuZXdfaW9tYXA7CiAJaW50IHJldDsKQEAgLTI4MCw4ICszNzAsNyBAQAogCX0KIAltYigpOwogb3V0MjoKLQl0dG1fYm9fZnJlZV9vbGRfbm9kZShibyk7Ci0KKwlvbGRfY29weSA9ICpvbGRfbWVtOwogCSpvbGRfbWVtID0gKm5ld19tZW07CiAJbmV3X21lbS0+bW1fbm9kZSA9IE5VTEw7CiAKQEAgLTI5Miw5ICszODEsMTAgQEAKIAl9CiAKIG91dDE6Ci0JdHRtX21lbV9yZWdfaW91bm1hcChiZGV2LCBuZXdfbWVtLCBuZXdfaW9tYXApOworCXR0bV9tZW1fcmVnX2lvdW5tYXAoYmRldiwgb2xkX21lbSwgbmV3X2lvbWFwKTsKIG91dDoKIAl0dG1fbWVtX3JlZ19pb3VubWFwKGJkZXYsICZvbGRfY29weSwgb2xkX2lvbWFwKTsKKwl0dG1fYm9fbWVtX3B1dChibywgJm9sZF9jb3B5KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fbW92ZV9tZW1jcHkpOwpAQCAtMzM3LDExICs0MjcsMTEgQEAKIAkgKiBUT0RPOiBFeHBsaWNpdCBtZW1iZXIgY29weSB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgaGVyZS4KIAkgKi8KIAotCXNwaW5fbG9ja19pbml0KCZmYm8tPmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZiby0+ZXZlbnRfcXVldWUpOwogCUlOSVRfTElTVF9IRUFEKCZmYm8tPmRkZXN0cm95KTsKIAlJTklUX0xJU1RfSEVBRCgmZmJvLT5scnUpOwogCUlOSVRfTElTVF9IRUFEKCZmYm8tPnN3YXApOworCUlOSVRfTElTVF9IRUFEKCZmYm8tPmlvX3Jlc2VydmVfbHJ1KTsKIAlmYm8tPnZtX25vZGUgPSBOVUxMOwogCWF0b21pY19zZXQoJmZiby0+Y3B1X3dyaXRlcnMsIDApOwogCkBAIC00NTMsNiArNTQzLDggQEAKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wYWdlLCB1bnNpZ25lZCBsb25nIG51bV9wYWdlcywKIAkJc3RydWN0IHR0bV9ib19rbWFwX29iaiAqbWFwKQogeworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0KKwkJJmJvLT5iZGV2LT5tYW5bYm8tPm1lbS5tZW1fdHlwZV07CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7CiAJaW50IHJldDsKIApAQCAtNDY3LDcgKzU1OSw5IEBACiAJaWYgKG51bV9wYWdlcyA+IDEgJiYgIURSTV9TVVNFUihEUk1fQ1VSUFJPQykpCiAJCXJldHVybiAtRVBFUk07CiAjZW5kaWYKKwkodm9pZCkgdHRtX21lbV9pb19sb2NrKG1hbiwgZmFsc2UpOwogCXJldCA9IHR0bV9tZW1faW9fcmVzZXJ2ZShiby0+YmRldiwgJmJvLT5tZW0pOworCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAlpZiAoIWJvLT5tZW0uYnVzLmlzX2lvbWVtKSB7CkBAIC00ODIsMTIgKzU3NiwxNSBAQAogCiB2b2lkIHR0bV9ib19rdW5tYXAoc3RydWN0IHR0bV9ib19rbWFwX29iaiAqbWFwKQogeworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBtYXAtPmJvOworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0KKwkJJmJvLT5iZGV2LT5tYW5bYm8tPm1lbS5tZW1fdHlwZV07CisKIAlpZiAoIW1hcC0+dmlydHVhbCkKIAkJcmV0dXJuOwogCXN3aXRjaCAobWFwLT5ib19rbWFwX3R5cGUpIHsKIAljYXNlIHR0bV9ib19tYXBfaW9tYXA6CiAJCWlvdW5tYXAobWFwLT52aXJ0dWFsKTsKLQkJdHRtX21lbV9pb19mcmVlKG1hcC0+Ym8tPmJkZXYsICZtYXAtPmJvLT5tZW0pOwogCQlicmVhazsKIAljYXNlIHR0bV9ib19tYXBfdm1hcDoKIAkJdnVubWFwKG1hcC0+dmlydHVhbCk7CkBAIC01MDAsNiArNTk3LDkgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CisJKHZvaWQpIHR0bV9tZW1faW9fbG9jayhtYW4sIGZhbHNlKTsKKwl0dG1fbWVtX2lvX2ZyZWUobWFwLT5iby0+YmRldiwgJm1hcC0+Ym8tPm1lbSk7CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIAltYXAtPnZpcnR1YWwgPSBOVUxMOwogCW1hcC0+cGFnZSA9IE5VTEw7CiB9CkBAIC01MjAsNyArNjIwLDcgQEAKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmdob3N0X29iajsKIAl2b2lkICp0bXBfb2JqID0gTlVMTDsKIAotCXNwaW5fbG9jaygmYm8tPmxvY2spOworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJaWYgKGJvLT5zeW5jX29iaikgewogCQl0bXBfb2JqID0gYm8tPnN5bmNfb2JqOwogCQliby0+c3luY19vYmogPSBOVUxMOwpAQCAtNTI5LDcgKzYyOSw3IEBACiAJYm8tPnN5bmNfb2JqX2FyZyA9IHN5bmNfb2JqX2FyZzsKIAlpZiAoZXZpY3QpIHsKIAkJcmV0ID0gdHRtX2JvX3dhaXQoYm8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCWlmICh0bXBfb2JqKQogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmdG1wX29iaik7CiAJCWlmIChyZXQpCkBAIC01NTIsNyArNjUyLDcgQEAKIAkJICovCiAKIAkJc2V0X2JpdChUVE1fQk9fUFJJVl9GTEFHX01PVklORywgJmJvLT5wcml2X2ZsYWdzKTsKLQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQlpZiAodG1wX29iaikKIAkJCWRyaXZlci0+c3luY19vYmpfdW5yZWYoJnRtcF9vYmopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYwppbmRleCBmZTZjYjc3Li4yMjFiOTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMKQEAgLTgzLDYgKzgzLDggQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzczsKIAlpbnQgcmV0dmFsID0gVk1fRkFVTFRfTk9QQUdFOworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0KKwkJJmJkZXYtPm1hbltiby0+bWVtLm1lbV90eXBlXTsKIAogCS8qCiAJICogV29yayBhcm91bmQgbG9ja2luZyBvcmRlciByZXZlcnNhbCBpbiBmYXVsdCAvIG5vcGZuCkBAIC0xMTgsMjQgKzEyMCwyOCBAQAogCSAqIG1vdmUuCiAJICovCiAKLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCWlmICh0ZXN0X2JpdChUVE1fQk9fUFJJVl9GTEFHX01PVklORywgJmJvLT5wcml2X2ZsYWdzKSkgewogCQlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CiAJCQlyZXR2YWwgPSAocmV0ICE9IC1FUkVTVEFSVFNZUykgPwogCQkJICAgIFZNX0ZBVUxUX1NJR0JVUyA6IFZNX0ZBVUxUX05PUEFHRTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCX0gZWxzZQotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAKLQotCXJldCA9IHR0bV9tZW1faW9fcmVzZXJ2ZShiZGV2LCAmYm8tPm1lbSk7Ci0JaWYgKHJldCkgewotCQlyZXR2YWwgPSBWTV9GQVVMVF9TSUdCVVM7CisJcmV0ID0gdHRtX21lbV9pb19sb2NrKG1hbiwgdHJ1ZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlyZXR2YWwgPSBWTV9GQVVMVF9OT1BBR0U7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CisJcmV0ID0gdHRtX21lbV9pb19yZXNlcnZlX3ZtKGJvKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXJldHZhbCA9IFZNX0ZBVUxUX1NJR0JVUzsKKwkJZ290byBvdXRfaW9fdW5sb2NrOworCX0KIAogCXBhZ2Vfb2Zmc2V0ID0gKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKwogCSAgICBiby0+dm1fbm9kZS0+c3RhcnQgLSB2bWEtPnZtX3Bnb2ZmOwpAQCAtMTQ0LDcgKzE1MCw3IEBACiAKIAlpZiAodW5saWtlbHkocGFnZV9vZmZzZXQgPj0gYm8tPm51bV9wYWdlcykpIHsKIAkJcmV0dmFsID0gVk1fRkFVTFRfU0lHQlVTOwotCQlnb3RvIG91dF91bmxvY2s7CisJCWdvdG8gb3V0X2lvX3VubG9jazsKIAl9CiAKIAkvKgpAQCAtMTgyLDcgKzE4OCw3IEBACiAJCQlwYWdlID0gdHRtX3R0X2dldF9wYWdlKHR0bSwgcGFnZV9vZmZzZXQpOwogCQkJaWYgKHVubGlrZWx5KCFwYWdlICYmIGkgPT0gMCkpIHsKIAkJCQlyZXR2YWwgPSBWTV9GQVVMVF9PT007Ci0JCQkJZ290byBvdXRfdW5sb2NrOworCQkJCWdvdG8gb3V0X2lvX3VubG9jazsKIAkJCX0gZWxzZSBpZiAodW5saWtlbHkoIXBhZ2UpKSB7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yMDAsMTQgKzIwNiwxNSBAQAogCQllbHNlIGlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJCXJldHZhbCA9CiAJCQkgICAgKHJldCA9PSAtRU5PTUVNKSA/IFZNX0ZBVUxUX09PTSA6IFZNX0ZBVUxUX1NJR0JVUzsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCWdvdG8gb3V0X2lvX3VubG9jazsKIAkJfQogCiAJCWFkZHJlc3MgKz0gUEFHRV9TSVpFOwogCQlpZiAodW5saWtlbHkoKytwYWdlX29mZnNldCA+PSBwYWdlX2xhc3QpKQogCQkJYnJlYWs7CiAJfQotCitvdXRfaW9fdW5sb2NrOgorCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7CiBvdXRfdW5sb2NrOgogCXR0bV9ib191bnJlc2VydmUoYm8pOwogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9leGVjYnVmX3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jCmluZGV4IGMyODVjMjkuLjM4MzJmZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotdm9pZCB0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbihzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQorc3RhdGljIHZvaWQgdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb25fbG9ja2VkKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5OwogCkBAIC00MSwxMCArNDEsNzcgQEAKIAkJaWYgKCFlbnRyeS0+cmVzZXJ2ZWQpCiAJCQljb250aW51ZTsKIAorCQlpZiAoZW50cnktPnJlbW92ZWQpIHsKKwkJCXR0bV9ib19hZGRfdG9fbHJ1KGJvKTsKKwkJCWVudHJ5LT5yZW1vdmVkID0gZmFsc2U7CisKKwkJfQogCQllbnRyeS0+cmVzZXJ2ZWQgPSBmYWxzZTsKLQkJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisJCWF0b21pY19zZXQoJmJvLT5yZXNlcnZlZCwgMCk7CisJCXdha2VfdXBfYWxsKCZiby0+ZXZlbnRfcXVldWUpOwogCX0KIH0KKworc3RhdGljIHZvaWQgdHRtX2V1X2RlbF9mcm9tX2xydV9sb2NrZWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBoZWFkKSB7CisJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBlbnRyeS0+Ym87CisJCWlmICghZW50cnktPnJlc2VydmVkKQorCQkJY29udGludWU7CisKKwkJaWYgKCFlbnRyeS0+cmVtb3ZlZCkgeworCQkJZW50cnktPnB1dF9jb3VudCA9IHR0bV9ib19kZWxfZnJvbV9scnUoYm8pOworCQkJZW50cnktPnJlbW92ZWQgPSB0cnVlOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB0dG1fZXVfbGlzdF9yZWZfc3ViKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZW50cnktPmJvOworCisJCWlmIChlbnRyeS0+cHV0X2NvdW50KSB7CisJCQl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBlbnRyeS0+cHV0X2NvdW50LCB0cnVlKTsKKwkJCWVudHJ5LT5wdXRfY291bnQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHR0bV9ldV93YWl0X3VucmVzZXJ2ZWRfbG9ja2VkKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJCSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoreworCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gYm8tPmdsb2I7CisJaW50IHJldDsKKworCXR0bV9ldV9kZWxfZnJvbV9scnVfbG9ja2VkKGxpc3QpOworCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJcmV0ID0gdHRtX2JvX3dhaXRfdW5yZXNlcnZlZChibywgdHJ1ZSk7CisJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb25fbG9ja2VkKGxpc3QpOworCXJldHVybiByZXQ7Cit9CisKKwordm9pZCB0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbihzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICplbnRyeTsKKwlzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYjsKKworCWlmIChsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm47CisKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIsIGhlYWQpOworCWdsb2IgPSBlbnRyeS0+Ym8tPmdsb2I7CisJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb25fbG9ja2VkKGxpc3QpOworCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7Cit9CiBFWFBPUlRfU1lNQk9MKHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKTsKIAogLyoKQEAgLTU5LDM3ICsxMjYsNzYgQEAKICAqIGJ1ZmZlcnMgaW4gZGlmZmVyZW50IG9yZGVycy4KICAqLwogCi1pbnQgdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCB1aW50MzJfdCB2YWxfc2VxKQoraW50IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKKwlzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYjsKIAlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnk7CiAJaW50IHJldDsKKwl1aW50MzJfdCB2YWxfc2VxOworCisJaWYgKGxpc3RfZW1wdHkobGlzdCkpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgeworCQllbnRyeS0+cmVzZXJ2ZWQgPSBmYWxzZTsKKwkJZW50cnktPnB1dF9jb3VudCA9IDA7CisJCWVudHJ5LT5yZW1vdmVkID0gZmFsc2U7CisJfQorCisJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyLCBoZWFkKTsKKwlnbG9iID0gZW50cnktPmJvLT5nbG9iOwogCiByZXRyeToKKwlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKKwl2YWxfc2VxID0gZW50cnktPmJvLT5iZGV2LT52YWxfc2VxKys7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBoZWFkKSB7CiAJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBlbnRyeS0+Ym87CiAKLQkJZW50cnktPnJlc2VydmVkID0gZmFsc2U7Ci0JCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdmFsX3NlcSk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24obGlzdCk7Ci0JCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKGJvLCB0cnVlKTsKLQkJCQlpZiAodW5saWtlbHkocmV0ICE9IDApKQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCWdvdG8gcmV0cnk7Ci0JCQl9IGVsc2UKK3JldHJ5X3RoaXNfYm86CisJCXJldCA9IHR0bV9ib19yZXNlcnZlX2xvY2tlZChibywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdmFsX3NlcSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FQlVTWToKKwkJCXJldCA9IHR0bV9ldV93YWl0X3VucmVzZXJ2ZWRfbG9ja2VkKGxpc3QsIGJvKTsKKwkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQkJCXR0bV9ldV9saXN0X3JlZl9zdWIobGlzdCk7CiAJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWdvdG8gcmV0cnlfdGhpc19ibzsKKwkJY2FzZSAtRUFHQUlOOgorCQkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb25fbG9ja2VkKGxpc3QpOworCQkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwkJCXR0bV9ldV9saXN0X3JlZl9zdWIobGlzdCk7CisJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKGJvLCB0cnVlKTsKKwkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gcmV0cnk7CisJCWRlZmF1bHQ6CisJCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQobGlzdCk7CisJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQkJdHRtX2V1X2xpc3RfcmVmX3N1YihsaXN0KTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAogCQllbnRyeS0+cmVzZXJ2ZWQgPSB0cnVlOwogCQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmJvLT5jcHVfd3JpdGVycykgPiAwKSkgewotCQkJdHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24obGlzdCk7CisJCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQobGlzdCk7CisJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQkJdHRtX2V1X2xpc3RfcmVmX3N1YihsaXN0KTsKIAkJCXJldCA9IHR0bV9ib193YWl0X2NwdShibywgZmFsc2UpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQkJZ290byByZXRyeTsKIAkJfQogCX0KKworCXR0bV9ldV9kZWxfZnJvbV9scnVfbG9ja2VkKGxpc3QpOworCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJdHRtX2V1X2xpc3RfcmVmX3N1YihsaXN0KTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKTsKQEAgLTk3LDIxICsyMDMsMzYgQEAKIHZvaWQgdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHZvaWQgKnN5bmNfb2JqKQogewogCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICplbnRyeTsKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOworCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iOworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2OworCXN0cnVjdCB0dG1fYm9fZHJpdmVyICpkcml2ZXI7CisKKwlpZiAobGlzdF9lbXB0eShsaXN0KSkKKwkJcmV0dXJuOworCisJYm8gPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyLCBoZWFkKS0+Ym87CisJYmRldiA9IGJvLT5iZGV2OworCWRyaXZlciA9IGJkZXYtPmRyaXZlcjsKKwlnbG9iID0gYm8tPmdsb2I7CisKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0gZW50cnktPmJvOwotCQlzdHJ1Y3QgdHRtX2JvX2RyaXZlciAqZHJpdmVyID0gYm8tPmJkZXYtPmRyaXZlcjsKLQkJdm9pZCAqb2xkX3N5bmNfb2JqOwotCi0JCXNwaW5fbG9jaygmYm8tPmxvY2spOwotCQlvbGRfc3luY19vYmogPSBiby0+c3luY19vYmo7CisJCWJvID0gZW50cnktPmJvOworCQllbnRyeS0+b2xkX3N5bmNfb2JqID0gYm8tPnN5bmNfb2JqOwogCQliby0+c3luY19vYmogPSBkcml2ZXItPnN5bmNfb2JqX3JlZihzeW5jX29iaik7CiAJCWJvLT5zeW5jX29ial9hcmcgPSBlbnRyeS0+bmV3X3N5bmNfb2JqX2FyZzsKLQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKLQkJdHRtX2JvX3VucmVzZXJ2ZShibyk7CisJCXR0bV9ib191bnJlc2VydmVfbG9ja2VkKGJvKTsKIAkJZW50cnktPnJlc2VydmVkID0gZmFsc2U7Ci0JCWlmIChvbGRfc3luY19vYmopCi0JCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZvbGRfc3luY19vYmopOworCX0KKwlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGxpc3QsIGhlYWQpIHsKKwkJaWYgKGVudHJ5LT5vbGRfc3luY19vYmopCisJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZlbnRyeS0+b2xkX3N5bmNfb2JqKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ldV9mZW5jZV9idWZmZXJfb2JqZWN0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCmluZGV4IGU3YTU4ZDAuLjEwZmMwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oCkBAIC0yNjQsNyArMjY0LDYgQEAKIAkgKi8KIAogCXN0cnVjdCB2bXdfc3dfY29udGV4dCBjdHg7Ci0JdWludDMyX3QgdmFsX3NlcTsKIAlzdHJ1Y3QgbXV0ZXggY21kYnVmX211dGV4OwogCiAJLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKaW5kZXggNzY5NTRlMy4uNDFiOTVlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYwpAQCAtNjUzLDggKzY1Myw3IEBACiAJcmV0ID0gdm13X2NtZF9jaGVja19hbGwoZGV2X3ByaXYsIHN3X2NvbnRleHQsIGNtZCwgYXJnLT5jb21tYW5kX3NpemUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X2VycjsKLQlyZXQgPSB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKCZzd19jb250ZXh0LT52YWxpZGF0ZV9ub2RlcywKLQkJCQkgICAgIGRldl9wcml2LT52YWxfc2VxKyspOworCXJldCA9IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9lcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCmluZGV4IGZlMDk2YTcuLmJmYWI2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYwpAQCAtNDgwLDkgKzQ4MCw2IEBACiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSAwOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IGZiX3NpemU7CiAKLQlpbmZvLT5maXgubW1pb19zdGFydCA9IDA7Ci0JaW5mby0+Zml4Lm1taW9fbGVuID0gMDsKLQogCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFyLT5wc2V1ZG9fcGFsZXR0ZTsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IHBhci0+dm1hbGxvYzsKIAlpbmZvLT5zY3JlZW5fc2l6ZSA9IGZiX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9zdHViL0tjb25maWcgYi9kcml2ZXJzL2dwdS9zdHViL0tjb25maWcKaW5kZXggMGUxZWRkNy4uMDlhZWE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvc3R1Yi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L3N0dWIvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKIAlkZXBlbmRzIG9uIFBDSQogCSMgUG91bHNibyBzdHViIGRlcGVuZHMgb24gQUNQSV9WSURFTyB3aGVuIEFDUEkgaXMgZW5hYmxlZAogCSMgYnV0IGZvciBzZWxlY3QgdG8gd29yaywgbmVlZCB0byBzZWxlY3QgQUNQSV9WSURFTydzIGRlcGVuZGVuY2llcywgaWNrCi0Jc2VsZWN0IFZJREVPX09VVFBVVF9DT05UUk9MIGlmIEFDUEkKIAlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSBpZiBBQ1BJCiAJc2VsZWN0IElOUFVUIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS92Z2EvdmdhX3N3aXRjaGVyb28uYyBiL2RyaXZlcnMvZ3B1L3ZnYS92Z2Ffc3dpdGNoZXJvby5jCmluZGV4IGM4NzY4ZjMuLmUwMWNhY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L3ZnYS92Z2Ffc3dpdGNoZXJvby5jCisrKyBiL2RyaXZlcnMvZ3B1L3ZnYS92Z2Ffc3dpdGNoZXJvby5jCkBAIC0zMyw2ICszMyw3IEBACiAJc3RydWN0IGZiX2luZm8gKmZiX2luZm87CiAJaW50IHB3cl9zdGF0ZTsKIAl2b2lkICgqc2V0X2dwdV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGVudW0gdmdhX3N3aXRjaGVyb29fc3RhdGUpOworCXZvaWQgKCpyZXByb2JlKShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAJYm9vbCAoKmNhbl9zd2l0Y2gpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAlpbnQgaWQ7CiAJYm9vbCBhY3RpdmU7CkBAIC0xMDMsNiArMTA0LDcgQEAKIAogaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICB2b2lkICgqc2V0X2dwdV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGVudW0gdmdhX3N3aXRjaGVyb29fc3RhdGUpLAorCQkJCSAgIHZvaWQgKCpyZXByb2JlKShzdHJ1Y3QgcGNpX2RldiAqcGRldiksCiAJCQkJICAgYm9vbCAoKmNhbl9zd2l0Y2gpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KSkKIHsKIAlpbnQgaW5kZXg7CkBAIC0xMTcsNiArMTE5LDcgQEAKIAl2Z2Fzcl9wcml2LmNsaWVudHNbaW5kZXhdLnB3cl9zdGF0ZSA9IFZHQV9TV0lUQ0hFUk9PX09OOwogCXZnYXNyX3ByaXYuY2xpZW50c1tpbmRleF0ucGRldiA9IHBkZXY7CiAJdmdhc3JfcHJpdi5jbGllbnRzW2luZGV4XS5zZXRfZ3B1X3N0YXRlID0gc2V0X2dwdV9zdGF0ZTsKKwl2Z2Fzcl9wcml2LmNsaWVudHNbaW5kZXhdLnJlcHJvYmUgPSByZXByb2JlOwogCXZnYXNyX3ByaXYuY2xpZW50c1tpbmRleF0uY2FuX3N3aXRjaCA9IGNhbl9zd2l0Y2g7CiAJdmdhc3JfcHJpdi5jbGllbnRzW2luZGV4XS5pZCA9IC0xOwogCWlmIChwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX1NIQURPVykKQEAgLTE3NCw3ICsxNzcsOCBAQAogCWludCBpOwogCW11dGV4X2xvY2soJnZnYXNyX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgVkdBX1NXSVRDSEVST09fTUFYX0NMSUVOVFM7IGkrKykgewotCQlzZXFfcHJpbnRmKG0sICIlZDolYzolczolc1xuIiwgaSwKKwkJc2VxX3ByaW50ZihtLCAiJWQ6JXM6JWM6JXM6JXNcbiIsIGksCisJCQkgICB2Z2Fzcl9wcml2LmNsaWVudHNbaV0uaWQgPT0gVkdBX1NXSVRDSEVST09fRElTID8gIkRJUyIgOiAiSUdEIiwKIAkJCSAgIHZnYXNyX3ByaXYuY2xpZW50c1tpXS5hY3RpdmUgPyAnKycgOiAnICcsCiAJCQkgICB2Z2Fzcl9wcml2LmNsaWVudHNbaV0ucHdyX3N0YXRlID8gIlB3ciIgOiAiT2ZmIiwKIAkJCSAgIHBjaV9uYW1lKHZnYXNyX3ByaXYuY2xpZW50c1tpXS5wZGV2KSk7CkBAIC0xOTAsOSArMTk0LDggQEAKIAogc3RhdGljIGludCB2Z2Ffc3dpdGNob24oc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2NsaWVudCAqY2xpZW50KQogewotCWludCByZXQ7Ci0KLQlyZXQgPSB2Z2Fzcl9wcml2LmhhbmRsZXItPnBvd2VyX3N0YXRlKGNsaWVudC0+aWQsIFZHQV9TV0lUQ0hFUk9PX09OKTsKKwlpZiAodmdhc3JfcHJpdi5oYW5kbGVyLT5wb3dlcl9zdGF0ZSkKKwkJdmdhc3JfcHJpdi5oYW5kbGVyLT5wb3dlcl9zdGF0ZShjbGllbnQtPmlkLCBWR0FfU1dJVENIRVJPT19PTik7CiAJLyogY2FsbCB0aGUgZHJpdmVyIGNhbGxiYWNrIHRvIHR1cm4gb24gZGV2aWNlICovCiAJY2xpZW50LT5zZXRfZ3B1X3N0YXRlKGNsaWVudC0+cGRldiwgVkdBX1NXSVRDSEVST09fT04pOwogCWNsaWVudC0+cHdyX3N0YXRlID0gVkdBX1NXSVRDSEVST09fT047CkBAIC0yMDMsMTIgKzIwNiwxNCBAQAogewogCS8qIGNhbGwgdGhlIGRyaXZlciBjYWxsYmFjayB0byB0dXJuIG9mZiBkZXZpY2UgKi8KIAljbGllbnQtPnNldF9ncHVfc3RhdGUoY2xpZW50LT5wZGV2LCBWR0FfU1dJVENIRVJPT19PRkYpOwotCXZnYXNyX3ByaXYuaGFuZGxlci0+cG93ZXJfc3RhdGUoY2xpZW50LT5pZCwgVkdBX1NXSVRDSEVST09fT0ZGKTsKKwlpZiAodmdhc3JfcHJpdi5oYW5kbGVyLT5wb3dlcl9zdGF0ZSkKKwkJdmdhc3JfcHJpdi5oYW5kbGVyLT5wb3dlcl9zdGF0ZShjbGllbnQtPmlkLCBWR0FfU1dJVENIRVJPT19PRkYpOwogCWNsaWVudC0+cHdyX3N0YXRlID0gVkdBX1NXSVRDSEVST09fT0ZGOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZnYV9zd2l0Y2h0byhzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50ICpuZXdfY2xpZW50KQorLyogc3RhZ2Ugb25lIGhhcHBlbnMgYmVmb3JlIGRlbGF5ICovCitzdGF0aWMgaW50IHZnYV9zd2l0Y2h0b19zdGFnZTEoc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2NsaWVudCAqbmV3X2NsaWVudCkKIHsKIAlpbnQgcmV0OwogCWludCBpOwpAQCAtMjM1LDEwICsyNDAsMjggQEAKIAkJdmdhX3N3aXRjaG9uKG5ld19jbGllbnQpOwogCiAJLyogc3dhcCBzaGFkb3cgcmVzb3VyY2UgdG8gZGVub3RlIGJvb3QgVkdBIGRldmljZSBoYXMgY2hhbmdlZCBzbyBYIHN0YXJ0cyBvbiBuZXcgZGV2aWNlICovCi0JYWN0aXZlLT5hY3RpdmUgPSBmYWxzZTsKLQogCWFjdGl2ZS0+cGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX1NIQURPVzsKIAluZXdfY2xpZW50LT5wZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyB8PSBJT1JFU09VUkNFX1JPTV9TSEFET1c7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBvc3QgZGVsYXkgKi8KK3N0YXRpYyBpbnQgdmdhX3N3aXRjaHRvX3N0YWdlMihzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50ICpuZXdfY2xpZW50KQoreworCWludCByZXQ7CisJaW50IGk7CisJc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2NsaWVudCAqYWN0aXZlID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBWR0FfU1dJVENIRVJPT19NQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlmICh2Z2Fzcl9wcml2LmNsaWVudHNbaV0uYWN0aXZlID09IHRydWUpIHsKKwkJCWFjdGl2ZSA9ICZ2Z2Fzcl9wcml2LmNsaWVudHNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWFjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwlhY3RpdmUtPmFjdGl2ZSA9IGZhbHNlOwogCiAJaWYgKG5ld19jbGllbnQtPmZiX2luZm8pIHsKIAkJc3RydWN0IGZiX2V2ZW50IGV2ZW50OwpAQCAtMjUwLDYgKzI3Myw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWlmIChuZXdfY2xpZW50LT5yZXByb2JlKQorCQluZXdfY2xpZW50LT5yZXByb2JlKG5ld19jbGllbnQtPnBkZXYpOworCiAJaWYgKGFjdGl2ZS0+cHdyX3N0YXRlID09IFZHQV9TV0lUQ0hFUk9PX09OKQogCQl2Z2Ffc3dpdGNob2ZmKGFjdGl2ZSk7CiAKQEAgLTI2NSw2ICsyOTEsNyBAQAogCWNvbnN0IGNoYXIgKnBkZXZfbmFtZTsKIAlpbnQgaSwgcmV0OwogCWJvb2wgZGVsYXkgPSBmYWxzZSwgY2FuX3N3aXRjaDsKKwlib29sIGp1c3RfbXV4ID0gZmFsc2U7CiAJaW50IGNsaWVudF9pZCA9IC0xOwogCXN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19jbGllbnQgKmNsaWVudCA9IE5VTEw7CiAKQEAgLTMxOSw2ICszNDYsMTUgQEAKIAlpZiAoc3RybmNtcCh1c2VyY21kLCAiRElTIiwgMykgPT0gMCkKIAkJY2xpZW50X2lkID0gVkdBX1NXSVRDSEVST09fRElTOwogCisJaWYgKHN0cm5jbXAodXNlcmNtZCwgIk1JR0QiLCA0KSA9PSAwKSB7CisJCWp1c3RfbXV4ID0gdHJ1ZTsKKwkJY2xpZW50X2lkID0gVkdBX1NXSVRDSEVST09fSUdEOworCX0KKwlpZiAoc3RybmNtcCh1c2VyY21kLCAiTURJUyIsIDQpID09IDApIHsKKwkJanVzdF9tdXggPSB0cnVlOworCQljbGllbnRfaWQgPSBWR0FfU1dJVENIRVJPT19ESVM7CisJfQorCiAJaWYgKGNsaWVudF9pZCA9PSAtMSkKIAkJZ290byBvdXQ7CiAKQEAgLTMzMCw2ICszNjYsMTIgQEAKIAl9CiAKIAl2Z2Fzcl9wcml2LmRlbGF5ZWRfc3dpdGNoX2FjdGl2ZSA9IGZhbHNlOworCisJaWYgKGp1c3RfbXV4KSB7CisJCXJldCA9IHZnYXNyX3ByaXYuaGFuZGxlci0+c3dpdGNodG8oY2xpZW50X2lkKTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogb2theSB3ZSB3YW50IGEgc3dpdGNoIC0gdGVzdCBpZiBkZXZpY2VzIGFyZSB3aWxsaW5nIHRvIHN3aXRjaCAqLwogCWNhbl9zd2l0Y2ggPSB0cnVlOwogCWZvciAoaSA9IDA7IGkgPCBWR0FfU1dJVENIRVJPT19NQVhfQ0xJRU5UUzsgaSsrKSB7CkBAIC0zNDUsMTggKzM4NywyMiBAQAogCiAJaWYgKGNhbl9zd2l0Y2ggPT0gdHJ1ZSkgewogCQlwZGV2X25hbWUgPSBwY2lfbmFtZShjbGllbnQtPnBkZXYpOwotCQlyZXQgPSB2Z2Ffc3dpdGNodG8oY2xpZW50KTsKKwkJcmV0ID0gdmdhX3N3aXRjaHRvX3N0YWdlMShjbGllbnQpOwogCQlpZiAocmV0KQotCQkJcHJpbnRrKEtFUk5fRVJSICJ2Z2Ffc3dpdGNoZXJvbzogc3dpdGNoaW5nIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJCXByaW50ayhLRVJOX0VSUiAidmdhX3N3aXRjaGVyb286IHN3aXRjaGluZyBmYWlsZWQgc3RhZ2UgMSAlZFxuIiwgcmV0KTsKKworCQlyZXQgPSB2Z2Ffc3dpdGNodG9fc3RhZ2UyKGNsaWVudCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgInZnYV9zd2l0Y2hlcm9vOiBzd2l0Y2hpbmcgZmFpbGVkIHN0YWdlIDIgJWRcbiIsIHJldCk7CisKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9JTkZPICJ2Z2Ffc3dpdGNoZXJvbzogc2V0dGluZyBkZWxheWVkIHN3aXRjaCB0byBjbGllbnQgJWRcbiIsIGNsaWVudC0+aWQpOwogCQl2Z2Fzcl9wcml2LmRlbGF5ZWRfc3dpdGNoX2FjdGl2ZSA9IHRydWU7CiAJCXZnYXNyX3ByaXYuZGVsYXllZF9jbGllbnRfaWQgPSBjbGllbnRfaWQ7CiAKLQkJLyogd2Ugc2hvdWxkIGF0IGxlYXN0IHBvd2VyIHVwIHRoZSBjYXJkIHRvCi0JCSAgIG1ha2UgdGhlIHN3aXRjaCBmYXN0ZXIgKi8KLQkJaWYgKGNsaWVudC0+cHdyX3N0YXRlID09IFZHQV9TV0lUQ0hFUk9PX09GRikKLQkJCXZnYV9zd2l0Y2hvbihjbGllbnQpOworCQlyZXQgPSB2Z2Ffc3dpdGNodG9fc3RhZ2UxKGNsaWVudCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgInZnYV9zd2l0Y2hlcm9vOiBkZWxheWVkIHN3aXRjaGluZyBzdGFnZSAxIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAl9CiAKIG91dDoKQEAgLTQzOCw5ICs0ODQsOSBAQAogCQlnb3RvIGVycjsKIAogCXBkZXZfbmFtZSA9IHBjaV9uYW1lKGNsaWVudC0+cGRldik7Ci0JcmV0ID0gdmdhX3N3aXRjaHRvKGNsaWVudCk7CisJcmV0ID0gdmdhX3N3aXRjaHRvX3N0YWdlMihjbGllbnQpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAidmdhX3N3aXRjaGVyb286IGRlbGF5ZWQgc3dpdGNoaW5nIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2Z2Ffc3dpdGNoZXJvbzogZGVsYXllZCBzd2l0Y2hpbmcgZmFpbGVkIHN0YWdlIDIgJWRcbiIsIHJldCk7CiAKIAl2Z2Fzcl9wcml2LmRlbGF5ZWRfc3dpdGNoX2FjdGl2ZSA9IGZhbHNlOwogCWVyciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvS2NvbmZpZwppbmRleCA0MDFhY2VjLi4yNGNjYTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaGlkL0tjb25maWcKQEAgLTE1MCw2ICsxNTAsMTYgQEAKIAlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBEcmFnb25SaXNlIEluYy4KIAlnYW1lIGNvbnRyb2xsZXJzLgogCitjb25maWcgSElEX0VNU19GRgorCXRyaXN0YXRlICJFTVMgUHJvZHVjdGlvbiBJbmMuIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKwktLS1oZWxwLS0tCisJU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgZGV2aWNlcyBieQorCUVNUyBQcm9kdWN0aW9uIEx0ZC4KKwlDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBrbm93biB0byBiZSBzdXBwb3J0ZWQ6CisJIC0gVHJpbyBMaW5rZXIgUGx1cyBJSQorCiBjb25maWcgSElEX0VHQUxBWAogCXRyaXN0YXRlICJlR2FsYXggbXVsdGktdG91Y2ggcGFuZWwiCiAJZGVwZW5kcyBvbiBVU0JfSElECkBAIC0yODUsNiArMjk1LDIzIEBACiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIE1vbnRlcmV5IEdlbml1cyBLQjI5RS4KIAorY29uZmlnIEhJRF9NVUxUSVRPVUNICisJdHJpc3RhdGUgIkhJRCBNdWx0aXRvdWNoIHBhbmVscyIKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwktLS1oZWxwLS0tCisJICBHZW5lcmljIHN1cHBvcnQgZm9yIEhJRCBtdWx0aXRvdWNoIHBhbmVscy4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBkZXZpY2VzOgorCSAgLSBDeXByZXNzIFRydWVUb3VjaCBwYW5lbHMKKwkgIC0gSGFudm9uIGR1YWwgdG91Y2ggcGFuZWxzCisJICAtIFBpeGNpciBkdWFsIHRvdWNoIHBhbmVscworCSAgLSAnU2Vuc2luZyBXaW43LVR3b0ZpbmdlcicgcGFuZWwgYnkgR2VuZXJhbFRvdWNoCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhpZC1tdWx0aXRvdWNoLgorCiBjb25maWcgSElEX05UUklHCiAJdHJpc3RhdGUgIk4tVHJpZyB0b3VjaCBzY3JlZW4iCiAJZGVwZW5kcyBvbiBVU0JfSElECkBAIC0zOTcsNiArNDI0LDEzIEBACiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIFJvY2NhdCBLb25lIG1vdXNlLgogCitjb25maWcgSElEX1JPQ0NBVF9LT05FUExVUworCXRyaXN0YXRlICJSb2NjYXQgS29uZVsrXSBtb3VzZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX0hJRAorCXNlbGVjdCBISURfUk9DQ0FUCisJLS0taGVscC0tLQorCVN1cHBvcnQgZm9yIFJvY2NhdCBLb25lWytdIG1vdXNlLgorCiBjb25maWcgSElEX1JPQ0NBVF9QWVJBCiAJdHJpc3RhdGUgIlJvY2NhdCBQeXJhIG1vdXNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0JfSElECmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCmluZGV4IGMzMzU2MDUuLjZlZmMyYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIEhJRCBkcml2ZXIKICMKLWhpZC1vYmpzCQkJOj0gaGlkLWNvcmUubyBoaWQtaW5wdXQubworaGlkLXkJCQk6PSBoaWQtY29yZS5vIGhpZC1pbnB1dC5vCiAKIGlmZGVmIENPTkZJR19ERUJVR19GUwogCWhpZC1vYmpzCQkrPSBoaWQtZGVidWcubwpAQCAtMTEsMTggKzExLDE4IEBACiAKIGhpZC0kKENPTkZJR19ISURSQVcpCQkrPSBoaWRyYXcubwogCi1oaWQtbG9naXRlY2gtb2JqcwkJOj0gaGlkLWxnLm8KK2hpZC1sb2dpdGVjaC15CQk6PSBoaWQtbGcubwogaWZkZWYgQ09ORklHX0xPR0lURUNIX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZ2ZmLm8KIGVuZGlmCiBpZmRlZiBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYKLQloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGcyZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZzJmZi5vCiBlbmRpZgogaWZkZWYgQ09ORklHX0xPR0lHOTQwX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnM2ZmLm8KKwloaWQtbG9naXRlY2gteQkrPSBoaWQtbGczZmYubwogZW5kaWYKIGlmZGVmIENPTkZJR19MT0dJV0lJX0ZGCi0JaGlkLWxvZ2l0ZWNoLW9ianMJKz0gaGlkLWxnNGZmLm8KKwloaWQtbG9naXRlY2gteQkrPSBoaWQtbGc0ZmYubwogZW5kaWYKIAogb2JqLSQoQ09ORklHX0hJRF8zTV9QQ1QpCSs9IGhpZC0zbS1wY3QubwpAQCAtMzUsNiArMzUsNyBAQAogb2JqLSQoQ09ORklHX0hJRF9DSElDT05ZKQkrPSBoaWQtY2hpY29ueS5vCiBvYmotJChDT05GSUdfSElEX0NZUFJFU1MpCSs9IGhpZC1jeXByZXNzLm8KIG9iai0kKENPTkZJR19ISURfRFJBR09OUklTRSkJKz0gaGlkLWRyZmYubworb2JqLSQoQ09ORklHX0hJRF9FTVNfRkYpCSs9IGhpZC1lbXNmZi5vCiBvYmotJChDT05GSUdfSElEX0VHQUxBWCkJKz0gaGlkLWVnYWxheC5vCiBvYmotJChDT05GSUdfSElEX0VMRUNPTSkJKz0gaGlkLWVsZWNvbS5vCiBvYmotJChDT05GSUdfSElEX0VaS0VZKQkJKz0gaGlkLWV6a2V5Lm8KQEAgLTQ2LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19ISURfTUlDUk9TT0ZUKQkrPSBoaWQtbWljcm9zb2Z0Lm8KIG9iai0kKENPTkZJR19ISURfTU9OVEVSRVkpCSs9IGhpZC1tb250ZXJleS5vCiBvYmotJChDT05GSUdfSElEX01PU0FSVCkJKz0gaGlkLW1vc2FydC5vCitvYmotJChDT05GSUdfSElEX01VTFRJVE9VQ0gpCSs9IGhpZC1tdWx0aXRvdWNoLm8KIG9iai0kKENPTkZJR19ISURfTlRSSUcpCQkrPSBoaWQtbnRyaWcubwogb2JqLSQoQ09ORklHX0hJRF9PUlRFSykJCSs9IGhpZC1vcnRlay5vCiBvYmotJChDT05GSUdfSElEX1BST0RJS0VZUykJKz0gaGlkLXByb2Rpa2V5cy5vCkBAIC01NSw2ICs1Nyw3IEBACiBvYmotJChDT05GSUdfSElEX1BJQ09MQ0QpCSs9IGhpZC1waWNvbGNkLm8KIG9iai0kKENPTkZJR19ISURfUk9DQ0FUKQkrPSBoaWQtcm9jY2F0Lm8KIG9iai0kKENPTkZJR19ISURfUk9DQ0FUX0tPTkUpCSs9IGhpZC1yb2NjYXQta29uZS5vCitvYmotJChDT05GSUdfSElEX1JPQ0NBVF9LT05FUExVUykJKz0gaGlkLXJvY2NhdC1rb25lcGx1cy5vCiBvYmotJChDT05GSUdfSElEX1JPQ0NBVF9QWVJBKQkrPSBoaWQtcm9jY2F0LXB5cmEubwogb2JqLSQoQ09ORklHX0hJRF9TQU1TVU5HKQkrPSBoaWQtc2Ftc3VuZy5vCiBvYmotJChDT05GSUdfSElEX1NNQVJUSk9ZUExVUykJKz0gaGlkLXNqb3kubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLTNtLXBjdC5jIGIvZHJpdmVycy9oaWQvaGlkLTNtLXBjdC5jCmluZGV4IDRmYjdjNzUuLjUyNDNhZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC0zbS1wY3QuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtM20tcGN0LmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCiAJbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW1tX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1kKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSAzTSBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIDNNIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIG1kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYyBiL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYwppbmRleCAxNjY2YzE2Li45MDJkMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWE0dGVjaC5jCkBAIC05Myw3ICs5Myw3IEBACiAKIAlhNCA9IGt6YWxsb2Moc2l6ZW9mKCphNCksIEdGUF9LRVJORUwpOwogCWlmIChhNCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlOwogCX0KQEAgLTEwNCwxMyArMTA0LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYyBiL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCmluZGV4IGVhZWNhNTYuLjYxYWE3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1hcHBsZS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTU5LDYgKzYxLDI3IEBACiAJdTggZmxhZ3M7CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiBtYWNib29rYWlyX2ZuX2tleXNbXSA9IHsKKwl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKKwl7IEtFWV9FTlRFUiwJS0VZX0lOU0VSVCB9LAorCXsgS0VZX0YxLAlLRVlfQlJJR0hUTkVTU0RPV04sIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YyLAlLRVlfQlJJR0hUTkVTU1VQLCAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YzLAlLRVlfU0NBTEUsICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y0LAlLRVlfREFTSEJPQVJELCAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y2LAlLRVlfUFJFVklPVVNTT05HLCAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y3LAlLRVlfUExBWVBBVVNFLCAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y4LAlLRVlfTkVYVFNPTkcsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0Y5LAlLRVlfTVVURSwgICAgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMCwJS0VZX1ZPTFVNRURPV04sICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTEsCUtFWV9WT0xVTUVVUCwgICAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjEyLAlLRVlfRUpFQ1RDRCwgICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX1VQLAlLRVlfUEFHRVVQIH0sCisJeyBLRVlfRE9XTiwJS0VZX1BBR0VET1dOIH0sCisJeyBLRVlfTEVGVCwJS0VZX0hPTUUgfSwKKwl7IEtFWV9SSUdIVCwJS0VZX0VORCB9LAorCXsgfQorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gYXBwbGVfZm5fa2V5c1tdID0gewogCXsgS0VZX0JBQ0tTUEFDRSwgS0VZX0RFTEVURSB9LAogCXsgS0VZX0VOVEVSLAlLRVlfSU5TRVJUIH0sCkBAIC0xNDYsNyArMTY5LDcgQEAKIAkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQogewogCXN0cnVjdCBhcHBsZV9zYyAqYXNjID0gaGlkX2dldF9kcnZkYXRhKGhpZCk7Ci0JY29uc3Qgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiAqdHJhbnM7CisJY29uc3Qgc3RydWN0IGFwcGxlX2tleV90cmFuc2xhdGlvbiAqdHJhbnMsICp0YWJsZTsKIAogCWlmICh1c2FnZS0+Y29kZSA9PSBLRVlfRk4pIHsKIAkJYXNjLT5mbl9vbiA9ICEhdmFsdWU7CkBAIC0xNTcsMTAgKzE4MCwxNiBAQAogCWlmIChmbm1vZGUpIHsKIAkJaW50IGRvX3RyYW5zbGF0ZTsKIAotCQl0cmFucyA9IGFwcGxlX2ZpbmRfdHJhbnNsYXRpb24oKGhpZC0+cHJvZHVjdCA8IDB4MjFkIHx8Ci0JCQkJCWhpZC0+cHJvZHVjdCA+PSAweDMwMCkgPwotCQkJCQlwb3dlcmJvb2tfZm5fa2V5cyA6IGFwcGxlX2ZuX2tleXMsCi0JCQkJCXVzYWdlLT5jb2RlKTsKKwkJaWYgKGhpZC0+cHJvZHVjdCA+PSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kgJiYKKwkJCQloaWQtPnByb2R1Y3QgPD0gVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKQorCQkJdGFibGUgPSBtYWNib29rYWlyX2ZuX2tleXM7CisJCWVsc2UgaWYgKGhpZC0+cHJvZHVjdCA8IDB4MjFkIHx8IGhpZC0+cHJvZHVjdCA+PSAweDMwMCkKKwkJCXRhYmxlID0gcG93ZXJib29rX2ZuX2tleXM7CisJCWVsc2UKKwkJCXRhYmxlID0gYXBwbGVfZm5fa2V5czsKKworCQl0cmFucyA9IGFwcGxlX2ZpbmRfdHJhbnNsYXRpb24gKHRhYmxlLCB1c2FnZS0+Y29kZSk7CisKIAkJaWYgKHRyYW5zKSB7CiAJCQlpZiAodGVzdF9iaXQodXNhZ2UtPmNvZGUsIGFzYy0+cHJlc3NlZF9mbikpCiAJCQkJZG9fdHJhbnNsYXRlID0gMTsKQEAgLTI1Myw4ICsyODIsOCBAQAogCiAJaWYgKChhc2MtPnF1aXJrcyAmIEFQUExFX1JERVNDX0pJUykgJiYgKnJzaXplID49IDYwICYmCiAJCQlyZGVzY1s1M10gPT0gMHg2NSAmJiByZGVzY1s1OV0gPT0gMHg2NSkgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIE1hY0Jvb2sgSklTIGtleWJvYXJkIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgTWFjQm9vayBKSVMga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s1M10gPSByZGVzY1s1OV0gPSAweGU3OwogCX0KIAlyZXR1cm4gcmRlc2M7CkBAIC0zMjQsNyArMzUzLDcgQEAKIAogCWFzYyA9IGt6YWxsb2Moc2l6ZW9mKCphc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYXNjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgYXBwbGUgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIGFwcGxlIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMzNCw3ICszNjMsNyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTM0NSw3ICszNzQsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNvbm5lY3RfbWFzayk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtNDQwLDYgKzQ2OSwxOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9JU09fS0VZQk9BUkQgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTKSwKIAkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfUkRFU0NfSklTIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX1JERVNDX0pJUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9SREVTQ19KSVMgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfQU5TSSksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX05VTUxPQ0tfRU1VTEFUSU9OIHwgQVBQTEVfSEFTX0ZOIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTyksCkBAIC00NzMsNyArNTE0LDcgQEAKIAogCXJldCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmFwcGxlX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBhcHBsZSBkcml2ZXJcbiIpOworCQlwcl9lcnIoImNhbid0IHJlZ2lzdGVyIGFwcGxlIGRyaXZlclxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKaW5kZXggZjQyZWUxNC4uZTViOTYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCkBAIC03MywxNCArNzMsMTQgQEAKIAlpbnQgZXJyb3I7CiAKIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5KHJlcG9ydF9saXN0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDQpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydDogJWRcbiIsIHJlcG9ydC0+bWF4ZmllbGQpOworCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0OiAlZFxuIiwgcmVwb3J0LT5tYXhmaWVsZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAJYXhmZi0+cmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF0gPSAweDAwOwogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgYXhmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBGZWVkYmFjayBmb3IgQUNSVVggZ2FtZSBjb250cm9sbGVycyBieSBTZXJnZWkgS29senVuPHgwckBkdi1saWZlLnJ1PlxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgRmVlZGJhY2sgZm9yIEFDUlVYIGdhbWUgY29udHJvbGxlcnMgYnkgU2VyZ2VpIEtvbHp1bjx4MHJAZHYtbGlmZS5ydT5cbiIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTExNCwxNyArMTE0LDE3IEBACiB7CiAJaW50IGVycm9yOwogCi0JZGV2X2RiZygmaGRldi0+ZGV2LCAiQUNSVVggSElEIGhhcmR3YXJlIHByb2JlLi4uIik7CisJZGV2X2RiZygmaGRldi0+ZGV2LCAiQUNSVVggSElEIGhhcmR3YXJlIHByb2JlLi4uXG4iKTsKIAogCWVycm9yID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJZXJyb3IgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCQkgKiBEbyBub3QgZmFpbCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gY29tcGxldGVseSBhcyBkZXZpY2UKIAkJICogbWF5IHN0aWxsIGJlIHBhcnRpYWxseSBvcGVyYWJsZSwganVzdCB3YXJuLgogCQkgKi8KLQkJZGV2X3dhcm4oJmhkZXYtPmRldiwKKwkJaGlkX3dhcm4oaGRldiwKIAkJCSAiRmFpbGVkIHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0LCBlcnJvcjogJWRcbiIsCiAJCQkgZXJyb3IpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYyBiL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYwppbmRleCA0Y2U3YWEzLi5hMWE3NjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWJlbGtpbi5jCkBAIC01NiwxNCArNTYsMTQgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgfAogCQkoKHF1aXJrcyAmIEJFTEtJTl9ISURERVYpID8gSElEX0NPTk5FQ1RfSElEREVWX0ZPUkNFIDogMCkpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jYW5kby5jIGIvZHJpdmVycy9oaWQvaGlkLWNhbmRvLmMKaW5kZXggNTkyNWJkYy4uMWVhMDY2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNhbmRvLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNhbmRvLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiAJdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2FuZG9fZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIENhbmRvIFRvdWNoIGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgQ2FuZG8gVG91Y2ggZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAloaWRfc2V0X2RydmRhdGEoaGRldiwgdGQpOwpAQCAtMjM2LDYgKzIzNiw4IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NBTkRPLAogCQkJVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0FORE8sCisJCQlVU0JfREVWSUNFX0lEX0NBTkRPX01VTFRJX1RPVUNIXzEwXzEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NBTkRPLAogCQkJVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xMV82KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywKIAkJVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xNV82KSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNoZXJyeS5jIGIvZHJpdmVycy9oaWQvaGlkLWNoZXJyeS5jCmluZGV4IGU4ODAwODYuLjg4OGVjZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMKQEAgLTMwLDggKzMwLDcgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlpZiAoKnJzaXplID49IDE3ICYmIHJkZXNjWzExXSA9PSAweDNjICYmIHJkZXNjWzEyXSA9PSAweDAyKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgQ2hlcnJ5IEN5bW90aW9uIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzExXSA9IHJkZXNjWzE2XSA9IDB4ZmY7CiAJCXJkZXNjWzEyXSA9IHJkZXNjWzE3XSA9IDB4MDM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggM2Y5NjczZC4uZDY3OGNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNTksNyArNjEsOCBAQAogCWlmIChyZXBvcnRfZW51bS0+cmVwb3J0X2lkX2hhc2hbaWRdKQogCQlyZXR1cm4gcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW2lkXTsKIAotCWlmICghKHJlcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcmVwb3J0KSwgR0ZQX0tFUk5FTCkpKQorCXJlcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcmVwb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXBvcnQpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGlkICE9IDApCkBAIC05MCw4ICs5MywxMSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoIShmaWVsZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfZmllbGQpICsgdXNhZ2VzICogc2l6ZW9mKHN0cnVjdCBoaWRfdXNhZ2UpCi0JCSsgdmFsdWVzICogc2l6ZW9mKHVuc2lnbmVkKSwgR0ZQX0tFUk5FTCkpKSByZXR1cm4gTlVMTDsKKwlmaWVsZCA9IGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgaGlkX2ZpZWxkKSArCisJCQkgdXNhZ2VzICogc2l6ZW9mKHN0cnVjdCBoaWRfdXNhZ2UpICsKKwkJCSB2YWx1ZXMgKiBzaXplb2YodW5zaWduZWQpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWVsZCkKKwkJcmV0dXJuIE5VTEw7CiAKIAlmaWVsZC0+aW5kZXggPSByZXBvcnQtPm1heGZpZWxkKys7CiAJcmVwb3J0LT5maWVsZFtmaWVsZC0+aW5kZXhdID0gZmllbGQ7CkBAIC0xNzIsMTAgKzE3OCwxNCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHN0cnVjdCBoaWRfcGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHR5cGUpCiB7CisJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2xsZWN0aW9uID0gcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb247CiAJaW50IG47Ci0JZm9yIChuID0gcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrX3B0ciAtIDE7IG4gPj0gMDsgbi0tKQotCQlpZiAocGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25bcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrW25dXS50eXBlID09IHR5cGUpCi0JCQlyZXR1cm4gcGFyc2VyLT5kZXZpY2UtPmNvbGxlY3Rpb25bcGFyc2VyLT5jb2xsZWN0aW9uX3N0YWNrW25dXS51c2FnZTsKKworCWZvciAobiA9IHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIgLSAxOyBuID49IDA7IG4tLSkgeworCQl1bnNpZ25lZCBpbmRleCA9IHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja1tuXTsKKwkJaWYgKGNvbGxlY3Rpb25baW5kZXhdLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBjb2xsZWN0aW9uW2luZGV4XS51c2FnZTsKKwl9CiAJcmV0dXJuIDA7IC8qIHdlIGtub3cgbm90aGluZyBhYm91dCB0aGlzIHVzYWdlIHR5cGUgKi8KIH0KIApAQCAtMjA5LDcgKzIxOSw4IEBACiAJdW5zaWduZWQgb2Zmc2V0OwogCWludCBpOwogCi0JaWYgKCEocmVwb3J0ID0gaGlkX3JlZ2lzdGVyX3JlcG9ydChwYXJzZXItPmRldmljZSwgcmVwb3J0X3R5cGUsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9pZCkpKSB7CisJcmVwb3J0ID0gaGlkX3JlZ2lzdGVyX3JlcG9ydChwYXJzZXItPmRldmljZSwgcmVwb3J0X3R5cGUsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9pZCk7CisJaWYgKCFyZXBvcnQpIHsKIAkJZGJnX2hpZCgiaGlkX3JlZ2lzdGVyX3JlcG9ydCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMjI3LDcgKzIzOCw4IEBACiAKIAl1c2FnZXMgPSBtYXhfdChpbnQsIHBhcnNlci0+bG9jYWwudXNhZ2VfaW5kZXgsIHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9jb3VudCk7CiAKLQlpZiAoKGZpZWxkID0gaGlkX3JlZ2lzdGVyX2ZpZWxkKHJlcG9ydCwgdXNhZ2VzLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQpKSA9PSBOVUxMKQorCWZpZWxkID0gaGlkX3JlZ2lzdGVyX2ZpZWxkKHJlcG9ydCwgdXNhZ2VzLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQpOworCWlmICghZmllbGQpCiAJCXJldHVybiAwOwogCiAJZmllbGQtPnBoeXNpY2FsID0gaGlkX2xvb2t1cF9jb2xsZWN0aW9uKHBhcnNlciwgSElEX0NPTExFQ1RJT05fUEhZU0lDQUwpOwpAQCAtNjUyLDEzICs2NjQsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2aWNlLT5yc2l6ZSA9IHNpemU7CiAKLQlwYXJzZXIgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3BhcnNlcikpOworCXBhcnNlciA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSk7CiAJaWYgKCFwYXJzZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQogCi0JbWVtc2V0KHBhcnNlciwgMCwgc2l6ZW9mKHN0cnVjdCBoaWRfcGFyc2VyKSk7CiAJcGFyc2VyLT5kZXZpY2UgPSBkZXZpY2U7CiAKIAllbmQgPSBzdGFydCArIHNpemU7CkBAIC02NzIsNyArNjgzLDggQEAKIAogCQlpZiAoZGlzcGF0Y2hfdHlwZVtpdGVtLnR5cGVdKHBhcnNlciwgJml0ZW0pKSB7CiAJCQlkYmdfaGlkKCJpdGVtICV1ICV1ICV1ICV1IHBhcnNpbmcgZmFpbGVkXG4iLAotCQkJCWl0ZW0uZm9ybWF0LCAodW5zaWduZWQpaXRlbS5zaXplLCAodW5zaWduZWQpaXRlbS50eXBlLCAodW5zaWduZWQpaXRlbS50YWcpOworCQkJCWl0ZW0uZm9ybWF0LCAodW5zaWduZWQpaXRlbS5zaXplLAorCQkJCSh1bnNpZ25lZClpdGVtLnR5cGUsICh1bnNpZ25lZClpdGVtLnRhZyk7CiAJCQlnb3RvIGVycjsKIAkJfQogCkBAIC03MzcsMTMgKzc0OSwxNCBAQAogICogU2VhcmNoIGxpbnV4LWtlcm5lbCBhbmQgbGludXgtdXNiLWRldmVsIGFyY2hpdmVzIGZvciAiaGlkLWNvcmUgZXh0cmFjdCIuCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gX191MzIgZXh0cmFjdChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbikKK3N0YXRpYyBfX3UzMiBleHRyYWN0KGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIF9fdTggKnJlcG9ydCwKKwkJICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG4pCiB7CiAJdTY0IHg7CiAKIAlpZiAobiA+IDMyKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJISUQ6IGV4dHJhY3QoKSBjYWxsZWQgd2l0aCBuICglZCkgPiAzMiEgKCVzKVxuIiwKLQkJCQluLCBjdXJyZW50LT5jb21tKTsKKwkJaGlkX3dhcm4oaGlkLCAiZXh0cmFjdCgpIGNhbGxlZCB3aXRoIG4gKCVkKSA+IDMyISAoJXMpXG4iLAorCQkJIG4sIGN1cnJlbnQtPmNvbW0pOwogCiAJcmVwb3J0ICs9IG9mZnNldCA+PiAzOyAgLyogYWRqdXN0IGJ5dGUgaW5kZXggKi8KIAlvZmZzZXQgJj0gNzsgICAgICAgICAgICAvKiBub3cgb25seSBuZWVkIGJpdCBvZmZzZXQgaW50byBvbmUgYnl0ZSAqLwpAQCAtNzYwLDE4ICs3NzMsMTkgQEAKICAqIGVuZGlhbm5lc3Mgb2YgcmVnaXN0ZXIgdmFsdWVzIGJ5IGNvbnNpZGVyaW5nIGEgcmVnaXN0ZXIKICAqIGEgImNhY2hlZCIgY29weSBvZiB0aGUgbGl0dGxlIGVuZGlhZCBiaXQgc3RyZWFtLgogICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGltcGxlbWVudChfX3U4ICpyZXBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbiwgX191MzIgdmFsdWUpCitzdGF0aWMgdm9pZCBpbXBsZW1lbnQoY29uc3Qgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCAqcmVwb3J0LAorCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG4sIF9fdTMyIHZhbHVlKQogewogCXU2NCB4OwogCXU2NCBtID0gKDFVTEwgPDwgbikgLSAxOwogCiAJaWYgKG4gPiAzMikKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSElEOiBpbXBsZW1lbnQoKSBjYWxsZWQgd2l0aCBuICglZCkgPiAzMiEgKCVzKVxuIiwKLQkJCQluLCBjdXJyZW50LT5jb21tKTsKKwkJaGlkX3dhcm4oaGlkLCAiJXMoKSBjYWxsZWQgd2l0aCBuICglZCkgPiAzMiEgKCVzKVxuIiwKKwkJCSBfX2Z1bmNfXywgbiwgY3VycmVudC0+Y29tbSk7CiAKIAlpZiAodmFsdWUgPiBtKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJISUQ6IGltcGxlbWVudCgpIGNhbGxlZCB3aXRoIHRvbyBsYXJnZSB2YWx1ZSAlZCEgKCVzKVxuIiwKLQkJCQl2YWx1ZSwgY3VycmVudC0+Y29tbSk7CisJCWhpZF93YXJuKGhpZCwgIiVzKCkgY2FsbGVkIHdpdGggdG9vIGxhcmdlIHZhbHVlICVkISAoJXMpXG4iLAorCQkJIF9fZnVuY19fLCB2YWx1ZSwgY3VycmVudC0+Y29tbSk7CiAJV0FSTl9PTih2YWx1ZSA+IG0pOwogCXZhbHVlICY9IG07CiAKQEAgLTc4OCw3ICs4MDIsNyBAQAogICogU2VhcmNoIGFuIGFycmF5IGZvciBhIHZhbHVlLgogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBzZWFyY2goX19zMzIgKmFycmF5LCBfX3MzMiB2YWx1ZSwgdW5zaWduZWQgbikKK3N0YXRpYyBpbnQgc2VhcmNoKF9fczMyICphcnJheSwgX19zMzIgdmFsdWUsIHVuc2lnbmVkIG4pCiB7CiAJd2hpbGUgKG4tLSkgewogCQlpZiAoKmFycmF5KysgPT0gdmFsdWUpCkBAIC04ODcsMTggKzkwMSwyMiBAQAogCV9fczMyIG1heCA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07CiAJX19zMzIgKnZhbHVlOwogCi0JaWYgKCEodmFsdWUgPSBrbWFsbG9jKHNpemVvZihfX3MzMikgKiBjb3VudCwgR0ZQX0FUT01JQykpKQorCXZhbHVlID0ga21hbGxvYyhzaXplb2YoX19zMzIpICogY291bnQsIEdGUF9BVE9NSUMpOworCWlmICghdmFsdWUpCiAJCXJldHVybjsKIAogCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CiAKLQkJCXZhbHVlW25dID0gbWluIDwgMCA/IHNudG8zMihleHRyYWN0KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKSwgc2l6ZSkgOgotCQkJCQkJICAgIGV4dHJhY3QoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUpOworCQl2YWx1ZVtuXSA9IG1pbiA8IDAgPworCQkJc250bzMyKGV4dHJhY3QoaGlkLCBkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSksCisJCQkgICAgICAgc2l6ZSkgOgorCQkJZXh0cmFjdChoaWQsIGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKTsKIAotCQkJaWYgKCEoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9WQVJJQUJMRSkgLyogSWdub3JlIHJlcG9ydCBpZiBFcnJvclJvbGxPdmVyICovCi0JCQkgICAgJiYgdmFsdWVbbl0gPj0gbWluICYmIHZhbHVlW25dIDw9IG1heAotCQkJICAgICYmIGZpZWxkLT51c2FnZVt2YWx1ZVtuXSAtIG1pbl0uaGlkID09IEhJRF9VUF9LRVlCT0FSRCArIDEpCi0JCQkJZ290byBleGl0OworCQkvKiBJZ25vcmUgcmVwb3J0IGlmIEVycm9yUm9sbE92ZXIgKi8KKwkJaWYgKCEoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9WQVJJQUJMRSkgJiYKKwkJICAgIHZhbHVlW25dID49IG1pbiAmJiB2YWx1ZVtuXSA8PSBtYXggJiYKKwkJICAgIGZpZWxkLT51c2FnZVt2YWx1ZVtuXSAtIG1pbl0uaGlkID09IEhJRF9VUF9LRVlCT0FSRCArIDEpCisJCQlnb3RvIGV4aXQ7CiAJfQogCiAJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKQEAgLTkyOCw3ICs5NDYsOCBAQAogICogT3V0cHV0IHRoZSBmaWVsZCBpbnRvIHRoZSByZXBvcnQuCiAgKi8KIAotc3RhdGljIHZvaWQgaGlkX291dHB1dF9maWVsZChzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgX191OCAqZGF0YSkKK3N0YXRpYyB2b2lkIGhpZF9vdXRwdXRfZmllbGQoY29uc3Qgc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwKKwkJCSAgICAgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEpCiB7CiAJdW5zaWduZWQgY291bnQgPSBmaWVsZC0+cmVwb3J0X2NvdW50OwogCXVuc2lnbmVkIG9mZnNldCA9IGZpZWxkLT5yZXBvcnRfb2Zmc2V0OwpAQCAtOTM3LDkgKzk1NiwxMSBAQAogCiAJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKIAkJaWYgKGZpZWxkLT5sb2dpY2FsX21pbmltdW0gPCAwKQkvKiBzaWduZWQgdmFsdWVzICovCi0JCQlpbXBsZW1lbnQoZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsIHMzMnRvbihmaWVsZC0+dmFsdWVbbl0sIHNpemUpKTsKKwkJCWltcGxlbWVudChoaWQsIGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLAorCQkJCSAgczMydG9uKGZpZWxkLT52YWx1ZVtuXSwgc2l6ZSkpOwogCQllbHNlCQkJCS8qIHVuc2lnbmVkIHZhbHVlcyAqLwotCQkJaW1wbGVtZW50KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLCBmaWVsZC0+dmFsdWVbbl0pOworCQkJaW1wbGVtZW50KGhpZCwgZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUsCisJCQkJICBmaWVsZC0+dmFsdWVbbl0pOwogCX0KIH0KIApAQCAtOTU2LDcgKzk3Nyw3IEBACiAKIAltZW1zZXQoZGF0YSwgMCwgKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEpOwogCWZvciAobiA9IDA7IG4gPCByZXBvcnQtPm1heGZpZWxkOyBuKyspCi0JCWhpZF9vdXRwdXRfZmllbGQocmVwb3J0LT5maWVsZFtuXSwgZGF0YSk7CisJCWhpZF9vdXRwdXRfZmllbGQocmVwb3J0LT5kZXZpY2UsIHJlcG9ydC0+ZmllbGRbbl0sIGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaGlkX291dHB1dF9yZXBvcnQpOwogCkBAIC0xMTY5LDggKzExOTAsNyBAQAogCQloZGV2LT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0hJRFJBVzsKIAogCWlmICghaGRldi0+Y2xhaW1lZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjbGFpbWVkIGJ5IG5laXRoZXIgaW5wdXQsIGhpZGRldiBub3IgIgotCQkJCSJoaWRyYXdcbiIpOworCQloaWRfZXJyKGhkZXYsICJjbGFpbWVkIGJ5IG5laXRoZXIgaW5wdXQsIGhpZGRldiBub3IgaGlkcmF3XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjEwLDkgKzEyMzAsOSBAQAogCQlidXMgPSAiPFVOS05PV04+IjsKIAl9CiAKLQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiJXM6ICVzIEhJRCB2JXguJTAyeCAlcyBbJXNdIG9uICVzXG4iLAotCQkJYnVmLCBidXMsIGhkZXYtPnZlcnNpb24gPj4gOCwgaGRldi0+dmVyc2lvbiAmIDB4ZmYsCi0JCQl0eXBlLCBoZGV2LT5uYW1lLCBoZGV2LT5waHlzKTsKKwloaWRfaW5mbyhoZGV2LCAiJXM6ICVzIEhJRCB2JXguJTAyeCAlcyBbJXNdIG9uICVzXG4iLAorCQkgYnVmLCBidXMsIGhkZXYtPnZlcnNpb24gPj4gOCwgaGRldi0+dmVyc2lvbiAmIDB4ZmYsCisJCSB0eXBlLCBoZGV2LT5uYW1lLCBoZGV2LT5waHlzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIzMCw3ICsxMjUwLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGhpZF9kaXNjb25uZWN0KTsKIAogLyogYSBsaXN0IG9mIGRldmljZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgc3BlY2lhbGl6ZWQgZHJpdmVyIG9uIEhJRCBidXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBoaWRfYmxhY2tsaXN0W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaGlkX2hhdmVfc3BlY2lhbF9kcml2ZXJbXSA9IHsKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfM00sIFVTQl9ERVZJQ0VfSURfM00xOTY4KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF8zTSwgVVNCX0RFVklDRV9JRF8zTTIyNTYpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0E0VEVDSCwgVVNCX0RFVklDRV9JRF9BNFRFQ0hfV0NQMzJQVSkgfSwKQEAgLTEyNzYsNiArMTI5NiwxMiBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9BTlNJKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9JU08pIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0pJUykgfSwKQEAgLTEyODYsMTcgKzEzMTIsMjEgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQkVMS0lOLCBVU0JfREVWSUNFX0lEX0ZMSVBfS1ZNKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CVEMsIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JUQywgVVNCX0RFVklDRV9JRF9CVENfRU1QUkVYX1JFTU9URV8yKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywgVVNCX0RFVklDRV9JRF9DQU5ET19QSVhDSVJfTVVMVElfVE9VQ0gpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NBTkRPLCBVU0JfREVWSUNFX0lEX0NBTkRPX01VTFRJX1RPVUNIKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xMF8xKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xMV82KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xNV82KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OX1NPTEFSKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NSRUFUSVZFTEFCUywgVVNCX0RFVklDRV9JRF9QUk9ESUtFWVNfUENNSURJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8zKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfTU9VU0UpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19UUlVFVE9VQ0gpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0RSQUdPTlJJU0UsIDB4MDAwNikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRFdBViwgVVNCX0RFVklDRV9JRF9EV0FWX0VHQUxBWF9NVUxUSVRPVUNIKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9EV0FWLCBVU0JfREVWSUNFX0lEX0RXQVZfRUdBTEFYX01VTFRJVE9VQ0gxKSB9LApAQCAtMTMwNCwxNCArMTMzNCwxNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9EV0FWLCBVU0JfREVWSUNFX0lEX0RXQVZfRUdBTEFYX01VTFRJVE9VQ0gzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9EV0FWLCBVU0JfREVWSUNFX0lEX0RXQVZfRUdBTEFYX01VTFRJVE9VQ0g0KSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FTEVDT00sIFVTQl9ERVZJQ0VfSURfRUxFQ09NX0JNMDg0KSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FTVMsIFVTQl9ERVZJQ0VfSURfRU1TX1RSSU9fTElOS0VSX1BMVVNfSUkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VaS0VZLCBVU0JfREVWSUNFX0lEX0JUQ184MTkzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HQU1FUk9OLCBVU0JfREVWSUNFX0lEX0dBTUVST05fRFVBTF9QU1hfQURBUFRPUikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0FNRVJPTiwgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUENTX0FEQVBUT1IpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIFVTQl9ERVZJQ0VfSURfR0VORVJBTF9UT1VDSF9XSU43X1RXT0ZJTkdFUlMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dSRUVOQVNJQSwgMHgwMDAzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HUkVFTkFTSUEsIDB4MDAxMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HWVJBVElPTiwgVVNCX0RFVklDRV9JRF9HWVJBVElPTl9SRU1PVEVfMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR1lSQVRJT04sIFVTQl9ERVZJQ0VfSURfR1lSQVRJT05fUkVNT1RFXzMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0hBTlZPTiwgVVNCX0RFVklDRV9JRF9IQU5WT05fTVVMVElUT1VDSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS0VOU0lOR1RPTiwgVVNCX0RFVklDRV9JRF9LU19TTElNQkxBREUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfRVJHT181MjVWKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MQUJURUMsIFVTQl9ERVZJQ0VfSURfTEFCVEVDX1dJUkVMRVNTX0tFWUJPQVJEKSB9LApAQCAtMTM3Miw2ICsxNDA1LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUVVBTlRBLCBVU0JfREVWSUNFX0lEX1FVQU5UQV9PUFRJQ0FMX1RPVUNIKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9RVUFOVEEsIFVTQl9ERVZJQ0VfSURfUElYQVJUX0lNQUdJTkdfSU5DX09QVElDQUxfVE9VQ0hfU0NSRUVOKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ST0NDQVQsIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX0tPTkUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORVBMVVMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfUFlSQV9XSVJFRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX1dJUkVMRVNTX0tCRF9NT1VTRSkgfSwKQEAgLTEzOTMsNiArMTQyNyw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTkspIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQyLCBVU0JfREVWSUNFX0lEX1RPUFNFRUQyX1JGX0NPTUJPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UV0lOSEFOLCBVU0JfREVWSUNFX0lEX1RXSU5IQU5fSVJfUkVNT1RFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UVVJCT1gsIFVTQl9ERVZJQ0VfSURfVFVSQk9YX1RPVUNIU0NSRUVOX01PU0FSVCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9QRjEyMDkpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A0MDMwVSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDU1NDBVKSB9LApAQCAtMTQ5OSw5ICsxNTM0LDkgQEAKIAlpZiAoIWhpZF9tYXRjaF9kZXZpY2UoaGRldiwgaGRydikpCiAJCXJldHVybiAwOwogCi0JLyogZ2VuZXJpYyB3YW50cyBhbGwgbm9uLWJsYWNrbGlzdGVkICovCisJLyogZ2VuZXJpYyB3YW50cyBhbGwgdGhhdCBkb24ndCBoYXZlIHNwZWNpYWxpemVkIGRyaXZlciAqLwogCWlmICghc3RybmNtcChoZHJ2LT5uYW1lLCAiZ2VuZXJpYy0iLCA4KSkKLQkJcmV0dXJuICFoaWRfbWF0Y2hfaWQoaGRldiwgaGlkX2JsYWNrbGlzdCk7CisJCXJldHVybiAhaGlkX21hdGNoX2lkKGhkZXYsIGhpZF9oYXZlX3NwZWNpYWxfZHJpdmVyKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTYxMSw3ICsxNjQ2LDYgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VUVCwgVVNCX0RFVklDRV9JRF9UQzVVSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVRULCBVU0JfREVWSUNFX0lEX1RDNFVNKSB9LAotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDEpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDQpIH0sCkBAIC0xNzYxLDYgKzE3OTUsMTIgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfRk9VTlRBSU5fVFBfT05MWSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfR0VZU0VSMV9UUF9PTkxZKSB9LAogCXsgfQpAQCAtMTk1MiwxMiArMTk5MiwxMiBAQAogCWludCByZXQ7CiAKIAlpZiAoaGlkX2RlYnVnKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJISUQ6IGhpZF9kZWJ1ZyBpcyBub3cgdXNlZCBzb2xlbHkgZm9yIHBhcnNlciBhbmQgZHJpdmVyIGRlYnVnZ2luZy5cbiIKLQkJCQkiSElEOiBkZWJ1Z2ZzIGlzIG5vdyB1c2VkIGZvciBpbnNwZWN0aW5nIHRoZSBkZXZpY2UgKHJlcG9ydCBkZXNjcmlwdG9yLCByZXBvcnRzKVxuIik7CisJCXByX3dhcm4oImhpZF9kZWJ1ZyBpcyBub3cgdXNlZCBzb2xlbHkgZm9yIHBhcnNlciBhbmQgZHJpdmVyIGRlYnVnZ2luZy5cbiIKKwkJCSJkZWJ1Z2ZzIGlzIG5vdyB1c2VkIGZvciBpbnNwZWN0aW5nIHRoZSBkZXZpY2UgKHJlcG9ydCBkZXNjcmlwdG9yLCByZXBvcnRzKVxuIik7CiAKIAlyZXQgPSBidXNfcmVnaXN0ZXIoJmhpZF9idXNfdHlwZSk7CiAJaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIkhJRDogY2FuJ3QgcmVnaXN0ZXIgaGlkIGJ1c1xuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgaGlkIGJ1c1xuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKaW5kZXggNGNkMGUyMy4uMmYwYmU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCkBAIC0xMDcsMTMgKzEwNywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwppbmRleCA3NWM1ZTIzLi41NTUzODJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwpAQCAtMjYsNiArMjYsOCBAQAogICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM5Myw3ICszOTUsNyBAQAogCiAJYnVmID0gcmVzb2x2X3VzYWdlX3BhZ2UodXNhZ2UgPj4gMTYsIGYpOwogCWlmIChJU19FUlIoYnVmKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGFsbG9jYXRpbmcgSElEIGRlYnVnIGJ1ZmZlclxuIik7CisJCXByX2VycigiZXJyb3IgYWxsb2NhdGluZyBISUQgZGVidWcgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZHJmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWRyZmYuYwppbmRleCA5NjhiMDRmLi5hZmNmM2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZHJmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kcmZmLmMKQEAgLTk2LDE4ICs5NiwxOCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZmlyc3RfZW50cnkocmVwb3J0X2xpc3QsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNykgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMzMsOCArMTMzLDggQEAKIAlkcmZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs2XSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBkcmZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIEZlZWRiYWNrIGZvciBEcmFnb25SaXNlIEluYy4gZ2FtZSAiCi0JICAgICAgICJjb250cm9sbGVycyBieSBSaWNoYXJkIFdhbG1zbGV5IDxyaWNod2FsbUBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBGZWVkYmFjayBmb3IgRHJhZ29uUmlzZSBJbmMuICIKKwkJICJnYW1lIGNvbnRyb2xsZXJzIGJ5IFJpY2hhcmQgV2FsbXNsZXkgPHJpY2h3YWxtQGdtYWlsLmNvbT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTMsMTMgKzE1MywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZWdhbGF4LmMgYi9kcml2ZXJzL2hpZC9oaWQtZWdhbGF4LmMKaW5kZXggOGZiZmYyMy4uMDNiZWUxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWVnYWxheC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lZ2FsYXguYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIAl0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZ2FsYXhfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIGVHYWxheCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIGVHYWxheCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCB0ZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMgYi9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMKaW5kZXggNmUzMWYzMC4uNzlkMGM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWVsZWNvbS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lbGVjb20uYwpAQCAtMjQsOCArMjQsNyBAQAogCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCWlmICgqcnNpemUgPj0gNDggJiYgcmRlc2NbNDZdID09IDB4MDUgJiYgcmRlc2NbNDddID09IDB4MGMpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkZpeGluZyB1cCBFbGVjb20gQk0wODQgIgotCQkJCSJyZXBvcnQgZGVzY3JpcHRvci5cbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIEVsZWNvbSBCTTA4NCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzQ3XSA9IDB4MDA7CiAJfQogICAgIHJldHVybiByZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4NzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1lbXNmZi5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogIEZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIEVNUyBUcmlvIExpbmtlciBQbHVzIElJCisgKgorICogIENvcHlyaWdodCAoYykgMjAxMCBJZ25heiBGb3JzdGVyIDxpZ25hei5mb3JzdGVyQGdteC5kZT4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaGlkLWlkcy5oIgorI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKKworc3RydWN0IGVtc2ZmX2RldmljZSB7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKK307CisKK3N0YXRpYyBpbnQgZW1zZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsCisJCQkgc3RydWN0IGZmX2VmZmVjdCAqZWZmZWN0KQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBlbXNmZl9kZXZpY2UgKmVtc2ZmID0gZGF0YTsKKwlpbnQgd2Vhaywgc3Ryb25nOworCisJd2VhayA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7CisJc3Ryb25nID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCisJZGJnX2hpZCgiY2FsbGVkIHdpdGggMHglMDR4IDB4JTA0eFxuIiwgc3Ryb25nLCB3ZWFrKTsKKworCXdlYWsgPSB3ZWFrICogMHhmZiAvIDB4ZmZmZjsKKwlzdHJvbmcgPSBzdHJvbmcgKiAweGZmIC8gMHhmZmZmOworCisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzFdID0gd2VhazsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMl0gPSBzdHJvbmc7CisKKwlkYmdfaGlkKCJydW5uaW5nIHdpdGggMHglMDJ4IDB4JTAyeFxuIiwgc3Ryb25nLCB3ZWFrKTsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGVtc2ZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtc2ZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZW1zZmZfZGV2aWNlICplbXNmZjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gbGlzdF9maXJzdF9lbnRyeSgmaGlkLT5pbnB1dHMsCisJCQkJCQlzdHJ1Y3QgaGlkX2lucHV0LCBsaXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfbGlzdCA9CisJCQkmaGlkLT5yZXBvcnRfZW51bVtISURfT1VUUFVUX1JFUE9SVF0ucmVwb3J0X2xpc3Q7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWludCBlcnJvcjsKKworCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgeworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVwb3J0ID0gbGlzdF9maXJzdF9lbnRyeShyZXBvcnRfbGlzdCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOworCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgeworCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDcpIHsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllbXNmZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXNmZl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVtc2ZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNldF9iaXQoRkZfUlVNQkxFLCBkZXYtPmZmYml0KTsKKworCWVycm9yID0gaW5wdXRfZmZfY3JlYXRlX21lbWxlc3MoZGV2LCBlbXNmZiwgZW1zZmZfcGxheSk7CisJaWYgKGVycm9yKSB7CisJCWtmcmVlKGVtc2ZmKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVtc2ZmLT5yZXBvcnQgPSByZXBvcnQ7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMTsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSAweDAwOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzNdID0gMHgwMDsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNF0gPSAweDAwOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs1XSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzZdID0gMHgwMDsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGVtc2ZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKKworCWhpZF9pbmZvKGhpZCwgImZvcmNlIGZlZWRiYWNrIGZvciBFTVMgYmFzZWQgZGV2aWNlcyBieSBJZ25heiBGb3JzdGVyIDxpZ25hei5mb3JzdGVyQGdteC5kZT5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1zX3Byb2JlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKKwlpZiAocmV0KSB7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWVtc2ZmX2luaXQoaGRldik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgZW1zX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRU1TLCAweDExOCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgZW1zX2RldmljZXMpOworCitzdGF0aWMgc3RydWN0IGhpZF9kcml2ZXIgZW1zX2RyaXZlciA9IHsKKwkubmFtZSA9ICJoa2VtcyIsCisJLmlkX3RhYmxlID0gZW1zX2RldmljZXMsCisJLnByb2JlID0gZW1zX3Byb2JlLAorfTsKKworc3RhdGljIGludCBlbXNfaW5pdCh2b2lkKQoreworCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZlbXNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgZW1zX2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtc19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChlbXNfaW5pdCk7Cittb2R1bGVfZXhpdChlbXNfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jCmluZGV4IDg4ZGZjZjQuLjI3OWJhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWdhZmYuYwpAQCAtODcsNyArODcsNyBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtOTUsMTIgKzk1LDEyIEBACiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9wdHIsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNikgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjgsOCArMTI4LDcgQEAKIAogCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZ2FmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBGZWVkYmFjayBmb3IgR3JlZW5Bc2lhIDB4MTIiCi0JICAgICAgICIgZGV2aWNlcyBieSBMdWthc3ogTHVib2phbnNraSA8bHVrYXN6QGx1Ym9qYW5za2kuaW5mbz5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIEZlZWRiYWNrIGZvciBHcmVlbkFzaWEgMHgxMiBkZXZpY2VzIGJ5IEx1a2FzeiBMdWJvamFuc2tpIDxsdWthc3pAbHVib2phbnNraS5pbmZvPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0OCwxMyArMTQ3LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCA4ZTExYWY4Li45MmEwZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC05Nyw2ICs5NywxMiBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0FOU0kJMHgwMjM2CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPCTB4MDIzNwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUwkweDAyMzgKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJCTB4MDIzZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTwkweDAyNDAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMJMHgwMjQxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kJMHgwMjQyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTwkweDAyNDMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTCTB4MDI0NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kgIDB4MDIzOQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0lTTyAgIDB4MDIzYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0pJUyAgIDB4MDIzYgpAQCAtMTM0LDcgKzE0MCw5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEVfMgkweDU1NzcKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NBTkRPCQkweDIwODcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQU5ET19QSVhDSVJfTVVMVElfVE9VQ0ggMHgwNzAzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FORE9fTVVMVElfVE9VQ0gJMHgwYTAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FORE9fTVVMVElfVE9VQ0hfMTBfMSAweDBhMDIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQU5ET19NVUxUSV9UT1VDSF8xMV82IDB4MGIwMwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NBTkRPX01VTFRJX1RPVUNIXzE1XzYgMHgwZjAxCiAKQEAgLTE1Niw2ICsxNjQsNyBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NISUNPTlkJCTB4MDRmMgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFECTB4MDQxOAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNPTllfTVVMVElfVE9VQ0gJMHhiMTlkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9XSVJFTEVTUwkweDA2MTgKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0NJREMJCTB4MTY3NwogCkBAIC0xNzksNiArMTg4LDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMQkweGRlNjEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMgkweGRlNjQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMwkweGJjYTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX1RSVUVUT1VDSAkweGMwMDEKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFQUxFWFRSRUFNRQkweDEwYzUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ERUFMRVhUUkVBTUVfUkFESU9fU0k0NzAxCTB4ODE5YQpAQCAtMjA4LDYgKzIxOCw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfRUxPCQkweDA0RTcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwCTB4MDAyMAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfRU1TCQkweDIwMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTVNfVFJJT19MSU5LRVJfUExVU19JSSAweDAxMTgKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZCTB4MGQ3ZgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1IDB4MDEwMAogCkBAIC0yMjYsNiArMjM5LDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUENTX0FEQVBUT1IJMHgwMDAyCiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNICTB4MGRmYworI2RlZmluZSBVU0JfREVWSUNFX0lEX0dFTkVSQUxfVE9VQ0hfV0lON19UV09GSU5HRVJTIDB4MDAwMQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfR0xBQgkJMHgwNmMyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzAJMHgwMDM4CkBAIC0zMDgsNiArMzIyLDkgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9IQU5XQU5HX1RBQkxFVF9GSVJTVAkweDUwMDAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9IQU5XQU5HX1RBQkxFVF9MQVNUCTB4OGZmZgogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfSEFOVk9OCQkweDIwYjMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9IQU5WT05fTVVMVElUT1VDSAkweDBhMTgKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0hBUFAJCTB4MDc4YgogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHQ0lfRFJJVklORwkweDAwMTAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9VR0NJX0ZMWUlORwkweDAwMjAKQEAgLTQ4MCw2ICs0OTcsNyBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUk9DQ0FUCQkweDFlN2QKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORQkweDJjZWQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORVBMVVMJMHgyZDUxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX1BZUkFfV0lSRUQJMHgyYzI0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX1BZUkFfV0lSRUxFU1MJMHgyY2Y2CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKaW5kZXggZDhkMzcyYi4uN2Y1NTJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKQEAgLTI5MCw2ICsyOTAsMTQgQEAKIAkJZ290byBpZ25vcmU7CiAJfQogCisJaWYgKGZpZWxkLT5yZXBvcnRfdHlwZSA9PSBISURfRkVBVFVSRV9SRVBPUlQpIHsKKwkJaWYgKGRldmljZS0+ZHJpdmVyLT5mZWF0dXJlX21hcHBpbmcpIHsKKwkJCWRldmljZS0+ZHJpdmVyLT5mZWF0dXJlX21hcHBpbmcoZGV2aWNlLCBoaWRpbnB1dCwgZmllbGQsCisJCQkJdXNhZ2UpOworCQl9CisJCWdvdG8gaWdub3JlOworCX0KKwogCWlmIChkZXZpY2UtPmRyaXZlci0+aW5wdXRfbWFwcGluZykgewogCQlpbnQgcmV0ID0gZGV2aWNlLT5kcml2ZXItPmlucHV0X21hcHBpbmcoZGV2aWNlLCBoaWRpbnB1dCwgZmllbGQsCiAJCQkJdXNhZ2UsICZiaXQsICZtYXgpOwpAQCAtMzE5LDIxICszMjcsMjEgQEAKIAogCQlzd2l0Y2ggKGZpZWxkLT5hcHBsaWNhdGlvbikgewogCQljYXNlIEhJRF9HRF9NT1VTRToKLQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gMHgxMTA7IGJyZWFrOworCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSBCVE5fTU9VU0U7IGJyZWFrOwogCQljYXNlIEhJRF9HRF9KT1lTVElDSzoKIAkJCQlpZiAoY29kZSA8PSAweGYpCiAJCQkJCWNvZGUgKz0gQlROX0pPWVNUSUNLOwogCQkJCWVsc2UKIAkJCQkJY29kZSArPSBCVE5fVFJJR0dFUl9IQVBQWTsKIAkJCQlicmVhazsKLQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gMHgxMzA7IGJyZWFrOworCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSBCVE5fR0FNRVBBRDsgYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlzd2l0Y2ggKGZpZWxkLT5waHlzaWNhbCkgewogCQkJY2FzZSBISURfR0RfTU9VU0U6Ci0JCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7Ci0JCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSAweDEyMDsgYnJlYWs7Ci0JCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgICAgY29kZSArPSAweDEwMDsKKwkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IEJUTl9NT1VTRTsgYnJlYWs7CisJCQljYXNlIEhJRF9HRF9KT1lTVElDSzogY29kZSArPSBCVE5fSk9ZU1RJQ0s7IGJyZWFrOworCQkJY2FzZSBISURfR0RfR0FNRVBBRDogIGNvZGUgKz0gQlROX0dBTUVQQUQ7IGJyZWFrOworCQkJZGVmYXVsdDogICAgICAgICAgICAgIGNvZGUgKz0gQlROX01JU0M7CiAJCQl9CiAJCX0KIApAQCAtODE3LDE0ICs4MjUsMTQgQEAKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBoaWQtPmxsX2RyaXZlci0+b3BlbihoaWQpOworCXJldHVybiBoaWRfaHdfb3BlbihoaWQpOwogfQogCiBzdGF0aWMgdm9pZCBoaWRpbnB1dF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAKLQloaWQtPmxsX2RyaXZlci0+Y2xvc2UoaGlkKTsKKwloaWRfaHdfY2xvc2UoaGlkKTsKIH0KIAogLyoKQEAgLTgzOSw3ICs4NDcsNiBAQAogCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0ID0gTlVMTDsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAJaW50IGksIGosIGs7Ci0JaW50IG1heF9yZXBvcnRfdHlwZSA9IEhJRF9PVVRQVVRfUkVQT1JUOwogCiAJSU5JVF9MSVNUX0hFQUQoJmhpZC0+aW5wdXRzKTsKIApAQCAtODU2LDEwICs4NjMsMTEgQEAKIAkJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfU0tJUF9PVVRQVVRfUkVQT1JUUykKLQkJbWF4X3JlcG9ydF90eXBlID0gSElEX0lOUFVUX1JFUE9SVDsKKwlmb3IgKGsgPSBISURfSU5QVVRfUkVQT1JUOyBrIDw9IEhJRF9GRUFUVVJFX1JFUE9SVDsgaysrKSB7CisJCWlmIChrID09IEhJRF9PVVRQVVRfUkVQT1JUICYmCisJCQloaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19TS0lQX09VVFBVVF9SRVBPUlRTKQorCQkJY29udGludWU7CiAKLQlmb3IgKGsgPSBISURfSU5QVVRfUkVQT1JUOyBrIDw9IG1heF9yZXBvcnRfdHlwZTsgaysrKQogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJmhpZC0+cmVwb3J0X2VudW1ba10ucmVwb3J0X2xpc3QsIGxpc3QpIHsKIAogCQkJaWYgKCFyZXBvcnQtPm1heGZpZWxkKQpAQCAtODcxLDcgKzg3OSw3IEBACiAJCQkJaWYgKCFoaWRpbnB1dCB8fCAhaW5wdXRfZGV2KSB7CiAJCQkJCWtmcmVlKGhpZGlucHV0KTsKIAkJCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJCQkJZXJyX2hpZCgiT3V0IG9mIG1lbW9yeSBkdXJpbmcgaGlkIGlucHV0IHByb2JlIik7CisJCQkJCWhpZF9lcnIoaGlkLCAiT3V0IG9mIG1lbW9yeSBkdXJpbmcgaGlkIGlucHV0IHByb2JlXG4iKTsKIAkJCQkJZ290byBvdXRfdW53aW5kOwogCQkJCX0KIApAQCAtOTEyLDYgKzkyMCw3IEBACiAJCQkJaGlkaW5wdXQgPSBOVUxMOwogCQkJfQogCQl9CisJfQogCiAJaWYgKGhpZGlucHV0ICYmIGlucHV0X3JlZ2lzdGVyX2RldmljZShoaWRpbnB1dC0+aW5wdXQpKQogCQlnb3RvIG91dF9jbGVhbnVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWt5ZS5jIGIvZHJpdmVycy9oaWQvaGlkLWt5ZS5jCmluZGV4IDgxNzI0N2UuLmYyYmE5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1reWUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQta3llLmMKQEAgLTMyLDggKzMyLDggQEAKIAkJcmRlc2NbNjVdID09IDB4MjkgJiYgcmRlc2NbNjZdID09IDB4MGYgJiYKIAkJcmRlc2NbNzFdID09IDB4NzUgJiYgcmRlc2NbNzJdID09IDB4MDggJiYKIAkJcmRlc2NbNzNdID09IDB4OTUgJiYgcmRlc2NbNzRdID09IDB4MDEpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBLeWUvR2VuaXVzIEVyZ28gTW91c2UgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsCisJCQkgImZpeGluZyB1cCBLeWUvR2VuaXVzIEVyZ28gTW91c2UgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s2Ml0gPSAweDA5OwogCQlyZGVzY1s2NF0gPSAweDA0OwogCQlyZGVzY1s2Nl0gPSAweDA3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCBiNjI5ZmJhLi5hZWY0MTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtNTMsMjMgKzUzLDIyIEBACiAKIAlpZiAoKHF1aXJrcyAmIExHX1JERVNDKSAmJiAqcnNpemUgPj0gOTAgJiYgcmRlc2NbODNdID09IDB4MjYgJiYKIAkJCXJkZXNjWzg0XSA9PSAweDhjICYmIHJkZXNjWzg1XSA9PSAweDAyKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgTG9naXRlY2gga2V5Ym9hcmQgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsCisJCQkgImZpeGluZyB1cCBMb2dpdGVjaCBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzg0XSA9IHJkZXNjWzg5XSA9IDB4NGQ7CiAJCXJkZXNjWzg1XSA9IHJkZXNjWzkwXSA9IDB4MTA7CiAJfQogCWlmICgocXVpcmtzICYgTEdfUkRFU0NfUkVMX0FCUykgJiYgKnJzaXplID49IDUwICYmCiAJCQlyZGVzY1szMl0gPT0gMHg4MSAmJiByZGVzY1szM10gPT0gMHgwNiAmJgogCQkJcmRlc2NbNDldID09IDB4ODEgJiYgcmRlc2NbNTBdID09IDB4MDYpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCByZWwvYWJzIGluIExvZ2l0ZWNoICIKLQkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgcmVsL2FicyBpbiBMb2dpdGVjaCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzMzXSA9IHJkZXNjWzUwXSA9IDB4MDI7CiAJfQogCWlmICgocXVpcmtzICYgTEdfRkY0KSAmJiAqcnNpemUgPj0gMTAxICYmCiAJCQlyZGVzY1s0MV0gPT0gMHg5NSAmJiByZGVzY1s0Ml0gPT0gMHgwQiAmJgogCQkJcmRlc2NbNDddID09IDB4MDUgJiYgcmRlc2NbNDhdID09IDB4MDkpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBMb2dpdGVjaCBTcGVlZCBGb3JjZSBXaXJlbGVzcyAiCi0JCQkiYnV0dG9uIGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ1dHRvbiBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNDFdID0gMHgwNTsKIAkJcmRlc2NbNDJdID0gMHgwOTsKIAkJcmRlc2NbNDddID0gMHg5NTsKQEAgLTI4OCw3ICsyODcsNyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTI5Nyw3ICsyOTYsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNvbm5lY3RfbWFzayk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYwppbmRleCA0MjU4MjUzLi4zYzMxYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYwpAQCAtNzIsMTggKzcyLDE4IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm91dHB1dCByZXBvcnQgaXMgZW1wdHlcbiIpOworCQloaWRfZXJyKGhpZCwgIm91dHB1dCByZXBvcnQgaXMgZW1wdHlcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDcpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTEwLDggKzExMCw3IEBACiAKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFJ1bWJsZVBhZC9SdW1ibGVwYWQgMiBieSAiCi0JICAgICAgICJBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBSdW1ibGVQYWQvUnVtYmxlcGFkIDIgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGczZmYuYwppbmRleCA0MDAyODMyLi5mOTg2NDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGczZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGczZmYuYwpAQCAtMTQxLDIwICsxNDEsMjAgQEAKIAogCS8qIEZpbmQgdGhlIHJlcG9ydCB0byB1c2UgKi8KIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZXJyX2hpZCgiTm8gb3V0cHV0IHJlcG9ydCBmb3VuZCIpOworCQloaWRfZXJyKGhpZCwgIk5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogQ2hlY2sgdGhhdCB0aGUgcmVwb3J0IGxvb2tzIG9rICovCiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWlmICghcmVwb3J0KSB7Ci0JCWVycl9oaWQoIk5VTEwgb3V0cHV0IHJlcG9ydCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgb3V0cHV0IHJlcG9ydFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlmaWVsZCA9IHJlcG9ydC0+ZmllbGRbMF07CiAJaWYgKCFmaWVsZCkgewotCQllcnJfaGlkKCJOVUxMIGZpZWxkIik7CisJCWhpZF9lcnIoaGlkLCAiTlVMTCBmaWVsZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE2OSw4ICsxNjksNyBAQAogCWlmICh0ZXN0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KSkKIAkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGczZmZfc2V0X2F1dG9jZW50ZXI7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggRmxpZ2h0IFN5c3RlbSBHOTQwIGJ5ICIKLQkJCSJHYXJ5IFN0ZWluIDxMb3JkQ25pZGFyaWFuQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBGbGlnaHQgU3lzdGVtIEc5NDAgYnkgR2FyeSBTdGVpbiA8TG9yZENuaWRhcmlhbkBnbWFpbC5jb20+XG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwppbmRleCA3ZWVmNWEyLi5mYTU1MGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwpAQCAtMTAxLDIwICsxMDEsMjAgQEAKIAogCS8qIEZpbmQgdGhlIHJlcG9ydCB0byB1c2UgKi8KIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZXJyX2hpZCgiTm8gb3V0cHV0IHJlcG9ydCBmb3VuZCIpOworCQloaWRfZXJyKGhpZCwgIk5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogQ2hlY2sgdGhhdCB0aGUgcmVwb3J0IGxvb2tzIG9rICovCiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWlmICghcmVwb3J0KSB7Ci0JCWVycl9oaWQoIk5VTEwgb3V0cHV0IHJlcG9ydCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgb3V0cHV0IHJlcG9ydFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlmaWVsZCA9IHJlcG9ydC0+ZmllbGRbMF07CiAJaWYgKCFmaWVsZCkgewotCQllcnJfaGlkKCJOVUxMIGZpZWxkIik7CisJCWhpZF9lcnIoaGlkLCAiTlVMTCBmaWVsZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEyOSw4ICsxMjksNyBAQAogCWlmICh0ZXN0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KSkKIAkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGc0ZmZfc2V0X2F1dG9jZW50ZXI7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggU3BlZWQgRm9yY2UgV2lyZWxlc3MgYnkgIgotCQkJIlNpbW9uIFdvb2QgPHNpbW9uQG11bmdld2VsbC5vcmc+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggU3BlZWQgRm9yY2UgV2lyZWxlc3MgYnkgU2ltb24gV29vZCA8c2ltb25AbXVuZ2V3ZWxsLm9yZz5cbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGdmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnZmYuYwppbmRleCA2MTE0MmI3Li45MGQwZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGdmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZ2ZmLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CkBAIC0xNDYsNyArMTQ4LDcgQEAKIAogCS8qIEZpbmQgdGhlIHJlcG9ydCB0byB1c2UgKi8KIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZXJyX2hpZCgiTm8gb3V0cHV0IHJlcG9ydCBmb3VuZCIpOworCQloaWRfZXJyKGhpZCwgIk5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNTQsNyArMTU2LDcgQEAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOwogCWlmICghZmllbGQpIHsKLQkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgZmllbGRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNzYsNyArMTc4LDcgQEAKIAlpZiAoIHRlc3RfYml0KEZGX0FVVE9DRU5URVIsIGRldi0+ZmZiaXQpICkKIAkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGdmZl9zZXRfYXV0b2NlbnRlcjsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBmb3JjZSBmZWVkYmFjayBkZXZpY2VzIGJ5IEpvaGFubiBEZW5ldXggPGpvaGFubi5kZW5ldXhAaXQudXUuc2U+XG4iKTsKKwlwcl9pbmZvKCJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggZm9yY2UgZmVlZGJhY2sgZGV2aWNlcyBieSBKb2hhbm4gRGVuZXV4IDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMgYi9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCmluZGV4IGU2ZGMxNTEuLjY5OGU2NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYwpAQCAtMTIsNiArMTIsOCBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC00MzMsNiArNDM1LDExIEBACiAJaWYgKCFtc2MtPmlucHV0KQogCQltc2MtPmlucHV0ID0gaGktPmlucHV0OwogCisJLyogTWFnaWMgVHJhY2twYWQgZG9lcyBub3QgZ2l2ZSByZWxhdGl2ZSBkYXRhIGFmdGVyIHN3aXRjaGluZyB0byBNVCAqLworCWlmIChoaS0+aW5wdXQtPmlkLnByb2R1Y3QgPT0gVVNCX0RFVklDRV9JRF9BUFBMRV9NQUdJQ1RSQUNLUEFEICYmCisJICAgIGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpCisJCXJldHVybiAtMTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NDYsNyArNDUzLDcgQEAKIAogCW1zYyA9IGt6YWxsb2Moc2l6ZW9mKCptc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAobXNjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgbWFnaWNtb3VzZSBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgbWFnaWNtb3VzZSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00NTksMTMgKzQ2NiwxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAibWFnaWNtb3VzZSBoaWQgcGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAibWFnaWNtb3VzZSBoaWQgcGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJtYWdpY21vdXNlIGh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgIm1hZ2ljbW91c2UgaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTQ4Niw3ICs0OTMsNyBAQAogCX0KIAogCWlmICghcmVwb3J0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciB0b3VjaCByZXBvcnRcbiIpOworCQloaWRfZXJyKGhkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgdG91Y2ggcmVwb3J0XG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfc3RvcF9odzsKIAl9CkBAIC00OTUsOCArNTAyLDcgQEAKIAlyZXQgPSBoZGV2LT5oaWRfb3V0cHV0X3Jhd19yZXBvcnQoaGRldiwgZmVhdHVyZSwgc2l6ZW9mKGZlYXR1cmUpLAogCQkJSElEX0ZFQVRVUkVfUkVQT1JUKTsKIAlpZiAocmV0ICE9IHNpemVvZihmZWF0dXJlKSkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCB0b3VjaCBkYXRhICglZClcbiIsCi0JCQkJcmV0KTsKKwkJaGlkX2VycihoZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgdG91Y2ggZGF0YSAoJWQpXG4iLCByZXQpOwogCQlnb3RvIGVycl9zdG9wX2h3OwogCX0KIApAQCAtNTQwLDcgKzU0Niw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZtYWdpY21vdXNlX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBtYWdpY21vdXNlIGRyaXZlclxuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgbWFnaWNtb3VzZSBkcml2ZXJcbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYyBiL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYwppbmRleCBkYzYxOGMzLi4wZjZmYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCkBAIC00MCw4ICs0MCw3IEBACiAKIAlpZiAoKHF1aXJrcyAmIE1TX1JERVNDKSAmJiAqcnNpemUgPT0gNTcxICYmIHJkZXNjWzU1N10gPT0gMHgxOSAmJgogCQkJcmRlc2NbNTU5XSA9PSAweDI5KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgTWljcm9zb2Z0IFdpcmVsZXNzIFJlY2VpdmVyICIKLQkJCQkiTW9kZWwgMTAyOCByZXBvcnQgZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgTWljcm9zb2Z0IFdpcmVsZXNzIFJlY2VpdmVyIE1vZGVsIDEwMjggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s1NTddID0gMHgzNTsKIAkJcmRlc2NbNTU5XSA9IDB4NDU7CiAJfQpAQCAtMTU1LDE0ICsxNTQsMTQgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgfCAoKHF1aXJrcyAmIE1TX0hJRElOUFVUKSA/CiAJCQkJSElEX0NPTk5FQ1RfSElESU5QVVRfRk9SQ0UgOiAwKSk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMgYi9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYwppbmRleCBjOTVjMzFlLi5kZWRmNzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbW9udGVyZXkuYwpAQCAtMjYsOCArMjYsNyBAQAogCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCWlmICgqcnNpemUgPj0gMzAgJiYgcmRlc2NbMjldID09IDB4MDUgJiYgcmRlc2NbMzBdID09IDB4MDkpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBidXR0b24vY29uc3VtZXIgaW4gSElEIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIGJ1dHRvbi9jb25zdW1lciBpbiBISUQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1szMF0gPSAweDBjOwogCX0KIAlyZXR1cm4gcmRlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbW9zYXJ0LmMgYi9kcml2ZXJzL2hpZC9oaWQtbW9zYXJ0LmMKaW5kZXggYWM1NDIxZC4uYWVkN2ZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1vc2FydC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tb3NhcnQuYwpAQCAtOTAsNiArOTAsMTAgQEAKIAljYXNlIDB4ZmYwMDAwMDA6CiAJCS8qIGlnbm9yZSBISUQgZmVhdHVyZXMgKi8KIAkJcmV0dXJuIC0xOworCisJY2FzZSBISURfVVBfQlVUVE9OOgorCQkvKiBpZ25vcmUgYnV0dG9ucyAqLworCQlyZXR1cm4gLTE7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xOTksNyArMjAzLDcgQEAKIAogCXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1vc2FydF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgTW9zQXJ0IGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgTW9zQXJ0IGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJdGQtPnZhbGlkID0gZmFsc2U7CkBAIC0yMzAsNiArMjM0LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtb3NhcnRfcmVzZXRfcmVzdW1lKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBoaWRfcmVwb3J0X2VudW0gKnJlID0gaGRldi0+cmVwb3J0X2VudW0KKwkJCQkJCSsgSElEX0ZFQVRVUkVfUkVQT1JUOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyID0gcmUtPnJlcG9ydF9pZF9oYXNoWzddOworCisJci0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMjsKKwl1c2JoaWRfc3VibWl0X3JlcG9ydChoZGV2LCByLCBVU0JfRElSX09VVCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgbW9zYXJ0X3JlbW92ZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKIHsKIAloaWRfaHdfc3RvcChoZGV2KTsKQEAgLTI0MCw2ICsyNTcsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIG1vc2FydF9kZXZpY2VzW10gPSB7CiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FTVVMsIFVTQl9ERVZJQ0VfSURfQVNVU19UOTFNVCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVNVUywgVVNCX0RFVklDRV9JRF9BU1VTVEVLX01VTFRJVE9VQ0hfWUZPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UVVJCT1gsIFVTQl9ERVZJQ0VfSURfVFVSQk9YX1RPVUNIU0NSRUVOX01PU0FSVCkgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgbW9zYXJ0X2RldmljZXMpOwpAQCAtMjU4LDYgKzI3Niw5IEBACiAJLmlucHV0X21hcHBlZCA9IG1vc2FydF9pbnB1dF9tYXBwZWQsCiAJLnVzYWdlX3RhYmxlID0gbW9zYXJ0X2dyYWJiZWRfdXNhZ2VzLAogCS5ldmVudCA9IG1vc2FydF9ldmVudCwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzZXRfcmVzdW1lID0gbW9zYXJ0X3Jlc2V0X3Jlc3VtZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgbW9zYXJ0X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDMxODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogIEhJRCBkcml2ZXIgZm9yIG11bHRpdG91Y2ggcGFuZWxzCisgKgorICogIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFN0ZXBoYW5lIENoYXR0eSA8Y2hhdHR5QGVuYWMuZnI+CisgKiAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQmVuamFtaW4gVGlzc29pcmVzIDxiZW5qYW1pbi50aXNzb2lyZXNAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoYykgMjAxMC0yMDExIEVjb2xlIE5hdGlvbmFsZSBkZSBsJ0F2aWF0aW9uIENpdmlsZSwgRnJhbmNlCisgKgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KKyNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCisKKworTU9EVUxFX0FVVEhPUigiU3RlcGhhbmUgQ2hhdHR5IDxjaGF0dHlAZW5hYy5mcj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSElEIG11bHRpdG91Y2ggcGFuZWxzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisKKy8qIHF1aXJrcyB0byBjb250cm9sIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgTVRfUVVJUktfTk9UX1NFRU5fTUVBTlNfVVAJKDEgPDwgMCkKKyNkZWZpbmUgTVRfUVVJUktfU0xPVF9JU19DT05UQUNUSUQJKDEgPDwgMSkKKyNkZWZpbmUgTVRfUVVJUktfQ1lQUkVTUwkJKDEgPDwgMikKKyNkZWZpbmUgTVRfUVVJUktfU0xPVF9JU19DT05UQUNUTlVNQkVSCSgxIDw8IDMpCisjZGVmaW5lIE1UX1FVSVJLX1ZBTElEX0lTX0lOUkFOR0UJKDEgPDwgNCkKKyNkZWZpbmUgTVRfUVVJUktfVkFMSURfSVNfQ09ORklERU5DRQkoMSA8PCA1KQorCitzdHJ1Y3QgbXRfc2xvdCB7CisJX19zMzIgeCwgeSwgcCwgdywgaDsKKwlfX3MzMiBjb250YWN0aWQ7CS8qIHRoZSBkZXZpY2UgQ29udGFjdElEIGFzc2lnbmVkIHRvIHRoaXMgc2xvdCAqLworCWJvb2wgdG91Y2hfc3RhdGU7CS8qIGlzIHRoZSB0b3VjaCB2YWxpZD8gKi8KKwlib29sIHNlZW5faW5fdGhpc19mcmFtZTsvKiBoYXMgdGhpcyBzbG90IGJlZW4gdXBkYXRlZCAqLworfTsKKworc3RydWN0IG10X2RldmljZSB7CisJc3RydWN0IG10X3Nsb3QgY3VyZGF0YTsJLyogcGxhY2Vob2xkZXIgb2YgaW5jb21pbmcgZGF0YSAqLworCXN0cnVjdCBtdF9jbGFzcyAqbXRjbGFzczsJLyogb3VyIG10IGRldmljZSBjbGFzcyAqLworCXVuc2lnbmVkIGxhc3RfZmllbGRfaW5kZXg7CS8qIGxhc3QgZmllbGQgaW5kZXggb2YgdGhlIHJlcG9ydCAqLworCXVuc2lnbmVkIGxhc3Rfc2xvdF9maWVsZDsJLyogdGhlIGxhc3QgZmllbGQgb2YgYSBzbG90ICovCisJX19zOCBpbnB1dG1vZGU7CQkvKiBJbnB1dE1vZGUgSElEIGZlYXR1cmUsIC0xIGlmIG5vbi1leGlzdGVudCAqLworCV9fdTggbnVtX3JlY2VpdmVkOwkvKiBob3cgbWFueSBjb250YWN0cyB3ZSByZWNlaXZlZCAqLworCV9fdTggbnVtX2V4cGVjdGVkOwkvKiBleHBlY3RlZCBsYXN0IGNvbnRhY3QgaW5kZXggKi8KKwlib29sIGN1cnZhbGlkOwkJLyogaXMgdGhlIGN1cnJlbnQgY29udGFjdCB2YWxpZD8gKi8KKwlzdHJ1Y3QgbXRfc2xvdCBzbG90c1swXTsJLyogZmlyc3Qgc2xvdCAqLworfTsKKworc3RydWN0IG10X2NsYXNzIHsKKwlfX3MzMiBuYW1lOwkvKiBNVF9DTFMgKi8KKwlfX3MzMiBxdWlya3M7CisJX19zMzIgc25fbW92ZTsJLyogU2lnbmFsL25vaXNlIHJhdGlvIGZvciBtb3ZlIGV2ZW50cyAqLworCV9fczMyIHNuX3ByZXNzdXJlOwkvKiBTaWduYWwvbm9pc2UgcmF0aW8gZm9yIHByZXNzdXJlIGV2ZW50cyAqLworCV9fdTggbWF4Y29udGFjdHM7Cit9OworCisvKiBjbGFzc2VzIG9mIGRldmljZSBiZWhhdmlvciAqLworI2RlZmluZSBNVF9DTFNfREVGQVVMVAkxCisjZGVmaW5lIE1UX0NMU19EVUFMMQkyCisjZGVmaW5lIE1UX0NMU19EVUFMMgkzCisjZGVmaW5lIE1UX0NMU19DWVBSRVNTCTQKKworLyoKKyAqIHRoZXNlIGRldmljZS1kZXBlbmRlbnQgZnVuY3Rpb25zIGRldGVybWluZSB3aGF0IHNsb3QgY29ycmVzcG9uZHMKKyAqIHRvIGEgdmFsaWQgY29udGFjdCB0aGF0IHdhcyBqdXN0IHJlYWQuCisgKi8KKworc3RhdGljIGludCBjeXByZXNzX2NvbXB1dGVfc2xvdChzdHJ1Y3QgbXRfZGV2aWNlICp0ZCkKK3sKKwlpZiAodGQtPmN1cmRhdGEuY29udGFjdGlkICE9IDAgfHwgdGQtPm51bV9yZWNlaXZlZCA9PSAwKQorCQlyZXR1cm4gdGQtPmN1cmRhdGEuY29udGFjdGlkOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGZpbmRfc2xvdF9mcm9tX2NvbnRhY3RpZChzdHJ1Y3QgbXRfZGV2aWNlICp0ZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgdGQtPm10Y2xhc3MtPm1heGNvbnRhY3RzOyArK2kpIHsKKwkJaWYgKHRkLT5zbG90c1tpXS5jb250YWN0aWQgPT0gdGQtPmN1cmRhdGEuY29udGFjdGlkICYmCisJCQl0ZC0+c2xvdHNbaV0udG91Y2hfc3RhdGUpCisJCQlyZXR1cm4gaTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHRkLT5tdGNsYXNzLT5tYXhjb250YWN0czsgKytpKSB7CisJCWlmICghdGQtPnNsb3RzW2ldLnNlZW5faW5fdGhpc19mcmFtZSAmJgorCQkJIXRkLT5zbG90c1tpXS50b3VjaF9zdGF0ZSkKKwkJCXJldHVybiBpOworCX0KKwkvKiBzaG91bGQgbm90IG9jY3Vycy4gSWYgdGhpcyBoYXBwZW5zIHRoYXQgbWVhbnMKKwkgKiB0aGF0IHRoZSBkZXZpY2Ugc2VudCBtb3JlIHRvdWNoZXMgdGhhdCBpdCBzYXlzCisJICogaW4gdGhlIHJlcG9ydCBkZXNjcmlwdG9yLiBJdCBpcyBpZ25vcmVkIHRoZW4uICovCisJcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgbXRfY2xhc3MgbXRfY2xhc3Nlc1tdID0geworCXsgLm5hbWUgPSBNVF9DTFNfREVGQVVMVCwKKwkJLnF1aXJrcyA9IE1UX1FVSVJLX1ZBTElEX0lTX0lOUkFOR0UsCisJCS5tYXhjb250YWN0cyA9IDEwIH0sCisJeyAubmFtZSA9IE1UX0NMU19EVUFMMSwKKwkJLnF1aXJrcyA9IE1UX1FVSVJLX1ZBTElEX0lTX0lOUkFOR0UgfAorCQkJTVRfUVVJUktfU0xPVF9JU19DT05UQUNUSUQsCisJCS5tYXhjb250YWN0cyA9IDIgfSwKKwl7IC5uYW1lID0gTVRfQ0xTX0RVQUwyLAorCQkucXVpcmtzID0gTVRfUVVJUktfVkFMSURfSVNfSU5SQU5HRSB8CisJCQlNVF9RVUlSS19TTE9UX0lTX0NPTlRBQ1ROVU1CRVIsCisJCS5tYXhjb250YWN0cyA9IDIgfSwKKwl7IC5uYW1lID0gTVRfQ0xTX0NZUFJFU1MsCisJCS5xdWlya3MgPSBNVF9RVUlSS19OT1RfU0VFTl9NRUFOU19VUCB8CisJCQlNVF9RVUlSS19DWVBSRVNTLAorCQkubWF4Y29udGFjdHMgPSAxMCB9LAorCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBtdF9mZWF0dXJlX21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UpCit7CisJaWYgKHVzYWdlLT5oaWQgPT0gSElEX0RHX0lOUFVUTU9ERSkgeworCQlzdHJ1Y3QgbXRfZGV2aWNlICp0ZCA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwkJdGQtPmlucHV0bW9kZSA9IGZpZWxkLT5yZXBvcnQtPmlkOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2FicyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCwgdW5zaWduZWQgaW50IGNvZGUsCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBpbnQgc25yYXRpbykKK3sKKwlpbnQgZm1pbiA9IGZpZWxkLT5sb2dpY2FsX21pbmltdW07CisJaW50IGZtYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOworCWludCBmdXp6ID0gc25yYXRpbyA/IChmbWF4IC0gZm1pbikgLyBzbnJhdGlvIDogMDsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgY29kZSwgZm1pbiwgZm1heCwgZnV6eiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgbXRfaW5wdXRfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9pbnB1dCAqaGksCisJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwKKwkJdW5zaWduZWQgbG9uZyAqKmJpdCwgaW50ICptYXgpCit7CisJc3RydWN0IG10X2RldmljZSAqdGQgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IG10X2NsYXNzICpjbHMgPSB0ZC0+bXRjbGFzczsKKwlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgeworCisJY2FzZSBISURfVVBfR0VOREVTSzoKKwkJc3dpdGNoICh1c2FnZS0+aGlkKSB7CisJCWNhc2UgSElEX0dEX1g6CisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsCisJCQkJCUVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1gpOworCQkJc2V0X2FicyhoaS0+aW5wdXQsIEFCU19NVF9QT1NJVElPTl9YLCBmaWVsZCwKKwkJCQljbHMtPnNuX21vdmUpOworCQkJLyogdG91Y2hzY3JlZW4gZW11bGF0aW9uICovCisJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX1gsIGZpZWxkLCBjbHMtPnNuX21vdmUpOworCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBISURfR0RfWToKKwkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwKKwkJCQkJRVZfQUJTLCBBQlNfTVRfUE9TSVRJT05fWSk7CisJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX01UX1BPU0lUSU9OX1ksIGZpZWxkLAorCQkJCWNscy0+c25fbW92ZSk7CisJCQkvKiB0b3VjaHNjcmVlbiBlbXVsYXRpb24gKi8KKwkJCXNldF9hYnMoaGktPmlucHV0LCBBQlNfWSwgZmllbGQsIGNscy0+c25fbW92ZSk7CisJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBISURfVVBfRElHSVRJWkVSOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKKwkJY2FzZSBISURfREdfSU5SQU5HRToKKwkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSElEX0RHX0NPTkZJREVOQ0U6CisJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCXJldHVybiAxOworCQljYXNlIEhJRF9ER19USVBTV0lUQ0g6CisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsIEVWX0tFWSwgQlROX1RPVUNIKTsKKwkJCWlucHV0X3NldF9jYXBhYmlsaXR5KGhpLT5pbnB1dCwgRVZfS0VZLCBCVE5fVE9VQ0gpOworCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBISURfREdfQ09OVEFDVElEOgorCQkJaW5wdXRfbXRfaW5pdF9zbG90cyhoaS0+aW5wdXQsCisJCQkJCXRkLT5tdGNsYXNzLT5tYXhjb250YWN0cyk7CisJCQl0ZC0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCXJldHVybiAxOworCQljYXNlIEhJRF9ER19XSURUSDoKKwkJCWhpZF9tYXBfdXNhZ2UoaGksIHVzYWdlLCBiaXQsIG1heCwKKwkJCQkJRVZfQUJTLCBBQlNfTVRfVE9VQ0hfTUFKT1IpOworCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBISURfREdfSEVJR0hUOgorCQkJaGlkX21hcF91c2FnZShoaSwgdXNhZ2UsIGJpdCwgbWF4LAorCQkJCQlFVl9BQlMsIEFCU19NVF9UT1VDSF9NSU5PUik7CisJCQlmaWVsZC0+bG9naWNhbF9tYXhpbXVtID0gMTsKKwkJCWZpZWxkLT5sb2dpY2FsX21pbmltdW0gPSAwOworCQkJc2V0X2FicyhoaS0+aW5wdXQsIEFCU19NVF9PUklFTlRBVElPTiwgZmllbGQsIDApOworCQkJdGQtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBISURfREdfVElQUFJFU1NVUkU6CisJCQloaWRfbWFwX3VzYWdlKGhpLCB1c2FnZSwgYml0LCBtYXgsCisJCQkJCUVWX0FCUywgQUJTX01UX1BSRVNTVVJFKTsKKwkJCXNldF9hYnMoaGktPmlucHV0LCBBQlNfTVRfUFJFU1NVUkUsIGZpZWxkLAorCQkJCWNscy0+c25fcHJlc3N1cmUpOworCQkJLyogdG91Y2hzY3JlZW4gZW11bGF0aW9uICovCisJCQlzZXRfYWJzKGhpLT5pbnB1dCwgQUJTX1BSRVNTVVJFLCBmaWVsZCwKKwkJCQljbHMtPnNuX3ByZXNzdXJlKTsKKwkJCXRkLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSElEX0RHX0NPTlRBQ1RDT1VOVDoKKwkJCXRkLT5sYXN0X2ZpZWxkX2luZGV4ID0gZmllbGQtPnJlcG9ydC0+bWF4ZmllbGQgLSAxOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSElEX0RHX0NPTlRBQ1RNQVg6CisJCQkvKiB3ZSBkb24ndCBzZXQgdGQtPmxhc3Rfc2xvdF9maWVsZCBhcyBjb250YWN0Y291bnQgYW5kCisJCQkgKiBjb250YWN0IG1heCBhcmUgZ2xvYmFsIHRvIHRoZSByZXBvcnQgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBsZXQgaGlkLWlucHV0IGRlY2lkZSBmb3IgdGhlIG90aGVycyAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgMHhmZjAwMDAwMDoKKwkJLyogd2UgZG8gbm90IHdhbnQgdG8gbWFwIHRoZXNlOiBubyBpbnB1dC1vcmllbnRlZCBtZWFuaW5nICovCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdF9pbnB1dF9tYXBwZWQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCWlmICh1c2FnZS0+dHlwZSA9PSBFVl9LRVkgfHwgdXNhZ2UtPnR5cGUgPT0gRVZfQUJTKQorCQlzZXRfYml0KHVzYWdlLT50eXBlLCBoaS0+aW5wdXQtPmV2Yml0KTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBtdF9jb21wdXRlX3Nsb3Qoc3RydWN0IG10X2RldmljZSAqdGQpCit7CisJX19zMzIgcXVpcmtzID0gdGQtPm10Y2xhc3MtPnF1aXJrczsKKworCWlmIChxdWlya3MgJiBNVF9RVUlSS19TTE9UX0lTX0NPTlRBQ1RJRCkKKwkJcmV0dXJuIHRkLT5jdXJkYXRhLmNvbnRhY3RpZDsKKworCWlmIChxdWlya3MgJiBNVF9RVUlSS19DWVBSRVNTKQorCQlyZXR1cm4gY3lwcmVzc19jb21wdXRlX3Nsb3QodGQpOworCisJaWYgKHF1aXJrcyAmIE1UX1FVSVJLX1NMT1RfSVNfQ09OVEFDVE5VTUJFUikKKwkJcmV0dXJuIHRkLT5udW1fcmVjZWl2ZWQ7CisKKwlyZXR1cm4gZmluZF9zbG90X2Zyb21fY29udGFjdGlkKHRkKTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSB3aG9sZSBjb250YWN0IGhhcyBiZWVuIHByb2Nlc3NlZCwKKyAqIHNvIHRoYXQgaXQgY2FuIGFzc2lnbiBpdCB0byBhIHNsb3QgYW5kIHN0b3JlIHRoZSBkYXRhIHRoZXJlCisgKi8KK3N0YXRpYyB2b2lkIG10X2NvbXBsZXRlX3Nsb3Qoc3RydWN0IG10X2RldmljZSAqdGQpCit7CisJdGQtPmN1cmRhdGEuc2Vlbl9pbl90aGlzX2ZyYW1lID0gdHJ1ZTsKKwlpZiAodGQtPmN1cnZhbGlkKSB7CisJCWludCBzbG90bnVtID0gbXRfY29tcHV0ZV9zbG90KHRkKTsKKworCQlpZiAoc2xvdG51bSA+PSAwICYmIHNsb3RudW0gPCB0ZC0+bXRjbGFzcy0+bWF4Y29udGFjdHMpCisJCQl0ZC0+c2xvdHNbc2xvdG51bV0gPSB0ZC0+Y3VyZGF0YTsKKwl9CisJdGQtPm51bV9yZWNlaXZlZCsrOworfQorCisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgd2hvbGUgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQsCisgKiBzbyB0aGF0IGl0IGNhbiBkZWNpZGUgd2hhdCB0byBzZW5kIHRvIHRoZSBpbnB1dCBsYXllci4KKyAqLworc3RhdGljIHZvaWQgbXRfZW1pdF9ldmVudChzdHJ1Y3QgbXRfZGV2aWNlICp0ZCwgc3RydWN0IGlucHV0X2RldiAqaW5wdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGQtPm10Y2xhc3MtPm1heGNvbnRhY3RzOyArK2kpIHsKKwkJc3RydWN0IG10X3Nsb3QgKnMgPSAmKHRkLT5zbG90c1tpXSk7CisJCWlmICgodGQtPm10Y2xhc3MtPnF1aXJrcyAmIE1UX1FVSVJLX05PVF9TRUVOX01FQU5TX1VQKSAmJgorCQkJIXMtPnNlZW5faW5fdGhpc19mcmFtZSkgeworCQkJcy0+dG91Y2hfc3RhdGUgPSBmYWxzZTsKKwkJfQorCisJCWlucHV0X210X3Nsb3QoaW5wdXQsIGkpOworCQlpbnB1dF9tdF9yZXBvcnRfc2xvdF9zdGF0ZShpbnB1dCwgTVRfVE9PTF9GSU5HRVIsCisJCQlzLT50b3VjaF9zdGF0ZSk7CisJCWlmIChzLT50b3VjaF9zdGF0ZSkgeworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1gsIHMtPngpOworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1ksIHMtPnkpOworCQkJaW5wdXRfZXZlbnQoaW5wdXQsIEVWX0FCUywgQUJTX01UX1BSRVNTVVJFLCBzLT5wKTsKKwkJCWlucHV0X2V2ZW50KGlucHV0LCBFVl9BQlMsIEFCU19NVF9UT1VDSF9NQUpPUiwgcy0+dyk7CisJCQlpbnB1dF9ldmVudChpbnB1dCwgRVZfQUJTLCBBQlNfTVRfVE9VQ0hfTUlOT1IsIHMtPmgpOworCQl9CisJCXMtPnNlZW5faW5fdGhpc19mcmFtZSA9IGZhbHNlOworCisJfQorCisJaW5wdXRfbXRfcmVwb3J0X3BvaW50ZXJfZW11bGF0aW9uKGlucHV0LCB0cnVlKTsKKwlpbnB1dF9zeW5jKGlucHV0KTsKKwl0ZC0+bnVtX3JlY2VpdmVkID0gMDsKK30KKworCisKK3N0YXRpYyBpbnQgbXRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlKQoreworCXN0cnVjdCBtdF9kZXZpY2UgKnRkID0gaGlkX2dldF9kcnZkYXRhKGhpZCk7CisJX19zMzIgcXVpcmtzID0gdGQtPm10Y2xhc3MtPnF1aXJrczsKKworCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9JTlBVVCkgeworCQlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKKwkJY2FzZSBISURfREdfSU5SQU5HRToKKwkJCWlmIChxdWlya3MgJiBNVF9RVUlSS19WQUxJRF9JU19JTlJBTkdFKQorCQkJCXRkLT5jdXJ2YWxpZCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSElEX0RHX1RJUFNXSVRDSDoKKwkJCWlmIChxdWlya3MgJiBNVF9RVUlSS19OT1RfU0VFTl9NRUFOU19VUCkKKwkJCQl0ZC0+Y3VydmFsaWQgPSB2YWx1ZTsKKwkJCXRkLT5jdXJkYXRhLnRvdWNoX3N0YXRlID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBISURfREdfQ09ORklERU5DRToKKwkJCWlmIChxdWlya3MgJiBNVF9RVUlSS19WQUxJRF9JU19DT05GSURFTkNFKQorCQkJCXRkLT5jdXJ2YWxpZCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSElEX0RHX0NPTlRBQ1RJRDoKKwkJCXRkLT5jdXJkYXRhLmNvbnRhY3RpZCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSElEX0RHX1RJUFBSRVNTVVJFOgorCQkJdGQtPmN1cmRhdGEucCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWNhc2UgSElEX0dEX1g6CisJCQl0ZC0+Y3VyZGF0YS54ID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBISURfR0RfWToKKwkJCXRkLT5jdXJkYXRhLnkgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEhJRF9ER19XSURUSDoKKwkJCXRkLT5jdXJkYXRhLncgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIEhJRF9ER19IRUlHSFQ6CisJCQl0ZC0+Y3VyZGF0YS5oID0gdmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBISURfREdfQ09OVEFDVENPVU5UOgorCQkJLyoKKwkJCSAqIEluY2x1ZGVzIG11bHRpLXBhY2tldCBzdXBwb3J0IHdoZXJlIHN1YnNlcXVlbnQKKwkJCSAqIHBhY2tldHMgYXJlIHNlbnQgd2l0aCB6ZXJvIGNvbnRhY3Rjb3VudC4KKwkJCSAqLworCQkJaWYgKHZhbHVlKQorCQkJCXRkLT5udW1fZXhwZWN0ZWQgPSB2YWx1ZTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBmYWxsYmFjayB0byB0aGUgZ2VuZXJpYyBoaWRpbnB1dCBoYW5kbGluZyAqLworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodXNhZ2UtPmhpZCA9PSB0ZC0+bGFzdF9zbG90X2ZpZWxkKQorCQkJbXRfY29tcGxldGVfc2xvdCh0ZCk7CisKKwkJaWYgKGZpZWxkLT5pbmRleCA9PSB0ZC0+bGFzdF9maWVsZF9pbmRleAorCQkJJiYgdGQtPm51bV9yZWNlaXZlZCA+PSB0ZC0+bnVtX2V4cGVjdGVkKQorCQkJbXRfZW1pdF9ldmVudCh0ZCwgZmllbGQtPmhpZGlucHV0LT5pbnB1dCk7CisKKwl9CisKKwkvKiB3ZSBoYXZlIGhhbmRsZWQgdGhlIGhpZGlucHV0IHBhcnQsIG5vdyByZW1haW5zIGhpZGRldiAqLworCWlmIChoaWQtPmNsYWltZWQgJiBISURfQ0xBSU1FRF9ISURERVYgJiYgaGlkLT5oaWRkZXZfaGlkX2V2ZW50KQorCQloaWQtPmhpZGRldl9oaWRfZXZlbnQoaGlkLCBmaWVsZCwgdXNhZ2UsIHZhbHVlKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBtdF9zZXRfaW5wdXRfbW9kZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgbXRfZGV2aWNlICp0ZCA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZTsKKworCWlmICh0ZC0+aW5wdXRtb2RlIDwgMCkKKwkJcmV0dXJuOworCisJcmUgPSAmKGhkZXYtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0pOworCXIgPSByZS0+cmVwb3J0X2lkX2hhc2hbdGQtPmlucHV0bW9kZV07CisJaWYgKHIpIHsKKwkJci0+ZmllbGRbMF0tPnZhbHVlWzBdID0gMHgwMjsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGRldiwgciwgVVNCX0RJUl9PVVQpOworCX0KK30KKworc3RhdGljIGludCBtdF9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQsIGk7CisJc3RydWN0IG10X2RldmljZSAqdGQ7CisJc3RydWN0IG10X2NsYXNzICptdGNsYXNzID0gbXRfY2xhc3NlczsgLyogTVRfQ0xTX0RFRkFVTFQgKi8KKworCWZvciAoaSA9IDA7IG10X2NsYXNzZXNbaV0ubmFtZSA7IGkrKykgeworCQlpZiAoaWQtPmRyaXZlcl9kYXRhID09IG10X2NsYXNzZXNbaV0ubmFtZSkgeworCQkJbXRjbGFzcyA9ICYobXRfY2xhc3Nlc1tpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gY29ycmVjdGx5IHN1cHBvcnQgZGV2aWNlcworCSAqIHRoYXQgZW1pdCBldmVudHMgb3ZlciBzZXZlcmFsIEhJRCBtZXNzYWdlcy4KKwkgKi8KKwloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX05PX0lOUFVUX1NZTkM7CisKKwl0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdF9kZXZpY2UpICsKKwkJCQltdGNsYXNzLT5tYXhjb250YWN0cyAqIHNpemVvZihzdHJ1Y3QgbXRfc2xvdCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgbXVsdGl0b3VjaCBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRkLT5tdGNsYXNzID0gbXRjbGFzczsKKwl0ZC0+aW5wdXRtb2RlID0gLTE7CisJaGlkX3NldF9kcnZkYXRhKGhkZXYsIHRkKTsKKworCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwltdF9zZXRfaW5wdXRfbW9kZShoZGV2KTsKKworCXJldHVybiAwOworCitmYWlsOgorCWtmcmVlKHRkKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG10X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwltdF9zZXRfaW5wdXRfbW9kZShoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtdF9yZW1vdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IG10X2RldmljZSAqdGQgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisJaGlkX2h3X3N0b3AoaGRldik7CisJa2ZyZWUodGQpOworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIG10X2RldmljZXNbXSA9IHsKKworCS8qIEN5cHJlc3MgcGFuZWwgKi8KKwl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19DWVBSRVNTLAorCQlISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NZUFJFU1MsCisJCQlVU0JfREVWSUNFX0lEX0NZUFJFU1NfVFJVRVRPVUNIKSB9LAorCisJLyogR2VuZXJhbFRvdWNoIHBhbmVsICovCisJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfRFVBTDIsCisJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwKKwkJCVVTQl9ERVZJQ0VfSURfR0VORVJBTF9UT1VDSF9XSU43X1RXT0ZJTkdFUlMpIH0sCisKKwkvKiBQaXhDaXItYmFzZWQgcGFuZWxzICovCisJeyAuZHJpdmVyX2RhdGEgPSBNVF9DTFNfRFVBTDEsCisJCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSEFOVk9OLAorCQkJVVNCX0RFVklDRV9JRF9IQU5WT05fTVVMVElUT1VDSCkgfSwKKwl7IC5kcml2ZXJfZGF0YSA9IE1UX0NMU19EVUFMMSwKKwkJSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DQU5ETywKKwkJCVVTQl9ERVZJQ0VfSURfQ0FORE9fUElYQ0lSX01VTFRJX1RPVUNIKSB9LAorCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIG10X2RldmljZXMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhpZF91c2FnZV9pZCBtdF9ncmFiYmVkX3VzYWdlc1tdID0geworCXsgSElEX0FOWV9JRCwgSElEX0FOWV9JRCwgSElEX0FOWV9JRCB9LAorCXsgSElEX0FOWV9JRCAtIDEsIEhJRF9BTllfSUQgLSAxLCBISURfQU5ZX0lEIC0gMX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBtdF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaGlkLW11bHRpdG91Y2giLAorCS5pZF90YWJsZSA9IG10X2RldmljZXMsCisJLnByb2JlID0gbXRfcHJvYmUsCisJLnJlbW92ZSA9IG10X3JlbW92ZSwKKwkuaW5wdXRfbWFwcGluZyA9IG10X2lucHV0X21hcHBpbmcsCisJLmlucHV0X21hcHBlZCA9IG10X2lucHV0X21hcHBlZCwKKwkuZmVhdHVyZV9tYXBwaW5nID0gbXRfZmVhdHVyZV9tYXBwaW5nLAorCS51c2FnZV90YWJsZSA9IG10X2dyYWJiZWRfdXNhZ2VzLAorCS5ldmVudCA9IG10X2V2ZW50LAorI2lmZGVmIENPTkZJR19QTQorCS5yZXNldF9yZXN1bWUgPSBtdF9yZXNldF9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG10X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGlkX3JlZ2lzdGVyX2RyaXZlcigmbXRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG10X2V4aXQodm9pZCkKK3sKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJm10X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG10X2luaXQpOworbW9kdWxlX2V4aXQobXRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYyBiL2RyaXZlcnMvaGlkL2hpZC1udHJpZy5jCmluZGV4IDY5MTY5ZWYuLmJlYjQwMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1udHJpZy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1udHJpZy5jCkBAIC0xMzAsOCArMTMwLDcgQEAKIAlpZiAocmV0ID09IDgpIHsKIAkJcmV0ID0gbnRyaWdfdmVyc2lvbl9zdHJpbmcoJmRhdGFbMl0sIGJ1Zik7CiAKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwKLQkJCSAiRmlybXdhcmUgdmVyc2lvbjogJXMgKCUwMnglMDJ4ICUwMnglMDJ4KVxuIiwKKwkJaGlkX2luZm8oaGRldiwgIkZpcm13YXJlIHZlcnNpb246ICVzICglMDJ4JTAyeCAlMDJ4JTAyeClcbiIsCiAJCQkgYnVmLCBkYXRhWzJdLCBkYXRhWzNdLCBkYXRhWzRdLCBkYXRhWzVdKTsKIAl9CiAKQEAgLTgzMSw3ICs4MzAsNyBAQAogCiAJbmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnRyaWdfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghbmQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIE4tVHJpZyBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIE4tVHJpZyBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NTAsMTMgKzg0OSwxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMgYi9kcml2ZXJzL2hpZC9oaWQtb3J0ZWsuYwppbmRleCAyZTc5NzE2Li5lOTBlZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtb3J0ZWsuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtb3J0ZWsuYwpAQCAtMjMsOCArMjMsNyBAQAogCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCWlmICgqcnNpemUgPj0gNTYgJiYgcmRlc2NbNTRdID09IDB4MjUgJiYgcmRlc2NbNTVdID09IDB4MDEpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkZpeGluZyB1cCBPcnRlayBXS0ItMjAwMCAiCi0JCQkJInJlcG9ydCBkZXNjcmlwdG9yLlxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJGaXhpbmcgdXAgT3J0ZWsgV0tCLTIwMDAgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s1NV0gPSAweDkyOwogCX0KIAlyZXR1cm4gcmRlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYyBiL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jCmluZGV4IDMwOGQ2YWUuLmYxZWEzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wZXRhbHlueC5jCkBAIC0yOSw4ICsyOSw3IEBACiAJaWYgKCpyc2l6ZSA+PSA2MCAmJiByZGVzY1szOV0gPT0gMHgyYSAmJiByZGVzY1s0MF0gPT0gMHhmNSAmJgogCQkJcmRlc2NbNDFdID09IDB4MDAgJiYgcmRlc2NbNTldID09IDB4MjYgJiYKIAkJCXJkZXNjWzYwXSA9PSAweGY5ICYmIHJkZXNjWzYxXSA9PSAweDAwKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgUGV0YWx5bnggTWF4dGVyIFJlbW90ZSByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBQZXRhbHlueCBNYXh0ZXIgUmVtb3RlIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNjBdID0gMHhmYTsKIAkJcmRlc2NbNDBdID0gMHhmYTsKIAl9CkBAIC03NywxMyArNzYsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCmluZGV4IGJjMmUwNzcuLmRlOWNmMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1waWNvbGNkLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQlpZiAocmVwb3J0LT5pZCA9PSBpZCkKIAkJCXJldHVybiByZXBvcnQ7CiAJfQotCWRldl93YXJuKCZoZGV2LT5kZXYsICJObyByZXBvcnQgd2l0aCBpZCAweCV4IGZvdW5kXG4iLCBpZCk7CisJaGlkX3dhcm4oaGRldiwgIk5vIHJlcG9ydCB3aXRoIGlkIDB4JXggZm91bmRcbiIsIGlkKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTMyOSw3ICsxMzI5LDcgQEAKIAogCXZlcmluZm8gPSBwaWNvbGNkX3NlbmRfYW5kX3dhaXQoaGRldiwgUkVQT1JUX1ZFUlNJT04sIE5VTEwsIDApOwogCWlmICghdmVyaW5mbykgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJubyB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRCIpOworCQloaWRfZXJyKGhkZXYsICJubyB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTMzNywxNCArMTMzNywxNCBAQAogCQlkYXRhLT52ZXJzaW9uWzBdID0gdmVyaW5mby0+cmF3X2RhdGFbMV07CiAJCWRhdGEtPnZlcnNpb25bMV0gPSB2ZXJpbmZvLT5yYXdfZGF0YVswXTsKIAkJaWYgKGRhdGEtPnN0YXR1cyAmIFBJQ09MQ0RfQk9PVExPQURFUikgewotCQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIlBpY29MQ0QsIGJvb3Rsb2FkZXIgdmVyc2lvbiAlZC4lZFxuIiwKLQkJCQkJdmVyaW5mby0+cmF3X2RhdGFbMV0sIHZlcmluZm8tPnJhd19kYXRhWzBdKTsKKwkJCWhpZF9pbmZvKGhkZXYsICJQaWNvTENELCBib290bG9hZGVyIHZlcnNpb24gJWQuJWRcbiIsCisJCQkJIHZlcmluZm8tPnJhd19kYXRhWzFdLCB2ZXJpbmZvLT5yYXdfZGF0YVswXSk7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiUGljb0xDRCwgZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKLQkJCQkJdmVyaW5mby0+cmF3X2RhdGFbMV0sIHZlcmluZm8tPnJhd19kYXRhWzBdKTsKKwkJCWhpZF9pbmZvKGhkZXYsICJQaWNvTENELCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAorCQkJCSB2ZXJpbmZvLT5yYXdfZGF0YVsxXSwgdmVyaW5mby0+cmF3X2RhdGFbMF0pOwogCQl9CiAJfSBlbHNlIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY29uZnVzZWQsIGdvdCB1bmV4cGVjdGVkIHZlcnNpb24gcmVzcG9uc2UgZnJvbSBQaWNvTENEXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY29uZnVzZWQsIGdvdCB1bmV4cGVjdGVkIHZlcnNpb24gcmVzcG9uc2UgZnJvbSBQaWNvTENEXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJa2ZyZWUodmVyaW5mbyk7CkBAIC0xNTQ0LDcgKzE1NDQsNyBAQAogCiAJLyogcHJlcGFyZSBidWZmZXIgd2l0aCBpbmZvIGFib3V0IHdoYXQgd2Ugd2FudCB0byByZWFkIChhZGRyICYgbGVuKSAqLwogCXJhd19kYXRhWzBdID0gKm9mZiAmIDB4ZmY7Ci0JcmF3X2RhdGFbMV0gPSAoKm9mZiA+PiA4KSAmJiAweGZmOworCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiAweGZmOwogCXJhd19kYXRhWzJdID0gcyA8IDIwID8gcyA6IDIwOwogCWlmICgqb2ZmICsgcmF3X2RhdGFbMl0gPiAweGZmKQogCQlyYXdfZGF0YVsyXSA9IDB4MTAwIC0gKm9mZjsKQEAgLTE1ODMsNyArMTU4Myw3IEBACiAKIAltZW1zZXQocmF3X2RhdGEsIDAsIHNpemVvZihyYXdfZGF0YSkpOwogCXJhd19kYXRhWzBdID0gKm9mZiAmIDB4ZmY7Ci0JcmF3X2RhdGFbMV0gPSAoKm9mZiA+PiA4KSAmJiAweGZmOworCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiAweGZmOwogCXJhd19kYXRhWzJdID0gcyA8IDIwID8gcyA6IDIwOwogCWlmICgqb2ZmICsgcmF3X2RhdGFbMl0gPiAweGZmKQogCQlyYXdfZGF0YVsyXSA9IDB4MTAwIC0gKm9mZjsKQEAgLTE4NjcsNiArMTg2Nyw3IEBACiAJCQlyZXBvcnQtPmlkLCByYXdfc2l6ZSk7CiAJaGlkX2RlYnVnX2V2ZW50KGhkZXYsIGJ1ZmYpOwogCWlmIChyYXdfc2l6ZSArIDUgPiBzaXplb2YocmF3X2RhdGEpKSB7CisJCWtmcmVlKGJ1ZmYpOwogCQloaWRfZGVidWdfZXZlbnQoaGRldiwgIiBUT08gQklHXG4iKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CkBAIC0yMzI4LDggKzIzMjksNyBAQAogCQkJKGZsYXNoX3cgPyBTX0lXVVNSIDogMCkgfCAoZmxhc2hfciA/IFNfSVJVU1IgOiAwKSwKIAkJCWhkZXYtPmRlYnVnX2RpciwgZGF0YSwgJnBpY29sY2RfZGVidWdfZmxhc2hfZm9wcyk7CiAJfSBlbHNlIGlmIChmbGFzaF9yIHx8IGZsYXNoX3cpCi0JCWRldl93YXJuKCZoZGV2LT5kZXYsICJVbmV4cGVjdGVkIEZMQVNIIGFjY2VzcyByZXBvcnRzLCAiCi0JCQkJInBsZWFzZSBzdWJtaXQgcmRlc2MgZm9yIHJldmlld1xuIik7CisJCWhpZF93YXJuKGhkZXYsICJVbmV4cGVjdGVkIEZMQVNIIGFjY2VzcyByZXBvcnRzLCBwbGVhc2Ugc3VibWl0IHJkZXNjIGZvciByZXZpZXdcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBwaWNvbGNkX2V4aXRfZGV2ZnMoc3RydWN0IHBpY29sY2RfZGF0YSAqZGF0YSkKQEAgLTI0NTcsMTMgKzI0NTcsMTMgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHJlcG9ydC0+bWF4ZmllbGQgIT0gMSB8fCByZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgIT0gMiB8fAogCQkJcmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X3NpemUgIT0gOCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBLRVlfU1RBVEUgcmVwb3J0Iik7CisJCWhpZF9lcnIoaGRldiwgInVuc3VwcG9ydGVkIEtFWV9TVEFURSByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKGlkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlIik7CisJCWhpZF9lcnIoaGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaW5wdXRfc2V0X2RydmRhdGEoaWRldiwgaGRldik7CkBAIC0yNDg1LDcgKzI0ODUsNyBAQAogCQlpbnB1dF9zZXRfY2FwYWJpbGl0eShpZGV2LCBFVl9LRVksIGRhdGEtPmtleWNvZGVbaV0pOwogCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlkZXYpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJlcnJvciByZWdpc3RlcmluZyB0aGUgaW5wdXQgZGV2aWNlIik7CisJCWhpZF9lcnIoaGRldiwgImVycm9yIHJlZ2lzdGVyaW5nIHRoZSBpbnB1dCBkZXZpY2VcbiIpOwogCQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKIAkJcmV0dXJuIGVycm9yOwogCX0KQEAgLTI1MjIsOSArMjUyMiw4IEBACiAJCXJldHVybiBlcnJvcjsKIAogCWlmIChkYXRhLT52ZXJzaW9uWzBdICE9IDAgJiYgZGF0YS0+dmVyc2lvblsxXSAhPSAzKQotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiRGV2aWNlIHdpdGggdW50ZXN0ZWQgZmlybXdhcmUgcmV2aXNpb24sICIKLQkJCQkicGxlYXNlIHN1Ym1pdCAvc3lzL2tlcm5lbC9kZWJ1Zy9oaWQvJXMvcmRlc2MgZm9yIHRoaXMgZGV2aWNlLlxuIiwKLQkJCQlkZXZfbmFtZSgmaGRldi0+ZGV2KSk7CisJCWhpZF9pbmZvKGhkZXYsICJEZXZpY2Ugd2l0aCB1bnRlc3RlZCBmaXJtd2FyZSByZXZpc2lvbiwgcGxlYXNlIHN1Ym1pdCAvc3lzL2tlcm5lbC9kZWJ1Zy9oaWQvJXMvcmRlc2MgZm9yIHRoaXMgZGV2aWNlLlxuIiwKKwkJCSBkZXZfbmFtZSgmaGRldi0+ZGV2KSk7CiAKIAkvKiBTZXR1cCBrZXlwYWQgaW5wdXQgZGV2aWNlICovCiAJZXJyb3IgPSBwaWNvbGNkX2luaXRfa2V5cyhkYXRhLCBwaWNvbGNkX2luX3JlcG9ydChSRVBPUlRfS0VZX1NUQVRFLCBoZGV2KSk7CkBAIC0yNTgxLDkgKzI1ODAsOCBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAlpZiAoZGF0YS0+dmVyc2lvblswXSAhPSAxICYmIGRhdGEtPnZlcnNpb25bMV0gIT0gMCkKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkRldmljZSB3aXRoIHVudGVzdGVkIGJvb3Rsb2FkZXIgcmV2aXNpb24sICIKLQkJCQkicGxlYXNlIHN1Ym1pdCAvc3lzL2tlcm5lbC9kZWJ1Zy9oaWQvJXMvcmRlc2MgZm9yIHRoaXMgZGV2aWNlLlxuIiwKLQkJCQlkZXZfbmFtZSgmaGRldi0+ZGV2KSk7CisJCWhpZF9pbmZvKGhkZXYsICJEZXZpY2Ugd2l0aCB1bnRlc3RlZCBib290bG9hZGVyIHJldmlzaW9uLCBwbGVhc2Ugc3VibWl0IC9zeXMva2VybmVsL2RlYnVnL2hpZC8lcy9yZGVzYyBmb3IgdGhpcyBkZXZpY2UuXG4iLAorCQkJIGRldl9uYW1lKCZoZGV2LT5kZXYpKTsKIAogCXBpY29sY2RfaW5pdF9kZXZmcyhkYXRhLCBOVUxMLCBOVUxMLAogCQkJcGljb2xjZF9vdXRfcmVwb3J0KFJFUE9SVF9CTF9SRUFEX01FTU9SWSwgaGRldiksCkBAIC0yNjA1LDcgKzI2MDMsNyBAQAogCSAqLwogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGljb2xjZF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzcGFjZSBmb3IgTWluaWJveCBQaWNvTENEIGRldmljZSBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIE1pbmlib3ggUGljb0xDRCBkZXZpY2UgZGF0YVxuIik7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBlcnJfbm9fY2xlYW51cDsKIAl9CkBAIC0yNjIxLDcgKzI2MTksNyBAQAogCS8qIFBhcnNlIHRoZSBkZXZpY2UgcmVwb3J0cyBhbmQgc3RhcnQgaXQgdXAgKi8KIAllcnJvciA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZGV2aWNlIHJlcG9ydCBwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJkZXZpY2UgcmVwb3J0IHBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfZGF0YTsKIAl9CiAKQEAgLTI2MzEsMjUgKzI2MjksMjUgQEAKIAllcnJvciA9IGhpZF9od19zdGFydChoZGV2LCAwKTsKIAloZGV2LT5jbGFpbWVkID0gMDsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaGFyZHdhcmUgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaGFyZHdhcmUgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfY2xlYW51cF9kYXRhOwogCX0KIAotCWVycm9yID0gaGRldi0+bGxfZHJpdmVyLT5vcGVuKGhkZXYpOworCWVycm9yID0gaGlkX2h3X29wZW4oaGRldik7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImZhaWxlZCB0byBvcGVuIGlucHV0IGludGVycnVwdCBwaXBlIGZvciBrZXkgYW5kIElSIGV2ZW50c1xuIik7CisJCWhpZF9lcnIoaGRldiwgImZhaWxlZCB0byBvcGVuIGlucHV0IGludGVycnVwdCBwaXBlIGZvciBrZXkgYW5kIElSIGV2ZW50c1xuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfaGlkX2h3OwogCX0KIAogCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZV9kZWxheSk7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlc1xuIik7CisJCWhpZF9lcnIoaGRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlc1xuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfaGlkX2xsOwogCX0KIAogCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZSk7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlc1xuIik7CisJCWhpZF9lcnIoaGRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgYXR0cmlidXRlc1xuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfc3lzZnMxOwogCX0KIApAQCAtMjY2OCw3ICsyNjY2LDcgQEAKIGVycl9jbGVhbnVwX3N5c2ZzMToKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX29wZXJhdGlvbl9tb2RlX2RlbGF5KTsKIGVycl9jbGVhbnVwX2hpZF9sbDoKLQloZGV2LT5sbF9kcml2ZXItPmNsb3NlKGhkZXYpOworCWhpZF9od19jbG9zZShoZGV2KTsKIGVycl9jbGVhbnVwX2hpZF9odzoKIAloaWRfaHdfc3RvcChoZGV2KTsKIGVycl9jbGVhbnVwX2RhdGE6CkBAIC0yNjk5LDcgKzI2OTcsNyBAQAogCXBpY29sY2RfZXhpdF9kZXZmcyhkYXRhKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX29wZXJhdGlvbl9tb2RlKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX29wZXJhdGlvbl9tb2RlX2RlbGF5KTsKLQloZGV2LT5sbF9kcml2ZXItPmNsb3NlKGhkZXYpOworCWhpZF9od19jbG9zZShoZGV2KTsKIAloaWRfaHdfc3RvcChoZGV2KTsKIAloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CiAKQEAgLTI3NTMsNyArMjc1MSw3IEBACiB7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZwaWNvbGNkX2RyaXZlcik7CiAjaWZkZWYgQ09ORklHX0hJRF9QSUNPTENEX0ZCCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlmbHVzaF93b3JrX3N5bmMoJnBpY29sY2RfZmJfY2xlYW51cCk7CiAJV0FSTl9PTihmYl9wZW5kaW5nKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBsLmMgYi9kcml2ZXJzL2hpZC9oaWQtcGwuYwppbmRleCA5ZjQxZTJiLi4wNmU1MzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcGwuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGwuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJKi8KIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTEyLDE0ICsxMTIsMTMgQEAKIAkJcmVwb3J0X3B0ciA9IHJlcG9ydF9wdHItPm5leHQ7CiAKIAkJaWYgKHJlcG9ydF9wdHIgPT0gcmVwb3J0X2xpc3QpIHsKLQkJCWRldl9lcnIoJmhpZC0+ZGV2LCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyAiCi0JCQkJCSJtaXNzaW5nXG4iKTsKKwkJCWhpZF9lcnIoaGlkLCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyBtaXNzaW5nXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKIAkJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfcHRyLCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CisJCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTEzNyw3ICsxMzYsNyBAQAogCQkJd2VhayA9ICZyZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXTsKIAkJCWRlYnVnKCJkZXRlY3RlZCA0LWZpZWxkIGRldmljZSIpOwogCQl9IGVsc2UgewotCQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIGZpZWxkcyBvciB2YWx1ZXNcbiIpOworCQkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIGZpZWxkcyBvciB2YWx1ZXNcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIApAQCAtMTY0LDggKzE2Myw3IEBACiAJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGxmZi0+cmVwb3J0LCBVU0JfRElSX09VVCk7CiAJfQogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSAiCi0JICAgICAgICJkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgZmVlZGJhY2sgZm9yIFBhbnRoZXJMb3JkL0dyZWVuQXNpYSBkZXZpY2VzIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NSwxMyArMTgzLDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYyBiL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYwppbmRleCA0OGVhYjg0Li5hYjE5ZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTEzMCw3ICsxMzIsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVR08sIHNob3dfY2hhbm5lbCwKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlAgLCBzaG93X2NoYW5uZWwsCiAJCXN0b3JlX2NoYW5uZWwpOwogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnN5c2ZzX2RldmljZV9hdHRyX2NoYW5uZWwgPSB7CkBAIC0xNjksNyArMTcxLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKHN1c3RhaW4sIFNfSVJVR08gfCBTX0lXVUdPLCBzaG93X3N1c3RhaW4sCitzdGF0aWMgREVWSUNFX0FUVFIoc3VzdGFpbiwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLCBzaG93X3N1c3RhaW4sCiAJCXN0b3JlX3N1c3RhaW4pOwogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnN5c2ZzX2RldmljZV9hdHRyX3N1c3RhaW4gPSB7CkBAIC0yMDcsNyArMjA5LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKG9jdGF2ZSwgU19JUlVHTyB8IFNfSVdVR08sIHNob3dfb2N0YXZlLAorc3RhdGljIERFVklDRV9BVFRSKG9jdGF2ZSwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQLCBzaG93X29jdGF2ZSwKIAkJc3RvcmVfb2N0YXZlKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpzeXNmc19kZXZpY2VfYXR0cl9vY3RhdmUgPSB7CkBAIC0yODUsMTEgKzI4NywxMSBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCAxKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgIm91dHB1dCByZXBvcnQgaXMgZW1wdHlcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCAhPSAyKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmaWVsZCBjb3VudCB0b28gbG93XG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImZpZWxkIGNvdW50IHRvbyBsb3dcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJcG0tPnBjbWlkaV9yZXBvcnQ2ID0gcmVwb3J0OwpAQCAtNzQ2LDggKzc0OCw4IEBACiAJaWYgKCpyc2l6ZSA9PSAxNzggJiYKIAkgICAgICByZGVzY1sxMTFdID09IDB4MDYgJiYgcmRlc2NbMTEyXSA9PSAweDAwICYmCiAJICAgICAgcmRlc2NbMTEzXSA9PSAweGZmKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgcGMtbWlkaSBrZXlib2FyZCByZXBvcnQgIgotCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgcGMtbWlkaSBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAKIAkJcmRlc2NbMTQ0XSA9IDB4MTg7IC8qIHJlcG9ydCA0OiB3YXMgMHgxMCByZXBvcnQgY291bnQgKi8KIAl9CkBAIC04MDUsNyArODA3LDcgQEAKIAogCXBrID0ga3phbGxvYyhzaXplb2YoKnBrKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBrID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicHJvZGlrZXlzOiBjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtODEzLDggKzgxNSw3IEBACiAKIAlwbSA9IGt6YWxsb2Moc2l6ZW9mKCpwbSksIEdGUF9LRVJORUwpOwogCWlmIChwbSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwKLQkJCSJwcm9kaWtleXM6IGNhbid0IGFsbG9jIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC04MjcsNyArODI4LDcgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInByb2Rpa2V5czogaGlkIHBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImhpZCBwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtODM3LDcgKzgzOCw3IEBACiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwcm9kaWtleXM6IGh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC04OTYsNyArODk3LDcgQEAKIAogCXJldCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnBrX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCByZWdpc3RlciBwcm9kaWtleXMgZHJpdmVyXG4iKTsKKwkJcHJfZXJyKCJjYW4ndCByZWdpc3RlciBwcm9kaWtleXMgZHJpdmVyXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcXVhbnRhLmMgYi9kcml2ZXJzL2hpZC9oaWQtcXVhbnRhLmMKaW5kZXggNTRkM2RiNS4uODdhNTRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXF1YW50YS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1xdWFudGEuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAKIAl0ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWFudGFfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIFF1YW50YSBUb3VjaCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIFF1YW50YSBUb3VjaCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRkLT52YWxpZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYwppbmRleCBmNzc2OTU3Li5jYmQ4Y2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuYwpAQCAtMzUsNiArMzUsMTEgQEAKICNpbmNsdWRlICJoaWQtcm9jY2F0LmgiCiAjaW5jbHVkZSAiaGlkLXJvY2NhdC1rb25lLmgiCiAKK3N0YXRpYyB1aW50IHByb2ZpbGVfbnVtYmVyc1s1XSA9IHswLCAxLCAyLCAzLCA0fTsKKworLyoga29uZV9jbGFzcyBpcyB1c2VkIGZvciBjcmVhdGluZyBzeXNmcyBhdHRyaWJ1dGVzIHZpYSByb2NjYXQgY2hhciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmtvbmVfY2xhc3M7CisKIHN0YXRpYyB2b2lkIGtvbmVfc2V0X3NldHRpbmdzX2NoZWNrc3VtKHN0cnVjdCBrb25lX3NldHRpbmdzICpzZXR0aW5ncykKIHsKIAl1aW50MTZfdCBjaGVja3N1bSA9IDA7CkBAIC05MCw4ICs5NSw3IEBACiAJCWtmcmVlKGRhdGEpOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgeyAvKiB1bmtub3duIGFuc3dlciAqLwotCQlkZXZfZXJyKCZ1c2JfZGV2LT5kZXYsICJnb3QgcmV0dmFsICVkIHdoZW4gY2hlY2tpbmcgd3JpdGVcbiIsCi0JCQkJKmRhdGEpOworCQloaWRfZXJyKHVzYl9kZXYsICJnb3QgcmV0dmFsICVkIHdoZW4gY2hlY2tpbmcgd3JpdGVcbiIsICpkYXRhKTsKIAkJa2ZyZWUoZGF0YSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2Miw3ICsyNjYsOCBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19yZWFkX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCiAJaWYgKG9mZiA+PSBzaXplb2Yoc3RydWN0IGtvbmVfc2V0dGluZ3MpKQpAQCAtMjg2LDcgKzI5MSw4IEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCWludCByZXR2YWwgPSAwLCBkaWZmZXJlbmNlOwpAQCAtMzE5LDEwICszMjUsMTEgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBrb25lX3NldHRpbmdzKTsKIH0KIAotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGludCBudW1iZXIpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CitzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZXgoc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpKQpAQCAtMzMyLDQ3ICszMzksMTggQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkgLSBvZmY7CiAKIAltdXRleF9sb2NrKCZrb25lLT5rb25lX2xvY2spOwotCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZrb25lLT5wcm9maWxlc1tudW1iZXIgLSAxXSkgKyBvZmYsIGNvdW50KTsKKwltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikma29uZS0+cHJvZmlsZXNbKih1aW50ICopKGF0dHItPnByaXZhdGUpXSkgKyBvZmYsIGNvdW50KTsKIAltdXRleF91bmxvY2soJmtvbmUtPmtvbmVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMihzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlNChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlNShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNSk7Ci19Ci0KIC8qIFdyaXRlcyBkYXRhIG9ubHkgaWYgZGlmZmVyZW50IHRvIHN0b3JlZCBkYXRhICovCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGludCBudW1iZXIpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CitzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgeworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CiAJc3RydWN0IGtvbmVfcHJvZmlsZSAqcHJvZmlsZTsKQEAgLTM4MiwxMyArMzYwLDE0IEBACiAJaWYgKG9mZiAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcm9maWxlID0gJmtvbmUtPnByb2ZpbGVzW251bWJlciAtIDFdOworCXByb2ZpbGUgPSAma29uZS0+cHJvZmlsZXNbKih1aW50ICopKGF0dHItPnByaXZhdGUpXTsKIAogCW11dGV4X2xvY2soJmtvbmUtPmtvbmVfbG9jayk7CiAJZGlmZmVyZW5jZSA9IG1lbWNtcChidWYsIHByb2ZpbGUsIHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSk7CiAJaWYgKGRpZmZlcmVuY2UpIHsKIAkJcmV0dmFsID0ga29uZV9zZXRfcHJvZmlsZSh1c2JfZGV2LAotCQkJCShzdHJ1Y3Qga29uZV9wcm9maWxlIGNvbnN0ICopYnVmLCBudW1iZXIpOworCQkJCShzdHJ1Y3Qga29uZV9wcm9maWxlIGNvbnN0ICopYnVmLAorCQkJCSoodWludCAqKShhdHRyLT5wcml2YXRlKSArIDEpOwogCQlpZiAoIXJldHZhbCkKIAkJCW1lbWNweShwcm9maWxlLCBidWYsIHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSk7CiAJfQpAQCAtNDAwLDQ3ICszNzksMTkgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpOwogfQogCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUxKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTIoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgoa29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAyKTsKLX0KLQotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxlMyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc193cml0ZV9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGU0KHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgoa29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCA1KTsKLX0KLQogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZS0+YWN0dWFsX3Byb2ZpbGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3Nob3dfYWN0dWFsX2RwaShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPmFjdHVhbF9kcGkpOwogfQogCkBAIC00NDgsMTEgKzM5OSwxNSBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X3dlaWdodChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmU7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CiAJaW50IHdlaWdodCA9IDA7CiAJaW50IHJldHZhbDsKIAorCWRldiA9IGRldi0+cGFyZW50LT5wYXJlbnQ7CisJa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwogCW11dGV4X2xvY2soJmtvbmUtPmtvbmVfbG9jayk7CiAJcmV0dmFsID0ga29uZV9nZXRfd2VpZ2h0KHVzYl9kZXYsICZ3ZWlnaHQpOwogCW11dGV4X3VubG9jaygma29uZS0+a29uZV9sb2NrKTsKQEAgLTQ2NSwxNCArNDIwLDE2IEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPmZpcm13YXJlX3ZlcnNpb24pOwogfQogCiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3Nob3dfdGN1KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZS0+c2V0dGluZ3MudGN1KTsKIH0KIApAQCAtNTA0LDExICs0NjEsMTUgQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2V0X3RjdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyIGNvbnN0ICpidWYsIHNpemVfdCBzaXplKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwogCWludCByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAorCWRldiA9IGRldi0+cGFyZW50LT5wYXJlbnQ7CisJa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwogCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZzdGF0ZSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTU1Niw3ICs1MTcsNyBAQAogCiAJCXJldHZhbCA9IGtvbmVfc2V0X3NldHRpbmdzKHVzYl9kZXYsICZrb25lLT5zZXR0aW5ncyk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJnVzYl9kZXYtPmRldiwgImNvdWxkbid0IHNldCB0Y3Ugc3RhdGVcbiIpOworCQkJaGlkX2Vycih1c2JfZGV2LCAiY291bGRuJ3Qgc2V0IHRjdSBzdGF0ZVxuIik7CiAJCQkvKgogCQkJICogdHJ5IHRvIHJlcmVhZCB2YWxpZCBzZXR0aW5ncyBpbnRvIGJ1ZmZlciBvdmVyd3JpdGluZwogCQkJICogZmlyc3QgZXJyb3IgY29kZQpAQCAtNTcwLDcgKzUzMSw3IEBACiAKIAlyZXR2YWwgPSBzaXplOwogZXhpdF9ub19zZXR0aW5nczoKLQlkZXZfZXJyKCZ1c2JfZGV2LT5kZXYsICJjb3VsZG4ndCByZWFkIHNldHRpbmdzXG4iKTsKKwloaWRfZXJyKHVzYl9kZXYsICJjb3VsZG4ndCByZWFkIHNldHRpbmdzXG4iKTsKIGV4aXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygma29uZS0+a29uZV9sb2NrKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNTc5LDE4ICs1NDAsMjMgQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lLT5zZXR0aW5ncy5zdGFydHVwX3Byb2ZpbGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3NldF9zdGFydHVwX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciBjb25zdCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgbmV3X3N0YXJ0dXBfcHJvZmlsZTsKIAorCWRldiA9IGRldi0+cGFyZW50LT5wYXJlbnQ7CisJa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwogCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZuZXdfc3RhcnR1cF9wcm9maWxlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNjE3LDE2MCArNTgzLDkyIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLS8qCi0gKiBSZWFkIGFjdHVhbCBkcGkgc2V0dGluZ3MuCi0gKiBSZXR1cm5zIHJhdyB2YWx1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBSZWZlciB0byBlbnVtIGtvbmVfcG9sbGluZ19yYXRlcyB0bwotICogZ2V0IHJlYWwgdmFsdWUuCi0gKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihhY3R1YWxfZHBpLCAwNDQwLCBrb25lX3N5c2ZzX3Nob3dfYWN0dWFsX2RwaSwgTlVMTCk7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUga29uZV9hdHRyaWJ1dGVzW10gPSB7CisJLyoKKwkgKiBSZWFkIGFjdHVhbCBkcGkgc2V0dGluZ3MuCisJICogUmV0dXJucyByYXcgdmFsdWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gUmVmZXIgdG8gZW51bQorCSAqIGtvbmVfcG9sbGluZ19yYXRlcyB0byBnZXQgcmVhbCB2YWx1ZS4KKwkgKi8KKwlfX0FUVFIoYWN0dWFsX2RwaSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9kcGksIE5VTEwpLAorCV9fQVRUUihhY3R1YWxfcHJvZmlsZSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlLCBOVUxMKSwKIAotc3RhdGljIERFVklDRV9BVFRSKGFjdHVhbF9wcm9maWxlLCAwNDQwLCBrb25lX3N5c2ZzX3Nob3dfYWN0dWFsX3Byb2ZpbGUsIE5VTEwpOworCS8qCisJICogVGhlIG1vdXNlIGNhbiBiZSBlcXVpcHBlZCB3aXRoIG9uZSBvZiBmb3VyIHN1cHBsaWVkIHdlaWdodHMgZnJvbSA1CisJICogdG8gMjAgZ3JhbXMgd2hpY2ggYXJlIHJlY29nbml6ZWQgYW5kIGl0cyB2YWx1ZSBjYW4gYmUgcmVhZCBvdXQuCisJICogVGhpcyByZXR1cm5zIHRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGZvciBlYXN5IGV2YWx1YXRpb24KKwkgKiBieSBzb2Z0d2FyZS4gUmVmZXIgdG8gZW51bSBrb25lX3dlaWdodHMgdG8gZ2V0IGNvcnJlc3BvbmRpbmcgcmVhbAorCSAqIHdlaWdodC4KKwkgKi8KKwlfX0FUVFIod2VpZ2h0LCAwNDQwLCBrb25lX3N5c2ZzX3Nob3dfd2VpZ2h0LCBOVUxMKSwKIAotLyoKLSAqIFRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzIGZyb20gNSB0byAyMAotICogZ3JhbXMgd2hpY2ggYXJlIHJlY29nbml6ZWQgYW5kIGl0cyB2YWx1ZSBjYW4gYmUgcmVhZCBvdXQuCi0gKiBUaGlzIHJldHVybnMgdGhlIHJhdyB2YWx1ZSByZXBvcnRlZCBieSB0aGUgbW91c2UgZm9yIGVhc3kgZXZhbHVhdGlvbiBieQotICogc29mdHdhcmUuIFJlZmVyIHRvIGVudW0ga29uZV93ZWlnaHRzIHRvIGdldCBjb3JyZXNwb25kaW5nIHJlYWwgd2VpZ2h0LgotICovCi1zdGF0aWMgREVWSUNFX0FUVFIod2VpZ2h0LCAwNDQwLCBrb25lX3N5c2ZzX3Nob3dfd2VpZ2h0LCBOVUxMKTsKKwkvKgorCSAqIFByaW50cyBmaXJtd2FyZSB2ZXJzaW9uIHN0b3JlZCBpbiBtb3VzZSBhcyBpbnRlZ2VyLgorCSAqIFRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGlzIHJldHVybmVkIGZvciBlYXN5IGV2YWx1YXRpb24sCisJICogdG8gZ2V0IHRoZSByZWFsIHZlcnNpb24gbnVtYmVyIHRoZSBkZWNpbWFsIHBvaW50IGhhcyB0byBiZSBzaGlmdGVkIDIKKwkgKiBwb3NpdGlvbnMgdG8gdGhlIGxlZnQuIEUuZy4gYSB2YWx1ZSBvZiAxMzggbWVhbnMgMS4zOC4KKwkgKi8KKwlfX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgMDQ0MCwKKwkJCWtvbmVfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uLCBOVUxMKSwKIAotLyoKLSAqIFByaW50cyBmaXJtd2FyZSB2ZXJzaW9uIHN0b3JlZCBpbiBtb3VzZSBhcyBpbnRlZ2VyLgotICogVGhlIHJhdyB2YWx1ZSByZXBvcnRlZCBieSB0aGUgbW91c2UgaXMgcmV0dXJuZWQgZm9yIGVhc3kgZXZhbHVhdGlvbiwgdG8gZ2V0Ci0gKiB0aGUgcmVhbCB2ZXJzaW9uIG51bWJlciB0aGUgZGVjaW1hbCBwb2ludCBoYXMgdG8gYmUgc2hpZnRlZCAyIHBvc2l0aW9ucyB0bwotICogdGhlIGxlZnQuIEUuZy4gYSB2YWx1ZSBvZiAxMzggbWVhbnMgMS4zOC4KLSAqLwotc3RhdGljIERFVklDRV9BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCi0JCWtvbmVfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uLCBOVUxMKTsKKwkvKgorCSAqIFByaW50cyBzdGF0ZSBvZiBUcmFja2luZyBDb250cm9sIFVuaXQgYXMgbnVtYmVyIHdoZXJlIDAgPSBvZmYgYW5kCisJICogMSA9IG9uLiBXcml0aW5nIDAgZGVhY3RpdmF0ZXMgdGN1IGFuZCB3cml0aW5nIDEgY2FsaWJyYXRlcyBhbmQKKwkgKiBhY3RpdmF0ZXMgdGhlIHRjdQorCSAqLworCV9fQVRUUih0Y3UsIDA2NjAsIGtvbmVfc3lzZnNfc2hvd190Y3UsIGtvbmVfc3lzZnNfc2V0X3RjdSksCiAKLS8qCi0gKiBQcmludHMgc3RhdGUgb2YgVHJhY2tpbmcgQ29udHJvbCBVbml0IGFzIG51bWJlciB3aGVyZSAwID0gb2ZmIGFuZCAxID0gb24KLSAqIFdyaXRpbmcgMCBkZWFjdGl2YXRlcyB0Y3UgYW5kIHdyaXRpbmcgMSBjYWxpYnJhdGVzIGFuZCBhY3RpdmF0ZXMgdGhlIHRjdQotICovCi1zdGF0aWMgREVWSUNFX0FUVFIodGN1LCAwNjYwLCBrb25lX3N5c2ZzX3Nob3dfdGN1LCBrb25lX3N5c2ZzX3NldF90Y3UpOwotCi0vKiBQcmludHMgYW5kIHRha2VzIHRoZSBudW1iZXIgb2YgdGhlIHByb2ZpbGUgdGhlIG1vdXNlIHN0YXJ0cyB3aXRoICovCi1zdGF0aWMgREVWSUNFX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNjYwLAotCQlrb25lX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLAotCQlrb25lX3N5c2ZzX3NldF9zdGFydHVwX3Byb2ZpbGUpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqa29uZV9hdHRyaWJ1dGVzW10gPSB7Ci0JCSZkZXZfYXR0cl9hY3R1YWxfZHBpLmF0dHIsCi0JCSZkZXZfYXR0cl9hY3R1YWxfcHJvZmlsZS5hdHRyLAotCQkmZGV2X2F0dHJfd2VpZ2h0LmF0dHIsCi0JCSZkZXZfYXR0cl9maXJtd2FyZV92ZXJzaW9uLmF0dHIsCi0JCSZkZXZfYXR0cl90Y3UuYXR0ciwKLQkJJmRldl9hdHRyX3N0YXJ0dXBfcHJvZmlsZS5hdHRyLAotCQlOVUxMCisJLyogUHJpbnRzIGFuZCB0YWtlcyB0aGUgbnVtYmVyIG9mIHRoZSBwcm9maWxlIHRoZSBtb3VzZSBzdGFydHMgd2l0aCAqLworCV9fQVRUUihzdGFydHVwX3Byb2ZpbGUsIDA2NjAsCisJCQlrb25lX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLAorCQkJa29uZV9zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKSwKKwlfX0FUVFJfTlVMTAogfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAga29uZV9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JCS5hdHRycyA9IGtvbmVfYXR0cmlidXRlcworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfYmluX2F0dHJpYnV0ZXNbXSA9IHsKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJzZXR0aW5ncyIsIC5tb2RlID0gMDY2MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncyksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3NldHRpbmdzLAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3NldHRpbmdzCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMSIsIC5tb2RlID0gMDY2MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKKwkJLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZXgsCisJCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1swXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTIiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzIiwgLm1vZGUgPSAwNjYwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleCwKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxleCwKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzJdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNCIsIC5tb2RlID0gMDY2MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKKwkJLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZXgsCisJCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1szXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTUiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbNF0KKwl9LAorCV9fQVRUUl9OVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9zZXR0aW5nc19hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJzZXR0aW5ncyIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3NldHRpbmdzKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9zZXR0aW5ncywKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlMV9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMSIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGUxLAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTEKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX3Byb2ZpbGUyX2F0dHIgPSB7Ci0JLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyIiwgLm1vZGUgPSAwNjYwIH0sCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTIsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxlMgotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfcHJvZmlsZTNfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTMiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMywKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlNF9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNCIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGU0LAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTQKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX3Byb2ZpbGU1X2F0dHIgPSB7Ci0JLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1IiwgLm1vZGUgPSAwNjYwIH0sCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTUsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxlNQotfTsKLQotc3RhdGljIGludCBrb25lX2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAma29uZV9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8xOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzI7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlMV9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMzsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUyX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF80OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzU7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlNF9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfNjsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGU1X2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF83OwotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfNzoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlNF9hdHRyKTsKLWV4aXRfNjoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlM19hdHRyKTsKLWV4aXRfNToKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlMl9hdHRyKTsKLWV4aXRfNDoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlMV9hdHRyKTsKLWV4aXRfMzoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9zZXR0aW5nc19hdHRyKTsKLWV4aXRfMjoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAma29uZV9hdHRyaWJ1dGVfZ3JvdXApOwotZXhpdF8xOgotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGtvbmVfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTVfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTRfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTJfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTFfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfYXR0cmlidXRlX2dyb3VwKTsKLX0KLQogc3RhdGljIGludCBrb25lX2luaXRfa29uZV9kZXZpY2Vfc3RydWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAogCQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUpCiB7CkBAIC04MTgsMzIgKzcxNiwyNSBAQAogCiAJCWtvbmUgPSBremFsbG9jKHNpemVvZigqa29uZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWtvbmUpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBrb25lKTsKIAogCQlyZXR2YWwgPSBrb25lX2luaXRfa29uZV9kZXZpY2Vfc3RydWN0KHVzYl9kZXYsIGtvbmUpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsCi0JCQkJCSJjb3VsZG4ndCBpbml0IHN0cnVjdCBrb25lX2RldmljZVxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjb3VsZG4ndCBpbml0IHN0cnVjdCBrb25lX2RldmljZVxuIik7CiAJCQlnb3RvIGV4aXRfZnJlZTsKIAkJfQogCi0JCXJldHZhbCA9IHJvY2NhdF9jb25uZWN0KGhkZXYpOworCQlyZXR2YWwgPSByb2NjYXRfY29ubmVjdChrb25lX2NsYXNzLCBoZGV2KTsKIAkJaWYgKHJldHZhbCA8IDApIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5pdCBjaGFyIGRldlxuIik7CiAJCQkvKiBiZSB0b2xlcmFudCBhYm91dCBub3QgZ2V0dGluZyBjaHJkZXYgKi8KIAkJfSBlbHNlIHsKIAkJCWtvbmUtPnJvY2NhdF9jbGFpbWVkID0gMTsKIAkJCWtvbmUtPmNocmRldl9taW5vciA9IHJldHZhbDsKIAkJfQotCi0JCXJldHZhbCA9IGtvbmVfY3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7Ci0JCX0KIAl9IGVsc2UgewogCQloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CiAJfQpAQCAtODU0LDcgKzc0NSw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCiBzdGF0aWMgdm9pZCBrb25lX3JlbW92ZV9zcGVjaWFscyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CkBAIC04NjIsNyArNzUyLDYgQEAKIAogCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wKIAkJCT09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpIHsKLQkJa29uZV9yZW1vdmVfc3lzZnNfYXR0cmlidXRlcyhpbnRmKTsKIAkJa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKIAkJaWYgKGtvbmUtPnJvY2NhdF9jbGFpbWVkKQogCQkJcm9jY2F0X2Rpc2Nvbm5lY3Qoa29uZS0+Y2hyZGV2X21pbm9yKTsKQEAgLTg3NiwxOSArNzY1LDE5IEBACiAKIAlyZXR2YWwgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJcmV0dmFsID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IGtvbmVfaW5pdF9zcGVjaWFscyhoZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNvdWxkbid0IGluc3RhbGwgbW91c2VcbiIpOworCQloaWRfZXJyKGhkZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKIAkJZ290byBleGl0X3N0b3A7CiAJfQogCkBAIC0xMDA2LDExICs4OTUsMjQgQEAKIAogc3RhdGljIGludCBfX2luaXQga29uZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmtvbmVfZHJpdmVyKTsKKwlpbnQgcmV0dmFsOworCisJLyogY2xhc3MgbmFtZSBoYXMgdG8gYmUgc2FtZSBhcyBkcml2ZXIgbmFtZSAqLworCWtvbmVfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJrb25lIik7CisJaWYgKElTX0VSUihrb25lX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIoa29uZV9jbGFzcyk7CisJa29uZV9jbGFzcy0+ZGV2X2F0dHJzID0ga29uZV9hdHRyaWJ1dGVzOworCWtvbmVfY2xhc3MtPmRldl9iaW5fYXR0cnMgPSBrb25lX2Jpbl9hdHRyaWJ1dGVzOworCisJcmV0dmFsID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigma29uZV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWNsYXNzX2Rlc3Ryb3koa29uZV9jbGFzcyk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGtvbmVfZXhpdCh2b2lkKQogeworCWNsYXNzX2Rlc3Ryb3koa29uZV9jbGFzcyk7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZrb25lX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmgKaW5kZXggMTMwZDY1Ni4uNjRhYmI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmgKQEAgLTE0LDE0ICsxNCwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI3ByYWdtYSBwYWNrKHB1c2gpCi0jcHJhZ21hIHBhY2soMSkKLQogc3RydWN0IGtvbmVfa2V5c3Ryb2tlIHsKIAl1aW50OF90IGtleTsKIAl1aW50OF90IGFjdGlvbjsKIAl1aW50MTZfdCBwZXJpb2Q7IC8qIGluIG1pbGxpc2Vjb25kcyAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBrb25lX2tleXN0cm9rZV9idXR0b25zIHsKIAlrb25lX2tleXN0cm9rZV9idXR0b25fMSA9IDB4ZjAsIC8qIGxlZnQgbW91c2UgYnV0dG9uICovCkBAIC00NCw3ICs0MSw3IEBACiAJdWludDhfdCBtYWNyb19uYW1lWzE2XTsgLyogY2FuIGJlIG1heCAxNSBjaGFycyBsb25nICovCiAJdWludDhfdCBjb3VudDsKIAlzdHJ1Y3Qga29uZV9rZXlzdHJva2Uga2V5c3Ryb2tlc1syMF07Ci19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBlbnVtIGtvbmVfYnV0dG9uX2luZm9fdHlwZXMgewogCS8qIHZhbGlkIGJ1dHRvbiB0eXBlcyB1bnRpbCBmaXJtd2FyZSAxLjMyICovCkBAIC05NSw3ICs5Miw3IEBACiAJdWludDhfdCByZWQ7ICAgLyogcmFuZ2UgMHgwMC0weGZmICovCiAJdWludDhfdCBncmVlbjsgLyogcmFuZ2UgMHgwMC0weGZmICovCiAJdWludDhfdCBibHVlOyAgLyogcmFuZ2UgMHgwMC0weGZmICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3Qga29uZV9wcm9maWxlIHsKIAl1aW50MTZfdCBzaXplOyAvKiBhbHdheXMgOTc1ICovCkBAIC0xMzAsNyArMTI3LDcgQEAKIAlzdHJ1Y3Qga29uZV9idXR0b25faW5mbyBidXR0b25faW5mb3NbOF07CiAKIAl1aW50MTZfdCBjaGVja3N1bTsgLyogXGJyaWVmIGhvbGRzIGNoZWNrc3VtIG9mIHN0cnVjdCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBrb25lX3BvbGxpbmdfcmF0ZXMgewogCWtvbmVfcG9sbGluZ19yYXRlXzEyNSA9IDEsCkBAIC0xNDcsNyArMTQ0LDcgQEAKIAl1aW50OF90ICBjYWxpYnJhdGlvbl9kYXRhWzRdOwogCXVpbnQ4X3QgIHVua25vd24zWzJdOwogCXVpbnQxNl90IGNoZWNrc3VtOwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyoKICAqIDEyIGJ5dGUgbW91c2UgZXZlbnQgcmVhZCBieSBpbnRlcnJ1cHRfcmVhZApAQCAtMTYzLDcgKzE2MCw3IEBACiAJdWludDhfdCBldmVudDsKIAl1aW50OF90IHZhbHVlOyAvKiBwcmVzcyA9IDAsIHJlbGVhc2UgPSAxICovCiAJdWludDhfdCBtYWNyb19rZXk7IC8qIDAgdG8gOCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBrb25lX21vdXNlX2V2ZW50cyB7CiAJLyogb3NkIGV2ZW50cyBhcmUgdGhvdWdodCB0byBiZSBkaXNwbGF5IG9uIHNjcmVlbiAqLwpAQCAtMTkxLDkgKzE4OCw3IEBACiAJdWludDhfdCBldmVudDsKIAl1aW50OF90IHZhbHVlOyAvKiBob2xkcyBkcGkgb3IgcHJvZmlsZSB2YWx1ZSAqLwogCXVpbnQ4X3Qga2V5OyAvKiBtYWNybyBrZXkgb24gb3ZlcmxvbmcgbWFjcm8gZXhlY3V0aW9uICovCi19OwotCi0jcHJhZ21hIHBhY2socG9wKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3Qga29uZV9kZXZpY2UgewogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwOGM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuYwpAQCAtMCwwICsxLDgzNyBAQAorLyoKKyAqIFJvY2NhdCBLb25lWytdIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogUm9jY2F0IEtvbmVbK10gaXMgYW4gdXBkYXRlZC9pbXByb3ZlZCB2ZXJzaW9uIG9mIHRoZSBLb25lIHdpdGggbW9yZSBtZW1vcnkKKyAqIGFuZCBmdW5jdGlvbmFsaXR5IGFuZCB3aXRob3V0IHRoZSBub24tc3RhbmRhcmQgYmVoYXZpb3VycyB0aGUgS29uZSBoYWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImhpZC1pZHMuaCIKKyNpbmNsdWRlICJoaWQtcm9jY2F0LmgiCisjaW5jbHVkZSAiaGlkLXJvY2NhdC1rb25lcGx1cy5oIgorCitzdGF0aWMgdWludCBwcm9maWxlX251bWJlcnNbNV0gPSB7MCwgMSwgMiwgMywgNH07CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmtvbmVwbHVzX2NsYXNzOworCitzdGF0aWMgdm9pZCBrb25lcGx1c19wcm9maWxlX2FjdGl2YXRlZChzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cywKKwkJdWludCBuZXdfcHJvZmlsZSkKK3sKKwlrb25lcGx1cy0+YWN0dWFsX3Byb2ZpbGUgPSBuZXdfcHJvZmlsZTsKK30KKworc3RhdGljIGludCBrb25lcGx1c19zZW5kX2NvbnRyb2woc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgdmFsdWUsCisJCWVudW0ga29uZXBsdXNfY29udHJvbF9yZXF1ZXN0cyByZXF1ZXN0KQoreworCWludCBsZW47CisJc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wgKmNvbnRyb2w7CisKKwlpZiAoKHJlcXVlc3QgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfU0VUVElOR1MgfHwKKwkJCXJlcXVlc3QgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfQlVUVE9OUykgJiYKKwkJCXZhbHVlID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb250cm9sID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRyb2wpCisJCXJldHVybiAtRU5PTUVNOworCisJY29udHJvbC0+Y29tbWFuZCA9IEtPTkVQTFVTX0NPTU1BTkRfQ09OVFJPTDsKKwljb250cm9sLT52YWx1ZSA9IHZhbHVlOworCWNvbnRyb2wtPnJlcXVlc3QgPSByZXF1ZXN0OworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCVVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sCisJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCUtPTkVQTFVTX1VTQl9DT01NQU5EX0NPTlRST0wsIDAsIGNvbnRyb2wsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpLAorCQkJVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCisJa2ZyZWUoY29udHJvbCk7CisKKwlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCkpCisJCXJldHVybiBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrb25lcGx1c19yZWNlaXZlKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IHVzYl9jb21tYW5kLAorCQl2b2lkICpidWYsIHVpbnQgc2l6ZSkgeworCWludCBsZW47CisKKwlsZW4gPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJVVNCX1JFUV9DTEVBUl9GRUFUVVJFLAorCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9JTiwKKwkJCXVzYl9jb21tYW5kLCAwLCBidWYsIHNpemUsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCXJldHVybiAobGVuICE9IHNpemUpID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcmVjZWl2ZV9jb250cm9sX3N0YXR1cyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBrb25lcGx1c19jb250cm9sICpjb250cm9sOworCisJY29udHJvbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250cm9sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvIHsKKwkJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZSh1c2JfZGV2LCBLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MLAorCQkJCWNvbnRyb2wsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCkpOworCisJCS8qIGNoZWNrIGlmIHdlIGdldCBhIGNvbXBsZXRlbHkgd3JvbmcgYW5zd2VyICovCisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKworCQlpZiAoY29udHJvbC0+dmFsdWUgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PSykgeworCQkJcmV0dmFsID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogaW5kaWNhdGVzIHRoYXQgaGFyZHdhcmUgbmVlZHMgc29tZSBtb3JlIHRpbWUgdG8gY29tcGxldGUgYWN0aW9uICovCisJCWlmIChjb250cm9sLT52YWx1ZSA9PSBLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTX1dBSVQpIHsKKwkJCW1zbGVlcCg1MDApOyAvKiB3aW5kb3dzIGRyaXZlciB1c2VzIDEwMDAgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc2VlbXMgdG8gYmUgY3JpdGljYWwgLSByZXBsdWcgbmVjZXNzYXJ5ICovCisJCWlmIChjb250cm9sLT52YWx1ZSA9PSBLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTX09WRVJMT0FEKSB7CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkZXZfZXJyKCZ1c2JfZGV2LT5kZXYsICJrb25lcGx1c19yZWNlaXZlX2NvbnRyb2xfc3RhdHVzOiAiCisJCQkJInVua25vd24gcmVzcG9uc2UgdmFsdWUgMHgleFxuIiwgY29udHJvbC0+dmFsdWUpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKworCX0gd2hpbGUgKDEpOworb3V0OgorCWtmcmVlKGNvbnRyb2wpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2VuZChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCBjb21tYW5kLAorCQl2b2lkICpidWYsIHVpbnQgc2l6ZSkgeworCWludCBsZW47CisKKwlsZW4gPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwKKwkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAorCQkJY29tbWFuZCwgMCwgYnVmLCBzaXplLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwlpZiAobGVuICE9IHNpemUpCisJCXJldHVybiAtRUlPOworCisJaWYgKGtvbmVwbHVzX3JlY2VpdmVfY29udHJvbF9zdGF0dXModXNiX2RldikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2VsZWN0X3Byb2ZpbGUoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgbnVtYmVyLAorCQllbnVtIGtvbmVwbHVzX2NvbnRyb2xfcmVxdWVzdHMgcmVxdWVzdCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0ga29uZXBsdXNfc2VuZF9jb250cm9sKHVzYl9kZXYsIG51bWJlciwgcmVxdWVzdCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIGFsbG93IHRpbWUgdG8gc2V0dGxlIHRoaW5ncyAtIHdpbmRvd3MgZHJpdmVyIHVzZXMgNTAwICovCisJbXNsZWVwKDEwMCk7CisKKwlyZXR2YWwgPSBrb25lcGx1c19yZWNlaXZlX2NvbnRyb2xfc3RhdHVzKHVzYl9kZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrb25lcGx1c19nZXRfaW5mbyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJc3RydWN0IGtvbmVwbHVzX2luZm8gKmJ1ZikKK3sKKwlyZXR1cm4ga29uZXBsdXNfcmVjZWl2ZSh1c2JfZGV2LCBLT05FUExVU19VU0JfQ09NTUFORF9JTkZPLAorCQkJYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2luZm8pKTsKK30KKworc3RhdGljIGludCBrb25lcGx1c19nZXRfcHJvZmlsZV9zZXR0aW5ncyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgKmJ1ZiwgdWludCBudW1iZXIpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGtvbmVwbHVzX3NlbGVjdF9wcm9maWxlKHVzYl9kZXYsIG51bWJlciwKKwkJCUtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX1NFVFRJTkdTKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywKKwkJCWJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2V0X3Byb2ZpbGVfc2V0dGluZ3Moc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzIGNvbnN0ICpzZXR0aW5ncykKK3sKKwlyZXR1cm4ga29uZXBsdXNfc2VuZCh1c2JfZGV2LCBLT05FUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTLAorCQkJKHZvaWQgKilzZXR0aW5ncywgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X3Byb2ZpbGVfYnV0dG9ucyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyAqYnVmLCBpbnQgbnVtYmVyKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBrb25lcGx1c19zZWxlY3RfcHJvZmlsZSh1c2JfZGV2LCBudW1iZXIsCisJCQlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfUFJPRklMRV9CVVRUT05TKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TLAorCQkJYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NldF9wcm9maWxlX2J1dHRvbnMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgY29uc3QgKmJ1dHRvbnMpCit7CisJcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TLAorCQkJKHZvaWQgKilidXR0b25zLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOworfQorCisvKiByZXR2YWwgaXMgMC00IG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvciAqLworc3RhdGljIGludCBrb25lcGx1c19nZXRfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCXN0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUgKmJ1ZjsKKwlpbnQgcmV0dmFsOworCisJYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSksIEdGUF9LRVJORUwpOworCisJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZSh1c2JfZGV2LCBLT05FUExVU19VU0JfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEUsCisJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlKSk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGJ1Zi0+c3RhcnR1cF9wcm9maWxlOworb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBrb25lcGx1c19zZXRfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlpbnQgc3RhcnR1cF9wcm9maWxlKQoreworCXN0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUgYnVmOworCisJYnVmLmNvbW1hbmQgPSBLT05FUExVU19DT01NQU5EX1NUQVJUVVBfUFJPRklMRTsKKwlidWYuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlKTsKKwlidWYuc3RhcnR1cF9wcm9maWxlID0gc3RhcnR1cF9wcm9maWxlOworCisJcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFLAorCQkJKGNoYXIgKikmYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19yZWFkKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LAorCQlzaXplX3QgcmVhbF9zaXplLCB1aW50IGNvbW1hbmQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCWludCByZXR2YWw7CisKKwlpZiAob2ZmICE9IDAgfHwgY291bnQgIT0gcmVhbF9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlyZXR2YWwgPSBrb25lcGx1c19yZWNlaXZlKHVzYl9kZXYsIGNvbW1hbmQsIGJ1ZiwgcmVhbF9zaXplKTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gcmVhbF9zaXplOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc193cml0ZShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQl2b2lkIGNvbnN0ICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwKKwkJc2l6ZV90IHJlYWxfc2l6ZSwgdWludCBjb21tYW5kKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKG9mZiAhPSAwIHx8IGNvdW50ICE9IHJlYWxfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJcmV0dmFsID0ga29uZXBsdXNfc2VuZCh1c2JfZGV2LCBjb21tYW5kLCAodm9pZCAqKWJ1ZiwgcmVhbF9zaXplKTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gcmVhbF9zaXplOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc193cml0ZV9tYWNybyhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX21hY3JvKSwgS09ORVBMVVNfVVNCX0NPTU1BTkRfTUFDUk8pOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19yZWFkX3NlbnNvcihzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3JlYWQoZnAsIGtvYmosIGJ1Ziwgb2ZmLCBjb3VudCwKKwkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfc2Vuc29yKSwgS09ORVBMVVNfVVNCX0NPTU1BTkRfU0VOU09SKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfc2Vuc29yKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4ga29uZXBsdXNfc3lzZnNfd3JpdGUoZnAsIGtvYmosIGJ1Ziwgb2ZmLCBjb3VudCwKKwkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfc2Vuc29yKSwgS09ORVBMVVNfVVNCX0NPTU1BTkRfU0VOU09SKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfdGN1KHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4ga29uZXBsdXNfc3lzZnNfd3JpdGUoZnAsIGtvYmosIGJ1Ziwgb2ZmLCBjb3VudCwKKwkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfdGN1KSwgS09ORVBMVVNfVVNCX0NPTU1BTkRfVENVKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZF90Y3VfaW1hZ2Uoc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBrb25lcGx1c19zeXNmc19yZWFkKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdV9pbWFnZSksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKworCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2ZmICsgY291bnQgPiBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpKQorCQljb3VudCA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykgLSBvZmY7CisKKwltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJbWVtY3B5KGJ1ZiwgKCh2b2lkIGNvbnN0ICopJmtvbmVwbHVzLT5wcm9maWxlX3NldHRpbmdzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAorCQkJY291bnQpOworCW11dGV4X3VubG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc193cml0ZV9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGRpZmZlcmVuY2U7CisJaW50IHByb2ZpbGVfbnVtYmVyOworCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzICpwcm9maWxlX3NldHRpbmdzOworCisJaWYgKG9mZiAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvZmlsZV9udW1iZXIgPSAoKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzIGNvbnN0ICopYnVmKS0+bnVtYmVyOworCXByb2ZpbGVfc2V0dGluZ3MgPSAma29uZXBsdXMtPnByb2ZpbGVfc2V0dGluZ3NbcHJvZmlsZV9udW1iZXJdOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCWRpZmZlcmVuY2UgPSBtZW1jbXAoYnVmLCBwcm9maWxlX3NldHRpbmdzLAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSk7CisJaWYgKGRpZmZlcmVuY2UpIHsKKwkJcmV0dmFsID0ga29uZXBsdXNfc2V0X3Byb2ZpbGVfc2V0dGluZ3ModXNiX2RldiwKKwkJCQkoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgY29uc3QgKilidWYpOworCQlpZiAoIXJldHZhbCkKKwkJCW1lbWNweShwcm9maWxlX3NldHRpbmdzLCBidWYsCisJCQkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworCX0KKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisKKwlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2ZmICsgY291bnQgPiBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpCisJCWNvdW50ID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpIC0gb2ZmOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCW1lbWNweShidWYsICgodm9pZCBjb25zdCAqKSZrb25lcGx1cy0+cHJvZmlsZV9idXR0b25zWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAorCQkJY291bnQpOworCW11dGV4X3VubG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc193cml0ZV9wcm9maWxlX2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgZGlmZmVyZW5jZTsKKwl1aW50IHByb2ZpbGVfbnVtYmVyOworCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgKnByb2ZpbGVfYnV0dG9uczsKKworCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvZmlsZV9udW1iZXIgPSAoKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgY29uc3QgKilidWYpLT5udW1iZXI7CisJcHJvZmlsZV9idXR0b25zID0gJmtvbmVwbHVzLT5wcm9maWxlX2J1dHRvbnNbcHJvZmlsZV9udW1iZXJdOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCWRpZmZlcmVuY2UgPSBtZW1jbXAoYnVmLCBwcm9maWxlX2J1dHRvbnMsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOworCWlmIChkaWZmZXJlbmNlKSB7CisJCXJldHZhbCA9IGtvbmVwbHVzX3NldF9wcm9maWxlX2J1dHRvbnModXNiX2RldiwKKwkJCQkoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyBjb25zdCAqKWJ1Zik7CisJCWlmICghcmV0dmFsKQorCQkJbWVtY3B5KHByb2ZpbGVfYnV0dG9ucywgYnVmLAorCQkJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpOworCX0KKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmVwbHVzLT5zdGFydHVwX3Byb2ZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXM7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJdW5zaWduZWQgbG9uZyBwcm9maWxlOworCWludCByZXR2YWw7CisKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwl1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCisJcmV0dmFsID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnByb2ZpbGUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJcmV0dmFsID0ga29uZXBsdXNfc2V0X3N0YXJ0dXBfcHJvZmlsZSh1c2JfZGV2LCBwcm9maWxlKTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3Nob3dfYWN0dWFsX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lcGx1cy0+YWN0dWFsX3Byb2ZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lcGx1cy0+aW5mby5maXJtd2FyZV92ZXJzaW9uKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGtvbmVwbHVzX2F0dHJpYnV0ZXNbXSA9IHsKKwlfX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNjYwLAorCQkJa29uZXBsdXNfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUsCisJCQlrb25lcGx1c19zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKSwKKwlfX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsCisJCQlrb25lcGx1c19zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlLCBOVUxMKSwKKwlfX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgMDQ0MCwKKwkJCWtvbmVwbHVzX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lcGx1c19iaW5fYXR0cmlidXRlc1tdID0geworCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInNlbnNvciIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfc2Vuc29yKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3NlbnNvciwKKwkJLndyaXRlID0ga29uZXBsdXNfc3lzZnNfd3JpdGVfc2Vuc29yCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJ0Y3UiLCAubW9kZSA9IDAyMjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdSksCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3RjdQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAidGN1X2ltYWdlIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3VfaW1hZ2UpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfdGN1X2ltYWdlCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlX3NldHRpbmdzIiwgLm1vZGUgPSAwMjIwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLndyaXRlID0ga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncworCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTFfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1swXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTJfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1sxXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTNfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1syXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTRfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1szXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTVfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1s0XQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9idXR0b25zIiwgLm1vZGUgPSAwMjIwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV9wcm9maWxlX2J1dHRvbnMKKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1X2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbNF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gIm1hY3JvIiwgLm1vZGUgPSAwMjIwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19tYWNybyksCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX21hY3JvCisJfSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIGludCBrb25lcGx1c19pbml0X2tvbmVwbHVzX2RldmljZV9zdHJ1Y3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzKQoreworCWludCByZXR2YWwsIGk7CisJc3RhdGljIHVpbnQgd2FpdCA9IDcwOyAvKiBkZXZpY2Ugd2lsbCBmcmVlemUgd2l0aCBqdXN0IDYwICovCisKKwltdXRleF9pbml0KCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlrb25lcGx1cy0+c3RhcnR1cF9wcm9maWxlID0ga29uZXBsdXNfZ2V0X3N0YXJ0dXBfcHJvZmlsZSh1c2JfZGV2KTsKKworCW1zbGVlcCh3YWl0KTsKKwlyZXR2YWwgPSBrb25lcGx1c19nZXRfaW5mbyh1c2JfZGV2LCAma29uZXBsdXMtPmluZm8pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisJCW1zbGVlcCh3YWl0KTsKKwkJcmV0dmFsID0ga29uZXBsdXNfZ2V0X3Byb2ZpbGVfc2V0dGluZ3ModXNiX2RldiwKKwkJCQkma29uZXBsdXMtPnByb2ZpbGVfc2V0dGluZ3NbaV0sIGkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQltc2xlZXAod2FpdCk7CisJCXJldHZhbCA9IGtvbmVwbHVzX2dldF9wcm9maWxlX2J1dHRvbnModXNiX2RldiwKKwkJCQkma29uZXBsdXMtPnByb2ZpbGVfYnV0dG9uc1tpXSwgaSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWtvbmVwbHVzX3Byb2ZpbGVfYWN0aXZhdGVkKGtvbmVwbHVzLCBrb25lcGx1cy0+c3RhcnR1cF9wcm9maWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX2luaXRfc3BlY2lhbHMoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1czsKKwlpbnQgcmV0dmFsOworCisJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbAorCQkJPT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkgeworCisJCWtvbmVwbHVzID0ga3phbGxvYyhzaXplb2YoKmtvbmVwbHVzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha29uZXBsdXMpIHsKKwkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBrb25lcGx1cyk7CisKKwkJcmV0dmFsID0ga29uZXBsdXNfaW5pdF9rb25lcGx1c19kZXZpY2Vfc3RydWN0KHVzYl9kZXYsIGtvbmVwbHVzKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycigmaGRldi0+ZGV2LAorCQkJCQkiY291bGRuJ3QgaW5pdCBzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlXG4iKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisKKwkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3Qoa29uZXBsdXNfY2xhc3MsIGhkZXYpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdCBjaGFyIGRldlxuIik7CisJCX0gZWxzZSB7CisJCQlrb25lcGx1cy0+Y2hyZGV2X21pbm9yID0gcmV0dmFsOworCQkJa29uZXBsdXMtPnJvY2NhdF9jbGFpbWVkID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gMDsKK2V4aXRfZnJlZToKKwlrZnJlZShrb25lcGx1cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQga29uZXBsdXNfcmVtb3ZlX3NwZWNpYWxzKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShoZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1czsKKworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wKKwkJCT09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpIHsKKwkJa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisJCWlmIChrb25lcGx1cy0+cm9jY2F0X2NsYWltZWQpCisJCQlyb2NjYXRfZGlzY29ubmVjdChrb25lcGx1cy0+Y2hyZGV2X21pbm9yKTsKKwkJa2ZyZWUoa29uZXBsdXMpOworCX0KK30KKworc3RhdGljIGludCBrb25lcGx1c19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBoaWRfcGFyc2UoaGRldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0dmFsID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXJldHZhbCA9IGtvbmVwbHVzX2luaXRfc3BlY2lhbHMoaGRldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKKwkJZ290byBleGl0X3N0b3A7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfc3RvcDoKKwloaWRfaHdfc3RvcChoZGV2KTsKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQga29uZXBsdXNfcmVtb3ZlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCWtvbmVwbHVzX3JlbW92ZV9zcGVjaWFscyhoZGV2KTsKKwloaWRfaHdfc3RvcChoZGV2KTsKK30KKworc3RhdGljIHZvaWQga29uZXBsdXNfa2VlcF92YWx1ZXNfdXBfdG9fZGF0ZShzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cywKKwkJdTggY29uc3QgKmRhdGEpCit7CisJc3RydWN0IGtvbmVwbHVzX21vdXNlX3JlcG9ydF9idXR0b24gY29uc3QgKmJ1dHRvbl9yZXBvcnQ7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIEtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQlVUVE9OOgorCQlidXR0b25fcmVwb3J0ID0gKHN0cnVjdCBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uIGNvbnN0ICopZGF0YTsKKwkJc3dpdGNoIChidXR0b25fcmVwb3J0LT50eXBlKSB7CisJCWNhc2UgS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1BST0ZJTEU6CisJCQlrb25lcGx1c19wcm9maWxlX2FjdGl2YXRlZChrb25lcGx1cywgYnV0dG9uX3JlcG9ydC0+ZGF0YTEgLSAxKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQga29uZXBsdXNfcmVwb3J0X3RvX2NocmRldihzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlIGNvbnN0ICprb25lcGx1cywKKwkJdTggY29uc3QgKmRhdGEpCit7CisJc3RydWN0IGtvbmVwbHVzX3JvY2NhdF9yZXBvcnQgcm9jY2F0X3JlcG9ydDsKKwlzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiBjb25zdCAqYnV0dG9uX3JlcG9ydDsKKworCWlmIChkYXRhWzBdICE9IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQlVUVE9OKQorCQlyZXR1cm47CisKKwlidXR0b25fcmVwb3J0ID0gKHN0cnVjdCBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uIGNvbnN0ICopZGF0YTsKKworCWlmICgoYnV0dG9uX3JlcG9ydC0+dHlwZSA9PSBLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfUVVJQ0tMQVVOQ0ggfHwKKwkJCWJ1dHRvbl9yZXBvcnQtPnR5cGUgPT0gS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1RJTUVSKSAmJgorCQkJYnV0dG9uX3JlcG9ydC0+ZGF0YTIgIT0gS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9BQ1RJT05fUFJFU1MpCisJCXJldHVybjsKKworCXJvY2NhdF9yZXBvcnQudHlwZSA9IGJ1dHRvbl9yZXBvcnQtPnR5cGU7CisJcm9jY2F0X3JlcG9ydC5kYXRhMSA9IGJ1dHRvbl9yZXBvcnQtPmRhdGExOworCXJvY2NhdF9yZXBvcnQuZGF0YTIgPSBidXR0b25fcmVwb3J0LT5kYXRhMjsKKwlyb2NjYXRfcmVwb3J0LnByb2ZpbGUgPSBrb25lcGx1cy0+YWN0dWFsX3Byb2ZpbGUgKyAxOworCXJvY2NhdF9yZXBvcnRfZXZlbnQoa29uZXBsdXMtPmNocmRldl9taW5vciwKKwkJCSh1aW50OF90IGNvbnN0ICopJnJvY2NhdF9yZXBvcnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3JvY2NhdF9yZXBvcnQpKTsKK30KKworc3RhdGljIGludCBrb25lcGx1c19yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsIHU4ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCisJCQkhPSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKQorCQlyZXR1cm4gMDsKKworCWtvbmVwbHVzX2tlZXBfdmFsdWVzX3VwX3RvX2RhdGUoa29uZXBsdXMsIGRhdGEpOworCisJaWYgKGtvbmVwbHVzLT5yb2NjYXRfY2xhaW1lZCkKKwkJa29uZXBsdXNfcmVwb3J0X3RvX2NocmRldihrb25lcGx1cywgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGtvbmVwbHVzX2RldmljZXNbXSA9IHsKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUk9DQ0FULCBVU0JfREVWSUNFX0lEX1JPQ0NBVF9LT05FUExVUykgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBrb25lcGx1c19kZXZpY2VzKTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGtvbmVwbHVzX2RyaXZlciA9IHsKKwkJLm5hbWUgPSAia29uZXBsdXMiLAorCQkuaWRfdGFibGUgPSBrb25lcGx1c19kZXZpY2VzLAorCQkucHJvYmUgPSBrb25lcGx1c19wcm9iZSwKKwkJLnJlbW92ZSA9IGtvbmVwbHVzX3JlbW92ZSwKKwkJLnJhd19ldmVudCA9IGtvbmVwbHVzX3Jhd19ldmVudAorfTsKKworc3RhdGljIGludCBfX2luaXQga29uZXBsdXNfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiBjbGFzcyBuYW1lIGhhcyB0byBiZSBzYW1lIGFzIGRyaXZlciBuYW1lICovCisJa29uZXBsdXNfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJrb25lcGx1cyIpOworCWlmIChJU19FUlIoa29uZXBsdXNfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUihrb25lcGx1c19jbGFzcyk7CisJa29uZXBsdXNfY2xhc3MtPmRldl9hdHRycyA9IGtvbmVwbHVzX2F0dHJpYnV0ZXM7CisJa29uZXBsdXNfY2xhc3MtPmRldl9iaW5fYXR0cnMgPSBrb25lcGx1c19iaW5fYXR0cmlidXRlczsKKworCXJldHZhbCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmtvbmVwbHVzX2RyaXZlcik7CisJaWYgKHJldHZhbCkKKwkJY2xhc3NfZGVzdHJveShrb25lcGx1c19jbGFzcyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGtvbmVwbHVzX2V4aXQodm9pZCkKK3sKKwljbGFzc19kZXN0cm95KGtvbmVwbHVzX2NsYXNzKTsKKwloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmtvbmVwbHVzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGtvbmVwbHVzX2luaXQpOworbW9kdWxlX2V4aXQoa29uZXBsdXNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZWZhbiBBY2hhdHoiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVVNCIFJvY2NhdCBLb25lWytdIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5oIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmgKQEAgLTAsMCArMSwyMjQgQEAKKyNpZm5kZWYgX19ISURfUk9DQ0FUX0tPTkVQTFVTX0gKKyNkZWZpbmUgX19ISURfUk9DQ0FUX0tPTkVQTFVTX0gKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogY2FzZSAxOiB3cml0ZXMgcmVxdWVzdCA4MCBhbmQgcmVhZHMgdmFsdWUgMQorICoKKyAqLworc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9DT05UUk9MICovCisJLyoKKwkgKiB2YWx1ZSBpcyBwcm9maWxlIG51bWJlciBpbiByYW5nZSAwLTQgZm9yIHJlcXVlc3Rpbmcgc2V0dGluZ3MgYW5kIGJ1dHRvbnMKKwkgKiAxIGlmIHN0YXR1cyBvayBmb3IgcmVxdWVzdGluZyBzdGF0dXMKKwkgKi8KKwl1aW50OF90IHZhbHVlOworCXVpbnQ4X3QgcmVxdWVzdDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworZW51bSBrb25lcGx1c19jb250cm9sX3JlcXVlc3RzIHsKKwlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTID0gMHgwMCwKKwlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfUFJPRklMRV9TRVRUSU5HUyA9IDB4ODAsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfQlVUVE9OUyA9IDB4OTAsCit9OworCitlbnVtIGtvbmVwbHVzX2NvbnRyb2xfdmFsdWVzIHsKKwlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTX09WRVJMT0FEID0gMCwKKwlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTX09LID0gMSwKKwlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfU1RBVFVTX1dBSVQgPSAzLAorfTsKKworc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSB7CisJdWludDhfdCBjb21tYW5kOyAvKiBLT05FUExVU19DT01NQU5EX1NUQVJUVVBfUFJPRklMRSAqLworCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDMgKi8KKwl1aW50OF90IHN0YXJ0dXBfcHJvZmlsZTsgLyogUmFuZ2UgMC00ISAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyB7CisJdWludDhfdCBjb21tYW5kOyAvKiBLT05FUExVU19DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyA0MyAqLworCXVpbnQ4X3QgbnVtYmVyOyAvKiByYW5nZSAwLTQgKi8KKwl1aW50OF90IGFkdmFuY2VkX3NlbnNpdGl2aXR5OworCXVpbnQ4X3Qgc2Vuc2l0aXZpdHlfeDsKKwl1aW50OF90IHNlbnNpdGl2aXR5X3k7CisJdWludDhfdCBjcGlfbGV2ZWxzX2VuYWJsZWQ7CisJdWludDhfdCBjcGlfbGV2ZWxzX3hbNV07CisJdWludDhfdCBjcGlfc3RhcnR1cF9sZXZlbDsgLyogcmFuZ2UgMC00ICovCisJdWludDhfdCBjcGlfbGV2ZWxzX3lbNV07IC8qIHJhbmdlIDEtNjAgbWVhbnMgMTAwLTYwMDAgY3BpICovCisJdWludDhfdCB1bmtub3duMTsKKwl1aW50OF90IHBvbGxpbmdfcmF0ZTsKKwl1aW50OF90IGxpZ2h0c19lbmFibGVkOworCXVpbnQ4X3QgbGlnaHRfZWZmZWN0X21vZGU7CisJdWludDhfdCBjb2xvcl9mbG93X2VmZmVjdDsKKwl1aW50OF90IGxpZ2h0X2VmZmVjdF90eXBlOworCXVpbnQ4X3QgbGlnaHRfZWZmZWN0X3NwZWVkOworCXVpbnQ4X3QgbGlnaHRzWzE2XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucyB7CisJdWludDhfdCBjb21tYW5kOyAvKiBLT05FUExVU19DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyAqLworCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDc3ICovCisJdWludDhfdCBudW1iZXI7IC8qIHJhbmdlIDAtNCAqLworCXVpbnQ4X3QgZGF0YVs3Ml07CisJdWludDE2X3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19tYWNybyB7CisJdWludDhfdCBjb21tYW5kOyAvKiBLT05FUExVU19DT01NQU5EX01BQ1JPICovCisJdWludDE2X3Qgc2l6ZTsgLyogYWx3YXlzIDB4ODIyIGxpdHRsZSBlbmRpYW4gKi8KKwl1aW50OF90IHByb2ZpbGU7IC8qIHJhbmdlIDAtNCAqLworCXVpbnQ4X3QgYnV0dG9uOyAvKiByYW5nZSAwLTIzICovCisJdWludDhfdCBkYXRhWzIwNzVdOworCXVpbnQxNl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfaW5mbyB7CisJdWludDhfdCBjb21tYW5kOyAvKiBLT05FUExVU19DT01NQU5EX0lORk8gKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyA2ICovCisJdWludDhfdCBmaXJtd2FyZV92ZXJzaW9uOworCXVpbnQ4X3QgdW5rbm93blszXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2UgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9FICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgMyAqLworCXVpbnQ4X3QgdW5rbm93bjsgLyogVE9ETyAxOyAwIGJlZm9yZSBmaXJtd2FyZSB1cGRhdGUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3NlbnNvciB7CisJdWludDhfdCBjb21tYW5kOyAgLyogS09ORVBMVVNfQ09NTUFORF9TRU5TT1IgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyA2ICovCisJdWludDhfdCBkYXRhWzRdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfZmlybXdhcmVfd3JpdGUgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURSAqLworCXVpbnQ4X3QgdW5rbm93blsxMDI1XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2Zpcm13YXJlX3dyaXRlX2NvbnRyb2wgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURV9DT05UUk9MICovCisJLyoKKwkgKiB2YWx1ZSBpcyAxIG9uIHN1Y2Nlc3MKKwkgKiAzIG1lYW5zICJub3QgZmluaXNoZWQgeWV0IgorCSAqLworCXVpbnQ4X3QgdmFsdWU7CisJdWludDhfdCB1bmtub3duOyAvKiBhbHdheXMgMHg3NSAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfdGN1IHsKKwl1aW50MTZfdCB1c2JfY29tbWFuZDsgLyogS09ORVBMVVNfVVNCX0NPTU1BTkRfVENVICovCisJdWludDhfdCBkYXRhWzJdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfdGN1X2ltYWdlIHsKKwl1aW50MTZfdCB1c2JfY29tbWFuZDsgLyogS09ORVBMVVNfVVNCX0NPTU1BTkRfVENVICovCisJdWludDhfdCBkYXRhWzEwMjRdOworCXVpbnQxNl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitlbnVtIGtvbmVwbHVzX2NvbW1hbmRzIHsKKwlLT05FUExVU19DT01NQU5EX0NPTlRST0wgPSAweDQsCisJS09ORVBMVVNfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEUgPSAweDUsCisJS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTID0gMHg2LAorCUtPTkVQTFVTX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TID0gMHg3LAorCUtPTkVQTFVTX0NPTU1BTkRfTUFDUk8gPSAweDgsCisJS09ORVBMVVNfQ09NTUFORF9JTkZPID0gMHg5LAorCUtPTkVQTFVTX0NPTU1BTkRfRSA9IDB4ZSwKKwlLT05FUExVU19DT01NQU5EX1NFTlNPUiA9IDB4ZiwKKwlLT05FUExVU19DT01NQU5EX0ZJUk1XQVJFX1dSSVRFID0gMHgxYiwKKwlLT05FUExVU19DT01NQU5EX0ZJUk1XQVJFX1dSSVRFX0NPTlRST0wgPSAweDFjLAorfTsKKworZW51bSBrb25lcGx1c191c2JfY29tbWFuZHMgeworCUtPTkVQTFVTX1VTQl9DT01NQU5EX0NPTlRST0wgPSAweDMwNCwKKwlLT05FUExVU19VU0JfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEUgPSAweDMwNSwKKwlLT05FUExVU19VU0JfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTID0gMHgzMDYsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TID0gMHgzMDcsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfTUFDUk8gPSAweDMwOCwKKwlLT05FUExVU19VU0JfQ09NTUFORF9JTkZPID0gMHgzMDksCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfVENVID0gMHgzMGMsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfRSA9IDB4MzBlLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUiA9IDB4MzBmLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX0ZJUk1XQVJFX1dSSVRFID0gMHgzMWIsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfRklSTVdBUkVfV1JJVEVfQ09OVFJPTCA9IDB4MzFjLAorfTsKKworZW51bSBrb25lcGx1c19tb3VzZV9yZXBvcnRfbnVtYmVycyB7CisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX05VTUJFUl9ISUQgPSAxLAorCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQVVESU8gPSAyLAorCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfQlVUVE9OID0gMywKK307CisKK3N0cnVjdCBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uIHsKKwl1aW50OF90IHJlcG9ydF9udW1iZXI7IC8qIGFsd2F5cyBLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTiAqLworCXVpbnQ4X3QgemVybzE7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgZGF0YTE7CisJdWludDhfdCBkYXRhMjsKKwl1aW50OF90IHplcm8yOworCXVpbnQ4X3QgdW5rbm93blsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworZW51bSBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uX3R5cGVzIHsKKwkvKiBkYXRhMSA9IG5ldyBwcm9maWxlIHJhbmdlIDEtNSAqLworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9QUk9GSUxFID0gMHgyMCwKKworCS8qIGRhdGExID0gYnV0dG9uIG51bWJlciByYW5nZSAxLTI0OyBkYXRhMiA9IGFjdGlvbiAqLworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9RVUlDS0xBVU5DSCA9IDB4NjAsCisKKwkvKiBkYXRhMSA9IGJ1dHRvbiBudW1iZXIgcmFuZ2UgMS0yNDsgZGF0YTIgPSBhY3Rpb24gKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfVElNRVIgPSAweDgwLAorCisJLyogZGF0YTEgPSBzZXR0aW5nIG51bWJlciByYW5nZSAxLTUgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfQ1BJID0gMHhiMCwKKworCS8qIGRhdGExIGFuZCBkYXRhMiA9IHJhbmdlIDB4MS0weGIgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfU0VOU0lUSVZJVFkgPSAweGMwLAorCisJLyogZGF0YTEgPSAyMiA9IG5leHQgdHJhY2suLi4KKwkgKiBkYXRhMiA9IGFjdGlvbgorCSAqLworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9NVUxUSU1FRElBID0gMHhmMCwKK307CisKK2VudW0ga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbl9hY3Rpb24geworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fQUNUSU9OX1BSRVNTID0gMCwKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX0FDVElPTl9SRUxFQVNFID0gMSwKK307CisKK3N0cnVjdCBrb25lcGx1c19yb2NjYXRfcmVwb3J0IHsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCBkYXRhMTsKKwl1aW50OF90IGRhdGEyOworCXVpbnQ4X3QgcHJvZmlsZTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2RldmljZSB7CisJaW50IGFjdHVhbF9wcm9maWxlOworCisJaW50IHJvY2NhdF9jbGFpbWVkOworCWludCBjaHJkZXZfbWlub3I7CisKKwlzdHJ1Y3QgbXV0ZXgga29uZXBsdXNfbG9jazsKKworCWludCBzdGFydHVwX3Byb2ZpbGU7CisJc3RydWN0IGtvbmVwbHVzX2luZm8gaW5mbzsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBwcm9maWxlX3NldHRpbmdzWzVdOworCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgcHJvZmlsZV9idXR0b25zWzVdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5jCmluZGV4IDliZjIzMDQuLjAyYzU4ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5jCkBAIC0yNyw2ICsyNywxMSBAQAogI2luY2x1ZGUgImhpZC1yb2NjYXQuaCIKICNpbmNsdWRlICJoaWQtcm9jY2F0LXB5cmEuaCIKIAorc3RhdGljIHVpbnQgcHJvZmlsZV9udW1iZXJzWzVdID0gezAsIDEsIDIsIDMsIDR9OworCisvKiBweXJhX2NsYXNzIGlzIHVzZWQgZm9yIGNyZWF0aW5nIHN5c2ZzIGF0dHJpYnV0ZXMgdmlhIHJvY2NhdCBjaGFyIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBjbGFzcyAqcHlyYV9jbGFzczsKKwogc3RhdGljIHZvaWQgcHJvZmlsZV9hY3RpdmF0ZWQoc3RydWN0IHB5cmFfZGV2aWNlICpweXJhLAogCQl1bnNpZ25lZCBpbnQgbmV3X3Byb2ZpbGUpCiB7CkBAIC04Nyw5ICs5Miw4IEBACiAJCQljb250cm9sLnZhbHVlID09IDEpCiAJCQlyZXR1cm4gMDsKIAllbHNlIHsKLQkJZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAicmVjZWl2ZSBjb250cm9sIHN0YXR1czogIgotCQkJCSJ1bmtub3duIHJlc3BvbnNlIDB4JXggMHgleFxuIiwKLQkJCQljb250cm9sLnJlcXVlc3QsIGNvbnRyb2wudmFsdWUpOworCQloaWRfZXJyKHVzYl9kZXYsICJyZWNlaXZlIGNvbnRyb2wgc3RhdHVzOiB1bmtub3duIHJlc3BvbnNlIDB4JXggMHgleFxuIiwKKwkJCWNvbnRyb2wucmVxdWVzdCwgY29udHJvbC52YWx1ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KQEAgLTIyMSw5ICsyMjUsMTAgQEAKIAogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKIAkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwgaW50IG51bWJlcikKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCiAJaWYgKG9mZiA+PSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncykpCkBAIC0yMzMsNTggKzIzOCwxOSBAQAogCQljb3VudCA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSAtIG9mZjsKIAogCW11dGV4X2xvY2soJnB5cmEtPnB5cmFfbG9jayk7Ci0JbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJnB5cmEtPnByb2ZpbGVfc2V0dGluZ3NbbnVtYmVyXSkgKyBvZmYsCisJbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJnB5cmEtPnByb2ZpbGVfc2V0dGluZ3NbKih1aW50ICopKGF0dHItPnByaXZhdGUpXSkgKyBvZmYsCiAJCQljb3VudCk7CiAJbXV0ZXhfdW5sb2NrKCZweXJhLT5weXJhX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTFfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDApOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTJfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTRfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTVfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGludCBudW1iZXIpCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucykpCkBAIC0yOTQsNTggKzI2MCwxOSBAQAogCQljb3VudCA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMpIC0gb2ZmOwogCiAJbXV0ZXhfbG9jaygmcHlyYS0+cHlyYV9sb2NrKTsKLQltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikmcHlyYS0+cHJvZmlsZV9idXR0b25zW251bWJlcl0pICsgb2ZmLAorCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZweXJhLT5wcm9maWxlX2J1dHRvbnNbKih1aW50ICopKGF0dHItPnByaXZhdGUpXSkgKyBvZmYsCiAJCQljb3VudCk7CiAJbXV0ZXhfdW5sb2NrKCZweXJhLT5weXJhX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTFfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCi0JCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlM19idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTRfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCi0JCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNCk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsCiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CiAJaW50IHJldHZhbCA9IDA7CkBAIC0zODEsNyArMzA4LDggQEAKIAkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTQxNyw3ICszNDUsOCBAQAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCiAJaWYgKG9mZiA+PSBzaXplb2Yoc3RydWN0IHB5cmFfc2V0dGluZ3MpKQpAQCAtNDM3LDcgKzM2Niw4IEBACiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CiAJaW50IHJldHZhbCA9IDA7CkBAIC00NjksMjU1ICszOTksMTI1IEBACiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfYWN0dWFsX2NwaShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHB5cmEtPmFjdHVhbF9jcGkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfYWN0dWFsX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBweXJhLT5hY3R1YWxfcHJvZmlsZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcHlyYS0+ZmlybXdhcmVfdmVyc2lvbik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBweXJhLT5zZXR0aW5ncy5zdGFydHVwX3Byb2ZpbGUpOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoYWN0dWFsX2NwaSwgMDQ0MCwgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9jcGksIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihmaXJtd2FyZV92ZXJzaW9uLCAwNDQwLAotCQlweXJhX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihzdGFydHVwX3Byb2ZpbGUsIDA0NDAsCi0JCXB5cmFfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcHlyYV9hdHRyaWJ1dGVzW10gPSB7Ci0JCSZkZXZfYXR0cl9hY3R1YWxfY3BpLmF0dHIsCi0JCSZkZXZfYXR0cl9hY3R1YWxfcHJvZmlsZS5hdHRyLAotCQkmZGV2X2F0dHJfZmlybXdhcmVfdmVyc2lvbi5hdHRyLAotCQkmZGV2X2F0dHJfc3RhcnR1cF9wcm9maWxlLmF0dHIsCi0JCU5VTEwKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBweXJhX2F0dHJpYnV0ZXNbXSA9IHsKKwlfX0FUVFIoYWN0dWFsX2NwaSwgMDQ0MCwgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9jcGksIE5VTEwpLAorCV9fQVRUUihhY3R1YWxfcHJvZmlsZSwgMDQ0MCwgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlLCBOVUxMKSwKKwlfX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgMDQ0MCwKKwkJCXB5cmFfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uLCBOVUxMKSwKKwlfX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNDQwLAorCQkJcHlyYV9zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZSwgTlVMTCksCisJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHB5cmFfYXR0cmlidXRlX2dyb3VwID0gewotCQkuYXR0cnMgPSBweXJhX2F0dHJpYnV0ZXMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGVfc2V0dGluZ3NfYXR0ciA9IHsKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX2Jpbl9hdHRyaWJ1dGVzW10gPSB7CisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9zZXR0aW5ncyIsIC5tb2RlID0gMDIyMCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSwKIAkJLndyaXRlID0gcHlyYV9zeXNmc193cml0ZV9wcm9maWxlX3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlMV9zZXR0aW5nc19hdHRyID0geworCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTFfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlMl9zZXR0aW5nc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzBdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMl9zZXR0aW5ncyIsIC5tb2RlID0gMDQ0MCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTJfc2V0dGluZ3MKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUzX3NldHRpbmdzX2F0dHIgPSB7CisJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpLAotCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlM19zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTRfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1syXQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTRfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlNV9zZXR0aW5nc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzNdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNV9zZXR0aW5ncyIsIC5tb2RlID0gMDQ0MCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTVfc2V0dGluZ3MKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGVfYnV0dG9uc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlX2J1dHRvbnMiLCAubW9kZSA9IDAyMjAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKIAkJLndyaXRlID0gcHlyYV9zeXNmc193cml0ZV9wcm9maWxlX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUxX2J1dHRvbnNfYXR0ciA9IHsKKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTFfYnV0dG9ucwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTJfYnV0dG9uc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTJfYnV0dG9ucwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTNfYnV0dG9uc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzX2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfYnV0dG9ucwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTRfYnV0dG9uc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTRfYnV0dG9ucwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTVfYnV0dG9uc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1X2J1dHRvbnMiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTVfYnV0dG9ucwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJzZXR0aW5ncyIsIC5tb2RlID0gMDY2MCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9zZXR0aW5ncyksCiAJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3NldHRpbmdzLAogCQkud3JpdGUgPSBweXJhX3N5c2ZzX3dyaXRlX3NldHRpbmdzCisJfSwKKwlfX0FUVFJfTlVMTAogfTsKIAotc3RhdGljIGludCBweXJhX2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmcHlyYV9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8xOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGVfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzI7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzM7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzQ7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTNfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzU7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTRfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzY7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0Xzc7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZV9idXR0b25zX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF84OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUxX2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0Xzk7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTJfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTA7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTNfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTE7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTRfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTI7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfcHJvZmlsZTVfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTM7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLAotCQkJJnB5cmFfc2V0dGluZ3NfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzE0OwotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfMTQ6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTVfYnV0dG9uc19hdHRyKTsKLWV4aXRfMTM6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfYnV0dG9uc19hdHRyKTsKLWV4aXRfMTI6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTNfYnV0dG9uc19hdHRyKTsKLWV4aXRfMTE6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTJfYnV0dG9uc19hdHRyKTsKLWV4aXRfMTA6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfYnV0dG9uc19hdHRyKTsKLWV4aXRfOToKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlX2J1dHRvbnNfYXR0cik7Ci1leGl0Xzg6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0cik7Ci1leGl0Xzc6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzY6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTNfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzU6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzQ6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzM6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZV9zZXR0aW5nc19hdHRyKTsKLWV4aXRfMjoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmcHlyYV9hdHRyaWJ1dGVfZ3JvdXApOwotZXhpdF8xOgotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHB5cmFfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTVfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlNF9idXR0b25zX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTJfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlMV9idXR0b25zX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGVfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlNV9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlNF9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlM19zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlMl9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlMV9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlX3NldHRpbmdzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZweXJhX2F0dHJpYnV0ZV9ncm91cCk7Ci19Ci0KIHN0YXRpYyBpbnQgcHlyYV9pbml0X3B5cmFfZGV2aWNlX3N0cnVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhKQogewpAQCAtNzcwLDMxICs1NzAsMjQgQEAKIAogCQlweXJhID0ga3phbGxvYyhzaXplb2YoKnB5cmEpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFweXJhKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQloaWRfc2V0X2RydmRhdGEoaGRldiwgcHlyYSk7CiAKIAkJcmV0dmFsID0gcHlyYV9pbml0X3B5cmFfZGV2aWNlX3N0cnVjdCh1c2JfZGV2LCBweXJhKTsKIAkJaWYgKHJldHZhbCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LAotCQkJCQkiY291bGRuJ3QgaW5pdCBzdHJ1Y3QgcHlyYV9kZXZpY2VcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5pdCBzdHJ1Y3QgcHlyYV9kZXZpY2VcbiIpOwogCQkJZ290byBleGl0X2ZyZWU7CiAJCX0KIAotCQlyZXR2YWwgPSByb2NjYXRfY29ubmVjdChoZGV2KTsKKwkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3QocHlyYV9jbGFzcywgaGRldik7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0IGNoYXIgZGV2XG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOwogCQl9IGVsc2UgewogCQkJcHlyYS0+Y2hyZGV2X21pbm9yID0gcmV0dmFsOwogCQkJcHlyYS0+cm9jY2F0X2NsYWltZWQgPSAxOwogCQl9Ci0KLQkJcmV0dmFsID0gcHlyYV9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhpbnRmKTsKLQkJaWYgKHJldHZhbCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBzeXNmcyBmaWxlc1xuIik7Ci0JCQlnb3RvIGV4aXRfZnJlZTsKLQkJfQogCX0gZWxzZSB7CiAJCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKIAl9CkBAIC04MTIsNyArNjA1LDYgQEAKIAogCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wKIAkJCT09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpIHsKLQkJcHlyYV9yZW1vdmVfc3lzZnNfYXR0cmlidXRlcyhpbnRmKTsKIAkJcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKIAkJaWYgKHB5cmEtPnJvY2NhdF9jbGFpbWVkKQogCQkJcm9jY2F0X2Rpc2Nvbm5lY3QocHlyYS0+Y2hyZGV2X21pbm9yKTsKQEAgLTgyNiwxOSArNjE4LDE5IEBACiAKIAlyZXR2YWwgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJcmV0dmFsID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IHB5cmFfaW5pdF9zcGVjaWFscyhoZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNvdWxkbid0IGluc3RhbGwgbW91c2VcbiIpOworCQloaWRfZXJyKGhkZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKIAkJZ290byBleGl0X3N0b3A7CiAJfQogCXJldHVybiAwOwpAQCAtOTUyLDExICs3NDQsMjQgQEAKIAogc3RhdGljIGludCBfX2luaXQgcHlyYV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnB5cmFfZHJpdmVyKTsKKwlpbnQgcmV0dmFsOworCisJLyogY2xhc3MgbmFtZSBoYXMgdG8gYmUgc2FtZSBhcyBkcml2ZXIgbmFtZSAqLworCXB5cmFfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJweXJhIik7CisJaWYgKElTX0VSUihweXJhX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIocHlyYV9jbGFzcyk7CisJcHlyYV9jbGFzcy0+ZGV2X2F0dHJzID0gcHlyYV9hdHRyaWJ1dGVzOworCXB5cmFfY2xhc3MtPmRldl9iaW5fYXR0cnMgPSBweXJhX2Jpbl9hdHRyaWJ1dGVzOworCisJcmV0dmFsID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmcHlyYV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWNsYXNzX2Rlc3Ryb3kocHlyYV9jbGFzcyk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHB5cmFfZXhpdCh2b2lkKQogeworCWNsYXNzX2Rlc3Ryb3kocHlyYV9jbGFzcyk7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZweXJhX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmgKaW5kZXggMjJmODBhOC4uMTRjYmJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmgKQEAgLTE0LDE0ICsxNCwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI3ByYWdtYSBwYWNrKHB1c2gpCi0jcHJhZ21hIHBhY2soMSkKLQogc3RydWN0IHB5cmFfYiB7CiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfQiAqLwogCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDMgKi8KIAl1aW50OF90IHVua25vd247IC8qIDEgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX2NvbnRyb2wgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX0NPTlRST0wgKi8KQEAgLTMxLDcgKzI4LDcgQEAKIAkgKi8KIAl1aW50OF90IHZhbHVlOyAvKiBSYW5nZSAwLTQgKi8KIAl1aW50OF90IHJlcXVlc3Q7Ci19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBlbnVtIHB5cmFfY29udHJvbF9yZXF1ZXN0cyB7CiAJUFlSQV9DT05UUk9MX1JFUVVFU1RfU1RBVFVTID0gMHgwMCwKQEAgLTQzLDcgKzQwLDcgQEAKIAl1aW50OF90IGNvbW1hbmQ7IC8qIFBZUkFfQ09NTUFORF9TRVRUSU5HUyAqLwogCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDMgKi8KIAl1aW50OF90IHN0YXJ0dXBfcHJvZmlsZTsgLyogUmFuZ2UgMC00ISAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyB7CiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyAqLwpAQCAtNTgsNyArNTUsNyBAQAogCXVpbnQ4X3QgbGlnaHRfZWZmZWN0OwogCXVpbnQ4X3QgaGFuZGVkbmVzczsKIAl1aW50MTZfdCBjaGVja3N1bTsgLyogYnl0ZSBzdW0gKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyB7CiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfUFJPRklMRV9CVVRUT05TICovCkBAIC02Niw3ICs2Myw3IEBACiAJdWludDhfdCBudW1iZXI7IC8qIFJhbmdlIDAtNCAqLwogCXVpbnQ4X3QgYnV0dG9uc1sxNF07CiAJdWludDE2X3QgY2hlY2tzdW07IC8qIGJ5dGUgc3VtICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9pbmZvIHsKIAl1aW50OF90IGNvbW1hbmQ7IC8qIFBZUkFfQ09NTUFORF9JTkZPICovCkBAIC03NSw3ICs3Miw3IEBACiAJdWludDhfdCB1bmtub3duMTsgLyogYWx3YXlzIDAgKi8KIAl1aW50OF90IHVua25vd24yOyAvKiBhbHdheXMgMSAqLwogCXVpbnQ4X3QgdW5rbm93bjM7IC8qIGFsd2F5cyAwICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBlbnVtIHB5cmFfY29tbWFuZHMgewogCVBZUkFfQ09NTUFORF9DT05UUk9MID0gMHg0LApAQCAtMTA3LDEzICsxMDQsMTMgQEAKIAl1aW50OF90IHR5cGU7CiAJdWludDhfdCBkYXRhMTsKIAl1aW50OF90IGRhdGEyOwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHB5cmFfbW91c2VfZXZlbnRfYXVkaW8gewogCXVpbnQ4X3QgcmVwb3J0X251bWJlcjsgLyogYWx3YXlzIDIgKi8KIAl1aW50OF90IHR5cGU7CiAJdWludDhfdCB1bnVzZWQ7IC8qIGFsd2F5cyAwICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiAvKiBoaWQgYXVkaW8gY29udHJvbHMgKi8KIGVudW0gcHlyYV9tb3VzZV9ldmVudF9hdWRpb190eXBlcyB7CkBAIC0xNjcsOSArMTY0LDcgQEAKIAl1aW50OF90IHR5cGU7CiAJdWludDhfdCB2YWx1ZTsKIAl1aW50OF90IGtleTsKLX07Ci0KLSNwcmFnbWEgcGFjayhwb3ApCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX2RldmljZSB7CiAJaW50IGFjdHVhbF9wcm9maWxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5jCmluZGV4IDVhNjg3OWUuLmExNGM1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIEl0IGlzIGluc3BpcmVkIGJ5IGhpZHJhdywgYnV0IHVzZXMgb25seSBvbmUgY2lyY3VsYXIgYnVmZmVyIGZvciBhbGwgcmVhZGVycy4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC02NSw3ICs2Nyw2IEBACiB9OwogCiBzdGF0aWMgaW50IHJvY2NhdF9tYWpvcjsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnJvY2NhdF9jbGFzczsKIHN0YXRpYyBzdHJ1Y3QgY2RldiByb2NjYXRfY2RldjsKIAogc3RhdGljIHN0cnVjdCByb2NjYXRfZGV2aWNlICpkZXZpY2VzW1JPQ0NBVF9NQVhfREVWSUNFU107CkBAIC0xNjUsMjcgKzE2NiwyMiBAQAogCW11dGV4X2xvY2soJmRldmljZS0+cmVhZGVyc19sb2NrKTsKIAogCWlmICghZGV2aWNlKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJyb2NjYXQgZGV2aWNlIHdpdGggbWlub3IgJWQgZG9lc24ndCBleGlzdFxuIiwKLQkJCQltaW5vcik7CisJCXByX2VtZXJnKCJyb2NjYXQgZGV2aWNlIHdpdGggbWlub3IgJWQgZG9lc24ndCBleGlzdFxuIiwgbWlub3IpOwogCQllcnJvciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9lcnI7CiAJfQogCiAJaWYgKCFkZXZpY2UtPm9wZW4rKykgewogCQkvKiBwb3dlciBvbiBkZXZpY2Ugb24gYWRkaW5nIGZpcnN0IHJlYWRlciAqLwotCQlpZiAoZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIpIHsKLQkJCWVycm9yID0gZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2aWNlLT5oaWQsCi0JCQkJCVBNX0hJTlRfRlVMTE9OKTsKLQkJCWlmIChlcnJvciA8IDApIHsKLQkJCQktLWRldmljZS0+b3BlbjsKLQkJCQlnb3RvIGV4aXRfZXJyOwotCQkJfQotCQl9Ci0JCWVycm9yID0gZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+b3BlbihkZXZpY2UtPmhpZCk7CisJCWVycm9yID0gaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX0ZVTExPTik7CiAJCWlmIChlcnJvciA8IDApIHsKLQkJCWlmIChkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXZpY2UtPmhpZCwKLQkJCQkJCVBNX0hJTlRfTk9STUFMKTsKKwkJCS0tZGV2aWNlLT5vcGVuOworCQkJZ290byBleGl0X2VycjsKKwkJfQorCisJCWVycm9yID0gaGlkX2h3X29wZW4oZGV2aWNlLT5oaWQpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQloaWRfaHdfcG93ZXIoZGV2aWNlLT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKIAkJCS0tZGV2aWNlLT5vcGVuOwogCQkJZ290byBleGl0X2VycjsKIAkJfQpAQCAtMjE4LDggKzIxNCw3IEBACiAJZGV2aWNlID0gZGV2aWNlc1ttaW5vcl07CiAJaWYgKCFkZXZpY2UpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX2xvY2spOwotCQlwcmludGsoS0VSTl9FTUVSRyAicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsCi0JCQkJbWlub3IpOworCQlwcl9lbWVyZygicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsIG1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMzEsMTAgKzIyNiw4IEBACiAJaWYgKCEtLWRldmljZS0+b3BlbikgewogCQkvKiByZW1vdmluZyBsYXN0IHJlYWRlciAqLwogCQlpZiAoZGV2aWNlLT5leGlzdCkgewotCQkJaWYgKGRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKQotCQkJCWRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldmljZS0+aGlkLAotCQkJCQkJUE1fSElOVF9OT1JNQUwpOwotCQkJZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2aWNlLT5oaWQpOworCQkJaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CisJCQloaWRfaHdfY2xvc2UoZGV2aWNlLT5oaWQpOwogCQl9IGVsc2UgewogCQkJa2ZyZWUoZGV2aWNlKTsKIAkJfQpAQCAtMjk1LDEyICsyODgsMTQgQEAKIAogLyoKICAqIHJvY2NhdF9jb25uZWN0KCkgLSBjcmVhdGUgYSBjaGFyIGRldmljZSBmb3Igc3BlY2lhbCBldmVudCBvdXRwdXQKKyAqIEBjbGFzczogdGhlIGNsYXNzIHRoYXRzIHVzZWQgdG8gY3JlYXRlIHRoZSBkZXZpY2UuIE1lYW50IHRvIGhvbGQgZGV2aWNlCisgKiBzcGVjaWZpYyBzeXNmcyBhdHRyaWJ1dGVzLgogICogQGhpZDogdGhlIGhpZCBkZXZpY2UgdGhlIGNoYXIgZGV2aWNlIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8uCiAgKgogICogUmV0dXJuIHZhbHVlIGlzIG1pbm9yIGRldmljZSBudW1iZXIgaW4gUmFuZ2UgWzAsIFJPQ0NBVF9NQVhfREVWSUNFU10gb24KICAqIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK2ludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXVuc2lnbmVkIGludCBtaW5vcjsKIAlzdHJ1Y3Qgcm9jY2F0X2RldmljZSAqZGV2aWNlOwpAQCAtMzI2LDcgKzMyMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldmljZS0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShyb2NjYXRfY2xhc3MsICZoaWQtPmRldiwKKwlkZXZpY2UtPmRldiA9IGRldmljZV9jcmVhdGUoa2xhc3MsICZoaWQtPmRldiwKIAkJCU1LREVWKHJvY2NhdF9tYWpvciwgbWlub3IpLCBOVUxMLAogCQkJIiVzJXMlZCIsICJyb2NjYXQiLCBoaWQtPmRyaXZlci0+bmFtZSwgbWlub3IpOwogCkBAIC0zNjcsMTAgKzM2MiwxMCBAQAogCiAJZGV2aWNlLT5leGlzdCA9IDA7IC8qIFRPRE8gZXhpc3QgbWF5YmUgbm90IG5lZWRlZCAqLwogCi0JZGV2aWNlX2Rlc3Ryb3kocm9jY2F0X2NsYXNzLCBNS0RFVihyb2NjYXRfbWFqb3IsIG1pbm9yKSk7CisJZGV2aWNlX2Rlc3Ryb3koZGV2aWNlLT5kZXYtPmNsYXNzLCBNS0RFVihyb2NjYXRfbWFqb3IsIG1pbm9yKSk7CiAKIAlpZiAoZGV2aWNlLT5vcGVuKSB7Ci0JCWRldmljZS0+aGlkLT5sbF9kcml2ZXItPmNsb3NlKGRldmljZS0+aGlkKTsKKwkJaGlkX2h3X2Nsb3NlKGRldmljZS0+aGlkKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXZpY2UtPndhaXQpOwogCX0gZWxzZSB7CiAJCWtmcmVlKGRldmljZSk7CkBAIC0zOTgsMTQgKzM5Myw3IEBACiAJcm9jY2F0X21ham9yID0gTUFKT1IoZGV2X2lkKTsKIAogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInJvY2NhdDogY2FuJ3QgZ2V0IG1ham9yIG51bWJlclxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0Jcm9jY2F0X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAicm9jY2F0Iik7Ci0JaWYgKElTX0VSUihyb2NjYXRfY2xhc3MpKSB7Ci0JCXJldHZhbCA9IFBUUl9FUlIocm9jY2F0X2NsYXNzKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldl9pZCwgUk9DQ0FUX01BWF9ERVZJQ0VTKTsKKwkJcHJfd2FybigiY2FuJ3QgZ2V0IG1ham9yIG51bWJlclxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC00MjAsNyArNDA4LDYgQEAKIAlkZXZfdCBkZXZfaWQgPSBNS0RFVihyb2NjYXRfbWFqb3IsIDApOwogCiAJY2Rldl9kZWwoJnJvY2NhdF9jZGV2KTsKLQljbGFzc19kZXN0cm95KHJvY2NhdF9jbGFzcyk7CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldl9pZCwgUk9DQ0FUX01BWF9ERVZJQ0VTKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oCmluZGV4IDA5ZTg2NGUuLjU3ODQyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmgKQEAgLTE2LDExICsxNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19ISURfUk9DQ0FUKSB8fCBkZWZpbmVkKENPTkZJR19ISURfUk9DQ0FUX01PRFVMRSkKLWludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK2ludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIHZvaWQgcm9jY2F0X2Rpc2Nvbm5lY3QoaW50IG1pbm9yKTsKIGludCByb2NjYXRfcmVwb3J0X2V2ZW50KGludCBtaW5vciwgdTggY29uc3QgKmRhdGEsIGludCBsZW4pOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHJvY2NhdF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLAorCQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtMTsgfQogc3RhdGljIGlubGluZSB2b2lkIHJvY2NhdF9kaXNjb25uZWN0KGludCBtaW5vcikge30KIHN0YXRpYyBpbmxpbmUgaW50IHJvY2NhdF9yZXBvcnRfZXZlbnQoaW50IG1pbm9yLCB1OCBjb25zdCAqZGF0YSwgaW50IGxlbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMgYi9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jCmluZGV4IDM1ODk0NDQuLjNjMWZkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNhbXN1bmcuYwpAQCAtNTcsOCArNTcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfaXJkYV9kZXZfdHJhY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCiAJCXVuc2lnbmVkIGludCByc2l6ZSkKIHsKLQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFNhbXN1bmcgSXJEQSAlZCBieXRlIHJlcG9ydCAiCi0JCQkiZGVzY3JpcHRvclxuIiwgcnNpemUpOworCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgU2Ftc3VuZyBJckRBICVkIGJ5dGUgcmVwb3J0IGRlc2NyaXB0b3JcbiIsCisJCSByc2l6ZSk7CiB9CiAKIHN0YXRpYyBfX3U4ICpzYW1zdW5nX2lyZGFfcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNtYXNrKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc2pveS5jIGIvZHJpdmVycy9oaWQvaGlkLXNqb3kuYwppbmRleCBlMTBhNzY4Li4xNmY3Y2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc2pveS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zam95LmMKQEAgLTc0LDI2ICs3NCwyNSBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydF9wdHIgPSByZXBvcnRfcHRyLT5uZXh0OwogCiAJaWYgKHJlcG9ydF9wdHIgPT0gcmVwb3J0X2xpc3QpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJyZXF1aXJlZCBvdXRwdXQgcmVwb3J0IGlzICIKLQkJCQkibWlzc2luZ1xuIik7CisJCWhpZF9lcnIoaGlkLCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyBtaXNzaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfcHRyLCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCAxKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDMpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTE3LDggKzExNiw3IEBACiAJc2pveWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBzam95ZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LAotCQkiRm9yY2UgZmVlZGJhY2sgZm9yIFNtYXJ0Sm95IFBMVVMgUFMyL1VTQiBhZGFwdGVyXG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgU21hcnRKb3kgUExVUyBQUzIvVVNCIGFkYXB0ZXJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzUsMTMgKzEzMywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc29ueS5jIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwppbmRleCA2NzdiYjNkLi42OGQ3YjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKQEAgLTQwLDggKzQwLDcgQEAKIAogCWlmICgoc2MtPnF1aXJrcyAmIFZBSU9fUkRFU0NfQ09OU1RBTlQpICYmCiAJCQkqcnNpemUgPj0gNTYgJiYgcmRlc2NbNTRdID09IDB4ODEgJiYgcmRlc2NbNTVdID09IDB4MDcpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkZpeGluZyB1cCBTb255IFZhaW8gVkdYIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIFNvbnkgVmFpbyBWR1ggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s1NV0gPSAweDA2OwogCX0KIAlyZXR1cm4gcmRlc2M7CkBAIC04OSw3ICs4OCw3IEBACiAJCQkJICgzIDw8IDgpIHwgMHhmMiwgaWZudW0sIGJ1ZiwgMTcsCiAJCQkJIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGVcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBzZXQgb3BlcmF0aW9uYWwgbW9kZVxuIik7CiAKIAlrZnJlZShidWYpOwogCkBAIC0xMTAsNyArMTA5LDcgQEAKIAogCXNjID0ga3phbGxvYyhzaXplb2YoKnNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2Mgc29ueSBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2Mgc29ueSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMTksMTQgKzExOCwxNCBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8CiAJCQlISURfQ09OTkVDVF9ISURERVZfRk9SQ0UpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zdGFudHVtLmMgYi9kcml2ZXJzL2hpZC9oaWQtc3RhbnR1bS5jCmluZGV4IDMxNzFiZTIuLmIyYmUxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zdGFudHVtLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXN0YW50dW0uYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAKIAlzZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFudHVtX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBTdGFudHVtIGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgU3RhbnR1bSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNkLT52YWxpZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYyBiL2RyaXZlcnMvaGlkL2hpZC1zdW5wbHVzLmMKaW5kZXggMTY0ZWQ1Ni4uZDQ4NGEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jCkBAIC0yNyw4ICsyNyw3IEBACiB7CiAJaWYgKCpyc2l6ZSA+PSAxMDcgJiYgcmRlc2NbMTA0XSA9PSAweDI2ICYmIHJkZXNjWzEwNV0gPT0gMHg4MCAmJgogCQkJcmRlc2NbMTA2XSA9PSAweDAzKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgU3VucGx1cyBXaXJlbGVzcyBEZXNrdG9wICIKLQkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIFN1bnBsdXMgV2lyZWxlc3MgRGVza3RvcCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzEwNV0gPSByZGVzY1sxMTBdID0gMHgwMzsKIAkJcmRlc2NbMTA2XSA9IHJkZXNjWzExMV0gPSAweDIxOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCmluZGV4IDI1YmU0ZTEuLjU3NTg2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpAQCAtMTUxLDI4ICsxNTEsMjMgQEAKIAkJCXN3aXRjaCAoZmllbGQtPnVzYWdlWzBdLmhpZCkgewogCQkJY2FzZSBUSFJVU1RNQVNURVJfVVNBR0VfRkY6CiAJCQkJaWYgKGZpZWxkLT5yZXBvcnRfY291bnQgPCAyKSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKLQkJCQkJCSJ3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOworCQkJCQloaWRfd2FybihoaWQsICJpZ25vcmluZyBGRiBmaWVsZCB3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKIAkJCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWF4aW11bSA9PQogCQkJCQkJZmllbGQtPmxvZ2ljYWxfbWluaW11bSkgewotCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyBGRiBmaWVsZCAiCi0JCQkJCQkJIndpdGggbG9naWNhbF9tYXhpbXVtICIKLQkJCQkJCQkiPT0gbG9naWNhbF9taW5pbXVtXG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgRkYgZmllbGQgd2l0aCBsb2dpY2FsX21heGltdW0gPT0gbG9naWNhbF9taW5pbXVtXG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHRtZmYtPnJlcG9ydCAmJiB0bWZmLT5yZXBvcnQgIT0gcmVwb3J0KSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKLQkJCQkJCQkiaW4gb3RoZXIgcmVwb3J0XG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgRkYgZmllbGQgaW4gb3RoZXIgcmVwb3J0XG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHRtZmYtPmZmX2ZpZWxkICYmIHRtZmYtPmZmX2ZpZWxkICE9IGZpZWxkKSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nICIKLQkJCQkJCQkiZHVwbGljYXRlIEZGIGZpZWxkXG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgZHVwbGljYXRlIEZGIGZpZWxkXG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCkBAIC0xODUsMTYgKzE4MCwxNSBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIHVua25vd24gb3V0cHV0ICIKLQkJCQkJCSJ1c2FnZSAlMDh4XG4iLAotCQkJCQkJZmllbGQtPnVzYWdlWzBdLmhpZCk7CisJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgdW5rbm93biBvdXRwdXQgdXNhZ2UgJTA4eFxuIiwKKwkJCQkJIGZpZWxkLT51c2FnZVswXS5oaWQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CiAJfQogCiAJaWYgKCF0bWZmLT5yZXBvcnQpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJjYW4ndCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKKwkJaGlkX2VycihoaWQsICJjYW4ndCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjAzLDggKzE5Nyw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWw7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJmb3JjZSBmZWVkYmFjayBmb3IgVGhydXN0TWFzdGVyIGRldmljZXMgYnkgWmlueCAiCi0JCQkiVmVyaXR1c2UgPHppbnhAZXBpY3NvbC5vcmc+Iik7CisJaGlkX2luZm8oaGlkLCAiZm9yY2UgZmVlZGJhY2sgZm9yIFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggVmVyaXR1c2UgPHppbnhAZXBpY3NvbC5vcmc+XG4iKTsKIAlyZXR1cm4gMDsKIAogZmFpbDoKQEAgLTIyNCwxMyArMjE3LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jCmluZGV4IDk1NmVkOWEuLjYxM2ZmN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpAQCAtNjYsNiArNjYsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CVEMsIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JUQywgVVNCX0RFVklDRV9JRF9CVENfRU1QUkVYX1JFTU9URV8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UT1BTRUVEMiwgVVNCX0RFVklDRV9JRF9UT1BTRUVEMl9SRl9DT01CTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTKSB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCB0c19kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKaW5kZXggNzI0ZjQ2ZS4uMDY4ODgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTQxLDggKzE0Myw4IEBACiAJICogTm90ZSB0aGF0IGlmIHRoZSByYXcgcXVlcmllcyBmYWlsLCBpdCdzIG5vdCBhIGhhcmQgZmFpbHVyZSBhbmQgaXQKIAkgKiBpcyBzYWZlIHRvIGNvbnRpbnVlCiAJICovCi0JZGV2X3dhcm4oJmhkZXYtPmRldiwgImZhaWxlZCB0byBwb2tlIGRldmljZSwgY29tbWFuZCAlZCwgZXJyICVkXG4iLAotCQkJCXJlcF9kYXRhWzBdLCByZXQpOworCWhpZF93YXJuKGhkZXYsICJmYWlsZWQgdG8gcG9rZSBkZXZpY2UsIGNvbW1hbmQgJWQsIGVyciAlZFxuIiwKKwkJIHJlcF9kYXRhWzBdLCByZXQpOwogCXJldHVybjsKIH0KIApAQCAtMTcyLDcgKzE3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoc3BlZWQsIFNfSVJVR08gfCBTX0lXVUdPLAorc3RhdGljIERFVklDRV9BVFRSKHNwZWVkLCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlAsCiAJCXdhY29tX3Nob3dfc3BlZWQsIHdhY29tX3N0b3JlX3NwZWVkKTsKIAogc3RhdGljIGludCB3YWNvbV9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCkBAIC0zMTIsNyArMzE0LDcgQEAKIAogCXdkYXRhID0ga3phbGxvYyhzaXplb2YoKndkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHdkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2Mgd2Fjb20gZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIHdhY29tIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMyMSwyMCArMzIzLDIwIEBACiAJLyogUGFyc2UgdGhlIEhJRCByZXBvcnQgbm93ICovCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfc3BlZWQpOwogCWlmIChyZXQpCi0JCWRldl93YXJuKCZoZGV2LT5kZXYsCi0JCQkiY2FuJ3QgY3JlYXRlIHN5c2ZzIHNwZWVkIGF0dHJpYnV0ZSBlcnI6ICVkXG4iLCByZXQpOworCQloaWRfd2FybihoZGV2LAorCQkJICJjYW4ndCBjcmVhdGUgc3lzZnMgc3BlZWQgYXR0cmlidXRlIGVycjogJWRcbiIsIHJldCk7CiAKIAkvKiBTZXQgV2Fjb20gbW9kZSAyIHdpdGggaGlnaCByZXBvcnRpbmcgc3BlZWQgKi8KIAl3YWNvbV9wb2tlKGhkZXYsIDEpOwpAQCAtMzQ5LDggKzM1MSw4IEBACiAKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmhkZXYtPmRldiwgJndkYXRhLT5iYXR0ZXJ5KTsKIAlpZiAocmV0KSB7Ci0JCWRldl93YXJuKCZoZGV2LT5kZXYsCi0JCQkiY2FuJ3QgY3JlYXRlIHN5c2ZzIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLCByZXQpOworCQloaWRfd2FybihoZGV2LCAiY2FuJ3QgY3JlYXRlIHN5c2ZzIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLAorCQkJIHJldCk7CiAJCS8qCiAJCSAqIGJhdHRlcnkgYXR0cmlidXRlIGlzIG5vdCBjcml0aWNhbCBmb3IgdGhlIHRhYmxldCwgYnV0IGlmIGl0CiAJCSAqIGZhaWxlZCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGFjIGF0dHJpYnV0ZQpAQCAtMzY3LDggKzM2OSw4IEBACiAKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmhkZXYtPmRldiwgJndkYXRhLT5hYyk7CiAJaWYgKHJldCkgewotCQlkZXZfd2FybigmaGRldi0+ZGV2LAotCQkJImNhbid0IGNyZWF0ZSBhYyBiYXR0ZXJ5IGF0dHJpYnV0ZSwgZXJyOiAlZFxuIiwgcmV0KTsKKwkJaGlkX3dhcm4oaGRldiwKKwkJCSAiY2FuJ3QgY3JlYXRlIGFjIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLCByZXQpOwogCQkvKgogCQkgKiBhYyBhdHRyaWJ1dGUgaXMgbm90IGNyaXRpY2FsIGZvciB0aGUgdGFibGV0LCBidXQgaWYgaXQKIAkJICogZmFpbGVkIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBiYXR0ZXJ5IGF0dHJpYnV0ZSB0byBleGlzdApAQCAtNDU0LDcgKzQ1Niw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZ3YWNvbV9kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgd2Fjb20gZHJpdmVyXG4iKTsKKwkJcHJfZXJyKCJjYW4ndCByZWdpc3RlciB3YWNvbSBkcml2ZXJcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCmluZGV4IGI3YWNjZWEuLmYzMWZhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXpwZmYuYwpAQCAtNzUsMTQgKzc1LDE0IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgNCkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggZmllbGRzIGluIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCBmaWVsZHMgaW4gcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMDUsOCArMTA1LDcgQEAKIAl6cGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCB6cGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgImZvcmNlIGZlZWRiYWNrIGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzIGJ5ICIKLQkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisJaGlkX2luZm8oaGlkLCAiZm9yY2UgZmVlZGJhY2sgZm9yIFplcm9wbHVzIGJhc2VkIGRldmljZXMgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIzLDEzICsxMjIsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXp5ZGFjcm9uLmMgYi9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYwppbmRleCBhYWMxZjkyLi5lOTAzNzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYwpAQCAtMzQsOSArMzQsOCBAQAogCQlyZGVzY1sweDk2XSA9PSAweGJjICYmIHJkZXNjWzB4OTddID09IDB4ZmYgJiYKIAkJcmRlc2NbMHhjYV0gPT0gMHhiYyAmJiByZGVzY1sweGNiXSA9PSAweGZmICYmCiAJCXJkZXNjWzB4ZTFdID09IDB4YmMgJiYgcmRlc2NbMHhlMl0gPT0gMHhmZikgewotCQkJZGV2X2luZm8oJmhkZXYtPmRldiwKLQkJCQkiZml4aW5nIHVwIHp5ZGFjcm9uIHJlbW90ZSBjb250cm9sIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQkJaGlkX2luZm8oaGRldiwKKwkJCQkiZml4aW5nIHVwIHp5ZGFjcm9uIHJlbW90ZSBjb250cm9sIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJCXJkZXNjWzB4OTZdID0gcmRlc2NbMHhjYV0gPSByZGVzY1sweGUxXSA9IDB4MGM7CiAJCQlyZGVzY1sweDk3XSA9IHJkZXNjWzB4Y2JdID0gcmRlc2NbMHhlMl0gPSAweDAwOwogCQl9CkBAIC0xNzIsNyArMTcxLDcgQEAKIAogCXpjID0ga3phbGxvYyhzaXplb2YoKnpjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHpjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IGNhbid0IGFsbG9jIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xODAsMTMgKzE3OSwxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IHBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IGh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IGUxZjA3NDguLjQ2OGU4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTEyMiwxNSArMTI0LDE1IEBACiAJfQogCiAJaWYgKGNvdW50ID4gSElEX01BWF9CVUZGRVJfU0laRSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWRyYXc6IHBpZCAlZCBwYXNzZWQgdG9vIGxhcmdlIHJlcG9ydFxuIiwKLQkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJCWhpZF93YXJuKGRldiwgInBpZCAlZCBwYXNzZWQgdG9vIGxhcmdlIHJlcG9ydFxuIiwKKwkJCSB0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChjb3VudCA8IDIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkcmF3OiBwaWQgJWQgcGFzc2VkIHRvbyBzaG9ydCByZXBvcnRcbiIsCi0JCQkJdGFza19waWRfbnIoY3VycmVudCkpOworCQloaWRfd2FybihkZXYsICJwaWQgJWQgcGFzc2VkIHRvbyBzaG9ydCByZXBvcnRcbiIsCisJCQkgdGFza19waWRfbnIoY3VycmVudCkpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xOTIsMTUgKzE5NCwxMyBAQAogCiAJZGV2ID0gaGlkcmF3X3RhYmxlW21pbm9yXTsKIAlpZiAoIWRldi0+b3BlbisrKSB7Ci0JCWlmIChkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikgewotCQkJZXJyID0gZGV2LT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2LT5oaWQsIFBNX0hJTlRfRlVMTE9OKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCQllcnIgPSBkZXYtPmhpZC0+bGxfZHJpdmVyLT5vcGVuKGRldi0+aGlkKTsKKwkJZXJyID0gaGlkX2h3X3Bvd2VyKGRldi0+aGlkLCBQTV9ISU5UX0ZVTExPTik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWVyciA9IGhpZF9od19vcGVuKGRldi0+aGlkKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWlmIChkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXYtPmhpZCwgUE1fSElOVF9OT1JNQUwpOworCQkJaGlkX2h3X3Bvd2VyKGRldi0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CiAJCQlkZXYtPm9wZW4tLTsKIAkJfQogCX0KQEAgLTIyOSw5ICsyMjksOCBAQAogCWRldiA9IGhpZHJhd190YWJsZVttaW5vcl07CiAJaWYgKCEtLWRldi0+b3BlbikgewogCQlpZiAobGlzdC0+aGlkcmF3LT5leGlzdCkgewotCQkJaWYgKGRldi0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKQotCQkJCWRldi0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldi0+aGlkLCBQTV9ISU5UX05PUk1BTCk7Ci0JCQlkZXYtPmhpZC0+bGxfZHJpdmVyLT5jbG9zZShkZXYtPmhpZCk7CisJCQloaWRfaHdfcG93ZXIoZGV2LT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKKwkJCWhpZF9od19jbG9zZShkZXYtPmhpZCk7CiAJCX0gZWxzZSB7CiAJCQlrZnJlZShsaXN0LT5oaWRyYXcpOwogCQl9CkBAIC0zNDUsNiArMzQ0LDkgQEAKIAkub3BlbiA9ICAgICAgICAgaGlkcmF3X29wZW4sCiAJLnJlbGVhc2UgPSAgICAgIGhpZHJhd19yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9IGhpZHJhd19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gaGlkcmF3X2lvY3RsLAorI2VuZGlmCiAJLmxsc2VlayA9CW5vb3BfbGxzZWVrLAogfTsKIApAQCAtNDMzLDcgKzQzNSw3IEBACiAJZGV2aWNlX2Rlc3Ryb3koaGlkcmF3X2NsYXNzLCBNS0RFVihoaWRyYXdfbWFqb3IsIGhpZHJhdy0+bWlub3IpKTsKIAogCWlmIChoaWRyYXctPm9wZW4pIHsKLQkJaGlkLT5sbF9kcml2ZXItPmNsb3NlKGhpZCk7CisJCWhpZF9od19jbG9zZShoaWQpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZHJhdy0+d2FpdCk7CiAJfSBlbHNlIHsKIAkJa2ZyZWUoaGlkcmF3KTsKQEAgLTQ1Miw3ICs0NTQsNyBAQAogCWhpZHJhd19tYWpvciA9IE1BSk9SKGRldl9pZCk7CiAKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWRyYXc6IGNhbid0IGdldCBtYWpvciBudW1iZXJcbiIpOworCQlwcl93YXJuKCJjYW4ndCBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKIAkJcmVzdWx0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlCmluZGV4IDEzMjllY2IuLmRiM2NmMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKQEAgLTMsMTUgKzMsMTUgQEAKICMKIAogIyBNdWx0aXBhcnQgb2JqZWN0cy4KLXVzYmhpZC1vYmpzCTo9IGhpZC1jb3JlLm8gaGlkLXF1aXJrcy5vCit1c2JoaWQteQk6PSBoaWQtY29yZS5vIGhpZC1xdWlya3MubwogCiAjIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgogCiBpZmVxICgkKENPTkZJR19VU0JfSElEREVWKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZGRldi5vCisJdXNiaGlkLXkJKz0gaGlkZGV2Lm8KIGVuZGlmCiBpZmVxICgkKENPTkZJR19ISURfUElEKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1waWRmZi5vCisJdXNiaGlkLXkJKz0gaGlkLXBpZGZmLm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggNTQ4OWVhYi4uYjMzNmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTY3LDcgKzY3LDYgQEAKICAqIElucHV0IHN1Ym1pc3Npb24gYW5kIEkvTyBlcnJvciBoYW5kbGVyLgogICovCiBzdGF0aWMgREVGSU5FX01VVEVYKGhpZF9vcGVuX211dCk7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJlc3VtcHRpb25fd2FrZXI7CiAKIHN0YXRpYyB2b2lkIGhpZF9pb19lcnJvcihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIHN0YXRpYyBpbnQgaGlkX3N1Ym1pdF9vdXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CkBAIC0xMzYsMTAgKzEzNSwxMCBAQAogCQkJaGlkX2lvX2Vycm9yKGhpZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycl9oaWQoImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQloaWRfdG9fdXNiX2RldihoaWQpLT5idXMtPmJ1c19uYW1lLAotCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCi0JCQkJdXNiaGlkLT5pZm51bSwgcmMpOworCQloaWRfZXJyKGhpZCwgImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkXG4iLAorCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKKwkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCisJCQl1c2JoaWQtPmlmbnVtLCByYyk7CiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSAtRUhPU1RVTlJFQUNIOgogCWNhc2UgLUVOT0RFVjoKQEAgLTI3OCwxOCArMjc3LDE4IEBACiAJCWhpZF9pb19lcnJvcihoaWQpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAiaW5wdXQgaXJxIHN0YXR1cyAlZCAgIgotCQkJCSJyZWNlaXZlZFxuIiwgdXJiLT5zdGF0dXMpOworCQloaWRfd2Fybih1cmItPmRldiwgImlucHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCX0KIAogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0YXR1cykgewogCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCQlpZiAoc3RhdHVzICE9IC1FUEVSTSkgewotCQkJZXJyX2hpZCgiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKLQkJCQkJdXNiaGlkLT5pZm51bSwgc3RhdHVzKTsKKwkJCWhpZF9lcnIoaGlkLCAiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkXG4iLAorCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCisJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKKwkJCQl1c2JoaWQtPmlmbnVtLCBzdGF0dXMpOwogCQkJaGlkX2lvX2Vycm9yKGhpZCk7CiAJCX0KIAl9CkBAIC0zMDAsMTAgKzI5OSwxOSBAQAogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJY2hhciAqcmF3X3JlcG9ydDsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKIAogCXJlcG9ydCA9IHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0dGFpbF0ucmVwb3J0OwogCXJhd19yZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdLnJhd19yZXBvcnQ7CiAKKwlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIGlmIHRoZSBkZXZpY2UgaGFzbid0IGJlZW4gd29rZW4sIHdlIGxlYXZlIHRoZSBvdXRwdXQKKwkgKiB0byByZXN1bWUoKQorCSAqLwogCWlmICghdGVzdF9iaXQoSElEX1JFUE9SVEVEX0lETEUsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCXVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCQl1c2JoaWQtPnVyYm91dC0+ZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKQEAgLTMxMywxNyArMzIxLDExIEBACiAJCWRiZ19oaWQoInN1Ym1pdHRpbmcgb3V0IHVyYlxuIik7CiAKIAkJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJib3V0LCBHRlBfQVRPTUlDKSkgewotCQkJZXJyX2hpZCgidXNiX3N1Ym1pdF91cmIob3V0KSBmYWlsZWQiKTsKKwkJCWhpZF9lcnIoaGlkLCAidXNiX3N1Ym1pdF91cmIob3V0KSBmYWlsZWRcbiIpOworCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJdXNiaGlkLT5sYXN0X291dCA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogcXVldWUgd29yayB0byB3YWtlIHVwIHRoZSBkZXZpY2UuCi0JCSAqIGFzIHRoZSB3b3JrIHF1ZXVlIGlzIGZyZWV6ZWFibGUsIHRoaXMgaXMgc2FmZQotCQkgKiB3aXRoIHJlc3BlY3QgdG8gU1REIGFuZCBTVFIKLQkJICovCi0JCXF1ZXVlX3dvcmsocmVzdW1wdGlvbl93YWtlciwgJnVzYmhpZC0+cmVzdGFydF93b3JrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMzNCwxMyArMzM2LDE2IEBACiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAl1bnNpZ25lZCBjaGFyIGRpcjsKIAljaGFyICpyYXdfcmVwb3J0OwotCWludCBsZW47CisJaW50IGxlbiwgcjsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAogCXJlcG9ydCA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQ7CiAJcmF3X3JlcG9ydCA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yYXdfcmVwb3J0OwogCWRpciA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5kaXI7CiAKKwlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKCF0ZXN0X2JpdChISURfUkVQT1JURURfSURMRSwgJnVzYmhpZC0+aW9mbCkpIHsKIAkJbGVuID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCQlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7CkBAIC0zNzUsMTcgKzM4MCwxMSBAQAogCQkJdXNiaGlkLT5jci0+d1ZhbHVlLCB1c2JoaWQtPmNyLT53SW5kZXgsIHVzYmhpZC0+Y3ItPndMZW5ndGgpOwogCiAJCWlmICh1c2Jfc3VibWl0X3VyYih1c2JoaWQtPnVyYmN0cmwsIEdGUF9BVE9NSUMpKSB7Ci0JCQllcnJfaGlkKCJ1c2Jfc3VibWl0X3VyYihjdHJsKSBmYWlsZWQiKTsKKwkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOworCQkJaGlkX2VycihoaWQsICJ1c2Jfc3VibWl0X3VyYihjdHJsKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXVzYmhpZC0+bGFzdF9jdHJsID0gamlmZmllczsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBxdWV1ZSB3b3JrIHRvIHdha2UgdXAgdGhlIGRldmljZS4KLQkJICogYXMgdGhlIHdvcmsgcXVldWUgaXMgZnJlZXplYWJsZSwgdGhpcyBpcyBzYWZlCi0JCSAqIHdpdGggcmVzcGVjdCB0byBTVEQgYW5kIFNUUgotCQkgKi8KLQkJcXVldWVfd29yayhyZXN1bXB0aW9uX3dha2VyLCAmdXNiaGlkLT5yZXN0YXJ0X3dvcmspOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDEzLDggKzQxMiw4IEBACiAJY2FzZSAtRU5PRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgkJLyogZXJyb3IgKi8KLQkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJvdXRwdXQgaXJxIHN0YXR1cyAlZCAiCi0JCQkJInJlY2VpdmVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWhpZF93YXJuKHVyYi0+ZGV2LCAib3V0cHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmxvY2ssIGZsYWdzKTsKQEAgLTQzNSw2ICs0MzQsNyBAQAogCiAJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5sb2NrLCBmbGFncyk7CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJd2FrZV91cCgmdXNiaGlkLT53YWl0KTsKIH0KIApAQCAtNDY2LDggKzQ2Niw3IEBACiAJY2FzZSAtRVBJUEU6CQkvKiByZXBvcnQgbm90IGF2YWlsYWJsZSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgkJLyogZXJyb3IgKi8KLQkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJjdHJsIHVyYiBzdGF0dXMgJWQgIgotCQkJCSJyZWNlaXZlZFxuIiwgc3RhdHVzKTsKKwkJaGlkX3dhcm4odXJiLT5kZXYsICJjdHJsIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsIHN0YXR1cyk7CiAJfQogCiAJaWYgKHVucGx1ZykKQEAgLTQ4MSwxMSArNDgwLDEzIEBACiAJCQl3YWtlX3VwKCZ1c2JoaWQtPndhaXQpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZ1c2JoaWQtPmxvY2spOworCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModXNiaGlkLT5pbnRmKTsKIAkJcmV0dXJuOwogCX0KIAogCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAlzcGluX3VubG9jaygmdXNiaGlkLT5sb2NrKTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModXNiaGlkLT5pbnRmKTsKIAl3YWtlX3VwKCZ1c2JoaWQtPndhaXQpOwogfQogCkBAIC01MDEsMTMgKzUwMiwxMyBAQAogCiAJaWYgKHVzYmhpZC0+dXJib3V0ICYmIGRpciA9PSBVU0JfRElSX09VVCAmJiByZXBvcnQtPnR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpIHsKIAkJaWYgKChoZWFkID0gKHVzYmhpZC0+b3V0aGVhZCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+b3V0dGFpbCkgewotCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAib3V0cHV0IHF1ZXVlIGZ1bGxcbiIpOworCQkJaGlkX3dhcm4oaGlkLCAib3V0cHV0IHF1ZXVlIGZ1bGxcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXS5yYXdfcmVwb3J0ID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCkgewotCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAib3V0cHV0IHF1ZXVlaW5nIGZhaWxlZFxuIik7CisJCQloaWRfd2FybihoaWQsICJvdXRwdXQgcXVldWVpbmcgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCk7CkBAIC01MzIsMTQgKzUzMywxNCBAQAogCX0KIAogCWlmICgoaGVhZCA9ICh1c2JoaWQtPmN0cmxoZWFkICsgMSkgJiAoSElEX0NPTlRST0xfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+Y3RybHRhaWwpIHsKLQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAiY29udHJvbCBxdWV1ZSBmdWxsXG4iKTsKKwkJaGlkX3dhcm4oaGlkLCAiY29udHJvbCBxdWV1ZSBmdWxsXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChkaXIgPT0gVVNCX0RJUl9PVVQpIHsKIAkJdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJhd19yZXBvcnQgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJhd19yZXBvcnQpIHsKLQkJCWRldl93YXJuKCZoaWQtPmRldiwgImNvbnRyb2wgcXVldWVpbmcgZmFpbGVkXG4iKTsKKwkJCWhpZF93YXJuKGhpZCwgImNvbnRyb2wgcXVldWVpbmcgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0KTsKQEAgLTU5MCw3ICs1OTEsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlpZiAoKG9mZnNldCA9IGhpZGlucHV0X2ZpbmRfZmllbGQoaGlkLCB0eXBlLCBjb2RlLCAmZmllbGQpKSA9PSAtMSkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJldmVudCBmaWVsZCBub3QgZm91bmRcbiIpOworCQloaWRfd2FybihkZXYsICJldmVudCBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC02NTYsNyArNjU3LDcgQEAKIAltdXRleF9sb2NrKCZoaWRfb3Blbl9tdXQpOwogCWlmICghaGlkLT5vcGVuKyspIHsKIAkJcmVzID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHVzYmhpZC0+aW50Zik7Ci0JCS8qIHRoZSBkZXZpY2UgbXVzdCBiZSBhd2FrZSB0byByZWxpYWJsZSByZXF1ZXN0IHJlbW90ZSB3YWtldXAgKi8KKwkJLyogdGhlIGRldmljZSBtdXN0IGJlIGF3YWtlIHRvIHJlbGlhYmx5IHJlcXVlc3QgcmVtb3RlIHdha2V1cCAqLwogCQlpZiAocmVzIDwgMCkgewogCQkJaGlkLT5vcGVuLS07CiAJCQltdXRleF91bmxvY2soJmhpZF9vcGVuX211dCk7CkBAIC03MjIsNyArNzIzLDcgQEAKIAl9CiAKIAlpZiAoZXJyKQotCQlkZXZfd2FybigmaGlkLT5kZXYsICJ0aW1lb3V0IGluaXRpYWxpemluZyByZXBvcnRzXG4iKTsKKwkJaGlkX3dhcm4oaGlkLCAidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0c1xuIik7CiB9CiAKIC8qCkBAIC04NTcsMTggKzg1OCw2IEBACiAJdXNiaGlkX3Jlc3RhcnRfY3RybF9xdWV1ZSh1c2JoaWQpOwogfQogCi1zdGF0aWMgdm9pZCBfX3VzYmhpZF9yZXN0YXJ0X3F1ZXVlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiaGlkX2RldmljZSwgcmVzdGFydF93b3JrKTsKLQlpbnQgcjsKLQotCXIgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodXNiaGlkLT5pbnRmKTsKLQlpZiAociA8IDApCi0JCXJldHVybjsKLQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodXNiaGlkLT5pbnRmKTsKLX0KLQogc3RhdGljIHZvaWQgaGlkX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwpAQCAtMTE0MCw4ICsxMTI5LDcgQEAKIAkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oJmludGVyZmFjZS0+ZW5kcG9pbnRbbl0uZGVzYykpCiAJCQloYXNfaW4rKzsKIAlpZiAoIWhhc19pbikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCBmaW5kIGFuIGlucHV0IGludGVycnVwdCAiCi0JCQkJImVuZHBvaW50XG4iKTsKKwkJaGlkX2VycihpbnRmLCAiY291bGRuJ3QgZmluZCBhbiBpbnB1dCBpbnRlcnJ1cHQgZW5kcG9pbnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyMDYsMTQgKzExOTQsMTMgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVzYmhpZC0+d2FpdCk7CiAJSU5JVF9XT1JLKCZ1c2JoaWQtPnJlc2V0X3dvcmssIGhpZF9yZXNldCk7Ci0JSU5JVF9XT1JLKCZ1c2JoaWQtPnJlc3RhcnRfd29yaywgX191c2JoaWRfcmVzdGFydF9xdWV1ZXMpOwogCXNldHVwX3RpbWVyKCZ1c2JoaWQtPmlvX3JldHJ5LCBoaWRfcmV0cnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGhpZCk7CiAJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+bG9jayk7CiAKIAlyZXQgPSBoaWRfYWRkX2RldmljZShoaWQpOwogCWlmIChyZXQpIHsKIAkJaWYgKHJldCAhPSAtRU5PREVWKQotCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2FuJ3QgYWRkIGhpZCBkZXZpY2U6ICVkXG4iLCByZXQpOworCQkJaGlkX2VycihpbnRmLCAiY2FuJ3QgYWRkIGhpZCBkZXZpY2U6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtMTI0MSw3ICsxMjI4LDYgQEAKIHN0YXRpYyB2b2lkIGhpZF9jYW5jZWxfZGVsYXllZF9zdHVmZihzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkKQogewogCWRlbF90aW1lcl9zeW5jKCZ1c2JoaWQtPmlvX3JldHJ5KTsKLQljYW5jZWxfd29ya19zeW5jKCZ1c2JoaWQtPnJlc3RhcnRfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmdXNiaGlkLT5yZXNldF93b3JrKTsKIH0KIApAQCAtMTI2Miw3ICsxMjQ4LDYgQEAKIAlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmxvY2spOwogCXNldF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpOwogCXNwaW5fdW5sb2NrX2lycSgmdXNiaGlkLT5sb2NrKTsKLQljYW5jZWxfd29ya19zeW5jKCZ1c2JoaWQtPnJlc3RhcnRfd29yayk7CiAJaGlkX2NlYXNlX2lvKHVzYmhpZCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE0NjEsOSArMTQ0Niw2IEBACiB7CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKLQlyZXN1bXB0aW9uX3dha2VyID0gY3JlYXRlX2ZyZWV6ZWFibGVfd29ya3F1ZXVlKCJ1c2JoaWRfcmVzdW1lciIpOwotCWlmICghcmVzdW1wdGlvbl93YWtlcikKLQkJZ290byBub19xdWV1ZTsKIAlyZXR2YWwgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7CiAJaWYgKHJldHZhbCkKIAkJZ290byBoaWRfcmVnaXN0ZXJfZmFpbDsKQEAgLTE0ODEsOCArMTQ2Myw2IEBACiB1c2JoaWRfcXVpcmtzX2luaXRfZmFpbDoKIAloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmhpZF91c2JfZHJpdmVyKTsKIGhpZF9yZWdpc3Rlcl9mYWlsOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc3VtcHRpb25fd2FrZXIpOwotbm9fcXVldWU6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTQ5MSw3ICsxNDcxLDYgQEAKIAl1c2JfZGVyZWdpc3RlcigmaGlkX2RyaXZlcik7CiAJdXNiaGlkX3F1aXJrc19leGl0KCk7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7Ci0JZGVzdHJveV93b3JrcXVldWUocmVzdW1wdGlvbl93YWtlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhpZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwppbmRleCBlZjM4MWQ3Li5mOTFjMTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qICNkZWZpbmUgREVCVUcgKi8KIAotI2RlZmluZSBkZWJ1Zyhmb3JtYXQsIGFyZy4uLikgcHJfZGVidWcoImhpZC1waWRmZjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjIwLDcgKzIyMCw3IEBACiBzdGF0aWMgdm9pZCBwaWRmZl9zZXQoc3RydWN0IHBpZGZmX3VzYWdlICp1c2FnZSwgdTE2IHZhbHVlKQogewogCXVzYWdlLT52YWx1ZVswXSA9IHBpZGZmX3Jlc2NhbGUodmFsdWUsIDB4ZmZmZiwgdXNhZ2UtPmZpZWxkKTsKLQlkZWJ1ZygiY2FsY3VsYXRlZCBmcm9tICVkIHRvICVkIiwgdmFsdWUsIHVzYWdlLT52YWx1ZVswXSk7CisJcHJfZGVidWcoImNhbGN1bGF0ZWQgZnJvbSAlZCB0byAlZFxuIiwgdmFsdWUsIHVzYWdlLT52YWx1ZVswXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBpZGZmX3NldF9zaWduZWQoc3RydWN0IHBpZGZmX3VzYWdlICp1c2FnZSwgczE2IHZhbHVlKQpAQCAtMjM1LDcgKzIzNSw3IEBACiAJCQl1c2FnZS0+dmFsdWVbMF0gPQogCQkJICAgIHBpZGZmX3Jlc2NhbGUodmFsdWUsIDB4N2ZmZiwgdXNhZ2UtPmZpZWxkKTsKIAl9Ci0JZGVidWcoImNhbGN1bGF0ZWQgZnJvbSAlZCB0byAlZCIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOworCXByX2RlYnVnKCJjYWxjdWxhdGVkIGZyb20gJWQgdG8gJWRcbiIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOwogfQogCiAvKgpAQCAtMjU5LDggKzI1OSw5IEBACiAJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfQVRUQUNLX1RJTUVdLnZhbHVlWzBdID0gZW52ZWxvcGUtPmF0dGFja19sZW5ndGg7CiAJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfRkFERV9USU1FXS52YWx1ZVswXSA9IGVudmVsb3BlLT5mYWRlX2xlbmd0aDsKIAotCWRlYnVnKCJhdHRhY2sgJXUgPT4gJWQiLCBlbnZlbG9wZS0+YXR0YWNrX2xldmVsLAotCSAgICAgIHBpZGZmLT5zZXRfZW52ZWxvcGVbUElEX0FUVEFDS19MRVZFTF0udmFsdWVbMF0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgImF0dGFjayAldSA9PiAlZFxuIiwKKwkJZW52ZWxvcGUtPmF0dGFja19sZXZlbCwKKwkJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfQVRUQUNLX0xFVkVMXS52YWx1ZVswXSk7CiAKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0VOVkVMT1BFXSwKIAkJCSAgVVNCX0RJUl9PVVQpOwpAQCAtNDY2LDMzICs0NjcsMzMgQEAKIAlwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZS0+dmFsdWVbMF0gPSBlZm51bTsKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfQ1JFQVRFX05FV19FRkZFQ1RdLAogCQkJICBVU0JfRElSX09VVCk7Ci0JZGVidWcoImNyZWF0ZV9uZXdfZWZmZWN0IHNlbnQsIHR5cGU6ICVkIiwgZWZudW0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgImNyZWF0ZV9uZXdfZWZmZWN0IHNlbnQsIHR5cGU6ICVkXG4iLCBlZm51bSk7CiAKIAlwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZVswXSA9IDA7CiAJcGlkZmYtPmJsb2NrX2xvYWRfc3RhdHVzLT52YWx1ZVswXSA9IDA7CiAJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAKIAlmb3IgKGogPSAwOyBqIDwgNjA7IGorKykgewotCQlkZWJ1ZygicGlkX2Jsb2NrX2xvYWQgcmVxdWVzdGVkIik7CisJCWhpZF9kYmcocGlkZmYtPmhpZCwgInBpZF9ibG9ja19sb2FkIHJlcXVlc3RlZFxuIik7CiAJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9CTE9DS19MT0FEXSwKIAkJCQkgIFVTQl9ESVJfSU4pOwogCQl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKIAkJaWYgKHBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cy0+dmFsdWVbMF0gPT0KIAkJICAgIHBpZGZmLT5zdGF0dXNfaWRbUElEX0JMT0NLX0xPQURfU1VDQ0VTU10pIHsKLQkJCWRlYnVnKCJkZXZpY2UgcmVwb3J0ZWQgZnJlZSBtZW1vcnk6ICVkIGJ5dGVzIiwKLQkJCSAgICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KLQkJCQlwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZVswXSA6IC0xKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgImRldmljZSByZXBvcnRlZCBmcmVlIG1lbW9yeTogJWQgYnl0ZXNcbiIsCisJCQkJIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KKwkJCQkgcGlkZmYtPmJsb2NrX2xvYWRbUElEX1JBTV9QT09MX0FWQUlMQUJMRV0udmFsdWVbMF0gOiAtMSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAocGlkZmYtPmJsb2NrX2xvYWRfc3RhdHVzLT52YWx1ZVswXSA9PQogCQkgICAgcGlkZmYtPnN0YXR1c19pZFtQSURfQkxPQ0tfTE9BRF9GVUxMXSkgewotCQkJZGVidWcoIm5vdCBlbm91Z2ggbWVtb3J5IGZyZWU6ICVkIGJ5dGVzIiwKLQkJCSAgICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgIm5vdCBlbm91Z2ggbWVtb3J5IGZyZWU6ICVkIGJ5dGVzXG4iLAorCQkJCXBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KIAkJCQlwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZVswXSA6IC0xKTsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiBwaWRfYmxvY2tfbG9hZCBmYWlsZWQgNjAgdGltZXNcbiIpOworCWhpZF9lcnIocGlkZmYtPmhpZCwgInBpZF9ibG9ja19sb2FkIGZhaWxlZCA2MCB0aW1lc1xuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTU0Niw3ICs1NDcsOCBAQAogCXN0cnVjdCBwaWRmZl9kZXZpY2UgKnBpZGZmID0gZGV2LT5mZi0+cHJpdmF0ZTsKIAlpbnQgcGlkX2lkID0gcGlkZmYtPnBpZF9pZFtlZmZlY3RfaWRdOwogCi0JZGVidWcoInN0YXJ0aW5nIHRvIGVyYXNlICVkLyVkIiwgZWZmZWN0X2lkLCBwaWRmZi0+cGlkX2lkW2VmZmVjdF9pZF0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgInN0YXJ0aW5nIHRvIGVyYXNlICVkLyVkXG4iLAorCQllZmZlY3RfaWQsIHBpZGZmLT5waWRfaWRbZWZmZWN0X2lkXSk7CiAJLyogV2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGNsZWFyLiBXZSBkbyBub3Qgd2FudCBhIGZ1bGwgZmlmbyB0bwogCSAgIHByZXZlbnQgdGhlIGVmZmVjdCByZW1vdmFsLiAqLwogCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwpAQCAtNjA0LDggKzYwNiw3IEBACiAJCQkJdHlwZV9pZCA9IFBJRF9TQVdfRE9XTjsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoaWQtcGlkZmY6IGludmFsaWQgd2F2ZWZvcm1cbiIpOworCQkJCWhpZF9lcnIocGlkZmYtPmhpZCwgImludmFsaWQgd2F2ZWZvcm1cbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCkBAIC02OTYsNyArNjk3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogaW52YWxpZCB0eXBlXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAiaW52YWxpZCB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MDQsNyArNzA1LDcgQEAKIAkJcGlkZmYtPnBpZF9pZFtlZmZlY3QtPmlkXSA9CiAJCSAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZVswXTsKIAotCWRlYnVnKCJ1cGxvYWRlZCIpOworCWhpZF9kYmcocGlkZmYtPmhpZCwgInVwbG9hZGVkXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzcwLDE0ICs3NzEsMTQgQEAKIAkJZm9yIChpID0gMDsgaSA8IHJlcG9ydC0+bWF4ZmllbGQ7IGkrKykgewogCQkJaWYgKHJlcG9ydC0+ZmllbGRbaV0tPm1heHVzYWdlICE9CiAJCQkgICAgcmVwb3J0LT5maWVsZFtpXS0+cmVwb3J0X2NvdW50KSB7Ci0JCQkJZGVidWcoIm1heHVzYWdlIGFuZCByZXBvcnRfY291bnQgZG8gbm90IG1hdGNoLCAiCi0JCQkJICAgICAgInNraXBwaW5nIik7CisJCQkJcHJfZGVidWcoIm1heHVzYWdlIGFuZCByZXBvcnRfY291bnQgZG8gbm90IG1hdGNoLCBza2lwcGluZ1xuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlmb3IgKGogPSAwOyBqIDwgcmVwb3J0LT5maWVsZFtpXS0+bWF4dXNhZ2U7IGorKykgewogCQkJCWlmIChyZXBvcnQtPmZpZWxkW2ldLT51c2FnZVtqXS5oaWQgPT0KIAkJCQkgICAgKEhJRF9VUF9QSUQgfCB0YWJsZVtrXSkpIHsKLQkJCQkJZGVidWcoImZvdW5kICVkIGF0ICVkLT4lZCIsIGssIGksIGopOworCQkJCQlwcl9kZWJ1ZygiZm91bmQgJWQgYXQgJWQtPiVkXG4iLAorCQkJCQkJIGssIGksIGopOwogCQkJCQl1c2FnZVtrXS5maWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07CiAJCQkJCXVzYWdlW2tdLnZhbHVlID0KIAkJCQkJCSZyZXBvcnQtPmZpZWxkW2ldLT52YWx1ZVtqXTsKQEAgLTc4OSw3ICs3OTAsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmICghZm91bmQgJiYgc3RyaWN0KSB7Ci0JCQlkZWJ1ZygiZmFpbGVkIHRvIGxvY2F0ZSAlZCIsIGspOworCQkJcHJfZGVidWcoImZhaWxlZCB0byBsb2NhdGUgJWRcbiIsIGspOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODI2LDggKzgyNyw4IEBACiAJCQljb250aW51ZTsKIAkJcmV0ID0gcGlkZmZfY2hlY2tfdXNhZ2UocmVwb3J0LT5maWVsZFswXS0+bG9naWNhbCk7CiAJCWlmIChyZXQgIT0gLTEpIHsKLQkJCWRlYnVnKCJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBmaWVsZC0+bG9naWNhbCIsCi0JCQkgICAgICBwaWRmZl9yZXBvcnRzW3JldF0pOworCQkJaGlkX2RiZyhoaWQsICJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBmaWVsZC0+bG9naWNhbFxuIiwKKwkJCQlwaWRmZl9yZXBvcnRzW3JldF0pOwogCQkJcGlkZmYtPnJlcG9ydHNbcmV0XSA9IHJlcG9ydDsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC04NDUsOCArODQ2LDkgQEAKIAkJCWNvbnRpbnVlOwogCQlyZXQgPSBwaWRmZl9jaGVja191c2FnZShoaWQtPmNvbGxlY3Rpb25baSAtIDFdLnVzYWdlKTsKIAkJaWYgKHJldCAhPSAtMSAmJiAhcGlkZmYtPnJlcG9ydHNbcmV0XSkgewotCQkJZGVidWcoImZvdW5kIHVzYWdlIDB4JTAyeCBmcm9tIGNvbGxlY3Rpb24gYXJyYXkiLAotCQkJICAgICAgcGlkZmZfcmVwb3J0c1tyZXRdKTsKKwkJCWhpZF9kYmcoaGlkLAorCQkJCSJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBjb2xsZWN0aW9uIGFycmF5XG4iLAorCQkJCXBpZGZmX3JlcG9ydHNbcmV0XSk7CiAJCQlwaWRmZi0+cmVwb3J0c1tyZXRdID0gcmVwb3J0OwogCQl9CiAJfQpAQCAtODYxLDcgKzg2Myw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IFBJRF9SRVFVSVJFRF9SRVBPUlRTOyBpKyspIHsKIAkJaWYgKCFwaWRmZi0+cmVwb3J0c1tpXSkgewotCQkJZGVidWcoIiVkIG1pc3NpbmciLCBpKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgIiVkIG1pc3NpbmdcbiIsIGkpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC04ODQsOCArODg2LDcgQEAKIAkJCSAgICByZXBvcnQtPmZpZWxkW2ldLT5sb2dpY2FsX21pbmltdW0gPT0gMSkKIAkJCQlyZXR1cm4gcmVwb3J0LT5maWVsZFtpXTsKIAkJCWVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiBsb2dpY2FsX21pbmltdW0gIgotCQkJCQkiaXMgbm90IDEgYXMgaXQgc2hvdWxkIGJlXG4iKTsKKwkJCQlwcl9lcnIoImxvZ2ljYWxfbWluaW11bSBpcyBub3QgMSBhcyBpdCBzaG91bGQgYmVcbiIpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC05MjQsNyArOTI1LDcgQEAKICAqLwogc3RhdGljIGludCBwaWRmZl9maW5kX3NwZWNpYWxfZmllbGRzKHN0cnVjdCBwaWRmZl9kZXZpY2UgKnBpZGZmKQogewotCWRlYnVnKCJmaW5kaW5nIHNwZWNpYWwgZmllbGRzIik7CisJaGlkX2RiZyhwaWRmZi0+aGlkLCAiZmluZGluZyBzcGVjaWFsIGZpZWxkc1xuIik7CiAKIAlwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZSA9CiAJCXBpZGZmX2ZpbmRfc3BlY2lhbF9maWVsZChwaWRmZi0+cmVwb3J0c1tQSURfQ1JFQVRFX05FV19FRkZFQ1RdLApAQCAtOTQ1LDMyICs5NDYsMzAgQEAKIAkJcGlkZmZfZmluZF9zcGVjaWFsX2ZpZWxkKHBpZGZmLT5yZXBvcnRzW1BJRF9FRkZFQ1RfT1BFUkFUSU9OXSwKIAkJCQkJIDB4NzgsIDEpOwogCi0JZGVidWcoInNlYXJjaCBkb25lIik7CisJaGlkX2RiZyhwaWRmZi0+aGlkLCAic2VhcmNoIGRvbmVcbiIpOwogCiAJaWYgKCFwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZSB8fCAhcGlkZmYtPnNldF9lZmZlY3RfdHlwZSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogZWZmZWN0IGxpc3RzIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImVmZmVjdCBsaXN0cyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+ZWZmZWN0X2RpcmVjdGlvbikgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogZGlyZWN0aW9uIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImRpcmVjdGlvbiBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+ZGV2aWNlX2NvbnRyb2wpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IGRldmljZSBjb250cm9sIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImRldmljZSBjb250cm9sIGZpZWxkIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoIXBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IGJsb2NrIGxvYWQgc3RhdHVzIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImJsb2NrIGxvYWQgc3RhdHVzIGZpZWxkIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoIXBpZGZmLT5lZmZlY3Rfb3BlcmF0aW9uX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IGVmZmVjdCBvcGVyYXRpb24gZmllbGQgbm90IGZvdW5kXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAiZWZmZWN0IG9wZXJhdGlvbiBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05ODIsMjMgKzk4MSwyMiBAQAogCiAJaWYgKCFQSURGRl9GSU5EX1NQRUNJQUxfS0VZUyh0eXBlX2lkLCBjcmVhdGVfbmV3X2VmZmVjdF90eXBlLAogCQkJCSAgICAgZWZmZWN0X3R5cGVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogbm8gZWZmZWN0IHR5cGVzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAibm8gZWZmZWN0IHR5cGVzIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChQSURGRl9GSU5EX1NQRUNJQUxfS0VZUyhzdGF0dXNfaWQsIGJsb2NrX2xvYWRfc3RhdHVzLAogCQkJCSAgICBibG9ja19sb2FkX3N0YXR1cykgIT0KIAkJCXNpemVvZihwaWRmZl9ibG9ja19sb2FkX3N0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkcGlkZmY6IGJsb2NrIGxvYWQgc3RhdHVzIGlkZW50aWZpZXJzIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwKKwkJCSJibG9jayBsb2FkIHN0YXR1cyBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKFBJREZGX0ZJTkRfU1BFQ0lBTF9LRVlTKG9wZXJhdGlvbl9pZCwgZWZmZWN0X29wZXJhdGlvbl9zdGF0dXMsCiAJCQkJICAgIGVmZmVjdF9vcGVyYXRpb25fc3RhdHVzKSAhPQogCQkJc2l6ZW9mKHBpZGZmX2VmZmVjdF9vcGVyYXRpb25fc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWRwaWRmZjogZWZmZWN0IG9wZXJhdGlvbiBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aWZpZXJzIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEwMTcsOCArMTAxNSw4IEBACiAJCWludCBwaWRmZl90eXBlID0gcGlkZmYtPnR5cGVfaWRbaV07CiAJCWlmIChwaWRmZi0+c2V0X2VmZmVjdF90eXBlLT51c2FnZVtwaWRmZl90eXBlXS5oaWQgIT0KIAkJICAgIHBpZGZmLT5jcmVhdGVfbmV3X2VmZmVjdF90eXBlLT51c2FnZVtwaWRmZl90eXBlXS5oaWQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiAiCi0JCQkgICAgICAgImVmZmVjdCB0eXBlIG51bWJlciAlZCBpcyBpbnZhbGlkXG4iLCBpKTsKKwkJCWhpZF9lcnIocGlkZmYtPmhpZCwKKwkJCQkiZWZmZWN0IHR5cGUgbnVtYmVyICVkIGlzIGludmFsaWRcbiIsIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtMTA3MywyNyArMTA3MSwyMyBAQAogCWludCBlbnZlbG9wZV9vayA9IDA7CiAKIAlpZiAoUElERkZfRklORF9GSUVMRFMoc2V0X2VmZmVjdCwgUElEX1NFVF9FRkZFQ1QsIDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBzZXRfZWZmZWN0IHJlcG9ydCBsYXlvdXRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJ1bmtub3duIHNldF9lZmZlY3QgcmVwb3J0IGxheW91dFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCVBJREZGX0ZJTkRfRklFTERTKGJsb2NrX2xvYWQsIFBJRF9CTE9DS19MT0FELCAwKTsKIAlpZiAoIXBpZGZmLT5ibG9ja19sb2FkW1BJRF9FRkZFQ1RfQkxPQ0tfSU5ERVhdLnZhbHVlKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwaWRfYmxvY2tfbG9hZCByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBwaWRfYmxvY2tfbG9hZCByZXBvcnQgbGF5b3V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKFBJREZGX0ZJTkRfRklFTERTKGVmZmVjdF9vcGVyYXRpb24sIFBJRF9FRkZFQ1RfT1BFUkFUSU9OLCAxKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gZWZmZWN0X29wZXJhdGlvbiByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBlZmZlY3Rfb3BlcmF0aW9uIHJlcG9ydCBsYXlvdXRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoUElERkZfRklORF9GSUVMRFMoYmxvY2tfZnJlZSwgUElEX0JMT0NLX0ZSRUUsIDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwaWRfYmxvY2tfZnJlZSByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBwaWRfYmxvY2tfZnJlZSByZXBvcnQgbGF5b3V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTA1LDI3ICsxMDk5LDI2IEBACiAKIAlpZiAoIWVudmVsb3BlX29rKSB7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkZfQ09OU1RBTlQsIGRldi0+ZmZiaXQpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiAiCi0JCQkgICAgICAgImhhcyBjb25zdGFudCBlZmZlY3QgYnV0IG5vIGVudmVsb3BlXG4iKTsKKwkJCWhpZF93YXJuKHBpZGZmLT5oaWQsCisJCQkJICJoYXMgY29uc3RhbnQgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkZfUkFNUCwgZGV2LT5mZmJpdCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6ICIKLQkJCQkiaGFzIHJhbXAgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CisJCQloaWRfd2FybihwaWRmZi0+aGlkLAorCQkJCSAiaGFzIHJhbXAgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGRl9QRVJJT0RJQywgZGV2LT5mZmJpdCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6ICIKLQkJCQkiaGFzIHBlcmlvZGljIGVmZmVjdCBidXQgbm8gZW52ZWxvcGVcbiIpOworCQkJaGlkX3dhcm4ocGlkZmYtPmhpZCwKKwkJCQkgImhhcyBwZXJpb2RpYyBlZmZlY3QgYnV0IG5vIGVudmVsb3BlXG4iKTsKIAl9CiAKIAlpZiAodGVzdF9iaXQoRkZfQ09OU1RBTlQsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9jb25zdGFudCwgUElEX1NFVF9DT05TVEFOVCwgMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBjb25zdGFudCBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gY29uc3RhbnQgZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9DT05TVEFOVCwgZGV2LT5mZmJpdCk7CiAJfQogCiAJaWYgKHRlc3RfYml0KEZGX1JBTVAsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9yYW1wLCBQSURfU0VUX1JBTVAsIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZC1waWRmZjogdW5rbm93biByYW1wIGVmZmVjdCBsYXlvdXRcbiIpOworCQloaWRfd2FybihwaWRmZi0+aGlkLCAidW5rbm93biByYW1wIGVmZmVjdCBsYXlvdXRcbiIpOwogCQljbGVhcl9iaXQoRkZfUkFNUCwgZGV2LT5mZmJpdCk7CiAJfQogCkBAIC0xMTM0LDggKzExMjcsNyBAQAogCSAgICAgdGVzdF9iaXQoRkZfRlJJQ1RJT04sIGRldi0+ZmZiaXQpIHx8CiAJICAgICB0ZXN0X2JpdChGRl9JTkVSVElBLCBkZXYtPmZmYml0KSkgJiYKIAkgICAgUElERkZfRklORF9GSUVMRFMoc2V0X2NvbmRpdGlvbiwgUElEX1NFVF9DT05ESVRJT04sIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gY29uZGl0aW9uIGVmZmVjdCBsYXlvdXRcbiIpOworCQloaWRfd2FybihwaWRmZi0+aGlkLCAidW5rbm93biBjb25kaXRpb24gZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9TUFJJTkcsIGRldi0+ZmZiaXQpOwogCQljbGVhcl9iaXQoRkZfREFNUEVSLCBkZXYtPmZmYml0KTsKIAkJY2xlYXJfYml0KEZGX0ZSSUNUSU9OLCBkZXYtPmZmYml0KTsKQEAgLTExNDQsOCArMTEzNiw3IEBACiAKIAlpZiAodGVzdF9iaXQoRkZfUEVSSU9ESUMsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9wZXJpb2RpYywgUElEX1NFVF9QRVJJT0RJQywgMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwZXJpb2RpYyBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gcGVyaW9kaWMgZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9QRVJJT0RJQywgZGV2LT5mZmJpdCk7CiAJfQogCkBAIC0xMTg0LDEyICsxMTc1LDEyIEBACiAJaWYgKHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZSkgewogCQl3aGlsZSAocGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdIDwgMikgewogCQkJaWYgKGkrKyA+IDIwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiBkZXZpY2UgcmVwb3J0cyAiCi0JCQkJICAgICAgICIlZCBzaW11bHRhbmVvdXMgZWZmZWN0c1xuIiwKLQkJCQkgICAgICAgcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdKTsKKwkJCQloaWRfd2FybihwaWRmZi0+aGlkLAorCQkJCQkgImRldmljZSByZXBvcnRzICVkIHNpbXVsdGFuZW91cyBlZmZlY3RzXG4iLAorCQkJCQkgcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWRlYnVnKCJwaWRfcG9vbCByZXF1ZXN0ZWQgYWdhaW4iKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgInBpZF9wb29sIHJlcXVlc3RlZCBhZ2FpblxuIik7CiAJCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9QT09MXSwKIAkJCQkJICBVU0JfRElSX0lOKTsKIAkJCXVzYmhpZF93YWl0X2lvKGhpZCk7CkBAIC0xMjE1LDcgKzEyMDYsNyBAQAogCiAJZXJyb3IgPSBwaWRmZl9yZXF1ZXN0X2VmZmVjdF91cGxvYWQocGlkZmYsIDEpOwogCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogdXBsb2FkIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidXBsb2FkIHJlcXVlc3QgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTIyNCw4ICsxMjE1LDggQEAKIAkJcGlkZmZfYXV0b2NlbnRlcihwaWRmZiwgMHhmZmZmKTsKIAkJc2V0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImhpZC1waWRmZjogIgotCQkgICAgICAgImRldmljZSBoYXMgdW5rbm93biBhdXRvY2VudGVyIGNvbnRyb2wgbWV0aG9kXG4iKTsKKwkJaGlkX25vdGljZShwaWRmZi0+aGlkLAorCQkJICAgImRldmljZSBoYXMgdW5rbm93biBhdXRvY2VudGVyIGNvbnRyb2wgbWV0aG9kXG4iKTsKIAl9CiAKIAlwaWRmZl9lcmFzZV9waWQocGlkZmYsCkBAIC0xMjQ4LDEwICsxMjM5LDEwIEBACiAJaW50IG1heF9lZmZlY3RzOwogCWludCBlcnJvcjsKIAotCWRlYnVnKCJzdGFydGluZyBwaWQgaW5pdCIpOworCWhpZF9kYmcoaGlkLCAic3RhcnRpbmcgcGlkIGluaXRcbiIpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0KSkgewotCQlkZWJ1Zygibm90IGEgUElEIGRldmljZSwgbm8gb3V0cHV0IHJlcG9ydCIpOworCQloaWRfZGJnKGhpZCwgIm5vdCBhIFBJRCBkZXZpY2UsIG5vIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyNjUsNyArMTI1Niw3IEBACiAJcGlkZmZfZmluZF9yZXBvcnRzKGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCBwaWRmZik7CiAKIAlpZiAoIXBpZGZmX3JlcG9ydHNfb2socGlkZmYpKSB7Ci0JCWRlYnVnKCJyZXBvcnRzIG5vdCBvaywgYWJvcnRpbmciKTsKKwkJaGlkX2RiZyhoaWQsICJyZXBvcnRzIG5vdCBvaywgYWJvcnRpbmdcbiIpOwogCQllcnJvciA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMjc4LDggKzEyNjksOCBAQAogCiAJaWYgKHRlc3RfYml0KEZGX0dBSU4sIGRldi0+ZmZiaXQpKSB7CiAJCXBpZGZmX3NldCgmcGlkZmYtPmRldmljZV9nYWluW1BJRF9ERVZJQ0VfR0FJTl9GSUVMRF0sIDB4ZmZmZik7Ci0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfR0FJTl0sCi0JCQkJICBVU0JfRElSX09VVCk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0RFVklDRV9HQUlOXSwKKwkJCQkgICAgIFVTQl9ESVJfT1VUKTsKIAl9CiAKIAllcnJvciA9IHBpZGZmX2NoZWNrX2F1dG9jZW50ZXIocGlkZmYsIGRldik7CkBAIC0xMjkwLDIzICsxMjgxLDIzIEBACiAJICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9FRkZFQ1RfQkxPQ0tfSU5ERVhdLmZpZWxkLT5sb2dpY2FsX21heGltdW0gLQogCSAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS5maWVsZC0+bG9naWNhbF9taW5pbXVtICsKIAkgICAgMTsKLQlkZWJ1ZygibWF4IGVmZmVjdHMgaXMgJWQiLCBtYXhfZWZmZWN0cyk7CisJaGlkX2RiZyhoaWQsICJtYXggZWZmZWN0cyBpcyAlZFxuIiwgbWF4X2VmZmVjdHMpOwogCiAJaWYgKG1heF9lZmZlY3RzID4gUElEX0VGRkVDVFNfTUFYKQogCQltYXhfZWZmZWN0cyA9IFBJRF9FRkZFQ1RTX01BWDsKIAogCWlmIChwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWUpCi0JCWRlYnVnKCJtYXggc2ltdWx0YW5lb3VzIGVmZmVjdHMgaXMgJWQiLAotCQkgICAgICBwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWVbMF0pOworCQloaWRfZGJnKGhpZCwgIm1heCBzaW11bHRhbmVvdXMgZWZmZWN0cyBpcyAlZFxuIiwKKwkJCXBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSk7CiAKIAlpZiAocGlkZmYtPnBvb2xbUElEX1JBTV9QT09MX1NJWkVdLnZhbHVlKQotCQlkZWJ1ZygiZGV2aWNlIG1lbW9yeSBzaXplIGlzICVkIGJ5dGVzIiwKLQkJICAgICAgcGlkZmYtPnBvb2xbUElEX1JBTV9QT09MX1NJWkVdLnZhbHVlWzBdKTsKKwkJaGlkX2RiZyhoaWQsICJkZXZpY2UgbWVtb3J5IHNpemUgaXMgJWQgYnl0ZXNcbiIsCisJCQlwaWRmZi0+cG9vbFtQSURfUkFNX1BPT0xfU0laRV0udmFsdWVbMF0pOwogCiAJaWYgKHBpZGZmLT5wb29sW1BJRF9ERVZJQ0VfTUFOQUdFRF9QT09MXS52YWx1ZSAmJgogCSAgICBwaWRmZi0+cG9vbFtQSURfREVWSUNFX01BTkFHRURfUE9PTF0udmFsdWVbMF0gPT0gMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImhpZC1waWRmZjogIgotCQkgICAgICAgImRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGRldmljZSBtYW5hZ2VkIHBvb2xcbiIpOworCQloaWRfbm90aWNlKGhpZCwKKwkJCSAgICJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBkZXZpY2UgbWFuYWdlZCBwb29sXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtMTMyMiw4ICsxMzEzLDcgQEAKIAlmZi0+c2V0X2F1dG9jZW50ZXIgPSBwaWRmZl9zZXRfYXV0b2NlbnRlcjsKIAlmZi0+cGxheWJhY2sgPSBwaWRmZl9wbGF5YmFjazsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBVU0IgSElEIFBJRCBkZXZpY2VzIGJ5ICIKLQkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisJaGlkX2luZm8oZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIFVTQiBISUQgUElEIGRldmljZXMgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCAyYzE4NTQ3Li45YTk0YjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAl7IFVTQl9WRU5ET1JfSURfQ0hJQywgVVNCX0RFVklDRV9JRF9DSElDX0dBTUVQQUQsIEhJRF9RVUlSS19CQURQQUQgfSwKIAl7IFVTQl9WRU5ET1JfSURfRFdBViwgVVNCX0RFVklDRV9JRF9FR0FMQVhfVE9VQ0hDT05UUk9MTEVSLCBISURfUVVJUktfTVVMVElfSU5QVVQgfCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfTU9KTywgVVNCX0RFVklDRV9JRF9SRVRST19BREFQVEVSLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKLQl7IFVTQl9WRU5ET1JfSURfVFVSQk9YLCBVU0JfREVWSUNFX0lEX1RVUkJPWF9UT1VDSFNDUkVFTl9NT1NBUlQsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRFJJVklORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9IQVBQLCBVU0JfREVWSUNFX0lEX1VHQ0lfRkxZSU5HLCBISURfUVVJUktfQkFEUEFEIHwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0hBUFAsIFVTQl9ERVZJQ0VfSURfVUdDSV9GSUdIVElORywgSElEX1FVSVJLX0JBRFBBRCB8IEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LApAQCAtODUsNyArODQsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9QSV9FTkdJTkVFUklORywgVVNCX0RFVklDRV9JRF9QSV9FTkdJTkVFUklOR19WRUNfVVNCX0ZPT1RQRURBTCwgSElEX1FVSVJLX0hJRElOUFVUX0ZPUkNFIH0sCiAKIAl7IFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX01VTFRJX1RPVUNILCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKLQorCXsgVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgMCwgMCB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggOTg0ZmViMy4uYWYwYTdjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNTg1LDE2MyArNTg1LDE2OCBAQAogewogCXN0cnVjdCBoaWRkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaGlkZGV2ICpoaWRkZXYgPSBsaXN0LT5oaWRkZXY7Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGhpZGRldi0+aGlkOwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAlzdHJ1Y3QgaGlkZGV2X2NvbGxlY3Rpb25faW5mbyBjaW5mbzsKIAlzdHJ1Y3QgaGlkZGV2X3JlcG9ydF9pbmZvIHJpbmZvOwogCXN0cnVjdCBoaWRkZXZfZmllbGRfaW5mbyBmaW5mbzsKIAlzdHJ1Y3QgaGlkZGV2X2RldmluZm8gZGluZm87CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKLQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAl2b2lkIF9fdXNlciAqdXNlcl9hcmcgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IGksIHI7Ci0JCisJaW50IGksIHIgPSAtRUlOVkFMOworCiAJLyogQ2FsbGVkIHdpdGhvdXQgQktMIGJ5IGNvbXBhdCBtZXRob2RzIHNvIG5vIEJLTCB0YWtlbiAqLwogCi0JLyogRklYTUU6IFdobyBvciB3aGF0IHN0b3AgdGhpcyByYWNpbmcgd2l0aCBhIGRpc2Nvbm5lY3QgPz8gKi8KLQlpZiAoIWhpZGRldi0+ZXhpc3QgfHwgIWhpZCkKLQkJcmV0dXJuIC1FSU87CisJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwlpZiAoIWhpZGRldi0+ZXhpc3QpIHsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gcmV0X3VubG9jazsKKwl9CiAKLQlkZXYgPSBoaWRfdG9fdXNiX2RldihoaWQpOworCWhpZCA9IGhpZGRldi0+aGlkOwogCiAJc3dpdGNoIChjbWQpIHsKIAogCWNhc2UgSElESU9DR1ZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihISURfVkVSU0lPTiwgKGludCBfX3VzZXIgKilhcmcpOworCQlyID0gcHV0X3VzZXIoSElEX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJnKSA/CisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0FQUExJQ0FUSU9OOgogCQlpZiAoYXJnIDwgMCB8fCBhcmcgPj0gaGlkLT5tYXhhcHBsaWNhdGlvbikKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQogCQkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09CiAJCQkgICAgSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gJiYgYXJnLS0gPT0gMCkKIAkJCQlicmVhazsKIAotCQlpZiAoaSA9PSBoaWQtPm1heGNvbGxlY3Rpb24pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlyZXR1cm4gaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlOworCQlpZiAoaSA8IGhpZC0+bWF4Y29sbGVjdGlvbikKKwkJCXIgPSBoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2U7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHREVWSU5GTzoKLQkJZGluZm8uYnVzdHlwZSA9IEJVU19VU0I7Ci0JCWRpbmZvLmJ1c251bSA9IGRldi0+YnVzLT5idXNudW07Ci0JCWRpbmZvLmRldm51bSA9IGRldi0+ZGV2bnVtOwotCQlkaW5mby5pZm51bSA9IHVzYmhpZC0+aWZudW07Ci0JCWRpbmZvLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7Ci0JCWRpbmZvLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKLQkJZGluZm8udmVyc2lvbiA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwotCQlkaW5mby5udW1fYXBwbGljYXRpb25zID0gaGlkLT5tYXhhcHBsaWNhdGlvbjsKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmRpbmZvLCBzaXplb2YoZGluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQl7CisJCQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKKwkJCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JCXJldHVybiAwOworCQkJZGluZm8uYnVzdHlwZSA9IEJVU19VU0I7CisJCQlkaW5mby5idXNudW0gPSBkZXYtPmJ1cy0+YnVzbnVtOworCQkJZGluZm8uZGV2bnVtID0gZGV2LT5kZXZudW07CisJCQlkaW5mby5pZm51bSA9IHVzYmhpZC0+aWZudW07CisJCQlkaW5mby52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCQkJZGluZm8ucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQkJZGluZm8udmVyc2lvbiA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCQkJZGluZm8ubnVtX2FwcGxpY2F0aW9ucyA9IGhpZC0+bWF4YXBwbGljYXRpb247CisKKwkJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZkaW5mbywgc2l6ZW9mKGRpbmZvKSkgPworCQkJCS1FRkFVTFQgOiAwOworCQkJYnJlYWs7CisJCX0KIAogCWNhc2UgSElESU9DR0ZMQUc6Ci0JCWlmIChwdXRfdXNlcihsaXN0LT5mbGFncywgKGludCBfX3VzZXIgKilhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7CisJCXIgPSBwdXRfdXNlcihsaXN0LT5mbGFncywgKGludCBfX3VzZXIgKilhcmcpID8KKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DU0ZMQUc6CiAJCXsKIAkJCWludCBuZXdmbGFnczsKLQkJCWlmIChnZXRfdXNlcihuZXdmbGFncywgKGludCBfX3VzZXIgKilhcmcpKQotCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoZ2V0X3VzZXIobmV3ZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJCXIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQogCiAJCQlpZiAoKG5ld2ZsYWdzICYgfkhJRERFVl9GTEFHUykgIT0gMCB8fAogCQkJICAgICgobmV3ZmxhZ3MgJiBISURERVZfRkxBR19SRVBPUlQpICE9IDAgJiYKIAkJCSAgICAgKG5ld2ZsYWdzICYgSElEREVWX0ZMQUdfVVJFRikgPT0gMCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJYnJlYWs7CiAKIAkJCWxpc3QtPmZsYWdzID0gbmV3ZmxhZ3M7CiAKLQkJCXJldHVybiAwOworCQkJciA9IDA7CisJCQlicmVhazsKIAkJfQogCiAJY2FzZSBISURJT0NHU1RSSU5HOgotCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlpZiAoaGlkZGV2LT5leGlzdCkKLQkJCXIgPSBoaWRkZXZfaW9jdGxfc3RyaW5nKGhpZGRldiwgY21kLCB1c2VyX2FyZyk7Ci0JCWVsc2UKLQkJCXIgPSAtRU5PREVWOwotCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCXJldHVybiByOworCQlyID0gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQlicmVhazsKIAogCWNhc2UgSElESU9DSU5JVFJFUE9SVDoKLQkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJaWYgKCFoaWRkZXYtPmV4aXN0KSB7Ci0JCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQogCQl1c2JoaWRfaW5pdF9yZXBvcnRzKGhpZCk7Ci0JCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQotCQlyZXR1cm4gMDsKKwkJciA9IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHUkVQT1JUOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKHJpbmZvLnJlcG9ydF90eXBlID09IEhJRF9SRVBPUlRfVFlQRV9PVVRQVVQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCi0JCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKTsKKwkJaWYgKHJlcG9ydCA9PSBOVUxMKQorCQkJYnJlYWs7CiAKLQkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKLQkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX0lOKTsKLQkJCXVzYmhpZF93YWl0X2lvKGhpZCk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOworCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9JTik7CisJCXVzYmhpZF93YWl0X2lvKGhpZCk7CiAKLQkJcmV0dXJuIDA7CisJCXIgPSAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DU1JFUE9SVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChyaW5mby5yZXBvcnRfdHlwZSA9PSBISURfUkVQT1JUX1RZUEVfSU5QVVQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCi0JCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKTsKKwkJaWYgKHJlcG9ydCA9PSBOVUxMKQorCQkJYnJlYWs7CiAKLQkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJaWYgKGhpZGRldi0+ZXhpc3QpIHsKLQkJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7Ci0JCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKKwkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKIAotCQlyZXR1cm4gMDsKKwkJciA9IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NHUkVQT1JUSU5GTzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQogCi0JCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKTsKKwkJaWYgKHJlcG9ydCA9PSBOVUxMKQorCQkJYnJlYWs7CiAKIAkJcmluZm8ubnVtX2ZpZWxkcyA9IHJlcG9ydC0+bWF4ZmllbGQ7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnJpbmZvLCBzaXplb2YocmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldHVybiAwOworCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCAmcmluZm8sIHNpemVvZihyaW5mbykpID8KKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR0ZJRUxESU5GTzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmaW5mbywgdXNlcl9hcmcsIHNpemVvZihmaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmluZm8sIHVzZXJfYXJnLCBzaXplb2YoZmluZm8pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCiAJCXJpbmZvLnJlcG9ydF90eXBlID0gZmluZm8ucmVwb3J0X3R5cGU7CiAJCXJpbmZvLnJlcG9ydF9pZCA9IGZpbmZvLnJlcG9ydF9pZDsKLQkJaWYgKChyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbykpID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbyk7CisJCWlmIChyZXBvcnQgPT0gTlVMTCkKKwkJCWJyZWFrOwogCiAJCWlmIChmaW5mby5maWVsZF9pbmRleCA+PSByZXBvcnQtPm1heGZpZWxkKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAogCQlmaWVsZCA9IHJlcG9ydC0+ZmllbGRbZmluZm8uZmllbGRfaW5kZXhdOwogCQltZW1zZXQoJmZpbmZvLCAwLCBzaXplb2YoZmluZm8pKTsKQEAgLTc2MCwxMCArNzY1LDkgQEAKIAkJZmluZm8udW5pdF9leHBvbmVudCA9IGZpZWxkLT51bml0X2V4cG9uZW50OwogCQlmaW5mby51bml0ID0gZmllbGQtPnVuaXQ7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmZpbmZvLCBzaXplb2YoZmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldHVybiAwOworCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCAmZmluZm8sIHNpemVvZihmaW5mbykpID8KKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR1VDT0RFOgogCQkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTc3Miw1NyArNzc2LDY2IEBACiAJY2FzZSBISURJT0NHVVNBR0VTOgogCWNhc2UgSElESU9DU1VTQUdFUzoKIAljYXNlIEhJRElPQ0dDT0xMRUNUSU9OSU5ERVg6Ci0JCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCWlmIChoaWRkZXYtPmV4aXN0KQotCQkJciA9IGhpZGRldl9pb2N0bF91c2FnZShoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOwotCQllbHNlCi0JCQlyID0gLUVOT0RFVjsKLQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlyZXR1cm4gcjsKKwkJciA9IGhpZGRldl9pb2N0bF91c2FnZShoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR0NPTExFQ1RJT05JTkZPOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGNpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaW5mbywgdXNlcl9hcmcsIHNpemVvZihjaW5mbykpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKGNpbmZvLmluZGV4ID49IGhpZC0+bWF4Y29sbGVjdGlvbikKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJY2luZm8udHlwZSA9IGhpZC0+Y29sbGVjdGlvbltjaW5mby5pbmRleF0udHlwZTsKIAkJY2luZm8udXNhZ2UgPSBoaWQtPmNvbGxlY3Rpb25bY2luZm8uaW5kZXhdLnVzYWdlOwogCQljaW5mby5sZXZlbCA9IGhpZC0+Y29sbGVjdGlvbltjaW5mby5pbmRleF0ubGV2ZWw7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKKwkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/CisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCiAJCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnSCcgfHwgX0lPQ19ESVIoY21kKSAhPSBfSU9DX1JFQUQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCiAJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihISURJT0NHTkFNRSgwKSkpIHsKIAkJCWludCBsZW47Ci0JCQlpZiAoIWhpZC0+bmFtZSkKLQkJCQlyZXR1cm4gMDsKKworCQkJaWYgKCFoaWQtPm5hbWUpIHsKKwkJCQlyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwogCQkJbGVuID0gc3RybGVuKGhpZC0+bmFtZSkgKyAxOwogCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKQogCQkJCSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+bmFtZSwgbGVuKSA/CisJCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPm5hbWUsIGxlbikgPwogCQkJCS1FRkFVTFQgOiBsZW47CisJCQlicmVhazsKIAkJfQogCiAJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihISURJT0NHUEhZUygwKSkpIHsKIAkJCWludCBsZW47Ci0JCQlpZiAoIWhpZC0+cGh5cykKLQkJCQlyZXR1cm4gMDsKKworCQkJaWYgKCFoaWQtPnBoeXMpIHsKKwkJCQlyID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwogCQkJbGVuID0gc3RybGVuKGhpZC0+cGh5cykgKyAxOwogCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKQogCQkJCWxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcih1c2VyX2FyZywgaGlkLT5waHlzLCBsZW4pID8KKwkJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+cGh5cywgbGVuKSA/CiAJCQkJLUVGQVVMVCA6IGxlbjsKKwkJCWJyZWFrOwogCQl9CiAJfQotCXJldHVybiAtRUlOVkFMOworCityZXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwlyZXR1cm4gcjsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKQEAgLTg5Miw3ICs5MDUsNyBAQAogCWhpZGRldi0+ZXhpc3QgPSAxOwogCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWVycl9oaWQoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKKwkJaGlkX2VycihoaWQsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2VcbiIpOwogCQloaWQtPmhpZGRldiA9IE5VTEw7CiAJCWtmcmVlKGhpZGRldik7CiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaCBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaAppbmRleCA4OWQyZTg0Li4xNjczY2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCkBAIC05NSw3ICs5NSw2IEBACiAJdW5zaWduZWQgbG9uZyBzdG9wX3JldHJ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgdG8gZ2l2ZSB1cCwgaW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGludCByZXRyeV9kZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBsZW5ndGggaW4gbXMgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd29yazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFzayBjb250ZXh0IGZvciByZXNldHMgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdGFydF93b3JrOwkJCQkvKiB3YWtpbmcgdXAgZm9yIG91dHB1dCB0byBiZSBkb25lIGluIGEgdGFzayAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQkJCQkJLyogRm9yIHNsZWVwaW5nICovCiAJaW50IGxlZGNvdW50OwkJCQkJCQkvKiBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsZWRzICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCmluZGV4IGE5NDg2MDUuLjA2NTgxNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKQEAgLTI0LDYgKzI0LDggQEAKICAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTEwNCwxNiArMTA2LDE4IEBACiAJCQlpZiAodXNiX2tiZF9rZXljb2RlW2tiZC0+b2xkW2ldXSkKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGtiZC0+ZGV2LCB1c2Jfa2JkX2tleWNvZGVba2JkLT5vbGRbaV1dLCAwKTsKIAkJCWVsc2UKLQkJCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKLQkJCQkJCSJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsIGtiZC0+b2xkW2ldKTsKKwkJCQloaWRfaW5mbyh1cmItPmRldiwKKwkJCQkJICJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsCisJCQkJCSBrYmQtPm9sZFtpXSk7CiAJCX0KIAogCQlpZiAoa2JkLT5uZXdbaV0gPiAzICYmIG1lbXNjYW4oa2JkLT5vbGQgKyAyLCBrYmQtPm5ld1tpXSwgNikgPT0ga2JkLT5vbGQgKyA4KSB7CiAJCQlpZiAodXNiX2tiZF9rZXljb2RlW2tiZC0+bmV3W2ldXSkKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGtiZC0+ZGV2LCB1c2Jfa2JkX2tleWNvZGVba2JkLT5uZXdbaV1dLCAxKTsKIAkJCWVsc2UKLQkJCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwKLQkJCQkJCSJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsIGtiZC0+bmV3W2ldKTsKKwkJCQloaWRfaW5mbyh1cmItPmRldiwKKwkJCQkJICJVbmtub3duIGtleSAoc2NhbmNvZGUgJSN4KSByZWxlYXNlZC5cbiIsCisJCQkJCSBrYmQtPm5ld1tpXSk7CiAJCX0KIAl9CiAKQEAgLTEyNCw5ICsxMjgsOSBAQAogcmVzdWJtaXQ6CiAJaSA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChpKQotCQllcnJfaGlkICgiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQwLCBzdGF0dXMgJWQiLAotCQkJCWtiZC0+dXNiZGV2LT5idXMtPmJ1c19uYW1lLAotCQkJCWtiZC0+dXNiZGV2LT5kZXZwYXRoLCBpKTsKKwkJaGlkX2Vycih1cmItPmRldiwgImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0MCwgc3RhdHVzICVkIiwKKwkJCWtiZC0+dXNiZGV2LT5idXMtPmJ1c19uYW1lLAorCQkJa2JkLT51c2JkZXYtPmRldnBhdGgsIGkpOwogfQogCiBzdGF0aWMgaW50IHVzYl9rYmRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKQEAgLTE1MCw3ICsxNTQsNyBAQAogCSooa2JkLT5sZWRzKSA9IGtiZC0+bmV3bGVkczsKIAlrYmQtPmxlZC0+ZGV2ID0ga2JkLT51c2JkZXY7CiAJaWYgKHVzYl9zdWJtaXRfdXJiKGtiZC0+bGVkLCBHRlBfQVRPTUlDKSkKLQkJZXJyX2hpZCgidXNiX3N1Ym1pdF91cmIobGVkcykgZmFpbGVkIik7CisJCXByX2VycigidXNiX3N1Ym1pdF91cmIobGVkcykgZmFpbGVkXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYwLDcgKzE2NCw3IEBACiAJc3RydWN0IHVzYl9rYmQgKmtiZCA9IHVyYi0+Y29udGV4dDsKIAogCWlmICh1cmItPnN0YXR1cykKLQkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJsZWQgdXJiIHN0YXR1cyAlZCByZWNlaXZlZFxuIiwKKwkJaGlkX3dhcm4odXJiLT5kZXYsICJsZWQgdXJiIHN0YXR1cyAlZCByZWNlaXZlZFxuIiwKIAkJCSB1cmItPnN0YXR1cyk7CiAKIAlpZiAoKihrYmQtPmxlZHMpID09IGtiZC0+bmV3bGVkcykKQEAgLTE2OSw3ICsxNzMsNyBAQAogCSooa2JkLT5sZWRzKSA9IGtiZC0+bmV3bGVkczsKIAlrYmQtPmxlZC0+ZGV2ID0ga2JkLT51c2JkZXY7CiAJaWYgKHVzYl9zdWJtaXRfdXJiKGtiZC0+bGVkLCBHRlBfQVRPTUlDKSkKLQkJZXJyX2hpZCgidXNiX3N1Ym1pdF91cmIobGVkcykgZmFpbGVkIik7CisJCWhpZF9lcnIodXJiLT5kZXYsICJ1c2Jfc3VibWl0X3VyYihsZWRzKSBmYWlsZWRcbiIpOwogfQogCiBzdGF0aWMgaW50IHVzYl9rYmRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggYTU2ZjZhZC4uMzVmMDBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtMjc0LDYgKzI3NCwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgYXR4cDEuCiAKK2NvbmZpZyBTRU5TT1JTX0RTNjIwCisJdHJpc3RhdGUgIkRhbGxhcyBTZW1pY29uZHVjdG9yIERTNjIwIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIERhbGxhcyBTZW1pY29uZHVjdG9yCisJICBEUzYyMCBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZHM2MjAuCisKIGNvbmZpZyBTRU5TT1JTX0RTMTYyMQogCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzE2MjEgYW5kIERTMTYyNSIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNzM0LDYgKzc0NCwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc2h0MTUuCiAKK2NvbmZpZyBTRU5TT1JTX1NIVDIxCisJdHJpc3RhdGUgIlNlbnNpcm9uIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzLiBTSFQyMSBhbmQgY29tcGF0LiIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgU2Vuc2lyb24gU0hUMjEsIFNIVDI1CisJICBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2h0MjEuCisKIGNvbmZpZyBTRU5TT1JTX1MzQwogCXRyaXN0YXRlICJTYW1zdW5nIGJ1aWx0LWluIEFEQyIKIAlkZXBlbmRzIG9uIFMzQ19BREMKQEAgLTc4OSwxMCArODA5LDEwIEBACiAJICB3aWxsIGJlIGNhbGxlZCBkbWUxNzM3LgogCiBjb25maWcgU0VOU09SU19FTUMxNDAzCi0JdHJpc3RhdGUgIlNNU0MgRU1DMTQwMyB0aGVybWFsIHNlbnNvciIKKwl0cmlzdGF0ZSAiU01TQyBFTUMxNDAzLzIzIHRoZXJtYWwgc2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCiAJaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIEVNQzE0MDMKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgU01TQyBFTUMxNDAzLzIzCiAJICB0ZW1wZXJhdHVyZSBtb25pdG9yaW5nIGNoaXAuCiAKIAkgIFRocmVzaG9sZCB2YWx1ZXMgY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmcgc3lzZnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCAyNDc5YjNkLi5kZGUwMmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTQxLDYgKzQxLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0NPUkVURU1QKQkrPSBjb3JldGVtcC5vCiBvYmotJChDT05GSUdfU0VOU09SU19QS0dURU1QKQkrPSBwa2d0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RNRTE3MzcpCSs9IGRtZTE3Mzcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRFM2MjApCSs9IGRzNjIwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VNQzE0MDMpCSs9IGVtYzE0MDMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRU1DMjEwMykJKz0gZW1jMjEwMy5vCkBAIC05MCw2ICs5MSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1MzQykJKz0gczNjLWh3bW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NIVDE1KQkrPSBzaHQxNS5vCitvYmotJChDT05GSUdfU0VOU09SU19TSFQyMSkJKz0gc2h0MjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU0lTNTU5NSkJKz0gc2lzNTU5NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTU02NjUpCSs9IHNtbTY2NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3KSs9IHNtc2M0N2IzOTcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKaW5kZXggMDM2OTRjYy4uOGYwN2E5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydS5jCkBAIC0yMCw2ICsyMCw5IEBACiAgICAgdGhlIGN1c3RvbSBBYml0IHVHdXJ1IGNoaXAgZm91bmQgb24gQWJpdCB1R3VydSBtb3RoZXJib2FyZHMuIE5vdGU6IGJlY2F1c2UKICAgICBvZiBsYWNrIG9mIHNwZWNzIHRoZSBDUFUvUkFNIHZvbHRhZ2UgJiBmcmVxdWVuY3kgY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkIQogKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMjAsNiArMjIzLDEwIEBACiAJdTggcHdtX3NldHRpbmdzW0FCSVRfVUdVUlVfTUFYX1BXTVNdWzVdOwogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKm5ldmVyX2hhcHBlbiA9ICJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpyZXBvcnRfdGhpcyA9CisJIlBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgYWJpdHVndXJ1IG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUykiOworCiAvKiB3YWl0IHRpbGwgdGhlIHVndXJ1IGlzIGluIHRoZSBzcGVjaWZpZWQgc3RhdGUgKi8KIHN0YXRpYyBpbnQgYWJpdHVndXJ1X3dhaXQoc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhLCB1OCBzdGF0ZSkKIHsKQEAgLTQzOCw4ICs0NDUsNyBAQAogCiAJLyogVGVzdCB2YWwgaXMgc2FuZSAvIHVzYWJsZSBmb3Igc2Vuc29yIHR5cGUgZGV0ZWN0aW9uLiAqLwogCWlmICgodmFsIDwgMTB1KSB8fCAodmFsID4gMjUwdSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBBQklUX1VHVVJVX05BTUUKLQkJCSI6IGJhbmsxLXNlbnNvcjogJWQgcmVhZGluZyAoJWQpIHRvbyBjbG9zZSB0byBsaW1pdHMsICIKKwkJcHJfd2FybigiYmFuazEtc2Vuc29yOiAlZCByZWFkaW5nICglZCkgdG9vIGNsb3NlIHRvIGxpbWl0cywgIgogCQkJInVuYWJsZSB0byBkZXRlcm1pbmUgc2Vuc29yIHR5cGUsIHNraXBwaW5nIHNlbnNvclxuIiwKIAkJCShpbnQpc2Vuc29yX2FkZHIsIChpbnQpdmFsKTsKIAkJLyogYXNzdW1lIG5vIHNlbnNvciBpcyB0aGVyZSBmb3Igc2Vuc29ycyBmb3Igd2hpY2ggd2UgY2FuJ3QKQEAgLTUzNSwxMCArNTQxLDggQEAKIAkJCQkzKSA9PSAzKQogCQkJYnJlYWs7CiAJaWYgKGkgPT0gMykgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVV9OQU1FCi0JCQkiOiBGYXRhbCBlcnJvciBjb3VsZCBub3QgcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4gIgotCQkJIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBwbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlICIKLQkJCSJhYml0dWd1cnUgbWFpbnRhaW5lciAoc2VlIE1BSU5UQUlORVJTKVxuIik7CisJCXByX2VycigiRmF0YWwgZXJyb3IgY291bGQgbm90IHJlc3RvcmUgb3JpZ2luYWwgc2V0dGluZ3MuICVzICVzXG4iLAorCQkgICAgICAgbmV2ZXJfaGFwcGVuLCByZXBvcnRfdGhpcyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTI2OCwxNCArMTI3MiwxMiBAQAogCX0KIAkvKiBGYWlsIHNhZmUgY2hlY2ssIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KIAlpZiAoc3lzZnNfbmFtZXNfZnJlZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRSAiOiBGYXRhbCBlcnJvciByYW4gb3V0IG9mICIKLQkJICAgICAgICJzcGFjZSBmb3Igc3lzZnMgYXR0ciBuYW1lcy4gVGhpcyBzaG91bGQgbmV2ZXIgIgotCQkgICAgICAgImhhcHBlbiBwbGVhc2UgcmVwb3J0IHRvIHRoZSBhYml0dWd1cnUgbWFpbnRhaW5lciAiCi0JCSAgICAgICAiKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl9lcnIoIkZhdGFsIGVycm9yIHJhbiBvdXQgb2Ygc3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuICVzICVzIiwKKwkJICAgICAgIG5ldmVyX2hhcHBlbiwgcmVwb3J0X3RoaXMpOwogCQlyZXMgPSAtRU5BTUVUT09MT05HOwogCQlnb3RvIGFiaXR1Z3VydV9wcm9iZV9lcnJvcjsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVX05BTUUgIjogZm91bmQgQWJpdCB1R3VydVxuIik7CisJcHJfaW5mbygiZm91bmQgQWJpdCB1R3VydVxuIik7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzeXNmc19hdHRyX2k7IGkrKykKQEAgLTE0MzIsOCArMTQzNCw3IEBACiAJCSIweCUwMlhcbiIsICh1bnNpZ25lZCBpbnQpZGF0YV92YWwsICh1bnNpZ25lZCBpbnQpY21kX3ZhbCk7CiAKIAlpZiAoZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVX05BTUUgIjogQXNzdW1pbmcgQWJpdCB1R3VydSBpcyAiCi0JCQkJInByZXNlbnQgYmVjYXVzZSBvZiBcImZvcmNlXCIgcGFyYW1ldGVyXG4iKTsKKwkJcHJfaW5mbygiQXNzdW1pbmcgQWJpdCB1R3VydSBpcyBwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiBBQklUX1VHVVJVX0JBU0U7CiAJfQogCkBAIC0xNDY3LDggKzE0NjgsNyBAQAogCiAJYWJpdHVndXJ1X3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoQUJJVF9VR1VSVV9OQU1FLCBhZGRyZXNzKTsKIAlpZiAoIWFiaXR1Z3VydV9wZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKLQkJCSI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOwogCX0KQEAgLTE0NzksMTUgKzE0NzksMTMgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGFiaXR1Z3VydV9wZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKLQkJCSI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoYWJpdHVndXJ1X3BkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRQotCQkJIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCmluZGV4IDNjZjI4YWYuLjQ4ZDIxZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCkBAIC0yMyw2ICsyMyw5IEBACiAgICAgY2hpcCBmb3VuZCBvbiBuZXdlciBBYml0IHVHdXJ1IG1vdGhlcmJvYXJkcy4gTm90ZTogYmVjYXVzZSBvZiBsYWNrIG9mIHNwZWNzCiAgICAgb25seSByZWFkaW5nIHRoZSBzZW5zb3JzIGFuZCB0aGVpciBzZXR0aW5ncyBpcyBzdXBwb3J0ZWQuCiAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNjA4LDYgKzYxMSw5IEBACiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJFbmFibGUvZGlzYWJsZSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyIpOwogCitzdGF0aWMgY29uc3QgY2hhciAqbmV2ZXJfaGFwcGVuID0gIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4iOworc3RhdGljIGNvbnN0IGNoYXIgKnJlcG9ydF90aGlzID0KKwkiUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHRoZSBhYml0dWd1cnUzIG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUykiOwogCiAvKiB3YWl0IHdoaWxlIHRoZSB1Z3VydSBpcyBidXN5ICh1c3VhbGx5IGFmdGVyIGEgd3JpdGUpICovCiBzdGF0aWMgaW50IGFiaXR1Z3VydTNfd2FpdF93aGlsZV9idXN5KHN0cnVjdCBhYml0dWd1cnUzX2RhdGEgKmRhdGEpCkBAIC05NDAsMTUgKzk0NiwxMyBAQAogCQlpZiAoYWJpdHVndXJ1M19tb3RoZXJib2FyZHNbaV0uaWQgPT0gaWQpCiAJCQlicmVhazsKIAlpZiAoIWFiaXR1Z3VydTNfbW90aGVyYm9hcmRzW2ldLmlkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FICI6IGVycm9yIHVua25vd24gbW90aGVyYm9hcmQgIgotCQkJIklEOiAlMDRYLiBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIGFiaXR1Z3VydTMgIgotCQkJIm1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIsICh1bnNpZ25lZCBpbnQpaWQpOworCQlwcl9lcnIoImVycm9yIHVua25vd24gbW90aGVyYm9hcmQgSUQ6ICUwNFguICVzXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClpZCwgcmVwb3J0X3RoaXMpOwogCQlnb3RvIGFiaXR1Z3VydTNfcHJvYmVfZXJyb3I7CiAJfQogCWRhdGEtPnNlbnNvcnMgPSBhYml0dWd1cnUzX21vdGhlcmJvYXJkc1tpXS5zZW5zb3JzOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVM19OQU1FICI6IGZvdW5kIEFiaXQgdUd1cnUzLCBtb3RoZXJib2FyZCAiCi0JCSJJRDogJTA0WFxuIiwgKHVuc2lnbmVkIGludClpZCk7CisJcHJfaW5mbygiZm91bmQgQWJpdCB1R3VydTMsIG1vdGhlcmJvYXJkIElEOiAlMDRYXG4iLCAodW5zaWduZWQgaW50KWlkKTsKIAogCS8qIEZpbGwgdGhlIHN5c2ZzIGF0dHIgYXJyYXkgKi8KIAlzeXNmc19hdHRyX2kgPSAwOwpAQCAtOTU3LDExICs5NjEsOCBAQAogCWZvciAoaSA9IDA7IGRhdGEtPnNlbnNvcnNbaV0ubmFtZTsgaSsrKSB7CiAJCS8qIEZhaWwgc2FmZSBjaGVjaywgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLwogCQlpZiAoaSA+PSBBQklUX1VHVVJVM19NQVhfTk9fU0VOU09SUykgewotCQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCQkiOiBGYXRhbCBlcnJvciBtb3RoZXJib2FyZCBoYXMgbW9yZSBzZW5zb3JzICIKLQkJCQkidGhlbiBBQklUX1VHVVJVM19NQVhfTk9fU0VOU09SUy4gVGhpcyBzaG91bGQgIgotCQkJCSJuZXZlciBoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgYWJpdHVndXJ1MyAiCi0JCQkJIm1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQkJcHJfZXJyKCJGYXRhbCBlcnJvciBtb3RoZXJib2FyZCBoYXMgbW9yZSBzZW5zb3JzIHRoZW4gQUJJVF9VR1VSVTNfTUFYX05PX1NFTlNPUlMuICVzICVzXG4iLAorCQkJICAgICAgIG5ldmVyX2hhcHBlbiwgcmVwb3J0X3RoaXMpOwogCQkJcmVzID0gLUVOQU1FVE9PTE9ORzsKIAkJCWdvdG8gYWJpdHVndXJ1M19wcm9iZV9lcnJvcjsKIAkJfQpAQCAtOTgzLDEwICs5ODQsOCBAQAogCX0KIAkvKiBGYWlsIHNhZmUgY2hlY2ssIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KIAlpZiAoc3lzZnNfbmFtZXNfZnJlZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IEZhdGFsIGVycm9yIHJhbiBvdXQgb2Ygc3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuICIKLQkJCSJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgIgotCQkJImFiaXR1Z3VydTMgbWFpbnRhaW5lciAoc2VlIE1BSU5UQUlORVJTKVxuIik7CisJCXByX2VycigiRmF0YWwgZXJyb3IgcmFuIG91dCBvZiBzcGFjZSBmb3Igc3lzZnMgYXR0ciBuYW1lcy4gJXMgJXNcbiIsCisJCSAgICAgICBuZXZlcl9oYXBwZW4sIHJlcG9ydF90aGlzKTsKIAkJcmVzID0gLUVOQU1FVE9PTE9ORzsKIAkJZ290byBhYml0dWd1cnUzX3Byb2JlX2Vycm9yOwogCX0KQEAgLTExODksOCArMTE4OCw3IEBACiAJCSIweCUwMlhcbiIsICh1bnNpZ25lZCBpbnQpZGF0YV92YWwsICh1bnNpZ25lZCBpbnQpY21kX3ZhbCk7CiAKIAlpZiAoZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVM19OQU1FICI6IEFzc3VtaW5nIEFiaXQgdUd1cnUzIGlzICIKLQkJCQkicHJlc2VudCBiZWNhdXNlIG9mIFwiZm9yY2VcIiBwYXJhbWV0ZXJcbiIpOworCQlwcl9pbmZvKCJBc3N1bWluZyBBYml0IHVHdXJ1MyBpcyBwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTIxOSwxMCArMTIxNyw4IEBACiAJCQlyZXR1cm4gZXJyOwogCiAjaWZkZWYgQ09ORklHX0RNSQotCQlwcmludGsoS0VSTl9XQVJOSU5HIEFCSVRfVUdVUlUzX05BTUUgIjogdGhpcyBtb3RoZXJib2FyZCB3YXMgIgotCQkJIm5vdCBkZXRlY3RlZCB1c2luZyBETUkuIFBsZWFzZSBzZW5kIHRoZSBvdXRwdXQgb2YgIgotCQkJIlwiZG1pZGVjb2RlXCIgdG8gdGhlIGFiaXR1Z3VydTMgbWFpbnRhaW5lciAiCi0JCQkiKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl93YXJuKCJ0aGlzIG1vdGhlcmJvYXJkIHdhcyBub3QgZGV0ZWN0ZWQgdXNpbmcgRE1JLiAiCisJCQkiUGxlYXNlIHNlbmQgdGhlIG91dHB1dCBvZiBcImRtaWRlY29kZVwiIHRvIHRoZSBhYml0dWd1cnUzIG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOwogI2VuZGlmCiAJfQogCkBAIC0xMjMzLDggKzEyMjksNyBAQAogCWFiaXR1Z3VydTNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhBQklUX1VHVVJVM19OQU1FLAogCQkJCQkJQUJJVF9VR1VSVTNfQkFTRSk7CiAJaWYgKCFhYml0dWd1cnUzX3BkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOwogCX0KQEAgLTEyNDUsMTUgKzEyNDAsMTMgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGFiaXR1Z3VydTNfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVTNfTkFNRQotCQkJIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhYml0dWd1cnUzX3BkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTkyNDAuYwppbmRleCAwNzI3YWQyLi45ZTIzNGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTkyNDAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTkyNDAuYwpAQCAtMjAsNyArMjAsNyBAQAogICogQWxhcm1zCTE2LWJpdCBtYXAgb2YgYWN0aXZlIGFsYXJtcwogICogQW5hbG9nIE91dAkwLi4xMjUwIG1WIG91dHB1dAogICoKLSAqIENoYXNzaXMgSW50cnVzaW9uOiBjbGVhciBDSSBsYXRjaCB3aXRoICdlY2hvIDEgPiBjaGFzc2lzX2NsZWFyJworICogQ2hhc3NpcyBJbnRydXNpb246IGNsZWFyIENJIGxhdGNoIHdpdGggJ2VjaG8gMCA+IGludHJ1c2lvbjBfYWxhcm0nCiAgKgogICogVGVzdCBoYXJkd2FyZTogSW50ZWwgU0U0NDBCWC0yIGRlc2t0b3AgbW90aGVyYm9hcmQgLS1HcmFudAogICoKQEAgLTQ3NiwxMyArNDc2LDE2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYW91dF9vdXRwdXQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2FvdXQsIHNldF9hb3V0KTsKIAogLyogY2hhc3Npc19jbGVhciAqLwotc3RhdGljIHNzaXplX3QgY2hhc3Npc19jbGVhcihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBjaGFzc2lzX2NsZWFyX2xlZ2FjeShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAorCWRldl93YXJuKGRldiwgIkF0dHJpYnV0ZSBjaGFzc2lzX2NsZWFyIGlzIGRlcHJlY2F0ZWQsICIKKwkJICJ1c2UgaW50cnVzaW9uMF9hbGFybSBpbnN0ZWFkXG4iKTsKKwogCWlmICh2YWwgPT0gMSkgewogCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQlBRE05MjQwX1JFR19DSEFTU0lTX0NMRUFSLCAweDgwKTsKQEAgLTQ5MCw3ICs0OTMsMjkgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKGNoYXNzaXNfY2xlYXIsIFNfSVdVU1IsIE5VTEwsIGNoYXNzaXNfY2xlYXIpOworc3RhdGljIERFVklDRV9BVFRSKGNoYXNzaXNfY2xlYXIsIFNfSVdVU1IsIE5VTEwsIGNoYXNzaXNfY2xlYXJfbGVnYWN5KTsKKworc3RhdGljIHNzaXplX3QgY2hhc3Npc19jbGVhcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZG05MjQwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSB8fCB2YWwgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTkyNDBfUkVHX0NIQVNTSVNfQ0xFQVIsIDB4ODApOworCWRhdGEtPnZhbGlkID0gMDsJCS8qIEZvcmNlIGNhY2hlIHJlZnJlc2ggKi8KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgImNoYXNzaXMgaW50cnVzaW9uIGxhdGNoIGNsZWFyZWRcbiIpOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbnRydXNpb24wX2FsYXJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hbGFybSwKKwkJY2hhc3Npc19jbGVhciwgMTIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtOTI0MF9hdHRyaWJ1dGVzW10gPSB7CiAJJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKQEAgLTUzMiw2ICs1NTcsNyBAQAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKIAkmZGV2X2F0dHJfYW91dF9vdXRwdXQuYXR0ciwKIAkmZGV2X2F0dHJfY2hhc3Npc19jbGVhci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW50cnVzaW9uMF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZkZXZfYXR0cl9jcHUwX3ZpZC5hdHRyLAogCU5VTEwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Fkczc4MjguYyBiL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCmluZGV4IGFhYzg1ZjMuLmM0MmM1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRzNzgyOC5jCkBAIC00LDcgKzQsNyBAQAogCiAJVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIGxtNzUgYW5kIG90aGVyIGxtX3NlbnNvcnMvaHdtb24gZHJpdmVycwogCi0JV3JpdHRlbiBieSBTdGV2ZSBIYXJkeSA8c3RldmVAbGludXhyZWFsdGltZS5jby51az4KKwlXcml0dGVuIGJ5IFN0ZXZlIEhhcmR5IDxzaGFyZHlAcmVkaGF0LmNvbT4KIAogCURhdGFzaGVldCBhdmFpbGFibGUgYXQ6IGh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvYWRzNzgyOC5wZGYKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAJaTJjX2RlbF9kcml2ZXIoJmFkczc4MjhfZHJpdmVyKTsKIH0KIAotTU9EVUxFX0FVVEhPUigiU3RldmUgSGFyZHkgPHN0ZXZlQGxpbnV4cmVhbHRpbWUuY28udWs+Iik7CitNT0RVTEVfQVVUSE9SKCJTdGV2ZSBIYXJkeSA8c2hhcmR5QHJlZGhhdC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFEUzc4MjggZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKaW5kZXggODdkOTJhNS4uYzZkMWNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yNzQsNyArMjc2LDcgQEAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfUFdNX0NGRygyKSwgcHdtX2NmZ1sxXSk7CiAKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGEgaGEsIGludGVycnVwdGVkIik7CisJCXByX2VycigiaGEgaGEsIGludGVycnVwdGVkXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKaW5kZXggYjY1OThhYS4uY2UwMzcyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKQEAgLTQsNiArNCw3IEBACiAgKiBjb21wdXRlcnMuCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA3IE5pY29sYXMgQm9pY2hhdCA8bmljb2xhc0Bib2ljaGF0LmNoPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEhlbnJpayBSeWRiZXJnIDxyeWRiZXJnQGV1cm9tYWlsLnNlPgogICoKICAqIEJhc2VkIG9uIGhkYXBzLmMgZHJpdmVyOgogICogQ29weXJpZ2h0IChDKSAyMDA1IFJvYmVydCBMb3ZlIDxybWxAbm92ZWxsLmNvbT4KQEAgLTI2LDEwICsyNywxMyBAQAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CkBAIC00OSw2ICs1Myw3IEBACiAKICNkZWZpbmUgQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIIDMyCiAKKy8qIHdhaXQgdXAgdG8gMzIgbXMgZm9yIGEgc3RhdHVzIGNoYW5nZS4gKi8KICNkZWZpbmUgQVBQTEVTTUNfTUlOX1dBSVQJMHgwMDQwCiAjZGVmaW5lIEFQUExFU01DX01BWF9XQUlUCTB4ODAwMAogCkBAIC03MywxMDQgKzc4LDE1IEBACiAKICNkZWZpbmUgRkFOU19DT1VOVAkJIkZOdW0iIC8qIHItbyB1aTggKi8KICNkZWZpbmUgRkFOU19NQU5VQUwJCSJGUyEgIiAvKiByLXcgdWkxNiAqLwotI2RlZmluZSBGQU5fQUNUVUFMX1NQRUVECSJGMEFjIiAvKiByLW8gZnBlMiAoMiBieXRlcykgKi8KLSNkZWZpbmUgRkFOX01JTl9TUEVFRAkJIkYwTW4iIC8qIHItbyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fTUFYX1NQRUVECQkiRjBNeCIgLyogci1vIGZwZTIgKDIgYnl0ZXMpICovCi0jZGVmaW5lIEZBTl9TQUZFX1NQRUVECQkiRjBTZiIgLyogci1vIGZwZTIgKDIgYnl0ZXMpICovCi0jZGVmaW5lIEZBTl9UQVJHRVRfU1BFRUQJIkYwVGciIC8qIHItdyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fUE9TSVRJT04JCSJGMElEIiAvKiByLW8gY2hhclsxNl0gKi8KLQotLyoKLSAqIFRlbXBlcmF0dXJlIHNlbnNvcnMga2V5cyAoc3A3OCAtIDIgYnl0ZXMpLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqdGVtcGVyYXR1cmVfc2Vuc29yc19zZXRzW11bNDFdID0gewotLyogU2V0IDA6IE1hY2Jvb2sgUHJvICovCi0JeyAiVEEwUCIsICJUQjBUIiwgIlRDMEQiLCAiVEMwUCIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJUaDBIIiwKLQkgICJUaDFIIiwgIlRtMFAiLCAiVHMwUCIsICJUczFQIiwgTlVMTCB9LAotLyogU2V0IDE6IE1hY2Jvb2syIHNldCAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRNMFAiLCAiVE4wUCIsICJUTjFQIiwgIlRURjAiLCAiVGgwSCIsCi0JICAiVGgwUyIsICJUaDFIIiwgTlVMTCB9LAotLyogU2V0IDI6IE1hY2Jvb2sgc2V0ICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVE0wUCIsICJUTjBQIiwgIlROMVAiLCAiVGgwSCIsICJUaDBTIiwKLQkgICJUaDFIIiwgIlRzMFAiLCBOVUxMIH0sCi0vKiBTZXQgMzogTWFjbWluaSBzZXQgKi8KLQl7ICJUQzBEIiwgIlRDMFAiLCBOVUxMIH0sCi0vKiBTZXQgNDogTWFjIFBybyAoMiB4IFF1YWQtQ29yZSkgKi8KLQl7ICJUQTBQIiwgIlRDQUciLCAiVENBSCIsICJUQ0JHIiwgIlRDQkgiLCAiVEMwQyIsICJUQzBEIiwgIlRDMFAiLAotCSAgIlRDMUMiLCAiVEMxRCIsICJUQzJDIiwgIlRDMkQiLCAiVEMzQyIsICJUQzNEIiwgIlRIVEciLCAiVEgwUCIsCi0JICAiVEgxUCIsICJUSDJQIiwgIlRIM1AiLCAiVE1BUCIsICJUTUFTIiwgIlRNQlMiLCAiVE0wUCIsICJUTTBTIiwKLQkgICJUTTFQIiwgIlRNMVMiLCAiVE0yUCIsICJUTTJTIiwgIlRNM1MiLCAiVE04UCIsICJUTThTIiwgIlRNOVAiLAotCSAgIlRNOVMiLCAiVE4wSCIsICJUUzBDIiwgTlVMTCB9LAotLyogU2V0IDU6IGlNYWMgKi8KLQl7ICJUQzBEIiwgIlRBMFAiLCAiVEcwUCIsICJURzBEIiwgIlRHMEgiLCAiVEgwUCIsICJUbTBQIiwgIlRPMFAiLAotCSAgIlRwMEMiLCBOVUxMIH0sCi0vKiBTZXQgNjogTWFjYm9vazMgc2V0ICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVE0wUCIsICJUTjBQIiwgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwKLQkgICJUaDBTIiwgIlRoMUgiLCBOVUxMIH0sCi0vKiBTZXQgNzogTWFjYm9vayBBaXIgKi8KLQl7ICJUQjBUIiwgIlRCMVMiLCAiVEIxVCIsICJUQjJTIiwgIlRCMlQiLCAiVEMwRCIsICJUQzBQIiwgIlRDRlAiLAotCSAgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwgIlRwMFAiLCAiVHBGUCIsICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgODogTWFjYm9vayBQcm8gNCwxIChQZW5yeW4pICovCi0JeyAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRURjAiLCAiVFcwUCIsICJUaDBIIiwKLQkgICJUaDFIIiwgIlRoMkgiLCAiVG0wUCIsICJUczBQIiwgTlVMTCB9LAotLyogU2V0IDk6IE1hY2Jvb2sgUHJvIDMsMSAoU2FudGEgUm9zYSkgKi8KLQl7ICJUQUxQIiwgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJUVEYwIiwgIlRXMFAiLAotCSAgIlRoMEgiLCAiVGgxSCIsICJUaDJIIiwgIlRtMFAiLCAiVHMwUCIsIE5VTEwgfSwKLS8qIFNldCAxMDogaU1hYyA1LDEgKi8KLQl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwUCIsICJURzBEIiwgIlRIMFAiLCAiVE8wUCIsICJUbTBQIiwgTlVMTCB9LAotLyogU2V0IDExOiBNYWNib29rIDUsMSAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRCM1QiLCAiVEMwRCIsICJUQzBQIiwgIlROMEQiLCAiVE4wUCIsCi0JICAiVFRGMCIsICJUaDBIIiwgIlRoMUgiLCAiVGhGSCIsICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgMTI6IE1hY2Jvb2sgUHJvIDUsMSAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRCM1QiLCAiVEMwRCIsICJUQzBGIiwgIlRDMFAiLCAiVEcwRCIsCi0JICAiVEcwRiIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJURzFIIiwgIlROMEQiLCAiVE4wUCIsICJUVEYwIiwKLQkgICJUaDJIIiwgIlRtMFAiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDEzOiBpTWFjIDgsMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRHMFAiLCAiVEgwUCIsCi0JICAiVEwwUCIsICJUTzBQIiwgIlRXMFAiLCAiVG0wUCIsICJUcDBQIiwgTlVMTCB9LAotLyogU2V0IDE0OiBpTWFjIDYsMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRHMFAiLCAiVEgwUCIsCi0JICAiVE8wUCIsICJUcDBQIiwgTlVMTCB9LAotLyogU2V0IDE1OiBNYWNCb29rIEFpciAyLDEgKi8KLQl7ICJUQjBUIiwgIlRCMVMiLCAiVEIxVCIsICJUQjJTIiwgIlRCMlQiLCAiVEMwRCIsICJUTjBEIiwgIlRURjAiLAotCSAgIlRWMFAiLCAiVFZGUCIsICJUVzBQIiwgIlRoMFAiLCAiVHAwUCIsICJUcDFQIiwgIlRwRlAiLCAiVHMwUCIsCi0JICAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAxNjogTWFjIFBybyAzLDEgKDIgeCBRdWFkLUNvcmUpICovCi0JeyAiVEEwUCIsICJUQ0FHIiwgIlRDQUgiLCAiVENCRyIsICJUQ0JIIiwgIlRDMEMiLCAiVEMwRCIsICJUQzBQIiwKLQkgICJUQzFDIiwgIlRDMUQiLCAiVEMyQyIsICJUQzJEIiwgIlRDM0MiLCAiVEMzRCIsICJUSDBQIiwgIlRIMVAiLAotCSAgIlRIMlAiLCAiVEgzUCIsICJUTUFQIiwgIlRNQVMiLCAiVE1CUyIsICJUTTBQIiwgIlRNMFMiLCAiVE0xUCIsCi0JICAiVE0xUyIsICJUTTJQIiwgIlRNMlMiLCAiVE0zUyIsICJUTThQIiwgIlRNOFMiLCAiVE05UCIsICJUTTlTIiwKLQkgICJUTjBDIiwgIlROMEQiLCAiVE4wSCIsICJUUzBDIiwgIlRwMEMiLCAiVHAxQyIsICJUdjBTIiwgIlR2MVMiLAotCSAgTlVMTCB9LAotLyogU2V0IDE3OiBpTWFjIDksMSAqLwotCXsgIlRBMFAiLCAiVEMwRCIsICJUQzBIIiwgIlRDMFAiLCAiVEcwRCIsICJURzBIIiwgIlRIMFAiLCAiVEwwUCIsCi0JICAiVE4wRCIsICJUTjBIIiwgIlROMFAiLCAiVE8wUCIsICJUbTBQIiwgIlRwMFAiLCBOVUxMIH0sCi0vKiBTZXQgMTg6IE1hY0Jvb2sgUHJvIDIsMiAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRHMEgiLCAiVEcwUCIsICJURzBUIiwgIlRNMFAiLCAiVFRGMCIsCi0JICAiVGgwSCIsICJUaDFIIiwgIlRtMFAiLCAiVHMwUCIsIE5VTEwgfSwKLS8qIFNldCAxOTogTWFjYm9vayBQcm8gNSwzICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEIzVCIsICJUQzBEIiwgIlRDMEYiLCAiVEMwUCIsICJURzBEIiwKLQkgICJURzBGIiwgIlRHMEgiLCAiVEcwUCIsICJURzBUIiwgIlROMEQiLCAiVE4wUCIsICJUVEYwIiwgIlRoMkgiLAotCSAgIlRtMFAiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDIwOiBNYWNCb29rIFBybyA1LDQgKi8KLQl7ICJUQjBUIiwgIlRCMVQiLCAiVEIyVCIsICJUQjNUIiwgIlRDMEQiLCAiVEMwRiIsICJUQzBQIiwgIlROMEQiLAotCSAgIlROMFAiLCAiVFRGMCIsICJUaDJIIiwgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAyMTogTWFjQm9vayBQcm8gNiwyICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEMwQyIsICJUQzBEIiwgIlRDMFAiLCAiVEMxQyIsICJURzBEIiwKLQkgICJURzBQIiwgIlRHMFQiLCAiVE1DRCIsICJUUDBQIiwgIlRQQ0QiLCAiVGgxSCIsICJUaDJIIiwgIlRtMFAiLAotCSAgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAyMjogTWFjQm9vayBQcm8gNywxICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEMwRCIsICJUQzBQIiwgIlROMEQiLCAiVE4wUCIsICJUTjBTIiwKLQkgICJUTjFEIiwgIlROMUYiLCAiVE4xRyIsICJUTjFTIiwgIlRoMUgiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotfTsKKyNkZWZpbmUgRkFOX0lEX0ZNVAkJIkYlZElEIiAvKiByLW8gY2hhclsxNl0gKi8KIAogLyogTGlzdCBvZiBrZXlzIHVzZWQgdG8gcmVhZC93cml0ZSBmYW4gc3BlZWRzICovCi1zdGF0aWMgY29uc3QgY2hhciogZmFuX3NwZWVkX2tleXNbXSA9IHsKLQlGQU5fQUNUVUFMX1NQRUVELAotCUZBTl9NSU5fU1BFRUQsCi0JRkFOX01BWF9TUEVFRCwKLQlGQU5fU0FGRV9TUEVFRCwKLQlGQU5fVEFSR0VUX1NQRUVECitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZmFuX3NwZWVkX2ZtdFtdID0geworCSJGJWRBYyIsCQkvKiBhY3R1YWwgc3BlZWQgKi8KKwkiRiVkTW4iLAkJLyogbWluaW11bSBzcGVlZCAocncpICovCisJIkYlZE14IiwJCS8qIG1heGltdW0gc3BlZWQgKi8KKwkiRiVkU2YiLAkJLyogc2FmZSBzcGVlZCAtIG5vdCBhbGwgbW9kZWxzICovCisJIkYlZFRnIiwJCS8qIHRhcmdldCBzcGVlZCAobWFudWFsOiBydykgKi8KIH07CiAKICNkZWZpbmUgSU5JVF9USU1FT1VUX01TRUNTCTUwMDAJLyogd2FpdCB1cCB0byA1cyBmb3IgZGV2aWNlIGluaXQgLi4uICovCkBAIC0xODQsMTQgKzEwMCw0OCBAQAogI2RlZmluZSBTRU5TT1JfWSAxCiAjZGVmaW5lIFNFTlNPUl9aIDIKIAotLyogU3RydWN0dXJlIHRvIGJlIHBhc3NlZCB0byBETUlfTUFUQ0ggZnVuY3Rpb24gKi8KLXN0cnVjdCBkbWlfbWF0Y2hfZGF0YSB7Ci0vKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNvbXB1dGVyIGhhcyBhbiBhY2NlbGVyb21ldGVyLiAqLwotCWludCBhY2NlbGVyb21ldGVyOwotLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjb21wdXRlciBoYXMgbGlnaHQgc2Vuc29ycyBhbmQga2V5Ym9hcmQgYmFja2xpZ2h0LiAqLwotCWludCBsaWdodDsKLS8qIEluZGljYXRlcyB3aGljaCB0ZW1wZXJhdHVyZSBzZW5zb3JzIHNldCB0byB1c2UuICovCi0JaW50IHRlbXBlcmF0dXJlX3NldDsKKyNkZWZpbmUgdG9faW5kZXgoYXR0cikgKHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggJiAweGZmZmYpCisjZGVmaW5lIHRvX29wdGlvbihhdHRyKSAodG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA+PiAxNikKKworLyogRHluYW1pYyBkZXZpY2Ugbm9kZSBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgeworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGE7CS8qIGh3bW9uIGF0dHJpYnV0ZXMgKi8KKwljaGFyIG5hbWVbMzJdOwkJCQkvKiByb29tIGZvciBub2RlIGZpbGUgbmFtZSAqLworfTsKKworLyogRHluYW1pYyBkZXZpY2Ugbm9kZSBncm91cCAqLworc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgeworCWNoYXIgKmZvcm1hdDsJCQkJLyogZm9ybWF0IHN0cmluZyAqLworCXZvaWQgKnNob3c7CQkJCS8qIHNob3cgZnVuY3Rpb24gKi8KKwl2b2lkICpzdG9yZTsJCQkJLyogc3RvcmUgZnVuY3Rpb24gKi8KKwlpbnQgb3B0aW9uOwkJCQkvKiBmdW5jdGlvbiBhcmd1bWVudCAqLworCXN0cnVjdCBhcHBsZXNtY19kZXZfYXR0ciAqbm9kZXM7CS8qIGR5bmFtaWMgbm9kZSBhcnJheSAqLworfTsKKworLyogQXBwbGVTTUMgZW50cnkgLSBjYWNoZWQgcmVnaXN0ZXIgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBhcHBsZXNtY19lbnRyeSB7CisJY2hhciBrZXlbNV07CQkvKiBmb3VyLWxldHRlciBrZXkgY29kZSAqLworCXU4IHZhbGlkOwkJLyogc2V0IHdoZW4gZW50cnkgaXMgc3VjY2Vzc2Z1bGx5IHJlYWQgb25jZSAqLworCXU4IGxlbjsJCQkvKiBib3VuZGVkIGJ5IEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCAqLworCWNoYXIgdHlwZVs1XTsJCS8qIGZvdXItbGV0dGVyIHR5cGUgY29kZSAqLworCXU4IGZsYWdzOwkJLyogMHgxMDogZnVuYzsgMHg0MDogd3JpdGU7IDB4ODA6IHJlYWQgKi8KK307CisKKy8qIFJlZ2lzdGVyIGxvb2t1cCBhbmQgcmVnaXN0ZXJzIGNvbW1vbiB0byBhbGwgU01DcyAqLworc3RhdGljIHN0cnVjdCBhcHBsZXNtY19yZWdpc3RlcnMgeworCXN0cnVjdCBtdXRleCBtdXRleDsJCS8qIHJlZ2lzdGVyIHJlYWQvd3JpdGUgbXV0ZXggKi8KKwl1bnNpZ25lZCBpbnQga2V5X2NvdW50OwkJLyogbnVtYmVyIG9mIFNNQyByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgZmFuX2NvdW50OwkJLyogbnVtYmVyIG9mIGZhbnMgKi8KKwl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudDsJLyogbnVtYmVyIG9mIHRlbXBlcmF0dXJlIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGludCB0ZW1wX2JlZ2luOwkvKiB0ZW1wZXJhdHVyZSBsb3dlciBpbmRleCBib3VuZCAqLworCXVuc2lnbmVkIGludCB0ZW1wX2VuZDsJCS8qIHRlbXBlcmF0dXJlIHVwcGVyIGluZGV4IGJvdW5kICovCisJaW50IG51bV9saWdodF9zZW5zb3JzOwkJLyogbnVtYmVyIG9mIGxpZ2h0IHNlbnNvcnMgKi8KKwlib29sIGhhc19hY2NlbGVyb21ldGVyOwkJLyogaGFzIG1vdGlvbiBzZW5zb3IgKi8KKwlib29sIGhhc19rZXlfYmFja2xpZ2h0OwkJLyogaGFzIGtleWJvYXJkIGJhY2tsaWdodCAqLworCWJvb2wgaW5pdF9jb21wbGV0ZTsJCS8qIHRydWUgd2hlbiBmdWxseSBpbml0aWFsaXplZCAqLworCXN0cnVjdCBhcHBsZXNtY19lbnRyeSAqY2FjaGU7CS8qIGNhY2hlZCBrZXkgZW50cmllcyAqLworfSBzbWNyZWcgPSB7CisJLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihzbWNyZWcubXV0ZXgpLAogfTsKIAogc3RhdGljIGNvbnN0IGludCBkZWJ1ZzsKQEAgLTIwMywyMCArMTUzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiBzdGF0aWMgc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmFwcGxlc21jX2lkZXY7CiAKLS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcHV0ZXIgaGFzIGFuIGFjY2VsZXJvbWV0ZXIuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGFwcGxlc21jX2FjY2VsZXJvbWV0ZXI7Ci0KLS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcHV0ZXIgaGFzIGxpZ2h0IHNlbnNvcnMgYW5kIGtleWJvYXJkIGJhY2tsaWdodC4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXBwbGVzbWNfbGlnaHQ7Ci0KLS8qIFRoZSBudW1iZXIgb2YgZmFucyBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmFuc19oYW5kbGVkOwotCi0vKiBJbmRpY2F0ZXMgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29ycyBzZXQgdG8gdXNlLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhcHBsZXNtY190ZW1wZXJhdHVyZV9zZXQ7Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgoYXBwbGVzbWNfbG9jayk7Ci0KIC8qCiAgKiBMYXN0IGluZGV4IHdyaXR0ZW4gdG8ga2V5X2F0X2luZGV4IHN5c2ZzIGZpbGUsIGFuZCB2YWx1ZSB0byB1c2UgZm9yIGFsbCBvdGhlcgogICoga2V5X2F0X2luZGV4Xyogc3lzZnMgZmlsZXMuCkBAIC0yMzgsMTggKzE3NCwxMCBAQAogCiAJZm9yICh1cyA9IEFQUExFU01DX01JTl9XQUlUOyB1cyA8IEFQUExFU01DX01BWF9XQUlUOyB1cyA8PD0gMSkgewogCQl1ZGVsYXkodXMpOwotCQlpZiAoKGluYihBUFBMRVNNQ19DTURfUE9SVCkgJiBBUFBMRVNNQ19TVEFUVVNfTUFTSykgPT0gdmFsKSB7Ci0JCQlpZiAoZGVidWcpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkJIldhaXRlZCAlZCB1cyBmb3Igc3RhdHVzICV4XG4iLAotCQkJCQkyICogdXMgLSBBUFBMRVNNQ19NSU5fV0FJVCwgdmFsKTsKKwkJaWYgKChpbmIoQVBQTEVTTUNfQ01EX1BPUlQpICYgQVBQTEVTTUNfU1RBVFVTX01BU0spID09IHZhbCkKIAkJCXJldHVybiAwOwotCQl9CiAJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IHdhaXQgc3RhdHVzIGZhaWxlZDogJXggIT0gJXhcbiIsCi0JCQkJCQl2YWwsIGluYihBUFBMRVNNQ19DTURfUE9SVCkpOwotCiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTI2NywxNTkgKzE5NSwyNDIgQEAKIAkJaWYgKChpbmIoQVBQTEVTTUNfQ01EX1BPUlQpICYgQVBQTEVTTUNfU1RBVFVTX01BU0spID09IDB4MGMpCiAJCQlyZXR1cm4gMDsKIAl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IGNvbW1hbmQgZmFpbGVkOiAleCAtPiAleFxuIiwKLQkJY21kLCBpbmIoQVBQTEVTTUNfQ01EX1BPUlQpKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAotLyoKLSAqIGFwcGxlc21jX3JlYWRfa2V5IC0gcmVhZHMgbGVuIGJ5dGVzIGZyb20gYSBnaXZlbiBrZXksIGFuZCBwdXQgdGhlbSBpbiBidWZmZXIuCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMgbXVzdAotICogaG9sZCBhcHBsZXNtY19sb2NrLgotICovCi1zdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfa2V5KGNvbnN0IGNoYXIqIGtleSwgdTgqIGJ1ZmZlciwgdTggbGVuKQorc3RhdGljIGludCBzZW5kX2FyZ3VtZW50KGNvbnN0IGNoYXIgKmtleSkKIHsKIAlpbnQgaTsKIAotCWlmIChsZW4gPiBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJhcHBsZXNtY19yZWFkX2tleTogY2Fubm90IHJlYWQgbW9yZSB0aGFuICIKLQkJCQkJIiVkIGJ5dGVzXG4iLCBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc2VuZF9jb21tYW5kKEFQUExFU01DX1JFQURfQ01EKSkKLQkJcmV0dXJuIC1FSU87Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCW91dGIoa2V5W2ldLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwogCQlpZiAoX193YWl0X3N0YXR1cygweDA0KSkKIAkJCXJldHVybiAtRUlPOwogCX0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICI8JXMiLCBrZXkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfc21jKHU4IGNtZCwgY29uc3QgY2hhciAqa2V5LCB1OCAqYnVmZmVyLCB1OCBsZW4pCit7CisJaW50IGk7CisKKwlpZiAoc2VuZF9jb21tYW5kKGNtZCkgfHwgc2VuZF9hcmd1bWVudChrZXkpKSB7CisJCXByX3dhcm4oIiVzOiByZWFkIGFyZyBmYWlsXG4iLCBrZXkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKIAlvdXRiKGxlbiwgQVBQTEVTTUNfREFUQV9QT1JUKTsKLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICI+JXgiLCBsZW4pOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDUpKQorCQlpZiAoX193YWl0X3N0YXR1cygweDA1KSkgeworCQkJcHJfd2FybigiJXM6IHJlYWQgZGF0YSBmYWlsXG4iLCBrZXkpOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJYnVmZmVyW2ldID0gaW5iKEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChkZWJ1ZykKLQkJCXByaW50ayhLRVJOX0RFQlVHICI8JXgiLCBidWZmZXJbaV0pOwogCX0KLQlpZiAoZGVidWcpCi0JCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBhcHBsZXNtY193cml0ZV9rZXkgLSB3cml0ZXMgbGVuIGJ5dGVzIGZyb20gYnVmZmVyIHRvIGEgZ2l2ZW4ga2V5LgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLiBDYWxsZXJzIG11c3QKLSAqIGhvbGQgYXBwbGVzbWNfbG9jay4KLSAqLwotc3RhdGljIGludCBhcHBsZXNtY193cml0ZV9rZXkoY29uc3QgY2hhcioga2V5LCB1OCogYnVmZmVyLCB1OCBsZW4pCitzdGF0aWMgaW50IHdyaXRlX3NtYyh1OCBjbWQsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgdTggKmJ1ZmZlciwgdTggbGVuKQogewogCWludCBpOwogCi0JaWYgKGxlbiA+IEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCkgewotCQlwcmludGsoS0VSTl9FUlIJImFwcGxlc21jX3dyaXRlX2tleTogY2Fubm90IHdyaXRlIG1vcmUgdGhhbiAiCi0JCQkJCSIlZCBieXRlc1xuIiwgQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNlbmRfY29tbWFuZChBUFBMRVNNQ19XUklURV9DTUQpKQorCWlmIChzZW5kX2NvbW1hbmQoY21kKSB8fCBzZW5kX2FyZ3VtZW50KGtleSkpIHsKKwkJcHJfd2FybigiJXM6IHdyaXRlIGFyZyBmYWlsXG4iLCBrZXkpOwogCQlyZXR1cm4gLUVJTzsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJb3V0YihrZXlbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQotCQkJcmV0dXJuIC1FSU87CiAJfQogCiAJb3V0YihsZW4sIEFQUExFU01DX0RBVEFfUE9SVCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNCkpCisJCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKSB7CisJCQlwcl93YXJuKCIlczogd3JpdGUgZGF0YSBmYWlsXG4iLCBrZXkpOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJb3V0YihidWZmZXJbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBhcHBsZXNtY19nZXRfa2V5X2F0X2luZGV4IC0gZ2V0IGtleSBhdCBpbmRleCwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGtleQotICogKGNoYXJbNl0pLiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMKLSAqIG11c3QgaG9sZCBhcHBsZXNtY19sb2NrLgotICovCi1zdGF0aWMgaW50IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoaW50IGluZGV4LCBjaGFyKiBrZXkpCitzdGF0aWMgaW50IHJlYWRfcmVnaXN0ZXJfY291bnQodW5zaWduZWQgaW50ICpjb3VudCkKIHsKLQlpbnQgaTsKLQl1OCByZWFka2V5WzRdOwotCXJlYWRrZXlbMF0gPSBpbmRleCA+PiAyNDsKLQlyZWFka2V5WzFdID0gaW5kZXggPj4gMTY7Ci0JcmVhZGtleVsyXSA9IGluZGV4ID4+IDg7Ci0JcmVhZGtleVszXSA9IGluZGV4OworCV9fYmUzMiBiZTsKKwlpbnQgcmV0OwogCi0JaWYgKHNlbmRfY29tbWFuZChBUFBMRVNNQ19HRVRfS0VZX0JZX0lOREVYX0NNRCkpCi0JCXJldHVybiAtRUlPOworCXJldCA9IHJlYWRfc21jKEFQUExFU01DX1JFQURfQ01ELCBLRVlfQ09VTlRfS0VZLCAodTggKikmYmUsIDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW91dGIocmVhZGtleVtpXSwgQVBQTEVTTUNfREFUQV9QT1JUKTsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNCkpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlvdXRiKDQsIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDUpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWtleVtpXSA9IGluYihBUFBMRVNNQ19EQVRBX1BPUlQpOwotCX0KLQlrZXlbNF0gPSAwOwotCisJKmNvdW50ID0gYmUzMl90b19jcHUoYmUpOwogCXJldHVybiAwOwogfQogCiAvKgotICogYXBwbGVzbWNfZ2V0X2tleV90eXBlIC0gZ2V0IGtleSB0eXBlLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdHlwZSAoY2hhcls2XSkuCi0gKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuIENhbGxlcnMgbXVzdAotICogaG9sZCBhcHBsZXNtY19sb2NrLgorICogU2VyaWFsaXplZCBJL08KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuCisgKiBBbGwgZnVuY3Rpb25zIGJlbG93IGFyZSBjb25jdXJyZW5jeSBzYWZlIC0gY2FsbGVycyBzaG91bGQgTk9UIGhvbGQgbG9jay4KICAqLwotc3RhdGljIGludCBhcHBsZXNtY19nZXRfa2V5X3R5cGUoY2hhcioga2V5LCBjaGFyKiB0eXBlKQorCitzdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfZW50cnkoY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeSwKKwkJCSAgICAgICB1OCAqYnVmLCB1OCBsZW4pCiB7Ci0JaW50IGk7CisJaW50IHJldDsKIAotCWlmIChzZW5kX2NvbW1hbmQoQVBQTEVTTUNfR0VUX0tFWV9UWVBFX0NNRCkpCi0JCXJldHVybiAtRUlPOworCWlmIChlbnRyeS0+bGVuICE9IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc21jcmVnLm11dGV4KTsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19SRUFEX0NNRCwgZW50cnktPmtleSwgYnVmLCBsZW4pOworCW11dGV4X3VubG9jaygmc21jcmVnLm11dGV4KTsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJb3V0YihrZXlbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQotCQkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcHBsZXNtY193cml0ZV9lbnRyeShjb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5LAorCQkJCWNvbnN0IHU4ICpidWYsIHU4IGxlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKGVudHJ5LT5sZW4gIT0gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZzbWNyZWcubXV0ZXgpOworCXJldCA9IHdyaXRlX3NtYyhBUFBMRVNNQ19XUklURV9DTUQsIGVudHJ5LT5rZXksIGJ1ZiwgbGVuKTsKKwltdXRleF91bmxvY2soJnNtY3JlZy5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmNhY2hlID0gJnNtY3JlZy5jYWNoZVtpbmRleF07CisJdTgga2V5WzRdLCBpbmZvWzZdOworCV9fYmUzMiBiZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjYWNoZS0+dmFsaWQpCisJCXJldHVybiBjYWNoZTsKKworCW11dGV4X2xvY2soJnNtY3JlZy5tdXRleCk7CisKKwlpZiAoY2FjaGUtPnZhbGlkKQorCQlnb3RvIG91dDsKKwliZSA9IGNwdV90b19iZTMyKGluZGV4KTsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19HRVRfS0VZX0JZX0lOREVYX0NNRCwgKHU4ICopJmJlLCBrZXksIDQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IHJlYWRfc21jKEFQUExFU01DX0dFVF9LRVlfVFlQRV9DTUQsIGtleSwgaW5mbywgNik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwltZW1jcHkoY2FjaGUtPmtleSwga2V5LCA0KTsKKwljYWNoZS0+bGVuID0gaW5mb1swXTsKKwltZW1jcHkoY2FjaGUtPnR5cGUsICZpbmZvWzFdLCA0KTsKKwljYWNoZS0+ZmxhZ3MgPSBpbmZvWzVdOworCWNhY2hlLT52YWxpZCA9IDE7CisKK291dDoKKwltdXRleF91bmxvY2soJnNtY3JlZy5tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfZ2V0X2xvd2VyX2JvdW5kKHVuc2lnbmVkIGludCAqbG8sIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgYmVnaW4gPSAwLCBlbmQgPSBzbWNyZWcua2V5X2NvdW50OworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwl3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisJCWludCBtaWRkbGUgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgLyAyOworCQllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChtaWRkbGUpOworCQlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwkJaWYgKHN0cmNtcChlbnRyeS0+a2V5LCBrZXkpIDwgMCkKKwkJCWJlZ2luID0gbWlkZGxlICsgMTsKKwkJZWxzZQorCQkJZW5kID0gbWlkZGxlOwogCX0KIAotCW91dGIoNiwgQVBQTEVTTUNfREFUQV9QT1JUKTsKKwkqbG8gPSBiZWdpbjsKKwlyZXR1cm4gMDsKK30KIAotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJdHlwZVtpXSA9IGluYihBUFBMRVNNQ19EQVRBX1BPUlQpOworc3RhdGljIGludCBhcHBsZXNtY19nZXRfdXBwZXJfYm91bmQodW5zaWduZWQgaW50ICpoaSwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBiZWdpbiA9IDAsIGVuZCA9IHNtY3JlZy5rZXlfY291bnQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKKworCXdoaWxlIChiZWdpbiAhPSBlbmQpIHsKKwkJaW50IG1pZGRsZSA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAvIDI7CisJCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KG1pZGRsZSk7CisJCWlmIChJU19FUlIoZW50cnkpKQorCQkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCQlpZiAoc3RyY21wKGtleSwgZW50cnktPmtleSkgPCAwKQorCQkJZW5kID0gbWlkZGxlOworCQllbHNlCisJCQliZWdpbiA9IG1pZGRsZSArIDE7CiAJfQotCXR5cGVbNV0gPSAwOwogCisJKmhpID0gYmVnaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoY29uc3QgY2hhciAqa2V5KQoreworCWludCBiZWdpbiwgZW5kOworCWludCByZXQ7CisKKwlyZXQgPSBhcHBsZXNtY19nZXRfbG93ZXJfYm91bmQoJmJlZ2luLCBrZXkpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJcmV0ID0gYXBwbGVzbWNfZ2V0X3VwcGVyX2JvdW5kKCZlbmQsIGtleSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlpZiAoZW5kIC0gYmVnaW4gIT0gMSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXR1cm4gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGJlZ2luKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19yZWFkX2tleShjb25zdCBjaGFyICprZXksIHU4ICpidWZmZXIsIHU4IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KGtleSk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKworCXJldHVybiBhcHBsZXNtY19yZWFkX2VudHJ5KGVudHJ5LCBidWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfd3JpdGVfa2V5KGNvbnN0IGNoYXIgKmtleSwgY29uc3QgdTggKmJ1ZmZlciwgdTggbGVuKQoreworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoa2V5KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCisJcmV0dXJuIGFwcGxlc21jX3dyaXRlX2VudHJ5KGVudHJ5LCBidWZmZXIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfaGFzX2tleShjb25zdCBjaGFyICprZXksIGJvb2wgKnZhbHVlKQoreworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9rZXkoa2V5KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSAmJiBQVFJfRVJSKGVudHJ5KSAhPSAtRUlOVkFMKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisKKwkqdmFsdWUgPSAhSVNfRVJSKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvciAtIFJlYWQgbW90aW9uIHNlbnNvciAoWCwgWSBvciBaKS4gQ2FsbGVycyBtdXN0Ci0gKiBob2xkIGFwcGxlc21jX2xvY2suCisgKiBhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IgLSBSZWFkIG1vdGlvbiBzZW5zb3IgKFgsIFkgb3IgWikuCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yKGludCBpbmRleCwgczE2KiB2YWx1ZSkKK3N0YXRpYyBpbnQgYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yKGludCBpbmRleCwgczE2ICp2YWx1ZSkKIHsKIAl1OCBidWZmZXJbMl07CiAJaW50IHJldDsKQEAgLTQ0NCw2OSArNDU1LDEyMCBAQAogfQogCiAvKgotICogYXBwbGVzbWNfZGV2aWNlX2luaXQgLSBpbml0aWFsaXplIHRoZSBhY2NlbGVyb21ldGVyLiAgUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MKLSAqIGFuZCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuICBDYW4gc2xlZXAuCisgKiBhcHBsZXNtY19kZXZpY2VfaW5pdCAtIGluaXRpYWxpemUgdGhlIGFjY2VsZXJvbWV0ZXIuICBDYW4gc2xlZXAuCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfZGV2aWNlX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIGFwcGxlc21jX2RldmljZV9pbml0KHZvaWQpCiB7Ci0JaW50IHRvdGFsLCByZXQgPSAtRU5YSU87CisJaW50IHRvdGFsOwogCXU4IGJ1ZmZlclsyXTsKIAotCWlmICghYXBwbGVzbWNfYWNjZWxlcm9tZXRlcikKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlpZiAoIXNtY3JlZy5oYXNfYWNjZWxlcm9tZXRlcikKKwkJcmV0dXJuOwogCiAJZm9yICh0b3RhbCA9IElOSVRfVElNRU9VVF9NU0VDUzsgdG90YWwgPiAwOyB0b3RhbCAtPSBJTklUX1dBSVRfTVNFQ1MpIHsKLQkJaWYgKGRlYnVnKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwcGxlc21jIHRyeSAlZFxuIiwgdG90YWwpOwogCQlpZiAoIWFwcGxlc21jX3JlYWRfa2V5KE1PVElPTl9TRU5TT1JfS0VZLCBidWZmZXIsIDIpICYmCi0JCQkJKGJ1ZmZlclswXSAhPSAweDAwIHx8IGJ1ZmZlclsxXSAhPSAweDAwKSkgewotCQkJaWYgKHRvdGFsID09IElOSVRfVElNRU9VVF9NU0VDUykgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJhcHBsZXNtYzogZGV2aWNlIGhhcyIKLQkJCQkJCSIgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIgotCQkJCQkJIiAoMHglMDJ4LCAweCUwMngpLlxuIiwKLQkJCQkJCWJ1ZmZlclswXSwgYnVmZmVyWzFdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgImFwcGxlc21jOiBkZXZpY2UiCi0JCQkJCQkiIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCIKLQkJCQkJCSIgKDB4JTAyeCwgMHglMDJ4KS5cbiIsCi0JCQkJCQlidWZmZXJbMF0sIGJ1ZmZlclsxXSk7Ci0JCQl9Ci0JCQlyZXQgPSAwOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJCQkoYnVmZmVyWzBdICE9IDB4MDAgfHwgYnVmZmVyWzFdICE9IDB4MDApKQorCQkJcmV0dXJuOwogCQlidWZmZXJbMF0gPSAweGUwOwogCQlidWZmZXJbMV0gPSAweDAwOwogCQlhcHBsZXNtY193cml0ZV9rZXkoTU9USU9OX1NFTlNPUl9LRVksIGJ1ZmZlciwgMik7CiAJCW1zbGVlcChJTklUX1dBSVRfTVNFQ1MpOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBmYWlsZWQgdG8gaW5pdCB0aGUgZGV2aWNlXG4iKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0JcmV0dXJuIHJldDsKKwlwcl93YXJuKCJmYWlsZWQgdG8gaW5pdCB0aGUgZGV2aWNlXG4iKTsKIH0KIAogLyoKLSAqIGFwcGxlc21jX2dldF9mYW5fY291bnQgLSBnZXQgdGhlIG51bWJlciBvZiBmYW5zLiBDYWxsZXJzIG11c3QgTk9UIGhvbGQKLSAqIGFwcGxlc21jX2xvY2suCisgKiBhcHBsZXNtY19pbml0X3NtY3JlZ190cnkgLSBUcnkgdG8gaW5pdGlhbGl6ZSByZWdpc3RlciBjYWNoZS4gSWRlbXBvdGVudC4KICAqLwotc3RhdGljIGludCBhcHBsZXNtY19nZXRfZmFuX2NvdW50KHZvaWQpCitzdGF0aWMgaW50IGFwcGxlc21jX2luaXRfc21jcmVnX3RyeSh2b2lkKQogeworCXN0cnVjdCBhcHBsZXNtY19yZWdpc3RlcnMgKnMgPSAmc21jcmVnOworCWJvb2wgbGVmdF9saWdodF9zZW5zb3IsIHJpZ2h0X2xpZ2h0X3NlbnNvcjsKKwl1OCB0bXBbMV07CiAJaW50IHJldDsKLQl1OCBidWZmZXJbMV07CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlpZiAocy0+aW5pdF9jb21wbGV0ZSkKKwkJcmV0dXJuIDA7CiAKLQlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShGQU5TX0NPVU5ULCBidWZmZXIsIDEpOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlyZXQgPSByZWFkX3JlZ2lzdGVyX2NvdW50KCZzLT5rZXlfY291bnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gYnVmZmVyWzBdOworCisJaWYgKCFzLT5jYWNoZSkKKwkJcy0+Y2FjaGUgPSBrY2FsbG9jKHMtPmtleV9jb3VudCwgc2l6ZW9mKCpzLT5jYWNoZSksIEdGUF9LRVJORUwpOworCWlmICghcy0+Y2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoRkFOU19DT1VOVCwgdG1wLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXMtPmZhbl9jb3VudCA9IHRtcFswXTsKKworCXJldCA9IGFwcGxlc21jX2dldF9sb3dlcl9ib3VuZCgmcy0+dGVtcF9iZWdpbiwgIlQiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFwcGxlc21jX2dldF9sb3dlcl9ib3VuZCgmcy0+dGVtcF9lbmQsICJVIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzLT50ZW1wX2NvdW50ID0gcy0+dGVtcF9lbmQgLSBzLT50ZW1wX2JlZ2luOworCisJcmV0ID0gYXBwbGVzbWNfaGFzX2tleShMSUdIVF9TRU5TT1JfTEVGVF9LRVksICZsZWZ0X2xpZ2h0X3NlbnNvcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBhcHBsZXNtY19oYXNfa2V5KExJR0hUX1NFTlNPUl9SSUdIVF9LRVksICZyaWdodF9saWdodF9zZW5zb3IpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gYXBwbGVzbWNfaGFzX2tleShNT1RJT05fU0VOU09SX0tFWSwgJnMtPmhhc19hY2NlbGVyb21ldGVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFwcGxlc21jX2hhc19rZXkoQkFDS0xJR0hUX0tFWSwgJnMtPmhhc19rZXlfYmFja2xpZ2h0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcy0+bnVtX2xpZ2h0X3NlbnNvcnMgPSBsZWZ0X2xpZ2h0X3NlbnNvciArIHJpZ2h0X2xpZ2h0X3NlbnNvcjsKKwlzLT5pbml0X2NvbXBsZXRlID0gdHJ1ZTsKKworCXByX2luZm8oImtleT0lZCBmYW49JWQgdGVtcD0lZCBhY2M9JWQgbHV4PSVkIGtiZD0lZFxuIiwKKwkgICAgICAgcy0+a2V5X2NvdW50LCBzLT5mYW5fY291bnQsIHMtPnRlbXBfY291bnQsCisJICAgICAgIHMtPmhhc19hY2NlbGVyb21ldGVyLAorCSAgICAgICBzLT5udW1fbGlnaHRfc2Vuc29ycywKKwkgICAgICAgcy0+aGFzX2tleV9iYWNrbGlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhcHBsZXNtY19pbml0X3NtY3JlZyAtIEluaXRpYWxpemUgcmVnaXN0ZXIgY2FjaGUuCisgKgorICogUmV0cmllcyB1bnRpbCBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsLCBvciB0aGUgb3BlcmF0aW9uIHRpbWVzIG91dC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYXBwbGVzbWNfaW5pdF9zbWNyZWcodm9pZCkKK3sKKwlpbnQgbXMsIHJldDsKKworCWZvciAobXMgPSAwOyBtcyA8IElOSVRfVElNRU9VVF9NU0VDUzsgbXMgKz0gSU5JVF9XQUlUX01TRUNTKSB7CisJCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnX3RyeSgpOworCQlpZiAoIXJldCkgeworCQkJaWYgKG1zKQorCQkJCXByX2luZm8oImluaXRfc21jcmVnKCkgdG9vayAlZCBtc1xuIiwgbXMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXNsZWVwKElOSVRfV0FJVF9NU0VDUyk7CisJfQorCisJa2ZyZWUoc21jcmVnLmNhY2hlKTsKKwlzbWNyZWcuY2FjaGUgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXBwbGVzbWNfZGVzdHJveV9zbWNyZWcodm9pZCkKK3sKKwlrZnJlZShzbWNyZWcuY2FjaGUpOworCXNtY3JlZy5jYWNoZSA9IE5VTEw7CisJc21jcmVnLmluaXRfY29tcGxldGUgPSBmYWxzZTsKIH0KIAogLyogRGV2aWNlIG1vZGVsIHN0dWZmICovCkBAIC01MTQsMzAgKzU3NiwyNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBhcHBsZXNtY19kZXZpY2VfaW5pdCgpOworCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnKCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiBkZXZpY2Ugc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIik7CisJYXBwbGVzbWNfZGV2aWNlX2luaXQoKTsKKwogCXJldHVybiAwOwogfQogCiAvKiBTeW5jaHJvbml6ZSBkZXZpY2Ugd2l0aCBtZW1vcml6ZWQgYmFja2xpZ2h0IHN0YXRlICovCiBzdGF0aWMgaW50IGFwcGxlc21jX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQorCWlmIChzbWNyZWcuaGFzX2tleV9iYWNrbGlnaHQpCiAJCWFwcGxlc21jX3dyaXRlX2tleShCQUNLTElHSFRfS0VZLCBiYWNrbGlnaHRfc3RhdGUsIDIpOwotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIFJlaW5pdGlhbGl6ZSBkZXZpY2Ugb24gcmVzdW1lIGZyb20gaGliZXJuYXRpb24gKi8KIHN0YXRpYyBpbnQgYXBwbGVzbWNfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJldCA9IGFwcGxlc21jX2RldmljZV9pbml0KCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlhcHBsZXNtY19kZXZpY2VfaW5pdCgpOwogCXJldHVybiBhcHBsZXNtY19wbV9yZXN1bWUoZGV2KTsKIH0KIApAQCAtNTcxLDIwICs2MzAsMTUgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gZGV2LT5pbnB1dDsKIAlzMTYgeCwgeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwotCiAJaWYgKGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihTRU5TT1JfWCwgJngpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCWlmIChhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IoU0VOU09SX1ksICZ5KSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCXggPSAteDsKIAlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19YLCB4IC0gcmVzdF94KTsKIAlpbnB1dF9yZXBvcnRfYWJzKGlkZXYsIEFCU19ZLCB5IC0gcmVzdF95KTsKIAlpbnB1dF9zeW5jKGlkZXYpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIH0KIAogLyogU3lzZnMgRmlsZXMgKi8KQEAgLTYwMSw4ICs2NTUsNiBAQAogCWludCByZXQ7CiAJczE2IHgsIHksIHo7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQogCXJldCA9IGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihTRU5TT1JfWCwgJngpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtNjE0LDcgKzY2Niw2IEBACiAJCWdvdG8gb3V0OwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTYyNCwyMCArNjc1LDIwIEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19saWdodF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAlzdGF0aWMgaW50IGRhdGFfbGVuZ3RoOwogCWludCByZXQ7CiAJdTggbGVmdCA9IDAsIHJpZ2h0ID0gMDsKLQl1OCBidWZmZXJbMTBdLCBxdWVyeVs2XTsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCXU4IGJ1ZmZlclsxMF07CiAKIAlpZiAoIWRhdGFfbGVuZ3RoKSB7Ci0JCXJldCA9IGFwcGxlc21jX2dldF9rZXlfdHlwZShMSUdIVF9TRU5TT1JfTEVGVF9LRVksIHF1ZXJ5KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCQlkYXRhX2xlbmd0aCA9IGNsYW1wX3ZhbChxdWVyeVswXSwgMCwgMTApOwotCQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogbGlnaHQgc2Vuc29yIGRhdGEgbGVuZ3RoIHNldCB0byAiCi0JCQkiJWRcbiIsIGRhdGFfbGVuZ3RoKTsKKwkJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KExJR0hUX1NFTlNPUl9MRUZUX0tFWSk7CisJCWlmIChJU19FUlIoZW50cnkpKQorCQkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCQlpZiAoZW50cnktPmxlbiA+IDEwKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJZGF0YV9sZW5ndGggPSBlbnRyeS0+bGVuOworCQlwcl9pbmZvKCJsaWdodCBzZW5zb3IgZGF0YSBsZW5ndGggc2V0IHRvICVkXG4iLCBkYXRhX2xlbmd0aCk7CiAJfQogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoTElHSFRfU0VOU09SX0xFRlRfS0VZLCBidWZmZXIsIGRhdGFfbGVuZ3RoKTsKQEAgLTY1Myw3ICs3MDQsNiBAQAogCXJpZ2h0ID0gYnVmZmVyWzJdOwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTY2NCwzNiArNzE0LDQ0IEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCWNvbnN0IGNoYXIgKmtleSA9Ci0JCXRlbXBlcmF0dXJlX3NlbnNvcnNfc2V0c1thcHBsZXNtY190ZW1wZXJhdHVyZV9zZXRdW2F0dHItPmluZGV4XTsKKwlpbnQgaW5kZXggPSBzbWNyZWcudGVtcF9iZWdpbiArIHRvX2luZGV4KGRldmF0dHIpOworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAKLQlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBrZXkpOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGluZGV4KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCisJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZW50cnktPmtleSk7CiB9CiAKIC8qIERpc3BsYXlzIGRlZ3JlZSBDZWxzaXVzICogMTAwMCAqLwogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CisJaW50IGluZGV4ID0gc21jcmVnLnRlbXBfYmVnaW4gKyB0b19pbmRleChkZXZhdHRyKTsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCWludCByZXQ7CiAJdTggYnVmZmVyWzJdOwogCXVuc2lnbmVkIGludCB0ZW1wOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQljb25zdCBjaGFyKiBrZXkgPQotCQl0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVthdHRyLT5pbmRleF07CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChpbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwlpZiAoZW50cnktPmxlbiA+IDIpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoa2V5LCBidWZmZXIsIDIpOwotCXRlbXAgPSBidWZmZXJbMF0qMTAwMDsKLQl0ZW1wICs9IChidWZmZXJbMV0gPj4gNikgKiAyNTA7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCisJcmV0ID0gYXBwbGVzbWNfcmVhZF9lbnRyeShlbnRyeSwgYnVmZmVyLCBlbnRyeS0+bGVuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdGVtcCk7CisKKwlpZiAoZW50cnktPmxlbiA9PSAyKSB7CisJCXRlbXAgPSBidWZmZXJbMF0gKiAxMDAwOworCQl0ZW1wICs9IChidWZmZXJbMV0gPj4gNikgKiAyNTA7CisJfSBlbHNlIHsKKwkJdGVtcCA9IGJ1ZmZlclswXSAqIDQwMDA7CisJfQorCisJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdGVtcCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTcwMywyMSArNzYxLDEyIEBACiAJdW5zaWduZWQgaW50IHNwZWVkID0gMDsKIAljaGFyIG5ld2tleVs1XTsKIAl1OCBidWZmZXJbMl07Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KLQkJCQkJCXRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOwogCi0JbmV3a2V5WzBdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVswXTsKLQluZXdrZXlbMV0gPSAnMCcgKyBzZW5zb3JfYXR0ci0+aW5kZXg7Ci0JbmV3a2V5WzJdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVsyXTsKLQluZXdrZXlbM10gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzNdOwotCW5ld2tleVs0XSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlzcHJpbnRmKG5ld2tleSwgZmFuX3NwZWVkX2ZtdFt0b19vcHRpb24oYXR0cildLCB0b19pbmRleChhdHRyKSk7CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShuZXdrZXksIGJ1ZmZlciwgMik7CiAJc3BlZWQgPSAoKGJ1ZmZlclswXSA8PCA4IHwgYnVmZmVyWzFdKSA+PiAyKTsKIAotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC03MjksMzAgKzc3OCwxOSBAQAogCQkJCQljb25zdCBjaGFyICpzeXNmc2J1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCByZXQ7Ci0JdTMyIHNwZWVkOworCXVuc2lnbmVkIGxvbmcgc3BlZWQ7CiAJY2hhciBuZXdrZXlbNV07CiAJdTggYnVmZmVyWzJdOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9Ci0JCQkJCQl0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAotCXNwZWVkID0gc2ltcGxlX3N0cnRvdWwoc3lzZnNidWYsIE5VTEwsIDEwKTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoc3lzZnNidWYsIDEwLCAmc3BlZWQpIDwgMCB8fCBzcGVlZCA+PSAweDQwMDApCisJCXJldHVybiAtRUlOVkFMOwkJLyogQmlnZ2VyIHRoYW4gYSAxNC1iaXQgdmFsdWUgKi8KIAotCWlmIChzcGVlZCA+IDB4NDAwMCkgLyogQmlnZ2VyIHRoYW4gYSAxNC1iaXQgdmFsdWUgKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQluZXdrZXlbMF0gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzBdOwotCW5ld2tleVsxXSA9ICcwJyArIHNlbnNvcl9hdHRyLT5pbmRleDsKLQluZXdrZXlbMl0gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzJdOwotCW5ld2tleVszXSA9IGZhbl9zcGVlZF9rZXlzW3NlbnNvcl9hdHRyLT5ucl1bM107Ci0JbmV3a2V5WzRdID0gMDsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCXNwcmludGYobmV3a2V5LCBmYW5fc3BlZWRfZm10W3RvX29wdGlvbihhdHRyKV0sIHRvX2luZGV4KGF0dHIpKTsKIAogCWJ1ZmZlclswXSA9IChzcGVlZCA+PiA2KSAmIDB4ZmY7CiAJYnVmZmVyWzFdID0gKHNwZWVkIDw8IDIpICYgMHhmZjsKIAlyZXQgPSBhcHBsZXNtY193cml0ZV9rZXkobmV3a2V5LCBidWZmZXIsIDIpOwogCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTc2MCwxOSArNzk4LDE1IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3Nob3dfZmFuX21hbnVhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqc3lzZnNidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7CiAJaW50IHJldDsKIAl1MTYgbWFudWFsID0gMDsKIAl1OCBidWZmZXJbMl07Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShGQU5TX01BTlVBTCwgYnVmZmVyLCAyKTsKLQltYW51YWwgPSAoKGJ1ZmZlclswXSA8PCA4IHwgYnVmZmVyWzFdKSA+PiBhdHRyLT5pbmRleCkgJiAweDAxOworCW1hbnVhbCA9ICgoYnVmZmVyWzBdIDw8IDggfCBidWZmZXJbMV0pID4+IHRvX2luZGV4KGF0dHIpKSAmIDB4MDE7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtNzgwLDE4ICs4MTQsMTYgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfc3RvcmVfZmFuX21hbnVhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY29uc3QgY2hhciAqc3lzZnNidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgcmV0OwogCXU4IGJ1ZmZlclsyXTsKLQl1MzIgaW5wdXQ7CisJdW5zaWduZWQgbG9uZyBpbnB1dDsKIAl1MTYgdmFsOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAotCWlucHV0ID0gc2ltcGxlX3N0cnRvdWwoc3lzZnNidWYsIE5VTEwsIDEwKTsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWlmIChzdHJpY3Rfc3RydG91bChzeXNmc2J1ZiwgMTAsICZpbnB1dCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KEZBTlNfTUFOVUFMLCBidWZmZXIsIDIpOwogCXZhbCA9IChidWZmZXJbMF0gPDwgOCB8IGJ1ZmZlclsxXSk7CkBAIC03OTksOSArODMxLDkgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaW5wdXQpCi0JCXZhbCA9IHZhbCB8ICgweDAxIDw8IGF0dHItPmluZGV4KTsKKwkJdmFsID0gdmFsIHwgKDB4MDEgPDwgdG9faW5kZXgoYXR0cikpOwogCWVsc2UKLQkJdmFsID0gdmFsICYgfigweDAxIDw8IGF0dHItPmluZGV4KTsKKwkJdmFsID0gdmFsICYgfigweDAxIDw8IHRvX2luZGV4KGF0dHIpKTsKIAogCWJ1ZmZlclswXSA9ICh2YWwgPj4gOCkgJiAweEZGOwogCWJ1ZmZlclsxXSA9IHZhbCAmIDB4RkY7CkBAIC04MDksNyArODQxLDYgQEAKIAlyZXQgPSBhcHBsZXNtY193cml0ZV9rZXkoRkFOU19NQU5VQUwsIGJ1ZmZlciwgMik7CiAKIG91dDoKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtODIyLDIxICs4NTMsMTIgQEAKIAlpbnQgcmV0OwogCWNoYXIgbmV3a2V5WzVdOwogCXU4IGJ1ZmZlclsxN107Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KLQkJCQkJCXRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOwogCi0JbmV3a2V5WzBdID0gRkFOX1BPU0lUSU9OWzBdOwotCW5ld2tleVsxXSA9ICcwJyArIHNlbnNvcl9hdHRyLT5pbmRleDsKLQluZXdrZXlbMl0gPSBGQU5fUE9TSVRJT05bMl07Ci0JbmV3a2V5WzNdID0gRkFOX1BPU0lUSU9OWzNdOwotCW5ld2tleVs0XSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlzcHJpbnRmKG5ld2tleSwgRkFOX0lEX0ZNVCwgdG9faW5kZXgoYXR0cikpOwogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkobmV3a2V5LCBidWZmZXIsIDE2KTsKIAlidWZmZXJbMTZdID0gMDsKIAotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC04NTIsMTggKzg3NCwxNCBAQAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfY2FsaWJyYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqc3lzZnNidWYsIHNpemVfdCBjb3VudCkKIHsKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlhcHBsZXNtY19jYWxpYnJhdGUoKTsKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgdm9pZCBhcHBsZXNtY19iYWNrbGlnaHRfc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlhcHBsZXNtY193cml0ZV9rZXkoQkFDS0xJR0hUX0tFWSwgYmFja2xpZ2h0X3N0YXRlLCAyKTsKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogfQogc3RhdGljIERFQ0xBUkVfV09SSyhiYWNrbGlnaHRfd29yaywgJmFwcGxlc21jX2JhY2tsaWdodF9zZXQpOwogCkBAIC04ODYsMTMgKzkwNCwxMCBAQAogCXU4IGJ1ZmZlcls0XTsKIAl1MzIgY291bnQ7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KEtFWV9DT1VOVF9LRVksIGJ1ZmZlciwgNCk7CiAJY291bnQgPSAoKHUzMilidWZmZXJbMF08PDI0KSArICgodTMyKWJ1ZmZlclsxXTw8MTYpICsKIAkJCQkJCSgodTMyKWJ1ZmZlclsyXTw8OCkgKyBidWZmZXJbM107CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtOTAyLDExMyArOTE3LDUzIEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfcmVhZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0JY2hhciBrZXlbNV07Ci0JY2hhciBpbmZvWzZdOworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV9hdF9pbmRleChrZXlfYXRfaW5kZXgsIGtleSk7Ci0KLQlpZiAocmV0IHx8ICFrZXlbMF0pIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X3R5cGUoa2V5LCBpbmZvKTsKLQotCWlmIChyZXQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQorCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwlyZXQgPSBhcHBsZXNtY19yZWFkX2VudHJ5KGVudHJ5LCBzeXNmc2J1ZiwgZW50cnktPmxlbik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKLQkvKgotCSAqIGluZm9bMF0gbWF4aW11bSB2YWx1ZSAoQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKSBpcyBtdWNoIGxvd2VyIHRoYW4KLQkgKiBQQUdFX1NJWkUsIHNvIHdlIGRvbid0IG5lZWQgYW55IGNoZWNrcyBiZWZvcmUgd3JpdGluZyB0byBzeXNmc2J1Zi4KLQkgKi8KLQlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShrZXksIHN5c2ZzYnVmLCBpbmZvWzBdKTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQlpZiAoIXJldCkgewotCQlyZXR1cm4gaW5mb1swXTsKLQl9IGVsc2UgewotCQlyZXR1cm4gcmV0OwotCX0KKwlyZXR1cm4gZW50cnktPmxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X2RhdGFfbGVuZ3RoX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpzeXNmc2J1ZikKIHsKLQljaGFyIGtleVs1XTsKLQljaGFyIGluZm9bNl07Ci0JaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfaW5kZXgoa2V5X2F0X2luZGV4KTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOwogCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV9hdF9pbmRleChrZXlfYXRfaW5kZXgsIGtleSk7Ci0KLQlpZiAocmV0IHx8ICFrZXlbMF0pIHsKLQkJbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X3R5cGUoa2V5LCBpbmZvKTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQlpZiAoIXJldCkKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaW5mb1swXSk7Ci0JZWxzZQotCQlyZXR1cm4gcmV0OworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGVudHJ5LT5sZW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0JY2hhciBrZXlbNV07Ci0JY2hhciBpbmZvWzZdOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKIAotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JaWYgKHJldCB8fCAha2V5WzBdKSB7Ci0JCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV90eXBlKGtleSwgaW5mbyk7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCi0JaWYgKCFyZXQpCi0JCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGluZm8rMSk7Ci0JZWxzZQotCQlyZXR1cm4gcmV0OworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGVudHJ5LT50eXBlKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewotCWNoYXIga2V5WzVdOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKIAotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCWlmICghcmV0ICYmIGtleVswXSkKLQkJcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwga2V5KTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGVudHJ5LT5rZXkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMDIwLDEyICs5NzUsMTMgQEAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX2tleV9hdF9pbmRleF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnN5c2ZzYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJdW5zaWduZWQgbG9uZyBuZXdrZXk7CiAKLQlrZXlfYXRfaW5kZXggPSBzaW1wbGVfc3RydG91bChzeXNmc2J1ZiwgTlVMTCwgMTApOworCWlmIChzdHJpY3Rfc3RydG91bChzeXNmc2J1ZiwgMTAsICZuZXdrZXkpIDwgMAorCSAgICB8fCBuZXdrZXkgPj0gc21jcmVnLmtleV9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCisJa2V5X2F0X2luZGV4ID0gbmV3a2V5OwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTAzNSwzODcgKzk5MSwxMDEgQEAKIAkuYnJpZ2h0bmVzc19zZXQJCT0gYXBwbGVzbWNfYnJpZ2h0bmVzc19zZXQsCiB9OwogCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgMDQ0NCwgYXBwbGVzbWNfbmFtZV9zaG93LCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHBvc2l0aW9uLCAwNDQ0LCBhcHBsZXNtY19wb3NpdGlvbl9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjYWxpYnJhdGUsIDA2NDQsCi0JCQlhcHBsZXNtY19jYWxpYnJhdGVfc2hvdywgYXBwbGVzbWNfY2FsaWJyYXRlX3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wb3NpdGlvbi5hdHRyLAotCSZkZXZfYXR0cl9jYWxpYnJhdGUuYXR0ciwKLQlOVUxMCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgaW5mb19ncm91cFtdID0geworCXsgIm5hbWUiLCBhcHBsZXNtY19uYW1lX3Nob3cgfSwKKwl7ICJrZXlfY291bnQiLCBhcHBsZXNtY19rZXlfY291bnRfc2hvdyB9LAorCXsgImtleV9hdF9pbmRleCIsIGFwcGxlc21jX2tleV9hdF9pbmRleF9zaG93LCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc3RvcmUgfSwKKwl7ICJrZXlfYXRfaW5kZXhfbmFtZSIsIGFwcGxlc21jX2tleV9hdF9pbmRleF9uYW1lX3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXhfdHlwZSIsIGFwcGxlc21jX2tleV9hdF9pbmRleF90eXBlX3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGgiLCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGhfc2hvdyB9LAorCXsgImtleV9hdF9pbmRleF9kYXRhIiwgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3JlYWRfc2hvdyB9LAorCXsgfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWNjZWxlcm9tZXRlcl9hdHRyaWJ1dGVzX2dyb3VwID0KLQl7IC5hdHRycyA9IGFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlcyB9OwotCi1zdGF0aWMgREVWSUNFX0FUVFIobGlnaHQsIDA0NDQsIGFwcGxlc21jX2xpZ2h0X3Nob3csIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2NvdW50LCAwNDQ0LCBhcHBsZXNtY19rZXlfY291bnRfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4LCAwNjQ0LAotCQlhcHBsZXNtY19rZXlfYXRfaW5kZXhfc2hvdywgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihrZXlfYXRfaW5kZXhfbmFtZSwgMDQ0NCwKLQkJCQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X25hbWVfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4X3R5cGUsIDA0NDQsCi0JCQkJCWFwcGxlc21jX2tleV9hdF9pbmRleF90eXBlX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGtleV9hdF9pbmRleF9kYXRhX2xlbmd0aCwgMDQ0NCwKLQkJCQlhcHBsZXNtY19rZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGhfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4X2RhdGEsIDA0NDQsCi0JCQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X3JlYWRfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICprZXlfZW51bWVyYXRpb25fYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9rZXlfY291bnQuYXR0ciwKLQkmZGV2X2F0dHJfa2V5X2F0X2luZGV4LmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF9uYW1lLmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF90eXBlLmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleF9kYXRhX2xlbmd0aC5hdHRyLAotCSZkZXZfYXR0cl9rZXlfYXRfaW5kZXhfZGF0YS5hdHRyLAotCU5VTEwKK3N0YXRpYyBzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCBhY2NlbGVyb21ldGVyX2dyb3VwW10gPSB7CisJeyAicG9zaXRpb24iLCBhcHBsZXNtY19wb3NpdGlvbl9zaG93IH0sCisJeyAiY2FsaWJyYXRlIiwgYXBwbGVzbWNfY2FsaWJyYXRlX3Nob3csIGFwcGxlc21jX2NhbGlicmF0ZV9zdG9yZSB9LAorCXsgfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAga2V5X2VudW1lcmF0aW9uX2dyb3VwID0KLQl7IC5hdHRycyA9IGtleV9lbnVtZXJhdGlvbl9hdHRyaWJ1dGVzIH07Ci0KLS8qCi0gKiBNYWNybyBkZWZpbmluZyBTRU5TT1JfREVWSUNFX0FUVFIgZm9yIGEgZmFuIHN5c2ZzIGVudHJpZXMuCi0gKiAgLSBzaG93IGFjdHVhbCBzcGVlZAotICogIC0gc2hvdy9zdG9yZSBtaW5pbXVtIHNwZWVkCi0gKiAgLSBzaG93IG1heGltdW0gc3BlZWQKLSAqICAtIHNob3cgc2FmZSBzcGVlZAotICogIC0gc2hvdy9zdG9yZSB0YXJnZXQgc3BlZWQKLSAqICAtIHNob3cvc3RvcmUgbWFudWFsIG1vZGUKLSAqLwotI2RlZmluZSBzeXNmc19mYW5fc3BlZWRzX29mZnNldChvZmZzZXQpIFwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCi0JCQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMCwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgMSwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19tYXgsIFNfSVJVR08sIFwKLQkJCWFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAyLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX3NhZmUsIFNfSVJVR08sIFwKLQkJCWFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAzLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4jI29mZnNldCMjX291dHB1dCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgYXBwbGVzbWNfc3RvcmVfZmFuX3NwZWVkLCA0LCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19tYW51YWwsIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JYXBwbGVzbWNfc2hvd19mYW5fbWFudWFsLCBhcHBsZXNtY19zdG9yZV9mYW5fbWFudWFsLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19sYWJlbCwgU19JUlVHTywgXAotCWFwcGxlc21jX3Nob3dfZmFuX3Bvc2l0aW9uLCBOVUxMLCBvZmZzZXQtMSk7IFwKLVwKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmYW4jI29mZnNldCMjX2F0dHJpYnV0ZXNbXSA9IHsgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19pbnB1dC5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX21pbi5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX21heC5kZXZfYXR0ci5hdHRyLCBcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI29mZnNldCMjX3NhZmUuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19vdXRwdXQuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19tYW51YWwuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19sYWJlbC5kZXZfYXR0ci5hdHRyLCBcCi0JTlVMTCBcCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgbGlnaHRfc2Vuc29yX2dyb3VwW10gPSB7CisJeyAibGlnaHQiLCBhcHBsZXNtY19saWdodF9zaG93IH0sCisJeyB9CiB9OwogCi0vKgotICogQ3JlYXRlIHRoZSBuZWVkZWQgZnVuY3Rpb25zIGZvciBlYWNoIGZhbiB1c2luZyB0aGUgbWFjcm8gZGVmaW5lZCBhYm92ZQotICogKDQgZmFucyBhcmUgc3VwcG9ydGVkKQotICovCi1zeXNmc19mYW5fc3BlZWRzX29mZnNldCgxKTsKLXN5c2ZzX2Zhbl9zcGVlZHNfb2Zmc2V0KDIpOwotc3lzZnNfZmFuX3NwZWVkc19vZmZzZXQoMyk7Ci1zeXNmc19mYW5fc3BlZWRzX29mZnNldCg0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZmFuX2F0dHJpYnV0ZV9ncm91cHNbXSA9IHsKLQl7IC5hdHRycyA9IGZhbjFfYXR0cmlidXRlcyB9LAotCXsgLmF0dHJzID0gZmFuMl9hdHRyaWJ1dGVzIH0sCi0JeyAuYXR0cnMgPSBmYW4zX2F0dHJpYnV0ZXMgfSwKLQl7IC5hdHRycyA9IGZhbjRfYXR0cmlidXRlcyB9LAorc3RhdGljIHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIGZhbl9ncm91cFtdID0geworCXsgImZhbiVkX2xhYmVsIiwgYXBwbGVzbWNfc2hvd19mYW5fcG9zaXRpb24gfSwKKwl7ICJmYW4lZF9pbnB1dCIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAwIH0sCisJeyAiZmFuJWRfbWluIiwgYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgMSB9LAorCXsgImZhbiVkX21heCIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAyIH0sCisJeyAiZmFuJWRfc2FmZSIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBOVUxMLCAzIH0sCisJeyAiZmFuJWRfb3V0cHV0IiwgYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgNCB9LAorCXsgImZhbiVkX21hbnVhbCIsIGFwcGxlc21jX3Nob3dfZmFuX21hbnVhbCwgYXBwbGVzbWNfc3RvcmVfZmFuX21hbnVhbCB9LAorCXsgfQogfTsKIAotLyoKLSAqIFRlbXBlcmF0dXJlIHNlbnNvcnMgc3lzZnMgZW50cmllcy4KLSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wN19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTBfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDExX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTJfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxM19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE0X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTVfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE3X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMThfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxOV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIwX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjFfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDIxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIzX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjRfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI2X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjdfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyOF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI5X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzBfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMyX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzNfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM1X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzZfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzN19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM4X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzlfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0MF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDdfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDEwX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDExX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTNfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE0X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTZfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE3X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxOF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTlfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIwX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjJfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDIxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIzX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjVfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI2X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyN19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjhfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI5X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzFfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMyX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzM19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzRfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM1X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzdfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM4X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzOV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNDBfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM5KTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxhYmVsX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA3X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDlfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDExX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTJfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxM19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTVfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE3X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMThfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxOV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIwX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjFfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIzX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjRfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI2X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjdfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI5X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzBfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMyX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM1X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzN19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM4X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzlfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0MF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA2X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE1X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM2X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNDBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzX2dyb3VwID0KLQl7IC5hdHRycyA9IHRlbXBlcmF0dXJlX2F0dHJpYnV0ZXMgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbGFiZWxfYXR0cmlidXRlc19ncm91cCA9IHsKLQkuYXR0cnMgPSBsYWJlbF9hdHRyaWJ1dGVzCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgdGVtcF9ncm91cFtdID0geworCXsgInRlbXAlZF9sYWJlbCIsIGFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsIH0sCisJeyAidGVtcCVkX2lucHV0IiwgYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSB9LAorCXsgfQogfTsKIAogLyogTW9kdWxlIHN0dWZmICovCiAKIC8qCi0gKiBhcHBsZXNtY19kbWlfbWF0Y2ggLSBmb3VuZCBhIG1hdGNoLiAgcmV0dXJuIG9uZSwgc2hvcnQtY2lyY3VpdGluZyB0aGUgaHVudC4KKyAqIGFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMgLSByZW1vdmUgZmlsZXMgYW5kIGZyZWUgYXNzb2NpYXRlZCBtZW1vcnkKICAqLwotc3RhdGljIGludCBhcHBsZXNtY19kbWlfbWF0Y2goY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQorc3RhdGljIHZvaWQgYXBwbGVzbWNfZGVzdHJveV9ub2RlcyhzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCAqZ3JvdXBzKQogewotCWludCBpID0gMDsKLQlzdHJ1Y3QgZG1pX21hdGNoX2RhdGEqIGRtaV9kYXRhID0gaWQtPmRyaXZlcl9kYXRhOwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAlcyBkZXRlY3RlZDpcbiIsIGlkLT5pZGVudCk7Ci0JYXBwbGVzbWNfYWNjZWxlcm9tZXRlciA9IGRtaV9kYXRhLT5hY2NlbGVyb21ldGVyOwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAgLSBNb2RlbCAlcyBhY2NlbGVyb21ldGVyXG4iLAotCQkJCWFwcGxlc21jX2FjY2VsZXJvbWV0ZXIgPyAid2l0aCIgOiAid2l0aG91dCIpOwotCWFwcGxlc21jX2xpZ2h0ID0gZG1pX2RhdGEtPmxpZ2h0OwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAgLSBNb2RlbCAlcyBsaWdodCBzZW5zb3JzIGFuZCBiYWNrbGlnaHRcbiIsCi0JCQkJCWFwcGxlc21jX2xpZ2h0ID8gIndpdGgiIDogIndpdGhvdXQiKTsKKwlzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCAqZ3JwOworCXN0cnVjdCBhcHBsZXNtY19kZXZfYXR0ciAqbm9kZTsKIAotCWFwcGxlc21jX3RlbXBlcmF0dXJlX3NldCA9ICBkbWlfZGF0YS0+dGVtcGVyYXR1cmVfc2V0OwotCXdoaWxlICh0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVtpXSAhPSBOVUxMKQotCQlpKys7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6ICAtIE1vZGVsIHdpdGggJWQgdGVtcGVyYXR1cmUgc2Vuc29yc1xuIiwgaSk7Ci0JcmV0dXJuIDE7CisJZm9yIChncnAgPSBncm91cHM7IGdycC0+bm9kZXM7IGdycCsrKSB7CisJCWZvciAobm9kZSA9IGdycC0+bm9kZXM7IG5vZGUtPnNkYS5kZXZfYXR0ci5hdHRyLm5hbWU7IG5vZGUrKykKKwkJCXN5c2ZzX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYua29iaiwKKwkJCQkJICAmbm9kZS0+c2RhLmRldl9hdHRyLmF0dHIpOworCQlrZnJlZShncnAtPm5vZGVzKTsKKwkJZ3JwLT5ub2RlcyA9IE5VTEw7CisJfQorfQorCisvKgorICogYXBwbGVzbWNfY3JlYXRlX25vZGVzIC0gY3JlYXRlIGEgdHdvLWRpbWVuc2lvbmFsIGdyb3VwIG9mIHN5c2ZzIGZpbGVzCisgKi8KK3N0YXRpYyBpbnQgYXBwbGVzbWNfY3JlYXRlX25vZGVzKHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwICpncm91cHMsIGludCBudW0pCit7CisJc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgKmdycDsKKwlzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgKm5vZGU7CisJc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgcmV0LCBpOworCisJZm9yIChncnAgPSBncm91cHM7IGdycC0+Zm9ybWF0OyBncnArKykgeworCQlncnAtPm5vZGVzID0ga2NhbGxvYyhudW0gKyAxLCBzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFncnAtPm5vZGVzKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQlub2RlID0gJmdycC0+bm9kZXNbaV07CisJCQlzcHJpbnRmKG5vZGUtPm5hbWUsIGdycC0+Zm9ybWF0LCBpICsgMSk7CisJCQlub2RlLT5zZGEuaW5kZXggPSAoZ3JwLT5vcHRpb24gPDwgMTYpIHwgKGkgJiAweGZmZmYpOworCQkJbm9kZS0+c2RhLmRldl9hdHRyLnNob3cgPSBncnAtPnNob3c7CisJCQlub2RlLT5zZGEuZGV2X2F0dHIuc3RvcmUgPSBncnAtPnN0b3JlOworCQkJYXR0ciA9ICZub2RlLT5zZGEuZGV2X2F0dHIuYXR0cjsKKwkJCWF0dHItPm5hbWUgPSBub2RlLT5uYW1lOworCQkJYXR0ci0+bW9kZSA9IFNfSVJVR08gfCAoZ3JwLT5zdG9yZSA/IFNfSVdVU1IgOiAwKTsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwgYXR0cik7CisJCQlpZiAocmV0KSB7CisJCQkJYXR0ci0+bmFtZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK291dDoKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGdyb3Vwcyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogQ3JlYXRlIGFjY2VsZXJvbWV0ZXIgcmVzc291cmNlcyAqLwpAQCAtMTQyNCw4ICsxMDk0LDEwIEBACiAJc3RydWN0IGlucHV0X2RldiAqaWRldjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkJJmFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlc19ncm91cCk7CisJaWYgKCFzbWNyZWcuaGFzX2FjY2VsZXJvbWV0ZXIpCisJCXJldHVybiAwOworCisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX25vZGVzKGFjY2VsZXJvbWV0ZXJfZ3JvdXAsIDEpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0xNDYyLDE4NCArMTEzNCw5NiBAQAogCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShhcHBsZXNtY19pZGV2KTsKIAogb3V0X3N5c2ZzOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNfZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoYWNjZWxlcm9tZXRlcl9ncm91cCk7CiAKIG91dDoKLQlwcmludGsoS0VSTl9XQVJOSU5HICJhcHBsZXNtYzogZHJpdmVyIGluaXQgZmFpbGVkIChyZXQ9JWQpIVxuIiwgcmV0KTsKKwlwcl93YXJuKCJkcml2ZXIgaW5pdCBmYWlsZWQgKHJldD0lZCkhXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIFJlbGVhc2UgYWxsIHJlc3NvdXJjZXMgdXNlZCBieSB0aGUgYWNjZWxlcm9tZXRlciAqLwogc3RhdGljIHZvaWQgYXBwbGVzbWNfcmVsZWFzZV9hY2NlbGVyb21ldGVyKHZvaWQpCiB7CisJaWYgKCFzbWNyZWcuaGFzX2FjY2VsZXJvbWV0ZXIpCisJCXJldHVybjsKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYXBwbGVzbWNfaWRldik7CiAJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGFwcGxlc21jX2lkZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNfZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoYWNjZWxlcm9tZXRlcl9ncm91cCk7CiB9CiAKLXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkbWlfbWF0Y2hfZGF0YSBhcHBsZXNtY19kbWlfZGF0YVtdID0gewotLyogTWFjQm9vayBQcm86IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDAgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDAgfSwKLS8qIE1hY0Jvb2syOiBhY2NlbGVyb21ldGVyIGFuZCB0ZW1wZXJhdHVyZSBzZXQgMSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMSB9LAotLyogTWFjQm9vazogYWNjZWxlcm9tZXRlciBhbmQgdGVtcGVyYXR1cmUgc2V0IDIgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDIgfSwKLS8qIE1hY01pbmk6IHRlbXBlcmF0dXJlIHNldCAzICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAzIH0sCi0vKiBNYWNQcm86IHRlbXBlcmF0dXJlIHNldCA0ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSA0IH0sCi0vKiBpTWFjOiB0ZW1wZXJhdHVyZSBzZXQgNSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gNSB9LAotLyogTWFjQm9vazMsIE1hY0Jvb2s0OiBhY2NlbGVyb21ldGVyIGFuZCB0ZW1wZXJhdHVyZSBzZXQgNiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gNiB9LAotLyogTWFjQm9vayBBaXI6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDcgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDcgfSwKLS8qIE1hY0Jvb2sgUHJvIDQ6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDggKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDggfSwKLS8qIE1hY0Jvb2sgUHJvIDM6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDkgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDkgfSwKLS8qIGlNYWMgNTogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxMCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTAgfSwKLS8qIE1hY0Jvb2sgNTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTEgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDExIH0sCi0vKiBNYWNCb29rIFBybyA1OiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxMiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTIgfSwKLS8qIGlNYWMgODogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxMyAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTMgfSwKLS8qIGlNYWMgNjogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxNCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTQgfSwKLS8qIE1hY0Jvb2sgQWlyIDIsMTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTUgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE1IH0sCi0vKiBNYWNQcm8zLDE6IHRlbXBlcmF0dXJlIHNldCAxNiAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTYgfSwKLS8qIGlNYWMgOSwxOiBsaWdodCBzZW5zb3Igb25seSwgdGVtcGVyYXR1cmUgc2V0IDE3ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDAsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNyB9LAotLyogTWFjQm9vayBQcm8gMiwyOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAxOCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMTggfSwKLS8qIE1hY0Jvb2sgUHJvIDUsMzogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTkgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE5IH0sCi0vKiBNYWNCb29rIFBybyA1LDQ6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDIwICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAyMCB9LAotLyogTWFjQm9vayBQcm8gNiwyOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAyMSAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMjEgfSwKLS8qIE1hY0Jvb2sgUHJvIDcsMTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMjIgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDIyIH0sCi19Oworc3RhdGljIGludCBhcHBsZXNtY19jcmVhdGVfbGlnaHRfc2Vuc29yKHZvaWQpCit7CisJaWYgKCFzbWNyZWcubnVtX2xpZ2h0X3NlbnNvcnMpCisJCXJldHVybiAwOworCXJldHVybiBhcHBsZXNtY19jcmVhdGVfbm9kZXMobGlnaHRfc2Vuc29yX2dyb3VwLCAxKTsKK30KKworc3RhdGljIHZvaWQgYXBwbGVzbWNfcmVsZWFzZV9saWdodF9zZW5zb3Iodm9pZCkKK3sKKwlpZiAoIXNtY3JlZy5udW1fbGlnaHRfc2Vuc29ycykKKwkJcmV0dXJuOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMobGlnaHRfc2Vuc29yX2dyb3VwKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19jcmVhdGVfa2V5X2JhY2tsaWdodCh2b2lkKQoreworCWlmICghc21jcmVnLmhhc19rZXlfYmFja2xpZ2h0KQorCQlyZXR1cm4gMDsKKwlhcHBsZXNtY19sZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGVzbWMtbGVkIik7CisJaWYgKCFhcHBsZXNtY19sZWRfd3EpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmFwcGxlc21jX2JhY2tsaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlc21jX3JlbGVhc2Vfa2V5X2JhY2tsaWdodCh2b2lkKQoreworCWlmICghc21jcmVnLmhhc19rZXlfYmFja2xpZ2h0KQorCQlyZXR1cm47CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFwcGxlc21jX2JhY2tsaWdodCk7CisJZGVzdHJveV93b3JrcXVldWUoYXBwbGVzbWNfbGVkX3dxKTsKK30KKworc3RhdGljIGludCBhcHBsZXNtY19kbWlfbWF0Y2goY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXJldHVybiAxOworfQogCiAvKiBOb3RlIHRoYXQgRE1JX01BVENIKC4uLiwiTWFjQm9vayIpIHdpbGwgbWF0Y2ggIk1hY0Jvb2tQcm8xLDEiLgogICogU28gd2UgbmVlZCB0byBwdXQgIkFwcGxlIE1hY0Jvb2sgUHJvIiBiZWZvcmUgIkFwcGxlIE1hY0Jvb2siLiAqLwogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9zeXN0ZW1faWQgYXBwbGVzbWNfd2hpdGVsaXN0W10gPSB7Ci0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIEFpciAyIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rQWlyMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxNV19LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBBaXIiLCB7CiAJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCiAJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tBaXIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbN119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzciKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMjJdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDUsNCIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUsNCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyMF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNSwzIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNSwzIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzE5XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyA2IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyMV19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTJdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDQiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm80IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzhdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDMiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8zIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzldfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDIsMiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUgQ29tcHV0ZXIsIEluYy4iKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzIsMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxOF19LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2tQcm8iKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayAodjIpIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vazIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMV19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayAodjMpIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vazMiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNl19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayA0IiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rNCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs2XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIDUiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2s1IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzExXX0sCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8iKSB9LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjQm9vayIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsyXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNtaW5pIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjbWluaSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVszXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNQcm8yIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiTWFjUHJvMiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs0XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNQcm8zIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNQcm8zIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzE2XX0sCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2siKSB9LAorCX0sCisJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNtaW5pIiwgeworCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNtaW5pIikgfSwKKwl9LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjUHJvIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAogCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNQcm8iKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA5LDEiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIEluYy4iKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzksMSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxN119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA4IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjOCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxM119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA2IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjNiIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxNF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyA1IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjNSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxMF19LAorCX0sCiAJeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBpTWFjIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwiaU1hYyIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs1XX0sCisJICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCisJICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImlNYWMiKSB9LAorCX0sCiAJeyAuaWRlbnQgPSBOVUxMIH0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFwcGxlc21jX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwotCWludCBjb3VudDsKLQlpbnQgaTsKIAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShhcHBsZXNtY193aGl0ZWxpc3QpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBzdXBwb3J0ZWQgbGFwdG9wIG5vdCBmb3VuZCFcbiIpOworCQlwcl93YXJuKCJzdXBwb3J0ZWQgbGFwdG9wIG5vdCBmb3VuZCFcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjYxLDgzICsxMjQ1LDM0IEBACiAJCWdvdG8gb3V0X2RyaXZlcjsKIAl9CiAKLQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCS8qIGNyZWF0ZSByZWdpc3RlciBjYWNoZSAqLworCXJldCA9IGFwcGxlc21jX2luaXRfc21jcmVnKCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGV2aWNlOwogCi0JLyogQ3JlYXRlIGtleSBlbnVtZXJhdGlvbiBzeXNmcyBmaWxlcyAqLwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZrZXlfZW51bWVyYXRpb25fZ3JvdXApOworCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhpbmZvX2dyb3VwLCAxKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9uYW1lOworCQlnb3RvIG91dF9zbWNyZWc7CiAKLQkvKiBjcmVhdGUgZmFuIGZpbGVzICovCi0JY291bnQgPSBhcHBsZXNtY19nZXRfZmFuX2NvdW50KCk7Ci0JaWYgKGNvdW50IDwgMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJhcHBsZXNtYzogQ2Fubm90IGdldCB0aGUgbnVtYmVyIG9mIGZhbnMuXG4iKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAlZCBmYW5zIGZvdW5kLlxuIiwgY291bnQpOworCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhmYW5fZ3JvdXAsIHNtY3JlZy5mYW5fY291bnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2luZm87CiAKLQlpZiAoY291bnQgPiA0KSB7Ci0JCWNvdW50ID0gNDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IE1vcmUgdGhhbiA0IGZhbnMgZm91bmQsIgotCQkgICAgICAgIiBidXQgYXQgbW9zdCA0IGZhbnMgYXJlIHN1cHBvcnRlZCIKLQkJICAgICAgICIgYnkgdGhlIGRyaXZlci5cbiIpOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbm9kZXModGVtcF9ncm91cCwgc21jcmVnLnRlbXBfY291bnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhbnM7CiAKLQl3aGlsZSAoZmFuc19oYW5kbGVkIDwgY291bnQpIHsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkJICZmYW5fYXR0cmlidXRlX2dyb3Vwc1tmYW5zX2hhbmRsZWRdKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZhbnM7Ci0JCWZhbnNfaGFuZGxlZCsrOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfYWNjZWxlcm9tZXRlcigpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwogCi0JZm9yIChpID0gMDsKLQkgICAgIHRlbXBlcmF0dXJlX3NlbnNvcnNfc2V0c1thcHBsZXNtY190ZW1wZXJhdHVyZV9zZXRdW2ldICE9IE5VTEw7Ci0JICAgICBpKyspIHsKLQkJaWYgKHRlbXBlcmF0dXJlX2F0dHJpYnV0ZXNbaV0gPT0gTlVMTCB8fAotCQkgICAgbGFiZWxfYXR0cmlidXRlc1tpXSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFwcGxlc21jOiBNb3JlIHRlbXBlcmF0dXJlIHNlbnNvcnMgIgotCQkJCSJpbiB0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHMgKGF0IGxlYXN0ICVpKSIKLQkJCQkidGhhbiBhdmFpbGFibGUgc3lzZnMgZmlsZXMgaW4gIgotCQkJCSJ0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzICglaSksIHBsZWFzZSByZXBvcnQgIgotCQkJCSJ0aGlzIGJ1Zy5cbiIsIGksIGktMSk7Ci0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQkJfQotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCQl0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzW2ldKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCQlsYWJlbF9hdHRyaWJ1dGVzW2ldKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3RlbXBlcmF0dXJlOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbGlnaHRfc2Vuc29yKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfYWNjZWxlcm9tZXRlcjsKIAotCWlmIChhcHBsZXNtY19hY2NlbGVyb21ldGVyKSB7Ci0JCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9hY2NlbGVyb21ldGVyKCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQl9Ci0KLQlpZiAoYXBwbGVzbWNfbGlnaHQpIHsKLQkJLyogQWRkIGxpZ2h0IHNlbnNvciBmaWxlICovCi0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRldl9hdHRyX2xpZ2h0LmF0dHIpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfYWNjZWxlcm9tZXRlcjsKLQotCQkvKiBDcmVhdGUgdGhlIHdvcmtxdWV1ZSAqLwotCQlhcHBsZXNtY19sZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGVzbWMtbGVkIik7Ci0JCWlmICghYXBwbGVzbWNfbGVkX3dxKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfbGlnaHRfc3lzZnM7Ci0JCX0KLQotCQkvKiByZWdpc3RlciBhcyBhIGxlZCBkZXZpY2UgKi8KLQkJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZhcHBsZXNtY19iYWNrbGlnaHQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2xpZ2h0X3dxOwotCX0KKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfa2V5X2JhY2tsaWdodCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2xpZ2h0X3N5c2ZzOwogCiAJaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkgewpAQCAtMTc0NSwzMiArMTI4MCwyMiBAQAogCQlnb3RvIG91dF9saWdodF9sZWRjbGFzczsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogZHJpdmVyIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4iKTsKLQogCXJldHVybiAwOwogCiBvdXRfbGlnaHRfbGVkY2xhc3M6Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXBwbGVzbWNfYmFja2xpZ2h0KTsKLW91dF9saWdodF93cToKLQlpZiAoYXBwbGVzbWNfbGlnaHQpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKGFwcGxlc21jX2xlZF93cSk7CisJYXBwbGVzbWNfcmVsZWFzZV9rZXlfYmFja2xpZ2h0KCk7CiBvdXRfbGlnaHRfc3lzZnM6Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQotCQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9saWdodC5hdHRyKTsKKwlhcHBsZXNtY19yZWxlYXNlX2xpZ2h0X3NlbnNvcigpOwogb3V0X2FjY2VsZXJvbWV0ZXI6Ci0JaWYgKGFwcGxlc21jX2FjY2VsZXJvbWV0ZXIpCi0JCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOworCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOwogb3V0X3RlbXBlcmF0dXJlOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsYWJlbF9hdHRyaWJ1dGVzX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdGVtcGVyYXR1cmVfYXR0cmlidXRlc19ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2Rlcyh0ZW1wX2dyb3VwKTsKIG91dF9mYW5zOgotCXdoaWxlIChmYW5zX2hhbmRsZWQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJmZhbl9hdHRyaWJ1dGVfZ3JvdXBzWy0tZmFuc19oYW5kbGVkXSk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmtleV9lbnVtZXJhdGlvbl9ncm91cCk7Ci1vdXRfbmFtZToKLQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoZmFuX2dyb3VwKTsKK291dF9pbmZvOgorCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoaW5mb19ncm91cCk7CitvdXRfc21jcmVnOgorCWFwcGxlc21jX2Rlc3Ryb3lfc21jcmVnKCk7CiBvdXRfZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogb3V0X2RyaXZlcjoKQEAgLTE3NzgsMzIgKzEzMDMsMjMgQEAKIG91dF9yZWdpb246CiAJcmVsZWFzZV9yZWdpb24oQVBQTEVTTUNfREFUQV9QT1JULCBBUFBMRVNNQ19OUl9QT1JUUyk7CiBvdXQ6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IGRyaXZlciBpbml0IGZhaWxlZCAocmV0PSVkKSFcbiIsIHJldCk7CisJcHJfd2FybigiZHJpdmVyIGluaXQgZmFpbGVkIChyZXQ9JWQpIVxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGVzbWNfZXhpdCh2b2lkKQogewogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uX2Rldik7Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KSB7Ci0JCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhcHBsZXNtY19iYWNrbGlnaHQpOwotCQlkZXN0cm95X3dvcmtxdWV1ZShhcHBsZXNtY19sZWRfd3EpOwotCQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9saWdodC5hdHRyKTsKLQl9Ci0JaWYgKGFwcGxlc21jX2FjY2VsZXJvbWV0ZXIpCi0JCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZsYWJlbF9hdHRyaWJ1dGVzX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdGVtcGVyYXR1cmVfYXR0cmlidXRlc19ncm91cCk7Ci0Jd2hpbGUgKGZhbnNfaGFuZGxlZCkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwKLQkJCQkgICAmZmFuX2F0dHJpYnV0ZV9ncm91cHNbLS1mYW5zX2hhbmRsZWRdKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAma2V5X2VudW1lcmF0aW9uX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCWFwcGxlc21jX3JlbGVhc2Vfa2V5X2JhY2tsaWdodCgpOworCWFwcGxlc21jX3JlbGVhc2VfbGlnaHRfc2Vuc29yKCk7CisJYXBwbGVzbWNfcmVsZWFzZV9hY2NlbGVyb21ldGVyKCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2Rlcyh0ZW1wX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGZhbl9ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2RlcyhpbmZvX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X3NtY3JlZygpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcHBsZXNtY19kcml2ZXIpOwogCXJlbGVhc2VfcmVnaW9uKEFQUExFU01DX0RBVEFfUE9SVCwgQVBQTEVTTUNfTlJfUE9SVFMpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6IGRyaXZlciB1bmxvYWRlZC5cbiIpOwogfQogCiBtb2R1bGVfaW5pdChhcHBsZXNtY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IDdkYWRhNTUuLmMwMmEwNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtMzYsNiArMzYsOCBAQAogICAgIGFzYjEwMAk3CTMJMQk0CTB4MzEJMHgwNjk0CXllcwlubwogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtNzAxLDggKzcwMyw3IEBACiAJaW50IHZhbDEsIHZhbDI7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKLQkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCi0JCQkJInNtYnVzIGJ5dGUgZGF0YSBub3Qgc3VwcG9ydGVkIVxuIik7CisJCXByX2RlYnVnKCJkZXRlY3QgZmFpbGVkLCBzbWJ1cyBieXRlIGRhdGEgbm90IHN1cHBvcnRlZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTcxNSw3ICs3MTYsNyBAQAogCQkJKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4OTQpKSB8fAogCQkJLyogQ2hlY2sgZm9yIEFTQjEwMCBJRCAoaGlnaCBieXRlICkgKi8KIAkJCSgodmFsMSAmIDB4ODApICYmICh2YWwyICE9IDB4MDYpKSkpIHsKLQkJcHJfZGVidWcoImFzYjEwMDogZGV0ZWN0IGZhaWxlZCwgYmFkIGNoaXAgaWQgMHglMDJ4IVxuIiwgdmFsMik7CisJCXByX2RlYnVnKCJkZXRlY3QgZmFpbGVkLCBiYWQgY2hpcCBpZCAweCUwMnghXG4iLCB2YWwyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03NDQsNyArNzQ1LDcgQEAKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNiMTAwX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpIHsKLQkJcHJfZGVidWcoImFzYjEwMC5vOiBwcm9iZSBmYWlsZWQsIGt6YWxsb2MgZmFpbGVkIVxuIik7CisJCXByX2RlYnVnKCJwcm9iZSBmYWlsZWQsIGt6YWxsb2MgZmFpbGVkIVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gRVJST1IwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMgYi9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCmluZGV4IDIzYjg1NTUuLjJkNjhjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwpAQCAtNSw2ICs1LDggQEAKICAqIFNlZSBDT1BZSU5HIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgdHJlZS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KQEAgLTE0MTQsMTQgKzE0MTYsMTMgQEAKIAogCS8qIE1ha2Ugc3VyZSBpdCdzIHNhZmUgdG8gYWNjZXNzIHRoZSBkZXZpY2UgdGhyb3VnaCBBQ1BJICovCiAJaWYgKCFhY3BpX3Jlc291cmNlc19hcmVfZW5mb3JjZWQoKSkgewotCQlwcl9lcnIoImF0azogUmVzb3VyY2VzIG5vdCBzYWZlbHkgdXNhYmxlIGR1ZSB0byAiCi0JCSAgICAgICAiYWNwaV9lbmZvcmNlX3Jlc291cmNlcyBrZXJuZWwgcGFyYW1ldGVyXG4iKTsKKwkJcHJfZXJyKCJSZXNvdXJjZXMgbm90IHNhZmVseSB1c2FibGUgZHVlIHRvIGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMga2VybmVsIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcmV0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhdGtfZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcl9pbmZvKCJhdGs6IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlwcl9pbmZvKCJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKaW5kZXggNDJkZTk4ZC4uMTk0Y2EwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwpAQCAtMjAsNiArMjAsOCBAQAogICogMDIxMTAtMTMwMSBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ0NSw4ICs0NDcsOCBAQAogCSAqIHdpdGhvdXQgdGhlcm1hbCBzZW5zb3JzIHdpbGwgYmUgZmlsdGVyZWQgb3V0LgogCSAqLwogCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9EVFMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBDUFUgKG1vZGVsPTB4JXgpIgotCQkgICAgICAgIiBoYXMgbm8gdGhlcm1hbCBzZW5zb3IuXG4iLCBjLT54ODZfbW9kZWwpOworCQlwcl9pbmZvKCJDUFUgKG1vZGVsPTB4JXgpIGhhcyBubyB0aGVybWFsIHNlbnNvclxuIiwKKwkJCWMtPng4Nl9tb2RlbCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDY2LDcgKzQ2OCw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBjcHUpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ3OCw4ICs0ODAsNyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDk4MGMxN2QuLmQ5YzU5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNzUsMTIgKzc3LDE0IEBACiAgKiBpbjQgICArMTJWCiAgKiBpbjUgICBWVFIgICAoKzMuM1Ygc3RieSkKICAqIGluNiAgIFZiYXQKKyAqIGluNyAgIFZ0cmlwIChzY2g1MTI3IG9ubHkpCiAgKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIFZvbHRhZ2VzIChpbikgbnVtYmVyZWQgMC02IChpeCkgKi8KLSNkZWZpbmUJRE1FMTczN19SRUdfSU4oaXgpCQkoKGl4KSA8IDUgPyAweDIwICsgKGl4KSBcCi0JCQkJCQkgIDogMHg5NCArIChpeCkpCisvKiBWb2x0YWdlcyAoaW4pIG51bWJlcmVkIDAtNyAoaXgpICovCisjZGVmaW5lCURNRTE3MzdfUkVHX0lOKGl4KQkJKChpeCkgPCA1ID8gMHgyMCArIChpeCkgOiBcCisJCQkJCSAoaXgpIDwgNyA/IDB4OTQgKyAoaXgpIDogXAorCQkJCQkJICAgIDB4MWYpCiAjZGVmaW5lCURNRTE3MzdfUkVHX0lOX01JTihpeCkJCSgoaXgpIDwgNSA/IDB4NDQgKyAoaXgpICogMiBcCiAJCQkJCQkgIDogMHg5MSArIChpeCkgKiAyKQogI2RlZmluZQlETUUxNzM3X1JFR19JTl9NQVgoaXgpCQkoKGl4KSA8IDUgPyAweDQ1ICsgKGl4KSAqIDIgXApAQCAtOTksMTAgKzEwMywxMSBAQAogICogICAgSU5fVEVNUF9MU0IoMSkgPSBbdGVtcDMsIHRlbXAxXQogICogICAgSU5fVEVNUF9MU0IoMikgPSBbaW40LCB0ZW1wMl0KICAqICAgIElOX1RFTVBfTFNCKDMpID0gW2luMywgaW4wXQotICogICAgSU5fVEVNUF9MU0IoNCkgPSBbaW4yLCBpbjFdICovCisgKiAgICBJTl9URU1QX0xTQig0KSA9IFtpbjIsIGluMV0KKyAqICAgIElOX1RFTVBfTFNCKDUpID0gW3JlcywgaW43XSAqLwogI2RlZmluZSBETUUxNzM3X1JFR19JTl9URU1QX0xTQihpeCkJKDB4ODQgKyAoaXgpKQotc3RhdGljIGNvbnN0IHU4IERNRTE3MzdfUkVHX0lOX0xTQltdID0gezMsIDQsIDQsIDMsIDIsIDAsIDB9Owotc3RhdGljIGNvbnN0IHU4IERNRTE3MzdfUkVHX0lOX0xTQl9TSExbXSA9IHs0LCA0LCAwLCAwLCAwLCAwLCA0fTsKK3N0YXRpYyBjb25zdCB1OCBETUUxNzM3X1JFR19JTl9MU0JbXSA9IHszLCA0LCA0LCAzLCAyLCAwLCAwLCA1fTsKK3N0YXRpYyBjb25zdCB1OCBETUUxNzM3X1JFR19JTl9MU0JfU0hMW10gPSB7NCwgNCwgMCwgMCwgMCwgMCwgNCwgNH07CiBzdGF0aWMgY29uc3QgdTggRE1FMTczN19SRUdfVEVNUF9MU0JbXSA9IHsxLCAyLCAxfTsKIHN0YXRpYyBjb25zdCB1OCBETUUxNzM3X1JFR19URU1QX0xTQl9TSExbXSA9IHs0LCA0LCAwfTsKIApAQCAtMTQzLDcgKzE0OCw3IEBACiAjZGVmaW5lIERNRTE3MzdfUkVHX0FMQVJNMQkJMHg0MQogI2RlZmluZSBETUUxNzM3X1JFR19BTEFSTTIJCTB4NDIKICNkZWZpbmUgRE1FMTczN19SRUdfQUxBUk0zCQkweDgzCi1zdGF0aWMgY29uc3QgdTggRE1FMTczN19CSVRfQUxBUk1fSU5bXSA9IHswLCAxLCAyLCAzLCA4LCAxNiwgMTd9Oworc3RhdGljIGNvbnN0IHU4IERNRTE3MzdfQklUX0FMQVJNX0lOW10gPSB7MCwgMSwgMiwgMywgOCwgMTYsIDE3LCAxOH07CiBzdGF0aWMgY29uc3QgdTggRE1FMTczN19CSVRfQUxBUk1fVEVNUFtdID0gezQsIDUsIDZ9Owogc3RhdGljIGNvbnN0IHU4IERNRTE3MzdfQklUX0FMQVJNX0ZBTltdID0gezEwLCAxMSwgMTIsIDEzLCAyMiwgMjN9OwogCkBAIC0xODgsNiArMTkzLDcgQEAKICNkZWZpbmUgSEFTX1BXTV9NSU4JCSgxIDw8IDQpCQkvKiBiaXQgNCAqLwogI2RlZmluZSBIQVNfRkFOKGl4KQkJKDEgPDwgKChpeCkgKyA1KSkJLyogYml0cyA1LTEwICovCiAjZGVmaW5lIEhBU19QV00oaXgpCQkoMSA8PCAoKGl4KSArIDExKSkJLyogYml0cyAxMS0xNiAqLworI2RlZmluZSBIQVNfSU43CQkJKDEgPDwgMTcpCQkvKiBiaXQgMTcgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEYXRhIHN0cnVjdHVyZXMgYW5kIG1hbmlwdWxhdGlvbiB0aGVyZW9mCkBAIC0yMTEsOSArMjE3LDkgQEAKIAl1MzIgaGFzX2ZlYXR1cmVzOwogCiAJLyogUmVnaXN0ZXIgdmFsdWVzICovCi0JdTE2IGluWzddOwotCXU4ICBpbl9taW5bN107Ci0JdTggIGluX21heFs3XTsKKwl1MTYgaW5bOF07CisJdTggIGluX21pbls4XTsKKwl1OCAgaW5fbWF4WzhdOwogCXMxNiB0ZW1wWzNdOwogCXM4ICB0ZW1wX21pblszXTsKIAlzOCAgdGVtcF9tYXhbM107CkBAIC0yNDUsNyArMjUxLDcgQEAKIHN0YXRpYyBjb25zdCBpbnQgSU5fTk9NSU5BTF9TQ0g1MDI3W10gPSB7NTAwMCwgMjI1MCwgMzMwMCwgMTEyNSwgMTEyNSwgMzMwMCwKIAkJCQkJIDMzMDB9Owogc3RhdGljIGNvbnN0IGludCBJTl9OT01JTkFMX1NDSDUxMjdbXSA9IHsyNTAwLCAyMjUwLCAzMzAwLCAxMTI1LCAxMTI1LCAzMzAwLAotCQkJCQkgMzMwMH07CisJCQkJCSAzMzAwLCAxNTAwfTsKICNkZWZpbmUgSU5fTk9NSU5BTCh0eXBlKQkoKHR5cGUpID09IHNjaDMxMXggPyBJTl9OT01JTkFMX1NDSDMxMXggOiBcCiAJCQkJICh0eXBlKSA9PSBzY2g1MDI3ID8gSU5fTk9NSU5BTF9TQ0g1MDI3IDogXAogCQkJCSAodHlwZSkgPT0gc2NoNTEyNyA/IElOX05PTUlOQUxfU0NINTEyNyA6IFwKQEAgLTU3OCw3ICs1ODQsNyBAQAogewogCXN0cnVjdCBkbWUxNzM3X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaXg7Ci0JdTggbHNiWzVdOworCXU4IGxzYls2XTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIApAQCAtNjAxLDYgKzYwNyw5IEBACiAJCQkvKiBWb2x0YWdlIGlucHV0cyBhcmUgc3RvcmVkIGFzIDE2IGJpdCB2YWx1ZXMgZXZlbgogCQkJICogdGhvdWdoIHRoZXkgaGF2ZSBvbmx5IDEyIGJpdHMgcmVzb2x1dGlvbi4gVGhpcyBpcwogCQkJICogdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIHRlbXAgaW5wdXRzLiAqLworCQkJaWYgKGl4ID09IDcgJiYgIShkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfSU43KSkgeworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJZGF0YS0+aW5baXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX0lOKGl4KSkgPDwgODsKIAkJCWRhdGEtPmluX21pbltpeF0gPSBkbWUxNzM3X3JlYWQoZGF0YSwKQEAgLTYzMywxMCArNjQyLDE2IEBACiAJCSAqIHdoaWNoIHRoZSByZWdpc3RlcnMgYXJlIHJlYWQgKE1TQiBmaXJzdCwgdGhlbiBMU0IpIGlzCiAJCSAqIGltcG9ydGFudCEgKi8KIAkJZm9yIChpeCA9IDA7IGl4IDwgQVJSQVlfU0laRShsc2IpOyBpeCsrKSB7CisJCQlpZiAoaXggPT0gNSAmJiAhKGRhdGEtPmhhc19mZWF0dXJlcyAmIEhBU19JTjcpKSB7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlsc2JbaXhdID0gZG1lMTczN19yZWFkKGRhdGEsCiAJCQkJCURNRTE3MzdfUkVHX0lOX1RFTVBfTFNCKGl4KSk7CiAJCX0KIAkJZm9yIChpeCA9IDA7IGl4IDwgQVJSQVlfU0laRShkYXRhLT5pbik7IGl4KyspIHsKKwkJCWlmIChpeCA9PSA3ICYmICEoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX0lONykpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWRhdGEtPmluW2l4XSB8PSAobHNiW0RNRTE3MzdfUkVHX0lOX0xTQltpeF1dIDw8CiAJCQkJCURNRTE3MzdfUkVHX0lOX0xTQl9TSExbaXhdKSAmIDB4ZjA7CiAJCX0KQEAgLTc2MCw3ICs3NzUsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFZvbHRhZ2Ugc3lzZnMgYXR0cmlidXRlcwotICogaXggPSBbMC01XQorICogaXggPSBbMC03XQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgU1lTX0lOX0lOUFVUCTAKQEAgLTE0MzcsNyArMTQ1Miw3IEBACiAgKiBTeXNmcyBkZXZpY2UgYXR0cmlidXRlIGRlZmluZXMgYW5kIHN0cnVjdHMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiBWb2x0YWdlcyAwLTYgKi8KKy8qIFZvbHRhZ2VzIDAtNyAqLwogCiAjZGVmaW5lIFNFTlNPUl9ERVZJQ0VfQVRUUl9JTihpeCkgXAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluIyNpeCMjX2lucHV0LCBTX0lSVUdPLCBcCkBAIC0xNDU2LDYgKzE0NzEsNyBAQAogU0VOU09SX0RFVklDRV9BVFRSX0lOKDQpOwogU0VOU09SX0RFVklDRV9BVFRSX0lOKDUpOwogU0VOU09SX0RFVklDRV9BVFRSX0lOKDYpOworU0VOU09SX0RFVklDRV9BVFRSX0lOKDcpOwogCiAvKiBUZW1wZXJhdHVyZXMgMS0zICovCiAKQEAgLTE1NzQsNyArMTU5MCw3IEBACiAgKiBjcmVhdGVkIHVuY29uZGl0aW9uYWxseS4gVGhlIGF0dHJpYnV0ZXMgdGhhdCBuZWVkIG1vZGlmaWNhdGlvbiBvZiB0aGVpcgogICogcGVybWlzc2lvbnMgYXJlIGNyZWF0ZWQgcmVhZC1vbmx5IGFuZCB3cml0ZSBwZXJtaXNzaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZAogICogb24gdGhlIGZseSB3aGVuIHJlcXVpcmVkICovCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZG1lMTczN19hdHRyW10gPXsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkbWUxNzM3X2F0dHJbXSA9IHsKIAkvKiBWb2x0YWdlcyAqLwogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWluLmRldl9hdHRyLmF0dHIsCkBAIC0xNjc5LDcgKzE2OTUsNyBAQAogfTsKIAogCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdCBob2xkcyB0ZW1wIHpvbmUgaHlzdGVyZXNpcyAgcmVsYXRlZCBhdHRyaWJ1dGVzLCB3aGljaAorLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3QgaG9sZHMgdGVtcCB6b25lIGh5c3RlcmVzaXMgcmVsYXRlZCBhdHRyaWJ1dGVzLCB3aGljaAogICogYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGNoaXBzLiBUaGUgZm9sbG93aW5nIGNoaXBzIHN1cHBvcnQgdGhlbToKICAqIERNRTE3MzcsIFNDSDMxMXggKi8KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkbWUxNzM3X3pvbmVfaHlzdF9hdHRyW10gPSB7CkBAIC0xNjkzLDYgKzE3MDksMjEgQEAKIAkuYXR0cnMgPSBkbWUxNzM3X3pvbmVfaHlzdF9hdHRyLAogfTsKIAorLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3QgaG9sZHMgdm9sdGFnZSBpbjcgcmVsYXRlZCBhdHRyaWJ1dGVzLCB3aGljaAorICogYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsIGNoaXBzLiBUaGUgZm9sbG93aW5nIGNoaXBzIHN1cHBvcnQgdGhlbToKKyAqIFNDSDUxMjcgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkbWUxNzM3X2luN19hdHRyW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luN19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luN19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luN19hbGFybS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRtZTE3MzdfaW43X2dyb3VwID0geworCS5hdHRycyA9IGRtZTE3MzdfaW43X2F0dHIsCit9OworCiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHMgaG9sZCB0aGUgUFdNIGF0dHJpYnV0ZXMsIHNvbWUgb2Ygd2hpY2ggYXJlIG9wdGlvbmFsLgogICogVGhlaXIgY3JlYXRpb24gZGVwZW5kcyBvbiB0aGUgY2hpcCBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGRldGVybWluZWQgZHVyaW5nCiAgKiBtb2R1bGUgbG9hZC4gKi8KQEAgLTE5ODQsNiArMjAxNSw5IEBACiAJaWYgKGRhdGEtPmhhc19mZWF0dXJlcyAmIEhBU19aT05FX0hZU1QpIHsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZkbWUxNzM3X3pvbmVfaHlzdF9ncm91cCk7CiAJfQorCWlmIChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfSU43KSB7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmZG1lMTczN19pbjdfZ3JvdXApOworCX0KIAlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfZ3JvdXApOwogCiAJaWYgKCFkYXRhLT5jbGllbnQpIHsKQEAgLTE5OTcsNDMgKzIwMzEsNTggQEAKIAlpbnQgZXJyLCBpeDsKIAogCS8qIENyZWF0ZSBhIG5hbWUgYXR0cmlidXRlIGZvciBJU0EgZGV2aWNlcyAqLwotCWlmICghZGF0YS0+Y2xpZW50ICYmCi0JICAgIChlcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGV2LT5rb2JqLCAmZGV2X2F0dHJfbmFtZS5hdHRyKSkpIHsKLQkJZ290byBleGl0OworCWlmICghZGF0YS0+Y2xpZW50KSB7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkZXYtPmtvYmosICZkZXZfYXR0cl9uYW1lLmF0dHIpOworCQlpZiAoZXJyKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0KIAl9CiAKIAkvKiBDcmVhdGUgc3RhbmRhcmQgc3lzZnMgYXR0cmlidXRlcyAqLwotCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZkbWUxNzM3X2dyb3VwKSkpIHsKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfZ3JvdXApOworCWlmIChlcnIpIHsKIAkJZ290byBleGl0X3JlbW92ZTsKIAl9CiAKIAkvKiBDcmVhdGUgY2hpcC1kZXBlbmRlbnQgc3lzZnMgYXR0cmlidXRlcyAqLwotCWlmICgoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1RFTVBfT0ZGU0VUKSAmJgotCSAgICAoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCi0JCQkJICAgICAgJmRtZTE3MzdfdGVtcF9vZmZzZXRfZ3JvdXApKSkgewotCQlnb3RvIGV4aXRfcmVtb3ZlOworCWlmIChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfVEVNUF9PRkZTRVQpIHsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCisJCQkJCSAmZG1lMTczN190ZW1wX29mZnNldF9ncm91cCk7CisJCWlmIChlcnIpIHsKKwkJCWdvdG8gZXhpdF9yZW1vdmU7CisJCX0KIAl9Ci0JaWYgKChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfVklEKSAmJgotCSAgICAoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCi0JCQkJICAgICAgJmRtZTE3MzdfdmlkX2dyb3VwKSkpIHsKLQkJZ290byBleGl0X3JlbW92ZTsKKwlpZiAoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1ZJRCkgeworCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfdmlkX2dyb3VwKTsKKwkJaWYgKGVycikgeworCQkJZ290byBleGl0X3JlbW92ZTsKKwkJfQogCX0KLQlpZiAoKGRhdGEtPmhhc19mZWF0dXJlcyAmIEhBU19aT05FMykgJiYKLQkgICAgKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLAotCQkJCSAgICAgICZkbWUxNzM3X3pvbmUzX2dyb3VwKSkpIHsKLQkJZ290byBleGl0X3JlbW92ZTsKKwlpZiAoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1pPTkUzKSB7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmZG1lMTczN196b25lM19ncm91cCk7CisJCWlmIChlcnIpIHsKKwkJCWdvdG8gZXhpdF9yZW1vdmU7CisJCX0KIAl9Ci0JaWYgKChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfWk9ORV9IWVNUKSAmJgotCSAgICAoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCi0JCQkJICAgICAgJmRtZTE3Mzdfem9uZV9oeXN0X2dyb3VwKSkpIHsKLQkJZ290byBleGl0X3JlbW92ZTsKKwlpZiAoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1pPTkVfSFlTVCkgeworCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3Mzdfem9uZV9oeXN0X2dyb3VwKTsKKwkJaWYgKGVycikgeworCQkJZ290byBleGl0X3JlbW92ZTsKKwkJfQorCX0KKwlpZiAoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX0lONykgeworCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmRtZTE3MzdfaW43X2dyb3VwKTsKKwkJaWYgKGVycikgeworCQkJZ290byBleGl0X3JlbW92ZTsKKwkJfQogCX0KIAogCS8qIENyZWF0ZSBmYW4gc3lzZnMgYXR0cmlidXRlcyAqLwogCWZvciAoaXggPSAwOyBpeCA8IEFSUkFZX1NJWkUoZG1lMTczN19mYW5fZ3JvdXApOyBpeCsrKSB7CiAJCWlmIChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfRkFOKGl4KSkgewotCQkJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwKLQkJCQkJCSZkbWUxNzM3X2Zhbl9ncm91cFtpeF0pKSkgeworCQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCisJCQkJCQkgJmRtZTE3MzdfZmFuX2dyb3VwW2l4XSk7CisJCQlpZiAoZXJyKSB7CiAJCQkJZ290byBleGl0X3JlbW92ZTsKIAkJCX0KIAkJfQpAQCAtMjA0MiwxNCArMjA5MSwxNyBAQAogCS8qIENyZWF0ZSBQV00gc3lzZnMgYXR0cmlidXRlcyAqLwogCWZvciAoaXggPSAwOyBpeCA8IEFSUkFZX1NJWkUoZG1lMTczN19wd21fZ3JvdXApOyBpeCsrKSB7CiAJCWlmIChkYXRhLT5oYXNfZmVhdHVyZXMgJiBIQVNfUFdNKGl4KSkgewotCQkJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwKLQkJCQkJCSZkbWUxNzM3X3B3bV9ncm91cFtpeF0pKSkgeworCQkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosCisJCQkJCQkgJmRtZTE3MzdfcHdtX2dyb3VwW2l4XSk7CisJCQlpZiAoZXJyKSB7CiAJCQkJZ290byBleGl0X3JlbW92ZTsKIAkJCX0KLQkJCWlmICgoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1BXTV9NSU4pICYmIGl4IDwgMyAmJgotCQkJICAgIChlcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGV2LT5rb2JqLAotCQkJCQlkbWUxNzM3X2F1dG9fcHdtX21pbl9hdHRyW2l4XSkpKSB7Ci0JCQkJZ290byBleGl0X3JlbW92ZTsKKwkJCWlmICgoZGF0YS0+aGFzX2ZlYXR1cmVzICYgSEFTX1BXTV9NSU4pICYmIChpeCA8IDMpKSB7CisJCQkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRldi0+a29iaiwKKwkJCQkJCWRtZTE3MzdfYXV0b19wd21fbWluX2F0dHJbaXhdKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCWdvdG8gZXhpdF9yZW1vdmU7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMjE4Niw3ICsyMjM4LDcgQEAKIAkJZGF0YS0+aGFzX2ZlYXR1cmVzIHw9IEhBU19aT05FMzsKIAkJYnJlYWs7CiAJY2FzZSBzY2g1MTI3OgotCQlkYXRhLT5oYXNfZmVhdHVyZXMgfD0gSEFTX0ZBTigyKSB8IEhBU19QV00oMik7CisJCWRhdGEtPmhhc19mZWF0dXJlcyB8PSBIQVNfRkFOKDIpIHwgSEFTX1BXTSgyKSB8IEhBU19JTjc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMjI3OSw4ICsyMzMxLDkgQEAKIAlkbWUxNzM3X3Npb19vdXRiKHNpb19jaXAsIDB4MDcsIDB4MGEpOwogCiAJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJ1bnRpbWUgcmVnaXN0ZXJzICovCi0JaWYgKCEoYWRkciA9IChkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MCkgPDwgOCkgfAotCQkgICAgICBkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MSkpKSB7CisJYWRkciA9IChkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MCkgPDwgOCkgfAorCQlkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MSk7CisJaWYgKCFhZGRyKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yMzYxLDEzICsyNDE0LDE1IEBACiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgRE1FMTczNyBjaGlwICovCi0JaWYgKChlcnIgPSBkbWUxNzM3X2luaXRfZGV2aWNlKGRldikpKSB7CisJZXJyID0gZG1lMTczN19pbml0X2RldmljZShkZXYpOworCWlmIChlcnIpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UuXG4iKTsKIAkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCS8qIENyZWF0ZSBzeXNmcyBmaWxlcyAqLwotCWlmICgoZXJyID0gZG1lMTczN19jcmVhdGVfZmlsZXMoZGV2KSkpIHsKKwllcnIgPSBkbWUxNzM3X2NyZWF0ZV9maWxlcyhkZXYpOworCWlmIChlcnIpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVzLlxuIik7CiAJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CkBAIC0yNDQ0LDkgKzI0OTksMTAgQEAKIAlkbWUxNzM3X3Npb19vdXRiKHNpb19jaXAsIDB4MDcsIDB4MGEpOwogCiAJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJ1bnRpbWUgcmVnaXN0ZXJzICovCi0JaWYgKCEoYmFzZV9hZGRyID0gKGRtZTE3Mzdfc2lvX2luYihzaW9fY2lwLCAweDYwKSA8PCA4KSB8Ci0JCQkgICBkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZG1lMTczNzogQmFzZSBhZGRyZXNzIG5vdCBzZXQuXG4iKTsKKwliYXNlX2FkZHIgPSAoZG1lMTczN19zaW9faW5iKHNpb19jaXAsIDB4NjApIDw8IDgpIHwKKwkJICAgICBkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MSk7CisJaWYgKCFiYXNlX2FkZHIpIHsKKwkJcHJfZXJyKCJCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yNDc0LDIxICsyNTMwLDIyIEBACiAJaWYgKGVycikKIAkJZ290byBleGl0OwogCi0JaWYgKCEocGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiZG1lMTczNyIsIGFkZHIpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImRtZTE3Mzc6IEZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UuXG4iKTsKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJkbWUxNzM3IiwgYWRkcik7CisJaWYgKCFwZGV2KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImRtZTE3Mzc6IEZhaWxlZCB0byBhZGQgZGV2aWNlIHJlc291cmNlICIKLQkJICAgICAgICIoZXJyID0gJWQpLlxuIiwgZXJyKTsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFkZCBkZXZpY2UgcmVzb3VyY2UgKGVyciA9ICVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCi0JaWYgKChlcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImRtZTE3Mzc6IEZhaWxlZCB0byBhZGQgZGV2aWNlIChlcnIgPSAlZCkuXG4iLAotCQkgICAgICAgZXJyKTsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWRkIGRldmljZSAoZXJyID0gJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKQEAgLTI1MTQsMTEgKzI1NzEsMTIgQEAKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCByZWdpb24gMHglMDR4LTB4JTA0eC5cbiIsCiAJCQkodW5zaWduZWQgc2hvcnQpcmVzLT5zdGFydCwKIAkJCSh1bnNpZ25lZCBzaG9ydClyZXMtPnN0YXJ0ICsgRE1FMTczN19FWFRFTlQgLSAxKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUJVU1k7Ci0gICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KIAotCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZG1lMTczN19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWUxNzM3X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X3JlbGVhc2VfcmVnaW9uOwogCX0KQEAgLTI1NjUsMTMgKzI2MjMsMTUgQEAKIAkJIGRhdGEtPnR5cGUgPT0gc2NoNTEyNyA/ICJTQ0g1MTI3IiA6ICJTQ0gzMTF4IiwgZGF0YS0+YWRkcik7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCi0JaWYgKChlcnIgPSBkbWUxNzM3X2luaXRfZGV2aWNlKGRldikpKSB7CisJZXJyID0gZG1lMTczN19pbml0X2RldmljZShkZXYpOworCWlmIChlcnIpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXZpY2UuXG4iKTsKIAkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCS8qIENyZWF0ZSBzeXNmcyBmaWxlcyAqLwotCWlmICgoZXJyID0gZG1lMTczN19jcmVhdGVfZmlsZXMoZGV2KSkpIHsKKwllcnIgPSBkbWUxNzM3X2NyZWF0ZV9maWxlcyhkZXYpOworCWlmIChlcnIpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGVzLlxuIik7CiAJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CkBAIC0yNjI4LDcgKzI2ODgsOCBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgc2hvcnQgYWRkcjsKIAotCWlmICgoZXJyID0gaTJjX2FkZF9kcml2ZXIoJmRtZTE3MzdfaTJjX2RyaXZlcikpKSB7CisJZXJyID0gaTJjX2FkZF9kcml2ZXIoJmRtZTE3MzdfaTJjX2RyaXZlcik7CisJaWYgKGVycikgewogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0yNjQxLDEyICsyNzAyLDE0IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmICgoZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkbWUxNzM3X2lzYV9kcml2ZXIpKSkgeworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZG1lMTczN19pc2FfZHJpdmVyKTsKKwlpZiAoZXJyKSB7CiAJCWdvdG8gZXhpdF9kZWxfaTJjX2RyaXZlcjsKIAl9CiAKIAkvKiBTZXRzIGdsb2JhbCBwZGV2IGFzIGEgc2lkZSBlZmZlY3QgKi8KLQlpZiAoKGVyciA9IGRtZTE3MzdfaXNhX2RldmljZV9hZGQoYWRkcikpKSB7CisJZXJyID0gZG1lMTczN19pc2FfZGV2aWNlX2FkZChhZGRyKTsKKwlpZiAoZXJyKSB7CiAJCWdvdG8gZXhpdF9kZWxfaXNhX2RyaXZlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZHM2MjAuYyBiL2RyaXZlcnMvaHdtb24vZHM2MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc5NTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9kczYyMC5jCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogIGRzNjIwLmMgLSBTdXBwb3J0IGZvciB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIHRoZXJtb3N0YXQgRFM2MjAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExIFJvbGFuZCBTdGlnZ2UgPHN0aWdnZUBhbnRjb20uZGU+CisgKgorICogIGJhc2VkIG9uIGRzMTYyMS5jIGJ5IENocmlzdGlhbiBXLiBadWNrc2Nod2VyZHQgIDx6YW55QHRyaXEubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2RzNjIwLmg+CisKKy8qCisgKiBNYW55IERTNjIwIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cKKyAqICAxNSAgIDE0ICAgMTMgICAxMiAgIDExICAgMTAgICAwOSAgICAwOAorICogfERvbmV8TlZCIHxUSEYgfFRMRiB8UjEgIHxSMCAgfEFVVE9DfDFTSE9UfAorICoKKyAqICAwNyAgIDA2ICAgMDUgICAwNCAgIDAzICAgMDIgICAwMSAgICAwMAorICogfFBPMiB8UE8xIHxBMiAgfEExICB8QTAgIHwgICAgfCAgICAgfCAgICAgfAorICovCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfRE9ORQkJMHg4MDAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfTlZCCQkweDQwMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19USEYJCTB4MjAwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1RMRgkJMHgxMDAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfUjEJCTB4MDgwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1IwCQkweDA0MDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19BVVRPQwkJMHgwMjAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfMVNIT1QJCTB4MDEwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1BPMgkJMHgwMDgwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfUE8xCQkweDAwNDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19BMgkJMHgwMDIwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfQTEJCTB4MDAxMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX0EwCQkweDAwMDgKKworLyogVGhlIERTNjIwIHJlZ2lzdGVycyAqLworc3RhdGljIGNvbnN0IHU4IERTNjIwX1JFR19URU1QWzNdID0geworCTB4QUEsCQkJLyogaW5wdXQsIHdvcmQsIFJPICovCisJMHhBMiwJCQkvKiBtaW4sIHdvcmQsIFJXICovCisJMHhBMCwJCQkvKiBtYXgsIHdvcmQsIFJXICovCit9OworCisjZGVmaW5lIERTNjIwX1JFR19DT05GCQkweEFDCS8qIHdvcmQsIFJXICovCisjZGVmaW5lIERTNjIwX0NPTV9TVEFSVAkJMHg1MQkvKiBubyBkYXRhICovCisjZGVmaW5lIERTNjIwX0NPTV9TVE9QCQkweDIyCS8qIG5vIGRhdGEgKi8KKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgZHM2MjBfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCXUxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWVzLCB3b3JkICovCit9OworCisvKgorICogIFRlbXBlcmF0dXJlIHJlZ2lzdGVycyBhcmUgd29yZC1zaXplZC4KKyAqICBEUzYyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KKyAqICB0aGUgU01CdXMgc3RhbmRhcmQuCisgKi8KK3N0YXRpYyBpbnQgZHM2MjBfcmVhZF90ZW1wKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3dhYjE2KHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZHM2MjBfd3JpdGVfdGVtcChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRzNjIwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRzNjIwX3BsYXRmb3JtX2RhdGEgKmRzNjIwX2luZm8gPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXUxNiBjb25mLCBuZXdfY29uZjsKKworCW5ld19jb25mID0gY29uZiA9CisJICAgIHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBEUzYyMF9SRUdfQ09ORikpOworCisJLyogc3dpdGNoIHRvIGNvbnRpbnVvdXMgY29udmVyc2lvbiBtb2RlICovCisJbmV3X2NvbmYgJj0gfkRTNjIwX1JFR19DT05GSUdfMVNIT1Q7CisJLyogYWxyZWFkeSBoaWdoIGF0IHBvd2VyLW9uLCBidXQgZG9uJ3QgdHJ1c3QgdGhlIEJJT1MhICovCisJbmV3X2NvbmYgfD0gRFM2MjBfUkVHX0NPTkZJR19QTzI7CisJLyogdGhlcm1vc3RhdCBtb2RlIGFjY29yZGluZyB0byBwbGF0Zm9ybSBkYXRhICovCisJaWYgKGRzNjIwX2luZm8gJiYgZHM2MjBfaW5mby0+cG9tb2RlID09IDEpCisJCW5ld19jb25mICY9IH5EUzYyMF9SRUdfQ09ORklHX1BPMTsgLyogUE9fTE9XICovCisJZWxzZSBpZiAoZHM2MjBfaW5mbyAmJiBkczYyMF9pbmZvLT5wb21vZGUgPT0gMikKKwkJbmV3X2NvbmYgfD0gRFM2MjBfUkVHX0NPTkZJR19QTzE7IC8qIFBPX0hJR0ggKi8KKwllbHNlCisJCW5ld19jb25mICY9IH5EUzYyMF9SRUdfQ09ORklHX1BPMjsgLyogYWx3YXlzIGxvdyAqLworCS8qIHdpdGggaGlnaGVzdCBwcmVjaXNpb24gKi8KKwluZXdfY29uZiB8PSBEUzYyMF9SRUdfQ09ORklHX1IxIHwgRFM2MjBfUkVHX0NPTkZJR19SMDsKKworCWlmIChjb25mICE9IG5ld19jb25mKQorCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYsCisJCQkJCSAgc3dhYjE2KG5ld19jb25mKSk7CisKKwkvKiBzdGFydCBjb252ZXJzaW9uICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBEUzYyMF9DT01fU1RBUlQpOworfQorCitzdGF0aWMgc3RydWN0IGRzNjIwX2RhdGEgKmRzNjIwX3VwZGF0ZV9jbGllbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqcmV0ID0gZGF0YTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQorCSAgICB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGk7CisJCWludCByZXM7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBkczYyMCB1cGRhdGVcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPnRlbXApOyBpKyspIHsKKwkJCXJlcyA9IGRzNjIwX3JlYWRfdGVtcChjbGllbnQsCisJCQkJCSAgICAgIERTNjIwX1JFR19URU1QW2ldKTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJcmV0ID0gRVJSX1BUUihyZXMpOworCQkJCWdvdG8gYWJvcnQ7CisJCQl9CisKKwkJCWRhdGEtPnRlbXBbaV0gPSByZXM7CisJCX0KKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorYWJvcnQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGEgPSBkczYyMF91cGRhdGVfY2xpZW50KGRldik7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdIC8gOCkgKiA2MjUpIC8gMTApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXM7CisJbG9uZyB2YWw7CisKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJlcyA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJdmFsID0gKHZhbCAqIDEwIC8gNjI1KSAqIDg7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcFthdHRyLT5pbmRleF0gPSB2YWw7CisJZHM2MjBfd3JpdGVfdGVtcChjbGllbnQsIERTNjIwX1JFR19URU1QW2F0dHItPmluZGV4XSwKKwkJCSBkYXRhLT50ZW1wW2F0dHItPmluZGV4XSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YSA9IGRzNjIwX3VwZGF0ZV9jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXUxNiBjb25mLCBuZXdfY29uZjsKKwlpbnQgcmVzOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwkvKiByZXNldCBhbGFybXMgaWYgbmVjZXNzYXJ5ICovCisJcmVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJY29uZiA9IHN3YWIxNihyZXMpOworCW5ld19jb25mID0gY29uZjsKKwluZXdfY29uZiAmPSB+YXR0ci0+aW5kZXg7CisJaWYgKGNvbmYgIT0gbmV3X2NvbmYpIHsKKwkJcmVzID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GLAorCQkJCQkJc3dhYjE2KG5ld19jb25mKSk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY29uZiAmIGF0dHItPmluZGV4KSk7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcCwgc2V0X3RlbXAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQkJICBEUzYyMF9SRUdfQ09ORklHX1RMRik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgRFM2MjBfUkVHX0NPTkZJR19USEYpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZHM2MjBfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRzNjIwX2dyb3VwID0geworCS5hdHRycyA9IGRzNjIwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGRzNjIwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGE7CisJaW50IGVycjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHM2MjBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogSW5pdGlhbGl6ZSB0aGUgRFM2MjAgY2hpcCAqLworCWRzNjIwX2luaXRfY2xpZW50KGNsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmRzNjIwX2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAidGVtcGVyYXR1cmUgc2Vuc29yIGZvdW5kXG4iKTsKKworCXJldHVybiAwOworCitleGl0X3JlbW92ZV9maWxlczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZkczYyMF9ncm91cCk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHM2MjBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRzNjIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZHM2MjBfZ3JvdXApOworCisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGRzNjIwX2lkW10gPSB7CisJeyJkczYyMCIsIDB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZHM2MjBfaWQpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHM2MjBfZHJpdmVyID0geworCS5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJkczYyMCIsCisJfSwKKwkucHJvYmUgPSBkczYyMF9wcm9iZSwKKwkucmVtb3ZlID0gZHM2MjBfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGRzNjIwX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHM2MjBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHM2MjBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzNjIwX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHM2MjBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiUm9sYW5kIFN0aWdnZSA8c3RpZ2dlQGFudGNvbS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRFM2MjAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGRzNjIwX2luaXQpOworbW9kdWxlX2V4aXQoZHM2MjBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2VtYzE0MDMuYyBiL2RyaXZlcnMvaHdtb24vZW1jMTQwMy5jCmluZGV4IDhkZWUzZjMuLjVkZWE5ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZW1jMTQwMy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZW1jMTQwMy5jCkBAIC0yNjksMjMgKzI2OSwzMCBAQAogCQkJc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewogCWludCBpZDsKLQkvKiBDaGVjayBpZiB0aGVybWFsIGNoaXAgaXMgU01TQyBhbmQgRU1DMTQwMyAqLworCS8qIENoZWNrIGlmIHRoZXJtYWwgY2hpcCBpcyBTTVNDIGFuZCBFTUMxNDAzIG9yIEVNQzE0MjMgKi8KIAogCWlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVEhFUk1BTF9TTVNDX0lEX1JFRyk7CiAJaWYgKGlkICE9IDB4NWQpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBUSEVSTUFMX1BJRF9SRUcpOworCXN3aXRjaCAoaWQpIHsKKwljYXNlIDB4MjE6CisJCXN0cmxjcHkoaW5mby0+dHlwZSwgImVtYzE0MDMiLCBJMkNfTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisJY2FzZSAweDIzOgorCQlzdHJsY3B5KGluZm8tPnR5cGUsICJlbWMxNDIzIiwgSTJDX05BTUVfU0laRSk7CisJCWJyZWFrOwogCS8qIE5vdGU6IDB4MjUgaXMgdGhlIDE0MDQgd2hpY2ggaXMgdmVyeSBzaW1pbGFyIGFuZCB0aGlzCiAJICAgZHJpdmVyIGNvdWxkIGJlIGV4dGVuZGVkICovCi0JaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBUSEVSTUFMX1BJRF9SRUcpOwotCWlmIChpZCAhPSAweDIxKQorCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCWlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgVEhFUk1BTF9SRVZJU0lPTl9SRUcpOwogCWlmIChpZCAhPSAweDAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN0cmxjcHkoaW5mby0+dHlwZSwgImVtYzE0MDMiLCBJMkNfTkFNRV9TSVpFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQyLDYgKzM0OSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBlbWMxNDAzX2lkdGFibGVbXSA9IHsKIAl7ICJlbWMxNDAzIiwgMCB9LAorCXsgImVtYzE0MjMiLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGVtYzE0MDNfaWR0YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IDUyNWEwMGIuLjkyZjk0OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCisrKyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCkBAIC0yOCw2ICsyOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTMwOSw3ICsxMzExLDcgQEAKIAogCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZjcxODA1Zl9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IE91dCBvZiBtZW1vcnlcbiIpOworCQlwcl9lcnIoIk91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNDUxLDcgKzE0NTMsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTQ2MiwyMiArMTQ2NCwyMCBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGY3MTgwNWZfc2lvX2RhdGEpKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMTUxNiwzMCArMTUxNiwyNyBAQAogCQlzaW9fZGF0YS0+Zm5zZWwxID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19GTlNFTDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZSwgIgotCQkgICAgICAgInNraXBwaW5nXG4iKTsKKwkJcHJfaW5mbygiVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZSwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJc3VwZXJpb19zZWxlY3Qoc2lvYWRkciwgRjcxODA1Rl9MRF9IV00pOwogCWlmICghKHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRU5BQkxFKSAmIDB4MDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBEZXZpY2Ugbm90IGFjdGl2YXRlZCwgIgotCQkgICAgICAgInNraXBwaW5nXG4iKTsKKwkJcHJfd2FybigiRGV2aWNlIG5vdCBhY3RpdmF0ZWQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCSphZGRyZXNzID0gc3VwZXJpb19pbncoc2lvYWRkciwgU0lPX1JFR19BRERSKTsKIAlpZiAoKmFkZHJlc3MgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkJhc2UgYWRkcmVzcyBub3Qgc2V0LCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAJKmFkZHJlc3MgJj0gfihSRUdJT05fTEVOR1RIIC0gMSk7CS8qIElnbm9yZSAzIExTQiAqLwogCiAJZXJyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICV1XG4iLAotCSAgICAgICBuYW1lc1tzaW9fZGF0YS0+a2luZF0sICphZGRyZXNzLAotCSAgICAgICBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVlJFVikpOworCXByX2luZm8oIkZvdW5kICVzIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAldVxuIiwKKwkJbmFtZXNbc2lvX2RhdGEtPmtpbmRdLCAqYWRkcmVzcywKKwkJc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKIAogZXhpdDoKIAlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMgYi9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKaW5kZXggNzVhZmIzYi4uM2Y0OWRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwpAQCAtMTgsNiArMTgsOCBAQAogICogICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTg2NSw4ICs4NjcsNyBAQAogewogCS8qIERvbid0IHN0ZXAgb24gb3RoZXIgZHJpdmVycycgSS9PIHNwYWNlIGJ5IGFjY2lkZW50ICovCiAJaWYgKCFyZXF1ZXN0X211eGVkX3JlZ2lvbihiYXNlLCAyLCBEUlZOQU1FKSkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCi0JCQkJYmFzZSk7CisJCXByX2VycigiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLCBiYXNlKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTIxOTIsNyArMjE5Myw3IEBACiAKIAlkZXZpZCA9IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfTUFOSUQpOwogCWlmIChkZXZpZCAhPSBTSU9fRklOVEVLX0lEKSB7Ci0JCXByX2RlYnVnKERSVk5BTUUgIjogTm90IGEgRmludGVrIGRldmljZVxuIik7CisJCXByX2RlYnVnKCJOb3QgYSBGaW50ZWsgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTIyMTUsOCArMjIxNiw4IEBACiAJCXNpb19kYXRhLT50eXBlID0gZjgwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlOiAlMDR4XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGludClkZXZpZCk7CisJCXByX2luZm8oIlVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2U6ICUwNHhcbiIsCisJCQkodW5zaWduZWQgaW50KWRldmlkKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KQEAgLTIyMjcsMjEgKzIyMjgsMjEgQEAKIAkJc3VwZXJpb19zZWxlY3Qoc2lvYWRkciwgU0lPX0Y3MTg4MkZHX0xEX0hXTSk7CiAKIAlpZiAoIShzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSkgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRGV2aWNlIG5vdCBhY3RpdmF0ZWRcbiIpOworCQlwcl93YXJuKCJEZXZpY2Ugbm90IGFjdGl2YXRlZFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAkqYWRkcmVzcyA9IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfQUREUik7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEJhc2UgYWRkcmVzcyBub3Qgc2V0XG4iKTsKKwkJcHJfd2FybigiQmFzZSBhZGRyZXNzIG5vdCBzZXRcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQogCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kICVzIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAlZFxuIiwKKwlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjeCwgcmV2aXNpb24gJWRcbiIsCiAJCWY3MTg4MmZnX25hbWVzW3Npb19kYXRhLT50eXBlXSwJKHVuc2lnbmVkIGludCkqYWRkcmVzcywKIAkJKGludClzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVlJFVikpOwogZXhpdDoKQEAgLTIyNzAsMjAgKzIyNzEsMjAgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGY3MTg4MmZnX3BkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShmNzE4ODJmZ19wZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmNzE4ODJmZ19zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoZjcxODgyZmdfcGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jIGIvZHJpdmVycy9od21vbi9mc2NobWQuYwppbmRleCBkNGQ0Y2E2Li5hYTZkOGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgREVGSU5FX01VVEVYKHdhdGNoZG9nX211dGV4KTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCkBAIC04NTAsNyArODQ5LDcgQEAKIAogc3RhdGljIGxvbmcgd2F0Y2hkb2dfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwlzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKIAkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CiAJCQkJV0RJT0ZfQ0FSRFJFU0VULAogCQkuaWRlbnRpdHkgPSAiRlNDIHdhdGNoZG9nIgpAQCAtODU4LDcgKzg1Nyw2IEBACiAJaW50IGksIHJldCA9IDA7CiAJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCi0JbXV0ZXhfbG9jaygmd2F0Y2hkb2dfbXV0ZXgpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgogCQlpZGVudC5maXJtd2FyZV92ZXJzaW9uID0gZGF0YS0+cmV2aXNpb247CkBAIC05MTUsNyArOTEzLDYgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PVFRZOwogCX0KLQltdXRleF91bmxvY2soJndhdGNoZG9nX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2hwX2FjY2VsLmMgYi9kcml2ZXJzL2h3bW9uL2hwX2FjY2VsLmMKaW5kZXggYTU2YTc4NC4uM2QyMWZhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYwpAQCAtMjAsNiArMjAsOCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CkBAIC0xNDcsNyArMTQ5LDcgQEAKIHN0YXRpYyBpbnQgbGlzM2x2MDJkX2RtaV9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWkpCiB7CiAJbGlzM19kZXYuYWMgPSAqKCh1bmlvbiBheGlzX2NvbnZlcnNpb24gKilkbWktPmRyaXZlcl9kYXRhKTsKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGhhcmR3YXJlIHR5cGUgJXMgZm91bmQuXG4iLCBkbWktPmlkZW50KTsKKwlwcl9pbmZvKCJoYXJkd2FyZSB0eXBlICVzIGZvdW5kXG4iLCBkbWktPmlkZW50KTsKIAogCXJldHVybiAxOwogfQpAQCAtMzAzLDExICszMDUsMTAgQEAKIAogCS8qIElmIHBvc3NpYmxlIHVzZSBhICJzdGFuZGFyZCIgYXhlcyBvcmRlciAqLwogCWlmIChsaXMzX2Rldi5hYy54ICYmIGxpczNfZGV2LmFjLnkgJiYgbGlzM19kZXYuYWMueikgewotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IFVzaW5nIGN1c3RvbSBheGVzICVkLCVkLCVkXG4iLAotCQkgICAgICAgbGlzM19kZXYuYWMueCwgbGlzM19kZXYuYWMueSwgbGlzM19kZXYuYWMueik7CisJCXByX2luZm8oIlVzaW5nIGN1c3RvbSBheGVzICVkLCVkLCVkXG4iLAorCQkJbGlzM19kZXYuYWMueCwgbGlzM19kZXYuYWMueSwgbGlzM19kZXYuYWMueik7CiAJfSBlbHNlIGlmIChkbWlfY2hlY2tfc3lzdGVtKGxpczNsdjAyZF9kbWlfaWRzKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogbGFwdG9wIG1vZGVsIHVua25vd24sICIKLQkJCQkgInVzaW5nIGRlZmF1bHQgYXhlcyBjb25maWd1cmF0aW9uXG4iKTsKKwkJcHJfaW5mbygibGFwdG9wIG1vZGVsIHVua25vd24sIHVzaW5nIGRlZmF1bHQgYXhlcyBjb25maWd1cmF0aW9uXG4iKTsKIAkJbGlzM19kZXYuYWMgPSBsaXMzbHYwMmRfYXhpc19ub3JtYWw7CiAJfQogCkBAIC0zODUsNyArMzg2LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIiBkcml2ZXIgbG9hZGVkLlxuIik7CisJcHJfaW5mbygiZHJpdmVyIGxvYWRlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCmluZGV4IDJiMmNhMTYuLjI1ODJiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi12aWQuYwpAQCAtMjIsNiArMjIsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CkBAIC0xNDYsOCArMTQ4LDggQEAKIAkJcmV0dXJuKHZhbCA+IDB4NzcgPyAwIDogKDE1MDAwMDAgLSAodmFsICogMTI1MDApICsgNTAwKSAvIDEwMDApOwogCWRlZmF1bHQ6CQkvKiByZXBvcnQgMCBmb3IgdW5rbm93biAqLwogCQlpZiAodnJtKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHdtb24tdmlkOiBSZXF1ZXN0ZWQgdW5zdXBwb3J0ZWQgIgotCQkJICAgICAgICJWUk0gdmVyc2lvbiAoJXUpXG4iLCAodW5zaWduZWQgaW50KXZybSk7CisJCQlwcl93YXJuKCJSZXF1ZXN0ZWQgdW5zdXBwb3J0ZWQgVlJNIHZlcnNpb24gKCV1KVxuIiwKKwkJCQkodW5zaWduZWQgaW50KXZybSk7CiAJCXJldHVybiAwOwogCX0KIH0KQEAgLTI0Niw4ICsyNDgsNyBAQAogCX0KIAl2cm1fcmV0ID0gZmluZF92cm0oZWZmX2ZhbWlseSwgZWZmX21vZGVsLCBlZmZfc3RlcHBpbmcsIGMtPng4Nl92ZW5kb3IpOwogCWlmICh2cm1fcmV0ID09IDApCi0JCXByaW50ayhLRVJOX0lORk8gImh3bW9uLXZpZDogVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyICIKLQkJICAgICAgICJ4ODYgQ1BVXG4iKTsKKwkJcHJfaW5mbygiVW5rbm93biBWUk0gdmVyc2lvbiBvZiB5b3VyIHg4NiBDUFVcbiIpOwogCXJldHVybiB2cm1fcmV0OwogfQogCkBAIC0yNTUsNyArMjU2LDcgQEAKICNlbHNlCiB1OCB2aWRfd2hpY2hfdnJtKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaHdtb24tdmlkOiBVbmtub3duIFZSTSB2ZXJzaW9uIG9mIHlvdXIgQ1BVXG4iKTsKKwlwcl9pbmZvKCJVbmtub3duIFZSTSB2ZXJzaW9uIG9mIHlvdXIgQ1BVXG4iKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi5jIGIvZHJpdmVycy9od21vbi9od21vbi5jCmluZGV4IDI5ZWE2NzUuLmE2MWU3ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKQEAgLTEwLDYgKzEwLDggQEAKICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTExOSw3ICsxMjEsNyBAQAogCiAJaHdtb25fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJod21vbiIpOwogCWlmIChJU19FUlIoaHdtb25fY2xhc3MpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaHdtb24uYzogY291bGRuJ3QgY3JlYXRlIHN5c2ZzIGNsYXNzXG4iKTsKKwkJcHJfZXJyKCJjb3VsZG4ndCBjcmVhdGUgc3lzZnMgY2xhc3NcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihod21vbl9jbGFzcyk7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1hZW0uYyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKaW5kZXggZWFlZTU0Ni4uYmM2ZTJhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1hZW0uYworKysgYi9kcml2ZXJzL2h3bW9uL2libWFlbS5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaXBtaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CkBAIC0xMDkwLDcgKzEwOTIsNyBAQAogCiAJcmVzID0gZHJpdmVyX3JlZ2lzdGVyKCZhZW1fZHJpdmVyLmRyaXZlcik7CiAJaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIGFlbSBkcml2ZXJcbiIpOworCQlwcl9lcnIoIkNhbid0IHJlZ2lzdGVyIGFlbSBkcml2ZXJcbiIpOwogCQlyZXR1cm4gcmVzOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pdDg3LmMgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwppbmRleCBhNDI4YTkyLi4zMTZiNjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2l0ODcuYworKysgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwpAQCAtMzgsNiArMzgsOCBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xNTcwLDI2ICsxNTcyLDI1IEBACiAJY2FzZSAweGZmZmY6CS8qIE5vIGRldmljZSBhdCBhbGwgKi8KIAkJZ290byBleGl0OwogCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKERSVk5BTUUgIjogVW5zdXBwb3J0ZWQgY2hpcCAoREVWSUQ9MHgleClcbiIsCi0JCQkgY2hpcF90eXBlKTsKKwkJcHJfZGVidWcoIlVuc3VwcG9ydGVkIGNoaXAgKERFVklEPTB4JXgpXG4iLCBjaGlwX3R5cGUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJc3VwZXJpb19zZWxlY3QoUE1FKTsKIAlpZiAoIShzdXBlcmlvX2luYihJVDg3X0FDVF9SRUcpICYgMHgwMSkpIHsKLQkJcHJfaW5mbygiaXQ4NzogRGV2aWNlIG5vdCBhY3RpdmF0ZWQsIHNraXBwaW5nXG4iKTsKKwkJcHJfaW5mbygiRGV2aWNlIG5vdCBhY3RpdmF0ZWQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCSphZGRyZXNzID0gc3VwZXJpb19pbncoSVQ4N19CQVNFX1JFRykgJiB+KElUODdfRVhURU5UIC0gMSk7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJfaW5mbygiaXQ4NzogQmFzZSBhZGRyZXNzIG5vdCBzZXQsIHNraXBwaW5nXG4iKTsKKwkJcHJfaW5mbygiQmFzZSBhZGRyZXNzIG5vdCBzZXQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IDA7CiAJc2lvX2RhdGEtPnJldmlzaW9uID0gc3VwZXJpb19pbmIoREVWUkVWKSAmIDB4MGY7Ci0JcHJfaW5mbygiaXQ4NzogRm91bmQgSVQlMDR4RiBjaGlwIGF0IDB4JXgsIHJldmlzaW9uICVkXG4iLAorCXByX2luZm8oIkZvdW5kIElUJTA0eEYgY2hpcCBhdCAweCV4LCByZXZpc2lvbiAlZFxuIiwKIAkJY2hpcF90eXBlLCAqYWRkcmVzcywgc2lvX2RhdGEtPnJldmlzaW9uKTsKIAogCS8qIGluOCAoVmJhdCkgaXMgYWx3YXlzIGludGVybmFsICovCkBAIC0xNjE1LDcgKzE2MTYsNyBAQAogCQl9IGVsc2UgewogCQkJLyogV2UgbmVlZCBhdCBsZWFzdCA0IFZJRCBwaW5zICovCiAJCQlpZiAocmVnICYgMHgwZikgewotCQkJCXByX2luZm8oIml0ODc6IFZJRCBpcyBkaXNhYmxlZCAocGlucyB1c2VkIGZvciBHUElPKVxuIik7CisJCQkJcHJfaW5mbygiVklEIGlzIGRpc2FibGVkIChwaW5zIHVzZWQgZm9yIEdQSU8pXG4iKTsKIAkJCQlzaW9fZGF0YS0+c2tpcF92aWQgPSAxOwogCQkJfQogCQl9CkBAIC0xNjUxLDcgKzE2NTIsNyBAQAogCQlpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzIwICYmICEocmVnICYgKDEgPDwgMSkpKSB7CiAJCQlyZWcgfD0gKDEgPDwgMSk7CiAJCQlzdXBlcmlvX291dGIoSVQ4N19TSU9fUElOWDJfUkVHLCByZWcpOwotCQkJcHJfbm90aWNlKCJpdDg3OiBSb3V0aW5nIGludGVybmFsIFZDQ0ggdG8gaW43XG4iKTsKKwkJCXByX25vdGljZSgiUm91dGluZyBpbnRlcm5hbCBWQ0NIIHRvIGluN1xuIik7CiAJCX0KIAkJaWYgKHJlZyAmICgxIDw8IDApKQogCQkJc2lvX2RhdGEtPmludGVybmFsIHw9ICgxIDw8IDApOwpAQCAtMTY2MSw3ICsxNjYyLDcgQEAKIAkJc2lvX2RhdGEtPmJlZXBfcGluID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fQkVFUF9QSU5fUkVHKSAmIDB4M2Y7CiAJfQogCWlmIChzaW9fZGF0YS0+YmVlcF9waW4pCi0JCXByX2luZm8oIml0ODc6IEJlZXBpbmcgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcHJfaW5mbygiQmVlcGluZyBpcyBzdXBwb3J0ZWRcbiIpOwogCiAJLyogRGlzYWJsZSBzcGVjaWZpYyBmZWF0dXJlcyBiYXNlZCBvbiBETUkgc3RyaW5ncyAqLwogCWJvYXJkX3ZlbmRvciA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX1ZFTkRPUik7CkBAIC0xNjc1LDggKzE2NzYsNyBAQAogCQkJICAgdGhlIFBXTTIgZHV0eSBjeWNsZSwgc28gd2UgZGlzYWJsZSBpdC4KIAkJCSAgIEkgdXNlIHRoZSBib2FyZCBuYW1lIHN0cmluZyBhcyB0aGUgdHJpZ2dlciBpbiBjYXNlCiAJCQkgICB0aGUgc2FtZSBib2FyZCBpcyBldmVyIHVzZWQgaW4gb3RoZXIgc3lzdGVtcy4gKi8KLQkJCXByX2luZm8oIml0ODc6IERpc2FibGluZyBwd20yIGR1ZSB0byAiCi0JCQkJImhhcmR3YXJlIGNvbnN0cmFpbnRzXG4iKTsKKwkJCXByX2luZm8oIkRpc2FibGluZyBwd20yIGR1ZSB0byBoYXJkd2FyZSBjb25zdHJhaW50c1xuIik7CiAJCQlzaW9fZGF0YS0+c2tpcF9wd20gPSAoMSA8PCAxKTsKIAkJfQogCX0KQEAgLTIxODksMjggKzIxODksMjYgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgc2lvX2RhdGEsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXQ4N19zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jIGIvZHJpdmVycy9od21vbi9saXMzbHYwMmQuYwppbmRleCAwY2VlNzNhLi4xYjY3NGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtODYwLDggKzg2Miw3IEBACiAJCQkJCShwLT5pcnFfZmxhZ3MyICYgSVJRRl9UUklHR0VSX01BU0spLAogCQkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKLQkJCQkiTm8gc2Vjb25kIElSUS4gTGltaXRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKKwkJCXByX2VycigiTm8gc2Vjb25kIElSUS4gTGltaXRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKIAl9CiB9CiAKQEAgLTg3OSw3ICs4ODAsNyBAQAogCiAJc3dpdGNoIChkZXYtPndob2FtaSkgewogCWNhc2UgV0FJXzEyQjoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiAxMiBiaXRzIHNlbnNvciBmb3VuZFxuIik7CisJCXByX2luZm8oIjEyIGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKIAkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF8xMjsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAyMDQ4OwogCQlkZXYtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfMTJCOwpAQCAtODkwLDcgKzg5MSw3IEBACiAJCWRldi0+cmVnc19zaXplID0gQVJSQVlfU0laRShsaXMzX3dhaTEyX3JlZ3MpOwogCQlicmVhazsKIAljYXNlIFdBSV84QjoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiA4IGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKKwkJcHJfaW5mbygiOCBiaXRzIHNlbnNvciBmb3VuZFxuIik7CiAJCWRldi0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAxMjg7CiAJCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKQEAgLTkwMSw3ICs5MDIsNyBAQAogCQlkZXYtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWk4X3JlZ3MpOwogCQlicmVhazsKIAljYXNlIFdBSV8zREM6Ci0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogOCBiaXRzIDNEQyBzZW5zb3IgZm91bmRcbiIpOworCQlwcl9pbmZvKCI4IGJpdHMgM0RDIHNlbnNvciBmb3VuZFxuIik7CiAJCWRldi0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAxMjg7CiAJCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKQEAgLTkxMCw4ICs5MTEsNyBAQAogCQlkZXYtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV84QjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCi0JCQkiOiB1bmtub3duIHNlbnNvciB0eXBlIDB4JVhcbiIsIGRldi0+d2hvYW1pKTsKKwkJcHJfZXJyKCJ1bmtub3duIHNlbnNvciB0eXBlIDB4JVhcbiIsIGRldi0+d2hvYW1pKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05MzUsNyArOTM1LDcgQEAKIAl9CiAKIAlpZiAobGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSgpKQotCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogam95c3RpY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJqb3lzdGljayBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCiAJLyogcGFzc2luZyBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIGlzIHB1cmVseSBvcHRpb25hbCBhbmQgb25seQogCSAqIHVzZWQgYnkgdGhlIFNQSSB0cmFuc3BvcnQgbGF5ZXIgYXQgdGhlIG1vbWVudCAqLwpAQCAtOTU3LDggKzk1Nyw3IEBACiAKIAkvKiBiYWlsIGlmIHdlIGRpZCBub3QgZ2V0IGFuIElSUSBmcm9tIHRoZSBidXMgbGF5ZXIgKi8KIAlpZiAoIWRldi0+aXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRQotCQkJIjogTm8gSVJRLiBEaXNhYmxpbmcgL2Rldi9mcmVlZmFsbFxuIik7CisJCXByX2VycigiTm8gSVJRLiBEaXNhYmxpbmcgL2Rldi9mcmVlZmFsbFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtOTg1LDEyICs5ODQsMTIgQEAKIAkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiQ2Fubm90IGdldCBJUlFcbiIpOworCQlwcl9lcnIoIkNhbm5vdCBnZXQgSVJRXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG1pc2NfcmVnaXN0ZXIoJmxpczNsdjAyZF9taXNjX2RldmljZSkpCi0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2VycigibWlzY19yZWdpc3RlciBmYWlsZWRcbiIpOwogb3V0OgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTcwLmMgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwppbmRleCBmZDEwOGNmLi4zYjg0ZmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwpAQCAtMjQsNiArMjQsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNjcsOCArNjksNyBAQAogCSAqLwogCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBOVUxMLCAwLCAmcnhidWZbMF0sIDIpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJInNwaV93cml0ZV90aGVuX3JlYWQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlwcl93YXJuKCJzcGlfd3JpdGVfdGhlbl9yZWFkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQogCXJhdyA9IChyeGJ1ZlswXSA8PCA4KSArIHJ4YnVmWzFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwppbmRleCA3MmZmMmM0Li40Y2IyNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzguYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpAQCAtMTksNiArMTksOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTg1OCw3ICs4NjAsNyBAQAogCSAqIGluZGl2aWR1YWxseSBmb3IgdGhlIHByb2JpbmcgcGhhc2UuICovCiAJZm9yIChwb3J0ID0gYWRkcmVzczsgcG9ydCA8IGFkZHJlc3MgKyBMTTc4X0VYVEVOVDsgcG9ydCsrKSB7CiAJCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydCwgMSwgImxtNzgiKSkgewotCQkJcHJfZGVidWcoImxtNzg6IEZhaWxlZCB0byByZXF1ZXN0IHBvcnQgMHgleFxuIiwgcG9ydCk7CisJCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIHJlcXVlc3QgcG9ydCAweCV4XG4iLCBwb3J0KTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogCX0KQEAgLTkyMCw3ICs5MjIsNyBAQAogCQlmb3VuZCA9IDE7CiAKIAlpZiAoZm91bmQpCi0JCXByX2luZm8oImxtNzg6IEZvdW5kIGFuICVzIGNoaXAgYXQgJSN4XG4iLAorCQlwcl9pbmZvKCJGb3VuZCBhbiAlcyBjaGlwIGF0ICUjeFxuIiwKIAkJCXZhbCAmIDB4ODAgPyAiTE03OSIgOiAiTE03OCIsIChpbnQpYWRkcmVzcyk7CiAKICByZWxlYXNlOgpAQCAtOTQyLDIxICs5NDQsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJsbTc4IiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAibG03ODogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImxtNzg6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsbTc4OiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IDQ1NDZkODIuLjFhNmRmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC0xLDEzICsxLDkgQEAKIC8qCi0gKiBsbTk1MjQxLmMgLSBQYXJ0IG9mIGxtX3NlbnNvcnMsIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBoYXJkd2FyZQotICogICAgICAgICAgICAgbW9uaXRvcmluZwotICogQ29weXJpZ2h0IChDKSAyMDA4IERhdmlkZSBSaXp6byA8ZWxwYS1yaXp6b0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMTAgRGF2aWRlIFJpenpvIDxlbHBhLnJpenpvQGdtYWlsLmNvbT4KICAqCi0gKiBCYXNlZCBvbiB0aGUgbWF4MTYxOSBkcml2ZXIuIFRoZSBMTTk1MjQxIGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBOYXRpb25hbAotICogICBTZW1pY29uZHVjdG9ycy4KLSAqIEl0IHJlcG9ydHMgdXAgdG8gdGhyZWUgdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgdXAgdG8KLSAqIHR3byBleHRlcm5hbCBvbmVzKS4gQ29tcGxldGUgZGF0YXNoZWV0IGNhbiBiZQotICogb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiBUaGUgTE05NTI0MSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMuCisgKiBJdCByZXBvcnRzIHVwIHRvIHRocmVlIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIHVwIHRvIHR3byBleHRlcm5hbCBvbmVzKS4KKyAqIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CiAgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzLmNnaS9MTS9MTTk1MjQxLnBkZgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0zNiw4ICszMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KIAorI2RlZmluZSBERVZOQU1FICJsbTk1MjQxIgorCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gewotCTB4MTksIDB4MmEsIDB4MmIsIEkyQ19DTElFTlRfRU5EfTsKKwkweDE5LCAweDJhLCAweDJiLCBJMkNfQ0xJRU5UX0VORCB9OwogCiAvKiBMTTk1MjQxIHJlZ2lzdGVycyAqLwogI2RlZmluZSBMTTk1MjQxX1JFR19SX01BTl9JRAkJMHhGRQpAQCAtNDYsNyArNDQsNyBAQAogI2RlZmluZSBMTTk1MjQxX1JFR19SV19DT05GSUcJCTB4MDMKICNkZWZpbmUgTE05NTI0MV9SRUdfUldfUkVNX0ZJTFRFUgkweDA2CiAjZGVmaW5lIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNCQkweDA3Ci0jZGVmaW5lIExNOTUyNDFfUkVHX1dfT05FX1NIT1QgIAkweDBGCisjZGVmaW5lIExNOTUyNDFfUkVHX1dfT05FX1NIT1QJCTB4MEYKICNkZWZpbmUgTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSAkweDEwCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JfUkVNT1RFMV9URU1QSAkweDExCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JfUkVNT1RFMl9URU1QSAkweDEyCkBAIC03OSw1MiArNzcsMjA1IEBACiAjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRCAweDAxCiAjZGVmaW5lIERFRkFVTFRfUkVWSVNJT04gMHhBNAogCi0vKiBDb252ZXJzaW9ucyBhbmQgdmFyaW91cyBtYWNyb3MgKi8KLSNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWxfaCwgdmFsX2wpICgoKHZhbF9oKSAmIDB4ODAgPyAodmFsX2gpIC0gMHgxMDAgOiBcCi0gICAgKHZhbF9oKSkgKiAxMDAwICsgKHZhbF9sKSAqIDEwMDAgLyAyNTYpCi0KLS8qIEZ1bmN0aW9ucyBkZWNsYXJhdGlvbiAqLwotc3RhdGljIHZvaWQgbG05NTI0MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBjb25zdCB1OCBsbTk1MjQxX3JlZ19hZGRyZXNzW10gPSB7CisJTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSCwKKwlMTTk1MjQxX1JFR19SX0xPQ0FMX1RFTVBMLAorCUxNOTUyNDFfUkVHX1JfUkVNT1RFMV9URU1QSCwKKwlMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEwsCisJTE05NTI0MV9SRUdfUl9SRU1PVEUyX1RFTVBILAorCUxNOTUyNDFfUkVHX1JfUkVNT1RFMl9URU1QTAorfTsKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQxX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQsIGludGVydmFsOyAvKiBpbiBqaWZmaWVzICovCi0JY2hhciB2YWxpZDsgLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkLCBpbnRlcnZhbDsJLyogaW4gamlmZmllcyAqLworCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwotCXU4IGxvY2FsX2gsIGxvY2FsX2w7IC8qIGxvY2FsICovCi0JdTggcmVtb3RlMV9oLCByZW1vdGUxX2w7IC8qIHJlbW90ZTEgKi8KLQl1OCByZW1vdGUyX2gsIHJlbW90ZTJfbDsgLyogcmVtb3RlMiAqLworCXU4IHRlbXBbQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKV07CiAJdTggY29uZmlnLCBtb2RlbCwgdHJ1dGhlcm07CiB9OwogCi0vKiBTeXNmcyBzdHVmZiAqLwotI2RlZmluZSBzaG93X3RlbXAodmFsdWUpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgXAotCQlURU1QX0ZST01fUkVHKGRhdGEtPnZhbHVlIyNfaCwgZGF0YS0+dmFsdWUjI19sKSk7IFwKLQlyZXR1cm4gc3RybGVuKGJ1Zik7IFwKKy8qIENvbnZlcnNpb25zICovCitzdGF0aWMgaW50IFRlbXBGcm9tUmVnKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlpZiAodmFsX2ggJiAweDgwKQorCQlyZXR1cm4gdmFsX2ggLSAweDEwMDsKKwlyZXR1cm4gdmFsX2ggKiAxMDAwICsgdmFsX2wgKiAxMDAwIC8gMjU2OwogfQotc2hvd190ZW1wKGxvY2FsKTsKLXNob3dfdGVtcChyZW1vdGUxKTsKLXNob3dfdGVtcChyZW1vdGUyKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgZGF0YS0+aW50ZXJ2YWwpIHx8CisJICAgICFkYXRhLT52YWxpZCkgeworCQlpbnQgaTsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTUyNDEgZGF0YS5cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKTsgaSsrKQorCQkJZGF0YS0+dGVtcFtpXQorCQkJICA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkgICAgIGxtOTUyNDFfcmVnX2FkZHJlc3NbaV0pOworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogU3lzZnMgc3R1ZmYgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAotCXNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsIC8gSFopOwotCXJldHVybiBzdHJsZW4oYnVmKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsCisJCVRlbXBGcm9tUmVnKGRhdGEtPnRlbXBbdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleF0sCisJCQkgICAgZGF0YS0+dGVtcFt0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ICsgMV0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJZGF0YS0+bW9kZWwgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8gIjFcbiIgOiAiMlxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgc2hpZnQ7CisJdTggbWFzayA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJc2hpZnQgPSBtYXNrID09IFIxTVNfTUFTSyA/IFRUMV9TSElGVCA6IFRUMl9TSElGVDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBzaGlmdCk7CisJaWYgKHZhbCA9PSAxKSB7CisJCWRhdGEtPm1vZGVsIHw9IG1hc2s7CisJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBzaGlmdCk7CisJfSBlbHNlIHsKKwkJZGF0YS0+bW9kZWwgJj0gfm1hc2s7CisJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgc2hpZnQpOworCX0KKwlkYXRhLT52YWxpZCA9IDA7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMLAorCQkJCSAgZGF0YS0+bW9kZWwpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19UUlVUSEVSTSwKKwkJCQkgIGRhdGEtPnRydXRoZXJtKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPworCQkJIi0xMjcwMDBcbiIgOiAiMFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsIDwgLTEyODAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodmFsIDwgMCkKKwkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJZWxzZQorCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJZGF0YS0+dmFsaWQgPSAwOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPworCQkJIjEyNzAwMFxuIiA6ICIyNTUwMDBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA+PSAyNTYwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHZhbCA8PSAxMjcwMDApCisJCWRhdGEtPmNvbmZpZyB8PSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWVsc2UKKwkJZGF0YS0+Y29uZmlnICY9IH50b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsCisJCQkvIEhaKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTEzOCwxNzYgKzI4OSwzNCBAQAogCXJldHVybiBjb3VudDsKIH0KIAotI2RlZmluZSBzaG93X3R5cGUoZmxhZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd190eXBlIyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLVwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsIFwKLQkJZGF0YS0+bW9kZWwgJiBSIyNmbGFnIyNNU19NQVNLID8gIjFcbiIgOiAiMlxuIik7IFwKLQlyZXR1cm4gc3RybGVuKGJ1Zik7IFwKLX0KLXNob3dfdHlwZSgxKTsKLXNob3dfdHlwZSgyKTsKLQotI2RlZmluZSBzaG93X21pbihmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X21pbiMjZmxhZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCBcCi0JCWRhdGEtPmNvbmZpZyAmIFIjI2ZsYWcjI0RGX01BU0sgPwlcCi0JCSItMTI3MDAwXG4iIDogIjBcbiIpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCi19Ci1zaG93X21pbigxKTsKLXNob3dfbWluKDIpOwotCi0jZGVmaW5lIHNob3dfbWF4KGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfbWF4IyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLVwKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsIFwKLQkJZGF0YS0+Y29uZmlnICYgUiMjZmxhZyMjREZfTUFTSyA/IFwKLQkJIjEyNzAwMFxuIiA6ICIyNTUwMDBcbiIpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCi19Ci1zaG93X21heCgxKTsKLXNob3dfbWF4KDIpOwotCi0jZGVmaW5lIHNldF90eXBlKGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF90eXBlIyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7IFwKLVwKLQlpZiAoKHZhbCA9PSAxKSB8fCAodmFsID09IDIpKSB7IFwKLVwKLQkJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi1cCi0JCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVCMjZmxhZyMjX1NISUZUKTsgXAotCQlpZiAodmFsID09IDEpIHsgXAotCQkJZGF0YS0+bW9kZWwgfD0gUiMjZmxhZyMjTVNfTUFTSzsgXAotCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IFRUIyNmbGFnIyNfU0hJRlQpOyBcCi0JCX0gXAotCQllbHNlIHsgXAotCQkJZGF0YS0+bW9kZWwgJj0gflIjI2ZsYWcjI01TX01BU0s7IFwKLQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQjI2ZsYWcjI19TSElGVCk7IFwKLQkJfSBcCi1cCi0JCWRhdGEtPnZhbGlkID0gMDsgXAotXAotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMLCBcCi0JCQkJCSAgZGF0YS0+bW9kZWwpOyBcCi0JCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19UUlVUSEVSTSwgXAotCQkJCQkgIGRhdGEtPnRydXRoZXJtKTsgXAotXAotCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCX0gXAotCXJldHVybiBjb3VudDsgXAotfQotc2V0X3R5cGUoMSk7Ci1zZXRfdHlwZSgyKTsKLQotI2RlZmluZSBzZXRfbWluKGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF9taW4jI2ZsYWcoc3RydWN0IGRldmljZSAqZGV2LCBcCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7XAotXAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCWlmICh2YWwgPCAwKSBcCi0JCWRhdGEtPmNvbmZpZyB8PSBSIyNmbGFnIyNERl9NQVNLOyBcCi0JZWxzZSBcCi0JCWRhdGEtPmNvbmZpZyAmPSB+UiMjZmxhZyMjREZfTUFTSzsgXAotXAotCWRhdGEtPnZhbGlkID0gMDsgXAotXAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIFwKLQkJZGF0YS0+Y29uZmlnKTsgXAotXAotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi1cCi0JcmV0dXJuIGNvdW50OyBcCi19Ci1zZXRfbWluKDEpOwotc2V0X21pbigyKTsKLQotI2RlZmluZSBzZXRfbWF4KGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF9tYXgjI2ZsYWcoc3RydWN0IGRldmljZSAqZGV2LCBcCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0JbG9uZyB2YWw7IFwKLVwKLQlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApIFwKLQkJcmV0dXJuIC1FSU5WQUw7IFwKLVwKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLVwKLQlpZiAodmFsIDw9IDEyNzAwMCkgXAotCQlkYXRhLT5jb25maWcgfD0gUiMjZmxhZyMjREZfTUFTSzsgXAotCWVsc2UgXAotCQlkYXRhLT5jb25maWcgJj0gflIjI2ZsYWcjI0RGX01BU0s7IFwKLVwKLQlkYXRhLT52YWxpZCA9IDA7IFwKLVwKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBcCi0JCWRhdGEtPmNvbmZpZyk7IFwKLVwKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCXJldHVybiBjb3VudDsgXAotfQotc2V0X21heCgxKTsKLXNldF9tYXgoMik7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19sb2NhbCwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVtb3RlMSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfcmVtb3RlMiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZTEsIHNldF90eXBlMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZTIsIHNldF90eXBlMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4xLCBzZXRfbWluMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4yLCBzZXRfbWluMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgxLCBzZXRfbWF4MSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgyLCBzZXRfbWF4Mik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsIHNldF90eXBlLAorCQkJICBSMU1TX01BU0spOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM190eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKKwkJCSAgUjJNU19NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4sIHNldF9taW4sCisJCQkgIFIxREZfTUFTSyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAorCQkJICBSMkRGX01BU0spOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21heCwgc2V0X21heCwKKwkJCSAgUjFERl9NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCisJCQkgIFIyREZfTUFTSyk7CiBzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKIAkJICAgc2V0X2ludGVydmFsKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDFfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl90eXBlLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX3R5cGUuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWluLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX21pbi5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9tYXguYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfbWF4LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM190eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCiAJTlVMTAogfTsKQEAgLTMyOSw5ICszMzgsOSBAQAogCiAJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCiAJICAgICA9PSBNQU5VRkFDVFVSRVJfSUQpCi0JICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQotCSAgICAgPj0gREVGQVVMVF9SRVZJU0lPTikpIHsKLQkJbmFtZSA9ICJsbTk1MjQxIjsKKwkgICAgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQxX1JFR19SX0NISVBfSUQpCisJCT49IERFRkFVTFRfUkVWSVNJT04pKSB7CisJCW5hbWUgPSBERVZOQU1FOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIkxNOTUyNDEgZGV0ZWN0aW9uIGZhaWxlZCBhdCAweCUwMnhcbiIsCiAJCQlhZGRyZXNzKTsKQEAgLTM0Myw2ICszNTIsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbG05NTI0MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPmludGVydmFsID0gSFo7CS8qIDEgc2VjIGRlZmF1bHQgKi8KKwlkYXRhLT52YWxpZCA9IDA7CisJZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKKwlkYXRhLT5tb2RlbCA9IDA7CisJZGF0YS0+dHJ1dGhlcm0gPSAoVFRfT0ZGIDw8IFRUMV9TSElGVCkgfCAoVFRfT0ZGIDw8IFRUMl9TSElGVCk7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1fRklMVEVSLAorCQkJCSAgUjFGRV9NQVNLIHwgUjJGRV9NQVNLKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCisJCQkJICBkYXRhLT50cnV0aGVybSk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKKwkJCQkgIGRhdGEtPm1vZGVsKTsKK30KKwogc3RhdGljIGludCBsbTk1MjQxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTM4MiwyNiArNDEwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JZGF0YS0+aW50ZXJ2YWwgPSBIWjsgICAgLyogMSBzZWMgZGVmYXVsdCAqLwotCWRhdGEtPnZhbGlkID0gMDsKLQlkYXRhLT5jb25maWcgPSBDRkdfQ1IwMDc2OwotCWRhdGEtPm1vZGVsID0gMDsKLQlkYXRhLT50cnV0aGVybSA9IChUVF9PRkYgPDwgVFQxX1NISUZUKSB8IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCi0JCQkJICBkYXRhLT5jb25maWcpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1fRklMVEVSLAotCQkJCSAgUjFGRV9NQVNLIHwgUjJGRV9NQVNLKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCi0JCQkJICBkYXRhLT50cnV0aGVybSk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKLQkJCQkgIGRhdGEtPm1vZGVsKTsKLX0KLQogc3RhdGljIGludCBsbTk1MjQxX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTQxMyw0NiArNDIxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBsbTk1MjQxX2RhdGEgKmxtOTUyNDFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBkYXRhLT5pbnRlcnZhbCkgfHwKLQkgICAgIWRhdGEtPnZhbGlkKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05NTI0MSBkYXRhLlxuIik7Ci0JCWRhdGEtPmxvY2FsX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX0xPQ0FMX1RFTVBIKTsKLQkJZGF0YS0+bG9jYWxfbCA9Ci0JCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJIExNOTUyNDFfUkVHX1JfTE9DQUxfVEVNUEwpOwotCQlkYXRhLT5yZW1vdGUxX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEgpOwotCQlkYXRhLT5yZW1vdGUxX2wgPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEwpOwotCQlkYXRhLT5yZW1vdGUyX2ggPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEgpOwotCQlkYXRhLT5yZW1vdGUyX2wgPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEwpOwotCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwotCQlkYXRhLT52YWxpZCA9IDE7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQogLyogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTk1MjQxX2lkW10gPSB7Ci0JeyAibG05NTI0MSIsIDAgfSwKKwl7IERFVk5BTUUsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG05NTI0MV9pZCk7CkBAIC00NjAsNyArNDMxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTk1MjQxX2RyaXZlciA9IHsKIAkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICAgPSAibG05NTI0MSIsCisJCS5uYW1lCT0gREVWTkFNRSwKIAl9LAogCS5wcm9iZQkJPSBsbTk1MjQxX3Byb2JlLAogCS5yZW1vdmUJCT0gbG05NTI0MV9yZW1vdmUsCkBAIC00NzksNyArNDUwLDcgQEAKIAlpMmNfZGVsX2RyaXZlcigmbG05NTI0MV9kcml2ZXIpOwogfQogCi1NT0RVTEVfQVVUSE9SKCJEYXZpZGUgUml6em8gPGVscGEtcml6em9AZ21haWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiRGF2aWRlIFJpenpvIDxlbHBhLnJpenpvQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTE05NTI0MSBzZW5zb3IgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggNjhlNjlhNC4uM2Q5OWI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTMzLDYgKzMzLDggQEAKICAqICB0aGUgc3RhbmRhcmQgU3VwZXItSS9PIGFkZHJlc3NlcyBpcyB1c2VkICgweDJFLzB4MkYgb3IgMHg0RS8weDRGKS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTAzMSwxNiArMTAzMywxNSBAQAogCiAJCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIEFDVCk7CiAJCWlmICghKHZhbCAmIDB4MDEpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJwYzg3MzYwOiBEZXZpY2UgMHglMDJ4IG5vdCAiCi0JCQkgICAgICAgImFjdGl2YXRlZFxuIiwgbG9nZGV2W2ldKTsKKwkJCXByX2luZm8oIkRldmljZSAweCUwMnggbm90IGFjdGl2YXRlZFxuIiwgbG9nZGV2W2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJdmFsID0gKHN1cGVyaW9faW5iKHNpb2FkZHIsIEJBU0UpIDw8IDgpCiAJCSAgICB8IHN1cGVyaW9faW5iKHNpb2FkZHIsIEJBU0UgKyAxKTsKIAkJaWYgKCF2YWwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInBjODczNjA6IEJhc2UgYWRkcmVzcyBub3Qgc2V0IGZvciAiCi0JCQkgICAgICAgImRldmljZSAweCUwMnhcbiIsIGxvZ2RldltpXSk7CisJCQlwcl9pbmZvKCJCYXNlIGFkZHJlc3Mgbm90IHNldCBmb3IgZGV2aWNlIDB4JTAyeFxuIiwKKwkJCQlsb2dkZXZbaV0pOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTA1MCwxNyArMTA1MSwxNSBAQAogCQkJY29uZnJlZ1swXSA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIDB4RjApOwogCQkJY29uZnJlZ1sxXSA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIDB4RjEpOwogCi0jaWZkZWYgREVCVUcKLQkJCXByaW50ayhLRVJOX0RFQlVHICJwYzg3MzYwOiBGYW4gMTogbW9uPSVkICIKLQkJCSAgICAgICAiY3RybD0lZCBpbnY9JWRcbiIsIChjb25mcmVnWzBdPj4yKSYxLAotCQkJICAgICAgIChjb25mcmVnWzBdPj4zKSYxLCAoY29uZnJlZ1swXT4+NCkmMSk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAicGM4NzM2MDogRmFuIDI6IG1vbj0lZCAiCi0JCQkgICAgICAgImN0cmw9JWQgaW52PSVkXG4iLCAoY29uZnJlZ1swXT4+NSkmMSwKLQkJCSAgICAgICAoY29uZnJlZ1swXT4+NikmMSwgKGNvbmZyZWdbMF0+PjcpJjEpOwotCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjODczNjA6IEZhbiAzOiBtb249JWQgIgotCQkJICAgICAgICJjdHJsPSVkIGludj0lZFxuIiwgY29uZnJlZ1sxXSYxLAotCQkJICAgICAgIChjb25mcmVnWzFdPj4xKSYxLCAoY29uZnJlZ1sxXT4+MikmMSk7Ci0jZW5kaWYKKwkJCXByX2RlYnVnKCJGYW4gJWQ6IG1vbj0lZCBjdHJsPSVkIGludj0lZFxuIiwgMSwKKwkJCQkgKGNvbmZyZWdbMF0gPj4gMikgJiAxLCAoY29uZnJlZ1swXSA+PiAzKSAmIDEsCisJCQkJIChjb25mcmVnWzBdID4+IDQpICYgMSk7CisJCQlwcl9kZWJ1ZygiRmFuICVkOiBtb249JWQgY3RybD0lZCBpbnY9JWRcbiIsIDIsCisJCQkJIChjb25mcmVnWzBdID4+IDUpICYgMSwgKGNvbmZyZWdbMF0gPj4gNikgJiAxLAorCQkJCSAoY29uZnJlZ1swXSA+PiA3KSAmIDEpOworCQkJcHJfZGVidWcoIkZhbiAlZDogbW9uPSVkIGN0cmw9JWQgaW52PSVkXG4iLCAzLAorCQkJCSBjb25mcmVnWzFdICYgMSwgKGNvbmZyZWdbMV0gPj4gMSkgJiAxLAorCQkJCSAoY29uZnJlZ1sxXSA+PiAyKSAmIDEpOwogCQl9IGVsc2UgaWYgKGk9PTEpIHsgLyogVm9sdGFnZXMgKi8KIAkJCS8qIEFyZSB3ZSB1c2luZyB0aGVybWlzdG9ycz8gKi8KIAkJCWlmICgqZGV2aWQgPT0gMHhFOSkgeyAvKiBQQzg3MzY2ICovCkBAIC0xMDcxLDE0ICsxMDcwLDEyIEBACiAJCQkJY29uZnJlZ1szXSA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIDB4MjUpOwogCiAJCQkJaWYgKGNvbmZyZWdbMl0gJiAweDQwKSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gInBjODczNjA6IFVzaW5nICIKLQkJCQkJICAgICAgICJ0aGVybWlzdG9ycyBmb3IgdGVtcGVyYXR1cmUgIgotCQkJCQkgICAgICAgIm1vbml0b3JpbmdcbiIpOworCQkJCQlwcl9pbmZvKCJVc2luZyB0aGVybWlzdG9ycyBmb3IgIgorCQkJCQkJInRlbXBlcmF0dXJlIG1vbml0b3JpbmdcbiIpOwogCQkJCX0KIAkJCQlpZiAoY29uZnJlZ1szXSAmIDB4RTApIHsKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAicGM4NzM2MDogVklEICIKLQkJCQkJICAgICAgICJpbnB1dHMgcm91dGVkIChtb2RlICV1KVxuIiwKLQkJCQkJICAgICAgIGNvbmZyZWdbM10gPj4gNSk7CisJCQkJCXByX2luZm8oIlZJRCBpbnB1dHMgcm91dGVkIChtb2RlICV1KVxuIiwKKwkJCQkJCWNvbmZyZWdbM10gPj4gNSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNjE2LDcgKzE2MTMsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInBjODczNjAiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSICJwYzg3MzYwOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE2MzksMTUgKzE2MzYsMTMgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHJlcywgcmVzX2NvdW50KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGM4NzM2MDogRGV2aWNlIHJlc291cmNlcyBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlcyBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicGM4NzM2MDogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMTY2Niw4ICsxNjYxLDcgQEAKIAogCWlmIChwYzg3MzYwX2ZpbmQoMHgyZSwgJmRldmlkLCBleHRyYV9pc2EpCiAJICYmIHBjODczNjBfZmluZCgweDRlLCAmZGV2aWQsIGV4dHJhX2lzYSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGM4NzM2MDogUEM4NzM2eCBub3QgZGV0ZWN0ZWQsICIKLQkJICAgICAgICJtb2R1bGUgbm90IGluc2VydGVkLlxuIik7CisJCXByX3dhcm4oIlBDODczNnggbm90IGRldGVjdGVkLCBtb2R1bGUgbm90IGluc2VydGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xNjgwLDggKzE2NzQsNyBAQAogCX0KIAogCWlmIChhZGRyZXNzID09IDB4MDAwMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwYzg3MzYwOiBObyBhY3RpdmUgbG9naWNhbCBkZXZpY2UsICIKLQkJICAgICAgICJtb2R1bGUgbm90IGluc2VydGVkLlxuIik7CisJCXByX3dhcm4oIk5vIGFjdGl2ZSBsb2dpY2FsIGRldmljZSwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wYzg3NDI3LmMgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwppbmRleCA5ZWM0ZGFhLi44ZGEyMTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYworKysgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwpAQCAtMjIsNiArMjIsOCBAQAogICogIG1vZGUsIGFuZCB2b2x0YWdlcyBhcmVuJ3Qgc3VwcG9ydGVkIGF0IGFsbC4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTA3Nyw3ICsxMDc5LDcgQEAKIAlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjODc0MjdfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwkJcHJfZXJyKCJPdXQgb2YgbWVtb3J5XG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTE5NiwyOCArMTE5OCwyNiBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgcmVzWzBdLnN0YXJ0KTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgcmVzLCByZXNfY291bnQpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwYzg3NDI3X3Npb19kYXRhKSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKQEAgLTEyNDksMjMgKzEyNDksMjMgQEAKIAogCQl2YWwgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9SRUdfQUNUKTsKIAkJaWYgKCEodmFsICYgMHgwMSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBMb2dpY2FsIGRldmljZSAweCUwMnggIgotCQkJICAgICAgICJub3QgYWN0aXZhdGVkXG4iLCBsb2dkZXZbaV0pOworCQkJcHJfaW5mbygiTG9naWNhbCBkZXZpY2UgMHglMDJ4IG5vdCBhY3RpdmF0ZWRcbiIsCisJCQkJbG9nZGV2W2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJdmFsID0gc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX01BUCk7CiAJCWlmICh2YWwgJiAweDAxKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogTG9naWNhbCBkZXZpY2UgMHglMDJ4ICIKLQkJCSAgICAgICAiaXMgbWVtb3J5LW1hcHBlZCwgY2FuJ3QgdXNlXG4iLCBsb2dkZXZbaV0pOworCQkJcHJfd2FybigiTG9naWNhbCBkZXZpY2UgMHglMDJ4IGlzIG1lbW9yeS1tYXBwZWQsICIKKwkJCQkiY2FuJ3QgdXNlXG4iLCBsb2dkZXZbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAogCQl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0lPQkFTRSkgPDwgOCkKIAkJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPUkVHX0lPQkFTRSArIDEpOwogCQlpZiAoIXZhbCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEkvTyBiYXNlIGFkZHJlc3Mgbm90IHNldCAiCi0JCQkgICAgICAgImZvciBsb2dpY2FsIGRldmljZSAweCUwMnhcbiIsIGxvZ2RldltpXSk7CisJCQlwcl9pbmZvKCJJL08gYmFzZSBhZGRyZXNzIG5vdCBzZXQgZm9yIGxvZ2ljYWwgZGV2aWNlICIKKwkJCQkiMHglMDJ4XG4iLCBsb2dkZXZbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAkJc2lvX2RhdGEtPmFkZHJlc3NbaV0gPSB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BjZjg1OTEuYyBiL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCmluZGV4IGRjNzI1OWQuLjczMWIwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjkwLDggKzI5Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBwY2Y4NTkxX2luaXQodm9pZCkKIHsKIAlpZiAoaW5wdXRfbW9kZSA8IDAgfHwgaW5wdXRfbW9kZSA+IDMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNmODU5MTogaW52YWxpZCBpbnB1dF9tb2RlICglZClcbiIsCi0JCSAgICAgICBpbnB1dF9tb2RlKTsKKwkJcHJfd2FybigiaW52YWxpZCBpbnB1dF9tb2RlICglZClcbiIsIGlucHV0X21vZGUpOwogCQlpbnB1dF9tb2RlID0gMDsKIAl9CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTkxX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BrZ3RlbXAuYyBiL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCmluZGV4IDA3OTgyMTAuLjIxYzgxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzAzLDcgKzMwNSw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBjcHUpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTMxNSw4ICszMTcsNyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NodDIxLmMgYi9kcml2ZXJzL2h3bW9uL3NodDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4Yzk4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vc2h0MjEuYwpAQCAtMCwwICsxLDMwNyBAQAorLyogU2Vuc2lyaW9uIFNIVDIxIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFVycyBGbGVpc2NoIDx1cnMuZmxlaXNjaEBzZW5zaXJpb24uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBEYXRhIHNoZWV0IGF2YWlsYWJsZSAoNS8yMDEwKSBhdAorICogaHR0cDovL3d3dy5zZW5zaXJpb24uY29tL2VuL3BkZi9wcm9kdWN0X2luZm9ybWF0aW9uL0RhdGFzaGVldC1odW1pZGl0eS1zZW5zb3ItU0hUMjEucGRmCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKy8qIEkyQyBjb21tYW5kIGJ5dGVzICovCisjZGVmaW5lIFNIVDIxX1RSSUdfVF9NRUFTVVJFTUVOVF9ITSAgMHhlMworI2RlZmluZSBTSFQyMV9UUklHX1JIX01FQVNVUkVNRU5UX0hNIDB4ZTUKKworLyoqCisgKiBzdHJ1Y3Qgc2h0MjEgLSBTSFQyMSBkZXZpY2Ugc3BlY2lmaWMgZGF0YQorICogQGh3bW9uX2RldjogZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBod21vbgorICogQGxvY2s6IG11dGV4IHRvIHByb3RlY3QgbWVhc3VyZW1lbnQgdmFsdWVzCisgKiBAdmFsaWQ6IG9ubHkgMCBiZWZvcmUgZmlyc3QgbWVhc3VyZW1lbnQgaXMgdGFrZW4KKyAqIEBsYXN0X3VwZGF0ZTogdGltZSBvZiBsYXN0IHVwZGF0ZSAoamlmZmllcykKKyAqIEB0ZW1wZXJhdHVyZTogY2FjaGVkIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHZhbHVlCisgKiBAaHVtaWRpdHk6IGNhY2hlZCBodW1pZGl0eSBtZWFzdXJlbWVudCB2YWx1ZQorICovCitzdHJ1Y3Qgc2h0MjEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwljaGFyIHZhbGlkOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGU7CisJaW50IHRlbXBlcmF0dXJlOworCWludCBodW1pZGl0eTsKK307CisKKy8qKgorICogc2h0MjFfdGVtcF90aWNrc190b19taWxsaWNlbHNpdXMoKSAtIGNvbnZlcnQgcmF3IHRlbXBlcmF0dXJlIHRpY2tzIHRvCisgKiBtaWxsaSBjZWxzaXVzCisgKiBAdGlja3M6IHRlbXBlcmF0dXJlIHRpY2tzIHZhbHVlIHJlY2VpdmVkIGZyb20gc2Vuc29yCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNodDIxX3RlbXBfdGlja3NfdG9fbWlsbGljZWxzaXVzKGludCB0aWNrcykKK3sKKwl0aWNrcyAmPSB+MHgwMDAzOyAvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCS8qCisJICogRm9ybXVsYSBUID0gLTQ2Ljg1ICsgMTc1LjcyICogU1QgLyAyXjE2IGZyb20gZGF0YSBzaGVldCA2LjIsCisJICogb3B0aW1pemVkIGZvciBpbnRlZ2VyIGZpeGVkIHBvaW50ICgzIGRpZ2l0cykgYXJpdGhtZXRpYworCSAqLworCXJldHVybiAoKDIxOTY1ICogdGlja3MpID4+IDEzKSAtIDQ2ODUwOworfQorCisvKioKKyAqIHNodDIxX3JoX3RpY2tzX3RvX3Blcl9jZW50X21pbGxlKCkgLSBjb252ZXJ0IHJhdyBodW1pZGl0eSB0aWNrcyB0bworICogb25lLXRob3VzYW5kdGhzIG9mIGEgcGVyY2VudCByZWxhdGl2ZSBodW1pZGl0eQorICogQHRpY2tzOiBodW1pZGl0eSB0aWNrcyB2YWx1ZSByZWNlaXZlZCBmcm9tIHNlbnNvcgorICovCitzdGF0aWMgaW5saW5lIGludCBzaHQyMV9yaF90aWNrc190b19wZXJfY2VudF9taWxsZShpbnQgdGlja3MpCit7CisJdGlja3MgJj0gfjB4MDAwMzsgLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwkvKgorCSAqIEZvcm11bGEgUkggPSAtNiArIDEyNSAqIFNSSCAvIDJeMTYgZnJvbSBkYXRhIHNoZWV0IDYuMSwKKwkgKiBvcHRpbWl6ZWQgZm9yIGludGVnZXIgZml4ZWQgcG9pbnQgKDMgZGlnaXRzKSBhcml0aG1ldGljCisJICovCisJcmV0dXJuICgoMTU2MjUgKiB0aWNrcykgPj4gMTMpIC0gNjAwMDsKK30KKworLyoqCisgKiBzaHQyMV9yZWFkX3dvcmRfZGF0YSgpIC0gcmVhZCB3b3JkIGZyb20gcmVnaXN0ZXIKKyAqIEBjbGllbnQ6IEkyQyBjbGllbnQgZGV2aWNlCisgKiBAcmVnOiBJMkMgY29tbWFuZCBieXRlCisgKgorICogUmV0dXJucyB2YWx1ZSwgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNodDIxX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIFNNQnVzIHNwZWNpZmllcyBsb3cgYnl0ZSBmaXJzdCwgYnV0IHRoZSBTSFQyMSByZXR1cm5zIE1TQgorCSAqIGZpcnN0LCBzbyB3ZSBoYXZlIHRvIHN3YWIxNiB0aGUgdmFsdWVzCisJICovCisJcmV0dXJuIHN3YWIxNihyZXQpOworfQorCisvKioKKyAqIHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoKSAtIGdldCB1cGRhdGVkIG1lYXN1cmVtZW50cyBmcm9tIGRldmljZQorICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBzaHQyMV91cGRhdGVfbWVhc3VyZW1lbnRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNodDIxICpzaHQyMSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfbG9jaygmc2h0MjEtPmxvY2spOworCS8qCisJICogRGF0YSBzaGVldCAyLjQ6CisJICogU0hUMnggc2hvdWxkIG5vdCBiZSBhY3RpdmUgZm9yIG1vcmUgdGhhbiAxMCUgb2YgdGhlIHRpbWUgLSBlLmcuCisJICogbWF4aW11bSB0d28gbWVhc3VyZW1lbnRzIHBlciBzZWNvbmQgYXQgMTJiaXQgYWNjdXJhY3kgc2hhbGwgYmUgbWFkZS4KKwkgKi8KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzaHQyMS0+bGFzdF91cGRhdGUgKyBIWiAvIDIpIHx8ICFzaHQyMS0+dmFsaWQpIHsKKwkJcmV0ID0gc2h0MjFfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBTSFQyMV9UUklHX1RfTUVBU1VSRU1FTlRfSE0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzaHQyMS0+dGVtcGVyYXR1cmUgPSBzaHQyMV90ZW1wX3RpY2tzX3RvX21pbGxpY2Vsc2l1cyhyZXQpOworCQlyZXQgPSBzaHQyMV9yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCQkJCVNIVDIxX1RSSUdfUkhfTUVBU1VSRU1FTlRfSE0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzaHQyMS0+aHVtaWRpdHkgPSBzaHQyMV9yaF90aWNrc190b19wZXJfY2VudF9taWxsZShyZXQpOworCQlzaHQyMS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCQlzaHQyMS0+dmFsaWQgPSAxOworCX0KK291dDoKKwltdXRleF91bmxvY2soJnNodDIxLT5sb2NrKTsKKworCXJldHVybiByZXQgPj0gMCA/IDAgOiByZXQ7Cit9CisKKy8qKgorICogc2h0MjFfc2hvd190ZW1wZXJhdHVyZSgpIC0gc2hvdyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCB2YWx1ZSBpbiBzeXNmcworICogQGRldjogZGV2aWNlCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZQorICogQGJ1Zjogc3lzZnMgYnVmZmVyIChQQUdFX1NJWkUpIHdoZXJlIG1lYXN1cmVtZW50IHZhbHVlcyBhcmUgd3JpdHRlbiB0bworICoKKyAqIFdpbGwgYmUgY2FsbGVkIG9uIHJlYWQgYWNjZXNzIHRvIHRlbXAxX2lucHV0IHN5c2ZzIGF0dHJpYnV0ZS4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBzaHQyMV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldCA9IHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc2h0MjEtPnRlbXBlcmF0dXJlKTsKK30KKworLyoqCisgKiBzaHQyMV9zaG93X2h1bWlkaXR5KCkgLSBzaG93IGh1bWlkaXR5IG1lYXN1cmVtZW50IHZhbHVlIGluIHN5c2ZzCisgKiBAZGV2OiBkZXZpY2UKKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlCisgKiBAYnVmOiBzeXNmcyBidWZmZXIgKFBBR0VfU0laRSkgd2hlcmUgbWVhc3VyZW1lbnQgdmFsdWVzIGFyZSB3cml0dGVuIHRvCisgKgorICogV2lsbCBiZSBjYWxsZWQgb24gcmVhZCBhY2Nlc3MgdG8gaHVtaWRpdHkxX2lucHV0IHN5c2ZzIGF0dHJpYnV0ZS4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBzaHQyMV9zaG93X2h1bWlkaXR5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldCA9IHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc2h0MjEtPmh1bWlkaXR5KTsKK30KKworLyogc3lzZnMgYXR0cmlidXRlcyAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2h0MjFfc2hvd190ZW1wZXJhdHVyZSwKKwlOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaHVtaWRpdHkxX2lucHV0LCBTX0lSVUdPLCBzaHQyMV9zaG93X2h1bWlkaXR5LAorCU5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2h0MjFfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2h1bWlkaXR5MV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNodDIxX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2h0MjFfYXR0cmlidXRlcywKK307CisKKy8qKgorICogc2h0MjFfcHJvYmUoKSAtIHByb2JlIGRldmljZQorICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKKyAqIEBpZDogZGV2aWNlIElECisgKgorICogQ2FsbGVkIGJ5IHRoZSBJMkMgY29yZSB3aGVuIGFuIGVudHJ5IGluIHRoZSBJRCB0YWJsZSBtYXRjaGVzIGEKKyAqIGRldmljZSdzIG5hbWUuCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2h0MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNodDIxICpzaHQyMTsKKwlpbnQgZXJyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJImFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCBTTUJ1cyB3b3JkIHRyYW5zYWN0aW9uc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNodDIxID0ga3phbGxvYyhzaXplb2YoKnNodDIxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaHQyMSkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImt6YWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHNodDIxKTsKKworCW11dGV4X2luaXQoJnNodDIxLT5sb2NrKTsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnNodDIxX2F0dHJfZ3JvdXApOworCWlmIChlcnIpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJjb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCXNodDIxLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKHNodDIxLT5od21vbl9kZXYpKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIGRldmljZVxuIik7CisJCWVyciA9IFBUUl9FUlIoc2h0MjEtPmh3bW9uX2Rldik7CisJCWdvdG8gZmFpbF9yZW1vdmVfc3lzZnM7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcmVtb3ZlX3N5c2ZzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnNodDIxX2F0dHJfZ3JvdXApOworZmFpbF9mcmVlOgorCWtmcmVlKHNodDIxKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc2h0MjFfcmVtb3ZlKCkgLSByZW1vdmUgZGV2aWNlCisgKiBAY2xpZW50OiBJMkMgY2xpZW50IGRldmljZQorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzaHQyMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzaHQyMS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZzaHQyMV9hdHRyX2dyb3VwKTsKKwlrZnJlZShzaHQyMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV2aWNlIElEIHRhYmxlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2h0MjFfaWRbXSA9IHsKKwl7ICJzaHQyMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2h0MjFfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2h0MjFfZHJpdmVyID0geworCS5kcml2ZXIubmFtZSA9ICJzaHQyMSIsCisJLnByb2JlICAgICAgID0gc2h0MjFfcHJvYmUsCisJLnJlbW92ZSAgICAgID0gX19kZXZleGl0X3Aoc2h0MjFfcmVtb3ZlKSwKKwkuaWRfdGFibGUgICAgPSBzaHQyMV9pZCwKK307CisKKy8qKgorICogc2h0MjFfaW5pdCgpIC0gaW5pdGlhbGl6ZSBkcml2ZXIKKyAqCisgKiBDYWxsZWQgd2hlbiBrZXJuZWwgaXMgYm9vdGVkIG9yIG1vZHVsZSBpcyBpbnNlcnRlZC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzaHQyMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzaHQyMV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc2h0MjFfaW5pdCk7CisKKy8qKgorICogc2h0MjFfaW5pdCgpIC0gY2xlYW4gdXAgZHJpdmVyCisgKgorICogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIHJlbW92ZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzaHQyMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnNodDIxX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzaHQyMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVXJzIEZsZWlzY2ggPHVycy5mbGVpc2NoQHNlbnNpcmlvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlbnNpcmlvbiBTSFQyMSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCA3OWMyOTMxLi40N2Q3Y2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNTAsNiArNTAsOCBAQAogCSA3MzUJCTAwMDgJCTA3MzUKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTczNSwyMSArNzM3LDE5IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2lzNTU5NSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgInNpczU1OTU6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaXM1NTk1OiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2lzNTU5NTogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCBmNDZkOTM2Li45ZmI3NTE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKQEAgLTI2LDYgKzI2LDggQEAKICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTMxMSwyMSArMzEzLDE5IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKQEAgLTM2Nyw4ICszNjcsNyBAQAogCSphZGRyID0gKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0VfTVNCKSA8PCA4KQogCQkgfCAgc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRV9MU0IpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IGZvdW5kIFNNU0MgJXMgIgotCQkiKGJhc2UgYWRkcmVzcyAweCUwNHgsIHJldmlzaW9uICV1KVxuIiwKKwlwcl9pbmZvKCJmb3VuZCBTTVNDICVzIChiYXNlIGFkZHJlc3MgMHglMDR4LCByZXZpc2lvbiAldSlcbiIsCiAJCW5hbWUsICphZGRyLCByZXYpOwogCiAJc3VwZXJpb19leGl0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKaW5kZXggOGZhNDYyZi4uZjQ0YTg5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpAQCAtMjYsNiArMjYsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtNDM1LDMwICs0MzcsMjkgQEAKIAkgKi8KIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgMHg1MToKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdCMjd4XG4iKTsKKwkJcHJfaW5mbygiRm91bmQgU01TQyBMUEM0N0IyN3hcbiIpOwogCQlzaW9fZGF0YS0+dHlwZSA9IHNtc2M0N20xOwogCQlicmVhazsKIAljYXNlIDB4NTk6Ci0JCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCBTTVNDIExQQzQ3TTEweC9MUEM0N00xMTIvTFBDNDdNMTN4XG4iKTsKKwkJcHJfaW5mbygiRm91bmQgU01TQyBMUEM0N00xMHgvTFBDNDdNMTEyL0xQQzQ3TTEzeFxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg1RjoKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdNMTR4XG4iKTsKKwkJcHJfaW5mbygiRm91bmQgU01TQyBMUEM0N00xNHhcbiIpOwogCQlzaW9fZGF0YS0+dHlwZSA9IHNtc2M0N20xOwogCQlicmVhazsKIAljYXNlIDB4NjA6Ci0JCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCBTTVNDIExQQzQ3TTE1eC9MUEM0N00xOTIvTFBDNDdNOTk3XG4iKTsKKwkJcHJfaW5mbygiRm91bmQgU01TQyBMUEM0N00xNXgvTFBDNDdNMTkyL0xQQzQ3TTk5N1xuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg2QjoKIAkJaWYgKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0RFVlJFVikgJiAweDgwKSB7Ci0JCQlwcl9kZWJ1ZyhEUlZOQU1FICI6ICIKLQkJCQkgIkZvdW5kIFNNU0MgTFBDNDdNMjMzLCB1bnN1cHBvcnRlZFxuIik7CisJCQlwcl9kZWJ1ZygiRm91bmQgU01TQyBMUEM0N00yMzMsIHVuc3VwcG9ydGVkXG4iKTsKIAkJCXN1cGVyaW9fZXhpdCgpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCQlwcl9pbmZvKERSVk5BTUUgIjogRm91bmQgU01TQyBMUEM0N00yOTJcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTI5MlxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC00NzAsNyArNDcxLDcgQEAKIAkqYWRkciA9IChzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFKSA8PCA4KQogCSAgICAgIHwgIHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UgKyAxKTsKIAlpZiAoKmFkZHIgPT0gMCkgewotCQlwcl9pbmZvKERSVk5BTUUgIjogRGV2aWNlIGFkZHJlc3Mgbm90IHNldCwgd2lsbCBub3QgdXNlXG4iKTsKKwkJcHJfaW5mbygiRGV2aWNlIGFkZHJlc3Mgbm90IHNldCwgd2lsbCBub3QgdXNlXG4iKTsKIAkJc3VwZXJpb19leGl0KCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTQ3OSw3ICs0ODAsNyBAQAogCSAqIENvbXBhcSBQcmVzYXJpbyBTNDAwME5YKSAqLwogCXNpb19kYXRhLT5hY3RpdmF0ZSA9IHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0FDVCk7CiAJaWYgKChzaW9fZGF0YS0+YWN0aXZhdGUgJiAweDAxKSA9PSAwKSB7Ci0JCXByX2luZm8oRFJWTkFNRSAiOiBFbmFibGluZyBkZXZpY2VcbiIpOworCQlwcl9pbmZvKCJFbmFibGluZyBkZXZpY2VcbiIpOwogCQlzdXBlcmlvX291dGIoU1VQRVJJT19SRUdfQUNULCBzaW9fZGF0YS0+YWN0aXZhdGUgfCAweDAxKTsKIAl9CiAKQEAgLTQ5NCw3ICs0OTUsNyBAQAogCQlzdXBlcmlvX2VudGVyKCk7CiAJCXN1cGVyaW9fc2VsZWN0KCk7CiAKLQkJcHJfaW5mbyhEUlZOQU1FICI6IERpc2FibGluZyBkZXZpY2VcbiIpOworCQlwcl9pbmZvKCJEaXNhYmxpbmcgZGV2aWNlXG4iKTsKIAkJc3VwZXJpb19vdXRiKFNVUEVSSU9fUkVHX0FDVCwgc2lvX2RhdGEtPmFjdGl2YXRlKTsKIAogCQlzdXBlcmlvX2V4aXQoKTsKQEAgLTgyMywyOCArODI0LDI2IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNtc2M0N20xX3Npb19kYXRhKSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYwppbmRleCBlYzdmYWQ3Li4wZDE4ZGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYS1jcHV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKiAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjAyLDcgKzIwNCw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBjcHUpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTIxNCw4ICsyMTYsNyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CiAJfQogCkBAIC0yMzcsMTMgKzIzOCwxNiBAQAogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgdmlhX2NwdXRlbXBfZGV2aWNlX3JlbW92ZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKKwlzdHJ1Y3QgcGRldl9lbnRyeSAqcDsKKwogCW11dGV4X2xvY2soJnBkZXZfbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZwZGV2X2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKHAtPmNwdSA9PSBjcHUpIHsKIAkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHAtPnBkZXYpOwogCQkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOwogCQkJa2ZyZWUocCk7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOwpAQCAtMjczLDcgKzI3Nyw2IEBACiBzdGF0aWMgaW50IF9faW5pdCB2aWFfY3B1dGVtcF9pbml0KHZvaWQpCiB7CiAJaW50IGksIGVycjsKLQlzdHJ1Y3QgcGRldl9lbnRyeSAqcCwgKm47CiAKIAlpZiAoY3B1X2RhdGEoMCkueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgRFJWTkFNRSAiOiBOb3QgYSBWSUEgQ1BVXG4iKTsKQEAgLTI5NSwzMyArMjk4LDI3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoYy0+eDg2X21vZGVsID4gMHgwZikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IFVua25vd24gQ1BVICIKLQkJCQkibW9kZWwgMHgleFxuIiwgYy0+eDg2X21vZGVsKTsKKwkJCXByX3dhcm4oIlVua25vd24gQ1BVIG1vZGVsIDB4JXhcbiIsIGMtPng4Nl9tb2RlbCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWVyciA9IHZpYV9jcHV0ZW1wX2RldmljZV9hZGQoaSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGV4aXRfZGV2aWNlc191bnJlZzsKKwkJdmlhX2NwdXRlbXBfZGV2aWNlX2FkZChpKTsKIAl9CisKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJaWYgKGxpc3RfZW1wdHkoJnBkZXZfbGlzdCkpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0X2RyaXZlcl91bnJlZzsKIAl9CisjZW5kaWYKIAogCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdmlhX2NwdXRlbXBfY3B1X25vdGlmaWVyKTsKIAlyZXR1cm4gMDsKIAotZXhpdF9kZXZpY2VzX3VucmVnOgotCW11dGV4X2xvY2soJnBkZXZfbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZwZGV2X2xpc3QsIGxpc3QpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocC0+cGRldik7Ci0JCWxpc3RfZGVsKCZwLT5saXN0KTsKLQkJa2ZyZWUocCk7Ci0JfQotCW11dGV4X3VubG9jaygmcGRldl9saXN0X211dGV4KTsKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBleGl0X2RyaXZlcl91bnJlZzoKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlhX2NwdXRlbXBfZHJpdmVyKTsKKyNlbmRpZgogZXhpdDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCBmMzk3Y2U3Li4yNWU5MTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpAQCAtMzAsNiArMzAsOCBAQAogICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTY4Nyw2ICs2ODksMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdmlhNjg2YV91cGRhdGVfZmFuX2RpdihzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhKQoreworCWludCByZWcgPSB2aWE2ODZhX3JlYWRfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfRkFORElWKTsKKwlkYXRhLT5mYW5fZGl2WzBdID0gKHJlZyA+PiA0KSAmIDB4MDM7CisJZGF0YS0+ZmFuX2RpdlsxXSA9IHJlZyA+PiA2OworfQorCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdmlhNjg2YV9pbml0X2RldmljZShzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhKQogewogCXU4IHJlZzsKQEAgLTcwMCw2ICs3MDksOSBAQAogCXZpYTY4NmFfd3JpdGVfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfVEVNUF9NT0RFLAogCQkJICAgIChyZWcgJiB+VklBNjg2QV9URU1QX01PREVfTUFTSykKIAkJCSAgICB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpOworCisJLyogUHJlLXJlYWQgZmFuIGNsb2NrIGRpdmlzb3IgdmFsdWVzICovCisJdmlhNjg2YV91cGRhdGVfZmFuX2RpdihkYXRhKTsKIH0KIAogc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC03NTEsOSArNzYzLDcgQEAKIAkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgogCQkgICAgIDB4YzApID4+IDY7CiAKLQkJaSA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19GQU5ESVYpOwotCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOwotCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OworCQl2aWE2ODZhX3VwZGF0ZV9mYW5fZGl2KGRhdGEpOwogCQlkYXRhLT5hbGFybXMgPQogCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsCiAJCQkJICAgICAgIFZJQTY4NkFfUkVHX0FMQVJNMSkgfApAQCAtNzkxLDIxICs4MDEsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2aWE2ODZhIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhNjg2YTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTY4NmE6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE2ODZhOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwppbmRleCBhZTMzYmJiLi40OTE2M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMjU0LDggKzEyNTYsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUOwogCX0KIApAQCAtMTI2NiwxNSArMTI2NywxMyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUX0RFVl9QVVQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIEVYSVRfREVWX1BVVDsKIAl9CiAKQEAgLTEzMDEsMjMgKzEzMDAsMjAgQEAKIAlzdXBlcmlvX3NlbGVjdChzaW9fY2lwLCBTSU9fVlQxMjExX0xETl9IV01PTik7CiAKIAlpZiAoKHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfQUNUSVZFKSAmIDEpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEhXIG1vbml0b3IgaXMgZGlzYWJsZWQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkhXIG1vbml0b3IgaXMgZGlzYWJsZWQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBFWElUOwogCX0KIAogCSphZGRyZXNzID0gKChzdXBlcmlvX2luYihzaW9fY2lwLCBTSU9fVlQxMjExX0JBRERSKSA8PCA4KSB8CiAJCSAgICAoc3VwZXJpb19pbmIoc2lvX2NpcCwgU0lPX1ZUMTIxMV9CQUREUiArIDEpKSkgJiAweGZmMDA7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEJhc2UgYWRkcmVzcyBpcyBub3Qgc2V0LCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3MgaXMgbm90IHNldCwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIEVYSVQ7CiAJfQogCiAJZXJyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCAiCi0JICAgICAgICJyZXZpc2lvbiAldVxuIiwgKmFkZHJlc3MsCi0JICAgICAgIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CisJcHJfaW5mbygiRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCByZXZpc2lvbiAldVxuIiwKKwkJKmFkZHJlc3MsIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CiAKIEVYSVQ6CiAJc3VwZXJpb19leGl0KHNpb19jaXApOwpAQCAtMTMzNiwxNSArMTMzMiwxNSBAQAogCiAJaWYgKCh1Y2hfY29uZmlnIDwgLTEpIHx8ICh1Y2hfY29uZmlnID4gMzEpKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCi0JCSAgICAgICAiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOworCQlwcl93YXJuKCJJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCisJCQkiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOwogCSAgZ290byBFWElUOwogCX0KIAogCWlmICgoaW50X21vZGUgPCAtMSkgfHwgKGludF9tb2RlID4gMCkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKLQkJICAgICAgICJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CisJCXByX3dhcm4oIkludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKKwkJCSJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CiAJICBnb3RvIEVYSVQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCBlNjA3OGM5Li5kYjNiMmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTI0LDYgKzI0LDggQEAKIC8qIFN1cHBvcnRzIFZJQSBWVDgyMzEgU291dGggQnJpZGdlIGVtYmVkZGVkIHNlbnNvcnMKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC05MDIsMjEgKzkwNCwxOSBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZ0ODIzMSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggMDcyYzU4MC4uMDczZWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC00Miw2ICs0Miw4IEBACiAgICAgdzgzNjY3aGctYiAgIDkgICAgICA1ICAgICAgIDMgICAgICAgMyAgICAgIDB4YjM1MCAweGMxICAgIDB4NWNhMwogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE2NjgsOCArMTY3MCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWlmICh2YWwgIT0gMHhmZmZmKQotCQkJcHJfZGVidWcoRFJWTkFNRSAiOiB1bnN1cHBvcnRlZCBjaGlwIElEOiAweCUwNHhcbiIsCi0JCQkJIHZhbCk7CisJCQlwcl9kZWJ1ZygidW5zdXBwb3J0ZWQgY2hpcCBJRDogMHglMDR4XG4iLCB2YWwpOwogCQlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE2ODAsOCArMTY4MSw3IEBACiAJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19BRERSICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBJT1JFR0lPTl9BTElHTk1FTlQ7CiAJaWYgKCphZGRyID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUmVmdXNpbmcgdG8gZW5hYmxlIGEgU3VwZXItSS9PICIKLQkJICAgICAgICJkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMC5cbiIpOworCQlwcl9lcnIoIlJlZnVzaW5nIHRvIGVuYWJsZSBhIFN1cGVyLUkvTyBkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMFxuIik7CiAJCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTY4OSwxMyArMTY4OSwxMiBAQAogCS8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2aWNlIGlmIG5lZWRlZCAqLwogCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRU5BQkxFKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRm9yY2libHkgZW5hYmxpbmcgU3VwZXItSS9PLiAiCi0JCSAgICAgICAiU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CisJCXByX3dhcm4oIkZvcmNpYmx5IGVuYWJsaW5nIFN1cGVyLUkvTy4gU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CiAJCXN1cGVyaW9fb3V0YihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSwgdmFsIHwgMHgwMSk7CiAJfQogCiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwotCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKKwlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKIAlzaW9fZGF0YS0+c2lvcmVnID0gc2lvYWRkcjsKIAogCXJldHVybiAwOwpAQCAtMTcyOSwxNCArMTcyOCwxNCBAQAogCiAJaWYgKCEocGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfdW5yZWdpc3RlcjsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJnNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHc4MzYyN2VoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMTc1MiwxNiArMTc1MSwxNCBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJLyogcGxhdGZvcm1fZGV2aWNlX2FkZCBjYWxscyBwcm9iZSgpICovCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCAzOGUyODA1Li5iZGU1MGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC0zOSw2ICszOSw4IEBACiAgICAgc3VwcG9ydGVkIHlldC4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMTY2LDE0ICsxMTY4LDEzIEBACiAJICAgICAgIHN1cGVyaW9faW5iKHNpb19kYXRhLCBXSU5CX0JBU0VfUkVHICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBXSU5CX0FMSUdOTUVOVDsKIAlpZiAoKmFkZHIgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkJhc2UgYWRkcmVzcyBub3Qgc2V0LCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl2YWwgPSBzdXBlcmlvX2luYihzaW9fZGF0YSwgV0lOQl9BQ1RfUkVHKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKKwkJcHJfd2FybigiRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKIAkJc3VwZXJpb19vdXRiKHNpb19kYXRhLCBXSU5CX0FDVF9SRUcsIHZhbCB8IDB4MDEpOwogCX0KIApAQCAtMTc4OSwyOCArMTc5MCwyNiBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGM4NGI5YjQuLmVlZDQzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC0zMyw2ICszMyw4IEBACiAKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xNzk4LDggKzE4MDAsNyBAQAogCSAqIGluZGl2aWR1YWxseSBmb3IgdGhlIHByb2JpbmcgcGhhc2UuICovCiAJZm9yIChwb3J0ID0gYWRkcmVzczsgcG9ydCA8IGFkZHJlc3MgKyBXODM3ODFEX0VYVEVOVDsgcG9ydCsrKSB7CiAJCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydCwgMSwgInc4Mzc4MWQiKSkgewotCQkJcHJfZGVidWcoInc4Mzc4MWQ6IEZhaWxlZCB0byByZXF1ZXN0IHBvcnQgMHgleFxuIiwKLQkJCQkgcG9ydCk7CisJCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIHJlcXVlc3QgcG9ydCAweCV4XG4iLCBwb3J0KTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogCX0KQEAgLTE4MTEsNyArMTgxMiw3IEBACiAJaWYgKGluYl9wKGFkZHJlc3MgKyAyKSAhPSB2YWwKIAkgfHwgaW5iX3AoYWRkcmVzcyArIDMpICE9IHZhbAogCSB8fCBpbmJfcChhZGRyZXNzICsgNykgIT0gdmFsKSB7Ci0JCXByX2RlYnVnKCJ3ODM3ODFkOiBEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgMVxuIik7CisJCXByX2RlYnVnKCJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgJWRcbiIsIDEpOwogCQlnb3RvIHJlbGVhc2U7CiAJfQogI3VuZGVmIFJFQUxMWV9TTE9XX0lPCkBAIC0xODIwLDE0ICsxODIxLDE0IEBACiAJICAgTVNCIChidXN5IGZsYWcpIHNob3VsZCBiZSBjbGVhciBpbml0aWFsbHksIHNldCBhZnRlciB0aGUgd3JpdGUuICovCiAJc2F2ZSA9IGluYl9wKGFkZHJlc3MgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CiAJaWYgKHNhdmUgJiAweDgwKSB7Ci0JCXByX2RlYnVnKCJ3ODM3ODFkOiBEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgMlxuIik7CisJCXByX2RlYnVnKCJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgJWRcbiIsIDIpOwogCQlnb3RvIHJlbGVhc2U7CiAJfQogCXZhbCA9IH5zYXZlICYgMHg3ZjsKIAlvdXRiX3AodmFsLCBhZGRyZXNzICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOwogCWlmIChpbmJfcChhZGRyZXNzICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpICE9ICh2YWwgfCAweDgwKSkgewogCQlvdXRiX3Aoc2F2ZSwgYWRkcmVzcyArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKLQkJcHJfZGVidWcoInc4Mzc4MWQ6IERldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAzXG4iKTsKKwkJcHJfZGVidWcoIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAlZFxuIiwgMyk7CiAJCWdvdG8gcmVsZWFzZTsKIAl9CiAKQEAgLTE4MzUsNyArMTgzNiw3IEBACiAJb3V0Yl9wKFc4Mzc4MURfUkVHX0NPTkZJRywgYWRkcmVzcyArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKTsKIAl2YWwgPSBpbmJfcChhZGRyZXNzICsgVzgzNzgxRF9EQVRBX1JFR19PRkZTRVQpOwogCWlmICh2YWwgJiAweDgwKSB7Ci0JCXByX2RlYnVnKCJ3ODM3ODFkOiBEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgNFxuIik7CisJCXByX2RlYnVnKCJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgJWRcbiIsIDQpOwogCQlnb3RvIHJlbGVhc2U7CiAJfQogCW91dGJfcChXODM3ODFEX1JFR19CQU5LLCBhZGRyZXNzICsgVzgzNzgxRF9BRERSX1JFR19PRkZTRVQpOwpAQCAtMTg0NCwxOSArMTg0NSwxOSBAQAogCXZhbCA9IGluYl9wKGFkZHJlc3MgKyBXODM3ODFEX0RBVEFfUkVHX09GRlNFVCk7CiAJaWYgKCghKHNhdmUgJiAweDgwKSAmJiAodmFsICE9IDB4YTMpKQogCSB8fCAoKHNhdmUgJiAweDgwKSAmJiAodmFsICE9IDB4NWMpKSkgewotCQlwcl9kZWJ1ZygidzgzNzgxZDogRGV0ZWN0aW9uIGZhaWxlZCBhdCBzdGVwIDVcbiIpOworCQlwcl9kZWJ1ZygiRGV0ZWN0aW9uIGZhaWxlZCBhdCBzdGVwICVkXG4iLCA1KTsKIAkJZ290byByZWxlYXNlOwogCX0KIAlvdXRiX3AoVzgzNzgxRF9SRUdfSTJDX0FERFIsIGFkZHJlc3MgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CiAJdmFsID0gaW5iX3AoYWRkcmVzcyArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKIAlpZiAodmFsIDwgMHgwMyB8fCB2YWwgPiAweDc3KSB7CS8qIE5vdCBhIHZhbGlkIEkyQyBhZGRyZXNzICovCi0JCXByX2RlYnVnKCJ3ODM3ODFkOiBEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgNlxuIik7CisJCXByX2RlYnVnKCJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgJWRcbiIsIDYpOwogCQlnb3RvIHJlbGVhc2U7CiAJfQogCiAJLyogVGhlIGJ1c3kgZmxhZyBzaG91bGQgYmUgY2xlYXIgYWdhaW4gKi8KIAlpZiAoaW5iX3AoYWRkcmVzcyArIFc4Mzc4MURfQUREUl9SRUdfT0ZGU0VUKSAmIDB4ODApIHsKLQkJcHJfZGVidWcoInc4Mzc4MWQ6IERldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCA3XG4iKTsKKwkJcHJfZGVidWcoIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAlZFxuIiwgNyk7CiAJCWdvdG8gcmVsZWFzZTsKIAl9CiAKQEAgLTE4NzEsNyArMTg3Miw3IEBACiAJCWZvdW5kID0gMTsKIAogCWlmIChmb3VuZCkKLQkJcHJfaW5mbygidzgzNzgxZDogRm91bmQgYSAlcyBjaGlwIGF0ICUjeFxuIiwKKwkJcHJfaW5mbygiRm91bmQgYSAlcyBjaGlwIGF0ICUjeFxuIiwKIAkJCXZhbCA9PSAweDMwID8gIlc4Mzc4MkQiIDogIlc4Mzc4MUQiLCAoaW50KWFkZHJlc3MpOwogCiAgcmVsZWFzZToKQEAgLTE4OTQsMjEgKzE4OTUsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ3ODM3ODFkIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAidzgzNzgxZDogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInc4Mzc4MWQ6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ3ODM3ODFkOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MmQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCmluZGV4IDY3OTcxOGUuLjYzODQxZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jCkBAIC02OTEsNyArNjkxLDcgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLXNob3dfcmVnc19jaGFzc2lzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCitzaG93X2NoYXNzaXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7CkBAIC02OTksNiArNjk5LDE2IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90CitzaG93X3JlZ3NfY2hhc3NpcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCWRldl93YXJuKGRldiwKKwkJICJBdHRyaWJ1dGUgJXMgaXMgZGVwcmVjYXRlZCwgdXNlIGludHJ1c2lvbjBfYWxhcm0gaW5zdGVhZFxuIiwKKwkJICJjaGFzc2lzIik7CisJcmV0dXJuIHNob3dfY2hhc3NpcyhkZXYsIGF0dHIsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CiBzaG93X2NoYXNzaXNfY2xlYXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKQEAgLTcwNiw3ICs3MTYsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotc3RvcmVfY2hhc3Npc19jbGVhcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorc3RvcmVfY2hhc3Npc19jbGVhcl9sZWdhY3koc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CkBAIC03MTQsNiArNzI0LDEwIEBACiAJdTMyIHZhbDsKIAl1OCB0ZW1wMSA9IDAsIHRlbXAyID0gMDsKIAorCWRldl93YXJuKGRldiwKKwkJICJBdHRyaWJ1dGUgJXMgaXMgZGVwcmVjYXRlZCwgdXNlIGludHJ1c2lvbjBfYWxhcm0gaW5zdGVhZFxuIiwKKwkJICJjaGFzc2lzX2NsZWFyIik7CisKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+Y2hhc3Npc19jbGVhciA9IFNFTlNPUlNfTElNSVQodmFsLCAwICwxKTsKQEAgLTcyNiw2ICs3NDAsMjcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV9jaGFzc2lzX2NsZWFyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1OCByZWc7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgfHwgdmFsICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZyA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0NIQVNTSVNfQ0xSKTsKKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfQ0hBU1NJU19DTFIsIHJlZyB8IDB4ODApOworCWRhdGEtPnZhbGlkID0gMDsJCS8qIEZvcmNlIGNhY2hlIHJlZnJlc2ggKi8KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogLyogRm9yIFNtYXJ0IEZhbiBJIC8gVGhlcm1hbCBDcnVpc2UgKi8KIHN0YXRpYyBzc2l6ZV90CiBzaG93X3RoZXJtYWxfY3J1aXNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xMDEyLDcgKzEwNDcsOSBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyMyk7CiBzdGF0aWMgREVWSUNFX0FUVFIoY2hhc3NpcywgU19JUlVHTywgc2hvd19yZWdzX2NoYXNzaXMsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGNoYXNzaXNfY2xlYXIsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19jaGFzc2lzX2NsZWFyLCBzdG9yZV9jaGFzc2lzX2NsZWFyKTsKKwkJCXNob3dfY2hhc3Npc19jbGVhciwgc3RvcmVfY2hhc3Npc19jbGVhcl9sZWdhY3kpOworc3RhdGljIERFVklDRV9BVFRSKGludHJ1c2lvbjBfYWxhcm0sIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19jaGFzc2lzLCBzdG9yZV9jaGFzc2lzX2NsZWFyKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcHdtLCBzdG9yZV9wd20sIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20yLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHN0b3JlX3B3bSwgMSk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAyKTsKQEAgLTEyMTQsNiArMTI1MSw3IEBACiAJJmRldl9hdHRyX2FsYXJtcy5hdHRyLAogCSZkZXZfYXR0cl9jaGFzc2lzLmF0dHIsCiAJJmRldl9hdHRyX2NoYXNzaXNfY2xlYXIuYXR0ciwKKwkmZGV2X2F0dHJfaW50cnVzaW9uMF9hbGFybS5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdG9sZXJhbmNlMS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGhlcm1hbF9jcnVpc2UxLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90b2xlcmFuY2UyLmRldl9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jIGIvZHJpdmVycy9od21vbi93ODM3OTMuYwppbmRleCA4ZTU0MGFkLi5lM2JkZWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNkZWZpbmUgV0FUQ0hET0dfVElNRU9VVCAyCS8qIDIgbWludXRlIGRlZmF1bHQgdGltZW91dCAqLwogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIERFRklORV9NVVRFWCh3YXRjaGRvZ19tdXRleCk7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCAweDJmLAogCQkJCQkJSTJDX0NMSUVOVF9FTkQgfTsKIApAQCAtNDIxLDE4ICs0MjAsNDMgQEAKIAogLyogV3JpdGUgYW55IHZhbHVlIHRvIGNsZWFyIGNoYXNzaXMgYWxhcm0gKi8KIHN0YXRpYyBzc2l6ZV90CitzdG9yZV9jaGFzc2lzX2NsZWFyX2xlZ2FjeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggdmFsOworCisJZGV2X3dhcm4oZGV2LCAiQXR0cmlidXRlIGNoYXNzaXMgaXMgZGVwcmVjYXRlZCwgIgorCQkgInVzZSBpbnRydXNpb24wX2FsYXJtIGluc3RlYWRcbiIpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXZhbCA9IHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DTFJfQ0hBU1NJUyk7CisJdmFsIHw9IDB4ODA7CisJdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DTFJfQ0hBU1NJUywgdmFsKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIFdyaXRlIDAgdG8gY2xlYXIgY2hhc3NpcyBhbGFybSAqLworc3RhdGljIHNzaXplX3QKIHN0b3JlX2NoYXNzaXNfY2xlYXIoc3RydWN0IGRldmljZSAqZGV2LAogCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXU4IHZhbDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl1OCByZWc7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgfHwgdmFsICE9IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXZhbCA9IHc4Mzc5M19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DTFJfQ0hBU1NJUyk7Ci0JdmFsIHw9IDB4ODA7Ci0JdzgzNzkzX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkzX1JFR19DTFJfQ0hBU1NJUywgdmFsKTsKKwlyZWcgPSB3ODM3OTNfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfQ0xSX0NIQVNTSVMpOworCXc4Mzc5M193cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5M19SRUdfQ0xSX0NIQVNTSVMsIHJlZyB8IDB4ODApOworCWRhdGEtPnZhbGlkID0gMDsJCS8qIEZvcmNlIGNhY2hlIHJlZnJlc2ggKi8KIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMTAyLDYgKzExMjYsOCBAQAogCiBzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgc2RhX3NpbmdsZV9maWxlc1tdID0gewogCVNFTlNPUl9BVFRSXzIoY2hhc3NpcywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYWxhcm1fYmVlcCwKKwkJICAgICAgc3RvcmVfY2hhc3Npc19jbGVhcl9sZWdhY3ksIEFMQVJNX1NUQVRVUywgMzApLAorCVNFTlNPUl9BVFRSXzIoaW50cnVzaW9uMF9hbGFybSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYWxhcm1fYmVlcCwKIAkJICAgICAgc3RvcmVfY2hhc3Npc19jbGVhciwgQUxBUk1fU1RBVFVTLCAzMCksCiAJU0VOU09SX0FUVFJfMihiZWVwX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYmVlcF9lbmFibGUsCiAJCSAgICAgIHN0b3JlX2JlZXBfZW5hYmxlLCBOT1RfVVNFRCwgTk9UX1VTRUQpLApAQCAtMTMyMyw3ICsxMzQ5LDcgQEAKIHN0YXRpYyBsb25nIHdhdGNoZG9nX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCXN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewogCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcgfAogCQkJICAgV0RJT0ZfU0VUVElNRU9VVCB8CiAJCQkgICBXRElPRl9DQVJEUkVTRVQsCkBAIC0xMzMzLDcgKzEzNTksNiBAQAogCWludCB2YWwsIHJldCA9IDA7CiAJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCi0JbXV0ZXhfbG9jaygmd2F0Y2hkb2dfbXV0ZXgpOwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgogCQlpZiAoIW5vd2F5b3V0KQpAQCAtMTM4Nyw3ICsxNDEyLDYgQEAKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PVFRZOwogCX0KLQltdXRleF91bmxvY2soJndhdGNoZG9nX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5NS5jIGIvZHJpdmVycy9od21vbi93ODM3OTUuYwppbmRleCBjZGJjNzQ0Li44NDUyMzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzk1LmMKQEAgLTQ1OCw2ICs0NTgsNyBAQAogewogCXN0cnVjdCB3ODM3OTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBpLCBsaW1pdDsKKwl1OCBsc2I7CiAKIAkvKiBSZWFkIHRoZSB2b2x0YWdlIGxpbWl0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPmluKTsgaSsrKSB7CkBAIC00NzksOSArNDgwLDggQEAKIAl9CiAKIAkvKiBSZWFkIHRoZSBmYW4gbGltaXRzICovCisJbHNiID0gMDsgLyogU2lsZW50IGZhbHNlIGdjYyB3YXJuaW5nICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+ZmFuKTsgaSsrKSB7Ci0JCXU4IGxzYjsKLQogCQkvKiBFYWNoIHJlZ2lzdGVyIGNvbnRhaW5zIExTQiBmb3IgMiBmYW5zLCBidXQgd2Ugd2FudCB0bwogCQkgKiByZWFkIGl0IG9ubHkgb25jZSB0byBzYXZlIHRpbWUgKi8KIAkJaWYgKChpICYgMSkgPT0gMCAmJiAoZGF0YS0+aGFzX2ZhbiAmICgzIDw8IGkpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKaW5kZXggYTM5ZTZjZi4uMzgzMTlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMKQEAgLTYwMCwxMiArNjAwLDE0IEBACiAvKgogICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lCiAgKi8KLXN0YXRpYyBpbnQgaTJjX2JpdF9wcmVwYXJlX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCitzdGF0aWMgaW50IF9faTJjX2JpdF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKKwkJCSAgICAgaW50ICgqYWRkX2FkYXB0ZXIpKHN0cnVjdCBpMmNfYWRhcHRlciAqKSkKIHsKIAlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgKmJpdF9hZGFwID0gYWRhcC0+YWxnb19kYXRhOworCWludCByZXQ7CiAKIAlpZiAoYml0X3Rlc3QpIHsKLQkJaW50IHJldCA9IHRlc3RfYnVzKGJpdF9hZGFwLCBhZGFwLT5uYW1lKTsKKwkJcmV0ID0gdGVzdF9idXMoYml0X2FkYXAsIGFkYXAtPm5hbWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTYxNCwzMCArNjE2LDI3IEBACiAJYWRhcC0+YWxnbyA9ICZpMmNfYml0X2FsZ287CiAJYWRhcC0+cmV0cmllcyA9IDM7CiAKKwlyZXQgPSBhZGRfYWRhcHRlcihhZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvbXBsYWluIGlmIFNDTCBjYW4ndCBiZSByZWFkICovCisJaWYgKGJpdF9hZGFwLT5nZXRzY2wgPT0gTlVMTCkgeworCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAiTm90IEkyQyBjb21wbGlhbnQ6IGNhbid0IHJlYWQgU0NMXG4iKTsKKwkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIkJ1cyBtYXkgYmUgdW5yZWxpYWJsZVxuIik7CisJfQogCXJldHVybiAwOwogfQogCiBpbnQgaTJjX2JpdF9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKLQlpbnQgZXJyOwotCi0JZXJyID0gaTJjX2JpdF9wcmVwYXJlX2J1cyhhZGFwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwlyZXR1cm4gX19pMmNfYml0X2FkZF9idXMoYWRhcCwgaTJjX2FkZF9hZGFwdGVyKTsKIH0KIEVYUE9SVF9TWU1CT0woaTJjX2JpdF9hZGRfYnVzKTsKIAogaW50IGkyY19iaXRfYWRkX251bWJlcmVkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IGVycjsKLQotCWVyciA9IGkyY19iaXRfcHJlcGFyZV9idXMoYWRhcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIoYWRhcCk7CisJcmV0dXJuIF9faTJjX2JpdF9hZGRfYnVzKGFkYXAsIGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcik7CiB9CiBFWFBPUlRfU1lNQk9MKGkyY19iaXRfYWRkX251bWJlcmVkX2J1cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggM2E2MzIxYy4uMTEzNTA1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTYzOCw2ICs2MzgsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHhpbGlueF9pMmMuCiAKK2NvbmZpZyBJMkNfRUcyMFQKKyAgICAgICAgdHJpc3RhdGUgIlBDSCBJMkMgb2YgSW50ZWwgRUcyMFQiCisgICAgICAgIGRlcGVuZHMgb24gUENJCisgICAgICAgIGhlbHAKKyAgICAgICAgICBUaGlzIGRyaXZlciBpcyBmb3IgUENIKFBsYXRmb3JtIGNvbnRyb2xsZXIgSHViKSBJMkMgb2YgRUcyMFQgd2hpY2gKKyAgICAgICAgICBpcyBhbiBJT0goSW5wdXQvT3V0cHV0IEh1YikgZm9yIHg4NiBlbWJlZGRlZCBwcm9jZXNzb3IuCisgICAgICAgICAgVGhpcyBkcml2ZXIgY2FuIGFjY2VzcyBQQ0ggSTJDIGJ1cyBkZXZpY2UuCisKIGNvbW1lbnQgIkV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMiCiAKIGNvbmZpZyBJMkNfUEFSUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IDg0Y2IxNmEuLjlkMmQwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTYxLDYgKzYxLDcgQEAKIG9iai0kKENPTkZJR19JMkNfVkVSU0FUSUxFKQkrPSBpMmMtdmVyc2F0aWxlLm8KIG9iai0kKENPTkZJR19JMkNfT0NURU9OKQkrPSBpMmMtb2N0ZW9uLm8KIG9iai0kKENPTkZJR19JMkNfWElMSU5YKQkrPSBpMmMteGlpYy5vCitvYmotJChDT05GSUdfSTJDX0VHMjBUKSAgICAgICAgICs9IGkyYy1lZzIwdC5vCiAKICMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwogb2JqLSQoQ09ORklHX0kyQ19QQVJQT1JUKQkrPSBpMmMtcGFycG9ydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKaW5kZXggZmIyNmU1Yy4uNTJiNTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KQEAgLTE1OSw2ICsxNjAsMjcgQEAKIAkJaWYgKG1hc3Rfc3RhdCAmIEJVRldSRVJSKQogCQkJZGV2X2RiZygmaWZhY2UtPmFkYXAuZGV2LCAiQnVmZmVyIFdyaXRlIEVycm9yXG4iKTsKIAorCQkvKiBGYXVsdHkgc2xhdmUgZGV2aWNlcywgbWF5IGRyaXZlIFNEQSBsb3cgYWZ0ZXIgYSB0cmFuc2ZlcgorCQkgKiBmaW5pc2hlcy4gVG8gcmVsZWFzZSB0aGUgYnVzIHRoaXMgY29kZSBnZW5lcmF0ZXMgdXAgdG8gOQorCQkgKiBleHRyYSBjbG9ja3MgdW50aWwgU0RBIGlzIHJlbGVhc2VkLgorCQkgKi8KKworCQlpZiAocmVhZF9NQVNURVJfU1RBVChpZmFjZSkgJiBTREFTRU4pIHsKKwkJCWludCBjbnQgPSA5OworCQkJZG8geworCQkJCXdyaXRlX01BU1RFUl9DVEwoaWZhY2UsIFNDTE9WUik7CisJCQkJdWRlbGF5KDYpOworCQkJCXdyaXRlX01BU1RFUl9DVEwoaWZhY2UsIDApOworCQkJCXVkZWxheSg2KTsKKwkJCX0gd2hpbGUgKChyZWFkX01BU1RFUl9TVEFUKGlmYWNlKSAmIFNEQVNFTikgJiYgY250LS0pOworCisJCQl3cml0ZV9NQVNURVJfQ1RMKGlmYWNlLCBTREFPVlIgfCBTQ0xPVlIpOworCQkJdWRlbGF5KDYpOworCQkJd3JpdGVfTUFTVEVSX0NUTChpZmFjZSwgU0RBT1ZSKTsKKwkJCXVkZWxheSg2KTsKKwkJCXdyaXRlX01BU1RFUl9DVEwoaWZhY2UsIDApOworCQl9CisKIAkJLyogSWYgaXQgaXMgYSBxdWljayB0cmFuc2Zlciwgb25seSBhZGRyZXNzIHdpdGhvdXQgZGF0YSwKIAkJICogbm90IGFuIGVyciwgcmV0dXJuIDEuCiAJCSAqLwpAQCAtNzYwLDcgKzc4Miw3IEBACiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmkyY19iZmluX3R3aV9kcml2ZXIpOwogfQogCi1tb2R1bGVfaW5pdChpMmNfYmZpbl90d2lfaW5pdCk7CitzdWJzeXNfaW5pdGNhbGwoaTJjX2JmaW5fdHdpX2luaXQpOwogbW9kdWxlX2V4aXQoaTJjX2JmaW5fdHdpX2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJCcnlhbiBXdSwgU29uaWMgWmhhbmciKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA2N2RkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC0wLDAgKzEsOTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE9LSSBTRU1JQ09ORFVDVE9SIENPLiwgTFRELgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisKKyNkZWZpbmUgUENIX0VWRU5UX1NFVAkwCS8qIEkyQyBJbnRlcnJ1cHQgRXZlbnQgU2V0IFN0YXR1cyAqLworI2RlZmluZSBQQ0hfRVZFTlRfTk9ORQkxCS8qIEkyQyBJbnRlcnJ1cHQgRXZlbnQgQ2xlYXIgU3RhdHVzICovCisjZGVmaW5lIFBDSF9NQVhfQ0xLCQkxMDAwMDAJLyogTWF4aW11bSBDbG9jayBzcGVlZCBpbiBNSHogKi8KKyNkZWZpbmUgUENIX0JVRkZFUl9NT0RFX0VOQUJMRQkweDAwMDIJLyogZmxhZyBmb3IgQnVmZmVyIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIFBDSF9FRVBST01fU1dfUlNUX01PREVfRU5BQkxFCTB4MDAwOAkvKiBFRVBST00gU1cgUlNUIGVuYWJsZSBmbGFnICovCisKKyNkZWZpbmUgUENIX0kyQ1NBRFIJMHgwMAkvKiBJMkMgc2xhdmUgYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDQ1RMCTB4MDQJLyogSTJDIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENIX0kyQ1NSCTB4MDgJLyogSTJDIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDRFIJMHgwQwkvKiBJMkMgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDTU9OCTB4MTAJLyogSTJDIGJ1cyBtb25pdG9yIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNCQwkweDE0CS8qIEkyQyBidXMgdHJhbnNmZXIgcmF0ZSBzZXR1cCBjb3VudGVyICovCisjZGVmaW5lIFBDSF9JMkNNT0QJMHgxOAkvKiBJMkMgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDQlVGU0xWCTB4MUMJLyogSTJDIGJ1ZmZlciBtb2RlIHNsYXZlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENIX0kyQ0JVRlNVQgkweDIwCS8qIEkyQyBidWZmZXIgbW9kZSBzdWJhZGRyZXNzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNCVUZGT1IJMHgyNAkvKiBJMkMgYnVmZmVyIG1vZGUgZm9ybWF0IHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNCVUZDVEwJMHgyOAkvKiBJMkMgYnVmZmVyIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDQlVGTVNLCTB4MkMJLyogSTJDIGJ1ZmZlciBtb2RlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNCVUZTVEEJMHgzMAkvKiBJMkMgYnVmZmVyIG1vZGUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNCVUZMRVYJMHgzNAkvKiBJMkMgYnVmZmVyIG1vZGUgbGV2ZWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENIX0kyQ0VTUkZPUgkweDM4CS8qIEVFUFJPTSBzb2Z0d2FyZSByZXNldCBtb2RlIGZvcm1hdCByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDRVNSQ1RMCTB4M0MJLyogRUVQUk9NIHNvZnR3YXJlIHJlc2V0IG1vZGUgY3RybCByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDRVNSTVNLCTB4NDAJLyogRUVQUk9NIHNvZnR3YXJlIHJlc2V0IG1vZGUgKi8KKyNkZWZpbmUgUENIX0kyQ0VTUlNUQQkweDQ0CS8qIEVFUFJPTSBzb2Z0d2FyZSByZXNldCBtb2RlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBQQ0hfSTJDVE1SCTB4NDgJLyogSTJDIHRpbWVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNTUlNUCTB4RkMJLyogSTJDIHJlc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFBDSF9JMkNORgkweEY4CS8qIEkyQyBub2lzZSBmaWx0ZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBCVVNfSURMRV9USU1FT1VUCTIwCisjZGVmaW5lIFBDSF9JMkNDVExfSTJDTUVOCTB4MDA4MAorI2RlZmluZSBURU5fQklUX0FERFJfREVGQVVMVAkweEYwMDAKKyNkZWZpbmUgVEVOX0JJVF9BRERSX01BU0sJMHhGMAorI2RlZmluZSBQQ0hfU1RBUlQJCTB4MDAyMAorI2RlZmluZSBQQ0hfRVNSX1NUQVJUCQkweDAwMDEKKyNkZWZpbmUgUENIX0JVRkZfU1RBUlQJCTB4MQorI2RlZmluZSBQQ0hfUkVQU1RBUlQJCTB4MDAwNAorI2RlZmluZSBQQ0hfQUNLCQkJMHgwMDA4CisjZGVmaW5lIFBDSF9HRVRBQ0sJCTB4MDAwMQorI2RlZmluZSBDTFJfUkVHCQkJMHgwCisjZGVmaW5lIEkyQ19SRAkJCTB4MQorI2RlZmluZSBJMkNNQ0ZfQklUCQkweDAwODAKKyNkZWZpbmUgSTJDTUlGX0JJVAkJMHgwMDAyCisjZGVmaW5lIEkyQ01BTF9CSVQJCTB4MDAxMAorI2RlZmluZSBJMkNCTUZJX0JJVAkJMHgwMDAxCisjZGVmaW5lIEkyQ0JNQUxfQklUCQkweDAwMDIKKyNkZWZpbmUgSTJDQk1OQV9CSVQJCTB4MDAwNAorI2RlZmluZSBJMkNCTVRPX0JJVAkJMHgwMDA4CisjZGVmaW5lIEkyQ0JNSVNfQklUCQkweDAwMTAKKyNkZWZpbmUgSTJDRVNSRklfQklUCQkwWDAwMDEKKyNkZWZpbmUgSTJDRVNSVE9fQklUCQkweDAwMDIKKyNkZWZpbmUgSTJDRVNSRklJRV9CSVQJCTB4MQorI2RlZmluZSBJMkNFU1JUT0lFX0JJVAkJMHgyCisjZGVmaW5lIEkyQ0JNRFpfQklUCQkweDAwNDAKKyNkZWZpbmUgSTJDQk1BR19CSVQJCTB4MDAyMAorI2RlZmluZSBJMkNNQkJfQklUCQkweDAwMjAKKyNkZWZpbmUgQlVGRkVSX01PREVfTUFTSwkoSTJDQk1GSV9CSVQgfCBJMkNCTUFMX0JJVCB8IEkyQ0JNTkFfQklUIHwgXAorCQkJCUkyQ0JNVE9fQklUIHwgSTJDQk1JU19CSVQpCisjZGVmaW5lIEkyQ19BRERSX01TSwkJMHhGRgorI2RlZmluZSBJMkNfTVNCXzJCX01TSwkJMHgzMDAKKyNkZWZpbmUgRkFTVF9NT0RFX0NMSwkJNDAwCisjZGVmaW5lIEZBU1RfTU9ERV9FTgkJMHgwMDAxCisjZGVmaW5lIFNVQl9BRERSX0xFTl9NQVgJNAorI2RlZmluZSBCVUZfTEVOX01BWAkJMzIKKyNkZWZpbmUgUENIX0JVRkZFUl9NT0RFCQkweDEKKyNkZWZpbmUgRUVQUk9NX1NXX1JTVF9NT0RFCTB4MDAwMgorI2RlZmluZSBOT1JNQUxfSU5UUl9FTkJMCTB4MDMwMAorI2RlZmluZSBFRVBST01fUlNUX0lOVFJfRU5CTAkoSTJDRVNSRklJRV9CSVQgfCBJMkNFU1JUT0lFX0JJVCkKKyNkZWZpbmUgRUVQUk9NX1JTVF9JTlRSX0RJU0JMCTB4MAorI2RlZmluZSBCVUZGRVJfTU9ERV9JTlRSX0VOQkwJMHgwMDFGCisjZGVmaW5lIEJVRkZFUl9NT0RFX0lOVFJfRElTQkwJMHgwCisjZGVmaW5lIE5PUk1BTF9NT0RFCQkweDAKKyNkZWZpbmUgQlVGRkVSX01PREUJCTB4MQorI2RlZmluZSBFRVBST01fU1JfTU9ERQkJMHgyCisjZGVmaW5lIEkyQ19UWF9NT0RFCQkweDAwMTAKKyNkZWZpbmUgUENIX0JVRl9UWAkJMHhGRkY3CisjZGVmaW5lIFBDSF9CVUZfUkQJCTB4MDAwOAorI2RlZmluZSBJMkNfRVJST1JfTUFTSwkoSTJDRVNSVE9fRVZFTlQgfCBJMkNCTUlTX0VWRU5UIHwgSTJDQk1UT19FVkVOVCB8IFwKKwkJCUkyQ0JNTkFfRVZFTlQgfCBJMkNCTUFMX0VWRU5UIHwgSTJDTUFMX0VWRU5UKQorI2RlZmluZSBJMkNNQUxfRVZFTlQJCTB4MDAwMQorI2RlZmluZSBJMkNNQ0ZfRVZFTlQJCTB4MDAwMgorI2RlZmluZSBJMkNCTUZJX0VWRU5UCQkweDAwMDQKKyNkZWZpbmUgSTJDQk1BTF9FVkVOVAkJMHgwMDA4CisjZGVmaW5lIEkyQ0JNTkFfRVZFTlQJCTB4MDAxMAorI2RlZmluZSBJMkNCTVRPX0VWRU5UCQkweDAwMjAKKyNkZWZpbmUgSTJDQk1JU19FVkVOVAkJMHgwMDQwCisjZGVmaW5lIEkyQ0VTUkZJX0VWRU5UCQkweDAwODAKKyNkZWZpbmUgSTJDRVNSVE9fRVZFTlQJCTB4MDEwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BDSF9JMkMJMHg4ODE3CisKKyNkZWZpbmUgcGNoX2RiZyhhZGFwLCBmbXQsIGFyZy4uLikgIFwKKwlkZXZfZGJnKGFkYXAtPnBjaF9hZGFwdGVyLmRldi5wYXJlbnQsICIlcyA6IiBmbXQsIF9fZnVuY19fLCAjI2FyZykKKworI2RlZmluZSBwY2hfZXJyKGFkYXAsIGZtdCwgYXJnLi4uKSAgXAorCWRldl9lcnIoYWRhcC0+cGNoX2FkYXB0ZXIuZGV2LnBhcmVudCwgIiVzIDoiIGZtdCwgX19mdW5jX18sICMjYXJnKQorCisjZGVmaW5lIHBjaF9wY2lfZXJyKHBkZXYsIGZtdCwgYXJnLi4uKSAgXAorCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIDoiIGZtdCwgX19mdW5jX18sICMjYXJnKQorCisjZGVmaW5lIHBjaF9wY2lfZGJnKHBkZXYsIGZtdCwgYXJnLi4uKSAgXAorCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIDoiIGZtdCwgX19mdW5jX18sICMjYXJnKQorCisvKioKKyAqIHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAtIGZvciBJMkMgZHJpdmVyIGZ1bmN0aW9uYWxpdGllcworICogQHBjaF9hZGFwdGVyOgkJc3RvcmVzIHRoZSByZWZlcmVuY2UgdG8gaTJjX2FkYXB0ZXIgc3RydWN0dXJlCisgKiBAcF9hZGFwdGVyX2luZm86CQlzdG9yZXMgdGhlIHJlZmVyZW5jZSB0byBhZGFwdGVyX2luZm8gc3RydWN0dXJlCisgKiBAcGNoX2Jhc2VfYWRkcmVzczoJCXNwZWNpZmllcyB0aGUgcmVtYXBwZWQgYmFzZSBhZGRyZXNzCisgKiBAcGNoX2J1ZmZfbW9kZV9lbjoJCXNwZWNpZmllcyBpZiBidWZmZXIgbW9kZSBpcyBlbmFibGVkCisgKiBAcGNoX2V2ZW50X2ZsYWc6CQlzcGVjaWZpZXMgb2NjdXJyZW5jZSBvZiBpbnRlcnJ1cHQgZXZlbnRzCisgKiBAcGNoX2kyY194ZmVyX2luX3Byb2dyZXNzOglzcGVjaWZpZXMgd2hldGhlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVkCisgKi8KK3N0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSB7CisJc3RydWN0IGkyY19hZGFwdGVyIHBjaF9hZGFwdGVyOworCXN0cnVjdCBhZGFwdGVyX2luZm8gKnBfYWRhcHRlcl9pbmZvOworCXZvaWQgX19pb21lbSAqcGNoX2Jhc2VfYWRkcmVzczsKKwlpbnQgcGNoX2J1ZmZfbW9kZV9lbjsKKwl1MzIgcGNoX2V2ZW50X2ZsYWc7CisJYm9vbCBwY2hfaTJjX3hmZXJfaW5fcHJvZ3Jlc3M7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZGFwdGVyX2luZm8gLSBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgYWRhcHRlciBpbmZvcm1hdGlvbiBmb3IgdGhlCisJCQkgUENIIGkyYyBjb250cm9sbGVyCisgKiBAcGNoX2RhdGE6CQlzdG9yZXMgYSBsaXN0IG9mIGkyY19hbGdvX3BjaF9kYXRhCisgKiBAcGNoX2kyY19zdXNwZW5kZWQ6CXNwZWNpZmllcyB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIG9yIG5vdAorICoJCQlwZXJoYXBzIHdpdGggbW9yZSBsaW5lcyBhbmQgd29yZHMuCisgKgorICogcGNoX2RhdGEgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgbWF4aW11bSBJMkMgY2hhbm5lbHMKKyAqLworc3RydWN0IGFkYXB0ZXJfaW5mbyB7CisJc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhIHBjaF9kYXRhOworCWJvb2wgcGNoX2kyY19zdXNwZW5kZWQ7Cit9OworCisKK3N0YXRpYyBpbnQgcGNoX2kyY19zcGVlZCA9IDEwMDsgLyogSTJDIGJ1cyBzcGVlZCBpbiBLYnBzICovCitzdGF0aWMgaW50IHBjaF9jbGsgPSA1MDAwMDsJLyogc3BlY2lmaWVzIEkyQyBjbG9jayBzcGVlZCBpbiBLSHogKi8KK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBwY2hfZXZlbnQ7CitzdGF0aWMgREVGSU5FX01VVEVYKHBjaF9tdXRleCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2RldmluaXRkYXRhIHBjaF9wY2lkZXZfaWRbXSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX1BDSF9JMkMpfSwKKwl7MCx9Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNoX2kyY19oYW5kbGVyKGludCBpcnEsIHZvaWQgKnBEYXRhKTsKKworc3RhdGljIGlubGluZSB2b2lkIHBjaF9zZXRiaXQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0LCB1MzIgYml0bWFzaykKK3sKKwl1MzIgdmFsOworCXZhbCA9IGlvcmVhZDMyKGFkZHIgKyBvZmZzZXQpOworCXZhbCB8PSBiaXRtYXNrOworCWlvd3JpdGUzMih2YWwsIGFkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNoX2NscmJpdCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiBiaXRtYXNrKQoreworCXUzMiB2YWw7CisJdmFsID0gaW9yZWFkMzIoYWRkciArIG9mZnNldCk7CisJdmFsICY9ICh+Yml0bWFzayk7CisJaW93cml0ZTMyKHZhbCwgYWRkciArIG9mZnNldCk7Cit9CisKKy8qKgorICogcGNoX2kyY19pbml0KCkgLSBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiBvZiBJMkMgbW9kdWxlCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9pMmNfaW5pdChzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCit7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwl1MzIgcGNoX2kyY2JjOworCXUzMiBwY2hfaTJjdG1yOworCXUzMiByZWdfdmFsdWU7CisKKwkvKiByZXNldCBJMkMgY29udHJvbGxlciAqLworCWlvd3JpdGUzMigweDAxLCBwICsgUENIX0kyQ1NSU1QpOworCW1zbGVlcCgyMCk7CisJaW93cml0ZTMyKDB4MCwgcCArIFBDSF9JMkNTUlNUKTsKKworCS8qIEluaXRpYWxpemUgSTJDIHJlZ2lzdGVycyAqLworCWlvd3JpdGUzMigweDIxLCBwICsgUENIX0kyQ05GKTsKKworCXBjaF9zZXRiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ0NUTCwKKwkJCSAgUENIX0kyQ0NUTF9JMkNNRU4pOworCisJaWYgKHBjaF9pMmNfc3BlZWQgIT0gNDAwKQorCQlwY2hfaTJjX3NwZWVkID0gMTAwOworCisJcmVnX3ZhbHVlID0gUENIX0kyQ0NUTF9JMkNNRU47CisJaWYgKHBjaF9pMmNfc3BlZWQgPT0gRkFTVF9NT0RFX0NMSykgeworCQlyZWdfdmFsdWUgfD0gRkFTVF9NT0RFX0VOOworCQlwY2hfZGJnKGFkYXAsICJGYXN0IG1vZGUgZW5hYmxlZFxuIik7CisJfQorCisJaWYgKHBjaF9jbGsgPiBQQ0hfTUFYX0NMSykKKwkJcGNoX2NsayA9IDYyNTAwOworCisJcGNoX2kyY2JjID0gKHBjaF9jbGsgKyAocGNoX2kyY19zcGVlZCAqIDQpKSAvIHBjaF9pMmNfc3BlZWQgKiA4OworCS8qIFNldCB0cmFuc2ZlciBzcGVlZCBpbiBJMkNCQyAqLworCWlvd3JpdGUzMihwY2hfaTJjYmMsIHAgKyBQQ0hfSTJDQkMpOworCisJcGNoX2kyY3RtciA9IChwY2hfY2xrKSAvIDg7CisJaW93cml0ZTMyKHBjaF9pMmN0bXIsIHAgKyBQQ0hfSTJDVE1SKTsKKworCXJlZ192YWx1ZSB8PSBOT1JNQUxfSU5UUl9FTkJMOwkvKiBFbmFibGUgaW50ZXJydXB0cyBpbiBub3JtYWwgbW9kZSAqLworCWlvd3JpdGUzMihyZWdfdmFsdWUsIHAgKyBQQ0hfSTJDQ1RMKTsKKworCXBjaF9kYmcoYWRhcCwKKwkJIkkyQ0NUTD0leCBwY2hfaTJjYmM9JXggcGNoX2kyY3Rtcj0leCBFbmFibGUgaW50ZXJydXB0c1xuIiwKKwkJaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpLCBwY2hfaTJjYmMsIHBjaF9pMmN0bXIpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNoX2V2ZW50KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGt0aW1lX2x0KGNvbnN0IGt0aW1lX3QgY21wMSwgY29uc3Qga3RpbWVfdCBjbXAyKQoreworCXJldHVybiBjbXAxLnR2NjQgPCBjbXAyLnR2NjQ7Cit9CisKKy8qKgorICogcGNoX2kyY193YWl0X2Zvcl9idXNfaWRsZSgpIC0gY2hlY2sgdGhlIHN0YXR1cyBvZiBidXMuCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKiBAdGltZW91dDoJd2FpdGluZyB0aW1lIGNvdW50ZXIgKHVzKS4KKyAqLworc3RhdGljIHMzMiBwY2hfaTJjX3dhaXRfZm9yX2J1c19pZGxlKHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCwKKwkJCQkgczMyIHRpbWVvdXQpCit7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKworCS8qIE1BWCB0aW1lb3V0IHZhbHVlIGlzIHRpbWVvdXQqMTAwMCoxMDAwbnNlYyAqLworCWt0aW1lX3QgbnNfdmFsID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCB0aW1lb3V0KjEwMDAqMTAwMCk7CisJZG8geworCQlpZiAoKGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpICYgSTJDTUJCX0JJVCkgPT0gMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMjApOworCX0gd2hpbGUgKGt0aW1lX2x0KGt0aW1lX2dldCgpLCBuc192YWwpKTsKKworCXBjaF9kYmcoYWRhcCwgIkkyQ1NSID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpKTsKKworCWlmICh0aW1lb3V0ID09IDApIHsKKwkJcGNoX2VycihhZGFwLCAiJXM6IFRpbWVvdXQgRXJyb3IucmV0dXJuJWRcbiIsIF9fZnVuY19fLCAtRVRJTUUpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBjaF9pMmNfc3RhcnQoKSAtIEdlbmVyYXRlIEkyQyBzdGFydCBjb25kaXRpb24gaW4gbm9ybWFsIG1vZGUuCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKgorICogR2VuZXJhdGUgSTJDIHN0YXJ0IGNvbmRpdGlvbiBpbiBub3JtYWwgbW9kZSBieSBzZXR0aW5nIEkyQ0NUTC5JMkNNU1RBIHRvIDEuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9pMmNfc3RhcnQoc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQoreworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisJcGNoX2RiZyhhZGFwLCAiSTJDQ1RMID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQQ0hfSTJDQ1RMKSk7CisJcGNoX3NldGJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfU1RBUlQpOworfQorCisvKioKKyAqIHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZSgpIC0gaW5pdGlhdGVzIGEgd2FpdCBmb3IgdGhlIHR4IGNvbXBsZXRlIGV2ZW50CisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKi8KK3N0YXRpYyBzMzIgcGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKK3sKKwlzMzIgcmV0OworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwY2hfZXZlbnQsCisJCQkoYWRhcC0+cGNoX2V2ZW50X2ZsYWcgIT0gMCksIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwlpZiAocmV0IDwgMCkgeworCQlwY2hfZXJyKGFkYXAsICJ0aW1lb3V0OiAleFxuIiwgYWRhcC0+cGNoX2V2ZW50X2ZsYWcpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXQgPT0gMCkgeworCQlwY2hfZXJyKGFkYXAsICJ0aW1lb3V0OiAleFxuIiwgYWRhcC0+cGNoX2V2ZW50X2ZsYWcpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpZiAoYWRhcC0+cGNoX2V2ZW50X2ZsYWcgJiBJMkNfRVJST1JfTUFTSykgeworCQlwY2hfZXJyKGFkYXAsICJlcnJvciBiaXRzIHNldDogJXhcbiIsIGFkYXAtPnBjaF9ldmVudF9mbGFnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYWRhcC0+cGNoX2V2ZW50X2ZsYWcgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGNoX2kyY19nZXRhY2soKSAtIHRvIGNvbmZpcm0gQUNLL05BQ0sKKyAqIEBhZGFwOglQb2ludGVyIHRvIHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YS4KKyAqLworc3RhdGljIHMzMiBwY2hfaTJjX2dldGFjayhzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCit7CisJdTMyIHJlZ192YWw7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlyZWdfdmFsID0gaW9yZWFkMzIocCArIFBDSF9JMkNTUikgJiBQQ0hfR0VUQUNLOworCisJaWYgKHJlZ192YWwgIT0gMCkgeworCQlwY2hfZXJyKGFkYXAsICJyZXR1cm4lZFxuIiwgLUVQUk9UTyk7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBjaF9pMmNfc3RvcCgpIC0gZ2VuZXJhdGUgc3RvcCBjb25kaXRpb24gaW4gbm9ybWFsIG1vZGUuCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9pMmNfc3RvcChzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCit7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlwY2hfZGJnKGFkYXAsICJJMkNDVEwgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpKTsKKwkvKiBjbGVhciB0aGUgc3RhcnQgYml0ICovCisJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfU1RBUlQpOworfQorCisvKioKKyAqIHBjaF9pMmNfcmVwc3RhcnQoKSAtIGdlbmVyYXRlIHJlcGVhdGVkIHN0YXJ0IGNvbmRpdGlvbiBpbiBub3JtYWwgbW9kZQorICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgorICovCitzdGF0aWMgdm9pZCBwY2hfaTJjX3JlcHN0YXJ0KHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKK3sKKwl2b2lkIF9faW9tZW0gKnAgPSBhZGFwLT5wY2hfYmFzZV9hZGRyZXNzOworCXBjaF9kYmcoYWRhcCwgIkkyQ0NUTCA9ICV4XG4iLCBpb3JlYWQzMihwICsgUENIX0kyQ0NUTCkpOworCXBjaF9zZXRiaXQoYWRhcC0+cGNoX2Jhc2VfYWRkcmVzcywgUENIX0kyQ0NUTCwgUENIX1JFUFNUQVJUKTsKK30KKworLyoqCisgKiBwY2hfaTJjX3dyaXRlYnl0ZXMoKSAtIHdyaXRlIGRhdGEgdG8gSTJDIGJ1cyBpbiBub3JtYWwgbW9kZQorICogQGkyY19hZGFwOglQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaTJjX2FkYXB0ZXIuCisgKiBAbGFzdDoJc3BlY2lmaWVzIHdoZXRoZXIgbGFzdCBtZXNzYWdlIG9yIG5vdC4KKyAqCQlJbiB0aGUgY2FzZSBvZiBjb21wb3VuZCBtb2RlIGl0IHdpbGwgYmUgMSBmb3IgbGFzdCBtZXNzYWdlLAorICoJCW90aGVyd2lzZSAwLgorICogQGZpcnN0OglzcGVjaWZpZXMgd2hldGhlciBmaXJzdCBtZXNzYWdlIG9yIG5vdC4KKyAqCQkxIGZvciBmaXJzdCBtZXNzYWdlIG90aGVyd2lzZSAwLgorICovCitzdGF0aWMgczMyIHBjaF9pMmNfd3JpdGVieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLAorCQkJICAgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsIHUzMiBsYXN0LCB1MzIgZmlyc3QpCit7CisJc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKKwl1OCAqYnVmOworCXUzMiBsZW5ndGg7CisJdTMyIGFkZHI7CisJdTMyIGFkZHJfMl9tc2I7CisJdTMyIGFkZHJfOF9sc2I7CisJczMyIHdyY291bnQ7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKworCWxlbmd0aCA9IG1zZ3MtPmxlbjsKKwlidWYgPSBtc2dzLT5idWY7CisJYWRkciA9IG1zZ3MtPmFkZHI7CisKKwkvKiBlbmFibGUgbWFzdGVyIHR4ICovCisJcGNoX3NldGJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBJMkNfVFhfTU9ERSk7CisKKwlwY2hfZGJnKGFkYXAsICJJMkNDVEwgPSAleCBtc2dzLT5sZW4gPSAlZFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpLAorCQlsZW5ndGgpOworCisJaWYgKGZpcnN0KSB7CisJCWlmIChwY2hfaTJjX3dhaXRfZm9yX2J1c19pZGxlKGFkYXAsIEJVU19JRExFX1RJTUVPVVQpID09IC1FVElNRSkKKwkJCXJldHVybiAtRVRJTUU7CisJfQorCisJaWYgKG1zZ3MtPmZsYWdzICYgSTJDX01fVEVOKSB7CisJCWFkZHJfMl9tc2IgPSAoKGFkZHIgJiBJMkNfTVNCXzJCX01TSykgPj4gNyk7CisJCWlvd3JpdGUzMihhZGRyXzJfbXNiIHwgVEVOX0JJVF9BRERSX01BU0ssIHAgKyBQQ0hfSTJDRFIpOworCQlpZiAoZmlyc3QpCisJCQlwY2hfaTJjX3N0YXJ0KGFkYXApOworCQlpZiAocGNoX2kyY193YWl0X2Zvcl94ZmVyX2NvbXBsZXRlKGFkYXApID09IDAgJiYKKwkJICAgIHBjaF9pMmNfZ2V0YWNrKGFkYXApID09IDApIHsKKwkJCWFkZHJfOF9sc2IgPSAoYWRkciAmIEkyQ19BRERSX01TSyk7CisJCQlpb3dyaXRlMzIoYWRkcl84X2xzYiwgcCArIFBDSF9JMkNEUik7CisJCX0gZWxzZSB7CisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfSBlbHNlIHsKKwkJLyogc2V0IDcgYml0IHNsYXZlIGFkZHJlc3MgYW5kIFIvVyBiaXQgYXMgMCAqLworCQlpb3dyaXRlMzIoYWRkciA8PCAxLCBwICsgUENIX0kyQ0RSKTsKKwkJaWYgKGZpcnN0KQorCQkJcGNoX2kyY19zdGFydChhZGFwKTsKKwl9CisKKwlpZiAoKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwKSAmJgorCSAgICAocGNoX2kyY19nZXRhY2soYWRhcCkgPT0gMCkpIHsKKwkJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbmd0aDsgKyt3cmNvdW50KSB7CisJCQkvKiB3cml0ZSBidWZmZXIgdmFsdWUgdG8gSTJDIGRhdGEgcmVnaXN0ZXIgKi8KKwkJCWlvd3JpdGUzMihidWZbd3Jjb3VudF0sIHAgKyBQQ0hfSTJDRFIpOworCQkJcGNoX2RiZyhhZGFwLCAid3JpdGluZyAleCB0byBEYXRhIHJlZ2lzdGVyXG4iLAorCQkJCWJ1Zlt3cmNvdW50XSk7CisKKwkJCWlmIChwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCkgIT0gMCkKKwkJCQlyZXR1cm4gLUVUSU1FOworCisJCQlpZiAocGNoX2kyY19nZXRhY2soYWRhcCkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IG1lc3NhZ2UgKi8KKwkJaWYgKGxhc3QpCisJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCWVsc2UKKwkJCXBjaF9pMmNfcmVwc3RhcnQoYWRhcCk7CisJfSBlbHNlIHsKKwkJcGNoX2kyY19zdG9wKGFkYXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwY2hfZGJnKGFkYXAsICJyZXR1cm49JWRcbiIsIHdyY291bnQpOworCisJcmV0dXJuIHdyY291bnQ7Cit9CisKKy8qKgorICogcGNoX2kyY19zZW5kYWNrKCkgLSBzZW5kIEFDSworICogQGFkYXA6CVBvaW50ZXIgdG8gc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhLgorICovCitzdGF0aWMgdm9pZCBwY2hfaTJjX3NlbmRhY2soc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQoreworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisJcGNoX2RiZyhhZGFwLCAiSTJDQ1RMID0gJXhcbiIsIGlvcmVhZDMyKHAgKyBQQ0hfSTJDQ1RMKSk7CisJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDQ1RMLCBQQ0hfQUNLKTsKK30KKworLyoqCisgKiBwY2hfaTJjX3NlbmRuYWNrKCkgLSBzZW5kIE5BQ0sKKyAqIEBhZGFwOglQb2ludGVyIHRvIHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YS4KKyAqLworc3RhdGljIHZvaWQgcGNoX2kyY19zZW5kbmFjayhzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXApCit7CisJdm9pZCBfX2lvbWVtICpwID0gYWRhcC0+cGNoX2Jhc2VfYWRkcmVzczsKKwlwY2hfZGJnKGFkYXAsICJJMkNDVEwgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNDVEwpKTsKKwlwY2hfc2V0Yml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIFBDSF9BQ0spOworfQorCisvKioKKyAqIHBjaF9pMmNfcmVhZGJ5dGVzKCkgLSByZWFkIGRhdGEgIGZyb20gSTJDIGJ1cyBpbiBub3JtYWwgbW9kZS4KKyAqIEBpMmNfYWRhcDoJUG9pbnRlciB0byB0aGUgc3RydWN0IGkyY19hZGFwdGVyLgorICogQG1zZ3M6CVBvaW50ZXIgdG8gaTJjX21zZyBzdHJ1Y3R1cmUuCisgKiBAbGFzdDoJc3BlY2lmaWVzIHdoZXRoZXIgbGFzdCBtZXNzYWdlIG9yIG5vdC4KKyAqIEBmaXJzdDoJc3BlY2lmaWVzIHdoZXRoZXIgZmlyc3QgbWVzc2FnZSBvciBub3QuCisgKi8KK3MzMiBwY2hfaTJjX3JlYWRieXRlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywKKwkJICB1MzIgbGFzdCwgdTMyIGZpcnN0KQoreworCXN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwl1OCAqYnVmOworCXUzMiBjb3VudDsKKwl1MzIgbGVuZ3RoOworCXUzMiBhZGRyOworCXUzMiBhZGRyXzJfbXNiOworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisKKwlsZW5ndGggPSBtc2dzLT5sZW47CisJYnVmID0gbXNncy0+YnVmOworCWFkZHIgPSBtc2dzLT5hZGRyOworCisJLyogZW5hYmxlIG1hc3RlciByZWNlcHRpb24gKi8KKwlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIEkyQ19UWF9NT0RFKTsKKworCWlmIChmaXJzdCkgeworCQlpZiAocGNoX2kyY193YWl0X2Zvcl9idXNfaWRsZShhZGFwLCBCVVNfSURMRV9USU1FT1VUKSA9PSAtRVRJTUUpCisJCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmIChtc2dzLT5mbGFncyAmIEkyQ19NX1RFTikgeworCQlhZGRyXzJfbXNiID0gKCgoYWRkciAmIEkyQ19NU0JfMkJfTVNLKSA+PiA3KSB8IChJMkNfUkQpKTsKKwkJaW93cml0ZTMyKGFkZHJfMl9tc2IgfCBURU5fQklUX0FERFJfTUFTSywgcCArIFBDSF9JMkNEUik7CisKKwl9IGVsc2UgeworCQkvKiA3IGFkZHJlc3MgYml0cyArIFIvVyBiaXQgKi8KKwkJYWRkciA9ICgoKGFkZHIpIDw8IDEpIHwgKEkyQ19SRCkpOworCQlpb3dyaXRlMzIoYWRkciwgcCArIFBDSF9JMkNEUik7CisJfQorCisJLyogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IG1lc3NhZ2UgKi8KKwlpZiAoZmlyc3QpCisJCXBjaF9pMmNfc3RhcnQoYWRhcCk7CisKKwlpZiAoKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSA9PSAwKSAmJgorCSAgICAocGNoX2kyY19nZXRhY2soYWRhcCkgPT0gMCkpIHsKKwkJcGNoX2RiZyhhZGFwLCAicmV0dXJuICVkXG4iLCAwKTsKKworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJCWlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOyAvKiBEdW1teSByZWFkIG5lZWRzICovCisKKwkJCWNvdW50ID0gbGVuZ3RoOworCQl9IGVsc2UgeworCQkJaW50IHJlYWRfaW5kZXg7CisJCQlpbnQgbG9vcDsKKwkJCXBjaF9pMmNfc2VuZGFjayhhZGFwKTsKKworCQkJLyogRHVtbXkgcmVhZCAqLworCQkJZm9yIChsb29wID0gMSwgcmVhZF9pbmRleCA9IDA7IGxvb3AgPCBsZW5ndGg7IGxvb3ArKykgeworCQkJCWJ1ZltyZWFkX2luZGV4XSA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDRFIpOworCisJCQkJaWYgKGxvb3AgIT0gMSkKKwkJCQkJcmVhZF9pbmRleCsrOworCisJCQkJaWYgKHBjaF9pMmNfd2FpdF9mb3JfeGZlcl9jb21wbGV0ZShhZGFwKSAhPSAwKSB7CisJCQkJCXBjaF9pMmNfc3RvcChhZGFwKTsKKwkJCQkJcmV0dXJuIC1FVElNRTsKKwkJCQl9CisJCQl9CS8qIGVuZCBmb3IgKi8KKworCQkJcGNoX2kyY19zZW5kbmFjayhhZGFwKTsKKworCQkJYnVmW3JlYWRfaW5kZXhdID0gaW9yZWFkMzIocCArIFBDSF9JMkNEUik7CisKKwkJCWlmIChsZW5ndGggIT0gMSkKKwkJCQlyZWFkX2luZGV4Kys7CisKKwkJCWlmIChwY2hfaTJjX3dhaXRfZm9yX3hmZXJfY29tcGxldGUoYWRhcCkgPT0gMCkgeworCQkJCWlmIChsYXN0KQorCQkJCQlwY2hfaTJjX3N0b3AoYWRhcCk7CisJCQkJZWxzZQorCQkJCQlwY2hfaTJjX3JlcHN0YXJ0KGFkYXApOworCisJCQkJYnVmW3JlYWRfaW5kZXgrK10gPSBpb3JlYWQzMihwICsgUENIX0kyQ0RSKTsKKwkJCQljb3VudCA9IHJlYWRfaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCWNvdW50ID0gLUVUSU1FOworCQkJfQorCisJCX0KKwl9IGVsc2UgeworCQljb3VudCA9IC1FVElNRTsKKwkJcGNoX2kyY19zdG9wKGFkYXApOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBwY2hfaTJjX2NiX2NoMCgpIC0gSW50ZXJydXB0IGhhbmRsZXIgQ2FsbCBiYWNrIGZ1bmN0aW9uCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHBjaF9pMmNfY2JfY2gwKHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCkKK3sKKwl1MzIgc3RzOworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisKKwlzdHMgPSBpb3JlYWQzMihwICsgUENIX0kyQ1NSKTsKKwlzdHMgJj0gKEkyQ01BTF9CSVQgfCBJMkNNQ0ZfQklUIHwgSTJDTUlGX0JJVCk7CisJaWYgKHN0cyAmIEkyQ01BTF9CSVQpCisJCWFkYXAtPnBjaF9ldmVudF9mbGFnIHw9IEkyQ01BTF9FVkVOVDsKKworCWlmIChzdHMgJiBJMkNNQ0ZfQklUKQorCQlhZGFwLT5wY2hfZXZlbnRfZmxhZyB8PSBJMkNNQ0ZfRVZFTlQ7CisKKwkvKiBjbGVhciB0aGUgYXBwbGljYWJsZSBiaXRzICovCisJcGNoX2NscmJpdChhZGFwLT5wY2hfYmFzZV9hZGRyZXNzLCBQQ0hfSTJDU1IsIHN0cyk7CisKKwlwY2hfZGJnKGFkYXAsICJQQ0hfSTJDU1IgPSAleFxuIiwgaW9yZWFkMzIocCArIFBDSF9JMkNTUikpOworCisJd2FrZV91cCgmcGNoX2V2ZW50KTsKK30KKworLyoqCisgKiBwY2hfaTJjX2hhbmRsZXIoKSAtIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgUENIIEkyQyBjb250cm9sbGVyCisgKiBAaXJxOglpcnEgbnVtYmVyLgorICogQHBEYXRhOgljb29raWUgcGFzc2VkIGJhY2sgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2hfaTJjX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcERhdGEpCit7CisJczMyIHJlZ192YWw7CisKKwlzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKmFkYXBfZGF0YSA9IChzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEgKilwRGF0YTsKKwl2b2lkIF9faW9tZW0gKnAgPSBhZGFwX2RhdGEtPnBjaF9iYXNlX2FkZHJlc3M7CisJdTMyIG1vZGUgPSBpb3JlYWQzMihwICsgUENIX0kyQ01PRCkgJiAoQlVGRkVSX01PREUgfCBFRVBST01fU1JfTU9ERSk7CisKKwlpZiAobW9kZSAhPSBOT1JNQUxfTU9ERSkgeworCQlwY2hfZXJyKGFkYXBfZGF0YSwgIkkyQyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcmVnX3ZhbCA9IGlvcmVhZDMyKHAgKyBQQ0hfSTJDU1IpOworCWlmIChyZWdfdmFsICYgKEkyQ01BTF9CSVQgfCBJMkNNQ0ZfQklUIHwgSTJDTUlGX0JJVCkpCisJCXBjaF9pMmNfY2JfY2gwKGFkYXBfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogcGNoX2kyY194ZmVyKCkgLSBSZWFkaW5nIGFkbmQgd3JpdGluZyBkYXRhIHRocm91Z2ggSTJDIGJ1cworICogQGkyY19hZGFwOglQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaTJjX2FkYXB0ZXIuCisgKiBAbXNnczoJUG9pbnRlciB0byBpMmNfbXNnIHN0cnVjdHVyZS4KKyAqIEBudW06CW51bWJlciBvZiBtZXNzYWdlcy4KKyAqLworc3RhdGljIHMzMiBwY2hfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKKwkJICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLCBzMzIgbnVtKQoreworCXN0cnVjdCBpMmNfbXNnICpwbXNnOworCXUzMiBpID0gMDsKKwl1MzIgc3RhdHVzOworCXUzMiBtc2dsZW47CisJdTMyIHN1YmFkZHJsZW47CisJczMyIHJldDsKKworCXN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBjaF9tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChhZGFwLT5wX2FkYXB0ZXJfaW5mby0+cGNoX2kyY19zdXNwZW5kZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwY2hfbXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBjaF9kYmcoYWRhcCwgImFkYXAtPnBfYWRhcHRlcl9pbmZvLT5wY2hfaTJjX3N1c3BlbmRlZCBpcyAlZFxuIiwKKwkJYWRhcC0+cF9hZGFwdGVyX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkKTsKKwkvKiB0cmFuc2ZlciBub3QgY29tcGxldGVkICovCisJYWRhcC0+cGNoX2kyY194ZmVyX2luX3Byb2dyZXNzID0gdHJ1ZTsKKworCXBtc2cgPSAmbXNnc1swXTsKKwlwbXNnLT5mbGFncyB8PSBhZGFwLT5wY2hfYnVmZl9tb2RlX2VuOworCXN0YXR1cyA9IHBtc2ctPmZsYWdzOworCXBjaF9kYmcoYWRhcCwKKwkJIkFmdGVyIGludm9raW5nIEkyQ19NT0RFX1NFTCA6ZmxhZz0gMHgleFxuIiwgc3RhdHVzKTsKKwkvKiBjYWxjdWxhdGUgc3ViIGFkZHJlc3MgbGVuZ3RoIGFuZCBtZXNzYWdlIGxlbmd0aCAqLworCS8qIHRoZXNlIGFyZSBhcHBsaWNhYmxlIG9ubHkgZm9yIGJ1ZmZlciBtb2RlICovCisJc3ViYWRkcmxlbiA9IHBtc2ctPmJ1ZlswXTsKKwkvKiBjYWxjdWxhdGUgYWN0dWFsIG1lc3NhZ2UgbGVuZ3RoIGV4Y2x1ZGluZworCSAqIHRoZSBzdWIgYWRkcmVzcyBmaWVsZHMgKi8KKwltc2dsZW4gPSAocG1zZy0+bGVuKSAtIChzdWJhZGRybGVuICsgMSk7CisJaWYgKHN0YXR1cyAmIChJMkNfTV9SRCkpIHsKKwkJcGNoX2RiZyhhZGFwLCAiaW52b2tpbmcgcGNoX2kyY19yZWFkYnl0ZXNcbiIpOworCQlyZXQgPSBwY2hfaTJjX3JlYWRieXRlcyhpMmNfYWRhcCwgcG1zZywgKGkgKyAxID09IG51bSksCisJCQkJICAgKGkgPT0gMCkpOworCX0gZWxzZSB7CisJCXBjaF9kYmcoYWRhcCwgImludm9raW5nIHBjaF9pMmNfd3JpdGVieXRlc1xuIik7CisJCXJldCA9IHBjaF9pMmNfd3JpdGVieXRlcyhpMmNfYWRhcCwgcG1zZywgKGkgKyAxID09IG51bSksCisJCQkJICAgIChpID09IDApKTsKKwl9CisKKwlhZGFwLT5wY2hfaTJjX3hmZXJfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsJLyogdHJhbnNmZXIgY29tcGxldGVkICovCisKKwltdXRleF91bmxvY2soJnBjaF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHBjaF9pMmNfZnVuYygpIC0gcmV0dXJuIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBJMkMgZHJpdmVyCisgKiBAYWRhcDoJUG9pbnRlciB0byBzdHJ1Y3QgaTJjX2FsZ29fcGNoX2RhdGEuCisgKi8KK3N0YXRpYyB1MzIgcGNoX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8IEkyQ19GVU5DXzEwQklUX0FERFI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2hfYWxnb3JpdGhtID0geworCS5tYXN0ZXJfeGZlciA9IHBjaF9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IHBjaF9pMmNfZnVuYworfTsKKworLyoqCisgKiBwY2hfaTJjX2Rpc2JsX2ludCgpIC0gRGlzYWJsZSBQQ0ggSTJDIGludGVycnVwdHMKKyAqIEBhZGFwOglQb2ludGVyIHRvIHN0cnVjdCBpMmNfYWxnb19wY2hfZGF0YS4KKyAqLworc3RhdGljIHZvaWQgcGNoX2kyY19kaXNibF9pbnQoc3RydWN0IGkyY19hbGdvX3BjaF9kYXRhICphZGFwKQoreworCXZvaWQgX19pb21lbSAqcCA9IGFkYXAtPnBjaF9iYXNlX2FkZHJlc3M7CisKKwlwY2hfY2xyYml0KGFkYXAtPnBjaF9iYXNlX2FkZHJlc3MsIFBDSF9JMkNDVEwsIE5PUk1BTF9JTlRSX0VOQkwpOworCisJaW93cml0ZTMyKEVFUFJPTV9SU1RfSU5UUl9ESVNCTCwgcCArIFBDSF9JMkNFU1JNU0spOworCisJaW93cml0ZTMyKEJVRkZFUl9NT0RFX0lOVFJfRElTQkwsIHAgKyBQQ0hfSTJDQlVGTVNLKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNoX2kyY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJczMyIHJldDsKKwlzdHJ1Y3QgYWRhcHRlcl9pbmZvICphZGFwX2luZm87CisKKwlwY2hfcGNpX2RiZyhwZGV2LCAiRW50ZXJlZC5cbiIpOworCisJYWRhcF9pbmZvID0ga3phbGxvYygoc2l6ZW9mKHN0cnVjdCBhZGFwdGVyX2luZm8pKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXBfaW5mbyA9PSBOVUxMKSB7CisJCXBjaF9wY2lfZXJyKHBkZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBGQUlMRURcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCXBjaF9wY2lfZXJyKHBkZXYsICJwY2lfZW5hYmxlX2RldmljZSBGQUlMRURcbiIpOworCQlnb3RvIGVycl9wY2lfZW5hYmxlOworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgS0JVSUxEX01PRE5BTUUpOworCWlmIChyZXQpIHsKKwkJcGNoX3BjaV9lcnIocGRldiwgInBjaV9yZXF1ZXN0X3JlZ2lvbnMgRkFJTEVEXG4iKTsKKwkJZ290byBlcnJfcGNpX3JlcTsKKwl9CisKKwliYXNlX2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMSwgMCk7CisKKwlpZiAoYmFzZV9hZGRyID09IE5VTEwpIHsKKwkJcGNoX3BjaV9lcnIocGRldiwgInBjaV9pb21hcCBGQUlMRURcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wY2lfaW9tYXA7CisJfQorCisJYWRhcF9pbmZvLT5wY2hfaTJjX3N1c3BlbmRlZCA9IGZhbHNlOworCisJYWRhcF9pbmZvLT5wY2hfZGF0YS5wX2FkYXB0ZXJfaW5mbyA9IGFkYXBfaW5mbzsKKworCWFkYXBfaW5mby0+cGNoX2RhdGEucGNoX2FkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9hZGFwdGVyLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOworCXN0cmNweShhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9hZGFwdGVyLm5hbWUsIEtCVUlMRF9NT0ROQU1FKTsKKwlhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9hZGFwdGVyLmFsZ28gPSAmcGNoX2FsZ29yaXRobTsKKwlhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9hZGFwdGVyLmFsZ29fZGF0YSA9CisJCQkJCQkmYWRhcF9pbmZvLT5wY2hfZGF0YTsKKworCS8qIChpICogMHg4MCkgKyBiYXNlX2FkZHI7ICovCisJYWRhcF9pbmZvLT5wY2hfZGF0YS5wY2hfYmFzZV9hZGRyZXNzID0gYmFzZV9hZGRyOworCisJYWRhcF9pbmZvLT5wY2hfZGF0YS5wY2hfYWRhcHRlci5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKworCXJldCA9IGkyY19hZGRfYWRhcHRlcigmKGFkYXBfaW5mby0+cGNoX2RhdGEucGNoX2FkYXB0ZXIpKTsKKworCWlmIChyZXQpIHsKKwkJcGNoX3BjaV9lcnIocGRldiwgImkyY19hZGRfYWRhcHRlciBGQUlMRURcbiIpOworCQlnb3RvIGVycl9pMmNfYWRkX2FkYXB0ZXI7CisJfQorCisJcGNoX2kyY19pbml0KCZhZGFwX2luZm8tPnBjaF9kYXRhKTsKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9pMmNfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCSAgS0JVSUxEX01PRE5BTUUsICZhZGFwX2luZm8tPnBjaF9kYXRhKTsKKwlpZiAocmV0KSB7CisJCXBjaF9wY2lfZXJyKHBkZXYsICJyZXF1ZXN0X2lycSBGQUlMRURcbiIpOworCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgYWRhcF9pbmZvKTsKKwlwY2hfcGNpX2RiZyhwZGV2LCAicmV0dXJucyAlZC5cbiIsIHJldCk7CisJcmV0dXJuIDA7CisKK2Vycl9yZXF1ZXN0X2lycToKKwlpMmNfZGVsX2FkYXB0ZXIoJihhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9hZGFwdGVyKSk7CitlcnJfaTJjX2FkZF9hZGFwdGVyOgorCXBjaV9pb3VubWFwKHBkZXYsIGJhc2VfYWRkcik7CitlcnJfcGNpX2lvbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX3JlcToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfcGNpX2VuYWJsZToKKwlrZnJlZShhZGFwX2luZm8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY2hfaTJjX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlcl9pbmZvICphZGFwX2luZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwY2hfaTJjX2Rpc2JsX2ludCgmYWRhcF9pbmZvLT5wY2hfZGF0YSk7CisJZnJlZV9pcnEocGRldi0+aXJxLCAmYWRhcF9pbmZvLT5wY2hfZGF0YSk7CisJaTJjX2RlbF9hZGFwdGVyKCYoYWRhcF9pbmZvLT5wY2hfZGF0YS5wY2hfYWRhcHRlcikpOworCisJaWYgKGFkYXBfaW5mby0+cGNoX2RhdGEucGNoX2Jhc2VfYWRkcmVzcykgeworCQlwY2lfaW91bm1hcChwZGV2LCBhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9iYXNlX2FkZHJlc3MpOworCQlhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9iYXNlX2FkZHJlc3MgPSAwOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJa2ZyZWUoYWRhcF9pbmZvKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwY2hfaTJjX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGFwdGVyX2luZm8gKmFkYXBfaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKnAgPSBhZGFwX2luZm8tPnBjaF9kYXRhLnBjaF9iYXNlX2FkZHJlc3M7CisKKwlhZGFwX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkID0gdHJ1ZTsKKworCXdoaWxlICgoYWRhcF9pbmZvLT5wY2hfZGF0YS5wY2hfaTJjX3hmZXJfaW5fcHJvZ3Jlc3MpKSB7CisJCS8qIFdhaXQgdW50aWwgYWxsIGNoYW5uZWwgdHJhbnNmZXJzIGFyZSBjb21wbGV0ZWQgKi8KKwkJbXNsZWVwKDIwKTsKKwl9CisJLyogRGlzYWJsZSB0aGUgaTJjIGludGVycnVwdHMgKi8KKwlwY2hfaTJjX2Rpc2JsX2ludCgmYWRhcF9pbmZvLT5wY2hfZGF0YSk7CisKKwlwY2hfcGNpX2RiZyhwZGV2LCAiSTJDU1IgPSAleCBJMkNCVUZTVEEgPSAleCBJMkNFU1JTVEEgPSAleCAiCisJCSJpbnZva2VkIGZ1bmN0aW9uIHBjaF9pMmNfZGlzYmxfaW50IHN1Y2Nlc3NmdWxseVxuIiwKKwkJaW9yZWFkMzIocCArIFBDSF9JMkNTUiksIGlvcmVhZDMyKHAgKyBQQ0hfSTJDQlVGU1RBKSwKKwkJaW9yZWFkMzIocCArIFBDSF9JMkNFU1JTVEEpKTsKKworCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKHJldCkgeworCQlwY2hfcGNpX2VycihwZGV2LCAicGNpX3NhdmVfc3RhdGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaF9pMmNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZGFwdGVyX2luZm8gKmFkYXBfaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApIHsKKwkJcGNoX3BjaV9lcnIocGRldiwgInBjaF9pMmNfcmVzdW1lOnBjaV9lbmFibGVfZGV2aWNlIEZBSUxFRFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCisJcGNoX2kyY19pbml0KCZhZGFwX2luZm8tPnBjaF9kYXRhKTsKKworCWFkYXBfaW5mby0+cGNoX2kyY19zdXNwZW5kZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcGNoX2kyY19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcGNoX2kyY19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2hfcGNpZHJpdmVyID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLmlkX3RhYmxlID0gcGNoX3BjaWRldl9pZCwKKwkucHJvYmUgPSBwY2hfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwY2hfaTJjX3JlbW92ZSksCisJLnN1c3BlbmQgPSBwY2hfaTJjX3N1c3BlbmQsCisJLnJlc3VtZSA9IHBjaF9pMmNfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2hfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNoX3BjaWRyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwY2hfcGNpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGNoX3BjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2hfcGNpZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBjaF9wY2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUENIIEkyQyBQQ0kgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUb21veWEgTU9SSU5BR0EuIDx0b21veWEtbGludXhAZHNuLm9raXNlbWkuY29tPiIpOworbW9kdWxlX3BhcmFtKHBjaF9pMmNfc3BlZWQsIGludCwgKFNfSVJVU1IgfCBTX0lXVVNSKSk7Cittb2R1bGVfcGFyYW0ocGNoX2NsaywgaW50LCAoU19JUlVTUiB8IFNfSVdVU1IpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKaW5kZXggMDI4MzVjZS4uNzk3OWFlZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtNzIsNiArNzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogSTgwMSBTTUJ1cyBhZGRyZXNzIG9mZnNldHMgKi8KICNkZWZpbmUgU01CSFNUU1RTKHApCSgwICsgKHApLT5zbWJhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKaW5kZXggMTEyYzYxZi4uZjA5YzkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5jCkBAIC00MDksNyArNDA5LDcgQEAKIAkJSU9QM1hYX0lDUl9SWEZVTExfSUUgfCBJT1AzWFhfSUNSX1RYRU1QVFlfSUUpOwogCV9fcmF3X3dyaXRlbChjciwgYWRhcHRlcl9kYXRhLT5pb2FkZHIgKyBDUl9PRkZTRVQpOwogCi0JaW91bm1hcCgodm9pZCBfX2lvbWVtKilhZGFwdGVyX2RhdGEtPmlvYWRkcik7CisJaW91bm1hcChhZGFwdGVyX2RhdGEtPmlvYWRkcik7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIElPUDNYWF9JMkNfSU9fU0laRSk7CiAJa2ZyZWUoYWRhcHRlcl9kYXRhKTsKIAlrZnJlZShwYWRhcHRlcik7CkBAIC00NTMsNyArNDUzLDcgQEAKIAkvKiBzZXQgdGhlIGFkYXB0ZXIgZW51bWVyYXRpb24gIyAqLwogCWFkYXB0ZXJfZGF0YS0+aWQgPSBpMmNfaWQrKzsKIAotCWFkYXB0ZXJfZGF0YS0+aW9hZGRyID0gKHUzMilpb3JlbWFwKHJlcy0+c3RhcnQsIElPUDNYWF9JMkNfSU9fU0laRSk7CisJYWRhcHRlcl9kYXRhLT5pb2FkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIElPUDNYWF9JMkNfSU9fU0laRSk7CiAJaWYgKCFhZGFwdGVyX2RhdGEtPmlvYWRkcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHJlbGVhc2VfcmVnaW9uOwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJcmV0dXJuIDA7CiAKIHVubWFwOgotCWlvdW5tYXAoKHZvaWQgX19pb21lbSopYWRhcHRlcl9kYXRhLT5pb2FkZHIpOworCWlvdW5tYXAoYWRhcHRlcl9kYXRhLT5pb2FkZHIpOwogCiByZWxlYXNlX3JlZ2lvbjoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgSU9QM1hYX0kyQ19JT19TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmggYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5oCmluZGV4IDg0ODU4NjEuLjA5N2UyNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmgKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguaApAQCAtOTcsNyArOTcsNyBAQAogI2RlZmluZQlJT1AzWFhfSTJDX0lPX1NJWkUJMHgxOAogCiBzdHJ1Y3QgaTJjX2FsZ29faW9wM3h4X2RhdGEgewotCXUzMiBpb2FkZHI7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXUzMiBTUl9lbmFibGVkLCBTUl9yZWNlaXZlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMKaW5kZXggMTYyNDIwNi4uYTk5NDFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdjY0eHh4LmMKQEAgLTU5LDYgKzU5LDcgQEAKIAlNVjY0WFhYX0kyQ19TVEFURV9JTlZBTElELAogCU1WNjRYWFhfSTJDX1NUQVRFX0lETEUsCiAJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfU1RBUlRfQ09ORCwKKwlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9SRVNUQVJULAogCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMV9BQ0ssCiAJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfQUREUl8yX0FDSywKIAlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9TTEFWRV9BQ0ssCkBAIC03MCw2ICs3MSw3IEBACiAJTVY2NFhYWF9JMkNfQUNUSU9OX0lOVkFMSUQsCiAJTVY2NFhYWF9JMkNfQUNUSU9OX0NPTlRJTlVFLAogCU1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUQVJULAorCU1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1JFU1RBUlQsCiAJTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfQUREUl8xLAogCU1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX0FERFJfMiwKIAlNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9EQVRBLApAQCAtOTEsNiArOTMsNyBAQAogCXUzMgkJCWFkZHIyOwogCXUzMgkJCWJ5dGVzX2xlZnQ7CiAJdTMyCQkJYnl0ZV9wb3NuOworCXUzMgkJCXNlbmRfc3RvcDsKIAl1MzIJCQlibG9jazsKIAlpbnQJCQlyYzsKIAl1MzIJCQlmcmVxX207CkBAIC0xNTksOCArMTYyLDE1IEBACiAJCWlmICgoZHJ2X2RhdGEtPmJ5dGVzX2xlZnQgPT0gMCkKIAkJCQl8fCAoZHJ2X2RhdGEtPmFib3J0aW5nCiAJCQkJCSYmIChkcnZfZGF0YS0+Ynl0ZV9wb3NuICE9IDApKSkgewotCQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUT1A7Ci0JCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9JRExFOworCQkJaWYgKGRydl9kYXRhLT5zZW5kX3N0b3ApIHsKKwkJCQlkcnZfZGF0YS0+YWN0aW9uID0gTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfU1RPUDsKKwkJCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9JRExFOworCQkJfSBlbHNlIHsKKwkJCQlkcnZfZGF0YS0+YWN0aW9uID0KKwkJCQkJTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfUkVTVEFSVDsKKwkJCQlkcnZfZGF0YS0+c3RhdGUgPQorCQkJCQlNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9SRVNUQVJUOworCQkJfQogCQl9IGVsc2UgewogCQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX0RBVEE7CiAJCQlkcnZfZGF0YS0+c3RhdGUgPQpAQCAtMjI4LDYgKzIzOCwxNSBAQAogbXY2NHh4eF9pMmNfZG9fYWN0aW9uKHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSkKIHsKIAlzd2l0Y2goZHJ2X2RhdGEtPmFjdGlvbikgeworCWNhc2UgTVY2NFhYWF9JMkNfQUNUSU9OX1NFTkRfUkVTVEFSVDoKKwkJZHJ2X2RhdGEtPmNudGxfYml0cyB8PSBNVjY0WFhYX0kyQ19SRUdfQ09OVFJPTF9TVEFSVDsKKwkJZHJ2X2RhdGEtPmNudGxfYml0cyAmPSB+TVY2NFhYWF9JMkNfUkVHX0NPTlRST0xfSU5URU47CisJCXdyaXRlbChkcnZfZGF0YS0+Y250bF9iaXRzLAorCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wpOworCQlkcnZfZGF0YS0+YmxvY2sgPSAwOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRydl9kYXRhLT53YWl0cSk7CisJCWJyZWFrOworCiAJY2FzZSBNVjY0WFhYX0kyQ19BQ1RJT05fQ09OVElOVUU6CiAJCXdyaXRlbChkcnZfZGF0YS0+Y250bF9iaXRzLAogCQkJZHJ2X2RhdGEtPnJlZ19iYXNlICsgTVY2NFhYWF9JMkNfUkVHX0NPTlRST0wpOwpAQCAtMzg2LDcgKzQwNSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW12NjR4eHhfaTJjX2V4ZWN1dGVfbXNnKHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSwgc3RydWN0IGkyY19tc2cgKm1zZykKK212NjR4eHhfaTJjX2V4ZWN1dGVfbXNnKHN0cnVjdCBtdjY0eHh4X2kyY19kYXRhICpkcnZfZGF0YSwgc3RydWN0IGkyY19tc2cgKm1zZywKKwkJCQlpbnQgaXNfZmlyc3QsIGludCBpc19sYXN0KQogewogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKQEAgLTQwNiwxMCArNDI2LDE4IEBACiAJCQlkcnZfZGF0YS0+Ynl0ZXNfbGVmdC0tOwogCQl9CiAJfSBlbHNlIHsKLQkJZHJ2X2RhdGEtPmFjdGlvbiA9IE1WNjRYWFhfSTJDX0FDVElPTl9TRU5EX1NUQVJUOwotCQlkcnZfZGF0YS0+c3RhdGUgPSBNVjY0WFhYX0kyQ19TVEFURV9XQUlUSU5HX0ZPUl9TVEFSVF9DT05EOworCQlpZiAoaXNfZmlyc3QpIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9TVEFSVDsKKwkJCWRydl9kYXRhLT5zdGF0ZSA9CisJCQkJTVY2NFhYWF9JMkNfU1RBVEVfV0FJVElOR19GT1JfU1RBUlRfQ09ORDsKKwkJfSBlbHNlIHsKKwkJCWRydl9kYXRhLT5hY3Rpb24gPSBNVjY0WFhYX0kyQ19BQ1RJT05fU0VORF9BRERSXzE7CisJCQlkcnZfZGF0YS0+c3RhdGUgPQorCQkJCU1WNjRYWFhfSTJDX1NUQVRFX1dBSVRJTkdfRk9SX0FERFJfMV9BQ0s7CisJCX0KIAl9CiAKKwlkcnZfZGF0YS0+c2VuZF9zdG9wID0gaXNfbGFzdDsKIAlkcnZfZGF0YS0+YmxvY2sgPSAxOwogCW12NjR4eHhfaTJjX2RvX2FjdGlvbihkcnZfZGF0YSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2X2RhdGEtPmxvY2ssIGZsYWdzKTsKQEAgLTQzNyw5ICs0NjUsMTIgQEAKIAlzdHJ1Y3QgbXY2NHh4eF9pMmNfZGF0YSAqZHJ2X2RhdGEgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCWludAlpLCByYzsKIAotCWZvciAoaT0wOyBpPG51bTsgaSsrKQotCQlpZiAoKHJjID0gbXY2NHh4eF9pMmNfZXhlY3V0ZV9tc2coZHJ2X2RhdGEsICZtc2dzW2ldKSkgPCAwKQorCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyYyA9IG12NjR4eHhfaTJjX2V4ZWN1dGVfbXNnKGRydl9kYXRhLCAmbXNnc1tpXSwKKwkJCQkJCWkgPT0gMCwgaSArIDEgPT0gbnVtKTsKKwkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKKwl9CiAKIAlyZXR1cm4gbnVtOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwppbmRleCBhNjA1YTUwLi5mZjFlMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYwpAQCAtNDMyLDcgKzQzMiw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuZm9yY2UyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCBuZm9yY2UyX3NtYnVzICpzbWJ1c2VzID0gKHZvaWQqKSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgbmZvcmNlMl9zbWJ1cyAqc21idXNlcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJbmZvcmNlMl9zZXRfcmVmZXJlbmNlKE5VTEwpOwogCWlmIChzbWJ1c2VzWzBdLmJhc2UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKaW5kZXggYzlmZmZkMC4uNTk0ZWQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQAogCX0KIAogCWlmICh0aW1lb3V0ID09IDApIHsKLQkJLyogY29udHJvbGVyIGhhcyB0aW1lZG91dCwgcmUtaW5pdCB0aGUgaC93ICovCisJCS8qIGNvbnRyb2xsZXIgaGFzIHRpbWVkb3V0LCByZS1pbml0IHRoZSBoL3cgKi8KIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJjb250cm9sbGVyIHRpbWVkIG91dCwgcmUtaW5pdCBoL3dcbiIpOwogCQkodm9pZCkgaW5pdF9odyhkZXYpOwogCQlzdGF0dXMgPSAtRVRJTUVET1VUOwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJfQogCiAJaWYgKHRpbWVvdXQgPT0gMCkgewotCQkvKiBjb250cm9sZXIgaGFzIHRpbWVkb3V0LCByZS1pbml0IHRoZSBoL3cgKi8KKwkJLyogY29udHJvbGxlciBoYXMgdGltZWRvdXQsIHJlLWluaXQgdGhlIGgvdyAqLwogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImNvbnRyb2xsZXIgdGltZWQgb3V0LCByZS1pbml0IGgvd1xuIik7CiAJCSh2b2lkKSBpbml0X2h3KGRldik7CiAJCXN0YXR1cyA9IC1FVElNRURPVVQ7CkBAIC04NzIsNiArODcyLDggQEAKIAlhZGFwLT5vd25lcgk9IFRISVNfTU9EVUxFOwogCWFkYXAtPmNsYXNzCT0gSTJDX0NMQVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRDsKIAlhZGFwLT5hbGdvCT0gJm5ta19pMmNfYWxnbzsKKwlzbnByaW50ZihhZGFwLT5uYW1lLCBzaXplb2YoYWRhcC0+bmFtZSksCisJCSAiTm9tYWRpayBJMkMlZCBhdCAlbHgiLCBwZGV2LT5pZCwgKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCk7CiAKIAkvKiBmZXRjaCB0aGUgY29udHJvbGxlciBpZCAqLwogCWFkYXAtPm5yCT0gcGRldi0+aWQ7CkBAIC04OTEsOCArODkzLDggQEAKIAkJZ290byBlcnJfaW5pdF9odzsKIAl9CiAKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpbml0aWFsaXplIEkyQyVkIGJ1cyBvbiB2aXJ0dWFsICIKLQkJImJhc2UgJXBcbiIsIHBkZXYtPmlkLCBkZXYtPnZpcnRiYXNlKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW5pdGlhbGl6ZSAlcyBvbiB2aXJ0dWFsICIKKwkJImJhc2UgJXBcbiIsIGFkYXAtPm5hbWUsIGRldi0+dmlydGJhc2UpOwogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCmluZGV4IDAwNzAzNzEuLmVmM2JjYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYwpAQCAtOSw2ICs5LDQxIEBACiAgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqLwogCisvKgorICogRGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbjoKKyAqCisgKiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorICogLSBjb21wYXRpYmxlICAgICAgOiAib3BlbmNvcmVzLGkyYy1vY29yZXMiCisgKiAtIHJlZyAgICAgICAgICAgICA6IGJ1cyBhZGRyZXNzIHN0YXJ0IGFuZCBhZGRyZXNzIHJhbmdlIHNpemUgb2YgZGV2aWNlCisgKiAtIGludGVycnVwdHMgICAgICA6IGludGVycnVwdCBudW1iZXIKKyAqIC0gcmVnc3RlcCAgICAgICAgIDogc2l6ZSBvZiBkZXZpY2UgcmVnaXN0ZXJzIGluIGJ5dGVzCisgKiAtIGNsb2NrLWZyZXF1ZW5jeSA6IGZyZXF1ZW5jeSBvZiBidXMgY2xvY2sgaW4gSHoKKyAqIAorICogRXhhbXBsZToKKyAqCisgKiAgaTJjMDogb2NvcmVzQGEwMDAwMDAwIHsKKyAqICAgICAgICAgICAgICBjb21wYXRpYmxlID0gIm9wZW5jb3JlcyxpMmMtb2NvcmVzIjsKKyAqICAgICAgICAgICAgICByZWcgPSA8MHhhMDAwMDAwMCAweDg+OworICogICAgICAgICAgICAgIGludGVycnVwdHMgPSA8MTA+OworICoKKyAqICAgICAgICAgICAgICByZWdzdGVwID0gPDE+OworICogICAgICAgICAgICAgIGNsb2NrLWZyZXF1ZW5jeSA9IDwyMDAwMDAwMD47CisgKgorICogLS0gRGV2aWNlcyBjb25uZWN0ZWQgb24gdGhpcyBJMkMgYnVzIGdldAorICogLS0gZGVmaW5lZCBoZXJlOyBhZGRyZXNzLSBhbmQgc2l6ZS1jZWxscworICogLS0gYXBwbHkgdG8gdGhlc2UgY2hpbGQgZGV2aWNlcworICoKKyAqICAgICAgICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKyAqICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKKyAqCisgKiAgICAgICAgICAgICAgZHVtbXlANjAgeworICogICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImR1bW15IjsKKyAqICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDYwPjsKKyAqICAgICAgICAgICAgICB9OworICogIH07CisgKgorICovCisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMTAsNiArMjQ1LDMyIEBACiAJLmFsZ28JCT0gJm9jb3Jlc19hbGdvcml0aG0sCiB9OwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IG9jb3Jlc19pMmNfb2ZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSogcGRldiwKKwkJCQlzdHJ1Y3Qgb2NvcmVzX2kyYyogaTJjKQoreworCV9fYmUzMiogdmFsOworCisJdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLCAicmVnc3RlcCIsIE5VTEwpOworCWlmICghdmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdyZWdzdGVwJyIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaTJjLT5yZWdzdGVwID0gYmUzMl90b19jcHVwKHZhbCk7CisKKwl2YWwgPSBvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwlpZiAoIXZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Nsb2NrLWZyZXF1ZW5jeSciKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWkyYy0+Y2xvY2tfa2h6ID0gYmUzMl90b19jcHVwKHZhbCkgLyAxMDAwOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBvY29yZXNfaTJjX29mX3Byb2JlKHBkZXYsaTJjKSAtRU5PREVWCisjZW5kaWYKIAogc3RhdGljIGludCBfX2RldmluaXQgb2NvcmVzX2kyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMjI3LDM3ICsyODgsNDEgQEAKIAlpZiAoIXJlczIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcGRhdGEgPSAoc3RydWN0IG9jb3Jlc19pMmNfcGxhdGZvcm1fZGF0YSopIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaTJjID0ga3phbGxvYyhzaXplb2YoKmkyYyksIEdGUF9LRVJORUwpOworCWkyYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmkyYyksIEdGUF9LRVJORUwpOwogCWlmICghaTJjKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQlwZGV2LT5uYW1lKSkgeworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSwgcGRldi0+bmFtZSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBidXN5XG4iKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIHJlcXVlc3RfbWVtX2ZhaWxlZDsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpMmMtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaTJjLT5iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkJIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFpMmMtPmJhc2UpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG1hcF9mYWlsZWQ7CisJCXJldHVybiAtRUlPOwogCX0KIAotCWkyYy0+cmVnc3RlcCA9IHBkYXRhLT5yZWdzdGVwOwotCWkyYy0+Y2xvY2tfa2h6ID0gcGRhdGEtPmNsb2NrX2toejsKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSkgeworCQlpMmMtPnJlZ3N0ZXAgPSBwZGF0YS0+cmVnc3RlcDsKKwkJaTJjLT5jbG9ja19raHogPSBwZGF0YS0+Y2xvY2tfa2h6OworCX0gZWxzZSB7CisJCXJldCA9IG9jb3Jlc19pMmNfb2ZfcHJvYmUocGRldiwgaTJjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJb2NvcmVzX2luaXQoaTJjKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyYy0+d2FpdCk7Ci0JcmV0ID0gcmVxdWVzdF9pcnEocmVzMi0+c3RhcnQsIG9jb3Jlc19pc3IsIDAsIHBkZXYtPm5hbWUsIGkyYyk7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCByZXMyLT5zdGFydCwgb2NvcmVzX2lzciwgMCwKKwkJCSAgICAgICBwZGV2LT5uYW1lLCBpMmMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGNsYWltIElSUVxuIik7Ci0JCWdvdG8gcmVxdWVzdF9pcnFfZmFpbGVkOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIGhvb2sgdXAgZHJpdmVyIHRvIHRyZWUgKi8KQEAgLTI2NSwzNiArMzMwLDI5IEBACiAJaTJjLT5hZGFwID0gb2NvcmVzX2FkYXB0ZXI7CiAJaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwLCBpMmMpOwogCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKyNpZmRlZiBDT05GSUdfT0YKKwlpMmMtPmFkYXAuZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKyNlbmRpZgogCiAJLyogYWRkIGkyYyBhZGFwdGVyIHRvIGkyYyB0cmVlICovCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKLQkJZ290byBhZGRfYWRhcHRlcl9mYWlsZWQ7CisJCXJldHVybiByZXQ7CiAJfQogCiAJLyogYWRkIGluIGtub3duIGRldmljZXMgdG8gdGhlIGJ1cyAqLwotCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2RldmljZXM7IGkrKykKLQkJaTJjX25ld19kZXZpY2UoJmkyYy0+YWRhcCwgcGRhdGEtPmRldmljZXMgKyBpKTsKKwlpZiAocGRhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZGV2aWNlczsgaSsrKQorCQkJaTJjX25ld19kZXZpY2UoJmkyYy0+YWRhcCwgcGRhdGEtPmRldmljZXMgKyBpKTsKKwl9CiAKIAlyZXR1cm4gMDsKLQotYWRkX2FkYXB0ZXJfZmFpbGVkOgotCWZyZWVfaXJxKHJlczItPnN0YXJ0LCBpMmMpOwotcmVxdWVzdF9pcnFfZmFpbGVkOgotCWlvdW5tYXAoaTJjLT5iYXNlKTsKLW1hcF9mYWlsZWQ6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci1yZXF1ZXN0X21lbV9mYWlsZWQ6Ci0Ja2ZyZWUoaTJjKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG9jb3Jlc19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UqIHBkZXYpCiB7CiAJc3RydWN0IG9jb3Jlc19pMmMgKmkyYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJLyogZGlzYWJsZSBpMmMgbG9naWMgKi8KIAlvY19zZXRyZWcoaTJjLCBPQ0kyQ19DT05UUk9MLCBvY19nZXRyZWcoaTJjLCBPQ0kyQ19DT05UUk9MKQpAQCAtMzA0LDE4ICszNjIsNiBAQAogCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7Ci0JaWYgKHJlcykKLQkJZnJlZV9pcnEocmVzLT5zdGFydCwgaTJjKTsKLQotCWlvdW5tYXAoaTJjLT5iYXNlKTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHJlcykKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0KLQlrZnJlZShpMmMpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0NCw2ICszOTAsMTYgQEAKICNkZWZpbmUgb2NvcmVzX2kyY19yZXN1bWUJTlVMTAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9jb3Jlc19pMmNfbWF0Y2hbXSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5jb21wYXRpYmxlID0gIm9wZW5jb3JlcyxpMmMtb2NvcmVzIiwKKyAgICAgICAgfSwKKyAgICAgICAge30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2NvcmVzX2kyY19tYXRjaCk7CisjZW5kaWYKKwogLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm9jb3Jlcy1pMmMiKTsKIApAQCAtMzU1LDYgKzQxMSw5IEBACiAJLmRyaXZlciAgPSB7CiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkubmFtZSA9ICJvY29yZXMtaTJjIiwKKyNpZmRlZiBDT05GSUdfT0YKKyAgICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBvY29yZXNfaTJjX21hdGNoLAorI2VuZGlmCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKaW5kZXggOWQwOTA4My4uYjYwNWZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMKQEAgLTU5OCwxMiArNTk4LDggQEAKIAkgKiBSRVZJU0lUOiBXZSBzaG91bGQgYWJvcnQgdGhlIHRyYW5zZmVyIG9uIHNpZ25hbHMsIGJ1dCB0aGUgYnVzIGdvZXMKIAkgKiBpbnRvIGFyYml0cmF0aW9uIGFuZCB3ZSdyZSBjdXJyZW50bHkgdW5hYmxlIHRvIHJlY292ZXIgZnJvbSBpdC4KIAkgKi8KLQlpZiAoZGV2LT5zZXRfbXB1X3drdXBfbGF0ICE9IE5VTEwpCi0JCWRldi0+c2V0X21wdV93a3VwX2xhdChkZXYtPmRldiwgZGV2LT5sYXRlbmN5KTsKIAlyID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwKIAkJCQkJT01BUF9JMkNfVElNRU9VVCk7Ci0JaWYgKGRldi0+c2V0X21wdV93a3VwX2xhdCAhPSBOVUxMKQotCQlkZXYtPnNldF9tcHVfd2t1cF9sYXQoZGV2LT5kZXYsIC0xKTsKIAlkZXYtPmJ1Zl9sZW4gPSAwOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CkBAIC02NTQsMTIgKzY1MCwxOCBAQAogCWlmIChyIDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoZGV2LT5zZXRfbXB1X3drdXBfbGF0ICE9IE5VTEwpCisJCWRldi0+c2V0X21wdV93a3VwX2xhdChkZXYtPmRldiwgZGV2LT5sYXRlbmN5KTsKKwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQlyID0gb21hcF9pMmNfeGZlcl9tc2coYWRhcCwgJm1zZ3NbaV0sIChpID09IChudW0gLSAxKSkpOwogCQlpZiAociAhPSAwKQogCQkJYnJlYWs7CiAJfQogCisJaWYgKGRldi0+c2V0X21wdV93a3VwX2xhdCAhPSBOVUxMKQorCQlkZXYtPnNldF9tcHVfd2t1cF9sYXQoZGV2LT5kZXYsIC0xKTsKKwogCWlmIChyID09IDApCiAJCXIgPSBudW07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCmluZGV4IDUzZmFiNTEuLjk4NmU1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDAsNiArNDEsNyBAQAogCiBNT0RVTEVfQVVUSE9SKCJDaHJpc3RlciBXZWluaWdlbCA8d2luZ2VsQG5hbm8tc3lzdGVtLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyBEcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Y3M1NTM1LXNtYiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIE1BWF9ERVZJQ0VTIDQKQEAgLTg0LDEwICs4Niw2IEBACiAJdTggKnB0cjsKIAljaGFyIG5lZWRzX3Jlc2V0OwogCXVuc2lnbmVkIGxlbjsKLQotCS8qIFBDSSBkZXZpY2UgaW5mbyAqLwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCWludCBiYXI7CiB9OwogCiAvKiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLwpAQCAtMzkxLDcgKzM4OSw3IEBACiBzdGF0aWMgc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKnNjeDIwMF9hY2JfbGlzdDsKIHN0YXRpYyBERUZJTkVfTVVURVgoc2N4MjAwX2FjYl9saXN0X211dGV4KTsKIAotc3RhdGljIF9faW5pdCBpbnQgc2N4MjAwX2FjYl9wcm9iZShzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2UpCitzdGF0aWMgX19kZXZpbml0IGludCBzY3gyMDBfYWNiX3Byb2JlKHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZSkKIHsKIAl1OCB2YWw7CiAKQEAgLTQyNyw3ICs0MjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbml0IHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICpzY3gyMDBfY3JlYXRlX2lmYWNlKGNvbnN0IGNoYXIgKnRleHQsCitzdGF0aWMgX19kZXZpbml0IHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICpzY3gyMDBfY3JlYXRlX2lmYWNlKGNvbnN0IGNoYXIgKnRleHQsCiAJCXN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KQogewogCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKQEAgLTQ1Miw3ICs0NTAsNyBAQAogCXJldHVybiBpZmFjZTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2FjYl9jcmVhdGUoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQorc3RhdGljIGludCBfX2RldmluaXQgc2N4MjAwX2FjYl9jcmVhdGUoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKIAlpbnQgcmM7CkBAIC00NzIsNjcgKzQ3MCwzMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltdXRleF9sb2NrKCZzY3gyMDBfYWNiX2xpc3RfbXV0ZXgpOwotCWlmYWNlLT5uZXh0ID0gc2N4MjAwX2FjYl9saXN0OwotCXNjeDIwMF9hY2JfbGlzdCA9IGlmYWNlOwotCW11dGV4X3VubG9jaygmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKKwlpZiAoIWFkYXB0ZXItPmRldi5wYXJlbnQpIHsKKwkJLyogSWYgdGhlcmUncyBubyBkZXYsIHdlJ3JlIHRyYWNraW5nIChJU0EpIGlmYWNlcyBtYW51YWxseSAqLworCQltdXRleF9sb2NrKCZzY3gyMDBfYWNiX2xpc3RfbXV0ZXgpOworCQlpZmFjZS0+bmV4dCA9IHNjeDIwMF9hY2JfbGlzdDsKKwkJc2N4MjAwX2FjYl9saXN0ID0gaWZhY2U7CisJCW11dGV4X3VubG9jaygmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgc2N4MjAwX2NyZWF0ZV9wY2koY29uc3QgY2hhciAqdGV4dCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCWludCBiYXIpCitzdGF0aWMgc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKiBfX2RldmluaXQgc2N4MjAwX2NyZWF0ZV9kZXYoY29uc3QgY2hhciAqdGV4dCwKKwkJdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgaW5kZXgsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CiAJaW50IHJjOwogCi0JaWZhY2UgPSBzY3gyMDBfY3JlYXRlX2lmYWNlKHRleHQsICZwZGV2LT5kZXYsIDApOworCWlmYWNlID0gc2N4MjAwX2NyZWF0ZV9pZmFjZSh0ZXh0LCBkZXYsIGluZGV4KTsKIAogCWlmIChpZmFjZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmYWNlLT5wZGV2ID0gcGRldjsKLQlpZmFjZS0+YmFyID0gYmFyOwotCi0JcmMgPSBwY2lfZW5hYmxlX2RldmljZV9pbyhpZmFjZS0+cGRldik7Ci0JaWYgKHJjKQotCQlnb3RvIGVycm91dF9mcmVlOwotCi0JcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24oaWZhY2UtPnBkZXYsIGlmYWNlLT5iYXIsIGlmYWNlLT5hZGFwdGVyLm5hbWUpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBQQ0kgQkFSICVkXG4iLAotCQkJCWlmYWNlLT5iYXIpOwotCQlnb3RvIGVycm91dF9mcmVlOwotCX0KLQotCWlmYWNlLT5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlmYWNlLT5wZGV2LCBpZmFjZS0+YmFyKTsKLQlyYyA9IHNjeDIwMF9hY2JfY3JlYXRlKGlmYWNlKTsKLQotCWlmIChyYyA9PSAwKQotCQlyZXR1cm4gMDsKLQotCXBjaV9yZWxlYXNlX3JlZ2lvbihpZmFjZS0+cGRldiwgaWZhY2UtPmJhcik7Ci0JcGNpX2Rldl9wdXQoaWZhY2UtPnBkZXYpOwotIGVycm91dF9mcmVlOgotCWtmcmVlKGlmYWNlKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNjeDIwMF9jcmVhdGVfaXNhKGNvbnN0IGNoYXIgKnRleHQsIHVuc2lnbmVkIGxvbmcgYmFzZSwKLQkJaW50IGluZGV4KQotewotCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKLQlpbnQgcmM7Ci0KLQlpZmFjZSA9IHNjeDIwMF9jcmVhdGVfaWZhY2UodGV4dCwgTlVMTCwgaW5kZXgpOwotCi0JaWYgKGlmYWNlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKIAogCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgOCwgaWZhY2UtPmFkYXB0ZXIubmFtZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogY2FuJ3QgYWxsb2NhdGUgaW8gMHglbHgtMHglbHhcbiIsCiAJCSAgICAgICBiYXNlLCBiYXNlICsgOCAtIDEpOwotCQlyYyA9IC1FQlVTWTsKIAkJZ290byBlcnJvdXRfZnJlZTsKIAl9CiAKQEAgLTU0MCwxMTUgKzUwMiwxMTMgQEAKIAlyYyA9IHNjeDIwMF9hY2JfY3JlYXRlKGlmYWNlKTsKIAogCWlmIChyYyA9PSAwKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGlmYWNlOwogCiAJcmVsZWFzZV9yZWdpb24oYmFzZSwgOCk7CiAgZXJyb3V0X2ZyZWU6CiAJa2ZyZWUoaWZhY2UpOwotCXJldHVybiByYzsKKwlyZXR1cm4gTlVMTDsKIH0KIAotLyogRHJpdmVyIGRhdGEgaXMgYW4gaW5kZXggaW50byB0aGUgc2N4MjAwX2RhdGEgYXJyYXkgdGhhdCBpbmRpY2F0ZXMKLSAqIHRoZSBuYW1lIGFuZCB0aGUgQkFSIHdoZXJlIHRoZSBJL08gYWRkcmVzcyByZXNvdXJjZSBpcyBsb2NhdGVkLiAgSVNBCi0gKiBkZXZpY2VzIGFyZSBmbGFnZ2VkIHdpdGggYSBiYXIgdmFsdWUgb2YgLTEgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHNjeDIwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjeDIwMF9wY2lbXSBfX2luaXRjb25zdCA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfQlJJREdFKSwKLQkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQzExMDBfQlJJREdFKSwKLQkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSVNBKSwKLQkgIC5kcml2ZXJfZGF0YSA9IDEgfSwKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EpLAotCSAgLmRyaXZlcl9kYXRhID0gMiB9LAorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBmZXRjaCBkZXZpY2UgcmVzb3VyY2UgaW5mb1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmYWNlID0gc2N4MjAwX2NyZWF0ZV9kZXYoIkNTNTUzNSIsIHJlcy0+c3RhcnQsIDAsICZwZGV2LT5kZXYpOworCWlmICghaWZhY2UpCisJCXJldHVybiAtRUlPOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlNDeDIwMCBkZXZpY2UgJyVzJyByZWdpc3RlcmVkXG4iLAorCQkJaWZhY2UtPmFkYXB0ZXIubmFtZSk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaWZhY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzY3gyMDBfY2xlYW51cF9pZmFjZShzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2UpCit7CisJaTJjX2RlbF9hZGFwdGVyKCZpZmFjZS0+YWRhcHRlcik7CisJcmVsZWFzZV9yZWdpb24oaWZhY2UtPmJhc2UsIDgpOworCWtmcmVlKGlmYWNlKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2N4MjAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKKworCWlmYWNlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJc2N4MjAwX2NsZWFudXBfaWZhY2UoaWZhY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNjeDIwMF9wY2lfZHJ2ID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImNzNTUzNS1zbWIiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHNjeDIwMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aoc2N4MjAwX3JlbW92ZSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2N4MjAwX2lzYVtdIF9faW5pdGNvbnN0ID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgfSwKIAl7IDAsIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IGJhcjsKLX0gc2N4MjAwX2RhdGFbXSA9IHsKLQl7ICJTQ3gyMDAiLCAtMSB9LAotCXsgIkNTNTUzNSIsICAwIH0sCi0JeyAiQ1M1NTM2IiwgIDAgfQotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgc2N4MjAwX3NjYW5fcGNpKHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgc2N4MjAwX3NjYW5faXNhKHZvaWQpCiB7Ci0JaW50IGRhdGEsIGRldjsKLQlpbnQgcmMgPSAtRU5PREVWOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWludCBpOwogCi0JZm9yKGRldiA9IDA7IGRldiA8IEFSUkFZX1NJWkUoc2N4MjAwX3BjaSk7IGRldisrKSB7Ci0JCXBkZXYgPSBwY2lfZ2V0X2RldmljZShzY3gyMDBfcGNpW2Rldl0udmVuZG9yLAotCQkJCXNjeDIwMF9wY2lbZGV2XS5kZXZpY2UsIE5VTEwpOworCWlmICghcGNpX2Rldl9wcmVzZW50KHNjeDIwMF9pc2EpKQorCQlyZXR1cm47CiAKLQkJaWYgKHBkZXYgPT0gTlVMTCkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFVklDRVM7ICsraSkgeworCQlpZiAoYmFzZVtpXSA9PSAwKQogCQkJY29udGludWU7CiAKLQkJZGF0YSA9IHNjeDIwMF9wY2lbZGV2XS5kcml2ZXJfZGF0YTsKLQotCQkvKiBpZiAuYmFyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVybywgdGhpcyBpcyBhCi0JCSAqIFBDSSBkZXZpY2UgLSBvdGhlcndpc2UsIHdlIGFzc3VtZQotCQkgICB0aGF0IHRoZSBwb3J0cyBhcmUgSVNBIGJhc2VkCi0JCSovCi0KLQkJaWYgKHNjeDIwMF9kYXRhW2RhdGFdLmJhciA+PSAwKQotCQkJcmMgPSBzY3gyMDBfY3JlYXRlX3BjaShzY3gyMDBfZGF0YVtkYXRhXS5uYW1lLCBwZGV2LAotCQkJCQlzY3gyMDBfZGF0YVtkYXRhXS5iYXIpOwotCQllbHNlIHsKLQkJCWludCBpOwotCi0JCQlwY2lfZGV2X3B1dChwZGV2KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgKytpKSB7Ci0JCQkJaWYgKGJhc2VbaV0gPT0gMCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlyYyA9IHNjeDIwMF9jcmVhdGVfaXNhKHNjeDIwMF9kYXRhW2RhdGFdLm5hbWUsCi0JCQkJCQliYXNlW2ldLAotCQkJCQkJaSk7Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKKwkJLyogWFhYOiBzaG91bGQgd2UgY2FyZSBhYm91dCBmYWlsdXJlcz8gKi8KKwkJc2N4MjAwX2NyZWF0ZV9kZXYoIlNDeDIwMCIsIGJhc2VbaV0sIGksIE5VTEwpOwogCX0KLQotCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2FjYl9pbml0KHZvaWQpCiB7Ci0JaW50IHJjOwotCiAJcHJfZGVidWcoTkFNRSAiOiBOYXRTZW1pIFNDeDIwMCBBQ0NFU1MuYnVzIERyaXZlclxuIik7CiAKLQlyYyA9IHNjeDIwMF9zY2FuX3BjaSgpOworCS8qIEZpcnN0IHNjYW4gZm9yIElTQS1iYXNlZCBkZXZpY2VzICovCisJc2N4MjAwX3NjYW5faXNhKCk7CS8qIFhYWDogc2hvdWxkIHdlIGNhcmUgYWJvdXQgZXJyb3JzPyAqLwogCiAJLyogSWYgYXQgbGVhc3Qgb25lIGJ1cyB3YXMgY3JlYXRlZCwgaW5pdCBtdXN0IHN1Y2NlZWQgKi8KIAlpZiAoc2N4MjAwX2FjYl9saXN0KQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gcmM7CisKKwkvKiBObyBJU0EgZGV2aWNlczsgcmVnaXN0ZXIgdGhlIHBsYXRmb3JtIGRyaXZlciBmb3IgUENJLWJhc2VkIGRldmljZXMgKi8KKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzY3gyMDBfcGNpX2Rydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzY3gyMDBfYWNiX2NsZWFudXAodm9pZCkKIHsKIAlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CiAKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2N4MjAwX3BjaV9kcnYpOworCiAJbXV0ZXhfbG9jaygmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKIAl3aGlsZSAoKGlmYWNlID0gc2N4MjAwX2FjYl9saXN0KSAhPSBOVUxMKSB7CiAJCXNjeDIwMF9hY2JfbGlzdCA9IGlmYWNlLT5uZXh0OwogCQltdXRleF91bmxvY2soJnNjeDIwMF9hY2JfbGlzdF9tdXRleCk7CiAKLQkJaTJjX2RlbF9hZGFwdGVyKCZpZmFjZS0+YWRhcHRlcik7CisJCXNjeDIwMF9jbGVhbnVwX2lmYWNlKGlmYWNlKTsKIAotCQlpZiAoaWZhY2UtPnBkZXYpIHsKLQkJCXBjaV9yZWxlYXNlX3JlZ2lvbihpZmFjZS0+cGRldiwgaWZhY2UtPmJhcik7Ci0JCQlwY2lfZGV2X3B1dChpZmFjZS0+cGRldik7Ci0JCX0KLQkJZWxzZQotCQkJcmVsZWFzZV9yZWdpb24oaWZhY2UtPmJhc2UsIDgpOwotCi0JCWtmcmVlKGlmYWNlKTsKIAkJbXV0ZXhfbG9jaygmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzY3gyMDBfYWNiX2xpc3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggNmI0Y2M1Ni4uYzdkYjY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC0xMzYyLDcgKzEzNjIsNyBAQAogICoKICAqIFJldHVybnMgbmVnYXRpdmUgZXJybm8sIG9yIGVsc2UgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogICovCi1pbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoraW50IGkyY19tYXN0ZXJfc2VuZChjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGNsaWVudC0+YWRhcHRlcjsKQEAgLTEzODksNyArMTM4OSw3IEBACiAgKgogICogUmV0dXJucyBuZWdhdGl2ZSBlcnJubywgb3IgZWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCiAgKi8KLWludCBpMmNfbWFzdGVyX3JlY3Yoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY2hhciAqYnVmLCBpbnQgY291bnQpCitpbnQgaTJjX21hc3Rlcl9yZWN2KGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9IGNsaWVudC0+YWRhcHRlcjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CkBAIC0xNjc5LDcgKzE2NzksNyBAQAogICogVGhpcyBleGVjdXRlcyB0aGUgU01CdXMgInJlY2VpdmUgYnl0ZSIgcHJvdG9jb2wsIHJldHVybmluZyBuZWdhdGl2ZSBlcnJubwogICogZWxzZSB0aGUgYnl0ZSByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCiAgKi8KLXMzMiBpMmNfc21idXNfcmVhZF9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IHN0YXR1czsKQEAgLTE2OTksNyArMTY5OSw3IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAic2VuZCBieXRlIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCiAgKiBlbHNlIHplcm8gb24gc3VjY2Vzcy4KICAqLwotczMyIGkyY19zbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHZhbHVlKQorczMyIGkyY19zbWJ1c193cml0ZV9ieXRlKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHZhbHVlKQogewogCXJldHVybiBpMmNfc21idXNfeGZlcihjbGllbnQtPmFkYXB0ZXIsIGNsaWVudC0+YWRkciwgY2xpZW50LT5mbGFncywKIAkgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1dSSVRFLCB2YWx1ZSwgSTJDX1NNQlVTX0JZVEUsIE5VTEwpOwpAQCAtMTcxNCw3ICsxNzE0LDcgQEAKICAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJyZWFkIGJ5dGUiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgYSBkYXRhIGJ5dGUgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlLgogICovCi1zMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQpCitzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgc3RhdHVzOwpAQCAtMTczNSw3ICsxNzM1LDggQEAKICAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJ3cml0ZSBieXRlIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCiAgKiBlbHNlIHplcm8gb24gc3VjY2Vzcy4KICAqLwotczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTggdmFsdWUpCitzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJICAgICAgdTggdmFsdWUpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlkYXRhLmJ5dGUgPSB2YWx1ZTsKQEAgLTE3NTMsNyArMTc1NCw3IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAicmVhZCB3b3JkIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCiAgKiBlbHNlIGEgMTYtYml0IHVuc2lnbmVkICJ3b3JkIiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCiAgKi8KLXMzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKK3MzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWludCBzdGF0dXM7CkBAIC0xNzc0LDcgKzE3NzUsOCBAQAogICogVGhpcyBleGVjdXRlcyB0aGUgU01CdXMgIndyaXRlIHdvcmQiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgemVybyBvbiBzdWNjZXNzLgogICovCi1zMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLCB1MTYgdmFsdWUpCitzMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJICAgICAgdTE2IHZhbHVlKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJZGF0YS53b3JkID0gdmFsdWU7CkBAIC0xNzkzLDcgKzE3OTUsOCBAQAogICogVGhpcyBleGVjdXRlcyB0aGUgU01CdXMgInByb2Nlc3MgY2FsbCIgcHJvdG9jb2wsIHJldHVybmluZyBuZWdhdGl2ZSBlcnJubwogICogZWxzZSBhIDE2LWJpdCB1bnNpZ25lZCAid29yZCIgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlLgogICovCi1zMzIgaTJjX3NtYnVzX3Byb2Nlc3NfY2FsbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLCB1MTYgdmFsdWUpCitzMzIgaTJjX3NtYnVzX3Byb2Nlc3NfY2FsbChjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCQkJICAgdTE2IHZhbHVlKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IHN0YXR1czsKQEAgLTE4MjEsNyArMTgyNCw3IEBACiAgKiBzdXBwb3J0IHRoaXM7IGl0cyBlbXVsYXRpb24gdGhyb3VnaCBJMkMgbWVzc2FnaW5nIHJlbGllcyBvbiBhIHNwZWNpZmljCiAgKiBtZWNoYW5pc20gKEkyQ19NX1JFQ1ZfTEVOKSB3aGljaCBtYXkgbm90IGJlIGltcGxlbWVudGVkLgogICovCi1zMzIgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorczMyIGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCSAgICAgIHU4ICp2YWx1ZXMpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKQEAgLTE4NDgsNyArMTg1MSw3IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAiYmxvY2sgd3JpdGUiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgemVybyBvbiBzdWNjZXNzLgogICovCi1zMzIgaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKK3MzMiBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAogCQkJICAgICAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwpAQCAtMTg2NCw3ICsxODY3LDcgQEAKIEVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEpOwogCiAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVhZCBieXRlcyAqLwotczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCitzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCQkgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwpAQCAtMTg4NCw3ICsxODg3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEpOwogCi1zMzIgaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCitzMzIgaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCiAJCQkJICAgdTggbGVuZ3RoLCBjb25zdCB1OCAqdmFsdWVzKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvbXV4ZXMvS2NvbmZpZwppbmRleCA0ZDkxZDgwLi45MGI3YTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL0tjb25maWcKQEAgLTUsNiArNSwxOCBAQAogbWVudSAiTXVsdGlwbGV4ZXIgSTJDIENoaXAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEkyQ19NVVgKIAorY29uZmlnIEkyQ19NVVhfR1BJTworCXRyaXN0YXRlICJHUElPLWJhc2VkIEkyQyBtdWx0aXBsZXhlciIKKwlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIGEKKwkgIEdQSU8gYmFzZWQgSTJDIG11bHRpcGxleGVyLiBUaGlzIGRyaXZlciBwcm92aWRlcyBhY2Nlc3MgdG8KKwkgIEkyQyBidXNzZXMgY29ubmVjdGVkIHRocm91Z2ggYSBNVVgsIHdoaWNoIGlzIGNvbnRyb2xsZWQKKwkgIHRocm91Z2ggR1BJTyBwaW5zLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBncGlvLWkyY211eC4KKwogY29uZmlnIEkyQ19NVVhfUENBOTU0MQogCXRyaXN0YXRlICJOWFAgUENBOTU0MSBJMkMgTWFzdGVyIFNlbGVjdG9yIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL211eGVzL01ha2VmaWxlCmluZGV4IGQ3NDM4MDYuLjQ2NDA0MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL211eGVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL01ha2VmaWxlCkBAIC0xLDYgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgbXVsdGlwbGV4ZXIgSTJDIGNoaXAgZHJpdmVycy4KIAorb2JqLSQoQ09ORklHX0kyQ19NVVhfR1BJTykJKz0gZ3Bpby1pMmNtdXgubwogb2JqLSQoQ09ORklHX0kyQ19NVVhfUENBOTU0MSkJKz0gcGNhOTU0MS5vCiBvYmotJChDT05GSUdfSTJDX01VWF9QQ0E5NTR4KQkrPSBwY2E5NTR4Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXguYyBiL2RyaXZlcnMvaTJjL211eGVzL2dwaW8taTJjbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2Y2U2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL2dwaW8taTJjbXV4LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBJMkMgbXVsdGlwbGV4ZXIgdXNpbmcgR1BJTyBBUEkKKyAqCisgKiBQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLW11eC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8taTJjbXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKK3N0cnVjdCBncGlvbXV4IHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnBhcmVudDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiphZGFwOyAvKiBjaGlsZCBidXNzZXMgKi8KKwlzdHJ1Y3QgZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSBkYXRhOworfTsKKworc3RhdGljIHZvaWQgZ3Bpb211eF9zZXQoY29uc3Qgc3RydWN0IGdwaW9tdXggKm11eCwgdW5zaWduZWQgdmFsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG11eC0+ZGF0YS5uX2dwaW9zOyBpKyspCisJCWdwaW9fc2V0X3ZhbHVlKG11eC0+ZGF0YS5ncGlvc1tpXSwgdmFsICYgKDEgPDwgaSkpOworfQorCitzdGF0aWMgaW50IGdwaW9tdXhfc2VsZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdm9pZCAqZGF0YSwgdTMyIGNoYW4pCit7CisJc3RydWN0IGdwaW9tdXggKm11eCA9IGRhdGE7CisKKwlncGlvbXV4X3NldChtdXgsIG11eC0+ZGF0YS52YWx1ZXNbY2hhbl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb211eF9kZXNlbGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHZvaWQgKmRhdGEsIHUzMiBjaGFuKQoreworCXN0cnVjdCBncGlvbXV4ICptdXggPSBkYXRhOworCisJZ3Bpb211eF9zZXQobXV4LCBtdXgtPmRhdGEuaWRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZ3Bpb211eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvbXV4ICptdXg7CisJc3RydWN0IGdwaW9faTJjbXV4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBpMmNfYWRhcHRlciAqcGFyZW50OworCWludCAoKmRlc2VsZWN0KSAoc3RydWN0IGkyY19hZGFwdGVyICosIHZvaWQgKiwgdTMyKTsKKwl1bnNpZ25lZCBpbml0aWFsX3N0YXRlOworCWludCBpLCByZXQ7CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGFyZW50ID0gaTJjX2dldF9hZGFwdGVyKHBkYXRhLT5wYXJlbnQpOworCWlmICghcGFyZW50KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcmVudCBhZGFwdGVyICglZCkgbm90IGZvdW5kXG4iLAorCQkJcGRhdGEtPnBhcmVudCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW11eCA9IGt6YWxsb2Moc2l6ZW9mKCptdXgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW11eCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2ZhaWxlZDsKKwl9CisKKwltdXgtPnBhcmVudCA9IHBhcmVudDsKKwltdXgtPmRhdGEgPSAqcGRhdGE7CisJbXV4LT5hZGFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyICopICogcGRhdGEtPm5fdmFsdWVzLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghbXV4LT5hZGFwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZmFpbGVkMjsKKwl9CisKKwlpZiAocGRhdGEtPmlkbGUgIT0gR1BJT19JMkNNVVhfTk9fSURMRSkgeworCQlpbml0aWFsX3N0YXRlID0gcGRhdGEtPmlkbGU7CisJCWRlc2VsZWN0ID0gZ3Bpb211eF9kZXNlbGVjdDsKKwl9IGVsc2UgeworCQlpbml0aWFsX3N0YXRlID0gcGRhdGEtPnZhbHVlc1swXTsKKwkJZGVzZWxlY3QgPSBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bl9ncGlvczsgaSsrKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+Z3Bpb3NbaV0sICJncGlvLWkyY211eCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmVxdWVzdF9ncGlvOworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPmdwaW9zW2ldLAorCQkJCSAgICAgIGluaXRpYWxfc3RhdGUgJiAoMSA8PCBpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uX3ZhbHVlczsgaSsrKSB7CisJCXUzMiBuciA9IHBkYXRhLT5iYXNlX25yID8gKHBkYXRhLT5iYXNlX25yICsgaSkgOiAwOworCisJCW11eC0+YWRhcFtpXSA9IGkyY19hZGRfbXV4X2FkYXB0ZXIocGFyZW50LCBtdXgsIG5yLCBpLAorCQkJCQkJICAgZ3Bpb211eF9zZWxlY3QsIGRlc2VsZWN0KTsKKwkJaWYgKCFtdXgtPmFkYXBbaV0pIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIGFkYXB0ZXIgJWRcbiIsIGkpOworCQkJZ290byBhZGRfYWRhcHRlcl9mYWlsZWQ7CisJCX0KKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJWQgcG9ydCBtdXggb24gJXMgYWRhcHRlclxuIiwKKwkJIHBkYXRhLT5uX3ZhbHVlcywgcGFyZW50LT5uYW1lKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG11eCk7CisKKwlyZXR1cm4gMDsKKworYWRkX2FkYXB0ZXJfZmFpbGVkOgorCWZvciAoOyBpID4gMDsgaS0tKQorCQlpMmNfZGVsX211eF9hZGFwdGVyKG11eC0+YWRhcFtpIC0gMV0pOworCWkgPSBwZGF0YS0+bl9ncGlvczsKK2Vycl9yZXF1ZXN0X2dwaW86CisJZm9yICg7IGkgPiAwOyBpLS0pCisJCWdwaW9fZnJlZShwZGF0YS0+Z3Bpb3NbaSAtIDFdKTsKKwlrZnJlZShtdXgtPmFkYXApOworYWxsb2NfZmFpbGVkMjoKKwlrZnJlZShtdXgpOworYWxsb2NfZmFpbGVkOgorCWkyY19wdXRfYWRhcHRlcihwYXJlbnQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZ3Bpb211eF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3Bpb211eCAqbXV4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXV4LT5kYXRhLm5fdmFsdWVzOyBpKyspCisJCWkyY19kZWxfbXV4X2FkYXB0ZXIobXV4LT5hZGFwW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBtdXgtPmRhdGEubl9ncGlvczsgaSsrKQorCQlncGlvX2ZyZWUobXV4LT5kYXRhLmdwaW9zW2ldKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWkyY19wdXRfYWRhcHRlcihtdXgtPnBhcmVudCk7CisJa2ZyZWUobXV4LT5hZGFwKTsKKwlrZnJlZShtdXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9tdXhfZHJpdmVyID0geworCS5wcm9iZQk9IGdwaW9tdXhfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGdwaW9tdXhfcmVtb3ZlKSwKKwkuZHJpdmVyCT0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSAiZ3Bpby1pMmNtdXgiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBncGlvbXV4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZncGlvbXV4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBncGlvbXV4X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3Bpb211eF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChncGlvbXV4X2luaXQpOworbW9kdWxlX2V4aXQoZ3Bpb211eF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPLWJhc2VkIEkyQyBtdWx0aXBsZXhlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlBldGVyIEtvcnNnYWFyZCA8cGV0ZXIua29yc2dhYXJkQGJhcmNvLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z3Bpby1pMmNtdXgiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMgYi9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jCmluZGV4IDU2YWMwOWQuLjdhY2IzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKKysrIGIvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYwpAQCAtNTksNiArNTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4JLyoga3RpbWVfZ2V0X3JlYWwoKSAqLwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxhc20vbXdhaXQuaD4KIAogI2RlZmluZSBJTlRFTF9JRExFX1ZFUlNJT04gIjAuNCIKQEAgLTczLDYgKzc1LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBtd2FpdF9zdWJzdGF0ZXM7CiAKKyNkZWZpbmUgTEFQSUNfVElNRVJfQUxXQVlTX1JFTElBQkxFIDB4RkZGRkZGRkYKIC8qIFJlbGlhYmxlIExBUElDIFRpbWVyIFN0YXRlcywgYml0IDEgZm9yIEMxIGV0Yy4gICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX3RpbWVyX3JlbGlhYmxlX3N0YXRlcyA9ICgxIDw8IDEpOwkgLyogRGVmYXVsdCB0byBvbmx5IEMxICovCiAKQEAgLTgyLDYgKzg1LDE0IEBACiBzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgKmNwdWlkbGVfc3RhdGVfdGFibGU7CiAKIC8qCisgKiBTZXQgdGhpcyBmbGFnIGZvciBzdGF0ZXMgd2hlcmUgdGhlIEhXIGZsdXNoZXMgdGhlIFRMQiBmb3IgdXMKKyAqIGFuZCBzbyB3ZSBkb24ndCBuZWVkIGNyb3NzLWNhbGxzIHRvIGtlZXAgaXQgY29uc2lzdGVudC4KKyAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIFNXIGZsdXNoZXMgdGhlIFRMQiwgc28gZXZlbiBpZiB0aGUKKyAqIEhXIGRvZXNuJ3QgZG8gdGhlIGZsdXNoaW5nLCB0aGlzIGZsYWcgaXMgc2FmZSB0byB1c2UuCisgKi8KKyNkZWZpbmUgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVECTB4MTAwMDAKKworLyoKICAqIFN0YXRlcyBhcmUgaW5kZXhlZCBieSB0aGUgY3N0YXRlIG51bWJlciwKICAqIHdoaWNoIGlzIGFsc28gdGhlIGluZGV4IGludG8gdGhlIE1XQUlUIGhpbnQgYXJyYXkuCiAgKiBUaHVzIEMwIGlzIGEgZHVtbXkuCkBAIC0xMjIsNyArMTMzLDcgQEAKIAkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgwMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCiAJCS5leGl0X2xhdGVuY3kgPSAxLAotCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDQsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMSwKIAkJLmVudGVyID0gJmludGVsX2lkbGUgfSwKIAl7IC8qIE1XQUlUIEMyICovCiAJCS5uYW1lID0gIlNOQi1DMyIsCkBAIC0xMzAsNyArMTQxLDcgQEAKIAkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikgMHgxMCwKIAkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCiAJCS5leGl0X2xhdGVuY3kgPSA4MCwKLQkJLnRhcmdldF9yZXNpZGVuY3kgPSAxNjAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMjExLAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSB9LAogCXsgLyogTVdBSVQgQzMgKi8KIAkJLm5hbWUgPSAiU05CLUM2IiwKQEAgLTEzOCw3ICsxNDksNyBAQAogCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDIwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEwNCwKLQkJLnRhcmdldF9yZXNpZGVuY3kgPSAyMDgsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMzQ1LAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSB9LAogCXsgLyogTVdBSVQgQzQgKi8KIAkJLm5hbWUgPSAiU05CLUM3IiwKQEAgLTE0Niw3ICsxNTcsNyBAQAogCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSAweDMwLAogCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKIAkJLmV4aXRfbGF0ZW5jeSA9IDEwOSwKLQkJLnRhcmdldF9yZXNpZGVuY3kgPSAzMDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMzQ1LAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSB9LAogfTsKIApAQCAtMjIwLDggKzIzMSw2IEBACiAJa3RfYmVmb3JlID0ga3RpbWVfZ2V0X3JlYWwoKTsKIAogCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCXRyYWNlX3Bvd2VyX3N0YXJ0KFBPV0VSX0NTVEFURSwgKGVheCA+PiA0KSArIDEsIGNwdSk7Ci0JdHJhY2VfY3B1X2lkbGUoKGVheCA+PiA0KSArIDEsIGNwdSk7CiAJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewogCiAJCV9fbW9uaXRvcigodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzLCAwLCAwKTsKQEAgLTI0Myw2ICsyNTIsMzkgQEAKIAlyZXR1cm4gdXNlY19kZWx0YTsKIH0KIAorc3RhdGljIHZvaWQgX19zZXR1cF9icm9hZGNhc3RfdGltZXIodm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gKHVuc2lnbmVkIGxvbmcpYXJnOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlyZWFzb24gPSByZWFzb24gPworCQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PTiA6IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09GRjsKKworCWNsb2NrZXZlbnRzX25vdGlmeShyZWFzb24sICZjcHUpOworfQorCitzdGF0aWMgaW50IF9fY3B1aW5pdCBzZXR1cF9icm9hZGNhc3RfY3B1aHBfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbiwKKwkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaW50IGhvdGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbiAmIDB4ZikgeworCWNhc2UgQ1BVX09OTElORToKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGhvdGNwdSwgX19zZXR1cF9icm9hZGNhc3RfdGltZXIsCisJCQkodm9pZCAqKXRydWUsIDEpOworCQlicmVhazsKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShob3RjcHUsIF9fc2V0dXBfYnJvYWRjYXN0X3RpbWVyLAorCQkJKHZvaWQgKilmYWxzZSwgMSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgc2V0dXBfYnJvYWRjYXN0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gc2V0dXBfYnJvYWRjYXN0X2NwdWhwX25vdGlmeSwKK307CisKIC8qCiAgKiBpbnRlbF9pZGxlX3Byb2JlKCkKICAqLwpAQCAtMzA1LDcgKzM0NywxMSBAQAogCX0KIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVJBVCkpCS8qIEFsd2F5cyBSZWxpYWJsZSBBUElDIFRpbWVyICovCi0JCWxhcGljX3RpbWVyX3JlbGlhYmxlX3N0YXRlcyA9IDB4RkZGRkZGRkY7CisJCWxhcGljX3RpbWVyX3JlbGlhYmxlX3N0YXRlcyA9IExBUElDX1RJTUVSX0FMV0FZU19SRUxJQUJMRTsKKwllbHNlIHsKKwkJc21wX2NhbGxfZnVuY3Rpb24oX19zZXR1cF9icm9hZGNhc3RfdGltZXIsICh2b2lkICopdHJ1ZSwgMSk7CisJCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2V0dXBfYnJvYWRjYXN0X25vdGlmaWVyKTsKKwl9CiAKIAlwcl9kZWJ1ZyhQUkVGSVggInYiIElOVEVMX0lETEVfVkVSU0lPTgogCQkiIG1vZGVsIDB4JVhcbiIsIGJvb3RfY3B1X2RhdGEueDg2X21vZGVsKTsKQEAgLTQwMyw2ICs0NDksMTAgQEAKIHsKIAlpbnQgcmV0dmFsOwogCisJLyogRG8gbm90IGxvYWQgaW50ZWxfaWRsZSBhdCBhbGwgZm9yIG5vdyBpZiBpZGxlPSBpcyBwYXNzZWQgKi8KKwlpZiAoYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSAhPSBJRExFX05PX09WRVJSSURFKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXJldHZhbCA9IGludGVsX2lkbGVfcHJvYmUoKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNDI4LDYgKzQ3OCwxMSBAQAogCWludGVsX2lkbGVfY3B1aWRsZV9kZXZpY2VzX3VuaW5pdCgpOwogCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJmludGVsX2lkbGVfZHJpdmVyKTsKIAorCWlmIChsYXBpY190aW1lcl9yZWxpYWJsZV9zdGF0ZXMgIT0gTEFQSUNfVElNRVJfQUxXQVlTX1JFTElBQkxFKSB7CisJCXNtcF9jYWxsX2Z1bmN0aW9uKF9fc2V0dXBfYnJvYWRjYXN0X3RpbWVyLCAodm9pZCAqKWZhbHNlLCAxKTsKKwkJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2Jyb2FkY2FzdF9ub3RpZmllcik7CisJfQorCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvY3hpb19oYWwuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9jeGlvX2hhbC5jCmluZGV4IDA5ZGRhMGIuLmMzZjVhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9jeGlvX2hhbC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9jeGlvX2hhbC5jCkBAIC0xODksNiArMTg5LDcgQEAKIAlyZXR1cm4gKHJkZXZfcC0+dDNjZGV2X3AtPmN0bChyZGV2X3AtPnQzY2Rldl9wLCBSRE1BX0NRX1NFVFVQLCAmc2V0dXApKTsKIH0KIAorI2lmZGVmIG5vdHlldAogaW50IGN4aW9fcmVzaXplX2NxKHN0cnVjdCBjeGlvX3JkZXYgKnJkZXZfcCwgc3RydWN0IHQzX2NxICpjcSkKIHsKIAlzdHJ1Y3QgcmRtYV9jcV9zZXR1cCBzZXR1cDsKQEAgLTIwMCw2ICsyMDEsNyBAQAogCXNldHVwLm92ZmxfbW9kZSA9IDE7CiAJcmV0dXJuIChyZGV2X3AtPnQzY2Rldl9wLT5jdGwocmRldl9wLT50M2NkZXZfcCwgUkRNQV9DUV9TRVRVUCwgJnNldHVwKSk7CiB9CisjZW5kaWYKIAogc3RhdGljIHUzMiBnZXRfcXBpZChzdHJ1Y3QgY3hpb19yZGV2ICpyZGV2X3AsIHN0cnVjdCBjeGlvX3Vjb250ZXh0ICp1Y3R4KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9fd3IuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9jeGlvX3dyLmgKaW5kZXggNGJiOTk3YS4uODNkMmUxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9fd3IuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvY3hpb193ci5oCkBAIC02ODksNyArNjg5LDcgQEAKICAqIEEgVDMgV1EgaW1wbGVtZW50cyBib3RoIHRoZSBTUSBhbmQgUlEuCiAgKi8KIHN0cnVjdCB0M193cSB7Ci0JdW5pb24gdDNfd3IgKnF1ZXVlOwkJLyogRE1BIGFjY2Vzc2FibGUgbWVtb3J5ICovCisJdW5pb24gdDNfd3IgKnF1ZXVlOwkJLyogRE1BIGFjY2Vzc2libGUgbWVtb3J5ICovCiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsJCS8qIERNQSBhZGRyZXNzIGZvciBIVyAqLwogCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsgLyogdW5tYXAga3J1ZnQgKi8KIAl1MzIgZXJyb3I7CQkJLyogMSBvbmNlIHdlIGdvIHRvIEVSUk9SICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuaAppbmRleCBhMjM3ZDQ5Li5jNTQwNmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmgKQEAgLTMzNSw4ICszMzUsNiBAQAogaW50IGl3Y2hfcG9zdF96Yl9yZWFkKHN0cnVjdCBpd2NoX3FwICpxaHApOwogaW50IGl3Y2hfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBpd2NoX2RldiAqZGV2KTsKIHZvaWQgaXdjaF91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgaXdjaF9kZXYgKmRldik7Ci1pbnQgaXdjaF9xdWllc2NlX3FwcyhzdHJ1Y3QgaXdjaF9jcSAqY2hwKTsKLWludCBpd2NoX3Jlc3VtZV9xcHMoc3RydWN0IGl3Y2hfY3EgKmNocCk7CiB2b2lkIHN0b3BfcmVhZF9yZXBfdGltZXIoc3RydWN0IGl3Y2hfcXAgKnFocCk7CiBpbnQgaXdjaF9yZWdpc3Rlcl9tZW0oc3RydWN0IGl3Y2hfZGV2ICpyaHAsIHN0cnVjdCBpd2NoX3BkICpwaHAsCiAJCSAgICAgIHN0cnVjdCBpd2NoX21yICptaHAsIGludCBzaGlmdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYwppbmRleCAwOTkzMTM3Li4xYjRjZDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKQEAgLTExNDksNTkgKzExNDksMyBAQAogCVBEQkcoIiVzIGV4aXQgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBxaHAtPmF0dHIuc3RhdGUpOwogCXJldHVybiByZXQ7CiB9Ci0KLXN0YXRpYyBpbnQgcXVpZXNjZV9xcChzdHJ1Y3QgaXdjaF9xcCAqcWhwKQotewotCXNwaW5fbG9ja19pcnEoJnFocC0+bG9jayk7Ci0JaXdjaF9xdWllc2NlX3RpZChxaHAtPmVwKTsKLQlxaHAtPmZsYWdzIHw9IFFQX1FVSUVTQ0VEOwotCXNwaW5fdW5sb2NrX2lycSgmcWhwLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZXN1bWVfcXAoc3RydWN0IGl3Y2hfcXAgKnFocCkKLXsKLQlzcGluX2xvY2tfaXJxKCZxaHAtPmxvY2spOwotCWl3Y2hfcmVzdW1lX3RpZChxaHAtPmVwKTsKLQlxaHAtPmZsYWdzICY9IH5RUF9RVUlFU0NFRDsKLQlzcGluX3VubG9ja19pcnEoJnFocC0+bG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2NoX3F1aWVzY2VfcXBzKHN0cnVjdCBpd2NoX2NxICpjaHApCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGl3Y2hfcXAgKnFocDsKLQotCWZvciAoaT0wOyBpIDwgVDNfTUFYX05VTV9RUDsgaSsrKSB7Ci0JCXFocCA9IGdldF9xaHAoY2hwLT5yaHAsIGkpOwotCQlpZiAoIXFocCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKHFocC0+YXR0ci5yY3EgPT0gY2hwLT5jcS5jcWlkKSAmJiAhcXBfcXVpZXNjZWQocWhwKSkgewotCQkJcXVpZXNjZV9xcChxaHApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKChxaHAtPmF0dHIuc2NxID09IGNocC0+Y3EuY3FpZCkgJiYgIXFwX3F1aWVzY2VkKHFocCkpCi0JCQlxdWllc2NlX3FwKHFocCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgaXdjaF9yZXN1bWVfcXBzKHN0cnVjdCBpd2NoX2NxICpjaHApCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGl3Y2hfcXAgKnFocDsKLQotCWZvciAoaT0wOyBpIDwgVDNfTUFYX05VTV9RUDsgaSsrKSB7Ci0JCXFocCA9IGdldF9xaHAoY2hwLT5yaHAsIGkpOwotCQlpZiAoIXFocCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKHFocC0+YXR0ci5yY3EgPT0gY2hwLT5jcS5jcWlkKSAmJiBxcF9xdWllc2NlZChxaHApKSB7Ci0JCQlyZXN1bWVfcXAocWhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICgocWhwLT5hdHRyLnNjcSA9PSBjaHAtPmNxLmNxaWQpICYmIHFwX3F1aWVzY2VkKHFocCkpCi0JCQlyZXN1bWVfcXAocWhwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCmluZGV4IDE2MDMyY2QuLjJmZTE5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApAQCAtNzYwLDcgKzc1OSw2IEBACiBpbnQgYzRpd19mbHVzaF9zcShzdHJ1Y3QgdDRfd3EgKndxLCBzdHJ1Y3QgdDRfY3EgKmNxLCBpbnQgY291bnQpOwogaW50IGM0aXdfZXZfaGFuZGxlcihzdHJ1Y3QgYzRpd19kZXYgKnJuaWNwLCB1MzIgcWlkKTsKIHUxNiBjNGl3X3JxZXNfcG9zdGVkKHN0cnVjdCBjNGl3X3FwICpxaHApOwotaW50IGM0aXdfcG9zdF96Yl9yZWFkKHN0cnVjdCBjNGl3X3FwICpxaHApOwogaW50IGM0aXdfcG9zdF90ZXJtaW5hdGUoc3RydWN0IGM0aXdfcXAgKnFocCwgc3RydWN0IHQ0X2NxZSAqZXJyX2NxZSk7CiB1MzIgYzRpd19nZXRfY3FpZChzdHJ1Y3QgYzRpd19yZGV2ICpyZGV2LCBzdHJ1Y3QgYzRpd19kZXZfdWNvbnRleHQgKnVjdHgpOwogdm9pZCBjNGl3X3B1dF9jcWlkKHN0cnVjdCBjNGl3X3JkZXYgKnJkZXYsIHUzMiBxaWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCmluZGV4IDA1N2NiMjUuLjIwODAwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCkBAIC04OTIsMzYgKzg5Miw2IEBACiAJfQogfQogCi1pbnQgYzRpd19wb3N0X3piX3JlYWQoc3RydWN0IGM0aXdfcXAgKnFocCkKLXsKLQl1bmlvbiB0NF93ciAqd3FlOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTggbGVuMTY7Ci0KLQlQREJHKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOwotCXNrYiA9IGFsbG9jX3NrYig0MCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgc2VuZCB6Yl9yZWFkISFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgcWhwLT5lcC0+dHhxX2lkeCk7Ci0KLQl3cWUgPSAodW5pb24gdDRfd3IgKilza2JfcHV0KHNrYiwgc2l6ZW9mIHdxZS0+cmVhZCk7Ci0JbWVtc2V0KHdxZSwgMCwgc2l6ZW9mIHdxZS0+cmVhZCk7Ci0Jd3FlLT5yZWFkLnIyID0gY3B1X3RvX2JlNjQoMCk7Ci0Jd3FlLT5yZWFkLnN0YWdfc2luayA9IGNwdV90b19iZTMyKDEpOwotCXdxZS0+cmVhZC50b19zaW5rX2hpID0gY3B1X3RvX2JlMzIoMCk7Ci0Jd3FlLT5yZWFkLnRvX3NpbmtfbG8gPSBjcHVfdG9fYmUzMigxKTsKLQl3cWUtPnJlYWQuc3RhZ19zcmMgPSBjcHVfdG9fYmUzMigxKTsKLQl3cWUtPnJlYWQucGxlbiA9IGNwdV90b19iZTMyKDApOwotCXdxZS0+cmVhZC50b19zcmNfaGkgPSBjcHVfdG9fYmUzMigwKTsKLQl3cWUtPnJlYWQudG9fc3JjX2xvID0gY3B1X3RvX2JlMzIoMSk7Ci0JbGVuMTYgPSBESVZfUk9VTkRfVVAoc2l6ZW9mIHdxZS0+cmVhZCwgMTYpOwotCWluaXRfd3JfaGRyKHdxZSwgMCwgRldfUklfUkRNQV9SRUFEX1dSLCBGV19SSV9DT01QTEVUSU9OX0ZMQUcsIGxlbjE2KTsKLQotCXJldHVybiBjNGl3X29mbGRfc2VuZCgmcWhwLT5yaHAtPnJkZXYsIHNrYik7Ci19Ci0KIHN0YXRpYyB2b2lkIHBvc3RfdGVybWluYXRlKHN0cnVjdCBjNGl3X3FwICpxaHAsIHN0cnVjdCB0NF9jcWUgKmVycl9jcWUsCiAJCQkgICBnZnBfdCBnZnApCiB7CkBAIC0xMDI5LDcgKzk5OSw2IEBACiAJd3FlLT5jb29raWUgPSAodW5zaWduZWQgbG9uZykgJmVwLT5jb20ud3Jfd2FpdDsKIAogCXdxZS0+dS5maW5pLnR5cGUgPSBGV19SSV9UWVBFX0ZJTkk7Ci0JYzRpd19pbml0X3dyX3dhaXQoJmVwLT5jb20ud3Jfd2FpdCk7CiAJcmV0ID0gYzRpd19vZmxkX3NlbmQoJnJocC0+cmRldiwgc2tiKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTExMjUsNyArMTA5NCw2IEBACiAJaWYgKHFocC0+YXR0ci5tcGFfYXR0ci5pbml0aWF0b3IpCiAJCWJ1aWxkX3J0cl9tc2cocWhwLT5hdHRyLm1wYV9hdHRyLnAycF90eXBlLCAmd3FlLT51LmluaXQpOwogCi0JYzRpd19pbml0X3dyX3dhaXQoJnFocC0+ZXAtPmNvbS53cl93YWl0KTsKIAlyZXQgPSBjNGl3X29mbGRfc2VuZCgmcmhwLT5yZGV2LCBza2IpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCmluZGV4IDc2NWYwZmMuLmIzM2YwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKQEAgLTUzMCw5ICs1MzAsOCBAQAogCWZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKIAkJaWYgKCFwZGV2LT5yZXNvdXJjZVtqXS5zdGFydCkKIAkJCWNvbnRpbnVlOwotCQlpcGF0aF9jZGJnKFZFUkJPU0UsICJCQVIgJWQgc3RhcnQgJWxseCwgZW5kICVsbHgsIGxlbiAlbGx4XG4iLAotCQkJICAgaiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwZGV2LT5yZXNvdXJjZVtqXS5zdGFydCwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+cmVzb3VyY2Vbal0uZW5kLAorCQlpcGF0aF9jZGJnKFZFUkJPU0UsICJCQVIgJWQgJXBSLCBsZW4gJWxseFxuIiwKKwkJCSAgIGosICZwZGV2LT5yZXNvdXJjZVtqXSwKIAkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX2xlbihwZGV2LCBqKSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCA1YTIxOWEyLi5lOGRmMTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTM5NywxMCArMzk3LDE0IEBACiAJCWNxLT5yZXNpemVfYnVmID0gTlVMTDsKIAkJY3EtPnJlc2l6ZV91bWVtID0gTlVMTDsKIAl9IGVsc2UgeworCQlzdHJ1Y3QgbWx4NF9pYl9jcV9idWYgdG1wX2J1ZjsKKwkJaW50IHRtcF9jcWUgPSAwOworCiAJCXNwaW5fbG9ja19pcnEoJmNxLT5sb2NrKTsKIAkJaWYgKGNxLT5yZXNpemVfYnVmKSB7CiAJCQltbHg0X2liX2NxX3Jlc2l6ZV9jb3B5X2NxZXMoY3EpOwotCQkJbWx4NF9pYl9mcmVlX2NxX2J1ZihkZXYsICZjcS0+YnVmLCBjcS0+aWJjcS5jcWUpOworCQkJdG1wX2J1ZiA9IGNxLT5idWY7CisJCQl0bXBfY3FlID0gY3EtPmliY3EuY3FlOwogCQkJY3EtPmJ1ZiAgICAgID0gY3EtPnJlc2l6ZV9idWYtPmJ1ZjsKIAkJCWNxLT5pYmNxLmNxZSA9IGNxLT5yZXNpemVfYnVmLT5jcWU7CiAKQEAgLTQwOCw2ICs0MTIsOSBAQAogCQkJY3EtPnJlc2l6ZV9idWYgPSBOVUxMOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmY3EtPmxvY2spOworCisJCWlmICh0bXBfY3FlKQorCQkJbWx4NF9pYl9mcmVlX2NxX2J1ZihkZXYsICZ0bXBfYnVmLCB0bXBfY3FlKTsKIAl9CiAKIAlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKaW5kZXggYzlhOGRkNi4uNTdmZmE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKQEAgLTIxMSw2ICsyMTEsOCBAQAogCWlmIChhZ2VudCkgewogCQlzZW5kX2J1ZiA9IGliX2NyZWF0ZV9zZW5kX21hZChhZ2VudCwgcXBuLCAwLCAwLCBJQl9NR01UX01BRF9IRFIsCiAJCQkJCSAgICAgIElCX01HTVRfTUFEX0RBVEEsIEdGUF9BVE9NSUMpOworCQlpZiAoSVNfRVJSKHNlbmRfYnVmKSkKKwkJCXJldHVybjsKIAkJLyoKIAkJICogV2UgcmVseSBoZXJlIG9uIHRoZSBmYWN0IHRoYXQgTUxYIFFQcyBkb24ndCB1c2UgdGhlCiAJCSAqIGFkZHJlc3MgaGFuZGxlIGFmdGVyIHRoZSBzZW5kIGlzIHBvc3RlZCAodGhpcyBpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCmluZGV4IDU2NDg2NTkuLjAzYTU5NTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCkBAIC0xNzEsNiArMTcxLDggQEAKIAlpZiAoYWdlbnQpIHsKIAkJc2VuZF9idWYgPSBpYl9jcmVhdGVfc2VuZF9tYWQoYWdlbnQsIHFwbiwgMCwgMCwgSUJfTUdNVF9NQURfSERSLAogCQkJCQkgICAgICBJQl9NR01UX01BRF9EQVRBLCBHRlBfQVRPTUlDKTsKKwkJaWYgKElTX0VSUihzZW5kX2J1ZikpCisJCQlyZXR1cm47CiAJCS8qCiAJCSAqIFdlIHJlbHkgaGVyZSBvbiB0aGUgZmFjdCB0aGF0IE1MWCBRUHMgZG9uJ3QgdXNlIHRoZQogCQkgKiBhZGRyZXNzIGhhbmRsZSBhZnRlciB0aGUgc2VuZCBpcyBwb3N0ZWQgKHRoaXMgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKaW5kZXggMzg5MmUyYy4uNWE0YzM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMKQEAgLTkwOCw4ICs5MDgsOCBAQAogCQkJCQluZXN2bmljLT5uaWNfaW5kZXggJiYKIAkJCQkJbWNfaW5kZXggPCBtYXhfcGZ0X2VudHJpZXNfYXZhaWFibGUpIHsKIAkJCQkJCW5lc19kZWJ1ZyhORVNfREJHX05JQ19SWCwKLQkJCQkJIm1jX2luZGV4PSVkIHNraXBwaW5nIG5pY19pbmRleD0lZCxcCi0JCQkJCXVzZWQgZm9yPSVkIFxuIiwgbWNfaW5kZXgsCisJCQkJCSJtY19pbmRleD0lZCBza2lwcGluZyBuaWNfaW5kZXg9JWQsICIKKwkJCQkJInVzZWQgZm9yPSVkIFxuIiwgbWNfaW5kZXgsCiAJCQkJCW5lc3ZuaWMtPm5pY19pbmRleCwKIAkJCQkJbmVzYWRhcHRlci0+cGZ0X21jYXN0X21hcFttY19pbmRleF0pOwogCQkJCW1jX2luZGV4Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaAppbmRleCA2NGM5ZTdkLi43MzIyNWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKQEAgLTc2Niw3ICs3NjYsNyBAQAogCXZvaWQgKCpmX3NkbWFfaHdfc3RhcnRfdXApKHN0cnVjdCBxaWJfcHBvcnRkYXRhICopOwogCXZvaWQgKCpmX3NkbWFfaW5pdF9lYXJseSkoc3RydWN0IHFpYl9wcG9ydGRhdGEgKik7CiAJdm9pZCAoKmZfc2V0X2NudHJfc2FtcGxlKShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqLCB1MzIsIHUzMik7Ci0Jdm9pZCAoKmZfdXBkYXRlX3VzcmhlYWQpKHN0cnVjdCBxaWJfY3R4dGRhdGEgKiwgdTY0LCB1MzIsIHUzMik7CisJdm9pZCAoKmZfdXBkYXRlX3VzcmhlYWQpKHN0cnVjdCBxaWJfY3R4dGRhdGEgKiwgdTY0LCB1MzIsIHUzMiwgdTMyKTsKIAl1MzIgKCpmX2hkcnFlbXB0eSkoc3RydWN0IHFpYl9jdHh0ZGF0YSAqKTsKIAl1NjQgKCpmX3BvcnRjbnRyKShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqLCB1MzIpOwogCXUzMiAoKmZfcmVhZF9jbnRycykoc3RydWN0IHFpYl9kZXZkYXRhICosIGxvZmZfdCwgY2hhciAqKiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9jcS5jCmluZGV4IGE4NmNiZjguLjUyNDZhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfY3EuYwpAQCAtMTAwLDcgKzEwMCw4IEBACiAJd2MtPmhlYWQgPSBuZXh0OwogCiAJaWYgKGNxLT5ub3RpZnkgPT0gSUJfQ1FfTkVYVF9DT01QIHx8Ci0JICAgIChjcS0+bm90aWZ5ID09IElCX0NRX1NPTElDSVRFRCAmJiBzb2xpY2l0ZWQpKSB7CisJICAgIChjcS0+bm90aWZ5ID09IElCX0NRX1NPTElDSVRFRCAmJgorCSAgICAgKHNvbGljaXRlZCB8fCBlbnRyeS0+c3RhdHVzICE9IElCX1dDX1NVQ0NFU1MpKSkgewogCQljcS0+bm90aWZ5ID0gSUJfQ1FfTk9ORTsKIAkJY3EtPnRyaWdnZXJlZCsrOwogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwppbmRleCA5Y2QxOTM2Li4yM2U1ODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwpAQCAtNzEsNiArNzEsMTEgQEAKICAqLwogI2RlZmluZSBRSUJfUElPX01BWElCSERSIDEyOAogCisvKgorICogUUlCX01BWF9QS1RfUkNWIGlzIHRoZSBtYXggIyBpZiBwYWNrZXRzIHByb2Nlc3NlZCBwZXIgcmVjZWl2ZSBpbnRlcnJ1cHQuCisgKi8KKyNkZWZpbmUgUUlCX01BWF9QS1RfUkVDViA2NAorCiBzdHJ1Y3QgcWxvZ2ljX2liX3N0YXRzIHFpYl9zdGF0czsKIAogY29uc3QgY2hhciAqcWliX2dldF91bml0X25hbWUoaW50IHVuaXQpCkBAIC0yODQsMTQgKzI4OSwxNDcgQEAKICAqIFJldHVybnMgMSBpZiBlcnJvciB3YXMgYSBDUkMsIGVsc2UgMC4KICAqIE5lZWRlZCBmb3Igc29tZSBjaGlwJ3Mgc3ludGhlc2l6ZWQgZXJyb3IgY291bnRlcnMuCiAgKi8KLXN0YXRpYyB1MzIgcWliX3Jjdl9oZHJlcnIoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCwgdTMyIGN0eHQsCi0JCQkgIHUzMiBlZmxhZ3MsIHUzMiBsLCB1MzIgZXRhaWwsIF9fbGUzMiAqcmhmX2FkZHIsCi0JCQkgIHN0cnVjdCBxaWJfbWVzc2FnZV9oZWFkZXIgKmhkcikKK3N0YXRpYyB1MzIgcWliX3Jjdl9oZHJlcnIoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLAorCQkJICB1MzIgY3R4dCwgdTMyIGVmbGFncywgdTMyIGwsIHUzMiBldGFpbCwKKwkJCSAgX19sZTMyICpyaGZfYWRkciwgc3RydWN0IHFpYl9tZXNzYWdlX2hlYWRlciAqcmhkcikKIHsKIAl1MzIgcmV0ID0gMDsKIAogCWlmIChlZmxhZ3MgJiAoUUxPR0lDX0lCX1JIRl9IX0lDUkNFUlIgfCBRTE9HSUNfSUJfUkhGX0hfVkNSQ0VSUikpCiAJCXJldCA9IDE7CisJZWxzZSBpZiAoZWZsYWdzID09IFFMT0dJQ19JQl9SSEZfSF9USURFUlIpIHsKKwkJLyogRm9yIFRJREVSUiBhbmQgUkMgUVBzIHByZW1wdGl2ZWx5IHNjaGVkdWxlIGEgTkFLICovCisJCXN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IHFpYl9pYl9oZWFkZXIgKikgcmhkcjsKKwkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKKwkJc3RydWN0IHFpYl9pYnBvcnQgKmlicCA9ICZwcGQtPmlicG9ydF9kYXRhOworCQlzdHJ1Y3QgcWliX3FwICpxcCA9IE5VTEw7CisJCXUzMiB0bGVuID0gcWliX2hkcmdldF9sZW5ndGhfaW5fYnl0ZXMocmhmX2FkZHIpOworCQl1MTYgbGlkICA9IGJlMTZfdG9fY3B1KGhkci0+bHJoWzFdKTsKKwkJaW50IGxuaCA9IGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSAmIDM7CisJCXUzMiBxcF9udW07CisJCXUzMiBvcGNvZGU7CisJCXUzMiBwc247CisJCWludCBkaWZmOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCS8qIFNhbml0eSBjaGVjayBwYWNrZXQgKi8KKwkJaWYgKHRsZW4gPCAyNCkKKwkJCWdvdG8gZHJvcDsKKworCQlpZiAobGlkIDwgUUlCX01VTFRJQ0FTVF9MSURfQkFTRSkgeworCQkJbGlkICY9IH4oKDEgPDwgcHBkLT5sbWMpIC0gMSk7CisJCQlpZiAodW5saWtlbHkobGlkICE9IHBwZC0+bGlkKSkKKwkJCQlnb3RvIGRyb3A7CisJCX0KKworCQkvKiBDaGVjayBmb3IgR1JIICovCisJCWlmIChsbmggPT0gUUlCX0xSSF9CVEgpCisJCQlvaGRyID0gJmhkci0+dS5vdGg7CisJCWVsc2UgaWYgKGxuaCA9PSBRSUJfTFJIX0dSSCkgeworCQkJdTMyIHZ0ZjsKKworCQkJb2hkciA9ICZoZHItPnUubC5vdGg7CisJCQlpZiAoaGRyLT51LmwuZ3JoLm5leHRfaGRyICE9IElCX0dSSF9ORVhUX0hEUikKKwkJCQlnb3RvIGRyb3A7CisJCQl2dGYgPSBiZTMyX3RvX2NwdShoZHItPnUubC5ncmgudmVyc2lvbl90Y2xhc3NfZmxvdyk7CisJCQlpZiAoKHZ0ZiA+PiBJQl9HUkhfVkVSU0lPTl9TSElGVCkgIT0gSUJfR1JIX1ZFUlNJT04pCisJCQkJZ290byBkcm9wOworCQl9IGVsc2UKKwkJCWdvdG8gZHJvcDsKKworCQkvKiBHZXQgb3Bjb2RlIGFuZCBQU04gZnJvbSBwYWNrZXQgKi8KKwkJb3Bjb2RlID0gYmUzMl90b19jcHUob2hkci0+YnRoWzBdKTsKKwkJb3Bjb2RlID4+PSAyNDsKKwkJcHNuID0gYmUzMl90b19jcHUob2hkci0+YnRoWzJdKTsKKworCQkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIFFQIG51bWJlci4gKi8KKwkJcXBfbnVtID0gYmUzMl90b19jcHUob2hkci0+YnRoWzFdKSAmIFFJQl9RUE5fTUFTSzsKKwkJaWYgKHFwX251bSAhPSBRSUJfTVVMVElDQVNUX1FQTikgeworCQkJaW50IHJ1Y19yZXM7CisJCQlxcCA9IHFpYl9sb29rdXBfcXBuKGlicCwgcXBfbnVtKTsKKwkJCWlmICghcXApCisJCQkJZ290byBkcm9wOworCisJCQkvKgorCQkJICogSGFuZGxlIG9ubHkgUkMgUVBzIC0gZm9yIG90aGVyIFFQIHR5cGVzIGRyb3AgZXJyb3IKKwkJCSAqIHBhY2tldC4KKwkJCSAqLworCQkJc3Bpbl9sb2NrKCZxcC0+cl9sb2NrKTsKKworCQkJLyogQ2hlY2sgZm9yIHZhbGlkIHJlY2VpdmUgc3RhdGUuICovCisJCQlpZiAoIShpYl9xaWJfc3RhdGVfb3BzW3FwLT5zdGF0ZV0gJgorCQkJICAgICAgUUlCX1BST0NFU1NfUkVDVl9PSykpIHsKKwkJCQlpYnAtPm5fcGt0X2Ryb3BzKys7CisJCQkJZ290byB1bmxvY2s7CisJCQl9CisKKwkJCXN3aXRjaCAocXAtPmlicXAucXBfdHlwZSkgeworCQkJY2FzZSBJQl9RUFRfUkM6CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKKwkJCQlydWNfcmVzID0KKwkJCQkJcWliX3J1Y19jaGVja19oZHIoCisJCQkJCQlpYnAsIGhkciwKKwkJCQkJCWxuaCA9PSBRSUJfTFJIX0dSSCwKKwkJCQkJCXFwLAorCQkJCQkJYmUzMl90b19jcHUob2hkci0+YnRoWzBdKSk7CisJCQkJaWYgKHJ1Y19yZXMpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywKKwkJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJCQlnb3RvIHVubG9jazsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOworCisJCQkJLyogT25seSBkZWFsIHdpdGggUkRNQSBXcml0ZXMgZm9yIG5vdyAqLworCQkJCWlmIChvcGNvZGUgPAorCQkJCSAgICBJQl9PUENPREVfUkNfUkRNQV9SRUFEX1JFU1BPTlNFX0ZJUlNUKSB7CisJCQkJCWRpZmYgPSBxaWJfY21wMjQocHNuLCBxcC0+cl9wc24pOworCQkJCQlpZiAoIXFwLT5yX25ha19zdGF0ZSAmJiBkaWZmID49IDApIHsKKwkJCQkJCWlicC0+bl9yY19zZXFuYWsrKzsKKwkJCQkJCXFwLT5yX25ha19zdGF0ZSA9CisJCQkJCQkJSUJfTkFLX1BTTl9FUlJPUjsKKwkJCQkJCS8qIFVzZSB0aGUgZXhwZWN0ZWQgUFNOLiAqLworCQkJCQkJcXAtPnJfYWNrX3BzbiA9IHFwLT5yX3BzbjsKKwkJCQkJCS8qCisJCQkJCQkgKiBXYWl0IHRvIHNlbmQgdGhlIHNlcXVlbmNlCisJCQkJCQkgKiBOQUsgdW50aWwgYWxsIHBhY2tldHMKKwkJCQkJCSAqIGluIHRoZSByZWNlaXZlIHF1ZXVlIGhhdmUKKwkJCQkJCSAqIGJlZW4gcHJvY2Vzc2VkLgorCQkJCQkJICogT3RoZXJ3aXNlLCB3ZSBlbmQgdXAKKwkJCQkJCSAqIHByb3BhZ2F0aW5nIGNvbmdlc3Rpb24uCisJCQkJCQkgKi8KKwkJCQkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKKwkJCQkJCQlxcC0+cl9mbGFncyB8PQorCQkJCQkJCQlRSUJfUl9SU1BfTkFLOworCQkJCQkJCWF0b21pY19pbmMoCisJCQkJCQkJCSZxcC0+cmVmY291bnQpOworCQkJCQkJCWxpc3RfYWRkX3RhaWwoCisJCQkJCQkJICZxcC0+cnNwd2FpdCwKKwkJCQkJCQkgJnJjZC0+cXBfd2FpdF9saXN0KTsKKwkJCQkJCX0KKwkJCQkJfSAvKiBPdXQgb2Ygc2VxdWVuY2UgTkFLICovCisJCQkJfSAvKiBRUCBSZXF1ZXN0IE5BS3MgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgSUJfUVBUX1NNSToKKwkJCWNhc2UgSUJfUVBUX0dTSToKKwkJCWNhc2UgSUJfUVBUX1VEOgorCQkJY2FzZSBJQl9RUFRfVUM6CisJCQlkZWZhdWx0OgorCQkJCS8qIEZvciBub3cgZG9uJ3QgaGFuZGxlIGFueSBvdGhlciBRUCB0eXBlcyAqLworCQkJCWJyZWFrOworCQkJfQorCit1bmxvY2s6CisJCQlzcGluX3VubG9jaygmcXAtPnJfbG9jayk7CisJCQkvKgorCQkJICogTm90aWZ5IHFpYl9kZXN0cm95X3FwKCkgaWYgaXQgaXMgd2FpdGluZworCQkJICogZm9yIHVzIHRvIGZpbmlzaC4KKwkJCSAqLworCQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCisJCQkJd2FrZV91cCgmcXAtPndhaXQpOworCQl9IC8qIFVuaWNhc3QgUVAgKi8KKwl9IC8qIFZhbGlkIHBhY2tldCB3aXRoIFRJREVyciAqLworCitkcm9wOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzNSw3ICs0NzMsNyBAQAogCQlzbXBfcm1iKCk7ICAvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIHJlYWRzIG9mIGRtYSdlZCBoZHJxICovCiAJfQogCi0JZm9yIChsYXN0ID0gMCwgaSA9IDE7ICFsYXN0ICYmIGkgPD0gNjQ7IGkgKz0gIWxhc3QpIHsKKwlmb3IgKGxhc3QgPSAwLCBpID0gMTsgIWxhc3Q7IGkgKz0gIWxhc3QpIHsKIAkJaGRyID0gZGQtPmZfZ2V0X21zZ2hlYWRlcihkZCwgcmhmX2FkZHIpOwogCQllZmxhZ3MgPSBxaWJfaGRyZ2V0X2Vycl9mbGFncyhyaGZfYWRkcik7CiAJCWV0eXBlID0gcWliX2hkcmdldF9yY3ZfdHlwZShyaGZfYWRkcik7CkBAIC0zNzEsNyArNTA5LDcgQEAKIAkJICogcGFja2V0czsgb25seSBxaWJoZHJlcnIgc2hvdWxkIGJlIHNldC4KIAkJICovCiAJCWlmICh1bmxpa2VseShlZmxhZ3MpKQotCQkJY3JjcyArPSBxaWJfcmN2X2hkcmVycihwcGQsIHJjZC0+Y3R4dCwgZWZsYWdzLCBsLAorCQkJY3JjcyArPSBxaWJfcmN2X2hkcmVycihyY2QsIHBwZCwgcmNkLT5jdHh0LCBlZmxhZ3MsIGwsCiAJCQkJCSAgICAgICBldGFpbCwgcmhmX2FkZHIsIGhkcik7CiAJCWVsc2UgaWYgKGV0eXBlID09IFJDVkhRX1JDVl9UWVBFX05PTl9LRCkgewogCQkJcWliX2liX3JjdihyY2QsIGhkciwgZWJ1ZiwgdGxlbik7CkBAIC0zODQsNiArNTIyLDkgQEAKIAkJbCArPSByc2l6ZTsKIAkJaWYgKGwgPj0gbWF4Y250KQogCQkJbCA9IDA7CisJCWlmIChpID09IFFJQl9NQVhfUEtUX1JFQ1YpCisJCQlsYXN0ID0gMTsKKwogCQlyaGZfYWRkciA9IChfX2xlMzIgKikgcmNkLT5yY3ZoZHJxICsgbCArIGRkLT5yaGZfb2Zmc2V0OwogCQlpZiAoZGQtPmZsYWdzICYgUUlCX05PRE1BX1JUQUlMKSB7CiAJCQl1MzIgc2VxID0gcWliX2hkcmdldF9zZXEocmhmX2FkZHIpOwpAQCAtNDAyLDcgKzU0Myw3IEBACiAJCSAqLwogCQlsdmFsID0gbDsKIAkJaWYgKCFsYXN0ICYmICEoaSAmIDB4ZikpIHsKLQkJCWRkLT5mX3VwZGF0ZV91c3JoZWFkKHJjZCwgbHZhbCwgdXBkZWdyLCBldGFpbCk7CisJCQlkZC0+Zl91cGRhdGVfdXNyaGVhZChyY2QsIGx2YWwsIHVwZGVnciwgZXRhaWwsIGkpOwogCQkJdXBkZWdyID0gMDsKIAkJfQogCX0KQEAgLTQ0NCw3ICs1ODUsNyBAQAogCSAqIGlmIG5vIHBhY2tldHMgd2VyZSBwcm9jZXNzZWQuCiAJICovCiAJbHZhbCA9ICh1NjQpcmNkLT5oZWFkIHwgZGQtPnJoZHJoZWFkX2ludHJfb2ZmOwotCWRkLT5mX3VwZGF0ZV91c3JoZWFkKHJjZCwgbHZhbCwgdXBkZWdyLCBldGFpbCk7CisJZGQtPmZfdXBkYXRlX3VzcmhlYWQocmNkLCBsdmFsLCB1cGRlZ3IsIGV0YWlsLCBpKTsKIAlyZXR1cm4gY3JjczsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKaW5kZXggNzlkOTk3MS4uNzViZmFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCkBAIC0xMzc5LDE3ICsxMzc5LDE3IEBACiAJCS8qIGZpbmQgZGV2aWNlICh3aXRoIEFDVElWRSBwb3J0cykgd2l0aCBmZXdlc3QgY3R4dHMgaW4gdXNlICovCiAJCWZvciAobmRldiA9IDA7IG5kZXYgPCBkZXZtYXg7IG5kZXYrKykgewogCQkJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IHFpYl9sb29rdXAobmRldik7Ci0JCQl1bnNpZ25lZCBjdXNlZCA9IDAsIGNmcmVlID0gMDsKKwkJCXVuc2lnbmVkIGN1c2VkID0gMCwgY2ZyZWUgPSAwLCBwdXNhYmxlID0gMDsKIAkJCWlmICghZGQpCiAJCQkJY29udGludWU7CiAJCQlpZiAocG9ydCAmJiBwb3J0IDw9IGRkLT5udW1fcHBvcnRzICYmCiAJCQkgICAgdXNhYmxlKGRkLT5wcG9ydCArIHBvcnQgLSAxKSkKLQkJCQlkdXNhYmxlID0gMTsKKwkJCQlwdXNhYmxlID0gMTsKIAkJCWVsc2UKIAkJCQlmb3IgKGkgPSAwOyBpIDwgZGQtPm51bV9wcG9ydHM7IGkrKykKIAkJCQkJaWYgKHVzYWJsZShkZC0+cHBvcnQgKyBpKSkKLQkJCQkJCWR1c2FibGUrKzsKLQkJCWlmICghZHVzYWJsZSkKKwkJCQkJCXB1c2FibGUrKzsKKwkJCWlmICghcHVzYWJsZSkKIAkJCQljb250aW51ZTsKIAkJCWZvciAoY3R4dCA9IGRkLT5maXJzdF91c2VyX2N0eHQ7IGN0eHQgPCBkZC0+Y2ZnY3R4dHM7CiAJCQkgICAgIGN0eHQrKykKQEAgLTEzOTcsNyArMTM5Nyw3IEBACiAJCQkJCWN1c2VkKys7CiAJCQkJZWxzZQogCQkJCQljZnJlZSsrOwotCQkJaWYgKGNmcmVlICYmIGN1c2VkIDwgaW51c2UpIHsKKwkJCWlmIChwdXNhYmxlICYmIGNmcmVlICYmIGN1c2VkIDwgaW51c2UpIHsKIAkJCQl1ZGQgPSBkZDsKIAkJCQlpbnVzZSA9IGN1c2VkOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNjEyMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNjEyMC5jCmluZGV4IGE1ZTI5ZGIuLjc3NGRlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE2MTIwLmMKQEAgLTIwNzQsNyArMjA3NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHFpYl91cGRhdGVfNjEyMF91c3JoZWFkKHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgdTY0IGhkLAotCQkJCSAgICB1MzIgdXBkZWdyLCB1MzIgZWdyaGQpCisJCQkJICAgIHUzMiB1cGRlZ3IsIHUzMiBlZ3JoZCwgdTMyIG5wa3RzKQogewogCXFpYl93cml0ZV91cmVnKHJjZC0+ZGQsIHVyX3JjdmhkcmhlYWQsIGhkLCByY2QtPmN0eHQpOwogCWlmICh1cGRlZ3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMKaW5kZXggNmZkOGQ3NC4uMTI3YTBkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYwpAQCAtMjI5Nyw3ICsyMjk3LDcgQEAKIAluY2hpcGN0eHRzID0gcWliX3JlYWRfa3JlZzMyKGRkLCBrcl9wb3J0Y250KTsKIAlkZC0+Y3NwZWMtPm51bWN0eHRzID0gbmNoaXBjdHh0czsKIAlpZiAocWliX25fa3Jjdl9xdWV1ZXMgPiAxKSB7Ci0JCWRkLT5xcG5fbWFzayA9IDB4M2Y7CisJCWRkLT5xcG5fbWFzayA9IDB4M2U7CiAJCWRkLT5maXJzdF91c2VyX2N0eHQgPSBxaWJfbl9rcmN2X3F1ZXVlcyAqIGRkLT5udW1fcHBvcnRzOwogCQlpZiAoZGQtPmZpcnN0X3VzZXJfY3R4dCA+IG5jaGlwY3R4dHMpCiAJCQlkZC0+Zmlyc3RfdXNlcl9jdHh0ID0gbmNoaXBjdHh0czsKQEAgLTI3MDMsNyArMjcwMyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHFpYl91cGRhdGVfNzIyMF91c3JoZWFkKHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgdTY0IGhkLAotCQkJCSAgICB1MzIgdXBkZWdyLCB1MzIgZWdyaGQpCisJCQkJICAgIHUzMiB1cGRlZ3IsIHUzMiBlZ3JoZCwgdTMyIG5wa3RzKQogewogCXFpYl93cml0ZV91cmVnKHJjZC0+ZGQsIHVyX3JjdmhkcmhlYWQsIGhkLCByY2QtPmN0eHQpOwogCWlmICh1cGRlZ3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKaW5kZXggNTg0ZDQ0My4uYWJkNDA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwpAQCAtNzEsNiArNzEsOSBAQAogCiBzdGF0aWMgdTMyIGFoYl9tb2Qoc3RydWN0IHFpYl9kZXZkYXRhICosIGludCwgaW50LCBpbnQsIHUzMiwgdTMyKTsKIHN0YXRpYyB2b2lkIGlic2Rfd3JfYWxsY2hhbnMoc3RydWN0IHFpYl9wcG9ydGRhdGEgKiwgaW50LCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgc2VyZGVzXzczMjJfbG9zX2VuYWJsZShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqLCBpbnQpOworc3RhdGljIGludCBzZXJkZXNfNzMyMl9pbml0X29sZChzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqKTsKK3N0YXRpYyBpbnQgc2VyZGVzXzczMjJfaW5pdF9uZXcoc3RydWN0IHFpYl9wcG9ydGRhdGEgKik7CiAKICNkZWZpbmUgQk1BU0sobXNiLCBsc2IpICgoKDEgPDwgKChtc2IpICsgMSAtIChsc2IpKSkgLSAxKSA8PCAobHNiKSkKIApAQCAtMTExLDYgKzExNCwyMSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHNpbmdsZXBvcnQsIHFpYl9zaW5nbGVwb3J0LCB1c2hvcnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhzaW5nbGVwb3J0LCAiVXNlIG9ubHkgSUIgcG9ydCAxOyBtb3JlIHBlci1wb3J0IGJ1ZmZlciBzcGFjZSIpOwogCisvKgorICogUmVjZWl2ZSBoZWFkZXIgcXVldWUgc2l6ZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIHFpYl9yY3ZoZHJjbnQ7Cittb2R1bGVfcGFyYW1fbmFtZWQocmN2aGRyY250LCBxaWJfcmN2aGRyY250LCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocmN2aGRyY250LCAicmVjZWl2ZSBoZWFkZXIgY291bnQiKTsKKworc3RhdGljIHVuc2lnbmVkIHFpYl9yY3ZoZHJzaXplOworbW9kdWxlX3BhcmFtX25hbWVkKHJjdmhkcnNpemUsIHFpYl9yY3ZoZHJzaXplLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocmN2aGRyc2l6ZSwgInJlY2VpdmUgaGVhZGVyIHNpemUgaW4gMzItYml0IHdvcmRzIik7CisKK3N0YXRpYyB1bnNpZ25lZCBxaWJfcmN2aGRyZW50c2l6ZTsKK21vZHVsZV9wYXJhbV9uYW1lZChyY3ZoZHJlbnRzaXplLCBxaWJfcmN2aGRyZW50c2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJjdmhkcmVudHNpemUsICJyZWNlaXZlIGhlYWRlciBlbnRyeSBzaXplIGluIDMyLWJpdCB3b3JkcyIpOworCiAjZGVmaW5lIE1BWF9BVFRFTl9MRU4gNjQgLyogcGxlbnR5IGZvciBhbnkgcmVhbCBzeXN0ZW0gKi8KIC8qIGZvciByZWFkIGJhY2ssIGRlZmF1bHQgaW5kZXggaXMgfjVtIGNvcHBlciBjYWJsZSAqLwogc3RhdGljIGNoYXIgdHhzZWxlY3RfbGlzdFtNQVhfQVRURU5fTEVOXSA9ICIxMCI7CkBAIC0zMTQsNyArMzMyLDcgQEAKICNkZWZpbmUga3JwX3NlcmRlc2N0cmwgS1JFR19JQlBPUlRfSURYKElCU2VyZGVzQ3RybCkKIAogLyoKLSAqIFBlci1jb250ZXh0IGtlcm5lbCByZWdpc3RlcnMuICBBY2VzcyBvbmx5IHdpdGggcWliX3JlYWRfa3JlZ19jdHh0KCkKKyAqIFBlci1jb250ZXh0IGtlcm5lbCByZWdpc3RlcnMuICBBY2Nlc3Mgb25seSB3aXRoIHFpYl9yZWFkX2tyZWdfY3R4dCgpCiAgKiBvciBxaWJfd3JpdGVfa3JlZ19jdHh0KCkKICAqLwogI2RlZmluZSBrcmNfcmN2aGRyYWRkciBLUkVHX0lEWChSY3ZIZHJBZGRyMCkKQEAgLTU0NCw2ICs1NjIsNyBAQAogCiAjZGVmaW5lIFRYRERTX1RBQkxFX1NaIDE2IC8qIG51bWJlciBvZiBlbnRyaWVzIHBlciBzcGVlZCBpbiBvbmNoaXAgdGFibGUgKi8KICNkZWZpbmUgVFhERFNfRVhUUkFfU1ogMTMgLyogbnVtYmVyIG9mIGV4dHJhIHR4IHNldHRpbmdzIGVudHJpZXMgKi8KKyNkZWZpbmUgVFhERFNfTUZHX1NaIDIgICAgLyogbnVtYmVyIG9mIG1mZyB0eCBzZXR0aW5ncyBlbnRyaWVzICovCiAjZGVmaW5lIFNFUkRFU19DSEFOUyA0IC8qIHllcywgaXQncyBvYnZpb3VzLCBidXQgb25lIGxlc3MgbWFnaWMgbnVtYmVyICovCiAKICNkZWZpbmUgSDFfRk9SQ0VfVkFMIDgKQEAgLTYwNCw2ICs2MjMsNyBAQAogCXU4IGlibWFsZnVzZXNuYXA7CiAJc3RydWN0IHFpYl9xc2ZwX2RhdGEgcXNmcF9kYXRhOwogCWNoYXIgZXBtc2didWZbMTkyXTsgLyogZm9yIHBvcnQgZXJyb3IgaW50ZXJydXB0IG1zZyBidWZmZXIgKi8KKwl1OCBib3VuY2VkOwogfTsKIAogc3RhdGljIHN0cnVjdCB7CkBAIC0xNjc3LDYgKzE2OTcsOCBAQAogCSAgICAoaWJjc3QgJiBTWU1fTUFTSyhJQkNTdGF0dXNBXzAsIExpbmtTcGVlZFFEUikpKSB7CiAJCWZvcmNlX2gxKHBwZCk7CiAJCXBwZC0+Y3BzcGVjLT5xZHJfcmVmb3JjZSA9IDE7CisJCWlmICghcHBkLT5kZC0+Y3NwZWMtPnIxKQorCQkJc2VyZGVzXzczMjJfbG9zX2VuYWJsZShwcGQsIDApOwogCX0gZWxzZSBpZiAocHBkLT5jcHNwZWMtPnFkcl9yZWZvcmNlICYmCiAJCShpYmNzdCAmIFNZTV9NQVNLKElCQ1N0YXR1c0FfMCwgTGlua1NwZWVkUURSKSkgJiYKIAkJIChpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0NGR0VOSCB8fApAQCAtMTY5MiwxOCArMTcxNCwzNyBAQAogCSAgICAgIGliY2x0IDw9IElCXzczMjJfTFRfU1RBVEVfU0xFRVBRVUlFVCkpKQogCQlhZGpfdHhfc2VyZGVzKHBwZCk7CiAKLQlpZiAoIXBwZC0+Y3BzcGVjLT5xZHJfZGZlX29uICYmIGliY2x0ICE9IElCXzczMjJfTFRfU1RBVEVfTElOS1VQICYmCi0JICAgIGliY2x0IDw9IElCXzczMjJfTFRfU1RBVEVfU0xFRVBRVUlFVCkgewotCQlwcGQtPmNwc3BlYy0+cWRyX2RmZV9vbiA9IDE7Ci0JCXBwZC0+Y3BzcGVjLT5xZHJfZGZlX3RpbWUgPSAwOwotCQkvKiBPbiBsaW5rIGRvd24sIHJlZW5hYmxlIFFEUiBhZGFwdGF0aW9uICovCi0JCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc3RhdGljX2FkYXB0X2RpcygyKSwKLQkJCXBwZC0+ZGQtPmNzcGVjLT5yMSA/Ci0JCQkJICAgIFFEUl9TVEFUSUNfQURBUFRfRE9XTl9SMSA6Ci0JCQkJICAgIFFEUl9TVEFUSUNfQURBUFRfRE9XTik7CisJaWYgKGliY2x0ICE9IElCXzczMjJfTFRfU1RBVEVfTElOS1VQKSB7CisJCXU4IGx0c3RhdGUgPSBxaWJfNzMyMl9waHlzX3BvcnRzdGF0ZShpYmNzdCk7CisJCXU4IHBpYmNsdCA9ICh1OClTWU1fRklFTEQocHBkLT5sYXN0aWJjc3RhdCwgSUJDU3RhdHVzQV8wLAorCQkJCQkgIExpbmtUcmFpbmluZ1N0YXRlKTsKKwkJaWYgKCFwcGQtPmRkLT5jc3BlYy0+cjEgJiYKKwkJICAgIHBpYmNsdCA9PSBJQl83MzIyX0xUX1NUQVRFX0xJTktVUCAmJgorCQkgICAgbHRzdGF0ZSAhPSBJQl9QSFlTUE9SVFNUQVRFX0xJTktfRVJSX1JFQ09WRVIgJiYKKwkJICAgIGx0c3RhdGUgIT0gSUJfUEhZU1BPUlRTVEFURV9SRUNPVkVSWV9SRVRSQUlOICYmCisJCSAgICBsdHN0YXRlICE9IElCX1BIWVNQT1JUU1RBVEVfUkVDT1ZFUllfV0FJVFJNVCAmJgorCQkgICAgbHRzdGF0ZSAhPSBJQl9QSFlTUE9SVFNUQVRFX1JFQ09WRVJZX0lETEUpCisJCQkvKiBJZiB0aGUgbGluayB3ZW50IGRvd24gKGJ1dCBubyBpbnRvIHJlY292ZXJ5LAorCQkJICogdHVybiBMT1MgYmFjayBvbiAqLworCQkJc2VyZGVzXzczMjJfbG9zX2VuYWJsZShwcGQsIDEpOworCQlpZiAoIXBwZC0+Y3BzcGVjLT5xZHJfZGZlX29uICYmCisJCSAgICBpYmNsdCA8PSBJQl83MzIyX0xUX1NUQVRFX1NMRUVQUVVJRVQpIHsKKwkJCXBwZC0+Y3BzcGVjLT5xZHJfZGZlX29uID0gMTsKKwkJCXBwZC0+Y3BzcGVjLT5xZHJfZGZlX3RpbWUgPSAwOworCQkJLyogT24gbGluayBkb3duLCByZWVuYWJsZSBRRFIgYWRhcHRhdGlvbiAqLworCQkJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zdGF0aWNfYWRhcHRfZGlzKDIpLAorCQkJCQkgICAgcHBkLT5kZC0+Y3NwZWMtPnIxID8KKwkJCQkJICAgIFFEUl9TVEFUSUNfQURBUFRfRE9XTl9SMSA6CisJCQkJCSAgICBRRFJfU1RBVElDX0FEQVBUX0RPV04pOworCQkJcHJpbnRrKEtFUk5fSU5GTyBRSUJfRFJWX05BTUUKKwkJCQkiIElCJXU6JXUgcmUtZW5hYmxlZCBRRFIgYWRhcHRhdGlvbiAiCisJCQkJImliY2x0ICV4XG4iLCBwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQsIGliY2x0KTsKKwkJfQogCX0KIH0KIAorc3RhdGljIGludCBxaWJfNzMyMl9zZXRfaWJfY2ZnKHN0cnVjdCBxaWJfcHBvcnRkYXRhICosIGludCwgdTMyKTsKKwogLyoKICAqIFRoaXMgaXMgcGVyLXBwb3J0IGVycm9yIGhhbmRsaW5nLgogICogd2lsbCBsaWtlbHkgZ2V0IGl0J3Mgb3duIE1TSXggaW50ZXJydXB0IChvbmUgZm9yIGVhY2ggcG9ydCwKQEAgLTE4NDAsNyArMTg4MSwyMyBAQAogCQkgICAgSUJfUEhZU1BPUlRTVEFURV9ESVNBQkxFRCkKIAkJCXFpYl9zZXRfaWJfNzMyMl9sc3RhdGUocHBkLCAwLAogCQkJICAgICAgIFFMT0dJQ19JQl9JQkNDX0xJTktJTklUQ01EX0RJU0FCTEUpOwotCQllbHNlCisJCWVsc2UgeworCQkJdTMyIGxzdGF0ZTsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluayBzdGF0ZSBiZWZvcmUKKwkJCSAqIGxmbGFncyBhcmUgc2V0IGluIGhhbmRsZV9lX2lic3RhdHVzY2hhbmdlZC4KKwkJCSAqLworCQkJbHN0YXRlID0gcWliXzczMjJfaWJsaW5rX3N0YXRlKGliY3MpOworCisJCQlpZiAoSVNfUU1IKGRkKSAmJiAhcHBkLT5jcHNwZWMtPmJvdW5jZWQgJiYKKwkJCSAgICBsdHN0YXRlID09IElCX1BIWVNQT1JUU1RBVEVfTElOS1VQICYmCisJCQkgICAgKGxzdGF0ZSA+PSBJQl9QT1JUX0lOSVQgJiYKKwkJCQlsc3RhdGUgPD0gSUJfUE9SVF9BQ1RJVkUpKSB7CisJCQkJcHBkLT5jcHNwZWMtPmJvdW5jZWQgPSAxOworCQkJCXFpYl83MzIyX3NldF9pYl9jZmcocHBkLCBRSUJfSUJfQ0ZHX0xTVEFURSwKKwkJCQkJSUJfTElOS0NNRF9ET1dOIHwgSUJfTElOS0lOSVRDTURfUE9MTCk7CisJCQl9CisKIAkJCS8qCiAJCQkgKiBTaW5jZSBnb2luZyBpbnRvIGEgcmVjb3Zlcnkgc3RhdGUgY2F1c2VzIHRoZSBsaW5rCiAJCQkgKiBzdGF0ZSB0byBnbyBkb3duIGFuZCBzaW5jZSByZWNvdmVyeSBpcyB0cmFuc2l0b3J5LApAQCAtMTg1NCw2ICsxOTExLDcgQEAKIAkJCSAgICBsdHN0YXRlICE9IElCX1BIWVNQT1JUU1RBVEVfUkVDT1ZFUllfV0FJVFJNVCAmJgogCQkJICAgIGx0c3RhdGUgIT0gSUJfUEhZU1BPUlRTVEFURV9SRUNPVkVSWV9JRExFKQogCQkJCXFpYl9oYW5kbGVfZV9pYnN0YXR1c2NoYW5nZWQocHBkLCBpYmNzKTsKKwkJfQogCX0KIAlpZiAoKm1zZyAmJiBpc2VycikKIAkJcWliX2Rldl9wb3J0ZXJyKGRkLCBwcGQtPnBvcnQsICIlcyBlcnJvclxuIiwgbXNnKTsKQEAgLTI3ODUsNyArMjg0Myw2IEBACiAJCQkJY3R4dHJiaXRzICY9IH5ybWFzazsKIAkJCQlpZiAoZGQtPnJjZFtpXSkgewogCQkJCQlxaWJfa3JlY2VpdmUoZGQtPnJjZFtpXSwgTlVMTCwgJm5wa3RzKTsKLQkJCQkJYWRqdXN0X3Jjdl90aW1lb3V0KGRkLT5yY2RbaV0sIG5wa3RzKTsKIAkJCQl9CiAJCQl9CiAJCQlybWFzayA8PD0gMTsKQEAgLTI4MzUsNyArMjg5Miw2IEBACiAJCSAgICAgICAoMVVMTCA8PCBRSUJfSV9SQ1ZVUkdfTFNCKSkgPDwgcmNkLT5jdHh0KTsKIAogCXFpYl9rcmVjZWl2ZShyY2QsIE5VTEwsICZucGt0cyk7Ci0JYWRqdXN0X3Jjdl90aW1lb3V0KHJjZCwgbnBrdHMpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMzE1Nyw2ICszMjEzLDEwIEBACiAJY2FzZSBCT0FSRF9RTUU3MzQyOgogCQluID0gIkluZmluaVBhdGhfUU1FNzM0MiI7CiAJCWJyZWFrOworCWNhc2UgODoKKwkJbiA9ICJJbmZpbmlQYXRoX1FNRTczNjIiOworCQlkZC0+ZmxhZ3MgfD0gUUlCX0hBU19RU0ZQOworCQlicmVhazsKIAljYXNlIDE1OgogCQluID0gIkluZmluaVBhdGhfUUxFNzM0Ml9URVNUIjsKIAkJZGQtPmZsYWdzIHw9IFFJQl9IQVNfUVNGUDsKQEAgLTM0NzUsMTEgKzM1MzUsNiBAQAogCW5jaGlwY3R4dHMgPSBxaWJfcmVhZF9rcmVnMzIoZGQsIGtyX2NvbnRleHRjbnQpOwogCWRkLT5jc3BlYy0+bnVtY3R4dHMgPSBuY2hpcGN0eHRzOwogCWlmIChxaWJfbl9rcmN2X3F1ZXVlcyA+IDEgJiYgZGQtPm51bV9wcG9ydHMpIHsKLQkJLyoKLQkJICogU2V0IHRoZSBtYXNrIGZvciB3aGljaCBiaXRzIGZyb20gdGhlIFFQTiBhcmUgdXNlZAotCQkgKiB0byBzZWxlY3QgYSBjb250ZXh0IG51bWJlci4KLQkJICovCi0JCWRkLT5xcG5fbWFzayA9IDB4M2Y7CiAJCWRkLT5maXJzdF91c2VyX2N0eHQgPSBOVU1fSUJfUE9SVFMgKwogCQkJKHFpYl9uX2tyY3ZfcXVldWVzIC0gMSkgKiBkZC0+bnVtX3Bwb3J0czsKIAkJaWYgKGRkLT5maXJzdF91c2VyX2N0eHQgPiBuY2hpcGN0eHRzKQpAQCAtMzUzMCw4ICszNTg1LDExIEBACiAKIAkvKiBrcl9yY3ZlZ3JjbnQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRleHRzIGVuYWJsZWQgKi8KIAlkZC0+Y3NwZWMtPnJjdmVncmNudCA9IHFpYl9yZWFkX2tyZWczMihkZCwga3JfcmN2ZWdyY250KTsKLQlkZC0+cmN2aGRyY250ID0gbWF4KGRkLT5jc3BlYy0+cmN2ZWdyY250LAotCQkJCWRkLT5udW1fcHBvcnRzID4gMSA/IDEwMjRVIDogMjA0OFUpOworCWlmIChxaWJfcmN2aGRyY250KQorCQlkZC0+cmN2aGRyY250ID0gbWF4KGRkLT5jc3BlYy0+cmN2ZWdyY250LCBxaWJfcmN2aGRyY250KTsKKwllbHNlCisJCWRkLT5yY3ZoZHJjbnQgPSBtYXgoZGQtPmNzcGVjLT5yY3ZlZ3JjbnQsCisJCQkJICAgIGRkLT5udW1fcHBvcnRzID4gMSA/IDEwMjRVIDogMjA0OFUpOwogfQogCiBzdGF0aWMgaW50IHFpYl83MzIyX2dldF9pYl9jZmcoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCwgaW50IHdoaWNoKQpAQCAtNDAwMiw4ICs0MDYwLDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkIHFpYl91cGRhdGVfNzMyMl91c3JoZWFkKHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgdTY0IGhkLAotCQkJCSAgICB1MzIgdXBkZWdyLCB1MzIgZWdyaGQpCisJCQkJICAgIHUzMiB1cGRlZ3IsIHUzMiBlZ3JoZCwgdTMyIG5wa3RzKQogeworCS8qCisJICogTmVlZCB0byB3cml0ZSB0aW1lb3V0IHJlZ2lzdGVyIGJlZm9yZSB1cGRhdGluZyByY3ZoZHJoZWFkIHRvIGVuc3VyZQorCSAqIHRoYXQgdGhlIHRpbWVyIGlzIGVuYWJsZWQgb24gcmVjZXB0aW9uIG9mIGEgcGFja2V0LgorCSAqLworCWlmIChoZCA+PiBJQkE3MzIyX0hEUkhFQURfUEtUSU5UX1NISUZUKQorCQlhZGp1c3RfcmN2X3RpbWVvdXQocmNkLCBucGt0cyk7CiAJcWliX3dyaXRlX3VyZWcocmNkLT5kZCwgdXJfcmN2aGRyaGVhZCwgaGQsIHJjZC0+Y3R4dCk7CiAJcWliX3dyaXRlX3VyZWcocmNkLT5kZCwgdXJfcmN2aGRyaGVhZCwgaGQsIHJjZC0+Y3R4dCk7CiAJaWYgKHVwZGVncikKQEAgLTU1MjIsNyArNTU4Niw3IEBACiAJCXU2NCBub3cgPSBnZXRfamlmZmllc182NCgpOwogCQlpZiAodGltZV9hZnRlcjY0KG5vdywgcHdydXApKQogCQkJYnJlYWs7Ci0JCW1zbGVlcCgxKTsKKwkJbXNsZWVwKDIwKTsKIAl9CiAJcmV0ID0gcWliX3JlZnJlc2hfcXNmcF9jYWNoZShwcGQsICZxZC0+Y2FjaGUpOwogCS8qCkBAIC01NTc5LDYgKzU2NDMsNyBAQAogCXUzMiBwaWR4LCB1bml0LCBwb3J0LCBkZWZsdCwgaDE7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IGFueSA9IDAsIHNldGgxOworCWludCB0eGRkc19zaXplOwogCiAJc3RyID0gdHhzZWxlY3RfbGlzdDsKIApAQCAtNTU4Nyw2ICs1NjUyLDEwIEBACiAJZm9yIChwaWR4ID0gMDsgcGlkeCA8IGRkLT5udW1fcHBvcnRzOyArK3BpZHgpCiAJCWRkLT5wcG9ydFtwaWR4XS5jcHNwZWMtPm5vX2VlcCA9IGRlZmx0OwogCisJdHhkZHNfc2l6ZSA9IFRYRERTX1RBQkxFX1NaICsgVFhERFNfRVhUUkFfU1o7CisJaWYgKElTX1FNRShkZCkgfHwgSVNfUU1IKGRkKSkKKwkJdHhkZHNfc2l6ZSArPSBUWEREU19NRkdfU1o7CisKIAl3aGlsZSAoKm54dCAmJiBueHRbMV0pIHsKIAkJc3RyID0gKytueHQ7CiAJCXVuaXQgPSBzaW1wbGVfc3RydG91bChzdHIsICZueHQsIDApOwpAQCAtNTYwOSw3ICs1Njc4LDcgQEAKIAkJCQk7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAodmFsID49IFRYRERTX1RBQkxFX1NaICsgVFhERFNfRVhUUkFfU1opCisJCWlmICh2YWwgPj0gdHhkZHNfc2l6ZSkKIAkJCWNvbnRpbnVlOwogCQlzZXRoMSA9IDA7CiAJCWgxID0gMDsgLyogZ2NjIHRoaW5rcyBpdCBtaWdodCBiZSB1c2VkIHVuaW5pdHRlZCAqLwpAQCAtNTY2MSwxMCArNTczMCwxMSBAQAogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmbiwgMCk7Ci0JaWYgKG4gPT0gc3RyIHx8IHZhbCA+PSAoVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWikpIHsKKwlpZiAobiA9PSBzdHIgfHwgdmFsID49IChUWEREU19UQUJMRV9TWiArIFRYRERTX0VYVFJBX1NaICsKKwkJCQlUWEREU19NRkdfU1opKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FCiAJCSAgICAgICAidHhzZWxlY3RfdmFsdWVzIG11c3Qgc3RhcnQgd2l0aCBhIG51bWJlciA8ICVkXG4iLAotCQkJVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWik7CisJCQlUWEREU19UQUJMRV9TWiArIFRYRERTX0VYVFJBX1NaICsgVFhERFNfTUZHX1NaKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN0cmNweSh0eHNlbGVjdF9saXN0LCBzdHIpOwpAQCAtNTgxMCw3ICs1ODgwLDggQEAKIAkJdW5zaWduZWQgbiwgcmVnbm87CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJaWYgKCFkZC0+cXBuX21hc2sgfHwgIWRkLT5wcG9ydFtwaWR4XS5saW5rX3NwZWVkX3N1cHBvcnRlZCkKKwkJaWYgKGRkLT5uX2tyY3ZfcXVldWVzIDwgMiB8fAorCQkJIWRkLT5wcG9ydFtwaWR4XS5saW5rX3NwZWVkX3N1cHBvcnRlZCkKIAkJCWNvbnRpbnVlOwogCiAJCXBwZCA9ICZkZC0+cHBvcnRbcGlkeF07CkBAIC02MDk3LDggKzYxNjgsMTAgQEAKIAkJcHBkKys7CiAJfQogCi0JZGQtPnJjdmhkcmVudHNpemUgPSBRSUJfUkNWSERSX0VOVFNJWkU7Ci0JZGQtPnJjdmhkcnNpemUgPSBRSUJfREZMVF9SQ1ZIRFJTSVpFOworCWRkLT5yY3ZoZHJlbnRzaXplID0gcWliX3JjdmhkcmVudHNpemUgPworCQlxaWJfcmN2aGRyZW50c2l6ZSA6IFFJQl9SQ1ZIRFJfRU5UU0laRTsKKwlkZC0+cmN2aGRyc2l6ZSA9IHFpYl9yY3ZoZHJzaXplID8KKwkJcWliX3JjdmhkcnNpemUgOiBRSUJfREZMVF9SQ1ZIRFJTSVpFOwogCWRkLT5yaGZfb2Zmc2V0ID0gZGQtPnJjdmhkcmVudHNpemUgLSBzaXplb2YodTY0KSAvIHNpemVvZih1MzIpOwogCiAJLyogd2UgYWx3YXlzIGFsbG9jYXRlIGF0IGxlYXN0IDIwNDggYnl0ZXMgZm9yIGVhZ2VyIGJ1ZmZlcnMgKi8KQEAgLTY0OTUsNyArNjU2OCw3IEBACiAJCS8qIG1ha2Ugc3VyZSB3ZSBzZWUgYW4gdXBkYXRlZCBjb3B5IG5leHQgdGltZSBhcm91bmQgKi8KIAkJc2VuZGN0cmxfNzMyMl9tb2QoZGQtPnBwb3J0LCBRSUJfU0VORENUUkxfQVZBSUxfQkxJUCk7CiAJCXNsZWVwcysrOwotCQltc2xlZXAoMSk7CisJCW1zbGVlcCgyMCk7CiAJfQogCiAJc3dpdGNoICh3aGljaCkgewpAQCAtNjk5Myw2ICs3MDY2LDEyIEBACiAJeyAgMCwgMSwgIDAsIDEyIH0sCS8qIFFNSDczNDIgYmFja3BsYW5lIHNldHRpbmdzICovCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4ZGRzX2VudCB0eGRkc19leHRyYV9tZmdbVFhERFNfTUZHX1NaXSA9IHsKKwkvKiBhbXAsIHByZSwgbWFpbiwgcG9zdCAqLworCXsgMCwgMCwgMCwgMCB9LCAgICAgICAgIC8qIFFNRTczNDIgbWZnIHNldHRpbmdzICovCisJeyAwLCAwLCAwLCA2IH0sICAgICAgICAgLyogUU1FNzM0MiBQMiBtZmcgc2V0dGluZ3MgKi8KK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHhkZHNfZW50ICpnZXRfYXR0ZW5fdGFibGUoY29uc3Qgc3RydWN0IHR4ZGRzX2VudCAqdHhkZHMsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBhdHRlbikKIHsKQEAgLTcwNjYsNiArNzE0NSwxNiBAQAogCQkqc2RyX2RkcyA9ICZ0eGRkc19leHRyYV9zZHJbaWR4XTsKIAkJKmRkcl9kZHMgPSAmdHhkZHNfZXh0cmFfZGRyW2lkeF07CiAJCSpxZHJfZGRzID0gJnR4ZGRzX2V4dHJhX3FkcltpZHhdOworCX0gZWxzZSBpZiAoKElTX1FNRShwcGQtPmRkKSB8fCBJU19RTUgocHBkLT5kZCkpICYmCisJCSAgIHBwZC0+Y3BzcGVjLT5ub19lZXAgPCAoVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWiArCisJCQkJCSAgVFhERFNfTUZHX1NaKSkgeworCQlpZHggPSBwcGQtPmNwc3BlYy0+bm9fZWVwIC0gKFRYRERTX1RBQkxFX1NaICsgVFhERFNfRVhUUkFfU1opOworCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRQorCQkJIiBJQiV1OiV1IHVzZSBpZHggJXUgaW50byB0eGRkc19tZmdcbiIsCisJCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQsIGlkeCk7CisJCSpzZHJfZGRzID0gJnR4ZGRzX2V4dHJhX21mZ1tpZHhdOworCQkqZGRyX2RkcyA9ICZ0eGRkc19leHRyYV9tZmdbaWR4XTsKKwkJKnFkcl9kZHMgPSAmdHhkZHNfZXh0cmFfbWZnW2lkeF07CiAJfSBlbHNlIHsKIAkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBpdCdzIHJhbmdlIGNoZWNrZWQgKi8KIAkJKnNkcl9kZHMgPSB0eGRkc19zZHIgKyBxaWJfbG9uZ19hdHRlbjsKQEAgLTcyMTAsOSArNzI5OSwzMCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc2VyZGVzXzczMjJfbG9zX2VuYWJsZShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLCBpbnQgZW5hYmxlKQoreworCXU2NCBkYXRhID0gcWliX3JlYWRfa3JlZ19wb3J0KHBwZCwga3JwX3NlcmRlc2N0cmwpOworCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FICIgSUIldToldSBUdXJuaW5nIExPUyAlc1xuIiwKKwkJcHBkLT5kZC0+dW5pdCwgcHBkLT5wb3J0LCAoZW5hYmxlID8gIm9uIiA6ICJvZmYiKSk7CisJaWYgKGVuYWJsZSkKKwkJZGF0YSB8PSBTWU1fTUFTSyhJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisJZWxzZQorCQlkYXRhICY9IH5TWU1fTUFTSyhJQlNlcmRlc0N0cmxfMCwgUlhMT1NFTik7CisJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zZXJkZXNjdHJsLCBkYXRhKTsKK30KKwogc3RhdGljIGludCBzZXJkZXNfNzMyMl9pbml0KHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQpCiB7Ci0JdTY0IGRhdGE7CisJaW50IHJldCA9IDA7CisJaWYgKHBwZC0+ZGQtPmNzcGVjLT5yMSkKKwkJcmV0ID0gc2VyZGVzXzczMjJfaW5pdF9vbGQocHBkKTsKKwllbHNlCisJCXJldCA9IHNlcmRlc183MzIyX2luaXRfbmV3KHBwZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXJkZXNfNzMyMl9pbml0X29sZChzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkKQorewogCXUzMiBsZV92YWw7CiAKIAkvKgpAQCAtNzI3MCwxMSArNzM4MCw3IEBACiAJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIwLCAoMiA8PCAxMCksIEJNQVNLKDEyLCAxMCkpOyAvKiBERFIgKi8KIAlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMjAsICg0IDw8IDEzKSwgQk1BU0soMTUsIDEzKSk7IC8qIFNEUiAqLwogCi0JZGF0YSA9IHFpYl9yZWFkX2tyZWdfcG9ydChwcGQsIGtycF9zZXJkZXNjdHJsKTsKLQkvKiBUdXJuIG9mZiBJQiBsYXRlbmN5IG1vZGUgKi8KLQlkYXRhICY9IH5TWU1fTUFTSyhJQlNlcmRlc0N0cmxfMCwgSUJfTEFUX01PREUpOwotCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc2VyZGVzY3RybCwgZGF0YSB8Ci0JCVNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBSWExPU0VOKSk7CisJc2VyZGVzXzczMjJfbG9zX2VuYWJsZShwcGQsIDEpOwogCiAJLyogcnhiaXN0ZW5hOyBzZXQgMCB0byBhdm9pZCBlZmZlY3RzIG9mIGl0IHN3aXRjaCBsYXRlciAqLwogCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA5LCAwIDw8IDE1LCAxIDw8IDE1KTsKQEAgLTczMTQsNiArNzQyMCwyMDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzZXJkZXNfNzMyMl9pbml0X25ldyhzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkKQoreworCXU2NCB0c3RhcnQ7CisJdTMyIGxlX3ZhbCwgcnhjYWxkb25lOworCWludCBjaGFuLCBjaGFuX2RvbmUgPSAoMSA8PCBTRVJERVNfQ0hBTlMpIC0gMTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVHggRERTIHRhYmxlcy4gIEFsc28gZG9uZSBldmVyeSBRU0ZQIGV2ZW50LAorCSAqIGZvciBhZGFwdGVycyB3aXRoIFFTRlAKKwkgKi8KKwlpbml0X3R4ZGRzX3RhYmxlKHBwZCwgMCk7CisKKwkvKiBDbGVhciBjbW9kZS1vdmVycmlkZSwgbWF5IGJlIHNldCBmcm9tIG9sZGVyIGRyaXZlciAqLworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCAxMCwgMCA8PCAxNCwgMSA8PCAxNCk7CisKKwkvKiBlbnN1cmUgbm8gdHggb3ZlcnJpZGVzIGZyb20gZWFybGllciBkcml2ZXIgbG9hZHMgKi8KKwlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3R4X2RlZW1waF9vdmVycmlkZSwKKwkJU1lNX01BU0soSUJTRF9UWF9ERUVNUEhBU0lTX09WRVJSSURFXzAsCisJCXJlc2V0X3R4X2RlZW1waGFzaXNfb3ZlcnJpZGUpKTsKKworCS8qIFNUQVJUIE9GIExTSSBTVUdHRVNURUQgU0VSREVTIEJSSU5HVVAgKi8KKwkvKiBSZXNldCAtIENhbGlicmF0aW9uIFNldHVwICovCisJLyogICAgICAgU3RvcCBERkUgYWRhcHRhaW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEsIDAsIEJNQVNLKDksIDEpKTsKKwkvKiAgICAgICBEaXNhYmxlIExFMSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgMCwgQk1BU0soNSwgNSkpOworCS8qICAgICAgIERpc2FibGUgYXV0b2FkYXB0IGZvciBMRTEgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMSwgMCwgQk1BU0soMTUsIDE1KSk7CisJLyogICAgICAgRGlzYWJsZSBMRTIgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTMsIDAsIEJNQVNLKDYsIDYpKTsKKwkvKiAgICAgICBEaXNhYmxlIFZHQSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA1LCAwLCBCTUFTSygwLCAwKSk7CisJLyogICAgICAgRGlzYWJsZSBBRkUgT2Zmc2V0IENhbmNlbCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgMCwgQk1BU0soMTIsIDEyKSk7CisJLyogICAgICAgRGlzYWJsZSBUaW1pbmcgTG9vcCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAwLCBCTUFTSygzLCAzKSk7CisJLyogICAgICAgRGlzYWJsZSBGcmVxdWVuY3kgTG9vcCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAwLCBCTUFTSyg0LCA0KSk7CisJLyogICAgICAgRGlzYWJsZSBCYXNlbGluZSBXYW5kZXIgQ29ycmVjdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgMCwgQk1BU0soMTMsIDEzKSk7CisJLyogICAgICAgRGlzYWJsZSBSWCBDYWxpYnJhdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA0LCAwLCBCTUFTSygxMCwgMTApKTsKKwkvKiAgICAgICBEaXNhYmxlIFJYIE9mZnNldCBDYWxpYnJhdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgMCwgQk1BU0soNCwgNCkpOworCS8qICAgICAgIFNlbGVjdCBCQiBDRFIgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMiwgKDEgPDwgMTUpLCBCTUFTSygxNSwgMTUpKTsKKwkvKiAgICAgICBDRFIgU3RlcCBTaXplICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDUsIDAsIEJNQVNLKDksIDgpKTsKKwkvKiAgICAgICBFbmFibGUgcGhhc2UgQ2FsaWJyYXRpb24gKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsICgxIDw8IDUpLCBCTUFTSyg1LCA1KSk7CisJLyogICAgICAgREZFIEJhbmR3aWR0aCBbMjoxNC0xMl0gKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMiwgKDQgPDwgMTIpLCBCTUFTSygxNCwgMTIpKTsKKwkvKiAgICAgICBERkUgQ29uZmlnICg0IHRhcHMgb25seSkgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTYsIDAsIEJNQVNLKDEsIDApKTsKKwkvKiAgICAgICBHYWluIExvb3AgQmFuZHdpZHRoICovCisJaWYgKCFwcGQtPmRkLT5jc3BlYy0+cjEpIHsKKwkJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAxIDw8IDEyLCBCTUFTSygxMiwgMTIpKTsKKwkJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAyIDw8IDgsIEJNQVNLKDExLCA4KSk7CisJfSBlbHNlIHsKKwkJaWJzZF93cl9hbGxjaGFucyhwcGQsIDE5LCAoMyA8PCAxMSksIEJNQVNLKDEzLCAxMSkpOworCX0KKwkvKiAgICAgICBCYXNlbGluZSBXYW5kZXIgQ29ycmVjdGlvbiBHYWluIFsxMzo0LTBdIChsZWF2ZSBhcyBkZWZhdWx0KSAqLworCS8qICAgICAgIEJhc2VsaW5lIFdhbmRlciBDb3JyZWN0aW9uIEdhaW4gWzM6Ny01XSAobGVhdmUgYXMgZGVmYXVsdCkgKi8KKwkvKiAgICAgICBEYXRhIFJhdGUgU2VsZWN0IFs1OjctNl0gKGxlYXZlIGFzIGRlZmF1bHQpICovCisJLyogICAgICAgUlggUGFycmFsZWwgV29yZCBXaWR0aCBbMzoxMC04XSAobGVhdmUgYXMgZGVmYXVsdCkgKi8KKworCS8qIFJYIFJFU1QgKi8KKwkvKiAgICAgICBTaW5nbGUtIG9yIE11bHRpLWNoYW5uZWwgcmVzZXQgKi8KKwkvKiAgICAgICBSWCBBbmFsb2cgcmVzZXQgKi8KKwkvKiAgICAgICBSWCBEaWdpdGFsIHJlc2V0ICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDAsIDAsIEJNQVNLKDE1LCAxMykpOworCW1zbGVlcCgyMCk7CisJLyogICAgICAgUlggQW5hbG9nIHJlc2V0ICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDAsICgxIDw8IDE0KSwgQk1BU0soMTQsIDE0KSk7CisJbXNsZWVwKDIwKTsKKwkvKiAgICAgICBSWCBEaWdpdGFsIHJlc2V0ICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDAsICgxIDw8IDEzKSwgQk1BU0soMTMsIDEzKSk7CisJbXNsZWVwKDIwKTsKKworCS8qIHNldHVwIExvUyBwYXJhbXM7IHRoZXNlIGFyZSBzdWJzeXN0ZW0sIHNvIGNoYW4gPT0gNSAqLworCS8qIExvUyBmaWx0ZXIgdGhyZXNob2xkX2NvdW50IG9uLCBjaCAwLTMsIHNldCB0byA4ICovCisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDUsIDggPDwgMTEsIEJNQVNLKDE0LCAxMSkpOworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA3LCA4IDw8IDQsIEJNQVNLKDcsIDQpKTsKKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgOCwgOCA8PCAxMSwgQk1BU0soMTQsIDExKSk7CisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDEwLCA4IDw8IDQsIEJNQVNLKDcsIDQpKTsKKworCS8qIExvUyBmaWx0ZXIgdGhyZXNob2xkX2NvdW50IG9mZiwgY2ggMC0zLCBzZXQgdG8gNCAqLworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA2LCA0IDw8IDAsIEJNQVNLKDMsIDApKTsKKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgNywgNCA8PCA4LCBCTUFTSygxMSwgOCkpOworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA5LCA0IDw8IDAsIEJNQVNLKDMsIDApKTsKKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgMTAsIDQgPDwgOCwgQk1BU0soMTEsIDgpKTsKKworCS8qIExvUyBmaWx0ZXIgc2VsZWN0IGVuYWJsZWQgKi8KKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgOSwgMSA8PCAxNSwgMSA8PCAxNSk7CisKKwkvKiBMb1MgdGFyZ2V0IGRhdGE6ICBTRFI9NCwgRERSPTIsIFFEUj0xICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDE0LCAoMSA8PCAzKSwgQk1BU0soNSwgMykpOyAvKiBRRFIgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMjAsICgyIDw8IDEwKSwgQk1BU0soMTIsIDEwKSk7IC8qIEREUiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyMCwgKDQgPDwgMTMpLCBCTUFTSygxNSwgMTMpKTsgLyogU0RSICovCisKKwkvKiBUdXJuIG9uIExPUyBvbiBpbml0aWFsIFNFUkRFUyBpbml0ICovCisJc2VyZGVzXzczMjJfbG9zX2VuYWJsZShwcGQsIDEpOworCS8qIEZMb29wIExPUyBnYXRlOiBQUE0gZmlsdGVyICBlbmFibGVkICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDM4LCAwIDw8IDEwLCAxIDw8IDEwKTsKKworCS8qIFJYIExBVENIIENBTElCUkFUSU9OICovCisJLyogICAgICAgRW5hYmxlIEV5ZWZpbmRlciBQaGFzZSBDYWxpYnJhdGlvbiBsYXRjaCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxNSwgMSwgQk1BU0soMCwgMCkpOworCS8qICAgICAgIEVuYWJsZSBSWCBPZmZzZXQgQ2FsaWJyYXRpb24gbGF0Y2ggKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsICgxIDw8IDQpLCBCTUFTSyg0LCA0KSk7CisJbXNsZWVwKDIwKTsKKwkvKiAgICAgICBTdGFydCBDYWxpYnJhdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA0LCAoMSA8PCAxMCksIEJNQVNLKDEwLCAxMCkpOworCXRzdGFydCA9IGdldF9qaWZmaWVzXzY0KCk7CisJd2hpbGUgKGNoYW5fZG9uZSAmJgorCSAgICAgICAhdGltZV9hZnRlcjY0KHRzdGFydCwgdHN0YXJ0ICsgbXNlY3NfdG9famlmZmllcyg1MDApKSkgeworCQltc2xlZXAoMjApOworCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgU0VSREVTX0NIQU5TOyArK2NoYW4pIHsKKwkJCXJ4Y2FsZG9uZSA9IGFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLAorCQkJCQkgICAgKGNoYW4gKyAoY2hhbiA+PiAxKSksCisJCQkJCSAgICAyNSwgMCwgMCk7CisJCQlpZiAoKH5yeGNhbGRvbmUgJiAodTMyKUJNQVNLKDksIDkpKSA9PSAwICYmCisJCQkgICAgKH5jaGFuX2RvbmUgJiAoMSA8PCBjaGFuKSkgPT0gMCkKKwkJCQljaGFuX2RvbmUgJj0gfigxIDw8IGNoYW4pOworCQl9CisJfQorCWlmIChjaGFuX2RvbmUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBRSUJfRFJWX05BTUUKKwkJCSAiIFNlcmRlcyAlZCBjYWxpYnJhdGlvbiBub3QgZG9uZSBhZnRlciAuNSBzZWM6IDB4JXhcbiIsCisJCQkgSUJTRChwcGQtPmh3X3BpZHgpLCBjaGFuX2RvbmUpOworCX0gZWxzZSB7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTRVJERVNfQ0hBTlM7ICsrY2hhbikgeworCQkJcnhjYWxkb25lID0gYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksCisJCQkJCSAgICAoY2hhbiArIChjaGFuID4+IDEpKSwKKwkJCQkJICAgIDI1LCAwLCAwKTsKKwkJCWlmICgofnJ4Y2FsZG9uZSAmICh1MzIpQk1BU0soMTAsIDEwKSkgPT0gMCkKKwkJCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRQorCQkJCQkgIiBTZXJkZXMgJWQgY2hhbiAlZCBjYWxpYnJhdGlvbiAiCisJCQkJCSAiZmFpbGVkXG4iLCBJQlNEKHBwZC0+aHdfcGlkeCksIGNoYW4pOworCQl9CisJfQorCisJLyogICAgICAgVHVybiBvZmYgQ2FsaWJyYXRpb24gKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgNCwgMCwgQk1BU0soMTAsIDEwKSk7CisJbXNsZWVwKDIwKTsKKworCS8qIEJSSU5HIFJYIFVQICovCisJLyogICAgICAgU2V0IExFMiB2YWx1ZSAoTWF5IGJlIG92ZXJyaWRkZW4gaW4gcXNmcF83MzIyX2V2ZW50KSAqLworCWxlX3ZhbCA9IElTX1FNRShwcGQtPmRkKSA/IExFMl9RTUUgOiBMRTJfREVGQVVMVDsKKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTMsIChsZV92YWwgPDwgNyksIEJNQVNLKDksIDcpKTsKKwkvKiAgICAgICBTZXQgTEUyIExvb3AgYmFuZHdpZHRoICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDMsICg3IDw8IDUpLCBCTUFTSyg3LCA1KSk7CisJLyogICAgICAgRW5hYmxlIExFMiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgKDEgPDwgNiksIEJNQVNLKDYsIDYpKTsKKwltc2xlZXAoMjApOworCS8qICAgICAgIEVuYWJsZSBIMCBvbmx5ICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEsIDEsIEJNQVNLKDksIDEpKTsKKwkvKiBnYWluIGhpIHN0b3AgMzIgKDIyKSAoNjoxKSBsbyBzdG9wIDcgKDEwOjcpIHRhcmdldCAyMiAoMTMpICgxNToxMSkgKi8KKwlsZV92YWwgPSAocHBkLT5kZC0+Y3NwZWMtPnIxIHx8IElTX1FNRShwcGQtPmRkKSkgPyAweGI2YzAgOiAweDZiYWM7CisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIxLCBsZV92YWwsIDB4ZmZmZSk7CisJLyogICAgICAgRW5hYmxlIFZHQSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA1LCAwLCBCTUFTSygwLCAwKSk7CisJbXNsZWVwKDIwKTsKKwkvKiAgICAgICBTZXQgRnJlcXVlbmN5IExvb3AgQmFuZHdpZHRoICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsICg3IDw8IDUpLCBCTUFTSyg4LCA1KSk7CisJLyogICAgICAgRW5hYmxlIEZyZXF1ZW5jeSBMb29wICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsICgxIDw8IDQpLCBCTUFTSyg0LCA0KSk7CisJLyogICAgICAgU2V0IFRpbWluZyBMb29wIEJhbmR3aWR0aCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAwLCBCTUFTSygxMSwgOSkpOworCS8qICAgICAgIEVuYWJsZSBUaW1pbmcgTG9vcCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAoMSA8PCAzKSwgQk1BU0soMywgMykpOworCW1zbGVlcCg1MCk7CisJLyogICAgICAgRW5hYmxlIERGRQorCSAqICAgICAgIFNldCByZWNlaXZlIGFkYXB0YXRpb24gbW9kZS4gIFNEUiBhbmQgRERSIGFkYXB0YXRpb24gYXJlCisJICogICAgICAgYWx3YXlzIG9uLCBhbmQgUURSIGlzIGluaXRpYWxseSBlbmFibGVkOyBsYXRlciBkaXNhYmxlZC4KKwkgKi8KKwlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3N0YXRpY19hZGFwdF9kaXMoMCksIDBVTEwpOworCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc3RhdGljX2FkYXB0X2RpcygxKSwgMFVMTCk7CisJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zdGF0aWNfYWRhcHRfZGlzKDIpLAorCQkJICAgIHBwZC0+ZGQtPmNzcGVjLT5yMSA/CisJCQkgICAgUURSX1NUQVRJQ19BREFQVF9ET1dOX1IxIDogUURSX1NUQVRJQ19BREFQVF9ET1dOKTsKKwlwcGQtPmNwc3BlYy0+cWRyX2RmZV9vbiA9IDE7CisJLyogICAgICAgRGlzYWJsZSBMRTEgICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEzLCAoMCA8PCA1KSwgKDEgPDwgNSkpOworCS8qICAgICAgIERpc2FibGUgYXV0byBhZGFwdCBmb3IgTEUxICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEsICgwIDw8IDE1KSwgQk1BU0soMTUsIDE1KSk7CisJbXNsZWVwKDIwKTsKKwkvKiAgICAgICBFbmFibGUgQUZFIE9mZnNldCBDYW5jZWwgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsICgxIDw8IDEyKSwgQk1BU0soMTIsIDEyKSk7CisJLyogICAgICAgRW5hYmxlIEJhc2VsaW5lIFdhbmRlciBDb3JyZWN0aW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAoMSA8PCAxMyksIEJNQVNLKDEzLCAxMykpOworCS8qIFRlcm1pbmF0aW9uOiByeHRlcm1jdHJsX3IyZCBhZGRyIDExIGJpdHMgWzEyOjExXSA9IDEgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTEsICgxIDw8IDExKSwgQk1BU0soMTIsIDExKSk7CisJLyogVkdBIG91dHB1dCBjb21tb24gbW9kZSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgKDMgPDwgMiksIEJNQVNLKDMsIDIpKTsKKworCXJldHVybiAwOworfQorCiAvKiBzdGFydCBhZGp1c3QgUU1IIHNlcmRlcyBwYXJhbWV0ZXJzICovCiAKIHN0YXRpYyB2b2lkIHNldF9tYW5fY29kZShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLCBpbnQgY2hhbiwgaW50IGNvZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMKaW5kZXggZjNiNTAzOS4uNzg5NmFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW5pdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2luaXQuYwpAQCAtOTIsOSArOTIsMTEgQEAKIC8qIHNldCBudW1iZXIgb2YgY29udGV4dHMgd2UnbGwgYWN0dWFsbHkgdXNlICovCiB2b2lkIHFpYl9zZXRfY3R4dGNudChzdHJ1Y3QgcWliX2RldmRhdGEgKmRkKQogewotCWlmICghcWliX2NmZ2N0eHRzKQorCWlmICghcWliX2NmZ2N0eHRzKSB7CiAJCWRkLT5jZmdjdHh0cyA9IGRkLT5maXJzdF91c2VyX2N0eHQgKyBudW1fb25saW5lX2NwdXMoKTsKLQllbHNlIGlmIChxaWJfY2ZnY3R4dHMgPCBkZC0+bnVtX3Bwb3J0cykKKwkJaWYgKGRkLT5jZmdjdHh0cyA+IGRkLT5jdHh0Y250KQorCQkJZGQtPmNmZ2N0eHRzID0gZGQtPmN0eHRjbnQ7CisJfSBlbHNlIGlmIChxaWJfY2ZnY3R4dHMgPCBkZC0+bnVtX3Bwb3J0cykKIAkJZGQtPmNmZ2N0eHRzID0gZGQtPmN0eHRjbnQ7CiAJZWxzZSBpZiAocWliX2NmZ2N0eHRzIDw9IGRkLT5jdHh0Y250KQogCQlkZC0+Y2ZnY3R4dHMgPSBxaWJfY2ZnY3R4dHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMKaW5kZXggNTRhNDA4MjguLmE2OTNjNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMKQEAgLTEzMSw3ICsxMzEsOCBAQAogCQkJLyogc3RhcnQgYSA3NW1zZWMgdGltZXIgdG8gY2xlYXIgc3ltYm9sIGVycm9ycyAqLwogCQkJbW9kX3RpbWVyKCZwcGQtPnN5bWVycl9jbGVhcl90aW1lciwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoNzUpKTsKLQkJfSBlbHNlIGlmIChsdHN0YXRlID09IElCX1BIWVNQT1JUU1RBVEVfTElOS1VQKSB7CisJCX0gZWxzZSBpZiAobHRzdGF0ZSA9PSBJQl9QSFlTUE9SVFNUQVRFX0xJTktVUCAmJgorCQkJICAgIShwcGQtPmxmbGFncyAmIFFJQkxfTElOS0FDVElWRSkpIHsKIAkJCS8qIGFjdGl2ZSwgYnV0IG5vdCBhY3RpdmUgZGVmZXJlZCAqLwogCQkJcWliX2hvbF91cChwcGQpOyAvKiB1c2VmdWwgb25seSBmb3IgNjEyMCBub3cgKi8KIAkJCSpwcGQtPnN0YXR1c3AgfD0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2tleXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2tleXMuYwppbmRleCA0YjgwZWIxLi44ZmQxOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9rZXlzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfa2V5cy5jCkBAIC0xMzYsNyArMTM2LDYgQEAKIAlzdHJ1Y3QgcWliX21yZWdpb24gKm1yOwogCXVuc2lnbmVkIG4sIG07CiAJc2l6ZV90IG9mZjsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKQEAgLTE1Miw2ICsxNTEsOCBAQAogCQlpZiAoIWRldi0+ZG1hX21yKQogCQkJZ290byBiYWlsOwogCQlhdG9taWNfaW5jKCZkZXYtPmRtYV9tci0+cmVmY291bnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya3QtPmxvY2ssIGZsYWdzKTsKKwogCQlpc2dlLT5tciA9IGRldi0+ZG1hX21yOwogCQlpc2dlLT52YWRkciA9ICh2b2lkICopIHNnZS0+YWRkcjsKIAkJaXNnZS0+bGVuZ3RoID0gc2dlLT5sZW5ndGg7CkBAIC0xNzAsMTkgKzE3MSwzNCBAQAogCQkgICAgIG9mZiArIHNnZS0+bGVuZ3RoID4gbXItPmxlbmd0aCB8fAogCQkgICAgIChtci0+YWNjZXNzX2ZsYWdzICYgYWNjKSAhPSBhY2MpKQogCQlnb3RvIGJhaWw7CisJYXRvbWljX2luYygmbXItPnJlZmNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya3QtPmxvY2ssIGZsYWdzKTsKIAogCW9mZiArPSBtci0+b2Zmc2V0OwotCW0gPSAwOwotCW4gPSAwOwotCXdoaWxlIChvZmYgPj0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGgpIHsKLQkJb2ZmIC09IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoOwotCQluKys7Ci0JCWlmIChuID49IFFJQl9TRUdTWikgewotCQkJbSsrOwotCQkJbiA9IDA7CisJaWYgKG1yLT5wYWdlX3NoaWZ0KSB7CisJCS8qCisJCXBhZ2Ugc2l6ZXMgYXJlIHVuaWZvcm0gcG93ZXIgb2YgMiBzbyBubyBsb29wIGlzIG5lY2Vzc2FyeQorCQllbnRyaWVzX3NwYW5uZWRfYnlfb2ZmIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGxvb3AgYmVsb3cKKwkJd291bGQgaGF2ZSBleGVjdXRlZC4KKwkJKi8KKwkJc2l6ZV90IGVudHJpZXNfc3Bhbm5lZF9ieV9vZmY7CisKKwkJZW50cmllc19zcGFubmVkX2J5X29mZiA9IG9mZiA+PiBtci0+cGFnZV9zaGlmdDsKKwkJb2ZmIC09IChlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmIDw8IG1yLT5wYWdlX3NoaWZ0KTsKKwkJbSA9IGVudHJpZXNfc3Bhbm5lZF9ieV9vZmYvUUlCX1NFR1NaOworCQluID0gZW50cmllc19zcGFubmVkX2J5X29mZiVRSUJfU0VHU1o7CisJfSBlbHNlIHsKKwkJbSA9IDA7CisJCW4gPSAwOworCQl3aGlsZSAob2ZmID49IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoKSB7CisJCQlvZmYgLT0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGg7CisJCQluKys7CisJCQlpZiAobiA+PSBRSUJfU0VHU1opIHsKKwkJCQltKys7CisJCQkJbiA9IDA7CisJCQl9CiAJCX0KIAl9Ci0JYXRvbWljX2luYygmbXItPnJlZmNvdW50KTsKIAlpc2dlLT5tciA9IG1yOwogCWlzZ2UtPnZhZGRyID0gbXItPm1hcFttXS0+c2Vnc1tuXS52YWRkciArIG9mZjsKIAlpc2dlLT5sZW5ndGggPSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aCAtIG9mZjsKQEAgLTE5MCwxMCArMjA2LDEwIEBACiAJaXNnZS0+bSA9IG07CiAJaXNnZS0+biA9IG47CiBvazoKLQlyZXQgPSAxOworCXJldHVybiAxOwogYmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya3QtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTIxNCw3ICsyMzAsNiBAQAogCXN0cnVjdCBxaWJfbXJlZ2lvbiAqbXI7CiAJdW5zaWduZWQgbiwgbTsKIAlzaXplX3Qgb2ZmOwotCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKgpAQCAtMjMxLDYgKzI0Niw4IEBACiAJCWlmICghZGV2LT5kbWFfbXIpCiAJCQlnb3RvIGJhaWw7CiAJCWF0b21pY19pbmMoJmRldi0+ZG1hX21yLT5yZWZjb3VudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrdC0+bG9jaywgZmxhZ3MpOworCiAJCXNnZS0+bXIgPSBkZXYtPmRtYV9tcjsKIAkJc2dlLT52YWRkciA9ICh2b2lkICopIHZhZGRyOwogCQlzZ2UtPmxlbmd0aCA9IGxlbjsKQEAgLTI0OCwxOSArMjY1LDM0IEBACiAJaWYgKHVubGlrZWx5KHZhZGRyIDwgbXItPmlvdmEgfHwgb2ZmICsgbGVuID4gbXItPmxlbmd0aCB8fAogCQkgICAgIChtci0+YWNjZXNzX2ZsYWdzICYgYWNjKSA9PSAwKSkKIAkJZ290byBiYWlsOworCWF0b21pY19pbmMoJm1yLT5yZWZjb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmt0LT5sb2NrLCBmbGFncyk7CiAKIAlvZmYgKz0gbXItPm9mZnNldDsKLQltID0gMDsKLQluID0gMDsKLQl3aGlsZSAob2ZmID49IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoKSB7Ci0JCW9mZiAtPSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aDsKLQkJbisrOwotCQlpZiAobiA+PSBRSUJfU0VHU1opIHsKLQkJCW0rKzsKLQkJCW4gPSAwOworCWlmIChtci0+cGFnZV9zaGlmdCkgeworCQkvKgorCQlwYWdlIHNpemVzIGFyZSB1bmlmb3JtIHBvd2VyIG9mIDIgc28gbm8gbG9vcCBpcyBuZWNlc3NhcnkKKwkJZW50cmllc19zcGFubmVkX2J5X29mZiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb29wIGJlbG93CisJCXdvdWxkIGhhdmUgZXhlY3V0ZWQuCisJCSovCisJCXNpemVfdCBlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmOworCisJCWVudHJpZXNfc3Bhbm5lZF9ieV9vZmYgPSBvZmYgPj4gbXItPnBhZ2Vfc2hpZnQ7CisJCW9mZiAtPSAoZW50cmllc19zcGFubmVkX2J5X29mZiA8PCBtci0+cGFnZV9zaGlmdCk7CisJCW0gPSBlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmL1FJQl9TRUdTWjsKKwkJbiA9IGVudHJpZXNfc3Bhbm5lZF9ieV9vZmYlUUlCX1NFR1NaOworCX0gZWxzZSB7CisJCW0gPSAwOworCQluID0gMDsKKwkJd2hpbGUgKG9mZiA+PSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aCkgeworCQkJb2ZmIC09IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoOworCQkJbisrOworCQkJaWYgKG4gPj0gUUlCX1NFR1NaKSB7CisJCQkJbSsrOworCQkJCW4gPSAwOworCQkJfQogCQl9CiAJfQotCWF0b21pY19pbmMoJm1yLT5yZWZjb3VudCk7CiAJc2dlLT5tciA9IG1yOwogCXNnZS0+dmFkZHIgPSBtci0+bWFwW21dLT5zZWdzW25dLnZhZGRyICsgb2ZmOwogCXNnZS0+bGVuZ3RoID0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGggLSBvZmY7CkBAIC0yNjgsMTAgKzMwMCwxMCBAQAogCXNnZS0+bSA9IG07CiAJc2dlLT5uID0gbjsKIG9rOgotCXJldCA9IDE7CisJcmV0dXJuIDE7CiBiYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrdC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCmluZGV4IDk0YjBkMWYuLjVhZDIyNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21hZC5jCkBAIC02NjgsOCArNjY4LDggQEAKIAlsaWQgPSBiZTE2X3RvX2NwdShwaXAtPmxpZCk7CiAJLyogTXVzdCBiZSBhIHZhbGlkIHVuaWNhc3QgTElEIGFkZHJlc3MuICovCiAJaWYgKGxpZCA9PSAwIHx8IGxpZCA+PSBRSUJfTVVMVElDQVNUX0xJRF9CQVNFKQotCQlnb3RvIGVycjsKLQlpZiAocHBkLT5saWQgIT0gbGlkIHx8IHBwZC0+bG1jICE9IChwaXAtPm1rZXlwcm90X3Jlc3ZfbG1jICYgNykpIHsKKwkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJZWxzZSBpZiAocHBkLT5saWQgIT0gbGlkIHx8IHBwZC0+bG1jICE9IChwaXAtPm1rZXlwcm90X3Jlc3ZfbG1jICYgNykpIHsKIAkJaWYgKHBwZC0+bGlkICE9IGxpZCkKIAkJCXFpYl9zZXRfdWV2ZW50X2JpdHMocHBkLCBfUUlCX0VWRU5UX0xJRF9DSEFOR0VfQklUKTsKIAkJaWYgKHBwZC0+bG1jICE9IChwaXAtPm1rZXlwcm90X3Jlc3ZfbG1jICYgNykpCkBAIC02ODMsOCArNjgzLDggQEAKIAltc2wgPSBwaXAtPm5laWdoYm9ybXR1X21hc3RlcnNtc2wgJiAweEY7CiAJLyogTXVzdCBiZSBhIHZhbGlkIHVuaWNhc3QgTElEIGFkZHJlc3MuICovCiAJaWYgKHNtbGlkID09IDAgfHwgc21saWQgPj0gUUlCX01VTFRJQ0FTVF9MSURfQkFTRSkKLQkJZ290byBlcnI7Ci0JaWYgKHNtbGlkICE9IGlicC0+c21fbGlkIHx8IG1zbCAhPSBpYnAtPnNtX3NsKSB7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCWVsc2UgaWYgKHNtbGlkICE9IGlicC0+c21fbGlkIHx8IG1zbCAhPSBpYnAtPnNtX3NsKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpYnAtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGlicC0+c21fYWgpIHsKIAkJCWlmIChzbWxpZCAhPSBpYnAtPnNtX2xpZCkKQEAgLTcwNyw4ICs3MDcsOSBAQAogCQlpZiAobHdlID09IDB4RkYpCiAJCQlsd2UgPSBwcGQtPmxpbmtfd2lkdGhfc3VwcG9ydGVkOwogCQllbHNlIGlmIChsd2UgPj0gMTYgfHwgKGx3ZSAmIH5wcGQtPmxpbmtfd2lkdGhfc3VwcG9ydGVkKSkKLQkJCWdvdG8gZXJyOwotCQlzZXRfbGlua193aWR0aF9lbmFibGVkKHBwZCwgbHdlKTsKKwkJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCQllbHNlIGlmIChsd2UgIT0gcHBkLT5saW5rX3dpZHRoX2VuYWJsZWQpCisJCQlzZXRfbGlua193aWR0aF9lbmFibGVkKHBwZCwgbHdlKTsKIAl9CiAKIAlsc2UgPSBwaXAtPmxpbmtzcGVlZGFjdGl2ZV9lbmFibGVkICYgMHhGOwpAQCAtNzIxLDggKzcyMiw5IEBACiAJCWlmIChsc2UgPT0gMTUpCiAJCQlsc2UgPSBwcGQtPmxpbmtfc3BlZWRfc3VwcG9ydGVkOwogCQllbHNlIGlmIChsc2UgPj0gOCB8fCAobHNlICYgfnBwZC0+bGlua19zcGVlZF9zdXBwb3J0ZWQpKQotCQkJZ290byBlcnI7Ci0JCXNldF9saW5rX3NwZWVkX2VuYWJsZWQocHBkLCBsc2UpOworCQkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCWVsc2UgaWYgKGxzZSAhPSBwcGQtPmxpbmtfc3BlZWRfZW5hYmxlZCkKKwkJCXNldF9saW5rX3NwZWVkX2VuYWJsZWQocHBkLCBsc2UpOwogCX0KIAogCS8qIFNldCBsaW5rIGRvd24gZGVmYXVsdCBzdGF0ZS4gKi8KQEAgLTczOCw3ICs3NDAsNyBAQAogCQkJCQlJQl9MSU5LSU5JVENNRF9QT0xMKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZ290byBlcnI7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCX0KIAogCWlicC0+bWtleXByb3QgPSBwaXAtPm1rZXlwcm90X3Jlc3ZfbG1jID4+IDY7CkBAIC03NDgsMTUgKzc1MCwxNyBAQAogCiAJbXR1ID0gaWJfbXR1X2VudW1fdG9faW50KChwaXAtPm5laWdoYm9ybXR1X21hc3RlcnNtc2wgPj4gNCkgJiAweEYpOwogCWlmIChtdHUgPT0gLTEpCi0JCWdvdG8gZXJyOwotCXFpYl9zZXRfbXR1KHBwZCwgbXR1KTsKKwkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJZWxzZQorCQlxaWJfc2V0X210dShwcGQsIG10dSk7CiAKIAkvKiBTZXQgb3BlcmF0aW9uYWwgVkxzICovCiAJdmxzID0gKHBpcC0+b3BlcmF0aW9uYWx2bF9wZWlfcGVvX2ZwaV9mcG8gPj4gNCkgJiAweEY7CiAJaWYgKHZscykgewogCQlpZiAodmxzID4gcHBkLT52bHNfc3VwcG9ydGVkKQotCQkJZ290byBlcnI7Ci0JCSh2b2lkKSBkZC0+Zl9zZXRfaWJfY2ZnKHBwZCwgUUlCX0lCX0NGR19PUF9WTFMsIHZscyk7CisJCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwkJZWxzZQorCQkJKHZvaWQpIGRkLT5mX3NldF9pYl9jZmcocHBkLCBRSUJfSUJfQ0ZHX09QX1ZMUywgdmxzKTsKIAl9CiAKIAlpZiAocGlwLT5ta2V5X3Zpb2xhdGlvbnMgPT0gMCkKQEAgLTc3MCwxMCArNzc0LDEwIEBACiAKIAlvcmUgPSBwaXAtPmxvY2FscGh5ZXJyb3JzX292ZXJydW5lcnJvcnM7CiAJaWYgKHNldF9waHllcnJ0aHJlc2hvbGQocHBkLCAob3JlID4+IDQpICYgMHhGKSkKLQkJZ290byBlcnI7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCiAJaWYgKHNldF9vdmVycnVudGhyZXNob2xkKHBwZCwgKG9yZSAmIDB4RikpKQotCQlnb3RvIGVycjsKKwkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAKIAlpYnAtPnN1Ym5ldF90aW1lb3V0ID0gcGlwLT5jbGllbnRyZXJlZ19yZXN2X3N1Ym5ldHRvICYgMHgxRjsKIApAQCAtNzkyLDcgKzc5Niw3IEBACiAJc3RhdGUgPSBwaXAtPmxpbmtzcGVlZF9wb3J0c3RhdGUgJiAweEY7CiAJbHN0YXRlID0gKHBpcC0+cG9ydHBoeXNzdGF0ZV9saW5rZG93biA+PiA0KSAmIDB4RjsKIAlpZiAobHN0YXRlICYmICEoc3RhdGUgPT0gSUJfUE9SVF9ET1dOIHx8IHN0YXRlID09IElCX1BPUlRfTk9QKSkKLQkJZ290byBlcnI7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCiAJLyoKIAkgKiBPbmx5IHN0YXRlIGNoYW5nZXMgb2YgRE9XTiwgQVJNLCBhbmQgQUNUSVZFIGFyZSB2YWxpZApAQCAtODEyLDggKzgxNiwxMCBAQAogCQkJbHN0YXRlID0gUUlCX0lCX0xJTktET1dOOwogCQllbHNlIGlmIChsc3RhdGUgPT0gMykKIAkJCWxzdGF0ZSA9IFFJQl9JQl9MSU5LRE9XTl9ESVNBQkxFOwotCQllbHNlCi0JCQlnb3RvIGVycjsKKwkJZWxzZSB7CisJCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwkJCWJyZWFrOworCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcGQtPmxmbGFnc19sb2NrLCBmbGFncyk7CiAJCXBwZC0+bGZsYWdzICY9IH5RSUJMX0xJTktWOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcGQtPmxmbGFnc19sb2NrLCBmbGFncyk7CkBAIC04MzUsOCArODQxLDcgQEAKIAkJcWliX3NldF9saW5rc3RhdGUocHBkLCBRSUJfSUJfTElOS0FDVElWRSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCS8qIFhYWCBXZSBoYXZlIGFscmVhZHkgcGFydGlhbGx5IHVwZGF0ZWQgb3VyIHN0YXRlISAqLwotCQlnb3RvIGVycjsKKwkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAJfQogCiAJcmV0ID0gc3Vibl9nZXRfcG9ydGluZm8oc21wLCBpYmRldiwgcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbXIuYwppbmRleCA1Zjk1ZjBmLi4wODk0NGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21yLmMKQEAgLTM5LDcgKzM5LDYgQEAKIC8qIEZhc3QgbWVtb3J5IHJlZ2lvbiAqLwogc3RydWN0IHFpYl9mbXIgewogCXN0cnVjdCBpYl9mbXIgaWJmbXI7Ci0JdTggcGFnZV9zaGlmdDsKIAlzdHJ1Y3QgcWliX21yZWdpb24gbXI7ICAgICAgICAvKiBtdXN0IGJlIGxhc3QgKi8KIH07CiAKQEAgLTEwNyw2ICsxMDYsNyBAQAogCQkJZ290byBiYWlsOwogCX0KIAltci0+bXIubWFwc3ogPSBtOworCW1yLT5tci5wYWdlX3NoaWZ0ID0gMDsKIAltci0+bXIubWF4X3NlZ3MgPSBjb3VudDsKIAogCS8qCkBAIC0yMzEsNiArMjMxLDggQEAKIAltci0+bXIuYWNjZXNzX2ZsYWdzID0gbXJfYWNjZXNzX2ZsYWdzOwogCW1yLT51bWVtID0gdW1lbTsKIAorCWlmIChpc19wb3dlcl9vZl8yKHVtZW0tPnBhZ2Vfc2l6ZSkpCisJCW1yLT5tci5wYWdlX3NoaWZ0ID0gaWxvZzIodW1lbS0+cGFnZV9zaXplKTsKIAltID0gMDsKIAluID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmdW1lbS0+Y2h1bmtfbGlzdCwgbGlzdCkgewpAQCAtMzkwLDcgKzM5Miw3IEBACiAJZm1yLT5tci5vZmZzZXQgPSAwOwogCWZtci0+bXIuYWNjZXNzX2ZsYWdzID0gbXJfYWNjZXNzX2ZsYWdzOwogCWZtci0+bXIubWF4X3NlZ3MgPSBmbXJfYXR0ci0+bWF4X3BhZ2VzOwotCWZtci0+cGFnZV9zaGlmdCA9IGZtcl9hdHRyLT5wYWdlX3NoaWZ0OworCWZtci0+bXIucGFnZV9zaGlmdCA9IGZtcl9hdHRyLT5wYWdlX3NoaWZ0OwogCiAJYXRvbWljX3NldCgmZm1yLT5tci5yZWZjb3VudCwgMCk7CiAJcmV0ID0gJmZtci0+aWJmbXI7CkBAIC00MzcsNyArNDM5LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmt0LT5sb2NrLCBmbGFncyk7CiAJZm1yLT5tci51c2VyX2Jhc2UgPSBpb3ZhOwogCWZtci0+bXIuaW92YSA9IGlvdmE7Ci0JcHMgPSAxIDw8IGZtci0+cGFnZV9zaGlmdDsKKwlwcyA9IDEgPDwgZm1yLT5tci5wYWdlX3NoaWZ0OwogCWZtci0+bXIubGVuZ3RoID0gbGlzdF9sZW4gKiBwczsKIAltID0gMDsKIAluID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCmluZGV4IDZjMzk4NTEuLmUxNjc1MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYwpAQCAtNDgsMTMgKzQ4LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZmluZF9uZXh0X29mZnNldChzdHJ1Y3QgcWliX3Fwbl90YWJsZSAqcXB0LAogCQkJCQlzdHJ1Y3QgcXBuX21hcCAqbWFwLCB1bnNpZ25lZCBvZmYsCi0JCQkJCXVuc2lnbmVkIHIpCisJCQkJCXVuc2lnbmVkIG4pCiB7CiAJaWYgKHFwdC0+bWFzaykgewogCQlvZmYrKzsKLQkJaWYgKChvZmYgJiBxcHQtPm1hc2spID4+IDEgIT0gcikKLQkJCW9mZiA9ICgob2ZmICYgcXB0LT5tYXNrKSA/Ci0JCQkJKG9mZiB8IHFwdC0+bWFzaykgKyAxIDogb2ZmKSB8IChyIDw8IDEpOworCQlpZiAoKChvZmYgJiBxcHQtPm1hc2spID4+IDEpID49IG4pCisJCQlvZmYgPSAob2ZmIHwgcXB0LT5tYXNrKSArIDI7CiAJfSBlbHNlCiAJCW9mZiA9IGZpbmRfbmV4dF96ZXJvX2JpdChtYXAtPnBhZ2UsIEJJVFNfUEVSX1BBR0UsIG9mZik7CiAJcmV0dXJuIG9mZjsKQEAgLTEyMyw3ICsxMjIsNiBAQAogCXUzMiBpLCBvZmZzZXQsIG1heF9zY2FuLCBxcG47CiAJc3RydWN0IHFwbl9tYXAgKm1hcDsKIAl1MzIgcmV0OwotCWludCByOwogCiAJaWYgKHR5cGUgPT0gSUJfUVBUX1NNSSB8fCB0eXBlID09IElCX1FQVF9HU0kpIHsKIAkJdW5zaWduZWQgbjsKQEAgLTEzOSwxNSArMTM3LDExIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQlyID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWlmIChyID49IGRkLT5uX2tyY3ZfcXVldWVzKQotCQlyICU9IGRkLT5uX2tyY3ZfcXVldWVzOwotCXFwbiA9IHFwdC0+bGFzdCArIDE7CisJcXBuID0gcXB0LT5sYXN0ICsgMjsKIAlpZiAocXBuID49IFFQTl9NQVgpCiAJCXFwbiA9IDI7Ci0JaWYgKHFwdC0+bWFzayAmJiAoKHFwbiAmIHFwdC0+bWFzaykgPj4gMSkgIT0gcikKLQkJcXBuID0gKChxcG4gJiBxcHQtPm1hc2spID8gKHFwbiB8IHFwdC0+bWFzaykgKyAxIDogcXBuKSB8Ci0JCQkociA8PCAxKTsKKwlpZiAocXB0LT5tYXNrICYmICgocXBuICYgcXB0LT5tYXNrKSA+PiAxKSA+PSBkZC0+bl9rcmN2X3F1ZXVlcykKKwkJcXBuID0gKHFwbiB8IHFwdC0+bWFzaykgKyAyOwogCW9mZnNldCA9IHFwbiAmIEJJVFNfUEVSX1BBR0VfTUFTSzsKIAltYXAgPSAmcXB0LT5tYXBbcXBuIC8gQklUU19QRVJfUEFHRV07CiAJbWF4X3NjYW4gPSBxcHQtPm5tYXBzIC0gIW9mZnNldDsKQEAgLTE2Myw3ICsxNTcsOCBAQAogCQkJCXJldCA9IHFwbjsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9Ci0JCQlvZmZzZXQgPSBmaW5kX25leHRfb2Zmc2V0KHFwdCwgbWFwLCBvZmZzZXQsIHIpOworCQkJb2Zmc2V0ID0gZmluZF9uZXh0X29mZnNldChxcHQsIG1hcCwgb2Zmc2V0LAorCQkJCWRkLT5uX2tyY3ZfcXVldWVzKTsKIAkJCXFwbiA9IG1rX3FwbihxcHQsIG1hcCwgb2Zmc2V0KTsKIAkJCS8qCiAJCQkgKiBUaGlzIHRlc3QgZGlmZmVycyBmcm9tIGFsbG9jX3BpZG1hcCgpLgpAQCAtMTgzLDEzICsxNzgsMTMgQEAKIAkJCWlmIChxcHQtPm5tYXBzID09IFFQTk1BUF9FTlRSSUVTKQogCQkJCWJyZWFrOwogCQkJbWFwID0gJnFwdC0+bWFwW3FwdC0+bm1hcHMrK107Ci0JCQlvZmZzZXQgPSBxcHQtPm1hc2sgPyAociA8PCAxKSA6IDA7CisJCQlvZmZzZXQgPSAwOwogCQl9IGVsc2UgaWYgKG1hcCA8ICZxcHQtPm1hcFtxcHQtPm5tYXBzXSkgewogCQkJKyttYXA7Ci0JCQlvZmZzZXQgPSBxcHQtPm1hc2sgPyAociA8PCAxKSA6IDA7CisJCQlvZmZzZXQgPSAwOwogCQl9IGVsc2UgewogCQkJbWFwID0gJnFwdC0+bWFwWzBdOwotCQkJb2Zmc2V0ID0gcXB0LT5tYXNrID8gKHIgPDwgMSkgOiAyOworCQkJb2Zmc2V0ID0gMjsKIAkJfQogCQlxcG4gPSBta19xcG4ocXB0LCBtYXAsIG9mZnNldCk7CiAJfQpAQCAtNDY4LDYgKzQ2MywxMCBAQAogCQlxcC0+c19mbGFncyAmPSB+KFFJQl9TX1RJTUVSIHwgUUlCX1NfV0FJVF9STlIpOwogCQlkZWxfdGltZXIoJnFwLT5zX3RpbWVyKTsKIAl9CisKKwlpZiAocXAtPnNfZmxhZ3MgJiBRSUJfU19BTllfV0FJVF9TRU5EKQorCQlxcC0+c19mbGFncyAmPSB+UUlCX1NfQU5ZX1dBSVRfU0VORDsKKwogCXNwaW5fbG9jaygmZGV2LT5wZW5kaW5nX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmcXAtPmlvd2FpdCkgJiYgIShxcC0+c19mbGFncyAmIFFJQl9TX0JVU1kpKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH5RSUJfU19BTllfV0FJVF9JTzsKQEAgLTEwNjEsNyArMTA2MCw2IEBACiAJCX0KIAkJcXAtPmlicXAucXBfbnVtID0gZXJyOwogCQlxcC0+cG9ydF9udW0gPSBpbml0X2F0dHItPnBvcnRfbnVtOwotCQlxcC0+cHJvY2Vzc29yX2lkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCQlxaWJfcmVzZXRfcXAocXAsIGluaXRfYXR0ci0+cXBfdHlwZSk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYwppbmRleCA5NTVmYjcxLi44MjQ1MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKQEAgLTE0MDcsNiArMTQwNyw3IEBACiAJCQkgICAgc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkKQogewogCXN0cnVjdCBxaWJfc3dxZSAqd3FlOworCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQgPSBwcGRfZnJvbV9pYnAoaWJwKTsKIAllbnVtIGliX3djX3N0YXR1cyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZGlmZjsKQEAgLTE0MTQsNiArMTQxNSwyOSBAQAogCXUzMiBhZXRoOwogCXU2NCB2YWw7CiAKKwlpZiAob3Bjb2RlICE9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9NSURETEUpKSB7CisJCS8qCisJCSAqIElmIEFDSydkIFBTTiBvbiBTRE1BIGJ1c3kgbGlzdCB0cnkgdG8gbWFrZSBwcm9ncmVzcyB0bworCQkgKiByZWNsYWltIFNETUEgY3JlZGl0cy4KKwkJICovCisJCWlmICgocWliX2NtcDI0KHBzbiwgcXAtPnNfc2VuZGluZ19wc24pID49IDApICYmCisJCSAgICAocWliX2NtcDI0KHFwLT5zX3NlbmRpbmdfcHNuLCBxcC0+c19zZW5kaW5nX2hwc24pIDw9IDApKSB7CisKKwkJCS8qCisJCQkgKiBJZiBzZW5kIHRhc2tsZXQgbm90IHJ1bm5pbmcgYXR0ZW1wdCB0byBwcm9ncmVzcworCQkJICogU0RNQSBxdWV1ZS4KKwkJCSAqLworCQkJaWYgKCEocXAtPnNfZmxhZ3MgJiBRSUJfU19CVVNZKSkgeworCQkJCS8qIEFjcXVpcmUgU0RNQSBMb2NrICovCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBwZC0+c2RtYV9sb2NrLCBmbGFncyk7CisJCQkJLyogSW52b2tlIHNkbWEgbWFrZSBwcm9ncmVzcyAqLworCQkJCXFpYl9zZG1hX21ha2VfcHJvZ3Jlc3MocHBkKTsKKwkJCQkvKiBSZWxlYXNlIFNETUEgTG9jayAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwZC0+c2RtYV9sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwl9CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogCiAJLyogSWdub3JlIGludmFsaWQgcmVzcG9uc2VzLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMKaW5kZXggZTFiM2RhMi4uNGE1MWZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jCkBAIC00NDUsMTMgKzQ0NSwxNCBAQAogCXFrZXkgPSBiZTMyX3RvX2NwdShvaGRyLT51LnVkLmRldGhbMF0pOwogCXNyY19xcCA9IGJlMzJfdG9fY3B1KG9oZHItPnUudWQuZGV0aFsxXSkgJiBRSUJfUVBOX01BU0s7CiAKLQkvKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgbWVzc2FnZSB3YXMgcGFkZGVkIGJ5LiAqLworCS8qCisJICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIG1lc3NhZ2Ugd2FzIHBhZGRlZCBieQorCSAqIGFuZCBkcm9wIGluY29tcGxldGUgcGFja2V0cy4KKwkgKi8KIAlwYWQgPSAoYmUzMl90b19jcHUob2hkci0+YnRoWzBdKSA+PiAyMCkgJiAzOwotCWlmICh1bmxpa2VseSh0bGVuIDwgKGhkcnNpemUgKyBwYWQgKyA0KSkpIHsKLQkJLyogRHJvcCBpbmNvbXBsZXRlIHBhY2tldHMuICovCi0JCWlicC0+bl9wa3RfZHJvcHMrKzsKLQkJZ290byBiYWlsOwotCX0KKwlpZiAodW5saWtlbHkodGxlbiA8IChoZHJzaXplICsgcGFkICsgNCkpKQorCQlnb3RvIGRyb3A7CisKIAl0bGVuIC09IGhkcnNpemUgKyBwYWQgKyA0OwogCiAJLyoKQEAgLTQ2MCwxMCArNDYxLDggQEAKIAkgKi8KIAlpZiAocXAtPmlicXAucXBfbnVtKSB7CiAJCWlmICh1bmxpa2VseShoZHItPmxyaFsxXSA9PSBJQl9MSURfUEVSTUlTU0lWRSB8fAotCQkJICAgICBoZHItPmxyaFszXSA9PSBJQl9MSURfUEVSTUlTU0lWRSkpIHsKLQkJCWlicC0+bl9wa3RfZHJvcHMrKzsKLQkJCWdvdG8gYmFpbDsKLQkJfQorCQkJICAgICBoZHItPmxyaFszXSA9PSBJQl9MSURfUEVSTUlTU0lWRSkpCisJCQlnb3RvIGRyb3A7CiAJCWlmIChxcC0+aWJxcC5xcF9udW0gPiAxKSB7CiAJCQl1MTYgcGtleTEsIHBrZXkyOwogCkBAIC00NzYsNyArNDc1LDcgQEAKIAkJCQkJCTB4RiwKIAkJCQkJICAgICAgc3JjX3FwLCBxcC0+aWJxcC5xcF9udW0sCiAJCQkJCSAgICAgIGhkci0+bHJoWzNdLCBoZHItPmxyaFsxXSk7Ci0JCQkJZ290byBiYWlsOworCQkJCXJldHVybjsKIAkJCX0KIAkJfQogCQlpZiAodW5saWtlbHkocWtleSAhPSBxcC0+cWtleSkpIHsKQEAgLTQ4NCwzMCArNDgzLDI0IEBACiAJCQkJICAgICAgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiA0KSAmIDB4RiwKIAkJCQkgICAgICBzcmNfcXAsIHFwLT5pYnFwLnFwX251bSwKIAkJCQkgICAgICBoZHItPmxyaFszXSwgaGRyLT5scmhbMV0pOwotCQkJZ290byBiYWlsOworCQkJcmV0dXJuOwogCQl9CiAJCS8qIERyb3AgaW52YWxpZCBNQUQgcGFja2V0cyAoc2VlIDEzLjUuMy4xKS4gKi8KIAkJaWYgKHVubGlrZWx5KHFwLT5pYnFwLnFwX251bSA9PSAxICYmCiAJCQkgICAgICh0bGVuICE9IDI1NiB8fAotCQkJICAgICAgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgPT0gMTUpKSkgewotCQkJaWJwLT5uX3BrdF9kcm9wcysrOwotCQkJZ290byBiYWlsOwotCQl9CisJCQkgICAgICAoYmUxNl90b19jcHUoaGRyLT5scmhbMF0pID4+IDEyKSA9PSAxNSkpKQorCQkJZ290byBkcm9wOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBpYl9zbXAgKnNtcDsKIAogCQkvKiBEcm9wIGludmFsaWQgTUFEIHBhY2tldHMgKHNlZSAxMy41LjMuMSkuICovCi0JCWlmICh0bGVuICE9IDI1NiB8fCAoYmUxNl90b19jcHUoaGRyLT5scmhbMF0pID4+IDEyKSAhPSAxNSkgewotCQkJaWJwLT5uX3BrdF9kcm9wcysrOwotCQkJZ290byBiYWlsOwotCQl9CisJCWlmICh0bGVuICE9IDI1NiB8fCAoYmUxNl90b19jcHUoaGRyLT5scmhbMF0pID4+IDEyKSAhPSAxNSkKKwkJCWdvdG8gZHJvcDsKIAkJc21wID0gKHN0cnVjdCBpYl9zbXAgKikgZGF0YTsKIAkJaWYgKChoZHItPmxyaFsxXSA9PSBJQl9MSURfUEVSTUlTU0lWRSB8fAogCQkgICAgIGhkci0+bHJoWzNdID09IElCX0xJRF9QRVJNSVNTSVZFKSAmJgotCQkgICAgc21wLT5tZ210X2NsYXNzICE9IElCX01HTVRfQ0xBU1NfU1VCTl9ESVJFQ1RFRF9ST1VURSkgewotCQkJaWJwLT5uX3BrdF9kcm9wcysrOwotCQkJZ290byBiYWlsOwotCQl9CisJCSAgICBzbXAtPm1nbXRfY2xhc3MgIT0gSUJfTUdNVF9DTEFTU19TVUJOX0RJUkVDVEVEX1JPVVRFKQorCQkJZ290byBkcm9wOwogCX0KIAogCS8qCkBAIC01MTksMTQgKzUxMiwxMiBAQAogCSAgICBvcGNvZGUgPT0gSUJfT1BDT0RFX1VEX1NFTkRfT05MWV9XSVRIX0lNTUVESUFURSkgewogCQl3Yy5leC5pbW1fZGF0YSA9IG9oZHItPnUudWQuaW1tX2RhdGE7CiAJCXdjLndjX2ZsYWdzID0gSUJfV0NfV0lUSF9JTU07Ci0JCWhkcnNpemUgKz0gc2l6ZW9mKHUzMik7CisJCXRsZW4gLT0gc2l6ZW9mKHUzMik7CiAJfSBlbHNlIGlmIChvcGNvZGUgPT0gSUJfT1BDT0RFX1VEX1NFTkRfT05MWSkgewogCQl3Yy5leC5pbW1fZGF0YSA9IDA7CiAJCXdjLndjX2ZsYWdzID0gMDsKLQl9IGVsc2UgewotCQlpYnAtPm5fcGt0X2Ryb3BzKys7Ci0JCWdvdG8gYmFpbDsKLQl9CisJfSBlbHNlCisJCWdvdG8gZHJvcDsKIAogCS8qCiAJICogQSBHUkggaXMgZXhwZWN0ZWQgdG8gcHJlY2VlZCB0aGUgZGF0YSBldmVuIGlmIG5vdApAQCAtNTU2LDggKzU0Nyw3IEBACiAJLyogU2lsZW50bHkgZHJvcCBwYWNrZXRzIHdoaWNoIGFyZSB0b28gYmlnLiAqLwogCWlmICh1bmxpa2VseSh3Yy5ieXRlX2xlbiA+IHFwLT5yX2xlbikpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUUlCX1JfUkVVU0VfU0dFOwotCQlpYnAtPm5fcGt0X2Ryb3BzKys7Ci0JCXJldHVybjsKKwkJZ290byBkcm9wOwogCX0KIAlpZiAoaGFzX2dyaCkgewogCQlxaWJfY29weV9zZ2UoJnFwLT5yX3NnZSwgJmhkci0+dS5sLmdyaCwKQEAgLTU5NCw1ICs1ODQsOCBAQAogCXFpYl9jcV9lbnRlcih0b19pY3EocXAtPmlicXAucmVjdl9jcSksICZ3YywKIAkJICAgICAob2hkci0+YnRoWzBdICYKIAkJCWNwdV90b19iZTMyKElCX0JUSF9TT0xJQ0lURUQpKSAhPSAwKTsKLWJhaWw6OworCXJldHVybjsKKworZHJvcDoKKwlpYnAtPm5fcGt0X2Ryb3BzKys7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3NkbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VzZXJfc2RtYS5jCmluZGV4IDRjMTllMDYuLjY2MjA4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VzZXJfc2RtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VzZXJfc2RtYS5jCkBAIC0zODIsNiArMzgyLDcgQEAKIAogCQlrbWVtX2NhY2hlX2ZyZWUocHEtPnBrdF9zbGFiLCBwa3QpOwogCX0KKwlJTklUX0xJU1RfSEVBRChsaXN0KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCmluZGV4IGJkNTdjMTIuLjYzYjIyYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaApAQCAtMzAxLDYgKzMwMSw3IEBACiAJaW50IGFjY2Vzc19mbGFnczsKIAl1MzIgbWF4X3NlZ3M7ICAgICAgICAgICAvKiBudW1iZXIgb2YgcWliX3NlZ3MgaW4gYWxsIHRoZSBhcnJheXMgKi8KIAl1MzIgbWFwc3o7ICAgICAgICAgICAgICAvKiBzaXplIG9mIHRoZSBtYXAgYXJyYXkgKi8KKwl1OCAgcGFnZV9zaGlmdDsgICAgICAgICAvKiAwIC0gbm9uIHVuZm9ybS9ub24gcG93ZXJvZjIgc2l6ZXMgKi8KIAlhdG9taWNfdCByZWZjb3VudDsKIAlzdHJ1Y3QgcWliX3NlZ2FycmF5ICptYXBbMF07ICAgIC8qIHRoZSBzZWdtZW50cyAqLwogfTsKQEAgLTQzNSw3ICs0MzYsNiBAQAogCXNwaW5sb2NrX3Qgcl9sb2NrOyAgICAgIC8qIHVzZWQgZm9yIEFQTSAqLwogCXNwaW5sb2NrX3Qgc19sb2NrOwogCWF0b21pY190IHNfZG1hX2J1c3k7Ci0JdW5zaWduZWQgcHJvY2Vzc29yX2lkOwkvKiBQcm9jZXNzb3IgSUQgUVAgaXMgYm91bmQgdG8gKi8KIAl1MzIgc19mbGFnczsKIAl1MzIgc19jdXJfc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIHNlbmQgcGFja2V0IGluIGJ5dGVzICovCiAJdTMyIHNfbGVuOyAgICAgICAgICAgICAgLyogdG90YWwgbGVuZ3RoIG9mIHNfc2dlICovCkBAIC04MTMsMTMgKzgxMyw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBxaWJfc2NoZWR1bGVfc2VuZChzdHJ1Y3QgcWliX3FwICpxcCkKIHsKLQlpZiAocWliX3NlbmRfb2socXApKSB7Ci0JCWlmIChxcC0+cHJvY2Vzc29yX2lkID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJCXF1ZXVlX3dvcmsocWliX3dxLCAmcXAtPnNfd29yayk7Ci0JCWVsc2UKLQkJCXF1ZXVlX3dvcmtfb24ocXAtPnByb2Nlc3Nvcl9pZCwKLQkJCQkgICAgICBxaWJfd3EsICZxcC0+c193b3JrKTsKLQl9CisJaWYgKHFpYl9zZW5kX29rKHFwKSkKKwkJcXVldWVfd29yayhxaWJfd3EsICZxcC0+c193b3JrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcWliX3BrZXlfb2sodTE2IHBrZXkxLCB1MTYgcGtleTIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL0tjb25maWcgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL0tjb25maWcKaW5kZXggOWQ5YTlkYy4uNTU4NTVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvS2NvbmZpZwpAQCAtMSw3ICsxLDYgQEAKIGNvbmZpZyBJTkZJTklCQU5EX0lQT0lCCiAJdHJpc3RhdGUgIklQLW92ZXItSW5maW5pQmFuZCIKIAlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgSU5FVCAmJiAoSVBWNiB8fCBJUFY2PW4pCi0Jc2VsZWN0IElORVRfTFJPCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIElQLW92ZXItSW5maW5pQmFuZCBwcm90b2NvbCAoSVBvSUIpLiBUaGlzCiAJICB0cmFuc3BvcnRzIElQIHBhY2tldHMgb3ZlciBJbmZpbmlCYW5kIHNvIHlvdSBjYW4gdXNlIHlvdXIgSUIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAppbmRleCA3NTNhOTgzLi5hYjk3ZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogI2luY2x1ZGUgPHJkbWEvaWJfc2EuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0X2xyby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKIC8qIGNvbnN0YW50cyAqLwogCkBAIC0xMDAsOSArMTAwLDYgQEAKIAlJUE9JQl9NQ0FTVF9GTEFHX0JVU1kJICA9IDIsCS8qIGpvaW5pbmcgb3IgYWxyZWFkeSBqb2luZWQgKi8KIAlJUE9JQl9NQ0FTVF9GTEFHX0FUVEFDSEVEID0gMywKIAotCUlQT0lCX01BWF9MUk9fREVTQ1JJUFRPUlMgPSA4LAotCUlQT0lCX0xST19NQVhfQUdHUiAJICA9IDY0LAotCiAJTUFYX1NFTkRfQ1FFCQkgID0gMTYsCiAJSVBPSUJfQ01fQ09QWUJSRUFLCSAgPSAyNTYsCiB9OwpAQCAtMjYyLDExICsyNTksNiBAQAogCXUxNiAgICAgbWF4X2NvYWxlc2NlZF9mcmFtZXM7CiB9OwogCi1zdHJ1Y3QgaXBvaWJfbHJvIHsKLQlzdHJ1Y3QgbmV0X2xyb19tZ3IgbHJvX21ncjsKLQlzdHJ1Y3QgbmV0X2xyb19kZXNjIGxyb19kZXNjW0lQT0lCX01BWF9MUk9fREVTQ1JJUFRPUlNdOwotfTsKLQogLyoKICAqIERldmljZSBwcml2YXRlIGxvY2tpbmc6IG5ldHdvcmsgc3RhY2sgdHhfbG9jayBwcm90ZWN0cyBtZW1iZXJzIHVzZWQKICAqIGluIFRYIGZhc3QgcGF0aCwgbG9jayBwcm90ZWN0cyBldmVyeXRoaW5nIGVsc2UuICBsb2NrIG5lc3RzIGluc2lkZQpAQCAtMzUyLDggKzM0NCw2IEBACiAJaW50CWhjYV9jYXBzOwogCXN0cnVjdCBpcG9pYl9ldGh0b29sX3N0IGV0aHRvb2w7CiAJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsKLQotCXN0cnVjdCBpcG9pYl9scm8gbHJvOwogfTsKIAogc3RydWN0IGlwb2liX2FoIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYwppbmRleCBiYjEwMDQxLi5jMWM0OWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCkBAIC0xNDgwLDYgKzE0ODAsNyBAQAogCiAJCWlmICh0ZXN0X2JpdChJUE9JQl9GTEFHX0NTVU0sICZwcml2LT5mbGFncykpIHsKIAkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRzsKKwkJCXByaXYtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CiAJCQlpZiAocHJpdi0+aGNhX2NhcHMgJiBJQl9ERVZJQ0VfVURfVFNPKQogCQkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9ldGh0b29sLmMKaW5kZXggMWExNjU3Yy4uMTlmN2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9ldGh0b29sLmMKQEAgLTEwNiw2MyArMTA2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyIGlwb2liX3N0YXRzX2tleXNbXVtFVEhfR1NUUklOR19MRU5dID0gewotCSJMUk8gYWdncmVnYXRlZCIsICJMUk8gZmx1c2hlZCIsCi0JIkxSTyBhdmcgYWdnciIsICJMUk8gbm8gZGVzYyIKLX07Ci0KLXN0YXRpYyB2b2lkIGlwb2liX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQotewotCXN3aXRjaCAoc3RyaW5nc2V0KSB7Ci0JY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCW1lbWNweShkYXRhLCAqaXBvaWJfc3RhdHNfa2V5cywJc2l6ZW9mKGlwb2liX3N0YXRzX2tleXMpKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGlwb2liX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KQotewotCXN3aXRjaCAoc3NldCkgewotCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlyZXR1cm4gQVJSQVlfU0laRShpcG9pYl9zdGF0c19rZXlzKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpcG9pYl9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdWludDY0X3QgKmRhdGEpCi17Ci0Jc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgaW5kZXggPSAwOwotCi0JLyogR2V0IExSTyBzdGF0aXN0aWNzICovCi0JZGF0YVtpbmRleCsrXSA9IHByaXYtPmxyby5scm9fbWdyLnN0YXRzLmFnZ3JlZ2F0ZWQ7Ci0JZGF0YVtpbmRleCsrXSA9IHByaXYtPmxyby5scm9fbWdyLnN0YXRzLmZsdXNoZWQ7Ci0JaWYgKHByaXYtPmxyby5scm9fbWdyLnN0YXRzLmZsdXNoZWQpCi0JCWRhdGFbaW5kZXgrK10gPSBwcml2LT5scm8ubHJvX21nci5zdGF0cy5hZ2dyZWdhdGVkIC8KLQkJCQlwcml2LT5scm8ubHJvX21nci5zdGF0cy5mbHVzaGVkOwotCWVsc2UKLQkJZGF0YVtpbmRleCsrXSA9IDA7Ci0JZGF0YVtpbmRleCsrXSA9IHByaXYtPmxyby5scm9fbWdyLnN0YXRzLm5vX2Rlc2M7Ci19Ci0KLXN0YXRpYyBpbnQgaXBvaWJfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gZXRodG9vbF9vcF9zZXRfZmxhZ3MoZGV2LCBmbGFncywgRVRIX0ZMQUdfTFJPKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpcG9pYl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JCT0gaXBvaWJfZ2V0X2RydmluZm8sCiAJLmdldF9yeF9jc3VtCQk9IGlwb2liX2dldF9yeF9jc3VtLAogCS5zZXRfdHNvCQk9IGlwb2liX3NldF90c28sCiAJLmdldF9jb2FsZXNjZQkJPSBpcG9pYl9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQkJPSBpcG9pYl9zZXRfY29hbGVzY2UsCi0JLmdldF9mbGFncwkJPSBldGh0b29sX29wX2dldF9mbGFncywKLQkuc2V0X2ZsYWdzCQk9IGlwb2liX3NldF9mbGFncywKLQkuZ2V0X3N0cmluZ3MJCT0gaXBvaWJfZ2V0X3N0cmluZ3MsCi0JLmdldF9zc2V0X2NvdW50CQk9IGlwb2liX2dldF9zc2V0X2NvdW50LAotCS5nZXRfZXRodG9vbF9zdGF0cwk9IGlwb2liX2dldF9ldGh0b29sX3N0YXRzLAogfTsKIAogdm9pZCBpcG9pYl9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCBkZmE3MTkwLi44MDZkMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCkBAIC0yOTUsMTAgKzI5NSw3IEBACiAJaWYgKHRlc3RfYml0KElQT0lCX0ZMQUdfQ1NVTSwgJnByaXYtPmZsYWdzKSAmJiBsaWtlbHkod2MtPmNzdW1fb2spKQogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwogCi0JaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKLQkJbHJvX3JlY2VpdmVfc2tiKCZwcml2LT5scm8ubHJvX21nciwgc2tiLCBOVUxMKTsKLQllbHNlCi0JCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJbmFwaV9ncm9fcmVjZWl2ZSgmcHJpdi0+bmFwaSwgc2tiKTsKIAogcmVwb3N0OgogCWlmICh1bmxpa2VseShpcG9pYl9pYl9wb3N0X3JlY2VpdmUoZGV2LCB3cl9pZCkpKQpAQCAtNDUwLDkgKzQ0Nyw2IEBACiAJfQogCiAJaWYgKGRvbmUgPCBidWRnZXQpIHsKLQkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKLQkJCWxyb19mbHVzaF9hbGwoJnByaXYtPmxyby5scm9fbWdyKTsKLQogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQlpZiAodW5saWtlbHkoaWJfcmVxX25vdGlmeV9jcShwcml2LT5yZWN2X2NxLAogCQkJCQkgICAgICBJQl9DUV9ORVhUX0NPTVAgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCA5ZmY3YmM3Li43YTA3YTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtNjAsMTUgKzYwLDYgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChyZWN2X3F1ZXVlX3NpemUsIGlwb2liX3JlY3ZxX3NpemUsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlY3ZfcXVldWVfc2l6ZSwgIk51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiByZWNlaXZlIHF1ZXVlIik7CiAKLXN0YXRpYyBpbnQgbHJvOwotbW9kdWxlX3BhcmFtKGxybywgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxybywgICJFbmFibGUgTFJPIChMYXJnZSBSZWNlaXZlIE9mZmxvYWQpIik7Ci0KLXN0YXRpYyBpbnQgbHJvX21heF9hZ2dyID0gSVBPSUJfTFJPX01BWF9BR0dSOwotbW9kdWxlX3BhcmFtKGxyb19tYXhfYWdnciwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobHJvX21heF9hZ2dyLCAiTFJPOiBNYXggcGFja2V0cyB0byBiZSBhZ2dyZWdhdGVkICIKLQkJIihkZWZhdWx0ID0gNjQpIik7Ci0KICNpZmRlZiBDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVRwogaW50IGlwb2liX2RlYnVnX2xldmVsOwogCkBAIC05NzYsNTQgKzk2Nyw2IEBACiAJLmNyZWF0ZQk9IGlwb2liX2hhcmRfaGVhZGVyLAogfTsKIAotc3RhdGljIGludCBnZXRfc2tiX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICoqaXBoZHIsCi0JCSAgICAgICB2b2lkICoqdGNwaCwgdTY0ICpoZHJfZmxhZ3MsIHZvaWQgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IGlwX2xlbjsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQotCWlmICh1bmxpa2VseShza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSkpCi0JCXJldHVybiAtMTsKLQotCS8qCi0JICogSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgYWRkIGFuIGVsc2UgY2xhdXNlIHRoYXQgdmVyaWZpZXMgdGhlCi0JICogY2hlY2tzdW0gYW5kIGFsbG93cyBkZXZpY2VzIHdoaWNoIGRvIG5vdCBjYWxjdWxhdGUgY2hlY2tzdW0KLQkgKiB0byB1c2UgTFJPLgotCSAqLwotCWlmICh1bmxpa2VseShza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWSkpCi0JCXJldHVybiAtMTsKLQotCS8qIENoZWNrIGZvciBub24tVENQIHBhY2tldCAqLwotCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotCWlwaCA9IGlwX2hkcihza2IpOwotCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQKQotCQlyZXR1cm4gLTE7Ci0KLQlpcF9sZW4gPSBpcF9oZHJsZW4oc2tiKTsKLQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBpcF9sZW4pOwotCSp0Y3BoID0gdGNwX2hkcihza2IpOwotCi0JLyogY2hlY2sgaWYgSVAgaGVhZGVyIGFuZCBUQ1AgaGVhZGVyIGFyZSBjb21wbGV0ZSAqLwotCWlmIChudG9ocyhpcGgtPnRvdF9sZW4pIDwgaXBfbGVuICsgdGNwX2hkcmxlbihza2IpKQotCQlyZXR1cm4gLTE7Ci0KLQkqaGRyX2ZsYWdzID0gTFJPX0lQVjQgfCBMUk9fVENQOwotCSppcGhkciA9IGlwaDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpcG9pYl9scm9fc2V0dXAoc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2KQotewotCXByaXYtPmxyby5scm9fbWdyLm1heF9hZ2dyCSA9IGxyb19tYXhfYWdncjsKLQlwcml2LT5scm8ubHJvX21nci5tYXhfZGVzYwkgPSBJUE9JQl9NQVhfTFJPX0RFU0NSSVBUT1JTOwotCXByaXYtPmxyby5scm9fbWdyLmxyb19hcnIJID0gcHJpdi0+bHJvLmxyb19kZXNjOwotCXByaXYtPmxyby5scm9fbWdyLmdldF9za2JfaGVhZGVyID0gZ2V0X3NrYl9oZHI7Ci0JcHJpdi0+bHJvLmxyb19tZ3IuZmVhdHVyZXMJID0gTFJPX0ZfTkFQSTsKLQlwcml2LT5scm8ubHJvX21nci5kZXYJCSA9IHByaXYtPmRldjsKLQlwcml2LT5scm8ubHJvX21nci5pcF9zdW1tZWRfYWdnciA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlwb2liX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQkgPSBpcG9pYl9vcGVuLAogCS5uZG9fc3RvcAkJID0gaXBvaWJfc3RvcCwKQEAgLTEwNjcsOCArMTAxMCw2IEBACiAKIAlwcml2LT5kZXYgPSBkZXY7CiAKLQlpcG9pYl9scm9fc2V0dXAocHJpdik7Ci0KIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CiAKIAltdXRleF9pbml0KCZwcml2LT52bGFuX211dGV4KTsKQEAgLTEyMTgsOCArMTE1OSw3IEBACiAJCXByaXYtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKIAl9CiAKLQlpZiAobHJvKQotCQlwcml2LT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOworCXByaXYtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CiAKIAlpZiAocHJpdi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cgJiYgcHJpdi0+aGNhX2NhcHMgJiBJQl9ERVZJQ0VfVURfVFNPKQogCQlwcml2LT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwppbmRleCAxZTFlMzQ3Li40YjYyMTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuYwpAQCAtNDQxLDE4ICs0NDEsMjggQEAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXJnZXQtPmRvbmUpOwogfQogCitzdGF0aWMgYm9vbCBzcnBfY2hhbmdlX3N0YXRlKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKKwkJCSAgICBlbnVtIHNycF90YXJnZXRfc3RhdGUgb2xkLAorCQkJICAgIGVudW0gc3JwX3RhcmdldF9zdGF0ZSBuZXcpCit7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxKCZ0YXJnZXQtPmxvY2spOworCWlmICh0YXJnZXQtPnN0YXRlID09IG9sZCkgeworCQl0YXJnZXQtPnN0YXRlID0gbmV3OworCQljaGFuZ2VkID0gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0YXJnZXQtPmxvY2spOworCXJldHVybiBjaGFuZ2VkOworfQorCiBzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0LCB3b3JrKTsKIAotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0JaWYgKHRhcmdldC0+c3RhdGUgIT0gU1JQX1RBUkdFVF9ERUFEKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKKwlpZiAoIXNycF9jaGFuZ2Vfc3RhdGUodGFyZ2V0LCBTUlBfVEFSR0VUX0RFQUQsIFNSUF9UQVJHRVRfUkVNT1ZFRCkpCiAJCXJldHVybjsKLQl9Ci0JdGFyZ2V0LT5zdGF0ZSA9IFNSUF9UQVJHRVRfUkVNT1ZFRDsKLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CiAKIAlzcGluX2xvY2soJnRhcmdldC0+c3JwX2hvc3QtPnRhcmdldF9sb2NrKTsKIAlsaXN0X2RlbCgmdGFyZ2V0LT5saXN0KTsKQEAgLTUzOSwzMyArNTQ5LDM0IEBACiAJCQlzY3NpX3NnX2NvdW50KHNjbW5kKSwgc2NtbmQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKIH0KIAotc3RhdGljIHZvaWQgc3JwX3JlbW92ZV9yZXEoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LCBzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIHNycF9yZW1vdmVfcmVxKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKKwkJCSAgIHN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxLCBzMzIgcmVxX2xpbV9kZWx0YSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJc3JwX3VubWFwX2RhdGEocmVxLT5zY21uZCwgdGFyZ2V0LCByZXEpOwotCWxpc3RfbW92ZV90YWlsKCZyZXEtPmxpc3QsICZ0YXJnZXQtPmZyZWVfcmVxcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCXRhcmdldC0+cmVxX2xpbSArPSByZXFfbGltX2RlbHRhOworCXJlcS0+c2NtbmQgPSBOVUxMOworCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnRhcmdldC0+ZnJlZV9yZXFzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc3JwX3Jlc2V0X3JlcShzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsIHN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxKQogewogCXJlcS0+c2NtbmQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKIAlyZXEtPnNjbW5kLT5zY3NpX2RvbmUocmVxLT5zY21uZCk7Ci0Jc3JwX3JlbW92ZV9yZXEodGFyZ2V0LCByZXEpOworCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxLCAwKTsKIH0KIAogc3RhdGljIGludCBzcnBfcmVjb25uZWN0X3RhcmdldChzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQpCiB7CiAJc3RydWN0IGliX3FwX2F0dHIgcXBfYXR0cjsKLQlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSwgKnRtcDsKIAlzdHJ1Y3QgaWJfd2Mgd2M7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQlpZiAodGFyZ2V0LT5zdGF0ZSAhPSBTUlBfVEFSR0VUX0xJVkUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCWlmICghc3JwX2NoYW5nZV9zdGF0ZSh0YXJnZXQsIFNSUF9UQVJHRVRfTElWRSwgU1JQX1RBUkdFVF9DT05ORUNUSU5HKSkKIAkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCXRhcmdldC0+c3RhdGUgPSBTUlBfVEFSR0VUX0NPTk5FQ1RJTkc7Ci0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwogCiAJc3JwX2Rpc2Nvbm5lY3RfdGFyZ2V0KHRhcmdldCk7CiAJLyoKQEAgLTU5MCwyNyArNjAxLDIzIEBACiAJd2hpbGUgKGliX3BvbGxfY3EodGFyZ2V0LT5zZW5kX2NxLCAxLCAmd2MpID4gMCkKIAkJOyAvKiBub3RoaW5nICovCiAKLQlzcGluX2xvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJnRhcmdldC0+cmVxX3F1ZXVlLCBsaXN0KQotCQlzcnBfcmVzZXRfcmVxKHRhcmdldCwgcmVxKTsKLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IFNSUF9DTURfU1FfU0laRTsgKytpKSB7CisJCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxID0gJnRhcmdldC0+cmVxX3JpbmdbaV07CisJCWlmIChyZXEtPnNjbW5kKQorCQkJc3JwX3Jlc2V0X3JlcSh0YXJnZXQsIHJlcSk7CisJfQogCi0JdGFyZ2V0LT5yeF9oZWFkCSA9IDA7Ci0JdGFyZ2V0LT50eF9oZWFkCSA9IDA7Ci0JdGFyZ2V0LT50eF90YWlsICA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZnJlZV90eCk7CisJZm9yIChpID0gMDsgaSA8IFNSUF9TUV9TSVpFOyArK2kpCisJCWxpc3RfYWRkKCZ0YXJnZXQtPnR4X3JpbmdbaV0tPmxpc3QsICZ0YXJnZXQtPmZyZWVfdHgpOwogCiAJdGFyZ2V0LT5xcF9pbl9lcnJvciA9IDA7CiAJcmV0ID0gc3JwX2Nvbm5lY3RfdGFyZ2V0KHRhcmdldCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKLQlzcGluX2xvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwotCWlmICh0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfQ09OTkVDVElORykgewotCQlyZXQgPSAwOwotCQl0YXJnZXQtPnN0YXRlID0gU1JQX1RBUkdFVF9MSVZFOwotCX0gZWxzZQorCWlmICghc3JwX2NoYW5nZV9zdGF0ZSh0YXJnZXQsIFNSUF9UQVJHRVRfQ09OTkVDVElORywgU1JQX1RBUkdFVF9MSVZFKSkKIAkJcmV0ID0gLUVBR0FJTjsKLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC02MjAsMTcgKzYyNywyMCBAQAogCiAJLyoKIAkgKiBXZSBjb3VsZG4ndCByZWNvbm5lY3QsIHNvIGtpbGwgb3VyIHRhcmdldCBwb3J0IG9mZi4KLQkgKiBIb3dldmVyLCB3ZSBoYXZlIHRvIGRlZmVyIHRoZSByZWFsIHJlbW92YWwgYmVjYXVzZSB3ZSBtaWdodAotCSAqIGJlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBTQ1NJIGVycm9yIGhhbmRsZXIgbm93LCB3aGljaAotCSAqIHdvdWxkIGRlYWRsb2NrIGlmIHdlIGNhbGwgc2NzaV9yZW1vdmVfaG9zdCgpLgorCSAqIEhvd2V2ZXIsIHdlIGhhdmUgdG8gZGVmZXIgdGhlIHJlYWwgcmVtb3ZhbCBiZWNhdXNlIHdlCisJICogYXJlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBTQ1NJIGVycm9yIGhhbmRsZXIgbm93LCB3aGljaAorCSAqIHdpbGwgZGVhZGxvY2sgaWYgd2UgY2FsbCBzY3NpX3JlbW92ZV9ob3N0KCkuCisJICoKKwkgKiBTY2hlZHVsZSBvdXIgd29yayBpbnNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgYSByYWNlIHdpdGgKKwkgKiB0aGUgZmx1c2hfc2NoZWR1bGVkX3dvcmsoKSBpbiBzcnBfcmVtb3ZlX29uZSgpLgogCSAqLwotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKIAlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX0NPTk5FQ1RJTkcpIHsKIAkJdGFyZ2V0LT5zdGF0ZSA9IFNSUF9UQVJHRVRfREVBRDsKIAkJSU5JVF9XT1JLKCZ0YXJnZXQtPndvcmssIHNycF9yZW1vdmVfd29yayk7CiAJCXNjaGVkdWxlX3dvcmsoJnRhcmdldC0+d29yayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRhcmdldC0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzU4LDcgKzc2OCw3IEBACiAJCXN0cnVjdCBzcnBfZGlyZWN0X2J1ZiAqYnVmID0gKHZvaWQgKikgY21kLT5hZGRfZGF0YTsKIAogCQlidWYtPnZhICA9IGNwdV90b19iZTY0KGliX3NnX2RtYV9hZGRyZXNzKGliZGV2LCBzY2F0KSk7Ci0JCWJ1Zi0+a2V5ID0gY3B1X3RvX2JlMzIoZGV2LT5tci0+cmtleSk7CisJCWJ1Zi0+a2V5ID0gY3B1X3RvX2JlMzIodGFyZ2V0LT5ya2V5KTsKIAkJYnVmLT5sZW4gPSBjcHVfdG9fYmUzMihpYl9zZ19kbWFfbGVuKGliZGV2LCBzY2F0KSk7CiAJfSBlbHNlIGlmIChzcnBfbWFwX2Ztcih0YXJnZXQsIHNjYXQsIGNvdW50LCByZXEsCiAJCQkgICAgICAgKHZvaWQgKikgY21kLT5hZGRfZGF0YSkpIHsKQEAgLTc4Myw3ICs3OTMsNyBAQAogCQkJYnVmLT5kZXNjX2xpc3RbaV0udmEgID0KIAkJCQljcHVfdG9fYmU2NChpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgc2cpKTsKIAkJCWJ1Zi0+ZGVzY19saXN0W2ldLmtleSA9Ci0JCQkJY3B1X3RvX2JlMzIoZGV2LT5tci0+cmtleSk7CisJCQkJY3B1X3RvX2JlMzIodGFyZ2V0LT5ya2V5KTsKIAkJCWJ1Zi0+ZGVzY19saXN0W2ldLmxlbiA9IGNwdV90b19iZTMyKGRtYV9sZW4pOwogCQkJZGF0YWxlbiArPSBkbWFfbGVuOwogCQl9CkBAIC03OTYsNyArODA2LDcgQEAKIAkJYnVmLT50YWJsZV9kZXNjLnZhICA9CiAJCQljcHVfdG9fYmU2NChyZXEtPmNtZC0+ZG1hICsgc2l6ZW9mICpjbWQgKyBzaXplb2YgKmJ1Zik7CiAJCWJ1Zi0+dGFibGVfZGVzYy5rZXkgPQotCQkJY3B1X3RvX2JlMzIodGFyZ2V0LT5zcnBfaG9zdC0+c3JwX2Rldi0+bXItPnJrZXkpOworCQkJY3B1X3RvX2JlMzIodGFyZ2V0LT5ya2V5KTsKIAkJYnVmLT50YWJsZV9kZXNjLmxlbiA9CiAJCQljcHVfdG9fYmUzMihjb3VudCAqIHNpemVvZiAoc3RydWN0IHNycF9kaXJlY3RfYnVmKSk7CiAKQEAgLTgxMiw5ICs4MjIsMjMgQEAKIH0KIAogLyoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayBoZWxkIHRvIHByb3RlY3QKLSAqIHJlcV9saW0gYW5kIHR4X2hlYWQuICBMb2NrIGNhbm5vdCBiZSBkcm9wcGVkIGJldHdlZW4gY2FsbCBoZXJlIGFuZAotICogY2FsbCB0byBfX3NycF9wb3N0X3NlbmQoKS4KKyAqIFJldHVybiBhbiBJVSBhbmQgcG9zc2libGUgY3JlZGl0IHRvIHRoZSBmcmVlIHBvb2wKKyAqLworc3RhdGljIHZvaWQgc3JwX3B1dF90eF9pdShzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsIHN0cnVjdCBzcnBfaXUgKml1LAorCQkJICBlbnVtIHNycF9pdV90eXBlIGl1X3R5cGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmaXUtPmxpc3QsICZ0YXJnZXQtPmZyZWVfdHgpOworCWlmIChpdV90eXBlICE9IFNSUF9JVV9SU1ApCisJCSsrdGFyZ2V0LT5yZXFfbGltOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0YXJnZXQtPmxvY2sgaGVsZCB0byBwcm90ZWN0IHJlcV9saW0gYW5kIGZyZWVfdHguCisgKiBJZiBJVSBpcyBub3Qgc2VudCwgaXQgbXVzdCBiZSByZXR1cm5lZCB1c2luZyBzcnBfcHV0X3R4X2l1KCkuCiAgKgogICogTm90ZToKICAqIEFuIHVwcGVyIGxpbWl0IGZvciB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBpbmZvcm1hdGlvbiB1bml0cyBmb3IgZWFjaApAQCAtODMzLDgzICs4NTcsNTkgQEAKIAogCXNycF9zZW5kX2NvbXBsZXRpb24odGFyZ2V0LT5zZW5kX2NxLCB0YXJnZXQpOwogCi0JaWYgKHRhcmdldC0+dHhfaGVhZCAtIHRhcmdldC0+dHhfdGFpbCA+PSBTUlBfU1FfU0laRSkKKwlpZiAobGlzdF9lbXB0eSgmdGFyZ2V0LT5mcmVlX3R4KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBJbml0aWF0b3IgcmVzcG9uc2VzIHRvIHRhcmdldCByZXF1ZXN0cyBkbyBub3QgY29uc3VtZSBjcmVkaXRzICovCi0JaWYgKHRhcmdldC0+cmVxX2xpbSA8PSByc3YgJiYgaXVfdHlwZSAhPSBTUlBfSVVfUlNQKSB7Ci0JCSsrdGFyZ2V0LT56ZXJvX3JlcV9saW07Ci0JCXJldHVybiBOVUxMOworCWlmIChpdV90eXBlICE9IFNSUF9JVV9SU1ApIHsKKwkJaWYgKHRhcmdldC0+cmVxX2xpbSA8PSByc3YpIHsKKwkJCSsrdGFyZ2V0LT56ZXJvX3JlcV9saW07CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCS0tdGFyZ2V0LT5yZXFfbGltOwogCX0KIAotCWl1ID0gdGFyZ2V0LT50eF9yaW5nW3RhcmdldC0+dHhfaGVhZCAmIFNSUF9TUV9NQVNLXTsKLQlpdS0+dHlwZSA9IGl1X3R5cGU7CisJaXUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0YXJnZXQtPmZyZWVfdHgsIHN0cnVjdCBzcnBfaXUsIGxpc3QpOworCWxpc3RfZGVsKCZpdS0+bGlzdCk7CiAJcmV0dXJuIGl1OwogfQogCi0vKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrIGhlbGQgdG8gcHJvdGVjdAotICogcmVxX2xpbSBhbmQgdHhfaGVhZC4KLSAqLwotc3RhdGljIGludCBfX3NycF9wb3N0X3NlbmQoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LAotCQkJICAgc3RydWN0IHNycF9pdSAqaXUsIGludCBsZW4pCitzdGF0aWMgaW50IHNycF9wb3N0X3NlbmQoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LAorCQkJIHN0cnVjdCBzcnBfaXUgKml1LCBpbnQgbGVuKQogewogCXN0cnVjdCBpYl9zZ2UgbGlzdDsKIAlzdHJ1Y3QgaWJfc2VuZF93ciB3ciwgKmJhZF93cjsKLQlpbnQgcmV0ID0gMDsKIAogCWxpc3QuYWRkciAgID0gaXUtPmRtYTsKIAlsaXN0Lmxlbmd0aCA9IGxlbjsKLQlsaXN0LmxrZXkgICA9IHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPm1yLT5sa2V5OworCWxpc3QubGtleSAgID0gdGFyZ2V0LT5sa2V5OwogCiAJd3IubmV4dCAgICAgICA9IE5VTEw7Ci0Jd3Iud3JfaWQgICAgICA9IHRhcmdldC0+dHhfaGVhZCAmIFNSUF9TUV9NQVNLOworCXdyLndyX2lkICAgICAgPSAodWludHB0cl90KSBpdTsKIAl3ci5zZ19saXN0ICAgID0gJmxpc3Q7CiAJd3IubnVtX3NnZSAgICA9IDE7CiAJd3Iub3Bjb2RlICAgICA9IElCX1dSX1NFTkQ7CiAJd3Iuc2VuZF9mbGFncyA9IElCX1NFTkRfU0lHTkFMRUQ7CiAKLQlyZXQgPSBpYl9wb3N0X3NlbmQodGFyZ2V0LT5xcCwgJndyLCAmYmFkX3dyKTsKLQotCWlmICghcmV0KSB7Ci0JCSsrdGFyZ2V0LT50eF9oZWFkOwotCQlpZiAoaXUtPnR5cGUgIT0gU1JQX0lVX1JTUCkKLQkJCS0tdGFyZ2V0LT5yZXFfbGltOwotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGliX3Bvc3Rfc2VuZCh0YXJnZXQtPnFwLCAmd3IsICZiYWRfd3IpOwogfQogCi1zdGF0aWMgaW50IHNycF9wb3N0X3JlY3Yoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0KQorc3RhdGljIGludCBzcnBfcG9zdF9yZWN2KHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgc3RydWN0IHNycF9pdSAqaXUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3JwX2l1ICppdTsKLQlzdHJ1Y3QgaWJfc2dlIGxpc3Q7CiAJc3RydWN0IGliX3JlY3Zfd3Igd3IsICpiYWRfd3I7Ci0JdW5zaWduZWQgaW50IG5leHQ7Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCW5leHQJID0gdGFyZ2V0LT5yeF9oZWFkICYgU1JQX1JRX01BU0s7Ci0Jd3Iud3JfaWQgPSBuZXh0OwotCWl1CSA9IHRhcmdldC0+cnhfcmluZ1tuZXh0XTsKKwlzdHJ1Y3QgaWJfc2dlIGxpc3Q7CiAKIAlsaXN0LmFkZHIgICA9IGl1LT5kbWE7CiAJbGlzdC5sZW5ndGggPSBpdS0+c2l6ZTsKLQlsaXN0LmxrZXkgICA9IHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPm1yLT5sa2V5OworCWxpc3QubGtleSAgID0gdGFyZ2V0LT5sa2V5OwogCiAJd3IubmV4dCAgICAgPSBOVUxMOworCXdyLndyX2lkICAgID0gKHVpbnRwdHJfdCkgaXU7CiAJd3Iuc2dfbGlzdCAgPSAmbGlzdDsKIAl3ci5udW1fc2dlICA9IDE7CiAKLQlyZXQgPSBpYl9wb3N0X3JlY3YodGFyZ2V0LT5xcCwgJndyLCAmYmFkX3dyKTsKLQlpZiAoIXJldCkKLQkJKyt0YXJnZXQtPnJ4X2hlYWQ7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGliX3Bvc3RfcmVjdih0YXJnZXQtPnFwLCAmd3IsICZiYWRfd3IpOwogfQogCiBzdGF0aWMgdm9pZCBzcnBfcHJvY2Vzc19yc3Aoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LCBzdHJ1Y3Qgc3JwX3JzcCAqcnNwKQpAQCAtOTE3LDIzICs5MTcsMTggQEAKIAlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21uZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXMzMiBkZWx0YTsKLQotCWRlbHRhID0gKHMzMikgYmUzMl90b19jcHUocnNwLT5yZXFfbGltX2RlbHRhKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCXRhcmdldC0+cmVxX2xpbSArPSBkZWx0YTsKLQotCXJlcSA9ICZ0YXJnZXQtPnJlcV9yaW5nW3JzcC0+dGFnICYgflNSUF9UQUdfVFNLX01HTVRdOwogCiAJaWYgKHVubGlrZWx5KHJzcC0+dGFnICYgU1JQX1RBR19UU0tfTUdNVCkpIHsKLQkJaWYgKGJlMzJfdG9fY3B1KHJzcC0+cmVzcF9kYXRhX2xlbikgPCA0KQotCQkJcmVxLT50c2tfc3RhdHVzID0gLTE7Ci0JCWVsc2UKLQkJCXJlcS0+dHNrX3N0YXR1cyA9IHJzcC0+ZGF0YVszXTsKLQkJY29tcGxldGUoJnJlcS0+ZG9uZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwkJdGFyZ2V0LT5yZXFfbGltICs9IGJlMzJfdG9fY3B1KHJzcC0+cmVxX2xpbV9kZWx0YSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCisJCXRhcmdldC0+dHNrX21nbXRfc3RhdHVzID0gLTE7CisJCWlmIChiZTMyX3RvX2NwdShyc3AtPnJlc3BfZGF0YV9sZW4pID49IDQpCisJCQl0YXJnZXQtPnRza19tZ210X3N0YXR1cyA9IHJzcC0+ZGF0YVszXTsKKwkJY29tcGxldGUoJnRhcmdldC0+dHNrX21nbXRfZG9uZSk7CiAJfSBlbHNlIHsKKwkJcmVxID0gJnRhcmdldC0+cmVxX3JpbmdbcnNwLT50YWddOwogCQlzY21uZCA9IHJlcS0+c2NtbmQ7CiAJCWlmICghc2NtbmQpCiAJCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHRhcmdldC0+c2NzaV9ob3N0LApAQCAtOTUzLDQ5ICs5NDgsNDIgQEAKIAkJZWxzZSBpZiAocnNwLT5mbGFncyAmIChTUlBfUlNQX0ZMQUdfRElPVkVSIHwgU1JQX1JTUF9GTEFHX0RJVU5ERVIpKQogCQkJc2NzaV9zZXRfcmVzaWQoc2NtbmQsIGJlMzJfdG9fY3B1KHJzcC0+ZGF0YV9pbl9yZXNfY250KSk7CiAKLQkJaWYgKCFyZXEtPnRza19tZ210KSB7Ci0JCQlzY21uZC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopIC0xTDsKLQkJCXNjbW5kLT5zY3NpX2RvbmUoc2NtbmQpOwotCi0JCQlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSk7Ci0JCX0gZWxzZQotCQkJcmVxLT5jbWRfZG9uZSA9IDE7CisJCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxLCBiZTMyX3RvX2NwdShyc3AtPnJlcV9saW1fZGVsdGEpKTsKKwkJc2NtbmQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOworCQlzY21uZC0+c2NzaV9kb25lKHNjbW5kKTsKIAl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzcnBfcmVzcG9uc2VfY29tbW9uKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgczMyIHJlcV9kZWx0YSwKIAkJCSAgICAgICB2b2lkICpyc3AsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2OworCXN0cnVjdCBpYl9kZXZpY2UgKmRldiA9IHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzcnBfaXUgKml1OwotCWludCBlcnIgPSAxOworCWludCBlcnI7CiAKLQlkZXYgPSB0YXJnZXQtPnNycF9ob3N0LT5zcnBfZGV2LT5kZXY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOwogCXRhcmdldC0+cmVxX2xpbSArPSByZXFfZGVsdGE7Ci0KIAlpdSA9IF9fc3JwX2dldF90eF9pdSh0YXJnZXQsIFNSUF9JVV9SU1ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCiAJaWYgKCFpdSkgewogCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHRhcmdldC0+c2NzaV9ob3N0LCBQRlgKIAkJCSAgICAgIm5vIElVIGF2YWlsYWJsZSB0byBzZW5kIHJlc3BvbnNlXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAxOwogCX0KIAogCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgaXUtPmRtYSwgbGVuLCBETUFfVE9fREVWSUNFKTsKIAltZW1jcHkoaXUtPmJ1ZiwgcnNwLCBsZW4pOwogCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgaXUtPmRtYSwgbGVuLCBETUFfVE9fREVWSUNFKTsKIAotCWVyciA9IF9fc3JwX3Bvc3Rfc2VuZCh0YXJnZXQsIGl1LCBsZW4pOwotCWlmIChlcnIpCisJZXJyID0gc3JwX3Bvc3Rfc2VuZCh0YXJnZXQsIGl1LCBsZW4pOworCWlmIChlcnIpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwgUEZYCiAJCQkgICAgICJ1bmFibGUgdG8gcG9zdCByZXNwb25zZTogJWRcbiIsIGVycik7CisJCXNycF9wdXRfdHhfaXUodGFyZ2V0LCBpdSwgU1JQX0lVX1JTUCk7CisJfQogCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTAzMiwxNCArMTAyMCwxMSBAQAogCiBzdGF0aWMgdm9pZCBzcnBfaGFuZGxlX3JlY3Yoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LCBzdHJ1Y3QgaWJfd2MgKndjKQogewotCXN0cnVjdCBpYl9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3JwX2l1ICppdTsKKwlzdHJ1Y3QgaWJfZGV2aWNlICpkZXYgPSB0YXJnZXQtPnNycF9ob3N0LT5zcnBfZGV2LT5kZXY7CisJc3RydWN0IHNycF9pdSAqaXUgPSAoc3RydWN0IHNycF9pdSAqKSB3Yy0+d3JfaWQ7CiAJaW50IHJlczsKIAl1OCBvcGNvZGU7CiAKLQlpdSA9IHRhcmdldC0+cnhfcmluZ1t3Yy0+d3JfaWRdOwotCi0JZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+c3JwX2Rldi0+ZGV2OwogCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgaXUtPmRtYSwgdGFyZ2V0LT5tYXhfdGlfaXVfbGVuLAogCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7CiAKQEAgLTEwODAsNyArMTA2NSw3IEBACiAJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBpdS0+ZG1hLCB0YXJnZXQtPm1heF90aV9pdV9sZW4sCiAJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKIAotCXJlcyA9IHNycF9wb3N0X3JlY3YodGFyZ2V0KTsKKwlyZXMgPSBzcnBfcG9zdF9yZWN2KHRhcmdldCwgaXUpOwogCWlmIChyZXMgIT0gMCkKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwKIAkJCSAgICAgUEZYICJSZWN2IGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIsIHJlcyk7CkBAIC0xMTA5LDYgKzEwOTQsNyBAQAogewogCXN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCA9IHRhcmdldF9wdHI7CiAJc3RydWN0IGliX3djIHdjOworCXN0cnVjdCBzcnBfaXUgKml1OwogCiAJd2hpbGUgKGliX3BvbGxfY3EoY3EsIDEsICZ3YykgPiAwKSB7CiAJCWlmICh3Yy5zdGF0dXMpIHsKQEAgLTExMTksMTggKzExMDUsMTkgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJKyt0YXJnZXQtPnR4X3RhaWw7CisJCWl1ID0gKHN0cnVjdCBzcnBfaXUgKikgd2Mud3JfaWQ7CisJCWxpc3RfYWRkKCZpdS0+bGlzdCwgJnRhcmdldC0+ZnJlZV90eCk7CiAJfQogfQogCi1zdGF0aWMgaW50IHNycF9xdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKnNjbW5kLAotCQkJICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQorc3RhdGljIGludCBzcnBfcXVldWVjb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21uZCkKIHsKLQlzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQgPSBob3N0X3RvX3RhcmdldChzY21uZC0+ZGV2aWNlLT5ob3N0KTsKKwlzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQgPSBob3N0X3RvX3RhcmdldChzaG9zdCk7CiAJc3RydWN0IHNycF9yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IHNycF9pdSAqaXU7CiAJc3RydWN0IHNycF9jbWQgKmNtZDsKIAlzdHJ1Y3QgaWJfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbGVuOwogCiAJaWYgKHRhcmdldC0+c3RhdGUgPT0gU1JQX1RBUkdFVF9DT05ORUNUSU5HKQpAQCAtMTEzOSwxMSArMTEyNiwxOSBAQAogCWlmICh0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfREVBRCB8fAogCSAgICB0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfUkVNT1ZFRCkgewogCQlzY21uZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7Ci0JCWRvbmUoc2NtbmQpOworCQlzY21uZC0+c2NzaV9kb25lKHNjbW5kKTsKIAkJcmV0dXJuIDA7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOwogCWl1ID0gX19zcnBfZ2V0X3R4X2l1KHRhcmdldCwgU1JQX0lVX0NNRCk7CisJaWYgKGl1KSB7CisJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJnRhcmdldC0+ZnJlZV9yZXFzLCBzdHJ1Y3Qgc3JwX3JlcXVlc3QsCisJCQkJICAgICAgbGlzdCk7CisJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwogCWlmICghaXUpCiAJCWdvdG8gZXJyOwogCkBAIC0xMTUxLDExICsxMTQ2LDggQEAKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGl1LT5kbWEsIHNycF9tYXhfaXVfbGVuLAogCQkJCSAgIERNQV9UT19ERVZJQ0UpOwogCi0JcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmdGFyZ2V0LT5mcmVlX3JlcXMsIHN0cnVjdCBzcnBfcmVxdWVzdCwgbGlzdCk7Ci0KLQlzY21uZC0+c2NzaV9kb25lICAgICA9IGRvbmU7CiAJc2NtbmQtPnJlc3VsdCAgICAgICAgPSAwOwotCXNjbW5kLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgKGxvbmcpIHJlcS0+aW5kZXg7CisJc2NtbmQtPmhvc3Rfc2NyaWJibGUgPSAodm9pZCAqKSByZXE7CiAKIAljbWQgPSBpdS0+YnVmOwogCW1lbXNldChjbWQsIDAsIHNpemVvZiAqY21kKTsKQEAgLTExNjcsMzcgKzExNTksMzggQEAKIAogCXJlcS0+c2NtbmQgICAgPSBzY21uZDsKIAlyZXEtPmNtZCAgICAgID0gaXU7Ci0JcmVxLT5jbWRfZG9uZSA9IDA7Ci0JcmVxLT50c2tfbWdtdCA9IE5VTEw7CiAKIAlsZW4gPSBzcnBfbWFwX2RhdGEoc2NtbmQsIHRhcmdldCwgcmVxKTsKIAlpZiAobGVuIDwgMCkgewogCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHRhcmdldC0+c2NzaV9ob3N0LAogCQkJICAgICBQRlggIkZhaWxlZCB0byBtYXAgZGF0YVxuIik7Ci0JCWdvdG8gZXJyOworCQlnb3RvIGVycl9pdTsKIAl9CiAKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGl1LT5kbWEsIHNycF9tYXhfaXVfbGVuLAogCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOwogCi0JaWYgKF9fc3JwX3Bvc3Rfc2VuZCh0YXJnZXQsIGl1LCBsZW4pKSB7CisJaWYgKHNycF9wb3N0X3NlbmQodGFyZ2V0LCBpdSwgbGVuKSkgewogCQlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHRhcmdldC0+c2NzaV9ob3N0LCBQRlggIlNlbmQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfdW5tYXA7CiAJfQogCi0JbGlzdF9tb3ZlX3RhaWwoJnJlcS0+bGlzdCwgJnRhcmdldC0+cmVxX3F1ZXVlKTsKLQogCXJldHVybiAwOwogCiBlcnJfdW5tYXA6CiAJc3JwX3VubWFwX2RhdGEoc2NtbmQsIHRhcmdldCwgcmVxKTsKIAorZXJyX2l1OgorCXNycF9wdXRfdHhfaXUodGFyZ2V0LCBpdSwgU1JQX0lVX0NNRCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJnRhcmdldC0+ZnJlZV9yZXFzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwogZXJyOgogCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwogfQogCi1zdGF0aWMgREVGX1NDU0lfUUNNRChzcnBfcXVldWVjb21tYW5kKQotCiBzdGF0aWMgaW50IHNycF9hbGxvY19pdV9idWZzKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCkKIHsKIAlpbnQgaTsKQEAgLTEyMTYsNiArMTIwOSw4IEBACiAJCQkJCQkgIEdGUF9LRVJORUwsIERNQV9UT19ERVZJQ0UpOwogCQlpZiAoIXRhcmdldC0+dHhfcmluZ1tpXSkKIAkJCWdvdG8gZXJyOworCisJCWxpc3RfYWRkKCZ0YXJnZXQtPnR4X3JpbmdbaV0tPmxpc3QsICZ0YXJnZXQtPmZyZWVfdHgpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTM3Nyw3ICsxMzcyLDggQEAKIAkJCWJyZWFrOwogCiAJCWZvciAoaSA9IDA7IGkgPCBTUlBfUlFfU0laRTsgaSsrKSB7Ci0JCQl0YXJnZXQtPnN0YXR1cyA9IHNycF9wb3N0X3JlY3YodGFyZ2V0KTsKKwkJCXN0cnVjdCBzcnBfaXUgKml1ID0gdGFyZ2V0LT5yeF9yaW5nW2ldOworCQkJdGFyZ2V0LT5zdGF0dXMgPSBzcnBfcG9zdF9yZWN2KHRhcmdldCwgaXUpOwogCQkJaWYgKHRhcmdldC0+c3RhdHVzKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xNDQyLDI1ICsxNDM4LDI0IEBACiB9CiAKIHN0YXRpYyBpbnQgc3JwX3NlbmRfdHNrX21nbXQoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LAotCQkJICAgICBzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSwgdTggZnVuYykKKwkJCSAgICAgdTY0IHJlcV90YWcsIHVuc2lnbmVkIGludCBsdW4sIHU4IGZ1bmMpCiB7CiAJc3RydWN0IGliX2RldmljZSAqZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+c3JwX2Rldi0+ZGV2OwogCXN0cnVjdCBzcnBfaXUgKml1OwogCXN0cnVjdCBzcnBfdHNrX21nbXQgKnRza19tZ210OwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQogCWlmICh0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfREVBRCB8fAotCSAgICB0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfUkVNT1ZFRCkgewotCQlyZXEtPnNjbW5kLT5yZXN1bHQgPSBESURfQkFEX1RBUkdFVCA8PCAxNjsKLQkJZ290byBvdXQ7Ci0JfQorCSAgICB0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfUkVNT1ZFRCkKKwkJcmV0dXJuIC0xOwogCi0JaW5pdF9jb21wbGV0aW9uKCZyZXEtPmRvbmUpOworCWluaXRfY29tcGxldGlvbigmdGFyZ2V0LT50c2tfbWdtdF9kb25lKTsKIAorCXNwaW5fbG9ja19pcnEoJnRhcmdldC0+bG9jayk7CiAJaXUgPSBfX3NycF9nZXRfdHhfaXUodGFyZ2V0LCBTUlBfSVVfVFNLX01HTVQpOworCXNwaW5fdW5sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKKwogCWlmICghaXUpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLTE7CiAKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGl1LT5kbWEsIHNpemVvZiAqdHNrX21nbXQsCiAJCQkJICAgRE1BX1RPX0RFVklDRSk7CkBAIC0xNDY4LDcwICsxNDYzLDQ2IEBACiAJbWVtc2V0KHRza19tZ210LCAwLCBzaXplb2YgKnRza19tZ210KTsKIAogCXRza19tZ210LT5vcGNvZGUgCT0gU1JQX1RTS19NR01UOwotCXRza19tZ210LT5sdW4gCQk9IGNwdV90b19iZTY0KCh1NjQpIHJlcS0+c2NtbmQtPmRldmljZS0+bHVuIDw8IDQ4KTsKLQl0c2tfbWdtdC0+dGFnIAkJPSByZXEtPmluZGV4IHwgU1JQX1RBR19UU0tfTUdNVDsKKwl0c2tfbWdtdC0+bHVuCQk9IGNwdV90b19iZTY0KCh1NjQpIGx1biA8PCA0OCk7CisJdHNrX21nbXQtPnRhZwkJPSByZXFfdGFnIHwgU1JQX1RBR19UU0tfTUdNVDsKIAl0c2tfbWdtdC0+dHNrX21nbXRfZnVuYyA9IGZ1bmM7Ci0JdHNrX21nbXQtPnRhc2tfdGFnIAk9IHJlcS0+aW5kZXg7CisJdHNrX21nbXQtPnRhc2tfdGFnCT0gcmVxX3RhZzsKIAogCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgaXUtPmRtYSwgc2l6ZW9mICp0c2tfbWdtdCwKIAkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKLQlpZiAoX19zcnBfcG9zdF9zZW5kKHRhcmdldCwgaXUsIHNpemVvZiAqdHNrX21nbXQpKQotCQlnb3RvIG91dDsKKwlpZiAoc3JwX3Bvc3Rfc2VuZCh0YXJnZXQsIGl1LCBzaXplb2YgKnRza19tZ210KSkgeworCQlzcnBfcHV0X3R4X2l1KHRhcmdldCwgaXUsIFNSUF9JVV9UU0tfTUdNVCk7CisJCXJldHVybiAtMTsKKwl9CiAKLQlyZXEtPnRza19tZ210ID0gaXU7Ci0KLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0KLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxLT5kb25lLAorCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0YXJnZXQtPnRza19tZ210X2RvbmUsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKFNSUF9BQk9SVF9USU1FT1VUX01TKSkpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBzcnBfZmluZF9yZXEoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LAotCQkJc3RydWN0IHNjc2lfY21uZCAqc2NtbmQsCi0JCQlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKipyZXEpCi17Ci0JaWYgKHNjbW5kLT5ob3N0X3NjcmliYmxlID09ICh2b2lkICopIC0xTCkKLQkJcmV0dXJuIC0xOwotCi0JKnJlcSA9ICZ0YXJnZXQtPnJlcV9yaW5nWyhsb25nKSBzY21uZC0+aG9zdF9zY3JpYmJsZV07Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzcnBfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc2NtbmQpCiB7CiAJc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0ID0gaG9zdF90b190YXJnZXQoc2NtbmQtPmRldmljZS0+aG9zdCk7Ci0Jc3RydWN0IHNycF9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IHNycF9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHNycF9yZXF1ZXN0ICopIHNjbW5kLT5ob3N0X3NjcmliYmxlOwogCWludCByZXQgPSBTVUNDRVNTOwogCiAJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwgIlNSUCBhYm9ydCBjYWxsZWRcbiIpOwogCi0JaWYgKHRhcmdldC0+cXBfaW5fZXJyb3IpCisJaWYgKCFyZXEgfHwgdGFyZ2V0LT5xcF9pbl9lcnJvcikKIAkJcmV0dXJuIEZBSUxFRDsKLQlpZiAoc3JwX2ZpbmRfcmVxKHRhcmdldCwgc2NtbmQsICZyZXEpKQotCQlyZXR1cm4gRkFJTEVEOwotCWlmIChzcnBfc2VuZF90c2tfbWdtdCh0YXJnZXQsIHJlcSwgU1JQX1RTS19BQk9SVF9UQVNLKSkKKwlpZiAoc3JwX3NlbmRfdHNrX21nbXQodGFyZ2V0LCByZXEtPmluZGV4LCBzY21uZC0+ZGV2aWNlLT5sdW4sCisJCQkgICAgICBTUlBfVFNLX0FCT1JUX1RBU0spKQogCQlyZXR1cm4gRkFJTEVEOwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQotCWlmIChyZXEtPmNtZF9kb25lKSB7Ci0JCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxKTsKLQkJc2NtbmQtPnNjc2lfZG9uZShzY21uZCk7Ci0JfSBlbHNlIGlmICghcmVxLT50c2tfc3RhdHVzKSB7Ci0JCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxKTsKLQkJc2NtbmQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQl9IGVsc2UKLQkJcmV0ID0gRkFJTEVEOwotCi0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCWlmIChyZXEtPnNjbW5kKSB7CisJCWlmICghdGFyZ2V0LT50c2tfbWdtdF9zdGF0dXMpIHsKKwkJCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxLCAwKTsKKwkJCXNjbW5kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCX0gZWxzZQorCQkJcmV0ID0gRkFJTEVEOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTM5LDI2ICsxNTEwLDIzIEBACiBzdGF0aWMgaW50IHNycF9yZXNldF9kZXZpY2Uoc3RydWN0IHNjc2lfY21uZCAqc2NtbmQpCiB7CiAJc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0ID0gaG9zdF90b190YXJnZXQoc2NtbmQtPmRldmljZS0+aG9zdCk7Ci0Jc3RydWN0IHNycF9yZXF1ZXN0ICpyZXEsICp0bXA7CisJaW50IGk7CiAKIAlzaG9zdF9wcmludGsoS0VSTl9FUlIsIHRhcmdldC0+c2NzaV9ob3N0LCAiU1JQIHJlc2V0X2RldmljZSBjYWxsZWRcbiIpOwogCiAJaWYgKHRhcmdldC0+cXBfaW5fZXJyb3IpCiAJCXJldHVybiBGQUlMRUQ7Ci0JaWYgKHNycF9maW5kX3JlcSh0YXJnZXQsIHNjbW5kLCAmcmVxKSkKKwlpZiAoc3JwX3NlbmRfdHNrX21nbXQodGFyZ2V0LCBTUlBfVEFHX05PX1JFUSwgc2NtbmQtPmRldmljZS0+bHVuLAorCQkJICAgICAgU1JQX1RTS19MVU5fUkVTRVQpKQogCQlyZXR1cm4gRkFJTEVEOwotCWlmIChzcnBfc2VuZF90c2tfbWdtdCh0YXJnZXQsIHJlcSwgU1JQX1RTS19MVU5fUkVTRVQpKQotCQlyZXR1cm4gRkFJTEVEOwotCWlmIChyZXEtPnRza19zdGF0dXMpCisJaWYgKHRhcmdldC0+dHNrX21nbXRfc3RhdHVzKQogCQlyZXR1cm4gRkFJTEVEOwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHRtcCwgJnRhcmdldC0+cmVxX3F1ZXVlLCBsaXN0KQotCQlpZiAocmVxLT5zY21uZC0+ZGV2aWNlID09IHNjbW5kLT5kZXZpY2UpCisJZm9yIChpID0gMDsgaSA8IFNSUF9DTURfU1FfU0laRTsgKytpKSB7CisJCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxID0gJnRhcmdldC0+cmVxX3JpbmdbaV07CisJCWlmIChyZXEtPnNjbW5kICYmIHJlcS0+c2NtbmQtPmRldmljZSA9PSBzY21uZC0+ZGV2aWNlKQogCQkJc3JwX3Jlc2V0X3JlcSh0YXJnZXQsIHJlcSk7Ci0KLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJfQogCiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC0xOTg3LDkgKzE5NTUsMTIgQEAKIAl0YXJnZXQtPmlvX2NsYXNzICAgPSBTUlBfUkVWMTZBX0lCX0lPX0NMQVNTOwogCXRhcmdldC0+c2NzaV9ob3N0ICA9IHRhcmdldF9ob3N0OwogCXRhcmdldC0+c3JwX2hvc3QgICA9IGhvc3Q7CisJdGFyZ2V0LT5sa2V5CSAgID0gaG9zdC0+c3JwX2Rldi0+bXItPmxrZXk7CisJdGFyZ2V0LT5ya2V5CSAgID0gaG9zdC0+c3JwX2Rldi0+bXItPnJrZXk7CiAKKwlzcGluX2xvY2tfaW5pdCgmdGFyZ2V0LT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5mcmVlX3R4KTsKIAlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5mcmVlX3JlcXMpOwotCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXQtPnJlcV9xdWV1ZSk7CiAJZm9yIChpID0gMDsgaSA8IFNSUF9DTURfU1FfU0laRTsgKytpKSB7CiAJCXRhcmdldC0+cmVxX3JpbmdbaV0uaW5kZXggPSBpOwogCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPnJlcV9yaW5nW2ldLmxpc3QsICZ0YXJnZXQtPmZyZWVfcmVxcyk7CkBAIC0yMjE3LDkgKzIxODgsOSBAQAogCQkgKi8KIAkJc3Bpbl9sb2NrKCZob3N0LT50YXJnZXRfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaG9zdC0+dGFyZ2V0X2xpc3QsIGxpc3QpIHsKLQkJCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJCQlzcGluX2xvY2tfaXJxKCZ0YXJnZXQtPmxvY2spOwogCQkJdGFyZ2V0LT5zdGF0ZSA9IFNSUF9UQVJHRVRfUkVNT1ZFRDsKLQkJCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKIAkJfQogCQlzcGluX3VubG9jaygmaG9zdC0+dGFyZ2V0X2xvY2spOwogCkBAIC0yMjU4LDggKzIyMjksNyBAQAogewogCWludCByZXQ7CiAKLQlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU1JQX1NRX1NJWkUpOwotCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihTUlBfUlFfU0laRSk7CisJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgaWJfd2MsIHdyX2lkKSA8IHNpemVvZih2b2lkICopKTsKIAogCWlmIChzcnBfc2dfdGFibGVzaXplID4gMjU1KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJDbGFtcGluZyBzcnBfc2dfdGFibGVzaXplIHRvIDI1NVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCmluZGV4IGVkMGRjZTkuLjlkYzZmYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5oCkBAIC01OSwxNiArNTksMTUgQEAKIAogCVNSUF9SUV9TSElGVCAgICAJPSA2LAogCVNSUF9SUV9TSVpFCQk9IDEgPDwgU1JQX1JRX1NISUZULAotCVNSUF9SUV9NQVNLCQk9IFNSUF9SUV9TSVpFIC0gMSwKIAogCVNSUF9TUV9TSVpFCQk9IFNSUF9SUV9TSVpFLAotCVNSUF9TUV9NQVNLCQk9IFNSUF9TUV9TSVpFIC0gMSwKIAlTUlBfUlNQX1NRX1NJWkUJCT0gMSwKIAlTUlBfUkVRX1NRX1NJWkUJCT0gU1JQX1NRX1NJWkUgLSBTUlBfUlNQX1NRX1NJWkUsCiAJU1JQX1RTS19NR01UX1NRX1NJWkUJPSAxLAogCVNSUF9DTURfU1FfU0laRQkJPSBTUlBfUkVRX1NRX1NJWkUgLSBTUlBfVFNLX01HTVRfU1FfU0laRSwKIAotCVNSUF9UQUdfVFNLX01HTVQJPSAxIDw8IChTUlBfUlFfU0hJRlQgKyAxKSwKKwlTUlBfVEFHX05PX1JFUQkJPSB+MFUsCisJU1JQX1RBR19UU0tfTUdNVAk9IDFVIDw8IDMxLAogCiAJU1JQX0ZNUl9TSVpFCQk9IDI1NiwKIAlTUlBfRk1SX1BPT0xfU0laRQk9IDEwMjQsCkBAIC0xMTMsMTUgKzExMiwyOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICAgICAgICpzY21uZDsKIAlzdHJ1Y3Qgc3JwX2l1CSAgICAgICAqY21kOwotCXN0cnVjdCBzcnBfaXUJICAgICAgICp0c2tfbWdtdDsKIAlzdHJ1Y3QgaWJfcG9vbF9mbXIgICAgICpmbXI7Ci0Jc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKIAlzaG9ydAkJCWluZGV4OwotCXU4CQkJY21kX2RvbmU7Ci0JdTgJCQl0c2tfc3RhdHVzOwogfTsKIAogc3RydWN0IHNycF90YXJnZXRfcG9ydCB7CisJLyogVGhlc2UgYXJlIFJXIGluIHRoZSBob3QgcGF0aCwgYW5kIGNvbW1vbmx5IHVzZWQgdG9nZXRoZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfdHg7CisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX3JlcXM7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzMzIJCQlyZXFfbGltOworCisJLyogVGhlc2UgYXJlIHJlYWQtb25seSBpbiB0aGUgaG90IHBhdGggKi8KKwlzdHJ1Y3QgaWJfY3EJICAgICAgICpzZW5kX2NxIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3RydWN0IGliX2NxCSAgICAgICAqcmVjdl9jcTsKKwlzdHJ1Y3QgaWJfcXAJICAgICAgICpxcDsKKwl1MzIJCQlsa2V5OworCXUzMgkJCXJrZXk7CisJZW51bSBzcnBfdGFyZ2V0X3N0YXRlCXN0YXRlOworCisJLyogRXZlcnl0aGluZyBhYm92ZSB0aGlzIHBvaW50IGlzIHVzZWQgaW4gdGhlIGhvdCBwYXRoIG9mCisJICogY29tbWFuZCBwcm9jZXNzaW5nLiBUcnkgdG8ga2VlcCB0aGVtIHBhY2tlZCBpbnRvIGNhY2hlbGluZXMuCisJICovCisKIAlfX2JlNjQJCQlpZF9leHQ7CiAJX19iZTY0CQkJaW9jX2d1aWQ7CiAJX19iZTY0CQkJc2VydmljZV9pZDsKQEAgLTEzOCwyNCArMTUxLDEzIEBACiAJaW50CQkJcGF0aF9xdWVyeV9pZDsKIAogCXN0cnVjdCBpYl9jbV9pZAkgICAgICAgKmNtX2lkOwotCXN0cnVjdCBpYl9jcQkgICAgICAgKnJlY3ZfY3E7Ci0Jc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcTsKLQlzdHJ1Y3QgaWJfcXAJICAgICAgICpxcDsKIAogCWludAkJCW1heF90aV9pdV9sZW47Ci0JczMyCQkJcmVxX2xpbTsKIAogCWludAkJCXplcm9fcmVxX2xpbTsKIAotCXVuc2lnbmVkCQlyeF9oZWFkOwotCXN0cnVjdCBzcnBfaXUJICAgICAgICpyeF9yaW5nW1NSUF9SUV9TSVpFXTsKLQotCXVuc2lnbmVkCQl0eF9oZWFkOwotCXVuc2lnbmVkCQl0eF90YWlsOwogCXN0cnVjdCBzcnBfaXUJICAgICAgICp0eF9yaW5nW1NSUF9TUV9TSVpFXTsKLQotCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFzOwotCXN0cnVjdCBsaXN0X2hlYWQJcmVxX3F1ZXVlOworCXN0cnVjdCBzcnBfaXUJICAgICAgICpyeF9yaW5nW1NSUF9SUV9TSVpFXTsKIAlzdHJ1Y3Qgc3JwX3JlcXVlc3QJcmVxX3JpbmdbU1JQX0NNRF9TUV9TSVpFXTsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwpAQCAtMTYzLDE2ICsxNjUsMTggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKIAlpbnQJCQlzdGF0dXM7Ci0JZW51bSBzcnBfdGFyZ2V0X3N0YXRlCXN0YXRlOwogCWludAkJCXFwX2luX2Vycm9yOworCisJc3RydWN0IGNvbXBsZXRpb24JdHNrX21nbXRfZG9uZTsKKwl1OAkJCXRza19tZ210X3N0YXR1czsKIH07CiAKIHN0cnVjdCBzcnBfaXUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAl1NjQJCQlkbWE7CiAJdm9pZAkJICAgICAgICpidWY7CiAJc2l6ZV90CQkJc2l6ZTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbglkaXJlY3Rpb247Ci0JZW51bSBzcnBfaXVfdHlwZQl0eXBlOwogfTsKIAogI2VuZGlmIC8qIElCX1NSUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL0tjb25maWcKaW5kZXggNWI1OTYxNi4uNTZlYjQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svS2NvbmZpZwpAQCAtMjU1LDYgKzI1NSwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYW1pam95LgogCitjb25maWcgSk9ZU1RJQ0tfQVM1MDExCisJdHJpc3RhdGUgIkF1c3RyaWEgTWljcm9zeXN0ZW0gQVM1MDExIGpveXN0aWNrIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBUzUwMTEgZGlnaXRhbCBqb3lzdGljayBjb25uZWN0ZWQgdG8geW91cgorCSAgc3lzdGVtLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhczUwMTEuCisKIGNvbmZpZyBKT1lTVElDS19KT1lEVU1QCiAJdHJpc3RhdGUgIkdhbWVwb3J0IGRhdGEgZHVtcGVyIgogCXNlbGVjdCBHQU1FUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svTWFrZWZpbGUKaW5kZXggZjNhOGNiZS4uOTJkYzBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogb2JqLSQoQ09ORklHX0pPWVNUSUNLX0EzRCkJCSs9IGEzZC5vCiBvYmotJChDT05GSUdfSk9ZU1RJQ0tfQURJKQkJKz0gYWRpLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19BTUlHQSkJCSs9IGFtaWpveS5vCitvYmotJChDT05GSUdfSk9ZU1RJQ0tfQVM1MDExKQkJKz0gYXM1MDExLm8KIG9iai0kKENPTkZJR19KT1lTVElDS19BTkFMT0cpCQkrPSBhbmFsb2cubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX0NPQlJBKQkJKz0gY29icmEubwogb2JqLSQoQ09ORklHX0pPWVNUSUNLX0RCOSkJCSs9IGRiOS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FzNTAxMS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hczUwMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjczMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hczUwMTEuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBGYWJpZW4gTWFydGVhdSA8ZmFiaWVuLm1hcnRlYXVAYXJtYWRldXMuY29tPgorICogU3BvbnNvcmVkIGJ5IEFSTWFkZXVzIFN5c3RlbXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIERyaXZlciBmb3IgQXVzdHJpYSBNaWNyb3N5c3RlbXMgam95c3RpY2tzIEFTNTAxMQorICoKKyAqIFRPRE86CisgKgktIFBvd2VyIG9uIHRoZSBjaGlwIHdoZW4gb3BlbigpIGFuZCBwb3dlciBkb3duIHdoZW4gY2xvc2UoKQorICoJLSBNYW5hZ2UgcG93ZXIgbW9kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L2FzNTAxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBEUklWRVJfREVTQyAiRHJpdmVyIGZvciBBdXN0cmlhIE1pY3Jvc3lzdGVtcyBBUzUwMTEgam95c3RpY2siCisjZGVmaW5lIE1PRFVMRV9ERVZJQ0VfQUxJQVMgImFzNTAxMSIKKworTU9EVUxFX0FVVEhPUigiRmFiaWVuIE1hcnRlYXUgPGZhYmllbi5tYXJ0ZWF1QGFybWFkZXVzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBBUzUwMTFfQ1RSTDEJCTB4NzYKKyNkZWZpbmUgQVM1MDExX0NUUkwyCQkweDc1CisjZGVmaW5lIEFTNTAxMV9YUAkJMHg0MworI2RlZmluZSBBUzUwMTFfWE4JCTB4NDQKKyNkZWZpbmUgQVM1MDExX1lQCQkweDUzCisjZGVmaW5lIEFTNTAxMV9ZTgkJMHg1NAorI2RlZmluZSBBUzUwMTFfWF9SRUcJCTB4NDEKKyNkZWZpbmUgQVM1MDExX1lfUkVHCQkweDQyCisjZGVmaW5lIEFTNTAxMV9YX1JFU19JTlQJMHg1MQorI2RlZmluZSBBUzUwMTFfWV9SRVNfSU5UCTB4NTIKKworLyogQ1RSTDEgYml0cyAqLworI2RlZmluZSBBUzUwMTFfQ1RSTDFfTFBfUFVMU0VECQkweDgwCisjZGVmaW5lIEFTNTAxMV9DVFJMMV9MUF9BQ1RJVkUJCTB4NDAKKyNkZWZpbmUgQVM1MDExX0NUUkwxX0xQX0NPTlRJTlVFCTB4MjAKKyNkZWZpbmUgQVM1MDExX0NUUkwxX0lOVF9XVVBfRU4JCTB4MTAKKyNkZWZpbmUgQVM1MDExX0NUUkwxX0lOVF9BQ1RfRU4JCTB4MDgKKyNkZWZpbmUgQVM1MDExX0NUUkwxX0VYVF9DTEtfRU4JCTB4MDQKKyNkZWZpbmUgQVM1MDExX0NUUkwxX1NPRlRfUlNUCQkweDAyCisjZGVmaW5lIEFTNTAxMV9DVFJMMV9EQVRBX1ZBTElECQkweDAxCisKKy8qIENUUkwyIGJpdHMgKi8KKyNkZWZpbmUgQVM1MDExX0NUUkwyX0VYVF9TQU1QTEVfRU4JMHgwOAorI2RlZmluZSBBUzUwMTFfQ1RSTDJfUkNfQklBU19PTgkJMHgwNAorI2RlZmluZSBBUzUwMTFfQ1RSTDJfSU5WX1NQSU5OSU5HCTB4MDIKKworI2RlZmluZSBBUzUwMTFfTUFYX0FYSVMJODAKKyNkZWZpbmUgQVM1MDExX01JTl9BWElTCSgtODApCisjZGVmaW5lIEFTNTAxMV9GVVpaCTgKKyNkZWZpbmUgQVM1MDExX0ZMQVQJNDAKKworc3RydWN0IGFzNTAxMV9kZXZpY2UgeworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudDsKKwl1bnNpZ25lZCBpbnQgYnV0dG9uX2dwaW87CisJdW5zaWduZWQgaW50IGJ1dHRvbl9pcnE7CisJdW5zaWduZWQgaW50IGF4aXNfaXJxOworfTsKKworc3RhdGljIGludCBhczUwMTFfaTJjX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgdWludDhfdCBhcmVnYWRkciwKKwkJCSAgICB1aW50OF90IGF2YWx1ZSkKK3sKKwl1aW50OF90IGRhdGFbMl0gPSB7IGFyZWdhZGRyLCBhdmFsdWUgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJCWNsaWVudC0+YWRkciwgSTJDX01fSUdOT1JFX05BSywgMiwgKHVpbnQ4X3QgKilkYXRhCisJfTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2csIDEpOworCXJldHVybiBlcnJvciA8IDAgPyBlcnJvciA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYXM1MDExX2kyY19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICB1aW50OF90IGFyZWdhZGRyLCBzaWduZWQgY2hhciAqdmFsdWUpCit7CisJdWludDhfdCBkYXRhWzJdID0geyBhcmVnYWRkciB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ19zZXRbMl0gPSB7CisJCXsgY2xpZW50LT5hZGRyLCBJMkNfTV9SRVZfRElSX0FERFIsIDEsICh1aW50OF90ICopZGF0YSB9LAorCQl7IGNsaWVudC0+YWRkciwgSTJDX01fUkQgfCBJMkNfTV9OT1NUQVJULCAxLCAodWludDhfdCAqKWRhdGEgfQorCX07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dfc2V0LCAyKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwkqdmFsdWUgPSBkYXRhWzBdICYgMHg4MCA/IC0xICogKDEgKyB+ZGF0YVswXSkgOiBkYXRhWzBdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXM1MDExX2J1dHRvbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBhczUwMTFfZGV2aWNlICphczUwMTEgPSBkZXZfaWQ7CisJaW50IHZhbCA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKGFzNTAxMS0+YnV0dG9uX2dwaW8pOworCisJaW5wdXRfcmVwb3J0X2tleShhczUwMTEtPmlucHV0X2RldiwgQlROX0pPWVNUSUNLLCAhdmFsKTsKKwlpbnB1dF9zeW5jKGFzNTAxMS0+aW5wdXRfZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFzNTAxMV9heGlzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGFzNTAxMV9kZXZpY2UgKmFzNTAxMSA9IGRldl9pZDsKKwlpbnQgZXJyb3I7CisJc2lnbmVkIGNoYXIgeCwgeTsKKworCWVycm9yID0gYXM1MDExX2kyY19yZWFkKGFzNTAxMS0+aTJjX2NsaWVudCwgQVM1MDExX1hfUkVTX0lOVCwgJngpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBhczUwMTFfaTJjX3JlYWQoYXM1MDExLT5pMmNfY2xpZW50LCBBUzUwMTFfWV9SRVNfSU5ULCAmeSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpbnB1dF9yZXBvcnRfYWJzKGFzNTAxMS0+aW5wdXRfZGV2LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhhczUwMTEtPmlucHV0X2RldiwgQUJTX1ksIHkpOworCWlucHV0X3N5bmMoYXM1MDExLT5pbnB1dF9kZXYpOworCitvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhczUwMTFfY29uZmlndXJlX2NoaXAoc3RydWN0IGFzNTAxMV9kZXZpY2UgKmFzNTAxMSwKKwkJCQljb25zdCBzdHJ1Y3QgYXM1MDExX3BsYXRmb3JtX2RhdGEgKnBsYXRfZGF0KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBhczUwMTEtPmkyY19jbGllbnQ7CisJaW50IGVycm9yOworCXNpZ25lZCBjaGFyIHZhbHVlOworCisJLyogY2hpcCBzb2Z0IHJlc2V0ICovCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX0NUUkwxLAorCQkJCSBBUzUwMTFfQ1RSTDFfU09GVF9SU1QpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJTb2Z0IHJlc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwltZGVsYXkoMTApOworCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX0NUUkwxLAorCQkJCSBBUzUwMTFfQ1RSTDFfTFBfUFVMU0VEIHwKKwkJCQkgQVM1MDExX0NUUkwxX0xQX0FDVElWRSB8CisJCQkJIEFTNTAxMV9DVFJMMV9JTlRfQUNUX0VOKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUG93ZXIgY29uZmlnIGZhaWxlZFxuIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGFzNTAxMV9pMmNfd3JpdGUoY2xpZW50LCBBUzUwMTFfQ1RSTDIsCisJCQkJIEFTNTAxMV9DVFJMMl9JTlZfU1BJTk5JTkcpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCBpbnZlcnQgc3Bpbm5pbmdcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogd3JpdGUgdGhyZXNob2xkICovCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX1hQLCBwbGF0X2RhdC0+eHApOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCB3cml0ZSB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX1hOLCBwbGF0X2RhdC0+eG4pOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCB3cml0ZSB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX1lQLCBwbGF0X2RhdC0+eXApOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCB3cml0ZSB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBhczUwMTFfaTJjX3dyaXRlKGNsaWVudCwgQVM1MDExX1lOLCBwbGF0X2RhdC0+eW4pOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCB3cml0ZSB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogdG8gZnJlZSBpcnEgZ3BpbyBpbiBjaGlwICovCisJZXJyb3IgPSBhczUwMTFfaTJjX3JlYWQoY2xpZW50LCBBUzUwMTFfWF9SRVNfSU5ULCAmdmFsdWUpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW4ndCByZWFkIGkyYyBYIHJlc29sdXRpb24gdmFsdWVcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFzNTAxMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3QgYXM1MDExX3BsYXRmb3JtX2RhdGEgKnBsYXRfZGF0YTsKKwlzdHJ1Y3QgYXM1MDExX2RldmljZSAqYXM1MDExOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgaXJxOworCWludCBlcnJvcjsKKworCXBsYXRfZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwbGF0X2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwbGF0X2RhdGEtPmF4aXNfaXJxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTm8gYXhpcyBJUlE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkibmVlZCBpMmMgYnVzIHRoYXQgc3VwcG9ydHMgcHJvdG9jb2wgbWFuZ2xpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhczUwMTEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXM1MDExX2RldmljZSksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYXM1MDExIHx8ICFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2Ugc3RydWN0dXJlXG4iKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlhczUwMTEtPmkyY19jbGllbnQgPSBjbGllbnQ7CisJYXM1MDExLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJYXM1MDExLT5idXR0b25fZ3BpbyA9IHBsYXRfZGF0YS0+YnV0dG9uX2dwaW87CisJYXM1MDExLT5heGlzX2lycSA9IHBsYXRfZGF0YS0+YXhpc19pcnE7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiQXVzdHJpYSBNaWNyb3N5c3RlbSBhczUwMTEgam95c3RpY2siOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEVWX0FCUywgaW5wdXRfZGV2LT5ldmJpdCk7CisJX19zZXRfYml0KEJUTl9KT1lTVElDSywgaW5wdXRfZGV2LT5rZXliaXQpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwKKwkJQVM1MDExX01JTl9BWElTLCBBUzUwMTFfTUFYX0FYSVMsIEFTNTAxMV9GVVpaLCBBUzUwMTFfRkxBVCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoYXM1MDExLT5pbnB1dF9kZXYsIEFCU19ZLAorCQlBUzUwMTFfTUlOX0FYSVMsIEFTNTAxMV9NQVhfQVhJUywgQVM1MDExX0ZVWlosIEFTNTAxMV9GTEFUKTsKKworCWVycm9yID0gZ3Bpb19yZXF1ZXN0KGFzNTAxMS0+YnV0dG9uX2dwaW8sICJBUzUwMTEgYnV0dG9uIik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGJ1dHRvbiBncGlvXG4iKTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJaXJxID0gZ3Bpb190b19pcnEoYXM1MDExLT5idXR0b25fZ3Bpbyk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiRmFpbGVkIHRvIGdldCBpcnEgbnVtYmVyIGZvciBidXR0b24gZ3Bpb1xuIik7CisJCWdvdG8gZXJyX2ZyZWVfYnV0dG9uX2dwaW87CisJfQorCisJYXM1MDExLT5idXR0b25faXJxID0gaXJxOworCisJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShhczUwMTEtPmJ1dHRvbl9pcnEsCisJCQkJICAgICBOVUxMLCBhczUwMTFfYnV0dG9uX2ludGVycnVwdCwKKwkJCQkgICAgIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkgICAgICJhczUwMTFfYnV0dG9uIiwgYXM1MDExKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNhbid0IGFsbG9jYXRlIGJ1dHRvbiBpcnEgJWRcbiIsIGFzNTAxMS0+YnV0dG9uX2lycSk7CisJCWdvdG8gZXJyX2ZyZWVfYnV0dG9uX2dwaW87CisJfQorCisJZXJyb3IgPSBhczUwMTFfY29uZmlndXJlX2NoaXAoYXM1MDExLCBwbGF0X2RhdGEpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZnJlZV9idXR0b25faXJxOworCisJZXJyb3IgPSByZXF1ZXN0X3RocmVhZGVkX2lycShhczUwMTEtPmF4aXNfaXJxLCBOVUxMLAorCQkJCSAgICAgYXM1MDExX2F4aXNfaW50ZXJydXB0LAorCQkJCSAgICAgcGxhdF9kYXRhLT5heGlzX2lycWZsYWdzLAorCQkJCSAgICAgImFzNTAxMV9qb3lzdGljayIsIGFzNTAxMSk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNhbid0IGFsbG9jYXRlIGF4aXMgaXJxICVkXG4iLCBwbGF0X2RhdGEtPmF4aXNfaXJxKTsKKwkJZ290byBlcnJfZnJlZV9idXR0b25faXJxOworCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFzNTAxMS0+aW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9heGlzX2lycTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhczUwMTEpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2F4aXNfaXJxOgorCWZyZWVfaXJxKGFzNTAxMS0+YXhpc19pcnEsIGFzNTAxMSk7CitlcnJfZnJlZV9idXR0b25faXJxOgorCWZyZWVfaXJxKGFzNTAxMS0+YnV0dG9uX2lycSwgYXM1MDExKTsKK2Vycl9mcmVlX2J1dHRvbl9ncGlvOgorCWdwaW9fZnJlZShhczUwMTEtPmJ1dHRvbl9ncGlvKTsKK2Vycl9mcmVlX21lbToKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKGFzNTAxMSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFzNTAxMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYXM1MDExX2RldmljZSAqYXM1MDExID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlmcmVlX2lycShhczUwMTEtPmF4aXNfaXJxLCBhczUwMTEpOworCWZyZWVfaXJxKGFzNTAxMS0+YnV0dG9uX2lycSwgYXM1MDExKTsKKwlncGlvX2ZyZWUoYXM1MDExLT5idXR0b25fZ3Bpbyk7CisKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhczUwMTEtPmlucHV0X2Rldik7CisJa2ZyZWUoYXM1MDExKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYXM1MDExX2lkW10gPSB7CisJeyBNT0RVTEVfREVWSUNFX0FMSUFTLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFzNTAxMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhczUwMTFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFzNTAxMSIsCisJfSwKKwkucHJvYmUJCT0gYXM1MDExX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXM1MDExX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYXM1MDExX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXM1MDExX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFzNTAxMV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYXM1MDExX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXM1MDExX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYXM1MDExX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhczUwMTFfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKaW5kZXggZjgyOTk5OC4uN2IzYzBiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwpAQCAtMTIsMTggKzEyLDYgQEAKIAogaWYgSU5QVVRfS0VZQk9BUkQKIAotY29uZmlnIEtFWUJPQVJEX0FBRUQyMDAwCi0JdHJpc3RhdGUgIkFBRUQtMjAwMCBrZXlib2FyZCIKLQlkZXBlbmRzIG9uIE1BQ0hfQUFFRDIwMDAKLQlzZWxlY3QgSU5QVVRfUE9MTERFVgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXlib2FyZCBvbiB0aGUgQWdpbGVudCBBQUVELTIwMDAKLQkgIGRldmVsb3BtZW50IGJvYXJkLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhYWVkMjAwMF9rYmQuCi0KIGNvbmZpZyBLRVlCT0FSRF9BRFA1NTIwCiAJdHJpc3RhdGUgIktleXBhZCBTdXBwb3J0IGZvciBBRFA1NTIwIFBNSUMiCiAJZGVwZW5kcyBvbiBQTUlDX0FEUDU1MjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCmluZGV4IDg5MzNlOWMuLjRlNTU3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQpAQCAtNCw3ICs0LDYgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCi1vYmotJChDT05GSUdfS0VZQk9BUkRfQUFFRDIwMDApCQkrPSBhYWVkMjAwMF9rYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FEUDU1MjApCQkrPSBhZHA1NTIwLWtleXMubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FEUDU1ODgpCQkrPSBhZHA1NTg4LWtleXMubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FNSUdBKQkJKz0gYW1pa2JkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWFlZDIwMDBfa2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FhZWQyMDAwX2tiZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIyMmE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWFlZDIwMDBfa2JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqICBLZXlib2FyZCBkcml2ZXIgZm9yIHRoZSBBQUVELTIwMDAgZGV2IGJvYXJkCi0gKgotICogIENvcHlyaWdodCAoYykgMjAwNiBOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EKLSAqCi0gKiAgQmFzZWQgb24gY29yZ2lrYmQuYwotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2FhZWQyMDAwLmg+Ci0KLSNkZWZpbmUgS0JfUk9XUwkJCTEyCi0jZGVmaW5lIEtCX0NPTFMJCQk4Ci0jZGVmaW5lIEtCX1JPV01BU0socikJCSgxIDw8IChyKSkKLSNkZWZpbmUgU0NBTkNPREUocixjKQkJKCgoYykgKiBLQl9ST1dTKSArIChyKSkKLSNkZWZpbmUgTlJfU0NBTkNPREVTCQkoS0JfQ09MUyAqIEtCX1JPV1MpCi0KLSNkZWZpbmUgU0NBTl9JTlRFUlZBTAkJKDUwKSAvKiBtcyAqLwotI2RlZmluZSBLQl9BQ1RJVkFURV9ERUxBWQkoMjApIC8qIHVzICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFhZWRrYmRfa2V5Y29kZVtOUl9TQ0FOQ09ERVNdID0gewotCUtFWV85LCBLRVlfMCwgS0VZX01JTlVTLCBLRVlfRVFVQUwsIEtFWV9CQUNLU1BBQ0UsIDAsIEtFWV9TUEFDRSwgS0VZX0tQNiwgMCwgS0VZX0tQRE9ULCAwLCAwLAotCUtFWV9LLCBLRVlfTSwgS0VZX08sIEtFWV9ET1QsIEtFWV9TTEFTSCwgMCwgS0VZX0YsIDAsIDAsIDAsIEtFWV9MRUZUU0hJRlQsIDAsCi0JS0VZX0ksIEtFWV9QLCBLRVlfTEVGVEJSQUNFLCBLRVlfUklHSFRCUkFDRSwgS0VZX0JBQ0tTTEFTSCwgMCwgMCwgMCwgMCwgMCwgS0VZX1JJR0hUU0hJRlQsIDAsCi0JS0VZXzgsIEtFWV9MLCBLRVlfU0VNSUNPTE9OLCBLRVlfQVBPU1RST1BIRSwgS0VZX0VOVEVSLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCUtFWV9KLCBLRVlfSCwgS0VZX0IsIEtFWV9LUDgsIEtFWV9LUDQsIDAsIEtFWV9DLCBLRVlfRCwgS0VZX1MsIEtFWV9BLCAwLCBLRVlfQ0FQU0xPQ0ssCi0JS0VZX1ksIEtFWV9VLCBLRVlfTiwgS0VZX1QsIDAsIDAsIEtFWV9SLCBLRVlfRSwgS0VZX1csIEtFWV9RLCAwLCBLRVlfVEFCLAotCUtFWV83LCBLRVlfNiwgS0VZX0csIDAsIEtFWV81LCAwLCBLRVlfNCwgS0VZXzMsIEtFWV8yLCBLRVlfMSwgMCwgS0VZX0dSQVZFLAotCTAsIDAsIEtFWV9DT01NQSwgMCwgS0VZX0tQMiwgMCwgS0VZX1YsIEtFWV9MRUZUQUxULCBLRVlfWCwgS0VZX1osIDAsIEtFWV9MRUZUQ1RSTAotfTsKLQotc3RydWN0IGFhZWRrYmQgewotCXVuc2lnbmVkIGNoYXIga2V5Y29kZVtBUlJBWV9TSVpFKGFhZWRrYmRfa2V5Y29kZSldOwotCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldjsKLQlpbnQga2Jkc2Nhbl9zdGF0ZVtLQl9DT0xTXTsKLQlpbnQga2Jkc2Nhbl9jb3VudFtLQl9DT0xTXTsKLX07Ci0KLSNkZWZpbmUgS0JEU0NBTl9TVEFCTEVfQ09VTlQgMgotCi1zdGF0aWMgdm9pZCBhYWVka2JkX3JlcG9ydF9jb2woc3RydWN0IGFhZWRrYmQgKmFhZWRrYmQsCi0JCQkJdW5zaWduZWQgaW50IGNvbCwgdW5zaWduZWQgaW50IHJvd2QpCi17Ci0JdW5zaWduZWQgaW50IHNjYW5jb2RlLCBwcmVzc2VkOwotCXVuc2lnbmVkIGludCByb3c7Ci0KLQlmb3IgKHJvdyA9IDA7IHJvdyA8IEtCX1JPV1M7IHJvdysrKSB7Ci0JCXNjYW5jb2RlID0gU0NBTkNPREUocm93LCBjb2wpOwotCQlwcmVzc2VkID0gcm93ZCAmIEtCX1JPV01BU0socm93KTsKLQotCQlpbnB1dF9yZXBvcnRfa2V5KGFhZWRrYmQtPnBvbGxfZGV2LT5pbnB1dCwKLQkJCQkgYWFlZGtiZC0+a2V5Y29kZVtzY2FuY29kZV0sIHByZXNzZWQpOwotCX0KLX0KLQotLyogU2NhbiB0aGUgaGFyZHdhcmUga2V5Ym9hcmQgYW5kIHB1c2ggYW55IGNoYW5nZXMgdXAgdGhyb3VnaCB0aGUgaW5wdXQgbGF5ZXIgKi8KLXN0YXRpYyB2b2lkIGFhZWRrYmRfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2KQotewotCXN0cnVjdCBhYWVka2JkICphYWVka2JkID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBjb2wsIHJvd2Q7Ci0KLQljb2wgPSAwOwotCWRvIHsKLQkJQUFFQ19HUElPX0tTQ0FOID0gY29sICsgODsKLQkJdWRlbGF5KEtCX0FDVElWQVRFX0RFTEFZKTsKLQkJcm93ZCA9IEFBRURfRVhUX0dQSU8gJiBBQUVEX0VHUElPX0tCRF9TQ0FOOwotCi0JCWlmIChyb3dkICE9IGFhZWRrYmQtPmtiZHNjYW5fc3RhdGVbY29sXSkgewotCQkJYWFlZGtiZC0+a2Jkc2Nhbl9jb3VudFtjb2xdID0gMDsKLQkJCWFhZWRrYmQtPmtiZHNjYW5fc3RhdGVbY29sXSA9IHJvd2Q7Ci0JCX0gZWxzZSBpZiAoKythYWVka2JkLT5rYmRzY2FuX2NvdW50W2NvbF0gPj0gS0JEU0NBTl9TVEFCTEVfQ09VTlQpIHsKLQkJCWFhZWRrYmRfcmVwb3J0X2NvbChhYWVka2JkLCBjb2wsIHJvd2QpOwotCQkJY29sKys7Ci0JCX0KLQl9IHdoaWxlIChjb2wgPCBLQl9DT0xTKTsKLQotCUFBRUNfR1BJT19LU0NBTiA9IDB4MDc7Ci0JaW5wdXRfc3luYyhkZXYtPmlucHV0KTsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWFlZGtiZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhYWVka2JkICphYWVka2JkOwotCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7Ci0JaW50IGk7Ci0JaW50IGVycm9yOwotCi0JYWFlZGtiZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYWVka2JkKSwgR0ZQX0tFUk5FTCk7Ci0JcG9sbF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCk7Ci0JaWYgKCFhYWVka2JkIHx8ICFwb2xsX2RldikgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhYWVka2JkKTsKLQotCWFhZWRrYmQtPnBvbGxfZGV2ID0gcG9sbF9kZXY7Ci0JbWVtY3B5KGFhZWRrYmQtPmtleWNvZGUsIGFhZWRrYmRfa2V5Y29kZSwgc2l6ZW9mKGFhZWRrYmQtPmtleWNvZGUpKTsKLQotCXBvbGxfZGV2LT5wcml2YXRlID0gYWFlZGtiZDsKLQlwb2xsX2Rldi0+cG9sbCA9IGFhZWRrYmRfcG9sbDsKLQlwb2xsX2Rldi0+cG9sbF9pbnRlcnZhbCA9IFNDQU5fSU5URVJWQUw7Ci0KLQlpbnB1dF9kZXYgPSBwb2xsX2Rldi0+aW5wdXQ7Ci0JaW5wdXRfZGV2LT5uYW1lID0gIkFBRUQtMjAwMCBLZXlib2FyZCI7Ci0JaW5wdXRfZGV2LT5waHlzID0gImFhZWRrYmQvaW5wdXQwIjsKLQlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4MDAwMTsKLQlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDAwMDE7Ci0JaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOwotCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Ci0KLQlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFUCk7Ci0JaW5wdXRfZGV2LT5rZXljb2RlID0gYWFlZGtiZC0+a2V5Y29kZTsKLQlpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoYWFlZGtiZF9rZXljb2RlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFhZWRrYmRfa2V5Y29kZSk7IGkrKykKLQkJc2V0X2JpdChhYWVka2JkLT5rZXljb2RlW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0JY2xlYXJfYml0KDAsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShhYWVka2JkLT5wb2xsX2Rldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGZhaWw7Ci0KLQlyZXR1cm4gMDsKLQotIGZhaWw6CWtmcmVlKGFhZWRrYmQpOwotCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShwb2xsX2Rldik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhYWVka2JkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhYWVka2JkICphYWVka2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYWFlZGtiZC0+cG9sbF9kZXYpOwotCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShhYWVka2JkLT5wb2xsX2Rldik7Ci0Ja2ZyZWUoYWFlZGtiZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogd29yayB3aXRoIGhvdHBsdWcgYW5kIGNvbGRwbHVnICovCi1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFhZWQyMDAwLWtleWJvYXJkIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFhZWRrYmRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBhYWVka2JkX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWFlZGtiZF9yZW1vdmUpLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhYWVkMjAwMC1rZXlib2FyZCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhYWVka2JkX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYWVka2JkX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhYWVka2JkX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWFlZGtiZF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhYWVka2JkX2luaXQpOwotbW9kdWxlX2V4aXQoYWFlZGtiZF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiTmljb2xhcyBCZWxsaWRvIFkgT3J0ZWdhIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFBRUQtMjAwMCBLZXlib2FyZCBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYmNtNTk3NC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKaW5kZXggYjk1MjMxNy4uZWU4Mjg1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMKQEAgLTU1LDYgKzU1LDE0IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSQkweDAyMzYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19JU08JMHgwMjM3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTCTB4MDIzOAorLyogTWFjYm9va0FpcjMsMiAodW5pYm9keSksIGFrYSB3ZWxsc3ByaW5nNSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kJMHgwMjNmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPCTB4MDI0MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUwkweDAyNDEKKy8qIE1hY2Jvb2tBaXIzLDEgKHVuaWJvZHkpLCBha2Egd2VsbHNwcmluZzQgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSQkweDAyNDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPCTB4MDI0MworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMJMHgwMjQ0CiAKICNkZWZpbmUgQkNNNTk3NF9ERVZJQ0UocHJvZCkgewkJCQkJXAogCS5tYXRjaF9mbGFncyA9IChVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8CQlcCkBAIC04MCw2ICs4OCwxNCBAQAogCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSSksCiAJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19JU08pLAogCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTKSwKKwkvKiBNYWNib29rQWlyMywyICovCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJKSwKKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTyksCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMpLAorCS8qIE1hY2Jvb2tBaXIzLDEgKi8KKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJKSwKKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9JU08pLAorCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUyksCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIAl7fQogfTsKQEAgLTIzNCw2ICsyNTAsMzAgQEAKIAkJeyBESU1fWCwgRElNX1ggLyBTTl9DT09SRCwgLTQ0NjAsIDUxNjYgfSwKIAkJeyBESU1fWSwgRElNX1kgLyBTTl9DT09SRCwgLTc1LCA2NzAwIH0KIAl9LAorCXsKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJLAorCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTywKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMsCisJCUhBU19JTlRFR1JBVEVEX0JVVFRPTiwKKwkJMHg4NCwgc2l6ZW9mKHN0cnVjdCBidF9kYXRhKSwKKwkJMHg4MSwgVFlQRTIsIEZJTkdFUl9UWVBFMiwgRklOR0VSX1RZUEUyICsgU0laRU9GX0FMTF9GSU5HRVJTLAorCQl7IERJTV9QUkVTU1VSRSwgRElNX1BSRVNTVVJFIC8gU05fUFJFU1NVUkUsIDAsIDMwMCB9LAorCQl7IERJTV9XSURUSCwgRElNX1dJRFRIIC8gU05fV0lEVEgsIDAsIDIwNDggfSwKKwkJeyBESU1fWCwgRElNX1ggLyBTTl9DT09SRCwgLTQ2MjAsIDUxNDAgfSwKKwkJeyBESU1fWSwgRElNX1kgLyBTTl9DT09SRCwgLTE1MCwgNjYwMCB9CisJfSwKKwl7CisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0ksCisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTywKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTLAorCQlIQVNfSU5URUdSQVRFRF9CVVRUT04sCisJCTB4ODQsIHNpemVvZihzdHJ1Y3QgYnRfZGF0YSksCisJCTB4ODEsIFRZUEUyLCBGSU5HRVJfVFlQRTIsIEZJTkdFUl9UWVBFMiArIFNJWkVPRl9BTExfRklOR0VSUywKKwkJeyBESU1fUFJFU1NVUkUsIERJTV9QUkVTU1VSRSAvIFNOX1BSRVNTVVJFLCAwLCAzMDAgfSwKKwkJeyBESU1fV0lEVEgsIERJTV9XSURUSCAvIFNOX1dJRFRILCAwLCAyMDQ4IH0sCisJCXsgRElNX1gsIERJTV9YIC8gU05fQ09PUkQsIC00NjE2LCA1MTEyIH0sCisJCXsgRElNX1ksIERJTV9ZIC8gU05fQ09PUkQsIC0xNDIsIDUyMzQgfQorCX0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vS2NvbmZpZwppbmRleCBiY2IxZmRlLi4zMDdlZWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9LY29uZmlnCkBAIC0yMjksNyArMjI5LDcgQEAKIAl0cmlzdGF0ZSAiVFFDIFBTLzIgbXVsdGlwbGV4ZXIiCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGUgUFMvMiBsaW5lIG11bHRpcGxleGVyIGxpa2UgdGhlIG9uZQotCSAgcHJlc2VudCBvbiBUUUMgYm9hZHMuCisJICBwcmVzZW50IG9uIFRRQyBib2FyZHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBzMm11bHQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAppbmRleCA1YWUwZmM0Li5iYjlmNWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKQEAgLTQyNCw2ICs0MjQsMTMgQEAKIAkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMDEwMCIpLAogCQl9LAogCX0sCisJeworCQkvKiBEZWxsIFZvc3RybyBWMTMgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvIFYxMyIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCkBAIC01NDUsNiArNTUyLDE3IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdCBpODA0Ml9kbWlfbm90aW1lb3V0X3RhYmxlW10gPSB7CisJeworCQkvKiBEZWxsIFZvc3RybyBWMTMgKi8KKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvIFYxMyIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCiAvKgogICogU29tZSBXaXN0cm9uIGJhc2VkIGxhcHRvcHMgbmVlZCB1cyB0byBleHBsaWNpdGx5IGVuYWJsZSB0aGUgJ0RyaXRlawogICoga2V5Ym9hcmQgZXh0ZW5zaW9uJyB0byBtYWtlIHRoZWlyIGV4dHJhIGtleXMgc3RhcnQgZ2VuZXJhdGluZyBzY2FuY29kZXMuCkBAIC04OTYsNiArOTE0LDkgQEAKIAlpZiAoZG1pX2NoZWNrX3N5c3RlbShpODA0Ml9kbWlfbm9tdXhfdGFibGUpKQogCQlpODA0Ml9ub211eCA9IHRydWU7CiAKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShpODA0Ml9kbWlfbm90aW1lb3V0X3RhYmxlKSkKKwkJaTgwNDJfbm90aW1lb3V0ID0gdHJ1ZTsKKwogCWlmIChkbWlfY2hlY2tfc3lzdGVtKGk4MDQyX2RtaV9kcml0ZWtfdGFibGUpKQogCQlpODA0Ml9kcml0ZWsgPSB0cnVlOwogI2VuZGlmIC8qIENPTkZJR19YODYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwppbmRleCBjMDRmZjAwLi5hYzRjOTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCkBAIC02Myw2ICs2MywxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG5vbG9vcCwgaTgwNDJfbm9sb29wLCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9sb29wLCAiRGlzYWJsZSB0aGUgQVVYIExvb3BiYWNrIGNvbW1hbmQgd2hpbGUgcHJvYmluZyBmb3IgdGhlIEFVWCBwb3J0Iik7CiAKK3N0YXRpYyBib29sIGk4MDQyX25vdGltZW91dDsKK21vZHVsZV9wYXJhbV9uYW1lZChub3RpbWVvdXQsIGk4MDQyX25vdGltZW91dCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vdGltZW91dCwgIklnbm9yZSB0aW1lb3V0cyBzaWduYWxsZWQgYnkgaTgwNDIiKTsKKwogI2lmZGVmIENPTkZJR19YODYKIHN0YXRpYyBib29sIGk4MDQyX2RyaXRlazsKIG1vZHVsZV9wYXJhbV9uYW1lZChkcml0ZWssIGk4MDQyX2RyaXRlaywgYm9vbCwgMCk7CkBAIC01MDQsNyArNTA4LDcgQEAKIAl9IGVsc2UgewogCiAJCWRmbCA9ICgoc3RyICYgSTgwNDJfU1RSX1BBUklUWSkgPyBTRVJJT19QQVJJVFkgOiAwKSB8Ci0JCSAgICAgICgoc3RyICYgSTgwNDJfU1RSX1RJTUVPVVQpID8gU0VSSU9fVElNRU9VVCA6IDApOworCQkgICAgICAoKHN0ciAmIEk4MDQyX1NUUl9USU1FT1VUICYmICFpODA0Ml9ub3RpbWVvdXQpID8gU0VSSU9fVElNRU9VVCA6IDApOwogCiAJCXBvcnRfbm8gPSAoc3RyICYgSTgwNDJfU1RSX0FVWERBVEEpID8KIAkJCQlJODA0Ml9BVVhfUE9SVF9OTyA6IEk4MDQyX0tCRF9QT1JUX05POwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCmluZGV4IDA3YWM3N2QuLjBjOWY0YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKQEAgLTYxMCw3ICs2MTAsNyBAQAogCiBjb25maWcgVE9VQ0hTQ1JFRU5fVVNCX0VUVF9UQzQ1VVNCCiAJZGVmYXVsdCB5Ci0JYm9vbCAiRVQmVCBVU0Igc2VyaWVzIFRDNFVNL1RDNVVIIHRvdWNoc2NyZWVuIGNvbnRyb2xlciBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWJvb2wgIkVUJlQgVVNCIHNlcmllcyBUQzRVTS9UQzVVSCB0b3VjaHNjcmVlbiBjb250cm9sbGVyIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFCiAKIGNvbmZpZyBUT1VDSFNDUkVFTl9VU0JfTkVYSU8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LWkyYy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKaW5kZXggZDgyYTM4ZS4uNGU0ZTU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzktaTJjLmMKQEAgLTEwLDE0ICsxMCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgImFkNzg3OS5oIgogCiAjZGVmaW5lIEFENzg3OV9ERVZJRAkJMHg3OQkvKiBBRDc4NzktMS9BRDc4ODktMSAqLwogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFkNzg3OV9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgYWQ3ODc5X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZDc4NzkgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlhZDc4Nzlfc3VzcGVuZCh0cyk7CkBAIC0yNSwxNyArMjcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZDc4NzlfaTJjX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBhZDc4NzlfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWQ3ODc5ICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJYWQ3ODc5X3Jlc3VtZSh0cyk7CiAKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jIGRlZmluZSBhZDc4NzlfaTJjX3N1c3BlbmQgTlVMTAotIyBkZWZpbmUgYWQ3ODc5X2kyY19yZXN1bWUgIE5VTEwKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFkNzg3OV9pMmNfcG0sIGFkNzg3OV9pMmNfc3VzcGVuZCwgYWQ3ODc5X2kyY19yZXN1bWUpOwogI2VuZGlmCiAKIC8qIEFsbCByZWdpc3RlcnMgYXJlIHdvcmQtc2l6ZWQuCkBAIC0xMTcsMTEgKzExOSwxMiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImFkNzg3OSIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmYWQ3ODc5X2kyY19wbSwKKyNlbmRpZgogCX0sCiAJLnByb2JlCQk9IGFkNzg3OV9pMmNfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDc4NzlfaTJjX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBhZDc4NzlfaTJjX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBhZDc4NzlfaTJjX3Jlc3VtZSwKIAkuaWRfdGFibGUJPSBhZDc4NzlfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2N5OGN0bWcxMTBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY3k4Y3RtZzExMF90cy5jCmluZGV4IGQwYzNhNzIuLmE5M2M1YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY3k4Y3RtZzExMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vY3k4Y3RtZzExMF90cy5jCkBAIC0yODAsOCArMjgwLDkgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjeThjdG1nMTEwX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc2cpCitzdGF0aWMgaW50IGN5OGN0bWcxMTBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgY3k4Y3RtZzExMCAqdHMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQpAQCAtMjkzLDggKzI5NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3k4Y3RtZzExMF9yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgY3k4Y3RtZzExMF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGN5OGN0bWcxMTAgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKQEAgLTMwNSw2ICszMDcsOCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGN5OGN0bWcxMTBfcG0sIGN5OGN0bWcxMTBfc3VzcGVuZCwgY3k4Y3RtZzExMF9yZXN1bWUpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGN5OGN0bWcxMTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0zMzUsMTQgKzMzOSwxMyBAQAogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSBDWThDVE1HMTEwX0RSSVZFUl9OQU1FLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmY3k4Y3RtZzExMF9wbSwKKyNlbmRpZgogCX0sCiAJLmlkX3RhYmxlCT0gY3k4Y3RtZzExMF9pZHRhYmxlLAogCS5wcm9iZQkJPSBjeThjdG1nMTEwX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3k4Y3RtZzExMF9yZW1vdmUpLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gY3k4Y3RtZzExMF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gY3k4Y3RtZzExMF9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGN5OGN0bWcxMTBfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lZXRpX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VldGlfdHMuYwppbmRleCA3YTNhOTE2Li43ZjhmNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VldGlfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VldGlfdHMuYwpAQCAtMjYxLDggKzI2MSw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZWV0aV90c19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNnKQorc3RhdGljIGludCBlZXRpX3RzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGVldGlfdHNfcHJpdiAqcHJpdiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IHByaXYtPmlucHV0OwogCkBAIC0yNzksOCArMjgwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlZXRpX3RzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBlZXRpX3RzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgZWV0aV90c19wcml2ICpwcml2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gcHJpdi0+aW5wdXQ7CiAKQEAgLTI5Niw5ICsyOTgsOCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQotI2RlZmluZSBlZXRpX3RzX3N1c3BlbmQgTlVMTAotI2RlZmluZSBlZXRpX3RzX3Jlc3VtZSBOVUxMCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhlZXRpX3RzX3BtLCBlZXRpX3RzX3N1c3BlbmQsIGVldGlfdHNfcmVzdW1lKTsKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZWV0aV90c19pZFtdID0gewpAQCAtMzEwLDExICszMTEsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBlZXRpX3RzX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJlZXRpX3RzIiwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJmVldGlfdHNfcG0sCisjZW5kaWYKIAl9LAogCS5wcm9iZSA9IGVldGlfdHNfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGVldGlfdHNfcmVtb3ZlKSwKLQkuc3VzcGVuZCA9IGVldGlfdHNfc3VzcGVuZCwKLQkucmVzdW1lID0gZWV0aV90c19yZXN1bWUsCiAJLmlkX3RhYmxlID0gZWV0aV90c19pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWNzNTAwMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKaW5kZXggNmVlOTk0MC4uMmQ4NGM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tY3M1MDAwX3RzLmMKQEAgLTI2MSwyNSArMjYxLDI3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbWNzNTAwMF90c19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNnKQorc3RhdGljIGludCBtY3M1MDAwX3RzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisKIAkvKiBUb3VjaCBzbGVlcCBtb2RlICovCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1DUzUwMDBfVFNfT1BfTU9ERSwgT1BfTU9ERV9TTEVFUCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtY3M1MDAwX3RzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtY3M1MDAwX3RzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgbWNzNTAwMF90c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAltY3M1MDAwX3RzX3BoeXNfaW5pdChkYXRhKTsKIAogCXJldHVybiAwOwogfQotI2Vsc2UKLSNkZWZpbmUgbWNzNTAwMF90c19zdXNwZW5kCU5VTEwKLSNkZWZpbmUgbWNzNTAwMF90c19yZXN1bWUJTlVMTAorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWNzNTAwMF90c19wbSwgbWNzNTAwMF90c19zdXNwZW5kLCBtY3M1MDAwX3RzX3Jlc3VtZSk7CiAjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1jczUwMDBfdHNfaWRbXSA9IHsKQEAgLTI5MSwxMCArMjkzLDExIEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWNzNTAwMF90c19kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG1jczUwMDBfdHNfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtY3M1MDAwX3RzX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBtY3M1MDAwX3RzX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBtY3M1MDAwX3RzX3Jlc3VtZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtY3M1MDAwX3RzIiwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtICAgPSAmbWNzNTAwMF90c19wbSwKKyNlbmRpZgogCX0sCiAJLmlkX3RhYmxlCT0gbWNzNTAwMF90c19pZCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21pZ29yX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21pZ29yX3RzLmMKaW5kZXggZGVmZTVkZC4uNTgwM2JkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9taWdvcl90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWlnb3JfdHMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yMjYsOCArMjI3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtaWdvcl90c19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNnKQorc3RhdGljIGludCBtaWdvcl90c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBtaWdvcl90c19wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7CiAKIAlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKQEAgLTIzNiw4ICsyMzgsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1pZ29yX3RzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtaWdvcl90c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IG1pZ29yX3RzX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmNsaWVudC0+ZGV2KTsKIAogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmY2xpZW50LT5kZXYpKQpAQCAtMjQ2LDYgKzI0OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtaWdvcl90c19wbSwgbWlnb3JfdHNfc3VzcGVuZCwgbWlnb3JfdHNfcmVzdW1lKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1pZ29yX3RzX2lkW10gPSB7CiAJeyAibWlnb3JfdHMiLCAwIH0sCiAJeyB9CkBAIC0yNTUsMTEgKzI2MCwxMCBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1pZ29yX3RzX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtaWdvcl90cyIsCisJCS5wbSA9ICZtaWdvcl90c19wbSwKIAl9LAogCS5wcm9iZSA9IG1pZ29yX3RzX3Byb2JlLAogCS5yZW1vdmUgPSBtaWdvcl90c19yZW1vdmUsCi0JLnN1c3BlbmQgPSBtaWdvcl90c19zdXNwZW5kLAotCS5yZXN1bWUgPSBtaWdvcl90c19yZXN1bWUsCiAJLmlkX3RhYmxlID0gbWlnb3JfdHNfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dhY29tX3c4MDAxLmMKaW5kZXggOGVkNTNhZC4uNWNiODQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93YWNvbV93ODAwMS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2Fjb21fdzgwMDEuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmF5YSBLdW1hcgogICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMCAtIDIwMTEgUGluZyBDaGVuZywgV2Fjb20uIDxwaW5nY0B3YWNvbS5jb20+CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCkBAIC02NCwxMSArNjUsMTEgQEAKIAogLyogdG91Y2ggcXVlcnkgcmVwbHkgcGFja2V0ICovCiBzdHJ1Y3QgdzgwMDFfdG91Y2hfcXVlcnkgeworCXUxNiB4OworCXUxNiB5OwogCXU4IHBhbmVsX3JlczsKIAl1OCBjYXBhY2l0eV9yZXM7CiAJdTggc2Vuc29yX2lkOwotCXUxNiB4OwotCXUxNiB5OwogfTsKIAogLyoKQEAgLTg3LDkgKzg4LDE0IEBACiAJY2hhciBwaHlzWzMyXTsKIAlpbnQgdHlwZTsKIAl1bnNpZ25lZCBpbnQgcGt0bGVuOworCXUxNiBtYXhfdG91Y2hfeDsKKwl1MTYgbWF4X3RvdWNoX3k7CisJdTE2IG1heF9wZW5feDsKKwl1MTYgbWF4X3Blbl95OworCWNoYXIgbmFtZVs2NF07CiB9OwogCi1zdGF0aWMgdm9pZCBwYXJzZV9kYXRhKHU4ICpkYXRhLCBzdHJ1Y3QgdzgwMDFfY29vcmQgKmNvb3JkKQorc3RhdGljIHZvaWQgcGFyc2VfcGVuX2RhdGEodTggKmRhdGEsIHN0cnVjdCB3ODAwMV9jb29yZCAqY29vcmQpCiB7CiAJbWVtc2V0KGNvb3JkLCAwLCBzaXplb2YoKmNvb3JkKSk7CiAKQEAgLTExMywxMSArMTE5LDMwIEBACiAJY29vcmQtPnRpbHRfeSA9IGRhdGFbOF0gJiAweDdGOwogfQogCi1zdGF0aWMgdm9pZCBwYXJzZV90b3VjaChzdHJ1Y3QgdzgwMDEgKnc4MDAxKQorc3RhdGljIHZvaWQgcGFyc2Vfc2luZ2xlX3RvdWNoKHU4ICpkYXRhLCBzdHJ1Y3QgdzgwMDFfY29vcmQgKmNvb3JkKQoreworCWNvb3JkLT54ID0gKGRhdGFbMV0gPDwgNykgfCBkYXRhWzJdOworCWNvb3JkLT55ID0gKGRhdGFbM10gPDwgNykgfCBkYXRhWzRdOworCWNvb3JkLT50c3cgPSBkYXRhWzBdICYgMHgwMTsKK30KKworc3RhdGljIHZvaWQgc2NhbGVfdG91Y2hfY29vcmRpbmF0ZXMoc3RydWN0IHc4MDAxICp3ODAwMSwKKwkJCQkgICAgdW5zaWduZWQgaW50ICp4LCB1bnNpZ25lZCBpbnQgKnkpCit7CisJaWYgKHc4MDAxLT5tYXhfcGVuX3ggJiYgdzgwMDEtPm1heF90b3VjaF94KQorCQkqeCA9ICp4ICogdzgwMDEtPm1heF9wZW5feCAvIHc4MDAxLT5tYXhfdG91Y2hfeDsKKworCWlmICh3ODAwMS0+bWF4X3Blbl95ICYmIHc4MDAxLT5tYXhfdG91Y2hfeSkKKwkJKnkgPSAqeSAqIHc4MDAxLT5tYXhfcGVuX3kgLyB3ODAwMS0+bWF4X3RvdWNoX3k7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX211bHRpX3RvdWNoKHN0cnVjdCB3ODAwMSAqdzgwMDEpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gdzgwMDEtPmRldjsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdzgwMDEtPmRhdGE7CisJdW5zaWduZWQgaW50IHgsIHk7CiAJaW50IGk7CisJaW50IGNvdW50ID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJYm9vbCB0b3VjaCA9IGRhdGFbMF0gJiAoMSA8PCBpKTsKQEAgLTEyNSwxNSArMTUwLDI5IEBACiAJCWlucHV0X210X3Nsb3QoZGV2LCBpKTsKIAkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoZGV2LCBNVF9UT09MX0ZJTkdFUiwgdG91Y2gpOwogCQlpZiAodG91Y2gpIHsKLQkJCWludCB4ID0gKGRhdGFbNiAqIGkgKyAxXSA8PCA3KSB8IChkYXRhWzYgKiBpICsgMl0pOwotCQkJaW50IHkgPSAoZGF0YVs2ICogaSArIDNdIDw8IDcpIHwgKGRhdGFbNiAqIGkgKyA0XSk7CisJCQl4ID0gKGRhdGFbNiAqIGkgKyAxXSA8PCA3KSB8IGRhdGFbNiAqIGkgKyAyXTsKKwkJCXkgPSAoZGF0YVs2ICogaSArIDNdIDw8IDcpIHwgZGF0YVs2ICogaSArIDRdOwogCQkJLyogZGF0YVs1LDZdIGFuZCBbMTEsMTJdIGlzIGZpbmdlciBjYXBhY2l0eSAqLwogCisJCQkvKiBzY2FsZSB0byBwZW4gbWF4aW11bSAqLworCQkJc2NhbGVfdG91Y2hfY29vcmRpbmF0ZXModzgwMDEsICZ4LCAmeSk7CisKIAkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7CiAJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01UX1BPU0lUSU9OX1ksIHkpOworCQkJY291bnQrKzsKIAkJfQogCX0KIAorCS8qIGVtdWxhdGUgc2luZ2xlIHRvdWNoIGV2ZW50cyB3aGVuIHN0eWx1cyBpcyBvdXQgb2YgcHJveGltaXR5LgorCSAqIFRoaXMgaXMgdG8gbWFrZSBzaW5nbGUgdG91Y2ggYmFja3dhcmQgc3VwcG9ydCBjb25zaXN0ZW50CisJICogYWNyb3NzIGFsbCBXYWNvbSBzaW5nbGUgdG91Y2ggZGV2aWNlcy4KKwkgKi8KKwlpZiAodzgwMDEtPnR5cGUgIT0gQlROX1RPT0xfUEVOICYmCisJCQkgICAgdzgwMDEtPnR5cGUgIT0gQlROX1RPT0xfUlVCQkVSKSB7CisJCXc4MDAxLT50eXBlID0gY291bnQgPT0gMSA/IEJUTl9UT09MX0ZJTkdFUiA6IEtFWV9SRVNFUlZFRDsKKwkJaW5wdXRfbXRfcmVwb3J0X3BvaW50ZXJfZW11bGF0aW9uKGRldiwgdHJ1ZSk7CisJfQorCiAJaW5wdXRfc3luYyhkZXYpOwogfQogCkBAIC0xNTIsNiArMTkxLDE1IEBACiAJcXVlcnktPnkgPSBkYXRhWzVdIDw8IDk7CiAJcXVlcnktPnkgfD0gZGF0YVs2XSA8PCAyOwogCXF1ZXJ5LT55IHw9IChkYXRhWzJdID4+IDMpICYgMHgzOworCisJLyogRWFybHkgZGF5cycgc2luZ2xlLWZpbmdlciB0b3VjaCBtb2RlbHMgbmVlZCB0aGUgZm9sbG93aW5nIGRlZmF1bHRzICovCisJaWYgKCFxdWVyeS0+eCAmJiAhcXVlcnktPnkpIHsKKwkJcXVlcnktPnggPSAxMDI0OworCQlxdWVyeS0+eSA9IDEwMjQ7CisJCWlmIChxdWVyeS0+cGFuZWxfcmVzKQorCQkJcXVlcnktPnggPSBxdWVyeS0+eSA9ICgxIDw8IHF1ZXJ5LT5wYW5lbF9yZXMpOworCQlxdWVyeS0+cGFuZWxfcmVzID0gMTA7CisJfQogfQogCiBzdGF0aWMgdm9pZCByZXBvcnRfcGVuX2V2ZW50cyhzdHJ1Y3QgdzgwMDEgKnc4MDAxLCBzdHJ1Y3QgdzgwMDFfY29vcmQgKmNvb3JkKQpAQCAtMTYxLDE2ICsyMDksMTUgQEAKIAkvKgogCSAqIFdlIGhhdmUgMSBiaXQgZm9yIHByb3hpbWl0eSAocmR5KSBhbmQgMyBiaXRzIGZvciB0aXAsIHNpZGUsCiAJICogc2lkZTIvZXJhc2VyLiBJZiByZHkgJiYgZjIgYXJlIHNldCwgdGhpcyBjYW4gYmUgZWl0aGVyIHBlbiArIHNpZGUyLAotCSAqIG9yIGVyYXNlci4gYXNzdW1lCisJICogb3IgZXJhc2VyLiBBc3N1bWU6CiAJICogLSBpZiBkZXYgaXMgYWxyZWFkeSBpbiBwcm94aW1pdHkgYW5kIGYyIGlzIHRvZ2dsZWQg4oaSIHBlbiArIHNpZGUyCiAJICogLSBpZiBkZXYgY29tZXMgaW50byBwcm94aW1pdHkgd2l0aCBmMiBzZXQg4oaSIGVyYXNlcgogCSAqIElmIGYyIGRpc2FwcGVhcnMgYWZ0ZXIgYXNzdW1pbmcgZXJhc2VyLCBmYWtlIHByb3hpbWl0eSBvdXQgZm9yCiAJICogZXJhc2VyIGFuZCBpbiBmb3IgcGVuLgogCSAqLwogCi0JaWYgKCF3ODAwMS0+dHlwZSkgewotCQl3ODAwMS0+dHlwZSA9IGNvb3JkLT5mMiA/IEJUTl9UT09MX1JVQkJFUiA6IEJUTl9UT09MX1BFTjsKLQl9IGVsc2UgaWYgKHc4MDAxLT50eXBlID09IEJUTl9UT09MX1JVQkJFUikgeworCXN3aXRjaCAodzgwMDEtPnR5cGUpIHsKKwljYXNlIEJUTl9UT09MX1JVQkJFUjoKIAkJaWYgKCFjb29yZC0+ZjIpIHsKIAkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIDApOwogCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMCk7CkBAIC0xODAsOCArMjI3LDIxIEBACiAJCQlpbnB1dF9zeW5jKGRldik7CiAJCQl3ODAwMS0+dHlwZSA9IEJUTl9UT09MX1BFTjsKIAkJfQotCX0gZWxzZSB7CisJCWJyZWFrOworCisJY2FzZSBCVE5fVE9PTF9GSU5HRVI6CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIDApOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCAwKTsKKwkJaW5wdXRfc3luYyhkZXYpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgS0VZX1JFU0VSVkVEOgorCQl3ODAwMS0+dHlwZSA9IGNvb3JkLT5mMiA/IEJUTl9UT09MX1JVQkJFUiA6IEJUTl9UT09MX1BFTjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIGNvb3JkLT5mMik7CisJCWJyZWFrOwogCX0KIAogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgY29vcmQtPngpOwpAQCAtMTkzLDcgKzI1MywyNiBAQAogCWlucHV0X3N5bmMoZGV2KTsKIAogCWlmICghY29vcmQtPnJkeSkKLQkJdzgwMDEtPnR5cGUgPSAwOworCQl3ODAwMS0+dHlwZSA9IEtFWV9SRVNFUlZFRDsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X3NpbmdsZV90b3VjaChzdHJ1Y3QgdzgwMDEgKnc4MDAxLCBzdHJ1Y3QgdzgwMDFfY29vcmQgKmNvb3JkKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHc4MDAxLT5kZXY7CisJdW5zaWduZWQgaW50IHggPSBjb29yZC0+eDsKKwl1bnNpZ25lZCBpbnQgeSA9IGNvb3JkLT55OworCisJLyogc2NhbGUgdG8gcGVuIG1heGltdW0gKi8KKwlzY2FsZV90b3VjaF9jb29yZGluYXRlcyh3ODAwMSwgJngsICZ5KTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBjb29yZC0+dHN3KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCBjb29yZC0+dHN3KTsKKworCWlucHV0X3N5bmMoZGV2KTsKKworCXc4MDAxLT50eXBlID0gY29vcmQtPnRzdyA/IEJUTl9UT09MX0ZJTkdFUiA6IEtFWV9SRVNFUlZFRDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHc4MDAxX2ludGVycnVwdChzdHJ1Y3Qgc2VyaW8gKnNlcmlvLApAQCAtMjE0LDkgKzI5MywxOCBAQAogCiAJY2FzZSBXODAwMV9QS1RMRU5fVE9VQ0g5MyAtIDE6CiAJY2FzZSBXODAwMV9QS1RMRU5fVE9VQ0g5QSAtIDE6Ci0JCS8qIGlnbm9yZSBvbmUtZmluZ2VyIHRvdWNoIHBhY2tldC4gKi8KLQkJaWYgKHc4MDAxLT5wa3RsZW4gPT0gdzgwMDEtPmlkeCkKKwkJdG1wID0gdzgwMDEtPmRhdGFbMF0gJiBXODAwMV9UT1VDSF9CWVRFOworCQlpZiAodG1wICE9IFc4MDAxX1RPVUNIX0JZVEUpCisJCQlicmVhazsKKworCQlpZiAodzgwMDEtPnBrdGxlbiA9PSB3ODAwMS0+aWR4KSB7CiAJCQl3ODAwMS0+aWR4ID0gMDsKKwkJCWlmICh3ODAwMS0+dHlwZSAhPSBCVE5fVE9PTF9QRU4gJiYKKwkJCSAgICB3ODAwMS0+dHlwZSAhPSBCVE5fVE9PTF9SVUJCRVIpIHsKKwkJCQlwYXJzZV9zaW5nbGVfdG91Y2godzgwMDEtPmRhdGEsICZjb29yZCk7CisJCQkJcmVwb3J0X3NpbmdsZV90b3VjaCh3ODAwMSwgJmNvb3JkKTsKKwkJCX0KKwkJfQogCQlicmVhazsKIAogCS8qIFBlbiBjb29yZGluYXRlcyBwYWNrZXQgKi8KQEAgLTIyNSwxOCArMzEzLDE4IEBACiAJCWlmICh1bmxpa2VseSh0bXAgPT0gVzgwMDFfVEFCX0JZVEUpKQogCQkJYnJlYWs7CiAKLQkJdG1wID0gKHc4MDAxLT5kYXRhWzBdICYgVzgwMDFfVE9VQ0hfQllURSk7CisJCXRtcCA9IHc4MDAxLT5kYXRhWzBdICYgVzgwMDFfVE9VQ0hfQllURTsKIAkJaWYgKHRtcCA9PSBXODAwMV9UT1VDSF9CWVRFKQogCQkJYnJlYWs7CiAKIAkJdzgwMDEtPmlkeCA9IDA7Ci0JCXBhcnNlX2RhdGEodzgwMDEtPmRhdGEsICZjb29yZCk7CisJCXBhcnNlX3Blbl9kYXRhKHc4MDAxLT5kYXRhLCAmY29vcmQpOwogCQlyZXBvcnRfcGVuX2V2ZW50cyh3ODAwMSwgJmNvb3JkKTsKIAkJYnJlYWs7CiAKIAkvKiBjb250cm9sIHBhY2tldCAqLwogCWNhc2UgVzgwMDFfUEtUTEVOX1RQQ0NUTCAtIDE6Ci0JCXRtcCA9ICh3ODAwMS0+ZGF0YVswXSAmIFc4MDAxX1RPVUNIX01BU0spOworCQl0bXAgPSB3ODAwMS0+ZGF0YVswXSAmIFc4MDAxX1RPVUNIX01BU0s7CiAJCWlmICh0bXAgPT0gVzgwMDFfVE9VQ0hfQllURSkKIAkJCWJyZWFrOwogCkBAIC0yNDksNyArMzM3LDcgQEAKIAkvKiAyIGZpbmdlciB0b3VjaCBwYWNrZXQgKi8KIAljYXNlIFc4MDAxX1BLVExFTl9UT1VDSDJGRyAtIDE6CiAJCXc4MDAxLT5pZHggPSAwOwotCQlwYXJzZV90b3VjaCh3ODAwMSk7CisJCXBhcnNlX211bHRpX3RvdWNoKHc4MDAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNzksNiArMzY3LDcgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSB3ODAwMS0+ZGV2OwogCXN0cnVjdCB3ODAwMV9jb29yZCBjb29yZDsKKwlzdHJ1Y3QgdzgwMDFfdG91Y2hfcXVlcnkgdG91Y2g7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfU1RPUCwgZmFsc2UpOwpAQCAtMjg3LDE0ICszNzYsMjEgQEAKIAogCW1zbGVlcCgyNTApOwkvKiB3YWl0IDI1MG1zIGJlZm9yZSBxdWVyeWluZyB0aGUgZGV2aWNlICovCiAKKwlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJc3RybGNhdCh3ODAwMS0+bmFtZSwgIldhY29tIFNlcmlhbCIsIHNpemVvZih3ODAwMS0+bmFtZSkpOworCiAJLyogcGVuYWJsZWQ/ICovCiAJZXJyb3IgPSB3ODAwMV9jb21tYW5kKHc4MDAxLCBXODAwMV9DTURfUVVFUlksIHRydWUpOwogCWlmICghZXJyb3IpIHsKKwkJX19zZXRfYml0KEJUTl9UT1VDSCwgZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX1RPT0xfUEVOLCBkZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fVE9PTF9SVUJCRVIsIGRldi0+a2V5Yml0KTsKIAkJX19zZXRfYml0KEJUTl9TVFlMVVMsIGRldi0+a2V5Yml0KTsKIAkJX19zZXRfYml0KEJUTl9TVFlMVVMyLCBkZXYtPmtleWJpdCk7Ci0JCXBhcnNlX2RhdGEodzgwMDEtPnJlc3BvbnNlLCAmY29vcmQpOworCisJCXBhcnNlX3Blbl9kYXRhKHc4MDAxLT5yZXNwb25zZSwgJmNvb3JkKTsKKwkJdzgwMDEtPm1heF9wZW5feCA9IGNvb3JkLng7CisJCXc4MDAxLT5tYXhfcGVuX3kgPSBjb29yZC55OwogCiAJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1gsIDAsIGNvb3JkLngsIDAsIDApOwogCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYsIEFCU19ZLCAwLCBjb29yZC55LCAwLCAwKTsKQEAgLTMwMyw2ICszOTksOCBAQAogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVElMVF9YLCAwLCBjb29yZC50aWx0X3gsIDAsIDApOwogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfVElMVF9ZLCAwLCBjb29yZC50aWx0X3ksIDAsIDApOwogCQl9CisJCXc4MDAxLT5pZCA9IDB4OTA7CisJCXN0cmxjYXQodzgwMDEtPm5hbWUsICIgUGVuYWJsZWQiLCBzaXplb2YodzgwMDEtPm5hbWUpKTsKIAl9CiAKIAkvKiBUb3VjaCBlbmFibGVkPyAqLwpAQCAtMzEzLDI0ICs0MTEsMzggQEAKIAkgKiBzZWNvbmQgYnl0ZSBpcyBlbXB0eSwgd2hpY2ggaW5kaWNhdGVzIHRvdWNoIGlzIG5vdCBzdXBwb3J0ZWQuCiAJICovCiAJaWYgKCFlcnJvciAmJiB3ODAwMS0+cmVzcG9uc2VbMV0pIHsKLQkJc3RydWN0IHc4MDAxX3RvdWNoX3F1ZXJ5IHRvdWNoOworCQlfX3NldF9iaXQoQlROX1RPVUNILCBkZXYtPmtleWJpdCk7CisJCV9fc2V0X2JpdChCVE5fVE9PTF9GSU5HRVIsIGRldi0+a2V5Yml0KTsKIAogCQlwYXJzZV90b3VjaHF1ZXJ5KHc4MDAxLT5yZXNwb25zZSwgJnRvdWNoKTsKKwkJdzgwMDEtPm1heF90b3VjaF94ID0gdG91Y2gueDsKKwkJdzgwMDEtPm1heF90b3VjaF95ID0gdG91Y2gueTsKKworCQkvKiBzY2FsZSB0byBwZW4gbWF4aW11bSAqLworCQlpZiAodzgwMDEtPm1heF9wZW5feCAmJiB3ODAwMS0+bWF4X3Blbl95KSB7CisJCQl0b3VjaC54ID0gdzgwMDEtPm1heF9wZW5feDsKKwkJCXRvdWNoLnkgPSB3ODAwMS0+bWF4X3Blbl95OworCQl9CiAKIAkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfWCwgMCwgdG91Y2gueCwgMCwgMCk7CiAJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX1ksIDAsIHRvdWNoLnksIDAsIDApOwotCQlfX3NldF9iaXQoQlROX1RPT0xfRklOR0VSLCBkZXYtPmtleWJpdCk7CiAKIAkJc3dpdGNoICh0b3VjaC5zZW5zb3JfaWQpIHsKIAkJY2FzZSAwOgogCQljYXNlIDI6CiAJCQl3ODAwMS0+cGt0bGVuID0gVzgwMDFfUEtUTEVOX1RPVUNIOTM7CisJCQl3ODAwMS0+aWQgPSAweDkzOworCQkJc3RybGNhdCh3ODAwMS0+bmFtZSwgIiAxRkciLCBzaXplb2YodzgwMDEtPm5hbWUpKTsKIAkJCWJyZWFrOworCiAJCWNhc2UgMToKIAkJY2FzZSAzOgogCQljYXNlIDQ6CiAJCQl3ODAwMS0+cGt0bGVuID0gVzgwMDFfUEtUTEVOX1RPVUNIOUE7CisJCQlzdHJsY2F0KHc4MDAxLT5uYW1lLCAiIDFGRyIsIHNpemVvZih3ODAwMS0+bmFtZSkpOworCQkJdzgwMDEtPmlkID0gMHg5YTsKIAkJCWJyZWFrOworCiAJCWNhc2UgNToKIAkJCXc4MDAxLT5wa3RsZW4gPSBXODAwMV9QS1RMRU5fVE9VQ0gyRkc7CiAKQEAgLTM0MSwxMCArNDUzLDE4IEBACiAJCQkJCQkwLCB0b3VjaC55LCAwLCAwKTsKIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldiwgQUJTX01UX1RPT0xfVFlQRSwKIAkJCQkJCTAsIE1UX1RPT0xfTUFYLCAwLCAwKTsKKworCQkJc3RybGNhdCh3ODAwMS0+bmFtZSwgIiAyRkciLCBzaXplb2YodzgwMDEtPm5hbWUpKTsKKwkJCWlmICh3ODAwMS0+bWF4X3Blbl94ICYmIHc4MDAxLT5tYXhfcGVuX3kpCisJCQkJdzgwMDEtPmlkID0gMHhFMzsKKwkJCWVsc2UKKwkJCQl3ODAwMS0+aWQgPSAweEUyOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKKwlzdHJsY2F0KHc4MDAxLT5uYW1lLCAiIFRvdWNoc2NyZWVuIiwgc2l6ZW9mKHc4MDAxLT5uYW1lKSk7CisKIAlyZXR1cm4gdzgwMDFfY29tbWFuZCh3ODAwMSwgVzgwMDFfQ01EX1NUQVJULCBmYWxzZSk7CiB9CiAKQEAgLTM4NCwyMiArNTA0LDEwIEBACiAJfQogCiAJdzgwMDEtPnNlcmlvID0gc2VyaW87Ci0JdzgwMDEtPmlkID0gc2VyaW8tPmlkLmlkOwogCXc4MDAxLT5kZXYgPSBpbnB1dF9kZXY7CiAJaW5pdF9jb21wbGV0aW9uKCZ3ODAwMS0+Y21kX2RvbmUpOwogCXNucHJpbnRmKHc4MDAxLT5waHlzLCBzaXplb2YodzgwMDEtPnBoeXMpLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwogCi0JaW5wdXRfZGV2LT5uYW1lID0gIldhY29tIFc4MDAxIFBlbmFibGVkIFNlcmlhbCBUb3VjaFNjcmVlbiI7Ci0JaW5wdXRfZGV2LT5waHlzID0gdzgwMDEtPnBoeXM7Ci0JaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1JTMjMyOwotCWlucHV0X2Rldi0+aWQudmVuZG9yID0gU0VSSU9fVzgwMDE7Ci0JaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gdzgwMDEtPmlkOwotCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmc2VyaW8tPmRldjsKLQotCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKLQlfX3NldF9iaXQoQlROX1RPVUNILCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0KIAlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgdzgwMDEpOwogCWVyciA9IHNlcmlvX29wZW4oc2VyaW8sIGRydik7CiAJaWYgKGVycikKQEAgLTQwOSw2ICs1MTcsMTQgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWwzOwogCisJaW5wdXRfZGV2LT5uYW1lID0gdzgwMDEtPm5hbWU7CisJaW5wdXRfZGV2LT5waHlzID0gdzgwMDEtPnBoeXM7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gdzgwMDEtPmlkOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19SUzIzMjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4MDU2YTsKKwlpbnB1dF9kZXYtPmlkLnZlcnNpb24gPSAweDAxMDA7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnNlcmlvLT5kZXY7CisKIAllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodzgwMDEtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmYWlsMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCmluZGV4IDE3ODk0MmEuLjhhM2M1Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYwpAQCAtMjMxOCw3ICsyMzE4LDcgQEAKIAkJIF9fZnVuY19fLCBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkJIGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSk7CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWNzID0gZ2lnYXNldF9pbml0Y3MoZHJpdmVyLCBCQVNfQ0hBTk5FTFMsIDAsIDAsIGNpZG1vZGUsCiAJCQkgICAgR0lHQVNFVF9NT0RVTEVOQU1FKTsKIAlpZiAoIWNzKQpAQCAtMjU3Niw3ICsyNTc2LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZHJpdmVyIHN0YXRlIGFuZCBpbnRpYWxpemUgaXQgKi8KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkcml2ZXIgc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkcml2ZXIgPSBnaWdhc2V0X2luaXRkcml2ZXIoR0lHQVNFVF9NSU5PUiwgR0lHQVNFVF9NSU5PUlMsCiAJCQkJICAgIEdJR0FTRVRfTU9EVUxFTkFNRSwgR0lHQVNFVF9ERVZOQU1FLAogCQkJCSAgICAmZ2lnb3BzLCBUSElTX01PRFVMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvc2VyLWdpZ2FzZXQuYwppbmRleCBkMTUxZGNiLi4wZWYwOWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9zZXItZ2lnYXNldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L3Nlci1naWdhc2V0LmMKQEAgLTUxMyw3ICs1MTMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWNzID0gZ2lnYXNldF9pbml0Y3MoZHJpdmVyLCAxLCAxLCAwLCBjaWRtb2RlLCBHSUdBU0VUX01PRFVMRU5BTUUpOwogCWlmICghY3MpCiAJCWdvdG8gZXJyb3I7CkBAIC03NzEsNyArNzcxLDcgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRyaXZlciBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZHJpdmVyIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZHJpdmVyID0gZ2lnYXNldF9pbml0ZHJpdmVyKEdJR0FTRVRfTUlOT1IsIEdJR0FTRVRfTUlOT1JTLAogCQkJCQkgIEdJR0FTRVRfTU9EVUxFTkFNRSwgR0lHQVNFVF9ERVZOQU1FLAogCQkJCQkgICZvcHMsIFRISVNfTU9EVUxFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC91c2ItZ2lnYXNldC5jCmluZGV4IDRhNjYzMzguLjVlMzMwMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L3VzYi1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvdXNiLWdpZ2FzZXQuYwpAQCAtNjk1LDcgKzY5NSw3IEBACiAKIAlkZXZfaW5mbygmdWRldi0+ZGV2LCAiJXM6IERldmljZSBtYXRjaGVkIC4uLiAhXG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGludGlhbGl6ZSBpdCAqLworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWNzID0gZ2lnYXNldF9pbml0Y3MoZHJpdmVyLCAxLCAxLCAwLCBjaWRtb2RlLCBHSUdBU0VUX01PRFVMRU5BTUUpOwogCWlmICghY3MpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtODk0LDcgKzg5NCw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRyaXZlciBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZHJpdmVyIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZHJpdmVyID0gZ2lnYXNldF9pbml0ZHJpdmVyKEdJR0FTRVRfTUlOT1IsIEdJR0FTRVRfTUlOT1JTLAogCQkJCSAgICBHSUdBU0VUX01PRFVMRU5BTUUsIEdJR0FTRVRfREVWTkFNRSwKIAkJCQkgICAgJm9wcywgVEhJU19NT0RVTEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2lwYWMuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9pcGFjLmgKaW5kZXggNzRhNmNjZi4uODEyMWUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2lwYWMuaAorKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaXBhYy5oCkBAIC0yOSw3ICsyOSw3IEBACiAJdTMyCQkJdHlwZTsKIAl1MzIJCQlvZmY7CQkvKiBvZmZzZXQgdG8gaXNhYyByZWdzICovCiAJY2hhcgkJCSpuYW1lOwotCXNwaW5sb2NrX3QJCSpod2xvY2s7CS8qIGxvY2sgSFcgYWNjY2VzcyAqLworCXNwaW5sb2NrX3QJCSpod2xvY2s7CS8qIGxvY2sgSFcgYWNjZXNzICovCiAJcmVhZF9yZWdfZnVuYwkJKnJlYWRfcmVnOwogCXdyaXRlX3JlZ19mdW5jCQkqd3JpdGVfcmVnOwogCWZpZm9fZnVuYwkJKnJlYWRfZmlmbzsKQEAgLTcwLDcgKzcwLDcgQEAKIAlzdHJ1Y3QgaHNjeF9odwkJaHNjeFsyXTsKIAljaGFyCQkJKm5hbWU7CiAJdm9pZAkJCSpodzsKLQlzcGlubG9ja190CQkqaHdsb2NrOwkvKiBsb2NrIEhXIGFjY2Nlc3MgKi8KKwlzcGlubG9ja190CQkqaHdsb2NrOwkvKiBsb2NrIEhXIGFjY2VzcyAqLwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKIAl1MzIJCQl0eXBlOwogCXJlYWRfcmVnX2Z1bmMJCSpyZWFkX3JlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9pc2FyLmggYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaXNhci5oCmluZGV4IDRhMTM0YWMuLjk5NjJiZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9pc2FyLmgKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2lzYXIuaApAQCAtNDQsNyArNDQsNyBAQAogc3RydWN0IGlzYXJfaHcgewogCXN0cnVjdAlpc2FyX2NoCWNoWzJdOwogCXZvaWQJCSpodzsKLQlzcGlubG9ja190CSpod2xvY2s7CS8qIGxvY2sgSFcgYWNjY2VzcyAqLworCXNwaW5sb2NrX3QJKmh3bG9jazsJLyogbG9jayBIVyBhY2Nlc3MgKi8KIAljaGFyCQkqbmFtZTsKIAlzdHJ1Y3QgbW9kdWxlCSpvd25lcjsKIAlyZWFkX3JlZ19mdW5jCSpyZWFkX3JlZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NteC5jCmluZGV4IDc2ZDllNjcuLjMwOWJhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYwpAQCAtMTEyLDcgKzExMiw3IEBACiAgKiBEaXNhYmxlIHJ4LWRhdGE6CiAgKiBJZiBjbXggaXMgcmVhbGl6ZWQgaW4gaGFyZHdhcmUsIHJ4IGRhdGEgd2lsbCBiZSBkaXNhYmxlZCBpZiByZXF1ZXN0ZWQgYnkKICAqIHRoZSB1cHBlciBsYXllci4gSWYgZHRtZiBkZWNvZGluZyBpcyBkb25lIGJ5IHNvZnR3YXJlIGFuZCBlbmFibGVkLCByeCBkYXRhCi0gKiB3aWxsIG5vdCBiZSBkaWFibGVkIGJ1dCBibG9ja2VkIHRvIHRoZSB1cHBlciBsYXllci4KKyAqIHdpbGwgbm90IGJlIGRpc2FibGVkIGJ1dCBibG9ja2VkIHRvIHRoZSB1cHBlciBsYXllci4KICAqCiAgKiBIRkMgY29uZmVyZW5jZSBlbmdpbmU6CiAgKiBJZiBpdCBpcyBwb3NzaWJsZSB0byByZWFsaXplIGFsbCBmZWF0dXJlcyB1c2luZyBoYXJkd2FyZSwgaGFyZHdhcmUgd2lsbCBiZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwppbmRleCAzM2ZhY2QwLi44MGEzYWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjEuYwpAQCAtOTgsNyArOTgsNiBAQAogI2RlZmluZSBMUDU1MjFfRVhUX0NMS19VU0VECQkweDA4CiAKIHN0cnVjdCBscDU1MjFfZW5naW5lIHsKLQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyaWJ1dGVzOwogCWludAkJaWQ7CiAJdTgJCW1vZGU7CiAJdTgJCXByb2dfcGFnZTsKQEAgLTIyNSwyNSArMjI0LDIyIEBACiAJCSAgICBjdXJyKTsKIH0KIAotc3RhdGljIHZvaWQgbHA1NTIxX2luaXRfZW5naW5lKHN0cnVjdCBscDU1MjFfY2hpcCAqY2hpcCwKLQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXApCitzdGF0aWMgdm9pZCBscDU1MjFfaW5pdF9lbmdpbmUoc3RydWN0IGxwNTUyMV9jaGlwICpjaGlwKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoaXAtPmVuZ2luZXMpOyBpKyspIHsKIAkJY2hpcC0+ZW5naW5lc1tpXS5pZCA9IGkgKyAxOwogCQljaGlwLT5lbmdpbmVzW2ldLmVuZ2luZV9tYXNrID0gTFA1NTIxX0VOR19NQVNLX0JBU0UgPj4gKGkgKiAyKTsKIAkJY2hpcC0+ZW5naW5lc1tpXS5wcm9nX3BhZ2UgPSBpOwotCQljaGlwLT5lbmdpbmVzW2ldLmF0dHJpYnV0ZXMgPSAmYXR0cl9ncm91cFtpXTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbHA1NTIxX2NvbmZpZ3VyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cCkKK3N0YXRpYyBpbnQgbHA1NTIxX2NvbmZpZ3VyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBscDU1MjFfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCByZXQ7CiAKLQlscDU1MjFfaW5pdF9lbmdpbmUoY2hpcCwgYXR0cl9ncm91cCk7CisJbHA1NTIxX2luaXRfZW5naW5lKGNoaXApOwogCiAJLyogU2V0IGFsbCBQV01zIHRvIGRpcmVjdCBjb250cm9sIG1vZGUgKi8KIAlyZXQgPSBscDU1MjFfd3JpdGUoY2xpZW50LCBMUDU1MjFfUkVHX09QX01PREUsIDB4M0YpOwpAQCAtMzI5LDkgKzMyNSw2IEBACiAvKiBTZXQgZW5naW5lIG1vZGUgYW5kIGNyZWF0ZSBhcHByb3ByaWF0ZSBzeXNmcyBhdHRyaWJ1dGVzLCBpZiByZXF1aXJlZC4gKi8KIHN0YXRpYyBpbnQgbHA1NTIxX3NldF9tb2RlKHN0cnVjdCBscDU1MjFfZW5naW5lICplbmdpbmUsIHU4IG1vZGUpCiB7Ci0Jc3RydWN0IGxwNTUyMV9jaGlwICpjaGlwID0gZW5naW5lX3RvX2xwNTUyMShlbmdpbmUpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCWludCByZXQgPSAwOwogCiAJLyogaWYgaW4gdGhhdCBtb2RlIGFscmVhZHkgZG8gbm90aGluZywgZXhjZXB0IGZvciBydW4gKi8KQEAgLTM0MywxOCArMzM2LDEwIEBACiAJfSBlbHNlIGlmIChtb2RlID09IExQNTUyMV9DTURfTE9BRCkgewogCQlscDU1MjFfc2V0X2VuZ2luZV9tb2RlKGVuZ2luZSwgTFA1NTIxX0NNRF9ESVNBQkxFRCk7CiAJCWxwNTUyMV9zZXRfZW5naW5lX21vZGUoZW5naW5lLCBMUDU1MjFfQ01EX0xPQUQpOwotCi0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCBlbmdpbmUtPmF0dHJpYnV0ZXMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gTFA1NTIxX0NNRF9ESVNBQkxFRCkgewogCQlscDU1MjFfc2V0X2VuZ2luZV9tb2RlKGVuZ2luZSwgTFA1NTIxX0NNRF9ESVNBQkxFRCk7CiAJfQogCi0JLyogcmVtb3ZlIGxvYWQgYXR0cmlidXRlIGZyb20gc3lzZnMgaWYgbm90IGluIGxvYWQgbW9kZSAqLwotCWlmIChlbmdpbmUtPm1vZGUgPT0gTFA1NTIxX0NNRF9MT0FEICYmIG1vZGUgIT0gTFA1NTIxX0NNRF9MT0FEKQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZW5naW5lLT5hdHRyaWJ1dGVzKTsKLQogCWVuZ2luZS0+bW9kZSA9IG1vZGU7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzczLDYgKzM1OCw4IEBACiAJd2hpbGUgKChvZmZzZXQgPCBsZW4gLSAxKSAmJiAoaSA8IExQNTUyMV9QUk9HUkFNX0xFTkdUSCkpIHsKIAkJLyogc2VwYXJhdGUgc3NjYW5mcyBiZWNhdXNlIGxlbmd0aCBpcyB3b3JraW5nIG9ubHkgZm9yICVzICovCiAJCXJldCA9IHNzY2FuZihidWYgKyBvZmZzZXQsICIlMnMlbiAiLCBjLCAmbnJjaGFycyk7CisJCWlmIChyZXQgIT0gMikKKwkJCWdvdG8gZmFpbDsKIAkJcmV0ID0gc3NjYW5mKGMsICIlMngiLCAmY21kKTsKIAkJaWYgKHJldCAhPSAxKQogCQkJZ290byBmYWlsOwpAQCAtMzg3LDcgKzM3NCwxMCBAQAogCQlnb3RvIGZhaWw7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKLQlyZXQgPSBscDU1MjFfbG9hZF9wcm9ncmFtKGVuZ2luZSwgcGF0dGVybik7CisJaWYgKGVuZ2luZS0+bW9kZSA9PSBMUDU1MjFfQ01EX0xPQUQpCisJCXJldCA9IGxwNTUyMV9sb2FkX3Byb2dyYW0oZW5naW5lLCBwYXR0ZXJuKTsKKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKIAogCWlmIChyZXQpIHsKQEAgLTU3NCwyMCArNTY0LDggQEAKIAkmZGV2X2F0dHJfZW5naW5lMl9tb2RlLmF0dHIsCiAJJmRldl9hdHRyX2VuZ2luZTNfbW9kZS5hdHRyLAogCSZkZXZfYXR0cl9zZWxmdGVzdC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpscDU1MjFfZW5naW5lMV9hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2VuZ2luZTFfbG9hZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpscDU1MjFfZW5naW5lMl9hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2VuZ2luZTJfbG9hZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpscDU1MjFfZW5naW5lM19hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2VuZ2luZTNfbG9hZC5hdHRyLAogCU5VTEwKIH07CkBAIC01OTYsMTIgKzU3NCw2IEBACiAJLmF0dHJzID0gbHA1NTIxX2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscDU1MjFfZW5naW5lX2dyb3VwW10gPSB7Ci0Jey5hdHRycyA9IGxwNTUyMV9lbmdpbmUxX2F0dHJpYnV0ZXMgfSwKLQl7LmF0dHJzID0gbHA1NTIxX2VuZ2luZTJfYXR0cmlidXRlcyB9LAotCXsuYXR0cnMgPSBscDU1MjFfZW5naW5lM19hdHRyaWJ1dGVzIH0sCi19OwotCiBzdGF0aWMgaW50IGxwNTUyMV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKQEAgLTYxNiwxMiArNTg4LDYgQEAKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbHA1NTIxX2dyb3VwKTsKIAotCWZvciAoaSA9IDA7IGkgPCAgQVJSQVlfU0laRShjaGlwLT5lbmdpbmVzKTsgaSsrKSB7Ci0JCWlmIChjaGlwLT5lbmdpbmVzW2ldLm1vZGUgPT0gTFA1NTIxX0NNRF9MT0FEKQotCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosCi0JCQkJCWNoaXAtPmVuZ2luZXNbaV0uYXR0cmlidXRlcyk7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IGNoaXAtPm51bV9sZWRzOyBpKyspCiAJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2hpcC0+bGVkc1tpXS5jZGV2LmRldi0+a29iaiwKIAkJCQkmbHA1NTIxX2xlZF9hdHRyaWJ1dGVfZ3JvdXApOwpAQCAtNjUxLDcgKzYxNyw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOmNoYW5uZWwlZCIsIGNsaWVudC0+bmFtZSwgY2hhbik7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6Y2hhbm5lbCVkIiwKKwkJCXBkYXRhLT5sYWJlbCA/OiBjbGllbnQtPm5hbWUsIGNoYW4pOwogCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IGxwNTUyMV9zZXRfYnJpZ2h0bmVzczsKIAlsZWQtPmNkZXYubmFtZSA9IG5hbWU7CiAJcmVzID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKGRldiwgJmxlZC0+Y2Rldik7CkBAIC03MjMsNyArNjkwLDcgQEAKIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzIHByb2dyYW1tYWJsZSBsZWQgY2hpcCBmb3VuZFxuIiwgaWQtPm5hbWUpOwogCi0JcmV0ID0gbHA1NTIxX2NvbmZpZ3VyZShjbGllbnQsIGxwNTUyMV9lbmdpbmVfZ3JvdXApOworCXJldCA9IGxwNTUyMV9jb25maWd1cmUoY2xpZW50KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIGNvbmZpZ3VyaW5nIGNoaXBcbiIpOwogCQlnb3RvIGZhaWwyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA1NTIzLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYwppbmRleCAwY2M0ZWFkLi5kMGM0MDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDU1MjMuYwpAQCAtMTA1LDcgKzEwNSw2IEBACiAjZGVmaW5lIFNISUZUX01BU0soaWQpCQkJKCgoaWQpIC0gMSkgKiAyKQogCiBzdHJ1Y3QgbHA1NTIzX2VuZ2luZSB7Ci0JY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cmlidXRlczsKIAlpbnQJCWlkOwogCXU4CQltb2RlOwogCXU4CQlwcm9nX3BhZ2U7CkBAIC00MDMsMTQgKzQwMiwyMyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGxwNTUyM19jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdTE2IG11eCA9IDA7CisJc3NpemVfdCByZXQ7CiAKIAlpZiAobHA1NTIzX211eF9wYXJzZShidWYsICZtdXgsIGxlbikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGxwNTUyM19sb2FkX211eCgmY2hpcC0+ZW5naW5lc1tuciAtIDFdLCBtdXgpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChjaGlwLT5lbmdpbmVzW25yIC0gMV0ubW9kZSAhPSBMUDU1MjNfQ01EX0xPQUQpCisJCWdvdG8gbGVhdmU7CiAKLQlyZXR1cm4gbGVuOworCWlmIChscDU1MjNfbG9hZF9tdXgoJmNoaXAtPmVuZ2luZXNbbnIgLSAxXSwgbXV4KSkKKwkJZ290byBsZWF2ZTsKKworCXJldCA9IGxlbjsKK2xlYXZlOgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBzdG9yZV9sZWRzKG5yKQkJCQkJCVwKQEAgLTU1Niw3ICs1NjQsMTEgQEAKIAogCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwogCi0JcmV0ID0gbHA1NTIzX2xvYWRfcHJvZ3JhbShlbmdpbmUsIHBhdHRlcm4pOworCWlmIChlbmdpbmUtPm1vZGUgPT0gTFA1NTIzX0NNRF9MT0FEKQorCQlyZXQgPSBscDU1MjNfbG9hZF9wcm9ncmFtKGVuZ2luZSwgcGF0dGVybik7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKIAogCWlmIChyZXQpIHsKQEAgLTczNywzNyArNzQ5LDE4IEBACiAJJmRldl9hdHRyX2VuZ2luZTJfbW9kZS5hdHRyLAogCSZkZXZfYXR0cl9lbmdpbmUzX21vZGUuYXR0ciwKIAkmZGV2X2F0dHJfc2VsZnRlc3QuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbHA1NTIzX2VuZ2luZTFfYXR0cmlidXRlc1tdID0gewogCSZkZXZfYXR0cl9lbmdpbmUxX2xvYWQuYXR0ciwKIAkmZGV2X2F0dHJfZW5naW5lMV9sZWRzLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxwNTUyM19lbmdpbmUyX2F0dHJpYnV0ZXNbXSA9IHsKIAkmZGV2X2F0dHJfZW5naW5lMl9sb2FkLmF0dHIsCiAJJmRldl9hdHRyX2VuZ2luZTJfbGVkcy5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpscDU1MjNfZW5naW5lM19hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX2VuZ2luZTNfbG9hZC5hdHRyLAogCSZkZXZfYXR0cl9lbmdpbmUzX2xlZHMuYXR0ciwKLQlOVUxMCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscDU1MjNfZ3JvdXAgPSB7CiAJLmF0dHJzID0gbHA1NTIzX2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscDU1MjNfZW5naW5lX2dyb3VwW10gPSB7Ci0Jey5hdHRycyA9IGxwNTUyM19lbmdpbmUxX2F0dHJpYnV0ZXMgfSwKLQl7LmF0dHJzID0gbHA1NTIzX2VuZ2luZTJfYXR0cmlidXRlcyB9LAotCXsuYXR0cnMgPSBscDU1MjNfZW5naW5lM19hdHRyaWJ1dGVzIH0sCi19OwotCiBzdGF0aWMgaW50IGxwNTUyM19yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKQEAgLTc4OCwxMCArNzgxLDYgQEAKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCAmbHA1NTIzX2dyb3VwKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoaXAtPmVuZ2luZXMpOyBpKyspCi0JCWlmIChjaGlwLT5lbmdpbmVzW2ldLm1vZGUgPT0gTFA1NTIzX0NNRF9MT0FEKQotCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZscDU1MjNfZW5naW5lX2dyb3VwW2ldKTsKLQogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fbGVkczsgaSsrKQogCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNoaXAtPmxlZHNbaV0uY2Rldi5kZXYtPmtvYmosCiAJCQkJJmxwNTUyM19sZWRfYXR0cmlidXRlX2dyb3VwKTsKQEAgLTgwMiwxMCArNzkxLDYgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCBscDU1MjNfc2V0X21vZGUoc3RydWN0IGxwNTUyM19lbmdpbmUgKmVuZ2luZSwgdTggbW9kZSkKIHsKLQkvKiAgZW5naW5lIHRvIGNoaXAgKi8KLQlzdHJ1Y3QgbHA1NTIzX2NoaXAgKmNoaXAgPSBlbmdpbmVfdG9fbHA1NTIzKGVuZ2luZSk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBpZiBpbiB0aGF0IG1vZGUgYWxyZWFkeSBkbyBub3RoaW5nLCBleGNlcHQgZm9yIHJ1biAqLwpAQCAtODE3LDE4ICs4MDIsMTAgQEAKIAl9IGVsc2UgaWYgKG1vZGUgPT0gTFA1NTIzX0NNRF9MT0FEKSB7CiAJCWxwNTUyM19zZXRfZW5naW5lX21vZGUoZW5naW5lLCBMUDU1MjNfQ01EX0RJU0FCTEVEKTsKIAkJbHA1NTIzX3NldF9lbmdpbmVfbW9kZShlbmdpbmUsIExQNTUyM19DTURfTE9BRCk7Ci0KLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosIGVuZ2luZS0+YXR0cmlidXRlcyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAobW9kZSA9PSBMUDU1MjNfQ01EX0RJU0FCTEVEKSB7CiAJCWxwNTUyM19zZXRfZW5naW5lX21vZGUoZW5naW5lLCBMUDU1MjNfQ01EX0RJU0FCTEVEKTsKIAl9CiAKLQkvKiByZW1vdmUgbG9hZCBhdHRyaWJ1dGUgZnJvbSBzeXNmcyBpZiBub3QgaW4gbG9hZCBtb2RlICovCi0JaWYgKGVuZ2luZS0+bW9kZSA9PSBMUDU1MjNfQ01EX0xPQUQgJiYgbW9kZSAhPSBMUDU1MjNfQ01EX0xPQUQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2LT5rb2JqLCBlbmdpbmUtPmF0dHJpYnV0ZXMpOwotCiAJZW5naW5lLT5tb2RlID0gbW9kZTsKIAogCXJldHVybiByZXQ7CkBAIC04NDUsNyArODIyLDYgQEAKIAllbmdpbmUtPmVuZ2luZV9tYXNrID0gTFA1NTIzX0VOR19NQVNLX0JBU0UgPj4gU0hJRlRfTUFTSyhpZCk7CiAJZW5naW5lLT5wcm9nX3BhZ2UgPSBpZCAtIDE7CiAJZW5naW5lLT5tdXhfcGFnZSA9IGlkICsgMjsKLQllbmdpbmUtPmF0dHJpYnV0ZXMgPSAmbHA1NTIzX2VuZ2luZV9ncm91cFtpZCAtIDFdOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NzAsNyArODQ2LDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJc25wcmludGYobmFtZSwgMzIsICJscDU1MjM6Y2hhbm5lbCVkIiwgY2hhbik7CisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOmNoYW5uZWwlZCIsCisJCQlwZGF0YS0+bGFiZWwgPzogImxwNTUyMyIsIGNoYW4pOwogCiAJCWxlZC0+Y2Rldi5uYW1lID0gbmFtZTsKIAkJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gbHA1NTIzX3NldF9icmlnaHRuZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jCmluZGV4IDQzZDA4NzUuLmFmYWMzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1MzIuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMKQEAgLTIwMCw2ICsyMDAsMzIgQEAKIAlwY2E5NTMyX3NldGxlZChsZWQpOwogfQogCitzdGF0aWMgdm9pZCBwY2E5NTMyX2Rlc3Ryb3lfZGV2aWNlcyhzdHJ1Y3QgcGNhOTUzMl9kYXRhICpkYXRhLCBpbnQgbl9kZXZzKQoreworCWludCBpID0gbl9kZXZzOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJc3dpdGNoIChkYXRhLT5sZWRzW2ldLnR5cGUpIHsKKwkJY2FzZSBQQ0E5NTMyX1RZUEVfTk9ORToKKwkJCWJyZWFrOworCQljYXNlIFBDQTk1MzJfVFlQRV9MRUQ6CisJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkc1tpXS5sZGV2KTsKKwkJCWNhbmNlbF93b3JrX3N5bmMoJmRhdGEtPmxlZHNbaV0ud29yayk7CisJCQlicmVhazsKKwkJY2FzZSBQQ0E5NTMyX1RZUEVfTjIxMDBfQkVFUDoKKwkJCWlmIChkYXRhLT5pZGV2ICE9IE5VTEwpIHsKKwkJCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkYXRhLT5pZGV2KTsKKwkJCQljYW5jZWxfd29ya19zeW5jKCZkYXRhLT53b3JrKTsKKwkJCQlkYXRhLT5pZGV2ID0gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCiBzdGF0aWMgaW50IHBjYTk1MzJfY29uZmlndXJlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJc3RydWN0IHBjYTk1MzJfZGF0YSAqZGF0YSwgc3RydWN0IHBjYTk1MzJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CkBAIC0yNzQsMjUgKzMwMCw3IEBACiAJcmV0dXJuIDA7CiAKIGV4aXQ6Ci0JaWYgKGkgPiAwKQotCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pCi0JCQlzd2l0Y2ggKGRhdGEtPmxlZHNbaV0udHlwZSkgewotCQkJY2FzZSBQQ0E5NTMyX1RZUEVfTk9ORToKLQkJCQlicmVhazsKLQkJCWNhc2UgUENBOTUzMl9UWVBFX0xFRDoKLQkJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkc1tpXS5sZGV2KTsKLQkJCQljYW5jZWxfd29ya19zeW5jKCZkYXRhLT5sZWRzW2ldLndvcmspOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ0E5NTMyX1RZUEVfTjIxMDBfQkVFUDoKLQkJCQlpZiAoZGF0YS0+aWRldiAhPSBOVUxMKSB7Ci0JCQkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmlkZXYpOwotCQkJCQlpbnB1dF9mcmVlX2RldmljZShkYXRhLT5pZGV2KTsKLQkJCQkJY2FuY2VsX3dvcmtfc3luYygmZGF0YS0+d29yayk7Ci0JCQkJCWRhdGEtPmlkZXYgPSBOVUxMOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQorCXBjYTk1MzJfZGVzdHJveV9kZXZpY2VzKGRhdGEsIGkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMyOSwyNSArMzM3LDcgQEAKIHN0YXRpYyBpbnQgcGNhOTUzMl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgcGNhOTUzMl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXN3aXRjaCAoZGF0YS0+bGVkc1tpXS50eXBlKSB7Ci0JCWNhc2UgUENBOTUzMl9UWVBFX05PTkU6Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0E5NTMyX1RZUEVfTEVEOgotCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZHNbaV0ubGRldik7Ci0JCQljYW5jZWxfd29ya19zeW5jKCZkYXRhLT5sZWRzW2ldLndvcmspOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENBOTUzMl9UWVBFX04yMTAwX0JFRVA6Ci0JCQlpZiAoZGF0YS0+aWRldiAhPSBOVUxMKSB7Ci0JCQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aWRldik7Ci0JCQkJaW5wdXRfZnJlZV9kZXZpY2UoZGF0YS0+aWRldik7Ci0JCQkJY2FuY2VsX3dvcmtfc3luYygmZGF0YS0+d29yayk7Ci0JCQkJZGF0YS0+aWRldiA9IE5VTEw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCisJcGNhOTUzMl9kZXN0cm95X2RldmljZXMoZGF0YSwgMTYpOwogCWtmcmVlKGRhdGEpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHRyaWctYmFja2xpZ2h0LmMgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy1iYWNrbGlnaHQuYwppbmRleCBmOTQ4ZTU3Li4yYjUxM2EyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkdHJpZy1iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy1iYWNrbGlnaHQuYwpAQCAtMjYsNiArMjYsNyBAQAogCWludCBicmlnaHRuZXNzOwogCWludCBvbGRfc3RhdHVzOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcjsKKwl1bnNpZ25lZCBpbnZlcnQ7CiB9OwogCiBzdGF0aWMgaW50IGZiX25vdGlmaWVyX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqcCwKQEAgLTM2LDIzICszNyw2NCBAQAogCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZCA9IG4tPmxlZDsKIAlzdHJ1Y3QgZmJfZXZlbnQgKmZiX2V2ZW50ID0gZGF0YTsKIAlpbnQgKmJsYW5rID0gZmJfZXZlbnQtPmRhdGE7CisJaW50IG5ld19zdGF0dXMgPSAqYmxhbmsgPyBCTEFOSyA6IFVOQkxBTks7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBGQl9FVkVOVF9CTEFOSyA6Ci0JCWlmICgqYmxhbmsgJiYgbi0+b2xkX3N0YXR1cyA9PSBVTkJMQU5LKSB7CisJCWlmIChuZXdfc3RhdHVzID09IG4tPm9sZF9zdGF0dXMpCisJCQlicmVhazsKKworCQlpZiAoKG4tPm9sZF9zdGF0dXMgPT0gVU5CTEFOSykgXiBuLT5pbnZlcnQpIHsKIAkJCW4tPmJyaWdodG5lc3MgPSBsZWQtPmJyaWdodG5lc3M7CiAJCQlsZWRfc2V0X2JyaWdodG5lc3MobGVkLCBMRURfT0ZGKTsKLQkJCW4tPm9sZF9zdGF0dXMgPSBCTEFOSzsKLQkJfSBlbHNlIGlmICghKmJsYW5rICYmIG4tPm9sZF9zdGF0dXMgPT0gQkxBTkspIHsKKwkJfSBlbHNlIHsKIAkJCWxlZF9zZXRfYnJpZ2h0bmVzcyhsZWQsIG4tPmJyaWdodG5lc3MpOwotCQkJbi0+b2xkX3N0YXR1cyA9IFVOQkxBTks7CiAJCX0KKworCQluLT5vbGRfc3RhdHVzID0gbmV3X3N0YXR1czsKKwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHNzaXplX3QgYmxfdHJpZ19pbnZlcnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJsX3RyaWdfbm90aWZpZXIgKm4gPSBsZWQtPnRyaWdnZXJfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBuLT5pbnZlcnQpOworfQorCitzdGF0aWMgc3NpemVfdCBibF90cmlnX2ludmVydF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBudW0pCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJsX3RyaWdfbm90aWZpZXIgKm4gPSBsZWQtPnRyaWdnZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGludmVydDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmludmVydCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW52ZXJ0ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluLT5pbnZlcnQgPSBpbnZlcnQ7CisKKwkvKiBBZnRlciBpbnZlcnRpbmcsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBMRUQuICovCisJaWYgKChuLT5vbGRfc3RhdHVzID09IEJMQU5LKSBeIG4tPmludmVydCkKKwkJbGVkX3NldF9icmlnaHRuZXNzKGxlZCwgTEVEX09GRik7CisJZWxzZQorCQlsZWRfc2V0X2JyaWdodG5lc3MobGVkLCBuLT5icmlnaHRuZXNzKTsKKworCXJldHVybiBudW07Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaW52ZXJ0ZWQsIDA2NDQsIGJsX3RyaWdfaW52ZXJ0X3Nob3csIGJsX3RyaWdfaW52ZXJ0X3N0b3JlKTsKKwogc3RhdGljIHZvaWQgYmxfdHJpZ19hY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQpCiB7CiAJaW50IHJldDsKQEAgLTY2LDYgKzEwOCwxMCBAQAogCQlyZXR1cm47CiAJfQogCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGxlZC0+ZGV2LCAmZGV2X2F0dHJfaW52ZXJ0ZWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ludmVydDsKKwogCW4tPmxlZCA9IGxlZDsKIAluLT5icmlnaHRuZXNzID0gbGVkLT5icmlnaHRuZXNzOwogCW4tPm9sZF9zdGF0dXMgPSBVTkJMQU5LOwpAQCAtNzQsNiArMTIwLDEyIEBACiAJcmV0ID0gZmJfcmVnaXN0ZXJfY2xpZW50KCZuLT5ub3RpZmllcik7CiAJaWYgKHJldCkKIAkJZGV2X2VycihsZWQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciBiYWNrbGlnaHQgdHJpZ2dlclxuIik7CisKKwlyZXR1cm47CisKK2Vycl9pbnZlcnQ6CisJbGVkLT50cmlnZ2VyX2RhdGEgPSBOVUxMOworCWtmcmVlKG4pOwogfQogCiBzdGF0aWMgdm9pZCBibF90cmlnX2RlYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkKQpAQCAtODIsNiArMTM0LDcgQEAKIAkJKHN0cnVjdCBibF90cmlnX25vdGlmaWVyICopIGxlZC0+dHJpZ2dlcl9kYXRhOwogCiAJaWYgKG4pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGxlZC0+ZGV2LCAmZGV2X2F0dHJfaW52ZXJ0ZWQpOwogCQlmYl91bnJlZ2lzdGVyX2NsaWVudCgmbi0+bm90aWZpZXIpOwogCQlrZnJlZShuKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKaW5kZXggYjZlN2RkYy4uNGRhZjllNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwpAQCAtMzg3LDExICszODcsMTAgQEAKIAkvKiBTZXQgdGhlIERNQSBvcHMgdG8gdGhlIG9uZXMgZnJvbSB0aGUgUENJIGRldmljZSwgdGhpcyBjb3VsZCBiZQogCSAqIGZpc2h5IGlmIHdlIGRpZG4ndCBrbm93IHRoYXQgb24gUG93ZXJNYWMgaXQncyBhbHdheXMgZGlyZWN0IG9wcwogCSAqIG9yIGlvbW11IG9wcyB0aGF0IHdpbGwgd29yayBmaW5lCisJICoKKwkgKiBUbyBnZXQgYWxsIHRoZSBmaWVsZHMsIGNvcHkgYWxsIGFyY2hkYXRhCiAJICovCi0JZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEuZG1hX29wcyA9Ci0JCWNoaXAtPmxidXMucGRldi0+ZGV2LmFyY2hkYXRhLmRtYV9vcHM7Ci0JZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEuZG1hX2RhdGEgPQotCQljaGlwLT5sYnVzLnBkZXYtPmRldi5hcmNoZGF0YS5kbWFfZGF0YTsKKwlkZXYtPm9mZGV2LmRldi5hcmNoZGF0YSA9IGNoaXAtPmxidXMucGRldi0+ZGV2LmFyY2hkYXRhOwogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKaW5kZXggNDQ1NDkyNy4uMmUwNDFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwpAQCAtMjIxMyw2ICsyMjEzLDkgQEAKIHN0YXRpYyBpbnQgZmN1X29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RhdGUgPSBzdGF0ZV9kZXRhY2hlZDsKKwlvZl9kZXYgPSBkZXY7CisKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJQb3dlck1hYyBHNSBUaGVybWFsIGNvbnRyb2wgZHJpdmVyICVzXG4iLCBWRVJTSU9OKTsKIAogCS8qIExvb2t1cCB0aGUgZmFucyBpbiB0aGUgZGV2aWNlIHRyZWUgKi8KIAlmY3VfbG9va3VwX2ZhbnMoZGV2LT5kZXYub2Zfbm9kZSk7CkBAIC0yMjM1LDYgKzIyMzgsNyBAQAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZmN1X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZmN1X29mX3BsYXRmb3JtX2RyaXZlciA9IAogewpAQCAtMjI1Miw4ICsyMjU2LDYgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgdGhlcm1fcG03Ml9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQogCXJhY2ttYWMgPSBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIlJhY2tNYWMzLDEiKTsKIAogCWlmICghb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlck1hYzcsMiIpICYmCkBAIC0yMjYxLDM0ICsyMjYzLDEyIEBACiAJICAgICFyYWNrbWFjKQogCSAgICAJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcmludGsoS0VSTl9JTkZPICJQb3dlck1hYyBHNSBUaGVybWFsIGNvbnRyb2wgZHJpdmVyICVzXG4iLCBWRVJTSU9OKTsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImZjdSIpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCS8qIFNvbWUgbWFjaGluZXMgaGF2ZSBzdHJhbmdlbHkgYnJva2VuIGRldmljZS10cmVlICovCi0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi91M0AwLGY4MDAwMDAwL2kyY0BmODAwMTAwMC9mYW5AMTVlIik7Ci0JCWlmIChucCA9PSBOVUxMKSB7Ci0JCQkgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIEZDVSBpbiBkZXZpY2UtdHJlZSAhXG4iKTsKLQkJCSAgICByZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQlvZl9kZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAidGVtcGVyYXR1cmUiLCBOVUxMKTsKLQlpZiAob2ZfZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciBGQ1UgcGxhdGZvcm0gZGV2aWNlICFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwotCQotCXJldHVybiAwOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdGhlcm1fcG03Ml9leGl0KHZvaWQpCiB7CiAJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIpOwotCi0JaWYgKG9mX2RldikKLQkJb2ZfZGV2aWNlX3VucmVnaXN0ZXIob2ZfZGV2KTsKIH0KIAogbW9kdWxlX2luaXQodGhlcm1fcG03Ml9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtYmFja2xpZ2h0LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LWJhY2tsaWdodC5jCmluZGV4IDFjZWMwMmYuLmFkZTFlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1iYWNrbGlnaHQuYwpAQCAtMTUsNyArMTUsNyBAQAogCiAjZGVmaW5lIE1BWF9QTVVfTEVWRUwgMHhGRgogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgcG11X2JhY2tsaWdodF9kYXRhOworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHBtdV9iYWNrbGlnaHRfZGF0YTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socG11X2JhY2tsaWdodF9sb2NrKTsKIHN0YXRpYyBpbnQgc2xlZXBpbmcsIHVzZXNfcG11X2JsOwogc3RhdGljIHU4IGJsX2N1cnZlW0ZCX0JBQ0tMSUdIVF9MRVZFTFNdOwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcmV0dXJuIGJkLT5wcm9wcy5icmlnaHRuZXNzOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgcG11X2JhY2tsaWdodF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHBtdV9iYWNrbGlnaHRfZGF0YSA9IHsKIAkuZ2V0X2JyaWdodG5lc3MJPSBwbXVfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzCT0gcG11X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKaW5kZXggY2QyOWM4Mi4uOGIwMjFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtMjI1Nyw3ICsyMjU3LDcgQEAKIAkJJiYgKHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLCBOVUxMLCAwLCAtMSkgPj0gMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcG11X3BtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgcG11X3BtX29wcyA9IHsKIAkuZW50ZXIgPSBwb3dlcmJvb2tfc2xlZXAsCiAJLnZhbGlkID0gcG11X3NsZWVwX3ZhbGlkLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCBiZjFhOTVlMy4uOThkOWVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMjQwLDYgKzI0MCwzMCBAQAogICAgICAgICAgQWxsb3cgdm9sdW1lIG1hbmFnZXJzIHRvIG1pcnJvciBsb2dpY2FsIHZvbHVtZXMsIGFsc28KICAgICAgICAgIG5lZWRlZCBmb3IgbGl2ZSBkYXRhIG1pZ3JhdGlvbiB0b29scyBzdWNoIGFzICdwdm1vdmUnLgogCitjb25maWcgRE1fUkFJRAorICAgICAgIHRyaXN0YXRlICJSQUlEIDQvNS82IHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisgICAgICAgc2VsZWN0IE1EX1JBSUQ0NTYKKyAgICAgICBzZWxlY3QgQkxLX0RFVl9NRAorICAgICAgIC0tLWhlbHAtLS0KKwkgQSBkbSB0YXJnZXQgdGhhdCBzdXBwb3J0cyBSQUlENCwgUkFJRDUgYW5kIFJBSUQ2IG1hcHBpbmdzCisKKwkgQSBSQUlELTUgc2V0IG9mIE4gZHJpdmVzIHdpdGggYSBjYXBhY2l0eSBvZiBDIE1CIHBlciBkcml2ZSBwcm92aWRlcworCSB0aGUgY2FwYWNpdHkgb2YgQyAqIChOIC0gMSkgTUIsIGFuZCBwcm90ZWN0cyBhZ2FpbnN0IGEgZmFpbHVyZQorCSBvZiBhIHNpbmdsZSBkcml2ZS4gRm9yIGEgZ2l2ZW4gc2VjdG9yIChyb3cpIG51bWJlciwgKE4gLSAxKSBkcml2ZXMKKwkgY29udGFpbiBkYXRhIHNlY3RvcnMsIGFuZCBvbmUgZHJpdmUgY29udGFpbnMgdGhlIHBhcml0eSBwcm90ZWN0aW9uLgorCSBGb3IgYSBSQUlELTQgc2V0LCB0aGUgcGFyaXR5IGJsb2NrcyBhcmUgcHJlc2VudCBvbiBhIHNpbmdsZSBkcml2ZSwKKwkgd2hpbGUgYSBSQUlELTUgc2V0IGRpc3RyaWJ1dGVzIHRoZSBwYXJpdHkgYWNyb3NzIHRoZSBkcml2ZXMgaW4gb25lCisJIG9mIHRoZSBhdmFpbGFibGUgcGFyaXR5IGRpc3RyaWJ1dGlvbiBtZXRob2RzLgorCisJIEEgUkFJRC02IHNldCBvZiBOIGRyaXZlcyB3aXRoIGEgY2FwYWNpdHkgb2YgQyBNQiBwZXIgZHJpdmUKKwkgcHJvdmlkZXMgdGhlIGNhcGFjaXR5IG9mIEMgKiAoTiAtIDIpIE1CLCBhbmQgcHJvdGVjdHMKKwkgYWdhaW5zdCBhIGZhaWx1cmUgb2YgYW55IHR3byBkcml2ZXMuIEZvciBhIGdpdmVuIHNlY3RvcgorCSAocm93KSBudW1iZXIsIChOIC0gMikgZHJpdmVzIGNvbnRhaW4gZGF0YSBzZWN0b3JzLCBhbmQgdHdvCisJIGRyaXZlcyBjb250YWlucyB0d28gaW5kZXBlbmRlbnQgcmVkdW5kYW5jeSBzeW5kcm9tZXMuICBMaWtlCisJIFJBSUQtNSwgUkFJRC02IGRpc3RyaWJ1dGVzIHRoZSBzeW5kcm9tZXMgYWNyb3NzIHRoZSBkcml2ZXMKKwkgaW4gb25lIG9mIHRoZSBhdmFpbGFibGUgcGFyaXR5IGRpc3RyaWJ1dGlvbiBtZXRob2RzLgorCiBjb25maWcgRE1fTE9HX1VTRVJTUEFDRQogCXRyaXN0YXRlICJNaXJyb3IgdXNlcnNwYWNlIGxvZ2dpbmcgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBETV9NSVJST1IgJiYgRVhQRVJJTUVOVEFMICYmIE5FVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWQvTWFrZWZpbGUKaW5kZXggNWUzYWFjNC4uZDAxMzg2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21kL01ha2VmaWxlCkBAIC0zNiw2ICszNiw3IEBACiBvYmotJChDT05GSUdfRE1fTUlSUk9SKQkJKz0gZG0tbWlycm9yLm8gZG0tbG9nLm8gZG0tcmVnaW9uLWhhc2gubwogb2JqLSQoQ09ORklHX0RNX0xPR19VU0VSU1BBQ0UpCSs9IGRtLWxvZy11c2Vyc3BhY2Uubwogb2JqLSQoQ09ORklHX0RNX1pFUk8pCQkrPSBkbS16ZXJvLm8KK29iai0kKENPTkZJR19ETV9SQUlEKQkrPSBkbS1yYWlkLm8KIAogaWZlcSAoJChDT05GSUdfRE1fVUVWRU5UKSx5KQogZG0tbW9kLW9ianMJCQkrPSBkbS11ZXZlbnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNWExZmZlMy4uOWEzNTMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yMTAsMTEgKzIxMCwxMSBAQAogCQkgICAgfHwgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAKLQkJdGFyZ2V0ID0gcmRldi0+c2Jfc3RhcnQgKyBvZmZzZXQgKyBpbmRleCAqIChQQUdFX1NJWkUvNTEyKTsKKwkJdGFyZ2V0ID0gb2Zmc2V0ICsgaW5kZXggKiAoUEFHRV9TSVpFLzUxMik7CiAKIAkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LCB0YXJnZXQsCiAJCQkJIHJvdW5kdXAoc2l6ZSwgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUocmRldi0+YmRldikpLAotCQkJCSBwYWdlLCBSRUFEKSkgeworCQkJCSBwYWdlLCBSRUFELCB0cnVlKSkgewogCQkJcGFnZS0+aW5kZXggPSBpbmRleDsKIAkJCWF0dGFjaF9wYWdlX2J1ZmZlcnMocGFnZSwgTlVMTCk7IC8qIHNvIHRoYXQgZnJlZV9idWZmZXIgd2lsbAogCQkJCQkJCSAgKiBxdWlldGx5IG5vLW9wICovCkBAIC0yNjQsMTQgKzI2NCwxOCBAQAogc3RhdGljIGludCB3cml0ZV9zYl9wYWdlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB3YWl0KQogewogCW1ka19yZGV2X3QgKnJkZXYgPSBOVUxMOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJbWRkZXZfdCAqbWRkZXYgPSBiaXRtYXAtPm1kZGV2OwogCiAJd2hpbGUgKChyZGV2ID0gbmV4dF9hY3RpdmVfcmRldihyZGV2LCBtZGRldikpICE9IE5VTEwpIHsKIAkJaW50IHNpemUgPSBQQUdFX1NJWkU7CiAJCWxvZmZfdCBvZmZzZXQgPSBtZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0OworCisJCWJkZXYgPSAocmRldi0+bWV0YV9iZGV2KSA/IHJkZXYtPm1ldGFfYmRldiA6IHJkZXYtPmJkZXY7CisKIAkJaWYgKHBhZ2UtPmluZGV4ID09IGJpdG1hcC0+ZmlsZV9wYWdlcy0xKQogCQkJc2l6ZSA9IHJvdW5kdXAoYml0bWFwLT5sYXN0X3BhZ2Vfc2l6ZSwKLQkJCQkgICAgICAgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUocmRldi0+YmRldikpOworCQkJCSAgICAgICBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KSk7CiAJCS8qIEp1c3QgbWFrZSBzdXJlIHdlIGFyZW4ndCBjb3JydXB0aW5nIGRhdGEgb3IKIAkJICogbWV0YWRhdGEKIAkJICovCkBAIC0xNTQyLDcgKzE1NDYsNyBAQAogCXdhaXRfZXZlbnQoYml0bWFwLT5tZGRldi0+cmVjb3Zlcnlfd2FpdCwKIAkJICAgYXRvbWljX3JlYWQoJmJpdG1hcC0+bWRkZXYtPnJlY292ZXJ5X2FjdGl2ZSkgPT0gMCk7CiAKLQliaXRtYXAtPm1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBiaXRtYXAtPm1kZGV2LT5jdXJyX3Jlc3luYzsKKwliaXRtYXAtPm1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBzZWN0b3I7CiAJc2V0X2JpdChNRF9DSEFOR0VfQ0xFQU4sICZiaXRtYXAtPm1kZGV2LT5mbGFncyk7CiAJc2VjdG9yICY9IH4oKDFVTEwgPDwgQ0hVTktfQkxPQ0tfU0hJRlQoYml0bWFwKSkgLSAxKTsKIAlzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwppbmRleCBkNWIwZTRjLi40ZTA1NGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMKKysrIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCkBAIC0xOCwxMCArMTgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL21kNS5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KIApAQCAtNjMsNiArNjcsNyBAQAogCXN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfaW47CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX291dDsKKwlzZWN0b3JfdCBpdl9zZWN0b3I7CiB9OwogCiBzdHJ1Y3QgY3J5cHRfY29uZmlnOwpAQCAtNzMsMTEgKzc4LDEzIEBACiAJdm9pZCAoKmR0cikoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MpOwogCWludCAoKmluaXQpKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKTsKIAlpbnQgKCp3aXBlKShzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyk7Ci0JaW50ICgqZ2VuZXJhdG9yKShzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LCBzZWN0b3JfdCBzZWN0b3IpOworCWludCAoKmdlbmVyYXRvcikoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwKKwkJCSBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpOworCWludCAoKnBvc3QpKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCB1OCAqaXYsCisJCSAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpOwogfTsKIAogc3RydWN0IGl2X2Vzc2l2X3ByaXZhdGUgewotCXN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm07CiAJc3RydWN0IGNyeXB0b19oYXNoICpoYXNoX3RmbTsKIAl1OCAqc2FsdDsKIH07CkBAIC04NiwxMSArOTMsMzIgQEAKIAlpbnQgc2hpZnQ7CiB9OwogCisjZGVmaW5lIExNS19TRUVEX1NJWkUgNjQgLyogaGFzaCArIDAgKi8KK3N0cnVjdCBpdl9sbWtfcHJpdmF0ZSB7CisJc3RydWN0IGNyeXB0b19zaGFzaCAqaGFzaF90Zm07CisJdTggKnNlZWQ7Cit9OworCiAvKgogICogQ3J5cHQ6IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBibG9jayBkZXZpY2UKICAqIGFuZCBlbmNyeXB0cyAvIGRlY3J5cHRzIGF0IHRoZSBzYW1lIHRpbWUuCiAgKi8KIGVudW0gZmxhZ3MgeyBETV9DUllQVF9TVVNQRU5ERUQsIERNX0NSWVBUX0tFWV9WQUxJRCB9OworCisvKgorICogRHVwbGljYXRlZCBwZXItQ1BVIHN0YXRlIGZvciBjaXBoZXIuCisgKi8KK3N0cnVjdCBjcnlwdF9jcHUgeworCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKKwkvKiBFU1NJVjogc3RydWN0IGNyeXB0b19jaXBoZXIgKmVzc2l2X3RmbSAqLworCXZvaWQgKml2X3ByaXZhdGU7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm1zWzBdOworfTsKKworLyoKKyAqIFRoZSBmaWVsZHMgaW4gaGVyZSBtdXN0IGJlIHJlYWQgb25seSBhZnRlciBpbml0aWFsaXphdGlvbiwKKyAqIGNoYW5naW5nIHN0YXRlIHNob3VsZCBiZSBpbiBjcnlwdF9jcHUuCisgKi8KIHN0cnVjdCBjcnlwdF9jb25maWcgewogCXN0cnVjdCBkbV9kZXYgKmRldjsKIAlzZWN0b3JfdCBzdGFydDsKQEAgLTEwOCwxNyArMTM2LDI1IEBACiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNyeXB0X3F1ZXVlOwogCiAJY2hhciAqY2lwaGVyOwotCWNoYXIgKmNpcGhlcl9tb2RlOworCWNoYXIgKmNpcGhlcl9zdHJpbmc7CiAKIAlzdHJ1Y3QgY3J5cHRfaXZfb3BlcmF0aW9ucyAqaXZfZ2VuX29wczsKIAl1bmlvbiB7CiAJCXN0cnVjdCBpdl9lc3Npdl9wcml2YXRlIGVzc2l2OwogCQlzdHJ1Y3QgaXZfYmVuYmlfcHJpdmF0ZSBiZW5iaTsKKwkJc3RydWN0IGl2X2xta19wcml2YXRlIGxtazsKIAl9IGl2X2dlbl9wcml2YXRlOwogCXNlY3Rvcl90IGl2X29mZnNldDsKIAl1bnNpZ25lZCBpbnQgaXZfc2l6ZTsKIAogCS8qCisJICogRHVwbGljYXRlZCBwZXIgY3B1IHN0YXRlLiBBY2Nlc3MgdGhyb3VnaAorCSAqIHBlcl9jcHVfcHRyKCkgb25seS4KKwkgKi8KKwlzdHJ1Y3QgY3J5cHRfY3B1IF9fcGVyY3B1ICpjcHU7CisJdW5zaWduZWQgdGZtc19jb3VudDsKKworCS8qCiAJICogTGF5b3V0IG9mIGVhY2ggY3J5cHRvIHJlcXVlc3Q6CiAJICoKIAkgKiAgIHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QKQEAgLTEzMiwxMSArMTY4LDEwIEBACiAJICogY29ycmVjdGx5IGFsaWduZWQuCiAJICovCiAJdW5zaWduZWQgaW50IGRtcmVxX3N0YXJ0OwotCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcTsKIAotCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGtleV9zaXplOworCXVuc2lnbmVkIGludCBrZXlfcGFydHM7CiAJdTgga2V5WzBdOwogfTsKIApAQCAtMTQ4LDYgKzE4MywyMCBAQAogCiBzdGF0aWMgdm9pZCBjbG9uZV9pbml0KHN0cnVjdCBkbV9jcnlwdF9pbyAqLCBzdHJ1Y3QgYmlvICopOwogc3RhdGljIHZvaWQga2NyeXB0ZF9xdWV1ZV9jcnlwdChzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKTsKK3N0YXRpYyB1OCAqaXZfb2ZfZG1yZXEoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSk7CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRfY3B1ICp0aGlzX2NyeXB0X2NvbmZpZyhzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYykKK3sKKwlyZXR1cm4gdGhpc19jcHVfcHRyKGNjLT5jcHUpOworfQorCisvKgorICogVXNlIHRoaXMgdG8gYWNjZXNzIGNpcGhlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIHRoZSBzYW1lIGZvciBlYWNoIENQVS4KKyAqLworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqYW55X3RmbShzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYykKK3sKKwlyZXR1cm4gX190aGlzX2NwdV9wdHIoY2MtPmNwdSktPnRmbXNbMF07Cit9CiAKIC8qCiAgKiBEaWZmZXJlbnQgSVYgZ2VuZXJhdGlvbiBhbGdvcml0aG1zOgpAQCAtMTY4LDIzICsyMTcsMzggQEAKICAqIG51bGw6IHRoZSBpbml0aWFsIHZlY3RvciBpcyBhbHdheXMgemVyby4gIFByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aAogICogICAgICAgb2Jzb2xldGUgbG9vcF9maXNoMiBkZXZpY2VzLiAgRG8gbm90IHVzZSBmb3IgbmV3IGRldmljZXMuCiAgKgorICogbG1rOiAgQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmxvY2sgY2hhaW5pbmcgbW9kZSB1c2VkCisgKiAgICAgICBieSB0aGUgTG9vcC1BRVMgYmxvY2sgZGV2aWNlIGVuY3J5cHRpb24gc3lzdGVtCisgKiAgICAgICBkZXNpZ25lZCBieSBKYXJpIFJ1dXN1LiBTZWUgaHR0cDovL2xvb3AtYWVzLnNvdXJjZWZvcmdlLm5ldC8KKyAqICAgICAgIEl0IG9wZXJhdGVzIG9uIGZ1bGwgNTEyIGJ5dGUgc2VjdG9ycyBhbmQgdXNlcyBDQkMKKyAqICAgICAgIHdpdGggYW4gSVYgZGVyaXZlZCBmcm9tIHRoZSBzZWN0b3IgbnVtYmVyLCB0aGUgZGF0YSBhbmQKKyAqICAgICAgIG9wdGlvbmFsbHkgZXh0cmEgSVYgc2VlZC4KKyAqICAgICAgIFRoaXMgbWVhbnMgdGhhdCBhZnRlciBkZWNyeXB0aW9uIHRoZSBmaXJzdCBibG9jaworICogICAgICAgb2Ygc2VjdG9yIG11c3QgYmUgdHdlYWtlZCBhY2NvcmRpbmcgdG8gZGVjcnlwdGVkIGRhdGEuCisgKiAgICAgICBMb29wLUFFUyBjYW4gdXNlIHRocmVlIGVuY3J5cHRpb24gc2NoZW1lczoKKyAqICAgICAgICAgdmVyc2lvbiAxOiBpcyBwbGFpbiBhZXMtY2JjIG1vZGUKKyAqICAgICAgICAgdmVyc2lvbiAyOiB1c2VzIDY0IG11bHRpa2V5IHNjaGVtZSB3aXRoIGxtayBJViBnZW5lcmF0b3IKKyAqICAgICAgICAgdmVyc2lvbiAzOiB0aGUgc2FtZSBhcyB2ZXJzaW9uIDIgd2l0aCBhZGRpdGlvbmFsIElWIHNlZWQKKyAqICAgICAgICAgICAgICAgICAgIChpdCB1c2VzIDY1IGtleXMsIGxhc3Qga2V5IGlzIHVzZWQgYXMgSVYgc2VlZCkKKyAqCiAgKiBwbHVtYjogdW5pbXBsZW1lbnRlZCwgc2VlOgogICogaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmxpbnV4Lmtlcm5lbC5kZXZpY2UtbWFwcGVyLmRtLWNyeXB0LzQ1NAogICovCiAKLXN0YXRpYyBpbnQgY3J5cHRfaXZfcGxhaW5fZ2VuKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCB1OCAqaXYsIHNlY3Rvcl90IHNlY3RvcikKK3N0YXRpYyBpbnQgY3J5cHRfaXZfcGxhaW5fZ2VuKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCB1OCAqaXYsCisJCQkgICAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCiB7CiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1MzIgKilpdiA9IGNwdV90b19sZTMyKHNlY3RvciAmIDB4ZmZmZmZmZmYpOworCSoodTMyICopaXYgPSBjcHVfdG9fbGUzMihkbXJlcS0+aXZfc2VjdG9yICYgMHhmZmZmZmZmZik7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjcnlwdF9pdl9wbGFpbjY0X2dlbihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LAotCQkJCXNlY3Rvcl90IHNlY3RvcikKKwkJCQlzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCiB7CiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1NjQgKilpdiA9IGNwdV90b19sZTY0KHNlY3Rvcik7CisJKih1NjQgKilpdiA9IGNwdV90b19sZTY0KGRtcmVxLT5pdl9zZWN0b3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTUsNyArMjU5LDggQEAKIAlzdHJ1Y3QgaXZfZXNzaXZfcHJpdmF0ZSAqZXNzaXYgPSAmY2MtPml2X2dlbl9wcml2YXRlLmVzc2l2OwogCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqZXNzaXZfdGZtOworCWludCBlcnIsIGNwdTsKIAogCXNnX2luaXRfb25lKCZzZywgY2MtPmtleSwgY2MtPmtleV9zaXplKTsKIAlkZXNjLnRmbSA9IGVzc2l2LT5oYXNoX3RmbTsKQEAgLTIwNSw4ICsyNzAsMTYgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JcmV0dXJuIGNyeXB0b19jaXBoZXJfc2V0a2V5KGVzc2l2LT50Zm0sIGVzc2l2LT5zYWx0LAorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZXNzaXZfdGZtID0gcGVyX2NwdV9wdHIoY2MtPmNwdSwgY3B1KS0+aXZfcHJpdmF0ZSwKKworCQllcnIgPSBjcnlwdG9fY2lwaGVyX3NldGtleShlc3Npdl90Zm0sIGVzc2l2LT5zYWx0LAogCQkJCSAgICBjcnlwdG9faGFzaF9kaWdlc3RzaXplKGVzc2l2LT5oYXNoX3RmbSkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyogV2lwZSBzYWx0IGFuZCByZXNldCBrZXkgZGVyaXZlZCBmcm9tIHZvbHVtZSBrZXkgKi8KQEAgLTIxNCwyNCArMjg3LDc2IEBACiB7CiAJc3RydWN0IGl2X2Vzc2l2X3ByaXZhdGUgKmVzc2l2ID0gJmNjLT5pdl9nZW5fcHJpdmF0ZS5lc3NpdjsKIAl1bnNpZ25lZCBzYWx0X3NpemUgPSBjcnlwdG9faGFzaF9kaWdlc3RzaXplKGVzc2l2LT5oYXNoX3RmbSk7CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKmVzc2l2X3RmbTsKKwlpbnQgY3B1LCByLCBlcnIgPSAwOwogCiAJbWVtc2V0KGVzc2l2LT5zYWx0LCAwLCBzYWx0X3NpemUpOwogCi0JcmV0dXJuIGNyeXB0b19jaXBoZXJfc2V0a2V5KGVzc2l2LT50Zm0sIGVzc2l2LT5zYWx0LCBzYWx0X3NpemUpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJZXNzaXZfdGZtID0gcGVyX2NwdV9wdHIoY2MtPmNwdSwgY3B1KS0+aXZfcHJpdmF0ZTsKKwkJciA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KGVzc2l2X3RmbSwgZXNzaXYtPnNhbHQsIHNhbHRfc2l6ZSk7CisJCWlmIChyKQorCQkJZXJyID0gcjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBTZXQgdXAgcGVyIGNwdSBjaXBoZXIgc3RhdGUgKi8KK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqc2V0dXBfZXNzaXZfY3B1KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLAorCQkJCQkgICAgIHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCQkgICAgIHU4ICpzYWx0LCB1bnNpZ25lZCBzYWx0c2l6ZSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqZXNzaXZfdGZtOworCWludCBlcnI7CisKKwkvKiBTZXR1cCB0aGUgZXNzaXZfdGZtIHdpdGggdGhlIGdpdmVuIHNhbHQgKi8KKwllc3Npdl90Zm0gPSBjcnlwdG9fYWxsb2NfY2lwaGVyKGNjLT5jaXBoZXIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoZXNzaXZfdGZtKSkgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gdGZtIGZvciBFU1NJViI7CisJCXJldHVybiBlc3Npdl90Zm07CisJfQorCisJaWYgKGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKGVzc2l2X3RmbSkgIT0KKwkgICAgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGFueV90Zm0oY2MpKSkgeworCQl0aS0+ZXJyb3IgPSAiQmxvY2sgc2l6ZSBvZiBFU1NJViBjaXBoZXIgZG9lcyAiCisJCQkgICAgIm5vdCBtYXRjaCBJViBzaXplIG9mIGJsb2NrIGNpcGhlciI7CisJCWNyeXB0b19mcmVlX2NpcGhlcihlc3Npdl90Zm0pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwllcnIgPSBjcnlwdG9fY2lwaGVyX3NldGtleShlc3Npdl90Zm0sIHNhbHQsIHNhbHRzaXplKTsKKwlpZiAoZXJyKSB7CisJCXRpLT5lcnJvciA9ICJGYWlsZWQgdG8gc2V0IGtleSBmb3IgRVNTSVYgY2lwaGVyIjsKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKGVzc2l2X3RmbSk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJcmV0dXJuIGVzc2l2X3RmbTsKIH0KIAogc3RhdGljIHZvaWQgY3J5cHRfaXZfZXNzaXZfZHRyKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQogeworCWludCBjcHU7CisJc3RydWN0IGNyeXB0X2NwdSAqY3B1X2NjOworCXN0cnVjdCBjcnlwdG9fY2lwaGVyICplc3Npdl90Zm07CiAJc3RydWN0IGl2X2Vzc2l2X3ByaXZhdGUgKmVzc2l2ID0gJmNjLT5pdl9nZW5fcHJpdmF0ZS5lc3NpdjsKIAotCWNyeXB0b19mcmVlX2NpcGhlcihlc3Npdi0+dGZtKTsKLQllc3Npdi0+dGZtID0gTlVMTDsKLQogCWNyeXB0b19mcmVlX2hhc2goZXNzaXYtPmhhc2hfdGZtKTsKIAllc3Npdi0+aGFzaF90Zm0gPSBOVUxMOwogCiAJa3pmcmVlKGVzc2l2LT5zYWx0KTsKIAllc3Npdi0+c2FsdCA9IE5VTEw7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWNwdV9jYyA9IHBlcl9jcHVfcHRyKGNjLT5jcHUsIGNwdSk7CisJCWVzc2l2X3RmbSA9IGNwdV9jYy0+aXZfcHJpdmF0ZTsKKworCQlpZiAoZXNzaXZfdGZtKQorCQkJY3J5cHRvX2ZyZWVfY2lwaGVyKGVzc2l2X3RmbSk7CisKKwkJY3B1X2NjLT5pdl9wcml2YXRlID0gTlVMTDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgY3J5cHRfaXZfZXNzaXZfY3RyKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKQEAgLTI0MCw3ICszNjUsNyBAQAogCXN0cnVjdCBjcnlwdG9fY2lwaGVyICplc3Npdl90Zm0gPSBOVUxMOwogCXN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaF90Zm0gPSBOVUxMOwogCXU4ICpzYWx0ID0gTlVMTDsKLQlpbnQgZXJyOworCWludCBlcnIsIGNwdTsKIAogCWlmICghb3B0cykgewogCQl0aS0+ZXJyb3IgPSAiRGlnZXN0IGFsZ29yaXRobSBtaXNzaW5nIGZvciBFU1NJViBtb2RlIjsKQEAgLTI2Miw0OCArMzg3LDQ0IEBACiAJCWdvdG8gYmFkOwogCX0KIAotCS8qIEFsbG9jYXRlIGVzc2l2X3RmbSAqLwotCWVzc2l2X3RmbSA9IGNyeXB0b19hbGxvY19jaXBoZXIoY2MtPmNpcGhlciwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0JaWYgKElTX0VSUihlc3Npdl90Zm0pKSB7Ci0JCXRpLT5lcnJvciA9ICJFcnJvciBhbGxvY2F0aW5nIGNyeXB0byB0Zm0gZm9yIEVTU0lWIjsKLQkJZXJyID0gUFRSX0VSUihlc3Npdl90Zm0pOwotCQlnb3RvIGJhZDsKLQl9Ci0JaWYgKGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKGVzc2l2X3RmbSkgIT0KLQkgICAgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGNjLT50Zm0pKSB7Ci0JCXRpLT5lcnJvciA9ICJCbG9jayBzaXplIG9mIEVTU0lWIGNpcGhlciBkb2VzICIKLQkJCSAgICAibm90IG1hdGNoIElWIHNpemUgb2YgYmxvY2sgY2lwaGVyIjsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBiYWQ7Ci0JfQotCiAJY2MtPml2X2dlbl9wcml2YXRlLmVzc2l2LnNhbHQgPSBzYWx0OwotCWNjLT5pdl9nZW5fcHJpdmF0ZS5lc3Npdi50Zm0gPSBlc3Npdl90Zm07CiAJY2MtPml2X2dlbl9wcml2YXRlLmVzc2l2Lmhhc2hfdGZtID0gaGFzaF90Zm07CiAKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWVzc2l2X3RmbSA9IHNldHVwX2Vzc2l2X2NwdShjYywgdGksIHNhbHQsCisJCQkJCWNyeXB0b19oYXNoX2RpZ2VzdHNpemUoaGFzaF90Zm0pKTsKKwkJaWYgKElTX0VSUihlc3Npdl90Zm0pKSB7CisJCQljcnlwdF9pdl9lc3Npdl9kdHIoY2MpOworCQkJcmV0dXJuIFBUUl9FUlIoZXNzaXZfdGZtKTsKKwkJfQorCQlwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpLT5pdl9wcml2YXRlID0gZXNzaXZfdGZtOworCX0KKwogCXJldHVybiAwOwogCiBiYWQ6Ci0JaWYgKGVzc2l2X3RmbSAmJiAhSVNfRVJSKGVzc2l2X3RmbSkpCi0JCWNyeXB0b19mcmVlX2NpcGhlcihlc3Npdl90Zm0pOwogCWlmIChoYXNoX3RmbSAmJiAhSVNfRVJSKGhhc2hfdGZtKSkKIAkJY3J5cHRvX2ZyZWVfaGFzaChoYXNoX3RmbSk7CiAJa2ZyZWUoc2FsdCk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBjcnlwdF9pdl9lc3Npdl9nZW4oc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwgc2VjdG9yX3Qgc2VjdG9yKQorc3RhdGljIGludCBjcnlwdF9pdl9lc3Npdl9nZW4oc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwKKwkJCSAgICAgIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKIHsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqZXNzaXZfdGZtID0gdGhpc19jcnlwdF9jb25maWcoY2MpLT5pdl9wcml2YXRlOworCiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1NjQgKilpdiA9IGNwdV90b19sZTY0KHNlY3Rvcik7Ci0JY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShjYy0+aXZfZ2VuX3ByaXZhdGUuZXNzaXYudGZtLCBpdiwgaXYpOworCSoodTY0ICopaXYgPSBjcHVfdG9fbGU2NChkbXJlcS0+aXZfc2VjdG9yKTsKKwljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKGVzc2l2X3RmbSwgaXYsIGl2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNyeXB0X2l2X2JlbmJpX2N0cihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgc3RydWN0IGRtX3RhcmdldCAqdGksCiAJCQkgICAgICBjb25zdCBjaGFyICpvcHRzKQogewotCXVuc2lnbmVkIGJzID0gY3J5cHRvX2FibGtjaXBoZXJfYmxvY2tzaXplKGNjLT50Zm0pOworCXVuc2lnbmVkIGJzID0gY3J5cHRvX2FibGtjaXBoZXJfYmxvY2tzaXplKGFueV90Zm0oY2MpKTsKIAlpbnQgbG9nID0gaWxvZzIoYnMpOwogCiAJLyogd2UgbmVlZCB0byBjYWxjdWxhdGUgaG93IGZhciB3ZSBtdXN0IHNoaWZ0IHRoZSBzZWN0b3IgY291bnQKQEAgLTMyOCwyNSArNDQ5LDE3NyBAQAogewogfQogCi1zdGF0aWMgaW50IGNyeXB0X2l2X2JlbmJpX2dlbihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LCBzZWN0b3JfdCBzZWN0b3IpCitzdGF0aWMgaW50IGNyeXB0X2l2X2JlbmJpX2dlbihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LAorCQkJICAgICAgc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgKmRtcmVxKQogewogCV9fYmU2NCB2YWw7CiAKIAltZW1zZXQoaXYsIDAsIGNjLT5pdl9zaXplIC0gc2l6ZW9mKHU2NCkpOyAvKiByZXN0IGlzIGNsZWFyZWQgYmVsb3cgKi8KIAotCXZhbCA9IGNwdV90b19iZTY0KCgodTY0KXNlY3RvciA8PCBjYy0+aXZfZ2VuX3ByaXZhdGUuYmVuYmkuc2hpZnQpICsgMSk7CisJdmFsID0gY3B1X3RvX2JlNjQoKCh1NjQpZG1yZXEtPml2X3NlY3RvciA8PCBjYy0+aXZfZ2VuX3ByaXZhdGUuYmVuYmkuc2hpZnQpICsgMSk7CiAJcHV0X3VuYWxpZ25lZCh2YWwsIChfX2JlNjQgKikoaXYgKyBjYy0+aXZfc2l6ZSAtIHNpemVvZih1NjQpKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjcnlwdF9pdl9udWxsX2dlbihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LCBzZWN0b3JfdCBzZWN0b3IpCitzdGF0aWMgaW50IGNyeXB0X2l2X251bGxfZ2VuKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCB1OCAqaXYsCisJCQkgICAgIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKIHsKIAltZW1zZXQoaXYsIDAsIGNjLT5pdl9zaXplKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjcnlwdF9pdl9sbWtfZHRyKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworCXN0cnVjdCBpdl9sbWtfcHJpdmF0ZSAqbG1rID0gJmNjLT5pdl9nZW5fcHJpdmF0ZS5sbWs7CisKKwlpZiAobG1rLT5oYXNoX3RmbSAmJiAhSVNfRVJSKGxtay0+aGFzaF90Zm0pKQorCQljcnlwdG9fZnJlZV9zaGFzaChsbWstPmhhc2hfdGZtKTsKKwlsbWstPmhhc2hfdGZtID0gTlVMTDsKKworCWt6ZnJlZShsbWstPnNlZWQpOworCWxtay0+c2VlZCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRfaXZfbG1rX2N0cihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgc3RydWN0IGRtX3RhcmdldCAqdGksCisJCQkgICAgY29uc3QgY2hhciAqb3B0cykKK3sKKwlzdHJ1Y3QgaXZfbG1rX3ByaXZhdGUgKmxtayA9ICZjYy0+aXZfZ2VuX3ByaXZhdGUubG1rOworCisJbG1rLT5oYXNoX3RmbSA9IGNyeXB0b19hbGxvY19zaGFzaCgibWQ1IiwgMCwgMCk7CisJaWYgKElTX0VSUihsbWstPmhhc2hfdGZtKSkgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgaW5pdGlhbGl6aW5nIExNSyBoYXNoIjsKKwkJcmV0dXJuIFBUUl9FUlIobG1rLT5oYXNoX3RmbSk7CisJfQorCisJLyogTm8gc2VlZCBpbiBMTUsgdmVyc2lvbiAyICovCisJaWYgKGNjLT5rZXlfcGFydHMgPT0gY2MtPnRmbXNfY291bnQpIHsKKwkJbG1rLT5zZWVkID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJbG1rLT5zZWVkID0ga3phbGxvYyhMTUtfU0VFRF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxtay0+c2VlZCkgeworCQljcnlwdF9pdl9sbWtfZHRyKGNjKTsKKwkJdGktPmVycm9yID0gIkVycm9yIGttYWxsb2Npbmcgc2VlZCBzdG9yYWdlIGluIExNSyI7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0X2l2X2xta19pbml0KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworCXN0cnVjdCBpdl9sbWtfcHJpdmF0ZSAqbG1rID0gJmNjLT5pdl9nZW5fcHJpdmF0ZS5sbWs7CisJaW50IHN1YmtleV9zaXplID0gY2MtPmtleV9zaXplIC8gY2MtPmtleV9wYXJ0czsKKworCS8qIExNSyBzZWVkIGlzIG9uIHRoZSBwb3NpdGlvbiBvZiBMTUtfS0VZUyArIDEga2V5ICovCisJaWYgKGxtay0+c2VlZCkKKwkJbWVtY3B5KGxtay0+c2VlZCwgY2MtPmtleSArIChjYy0+dGZtc19jb3VudCAqIHN1YmtleV9zaXplKSwKKwkJICAgICAgIGNyeXB0b19zaGFzaF9kaWdlc3RzaXplKGxtay0+aGFzaF90Zm0pKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0X2l2X2xta193aXBlKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworCXN0cnVjdCBpdl9sbWtfcHJpdmF0ZSAqbG1rID0gJmNjLT5pdl9nZW5fcHJpdmF0ZS5sbWs7CisKKwlpZiAobG1rLT5zZWVkKQorCQltZW1zZXQobG1rLT5zZWVkLCAwLCBMTUtfU0VFRF9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0X2l2X2xta19vbmUoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwKKwkJCSAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEsCisJCQkgICAgdTggKmRhdGEpCit7CisJc3RydWN0IGl2X2xta19wcml2YXRlICpsbWsgPSAmY2MtPml2X2dlbl9wcml2YXRlLmxtazsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2hhc2hfZGVzYyBkZXNjOworCQljaGFyIGN0eFtjcnlwdG9fc2hhc2hfZGVzY3NpemUobG1rLT5oYXNoX3RmbSldOworCX0gc2Rlc2M7CisJc3RydWN0IG1kNV9zdGF0ZSBtZDVzdGF0ZTsKKwl1MzIgYnVmWzRdOworCWludCBpLCByOworCisJc2Rlc2MuZGVzYy50Zm0gPSBsbWstPmhhc2hfdGZtOworCXNkZXNjLmRlc2MuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisKKwlyID0gY3J5cHRvX3NoYXNoX2luaXQoJnNkZXNjLmRlc2MpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChsbWstPnNlZWQpIHsKKwkJciA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLmRlc2MsIGxtay0+c2VlZCwgTE1LX1NFRURfU0laRSk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJfQorCisJLyogU2VjdG9yIGlzIGFsd2F5cyA1MTJCLCBibG9jayBzaXplIDE2LCBhZGQgZGF0YSBvZiBibG9ja3MgMS0zMSAqLworCXIgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy5kZXNjLCBkYXRhICsgMTYsIDE2ICogMzEpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qIFNlY3RvciBpcyBjcm9wcGVkIHRvIDU2IGJpdHMgaGVyZSAqLworCWJ1ZlswXSA9IGNwdV90b19sZTMyKGRtcmVxLT5pdl9zZWN0b3IgJiAweEZGRkZGRkZGKTsKKwlidWZbMV0gPSBjcHVfdG9fbGUzMigoKCh1NjQpZG1yZXEtPml2X3NlY3RvciA+PiAzMikgJiAweDAwRkZGRkZGKSB8IDB4ODAwMDAwMDApOworCWJ1ZlsyXSA9IGNwdV90b19sZTMyKDQwMjQpOworCWJ1ZlszXSA9IDA7CisJciA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLmRlc2MsICh1OCAqKWJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qIE5vIE1ENSBwYWRkaW5nIGhlcmUgKi8KKwlyID0gY3J5cHRvX3NoYXNoX2V4cG9ydCgmc2Rlc2MuZGVzYywgJm1kNXN0YXRlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUQ1X0hBU0hfV09SRFM7IGkrKykKKwkJX19jcHVfdG9fbGUzMnMoJm1kNXN0YXRlLmhhc2hbaV0pOworCW1lbWNweShpdiwgJm1kNXN0YXRlLmhhc2gsIGNjLT5pdl9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0X2l2X2xta19nZW4oc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHU4ICppdiwKKwkJCSAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCit7CisJdTggKnNyYzsKKwlpbnQgciA9IDA7CisKKwlpZiAoYmlvX2RhdGFfZGlyKGRtcmVxLT5jdHgtPmJpb19pbikgPT0gV1JJVEUpIHsKKwkJc3JjID0ga21hcF9hdG9taWMoc2dfcGFnZSgmZG1yZXEtPnNnX2luKSwgS01fVVNFUjApOworCQlyID0gY3J5cHRfaXZfbG1rX29uZShjYywgaXYsIGRtcmVxLCBzcmMgKyBkbXJlcS0+c2dfaW4ub2Zmc2V0KTsKKwkJa3VubWFwX2F0b21pYyhzcmMsIEtNX1VTRVIwKTsKKwl9IGVsc2UKKwkJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjcnlwdF9pdl9sbWtfcG9zdChzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgdTggKml2LAorCQkJICAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCit7CisJdTggKmRzdDsKKwlpbnQgcjsKKworCWlmIChiaW9fZGF0YV9kaXIoZG1yZXEtPmN0eC0+YmlvX2luKSA9PSBXUklURSkKKwkJcmV0dXJuIDA7CisKKwlkc3QgPSBrbWFwX2F0b21pYyhzZ19wYWdlKCZkbXJlcS0+c2dfb3V0KSwgS01fVVNFUjApOworCXIgPSBjcnlwdF9pdl9sbWtfb25lKGNjLCBpdiwgZG1yZXEsIGRzdCArIGRtcmVxLT5zZ19vdXQub2Zmc2V0KTsKKworCS8qIFR3ZWFrIHRoZSBmaXJzdCBibG9jayBvZiBwbGFpbnRleHQgc2VjdG9yICovCisJaWYgKCFyKQorCQljcnlwdG9feG9yKGRzdCArIGRtcmVxLT5zZ19vdXQub2Zmc2V0LCBpdiwgY2MtPml2X3NpemUpOworCisJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIwKTsKKwlyZXR1cm4gcjsKK30KKwogc3RhdGljIHN0cnVjdCBjcnlwdF9pdl9vcGVyYXRpb25zIGNyeXB0X2l2X3BsYWluX29wcyA9IHsKIAkuZ2VuZXJhdG9yID0gY3J5cHRfaXZfcGxhaW5fZ2VuCiB9OwpAQCAtMzczLDYgKzY0NiwxNSBAQAogCS5nZW5lcmF0b3IgPSBjcnlwdF9pdl9udWxsX2dlbgogfTsKIAorc3RhdGljIHN0cnVjdCBjcnlwdF9pdl9vcGVyYXRpb25zIGNyeXB0X2l2X2xta19vcHMgPSB7CisJLmN0cgkgICA9IGNyeXB0X2l2X2xta19jdHIsCisJLmR0cgkgICA9IGNyeXB0X2l2X2xta19kdHIsCisJLmluaXQJICAgPSBjcnlwdF9pdl9sbWtfaW5pdCwKKwkud2lwZQkgICA9IGNyeXB0X2l2X2xta193aXBlLAorCS5nZW5lcmF0b3IgPSBjcnlwdF9pdl9sbWtfZ2VuLAorCS5wb3N0CSAgID0gY3J5cHRfaXZfbG1rX3Bvc3QKK307CisKIHN0YXRpYyB2b2lkIGNyeXB0X2NvbnZlcnRfaW5pdChzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKIAkJCSAgICAgICBzdHJ1Y3QgY29udmVydF9jb250ZXh0ICpjdHgsCiAJCQkgICAgICAgc3RydWN0IGJpbyAqYmlvX291dCwgc3RydWN0IGJpbyAqYmlvX2luLApAQCAtNDAwLDYgKzY4MiwxMyBAQAogCXJldHVybiAoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqKSgoY2hhciAqKWRtcmVxIC0gY2MtPmRtcmVxX3N0YXJ0KTsKIH0KIAorc3RhdGljIHU4ICppdl9vZl9kbXJlcShzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKKwkJICAgICAgIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKK3sKKwlyZXR1cm4gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpKGRtcmVxICsgMSksCisJCWNyeXB0b19hYmxrY2lwaGVyX2FsaWdubWFzayhhbnlfdGZtKGNjKSkgKyAxKTsKK30KKwogc3RhdGljIGludCBjcnlwdF9jb252ZXJ0X2Jsb2NrKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLAogCQkJICAgICAgIHN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCwKIAkJCSAgICAgICBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCkBAIC00MTEsOSArNzAwLDkgQEAKIAlpbnQgciA9IDA7CiAKIAlkbXJlcSA9IGRtcmVxX29mX3JlcShjYywgcmVxKTsKLQlpdiA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKShkbXJlcSArIDEpLAotCQkJIGNyeXB0b19hYmxrY2lwaGVyX2FsaWdubWFzayhjYy0+dGZtKSArIDEpOworCWl2ID0gaXZfb2ZfZG1yZXEoY2MsIGRtcmVxKTsKIAorCWRtcmVxLT5pdl9zZWN0b3IgPSBjdHgtPnNlY3RvcjsKIAlkbXJlcS0+Y3R4ID0gY3R4OwogCXNnX2luaXRfdGFibGUoJmRtcmVxLT5zZ19pbiwgMSk7CiAJc2dfc2V0X3BhZ2UoJmRtcmVxLT5zZ19pbiwgYnZfaW4tPmJ2X3BhZ2UsIDEgPDwgU0VDVE9SX1NISUZULApAQCAtNDM2LDcgKzcyNSw3IEBACiAJfQogCiAJaWYgKGNjLT5pdl9nZW5fb3BzKSB7Ci0JCXIgPSBjYy0+aXZfZ2VuX29wcy0+Z2VuZXJhdG9yKGNjLCBpdiwgY3R4LT5zZWN0b3IpOworCQlyID0gY2MtPml2X2dlbl9vcHMtPmdlbmVyYXRvcihjYywgaXYsIGRtcmVxKTsKIAkJaWYgKHIgPCAwKQogCQkJcmV0dXJuIHI7CiAJfQpAQCAtNDQ5LDIxICs3MzgsMjggQEAKIAllbHNlCiAJCXIgPSBjcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAKKwlpZiAoIXIgJiYgY2MtPml2X2dlbl9vcHMgJiYgY2MtPml2X2dlbl9vcHMtPnBvc3QpCisJCXIgPSBjYy0+aXZfZ2VuX29wcy0+cG9zdChjYywgaXYsIGRtcmVxKTsKKwogCXJldHVybiByOwogfQogCiBzdGF0aWMgdm9pZCBrY3J5cHRkX2FzeW5jX2RvbmUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXEsCiAJCQkgICAgICAgaW50IGVycm9yKTsKKwogc3RhdGljIHZvaWQgY3J5cHRfYWxsb2NfcmVxKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLAogCQkJICAgIHN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoIWNjLT5yZXEpCi0JCWNjLT5yZXEgPSBtZW1wb29sX2FsbG9jKGNjLT5yZXFfcG9vbCwgR0ZQX05PSU8pOwotCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfdGZtKGNjLT5yZXEsIGNjLT50Zm0pOwotCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY2FsbGJhY2soY2MtPnJlcSwgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cgfAotCQkJCQlDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAsCi0JCQkJCWtjcnlwdGRfYXN5bmNfZG9uZSwKLQkJCQkJZG1yZXFfb2ZfcmVxKGNjLCBjYy0+cmVxKSk7CisJc3RydWN0IGNyeXB0X2NwdSAqdGhpc19jYyA9IHRoaXNfY3J5cHRfY29uZmlnKGNjKTsKKwl1bnNpZ25lZCBrZXlfaW5kZXggPSBjdHgtPnNlY3RvciAmIChjYy0+dGZtc19jb3VudCAtIDEpOworCisJaWYgKCF0aGlzX2NjLT5yZXEpCisJCXRoaXNfY2MtPnJlcSA9IG1lbXBvb2xfYWxsb2MoY2MtPnJlcV9wb29sLCBHRlBfTk9JTyk7CisKKwlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X3RmbSh0aGlzX2NjLT5yZXEsIHRoaXNfY2MtPnRmbXNba2V5X2luZGV4XSk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayh0aGlzX2NjLT5yZXEsCisJICAgIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HIHwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAorCSAgICBrY3J5cHRkX2FzeW5jX2RvbmUsIGRtcmVxX29mX3JlcShjYywgdGhpc19jYy0+cmVxKSk7CiB9CiAKIC8qCkBAIC00NzIsNiArNzY4LDcgQEAKIHN0YXRpYyBpbnQgY3J5cHRfY29udmVydChzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKIAkJCSBzdHJ1Y3QgY29udmVydF9jb250ZXh0ICpjdHgpCiB7CisJc3RydWN0IGNyeXB0X2NwdSAqdGhpc19jYyA9IHRoaXNfY3J5cHRfY29uZmlnKGNjKTsKIAlpbnQgcjsKIAogCWF0b21pY19zZXQoJmN0eC0+cGVuZGluZywgMSk7CkBAIC00ODMsNyArNzgwLDcgQEAKIAogCQlhdG9taWNfaW5jKCZjdHgtPnBlbmRpbmcpOwogCi0JCXIgPSBjcnlwdF9jb252ZXJ0X2Jsb2NrKGNjLCBjdHgsIGNjLT5yZXEpOworCQlyID0gY3J5cHRfY29udmVydF9ibG9jayhjYywgY3R4LCB0aGlzX2NjLT5yZXEpOwogCiAJCXN3aXRjaCAocikgewogCQkvKiBhc3luYyAqLwpAQCAtNDkyLDcgKzc4OSw3IEBACiAJCQlJTklUX0NPTVBMRVRJT04oY3R4LT5yZXN0YXJ0KTsKIAkJCS8qIGZhbGwgdGhyb3VnaCovCiAJCWNhc2UgLUVJTlBST0dSRVNTOgotCQkJY2MtPnJlcSA9IE5VTEw7CisJCQl0aGlzX2NjLT5yZXEgPSBOVUxMOwogCQkJY3R4LT5zZWN0b3IrKzsKIAkJCWNvbnRpbnVlOwogCkBAIC02NTEsNiArOTQ4LDkgQEAKICAqIFRoZXkgbXVzdCBiZSBzZXBhcmF0ZWQgYXMgb3RoZXJ3aXNlIHRoZSBmaW5hbCBzdGFnZXMgY291bGQgYmUKICAqIHN0YXJ2ZWQgYnkgbmV3IHJlcXVlc3RzIHdoaWNoIGNhbiBibG9jayBpbiB0aGUgZmlyc3Qgc3RhZ2VzIGR1ZQogICogdG8gbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVGhlIHdvcmsgaXMgZG9uZSBwZXIgQ1BVIGdsb2JhbCBmb3IgYWxsIGRtLWNyeXB0IGluc3RhbmNlcy4KKyAqIFRoZXkgc2hvdWxkIG5vdCBkZXBlbmQgb24gZWFjaCBvdGhlciBhbmQgZG8gbm90IGJsb2NrLgogICovCiBzdGF0aWMgdm9pZCBjcnlwdF9lbmRpbyhzdHJ1Y3QgYmlvICpjbG9uZSwgaW50IGVycm9yKQogewpAQCAtNjkxLDI2ICs5OTEsMzAgQEAKIAljbG9uZS0+YmlfZGVzdHJ1Y3RvciA9IGRtX2NyeXB0X2Jpb19kZXN0cnVjdG9yOwogfQogCi1zdGF0aWMgdm9pZCBrY3J5cHRkX2lvX3JlYWQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKK3N0YXRpYyB2b2lkIGtjcnlwdGRfdW5wbHVnKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworCWJsa191bnBsdWcoYmRldl9nZXRfcXVldWUoY2MtPmRldi0+YmRldikpOworfQorCitzdGF0aWMgaW50IGtjcnlwdGRfaW9fcmVhZChzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MgPSBpby0+dGFyZ2V0LT5wcml2YXRlOwogCXN0cnVjdCBiaW8gKmJhc2VfYmlvID0gaW8tPmJhc2VfYmlvOwogCXN0cnVjdCBiaW8gKmNsb25lOwogCi0JY3J5cHRfaW5jX3BlbmRpbmcoaW8pOwotCiAJLyoKIAkgKiBUaGUgYmxvY2sgbGF5ZXIgbWlnaHQgbW9kaWZ5IHRoZSBidmVjIGFycmF5LCBzbyBhbHdheXMKIAkgKiBjb3B5IHRoZSByZXF1aXJlZCBidmVjcyBiZWNhdXNlIHdlIG5lZWQgdGhlIG9yaWdpbmFsCiAJICogb25lIGluIG9yZGVyIHRvIGRlY3J5cHQgdGhlIHdob2xlIGJpbyBkYXRhICphZnRlcndhcmRzKi4KIAkgKi8KLQljbG9uZSA9IGJpb19hbGxvY19iaW9zZXQoR0ZQX05PSU8sIGJpb19zZWdtZW50cyhiYXNlX2JpbyksIGNjLT5icyk7Ci0JaWYgKHVubGlrZWx5KCFjbG9uZSkpIHsKLQkJaW8tPmVycm9yID0gLUVOT01FTTsKLQkJY3J5cHRfZGVjX3BlbmRpbmcoaW8pOwotCQlyZXR1cm47CisJY2xvbmUgPSBiaW9fYWxsb2NfYmlvc2V0KGdmcCwgYmlvX3NlZ21lbnRzKGJhc2VfYmlvKSwgY2MtPmJzKTsKKwlpZiAoIWNsb25lKSB7CisJCWtjcnlwdGRfdW5wbHVnKGNjKTsKKwkJcmV0dXJuIDE7CiAJfQogCisJY3J5cHRfaW5jX3BlbmRpbmcoaW8pOworCiAJY2xvbmVfaW5pdChpbywgY2xvbmUpOwogCWNsb25lLT5iaV9pZHggPSAwOwogCWNsb25lLT5iaV92Y250ID0gYmlvX3NlZ21lbnRzKGJhc2VfYmlvKTsKQEAgLTcyMCw2ICsxMDI0LDcgQEAKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSAqIGNsb25lLT5iaV92Y250KTsKIAogCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGNsb25lKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga2NyeXB0ZF9pb193cml0ZShzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKQpAQCAtNzMyLDkgKzEwMzcsMTIgQEAKIHsKIAlzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkbV9jcnlwdF9pbywgd29yayk7CiAKLQlpZiAoYmlvX2RhdGFfZGlyKGlvLT5iYXNlX2JpbykgPT0gUkVBRCkKLQkJa2NyeXB0ZF9pb19yZWFkKGlvKTsKLQllbHNlCisJaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpIHsKKwkJY3J5cHRfaW5jX3BlbmRpbmcoaW8pOworCQlpZiAoa2NyeXB0ZF9pb19yZWFkKGlvLCBHRlBfTk9JTykpCisJCQlpby0+ZXJyb3IgPSAtRU5PTUVNOworCQljcnlwdF9kZWNfcGVuZGluZyhpbyk7CisJfSBlbHNlCiAJCWtjcnlwdGRfaW9fd3JpdGUoaW8pOwogfQogCkBAIC05MDEsNiArMTIwOSw5IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoIWVycm9yICYmIGNjLT5pdl9nZW5fb3BzICYmIGNjLT5pdl9nZW5fb3BzLT5wb3N0KQorCQllcnJvciA9IGNjLT5pdl9nZW5fb3BzLT5wb3N0KGNjLCBpdl9vZl9kbXJlcShjYywgZG1yZXEpLCBkbXJlcSk7CisKIAltZW1wb29sX2ZyZWUocmVxX29mX2RtcmVxKGNjLCBkbXJlcSksIGNjLT5yZXFfcG9vbCk7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+cGVuZGluZykpCkBAIC05NzEsMzQgKzEyODIsODQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGNyeXB0X2ZyZWVfdGZtcyhzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3J5cHRfY3B1ICpjcHVfY2MgPSBwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2MtPnRmbXNfY291bnQ7IGkrKykKKwkJaWYgKGNwdV9jYy0+dGZtc1tpXSAmJiAhSVNfRVJSKGNwdV9jYy0+dGZtc1tpXSkpIHsKKwkJCWNyeXB0b19mcmVlX2FibGtjaXBoZXIoY3B1X2NjLT50Zm1zW2ldKTsKKwkJCWNwdV9jYy0+dGZtc1tpXSA9IE5VTEw7CisJCX0KK30KKworc3RhdGljIGludCBjcnlwdF9hbGxvY190Zm1zKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCBpbnQgY3B1LCBjaGFyICpjaXBoZXJtb2RlKQoreworCXN0cnVjdCBjcnlwdF9jcHUgKmNwdV9jYyA9IHBlcl9jcHVfcHRyKGNjLT5jcHUsIGNwdSk7CisJdW5zaWduZWQgaTsKKwlpbnQgZXJyOworCisJZm9yIChpID0gMDsgaSA8IGNjLT50Zm1zX2NvdW50OyBpKyspIHsKKwkJY3B1X2NjLT50Zm1zW2ldID0gY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoY2lwaGVybW9kZSwgMCwgMCk7CisJCWlmIChJU19FUlIoY3B1X2NjLT50Zm1zW2ldKSkgeworCQkJZXJyID0gUFRSX0VSUihjcHVfY2MtPnRmbXNbaV0pOworCQkJY3J5cHRfZnJlZV90Zm1zKGNjLCBjcHUpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyeXB0X3NldGtleV9hbGxjcHVzKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjKQoreworCXVuc2lnbmVkIHN1YmtleV9zaXplID0gY2MtPmtleV9zaXplID4+IGlsb2cyKGNjLT50Zm1zX2NvdW50KTsKKwlpbnQgY3B1LCBlcnIgPSAwLCBpLCByOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY2MtPnRmbXNfY291bnQ7IGkrKykgeworCQkJciA9IGNyeXB0b19hYmxrY2lwaGVyX3NldGtleShwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpLT50Zm1zW2ldLAorCQkJCQkJICAgICBjYy0+a2V5ICsgKGkgKiBzdWJrZXlfc2l6ZSksIHN1YmtleV9zaXplKTsKKwkJCWlmIChyKQorCQkJCWVyciA9IHI7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IGNyeXB0X3NldF9rZXkoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIGNoYXIgKmtleSkKIHsKLQl1bnNpZ25lZCBrZXlfc2l6ZSA9IHN0cmxlbihrZXkpID4+IDE7Ci0KLQlpZiAoY2MtPmtleV9zaXplICYmIGNjLT5rZXlfc2l6ZSAhPSBrZXlfc2l6ZSkKKwkvKiBUaGUga2V5IHNpemUgbWF5IG5vdCBiZSBjaGFuZ2VkLiAqLworCWlmIChjYy0+a2V5X3NpemUgIT0gKHN0cmxlbihrZXkpID4+IDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNjLT5rZXlfc2l6ZSA9IGtleV9zaXplOyAvKiBpbml0aWFsIHNldHRpbmdzICovCisJLyogSHlwaGVuICh3aGljaCBnaXZlcyBhIGtleV9zaXplIG9mIHplcm8pIG1lYW5zIHRoZXJlIGlzIG5vIGtleS4gKi8KKwlpZiAoIWNjLT5rZXlfc2l6ZSAmJiBzdHJjbXAoa2V5LCAiLSIpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgoIWtleV9zaXplICYmIHN0cmNtcChrZXksICItIikpIHx8Ci0JICAgKGtleV9zaXplICYmIGNyeXB0X2RlY29kZV9rZXkoY2MtPmtleSwga2V5LCBrZXlfc2l6ZSkgPCAwKSkKKwlpZiAoY2MtPmtleV9zaXplICYmIGNyeXB0X2RlY29kZV9rZXkoY2MtPmtleSwga2V5LCBjYy0+a2V5X3NpemUpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzZXRfYml0KERNX0NSWVBUX0tFWV9WQUxJRCwgJmNjLT5mbGFncyk7CiAKLQlyZXR1cm4gY3J5cHRvX2FibGtjaXBoZXJfc2V0a2V5KGNjLT50Zm0sIGNjLT5rZXksIGNjLT5rZXlfc2l6ZSk7CisJcmV0dXJuIGNyeXB0X3NldGtleV9hbGxjcHVzKGNjKTsKIH0KIAogc3RhdGljIGludCBjcnlwdF93aXBlX2tleShzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYykKIHsKIAljbGVhcl9iaXQoRE1fQ1JZUFRfS0VZX1ZBTElELCAmY2MtPmZsYWdzKTsKIAltZW1zZXQoJmNjLT5rZXksIDAsIGNjLT5rZXlfc2l6ZSAqIHNpemVvZih1OCkpOwotCXJldHVybiBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkoY2MtPnRmbSwgY2MtPmtleSwgY2MtPmtleV9zaXplKTsKKworCXJldHVybiBjcnlwdF9zZXRrZXlfYWxsY3B1cyhjYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNyeXB0X2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IHRpLT5wcml2YXRlOworCXN0cnVjdCBjcnlwdF9jcHUgKmNwdV9jYzsKKwlpbnQgY3B1OwogCiAJdGktPnByaXZhdGUgPSBOVUxMOwogCkBAIC0xMDEwLDYgKzEzNzEsMTQgQEAKIAlpZiAoY2MtPmNyeXB0X3F1ZXVlKQogCQlkZXN0cm95X3dvcmtxdWV1ZShjYy0+Y3J5cHRfcXVldWUpOwogCisJaWYgKGNjLT5jcHUpCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJCWNwdV9jYyA9IHBlcl9jcHVfcHRyKGNjLT5jcHUsIGNwdSk7CisJCQlpZiAoY3B1X2NjLT5yZXEpCisJCQkJbWVtcG9vbF9mcmVlKGNwdV9jYy0+cmVxLCBjYy0+cmVxX3Bvb2wpOworCQkJY3J5cHRfZnJlZV90Zm1zKGNjLCBjcHUpOworCQl9CisKIAlpZiAoY2MtPmJzKQogCQliaW9zZXRfZnJlZShjYy0+YnMpOwogCkBAIC0xMDIzLDE0ICsxMzkyLDE0IEBACiAJaWYgKGNjLT5pdl9nZW5fb3BzICYmIGNjLT5pdl9nZW5fb3BzLT5kdHIpCiAJCWNjLT5pdl9nZW5fb3BzLT5kdHIoY2MpOwogCi0JaWYgKGNjLT50Zm0gJiYgIUlTX0VSUihjYy0+dGZtKSkKLQkJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihjYy0+dGZtKTsKLQogCWlmIChjYy0+ZGV2KQogCQlkbV9wdXRfZGV2aWNlKHRpLCBjYy0+ZGV2KTsKIAorCWlmIChjYy0+Y3B1KQorCQlmcmVlX3BlcmNwdShjYy0+Y3B1KTsKKwogCWt6ZnJlZShjYy0+Y2lwaGVyKTsKLQlremZyZWUoY2MtPmNpcGhlcl9tb2RlKTsKKwlremZyZWUoY2MtPmNpcGhlcl9zdHJpbmcpOwogCiAJLyogTXVzdCB6ZXJvIGtleSBtYXRlcmlhbCBiZWZvcmUgZnJlZWluZyAqLwogCWt6ZnJlZShjYyk7CkBAIC0xMDQwLDkgKzE0MDksOSBAQAogCQkJICAgIGNoYXIgKmNpcGhlcl9pbiwgY2hhciAqa2V5KQogewogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gdGktPnByaXZhdGU7Ci0JY2hhciAqdG1wLCAqY2lwaGVyLCAqY2hhaW5tb2RlLCAqaXZtb2RlLCAqaXZvcHRzOworCWNoYXIgKnRtcCwgKmNpcGhlciwgKmNoYWlubW9kZSwgKml2bW9kZSwgKml2b3B0cywgKmtleWNvdW50OwogCWNoYXIgKmNpcGhlcl9hcGkgPSBOVUxMOwotCWludCByZXQgPSAtRUlOVkFMOworCWludCBjcHUsIHJldCA9IC1FSU5WQUw7CiAKIAkvKiBDb252ZXJ0IHRvIGNyeXB0byBhcGkgZGVmaW5pdGlvbj8gKi8KIAlpZiAoc3RyY2hyKGNpcGhlcl9pbiwgJygnKSkgewpAQCAtMTA1MCwyMyArMTQxOSwzMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwljYy0+Y2lwaGVyX3N0cmluZyA9IGtzdHJkdXAoY2lwaGVyX2luLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNjLT5jaXBoZXJfc3RyaW5nKQorCQlnb3RvIGJhZF9tZW07CisKIAkvKgogCSAqIExlZ2FjeSBkbS1jcnlwdCBjaXBoZXIgc3BlY2lmaWNhdGlvbgotCSAqIGNpcGhlci1tb2RlLWl2Oml2b3B0cworCSAqIGNpcGhlcls6a2V5Y291bnRdLW1vZGUtaXY6aXZvcHRzCiAJICovCiAJdG1wID0gY2lwaGVyX2luOwotCWNpcGhlciA9IHN0cnNlcCgmdG1wLCAiLSIpOworCWtleWNvdW50ID0gc3Ryc2VwKCZ0bXAsICItIik7CisJY2lwaGVyID0gc3Ryc2VwKCZrZXljb3VudCwgIjoiKTsKKworCWlmICgha2V5Y291bnQpCisJCWNjLT50Zm1zX2NvdW50ID0gMTsKKwllbHNlIGlmIChzc2NhbmYoa2V5Y291bnQsICIldSIsICZjYy0+dGZtc19jb3VudCkgIT0gMSB8fAorCQkgIWlzX3Bvd2VyX29mXzIoY2MtPnRmbXNfY291bnQpKSB7CisJCXRpLT5lcnJvciA9ICJCYWQgY2lwaGVyIGtleSBjb3VudCBzcGVjaWZpY2F0aW9uIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNjLT5rZXlfcGFydHMgPSBjYy0+dGZtc19jb3VudDsKIAogCWNjLT5jaXBoZXIgPSBrc3RyZHVwKGNpcGhlciwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYy0+Y2lwaGVyKQogCQlnb3RvIGJhZF9tZW07CiAKLQlpZiAodG1wKSB7Ci0JCWNjLT5jaXBoZXJfbW9kZSA9IGtzdHJkdXAodG1wLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjYy0+Y2lwaGVyX21vZGUpCi0JCQlnb3RvIGJhZF9tZW07Ci0JfQotCiAJY2hhaW5tb2RlID0gc3Ryc2VwKCZ0bXAsICItIik7CiAJaXZvcHRzID0gc3Ryc2VwKCZ0bXAsICItIik7CiAJaXZtb2RlID0gc3Ryc2VwKCZpdm9wdHMsICI6Iik7CkBAIC0xMDc0LDEwICsxNDUxLDE5IEBACiAJaWYgKHRtcCkKIAkJRE1XQVJOKCJJZ25vcmluZyB1bmV4cGVjdGVkIGFkZGl0aW9uYWwgY2lwaGVyIG9wdGlvbnMiKTsKIAotCS8qIENvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIGRtLWNyeXB0IG1hcHBpbmdzICovCisJY2MtPmNwdSA9IF9fYWxsb2NfcGVyY3B1KHNpemVvZigqKGNjLT5jcHUpKSArCisJCQkJIGNjLT50Zm1zX2NvdW50ICogc2l6ZW9mKCooY2MtPmNwdS0+dGZtcykpLAorCQkJCSBfX2FsaWdub2ZfXyhzdHJ1Y3QgY3J5cHRfY3B1KSk7CisJaWYgKCFjYy0+Y3B1KSB7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgcGVyIGNwdSBzdGF0ZSI7CisJCWdvdG8gYmFkX21lbTsKKwl9CisKKwkvKgorCSAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9yaWdpbmFsIGRtLWNyeXB0IG1hcHBpbmcgZm9ybWF0LCBpZgorCSAqIG9ubHkgdGhlIGNpcGhlciBuYW1lIGlzIHN1cHBsaWVkLCB1c2UgY2JjLXBsYWluLgorCSAqLwogCWlmICghY2hhaW5tb2RlIHx8ICghc3RyY21wKGNoYWlubW9kZSwgInBsYWluIikgJiYgIWl2bW9kZSkpIHsKLQkJa2ZyZWUoY2MtPmNpcGhlcl9tb2RlKTsKLQkJY2MtPmNpcGhlcl9tb2RlID0ga3N0cmR1cCgiY2JjLXBsYWluIiwgR0ZQX0tFUk5FTCk7CiAJCWNoYWlubW9kZSA9ICJjYmMiOwogCQlpdm1vZGUgPSAicGxhaW4iOwogCX0KQEAgLTEwOTksMTEgKzE0ODUsMTIgQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBjaXBoZXIgKi8KLQljYy0+dGZtID0gY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoY2lwaGVyX2FwaSwgMCwgMCk7Ci0JaWYgKElTX0VSUihjYy0+dGZtKSkgewotCQlyZXQgPSBQVFJfRVJSKGNjLT50Zm0pOwotCQl0aS0+ZXJyb3IgPSAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gdGZtIjsKLQkJZ290byBiYWQ7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlyZXQgPSBjcnlwdF9hbGxvY190Zm1zKGNjLCBjcHUsIGNpcGhlcl9hcGkpOworCQlpZiAocmV0IDwgMCkgeworCQkJdGktPmVycm9yID0gIkVycm9yIGFsbG9jYXRpbmcgY3J5cHRvIHRmbSI7CisJCQlnb3RvIGJhZDsKKwkJfQogCX0KIAogCS8qIEluaXRpYWxpemUgYW5kIHNldCBrZXkgKi8KQEAgLTExMTQsNyArMTUwMSw3IEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSBJViAqLwotCWNjLT5pdl9zaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGNjLT50Zm0pOworCWNjLT5pdl9zaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGFueV90Zm0oY2MpKTsKIAlpZiAoY2MtPml2X3NpemUpCiAJCS8qIGF0IGxlYXN0IGEgNjQgYml0IHNlY3RvciBudW1iZXIgc2hvdWxkIGZpdCBpbiBvdXIgYnVmZmVyICovCiAJCWNjLT5pdl9zaXplID0gbWF4KGNjLT5pdl9zaXplLApAQCAtMTEzNyw3ICsxNTI0LDE1IEBACiAJCWNjLT5pdl9nZW5fb3BzID0gJmNyeXB0X2l2X2JlbmJpX29wczsKIAllbHNlIGlmIChzdHJjbXAoaXZtb2RlLCAibnVsbCIpID09IDApCiAJCWNjLT5pdl9nZW5fb3BzID0gJmNyeXB0X2l2X251bGxfb3BzOwotCWVsc2UgeworCWVsc2UgaWYgKHN0cmNtcChpdm1vZGUsICJsbWsiKSA9PSAwKSB7CisJCWNjLT5pdl9nZW5fb3BzID0gJmNyeXB0X2l2X2xta19vcHM7CisJCS8qIFZlcnNpb24gMiBhbmQgMyBpcyByZWNvZ25pc2VkIGFjY29yZGluZworCQkgKiB0byBsZW5ndGggb2YgcHJvdmlkZWQgbXVsdGkta2V5IHN0cmluZy4KKwkJICogSWYgcHJlc2VudCAodmVyc2lvbiAzKSwgbGFzdCBrZXkgaXMgdXNlZCBhcyBJViBzZWVkLgorCQkgKi8KKwkJaWYgKGNjLT5rZXlfc2l6ZSAlIGNjLT5rZXlfcGFydHMpCisJCQljYy0+a2V5X3BhcnRzKys7CisJfSBlbHNlIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJdGktPmVycm9yID0gIkludmFsaWQgSVYgbW9kZSI7CiAJCWdvdG8gYmFkOwpAQCAtMTE5NCw2ICsxNTg5LDcgQEAKIAkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBlbmNyeXB0aW9uIGNvbnRleHQiOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJY2MtPmtleV9zaXplID0ga2V5X3NpemU7CiAKIAl0aS0+cHJpdmF0ZSA9IGNjOwogCXJldCA9IGNyeXB0X2N0cl9jaXBoZXIodGksIGFyZ3ZbMF0sIGFyZ3ZbMV0pOwpAQCAtMTIwOCw5ICsxNjA0LDkgQEAKIAl9CiAKIAljYy0+ZG1yZXFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCk7Ci0JY2MtPmRtcmVxX3N0YXJ0ICs9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXNpemUoY2MtPnRmbSk7CisJY2MtPmRtcmVxX3N0YXJ0ICs9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXNpemUoYW55X3RmbShjYykpOwogCWNjLT5kbXJlcV9zdGFydCA9IEFMSUdOKGNjLT5kbXJlcV9zdGFydCwgY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KCkpOwotCWNjLT5kbXJlcV9zdGFydCArPSBjcnlwdG9fYWJsa2NpcGhlcl9hbGlnbm1hc2soY2MtPnRmbSkgJgorCWNjLT5kbXJlcV9zdGFydCArPSBjcnlwdG9fYWJsa2NpcGhlcl9hbGlnbm1hc2soYW55X3RmbShjYykpICYKIAkJCSAgIH4oY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KCkgLSAxKTsKIAogCWNjLT5yZXFfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbChNSU5fSU9TLCBjYy0+ZG1yZXFfc3RhcnQgKwpAQCAtMTIxOSw3ICsxNjE1LDYgQEAKIAkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBjcnlwdCByZXF1ZXN0IG1lbXBvb2wiOwogCQlnb3RvIGJhZDsKIAl9Ci0JY2MtPnJlcSA9IE5VTEw7CiAKIAljYy0+cGFnZV9wb29sID0gbWVtcG9vbF9jcmVhdGVfcGFnZV9wb29sKE1JTl9QT09MX1BBR0VTLCAwKTsKIAlpZiAoIWNjLT5wYWdlX3Bvb2wpIHsKQEAgLTEyNTIsMTMgKzE2NDcsMjAgQEAKIAljYy0+c3RhcnQgPSB0bXBsbDsKIAogCXJldCA9IC1FTk9NRU07Ci0JY2MtPmlvX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtjcnlwdGRfaW8iKTsKKwljYy0+aW9fcXVldWUgPSBhbGxvY193b3JrcXVldWUoImtjcnlwdGRfaW8iLAorCQkJCSAgICAgICBXUV9OT05fUkVFTlRSQU5UfAorCQkJCSAgICAgICBXUV9NRU1fUkVDTEFJTSwKKwkJCQkgICAgICAgMSk7CiAJaWYgKCFjYy0+aW9fcXVldWUpIHsKIAkJdGktPmVycm9yID0gIkNvdWxkbid0IGNyZWF0ZSBrY3J5cHRkIGlvIHF1ZXVlIjsKIAkJZ290byBiYWQ7CiAJfQogCi0JY2MtPmNyeXB0X3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtjcnlwdGQiKTsKKwljYy0+Y3J5cHRfcXVldWUgPSBhbGxvY193b3JrcXVldWUoImtjcnlwdGQiLAorCQkJCQkgIFdRX05PTl9SRUVOVFJBTlR8CisJCQkJCSAgV1FfQ1BVX0lOVEVOU0lWRXwKKwkJCQkJICBXUV9NRU1fUkVDTEFJTSwKKwkJCQkJICAxKTsKIAlpZiAoIWNjLT5jcnlwdF9xdWV1ZSkgewogCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3QgY3JlYXRlIGtjcnlwdGQgcXVldWUiOwogCQlnb3RvIGJhZDsKQEAgLTEyODYsOSArMTY4OCwxMCBAQAogCiAJaW8gPSBjcnlwdF9pb19hbGxvYyh0aSwgYmlvLCBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX3NlY3RvcikpOwogCi0JaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCi0JCWtjcnlwdGRfcXVldWVfaW8oaW8pOwotCWVsc2UKKwlpZiAoYmlvX2RhdGFfZGlyKGlvLT5iYXNlX2JpbykgPT0gUkVBRCkgeworCQlpZiAoa2NyeXB0ZF9pb19yZWFkKGlvLCBHRlBfTk9XQUlUKSkKKwkJCWtjcnlwdGRfcXVldWVfaW8oaW8pOworCX0gZWxzZQogCQlrY3J5cHRkX3F1ZXVlX2NyeXB0KGlvKTsKIAogCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CkBAIC0xMzA2LDEwICsxNzA5LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNUQVRVU1RZUEVfVEFCTEU6Ci0JCWlmIChjYy0+Y2lwaGVyX21vZGUpCi0JCQlETUVNSVQoIiVzLSVzICIsIGNjLT5jaXBoZXIsIGNjLT5jaXBoZXJfbW9kZSk7Ci0JCWVsc2UKLQkJCURNRU1JVCgiJXMgIiwgY2MtPmNpcGhlcik7CisJCURNRU1JVCgiJXMgIiwgY2MtPmNpcGhlcl9zdHJpbmcpOwogCiAJCWlmIChjYy0+a2V5X3NpemUgPiAwKSB7CiAJCQlpZiAoKG1heGxlbiAtIHN6KSA8ICgoY2MtPmtleV9zaXplIDw8IDEpICsgMSkpCkBAIC0xNDIxLDcgKzE4MjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIGNyeXB0X3RhcmdldCA9IHsKIAkubmFtZSAgID0gImNyeXB0IiwKLQkudmVyc2lvbiA9IHsxLCA3LCAwfSwKKwkudmVyc2lvbiA9IHsxLCAxMCwgMH0sCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgPSBjcnlwdF9jdHIsCiAJLmR0ciAgICA9IGNyeXB0X2R0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tZGVsYXkuYyBiL2RyaXZlcnMvbWQvZG0tZGVsYXkuYwppbmRleCBiYWExMTkxLi5mMTgzNzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWRlbGF5LmMKKysrIGIvZHJpdmVycy9tZC9kbS1kZWxheS5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIHsKIAlpbnQgciA9IC1FTk9NRU07CiAKLQlrZGVsYXlkX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgia2RlbGF5ZCIpOworCWtkZWxheWRfd3EgPSBhbGxvY193b3JrcXVldWUoImtkZWxheWQiLCBXUV9NRU1fUkVDTEFJTSwgMCk7CiAJaWYgKCFrZGVsYXlkX3dxKSB7CiAJCURNRVJSKCJDb3VsZG4ndCBzdGFydCBrZGVsYXlkIik7CiAJCWdvdG8gYmFkX3F1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCmluZGV4IDRiNTQ2MTguLjZkMTI3NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYworKysgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKQEAgLTI5NSwxOSArMjk1LDU1IEBACiAJCURNV0FSTigicmVtb3ZlX2FsbCBsZWZ0ICVkIG9wZW4gZGV2aWNlKHMpIiwgZGV2X3NraXBwZWQpOwogfQogCisvKgorICogU2V0IHRoZSB1dWlkIG9mIGEgaGFzaF9jZWxsIHRoYXQgaXNuJ3QgYWxyZWFkeSBzZXQuCisgKi8KK3N0YXRpYyB2b2lkIF9fc2V0X2NlbGxfdXVpZChzdHJ1Y3QgaGFzaF9jZWxsICpoYywgY2hhciAqbmV3X3V1aWQpCit7CisJbXV0ZXhfbG9jaygmZG1faGFzaF9jZWxsc19tdXRleCk7CisJaGMtPnV1aWQgPSBuZXdfdXVpZDsKKwltdXRleF91bmxvY2soJmRtX2hhc2hfY2VsbHNfbXV0ZXgpOworCisJbGlzdF9hZGQoJmhjLT51dWlkX2xpc3QsIF91dWlkX2J1Y2tldHMgKyBoYXNoX3N0cihuZXdfdXVpZCkpOworfQorCisvKgorICogQ2hhbmdlcyB0aGUgbmFtZSBvZiBhIGhhc2hfY2VsbCBhbmQgcmV0dXJucyB0aGUgb2xkIG5hbWUgZm9yCisgKiB0aGUgY2FsbGVyIHRvIGZyZWUuCisgKi8KK3N0YXRpYyBjaGFyICpfX2NoYW5nZV9jZWxsX25hbWUoc3RydWN0IGhhc2hfY2VsbCAqaGMsIGNoYXIgKm5ld19uYW1lKQoreworCWNoYXIgKm9sZF9uYW1lOworCisJLyoKKwkgKiBSZW5hbWUgYW5kIG1vdmUgdGhlIG5hbWUgY2VsbC4KKwkgKi8KKwlsaXN0X2RlbCgmaGMtPm5hbWVfbGlzdCk7CisJb2xkX25hbWUgPSBoYy0+bmFtZTsKKworCW11dGV4X2xvY2soJmRtX2hhc2hfY2VsbHNfbXV0ZXgpOworCWhjLT5uYW1lID0gbmV3X25hbWU7CisJbXV0ZXhfdW5sb2NrKCZkbV9oYXNoX2NlbGxzX211dGV4KTsKKworCWxpc3RfYWRkKCZoYy0+bmFtZV9saXN0LCBfbmFtZV9idWNrZXRzICsgaGFzaF9zdHIobmV3X25hbWUpKTsKKworCXJldHVybiBvbGRfbmFtZTsKK30KKwogc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpkbV9oYXNoX3JlbmFtZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtLAogCQkJCQkgICAgY29uc3QgY2hhciAqbmV3KQogewotCWNoYXIgKm5ld19uYW1lLCAqb2xkX25hbWU7CisJY2hhciAqbmV3X2RhdGEsICpvbGRfbmFtZSA9IE5VTEw7CiAJc3RydWN0IGhhc2hfY2VsbCAqaGM7CiAJc3RydWN0IGRtX3RhYmxlICp0YWJsZTsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJdW5zaWduZWQgY2hhbmdlX3V1aWQgPSAocGFyYW0tPmZsYWdzICYgRE1fVVVJRF9GTEFHKSA/IDEgOiAwOwogCiAJLyoKIAkgKiBkdXBsaWNhdGUgbmV3LgogCSAqLwotCW5ld19uYW1lID0ga3N0cmR1cChuZXcsIEdGUF9LRVJORUwpOwotCWlmICghbmV3X25hbWUpCisJbmV3X2RhdGEgPSBrc3RyZHVwKG5ldywgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlkb3duX3dyaXRlKCZfaGFzaF9sb2NrKTsKQEAgLTMxNSwxMyArMzUxLDE5IEBACiAJLyoKIAkgKiBJcyBuZXcgZnJlZSA/CiAJICovCi0JaGMgPSBfX2dldF9uYW1lX2NlbGwobmV3KTsKKwlpZiAoY2hhbmdlX3V1aWQpCisJCWhjID0gX19nZXRfdXVpZF9jZWxsKG5ldyk7CisJZWxzZQorCQloYyA9IF9fZ2V0X25hbWVfY2VsbChuZXcpOworCiAJaWYgKGhjKSB7Ci0JCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIHRvIGFuIGFscmVhZHktZXhpc3RpbmcgbmFtZSAlcyAtPiAlcyIsCisJCURNV0FSTigiVW5hYmxlIHRvIGNoYW5nZSAlcyBvbiBtYXBwZWQgZGV2aWNlICVzIHRvIG9uZSB0aGF0ICIKKwkJICAgICAgICJhbHJlYWR5IGV4aXN0czogJXMiLAorCQkgICAgICAgY2hhbmdlX3V1aWQgPyAidXVpZCIgOiAibmFtZSIsCiAJCSAgICAgICBwYXJhbS0+bmFtZSwgbmV3KTsKIAkJZG1fcHV0KGhjLT5tZCk7CiAJCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKLQkJa2ZyZWUobmV3X25hbWUpOworCQlrZnJlZShuZXdfZGF0YSk7CiAJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CiAJfQogCkBAIC0zMzAsMjIgKzM3MiwzMCBAQAogCSAqLwogCWhjID0gX19nZXRfbmFtZV9jZWxsKHBhcmFtLT5uYW1lKTsKIAlpZiAoIWhjKSB7Ci0JCURNV0FSTigiYXNrZWQgdG8gcmVuYW1lIGEgbm9uLWV4aXN0ZW50IGRldmljZSAlcyAtPiAlcyIsCi0JCSAgICAgICBwYXJhbS0+bmFtZSwgbmV3KTsKKwkJRE1XQVJOKCJVbmFibGUgdG8gcmVuYW1lIG5vbi1leGlzdGVudCBkZXZpY2UsICVzIHRvICVzJXMiLAorCQkgICAgICAgcGFyYW0tPm5hbWUsIGNoYW5nZV91dWlkID8gInV1aWQgIiA6ICIiLCBuZXcpOwogCQl1cF93cml0ZSgmX2hhc2hfbG9jayk7Ci0JCWtmcmVlKG5ld19uYW1lKTsKKwkJa2ZyZWUobmV3X2RhdGEpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5YSU8pOwogCX0KIAogCS8qCi0JICogcmVuYW1lIGFuZCBtb3ZlIHRoZSBuYW1lIGNlbGwuCisJICogRG9lcyB0aGlzIGRldmljZSBhbHJlYWR5IGhhdmUgYSB1dWlkPwogCSAqLwotCWxpc3RfZGVsKCZoYy0+bmFtZV9saXN0KTsKLQlvbGRfbmFtZSA9IGhjLT5uYW1lOwotCW11dGV4X2xvY2soJmRtX2hhc2hfY2VsbHNfbXV0ZXgpOwotCWhjLT5uYW1lID0gbmV3X25hbWU7Ci0JbXV0ZXhfdW5sb2NrKCZkbV9oYXNoX2NlbGxzX211dGV4KTsKLQlsaXN0X2FkZCgmaGMtPm5hbWVfbGlzdCwgX25hbWVfYnVja2V0cyArIGhhc2hfc3RyKG5ld19uYW1lKSk7CisJaWYgKGNoYW5nZV91dWlkICYmIGhjLT51dWlkKSB7CisJCURNV0FSTigiVW5hYmxlIHRvIGNoYW5nZSB1dWlkIG9mIG1hcHBlZCBkZXZpY2UgJXMgdG8gJXMgIgorCQkgICAgICAgImJlY2F1c2UgdXVpZCBpcyBhbHJlYWR5IHNldCB0byAlcyIsCisJCSAgICAgICBwYXJhbS0+bmFtZSwgbmV3LCBoYy0+dXVpZCk7CisJCWRtX3B1dChoYy0+bWQpOworCQl1cF93cml0ZSgmX2hhc2hfbG9jayk7CisJCWtmcmVlKG5ld19kYXRhKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKGNoYW5nZV91dWlkKQorCQlfX3NldF9jZWxsX3V1aWQoaGMsIG5ld19kYXRhKTsKKwllbHNlCisJCW9sZF9uYW1lID0gX19jaGFuZ2VfY2VsbF9uYW1lKGhjLCBuZXdfZGF0YSk7CiAKIAkvKgogCSAqIFdha2UgdXAgYW55IGRtIGV2ZW50IHdhaXRlcnMuCkBAIC03MjksNyArNzc5LDcgQEAKIAloYyA9IF9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHBhcmFtKTsKIAogCWlmICghaGMpIHsKLQkJRE1XQVJOKCJkZXZpY2UgZG9lc24ndCBhcHBlYXIgdG8gYmUgaW4gdGhlIGRldiBoYXNoIHRhYmxlLiIpOworCQlETURFQlVHX0xJTUlUKCJkZXZpY2UgZG9lc24ndCBhcHBlYXIgdG8gYmUgaW4gdGhlIGRldiBoYXNoIHRhYmxlLiIpOwogCQl1cF93cml0ZSgmX2hhc2hfbG9jayk7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtNzQxLDcgKzc5MSw3IEBACiAJICovCiAJciA9IGRtX2xvY2tfZm9yX2RlbGV0aW9uKG1kKTsKIAlpZiAocikgewotCQlETVdBUk4oInVuYWJsZSB0byByZW1vdmUgb3BlbiBkZXZpY2UgJXMiLCBoYy0+bmFtZSk7CisJCURNREVCVUdfTElNSVQoInVuYWJsZSB0byByZW1vdmUgb3BlbiBkZXZpY2UgJXMiLCBoYy0+bmFtZSk7CiAJCXVwX3dyaXRlKCZfaGFzaF9sb2NrKTsKIAkJZG1fcHV0KG1kKTsKIAkJcmV0dXJuIHI7CkBAIC03NzQsMjEgKzgyNCwyNCBAQAogc3RhdGljIGludCBkZXZfcmVuYW1lKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0sIHNpemVfdCBwYXJhbV9zaXplKQogewogCWludCByOwotCWNoYXIgKm5ld19uYW1lID0gKGNoYXIgKikgcGFyYW0gKyBwYXJhbS0+ZGF0YV9zdGFydDsKKwljaGFyICpuZXdfZGF0YSA9IChjaGFyICopIHBhcmFtICsgcGFyYW0tPmRhdGFfc3RhcnQ7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXVuc2lnbmVkIGNoYW5nZV91dWlkID0gKHBhcmFtLT5mbGFncyAmIERNX1VVSURfRkxBRykgPyAxIDogMDsKIAotCWlmIChuZXdfbmFtZSA8IHBhcmFtLT5kYXRhIHx8Ci0JICAgIGludmFsaWRfc3RyKG5ld19uYW1lLCAodm9pZCAqKSBwYXJhbSArIHBhcmFtX3NpemUpIHx8Ci0JICAgIHN0cmxlbihuZXdfbmFtZSkgPiBETV9OQU1FX0xFTiAtIDEpIHsKLQkJRE1XQVJOKCJJbnZhbGlkIG5ldyBsb2dpY2FsIHZvbHVtZSBuYW1lIHN1cHBsaWVkLiIpOworCWlmIChuZXdfZGF0YSA8IHBhcmFtLT5kYXRhIHx8CisJICAgIGludmFsaWRfc3RyKG5ld19kYXRhLCAodm9pZCAqKSBwYXJhbSArIHBhcmFtX3NpemUpIHx8CisJICAgIHN0cmxlbihuZXdfZGF0YSkgPiAoY2hhbmdlX3V1aWQgPyBETV9VVUlEX0xFTiAtIDEgOiBETV9OQU1FX0xFTiAtIDEpKSB7CisJCURNV0FSTigiSW52YWxpZCBuZXcgbWFwcGVkIGRldmljZSBuYW1lIG9yIHV1aWQgc3RyaW5nIHN1cHBsaWVkLiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyID0gY2hlY2tfbmFtZShuZXdfbmFtZSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOworCWlmICghY2hhbmdlX3V1aWQpIHsKKwkJciA9IGNoZWNrX25hbWUobmV3X2RhdGEpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KIAotCW1kID0gZG1faGFzaF9yZW5hbWUocGFyYW0sIG5ld19uYW1lKTsKKwltZCA9IGRtX2hhc2hfcmVuYW1lKHBhcmFtLCBuZXdfZGF0YSk7CiAJaWYgKElTX0VSUihtZCkpCiAJCXJldHVybiBQVFJfRVJSKG1kKTsKIApAQCAtODg1LDcgKzkzOCw3IEBACiAKIAloYyA9IF9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHBhcmFtKTsKIAlpZiAoIWhjKSB7Ci0JCURNV0FSTigiZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGluIHRoZSBkZXYgaGFzaCB0YWJsZS4iKTsKKwkJRE1ERUJVR19MSU1JVCgiZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGluIHRoZSBkZXYgaGFzaCB0YWJsZS4iKTsKIAkJdXBfd3JpdGUoJl9oYXNoX2xvY2spOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEyMTIsNyArMTI2NSw3IEBACiAKIAloYyA9IF9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHBhcmFtKTsKIAlpZiAoIWhjKSB7Ci0JCURNV0FSTigiZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGluIHRoZSBkZXYgaGFzaCB0YWJsZS4iKTsKKwkJRE1ERUJVR19MSU1JVCgiZGV2aWNlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGluIHRoZSBkZXYgaGFzaCB0YWJsZS4iKTsKIAkJdXBfd3JpdGUoJl9oYXNoX2xvY2spOwogCQlyZXR1cm4gLUVOWElPOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCmluZGV4IGQ4NTg3YmEuLjkyNGY1ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKKysrIGIvZHJpdmVycy9tZC9kbS1rY29weWQuYwpAQCAtMzcsNiArMzcsMTMgQEAKIAl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CiAJdW5zaWduZWQgaW50IG5yX2ZyZWVfcGFnZXM7CiAKKwkvKgorCSAqIEJsb2NrIGRldmljZXMgdG8gdW5wbHVnLgorCSAqIE5vbi1OVUxMIHBvaW50ZXIgbWVhbnMgdGhhdCBhIGJsb2NrIGRldmljZSBoYXMgc29tZSBwZW5kaW5nIHJlcXVlc3RzCisJICogYW5kIG5lZWRzIHRvIGJlIHVucGx1Z2dlZC4KKwkgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICp1bnBsdWdbMl07CisKIAlzdHJ1Y3QgZG1faW9fY2xpZW50ICppb19jbGllbnQ7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZXN0cm95cTsKQEAgLTMwOCw2ICszMTUsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFVucGx1ZyB0aGUgYmxvY2sgZGV2aWNlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgKi8KK3N0YXRpYyB2b2lkIHVucGx1ZyhzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsIGludCBydykKK3sKKwlpZiAoa2MtPnVucGx1Z1tyd10gIT0gTlVMTCkgeworCQlibGtfdW5wbHVnKGJkZXZfZ2V0X3F1ZXVlKGtjLT51bnBsdWdbcnddKSk7CisJCWtjLT51bnBsdWdbcnddID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBQcmVwYXJlIGJsb2NrIGRldmljZSB1bnBsdWcuIElmIHRoZXJlJ3MgYW5vdGhlciBkZXZpY2UKKyAqIHRvIGJlIHVucGx1Z2dlZCBhdCB0aGUgc2FtZSBhcnJheSBpbmRleCwgd2UgdW5wbHVnIHRoYXQKKyAqIGRldmljZSBmaXJzdC4KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV91bnBsdWcoc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLCBpbnQgcncsCisJCQkgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWlmIChsaWtlbHkoa2MtPnVucGx1Z1tyd10gPT0gYmRldikpCisJCXJldHVybjsKKwl1bnBsdWcoa2MsIHJ3KTsKKwlrYy0+dW5wbHVnW3J3XSA9IGJkZXY7Cit9CisKIHN0YXRpYyB2b2lkIGNvbXBsZXRlX2lvKHVuc2lnbmVkIGxvbmcgZXJyb3IsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGtjb3B5ZF9qb2IgKmpvYiA9IChzdHJ1Y3Qga2NvcHlkX2pvYiAqKSBjb250ZXh0OwpAQCAtMzQ1LDcgKzM3Nyw3IEBACiB7CiAJaW50IHI7CiAJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewotCQkuYmlfcncgPSBqb2ItPnJ3IHwgUkVRX1NZTkMgfCBSRVFfVU5QTFVHLAorCQkuYmlfcncgPSBqb2ItPnJ3LAogCQkubWVtLnR5cGUgPSBETV9JT19QQUdFX0xJU1QsCiAJCS5tZW0ucHRyLnBsID0gam9iLT5wYWdlcywKIAkJLm1lbS5vZmZzZXQgPSBqb2ItPm9mZnNldCwKQEAgLTM1NCwxMCArMzg2LDE2IEBACiAJCS5jbGllbnQgPSBqb2ItPmtjLT5pb19jbGllbnQsCiAJfTsKIAotCWlmIChqb2ItPnJ3ID09IFJFQUQpCisJaWYgKGpvYi0+cncgPT0gUkVBRCkgewogCQlyID0gZG1faW8oJmlvX3JlcSwgMSwgJmpvYi0+c291cmNlLCBOVUxMKTsKLQllbHNlCisJCXByZXBhcmVfdW5wbHVnKGpvYi0+a2MsIFJFQUQsIGpvYi0+c291cmNlLmJkZXYpOworCX0gZWxzZSB7CisJCWlmIChqb2ItPm51bV9kZXN0cyA+IDEpCisJCQlpb19yZXEuYmlfcncgfD0gUkVRX1VOUExVRzsKIAkJciA9IGRtX2lvKCZpb19yZXEsIGpvYi0+bnVtX2Rlc3RzLCBqb2ItPmRlc3RzLCBOVUxMKTsKKwkJaWYgKCEoaW9fcmVxLmJpX3J3ICYgUkVRX1VOUExVRykpCisJCQlwcmVwYXJlX3VucGx1Zyhqb2ItPmtjLCBXUklURSwgam9iLT5kZXN0c1swXS5iZGV2KTsKKwl9CiAKIAlyZXR1cm4gcjsKIH0KQEAgLTQzNSwxMCArNDczLDE4IEBACiAJICogUGFnZXMgam9icyB3aGVuIHN1Y2Nlc3NmdWwgd2lsbCBqdW1wIG9udG8gdGhlIGlvIGpvYnMKIAkgKiBsaXN0LiAgaW8gam9icyBjYWxsIHdha2Ugd2hlbiB0aGV5IGNvbXBsZXRlIGFuZCBpdCBhbGwKIAkgKiBzdGFydHMgYWdhaW4uCisJICoKKwkgKiBOb3RlIHRoYXQgaW9fam9icyBhZGQgYmxvY2sgZGV2aWNlcyB0byB0aGUgdW5wbHVnIGFycmF5LAorCSAqIHRoaXMgYXJyYXkgaXMgY2xlYXJlZCB3aXRoICJ1bnBsdWciIGNhbGxzLiBJdCBpcyB0aHVzCisJICogZm9yYmlkZGVuIHRvIHJ1biBjb21wbGV0ZV9qb2JzIGFmdGVyIGlvX2pvYnMgYW5kIGJlZm9yZQorCSAqIHVucGx1ZyBiZWNhdXNlIHRoZSBibG9jayBkZXZpY2UgY291bGQgYmUgZGVzdHJveWVkIGluCisJICogam9iIGNvbXBsZXRpb24gY2FsbGJhY2suCiAJICovCiAJcHJvY2Vzc19qb2JzKCZrYy0+Y29tcGxldGVfam9icywga2MsIHJ1bl9jb21wbGV0ZV9qb2IpOwogCXByb2Nlc3Nfam9icygma2MtPnBhZ2VzX2pvYnMsIGtjLCBydW5fcGFnZXNfam9iKTsKIAlwcm9jZXNzX2pvYnMoJmtjLT5pb19qb2JzLCBrYywgcnVuX2lvX2pvYik7CisJdW5wbHVnKGtjLCBSRUFEKTsKKwl1bnBsdWcoa2MsIFdSSVRFKTsKIH0KIAogLyoKQEAgLTYxOSwxMiArNjY1LDE1IEBACiAJSU5JVF9MSVNUX0hFQUQoJmtjLT5pb19qb2JzKTsKIAlJTklUX0xJU1RfSEVBRCgma2MtPnBhZ2VzX2pvYnMpOwogCisJbWVtc2V0KGtjLT51bnBsdWcsIDAsIHNpemVvZihrYy0+dW5wbHVnKSk7CisKIAlrYy0+am9iX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woTUlOX0pPQlMsIF9qb2JfY2FjaGUpOwogCWlmICgha2MtPmpvYl9wb29sKQogCQlnb3RvIGJhZF9zbGFiOwogCiAJSU5JVF9XT1JLKCZrYy0+a2NvcHlkX3dvcmssIGRvX3dvcmspOwotCWtjLT5rY29weWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2NvcHlkIik7CisJa2MtPmtjb3B5ZF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgia2NvcHlkIiwKKwkJCQkJV1FfTk9OX1JFRU5UUkFOVCB8IFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWtjLT5rY29weWRfd3EpCiAJCWdvdG8gYmFkX3dvcmtxdWV1ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKaW5kZXggMWVkMDA5NC4uYWEyZTBjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCkBAIC0xMiwxMiArMTIsMjIgQEAKIAogI2luY2x1ZGUgImRtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuaCIKIAorI2RlZmluZSBETV9MT0dfVVNFUlNQQUNFX1ZTTiAiMS4xLjAiCisKIHN0cnVjdCBmbHVzaF9lbnRyeSB7CiAJaW50IHR5cGU7CiAJcmVnaW9uX3QgcmVnaW9uOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKKy8qCisgKiBUaGlzIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgbWFyayBhbmQgY2xlYXIgcmVxdWVzdCBpcywgdG8gYSBkZWdyZWUsCisgKiBhcmJpdHJhcnkuICBIb3dldmVyLCB0aGVyZSBpcyBzb21lIGJhc2lzIGZvciB0aGUgY2hvaWNlIGluIHRoZSBsaW1pdHMKKyAqIGltcG9zZWQgb24gdGhlIHNpemUgb2YgZGF0YSBwYXlsb2FkIGJ5IGRtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYzoKKyAqIGRtX2NvbnN1bHRfdXNlcnNwYWNlKCkuCisgKi8KKyNkZWZpbmUgTUFYX0ZMVVNIX0dST1VQX0NPVU5UIDMyCisKIHN0cnVjdCBsb2dfYyB7CiAJc3RydWN0IGRtX3RhcmdldCAqdGk7CiAJdWludDMyX3QgcmVnaW9uX3NpemU7CkBAIC0zNyw4ICs0NywxNSBAQAogCSAqLwogCXVpbnQ2NF90IGluX3N5bmNfaGludDsKIAorCS8qCisJICogTWFyayBhbmQgY2xlYXIgcmVxdWVzdHMgYXJlIGhlbGQgdW50aWwgYSBmbHVzaCBpcyBpc3N1ZWQKKwkgKiBzbyB0aGF0IHdlIGNhbiBncm91cCwgYW5kIHRoZXJlYnkgbGltaXQsIHRoZSBhbW91bnQgb2YKKwkgKiBuZXR3b3JrIHRyYWZmaWMgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXJzcGFjZS4gIFRoZSAnZmx1c2hfbG9jaycKKwkgKiBpcyB1c2VkIHRvIHByb3RlY3QgdGhlc2UgbGlzdHMuCisJICovCiAJc3BpbmxvY2tfdCBmbHVzaF9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgZmx1c2hfbGlzdDsgIC8qIG9ubHkgZm9yIGNsZWFyIGFuZCBtYXJrIHJlcXVlc3RzICovCisJc3RydWN0IGxpc3RfaGVhZCBtYXJrX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjbGVhcl9saXN0OwogfTsKIAogc3RhdGljIG1lbXBvb2xfdCAqZmx1c2hfZW50cnlfcG9vbDsKQEAgLTE2OSw3ICsxODYsOCBAQAogCiAJc3RybmNweShsYy0+dXVpZCwgYXJndlswXSwgRE1fVVVJRF9MRU4pOwogCXNwaW5fbG9ja19pbml0KCZsYy0+Zmx1c2hfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmxjLT5mbHVzaF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbGMtPm1hcmtfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmxjLT5jbGVhcl9saXN0KTsKIAogCXN0cl9zaXplID0gYnVpbGRfY29uc3RydWN0b3Jfc3RyaW5nKHRpLCBhcmdjIC0gMSwgYXJndiArIDEsICZjdHJfc3RyKTsKIAlpZiAoc3RyX3NpemUgPCAwKSB7CkBAIC0xODEsOCArMTk5LDExIEBACiAJciA9IGRtX2NvbnN1bHRfdXNlcnNwYWNlKGxjLT51dWlkLCBsYy0+bHVpZCwgRE1fVUxPR19DVFIsCiAJCQkJIGN0cl9zdHIsIHN0cl9zaXplLCBOVUxMLCBOVUxMKTsKIAotCWlmIChyID09IC1FU1JDSCkgewotCQlETUVSUigiVXNlcnNwYWNlIGxvZyBzZXJ2ZXIgbm90IGZvdW5kIik7CisJaWYgKHIgPCAwKSB7CisJCWlmIChyID09IC1FU1JDSCkKKwkJCURNRVJSKCJVc2Vyc3BhY2UgbG9nIHNlcnZlciBub3QgZm91bmQiKTsKKwkJZWxzZQorCQkJRE1FUlIoIlVzZXJzcGFjZSBsb2cgc2VydmVyIGZhaWxlZCB0byBjcmVhdGUgbG9nIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjE0LDEwICsyMzUsOSBAQAogCiBzdGF0aWMgdm9pZCB1c2Vyc3BhY2VfZHRyKHN0cnVjdCBkbV9kaXJ0eV9sb2cgKmxvZykKIHsKLQlpbnQgcjsKIAlzdHJ1Y3QgbG9nX2MgKmxjID0gbG9nLT5jb250ZXh0OwogCi0JciA9IGRtX2NvbnN1bHRfdXNlcnNwYWNlKGxjLT51dWlkLCBsYy0+bHVpZCwgRE1fVUxPR19EVFIsCisJKHZvaWQpIGRtX2NvbnN1bHRfdXNlcnNwYWNlKGxjLT51dWlkLCBsYy0+bHVpZCwgRE1fVUxPR19EVFIsCiAJCQkJIE5VTEwsIDAsCiAJCQkJIE5VTEwsIE5VTEwpOwogCkBAIC0zMzgsNiArMzU4LDcxIEBACiAJcmV0dXJuIChyKSA/IDAgOiAoaW50KWluX3N5bmM7CiB9CiAKK3N0YXRpYyBpbnQgZmx1c2hfb25lX2J5X29uZShzdHJ1Y3QgbG9nX2MgKmxjLCBzdHJ1Y3QgbGlzdF9oZWFkICpmbHVzaF9saXN0KQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgZmx1c2hfZW50cnkgKmZlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmZSwgZmx1c2hfbGlzdCwgbGlzdCkgeworCQlyID0gdXNlcnNwYWNlX2RvX3JlcXVlc3QobGMsIGxjLT51dWlkLCBmZS0+dHlwZSwKKwkJCQkJIChjaGFyICopJmZlLT5yZWdpb24sCisJCQkJCSBzaXplb2YoZmUtPnJlZ2lvbiksCisJCQkJCSBOVUxMLCBOVUxMKTsKKwkJaWYgKHIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBmbHVzaF9ieV9ncm91cChzdHJ1Y3QgbG9nX2MgKmxjLCBzdHJ1Y3QgbGlzdF9oZWFkICpmbHVzaF9saXN0KQoreworCWludCByID0gMDsKKwlpbnQgY291bnQ7CisJdWludDMyX3QgdHlwZSA9IDA7CisJc3RydWN0IGZsdXNoX2VudHJ5ICpmZSwgKnRtcF9mZTsKKwlMSVNUX0hFQUQodG1wX2xpc3QpOworCXVpbnQ2NF90IGdyb3VwW01BWF9GTFVTSF9HUk9VUF9DT1VOVF07CisKKwkvKgorCSAqIEdyb3VwIHByb2Nlc3MgdGhlIHJlcXVlc3RzCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KGZsdXNoX2xpc3QpKSB7CisJCWNvdW50ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmUsIHRtcF9mZSwgZmx1c2hfbGlzdCwgbGlzdCkgeworCQkJZ3JvdXBbY291bnRdID0gZmUtPnJlZ2lvbjsKKwkJCWNvdW50Kys7CisKKwkJCWxpc3RfZGVsKCZmZS0+bGlzdCk7CisJCQlsaXN0X2FkZCgmZmUtPmxpc3QsICZ0bXBfbGlzdCk7CisKKwkJCXR5cGUgPSBmZS0+dHlwZTsKKwkJCWlmIChjb3VudCA+PSBNQVhfRkxVU0hfR1JPVVBfQ09VTlQpCisJCQkJYnJlYWs7CisJCX0KKworCQlyID0gdXNlcnNwYWNlX2RvX3JlcXVlc3QobGMsIGxjLT51dWlkLCB0eXBlLAorCQkJCQkgKGNoYXIgKikoZ3JvdXApLAorCQkJCQkgY291bnQgKiBzaXplb2YodWludDY0X3QpLAorCQkJCQkgTlVMTCwgTlVMTCk7CisJCWlmIChyKSB7CisJCQkvKiBHcm91cCBzZW5kIGZhaWxlZC4gIEF0dGVtcHQgb25lLWJ5LW9uZS4gKi8KKwkJCWxpc3Rfc3BsaWNlX2luaXQoJnRtcF9saXN0LCBmbHVzaF9saXN0KTsKKwkJCXIgPSBmbHVzaF9vbmVfYnlfb25lKGxjLCBmbHVzaF9saXN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBNdXN0IGNvbGxlY3QgZmx1c2hfZW50cnlzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkCisJICogYXMgYSBncm91cCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBmcmVlJ2QgYnkgdGhlIGNhbGxlci4KKwkgKi8KKwlsaXN0X3NwbGljZV9pbml0KCZ0bXBfbGlzdCwgZmx1c2hfbGlzdCk7CisKKwlyZXR1cm4gcjsKK30KKwogLyoKICAqIHVzZXJzcGFjZV9mbHVzaAogICoKQEAgLTM2MCwzMSArNDQ1LDI1IEBACiAJaW50IHIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxvZ19jICpsYyA9IGxvZy0+Y29udGV4dDsKLQlMSVNUX0hFQUQoZmx1c2hfbGlzdCk7CisJTElTVF9IRUFEKG1hcmtfbGlzdCk7CisJTElTVF9IRUFEKGNsZWFyX2xpc3QpOwogCXN0cnVjdCBmbHVzaF9lbnRyeSAqZmUsICp0bXBfZmU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGMtPmZsdXNoX2xvY2ssIGZsYWdzKTsKLQlsaXN0X3NwbGljZV9pbml0KCZsYy0+Zmx1c2hfbGlzdCwgJmZsdXNoX2xpc3QpOworCWxpc3Rfc3BsaWNlX2luaXQoJmxjLT5tYXJrX2xpc3QsICZtYXJrX2xpc3QpOworCWxpc3Rfc3BsaWNlX2luaXQoJmxjLT5jbGVhcl9saXN0LCAmY2xlYXJfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGMtPmZsdXNoX2xvY2ssIGZsYWdzKTsKIAotCWlmIChsaXN0X2VtcHR5KCZmbHVzaF9saXN0KSkKKwlpZiAobGlzdF9lbXB0eSgmbWFya19saXN0KSAmJiBsaXN0X2VtcHR5KCZjbGVhcl9saXN0KSkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIEZJWE1FOiBDb3VudCB1cCByZXF1ZXN0cywgZ3JvdXAgcmVxdWVzdCB0eXBlcywKLQkgKiBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RpY2sgYWxsIHJlcXVlc3RzIGluIGFuZAotCSAqIHNlbmQgdG8gc2VydmVyIGluIG9uZSBnby4gIEZhaWxpbmcgdGhlIGFsbG9jYXRpb24sCi0JICogZG8gaXQgb25lIGJ5IG9uZS4KLQkgKi8KKwlyID0gZmx1c2hfYnlfZ3JvdXAobGMsICZtYXJrX2xpc3QpOworCWlmIChyKQorCQlnb3RvIGZhaWw7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZlLCAmZmx1c2hfbGlzdCwgbGlzdCkgewotCQlyID0gdXNlcnNwYWNlX2RvX3JlcXVlc3QobGMsIGxjLT51dWlkLCBmZS0+dHlwZSwKLQkJCQkJIChjaGFyICopJmZlLT5yZWdpb24sCi0JCQkJCSBzaXplb2YoZmUtPnJlZ2lvbiksCi0JCQkJCSBOVUxMLCBOVUxMKTsKLQkJaWYgKHIpCi0JCQlnb3RvIGZhaWw7Ci0JfQorCXIgPSBmbHVzaF9ieV9ncm91cChsYywgJmNsZWFyX2xpc3QpOworCWlmIChyKQorCQlnb3RvIGZhaWw7CiAKIAlyID0gdXNlcnNwYWNlX2RvX3JlcXVlc3QobGMsIGxjLT51dWlkLCBETV9VTE9HX0ZMVVNILAogCQkJCSBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKQEAgLTM5NSw3ICs0NzQsMTEgQEAKIAkgKiBDYWxsaW5nIGNvZGUgd2lsbCByZWNlaXZlIGFuIGVycm9yIGFuZCB3aWxsIGtub3cgdGhhdAogCSAqIHRoZSBsb2cgZmFjaWxpdHkgaGFzIGZhaWxlZC4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmUsIHRtcF9mZSwgJmZsdXNoX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmUsIHRtcF9mZSwgJm1hcmtfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZmUtPmxpc3QpOworCQltZW1wb29sX2ZyZWUoZmUsIGZsdXNoX2VudHJ5X3Bvb2wpOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmUsIHRtcF9mZSwgJmNsZWFyX2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmZlLT5saXN0KTsKIAkJbWVtcG9vbF9mcmVlKGZlLCBmbHVzaF9lbnRyeV9wb29sKTsKIAl9CkBAIC00MjUsNyArNTA4LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGMtPmZsdXNoX2xvY2ssIGZsYWdzKTsKIAlmZS0+dHlwZSA9IERNX1VMT0dfTUFSS19SRUdJT047CiAJZmUtPnJlZ2lvbiA9IHJlZ2lvbjsKLQlsaXN0X2FkZCgmZmUtPmxpc3QsICZsYy0+Zmx1c2hfbGlzdCk7CisJbGlzdF9hZGQoJmZlLT5saXN0LCAmbGMtPm1hcmtfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGMtPmZsdXNoX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybjsKQEAgLTQ2Miw3ICs1NDUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZsYy0+Zmx1c2hfbG9jaywgZmxhZ3MpOwogCWZlLT50eXBlID0gRE1fVUxPR19DTEVBUl9SRUdJT047CiAJZmUtPnJlZ2lvbiA9IHJlZ2lvbjsKLQlsaXN0X2FkZCgmZmUtPmxpc3QsICZsYy0+Zmx1c2hfbGlzdCk7CisJbGlzdF9hZGQoJmZlLT5saXN0LCAmbGMtPmNsZWFyX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjLT5mbHVzaF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm47CkBAIC02ODQsNyArNzY3LDcgQEAKIAkJcmV0dXJuIHI7CiAJfQogCi0JRE1JTkZPKCJ2ZXJzaW9uIDEuMC4wIGxvYWRlZCIpOworCURNSU5GTygidmVyc2lvbiAiIERNX0xPR19VU0VSU1BBQ0VfVlNOICIgbG9hZGVkIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5NCw3ICs3NzcsNyBAQAogCWRtX3Vsb2dfdGZyX2V4aXQoKTsKIAltZW1wb29sX2Rlc3Ryb3koZmx1c2hfZW50cnlfcG9vbCk7CiAKLQlETUlORk8oInZlcnNpb24gMS4wLjAgdW5sb2FkZWQiKTsKKwlETUlORk8oInZlcnNpb24gIiBETV9MT0dfVVNFUlNQQUNFX1ZTTiAiIHVubG9hZGVkIik7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtdHJhbnNmZXIuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCmluZGV4IDA3NWNiY2YuLjA0OWVhZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS10cmFuc2Zlci5jCkBAIC0xOTgsNiArMTk4LDcgQEAKIAogCW1lbXNldCh0ZnIsIDAsIERNX1VMT0dfUFJFQUxMT0NFRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKTsKIAltZW1jcHkodGZyLT51dWlkLCB1dWlkLCBETV9VVUlEX0xFTik7CisJdGZyLT52ZXJzaW9uID0gRE1fVUxPR19SRVFVRVNUX1ZFUlNJT047CiAJdGZyLT5sdWlkID0gbHVpZDsKIAl0ZnItPnNlcSA9IGRtX3Vsb2dfc2VxKys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IDMzNDIwZTYuLjY5NTE1MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJCQlyID0gUFRSX0VSUihsYy0+aW9fcmVxLmNsaWVudCk7CiAJCQlETVdBUk4oImNvdWxkbid0IGFsbG9jYXRlIGRpc2sgaW8gY2xpZW50Iik7CiAJCQlrZnJlZShsYyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldHVybiByOwogCQl9CiAKIAkJbGMtPmRpc2tfaGVhZGVyID0gdm1hbGxvYyhidWZfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKaW5kZXggNDg3ZWNkYS4uYjgyZDI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwpAQCAtMjMsNiArMjMsOCBAQAogCiAjZGVmaW5lIERNX01TR19QUkVGSVggIm11bHRpcGF0aCIKICNkZWZpbmUgTUVTR19TVFIoeCkgeCwgc2l6ZW9mKHgpCisjZGVmaW5lIERNX1BHX0lOSVRfREVMQVlfTVNFQ1MgMjAwMAorI2RlZmluZSBETV9QR19JTklUX0RFTEFZX0RFRkFVTFQgKCh1bnNpZ25lZCkgLTEpCiAKIC8qIFBhdGggcHJvcGVydGllcyAqLwogc3RydWN0IHBncGF0aCB7CkBAIC0zMyw4ICszNSw3IEBACiAJdW5zaWduZWQgZmFpbF9jb3VudDsJCS8qIEN1bXVsYXRpdmUgZmFpbHVyZSBjb3VudCAqLwogCiAJc3RydWN0IGRtX3BhdGggcGF0aDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVhY3RpdmF0ZV9wYXRoOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBhY3RpdmF0ZV9wYXRoOworCXN0cnVjdCBkZWxheWVkX3dvcmsgYWN0aXZhdGVfcGF0aDsKIH07CiAKICNkZWZpbmUgcGF0aF90b19wZ3BhdGgoX19wZ3ApIGNvbnRhaW5lcl9vZigoX19wZ3ApLCBzdHJ1Y3QgcGdwYXRoLCBwYXRoKQpAQCAtNjUsMTEgKzY2LDE1IEBACiAKIAljb25zdCBjaGFyICpod19oYW5kbGVyX25hbWU7CiAJY2hhciAqaHdfaGFuZGxlcl9wYXJhbXM7CisKIAl1bnNpZ25lZCBucl9wcmlvcml0eV9ncm91cHM7CiAJc3RydWN0IGxpc3RfaGVhZCBwcmlvcml0eV9ncm91cHM7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBwZ19pbml0X3dhaXQ7CS8qIFdhaXQgZm9yIHBnX2luaXQgY29tcGxldGlvbiAqLworCiAJdW5zaWduZWQgcGdfaW5pdF9yZXF1aXJlZDsJLyogcGdfaW5pdCBuZWVkcyBjYWxsaW5nPyAqLwogCXVuc2lnbmVkIHBnX2luaXRfaW5fcHJvZ3Jlc3M7CS8qIE9ubHkgb25lIHBnX2luaXQgYWxsb3dlZCBhdCBvbmNlICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgcGdfaW5pdF93YWl0OwkvKiBXYWl0IGZvciBwZ19pbml0IGNvbXBsZXRpb24gKi8KKwl1bnNpZ25lZCBwZ19pbml0X2RlbGF5X3JldHJ5OwkvKiBEZWxheSBwZ19pbml0IHJldHJ5PyAqLwogCiAJdW5zaWduZWQgbnJfdmFsaWRfcGF0aHM7CS8qIFRvdGFsIG51bWJlciBvZiB1c2FibGUgcGF0aHMgKi8KIAlzdHJ1Y3QgcGdwYXRoICpjdXJyZW50X3BncGF0aDsKQEAgLTgyLDYgKzg3LDcgQEAKIAl1bnNpZ25lZCBzYXZlZF9xdWV1ZV9pZl9ub19wYXRoOy8qIFNhdmVkIHN0YXRlIGR1cmluZyBzdXNwZW5zaW9uICovCiAJdW5zaWduZWQgcGdfaW5pdF9yZXRyaWVzOwkvKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgcGdfaW5pdCAqLwogCXVuc2lnbmVkIHBnX2luaXRfY291bnQ7CQkvKiBOdW1iZXIgb2YgdGltZXMgcGdfaW5pdCBjYWxsZWQgKi8KKwl1bnNpZ25lZCBwZ19pbml0X2RlbGF5X21zZWNzOwkvKiBOdW1iZXIgb2YgbXNlY3MgYmVmb3JlIHBnX2luaXQgcmV0cnkgKi8KIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBwcm9jZXNzX3F1ZXVlZF9pb3M7CiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWRfaW9zOwpAQCAtMTE2LDcgKzEyMiw2IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX3F1ZXVlZF9pb3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIHRyaWdnZXJfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHN0YXRpYyB2b2lkIGFjdGl2YXRlX3BhdGgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIGRlYWN0aXZhdGVfcGF0aChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyOSw4ICsxMzQsNyBAQAogCiAJaWYgKHBncGF0aCkgewogCQlwZ3BhdGgtPmlzX2FjdGl2ZSA9IDE7Ci0JCUlOSVRfV09SSygmcGdwYXRoLT5kZWFjdGl2YXRlX3BhdGgsIGRlYWN0aXZhdGVfcGF0aCk7Ci0JCUlOSVRfV09SSygmcGdwYXRoLT5hY3RpdmF0ZV9wYXRoLCBhY3RpdmF0ZV9wYXRoKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJnBncGF0aC0+YWN0aXZhdGVfcGF0aCwgYWN0aXZhdGVfcGF0aCk7CiAJfQogCiAJcmV0dXJuIHBncGF0aDsKQEAgLTE0MSwxNCArMTQ1LDYgQEAKIAlrZnJlZShwZ3BhdGgpOwogfQogCi1zdGF0aWMgdm9pZCBkZWFjdGl2YXRlX3BhdGgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBwZ3BhdGggKnBncGF0aCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGdwYXRoLCBkZWFjdGl2YXRlX3BhdGgpOwotCi0JYmxrX2Fib3J0X3F1ZXVlKHBncGF0aC0+cGF0aC5kZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlKTsKLX0KLQogc3RhdGljIHN0cnVjdCBwcmlvcml0eV9ncm91cCAqYWxsb2NfcHJpb3JpdHlfZ3JvdXAodm9pZCkKIHsKIAlzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnOwpAQCAtMTk5LDYgKzE5NSw3IEBACiAJCUlOSVRfTElTVF9IRUFEKCZtLT5xdWV1ZWRfaW9zKTsKIAkJc3Bpbl9sb2NrX2luaXQoJm0tPmxvY2spOwogCQltLT5xdWV1ZV9pbyA9IDE7CisJCW0tPnBnX2luaXRfZGVsYXlfbXNlY3MgPSBETV9QR19JTklUX0RFTEFZX0RFRkFVTFQ7CiAJCUlOSVRfV09SSygmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zLCBwcm9jZXNzX3F1ZXVlZF9pb3MpOwogCQlJTklUX1dPUksoJm0tPnRyaWdnZXJfZXZlbnQsIHRyaWdnZXJfZXZlbnQpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtLT5wZ19pbml0X3dhaXQpOwpAQCAtMjM4LDE0ICsyMzUsMTkgQEAKIHN0YXRpYyB2b2lkIF9fcGdfaW5pdF9hbGxfcGF0aHMoc3RydWN0IG11bHRpcGF0aCAqbSkKIHsKIAlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGg7CisJdW5zaWduZWQgbG9uZyBwZ19pbml0X2RlbGF5ID0gMDsKIAogCW0tPnBnX2luaXRfY291bnQrKzsKIAltLT5wZ19pbml0X3JlcXVpcmVkID0gMDsKKwlpZiAobS0+cGdfaW5pdF9kZWxheV9yZXRyeSkKKwkJcGdfaW5pdF9kZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMobS0+cGdfaW5pdF9kZWxheV9tc2VjcyAhPSBETV9QR19JTklUX0RFTEFZX0RFRkFVTFQgPworCQkJCQkJIG0tPnBnX2luaXRfZGVsYXlfbXNlY3MgOiBETV9QR19JTklUX0RFTEFZX01TRUNTKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBncGF0aCwgJm0tPmN1cnJlbnRfcGctPnBncGF0aHMsIGxpc3QpIHsKIAkJLyogU2tpcCBmYWlsZWQgcGF0aHMgKi8KIAkJaWYgKCFwZ3BhdGgtPmlzX2FjdGl2ZSkKIAkJCWNvbnRpbnVlOwotCQlpZiAocXVldWVfd29yayhrbXBhdGhfaGFuZGxlcmQsICZwZ3BhdGgtPmFjdGl2YXRlX3BhdGgpKQorCQlpZiAocXVldWVfZGVsYXllZF93b3JrKGttcGF0aF9oYW5kbGVyZCwgJnBncGF0aC0+YWN0aXZhdGVfcGF0aCwKKwkJCQkgICAgICAgcGdfaW5pdF9kZWxheSkpCiAJCQltLT5wZ19pbml0X2luX3Byb2dyZXNzKys7CiAJfQogfQpAQCAtNzkzLDggKzc5NSw5IEBACiAJY29uc3QgY2hhciAqcGFyYW1fbmFtZTsKIAogCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0gewotCQl7MCwgMywgImludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyJ9LAorCQl7MCwgNSwgImludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyJ9LAogCQl7MSwgNTAsICJwZ19pbml0X3JldHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwIn0sCisJCXswLCA2MDAwMCwgInBnX2luaXRfZGVsYXlfbXNlY3MgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYwMDAwIn0sCiAJfTsKIAogCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJmFyZ2MsICZ0aS0+ZXJyb3IpOwpAQCAtODIxLDYgKzgyNCwxNCBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlpZiAoIXN0cm5pY21wKHBhcmFtX25hbWUsIE1FU0dfU1RSKCJwZ19pbml0X2RlbGF5X21zZWNzIikpICYmCisJCSAgICAoYXJnYyA+PSAxKSkgeworCQkJciA9IHJlYWRfcGFyYW0oX3BhcmFtcyArIDIsIHNoaWZ0KGFzKSwKKwkJCQkgICAgICAgJm0tPnBnX2luaXRfZGVsYXlfbXNlY3MsICZ0aS0+ZXJyb3IpOworCQkJYXJnYy0tOworCQkJY29udGludWU7CisJCX0KKwogCQl0aS0+ZXJyb3IgPSAiVW5yZWNvZ25pc2VkIG11bHRpcGF0aCBmZWF0dXJlIHJlcXVlc3QiOwogCQlyID0gLUVJTlZBTDsKIAl9IHdoaWxlIChhcmdjICYmICFyKTsKQEAgLTkzMSw3ICs5NDIsNyBAQAogCWZsdXNoX3dvcmtxdWV1ZShrbXBhdGhfaGFuZGxlcmQpOwogCW11bHRpcGF0aF93YWl0X2Zvcl9wZ19pbml0X2NvbXBsZXRpb24obSk7CiAJZmx1c2hfd29ya3F1ZXVlKGttdWx0aXBhdGhkKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtfc3luYygmbS0+dHJpZ2dlcl9ldmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIG11bHRpcGF0aF9kdHIoc3RydWN0IGRtX3RhcmdldCAqdGkpCkBAIC05OTUsNyArMTAwNiw2IEBACiAJCSAgICAgIHBncGF0aC0+cGF0aC5kZXYtPm5hbWUsIG0tPm5yX3ZhbGlkX3BhdGhzKTsKIAogCXNjaGVkdWxlX3dvcmsoJm0tPnRyaWdnZXJfZXZlbnQpOwotCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZwZ3BhdGgtPmRlYWN0aXZhdGVfcGF0aCk7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CkBAIC0xMDM0LDcgKzEwNDQsNyBAQAogCQltLT5jdXJyZW50X3BncGF0aCA9IE5VTEw7CiAJCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCX0gZWxzZSBpZiAobS0+aHdfaGFuZGxlcl9uYW1lICYmIChtLT5jdXJyZW50X3BnID09IHBncGF0aC0+cGcpKSB7Ci0JCWlmIChxdWV1ZV93b3JrKGttcGF0aF9oYW5kbGVyZCwgJnBncGF0aC0+YWN0aXZhdGVfcGF0aCkpCisJCWlmIChxdWV1ZV93b3JrKGttcGF0aF9oYW5kbGVyZCwgJnBncGF0aC0+YWN0aXZhdGVfcGF0aC53b3JrKSkKIAkJCW0tPnBnX2luaXRfaW5fcHJvZ3Jlc3MrKzsKIAl9CiAKQEAgLTExNjksNiArMTE3OSw3IEBACiAJc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZyA9IHBncGF0aC0+cGc7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IHBnLT5tOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZGVsYXlfcmV0cnkgPSAwOwogCiAJLyogZGV2aWNlIG9yIGRyaXZlciBwcm9ibGVtcyAqLwogCXN3aXRjaCAoZXJyb3JzKSB7CkBAIC0xMTkzLDggKzEyMDQsOSBAQAogCQkgKi8KIAkJYnlwYXNzX3BnKG0sIHBnLCAxKTsKIAkJYnJlYWs7Ci0JLyogVE9ETzogRm9yIFNDU0lfREhfUkVUUlkgd2Ugc2hvdWxkIHdhaXQgYSBjb3VwbGUgc2Vjb25kcyAqLwogCWNhc2UgU0NTSV9ESF9SRVRSWToKKwkJLyogV2FpdCBiZWZvcmUgcmV0cnlpbmcuICovCisJCWRlbGF5X3JldHJ5ID0gMTsKIAljYXNlIFNDU0lfREhfSU1NX1JFVFJZOgogCWNhc2UgU0NTSV9ESF9SRVNfVEVNUF9VTkFWQUlMOgogCQlpZiAocGdfaW5pdF9saW1pdF9yZWFjaGVkKG0sIHBncGF0aCkpCkBAIC0xMjI3LDYgKzEyMzksNyBAQAogCWlmICghbS0+cGdfaW5pdF9yZXF1aXJlZCkKIAkJbS0+cXVldWVfaW8gPSAwOwogCisJbS0+cGdfaW5pdF9kZWxheV9yZXRyeSA9IGRlbGF5X3JldHJ5OwogCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT5wcm9jZXNzX3F1ZXVlZF9pb3MpOwogCiAJLyoKQEAgLTEyNDEsNyArMTI1NCw3IEBACiBzdGF0aWMgdm9pZCBhY3RpdmF0ZV9wYXRoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGggPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBncGF0aCwgYWN0aXZhdGVfcGF0aCk7CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGdwYXRoLCBhY3RpdmF0ZV9wYXRoLndvcmspOwogCiAJc2NzaV9kaF9hY3RpdmF0ZShiZGV2X2dldF9xdWV1ZShwZ3BhdGgtPnBhdGguZGV2LT5iZGV2KSwKIAkJCQlwZ19pbml0X2RvbmUsIHBncGF0aCk7CkBAIC0xMzgyLDExICsxMzk1LDE0IEBACiAJCURNRU1JVCgiMiAldSAldSAiLCBtLT5xdWV1ZV9zaXplLCBtLT5wZ19pbml0X2NvdW50KTsKIAllbHNlIHsKIAkJRE1FTUlUKCIldSAiLCBtLT5xdWV1ZV9pZl9ub19wYXRoICsKLQkJCSAgICAgIChtLT5wZ19pbml0X3JldHJpZXMgPiAwKSAqIDIpOworCQkJICAgICAgKG0tPnBnX2luaXRfcmV0cmllcyA+IDApICogMiArCisJCQkgICAgICAobS0+cGdfaW5pdF9kZWxheV9tc2VjcyAhPSBETV9QR19JTklUX0RFTEFZX0RFRkFVTFQpICogMik7CiAJCWlmIChtLT5xdWV1ZV9pZl9ub19wYXRoKQogCQkJRE1FTUlUKCJxdWV1ZV9pZl9ub19wYXRoICIpOwogCQlpZiAobS0+cGdfaW5pdF9yZXRyaWVzKQogCQkJRE1FTUlUKCJwZ19pbml0X3JldHJpZXMgJXUgIiwgbS0+cGdfaW5pdF9yZXRyaWVzKTsKKwkJaWYgKG0tPnBnX2luaXRfZGVsYXlfbXNlY3MgIT0gRE1fUEdfSU5JVF9ERUxBWV9ERUZBVUxUKQorCQkJRE1FTUlUKCJwZ19pbml0X2RlbGF5X21zZWNzICV1ICIsIG0tPnBnX2luaXRfZGVsYXlfbXNlY3MpOwogCX0KIAogCWlmICghbS0+aHdfaGFuZGxlcl9uYW1lIHx8IHR5cGUgPT0gU1RBVFVTVFlQRV9JTkZPKQpAQCAtMTY1NSw3ICsxNjcxLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgbXVsdGlwYXRoX3RhcmdldCA9IHsKIAkubmFtZSA9ICJtdWx0aXBhdGgiLAotCS52ZXJzaW9uID0gezEsIDEsIDF9LAorCS52ZXJzaW9uID0gezEsIDIsIDB9LAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKIAkuY3RyID0gbXVsdGlwYXRoX2N0ciwKIAkuZHRyID0gbXVsdGlwYXRoX2R0ciwKQEAgLTE2ODcsNyArMTcwMyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWttdWx0aXBhdGhkID0gY3JlYXRlX3dvcmtxdWV1ZSgia21wYXRoZCIpOworCWttdWx0aXBhdGhkID0gYWxsb2Nfd29ya3F1ZXVlKCJrbXBhdGhkIiwgV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICgha211bHRpcGF0aGQpIHsKIAkJRE1FUlIoImZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlIGttcGF0aGQiKTsKIAkJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJm11bHRpcGF0aF90YXJnZXQpOwpAQCAtMTcwMSw3ICsxNzE3LDggQEAKIAkgKiBvbGQgd29ya3F1ZXVlIHdvdWxkIGFsc28gY3JlYXRlIGEgYm90dGxlbmVjayBpbiB0aGUKIAkgKiBwYXRoIG9mIHRoZSBzdG9yYWdlIGhhcmR3YXJlIGRldmljZSBhY3RpdmF0aW9uLgogCSAqLwotCWttcGF0aF9oYW5kbGVyZCA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrbXBhdGhfaGFuZGxlcmQiKTsKKwlrbXBhdGhfaGFuZGxlcmQgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgia21wYXRoX2hhbmRsZXJkIiwKKwkJCQkJCSAgV1FfTUVNX1JFQ0xBSU0pOwogCWlmICgha21wYXRoX2hhbmRsZXJkKSB7CiAJCURNRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZSBrbXBhdGhfaGFuZGxlcmQiKTsKIAkJZGVzdHJveV93b3JrcXVldWUoa211bHRpcGF0aGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWUxZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkLmMKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBOZWlsIEJyb3duCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIm1kLmgiCisjaW5jbHVkZSAicmFpZDUuaCIKKyNpbmNsdWRlICJkbS5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorCisjZGVmaW5lIERNX01TR19QUkVGSVggInJhaWQiCisKKy8qCisgKiBJZiB0aGUgTUQgZG9lc24ndCBzdXBwb3J0IE1EX1NZTkNfU1RBVEVfRk9SQ0VEIHlldCwgdGhlbgorICogbWFrZSBpdCBzbyB0aGUgZmxhZyBkb2Vzbid0IHNldCBhbnl0aGluZy4KKyAqLworI2lmbmRlZiBNRF9TWU5DX1NUQVRFX0ZPUkNFRAorI2RlZmluZSBNRF9TWU5DX1NUQVRFX0ZPUkNFRCAwCisjZW5kaWYKKworc3RydWN0IHJhaWRfZGV2IHsKKwkvKgorCSAqIFR3byBETSBkZXZpY2VzLCBvbmUgdG8gaG9sZCBtZXRhZGF0YSBhbmQgb25lIHRvIGhvbGQgdGhlCisJICogYWN0dWFsIGRhdGEvcGFyaXR5LiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBub3QgY29uZnVzZQorCSAqIHRpLT5sZW4gYW5kIGdpdmUgbW9yZSBmbGV4aWJpbGl0eSBpbiBhbHRlcmluZyBzaXplIGFuZAorCSAqIGNoYXJhY3RlcmlzdGljcy4KKwkgKgorCSAqIFdoaWxlIGl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIGRldmljZSB0byBiZSBhc3NvY2lhdGVkCisJICogd2l0aCBhIGRpZmZlcmVudCBwaHlzaWNhbCBkZXZpY2UgdGhhbiB0aGUgZGF0YV9kZXYsIGl0CisJICogaXMgaW50ZW5kZWQgZm9yIGl0IHRvIGJlIHRoZSBzYW1lLgorCSAqICAgIHwtLS0tLS0tLS0gUGh5c2ljYWwgRGV2aWNlIC0tLS0tLS0tLXwKKwkgKiAgICB8LSBtZXRhX2RldiAtfC0tLS0tLSBkYXRhX2RldiAtLS0tLS18CisJICovCisJc3RydWN0IGRtX2RldiAqbWV0YV9kZXY7CisJc3RydWN0IGRtX2RldiAqZGF0YV9kZXY7CisJc3RydWN0IG1ka19yZGV2X3MgcmRldjsKK307CisKKy8qCisgKiBGbGFncyBmb3IgcnMtPnByaW50X2ZsYWdzIGZpZWxkLgorICovCisjZGVmaW5lIERNUEZfREFFTU9OX1NMRUVQICAgICAgMHgxCisjZGVmaW5lIERNUEZfTUFYX1dSSVRFX0JFSElORCAgMHgyCisjZGVmaW5lIERNUEZfU1lOQyAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIERNUEZfTk9TWU5DICAgICAgICAgICAgMHg4CisjZGVmaW5lIERNUEZfU1RSSVBFX0NBQ0hFICAgICAgMHgxMAorI2RlZmluZSBETVBGX01JTl9SRUNPVkVSWV9SQVRFIDB4MjAKKyNkZWZpbmUgRE1QRl9NQVhfUkVDT1ZFUllfUkFURSAweDQwCisKK3N0cnVjdCByYWlkX3NldCB7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisKKwl1aW50NjRfdCBwcmludF9mbGFnczsKKworCXN0cnVjdCBtZGRldl9zIG1kOworCXN0cnVjdCByYWlkX3R5cGUgKnJhaWRfdHlwZTsKKwlzdHJ1Y3QgZG1fdGFyZ2V0X2NhbGxiYWNrcyBjYWxsYmFja3M7CisKKwlzdHJ1Y3QgcmFpZF9kZXYgZGV2WzBdOworfTsKKworLyogU3VwcG9ydGVkIHJhaWQgdHlwZXMgYW5kIHByb3BlcnRpZXMuICovCitzdGF0aWMgc3RydWN0IHJhaWRfdHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsJCS8qIFJBSUQgYWxnb3JpdGhtLiAqLworCWNvbnN0IGNoYXIgKmRlc2NyOwkJLyogRGVzY3JpcHRvciB0ZXh0IGZvciBsb2dnaW5nLiAqLworCWNvbnN0IHVuc2lnbmVkIHBhcml0eV9kZXZzOwkvKiAjIG9mIHBhcml0eSBkZXZpY2VzLiAqLworCWNvbnN0IHVuc2lnbmVkIG1pbmltYWxfZGV2czsJLyogbWluaW1hbCAjIG9mIGRldmljZXMgaW4gc2V0LiAqLworCWNvbnN0IHVuc2lnbmVkIGxldmVsOwkJLyogUkFJRCBsZXZlbC4gKi8KKwljb25zdCB1bnNpZ25lZCBhbGdvcml0aG07CS8qIFJBSUQgYWxnb3JpdGhtLiAqLworfSByYWlkX3R5cGVzW10gPSB7CisJeyJyYWlkNCIsICAgICJSQUlENCAoZGVkaWNhdGVkIHBhcml0eSBkaXNrKSIsCTEsIDIsIDUsIEFMR09SSVRITV9QQVJJVFlfMH0sCisJeyJyYWlkNV9sYSIsICJSQUlENSAobGVmdCBhc3ltbWV0cmljKSIsCQkxLCAyLCA1LCBBTEdPUklUSE1fTEVGVF9BU1lNTUVUUklDfSwKKwl7InJhaWQ1X3JhIiwgIlJBSUQ1IChyaWdodCBhc3ltbWV0cmljKSIsCTEsIDIsIDUsIEFMR09SSVRITV9SSUdIVF9BU1lNTUVUUklDfSwKKwl7InJhaWQ1X2xzIiwgIlJBSUQ1IChsZWZ0IHN5bW1ldHJpYykiLAkJMSwgMiwgNSwgQUxHT1JJVEhNX0xFRlRfU1lNTUVUUklDfSwKKwl7InJhaWQ1X3JzIiwgIlJBSUQ1IChyaWdodCBzeW1tZXRyaWMpIiwJCTEsIDIsIDUsIEFMR09SSVRITV9SSUdIVF9TWU1NRVRSSUN9LAorCXsicmFpZDZfenIiLCAiUkFJRDYgKHplcm8gcmVzdGFydCkiLAkJMiwgNCwgNiwgQUxHT1JJVEhNX1JPVEFUSU5HX1pFUk9fUkVTVEFSVH0sCisJeyJyYWlkNl9uciIsICJSQUlENiAoTiByZXN0YXJ0KSIsCQkyLCA0LCA2LCBBTEdPUklUSE1fUk9UQVRJTkdfTl9SRVNUQVJUfSwKKwl7InJhaWQ2X25jIiwgIlJBSUQ2IChOIGNvbnRpbnVlKSIsCQkyLCA0LCA2LCBBTEdPUklUSE1fUk9UQVRJTkdfTl9DT05USU5VRX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmFpZF90eXBlICpnZXRfcmFpZF90eXBlKGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWlkX3R5cGVzKTsgaSsrKQorCQlpZiAoIXN0cmNtcChyYWlkX3R5cGVzW2ldLm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuICZyYWlkX3R5cGVzW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmFpZF9zZXQgKmNvbnRleHRfYWxsb2Moc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCByYWlkX3R5cGUgKnJhaWRfdHlwZSwgdW5zaWduZWQgcmFpZF9kZXZzKQoreworCXVuc2lnbmVkIGk7CisJc3RydWN0IHJhaWRfc2V0ICpyczsKKwlzZWN0b3JfdCBzZWN0b3JzX3Blcl9kZXY7CisKKwlpZiAocmFpZF9kZXZzIDw9IHJhaWRfdHlwZS0+cGFyaXR5X2RldnMpIHsKKwkJdGktPmVycm9yID0gIkluc3VmZmljaWVudCBudW1iZXIgb2YgZGV2aWNlcyI7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXNlY3RvcnNfcGVyX2RldiA9IHRpLT5sZW47CisJaWYgKHNlY3Rvcl9kaXYoc2VjdG9yc19wZXJfZGV2LCAocmFpZF9kZXZzIC0gcmFpZF90eXBlLT5wYXJpdHlfZGV2cykpKSB7CisJCXRpLT5lcnJvciA9ICJUYXJnZXQgbGVuZ3RoIG5vdCBkaXZpc2libGUgYnkgbnVtYmVyIG9mIGRhdGEgZGV2aWNlcyI7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJzID0ga3phbGxvYyhzaXplb2YoKnJzKSArIHJhaWRfZGV2cyAqIHNpemVvZihycy0+ZGV2WzBdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycykgeworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIHJhaWQgY29udGV4dCI7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCW1kZGV2X2luaXQoJnJzLT5tZCk7CisKKwlycy0+dGkgPSB0aTsKKwlycy0+cmFpZF90eXBlID0gcmFpZF90eXBlOworCXJzLT5tZC5yYWlkX2Rpc2tzID0gcmFpZF9kZXZzOworCXJzLT5tZC5sZXZlbCA9IHJhaWRfdHlwZS0+bGV2ZWw7CisJcnMtPm1kLm5ld19sZXZlbCA9IHJzLT5tZC5sZXZlbDsKKwlycy0+bWQuZGV2X3NlY3RvcnMgPSBzZWN0b3JzX3Blcl9kZXY7CisJcnMtPm1kLmxheW91dCA9IHJhaWRfdHlwZS0+YWxnb3JpdGhtOworCXJzLT5tZC5uZXdfbGF5b3V0ID0gcnMtPm1kLmxheW91dDsKKwlycy0+bWQuZGVsdGFfZGlza3MgPSAwOworCXJzLT5tZC5yZWNvdmVyeV9jcCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFpZF9kZXZzOyBpKyspCisJCW1kX3JkZXZfaW5pdCgmcnMtPmRldltpXS5yZGV2KTsKKworCS8qCisJICogUmVtYWluaW5nIGl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIGJ5IGZ1cnRoZXIgUkFJRCBwYXJhbXM6CisJICogIHJzLT5tZC5wZXJzaXN0ZW50CisJICogIHJzLT5tZC5leHRlcm5hbAorCSAqICBycy0+bWQuY2h1bmtfc2VjdG9ycworCSAqICBycy0+bWQubmV3X2NodW5rX3NlY3RvcnMKKwkgKi8KKworCXJldHVybiByczsKK30KKworc3RhdGljIHZvaWQgY29udGV4dF9mcmVlKHN0cnVjdCByYWlkX3NldCAqcnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKKwkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYpCisJCQlkbV9wdXRfZGV2aWNlKHJzLT50aSwgcnMtPmRldltpXS5kYXRhX2Rldik7CisKKwlrZnJlZShycyk7Cit9CisKKy8qCisgKiBGb3IgZXZlcnkgZGV2aWNlIHdlIGhhdmUgdHdvIHdvcmRzCisgKiAgPG1ldGFfZGV2PjogbWV0YSBkZXZpY2UgbmFtZSBvciAnLScgaWYgbWlzc2luZworICogIDxkYXRhX2Rldj46IGRhdGEgZGV2aWNlIG5hbWUgb3IgJy0nIGlmIG1pc3NpbmcKKyAqCisgKiBUaGlzIGNvZGUgcGFyc2VzIHRob3NlIHdvcmRzLgorICovCitzdGF0aWMgaW50IGRldl9wYXJtcyhzdHJ1Y3QgcmFpZF9zZXQgKnJzLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlpbnQgcmVidWlsZCA9IDA7CisJaW50IG1ldGFkYXRhX2F2YWlsYWJsZSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKywgYXJndiArPSAyKSB7CisJCXJzLT5kZXZbaV0ucmRldi5yYWlkX2Rpc2sgPSBpOworCisJCXJzLT5kZXZbaV0ubWV0YV9kZXYgPSBOVUxMOworCQlycy0+ZGV2W2ldLmRhdGFfZGV2ID0gTlVMTDsKKworCQkvKgorCQkgKiBUaGVyZSBhcmUgbm8gb2Zmc2V0cywgc2luY2UgdGhlcmUgaXMgYSBzZXBhcmF0ZSBkZXZpY2UKKwkJICogZm9yIGRhdGEgYW5kIG1ldGFkYXRhLgorCQkgKi8KKwkJcnMtPmRldltpXS5yZGV2LmRhdGFfb2Zmc2V0ID0gMDsKKwkJcnMtPmRldltpXS5yZGV2Lm1kZGV2ID0gJnJzLT5tZDsKKworCQlpZiAoc3RyY21wKGFyZ3ZbMF0sICItIikpIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiTWV0YWRhdGEgZGV2aWNlcyBub3Qgc3VwcG9ydGVkIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0iKSkgeworCQkJaWYgKCF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSAmJgorCQkJICAgICghcnMtPmRldltpXS5yZGV2LnJlY292ZXJ5X29mZnNldCkpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIkRyaXZlIGRlc2lnbmF0ZWQgZm9yIHJlYnVpbGQgbm90IHNwZWNpZmllZCI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gZG1fZ2V0X2RldmljZShycy0+dGksIGFyZ3ZbMV0sCisJCQkJICAgIGRtX3RhYmxlX2dldF9tb2RlKHJzLT50aS0+dGFibGUpLAorCQkJCSAgICAmcnMtPmRldltpXS5kYXRhX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiUkFJRCBkZXZpY2UgbG9va3VwIGZhaWx1cmUiOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJzLT5kZXZbaV0ucmRldi5iZGV2ID0gcnMtPmRldltpXS5kYXRhX2Rldi0+YmRldjsKKwkJbGlzdF9hZGQoJnJzLT5kZXZbaV0ucmRldi5zYW1lX3NldCwgJnJzLT5tZC5kaXNrcyk7CisJCWlmICghdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQlyZWJ1aWxkKys7CisJfQorCisJaWYgKG1ldGFkYXRhX2F2YWlsYWJsZSkgeworCQlycy0+bWQuZXh0ZXJuYWwgPSAwOworCQlycy0+bWQucGVyc2lzdGVudCA9IDE7CisJCXJzLT5tZC5tYWpvcl92ZXJzaW9uID0gMjsKKwl9IGVsc2UgaWYgKHJlYnVpbGQgJiYgIXJzLT5tZC5yZWNvdmVyeV9jcCkgeworCQkvKgorCQkgKiBXaXRob3V0IG1ldGFkYXRhLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIGFycmF5CisJCSAqIGlzIGluLXN5bmMgb3Igbm90IC0gd2UgbXVzdCBhc3N1bWUgaXQgaXMgbm90LiAgVGhlcmVmb3JlLAorCQkgKiBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlYnVpbGQgYSBkcml2ZS4KKwkJICoKKwkJICogRXZlbiBpZiB0aGVyZSBpcyBtZXRhZGF0YSwgdGhlIG9uLWRpc2sgaW5mb3JtYXRpb24gbWF5CisJCSAqIGluZGljYXRlIHRoYXQgdGhlIGFycmF5IGlzIG5vdCBpbi1zeW5jIGFuZCBpdCB3aWxsIHRoZW4KKwkJICogZmFpbCBhdCB0aGF0IHRpbWUuCisJCSAqCisJCSAqIFVzZXIgY291bGQgc3BlY2lmeSAnbm9zeW5jJyBvcHRpb24gaWYgZGVzcGVyYXRlLgorCQkgKi8KKwkJRE1FUlIoIlVuYWJsZSB0byByZWJ1aWxkIGRyaXZlIHdoaWxlIGFycmF5IGlzIG5vdCBpbi1zeW5jIik7CisJCXJzLT50aS0+ZXJyb3IgPSAiUkFJRCBkZXZpY2UgbG9va3VwIGZhaWx1cmUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBvc3NpYmxlIGFyZ3VtZW50cyBhcmUuLi4KKyAqIFJBSUQ0NTY6CisgKgk8Y2h1bmtfc2l6ZT4gW29wdGlvbmFsX2FyZ3NdCisgKgorICogT3B0aW9uYWwgYXJnczoKKyAqICAgIFtbbm9dc3luY10JCQlGb3JjZSBvciBwcmV2ZW50IHJlY292ZXJ5IG9mIHRoZSBlbnRpcmUgYXJyYXkKKyAqICAgIFtyZWJ1aWxkIDxpZHg+XQkJCVJlYnVpbGQgdGhlIGRyaXZlIGluZGljYXRlZCBieSB0aGUgaW5kZXgKKyAqICAgIFtkYWVtb25fc2xlZXAgPG1zPl0JCVRpbWUgYmV0d2VlbiBiaXRtYXAgZGFlbW9uIHdvcmsgdG8gY2xlYXIgYml0cworICogICAgW21pbl9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dCVRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KKyAqICAgIFttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XQlUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCisgKiAgICBbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dCVNlZSAnLXdyaXRlLWJlaGluZD0nIChtYW4gbWRhZG0pCisgKiAgICBbc3RyaXBlX2NhY2hlIDxzZWN0b3JzPl0JCVN0cmlwZSBjYWNoZSBzaXplIGZvciBoaWdoZXIgUkFJRHMKKyAqLworc3RhdGljIGludCBwYXJzZV9yYWlkX3BhcmFtcyhzdHJ1Y3QgcmFpZF9zZXQgKnJzLCBjaGFyICoqYXJndiwKKwkJCSAgICAgdW5zaWduZWQgbnVtX3JhaWRfcGFyYW1zKQoreworCXVuc2lnbmVkIGksIHJlYnVpbGRfY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgKmtleTsKKworCS8qCisJICogRmlyc3QsIHBhcnNlIHRoZSBpbi1vcmRlciByZXF1aXJlZCBhcmd1bWVudHMKKwkgKi8KKwlpZiAoKHN0cmljdF9zdHJ0b3VsKGFyZ3ZbMF0sIDEwLCAmdmFsdWUpIDwgMCkgfHwKKwkgICAgIWlzX3Bvd2VyX29mXzIodmFsdWUpIHx8ICh2YWx1ZSA8IDgpKSB7CisJCXJzLT50aS0+ZXJyb3IgPSAiQmFkIGNodW5rIHNpemUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlycy0+bWQubmV3X2NodW5rX3NlY3RvcnMgPSBycy0+bWQuY2h1bmtfc2VjdG9ycyA9IHZhbHVlOworCWFyZ3YrKzsKKwludW1fcmFpZF9wYXJhbXMtLTsKKworCS8qCisJICogU2Vjb25kLCBwYXJzZSB0aGUgdW5vcmRlcmVkIG9wdGlvbmFsIGFyZ3VtZW50cworCSAqLworCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCQlzZXRfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yYWlkX3BhcmFtczsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZ3ZbaV0sICJub3N5bmMiKSkgeworCQkJcnMtPm1kLnJlY292ZXJ5X2NwID0gTWF4U2VjdG9yOworCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfTk9TWU5DOworCQkJcnMtPm1kLmZsYWdzIHw9IE1EX1NZTkNfU1RBVEVfRk9SQ0VEOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgInN5bmMiKSkgeworCQkJcnMtPm1kLnJlY292ZXJ5X2NwID0gMDsKKwkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX1NZTkM7CisJCQlycy0+bWQuZmxhZ3MgfD0gTURfU1lOQ19TVEFURV9GT1JDRUQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoZSByZXN0IG9mIHRoZSBvcHRpb25hbCBhcmd1bWVudHMgY29tZSBpbiBrZXkvdmFsdWUgcGFpcnMgKi8KKwkJaWYgKChpICsgMSkgPj0gbnVtX3JhaWRfcGFyYW1zKSB7CisJCQlycy0+dGktPmVycm9yID0gIldyb25nIG51bWJlciBvZiByYWlkIHBhcmFtZXRlcnMgZ2l2ZW4iOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlrZXkgPSBhcmd2W2krK107CisJCWlmIChzdHJpY3Rfc3RydG91bChhcmd2W2ldLCAxMCwgJnZhbHVlKSA8IDApIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiQmFkIG51bWVyaWNhbCBhcmd1bWVudCBnaXZlbiBpbiByYWlkIHBhcmFtcyI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghc3RyY21wKGtleSwgInJlYnVpbGQiKSkgeworCQkJaWYgKCsrcmVidWlsZF9jbnQgPiBycy0+cmFpZF90eXBlLT5wYXJpdHlfZGV2cykgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAiVG9vIG1hbnkgcmVidWlsZCBkcml2ZXMgZ2l2ZW4iOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKHZhbHVlID4gcnMtPm1kLnJhaWRfZGlza3MpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIkludmFsaWQgcmVidWlsZCBpbmRleCBnaXZlbiI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQljbGVhcl9iaXQoSW5fc3luYywgJnJzLT5kZXZbdmFsdWVdLnJkZXYuZmxhZ3MpOworCQkJcnMtPmRldlt2YWx1ZV0ucmRldi5yZWNvdmVyeV9vZmZzZXQgPSAwOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAibWF4X3dyaXRlX2JlaGluZCIpKSB7CisJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9NQVhfV1JJVEVfQkVISU5EOworCisJCQkvKgorCQkJICogSW4gZGV2aWNlLW1hcHBlciwgd2Ugc3BlY2lmeSB0aGluZ3MgaW4gc2VjdG9ycywgYnV0CisJCQkgKiBNRCByZWNvcmRzIHRoaXMgdmFsdWUgaW4ga0IKKwkJCSAqLworCQkJdmFsdWUgLz0gMjsKKwkJCWlmICh2YWx1ZSA+IENPVU5URVJfTUFYKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJNYXggd3JpdGUtYmVoaW5kIGxpbWl0IG91dCBvZiByYW5nZSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlycy0+bWQuYml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCA9IHZhbHVlOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiZGFlbW9uX3NsZWVwIikpIHsKKwkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX0RBRU1PTl9TTEVFUDsKKwkJCWlmICghdmFsdWUgfHwgKHZhbHVlID4gTUFYX1NDSEVEVUxFX1RJTUVPVVQpKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlycy0+bWQuYml0bWFwX2luZm8uZGFlbW9uX3NsZWVwID0gdmFsdWU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJzdHJpcGVfY2FjaGUiKSkgeworCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfU1RSSVBFX0NBQ0hFOworCisJCQkvKgorCQkJICogSW4gZGV2aWNlLW1hcHBlciwgd2Ugc3BlY2lmeSB0aGluZ3MgaW4gc2VjdG9ycywgYnV0CisJCQkgKiBNRCByZWNvcmRzIHRoaXMgdmFsdWUgaW4ga0IKKwkJCSAqLworCQkJdmFsdWUgLz0gMjsKKworCQkJaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsIDwgNSkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAiSW5hcHByb3ByaWF0ZSBhcmd1bWVudDogc3RyaXBlX2NhY2hlIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChyYWlkNV9zZXRfY2FjaGVfc2l6ZSgmcnMtPm1kLCAoaW50KXZhbHVlKSkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAiQmFkIHN0cmlwZV9jYWNoZSBzaXplIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1pbl9yZWNvdmVyeV9yYXRlIikpIHsKKwkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX01JTl9SRUNPVkVSWV9SQVRFOworCQkJaWYgKHZhbHVlID4gSU5UX01BWCkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAibWluX3JlY292ZXJ5X3JhdGUgb3V0IG9mIHJhbmdlIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJzLT5tZC5zeW5jX3NwZWVkX21pbiA9IChpbnQpdmFsdWU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJtYXhfcmVjb3ZlcnlfcmF0ZSIpKSB7CisJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9NQVhfUkVDT1ZFUllfUkFURTsKKwkJCWlmICh2YWx1ZSA+IElOVF9NQVgpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIm1heF9yZWNvdmVyeV9yYXRlIG91dCBvZiByYW5nZSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlycy0+bWQuc3luY19zcGVlZF9tYXggPSAoaW50KXZhbHVlOworCQl9IGVsc2UgeworCQkJRE1FUlIoIlVuYWJsZSB0byBwYXJzZSBSQUlEIHBhcmFtZXRlcjogJXMiLCBrZXkpOworCQkJcnMtPnRpLT5lcnJvciA9ICJVbmFibGUgdG8gcGFyc2UgUkFJRCBwYXJhbWV0ZXJzIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogQXNzdW1lIHRoZXJlIGFyZSBubyBtZXRhZGF0YSBkZXZpY2VzIHVudGlsIHRoZSBkcml2ZXMgYXJlIHBhcnNlZCAqLworCXJzLT5tZC5wZXJzaXN0ZW50ID0gMDsKKwlycy0+bWQuZXh0ZXJuYWwgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3RhYmxlX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IHJhaWRfc2V0LCBtZC5ldmVudF93b3JrKTsKKworCWRtX3RhYmxlX2V2ZW50KHJzLT50aS0+dGFibGUpOworfQorCitzdGF0aWMgaW50IHJhaWRfaXNfY29uZ2VzdGVkKHN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzICpjYiwgaW50IGJpdHMpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IGNvbnRhaW5lcl9vZihjYiwgc3RydWN0IHJhaWRfc2V0LCBjYWxsYmFja3MpOworCisJcmV0dXJuIG1kX3JhaWQ1X2Nvbmdlc3RlZCgmcnMtPm1kLCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgcmFpZF91bnBsdWcoc3RydWN0IGRtX3RhcmdldF9jYWxsYmFja3MgKmNiKQoreworCXN0cnVjdCByYWlkX3NldCAqcnMgPSBjb250YWluZXJfb2YoY2IsIHN0cnVjdCByYWlkX3NldCwgY2FsbGJhY2tzKTsKKworCW1kX3JhaWQ1X3VucGx1Z19kZXZpY2UocnMtPm1kLnByaXZhdGUpOworfQorCisvKgorICogQ29uc3RydWN0IGEgUkFJRDQvNS82IG1hcHBpbmc6CisgKiBBcmdzOgorICoJPHJhaWRfdHlwZT4gPCNyYWlkX3BhcmFtcz4gPHJhaWRfcGFyYW1zPgkJXAorICoJPCNyYWlkX2RldnM+IHsgPG1ldGFfZGV2MT4gPGRldjE+IC4uIDxtZXRhX2Rldk4+IDxkZXZOPiB9CisgKgorICogKiogbWV0YWRhdGEgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQsIHVzZSAnLScgaW5zdGVhZCAqKgorICoKKyAqIDxyYWlkX3BhcmFtcz4gdmFyaWVzIGJ5IDxyYWlkX3R5cGU+LiAgU2VlICdwYXJzZV9yYWlkX3BhcmFtcycgZm9yCisgKiBkZXRhaWxzIG9uIHBvc3NpYmxlIDxyYWlkX3BhcmFtcz4uCisgKi8KK3N0YXRpYyBpbnQgcmFpZF9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByZXQ7CisJc3RydWN0IHJhaWRfdHlwZSAqcnQ7CisJdW5zaWduZWQgbG9uZyBudW1fcmFpZF9wYXJhbXMsIG51bV9yYWlkX2RldnM7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IE5VTEw7CisKKwkvKiBNdXN0IGhhdmUgYXQgbGVhc3QgPHJhaWRfdHlwZT4gPCNyYWlkX3BhcmFtcz4gKi8KKwlpZiAoYXJnYyA8IDIpIHsKKwkJdGktPmVycm9yID0gIlRvbyBmZXcgYXJndW1lbnRzIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmFpZCB0eXBlICovCisJcnQgPSBnZXRfcmFpZF90eXBlKGFyZ3ZbMF0pOworCWlmICghcnQpIHsKKwkJdGktPmVycm9yID0gIlVucmVjb2duaXNlZCByYWlkX3R5cGUiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYXJnYy0tOworCWFyZ3YrKzsKKworCS8qIG51bWJlciBvZiBSQUlEIHBhcmFtZXRlcnMgKi8KKwlpZiAoc3RyaWN0X3N0cnRvdWwoYXJndlswXSwgMTAsICZudW1fcmFpZF9wYXJhbXMpIDwgMCkgeworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IHVuZGVyc3RhbmQgbnVtYmVyIG9mIFJBSUQgcGFyYW1ldGVycyI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlhcmdjLS07CisJYXJndisrOworCisJLyogU2tpcCBvdmVyIFJBSUQgcGFyYW1zIGZvciBub3cgYW5kIGZpbmQgb3V0ICMgb2YgZGV2aWNlcyAqLworCWlmIChudW1fcmFpZF9wYXJhbXMgKyAxID4gYXJnYykgeworCQl0aS0+ZXJyb3IgPSAiQXJndW1lbnRzIGRvIG5vdCBhZ3JlZSB3aXRoIGNvdW50cyBnaXZlbiI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoc3RyaWN0X3N0cnRvdWwoYXJndltudW1fcmFpZF9wYXJhbXNdLCAxMCwgJm51bV9yYWlkX2RldnMpIDwgMCkgfHwKKwkgICAgKG51bV9yYWlkX2RldnMgPj0gSU5UX01BWCkpIHsKKwkJdGktPmVycm9yID0gIkNhbm5vdCB1bmRlcnN0YW5kIG51bWJlciBvZiByYWlkIGRldmljZXMiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlycyA9IGNvbnRleHRfYWxsb2ModGksIHJ0LCAodW5zaWduZWQpbnVtX3JhaWRfZGV2cyk7CisJaWYgKElTX0VSUihycykpCisJCXJldHVybiBQVFJfRVJSKHJzKTsKKworCXJldCA9IHBhcnNlX3JhaWRfcGFyYW1zKHJzLCBhcmd2LCAodW5zaWduZWQpbnVtX3JhaWRfcGFyYW1zKTsKKwlpZiAocmV0KQorCQlnb3RvIGJhZDsKKworCXJldCA9IC1FSU5WQUw7CisKKwlhcmdjIC09IG51bV9yYWlkX3BhcmFtcyArIDE7IC8qICsxOiB3ZSBhbHJlYWR5IGhhdmUgbnVtX3JhaWRfZGV2cyAqLworCWFyZ3YgKz0gbnVtX3JhaWRfcGFyYW1zICsgMTsKKworCWlmIChhcmdjICE9IChudW1fcmFpZF9kZXZzICogMikpIHsKKwkJdGktPmVycm9yID0gIlN1cHBsaWVkIFJBSUQgZGV2aWNlcyBkb2VzIG5vdCBtYXRjaCB0aGUgY291bnQgZ2l2ZW4iOworCQlnb3RvIGJhZDsKKwl9CisKKwlyZXQgPSBkZXZfcGFybXMocnMsIGFyZ3YpOworCWlmIChyZXQpCisJCWdvdG8gYmFkOworCisJSU5JVF9XT1JLKCZycy0+bWQuZXZlbnRfd29yaywgZG9fdGFibGVfZXZlbnQpOworCXRpLT5zcGxpdF9pbyA9IHJzLT5tZC5jaHVua19zZWN0b3JzOworCXRpLT5wcml2YXRlID0gcnM7CisKKwltdXRleF9sb2NrKCZycy0+bWQucmVjb25maWdfbXV0ZXgpOworCXJldCA9IG1kX3J1bigmcnMtPm1kKTsKKwlycy0+bWQuaW5fc3luYyA9IDA7IC8qIEFzc3VtZSBhbHJlYWR5IG1hcmtlZCBkaXJ0eSAqLworCW11dGV4X3VubG9jaygmcnMtPm1kLnJlY29uZmlnX211dGV4KTsKKworCWlmIChyZXQpIHsKKwkJdGktPmVycm9yID0gIkZhaWwgdG8gcnVuIHJhaWQgYXJyYXkiOworCQlnb3RvIGJhZDsKKwl9CisKKwlycy0+Y2FsbGJhY2tzLmNvbmdlc3RlZF9mbiA9IHJhaWRfaXNfY29uZ2VzdGVkOworCXJzLT5jYWxsYmFja3MudW5wbHVnX2ZuID0gcmFpZF91bnBsdWc7CisJZG1fdGFibGVfYWRkX3RhcmdldF9jYWxsYmFja3ModGktPnRhYmxlLCAmcnMtPmNhbGxiYWNrcyk7CisKKwlyZXR1cm4gMDsKKworYmFkOgorCWNvbnRleHRfZnJlZShycyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByYWlkX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gdGktPnByaXZhdGU7CisKKwlsaXN0X2RlbF9pbml0KCZycy0+Y2FsbGJhY2tzLmxpc3QpOworCW1kX3N0b3AoJnJzLT5tZCk7CisJY29udGV4dF9mcmVlKHJzKTsKK30KKworc3RhdGljIGludCByYWlkX21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLCB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCW1kZGV2X3QgKm1kZGV2ID0gJnJzLT5tZDsKKworCW1kZGV2LT5wZXJzLT5tYWtlX3JlcXVlc3QobWRkZXYsIGJpbyk7CisKKwlyZXR1cm4gRE1fTUFQSU9fU1VCTUlUVEVEOworfQorCitzdGF0aWMgaW50IHJhaWRfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCisJCSAgICAgICBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIG1heGxlbikKK3sKKwlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gdGktPnByaXZhdGU7CisJdW5zaWduZWQgcmFpZF9wYXJhbV9jbnQgPSAxOyAvKiBhdCBsZWFzdCAxIGZvciBjaHVua3NpemUgKi8KKwl1bnNpZ25lZCBzeiA9IDA7CisJaW50IGk7CisJc2VjdG9yX3Qgc3luYzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgorCQlETUVNSVQoIiVzICVkICIsIHJzLT5yYWlkX3R5cGUtPm5hbWUsIHJzLT5tZC5yYWlkX2Rpc2tzKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCJEIik7CisJCQllbHNlIGlmICh0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKKwkJCQlETUVNSVQoIkEiKTsKKwkJCWVsc2UKKwkJCQlETUVNSVQoImEiKTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9SVU5OSU5HLCAmcnMtPm1kLnJlY292ZXJ5KSkKKwkJCXN5bmMgPSBycy0+bWQuY3Vycl9yZXN5bmNfY29tcGxldGVkOworCQllbHNlCisJCQlzeW5jID0gcnMtPm1kLnJlY292ZXJ5X2NwOworCisJCWlmIChzeW5jID4gcnMtPm1kLnJlc3luY19tYXhfc2VjdG9ycykKKwkJCXN5bmMgPSBycy0+bWQucmVzeW5jX21heF9zZWN0b3JzOworCisJCURNRU1JVCgiICVsbHUvJWxsdSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzeW5jLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnMtPm1kLnJlc3luY19tYXhfc2VjdG9ycyk7CisKKwkJYnJlYWs7CisJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgorCQkvKiBUaGUgc3RyaW5nIHlvdSB3b3VsZCB1c2UgdG8gY29uc3RydWN0IHRoaXMgYXJyYXkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCisJCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKKwkJCQlyYWlkX3BhcmFtX2NudCsrOyAvKiBmb3IgcmVidWlsZHMgKi8KKworCQlyYWlkX3BhcmFtX2NudCArPSAoaHdlaWdodDY0KHJzLT5wcmludF9mbGFncykgKiAyKTsKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIChETVBGX1NZTkMgfCBETVBGX05PU1lOQykpCisJCQlyYWlkX3BhcmFtX2NudC0tOworCisJCURNRU1JVCgiJXMgJXUgJXUiLCBycy0+cmFpZF90eXBlLT5uYW1lLAorCQkgICAgICAgcmFpZF9wYXJhbV9jbnQsIHJzLT5tZC5jaHVua19zZWN0b3JzKTsKKworCQlpZiAoKHJzLT5wcmludF9mbGFncyAmIERNUEZfU1lOQykgJiYKKwkJICAgIChycy0+bWQucmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKSkKKwkJCURNRU1JVCgiIHN5bmMiKTsKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTk9TWU5DKQorCQkJRE1FTUlUKCIgbm9zeW5jIik7CisKKwkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCisJCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKKwkJCQlETUVNSVQoIiByZWJ1aWxkICV1IiwgaSk7CisKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfREFFTU9OX1NMRUVQKQorCQkJRE1FTUlUKCIgZGFlbW9uX3NsZWVwICVsdSIsCisJCQkgICAgICAgcnMtPm1kLmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCk7CisKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTUlOX1JFQ09WRVJZX1JBVEUpCisJCQlETUVNSVQoIiBtaW5fcmVjb3ZlcnlfcmF0ZSAlZCIsIHJzLT5tZC5zeW5jX3NwZWVkX21pbik7CisKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTUFYX1JFQ09WRVJZX1JBVEUpCisJCQlETUVNSVQoIiBtYXhfcmVjb3ZlcnlfcmF0ZSAlZCIsIHJzLT5tZC5zeW5jX3NwZWVkX21heCk7CisKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTUFYX1dSSVRFX0JFSElORCkKKwkJCURNRU1JVCgiIG1heF93cml0ZV9iZWhpbmQgJWx1IiwKKwkJCSAgICAgICBycy0+bWQuYml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCk7CisKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfU1RSSVBFX0NBQ0hFKSB7CisJCQlyYWlkNV9jb25mX3QgKmNvbmYgPSBycy0+bWQucHJpdmF0ZTsKKworCQkJLyogY29udmVydCBmcm9tIGtpQiB0byBzZWN0b3JzICovCisJCQlETUVNSVQoIiBzdHJpcGVfY2FjaGUgJWQiLAorCQkJICAgICAgIGNvbmYgPyBjb25mLT5tYXhfbnJfc3RyaXBlcyAqIDIgOiAwKTsKKwkJfQorCisJCURNRU1JVCgiICVkIiwgcnMtPm1kLnJhaWRfZGlza3MpOworCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQkJRE1FTUlUKCIgLSIpOyAvKiBtZXRhZGF0YSBkZXZpY2UgKi8KKworCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYpCisJCQkJRE1FTUlUKCIgJXMiLCBycy0+ZGV2W2ldLmRhdGFfZGV2LT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlETUVNSVQoIiAtIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYWlkX2l0ZXJhdGVfZGV2aWNlcyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgaXRlcmF0ZV9kZXZpY2VzX2NhbGxvdXRfZm4gZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCXVuc2lnbmVkIGk7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCQlpZiAocnMtPmRldltpXS5kYXRhX2RldikKKwkJCXJldCA9IGZuKHRpLAorCQkJCSBycy0+ZGV2W2ldLmRhdGFfZGV2LAorCQkJCSAwLCAvKiBObyBvZmZzZXQgb24gZGF0YSBkZXZzICovCisJCQkJIHJzLT5tZC5kZXZfc2VjdG9ycywKKwkJCQkgZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByYWlkX2lvX2hpbnRzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW1pdHMpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBycy0+bWQuY2h1bmtfc2VjdG9ycyA8PCA5OworCXJhaWQ1X2NvbmZfdCAqY29uZiA9IHJzLT5tZC5wcml2YXRlOworCisJYmxrX2xpbWl0c19pb19taW4obGltaXRzLCBjaHVua19zaXplKTsKKwlibGtfbGltaXRzX2lvX29wdChsaW1pdHMsIGNodW5rX3NpemUgKiAoY29uZi0+cmFpZF9kaXNrcyAtIGNvbmYtPm1heF9kZWdyYWRlZCkpOworfQorCitzdGF0aWMgdm9pZCByYWlkX3ByZXN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCisJbWRfc3RvcF93cml0ZXMoJnJzLT5tZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWRfcG9zdHN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCisJbWRkZXZfc3VzcGVuZCgmcnMtPm1kKTsKK30KKworc3RhdGljIHZvaWQgcmFpZF9yZXN1bWUoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOworCisJbWRkZXZfcmVzdW1lKCZycy0+bWQpOworfQorCitzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHJhaWRfdGFyZ2V0ID0geworCS5uYW1lID0gInJhaWQiLAorCS52ZXJzaW9uID0gezEsIDAsIDB9LAorCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuY3RyID0gcmFpZF9jdHIsCisJLmR0ciA9IHJhaWRfZHRyLAorCS5tYXAgPSByYWlkX21hcCwKKwkuc3RhdHVzID0gcmFpZF9zdGF0dXMsCisJLml0ZXJhdGVfZGV2aWNlcyA9IHJhaWRfaXRlcmF0ZV9kZXZpY2VzLAorCS5pb19oaW50cyA9IHJhaWRfaW9faGludHMsCisJLnByZXN1c3BlbmQgPSByYWlkX3ByZXN1c3BlbmQsCisJLnBvc3RzdXNwZW5kID0gcmFpZF9wb3N0c3VzcGVuZCwKKwkucmVzdW1lID0gcmFpZF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkbV9yYWlkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZG1fcmVnaXN0ZXJfdGFyZ2V0KCZyYWlkX3RhcmdldCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbV9yYWlkX2V4aXQodm9pZCkKK3sKKwlkbV91bnJlZ2lzdGVyX3RhcmdldCgmcmFpZF90YXJnZXQpOworfQorCittb2R1bGVfaW5pdChkbV9yYWlkX2luaXQpOworbW9kdWxlX2V4aXQoZG1fcmFpZF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKERNX05BTUUgIiByYWlkNC81LzYgdGFyZ2V0Iik7CitNT0RVTEVfQUxJQVMoImRtLXJhaWQ0Iik7CitNT0RVTEVfQUxJQVMoImRtLXJhaWQ1Iik7CitNT0RVTEVfQUxJQVMoImRtLXJhaWQ2Iik7CitNT0RVTEVfQVVUSE9SKCJOZWlsIEJyb3duIDxkbS1kZXZlbEByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkMS5jIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCmluZGV4IDE5YTU5YjAuLmRlZTMyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCXN0cnVjdCBkbV9pb19yZXF1ZXN0IGlvX3JlcSA9IHsKIAkJLmJpX3J3ID0gV1JJVEVfRkxVU0gsCiAJCS5tZW0udHlwZSA9IERNX0lPX0tNRU0sCi0JCS5tZW0ucHRyLmJ2ZWMgPSBOVUxMLAorCQkubWVtLnB0ci5hZGRyID0gTlVMTCwKIAkJLmNsaWVudCA9IG1zLT5pb19jbGllbnQsCiAJfTsKIApAQCAtNjM3LDYgKzYzNywxMiBAQAogCQkuY2xpZW50ID0gbXMtPmlvX2NsaWVudCwKIAl9OwogCisJaWYgKGJpby0+YmlfcncgJiBSRVFfRElTQ0FSRCkgeworCQlpb19yZXEuYmlfcncgfD0gUkVRX0RJU0NBUkQ7CisJCWlvX3JlcS5tZW0udHlwZSA9IERNX0lPX0tNRU07CisJCWlvX3JlcS5tZW0ucHRyLmFkZHIgPSBOVUxMOworCX0KKwogCWZvciAoaSA9IDAsIG0gPSBtcy0+bWlycm9yOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKywgbSsrKQogCQltYXBfcmVnaW9uKGRlc3QrKywgbSwgYmlvKTsKIApAQCAtNjcwLDcgKzY3Niw4IEBACiAJYmlvX2xpc3RfaW5pdCgmcmVxdWV1ZSk7CiAKIAl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCh3cml0ZXMpKSkgewotCQlpZiAoYmlvLT5iaV9ydyAmIFJFUV9GTFVTSCkgeworCQlpZiAoKGJpby0+YmlfcncgJiBSRVFfRkxVU0gpIHx8CisJCSAgICAoYmlvLT5iaV9ydyAmIFJFUV9ESVNDQVJEKSkgewogCQkJYmlvX2xpc3RfYWRkKCZzeW5jLCBiaW8pOwogCQkJY29udGludWU7CiAJCX0KQEAgLTEwNzYsOCArMTA4MywxMCBAQAogCXRpLT5wcml2YXRlID0gbXM7CiAJdGktPnNwbGl0X2lvID0gZG1fcmhfZ2V0X3JlZ2lvbl9zaXplKG1zLT5yaCk7CiAJdGktPm51bV9mbHVzaF9yZXF1ZXN0cyA9IDE7CisJdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzID0gMTsKIAotCW1zLT5rbWlycm9yZF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrbWlycm9yZCIpOworCW1zLT5rbWlycm9yZF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgia21pcnJvcmQiLAorCQkJCQkgIFdRX05PTl9SRUVOVFJBTlQgfCBXUV9NRU1fUkVDTEFJTSwgMCk7CiAJaWYgKCFtcy0+a21pcnJvcmRfd3EpIHsKIAkJRE1FUlIoImNvdWxkbid0IHN0YXJ0IGttaXJyb3JkIik7CiAJCXIgPSAtRU5PTUVNOwpAQCAtMTEzMCw3ICsxMTM5LDcgQEAKIAogCWRlbF90aW1lcl9zeW5jKCZtcy0+dGltZXIpOwogCWZsdXNoX3dvcmtxdWV1ZShtcy0+a21pcnJvcmRfd3EpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmx1c2hfd29ya19zeW5jKCZtcy0+dHJpZ2dlcl9ldmVudCk7CiAJZG1fa2NvcHlkX2NsaWVudF9kZXN0cm95KG1zLT5rY29weWRfY2xpZW50KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShtcy0+a21pcnJvcmRfd3EpOwogCWZyZWVfY29udGV4dChtcywgdGksIG1zLT5ucl9taXJyb3JzKTsKQEAgLTE0MDYsNyArMTQxNSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgbWlycm9yX3RhcmdldCA9IHsKIAkubmFtZQkgPSAibWlycm9yIiwKLQkudmVyc2lvbiA9IHsxLCAxMiwgMH0sCisJLnZlcnNpb24gPSB7MSwgMTIsIDF9LAogCS5tb2R1bGUJID0gVEhJU19NT0RVTEUsCiAJLmN0cgkgPSBtaXJyb3JfY3RyLAogCS5kdHIJID0gbWlycm9yX2R0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCmluZGV4IDIxMjljZGIuLjk1ODkxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJICovCiAJSU5JVF9XT1JLX09OU1RBQ0soJnJlcS53b3JrLCBkb19tZXRhZGF0YSk7CiAJcXVldWVfd29yayhwcy0+bWV0YWRhdGFfd3EsICZyZXEud29yayk7Ci0JZmx1c2hfd29ya3F1ZXVlKHBzLT5tZXRhZGF0YV93cSk7CisJZmx1c2hfd29yaygmcmVxLndvcmspOwogCiAJcmV0dXJuIHJlcS5yZXN1bHQ7CiB9CkBAIC04MTgsNyArODE4LDcgQEAKIAlhdG9taWNfc2V0KCZwcy0+cGVuZGluZ19jb3VudCwgMCk7CiAJcHMtPmNhbGxiYWNrcyA9IE5VTEw7CiAKLQlwcy0+bWV0YWRhdGFfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3NuYXBoZCIpOworCXBzLT5tZXRhZGF0YV93cSA9IGFsbG9jX3dvcmtxdWV1ZSgia3NuYXBoZCIsIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIXBzLT5tZXRhZGF0YV93cSkgewogCQlrZnJlZShwcyk7CiAJCURNRVJSKCJjb3VsZG4ndCBzdGFydCBoZWFkZXIgbWV0YWRhdGEgdXBkYXRlIHRocmVhZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA1M2NmNzlkLi5mZGRlNTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZG0ta2NvcHlkLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJkbS1leGNlcHRpb24tc3RvcmUuaCIKIApAQCAtODAsOSArNzksNiBAQAogCS8qIE9yaWdpbiB3cml0ZXMgZG9uJ3QgdHJpZ2dlciBleGNlcHRpb25zIHVudGlsIHRoaXMgaXMgc2V0ICovCiAJaW50IGFjdGl2ZTsKIAotCS8qIFdoZXRoZXIgb3Igbm90IG93bmluZyBtYXBwZWRfZGV2aWNlIGlzIHN1c3BlbmRlZCAqLwotCWludCBzdXNwZW5kZWQ7Ci0KIAlhdG9taWNfdCBwZW5kaW5nX2V4Y2VwdGlvbnNfY291bnQ7CiAKIAltZW1wb29sX3QgKnBlbmRpbmdfcG9vbDsKQEAgLTEwNiwxMCArMTAyLDYgQEAKIAogCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprY29weWRfY2xpZW50OwogCi0JLyogUXVldWUgb2Ygc25hcHNob3Qgd3JpdGVzIGZvciBrc25hcGQgdG8gZmx1c2ggKi8KLQlzdHJ1Y3QgYmlvX2xpc3QgcXVldWVkX2Jpb3M7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHF1ZXVlZF9iaW9zX3dvcms7Ci0KIAkvKiBXYWl0IGZvciBldmVudHMgYmFzZWQgb24gc3RhdGVfYml0cyAqLwogCXVuc2lnbmVkIGxvbmcgc3RhdGVfYml0czsKIApAQCAtMTYwLDkgKzE1Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtX3NuYXBfY293KTsKIAotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprc25hcGQ7Ci1zdGF0aWMgdm9pZCBmbHVzaF9xdWV1ZWRfYmlvcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCiBzdGF0aWMgc2VjdG9yX3QgY2h1bmtfdG9fc2VjdG9yKHN0cnVjdCBkbV9leGNlcHRpb25fc3RvcmUgKnN0b3JlLAogCQkJCWNodW5rX3QgY2h1bmspCiB7CkBAIC0xMTEwLDcgKzEwOTksNiBAQAogCXMtPnRpID0gdGk7CiAJcy0+dmFsaWQgPSAxOwogCXMtPmFjdGl2ZSA9IDA7Ci0Jcy0+c3VzcGVuZGVkID0gMDsKIAlhdG9taWNfc2V0KCZzLT5wZW5kaW5nX2V4Y2VwdGlvbnNfY291bnQsIDApOwogCWluaXRfcndzZW0oJnMtPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZzLT5saXN0KTsKQEAgLTExNTMsOSArMTE0MSw2IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmcy0+dHJhY2tlZF9jaHVua19sb2NrKTsKIAotCWJpb19saXN0X2luaXQoJnMtPnF1ZXVlZF9iaW9zKTsKLQlJTklUX1dPUksoJnMtPnF1ZXVlZF9iaW9zX3dvcmssIGZsdXNoX3F1ZXVlZF9iaW9zKTsKLQogCXRpLT5wcml2YXRlID0gczsKIAl0aS0+bnVtX2ZsdXNoX3JlcXVlc3RzID0gbnVtX2ZsdXNoX3JlcXVlc3RzOwogCkBAIC0xMjc5LDggKzEyNjQsNiBAQAogCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHRpLT5wcml2YXRlOwogCXN0cnVjdCBkbV9zbmFwc2hvdCAqc25hcF9zcmMgPSBOVUxMLCAqc25hcF9kZXN0ID0gTlVMTDsKIAotCWZsdXNoX3dvcmtxdWV1ZShrc25hcGQpOwotCiAJZG93bl9yZWFkKCZfb3JpZ2luc19sb2NrKTsKIAkvKiBDaGVjayB3aGV0aGVyIGV4Y2VwdGlvbiBoYW5kb3ZlciBtdXN0IGJlIGNhbmNlbGxlZCAqLwogCSh2b2lkKSBfX2ZpbmRfc25hcHNob3RzX3NoYXJpbmdfY293KHMsICZzbmFwX3NyYywgJnNuYXBfZGVzdCwgTlVMTCk7CkBAIC0xMzQyLDIwICsxMzI1LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGZsdXNoX3F1ZXVlZF9iaW9zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRtX3NuYXBzaG90LCBxdWV1ZWRfYmlvc193b3JrKTsKLQlzdHJ1Y3QgYmlvICpxdWV1ZWRfYmlvczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnBlX2xvY2ssIGZsYWdzKTsKLQlxdWV1ZWRfYmlvcyA9IGJpb19saXN0X2dldCgmcy0+cXVldWVkX2Jpb3MpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnBlX2xvY2ssIGZsYWdzKTsKLQotCWZsdXNoX2Jpb3MocXVldWVkX2Jpb3MpOwotfQotCiBzdGF0aWMgaW50IGRvX29yaWdpbihzdHJ1Y3QgZG1fZGV2ICpvcmlnaW4sIHN0cnVjdCBiaW8gKmJpbyk7CiAKIC8qCkBAIC0xNzYwLDE1ICsxNzI5LDYgQEAKIAlzdG9wX21lcmdlKHMpOwogfQogCi1zdGF0aWMgdm9pZCBzbmFwc2hvdF9wb3N0c3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKLXsKLQlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPSB0aS0+cHJpdmF0ZTsKLQotCWRvd25fd3JpdGUoJnMtPmxvY2spOwotCXMtPnN1c3BlbmRlZCA9IDE7Ci0JdXBfd3JpdGUoJnMtPmxvY2spOwotfQotCiBzdGF0aWMgaW50IHNuYXBzaG90X3ByZXJlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlpbnQgciA9IDA7CkBAIC0xNzgzLDcgKzE3NDMsNyBAQAogCQkJRE1FUlIoIlVuYWJsZSB0byByZXN1bWUgc25hcHNob3Qgc291cmNlIHVudGlsICIKIAkJCSAgICAgICJoYW5kb3ZlciBjb21wbGV0ZXMuIik7CiAJCQlyID0gLUVJTlZBTDsKLQkJfSBlbHNlIGlmICghc25hcF9zcmMtPnN1c3BlbmRlZCkgeworCQl9IGVsc2UgaWYgKCFkbV9zdXNwZW5kZWQoc25hcF9zcmMtPnRpKSkgewogCQkJRE1FUlIoIlVuYWJsZSB0byBwZXJmb3JtIHNuYXBzaG90IGhhbmRvdmVyIHVudGlsICIKIAkJCSAgICAgICJzb3VyY2UgaXMgc3VzcGVuZGVkLiIpOwogCQkJciA9IC1FSU5WQUw7CkBAIC0xODE2LDcgKzE3NzYsNiBAQAogCiAJZG93bl93cml0ZSgmcy0+bG9jayk7CiAJcy0+YWN0aXZlID0gMTsKLQlzLT5zdXNwZW5kZWQgPSAwOwogCXVwX3dyaXRlKCZzLT5sb2NrKTsKIH0KIApAQCAtMjE5NCw3ICsyMTUzLDcgQEAKIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBvcmlnaW5fdGFyZ2V0ID0gewogCS5uYW1lICAgID0gInNuYXBzaG90LW9yaWdpbiIsCi0JLnZlcnNpb24gPSB7MSwgNywgMH0sCisJLnZlcnNpb24gPSB7MSwgNywgMX0sCiAJLm1vZHVsZSAgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgICA9IG9yaWdpbl9jdHIsCiAJLmR0ciAgICAgPSBvcmlnaW5fZHRyLApAQCAtMjIwNywxMyArMjE2NiwxMiBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHNuYXBzaG90X3RhcmdldCA9IHsKIAkubmFtZSAgICA9ICJzbmFwc2hvdCIsCi0JLnZlcnNpb24gPSB7MSwgOSwgMH0sCisJLnZlcnNpb24gPSB7MSwgMTAsIDB9LAogCS5tb2R1bGUgID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICAgPSBzbmFwc2hvdF9jdHIsCiAJLmR0ciAgICAgPSBzbmFwc2hvdF9kdHIsCiAJLm1hcCAgICAgPSBzbmFwc2hvdF9tYXAsCiAJLmVuZF9pbyAgPSBzbmFwc2hvdF9lbmRfaW8sCi0JLnBvc3RzdXNwZW5kID0gc25hcHNob3RfcG9zdHN1c3BlbmQsCiAJLnByZXJlc3VtZSAgPSBzbmFwc2hvdF9wcmVyZXN1bWUsCiAJLnJlc3VtZSAgPSBzbmFwc2hvdF9yZXN1bWUsCiAJLnN0YXR1cyAgPSBzbmFwc2hvdF9zdGF0dXMsCkBAIC0yMjIyLDE0ICsyMTgwLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgbWVyZ2VfdGFyZ2V0ID0gewogCS5uYW1lICAgID0gZG1fc25hcHNob3RfbWVyZ2VfdGFyZ2V0X25hbWUsCi0JLnZlcnNpb24gPSB7MSwgMCwgMH0sCisJLnZlcnNpb24gPSB7MSwgMSwgMH0sCiAJLm1vZHVsZSAgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgICA9IHNuYXBzaG90X2N0ciwKIAkuZHRyICAgICA9IHNuYXBzaG90X2R0ciwKIAkubWFwICAgICA9IHNuYXBzaG90X21lcmdlX21hcCwKIAkuZW5kX2lvICA9IHNuYXBzaG90X2VuZF9pbywKIAkucHJlc3VzcGVuZCA9IHNuYXBzaG90X21lcmdlX3ByZXN1c3BlbmQsCi0JLnBvc3RzdXNwZW5kID0gc25hcHNob3RfcG9zdHN1c3BlbmQsCiAJLnByZXJlc3VtZSAgPSBzbmFwc2hvdF9wcmVyZXN1bWUsCiAJLnJlc3VtZSAgPSBzbmFwc2hvdF9tZXJnZV9yZXN1bWUsCiAJLnN0YXR1cyAgPSBzbmFwc2hvdF9zdGF0dXMsCkBAIC0yMjkxLDE3ICsyMjQ4LDggQEAKIAkJZ290byBiYWRfdHJhY2tlZF9jaHVua19jYWNoZTsKIAl9CiAKLQlrc25hcGQgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3NuYXBkIik7Ci0JaWYgKCFrc25hcGQpIHsKLQkJRE1FUlIoIkZhaWxlZCB0byBjcmVhdGUga3NuYXBkIHdvcmtxdWV1ZS4iKTsKLQkJciA9IC1FTk9NRU07Ci0JCWdvdG8gYmFkX3BlbmRpbmdfcG9vbDsKLQl9Ci0KIAlyZXR1cm4gMDsKIAotYmFkX3BlbmRpbmdfcG9vbDoKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJhY2tlZF9jaHVua19jYWNoZSk7CiBiYWRfdHJhY2tlZF9jaHVua19jYWNoZToKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kocGVuZGluZ19jYWNoZSk7CiBiYWRfcGVuZGluZ19jYWNoZToKQEAgLTIzMjIsOCArMjI3MCw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbV9zbmFwc2hvdF9leGl0KHZvaWQpCiB7Ci0JZGVzdHJveV93b3JrcXVldWUoa3NuYXBkKTsKLQogCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzbmFwc2hvdF90YXJnZXQpOwogCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZvcmlnaW5fdGFyZ2V0KTsKIAlkbV91bnJlZ2lzdGVyX3RhcmdldCgmbWVyZ2VfdGFyZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCmluZGV4IGYwMzcxYjQuLmRkZGZhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwpAQCAtMzksMjMgKzM5LDIwIEBACiAJc3RydWN0IGRtX3RhcmdldCAqdGk7CiAKIAkvKiBXb3JrIHN0cnVjdCB1c2VkIGZvciB0cmlnZ2VyaW5nIGV2ZW50cyovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGtzdHJpcGVkX3dzOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0cmlnZ2VyX2V2ZW50OwogCiAJc3RydWN0IHN0cmlwZSBzdHJpcGVbMF07CiB9OwogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmtzdHJpcGVkOwotCiAvKgogICogQW4gZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW5ldmVyIGEgZHJpdmUKICAqIGRyb3BzIG91dCBvZiBhIHN0cmlwZSB2b2x1bWUuCiAgKi8KIHN0YXRpYyB2b2lkIHRyaWdnZXJfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzdHJpcGVfYyAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN0cmlwZV9jLCBrc3RyaXBlZF93cyk7Ci0KKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdHJpcGVfYywKKwkJCQkJICAgdHJpZ2dlcl9ldmVudCk7CiAJZG1fdGFibGVfZXZlbnQoc2MtPnRpLT50YWJsZSk7Ci0KIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RyaXBlX2MgKmFsbG9jX2NvbnRleHQodW5zaWduZWQgaW50IHN0cmlwZXMpCkBAIC0xNjAsNyArMTU3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JSU5JVF9XT1JLKCZzYy0+a3N0cmlwZWRfd3MsIHRyaWdnZXJfZXZlbnQpOworCUlOSVRfV09SSygmc2MtPnRyaWdnZXJfZXZlbnQsIHRyaWdnZXJfZXZlbnQpOwogCiAJLyogU2V0IHBvaW50ZXIgdG8gZG0gdGFyZ2V0OyB1c2VkIGluIHRyaWdnZXJfZXZlbnQgKi8KIAlzYy0+dGkgPSB0aTsKQEAgLTIxMSw3ICsyMDgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBzYy0+c3RyaXBlczsgaSsrKQogCQlkbV9wdXRfZGV2aWNlKHRpLCBzYy0+c3RyaXBlW2ldLmRldik7CiAKLQlmbHVzaF93b3JrcXVldWUoa3N0cmlwZWQpOworCWZsdXNoX3dvcmtfc3luYygmc2MtPnRyaWdnZXJfZXZlbnQpOwogCWtmcmVlKHNjKTsKIH0KIApAQCAtMzY3LDcgKzM2NCw3IEBACiAJCQlhdG9taWNfaW5jKCYoc2MtPnN0cmlwZVtpXS5lcnJvcl9jb3VudCkpOwogCQkJaWYgKGF0b21pY19yZWFkKCYoc2MtPnN0cmlwZVtpXS5lcnJvcl9jb3VudCkpIDwKIAkJCSAgICBETV9JT19FUlJPUl9USFJFU0hPTEQpCi0JCQkJcXVldWVfd29yayhrc3RyaXBlZCwgJnNjLT5rc3RyaXBlZF93cyk7CisJCQkJc2NoZWR1bGVfd29yaygmc2MtPnRyaWdnZXJfZXZlbnQpOwogCQl9CiAKIAlyZXR1cm4gZXJyb3I7CkBAIC00MDEsNyArMzk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBzdHJpcGVfdGFyZ2V0ID0gewogCS5uYW1lICAgPSAic3RyaXBlZCIsCi0JLnZlcnNpb24gPSB7MSwgMywgMH0sCisJLnZlcnNpb24gPSB7MSwgMywgMX0sCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgPSBzdHJpcGVfY3RyLAogCS5kdHIgICAgPSBzdHJpcGVfZHRyLApAQCAtNDIyLDIwICs0MTksMTAgQEAKIAkJcmV0dXJuIHI7CiAJfQogCi0Ja3N0cmlwZWQgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3N0cmlwZWQiKTsKLQlpZiAoIWtzdHJpcGVkKSB7Ci0JCURNRVJSKCJmYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZSBrc3RyaXBlZCIpOwotCQlkbV91bnJlZ2lzdGVyX3RhcmdldCgmc3RyaXBlX3RhcmdldCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXJldHVybiByOwogfQogCiB2b2lkIGRtX3N0cmlwZV9leGl0KHZvaWQpCiB7CiAJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJnN0cmlwZV90YXJnZXQpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGtzdHJpcGVkKTsKLQotCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCA0ZDcwNWNlLi5kZmZhMGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC03MSw2ICs3MSw4IEBACiAJdm9pZCAqZXZlbnRfY29udGV4dDsKIAogCXN0cnVjdCBkbV9tZF9tZW1wb29scyAqbWVtcG9vbHM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRhcmdldF9jYWxsYmFja3M7CiB9OwogCiAvKgpAQCAtMjA0LDYgKzIwNiw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJSU5JVF9MSVNUX0hFQUQoJnQtPmRldmljZXMpOworCUlOSVRfTElTVF9IRUFEKCZ0LT50YXJnZXRfY2FsbGJhY2tzKTsKIAlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAwKTsKIAl0LT5kaXNjYXJkc19zdXBwb3J0ZWQgPSAxOwogCkBAIC0zMjUsMTUgKzMyOCwxOCBAQAogCiAJQlVHX09OKGQtPmRtX2Rldi5iZGV2KTsKIAotCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIGQtPmRtX2Rldi5tb2RlKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoZGV2LCBkLT5kbV9kZXYubW9kZSB8IEZNT0RFX0VYQ0wsIF9jbGFpbV9wdHIpOwogCWlmIChJU19FUlIoYmRldikpCiAJCXJldHVybiBQVFJfRVJSKGJkZXYpOwotCXIgPSBiZF9jbGFpbV9ieV9kaXNrKGJkZXYsIF9jbGFpbV9wdHIsIGRtX2Rpc2sobWQpKTsKLQlpZiAocikKLQkJYmxrZGV2X3B1dChiZGV2LCBkLT5kbV9kZXYubW9kZSk7Ci0JZWxzZQotCQlkLT5kbV9kZXYuYmRldiA9IGJkZXY7Ci0JcmV0dXJuIHI7CisKKwlyID0gYmRfbGlua19kaXNrX2hvbGRlcihiZGV2LCBkbV9kaXNrKG1kKSk7CisJaWYgKHIpIHsKKwkJYmxrZGV2X3B1dChiZGV2LCBkLT5kbV9kZXYubW9kZSB8IEZNT0RFX0VYQ0wpOworCQlyZXR1cm4gcjsKKwl9CisKKwlkLT5kbV9kZXYuYmRldiA9IGJkZXY7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0zNDQsOCArMzUwLDcgQEAKIAlpZiAoIWQtPmRtX2Rldi5iZGV2KQogCQlyZXR1cm47CiAKLQliZF9yZWxlYXNlX2Zyb21fZGlzayhkLT5kbV9kZXYuYmRldiwgZG1fZGlzayhtZCkpOwotCWJsa2Rldl9wdXQoZC0+ZG1fZGV2LmJkZXYsIGQtPmRtX2Rldi5tb2RlKTsKKwlibGtkZXZfcHV0KGQtPmRtX2Rldi5iZGV2LCBkLT5kbV9kZXYubW9kZSB8IEZNT0RFX0VYQ0wpOwogCWQtPmRtX2Rldi5iZGV2ID0gTlVMTDsKIH0KIApAQCAtMTIyMywxMCArMTIyOCwxNyBAQAogCXJldHVybiAwOwogfQogCit2b2lkIGRtX3RhYmxlX2FkZF90YXJnZXRfY2FsbGJhY2tzKHN0cnVjdCBkbV90YWJsZSAqdCwgc3RydWN0IGRtX3RhcmdldF9jYWxsYmFja3MgKmNiKQoreworCWxpc3RfYWRkKCZjYi0+bGlzdCwgJnQtPnRhcmdldF9jYWxsYmFja3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1fdGFibGVfYWRkX3RhcmdldF9jYWxsYmFja3MpOworCiBpbnQgZG1fdGFibGVfYW55X2Nvbmdlc3RlZChzdHJ1Y3QgZG1fdGFibGUgKnQsIGludCBiZGlfYml0cykKIHsKIAlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzID0gZG1fdGFibGVfZ2V0X2RldmljZXModCk7CisJc3RydWN0IGRtX3RhcmdldF9jYWxsYmFja3MgKmNiOwogCWludCByID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGQsIGRldmljZXMsIGxpc3QpIHsKQEAgLTEyNDEsNiArMTI1MywxMCBAQAogCQkJCSAgICAgYmRldm5hbWUoZGQtPmRtX2Rldi5iZGV2LCBiKSk7CiAJfQogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJnQtPnRhcmdldF9jYWxsYmFja3MsIGxpc3QpCisJCWlmIChjYi0+Y29uZ2VzdGVkX2ZuKQorCQkJciB8PSBjYi0+Y29uZ2VzdGVkX2ZuKGNiLCBiZGlfYml0cyk7CisKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTI2Miw2ICsxMjc4LDcgQEAKIHsKIAlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzID0gZG1fdGFibGVfZ2V0X2RldmljZXModCk7CisJc3RydWN0IGRtX3RhcmdldF9jYWxsYmFja3MgKmNiOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZCwgZGV2aWNlcywgbGlzdCkgewogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRkLT5kbV9kZXYuYmRldik7CkBAIC0xMjc0LDYgKzEyOTEsMTAgQEAKIAkJCQkgICAgIGRtX2RldmljZV9uYW1lKHQtPm1kKSwKIAkJCQkgICAgIGJkZXZuYW1lKGRkLT5kbV9kZXYuYmRldiwgYikpOwogCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZ0LT50YXJnZXRfY2FsbGJhY2tzLCBsaXN0KQorCQlpZiAoY2ItPnVucGx1Z19mbikKKwkJCWNiLT51bnBsdWdfZm4oY2IpOwogfQogCiBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZG1fdGFibGVfZ2V0X21kKHN0cnVjdCBkbV90YWJsZSAqdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCA3Y2IxMzUyLi5lYWEzYWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0zMiw3ICszMiw2IEBACiAjZGVmaW5lIERNX0NPT0tJRV9FTlZfVkFSX05BTUUgIkRNX0NPT0tJRSIKICNkZWZpbmUgRE1fQ09PS0lFX0xFTkdUSCAyNAogCi1zdGF0aWMgREVGSU5FX01VVEVYKGRtX211dGV4KTsKIHN0YXRpYyBjb25zdCBjaGFyICpfbmFtZSA9IERNX05BTUU7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOwpAQCAtMzI4LDcgKzMyNyw2IEBACiB7CiAJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwogCi0JbXV0ZXhfbG9jaygmZG1fbXV0ZXgpOwogCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOwogCiAJbWQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CkBAIC0zNDYsNyArMzQ0LDYgQEAKIAogb3V0OgogCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZkbV9tdXRleCk7CiAKIAlyZXR1cm4gbWQgPyAwIDogLUVOWElPOwogfQpAQCAtMzU1LDEwICszNTIsMTIgQEAKIHsKIAlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAKLQltdXRleF9sb2NrKCZkbV9tdXRleCk7CisJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CisKIAlhdG9taWNfZGVjKCZtZC0+b3Blbl9jb3VudCk7CiAJZG1fcHV0KG1kKTsKLQltdXRleF91bmxvY2soJmRtX211dGV4KTsKKworCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYzMCw3ICs2MjksNyBAQAogCQkJcXVldWVfaW8obWQsIGJpbyk7CiAJCX0gZWxzZSB7CiAJCQkvKiBkb25lIHdpdGggbm9ybWFsIElPIG9yIGVtcHR5IGZsdXNoICovCi0JCQl0cmFjZV9ibG9ja19iaW9fY29tcGxldGUobWQtPnF1ZXVlLCBiaW8pOworCQkJdHJhY2VfYmxvY2tfYmlvX2NvbXBsZXRlKG1kLT5xdWV1ZSwgYmlvLCBpb19lcnJvcik7CiAJCQliaW9fZW5kaW8oYmlvLCBpb19lcnJvcik7CiAJCX0KIAl9CkBAIC05OTAsOCArOTg5LDggQEAKIAlpZiAociA9PSBETV9NQVBJT19SRU1BUFBFRCkgewogCQkvKiB0aGUgYmlvIGhhcyBiZWVuIHJlbWFwcGVkIHNvIGRpc3BhdGNoIGl0ICovCiAKLQkJdHJhY2VfYmxvY2tfcmVtYXAoYmRldl9nZXRfcXVldWUoY2xvbmUtPmJpX2JkZXYpLCBjbG9uZSwKLQkJCQkgICAgdGlvLT5pby0+YmlvLT5iaV9iZGV2LT5iZF9kZXYsIHNlY3Rvcik7CisJCXRyYWNlX2Jsb2NrX2Jpb19yZW1hcChiZGV2X2dldF9xdWV1ZShjbG9uZS0+YmlfYmRldiksIGNsb25lLAorCQkJCSAgICAgIHRpby0+aW8tPmJpby0+YmlfYmRldi0+YmRfZGV2LCBzZWN0b3IpOwogCiAJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGNsb25lKTsKIAl9IGVsc2UgaWYgKHIgPCAwIHx8IHIgPT0gRE1fTUFQSU9fUkVRVUVVRSkgewpAQCAtMTYzOCwxMyArMTYzNywxNSBAQAogCQlpZiAobWFwX3JlcXVlc3QodGksIGNsb25lLCBtZCkpCiAJCQlnb3RvIHJlcXVldWVkOwogCi0JCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKKwkJc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOwogCX0KIAogCWdvdG8gb3V0OwogCiByZXF1ZXVlZDoKLQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKKwlzcGluX2xvY2socS0+cXVldWVfbG9jayk7CiAKIHBsdWdfYW5kX291dDoKIAlpZiAoIWVsdl9xdWV1ZV9lbXB0eShxKSkKQEAgLTE4ODQsNyArMTg4NSw4IEBACiAJYWRkX2Rpc2sobWQtPmRpc2spOwogCWZvcm1hdF9kZXZfdChtZC0+bmFtZSwgTUtERVYoX21ham9yLCBtaW5vcikpOwogCi0JbWQtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtkbWZsdXNoIik7CisJbWQtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJrZG1mbHVzaCIsCisJCQkJIFdRX05PTl9SRUVOVFJBTlQgfCBXUV9NRU1fUkVDTEFJTSwgMCk7CiAJaWYgKCFtZC0+d3EpCiAJCWdvdG8gYmFkX3RocmVhZDsKIApAQCAtMTk5MiwxMyArMTk5NCwxNCBAQAogCXdha2VfdXAoJm1kLT5ldmVudHEpOwogfQogCisvKgorICogUHJvdGVjdGVkIGJ5IG1kLT5zdXNwZW5kX2xvY2sgb2J0YWluZWQgYnkgZG1fc3dhcF90YWJsZSgpLgorICovCiBzdGF0aWMgdm9pZCBfX3NldF9zaXplKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc2VjdG9yX3Qgc2l6ZSkKIHsKIAlzZXRfY2FwYWNpdHkobWQtPmRpc2ssIHNpemUpOwogCi0JbXV0ZXhfbG9jaygmbWQtPmJkZXYtPmJkX2lub2RlLT5pX211dGV4KTsKIAlpX3NpemVfd3JpdGUobWQtPmJkZXYtPmJkX2lub2RlLCAobG9mZl90KXNpemUgPDwgU0VDVE9SX1NISUZUKTsKLQltdXRleF91bmxvY2soJm1kLT5iZGV2LT5iZF9pbm9kZS0+aV9tdXRleCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggMTc1YzQyNGYuLmNmODU5NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTI4OCwxMCArMjg4LDEyIEBACiAJaW50IHJ2OwogCWludCBjcHU7CiAKLQlpZiAobWRkZXYgPT0gTlVMTCB8fCBtZGRldi0+cGVycyA9PSBOVUxMKSB7CisJaWYgKG1kZGV2ID09IE5VTEwgfHwgbWRkZXYtPnBlcnMgPT0gTlVMTAorCSAgICB8fCAhbWRkZXYtPnJlYWR5KSB7CiAJCWJpb19pb19lcnJvcihiaW8pOwogCQlyZXR1cm4gMDsKIAl9CisJc21wX3JtYigpOyAvKiBFbnN1cmUgaW1wbGljYXRpb25zIG9mICAnYWN0aXZlJyBhcmUgdmlzaWJsZSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAobWRkZXYtPnN1c3BlbmRlZCkgewogCQlERUZJTkVfV0FJVChfX3dhaXQpOwpAQCAtNzAzLDkgKzcwNSw5IEBACiB9CiAKIC8qIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzdXBlciBibG9jayBpbiA1MTJieXRlIHNlY3RvcnMgKi8KLXN0YXRpYyBpbmxpbmUgc2VjdG9yX3QgY2FsY19kZXZfc2JvZmZzZXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3QgY2FsY19kZXZfc2JvZmZzZXQobWRrX3JkZXZfdCAqcmRldikKIHsKLQlzZWN0b3JfdCBudW1fc2VjdG9ycyA9IGlfc2l6ZV9yZWFkKGJkZXYtPmJkX2lub2RlKSAvIDUxMjsKKwlzZWN0b3JfdCBudW1fc2VjdG9ycyA9IGlfc2l6ZV9yZWFkKHJkZXYtPmJkZXYtPmJkX2lub2RlKSAvIDUxMjsKIAlyZXR1cm4gTURfTkVXX1NJWkVfU0VDVE9SUyhudW1fc2VjdG9ycyk7CiB9CiAKQEAgLTc2Myw3ICs3NjUsNyBAQAogCSAqLwogCXN0cnVjdCBiaW8gKmJpbyA9IGJpb19hbGxvY19tZGRldihHRlBfTk9JTywgMSwgbWRkZXYpOwogCi0JYmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKKwliaW8tPmJpX2JkZXYgPSByZGV2LT5tZXRhX2JkZXYgPyByZGV2LT5tZXRhX2JkZXYgOiByZGV2LT5iZGV2OwogCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOwogCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIHNpemUsIDApOwogCWJpby0+YmlfcHJpdmF0ZSA9IHJkZXY7CkBAIC03OTMsNyArNzk1LDcgQEAKIH0KIAogaW50IHN5bmNfcGFnZV9pbyhtZGtfcmRldl90ICpyZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAotCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBydykKKwkJIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcncsIGJvb2wgbWV0YWRhdGFfb3ApCiB7CiAJc3RydWN0IGJpbyAqYmlvID0gYmlvX2FsbG9jX21kZGV2KEdGUF9OT0lPLCAxLCByZGV2LT5tZGRldik7CiAJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CkBAIC04MDEsOCArODAzLDEyIEBACiAKIAlydyB8PSBSRVFfU1lOQyB8IFJFUV9VTlBMVUc7CiAKLQliaW8tPmJpX2JkZXYgPSByZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yOworCWJpby0+YmlfYmRldiA9IChtZXRhZGF0YV9vcCAmJiByZGV2LT5tZXRhX2JkZXYpID8KKwkJcmRldi0+bWV0YV9iZGV2IDogcmRldi0+YmRldjsKKwlpZiAobWV0YWRhdGFfb3ApCisJCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yICsgcmRldi0+c2Jfc3RhcnQ7CisJZWxzZQorCQliaW8tPmJpX3NlY3RvciA9IHNlY3RvciArIHJkZXYtPmRhdGFfb2Zmc2V0OwogCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIHNpemUsIDApOwogCWluaXRfY29tcGxldGlvbigmZXZlbnQpOwogCWJpby0+YmlfcHJpdmF0ZSA9ICZldmVudDsKQEAgLTgyNyw3ICs4MzMsNyBAQAogCQlyZXR1cm4gMDsKIAogCi0JaWYgKCFzeW5jX3BhZ2VfaW8ocmRldiwgcmRldi0+c2Jfc3RhcnQsIHNpemUsIHJkZXYtPnNiX3BhZ2UsIFJFQUQpKQorCWlmICghc3luY19wYWdlX2lvKHJkZXYsIDAsIHNpemUsIHJkZXYtPnNiX3BhZ2UsIFJFQUQsIHRydWUpKQogCQlnb3RvIGZhaWw7CiAJcmRldi0+c2JfbG9hZGVkID0gMTsKIAlyZXR1cm4gMDsKQEAgLTk4OSw3ICs5OTUsNyBAQAogCSAqCiAJICogSXQgYWxzbyBoYXBwZW5zIHRvIGJlIGEgbXVsdGlwbGUgb2YgNEtiLgogCSAqLwotCXJkZXYtPnNiX3N0YXJ0ID0gY2FsY19kZXZfc2JvZmZzZXQocmRldi0+YmRldik7CisJcmRldi0+c2Jfc3RhcnQgPSBjYWxjX2Rldl9zYm9mZnNldChyZGV2KTsKIAogCXJldCA9IHJlYWRfZGlza19zYihyZGV2LCBNRF9TQl9CWVRFUyk7CiAJaWYgKHJldCkgcmV0dXJuIHJldDsKQEAgLTEzMzAsNyArMTMzNiw3IEBACiAJCXJldHVybiAwOyAvKiBjb21wb25lbnQgbXVzdCBmaXQgZGV2aWNlICovCiAJaWYgKHJkZXYtPm1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpCiAJCXJldHVybiAwOyAvKiBjYW4ndCBtb3ZlIGJpdG1hcCAqLwotCXJkZXYtPnNiX3N0YXJ0ID0gY2FsY19kZXZfc2JvZmZzZXQocmRldi0+YmRldik7CisJcmRldi0+c2Jfc3RhcnQgPSBjYWxjX2Rldl9zYm9mZnNldChyZGV2KTsKIAlpZiAoIW51bV9zZWN0b3JzIHx8IG51bV9zZWN0b3JzID4gcmRldi0+c2Jfc3RhcnQpCiAJCW51bV9zZWN0b3JzID0gcmRldi0+c2Jfc3RhcnQ7CiAJbWRfc3VwZXJfd3JpdGUocmRldi0+bWRkZXYsIHJkZXYsIHJkZXYtPnNiX3N0YXJ0LCByZGV2LT5zYl9zaXplLApAQCAtMTg3OSw3ICsxODg1LDcgQEAKIAlyZGV2LT5zeXNmc19zdGF0ZSA9IHN5c2ZzX2dldF9kaXJlbnRfc2FmZShyZGV2LT5rb2JqLnNkLCAic3RhdGUiKTsKIAogCWxpc3RfYWRkX3JjdSgmcmRldi0+c2FtZV9zZXQsICZtZGRldi0+ZGlza3MpOwotCWJkX2NsYWltX2J5X2Rpc2socmRldi0+YmRldiwgcmRldi0+YmRldi0+YmRfaG9sZGVyLCBtZGRldi0+Z2VuZGlzayk7CisJYmRfbGlua19kaXNrX2hvbGRlcihyZGV2LT5iZGV2LCBtZGRldi0+Z2VuZGlzayk7CiAKIAkvKiBNYXkgYXMgd2VsbCBhbGxvdyByZWNvdmVyeSB0byBiZSByZXRyaWVkIG9uY2UgKi8KIAltZGRldi0+cmVjb3ZlcnlfZGlzYWJsZWQgPSAwOwpAQCAtMTkwNiw3ICsxOTEyLDYgQEAKIAkJTURfQlVHKCk7CiAJCXJldHVybjsKIAl9Ci0JYmRfcmVsZWFzZV9mcm9tX2Rpc2socmRldi0+YmRldiwgcmRldi0+bWRkZXYtPmdlbmRpc2spOwogCWxpc3RfZGVsX3JjdSgmcmRldi0+c2FtZV9zZXQpOwogCXByaW50ayhLRVJOX0lORk8gIm1kOiB1bmJpbmQ8JXM+XG4iLCBiZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKIAlyZGV2LT5tZGRldiA9IE5VTEw7CkBAIC0xOTM0LDE5ICsxOTM5LDEzIEBACiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLQliZGV2ID0gb3Blbl9ieV9kZXZudW0oZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wsCisJCQkJIHNoYXJlZCA/IChtZGtfcmRldl90ICopbG9ja19yZGV2IDogcmRldik7CiAJaWYgKElTX0VSUihiZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1kOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIsCiAJCQlfX2JkZXZuYW1lKGRldiwgYikpOwogCQlyZXR1cm4gUFRSX0VSUihiZGV2KTsKIAl9Ci0JZXJyID0gYmRfY2xhaW0oYmRldiwgc2hhcmVkID8gKG1ka19yZGV2X3QgKilsb2NrX3JkZXYgOiByZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWQ6IGNvdWxkIG5vdCBiZF9jbGFpbSAlcy5cbiIsCi0JCQliZGV2bmFtZShiZGV2LCBiKSk7Ci0JCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0JCXJldHVybiBlcnI7Ci0JfQogCWlmICghc2hhcmVkKQogCQlzZXRfYml0KEFsbFJlc2VydmVkLCAmcmRldi0+ZmxhZ3MpOwogCXJkZXYtPmJkZXYgPSBiZGV2OwpAQCAtMTk1OSw4ICsxOTU4LDcgQEAKIAlyZGV2LT5iZGV2ID0gTlVMTDsKIAlpZiAoIWJkZXYpCiAJCU1EX0JVRygpOwotCWJkX3JlbGVhc2UoYmRldik7Ci0JYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCk7CiB9CiAKIHZvaWQgbWRfYXV0b2RldGVjdF9kZXYoZGV2X3QgZGV2KTsKQEAgLTI0NzMsNiArMjQ3MSwxMCBAQAogCQkJaWYgKHJkZXYyLT5yYWlkX2Rpc2sgPT0gc2xvdCkKIAkJCQlyZXR1cm4gLUVFWElTVDsKIAorCQlpZiAoc2xvdCA+PSByZGV2LT5tZGRldi0+cmFpZF9kaXNrcyAmJgorCQkgICAgc2xvdCA+PSByZGV2LT5tZGRldi0+cmFpZF9kaXNrcyArIHJkZXYtPm1kZGV2LT5kZWx0YV9kaXNrcykKKwkJCXJldHVybiAtRU5PU1BDOworCiAJCXJkZXYtPnJhaWRfZGlzayA9IHNsb3Q7CiAJCWlmICh0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpKQogCQkJcmRldi0+c2F2ZWRfcmFpZF9kaXNrID0gc2xvdDsKQEAgLTI0OTAsNyArMjQ5Miw4IEBACiAJCQkvKiBmYWlsdXJlIGhlcmUgaXMgT0sgKi87CiAJCS8qIGRvbid0IHdha2V1cCBhbnlvbmUsIGxlYXZlIHRoYXQgdG8gdXNlcnNwYWNlLiAqLwogCX0gZWxzZSB7Ci0JCWlmIChzbG90ID49IHJkZXYtPm1kZGV2LT5yYWlkX2Rpc2tzKQorCQlpZiAoc2xvdCA+PSByZGV2LT5tZGRldi0+cmFpZF9kaXNrcyAmJgorCQkgICAgc2xvdCA+PSByZGV2LT5tZGRldi0+cmFpZF9kaXNrcyArIHJkZXYtPm1kZGV2LT5kZWx0YV9kaXNrcykKIAkJCXJldHVybiAtRU5PU1BDOwogCQlyZGV2LT5yYWlkX2Rpc2sgPSBzbG90OwogCQkvKiBhc3N1bWUgaXQgaXMgd29ya2luZyAqLwpAQCAtMzExNSw3ICszMTE4LDcgQEAKIAkJY2hhciBubVsyMF07CiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwKQogCQkJY29udGludWU7Ci0JCWlmIChyZGV2LT5uZXdfcmFpZF9kaXNrID4gbWRkZXYtPnJhaWRfZGlza3MpCisJCWlmIChyZGV2LT5uZXdfcmFpZF9kaXNrID49IG1kZGV2LT5yYWlkX2Rpc2tzKQogCQkJcmRldi0+bmV3X3JhaWRfZGlzayA9IC0xOwogCQlpZiAocmRldi0+bmV3X3JhaWRfZGlzayA9PSByZGV2LT5yYWlkX2Rpc2spCiAJCQljb250aW51ZTsKQEAgLTM3NDQsNiArMzc0Nyw4IEBACiAJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCB0eXBlKTsKIH0KIAorc3RhdGljIHZvaWQgcmVhcF9zeW5jX3RocmVhZChtZGRldl90ICptZGRldik7CisKIHN0YXRpYyBzc2l6ZV90CiBhY3Rpb25fc3RvcmUobWRkZXZfdCAqbWRkZXYsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCiB7CkBAIC0zNzU4LDkgKzM3NjMsNyBAQAogCWlmIChjbWRfbWF0Y2gocGFnZSwgImlkbGUiKSB8fCBjbWRfbWF0Y2gocGFnZSwgImZyb3plbiIpKSB7CiAJCWlmIChtZGRldi0+c3luY190aHJlYWQpIHsKIAkJCXNldF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSk7Ci0JCQltZF91bnJlZ2lzdGVyX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOwotCQkJbWRkZXYtPnN5bmNfdGhyZWFkID0gTlVMTDsKLQkJCW1kZGV2LT5yZWNvdmVyeSA9IDA7CisJCQlyZWFwX3N5bmNfdGhyZWFkKG1kZGV2KTsKIAkJfQogCX0gZWxzZSBpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSkgfHwKIAkJICAgdGVzdF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KSkKQEAgLTM5MTIsNyArMzkxNSw3IEBACiBzdGF0aWMgc3NpemVfdAogc3luY19jb21wbGV0ZWRfc2hvdyhtZGRldl90ICptZGRldiwgY2hhciAqcGFnZSkKIHsKLQl1bnNpZ25lZCBsb25nIG1heF9zZWN0b3JzLCByZXN5bmM7CisJdW5zaWduZWQgbG9uZyBsb25nIG1heF9zZWN0b3JzLCByZXN5bmM7CiAKIAlpZiAoIXRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpKQogCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAibm9uZVxuIik7CkBAIC0zOTIzLDcgKzM5MjYsNyBAQAogCQltYXhfc2VjdG9ycyA9IG1kZGV2LT5kZXZfc2VjdG9yczsKIAogCXJlc3luYyA9IG1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQ7Ci0JcmV0dXJuIHNwcmludGYocGFnZSwgIiVsdSAvICVsdVxuIiwgcmVzeW5jLCBtYXhfc2VjdG9ycyk7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVsbHUgLyAlbGx1XG4iLCByZXN5bmMsIG1heF9zZWN0b3JzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBtZF9zeW5jX2NvbXBsZXRlZCA9IF9fQVRUUl9STyhzeW5jX2NvbXBsZXRlZCk7CkBAIC00MDEwLDE5ICs0MDEzLDI0IEBACiB7CiAJY2hhciAqZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbmV3ID0gc2ltcGxlX3N0cnRvdWxsKGJ1ZiwgJmUsIDEwKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2xkID0gbWRkZXYtPnN1c3BlbmRfbG87CiAKIAlpZiAobWRkZXYtPnBlcnMgPT0gTlVMTCB8fCAKIAkgICAgbWRkZXYtPnBlcnMtPnF1aWVzY2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGJ1ZiA9PSBlIHx8ICgqZSAmJiAqZSAhPSAnXG4nKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKG5ldyA+PSBtZGRldi0+c3VzcGVuZF9oaSB8fAotCSAgICAobmV3ID4gbWRkZXYtPnN1c3BlbmRfbG8gJiYgbmV3IDwgbWRkZXYtPnN1c3BlbmRfaGkpKSB7Ci0JCW1kZGV2LT5zdXNwZW5kX2xvID0gbmV3OworCisJbWRkZXYtPnN1c3BlbmRfbG8gPSBuZXc7CisJaWYgKG5ldyA+PSBvbGQpCisJCS8qIFNocmlua2luZyBzdXNwZW5kZWQgcmVnaW9uICovCiAJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAyKTsKLQkJcmV0dXJuIGxlbjsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSB7CisJCS8qIEV4cGFuZGluZyBzdXNwZW5kZWQgcmVnaW9uIC0gbmVlZCB0byB3YWl0ICovCisJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKKwkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOworCX0KKwlyZXR1cm4gbGVuOwogfQogc3RhdGljIHN0cnVjdCBtZF9zeXNmc19lbnRyeSBtZF9zdXNwZW5kX2xvID0KIF9fQVRUUihzdXNwZW5kX2xvLCBTX0lSVUdPfFNfSVdVU1IsIHN1c3BlbmRfbG9fc2hvdywgc3VzcGVuZF9sb19zdG9yZSk7CkBAIC00MDM5LDIwICs0MDQ3LDI0IEBACiB7CiAJY2hhciAqZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbmV3ID0gc2ltcGxlX3N0cnRvdWxsKGJ1ZiwgJmUsIDEwKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2xkID0gbWRkZXYtPnN1c3BlbmRfaGk7CiAKIAlpZiAobWRkZXYtPnBlcnMgPT0gTlVMTCB8fAogCSAgICBtZGRldi0+cGVycy0+cXVpZXNjZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoYnVmID09IGUgfHwgKCplICYmICplICE9ICdcbicpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKG5ldyA8PSBtZGRldi0+c3VzcGVuZF9sbyAmJiBtZGRldi0+c3VzcGVuZF9sbyA+PSBtZGRldi0+c3VzcGVuZF9oaSkgfHwKLQkgICAgKG5ldyA+IG1kZGV2LT5zdXNwZW5kX2xvICYmIG5ldyA+IG1kZGV2LT5zdXNwZW5kX2hpKSkgewotCQltZGRldi0+c3VzcGVuZF9oaSA9IG5ldzsKKworCW1kZGV2LT5zdXNwZW5kX2hpID0gbmV3OworCWlmIChuZXcgPD0gb2xkKQorCQkvKiBTaHJpbmtpbmcgc3VzcGVuZGVkIHJlZ2lvbiAqLworCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMik7CisJZWxzZSB7CisJCS8qIEV4cGFuZGluZyBzdXNwZW5kZWQgcmVnaW9uIC0gbmVlZCB0byB3YWl0ICovCiAJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKIAkJbWRkZXYtPnBlcnMtPnF1aWVzY2UobWRkZXYsIDApOwotCQlyZXR1cm4gbGVuOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIGxlbjsKIH0KIHN0YXRpYyBzdHJ1Y3QgbWRfc3lzZnNfZW50cnkgbWRfc3VzcGVuZF9oaSA9CiBfX0FUVFIoc3VzcGVuZF9oaSwgU19JUlVHT3xTX0lXVVNSLCBzdXNwZW5kX2hpX3Nob3csIHN1c3BlbmRfaGlfc3RvcmUpOwpAQCAtNDQzMCw3ICs0NDQyLDkgQEAKIAkJICogV2UgZG9uJ3Qgd2FudCB0aGUgZGF0YSB0byBvdmVybGFwIHRoZSBtZXRhZGF0YSwKIAkJICogSW50ZXJuYWwgQml0bWFwIGlzc3VlcyBoYXZlIGJlZW4gaGFuZGxlZCBlbHNld2hlcmUuCiAJCSAqLwotCQlpZiAocmRldi0+ZGF0YV9vZmZzZXQgPCByZGV2LT5zYl9zdGFydCkgeworCQlpZiAocmRldi0+bWV0YV9iZGV2KSB7CisJCQkvKiBOb3RoaW5nIHRvIGNoZWNrICovOworCQl9IGVsc2UgaWYgKHJkZXYtPmRhdGFfb2Zmc2V0IDwgcmRldi0+c2Jfc3RhcnQpIHsKIAkJCWlmIChtZGRldi0+ZGV2X3NlY3RvcnMgJiYKIAkJCSAgICByZGV2LT5kYXRhX29mZnNldCArIG1kZGV2LT5kZXZfc2VjdG9ycwogCQkJICAgID4gcmRldi0+c2Jfc3RhcnQpIHsKQEAgLTQ1NjQsNyArNDU3OCw4IEBACiAJbWRkZXYtPnNhZmVtb2RlX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWRkZXY7CiAJbWRkZXYtPnNhZmVtb2RlX2RlbGF5ID0gKDIwMCAqIEhaKS8xMDAwICsxOyAvKiAyMDAgbXNlYyBkZWxheSAqLwogCW1kZGV2LT5pbl9zeW5jID0gMTsKLQorCXNtcF93bWIoKTsKKwltZGRldi0+cmVhZHkgPSAxOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCkgewogCQkJY2hhciBubVsyMF07CkBAIC00NzAxLDEzICs0NzE2LDEyIEBACiAJbWRkZXYtPnBsdWcgPSBOVUxMOwogfQogCi12b2lkIG1kX3N0b3Bfd3JpdGVzKG1kZGV2X3QgKm1kZGV2KQorc3RhdGljIHZvaWQgX19tZF9zdG9wX3dyaXRlcyhtZGRldl90ICptZGRldikKIHsKIAlpZiAobWRkZXYtPnN5bmNfdGhyZWFkKSB7CiAJCXNldF9iaXQoTURfUkVDT1ZFUllfRlJPWkVOLCAmbWRkZXYtPnJlY292ZXJ5KTsKIAkJc2V0X2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KTsKLQkJbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsKLQkJbWRkZXYtPnN5bmNfdGhyZWFkID0gTlVMTDsKKwkJcmVhcF9zeW5jX3RocmVhZChtZGRldik7CiAJfQogCiAJZGVsX3RpbWVyX3N5bmMoJm1kZGV2LT5zYWZlbW9kZV90aW1lcik7CkBAIC00NzIxLDEwICs0NzM1LDE4IEBACiAJCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7CiAJfQogfQorCit2b2lkIG1kX3N0b3Bfd3JpdGVzKG1kZGV2X3QgKm1kZGV2KQoreworCW1kZGV2X2xvY2sobWRkZXYpOworCV9fbWRfc3RvcF93cml0ZXMobWRkZXYpOworCW1kZGV2X3VubG9jayhtZGRldik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChtZF9zdG9wX3dyaXRlcyk7CiAKIHZvaWQgbWRfc3RvcChtZGRldl90ICptZGRldikKIHsKKwltZGRldi0+cmVhZHkgPSAwOwogCW1kZGV2LT5wZXJzLT5zdG9wKG1kZGV2KTsKIAlpZiAobWRkZXYtPnBlcnMtPnN5bmNfcmVxdWVzdCAmJiBtZGRldi0+dG9fcmVtb3ZlID09IE5VTEwpCiAJCW1kZGV2LT50b19yZW1vdmUgPSAmbWRfcmVkdW5kYW5jeV9ncm91cDsKQEAgLTQ3NDQsNyArNDc2Niw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAlpZiAobWRkZXYtPnBlcnMpIHsKLQkJbWRfc3RvcF93cml0ZXMobWRkZXYpOworCQlfX21kX3N0b3Bfd3JpdGVzKG1kZGV2KTsKIAogCQllcnIgID0gLUVOWElPOwogCQlpZiAobWRkZXYtPnJvPT0xKQpAQCAtNDc4MSw3ICs0ODAzLDcgQEAKIAkJaWYgKG1kZGV2LT5ybykKIAkJCXNldF9kaXNrX3JvKGRpc2ssIDApOwogCi0JCW1kX3N0b3Bfd3JpdGVzKG1kZGV2KTsKKwkJX19tZF9zdG9wX3dyaXRlcyhtZGRldik7CiAJCW1kX3N0b3AobWRkZXYpOwogCQltZGRldi0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gPSBOVUxMOwogCQltZGRldi0+cXVldWUtPnVucGx1Z19mbiA9IE5VTEw7CkBAIC01MTU5LDkgKzUxODEsMTAgQEAKIAkJLyogc2V0IHNhdmVkX3JhaWRfZGlzayBpZiBhcHByb3ByaWF0ZSAqLwogCQlpZiAoIW1kZGV2LT5wZXJzaXN0ZW50KSB7CiAJCQlpZiAoaW5mby0+c3RhdGUgJiAoMTw8TURfRElTS19TWU5DKSAgJiYKLQkJCSAgICBpbmZvLT5yYWlkX2Rpc2sgPCBtZGRldi0+cmFpZF9kaXNrcykKKwkJCSAgICBpbmZvLT5yYWlkX2Rpc2sgPCBtZGRldi0+cmFpZF9kaXNrcykgewogCQkJCXJkZXYtPnJhaWRfZGlzayA9IGluZm8tPnJhaWRfZGlzazsKLQkJCWVsc2UKKwkJCQlzZXRfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CisJCQl9IGVsc2UKIAkJCQlyZGV2LT5yYWlkX2Rpc2sgPSAtMTsKIAkJfSBlbHNlCiAJCQlzdXBlcl90eXBlc1ttZGRldi0+bWFqb3JfdmVyc2lvbl0uCkBAIC01MjM4LDcgKzUyNjEsNyBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IG5vbnBlcnNpc3RlbnQgc3VwZXJibG9jayAuLi5cbiIpOwogCQkJcmRldi0+c2Jfc3RhcnQgPSBpX3NpemVfcmVhZChyZGV2LT5iZGV2LT5iZF9pbm9kZSkgLyA1MTI7CiAJCX0gZWxzZQotCQkJcmRldi0+c2Jfc3RhcnQgPSBjYWxjX2Rldl9zYm9mZnNldChyZGV2LT5iZGV2KTsKKwkJCXJkZXYtPnNiX3N0YXJ0ID0gY2FsY19kZXZfc2JvZmZzZXQocmRldik7CiAJCXJkZXYtPnNlY3RvcnMgPSByZGV2LT5zYl9zdGFydDsKIAogCQllcnIgPSBiaW5kX3JkZXZfdG9fYXJyYXkocmRldiwgbWRkZXYpOwpAQCAtNTMwNSw3ICs1MzI4LDcgQEAKIAl9CiAKIAlpZiAobWRkZXYtPnBlcnNpc3RlbnQpCi0JCXJkZXYtPnNiX3N0YXJ0ID0gY2FsY19kZXZfc2JvZmZzZXQocmRldi0+YmRldik7CisJCXJkZXYtPnNiX3N0YXJ0ID0gY2FsY19kZXZfc2JvZmZzZXQocmRldik7CiAJZWxzZQogCQlyZGV2LT5zYl9zdGFydCA9IGlfc2l6ZV9yZWFkKHJkZXYtPmJkZXYtPmJkX2lub2RlKSAvIDUxMjsKIApAQCAtNTUxOCw3ICs1NTQxLDYgQEAKIAkgKiBzYl9zdGFydCBvciwgaWYgdGhhdCBpcyA8ZGF0YV9vZmZzZXQsIGl0IG11c3QgZml0IGJlZm9yZSB0aGUgc2l6ZQogCSAqIG9mIGVhY2ggZGV2aWNlLiAgSWYgbnVtX3NlY3RvcnMgaXMgemVybywgd2UgZmluZCB0aGUgbGFyZ2VzdCBzaXplCiAJICogdGhhdCBmaXRzLgotCiAJICovCiAJaWYgKG1kZGV2LT5zeW5jX3RocmVhZCkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTYwNDEsNyArNjA2Myw4IEBACiAJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpLAogCQkJIHRocmVhZC0+dGltZW91dCk7CiAKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUSFJFQURfV0FLRVVQLCAmdGhyZWFkLT5mbGFncykpCisJCWNsZWFyX2JpdChUSFJFQURfV0FLRVVQLCAmdGhyZWFkLT5mbGFncyk7CisJCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJdGhyZWFkLT5ydW4odGhyZWFkLT5tZGRldik7CiAJfQogCkBAIC02ODA3LDcgKzY4MzAsNyBAQAogCQkgICAgICAgZGVzYywgbWRuYW1lKG1kZGV2KSk7CiAJCW1kZGV2LT5jdXJyX3Jlc3luYyA9IGo7CiAJfQotCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBtZGRldi0+Y3Vycl9yZXN5bmM7CisJbWRkZXYtPmN1cnJfcmVzeW5jX2NvbXBsZXRlZCA9IGo7CiAKIAl3aGlsZSAoaiA8IG1heF9zZWN0b3JzKSB7CiAJCXNlY3Rvcl90IHNlY3RvcnM7CkBAIC02ODI1LDggKzY4NDgsNyBAQAogCQkJbWRfdW5wbHVnKG1kZGV2KTsKIAkJCXdhaXRfZXZlbnQobWRkZXYtPnJlY292ZXJ5X3dhaXQsCiAJCQkJICAgYXRvbWljX3JlYWQoJm1kZGV2LT5yZWNvdmVyeV9hY3RpdmUpID09IDApOwotCQkJbWRkZXYtPmN1cnJfcmVzeW5jX2NvbXBsZXRlZCA9Ci0JCQkJbWRkZXYtPmN1cnJfcmVzeW5jOworCQkJbWRkZXYtPmN1cnJfcmVzeW5jX2NvbXBsZXRlZCA9IGo7CiAJCQlzZXRfYml0KE1EX0NIQU5HRV9DTEVBTiwgJm1kZGV2LT5mbGFncyk7CiAJCQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19jb21wbGV0ZWQiKTsKIAkJfQpAQCAtNzAzMSw2ICs3MDUzLDQ1IEBACiAJfQogCXJldHVybiBzcGFyZXM7CiB9CisKK3N0YXRpYyB2b2lkIHJlYXBfc3luY190aHJlYWQobWRkZXZfdCAqbWRkZXYpCit7CisJbWRrX3JkZXZfdCAqcmRldjsKKworCS8qIHJlc3luYyBoYXMgZmluaXNoZWQsIGNvbGxlY3QgcmVzdWx0ICovCisJbWRfdW5yZWdpc3Rlcl90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsKKwltZGRldi0+c3luY190aHJlYWQgPSBOVUxMOworCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkgJiYKKwkgICAgIXRlc3RfYml0KE1EX1JFQ09WRVJZX1JFUVVFU1RFRCwgJm1kZGV2LT5yZWNvdmVyeSkpIHsKKwkJLyogc3VjY2Vzcy4uLiovCisJCS8qIGFjdGl2YXRlIGFueSBzcGFyZXMgKi8KKwkJaWYgKG1kZGV2LT5wZXJzLT5zcGFyZV9hY3RpdmUobWRkZXYpKQorCQkJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwKKwkJCQkgICAgICJkZWdyYWRlZCIpOworCX0KKwlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfUkVTSEFQRSwgJm1kZGV2LT5yZWNvdmVyeSkgJiYKKwkgICAgbWRkZXYtPnBlcnMtPmZpbmlzaF9yZXNoYXBlKQorCQltZGRldi0+cGVycy0+ZmluaXNoX3Jlc2hhcGUobWRkZXYpOworCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7CisKKwkvKiBpZiBhcnJheSBpcyBuby1sb25nZXIgZGVncmFkZWQsIHRoZW4gYW55IHNhdmVkX3JhaWRfZGlzaworCSAqIGluZm9ybWF0aW9uIG11c3QgYmUgc2NyYXBwZWQKKwkgKi8KKwlpZiAoIW1kZGV2LT5kZWdyYWRlZCkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKKwkJCXJkZXYtPnNhdmVkX3JhaWRfZGlzayA9IC0xOworCisJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpOworCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9TWU5DLCAmbWRkZXYtPnJlY292ZXJ5KTsKKwljbGVhcl9iaXQoTURfUkVDT1ZFUllfUkVTSEFQRSwgJm1kZGV2LT5yZWNvdmVyeSk7CisJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1JFUVVFU1RFRCwgJm1kZGV2LT5yZWNvdmVyeSk7CisJY2xlYXJfYml0KE1EX1JFQ09WRVJZX0NIRUNLLCAmbWRkZXYtPnJlY292ZXJ5KTsKKwkvKiBmbGFnIHJlY292ZXJ5IG5lZWRlZCBqdXN0IHRvIGRvdWJsZSBjaGVjayAqLworCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKKwlzeXNmc19ub3RpZnlfZGlyZW50X3NhZmUobWRkZXYtPnN5c2ZzX2FjdGlvbik7CisJbWRfbmV3X2V2ZW50KG1kZGV2KTsKK30KKwogLyoKICAqIFRoaXMgcm91dGluZSBpcyByZWd1bGFybHkgY2FsbGVkIGJ5IGFsbCBwZXItcmFpZC1hcnJheSB0aHJlYWRzIHRvCiAgKiBkZWFsIHdpdGggZ2VuZXJpYyBpc3N1ZXMgbGlrZSByZXN5bmMgYW5kIHN1cGVyLWJsb2NrIHVwZGF0ZS4KQEAgLTcwNTUsOSArNzExNiw2IEBACiAgKi8KIHZvaWQgbWRfY2hlY2tfcmVjb3ZlcnkobWRkZXZfdCAqbWRkZXYpCiB7Ci0JbWRrX3JkZXZfdCAqcmRldjsKLQotCiAJaWYgKG1kZGV2LT5iaXRtYXApCiAJCWJpdG1hcF9kYWVtb25fd29yayhtZGRldik7CiAKQEAgLTcxMjUsMzQgKzcxODMsNyBAQAogCQkJZ290byB1bmxvY2s7CiAJCX0KIAkJaWYgKG1kZGV2LT5zeW5jX3RocmVhZCkgewotCQkJLyogcmVzeW5jIGhhcyBmaW5pc2hlZCwgY29sbGVjdCByZXN1bHQgKi8KLQkJCW1kX3VucmVnaXN0ZXJfdGhyZWFkKG1kZGV2LT5zeW5jX3RocmVhZCk7Ci0JCQltZGRldi0+c3luY190aHJlYWQgPSBOVUxMOwotCQkJaWYgKCF0ZXN0X2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KSAmJgotCQkJICAgICF0ZXN0X2JpdChNRF9SRUNPVkVSWV9SRVFVRVNURUQsICZtZGRldi0+cmVjb3ZlcnkpKSB7Ci0JCQkJLyogc3VjY2Vzcy4uLiovCi0JCQkJLyogYWN0aXZhdGUgYW55IHNwYXJlcyAqLwotCQkJCWlmIChtZGRldi0+cGVycy0+c3BhcmVfYWN0aXZlKG1kZGV2KSkKLQkJCQkJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwKLQkJCQkJCSAgICAgImRlZ3JhZGVkIik7Ci0JCQl9Ci0JCQlpZiAodGVzdF9iaXQoTURfUkVDT1ZFUllfUkVTSEFQRSwgJm1kZGV2LT5yZWNvdmVyeSkgJiYKLQkJCSAgICBtZGRldi0+cGVycy0+ZmluaXNoX3Jlc2hhcGUpCi0JCQkJbWRkZXYtPnBlcnMtPmZpbmlzaF9yZXNoYXBlKG1kZGV2KTsKLQkJCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7Ci0KLQkJCS8qIGlmIGFycmF5IGlzIG5vLWxvbmdlciBkZWdyYWRlZCwgdGhlbiBhbnkgc2F2ZWRfcmFpZF9kaXNrCi0JCQkgKiBpbmZvcm1hdGlvbiBtdXN0IGJlIHNjcmFwcGVkCi0JCQkgKi8KLQkJCWlmICghbWRkZXYtPmRlZ3JhZGVkKQotCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCi0JCQkJCXJkZXYtPnNhdmVkX3JhaWRfZGlzayA9IC0xOwotCi0JCQltZGRldi0+cmVjb3ZlcnkgPSAwOwotCQkJLyogZmxhZyByZWNvdmVyeSBuZWVkZWQganVzdCB0byBkb3VibGUgY2hlY2sgKi8KLQkJCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKLQkJCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfYWN0aW9uKTsKLQkJCW1kX25ld19ldmVudChtZGRldik7CisJCQlyZWFwX3N5bmNfdGhyZWFkKG1kZGV2KTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJCS8qIFNldCBSVU5OSU5HIGJlZm9yZSBjbGVhcmluZyBORUVERUQgdG8gYXZvaWQKQEAgLTcyMTAsNyArNzI0MSwxMSBAQAogCQkJCQkiIHRocmVhZC4uLlxuIiwgCiAJCQkJCW1kbmFtZShtZGRldikpOwogCQkJCS8qIGxlYXZlIHRoZSBzcGFyZXMgd2hlcmUgdGhleSBhcmUsIGl0IHNob3VsZG4ndCBodXJ0ICovCi0JCQkJbWRkZXYtPnJlY292ZXJ5ID0gMDsKKwkJCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSk7CisJCQkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpOworCQkJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9SRVNIQVBFLCAmbWRkZXYtPnJlY292ZXJ5KTsKKwkJCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfUkVRVUVTVEVELCAmbWRkZXYtPnJlY292ZXJ5KTsKKwkJCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfQ0hFQ0ssICZtZGRldi0+cmVjb3ZlcnkpOwogCQkJfSBlbHNlCiAJCQkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+c3luY190aHJlYWQpOwogCQkJc3lzZnNfbm90aWZ5X2RpcmVudF9zYWZlKG1kZGV2LT5zeXNmc19hY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5oIGIvZHJpdmVycy9tZC9tZC5oCmluZGV4IGQwNWJhYjUuLmVlYzUxN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuaAorKysgYi9kcml2ZXJzL21kL21kLmgKQEAgLTYwLDYgKzYwLDEyIEBACiAJbWRkZXZfdCAqbWRkZXY7CQkJLyogUkFJRCBhcnJheSBpZiBydW5uaW5nICovCiAJaW50IGxhc3RfZXZlbnRzOwkJLyogSU8gZXZlbnQgdGltZXN0YW1wICovCiAKKwkvKgorCSAqIElmIG1ldGFfYmRldiBpcyBub24tTlVMTCwgaXQgbWVhbnMgdGhhdCBhIHNlcGFyYXRlIGRldmljZSBpcworCSAqIGJlaW5nIHVzZWQgdG8gc3RvcmUgdGhlIG1ldGFkYXRhIChzdXBlcmJsb2NrL2JpdG1hcCkgd2hpY2gKKwkgKiB3b3VsZCBvdGhlcndpc2UgYmUgY29udGFpbmVkIG9uIHRoZSBzYW1lIGRldmljZSBhcyB0aGUgZGF0YSAoYmRldikuCisJICovCisJc3RydWN0IGJsb2NrX2RldmljZSAqbWV0YV9iZGV2OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CS8qIGJsb2NrIGRldmljZSBoYW5kbGUgKi8KIAogCXN0cnVjdCBwYWdlCSpzYl9wYWdlOwpAQCAtMTQ4LDcgKzE1NCw4IEBACiAJCQkJCQkgICAgICAgKiBhcmUgaGFwcGVuaW5nLCBzbyBydW4vCiAJCQkJCQkgICAgICAgKiB0YWtlb3Zlci9zdG9wIGFyZSBub3Qgc2FmZQogCQkJCQkJICAgICAgICovCi0KKwlpbnQJCQkJcmVhZHk7IC8qIFNlZSB3aGVuIHNhZmUgdG8gcGFzcyAKKwkJCQkJCSogSU8gcmVxdWVzdHMgZG93biAqLwogCXN0cnVjdCBnZW5kaXNrCQkJKmdlbmRpc2s7CiAKIAlzdHJ1Y3Qga29iamVjdAkJCWtvYmo7CkBAIC00OTcsOCArNTA0LDggQEAKIGV4dGVybiB2b2lkIG1kX3N1cGVyX3dyaXRlKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2LAogCQkJICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgc2l6ZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWRfc3VwZXJfd2FpdChtZGRldl90ICptZGRldik7Ci1leHRlcm4gaW50IHN5bmNfcGFnZV9pbyhtZGtfcmRldl90ICpyZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLAotCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBydyk7CitleHRlcm4gaW50IHN5bmNfcGFnZV9pbyhtZGtfcmRldl90ICpyZGV2LCBzZWN0b3JfdCBzZWN0b3IsIGludCBzaXplLCAKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcncsIGJvb2wgbWV0YWRhdGFfb3ApOwogZXh0ZXJuIHZvaWQgbWRfZG9fc3luYyhtZGRldl90ICptZGRldik7CiBleHRlcm4gdm9pZCBtZF9uZXdfZXZlbnQobWRkZXZfdCAqbWRkZXYpOwogZXh0ZXJuIGludCBtZF9hbGxvd193cml0ZShtZGRldl90ICptZGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggODQ1Y2Y5NS4uYTIzZmZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTAyNyw4ICsxMDI3LDkgQEAKIAl9IGVsc2UKIAkJc2V0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7CiAJc2V0X2JpdChNRF9DSEFOR0VfREVWUywgJm1kZGV2LT5mbGFncyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgIm1kL3JhaWQxOiVzOiBEaXNrIGZhaWx1cmUgb24gJXMsIGRpc2FibGluZyBkZXZpY2UuXG4iCi0JICAgICAgIEtFUk5fQUxFUlQgIm1kL3JhaWQxOiVzOiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzLlxuIiwKKwlwcmludGsoS0VSTl9BTEVSVAorCSAgICAgICAibWQvcmFpZDE6JXM6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRldmljZS5cbiIKKwkgICAgICAgIm1kL3JhaWQxOiVzOiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzLlxuIiwKIAkgICAgICAgbWRuYW1lKG1kZGV2KSwgYmRldm5hbWUocmRldi0+YmRldiwgYiksCiAJICAgICAgIG1kbmFtZShtZGRldiksIGNvbmYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQpOwogfQpAQCAtMTM2NCwxMCArMTM2NSwxMCBAQAogCQkJCQkgKi8KIAkJCQkJcmRldiA9IGNvbmYtPm1pcnJvcnNbZF0ucmRldjsKIAkJCQkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LAotCQkJCQkJCSBzZWN0ICsgcmRldi0+ZGF0YV9vZmZzZXQsCisJCQkJCQkJIHNlY3QsCiAJCQkJCQkJIHM8PDksCiAJCQkJCQkJIGJpby0+YmlfaW9fdmVjW2lkeF0uYnZfcGFnZSwKLQkJCQkJCQkgUkVBRCkpIHsKKwkJCQkJCQkgUkVBRCwgZmFsc2UpKSB7CiAJCQkJCQlzdWNjZXNzID0gMTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0xMzkwLDEwICsxMzkxLDEwIEBACiAJCQkJCXJkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXY7CiAJCQkJCWF0b21pY19hZGQocywgJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMpOwogCQkJCQlpZiAoc3luY19wYWdlX2lvKHJkZXYsCi0JCQkJCQkJIHNlY3QgKyByZGV2LT5kYXRhX29mZnNldCwKKwkJCQkJCQkgc2VjdCwKIAkJCQkJCQkgczw8OSwKIAkJCQkJCQkgYmlvLT5iaV9pb192ZWNbaWR4XS5idl9wYWdlLAotCQkJCQkJCSBXUklURSkgPT0gMCkKKwkJCQkJCQkgV1JJVEUsIGZhbHNlKSA9PSAwKQogCQkJCQkJbWRfZXJyb3IobWRkZXYsIHJkZXYpOwogCQkJCX0KIAkJCQlkID0gc3RhcnQ7CkBAIC0xNDA1LDEwICsxNDA2LDEwIEBACiAJCQkJCQljb250aW51ZTsKIAkJCQkJcmRldiA9IGNvbmYtPm1pcnJvcnNbZF0ucmRldjsKIAkJCQkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LAotCQkJCQkJCSBzZWN0ICsgcmRldi0+ZGF0YV9vZmZzZXQsCisJCQkJCQkJIHNlY3QsCiAJCQkJCQkJIHM8PDksCiAJCQkJCQkJIGJpby0+YmlfaW9fdmVjW2lkeF0uYnZfcGFnZSwKLQkJCQkJCQkgUkVBRCkgPT0gMCkKKwkJCQkJCQkgUkVBRCwgZmFsc2UpID09IDApCiAJCQkJCQltZF9lcnJvcihtZGRldiwgcmRldik7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTE0ODgsMTAgKzE0ODksOCBAQAogCQkJcmRldiA9IGNvbmYtPm1pcnJvcnNbZF0ucmRldjsKIAkJCWlmIChyZGV2ICYmCiAJCQkgICAgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgotCQkJICAgIHN5bmNfcGFnZV9pbyhyZGV2LAotCQkJCQkgc2VjdCArIHJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCQkgczw8OSwKLQkJCQkJIGNvbmYtPnRtcHBhZ2UsIFJFQUQpKQorCQkJICAgIHN5bmNfcGFnZV9pbyhyZGV2LCBzZWN0LCBzPDw5LAorCQkJCQkgY29uZi0+dG1wcGFnZSwgUkVBRCwgZmFsc2UpKQogCQkJCXN1Y2Nlc3MgPSAxOwogCQkJZWxzZSB7CiAJCQkJZCsrOwpAQCAtMTUxNCw5ICsxNTEzLDggQEAKIAkJCXJkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXY7CiAJCQlpZiAocmRldiAmJgogCQkJICAgIHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKLQkJCQlpZiAoc3luY19wYWdlX2lvKHJkZXYsCi0JCQkJCQkgc2VjdCArIHJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCQkJIHM8PDksIGNvbmYtPnRtcHBhZ2UsIFdSSVRFKQorCQkJCWlmIChzeW5jX3BhZ2VfaW8ocmRldiwgc2VjdCwgczw8OSwKKwkJCQkJCSBjb25mLT50bXBwYWdlLCBXUklURSwgZmFsc2UpCiAJCQkJICAgID09IDApCiAJCQkJCS8qIFdlbGwsIHRoaXMgZGV2aWNlIGlzIGRlYWQgKi8KIAkJCQkJbWRfZXJyb3IobWRkZXYsIHJkZXYpOwpAQCAtMTUzMSw5ICsxNTI5LDggQEAKIAkJCXJkZXYgPSBjb25mLT5taXJyb3JzW2RdLnJkZXY7CiAJCQlpZiAocmRldiAmJgogCQkJICAgIHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKLQkJCQlpZiAoc3luY19wYWdlX2lvKHJkZXYsCi0JCQkJCQkgc2VjdCArIHJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCQkJIHM8PDksIGNvbmYtPnRtcHBhZ2UsIFJFQUQpCisJCQkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LCBzZWN0LCBzPDw5LAorCQkJCQkJIGNvbmYtPnRtcHBhZ2UsIFJFQUQsIGZhbHNlKQogCQkJCSAgICA9PSAwKQogCQkJCQkvKiBXZWxsLCB0aGlzIGRldmljZSBpcyBkZWFkICovCiAJCQkJCW1kX2Vycm9yKG1kZGV2LCByZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDA2NDE2NzQuLjY5YjY1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTA1MSw4ICsxMDUxLDkgQEAKIAl9CiAJc2V0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7CiAJc2V0X2JpdChNRF9DSEFOR0VfREVWUywgJm1kZGV2LT5mbGFncyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgIm1kL3JhaWQxMDolczogRGlzayBmYWlsdXJlIG9uICVzLCBkaXNhYmxpbmcgZGV2aWNlLlxuIgotCSAgICAgICBLRVJOX0FMRVJUICJtZC9yYWlkMTA6JXM6IE9wZXJhdGlvbiBjb250aW51aW5nIG9uICVkIGRldmljZXMuXG4iLAorCXByaW50ayhLRVJOX0FMRVJUCisJICAgICAgICJtZC9yYWlkMTA6JXM6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRldmljZS5cbiIKKwkgICAgICAgIm1kL3JhaWQxMDolczogT3BlcmF0aW9uIGNvbnRpbnVpbmcgb24gJWQgZGV2aWNlcy5cbiIsCiAJICAgICAgIG1kbmFtZShtZGRldiksIGJkZXZuYW1lKHJkZXYtPmJkZXYsIGIpLAogCSAgICAgICBtZG5hbWUobWRkZXYpLCBjb25mLT5yYWlkX2Rpc2tzIC0gbWRkZXYtPmRlZ3JhZGVkKTsKIH0KQEAgLTE1NTksOSArMTU2MCw5IEBACiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJc3VjY2VzcyA9IHN5bmNfcGFnZV9pbyhyZGV2LAogCQkJCQkJICAgICAgIHIxMF9iaW8tPmRldnNbc2xdLmFkZHIgKwotCQkJCQkJICAgICAgIHNlY3QgKyByZGV2LT5kYXRhX29mZnNldCwKKwkJCQkJCSAgICAgICBzZWN0LAogCQkJCQkJICAgICAgIHM8PDksCi0JCQkJCQkgICAgICAgY29uZi0+dG1wcGFnZSwgUkVBRCk7CisJCQkJCQkgICAgICAgY29uZi0+dG1wcGFnZSwgUkVBRCwgZmFsc2UpOwogCQkJCXJkZXZfZGVjX3BlbmRpbmcocmRldiwgbWRkZXYpOwogCQkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCQlpZiAoc3VjY2VzcykKQEAgLTE1OTgsOCArMTU5OSw4IEBACiAJCQkJYXRvbWljX2FkZChzLCAmcmRldi0+Y29ycmVjdGVkX2Vycm9ycyk7CiAJCQkJaWYgKHN5bmNfcGFnZV9pbyhyZGV2LAogCQkJCQkJIHIxMF9iaW8tPmRldnNbc2xdLmFkZHIgKwotCQkJCQkJIHNlY3QgKyByZGV2LT5kYXRhX29mZnNldCwKLQkJCQkJCSBzPDw5LCBjb25mLT50bXBwYWdlLCBXUklURSkKKwkJCQkJCSBzZWN0LAorCQkJCQkJIHM8PDksIGNvbmYtPnRtcHBhZ2UsIFdSSVRFLCBmYWxzZSkKIAkJCQkgICAgPT0gMCkgewogCQkJCQkvKiBXZWxsLCB0aGlzIGRldmljZSBpcyBkZWFkICovCiAJCQkJCXByaW50ayhLRVJOX05PVElDRQpAQCAtMTYzNSw5ICsxNjM2LDkgQEAKIAkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlpZiAoc3luY19wYWdlX2lvKHJkZXYsCiAJCQkJCQkgcjEwX2Jpby0+ZGV2c1tzbF0uYWRkciArCi0JCQkJCQkgc2VjdCArIHJkZXYtPmRhdGFfb2Zmc2V0LAorCQkJCQkJIHNlY3QsCiAJCQkJCQkgczw8OSwgY29uZi0+dG1wcGFnZSwKLQkJCQkJCSBSRUFEKSA9PSAwKSB7CisJCQkJCQkgUkVBRCwgZmFsc2UpID09IDApIHsKIAkJCQkJLyogV2VsbCwgdGhpcyBkZXZpY2UgaXMgZGVhZCAqLwogCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UKIAkJCQkJICAgICAgICJtZC9yYWlkMTA6JXM6IHVuYWJsZSB0byByZWFkIGJhY2sgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5jIGIvZHJpdmVycy9tZC9yYWlkNS5jCmluZGV4IGRjNTc0ZjMuLjUwNDRiYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LmMKQEAgLTE3MjEsNyArMTcyMSw2IEBACiAJCXNldF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpOwogCQlwcmludGsoS0VSTl9BTEVSVAogCQkgICAgICAgIm1kL3JhaWQ6JXM6IERpc2sgZmFpbHVyZSBvbiAlcywgZGlzYWJsaW5nIGRldmljZS5cbiIKLQkJICAgICAgIEtFUk5fQUxFUlQKIAkJICAgICAgICJtZC9yYWlkOiVzOiBPcGVyYXRpb24gY29udGludWluZyBvbiAlZCBkZXZpY2VzLlxuIiwKIAkJICAgICAgIG1kbmFtZShtZGRldiksCiAJCSAgICAgICBiZGV2bmFtZShyZGV2LT5iZGV2LCBiKSwKQEAgLTQyMzcsNyArNDIzNiw3IEBACiAJCXdhaXRfZXZlbnQoY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCwKIAkJCSAgIGF0b21pY19yZWFkKCZjb25mLT5yZXNoYXBlX3N0cmlwZXMpPT0wKTsKIAkJbWRkZXYtPnJlc2hhcGVfcG9zaXRpb24gPSBjb25mLT5yZXNoYXBlX3Byb2dyZXNzOwotCQltZGRldi0+Y3Vycl9yZXN5bmNfY29tcGxldGVkID0gbWRkZXYtPmN1cnJfcmVzeW5jOworCQltZGRldi0+Y3Vycl9yZXN5bmNfY29tcGxldGVkID0gc2VjdG9yX25yOwogCQljb25mLT5yZXNoYXBlX2NoZWNrcG9pbnQgPSBqaWZmaWVzOwogCQlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKQEAgLTQzMzgsNyArNDMzNyw3IEBACiAJCXdhaXRfZXZlbnQoY29uZi0+d2FpdF9mb3Jfb3ZlcmxhcCwKIAkJCSAgIGF0b21pY19yZWFkKCZjb25mLT5yZXNoYXBlX3N0cmlwZXMpID09IDApOwogCQltZGRldi0+cmVzaGFwZV9wb3NpdGlvbiA9IGNvbmYtPnJlc2hhcGVfcHJvZ3Jlc3M7Ci0JCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBtZGRldi0+Y3Vycl9yZXN5bmMgKyByZXNoYXBlX3NlY3RvcnM7CisJCW1kZGV2LT5jdXJyX3Jlc3luY19jb21wbGV0ZWQgPSBzZWN0b3JfbnI7CiAJCWNvbmYtPnJlc2hhcGVfY2hlY2twb2ludCA9IGppZmZpZXM7CiAJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwpAQCAtNTMzOSw3ICs1MzM4LDcgQEAKIAkJICAgICYmICF0ZXN0X2JpdChGYXVsdHksICZ0bXAtPnJkZXYtPmZsYWdzKQogCQkgICAgJiYgIXRlc3RfYW5kX3NldF9iaXQoSW5fc3luYywgJnRtcC0+cmRldi0+ZmxhZ3MpKSB7CiAJCQljb3VudCsrOwotCQkJc3lzZnNfbm90aWZ5X2RpcmVudCh0bXAtPnJkZXYtPnN5c2ZzX3N0YXRlKTsKKwkJCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZSh0bXAtPnJkZXYtPnN5c2ZzX3N0YXRlKTsKIAkJfQogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTU1MjgsOCArNTUyNyw4IEBACiAJCXJldHVybiAtRU5PU1BDOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKLQkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDAgJiYKLQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCisJCWlmICgocmRldi0+cmFpZF9kaXNrIDwgMCB8fCByZGV2LT5yYWlkX2Rpc2sgPj0gY29uZi0+cmFpZF9kaXNrcykKKwkJICAgICAmJiAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJc3BhcmVzKys7CiAKIAlpZiAoc3BhcmVzIC0gbWRkZXYtPmRlZ3JhZGVkIDwgbWRkZXYtPmRlbHRhX2Rpc2tzIC0gY29uZi0+bWF4X2RlZ3JhZGVkKQpAQCAtNTU4OSw2ICs1NTg4LDExIEBACiAJCQkJCS8qIEZhaWx1cmUgaGVyZSBpcyBPSyAqLzsKIAkJCX0gZWxzZQogCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHJkZXYtPnJhaWRfZGlzayA+PSBjb25mLT5wcmV2aW91c19yYWlkX2Rpc2tzCisJCQkgICAmJiAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CisJCQkvKiBUaGlzIGlzIGEgc3BhcmUgdGhhdCB3YXMgbWFudWFsbHkgYWRkZWQgKi8KKwkJCXNldF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKKwkJCWFkZGVkX2RldmljZXMrKzsKIAkJfQogCiAJLyogV2hlbiBhIHJlc2hhcGUgY2hhbmdlcyB0aGUgbnVtYmVyIG9mIGRldmljZXMsIC0+ZGVncmFkZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCmluZGV4IDc4OTA4N2MuLjQ5ZjFiOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwpAQCAtMjE4NCw5ICsyMTg0LDcgQEAKIAlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7CiAJaW50IHJldCA9IDA7CiAKLQlyZXQgPSBwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MjM0MTguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDIzNDE4LmgKaW5kZXggMmMwMDk4MC4uN2U0MDAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MjM0MTguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gyMzQxOC5oCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgIElOWzBdIC0gVGFzayBoYW5kbGUuCiAgICBJTlsxXSAtIGx1bWEgdHlwZTogMCA9IGRpc2FibGUsIDEgPSAxRCBob3Jpem9udGFsIG9ubHksIDIgPSAxRCB2ZXJ0aWNhbCBvbmx5LAogCQkgICAgICAzID0gMkQgSC9WIHNlcGFyYWJsZSwgNCA9IDJEIHN5bW1ldHJpYyBub24tc2VwYXJhYmxlCi0gICBJTlsyXSAtIGNocm9tYSB0eXBlOiAwIC0gZGlhYmxlLCAxID0gMUQgaG9yaXpvbnRhbAorICAgSU5bMl0gLSBjaHJvbWEgdHlwZTogMCAtIGRpc2FibGUsIDEgPSAxRCBob3Jpem9udGFsCiAgICBSZXR1cm5Db2RlIC0gT25lIG9mIHRoZSBFUlJfQ0FQVFVSRV8uLi4gKi8KICNkZWZpbmUgQ1gxOF9DUFVfU0VUX1NQQVRJQUxfRklMVEVSX1RZUEUgICAgIAkoQ1BVX0NNRF9NQVNLX0NBUFRVUkUgfCAweDAwMEMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1pci5jCmluZGV4IDYyNzkyNmYuLjdlYjc5YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWlyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtaXIuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJdTMyIHJlbTsKIAogCS8qCi0JICogVGhlIDIgbHNiJ3Mgb2YgdGhlIHB1bHNlIHdpZHRoIHRpbWVyIGNvdW50IGFyZSBub3QgYWNjZXNzYWJsZSwgaGVuY2UKKwkgKiBUaGUgMiBsc2IncyBvZiB0aGUgcHVsc2Ugd2lkdGggdGltZXIgY291bnQgYXJlIG5vdCBhY2Nlc3NpYmxlLCBoZW5jZQogCSAqIHRoZSAoMSA8PCAyKQogCSAqLwogCW4gPSAoKHU2NCkgbnMpICogQ1gyNTg0MF9JUl9SRUZDTEtfRlJFUSAvIDEwMDAwMDA7IC8qIG1pbGxpY3ljbGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWYuaAppbmRleCAxODg4NDFiLi5lYmQ1YzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmLmgKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgcmVncihyZWcpICAgICAgICAgICAgICAgcmVhZGwoKHJlZykgKyB2cGlmX2Jhc2UpCiAjZGVmaW5lIHJlZ3codmFsdWUsIHJlZykgICAgICAgIHdyaXRlbCh2YWx1ZSwgKHJlZyArIHZwaWZfYmFzZSkpCiAKLS8qIFJlZ2lzdGVyIEFkZHJlc3NzIE9mZnNldHMgKi8KKy8qIFJlZ2lzdGVyIEFkZHJlc3MgT2Zmc2V0cyAqLwogI2RlZmluZSBWUElGX1BJRAkJCSgweDAwMDApCiAjZGVmaW5lIFZQSUZfQ0gwX0NUUkwJCQkoMHgwMDA0KQogI2RlZmluZSBWUElGX0NIMV9DVFJMCQkJKDB4MDAwOCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cHNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBzcy5jCmluZGV4IDc5MTg2ODAuLjNlNWNmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cHNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3Zwc3MuYwpAQCAtODUsNyArODUsNyBAQAogLyoKICAqIHZwc3Mgb3BlcmF0aW9ucy4gRGVwZW5kcyBvbiBwbGF0Zm9ybS4gTm90IGFsbCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZQogICogb24gYWxsIHBsYXRmb3Jtcy4gVGhlIGFwaSwgZmlyc3QgY2hlY2sgaWYgYSBmdW5jdGlvIGlzIGF2YWlsYWJsZSBiZWZvcmUKLSAqIGludm9raW5nIGl0LiBJbiB0aGUgcHJvYmUsIHRoZSBmdW5jdGlvbiBwdHJzIGFyZSBpbnRpYWxpemVkIGJhc2VkIG9uCisgKiBpbnZva2luZyBpdC4gSW4gdGhlIHByb2JlLCB0aGUgZnVuY3Rpb24gcHRycyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24KICAqIHZwc3MgbmFtZS4gdnBzcyBuYW1lIGNhbiBiZSAiZG0zNTVfdnBzcyIsICJkbTY0NHhfdnBzcyIgZXRjLgogICovCiBzdHJ1Y3QgdnBzc19od19vcHMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCmluZGV4IDgzZGU5N2EuLjAyOWE0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKQEAgLTEyODYsNyArMTI4Niw3IEBACiAJdmlkZW9idWZfbW1hcF9mcmVlKHEpOwogCiAJLyogRXZlbiBpZiBhcHBseSBjaGFuZ2VzIGZhaWxzIHdlIHNob3VsZCBjb250aW51ZQotCSAgIGZyZWVpbmcgYWxsb2NhdGVkIG1lbWVvcnkgKi8KKwkgICBmcmVlaW5nIGFsbG9jYXRlZCBtZW1vcnkgKi8KIAlpZiAodm91dC0+c3RyZWFtaW5nKSB7CiAJCXUzMiBtYXNrID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtY29yZS5jCmluZGV4IGQ2YmYzZjguLjU4YWY2N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1jb3JlLmMKQEAgLTY1NSw4ICs2NTUsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBDaGVjayB0aGF0IHRoZSBoYXJkd2FyZSBpcyBhY2Nlc3NhYmxlLiBJZiB0aGUgc3RhdHVzIGJ5dGVzIGFyZQotCSAqIDB4RkYgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhY2Nlc3NhYmxlLCB0aGUgdGhlIElSUSBiZWxvbmdzCisJLyogQ2hlY2sgdGhhdCB0aGUgaGFyZHdhcmUgaXMgYWNjZXNzaWJsZS4gSWYgdGhlIHN0YXR1cyBieXRlcyBhcmUKKwkgKiAweEZGIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYWNjZXNzaWJsZSwgdGhlIHRoZSBJUlEgYmVsb25ncwogCSAqIHRvIGFub3RoZXIgZHJpdmVyLgogCSAqIDQgeCB1MzIgaW50ZXJydXB0IHJlZ2lzdGVycy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3NlbnNvci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfc2Vuc29yLmgKaW5kZXggNDk0OTU3Yi4uN2YzODU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfc2Vuc29yLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfc2Vuc29yLmgKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgewogCWNoYXIgbmFtZVszMl0sIC8qIHNlbnNvciBuYW1lICovCi0JICAgICBtYWludGFpbmVyWzY0XTsgLyogbmFtZSBvZiB0aGUgbWFudGFpbmVyIDxlbWFpbD4gKi8KKwkgICAgIG1haW50YWluZXJbNjRdOyAvKiBuYW1lIG9mIHRoZSBtYWludGFpbmVyIDxlbWFpbD4gKi8KIAogCWVudW0gc245YzEwMl9icmlkZ2Ugc3VwcG9ydGVkX2JyaWRnZTsgLyogc3VwcG9ydGVkIFNOOUMxeHggYnJpZGdlcyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDcwMDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCmluZGV4IGU2M2I0MGYuLmM3OTllNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNzAwMi5jCkBAIC03ODksNyArNzg5LDcgQEAKICAqIEdldCB0aGUgdmFsdWUgb2YgYSBUVlA3MDAyIGRlY29kZXIgZGV2aWNlIHJlZ2lzdGVyLgogICogUmV0dXJucyB6ZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgLUVJTlZBTCBpZiByZWdpc3RlciByZWFkIGZhaWxzIG9yCiAgKiBhY2Nlc3MgdG8gSTJDIGNsaWVudCBmYWlscywgLUVQRVJNIGlmIHRoZSBjYWxsIGlzIG5vdCBhbGxvd2VkCi0gKiBieSBkaWFibGVkIENBUF9TWVNfQURNSU4uCisgKiBieSBkaXNhYmxlZCBDQVBfU1lTX0FETUlOLgogICovCiBzdGF0aWMgaW50IHR2cDcwMDJfZ19yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJCQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpYS1jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlhLWNhbWVyYS5jCmluZGV4IGUyNWFjYTUuLjJmOTczY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlhLWNhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlhLWNhbWVyYS5jCkBAIC0xMywxNCArMTMsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3Fvc19wYXJhbXMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKaW5kZXggYzAwZmU4Mi4uZTlhM2VhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21lbXN0aWNrLmMKQEAgLTQ2NSw2ICs0NjUsNyBAQAogCQlpZiAoIWhvc3QtPmNhcmQpIHsKIAkJCWhvc3QtPmNhcmQgPSBjYXJkOwogCQkJaWYgKGRldmljZV9yZWdpc3RlcigmY2FyZC0+ZGV2KSkgeworCQkJCXB1dF9kZXZpY2UoJmNhcmQtPmRldik7CiAJCQkJa2ZyZWUoaG9zdC0+Y2FyZCk7CiAJCQkJaG9zdC0+Y2FyZCA9IE5VTEw7CiAJCQl9CkBAIC01MTAsMTQgKzUxMSwxOCBAQAogewogCWludCByYzsKIAotCWlmICghaWRyX3ByZV9nZXQoJm1lbXN0aWNrX2hvc3RfaWRyLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJd2hpbGUgKDEpIHsKKwkJaWYgKCFpZHJfcHJlX2dldCgmbWVtc3RpY2tfaG9zdF9pZHIsIEdGUF9LRVJORUwpKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2soJm1lbXN0aWNrX2hvc3RfbG9jayk7Ci0JcmMgPSBpZHJfZ2V0X25ldygmbWVtc3RpY2tfaG9zdF9pZHIsIGhvc3QsICZob3N0LT5pZCk7Ci0Jc3Bpbl91bmxvY2soJm1lbXN0aWNrX2hvc3RfbG9jayk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCXNwaW5fbG9jaygmbWVtc3RpY2tfaG9zdF9sb2NrKTsKKwkJcmMgPSBpZHJfZ2V0X25ldygmbWVtc3RpY2tfaG9zdF9pZHIsIGhvc3QsICZob3N0LT5pZCk7CisJCXNwaW5fdW5sb2NrKCZtZW1zdGlja19ob3N0X2xvY2spOworCQlpZiAoIXJjKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKHJjICE9IC1FQUdBSU4pCisJCQlyZXR1cm4gcmM7CisJfQogCiAJZGV2X3NldF9uYW1lKCZob3N0LT5kZXYsICJtZW1zdGljayV1IiwgaG9zdC0+aWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCmluZGV4IDAyMzYyZWMuLjU3YjQyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC0yMyw3ICsyMyw2IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm1zcHJvX2Jsb2NrIgogCi1zdGF0aWMgREVGSU5FX01VVEVYKG1zcHJvX2Jsb2NrX211dGV4KTsKIHN0YXRpYyBpbnQgbWFqb3I7CiBtb2R1bGVfcGFyYW0obWFqb3IsIGludCwgMDY0NCk7CiAKQEAgLTE2MCw2ICsxNTksMTMgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgKCptcnFfaGFuZGxlcikoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKIAkJCQkJICAgICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSk7CiAKKworCS8qIERlZmF1bHQgcmVxdWVzdCBzZXR1cCBmdW5jdGlvbiBmb3IgZGF0YSBhY2Nlc3MgbWV0aG9kIHByZWZlcnJlZCBieQorCSAqIHRoaXMgaG9zdCBpbnN0YW5jZS4KKwkgKi8KKwl2b2lkICAgICAgICAgICAgICAgICAgKCpzZXR1cF90cmFuc2Zlcikoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkJCXU2NCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworCiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dyb3VwOwogCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICAgIHJlcV9zZ1tNU1BST19CTE9DS19NQVhfU0VHU107CkBAIC0xODEsNyArMTg3LDYgQEAKIAlzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSAqbXNiID0gZGlzay0+cHJpdmF0ZV9kYXRhOwogCWludCByYyA9IC1FTlhJTzsKIAotCW11dGV4X2xvY2soJm1zcHJvX2Jsb2NrX211dGV4KTsKIAltdXRleF9sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOwogCiAJaWYgKG1zYiAmJiBtc2ItPmNhcmQpIHsKQEAgLTE5Myw3ICsxOTgsNiBAQAogCX0KIAogCW11dGV4X3VubG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKLQltdXRleF91bmxvY2soJm1zcHJvX2Jsb2NrX211dGV4KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTIyNSwxMSArMjI5LDcgQEAKIAogc3RhdGljIGludCBtc3Byb19ibG9ja19iZF9yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90IG1vZGUpCiB7Ci0JaW50IHJldDsKLQltdXRleF9sb2NrKCZtc3Byb19ibG9ja19tdXRleCk7Ci0JcmV0ID0gbXNwcm9fYmxvY2tfZGlza19yZWxlYXNlKGRpc2spOwotCW11dGV4X3VubG9jaygmbXNwcm9fYmxvY2tfbXV0ZXgpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIG1zcHJvX2Jsb2NrX2Rpc2tfcmVsZWFzZShkaXNrKTsKIH0KIAogc3RhdGljIGludCBtc3Byb19ibG9ja19iZF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKQEAgLTY2MywxNCArNjYzLDQzIEBACiAJfQogfQogCisvKioqIFRyYW5zZmVyIHNldHVwIGZ1bmN0aW9ucyBmb3IgZGlmZmVyZW50IGFjY2VzcyBtZXRob2RzLiAqKiovCisKKy8qKiBTZXR1cCBkYXRhIHRyYW5zZmVyIHJlcXVlc3QgZm9yIFNFVF9DTUQgVFBDIHdpdGggYXJndW1lbnRzIGluIGNhcmQKKyAqICByZWdpc3RlcnMuCisgKgorICogIEBjYXJkICAgIEN1cnJlbnQgbWVkaWEgaW5zdGFuY2UKKyAqICBAb2Zmc2V0ICBUYXJnZXQgZGF0YSBvZmZzZXQgaW4gYnl0ZXMKKyAqICBAbGVuZ3RoICBSZXF1aXJlZCB0cmFuc2ZlciBsZW5ndGggaW4gYnl0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIGhfbXNwcm9fYmxvY2tfc2V0dXBfY21kKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsIHU2NCBvZmZzZXQsCisJCQkJICAgIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBtc3Byb19wYXJhbV9yZWdpc3RlciBwYXJhbSA9IHsKKwkJLnN5c3RlbSA9IG1zYi0+c3lzdGVtLAorCQkuZGF0YV9jb3VudCA9IGNwdV90b19iZTE2KCh1aW50MTZfdCkobGVuZ3RoIC8gbXNiLT5wYWdlX3NpemUpKSwKKwkJLyogSVNPIEM5MCB3YXJuaW5nIHByZWNsdWRlcyBkaXJlY3QgaW5pdGlhbGl6YXRpb24gZm9yIG5vdy4gKi8KKwkJLmRhdGFfYWRkcmVzcyA9IDAsCisJCS50cGNfcGFyYW0gPSAwCisJfTsKKworCWRvX2RpdihvZmZzZXQsIG1zYi0+cGFnZV9zaXplKTsKKwlwYXJhbS5kYXRhX2FkZHJlc3MgPSBjcHVfdG9fYmUzMigodWludDMyX3Qpb2Zmc2V0KTsKKworCWNhcmQtPm5leHRfcmVxdWVzdCA9IGhfbXNwcm9fYmxvY2tfcmVxX2luaXQ7CisJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfdHJhbnNmZXJfZGF0YTsKKwltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19XUklURV9SRUcsCisJCQkgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7Cit9CisKIC8qKiogRGF0YSB0cmFuc2ZlciAqKiovCiAKIHN0YXRpYyBpbnQgbXNwcm9fYmxvY2tfaXNzdWVfcmVxKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsIGludCBjaHVuaykKIHsKIAlzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSAqbXNiID0gbWVtc3RpY2tfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc2VjdG9yX3QgdF9zZWM7CisJdTY0IHRfb2ZmOwogCXVuc2lnbmVkIGludCBjb3VudDsKLQlzdHJ1Y3QgbXNwcm9fcGFyYW1fcmVnaXN0ZXIgcGFyYW07CiAKIHRyeV9hZ2FpbjoKIAl3aGlsZSAoY2h1bmspIHsKQEAgLTY4NSwzMCArNzE0LDE3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXRfc2VjID0gYmxrX3JxX3Bvcyhtc2ItPmJsb2NrX3JlcSkgPDwgOTsKLQkJc2VjdG9yX2Rpdih0X3NlYywgbXNiLT5wYWdlX3NpemUpOwotCisJCXRfb2ZmID0gYmxrX3JxX3Bvcyhtc2ItPmJsb2NrX3JlcSk7CisJCXRfb2ZmIDw8PSA5OwogCQljb3VudCA9IGJsa19ycV9ieXRlcyhtc2ItPmJsb2NrX3JlcSk7Ci0JCWNvdW50IC89IG1zYi0+cGFnZV9zaXplOwogCi0JCXBhcmFtLnN5c3RlbSA9IG1zYi0+c3lzdGVtOwotCQlwYXJhbS5kYXRhX2NvdW50ID0gY3B1X3RvX2JlMTYoY291bnQpOwotCQlwYXJhbS5kYXRhX2FkZHJlc3MgPSBjcHVfdG9fYmUzMigodWludDMyX3QpdF9zZWMpOwotCQlwYXJhbS50cGNfcGFyYW0gPSAwOworCQltc2ItPnNldHVwX3RyYW5zZmVyKGNhcmQsIHRfb2ZmLCBjb3VudCk7CiAKIAkJbXNiLT5kYXRhX2RpciA9IHJxX2RhdGFfZGlyKG1zYi0+YmxvY2tfcmVxKTsKIAkJbXNiLT50cmFuc2Zlcl9jbWQgPSBtc2ItPmRhdGFfZGlyID09IFJFQUQKIAkJCQkgICAgPyBNU1BST19DTURfUkVBRF9EQVRBCiAJCQkJICAgIDogTVNQUk9fQ01EX1dSSVRFX0RBVEE7CiAKLQkJZGV2X2RiZygmY2FyZC0+ZGV2LCAiZGF0YSB0cmFuc2ZlcjogY21kICV4LCAiCi0JCQkibGJhICV4LCBjb3VudCAleFxuIiwgbXNiLT50cmFuc2Zlcl9jbWQsCi0JCQliZTMyX3RvX2NwdShwYXJhbS5kYXRhX2FkZHJlc3MpLCBjb3VudCk7Ci0KLQkJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tc3Byb19ibG9ja19yZXFfaW5pdDsKLQkJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfdHJhbnNmZXJfZGF0YTsKLQkJbWVtc3RpY2tfaW5pdF9yZXEoJmNhcmQtPmN1cnJlbnRfbXJxLCBNU19UUENfV1JJVEVfUkVHLAotCQkJCSAgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKIAkJbWVtc3RpY2tfbmV3X3JlcShjYXJkLT5ob3N0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtOTYzLDE4ICs5NzksMTYgQEAKIHN0YXRpYyBpbnQgbXNwcm9fYmxvY2tfcmVhZF9hdHRyaWJ1dGVzKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCiB7CiAJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc3Byb19wYXJhbV9yZWdpc3RlciBwYXJhbSA9IHsKLQkJLnN5c3RlbSA9IG1zYi0+c3lzdGVtLAotCQkuZGF0YV9jb3VudCA9IGNwdV90b19iZTE2KDEpLAotCQkuZGF0YV9hZGRyZXNzID0gMCwKLQkJLnRwY19wYXJhbSA9IDAKLQl9OwogCXN0cnVjdCBtc3Byb19hdHRyaWJ1dGUgKmF0dHIgPSBOVUxMOwogCXN0cnVjdCBtc3Byb19zeXNfYXR0ciAqc19hdHRyID0gTlVMTDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOwogCWludCBjbnQsIHJjLCBhdHRyX2NvdW50OwotCXVuc2lnbmVkIGludCBhZGRyOwotCXVuc2lnbmVkIHNob3J0IHBhZ2VfY291bnQ7CisJLyogV2hpbGUgbm9ybWFsbHkgcGh5c2ljYWwgZGV2aWNlIG9mZnNldHMsIHJlcHJlc2VudGVkIGhlcmUgYnkKKwkgKiBhdHRyX29mZnNldCBhbmQgYXR0cl9sZW4gd2lsbCBiZSBvZiBsYXJnZSBudW1lcmljIHR5cGVzLCB3ZSBjYW4gYmUKKwkgKiBzdXJlLCB0aGF0IGF0dHJpYnV0ZXMgYXJlIGNsb3NlIGVub3VnaCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAqIGRldmljZSwgdG8gc2F2ZSBvdXJzZWx2ZXMgc29tZSB0cm91YmxlLgorCSAqLworCXVuc2lnbmVkIGludCBhZGRyLCBhdHRyX29mZnNldCA9IDAsIGF0dHJfbGVuID0gbXNiLT5wYWdlX3NpemU7CiAKIAlhdHRyID0ga21hbGxvYyhtc2ItPnBhZ2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhdHRyKQpAQCAtOTg3LDEwICsxMDAxLDggQEAKIAltc2ItPmRhdGFfZGlyID0gUkVBRDsKIAltc2ItPnRyYW5zZmVyX2NtZCA9IE1TUFJPX0NNRF9SRUFEX0FUUkI7CiAKLQljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OwotCW1zYi0+bXJxX2hhbmRsZXIgPSBoX21zcHJvX2Jsb2NrX3RyYW5zZmVyX2RhdGE7Ci0JbWVtc3RpY2tfaW5pdF9yZXEoJmNhcmQtPmN1cnJlbnRfbXJxLCBNU19UUENfV1JJVEVfUkVHLCAmcGFyYW0sCi0JCQkgIHNpemVvZihwYXJhbSkpOworCW1zYi0+c2V0dXBfdHJhbnNmZXIoY2FyZCwgYXR0cl9vZmZzZXQsIGF0dHJfbGVuKTsKKwogCW1lbXN0aWNrX25ld19yZXEoY2FyZC0+aG9zdCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+bXJxX2NvbXBsZXRlKTsKIAlpZiAoY2FyZC0+Y3VycmVudF9tcnEuZXJyb3IpIHsKQEAgLTEwMjEsMTMgKzEwMzMsMTIgQEAKIAl9CiAJbXNiLT5hdHRyX2dyb3VwLm5hbWUgPSAibWVkaWFfYXR0cmlidXRlcyI7CiAKLQlidWZmZXIgPSBrbWFsbG9jKG1zYi0+cGFnZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlidWZmZXIgPSBrbWFsbG9jKGF0dHJfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfYXR0cjsKIAl9Ci0JbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKilhdHRyLCBtc2ItPnBhZ2Vfc2l6ZSk7Ci0JcGFnZV9jb3VudCA9IDE7CisJbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKilhdHRyLCBhdHRyX2xlbik7CiAKIAlmb3IgKGNudCA9IDA7IGNudCA8IGF0dHJfY291bnQ7ICsrY250KSB7CiAJCXNfYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc3Byb19zeXNfYXR0ciksIEdGUF9LRVJORUwpOwpAQCAtMTAzOCw5ICsxMDQ5LDEwIEBACiAKIAkJbXNiLT5hdHRyX2dyb3VwLmF0dHJzW2NudF0gPSAmc19hdHRyLT5kZXZfYXR0ci5hdHRyOwogCQlhZGRyID0gYmUzMl90b19jcHUoYXR0ci0+ZW50cmllc1tjbnRdLmFkZHJlc3MpOwotCQlyYyA9IGJlMzJfdG9fY3B1KGF0dHItPmVudHJpZXNbY250XS5zaXplKTsKKwkJc19hdHRyLT5zaXplID0gYmUzMl90b19jcHUoYXR0ci0+ZW50cmllc1tjbnRdLnNpemUpOwogCQlkZXZfZGJnKCZjYXJkLT5kZXYsICJhZGRpbmcgYXR0cmlidXRlICVkOiBpZCAleCwgYWRkcmVzcyAleCwgIgotCQkJInNpemUgJXhcbiIsIGNudCwgYXR0ci0+ZW50cmllc1tjbnRdLmlkLCBhZGRyLCByYyk7CisJCQkic2l6ZSAlenhcbiIsIGNudCwgYXR0ci0+ZW50cmllc1tjbnRdLmlkLCBhZGRyLAorCQkJc19hdHRyLT5zaXplKTsKIAkJc19hdHRyLT5pZCA9IGF0dHItPmVudHJpZXNbY250XS5pZDsKIAkJaWYgKG1zcHJvX2Jsb2NrX2F0dHJfbmFtZShzX2F0dHItPmlkKSkKIAkJCXNucHJpbnRmKHNfYXR0ci0+bmFtZSwgc2l6ZW9mKHNfYXR0ci0+bmFtZSksICIlcyIsCkBAIC0xMDU0LDU3ICsxMDY2LDQ3IEBACiAJCXNfYXR0ci0+ZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAkJc19hdHRyLT5kZXZfYXR0ci5zaG93ID0gbXNwcm9fYmxvY2tfYXR0cl9zaG93KHNfYXR0ci0+aWQpOwogCi0JCWlmICghcmMpCisJCWlmICghc19hdHRyLT5zaXplKQogCQkJY29udGludWU7CiAKLQkJc19hdHRyLT5zaXplID0gcmM7Ci0JCXNfYXR0ci0+ZGF0YSA9IGttYWxsb2MocmMsIEdGUF9LRVJORUwpOworCQlzX2F0dHItPmRhdGEgPSBrbWFsbG9jKHNfYXR0ci0+c2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc19hdHRyLT5kYXRhKSB7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9mcmVlX2J1ZmZlcjsKIAkJfQogCi0JCWlmICgoKGFkZHIgLyBtc2ItPnBhZ2Vfc2l6ZSkKLQkJICAgICA9PSBiZTMyX3RvX2NwdShwYXJhbS5kYXRhX2FkZHJlc3MpKQotCQkgICAgJiYgKCgoYWRkciArIHJjIC0gMSkgLyBtc2ItPnBhZ2Vfc2l6ZSkKLQkJCT09IGJlMzJfdG9fY3B1KHBhcmFtLmRhdGFfYWRkcmVzcykpKSB7CisJCWlmICgoKGFkZHIgLyBtc2ItPnBhZ2Vfc2l6ZSkgPT0gKGF0dHJfb2Zmc2V0IC8gbXNiLT5wYWdlX3NpemUpKQorCQkgICAgJiYgKCgoYWRkciArIHNfYXR0ci0+c2l6ZSAtIDEpIC8gbXNiLT5wYWdlX3NpemUpCisJCQk9PSAoYXR0cl9vZmZzZXQgLyBtc2ItPnBhZ2Vfc2l6ZSkpKSB7CiAJCQltZW1jcHkoc19hdHRyLT5kYXRhLCBidWZmZXIgKyBhZGRyICUgbXNiLT5wYWdlX3NpemUsCi0JCQkgICAgICAgcmMpOworCQkJICAgICAgIHNfYXR0ci0+c2l6ZSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChwYWdlX2NvdW50IDw9IChyYyAvIG1zYi0+cGFnZV9zaXplKSkgeworCQlhdHRyX29mZnNldCA9IChhZGRyIC8gbXNiLT5wYWdlX3NpemUpICogbXNiLT5wYWdlX3NpemU7CisKKwkJaWYgKChhdHRyX29mZnNldCArIGF0dHJfbGVuKSA8IChhZGRyICsgc19hdHRyLT5zaXplKSkgewogCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCXBhZ2VfY291bnQgPSAocmMgLyBtc2ItPnBhZ2Vfc2l6ZSkgKyAxOwotCQkJYnVmZmVyID0ga21hbGxvYyhwYWdlX2NvdW50ICogbXNiLT5wYWdlX3NpemUsCi0JCQkJCSBHRlBfS0VSTkVMKTsKKwkJCWF0dHJfbGVuID0gKCgoYWRkciArIHNfYXR0ci0+c2l6ZSkgLyBtc2ItPnBhZ2Vfc2l6ZSkKKwkJCQkgICAgKyAxICkgKiBtc2ItPnBhZ2Vfc2l6ZSAtIGF0dHJfb2Zmc2V0OworCQkJYnVmZmVyID0ga21hbGxvYyhhdHRyX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWJ1ZmZlcikgewogCQkJCXJjID0gLUVOT01FTTsKIAkJCQlnb3RvIG91dF9mcmVlX2F0dHI7CiAJCQl9CiAJCX0KIAotCQlwYXJhbS5zeXN0ZW0gPSBtc2ItPnN5c3RlbTsKLQkJcGFyYW0uZGF0YV9jb3VudCA9IGNwdV90b19iZTE2KChyYyAvIG1zYi0+cGFnZV9zaXplKSArIDEpOwotCQlwYXJhbS5kYXRhX2FkZHJlc3MgPSBjcHVfdG9fYmUzMihhZGRyIC8gbXNiLT5wYWdlX3NpemUpOwotCQlwYXJhbS50cGNfcGFyYW0gPSAwOwotCi0JCXNnX2luaXRfb25lKCZtc2ItPnJlcV9zZ1swXSwgYnVmZmVyLAotCQkJICAgIGJlMTZfdG9fY3B1KHBhcmFtLmRhdGFfY291bnQpICogbXNiLT5wYWdlX3NpemUpOworCQlzZ19pbml0X29uZSgmbXNiLT5yZXFfc2dbMF0sIGJ1ZmZlciwgYXR0cl9sZW4pOwogCQltc2ItPnNlZ19jb3VudCA9IDE7CiAJCW1zYi0+Y3VycmVudF9zZWcgPSAwOwogCQltc2ItPmN1cnJlbnRfcGFnZSA9IDA7CiAJCW1zYi0+ZGF0YV9kaXIgPSBSRUFEOwogCQltc2ItPnRyYW5zZmVyX2NtZCA9IE1TUFJPX0NNRF9SRUFEX0FUUkI7CiAKLQkJZGV2X2RiZygmY2FyZC0+ZGV2LCAicmVhZGluZyBhdHRyaWJ1dGUgcGFnZXMgJXgsICV4XG4iLAotCQkJYmUzMl90b19jcHUocGFyYW0uZGF0YV9hZGRyZXNzKSwKLQkJCWJlMTZfdG9fY3B1KHBhcmFtLmRhdGFfY291bnQpKTsKKwkJZGV2X2RiZygmY2FyZC0+ZGV2LCAicmVhZGluZyBhdHRyaWJ1dGUgcmFuZ2UgJXgsICV4XG4iLAorCQkJYXR0cl9vZmZzZXQsIGF0dHJfbGVuKTsKIAotCQljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OwotCQltc2ItPm1ycV9oYW5kbGVyID0gaF9tc3Byb19ibG9ja190cmFuc2Zlcl9kYXRhOwotCQltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19XUklURV9SRUcsCi0JCQkJICAoY2hhciAqKSZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisJCW1zYi0+c2V0dXBfdHJhbnNmZXIoY2FyZCwgYXR0cl9vZmZzZXQsIGF0dHJfbGVuKTsKIAkJbWVtc3RpY2tfbmV3X3JlcShjYXJkLT5ob3N0KTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+bXJxX2NvbXBsZXRlKTsKIAkJaWYgKGNhcmQtPmN1cnJlbnRfbXJxLmVycm9yKSB7CkBAIC0xMTEyLDcgKzExMTQsOCBAQAogCQkJZ290byBvdXRfZnJlZV9idWZmZXI7CiAJCX0KIAotCQltZW1jcHkoc19hdHRyLT5kYXRhLCBidWZmZXIgKyBhZGRyICUgbXNiLT5wYWdlX3NpemUsIHJjKTsKKwkJbWVtY3B5KHNfYXR0ci0+ZGF0YSwgYnVmZmVyICsgYWRkciAlIG1zYi0+cGFnZV9zaXplLAorCQkgICAgICAgc19hdHRyLT5zaXplKTsKIAl9CiAKIAlyYyA9IDA7CkBAIC0xMTMwLDYgKzExMzMsOCBAQAogCWludCByYyA9IDA7CiAKIAltc2ItPnN5c3RlbSA9IE1FTVNUSUNLX1NZU19TRVJJQUw7CisJbXNiLT5zZXR1cF90cmFuc2ZlciA9IGhfbXNwcm9fYmxvY2tfc2V0dXBfY21kOworCiAJY2FyZC0+cmVnX2FkZHIucl9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbXNwcm9fcmVnaXN0ZXIsIHN0YXR1cyk7CiAJY2FyZC0+cmVnX2FkZHIucl9sZW5ndGggPSBzaXplb2Yoc3RydWN0IG1zX3N0YXR1c19yZWdpc3Rlcik7CiAJY2FyZC0+cmVnX2FkZHIud19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbXNwcm9fcmVnaXN0ZXIsIHBhcmFtKTsKQEAgLTEyMDYsMTAgKzEyMTEsMTIgQEAKIAogCW1zYi0+cGFnZV9zaXplID0gYmUxNl90b19jcHUoc3lzX2luZm8tPnVuaXRfc2l6ZSk7CiAKLQlpZiAoIWlkcl9wcmVfZ2V0KCZtc3Byb19ibG9ja19kaXNrX2lkciwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJbXV0ZXhfbG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKKwlpZiAoIWlkcl9wcmVfZ2V0KCZtc3Byb19ibG9ja19kaXNrX2lkciwgR0ZQX0tFUk5FTCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlyYyA9IGlkcl9nZXRfbmV3KCZtc3Byb19ibG9ja19kaXNrX2lkciwgY2FyZCwgJmRpc2tfaWQpOwogCW11dGV4X3VubG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L2ptYjM4eF9tcy5jCmluZGV4IGYyYjg5NGMuLmQ4OWQ5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9qbWIzOHhfbXMuYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3Qvam1iMzh4X21zLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAlzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGNtZF9mbGFnczsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICBpb19wb3M7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgaWZtb2RlOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlvX3dvcmRbMl07CiB9OwogCkBAIC0xMzYsMTUgKzEzNywxNCBAQAogI2RlZmluZSBQQURfUFVfUERfT05fTVNfU09DSzAgMHg1ZjhmMDAwMAogI2RlZmluZSBQQURfUFVfUERfT05fTVNfU09DSzEgMHgwZjBmMDAwMAogCisjZGVmaW5lIENMT0NLX0NPTlRST0xfQllfTU1JTyAweDAwMDAwMDA4CiAjZGVmaW5lIENMT0NLX0NPTlRST0xfNDBNSFogICAweDAwMDAwMDAxCi0jZGVmaW5lIENMT0NLX0NPTlRST0xfNTBNSFogICAweDAwMDAwMDBhCi0jZGVmaW5lIENMT0NLX0NPTlRST0xfNjBNSFogICAweDAwMDAwMDA4Ci0jZGVmaW5lIENMT0NLX0NPTlRST0xfNjJfNU1IWiAweDAwMDAwMDBjCisjZGVmaW5lIENMT0NLX0NPTlRST0xfNTBNSFogICAweDAwMDAwMDAyCisjZGVmaW5lIENMT0NLX0NPTlRST0xfNjBNSFogICAweDAwMDAwMDEwCisjZGVmaW5lIENMT0NLX0NPTlRST0xfNjJfNU1IWiAweDAwMDAwMDA0CiAjZGVmaW5lIENMT0NLX0NPTlRST0xfT0ZGICAgICAweDAwMDAwMDAwCiAKICNkZWZpbmUgUENJX0NUTF9DTE9DS19ETFlfQUREUiAgIDB4MDAwMDAwYjAKLSNkZWZpbmUgUENJX0NUTF9DTE9DS19ETFlfTUFTS19BIDB4MDAwMDBmMDAKLSNkZWZpbmUgUENJX0NUTF9DTE9DS19ETFlfTUFTS19CIDB4MDAwMGYwMDAKIAogZW51bSB7CiAJQ01EX1JFQURZICAgID0gMHgwMSwKQEAgLTM5MCw4ICszOTAsMTMgQEAKIAogCWlmIChob3N0LT5yZXEtPmRhdGFfZGlyID09IFJFQUQpCiAJCWNtZCB8PSBUUENfRElSOwotCWlmIChob3N0LT5yZXEtPm5lZWRfY2FyZF9pbnQpCi0JCWNtZCB8PSBUUENfV0FJVF9JTlQ7CisKKwlpZiAoaG9zdC0+cmVxLT5uZWVkX2NhcmRfaW50KSB7CisJCWlmIChob3N0LT5pZm1vZGUgPT0gTUVNU1RJQ0tfU0VSSUFMKQorCQkJY21kIHw9IFRQQ19HRVRfSU5UOworCQllbHNlCisJCQljbWQgfD0gVFBDX1dBSVRfSU5UOworCX0KIAogCWRhdGEgPSBob3N0LT5yZXEtPmRhdGE7CiAKQEAgLTUyOSw3ICs1MzQsMTAgQEAKIAkJaWYgKGlycV9zdGF0dXMgJiBJTlRfU1RBVFVTX0FOWV9FUlIpIHsKIAkJCWlmIChpcnFfc3RhdHVzICYgSU5UX1NUQVRVU19DUkNfRVJSKQogCQkJCWhvc3QtPnJlcS0+ZXJyb3IgPSAtRUlMU0VROwotCQkJZWxzZQorCQkJZWxzZSBpZiAoaXJxX3N0YXR1cyAmIElOVF9TVEFUVVNfVFBDX0VSUikgeworCQkJCWRldl9kYmcoJmhvc3QtPmNoaXAtPnBkZXYtPmRldiwgIlRQQ19FUlJcbiIpOworCQkJCWptYjM4eF9tc19jb21wbGV0ZV9jbWQobXNoLCAwKTsKKwkJCX0gZWxzZQogCQkJCWhvc3QtPnJlcS0+ZXJyb3IgPSAtRVRJTUU7CiAJCX0gZWxzZSB7CiAJCQlpZiAoaG9zdC0+Y21kX2ZsYWdzICYgRE1BX0RBVEEpIHsKQEAgLTY0NCw3ICs2NTIsNiBAQAogCQluZGVsYXkoMjApOwogCX0KIAlkZXZfZGJnKCZob3N0LT5jaGlwLT5wZGV2LT5kZXYsICJyZXNldF9yZXEgdGltZW91dFxuIik7Ci0JLyogcmV0dXJuIC1FSU87ICovCiAKIHJlc2V0X25leHQ6CiAJd3JpdGVsKEhPU1RfQ09OVFJPTF9SRVNFVCB8IEhPU1RfQ09OVFJPTF9DTE9DS19FTgpAQCAtNjc1LDcgKzY4Miw3IEBACiB7CiAJc3RydWN0IGptYjM4eF9tc19ob3N0ICpob3N0ID0gbWVtc3RpY2tfcHJpdihtc2gpOwogCXVuc2lnbmVkIGludCBob3N0X2N0bCA9IHJlYWRsKGhvc3QtPmFkZHIgKyBIT1NUX0NPTlRST0wpOwotCXVuc2lnbmVkIGludCBjbG9ja19jdGwgPSBDTE9DS19DT05UUk9MXzQwTUhaLCBjbG9ja19kZWxheSA9IDA7CisJdW5zaWduZWQgaW50IGNsb2NrX2N0bCA9IENMT0NLX0NPTlRST0xfQllfTU1JTywgY2xvY2tfZGVsYXkgPSAwOwogCWludCByYyA9IDA7CiAKIAlzd2l0Y2ggKHBhcmFtKSB7CkBAIC02ODcsOSArNjk0LDcgQEAKIAogCQkJaG9zdF9jdGwgPSA3OwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX1BPV0VSX0VOCi0JCQkJICAgIHwgSE9TVF9DT05UUk9MX0NMT0NLX0VOCi0JCQkJICAgIHwgSE9TVF9DT05UUk9MX0hXX09DX1AKLQkJCQkgICAgfCBIT1NUX0NPTlRST0xfVERFTEFZX0VOOworCQkJCSB8IEhPU1RfQ09OVFJPTF9DTE9DS19FTjsKIAkJCXdyaXRlbChob3N0X2N0bCwgaG9zdC0+YWRkciArIEhPU1RfQ09OVFJPTCk7CiAKIAkJCXdyaXRlbChob3N0LT5pZCA/IFBBRF9QVV9QRF9PTl9NU19TT0NLMQpAQCAtNzEyLDQ2ICs3MTcsODggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIE1FTVNUSUNLX0lOVEVSRkFDRToKKwkJZGV2X2RiZygmaG9zdC0+Y2hpcC0+cGRldi0+ZGV2LAorCQkJIlNldCBIb3N0IEludGVyZmFjZSBNb2RlIHRvICVkXG4iLCB2YWx1ZSk7CisJCWhvc3RfY3RsICY9IH4oSE9TVF9DT05UUk9MX0ZBU1RfQ0xLIHwgSE9TVF9DT05UUk9MX1JFSSB8CisJCQkgICAgICBIT1NUX0NPTlRST0xfUkVPKTsKKwkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX1RERUxBWV9FTiB8IEhPU1RfQ09OVFJPTF9IV19PQ19QOwogCQlob3N0X2N0bCAmPSB+KDMgPDwgSE9TVF9DT05UUk9MX0lGX1NISUZUKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGhvc3QtPmNoaXAtPnBkZXYsCi0JCQkJICAgICAgUENJX0NUTF9DTE9DS19ETFlfQUREUiwKLQkJCQkgICAgICAmY2xvY2tfZGVsYXkpOwotCQljbG9ja19kZWxheSAmPSBob3N0LT5pZCA/IH5QQ0lfQ1RMX0NMT0NLX0RMWV9NQVNLX0IKLQkJCQkJOiB+UENJX0NUTF9DTE9DS19ETFlfTUFTS19BOwogCiAJCWlmICh2YWx1ZSA9PSBNRU1TVElDS19TRVJJQUwpIHsKLQkJCWhvc3RfY3RsICY9IH5IT1NUX0NPTlRST0xfRkFTVF9DTEs7Ci0JCQlob3N0X2N0bCAmPSB+SE9TVF9DT05UUk9MX1JFTzsKIAkJCWhvc3RfY3RsIHw9IEhPU1RfQ09OVFJPTF9JRl9TRVJJQUwKIAkJCQkgICAgPDwgSE9TVF9DT05UUk9MX0lGX1NISUZUOwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX1JFSTsKLQkJCWNsb2NrX2N0bCA9IENMT0NLX0NPTlRST0xfNDBNSFo7CisJCQljbG9ja19jdGwgfD0gQ0xPQ0tfQ09OVFJPTF80ME1IWjsKKwkJCWNsb2NrX2RlbGF5ID0gMDsKIAkJfSBlbHNlIGlmICh2YWx1ZSA9PSBNRU1TVElDS19QQVI0KSB7Ci0JCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfRkFTVF9DTEsgfCBIT1NUX0NPTlRST0xfUkVPOworCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX0ZBU1RfQ0xLOwogCQkJaG9zdF9jdGwgfD0gSE9TVF9DT05UUk9MX0lGX1BBUjQKIAkJCQkgICAgPDwgSE9TVF9DT05UUk9MX0lGX1NISUZUOwotCQkJaG9zdF9jdGwgJj0gfkhPU1RfQ09OVFJPTF9SRUk7Ci0JCQljbG9ja19jdGwgPSBDTE9DS19DT05UUk9MXzQwTUhaOwotCQkJY2xvY2tfZGVsYXkgfD0gaG9zdC0+aWQgPyAoNCA8PCAxMikgOiAoNCA8PCA4KTsKKwkJCWhvc3RfY3RsIHw9IEhPU1RfQ09OVFJPTF9SRU87CisJCQljbG9ja19jdGwgfD0gQ0xPQ0tfQ09OVFJPTF80ME1IWjsKKwkJCWNsb2NrX2RlbGF5ID0gNDsKIAkJfSBlbHNlIGlmICh2YWx1ZSA9PSBNRU1TVElDS19QQVI4KSB7CiAJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfRkFTVF9DTEs7CiAJCQlob3N0X2N0bCB8PSBIT1NUX0NPTlRST0xfSUZfUEFSOAogCQkJCSAgICA8PCBIT1NUX0NPTlRST0xfSUZfU0hJRlQ7Ci0JCQlob3N0X2N0bCAmPSB+KEhPU1RfQ09OVFJPTF9SRUkgfCBIT1NUX0NPTlRST0xfUkVPKTsKLQkJCWNsb2NrX2N0bCA9IENMT0NLX0NPTlRST0xfNTBNSFo7CisJCQljbG9ja19jdGwgfD0gQ0xPQ0tfQ09OVFJPTF81ME1IWjsKKwkJCWNsb2NrX2RlbGF5ID0gMDsKIAkJfSBlbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQl3cml0ZWwoaG9zdF9jdGwsIGhvc3QtPmFkZHIgKyBIT1NUX0NPTlRST0wpOworCQl3cml0ZWwoQ0xPQ0tfQ09OVFJPTF9PRkYsIGhvc3QtPmFkZHIgKyBDTE9DS19DT05UUk9MKTsKIAkJd3JpdGVsKGNsb2NrX2N0bCwgaG9zdC0+YWRkciArIENMT0NLX0NPTlRST0wpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGhvc3QtPmNoaXAtPnBkZXYsCi0JCQkJICAgICAgIFBDSV9DVExfQ0xPQ0tfRExZX0FERFIsCi0JCQkJICAgICAgIGNsb2NrX2RlbGF5KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGhvc3QtPmNoaXAtPnBkZXYsCisJCQkJICAgICAgUENJX0NUTF9DTE9DS19ETFlfQUREUiArIDEsCisJCQkJICAgICAgY2xvY2tfZGVsYXkpOworCQlob3N0LT5pZm1vZGUgPSB2YWx1ZTsKIAkJYnJlYWs7CiAJfTsKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBQQ0lfUE1PUzBfQ09OVFJPTAkJMHhhZQorI2RlZmluZSAgUE1PUzBfRU5BQkxFCQkJMHgwMQorI2RlZmluZSAgUE1PUzBfT1ZFUkNVUlJFTlRfTEVWRUxfMl80VgkweDA2CisjZGVmaW5lICBQTU9TMF9FTl9PVkVSQ1VSUkVOVF9ERUJPVU5DRQkweDQwCisjZGVmaW5lICBQTU9TMF9TV19MRURfUE9MQVJJVFlfRU5BQkxFCTB4ODAKKyNkZWZpbmUgIFBNT1MwX0FDVElWRV9CSVRTIChQTU9TMF9FTkFCTEUgfCBQTU9TMF9FTl9PVkVSQ1VSUkVOVF9ERUJPVU5DRSB8IFwKKwkJCSAgICBQTU9TMF9PVkVSQ1VSUkVOVF9MRVZFTF8yXzRWKQorI2RlZmluZSBQQ0lfUE1PUzFfQ09OVFJPTAkJMHhiZAorI2RlZmluZSAgUE1PUzFfQUNUSVZFX0JJVFMJCTB4NGEKKyNkZWZpbmUgUENJX0NMT0NLX0NUTAkJCTB4YjkKKworc3RhdGljIGludCBqbWIzOHhfbXNfcG1vcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGZsYWcpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUE1PUzBfQ09OVFJPTCwgJnZhbCk7CisJaWYgKGZsYWcpCisJCXZhbCB8PSBQTU9TMF9BQ1RJVkVfQklUUzsKKwllbHNlCisJCXZhbCAmPSB+UE1PUzBfQUNUSVZFX0JJVFM7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9QTU9TMF9DT05UUk9MLCB2YWwpOworCWRldl9kYmcoJnBkZXYtPmRldiwgIkpNQjM4eDogc2V0IFBNT1MwIHZhbCAweCV4XG4iLCB2YWwpOworCisJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKSkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUE1PUzFfQ09OVFJPTCwgJnZhbCk7CisJCWlmIChmbGFnKQorCQkJdmFsIHw9IFBNT1MxX0FDVElWRV9CSVRTOworCQllbHNlCisJCQl2YWwgJj0gflBNT1MxX0FDVElWRV9CSVRTOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX1BNT1MxX0NPTlRST0wsIHZhbCk7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkpNQjM4eDogc2V0IFBNT1MxIHZhbCAweCV4XG4iLCB2YWwpOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTE9DS19DVEwsICZ2YWwpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xPQ0tfQ1RMLCB2YWwgJiB+MHgwZik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTE9DS19DVEwsIHZhbCB8IDB4MDEpOworCWRldl9kYmcoJnBkZXYtPmRldiwgIkNsb2NrIENvbnRyb2wgYnkgUENJIGNvbmZpZyBpcyBkaXNhYmxlZCFcbiIpOworCisgICAgICAgIHJldHVybiAwOworfQorCiAjaWZkZWYgQ09ORklHX1BNCiAKIHN0YXRpYyBpbnQgam1iMzh4X21zX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtNzg0LDggKzgzMSw3IEBACiAJCXJldHVybiByYzsKIAlwY2lfc2V0X21hc3RlcihkZXYpOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHhhYywgJnJjKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHhhYywgcmMgfCAweDAwNDcwMDAwKTsKKwlqbWIzOHhfbXNfcG1vcyhkZXYsIDEpOwogCiAJZm9yIChyYyA9IDA7IHJjIDwgam0tPmhvc3RfY250OyArK3JjKSB7CiAJCWlmICgham0tPmhvc3RzW3JjXSkKQEAgLTg5NCw4ICs5NDAsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4YWMsICZyYyk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweGFjLCByYyB8IDB4MDA0NzAwMDApOworCWptYjM4eF9tc19wbW9zKHBkZXYsIDEpOwogCiAJY250ID0gam1iMzh4X21zX2NvdW50X3Nsb3RzKHBkZXYpOwogCWlmICghY250KSB7CkBAIC05NzYsNiArMTAyMSw4IEBACiAJCWptYjM4eF9tc19mcmVlX2hvc3Qoam0tPmhvc3RzW2NudF0pOwogCX0KIAorCWptYjM4eF9tc19wbW9zKGRldiwgMCk7CisKIAlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CkBAIC05ODMsOCArMTAzMCw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBqbWIzOHhfbXNfaWRfdGJsIFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9KTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01TLCBQQ0lfQU5ZX0lELAotCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZERVZJQ0UoSk1JQ1JPTiwgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NUykgfSwKKwl7IFBDSV9WREVWSUNFKEpNSUNST04sIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODVfTVMpIH0sCisJeyBQQ0lfVkRFVklDRShKTUlDUk9OLCBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzkwX01TKSB9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfc2FzLmgKaW5kZXggNjkxNjIwZC4uOGIwNDgxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX3Nhcy5oCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogLyogQ29tcGF0aWJpbGl0eSBFcnJvciA6IElSIERpc2FibGVkICovCiAjZGVmaW5lIElSX0xPR0lORk9fQ09NUEFUX0VSUk9SX1JBSURfRElTQUJMRUQgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAzMCkKLS8qIENvbXBhdGliaWxpdHkgRXJyb3IgOiBJbnF1aXJ5IENvbWFuZCBmYWlsZWQgKi8KKy8qIENvbXBhdGliaWxpdHkgRXJyb3IgOiBJbnF1aXJ5IENvbW1hbmQgZmFpbGVkICovCiAjZGVmaW5lIElSX0xPR0lORk9fQ09NUEFUX0VSUk9SX0lOUVVJUllfRkFJTEVEICAgICAgICAgICAgICAgICAoMHgwMDAxMDAzMSkKIC8qIENvbXBhdGliaWxpdHkgRXJyb3IgOiBEZXZpY2Ugbm90IGRpcmVjdCBhY2Nlc3MgZGV2aWNlICovCiAjZGVmaW5lIElSX0xPR0lORk9fQ09NUEFUX0VSUk9SX05PVF9ESVJFQ1RfQUNDRVNTICAgICAgICAgICAgICAoMHgwMDAxMDAzMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKaW5kZXggM2U1N2I2MS4uMzM1OGMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKQEAgLTc5NzcsNyArNzk3Nyw3IEBACiAJCU5VTEwsCQkJCQkJLyogMkVoICovCiAJCU5VTEwsCQkJCQkJLyogMkZoICovCiAJCSJDb21wYXRpYmlsaXR5IEVycm9yOiBJUiBEaXNhYmxlZCIsCQkvKiAzMGggKi8KLQkJIkNvbXBhdGliaWxpdHkgRXJyb3I6IElucXVpcnkgQ29tYW5kIEZhaWxlZCIsCS8qIDMxaCAqLworCQkiQ29tcGF0aWJpbGl0eSBFcnJvcjogSW5xdWlyeSBDb21tYW5kIEZhaWxlZCIsCS8qIDMxaCAqLwogCQkiQ29tcGF0aWJpbGl0eSBFcnJvcjogRGV2aWNlIG5vdCBEaXJlY3QgQWNjZXNzICIKIAkJICAgICJEZXZpY2UgIiwJCQkJCS8qIDMyaCAqLwogCQkiQ29tcGF0aWJpbGl0eSBFcnJvcjogUmVtb3ZhYmxlIERldmljZSBGb3VuZCIsCS8qIDMzaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKaW5kZXggZDQ4YzJjNi4uOGFlZmIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCkBAIC0xMTQ2LDcgKzExNDYsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWxldGUgc2NoZWR1bGVkIHRhcmdldCByZXNldCBmcm9tIHRoZSBsaXN0IGFuZAogICogdHJ5IHRvIHNlbmQgbmV4dCB0YXJnZXQgcmVzZXQuIFRoaXMgd2lsbCBiZSBjYWxsZWQgZnJvbSBjb21wbGV0aW9uCi0gKiBjb250ZXh0IG9mIGFueSBUYXNrIG1hbmFnbWVudCBjb21tYW5kLgorICogY29udGV4dCBvZiBhbnkgVGFzayBtYW5hZ2VtZW50IGNvbW1hbmQuCiAgKi8KIAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKaW5kZXggZjg3YTlkNC4uYWU3Y2FkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCkBAIC0zMDksNyArMzA5LDcgQEAKICAqCUBpcmVxOiBJMk8gYmxvY2sgcmVxdWVzdAogICoJQG1wdHI6IG1lc3NhZ2UgYm9keSBwb2ludGVyCiAgKgotICoJQnVpbGRzIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQgdG8gYmUgYWNjZXNzYWJsZSBieSB0aGUgY29udHJvbGxlci4KKyAqCUJ1aWxkcyB0aGUgU0cgbGlzdCBhbmQgbWFwIGl0IHRvIGJlIGFjY2Vzc2libGUgYnkgdGhlIGNvbnRyb2xsZXIuCiAgKgogICoJUmV0dXJucyAwIG9uIGZhaWx1cmUgb3IgMSBvbiBzdWNjZXNzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC84OHBtODYweC1jb3JlLmMgYi9kcml2ZXJzL21mZC84OHBtODYweC1jb3JlLmMKaW5kZXggMjA4OTVlNy4uNzkzMzAwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvODhwbTg2MHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkLzg4cG04NjB4LWNvcmUuYwpAQCAtMzYxLDEyICszNjEsNiBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwbTg2MHhfaXJxX2RhdGEgKmlycV90b19wbTg2MHgoc3RydWN0IHBtODYweF9jaGlwICpjaGlwLAotCQkJCQkJICAgIGludCBpcnEpCi17Ci0JcmV0dXJuICZwbTg2MHhfaXJxc1tpcnEgLSBjaGlwLT5pcnFfYmFzZV07Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBwbTg2MHhfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZGF0YTsKQEAgLTM4OCwxNiArMzgyLDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBwbTg2MHhfaXJxX2xvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHBtODYweF9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgcG04NjB4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAogCW11dGV4X2xvY2soJmNoaXAtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgcG04NjB4X2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgcG04NjB4X2lycV9zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgcG04NjB4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAlzdHJ1Y3QgcG04NjB4X2lycV9kYXRhICppcnFfZGF0YTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwogCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhY2hlZFszXSA9IHsweDAsIDB4MCwgMHgwfTsKQEAgLTQzOSwyNSArNDMzLDI1IEBACiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHBtODYweF9pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBwbTg2MHhfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlwbTg2MHhfaXJxc1tpcnEgLSBjaGlwLT5pcnFfYmFzZV0uZW5hYmxlCi0JCT0gcG04NjB4X2lycXNbaXJxIC0gY2hpcC0+aXJxX2Jhc2VdLm9mZnM7CisJc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJcG04NjB4X2lycXNbZGF0YS0+aXJxIC0gY2hpcC0+aXJxX2Jhc2VdLmVuYWJsZQorCQk9IHBtODYweF9pcnFzW2RhdGEtPmlycSAtIGNoaXAtPmlycV9iYXNlXS5vZmZzOwogfQogCi1zdGF0aWMgdm9pZCBwbTg2MHhfaXJxX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHBtODYweF9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlwbTg2MHhfaXJxc1tpcnEgLSBjaGlwLT5pcnFfYmFzZV0uZW5hYmxlID0gMDsKKwlzdHJ1Y3QgcG04NjB4X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlwbTg2MHhfaXJxc1tkYXRhLT5pcnEgLSBjaGlwLT5pcnFfYmFzZV0uZW5hYmxlID0gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBwbTg2MHhfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIjg4cG04NjB4IiwKLQkuYnVzX2xvY2sJPSBwbTg2MHhfaXJxX2xvY2ssCi0JLmJ1c19zeW5jX3VubG9jayA9IHBtODYweF9pcnFfc3luY191bmxvY2ssCi0JLmVuYWJsZQkJPSBwbTg2MHhfaXJxX2VuYWJsZSwKLQkuZGlzYWJsZQk9IHBtODYweF9pcnFfZGlzYWJsZSwKKwkuaXJxX2J1c19sb2NrCT0gcG04NjB4X2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrID0gcG04NjB4X2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2VuYWJsZQk9IHBtODYweF9pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQk9IHBtODYweF9pcnFfZGlzYWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRldmljZV9ncGFkY19pbml0KHN0cnVjdCBwbTg2MHhfY2hpcCAqY2hpcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IGRhOWQyOTcuLmZkMDE4MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtNDk2LDEzICs0OTYsMTMgQEAKIAogY29uZmlnIEFCODUwMF9DT1JFCiAJYm9vbCAiU1QtRXJpY3Nzb24gQUI4NTAwIE1peGVkIFNpZ25hbCBQb3dlciBNYW5hZ2VtZW50IGNoaXAiCi0JZGVwZW5kcyBvbiBHRU5FUklDX0hBUkRJUlFTICYmIEFCWDUwMF9DT1JFICYmIFNQSV9NQVNURVIgJiYgQVJDSF9VODUwMAorCWRlcGVuZHMgb24gR0VORVJJQ19IQVJESVJRUyAmJiBBQlg1MDBfQ09SRQogCXNlbGVjdCBNRkRfQ09SRQogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgYWNjZXNzIHRvIEFCODUwMCBwb3dlciBtYW5hZ2VtZW50Ci0JICBjaGlwLiBUaGlzIGNvbm5lY3RzIHRvIFU4NTAwIGVpdGhlciBvbiB0aGUgU1NQL1NQSSBidXMKLQkgIG9yIHRoZSBJMkMgYnVzIHZpYSBQUkNNVS4gSXQgYWxzbyBhZGRzIHRoZSBpcnFfY2hpcAotCSAgcGFydHMgZm9yIGhhbmRsaW5nIHRoZSBNaXhlZCBTaWduYWwgY2hpcCBldmVudHMuCisJICBjaGlwLiBUaGlzIGNvbm5lY3RzIHRvIFU4NTAwIGVpdGhlciBvbiB0aGUgU1NQL1NQSSBidXMgKGRlcHJlY2F0ZWQKKwkgIHNpbmNlIGhhcmR3YXJlIHZlcnNpb24gdjEuMCkgb3IgdGhlIEkyQyBidXMgdmlhIFBSQ01VLiBJdCBhbHNvIGFkZHMKKwkgIHRoZSBpcnFfY2hpcCBwYXJ0cyBmb3IgaGFuZGxpbmcgdGhlIE1peGVkIFNpZ25hbCBjaGlwIGV2ZW50cy4KIAkgIFRoaXMgY2hpcCBlbWJlZHMgdmFyaW91cyBvdGhlciBtdWx0aW1lZGlhIGZ1bnRpb25hbGl0aWVzIGFzIHdlbGwuCiAKIGNvbmZpZyBBQjg1MDBfSTJDX0NPUkUKQEAgLTUzNyw2ICs1MzcsMTQgQEAKIAkgIExFRHMsIHZpYnJhdG9yLCBzeXN0ZW0gcG93ZXIgYW5kIHRlbXBlcmF0dXJlLCBwb3dlciBtYW5hZ2VtZW50CiAJICBhbmQgQUxTQSBzb3VuZC4KIAorY29uZmlnIE1GRF9DUzU1MzUKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQ1M1NTM1IGFuZCBDUzU1MzYgc291dGhicmlkZ2UgY29yZSBmdW5jdGlvbnMiCisJc2VsZWN0IE1GRF9DT1JFCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBjb3JlIGRyaXZlciBmb3IgQ1M1NTM1L0NTNTUzNiBNRkQgZnVuY3Rpb25zLiAgVGhpcyBpcworICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdXNpbmcgdGhlIGJvYXJkJ3MgR1BJTyBhbmQgTUZHUFQgZnVuY3Rpb25hbGl0eS4KKwogY29uZmlnIE1GRF9USU1CRVJEQUxFCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHRoZSBUaW1iZXJkYWxlIEZQR0EiCiAJc2VsZWN0IE1GRF9DT1JFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDg0OGU3ZWEuLmE1NGUyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC03MCw3ICs3MCw3IEBACiBvYmotJChDT05GSUdfQUIzMTAwX0NPUkUpCSs9IGFiMzEwMC1jb3JlLm8KIG9iai0kKENPTkZJR19BQjMxMDBfT1RQKQkrPSBhYjMxMDAtb3RwLm8KIG9iai0kKENPTkZJR19BQjM1NTBfQ09SRSkJKz0gYWIzNTUwLWNvcmUubwotb2JqLSQoQ09ORklHX0FCODUwMF9DT1JFKQkrPSBhYjg1MDAtY29yZS5vIGFiODUwMC1zcGkubworb2JqLSQoQ09ORklHX0FCODUwMF9DT1JFKQkrPSBhYjg1MDAtY29yZS5vCiBvYmotJChDT05GSUdfQUI4NTAwX0kyQ19DT1JFKQkrPSBhYjg1MDAtaTJjLm8KIG9iai0kKENPTkZJR19BQjg1MDBfREVCVUcpCSs9IGFiODUwMC1kZWJ1Z2ZzLm8KIG9iai0kKENPTkZJR19NRkRfVElNQkVSREFMRSkgICAgKz0gdGltYmVyZGFsZS5vCkBAIC04MiwzICs4Miw0IEBACiBvYmotJChDT05GSUdfTUZEX1RQUzY1ODZYKQkrPSB0cHM2NTg2eC5vCiBvYmotJChDT05GSUdfTUZEX1ZYODU1KQkJKz0gdng4NTUubwogb2JqLSQoQ09ORklHX01GRF9XTDEyNzNfQ09SRSkJKz0gd2wxMjczLWNvcmUubworb2JqLSQoQ09ORklHX01GRF9DUzU1MzUpCSs9IGNzNTUzNS1tZmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiMzU1MC1jb3JlLmMKaW5kZXggOGE5ODczOS4uNWZiY2EzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jCkBAIC0xMTU5LDE1ICsxMTU5LDE2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhYjM1NTBfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYWIzNTUwX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGFiMzU1MCAqYWI7CiAJc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKKwlpbnQgaXJxOwogCi0JYWIgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWFiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaXJxIC09IHBsZl9kYXRhLT5pcnEuYmFzZTsKKwlpcnEgPSBkYXRhLT5pcnEgLSBwbGZfZGF0YS0+aXJxLmJhc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlhYi0+ZXZlbnRfbWFza1tpcnEgLyA4XSB8PSBCSVQoaXJxICUgOCk7CkBAIC0xMTc2LDE1ICsxMTc3LDE2IEBACiAJc2NoZWR1bGVfd29yaygmYWItPm1hc2tfd29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIGFiMzU1MF91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFiMzU1MF91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGFiMzU1MCAqYWI7CiAJc3RydWN0IGFiMzU1MF9wbGF0Zm9ybV9kYXRhICpwbGZfZGF0YTsKKwlpbnQgaXJxOwogCi0JYWIgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWFiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJcGxmX2RhdGEgPSBhYi0+aTJjX2NsaWVudFswXS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaXJxIC09IHBsZl9kYXRhLT5pcnEuYmFzZTsKKwlpcnEgPSBkYXRhLT5pcnEgLSBwbGZfZGF0YS0+aXJxLmJhc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWItPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlhYi0+ZXZlbnRfbWFza1tpcnEgLyA4XSAmPSB+QklUKGlycSAlIDgpOwpAQCAtMTE5MywyMCArMTE5NSwxNiBAQAogCXNjaGVkdWxlX3dvcmsoJmFiLT5tYXNrX3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCBub29wKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBub29wKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhYjM1NTBfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gImFiMzU1MC1jb3JlIiwgLyogS2VlcCB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZXF1ZXN0ICovCi0JLnN0YXJ0dXAJPSBOVUxMLCAvKiBkZWZhdWx0cyB0byBlbmFibGUgKi8KLQkuc2h1dGRvd24JPSBOVUxMLCAvKiBkZWZhdWx0cyB0byBkaXNhYmxlICovCi0JLmVuYWJsZQkJPSBOVUxMLCAvKiBkZWZhdWx0cyB0byB1bm1hc2sgKi8KLQkuZGlzYWJsZQk9IGFiMzU1MF9tYXNrLCAvKiBObyBkZWZhdWx0IHRvIG1hc2sgaW4gY2hpcC5jICovCi0JLmFjawkJPSBub29wLAotCS5tYXNrCQk9IGFiMzU1MF9tYXNrLAotCS51bm1hc2sJCT0gYWIzNTUwX3VubWFzaywKLQkuZW5kCQk9IE5VTEwsCisJLmlycV9kaXNhYmxlCT0gYWIzNTUwX21hc2ssIC8qIE5vIGRlZmF1bHQgdG8gbWFzayBpbiBjaGlwLmMgKi8KKwkuaXJxX2Fjawk9IG5vb3AsCisJLmlycV9tYXNrCT0gYWIzNTUwX21hc2ssCisJLmlycV91bm1hc2sJPSBhYjM1NTBfdW5tYXNrLAogfTsKIAogc3RydWN0IGFiX2ZhbWlseV9pZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYwppbmRleCBkOTY0MGE2Li5iNjg4NzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKQEAgLTUyLDYgKzUyLDcgQEAKICNkZWZpbmUgQUI4NTAwX0lUX0xBVENIOF9SRUcJCTB4MjcKICNkZWZpbmUgQUI4NTAwX0lUX0xBVENIOV9SRUcJCTB4MjgKICNkZWZpbmUgQUI4NTAwX0lUX0xBVENIMTBfUkVHCQkweDI5CisjZGVmaW5lIEFCODUwMF9JVF9MQVRDSDEyX1JFRwkJMHgyQgogI2RlZmluZSBBQjg1MDBfSVRfTEFUQ0gxOV9SRUcJCTB4MzIKICNkZWZpbmUgQUI4NTAwX0lUX0xBVENIMjBfUkVHCQkweDMzCiAjZGVmaW5lIEFCODUwMF9JVF9MQVRDSDIxX1JFRwkJMHgzNApAQCAtOTgsMTMgKzk5LDE3IEBACiAgKiBvZmZzZXQgMC4KICAqLwogc3RhdGljIGNvbnN0IGludCBhYjg1MDBfaXJxX3JlZ29mZnNldFtBQjg1MDBfTlVNX0lSUV9SRUdTXSA9IHsKLQkwLCAxLCAyLCAzLCA0LCA2LCA3LCA4LCA5LCAxOCwgMTksIDIwLCAyMSwKKwkwLCAxLCAyLCAzLCA0LCA2LCA3LCA4LCA5LCAxMSwgMTgsIDE5LCAyMCwgMjEsCiB9OwogCiBzdGF0aWMgaW50IGFiODUwMF9nZXRfY2hpcF9pZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGFiODUwMCAqYWI4NTAwID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlyZXR1cm4gKGludClhYjg1MDAtPmNoaXBfaWQ7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWFiODUwMCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJcmV0dXJuIGFiODUwMCA/IChpbnQpYWI4NTAwLT5jaGlwX2lkIDogLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBzZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgYWI4NTAwICphYjg1MDAsIHU4IGJhbmssCkBAIC0yMjgsMTYgKzIzMywxNiBAQAogCS5zdGFydHVwX2lycV9lbmFibGVkID0gTlVMTCwKIH07CiAKLXN0YXRpYyB2b2lkIGFiODUwMF9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYWI4NTAwX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWI4NTAwICphYjg1MDAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBhYjg1MDAgKmFiODUwMCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmYWI4NTAwLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGFiODUwMF9pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFiODUwMF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhYjg1MDAgKmFiODUwMCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUI4NTAwX05VTV9JUlFfUkVHUzsgaSsrKSB7CkBAIC0yNDgsNiArMjUzLDEwIEBACiAJCWlmIChuZXcgPT0gb2xkKQogCQkJY29udGludWU7CiAKKwkJLyogSW50ZXJydXB0IHJlZ2lzdGVyIDEyIGRvZXMnbnQgZXhpc3QgcHJpb3IgdG8gdmVyc2lvbiAweDIwICovCisJCWlmIChhYjg1MDBfaXJxX3JlZ29mZnNldFtpXSA9PSAxMSAmJiBhYjg1MDAtPmNoaXBfaWQgPCAweDIwKQorCQkJY29udGludWU7CisKIAkJYWI4NTAwLT5vbGRtYXNrW2ldID0gbmV3OwogCiAJCXJlZyA9IEFCODUwMF9JVF9NQVNLMV9SRUcgKyBhYjg1MDBfaXJxX3JlZ29mZnNldFtpXTsKQEAgLTI1NywyMCArMjY2LDIwIEBACiAJbXV0ZXhfdW5sb2NrKCZhYjg1MDAtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgYWI4NTAwX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBhYjg1MDBfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhYjg1MDAgKmFiODUwMCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIGFiODUwMC0+aXJxX2Jhc2U7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IG9mZnNldCA9IGRhdGEtPmlycSAtIGFiODUwMC0+aXJxX2Jhc2U7CiAJaW50IGluZGV4ID0gb2Zmc2V0IC8gODsKIAlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOwogCiAJYWI4NTAwLT5tYXNrW2luZGV4XSB8PSBtYXNrOwogfQogCi1zdGF0aWMgdm9pZCBhYjg1MDBfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYWI4NTAwX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhYjg1MDAgKmFiODUwMCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIGFiODUwMC0+aXJxX2Jhc2U7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IG9mZnNldCA9IGRhdGEtPmlycSAtIGFiODUwMC0+aXJxX2Jhc2U7CiAJaW50IGluZGV4ID0gb2Zmc2V0IC8gODsKIAlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOwogCkBAIC0yNzksMTAgKzI4OCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFiODUwMF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJCT0gImFiODUwMCIsCi0JLmJ1c19sb2NrCQk9IGFiODUwMF9pcnFfbG9jaywKLQkuYnVzX3N5bmNfdW5sb2NrCT0gYWI4NTAwX2lycV9zeW5jX3VubG9jaywKLQkubWFzawkJCT0gYWI4NTAwX2lycV9tYXNrLAotCS51bm1hc2sJCQk9IGFiODUwMF9pcnFfdW5tYXNrLAorCS5pcnFfYnVzX2xvY2sJCT0gYWI4NTAwX2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gYWI4NTAwX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX21hc2sJCT0gYWI4NTAwX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCQk9IGFiODUwMF9pcnFfdW5tYXNrLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IGFiODUwMF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQpAQCAtMjk3LDYgKzMwNiwxMCBAQAogCQlpbnQgc3RhdHVzOwogCQl1OCB2YWx1ZTsKIAorCQkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgMTIgZG9lcydudCBleGlzdCBwcmlvciB0byB2ZXJzaW9uIDB4MjAgKi8KKwkJaWYgKHJlZ29mZnNldCA9PSAxMSAmJiBhYjg1MDAtPmNoaXBfaWQgPCAweDIwKQorCQkJY29udGludWU7CisKIAkJc3RhdHVzID0gZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwLCBBQjg1MDBfSU5URVJSVVBULAogCQkJQUI4NTAwX0lUX0xBVENIMV9SRUcgKyByZWdvZmZzZXQsICZ2YWx1ZSk7CiAJCWlmIChzdGF0dXMgPCAwIHx8IHZhbHVlID09IDApCkBAIC0zOTMsMTMgKzQwNiwxOTUgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfYm1fcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZSA9ICJNQUlOX0VYVF9DSF9OT1RfT0siLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX01BSU5fRVhUX0NIX05PVF9PSywKKwkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQkFUVF9PVlYiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0JBVFRfT1ZWLAorCQkuZW5kID0gQUI4NTAwX0lOVF9CQVRUX09WViwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1BSU5fQ0hfVU5QTFVHX0RFVCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9VTlBMVUdfREVULAorCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0NIX1VOUExVR19ERVQsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJNQUlOX0NIQVJHRV9QTFVHX0RFVCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9QTFVHX0RFVCwKKwkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9DSF9QTFVHX0RFVCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZCVVNfREVUX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX0YsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX0YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJWQlVTX0RFVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiQkFUX0NUUkxfSU5EQiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkNIX1dEX0VYUCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0hfV0RfRVhQLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DSF9XRF9FWFAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJWQlVTX09WViIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVkJVU19PVlYsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1ZCVVNfT1ZWLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTkNPTlZfQUNDVSIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0NOX0NPTlZfQUNDLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DQ05fQ09OVl9BQ0MsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJMT1dfQkFUX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0xPV19CQVRfRiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfTE9XX0JBVF9GLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTE9XX0JBVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9MT1dfQkFUX1IsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0xPV19CQVRfUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkJURU1QX0xPVyIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQlRFTVBfTE9XLAorCQkuZW5kID0gQUI4NTAwX0lOVF9CVEVNUF9MT1csCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJCVEVNUF9ISUdIIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9CVEVNUF9ISUdILAorCQkuZW5kID0gQUI4NTAwX0lOVF9CVEVNUF9ISUdILAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0NIQVJHRVJfTk9UX09LUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LLAorCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0ssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJVU0JfQ0hBUkdFX0RFVF9ET05FIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAorCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0NIX1RIX1BST1RfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1BSU5fQ0hfVEhfUFJPVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfUiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJVU0JfQ0hBUkdFUl9OT1RfT0tGIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAorCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfZGVidWdfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJJUlFfRklSU1QiLAorCQkuc3RhcnQJPSBBQjg1MDBfSU5UX01BSU5fRVhUX0NIX05PVF9PSywKKwkJLmVuZAk9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiSVJRX0xBU1QiLAorCQkuc3RhcnQJPSBBQjg1MDBfSU5UX1VTQl9DSEFSR0VSX05PVF9PS0YsCisJCS5lbmQJPSBBQjg1MDBfSU5UX1VTQl9DSEFSR0VSX05PVF9PS0YsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFiODUwMF91c2JfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZSA9ICJJRF9XQUtFVVBfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfSURfV0FLRVVQX1IsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0lEX1dBS0VVUF9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSURfV0FLRVVQX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0lEX1dBS0VVUF9GLAorCQkuZW5kID0gQUI4NTAwX0lOVF9JRF9XQUtFVVBfRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZCVVNfREVUX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX0YsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX0YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJWQlVTX0RFVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0xJTktfU1RBVFVTIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfTElOS19TVEFUVVMsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9MSU5LX1NUQVRVUywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWI4NTAwX3RlbXBfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZSAgPSAiQUI4NTAwX1RFTVBfV0FSTSIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVEVNUF9XQVJNLAorCQkuZW5kICAgPSBBQjg1MDBfSU5UX1RFTVBfV0FSTSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYWI4NTAwX2RldnNbXSA9IHsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAl7CiAJCS5uYW1lID0gImFiODUwMC1kZWJ1ZyIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfZGVidWdfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IGFiODUwMF9kZWJ1Z19yZXNvdXJjZXMsCiAJfSwKICNlbmRpZgogCXsKKwkJLm5hbWUgPSAiYWI4NTAwLXN5c2N0cmwiLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtcmVndWxhdG9yIiwKKwl9LAorCXsKIAkJLm5hbWUgPSAiYWI4NTAwLWdwYWRjIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF9ncGFkY19yZXNvdXJjZXMpLAogCQkucmVzb3VyY2VzID0gYWI4NTAwX2dwYWRjX3Jlc291cmNlcywKQEAgLTQxMCw2ICs2MDUsMjIgQEAKIAkJLnJlc291cmNlcyA9IGFiODUwMF9ydGNfcmVzb3VyY2VzLAogCX0sCiAJeworCQkubmFtZSA9ICJhYjg1MDAtYm0iLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2JtX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfYm1fcmVzb3VyY2VzLAorCX0sCisJeyAubmFtZSA9ICJhYjg1MDAtY29kZWMiLCB9LAorCXsKKwkJLm5hbWUgPSAiYWI4NTAwLXVzYiIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfdXNiX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfdXNiX3Jlc291cmNlcywKKwl9LAorCXsKKwkJLm5hbWUgPSAiYWI4NTAwLXBvd2Vyb24ta2V5IiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF9wb3dlcm9ua2V5X2RiX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfcG93ZXJvbmtleV9kYl9yZXNvdXJjZXMsCisJfSwKKwl7CiAJCS5uYW1lID0gImFiODUwMC1wd20iLAogCQkuaWQgPSAxLAogCX0sCkBAIC00MjEsMTUgKzYzMiwzNSBAQAogCQkubmFtZSA9ICJhYjg1MDAtcHdtIiwKIAkJLmlkID0gMywKIAl9LAotCXsgLm5hbWUgPSAiYWI4NTAwLWNoYXJnZXIiLCB9LAotCXsgLm5hbWUgPSAiYWI4NTAwLWF1ZGlvIiwgfSwKLQl7IC5uYW1lID0gImFiODUwMC11c2IiLCB9LAotCXsgLm5hbWUgPSAiYWI4NTAwLXJlZ3VsYXRvciIsIH0sCisJeyAubmFtZSA9ICJhYjg1MDAtbGVkcyIsIH0sCiAJewotCQkubmFtZSA9ICJhYjg1MDAtcG93ZXJvbi1rZXkiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX3Bvd2Vyb25rZXlfZGJfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IGFiODUwMF9wb3dlcm9ua2V5X2RiX3Jlc291cmNlcywKKwkJLm5hbWUgPSAiYWI4NTAwLWRlbmMiLAogCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtdGVtcCIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfdGVtcF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gYWI4NTAwX3RlbXBfcmVzb3VyY2VzLAorCX0sCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2NoaXBfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFiODUwMCAqYWI4NTAwOworCisJYWI4NTAwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSN4XG4iLCBhYjg1MDAgPyBhYjg1MDAtPmNoaXBfaWQgOiAtRUlOVkFMKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNoaXBfaWQsIFNfSVJVR08sIHNob3dfY2hpcF9pZCwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphYjg1MDBfc3lzZnNfZW50cmllc1tdID0geworCSZkZXZfYXR0cl9jaGlwX2lkLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFiODUwMF9hdHRyX2dyb3VwID0geworCS5hdHRycwk9IGFiODUwMF9zeXNmc19lbnRyaWVzLAogfTsKIAogaW50IF9fZGV2aW5pdCBhYjg1MDBfaW5pdChzdHJ1Y3QgYWI4NTAwICphYjg1MDApCkBAIC00NTQsOCArNjg1LDkgQEAKIAkgKiAweDAgLSBFYXJseSBEcm9wCiAJICogMHgxMCAtIEN1dCAxLjAKIAkgKiAweDExIC0gQ3V0IDEuMQorCSAqIDB4MjAgLSBDdXQgMi4wCiAJICovCi0JaWYgKHZhbHVlID09IDB4MCB8fCB2YWx1ZSA9PSAweDEwIHx8IHZhbHVlID09IDB4MTEpIHsKKwlpZiAodmFsdWUgPT0gMHgwIHx8IHZhbHVlID09IDB4MTAgfHwgdmFsdWUgPT0gMHgxMSB8fCB2YWx1ZSA9PSAweDIwKSB7CiAJCWFiODUwMC0+cmV2aXNpb24gPSB2YWx1ZTsKIAkJZGV2X2luZm8oYWI4NTAwLT5kZXYsICJkZXRlY3RlZCBjaGlwLCByZXZpc2lvbjogJSN4XG4iLCB2YWx1ZSk7CiAJfSBlbHNlIHsKQEAgLTQ2OCwxOCArNzAwLDE2IEBACiAJCXBsYXQtPmluaXQoYWI4NTAwKTsKIAogCS8qIENsZWFyIGFuZCBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwLCBBQjg1MDBfSU5URVJSVVBULAotCQkJQUI4NTAwX0lUX0xBVENIMV9SRUcgKyBpLCAmdmFsdWUpOwotCQlzZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYjg1MDAsIEFCODUwMF9JTlRFUlJVUFQsCi0JCQlBQjg1MDBfSVRfTUFTSzFfUkVHICsgaSwgMHhmZik7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBBQjg1MDBfTlVNX0lSUV9SRUdTOyBpKyspIHsKKwkJLyogSW50ZXJydXB0IHJlZ2lzdGVyIDEyIGRvZXMnbnQgZXhpc3QgcHJpb3IgdG8gdmVyc2lvbiAweDIwICovCisJCWlmIChhYjg1MDBfaXJxX3JlZ29mZnNldFtpXSA9PSAxMSAmJiBhYjg1MDAtPmNoaXBfaWQgPCAweDIwKQorCQkJY29udGludWU7CiAKLQlmb3IgKGkgPSAxODsgaSA8IDI0OyBpKyspIHsKIAkJZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWI4NTAwLCBBQjg1MDBfSU5URVJSVVBULAotCQkJQUI4NTAwX0lUX0xBVENIMV9SRUcgKyBpLCAmdmFsdWUpOworCQkJQUI4NTAwX0lUX0xBVENIMV9SRUcgKyBhYjg1MDBfaXJxX3JlZ29mZnNldFtpXSwKKwkJCSZ2YWx1ZSk7CiAJCXNldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiODUwMCwgQUI4NTAwX0lOVEVSUlVQVCwKLQkJCUFCODUwMF9JVF9NQVNLMV9SRUcgKyBpLCAweGZmKTsKKwkJCUFCODUwMF9JVF9NQVNLMV9SRUcgKyBhYjg1MDBfaXJxX3JlZ29mZnNldFtpXSwgMHhmZik7CiAJfQogCiAJcmV0ID0gYWJ4NTAwX3JlZ2lzdGVyX29wcyhhYjg1MDAtPmRldiwgJmFiODUwMF9vcHMpOwpAQCAtNDk1LDcgKzcyNSw4IEBACiAJCQlyZXR1cm4gcmV0OwogCiAJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGFiODUwMC0+aXJxLCBOVUxMLCBhYjg1MDBfaXJxLAotCQkJCQkgICBJUlFGX09ORVNIT1QsICJhYjg1MDAiLCBhYjg1MDApOworCQkJCQkgICBJUlFGX09ORVNIT1QgfCBJUlFGX05PX1NVU1BFTkQsCisJCQkJCSAgICJhYjg1MDAiLCBhYjg1MDApOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfcmVtb3ZlaXJxOwogCX0KQEAgLTUwNiw2ICs3MzcsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9mcmVlaXJxOwogCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZhYjg1MDAtPmRldi0+a29iaiwgJmFiODUwMF9hdHRyX2dyb3VwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGFiODUwMC0+ZGV2LCAiZXJyb3IgY3JlYXRpbmcgc3lzZnMgZW50cmllc1xuIik7CisKIAlyZXR1cm4gcmV0OwogCiBvdXRfZnJlZWlycToKQEAgLTUxOSw2ICs3NTQsNyBAQAogCiBpbnQgX19kZXZleGl0IGFiODUwMF9leGl0KHN0cnVjdCBhYjg1MDAgKmFiODUwMCkKIHsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmFiODUwMC0+ZGV2LT5rb2JqLCAmYWI4NTAwX2F0dHJfZ3JvdXApOwogCW1mZF9yZW1vdmVfZGV2aWNlcyhhYjg1MDAtPmRldik7CiAJaWYgKGFiODUwMC0+aXJxX2Jhc2UpIHsKIAkJZnJlZV9pcnEoYWI4NTAwLT5pcnEsIGFiODUwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwppbmRleCA4ZDFlMDVhLi4zYzE1NDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKQEAgLTI0LDkgKzI0LDkgQEAKICAqIEBwZXJtOiBhY2Nlc3MgcGVybWlzc2lvbnMgZm9yIHRoZSByYW5nZQogICovCiBzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZSB7Ci0gICAgICAgdTggZmlyc3Q7Ci0gICAgICAgdTggbGFzdDsKLSAgICAgICB1OCBwZXJtOworCXU4IGZpcnN0OworCXU4IGxhc3Q7CisJdTggcGVybTsKIH07CiAKIC8qKgpAQCAtMzYsOSArMzYsOSBAQAogICogQHJhbmdlOiB0aGUgbGlzdCBvZiByZWdpc3RlciByYW5nZXMKICAqLwogc3RydWN0IGFiODUwMF9pMmNfcmFuZ2VzIHsKLSAgICAgICB1OCBudW1fcmFuZ2VzOwotICAgICAgIHU4IGJhbmtpZDsKLSAgICAgICBjb25zdCBzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZSAqcmFuZ2U7CisJdTggbnVtX3JhbmdlczsKKwl1OCBiYW5raWQ7CisJY29uc3Qgc3RydWN0IGFiODUwMF9yZWdfcmFuZ2UgKnJhbmdlOwogfTsKIAogI2RlZmluZSBBQjg1MDBfTkFNRV9TVFJJTkcgImFiODUwMCIKQEAgLTQ3LDUyMSArNDcsNTIxIEBACiAjZGVmaW5lIEFCODUwMF9SRVZfUkVHIDB4ODAKIAogc3RhdGljIHN0cnVjdCBhYjg1MDBfaTJjX3JhbmdlcyBkZWJ1Z19yYW5nZXNbQUI4NTAwX05VTV9CQU5LU10gPSB7Ci0gICAgICAgWzB4MF0gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDAsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAwLAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9TWVNfQ1RSTDFfQkxPQ0tdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAzLAotICAgICAgICAgICAgICAgLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDAyLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NDIsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICBbQUI4NTAwX1NZU19DVFJMMl9CTE9DS10gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDQsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MEQsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDBGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgxNywKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDMwLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MzMsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9SRUdVX0NUUkwxXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gMywKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDEwLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4ODQsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9SRUdVX0NUUkwyXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gNSwKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDE5LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgxQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MUQsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDFGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgyMiwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4NDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDQ0LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAvKiAweDgwLTB4OEIgaXMgU0lNIHJlZ2lzdGVycyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG5vdCBiZSBhY2Nlc3NlZCBmcm9tIGhlcmUgKi8KLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICBbQUI4NTAwX1VTQl0gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDIsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4ODMsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDg3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg4QSwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICBbQUI4NTAwX1RWT1VUXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gOSwKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDE3LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgxOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MjEsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDI3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgyQywKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4NDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDQxLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg0NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NUIsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg1RCwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4NjksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDY5LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4ODEsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9EQkldID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAwLAotICAgICAgICAgICAgICAgLnJhbmdlID0gMCwKLSAgICAgICB9LAotICAgICAgIFtBQjg1MDBfRUNJX0FWX0FDQ10gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDEsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgWzB4OV0gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDAsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAwLAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9HUEFEQ10gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDEsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MDgsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9DSEFSR0VSXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gOCwKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgwMywKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NDAsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDQ0LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NTUsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4QzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweEMyLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgfSwKLSAgICAgICB9LAotICAgICAgIFtBQjg1MDBfR0FTX0dBVUdFXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gMywKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDBBLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MTQsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9BVURJT10gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDEsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NkYsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgW0FCODUwMF9JTlRFUlJVUFRdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAwLAotICAgICAgICAgICAgICAgLnJhbmdlID0gMCwKLSAgICAgICB9LAotICAgICAgIFtBQjg1MDBfUlRDXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gMSwKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgwRiwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIH0sCi0gICAgICAgfSwKLSAgICAgICBbQUI4NTAwX01JU0NdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSA4LAotICAgICAgICAgICAgICAgLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDA1LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHgxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4MTUsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHgyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDM1LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4NDUsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QgPSAweDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sYXN0ID0gMHg1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4NjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDY3LAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpcnN0ID0gMHg4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGFzdCA9IDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICB9LAotICAgICAgIH0sCi0gICAgICAgWzB4MTFdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAwLAotICAgICAgICAgICAgICAgLnJhbmdlID0gMCwKLSAgICAgICB9LAotICAgICAgIFsweDEyXSA9IHsKLSAgICAgICAgICAgICAgIC5udW1fcmFuZ2VzID0gMCwKLSAgICAgICAgICAgICAgIC5yYW5nZSA9IDAsCi0gICAgICAgfSwKLSAgICAgICBbMHgxM10gPSB7Ci0gICAgICAgICAgICAgICAubnVtX3JhbmdlcyA9IDAsCi0gICAgICAgICAgICAgICAucmFuZ2UgPSAwLAotICAgICAgIH0sCi0gICAgICAgWzB4MTRdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAwLAotICAgICAgICAgICAgICAgLnJhbmdlID0gMCwKLSAgICAgICB9LAotICAgICAgIFtBQjg1MDBfT1RQX0VNVUxdID0gewotICAgICAgICAgICAgICAgLm51bV9yYW5nZXMgPSAxLAotICAgICAgICAgICAgICAgLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCA9IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3QgPSAweDBGLAotICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgfSwKLSAgICAgICB9LAorCVsweDBdID0geworCQkubnVtX3JhbmdlcyA9IDAsCisJCS5yYW5nZSA9IDAsCisJfSwKKwlbQUI4NTAwX1NZU19DVFJMMV9CTE9DS10gPSB7CisJCS5udW1fcmFuZ2VzID0gMywKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwMiwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MiwKKwkJCQkubGFzdCA9IDB4NDIsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJLmxhc3QgPSAweDgxLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfU1lTX0NUUkwyX0JMT0NLXSA9IHsKKwkJLm51bV9yYW5nZXMgPSA0LAorCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDBELAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDBGLAorCQkJCS5sYXN0ID0gMHgxNywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgzMCwKKwkJCQkubGFzdCA9IDB4MzAsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MzIsCisJCQkJLmxhc3QgPSAweDMzLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfUkVHVV9DVFJMMV0gPSB7CisJCS5udW1fcmFuZ2VzID0gMywKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwMCwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMywKKwkJCQkubGFzdCA9IDB4MTAsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODAsCisJCQkJLmxhc3QgPSAweDg0LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfUkVHVV9DVFJMMl0gPSB7CisJCS5udW1fcmFuZ2VzID0gNSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgxNSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxNywKKwkJCQkubGFzdCA9IDB4MTksCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MUIsCisJCQkJLmxhc3QgPSAweDFELAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDFGLAorCQkJCS5sYXN0ID0gMHgyMiwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MCwKKwkJCQkubGFzdCA9IDB4NDQsCisJCQl9LAorCQkJLyogMHg4MC0weDhCIGlzIFNJTSByZWdpc3RlcnMgYW5kIHNob3VsZAorCQkJICogbm90IGJlIGFjY2Vzc2VkIGZyb20gaGVyZSAqLworCQl9LAorCX0sCisJW0FCODUwMF9VU0JdID0geworCQkubnVtX3JhbmdlcyA9IDIsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHg4MCwKKwkJCQkubGFzdCA9IDB4ODMsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4ODcsCisJCQkJLmxhc3QgPSAweDhBLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfVFZPVVRdID0geworCQkubnVtX3JhbmdlcyA9IDksCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MTIsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MTUsCisJCQkJLmxhc3QgPSAweDE3LAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDE5LAorCQkJCS5sYXN0ID0gMHgyMSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgyNywKKwkJCQkubGFzdCA9IDB4MkMsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDEsCisJCQkJLmxhc3QgPSAweDQxLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQ1LAorCQkJCS5sYXN0ID0gMHg1QiwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg1RCwKKwkJCQkubGFzdCA9IDB4NUQsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NjksCisJCQkJLmxhc3QgPSAweDY5LAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDgwLAorCQkJCS5sYXN0ID0gMHg4MSwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI4NTAwX0RCSV0gPSB7CisJCS5udW1fcmFuZ2VzID0gMCwKKwkJLnJhbmdlID0gTlVMTCwKKwl9LAorCVtBQjg1MDBfRUNJX0FWX0FDQ10gPSB7CisJCS5udW1fcmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDgwLAorCQkJCS5sYXN0ID0gMHg4MiwKKwkJCX0sCisJCX0sCisJfSwKKwlbMHg5XSA9IHsKKwkJLm51bV9yYW5nZXMgPSAwLAorCQkucmFuZ2UgPSBOVUxMLAorCX0sCisJW0FCODUwMF9HUEFEQ10gPSB7CisJCS5udW1fcmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwOCwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI4NTAwX0NIQVJHRVJdID0geworCQkubnVtX3JhbmdlcyA9IDgsCisJCS5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7CisJCQl7CisJCQkJLmZpcnN0ID0gMHgwMCwKKwkJCQkubGFzdCA9IDB4MDMsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MDUsCisJCQkJLmxhc3QgPSAweDA1LAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDQwLAorCQkJCS5sYXN0ID0gMHg0MCwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MiwKKwkJCQkubGFzdCA9IDB4NDIsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NDQsCisJCQkJLmxhc3QgPSAweDQ0LAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDUwLAorCQkJCS5sYXN0ID0gMHg1NSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg4MCwKKwkJCQkubGFzdCA9IDB4ODIsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4QzAsCisJCQkJLmxhc3QgPSAweEMyLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfR0FTX0dBVUdFXSA9IHsKKwkJLm51bV9yYW5nZXMgPSAzLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDAwLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDA3LAorCQkJCS5sYXN0ID0gMHgwQSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMCwKKwkJCQkubGFzdCA9IDB4MTQsCisJCQl9LAorCQl9LAorCX0sCisJW0FCODUwMF9BVURJT10gPSB7CisJCS5udW1fcmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHg2RiwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI4NTAwX0lOVEVSUlVQVF0gPSB7CisJCS5udW1fcmFuZ2VzID0gMCwKKwkJLnJhbmdlID0gTlVMTCwKKwl9LAorCVtBQjg1MDBfUlRDXSA9IHsKKwkJLm51bV9yYW5nZXMgPSAxLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDAsCisJCQkJLmxhc3QgPSAweDBGLAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfTUlTQ10gPSB7CisJCS5udW1fcmFuZ2VzID0gOCwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwNSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHgxMCwKKwkJCQkubGFzdCA9IDB4MTUsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4MjAsCisJCQkJLmxhc3QgPSAweDI1LAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDMwLAorCQkJCS5sYXN0ID0gMHgzNSwKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg0MCwKKwkJCQkubGFzdCA9IDB4NDUsCisJCQl9LAorCQkJeworCQkJCS5maXJzdCA9IDB4NTAsCisJCQkJLmxhc3QgPSAweDUwLAorCQkJfSwKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDYwLAorCQkJCS5sYXN0ID0gMHg2NywKKwkJCX0sCisJCQl7CisJCQkJLmZpcnN0ID0gMHg4MCwKKwkJCQkubGFzdCA9IDB4ODAsCisJCQl9LAorCQl9LAorCX0sCisJWzB4MTFdID0geworCQkubnVtX3JhbmdlcyA9IDAsCisJCS5yYW5nZSA9IE5VTEwsCisJfSwKKwlbMHgxMl0gPSB7CisJCS5udW1fcmFuZ2VzID0gMCwKKwkJLnJhbmdlID0gTlVMTCwKKwl9LAorCVsweDEzXSA9IHsKKwkJLm51bV9yYW5nZXMgPSAwLAorCQkucmFuZ2UgPSBOVUxMLAorCX0sCisJWzB4MTRdID0geworCQkubnVtX3JhbmdlcyA9IDAsCisJCS5yYW5nZSA9IE5VTEwsCisJfSwKKwlbQUI4NTAwX09UUF9FTVVMXSA9IHsKKwkJLm51bV9yYW5nZXMgPSAxLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDEsCisJCQkJLmxhc3QgPSAweDBGLAorCQkJfSwKKwkJfSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhYjg1MDBfcmVnaXN0ZXJzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzLT5wcml2YXRlOwotICAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgIHUzMiBiYW5rID0gZGVidWdfYmFuazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBpOworCXUzMiBiYW5rID0gZGVidWdfYmFuazsKIAotICAgICAgIHNlcV9wcmludGYocywgQUI4NTAwX05BTUVfU1RSSU5HICIgcmVnaXN0ZXIgdmFsdWVzOlxuIik7CisJc2VxX3ByaW50ZihzLCBBQjg1MDBfTkFNRV9TVFJJTkcgIiByZWdpc3RlciB2YWx1ZXM6XG4iKTsKIAotICAgICAgIHNlcV9wcmludGYocywgIiBiYW5rICV1OlxuIiwgYmFuayk7Ci0gICAgICAgZm9yIChpID0gMDsgaSA8IGRlYnVnX3Jhbmdlc1tiYW5rXS5udW1fcmFuZ2VzOyBpKyspIHsKLSAgICAgICAgICAgICAgIHUzMiByZWc7CisJc2VxX3ByaW50ZihzLCAiIGJhbmsgJXU6XG4iLCBiYW5rKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGVidWdfcmFuZ2VzW2JhbmtdLm51bV9yYW5nZXM7IGkrKykgeworCQl1MzIgcmVnOwogCi0gICAgICAgICAgICAgICBmb3IgKHJlZyA9IGRlYnVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgcmVnIDw9IGRlYnVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICByZWcrKykgewotICAgICAgICAgICAgICAgICAgICAgICB1OCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycjsKKwkJZm9yIChyZWcgPSBkZWJ1Z19yYW5nZXNbYmFua10ucmFuZ2VbaV0uZmlyc3Q7CisJCQlyZWcgPD0gZGVidWdfcmFuZ2VzW2JhbmtdLnJhbmdlW2ldLmxhc3Q7CisJCQlyZWcrKykgeworCQkJdTggdmFsdWU7CisJCQlpbnQgZXJyOwogCi0gICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KWJhbmssICh1OClyZWcsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycihkZXYsICJhYi0+cmVhZCBmYWlsICVkXG4iLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWVyciA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCisJCQkJKHU4KWJhbmssICh1OClyZWcsICZ2YWx1ZSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWRldl9lcnIoZGV2LCAiYWItPnJlYWQgZmFpbCAlZFxuIiwgZXJyKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQogCi0gICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNlcV9wcmludGYocywgIiAgWyV1LzB4JTAyWF06IDB4JTAyWFxuIiwgYmFuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKGRldiwgInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yIGlzIG5vdCByZXR1cm5lZCBoZXJlIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIG91dHB1dCBpcyB3YW50ZWQgaW4gYW55IGNhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gMDsKKwkJCWVyciA9IHNlcV9wcmludGYocywgIiAgWyV1LzB4JTAyWF06IDB4JTAyWFxuIiwgYmFuaywKKwkJCQlyZWcsIHZhbHVlKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJZGV2X2VycihkZXYsICJzZXFfcHJpbnRmIG92ZXJmbG93XG4iKTsKKwkJCQkvKiBFcnJvciBpcyBub3QgcmV0dXJuZWQgaGVyZSBzaW5jZQorCQkJCSAqIHRoZSBvdXRwdXQgaXMgd2FudGVkIGluIGFueSBjYXNlICovCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX3JlZ2lzdGVyc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotICAgICAgIHJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjg1MDBfcmVnaXN0ZXJzX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI4NTAwX3JlZ2lzdGVyc19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiODUwMF9yZWdpc3RlcnNfZm9wcyA9IHsKLSAgICAgICAub3BlbiA9IGFiODUwMF9yZWdpc3RlcnNfb3BlbiwKLSAgICAgICAucmVhZCA9IHNlcV9yZWFkLAotICAgICAgIC5sbHNlZWsgPSBzZXFfbHNlZWssCi0gICAgICAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLSAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFiODUwMF9yZWdpc3RlcnNfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2JhbmtfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewotICAgICAgIHJldHVybiBzZXFfcHJpbnRmKHMsICIlZFxuIiwgZGVidWdfYmFuayk7CisJcmV0dXJuIHNlcV9wcmludGYocywgIiVkXG4iLCBkZWJ1Z19iYW5rKTsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfYmFua19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotICAgICAgIHJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjg1MDBfYmFua19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiODUwMF9iYW5rX3ByaW50LCBpbm9kZS0+aV9wcml2YXRlKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWI4NTAwX2Jhbmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0gICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLSAgICAgICBjaGFyIGJ1ZlszMl07Ci0gICAgICAgaW50IGJ1Zl9zaXplOwotICAgICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOwotICAgICAgIGludCBlcnI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVzZXJfYmFuazsKKwlpbnQgZXJyOwogCi0gICAgICAgLyogR2V0IHVzZXJzcGFjZSBzdHJpbmcgYW5kIGFzc3VyZSB0ZXJtaW5hdGlvbiAqLwotICAgICAgIGJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZikgLSAxKSk7Ci0gICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLSAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgIGJ1ZltidWZfc2l6ZV0gPSAwOworCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpIC0gMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltidWZfc2l6ZV0gPSAwOwogCi0gICAgICAgZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdXNlcl9iYW5rKTsKLSAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdXNlcl9iYW5rKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIGlmICh1c2VyX2JhbmsgPj0gQUI4NTAwX05VTV9CQU5LUykgewotICAgICAgICAgICAgICAgZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgIH0KKwlpZiAodXNlcl9iYW5rID49IEFCODUwMF9OVU1fQkFOS1MpIHsKKwkJZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gICAgICAgZGVidWdfYmFuayA9IHVzZXJfYmFuazsKKwlkZWJ1Z19iYW5rID0gdXNlcl9iYW5rOwogCi0gICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCXJldHVybiBidWZfc2l6ZTsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfYWRkcmVzc19wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0gICAgICAgcmV0dXJuIHNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgZGVidWdfYWRkcmVzcyk7CisJcmV0dXJuIHNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgZGVidWdfYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2FkZHJlc3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLSAgICAgICByZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI4NTAwX2FkZHJlc3NfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBhYjg1MDBfYWRkcmVzc19wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFiODUwMF9hZGRyZXNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKwljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0gICAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0gICAgICAgY2hhciBidWZbMzJdOwotICAgICAgIGludCBidWZfc2l6ZTsKLSAgICAgICB1bnNpZ25lZCBsb25nIHVzZXJfYWRkcmVzczsKLSAgICAgICBpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICgoc3RydWN0IHNlcV9maWxlICopKGZpbGUtPnByaXZhdGVfZGF0YSkpLT5wcml2YXRlOworCWNoYXIgYnVmWzMyXTsKKwlpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHJlc3M7CisJaW50IGVycjsKIAotICAgICAgIC8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KLSAgICAgICBidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpIC0gMSkpOwotICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0gICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICBidWZbYnVmX3NpemVdID0gMDsKKwkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCisJYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKIAotICAgICAgIGVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7Ci0gICAgICAgaWYgKGVycikKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgIGlmICh1c2VyX2FkZHJlc3MgPiAweGZmKSB7Ci0gICAgICAgICAgICAgICBkZXZfZXJyKGRldiwgImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgIH0KLSAgICAgICBkZWJ1Z19hZGRyZXNzID0gdXNlcl9hZGRyZXNzOwotICAgICAgIHJldHVybiBidWZfc2l6ZTsKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX2FkZHJlc3MpOworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1c2VyX2FkZHJlc3MgPiAweGZmKSB7CisJCWRldl9lcnIoZGV2LCAiZGVidWdmcyBlcnJvciBpbnB1dCA+IDB4ZmZcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGVidWdfYWRkcmVzcyA9IHVzZXJfYWRkcmVzczsKKwlyZXR1cm4gYnVmX3NpemU7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX3ZhbF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0gICAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gcy0+cHJpdmF0ZTsKLSAgICAgICBpbnQgcmV0OwotICAgICAgIHU4IHJlZ3ZhbHVlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHMtPnByaXZhdGU7CisJaW50IHJldDsKKwl1OCByZWd2YWx1ZTsKIAotICAgICAgIHJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCi0gICAgICAgICAgICAgICAodTgpZGVidWdfYmFuaywgKHU4KWRlYnVnX2FkZHJlc3MsICZyZWd2YWx1ZSk7Ci0gICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgIGRldl9lcnIoZGV2LCAiYWJ4NTAwX2dldF9yZWcgZmFpbCAlZCwgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJldCwgX19MSU5FX18pOwotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgfQotICAgICAgIHNlcV9wcmludGYocywgIjB4JTAyWFxuIiwgcmVndmFsdWUpOworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCisJCSh1OClkZWJ1Z19iYW5rLCAodTgpZGVidWdfYWRkcmVzcywgJnJlZ3ZhbHVlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImFieDUwMF9nZXRfcmVnIGZhaWwgJWQsICVkXG4iLAorCQkJcmV0LCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzZXFfcHJpbnRmKHMsICIweCUwMlhcbiIsIHJlZ3ZhbHVlKTsKIAotICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF92YWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLSAgICAgICByZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWI4NTAwX3ZhbF9wcmludCwgaW5vZGUtPmlfcHJpdmF0ZSk7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFiODUwMF92YWxfcHJpbnQsIGlub2RlLT5pX3ByaXZhdGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhYjg1MDBfdmFsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKwljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0gICAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0gICAgICAgY2hhciBidWZbMzJdOwotICAgICAgIGludCBidWZfc2l6ZTsKLSAgICAgICB1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwotICAgICAgIGludCBlcnI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOworCWludCBlcnI7CiAKLSAgICAgICAvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0gICAgICAgYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKS0xKSk7Ci0gICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLSAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgIGJ1ZltidWZfc2l6ZV0gPSAwOworCS8qIEdldCB1c2Vyc3BhY2Ugc3RyaW5nIGFuZCBhc3N1cmUgdGVybWluYXRpb24gKi8KKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpLTEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKIAotICAgICAgIGVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfdmFsKTsKLSAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgaWYgKHVzZXJfdmFsID4gMHhmZikgewotICAgICAgICAgICAgICAgZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7Ci0gICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICB9Ci0gICAgICAgZXJyID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwKLSAgICAgICAgICAgICAgICh1OClkZWJ1Z19iYW5rLCBkZWJ1Z19hZGRyZXNzLCAodTgpdXNlcl92YWwpOwotICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImFieDUwMF9zZXRfcmVnIGZhaWxlZCAlZCwgJWQiLCBlcnIsIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgIH0KKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX3ZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVzZXJfdmFsID4gMHhmZikgeworCQlkZXZfZXJyKGRldiwgImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCisJCSh1OClkZWJ1Z19iYW5rLCBkZWJ1Z19hZGRyZXNzLCAodTgpdXNlcl92YWwpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWJ4NTAwX3NldF9yZWcgZmFpbGVkICVkLCAlZCIsIGVyciwgX19MSU5FX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLSAgICAgICByZXR1cm4gYnVmX3NpemU7CisJcmV0dXJuIGJ1Zl9zaXplOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjg1MDBfYmFua19mb3BzID0gewotICAgICAgIC5vcGVuID0gYWI4NTAwX2Jhbmtfb3BlbiwKLSAgICAgICAud3JpdGUgPSBhYjg1MDBfYmFua193cml0ZSwKLSAgICAgICAucmVhZCA9IHNlcV9yZWFkLAotICAgICAgIC5sbHNlZWsgPSBzZXFfbHNlZWssCi0gICAgICAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLSAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFiODUwMF9iYW5rX29wZW4sCisJLndyaXRlID0gYWI4NTAwX2Jhbmtfd3JpdGUsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjg1MDBfYWRkcmVzc19mb3BzID0gewotICAgICAgIC5vcGVuID0gYWI4NTAwX2FkZHJlc3Nfb3BlbiwKLSAgICAgICAud3JpdGUgPSBhYjg1MDBfYWRkcmVzc193cml0ZSwKLSAgICAgICAucmVhZCA9IHNlcV9yZWFkLAotICAgICAgIC5sbHNlZWsgPSBzZXFfbHNlZWssCi0gICAgICAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLSAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFiODUwMF9hZGRyZXNzX29wZW4sCisJLndyaXRlID0gYWI4NTAwX2FkZHJlc3Nfd3JpdGUsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjg1MDBfdmFsX2ZvcHMgPSB7Ci0gICAgICAgLm9wZW4gPSBhYjg1MDBfdmFsX29wZW4sCi0gICAgICAgLndyaXRlID0gYWI4NTAwX3ZhbF93cml0ZSwKLSAgICAgICAucmVhZCA9IHNlcV9yZWFkLAotICAgICAgIC5sbHNlZWsgPSBzZXFfbHNlZWssCi0gICAgICAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLSAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IGFiODUwMF92YWxfb3BlbiwKKwkud3JpdGUgPSBhYjg1MDBfdmFsX3dyaXRlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmFiODUwMF9kaXI7CkBAIC01NzIsNzcgKzU3Miw3NyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhYjg1MDBfZGVidWdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxmKQogewotICAgICAgIGRlYnVnX2JhbmsgPSBBQjg1MDBfTUlTQzsKLSAgICAgICBkZWJ1Z19hZGRyZXNzID0gQUI4NTAwX1JFVl9SRUcgJiAweDAwRkY7CisJZGVidWdfYmFuayA9IEFCODUwMF9NSVNDOworCWRlYnVnX2FkZHJlc3MgPSBBQjg1MDBfUkVWX1JFRyAmIDB4MDBGRjsKIAotICAgICAgIGFiODUwMF9kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoQUI4NTAwX05BTUVfU1RSSU5HLCBOVUxMKTsKLSAgICAgICBpZiAoIWFiODUwMF9kaXIpCi0gICAgICAgICAgICAgICBnb3RvIGV4aXRfbm9fZGVidWdmczsKKwlhYjg1MDBfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKEFCODUwMF9OQU1FX1NUUklORywgTlVMTCk7CisJaWYgKCFhYjg1MDBfZGlyKQorCQlnb3RvIGV4aXRfbm9fZGVidWdmczsKIAotICAgICAgIGFiODUwMF9yZWdfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFsbC1iYW5rLXJlZ2lzdGVycyIsCi0gICAgICAgICAgICAgICBTX0lSVUdPLCBhYjg1MDBfZGlyLCAmcGxmLT5kZXYsICZhYjg1MDBfcmVnaXN0ZXJzX2ZvcHMpOwotICAgICAgIGlmICghYWI4NTAwX3JlZ19maWxlKQotICAgICAgICAgICAgICAgZ290byBleGl0X2Rlc3Ryb3lfZGlyOworCWFiODUwMF9yZWdfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFsbC1iYW5rLXJlZ2lzdGVycyIsCisJCVNfSVJVR08sIGFiODUwMF9kaXIsICZwbGYtPmRldiwgJmFiODUwMF9yZWdpc3RlcnNfZm9wcyk7CisJaWYgKCFhYjg1MDBfcmVnX2ZpbGUpCisJCWdvdG8gZXhpdF9kZXN0cm95X2RpcjsKIAotICAgICAgIGFiODUwMF9iYW5rX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdpc3Rlci1iYW5rIiwKLSAgICAgICAgICAgICAgIChTX0lSVUdPIHwgU19JV1VHTyksIGFiODUwMF9kaXIsICZwbGYtPmRldiwgJmFiODUwMF9iYW5rX2ZvcHMpOwotICAgICAgIGlmICghYWI4NTAwX2JhbmtfZmlsZSkKLSAgICAgICAgICAgICAgIGdvdG8gZXhpdF9kZXN0cm95X3JlZzsKKwlhYjg1MDBfYmFua19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmVnaXN0ZXItYmFuayIsCisJCShTX0lSVUdPIHwgU19JV1VHTyksIGFiODUwMF9kaXIsICZwbGYtPmRldiwgJmFiODUwMF9iYW5rX2ZvcHMpOworCWlmICghYWI4NTAwX2JhbmtfZmlsZSkKKwkJZ290byBleGl0X2Rlc3Ryb3lfcmVnOwogCi0gICAgICAgYWI4NTAwX2FkZHJlc3NfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWFkZHJlc3MiLAotICAgICAgICAgICAgICAgKFNfSVJVR08gfCBTX0lXVUdPKSwgYWI4NTAwX2RpciwgJnBsZi0+ZGV2LAotICAgICAgICAgICAgICAgJmFiODUwMF9hZGRyZXNzX2ZvcHMpOwotICAgICAgIGlmICghYWI4NTAwX2FkZHJlc3NfZmlsZSkKLSAgICAgICAgICAgICAgIGdvdG8gZXhpdF9kZXN0cm95X2Jhbms7CisJYWI4NTAwX2FkZHJlc3NfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ2lzdGVyLWFkZHJlc3MiLAorCQkoU19JUlVHTyB8IFNfSVdVR08pLCBhYjg1MDBfZGlyLCAmcGxmLT5kZXYsCisJCSZhYjg1MDBfYWRkcmVzc19mb3BzKTsKKwlpZiAoIWFiODUwMF9hZGRyZXNzX2ZpbGUpCisJCWdvdG8gZXhpdF9kZXN0cm95X2Jhbms7CiAKLSAgICAgICBhYjg1MDBfdmFsX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdpc3Rlci12YWx1ZSIsCi0gICAgICAgICAgICAgICAoU19JUlVHTyB8IFNfSVdVR08pLCBhYjg1MDBfZGlyLCAmcGxmLT5kZXYsICZhYjg1MDBfdmFsX2ZvcHMpOwotICAgICAgIGlmICghYWI4NTAwX3ZhbF9maWxlKQotICAgICAgICAgICAgICAgZ290byBleGl0X2Rlc3Ryb3lfYWRkcmVzczsKKwlhYjg1MDBfdmFsX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdpc3Rlci12YWx1ZSIsCisJCShTX0lSVUdPIHwgU19JV1VHTyksIGFiODUwMF9kaXIsICZwbGYtPmRldiwgJmFiODUwMF92YWxfZm9wcyk7CisJaWYgKCFhYjg1MDBfdmFsX2ZpbGUpCisJCWdvdG8gZXhpdF9kZXN0cm95X2FkZHJlc3M7CiAKLSAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIAogZXhpdF9kZXN0cm95X2FkZHJlc3M6Ci0gICAgICAgZGVidWdmc19yZW1vdmUoYWI4NTAwX2FkZHJlc3NfZmlsZSk7CisJZGVidWdmc19yZW1vdmUoYWI4NTAwX2FkZHJlc3NfZmlsZSk7CiBleGl0X2Rlc3Ryb3lfYmFuazoKLSAgICAgICBkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfYmFua19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfYmFua19maWxlKTsKIGV4aXRfZGVzdHJveV9yZWc6Ci0gICAgICAgZGVidWdmc19yZW1vdmUoYWI4NTAwX3JlZ19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfcmVnX2ZpbGUpOwogZXhpdF9kZXN0cm95X2RpcjoKLSAgICAgICBkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfZGlyKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfZGlyKTsKIGV4aXRfbm9fZGVidWdmczoKLSAgICAgICBkZXZfZXJyKCZwbGYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBlbnRyaWVzLlxuIik7Ci0gICAgICAgcmV0dXJuIC1FTk9NRU07CisJZGV2X2VycigmcGxmLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZW50cmllcy5cbiIpOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhYjg1MDBfZGVidWdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZikKIHsKLSAgICAgICBkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfdmFsX2ZpbGUpOwotICAgICAgIGRlYnVnZnNfcmVtb3ZlKGFiODUwMF9hZGRyZXNzX2ZpbGUpOwotICAgICAgIGRlYnVnZnNfcmVtb3ZlKGFiODUwMF9iYW5rX2ZpbGUpOwotICAgICAgIGRlYnVnZnNfcmVtb3ZlKGFiODUwMF9yZWdfZmlsZSk7Ci0gICAgICAgZGVidWdmc19yZW1vdmUoYWI4NTAwX2Rpcik7CisJZGVidWdmc19yZW1vdmUoYWI4NTAwX3ZhbF9maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfYWRkcmVzc19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfYmFua19maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShhYjg1MDBfcmVnX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGFiODUwMF9kaXIpOwogCi0gICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiODUwMF9kZWJ1Z19kcml2ZXIgPSB7Ci0gICAgICAgLmRyaXZlciA9IHsKLSAgICAgICAgICAgICAgIC5uYW1lID0gImFiODUwMC1kZWJ1ZyIsCi0gICAgICAgICAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKLSAgICAgICB9LAotICAgICAgIC5wcm9iZSAgPSBhYjg1MDBfZGVidWdfcHJvYmUsCi0gICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFiODUwMF9kZWJ1Z19yZW1vdmUpCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWI4NTAwLWRlYnVnIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgID0gYWI4NTAwX2RlYnVnX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhYjg1MDBfZGVidWdfcmVtb3ZlKQogfTsKIAogc3RhdGljIGludCBfX2luaXQgYWI4NTAwX2RlYnVnX2luaXQodm9pZCkKIHsKLSAgICAgICByZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYjg1MDBfZGVidWdfZHJpdmVyKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYjg1MDBfZGVidWdfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFiODUwMF9kZWJ1Z19leGl0KHZvaWQpCiB7Ci0gICAgICAgcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiODUwMF9kZWJ1Z19kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYjg1MDBfZGVidWdfZHJpdmVyKTsKIH0KIHN1YnN5c19pbml0Y2FsbChhYjg1MDBfZGVidWdfaW5pdCk7CiBtb2R1bGVfZXhpdChhYjg1MDBfZGVidWdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtc3BpLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjUzNDIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLXNwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTAKLSAqCi0gKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgotICogQXV0aG9yOiBTcmluaWRoaSBLYXNhZ2FyIDxzcmluaWRoaS5rYXNhZ2FyQHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWI4NTAwLmg+Ci0KLS8qCi0gKiBUaGlzIGZ1bnRpb24gd3JpdGVzIHRvIGFueSBBQjg1MDAgcmVnaXN0ZXJzIHVzaW5nCi0gKiBTUEkgcHJvdG9jb2wgJiAgYmVmb3JlIGl0IHdyaXRlcyBpdCBwYWNrcyB0aGUgZGF0YQotICogaW4gdGhlIGJlbG93IDI0IGJpdCBmcmFtZSBmb3JtYXQKLSAqCi0gKgkgKnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKgkgKnwgMjN8MjIuLi4xOHwxNy4uLi4uLi4xMHw5fDh8Ny4uLi4uLjB8Ci0gKgkgKnwgci93ICBiYW5rICAgICAgIGFkciAgICAgICAgICBkYXRhICB8Ci0gKgkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQKLSAqIGNvbnRleHQKLSAqLwotc3RhdGljIGludCBhYjg1MDBfc3BpX3dyaXRlKHN0cnVjdCBhYjg1MDAgKmFiODUwMCwgdTE2IGFkZHIsIHU4IGRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRhaW5lcl9vZihhYjg1MDAtPmRldiwgc3RydWN0IHNwaV9kZXZpY2UsCi0JCQkJCSAgICAgIGRldik7Ci0JdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IGFkZHIgPDwgMTAgfCBkYXRhOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCi0JYWI4NTAwLT50eF9idWZbMF0gPSBzcGlfZGF0YTsKLQlhYjg1MDAtPnJ4X2J1ZlswXSA9IDA7Ci0KLQl4ZmVyLnR4X2J1Zgk9IGFiODUwMC0+dHhfYnVmOwotCXhmZXIucnhfYnVmCT0gTlVMTDsKLQl4ZmVyLmxlbgk9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOwotCi0JcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm1zZyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX3NwaV9yZWFkKHN0cnVjdCBhYjg1MDAgKmFiODUwMCwgdTE2IGFkZHIpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRhaW5lcl9vZihhYjg1MDAtPmRldiwgc3RydWN0IHNwaV9kZXZpY2UsCi0JCQkJCSAgICAgIGRldik7Ci0JdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IDEgPDwgMjMgfCBhZGRyIDw8IDEwOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCWludCByZXQ7Ci0KLQlhYjg1MDAtPnR4X2J1ZlswXSA9IHNwaV9kYXRhOwotCWFiODUwMC0+cnhfYnVmWzBdID0gMDsKLQotCXhmZXIudHhfYnVmCT0gYWI4NTAwLT50eF9idWY7Ci0JeGZlci5yeF9idWYJPSBhYjg1MDAtPnJ4X2J1ZjsKLQl4ZmVyLmxlbgk9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOwotCi0JcmV0ID0gc3BpX3N5bmMoc3BpLCAmbXNnKTsKLQlpZiAoIXJldCkKLQkJLyoKLQkJICogT25seSB0aGUgOCBsb3dlcm1vc3QgYnl0ZXMgYXJlCi0JCSAqIGRlZmluZWQgd2l0aCB2YWx1ZSwgdGhlIHJlc3QgbWF5Ci0JCSAqIHZhcnkgZGVwZW5kaW5nIG9uIGNoaXAvYm9hcmQgbm9pc2UuCi0JCSAqLwotCQlyZXQgPSBhYjg1MDAtPnJ4X2J1ZlswXSAmIDB4RkZVOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgYWI4NTAwX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhYjg1MDAgKmFiODUwMDsKLQlpbnQgcmV0OwotCi0Jc3BpLT5iaXRzX3Blcl93b3JkID0gMjQ7Ci0JcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlhYjg1MDAgPSBremFsbG9jKHNpemVvZiAqYWI4NTAwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFiODUwMCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhYjg1MDAtPmRldiA9ICZzcGktPmRldjsKLQlhYjg1MDAtPmlycSA9IHNwaS0+aXJxOwotCi0JYWI4NTAwLT5yZWFkID0gYWI4NTAwX3NwaV9yZWFkOwotCWFiODUwMC0+d3JpdGUgPSBhYjg1MDBfc3BpX3dyaXRlOwotCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgYWI4NTAwKTsKLQotCXJldCA9IGFiODUwMF9pbml0KGFiODUwMCk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoYWI4NTAwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGFiODUwMF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGFiODUwMCAqYWI4NTAwID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0KLQlhYjg1MDBfZXhpdChhYjg1MDApOwotCWtmcmVlKGFiODUwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFiODUwMF9zcGlfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFiODUwMC1zcGkiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZQk9IGFiODUwMF9zcGlfcHJvYmUsCi0JLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGFiODUwMF9zcGlfcmVtb3ZlKQotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWI4NTAwX3NwaV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFiODUwMF9zcGlfZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbChhYjg1MDBfc3BpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWI4NTAwX3NwaV9leGl0KHZvaWQpCi17Ci0Jc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhYjg1MDBfc3BpX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhYjg1MDBfc3BpX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJTcmluaWRoaSBLQVNBR0FSIDxzcmluaWRoaS5rYXNhZ2FyQHN0ZXJpY3Nzb24uY29tIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFCODUwMCBTUEkiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FzaWMzLmMgYi9kcml2ZXJzL21mZC9hc2ljMy5jCmluZGV4IDdkZTcwOGQuLjZhMWY5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FzaWMzLmMKKysrIGIvZHJpdmVycy9tZmQvYXNpYzMuYwpAQCAtNTcsNyArNTcsNyBAQAogCQkucmF0ZSA9IF9yYXRlLAkJCVwKIAl9CiAKLXN0cnVjdCBhc2ljM19jbGsgYXNpYzNfY2xrX2luaXRbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBhc2ljM19jbGsgYXNpYzNfY2xrX2luaXRbXSBfX2luaXRkYXRhID0gewogCUlOSVRfQ0RFWChTUEksIDApLAogCUlOSVRfQ0RFWChPV00sIDUwMDAwMDApLAogCUlOSVRfQ0RFWChQV00wLCAwKSwKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQkJKHJlZyA+PiBhc2ljLT5idXNfc2hpZnQpKTsKIH0KIAotdm9pZCBhc2ljM19zZXRfcmVnaXN0ZXIoc3RydWN0IGFzaWMzICphc2ljLCB1MzIgcmVnLCB1MzIgYml0cywgYm9vbCBzZXQpCitzdGF0aWMgdm9pZCBhc2ljM19zZXRfcmVnaXN0ZXIoc3RydWN0IGFzaWMzICphc2ljLCB1MzIgcmVnLCB1MzIgYml0cywgYm9vbCBzZXQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwpAQCAtMjI2LDE0ICsyMjYsMTQgQEAKIAlyZXR1cm4gKGlycSAtIGFzaWMtPmlycV9iYXNlKSAmIDB4ZjsKIH0KIAotc3RhdGljIHZvaWQgYXNpYzNfbWFza19ncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYXNpYzNfbWFza19ncGlvX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGFzaWMzICphc2ljID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAl1MzIgdmFsLCBiYW5rLCBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmFuayA9IGFzaWMzX2lycV90b19iYW5rKGFzaWMsIGlycSk7Ci0JaW5kZXggPSBhc2ljM19pcnFfdG9faW5kZXgoYXNpYywgaXJxKTsKKwliYW5rID0gYXNpYzNfaXJxX3RvX2JhbmsoYXNpYywgZGF0YS0+aXJxKTsKKwlpbmRleCA9IGFzaWMzX2lycV90b19pbmRleChhc2ljLCBkYXRhLT5pcnEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFzaWMtPmxvY2ssIGZsYWdzKTsKIAl2YWwgPSBhc2ljM19yZWFkX3JlZ2lzdGVyKGFzaWMsIGJhbmsgKyBBU0lDM19HUElPX01BU0spOwpAQCAtMjQyLDkgKzI0Miw5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNpYy0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBhc2ljM19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYXNpYzNfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IGFzaWMzICphc2ljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IHJlZ3ZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNTQsNyArMjU0LDcgQEAKIAkJCQkgICAgIEFTSUMzX0lOVFJfSU5UX01BU0spOwogCiAJcmVndmFsICY9IH4oQVNJQzNfSU5UTUFTS19NQVNLMCA8PAotCQkgICAgKGlycSAtIChhc2ljLT5pcnFfYmFzZSArIEFTSUMzX05VTV9HUElPUykpKTsKKwkJICAgIChkYXRhLT5pcnEgLSAoYXNpYy0+aXJxX2Jhc2UgKyBBU0lDM19OVU1fR1BJT1MpKSk7CiAKIAlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLAogCQkJICAgICBBU0lDM19JTlRSX0JBU0UgKwpAQCAtMjYzLDE0ICsyNjMsMTQgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGFzaWMzX3VubWFza19ncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYXNpYzNfdW5tYXNrX2dwaW9faXJxKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCXUzMiB2YWwsIGJhbmssIGluZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQliYW5rID0gYXNpYzNfaXJxX3RvX2JhbmsoYXNpYywgaXJxKTsKLQlpbmRleCA9IGFzaWMzX2lycV90b19pbmRleChhc2ljLCBpcnEpOworCWJhbmsgPSBhc2ljM19pcnFfdG9fYmFuayhhc2ljLCBkYXRhLT5pcnEpOworCWluZGV4ID0gYXNpYzNfaXJxX3RvX2luZGV4KGFzaWMsIGRhdGEtPmlycSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOwogCXZhbCA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywgYmFuayArIEFTSUMzX0dQSU9fTUFTSyk7CkBAIC0yNzksOSArMjc5LDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGFzaWMzX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFzaWMzX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IGFzaWMzICphc2ljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IHJlZ3ZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCQkgICAgIEFTSUMzX0lOVFJfSU5UX01BU0spOwogCiAJcmVndmFsIHw9IChBU0lDM19JTlRNQVNLX01BU0swIDw8Ci0JCSAgIChpcnEgLSAoYXNpYy0+aXJxX2Jhc2UgKyBBU0lDM19OVU1fR1BJT1MpKSk7CisJCSAgIChkYXRhLT5pcnEgLSAoYXNpYy0+aXJxX2Jhc2UgKyBBU0lDM19OVU1fR1BJT1MpKSk7CiAKIAlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLAogCQkJICAgICBBU0lDM19JTlRSX0JBU0UgKwpAQCAtMzAwLDE1ICszMDAsMTUgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgYXNpYzNfZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgYXNpYzNfZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQogewotCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IGFzaWMzICphc2ljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJdTMyIGJhbmssIGluZGV4OwogCXUxNiB0cmlnZ2VyLCBsZXZlbCwgZWRnZSwgYml0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQliYW5rID0gYXNpYzNfaXJxX3RvX2JhbmsoYXNpYywgaXJxKTsKLQlpbmRleCA9IGFzaWMzX2lycV90b19pbmRleChhc2ljLCBpcnEpOworCWJhbmsgPSBhc2ljM19pcnFfdG9fYmFuayhhc2ljLCBkYXRhLT5pcnEpOworCWluZGV4ID0gYXNpYzNfaXJxX3RvX2luZGV4KGFzaWMsIGRhdGEtPmlycSk7CiAJYml0ID0gMTw8aW5kZXg7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCQkJICAgYmFuayArIEFTSUMzX0dQSU9fRURHRV9UUklHR0VSKTsKIAl0cmlnZ2VyID0gYXNpYzNfcmVhZF9yZWdpc3Rlcihhc2ljLAogCQkJCSAgICAgIGJhbmsgKyBBU0lDM19HUElPX1RSSUdHRVJfVFlQRSk7Ci0JYXNpYy0+aXJxX2JvdGhlZGdlWyhpcnEgLSBhc2ljLT5pcnFfYmFzZSkgPj4gNF0gJj0gfmJpdDsKKwlhc2ljLT5pcnFfYm90aGVkZ2VbKGRhdGEtPmlycSAtIGFzaWMtPmlycV9iYXNlKSA+PiA0XSAmPSB+Yml0OwogCiAJaWYgKHR5cGUgPT0gSVJRX1RZUEVfRURHRV9SSVNJTkcpIHsKIAkJdHJpZ2dlciB8PSBiaXQ7CkBAIC0zMjgsMTEgKzMyOCwxMSBAQAogCQllZGdlICY9IH5iaXQ7CiAJfSBlbHNlIGlmICh0eXBlID09IElSUV9UWVBFX0VER0VfQk9USCkgewogCQl0cmlnZ2VyIHw9IGJpdDsKLQkJaWYgKGFzaWMzX2dwaW9fZ2V0KCZhc2ljLT5ncGlvLCBpcnEgLSBhc2ljLT5pcnFfYmFzZSkpCisJCWlmIChhc2ljM19ncGlvX2dldCgmYXNpYy0+Z3BpbywgZGF0YS0+aXJxIC0gYXNpYy0+aXJxX2Jhc2UpKQogCQkJZWRnZSAmPSB+Yml0OwogCQllbHNlCiAJCQllZGdlIHw9IGJpdDsKLQkJYXNpYy0+aXJxX2JvdGhlZGdlWyhpcnEgLSBhc2ljLT5pcnFfYmFzZSkgPj4gNF0gfD0gYml0OworCQlhc2ljLT5pcnFfYm90aGVkZ2VbKGRhdGEtPmlycSAtIGFzaWMtPmlycV9iYXNlKSA+PiA0XSB8PSBiaXQ7CiAJfSBlbHNlIGlmICh0eXBlID09IElSUV9UWVBFX0xFVkVMX0xPVykgewogCQl0cmlnZ2VyICY9IH5iaXQ7CiAJCWxldmVsICY9IH5iaXQ7CkBAIC0zNTksMTcgKzM1OSwxNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFzaWMzX2dwaW9faXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIkFTSUMzLUdQSU8iLAotCS5hY2sJCT0gYXNpYzNfbWFza19ncGlvX2lycSwKLQkubWFzawkJPSBhc2ljM19tYXNrX2dwaW9faXJxLAotCS51bm1hc2sJCT0gYXNpYzNfdW5tYXNrX2dwaW9faXJxLAotCS5zZXRfdHlwZQk9IGFzaWMzX2dwaW9faXJxX3R5cGUsCisJLmlycV9hY2sJPSBhc2ljM19tYXNrX2dwaW9faXJxLAorCS5pcnFfbWFzawk9IGFzaWMzX21hc2tfZ3Bpb19pcnEsCisJLmlycV91bm1hc2sJPSBhc2ljM191bm1hc2tfZ3Bpb19pcnEsCisJLmlycV9zZXRfdHlwZQk9IGFzaWMzX2dwaW9faXJxX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFzaWMzX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJBU0lDMyIsCi0JLmFjawkJPSBhc2ljM19tYXNrX2lycSwKLQkubWFzawkJPSBhc2ljM19tYXNrX2lycSwKLQkudW5tYXNrCQk9IGFzaWMzX3VubWFza19pcnEsCisJLmlycV9hY2sJPSBhc2ljM19tYXNrX2lycSwKKwkuaXJxX21hc2sJPSBhc2ljM19tYXNrX2lycSwKKwkuaXJxX3VubWFzawk9IGFzaWMzX3VubWFza19pcnEsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhc2ljM19pcnFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTYzNSw3ICs2MzUsNyBAQAogCX0sCiAJewogCQkuc3RhcnQgPSBBU0lDM19JUlFfT1dNLAotCQkuc3RhcnQgPSBBU0lDM19JUlFfT1dNLAorCQkuZW5kICAgPSBBU0lDM19JUlFfT1dNLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0hJR0hFREdFLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvY3M1NTM1LW1mZC5jIGIvZHJpdmVycy9tZmQvY3M1NTM1LW1mZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2E2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9jczU1MzUtbWZkLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBjczU1MzUtbWZkLmMgLSBjb3JlIE1GRCBkcml2ZXIgZm9yIENTNTUzNS9DUzU1MzYgc291dGhicmlkZ2VzCisgKgorICogVGhlIENTNTUzNSBhbmQgQ1M1NTM2IGhhcyBhbiBJU0EgYnJpZGdlIG9uIHRoZSBQQ0kgYnVzIHRoYXQgaXMKKyAqIHVzZWQgZm9yIGFjY2Vzc2luZyBHUElPcywgTUZHUFRzLCBBQ1BJLCBldGMuICBFYWNoIHN1YmRldmljZSBoYXMKKyAqIGFuIElPIHJhbmdlIHRoYXQncyBzcGVjaWZpZWQgaW4gYSBzaW5nbGUgQkFSLiAgVGhlIEJBUiBvcmRlciBpcworICogaGFyZGNvZGVkIGluIHRoZSBDUzU1M3ggc3BlY2lmaWNhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwICBBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImNzNTUzNS1tZmQiCisKK2VudW0gY3M1NTM1X21mZF9iYXJzIHsKKwlTTUJfQkFSID0gMCwKKwlHUElPX0JBUiA9IDEsCisJTUZHUFRfQkFSID0gMiwKKwlQTVNfQkFSID0gNCwKKwlBQ1BJX0JBUiA9IDUsCisJTlJfQkFSUywKK307CisKK3N0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCByZXNvdXJjZSBjczU1MzVfbWZkX3Jlc291cmNlc1tOUl9CQVJTXTsKKworc3RhdGljIF9fZGV2aW5pdGRhdGEgc3RydWN0IG1mZF9jZWxsIGNzNTUzNV9tZmRfY2VsbHNbXSA9IHsKKwl7CisJCS5pZCA9IFNNQl9CQVIsCisJCS5uYW1lID0gImNzNTUzNS1zbWIiLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAmY3M1NTM1X21mZF9yZXNvdXJjZXNbU01CX0JBUl0sCisJfSwKKwl7CisJCS5pZCA9IEdQSU9fQkFSLAorCQkubmFtZSA9ICJjczU1MzUtZ3BpbyIsCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlcyA9ICZjczU1MzVfbWZkX3Jlc291cmNlc1tHUElPX0JBUl0sCisJfSwKKwl7CisJCS5pZCA9IE1GR1BUX0JBUiwKKwkJLm5hbWUgPSAiY3M1NTM1LW1mZ3B0IiwKKwkJLm51bV9yZXNvdXJjZXMgPSAxLAorCQkucmVzb3VyY2VzID0gJmNzNTUzNV9tZmRfcmVzb3VyY2VzW01GR1BUX0JBUl0sCisJfSwKKwl7CisJCS5pZCA9IFBNU19CQVIsCisJCS5uYW1lID0gImNzNTUzNS1wbXMiLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAmY3M1NTM1X21mZF9yZXNvdXJjZXNbUE1TX0JBUl0sCisJfSwKKwl7CisJCS5pZCA9IEFDUElfQkFSLAorCQkubmFtZSA9ICJjczU1MzUtYWNwaSIsCisJCS5udW1fcmVzb3VyY2VzID0gMSwKKwkJLnJlc291cmNlcyA9ICZjczU1MzVfbWZkX3Jlc291cmNlc1tBQ1BJX0JBUl0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNTUzNV9tZmRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyLCBpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIGZpbGwgaW4gSU8gcmFuZ2UgZm9yIGVhY2ggY2VsbDsgc3ViZHJpdmVycyBoYW5kbGUgdGhlIHJlZ2lvbiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNTUzNV9tZmRfY2VsbHMpOyBpKyspIHsKKwkJaW50IGJhciA9IGNzNTUzNV9tZmRfY2VsbHNbaV0uaWQ7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9ICZjczU1MzVfbWZkX3Jlc291cmNlc1tiYXJdOworCisJCXItPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJci0+c3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKTsKKwkJci0+ZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBiYXIpOworCisJCS8qIGlkIGlzIHVzZWQgZm9yIHRlbXBvcmFyaWx5IHN0b3JpbmcgQkFSOyB1bnNldCBpdCBub3cgKi8KKwkJY3M1NTM1X21mZF9jZWxsc1tpXS5pZCA9IDA7CisJfQorCisJZXJyID0gbWZkX2FkZF9kZXZpY2VzKCZwZGV2LT5kZXYsIC0xLCBjczU1MzVfbWZkX2NlbGxzLAorCQkJQVJSQVlfU0laRShjczU1MzVfbWZkX2NlbGxzKSwgTlVMTCwgMCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNRkQgYWRkIGRldmljZXMgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXp1IGRldmljZXMgcmVnaXN0ZXJlZC5cbiIsCisJCQlBUlJBWV9TSVpFKGNzNTUzNV9tZmRfY2VsbHMpKTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNTUzNV9tZmRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCW1mZF9yZW1vdmVfZGV2aWNlcygmcGRldi0+ZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczU1MzVfbWZkX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSVNBKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lTQSkgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3M1NTM1X21mZF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNzNTUzNV9tZmRfZHJ2ID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gY3M1NTM1X21mZF9wY2lfdGJsLAorCS5wcm9iZSA9IGNzNTUzNV9tZmRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNzNTUzNV9tZmRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNzNTUzNV9tZmRfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczU1MzVfbWZkX2Rydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjczU1MzVfbWZkX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNTUzNV9tZmRfZHJ2KTsKK30KKworbW9kdWxlX2luaXQoY3M1NTM1X21mZF9pbml0KTsKK21vZHVsZV9leGl0KGNzNTUzNV9tZmRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlcyBTYWxvbW9uIDxkaWxpbmdlckBxdWV1ZWQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNRkQgZHJpdmVyIGZvciBDUzU1MzUvQ1M1NTM2IHNvdXRoYnJpZGdlJ3MgSVNBIFBDSSBkZXZpY2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2V6eC1wY2FwLmMgYi9kcml2ZXJzL21mZC9lengtcGNhcC5jCmluZGV4IGMyYjY5OGQuLjllMmQ4ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2V6eC1wY2FwLmMKKysrIGIvZHJpdmVycy9tZmQvZXp4LXBjYXAuYwpAQCAtMTQ0LDI2ICsxNDQsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjYXBfdG9faXJxKTsKIAotc3RhdGljIHZvaWQgcGNhcF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgcGNhcF9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBjYXBfY2hpcCAqcGNhcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHBjYXBfY2hpcCAqcGNhcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCi0JcGNhcC0+bXNyIHw9IDEgPDwgaXJxX3RvX3BjYXAocGNhcCwgaXJxKTsKKwlwY2FwLT5tc3IgfD0gMSA8PCBpcnFfdG9fcGNhcChwY2FwLCBkLT5pcnEpOwogCXF1ZXVlX3dvcmsocGNhcC0+d29ya3F1ZXVlLCAmcGNhcC0+bXNyX3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCBwY2FwX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHBjYXBfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0Jc3RydWN0IHBjYXBfY2hpcCAqcGNhcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHBjYXBfY2hpcCAqcGNhcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCi0JcGNhcC0+bXNyICY9IH4oMSA8PCBpcnFfdG9fcGNhcChwY2FwLCBpcnEpKTsKKwlwY2FwLT5tc3IgJj0gfigxIDw8IGlycV90b19wY2FwKHBjYXAsIGQtPmlycSkpOwogCXF1ZXVlX3dvcmsocGNhcC0+d29ya3F1ZXVlLCAmcGNhcC0+bXNyX3dvcmspOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBjYXBfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJPSAicGNhcCIsCi0JLm1hc2sJPSBwY2FwX21hc2tfaXJxLAotCS51bm1hc2sJPSBwY2FwX3VubWFza19pcnEsCisJLm5hbWUJCT0gInBjYXAiLAorCS5pcnFfbWFzawk9IHBjYXBfbWFza19pcnEsCisJLmlycV91bm1hc2sJPSBwY2FwX3VubWFza19pcnEsCiB9OwogCiBzdGF0aWMgdm9pZCBwY2FwX21zcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE5OSw4ICsxOTksNyBAQAogCQkJaWYgKHNlcnZpY2UgJiAxKSB7CiAJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAotCQkJCWlmIChXQVJOKCFkZXNjLCBLRVJOX1dBUk5JTkcKLQkJCQkJCSJJbnZhbGlkIFBDQVAgSVJRICVkXG4iLCBpcnEpKQorCQkJCWlmIChXQVJOKCFkZXNjLCAiSW52YWxpZCBQQ0FQIElSUSAlZFxuIiwgaXJxKSkKIAkJCQkJYnJlYWs7CiAKIAkJCQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKQpAQCAtMjE4LDcgKzIxNyw3IEBACiB7CiAJc3RydWN0IHBjYXBfY2hpcCAqcGNhcCA9IGdldF9pcnFfZGF0YShpcnEpOwogCi0JZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOwogCXF1ZXVlX3dvcmsocGNhcC0+d29ya3F1ZXVlLCAmcGNhcC0+aXNyX3dvcmspOwogCXJldHVybjsKIH0KQEAgLTI4Miw3ICsyODEsNyBAQAogCW11dGV4X2xvY2soJnBjYXAtPmFkY19tdXRleCk7CiAJcmVxID0gcGNhcC0+YWRjX3F1ZXVlW3BjYXAtPmFkY19oZWFkXTsKIAotCWlmIChXQVJOKCFyZXEsIEtFUk5fV0FSTklORyAiYWRjIGlycSB3aXRob3V0IHBlbmRpbmcgcmVxdWVzdFxuIikpIHsKKwlpZiAoV0FSTighcmVxLCAiYWRjIGlycSB3aXRob3V0IHBlbmRpbmcgcmVxdWVzdFxuIikpIHsKIAkJbXV0ZXhfdW5sb2NrKCZwY2FwLT5hZGNfbXV0ZXgpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvaHRjLWVncGlvLmMgYi9kcml2ZXJzL21mZC9odGMtZWdwaW8uYwppbmRleCBkM2U3NGY4Li5kMDBiNmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9odGMtZWdwaW8uYworKysgYi9kcml2ZXJzL21mZC9odGMtZWdwaW8uYwpAQCAtNzAsMzEgKzcwLDMyIEBACiAJCQllaS0+YWNrX3dyaXRlLCBlaS0+YWNrX3JlZ2lzdGVyIDw8IGVpLT5idXNfc2hpZnQpOwogfQogCi1zdGF0aWMgdm9pZCBlZ3Bpb19hY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGVncGlvX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CiB9CiAKIC8qIFRoZXJlIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHdheSB0byBwcm9hY3RpdmVseSBtYXNrIGludGVycnVwdHMKICAqIG9uIHRoZSBlZ3BpbyBjaGlwIGl0c2VsZi4gIFNvLCB3ZSBzaW1wbHkgaWdub3JlIGludGVycnVwdHMgdGhhdAogICogYXJlbid0IGRlc2lyZWQuICovCi1zdGF0aWMgdm9pZCBlZ3Bpb19tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBlZ3Bpb19tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWVpLT5pcnFzX2VuYWJsZWQgJj0gfigxIDw8IChpcnEgLSBlaS0+aXJxX3N0YXJ0KSk7Ci0JcHJfZGVidWcoIkVHUElPIG1hc2sgJWQgJTA0eFxuIiwgaXJxLCBlaS0+aXJxc19lbmFibGVkKTsKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwllaS0+aXJxc19lbmFibGVkICY9IH4oMSA8PCAoZGF0YS0+aXJxIC0gZWktPmlycV9zdGFydCkpOworCXByX2RlYnVnKCJFR1BJTyBtYXNrICVkICUwNHhcbiIsIGRhdGEtPmlycSwgZWktPmlycXNfZW5hYmxlZCk7CiB9Ci1zdGF0aWMgdm9pZCBlZ3Bpb191bm1hc2sodW5zaWduZWQgaW50IGlycSkKKworc3RhdGljIHZvaWQgZWdwaW9fdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWVpLT5pcnFzX2VuYWJsZWQgfD0gMSA8PCAoaXJxIC0gZWktPmlycV9zdGFydCk7Ci0JcHJfZGVidWcoIkVHUElPIHVubWFzayAlZCAlMDR4XG4iLCBpcnEsIGVpLT5pcnFzX2VuYWJsZWQpOworCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWVpLT5pcnFzX2VuYWJsZWQgfD0gMSA8PCAoZGF0YS0+aXJxIC0gZWktPmlycV9zdGFydCk7CisJcHJfZGVidWcoIkVHUElPIHVubWFzayAlZCAlMDR4XG4iLCBkYXRhLT5pcnEsIGVpLT5pcnFzX2VuYWJsZWQpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGVncGlvX211eGVkX2NoaXAgPSB7Ci0JLm5hbWUgICA9ICJodGMtZWdwaW8iLAotCS5hY2sJPSBlZ3Bpb19hY2ssCi0JLm1hc2sgICA9IGVncGlvX21hc2ssCi0JLnVubWFzayA9IGVncGlvX3VubWFzaywKKwkubmFtZQkJPSAiaHRjLWVncGlvIiwKKwkuaXJxX2Fjawk9IGVncGlvX2FjaywKKwkuaXJxX21hc2sJPSBlZ3Bpb19tYXNrLAorCS5pcnFfdW5tYXNrCT0gZWdwaW9fdW5tYXNrLAogfTsKIAogc3RhdGljIHZvaWQgZWdwaW9faGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9odGMtaTJjcGxkLmMgYi9kcml2ZXJzL21mZC9odGMtaTJjcGxkLmMKaW5kZXggNTk0YzlhOC4uMjk2YWQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvaHRjLWkyY3BsZC5jCisrKyBiL2RyaXZlcnMvbWZkL2h0Yy1pMmNwbGQuYwpAQCAtODIsMjUgKzgyLDI1IEBACiAvKiBUaGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJvYWN0aXZlbHkgbWFzayBpbnRlcnJ1cHRzCiAgKiBvbiB0aGUgaHRjcGxkIGNoaXAgaXRzZWxmLiAgU28sIHdlIHNpbXBseSBpZ25vcmUgaW50ZXJydXB0cyB0aGF0CiAgKiBhcmVuJ3QgZGVzaXJlZC4gKi8KLXN0YXRpYyB2b2lkIGh0Y3BsZF9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBodGNwbGRfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGh0Y3BsZF9jaGlwICpjaGlwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljaGlwLT5pcnFzX2VuYWJsZWQgJj0gfigxIDw8IChpcnEgLSBjaGlwLT5pcnFfc3RhcnQpKTsKLQlwcl9kZWJ1ZygiSFRDUExEIG1hc2sgJWQgJTA0eFxuIiwgaXJxLCBjaGlwLT5pcnFzX2VuYWJsZWQpOworCXN0cnVjdCBodGNwbGRfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWNoaXAtPmlycXNfZW5hYmxlZCAmPSB+KDEgPDwgKGRhdGEtPmlycSAtIGNoaXAtPmlycV9zdGFydCkpOworCXByX2RlYnVnKCJIVENQTEQgbWFzayAlZCAlMDR4XG4iLCBkYXRhLT5pcnEsIGNoaXAtPmlycXNfZW5hYmxlZCk7CiB9Ci1zdGF0aWMgdm9pZCBodGNwbGRfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBodGNwbGRfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgaHRjcGxkX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWNoaXAtPmlycXNfZW5hYmxlZCB8PSAxIDw8IChpcnEgLSBjaGlwLT5pcnFfc3RhcnQpOwotCXByX2RlYnVnKCJIVENQTEQgdW5tYXNrICVkICUwNHhcbiIsIGlycSwgY2hpcC0+aXJxc19lbmFibGVkKTsKKwlzdHJ1Y3QgaHRjcGxkX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwljaGlwLT5pcnFzX2VuYWJsZWQgfD0gMSA8PCAoZGF0YS0+aXJxIC0gY2hpcC0+aXJxX3N0YXJ0KTsKKwlwcl9kZWJ1ZygiSFRDUExEIHVubWFzayAlZCAlMDR4XG4iLCBkYXRhLT5pcnEsIGNoaXAtPmlycXNfZW5hYmxlZCk7CiB9CiAKLXN0YXRpYyBpbnQgaHRjcGxkX3NldF90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgaHRjcGxkX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBpcnFfZGVzYyAqZCA9IGlycV90b19kZXNjKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkID0gaXJxX3RvX2Rlc2MoZGF0YS0+aXJxKTsKIAogCWlmICghZCkgewotCQlwcl9lcnIoIkhUQ1BMRCBpbnZhbGlkIElSUTogJWRcbiIsIGlycSk7CisJCXByX2VycigiSFRDUExEIGludmFsaWQgSVJROiAlZFxuIiwgZGF0YS0+aXJxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTgsMTAgKzExOCwxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGh0Y3BsZF9tdXhlZF9jaGlwID0gewotCS5uYW1lICAgICA9ICJodGNwbGQiLAotCS5tYXNrICAgICA9IGh0Y3BsZF9tYXNrLAotCS51bm1hc2sgICA9IGh0Y3BsZF91bm1hc2ssCi0JLnNldF90eXBlID0gaHRjcGxkX3NldF90eXBlLAorCS5uYW1lICAgICAgICAgPSAiaHRjcGxkIiwKKwkuaXJxX21hc2sgICAgID0gaHRjcGxkX21hc2ssCisJLmlycV91bm1hc2sgICA9IGh0Y3BsZF91bm1hc2ssCisJLmlycV9zZXRfdHlwZSA9IGh0Y3BsZF9zZXRfdHlwZSwKIH07CiAKIC8qIFRvIHByb3Blcmx5IGRpc3BhdGNoIElSUSBldmVudHMsIHdlIG5lZWQgdG8gcmVhZCBmcm9tIHRoZQpAQCAtMjM1LDcgKzIzNSw3IEBACiAgKiBhbmQgdGhhdCB3b3JrIGlzIHNjaGVkdWxlZCBpbiB0aGUgc2V0IHJvdXRpbmUuICBUaGUga2VybmVsIGNhbiB0aGVuIHJ1bgogICogdGhlIEkyQyBmdW5jdGlvbnMsIHdoaWNoIHdpbGwgc2xlZXAsIGluIHByb2Nlc3MgY29udGV4dC4KICAqLwotdm9pZCBodGNwbGRfY2hpcF9zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsKQorc3RhdGljIHZvaWQgaHRjcGxkX2NoaXBfc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBodGNwbGRfY2hpcCAqY2hpcF9kYXRhOwpAQCAtMjU5LDcgKzI1OSw3IEBACiAJc2NoZWR1bGVfd29yaygmKGNoaXBfZGF0YS0+c2V0X3ZhbF93b3JrKSk7CiB9CiAKLXZvaWQgaHRjcGxkX2NoaXBfc2V0X25pKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGh0Y3BsZF9jaGlwX3NldF9uaShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGh0Y3BsZF9jaGlwICpjaGlwX2RhdGE7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKQEAgLTI2OSw3ICsyNjksNyBAQAogCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGNoaXBfZGF0YS0+Y2FjaGVfb3V0KTsKIH0KIAotaW50IGh0Y3BsZF9jaGlwX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCitzdGF0aWMgaW50IGh0Y3BsZF9jaGlwX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJc3RydWN0IGh0Y3BsZF9jaGlwICpjaGlwX2RhdGE7CiAJaW50IHZhbCA9IDA7CkBAIC0zMTYsNyArMzE2LDcgQEAKIAlyZXR1cm4gKG9mZnNldCA8IGNoaXAtPm5ncGlvKSA/IDAgOiAtRUlOVkFMOwogfQogCi1pbnQgaHRjcGxkX2NoaXBfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyBpbnQgaHRjcGxkX2NoaXBfdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3QgaHRjcGxkX2NoaXAgKmNoaXBfZGF0YTsKIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkIGh0Y3BsZF9jaGlwX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBodGNwbGRfY2hpcF9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBodGNwbGRfY2hpcCAqY2hpcF9kYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaWYgKCFjaGlwX2RhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMgYi9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKaW5kZXggOWRkMWIzMy4uMGNjNTk3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwpAQCAtODQsMzEgKzg0LDMwIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGp6NDc0MF9hZGNfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGp6NDc0MF9hZGNfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBqejQ3NDBfYWRjICphZGMgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoYWRjLCBpcnEsIHRydWUpOworCXN0cnVjdCBqejQ3NDBfYWRjICphZGMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlqejQ3NDBfYWRjX2lycV9zZXRfbWFza2VkKGFkYywgZGF0YS0+aXJxLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgano0NzQwX2FkY19pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBqejQ3NDBfYWRjX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBqejQ3NDBfYWRjICphZGMgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoYWRjLCBpcnEsIGZhbHNlKTsKKwlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJano0NzQwX2FkY19pcnFfc2V0X21hc2tlZChhZGMsIGRhdGEtPmlycSwgZmFsc2UpOwogfQogCi1zdGF0aWMgdm9pZCBqejQ3NDBfYWRjX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGp6NDc0MF9hZGNfaXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGp6NDc0MF9hZGMgKmFkYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0KLQlpcnEgLT0gYWRjLT5pcnFfYmFzZTsKKwlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycSAtIGFkYy0+aXJxX2Jhc2U7CiAJd3JpdGViKEJJVChpcnEpLCBhZGMtPmJhc2UgKyBKWl9SRUdfQURDX1NUQVRVUyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgano0NzQwX2FkY19pcnFfY2hpcCA9IHsKIAkubmFtZSA9ICJqejQ3NDAtYWRjIiwKLQkubWFzayA9IGp6NDc0MF9hZGNfaXJxX21hc2ssCi0JLnVubWFzayA9IGp6NDc0MF9hZGNfaXJxX3VubWFzaywKLQkuYWNrID0gano0NzQwX2FkY19pcnFfYWNrLAorCS5pcnFfbWFzayA9IGp6NDc0MF9hZGNfaXJxX21hc2ssCisJLmlycV91bm1hc2sgPSBqejQ3NDBfYWRjX2lycV91bm1hc2ssCisJLmlycV9hY2sgPSBqejQ3NDBfYWRjX2lycV9hY2ssCiB9OwogCiBzdGF0aWMgdm9pZCBqejQ3NDBfYWRjX2lycV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg4OTI1LWNvcmUuYyBiL2RyaXZlcnMvbWZkL21heDg5MjUtY29yZS5jCmluZGV4IDQ0Njk1ZjUuLjBlOTk4ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21heDg5MjUtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL21heDg5MjUtY29yZS5jCkBAIC00MDcsMTYgKzQwNywxNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IG1heDg5MjVfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IG1heDg5MjVfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBtYXg4OTI1X2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBtYXg4OTI1X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBtYXg4OTI1X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAlzdHJ1Y3QgbWF4ODkyNV9pcnFfZGF0YSAqaXJxX2RhdGE7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FjaGVfY2hnWzJdID0gezB4ZmYsIDB4ZmZ9OwogCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhY2hlX29uWzJdID0gezB4ZmYsIDB4ZmZ9OwpAQCAtNDkyLDI1ICs0OTIsMjUgQEAKIAltdXRleF91bmxvY2soJmNoaXAtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXg4OTI1X2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBtYXg4OTI1X2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCW1heDg5MjVfaXJxc1tpcnEgLSBjaGlwLT5pcnFfYmFzZV0uZW5hYmxlCi0JCT0gbWF4ODkyNV9pcnFzW2lycSAtIGNoaXAtPmlycV9iYXNlXS5vZmZzOworCXN0cnVjdCBtYXg4OTI1X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwltYXg4OTI1X2lycXNbZGF0YS0+aXJxIC0gY2hpcC0+aXJxX2Jhc2VdLmVuYWJsZQorCQk9IG1heDg5MjVfaXJxc1tkYXRhLT5pcnEgLSBjaGlwLT5pcnFfYmFzZV0ub2ZmczsKIH0KIAotc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODkyNV9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IG1heDg5MjVfY2hpcCAqY2hpcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JbWF4ODkyNV9pcnFzW2lycSAtIGNoaXAtPmlycV9iYXNlXS5lbmFibGUgPSAwOworCXN0cnVjdCBtYXg4OTI1X2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwltYXg4OTI1X2lycXNbZGF0YS0+aXJxIC0gY2hpcC0+aXJxX2Jhc2VdLmVuYWJsZSA9IDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbWF4ODkyNV9pcnFfY2hpcCA9IHsKIAkubmFtZQkJPSAibWF4ODkyNSIsCi0JLmJ1c19sb2NrCT0gbWF4ODkyNV9pcnFfbG9jaywKLQkuYnVzX3N5bmNfdW5sb2NrID0gbWF4ODkyNV9pcnFfc3luY191bmxvY2ssCi0JLmVuYWJsZQkJPSBtYXg4OTI1X2lycV9lbmFibGUsCi0JLmRpc2FibGUJPSBtYXg4OTI1X2lycV9kaXNhYmxlLAorCS5pcnFfYnVzX2xvY2sJPSBtYXg4OTI1X2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrID0gbWF4ODkyNV9pcnFfc3luY191bmxvY2ssCisJLmlycV9lbmFibGUJPSBtYXg4OTI1X2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCT0gbWF4ODkyNV9pcnFfZGlzYWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4ODkyNV9pcnFfaW5pdChzdHJ1Y3QgbWF4ODkyNV9jaGlwICpjaGlwLCBpbnQgaXJxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWF4ODk5OC1pcnEuYyBiL2RyaXZlcnMvbWZkL21heDg5OTgtaXJxLmMKaW5kZXggNDViZmU3Ny4uMzkwM2UxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWF4ODk5OC1pcnEuYworKysgYi9kcml2ZXJzL21mZC9tYXg4OTk4LWlycS5jCkBAIC0xMDIsMTYgKzEwMiwxNiBAQAogCXJldHVybiAmbWF4ODk5OF9pcnFzW2lycSAtIG1heDg5OTgtPmlycV9iYXNlXTsKIH0KIAotc3RhdGljIHZvaWQgbWF4ODk5OF9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODk5OF9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4ID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAogCW11dGV4X2xvY2soJm1heDg5OTgtPmlycWxvY2spOwogfQogCi1zdGF0aWMgdm9pZCBtYXg4OTk4X2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODk5OF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBtYXg4OTk4X2RldiAqbWF4ODk5OCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXg4OTk4LT5pcnFfbWFza3NfY3VyKTsgaSsrKSB7CkBAIC0xMjksMjggKzEyOSwzMCBAQAogCW11dGV4X3VubG9jaygmbWF4ODk5OC0+aXJxbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIG1heDg5OThfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWF4ODk5OF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXN0cnVjdCBtYXg4OTk4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b19tYXg4OTk4X2lycShtYXg4OTk4LCBpcnEpOworCXN0cnVjdCBtYXg4OTk4X2RldiAqbWF4ODk5OCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCBtYXg4OTk4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b19tYXg4OTk4X2lycShtYXg4OTk4LAorCQkJCQkJCSAgICAgICBkYXRhLT5pcnEpOwogCiAJbWF4ODk5OC0+aXJxX21hc2tzX2N1cltpcnFfZGF0YS0+cmVnIC0gMV0gJj0gfmlycV9kYXRhLT5tYXNrOwogfQogCi1zdGF0aWMgdm9pZCBtYXg4OTk4X2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXg4OTk4X2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXN0cnVjdCBtYXg4OTk4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b19tYXg4OTk4X2lycShtYXg4OTk4LCBpcnEpOworCXN0cnVjdCBtYXg4OTk4X2RldiAqbWF4ODk5OCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCBtYXg4OTk4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b19tYXg4OTk4X2lycShtYXg4OTk4LAorCQkJCQkJCSAgICAgICBkYXRhLT5pcnEpOwogCiAJbWF4ODk5OC0+aXJxX21hc2tzX2N1cltpcnFfZGF0YS0+cmVnIC0gMV0gfD0gaXJxX2RhdGEtPm1hc2s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbWF4ODk5OF9pcnFfY2hpcCA9IHsKIAkubmFtZSA9ICJtYXg4OTk4IiwKLQkuYnVzX2xvY2sgPSBtYXg4OTk4X2lycV9sb2NrLAotCS5idXNfc3luY191bmxvY2sgPSBtYXg4OTk4X2lycV9zeW5jX3VubG9jaywKLQkubWFzayA9IG1heDg5OThfaXJxX21hc2ssCi0JLnVubWFzayA9IG1heDg5OThfaXJxX3VubWFzaywKKwkuaXJxX2J1c19sb2NrID0gbWF4ODk5OF9pcnFfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jayA9IG1heDg5OThfaXJxX3N5bmNfdW5sb2NrLAorCS5pcnFfbWFzayA9IG1heDg5OThfaXJxX21hc2ssCisJLmlycV91bm1hc2sgPSBtYXg4OTk4X2lycV91bm1hc2ssCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbWF4ODk5OF9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRhdGEpCkBAIC0xODEsNiArMTgzLDEzIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpbnQgbWF4ODk5OF9pcnFfcmVzdW1lKHN0cnVjdCBtYXg4OTk4X2RldiAqbWF4ODk5OCkKK3sKKwlpZiAobWF4ODk5OC0+aXJxICYmIG1heDg5OTgtPmlycV9iYXNlKQorCQltYXg4OTk4X2lycV90aHJlYWQobWF4ODk5OC0+aXJxX2Jhc2UsIG1heDg5OTgpOworCXJldHVybiAwOworfQorCiBpbnQgbWF4ODk5OF9pcnFfaW5pdChzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTgpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg4OTk4LmMgYi9kcml2ZXJzL21mZC9tYXg4OTk4LmMKaW5kZXggYmI5OTc3Yi4uYmJmZTg2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWF4ODk5OC5jCisrKyBiL2RyaXZlcnMvbWZkL21heDg5OTguYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC5oPgpAQCAtNDAsNiArNDIsMTQgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBscDM5NzRfZGV2c1tdID0geworCXsKKwkJLm5hbWUgPSAibHAzOTc0LXBtaWMiLAorCX0sIHsKKwkJLm5hbWUgPSAibHAzOTc0LXJ0YyIsCisJfSwKK307CisKIGludCBtYXg4OTk4X3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsIHU4IHJlZywgdTggKmRlc3QpCiB7CiAJc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4ID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CkBAIC0xMzUsNiArMTQ1LDcgQEAKIAlpZiAocGRhdGEpIHsKIAkJbWF4ODk5OC0+b25vID0gcGRhdGEtPm9ubzsKIAkJbWF4ODk5OC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisJCW1heDg5OTgtPndha2V1cCA9IHBkYXRhLT53YWtldXA7CiAJfQogCW11dGV4X2luaXQoJm1heDg5OTgtPmlvbG9jayk7CiAKQEAgLTE0Myw5ICsxNTQsMjMgQEAKIAogCW1heDg5OThfaXJxX2luaXQobWF4ODk5OCk7CiAKLQlyZXQgPSBtZmRfYWRkX2RldmljZXMobWF4ODk5OC0+ZGV2LCAtMSwKLQkJCSAgICAgIG1heDg5OThfZGV2cywgQVJSQVlfU0laRShtYXg4OTk4X2RldnMpLAotCQkJICAgICAgTlVMTCwgMCk7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKG1heDg5OTgtPmRldik7CisKKwlzd2l0Y2ggKGlkLT5kcml2ZXJfZGF0YSkgeworCWNhc2UgVFlQRV9MUDM5NzQ6CisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhtYXg4OTk4LT5kZXYsIC0xLAorCQkJCWxwMzk3NF9kZXZzLCBBUlJBWV9TSVpFKGxwMzk3NF9kZXZzKSwKKwkJCQlOVUxMLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX01BWDg5OTg6CisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhtYXg4OTk4LT5kZXYsIC0xLAorCQkJCW1heDg5OThfZGV2cywgQVJSQVlfU0laRShtYXg4OTk4X2RldnMpLAorCQkJCU5VTEwsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtMTc4LDEwICsyMDMsMTEzIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDg5OThfaTJjX2lkKTsKIAorc3RhdGljIGludCBtYXg4OTk4X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKKwlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKworCWlmIChtYXg4OTk4LT53YWtldXApCisJCXNldF9pcnFfd2FrZShtYXg4OTk4LT5pcnEsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDg5OThfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4ID0gaTJjX2dldF9jbGllbnRkYXRhKGkyYyk7CisKKwlpZiAobWF4ODk5OC0+d2FrZXVwKQorCQlzZXRfaXJxX3dha2UobWF4ODk5OC0+aXJxLCAwKTsKKwkvKgorCSAqIEluIExQMzk3NCwgaWYgSVJRIHJlZ2lzdGVycyBhcmUgbm90ICJyZWFkICYgY2xlYXIiCisJICogd2hlbiBpdCdzIHNldCBkdXJpbmcgc2xlZXAsIHRoZSBpbnRlcnJ1cHQgYmVjb21lcworCSAqIGRpc2FibGVkLgorCSAqLworCXJldHVybiBtYXg4OTk4X2lycV9yZXN1bWUoaTJjX2dldF9jbGllbnRkYXRhKGkyYykpOworfQorCitzdHJ1Y3QgbWF4ODk5OF9yZWdfZHVtcCB7CisJdTgJYWRkcjsKKwl1OAl2YWw7Cit9OworI2RlZmluZSBTQVZFX0lURU0oeCkJeyAuYWRkciA9ICh4KSwgLnZhbCA9IDB4MCwgfQorc3RydWN0IG1heDg5OThfcmVnX2R1bXAgbWF4ODk5OF9kdW1wW10gPSB7CisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0lSUU0xKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfSVJRTTIpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19JUlFNMyksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0lSUU00KSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfU1RBVFVTTTEpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19TVEFUVVNNMiksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0NIR1IxKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfQ0hHUjIpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MRE9fQUNUSVZFX0RJU0NIQVJHRTEpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MRE9fQUNUSVZFX0RJU0NIQVJHRTEpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19CVUNLX0FDVElWRV9ESVNDSEFSR0UzKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfT05PRkYxKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfT05PRkYyKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfT05PRkYzKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfT05PRkY0KSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfQlVDSzFfVk9MVEFHRTEpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19CVUNLMV9WT0xUQUdFMiksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0JVQ0sxX1ZPTFRBR0UzKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfQlVDSzFfVk9MVEFHRTQpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19CVUNLMl9WT0xUQUdFMSksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0JVQ0syX1ZPTFRBR0UyKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTERPMl9MRE8zKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTERPNCksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0xETzUpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MRE82KSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTERPNyksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0xETzhfTERPOSksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0xETzEwX0xETzExKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTERPMTIpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MRE8xMyksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0xETzE0KSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTERPMTUpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MRE8xNiksCisJU0FWRV9JVEVNKE1BWDg5OThfUkVHX0xETzE3KSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfQktDSFIpLAorCVNBVkVfSVRFTShNQVg4OTk4X1JFR19MQkNORkcxKSwKKwlTQVZFX0lURU0oTUFYODk5OF9SRUdfTEJDTkZHMiksCit9OworLyogU2F2ZSByZWdpc3RlcnMgYmVmb3JlIGhpYmVybmF0aW9uICovCitzdGF0aWMgaW50IG1heDg5OThfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXg4OTk4X2R1bXApOyBpKyspCisJCW1heDg5OThfcmVhZF9yZWcoaTJjLCBtYXg4OTk4X2R1bXBbaV0uYWRkciwKKwkJCQkmbWF4ODk5OF9kdW1wW2ldLnZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzdG9yZSByZWdpc3RlcnMgYWZ0ZXIgaGliZXJuYXRpb24gKi8KK3N0YXRpYyBpbnQgbWF4ODk5OF9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXg4OTk4X2R1bXApOyBpKyspCisJCW1heDg5OThfd3JpdGVfcmVnKGkyYywgbWF4ODk5OF9kdW1wW2ldLmFkZHIsCisJCQkJbWF4ODk5OF9kdW1wW2ldLnZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbWF4ODk5OF9wbSA9IHsKKwkuc3VzcGVuZCA9IG1heDg5OThfc3VzcGVuZCwKKwkucmVzdW1lID0gbWF4ODk5OF9yZXN1bWUsCisJLmZyZWV6ZSA9IG1heDg5OThfZnJlZXplLAorCS5yZXN0b3JlID0gbWF4ODk5OF9yZXN0b3JlLAorfTsKKwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDg5OThfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJtYXg4OTk4IiwKIAkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5wbSA9ICZtYXg4OTk4X3BtLAogCX0sCiAJLnByb2JlID0gbWF4ODk5OF9pMmNfcHJvYmUsCiAJLnJlbW92ZSA9IG1heDg5OThfaTJjX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21jMTN4eHgtY29yZS5jIGIvZHJpdmVycy9tZmQvbWMxM3h4eC1jb3JlLmMKaW5kZXggYTJhYzJlZC4uYjlmY2FmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWMxM3h4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvbWMxM3h4eC1jb3JlLmMKQEAgLTc0OSw3ICs3NDksNyBAQAogCWlmIChyZXQpIHsKIGVycl9tYXNrOgogZXJyX3JldmlzaW9uOgotCQltdXRleF91bmxvY2soJm1jMTN4eHgtPmxvY2spOworCQltYzEzeHh4X3VubG9jayhtYzEzeHh4KTsKIAkJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CiAJCWtmcmVlKG1jMTN4eHgpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWZkLWNvcmUuYyBiL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKaW5kZXggZWM5OWY2OC4uZDgzYWQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWZkLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tZmQtY29yZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogc3RhdGljIGludCBtZmRfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBpZCwKQEAgLTgyLDYgKzgzLDkgQEAKIAlpZiAocmV0KQogCQlnb3RvIGZhaWxfcmVzOwogCisJaWYgKGNlbGwtPnBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKQorCQlwbV9ydW50aW1lX25vX2NhbGxiYWNrcygmcGRldi0+ZGV2KTsKKwogCWtmcmVlKHJlcyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3NoX21vYmlsZV9zZGhpLmMgYi9kcml2ZXJzL21mZC9zaF9tb2JpbGVfc2RoaS5jCmluZGV4IGYxNzE0ZjkuLjBhN2RmNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3NoX21vYmlsZV9zZGhpLmMKKysrIGIvZHJpdmVycy9tZmQvc2hfbW9iaWxlX3NkaGkuYwpAQCAtMTMxLDExICsxMzEsMTcgQEAKIAkgKi8KIAltbWNfZGF0YS0+ZmxhZ3MgfD0gVE1JT19NTUNfQkxLU1pfMkJZVEVTOwogCisJLyoKKwkgKiBBbGwgU0RISSBibG9ja3Mgc3VwcG9ydCBTRElPIElSUSBzaWduYWxsaW5nLgorCSAqLworCW1tY19kYXRhLT5mbGFncyB8PSBUTUlPX01NQ19TRElPX0lSUTsKKwogCWlmIChwICYmIHAtPmRtYV9zbGF2ZV90eCA+PSAwICYmIHAtPmRtYV9zbGF2ZV9yeCA+PSAwKSB7CiAJCXByaXYtPnBhcmFtX3R4LnNsYXZlX2lkID0gcC0+ZG1hX3NsYXZlX3R4OwogCQlwcml2LT5wYXJhbV9yeC5zbGF2ZV9pZCA9IHAtPmRtYV9zbGF2ZV9yeDsKIAkJcHJpdi0+ZG1hX3ByaXYuY2hhbl9wcml2X3R4ID0gJnByaXYtPnBhcmFtX3R4OwogCQlwcml2LT5kbWFfcHJpdi5jaGFuX3ByaXZfcnggPSAmcHJpdi0+cGFyYW1fcng7CisJCXByaXYtPmRtYV9wcml2LmFsaWdubWVudF9zaGlmdCA9IDE7IC8qIDItYnl0ZSBhbGlnbm1lbnQgKi8KIAkJbW1jX2RhdGEtPmRtYSA9ICZwcml2LT5kbWFfcHJpdjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3NtNTAxLmMgYi9kcml2ZXJzL21mZC9zbTUwMS5jCmluZGV4IGJjOTI3NWMuLjVkZTNhNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3NtNTAxLmMKKysrIGIvZHJpdmVycy9tZmQvc201MDEuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtNTAxLXJlZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogc3RydWN0IHNtNTAxX2RldmljZSB7CiAJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKQEAgLTc0NSwxMSArNzQ1LDggQEAKIAlpbnQgcmV0OwogCiAJZm9yIChwdHIgPSAwOyBwdHIgPCBwZGV2LT5udW1fcmVzb3VyY2VzOyBwdHIrKykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXNbJWRdIGZsYWdzICUwOGx4OiAlMDhsbHguLiUwOGxseFxuIiwKLQkJICAgICAgIHBkZXYtPm5hbWUsIHB0ciwKLQkJICAgICAgIHBkZXYtPnJlc291cmNlW3B0cl0uZmxhZ3MsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBkZXYtPnJlc291cmNlW3B0cl0uc3RhcnQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBkZXYtPnJlc291cmNlW3B0cl0uZW5kKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzWyVkXSAlcFJcbiIsCisJCSAgICAgICBwZGV2LT5uYW1lLCBwdHIsICZwZGV2LT5yZXNvdXJjZVtwdHJdKTsKIAl9CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zdG1wZS5jIGIvZHJpdmVycy9tZmQvc3RtcGUuYwppbmRleCBiMTE0ODdmLi4zZTU3MzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zdG1wZS5jCisrKyBiL2RyaXZlcnMvbWZkL3N0bXBlLmMKQEAgLTY5OSwxNiArNjk5LDE2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCBzdG1wZV9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgc3RtcGVfaXJxX2xvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAogCW11dGV4X2xvY2soJnN0bXBlLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bXBlX2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgc3RtcGVfaXJxX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJc3RydWN0IHN0bXBlX3ZhcmlhbnRfaW5mbyAqdmFyaWFudCA9IHN0bXBlLT52YXJpYW50OwogCWludCBudW0gPSBESVZfUk9VTkRfVVAodmFyaWFudC0+bnVtX2lycXMsIDgpOwogCWludCBpOwpAQCAtNzI3LDIwICs3MjcsMjAgQEAKIAltdXRleF91bmxvY2soJnN0bXBlLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bXBlX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdG1wZV9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHN0bXBlICpzdG1wZSA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JaW50IG9mZnNldCA9IGlycSAtIHN0bXBlLT5pcnFfYmFzZTsKKwlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IG9mZnNldCA9IGRhdGEtPmlycSAtIHN0bXBlLT5pcnFfYmFzZTsKIAlpbnQgcmVnb2Zmc2V0ID0gb2Zmc2V0IC8gODsKIAlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOwogCiAJc3RtcGUtPmllcltyZWdvZmZzZXRdICY9IH5tYXNrOwogfQogCi1zdGF0aWMgdm9pZCBzdG1wZV9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdG1wZV9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlpbnQgb2Zmc2V0ID0gaXJxIC0gc3RtcGUtPmlycV9iYXNlOworCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlpbnQgb2Zmc2V0ID0gZGF0YS0+aXJxIC0gc3RtcGUtPmlycV9iYXNlOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwogCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CiAKQEAgLTc0OSwxMCArNzQ5LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3RtcGVfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCQk9ICJzdG1wZSIsCi0JLmJ1c19sb2NrCQk9IHN0bXBlX2lycV9sb2NrLAotCS5idXNfc3luY191bmxvY2sJPSBzdG1wZV9pcnFfc3luY191bmxvY2ssCi0JLm1hc2sJCQk9IHN0bXBlX2lycV9tYXNrLAotCS51bm1hc2sJCQk9IHN0bXBlX2lycV91bm1hc2ssCisJLmlycV9idXNfbG9jawkJPSBzdG1wZV9pcnFfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jawk9IHN0bXBlX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX21hc2sJCT0gc3RtcGVfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gc3RtcGVfaXJxX3VubWFzaywKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN0bXBlX2lycV9pbml0KHN0cnVjdCBzdG1wZSAqc3RtcGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90N2w2NnhiLmMgYi9kcml2ZXJzL21mZC90N2w2NnhiLmMKaW5kZXggMDA2YzEyMS4uOWNhZWI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdDdsNjZ4Yi5jCisrKyBiL2RyaXZlcnMvbWZkL3Q3bDY2eGIuYwpAQCAtMTk5LDM3ICsxOTksMzcgQEAKIAkJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2Jhc2UgKyBpKTsKIH0KIAotc3RhdGljIHZvaWQgdDdsNjZ4Yl9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdDdsNjZ4Yl9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHQ3bDY2eGIgKnQ3bDY2eGIgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB0N2w2NnhiICp0N2w2NnhiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJdW5zaWduZWQgbG9uZwkJCWZsYWdzOwogCXU4IGltcjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0N2w2NnhiLT5sb2NrLCBmbGFncyk7CiAJaW1yID0gdG1pb19pb3JlYWQ4KHQ3bDY2eGItPnNjciArIFNDUl9JTVIpOwotCWltciB8PSAxIDw8IChpcnEgLSB0N2w2NnhiLT5pcnFfYmFzZSk7CisJaW1yIHw9IDEgPDwgKGRhdGEtPmlycSAtIHQ3bDY2eGItPmlycV9iYXNlKTsKIAl0bWlvX2lvd3JpdGU4KGltciwgdDdsNjZ4Yi0+c2NyICsgU0NSX0lNUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdDdsNjZ4Yi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCB0N2w2NnhiX2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHQ3bDY2eGJfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHQ3bDY2eGIgKnQ3bDY2eGIgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB0N2w2NnhiICp0N2w2NnhiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBpbXI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdDdsNjZ4Yi0+bG9jaywgZmxhZ3MpOwogCWltciA9IHRtaW9faW9yZWFkOCh0N2w2NnhiLT5zY3IgKyBTQ1JfSU1SKTsKLQlpbXIgJj0gfigxIDw8IChpcnEgLSB0N2w2NnhiLT5pcnFfYmFzZSkpOworCWltciAmPSB+KDEgPDwgKGRhdGEtPmlycSAtIHQ3bDY2eGItPmlycV9iYXNlKSk7CiAJdG1pb19pb3dyaXRlOChpbXIsIHQ3bDY2eGItPnNjciArIFNDUl9JTVIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQ3bDY2eGItPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0N2w2NnhiX2NoaXAgPSB7Ci0JLm5hbWUJPSAidDdsNjZ4YiIsCi0JLmFjawk9IHQ3bDY2eGJfaXJxX21hc2ssCi0JLm1hc2sJPSB0N2w2NnhiX2lycV9tYXNrLAotCS51bm1hc2sJPSB0N2w2NnhiX2lycV91bm1hc2ssCisJLm5hbWUJCT0gInQ3bDY2eGIiLAorCS5pcnFfYWNrCT0gdDdsNjZ4Yl9pcnFfbWFzaywKKwkuaXJxX21hc2sJPSB0N2w2NnhiX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gdDdsNjZ4Yl9pcnFfdW5tYXNrLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90YzYzOTN4Yi5jIGIvZHJpdmVycy9tZmQvdGM2MzkzeGIuYwppbmRleCAxZWE4MGQ4YS4uOWEyMzg2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdGM2MzkzeGIuYworKysgYi9kcml2ZXJzL21mZC90YzYzOTN4Yi5jCkBAIC01MjcsNDEgKzUyNyw0MSBAQAogCQl9CiB9CiAKLXN0YXRpYyB2b2lkIHRjNjM5M3hiX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHRjNjM5M3hiX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewogfQogCi1zdGF0aWMgdm9pZCB0YzYzOTN4Yl9pcnFfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdGM2MzkzeGJfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCB0YzYzOTN4YiAqdGM2MzkzeGIgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB0YzYzOTN4YiAqdGM2MzkzeGIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IGltcjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0YzYzOTN4Yi0+bG9jaywgZmxhZ3MpOwogCWltciA9IHRtaW9faW9yZWFkOCh0YzYzOTN4Yi0+c2NyICsgU0NSX0lNUik7Ci0JaW1yIHw9IDEgPDwgKGlycSAtIHRjNjM5M3hiLT5pcnFfYmFzZSk7CisJaW1yIHw9IDEgPDwgKGRhdGEtPmlycSAtIHRjNjM5M3hiLT5pcnFfYmFzZSk7CiAJdG1pb19pb3dyaXRlOChpbXIsIHRjNjM5M3hiLT5zY3IgKyBTQ1JfSU1SKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YzYzOTN4Yi0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCB0YzYzOTN4Yl9pcnFfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB0YzYzOTN4Yl9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgdGM2MzkzeGIgKnRjNjM5M3hiID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgdGM2MzkzeGIgKnRjNjM5M3hiID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBpbXI7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGM2MzkzeGItPmxvY2ssIGZsYWdzKTsKIAlpbXIgPSB0bWlvX2lvcmVhZDgodGM2MzkzeGItPnNjciArIFNDUl9JTVIpOwotCWltciAmPSB+KDEgPDwgKGlycSAtIHRjNjM5M3hiLT5pcnFfYmFzZSkpOworCWltciAmPSB+KDEgPDwgKGRhdGEtPmlycSAtIHRjNjM5M3hiLT5pcnFfYmFzZSkpOwogCXRtaW9faW93cml0ZTgoaW1yLCB0YzYzOTN4Yi0+c2NyICsgU0NSX0lNUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGM2MzkzeGItPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0YzYzOTN4Yl9jaGlwID0gewotCS5uYW1lCT0gInRjNjM5M3hiIiwKLQkuYWNrCT0gdGM2MzkzeGJfaXJxX2FjaywKLQkubWFzawk9IHRjNjM5M3hiX2lycV9tYXNrLAotCS51bm1hc2sJPSB0YzYzOTN4Yl9pcnFfdW5tYXNrLAorCS5uYW1lCQk9ICJ0YzYzOTN4YiIsCisJLmlycV9hY2sJPSB0YzYzOTN4Yl9pcnFfYWNrLAorCS5pcnFfbWFzawk9IHRjNjM5M3hiX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCT0gdGM2MzkzeGJfaXJxX3VubWFzaywKIH07CiAKIHN0YXRpYyB2b2lkIHRjNjM5M3hiX2F0dGFjaF9pcnEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjUwMTAuYyBiL2RyaXZlcnMvbWZkL3RwczY1MDEwLmMKaW5kZXggOTAxODdmZS4uOTNkNWZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjUwMTAuYworKysgYi9kcml2ZXJzL21mZC90cHM2NTAxMC5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMvdHBzNjUwMTAuaD4KIAotI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTg2eC5jIGIvZHJpdmVycy9tZmQvdHBzNjU4NnguYwppbmRleCBiNDkzMWFiLi42MjdjZjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTg2eC5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1ODZ4LmMKQEAgLTQ2LDggKzQ2LDYgQEAKIAogLyogZGV2aWNlIGlkICovCiAjZGVmaW5lIFRQUzY1ODZYX1ZFUlNJT05DUkMJMHhjZAotI2RlZmluZSBUUFM2NTg2MjFBX1ZFUlNJT05DUkMJMHgxNQotI2RlZmluZSBUUFM2NTg2MjFDX1ZFUlNJT05DUkMJMHgyYwogCiBzdHJ1Y3QgdHBzNjU4NnhfaXJxX2RhdGEgewogCXU4CW1hc2tfcmVnOwpAQCAtMzI1LDM3ICszMjMsMzcgQEAKIAlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKHRwczY1ODZ4LT5kZXYsIE5VTEwsIF9fcmVtb3ZlX3N1YmRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHRwczY1ODZ4X2lycV9sb2NrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB0cHM2NTg2eF9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHRwczY1ODZ4ICp0cHM2NTg2eCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHRwczY1ODZ4ICp0cHM2NTg2eCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmdHBzNjU4NngtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgdHBzNjU4NnhfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdHBzNjU4NnhfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhKQogewotCXN0cnVjdCB0cHM2NTg2eCAqdHBzNjU4NnggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXVuc2lnbmVkIGludCBfX2lycSA9IGlycSAtIHRwczY1ODZ4LT5pcnFfYmFzZTsKKwlzdHJ1Y3QgdHBzNjU4NnggKnRwczY1ODZ4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoaXJxX2RhdGEpOworCXVuc2lnbmVkIGludCBfX2lycSA9IGlycV9kYXRhLT5pcnEgLSB0cHM2NTg2eC0+aXJxX2Jhc2U7CiAJY29uc3Qgc3RydWN0IHRwczY1ODZ4X2lycV9kYXRhICpkYXRhID0gJnRwczY1ODZ4X2lycXNbX19pcnFdOwogCiAJdHBzNjU4NngtPm1hc2tfcmVnW2RhdGEtPm1hc2tfcmVnXSAmPSB+ZGF0YS0+bWFza19tYXNrOwogCXRwczY1ODZ4LT5pcnFfZW4gfD0gKDEgPDwgX19pcnEpOwogfQogCi1zdGF0aWMgdm9pZCB0cHM2NTg2eF9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdHBzNjU4NnhfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICppcnFfZGF0YSkKIHsKLQlzdHJ1Y3QgdHBzNjU4NnggKnRwczY1ODZ4ID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgdHBzNjU4NnggKnRwczY1ODZ4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoaXJxX2RhdGEpOwogCi0JdW5zaWduZWQgaW50IF9faXJxID0gaXJxIC0gdHBzNjU4NngtPmlycV9iYXNlOworCXVuc2lnbmVkIGludCBfX2lycSA9IGlycV9kYXRhLT5pcnEgLSB0cHM2NTg2eC0+aXJxX2Jhc2U7CiAJY29uc3Qgc3RydWN0IHRwczY1ODZ4X2lycV9kYXRhICpkYXRhID0gJnRwczY1ODZ4X2lycXNbX19pcnFdOwogCiAJdHBzNjU4NngtPm1hc2tfcmVnW2RhdGEtPm1hc2tfcmVnXSB8PSBkYXRhLT5tYXNrX21hc2s7CiAJdHBzNjU4NngtPmlycV9lbiAmPSB+KDEgPDwgX19pcnEpOwogfQogCi1zdGF0aWMgdm9pZCB0cHM2NTg2eF9pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHRwczY1ODZ4X2lycV9zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHRwczY1ODZ4ICp0cHM2NTg2eCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHRwczY1ODZ4ICp0cHM2NTg2eCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHBzNjU4NngtPm1hc2tfcmVnKTsgaSsrKSB7CkBAIC00MjEsMTAgKzQxOSwxMCBAQAogCXRwczY1ODZ4LT5pcnFfYmFzZSA9IGlycV9iYXNlOwogCiAJdHBzNjU4NngtPmlycV9jaGlwLm5hbWUgPSAidHBzNjU4NngiOwotCXRwczY1ODZ4LT5pcnFfY2hpcC5lbmFibGUgPSB0cHM2NTg2eF9pcnFfZW5hYmxlOwotCXRwczY1ODZ4LT5pcnFfY2hpcC5kaXNhYmxlID0gdHBzNjU4NnhfaXJxX2Rpc2FibGU7Ci0JdHBzNjU4NngtPmlycV9jaGlwLmJ1c19sb2NrID0gdHBzNjU4NnhfaXJxX2xvY2s7Ci0JdHBzNjU4NngtPmlycV9jaGlwLmJ1c19zeW5jX3VubG9jayA9IHRwczY1ODZ4X2lycV9zeW5jX3VubG9jazsKKwl0cHM2NTg2eC0+aXJxX2NoaXAuaXJxX2VuYWJsZSA9IHRwczY1ODZ4X2lycV9lbmFibGU7CisJdHBzNjU4NngtPmlycV9jaGlwLmlycV9kaXNhYmxlID0gdHBzNjU4NnhfaXJxX2Rpc2FibGU7CisJdHBzNjU4NngtPmlycV9jaGlwLmlycV9idXNfbG9jayA9IHRwczY1ODZ4X2lycV9sb2NrOworCXRwczY1ODZ4LT5pcnFfY2hpcC5pcnFfYnVzX3N5bmNfdW5sb2NrID0gdHBzNjU4NnhfaXJxX3N5bmNfdW5sb2NrOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHBzNjU4NnhfaXJxcyk7IGkrKykgewogCQlpbnQgX19pcnEgPSBpICsgdHBzNjU4NngtPmlycV9iYXNlOwpAQCAtNDk4LDExICs0OTYsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlpZiAoKHJldCAhPSBUUFM2NTg2MjFBX1ZFUlNJT05DUkMpICYmCi0JICAgIChyZXQgIT0gVFBTNjU4NjIxQ19WRVJTSU9OQ1JDKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuc3VwcG9ydGVkIGNoaXAgSUQ6ICV4XG4iLCByZXQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiVkVSU0lPTkNSQyBpcyAlMDJ4XG4iLCByZXQpOwogCiAJdHBzNjU4NnggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjU4NngpLCBHRlBfS0VSTkVMKTsKIAlpZiAodHBzNjU4NnggPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMgYi9kcml2ZXJzL21mZC90d2wtY29yZS5jCmluZGV4IDEyYWJkNWIuLmEzNWZhN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2wtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKQEAgLTEwMDMsNyArMTAwMyw3IEBACiB9CiAKIC8qIE5PVEU6ICB0aGlzIGRyaXZlciBvbmx5IGhhbmRsZXMgYSBzaW5nbGUgdHdsNDAzMC90cHM2NTl4MCBjaGlwICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHR3bF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJaW50CQkJCXN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCmluZGV4IDVkM2ExNDcuLjYzYTMwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYwpAQCAtNTk5LDM4ICs1OTksMzggQEAKICAqIGNvbXBsZXRpb24sIHBvdGVudGlhbGx5IGluY2x1ZGluZyBzb21lIHJlLW9yZGVyaW5nLCBvZiB0aGVzZSByZXF1ZXN0cy4KICAqLwogCi1zdGF0aWMgdm9pZCB0d2w0MDMwX3NpaF9tYXNrKHVuc2lnbmVkIGlycSkKK3N0YXRpYyB2b2lkIHR3bDQwMzBfc2loX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBzaWhfYWdlbnQgKnNpaCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHNpaF9hZ2VudCAqc2loID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzaWhfYWdlbnRfbG9jaywgZmxhZ3MpOwotCXNpaC0+aW1yIHw9IEJJVChpcnEgLSBzaWgtPmlycV9iYXNlKTsKKwlzaWgtPmltciB8PSBCSVQoZGF0YS0+aXJxIC0gc2loLT5pcnFfYmFzZSk7CiAJc2loLT5pbXJfY2hhbmdlX3BlbmRpbmcgPSB0cnVlOwogCXF1ZXVlX3dvcmsod3EsICZzaWgtPm1hc2tfd29yayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgdHdsNDAzMF9zaWhfdW5tYXNrKHVuc2lnbmVkIGlycSkKK3N0YXRpYyB2b2lkIHR3bDQwMzBfc2loX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHNpaF9hZ2VudCAqc2loID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2loX2FnZW50ICpzaWggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7Ci0Jc2loLT5pbXIgJj0gfkJJVChpcnEgLSBzaWgtPmlycV9iYXNlKTsKKwlzaWgtPmltciAmPSB+QklUKGRhdGEtPmlycSAtIHNpaC0+aXJxX2Jhc2UpOwogCXNpaC0+aW1yX2NoYW5nZV9wZW5kaW5nID0gdHJ1ZTsKIAlxdWV1ZV93b3JrKHdxLCAmc2loLT5tYXNrX3dvcmspOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpaF9hZ2VudF9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgdHdsNDAzMF9zaWhfc2V0X3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0cmlnZ2VyKQorc3RhdGljIGludCB0d2w0MDMwX3NpaF9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIHRyaWdnZXIpCiB7Ci0Jc3RydWN0IHNpaF9hZ2VudCAqc2loID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOworCXN0cnVjdCBzaWhfYWdlbnQgKnNpaCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGRhdGEtPmlycSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghZGVzYykgewotCQlwcl9lcnIoInR3bDQwMzA6IEludmFsaWQgSVJROiAlZFxuIiwgaXJxKTsKKwkJcHJfZXJyKCJ0d2w0MDMwOiBJbnZhbGlkIElSUTogJWRcbiIsIGRhdGEtPmlycSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNjQxLDcgKzY0MSw3IEBACiAJaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSAhPSB0cmlnZ2VyKSB7CiAJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1RZUEVfU0VOU0VfTUFTSzsKIAkJZGVzYy0+c3RhdHVzIHw9IHRyaWdnZXI7Ci0JCXNpaC0+ZWRnZV9jaGFuZ2UgfD0gQklUKGlycSAtIHNpaC0+aXJxX2Jhc2UpOworCQlzaWgtPmVkZ2VfY2hhbmdlIHw9IEJJVChkYXRhLT5pcnEgLSBzaWgtPmlycV9iYXNlKTsKIAkJcXVldWVfd29yayh3cSwgJnNpaC0+ZWRnZV93b3JrKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2loX2FnZW50X2xvY2ssIGZsYWdzKTsKQEAgLTY1MCw5ICs2NTAsOSBAQAogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHR3bDQwMzBfc2loX2lycV9jaGlwID0gewogCS5uYW1lCQk9ICJ0d2w0MDMwIiwKLQkubWFzawkJPSB0d2w0MDMwX3NpaF9tYXNrLAotCS51bm1hc2sJCT0gdHdsNDAzMF9zaWhfdW5tYXNrLAotCS5zZXRfdHlwZQk9IHR3bDQwMzBfc2loX3NldF90eXBlLAorCS5pcnFfbWFzayAgICAgIAk9IHR3bDQwMzBfc2loX21hc2ssCisJLmlycV91bm1hc2sJPSB0d2w0MDMwX3NpaF91bm1hc2ssCisJLmlycV9zZXRfdHlwZQk9IHR3bDQwMzBfc2loX3NldF90eXBlLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w2MDMwLWlycS5jCmluZGV4IDA2Yzg5NTUuLjQwODJlZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDYwMzAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNjAzMC1pcnEuYwpAQCAtMzMyLDcgKzMzMiw3IEBACiAJICovCiAJdHdsNjAzMF9pcnFfY2hpcCA9IGR1bW15X2lycV9jaGlwOwogCXR3bDYwMzBfaXJxX2NoaXAubmFtZSA9ICJ0d2w2MDMwIjsKLQl0d2w2MDMwX2lycV9jaGlwLnNldF90eXBlID0gTlVMTDsKKwl0d2w2MDMwX2lycV9jaGlwLmlycV9zZXRfdHlwZSA9IE5VTEw7CiAKIAlmb3IgKGkgPSBpcnFfYmFzZTsgaSA8IGlycV9lbmQ7IGkrKykgewogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJnR3bDYwMzBfaXJxX2NoaXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC92eDg1NS5jIGIvZHJpdmVycy9tZmQvdng4NTUuYwppbmRleCBlYmIwNTk3Li4zNDgwNTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC92eDg1NS5jCisrKyBiL2RyaXZlcnMvbWZkL3Z4ODU1LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHZ4ODU1X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2eDg1NV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jCmluZGV4IDc2Y2FkY2YuLjNmZTlhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYwpAQCAtMTU0MSw2ICsxNTQxLDEyIEBACiAJCWRldl9pbmZvKHdtODMxeC0+ZGV2LCAiV004MzI1IHJldmlzaW9uICVjXG4iLCAnQScgKyByZXYpOwogCQlicmVhazsKIAorCWNhc2UgV004MzI2OgorCQlwYXJlbnQgPSBXTTgzMjY7CisJCXdtODMxeC0+bnVtX2dwaW8gPSAxMjsKKwkJZGV2X2luZm8od204MzF4LT5kZXYsICJXTTgzMjYgcmV2aXNpb24gJWNcbiIsICdBJyArIHJldik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZGV2X2Vycih3bTgzMXgtPmRldiwgIlVua25vd24gV004MzF4IGRldmljZSAlMDR4XG4iLCByZXQpOwogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTYxMCwxOCArMTYxNiw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzMjA6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCi0JCQkJICAgICAgd204MzIwX2RldnMsIEFSUkFZX1NJWkUod204MzIwX2RldnMpLAotCQkJCSAgICAgIE5VTEwsIDApOwotCQlicmVhazsKLQogCWNhc2UgV004MzIxOgotCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIC0xLAotCQkJCSAgICAgIHdtODMyMF9kZXZzLCBBUlJBWV9TSVpFKHdtODMyMF9kZXZzKSwKLQkJCQkgICAgICBOVUxMLCAwKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFdNODMyNToKKwljYXNlIFdNODMyNjoKIAkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKIAkJCQkgICAgICB3bTgzMjBfZGV2cywgQVJSQVlfU0laRSh3bTgzMjBfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzMXgtaTJjLmMgYi9kcml2ZXJzL21mZC93bTgzMXgtaTJjLmMKaW5kZXggMTU2YjE5OC4uMzg1M2ZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzF4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pMmMuYwpAQCAtOTQsOSArOTQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtODMxeF9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLCBwbV9tZXNzYWdlX3QgbWVzZykKK3N0YXRpYyBpbnQgd204MzF4X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiB3bTgzMXhfZGV2aWNlX3N1c3BlbmQod204MzF4KTsKIH0KQEAgLTEwOCwxOSArMTA4LDIzIEBACiAJeyAid204MzIwIiwgV004MzIwIH0sCiAJeyAid204MzIxIiwgV004MzIxIH0sCiAJeyAid204MzI1IiwgV004MzI1IH0sCisJeyAid204MzI2IiwgV004MzI2IH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODMxeF9pMmNfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd204MzF4X3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IHdtODMxeF9pMmNfc3VzcGVuZCwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTgzMXhfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJ3bTgzMXgiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgPSAid204MzF4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZ3bTgzMXhfcG1fb3BzLAogCX0sCiAJLnByb2JlID0gd204MzF4X2kyY19wcm9iZSwKIAkucmVtb3ZlID0gd204MzF4X2kyY19yZW1vdmUsCi0JLnN1c3BlbmQgPSB3bTgzMXhfaTJjX3N1c3BlbmQsCiAJLmlkX3RhYmxlID0gd204MzF4X2kyY19pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwppbmRleCAyOTQxODNiLi5mNzE5MmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC0zNDUsMTYgKzM0NSwxNiBAQAogCXJldHVybiAmd204MzF4X2lycXNbaXJxIC0gd204MzF4LT5pcnFfYmFzZV07CiB9CiAKLXN0YXRpYyB2b2lkIHdtODMxeF9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgd204MzF4X2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmd204MzF4LT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHdtODMxeF9pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODMxeF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXgtPmlycV9tYXNrc19jdXIpOyBpKyspIHsKQEAgLTM3MSwyOCArMzcxLDMwIEBACiAJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgd204MzF4X2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODMxeF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXN0cnVjdCB3bTgzMXhfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODMxeF9pcnEod204MzF4LCBpcnEpOworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3bTgzMXhfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODMxeF9pcnEod204MzF4LAorCQkJCQkJCSAgICAgZGF0YS0+aXJxKTsKIAogCXdtODMxeC0+aXJxX21hc2tzX2N1cltpcnFfZGF0YS0+cmVnIC0gMV0gJj0gfmlycV9kYXRhLT5tYXNrOwogfQogCi1zdGF0aWMgdm9pZCB3bTgzMXhfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODMxeF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHdtODMxeCAqd204MzF4ID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlzdHJ1Y3Qgd204MzF4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTgzMXhfaXJxKHdtODMxeCwgaXJxKTsKKwlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd204MzF4X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTgzMXhfaXJxKHdtODMxeCwKKwkJCQkJCQkgICAgIGRhdGEtPmlycSk7CiAKIAl3bTgzMXgtPmlycV9tYXNrc19jdXJbaXJxX2RhdGEtPnJlZyAtIDFdIHw9IGlycV9kYXRhLT5tYXNrOwogfQogCi1zdGF0aWMgaW50IHdtODMxeF9pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCitzdGF0aWMgaW50IHdtODMxeF9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCWludCB2YWw7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHZhbCwgaXJxOwogCi0JaXJxID0gaXJxIC0gd204MzF4LT5pcnFfYmFzZTsKKwlpcnEgPSBkYXRhLT5pcnEgLSB3bTgzMXgtPmlycV9iYXNlOwogCiAJaWYgKGlycSA8IFdNODMxWF9JUlFfR1BJT18xIHx8IGlycSA+IFdNODMxWF9JUlFfR1BJT18xMSkgewogCQkvKiBJZ25vcmUgaW50ZXJuYWwtb25seSBJUlFzICovCkBAIC00MjEsMTIgKzQyMywxMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdtODMxeF9pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJ3bTgzMXgiLAotCS5idXNfbG9jayA9IHdtODMxeF9pcnFfbG9jaywKLQkuYnVzX3N5bmNfdW5sb2NrID0gd204MzF4X2lycV9zeW5jX3VubG9jaywKLQkubWFzayA9IHdtODMxeF9pcnFfbWFzaywKLQkudW5tYXNrID0gd204MzF4X2lycV91bm1hc2ssCi0JLnNldF90eXBlID0gd204MzF4X2lycV9zZXRfdHlwZSwKKwkubmFtZQkJCT0gIndtODMxeCIsCisJLmlycV9idXNfbG9jawkJPSB3bTgzMXhfaXJxX2xvY2ssCisJLmlycV9idXNfc3luY191bmxvY2sJPSB3bTgzMXhfaXJxX3N5bmNfdW5sb2NrLAorCS5pcnFfbWFzawkJPSB3bTgzMXhfaXJxX21hc2ssCisJLmlycV91bm1hc2sJCT0gd204MzF4X2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZQkJPSB3bTgzMXhfaXJxX3NldF90eXBlLAogfTsKIAogLyogVGhlIHByb2Nlc3Npbmcgb2YgdGhlIHByaW1hcnkgaW50ZXJydXB0IG9jY3VycyBpbiBhIHRocmVhZCBzbyB0aGF0CkBAIC01MTUsNiArNTE3LDE3IEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qIFRyeSB0byBmbGFnIC9JUlEgYXMgYSB3YWtlIHNvdXJjZTsgdGhlcmUgYXJlIGEgbnVtYmVyIG9mCisJICogdW5jb25kaXRpb25hbCB3YWtlIHNvdXJjZXMgaW4gdGhlIFBNSUMgc28gdGhpcyBpc24ndAorCSAqIGNvbmRpdGlvbmFsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBjYXJlICp0b28qIG11Y2ggaWYgaXQKKwkgKiBmYWlscy4KKwkgKi8KKwlyZXQgPSBlbmFibGVfaXJxX3dha2UoaXJxKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X3dhcm4od204MzF4LT5kZXYsICJDYW4ndCBlbmFibGUgSVJRIGFzIHdha2Ugc291cmNlOiAlZFxuIiwKKwkJCSByZXQpOworCX0KKwogCXdtODMxeC0+aXJxID0gaXJxOwogCXdtODMxeC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1zcGkuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1zcGkuYwppbmRleCAyNzg5YjE1Li4wYThmNzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtc3BpLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LXNwaS5jCkBAIC04MSw2ICs4MSw4IEBACiAJCXR5cGUgPSBXTTgzMjE7CiAJZWxzZSBpZiAoc3RyY21wKHNwaS0+bW9kYWxpYXMsICJ3bTgzMjUiKSA9PSAwKQogCQl0eXBlID0gV004MzI1OworCWVsc2UgaWYgKHN0cmNtcChzcGktPm1vZGFsaWFzLCAid204MzI2IikgPT0gMCkKKwkJdHlwZSA9IFdNODMyNjsKIAllbHNlIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJVbmtub3duIGRldmljZSB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODQsNiArMTg2LDE3IEBACiAJLnN1c3BlbmQJPSB3bTgzMXhfc3BpX3N1c3BlbmQsCiB9OwogCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgd204MzI2X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAid204MzI2IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IHdtODMxeF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bTgzMXhfc3BpX3JlbW92ZSksCisJLnN1c3BlbmQJPSB3bTgzMXhfc3BpX3N1c3BlbmQsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCB3bTgzMXhfc3BpX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtMjEyLDEyICsyMjUsMTcgQEAKIAlpZiAocmV0ICE9IDApCiAJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODMyNSBTUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKIAorCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJndtODMyNl9zcGlfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApCisJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODMyNiBTUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKHdtODMxeF9zcGlfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB3bTgzMXhfc3BpX2V4aXQodm9pZCkKIHsKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndtODMyNl9zcGlfZHJpdmVyKTsKIAlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndtODMyNV9zcGlfZHJpdmVyKTsKIAlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndtODMyMV9zcGlfZHJpdmVyKTsKIAlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndtODMyMF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYwppbmRleCBmNTZjOWFkLi41ODM5OTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzNTAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWlycS5jCkBAIC00MTcsMTYgKzQxNywxNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgd204MzUwX2lycV9sb2NrKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB3bTgzNTBfaXJxX2xvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAKIAltdXRleF9sb2NrKCZ3bTgzNTAtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgd204MzUwX2lycV9zeW5jX3VubG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgd204MzUwX2lycV9zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODM1MC0+aXJxX21hc2tzKTsgaSsrKSB7CkBAIC00NDIsMjggKzQ0MiwzMCBAQAogCW11dGV4X3VubG9jaygmd204MzUwLT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHdtODM1MF9pcnFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB3bTgzNTBfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlzdHJ1Y3Qgd204MzUwX2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTgzNTBfaXJxKHdtODM1MCwgaXJxKTsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd204MzUwX2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTgzNTBfaXJxKHdtODM1MCwKKwkJCQkJCQkgICAgIGRhdGEtPmlycSk7CiAKIAl3bTgzNTAtPmlycV9tYXNrc1tpcnFfZGF0YS0+cmVnXSAmPSB+aXJxX2RhdGEtPm1hc2s7CiB9CiAKLXN0YXRpYyB2b2lkIHdtODM1MF9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgd204MzUwX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXN0cnVjdCB3bTgzNTBfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODM1MF9pcnEod204MzUwLCBpcnEpOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3bTgzNTBfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODM1MF9pcnEod204MzUwLAorCQkJCQkJCSAgICAgZGF0YS0+aXJxKTsKIAogCXdtODM1MC0+aXJxX21hc2tzW2lycV9kYXRhLT5yZWddIHw9IGlycV9kYXRhLT5tYXNrOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdtODM1MF9pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJ3bTgzNTAiLAotCS5idXNfbG9jayA9IHdtODM1MF9pcnFfbG9jaywKLQkuYnVzX3N5bmNfdW5sb2NrID0gd204MzUwX2lycV9zeW5jX3VubG9jaywKLQkuZGlzYWJsZSA9IHdtODM1MF9pcnFfZGlzYWJsZSwKLQkuZW5hYmxlID0gd204MzUwX2lycV9lbmFibGUsCisJLm5hbWUJCQk9ICJ3bTgzNTAiLAorCS5pcnFfYnVzX2xvY2sJCT0gd204MzUwX2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gd204MzUwX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2Rpc2FibGUJCT0gd204MzUwX2lycV9kaXNhYmxlLAorCS5pcnFfZW5hYmxlCQk9IHdtODM1MF9pcnFfZW5hYmxlLAogfTsKIAogaW50IHdtODM1MF9pcnFfaW5pdChzdHJ1Y3Qgd204MzUwICp3bTgzNTAsIGludCBpcnEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jIGIvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYwppbmRleCBiM2IyYWFmOC4uNDEyMzNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogCkBAIC0xNjksOCArMTcwLDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3bTg5OTRfc2V0X2JpdHMpOwogCiBzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHdtODk5NF9yZWd1bGF0b3JfZGV2c1tdID0gewotCXsgLm5hbWUgPSAid204OTk0LWxkbyIsIC5pZCA9IDEgfSwKLQl7IC5uYW1lID0gIndtODk5NC1sZG8iLCAuaWQgPSAyIH0sCisJeworCQkubmFtZSA9ICJ3bTg5OTQtbGRvIiwKKwkJLmlkID0gMSwKKwkJLnBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzID0gdHJ1ZSwKKwl9LAorCXsKKwkJLm5hbWUgPSAid204OTk0LWxkbyIsCisJCS5pZCA9IDIsCisJCS5wbV9ydW50aW1lX25vX2NhbGxiYWNrcyA9IHRydWUsCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd204OTk0X2NvZGVjX3Jlc291cmNlc1tdID0gewpAQCAtMjAwLDYgKzIwOSw3IEBACiAJCS5uYW1lID0gIndtODk5NC1ncGlvIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODk5NF9ncGlvX3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTg5OTRfZ3Bpb19yZXNvdXJjZXMsCisJCS5wbV9ydW50aW1lX25vX2NhbGxiYWNrcyA9IHRydWUsCiAJfSwKIH07CiAKQEAgLTIxOCw4ICsyMjgsMjAgQEAKIAkiU1BLVkREMiIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqd204OTU4X21haW5fc3VwcGxpZXNbXSA9IHsKKwkiREJWREQxIiwKKwkiREJWREQyIiwKKwkiREJWREQzIiwKKwkiRENWREQiLAorCSJBVkREMSIsCisJIkFWREQyIiwKKwkiQ1BWREQiLAorCSJTUEtWREQxIiwKKwkiU1BLVkREMiIsCit9OworCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHdtODk5NF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHdtODk5NF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0OwpAQCAtMjM5LDcgKzI2MSw3IEBACiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNhdmUgTERPIHJlZ2lzdGVyczogJWRcbiIsIHJldCk7CiAKLQlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpLAorCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUod204OTk0LT5udW1fc3VwcGxpZXMsCiAJCQkJICAgICB3bTg5OTQtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CkBAIC0yNDksMTIgKzI3MSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdtODk5NF9kZXZpY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgd204OTk0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHdtODk5NCAqd204OTk0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODk5NF9tYWluX3N1cHBsaWVzKSwKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUod204OTk0LT5udW1fc3VwcGxpZXMsCiAJCQkJICAgIHdtODk5NC0+c3VwcGxpZXMpOwogCWlmIChyZXQgIT0gMCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwpAQCAtMzA1LDkgKzMyNywxMCBAQAogLyoKICAqIEluc3RhbnRpYXRlIHRoZSBnZW5lcmljIG5vbi1jb250cm9sIHBhcnRzIG9mIHRoZSBkZXZpY2UuCiAgKi8KLXN0YXRpYyBpbnQgd204OTk0X2RldmljZV9pbml0KHN0cnVjdCB3bTg5OTQgKndtODk5NCwgdW5zaWduZWQgbG9uZyBpZCwgaW50IGlycSkKK3N0YXRpYyBpbnQgd204OTk0X2RldmljZV9pbml0KHN0cnVjdCB3bTg5OTQgKndtODk5NCwgaW50IGlycSkKIHsKIAlzdHJ1Y3Qgd204OTk0X3BkYXRhICpwZGF0YSA9IHdtODk5NC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CiAJaW50IHJldCwgaTsKIAogCW11dGV4X2luaXQoJndtODk5NC0+aW9fbG9jayk7CkBAIC0zMjMsMjUgKzM0Niw0OCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV004OTk0OgorCQl3bTg5OTQtPm51bV9zdXBwbGllcyA9IEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpOworCQlicmVhazsKKwljYXNlIFdNODk1ODoKKwkJd204OTk0LT5udW1fc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHdtODk1OF9tYWluX3N1cHBsaWVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXdtODk5NC0+c3VwcGxpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSkgKgotCQkJCSAgIEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpLAorCQkJCSAgIHdtODk5NC0+bnVtX3N1cHBsaWVzLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghd204OTk0LT5zdXBwbGllcykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyk7IGkrKykKLQkJd204OTk0LT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg5OTRfbWFpbl9zdXBwbGllc1tpXTsKLQotCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCh3bTg5OTQtPmRldiwgQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyksCisJc3dpdGNoICh3bTg5OTQtPnR5cGUpIHsKKwljYXNlIFdNODk5NDoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpOyBpKyspCisJCQl3bTg5OTQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk5NF9tYWluX3N1cHBsaWVzW2ldOworCQlicmVhazsKKwljYXNlIFdNODk1ODoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTU4X21haW5fc3VwcGxpZXMpOyBpKyspCisJCQl3bTg5OTQtPnN1cHBsaWVzW2ldLnN1cHBseSA9IHdtODk1OF9tYWluX3N1cHBsaWVzW2ldOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQkKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQod204OTk0LT5kZXYsIHdtODk5NC0+bnVtX3N1cHBsaWVzLAogCQkJCSB3bTg5OTQtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycih3bTg5OTQtPmRldiwgIkZhaWxlZCB0byBnZXQgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9zdXBwbGllczsKIAl9CiAKLQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyksCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKHdtODk5NC0+bnVtX3N1cHBsaWVzLAogCQkJCSAgICB3bTg5OTQtPnN1cHBsaWVzKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZGV2X2Vycih3bTg5OTQtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCByZXQpOwpAQCAtMzUzLDcgKzM5OSwyMiBAQAogCQlkZXZfZXJyKHdtODk5NC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgSUQgcmVnaXN0ZXJcbiIpOwogCQlnb3RvIGVycl9lbmFibGU7CiAJfQotCWlmIChyZXQgIT0gMHg4OTk0KSB7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDB4ODk5NDoKKwkJZGV2bmFtZSA9ICJXTTg5OTQiOworCQlpZiAod204OTk0LT50eXBlICE9IFdNODk5NCkKKwkJCWRldl93YXJuKHdtODk5NC0+ZGV2LCAiRGV2aWNlIHJlZ2lzdGVyZWQgYXMgdHlwZSAlZFxuIiwKKwkJCQkgd204OTk0LT50eXBlKTsKKwkJd204OTk0LT50eXBlID0gV004OTk0OworCQlicmVhazsKKwljYXNlIDB4ODk1ODoKKwkJZGV2bmFtZSA9ICJXTTg5NTgiOworCQlpZiAod204OTk0LT50eXBlICE9IFdNODk1OCkKKwkJCWRldl93YXJuKHdtODk5NC0+ZGV2LCAiRGV2aWNlIHJlZ2lzdGVyZWQgYXMgdHlwZSAlZFxuIiwKKwkJCQkgd204OTk0LT50eXBlKTsKKwkJd204OTk0LT50eXBlID0gV004OTU4OworCQlicmVhazsKKwlkZWZhdWx0OgogCQlkZXZfZXJyKHdtODk5NC0+ZGV2LCAiRGV2aWNlIGlzIG5vdCBhIFdNODk5NCwgSUQgaXMgJXhcbiIsCiAJCQlyZXQpOwogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzcwLDE0ICs0MzEsMTYgQEAKIAlzd2l0Y2ggKHJldCkgewogCWNhc2UgMDoKIAljYXNlIDE6Ci0JCWRldl93YXJuKHdtODk5NC0+ZGV2LCAicmV2aXNpb24gJWMgbm90IGZ1bGx5IHN1cHBvcnRlZFxuIiwKLQkJCSdBJyArIHJldCk7CisJCWlmICh3bTg5OTQtPnR5cGUgPT0gV004OTk0KQorCQkJZGV2X3dhcm4od204OTk0LT5kZXYsCisJCQkJICJyZXZpc2lvbiAlYyBub3QgZnVsbHkgc3VwcG9ydGVkXG4iLAorCQkJCSAnQScgKyByZXQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfaW5mbyh3bTg5OTQtPmRldiwgInJldmlzaW9uICVjXG4iLCAnQScgKyByZXQpOwogCQlicmVhazsKIAl9CiAKKwlkZXZfaW5mbyh3bTg5OTQtPmRldiwgIiVzIHJldmlzaW9uICVjXG4iLCBkZXZuYW1lLCAnQScgKyByZXQpOwogCiAJaWYgKHBkYXRhKSB7CiAJCXdtODk5NC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CkBAIC00MTgsMTUgKzQ4MSwxOCBAQAogCQlnb3RvIGVycl9pcnE7CiAJfQogCisJcG1fcnVudGltZV9lbmFibGUod204OTk0LT5kZXYpOworCXBtX3J1bnRpbWVfcmVzdW1lKHdtODk5NC0+ZGV2KTsKKwogCXJldHVybiAwOwogCiBlcnJfaXJxOgogCXdtODk5NF9pcnFfZXhpdCh3bTg5OTQpOwogZXJyX2VuYWJsZToKLQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204OTk0X21haW5fc3VwcGxpZXMpLAorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUod204OTk0LT5udW1fc3VwcGxpZXMsCiAJCQkgICAgICAgd204OTk0LT5zdXBwbGllcyk7CiBlcnJfZ2V0OgotCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyksIHdtODk5NC0+c3VwcGxpZXMpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUod204OTk0LT5udW1fc3VwcGxpZXMsIHdtODk5NC0+c3VwcGxpZXMpOwogZXJyX3N1cHBsaWVzOgogCWtmcmVlKHdtODk5NC0+c3VwcGxpZXMpOwogZXJyOgpAQCAtNDM3LDExICs1MDMsMTIgQEAKIAogc3RhdGljIHZvaWQgd204OTk0X2RldmljZV9leGl0KHN0cnVjdCB3bTg5OTQgKndtODk5NCkKIHsKKwlwbV9ydW50aW1lX2Rpc2FibGUod204OTk0LT5kZXYpOwogCW1mZF9yZW1vdmVfZGV2aWNlcyh3bTg5OTQtPmRldik7CiAJd204OTk0X2lycV9leGl0KHdtODk5NCk7Ci0JcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODk5NF9tYWluX3N1cHBsaWVzKSwKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHdtODk5NC0+bnVtX3N1cHBsaWVzLAogCQkJICAgICAgIHdtODk5NC0+c3VwcGxpZXMpOwotCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTg5OTRfbWFpbl9zdXBwbGllcyksIHdtODk5NC0+c3VwcGxpZXMpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUod204OTk0LT5udW1fc3VwcGxpZXMsIHdtODk5NC0+c3VwcGxpZXMpOwogCWtmcmVlKHdtODk5NC0+c3VwcGxpZXMpOwogCWtmcmVlKHdtODk5NCk7CiB9CkBAIC01MDYsOCArNTczLDkgQEAKIAl3bTg5OTQtPnJlYWRfZGV2ID0gd204OTk0X2kyY19yZWFkX2RldmljZTsKIAl3bTg5OTQtPndyaXRlX2RldiA9IHdtODk5NF9pMmNfd3JpdGVfZGV2aWNlOwogCXdtODk5NC0+aXJxID0gaTJjLT5pcnE7CisJd204OTk0LT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOwogCi0JcmV0dXJuIHdtODk5NF9kZXZpY2VfaW5pdCh3bTg5OTQsIGlkLT5kcml2ZXJfZGF0YSwgaTJjLT5pcnEpOworCXJldHVybiB3bTg5OTRfZGV2aWNlX2luaXQod204OTk0LCBpMmMtPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgd204OTk0X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKQEAgLTUxOSwzNiArNTg3LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgd204OTk0X2kyY19zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlyZXR1cm4gd204OTk0X2RldmljZV9zdXNwZW5kKCZpMmMtPmRldik7Ci19Ci0KLXN0YXRpYyBpbnQgd204OTk0X2kyY19yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKLXsKLQlyZXR1cm4gd204OTk0X2RldmljZV9yZXN1bWUoJmkyYy0+ZGV2KTsKLX0KLSNlbHNlCi0jZGVmaW5lIHdtODk5NF9pMmNfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHdtODk5NF9pMmNfcmVzdW1lIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd204OTk0X2kyY19pZFtdID0gewotCXsgIndtODk5NCIsIDAgfSwKKwl7ICJ3bTg5OTQiLCBXTTg5OTQgfSwKKwl7ICJ3bTg5NTgiLCBXTTg5NTggfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204OTk0X2kyY19pZCk7CiAKK1VOSVZFUlNBTF9ERVZfUE1fT1BTKHdtODk5NF9wbV9vcHMsIHdtODk5NF9zdXNwZW5kLCB3bTg5OTRfcmVzdW1lLCBOVUxMKTsKKwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODk5NF9pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gIndtODk5NCIsCi0JCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9ICJ3bTg5OTQiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJndtODk5NF9wbV9vcHMsCiAJfSwKIAkucHJvYmUgPSB3bTg5OTRfaTJjX3Byb2JlLAogCS5yZW1vdmUgPSB3bTg5OTRfaTJjX3JlbW92ZSwKLQkuc3VzcGVuZCA9IHdtODk5NF9pMmNfc3VzcGVuZCwKLQkucmVzdW1lID0gd204OTk0X2kyY19yZXN1bWUsCiAJLmlkX3RhYmxlID0gd204OTk0X2kyY19pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYwppbmRleCA4NDAwZWIxLi4yOWU4ZmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWlycS5jCkBAIC0xNTYsMTYgKzE1NiwxNiBAQAogCXJldHVybiAmd204OTk0X2lycXNbaXJxIC0gd204OTk0LT5pcnFfYmFzZV07CiB9CiAKLXN0YXRpYyB2b2lkIHdtODk5NF9pcnFfbG9jayh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgd204OTk0X2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmd204OTk0LT5pcnFfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHdtODk5NF9pcnFfc3luY191bmxvY2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODk5NF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQogewotCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJc3RydWN0IHdtODk5NCAqd204OTk0ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTQtPmlycV9tYXNrc19jdXIpOyBpKyspIHsKQEAgLTE4MiwyOCArMTgyLDMwIEBACiAJbXV0ZXhfdW5sb2NrKCZ3bTg5OTQtPmlycV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgd204OTk0X2lycV91bm1hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODk5NF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCXN0cnVjdCB3bTg5OTRfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODk5NF9pcnEod204OTk0LCBpcnEpOworCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3bTg5OTRfaXJxX2RhdGEgKmlycV9kYXRhID0gaXJxX3RvX3dtODk5NF9pcnEod204OTk0LAorCQkJCQkJCSAgICAgZGF0YS0+aXJxKTsKIAogCXdtODk5NC0+aXJxX21hc2tzX2N1cltpcnFfZGF0YS0+cmVnIC0gMV0gJj0gfmlycV9kYXRhLT5tYXNrOwogfQogCi1zdGF0aWMgdm9pZCB3bTg5OTRfaXJxX21hc2sodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIHdtODk5NF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IHdtODk5NCAqd204OTk0ID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQlzdHJ1Y3Qgd204OTk0X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTg5OTRfaXJxKHdtODk5NCwgaXJxKTsKKwlzdHJ1Y3Qgd204OTk0ICp3bTg5OTQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd204OTk0X2lycV9kYXRhICppcnFfZGF0YSA9IGlycV90b193bTg5OTRfaXJxKHdtODk5NCwKKwkJCQkJCQkgICAgIGRhdGEtPmlycSk7CiAKIAl3bTg5OTQtPmlycV9tYXNrc19jdXJbaXJxX2RhdGEtPnJlZyAtIDFdIHw9IGlycV9kYXRhLT5tYXNrOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdtODk5NF9pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJ3bTg5OTQiLAotCS5idXNfbG9jayA9IHdtODk5NF9pcnFfbG9jaywKLQkuYnVzX3N5bmNfdW5sb2NrID0gd204OTk0X2lycV9zeW5jX3VubG9jaywKLQkubWFzayA9IHdtODk5NF9pcnFfbWFzaywKLQkudW5tYXNrID0gd204OTk0X2lycV91bm1hc2ssCisJLm5hbWUJCQk9ICJ3bTg5OTQiLAorCS5pcnFfYnVzX2xvY2sJCT0gd204OTk0X2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gd204OTk0X2lycV9zeW5jX3VubG9jaywKKwkuaXJxX21hc2sJCT0gd204OTk0X2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCQk9IHdtODk5NF9pcnFfdW5tYXNrLAogfTsKIAogLyogVGhlIHByb2Nlc3Npbmcgb2YgdGhlIHByaW1hcnkgaW50ZXJydXB0IG9jY3VycyBpbiBhIHRocmVhZCBzbyB0aGF0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDRkMDczZjEuLmNjOGU0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC02NCw3ICs2NCw3IEBACiAKIGNvbmZpZyBBQjg1MDBfUFdNCiAJYm9vbCAiQUI4NTAwIFBXTSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQUI4NTAwX0NPUkUKKwlkZXBlbmRzIG9uIEFCODUwMF9DT1JFICYmIEFSQ0hfVTg1MDAKIAlzZWxlY3QgSEFWRV9QV00KIAloZWxwCiAJICBUaGlzIGRyaXZlciBleHBvcnRzIGZ1bmN0aW9ucyB0byBlbmFibGUvZGlzYmxlL2NvbmZpZy9mcmVlIFB1bHNlCkBAIC00MDIsNyArNDAyLDcgQEAKIAkgIERBQzc1MTIgMTYtYml0IGRpZ2l0YWwtdG8tYW5hbG9nIGNvbnZlcnRlci4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlcyB0aV9kYWM3NTEyLgorCSAgd2lsbCBiZSBjYWxsZWQgdGlfZGFjNzUxMi4KIAogY29uZmlnIFZNV0FSRV9CQUxMT09OCiAJdHJpc3RhdGUgIlZNd2FyZSBCYWxsb29uIERyaXZlciIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hcm0tY2hhcmxjZC5jIGIvZHJpdmVycy9taXNjL2FybS1jaGFybGNkLmMKaW5kZXggOWUzODc5ZS4uZmU4NjE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FybS1jaGFybGNkLmMKKysrIGIvZHJpdmVycy9taXNjL2FybS1jaGFybGNkLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZsY2QtPmluaXRfd29yaywgY2hhcmxjZF9pbml0X3dvcmspOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGNkLT5pbml0X3dvcmssIDApOwogCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRhbGl6ZWQgQVJNIGNoYXJhY3RlciBMQ0QgYXQgJTA4eFxuIiwKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW5pdGlhbGl6ZWQgQVJNIGNoYXJhY3RlciBMQ0QgYXQgJTA4eFxuIiwKIAkJbGNkLT5waHliYXNlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2NzNTUzNS1tZmdwdC5jIGIvZHJpdmVycy9taXNjL2NzNTUzNS1tZmdwdC5jCmluZGV4IDZmNjIxODAuLmQwMmQzMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9jczU1MzUtbWZncHQuYworKysgYi9kcml2ZXJzL21pc2MvY3M1NTM1LW1mZ3B0LmMKQEAgLTE2LDEyICsxNiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3M1NTM1Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJjczU1MzUtbWZncHQiCi0jZGVmaW5lIE1GR1BUX0JBUiAyCiAKIHN0YXRpYyBpbnQgbWZncHRfcmVzZXRfdGltZXJzOwogbW9kdWxlX3BhcmFtX25hbWVkKG1mZ3B0Zml4LCBtZmdwdF9yZXNldF90aW1lcnMsIGludCwgMDY0NCk7CkBAIC0zNyw3ICszNiw3IEBACiAJREVDTEFSRV9CSVRNQVAoYXZhaWwsIE1GR1BUX01BWF9USU1FUlMpOwogCXJlc291cmNlX3NpemVfdCBiYXNlOwogCi0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzcGlubG9ja190IGxvY2s7CiAJaW50IGluaXRpYWxpemVkOwogfSBjczU1MzVfbWZncHRfY2hpcDsKQEAgLTI5MCwxMCArMjg5LDEwIEBACiAJcmV0dXJuIHRpbWVyczsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY3M1NTM1X21mZ3B0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQorc3RhdGljIGludCBfX2RldmluaXQgY3M1NTM1X21mZ3B0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGVyciwgdDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyID0gLUVJTywgdDsKIAogCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBnZXQgdGhlIE1GR1BUIGJhc2UgYWRkcmVzczsgb25lIGlzIGJ5CiAJICogZmV0Y2hpbmcgaXQgZnJvbSBNU1JfTEJBUl9NRkdQVCwgdGhlIG90aGVyIGlzIGJ5IHJlYWRpbmcgdGhlCkBAIC0zMDIsMjkgKzMwMSwyNyBAQAogCSAqIGl0IHR1cm5zIG91dCB0byBiZSB1bnJlbGlhYmxlIGluIHRoZSBmYWNlIG9mIGNyYXBweSBCSU9TZXMsIHdlCiAJICogY2FuIGFsd2F5cyBnbyBiYWNrIHRvIHVzaW5nIE1TUnMuLiAqLwogCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2VfaW8ocGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgZGV2aWNlIElPXG4iKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZmV0Y2ggZGV2aWNlIHJlc291cmNlIGluZm9cbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCi0JZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIE1GR1BUX0JBUiwgRFJWX05BTUUpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgUENJIEJBUiAjJWRcbiIsIE1GR1BUX0JBUik7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgcmVnaW9uXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAogCS8qIHNldCB1cCB0aGUgZHJpdmVyLXNwZWNpZmljIHN0cnVjdCAqLwotCWNzNTUzNV9tZmdwdF9jaGlwLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgTUZHUFRfQkFSKTsKKwljczU1MzVfbWZncHRfY2hpcC5iYXNlID0gcmVzLT5zdGFydDsKIAljczU1MzVfbWZncHRfY2hpcC5wZGV2ID0gcGRldjsKIAlzcGluX2xvY2tfaW5pdCgmY3M1NTM1X21mZ3B0X2NoaXAubG9jayk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiYWxsb2NhdGVkIFBDSSBCQVIgIyVkOiBiYXNlIDB4JWxseFxuIiwgTUZHUFRfQkFSLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgY3M1NTM1X21mZ3B0X2NoaXAuYmFzZSk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlc2VydmVkIHJlc291cmNlIHJlZ2lvbiAlcFJcbiIsIHJlcyk7CiAKIAkvKiBkZXRlY3QgdGhlIGF2YWlsYWJsZSB0aW1lcnMgKi8KIAl0ID0gc2Nhbl90aW1lcnMoJmNzNTUzNV9tZmdwdF9jaGlwKTsKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCBEUlZfTkFNRSAiOiAlZCBNRkdQVCB0aW1lcnMgYXZhaWxhYmxlXG4iLCB0KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJWQgTUZHUFQgdGltZXJzIGF2YWlsYWJsZVxuIiwgdCk7CiAJY3M1NTM1X21mZ3B0X2NoaXAuaW5pdGlhbGl6ZWQgPSAxOwogCXJldHVybiAwOwogCkBAIC0zMzIsNDcgKzMyOSwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczU1MzVfbWZncHRfcGNpX3RibFtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9JU0EpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSVNBKSB9LAotCXsgMCwgfSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNzNTUzNV9tZmdwdF9kcnYgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBjczU1MzVfbWZncHRfcHJvYmUsCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNTUzNV9tZmdwdF9wY2lfdGJsKTsKIAotLyoKLSAqIEp1c3QgbGlrZSB3aXRoIHRoZSBjczU1MzUtZ3BpbyBkcml2ZXIsIHdlIGNhbid0IHVzZSB0aGUgc3RhbmRhcmQgUENJIGRyaXZlcgotICogcmVnaXN0cmF0aW9uIHN0dWZmLiAgSXQgb25seSBhbGxvd3Mgb25seSBvbmUgZHJpdmVyIHRvIGJpbmQgdG8gZWFjaCBQQ0kKLSAqIGRldmljZSwgYW5kIHdlIHdhbnQgdGhlIEdQSU8gYW5kIE1GR1BUIGRyaXZlcnMgdG8gYmUgYWJsZSB0byBzaGFyZSBhIFBDSQotICogZGV2aWNlLiAgSW5zdGVhZCwgd2UgbWFudWFsbHkgc2NhbiBmb3IgdGhlIFBDSSBkZXZpY2UsIHJlcXVlc3QgYSBzaW5nbGUKLSAqIHJlZ2lvbiwgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGRldmljZXMgdGhhdCB3ZSdyZSB1c2luZy4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBjczU1MzVfbWZncHRfc2Nhbl9wY2kodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlpbnQgZXJyID0gLUVOT0RFVjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNzNTUzNV9tZmdwdF9wY2lfdGJsKTsgaSsrKSB7Ci0JCXBkZXYgPSBwY2lfZ2V0X2RldmljZShjczU1MzVfbWZncHRfcGNpX3RibFtpXS52ZW5kb3IsCi0JCQkJY3M1NTM1X21mZ3B0X3BjaV90YmxbaV0uZGV2aWNlLCBOVUxMKTsKLQkJaWYgKHBkZXYpIHsKLQkJCWVyciA9IGNzNTUzNV9tZmdwdF9wcm9iZShwZGV2LAotCQkJCQkmY3M1NTM1X21mZ3B0X3BjaV90YmxbaV0pOwotCQkJaWYgKGVycikKLQkJCQlwY2lfZGV2X3B1dChwZGV2KTsKLQotCQkJLyogd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIENTNTUzNS82IHNvdXRoYnJpZGdlICovCi0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBlcnI7Ci19CiAKIHN0YXRpYyBpbnQgX19pbml0IGNzNTUzNV9tZmdwdF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGNzNTUzNV9tZmdwdF9zY2FuX3BjaSgpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNzNTUzNV9tZmdwdF9kcnYpOwogfQogCiBtb2R1bGVfaW5pdChjczU1MzVfbWZncHRfaW5pdCk7CkBAIC0zODAsMyArMzQ4LDQgQEAKIE1PRFVMRV9BVVRIT1IoIkFuZHJlcyBTYWxvbW9uIDxkaWxpbmdlckBxdWV1ZWQubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDUzU1MzUvQ1M1NTM2IE1GR1BUIHRpbWVyIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKaW5kZXggNTU5YjBiMy4uYWIxYWQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL2F0MjQuaD4KIApAQCAtNDU3LDYgKzQ1OCwyNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgdm9pZCBhdDI0X2dldF9vZmRhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSAqY2hpcCkKK3sKKwljb25zdCBfX2JlMzIgKnZhbDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOworCisJaWYgKG5vZGUpIHsKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVhZC1vbmx5IiwgTlVMTCkpCisJCQljaGlwLT5mbGFncyB8PSBBVDI0X0ZMQUdfUkVBRE9OTFk7CisJCXZhbCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicGFnZXNpemUiLCBOVUxMKTsKKwkJaWYgKHZhbCkKKwkJCWNoaXAtPnBhZ2Vfc2l6ZSA9IGJlMzJfdG9fY3B1cCh2YWwpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBhdDI0X2dldF9vZmRhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJc3RydWN0IGF0MjRfcGxhdGZvcm1fZGF0YSAqY2hpcCkKK3sgfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCiBzdGF0aWMgaW50IGF0MjRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgY2hpcDsKQEAgLTQ4NSw2ICs1MDcsOSBAQAogCQkgKi8KIAkJY2hpcC5wYWdlX3NpemUgPSAxOwogCisJCS8qIHVwZGF0ZSBjaGlwZGF0YSBpZiBPRiBpcyBwcmVzZW50ICovCisJCWF0MjRfZ2V0X29mZGF0YShjbGllbnQsICZjaGlwKTsKKwogCQljaGlwLnNldHVwID0gTlVMTDsKIAkJY2hpcC5jb250ZXh0ID0gTlVMTDsKIAl9CkBAIC00OTIsNiArNTE3LDExIEBACiAJaWYgKCFpc19wb3dlcl9vZl8yKGNoaXAuYnl0ZV9sZW4pKQogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCiAJCQkiYnl0ZV9sZW4gbG9va3Mgc3VzcGljaW91cyAobm8gcG93ZXIgb2YgMikhXG4iKTsKKwlpZiAoIWNoaXAucGFnZV9zaXplKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicGFnZV9zaXplIG11c3Qgbm90IGJlIDAhXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfb3V0OworCX0KIAlpZiAoIWlzX3Bvd2VyX29mXzIoY2hpcC5wYWdlX3NpemUpKQogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsCiAJCQkicGFnZV9zaXplIGxvb2tzIHN1c3BpY2lvdXMgKG5vIHBvd2VyIG9mIDIpIVxuIik7CkBAIC01OTcsMTkgKzYyNywxNSBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYXQyNCk7CiAKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlenUgYnl0ZSAlcyBFRVBST00gJXNcbiIsCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXp1IGJ5dGUgJXMgRUVQUk9NLCAlcywgJXUgYnl0ZXMvd3JpdGVcbiIsCiAJCWF0MjQtPmJpbi5zaXplLCBjbGllbnQtPm5hbWUsCi0JCXdyaXRhYmxlID8gIih3cml0YWJsZSkiIDogIihyZWFkLW9ubHkpIik7CisJCXdyaXRhYmxlID8gIndyaXRhYmxlIiA6ICJyZWFkLW9ubHkiLCBhdDI0LT53cml0ZV9tYXgpOwogCWlmICh1c2Vfc21idXMgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSB8fAogCSAgICB1c2Vfc21idXMgPT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgewogCQlkZXZfbm90aWNlKCZjbGllbnQtPmRldiwgIkZhbGxpbmcgYmFjayB0byAlcyByZWFkcywgIgogCQkJICAgInBlcmZvcm1hbmNlIHdpbGwgc3VmZmVyXG4iLCB1c2Vfc21idXMgPT0KIAkJCSAgIEkyQ19TTUJVU19XT1JEX0RBVEEgPyAid29yZCIgOiAiYnl0ZSIpOwogCX0KLQlkZXZfZGJnKCZjbGllbnQtPmRldiwKLQkJInBhZ2Vfc2l6ZSAlZCwgbnVtX2FkZHJlc3NlcyAlZCwgd3JpdGVfbWF4ICVkLCB1c2Vfc21idXMgJWRcbiIsCi0JCWNoaXAucGFnZV9zaXplLCBudW1fYWRkcmVzc2VzLAotCQlhdDI0LT53cml0ZV9tYXgsIHVzZV9zbWJ1cyk7CiAKIAkvKiBleHBvcnQgZGF0YSB0byBrZXJuZWwgY29kZSAqLwogCWlmIChjaGlwLnNldHVwKQpAQCAtNjYwLDYgKzY4NiwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhdDI0X2luaXQodm9pZCkKIHsKKwlpZiAoIWlvX2xpbWl0KSB7CisJCXByX2VycigiYXQyNDogaW9fbGltaXQgbXVzdCBub3QgYmUgMCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpb19saW1pdCA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKGlvX2xpbWl0KTsKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmF0MjRfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy92bXdfYmFsbG9vbi5jIGIvZHJpdmVycy9taXNjL3Ztd19iYWxsb29uLmMKaW5kZXggMmExZTgwNC4uNGQyZWE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3Ztd19iYWxsb29uLmMKKysrIGIvZHJpdmVycy9taXNjL3Ztd19iYWxsb29uLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogTU9EVUxFX0FVVEhPUigiVk13YXJlLCBJbmMuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZNd2FyZSBNZW1vcnkgQ29udHJvbCAoQmFsbG9vbikgRHJpdmVyIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4yLjEuMS1rIik7CitNT0RVTEVfVkVSU0lPTigiMS4yLjEuMi1rIik7CiBNT0RVTEVfQUxJQVMoImRtaToqOnN2blZNd2FyZSo6KiIpOwogTU9EVUxFX0FMSUFTKCJ2bXdhcmVfdm1tZW1jdGwiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTMxNSw3ICszMTUsOCBAQAogICogZmVhciB0aGF0IGd1ZXN0IHdpbGwgbmVlZCBpdC4gSG9zdCBtYXkgcmVqZWN0IHNvbWUgcGFnZXMsIHdlIG5lZWQgdG8KICAqIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYW5kIG1heWJlIHN1Ym1pdCBhIGRpZmZlcmVudCBwYWdlLgogICovCi1zdGF0aWMgYm9vbCB2bWJhbGxvb25fc2VuZF9sb2NrX3BhZ2Uoc3RydWN0IHZtYmFsbG9vbiAqYiwgdW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgYm9vbCB2bWJhbGxvb25fc2VuZF9sb2NrX3BhZ2Uoc3RydWN0IHZtYmFsbG9vbiAqYiwgdW5zaWduZWQgbG9uZyBwZm4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmh2X3N0YXR1cykKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXR1cywgZHVtbXk7CiAJdTMyIHBmbjMyOwpAQCAtMzI2LDcgKzMyNyw3IEBACiAKIAlTVEFUU19JTkMoYi0+c3RhdHMubG9jayk7CiAKLQlzdGF0dXMgPSBWTVdBUkVfQkFMTE9PTl9DTUQoTE9DSywgcGZuLCBkdW1teSk7CisJKmh2X3N0YXR1cyA9IHN0YXR1cyA9IFZNV0FSRV9CQUxMT09OX0NNRChMT0NLLCBwZm4sIGR1bW15KTsKIAlpZiAodm1iYWxsb29uX2NoZWNrX3N0YXR1cyhiLCBzdGF0dXMpKQogCQlyZXR1cm4gdHJ1ZTsKIApAQCAtNDEwLDYgKzQxMSw3IEBACiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJZ2ZwX3QgZmxhZ3M7CisJdW5zaWduZWQgaW50IGh2X3N0YXR1czsKIAlib29sIGxvY2tlZCA9IGZhbHNlOwogCiAJZG8gewpAQCAtNDI5LDExICs0MzEsMTIgQEAKIAkJfQogCiAJCS8qIGluZm9ybSBtb25pdG9yICovCi0JCWxvY2tlZCA9IHZtYmFsbG9vbl9zZW5kX2xvY2tfcGFnZShiLCBwYWdlX3RvX3BmbihwYWdlKSk7CisJCWxvY2tlZCA9IHZtYmFsbG9vbl9zZW5kX2xvY2tfcGFnZShiLCBwYWdlX3RvX3BmbihwYWdlKSwgJmh2X3N0YXR1cyk7CiAJCWlmICghbG9ja2VkKSB7CiAJCQlTVEFUU19JTkMoYi0+c3RhdHMucmVmdXNlZF9hbGxvYyk7CiAKLQkJCWlmIChiLT5yZXNldF9yZXF1aXJlZCkgeworCQkJaWYgKGh2X3N0YXR1cyA9PSBWTVdfQkFMTE9PTl9FUlJPUl9SRVNFVCB8fAorCQkJICAgIGh2X3N0YXR1cyA9PSBWTVdfQkFMTE9PTl9FUlJPUl9QUE5fTk9UTkVFREVEKSB7CiAJCQkJX19mcmVlX3BhZ2UocGFnZSk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL0tjb25maWcgYi9kcml2ZXJzL21tYy9jYXJkL0tjb25maWcKaW5kZXggNTdlNDQxNi4uMmE4NzZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvS2NvbmZpZwpAQCAtMTYsNiArMTYsNyBAQAogCiBjb25maWcgTU1DX0JMT0NLX01JTk9SUwogCWludCAiTnVtYmVyIG9mIG1pbm9ycyBwZXIgYmxvY2sgZGV2aWNlIgorCWRlcGVuZHMgb24gTU1DX0JMT0NLCiAJcmFuZ2UgNCAyNTYKIAlkZWZhdWx0IDgKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKaW5kZXggMjE3ZjgyMC4uYmZjOGE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjIgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BQzsKIAllcnIgPSBtbWNfd2FpdF9mb3JfY21kKGNhcmQtPmhvc3QsICZjbWQsIDApOwogCWlmIChlcnIpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHNlbmRpbmcgc3RhdHVzIGNvbWFuZCIsCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHNlbmRpbmcgc3RhdHVzIGNvbW1hbmQiLAogCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGVycik7CiAJcmV0dXJuIGNtZC5yZXNwWzBdOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9LY29uZmlnIGIvZHJpdmVycy9tbWMvY29yZS9LY29uZmlnCmluZGV4IGJiMjJmZmQuLmVmMTAzODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9jb3JlL0tjb25maWcKQEAgLTE2LDMgKzE2LDE0IEBACiAKIAkgIFRoaXMgb3B0aW9uIHNldHMgYSBkZWZhdWx0IHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZQogCSAgbW9kdWxlIHBhcmFtZXRlciAicmVtb3ZhYmxlPTAiIG9yICJyZW1vdmFibGU9MSIuCisKK2NvbmZpZyBNTUNfQ0xLR0FURQorCWJvb2wgIk1NQyBob3N0IGNsb2NrIGdhdGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgd2lsbCBhdHRlbXB0IHRvIGFnZ3Jlc3NpdmVseSBnYXRlIHRoZSBjbG9jayB0byB0aGUgTU1DIGNhcmQuCisJICBUaGlzIGlzIGRvbmUgdG8gc2F2ZSBwb3dlciBkdWUgdG8gZ2F0aW5nIG9mZiB0aGUgbG9naWMgYW5kIGJ1cworCSAgbm9pc2Ugd2hlbiB0aGUgTU1DIGNhcmQgaXMgbm90IGluIHVzZS4gWW91ciBob3N0IGRyaXZlciBoYXMgdG8KKwkgIHN1cHBvcnQgaGFuZGxpbmcgdGhpcyBpbiBvcmRlciBmb3IgaXQgdG8gYmUgb2YgYW55IHVzZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCmluZGV4IGFmOGRjNmEuLjYzNjY3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9idXMuYwpAQCAtMzAzLDE0ICszMDMsMTQgQEAKIAkJCXR5cGUsIGNhcmQtPnJjYSk7CiAJfQogCi0JcmV0ID0gZGV2aWNlX2FkZCgmY2FyZC0+ZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAJbW1jX2FkZF9jYXJkX2RlYnVnZnMoY2FyZCk7CiAjZW5kaWYKIAorCXJldCA9IGRldmljZV9hZGQoJmNhcmQtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCW1tY19jYXJkX3NldF9wcmVzZW50KGNhcmQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCmluZGV4IGEzYTc4MGYuLjY2MjVjMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgpAQCAtMTMwLDYgKzEzMSw4IEBACiAKIAkJaWYgKG1ycS0+ZG9uZSkKIAkJCW1ycS0+ZG9uZShtcnEpOworCisJCW1tY19ob3N0X2Nsa19nYXRlKGhvc3QpOwogCX0KIH0KIApAQCAtMTkwLDYgKzE5Myw3IEBACiAJCQltcnEtPnN0b3AtPm1ycSA9IG1ycTsKIAkJfQogCX0KKwltbWNfaG9zdF9jbGtfdW5nYXRlKGhvc3QpOwogCWhvc3QtPm9wcy0+cmVxdWVzdChob3N0LCBtcnEpOwogfQogCkBAIC0yOTUsOCArMjk5LDkgQEAKIAkJdW5zaWduZWQgaW50IHRpbWVvdXRfdXMsIGxpbWl0X3VzOwogCiAJCXRpbWVvdXRfdXMgPSBkYXRhLT50aW1lb3V0X25zIC8gMTAwMDsKLQkJdGltZW91dF91cyArPSBkYXRhLT50aW1lb3V0X2Nsa3MgKiAxMDAwIC8KLQkJCShjYXJkLT5ob3N0LT5pb3MuY2xvY2sgLyAxMDAwKTsKKwkJaWYgKG1tY19ob3N0X2Nsa19yYXRlKGNhcmQtPmhvc3QpKQorCQkJdGltZW91dF91cyArPSBkYXRhLT50aW1lb3V0X2Nsa3MgKiAxMDAwIC8KKwkJCQkobW1jX2hvc3RfY2xrX3JhdGUoY2FyZC0+aG9zdCkgLyAxMDAwKTsKIAogCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9XUklURSkKIAkJCS8qCkBAIC02MTQsNiArNjE5LDggQEAKIAkJIGlvcy0+cG93ZXJfbW9kZSwgaW9zLT5jaGlwX3NlbGVjdCwgaW9zLT52ZGQsCiAJCSBpb3MtPmJ1c193aWR0aCwgaW9zLT50aW1pbmcpOwogCisJaWYgKGlvcy0+Y2xvY2sgPiAwKQorCQltbWNfc2V0X3VuZ2F0ZWQoaG9zdCk7CiAJaG9zdC0+b3BzLT5zZXRfaW9zKGhvc3QsIGlvcyk7CiB9CiAKQEAgLTY0MSw2ICs2NDgsNjEgQEAKIAltbWNfc2V0X2lvcyhob3N0KTsKIH0KIAorI2lmZGVmIENPTkZJR19NTUNfQ0xLR0FURQorLyoKKyAqIFRoaXMgZ2F0ZXMgdGhlIGNsb2NrIGJ5IHNldHRpbmcgaXQgdG8gMCBIei4KKyAqLwordm9pZCBtbWNfZ2F0ZV9jbG9jayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCWhvc3QtPmNsa19vbGQgPSBob3N0LT5pb3MuY2xvY2s7CisJaG9zdC0+aW9zLmNsb2NrID0gMDsKKwlob3N0LT5jbGtfZ2F0ZWQgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJbW1jX3NldF9pb3MoaG9zdCk7Cit9CisKKy8qCisgKiBUaGlzIHJlc3RvcmVzIHRoZSBjbG9jayBmcm9tIGdhdGluZyBieSB1c2luZyB0aGUgY2FjaGVkCisgKiBjbG9jayB2YWx1ZS4KKyAqLwordm9pZCBtbWNfdW5nYXRlX2Nsb2NrKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwkvKgorCSAqIFdlIHNob3VsZCBwcmV2aW91c2x5IGhhdmUgZ2F0ZWQgdGhlIGNsb2NrLCBzbyB0aGUgY2xvY2sgc2hhbGwKKwkgKiBiZSAwIGhlcmUhIFRoZSBjbG9jayBtYXkgaG93ZXZlciBiZSAwIGR1cmluZyBpbml0aWFsaXphdGlvbiwKKwkgKiB3aGVuIHNvbWUgcmVxdWVzdCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgYmVmb3JlIHNldHRpbmcKKwkgKiB0aGUgZnJlcXVlbmN5LiBXaGVuIHVuZ2F0ZSBpcyByZXF1ZXN0ZWQgaW4gdGhhdCBzaXR1YXRpb24KKwkgKiB3ZSBqdXN0IGlnbm9yZSB0aGUgY2FsbC4KKwkgKi8KKwlpZiAoaG9zdC0+Y2xrX29sZCkgeworCQlCVUdfT04oaG9zdC0+aW9zLmNsb2NrKTsKKwkJLyogVGhpcyBjYWxsIHdpbGwgYWxzbyBzZXQgaG9zdC0+Y2xrX2dhdGVkIHRvIGZhbHNlICovCisJCW1tY19zZXRfY2xvY2soaG9zdCwgaG9zdC0+Y2xrX29sZCk7CisJfQorfQorCit2b2lkIG1tY19zZXRfdW5nYXRlZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogV2UndmUgYmVlbiBnaXZlbiBhIG5ldyBmcmVxdWVuY3kgd2hpbGUgdGhlIGNsb2NrIGlzIGdhdGVkLAorCSAqIHNvIG1ha2Ugc3VyZSB3ZSByZWdhcmQgdGhpcyBhcyB1bmdhdGluZyBpdC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwlob3N0LT5jbGtfZ2F0ZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworfQorCisjZWxzZQordm9pZCBtbWNfc2V0X3VuZ2F0ZWQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworfQorI2VuZGlmCisKIC8qCiAgKiBDaGFuZ2UgdGhlIGJ1cyBtb2RlIChvcGVuIGRyYWluL3B1c2gtcHVsbCkgb2YgYSBob3N0LgogICovCkBAIC0xNDI0LDM1ICsxNDg2LDU3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG1tY19zZXRfYmxvY2tsZW4pOwogCitzdGF0aWMgaW50IG1tY19yZXNjYW5fdHJ5X2ZyZXEoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBmcmVxKQoreworCWhvc3QtPmZfaW5pdCA9IGZyZXE7CisKKyNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCisJcHJfaW5mbygiJXM6ICVzOiB0cnlpbmcgdG8gaW5pdCBjYXJkIGF0ICV1IEh6XG4iLAorCQltbWNfaG9zdG5hbWUoaG9zdCksIF9fZnVuY19fLCBob3N0LT5mX2luaXQpOworI2VuZGlmCisJbW1jX3Bvd2VyX3VwKGhvc3QpOworCXNkaW9fcmVzZXQoaG9zdCk7CisJbW1jX2dvX2lkbGUoaG9zdCk7CisKKwltbWNfc2VuZF9pZl9jb25kKGhvc3QsIGhvc3QtPm9jcl9hdmFpbCk7CisKKwkvKiBPcmRlcidzIGltcG9ydGFudDogcHJvYmUgU0RJTywgdGhlbiBTRCwgdGhlbiBNTUMgKi8KKwlpZiAoIW1tY19hdHRhY2hfc2Rpbyhob3N0KSkKKwkJcmV0dXJuIDA7CisJaWYgKCFtbWNfYXR0YWNoX3NkKGhvc3QpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW1tY19hdHRhY2hfbW1jKGhvc3QpKQorCQlyZXR1cm4gMDsKKworCW1tY19wb3dlcl9vZmYoaG9zdCk7CisJcmV0dXJuIC1FSU87Cit9CisKIHZvaWQgbW1jX3Jlc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGZyZXFzW10gPSB7IDQwMDAwMCwgMzAwMDAwLCAyMDAwMDAsIDEwMDAwMCB9OwogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbW1jX2hvc3QsIGRldGVjdC53b3JrKTsKLQl1MzIgb2NyOwotCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKLQljb25zdCB1bnNpZ25lZCBmcmVxc1tdID0geyA0MDAwMDAsIDMwMDAwMCwgMjAwMDAwLCAxMDAwMDAgfTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaG9zdC0+cmVzY2FuX2Rpc2FibGUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCWlmIChob3N0LT5yZXNjYW5fZGlzYWJsZSkKIAkJcmV0dXJuOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKLQogCiAJbW1jX2J1c19nZXQoaG9zdCk7CiAKLQkvKiBpZiB0aGVyZSBpcyBhIGNhcmQgcmVnaXN0ZXJlZCwgY2hlY2sgd2hldGhlciBpdCBpcyBzdGlsbCBwcmVzZW50ICovCi0JaWYgKChob3N0LT5idXNfb3BzICE9IE5VTEwpICYmIGhvc3QtPmJ1c19vcHMtPmRldGVjdCAmJiAhaG9zdC0+YnVzX2RlYWQpCisJLyoKKwkgKiBpZiB0aGVyZSBpcyBhIF9yZW1vdmFibGVfIGNhcmQgcmVnaXN0ZXJlZCwgY2hlY2sgd2hldGhlciBpdCBpcworCSAqIHN0aWxsIHByZXNlbnQKKwkgKi8KKwlpZiAoaG9zdC0+YnVzX29wcyAmJiBob3N0LT5idXNfb3BzLT5kZXRlY3QgJiYgIWhvc3QtPmJ1c19kZWFkCisJICAgICYmIG1tY19jYXJkX2lzX3JlbW92YWJsZShob3N0KSkKIAkJaG9zdC0+YnVzX29wcy0+ZGV0ZWN0KGhvc3QpOwogCisJLyoKKwkgKiBMZXQgbW1jX2J1c19wdXQoKSBmcmVlIHRoZSBidXMvYnVzX29wcyBpZiB3ZSd2ZSBmb3VuZCB0aGF0CisJICogdGhlIGNhcmQgaXMgbm8gbG9uZ2VyIHByZXNlbnQuCisJICovCiAJbW1jX2J1c19wdXQoaG9zdCk7Ci0KLQogCW1tY19idXNfZ2V0KGhvc3QpOwogCiAJLyogaWYgdGhlcmUgc3RpbGwgaXMgYSBjYXJkIHByZXNlbnQsIHN0b3AgaGVyZSAqLwpAQCAtMTQ2MSw4ICsxNTQ1LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JLyogZGV0ZWN0IGEgbmV3bHkgaW5zZXJ0ZWQgY2FyZCAqLwotCiAJLyoKIAkgKiBPbmx5IHdlIGNhbiBhZGQgYSBuZXcgaGFuZGxlciwgc28gaXQncyBzYWZlIHRvCiAJICogcmVsZWFzZSB0aGUgbG9jayBoZXJlLgpAQCAtMTQ3Miw3MiArMTU1NCwxNiBAQAogCWlmIChob3N0LT5vcHMtPmdldF9jZCAmJiBob3N0LT5vcHMtPmdldF9jZChob3N0KSA9PSAwKQogCQlnb3RvIG91dDsKIAorCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZyZXFzKTsgaSsrKSB7Ci0JCW1tY19jbGFpbV9ob3N0KGhvc3QpOwotCi0JCWlmIChmcmVxc1tpXSA+PSBob3N0LT5mX21pbikKLQkJCWhvc3QtPmZfaW5pdCA9IGZyZXFzW2ldOwotCQllbHNlIGlmICghaSB8fCBmcmVxc1tpLTFdID4gaG9zdC0+Zl9taW4pCi0JCQlob3N0LT5mX2luaXQgPSBob3N0LT5mX21pbjsKLQkJZWxzZSB7Ci0JCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0JCXByX2luZm8oIiVzOiAlczogdHJ5aW5nIHRvIGluaXQgY2FyZCBhdCAldSBIelxuIiwKLQkJCW1tY19ob3N0bmFtZShob3N0KSwgX19mdW5jX18sIGhvc3QtPmZfaW5pdCk7Ci0jZW5kaWYKLQkJbW1jX3Bvd2VyX3VwKGhvc3QpOwotCQlzZGlvX3Jlc2V0KGhvc3QpOwotCQltbWNfZ29faWRsZShob3N0KTsKLQotCQltbWNfc2VuZF9pZl9jb25kKGhvc3QsIGhvc3QtPm9jcl9hdmFpbCk7Ci0KLQkJLyoKLQkJICogRmlyc3Qgd2Ugc2VhcmNoIGZvciBTRElPLi4uCi0JCSAqLwotCQllcnIgPSBtbWNfc2VuZF9pb19vcF9jb25kKGhvc3QsIDAsICZvY3IpOwotCQlpZiAoIWVycikgewotCQkJaWYgKG1tY19hdHRhY2hfc2Rpbyhob3N0LCBvY3IpKSB7Ci0JCQkJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0JCQkJLyoKLQkJCQkgKiBUcnkgU0RNRU0gKGJ1dCBub3QgTU1DKSBldmVuIGlmIFNESU8KLQkJCQkgKiBpcyBicm9rZW4uCi0JCQkJICovCi0JCQkJaWYgKG1tY19zZW5kX2FwcF9vcF9jb25kKGhvc3QsIDAsICZvY3IpKQotCQkJCQlnb3RvIG91dF9mYWlsOwotCi0JCQkJaWYgKG1tY19hdHRhY2hfc2QoaG9zdCwgb2NyKSkKLQkJCQkJbW1jX3Bvd2VyX29mZihob3N0KTsKLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJLyoKLQkJICogLi4udGhlbiBub3JtYWwgU0QuLi4KLQkJICovCi0JCWVyciA9IG1tY19zZW5kX2FwcF9vcF9jb25kKGhvc3QsIDAsICZvY3IpOwotCQlpZiAoIWVycikgewotCQkJaWYgKG1tY19hdHRhY2hfc2QoaG9zdCwgb2NyKSkKLQkJCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiAuLi5hbmQgZmluYWxseSBNTUMuCi0JCSAqLwotCQllcnIgPSBtbWNfc2VuZF9vcF9jb25kKGhvc3QsIDAsICZvY3IpOwotCQlpZiAoIWVycikgewotCQkJaWYgKG1tY19hdHRhY2hfbW1jKGhvc3QsIG9jcikpCi0JCQkJbW1jX3Bvd2VyX29mZihob3N0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLW91dF9mYWlsOgotCQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwotCQltbWNfcG93ZXJfb2ZmKGhvc3QpOworCQlpZiAoIW1tY19yZXNjYW5fdHJ5X2ZyZXEoaG9zdCwgbWF4KGZyZXFzW2ldLCBob3N0LT5mX21pbikpKQorCQkJYnJlYWs7CisJCWlmIChmcmVxc1tpXSA8IGhvc3QtPmZfbWluKQorCQkJYnJlYWs7CiAJfQotb3V0OgorCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CisKKyBvdXQ6CiAJaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX05FRURTX1BPTEwpCiAJCW1tY19zY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhvc3QtPmRldGVjdCwgSFopOwogfQpAQCAtMTcyMSw2ICsxNzQ3LDE4IEBACiAJCWlmICghKGhvc3QtPnBtX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKSB7CiAJCQltbWNfcG93ZXJfdXAoaG9zdCk7CiAJCQltbWNfc2VsZWN0X3ZvbHRhZ2UoaG9zdCwgaG9zdC0+b2NyKTsKKwkJCS8qCisJCQkgKiBUZWxsIHJ1bnRpbWUgUE0gY29yZSB3ZSBqdXN0IHBvd2VyZWQgdXAgdGhlIGNhcmQsCisJCQkgKiBzaW5jZSBpdCBzdGlsbCBiZWxpZXZlcyB0aGUgY2FyZCBpcyBwb3dlcmVkIG9mZi4KKwkJCSAqIE5vdGUgdGhhdCBjdXJyZW50bHkgcnVudGltZSBQTSBpcyBvbmx5IGVuYWJsZWQKKwkJCSAqIGZvciBTRElPIGNhcmRzIHRoYXQgYXJlIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQKKwkJCSAqLworCQkJaWYgKG1tY19jYXJkX3NkaW8oaG9zdC0+Y2FyZCkgJiYKKwkJCSAgICAoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQpKSB7CisJCQkJcG1fcnVudGltZV9kaXNhYmxlKCZob3N0LT5jYXJkLT5kZXYpOworCQkJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmaG9zdC0+Y2FyZC0+ZGV2KTsKKwkJCQlwbV9ydW50aW1lX2VuYWJsZSgmaG9zdC0+Y2FyZC0+ZGV2KTsKKwkJCX0KIAkJfQogCQlCVUdfT04oIWhvc3QtPmJ1c19vcHMtPnJlc3VtZSk7CiAJCWVyciA9IGhvc3QtPmJ1c19vcHMtPnJlc3VtZShob3N0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5oIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmgKaW5kZXggNzcyNDBjZC4uY2ExZmRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmgKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmgKQEAgLTMzLDYgKzMzLDkgQEAKIAogdm9pZCBtbWNfc2V0X2NoaXBfc2VsZWN0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IG1vZGUpOwogdm9pZCBtbWNfc2V0X2Nsb2NrKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IGh6KTsKK3ZvaWQgbW1jX2dhdGVfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0KTsKK3ZvaWQgbW1jX3VuZ2F0ZV9jbG9jayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwordm9pZCBtbWNfc2V0X3VuZ2F0ZWQoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIHZvaWQgbW1jX3NldF9idXNfbW9kZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBtb2RlKTsKIHZvaWQgbW1jX3NldF9idXNfd2lkdGgoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgd2lkdGgpOwogdm9pZCBtbWNfc2V0X2J1c193aWR0aF9kZHIoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgd2lkdGgsCkBAIC01NCw5ICs1Nyw5IEBACiB2b2lkIG1tY19zdGFydF9ob3N0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiB2b2lkIG1tY19zdG9wX2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIAotaW50IG1tY19hdHRhY2hfbW1jKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcik7Ci1pbnQgbW1jX2F0dGFjaF9zZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHUzMiBvY3IpOwotaW50IG1tY19hdHRhY2hfc2RpbyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHUzMiBvY3IpOworaW50IG1tY19hdHRhY2hfbW1jKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CitpbnQgbW1jX2F0dGFjaF9zZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOworaW50IG1tY19hdHRhY2hfc2RpbyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogCiAvKiBNb2R1bGUgcGFyYW1ldGVycyAqLwogZXh0ZXJuIGludCB1c2Vfc3BpX2NyYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jIGIvZHJpdmVycy9tbWMvY29yZS9kZWJ1Z2ZzLmMKaW5kZXggZWVkMTQwNWYuLjk5ODc5N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvZGVidWdmcy5jCkBAIC0xODMsNiArMTgzLDExIEBACiAJCQkmbW1jX2Nsb2NrX2ZvcHMpKQogCQlnb3RvIGVycl9ub2RlOwogCisjaWZkZWYgQ09ORklHX01NQ19DTEtHQVRFCisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV91MzIoImNsa19kZWxheSIsIChTX0lSVVNSIHwgU19JV1VTUiksCisJCQkJcm9vdCwgJmhvc3QtPmNsa19kZWxheSkpCisJCWdvdG8gZXJyX25vZGU7CisjZW5kaWYKIAlyZXR1cm47CiAKIGVycl9ub2RlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwppbmRleCAxMGI4YWYyLi5iM2FjNmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIFJ1c3NlbGwgS2luZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBQaWVycmUgT3NzbWFuCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIExpbnVzIFdhbGxlaWoKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTIwLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAiaG9zdC5oIgpAQCAtNTAsNiArNTIsMjA1IEBACiBzdGF0aWMgREVGSU5FX0lEUihtbWNfaG9zdF9pZHIpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhtbWNfaG9zdF9sb2NrKTsKIAorI2lmZGVmIENPTkZJR19NTUNfQ0xLR0FURQorCisvKgorICogRW5hYmxpbmcgY2xvY2sgZ2F0aW5nIHdpbGwgbWFrZSB0aGUgY29yZSBjYWxsIG91dCB0byB0aGUgaG9zdAorICogb25jZSB1cCBhbmQgb25jZSBkb3duIHdoZW4gaXQgcGVyZm9ybXMgYSByZXF1ZXN0IG9yIGNhcmQgb3BlcmF0aW9uCisgKiBpbnRlcm1pbmdsZWQgaW4gYW55IGZhc2hpb24uIFRoZSBkcml2ZXIgd2lsbCBzZWUgdGhpcyB0aHJvdWdoCisgKiBzZXRfaW9zKCkgb3BlcmF0aW9ucyB3aXRoIGlvcy5jbG9jayBmaWVsZCBzZXQgdG8gMCB0byBnYXRlIChkaXNhYmxlKQorICogdGhlIGJsb2NrIGNsb2NrLCBhbmQgdG8gdGhlIG9sZCBmcmVxdWVuY3kgdG8gZW5hYmxlIGl0IGFnYWluLgorICovCitzdGF0aWMgdm9pZCBtbWNfaG9zdF9jbGtfZ2F0ZV9kZWxheWVkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpY2tfbnM7CisJdW5zaWduZWQgbG9uZyBmcmVxID0gaG9zdC0+aW9zLmNsb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWZyZXEpIHsKKwkJcHJfZGVidWcoIiVzOiBmcmVxdWVuY3kgc2V0IHRvIDAgaW4gZGlzYWJsZSBmdW5jdGlvbiwgIgorCQkJICJ0aGlzIG1lYW5zIHRoZSBjbG9jayBpcyBhbHJlYWR5IGRpc2FibGVkLlxuIiwKKwkJCSBtbWNfaG9zdG5hbWUoaG9zdCkpOworCQlyZXR1cm47CisJfQorCS8qCisJICogTmV3IHJlcXVlc3RzIG1heSBoYXZlIGFwcGVhcmVkIHdoaWxlIHdlIHdlcmUgc2NoZWR1bGluZywKKwkgKiB0aGVuIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkZWxheSB0aGUgY2hlY2sgYmVmb3JlCisJICogY2xrX2Rpc2FibGUoKS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRGVsYXkgbiBidXMgY3ljbGVzIChhdCBsZWFzdCA4IGZyb20gTU1DIHNwZWMpIGJlZm9yZSBhdHRlbXB0aW5nCisJICogdG8gZGlzYWJsZSB0aGUgTUNJIGJsb2NrIGNsb2NrLiBUaGUgcmVmZXJlbmNlIGNvdW50IG1heSBoYXZlCisJICogZ29uZSB1cCBhZ2FpbiBhZnRlciB0aGlzIGRlbGF5IGR1ZSB0byByZXNjaGVkdWxpbmchCisJICovCisJaWYgKCFob3N0LT5jbGtfcmVxdWVzdHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwkJdGlja19ucyA9IERJVl9ST1VORF9VUCgxMDAwMDAwMDAwLCBmcmVxKTsKKwkJbmRlbGF5KGhvc3QtPmNsa19kZWxheSAqIHRpY2tfbnMpOworCX0gZWxzZSB7CisJCS8qIE5ldyB1c2VycyBhcHBlYXJlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGlzIHdvcmsgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwltdXRleF9sb2NrKCZob3N0LT5jbGtfZ2F0ZV9tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJaWYgKCFob3N0LT5jbGtfcmVxdWVzdHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwkJLyogVGhpcyB3aWxsIHNldCBob3N0LT5pb3MuY2xvY2sgdG8gMCAqLworCQltbWNfZ2F0ZV9jbG9jayhob3N0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCXByX2RlYnVnKCIlczogZ2F0ZWQgTUNJIGNsb2NrXG4iLCBtbWNfaG9zdG5hbWUoaG9zdCkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmaG9zdC0+Y2xrX2dhdGVfbXV0ZXgpOworfQorCisvKgorICogSW50ZXJuYWwgd29yay4gV29yayB0byBkaXNhYmxlIHRoZSBjbG9jayBhdCBzb21lIGxhdGVyIHBvaW50LgorICovCitzdGF0aWMgdm9pZCBtbWNfaG9zdF9jbGtfZ2F0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1tY19ob3N0LAorCQkJCQkgICAgICBjbGtfZ2F0ZV93b3JrKTsKKworCW1tY19ob3N0X2Nsa19nYXRlX2RlbGF5ZWQoaG9zdCk7Cit9CisKKy8qKgorICoJbW1jX2hvc3RfY2xrX3VuZ2F0ZSAtIHVuZ2F0ZSBoYXJkd2FyZSBNQ0kgY2xvY2tzCisgKglAaG9zdDogaG9zdCB0byB1bmdhdGUuCisgKgorICoJTWFrZXMgc3VyZSB0aGUgaG9zdCBpb3MuY2xvY2sgaXMgcmVzdG9yZWQgdG8gYSBub24temVybyB2YWx1ZQorICoJcGFzdCB0aGlzIGNhbGwuCUluY3JlYXNlIGNsb2NrIHJlZmVyZW5jZSBjb3VudCBhbmQgdW5nYXRlIGNsb2NrCisgKglpZiB3ZSdyZSB0aGUgZmlyc3QgdXNlci4KKyAqLwordm9pZCBtbWNfaG9zdF9jbGtfdW5nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXV0ZXhfbG9jaygmaG9zdC0+Y2xrX2dhdGVfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCWlmIChob3N0LT5jbGtfZ2F0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwkJbW1jX3VuZ2F0ZV9jbG9jayhob3N0KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCXByX2RlYnVnKCIlczogdW5nYXRlZCBNQ0kgY2xvY2tcbiIsIG1tY19ob3N0bmFtZShob3N0KSk7CisJfQorCWhvc3QtPmNsa19yZXF1ZXN0cysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5jbGtfZ2F0ZV9tdXRleCk7Cit9CisKKy8qKgorICoJbW1jX2hvc3RfbWF5X2dhdGVfY2FyZCAtIGNoZWNrIGlmIHRoaXMgY2FyZCBtYXkgYmUgZ2F0ZWQKKyAqCUBjYXJkOiBjYXJkIHRvIGNoZWNrLgorICovCitzdGF0aWMgYm9vbCBtbWNfaG9zdF9tYXlfZ2F0ZV9jYXJkKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwkvKiBJZiB0aGVyZSBpcyBubyBjYXJkIHdlIG1heSBnYXRlIGl0ICovCisJaWYgKCFjYXJkKQorCQlyZXR1cm4gdHJ1ZTsKKwkvKgorCSAqIERvbid0IGdhdGUgU0RJTyBjYXJkcyEgVGhlc2UgbmVlZCB0byBiZSBjbG9ja2VkIGF0IGFsbCB0aW1lcworCSAqIHNpbmNlIHRoZXkgbWF5IGJlIGluZGVwZW5kZW50IHN5c3RlbXMgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisJICogYW5kIG90aGVyIGV2ZW50cy4gVGhlIGNsb2NrIHJlcXVlc3RzIGNvdW50ZXIgZnJvbSB0aGUgY29yZSB3aWxsCisJICogZ28gZG93biB0byB6ZXJvIHNpbmNlIHRoZSBjb3JlIGRvZXMgbm90IG5lZWQgaXQsIGJ1dCB3ZSB3aWxsIG5vdAorCSAqIGdhdGUgdGhlIGNsb2NrLCBiZWNhdXNlIHRoZXJlIGlzIHNvbWVib2R5IG91dCB0aGVyZSB0aGF0IG1heSBzdGlsbAorCSAqIGJlIHVzaW5nIGl0LgorCSAqLworCWlmIChtbWNfY2FyZF9zZGlvKGNhcmQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKgltbWNfaG9zdF9jbGtfZ2F0ZSAtIGdhdGUgb2ZmIGhhcmR3YXJlIE1DSSBjbG9ja3MKKyAqCUBob3N0OiBob3N0IHRvIGdhdGUuCisgKgorICoJQ2FsbHMgdGhlIGhvc3QgZHJpdmVyIHdpdGggaW9zLmNsb2NrIHNldCB0byB6ZXJvIGFzIG9mdGVuIGFzIHBvc3NpYmxlCisgKglpbiBvcmRlciB0byBnYXRlIG9mZiBoYXJkd2FyZSBNQ0kgY2xvY2tzLiBEZWNyZWFzZSBjbG9jayByZWZlcmVuY2UKKyAqCWNvdW50IGFuZCBzY2hlZHVsZSBkaXNhYmxpbmcgb2YgY2xvY2suCisgKi8KK3ZvaWQgbW1jX2hvc3RfY2xrX2dhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwlob3N0LT5jbGtfcmVxdWVzdHMtLTsKKwlpZiAobW1jX2hvc3RfbWF5X2dhdGVfY2FyZChob3N0LT5jYXJkKSAmJgorCSAgICAhaG9zdC0+Y2xrX3JlcXVlc3RzKQorCQlzY2hlZHVsZV93b3JrKCZob3N0LT5jbGtfZ2F0ZV93b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCW1tY19ob3N0X2Nsa19yYXRlIC0gZ2V0IGN1cnJlbnQgY2xvY2sgZnJlcXVlbmN5IHNldHRpbmcKKyAqCUBob3N0OiBob3N0IHRvIGdldCB0aGUgY2xvY2sgZnJlcXVlbmN5IGZvci4KKyAqCisgKglSZXR1cm5zIGN1cnJlbnQgY2xvY2sgZnJlcXVlbmN5IHJlZ2FyZGxlc3Mgb2YgZ2F0aW5nLgorICovCit1bnNpZ25lZCBpbnQgbW1jX2hvc3RfY2xrX3JhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJaWYgKGhvc3QtPmNsa19nYXRlZCkKKwkJZnJlcSA9IGhvc3QtPmNsa19vbGQ7CisJZWxzZQorCQlmcmVxID0gaG9zdC0+aW9zLmNsb2NrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZyZXE7Cit9CisKKy8qKgorICoJbW1jX2hvc3RfY2xrX2luaXQgLSBzZXQgdXAgY2xvY2sgZ2F0aW5nIGNvZGUKKyAqCUBob3N0OiBob3N0IHdpdGggcG90ZW50aWFsIGNsb2NrIHRvIGNvbnRyb2wKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19ob3N0X2Nsa19pbml0KHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwlob3N0LT5jbGtfcmVxdWVzdHMgPSAwOworCS8qIEhvbGQgTUNJIGNsb2NrIGZvciA4IGN5Y2xlcyBieSBkZWZhdWx0ICovCisJaG9zdC0+Y2xrX2RlbGF5ID0gODsKKwlob3N0LT5jbGtfZ2F0ZWQgPSBmYWxzZTsKKwlJTklUX1dPUksoJmhvc3QtPmNsa19nYXRlX3dvcmssIG1tY19ob3N0X2Nsa19nYXRlX3dvcmspOworCXNwaW5fbG9ja19pbml0KCZob3N0LT5jbGtfbG9jayk7CisJbXV0ZXhfaW5pdCgmaG9zdC0+Y2xrX2dhdGVfbXV0ZXgpOworfQorCisvKioKKyAqCW1tY19ob3N0X2Nsa19leGl0IC0gc2h1dCBkb3duIGNsb2NrIGdhdGluZyBjb2RlCisgKglAaG9zdDogaG9zdCB3aXRoIHBvdGVudGlhbCBjbG9jayB0byBjb250cm9sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfaG9zdF9jbGtfZXhpdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJLyoKKwkgKiBXYWl0IGZvciBhbnkgb3V0c3RhbmRpbmcgZ2F0ZSBhbmQgdGhlbiBtYWtlIHN1cmUgd2UncmUKKwkgKiB1bmdhdGVkIGJlZm9yZSBleGl0aW5nLgorCSAqLworCWlmIChjYW5jZWxfd29ya19zeW5jKCZob3N0LT5jbGtfZ2F0ZV93b3JrKSkKKwkJbW1jX2hvc3RfY2xrX2dhdGVfZGVsYXllZChob3N0KTsKKwlpZiAoaG9zdC0+Y2xrX2dhdGVkKQorCQltbWNfaG9zdF9jbGtfdW5nYXRlKGhvc3QpOworCS8qIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSB1c2VyIG5vdyAqLworCVdBUk5fT04oaG9zdC0+Y2xrX3JlcXVlc3RzID4gMSk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfaG9zdF9jbGtfaW5pdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfaG9zdF9jbGtfZXhpdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7Cit9CisKKyNlbmRpZgorCiAvKioKICAqCW1tY19hbGxvY19ob3N0IC0gaW5pdGlhbGlzZSB0aGUgcGVyLWhvc3Qgc3RydWN0dXJlLgogICoJQGV4dHJhOiBzaXplb2YgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpAQCAtODIsNiArMjgzLDggQEAKIAlob3N0LT5jbGFzc19kZXYuY2xhc3MgPSAmbW1jX2hvc3RfY2xhc3M7CiAJZGV2aWNlX2luaXRpYWxpemUoJmhvc3QtPmNsYXNzX2Rldik7CiAKKwltbWNfaG9zdF9jbGtfaW5pdChob3N0KTsKKwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZob3N0LT53cSk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmhvc3QtPmRldGVjdCwgbW1jX3Jlc2Nhbik7CkBAIC0xNjMsNiArMzY2LDggQEAKIAlkZXZpY2VfZGVsKCZob3N0LT5jbGFzc19kZXYpOwogCiAJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoaG9zdC0+bGVkKTsKKworCW1tY19ob3N0X2Nsa19leGl0KGhvc3QpOwogfQogCiBFWFBPUlRfU1lNQk9MKG1tY19yZW1vdmVfaG9zdCk7CkBAIC0xODMsNCArMzg4LDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChtbWNfZnJlZV9ob3N0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmggYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuaAppbmRleCA4Yzg3ZTExLi5kZTE5OWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuaApAQCAtMTAsMTAgKzEwLDMxIEBACiAgKi8KICNpZm5kZWYgX01NQ19DT1JFX0hPU1RfSAogI2RlZmluZSBfTU1DX0NPUkVfSE9TVF9ICisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAogaW50IG1tY19yZWdpc3Rlcl9ob3N0X2NsYXNzKHZvaWQpOwogdm9pZCBtbWNfdW5yZWdpc3Rlcl9ob3N0X2NsYXNzKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX01NQ19DTEtHQVRFCit2b2lkIG1tY19ob3N0X2Nsa191bmdhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKK3ZvaWQgbW1jX2hvc3RfY2xrX2dhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKK3Vuc2lnbmVkIGludCBtbWNfaG9zdF9jbGtfcmF0ZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOworCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG1tY19ob3N0X2Nsa191bmdhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2hvc3RfY2xrX2dhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtbWNfaG9zdF9jbGtfcmF0ZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIGhvc3QtPmlvcy5jbG9jazsKK30KKyNlbmRpZgorCiB2b2lkIG1tY19ob3N0X2RlZXBlcl9kaXNhYmxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggNzdmOTNjMy4uMTYwMDZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC01MzQsMzkgKzUzNCw1NyBAQAogCSAqLwogCWlmICgoY2FyZC0+Y3NkLm1tY2FfdnNuID49IENTRF9TUEVDX1ZFUl80KSAmJgogCSAgICAoaG9zdC0+Y2FwcyAmIChNTUNfQ0FQXzRfQklUX0RBVEEgfCBNTUNfQ0FQXzhfQklUX0RBVEEpKSkgewotCQl1bnNpZ25lZCBleHRfY3NkX2JpdCwgYnVzX3dpZHRoOworCQlzdGF0aWMgdW5zaWduZWQgZXh0X2NzZF9iaXRzW11bMl0gPSB7CisJCQl7IEVYVF9DU0RfQlVTX1dJRFRIXzgsIEVYVF9DU0RfRERSX0JVU19XSURUSF84IH0sCisJCQl7IEVYVF9DU0RfQlVTX1dJRFRIXzQsIEVYVF9DU0RfRERSX0JVU19XSURUSF80IH0sCisJCQl7IEVYVF9DU0RfQlVTX1dJRFRIXzEsIEVYVF9DU0RfQlVTX1dJRFRIXzEgfSwKKwkJfTsKKwkJc3RhdGljIHVuc2lnbmVkIGJ1c193aWR0aHNbXSA9IHsKKwkJCU1NQ19CVVNfV0lEVEhfOCwKKwkJCU1NQ19CVVNfV0lEVEhfNCwKKwkJCU1NQ19CVVNfV0lEVEhfMQorCQl9OworCQl1bnNpZ25lZCBpZHgsIGJ1c193aWR0aCA9IDA7CiAKLQkJaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzhfQklUX0RBVEEpIHsKLQkJCWlmIChkZHIpCi0JCQkJZXh0X2NzZF9iaXQgPSBFWFRfQ1NEX0REUl9CVVNfV0lEVEhfODsKLQkJCWVsc2UKLQkJCQlleHRfY3NkX2JpdCA9IEVYVF9DU0RfQlVTX1dJRFRIXzg7Ci0JCQlidXNfd2lkdGggPSBNTUNfQlVTX1dJRFRIXzg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGRyKQotCQkJCWV4dF9jc2RfYml0ID0gRVhUX0NTRF9ERFJfQlVTX1dJRFRIXzQ7Ci0JCQllbHNlCi0JCQkJZXh0X2NzZF9iaXQgPSBFWFRfQ1NEX0JVU19XSURUSF80OwotCQkJYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF80OworCQlpZiAoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfOF9CSVRfREFUQSkKKwkJCWlkeCA9IDA7CisJCWVsc2UKKwkJCWlkeCA9IDE7CisJCWZvciAoOyBpZHggPCBBUlJBWV9TSVpFKGJ1c193aWR0aHMpOyBpZHgrKykgeworCQkJYnVzX3dpZHRoID0gYnVzX3dpZHRoc1tpZHhdOworCQkJaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzEpCisJCQkJZGRyID0gMDsgLyogbm8gRERSIGZvciAxLWJpdCB3aWR0aCAqLworCQkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAorCQkJCQkgRVhUX0NTRF9CVVNfV0lEVEgsCisJCQkJCSBleHRfY3NkX2JpdHNbaWR4XVswXSk7CisJCQlpZiAoIWVycikgeworCQkJCW1tY19zZXRfYnVzX3dpZHRoX2RkcihjYXJkLT5ob3N0LAorCQkJCQkJICAgICAgYnVzX3dpZHRoLCBNTUNfU0RSX01PREUpOworCQkJCS8qCisJCQkJICogSWYgY29udHJvbGxlciBjYW4ndCBoYW5kbGUgYnVzIHdpZHRoIHRlc3QsCisJCQkJICogdXNlIHRoZSBoaWdoZXN0IGJ1cyB3aWR0aCB0byBtYWludGFpbgorCQkJCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyBNTUMgYmVoYXZpb3IuCisJCQkJICovCisJCQkJaWYgKCEoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfQlVTX1dJRFRIX1RFU1QpKQorCQkJCQlicmVhazsKKwkJCQllcnIgPSBtbWNfYnVzX3Rlc3QoY2FyZCwgYnVzX3dpZHRoKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAotCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCi0JCQkJIEVYVF9DU0RfQlVTX1dJRFRILCBleHRfY3NkX2JpdCk7Ci0KLQkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCi0JCQlnb3RvIGZyZWVfY2FyZDsKLQorCQlpZiAoIWVyciAmJiBkZHIpIHsKKwkJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQkJRVhUX0NTRF9CVVNfV0lEVEgsCisJCQkJCWV4dF9jc2RfYml0c1tpZHhdWzFdKTsKKwkJfQogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc3dpdGNoIHRvIGJ1cyB3aWR0aCAlZCBkZHIgJWQgIgotCQkJICAgICAgICJmYWlsZWRcbiIsIG1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSwKLQkJCSAgICAgICAxIDw8IGJ1c193aWR0aCwgZGRyKTsKLQkJCWVyciA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGRyKQotCQkJCW1tY19jYXJkX3NldF9kZHJfbW9kZShjYXJkKTsKLQkJCWVsc2UKLQkJCQlkZHIgPSBNTUNfU0RSX01PREU7Ci0KKwkJCQkiZmFpbGVkXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCisJCQkJMSA8PCBidXNfd2lkdGgsIGRkcik7CisJCQlnb3RvIGZyZWVfY2FyZDsKKwkJfSBlbHNlIGlmIChkZHIpIHsKKwkJCW1tY19jYXJkX3NldF9kZHJfbW9kZShjYXJkKTsKIAkJCW1tY19zZXRfYnVzX3dpZHRoX2RkcihjYXJkLT5ob3N0LCBidXNfd2lkdGgsIGRkcik7CiAJCX0KIAl9CkBAIC03MzcsMTQgKzc1NSwyMSBAQAogLyoKICAqIFN0YXJ0aW5nIHBvaW50IGZvciBNTUMgY2FyZCBpbml0LgogICovCi1pbnQgbW1jX2F0dGFjaF9tbWMoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1MzIgb2NyKQoraW50IG1tY19hdHRhY2hfbW1jKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKIAlpbnQgZXJyOworCXUzMiBvY3I7CiAKIAlCVUdfT04oIWhvc3QpOwogCVdBUk5fT04oIWhvc3QtPmNsYWltZWQpOwogCisJZXJyID0gbW1jX3NlbmRfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJbW1jX2F0dGFjaF9idXNfb3BzKGhvc3QpOworCWlmIChob3N0LT5vY3JfYXZhaWxfbW1jKQorCQlob3N0LT5vY3JfYXZhaWwgPSBob3N0LT5vY3JfYXZhaWxfbW1jOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIGdldCBPQ1IgYSBkaWZmZXJlbnQgd2F5IGZvciBTUEkuCkBAIC03ODQsMjAgKzgwOSwyMCBAQAogCQlnb3RvIGVycjsKIAogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0KIAllcnIgPSBtbWNfYWRkX2NhcmQoaG9zdC0+Y2FyZCk7CisJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJaWYgKGVycikKIAkJZ290byByZW1vdmVfY2FyZDsKIAogCXJldHVybiAwOwogCiByZW1vdmVfY2FyZDoKKwltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW1tY19yZW1vdmVfY2FyZChob3N0LT5jYXJkKTsKLQlob3N0LT5jYXJkID0gTlVMTDsKIAltbWNfY2xhaW1faG9zdChob3N0KTsKKwlob3N0LT5jYXJkID0gTlVMTDsKIGVycjoKIAltbWNfZGV0YWNoX2J1cyhob3N0KTsKLQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCiAJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBNTUMgY2FyZFxuIiwKIAkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYwppbmRleCAzMjY0NDdjLi42MDg0MmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuYwpAQCAtNDYyLDMgKzQ2MiwxMDQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorbW1jX3NlbmRfYnVzX3Rlc3Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCBzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHU4IG9wY29kZSwKKwkJICB1OCBsZW4pCit7CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kOworCXN0cnVjdCBtbWNfZGF0YSBkYXRhOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwl1OCAqZGF0YV9idWY7CisJdTggKnRlc3RfYnVmOworCWludCBpLCBlcnI7CisJc3RhdGljIHU4IHRlc3RkYXRhXzhiaXRbOF0gPSB7IDB4NTUsIDB4YWEsIDAsIDAsIDAsIDAsIDAsIDAgfTsKKwlzdGF0aWMgdTggdGVzdGRhdGFfNGJpdFs0XSA9IHsgMHg1YSwgMCwgMCwgMCB9OworCisJLyogZG1hIG9udG8gc3RhY2sgaXMgdW5zYWZlL25vbnBvcnRhYmxlLCBidXQgY2FsbGVycyB0byB0aGlzCisJICogcm91dGluZSBub3JtYWxseSBwcm92aWRlIHRlbXBvcmFyeSBvbi1zdGFjayBidWZmZXJzIC4uLgorCSAqLworCWRhdGFfYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghZGF0YV9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGxlbiA9PSA4KQorCQl0ZXN0X2J1ZiA9IHRlc3RkYXRhXzhiaXQ7CisJZWxzZSBpZiAobGVuID09IDQpCisJCXRlc3RfYnVmID0gdGVzdGRhdGFfNGJpdDsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBidXNfd2lkdGggJWRcbiIsCisJCSAgICAgICBtbWNfaG9zdG5hbWUoaG9zdCksIGxlbik7CisJCWtmcmVlKGRhdGFfYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9wY29kZSA9PSBNTUNfQlVTX1RFU1RfVykKKwkJbWVtY3B5KGRhdGFfYnVmLCB0ZXN0X2J1ZiwgbGVuKTsKKworCW1lbXNldCgmbXJxLCAwLCBzaXplb2Yoc3RydWN0IG1tY19yZXF1ZXN0KSk7CisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2NvbW1hbmQpKTsKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbW1jX2RhdGEpKTsKKworCW1ycS5jbWQgPSAmY21kOworCW1ycS5kYXRhID0gJmRhdGE7CisJY21kLm9wY29kZSA9IG9wY29kZTsKKwljbWQuYXJnID0gMDsKKworCS8qIE5PVEUgSEFDSzogIHRoZSBNTUNfUlNQX1NQSV9SMSBpcyBhbHdheXMgY29ycmVjdCBoZXJlLCBidXQgd2UKKwkgKiByZWx5IG9uIGNhbGxlcnMgdG8gbmV2ZXIgdXNlIHRoaXMgd2l0aCAibmF0aXZlIiBjYWxscyBmb3IgcmVhZGluZworCSAqIENTRCBvciBDSUQuICBOYXRpdmUgdmVyc2lvbnMgb2YgdGhvc2UgY29tbWFuZHMgdXNlIHRoZSBSMiB0eXBlLAorCSAqIG5vdCBSMSBwbHVzIGEgZGF0YSBibG9jay4KKwkgKi8KKwljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMSB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FEVEM7CisKKwlkYXRhLmJsa3N6ID0gbGVuOworCWRhdGEuYmxvY2tzID0gMTsKKwlpZiAob3Bjb2RlID09IE1NQ19CVVNfVEVTVF9SKQorCQlkYXRhLmZsYWdzID0gTU1DX0RBVEFfUkVBRDsKKwllbHNlCisJCWRhdGEuZmxhZ3MgPSBNTUNfREFUQV9XUklURTsKKworCWRhdGEuc2cgPSAmc2c7CisJZGF0YS5zZ19sZW4gPSAxOworCXNnX2luaXRfb25lKCZzZywgZGF0YV9idWYsIGxlbik7CisJbW1jX3dhaXRfZm9yX3JlcShob3N0LCAmbXJxKTsKKwllcnIgPSAwOworCWlmIChvcGNvZGUgPT0gTU1DX0JVU19URVNUX1IpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxlbiAvIDQ7IGkrKykKKwkJCWlmICgodGVzdF9idWZbaV0gXiBkYXRhX2J1ZltpXSkgIT0gMHhmZikgeworCQkJCWVyciA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJfQorCWtmcmVlKGRhdGFfYnVmKTsKKworCWlmIChjbWQuZXJyb3IpCisJCXJldHVybiBjbWQuZXJyb3I7CisJaWYgKGRhdGEuZXJyb3IpCisJCXJldHVybiBkYXRhLmVycm9yOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1tY19idXNfdGVzdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4IGJ1c193aWR0aCkKK3sKKwlpbnQgZXJyLCB3aWR0aDsKKworCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KQorCQl3aWR0aCA9IDg7CisJZWxzZSBpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkKKwkJd2lkdGggPSA0OworCWVsc2UgaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzEpCisJCXJldHVybiAwOyAvKiBubyBuZWVkIGZvciB0ZXN0ICovCisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSWdub3JlIGVycm9ycyBmcm9tIEJVU19URVNUX1cuICBCVVNfVEVTVF9SIHdpbGwgZmFpbCBpZiB0aGVyZQorCSAqIGlzIGEgcHJvYmxlbS4gIFRoaXMgaW1wcm92ZXMgY2hhbmNlcyB0aGF0IHRoZSB0ZXN0IHdpbGwgd29yay4KKwkgKi8KKwltbWNfc2VuZF9idXNfdGVzdChjYXJkLCBjYXJkLT5ob3N0LCBNTUNfQlVTX1RFU1RfVywgd2lkdGgpOworCWVyciA9IG1tY19zZW5kX2J1c190ZXN0KGNhcmQsIGNhcmQtPmhvc3QsIE1NQ19CVVNfVEVTVF9SLCB3aWR0aCk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmgKaW5kZXggNjUzZWI4ZS4uZTZkNDRiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmgKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmgKQEAgLTI2LDYgKzI2LDcgQEAKIGludCBtbWNfc3BpX3JlYWRfb2NyKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IGhpZ2hjYXAsIHUzMiAqb2NycCk7CiBpbnQgbW1jX3NwaV9zZXRfY3JjKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IHVzZV9jcmMpOwogaW50IG1tY19jYXJkX3NsZWVwYXdha2Uoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgc2xlZXApOworaW50IG1tY19idXNfdGVzdChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsIHU4IGJ1c193aWR0aCk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKaW5kZXggNDlkYTRkZi4uZDE4YzMyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwpAQCAtNzY0LDE0ICs3NjQsMjEgQEAKIC8qCiAgKiBTdGFydGluZyBwb2ludCBmb3IgU0QgY2FyZCBpbml0LgogICovCi1pbnQgbW1jX2F0dGFjaF9zZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHUzMiBvY3IpCitpbnQgbW1jX2F0dGFjaF9zZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CiAJaW50IGVycjsKKwl1MzIgb2NyOwogCiAJQlVHX09OKCFob3N0KTsKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIAorCWVyciA9IG1tY19zZW5kX2FwcF9vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAltbWNfc2RfYXR0YWNoX2J1c19vcHMoaG9zdCk7CisJaWYgKGhvc3QtPm9jcl9hdmFpbF9zZCkKKwkJaG9zdC0+b2NyX2F2YWlsID0gaG9zdC0+b2NyX2F2YWlsX3NkOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIGdldCBPQ1IgYSBkaWZmZXJlbnQgd2F5IGZvciBTUEkuCkBAIC03OTUsNyArODAyLDggQEAKIAkJb2NyICY9IH4weDdGOwogCX0KIAotCWlmIChvY3IgJiBNTUNfVkREXzE2NV8xOTUpIHsKKwlpZiAoKG9jciAmIE1NQ19WRERfMTY1XzE5NSkgJiYKKwkgICAgIShob3N0LT5vY3JfYXZhaWxfc2QgJiBNTUNfVkREXzE2NV8xOTUpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTRCBjYXJkIGNsYWltcyB0byBzdXBwb3J0IHRoZSAiCiAJCSAgICAgICAiaW5jb21wbGV0ZWx5IGRlZmluZWQgJ2xvdyB2b2x0YWdlIHJhbmdlJy4gVGhpcyAiCiAJCSAgICAgICAid2lsbCBiZSBpZ25vcmVkLlxuIiwgbW1jX2hvc3RuYW1lKGhvc3QpKTsKQEAgLTgyMCwyMCArODI4LDIwIEBACiAJCWdvdG8gZXJyOwogCiAJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKLQogCWVyciA9IG1tY19hZGRfY2FyZChob3N0LT5jYXJkKTsKKwltbWNfY2xhaW1faG9zdChob3N0KTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlbW92ZV9jYXJkOwogCiAJcmV0dXJuIDA7CiAKIHJlbW92ZV9jYXJkOgorCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbW1jX3JlbW92ZV9jYXJkKGhvc3QtPmNhcmQpOwogCWhvc3QtPmNhcmQgPSBOVUxMOwogCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwotCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKIAlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIFNEIGNhcmRcbiIsCiAJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKaW5kZXggZWZlZjVmOS4uNWM0YTU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvLmMKQEAgLTYyNywxNSArNjI3LDI3IEBACiAKIHN0YXRpYyBpbnQgbW1jX3NkaW9fcmVzdW1lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIgPSAwOwogCiAJQlVHX09OKCFob3N0KTsKIAlCVUdfT04oIWhvc3QtPmNhcmQpOwogCiAJLyogQmFzaWMgY2FyZCByZWluaXRpYWxpemF0aW9uLiAqLwogCW1tY19jbGFpbV9ob3N0KGhvc3QpOwotCWVyciA9IG1tY19zZGlvX2luaXRfY2FyZChob3N0LCBob3N0LT5vY3IsIGhvc3QtPmNhcmQsCisKKwkvKiBObyBuZWVkIHRvIHJlaW5pdGlhbGl6ZSBwb3dlcmVkLXJlc3VtZWQgbm9ucmVtb3ZhYmxlIGNhcmRzICovCisJaWYgKG1tY19jYXJkX2lzX3JlbW92YWJsZShob3N0KSB8fCAhbW1jX2NhcmRfaXNfcG93ZXJlZF9yZXN1bWVkKGhvc3QpKQorCQllcnIgPSBtbWNfc2Rpb19pbml0X2NhcmQoaG9zdCwgaG9zdC0+b2NyLCBob3N0LT5jYXJkLAogCQkJCSAoaG9zdC0+cG1fZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpOworCWVsc2UgaWYgKG1tY19jYXJkX2lzX3Bvd2VyZWRfcmVzdW1lZChob3N0KSkgeworCQkvKiBXZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0byAxLWJpdCBtb2RlIGR1cmluZyBzdXNwZW5kICovCisJCWVyciA9IHNkaW9fZW5hYmxlXzRiaXRfYnVzKGhvc3QtPmNhcmQpOworCQlpZiAoZXJyID4gMCkgeworCQkJbW1jX3NldF9idXNfd2lkdGgoaG9zdCwgTU1DX0JVU19XSURUSF80KTsKKwkJCWVyciA9IDA7CisJCX0KKwl9CisKIAlpZiAoIWVyciAmJiBob3N0LT5zZGlvX2lycXMpCiAJCW1tY19zaWduYWxfc2Rpb19pcnEoaG9zdCk7CiAJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKQEAgLTY5MCwxNiArNzAyLDIyIEBACiAvKgogICogU3RhcnRpbmcgcG9pbnQgZm9yIFNESU8gY2FyZCBpbml0LgogICovCi1pbnQgbW1jX2F0dGFjaF9zZGlvKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcikKK2ludCBtbWNfYXR0YWNoX3NkaW8oc3RydWN0IG1tY19ob3N0ICpob3N0KQogewotCWludCBlcnI7Ci0JaW50IGksIGZ1bmNzOworCWludCBlcnIsIGksIGZ1bmNzOworCXUzMiBvY3I7CiAJc3RydWN0IG1tY19jYXJkICpjYXJkOwogCiAJQlVHX09OKCFob3N0KTsKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIAorCWVyciA9IG1tY19zZW5kX2lvX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCW1tY19hdHRhY2hfYnVzKGhvc3QsICZtbWNfc2Rpb19vcHMpOworCWlmIChob3N0LT5vY3JfYXZhaWxfc2RpbykKKwkJaG9zdC0+b2NyX2F2YWlsID0gaG9zdC0+b2NyX2F2YWlsX3NkaW87CiAKIAkvKgogCSAqIFNhbml0eSBjaGVjayB0aGUgdm9sdGFnZXMgdGhhdCB0aGUgY2FyZCBjbGFpbXMgdG8KQEAgLTc2OSwxMiArNzg3LDEyIEBACiAJCQlwbV9ydW50aW1lX2VuYWJsZSgmY2FyZC0+c2Rpb19mdW5jW2ldLT5kZXYpOwogCX0KIAotCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0KIAkvKgogCSAqIEZpcnN0IGFkZCB0aGUgY2FyZCB0byB0aGUgZHJpdmVyIG1vZGVsLi4uCiAJICovCisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAllcnIgPSBtbWNfYWRkX2NhcmQoaG9zdC0+Y2FyZCk7CisJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJaWYgKGVycikKIAkJZ290byByZW1vdmVfYWRkZWQ7CiAKQEAgLTc5MiwxNSArODEwLDE3IEBACiAKIHJlbW92ZV9hZGRlZDoKIAkvKiBSZW1vdmUgd2l0aG91dCBsb2NrIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4gYWRkZWQuICovCisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAltbWNfc2Rpb19yZW1vdmUoaG9zdCk7CiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiByZW1vdmU6CiAJLyogQW5kIHdpdGggbG9jayBpZiBpdCBoYXNuJ3QgYmVlbiBhZGRlZC4gKi8KKwltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCWlmIChob3N0LT5jYXJkKQogCQltbWNfc2Rpb19yZW1vdmUoaG9zdCk7CisJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiBlcnI6CiAJbW1jX2RldGFjaF9idXMoaG9zdCk7Ci0JbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAogCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgU0RJTyBjYXJkXG4iLAogCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKaW5kZXggMjAzZGE0NC4uZDI5YjljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYwpAQCAtMTk3LDQ0ICsxOTcsMTIgQEAKIAogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiAKLXN0YXRpYyBpbnQgc2Rpb19idXNfcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZGV2KTsKLQotCS8qCi0JICogUmVzdW1lIGFuIFNESU8gZGV2aWNlIHdoaWNoIHdhcyBzdXNwZW5kZWQgYXQgcnVuIHRpbWUgYXQgdGhpcwotCSAqIHBvaW50LCBpbiBvcmRlciB0byBhbGxvdyBzdGFuZGFyZCBTRElPIHN1c3BlbmQvcmVzdW1lIHBhdGhzCi0JICogdG8ga2VlcCB3b3JraW5nIGFzIHVzdWFsLgotCSAqCi0JICogVWx0aW1hdGVseSwgdGhlIFNESU8gZHJpdmVyIGl0c2VsZiB3aWxsIGRlY2lkZSAoaW4gaXRzCi0JICogc3VzcGVuZCBoYW5kbGVyLCBvciBsYWNrIHRoZXJlb2YpIHdoZXRoZXIgdGhlIGNhcmQgc2hvdWxkIGJlCi0JICogcmVtb3ZlZCBvciBrZXB0LCBhbmQgaWYga2VwdCwgYXQgd2hhdCBwb3dlciBzdGF0ZS4KLQkgKgotCSAqIEF0IHRoaXMgcG9pbnQsIFBNIGNvcmUgaGF2ZSBpbmNyZWFzZWQgb3VyIHVzZSBjb3VudCwgc28gaXQncwotCSAqIHNhZmUgdG8gZGlyZWN0bHkgcmVzdW1lIHRoZSBkZXZpY2UuIEFmdGVyIHN5c3RlbSBpcyByZXN1bWVkCi0JICogYWdhaW4sIFBNIGNvcmUgd2lsbCBkcm9wIGJhY2sgaXRzIHJ1bnRpbWUgUE0gdXNlIGNvdW50LCBhbmQgaWYKLQkgKiBuZWVkZWQgZGV2aWNlIHdpbGwgYmUgc3VzcGVuZGVkIGFnYWluLgotCSAqCi0JICogVGhlIGVuZCByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHBvd2VyIHN0YXRlIHRoYXQgaXMKLQkgKiBjb2hlcmVudCB3aXRoIHRoZSBkZXZpY2UncyBydW50aW1lIFBNIHVzZSBjb3VudC4KLQkgKgotCSAqIFRoZSByZXR1cm4gdmFsdWUgb2YgcG1fcnVudGltZV9yZXN1bWUgaXMgZGVsaWJlcmF0ZWx5IHVuY2hlY2tlZAotCSAqIHNpbmNlIHRoZXJlIGlzIGxpdHRsZSBwb2ludCBpbiBmYWlsaW5nIHN5c3RlbSBzdXNwZW5kIGlmIGEKLQkgKiBkZXZpY2UgY2FuJ3QgYmUgcmVzdW1lZC4KLQkgKi8KLQlpZiAoZnVuYy0+Y2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQpCi0JCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkaW9fYnVzX3BtX29wcyA9IHsKIAlTRVRfUlVOVElNRV9QTV9PUFMoCiAJCXBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kLAogCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAogCQlwbV9nZW5lcmljX3J1bnRpbWVfaWRsZQogCSkKLQkucHJlcGFyZSA9IHNkaW9fYnVzX3BtX3ByZXBhcmUsCiB9OwogCiAjZGVmaW5lIFNESU9fUE1fT1BTX1BUUgkoJnNkaW9fYnVzX3BtX29wcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwppbmRleCBkNjE4ZTg2Li5hZmU4YzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCkBAIC04Myw3ICs4Myw3IEBACiAKIGNvbmZpZyBNTUNfU0RIQ0lfT0YKIAl0cmlzdGF0ZSAiU0RIQ0kgc3VwcG9ydCBvbiBPcGVuRmlybXdhcmUgcGxhdGZvcm1zIgotCWRlcGVuZHMgb24gTU1DX1NESENJICYmIFBQQ19PRgorCWRlcGVuZHMgb24gTU1DX1NESENJICYmIE9GCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBPRiBzdXBwb3J0IGZvciBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIKIAkgIEludGVyZmFjZXMuCkBAIC05Myw2ICs5Myw3IEBACiBjb25maWcgTU1DX1NESENJX09GX0VTREhDCiAJYm9vbCAiU0RIQ0kgT0Ygc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBlU0RIQyBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gTU1DX1NESENJX09GCisJZGVwZW5kcyBvbiBQUENfT0YKIAlzZWxlY3QgTU1DX1NESENJX0JJR19FTkRJQU5fMzJCSVRfQllURV9TV0FQUEVSCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciBzdXBwb3J0LgpAQCAtMTAyLDYgKzEwMyw3IEBACiBjb25maWcgTU1DX1NESENJX09GX0hMV0QKIAlib29sICJTREhDSSBPRiBzdXBwb3J0IGZvciB0aGUgTmludGVuZG8gV2lpIFNESENJIGNvbnRyb2xsZXJzIgogCWRlcGVuZHMgb24gTU1DX1NESENJX09GCisJZGVwZW5kcyBvbiBQUENfT0YKIAlzZWxlY3QgTU1DX1NESENJX0JJR19FTkRJQU5fMzJCSVRfQllURV9TV0FQUEVSCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIChTREhDSSkKQEAgLTE0MCw2ICsxNDIsMjcgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIE1NQ19TREhDSV9ET1ZFCisJYm9vbCAiU0RIQ0kgc3VwcG9ydCBvbiBNYXJ2ZWxsJ3MgRG92ZSBTb0MiCisJZGVwZW5kcyBvbiBBUkNIX0RPVkUKKwlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTQorCXNlbGVjdCBNTUNfU0RIQ0lfSU9fQUNDRVNTT1JTCisJaGVscAorCSAgVGhpcyBzZWxlY3RzIHRoZSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGluCisJICBNYXJ2ZWxsJ3MgRG92ZSBTb0MuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBNTUNfU0RIQ0lfVEVHUkEKKwl0cmlzdGF0ZSAiU0RIQ0kgcGxhdGZvcm0gc3VwcG9ydCBmb3IgdGhlIFRlZ3JhIFNEL01NQyBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gTU1DX1NESENJX1BMVEZNICYmIEFSQ0hfVEVHUkEKKwlzZWxlY3QgTU1DX1NESENJX0lPX0FDQ0VTU09SUworCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyB0aGUgVGVncmEgU0QvTU1DIGNvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGEgVGVncmEKKwkgIHBsYXRmb3JtIHdpdGggU0Qgb3IgTU1DIGRldmljZXMsIHNheSBZIG9yIE0gaGVyZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIE1NQ19TREhDSV9TM0MKIAl0cmlzdGF0ZSAiU0RIQ0kgc3VwcG9ydCBvbiBTYW1zdW5nIFMzQyBTb0MiCiAJZGVwZW5kcyBvbiBNTUNfU0RIQ0kgJiYgUExBVF9TQU1TVU5HCkBAIC00NTgsMTEgKzQ4MSwyNyBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgU0QtQ2FyZHMgbWF5IHdvcmsgb24gdGhlIEVaa2l0LgogCitjb25maWcgTU1DX0RXCisJdHJpc3RhdGUgIlN5bm9wc3lzIERlc2lnbldhcmUgTWVtb3J5IENhcmQgSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJNCisJaGVscAorCSAgVGhpcyBzZWxlY3RzIHN1cHBvcnQgZm9yIHRoZSBTeW5vcHN5cyBEZXNpZ25XYXJlIE1vYmlsZSBTdG9yYWdlIElQCisJICBibG9jaywgdGhpcyBwcm92aWRlcyBob3N0IHN1cHBvcnQgZm9yIFNEIGFuZCBNTUMgaW50ZXJmYWNlcywgaW4gYm90aAorCSAgUElPIGFuZCBleHRlcm5hbCBETUEgbW9kZXMuCisKK2NvbmZpZyBNTUNfRFdfSURNQUMKKwlib29sICJJbnRlcm5hbCBETUFDIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIE1NQ19EVworCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciB0aGUgaW50ZXJuYWwgRE1BQyBibG9jayB3aXRoaW4gdGhlIFN5bm9wc3lzCisJICBEZXNpZ253YXJlIE1vYmlsZSBTdG9yYWdlIElQIGJsb2NrLiBUaGlzIGRpc2FibGVzIHRoZSBleHRlcm5hbCBETUEKKwkgIGludGVyZmFjZS4KKwogY29uZmlnIE1NQ19TSF9NTUNJRgogCXRyaXN0YXRlICJTdXBlckggSW50ZXJuYWwgTU1DSUYgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NQ19CTE9DSyAmJiAoU1VQRVJIIHx8IEFSQ0hfU0hNT0JJTEUpCiAJaGVscAotCSAgVGhpcyBzZWxlY3RzIHRoZSBNTUMgSG9zdCBJbnRlcmZhY2UgY29udHJvbGVyIChNTUNJRikuCisJICBUaGlzIHNlbGVjdHMgdGhlIE1NQyBIb3N0IEludGVyZmFjZSBjb250cm9sbGVyIChNTUNJRikuCiAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1NQ0lGIGluIHNoNzcyNC9zaDc3NTcvc2g3MzcyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZQppbmRleCA3YjY0NWZmLi5lODM0ZmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIG9iai0kKENPTkZJR19NTUNfQ0I3MTApCSs9IGNiNzEwLW1tYy5vCiBvYmotJChDT05GSUdfTU1DX1ZJQV9TRE1NQykJKz0gdmlhLXNkbW1jLm8KIG9iai0kKENPTkZJR19TREhfQkZJTikJCSs9IGJmaW5fc2RoLm8KK29iai0kKENPTkZJR19NTUNfRFcpCQkrPSBkd19tbWMubwogb2JqLSQoQ09ORklHX01NQ19TSF9NTUNJRikJKz0gc2hfbW1jaWYubwogb2JqLSQoQ09ORklHX01NQ19KWjQ3NDApCSs9IGp6NDc0MF9tbWMubwogb2JqLSQoQ09ORklHX01NQ19VU0hDKQkJKz0gdXNoYy5vCkBAIC0zOSw2ICs0MCw4IEBACiBzZGhjaS1wbGF0Zm9ybS15CQkJCTo9IHNkaGNpLXBsdGZtLm8KIHNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9DTlMzWFhYKQkrPSBzZGhjaS1jbnMzeHh4Lm8KIHNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVgpCSs9IHNkaGNpLWVzZGhjLWlteC5vCitzZGhjaS1wbGF0Zm9ybS0kKENPTkZJR19NTUNfU0RIQ0lfRE9WRSkJCSs9IHNkaGNpLWRvdmUubworc2RoY2ktcGxhdGZvcm0tJChDT05GSUdfTU1DX1NESENJX1RFR1JBKQkrPSBzZGhjaS10ZWdyYS5vCiAKIG9iai0kKENPTkZJR19NTUNfU0RIQ0lfT0YpCSs9IHNkaGNpLW9mLm8KIHNkaGNpLW9mLXkJCQkJOj0gc2RoY2ktb2YtY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2F1MXhtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCmluZGV4IDQxZTVhNjAuLmVmNzJlODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvYXUxeG1tYy5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlhdV93cml0ZWwoY29uZmlnMiB8IFNEX0NPTkZJRzJfREYsIEhPU1RfQ09ORklHMihob3N0KSk7CiAJYXVfc3luYygpOwogCi0JLyogU2VuZCB0aGUgc3RvcCBjb21tbWFuZCAqLworCS8qIFNlbmQgdGhlIHN0b3AgY29tbWFuZCAqLwogCWF1X3dyaXRlbChTVE9QX0NNRCwgSE9TVF9DTUQoaG9zdCkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKaW5kZXggZTE1NTQ3Yy4uMDA3NmM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYwpAQCAtNjYsOCArNjYsOCBAQAogI2RlZmluZSBEQVZJTkNJX01NQ0JMTkMgICAgICAweDYwCiAjZGVmaW5lIERBVklOQ0lfU0RJT0NUTCAgICAgIDB4NjQKICNkZWZpbmUgREFWSU5DSV9TRElPU1QwICAgICAgMHg2OAotI2RlZmluZSBEQVZJTkNJX1NESU9FTiAgICAgICAweDZDCi0jZGVmaW5lIERBVklOQ0lfU0RJT1NUICAgICAgIDB4NzAKKyNkZWZpbmUgREFWSU5DSV9TRElPSUVOICAgICAgMHg2QworI2RlZmluZSBEQVZJTkNJX1NESU9JU1QgICAgICAweDcwCiAjZGVmaW5lIERBVklOQ0lfTU1DRklGT0NUTCAgIDB4NzQgLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICovCiAKIC8qIERBVklOQ0lfTU1DQ1RMIGRlZmluaXRpb25zICovCkBAIC0xMzEsNiArMTMxLDE0IEBACiAjZGVmaW5lIE1NQ0ZJRk9DVExfQUNDV0RfMiAgICAoMiA8PCAzKSAvKiBhY2Nlc3Mgd2lkdGggb2YgMiBieXRlcyAgICAqLwogI2RlZmluZSBNTUNGSUZPQ1RMX0FDQ1dEXzEgICAgKDMgPDwgMykgLyogYWNjZXNzIHdpZHRoIG9mIDEgYnl0ZSAgICAgKi8KIAorLyogREFWSU5DSV9TRElPU1QwIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9TVDBfREFUMV9ISSAgICAgICBCSVQoMCkKKworLyogREFWSU5DSV9TRElPSUVOIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9JRU5fSU9JTlRFTiAgICAgICBCSVQoMCkKKworLyogREFWSU5DSV9TRElPSVNUIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9JU1RfSU9JTlQgICAgICAgICBCSVQoMCkKIAogLyogTU1DU0QgSW5pdCBjbG9jayBpbiBIeiBpbiBvcGVuZHJhaW4gbW9kZSAqLwogI2RlZmluZSBNTUNTRF9JTklUX0NMT0NLCQkyMDAwMDAKQEAgLTE2NCw3ICsxNzIsNyBAQAogCXVuc2lnbmVkIGludCBtbWNfaW5wdXRfY2xrOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXM7Ci0JaW50IGlycTsKKwlpbnQgbW1jX2lycSwgc2Rpb19pcnE7CiAJdW5zaWduZWQgY2hhciBidXNfbW9kZTsKIAogI2RlZmluZSBEQVZJTkNJX01NQ19EQVRBRElSX05PTkUJMApAQCAtMTg0LDYgKzE5Miw3IEBACiAJdTMyIHJ4ZG1hLCB0eGRtYTsKIAlib29sIHVzZV9kbWE7CiAJYm9vbCBkb19kbWE7CisJYm9vbCBzZGlvX2ludDsKIAogCS8qIFNjYXR0ZXJsaXN0IERNQSB1c2VzIG9uZSBvciBtb3JlIHBhcmFtZXRlciBSQU0gZW50cmllczoKIAkgKiB0aGUgbWFpbiBvbmUgKGFzc29jaWF0ZWQgd2l0aCByeGRtYSBvciB0eGRtYSkgcGx1cyB6ZXJvIG9yCkBAIC00ODAsNyArNDg5LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXVuc2lnbmVkCQlzZ19sZW47CiAJdW5zaWduZWQJCWJ5dGVzX2xlZnQgPSBob3N0LT5ieXRlc19sZWZ0OwotCWNvbnN0IHVuc2lnbmVkCQlzaGlmdCA9IGZmcyhyd190aHJlc2hvbGQpIC0gMTs7CisJY29uc3QgdW5zaWduZWQJCXNoaWZ0ID0gZmZzKHJ3X3RocmVzaG9sZCkgLSAxOwogCiAJaWYgKGhvc3QtPmRhdGFfZGlyID09IERBVklOQ0lfTU1DX0RBVEFESVJfV1JJVEUpIHsKIAkJdGVtcGxhdGUgPSAmaG9zdC0+dHhfdGVtcGxhdGU7CkBAIC04NjYsNiArODc1LDE5IEBACiB7CiAJaG9zdC0+ZGF0YSA9IE5VTEw7CiAKKwlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSkgeworCQkvKgorCQkgKiBTRElPIEludGVycnVwdCBEZXRlY3Rpb24gd29yay1hcm91bmQgYXMgc3VnZ2VzdGVkIGJ5CisJCSAqIERhdmluY2kgRXJyYXRhIChUTVMzMjBETTM1NSBTaWxpY29uIFJldmlzaW9uIDEuMSBFcnJhdGEKKwkJICogMi4xLjYpOiBTaWduYWwgU0RJTyBpbnRlcnJ1cHQgb25seSBpZiBpdCBpcyBlbmFibGVkIGJ5IGNvcmUKKwkJICovCisJCWlmIChob3N0LT5zZGlvX2ludCAmJiAhKHJlYWRsKGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9TVDApICYKKwkJCQkJU0RJT1NUMF9EQVQxX0hJKSkgeworCQkJd3JpdGVsKFNESU9JU1RfSU9JTlQsIGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCQkJbW1jX3NpZ25hbF9zZGlvX2lycShob3N0LT5tbWMpOworCQl9CisJfQorCiAJaWYgKGhvc3QtPmRvX2RtYSkgewogCQlkYXZpbmNpX2Fib3J0X2RtYShob3N0KTsKIApAQCAtOTMyLDYgKzk1NCwyMSBAQAogCW1tY19kYXZpbmNpX3Jlc2V0X2N0cmwoaG9zdCwgMCk7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBtbWNfZGF2aW5jaV9zZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKmhvc3QgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRsKGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCWlmIChzdGF0dXMgJiBTRElPSVNUX0lPSU5UKSB7CisJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAorCQkJIlNESU8gaW50ZXJydXB0IHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKKwkJd3JpdGVsKHN0YXR1cyB8IFNESU9JU1RfSU9JTlQsIGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGlycXJldHVybl90IG1tY19kYXZpbmNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKmhvc3QgPSAoc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKilkZXZfaWQ7CkBAIC0xMDc2LDExICsxMTEzLDMyIEBACiAJcmV0dXJuIGNvbmZpZy0+Z2V0X3JvKHBkZXYtPmlkKTsKIH0KIAorc3RhdGljIHZvaWQgbW1jX2RhdmluY2lfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBtbWNfZGF2aW5jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKCEocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT1NUMCkgJiBTRElPU1QwX0RBVDFfSEkpKSB7CisJCQl3cml0ZWwoU0RJT0lTVF9JT0lOVCwgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lTVCk7CisJCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisJCX0gZWxzZSB7CisJCQlob3N0LT5zZGlvX2ludCA9IHRydWU7CisJCQl3cml0ZWwocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTikgfAorCQkJICAgICAgIFNESU9JRU5fSU9JTlRFTiwgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTik7CisJCX0KKwl9IGVsc2UgeworCQlob3N0LT5zZGlvX2ludCA9IGZhbHNlOworCQl3cml0ZWwocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTikgJiB+U0RJT0lFTl9JT0lOVEVOLAorCQkgICAgICAgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTik7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBtbWNfZGF2aW5jaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBtbWNfZGF2aW5jaV9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gbW1jX2RhdmluY2lfc2V0X2lvcywKIAkuZ2V0X2NkCQk9IG1tY19kYXZpbmNpX2dldF9jZCwKIAkuZ2V0X3JvCQk9IG1tY19kYXZpbmNpX2dldF9ybywKKwkuZW5hYmxlX3NkaW9faXJxID0gbW1jX2RhdmluY2lfZW5hYmxlX3NkaW9faXJxLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEyMDksNyArMTI2Nyw4IEBACiAJCWhvc3QtPm5yX3NnID0gTUFYX05SX1NHOwogCiAJaG9zdC0+dXNlX2RtYSA9IHVzZV9kbWE7Ci0JaG9zdC0+aXJxID0gaXJxOworCWhvc3QtPm1tY19pcnEgPSBpcnE7CisJaG9zdC0+c2Rpb19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwogCiAJaWYgKGhvc3QtPnVzZV9kbWEgJiYgZGF2aW5jaV9hY3F1aXJlX2RtYV9jaGFubmVscyhob3N0KSAhPSAwKQogCQlob3N0LT51c2VfZG1hID0gMDsKQEAgLTEyNzAsNiArMTMyOSwxMyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCisJaWYgKGhvc3QtPnNkaW9faXJxID49IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+c2Rpb19pcnEsIG1tY19kYXZpbmNpX3NkaW9faXJxLCAwLAorCQkJCSAgbW1jX2hvc3RuYW1lKG1tYyksIGhvc3QpOworCQlpZiAoIXJldCkKKwkJCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX1NESU9fSVJROworCX0KKwogCXJlbmFtZV9yZWdpb24obWVtLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAKIAlkZXZfaW5mbyhtbWNfZGV2KGhvc3QtPm1tYyksICJVc2luZyAlcywgJWQtYml0IG1vZGVcbiIsCkBAIC0xMzEzLDcgKzEzNzksOSBAQAogCQltbWNfZGF2aW5jaV9jcHVmcmVxX2RlcmVnaXN0ZXIoaG9zdCk7CiAKIAkJbW1jX3JlbW92ZV9ob3N0KGhvc3QtPm1tYyk7Ci0JCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJCWZyZWVfaXJxKGhvc3QtPm1tY19pcnEsIGhvc3QpOworCQlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSkKKwkJCWZyZWVfaXJxKGhvc3QtPnNkaW9faXJxLCBob3N0KTsKIAogCQlkYXZpbmNpX3JlbGVhc2VfZG1hX2NoYW5uZWxzKGhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNjODI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpAQCAtMCwwICsxLDE3OTYgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2UgZHJpdmVyCisgKiAgKEJhc2VkIG9uIE5YUCBkcml2ZXIgZm9yIGxwYyAzMXh4KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW1jL21tYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9kd19tbWMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgImR3X21tYy5oIgorCisvKiBDb21tb24gZmxhZyBjb21iaW5hdGlvbnMgKi8KKyNkZWZpbmUgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MJKFNETU1DX0lOVF9EVE8gfCBTRE1NQ19JTlRfRENSQyB8IFwKKwkJCQkgU0RNTUNfSU5UX0hUTyB8IFNETU1DX0lOVF9TQkUgIHwgXAorCQkJCSBTRE1NQ19JTlRfRUJFKQorI2RlZmluZSBEV19NQ0lfQ01EX0VSUk9SX0ZMQUdTCShTRE1NQ19JTlRfUlRPIHwgU0RNTUNfSU5UX1JDUkMgfCBcCisJCQkJIFNETU1DX0lOVF9SRVNQX0VSUikKKyNkZWZpbmUgRFdfTUNJX0VSUk9SX0ZMQUdTCShEV19NQ0lfREFUQV9FUlJPUl9GTEFHUyB8IFwKKwkJCQkgRFdfTUNJX0NNRF9FUlJPUl9GTEFHUyAgfCBTRE1NQ19JTlRfSExFKQorI2RlZmluZSBEV19NQ0lfU0VORF9TVEFUVVMJMQorI2RlZmluZSBEV19NQ0lfUkVDVl9TVEFUVVMJMgorI2RlZmluZSBEV19NQ0lfRE1BX1RIUkVTSE9MRAkxNgorCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworc3RydWN0IGlkbWFjX2Rlc2MgeworCXUzMgkJZGVzMDsJLyogQ29udHJvbCBEZXNjcmlwdG9yICovCisjZGVmaW5lIElETUFDX0RFUzBfRElDCUJJVCgxKQorI2RlZmluZSBJRE1BQ19ERVMwX0xECUJJVCgyKQorI2RlZmluZSBJRE1BQ19ERVMwX0ZECUJJVCgzKQorI2RlZmluZSBJRE1BQ19ERVMwX0NICUJJVCg0KQorI2RlZmluZSBJRE1BQ19ERVMwX0VSCUJJVCg1KQorI2RlZmluZSBJRE1BQ19ERVMwX0NFUwlCSVQoMzApCisjZGVmaW5lIElETUFDX0RFUzBfT1dOCUJJVCgzMSkKKworCXUzMgkJZGVzMTsJLyogQnVmZmVyIHNpemVzICovCisjZGVmaW5lIElETUFDX1NFVF9CVUZGRVIxX1NJWkUoZCwgcykgXAorCSgoZCktPmRlczEgPSAoKGQpLT5kZXMxICYgMHgwM2ZmYzAwMCkgfCAoKHMpICYgMHgzZmZmKSkKKworCXUzMgkJZGVzMjsJLyogYnVmZmVyIDEgcGh5c2ljYWwgYWRkcmVzcyAqLworCisJdTMyCQlkZXMzOwkvKiBidWZmZXIgMiBwaHlzaWNhbCBhZGRyZXNzICovCit9OworI2VuZGlmIC8qIENPTkZJR19NTUNfRFdfSURNQUMgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHdfbWNpX3Nsb3QgLSBNTUMgc2xvdCBzdGF0ZQorICogQG1tYzogVGhlIG1tY19ob3N0IHJlcHJlc2VudGluZyB0aGlzIHNsb3QuCisgKiBAaG9zdDogVGhlIE1NQyBjb250cm9sbGVyIHRoaXMgc2xvdCBpcyB1c2luZy4KKyAqIEBjdHlwZTogQ2FyZCB0eXBlIGZvciB0aGlzIHNsb3QuCisgKiBAbXJxOiBtbWNfcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9yIHdhaXRpbmcgdG8gYmUKKyAqCXByb2Nlc3NlZCwgb3IgTlVMTCB3aGVuIHRoZSBzbG90IGlzIGlkbGUuCisgKiBAcXVldWVfbm9kZTogTGlzdCBub2RlIGZvciBwbGFjaW5nIHRoaXMgbm9kZSBpbiB0aGUgQHF1ZXVlIGxpc3Qgb2YKKyAqCSZzdHJ1Y3QgZHdfbWNpLgorICogQGNsb2NrOiBDbG9jayByYXRlIGNvbmZpZ3VyZWQgYnkgc2V0X2lvcygpLiBQcm90ZWN0ZWQgYnkgaG9zdC0+bG9jay4KKyAqIEBmbGFnczogUmFuZG9tIHN0YXRlIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzbG90LgorICogQGlkOiBOdW1iZXIgb2YgdGhpcyBzbG90LgorICogQGxhc3RfZGV0ZWN0X3N0YXRlOiBNb3N0IHJlY2VudGx5IG9ic2VydmVkIGNhcmQgZGV0ZWN0IHN0YXRlLgorICovCitzdHJ1Y3QgZHdfbWNpX3Nsb3QgeworCXN0cnVjdCBtbWNfaG9zdAkJKm1tYzsKKwlzdHJ1Y3QgZHdfbWNpCQkqaG9zdDsKKworCXUzMgkJCWN0eXBlOworCisJc3RydWN0IG1tY19yZXF1ZXN0CSptcnE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOworCisJdW5zaWduZWQgaW50CQljbG9jazsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyNkZWZpbmUgRFdfTU1DX0NBUkRfUFJFU0VOVAkwCisjZGVmaW5lIERXX01NQ19DQVJEX05FRURfSU5JVAkxCisJaW50CQkJaWQ7CisJaW50CQkJbGFzdF9kZXRlY3Rfc3RhdGU7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCitzdGF0aWMgaW50IGR3X21jaV9yZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IGR3X21jaV9zbG90ICpzbG90ID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKnN0b3A7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCisJLyogTWFrZSBzdXJlIHdlIGdldCBhIGNvbnNpc3RlbnQgc25hcHNob3QgKi8KKwlzcGluX2xvY2tfYmgoJnNsb3QtPmhvc3QtPmxvY2spOworCW1ycSA9IHNsb3QtPm1ycTsKKworCWlmIChtcnEpIHsKKwkJY21kID0gbXJxLT5jbWQ7CisJCWRhdGEgPSBtcnEtPmRhdGE7CisJCXN0b3AgPSBtcnEtPnN0b3A7CisKKwkJaWYgKGNtZCkKKwkJCXNlcV9wcmludGYocywKKwkJCQkgICAiQ01EJXUoMHgleCkgZmxnICV4IHJzcCAleCAleCAleCAleCBlcnIgJWRcbiIsCisJCQkJICAgY21kLT5vcGNvZGUsIGNtZC0+YXJnLCBjbWQtPmZsYWdzLAorCQkJCSAgIGNtZC0+cmVzcFswXSwgY21kLT5yZXNwWzFdLCBjbWQtPnJlc3BbMl0sCisJCQkJICAgY21kLT5yZXNwWzJdLCBjbWQtPmVycm9yKTsKKwkJaWYgKGRhdGEpCisJCQlzZXFfcHJpbnRmKHMsICJEQVRBICV1IC8gJXUgKiAldSBmbGcgJXggZXJyICVkXG4iLAorCQkJCSAgIGRhdGEtPmJ5dGVzX3hmZXJlZCwgZGF0YS0+YmxvY2tzLAorCQkJCSAgIGRhdGEtPmJsa3N6LCBkYXRhLT5mbGFncywgZGF0YS0+ZXJyb3IpOworCQlpZiAoc3RvcCkKKwkJCXNlcV9wcmludGYocywKKwkJCQkgICAiQ01EJXUoMHgleCkgZmxnICV4IHJzcCAleCAleCAleCAleCBlcnIgJWRcbiIsCisJCQkJICAgc3RvcC0+b3Bjb2RlLCBzdG9wLT5hcmcsIHN0b3AtPmZsYWdzLAorCQkJCSAgIHN0b3AtPnJlc3BbMF0sIHN0b3AtPnJlc3BbMV0sIHN0b3AtPnJlc3BbMl0sCisJCQkJICAgc3RvcC0+cmVzcFsyXSwgc3RvcC0+ZXJyb3IpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZzbG90LT5ob3N0LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR3X21jaV9yZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZHdfbWNpX3JlcV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHdfbWNpX3JlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkd19tY2lfcmVxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZHdfbWNpX3JlZ3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzLCAiU1RBVFVTOlx0MHglMDh4XG4iLCBTRE1NQ19TVEFUVVMpOworCXNlcV9wcmludGYocywgIlJJTlRTVFM6XHQweCUwOHhcbiIsIFNETU1DX1JJTlRTVFMpOworCXNlcV9wcmludGYocywgIkNNRDpcdDB4JTA4eFxuIiwgU0RNTUNfQ01EKTsKKwlzZXFfcHJpbnRmKHMsICJDVFJMOlx0MHglMDh4XG4iLCBTRE1NQ19DVFJMKTsKKwlzZXFfcHJpbnRmKHMsICJJTlRNQVNLOlx0MHglMDh4XG4iLCBTRE1NQ19JTlRNQVNLKTsKKwlzZXFfcHJpbnRmKHMsICJDTEtFTkE6XHQweCUwOHhcbiIsIFNETU1DX0NMS0VOQSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd19tY2lfcmVnc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkd19tY2lfcmVnc19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHdfbWNpX3JlZ3NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZHdfbWNpX3JlZ3Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgZHdfbWNpX2luaXRfZGVidWdmcyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IG1tY19ob3N0CSptbWMgPSBzbG90LT5tbWM7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpub2RlOworCisJcm9vdCA9IG1tYy0+ZGVidWdmc19yb290OworCWlmICghcm9vdCkKKwkJcmV0dXJuOworCisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ3MiLCBTX0lSVVNSLCByb290LCBob3N0LAorCQkJCSAgICZkd19tY2lfcmVnc19mb3BzKTsKKwlpZiAoIW5vZGUpCisJCWdvdG8gZXJyOworCisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlcSIsIFNfSVJVU1IsIHJvb3QsIHNsb3QsCisJCQkJICAgJmR3X21jaV9yZXFfZm9wcyk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInN0YXRlIiwgU19JUlVTUiwgcm9vdCwgKHUzMiAqKSZob3N0LT5zdGF0ZSk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV94MzIoInBlbmRpbmdfZXZlbnRzIiwgU19JUlVTUiwgcm9vdCwKKwkJCQkgICh1MzIgKikmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCWlmICghbm9kZSkKKwkJZ290byBlcnI7CisKKwlub2RlID0gZGVidWdmc19jcmVhdGVfeDMyKCJjb21wbGV0ZWRfZXZlbnRzIiwgU19JUlVTUiwgcm9vdCwKKwkJCQkgICh1MzIgKikmaG9zdC0+Y29tcGxldGVkX2V2ZW50cyk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCXJldHVybjsKKworZXJyOgorCWRldl9lcnIoJm1tYy0+Y2xhc3NfZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZGVidWdmcyBmb3Igc2xvdFxuIik7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICovCisKK3N0YXRpYyB2b2lkIGR3X21jaV9zZXRfdGltZW91dChzdHJ1Y3QgZHdfbWNpICpob3N0KQoreworCS8qIHRpbWVvdXQgKG1heGltdW0pICovCisJbWNpX3dyaXRlbChob3N0LCBUTU9VVCwgMHhmZmZmZmZmZik7Cit9CisKK3N0YXRpYyB1MzIgZHdfbWNpX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCit7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCXUzMiBjbWRyOworCWNtZC0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CisKKwljbWRyID0gY21kLT5vcGNvZGU7CisKKwlpZiAoY21kciA9PSBNTUNfU1RPUF9UUkFOU01JU1NJT04pCisJCWNtZHIgfD0gU0RNTUNfQ01EX1NUT1A7CisJZWxzZQorCQljbWRyIHw9IFNETU1DX0NNRF9QUlZfREFUX1dBSVQ7CisKKwlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfUFJFU0VOVCkgeworCQkvKiBXZSBleHBlY3QgYSByZXNwb25zZSwgc28gc2V0IHRoaXMgYml0ICovCisJCWNtZHIgfD0gU0RNTUNfQ01EX1JFU1BfRVhQOworCQlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KQorCQkJY21kciB8PSBTRE1NQ19DTURfUkVTUF9MT05HOworCX0KKworCWlmIChjbWQtPmZsYWdzICYgTU1DX1JTUF9DUkMpCisJCWNtZHIgfD0gU0RNTUNfQ01EX1JFU1BfQ1JDOworCisJZGF0YSA9IGNtZC0+ZGF0YTsKKwlpZiAoZGF0YSkgeworCQljbWRyIHw9IFNETU1DX0NNRF9EQVRfRVhQOworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9TVFJFQU0pCisJCQljbWRyIHw9IFNETU1DX0NNRF9TVFJNX01PREU7CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJY21kciB8PSBTRE1NQ19DTURfREFUX1dSOworCX0KKworCXJldHVybiBjbWRyOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfY29tbWFuZChzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCSBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwgdTMyIGNtZF9mbGFncykKK3sKKwlob3N0LT5jbWQgPSBjbWQ7CisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJICJzdGFydCBjb21tYW5kOiBBUkdSPTB4JTA4eCBDTURSPTB4JTA4eFxuIiwKKwkJIGNtZC0+YXJnLCBjbWRfZmxhZ3MpOworCisJbWNpX3dyaXRlbChob3N0LCBDTURBUkcsIGNtZC0+YXJnKTsKKwl3bWIoKTsKKworCW1jaV93cml0ZWwoaG9zdCwgQ01ELCBjbWRfZmxhZ3MgfCBTRE1NQ19DTURfU1RBUlQpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3N0b3BfY21kKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlkd19tY2lfc3RhcnRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wLCBob3N0LT5zdG9wX2NtZHIpOworfQorCisvKiBETUEgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZHdfbWNpX3N0b3BfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJaWYgKGhvc3QtPnVzZV9kbWEpIHsKKwkJaG9zdC0+ZG1hX29wcy0+c3RvcChob3N0KTsKKwkJaG9zdC0+ZG1hX29wcy0+Y2xlYW51cChob3N0KTsKKwl9IGVsc2UgeworCQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlzZXRfYml0KEVWRU5UX1hGRVJfQ09NUExFVEUsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworc3RhdGljIHZvaWQgZHdfbWNpX2RtYV9jbGVhbnVwKHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+ZGF0YTsKKworCWlmIChkYXRhKQorCQlkbWFfdW5tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKKwkJCSAgICAgKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJICAgICAgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19zdG9wX2RtYShzdHJ1Y3QgZHdfbWNpICpob3N0KQoreworCXUzMiB0ZW1wOworCisJLyogRGlzYWJsZSBhbmQgcmVzZXQgdGhlIElETUFDIGludGVyZmFjZSAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJdGVtcCAmPSB+U0RNTUNfQ1RSTF9VU0VfSURNQUM7CisJdGVtcCB8PSBTRE1NQ19DVFJMX0RNQV9SRVNFVDsKKwltY2lfd3JpdGVsKGhvc3QsIENUUkwsIHRlbXApOworCisJLyogU3RvcCB0aGUgSURNQUMgcnVubmluZyAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7CisJdGVtcCAmPSB+U0RNTUNfSURNQUNfRU5BQkxFOworCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19jb21wbGV0ZV9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5kYXRhOworCisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBjb21wbGV0ZVxuIik7CisKKwlob3N0LT5kbWFfb3BzLT5jbGVhbnVwKGhvc3QpOworCisJLyoKKwkgKiBJZiB0aGUgY2FyZCB3YXMgcmVtb3ZlZCwgZGF0YSB3aWxsIGJlIE5VTEwuIE5vIHBvaW50IGluIHRyeWluZyB0bworCSAqIHNlbmQgdGhlIHN0b3AgY29tbWFuZCBvciB3YWl0aW5nIGZvciBOQlVTWSBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKGRhdGEpIHsKKwkJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV90cmFuc2xhdGVfc2dsaXN0KHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaWRtYWNfZGVzYyAqZGVzYyA9IGhvc3QtPnNnX2NwdTsKKworCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKywgZGVzYysrKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7CisJCXUzMiBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7CisKKwkJLyogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgZGVzY3JpcHRvciAqLworCQlkZXNjLT5kZXMwID0gSURNQUNfREVTMF9PV04gfCBJRE1BQ19ERVMwX0RJQyB8IElETUFDX0RFUzBfQ0g7CisKKwkJLyogQnVmZmVyIGxlbmd0aCAqLworCQlJRE1BQ19TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGxlbmd0aCk7CisKKwkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLworCQlkZXNjLT5kZXMyID0gbWVtX2FkZHI7CisJfQorCisJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gaG9zdC0+c2dfY3B1OworCWRlc2MtPmRlczAgfD0gSURNQUNfREVTMF9GRDsKKworCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gaG9zdC0+c2dfY3B1ICsgKGkgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYyk7CisJZGVzYy0+ZGVzMCAmPSB+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQyk7CisJZGVzYy0+ZGVzMCB8PSBJRE1BQ19ERVMwX0xEOworCisJd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19zdGFydF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwl1MzIgdGVtcDsKKworCWR3X21jaV90cmFuc2xhdGVfc2dsaXN0KGhvc3QsIGhvc3QtPmRhdGEsIHNnX2xlbik7CisKKwkvKiBTZWxlY3QgSURNQUMgaW50ZXJmYWNlICovCisJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwl0ZW1wIHw9IFNETU1DX0NUUkxfVVNFX0lETUFDOworCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgdGVtcCk7CisKKwl3bWIoKTsKKworCS8qIEVuYWJsZSB0aGUgSURNQUMgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIEJNT0QpOworCXRlbXAgfD0gU0RNTUNfSURNQUNfRU5BQkxFOworCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7CisKKwkvKiBTdGFydCBpdCBydW5uaW5nICovCisJbWNpX3dyaXRlbChob3N0LCBQTERNTkQsIDEpOworfQorCitzdGF0aWMgaW50IGR3X21jaV9pZG1hY19pbml0KHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IGlkbWFjX2Rlc2MgKnA7CisJaW50IGk7CisKKwkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgYnVmZmVyICovCisJaG9zdC0+cmluZ19zaXplID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKTsKKworCS8qIEZvcndhcmQgbGluayB0aGUgZGVzY3JpcHRvciBsaXN0ICovCisJZm9yIChpID0gMCwgcCA9IGhvc3QtPnNnX2NwdTsgaSA8IGhvc3QtPnJpbmdfc2l6ZSAtIDE7IGkrKywgcCsrKQorCQlwLT5kZXMzID0gaG9zdC0+c2dfZG1hICsgKHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYykgKiAoaSArIDEpKTsKKworCS8qIFNldCB0aGUgbGFzdCBkZXNjcmlwdG9yIGFzIHRoZSBlbmQtb2YtcmluZyBkZXNjcmlwdG9yICovCisJcC0+ZGVzMyA9IGhvc3QtPnNnX2RtYTsKKwlwLT5kZXMwID0gSURNQUNfREVTMF9FUjsKKworCS8qIE1hc2sgb3V0IGludGVycnVwdHMgLSBnZXQgVHggJiBSeCBjb21wbGV0ZSBvbmx5ICovCisJbWNpX3dyaXRlbChob3N0LCBJRElOVEVOLCBTRE1NQ19JRE1BQ19JTlRfTkkgfCBTRE1NQ19JRE1BQ19JTlRfUkkgfAorCQkgICBTRE1NQ19JRE1BQ19JTlRfVEkpOworCisJLyogU2V0IHRoZSBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLworCW1jaV93cml0ZWwoaG9zdCwgREJBRERSLCBob3N0LT5zZ19kbWEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR3X21jaV9kbWFfb3BzIGR3X21jaV9pZG1hY19vcHMgPSB7CisJLmluaXQgPSBkd19tY2lfaWRtYWNfaW5pdCwKKwkuc3RhcnQgPSBkd19tY2lfaWRtYWNfc3RhcnRfZG1hLAorCS5zdG9wID0gZHdfbWNpX2lkbWFjX3N0b3BfZG1hLAorCS5jb21wbGV0ZSA9IGR3X21jaV9pZG1hY19jb21wbGV0ZV9kbWEsCisJLmNsZWFudXAgPSBkd19tY2lfZG1hX2NsZWFudXAsCit9OworI2VuZGlmIC8qIENPTkZJR19NTUNfRFdfSURNQUMgKi8KKworc3RhdGljIGludCBkd19tY2lfc3VibWl0X2RhdGFfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCBpLCBkaXJlY3Rpb24sIHNnX2xlbjsKKwl1MzIgdGVtcDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjaGFubmVsLCB3ZSBjYW4ndCBkbyBETUEgKi8KKwlpZiAoIWhvc3QtPnVzZV9kbWEpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBXZSBkb24ndCBkbyBETUEgb24gImNvbXBsZXgiIHRyYW5zZmVycywgaS5lLiB3aXRoCisJICogbm9uLXdvcmQtYWxpZ25lZCBidWZmZXJzIG9yIGxlbmd0aHMuIEFsc28sIHdlIGRvbid0IGJvdGhlcgorCSAqIHdpdGggYWxsIHRoZSBETUEgc2V0dXAgb3ZlcmhlYWQgZm9yIHNob3J0IHRyYW5zZmVycy4KKwkgKi8KKwlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCBEV19NQ0lfRE1BX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRhdGEtPmJsa3N6ICYgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JfZWFjaF9zZyhkYXRhLT5zZywgc2csIGRhdGEtPnNnX2xlbiwgaSkgeworCQlpZiAoc2ctPm9mZnNldCAmIDMgfHwgc2ctPmxlbmd0aCAmIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJZWxzZQorCQlkaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCisJc2dfbGVuID0gZG1hX21hcF9zZygmaG9zdC0+cGRldi0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLAorCQkJICAgIGRpcmVjdGlvbik7CisKKwlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkgInNkIHNnX2NwdTogJSNseCBzZ19kbWE6ICUjbHggc2dfbGVuOiAlZFxuIiwKKwkJICh1bnNpZ25lZCBsb25nKWhvc3QtPnNnX2NwdSwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+c2dfZG1hLAorCQkgc2dfbGVuKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BIGludGVyZmFjZSAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJdGVtcCB8PSBTRE1NQ19DVFJMX0RNQV9FTkFCTEU7CisJbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKKworCS8qIERpc2FibGUgUlgvVFggSVJRcywgbGV0IERNQSBoYW5kbGUgaXQgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIElOVE1BU0spOworCXRlbXAgICY9IH4oU0RNTUNfSU5UX1JYRFIgfCBTRE1NQ19JTlRfVFhEUik7CisJbWNpX3dyaXRlbChob3N0LCBJTlRNQVNLLCB0ZW1wKTsKKworCWhvc3QtPmRtYV9vcHMtPnN0YXJ0KGhvc3QsIHNnX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3N1Ym1pdF9kYXRhKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwl1MzIgdGVtcDsKKworCWRhdGEtPmVycm9yID0gLUVJTlBST0dSRVNTOworCisJV0FSTl9PTihob3N0LT5kYXRhKTsKKwlob3N0LT5zZyA9IE5VTEw7CisJaG9zdC0+ZGF0YSA9IGRhdGE7CisKKwlpZiAoZHdfbWNpX3N1Ym1pdF9kYXRhX2RtYShob3N0LCBkYXRhKSkgeworCQlob3N0LT5zZyA9IGRhdGEtPnNnOworCQlob3N0LT5waW9fb2Zmc2V0ID0gMDsKKwkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJCWhvc3QtPmRpcl9zdGF0dXMgPSBEV19NQ0lfUkVDVl9TVEFUVVM7CisJCWVsc2UKKwkJCWhvc3QtPmRpcl9zdGF0dXMgPSBEV19NQ0lfU0VORF9TVEFUVVM7CisKKwkJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBJTlRNQVNLKTsKKwkJdGVtcCB8PSBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSOworCQltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIHRlbXApOworCisJCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJCXRlbXAgJj0gflNETU1DX0NUUkxfRE1BX0VOQUJMRTsKKwkJbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1jaV9zZW5kX2NtZChzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsIHUzMiBjbWQsIHUzMiBhcmcpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl1bnNpZ25lZCBpbnQgY21kX3N0YXR1cyA9IDA7CisKKwltY2lfd3JpdGVsKGhvc3QsIENNREFSRywgYXJnKTsKKwl3bWIoKTsKKwltY2lfd3JpdGVsKGhvc3QsIENNRCwgU0RNTUNfQ01EX1NUQVJUIHwgY21kKTsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQljbWRfc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIENNRCk7CisJCWlmICghKGNtZF9zdGF0dXMgJiBTRE1NQ19DTURfU1RBUlQpKQorCQkJcmV0dXJuOworCX0KKwlkZXZfZXJyKCZzbG90LT5tbWMtPmNsYXNzX2RldiwKKwkJIlRpbWVvdXQgc2VuZGluZyBjb21tYW5kIChjbWQgJSN4IGFyZyAlI3ggc3RhdHVzICUjeClcbiIsCisJCWNtZCwgYXJnLCBjbWRfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3NldHVwX2J1cyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJdTMyIGRpdjsKKworCWlmIChzbG90LT5jbG9jayAhPSBob3N0LT5jdXJyZW50X3NwZWVkKSB7CisJCWlmIChob3N0LT5idXNfaHogJSBzbG90LT5jbG9jaykKKwkJCS8qCisJCQkgKiBtb3ZlIHRoZSArIDEgYWZ0ZXIgdGhlIGRpdmlkZSB0byBwcmV2ZW50CisJCQkgKiBvdmVyLWNsb2NraW5nIHRoZSBjYXJkLgorCQkJICovCisJCQlkaXYgPSAoKGhvc3QtPmJ1c19oeiAvIHNsb3QtPmNsb2NrKSA+PiAxKSArIDE7CisJCWVsc2UKKwkJCWRpdiA9IChob3N0LT5idXNfaHogIC8gc2xvdC0+Y2xvY2spID4+IDE7CisKKwkJZGV2X2luZm8oJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LAorCQkJICJCdXMgc3BlZWQgKHNsb3QgJWQpID0gJWRIeiAoc2xvdCByZXEgJWRIeiwgYWN0dWFsICVkSFoiCisJCQkgIiBkaXYgPSAlZClcbiIsIHNsb3QtPmlkLCBob3N0LT5idXNfaHosIHNsb3QtPmNsb2NrLAorCQkJIGRpdiA/ICgoaG9zdC0+YnVzX2h6IC8gZGl2KSA+PiAxKSA6IGhvc3QtPmJ1c19oeiwgZGl2KTsKKworCQkvKiBkaXNhYmxlIGNsb2NrICovCisJCW1jaV93cml0ZWwoaG9zdCwgQ0xLRU5BLCAwKTsKKwkJbWNpX3dyaXRlbChob3N0LCBDTEtTUkMsIDApOworCisJCS8qIGluZm9ybSBDSVUgKi8KKwkJbWNpX3NlbmRfY21kKHNsb3QsCisJCQkgICAgIFNETU1DX0NNRF9VUERfQ0xLIHwgU0RNTUNfQ01EX1BSVl9EQVRfV0FJVCwgMCk7CisKKwkJLyogc2V0IGNsb2NrIHRvIGRlc2lyZWQgc3BlZWQgKi8KKwkJbWNpX3dyaXRlbChob3N0LCBDTEtESVYsIGRpdik7CisKKwkJLyogaW5mb3JtIENJVSAqLworCQltY2lfc2VuZF9jbWQoc2xvdCwKKwkJCSAgICAgU0RNTUNfQ01EX1VQRF9DTEsgfCBTRE1NQ19DTURfUFJWX0RBVF9XQUlULCAwKTsKKworCQkvKiBlbmFibGUgY2xvY2sgKi8KKwkJbWNpX3dyaXRlbChob3N0LCBDTEtFTkEsIFNETU1DX0NMS0VOX0VOQUJMRSk7CisKKwkJLyogaW5mb3JtIENJVSAqLworCQltY2lfc2VuZF9jbWQoc2xvdCwKKwkJCSAgICAgU0RNTUNfQ01EX1VQRF9DTEsgfCBTRE1NQ19DTURfUFJWX0RBVF9XQUlULCAwKTsKKworCQlob3N0LT5jdXJyZW50X3NwZWVkID0gc2xvdC0+Y2xvY2s7CisJfQorCisJLyogU2V0IHRoZSBjdXJyZW50IHNsb3QgYnVzIHdpZHRoICovCisJbWNpX3dyaXRlbChob3N0LCBDVFlQRSwgc2xvdC0+Y3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCSBzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCXUzMiBjbWRmbGFnczsKKworCW1ycSA9IHNsb3QtPm1ycTsKKwlpZiAoaG9zdC0+cGRhdGEtPnNlbGVjdF9zbG90KQorCQlob3N0LT5wZGF0YS0+c2VsZWN0X3Nsb3Qoc2xvdC0+aWQpOworCisJLyogU2xvdCBzcGVjaWZpYyB0aW1pbmcgYW5kIHdpZHRoIGFkanVzdG1lbnQgKi8KKwlkd19tY2lfc2V0dXBfYnVzKHNsb3QpOworCisJaG9zdC0+Y3VyX3Nsb3QgPSBzbG90OworCWhvc3QtPm1ycSA9IG1ycTsKKworCWhvc3QtPnBlbmRpbmdfZXZlbnRzID0gMDsKKwlob3N0LT5jb21wbGV0ZWRfZXZlbnRzID0gMDsKKwlob3N0LT5kYXRhX3N0YXR1cyA9IDA7CisKKwlkYXRhID0gbXJxLT5kYXRhOworCWlmIChkYXRhKSB7CisJCWR3X21jaV9zZXRfdGltZW91dChob3N0KTsKKwkJbWNpX3dyaXRlbChob3N0LCBCWVRDTlQsIGRhdGEtPmJsa3N6KmRhdGEtPmJsb2Nrcyk7CisJCW1jaV93cml0ZWwoaG9zdCwgQkxLU0laLCBkYXRhLT5ibGtzeik7CisJfQorCisJY21kID0gbXJxLT5jbWQ7CisJY21kZmxhZ3MgPSBkd19tY2lfcHJlcGFyZV9jb21tYW5kKHNsb3QtPm1tYywgY21kKTsKKworCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1hbmQsIHNlbmQgdGhlIGluaXRpYWxpemF0aW9uIGNsb2NrICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEV19NTUNfQ0FSRF9ORUVEX0lOSVQsICZzbG90LT5mbGFncykpCisJCWNtZGZsYWdzIHw9IFNETU1DX0NNRF9JTklUOworCisJaWYgKGRhdGEpIHsKKwkJZHdfbWNpX3N1Ym1pdF9kYXRhKGhvc3QsIGRhdGEpOworCQl3bWIoKTsKKwl9CisKKwlkd19tY2lfc3RhcnRfY29tbWFuZChob3N0LCBjbWQsIGNtZGZsYWdzKTsKKworCWlmIChtcnEtPnN0b3ApCisJCWhvc3QtPnN0b3BfY21kciA9IGR3X21jaV9wcmVwYXJlX2NvbW1hbmQoc2xvdC0+bW1jLCBtcnEtPnN0b3ApOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcXVldWVfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsCisJCQkJIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWRldl92ZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgInF1ZXVlIHJlcXVlc3Q6IHN0YXRlPSVkXG4iLAorCQkgaG9zdC0+c3RhdGUpOworCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwlzbG90LT5tcnEgPSBtcnE7CisKKwlpZiAoaG9zdC0+c3RhdGUgPT0gU1RBVEVfSURMRSkgeworCQlob3N0LT5zdGF0ZSA9IFNUQVRFX1NFTkRJTkdfQ01EOworCQlkd19tY2lfc3RhcnRfcmVxdWVzdChob3N0LCBzbG90KTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZzbG90LT5xdWV1ZV9ub2RlLCAmaG9zdC0+cXVldWUpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisKKwlXQVJOX09OKHNsb3QtPm1ycSk7CisKKwlpZiAoIXRlc3RfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncykpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJsb2NrcyBvZiB3ZWlyZCBsZW5ndGhzLiAqLworCWR3X21jaV9xdWV1ZV9yZXF1ZXN0KGhvc3QsIHNsb3QsIG1ycSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCA9IG1tY19wcml2KG1tYyk7CisKKwkvKiBzZXQgZGVmYXVsdCAxIGJpdCBtb2RlICovCisJc2xvdC0+Y3R5cGUgPSBTRE1NQ19DVFlQRV8xQklUOworCisJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlzbG90LT5jdHlwZSA9IFNETU1DX0NUWVBFXzFCSVQ7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF80OgorCQlzbG90LT5jdHlwZSA9IFNETU1DX0NUWVBFXzRCSVQ7CisJCWJyZWFrOworCX0KKworCWlmIChpb3MtPmNsb2NrKSB7CisJCS8qCisJCSAqIFVzZSBtaXJyb3Igb2YgaW9zLT5jbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBtbWMKKwkJICogY29yZSBpb3MgdXBkYXRlIHdoZW4gZmluZGluZyB0aGUgbWluaW11bS4KKwkJICovCisJCXNsb3QtPmNsb2NrID0gaW9zLT5jbG9jazsKKwl9CisKKwlzd2l0Y2ggKGlvcy0+cG93ZXJfbW9kZSkgeworCWNhc2UgTU1DX1BPV0VSX1VQOgorCQlzZXRfYml0KERXX01NQ19DQVJEX05FRURfSU5JVCwgJnNsb3QtPmZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGR3X21jaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJaW50IHJlYWRfb25seTsKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2lfYm9hcmQgKmJyZCA9IHNsb3QtPmhvc3QtPnBkYXRhOworCisJLyogVXNlIHBsYXRmb3JtIGdldF9ybyBmdW5jdGlvbiwgZWxzZSB0cnkgb24gYm9hcmQgd3JpdGUgcHJvdGVjdCAqLworCWlmIChicmQtPmdldF9ybykKKwkJcmVhZF9vbmx5ID0gYnJkLT5nZXRfcm8oc2xvdC0+aWQpOworCWVsc2UKKwkJcmVhZF9vbmx5ID0KKwkJCW1jaV9yZWFkbChzbG90LT5ob3N0LCBXUlRQUlQpICYgKDEgPDwgc2xvdC0+aWQpID8gMSA6IDA7CisKKwlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgJXNcbiIsCisJCXJlYWRfb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiKTsKKworCXJldHVybiByZWFkX29ubHk7Cit9CisKK3N0YXRpYyBpbnQgZHdfbWNpX2dldF9jZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlpbnQgcHJlc2VudDsKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2lfYm9hcmQgKmJyZCA9IHNsb3QtPmhvc3QtPnBkYXRhOworCisJLyogVXNlIHBsYXRmb3JtIGdldF9jZCBmdW5jdGlvbiwgZWxzZSB0cnkgb25ib2FyZCBjYXJkIGRldGVjdCAqLworCWlmIChicmQtPmdldF9jZCkKKwkJcHJlc2VudCA9ICFicmQtPmdldF9jZChzbG90LT5pZCk7CisJZWxzZQorCQlwcmVzZW50ID0gKG1jaV9yZWFkbChzbG90LT5ob3N0LCBDREVURUNUKSAmICgxIDw8IHNsb3QtPmlkKSkKKwkJCT09IDAgPyAxIDogMDsKKworCWlmIChwcmVzZW50KQorCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgcHJlc2VudFxuIik7CisJZWxzZQorCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgbm90IHByZXNlbnRcbiIpOworCisJcmV0dXJuIHByZXNlbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGR3X21jaV9vcHMgPSB7CisJLnJlcXVlc3QJPSBkd19tY2lfcmVxdWVzdCwKKwkuc2V0X2lvcwk9IGR3X21jaV9zZXRfaW9zLAorCS5nZXRfcm8JCT0gZHdfbWNpX2dldF9ybywKKwkuZ2V0X2NkCQk9IGR3X21jaV9nZXRfY2QsCit9OworCitzdGF0aWMgdm9pZCBkd19tY2lfcmVxdWVzdF9lbmQoc3RydWN0IGR3X21jaSAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCisJX19yZWxlYXNlcygmaG9zdC0+bG9jaykKKwlfX2FjcXVpcmVzKCZob3N0LT5sb2NrKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgbW1jX2hvc3QJKnByZXZfbW1jID0gaG9zdC0+Y3VyX3Nsb3QtPm1tYzsKKworCVdBUk5fT04oaG9zdC0+Y21kIHx8IGhvc3QtPmRhdGEpOworCisJaG9zdC0+Y3VyX3Nsb3QtPm1ycSA9IE5VTEw7CisJaG9zdC0+bXJxID0gTlVMTDsKKwlpZiAoIWxpc3RfZW1wdHkoJmhvc3QtPnF1ZXVlKSkgeworCQlzbG90ID0gbGlzdF9lbnRyeShob3N0LT5xdWV1ZS5uZXh0LAorCQkJCSAgc3RydWN0IGR3X21jaV9zbG90LCBxdWV1ZV9ub2RlKTsKKwkJbGlzdF9kZWwoJnNsb3QtPnF1ZXVlX25vZGUpOworCQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAibGlzdCBub3QgZW1wdHk6ICVzIGlzIG5leHRcbiIsCisJCQkgbW1jX2hvc3RuYW1lKHNsb3QtPm1tYykpOworCQlob3N0LT5zdGF0ZSA9IFNUQVRFX1NFTkRJTkdfQ01EOworCQlkd19tY2lfc3RhcnRfcmVxdWVzdChob3N0LCBzbG90KTsKKwl9IGVsc2UgeworCQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAibGlzdCBlbXB0eVxuIik7CisJCWhvc3QtPnN0YXRlID0gU1RBVEVfSURMRTsKKwl9CisKKwlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJbW1jX3JlcXVlc3RfZG9uZShwcmV2X21tYywgbXJxKTsKKwlzcGluX2xvY2soJmhvc3QtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfY29tbWFuZF9jb21wbGV0ZShzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwl1MzIgc3RhdHVzID0gaG9zdC0+Y21kX3N0YXR1czsKKworCWhvc3QtPmNtZF9zdGF0dXMgPSAwOworCisJLyogUmVhZCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FyZCAodXAgdG8gMTYgYnl0ZXMpICovCisJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX1BSRVNFTlQpIHsKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQXzEzNikgeworCQkJY21kLT5yZXNwWzNdID0gbWNpX3JlYWRsKGhvc3QsIFJFU1AwKTsKKwkJCWNtZC0+cmVzcFsyXSA9IG1jaV9yZWFkbChob3N0LCBSRVNQMSk7CisJCQljbWQtPnJlc3BbMV0gPSBtY2lfcmVhZGwoaG9zdCwgUkVTUDIpOworCQkJY21kLT5yZXNwWzBdID0gbWNpX3JlYWRsKGhvc3QsIFJFU1AzKTsKKwkJfSBlbHNlIHsKKwkJCWNtZC0+cmVzcFswXSA9IG1jaV9yZWFkbChob3N0LCBSRVNQMCk7CisJCQljbWQtPnJlc3BbMV0gPSAwOworCQkJY21kLT5yZXNwWzJdID0gMDsKKwkJCWNtZC0+cmVzcFszXSA9IDA7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgU0RNTUNfSU5UX1JUTykKKwkJY21kLT5lcnJvciA9IC1FVElNRURPVVQ7CisJZWxzZSBpZiAoKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX0NSQykgJiYgKHN0YXR1cyAmIFNETU1DX0lOVF9SQ1JDKSkKKwkJY21kLT5lcnJvciA9IC1FSUxTRVE7CisJZWxzZSBpZiAoc3RhdHVzICYgU0RNTUNfSU5UX1JFU1BfRVJSKQorCQljbWQtPmVycm9yID0gLUVJTzsKKwllbHNlCisJCWNtZC0+ZXJyb3IgPSAwOworCisJaWYgKGNtZC0+ZXJyb3IpIHsKKwkJLyogbmV3ZXIgaXAgdmVyc2lvbnMgbmVlZCBhIGRlbGF5IGJldHdlZW4gcmV0cmllcyAqLworCQlpZiAoaG9zdC0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX1JFVFJZX0RFTEFZKQorCQkJbWRlbGF5KDIwKTsKKworCQlpZiAoY21kLT5kYXRhKSB7CisJCQlob3N0LT5kYXRhID0gTlVMTDsKKwkJCWR3X21jaV9zdG9wX2RtYShob3N0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIHByaXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IChzdHJ1Y3QgZHdfbWNpICopcHJpdjsKKwlzdHJ1Y3QgbW1jX2RhdGEJKmRhdGE7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CisJZW51bSBkd19tY2lfc3RhdGUgc3RhdGU7CisJZW51bSBkd19tY2lfc3RhdGUgcHJldl9zdGF0ZTsKKwl1MzIgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCXN0YXRlID0gaG9zdC0+c3RhdGU7CisJZGF0YSA9IGhvc3QtPmRhdGE7CisKKwlkbyB7CisJCXByZXZfc3RhdGUgPSBzdGF0ZTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfSURMRToKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVEVfU0VORElOR19DTUQ6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9DTURfQ09NUExFVEUsCisJCQkJCQkmaG9zdC0+cGVuZGluZ19ldmVudHMpKQorCQkJCWJyZWFrOworCisJCQljbWQgPSBob3N0LT5jbWQ7CisJCQlob3N0LT5jbWQgPSBOVUxMOworCQkJc2V0X2JpdChFVkVOVF9DTURfQ09NUExFVEUsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKTsKKwkJCWR3X21jaV9jb21tYW5kX2NvbXBsZXRlKGhvc3QsIGhvc3QtPm1ycS0+Y21kKTsKKwkJCWlmICghaG9zdC0+bXJxLT5kYXRhIHx8IGNtZC0+ZXJyb3IpIHsKKwkJCQlkd19tY2lfcmVxdWVzdF9lbmQoaG9zdCwgaG9zdC0+bXJxKTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKworCQkJcHJldl9zdGF0ZSA9IHN0YXRlID0gU1RBVEVfU0VORElOR19EQVRBOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBTVEFURV9TRU5ESU5HX0RBVEE6CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVWRU5UX0RBVEFfRVJST1IsCisJCQkJCSAgICAgICAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CisJCQkJZHdfbWNpX3N0b3BfZG1hKGhvc3QpOworCQkJCWlmIChkYXRhLT5zdG9wKQorCQkJCQlzZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOworCQkJCXN0YXRlID0gU1RBVEVfREFUQV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoRVZFTlRfWEZFUl9DT01QTEVURSwKKwkJCQkJCSZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCQkJYnJlYWs7CisKKwkJCXNldF9iaXQoRVZFTlRfWEZFUl9DT01QTEVURSwgJmhvc3QtPmNvbXBsZXRlZF9ldmVudHMpOworCQkJcHJldl9zdGF0ZSA9IHN0YXRlID0gU1RBVEVfREFUQV9CVVNZOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBTVEFURV9EQVRBX0JVU1k6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLAorCQkJCQkJJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCQlicmVhazsKKworCQkJaG9zdC0+ZGF0YSA9IE5VTEw7CisJCQlzZXRfYml0KEVWRU5UX0RBVEFfQ09NUExFVEUsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKTsKKwkJCXN0YXR1cyA9IGhvc3QtPmRhdGFfc3RhdHVzOworCisJCQlpZiAoc3RhdHVzICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCQlpZiAoc3RhdHVzICYgU0RNTUNfSU5UX0RUTykgeworCQkJCQlkZXZfZXJyKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJCQkiZGF0YSB0aW1lb3V0IGVycm9yXG4iKTsKKwkJCQkJZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU0RNTUNfSU5UX0RDUkMpIHsKKwkJCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkJImRhdGEgQ1JDIGVycm9yXG4iKTsKKwkJCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROworCQkJCX0gZWxzZSB7CisJCQkJCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwKKwkJCQkJCSJkYXRhIEZJRk8gZXJyb3IgIgorCQkJCQkJIihzdGF0dXM9JTA4eClcbiIsCisJCQkJCQlzdGF0dXMpOworCQkJCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKKwkJCQlkYXRhLT5lcnJvciA9IDA7CisJCQl9CisKKwkJCWlmICghZGF0YS0+c3RvcCkgeworCQkJCWR3X21jaV9yZXF1ZXN0X2VuZChob3N0LCBob3N0LT5tcnEpOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCisJCQlwcmV2X3N0YXRlID0gc3RhdGUgPSBTVEFURV9TRU5ESU5HX1NUT1A7CisJCQlpZiAoIWRhdGEtPmVycm9yKQorCQkJCXNlbmRfc3RvcF9jbWQoaG9zdCwgZGF0YSk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFNUQVRFX1NFTkRJTkdfU1RPUDoKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEVWRU5UX0NNRF9DT01QTEVURSwKKwkJCQkJCSZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCQkJYnJlYWs7CisKKwkJCWhvc3QtPmNtZCA9IE5VTEw7CisJCQlkd19tY2lfY29tbWFuZF9jb21wbGV0ZShob3N0LCBob3N0LT5tcnEtPnN0b3ApOworCQkJZHdfbWNpX3JlcXVlc3RfZW5kKGhvc3QsIGhvc3QtPm1ycSk7CisJCQlnb3RvIHVubG9jazsKKworCQljYXNlIFNUQVRFX0RBVEFfRVJST1I6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLAorCQkJCQkJJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCQlicmVhazsKKworCQkJc3RhdGUgPSBTVEFURV9EQVRBX0JVU1k7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHN0YXRlICE9IHByZXZfc3RhdGUpOworCisJaG9zdC0+c3RhdGUgPSBzdGF0ZTsKK3VubG9jazoKKwlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3B1c2hfZGF0YTE2KHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwl1MTYgKnBkYXRhID0gKHUxNiAqKWJ1ZjsKKworCVdBUk5fT04oY250ICUgMiAhPSAwKTsKKworCWNudCA9IGNudCA+PiAxOworCXdoaWxlIChjbnQgPiAwKSB7CisJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQljbnQtLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9wdWxsX2RhdGExNihzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCit7CisJdTE2ICpwZGF0YSA9ICh1MTYgKilidWY7CisKKwlXQVJOX09OKGNudCAlIDIgIT0gMCk7CisKKwljbnQgPSBjbnQgPj4gMTsKKwl3aGlsZSAoY250ID4gMCkgeworCQkqcGRhdGErKyA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJY250LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcHVzaF9kYXRhMzIoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQoreworCXUzMiAqcGRhdGEgPSAodTMyICopYnVmOworCisJV0FSTl9PTihjbnQgJSA0ICE9IDApOworCVdBUk5fT04oKHVuc2lnbmVkIGxvbmcpcGRhdGEgJiAweDMpOworCisJY250ID0gY250ID4+IDI7CisJd2hpbGUgKGNudCA+IDApIHsKKwkJbWNpX3dyaXRlbChob3N0LCBEQVRBLCAqcGRhdGErKyk7CisJCWNudC0tOworCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3B1bGxfZGF0YTMyKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwl1MzIgKnBkYXRhID0gKHUzMiAqKWJ1ZjsKKworCVdBUk5fT04oY250ICUgNCAhPSAwKTsKKwlXQVJOX09OKCh1bnNpZ25lZCBsb25nKXBkYXRhICYgMHgzKTsKKworCWNudCA9IGNudCA+PiAyOworCXdoaWxlIChjbnQgPiAwKSB7CisJCSpwZGF0YSsrID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQljbnQtLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9wdXNoX2RhdGE2NChzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCit7CisJdTY0ICpwZGF0YSA9ICh1NjQgKilidWY7CisKKwlXQVJOX09OKGNudCAlIDggIT0gMCk7CisKKwljbnQgPSBjbnQgPj4gMzsKKwl3aGlsZSAoY250ID4gMCkgeworCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsICpwZGF0YSsrKTsKKwkJY250LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcHVsbF9kYXRhNjQoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQoreworCXU2NCAqcGRhdGEgPSAodTY0ICopYnVmOworCisJV0FSTl9PTihjbnQgJSA4ICE9IDApOworCisJY250ID0gY250ID4+IDM7CisJd2hpbGUgKGNudCA+IDApIHsKKwkJKnBkYXRhKysgPSBtY2lfcmVhZHEoaG9zdCwgREFUQSk7CisJCWNudC0tOworCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3JlYWRfZGF0YV9waW8oc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2c7CisJdm9pZCAqYnVmID0gc2dfdmlydChzZyk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGhvc3QtPnBpb19vZmZzZXQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhID0gaG9zdC0+ZGF0YTsKKwlpbnQgc2hpZnQgPSBob3N0LT5kYXRhX3NoaWZ0OworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDAsIGxlbiwgb2xkX2xlbiwgY291bnQgPSAwOworCisJZG8geworCQlsZW4gPSBTRE1NQ19HRVRfRkNOVChtY2lfcmVhZGwoaG9zdCwgU1RBVFVTKSkgPDwgc2hpZnQ7CisJCWlmIChjb3VudCA9PSAwKQorCQkJb2xkX2xlbiA9IGxlbjsKKworCQlpZiAob2Zmc2V0ICsgbGVuIDw9IHNnLT5sZW5ndGgpIHsKKwkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLCBsZW4pOworCisJCQlvZmZzZXQgKz0gbGVuOworCQkJbmJ5dGVzICs9IGxlbjsKKworCQkJaWYgKG9mZnNldCA9PSBzZy0+bGVuZ3RoKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc2dfcGFnZShzZykpOworCQkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCQlpZiAoIXNnKQorCQkJCQlnb3RvIGRvbmU7CisKKwkJCQlvZmZzZXQgPSAwOworCQkJCWJ1ZiA9IHNnX3ZpcnQoc2cpOworCQkJfQorCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IHNnLT5sZW5ndGggLSBvZmZzZXQ7CisJCQlob3N0LT5wdWxsX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwKKwkJCQkJcmVtYWluaW5nKTsKKwkJCW5ieXRlcyArPSByZW1haW5pbmc7CisKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHNnX3BhZ2Uoc2cpKTsKKwkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWlmICghc2cpCisJCQkJZ290byBkb25lOworCisJCQlvZmZzZXQgPSBsZW4gLSByZW1haW5pbmc7CisJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCBidWYsIG9mZnNldCk7CisJCQluYnl0ZXMgKz0gb2Zmc2V0OworCQl9CisKKwkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIE1JTlRTVFMpOworCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9SWERSKTsKKwkJaWYgKHN0YXR1cyAmIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7CisJCQlob3N0LT5kYXRhX3N0YXR1cyA9IHN0YXR1czsKKwkJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CisJCQlzbXBfd21iKCk7CisKKwkJCXNldF9iaXQoRVZFTlRfREFUQV9FUlJPUiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKKworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCQlyZXR1cm47CisJCX0KKwkJY291bnQrKzsKKwl9IHdoaWxlIChzdGF0dXMgJiBTRE1NQ19JTlRfUlhEUik7IC8qaWYgdGhlIFJYRFIgaXMgcmVhZHkgcmVhZCBhZ2FpbiovCisJbGVuID0gU0RNTUNfR0VUX0ZDTlQobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykpOworCWhvc3QtPnBpb19vZmZzZXQgPSBvZmZzZXQ7CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlyZXR1cm47CisKK2RvbmU6CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlzbXBfd21iKCk7CisJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfd3JpdGVfZGF0YV9waW8oc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2c7CisJdm9pZCAqYnVmID0gc2dfdmlydChzZyk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGhvc3QtPnBpb19vZmZzZXQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhID0gaG9zdC0+ZGF0YTsKKwlpbnQgc2hpZnQgPSBob3N0LT5kYXRhX3NoaWZ0OworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDAsIGxlbjsKKworCWRvIHsKKwkJbGVuID0gU0RNTUNfRklGT19TWiAtCisJCQkoU0RNTUNfR0VUX0ZDTlQobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykpIDw8IHNoaWZ0KTsKKwkJaWYgKG9mZnNldCArIGxlbiA8PSBzZy0+bGVuZ3RoKSB7CisJCQlob3N0LT5wdXNoX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwgbGVuKTsKKworCQkJb2Zmc2V0ICs9IGxlbjsKKwkJCW5ieXRlcyArPSBsZW47CisJCQlpZiAob2Zmc2V0ID09IHNnLT5sZW5ndGgpIHsKKwkJCQlob3N0LT5zZyA9IHNnID0gc2dfbmV4dChzZyk7CisJCQkJaWYgKCFzZykKKwkJCQkJZ290byBkb25lOworCisJCQkJb2Zmc2V0ID0gMDsKKwkJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCByZW1haW5pbmcgPSBzZy0+bGVuZ3RoIC0gb2Zmc2V0OworCisJCQlob3N0LT5wdXNoX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwKKwkJCQkJcmVtYWluaW5nKTsKKwkJCW5ieXRlcyArPSByZW1haW5pbmc7CisKKwkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWlmICghc2cpCisJCQkJZ290byBkb25lOworCisJCQlvZmZzZXQgPSBsZW4gLSByZW1haW5pbmc7CisJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCWhvc3QtPnB1c2hfZGF0YShob3N0LCAodm9pZCAqKWJ1Ziwgb2Zmc2V0KTsKKwkJCW5ieXRlcyArPSBvZmZzZXQ7CisJCX0KKworCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgTUlOVFNUUyk7CisJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1RYRFIpOworCQlpZiAoc3RhdHVzICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKworCQkJc21wX3dtYigpOworCisJCQlzZXRfYml0KEVWRU5UX0RBVEFfRVJST1IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZSAoc3RhdHVzICYgU0RNTUNfSU5UX1RYRFIpOyAvKiBpZiBUWERSIHdyaXRlIGFnYWluICovCisKKwlob3N0LT5waW9fb2Zmc2V0ID0gb2Zmc2V0OworCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CisKKwlyZXR1cm47CisKK2RvbmU6CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlzbXBfd21iKCk7CisJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfY21kX2ludGVycnVwdChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1MzIgc3RhdHVzKQoreworCWlmICghaG9zdC0+Y21kX3N0YXR1cykKKwkJaG9zdC0+Y21kX3N0YXR1cyA9IHN0YXR1czsKKworCXNtcF93bWIoKTsKKworCXNldF9iaXQoRVZFTlRfQ01EX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHdfbWNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IGRldl9pZDsKKwl1MzIgc3RhdHVzLCBwZW5kaW5nOworCXVuc2lnbmVkIGludCBwYXNzX2NvdW50ID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIFJJTlRTVFMpOworCQlwZW5kaW5nID0gbWNpX3JlYWRsKGhvc3QsIE1JTlRTVFMpOyAvKiByZWFkLW9ubHkgbWFzayByZWcgKi8KKworCQkvKgorCQkgKiBEVE8gZml4IC0gdmVyc2lvbiAyLjEwYSBhbmQgYmVsb3csIGFuZCBvbmx5IGlmIGludGVybmFsIERNQQorCQkgKiBpcyBjb25maWd1cmVkLgorCQkgKi8KKwkJaWYgKGhvc3QtPnF1aXJrcyAmIERXX01DSV9RVUlSS19JRE1BQ19EVE8pIHsKKwkJCWlmICghcGVuZGluZyAmJgorCQkJICAgICgobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykgPj4gMTcpICYgMHgxZmZmKSkKKwkJCQlwZW5kaW5nIHw9IFNETU1DX0lOVF9EQVRBX09WRVI7CisJCX0KKworCQlpZiAoIXBlbmRpbmcpCisJCQlicmVhazsKKworCQlpZiAocGVuZGluZyAmIERXX01DSV9DTURfRVJST1JfRkxBR1MpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgRFdfTUNJX0NNRF9FUlJPUl9GTEFHUyk7CisJCQlob3N0LT5jbWRfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJc2V0X2JpdChFVkVOVF9DTURfQ09NUExFVEUsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCS8qIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlcG9ydCBEQVRBX0VSUk9SICovCisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKTsKKwkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJc2V0X2JpdChFVkVOVF9EQVRBX0VSUk9SLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCX0KKworCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9EQVRBX09WRVIpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX0RBVEFfT1ZFUik7CisJCQlpZiAoIWhvc3QtPmRhdGFfc3RhdHVzKQorCQkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJaWYgKGhvc3QtPmRpcl9zdGF0dXMgPT0gRFdfTUNJX1JFQ1ZfU1RBVFVTKSB7CisJCQkJaWYgKGhvc3QtPnNnICE9IE5VTEwpCisJCQkJCWR3X21jaV9yZWFkX2RhdGFfcGlvKGhvc3QpOworCQkJfQorCQkJc2V0X2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCX0KKworCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9SWERSKSB7CisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9SWERSKTsKKwkJCWlmIChob3N0LT5zZykKKwkJCQlkd19tY2lfcmVhZF9kYXRhX3Bpbyhob3N0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX1RYRFIpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1RYRFIpOworCQkJaWYgKGhvc3QtPnNnKQorCQkJCWR3X21jaV93cml0ZV9kYXRhX3Bpbyhob3N0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX0NNRF9ET05FKSB7CisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9DTURfRE9ORSk7CisJCQlkd19tY2lfY21kX2ludGVycnVwdChob3N0LCBzdGF0dXMpOworCQl9CisKKwkJaWYgKHBlbmRpbmcgJiBTRE1NQ19JTlRfQ0QpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX0NEKTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmNhcmRfdGFza2xldCk7CisJCX0KKworCX0gd2hpbGUgKHBhc3NfY291bnQrKyA8IDUpOworCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworCS8qIEhhbmRsZSBETUEgaW50ZXJydXB0cyAqLworCXBlbmRpbmcgPSBtY2lfcmVhZGwoaG9zdCwgSURTVFMpOworCWlmIChwZW5kaW5nICYgKFNETU1DX0lETUFDX0lOVF9USSB8IFNETU1DX0lETUFDX0lOVF9SSSkpIHsKKwkJbWNpX3dyaXRlbChob3N0LCBJRFNUUywgU0RNTUNfSURNQUNfSU5UX1RJIHwgU0RNTUNfSURNQUNfSU5UX1JJKTsKKwkJbWNpX3dyaXRlbChob3N0LCBJRFNUUywgU0RNTUNfSURNQUNfSU5UX05JKTsKKwkJc2V0X2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQlob3N0LT5kbWFfb3BzLT5jb21wbGV0ZShob3N0KTsKKwl9CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3Rhc2tsZXRfY2FyZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IChzdHJ1Y3QgZHdfbWNpICopZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHNsb3QtPm1tYzsKKwkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJCWludCBwcmVzZW50OworCQl1MzIgY3RybDsKKworCQlwcmVzZW50ID0gZHdfbWNpX2dldF9jZChtbWMpOworCQl3aGlsZSAocHJlc2VudCAhPSBzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSkgeworCQkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCQkJZGV2X2RiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJjYXJkICVzXG4iLAorCQkJCXByZXNlbnQgPyAiaW5zZXJ0ZWQiIDogInJlbW92ZWQiKTsKKworCQkJLyogQ2FyZCBjaGFuZ2UgZGV0ZWN0ZWQgKi8KKwkJCXNsb3QtPmxhc3RfZGV0ZWN0X3N0YXRlID0gcHJlc2VudDsKKworCQkJLyogUG93ZXIgdXAgc2xvdCAqLworCQkJaWYgKHByZXNlbnQgIT0gMCkgeworCQkJCWlmIChob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihzbG90LT5pZCwKKwkJCQkJCQkgICAgICBtbWMtPm9jcl9hdmFpbCk7CisKKwkJCQlzZXRfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisJCQl9CisKKwkJCS8qIENsZWFuIHVwIHF1ZXVlIGlmIHByZXNlbnQgKi8KKwkJCW1ycSA9IHNsb3QtPm1ycTsKKwkJCWlmIChtcnEpIHsKKwkJCQlpZiAobXJxID09IGhvc3QtPm1ycSkgeworCQkJCQlob3N0LT5kYXRhID0gTlVMTDsKKwkJCQkJaG9zdC0+Y21kID0gTlVMTDsKKworCQkJCQlzd2l0Y2ggKGhvc3QtPnN0YXRlKSB7CisJCQkJCWNhc2UgU1RBVEVfSURMRToKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNUQVRFX1NFTkRJTkdfQ01EOgorCQkJCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJCWlmICghbXJxLT5kYXRhKQorCQkJCQkJCWJyZWFrOworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU1RBVEVfU0VORElOR19EQVRBOgorCQkJCQkJbXJxLT5kYXRhLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCQlkd19tY2lfc3RvcF9kbWEoaG9zdCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTVEFURV9EQVRBX0JVU1k6CisJCQkJCWNhc2UgU1RBVEVfREFUQV9FUlJPUjoKKwkJCQkJCWlmIChtcnEtPmRhdGEtPmVycm9yID09IC1FSU5QUk9HUkVTUykKKwkJCQkJCQltcnEtPmRhdGEtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJCWlmICghbXJxLT5zdG9wKQorCQkJCQkJCWJyZWFrOworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU1RBVEVfU0VORElOR19TVE9QOgorCQkJCQkJbXJxLT5zdG9wLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWR3X21jaV9yZXF1ZXN0X2VuZChob3N0LCBtcnEpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfZGVsKCZzbG90LT5xdWV1ZV9ub2RlKTsKKwkJCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJaWYgKG1ycS0+ZGF0YSkKKwkJCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCQlpZiAobXJxLT5zdG9wKQorCQkJCQkJbXJxLT5zdG9wLT5lcnJvciA9IC1FTk9NRURJVU07CisKKwkJCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkJCQltbWNfcmVxdWVzdF9kb25lKHNsb3QtPm1tYywgbXJxKTsKKwkJCQkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFBvd2VyIGRvd24gc2xvdCAqLworCQkJaWYgKHByZXNlbnQgPT0gMCkgeworCQkJCWlmIChob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihzbG90LT5pZCwgMCk7CisJCQkJY2xlYXJfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisKKwkJCQkvKgorCQkJCSAqIENsZWFyIGRvd24gdGhlIEZJRk8gLSBkb2luZyBzbyBnZW5lcmF0ZXMgYQorCQkJCSAqIGJsb2NrIGludGVycnVwdCwgaGVuY2Ugc2V0dGluZyB0aGUKKwkJCQkgKiBzY2F0dGVyLWdhdGhlciBwb2ludGVyIHRvIE5VTEwuCisJCQkJICovCisJCQkJaG9zdC0+c2cgPSBOVUxMOworCisJCQkJY3RybCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwkJCQljdHJsIHw9IFNETU1DX0NUUkxfRklGT19SRVNFVDsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIENUUkwsIGN0cmwpOworCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworCQkJCWN0cmwgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7CisJCQkJY3RybCB8PSAweDAxOyAvKiBTb2Z0d2FyZSByZXNldCBvZiBETUEgKi8KKwkJCQltY2lfd3JpdGVsKGhvc3QsIEJNT0QsIGN0cmwpOworI2VuZGlmCisKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkJcHJlc2VudCA9IGR3X21jaV9nZXRfY2QobW1jKTsKKwkJfQorCisJCW1tY19kZXRlY3RfY2hhbmdlKHNsb3QtPm1tYywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoaG9zdC0+cGRhdGEtPmRldGVjdF9kZWxheV9tcykpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgZHdfbWNpX2luaXRfc2xvdChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IG1tY19ob3N0ICptbWM7CisJc3RydWN0IGR3X21jaV9zbG90ICpzbG90OworCisJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCBkd19tY2lfc2xvdCksICZob3N0LT5wZGV2LT5kZXYpOworCWlmICghbW1jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNsb3QgPSBtbWNfcHJpdihtbWMpOworCXNsb3QtPmlkID0gaWQ7CisJc2xvdC0+bW1jID0gbW1jOworCXNsb3QtPmhvc3QgPSBob3N0OworCisJbW1jLT5vcHMgPSAmZHdfbWNpX29wczsKKwltbWMtPmZfbWluID0gRElWX1JPVU5EX1VQKGhvc3QtPmJ1c19oeiwgNTEwKTsKKwltbWMtPmZfbWF4ID0gaG9zdC0+YnVzX2h6OworCisJaWYgKGhvc3QtPnBkYXRhLT5nZXRfb2NyKQorCQltbWMtPm9jcl9hdmFpbCA9IGhvc3QtPnBkYXRhLT5nZXRfb2NyKGlkKTsKKwllbHNlCisJCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQ7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggc2xvdCBwb3dlciBkaXNhYmxlZCwgaXQgd2lsbCBiZSBlbmFibGVkIHdoZW4gYSBjYXJkCisJICogaXMgZGV0ZWN0ZWQuCisJICovCisJaWYgKGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKKwkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKGlkLCAwKTsKKworCW1tYy0+Y2FwcyA9IDA7CisJaWYgKGhvc3QtPnBkYXRhLT5nZXRfYnVzX3dkKQorCQlpZiAoaG9zdC0+cGRhdGEtPmdldF9idXNfd2Qoc2xvdC0+aWQpID49IDQpCisJCQltbWMtPmNhcHMgfD0gTU1DX0NBUF80X0JJVF9EQVRBOworCisJaWYgKGhvc3QtPnBkYXRhLT5xdWlya3MgJiBEV19NQ0lfUVVJUktfSElHSFNQRUVEKQorCQltbWMtPmNhcHMgfD0gTU1DX0NBUF9TRF9ISUdIU1BFRUQ7CisKKyNpZmRlZiBDT05GSUdfTU1DX0RXX0lETUFDCisJbW1jLT5tYXhfc2VncyA9IGhvc3QtPnJpbmdfc2l6ZTsKKwltbWMtPm1heF9ibGtfc2l6ZSA9IDY1NTM2OworCW1tYy0+bWF4X2Jsa19jb3VudCA9IGhvc3QtPnJpbmdfc2l6ZTsKKwltbWMtPm1heF9zZWdfc2l6ZSA9IDB4MTAwMDsKKwltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X3NlZ19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworI2Vsc2UKKwlpZiAoaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncykgeworCQltbWMtPm1heF9zZWdzID0gaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncy0+bWF4X3NlZ3M7CisJCW1tYy0+bWF4X2Jsa19zaXplID0gaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncy0+bWF4X2Jsa19zaXplOworCQltbWMtPm1heF9ibGtfY291bnQgPSBob3N0LT5wZGF0YS0+YmxrX3NldHRpbmdzLT5tYXhfYmxrX2NvdW50OworCQltbWMtPm1heF9yZXFfc2l6ZSA9IGhvc3QtPnBkYXRhLT5ibGtfc2V0dGluZ3MtPm1heF9yZXFfc2l6ZTsKKwkJbW1jLT5tYXhfc2VnX3NpemUgPSBob3N0LT5wZGF0YS0+YmxrX3NldHRpbmdzLT5tYXhfc2VnX3NpemU7CisJfSBlbHNlIHsKKwkJLyogVXNlZnVsIGRlZmF1bHRzIGlmIHBsYXRmb3JtIGRhdGEgaXMgdW5zZXQuICovCisJCW1tYy0+bWF4X3NlZ3MgPSA2NDsKKwkJbW1jLT5tYXhfYmxrX3NpemUgPSA2NTUzNjsgLyogQkxLU0laIGlzIDE2IGJpdHMgKi8KKwkJbW1jLT5tYXhfYmxrX2NvdW50ID0gNTEyOworCQltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X2Jsa19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworCQltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTU1DX0RXX0lETUFDICovCisKKwlpZiAoZHdfbWNpX2dldF9jZChtbWMpKQorCQlzZXRfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoRFdfTU1DX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKTsKKworCWhvc3QtPnNsb3RbaWRdID0gc2xvdDsKKwltbWNfYWRkX2hvc3QobW1jKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorCWR3X21jaV9pbml0X2RlYnVnZnMoc2xvdCk7CisjZW5kaWYKKworCS8qIENhcmQgaW5pdGlhbGx5IHVuZGV0ZWN0ZWQgKi8KKwlzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX2NsZWFudXBfc2xvdChzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsIHVuc2lnbmVkIGludCBpZCkKK3sKKwkvKiBTaHV0ZG93biBkZXRlY3QgSVJRICovCisJaWYgKHNsb3QtPmhvc3QtPnBkYXRhLT5leGl0KQorCQlzbG90LT5ob3N0LT5wZGF0YS0+ZXhpdChpZCk7CisKKwkvKiBEZWJ1Z2ZzIHN0dWZmIGlzIGNsZWFuZWQgdXAgYnkgbW1jIGNvcmUgKi8KKwltbWNfcmVtb3ZlX2hvc3Qoc2xvdC0+bW1jKTsKKwlzbG90LT5ob3N0LT5zbG90W2lkXSA9IE5VTEw7CisJbW1jX2ZyZWVfaG9zdChzbG90LT5tbWMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfaW5pdF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwkvKiBBbGxvYyBtZW1vcnkgZm9yIHNnIHRyYW5zbGF0aW9uICovCisJaG9zdC0+c2dfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZob3N0LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJICAmaG9zdC0+c2dfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QtPnNnX2NwdSkgeworCQlkZXZfZXJyKCZob3N0LT5wZGV2LT5kZXYsICIlczogY291bGQgbm90IGFsbG9jIERNQSBtZW1vcnlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gbm9fZG1hOworCX0KKworCS8qIERldGVybWluZSB3aGljaCBETUEgaW50ZXJmYWNlIHRvIHVzZSAqLworI2lmZGVmIENPTkZJR19NTUNfRFdfSURNQUMKKwlob3N0LT5kbWFfb3BzID0gJmR3X21jaV9pZG1hY19vcHM7CisJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwgIlVzaW5nIGludGVybmFsIERNQSBjb250cm9sbGVyLlxuIik7CisjZW5kaWYKKworCWlmICghaG9zdC0+ZG1hX29wcykKKwkJZ290byBub19kbWE7CisKKwlpZiAoaG9zdC0+ZG1hX29wcy0+aW5pdCkgeworCQlpZiAoaG9zdC0+ZG1hX29wcy0+aW5pdChob3N0KSkgeworCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJCQkiRE1BIENvbnRyb2xsZXIuXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG5vX2RtYTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBpbml0aWFsaXphdGlvbiBub3QgZm91bmQuXG4iKTsKKwkJZ290byBub19kbWE7CisJfQorCisJaG9zdC0+dXNlX2RtYSA9IDE7CisJcmV0dXJuOworCitub19kbWE6CisJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwgIlVzaW5nIFBJTyBtb2RlLlxuIik7CisJaG9zdC0+dXNlX2RtYSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgYm9vbCBtY2lfd2FpdF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgKFNETU1DX0NUUkxfUkVTRVQgfCBTRE1NQ19DVFJMX0ZJRk9fUkVTRVQgfAorCQkJCVNETU1DX0NUUkxfRE1BX1JFU0VUKSk7CisKKwkvKiB3YWl0IHRpbGwgcmVzZXRzIGNsZWFyICovCisJZG8geworCQljdHJsID0gbWNpX3JlYWRsKGhvc3QsIENUUkwpOworCQlpZiAoIShjdHJsICYgKFNETU1DX0NUUkxfUkVTRVQgfCBTRE1NQ19DVFJMX0ZJRk9fUkVTRVQgfAorCQkJICAgICAgU0RNTUNfQ1RSTF9ETUFfUkVTRVQpKSkKKwkJCXJldHVybiB0cnVlOworCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWRldl9lcnIoZGV2LCAiVGltZW91dCByZXNldHRpbmcgYmxvY2sgKGN0cmwgJSN4KVxuIiwgY3RybCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgZHdfbWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdDsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CisJc3RydWN0IGR3X21jaV9ib2FyZCAqcGRhdGE7CisJaW50IGlycSwgcmV0LCBpLCB3aWR0aDsKKwl1MzIgZmlmb19zaXplOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKQorCQlyZXR1cm4gLUVOWElPOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWhvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfbWNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhvc3QtPnBkZXYgPSBwZGV2OworCWhvc3QtPnBkYXRhID0gcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aW5pdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiUGxhdGZvcm0gZGF0YSBtdXN0IHN1cHBseSBpbml0IGZ1bmN0aW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisJfQorCisJaWYgKCFwZGF0YS0+c2VsZWN0X3Nsb3QgJiYgcGRhdGEtPm51bV9zbG90cyA+IDEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlBsYXRmb3JtIGRhdGEgbXVzdCBzdXBwbHkgc2VsZWN0X3Nsb3QgZnVuY3Rpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlaG9zdDsKKwl9CisKKwlpZiAoIXBkYXRhLT5idXNfaHopIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlBsYXRmb3JtIGRhdGEgbXVzdCBzdXBwbHkgYnVzIHNwZWVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisJfQorCisJaG9zdC0+YnVzX2h6ID0gcGRhdGEtPmJ1c19oejsKKwlob3N0LT5xdWlya3MgPSBwZGF0YS0+cXVpcmtzOworCisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZob3N0LT5xdWV1ZSk7CisKKwlyZXQgPSAtRU5PTUVNOworCWhvc3QtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghaG9zdC0+cmVncykKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisKKwlob3N0LT5kbWFfb3BzID0gcGRhdGEtPmRtYV9vcHM7CisJZHdfbWNpX2luaXRfZG1hKGhvc3QpOworCisJLyoKKwkgKiBHZXQgdGhlIGhvc3QgZGF0YSB3aWR0aCAtIHRoaXMgYXNzdW1lcyB0aGF0IEhDT04gaGFzIGJlZW4gc2V0IHdpdGgKKwkgKiB0aGUgY29ycmVjdCB2YWx1ZXMuCisJICovCisJaSA9IChtY2lfcmVhZGwoaG9zdCwgSENPTikgPj4gNykgJiAweDc7CisJaWYgKCFpKSB7CisJCWhvc3QtPnB1c2hfZGF0YSA9IGR3X21jaV9wdXNoX2RhdGExNjsKKwkJaG9zdC0+cHVsbF9kYXRhID0gZHdfbWNpX3B1bGxfZGF0YTE2OworCQl3aWR0aCA9IDE2OworCQlob3N0LT5kYXRhX3NoaWZ0ID0gMTsKKwl9IGVsc2UgaWYgKGkgPT0gMikgeworCQlob3N0LT5wdXNoX2RhdGEgPSBkd19tY2lfcHVzaF9kYXRhNjQ7CisJCWhvc3QtPnB1bGxfZGF0YSA9IGR3X21jaV9wdWxsX2RhdGE2NDsKKwkJd2lkdGggPSA2NDsKKwkJaG9zdC0+ZGF0YV9zaGlmdCA9IDM7CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgZm9yIGEgcmVzZXJ2ZWQgdmFsdWUsIGFuZCB3YXJuIGlmIGl0IGlzICovCisJCVdBUk4oKGkgIT0gMSksCisJCSAgICAgIkhDT04gcmVwb3J0cyBhIHJlc2VydmVkIGhvc3QgZGF0YSB3aWR0aCFcbiIKKwkJICAgICAiRGVmYXVsdGluZyB0byAzMi1iaXQgYWNjZXNzLlxuIik7CisJCWhvc3QtPnB1c2hfZGF0YSA9IGR3X21jaV9wdXNoX2RhdGEzMjsKKwkJaG9zdC0+cHVsbF9kYXRhID0gZHdfbWNpX3B1bGxfZGF0YTMyOworCQl3aWR0aCA9IDMyOworCQlob3N0LT5kYXRhX3NoaWZ0ID0gMjsKKwl9CisKKwkvKiBSZXNldCBhbGwgYmxvY2tzICovCisJaWYgKCFtY2lfd2FpdF9yZXNldCgmcGRldi0+ZGV2LCBob3N0KSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kbWF1bm1hcDsKKwl9CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBmb3IgdGhlIGhvc3QgY29udHJvbGxlciAqLworCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgMHhGRkZGRkZGRik7CisJbWNpX3dyaXRlbChob3N0LCBJTlRNQVNLLCAwKTsgLyogZGlzYWJsZSBhbGwgbW1jIGludGVycnVwdCBmaXJzdCAqLworCisJLyogUHV0IGluIG1heCB0aW1lb3V0ICovCisJbWNpX3dyaXRlbChob3N0LCBUTU9VVCwgMHhGRkZGRkZGRik7CisKKwkvKgorCSAqIEZJRk8gdGhyZXNob2xkIHNldHRpbmdzICBSeE1hcmsgID0gZmlmb19zaXplIC8gMiAtIDEsCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFR4IE1hcmsgPSBmaWZvX3NpemUgLyAyIERNQSBTaXplID0gOAorCSAqLworCWZpZm9fc2l6ZSA9IG1jaV9yZWFkbChob3N0LCBGSUZPVEgpOworCWZpZm9fc2l6ZSA9IChmaWZvX3NpemUgPj4gMTYpICYgMHg3ZmY7CisJbWNpX3dyaXRlbChob3N0LCBGSUZPVEgsICgoMHgyIDw8IDI4KSB8ICgoZmlmb19zaXplLzIgLSAxKSA8PCAxNikgfAorCQkJCSAgKChmaWZvX3NpemUvMikgPDwgMCkpKTsKKworCS8qIGRpc2FibGUgY2xvY2sgdG8gQ0lVICovCisJbWNpX3dyaXRlbChob3N0LCBDTEtFTkEsIDApOworCW1jaV93cml0ZWwoaG9zdCwgQ0xLU1JDLCAwKTsKKworCXRhc2tsZXRfaW5pdCgmaG9zdC0+dGFza2xldCwgZHdfbWNpX3Rhc2tsZXRfZnVuYywgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisJdGFza2xldF9pbml0KCZob3N0LT5jYXJkX3Rhc2tsZXQsCisJCSAgICAgZHdfbWNpX3Rhc2tsZXRfY2FyZCwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGR3X21jaV9pbnRlcnJ1cHQsIDAsICJkdy1tY2kiLCBob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kbWF1bm1hcDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJaWYgKGhvc3QtPnBkYXRhLT5udW1fc2xvdHMpCisJCWhvc3QtPm51bV9zbG90cyA9IGhvc3QtPnBkYXRhLT5udW1fc2xvdHM7CisJZWxzZQorCQlob3N0LT5udW1fc2xvdHMgPSAoKG1jaV9yZWFkbChob3N0LCBIQ09OKSA+PiAxKSAmIDB4MUYpICsgMTsKKworCS8qIFdlIG5lZWQgYXQgbGVhc3Qgb25lIHNsb3QgdG8gc3VjY2VlZCAqLworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlyZXQgPSBkd19tY2lfaW5pdF9zbG90KGhvc3QsIGkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfaW5pdF9zbG90OworCQl9CisJfQorCisJLyoKKwkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgY29tbWFuZCBkb25lLCBkYXRhIG92ZXIsIGRhdGEgZW1wdHksIGNhcmQgZGV0LAorCSAqIHJlY2VpdmUgcmVhZHkgYW5kIGVycm9yIHN1Y2ggYXMgdHJhbnNtaXQsIHJlY2VpdmUgdGltZW91dCwgY3JjIGVycm9yCisJICovCisJbWNpX3dyaXRlbChob3N0LCBSSU5UU1RTLCAweEZGRkZGRkZGKTsKKwltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIFNETU1DX0lOVF9DTURfRE9ORSB8IFNETU1DX0lOVF9EQVRBX09WRVIgfAorCQkgICBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSIHwKKwkJICAgRFdfTUNJX0VSUk9SX0ZMQUdTIHwgU0RNTUNfSU5UX0NEKTsKKwltY2lfd3JpdGVsKGhvc3QsIENUUkwsIFNETU1DX0NUUkxfSU5UX0VOQUJMRSk7IC8qIEVuYWJsZSBtY2kgaW50ZXJydXB0ICovCisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRFcgTU1DIGNvbnRyb2xsZXIgYXQgaXJxICVkLCAiCisJCSAiJWQgYml0IGhvc3QgZGF0YSB3aWR0aFxuIiwgaXJxLCB3aWR0aCk7CisJaWYgKGhvc3QtPnF1aXJrcyAmIERXX01DSV9RVUlSS19JRE1BQ19EVE8pCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbnRlcm5hbCBETUFDIGludGVycnVwdCBmaXggZW5hYmxlZC5cbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9pbml0X3Nsb3Q6CisJLyogRGUtaW5pdCBhbnkgaW5pdGlhbGl6ZWQgc2xvdHMgKi8KKwl3aGlsZSAoaSA+IDApIHsKKwkJaWYgKGhvc3QtPnNsb3RbaV0pCisJCQlkd19tY2lfY2xlYW51cF9zbG90KGhvc3QtPnNsb3RbaV0sIGkpOworCQlpLS07CisJfQorCWZyZWVfaXJxKGlycSwgaG9zdCk7CisKK2Vycl9kbWF1bm1hcDoKKwlpZiAoaG9zdC0+dXNlX2RtYSAmJiBob3N0LT5kbWFfb3BzLT5leGl0KQorCQlob3N0LT5kbWFfb3BzLT5leGl0KGhvc3QpOworCWRtYV9mcmVlX2NvaGVyZW50KCZob3N0LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgaG9zdC0+c2dfY3B1LCBob3N0LT5zZ19kbWEpOworCWlvdW5tYXAoaG9zdC0+cmVncyk7CisKK2Vycl9mcmVlaG9zdDoKKwlrZnJlZShob3N0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBkd19tY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpOworCisJbWNpX3dyaXRlbChob3N0LCBSSU5UU1RTLCAweEZGRkZGRkZGKTsKKwltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIDApOyAvKiBkaXNhYmxlIGFsbCBtbWMgaW50ZXJydXB0IGZpcnN0ICovCisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZW1vdmUgc2xvdCAlZFxuIiwgaSk7CisJCWlmIChob3N0LT5zbG90W2ldKQorCQkJZHdfbWNpX2NsZWFudXBfc2xvdChob3N0LT5zbG90W2ldLCBpKTsKKwl9CisKKwkvKiBkaXNhYmxlIGNsb2NrIHRvIENJVSAqLworCW1jaV93cml0ZWwoaG9zdCwgQ0xLRU5BLCAwKTsKKwltY2lfd3JpdGVsKGhvc3QsIENMS1NSQywgMCk7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBob3N0KTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBQQUdFX1NJWkUsIGhvc3QtPnNnX2NwdSwgaG9zdC0+c2dfZG1hKTsKKworCWlmIChob3N0LT51c2VfZG1hICYmIGhvc3QtPmRtYV9vcHMtPmV4aXQpCisJCWhvc3QtPmRtYV9vcHMtPmV4aXQoaG9zdCk7CisKKwlpb3VubWFwKGhvc3QtPnJlZ3MpOworCisJa2ZyZWUoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBUT0RPOiB3ZSBzaG91bGQgcHJvYmFibHkgZGlzYWJsZSB0aGUgY2xvY2sgdG8gdGhlIGNhcmQgaW4gdGhlIHN1c3BlbmQgcGF0aC4KKyAqLworc3RhdGljIGludCBkd19tY2lfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKwkJcmV0ID0gbW1jX3N1c3BlbmRfaG9zdChzbG90LT5tbWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJc2xvdCA9IGhvc3QtPnNsb3RbaV07CisJCQkJaWYgKHNsb3QpCisJCQkJCW1tY19yZXN1bWVfaG9zdChob3N0LT5zbG90W2ldLT5tbWMpOworCQkJfQorCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR3X21jaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKwkJcmV0ID0gbW1jX3Jlc3VtZV9ob3N0KGhvc3QtPnNsb3RbaV0tPm1tYyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGR3X21jaV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgZHdfbWNpX3Jlc3VtZQlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X21jaV9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChkd19tY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGR3X21jaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZHdfbWNpX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gImR3X21tYyIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGR3X21jaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHdfbWNpX2RyaXZlciwgZHdfbWNpX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGR3X21jaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X21jaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkd19tY2lfaW5pdCk7Cittb2R1bGVfZXhpdChkd19tY2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFcgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk5YUCBTZW1pY29uZHVjdG9yIFZpZXROYW0iKTsKK01PRFVMRV9BVVRIT1IoIkltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDU1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIGRyaXZlcgorICogIChCYXNlZCBvbiBOWFAgZHJpdmVyIGZvciBscGMgMzF4eCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTlhQIFNlbWljb25kdWN0b3JzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0RXX01NQ19IXworI2RlZmluZSBfRFdfTU1DX0hfCisKKyNkZWZpbmUgU0RNTUNfQ1RSTAkJMHgwMDAKKyNkZWZpbmUgU0RNTUNfUFdSRU4JCTB4MDA0CisjZGVmaW5lIFNETU1DX0NMS0RJVgkJMHgwMDgKKyNkZWZpbmUgU0RNTUNfQ0xLU1JDCQkweDAwYworI2RlZmluZSBTRE1NQ19DTEtFTkEJCTB4MDEwCisjZGVmaW5lIFNETU1DX1RNT1VUCQkweDAxNAorI2RlZmluZSBTRE1NQ19DVFlQRQkJMHgwMTgKKyNkZWZpbmUgU0RNTUNfQkxLU0laCQkweDAxYworI2RlZmluZSBTRE1NQ19CWVRDTlQJCTB4MDIwCisjZGVmaW5lIFNETU1DX0lOVE1BU0sJCTB4MDI0CisjZGVmaW5lIFNETU1DX0NNREFSRwkJMHgwMjgKKyNkZWZpbmUgU0RNTUNfQ01ECQkweDAyYworI2RlZmluZSBTRE1NQ19SRVNQMAkJMHgwMzAKKyNkZWZpbmUgU0RNTUNfUkVTUDEJCTB4MDM0CisjZGVmaW5lIFNETU1DX1JFU1AyCQkweDAzOAorI2RlZmluZSBTRE1NQ19SRVNQMwkJMHgwM2MKKyNkZWZpbmUgU0RNTUNfTUlOVFNUUwkJMHgwNDAKKyNkZWZpbmUgU0RNTUNfUklOVFNUUwkJMHgwNDQKKyNkZWZpbmUgU0RNTUNfU1RBVFVTCQkweDA0OAorI2RlZmluZSBTRE1NQ19GSUZPVEgJCTB4MDRjCisjZGVmaW5lIFNETU1DX0NERVRFQ1QJCTB4MDUwCisjZGVmaW5lIFNETU1DX1dSVFBSVAkJMHgwNTQKKyNkZWZpbmUgU0RNTUNfR1BJTwkJMHgwNTgKKyNkZWZpbmUgU0RNTUNfVENCQ05UCQkweDA1YworI2RlZmluZSBTRE1NQ19UQkJDTlQJCTB4MDYwCisjZGVmaW5lIFNETU1DX0RFQk5DRQkJMHgwNjQKKyNkZWZpbmUgU0RNTUNfVVNSSUQJCTB4MDY4CisjZGVmaW5lIFNETU1DX1ZFUklECQkweDA2YworI2RlZmluZSBTRE1NQ19IQ09OCQkweDA3MAorI2RlZmluZSBTRE1NQ19CTU9ECQkweDA4MAorI2RlZmluZSBTRE1NQ19QTERNTkQJCTB4MDg0CisjZGVmaW5lIFNETU1DX0RCQUREUgkJMHgwODgKKyNkZWZpbmUgU0RNTUNfSURTVFMJCTB4MDhjCisjZGVmaW5lIFNETU1DX0lESU5URU4JCTB4MDkwCisjZGVmaW5lIFNETU1DX0RTQ0FERFIJCTB4MDk0CisjZGVmaW5lIFNETU1DX0JVRkFERFIJCTB4MDk4CisjZGVmaW5lIFNETU1DX0RBVEEJCTB4MTAwCisjZGVmaW5lIFNETU1DX0RBVEFfQURSCQkweDEwMAorCisvKiBzaGlmdCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgX1NCRihmLCB2KQkJKCh2KSA8PCAoZikpCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19DVFJMX1VTRV9JRE1BQwkJQklUKDI1KQorI2RlZmluZSBTRE1NQ19DVFJMX0NFQVRBX0lOVF9FTgkJQklUKDExKQorI2RlZmluZSBTRE1NQ19DVFJMX1NFTkRfQVNfQ0NTRAkJQklUKDEwKQorI2RlZmluZSBTRE1NQ19DVFJMX1NFTkRfQ0NTRAkJQklUKDkpCisjZGVmaW5lIFNETU1DX0NUUkxfQUJSVF9SRUFEX0RBVEEJQklUKDgpCisjZGVmaW5lIFNETU1DX0NUUkxfU0VORF9JUlFfUkVTUAlCSVQoNykKKyNkZWZpbmUgU0RNTUNfQ1RSTF9SRUFEX1dBSVQJCUJJVCg2KQorI2RlZmluZSBTRE1NQ19DVFJMX0RNQV9FTkFCTEUJCUJJVCg1KQorI2RlZmluZSBTRE1NQ19DVFJMX0lOVF9FTkFCTEUJCUJJVCg0KQorI2RlZmluZSBTRE1NQ19DVFJMX0RNQV9SRVNFVAkJQklUKDIpCisjZGVmaW5lIFNETU1DX0NUUkxfRklGT19SRVNFVAkJQklUKDEpCisjZGVmaW5lIFNETU1DX0NUUkxfUkVTRVQJCUJJVCgwKQorLyogQ2xvY2sgRW5hYmxlIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgU0RNTUNfQ0xLRU5fTE9XX1BXUgkJQklUKDE2KQorI2RlZmluZSBTRE1NQ19DTEtFTl9FTkFCTEUJCUJJVCgwKQorLyogdGltZS1vdXQgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19UTU9VVF9EQVRBKG4pCQlfU0JGKDgsIChuKSkKKyNkZWZpbmUgU0RNTUNfVE1PVVRfREFUQV9NU0sJCTB4RkZGRkZGMDAKKyNkZWZpbmUgU0RNTUNfVE1PVVRfUkVTUChuKQkJKChuKSAmIDB4RkYpCisjZGVmaW5lIFNETU1DX1RNT1VUX1JFU1BfTVNLCQkweEZGCisvKiBjYXJkLXR5cGUgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19DVFlQRV84QklUCQlCSVQoMTYpCisjZGVmaW5lIFNETU1DX0NUWVBFXzRCSVQJCUJJVCgwKQorI2RlZmluZSBTRE1NQ19DVFlQRV8xQklUCQkwCisvKiBJbnRlcnJ1cHQgc3RhdHVzICYgbWFzayByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIFNETU1DX0lOVF9TRElPCQkJQklUKDE2KQorI2RlZmluZSBTRE1NQ19JTlRfRUJFCQkJQklUKDE1KQorI2RlZmluZSBTRE1NQ19JTlRfQUNECQkJQklUKDE0KQorI2RlZmluZSBTRE1NQ19JTlRfU0JFCQkJQklUKDEzKQorI2RlZmluZSBTRE1NQ19JTlRfSExFCQkJQklUKDEyKQorI2RlZmluZSBTRE1NQ19JTlRfRlJVTgkJCUJJVCgxMSkKKyNkZWZpbmUgU0RNTUNfSU5UX0hUTwkJCUJJVCgxMCkKKyNkZWZpbmUgU0RNTUNfSU5UX0RUTwkJCUJJVCg5KQorI2RlZmluZSBTRE1NQ19JTlRfUlRPCQkJQklUKDgpCisjZGVmaW5lIFNETU1DX0lOVF9EQ1JDCQkJQklUKDcpCisjZGVmaW5lIFNETU1DX0lOVF9SQ1JDCQkJQklUKDYpCisjZGVmaW5lIFNETU1DX0lOVF9SWERSCQkJQklUKDUpCisjZGVmaW5lIFNETU1DX0lOVF9UWERSCQkJQklUKDQpCisjZGVmaW5lIFNETU1DX0lOVF9EQVRBX09WRVIJCUJJVCgzKQorI2RlZmluZSBTRE1NQ19JTlRfQ01EX0RPTkUJCUJJVCgyKQorI2RlZmluZSBTRE1NQ19JTlRfUkVTUF9FUlIJCUJJVCgxKQorI2RlZmluZSBTRE1NQ19JTlRfQ0QJCQlCSVQoMCkKKyNkZWZpbmUgU0RNTUNfSU5UX0VSUk9SCQkJMHhiZmMyCisvKiBDb21tYW5kIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NUQVJUCQkJQklUKDMxKQorI2RlZmluZSBTRE1NQ19DTURfQ0NTX0VYUAkJQklUKDIzKQorI2RlZmluZSBTRE1NQ19DTURfQ0VBVEFfUkQJCUJJVCgyMikKKyNkZWZpbmUgU0RNTUNfQ01EX1VQRF9DTEsJCUJJVCgyMSkKKyNkZWZpbmUgU0RNTUNfQ01EX0lOSVQJCQlCSVQoMTUpCisjZGVmaW5lIFNETU1DX0NNRF9TVE9QCQkJQklUKDE0KQorI2RlZmluZSBTRE1NQ19DTURfUFJWX0RBVF9XQUlUCQlCSVQoMTMpCisjZGVmaW5lIFNETU1DX0NNRF9TRU5EX1NUT1AJCUJJVCgxMikKKyNkZWZpbmUgU0RNTUNfQ01EX1NUUk1fTU9ERQkJQklUKDExKQorI2RlZmluZSBTRE1NQ19DTURfREFUX1dSCQlCSVQoMTApCisjZGVmaW5lIFNETU1DX0NNRF9EQVRfRVhQCQlCSVQoOSkKKyNkZWZpbmUgU0RNTUNfQ01EX1JFU1BfQ1JDCQlCSVQoOCkKKyNkZWZpbmUgU0RNTUNfQ01EX1JFU1BfTE9ORwkJQklUKDcpCisjZGVmaW5lIFNETU1DX0NNRF9SRVNQX0VYUAkJQklUKDYpCisjZGVmaW5lIFNETU1DX0NNRF9JTkRYKG4pCQkoKG4pICYgMHgxRikKKy8qIFN0YXR1cyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIFNETU1DX0dFVF9GQ05UKHgpCQkoKCh4KT4+MTcpICYgMHgxRkYpCisjZGVmaW5lIFNETU1DX0ZJRk9fU1oJCQkzMgorLyogSW50ZXJuYWwgRE1BQyBpbnRlcnJ1cHQgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfQUkJCUJJVCg5KQorI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfTkkJCUJJVCg4KQorI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfQ0VTCQlCSVQoNSkKKyNkZWZpbmUgU0RNTUNfSURNQUNfSU5UX0RVCQlCSVQoNCkKKyNkZWZpbmUgU0RNTUNfSURNQUNfSU5UX0ZCRQkJQklUKDIpCisjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9SSQkJQklUKDEpCisjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9USQkJQklUKDApCisvKiBJbnRlcm5hbCBETUFDIGJ1cyBtb2RlIGJpdHMgKi8KKyNkZWZpbmUgU0RNTUNfSURNQUNfRU5BQkxFCQlCSVQoNykKKyNkZWZpbmUgU0RNTUNfSURNQUNfRkIJCQlCSVQoMSkKKyNkZWZpbmUgU0RNTUNfSURNQUNfU1dSRVNFVAkJQklUKDApCisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgbWNpX3JlYWRsKGRldiwgcmVnKQkJCVwKKwlfX3Jhd19yZWFkbChkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNkZWZpbmUgbWNpX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCBkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKworLyogMTYtYml0IEZJRk8gYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBtY2lfcmVhZHcoZGV2LCByZWcpCQkJXAorCV9fcmF3X3JlYWR3KGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorI2RlZmluZSBtY2lfd3JpdGV3KGRldiwgcmVnLCB2YWx1ZSkJCQlcCisJX19yYXdfd3JpdGV3KCh2YWx1ZSksIGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorCisvKiA2NC1iaXQgRklGTyBhY2Nlc3MgbWFjcm9zICovCisjaWZkZWYgcmVhZHEKKyNkZWZpbmUgbWNpX3JlYWRxKGRldiwgcmVnKQkJCVwKKwlfX3Jhd19yZWFkcShkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNkZWZpbmUgbWNpX3dyaXRlcShkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlcSgodmFsdWUpLCBkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNlbHNlCisvKgorICogRHVtbXkgcmVhZHEgaW1wbGVtZW50YXRpb24gZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBkZWZpbmUgaXQuCisgKgorICogV2Ugd291bGQgYXNzdW1lIHRoYXQgbm9uZSBvZiB0aGVzZSBhcmNoaXRlY3R1cmVzIHdvdWxkIGNvbmZpZ3VyZQorICogdGhlIElQIGJsb2NrIHdpdGggYSA2NGJpdCBGSUZPIHdpZHRoLCBzbyB0aGlzIGNvZGUgd2lsbCBuZXZlciBiZQorICogZXhlY3V0ZWQgb24gdGhvc2UgbWFjaGluZXMuIERlZmluaW5nIHRoZXNlIG1hY3JvcyBoZXJlIGtlZXBzIHRoZQorICogcmVzdCBvZiB0aGUgY29kZSBmcmVlIGZyb20gaWZkZWZzLgorICovCisjZGVmaW5lIG1jaV9yZWFkcShkZXYsIHJlZykJCQlcCisJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpKQorI2RlZmluZSBtY2lfd3JpdGVxKGRldiwgcmVnLCB2YWx1ZSkJCQlcCisJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpID0gdmFsdWUpCisjZW5kaWYKKworI2VuZGlmIC8qIF9EV19NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCmluZGV4IGJkZDJjYmIuLjQ0Mjg1OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTE0MSwxMCArMTQyLDQ5IEBACiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGF0YXdvcms7CiAJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCByZWd1bGF0b3IJKnZjYzsKIH07CiAKIHN0YXRpYyB2b2lkIG14Y21jaV9zZXRfY2xrX3JhdGUoc3RydWN0IG14Y21jaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgY2xrX2lvcyk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBteGNtY2lfaW5pdF9vY3Ioc3RydWN0IG14Y21jaV9ob3N0ICpob3N0KQoreworCWhvc3QtPnZjYyA9IHJlZ3VsYXRvcl9nZXQobW1jX2Rldihob3N0LT5tbWMpLCAidm1tYyIpOworCisJaWYgKElTX0VSUihob3N0LT52Y2MpKSB7CisJCWhvc3QtPnZjYyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaG9zdC0+bW1jLT5vY3JfYXZhaWwgPSBtbWNfcmVndWxhdG9yX2dldF9vY3JtYXNrKGhvc3QtPnZjYyk7CisJCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+b2NyX2F2YWlsKQorCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLAorCQkJCSJwZGF0YS0+b2NyX2F2YWlsIHdpbGwgbm90IGJlIHVzZWRcbiIpOworCX0KKworCWlmIChob3N0LT52Y2MgPT0gTlVMTCkgeworCQkvKiBmYWxsLWJhY2sgdG8gcGxhdGZvcm0gZGF0YSAqLworCQlpZiAoaG9zdC0+cGRhdGEgJiYgaG9zdC0+cGRhdGEtPm9jcl9hdmFpbCkKKwkJCWhvc3QtPm1tYy0+b2NyX2F2YWlsID0gaG9zdC0+cGRhdGEtPm9jcl9hdmFpbDsKKwkJZWxzZQorCQkJaG9zdC0+bW1jLT5vY3JfYXZhaWwgPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBteGNtY2lfc2V0X3Bvd2VyKHN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciBwb3dlcl9tb2RlLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmRkKQoreworCWlmIChob3N0LT52Y2MpIHsKKwkJaWYgKHBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX1VQKQorCQkJbW1jX3JlZ3VsYXRvcl9zZXRfb2NyKGhvc3QtPm1tYywgaG9zdC0+dmNjLCB2ZGQpOworCQllbHNlIGlmIChwb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PRkYpCisJCQltbWNfcmVndWxhdG9yX3NldF9vY3IoaG9zdC0+bW1jLCBob3N0LT52Y2MsIDApOworCX0KKworCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihtbWNfZGV2KGhvc3QtPm1tYyksIHZkZCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG14Y21jaV91c2VfZG1hKHN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCkKIHsKIAlyZXR1cm4gaG9zdC0+ZG9fZG1hOwpAQCAtNjgwLDkgKzcyMCw5IEBACiAJCWhvc3QtPmNtZGF0ICY9IH5DTURfREFUX0NPTlRfQlVTX1dJRFRIXzQ7CiAKIAlpZiAoaG9zdC0+cG93ZXJfbW9kZSAhPSBpb3MtPnBvd2VyX21vZGUpIHsKLQkJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKLQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihtbWNfZGV2KG1tYyksIGlvcy0+dmRkKTsKKwkJbXhjbWNpX3NldF9wb3dlcihob3N0LCBpb3MtPnBvd2VyX21vZGUsIGlvcy0+dmRkKTsKIAkJaG9zdC0+cG93ZXJfbW9kZSA9IGlvcy0+cG93ZXJfbW9kZTsKKwogCQlpZiAoaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikKIAkJCWhvc3QtPmNtZGF0IHw9IENNRF9EQVRfQ09OVF9JTklUOwogCX0KQEAgLTgwNywxMCArODQ3LDcgQEAKIAlob3N0LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKIAotCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+b2NyX2F2YWlsKQotCQltbWMtPm9jcl9hdmFpbCA9IGhvc3QtPnBkYXRhLT5vY3JfYXZhaWw7Ci0JZWxzZQotCQltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworCW14Y21jaV9pbml0X29jcihob3N0KTsKIAogCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+ZGF0M19jYXJkX2RldGVjdCkKIAkJaG9zdC0+ZGVmYXVsdF9pcnFfbWFzayA9CkBAIC05MTUsNiArOTUyLDkgQEAKIAogCW1tY19yZW1vdmVfaG9zdChtbWMpOwogCisJaWYgKGhvc3QtPnZjYykKKwkJcmVndWxhdG9yX3B1dChob3N0LT52Y2MpOworCiAJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5leGl0KQogCQlob3N0LT5wZGF0YS0+ZXhpdCgmcGRldi0+ZGV2LCBtbWMpOwogCkBAIC05MjcsNyArOTY3LDYgQEAKIAljbGtfcHV0KGhvc3QtPmNsayk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24oaG9zdC0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5yZXMpKTsKLQlyZWxlYXNlX3Jlc291cmNlKGhvc3QtPnJlcyk7CiAKIAltbWNfZnJlZV9ob3N0KG1tYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZG92ZS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlZWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZG92ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBzZGhjaS1kb3ZlLmMgU3VwcG9ydCBmb3IgU0RIQ0kgb24gTWFydmVsbCdzIERvdmUgU29DCisgKgorICogQXV0aG9yOiBTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4KKyAqCSAgIE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKiBCYXNlZCBvbiBzZGhjaS1jbnMzeHh4LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorCisjaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCitzdGF0aWMgdTE2IHNkaGNpX2RvdmVfcmVhZHcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJdTE2IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9IT1NUX1ZFUlNJT046CisJY2FzZSBTREhDSV9TTE9UX0lOVF9TVEFUVVM6CisJCS8qIHRob3NlIHJlZ2lzdGVycyBkb24ndCBleGlzdCAqLworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXQgPSByZWFkdyhob3N0LT5pb2FkZHIgKyByZWcpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHNkaGNpX2RvdmVfcmVhZGwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJdTMyIHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9DQVBBQklMSVRJRVM6CisJCXJldCA9IHJlYWRsKGhvc3QtPmlvYWRkciArIHJlZyk7CisJCS8qIE1hc2sgdGhlIHN1cHBvcnQgZm9yIDMuMFYgKi8KKwkJcmV0ICY9IH5TREhDSV9DQU5fVkREXzMwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZG92ZV9vcHMgPSB7CisJLnJlYWRfdwk9IHNkaGNpX2RvdmVfcmVhZHcsCisJLnJlYWRfbAk9IHNkaGNpX2RvdmVfcmVhZGwsCit9OworCitzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9kb3ZlX3BkYXRhID0geworCS5vcHMJPSAmc2RoY2lfZG92ZV9vcHMsCisJLnF1aXJrcwk9IFNESENJX1FVSVJLX05PX1NJTVVMVF9WRERfQU5EX1BPV0VSIHwKKwkJICBTREhDSV9RVUlSS19OT19CVVNZX0lSUSB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19GT1JDRV9ETUEsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1jb3JlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYwppbmRleCBjNTFiNzExLi5mYTE5ZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJc3RydWN0IHNkaGNpX29mX2RhdGEgKnNkaGNpX29mX2RhdGEgPSBtYXRjaC0+ZGF0YTsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfb2ZfaG9zdCAqb2ZfaG9zdDsKLQljb25zdCB1MzIgKmNsazsKKwljb25zdCBfX2JlMzIgKmNsazsKIAlpbnQgc2l6ZTsKIAlpbnQgcmV0OwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCWNsayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZzaXplKTsKIAlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCi0JCW9mX2hvc3QtPmNsb2NrID0gKmNsazsKKwkJb2ZfaG9zdC0+Y2xvY2sgPSBiZTMyX3RvX2NwdXAoY2xrKTsKIAogCXJldCA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwppbmRleCAzZDljMjQ2Li4wZGM5MDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKQEAgLTE3Niw2ICsxNzYsNzQgQEAKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKIH07CiAKKy8qIE8yTWljcm8gZXh0cmEgcmVnaXN0ZXJzICovCisjZGVmaW5lIE8yX1NEX0xPQ0tfV1AJCTB4RDMKKyNkZWZpbmUgTzJfU0RfTVVMVElfVkNDM1YJMHhFRQorI2RlZmluZSBPMl9TRF9DTEtSRVEJCTB4RUMKKyNkZWZpbmUgTzJfU0RfQ0FQUwkJMHhFMAorI2RlZmluZSBPMl9TRF9BRE1BMQkJMHhFMgorI2RlZmluZSBPMl9TRF9BRE1BMgkJMHhFNworI2RlZmluZSBPMl9TRF9JTkZfTU9ECQkweEYxCisKK3N0YXRpYyBpbnQgbzJfcHJvYmUoc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQoreworCWludCByZXQ7CisJdTggc2NyYXRjaDsKKworCXN3aXRjaCAoY2hpcC0+cGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgyMjA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgyMjE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgzMjA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgzMjE6CisJCS8qIFRoaXMgZXh0cmEgc2V0dXAgaXMgcmVxdWlyZWQgZHVlIHRvIGJyb2tlbiBBRE1BLiAqLworCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9MT0NLX1dQLCAmc2NyYXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlzY3JhdGNoICY9IDB4N2Y7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9MT0NLX1dQLCBzY3JhdGNoKTsKKworCQkvKiBTZXQgTXVsdGkgMyB0byBWQ0MzViMgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX01VTFRJX1ZDQzNWLCAweDA4KTsKKworCQkvKiBEaXNhYmxlIENMS19SRVEjIHN1cHBvcnQgYWZ0ZXIgbWVkaWEgREVUICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NMS1JFUSwgJnNjcmF0Y2gpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJc2NyYXRjaCB8PSAweDIwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGRldiwgTzJfU0RfQ0xLUkVRLCBzY3JhdGNoKTsKKworCQkvKiBDaG9vc2UgY2FwYWJpbGl0aWVzLCBlbmFibGUgU0RNQS4gIFdlIGhhdmUgdG8gd3JpdGUgMHgwMQorCQkgKiB0byB0aGUgY2FwYWJpbGl0aWVzIHJlZ2lzdGVyIGZpcnN0IHRvIHVubG9jayBpdC4KKwkJICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NBUFMsICZzY3JhdGNoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXNjcmF0Y2ggfD0gMHgwMTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NBUFMsIHNjcmF0Y2gpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGRldiwgTzJfU0RfQ0FQUywgMHg3Myk7CisKKwkJLyogRGlzYWJsZSBBRE1BMS8yICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9BRE1BMSwgMHgzOSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9BRE1BMiwgMHgwOCk7CisKKwkJLyogRGlzYWJsZSB0aGUgaW5maW5pdGUgdHJhbnNmZXIgbW9kZSAqLworCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9JTkZfTU9ELCAmc2NyYXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlzY3JhdGNoIHw9IDB4MDg7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9JTkZfTU9ELCBzY3JhdGNoKTsKKworCQkvKiBMb2NrIFdQICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0xPQ0tfV1AsICZzY3JhdGNoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXNjcmF0Y2ggfD0gMHg4MDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0xPQ0tfV1AsIHNjcmF0Y2gpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGptaWNyb25fcG1vcyhzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgKmNoaXAsIGludCBvbikKIHsKIAl1OCBzY3JhdGNoOwpAQCAtMjA0LDYgKzI3Miw3IEBACiBzdGF0aWMgaW50IGptaWNyb25fcHJvYmUoc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQogewogCWludCByZXQ7CisJdTE2IG1tY2RldiA9IDA7CiAKIAlpZiAoY2hpcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgewogCQljaGlwLT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfMzJCSVRfRE1BX0FERFIgfApAQCAtMjI1LDEyICsyOTQsMTcgQEAKIAkgKiAyLiBUaGUgTU1DIGludGVyZmFjZSBoYXMgYSBsb3dlciBzdWJmdW5jdGlvbiBudW1iZXIKIAkgKiAgICB0aGFuIHRoZSBTRCBpbnRlcmZhY2UuCiAJICovCi0JaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NEKSB7CisJaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NEKQorCQltbWNkZXYgPSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQzsKKwllbHNlIGlmIChjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9TRCkKKwkJbW1jZGV2ID0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0Q7CisKKwlpZiAobW1jZGV2KSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpzZF9kZXY7CiAKIAkJc2RfZGV2ID0gTlVMTDsKIAkJd2hpbGUgKChzZF9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0pNSUNST04sCi0JCQlQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQywgc2RfZGV2KSkgIT0gTlVMTCkgeworCQkJCQkJbW1jZGV2LCBzZF9kZXYpKSAhPSBOVUxMKSB7CiAJCQlpZiAoKFBDSV9TTE9UKGNoaXAtPnBkZXYtPmRldmZuKSA9PQogCQkJCVBDSV9TTE9UKHNkX2Rldi0+ZGV2Zm4pKSAmJgogCQkJCShjaGlwLT5wZGV2LT5idXMgPT0gc2RfZGV2LT5idXMpKQpAQCAtMjkwLDEzICszNjQsMjUgQEAKIAkJCXNsb3QtPmhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fQURNQTsKIAl9CiAKKwkvKiBKTTM4OCBNTUMgZG9lc24ndCBzdXBwb3J0IDEuOFYgd2hpbGUgU0Qgc3VwcG9ydHMgaXQgKi8KKwlpZiAoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKSB7CisJCXNsb3QtPmhvc3QtPm9jcl9hdmFpbF9zZCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0IHwKKwkJCU1NQ19WRERfMjlfMzAgfCBNTUNfVkREXzMwXzMxIHwKKwkJCU1NQ19WRERfMTY1XzE5NTsgLyogYWxsb3cgMS44ViAqLworCQlzbG90LT5ob3N0LT5vY3JfYXZhaWxfbW1jID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQgfAorCQkJTU1DX1ZERF8yOV8zMCB8IE1NQ19WRERfMzBfMzE7IC8qIG5vIDEuOFYgZm9yIE1NQyAqLworCX0KKwogCS8qCiAJICogVGhlIHNlY29uZGFyeSBpbnRlcmZhY2UgcmVxdWlyZXMgYSBiaXQgc2V0IHRvIGdldCB0aGUKIAkgKiBpbnRlcnJ1cHRzLgogCSAqLwotCWlmIChzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMpCisJaWYgKHNsb3QtPmNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyB8fAorCSAgICBzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QpCiAJCWptaWNyb25fZW5hYmxlX21tYyhzbG90LT5ob3N0LCAxKTsKIAorCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0JVU19XSURUSF9URVNUOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNSw3ICszOTEsOCBAQAogCWlmIChkZWFkKQogCQlyZXR1cm47CiAKLQlpZiAoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfTU1DKQorCWlmIChzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMgfHwKKwkgICAgc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKQogCQlqbWljcm9uX2VuYWJsZV9tbWMoc2xvdC0+aG9zdCwgMCk7CiB9CiAKQEAgLTMxMyw3ICs0MDAsOCBAQAogewogCWludCBpOwogCi0JaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQykgeworCWlmIChjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMgfHwKKwkgICAgY2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKSB7CiAJCWZvciAoaSA9IDA7aSA8IGNoaXAtPm51bV9zbG90cztpKyspCiAJCQlqbWljcm9uX2VuYWJsZV9tbWMoY2hpcC0+c2xvdHNbaV0tPmhvc3QsIDApOwogCX0KQEAgLTMyNSw3ICs0MTMsOCBAQAogewogCWludCByZXQsIGk7CiAKLQlpZiAoY2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfTU1DKSB7CisJaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyB8fAorCSAgICBjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QpIHsKIAkJZm9yIChpID0gMDtpIDwgY2hpcC0+bnVtX3Nsb3RzO2krKykKIAkJCWptaWNyb25fZW5hYmxlX21tYyhjaGlwLT5zbG90c1tpXS0+aG9zdCwgMSk7CiAJfQpAQCAtMzM5LDYgKzQyOCwxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9vMiA9IHsKKwkucHJvYmUJCT0gbzJfcHJvYmUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9qbWljcm9uID0gewogCS5wcm9iZQkJPSBqbWljcm9uX3Byb2JlLAogCkBAIC01MTAsNiArNjAzLDIyIEBACiAJfSwKIAogCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0pNSUNST04sCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9TRCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2ptaWNyb24sCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0pNSUNST04sCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9qbWljcm9uLAorCX0sCisKKwl7CiAJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULAogCQkuZGV2aWNlCQk9IDB4ODAwMCwKIAkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCkBAIC01ODksNiArNjk4LDQ2IEBACiAJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfaW50ZWxfbWZkX2VtbWNfc2RpbywKIAl9LAogCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTzIsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9PMl84MTIwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfbzIsCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX08yLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTzJfODIyMCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX28yLAorCX0sCisKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9PMiwKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX08yXzgyMjEsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9vMiwKKwl9LAorCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTzIsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9PMl84MzIwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfbzIsCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX08yLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTzJfODMyMSwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX28yLAorCX0sCisKIAl7CS8qIEdlbmVyaWMgU0QgaG9zdCBjb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0VfQ0xBU1MoKFBDSV9DTEFTU19TWVNURU1fU0RIQ0kgPDwgOCksIDB4RkZGRjAwKQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggMDUwMmY4OS4uZGJhYjA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtMTcwLDYgKzE3MCwxMiBAQAogI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfRVNESENfSU1YCiAJeyAic2RoY2ktZXNkaGMtaW14IiwgKGtlcm5lbF91bG9uZ190KSZzZGhjaV9lc2RoY19pbXhfcGRhdGEgfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfRE9WRQorCXsgInNkaGNpLWRvdmUiLCAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2RvdmVfcGRhdGEgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfVEVHUkEKKwl7ICJzZGhjaS10ZWdyYSIsIChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfdGVncmFfcGRhdGEgfSwKKyNlbmRpZgogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzZGhjaV9wbHRmbV9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oCmluZGV4IGMxYmZlNDguLmVhMmU0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmgKQEAgLTIyLDUgKzIyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2NuczN4eHhfcGRhdGE7CiBleHRlcm4gc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfZXNkaGNfaW14X3BkYXRhOworZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2RvdmVfcGRhdGE7CitleHRlcm4gc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfdGVncmFfcGRhdGE7CiAKICNlbmRpZiAvKiBfRFJJVkVSU19NTUNfU0RIQ0lfUExURk1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKaW5kZXggYWFjYjg2Mi4uMTcyMDM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCkBAIC0xMzAsNiArMTMwLDE1IEBACiAJaWYgKCFjbGtzcmMpCiAJCXJldHVybiBVSU5UX01BWDsKIAorCS8qCisJICogQ2xvY2sgZGl2aWRlcidzIHN0ZXAgaXMgZGlmZmVyZW50IGFzIDEgZnJvbSB0aGF0IG9mIGhvc3QgY29udHJvbGxlcgorCSAqIHdoZW4gJ2Nsa190eXBlJyBpcyBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTC4KKwkgKi8KKwlpZiAob3VyaG9zdC0+cGRhdGEtPmNsa190eXBlKSB7CisJCXJhdGUgPSBjbGtfcm91bmRfcmF0ZShjbGtzcmMsIHdhbnRlZCk7CisJCXJldHVybiB3YW50ZWQgLSByYXRlOworCX0KKwogCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrc3JjKTsKIAogCWZvciAoZGl2ID0gMTsgZGl2IDwgMjU2OyBkaXYgKj0gMikgewpAQCAtMjMyLDYgKzI0MSw0MiBAQAogCXJldHVybiBtaW47CiB9CiAKKy8qIHNkaGNpX2NtdV9nZXRfbWF4X2NsayAtIGNhbGxiYWNrIHRvIGdldCBtYXhpbXVtIGNsb2NrIGZyZXF1ZW5jeS4qLworc3RhdGljIHVuc2lnbmVkIGludCBzZGhjaV9jbXVfZ2V0X21heF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2RoY2lfczNjICpvdXJob3N0ID0gdG9fczNjKGhvc3QpOworCisJcmV0dXJuIGNsa19yb3VuZF9yYXRlKG91cmhvc3QtPmNsa19idXNbb3VyaG9zdC0+Y3VyX2Nsa10sIFVJTlRfTUFYKTsKK30KKworLyogc2RoY2lfY211X2dldF9taW5fY2xvY2sgLSBjYWxsYmFjayB0byBnZXQgbWluaW1hbCBzdXBwb3J0ZWQgY2xvY2sgdmFsdWUuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNkaGNpX2NtdV9nZXRfbWluX2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzZGhjaV9zM2MgKm91cmhvc3QgPSB0b19zM2MoaG9zdCk7CisKKwkvKgorCSAqIGluaXRpYWwgY2xvY2sgY2FuIGJlIGluIHRoZSBmcmVxdWVuY3kgcmFuZ2Ugb2YKKwkgKiAxMDBLSHotNDAwS0h6LCBzbyB3ZSBzZXQgaXQgYXMgbWF4IHZhbHVlLgorCSAqLworCXJldHVybiBjbGtfcm91bmRfcmF0ZShvdXJob3N0LT5jbGtfYnVzW291cmhvc3QtPmN1cl9jbGtdLCA0MDAwMDApOworfQorCisvKiBzZGhjaV9jbXVfc2V0X2Nsb2NrIC0gY2FsbGJhY2sgb24gY2xvY2sgY2hhbmdlLiovCitzdGF0aWMgdm9pZCBzZGhjaV9jbXVfc2V0X2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgY2xvY2spCit7CisJc3RydWN0IHNkaGNpX3MzYyAqb3VyaG9zdCA9IHRvX3MzYyhob3N0KTsKKworCS8qIGRvbid0IGJvdGhlciBpZiB0aGUgY2xvY2sgaXMgZ29pbmcgb2ZmICovCisJaWYgKGNsb2NrID09IDApCisJCXJldHVybjsKKworCXNkaGNpX3MzY19zZXRfY2xvY2soaG9zdCwgY2xvY2spOworCisJY2xrX3NldF9yYXRlKG91cmhvc3QtPmNsa19idXNbb3VyaG9zdC0+Y3VyX2Nsa10sIGNsb2NrKTsKKworCWhvc3QtPmNsb2NrID0gY2xvY2s7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX3MzY19vcHMgPSB7CiAJLmdldF9tYXhfY2xvY2sJCT0gc2RoY2lfczNjX2dldF9tYXhfY2xrLAogCS5zZXRfY2xvY2sJCT0gc2RoY2lfczNjX3NldF9jbG9jaywKQEAgLTM2MSw2ICs0MDYsMTMgQEAKIAogCQljbGtzKys7CiAJCXNjLT5jbGtfYnVzW3B0cl0gPSBjbGs7CisKKwkJLyoKKwkJICogc2F2ZSBjdXJyZW50IGNsb2NrIGluZGV4IHRvIGtub3cgd2hpY2ggY2xvY2sgYnVzCisJCSAqIGlzIHVzZWQgbGF0ZXIgaW4gb3ZlcnJpZGluZyBmdW5jdGlvbnMuCisJCSAqLworCQlzYy0+Y3VyX2NsayA9IHB0cjsKKwogCQljbGtfZW5hYmxlKGNsayk7CiAKIAkJZGV2X2luZm8oZGV2LCAiY2xvY2sgc291cmNlICVkOiAlcyAoJWxkIEh6KVxuIiwKQEAgLTQyNyw2ICs0NzksMjAgQEAKIAkvKiBIU01NQyBvbiBTYW1zdW5nIFNvQ3MgdXNlcyBTRENMSyBhcyB0aW1lb3V0IGNsb2NrICovCiAJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLOwogCisJLyoKKwkgKiBJZiBjb250cm9sbGVyIGRvZXMgbm90IGhhdmUgaW50ZXJuYWwgY2xvY2sgZGl2aWRlciwKKwkgKiB3ZSBjYW4gdXNlIG92ZXJyaWRpbmcgZnVuY3Rpb25zIGluc3RlYWQgb2YgZGVmYXVsdC4KKwkgKi8KKwlpZiAocGRhdGEtPmNsa190eXBlKSB7CisJCXNkaGNpX3MzY19vcHMuc2V0X2Nsb2NrID0gc2RoY2lfY211X3NldF9jbG9jazsKKwkJc2RoY2lfczNjX29wcy5nZXRfbWluX2Nsb2NrID0gc2RoY2lfY211X2dldF9taW5fY2xvY2s7CisJCXNkaGNpX3MzY19vcHMuZ2V0X21heF9jbG9jayA9IHNkaGNpX2NtdV9nZXRfbWF4X2Nsb2NrOworCX0KKworCS8qIEl0IHN1cHBvcnRzIGFkZGl0aW9uYWwgaG9zdCBjYXBhYmlsaXRpZXMgaWYgbmVlZGVkICovCisJaWYgKHBkYXRhLT5ob3N0X2NhcHMpCisJCWhvc3QtPm1tYy0+Y2FwcyB8PSBwZGF0YS0+aG9zdF9jYXBzOworCiAJcmV0ID0gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgInNkaGNpX2FkZF9ob3N0KCkgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODIzZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorCisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9zZGhjaS5oPgorCisjaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCitzdGF0aWMgdTMyIHRlZ3JhX3NkaGNpX3JlYWRsKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXUzMiB2YWw7CisKKwlpZiAodW5saWtlbHkocmVnID09IFNESENJX1BSRVNFTlRfU1RBVEUpKSB7CisJCS8qIFVzZSB3cF9ncGlvIGhlcmUgaW5zdGVhZD8gKi8KKwkJdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKKwkJcmV0dXJuIHZhbCB8IFNESENJX1dSSVRFX1BST1RFQ1Q7CisJfQorCisJcmV0dXJuIHJlYWRsKGhvc3QtPmlvYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgdGVncmFfc2RoY2lfcmVhZHcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9IT1NUX1ZFUlNJT04pKSB7CisJCS8qIEVycmF0dW06IFZlcnNpb24gcmVnaXN0ZXIgaXMgaW52YWxpZCBpbiBIVy4gKi8KKwkJcmV0dXJuIFNESENJX1NQRUNfMjAwOworCX0KKworCXJldHVybiByZWFkdyhob3N0LT5pb2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zZGhjaV93cml0ZWwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiB2YWwsIGludCByZWcpCit7CisJLyogU2VlbXMgbGlrZSB3ZSdyZSBnZXR0aW5nIHNwdXJpb3VzIHRpbWVvdXQgYW5kIGNyYyBlcnJvcnMsIHNvCisJICogZGlzYWJsZSBzaWduYWxsaW5nIG9mIHRoZW0uIEluIGNhc2Ugb2YgcmVhbCBlcnJvcnMgc29mdHdhcmUKKwkgKiB0aW1lcnMgc2hvdWxkIHRha2UgY2FyZSBvZiBldmVudHVhbGx5IGRldGVjdGluZyB0aGVtLgorCSAqLworCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfU0lHTkFMX0VOQUJMRSkpCisJCXZhbCAmPSB+KFNESENJX0lOVF9USU1FT1VUfFNESENJX0lOVF9DUkMpOworCisJd3JpdGVsKHZhbCwgaG9zdC0+aW9hZGRyICsgcmVnKTsKKworCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfSU5UX0VOQUJMRSkpIHsKKwkJLyogRXJyYXR1bTogTXVzdCBlbmFibGUgYmxvY2sgZ2FwIGludGVycnVwdCBkZXRlY3Rpb24gKi8KKwkJdTggZ2FwX2N0cmwgPSByZWFkYihob3N0LT5pb2FkZHIgKyBTREhDSV9CTE9DS19HQVBfQ09OVFJPTCk7CisJCWlmICh2YWwgJiBTREhDSV9JTlRfQ0FSRF9JTlQpCisJCQlnYXBfY3RybCB8PSAweDg7CisJCWVsc2UKKwkJCWdhcF9jdHJsICY9IH4weDg7CisJCXdyaXRlYihnYXBfY3RybCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfQkxPQ0tfR0FQX0NPTlRST0wpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV9zZGhjaV9nZXRfcm8oc3RydWN0IHNkaGNpX2hvc3QgKnNkaGNpKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2RldihzZGhjaS0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisKKwlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWdwaW9faXNfdmFsaWQocGxhdC0+d3BfZ3BpbykpCisJCXJldHVybiAtMTsKKworCXJldHVybiBncGlvX2dldF92YWx1ZShwbGF0LT53cF9ncGlvKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNhcmRkZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKnNkaG9zdCA9IChzdHJ1Y3Qgc2RoY2lfaG9zdCAqKWRhdGE7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZzZGhvc3QtPmNhcmRfdGFza2xldCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfTsKKworc3RhdGljIGludCB0ZWdyYV9zZGhjaV84Yml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgYnVzX3dpZHRoKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2Rldihob3N0LT5tbWMpKTsKKwlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwl1MzIgY3RybDsKKworCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWN0cmwgPSBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpOworCWlmIChwbGF0LT5pc184Yml0ICYmIGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKKwkJY3RybCAmPSB+U0RIQ0lfQ1RSTF80QklUQlVTOworCQljdHJsIHw9IFNESENJX0NUUkxfOEJJVEJVUzsKKwl9IGVsc2UgeworCQljdHJsICY9IH5TREhDSV9DVFJMXzhCSVRCVVM7CisJCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80KQorCQkJY3RybCB8PSBTREhDSV9DVFJMXzRCSVRCVVM7CisJCWVsc2UKKwkJCWN0cmwgJj0gflNESENJX0NUUkxfNEJJVEJVUzsKKwl9CisJc2RoY2lfd3JpdGViKGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0ZWdyYV9zZGhjaV9wbHRmbV9pbml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJCSAgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisJc3RydWN0IGNsayAqY2xrOworCWludCByYzsKKworCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGxhdCA9PSBOVUxMKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgeworCQlyYyA9IGdwaW9fcmVxdWVzdChwbGF0LT5wb3dlcl9ncGlvLCAic2RoY2lfcG93ZXIiKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIHBvd2VyIGdwaW9cbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdGVncmFfZ3Bpb19lbmFibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwbGF0LT5wb3dlcl9ncGlvLCAxKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5jZF9ncGlvKSkgeworCQlyYyA9IGdwaW9fcmVxdWVzdChwbGF0LT5jZF9ncGlvLCAic2RoY2lfY2QiKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIGNkIGdwaW9cbiIpOworCQkJZ290byBvdXRfcG93ZXI7CisJCX0KKwkJdGVncmFfZ3Bpb19lbmFibGUocGxhdC0+Y2RfZ3Bpbyk7CisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KHBsYXQtPmNkX2dwaW8pOworCisJCXJjID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEocGxhdC0+Y2RfZ3BpbyksIGNhcmRkZXRlY3RfaXJxLAorCQkJCSBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBob3N0KTsKKworCQlpZiAocmMpCXsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOworCQkJZ290byBvdXRfY2Q7CisJCX0KKworCX0KKworCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPndwX2dwaW8pKSB7CisJCXJjID0gZ3Bpb19yZXF1ZXN0KHBsYXQtPndwX2dwaW8sICJzZGhjaV93cCIpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAorCQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgd3AgZ3Bpb1xuIik7CisJCQlnb3RvIG91dF9jZDsKKwkJfQorCQl0ZWdyYV9ncGlvX2VuYWJsZShwbGF0LT53cF9ncGlvKTsKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocGxhdC0+d3BfZ3Bpbyk7CisJfQorCisJY2xrID0gY2xrX2dldChtbWNfZGV2KGhvc3QtPm1tYyksIE5VTEwpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImNsayBlcnJcbiIpOworCQlyYyA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBvdXRfd3A7CisJfQorCWNsa19lbmFibGUoY2xrKTsKKwlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CisKKwlpZiAocGxhdC0+aXNfOGJpdCkKKwkJaG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQTsKKworCXJldHVybiAwOworCitvdXRfd3A6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+d3BfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPndwX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+d3BfZ3Bpbyk7CisJfQorCitvdXRfY2Q6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+Y2RfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPmNkX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+Y2RfZ3Bpbyk7CisJfQorCitvdXRfcG93ZXI6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+cG93ZXJfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPnBvd2VyX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zZGhjaV9wbHRmbV9leGl0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisKKwlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT53cF9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+d3BfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT53cF9ncGlvKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5jZF9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+Y2RfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT5jZF9ncGlvKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT5wb3dlcl9ncGlvKTsKKwl9CisKKwljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOworCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKK30KKworc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgdGVncmFfc2RoY2lfb3BzID0geworCS5nZXRfcm8gICAgID0gdGVncmFfc2RoY2lfZ2V0X3JvLAorCS5yZWFkX2wgICAgID0gdGVncmFfc2RoY2lfcmVhZGwsCisJLnJlYWRfdyAgICAgPSB0ZWdyYV9zZGhjaV9yZWFkdywKKwkud3JpdGVfbCAgICA9IHRlZ3JhX3NkaGNpX3dyaXRlbCwKKwkucGxhdGZvcm1fOGJpdF93aWR0aCA9IHRlZ3JhX3NkaGNpXzhiaXQsCit9OworCitzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV90ZWdyYV9wZGF0YSA9IHsKKwkucXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUgfAorCQkgIFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDLAorCS5vcHMgID0gJnRlZ3JhX3NkaGNpX29wcywKKwkuaW5pdCA9IHRlZ3JhX3NkaGNpX3BsdGZtX2luaXQsCisJLmV4aXQgPSB0ZWdyYV9zZGhjaV9wbHRmbV9leGl0LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwppbmRleCBhMjVkYjQyLi45ZTE1ZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9tbWMvbW1jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAogI2luY2x1ZGUgInNkaGNpLmgiCkBAIC03Nyw4ICs3OCwxMSBAQAogCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEFDMTIgZXJyOiAweCUwOHggfCBTbG90IGludDogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9BQ01EMTJfRVJSKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfU0xPVF9JTlRfU1RBVFVTKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IENhcHNfMTogICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFUyksCisJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFU18xKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ21kOiAgICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCisJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NPTU1BTkQpLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9NQVhfQ1VSUkVOVCkpOwogCiAJaWYgKGhvc3QtPmZsYWdzICYgU0RIQ0lfVVNFX0FETUEpCkBAIC0xNTE4LDcgKzE1MjIsMTEgQEAKIAogCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX0RBVEFfVElNRU9VVCkKIAkJaG9zdC0+ZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOwotCWVsc2UgaWYgKGludG1hc2sgJiAoU0RIQ0lfSU5UX0RBVEFfQ1JDIHwgU0RIQ0lfSU5UX0RBVEFfRU5EX0JJVCkpCisJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX0VORF9CSVQpCisJCWhvc3QtPmRhdGEtPmVycm9yID0gLUVJTFNFUTsKKwllbHNlIGlmICgoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX0NSQykgJiYKKwkJU0RIQ0lfR0VUX0NNRChzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9DT01NQU5EKSkKKwkJCSE9IE1NQ19CVVNfVEVTVF9SKQogCQlob3N0LT5kYXRhLT5lcnJvciA9IC1FSUxTRVE7CiAJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9BRE1BX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFETUEgZXJyb3JcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKQEAgLTE3MzYsNyArMTc0NCw3IEBACiBpbnQgc2RoY2lfYWRkX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG1tY19ob3N0ICptbWM7Ci0JdW5zaWduZWQgaW50IGNhcHM7CisJdW5zaWduZWQgaW50IGNhcHMsIG9jcl9hdmFpbDsKIAlpbnQgcmV0OwogCiAJV0FSTl9PTihob3N0ID09IE5VTEwpOwpAQCAtMTg5MCwxMyArMTg5OCwyNiBAQAogCSAgICBtbWNfY2FyZF9pc19yZW1vdmFibGUobW1jKSkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfTkVFRFNfUE9MTDsKIAotCW1tYy0+b2NyX2F2YWlsID0gMDsKKwlvY3JfYXZhaWwgPSAwOwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8zMzApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNDsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8zMDApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMjlfMzB8TU1DX1ZERF8zMF8zMTsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMjlfMzAgfCBNTUNfVkREXzMwXzMxOwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8xODApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMTY1XzE5NTsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMTY1XzE5NTsKKworCW1tYy0+b2NyX2F2YWlsID0gb2NyX2F2YWlsOworCW1tYy0+b2NyX2F2YWlsX3NkaW8gPSBvY3JfYXZhaWw7CisJaWYgKGhvc3QtPm9jcl9hdmFpbF9zZGlvKQorCQltbWMtPm9jcl9hdmFpbF9zZGlvICY9IGhvc3QtPm9jcl9hdmFpbF9zZGlvOworCW1tYy0+b2NyX2F2YWlsX3NkID0gb2NyX2F2YWlsOworCWlmIChob3N0LT5vY3JfYXZhaWxfc2QpCisJCW1tYy0+b2NyX2F2YWlsX3NkICY9IGhvc3QtPm9jcl9hdmFpbF9zZDsKKwllbHNlIC8qIG5vcm1hbCBTRCBjb250cm9sbGVycyBkb24ndCBzdXBwb3J0IDEuOFYgKi8KKwkJbW1jLT5vY3JfYXZhaWxfc2QgJj0gfk1NQ19WRERfMTY1XzE5NTsKKwltbWMtPm9jcl9hdmFpbF9tbWMgPSBvY3JfYXZhaWw7CisJaWYgKGhvc3QtPm9jcl9hdmFpbF9tbWMpCisJCW1tYy0+b2NyX2F2YWlsX21tYyAmPSBob3N0LT5vY3JfYXZhaWxfbW1jOwogCiAJaWYgKG1tYy0+b2NyX2F2YWlsID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKQEAgLTE5MjgsMTAgKzE5NDksMTQgQEAKIAkgKiBvZiBieXRlcy4gV2hlbiBkb2luZyBoYXJkd2FyZSBzY2F0dGVyL2dhdGhlciwgZWFjaCBlbnRyeSBjYW5ub3QKIAkgKiBiZSBsYXJnZXIgdGhhbiA2NCBLaUIgdGhvdWdoLgogCSAqLwotCWlmIChob3N0LT5mbGFncyAmIFNESENJX1VTRV9BRE1BKQotCQltbWMtPm1heF9zZWdfc2l6ZSA9IDY1NTM2OwotCWVsc2UKKwlpZiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfQURNQSkgeworCQlpZiAoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDKQorCQkJbW1jLT5tYXhfc2VnX3NpemUgPSA2NTUzNTsKKwkJZWxzZQorCQkJbW1jLT5tYXhfc2VnX3NpemUgPSA2NTUzNjsKKwl9IGVsc2UgewogCQltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOworCX0KIAogCS8qCiAJICogTWF4aW11bSBibG9jayBzaXplLiBUaGlzIHZhcmllcyBmcm9tIGNvbnRyb2xsZXIgdG8gY29udHJvbGxlciBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAppbmRleCBlNDJkN2YwLi42ZTA5NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCkBAIC01Miw2ICs1Miw3IEBACiAjZGVmaW5lICBTREhDSV9DTURfUkVTUF9TSE9SVF9CVVNZIDB4MDMKIAogI2RlZmluZSBTREhDSV9NQUtFX0NNRChjLCBmKSAoKChjICYgMHhmZikgPDwgOCkgfCAoZiAmIDB4ZmYpKQorI2RlZmluZSBTREhDSV9HRVRfQ01EKGMpICgoYz4+OCkgJiAweDNmKQogCiAjZGVmaW5lIFNESENJX1JFU1BPTlNFCQkweDEwCiAKQEAgLTE2NSw3ICsxNjYsNyBAQAogI2RlZmluZSAgU0RIQ0lfQ0FOX1ZERF8xODAJMHgwNDAwMDAwMAogI2RlZmluZSAgU0RIQ0lfQ0FOXzY0QklUCTB4MTAwMDAwMDAKIAotLyogNDQtNDcgcmVzZXJ2ZWQgZm9yIG1vcmUgY2FwcyAqLworI2RlZmluZSBTREhDSV9DQVBBQklMSVRJRVNfMQkweDQ0CiAKICNkZWZpbmUgU0RIQ0lfTUFYX0NVUlJFTlQJMHg0OAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3Nkcmljb2hfY3MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCmluZGV4IGY0NzJjMjcuLmJiYzI5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIAltbWMtPm1heF9zZWdfc2l6ZSA9IDEwMjQgKiA1MTI7CiAJbW1jLT5tYXhfYmxrX3NpemUgPSA1MTI7CiAKLQkvKiByZXNldCB0aGUgY29udHJvbGVyICovCisJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KIAlpZiAoc2RyaWNvaF9yZXNldChob3N0KSkgewogCQlkZXZfZGJnKGRldiwgImNvdWxkIG5vdCByZXNldFxuIik7CiAJCXJlc3VsdCA9IC1FSU87CkBAIC00NzgsNyArNDc4LDcgQEAKIAlkZXZfaW5mbygmcGNtY2lhX2Rldi0+ZGV2LCAiU2VhcmNoaW5nIE1NQyBjb250cm9sbGVyIGZvciBwY21jaWEgZGV2aWNlIgogCQkiICVzICVzIC4uLlxuIiwgcGNtY2lhX2Rldi0+cHJvZF9pZFswXSwgcGNtY2lhX2Rldi0+cHJvZF9pZFsxXSk7CiAKLQkvKiBzZWFyY2ggcGNpIGNhcmRidXMgYnJpZGdlIHRoYXQgY29udGFpbnMgdGhlIG1tYyBjb250cm9sZXIgKi8KKwkvKiBzZWFyY2ggcGNpIGNhcmRidXMgYnJpZGdlIHRoYXQgY29udGFpbnMgdGhlIG1tYyBjb250cm9sbGVyICovCiAJLyogdGhlIGlvIHJlZ2lvbiBpcyBhbHJlYWR5IGNsYWltZWQgYnkgeWVudGFfc29ja2V0Li4uICovCiAJd2hpbGUgKChwY2lfZGV2ID0KIAkJcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9SSUNPSCwgUENJX0RFVklDRV9JRF9SSUNPSF9STDVDNDc2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5jCmluZGV4IGU3NzY1YTguLmUzYzZlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMKQEAgLTI1LDE2ICsyNSwyNjEgQEAKICAqICAgZG91YmxlIGJ1ZmZlciBzdXBwb3J0CiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAotI2luY2x1ZGUgInRtaW9fbW1jLmgiCisjZGVmaW5lIENUTF9TRF9DTUQgMHgwMAorI2RlZmluZSBDVExfQVJHX1JFRyAweDA0CisjZGVmaW5lIENUTF9TVE9QX0lOVEVSTkFMX0FDVElPTiAweDA4CisjZGVmaW5lIENUTF9YRkVSX0JMS19DT1VOVCAweGEKKyNkZWZpbmUgQ1RMX1JFU1BPTlNFIDB4MGMKKyNkZWZpbmUgQ1RMX1NUQVRVUyAweDFjCisjZGVmaW5lIENUTF9JUlFfTUFTSyAweDIwCisjZGVmaW5lIENUTF9TRF9DQVJEX0NMS19DVEwgMHgyNAorI2RlZmluZSBDVExfU0RfWEZFUl9MRU4gMHgyNgorI2RlZmluZSBDVExfU0RfTUVNX0NBUkRfT1BUIDB4MjgKKyNkZWZpbmUgQ1RMX1NEX0VSUk9SX0RFVEFJTF9TVEFUVVMgMHgyYworI2RlZmluZSBDVExfU0RfREFUQV9QT1JUIDB4MzAKKyNkZWZpbmUgQ1RMX1RSQU5TQUNUSU9OX0NUTCAweDM0CisjZGVmaW5lIENUTF9TRElPX1NUQVRVUyAweDM2CisjZGVmaW5lIENUTF9TRElPX0lSUV9NQVNLIDB4MzgKKyNkZWZpbmUgQ1RMX1JFU0VUX1NEIDB4ZTAKKyNkZWZpbmUgQ1RMX1NESU9fUkVHUyAweDEwMAorI2RlZmluZSBDVExfQ0xLX0FORF9XQUlUX0NUTCAweDEzOAorI2RlZmluZSBDVExfUkVTRVRfU0RJTyAweDFlMAorCisvKiBEZWZpbml0aW9ucyBmb3IgdmFsdWVzIHRoZSBDVFJMX1NUQVRVUyByZWdpc3RlciBjYW4gdGFrZS4gKi8KKyNkZWZpbmUgVE1JT19TVEFUX0NNRFJFU1BFTkQgICAgMHgwMDAwMDAwMQorI2RlZmluZSBUTUlPX1NUQVRfREFUQUVORCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFRNSU9fU1RBVF9DQVJEX1JFTU9WRSAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVE1JT19TVEFUX0NBUkRfSU5TRVJUICAgMHgwMDAwMDAxMAorI2RlZmluZSBUTUlPX1NUQVRfU0lHU1RBVEUgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRNSU9fU1RBVF9XUlBST1RFQ1QgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgVE1JT19TVEFUX0NBUkRfUkVNT1ZFX0EgMHgwMDAwMDEwMAorI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9JTlNFUlRfQSAweDAwMDAwMjAwCisjZGVmaW5lIFRNSU9fU1RBVF9TSUdTVEFURV9BICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgVE1JT19TVEFUX0NNRF9JRFhfRVJSICAgMHgwMDAxMDAwMAorI2RlZmluZSBUTUlPX1NUQVRfQ1JDRkFJTCAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9TVE9QQklUX0VSUiAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX0RBVEFUSU1FT1VUICAgMHgwMDA4MDAwMAorI2RlZmluZSBUTUlPX1NUQVRfUlhPVkVSRkxPVyAgICAweDAwMTAwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9UWFVOREVSUlVOICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX0NNRFRJTUVPVVQgICAgMHgwMDQwMDAwMAorI2RlZmluZSBUTUlPX1NUQVRfUlhSRFkgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9UWFJRICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX0lMTF9GVU5DICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBUTUlPX1NUQVRfQ01EX0JVU1kgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9JTExfQUNDRVNTICAgIDB4ODAwMDAwMDAKKworLyogRGVmaW5pdGlvbnMgZm9yIHZhbHVlcyB0aGUgQ1RSTF9TRElPX1NUQVRVUyByZWdpc3RlciBjYW4gdGFrZS4gKi8KKyNkZWZpbmUgVE1JT19TRElPX1NUQVRfSU9JUlEJMHgwMDAxCisjZGVmaW5lIFRNSU9fU0RJT19TVEFUX0VYUFVCNTIJMHg0MDAwCisjZGVmaW5lIFRNSU9fU0RJT19TVEFUX0VYV1QJMHg4MDAwCisjZGVmaW5lIFRNSU9fU0RJT19NQVNLX0FMTAkweGMwMDcKKworLyogRGVmaW5lIHNvbWUgSVJRIG1hc2tzICovCisvKiBUaGlzIGlzIHRoZSBtYXNrIHVzZWQgYXQgcmVzZXQgYnkgdGhlIGNoaXAgKi8KKyNkZWZpbmUgVE1JT19NQVNLX0FMTCAgICAgICAgICAgMHg4MzdmMDMxZAorI2RlZmluZSBUTUlPX01BU0tfUkVBRE9QICAoVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX0RBVEFFTkQpCisjZGVmaW5lIFRNSU9fTUFTS19XUklURU9QIChUTUlPX1NUQVRfVFhSUSB8IFRNSU9fU1RBVF9EQVRBRU5EKQorI2RlZmluZSBUTUlPX01BU0tfQ01EICAgICAoVE1JT19TVEFUX0NNRFJFU1BFTkQgfCBUTUlPX1NUQVRfQ01EVElNRU9VVCB8IFwKKwkJVE1JT19TVEFUX0NBUkRfUkVNT1ZFIHwgVE1JT19TVEFUX0NBUkRfSU5TRVJUKQorI2RlZmluZSBUTUlPX01BU0tfSVJRICAgICAoVE1JT19NQVNLX1JFQURPUCB8IFRNSU9fTUFTS19XUklURU9QIHwgVE1JT19NQVNLX0NNRCkKKworI2RlZmluZSBlbmFibGVfbW1jX2lycXMoaG9zdCwgaSkgXAorCWRvIHsgXAorCQl1MzIgbWFzaztcCisJCW1hc2sgID0gc2RfY3RybF9yZWFkMzIoKGhvc3QpLCBDVExfSVJRX01BU0spOyBcCisJCW1hc2sgJj0gfigoaSkgJiBUTUlPX01BU0tfSVJRKTsgXAorCQlzZF9jdHJsX3dyaXRlMzIoKGhvc3QpLCBDVExfSVJRX01BU0ssIG1hc2spOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBkaXNhYmxlX21tY19pcnFzKGhvc3QsIGkpIFwKKwlkbyB7IFwKKwkJdTMyIG1hc2s7XAorCQltYXNrICA9IHNkX2N0cmxfcmVhZDMyKChob3N0KSwgQ1RMX0lSUV9NQVNLKTsgXAorCQltYXNrIHw9ICgoaSkgJiBUTUlPX01BU0tfSVJRKTsgXAorCQlzZF9jdHJsX3dyaXRlMzIoKGhvc3QpLCBDVExfSVJRX01BU0ssIG1hc2spOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBhY2tfbW1jX2lycXMoaG9zdCwgaSkgXAorCWRvIHsgXAorCQlzZF9jdHJsX3dyaXRlMzIoKGhvc3QpLCBDVExfU1RBVFVTLCB+KGkpKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIFRoaXMgaXMgYXJiaXRyYXJ5LCBqdXN0IG5vb25lIG5lZWRlZCBhbnkgaGlnaGVyIGFsaWdubWVudCB5ZXQgKi8KKyNkZWZpbmUgTUFYX0FMSUdOIDQKKworc3RydWN0IHRtaW9fbW1jX2hvc3QgeworCXZvaWQgX19pb21lbSAqY3RsOworCXVuc2lnbmVkIGxvbmcgYnVzX3NoaWZ0OworCXN0cnVjdCBtbWNfY29tbWFuZCAgICAgICpjbWQ7CisJc3RydWN0IG1tY19yZXF1ZXN0ICAgICAgKm1ycTsKKwlzdHJ1Y3QgbW1jX2RhdGEgICAgICAgICAqZGF0YTsKKwlzdHJ1Y3QgbW1jX2hvc3QgICAgICAgICAqbW1jOworCWludCAgICAgICAgICAgICAgICAgICAgIGlycTsKKwl1bnNpZ25lZCBpbnQJCXNkaW9faXJxX2VuYWJsZWQ7CisKKwkvKiBDYWxsYmFja3MgZm9yIGNsb2NrIC8gcG93ZXIgY29udHJvbCAqLworCXZvaWQgKCpzZXRfcHdyKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpob3N0LCBpbnQgc3RhdGUpOworCXZvaWQgKCpzZXRfY2xrX2Rpdikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaG9zdCwgaW50IHN0YXRlKTsKKworCS8qIHBpbyByZWxhdGVkIHN0dWZmICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICAgICAgKnNnX3B0cjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAqc2dfb3JpZzsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBzZ19sZW47CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgc2dfb2ZmOworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCS8qIERNQSBzdXBwb3J0ICovCisJc3RydWN0IGRtYV9jaGFuCQkqY2hhbl9yeDsKKwlzdHJ1Y3QgZG1hX2NoYW4JCSpjaGFuX3R4OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkbWFfY29tcGxldGU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWRtYV9pc3N1ZTsKKyNpZmRlZiBDT05GSUdfVE1JT19NTUNfRE1BCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgZG1hX3NnbGVuOworCXU4CQkJYm91bmNlX2J1ZltQQUdFX0NBQ0hFX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoTUFYX0FMSUdOKSkpOworCXN0cnVjdCBzY2F0dGVybGlzdAlib3VuY2Vfc2c7CisjZW5kaWYKKworCS8qIFRyYWNrIGxvc3QgaW50ZXJydXB0cyAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsJZGVsYXllZF9yZXNldF93b3JrOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdW5zaWduZWQgbG9uZwkJbGFzdF9yZXFfdHM7Cit9OworCitzdGF0aWMgdm9pZCB0bWlvX2NoZWNrX2JvdW5jZV9idWZmZXIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpOworCitzdGF0aWMgdTE2IHNkX2N0cmxfcmVhZDE2KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX2N0cmxfcmVhZDE2X3JlcChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsCisJCXUxNiAqYnVmLCBpbnQgY291bnQpCit7CisJcmVhZHN3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgdTMyIHNkX2N0cmxfcmVhZDMyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSkgfAorCSAgICAgICByZWFkdyhob3N0LT5jdGwgKyAoKGFkZHIgKyAyKSA8PCBob3N0LT5idXNfc2hpZnQpKSA8PCAxNjsKK30KKworc3RhdGljIHZvaWQgc2RfY3RybF93cml0ZTE2KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQgc2RfY3RybF93cml0ZTE2X3JlcChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsCisJCXUxNiAqYnVmLCBpbnQgY291bnQpCit7CisJd3JpdGVzdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgc2RfY3RybF93cml0ZTMyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwgdTMyIHZhbCkKK3sKKwl3cml0ZXcodmFsLCBob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKTsKKwl3cml0ZXcodmFsID4+IDE2LCBob3N0LT5jdGwgKyAoKGFkZHIgKyAyKSA8PCBob3N0LT5idXNfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQgdG1pb19tbWNfaW5pdF9zZyhzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCWhvc3QtPnNnX2xlbiA9IGRhdGEtPnNnX2xlbjsKKwlob3N0LT5zZ19wdHIgPSBkYXRhLT5zZzsKKwlob3N0LT5zZ19vcmlnID0gZGF0YS0+c2c7CisJaG9zdC0+c2dfb2ZmID0gMDsKK30KKworc3RhdGljIGludCB0bWlvX21tY19uZXh0X3NnKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQoreworCWhvc3QtPnNnX3B0ciA9IHNnX25leHQoaG9zdC0+c2dfcHRyKTsKKwlob3N0LT5zZ19vZmYgPSAwOworCXJldHVybiAtLWhvc3QtPnNnX2xlbjsKK30KKworc3RhdGljIGNoYXIgKnRtaW9fbW1jX2ttYXBfYXRvbWljKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCWxvY2FsX2lycV9zYXZlKCpmbGFncyk7CisJcmV0dXJuIGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9CSU9fU1JDX0lSUSkgKyBzZy0+b2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCB0bWlvX21tY19rdW5tYXBfYXRvbWljKHZvaWQgKnZpcnQsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCWt1bm1hcF9hdG9taWModmlydCwgS01fQklPX1NSQ19JUlEpOworCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCisKKyNkZWZpbmUgU1RBVFVTX1RPX1RFWFQoYSkgXAorCWRvIHsgXAorCQlpZiAoc3RhdHVzICYgVE1JT19TVEFUXyMjYSkgXAorCQkJcHJpbnRrKCNhKTsgXAorCX0gd2hpbGUgKDApCisKK3ZvaWQgcHJfZGVidWdfc3RhdHVzKHUzMiBzdGF0dXMpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1czogJTA4eCA9ICIsIHN0YXR1cyk7CisJU1RBVFVTX1RPX1RFWFQoQ0FSRF9SRU1PVkUpOworCVNUQVRVU19UT19URVhUKENBUkRfSU5TRVJUKTsKKwlTVEFUVVNfVE9fVEVYVChTSUdTVEFURSk7CisJU1RBVFVTX1RPX1RFWFQoV1JQUk9URUNUKTsKKwlTVEFUVVNfVE9fVEVYVChDQVJEX1JFTU9WRV9BKTsKKwlTVEFUVVNfVE9fVEVYVChDQVJEX0lOU0VSVF9BKTsKKwlTVEFUVVNfVE9fVEVYVChTSUdTVEFURV9BKTsKKwlTVEFUVVNfVE9fVEVYVChDTURfSURYX0VSUik7CisJU1RBVFVTX1RPX1RFWFQoU1RPUEJJVF9FUlIpOworCVNUQVRVU19UT19URVhUKElMTF9GVU5DKTsKKwlTVEFUVVNfVE9fVEVYVChDTURfQlVTWSk7CisJU1RBVFVTX1RPX1RFWFQoQ01EUkVTUEVORCk7CisJU1RBVFVTX1RPX1RFWFQoREFUQUVORCk7CisJU1RBVFVTX1RPX1RFWFQoQ1JDRkFJTCk7CisJU1RBVFVTX1RPX1RFWFQoREFUQVRJTUVPVVQpOworCVNUQVRVU19UT19URVhUKENNRFRJTUVPVVQpOworCVNUQVRVU19UT19URVhUKFJYT1ZFUkZMT1cpOworCVNUQVRVU19UT19URVhUKFRYVU5ERVJSVU4pOworCVNUQVRVU19UT19URVhUKFJYUkRZKTsKKwlTVEFUVVNfVE9fVEVYVChUWFJRKTsKKwlTVEFUVVNfVE9fVEVYVChJTExfQUNDRVNTKTsKKwlwcmludGsoIlxuIik7Cit9CisKKyNlbHNlCisjZGVmaW5lIHByX2RlYnVnX3N0YXR1cyhzKSAgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCWhvc3QtPnNkaW9faXJxX2VuYWJsZWQgPSAxOworCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1RSQU5TQUNUSU9OX0NUTCwgMHgwMDAxKTsKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLLAorCQkJKFRNSU9fU0RJT19NQVNLX0FMTCAmIH5UTUlPX1NESU9fU1RBVF9JT0lSUSkpOworCX0gZWxzZSB7CisJCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSywgVE1JT19TRElPX01BU0tfQUxMKTsKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9UUkFOU0FDVElPTl9DVEwsIDB4MDAwMCk7CisJCWhvc3QtPnNkaW9faXJxX2VuYWJsZWQgPSAwOworCX0KK30KIAogc3RhdGljIHZvaWQgdG1pb19tbWNfc2V0X2Nsb2NrKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgbmV3X2Nsb2NrKQogewpAQCAtNTUsOCArMzAwLDIzIEBACiAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX2Nsa19zdG9wKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQogeworCXN0cnVjdCBtZmRfY2VsbCAqY2VsbCA9IGhvc3QtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0bWlvX21tY19kYXRhICpwZGF0YSA9IGNlbGwtPmRyaXZlcl9kYXRhOworCisJLyoKKwkgKiBUZXN0aW5nIG9uIHNoLW1vYmlsZSBzaG93ZWQgdGhhdCBTRElPIElSUXMgYXJlIHVubWFza2VkIHdoZW4KKwkgKiBDVExfQ0xLX0FORF9XQUlUX0NUTCBnZXRzIHdyaXR0ZW4sIHNvIHdlIGhhdmUgdG8gZGlzYWJsZSB0aGUKKwkgKiBkZXZpY2UgSVJRIGhlcmUgYW5kIHJlc3RvcmUgdGhlIFNESU8gSVJRIG1hc2sgYmVmb3JlCisJICogcmUtZW5hYmxpbmcgdGhlIGRldmljZSBJUlEuCisJICovCisJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKQorCQlkaXNhYmxlX2lycShob3N0LT5pcnEpOwogCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfQ0xLX0FORF9XQUlUX0NUTCwgMHgwMDAwKTsKIAltc2xlZXAoMTApOworCWlmIChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkgeworCQl0bWlvX21tY19lbmFibGVfc2Rpb19pcnEoaG9zdC0+bW1jLCBob3N0LT5zZGlvX2lycV9lbmFibGVkKTsKKwkJZW5hYmxlX2lycShob3N0LT5pcnEpOworCX0KIAlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NEX0NBUkRfQ0xLX0NUTCwgfjB4MDEwMCAmCiAJCXNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRF9DQVJEX0NMS19DVEwpKTsKIAltc2xlZXAoMTApOwpAQCAtNjQsMTEgKzMyNCwyMSBAQAogCiBzdGF0aWMgdm9pZCB0bWlvX21tY19jbGtfc3RhcnQoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7CisJc3RydWN0IG1mZF9jZWxsICpjZWxsID0gaG9zdC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisKIAlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NEX0NBUkRfQ0xLX0NUTCwgMHgwMTAwIHwKIAkJc2RfY3RybF9yZWFkMTYoaG9zdCwgQ1RMX1NEX0NBUkRfQ0xLX0NUTCkpOwogCW1zbGVlcCgxMCk7CisJLyogc2VlIGNvbW1lbnQgaW4gdG1pb19tbWNfY2xrX3N0b3AgYWJvdmUgKi8KKwlpZiAocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpCisJCWRpc2FibGVfaXJxKGhvc3QtPmlycSk7CiAJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9DTEtfQU5EX1dBSVRfQ1RMLCAweDAxMDApOwogCW1zbGVlcCgxMCk7CisJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKSB7CisJCXRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShob3N0LT5tbWMsIGhvc3QtPnNkaW9faXJxX2VuYWJsZWQpOworCQllbmFibGVfaXJxKGhvc3QtPmlycSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKQEAgLTgyLDE1ICszNTIsNjAgQEAKIAltc2xlZXAoMTApOwogfQogCitzdGF0aWMgdm9pZCB0bWlvX21tY19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdG1pb19tbWNfaG9zdCwKKwkJCQkJCSAgZGVsYXllZF9yZXNldF93b3JrLndvcmspOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCW1ycSA9IGhvc3QtPm1ycTsKKworCS8qIHJlcXVlc3QgYWxyZWFkeSBmaW5pc2hlZCAqLworCWlmICghbXJxCisJICAgIHx8IHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhob3N0LT5sYXN0X3JlcV90cyArCisJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWRldl93YXJuKCZob3N0LT5wZGV2LT5kZXYsCisJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlIGludGVycnVwdCAoQ01EJXUpXG4iLAorCQltcnEtPmNtZC0+b3Bjb2RlKTsKKworCWlmIChob3N0LT5kYXRhKQorCQlob3N0LT5kYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7CisJZWxzZSBpZiAoaG9zdC0+Y21kKQorCQlob3N0LT5jbWQtPmVycm9yID0gLUVUSU1FRE9VVDsKKwllbHNlCisJCW1ycS0+Y21kLT5lcnJvciA9IC1FVElNRURPVVQ7CisKKwlob3N0LT5jbWQgPSBOVUxMOworCWhvc3QtPmRhdGEgPSBOVUxMOworCWhvc3QtPm1ycSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwlyZXNldChob3N0KTsKKworCW1tY19yZXF1ZXN0X2RvbmUoaG9zdC0+bW1jLCBtcnEpOworfQorCiBzdGF0aWMgdm9pZAogdG1pb19tbWNfZmluaXNoX3JlcXVlc3Qoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEgPSBob3N0LT5tcnE7CiAKKwlpZiAoIW1ycSkKKwkJcmV0dXJuOworCiAJaG9zdC0+bXJxID0gTlVMTDsKIAlob3N0LT5jbWQgPSBOVUxMOwogCWhvc3QtPmRhdGEgPSBOVUxMOwogCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGVsYXllZF9yZXNldF93b3JrKTsKKwogCW1tY19yZXF1ZXN0X2RvbmUoaG9zdC0+bW1jLCBtcnEpOwogfQogCkBAIC0yMDAsNiArNTE1LDcgQEAKIAlyZXR1cm47CiB9CiAKKy8qIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGhvc3QtPmxvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgdG1pb19tbWNfZG9fZGF0YV9pcnEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+ZGF0YTsKQEAgLTIzMyw2ICs1NDksOCBAQAogCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKIAkJaWYgKCFob3N0LT5jaGFuX3J4KQogCQkJZGlzYWJsZV9tbWNfaXJxcyhob3N0LCBUTUlPX01BU0tfUkVBRE9QKTsKKwkJZWxzZQorCQkJdG1pb19jaGVja19ib3VuY2VfYnVmZmVyKGhvc3QpOwogCQlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsICJDb21wbGV0ZSBSeCByZXF1ZXN0ICVwXG4iLAogCQkJaG9zdC0+bXJxKTsKIAl9IGVsc2UgewpAQCAtMjU0LDEwICs1NzIsMTIgQEAKIAogc3RhdGljIHZvaWQgdG1pb19tbWNfZGF0YV9pcnEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+ZGF0YTsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CisJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKwlkYXRhID0gaG9zdC0+ZGF0YTsKIAogCWlmICghZGF0YSkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAogCWlmIChob3N0LT5jaGFuX3R4ICYmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKSkgewogCQkvKgpAQCAtMjc4LDYgKzU5OCw4IEBACiAJfSBlbHNlIHsKIAkJdG1pb19tbWNfZG9fZGF0YV9pcnEoaG9zdCk7CiAJfQorb3V0OgorCXNwaW5fdW5sb2NrKCZob3N0LT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgdG1pb19tbWNfY21kX2lycShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKQEAgLTI4Niw5ICs2MDgsMTEgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IGhvc3QtPmNtZDsKIAlpbnQgaSwgYWRkcjsKIAorCXNwaW5fbG9jaygmaG9zdC0+bG9jayk7CisKIAlpZiAoIWhvc3QtPmNtZCkgewogCQlwcl9kZWJ1ZygiU3B1cmlvdXMgQ01EIGlycVxuIik7Ci0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAJfQogCiAJaG9zdC0+Y21kID0gTlVMTDsKQEAgLTMyNCw4ICs2NDgsNyBAQAogCQkJaWYgKCFob3N0LT5jaGFuX3J4KQogCQkJCWVuYWJsZV9tbWNfaXJxcyhob3N0LCBUTUlPX01BU0tfUkVBRE9QKTsKIAkJfSBlbHNlIHsKLQkJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGhvc3QtPmNoYW5fdHg7Ci0JCQlpZiAoIWNoYW4pCisJCQlpZiAoIWhvc3QtPmNoYW5fdHgpCiAJCQkJZW5hYmxlX21tY19pcnFzKGhvc3QsIFRNSU9fTUFTS19XUklURU9QKTsKIAkJCWVsc2UKIAkJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5kbWFfaXNzdWUpOwpAQCAtMzM0LDEzICs2NTcsMTkgQEAKIAkJdG1pb19tbWNfZmluaXNoX3JlcXVlc3QoaG9zdCk7CiAJfQogCitvdXQ6CisJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdG1pb19tbWNfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQogewogCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gZGV2aWQ7CisJc3RydWN0IG1mZF9jZWxsCSpjZWxsID0gaG9zdC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgaW50IGlyZWcsIGlycV9tYXNrLCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHNkaW9faXJlZywgc2Rpb19pcnFfbWFzaywgc2Rpb19zdGF0dXM7CiAKIAlwcl9kZWJ1ZygiTU1DIElSUSBiZWdpblxuIik7CiAKQEAgLTM0OCw2ICs2NzcsMjkgQEAKIAlpcnFfbWFzayA9IHNkX2N0cmxfcmVhZDMyKGhvc3QsIENUTF9JUlFfTUFTSyk7CiAJaXJlZyA9IHN0YXR1cyAmIFRNSU9fTUFTS19JUlEgJiB+aXJxX21hc2s7CiAKKwlzZGlvX2lyZWcgPSAwOworCWlmICghaXJlZyAmJiBwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkgeworCQlzZGlvX3N0YXR1cyA9IHNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRElPX1NUQVRVUyk7CisJCXNkaW9faXJxX21hc2sgPSBzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RJT19JUlFfTUFTSyk7CisJCXNkaW9faXJlZyA9IHNkaW9fc3RhdHVzICYgVE1JT19TRElPX01BU0tfQUxMICYgfnNkaW9faXJxX21hc2s7CisKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX1NUQVRVUywgc2Rpb19zdGF0dXMgJiB+VE1JT19TRElPX01BU0tfQUxMKTsKKworCQlpZiAoc2Rpb19pcmVnICYmICFob3N0LT5zZGlvX2lycV9lbmFibGVkKSB7CisJCQlwcl93YXJuaW5nKCJ0bWlvX21tYzogU3B1cmlvdXMgU0RJTyBJUlEsIGRpc2FibGluZyEgMHglMDR4IDB4JTA0eCAweCUwNHhcbiIsCisJCQkJICAgc2Rpb19zdGF0dXMsIHNkaW9faXJxX21hc2ssIHNkaW9faXJlZyk7CisJCQl0bWlvX21tY19lbmFibGVfc2Rpb19pcnEoaG9zdC0+bW1jLCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGhvc3QtPm1tYy0+Y2FwcyAmIE1NQ19DQVBfU0RJT19JUlEgJiYKKwkJCXNkaW9faXJlZyAmIFRNSU9fU0RJT19TVEFUX0lPSVJRKQorCQkJbW1jX3NpZ25hbF9zZGlvX2lycShob3N0LT5tbWMpOworCisJCWlmIChzZGlvX2lyZWcpCisJCQlnb3RvIG91dDsKKwl9CisKIAlwcl9kZWJ1Z19zdGF0dXMoc3RhdHVzKTsKIAlwcl9kZWJ1Z19zdGF0dXMoaXJlZyk7CiAKQEAgLTM3NSw4ICs3MjcsMTAgQEAKICAqLwogCiAJCS8qIENvbW1hbmQgY29tcGxldGlvbiAqLwotCQlpZiAoaXJlZyAmIFRNSU9fTUFTS19DTUQpIHsKLQkJCWFja19tbWNfaXJxcyhob3N0LCBUTUlPX01BU0tfQ01EKTsKKwkJaWYgKGlyZWcgJiAoVE1JT19TVEFUX0NNRFJFU1BFTkQgfCBUTUlPX1NUQVRfQ01EVElNRU9VVCkpIHsKKwkJCWFja19tbWNfaXJxcyhob3N0LAorCQkJCSAgICAgVE1JT19TVEFUX0NNRFJFU1BFTkQgfAorCQkJCSAgICAgVE1JT19TVEFUX0NNRFRJTUVPVVQpOwogCQkJdG1pb19tbWNfY21kX2lycShob3N0LCBzdGF0dXMpOwogCQl9CiAKQEAgLTQwNyw2ICs3NjEsMTYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19UTUlPX01NQ19ETUEKK3N0YXRpYyB2b2lkIHRtaW9fY2hlY2tfYm91bmNlX2J1ZmZlcihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKK3sKKwlpZiAoaG9zdC0+c2dfcHRyID09ICZob3N0LT5ib3VuY2Vfc2cpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdm9pZCAqc2dfdmFkZHIgPSB0bWlvX21tY19rbWFwX2F0b21pYyhob3N0LT5zZ19vcmlnLCAmZmxhZ3MpOworCQltZW1jcHkoc2dfdmFkZHIsIGhvc3QtPmJvdW5jZV9idWYsIGhvc3QtPmJvdW5jZV9zZy5sZW5ndGgpOworCQl0bWlvX21tY19rdW5tYXBfYXRvbWljKHNnX3ZhZGRyLCAmZmxhZ3MpOworCX0KK30KKwogc3RhdGljIHZvaWQgdG1pb19tbWNfZW5hYmxlX2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgYm9vbCBlbmFibGUpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1NITU9CSUxFKQpAQCAtNDI3LDEyICs3OTEsMzkgQEAKIAkJZW5hYmxlX21tY19pcnFzKGhvc3QsIFRNSU9fU1RBVF9EQVRBRU5EKTsKIH0KIAotc3RhdGljIGludCB0bWlvX21tY19zdGFydF9kbWFfcngoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCitzdGF0aWMgdm9pZCB0bWlvX21tY19zdGFydF9kbWFfcngoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGhvc3QtPnNnX3B0cjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2dfcHRyLCAqc2dfdG1wOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gaG9zdC0+Y2hhbl9yeDsKLQlpbnQgcmV0OworCXN0cnVjdCBtZmRfY2VsbAkqY2VsbCA9IGhvc3QtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB0bWlvX21tY19kYXRhICpwZGF0YSA9IGNlbGwtPmRyaXZlcl9kYXRhOworCWRtYV9jb29raWVfdCBjb29raWU7CisJaW50IHJldCwgaTsKKwlib29sIGFsaWduZWQgPSB0cnVlLCBtdWx0aXBsZSA9IHRydWU7CisJdW5zaWduZWQgaW50IGFsaWduID0gKDEgPDwgcGRhdGEtPmRtYS0+YWxpZ25tZW50X3NoaWZ0KSAtIDE7CisKKwlmb3JfZWFjaF9zZyhzZywgc2dfdG1wLCBob3N0LT5zZ19sZW4sIGkpIHsKKwkJaWYgKHNnX3RtcC0+b2Zmc2V0ICYgYWxpZ24pCisJCQlhbGlnbmVkID0gZmFsc2U7CisJCWlmIChzZ190bXAtPmxlbmd0aCAmIGFsaWduKSB7CisJCQltdWx0aXBsZSA9IGZhbHNlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKCFhbGlnbmVkICYmIChob3N0LT5zZ19sZW4gPiAxIHx8IHNnLT5sZW5ndGggPiBQQUdFX0NBQ0hFX1NJWkUgfHwKKwkJCSAgYWxpZ24gPj0gTUFYX0FMSUdOKSkgfHwgIW11bHRpcGxlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcGlvOworCX0KKworCS8qIFRoZSBvbmx5IHNnIGVsZW1lbnQgY2FuIGJlIHVuYWxpZ25lZCwgdXNlIG91ciBib3VuY2UgYnVmZmVyIHRoZW4gKi8KKwlpZiAoIWFsaWduZWQpIHsKKwkJc2dfaW5pdF9vbmUoJmhvc3QtPmJvdW5jZV9zZywgaG9zdC0+Ym91bmNlX2J1Ziwgc2ctPmxlbmd0aCk7CisJCWhvc3QtPnNnX3B0ciA9ICZob3N0LT5ib3VuY2Vfc2c7CisJCXNnID0gaG9zdC0+c2dfcHRyOworCX0KIAogCXJldCA9IGRtYV9tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwgc2csIGhvc3QtPnNnX2xlbiwgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAocmV0ID4gMCkgewpAQCAtNDQyLDIxICs4MzMsMjEgQEAKIAl9CiAKIAlpZiAoZGVzYykgewotCQlob3N0LT5kZXNjID0gZGVzYzsKIAkJZGVzYy0+Y2FsbGJhY2sgPSB0bWlvX2RtYV9jb21wbGV0ZTsKIAkJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBob3N0OwotCQlob3N0LT5jb29raWUgPSBkZXNjLT50eF9zdWJtaXQoZGVzYyk7Ci0JCWlmIChob3N0LT5jb29raWUgPCAwKSB7Ci0JCQlob3N0LT5kZXNjID0gTlVMTDsKLQkJCXJldCA9IGhvc3QtPmNvb2tpZTsKKwkJY29va2llID0gZGVzYy0+dHhfc3VibWl0KGRlc2MpOworCQlpZiAoY29va2llIDwgMCkgeworCQkJZGVzYyA9IE5VTEw7CisJCQlyZXQgPSBjb29raWU7CiAJCX0gZWxzZSB7CiAJCQljaGFuLT5kZXZpY2UtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGNoYW4pOwogCQl9CiAJfQogCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwgIiVzKCk6IG1hcHBlZCAlZCAtPiAlZCwgY29va2llICVkLCBycSAlcFxuIiwKLQkJX19mdW5jX18sIGhvc3QtPnNnX2xlbiwgcmV0LCBob3N0LT5jb29raWUsIGhvc3QtPm1ycSk7CisJCV9fZnVuY19fLCBob3N0LT5zZ19sZW4sIHJldCwgY29va2llLCBob3N0LT5tcnEpOwogCi0JaWYgKCFob3N0LT5kZXNjKSB7CitwaW86CisJaWYgKCFkZXNjKSB7CiAJCS8qIERNQSBmYWlsZWQsIGZhbGwgYmFjayB0byBQSU8gKi8KIAkJaWYgKHJldCA+PSAwKQogCQkJcmV0ID0gLUVJTzsKQEAgLTQ3MSwyNCArODYyLDQ5IEBACiAJCWRldl93YXJuKCZob3N0LT5wZGV2LT5kZXYsCiAJCQkgIkRNQSBmYWlsZWQ6ICVkLCBmYWxsaW5nIGJhY2sgdG8gUElPXG4iLCByZXQpOwogCQl0bWlvX21tY19lbmFibGVfZG1hKGhvc3QsIGZhbHNlKTsKLQkJcmVzZXQoaG9zdCk7Ci0JCS8qIEZhaWwgdGhpcyByZXF1ZXN0LCBsZXQgYWJvdmUgbGF5ZXJzIHJlY292ZXIgKi8KLQkJaG9zdC0+bXJxLT5jbWQtPmVycm9yID0gcmV0OwotCQl0bWlvX21tY19maW5pc2hfcmVxdWVzdChob3N0KTsKIAl9CiAKIAlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsICIlcygpOiBkZXNjICVwLCBjb29raWUgJWQsIHNnWyVkXVxuIiwgX19mdW5jX18sCi0JCWRlc2MsIGhvc3QtPmNvb2tpZSwgaG9zdC0+c2dfbGVuKTsKLQotCXJldHVybiByZXQgPiAwID8gMCA6IHJldDsKKwkJZGVzYywgY29va2llLCBob3N0LT5zZ19sZW4pOwogfQogCi1zdGF0aWMgaW50IHRtaW9fbW1jX3N0YXJ0X2RtYV90eChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX3N0YXJ0X2RtYV90eChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2dfcHRyOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBob3N0LT5zZ19wdHIsICpzZ190bXA7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBob3N0LT5jaGFuX3R4OwotCWludCByZXQ7CisJc3RydWN0IG1mZF9jZWxsCSpjZWxsID0gaG9zdC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwlpbnQgcmV0LCBpOworCWJvb2wgYWxpZ25lZCA9IHRydWUsIG11bHRpcGxlID0gdHJ1ZTsKKwl1bnNpZ25lZCBpbnQgYWxpZ24gPSAoMSA8PCBwZGF0YS0+ZG1hLT5hbGlnbm1lbnRfc2hpZnQpIC0gMTsKKworCWZvcl9lYWNoX3NnKHNnLCBzZ190bXAsIGhvc3QtPnNnX2xlbiwgaSkgeworCQlpZiAoc2dfdG1wLT5vZmZzZXQgJiBhbGlnbikKKwkJCWFsaWduZWQgPSBmYWxzZTsKKwkJaWYgKHNnX3RtcC0+bGVuZ3RoICYgYWxpZ24pIHsKKwkJCW11bHRpcGxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICgoIWFsaWduZWQgJiYgKGhvc3QtPnNnX2xlbiA+IDEgfHwgc2ctPmxlbmd0aCA+IFBBR0VfQ0FDSEVfU0laRSB8fAorCQkJICBhbGlnbiA+PSBNQVhfQUxJR04pKSB8fCAhbXVsdGlwbGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBwaW87CisJfQorCisJLyogVGhlIG9ubHkgc2cgZWxlbWVudCBjYW4gYmUgdW5hbGlnbmVkLCB1c2Ugb3VyIGJvdW5jZSBidWZmZXIgdGhlbiAqLworCWlmICghYWxpZ25lZCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl2b2lkICpzZ192YWRkciA9IHRtaW9fbW1jX2ttYXBfYXRvbWljKHNnLCAmZmxhZ3MpOworCQlzZ19pbml0X29uZSgmaG9zdC0+Ym91bmNlX3NnLCBob3N0LT5ib3VuY2VfYnVmLCBzZy0+bGVuZ3RoKTsKKwkJbWVtY3B5KGhvc3QtPmJvdW5jZV9idWYsIHNnX3ZhZGRyLCBob3N0LT5ib3VuY2Vfc2cubGVuZ3RoKTsKKwkJdG1pb19tbWNfa3VubWFwX2F0b21pYyhzZ192YWRkciwgJmZsYWdzKTsKKwkJaG9zdC0+c2dfcHRyID0gJmhvc3QtPmJvdW5jZV9zZzsKKwkJc2cgPSBob3N0LT5zZ19wdHI7CisJfQogCiAJcmV0ID0gZG1hX21hcF9zZygmaG9zdC0+cGRldi0+ZGV2LCBzZywgaG9zdC0+c2dfbGVuLCBETUFfVE9fREVWSUNFKTsKIAlpZiAocmV0ID4gMCkgewpAQCAtNDk4LDE5ICs5MTQsMTkgQEAKIAl9CiAKIAlpZiAoZGVzYykgewotCQlob3N0LT5kZXNjID0gZGVzYzsKIAkJZGVzYy0+Y2FsbGJhY2sgPSB0bWlvX2RtYV9jb21wbGV0ZTsKIAkJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBob3N0OwotCQlob3N0LT5jb29raWUgPSBkZXNjLT50eF9zdWJtaXQoZGVzYyk7Ci0JCWlmIChob3N0LT5jb29raWUgPCAwKSB7Ci0JCQlob3N0LT5kZXNjID0gTlVMTDsKLQkJCXJldCA9IGhvc3QtPmNvb2tpZTsKKwkJY29va2llID0gZGVzYy0+dHhfc3VibWl0KGRlc2MpOworCQlpZiAoY29va2llIDwgMCkgeworCQkJZGVzYyA9IE5VTEw7CisJCQlyZXQgPSBjb29raWU7CiAJCX0KIAl9CiAJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LCAiJXMoKTogbWFwcGVkICVkIC0+ICVkLCBjb29raWUgJWQsIHJxICVwXG4iLAotCQlfX2Z1bmNfXywgaG9zdC0+c2dfbGVuLCByZXQsIGhvc3QtPmNvb2tpZSwgaG9zdC0+bXJxKTsKKwkJX19mdW5jX18sIGhvc3QtPnNnX2xlbiwgcmV0LCBjb29raWUsIGhvc3QtPm1ycSk7CiAKLQlpZiAoIWhvc3QtPmRlc2MpIHsKK3BpbzoKKwlpZiAoIWRlc2MpIHsKIAkJLyogRE1BIGZhaWxlZCwgZmFsbCBiYWNrIHRvIFBJTyAqLwogCQlpZiAocmV0ID49IDApCiAJCQlyZXQgPSAtRUlPOwpAQCAtNTI1LDMwICs5NDEsMjIgQEAKIAkJZGV2X3dhcm4oJmhvc3QtPnBkZXYtPmRldiwKIAkJCSAiRE1BIGZhaWxlZDogJWQsIGZhbGxpbmcgYmFjayB0byBQSU9cbiIsIHJldCk7CiAJCXRtaW9fbW1jX2VuYWJsZV9kbWEoaG9zdCwgZmFsc2UpOwotCQlyZXNldChob3N0KTsKLQkJLyogRmFpbCB0aGlzIHJlcXVlc3QsIGxldCBhYm92ZSBsYXllcnMgcmVjb3ZlciAqLwotCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSByZXQ7Ci0JCXRtaW9fbW1jX2ZpbmlzaF9yZXF1ZXN0KGhvc3QpOwogCX0KIAogCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwgIiVzKCk6IGRlc2MgJXAsIGNvb2tpZSAlZFxuIiwgX19mdW5jX18sCi0JCWRlc2MsIGhvc3QtPmNvb2tpZSk7Ci0KLQlyZXR1cm4gcmV0ID4gMCA/IDAgOiByZXQ7CisJCWRlc2MsIGNvb2tpZSk7CiB9CiAKLXN0YXRpYyBpbnQgdG1pb19tbWNfc3RhcnRfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAorc3RhdGljIHZvaWQgdG1pb19tbWNfc3RhcnRfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAogCQkJICAgICAgIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKSB7CiAJCWlmIChob3N0LT5jaGFuX3J4KQotCQkJcmV0dXJuIHRtaW9fbW1jX3N0YXJ0X2RtYV9yeChob3N0KTsKKwkJCXRtaW9fbW1jX3N0YXJ0X2RtYV9yeChob3N0KTsKIAl9IGVsc2UgewogCQlpZiAoaG9zdC0+Y2hhbl90eCkKLQkJCXJldHVybiB0bWlvX21tY19zdGFydF9kbWFfdHgoaG9zdCk7CisJCQl0bWlvX21tY19zdGFydF9kbWFfdHgoaG9zdCk7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHRtaW9faXNzdWVfdGFza2xldF9mbih1bnNpZ25lZCBsb25nIHByaXYpCkBAIC01NjIsNiArOTcwLDEyIEBACiBzdGF0aWMgdm9pZCB0bWlvX3Rhc2tsZXRfZm4odW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSAoc3RydWN0IHRtaW9fbW1jX2hvc3QgKilhcmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWhvc3QtPmRhdGEpCisJCWdvdG8gb3V0OwogCiAJaWYgKGhvc3QtPmRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKIAkJZG1hX3VubWFwX3NnKCZob3N0LT5wZGV2LT5kZXYsIGhvc3QtPnNnX3B0ciwgaG9zdC0+ZG1hX3NnbGVuLApAQCAtNTcxLDYgKzk4NSw4IEBACiAJCQkgICAgIERNQV9UT19ERVZJQ0UpOwogCiAJdG1pb19tbWNfZG9fZGF0YV9pcnEoaG9zdCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBJdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gbWFrZSBmaWx0ZXIgTUZEIHNwZWNpZmljICovCkBAIC01ODQsOSArMTAwMCw2IEBACiBzdGF0aWMgdm9pZCB0bWlvX21tY19yZXF1ZXN0X2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKIAkJCQkgc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhKQogewotCWhvc3QtPmNvb2tpZSA9IC1FSU5WQUw7Ci0JaG9zdC0+ZGVzYyA9IE5VTEw7Ci0KIAkvKiBXZSBjYW4gb25seSBlaXRoZXIgdXNlIERNQSBmb3IgYm90aCBUeCBhbmQgUnggb3Igbm90IHVzZSBpdCBhdCBhbGwgKi8KIAlpZiAocGRhdGEtPmRtYSkgewogCQlkbWFfY2FwX21hc2tfdCBtYXNrOwpAQCAtNjMyLDE1ICsxMDQ1LDE1IEBACiAJCWhvc3QtPmNoYW5fcnggPSBOVUxMOwogCQlkbWFfcmVsZWFzZV9jaGFubmVsKGNoYW4pOwogCX0KLQotCWhvc3QtPmNvb2tpZSA9IC1FSU5WQUw7Ci0JaG9zdC0+ZGVzYyA9IE5VTEw7CiB9CiAjZWxzZQotc3RhdGljIGludCB0bWlvX21tY19zdGFydF9kbWEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCitzdGF0aWMgdm9pZCB0bWlvX2NoZWNrX2JvdW5jZV9idWZmZXIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCit7Cit9CisKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX3N0YXJ0X2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKIAkJCSAgICAgICBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX3JlcXVlc3RfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LApAQCAtNjgyLDcgKzEwOTUsOSBAQAogCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfWEZFUl9MRU4sIGRhdGEtPmJsa3N6KTsKIAlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1hGRVJfQkxLX0NPVU5ULCBkYXRhLT5ibG9ja3MpOwogCi0JcmV0dXJuIHRtaW9fbW1jX3N0YXJ0X2RtYShob3N0LCBkYXRhKTsKKwl0bWlvX21tY19zdGFydF9kbWEoaG9zdCwgZGF0YSk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyogUHJvY2VzcyByZXF1ZXN0cyBmcm9tIHRoZSBNTUMgbGF5ZXIgKi8KQEAgLTY5NCw2ICsxMTA5LDggQEAKIAlpZiAoaG9zdC0+bXJxKQogCQlwcl9kZWJ1ZygicmVxdWVzdCBub3QgbnVsbFxuIik7CiAKKwlob3N0LT5sYXN0X3JlcV90cyA9IGppZmZpZXM7CisJd21iKCk7CiAJaG9zdC0+bXJxID0gbXJxOwogCiAJaWYgKG1ycS0+ZGF0YSkgewpAQCAtNzAzLDEwICsxMTIwLDE0IEBACiAJfQogCiAJcmV0ID0gdG1pb19tbWNfc3RhcnRfY29tbWFuZChob3N0LCBtcnEtPmNtZCk7Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0LT5kZWxheWVkX3Jlc2V0X3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7CiAJCXJldHVybjsKKwl9CiAKIGZhaWw6CisJaG9zdC0+bXJxID0gTlVMTDsKIAltcnEtPmNtZC0+ZXJyb3IgPSByZXQ7CiAJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CiB9CkBAIC03ODAsNiArMTIwMSw3IEBACiAJLnNldF9pb3MJPSB0bWlvX21tY19zZXRfaW9zLAogCS5nZXRfcm8gICAgICAgICA9IHRtaW9fbW1jX2dldF9ybywKIAkuZ2V0X2NkCQk9IHRtaW9fbW1jX2dldF9jZCwKKwkuZW5hYmxlX3NkaW9faXJxID0gdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxLAogfTsKIAogI2lmZGVmIENPTkZJR19QTQpAQCAtODY0LDEwICsxMjg2LDE1IEBACiAJCWdvdG8gaG9zdF9mcmVlOwogCiAJbW1jLT5vcHMgPSAmdG1pb19tbWNfb3BzOwotCW1tYy0+Y2FwcyA9IE1NQ19DQVBfNF9CSVRfREFUQTsKLQltbWMtPmNhcHMgfD0gcGRhdGEtPmNhcGFiaWxpdGllczsKKwltbWMtPmNhcHMgPSBNTUNfQ0FQXzRfQklUX0RBVEEgfCBwZGF0YS0+Y2FwYWJpbGl0aWVzOwogCW1tYy0+Zl9tYXggPSBwZGF0YS0+aGNsazsKIAltbWMtPmZfbWluID0gbW1jLT5mX21heCAvIDUxMjsKKwltbWMtPm1heF9zZWdzID0gMzI7CisJbW1jLT5tYXhfYmxrX3NpemUgPSA1MTI7CisJbW1jLT5tYXhfYmxrX2NvdW50ID0gKFBBR0VfQ0FDSEVfU0laRSAvIG1tYy0+bWF4X2Jsa19zaXplKSAqCisJCW1tYy0+bWF4X3NlZ3M7CisJbW1jLT5tYXhfcmVxX3NpemUgPSBtbWMtPm1heF9ibGtfc2l6ZSAqIG1tYy0+bWF4X2Jsa19jb3VudDsKKwltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOwogCWlmIChwZGF0YS0+b2NyX21hc2spCiAJCW1tYy0+b2NyX2F2YWlsID0gcGRhdGEtPm9jcl9tYXNrOwogCWVsc2UKQEAgLTg5MCwxMiArMTMxNywxOSBAQAogCQlnb3RvIGNlbGxfZGlzYWJsZTsKIAogCWRpc2FibGVfbW1jX2lycXMoaG9zdCwgVE1JT19NQVNLX0FMTCk7CisJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKQorCQl0bWlvX21tY19lbmFibGVfc2Rpb19pcnEobW1jLCAwKTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgdG1pb19tbWNfaXJxLCBJUlFGX0RJU0FCTEVEIHwKIAkJSVJRRl9UUklHR0VSX0ZBTExJTkcsIGRldl9uYW1lKCZkZXYtPmRldiksIGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gY2VsbF9kaXNhYmxlOwogCisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOworCisJLyogSW5pdCBkZWxheWVkIHdvcmsgZm9yIHJlcXVlc3QgdGltZW91dHMgKi8KKwlJTklUX0RFTEFZRURfV09SSygmaG9zdC0+ZGVsYXllZF9yZXNldF93b3JrLCB0bWlvX21tY19yZXNldF93b3JrKTsKKwogCS8qIFNlZSBpZiB3ZSBhbHNvIGdldCBETUEgKi8KIAl0bWlvX21tY19yZXF1ZXN0X2RtYShob3N0LCBwZGF0YSk7CiAKQEAgLTkzNCw2ICsxMzY4LDcgQEAKIAlpZiAobW1jKSB7CiAJCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAkJbW1jX3JlbW92ZV9ob3N0KG1tYyk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaG9zdC0+ZGVsYXllZF9yZXNldF93b3JrKTsKIAkJdG1pb19tbWNfcmVsZWFzZV9kbWEoaG9zdCk7CiAJCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CiAJCWlmIChjZWxsLT5kaXNhYmxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmVkYzc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKiBEZWZpbml0b25zIGZvciB1c2Ugd2l0aCB0aGUgdG1pb19tbWMuYwotICoKLSAqIChjKSAyMDA0IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+Ci0gKiAoYykgMjAwNyBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0KLSNkZWZpbmUgQ1RMX1NEX0NNRCAweDAwCi0jZGVmaW5lIENUTF9BUkdfUkVHIDB4MDQKLSNkZWZpbmUgQ1RMX1NUT1BfSU5URVJOQUxfQUNUSU9OIDB4MDgKLSNkZWZpbmUgQ1RMX1hGRVJfQkxLX0NPVU5UIDB4YQotI2RlZmluZSBDVExfUkVTUE9OU0UgMHgwYwotI2RlZmluZSBDVExfU1RBVFVTIDB4MWMKLSNkZWZpbmUgQ1RMX0lSUV9NQVNLIDB4MjAKLSNkZWZpbmUgQ1RMX1NEX0NBUkRfQ0xLX0NUTCAweDI0Ci0jZGVmaW5lIENUTF9TRF9YRkVSX0xFTiAweDI2Ci0jZGVmaW5lIENUTF9TRF9NRU1fQ0FSRF9PUFQgMHgyOAotI2RlZmluZSBDVExfU0RfRVJST1JfREVUQUlMX1NUQVRVUyAweDJjCi0jZGVmaW5lIENUTF9TRF9EQVRBX1BPUlQgMHgzMAotI2RlZmluZSBDVExfVFJBTlNBQ1RJT05fQ1RMIDB4MzQKLSNkZWZpbmUgQ1RMX1JFU0VUX1NEIDB4ZTAKLSNkZWZpbmUgQ1RMX1NESU9fUkVHUyAweDEwMAotI2RlZmluZSBDVExfQ0xLX0FORF9XQUlUX0NUTCAweDEzOAotI2RlZmluZSBDVExfUkVTRVRfU0RJTyAweDFlMAotCi0vKiBEZWZpbml0aW9ucyBmb3IgdmFsdWVzIHRoZSBDVFJMX1NUQVRVUyByZWdpc3RlciBjYW4gdGFrZS4gKi8KLSNkZWZpbmUgVE1JT19TVEFUX0NNRFJFU1BFTkQgICAgMHgwMDAwMDAwMQotI2RlZmluZSBUTUlPX1NUQVRfREFUQUVORCAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFRNSU9fU1RBVF9DQVJEX1JFTU9WRSAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgVE1JT19TVEFUX0NBUkRfSU5TRVJUICAgMHgwMDAwMDAxMAotI2RlZmluZSBUTUlPX1NUQVRfU0lHU1RBVEUgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFRNSU9fU1RBVF9XUlBST1RFQ1QgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgVE1JT19TVEFUX0NBUkRfUkVNT1ZFX0EgMHgwMDAwMDEwMAotI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9JTlNFUlRfQSAweDAwMDAwMjAwCi0jZGVmaW5lIFRNSU9fU1RBVF9TSUdTVEFURV9BICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgVE1JT19TVEFUX0NNRF9JRFhfRVJSICAgMHgwMDAxMDAwMAotI2RlZmluZSBUTUlPX1NUQVRfQ1JDRkFJTCAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9TVE9QQklUX0VSUiAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX0RBVEFUSU1FT1VUICAgMHgwMDA4MDAwMAotI2RlZmluZSBUTUlPX1NUQVRfUlhPVkVSRkxPVyAgICAweDAwMTAwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9UWFVOREVSUlVOICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX0NNRFRJTUVPVVQgICAgMHgwMDQwMDAwMAotI2RlZmluZSBUTUlPX1NUQVRfUlhSRFkgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9UWFJRICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX0lMTF9GVU5DICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBUTUlPX1NUQVRfQ01EX0JVU1kgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9JTExfQUNDRVNTICAgIDB4ODAwMDAwMDAKLQotLyogRGVmaW5lIHNvbWUgSVJRIG1hc2tzICovCi0vKiBUaGlzIGlzIHRoZSBtYXNrIHVzZWQgYXQgcmVzZXQgYnkgdGhlIGNoaXAgKi8KLSNkZWZpbmUgVE1JT19NQVNLX0FMTCAgICAgICAgICAgMHg4MzdmMDMxZAotI2RlZmluZSBUTUlPX01BU0tfUkVBRE9QICAoVE1JT19TVEFUX1JYUkRZIHwgVE1JT19TVEFUX0RBVEFFTkQpCi0jZGVmaW5lIFRNSU9fTUFTS19XUklURU9QIChUTUlPX1NUQVRfVFhSUSB8IFRNSU9fU1RBVF9EQVRBRU5EKQotI2RlZmluZSBUTUlPX01BU0tfQ01EICAgICAoVE1JT19TVEFUX0NNRFJFU1BFTkQgfCBUTUlPX1NUQVRfQ01EVElNRU9VVCB8IFwKLQkJVE1JT19TVEFUX0NBUkRfUkVNT1ZFIHwgVE1JT19TVEFUX0NBUkRfSU5TRVJUKQotI2RlZmluZSBUTUlPX01BU0tfSVJRICAgICAoVE1JT19NQVNLX1JFQURPUCB8IFRNSU9fTUFTS19XUklURU9QIHwgVE1JT19NQVNLX0NNRCkKLQotCi0jZGVmaW5lIGVuYWJsZV9tbWNfaXJxcyhob3N0LCBpKSBcCi0JZG8geyBcCi0JCXUzMiBtYXNrO1wKLQkJbWFzayAgPSBzZF9jdHJsX3JlYWQzMigoaG9zdCksIENUTF9JUlFfTUFTSyk7IFwKLQkJbWFzayAmPSB+KChpKSAmIFRNSU9fTUFTS19JUlEpOyBcCi0JCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9JUlFfTUFTSywgbWFzayk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIGRpc2FibGVfbW1jX2lycXMoaG9zdCwgaSkgXAotCWRvIHsgXAotCQl1MzIgbWFzaztcCi0JCW1hc2sgID0gc2RfY3RybF9yZWFkMzIoKGhvc3QpLCBDVExfSVJRX01BU0spOyBcCi0JCW1hc2sgfD0gKChpKSAmIFRNSU9fTUFTS19JUlEpOyBcCi0JCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9JUlFfTUFTSywgbWFzayk7IFwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIGFja19tbWNfaXJxcyhob3N0LCBpKSBcCi0JZG8geyBcCi0JCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9TVEFUVVMsIH4oaSkpOyBcCi0JfSB3aGlsZSAoMCkKLQotCi1zdHJ1Y3QgdG1pb19tbWNfaG9zdCB7Ci0Jdm9pZCBfX2lvbWVtICpjdGw7Ci0JdW5zaWduZWQgbG9uZyBidXNfc2hpZnQ7Ci0Jc3RydWN0IG1tY19jb21tYW5kICAgICAgKmNtZDsKLQlzdHJ1Y3QgbW1jX3JlcXVlc3QgICAgICAqbXJxOwotCXN0cnVjdCBtbWNfZGF0YSAgICAgICAgICpkYXRhOwotCXN0cnVjdCBtbWNfaG9zdCAgICAgICAgICptbWM7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgaXJxOwotCi0JLyogQ2FsbGJhY2tzIGZvciBjbG9jayAvIHBvd2VyIGNvbnRyb2wgKi8KLQl2b2lkICgqc2V0X3B3cikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaG9zdCwgaW50IHN0YXRlKTsKLQl2b2lkICgqc2V0X2Nsa19kaXYpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhvc3QsIGludCBzdGF0ZSk7Ci0KLQkvKiBwaW8gcmVsYXRlZCBzdHVmZiAqLwotCXN0cnVjdCBzY2F0dGVybGlzdCAgICAgICpzZ19wdHI7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgc2dfbGVuOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHNnX29mZjsKLQotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0KLQkvKiBETUEgc3VwcG9ydCAqLwotCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW5fcng7Ci0Jc3RydWN0IGRtYV9jaGFuCQkqY2hhbl90eDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZG1hX2NvbXBsZXRlOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkbWFfaXNzdWU7Ci0jaWZkZWYgQ09ORklHX1RNSU9fTU1DX0RNQQotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBkbWFfc2dsZW47Ci0JZG1hX2Nvb2tpZV90CQljb29raWU7Ci0jZW5kaWYKLX07Ci0KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi1zdGF0aWMgaW5saW5lIHUxNiBzZF9jdHJsX3JlYWQxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIpCi17Ci0JcmV0dXJuIHJlYWR3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2RfY3RybF9yZWFkMTZfcmVwKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKLQkJdTE2ICpidWYsIGludCBjb3VudCkKLXsKLQlyZWFkc3coaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSwgYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHNkX2N0cmxfcmVhZDMyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkcikKLXsKLQlyZXR1cm4gcmVhZHcoaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSkgfAotCSAgICAgICByZWFkdyhob3N0LT5jdGwgKyAoKGFkZHIgKyAyKSA8PCBob3N0LT5idXNfc2hpZnQpKSA8PCAxNjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUxNihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwgaW50IGFkZHIsCi0JCXUxNiB2YWwpCi17Ci0Jd3JpdGV3KHZhbCwgaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZF9jdHJsX3dyaXRlMTZfcmVwKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKLQkJdTE2ICpidWYsIGludCBjb3VudCkKLXsKLQl3cml0ZXN3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCksIGJ1ZiwgY291bnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2RfY3RybF93cml0ZTMyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKLQkJdTMyIHZhbCkKLXsKLQl3cml0ZXcodmFsLCBob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKTsKLQl3cml0ZXcodmFsID4+IDE2LCBob3N0LT5jdGwgKyAoKGFkZHIgKyAyKSA8PCBob3N0LT5idXNfc2hpZnQpKTsKLX0KLQotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0bWlvX21tY19pbml0X3NnKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAotCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKLXsKLQlob3N0LT5zZ19sZW4gPSBkYXRhLT5zZ19sZW47Ci0JaG9zdC0+c2dfcHRyID0gZGF0YS0+c2c7Ci0JaG9zdC0+c2dfb2ZmID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdG1pb19tbWNfbmV4dF9zZyhzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKLXsKLQlob3N0LT5zZ19wdHIgPSBzZ19uZXh0KGhvc3QtPnNnX3B0cik7Ci0JaG9zdC0+c2dfb2ZmID0gMDsKLQlyZXR1cm4gLS1ob3N0LT5zZ19sZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqdG1pb19tbWNfa21hcF9hdG9taWMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQl1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlsb2NhbF9pcnFfc2F2ZSgqZmxhZ3MpOwotCXJldHVybiBrbWFwX2F0b21pYyhzZ19wYWdlKHNnKSwgS01fQklPX1NSQ19JUlEpICsgc2ctPm9mZnNldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRtaW9fbW1jX2t1bm1hcF9hdG9taWModm9pZCAqdmlydCwKLQl1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlrdW5tYXBfYXRvbWljKHZpcnQsIEtNX0JJT19TUkNfSVJRKTsKLQlsb2NhbF9pcnFfcmVzdG9yZSgqZmxhZ3MpOwotfQotCi0jaWZkZWYgQ09ORklHX01NQ19ERUJVRwotCi0jZGVmaW5lIFNUQVRVU19UT19URVhUKGEpIFwKLQlkbyB7IFwKLQkJaWYgKHN0YXR1cyAmIFRNSU9fU1RBVF8jI2EpIFwKLQkJCXByaW50aygjYSk7IFwKLQl9IHdoaWxlICgwKQotCi12b2lkIHByX2RlYnVnX3N0YXR1cyh1MzIgc3RhdHVzKQotewotCXByaW50ayhLRVJOX0RFQlVHICJzdGF0dXM6ICUwOHggPSAiLCBzdGF0dXMpOwotCVNUQVRVU19UT19URVhUKENBUkRfUkVNT1ZFKTsKLQlTVEFUVVNfVE9fVEVYVChDQVJEX0lOU0VSVCk7Ci0JU1RBVFVTX1RPX1RFWFQoU0lHU1RBVEUpOwotCVNUQVRVU19UT19URVhUKFdSUFJPVEVDVCk7Ci0JU1RBVFVTX1RPX1RFWFQoQ0FSRF9SRU1PVkVfQSk7Ci0JU1RBVFVTX1RPX1RFWFQoQ0FSRF9JTlNFUlRfQSk7Ci0JU1RBVFVTX1RPX1RFWFQoU0lHU1RBVEVfQSk7Ci0JU1RBVFVTX1RPX1RFWFQoQ01EX0lEWF9FUlIpOwotCVNUQVRVU19UT19URVhUKFNUT1BCSVRfRVJSKTsKLQlTVEFUVVNfVE9fVEVYVChJTExfRlVOQyk7Ci0JU1RBVFVTX1RPX1RFWFQoQ01EX0JVU1kpOwotCVNUQVRVU19UT19URVhUKENNRFJFU1BFTkQpOwotCVNUQVRVU19UT19URVhUKERBVEFFTkQpOwotCVNUQVRVU19UT19URVhUKENSQ0ZBSUwpOwotCVNUQVRVU19UT19URVhUKERBVEFUSU1FT1VUKTsKLQlTVEFUVVNfVE9fVEVYVChDTURUSU1FT1VUKTsKLQlTVEFUVVNfVE9fVEVYVChSWE9WRVJGTE9XKTsKLQlTVEFUVVNfVE9fVEVYVChUWFVOREVSUlVOKTsKLQlTVEFUVVNfVE9fVEVYVChSWFJEWSk7Ci0JU1RBVFVTX1RPX1RFWFQoVFhSUSk7Ci0JU1RBVFVTX1RPX1RFWFQoSUxMX0FDQ0VTUyk7Ci0JcHJpbnRrKCJcbiIpOwotfQotCi0jZWxzZQotI2RlZmluZSBwcl9kZWJ1Z19zdGF0dXMocykgIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL0tjb25maWcKaW5kZXggMWUyY2JmNS4uYjFmNzY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9LY29uZmlnCkBAIC0xNTksNyArMTU5LDcgQEAKIAogY29uZmlnIE1URF9PRl9QQVJUUwogCXRyaXN0YXRlICJGbGFzaCBwYXJ0aXRpb24gbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgotCWRlcGVuZHMgb24gKE1JQ1JPQkxBWkUgfHwgUFBDX09GKSAmJiBNVERfUEFSVElUSU9OUworCWRlcGVuZHMgb24gT0YgJiYgTVREX1BBUlRJVElPTlMKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgcGFydGl0aW9uIHBhcnNpbmcgZnVuY3Rpb24gd2hpY2ggZGVyaXZlcwogCSAgdGhlIHBhcnRpdGlvbiBtYXAgZnJvbSB0aGUgY2hpbGRyZW4gb2YgdGhlIGZsYXNoIG5vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYwppbmRleCAyY2YwY2M2Li5mMjlhNmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCWlmIChkZXYtPmJsa2RldikgewogCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoZGV2LT5ibGtkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcsCiAJCQkJCTAsIC0xKTsKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoZGV2LT5ibGtkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCQlibGtkZXZfcHV0KGRldi0+YmxrZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wpOwogCX0KIAogCWtmcmVlKGRldik7CkBAIC0yMzQsNiArMjM0LDcgQEAKIC8qIEZJWE1FOiBlbnN1cmUgdGhhdCBtdGQtPnNpemUgJSBlcmFzZV9zaXplID09IDAgKi8KIHN0YXRpYyBzdHJ1Y3QgYmxvY2sybXRkX2RldiAqYWRkX2RldmljZShjaGFyICpkZXZuYW1lLCBpbnQgZXJhc2Vfc2l6ZSkKIHsKKwljb25zdCBmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IGJsb2NrMm10ZF9kZXYgKmRldjsKIAljaGFyICpuYW1lOwpAQCAtMjQ2LDcgKzI0Nyw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJLyogR2V0IGEgaGFuZGxlIG9uIHRoZSBkZXZpY2UgKi8KLQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShkZXZuYW1lLCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFLCBOVUxMKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKGRldm5hbWUsIG1vZGUsIGRldik7CiAjaWZuZGVmIE1PRFVMRQogCWlmIChJU19FUlIoYmRldikpIHsKIApAQCAtMjU0LDkgKzI1NSw4IEBACiAJCSAgIHRvIHJlc29sdmUgdGhlIGRldmljZSBuYW1lIGJ5IG90aGVyIG1lYW5zLiAqLwogCiAJCWRldl90IGRldnQgPSBuYW1lX3RvX2Rldl90KGRldm5hbWUpOwotCQlpZiAoZGV2dCkgewotCQkJYmRldiA9IG9wZW5fYnlfZGV2bnVtKGRldnQsIEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCk7Ci0JCX0KKwkJaWYgKGRldnQpCisJCQliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoZGV2dCwgbW9kZSwgZGV2KTsKIAl9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGEwZGQ3YmIuLjVkMzdkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTcyLDcgKzcyLDcgQEAKIAogY29uZmlnIE1URF9QSFlTTUFQX09GCiAJdHJpc3RhdGUgIkZsYXNoIGRldmljZSBpbiBwaHlzaWNhbCBtZW1vcnkgbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgotCWRlcGVuZHMgb24gKE1JQ1JPQkxBWkUgfHwgUFBDX09GKSAmJiAoTVREX0NGSSB8fCBNVERfSkVERUNQUk9CRSB8fCBNVERfUk9NKQorCWRlcGVuZHMgb24gT0YgJiYgKE1URF9DRkkgfHwgTVREX0pFREVDUFJPQkUgfHwgTVREX1JPTSkKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgJ21hcHBpbmcnIGRyaXZlciB3aGljaCBhbGxvd3MgdGhlIE5PUiBGbGFzaCBhbmQKIAkgIFJPTSBkcml2ZXIgY29kZSB0byBjb21tdW5pY2F0ZSB3aXRoIGNoaXBzIHdoaWNoIGFyZSBtYXBwZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNoYXIuYyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwppbmRleCBmNTExZGQxLi5lZTRiYjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY2hhci5jCkBAIC0xMTM0LDcgKzExMzQsNyBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKm10ZF9pbm9kZWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAibXRkX2lub2RlOiIsIE5VTEwsIE1URF9JTk9ERV9GU19NQUdJQyk7CisJcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAibXRkX2lub2RlOiIsIE5VTEwsIE5VTEwsIE1URF9JTk9ERV9GU19NQUdJQyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBtdGRfaW5vZGVmc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkb29wcy5jIGIvZHJpdmVycy9tdGQvbXRkb29wcy5jCmluZGV4IDFlZTcyZjMuLmM5NDgxNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZG9vcHMuYworKysgYi9kcml2ZXJzL210ZC9tdGRvb3BzLmMKQEAgLTMwNyw2ICszMDcsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGwxX2NweSwgbDJfY3B5OwogCWNoYXIgKmRzdDsKIAorCWlmIChyZWFzb24gIT0gS01TR19EVU1QX09PUFMgJiYKKwkgICAgcmVhc29uICE9IEtNU0dfRFVNUF9QQU5JQyAmJgorCSAgICByZWFzb24gIT0gS01TR19EVU1QX0tFWEVDKQorCQlyZXR1cm47CisKIAkvKiBPbmx5IGR1bXAgb29wc2VzIGlmIGR1bXBfb29wcyBpcyBzZXQgKi8KIAlpZiAocmVhc29uID09IEtNU0dfRFVNUF9PT1BTICYmICFkdW1wX29vcHMpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IDFmNzVhMWIuLjMxYmYzNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtODIxLDcgKzgyMSw3IEBACiAgKgogICogV2FpdCBmb3IgY29tbWFuZCBkb25lLiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBuYW5kX3dhaXQgdXNlZCB3aGVuCiAgKiB3ZSBhcmUgaW4gaW50ZXJydXB0IGNvbnRleHQuIE1heSBoYXBwZW4gd2hlbiBpbiBwYW5pYyBhbmQgdHJ5aW5nIHRvIHdyaXRlCi0gKiBhbiBvb3BzIHRyb3VnaCBtdGRvb3BzLgorICogYW4gb29wcyB0aHJvdWdoIG10ZG9vcHMuCiAgKi8KIHN0YXRpYyB2b2lkIHBhbmljX25hbmRfd2FpdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIHRpbWVvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZmY2NTJjNy4uNGM4YmZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yOTYzLDYgKzI5NjMsNyBAQAogY29uZmlnIFhFTl9ORVRERVZfRlJPTlRFTkQKIAl0cmlzdGF0ZSAiWGVuIG5ldHdvcmsgZGV2aWNlIGZyb250ZW5kIGRyaXZlciIKIAlkZXBlbmRzIG9uIFhFTgorCXNlbGVjdCBYRU5fWEVOQlVTX0ZST05URU5ECiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhlIG5ldHdvcmsgZGV2aWNlIGZyb250ZW5kIGRyaXZlciBhbGxvd3MgdGhlIGtlcm5lbCB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnguaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4LmgKaW5kZXggNmE4NThhMi4uYTZjZDMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnguaAorKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeC5oCkBAIC0xNDE1LDEyICsxNDE1LDEyIEBACiAJCWVsc2UKIAogLyogc2tpcCByeCBxdWV1ZQotICogaWYgRkNPRSBsMiBzdXBwb3J0IGlzIGRpYWJsZWQgYW5kIHRoaXMgaXMgdGhlIGZjb2UgTDIgcXVldWUKKyAqIGlmIEZDT0UgbDIgc3VwcG9ydCBpcyBkaXNhYmxlZCBhbmQgdGhpcyBpcyB0aGUgZmNvZSBMMiBxdWV1ZQogICovCiAjZGVmaW5lIHNraXBfcnhfcXVldWUoYnAsIGlkeCkJKE5PX0ZDT0UoYnApICYmIElTX0ZDT0VfSURYKGlkeCkpCiAKIC8qIHNraXAgdHggcXVldWUKLSAqIGlmIEZDT0UgbDIgc3VwcG9ydCBpcyBkaWFibGVkIGFuZCB0aGlzIGlzIHRoZSBmY29lIEwyIHF1ZXVlCisgKiBpZiBGQ09FIGwyIHN1cHBvcnQgaXMgZGlzYWJsZWQgYW5kIHRoaXMgaXMgdGhlIGZjb2UgTDIgcXVldWUKICAqLwogI2RlZmluZSBza2lwX3R4X3F1ZXVlKGJwLCBpZHgpCShOT19GQ09FKGJwKSAmJiBJU19GQ09FX0lEWChpZHgpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggODRlMWFmNC4uOGNkY2Y1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9tYWluLmMKQEAgLTUwMzcsNyArNTAzNyw3IEBACiAJCW1lbXNldCgmaWx0X2NsaSwgMCwgc2l6ZW9mKHN0cnVjdCBpbHRfY2xpZW50X2luZm8pKTsKIAkJbWVtc2V0KCZpbHQsIDAsIHNpemVvZihzdHJ1Y3QgYm54MnhfaWx0KSk7CiAKLQkJLyogaW5pdGFsaXplIGR1bW15IFRNIGNsaWVudCAqLworCQkvKiBpbml0aWFsaXplIGR1bW15IFRNIGNsaWVudCAqLwogCQlpbHRfY2xpLnN0YXJ0ID0gMDsKIAkJaWx0X2NsaS5lbmQgPSBJTFRfTlVNX1BBR0VfRU5UUklFUyAtIDE7CiAJCWlsdF9jbGkuY2xpZW50X251bSA9IElMVF9DTElFTlRfVE07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9yZWcuaCBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3JlZy5oCmluZGV4IDM4ZWY3Y2EuLmM5Mzk2ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X3JlZy5oCkBAIC0xNjMzLDcgKzE2MzMsNyBAQAogICAgKH5taXNjX3JlZ2lzdGVyc19zd190aW1lcl9jZmdfNC5zd190aW1lcl9jZmdfNFsxXSApIGlzIHNldCAqLwogI2RlZmluZSBNSVNDX1JFR19TV19USU1FUl9SRUxPQURfVkFMXzQJCQkJIDB4YTJmYwogLyogW1JXIDMyXSB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgZm9yIHN3IHRpbWVyczEtOC4gdGhlcmUgYXJlIDggYWRkcmVzc2VzCi0gICBpbiB0aGlzIHJlZ2lzdGVyLiBhZGRyZXMgMCAtIHRpbWVyIDE7IGFkZHJlc3MgMSAtIHRpbWVyIDIsIC4uLiAgYWRkcmVzcyA3IC0KKyAgIGluIHRoaXMgcmVnaXN0ZXIuIGFkZHJlc3MgMCAtIHRpbWVyIDE7IGFkZHJlc3MgMSAtIHRpbWVyIDIsIC4uLiAgYWRkcmVzcyA3IC0KICAgIHRpbWVyIDggKi8KICNkZWZpbmUgTUlTQ19SRUdfU1dfVElNRVJfVkFMCQkJCQkgMHhhNWMwCiAvKiBbUlcgMV0gU2V0IGJ5IHRoZSBNQ1AgdG8gcmVtZW1iZXIgaWYgb25lIG9yIG1vcmUgb2YgdGhlIGRyaXZlcnMgaXMvYXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKaW5kZXggNDhjZjI0Zi4uMTcxNzgyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpAQCAtODQwLDcgKzg0MCw3IEBACiAJbGFjcGR1X2hlYWRlciA9IChzdHJ1Y3QgbGFjcGR1X2hlYWRlciAqKXNrYl9wdXQoc2tiLCBsZW5ndGgpOwogCiAJbWVtY3B5KGxhY3BkdV9oZWFkZXItPmhkci5oX2Rlc3QsIGxhY3BkdV9tY2FzdF9hZGRyLCBFVEhfQUxFTik7Ci0JLyogTm90ZTogc291cmNlIGFkZHJlcyBpcyBzZXQgdG8gYmUgdGhlIG1lbWJlcidzIFBFUk1BTkVOVCBhZGRyZXNzLAorCS8qIE5vdGU6IHNvdXJjZSBhZGRyZXNzIGlzIHNldCB0byBiZSB0aGUgbWVtYmVyJ3MgUEVSTUFORU5UIGFkZHJlc3MsCiAJICAgYmVjYXVzZSB3ZSB1c2UgaXQgdG8gaWRlbnRpZnkgbG9vcGJhY2sgbGFjcGR1cyBpbiByZWNlaXZlLiAqLwogCW1lbWNweShsYWNwZHVfaGVhZGVyLT5oZHIuaF9zb3VyY2UsIHNsYXZlLT5wZXJtX2h3YWRkciwgRVRIX0FMRU4pOwogCWxhY3BkdV9oZWFkZXItPmhkci5oX3Byb3RvID0gUEtUX1RZUEVfTEFDUERVOwpAQCAtODgxLDcgKzg4MSw3IEBACiAJbWFya2VyX2hlYWRlciA9IChzdHJ1Y3QgYm9uZF9tYXJrZXJfaGVhZGVyICopc2tiX3B1dChza2IsIGxlbmd0aCk7CiAKIAltZW1jcHkobWFya2VyX2hlYWRlci0+aGRyLmhfZGVzdCwgbGFjcGR1X21jYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQkvKiBOb3RlOiBzb3VyY2UgYWRkcmVzIGlzIHNldCB0byBiZSB0aGUgbWVtYmVyJ3MgUEVSTUFORU5UIGFkZHJlc3MsCisJLyogTm90ZTogc291cmNlIGFkZHJlc3MgaXMgc2V0IHRvIGJlIHRoZSBtZW1iZXIncyBQRVJNQU5FTlQgYWRkcmVzcywKIAkgICBiZWNhdXNlIHdlIHVzZSBpdCB0byBpZGVudGlmeSBsb29wYmFjayBNQVJLRVJzIGluIHJlY2VpdmUuICovCiAJbWVtY3B5KG1hcmtlcl9oZWFkZXItPmhkci5oX3NvdXJjZSwgc2xhdmUtPnBlcm1faHdhZGRyLCBFVEhfQUxFTik7CiAJbWFya2VyX2hlYWRlci0+aGRyLmhfcHJvdG8gPSBQS1RfVFlQRV9MQUNQRFU7CkBAIC0xOTE2LDcgKzE5MTYsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JLy9jaGVjayB0aGF0IHRoZSBzbGF2ZSBoYXMgbm90IGJlZW4gaW50aWFsaXplZCB5ZXQuCisJLy9jaGVjayB0aGF0IHRoZSBzbGF2ZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgogCWlmIChTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LnNsYXZlICE9IHNsYXZlKSB7CiAKIAkJLy8gcG9ydCBpbml0aWFsaXphdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAppbmRleCA0ZGEzODRjLi4zMWZlOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgImJvbmRfM2FkLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCmluZGV4IDYzZWJmNzYuLjhhNDNjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCkBAIC01NTYsNyArNTU2LDcgQEAKICNkZWZpbmUgRUVQUk9NX01BWF9QT0xMICAgNAogCiAvKgotICogUmVhZCBTRUVQUk9NLiBBIHplcm8gaXMgd3JpdHRlbiB0byB0aGUgZmxhZyByZWdpc3RlciB3aGVuIHRoZSBhZGRyZXMgaXMKKyAqIFJlYWQgU0VFUFJPTS4gQSB6ZXJvIGlzIHdyaXR0ZW4gdG8gdGhlIGZsYWcgcmVnaXN0ZXIgd2hlbiB0aGUgYWRkcmVzcyBpcwogICogd3JpdHRlbiB0byB0aGUgQ29udHJvbCByZWdpc3Rlci4gVGhlIGhhcmR3YXJlIGRldmljZSB3aWxsIHNldCB0aGUgZmxhZyB0byBhCiAgKiBvbmUgd2hlbiA0QiBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIERhdGEgcmVnaXN0ZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvbWM1LmMKaW5kZXggYTg3NjZmYi4uZTEzYjdmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvbWM1LmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvbWM1LmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCiAvKgogICogSW5pdGlhbGl6YXRpb24gdGhhdCByZXF1aXJlcyB0aGUgT1MgYW5kIHByb3RvY29sIGxheWVycyB0byBhbHJlYWR5Ci0gKiBiZSBpbnRpYWxpemVkIGdvZXMgaGVyZS4KKyAqIGJlIGluaXRpYWxpemVkIGdvZXMgaGVyZS4KICAqLwogaW50IHQzX21jNV9pbml0KHN0cnVjdCBtYzUgKm1jNSwgdW5zaWduZWQgaW50IG5zZXJ2ZXJzLCB1bnNpZ25lZCBpbnQgbmZpbHRlcnMsCiAJCXVuc2lnbmVkIGludCBucm91dGVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKaW5kZXggZWM4NTc5YS4uZDU1ZGI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYworKysgYi9kcml2ZXJzL25ldC9jeGdiMy90M19ody5jCkBAIC02MDcsNyArNjA3LDcgQEAKICAqCiAgKglSZWFkIGEgMzItYml0IHdvcmQgZnJvbSBhIGxvY2F0aW9uIGluIFZQRCBFRVBST00gdXNpbmcgdGhlIGNhcmQncyBQQ0kKICAqCVZQRCBST00gY2FwYWJpbGl0eS4gIEEgemVybyBpcyB3cml0dGVuIHRvIHRoZSBmbGFnIGJpdCB3aGVuIHRoZQotICoJYWRkcmVzIGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnRyb2wgcmVnaXN0ZXIuICBUaGUgaGFyZHdhcmUgZGV2aWNlIHdpbGwKKyAqCWFkZHJlc3MgaXMgd3JpdHRlbiB0byB0aGUgY29udHJvbCByZWdpc3Rlci4gIFRoZSBoYXJkd2FyZSBkZXZpY2Ugd2lsbAogICoJc2V0IHRoZSBmbGFnIHRvIDEgd2hlbiA0IGJ5dGVzIGhhdmUgYmVlbiByZWFkIGludG8gdGhlIGRhdGEgcmVnaXN0ZXIuCiAgKi8KIGludCB0M19zZWVwcm9tX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCBfX2xlMzIgKmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaAppbmRleCBmNTUxNGEwLi4xOTZlZWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKQEAgLTQxLDcgKzQxLDcgQEAKIHN0cnVjdCBlMTAwMF9od19zdGF0czsKIAogLyogRW51bWVyYXRlZCB0eXBlcyBzcGVjaWZpYyB0byB0aGUgZTEwMDAgaGFyZHdhcmUgKi8KLS8qIE1lZGlhIEFjY2VzcyBDb250cm9sZXJzICovCisvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGxlcnMgKi8KIHR5cGVkZWYgZW51bSB7CiAJZTEwMDBfdW5kZWZpbmVkID0gMCwKIAllMTAwMF84MjU0Ml9yZXYyXzAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggZTMzMmFlZS4uYmZhYjE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMjIzMyw3ICsyMjMzLDcgQEAKIAkgKiBhZGRyZXNzZXMgdGFrZSBwcmVjZWRlbmNlIHRvIGF2b2lkIGRpc2FibGluZyB1bmljYXN0IGZpbHRlcmluZwogCSAqIHdoZW4gcG9zc2libGUuCiAJICoKLQkgKiBSQVIgMCBpcyB1c2VkIGZvciB0aGUgc3RhdGlvbiBNQUMgYWRkZHJlc3MKKwkgKiBSQVIgMCBpcyB1c2VkIGZvciB0aGUgc3RhdGlvbiBNQUMgYWRkcmVzcwogCSAqIGlmIHRoZXJlIGFyZSBub3QgMTQgYWRkcmVzc2VzLCBnbyBhaGVhZCBhbmQgY2xlYXIgdGhlIGZpbHRlcnMKIAkgKi8KIAlpID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS84MjU3MS5jIGIvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKaW5kZXggN2JkZWMwYi4uODlhNjkwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlLzgyNTcxLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogCiAJLyoKIAkgKiBFbnN1cmUgdGhhdCB0aGUgaW50ZXItcG9ydCBTV1NNLlNNQkkgbG9jayBiaXQgaXMgY2xlYXIgYmVmb3JlCi0JICogZmlyc3QgTlZNIG9yIFBIWSBhY2Vzcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmb3Igc2luZ2xlLXBvcnQKKwkgKiBmaXJzdCBOVk0gb3IgUEhZIGFjY2Vzcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmb3Igc2luZ2xlLXBvcnQKIAkgKiBkZXZpY2VzLCBhbmQgZm9yIG9uZSBwb3J0IG9ubHkgb24gZHVhbC1wb3J0IGRldmljZXMgc28gdGhhdAogCSAqIGZvciB0aG9zZSBkZXZpY2VzIHdlIGNhbiBzdGlsbCB1c2UgdGhlIFNNQkkgbG9jayB0byBzeW5jaHJvbml6ZQogCSAqIGludGVyLXBvcnQgYWNjZXNzZXMgdG8gdGhlIFBIWSAmIE5WTS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCmluZGV4IGI0M2ZjN2YuLmZiNDY5NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJfQogCiAJLyoKLQkgKiBSZXNldCB0aGUgUEhZIGJlZm9yZSBhbnkgYWNjY2VzcyB0byBpdC4gIERvaW5nIHNvLCBlbnN1cmVzIHRoYXQKKwkgKiBSZXNldCB0aGUgUEhZIGJlZm9yZSBhbnkgYWNjZXNzIHRvIGl0LiAgRG9pbmcgc28sIGVuc3VyZXMgdGhhdAogCSAqIHRoZSBQSFkgaXMgaW4gYSBrbm93biBnb29kIHN0YXRlIGJlZm9yZSB3ZSByZWFkL3dyaXRlIFBIWSByZWdpc3RlcnMuCiAJICogVGhlIGdlbmVyaWMgcmVzZXQgaXMgc3VmZmljaWVudCBoZXJlLCBiZWNhdXNlIHdlIGhhdmVuJ3QgZGV0ZXJtaW5lZAogCSAqIHRoZSBQSFkgdHlwZSB5ZXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKaW5kZXggMzI2Nzg4ZS4uNmJlYTA1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYwpAQCAtMjk4Niw3ICsyOTg2LDcgQEAKIH0KIAogLyoqCi0gKiAgZTEwMDBfZ2V0X3BoeV9hZGRyX2Zvcl9odl9wYWdlIC0gR2V0IFBIWSBhZHJyZXNzIGJhc2VkIG9uIHBhZ2UKKyAqICBlMTAwMF9nZXRfcGh5X2FkZHJfZm9yX2h2X3BhZ2UgLSBHZXQgUEhZIGFkZHJlc3MgYmFzZWQgb24gcGFnZQogICogIEBwYWdlOiBwYWdlIHRvIGJlIGFjY2Vzc2VkCiAgKiovCiBzdGF0aWMgdTMyIGUxMDAwX2dldF9waHlfYWRkcl9mb3JfaHZfcGFnZSh1MzIgcGFnZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VlcHJvLmMgYi9kcml2ZXJzL25ldC9lZXByby5jCmluZGV4IDRmYThkMmEuLmViMzU5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VlcHJvLmMKKysrIGIvZHJpdmVycy9uZXQvZWVwcm8uYwpAQCAtMTc2MSw3ICsxNzYxLDcgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOwogbW9kdWxlX3BhcmFtKGF1dG9kZXRlY3QsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJFeHByZXNzIFByby8xMCBJL08gYmFzZSBhZGRyZXMoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJFeHByZXNzIFByby8xMCBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOwogTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdGhlckV4cHJlc3MgUHJvLzEwIElSUSBudW1iZXIocykiKTsKIE1PRFVMRV9QQVJNX0RFU0MobWVtLCAiRXRoZXJFeHByZXNzIFByby8xMCBSeCBidWZmZXIgc2l6ZShlcykgaW4ga0IgKDMtMjkpIik7CiBNT0RVTEVfUEFSTV9ERVNDKGF1dG9kZXRlY3QsICJFdGhlckV4cHJlc3MgUHJvLzEwIGZvcmNlIGJvYXJkKHMpIGRldGVjdGlvbiAoMC0xKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKaW5kZXggZDY4NGYxOC4uN2ExZjNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogCiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKaW5kZXggZjFkNGI0NS4uMTE5YWEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtOTUsNiArOTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeV9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAKICNpbmNsdWRlICJnaWFuZmFyLmgiCiAjaW5jbHVkZSAiZnNsX3BxX21kaW8uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYmZpbl9zaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYmZpbl9zaXIuaAppbmRleCBiNTRhNmYwLi5lM2IyODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2JmaW5fc2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9iZmluX3Npci5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxtYWNoL2JmaW5fc2VyaWFsXzV4eC5oPgorI3VuZGVmIERSSVZFUl9OQU1FCiAKICNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCiBzdHJ1Y3QgZG1hX3J4X2J1ZiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmggYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKaW5kZXggNGRjMzllNS4uNzdmY2Y0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuaApAQCAtMzAsNyArMzAsNyBAQAogICogICAgIG9yIHRoZSB0eXBlLURPIElSIHBvcnQuCiAgKgogICogSXJEQSBjaGlwIHNldCBsaXN0IGZyb20gVG9zaGliYSBDb21wdXRlciBFbmdpbmVlcmluZyBDb3JwLgotICogbW9kZWwJCQltZXRob2QJbWFrZXIJY29udHJvbGVyCQlWZXJzaW9uIAorICogbW9kZWwJCQltZXRob2QJbWFrZXIJY29udHJvbGxlcgkJVmVyc2lvbiAKICAqIFBvcnRlZ2UgMzIwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoVHJpYW5nbGUpIAogICogUG9ydGVnZSAzMDEwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoU3lkbmV5KSAKICAqIFBvcnRlZ2UgMzAxNUNUCUZJUixTSVIgVG9zaGliYSBPYm9lKFN5ZG5leSkgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYwppbmRleCA4ZDMxNmQ5Li5hMjFmNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKQEAgLTEwNzksNyArMTA3OSw3IEBACiAKIAkvKgogCSAqIFRoZSBkZWZhdWx0cyBpbiB0aGUgSFcgZm9yIFJYIFBCIDEtNyBhcmUgbm90IHplcm8gYW5kIHNvIHNob3VsZCBiZQotCSAqIGludGlhbGl6ZWQgdG8gemVybyBmb3Igbm9uIERDQiBtb2RlIG90aGVyd2lzZSBhY3R1YWwgdG90YWwgUlggUEIKKwkgKiBpbml0aWFsaXplZCB0byB6ZXJvIGZvciBub24gRENCIG1vZGUgb3RoZXJ3aXNlIGFjdHVhbCB0b3RhbCBSWCBQQgogCSAqIHdvdWxkIGJlIGJpZ2dlciB0aGFuIHByb2dyYW1tZWQgYW5kIGZpbHRlciBzcGFjZSB3b3VsZCBydW4gaW50bwogCSAqIHRoZSBQQiAwIHJlZ2lvbi4KIAkgKi8KQEAgLTExNjcsNyArMTE2Nyw3IEBACiAKIAkvKgogCSAqIFRoZSBkZWZhdWx0cyBpbiB0aGUgSFcgZm9yIFJYIFBCIDEtNyBhcmUgbm90IHplcm8gYW5kIHNvIHNob3VsZCBiZQotCSAqIGludGlhbGl6ZWQgdG8gemVybyBmb3Igbm9uIERDQiBtb2RlIG90aGVyd2lzZSBhY3R1YWwgdG90YWwgUlggUEIKKwkgKiBpbml0aWFsaXplZCB0byB6ZXJvIGZvciBub24gRENCIG1vZGUgb3RoZXJ3aXNlIGFjdHVhbCB0b3RhbCBSWCBQQgogCSAqIHdvdWxkIGJlIGJpZ2dlciB0aGFuIHByb2dyYW1tZWQgYW5kIGZpbHRlciBzcGFjZSB3b3VsZCBydW4gaW50bwogCSAqIHRoZSBQQiAwIHJlZ2lvbi4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xsX3RlbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2xsX3RlbWFjX21haW4uYwppbmRleCAxODM3NjVjLi5mMzU1NTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sbF90ZW1hY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbGxfdGVtYWNfbWFpbi5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCS8qIGFsbG9jYXRlIHRoZSB0eCBhbmQgcnggcmluZyBidWZmZXIgZGVzY3JpcHRvcnMuICovCi0JLyogcmV0dXJucyBhIHZpcnR1YWwgYWRkcmVzIGFuZCBhIHBoeXNpY2FsIGFkZHJlc3MuICovCisJLyogcmV0dXJucyBhIHZpcnR1YWwgYWRkcmVzcyBhbmQgYSBwaHlzaWNhbCBhZGRyZXNzLiAqLwogCWxwLT50eF9iZF92ID0gZG1hX2FsbG9jX2NvaGVyZW50KG5kZXYtPmRldi5wYXJlbnQsCiAJCQkJCSBzaXplb2YoKmxwLT50eF9iZF92KSAqIFRYX0JEX05VTSwKIAkJCQkJICZscC0+dHhfYmRfcCwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2FsbG9jLmMgYi9kcml2ZXJzL25ldC9tbHg0L2FsbG9jLmMKaW5kZXggOGY0YmYxZi4uM2E0Mjc3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvYWxsb2MuYwpAQCAtMTc4LDYgKzE3OCw3IEBACiAJfSBlbHNlIHsKIAkJaW50IGk7CiAKKwkJYnVmLT5kaXJlY3QuYnVmICA9IE5VTEw7CiAJCWJ1Zi0+bmJ1ZnMgICAgICAgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwogCQlidWYtPm5wYWdlcyAgICAgID0gYnVmLT5uYnVmczsKIAkJYnVmLT5wYWdlX3NoaWZ0ICA9IFBBR0VfU0hJRlQ7CkBAIC0yMjksNyArMjMwLDcgQEAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBzaXplLCBidWYtPmRpcmVjdC5idWYsCiAJCQkJICBidWYtPmRpcmVjdC5tYXApOwogCWVsc2UgewotCQlpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKwkJaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQgJiYgYnVmLT5kaXJlY3QuYnVmKQogCQkJdnVubWFwKGJ1Zi0+ZGlyZWN0LmJ1Zik7CiAKIAkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJ1ZnM7ICsraSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZncuYyBiL2RyaXZlcnMvbmV0L21seDQvZncuYwppbmRleCA3YTdlMThiLi41ZGUxZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9mdy5jCkBAIC0yODksMTAgKzI4OSw4IEBACiAJCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTE9HX0JGX1JFR19TWl9PRkZTRVQpOwogCQlkZXZfY2FwLT5iZl9yZWdfc2l6ZSA9IDEgPDwgKGZpZWxkICYgMHgxZik7CiAJCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTE9HX01BWF9CRl9SRUdTX1BFUl9QQUdFX09GRlNFVCk7Ci0JCWlmICgoMSA8PCAoZmllbGQgJiAweDNmKSkgPiAoUEFHRV9TSVpFIC8gZGV2X2NhcC0+YmZfcmVnX3NpemUpKSB7Ci0JCQltbHg0X3dhcm4oZGV2LCAiZmlybXdhcmUgYnVnOiBsb2cyICMgb2YgYmx1ZSBmbGFtZSByZWdzIGlzIGludmFsaWQgKCVkKSwgZm9yY2luZyAzXG4iLCBmaWVsZCAmIDB4MWYpOworCQlpZiAoKDEgPDwgKGZpZWxkICYgMHgzZikpID4gKFBBR0VfU0laRSAvIGRldl9jYXAtPmJmX3JlZ19zaXplKSkKIAkJCWZpZWxkID0gMzsKLQkJfQogCQlkZXZfY2FwLT5iZl9yZWdzX3Blcl9wYWdlID0gMSA8PCAoZmllbGQgJiAweDNmKTsKIAkJbWx4NF9kYmcoZGV2LCAiQmx1ZUZsYW1lIGF2YWlsYWJsZSAocmVnIHNpemUgJWQsIHJlZ3MvcGFnZSAlZClcbiIsCiAJCQkgZGV2X2NhcC0+YmZfcmVnX3NpemUsIGRldl9jYXAtPmJmX3JlZ3NfcGVyX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKaW5kZXggYTM3ZmNmMS4uZWE1Y2ZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCkBAIC0zNDAzLDkgKzM0MDMsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlzdGF0dXMgPSBwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwogCiAJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHN0YXR1cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCmluZGV4IDcwZTRmN2QuLjYxZGRkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYworKysgYi9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKQEAgLTExMDcsMjIgKzExMDcsOSBAQAogCiAJLyogUmVzdG9yZSBQQ0kgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQgKi8KIAlpZiAobWV0aG9kID09IFJFU0VUX1RZUEVfV09STEQpIHsKLQkJaWYgKGVmeF9uaWNfaXNfZHVhbF9mdW5jKGVmeCkpIHsKLQkJCXJjID0gcGNpX3Jlc3RvcmVfc3RhdGUobmljX2RhdGEtPnBjaV9kZXYyKTsKLQkJCWlmIChyYykgewotCQkJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAotCQkJCQkgICJmYWlsZWQgdG8gcmVzdG9yZSBQQ0kgY29uZmlnIGZvciAiCi0JCQkJCSAgInRoZSBzZWNvbmRhcnkgZnVuY3Rpb25cbiIpOwotCQkJCWdvdG8gZmFpbDM7Ci0JCQl9Ci0JCX0KLQkJcmMgPSBwY2lfcmVzdG9yZV9zdGF0ZShlZngtPnBjaV9kZXYpOwotCQlpZiAocmMpIHsKLQkJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAotCQkJCSAgImZhaWxlZCB0byByZXN0b3JlIFBDSSBjb25maWcgZm9yIHRoZSAiCi0JCQkJICAicHJpbWFyeSBmdW5jdGlvblxuIik7Ci0JCQlnb3RvIGZhaWw0OwotCQl9CisJCWlmIChlZnhfbmljX2lzX2R1YWxfZnVuYyhlZngpKQorCQkJcGNpX3Jlc3RvcmVfc3RhdGUobmljX2RhdGEtPnBjaV9kZXYyKTsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUoZWZ4LT5wY2lfZGV2KTsKIAkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCiAJCQkgICJzdWNjZXNzZnVsbHkgcmVzdG9yZWQgUENJIGNvbmZpZ1xuIik7CiAJfQpAQCAtMTEzMyw3ICsxMTIwLDcgQEAKIAkJcmMgPSAtRVRJTUVET1VUOwogCQluZXRpZl9lcnIoZWZ4LCBodywgZWZ4LT5uZXRfZGV2LAogCQkJICAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGhhcmR3YXJlIHJlc2V0XG4iKTsKLQkJZ290byBmYWlsNTsKKwkJZ290byBmYWlsMzsKIAl9CiAJbmV0aWZfZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwgImhhcmR3YXJlIHJlc2V0IGNvbXBsZXRlXG4iKTsKIApAQCAtMTE0MSwxMSArMTEyOCw5IEBACiAKIAkvKiBwY2lfc2F2ZV9zdGF0ZSgpIGFuZCBwY2lfcmVzdG9yZV9zdGF0ZSgpIE1VU1QgYmUgY2FsbGVkIGluIHBhaXJzICovCiBmYWlsMjoKLWZhaWwzOgogCXBjaV9yZXN0b3JlX3N0YXRlKGVmeC0+cGNpX2Rldik7CiBmYWlsMToKLWZhaWw0OgotZmFpbDU6CitmYWlsMzoKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5jIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKaW5kZXggNTgxODM2OC4uNTk3NmQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzOTAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKQEAgLTM2LDcgKzM2LDcgQEAKICAgIFJldiAxLjA3LjA2IE5vdi4gIDcgMjAwMCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+IHNvbWUgYnVnIGZpeCBhbmQgY2xlYW5pbmcKICAgIFJldiAxLjA3LjA1IE5vdi4gIDYgMjAwMCBtZXRhcGlyYXQ8bWV0YXBpcmF0QGdteC5kZT4gY29udHJpYnV0ZSBtZWRpYSB0eXBlIHNlbGVjdCBieSBpZmNvbmZpZwogICAgUmV2IDEuMDcuMDQgU2VwLiAgNiAyMDAwIExlaS1DaHVuIENoYW5nIGFkZGVkIElDUzE4OTMgUEhZIHN1cHBvcnQKLSAgIFJldiAxLjA3LjAzIEF1Zy4gMjQgMjAwMCBMZWktQ2h1biBDaGFuZyAobGNjaGFuZ0BzaXMuY29tLnR3KSBtb2RpZmllZCA2MzBFIGVxYXVsaXplciB3b3JrYXJvdW5kIHJ1bGUKKyAgIFJldiAxLjA3LjAzIEF1Zy4gMjQgMjAwMCBMZWktQ2h1biBDaGFuZyAobGNjaGFuZ0BzaXMuY29tLnR3KSBtb2RpZmllZCA2MzBFIGVxdWFsaXplciB3b3JrYXJvdW5kIHJ1bGUKICAgIFJldiAxLjA3LjAxIEF1Zy4gMDggMjAwMCBPbGxpZSBMaG8gbWlub3IgdXBkYXRlIGZvciBTaVMgNjMwRSBhbmQgU2lTIDYzMEUgQTEKICAgIFJldiAxLjA3ICAgIE1hci4gMDcgMjAwMCBPbGxpZSBMaG8gYnVnIGZpeCBpbiBSeCBidWZmZXIgcmluZwogICAgUmV2IDEuMDYuMDQgRmViLiAxMSAyMDAwIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4gc29mdG5ldCBhbmQgaW5pdCBmb3Iga2VybmVsIDIuNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVodXRpLmMgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwppbmRleCAyOTYwMDBiLi4zMzk3NjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWh1dGkuYworKysgYi9kcml2ZXJzL25ldC90ZWh1dGkuYwpAQCAtMTIsNyArMTIsNyBAQAogLyoKICAqIFJYIEhXL1NXIGludGVyYWN0aW9uIG92ZXJ2aWV3CiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgUlggY29tbXVuaWNhdGlvbiBjaGFubmVscyBiZXR3ZWFuIGRyaXZlciBhbmQgTklDLgorICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgUlggY29tbXVuaWNhdGlvbiBjaGFubmVscyBiZXR3ZWVuIGRyaXZlciBhbmQgTklDLgogICogMSkgUlggRnJlZSBGaWZvIC0gUlhGIC0gaG9sZHMgZGVzY3JpcHRvcnMgb2YgZW1wdHkgYnVmZmVycyB0byBhY2NlcHQgaW5jb21pbmcKICAqIHRyYWZmaWMuIFRoaXMgRmlmbyBpcyBmaWxsZWQgYnkgU1cgYW5kIGlzIHJlYWRlbiBieSBIVy4gRWFjaCBkZXNjcmlwdG9yIGhvbGRzCiAgKiBpbmZvIGFib3V0IGJ1ZmZlcidzIGxvY2F0aW9uLCBzaXplIGFuZCBJRC4gQW4gSUQgZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSBhCkBAIC04MjEsNyArODIxLDcgQEAKIAkJfQogCiAJCS8qIHVzZSBQTUYgdG8gYWNjZXB0IGZpcnN0IE1BQ19NQ1NUX05VTSAoMTUpIGFkZHJlc3NlcyAqLwotCQkvKiBUQkQ6IHNvcnQgYWRkcmVzZXMgYW5kIHdyaXRlIHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyCisJCS8qIFRCRDogc29ydCBhZGRyZXNzZXMgYW5kIHdyaXRlIHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyCiAJCSAqIGludG8gUlhfTUFDX01DU1QgcmVncy4gd2Ugc2tpcCB0aGlzIHBoYXNlIG5vdyBhbmQgYWNjZXB0IEFMTAogCQkgKiBtdWx0aWNhc3QgZnJhbWVzIHRocm91IElNRiAqLwogCQkvKiBhY2NlcHQgdGhlIHJlc3Qgb2YgYWRkcmVzc2VzIHRocm91IElNRiAqLwpAQCAtMTM0Niw3ICsxMzQ2LDcgQEAKIC8qCiAgKiBUWCBIVy9TVyBpbnRlcmFjdGlvbiBvdmVydmlldwogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIFRYIGNvbW11bmljYXRpb24gY2hhbm5lbHMgYmV0d2VhbiBkcml2ZXIgYW5kIE5JQy4KKyAqIFRoZXJlIGFyZSAyIHR5cGVzIG9mIFRYIGNvbW11bmljYXRpb24gY2hhbm5lbHMgYmV0d2VlbiBkcml2ZXIgYW5kIE5JQy4KICAqIDEpIFRYIEZyZWUgRmlmbyAtIFRYRiAtIGhvbGRzIGFjayBkZXNjcmlwdG9ycyBmb3Igc2VudCBwYWNrZXRzCiAgKiAyKSBUWCBEYXRhIEZpZm8gLSBUWEQgLSBob2xkcyBkZXNjcmlwdG9ycyBvZiBmdWxsIGJ1ZmZlcnMuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCA3NTk5YzQ1Li5iMTAwYmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtMTMwOSw3ICsxMzA5LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNJT0NHSUZIV0FERFI6Ci0JCS8qIEdldCBodyBhZGRyZXMgKi8KKwkJLyogR2V0IGh3IGFkZHJlc3MgKi8KIAkJbWVtY3B5KGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHR1bi0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCQlpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkgPSB0dW4tPmRldi0+dHlwZTsKIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWZyLCBpZnJlcV9sZW4pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGguYyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKaW5kZXggZGM2Y2I5Ny4uNzE1ZTdiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGguYworKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwppbmRleCBjYWI5NmFkLi4wOWNhYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtODk4LDcgKzg5OCw3IEBACiAJc2V0X21paV9mbG93X2NvbnRyb2wodnB0cik7CiAKIAkvKgotCSAgIENoZWNrIGlmIG5ldyBzdGF0dXMgaXMgY29uc2lzZW50IHdpdGggY3VycmVudCBzdGF0dXMKKwkgICBDaGVjayBpZiBuZXcgc3RhdHVzIGlzIGNvbnNpc3RlbnQgd2l0aCBjdXJyZW50IHN0YXR1cwogCSAgIGlmICgoKG1paV9zdGF0dXMgJiBjdXJyX3N0YXR1cykgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgfHwKIAkgICAgICAgKG1paV9zdGF0dXM9PWN1cnJfc3RhdHVzKSkgewogCSAgIHZwdHItPm1paV9zdGF0dXM9bWlpX2NoZWNrX21lZGlhX21vZGUodnB0ci0+bWFjX3JlZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLXRyYWZmaWMuaCBiL2RyaXZlcnMvbmV0L3Z4Z2UvdnhnZS10cmFmZmljLmgKaW5kZXggOGMzMTAzZi4uZDQ4NDg2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhnZS92eGdlLXRyYWZmaWMuaAorKysgYi9kcml2ZXJzL25ldC92eGdlL3Z4Z2UtdHJhZmZpYy5oCkBAIC0xNjk1LDcgKzE2OTUsNyBAQAogICogc3RydWN0IHZ4Z2VfaHdfZGV2aWNlX3N0YXRzIC0gQ29udGFpbnMgSFcgcGVyLWRldmljZSBzdGF0aXN0aWNzLAogICogaW5jbHVkaW5nIGh3LgogICogQGRldmg6IEhXIGRldmljZSBoYW5kbGUuCi0gKiBAZG1hX2FkZHI6IERNQSBhZGRyZXMgb2YgdGhlICVod19pbmZvLiBHaXZlbiB0byBkZXZpY2UgdG8gZmlsbC1pbiB0aGUgc3RhdHMuCisgKiBAZG1hX2FkZHI6IERNQSBhZGRyZXNzIG9mIHRoZSAlaHdfaW5mby4gR2l2ZW4gdG8gZGV2aWNlIHRvIGZpbGwtaW4gdGhlIHN0YXRzLgogICogQGh3X2luZm9fZG1haDogRE1BIGhhbmRsZSB1c2VkIHRvIG1hcCBodyBzdGF0aXN0aWNzIG9udG8gdGhlIGRldmljZSBtZW1vcnkKICAqICAgICAgICAgICAgICAgIHNwYWNlLgogICogQGh3X2luZm9fZG1hX2FjY2g6IE9uZSBtb3JlIERNQSBoYW5kbGUgdXNlZCBzdWJzZXF1ZW50bHkgdG8gZnJlZSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jIGIvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKaW5kZXggMzRjZmY2Yy4uNDU3OGU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIAogTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogRnJhbmNvaXMgUm9taWV1IDxyb21pZXVAY29nZW5pdC5mcj4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU2llbWVucyBQRUIyMDUzNCBQQ0kgQ29udHJvbGVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpZW1lbnMgUEVCMjA1MzQgUENJIENvbnRyb2xsZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsIkVuYWJsZS9kaXNhYmxlIGV4dHJhIG1lc3NhZ2VzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZHJpdmVyLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZHJpdmVyLmMKaW5kZXggZjA2MDMzMi4uNjViYzMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCQlyZXN1bHQpOwogCQlnb3RvIGVycm9yOwogCX0KLQkvKiBFeHRyYWN0IE1BQyBhZGRyZXNzcyAqLworCS8qIEV4dHJhY3QgTUFDIGFkZHJlc3MgKi8KIAlkZGkgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAJQlVJTERfQlVHX09OKEVUSF9BTEVOICE9IHNpemVvZihkZGktPm1hY19hZGRyZXNzKSk7CiAJZF9wcmludGYoMiwgZGV2LCAiR0VUIERFVklDRSBJTkZPOiBtYWMgYWRkciAlcE1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmgKaW5kZXggMTdlY2FhNC4uMDMwY2JmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2kyNDAwbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaApAQCAtMTg2LDcgKzE4Niw3IEBACiAgKiBzdHJ1Y3QgaTI0MDBtX3Bva2VfdGFibGUgLSBIYXJkd2FyZSBwb2tlIHRhYmxlIGZvciB0aGUgSW50ZWwgMjQwMG0KICAqCiAgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgZGV2aWNlIHNwZWNpZmljIHBva2UgdGFibGUKLSAqIHRvIHB1dCB0aGUgZGV2aWNlIGluIGEgY29uc2lzdGFudCBzdGF0ZSBhdCBib290IHRpbWUuCisgKiB0byBwdXQgdGhlIGRldmljZSBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgYXQgYm9vdCB0aW1lLgogICoKICAqIEBhZGRyZXNzOiBUaGUgZGV2aWNlIGFkZHJlc3MgdG8gcG9rZQogICoKQEAgLTcwMyw3ICs3MDMsNyBAQAogICogQEkyNDAwTV9CUklfTUFDX1JFSU5JVDogV2UgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIGJvb3QKICAqICAgICByb20gYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3MuIFRoaXMgaXMgcXVpdGUgYSBkaXJ0eSBoYWNrLAogICogICAgIGlmIHlvdSBhc2sgbWUgLS0gdGhlIGRldmljZSByZXF1aXJlcyB0aGUgYm9vdHJvbSB0byBiZQotICogICAgIGludGlhbGl6ZWQgYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3MuCisgKiAgICAgaW5pdGlhbGl6ZWQgYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3MuCiAgKi8KIGVudW0gaTI0MDBtX2JyaSB7CiAJSTI0MDBNX0JSSV9TT0ZUICAgICAgID0gMSA8PCAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oCmluZGV4IDdhZDA1ZDQuLmZkMTRiOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmgKQEAgLTEwNjQsNyArMTA2NCw3IEBACiAvKgogICogRUVQUk9NIGNvbW1hbmQgcmVnaXN0ZXIKICAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9DTUQJCTB4NjAwOAkJCS8qIFJlZ2lzdGVyIEFkZHJlcyAqLworI2RlZmluZSBBUjVLX0VFUFJPTV9DTUQJCTB4NjAwOAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KICNkZWZpbmUgQVI1S19FRVBST01fQ01EX1JFQUQJMHgwMDAwMDAwMQkvKiBFRVBST00gcmVhZCAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9DTURfV1JJVEUJMHgwMDAwMDAwMgkvKiBFRVBST00gd3JpdGUgKi8KICNkZWZpbmUgQVI1S19FRVBST01fQ01EX1JFU0VUCTB4MDAwMDAwMDQJLyogRUVQUk9NIHJlc2V0ICovCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogLyoKICAqIEVFUFJPTSBjb25maWcgcmVnaXN0ZXIKICAqLwotI2RlZmluZSBBUjVLX0VFUFJPTV9DRkcJCQkweDYwMTAJCQkvKiBSZWdpc3RlciBBZGRyZXMgKi8KKyNkZWZpbmUgQVI1S19FRVBST01fQ0ZHCQkJMHg2MDEwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwogI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfU0laRQkJMHgwMDAwMDAwMwkJLyogU2l6ZSBkZXRlcm1pbmF0aW9uIG92ZXJyaWRlICovCiAjZGVmaW5lIEFSNUtfRUVQUk9NX0NGR19TSVpFX0FVVE8JMAogI2RlZmluZSBBUjVLX0VFUFJPTV9DRkdfU0laRV80S0JJVAkxCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogICogU2Vjb25kIHN0YXRpb24gaWQgcmVnaXN0ZXIgKFVwcGVyIDE2IGJpdHMgb2YgTUFDIGFkZHJlc3MgKyBQQ1Ugc2V0dGluZ3MpCiAgKi8KICNkZWZpbmUgQVI1S19TVEFfSUQxCQkJMHg4MDA0CQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAqLwotI2RlZmluZQlBUjVLX1NUQV9JRDFfQUREUl9VMTYJCTB4MDAwMGZmZmYJLyogVXBwZXIgMTYgYml0cyBvZiBNQUMgYWRkcmVzICovCisjZGVmaW5lCUFSNUtfU1RBX0lEMV9BRERSX1UxNgkJMHgwMDAwZmZmZgkvKiBVcHBlciAxNiBiaXRzIG9mIE1BQyBhZGRyZXNzICovCiAjZGVmaW5lIEFSNUtfU1RBX0lEMV9BUAkJCTB4MDAwMTAwMDAJLyogU2V0IEFQIG1vZGUgKi8KICNkZWZpbmUgQVI1S19TVEFfSUQxX0FESE9DCQkweDAwMDIwMDAwCS8qIFNldCBBZC1Ib2MgbW9kZSAqLwogI2RlZmluZSBBUjVLX1NUQV9JRDFfUFdSX1NWCQkweDAwMDQwMDAwCS8qIFBvd2VyIHNhdmUgcmVwb3J0aW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCmluZGV4IDBkYzMzYjYuLmJlNDgyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jCkBAIC0xOTE5LDcgKzE5MTksNyBAQAogCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgfCBCNDNfSEZfSFdQQ1RMKTsKIH0KIAotLyogSW50aWFsaXplIEIvRyBQSFkgcG93ZXIgY29udHJvbCAqLworLyogSW5pdGlhbGl6ZSBCL0cgUEhZIHBvd2VyIGNvbnRyb2wgKi8KIHN0YXRpYyB2b2lkIGI0M19waHlfaW5pdF9wY3RsKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKIAlzdHJ1Y3Qgc3NiX2J1cyAqYnVzID0gZGV2LT5kZXYtPmJ1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9waHkuYwppbmRleCAzNTAzM2RkLi4yOGU0NzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3BoeS5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAlwaHktPmNhbGlicmF0ZWQgPSAxOwogfQogCi0vKiBpbnRpYWxpemUgQiBQSFkgcG93ZXIgY29udHJvbAorLyogaW5pdGlhbGl6ZSBCIFBIWSBwb3dlciBjb250cm9sCiAgKiBhcyBkZXNjcmliZWQgaW4gaHR0cDovL2JjbS1zcGVjcy5zaXBzb2x1dGlvbnMubmV0L0luaXRQb3dlckNvbnRyb2wKICAqLwogc3RhdGljIHZvaWQgYjQzbGVnYWN5X3BoeV9pbml0X3BjdGwoc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWljdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWljdC5jCmluZGV4IGE1ZGJmZWEuLmI1Y2IzYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1pY3QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24taWN0LmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAgbm9uZToKIAkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2VydmljZS4gKi8KLQkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaWFibGVkIGJ5IGlycSAgYW5kIG5vIHNjaGVkdWxlcyB0YXNrbGV0LiAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAgYW5kIG5vIHNjaGVkdWxlcyB0YXNrbGV0LiAqLwogCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpICYmICFwcml2LT5fYWduLmludGEpCiAJCWl3bF9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwppbmRleCBmMTNhODNhLi4zNjMzNWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uYwpAQCAtMTE1NCw3ICsxMTU0LDcgQEAKIAl9CiAKIAkvKiBSZS1lbmFibGUgYWxsIGludGVycnVwdHMgKi8KLQkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaWFibGVkIGJ5IGlycSAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLwogCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZwcml2LT5zdGF0dXMpKQogCQlpd2xfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CiAKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJfQogCiAJLyogUmUtZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlhYmxlZCBieSBpcnEgKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KIAlpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkKIAkJaXdsX2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVnYWN5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWdhY3kuYwppbmRleCBhMDhiNGU1Li5iYjFhNzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWdhY3kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWdhY3kuYwpAQCAtNjE5LDcgKzYxOSw3IEBACiAKIG5vbmU6CiAJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNlcnZpY2UuICovCi0JLyogb25seSBSZS1lbmFibGUgaWYgZGlhYmxlZCBieSBpcnEgKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KIAlpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkKIAkJaXdsX2VuYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKaW5kZXggNDc3NjMyMy4uNDk0OTNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3RhLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCS8qCiAJICogWFhYOiBUaGUgTUFDIGFkZHJlc3MgaW4gdGhlIGNvbW1hbmQgYnVmZmVyIGlzIG9mdGVuIGNoYW5nZWQgZnJvbQogCSAqIHRoZSBvcmlnaW5hbCBzZW50IHRvIHRoZSBkZXZpY2UuIFRoYXQgaXMsIHRoZSBNQUMgYWRkcmVzcwotCSAqIHdyaXR0ZW4gdG8gdGhlIGNvbW1hbmQgYnVmZmVyIG9mdGVuIGlzIG5vdCB0aGUgc2FtZSBNQUMgYWRyZXNzCisJICogd3JpdHRlbiB0byB0aGUgY29tbWFuZCBidWZmZXIgb2Z0ZW4gaXMgbm90IHRoZSBzYW1lIE1BQyBhZGRyZXNzCiAJICogcmVhZCBmcm9tIHRoZSBjb21tYW5kIGJ1ZmZlciB3aGVuIHRoZSBjb21tYW5kIHJldHVybnMuIFRoaXMKIAkgKiBpc3N1ZSBoYXMgbm90IHlldCBiZWVuIHJlc29sdmVkIGFuZCB0aGlzIGRlYnVnZ2luZyBpcyBsZWZ0IHRvCiAJICogb2JzZXJ2ZSB0aGUgcHJvYmxlbS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggMmM4Y2M5NS4uZWMyYzc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICJpc2xwY2lfYWxsb2NfbWVtb3J5XG4iKTsKICNlbmRpZgogCi0JLyogcmVtYXAgdGhlIFBDSSBkZXZpY2UgYmFzZSBhZGRyZXNzIHRvIGFjY2Vzc2FibGUgKi8KKwkvKiByZW1hcCB0aGUgUENJIGRldmljZSBiYXNlIGFkZHJlc3MgdG8gYWNjZXNzaWJsZSAqLwogCWlmICghKHByaXYtPmRldmljZV9iYXNlID0KIAkgICAgICBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwcml2LT5wZGV2LCAwKSwKIAkJICAgICAgSVNMMzhYWF9QQ0lfTUVNX1NJWkUpKSkgewpAQCAtNzA5LDcgKzcwOSw3IEBACiAJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJaWYgKCFwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0pIHsKIAkJCS8qIGVycm9yIG1hcHBpbmcgdGhlIGJ1ZmZlciB0byBkZXZpY2UKLQkJCSAgIGFjY2Vzc2FibGUgbWVtb3J5IGFkZHJlc3MgKi8KKwkJCSAgIGFjY2Vzc2libGUgbWVtb3J5IGFkZHJlc3MgKi8KIAkJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIG1hcCBza2IgRE1BJ2FibGVcbiIpOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQpAQCAtNzczLDcgKzc3Myw3IEBACiAJCXByaXYtPmRhdGFfbG93X3J4W2NvdW50ZXJdID0gTlVMTDsKIAl9CiAKLQkvKiBGcmVlIHRoZSBhY2NlcyBjb250cm9sIGxpc3QgYW5kIHRoZSBXUEEgbGlzdCAqLworCS8qIEZyZWUgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgYW5kIHRoZSBXUEEgbGlzdCAqLwogCXByaXNtNTRfYWNsX2NsZWFuKCZwcml2LT5hY2wpOwogCXByaXNtNTRfd3BhX2Jzc19pZV9jbGVhbihwcml2KTsKIAltZ3RfY2xlYW4ocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCmluZGV4IDJmYzUyYmMuLmQ0NGY4ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCkBAIC00NTAsNyArNDUwLDcgQEAKIAkJCQkgICBNQVhfRlJBR01FTlRfU0laRV9SWCArIDIsCiAJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJaWYgKHVubGlrZWx5KCFwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdKSkgewotCQkJLyogZXJyb3IgbWFwcGluZyB0aGUgYnVmZmVyIHRvIGRldmljZSBhY2Nlc3NhYmxlIG1lbW9yeSBhZGRyZXNzICovCisJCQkvKiBlcnJvciBtYXBwaW5nIHRoZSBidWZmZXIgdG8gZGV2aWNlIGFjY2Vzc2libGUgbWVtb3J5IGFkZHJlc3MgKi8KIAkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsCiAJCQkgICAgICAiRXJyb3IgbWFwcGluZyBETUEgYWRkcmVzc1xuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwppbmRleCA2NTg1NDJkLi5mM2RhMDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAlpbnRmLT5iZWFjb24gPSBlbnRyeTsKIAogCS8qCi0JICogVGhlIE1BQyBhZGRkcmVzcyBtdXN0IGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGRldmljZQorCSAqIFRoZSBNQUMgYWRkcmVzcyBtdXN0IGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGRldmljZQogCSAqIGhhcyBiZWVuIGluaXRpYWxpemVkLiBPdGhlcndpc2UgdGhlIGRldmljZSBjYW4gcmVzZXQKIAkgKiB0aGUgTUFDIHJlZ2lzdGVycy4KIAkgKiBUaGUgQlNTSUQgYWRkcmVzcyBtdXN0IG9ubHkgYmUgY29uZmlndXJlZCBpbiBBUCBtb2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHBjaS5jCmluZGV4IDczNjMxYzYuLmFjZTBiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcGNpLmMKQEAgLTM2MywxMiArMzYzLDEyIEBACiAJc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiA9IGh3LT5wcml2OwogCiAJaWYgKHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKSB8fAotCSAgICBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSB8fAotCSAgICBwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KSkgeworCSAgICBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkgewogCQlFUlJPUihydDJ4MDBkZXYsICJGYWlsZWQgdG8gcmVzdW1lIGRldmljZS5cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAlyZXR1cm4gcnQyeDAwbGliX3Jlc3VtZShydDJ4MDBkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwcGNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvYWN4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvYWN4LmgKaW5kZXggZTU0YjIxYS4uZWZjYzNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL2FjeC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9hY3guaApAQCAtMTI3MiwxMCArMTI3MiwxMCBAQAogLyogT0JTT0xFVEUgKi8KICNkZWZpbmUgV0wxMjUxX0FDWF9JTlRSX1dBS0VfT05fSE9TVAlCSVQoNikKIAotLyogVHJhY2UgbWVhc3NnZSBvbiBNQk9YICNBICovCisvKiBUcmFjZSBtZXNzYWdlIG9uIE1CT1ggI0EgKi8KICNkZWZpbmUgV0wxMjUxX0FDWF9JTlRSX1RSQUNFX0EJCUJJVCg3KQogCi0vKiBUcmFjZSBtZWFzc2dlIG9uIE1CT1ggI0IgKi8KKy8qIFRyYWNlIG1lc3NhZ2Ugb24gTUJPWCAjQiAqLwogI2RlZmluZSBXTDEyNTFfQUNYX0lOVFJfVFJBQ0VfQgkJQklUKDgpCiAKIC8qIENvbW1hbmQgcHJvY2Vzc2luZyBjb21wbGV0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvd2wxMjUxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvd2wxMjUxLmgKaW5kZXggMTNmYmVlYy4uYzBjZTJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3dsMTI1MS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS93bDEyNTEuaApAQCAtNDE5LDcgKzQxOSw3IEBACiAjZGVmaW5lIFdMMTI1MV9GV19OQU1FICJ3bDEyNTEtZncuYmluIgogI2RlZmluZSBXTDEyNTFfTlZTX05BTUUgIndsMTI1MS1udnMuYmluIgogCi0jZGVmaW5lIFdMMTI1MV9QT1dFUl9PTl9TTEVFUCAxMCAvKiBpbiBtaWxpc2Vjb25kcyAqLworI2RlZmluZSBXTDEyNTFfUE9XRVJfT05fU0xFRVAgMTAgLyogaW4gbWlsbGlzZWNvbmRzICovCiAKICNkZWZpbmUgV0wxMjUxX1BBUlRfRE9XTl9NRU1fU1RBUlQJMHgwCiAjZGVmaW5lIFdMMTI1MV9QQVJUX0RPV05fTUVNX1NJWkUJMHgxNjgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oCmluZGV4IDljYmMzZjQuLjdiZDhlNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmgKQEAgLTQ3LDkgKzQ3LDkgQEAKICNkZWZpbmUgV0wxMjcxX0FDWF9JTlRSX0hXX0FWQUlMQUJMRSAgICAgICBCSVQoNSkKIC8qIFRoZSBNSVNDIGJpdCBpcyB1c2VkIGZvciBhZ2dyZWdhdGlvbiBvZiBSWCwgVHhDb21wbGV0ZSBhbmQgVFggcmF0ZSB1cGRhdGUgKi8KICNkZWZpbmUgV0wxMjcxX0FDWF9JTlRSX0RBVEEgICAgICAgICAgICAgICBCSVQoNikKLS8qIFRyYWNlIG1lYXNzZ2Ugb24gTUJPWCAjQSAqLworLyogVHJhY2UgbWVzc2FnZSBvbiBNQk9YICNBICovCiAjZGVmaW5lIFdMMTI3MV9BQ1hfSU5UUl9UUkFDRV9BICAgICAgICAgICAgQklUKDcpCi0vKiBUcmFjZSBtZWFzc2dlIG9uIE1CT1ggI0IgKi8KKy8qIFRyYWNlIG1lc3NhZ2Ugb24gTUJPWCAjQiAqLwogI2RlZmluZSBXTDEyNzFfQUNYX0lOVFJfVFJBQ0VfQiAgICAgICAgICAgIEJJVCg4KQogCiAjZGVmaW5lIFdMMTI3MV9BQ1hfSU5UUl9BTEwJCSAgIDB4RkZGRkZGRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaAppbmRleCBjZTNkMzFmLi45MDUwZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eC5oCkBAIC00MTYsOCArNDE2LDggQEAKIAogLyogV0wxMjcxIG5lZWRzIGEgMjAwbXMgc2xlZXAgYWZ0ZXIgcG93ZXIgb24sIGFuZCBhIDIwbXMgc2xlZXAgYmVmb3JlIHBvd2VyCiAgICBvbiBpbiBjYXNlIGlzIGhhcyBiZWVuIHNodXQgZG93biBzaG9ydGx5IGJlZm9yZSAqLwotI2RlZmluZSBXTDEyNzFfUFJFX1BPV0VSX09OX1NMRUVQIDIwIC8qIGluIG1pbGlzZWNvbmRzICovCi0jZGVmaW5lIFdMMTI3MV9QT1dFUl9PTl9TTEVFUCAyMDAgLyogaW4gbWlsaXNlY29uZHMgKi8KKyNkZWZpbmUgV0wxMjcxX1BSRV9QT1dFUl9PTl9TTEVFUCAyMCAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgV0wxMjcxX1BPV0VSX09OX1NMRUVQIDIwMCAvKiBpbiBtaWxsaXNlY29uZHMgKi8KIAogLyogTWFjcm9zIHRvIGhhbmRsZSB3bDEyNzEuc3RhX3JhdGVfc2V0ICovCiAjZGVmaW5lIEhXX0JHX1JBVEVTX01BU0sJMHhmZmZmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IGVlODJkZjYuLjNlNWJlZmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiB9CiAKIC8qCi0gKiBHZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3NzLgorICogR2V0IEV0aGVybmV0IE1BQyBhZGRyZXNzLgogICoKICAqIFdBUk5JTkc6IFdlIHN3aXRjaCB0byBGUEFHRTAgYW5kIHN3aXRjIGJhY2sgYWdhaW4uCiAgKiAgICAgICAgICBNYWtpbmcgc3VyZSB0aGVyZSBpcyBubyBvdGhlciBXTCBmdW5jdGlvbiBiZWVuaW5nIGNhbGxlZCBieSBJU1IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94aWxpbnhfZW1hY2xpdGUuYyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCmluZGV4IGRlNmMzMDguLmNhZDY2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgInhpbGlueF9lbWFjbGl0ZSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL0tjb25maWcgYi9kcml2ZXJzL25mYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWRmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25mYy9LY29uZmlnCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTmVhciBGaWVsZCBDb21tdW5pY2F0aW9uIChORkMpIGRldmljZXMKKyMKKworbWVudWNvbmZpZyBORkNfREVWSUNFUworCWJvb2wgIk5GQyBkZXZpY2VzIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFlvdSdsbCBoYXZlIHRvIHNheSBZIGlmIHlvdXIgY29tcHV0ZXIgY29udGFpbnMgYW4gTkZDIGRldmljZSB0aGF0CisJICB5b3Ugd2FudCB0byB1c2UgdW5kZXIgTGludXguCisKKwkgIFlvdSBjYW4gc2F5IE4gaGVyZSBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgTmVhciBGaWVsZCBDb21tdW5pY2F0aW9uCisJICBkZXZpY2VzIGNvbm5lY3RlZCB0byB5b3VyIGNvbXB1dGVyLgorCitpZiBORkNfREVWSUNFUworCitjb25maWcgUE41NDRfTkZDCisJdHJpc3RhdGUgIlBONTQ0IE5GQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgQ1JDX0NDSVRUCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgU2F5IHllcyBpZiB5b3Ugd2FudCBQTjU0NCBOZWFyIEZpZWxkIENvbW11bmljYXRpb24gZHJpdmVyLgorCSAgVGhpcyBpcyBmb3IgaTJjIGNvbm5lY3RlZCB2ZXJzaW9uLiBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBtIGhlcmUuIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHBuNTQ0LgorCisKK2VuZGlmICMgTkZDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL01ha2VmaWxlIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgbmZjIGRldmljZXMKKyMKKworb2JqLSQoQ09ORklHX1BONTQ0X05GQykJCSs9IHBuNTQ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3BuNTQ0LmMgYi9kcml2ZXJzL25mYy9wbjU0NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMWM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25mYy9wbjU0NC5jCkBAIC0wLDAgKzEsODkxIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgUE41NDQgTkZDIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcjogSmFyaSBWYW5oYWxhIDxleHQtamFyaS52YW5oYWxhQG5va2lhLmNvbT4KKyAqIENvbnRhY3Q6IE1hdHRpIEFhbHRvbmVuIDxtYXR0aS5qLmFhbHRvbmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy9wbjU0NC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPiAvKiBmb3IgVENHRVRTICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIERSSVZFUl9DQVJECSJQTjU0NCBORkMiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJORkMgZHJpdmVyIGZvciBQTjU0NCIKKworc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBuNTQ0X2lkX3RhYmxlW10gPSB7CisJeyBQTjU0NF9EUklWRVJfTkFNRSwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwbjU0NF9pZF90YWJsZSk7CisKKyNkZWZpbmUgSENJX01PREUJMAorI2RlZmluZSBGV19NT0RFCQkxCisKK2VudW0gcG41NDRfc3RhdGUgeworCVBONTQ0X1NUX0NPTEQsCisJUE41NDRfU1RfRldfUkVBRFksCisJUE41NDRfU1RfUkVBRFksCit9OworCitlbnVtIHBuNTQ0X2lycSB7CisJUE41NDRfTk9ORSwKKwlQTjU0NF9JTlQsCit9OworCitzdHJ1Y3QgcG41NDRfaW5mbyB7CisJc3RydWN0IG1pc2NkZXZpY2UgbWlzY2RldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2RldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzWzJdOworCisJZW51bSBwbjU0NF9zdGF0ZSBzdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7CisJbG9mZl90IHJlYWRfb2Zmc2V0OworCWVudW0gcG41NDRfaXJxIHJlYWRfaXJxOworCXN0cnVjdCBtdXRleCByZWFkX211dGV4OyAvKiBTZXJpYWxpemUgcmVhZF9pcnEgYWNjZXNzICovCisJc3RydWN0IG11dGV4IG11dGV4OyAvKiBTZXJpYWxpemUgaW5mbyBzdHJ1Y3QgYWNjZXNzICovCisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgYnVmbGVuOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcmVnX3ZkZF9pb1tdCT0gIlZkZF9JTyI7CitzdGF0aWMgY29uc3QgY2hhciByZWdfdmJhdFtdCT0gIlZCYXQiOworCisvKiBzeXNmcyBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzc2l6ZV90IHBuNTQ0X3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwbjU0NF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGluZm8tPmkyY19kZXY7CisJc3RydWN0IHBuNTQ0X25mY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcGRhdGEtPnRlc3QoKSk7Cit9CisKK3N0YXRpYyBpbnQgcG41NDRfZW5hYmxlKHN0cnVjdCBwbjU0NF9pbmZvICppbmZvLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcG41NDRfbmZjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBpbmZvLT5pMmNfZGV2OworCisJaW50IHI7CisKKwlyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUoaW5mby0+cmVncyksIGluZm8tPnJlZ3MpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW5mby0+cmVhZF9pcnEgPSBQTjU0NF9OT05FOworCWlmIChwZGF0YS0+ZW5hYmxlKQorCQlwZGF0YS0+ZW5hYmxlKG1vZGUpOworCisJaWYgKG1vZGUpIHsKKwkJaW5mby0+c3RhdGUgPSBQTjU0NF9TVF9GV19SRUFEWTsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJub3cgaW4gRlctbW9kZVxuIik7CisJfSBlbHNlIHsKKwkJaW5mby0+c3RhdGUgPSBQTjU0NF9TVF9SRUFEWTsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJub3cgaW4gSENJLW1vZGVcbiIpOworCX0KKworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTUwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBuNTQ0X2Rpc2FibGUoc3RydWN0IHBuNTQ0X2luZm8gKmluZm8pCit7CisJc3RydWN0IHBuNTQ0X25mY19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gaW5mby0+aTJjX2RldjsKKworCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEtPmRpc2FibGUpCisJCXBkYXRhLT5kaXNhYmxlKCk7CisKKwlpbmZvLT5zdGF0ZSA9IFBONTQ0X1NUX0NPTEQ7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk5vdyBpbiBPRkYtbW9kZVxuIik7CisKKwltc2xlZXAoUE41NDRfUkVTRVRWRU5fVElNRSk7CisKKwlpbmZvLT5yZWFkX2lycSA9IFBONTQ0X05PTkU7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGluZm8tPnJlZ3MpLCBpbmZvLT5yZWdzKTsKK30KKworc3RhdGljIGludCBjaGVja19jcmModTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwl1OCBsZW47CisJdTE2IGNyYzsKKworCWxlbiA9IGJ1ZlswXSArIDE7CisJaWYgKGxlbiA8IDQgfHwgbGVuICE9IGJ1ZmxlbiB8fCBsZW4gPiBQTjU0NF9NU0dfTUFYX1NJWkUpIHsKKwkJcHJfZXJyKFBONTQ0X0RSSVZFUl9OQU1FCisJCSAgICAgICAiOiBDUkM7IGNvcnJ1cHQgcGFja2V0IGxlbiAldSAoJWQpXG4iLCBsZW4sIGJ1Zmxlbik7CisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJjcmM6ICIsIERVTVBfUFJFRklYX05PTkUsCisJCQkgICAgICAgMTYsIDIsIGJ1ZiwgYnVmbGVuLCBmYWxzZSk7CisJCXJldHVybiAtRVBFUk07CisJfQorCWNyYyA9IGNyY19jY2l0dCgweGZmZmYsIGJ1ZiwgbGVuIC0gMik7CisJY3JjID0gfmNyYzsKKworCWlmIChidWZbbGVuLTJdICE9IChjcmMgJiAweGZmKSB8fCBidWZbbGVuLTFdICE9IChjcmMgPj4gOCkpIHsKKwkJcHJfZXJyKFBONTQ0X0RSSVZFUl9OQU1FICI6IENSQyBlcnJvciAweCV4ICE9IDB4JXggMHgleFxuIiwKKwkJICAgICAgIGNyYywgYnVmW2xlbi0xXSwgYnVmW2xlbi0yXSk7CisKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgImNyYzogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMiwgYnVmLCBidWZsZW4sIGZhbHNlKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG41NDRfaTJjX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4ICpidWYsIGludCBsZW4pCit7CisJaW50IHI7CisKKwlpZiAobGVuIDwgNCB8fCBsZW4gIT0gKGJ1ZlswXSArIDEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IElsbGVnYWwgbWVzc2FnZSBsZW5ndGg6ICVkXG4iLAorCQkJX19mdW5jX18sIGxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGVja19jcmMoYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVzbGVlcF9yYW5nZSgzMDAwLCA2MDAwKTsKKworCXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIGxlbik7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJzZW5kOiAlZFxuIiwgcik7CisKKwlpZiAociA9PSAtRVJFTU9URUlPKSB7IC8qIFJldHJ5LCBjaGlwIHdhcyBpbiBzdGFuZGJ5ICovCisJCXVzbGVlcF9yYW5nZSg2MDAwLCAxMDAwMCk7CisJCXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIGxlbik7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAic2VuZDI6ICVkXG4iLCByKTsKKwl9CisKKwlpZiAociAhPSBsZW4pCisJCXJldHVybiAtRVJFTU9URUlPOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcG41NDRfaTJjX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgcjsKKwl1OCBsZW47CisKKwkvKgorCSAqIFlvdSBjb3VsZCByZWFkIGEgcGFja2V0IGluIG9uZSBnbywgYnV0IHRoZW4geW91J2QgbmVlZCB0byByZWFkCisJICogbWF4IHNpemUgYW5kIHJlc3Qgd291bGQgYmUgMHhmZiBmaWxsLCBzbyB3ZSBkbyBzcGxpdCByZWFkcy4KKwkgKi8KKwlyID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgJmxlbiwgMSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJyZWN2MTogJWRcbiIsIHIpOworCisJaWYgKHIgIT0gMSkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlpZiAobGVuIDwgUE41NDRfTExDX0hDSV9PVkVSSEVBRCkKKwkJbGVuID0gUE41NDRfTExDX0hDSV9PVkVSSEVBRDsKKwllbHNlIGlmIChsZW4gPiAoUE41NDRfTVNHX01BWF9TSVpFIC0gMSkpCisJCWxlbiA9IFBONTQ0X01TR19NQVhfU0laRSAtIDE7CisKKwlpZiAoMSArIGxlbiA+IGJ1ZmxlbikgLyogbGVuKyhkYXRhK2NyYzE2KSAqLworCQlyZXR1cm4gLUVNU0dTSVpFOworCisJYnVmWzBdID0gbGVuOworCisJciA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGJ1ZiArIDEsIGxlbik7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJyZWN2MjogJWRcbiIsIHIpOworCisJaWYgKHIgIT0gbGVuKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCXVzbGVlcF9yYW5nZSgzMDAwLCA2MDAwKTsKKworCXJldHVybiByICsgMTsKK30KKworc3RhdGljIGludCBwbjU0NF9md193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCAqYnVmLCBpbnQgbGVuKQoreworCWludCByOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaWYgKGxlbiA8IFBONTQ0X0ZXX0hFQURFUl9TSVpFIHx8CisJICAgIChQTjU0NF9GV19IRUFERVJfU0laRSArIChidWZbMV0gPDwgOCkgKyBidWZbMl0pICE9IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBsZW4pOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiZncgc2VuZDogJWRcbiIsIHIpOworCisJaWYgKHIgPT0gLUVSRU1PVEVJTykgeyAvKiBSZXRyeSwgY2hpcCB3YXMgaW4gc3RhbmRieSAqLworCQl1c2xlZXBfcmFuZ2UoNjAwMCwgMTAwMDApOworCQlyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBsZW4pOworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImZ3IHNlbmQyOiAlZFxuIiwgcik7CisJfQorCisJaWYgKHIgIT0gbGVuKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHBuNTQ0X2Z3X3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlpbnQgciwgbGVuOworCisJaWYgKGJ1ZmxlbiA8IFBONTQ0X0ZXX0hFQURFUl9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIFBONTQ0X0ZXX0hFQURFUl9TSVpFKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZXIHJlY3YxOiAlZFxuIiwgcik7CisKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJaWYgKHIgPCBQTjU0NF9GV19IRUFERVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSAoYnVmWzFdIDw8IDgpICsgYnVmWzJdOworCWlmIChsZW4gPT0gMCkgLyoganVzdCBoZWFkZXIsIG5vIGFkZGl0aW9uYWwgZGF0YSAqLworCQlyZXR1cm4gcjsKKworCWlmIChsZW4gPiBidWZsZW4gLSBQTjU0NF9GV19IRUFERVJfU0laRSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYgKyBQTjU0NF9GV19IRUFERVJfU0laRSwgbGVuKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgImZ3IHJlY3YyOiAlZFxuIiwgcik7CisKKwlpZiAociAhPSBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHIgKyBQTjU0NF9GV19IRUFERVJfU0laRTsKK30KKworc3RhdGljIGlycXJldHVybl90IHBuNTQ0X2lycV90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBwbjU0NF9pbmZvICppbmZvID0gZGV2X2lkOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBpbmZvLT5pMmNfZGV2OworCisJQlVHX09OKCFpbmZvKTsKKwlCVUdfT04oaXJxICE9IGluZm8tPmkyY19kZXYtPmlycSk7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIklSUVxuIik7CisKKwltdXRleF9sb2NrKCZpbmZvLT5yZWFkX211dGV4KTsKKwlpbmZvLT5yZWFkX2lycSA9IFBONTQ0X0lOVDsKKwltdXRleF91bmxvY2soJmluZm8tPnJlYWRfbXV0ZXgpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5yZWFkX3dhaXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgZW51bSBwbjU0NF9pcnEgcG41NDRfaXJxX3N0YXRlKHN0cnVjdCBwbjU0NF9pbmZvICppbmZvKQoreworCWVudW0gcG41NDRfaXJxIGlycTsKKworCW11dGV4X2xvY2soJmluZm8tPnJlYWRfbXV0ZXgpOworCWlycSA9IGluZm8tPnJlYWRfaXJxOworCW11dGV4X3VubG9jaygmaW5mby0+cmVhZF9tdXRleCk7CisJLyoKKwkgKiBYWFg6IHNob3VsZCB3ZSBjaGVjayBHUElPLWxpbmUgc3RhdHVzIGRpcmVjdGx5PworCSAqIHJldHVybiBwZGF0YS0+aXJxX3N0YXR1cygpID8gUE41NDRfSU5UIDogUE41NDRfTk9ORTsKKwkgKi8KKworCXJldHVybiBpcnE7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBuNTQ0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHBuNTQ0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YoZmlsZS0+cHJpdmF0ZV9kYXRhLAorCQkJCQkgICAgICAgc3RydWN0IHBuNTQ0X2luZm8sIG1pc2NkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBpbmZvLT5pMmNfZGV2OworCWVudW0gcG41NDRfaXJxIGlycTsKKwlzaXplX3QgbGVuOworCWludCByID0gMDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IGluZm86ICVwLCBjb3VudDogJXp1XG4iLCBfX2Z1bmNfXywKKwkJaW5mbywgY291bnQpOworCisJbXV0ZXhfbG9jaygmaW5mby0+bXV0ZXgpOworCisJaWYgKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0NPTEQpIHsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlycSA9IHBuNTQ0X2lycV9zdGF0ZShpbmZvKTsKKwlpZiAoaXJxID09IFBONTQ0X05PTkUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpbmZvLT5yZWFkX3dhaXQsCisJCQkJCSAgICAgKGluZm8tPnJlYWRfaXJxID09IFBONTQ0X0lOVCkpKSB7CisJCQlyID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoaW5mby0+c3RhdGUgPT0gUE41NDRfU1RfRldfUkVBRFkpIHsKKwkJbGVuID0gbWluKGNvdW50LCBpbmZvLT5idWZsZW4pOworCisJCW11dGV4X2xvY2soJmluZm8tPnJlYWRfbXV0ZXgpOworCQlyID0gcG41NDRfZndfcmVhZChpbmZvLT5pMmNfZGV2LCBpbmZvLT5idWYsIGxlbik7CisJCWluZm8tPnJlYWRfaXJxID0gUE41NDRfTk9ORTsKKwkJbXV0ZXhfdW5sb2NrKCZpbmZvLT5yZWFkX211dGV4KTsKKworCQlpZiAociA8IDApIHsKKwkJCWRldl9lcnIoJmluZm8tPmkyY19kZXYtPmRldiwgIkZXIHJlYWQgZmFpbGVkOiAlZFxuIiwgcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJGVyByZWFkOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJICAgICAgIDE2LCAyLCBpbmZvLT5idWYsIHIsIGZhbHNlKTsKKworCQkqb2Zmc2V0ICs9IHI7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBpbmZvLT5idWYsIHIpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gbWluKGNvdW50LCBpbmZvLT5idWZsZW4pOworCisJCW11dGV4X2xvY2soJmluZm8tPnJlYWRfbXV0ZXgpOworCQlyID0gcG41NDRfaTJjX3JlYWQoaW5mby0+aTJjX2RldiwgaW5mby0+YnVmLCBsZW4pOworCQlpbmZvLT5yZWFkX2lycSA9IFBONTQ0X05PTkU7CisJCW11dGV4X3VubG9jaygmaW5mby0+cmVhZF9tdXRleCk7CisKKwkJaWYgKHIgPCAwKSB7CisJCQlkZXZfZXJyKCZpbmZvLT5pMmNfZGV2LT5kZXYsICJyZWFkIGZhaWxlZCAoJWQpXG4iLCByKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJyZWFkOiAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkJICAgICAgIDE2LCAyLCBpbmZvLT5idWYsIHIsIGZhbHNlKTsKKworCQkqb2Zmc2V0ICs9IHI7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBpbmZvLT5idWYsIHIpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwbjU0NF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBwbjU0NF9pbmZvICppbmZvID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICAgIHN0cnVjdCBwbjU0NF9pbmZvLCBtaXNjZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gaW5mby0+aTJjX2RldjsKKwlpbnQgciA9IDA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBpbmZvOiAlcFxuIiwgX19mdW5jX18sIGluZm8pOworCisJbXV0ZXhfbG9jaygmaW5mby0+bXV0ZXgpOworCisJaWYgKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0NPTEQpIHsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCXBvbGxfd2FpdChmaWxlLCAmaW5mby0+cmVhZF93YWl0LCB3YWl0KTsKKworCWlmIChwbjU0NF9pcnFfc3RhdGUoaW5mbykgPT0gUE41NDRfSU5UKSB7CisJCXIgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHNzaXplX3QgcG41NDRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgICBzdHJ1Y3QgcG41NDRfaW5mbywgbWlzY2Rldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGluZm8tPmkyY19kZXY7CisJc3NpemVfdAlsZW47CisJaW50IHI7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBpbmZvOiAlcCwgY291bnQgJXp1XG4iLCBfX2Z1bmNfXywKKwkJaW5mbywgY291bnQpOworCisJbXV0ZXhfbG9jaygmaW5mby0+bXV0ZXgpOworCisJaWYgKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0NPTEQpIHsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogWFhYOiBzaG91bGQgd2UgZGV0ZWN0IHJzZXQtd3JpdGVzIGFuZCBjbGVhbiBwb3NzaWJsZQorCSAqIHJlYWRfaXJxIHN0YXRlCisJICovCisJaWYgKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0ZXX1JFQURZKSB7CisJCXNpemVfdCBmd19sZW47CisKKwkJaWYgKGNvdW50IDwgUE41NDRfRldfSEVBREVSX1NJWkUpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlsZW4gPSBtaW4oY291bnQsIGluZm8tPmJ1Zmxlbik7CisJCWlmIChjb3B5X2Zyb21fdXNlcihpbmZvLT5idWYsIGJ1ZiwgbGVuKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJGVyB3cml0ZTogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMiwgaW5mby0+YnVmLCBsZW4sIGZhbHNlKTsKKworCQlmd19sZW4gPSBQTjU0NF9GV19IRUFERVJfU0laRSArIChpbmZvLT5idWZbMV0gPDwgOCkgKworCQkJaW5mby0+YnVmWzJdOworCisJCWlmIChsZW4gPiBmd19sZW4pIC8qIDEgbXNnIGF0IGEgdGltZSAqLworCQkJbGVuID0gZndfbGVuOworCisJCXIgPSBwbjU0NF9md193cml0ZShpbmZvLT5pMmNfZGV2LCBpbmZvLT5idWYsIGxlbik7CisJfSBlbHNlIHsKKwkJaWYgKGNvdW50IDwgUE41NDRfTExDX01JTl9TSVpFKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbGVuID0gbWluKGNvdW50LCBpbmZvLT5idWZsZW4pOworCQlpZiAoY29weV9mcm9tX3VzZXIoaW5mby0+YnVmLCBidWYsIGxlbikpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAid3JpdGU6ICIsIERVTVBfUFJFRklYX05PTkUsCisJCQkgICAgICAgMTYsIDIsIGluZm8tPmJ1ZiwgbGVuLCBmYWxzZSk7CisKKwkJaWYgKGxlbiA+IChpbmZvLT5idWZbMF0gKyAxKSkgLyogMSBtc2cgYXQgYSB0aW1lICovCisJCQlsZW4gID0gaW5mby0+YnVmWzBdICsgMTsKKworCQlyID0gcG41NDRfaTJjX3dyaXRlKGluZm8tPmkyY19kZXYsIGluZm8tPmJ1ZiwgbGVuKTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CisKKwlyZXR1cm4gcjsKKworfQorCitzdGF0aWMgbG9uZyBwbjU0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBuNTQ0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YoZmlsZS0+cHJpdmF0ZV9kYXRhLAorCQkJCQkgICAgICAgc3RydWN0IHBuNTQ0X2luZm8sIG1pc2NkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBpbmZvLT5pMmNfZGV2OworCXN0cnVjdCBwbjU0NF9uZmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgciA9IDA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBpbmZvOiAlcCwgY21kOiAweCV4XG4iLCBfX2Z1bmNfXywgaW5mbywgY21kKTsKKworCW11dGV4X2xvY2soJmluZm8tPm11dGV4KTsKKworCWlmIChpbmZvLT5zdGF0ZSA9PSBQTjU0NF9TVF9DT0xEKSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlwZGF0YSA9IGluZm8tPmkyY19kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQTjU0NF9HRVRfRldfTU9ERToKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogIFBONTQ0X0dFVF9GV19NT0RFXG4iLCBfX2Z1bmNfXyk7CisKKwkJdmFsID0gKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0ZXX1JFQURZKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQTjU0NF9TRVRfRldfTU9ERToKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogIFBONTQ0X1NFVF9GV19NT0RFXG4iLCBfX2Z1bmNfXyk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbCkpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHZhbCkgeworCQkJaWYgKGluZm8tPnN0YXRlID09IFBONTQ0X1NUX0ZXX1JFQURZKQorCQkJCWJyZWFrOworCisJCQlwbjU0NF9kaXNhYmxlKGluZm8pOworCQkJciA9IHBuNTQ0X2VuYWJsZShpbmZvLCBGV19NT0RFKTsKKwkJCWlmIChyIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbmZvLT5zdGF0ZSA9PSBQTjU0NF9TVF9SRUFEWSkKKwkJCQlicmVhazsKKwkJCXBuNTQ0X2Rpc2FibGUoaW5mbyk7CisJCQlyID0gcG41NDRfZW5hYmxlKGluZm8sIEhDSV9NT0RFKTsKKwkJCWlmIChyIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlmaWxlLT5mX3BvcyA9IGluZm8tPnJlYWRfb2Zmc2V0OworCQlicmVhazsKKworCWNhc2UgVENHRVRTOgorCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiAgVENHRVRTXG4iLCBfX2Z1bmNfXyk7CisKKwkJciA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVua25vd24gaW9jdGwgMHgleFxuIiwgY21kKTsKKwkJciA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5tdXRleCk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwbjU0NF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbjU0NF9pbmZvICppbmZvID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkJICAgICAgIHN0cnVjdCBwbjU0NF9pbmZvLCBtaXNjZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gaW5mby0+aTJjX2RldjsKKwlpbnQgciA9IDA7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBpbmZvOiAlcCwgY2xpZW50ICVwXG4iLCBfX2Z1bmNfXywKKwkJaW5mbywgaW5mby0+aTJjX2Rldik7CisKKwltdXRleF9sb2NrKCZpbmZvLT5tdXRleCk7CisKKwkvKgorCSAqIE9ubHkgMSBhdCBhIHRpbWUuCisJICogWFhYOiBtYXliZSB1c2VyIChjb3VudGVyKSB3b3VsZCB3b3JrIGJldHRlcgorCSAqLworCWlmIChpbmZvLT5zdGF0ZSAhPSBQTjU0NF9TVF9DT0xEKSB7CisJCXIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWZpbGUtPmZfcG9zID0gaW5mby0+cmVhZF9vZmZzZXQ7CisJciA9IHBuNTQ0X2VuYWJsZShpbmZvLCBIQ0lfTU9ERSk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZm8tPm11dGV4KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBwbjU0NF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJCSAgICAgICBzdHJ1Y3QgcG41NDRfaW5mbywgbWlzY2Rldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGluZm8tPmkyY19kZXY7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBpbmZvOiAlcCwgY2xpZW50ICVwXG4iLAorCQlfX2Z1bmNfXywgaW5mbywgaW5mby0+aTJjX2Rldik7CisKKwltdXRleF9sb2NrKCZpbmZvLT5tdXRleCk7CisJcG41NDRfZGlzYWJsZShpbmZvKTsKKwltdXRleF91bmxvY2soJmluZm8tPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbjU0NF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwbjU0NF9yZWFkLAorCS53cml0ZQkJPSBwbjU0NF93cml0ZSwKKwkucG9sbAkJPSBwbjU0NF9wb2xsLAorCS5vcGVuCQk9IHBuNTQ0X29wZW4sCisJLnJlbGVhc2UJPSBwbjU0NF9jbG9zZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBwbjU0NF9pb2N0bCwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcG41NDRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbzsKKwlpbnQgciA9IDA7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIqKipcbiVzOiBjbGllbnQgJXBcbioqKlxuIiwgX19mdW5jX18sIGNsaWVudCk7CisKKwlpbmZvID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXM6IGluZm86ICVwLCBjbGllbnQgJXBcbiIsIF9fZnVuY19fLAorCQkgaW5mbywgY2xpZW50KTsKKworCW11dGV4X2xvY2soJmluZm8tPm11dGV4KTsKKworCXN3aXRjaCAoaW5mby0+c3RhdGUpIHsKKwljYXNlIFBONTQ0X1NUX0ZXX1JFQURZOgorCQkvKiBEbyBub3Qgc3VzcGVuZCB3aGlsZSB1cGdyYWRpbmcgRlcsIHBsZWFzZSEgKi8KKwkJciA9IC1FUEVSTTsKKwkJYnJlYWs7CisKKwljYXNlIFBONTQ0X1NUX1JFQURZOgorCQkvKgorCQkgKiBDSEVDSzogRGV2aWNlIHNob3VsZCBiZSBpbiBzdGFuZGJ5LW1vZGUuIE5vIHdheSB0byBjaGVjaz8KKwkJICogQWxsb3dpbmcgbG93IHBvd2VyIG1vZGUgZm9yIHRoZSByZWd1bGF0b3IgaXMgcG90ZW50aWFsbHkKKwkJICogZGFuZ2Vyb3VzIGlmIHBuNTQ0IGRvZXMgbm90IGdvIHRvIHN1c3BlbnNpb24uCisJCSAqLworCQlicmVhazsKKworCWNhc2UgUE41NDRfU1RfQ09MRDoKKwkJYnJlYWs7CisJfTsKKworCW11dGV4X3VubG9jaygmaW5mby0+bXV0ZXgpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHBuNTQ0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByID0gMDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXM6IGluZm86ICVwLCBjbGllbnQgJXBcbiIsIF9fZnVuY19fLAorCQlpbmZvLCBjbGllbnQpOworCisJbXV0ZXhfbG9jaygmaW5mby0+bXV0ZXgpOworCisJc3dpdGNoIChpbmZvLT5zdGF0ZSkgeworCWNhc2UgUE41NDRfU1RfUkVBRFk6CisJCS8qCisJCSAqIENIRUNLOiBJZiByZWd1bGF0b3IgbG93IHBvd2VyIG1vZGUgaXMgYWxsb3dlZCBpbgorCQkgKiBwbjU0NF9zdXNwZW5kLCB3ZSBzaG91bGQgZ28gYmFjayB0byBub3JtYWwgbW9kZQorCQkgKiBoZXJlLgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFBONTQ0X1NUX0NPTEQ6CisJCWJyZWFrOworCisJY2FzZSBQTjU0NF9TVF9GV19SRUFEWToKKwkJYnJlYWs7CisJfTsKKworCW11dGV4X3VubG9jaygmaW5mby0+bXV0ZXgpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwbjU0NF9wbV9vcHMsIHBuNTQ0X3N1c3BlbmQsIHBuNTQ0X3Jlc3VtZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBuNTQ0X2F0dHIgPQorCV9fQVRUUihuZmNfdGVzdCwgU19JUlVHTywgcG41NDRfdGVzdCwgTlVMTCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBuNTQ0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcG41NDRfbmZjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCByID0gMDsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIklSUTogJWRcbiIsIGNsaWVudC0+aXJxKTsKKworCS8qIHByaXZhdGUgZGF0YSBhbGxvY2F0aW9uICovCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbjU0NF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBuNTQ0X2luZm8uXG4iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2luZm9fYWxsb2M7CisJfQorCisJaW5mby0+YnVmbGVuID0gbWF4KFBONTQ0X01TR19NQVhfU0laRSwgUE41NDRfTUFYX0kyQ19UUkFOU0ZFUik7CisJaW5mby0+YnVmID0ga3phbGxvYyhpbmZvLT5idWZsZW4sIEdGUF9LRVJORUwpOworCWlmICghaW5mby0+YnVmKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBuNTQ0X2luZm8tPmJ1Zi5cbiIpOworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYnVmX2FsbG9jOworCX0KKworCWluZm8tPnJlZ3NbMF0uc3VwcGx5ID0gcmVnX3ZkZF9pbzsKKwlpbmZvLT5yZWdzWzFdLnN1cHBseSA9IHJlZ192YmF0OworCXIgPSByZWd1bGF0b3JfYnVsa19nZXQoJmNsaWVudC0+ZGV2LCBBUlJBWV9TSVpFKGluZm8tPnJlZ3MpLAorCQkJCSBpbmZvLT5yZWdzKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyX2ttYWxsb2M7CisKKwlpbmZvLT5pMmNfZGV2ID0gY2xpZW50OworCWluZm8tPnN0YXRlID0gUE41NDRfU1RfQ09MRDsKKwlpbmZvLT5yZWFkX2lycSA9IFBONTQ0X05PTkU7CisJbXV0ZXhfaW5pdCgmaW5mby0+cmVhZF9tdXRleCk7CisJbXV0ZXhfaW5pdCgmaW5mby0+bXV0ZXgpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPnJlYWRfd2FpdCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5mbyk7CisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlZzsKKwl9CisKKwlpZiAoIXBkYXRhLT5yZXF1ZXN0X3Jlc291cmNlcykgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlcXVlc3RfcmVzb3VyY2VzKCkgbWlzc2luZ1xuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJciA9IHBkYXRhLT5yZXF1ZXN0X3Jlc291cmNlcyhjbGllbnQpOworCWlmIChyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2Fubm90IGdldCBwbGF0Zm9ybSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGVycl9yZWc7CisJfQorCisJciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLCBOVUxMLCBwbjU0NF9pcnFfdGhyZWFkX2ZuLAorCQkJCSBJUlFGX1RSSUdHRVJfUklTSU5HLCBQTjU0NF9EUklWRVJfTkFNRSwKKwkJCQkgaW5mbyk7CisJaWYgKHIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iKTsKKwkJZ290byBlcnJfcmVzOworCX0KKworCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHRlc3Qgd2UgZG9uJ3QgbmVlZCB0aGUgc3lzZnMgZmlsZSAqLworCWlmIChwZGF0YS0+dGVzdCkgeworCQlyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnBuNTQ0X2F0dHIpOworCQlpZiAocikgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJInN5c2ZzIHJlZ2lzdHJhdGlvbiBmYWlsZWQsIGVycm9yICVkXG4iLCByKTsKKwkJCWdvdG8gZXJyX2lycTsKKwkJfQorCX0KKworCWluZm8tPm1pc2NkZXYubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1I7CisJaW5mby0+bWlzY2Rldi5uYW1lID0gUE41NDRfRFJJVkVSX05BTUU7CisJaW5mby0+bWlzY2Rldi5mb3BzID0gJnBuNTQ0X2ZvcHM7CisJaW5mby0+bWlzY2Rldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJciA9IG1pc2NfcmVnaXN0ZXIoJmluZm8tPm1pc2NkZXYpOworCWlmIChyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfc3lzZnM7CisJfQorCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogaW5mbzogJXAsIHBkYXRhICVwLCBjbGllbnQgJXBcbiIsCisJCV9fZnVuY19fLCBpbmZvLCBwZGF0YSwgY2xpZW50KTsKKworCXJldHVybiAwOworCitlcnJfc3lzZnM6CisJaWYgKHBkYXRhLT50ZXN0KQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmcG41NDRfYXR0cik7CitlcnJfaXJxOgorCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmZvKTsKK2Vycl9yZXM6CisJaWYgKHBkYXRhLT5mcmVlX3Jlc291cmNlcykKKwkJcGRhdGEtPmZyZWVfcmVzb3VyY2VzKCk7CitlcnJfcmVnOgorCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShpbmZvLT5yZWdzKSwgaW5mby0+cmVncyk7CitlcnJfa21hbGxvYzoKKwlrZnJlZShpbmZvLT5idWYpOworZXJyX2J1Zl9hbGxvYzoKKwlrZnJlZShpbmZvKTsKK2Vycl9pbmZvX2FsbG9jOgorCXJldHVybiByOworfQorCitzdGF0aWMgX19kZXZleGl0IGludCBwbjU0NF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcG41NDRfaW5mbyAqaW5mbyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBwbjU0NF9uZmNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJbWlzY19kZXJlZ2lzdGVyKCZpbmZvLT5taXNjZGV2KTsKKwlpZiAocGRhdGEtPnRlc3QpCisJCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsICZwbjU0NF9hdHRyKTsKKworCWlmIChpbmZvLT5zdGF0ZSAhPSBQTjU0NF9TVF9DT0xEKSB7CisJCWlmIChwZGF0YS0+ZGlzYWJsZSkKKwkJCXBkYXRhLT5kaXNhYmxlKCk7CisKKwkJaW5mby0+cmVhZF9pcnEgPSBQTjU0NF9OT05FOworCX0KKworCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmZvKTsKKwlpZiAocGRhdGEtPmZyZWVfcmVzb3VyY2VzKQorCQlwZGF0YS0+ZnJlZV9yZXNvdXJjZXMoKTsKKworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShpbmZvLT5yZWdzKSwgaW5mby0+cmVncyk7CisJa2ZyZWUoaW5mby0+YnVmKTsKKwlrZnJlZShpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcG41NDRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gUE41NDRfRFJJVkVSX05BTUUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbSA9ICZwbjU0NF9wbV9vcHMsCisjZW5kaWYKKwl9LAorCS5wcm9iZSA9IHBuNTQ0X3Byb2JlLAorCS5pZF90YWJsZSA9IHBuNTQ0X2lkX3RhYmxlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbjU0NF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcG41NDRfaW5pdCh2b2lkKQoreworCWludCByOworCisJcHJfZGVidWcoRFJJVkVSX0RFU0MgIjogJXNcbiIsIF9fZnVuY19fKTsKKworCXIgPSBpMmNfYWRkX2RyaXZlcigmcG41NDRfZHJpdmVyKTsKKwlpZiAocikgeworCQlwcl9lcnIoUE41NDRfRFJJVkVSX05BTUUgIjogZHJpdmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBuNTQ0X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcG41NDRfZHJpdmVyKTsKKwlwcl9pbmZvKERSSVZFUl9ERVNDICIsIEV4aXRpbmcuXG4iKTsKK30KKworbW9kdWxlX2luaXQocG41NDRfaW5pdCk7Cittb2R1bGVfZXhpdChwbjU0NF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvS2NvbmZpZyBiL2RyaXZlcnMvb2YvS2NvbmZpZwppbmRleCBhYTY3NWViLi4zYzZlMTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL0tjb25maWcKKysrIGIvZHJpdmVycy9vZi9LY29uZmlnCkBAIC0xOSw2ICsxOSwxMCBAQAogCWJvb2wKIAlzZWxlY3QgRFRDCiAKK2NvbmZpZyBPRl9FQVJMWV9GTEFUVFJFRQorCWJvb2wKKwlzZWxlY3QgT0ZfRkxBVFRSRUUKKwogY29uZmlnIE9GX1BST01UUkVFCiAJYm9vbAogCkBAIC00OSw2ICs1MywxMCBAQAogCWhlbHAKIAkgIE9wZW5GaXJtd2FyZSBJMkMgYWNjZXNzb3JzCiAKK2NvbmZpZyBPRl9ORVQKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBPRl9TUEkKIAlkZWZfdHJpc3RhdGUgU1BJCiAJZGVwZW5kcyBvbiBTUEkgJiYgIVNQQVJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL01ha2VmaWxlIGIvZHJpdmVycy9vZi9NYWtlZmlsZQppbmRleCA3ODg4MTU1Li4zYWIyMWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvb2YvTWFrZWZpbGUKQEAgLTYsNSArNiw2IEBACiBvYmotJChDT05GSUdfT0ZfREVWSUNFKSArPSBkZXZpY2UubyBwbGF0Zm9ybS5vCiBvYmotJChDT05GSUdfT0ZfR1BJTykgICArPSBncGlvLm8KIG9iai0kKENPTkZJR19PRl9JMkMpCSs9IG9mX2kyYy5vCitvYmotJChDT05GSUdfT0ZfTkVUKQkrPSBvZl9uZXQubwogb2JqLSQoQ09ORklHX09GX1NQSSkJKz0gb2Zfc3BpLm8KIG9iai0kKENPTkZJR19PRl9NRElPKQkrPSBvZl9tZGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKaW5kZXggM2ExYzdlNy4uYjQ1NTljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9hZGRyZXNzLmMKKysrIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKQEAgLTEyLDEzICsxMiwxMyBAQAogCQkJKG5zKSA+IDApCiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfYnVzICpvZl9tYXRjaF9idXMoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1zdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICphZGRycCwKLQkJCQkgICAgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKK3N0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAorCQljb25zdCBfX2JlMzIgKmFkZHJwLCB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAogCQkJCSAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOwogCiAvKiBEZWJ1ZyB1dGlsaXR5ICovCiAjaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCB1MzIgKmFkZHIsIGludCBuYSkKK3N0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCBfX2JlMzIgKmFkZHIsIGludCBuYSkKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCBzKTsKIAl3aGlsZSAobmEtLSkKQEAgLTI2LDcgKzI2LDcgQEAKIAlwcmludGsoIlxuIik7CiB9CiAjZWxzZQotc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHUzMiAqYWRkciwgaW50IG5hKSB7IH0KK3N0YXRpYyB2b2lkIG9mX2R1bXBfYWRkcihjb25zdCBjaGFyICpzLCBjb25zdCBfX2JlMzIgKmFkZHIsIGludCBuYSkgeyB9CiAjZW5kaWYKIAogLyogQ2FsbGJhY2tzIGZvciBidXMgc3BlY2lmaWMgdHJhbnNsYXRvcnMgKi8KQEAgLTM2LDEwICszNiwxMCBAQAogCWludAkJKCptYXRjaCkoc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpOwogCXZvaWQJCSgqY291bnRfY2VsbHMpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQsCiAJCQkJICAgICAgIGludCAqYWRkcmMsIGludCAqc2l6ZWMpOwotCXU2NAkJKCptYXApKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKKwl1NjQJCSgqbWFwKSh1MzIgKmFkZHIsIGNvbnN0IF9fYmUzMiAqcmFuZ2UsCiAJCQkJaW50IG5hLCBpbnQgbnMsIGludCBwbmEpOwogCWludAkJKCp0cmFuc2xhdGUpKHUzMiAqYWRkciwgdTY0IG9mZnNldCwgaW50IG5hKTsKLQl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKGNvbnN0IHUzMiAqYWRkcik7CisJdW5zaWduZWQgaW50CSgqZ2V0X2ZsYWdzKShjb25zdCBfX2JlMzIgKmFkZHIpOwogfTsKIAogLyoKQEAgLTU1LDcgKzU1LDcgQEAKIAkJKnNpemVjID0gb2Zfbl9zaXplX2NlbGxzKGRldik7CiB9CiAKLXN0YXRpYyB1NjQgb2ZfYnVzX2RlZmF1bHRfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwKK3N0YXRpYyB1NjQgb2ZfYnVzX2RlZmF1bHRfbWFwKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwKIAkJaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCiB7CiAJdTY0IGNwLCBzLCBkYTsKQEAgLTg1LDcgKzg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfZGVmYXVsdF9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfZGVmYXVsdF9nZXRfZmxhZ3MoY29uc3QgX19iZTMyICphZGRyKQogewogCXJldHVybiBJT1JFU09VUkNFX01FTTsKIH0KQEAgLTExMCwxMCArMTEwLDEwIEBACiAJCSpzaXplYyA9IDI7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX3BjaV9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCBfX2JlMzIgKmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQl1MzIgdyA9IGFkZHJbMF07CisJdTMyIHcgPSBiZTMyX3RvX2NwdXAoYWRkcik7CiAKIAlzd2l0Y2goKHcgPj4gMjQpICYgMHgwMykgewogCWNhc2UgMHgwMToKQEAgLTEyOSw3ICsxMjksOCBAQAogCXJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIHU2NCBvZl9idXNfcGNpX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQorc3RhdGljIHU2NCBvZl9idXNfcGNpX21hcCh1MzIgKmFkZHIsIGNvbnN0IF9fYmUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLAorCQlpbnQgcG5hKQogewogCXU2NCBjcCwgcywgZGE7CiAJdW5zaWduZWQgaW50IGFmLCByZjsKQEAgLTE2MCw3ICsxNjEsNyBAQAogCXJldHVybiBvZl9idXNfZGVmYXVsdF90cmFuc2xhdGUoYWRkciArIDEsIG9mZnNldCwgbmEgLSAxKTsKIH0KIAotY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKK2NvbnN0IF9fYmUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLCB1NjQgKnNpemUsCiAJCQl1bnNpZ25lZCBpbnQgKmZsYWdzKQogewogCWNvbnN0IF9fYmUzMiAqcHJvcDsKQEAgLTIwNyw3ICsyMDgsNyBAQAogaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAogCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcikKIHsKLQljb25zdCB1MzIJKmFkZHJwOworCWNvbnN0IF9fYmUzMgkqYWRkcnA7CiAJdTY0CQlzaXplOwogCXVuc2lnbmVkIGludAlmbGFnczsKIApAQCAtMjM3LDEyICsyMzgsMTMgQEAKIAkJKnNpemVjID0gMTsKIH0KIAotc3RhdGljIHU2NCBvZl9idXNfaXNhX21hcCh1MzIgKmFkZHIsIGNvbnN0IHUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLCBpbnQgcG5hKQorc3RhdGljIHU2NCBvZl9idXNfaXNhX21hcCh1MzIgKmFkZHIsIGNvbnN0IF9fYmUzMiAqcmFuZ2UsIGludCBuYSwgaW50IG5zLAorCQlpbnQgcG5hKQogewogCXU2NCBjcCwgcywgZGE7CiAKIAkvKiBDaGVjayBhZGRyZXNzIHR5cGUgbWF0Y2ggKi8KLQlpZiAoKGFkZHJbMF0gXiByYW5nZVswXSkgJiAweDAwMDAwMDAxKQorCWlmICgoYWRkclswXSBeIHJhbmdlWzBdKSAmIGNwdV90b19iZTMyKDEpKQogCQlyZXR1cm4gT0ZfQkFEX0FERFI7CiAKIAkvKiBSZWFkIGFkZHJlc3MgdmFsdWVzLCBza2lwcGluZyBoaWdoIGNlbGwgKi8KQEAgLTI2NCwxMCArMjY2LDEwIEBACiAJcmV0dXJuIG9mX2J1c19kZWZhdWx0X3RyYW5zbGF0ZShhZGRyICsgMSwgb2Zmc2V0LCBuYSAtIDEpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19pc2FfZ2V0X2ZsYWdzKGNvbnN0IHUzMiAqYWRkcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2lzYV9nZXRfZmxhZ3MoY29uc3QgX19iZTMyICphZGRyKQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0JdTMyIHcgPSBhZGRyWzBdOworCXUzMiB3ID0gYmUzMl90b19jcHVwKGFkZHIpOwogCiAJaWYgKHcgJiAxKQogCQlmbGFncyB8PSBJT1JFU09VUkNFX0lPOwpAQCAtMzMwLDcgKzMzMiw3IEBACiAJCQkgICAgc3RydWN0IG9mX2J1cyAqcGJ1cywgdTMyICphZGRyLAogCQkJICAgIGludCBuYSwgaW50IG5zLCBpbnQgcG5hLCBjb25zdCBjaGFyICpycHJvcCkKIHsKLQljb25zdCB1MzIgKnJhbmdlczsKKwljb25zdCBfX2JlMzIgKnJhbmdlczsKIAl1bnNpZ25lZCBpbnQgcmxlbjsKIAlpbnQgcm9uZTsKIAl1NjQgb2Zmc2V0ID0gT0ZfQkFEX0FERFI7CkBAIC0zOTgsNyArNDAwLDcgQEAKICAqIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIGNwdSBwaHlzaWNhbCBhZGRyZXNzKS4gVGhpcyBpcyBub3QgcmVhbGx5IHNwZWNpZmllZAogICogdGhhdCB3YXksIGJ1dCB0aGlzIGlzIHRyYWRpdGlvbmFsbHkgdGhlIHdheSBJQk0gYXQgbGVhc3QgZG8gdGhpbmdzCiAgKi8KLXU2NCBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmluX2FkZHIsCit1NjQgX19vZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgX19iZTMyICppbl9hZGRyLAogCQkJICAgY29uc3QgY2hhciAqcnByb3ApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBOVUxMOwpAQCAtNDc1LDIyICs0NzcsMjIgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi11NjQgb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqaW5fYWRkcikKK3U2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgX19iZTMyICppbl9hZGRyKQogewogCXJldHVybiBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgaW5fYWRkciwgInJhbmdlcyIpOwogfQogRVhQT1JUX1NZTUJPTChvZl90cmFuc2xhdGVfYWRkcmVzcyk7CiAKLXU2NCBvZl90cmFuc2xhdGVfZG1hX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqaW5fYWRkcikKK3U2NCBvZl90cmFuc2xhdGVfZG1hX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IF9fYmUzMiAqaW5fYWRkcikKIHsKIAlyZXR1cm4gX19vZl90cmFuc2xhdGVfYWRkcmVzcyhkZXYsIGluX2FkZHIsICJkbWEtcmFuZ2VzIik7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyk7CiAKLWNvbnN0IHUzMiAqb2ZfZ2V0X2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwgdTY0ICpzaXplLAorY29uc3QgX19iZTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCB1NjQgKnNpemUsCiAJCSAgICB1bnNpZ25lZCBpbnQgKmZsYWdzKQogewotCWNvbnN0IHUzMiAqcHJvcDsKKwljb25zdCBfX2JlMzIgKnByb3A7CiAJdW5zaWduZWQgaW50IHBzaXplOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwogCXN0cnVjdCBvZl9idXMgKmJ1czsKQEAgLTUyNSw4ICs1MjcsOCBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRfYWRkcmVzcyk7CiAKLXN0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmFkZHJwLAotCQkJCSAgICB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCWNvbnN0IF9fYmUzMiAqYWRkcnAsIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcikKIHsKIAl1NjQgdGFkZHI7CkBAIC01NjQsNyArNTY2LDcgQEAKIGludCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCiAJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCiB7Ci0JY29uc3QgdTMyCSphZGRycDsKKwljb25zdCBfX2JlMzIJKmFkZHJwOwogCXU2NAkJc2l6ZTsKIAl1bnNpZ25lZCBpbnQJZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvZmR0LmMgYi9kcml2ZXJzL29mL2ZkdC5jCmluZGV4IGMxMzYwZTAuLmM3ODdjM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZmR0LmMKKysrIGIvZHJpdmVycy9vZi9mZHQuYwpAQCAtMTEsMTAgKzExLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaWZkZWYgQ09ORklHX1BQQwogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CkBAIC0yMiwxMDQgKzI0LDE5IEBACiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi1pbnQgX19pbml0ZGF0YSBkdF9yb290X2FkZHJfY2VsbHM7Ci1pbnQgX19pbml0ZGF0YSBkdF9yb290X3NpemVfY2VsbHM7Ci0KLXN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqaW5pdGlhbF9ib290X3BhcmFtczsKLQotY2hhciAqZmluZF9mbGF0X2R0X3N0cmluZyh1MzIgb2Zmc2V0KQorY2hhciAqb2ZfZmR0X2dldF9zdHJpbmcoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpibG9iLCB1MzIgb2Zmc2V0KQogewotCXJldHVybiAoKGNoYXIgKilpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJpbmdzKSArIG9mZnNldDsKKwlyZXR1cm4gKChjaGFyICopYmxvYikgKworCQliZTMyX3RvX2NwdShibG9iLT5vZmZfZHRfc3RyaW5ncykgKyBvZmZzZXQ7CiB9CiAKIC8qKgotICogb2Zfc2Nhbl9mbGF0X2R0IC0gc2NhbiBmbGF0dGVuZWQgdHJlZSBibG9iIGFuZCBjYWxsIGNhbGxiYWNrIG9uIGVhY2guCi0gKiBAaXQ6IGNhbGxiYWNrIGZ1bmN0aW9uCi0gKiBAZGF0YTogY29udGV4dCBkYXRhIHBvaW50ZXIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2NhbiB0aGUgZmxhdHRlbmVkIGRldmljZS10cmVlLCBpdCBpcwotICogdXNlZCB0byBleHRyYWN0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXQgYm9vdCBiZWZvcmUgd2UgY2FuCi0gKiB1bmZsYXR0ZW4gdGhlIHRyZWUKKyAqIG9mX2ZkdF9nZXRfcHJvcGVydHkgLSBHaXZlbiBhIG5vZGUgaW4gdGhlIGdpdmVuIGZsYXQgYmxvYiwgcmV0dXJuCisgKiB0aGUgcHJvcGVydHkgcHRyCiAgKi8KLWludCBfX2luaXQgb2Zfc2Nhbl9mbGF0X2R0KGludCAoKml0KSh1bnNpZ25lZCBsb25nIG5vZGUsCi0JCQkJICAgICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLAotCQkJCSAgICAgdm9pZCAqZGF0YSksCi0JCQkgICB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOwotCWludCByYyA9IDA7Ci0JaW50IGRlcHRoID0gLTE7Ci0KLQlkbyB7Ci0JCXUzMiB0YWcgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApOwotCQljaGFyICpwYXRocDsKLQotCQlwICs9IDQ7Ci0JCWlmICh0YWcgPT0gT0ZfRFRfRU5EX05PREUpIHsKLQkJCWRlcHRoLS07Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAodGFnID09IE9GX0RUX05PUCkKLQkJCWNvbnRpbnVlOwotCQlpZiAodGFnID09IE9GX0RUX0VORCkKLQkJCWJyZWFrOwotCQlpZiAodGFnID09IE9GX0RUX1BST1ApIHsKLQkJCXUzMiBzeiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7Ci0JCQlwICs9IDg7Ci0JCQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dmVyc2lvbikgPCAweDEwKQotCQkJCXAgPSBBTElHTihwLCBzeiA+PSA4ID8gOCA6IDQpOwotCQkJcCArPSBzejsKLQkJCXAgPSBBTElHTihwLCA0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh0YWcgIT0gT0ZfRFRfQkVHSU5fTk9ERSkgewotCQkJcHJfZXJyKCJJbnZhbGlkIHRhZyAleCBpbiBmbGF0IGRldmljZSB0cmVlIVxuIiwgdGFnKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWRlcHRoKys7Ci0JCXBhdGhwID0gKGNoYXIgKilwOwotCQlwID0gQUxJR04ocCArIHN0cmxlbihwYXRocCkgKyAxLCA0KTsKLQkJaWYgKCgqcGF0aHApID09ICcvJykgewotCQkJY2hhciAqbHAsICpucDsKLQkJCWZvciAobHAgPSBOVUxMLCBucCA9IHBhdGhwOyAqbnA7IG5wKyspCi0JCQkJaWYgKCgqbnApID09ICcvJykKLQkJCQkJbHAgPSBucCsxOwotCQkJaWYgKGxwICE9IE5VTEwpCi0JCQkJcGF0aHAgPSBscDsKLQkJfQotCQlyYyA9IGl0KHAsIHBhdGhwLCBkZXB0aCwgZGF0YSk7Ci0JCWlmIChyYyAhPSAwKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAoMSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKgotICogb2ZfZ2V0X2ZsYXRfZHRfcm9vdCAtIGZpbmQgdGhlIHJvb3Qgbm9kZSBpbiB0aGUgZmxhdCBibG9iCi0gKi8KLXVuc2lnbmVkIGxvbmcgX19pbml0IG9mX2dldF9mbGF0X2R0X3Jvb3Qodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHAgPSAoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcykgKwotCQliZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT5vZmZfZHRfc3RydWN0KTsKLQotCXdoaWxlIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApID09IE9GX0RUX05PUCkKLQkJcCArPSA0OwotCUJVR19PTihiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApICE9IE9GX0RUX0JFR0lOX05PREUpOwotCXAgKz0gNDsKLQlyZXR1cm4gQUxJR04ocCArIHN0cmxlbigoY2hhciAqKXApICsgMSwgNCk7Ci19Ci0KLS8qKgotICogb2ZfZ2V0X2ZsYXRfZHRfcHJvcCAtIEdpdmVuIGEgbm9kZSBpbiB0aGUgZmxhdCBibG9iLCByZXR1cm4gdGhlIHByb3BlcnR5IHB0cgotICoKLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2l0aGluIHNjYW5fZmxhdHRlbmVkX2R0IGNhbGxiYWNrIHRvIGdldAotICogYWNjZXNzIHRvIHByb3BlcnRpZXMKLSAqLwotdm9pZCAqX19pbml0IG9mX2dldF9mbGF0X2R0X3Byb3AodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSB1bnNpZ25lZCBsb25nICpzaXplKQordm9pZCAqb2ZfZmR0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplKQogewogCXVuc2lnbmVkIGxvbmcgcCA9IG5vZGU7CiAKQEAgLTEzNywxMCArNTQsMTAgQEAKIAkJc3ogPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApOwogCQlub2ZmID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikocCArIDQpKTsKIAkJcCArPSA4OwotCQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dmVyc2lvbikgPCAweDEwKQorCQlpZiAoYmUzMl90b19jcHUoYmxvYi0+dmVyc2lvbikgPCAweDEwKQogCQkJcCA9IEFMSUdOKHAsIHN6ID49IDggPyA4IDogNCk7CiAKLQkJbnN0ciA9IGZpbmRfZmxhdF9kdF9zdHJpbmcobm9mZik7CisJCW5zdHIgPSBvZl9mZHRfZ2V0X3N0cmluZyhibG9iLCBub2ZmKTsKIAkJaWYgKG5zdHIgPT0gTlVMTCkgewogCQkJcHJfd2FybmluZygiQ2FuJ3QgZmluZCBwcm9wZXJ0eSBpbmRleCBuYW1lICFcbiIpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0xNTYsMjEgKzczLDI4IEBACiB9CiAKIC8qKgotICogb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlIC0gUmV0dXJuIHRydWUgaWYgZ2l2ZW4gbm9kZSBoYXMgY29tcGF0IGluIGNvbXBhdGlibGUgbGlzdAorICogb2ZfZmR0X2lzX2NvbXBhdGlibGUgLSBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBub2RlIGZyb20gdGhlIGdpdmVuIGJsb2IgaGFzCisgKiBjb21wYXQgaW4gaXRzIGNvbXBhdGlibGUgbGlzdAorICogQGJsb2I6IEEgZGV2aWNlIHRyZWUgYmxvYgogICogQG5vZGU6IG5vZGUgdG8gdGVzdAogICogQGNvbXBhdDogY29tcGF0aWJsZSBzdHJpbmcgdG8gY29tcGFyZSB3aXRoIGNvbXBhdGlibGUgbGlzdC4KKyAqCisgKiBPbiBtYXRjaCwgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIHdpdGggc21hbGxlciB2YWx1ZXMgcmV0dXJuZWQgZm9yIG1vcmUKKyAqIHNwZWNpZmljIGNvbXBhdGlibGUgdmFsdWVzLgogICovCi1pbnQgX19pbml0IG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZSh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKmNvbXBhdCkKK2ludCBvZl9mZHRfaXNfY29tcGF0aWJsZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqY29tcGF0KQogewogCWNvbnN0IGNoYXIgKmNwOwotCXVuc2lnbmVkIGxvbmcgY3BsZW4sIGw7CisJdW5zaWduZWQgbG9uZyBjcGxlbiwgbCwgc2NvcmUgPSAwOwogCi0JY3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwljcCA9IG9mX2ZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOwogCWlmIChjcCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAl3aGlsZSAoY3BsZW4gPiAwKSB7CisJCXNjb3JlKys7CiAJCWlmIChvZl9jb21wYXRfY21wKGNwLCBjb21wYXQsIHN0cmxlbihjb21wYXQpKSA9PSAwKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gc2NvcmU7CiAJCWwgPSBzdHJsZW4oY3ApICsgMTsKIAkJY3AgKz0gbDsKIAkJY3BsZW4gLT0gbDsKQEAgLTE3OSw3ICsxMDMsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgKl9faW5pdCB1bmZsYXR0ZW5fZHRfYWxsb2ModW5zaWduZWQgbG9uZyAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUsCisvKioKKyAqIG9mX2ZkdF9tYXRjaCAtIFJldHVybiB0cnVlIGlmIG5vZGUgbWF0Y2hlcyBhIGxpc3Qgb2YgY29tcGF0aWJsZSB2YWx1ZXMKKyAqLworaW50IG9mX2ZkdF9tYXRjaChzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsIHVuc2lnbmVkIGxvbmcgbm9kZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmNvbXBhdCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wLCBzY29yZSA9IDA7CisKKwlpZiAoIWNvbXBhdCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKmNvbXBhdCkgeworCQl0bXAgPSBvZl9mZHRfaXNfY29tcGF0aWJsZShibG9iLCBub2RlLCAqY29tcGF0KTsKKwkJaWYgKHRtcCAmJiAoc2NvcmUgPT0gMCB8fCAodG1wIDwgc2NvcmUpKSkKKwkJCXNjb3JlID0gdG1wOworCQljb21wYXQrKzsKKwl9CisKKwlyZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyB2b2lkICp1bmZsYXR0ZW5fZHRfYWxsb2ModW5zaWduZWQgbG9uZyAqbWVtLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ24pCiB7CiAJdm9pZCAqcmVzOwpAQCAtMTkzLDE2ICsxMzgsMTggQEAKIAogLyoqCiAgKiB1bmZsYXR0ZW5fZHRfbm9kZSAtIEFsbG9jIGFuZCBwb3B1bGF0ZSBhIGRldmljZV9ub2RlIGZyb20gdGhlIGZsYXQgdHJlZQorICogQGJsb2I6IFRoZSBwYXJlbnQgZGV2aWNlIHRyZWUgYmxvYgogICogQHA6IHBvaW50ZXIgdG8gbm9kZSBpbiBmbGF0IHRyZWUKICAqIEBkYWQ6IFBhcmVudCBzdHJ1Y3QgZGV2aWNlX25vZGUKICAqIEBhbGxuZXh0cHA6IHBvaW50ZXIgdG8gLT5hbGxuZXh0IGZyb20gbGFzdCBhbGxvY2F0ZWQgZGV2aWNlX25vZGUKICAqIEBmcHNpemU6IFNpemUgb2YgdGhlIG5vZGUgcGF0aCB1cCBhdCB0aGUgY3VycmVudCBkZXB0aC4KICAqLwotdW5zaWduZWQgbG9uZyBfX2luaXQgdW5mbGF0dGVuX2R0X25vZGUodW5zaWduZWQgbG9uZyBtZW0sCi0JCQkJCXVuc2lnbmVkIGxvbmcgKnAsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGFkLAotCQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKioqYWxsbmV4dHBwLAotCQkJCQl1bnNpZ25lZCBsb25nIGZwc2l6ZSkKK3Vuc2lnbmVkIGxvbmcgdW5mbGF0dGVuX2R0X25vZGUoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpibG9iLAorCQkJCXVuc2lnbmVkIGxvbmcgbWVtLAorCQkJCXVuc2lnbmVkIGxvbmcgKnAsCisJCQkJc3RydWN0IGRldmljZV9ub2RlICpkYWQsCisJCQkJc3RydWN0IGRldmljZV9ub2RlICoqKmFsbG5leHRwcCwKKwkJCQl1bnNpZ25lZCBsb25nIGZwc2l6ZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHAsICoqcHJldl9wcCA9IE5VTEw7CkBAIC0yOTgsMTAgKzI0NSwxMCBAQAogCQlzeiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKCpwKSk7CiAJCW5vZmYgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSgoKnApICsgNCkpOwogCQkqcCArPSA4OwotCQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dmVyc2lvbikgPCAweDEwKQorCQlpZiAoYmUzMl90b19jcHUoYmxvYi0+dmVyc2lvbikgPCAweDEwKQogCQkJKnAgPSBBTElHTigqcCwgc3ogPj0gOCA/IDggOiA0KTsKIAotCQlwbmFtZSA9IGZpbmRfZmxhdF9kdF9zdHJpbmcobm9mZik7CisJCXBuYW1lID0gb2ZfZmR0X2dldF9zdHJpbmcoYmxvYiwgbm9mZik7CiAJCWlmIChwbmFtZSA9PSBOVUxMKSB7CiAJCQlwcl9pbmZvKCJDYW4ndCBmaW5kIHByb3BlcnR5IG5hbWUgaW4gbGlzdCAhXG4iKTsKIAkJCWJyZWFrOwpAQCAtMzgwLDcgKzMyNyw4IEBACiAJCWlmICh0YWcgPT0gT0ZfRFRfTk9QKQogCQkJKnAgKz0gNDsKIAkJZWxzZQotCQkJbWVtID0gdW5mbGF0dGVuX2R0X25vZGUobWVtLCBwLCBucCwgYWxsbmV4dHBwLCBmcHNpemUpOworCQkJbWVtID0gdW5mbGF0dGVuX2R0X25vZGUoYmxvYiwgbWVtLCBwLCBucCwgYWxsbmV4dHBwLAorCQkJCQkJZnBzaXplKTsKIAkJdGFnID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikoKnApKTsKIAl9CiAJaWYgKHRhZyAhPSBPRl9EVF9FTkRfTk9ERSkgewpAQCAtMzkxLDYgKzMzOSwyMTEgQEAKIAlyZXR1cm4gbWVtOwogfQogCisvKioKKyAqIF9fdW5mbGF0dGVuX2RldmljZV90cmVlIC0gY3JlYXRlIHRyZWUgb2YgZGV2aWNlX25vZGVzIGZyb20gZmxhdCBibG9iCisgKgorICogdW5mbGF0dGVucyBhIGRldmljZS10cmVlLCBjcmVhdGluZyB0aGUKKyAqIHRyZWUgb2Ygc3RydWN0IGRldmljZV9ub2RlLiBJdCBhbHNvIGZpbGxzIHRoZSAibmFtZSIgYW5kICJ0eXBlIgorICogcG9pbnRlcnMgb2YgdGhlIG5vZGVzIHNvIHRoZSBub3JtYWwgZGV2aWNlLXRyZWUgd2Fsa2luZyBmdW5jdGlvbnMKKyAqIGNhbiBiZSB1c2VkLgorICogQGJsb2I6IFRoZSBibG9iIHRvIGV4cGFuZAorICogQG15bm9kZXM6IFRoZSBkZXZpY2Vfbm9kZSB0cmVlIGNyZWF0ZWQgYnkgdGhlIGNhbGwKKyAqIEBkdF9hbGxvYzogQW4gYWxsb2NhdG9yIHRoYXQgcHJvdmlkZXMgYSB2aXJ0dWFsIGFkZHJlc3MgdG8gbWVtb3J5CisgKiBmb3IgdGhlIHJlc3VsdGluZyB0cmVlCisgKi8KK3ZvaWQgX191bmZsYXR0ZW5fZGV2aWNlX3RyZWUoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpibG9iLAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipteW5vZGVzLAorCQkJICAgICB2b2lkICogKCpkdF9hbGxvYykodTY0IHNpemUsIHU2NCBhbGlnbikpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgbWVtLCBzaXplOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKmFsbG5leHRwID0gbXlub2RlczsKKworCXByX2RlYnVnKCIgLT4gdW5mbGF0dGVuX2RldmljZV90cmVlKClcbiIpOworCisJaWYgKCFibG9iKSB7CisJCXByX2RlYnVnKCJObyBkZXZpY2UgdHJlZSBwb2ludGVyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCJVbmZsYXR0ZW5pbmcgZGV2aWNlIHRyZWU6XG4iKTsKKwlwcl9kZWJ1ZygibWFnaWM6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGJsb2ItPm1hZ2ljKSk7CisJcHJfZGVidWcoInNpemU6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGJsb2ItPnRvdGFsc2l6ZSkpOworCXByX2RlYnVnKCJ2ZXJzaW9uOiAlMDh4XG4iLCBiZTMyX3RvX2NwdShibG9iLT52ZXJzaW9uKSk7CisKKwlpZiAoYmUzMl90b19jcHUoYmxvYi0+bWFnaWMpICE9IE9GX0RUX0hFQURFUikgeworCQlwcl9lcnIoIkludmFsaWQgZGV2aWNlIHRyZWUgYmxvYiBoZWFkZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogRmlyc3QgcGFzcywgc2NhbiBmb3Igc2l6ZSAqLworCXN0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKWJsb2IpICsKKwkJYmUzMl90b19jcHUoYmxvYi0+b2ZmX2R0X3N0cnVjdCk7CisJc2l6ZSA9IHVuZmxhdHRlbl9kdF9ub2RlKGJsb2IsIDAsICZzdGFydCwgTlVMTCwgTlVMTCwgMCk7CisJc2l6ZSA9IChzaXplIHwgMykgKyAxOworCisJcHJfZGVidWcoIiAgc2l6ZSBpcyAlbHgsIGFsbG9jYXRpbmcuLi5cbiIsIHNpemUpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZXhwYW5kZWQgZGV2aWNlIHRyZWUgKi8KKwltZW0gPSAodW5zaWduZWQgbG9uZykKKwkJZHRfYWxsb2Moc2l6ZSArIDQsIF9fYWxpZ25vZl9fKHN0cnVjdCBkZXZpY2Vfbm9kZSkpOworCisJKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSA9IGNwdV90b19iZTMyKDB4ZGVhZGJlZWYpOworCisJcHJfZGVidWcoIiAgdW5mbGF0dGVuaW5nICVseC4uLlxuIiwgbWVtKTsKKworCS8qIFNlY29uZCBwYXNzLCBkbyBhY3R1YWwgdW5mbGF0dGVuaW5nICovCisJc3RhcnQgPSAoKHVuc2lnbmVkIGxvbmcpYmxvYikgKworCQliZTMyX3RvX2NwdShibG9iLT5vZmZfZHRfc3RydWN0KTsKKwl1bmZsYXR0ZW5fZHRfbm9kZShibG9iLCBtZW0sICZzdGFydCwgTlVMTCwgJmFsbG5leHRwLCAwKTsKKwlpZiAoYmUzMl90b19jcHVwKChfX2JlMzIgKilzdGFydCkgIT0gT0ZfRFRfRU5EKQorCQlwcl93YXJuaW5nKCJXZWlyZCB0YWcgYXQgZW5kIG9mIHRyZWU6ICUwOHhcbiIsICooKHUzMiAqKXN0YXJ0KSk7CisJaWYgKGJlMzJfdG9fY3B1KCgoX19iZTMyICopbWVtKVtzaXplIC8gNF0pICE9IDB4ZGVhZGJlZWYpCisJCXByX3dhcm5pbmcoIkVuZCBvZiB0cmVlIG1hcmtlciBvdmVyd3JpdHRlbjogJTA4eFxuIiwKKwkJCSAgIGJlMzJfdG9fY3B1KCgoX19iZTMyICopbWVtKVtzaXplIC8gNF0pKTsKKwkqYWxsbmV4dHAgPSBOVUxMOworCisJcHJfZGVidWcoIiA8LSB1bmZsYXR0ZW5fZGV2aWNlX3RyZWUoKVxuIik7Cit9CisKK3N0YXRpYyB2b2lkICprZXJuZWxfdHJlZV9hbGxvYyh1NjQgc2l6ZSwgdTY0IGFsaWduKQoreworCXJldHVybiBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfQorCisvKioKKyAqIG9mX2ZkdF91bmZsYXR0ZW5fdHJlZSAtIGNyZWF0ZSB0cmVlIG9mIGRldmljZV9ub2RlcyBmcm9tIGZsYXQgYmxvYgorICoKKyAqIHVuZmxhdHRlbnMgdGhlIGRldmljZS10cmVlIHBhc3NlZCBieSB0aGUgZmlybXdhcmUsIGNyZWF0aW5nIHRoZQorICogdHJlZSBvZiBzdHJ1Y3QgZGV2aWNlX25vZGUuIEl0IGFsc28gZmlsbHMgdGhlICJuYW1lIiBhbmQgInR5cGUiCisgKiBwb2ludGVycyBvZiB0aGUgbm9kZXMgc28gdGhlIG5vcm1hbCBkZXZpY2UtdHJlZSB3YWxraW5nIGZ1bmN0aW9ucworICogY2FuIGJlIHVzZWQuCisgKi8KK3ZvaWQgb2ZfZmR0X3VuZmxhdHRlbl90cmVlKHVuc2lnbmVkIGxvbmcgKmJsb2IsCisJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKipteW5vZGVzKQoreworCXN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqZGV2aWNlX3RyZWUgPQorCQkoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopYmxvYjsKKwlfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShkZXZpY2VfdHJlZSwgbXlub2RlcywgJmtlcm5lbF90cmVlX2FsbG9jKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2ZkdF91bmZsYXR0ZW5fdHJlZSk7CisKKy8qIEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSByZWZlcmVuY2VzIGluaXRpYWxfYm9vdF9wYXJhbXMgZGlyZWN0bHkuICovCitpbnQgX19pbml0ZGF0YSBkdF9yb290X2FkZHJfY2VsbHM7CitpbnQgX19pbml0ZGF0YSBkdF9yb290X3NpemVfY2VsbHM7CisKK3N0cnVjdCBib290X3BhcmFtX2hlYWRlciAqaW5pdGlhbF9ib290X3BhcmFtczsKKworI2lmZGVmIENPTkZJR19PRl9FQVJMWV9GTEFUVFJFRQorCisvKioKKyAqIG9mX3NjYW5fZmxhdF9kdCAtIHNjYW4gZmxhdHRlbmVkIHRyZWUgYmxvYiBhbmQgY2FsbCBjYWxsYmFjayBvbiBlYWNoLgorICogQGl0OiBjYWxsYmFjayBmdW5jdGlvbgorICogQGRhdGE6IGNvbnRleHQgZGF0YSBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNjYW4gdGhlIGZsYXR0ZW5lZCBkZXZpY2UtdHJlZSwgaXQgaXMKKyAqIHVzZWQgdG8gZXh0cmFjdCB0aGUgbWVtb3J5IGluZm9ybWF0aW9uIGF0IGJvb3QgYmVmb3JlIHdlIGNhbgorICogdW5mbGF0dGVuIHRoZSB0cmVlCisgKi8KK2ludCBfX2luaXQgb2Zfc2Nhbl9mbGF0X2R0KGludCAoKml0KSh1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJICAgICBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLAorCQkJCSAgICAgdm9pZCAqZGF0YSksCisJCQkgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCisJCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOworCWludCByYyA9IDA7CisJaW50IGRlcHRoID0gLTE7CisKKwlkbyB7CisJCXUzMiB0YWcgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApOworCQljaGFyICpwYXRocDsKKworCQlwICs9IDQ7CisJCWlmICh0YWcgPT0gT0ZfRFRfRU5EX05PREUpIHsKKwkJCWRlcHRoLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodGFnID09IE9GX0RUX05PUCkKKwkJCWNvbnRpbnVlOworCQlpZiAodGFnID09IE9GX0RUX0VORCkKKwkJCWJyZWFrOworCQlpZiAodGFnID09IE9GX0RUX1BST1ApIHsKKwkJCXUzMiBzeiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7CisJCQlwICs9IDg7CisJCQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dmVyc2lvbikgPCAweDEwKQorCQkJCXAgPSBBTElHTihwLCBzeiA+PSA4ID8gOCA6IDQpOworCQkJcCArPSBzejsKKwkJCXAgPSBBTElHTihwLCA0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0YWcgIT0gT0ZfRFRfQkVHSU5fTk9ERSkgeworCQkJcHJfZXJyKCJJbnZhbGlkIHRhZyAleCBpbiBmbGF0IGRldmljZSB0cmVlIVxuIiwgdGFnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWRlcHRoKys7CisJCXBhdGhwID0gKGNoYXIgKilwOworCQlwID0gQUxJR04ocCArIHN0cmxlbihwYXRocCkgKyAxLCA0KTsKKwkJaWYgKCgqcGF0aHApID09ICcvJykgeworCQkJY2hhciAqbHAsICpucDsKKwkJCWZvciAobHAgPSBOVUxMLCBucCA9IHBhdGhwOyAqbnA7IG5wKyspCisJCQkJaWYgKCgqbnApID09ICcvJykKKwkJCQkJbHAgPSBucCsxOworCQkJaWYgKGxwICE9IE5VTEwpCisJCQkJcGF0aHAgPSBscDsKKwkJfQorCQlyYyA9IGl0KHAsIHBhdGhwLCBkZXB0aCwgZGF0YSk7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogb2ZfZ2V0X2ZsYXRfZHRfcm9vdCAtIGZpbmQgdGhlIHJvb3Qgbm9kZSBpbiB0aGUgZmxhdCBibG9iCisgKi8KK3Vuc2lnbmVkIGxvbmcgX19pbml0IG9mX2dldF9mbGF0X2R0X3Jvb3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHAgPSAoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcykgKworCQliZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT5vZmZfZHRfc3RydWN0KTsKKworCXdoaWxlIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApID09IE9GX0RUX05PUCkKKwkJcCArPSA0OworCUJVR19PTihiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXApICE9IE9GX0RUX0JFR0lOX05PREUpOworCXAgKz0gNDsKKwlyZXR1cm4gQUxJR04ocCArIHN0cmxlbigoY2hhciAqKXApICsgMSwgNCk7Cit9CisKKy8qKgorICogb2ZfZ2V0X2ZsYXRfZHRfcHJvcCAtIEdpdmVuIGEgbm9kZSBpbiB0aGUgZmxhdCBibG9iLCByZXR1cm4gdGhlIHByb3BlcnR5IHB0cgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgd2l0aGluIHNjYW5fZmxhdHRlbmVkX2R0IGNhbGxiYWNrIHRvIGdldAorICogYWNjZXNzIHRvIHByb3BlcnRpZXMKKyAqLwordm9pZCAqX19pbml0IG9mX2dldF9mbGF0X2R0X3Byb3AodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXJldHVybiBvZl9mZHRfZ2V0X3Byb3BlcnR5KGluaXRpYWxfYm9vdF9wYXJhbXMsIG5vZGUsIG5hbWUsIHNpemUpOworfQorCisvKioKKyAqIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZSAtIFJldHVybiB0cnVlIGlmIGdpdmVuIG5vZGUgaGFzIGNvbXBhdCBpbiBjb21wYXRpYmxlIGxpc3QKKyAqIEBub2RlOiBub2RlIHRvIHRlc3QKKyAqIEBjb21wYXQ6IGNvbXBhdGlibGUgc3RyaW5nIHRvIGNvbXBhcmUgd2l0aCBjb21wYXRpYmxlIGxpc3QuCisgKi8KK2ludCBfX2luaXQgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqY29tcGF0KQoreworCXJldHVybiBvZl9mZHRfaXNfY29tcGF0aWJsZShpbml0aWFsX2Jvb3RfcGFyYW1zLCBub2RlLCBjb21wYXQpOworfQorCisvKioKKyAqIG9mX2ZsYXRfZHRfbWF0Y2ggLSBSZXR1cm4gdHJ1ZSBpZiBub2RlIG1hdGNoZXMgYSBsaXN0IG9mIGNvbXBhdGlibGUgdmFsdWVzCisgKi8KK2ludCBfX2luaXQgb2ZfZmxhdF9kdF9tYXRjaCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKipjb21wYXQpCit7CisJcmV0dXJuIG9mX2ZkdF9tYXRjaChpbml0aWFsX2Jvb3RfcGFyYW1zLCBub2RlLCBjb21wYXQpOworfQorCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAvKioKICAqIGVhcmx5X2luaXRfZHRfY2hlY2tfZm9yX2luaXRyZCAtIERlY29kZSBpbml0cmQgbG9jYXRpb24gZnJvbSBmbGF0IHRyZWUKQEAgLTUzOSw2ICs2OTIsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQgKl9faW5pdCBlYXJseV9kZXZpY2VfdHJlZV9hbGxvYyh1NjQgc2l6ZSwgdTY0IGFsaWduKQoreworCXVuc2lnbmVkIGxvbmcgbWVtID0gZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaChzaXplLCBhbGlnbik7CisJcmV0dXJuIF9fdmEobWVtKTsKK30KKwogLyoqCiAgKiB1bmZsYXR0ZW5fZGV2aWNlX3RyZWUgLSBjcmVhdGUgdHJlZSBvZiBkZXZpY2Vfbm9kZXMgZnJvbSBmbGF0IGJsb2IKICAqCkBAIC01NDksNTggKzcwOCwxMyBAQAogICovCiB2b2lkIF9faW5pdCB1bmZsYXR0ZW5fZGV2aWNlX3RyZWUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBtZW0sIHNpemU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICoqYWxsbmV4dHAgPSAmYWxsbm9kZXM7Ci0KLQlwcl9kZWJ1ZygiIC0+IHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpXG4iKTsKLQotCWlmICghaW5pdGlhbF9ib290X3BhcmFtcykgewotCQlwcl9kZWJ1ZygiTm8gZGV2aWNlIHRyZWUgcG9pbnRlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9kZWJ1ZygiVW5mbGF0dGVuaW5nIGRldmljZSB0cmVlOlxuIik7Ci0JcHJfZGVidWcoIm1hZ2ljOiAlMDh4XG4iLCBiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT5tYWdpYykpOwotCXByX2RlYnVnKCJzaXplOiAlMDh4XG4iLCBiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT50b3RhbHNpemUpKTsKLQlwcl9kZWJ1ZygidmVyc2lvbjogJTA4eFxuIiwgYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+dmVyc2lvbikpOwotCi0JaWYgKGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm1hZ2ljKSAhPSBPRl9EVF9IRUFERVIpIHsKLQkJcHJfZXJyKCJJbnZhbGlkIGRldmljZSB0cmVlIGJsb2IgaGVhZGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEZpcnN0IHBhc3MsIHNjYW4gZm9yIHNpemUgKi8KLQlzdGFydCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOwotCXNpemUgPSB1bmZsYXR0ZW5fZHRfbm9kZSgwLCAmc3RhcnQsIE5VTEwsIE5VTEwsIDApOwotCXNpemUgPSAoc2l6ZSB8IDMpICsgMTsKLQotCXByX2RlYnVnKCIgIHNpemUgaXMgJWx4LCBhbGxvY2F0aW5nLi4uXG4iLCBzaXplKTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGV4cGFuZGVkIGRldmljZSB0cmVlICovCi0JbWVtID0gZWFybHlfaW5pdF9kdF9hbGxvY19tZW1vcnlfYXJjaChzaXplICsgNCwKLQkJCV9fYWxpZ25vZl9fKHN0cnVjdCBkZXZpY2Vfbm9kZSkpOwotCW1lbSA9ICh1bnNpZ25lZCBsb25nKSBfX3ZhKG1lbSk7Ci0KLQkoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdID0gY3B1X3RvX2JlMzIoMHhkZWFkYmVlZik7Ci0KLQlwcl9kZWJ1ZygiICB1bmZsYXR0ZW5pbmcgJWx4Li4uXG4iLCBtZW0pOwotCi0JLyogU2Vjb25kIHBhc3MsIGRvIGFjdHVhbCB1bmZsYXR0ZW5pbmcgKi8KLQlzdGFydCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOwotCXVuZmxhdHRlbl9kdF9ub2RlKG1lbSwgJnN0YXJ0LCBOVUxMLCAmYWxsbmV4dHAsIDApOwotCWlmIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXN0YXJ0KSAhPSBPRl9EVF9FTkQpCi0JCXByX3dhcm5pbmcoIldlaXJkIHRhZyBhdCBlbmQgb2YgdHJlZTogJTA4eFxuIiwgKigodTMyICopc3RhcnQpKTsKLQlpZiAoYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkgIT0gMHhkZWFkYmVlZikKLQkJcHJfd2FybmluZygiRW5kIG9mIHRyZWUgbWFya2VyIG92ZXJ3cml0dGVuOiAlMDh4XG4iLAotCQkJICAgYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkpOwotCSphbGxuZXh0cCA9IE5VTEw7CisJX191bmZsYXR0ZW5fZGV2aWNlX3RyZWUoaW5pdGlhbF9ib290X3BhcmFtcywgJmFsbG5vZGVzLAorCQkJCWVhcmx5X2RldmljZV90cmVlX2FsbG9jKTsKIAogCS8qIEdldCBwb2ludGVyIHRvIE9GICIvY2hvc2VuIiBub2RlIGZvciB1c2UgZXZlcnl3aGVyZSAqLwogCW9mX2Nob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuIik7CiAJaWYgKG9mX2Nob3NlbiA9PSBOVUxMKQogCQlvZl9jaG9zZW4gPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nob3NlbkAwIik7Ci0KLQlwcl9kZWJ1ZygiIDwtIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpXG4iKTsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9FQVJMWV9GTEFUVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9tZGlvLmMgYi9kcml2ZXJzL29mL29mX21kaW8uYwppbmRleCAxZmNlMDBlLi5kY2Q3ODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX21kaW8uYworKysgYi9kcml2ZXJzL29mL29mX21kaW8uYwpAQCAtNTIsMjcgKzUyLDM1IEBACiAKIAkvKiBMb29wIG92ZXIgdGhlIGNoaWxkIG5vZGVzIGFuZCByZWdpc3RlciBhIHBoeV9kZXZpY2UgZm9yIGVhY2ggb25lICovCiAJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKLQkJY29uc3QgX19iZTMyICphZGRyOworCQljb25zdCBfX2JlMzIgKnBhZGRyOworCQl1MzIgYWRkcjsKIAkJaW50IGxlbjsKIAogCQkvKiBBIFBIWSBtdXN0IGhhdmUgYSByZWcgcHJvcGVydHkgaW4gdGhlIHJhbmdlIFswLTMxXSAqLwotCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgJmxlbik7Ci0JCWlmICghYWRkciB8fCBsZW4gPCBzaXplb2YoKmFkZHIpIHx8ICphZGRyID49IDMyIHx8ICphZGRyIDwgMCkgeworCQlwYWRkciA9IG9mX2dldF9wcm9wZXJ0eShjaGlsZCwgInJlZyIsICZsZW4pOworCQlpZiAoIXBhZGRyIHx8IGxlbiA8IHNpemVvZigqcGFkZHIpKSB7CiAJCQlkZXZfZXJyKCZtZGlvLT5kZXYsICIlcyBoYXMgaW52YWxpZCBQSFkgYWRkcmVzc1xuIiwKIAkJCQljaGlsZC0+ZnVsbF9uYW1lKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKG1kaW8tPmlycSkgewotCQkJbWRpby0+aXJxWyphZGRyXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGNoaWxkLCAwKTsKLQkJCWlmICghbWRpby0+aXJxWyphZGRyXSkKLQkJCQltZGlvLT5pcnFbKmFkZHJdID0gUEhZX1BPTEw7CisJCWFkZHIgPSBiZTMyX3RvX2NwdXAocGFkZHIpOworCQlpZiAoYWRkciA+PSAzMikgeworCQkJZGV2X2VycigmbWRpby0+ZGV2LCAiJXMgUEhZIGFkZHJlc3MgJWkgaXMgdG9vIGxhcmdlXG4iLAorCQkJCWNoaWxkLT5mdWxsX25hbWUsIGFkZHIpOworCQkJY29udGludWU7CiAJCX0KIAotCQlwaHkgPSBnZXRfcGh5X2RldmljZShtZGlvLCBiZTMyX3RvX2NwdXAoYWRkcikpOworCQlpZiAobWRpby0+aXJxKSB7CisJCQltZGlvLT5pcnFbYWRkcl0gPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChjaGlsZCwgMCk7CisJCQlpZiAoIW1kaW8tPmlycVthZGRyXSkKKwkJCQltZGlvLT5pcnFbYWRkcl0gPSBQSFlfUE9MTDsKKwkJfQorCisJCXBoeSA9IGdldF9waHlfZGV2aWNlKG1kaW8sIGFkZHIpOwogCQlpZiAoIXBoeSB8fCBJU19FUlIocGh5KSkgewogCQkJZGV2X2VycigmbWRpby0+ZGV2LCAiZXJyb3IgcHJvYmluZyBQSFkgYXQgYWRkcmVzcyAlaVxuIiwKLQkJCQkqYWRkcik7CisJCQkJYWRkcik7CiAJCQljb250aW51ZTsKIAkJfQogCQlwaHlfc2Nhbl9maXh1cHMocGh5KTsKQEAgLTkxLDcgKzk5LDcgQEAKIAkJfQogCiAJCWRldl9kYmcoJm1kaW8tPmRldiwgInJlZ2lzdGVyZWQgcGh5ICVzIGF0IGFkZHJlc3MgJWlcbiIsCi0JCQljaGlsZC0+bmFtZSwgKmFkZHIpOworCQkJY2hpbGQtPm5hbWUsIGFkZHIpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9uZXQuYyBiL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmMzM0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIE9GIGhlbHBlcnMgZm9yIG5ldHdvcmsgZGV2aWNlcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogSW5pdGlhbGx5IGNvcGllZCBvdXQgb2YgYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisKKy8qKgorICogU2VhcmNoIHRoZSBkZXZpY2UgdHJlZSBmb3IgdGhlIGJlc3QgTUFDIGFkZHJlc3MgdG8gdXNlLiAgJ21hYy1hZGRyZXNzJyBpcworICogY2hlY2tlZCBmaXJzdCwgYmVjYXVzZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdG8gIm1vc3QgcmVjZW50IiBNQUMKKyAqIGFkZHJlc3MuIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuICdsb2NhbC1tYWMtYWRkcmVzcycgaXMgY2hlY2tlZCBuZXh0LAorICogYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IGFkZHJlc3MuICBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiB0aGUgb2Jzb2xldGUKKyAqICdhZGRyZXNzJyBpcyBjaGVja2VkLCBqdXN0IGluIGNhc2Ugd2UncmUgdXNpbmcgYW4gb2xkIGRldmljZSB0cmVlLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgJ2FkZHJlc3MnIHByb3BlcnR5IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYSB2aXJ0dWFsIGFkZHJlc3Mgb2YKKyAqIHRoZSByZWdpc3RlciBzZXQsIGJ1dCBzb21lIERUUyBmaWxlcyBoYXZlIHJlZGVmaW5lZCB0aGF0IHByb3BlcnR5IHRvIGJlIHRoZQorICogTUFDIGFkZHJlc3MuCisgKgorICogQWxsLXplcm8gTUFDIGFkZHJlc3NlcyBhcmUgcmVqZWN0ZWQsIGJlY2F1c2UgdGhvc2UgY291bGQgYmUgcHJvcGVydGllcyB0aGF0CisgKiBleGlzdCBpbiB0aGUgZGV2aWNlIHRyZWUsIGJ1dCB3ZXJlIG5vdCBzZXQgYnkgVS1Cb290LiAgRm9yIGV4YW1wbGUsIHRoZQorICogRFRTIGNvdWxkIGRlZmluZSAnbWFjLWFkZHJlc3MnIGFuZCAnbG9jYWwtbWFjLWFkZHJlc3MnLCB3aXRoIHplcm8gTUFDCisgKiBhZGRyZXNzZXMuICBTb21lIG9sZGVyIFUtQm9vdHMgb25seSBpbml0aWFsaXplZCAnbG9jYWwtbWFjLWFkZHJlc3MnLiAgSW4KKyAqIHRoaXMgY2FzZSwgdGhlIHJlYWwgTUFDIGlzIGluICdsb2NhbC1tYWMtYWRkcmVzcycsIGFuZCAnbWFjLWFkZHJlc3MnIGV4aXN0cworICogYnV0IGlzIGFsbCB6ZXJvcy4KKyovCitjb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCisJcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQorCQlyZXR1cm4gcHAtPnZhbHVlOworCisJcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQorCQlyZXR1cm4gcHAtPnZhbHVlOworCisJcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOworCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCisJCXJldHVybiBwcC0+dmFsdWU7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0X21hY19hZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwppbmRleCA1YjRhMDdmLi5jMDFjZDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCkBAIC02MzMsNiArNjMzLDkgQEAKICAqIEBucDogcG9pbnRlciB0byBub2RlIHRvIGNyZWF0ZSBkZXZpY2UgZm9yCiAgKiBAYnVzX2lkOiBuYW1lIHRvIGFzc2lnbiBkZXZpY2UKICAqIEBwYXJlbnQ6IExpbnV4IGRldmljZSBtb2RlbCBwYXJlbnQgZGV2aWNlLgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBjcmVhdGVkIHBsYXRmb3JtIGRldmljZSwgb3IgTlVMTCBpZiBhIGRldmljZSB3YXMgbm90CisgKiByZWdpc3RlcmVkLiAgVW5hdmFpbGFibGUgZGV2aWNlcyB3aWxsIG5vdCBnZXQgcmVnaXN0ZXJlZC4KICAqLwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkgICAgY29uc3QgY2hhciAqYnVzX2lkLApAQCAtNjQwLDYgKzY0Myw5IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2OwogCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlkZXYgPSBvZl9kZXZpY2VfYWxsb2MobnAsIGJ1c19pZCwgcGFyZW50KTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CkBAIC02ODMsOCArNjg5LDkgQEAKIAkJcHJfZGVidWcoIiAgIGNyZWF0ZSBjaGlsZDogJXNcbiIsIGNoaWxkLT5mdWxsX25hbWUpOwogCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKGNoaWxkLCBOVUxMLCBwYXJlbnQpOwogCQlpZiAoZGV2ID09IE5VTEwpCi0JCQlyYyA9IC1FTk9NRU07Ci0JCWVsc2UgaWYgKCFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGNoaWxkKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCBjaGlsZCkpCiAJCQljb250aW51ZTsKIAkJaWYgKHJjID09IDApIHsKIAkJCXByX2RlYnVnKCIgICBhbmQgc3ViIGJ1c3Nlc1xuIik7CkBAIC03MzMsMTAgKzc0MCw5IEBACiAJaWYgKG9mX21hdGNoX25vZGUobWF0Y2hlcywgcm9vdCkpIHsKIAkJcHJfZGVidWcoIiByb290IG1hdGNoLCBjcmVhdGUgYWxsIHN1YiBkZXZpY2VzXG4iKTsKIAkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShyb290LCBOVUxMLCBwYXJlbnQpOwotCQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJCXJjID0gLUVOT01FTTsKKwkJaWYgKGRldiA9PSBOVUxMKQogCQkJZ290byBiYWlsOwotCQl9CisKIAkJcHJfZGVidWcoIiBjcmVhdGUgYWxsIHN1YiBidXNzZXNcbiIpOwogCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUocm9vdCwgbWF0Y2hlcywgJmRldi0+ZGV2KTsKIAkJZ290byBiYWlsOwpAQCAtNzQ4LDkgKzc1NCw5IEBACiAJCXByX2RlYnVnKCIgIG1hdGNoOiAlc1xuIiwgY2hpbGQtPmZ1bGxfbmFtZSk7CiAJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoY2hpbGQsIE5VTEwsIHBhcmVudCk7CiAJCWlmIChkZXYgPT0gTlVMTCkKLQkJCXJjID0gLUVOT01FTTsKLQkJZWxzZQotCQkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCAmZGV2LT5kZXYpOworCQkJY29udGludWU7CisKKwkJcmMgPSBvZl9wbGF0Zm9ybV9idXNfY3JlYXRlKGNoaWxkLCBtYXRjaGVzLCAmZGV2LT5kZXYpOwogCQlpZiAocmMpIHsKIAkJCW9mX25vZGVfcHV0KGNoaWxkKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL0tjb25maWcKaW5kZXggNWIxNjMwZS4uYTk1MjNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC00NSw2ICs0NSw3IEBACiAgICAgICAgIGRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBYRU4KICAgICAgICAgc2VsZWN0IEhPVFBMVUcKICAgICAgICAgc2VsZWN0IFBDSV9YRU4KKwlzZWxlY3QgWEVOX1hFTkJVU19GUk9OVEVORAogICAgICAgICBkZWZhdWx0IHkKICAgICAgICAgaGVscAogICAgICAgICAgIFRoZSBQQ0kgZGV2aWNlIGZyb250ZW5kIGRyaXZlciBhbGxvd3MgdGhlIGtlcm5lbCB0byBpbXBvcnQgYXJiaXRyYXJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IGJhYjUyMDQuLjc3MjIxMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0zNiw3ICszNiw2IEBACiAjZGVmaW5lIF9BQ1BJUEhQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKaW5kZXggMmVhOWNmMS4uYjI4M2JiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYwpAQCAtMjQsNyArMjQsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDdjMjRkY2UuLjQ0YjBhZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0xNjgsOCArMTY4LDkgQEAKIAl1MzIgbWFza19iaXRzID0gZGVzYy0+bWFza2VkOwogCXVuc2lnbmVkIG9mZnNldCA9IGRlc2MtPm1zaV9hdHRyaWIuZW50cnlfbnIgKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKIAkJCQkJCVBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMOwotCW1hc2tfYml0cyAmPSB+MTsKLQltYXNrX2JpdHMgfD0gZmxhZzsKKwltYXNrX2JpdHMgJj0gflBDSV9NU0lYX0VOVFJZX0NUUkxfTUFTS0JJVDsKKwlpZiAoZmxhZykKKwkJbWFza19iaXRzIHw9IFBDSV9NU0lYX0VOVFJZX0NUUkxfTUFTS0JJVDsKIAl3cml0ZWwobWFza19iaXRzLCBkZXNjLT5tYXNrX2Jhc2UgKyBvZmZzZXQpOwogCiAJcmV0dXJuIG1hc2tfYml0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5oIGIvZHJpdmVycy9wY2kvbXNpLmgKaW5kZXggZmVmZjNiZS4uNjVjNDJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmgKKysrIGIvZHJpdmVycy9wY2kvbXNpLmgKQEAgLTYsMTIgKzYsNiBAQAogI2lmbmRlZiBNU0lfSAogI2RlZmluZSBNU0lfSAogCi0jZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1NJWkUJCTE2Ci0jZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSCTAKLSNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFIJNAotI2RlZmluZSAgUENJX01TSVhfRU5UUllfREFUQQkJOAotI2RlZmluZSAgUENJX01TSVhfRU5UUllfVkVDVE9SX0NUUkwJMTIKLQogI2RlZmluZSBtc2lfY29udHJvbF9yZWcoYmFzZSkJCShiYXNlICsgUENJX01TSV9GTEFHUykKICNkZWZpbmUgbXNpX2xvd2VyX2FkZHJlc3NfcmVnKGJhc2UpCShiYXNlICsgUENJX01TSV9BRERSRVNTX0xPKQogI2RlZmluZSBtc2lfdXBwZXJfYWRkcmVzc19yZWcoYmFzZSkJKGJhc2UgKyBQQ0lfTVNJX0FERFJFU1NfSEkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCAyNGUxOWM1Li42ZmUwNzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTQ2LDkgKzQ2LDkgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGNvbnRleHQ7CiAKIAlpZiAoZXZlbnQgPT0gQUNQSV9OT1RJRllfREVWSUNFX1dBS0UgJiYgcGNpX2RldikgeworCQlwY2lfd2FrZXVwX2V2ZW50KHBjaV9kZXYpOwogCQlwY2lfY2hlY2tfcG1lX3N0YXR1cyhwY2lfZGV2KTsKIAkJcG1fcnVudGltZV9yZXN1bWUoJnBjaV9kZXYtPmRldik7Ci0JCXBjaV93YWtldXBfZXZlbnQocGNpX2Rldik7CiAJCWlmIChwY2lfZGV2LT5zdWJvcmRpbmF0ZSkKIAkJCXBjaV9wbWVfd2FrZXVwX2J1cyhwY2lfZGV2LT5zdWJvcmRpbmF0ZSk7CiAJfQpAQCAtMzk5LDYgKzM5OSw3IEBACiAKIAlpZiAoYWNwaV9nYmxfRkFEVC5ib290X2ZsYWdzICYgQUNQSV9GQURUX05PX0FTUE0pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyJBQ1BJIEZBRFQgZGVjbGFyZXMgdGhlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgUENJZSBBU1BNLCBzbyBkaXNhYmxlIGl0XG4iKTsKKwkJcGNpZV9jbGVhcl9hc3BtKCk7CiAJCXBjaWVfbm9fYXNwbSgpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCmluZGV4IDhhNmY3OTcuLjg4MjQ2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogfQogCiAvKioKLSAqIF9fcGNpX2RldmljZV9wcm9iZSgpCisgKiBfX3BjaV9kZXZpY2VfcHJvYmUgLSBjaGVjayBpZiBhIGRyaXZlciB3YW50cyB0byBjbGFpbSBhIHNwZWNpZmljIFBDSSBkZXZpY2UKICAqIEBkcnY6IGRyaXZlciB0byBjYWxsIHRvIGNoZWNrIGlmIGl0IHdhbnRzIHRoZSBQQ0kgZGV2aWNlCiAgKiBAcGNpX2RldjogUENJIGRldmljZSBiZWluZyBwcm9iZWQKICAqIApAQCAtNDQ5LDcgKzQ0OSw4IEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JcmV0dXJuIHBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBwY2lfcG1fZGVmYXVsdF9yZXN1bWVfZWFybHkoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jIGIvZHJpdmVycy9wY2kvcGNpLXN0dWIuYwppbmRleCBmN2I2OGNhLi43NzVlOTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zdHViLmMKQEAgLTQ3LDYgKzQ3LDEwIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKKwkvKiBubyBpZHMgcGFzc2VkIGFjdHVhbGx5ICovCisJaWYgKGlkc1swXSA9PSAnXDAnKQorCQlyZXR1cm4gMDsKKwogCS8qIGFkZCBpZHMgc3BlY2lmaWVkIGluIHRoZSBtb2R1bGUgcGFyYW1ldGVyICovCiAJcCA9IGlkczsKIAl3aGlsZSAoKGlkID0gc3Ryc2VwKCZwLCAiLCIpKSkgewpAQCAtNTQsNiArNTgsOSBAQAogCQkJc3ViZGV2aWNlID0gUENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOwogCQlpbnQgZmllbGRzOwogCisJCWlmICghc3RybGVuKGlkKSkKKwkJCWNvbnRpbnVlOworCiAJCWZpZWxkcyA9IHNzY2FuZihpZCwgIiV4OiV4OiV4OiV4OiV4OiV4IiwKIAkJCQkmdmVuZG9yLCAmZGV2aWNlLCAmc3VidmVuZG9yLCAmc3ViZGV2aWNlLAogCQkJCSZjbGFzcywgJmNsYXNzX21hc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCA2M2Q1MDQyLi44ZWNhYWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtMTE0OSw3ICsxMTQ5LDcgQEAKIAkJc3lzZnNfYmluX2F0dHJfaW5pdChhdHRyKTsKIAkJYXR0ci0+c2l6ZSA9IHJvbV9zaXplOwogCQlhdHRyLT5hdHRyLm5hbWUgPSAicm9tIjsKLQkJYXR0ci0+YXR0ci5tb2RlID0gU19JUlVTUjsKKwkJYXR0ci0+YXR0ci5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7CiAJCWF0dHItPnJlYWQgPSBwY2lfcmVhZF9yb207CiAJCWF0dHItPndyaXRlID0gcGNpX3dyaXRlX3JvbTsKIAkJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgYXR0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDcxMGM4YTIuLmI3MTRkNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC05MzcsMTQgKzkzNywxMyBAQAogICogcGNpX3Jlc3RvcmVfc3RhdGUgLSBSZXN0b3JlIHRoZSBzYXZlZCBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKICAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aAogICovCi1pbnQgCi1wY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQordm9pZCBwY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBpOwogCXUzMiB2YWw7CiAKIAlpZiAoIWRldi0+c3RhdGVfc2F2ZWQpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAkvKiBQQ0kgRXhwcmVzcyByZWdpc3RlciBtdXN0IGJlIHJlc3RvcmVkIGZpcnN0ICovCiAJcGNpX3Jlc3RvcmVfcGNpZV9zdGF0ZShkZXYpOwpAQCAtOTY4LDggKzk2Nyw2IEBACiAJcGNpX3Jlc3RvcmVfaW92X3N0YXRlKGRldik7CiAKIAlkZXYtPnN0YXRlX3NhdmVkID0gZmFsc2U7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkb19wY2lfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFycykKQEAgLTEzMDAsMjIgKzEyOTcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBUaW1lIHRvIHdhaXQgYmVmb3JlIHRoZSBzeXN0ZW0gY2FuIGJlIHB1dCBpbnRvIGEgc2xlZXAgc3RhdGUgYWZ0ZXIgcmVwb3J0aW5nCi0gKiBhIHdha2V1cCBldmVudCBzaWduYWxlZCBieSBhIFBDSSBkZXZpY2UuCi0gKi8KLSNkZWZpbmUgUENJX1dBS0VVUF9DT09MRE9XTgkxMDAKLQotLyoqCi0gKiBwY2lfd2FrZXVwX2V2ZW50IC0gUmVwb3J0IGEgd2FrZXVwIGV2ZW50IHJlbGF0ZWQgdG8gYSBnaXZlbiBQQ0kgZGV2aWNlLgotICogQGRldjogRGV2aWNlIHRvIHJlcG9ydCB0aGUgd2FrZXVwIGV2ZW50IGZvci4KLSAqLwotdm9pZCBwY2lfd2FrZXVwX2V2ZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaWYgKGRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpCi0JCXBtX3dha2V1cF9ldmVudCgmZGV2LT5kZXYsIFBDSV9XQUtFVVBfQ09PTERPV04pOwotfQotCiAvKioKICAqIHBjaV9wbWVfd2FrZXVwIC0gV2FrZSB1cCBhIFBDSSBkZXZpY2UgaWYgaXRzIFBNRSBTdGF0dXMgYml0IGlzIHNldC4KICAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCkBAIC0xMzI3LDggKzEzMDgsOCBAQAogc3RhdGljIGludCBwY2lfcG1lX3dha2V1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkICppZ24pCiB7CiAJaWYgKHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpIHsKLQkJcG1fcmVxdWVzdF9yZXN1bWUoJmRldi0+ZGV2KTsKIAkJcGNpX3dha2V1cF9ldmVudChkZXYpOworCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggN2QzM2Y2Ni4uZjY5ZDZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTc0LDYgKzc0LDEyIEBACiBleHRlcm4gdm9pZCBwbGF0Zm9ybV9wY2lfd2FrZXVwX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfYWxsb2NhdGVfY2FwX3NhdmVfYnVmZmVycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAorc3RhdGljIGlubGluZSB2b2lkIHBjaV93YWtldXBfZXZlbnQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiBXYWl0IDEwMCBtcyBiZWZvcmUgdGhlIHN5c3RlbSBjYW4gYmUgcHV0IGludG8gYSBzbGVlcCBzdGF0ZS4gKi8KKwlwbV93YWtldXBfZXZlbnQoJmRldi0+ZGV2LCAxMDApOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgcGNpX2lzX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKIAlyZXR1cm4gISEocGNpX2Rldi0+c3Vib3JkaW5hdGUpOwpAQCAtMTQwLDE0ICsxNDYsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHBjaV9tc2lfaW5pdF9wY2lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUENJRUFFUgotdm9pZCBwY2lfbm9fYWVyKHZvaWQpOwotYm9vbCBwY2lfYWVyX2F2YWlsYWJsZSh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX25vX2Flcih2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgYm9vbCBwY2lfYWVyX2F2YWlsYWJsZSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9ub19kMWQyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IHBhcmVudF9kc3RhdGVzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKaW5kZXggMmIyYjY1MC4uNThhZDc5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmggYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAppbmRleCA5NjU2ZTMwLi44MGMxMWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaApAQCAtMTMyLDcgKzEzMiw2IEBACiAKICNpZmRlZiBDT05GSUdfQUNQSV9BUEVJCiBleHRlcm4gaW50IHBjaWVfYWVyX2dldF9maXJtd2FyZV9maXJzdChzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci1leHRlcm4gYm9vbCBhZXJfYWNwaV9maXJtd2FyZV9maXJzdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwY2llX2Flcl9nZXRfZmlybXdhcmVfZmlyc3Qoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CkBAIC0xNDAsOCArMTM5LDYgQEAKIAkJcmV0dXJuIHBjaV9kZXYtPl9fYWVyX2Zpcm13YXJlX2ZpcnN0OwogCXJldHVybiAwOwogfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgYWVyX2FjcGlfZmlybXdhcmVfZmlyc3Qodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpZV9hZXJfZm9yY2VfZmlybXdhcmVfZmlyc3Qoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDcxMjIyODEuLjMxODhjZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC02OCw3ICs2OCw3IEBACiAJc3RydWN0IGFzcG1fbGF0ZW5jeSBhY2NlcHRhYmxlWzhdOwogfTsKIAotc3RhdGljIGludCBhc3BtX2Rpc2FibGVkLCBhc3BtX2ZvcmNlOworc3RhdGljIGludCBhc3BtX2Rpc2FibGVkLCBhc3BtX2ZvcmNlLCBhc3BtX2NsZWFyX3N0YXRlOwogc3RhdGljIERFRklORV9NVVRFWChhc3BtX2xvY2spOwogc3RhdGljIExJU1RfSEVBRChsaW5rX2xpc3QpOwogCkBAIC0xMzksNyArMTM5LDcgQEAKIHsKIAkvKiBEb24ndCBlbmFibGUgQ2xvY2sgUE0gaWYgdGhlIGxpbmsgaXMgbm90IENsb2NrIFBNIGNhcGFibGUgKi8KIAlpZiAoIWxpbmstPmNsa3BtX2NhcGFibGUgJiYgZW5hYmxlKQotCQlyZXR1cm47CisJCWVuYWJsZSA9IDA7CiAJLyogTmVlZCBub3RoaW5nIGlmIHRoZSBzcGVjaWZpZWQgZXF1YWxzIHRvIGN1cnJlbnQgc3RhdGUgKi8KIAlpZiAobGluay0+Y2xrcG1fZW5hYmxlZCA9PSBlbmFibGUpCiAJCXJldHVybjsKQEAgLTQ5OCw2ICs0OTgsMTAgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7CiAJaW50IHBvczsKIAl1MzIgcmVnMzI7CisKKwlpZiAoYXNwbV9jbGVhcl9zdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKgogCSAqIFNvbWUgZnVuY3Rpb25zIGluIGEgc2xvdCBtaWdodCBub3QgYWxsIGJlIFBDSWUgZnVuY3Rpb25zLAogCSAqIHZlcnkgc3RyYW5nZS4gRGlzYWJsZSBBU1BNIGZvciB0aGUgd2hvbGUgc2xvdApAQCAtNTYzLDEyICs1NjcsMTUgQEAKIAlzdHJ1Y3QgcGNpZV9saW5rX3N0YXRlICpsaW5rOwogCWludCBibGFja2xpc3QgPSAhIXBjaWVfYXNwbV9zYW5pdHlfY2hlY2socGRldik7CiAKLQlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGNpX2lzX3BjaWUocGRldikgfHwgcGRldi0+bGlua19zdGF0ZSkKKwlpZiAoIXBjaV9pc19wY2llKHBkZXYpIHx8IHBkZXYtPmxpbmtfc3RhdGUpCiAJCXJldHVybjsKIAlpZiAocGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ST09UX1BPUlQgJiYKIAkgICAgcGRldi0+cGNpZV90eXBlICE9IFBDSV9FWFBfVFlQRV9ET1dOU1RSRUFNKQogCQlyZXR1cm47CiAKKwlpZiAoYXNwbV9kaXNhYmxlZCAmJiAhYXNwbV9jbGVhcl9zdGF0ZSkKKwkJcmV0dXJuOworCiAJLyogVklBIGhhcyBhIHN0cmFuZ2UgY2hpcHNldCwgcm9vdCBwb3J0IGlzIHVuZGVyIGEgYnJpZGdlICovCiAJaWYgKHBkZXYtPnBjaWVfdHlwZSA9PSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUICYmCiAJICAgIHBkZXYtPmJ1cy0+c2VsZikKQEAgLTY0MSw3ICs2NDgsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwYXJlbnQgPSBwZGV2LT5idXMtPnNlbGY7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGluaywgKnJvb3QsICpwYXJlbnRfbGluazsKIAotCWlmIChhc3BtX2Rpc2FibGVkIHx8ICFwY2lfaXNfcGNpZShwZGV2KSB8fAorCWlmICgoYXNwbV9kaXNhYmxlZCAmJiAhYXNwbV9jbGVhcl9zdGF0ZSkgfHwgIXBjaV9pc19wY2llKHBkZXYpIHx8CiAJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bGlua19zdGF0ZSkKIAkJcmV0dXJuOwogCWlmICgocGFyZW50LT5wY2llX3R5cGUgIT0gUENJX0VYUF9UWVBFX1JPT1RfUE9SVCkgJiYKQEAgLTg5OSw2ICs5MDYsMTIgQEAKIAogX19zZXR1cCgicGNpZV9hc3BtPSIsIHBjaWVfYXNwbV9kaXNhYmxlKTsKIAordm9pZCBwY2llX2NsZWFyX2FzcG0odm9pZCkKK3sKKwlpZiAoIWFzcG1fZm9yY2UpCisJCWFzcG1fY2xlYXJfc3RhdGUgPSAxOworfQorCiB2b2lkIHBjaWVfbm9fYXNwbSh2b2lkKQogewogCWlmICghYXNwbV9mb3JjZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BtZS5jCmluZGV4IDJmM2M5MDQuLjAwNTczNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wbWUuYwpAQCAtMjYsOSArMjYsNiBAQAogI2luY2x1ZGUgIi4uL3BjaS5oIgogI2luY2x1ZGUgInBvcnRkcnYuaCIKIAotI2RlZmluZSBQQ0lfRVhQX1JUU1RBX1BNRQkweDEwMDAwIC8qIFBNRSBzdGF0dXMgKi8KLSNkZWZpbmUgUENJX0VYUF9SVFNUQV9QRU5ESU5HCTB4MjAwMDAgLyogUE1FIHBlbmRpbmcgKi8KLQogLyoKICAqIElmIHRoaXMgc3dpdGNoIGlzIHNldCwgTVNJIHdpbGwgbm90IGJlIHVzZWQgZm9yIFBDSWUgUE1FIHNpZ25hbGluZy4gIFRoaXMKICAqIGNhdXNlcyB0aGUgUENJZSBwb3J0IGRyaXZlciB0byB1c2UgSU5UeCBpbnRlcnJ1cHRzIG9ubHksIGJ1dCBpdCB0dXJucyBvdXQKQEAgLTc0LDIyICs3MSw2IEBACiB9CiAKIC8qKgotICogcGNpZV9wbWVfY2xlYXJfc3RhdHVzIC0gQ2xlYXIgcm9vdCBwb3J0IFBNRSBpbnRlcnJ1cHQgc3RhdHVzLgotICogQGRldjogUENJZSByb290IHBvcnQgb3IgZXZlbnQgY29sbGVjdG9yLgotICovCi1zdGF0aWMgdm9pZCBwY2llX3BtZV9jbGVhcl9zdGF0dXMoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlpbnQgcnRzdGFfcG9zOwotCXUzMiBydHN0YTsKLQotCXJ0c3RhX3BvcyA9IHBjaV9wY2llX2NhcChkZXYpICsgUENJX0VYUF9SVFNUQTsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJ0c3RhX3BvcywgJnJ0c3RhKTsKLQlydHN0YSB8PSBQQ0lfRVhQX1JUU1RBX1BNRTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcnRzdGFfcG9zLCBydHN0YSk7Ci19Ci0KLS8qKgogICogcGNpZV9wbWVfd2Fsa19idXMgLSBTY2FuIGEgUENJIGJ1cyBmb3IgZGV2aWNlcyBhc3NlcnRpbmcgUE1FIy4KICAqIEBidXM6IFBDSSBidXMgdG8gc2Nhbi4KICAqCkBAIC0xMDMsOCArODQsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQkvKiBTa2lwIFBDSWUgZGV2aWNlcyBpbiBjYXNlIHdlIHN0YXJ0ZWQgZnJvbSBhIHJvb3QgcG9ydC4gKi8KIAkJaWYgKCFwY2lfaXNfcGNpZShkZXYpICYmIHBjaV9jaGVja19wbWVfc3RhdHVzKGRldikpIHsKLQkJCXBtX3JlcXVlc3RfcmVzdW1lKCZkZXYtPmRldik7CiAJCQlwY2lfd2FrZXVwX2V2ZW50KGRldik7CisJCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOwogCQkJcmV0ID0gdHJ1ZTsKIAkJfQogCkBAIC0yMDYsOCArMTg3LDggQEAKIAkJLyogVGhlIGRldmljZSBpcyB0aGVyZSwgYnV0IHdlIGhhdmUgdG8gY2hlY2sgaXRzIFBNRSBzdGF0dXMuICovCiAJCWZvdW5kID0gcGNpX2NoZWNrX3BtZV9zdGF0dXMoZGV2KTsKIAkJaWYgKGZvdW5kKSB7Ci0JCQlwbV9yZXF1ZXN0X3Jlc3VtZSgmZGV2LT5kZXYpOwogCQkJcGNpX3dha2V1cF9ldmVudChkZXYpOworCQkJcG1fcmVxdWVzdF9yZXN1bWUoJmRldi0+ZGV2KTsKIAkJfQogCQlwY2lfZGV2X3B1dChkZXYpOwogCX0gZWxzZSBpZiAoZGV2Zm4pIHsKQEAgLTI1Myw3ICsyMzQsNyBAQAogCQkJICogQ2xlYXIgUE1FIHN0YXR1cyBvZiB0aGUgcG9ydC4gIElmIHRoZXJlIGFyZSBvdGhlcgogCQkJICogcGVuZGluZyBQTUVzLCB0aGUgc3RhdHVzIHdpbGwgYmUgc2V0IGFnYWluLgogCQkJICovCi0JCQlwY2llX3BtZV9jbGVhcl9zdGF0dXMocG9ydCk7CisJCQlwY2llX2NsZWFyX3Jvb3RfcG1lX3N0YXR1cyhwb3J0KTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxKCZkYXRhLT5sb2NrKTsKIAkJCXBjaWVfcG1lX2hhbmRsZV9yZXF1ZXN0KHBvcnQsIHJ0c3RhICYgMHhmZmZmKTsKQEAgLTM3OCw3ICszNTksNyBAQAogCiAJcG9ydCA9IHNydi0+cG9ydDsKIAlwY2llX3BtZV9pbnRlcnJ1cHRfZW5hYmxlKHBvcnQsIGZhbHNlKTsKLQlwY2llX3BtZV9jbGVhcl9zdGF0dXMocG9ydCk7CisJcGNpZV9jbGVhcl9yb290X3BtZV9zdGF0dXMocG9ydCk7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShzcnYtPmlycSwgcGNpZV9wbWVfaXJxLCBJUlFGX1NIQVJFRCwgIlBDSWUgUE1FIiwgc3J2KTsKIAlpZiAocmV0KSB7CkBAIC00MDIsNyArMzgzLDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJmRhdGEtPmxvY2spOwogCXBjaWVfcG1lX2ludGVycnVwdF9lbmFibGUocG9ydCwgZmFsc2UpOwotCXBjaWVfcG1lX2NsZWFyX3N0YXR1cyhwb3J0KTsKKwlwY2llX2NsZWFyX3Jvb3RfcG1lX3N0YXR1cyhwb3J0KTsKIAlkYXRhLT5ub2lycSA9IHRydWU7CiAJc3Bpbl91bmxvY2tfaXJxKCZkYXRhLT5sb2NrKTsKIApAQCAtNDIyLDcgKzQwMyw3IEBACiAKIAlzcGluX2xvY2tfaXJxKCZkYXRhLT5sb2NrKTsKIAlkYXRhLT5ub2lycSA9IGZhbHNlOwotCXBjaWVfcG1lX2NsZWFyX3N0YXR1cyhwb3J0KTsKKwlwY2llX2NsZWFyX3Jvb3RfcG1lX3N0YXR1cyhwb3J0KTsKIAlwY2llX3BtZV9pbnRlcnJ1cHRfZW5hYmxlKHBvcnQsIHRydWUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGF0YS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKaW5kZXggN2I1YWJhMC4uYmQwMGEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2LmgKQEAgLTIwLDkgKzIwLDYgQEAKIAogI2RlZmluZSBnZXRfZGVzY3JpcHRvcl9pZCh0eXBlLCBzZXJ2aWNlKSAoKCh0eXBlIC0gNCkgPDwgNCkgfCBzZXJ2aWNlKQogCi1leHRlcm4gYm9vbCBwY2llX3BvcnRzX2Rpc2FibGVkOwotZXh0ZXJuIGJvb2wgcGNpZV9wb3J0c19hdXRvOwotCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHBjaWVfcG9ydF9idXNfdHlwZTsKIGV4dGVybiBpbnQgcGNpZV9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNpZmRlZiBDT05GSUdfUE0KQEAgLTM1LDYgKzMyLDggQEAKIAogc3RydWN0IHBjaV9kZXY7CiAKK2V4dGVybiB2b2lkIHBjaWVfY2xlYXJfcm9vdF9wbWVfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCiAjaWZkZWYgQ09ORklHX1BDSUVfUE1FCiBleHRlcm4gYm9vbCBwY2llX3BtZV9tc2lfZGlzYWJsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYWNwaS5jCmluZGV4IDU5ODJiNmEuLmE4NmI1NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2FjcGkuYwpAQCAtMzMsNyArMzMsNyBAQAogICovCiBpbnQgcGNpZV9wb3J0X2FjcGlfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBvcnQsIGludCAqc3J2X21hc2spCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290OwogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAl1MzIgZmxhZ3M7CiAKQEAgLTQ0LDI2ICs0NCwxMSBAQAogCWlmICghaGFuZGxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZsYWdzID0gT1NDX1BDSV9FWFBSRVNTX0NBUF9TVFJVQ1RVUkVfQ09OVFJPTAotCQl8IE9TQ19QQ0lfRVhQUkVTU19OQVRJVkVfSFBfQ09OVFJPTAotCQl8IE9TQ19QQ0lfRVhQUkVTU19QTUVfQ09OVFJPTDsKLQotCWlmIChwY2lfYWVyX2F2YWlsYWJsZSgpKSB7Ci0JCWlmIChhZXJfYWNwaV9maXJtd2FyZV9maXJzdCgpKQotCQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiUENJZSBlcnJvcnMgaGFuZGxlZCBieSBCSU9TLlxuIik7Ci0JCWVsc2UKLQkJCWZsYWdzIHw9IE9TQ19QQ0lfRVhQUkVTU19BRVJfQ09OVFJPTDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3BjaV9vc2NfY29udHJvbF9zZXQoaGFuZGxlLCAmZmxhZ3MsCi0JCQkJCU9TQ19QQ0lfRVhQUkVTU19DQVBfU1RSVUNUVVJFX0NPTlRST0wpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJBQ1BJIF9PU0MgcmVxdWVzdCBmYWlsZWQgKGNvZGUgJWQpXG4iLAotCQkJc3RhdHVzKTsKKwlyb290ID0gYWNwaV9wY2lfZmluZF9yb290KGhhbmRsZSk7CisJaWYgKCFyb290KQogCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKLQlkZXZfaW5mbygmcG9ydC0+ZGV2LCAiQUNQSSBfT1NDIGNvbnRyb2wgZ3JhbnRlZCBmb3IgMHglMDJ4XG4iLCBmbGFncyk7CisJZmxhZ3MgPSByb290LT5vc2NfY29udHJvbF9zZXQ7CiAKIAkqc3J2X21hc2sgPSBQQ0lFX1BPUlRfU0VSVklDRV9WQzsKIAlpZiAoZmxhZ3MgJiBPU0NfUENJX0VYUFJFU1NfTkFUSVZFX0hQX0NPTlRST0wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwppbmRleCBhOWMyMjJkLi41MTMwZDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTI0MSwxNyArMjQxLDE3IEBACiAJaW50IGNhcF9tYXNrOwogCWludCBlcnI7CiAKKwlpZiAocGNpZV9wb3J0c19kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisKIAllcnIgPSBwY2llX3BvcnRfcGxhdGZvcm1fbm90aWZ5KGRldiwgJmNhcF9tYXNrKTsKLQlpZiAocGNpZV9wb3J0c19hdXRvKSB7Ci0JCWlmIChlcnIpIHsKLQkJCXBjaWVfbm9fYXNwbSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgeworCWlmICghcGNpZV9wb3J0c19hdXRvKSB7CiAJCWNhcF9tYXNrID0gUENJRV9QT1JUX1NFUlZJQ0VfUE1FIHwgUENJRV9QT1JUX1NFUlZJQ0VfSFAKIAkJCQl8IFBDSUVfUE9SVF9TRVJWSUNFX1ZDOwogCQlpZiAocGNpX2Flcl9hdmFpbGFibGUoKSkKIAkJCWNhcF9tYXNrIHw9IFBDSUVfUE9SVF9TRVJWSUNFX0FFUjsKKwl9IGVsc2UgaWYgKGVycikgeworCQkJcmV0dXJuIDA7CiAJfQogCiAJcG9zID0gcGNpX3BjaWVfY2FwKGRldik7CkBAIC0zNDksMTUgKzM0OSwxOCBAQAogCWludCBzdGF0dXMsIGNhcGFiaWxpdGllcywgaSwgbnJfc2VydmljZTsKIAlpbnQgaXJxc1tQQ0lFX1BPUlRfREVWSUNFX01BWFNFUlZJQ0VTXTsKIAotCS8qIEdldCBhbmQgY2hlY2sgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlcyAqLwotCWNhcGFiaWxpdGllcyA9IGdldF9wb3J0X2RldmljZV9jYXBhYmlsaXR5KGRldik7Ci0JaWYgKCFjYXBhYmlsaXRpZXMpCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyogRW5hYmxlIFBDSSBFeHByZXNzIHBvcnQgZGV2aWNlICovCiAJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOworCisJLyogR2V0IGFuZCBjaGVjayBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2VzICovCisJY2FwYWJpbGl0aWVzID0gZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkoZGV2KTsKKwlpZiAoIWNhcGFiaWxpdGllcykgeworCQlwY2llX25vX2FzcG0oKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcGNpX3NldF9tYXN0ZXIoZGV2KTsKIAkvKgogCSAqIEluaXRpYWxpemUgc2VydmljZSBpcnFzLiBEb24ndCB1c2Ugc2VydmljZSBkZXZpY2VzIHRoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCBmOTAzM2UxLi5lMDYxMGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC01Nyw2ICs1NywyMiBAQAogCiAvKiBnbG9iYWwgZGF0YSAqLwogCisvKioKKyAqIHBjaWVfY2xlYXJfcm9vdF9wbWVfc3RhdHVzIC0gQ2xlYXIgcm9vdCBwb3J0IFBNRSBpbnRlcnJ1cHQgc3RhdHVzLgorICogQGRldjogUENJZSByb290IHBvcnQgb3IgZXZlbnQgY29sbGVjdG9yLgorICovCit2b2lkIHBjaWVfY2xlYXJfcm9vdF9wbWVfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJ0c3RhX3BvczsKKwl1MzIgcnRzdGE7CisKKwlydHN0YV9wb3MgPSBwY2lfcGNpZV9jYXAoZGV2KSArIFBDSV9FWFBfUlRTVEE7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBydHN0YV9wb3MsICZydHN0YSk7CisJcnRzdGEgfD0gUENJX0VYUF9SVFNUQV9QTUU7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJ0c3RhX3BvcywgcnRzdGEpOworfQorCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCByZXR2YWw7CkBAIC02OSw2ICs4NSwyMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHBjaWVfcG9ydF9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCisJLyoKKwkgKiBTb21lIEJJT1NlcyBmb3JnZXQgdG8gY2xlYXIgUm9vdCBQTUUgU3RhdHVzIGJpdHMgYWZ0ZXIgc3lzdGVtIHdha2V1cAorCSAqIHdoaWNoIGJyZWFrcyBBQ1BJLWJhc2VkIHJ1bnRpbWUgd2FrZXVwIG9uIFBDSSBFeHByZXNzLCBzbyBjbGVhciB0aG9zZQorCSAqIGJpdHMgbm93IGp1c3QgaW4gY2FzZSAoc2hvdWxkbid0IGh1cnQpLgorCSAqLworCWlmKHBkZXYtPnBjaWVfdHlwZSA9PSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JUKQorCQlwY2llX2NsZWFyX3Jvb3RfcG1lX3N0YXR1cyhwZGV2KTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBjaWVfcG9ydGRydl9wbV9vcHMgPSB7CiAJLnN1c3BlbmQJPSBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZSwKQEAgLTc2LDYgKzEwNiw3IEBACiAJLnRoYXcJCT0gcGNpZV9wb3J0X2RldmljZV9yZXN1bWUsCiAJLnBvd2Vyb2ZmCT0gcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kLAogCS5yZXN0b3JlCT0gcGNpZV9wb3J0X2RldmljZV9yZXN1bWUsCisJLnJlc3VtZV9ub2lycQk9IHBjaWVfcG9ydF9yZXN1bWVfbm9pcnEsCiB9OwogCiAjZGVmaW5lIFBDSUVfUE9SVERSVl9QTV9PUFMJKCZwY2llX3BvcnRkcnZfcG1fb3BzKQpAQCAtMzI3LDEwICszNTgsOCBAQAogewogCWludCByZXR2YWw7CiAKLQlpZiAocGNpZV9wb3J0c19kaXNhYmxlZCkgewotCQlwY2llX25vX2FzcG0oKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQorCWlmIChwY2llX3BvcnRzX2Rpc2FibGVkKQorCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpZV9wb3J0ZHJpdmVyKTsKIAogCWRtaV9jaGVja19zeXN0ZW0ocGNpZV9wb3J0ZHJ2X2RtaV90YWJsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmggYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5oCmluZGV4IDgxNDZlM2IuLmY1NThlMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmgKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuaApAQCAtOSw3ICs5LDcgQEAKICNlbmRpZgogCiAvKgotICogTTMyUiBQQyBDYXJkIENvbnRyb2xlcgorICogTTMyUiBQQyBDYXJkIENvbnRyb2xsZXIKICAqLwogI2RlZmluZSBNMzJSX1BDQzBfQkFTRSAgICAgICAgMHgwMGVmNzAwMAogI2RlZmluZSBNMzJSX1BDQzFfQkFTRSAgICAgICAgMHgwMGVmNzAyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuaCBiL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmgKaW5kZXggZTRmZmZlNC4uZjk1YzU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuaAorKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5oCkBAIC01LDcgKzUsNyBAQAogI2RlZmluZSBNMzJSX01BWF9QQ0MJMgogCiAvKgotICogTTMyUiBQQyBDYXJkIENvbnRyb2xlcgorICogTTMyUiBQQyBDYXJkIENvbnRyb2xsZXIKICAqLwogI2RlZmluZSBNMzJSX1BDQzBfQkFTRSAgICAgICAgMHgwMGVmNzAwMAogI2RlZmluZSBNMzJSX1BDQzFfQkFTRSAgICAgICAgMHgwMGVmNzAyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKaW5kZXggOTlkNGYyMy4uMGRiNDgyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogCW91dF9iZTMyKE04WFhfUEdDUlgoMSksCiAJCSBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKGh3aXJxKSA8PCAxNikpOwogCi0JLyogaW50aWFsaXplIHRoZSBmaXhlZCBtZW1vcnkgd2luZG93cyAqLworCS8qIGluaXRpYWxpemUgdGhlIGZpeGVkIG1lbW9yeSB3aW5kb3dzICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgewogCQlmb3IgKG0gPSAwOyBtIDwgUENNQ0lBX01FTV9XSU5fTk87IG0rKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKaW5kZXggZmFlYzc3Ny4uZDE2M2JjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCkBAIC0xOCwxMiArMTgsMTQgQEAKIGNvbmZpZyBBQ0VSX1dNSQogCXRyaXN0YXRlICJBY2VyIFdNSSBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gQUNQSQotCWRlcGVuZHMgb24gTEVEU19DTEFTUwotCWRlcGVuZHMgb24gTkVXX0xFRFMKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBORVdfTEVEUwogCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWRlcGVuZHMgb24gU0VSSU9fSTgwNDIKKwlkZXBlbmRzIG9uIElOUFVUCiAJZGVwZW5kcyBvbiBSRktJTEwgfHwgUkZLSUxMID0gbgotCXNlbGVjdCBBQ1BJX1dNSQorCWRlcGVuZHMgb24gQUNQSV9XTUkKKwlzZWxlY3QgSU5QVVRfU1BBUlNFS01BUAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIG5ld2VyIEFjZXIgKGFuZCBXaXN0cm9uKSBsYXB0b3BzLiBJdCBhZGRzCiAJICB3aXJlbGVzcyByYWRpbyBhbmQgYmx1ZXRvb3RoIGNvbnRyb2wsIGFuZCBvbiBzb21lIGxhcHRvcHMsCkBAIC0xMzEsNyArMTMzLDcgQEAKIAlkZXBlbmRzIG9uICFYODZfNjQKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlcGVuZHMgb24gQUNQSQotCXNlbGVjdCBBQ1BJX1dNSQorCWRlcGVuZHMgb24gQUNQSV9XTUkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgV01JIGV4dGVuc2lvbnMgKHdpcmVsZXNzIGFuZCBibHVldG9vdGggcG93ZXIKIAkgIGNvbnRyb2wpIG9mIHRoZSBIUCBDb21wYXEgVEMxMTAwIHRhYmxldC4KQEAgLTIyNiw2ICsyMjgsNyBAQAogCXRyaXN0YXRlICJMZW5vdm8gSWRlYVBhZCBMYXB0b3AgRXh0cmFzIgogCWRlcGVuZHMgb24gQUNQSQogCWRlcGVuZHMgb24gUkZLSUxMCisJc2VsZWN0IElOUFVUX1NQQVJTRUtNQVAKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgcmZraWxsIHN3aXRjaGVzIG9uIExlbm92byBJZGVhUGFkIG5ldGJvb2tzLgogCkBAIC00MjUsNyArNDI4LDEwIEBACiAJZGVwZW5kcyBvbiBJTlBVVAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBSRktJTEwgfHwgUkZLSUxMID0gbgogCXNlbGVjdCBJTlBVVF9TUEFSU0VLTUFQCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTkVXX0xFRFMKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgV01JLWJhc2VkIGhvdGtleXMgb24gRWVlIFBDIGxhcHRvcHMuCiAKQEAgLTUxMCw4ICs1MTYsOCBAQAogY29uZmlnIEFDUElfVE9TSElCQQogCXRyaXN0YXRlICJUb3NoaWJhIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IE5FV19MRURTCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJZGVwZW5kcyBvbiBJTlBVVAogCWRlcGVuZHMgb24gUkZLSUxMIHx8IFJGS0lMTCA9IG4KQEAgLTU3Niw2ICs1ODIsMTUgQEAKIAkgIHNvbWUgZW1iZWRkZWQgSW50ZWwgeDg2IHBsYXRmb3Jtcy4gVGhpcyBpcyBub3QgbmVlZGVkIGZvciBQQy10eXBlCiAJICBtYWNoaW5lcy4KIAorY29uZmlnIElOVEVMX1NDVV9JUENfVVRJTAorCXRyaXN0YXRlICJJbnRlbCBTQ1UgSVBDIHV0aWxpdHkgZHJpdmVyIgorCWRlcGVuZHMgb24gSU5URUxfU0NVX0lQQworCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoZSBJUEMgVXRpbCBkcml2ZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHdpdGggdGhlIFNDVSBlbmFibGluZworCSAgbG93IGxldmVsIGFjY2VzcyBmb3IgZGVidWcgd29yayBhbmQgdXBkYXRpbmcgdGhlIGZpcm13YXJlLiBTYXkKKwkgIE4gdW5sZXNzIHlvdSB3aWxsIGJlIGRvaW5nIHRoaXMgb24gYW4gSW50ZWwgTUlEIHBsYXRmb3JtLgorCiBjb25maWcgR1BJT19JTlRFTF9QTUlDCiAJYm9vbCAiSW50ZWwgUE1JQyBHUElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDICYmIEdQSU9MSUIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L01ha2VmaWxlIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKaW5kZXggOTk1MGNjYy4uNGVjNGZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCiBvYmotJChDT05GSUdfVE9TSElCQV9CVF9SRktJTEwpCSs9IHRvc2hpYmFfYmx1ZXRvb3RoLm8KIG9iai0kKENPTkZJR19JTlRFTF9TQ1VfSVBDKQkrPSBpbnRlbF9zY3VfaXBjLm8KK29iai0kKENPTkZJR19JTlRFTF9TQ1VfSVBDX1VUSUwpKz0gaW50ZWxfc2N1X2lwY3V0aWwubwogb2JqLSQoQ09ORklHX1JBUl9SRUdJU1RFUikJKz0gaW50ZWxfcmFyX3JlZ2lzdGVyLm8KIG9iai0kKENPTkZJR19JTlRFTF9JUFMpCQkrPSBpbnRlbF9pcHMubwogb2JqLSQoQ09ORklHX0dQSU9fSU5URUxfUE1JQykJKz0gaW50ZWxfcG1pY19ncGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmluZGV4IGM4YzY1MzcuLmM1YzRiOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYwpAQCAtMzcsNiArMzcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCkBAIC00OCw2ICs1MSw3IEBACiAjZGVmaW5lIEFDRVJfRVJSIEtFUk5fRVJSIEFDRVJfTE9HUFJFRklYCiAjZGVmaW5lIEFDRVJfTk9USUNFIEtFUk5fTk9USUNFIEFDRVJfTE9HUFJFRklYCiAjZGVmaW5lIEFDRVJfSU5GTyBLRVJOX0lORk8gQUNFUl9MT0dQUkVGSVgKKyNkZWZpbmUgQUNFUl9XQVJOSU5HIEtFUk5fV0FSTklORyBBQ0VSX0xPR1BSRUZJWAogCiAvKgogICogTWFnaWMgTnVtYmVyCkBAIC04Miw5ICs4Niw4MiBAQAogI2RlZmluZSBBTVcwX0dVSUQyCQkiNDMxRjE2RUQtMEMyQi00NDRDLUIyNjctMjdERUIxNDBDRjlDIgogI2RlZmluZSBXTUlEX0dVSUQxCQkiNkFGNEYyNTgtQjQwMS00MmZkLUJFOTEtM0Q0QUMyRDdDMEQzIgogI2RlZmluZSBXTUlEX0dVSUQyCQkiOTU3NjRFMDktRkI1Ni00ZTgzLUIzMUEtMzc3NjFGNjA5OTRBIgorI2RlZmluZSBXTUlEX0dVSUQzCQkiNjFFRjY5RUEtODY1Qy00QkMzLUE1MDItQTBERUJBMENCNTMxIgorCisvKgorICogQWNlciBBQ1BJIGV2ZW50IEdVSURzCisgKi8KKyNkZWZpbmUgQUNFUldNSURfRVZFTlRfR1VJRCAiNjc2QUExNUUtNkE0Ny00RDlGLUEyQ0MtMUU2RDE4RDE0MDI2IgogCiBNT0RVTEVfQUxJQVMoIndtaTo2N0MzMzcxRC05NUEzLTRDMzctQkI2MS1ERDQ3QjQ5MURBQUIiKTsKIE1PRFVMRV9BTElBUygid21pOjZBRjRGMjU4LUI0MDEtNDJmZC1CRTkxLTNENEFDMkQ3QzBEMyIpOworTU9EVUxFX0FMSUFTKCJ3bWk6Njc2QUExNUUtNkE0Ny00RDlGLUEyQ0MtMUU2RDE4RDE0MDI2Iik7CisKK2VudW0gYWNlcl93bWlfZXZlbnRfaWRzIHsKKwlXTUlEX0hPVEtFWV9FVkVOVCA9IDB4MSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IGFjZXJfd21pX2tleW1hcFtdID0geworCXtLRV9LRVksIDB4MDEsIHtLRVlfV0xBTn0gfSwgICAgIC8qIFdpRmkgKi8KKwl7S0VfS0VZLCAweDEyLCB7S0VZX0JMVUVUT09USH0gfSwJLyogQlQgKi8KKwl7S0VfS0VZLCAweDIxLCB7S0VZX1BST0cxfSB9LCAgICAvKiBCYWNrdXAgKi8KKwl7S0VfS0VZLCAweDIyLCB7S0VZX1BST0cyfSB9LCAgICAvKiBBcmNhZGUgKi8KKwl7S0VfS0VZLCAweDIzLCB7S0VZX1BST0czfSB9LCAgICAvKiBQX0tleSAqLworCXtLRV9LRVksIDB4MjQsIHtLRVlfUFJPRzR9IH0sICAgIC8qIFNvY2lhbCBuZXR3b3JraW5nX0tleSAqLworCXtLRV9LRVksIDB4NjQsIHtLRVlfU1dJVENIVklERU9NT0RFfSB9LAkvKiBEaXNwbGF5IFN3aXRjaCAqLworCXtLRV9LRVksIDB4ODIsIHtLRVlfRjIyfSB9LCAgICAgIC8qIFRvdWNoIFBhZCBPbi9PZmYgKi8KKwl7S0VfRU5ELCAwfQorfTsKKworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKmFjZXJfd21pX2lucHV0X2RldjsKKworc3RydWN0IGV2ZW50X3JldHVybl92YWx1ZSB7CisJdTggZnVuY3Rpb247CisJdTgga2V5X251bTsKKwl1MTYgZGV2aWNlX3N0YXRlOworCXUzMiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qCisgKiBHVUlEMyBHZXQgRGV2aWNlIFN0YXR1cyBkZXZpY2UgZmxhZ3MKKyAqLworI2RlZmluZSBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUwkJKDE8PDApCS8qIFdpRmkgKi8KKyNkZWZpbmUgQUNFUl9XTUlEM19HRFNfVEhSRUVHCQkoMTw8NikJLyogM0cgKi8KKyNkZWZpbmUgQUNFUl9XTUlEM19HRFNfQkxVRVRPT1RICSgxPDwxMSkJLyogQlQgKi8KKworc3RydWN0IGxtX2lucHV0X3BhcmFtcyB7CisJdTggZnVuY3Rpb25fbnVtOyAgICAgICAgLyogRnVuY3Rpb24gTnVtYmVyICovCisJdTE2IGNvbW11bl9kZXZpY2VzOyAgICAgLyogQ29tbXVuaWNhdGlvbiB0eXBlIGRldmljZXMgZGVmYXVsdCBzdGF0dXMgKi8KKwl1MTYgZGV2aWNlczsgICAgICAgICAgICAvKiBPdGhlciB0eXBlIGRldmljZXMgZGVmYXVsdCBzdGF0dXMgKi8KKwl1OCBsbV9zdGF0dXM7ICAgICAgICAgICAvKiBMYXVuY2ggTWFuYWdlciBTdGF0dXMgKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbG1fcmV0dXJuX3ZhbHVlIHsKKwl1OCBlcnJvcl9jb2RlOyAgICAgICAgICAvKiBFcnJvciBDb2RlICovCisJdTggZWNfcmV0dXJuX3ZhbHVlOyAgICAgLyogRUMgUmV0dXJuIFZhbHVlICovCisJdTE2IHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSB7CS8qIEdldCBEZXZpY2UgU3RhdHVzIGlucHV0IHBhcmFtZXRlciAqLworCXU4IGZ1bmN0aW9uX251bTsJLyogRnVuY3Rpb24gTnVtYmVyICovCisJdTggaG90a2V5X251bWJlcjsJLyogSG90a2V5IE51bWJlciAqLworCXUxNiBkZXZpY2VzOwkJLyogR2V0IERldmljZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgewkvKiBHZXQgRGV2aWNlIFN0YXR1cyByZXR1cm4gdmFsdWUqLworCXU4IGVycm9yX2NvZGU7CQkvKiBFcnJvciBDb2RlICovCisJdTggZWNfcmV0dXJuX3ZhbHVlOwkvKiBFQyBSZXR1cm4gVmFsdWUgKi8KKwl1MTYgZGV2aWNlczsJCS8qIEN1cnJlbnQgRGV2aWNlIFN0YXR1cyAqLworCXUzMiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBob3RrZXlfZnVuY3Rpb25fdHlwZV9hYSB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTE2IGhhbmRsZTsKKwl1MTYgY29tbXVuX2Z1bmNfYml0bWFwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKICAqIEludGVyZmFjZSBjYXBhYmlsaXR5IGZsYWdzCkBAIC0xMTYsMTUgKzE5MywxOSBAQAogc3RhdGljIGludCBicmlnaHRuZXNzID0gLTE7CiBzdGF0aWMgaW50IHRocmVlZyA9IC0xOwogc3RhdGljIGludCBmb3JjZV9zZXJpZXM7CitzdGF0aWMgYm9vbCBlY19yYXdfbW9kZTsKK3N0YXRpYyBib29sIGhhc190eXBlX2FhOwogCiBtb2R1bGVfcGFyYW0obWFpbGxlZCwgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbShicmlnaHRuZXNzLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKHRocmVlZywgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbShmb3JjZV9zZXJpZXMsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZWNfcmF3X21vZGUsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhtYWlsbGVkLCAiU2V0IGluaXRpYWwgc3RhdGUgb2YgTWFpbCBMRUQiKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnJpZ2h0bmVzcywgIlNldCBpbml0aWFsIExDRCBiYWNrbGlnaHQgYnJpZ2h0bmVzcyIpOwogTU9EVUxFX1BBUk1fREVTQyh0aHJlZWcsICJTZXQgaW5pdGlhbCBzdGF0ZSBvZiAzRyBoYXJkd2FyZSIpOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zZXJpZXMsICJGb3JjZSBhIGRpZmZlcmVudCBsYXB0b3Agc2VyaWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKGVjX3Jhd19tb2RlLCAiRW5hYmxlIEVDIHJhdyBtb2RlIik7CiAKIHN0cnVjdCBhY2VyX2RhdGEgewogCWludCBtYWlsbGVkOwpAQCAtMTQwLDYgKzIyMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmZraWxsICp3aXJlbGVzc19yZmtpbGw7CiBzdGF0aWMgc3RydWN0IHJma2lsbCAqYmx1ZXRvb3RoX3Jma2lsbDsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp0aHJlZWdfcmZraWxsOwogCiAvKiBFYWNoIGxvdy1sZXZlbCBpbnRlcmZhY2UgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZm9sbG93aW5nICovCiBzdHJ1Y3Qgd21pX2ludGVyZmFjZSB7CkBAIC03NTMsNiArODM1LDI4IEBACiAJcmV0dXJuIFdNSV9leGVjdXRlX3UzMihtZXRob2RfaWQsICh1MzIpdmFsdWUsIE5VTEwpOwogfQogCitzdGF0aWMgdm9pZCB0eXBlX2FhX2RtaV9kZWNvZGUoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmhlYWRlciwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IGhvdGtleV9mdW5jdGlvbl90eXBlX2FhICp0eXBlX2FhOworCisJLyogV2UgYXJlIGxvb2tpbmcgZm9yIE9FTS1zcGVjaWZpYyBUeXBlIEFBaCAqLworCWlmIChoZWFkZXItPnR5cGUgIT0gMHhBQSkKKwkJcmV0dXJuOworCisJaGFzX3R5cGVfYWEgPSB0cnVlOworCXR5cGVfYWEgPSAoc3RydWN0IGhvdGtleV9mdW5jdGlvbl90eXBlX2FhICopIGhlYWRlcjsKKworCXByaW50ayhBQ0VSX0lORk8gIkZ1bmN0aW9uIGJpdG1hcCBmb3IgQ29tbXVuaWNhdGlvbiBCdXR0b246IDB4JXhcbiIsCisJCXR5cGVfYWEtPmNvbW11bl9mdW5jX2JpdG1hcCk7CisKKwlpZiAodHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwICYgQUNFUl9XTUlEM19HRFNfV0lSRUxFU1MpCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKKwlpZiAodHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwICYgQUNFUl9XTUlEM19HRFNfVEhSRUVHKQorCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfVEhSRUVHOworCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgpCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CTFVFVE9PVEg7Cit9CisKIHN0YXRpYyBhY3BpX3N0YXR1cyBXTUlEX3NldF9jYXBhYmlsaXRpZXModm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKQEAgLTc3MywxNiArODc3LDE3IEBACiAJCXJldHVybiBBRV9FUlJPUjsKIAl9CiAKLQkvKiBOb3Qgc3VyZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgcmVsZXZhbnQgYml0cyB5ZXQgdG8gZGV0ZWN0IHRoZXNlICovCi0JaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOwotCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9USFJFRUc7CisJZG1pX3dhbGsodHlwZV9hYV9kbWlfZGVjb2RlLCBOVUxMKTsKKwlpZiAoIWhhc190eXBlX2FhKSB7CisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1RIUkVFRzsKKwkJaWYgKGRldmljZXMgJiAweDEwKQorCQkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKKwl9CiAKIAkvKiBXTUlEIGFsd2F5cyBwcm92aWRlcyBicmlnaHRuZXNzIG1ldGhvZHMgKi8KIAlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQlJJR0hUTkVTUzsKIAotCWlmIChkZXZpY2VzICYgMHgxMCkKLQkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKLQogCWlmICghKGRldmljZXMgJiAweDIwKSkKIAkJbWF4X2JyaWdodG5lc3MgPSAweDk7CiAKQEAgLTg2MSw3ICs5NjYsOCBAQAogCSAqIGNhcGFiaWxpdHkgaXNuJ3QgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBpbnRlcmZhY2UKIAkgKi8KIAlzZXRfdTMyKG1haWxsZWQsIEFDRVJfQ0FQX01BSUxMRUQpOwotCXNldF91MzIodGhyZWVnLCBBQ0VSX0NBUF9USFJFRUcpOworCWlmICghaGFzX3R5cGVfYWEpCisJCXNldF91MzIodGhyZWVnLCBBQ0VSX0NBUF9USFJFRUcpOwogCXNldF91MzIoYnJpZ2h0bmVzcywgQUNFUl9DQVBfQlJJR0hUTkVTUyk7CiB9CiAKQEAgLTkxNSw3ICsxMDIxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFjZXJfYmxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFjZXJfYmxfb3BzID0gewogCS5nZXRfYnJpZ2h0bmVzcyA9IHJlYWRfYnJpZ2h0bmVzcywKIAkudXBkYXRlX3N0YXR1cyA9IHVwZGF0ZV9ibF9zdGF0dXMsCiB9OwpAQCAtOTQ4LDYgKzEwNTQsNzkgQEAKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYWNlcl9iYWNrbGlnaHRfZGV2aWNlKTsKIH0KIAorc3RhdGljIGFjcGlfc3RhdHVzIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHUzMiAqdmFsdWUsIHUxNiBkZXZpY2UpCit7CisJc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0gcGFyYW1zID0geworCQkuZnVuY3Rpb25fbnVtID0gMHgxLAorCQkuaG90a2V5X251bWJlciA9IDB4MDEsCisJCS5kZXZpY2VzID0gZGV2aWNlLAorCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geworCQlzaXplb2Yoc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSksCisJCSZwYXJhbXMKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MiwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKQorCQlwcmludGsoQUNFUl9XQVJOSU5HICJHZXQgRGV2aWNlIFN0YXR1cyBmYWlsZWQ6ICIKKwkJCSIweCV4IC0gMHgleFxuIiwgcmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUsCisJCQlyZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKTsKKwllbHNlCisJCSp2YWx1ZSA9ICEhKHJldHVybl92YWx1ZS5kZXZpY2VzICYgZGV2aWNlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBnZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MzIgY2FwKQoreworCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKKwkJdTE2IGRldmljZTsKKworCQlzd2l0Y2ggKGNhcCkgeworCQljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgorCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9USFJFRUc6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBBRV9FUlJPUjsKKwkJfQorCQlyZXR1cm4gd21pZDNfZ2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gZ2V0X3UzMih2YWx1ZSwgY2FwKTsKKwl9Cit9CisKIC8qCiAgKiBSZmtpbGwgZGV2aWNlcwogICovCkBAIC05NjgsNiArMTE0NywxMyBAQAogCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLCAhc3RhdGUpOwogCX0KIAorCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykgJiYgd21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCXN0YXR1cyA9IHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwKKwkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHRocmVlZ19yZmtpbGwsICFzdGF0ZSk7CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiB9CiAKQEAgLTk5MSw2ICsxMTc3LDggQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCByZmtpbGwgKnJma2lsbF9kZXY7CisJdTMyIHN0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCXJma2lsbF9kZXYgPSByZmtpbGxfYWxsb2MobmFtZSwgZGV2LCB0eXBlLAogCQkJCSAgJmFjZXJfcmZraWxsX29wcywKQEAgLTk5OCw2ICsxMTg2LDEwIEBACiAJaWYgKCFyZmtpbGxfZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCXN0YXR1cyA9IGdldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwgY2FwKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJma2lsbF9pbml0X3N3X3N0YXRlKHJma2lsbF9kZXYsICFzdGF0ZSk7CisKIAllcnIgPSByZmtpbGxfcmVnaXN0ZXIocmZraWxsX2Rldik7CiAJaWYgKGVycikgewogCQlyZmtpbGxfZGVzdHJveShyZmtpbGxfZGV2KTsKQEAgLTEwMjQsNiArMTIxNiwxOSBAQAogCQl9CiAJfQogCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQl0aHJlZWdfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LAorCQkJUkZLSUxMX1RZUEVfV1dBTiwgImFjZXItdGhyZWVnIiwKKwkJCUFDRVJfQ0FQX1RIUkVFRyk7CisJCWlmIChJU19FUlIodGhyZWVnX3Jma2lsbCkpIHsKKwkJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveSh3aXJlbGVzc19yZmtpbGwpOworCQkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveShibHVldG9vdGhfcmZraWxsKTsKKwkJCXJldHVybiBQVFJfRVJSKHRocmVlZ19yZmtpbGwpOworCQl9CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNDAsNiArMTI0NSwxMSBAQAogCQlyZmtpbGxfdW5yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKIAkJcmZraWxsX2Rlc3Ryb3koYmx1ZXRvb3RoX3Jma2lsbCk7CiAJfQorCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQlyZmtpbGxfdW5yZWdpc3Rlcih0aHJlZWdfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3kodGhyZWVnX3Jma2lsbCk7CisJfQogCXJldHVybjsKIH0KIApAQCAtMTA1MCw3ICsxMjYwLDEyIEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgcmVzdWx0OyBcCi0JYWNwaV9zdGF0dXMgc3RhdHVzID0gZ2V0X3UzMigmcmVzdWx0LCBBQ0VSX0NBUF9USFJFRUcpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKQorCQlzdGF0dXMgPSB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cygmcmVzdWx0LAorCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyk7CisJZWxzZQorCQlzdGF0dXMgPSBnZXRfdTMyKCZyZXN1bHQsIEFDRVJfQ0FQX1RIUkVFRyk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVzdWx0KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICJSZWFkIGVycm9yXG4iKTsKQEAgLTEwODUsNiArMTMwMCwxNzggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JUlVHTywgc2hvd19pbnRlcmZhY2UsIE5VTEwpOwogCitzdGF0aWMgdm9pZCBhY2VyX3dtaV9ub3RpZnkodTMyIHZhbHVlLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXNwb25zZSA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKKwlpZiAoc3RhdHVzICE9IEFFX09LKSB7CisJCXByaW50ayhBQ0VSX1dBUk5JTkcgImJhZCBldmVudCBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkICVkXG4iLAorCQkJb2JqLT50eXBlKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlrZnJlZShvYmopOworCisJc3dpdGNoIChyZXR1cm5fdmFsdWUuZnVuY3Rpb24pIHsKKwljYXNlIFdNSURfSE9US0VZX0VWRU5UOgorCQlpZiAoIXNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50KGFjZXJfd21pX2lucHV0X2RldiwKKwkJCQlyZXR1cm5fdmFsdWUua2V5X251bSwgMSwgdHJ1ZSkpCisJCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIGtleSBudW1iZXIgLSAweCV4XG4iLAorCQkJCXJldHVybl92YWx1ZS5rZXlfbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBmdW5jdGlvbiBudW1iZXIgLSAlZCAtICVkXG4iLAorCQkJcmV0dXJuX3ZhbHVlLmZ1bmN0aW9uLCByZXR1cm5fdmFsdWUua2V5X251bSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGFjcGlfc3RhdHVzCit3bWlkM19zZXRfbG1fbW9kZShzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zICpwYXJhbXMsCisJCSAgc3RydWN0IGxtX3JldHVybl92YWx1ZSAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyBzaXplb2Yoc3RydWN0IGxtX2lucHV0X3BhcmFtcyksIHBhcmFtcyB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MSwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDQpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkgICAgICAgb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCSpyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3QgbG1fcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWNlcl93bWlfZW5hYmxlX2VjX3Jhdyh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDAsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgRGVhY3RpdmUgKi8KKwl9OworCisJc3RhdHVzID0gd21pZDNfc2V0X2xtX21vZGUoJnBhcmFtcywgJnJldHVybl92YWx1ZSk7CisKKwlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiRW5hYmxpbmcgRUMgcmF3IG1vZGUgZmFpbGVkOiAiCisJCSAgICAgICAiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkgICAgICAgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisJZWxzZQorCQlwcmludGsoQUNFUl9JTkZPICJFbmFibGVkIEVDIHJhdyBtb2RlIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFjZXJfd21pX2VuYWJsZV9sbSh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDEsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgQWN0aXZlICovCisJfTsKKworCXN0YXR1cyA9IHdtaWQzX3NldF9sbV9tb2RlKCZwYXJhbXMsICZyZXR1cm5fdmFsdWUpOworCisJaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCisJCXByaW50ayhBQ0VSX1dBUk5JTkcgIkVuYWJsaW5nIExhdW5jaCBNYW5hZ2VyIGZhaWxlZDogIgorCQkgICAgICAgIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJICAgICAgIHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNlcl93bWlfaW5wdXRfc2V0dXAodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGVycjsKKworCWFjZXJfd21pX2lucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYWNlcl93bWlfaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjZXJfd21pX2lucHV0X2Rldi0+bmFtZSA9ICJBY2VyIFdNSSBob3RrZXlzIjsKKwlhY2VyX3dtaV9pbnB1dF9kZXYtPnBoeXMgPSAid21pL2lucHV0MCI7CisJYWNlcl93bWlfaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisKKwllcnIgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGFjZXJfd21pX2lucHV0X2RldiwgYWNlcl93bWlfa2V5bWFwLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCXN0YXR1cyA9IHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQsCisJCQkJCQlhY2VyX3dtaV9ub3RpZnksIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKKwl9CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bmluc3RhbGxfbm90aWZpZXI7CisKKwlyZXR1cm4gMDsKKworZXJyX3VuaW5zdGFsbF9ub3RpZmllcjoKKwl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQpOworZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShhY2VyX3dtaV9pbnB1dF9kZXYpOworZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGFjZXJfd21pX2lucHV0X2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYWNlcl93bWlfaW5wdXRfZGVzdHJveSh2b2lkKQoreworCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoQUNFUldNSURfRVZFTlRfR1VJRCk7CisJc3BhcnNlX2tleW1hcF9mcmVlKGFjZXJfd21pX2lucHV0X2Rldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKK30KKwogLyoKICAqIGRlYnVnZnMgZnVuY3Rpb25zCiAgKi8KQEAgLTEzMjcsNiArMTcxNCwyNiBAQAogCQkgICAgICAgImdlbmVyaWMgdmlkZW8gZHJpdmVyXG4iKTsKIAl9CiAKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCWlmIChlY19yYXdfbW9kZSkgeworCQkJaWYgKEFDUElfRkFJTFVSRShhY2VyX3dtaV9lbmFibGVfZWNfcmF3KCkpKSB7CisJCQkJcHJpbnRrKEFDRVJfRVJSICJDYW5ub3QgZW5hYmxlIEVDIHJhdyBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIGlmIChBQ1BJX0ZBSUxVUkUoYWNlcl93bWlfZW5hYmxlX2xtKCkpKSB7CisJCQlwcmludGsoQUNFUl9FUlIgIkNhbm5vdCBlbmFibGUgTGF1bmNoIE1hbmFnZXIgbW9kZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSBpZiAoZWNfcmF3X21vZGUpIHsKKwkJcHJpbnRrKEFDRVJfSU5GTyAiTm8gV01JRCBFQyByYXcgbW9kZSBlbmFibGUgbWV0aG9kXG4iKTsKKwl9CisKKwlpZiAod21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKSB7CisJCWVyciA9IGFjZXJfd21pX2lucHV0X3NldHVwKCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlcl9wbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLlxuIik7CkBAIC0xMzY4LDExICsxNzc1LDE3IEBACiBlcnJvcl9kZXZpY2VfYWxsb2M6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKTsKIGVycm9yX3BsYXRmb3JtX3JlZ2lzdGVyOgorCWlmICh3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpCisJCWFjZXJfd21pX2lucHV0X2Rlc3Ryb3koKTsKKwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY2VyX3dtaV9leGl0KHZvaWQpCiB7CisJaWYgKHdtaV9oYXNfZ3VpZChBQ0VSV01JRF9FVkVOVF9HVUlEKSkKKwkJYWNlcl93bWlfaW5wdXRfZGVzdHJveSgpOworCiAJcmVtb3ZlX3N5c2ZzKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZW1vdmVfZGVidWdmcygpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jCmluZGV4IGQyMzVmNDQuLmYzYWE2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1cy1sYXB0b3AuYwpAQCAtNjQwLDcgKzY0MCw3IEBACiAJcmV0dXJuIGFzdXNfbGNkX3NldChhc3VzLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhc3VzYmxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFzdXNibF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gYXN1c19yZWFkX2JyaWdodG5lc3MsCiAJLnVwZGF0ZV9zdGF0dXMgPSB1cGRhdGVfYmxfc3RhdHVzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXNfYWNwaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1c19hY3BpLmMKaW5kZXggY2EwNWFlZi4uNDYzM2ZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1c19hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXN1c19hY3BpLmMKQEAgLTE0NjcsNyArMTQ2Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhc3VzX2JhY2tsaWdodF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFzdXNfYmFja2xpZ2h0X2RhdGEgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gcmVhZF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzICA9IHNldF9icmlnaHRuZXNzX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jbGFzc21hdGUtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jbGFzc21hdGUtbGFwdG9wLmMKaW5kZXggMzQxY2JmZS4uOTExMTM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYwpAQCAtNTIyLDE4ICs1MjIsMjAgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZTsKKwlib29sIGlzX2Jsb2NrZWQ7CiAKIAloYW5kbGUgPSBkYXRhOwogCXN0YXR1cyA9IGNtcGNfZ2V0X3Jma2lsbF93bGFuKGhhbmRsZSwgJnN0YXRlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwotCWlmIChibG9ja2VkKQotCQlzdGF0ZSAmPSB+MTsKLQllbHNlCi0JCXN0YXRlIHw9IDE7Ci0Jc3RhdHVzID0gY21wY19zZXRfcmZraWxsX3dsYW4oaGFuZGxlLCBzdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBDaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byBjYWxsIGNtcGNfc2V0X3Jma2lsbF93bGFuICovCisJaXNfYmxvY2tlZCA9IHN0YXRlICYgMSA/IGZhbHNlIDogdHJ1ZTsKKwlpZiAoaXNfYmxvY2tlZCAhPSBibG9ja2VkKSB7CisJCXN0YXRlID0gYmxvY2tlZCA/IDAgOiAxOworCQlzdGF0dXMgPSBjbXBjX3NldF9yZmtpbGxfd2xhbihoYW5kbGUsIHN0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQogCXJldHVybiAwOwogfQogCkBAIC02NTMsOCArNjU1LDkgQEAKIAogCWlmICgoZXZlbnQgJiAweDBGKSA8IEFSUkFZX1NJWkUoY21wY19rZXlzX2NvZGVzKSkKIAkJY29kZSA9IGNtcGNfa2V5c19jb2Rlc1tldmVudCAmIDB4MEZdOwotCWlucHV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7OworCWlucHV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CiAJaW5wdXRfcmVwb3J0X2tleShpbnB1dGRldiwgY29kZSwgIShldmVudCAmIDB4MTApKTsKKwlpbnB1dF9zeW5jKGlucHV0ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgY21wY19rZXlzX2lkZXZfaW5pdChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwppbmRleCAwOTcwODNjLi4wMzQ1NzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCkBAIC04NzIsNiArODcyLDE0IEBACiAJCX0sCiAJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYl9leHRyYQogCX0sCisJeworCQkuaWRlbnQgPSAiS0hMQjIiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIktITEIyIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFUlNJT04sICJSRUZFUkVOQ0UiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX2V4dHJhCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCmluZGV4IGNmOGE4OWEuLjM0NjU3ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwpAQCAtNTQ2LDcgKzU0Niw3IEBACiAJcmV0dXJuIGJ1ZmZlci0+b3V0cHV0WzFdOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZGVsbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgZGVsbF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gZGVsbF9nZXRfaW50ZW5zaXR5LAogCS51cGRhdGVfc3RhdHVzICA9IGRlbGxfc2VuZF9pbnRlbnNpdHksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwppbmRleCBiMmVkZmRjLi40OWQ5YWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwpAQCAtNTI5LDYgKzUyOSwxNSBAQAogCXF1ZXVlX3dvcmsoZWVlcGMtPmxlZF93b3JrcXVldWUsICZlZWVwYy0+dHBkX2xlZF93b3JrKTsKIH0KIAorc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdHBkX2xlZF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IGVlZXBjX2xhcHRvcCAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGVlZXBjX2xhcHRvcCwgdHBkX2xlZCk7CisKKwlyZXR1cm4gZ2V0X2FjcGkoZWVlcGMsIENNX0FTTF9UUEQpOworfQorCiBzdGF0aWMgaW50IGVlZXBjX2xlZF9pbml0KHN0cnVjdCBlZWVwY19sYXB0b3AgKmVlZXBjKQogewogCWludCBydjsKQEAgLTU0Myw2ICs1NTIsOCBAQAogCiAJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOwogCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJaWYgKGdldF9hY3BpKGVlZXBjLCBDTV9BU0xfVFBEKSA+PSAwKSAvKiBpZiBtZXRob2QgaXMgYXZhaWxhYmxlICovCisJICBlZWVwYy0+dHBkX2xlZC5icmlnaHRuZXNzX2dldCA9IHRwZF9sZWRfZ2V0OwogCWVlZXBjLT50cGRfbGVkLm1heF9icmlnaHRuZXNzID0gMTsKIAogCXJ2ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZlZWVwYy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYsCkBAIC0xMTE1LDcgKzExMjYsNyBAQAogCXJldHVybiBzZXRfYnJpZ2h0bmVzcyhiZCwgYmQtPnByb3BzLmJyaWdodG5lc3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZWVlcGNibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgZWVlcGNibF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gcmVhZF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzID0gdXBkYXRlX2JsX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCmluZGV4IDBkNTBmYmIuLjRkMzhmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCkBAIC0yLDYgKzIsNyBAQAogICogRWVlIFBDIFdNSSBob3RrZXkgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0KEMpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoQykgMjAxMCBDb3JlbnRpbiBDaGFyeSA8Y29yZW50aW4uY2hhcnlAZ21haWwuY29tPgogICoKICAqIFBvcnRpb25zIGJhc2VkIG9uIHdpc3Ryb25fYnRucy5jOgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1pbG9zbGF2IFRybWFjIDxtaXRyQHZvbG55LmN6PgpAQCAtMzQsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CkBAIC00NCw2ICs0OSw4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkVlZSBQQyBXTUkgSG90a2V5IERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisjZGVmaW5lIEVFRVBDX0FDUElfSElECQkiQVNVUzAxMCIgLyogb2xkIF9ISUQgdXNlZCBpbiBlZWVwYy1sYXB0b3AgKi8KKwogI2RlZmluZSBFRUVQQ19XTUlfRVZFTlRfR1VJRAkiQUJCQzBGNzItOEVBMS0xMUQxLTAwQTAtQzkwNjI5MTAwMDAwIgogI2RlZmluZSBFRUVQQ19XTUlfTUdNVF9HVUlECSI5Nzg0NUVEMC00RTZELTExREUtOEEzOS0wODAwMjAwQzlBNjYiCiAKQEAgLTYwLDYgKzY3LDEwIEBACiAjZGVmaW5lIEVFRVBDX1dNSV9NRVRIT0RJRF9DRlZTCTB4NTM1NjQ2NDMKIAogI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hUCTB4MDAwNTAwMTIKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1RQRExFRAkJMHgwMDEwMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfV0xBTgkJMHgwMDAxMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkxVRVRPT1RICTB4MDAwMTAwMTMKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1dXQU4zRwkJMHgwMDAxMDAxOQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGtleV9lbnRyeSBlZWVwY193bWlfa2V5bWFwW10gPSB7CiAJLyogU2xlZXAgYWxyZWFkeSBoYW5kbGVkIHZpYSBnZW5lcmljIEFDUEkgY29kZSAqLwpAQCAtODMsMTEgKzk0LDM3IEBACiAJdTMyCWN0cmxfcGFyYW07CiB9OwogCisvKgorICogZWVlcGMtd21pLyAgICAtIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkKKyAqICAgZGV2X2lkICAgICAgLSBjdXJyZW50IGRldl9pZAorICogICBjdHJsX3BhcmFtICAtIGN1cnJlbnQgY3RybF9wYXJhbQorICogICBkZXZzICAgICAgICAtIGNhbGwgREVWUyhkZXZfaWQsIGN0cmxfcGFyYW0pIGFuZCBwcmludCByZXN1bHQKKyAqICAgZHN0cyAgICAgICAgLSBjYWxsIERTVFMoZGV2X2lkKSAgYW5kIHByaW50IHJlc3VsdAorICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnIHsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXUzMiBkZXZfaWQ7CisJdTMyIGN0cmxfcGFyYW07Cit9OworCiBzdHJ1Y3QgZWVlcGNfd21pIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldmljZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CisKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IHRwZF9sZWQ7CisJaW50IHRwZF9sZWRfd2s7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmxlZF93b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHRwZF9sZWRfd29yazsKKworCXN0cnVjdCByZmtpbGwgKndsYW5fcmZraWxsOworCXN0cnVjdCByZmtpbGwgKmJsdWV0b290aF9yZmtpbGw7CisJc3RydWN0IHJma2lsbCAqd3dhbjNnX3Jma2lsbDsKKworCXN0cnVjdCBlZWVwY193bWlfZGVidWcgZGVidWc7CiB9OwogCisvKiBPbmx5IHVzZWQgaW4gZWVlcGNfd21pX2luaXQoKSBhbmQgZWVlcGNfd21pX2V4aXQoKSAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZTsKIAogc3RhdGljIGludCBlZWVwY193bWlfaW5wdXRfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKQEAgLTEwMSw3ICsxMzgsNyBAQAogCWVlZXBjLT5pbnB1dGRldi0+bmFtZSA9ICJFZWUgUEMgV01JIGhvdGtleXMiOwogCWVlZXBjLT5pbnB1dGRldi0+cGh5cyA9IEVFRVBDX1dNSV9GSUxFICIvaW5wdXQwIjsKIAllZWVwYy0+aW5wdXRkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQllZWVwYy0+aW5wdXRkZXYtPmRldi5wYXJlbnQgPSAmcGxhdGZvcm1fZGV2aWNlLT5kZXY7CisJZWVlcGMtPmlucHV0ZGV2LT5kZXYucGFyZW50ID0gJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldjsKIAogCWVyciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoZWVlcGMtPmlucHV0ZGV2LCBlZWVwY193bWlfa2V5bWFwLCBOVUxMKTsKIAlpZiAoZXJyKQpAQCAtMTMwLDcgKzE2Nyw3IEBACiAJZWVlcGMtPmlucHV0ZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpjdHJsX3BhcmFtKQorc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpyZXR2YWwpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyAoYWNwaV9zaXplKXNpemVvZih1MzIpLCAmZGV2X2lkIH07CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKQEAgLTE1MCw4ICsxODcsOCBAQAogCWVsc2UKIAkJdG1wID0gMDsKIAotCWlmIChjdHJsX3BhcmFtKQotCQkqY3RybF9wYXJhbSA9IHRtcDsKKwlpZiAocmV0dmFsKQorCQkqcmV0dmFsID0gdG1wOwogCiAJa2ZyZWUob2JqKTsKIApAQCAtMTU5LDcgKzE5Niw4IEBACiAKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyIGN0cmxfcGFyYW0pCitzdGF0aWMgYWNwaV9zdGF0dXMgZWVlcGNfd21pX3NldF9kZXZzdGF0ZSh1MzIgZGV2X2lkLCB1MzIgY3RybF9wYXJhbSwKKwkJCQkJICB1MzIgKnJldHZhbCkKIHsKIAlzdHJ1Y3QgYmlvc19hcmdzIGFyZ3MgPSB7CiAJCS5kZXZfaWQgPSBkZXZfaWQsCkBAIC0xNjgsMzQgKzIwNiwyODEgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IChhY3BpX3NpemUpc2l6ZW9mKGFyZ3MpLCAmYXJncyB9OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwKLQkJCTEsIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLCAmaW5wdXQsIE5VTEwpOworCWlmICghcmV0dmFsKSB7CisJCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwgMSwKKwkJCQkJICAgICBFRUVQQ19XTUlfTUVUSE9ESURfREVWUywKKwkJCQkJICAgICAmaW5wdXQsIE5VTEwpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJCXUzMiB0bXA7CisKKwkJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChFRUVQQ19XTUlfTUdNVF9HVUlELCAxLAorCQkJCQkgICAgIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLAorCQkJCQkgICAgICZpbnB1dCwgJm91dHB1dCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilvdXRwdXQucG9pbnRlcjsKKwkJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCQl0bXAgPSAodTMyKW9iai0+aW50ZWdlci52YWx1ZTsKKwkJZWxzZQorCQkJdG1wID0gMDsKKworCQkqcmV0dmFsID0gdG1wOworCisJCWtmcmVlKG9iaik7CisJfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQorLyoKKyAqIExFRHMKKyAqLworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhY3R1YWxseSB1cGRhdGUgdGhlIExFRCdzLCBhbmQgYXJlIGNhbGxlZCBmcm9tIGEKKyAqIHdvcmtxdWV1ZS4gQnkgZG9pbmcgdGhpcyBhcyBzZXBhcmF0ZSB3b3JrIHJhdGhlciB0aGFuIHdoZW4gdGhlIExFRAorICogc3Vic3lzdGVtIGFza3MsIHdlIGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUgRWVlcGMgQUNQSSBzdHVmZiBkdXJpbmcgYQorICogcG90ZW50aWFsbHkgYmFkIHRpbWUsIHN1Y2ggYXMgYSB0aW1lciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIHRwZF9sZWRfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdGF0aWMgdTMyIGN0cmxfcGFyYW07CisJaW50IGN0cmxfcGFyYW07CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkX3dvcmspOworCisJY3RybF9wYXJhbSA9IGVlZXBjLT50cGRfbGVkX3drOworCWVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX1RQRExFRCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHRwZF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKKworCWVlZXBjID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkKTsKKworCWVlZXBjLT50cGRfbGVkX3drID0gISF2YWx1ZTsKKwlxdWV1ZV93b3JrKGVlZXBjLT5sZWRfd29ya3F1ZXVlLCAmZWVlcGMtPnRwZF9sZWRfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cGRfc3RhdGUoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJdTMyIHJldHZhbDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZjdHJsX3BhcmFtKTsKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9UUERMRUQsICZyZXR2YWwpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoIXJldHZhbCB8fCByZXR2YWwgPT0gMHgwMDA2MDAwMCkKKwkJLyoKKwkJICogaWYgdG91Y2hwYWQgbGVkIGlzIHByZXNlbnQsIERTVFMgd2lsbCBzZXQgc29tZSBiaXRzLAorCQkgKiB1c3VhbGx5IDB4MDAwMjAwMDAuCisJCSAqIDB4MDAwNjAwMDAgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQKKwkJICovCisJCXJldHVybiAtRU5PREVWOworCWVsc2UKKwkJLyogU3RhdHVzIGlzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYml0ICovCisJCXJldHVybiByZXR2YWwgJiAweDE7Cit9CisKK3N0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzIHRwZF9sZWRfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCisJZWVlcGMgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBlZWVwY193bWksIHRwZF9sZWQpOworCisJcmV0dXJuIHJlYWRfdHBkX3N0YXRlKGVlZXBjKTsKK30KKworc3RhdGljIGludCBlZWVwY193bWlfbGVkX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJ2OworCisJaWYgKHJlYWRfdHBkX3N0YXRlKGVlZXBjKSA8IDApCisJCXJldHVybiAwOworCisJZWVlcGMtPmxlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGVkX3dvcmtxdWV1ZSIpOworCWlmICghZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfV09SSygmZWVlcGMtPnRwZF9sZWRfd29yaywgdHBkX2xlZF91cGRhdGUpOworCisJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOworCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJZWVlcGMtPnRwZF9sZWQuYnJpZ2h0bmVzc19nZXQgPSB0cGRfbGVkX2dldDsKKwllZWVwYy0+dHBkX2xlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7CisKKwlydiA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJCSAgICZlZWVwYy0+dHBkX2xlZCk7CisJaWYgKHJ2KSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlZWVwY193bWlfbGVkX2V4aXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaWYgKGVlZXBjLT50cGRfbGVkLmRldikKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmVlZXBjLT50cGRfbGVkKTsKKwlpZiAoZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKK30KKworLyoKKyAqIFJma2lsbCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgZWVlcGNfcmZraWxsX3NldCh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIGN0cmxfcGFyYW0gPSAhYmxvY2tlZDsKKworCXJldHVybiBlZWVwY193bWlfc2V0X2RldnN0YXRlKGRldl9pZCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3Jma2lsbF9xdWVyeShzdHJ1Y3QgcmZraWxsICpyZmtpbGwsIHZvaWQgKmRhdGEpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKGRldl9pZCwgJnJldHZhbCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiA7CisKKwlyZmtpbGxfc2V0X3N3X3N0YXRlKHJma2lsbCwgIShyZXR2YWwgJiAweDEpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZmtpbGxfb3BzIGVlZXBjX3Jma2lsbF9vcHMgPSB7CisJLnNldF9ibG9jayA9IGVlZXBjX3Jma2lsbF9zZXQsCisJLnF1ZXJ5ID0gZWVlcGNfcmZraWxsX3F1ZXJ5LAorfTsKKworc3RhdGljIGludCBlZWVwY19uZXdfcmZraWxsKHN0cnVjdCBlZWVwY193bWkgKmVlZXBjLAorCQkJICAgIHN0cnVjdCByZmtpbGwgKipyZmtpbGwsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBlbnVtIHJma2lsbF90eXBlIHR5cGUsIGludCBkZXZfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1MzIgcmV0dmFsOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUoZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC0xOworCisJLyogSWYgdGhlIGRldmljZSBpcyBwcmVzZW50LCBEU1RTIHdpbGwgYWx3YXlzIHNldCBzb21lIGJpdHMKKwkgKiAweDAwMDcwMDAwIC0gMTExMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDYwMDAwIC0gMTEwMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQKKwkgKiAweDAwMDIwMDAwIC0gMDEwMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDEwMDAwIC0gMDAxMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQgLyBzcGVjaWFsIG1vZGUgPworCSAqLworCWlmICghcmV0dmFsIHx8IHJldHZhbCA9PSAweDAwMDYwMDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZmtpbGwgPSByZmtpbGxfYWxsb2MobmFtZSwgJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldiwgdHlwZSwKKwkJCSAgICAgICAmZWVlcGNfcmZraWxsX29wcywgKHZvaWQgKikobG9uZylkZXZfaWQpOworCisJaWYgKCEqcmZraWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJma2lsbF9pbml0X3N3X3N0YXRlKCpyZmtpbGwsICEocmV0dmFsICYgMHgxKSk7CisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKCpyZmtpbGwpOworCWlmIChyZXN1bHQpIHsKKwkJcmZraWxsX2Rlc3Ryb3koKnJma2lsbCk7CisJCSpyZmtpbGwgPSBOVUxMOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWVlcGNfd21pX3Jma2lsbF9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWlmIChlZWVwYy0+d2xhbl9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJZWVlcGMtPndsYW5fcmZraWxsID0gTlVMTDsKKwl9CisJaWYgKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPmJsdWV0b290aF9yZmtpbGwpOworCQllZWVwYy0+Ymx1ZXRvb3RoX3Jma2lsbCA9IE5VTEw7CisJfQorCWlmIChlZWVwYy0+d3dhbjNnX3Jma2lsbCkgeworCQlyZmtpbGxfdW5yZWdpc3RlcihlZWVwYy0+d3dhbjNnX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KGVlZXBjLT53d2FuM2dfcmZraWxsKTsKKwkJZWVlcGMtPnd3YW4zZ19yZmtpbGwgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBlZWVwY193bWlfcmZraWxsX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBlZWVwY19uZXdfcmZraWxsKGVlZXBjLCAmZWVlcGMtPndsYW5fcmZraWxsLAorCQkJCSAgImVlZXBjLXdsYW4iLCBSRktJTExfVFlQRV9XTEFOLAorCQkJCSAgRUVFUENfV01JX0RFVklEX1dMQU4pOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT5ibHVldG9vdGhfcmZraWxsLAorCQkJCSAgImVlZXBjLWJsdWV0b290aCIsIFJGS0lMTF9UWVBFX0JMVUVUT09USCwKKwkJCQkgIEVFRVBDX1dNSV9ERVZJRF9CTFVFVE9PVEgpOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT53d2FuM2dfcmZraWxsLAorCQkJCSAgImVlZXBjLXd3YW4zZyIsIFJGS0lMTF9UWVBFX1dXQU4sCisJCQkJICBFRUVQQ19XTUlfREVWSURfV1dBTjNHKTsKKworCWlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IC1FTk9ERVYpCisJCWdvdG8gZXhpdDsKKworZXhpdDoKKwlpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSAtRU5PREVWKQorCQllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCisJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJhY2tsaWdodAorICovCitzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZyZXR2YWwpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLTE7CiAJZWxzZQotCQlyZXR1cm4gY3RybF9wYXJhbSAmIDB4RkY7CisJCXJldHVybiByZXR2YWwgJiAweEZGOwogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCi0Jc3RhdGljIHUzMiBjdHJsX3BhcmFtOworCXUzMiBjdHJsX3BhcmFtOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWN0cmxfcGFyYW0gPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKIAotCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX0JBQ0tMSUdIVCwgY3RybF9wYXJhbSk7CisJc3RhdHVzID0gZWVlcGNfd21pX3NldF9kZXZzdGF0ZShFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hULAorCQkJCQljdHJsX3BhcmFtLCBOVUxMKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC0xOwpAQCAtMjM0LDcgKzUxOSw3IEBACiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwogCXByb3BzLm1heF9icmlnaHRuZXNzID0gMTU7CiAJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKEVFRVBDX1dNSV9GSUxFLAotCQkJCSAgICAgICAmcGxhdGZvcm1fZGV2aWNlLT5kZXYsIGVlZXBjLAorCQkJCSAgICAgICAmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LCBlZWVwYywKIAkJCQkgICAgICAgJmVlZXBjX3dtaV9ibF9vcHMsICZwcm9wcyk7CiAJaWYgKElTX0VSUihiZCkpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CkBAIC0zMjEsNjUgKzYwNiwyNDAgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGNwdWZ2LCBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCwgc3RvcmVfY3B1ZnYpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGxhdGZvcm1fYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9jcHVmdi5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBwbGF0Zm9ybV9hdHRyaWJ1dGVzCit9OworCiBzdGF0aWMgdm9pZCBlZWVwY193bWlfc3lzZnNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NwdWZ2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldmljZS0+ZGV2LmtvYmosICZwbGF0Zm9ybV9hdHRyaWJ1dGVfZ3JvdXApOwogfQogCiBzdGF0aWMgaW50IGVlZXBjX3dtaV9zeXNmc19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgcmV0dmFsID0gLUVOT01FTTsKLQotCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9jcHVmdik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcl9zeXNmczsKLQotCXJldHVybiAwOwotCi1lcnJvcl9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2aWNlLT5kZXYua29iaiwgJnBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCisvKgorICogUGxhdGZvcm0gZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQogewotCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCWludCBlcnI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRUVFUENfV01JX0ZJTEUsIC0xKTsKKwlpZiAoIWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UsIGVlZXBjKTsKIAotCWVyciA9IGVlZXBjX3dtaV9pbnB1dF9pbml0KGVlZXBjKTsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyb3JfaW5wdXQ7CisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2U7CiAKLQlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgewotCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9iYWNrbGlnaHQ7Ci0JfSBlbHNlCi0JCXByX2luZm8oIkJhY2tsaWdodCBjb250cm9sbGVkIGJ5IEFDUEkgdmlkZW8gZHJpdmVyXG4iKTsKKwllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChlZWVwYy0+cGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfc3lzZnM7CisJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSB3bWlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCwKLQkJCQkJZWVlcGNfd21pX25vdGlmeSwgZWVlcGMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBub3RpZnkgaGFuZGxlciAtICVkXG4iLAotCQkJc3RhdHVzKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl93bWk7CitmYWlsX3N5c2ZzOgorCXBsYXRmb3JtX2RldmljZV9kZWwoZWVlcGMtPnBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWVlZXBjX3dtaV9zeXNmc19leGl0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworfQorCisvKgorICogZGVidWdmcworICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnZnNfbm9kZSB7CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisJY2hhciAqbmFtZTsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworfTsKKworc3RhdGljIGludCBzaG93X2RzdHMoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjID0gbS0+cHJpdmF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHZhbCA9IC0xOworCisJc3RhdHVzID0gZWVlcGNfd21pX2dldF9kZXZzdGF0ZShlZWVwYy0+ZGVidWcuZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJEU1RTKCV4KSA9ICV4XG4iLCBlZWVwYy0+ZGVidWcuZGV2X2lkLCByZXR2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19kZXZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYyA9IG0tPnByaXZhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiByZXR2YWwgPSAtMTsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJCQkJZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sICZyZXR2YWwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJERVZTKCV4LCAleCkgPSAleFxuIiwgZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJICAgZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sIHJldHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlIGVlZXBjX3dtaV9kZWJ1Z19maWxlc1tdID0geworCXsgTlVMTCwgImRldnMiLCBzaG93X2RldnMgfSwKKwl7IE5VTEwsICJkc3RzIiwgc2hvd19kc3RzIH0sCit9OworCitzdGF0aWMgaW50IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVlZXBjX3dtaV9kZWJ1Z2ZzX25vZGUgKm5vZGUgPSBpbm9kZS0+aV9wcml2YXRlOworCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG5vZGUtPnNob3csIG5vZGUtPmVlZXBjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWVlcGNfd21pX2RlYnVnZnNfaW9fb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICA9IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBlZWVwY193bWlfZGVidWdmc19leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShlZWVwYy0+ZGVidWcucm9vdCk7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfd21pX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCWludCBpOworCisJZWVlcGMtPmRlYnVnLnJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoRUVFUENfV01JX0ZJTEUsIE5VTEwpOworCWlmICghZWVlcGMtPmRlYnVnLnJvb3QpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5Iik7CisJCWdvdG8gZXJyb3JfZGVidWdmczsKKwl9CisKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfeDMyKCJkZXZfaWQiLCBTX0lSVUdPfFNfSVdVU1IsCisJCQkJICBlZWVwYy0+ZGVidWcucm9vdCwgJmVlZXBjLT5kZWJ1Zy5kZXZfaWQpOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX3gzMigiY3RybF9wYXJhbSIsIFNfSVJVR098U19JV1VTUiwKKwkJCQkgIGVlZXBjLT5kZWJ1Zy5yb290LCAmZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0pOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWVlcGNfd21pX2RlYnVnX2ZpbGVzKTsgaSsrKSB7CisJCXN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlICpub2RlID0gJmVlZXBjX3dtaV9kZWJ1Z19maWxlc1tpXTsKKworCQlub2RlLT5lZWVwYyA9IGVlZXBjOworCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShub2RlLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJICAgZWVlcGMtPmRlYnVnLnJvb3QsIG5vZGUsCisJCQkJCSAgICZlZWVwY193bWlfZGVidWdmc19pb19vcHMpOworCQlpZiAoIWRlbnQpIHsKKwkJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBmaWxlOiAlc1xuIiwgbm9kZS0+bmFtZSk7CisJCQlnb3RvIGVycm9yX2RlYnVnZnM7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyb3Jfd21pOgotCWVlZXBjX3dtaV9iYWNrbGlnaHRfZXhpdChlZWVwYyk7Ci1lcnJvcl9iYWNrbGlnaHQ6Ci0JZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOwotZXJyb3JfaW5wdXQ6Ci0JcmV0dXJuIGVycjsKK2Vycm9yX2RlYnVnZnM6CisJZWVlcGNfd21pX2RlYnVnZnNfZXhpdChlZWVwYyk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQorLyoKKyAqIFdNSSBEcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBfX2luaXQgZWVlcGNfd21pX2FkZCh2b2lkKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgZXJyOworCisJZWVlcGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWVlcGNfd21pKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZWVwYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2UgZmlyc3QuICBJdCBpcyB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUKKwkgKiBzdWItZGV2aWNlcyBiZWxvdy4KKwkgKi8KKwllcnIgPSBlZWVwY193bWlfcGxhdGZvcm1faW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3BsYXRmb3JtOworCisJZXJyID0gZWVlcGNfd21pX2lucHV0X2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9pbnB1dDsKKworCWVyciA9IGVlZXBjX3dtaV9sZWRfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2xlZHM7CisKKwllcnIgPSBlZWVwY193bWlfcmZraWxsX2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9yZmtpbGw7CisKKwlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgeworCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX2JhY2tsaWdodDsKKwl9IGVsc2UKKwkJcHJfaW5mbygiQmFja2xpZ2h0IGNvbnRyb2xsZWQgYnkgQUNQSSB2aWRlbyBkcml2ZXJcbiIpOworCisJc3RhdHVzID0gd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQsCisJCQkJCSAgICBlZWVwY193bWlfbm90aWZ5LCBlZWVwYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIG5vdGlmeSBoYW5kbGVyIC0gJWRcbiIsCisJCQlzdGF0dXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfd21pX2hhbmRsZXI7CisJfQorCisJZXJyID0gZWVlcGNfd21pX2RlYnVnZnNfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2RlYnVnZnM7CisKKwlyZXR1cm4gZWVlcGMtPnBsYXRmb3JtX2RldmljZTsKKworZmFpbF9kZWJ1Z2ZzOgorCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQpOworZmFpbF93bWlfaGFuZGxlcjoKKwllZWVwY193bWlfYmFja2xpZ2h0X2V4aXQoZWVlcGMpOworZmFpbF9iYWNrbGlnaHQ6CisJZWVlcGNfd21pX3Jma2lsbF9leGl0KGVlZXBjKTsKK2ZhaWxfcmZraWxsOgorCWVlZXBjX3dtaV9sZWRfZXhpdChlZWVwYyk7CitmYWlsX2xlZHM6CisJZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOworZmFpbF9pbnB1dDoKKwllZWVwY193bWlfcGxhdGZvcm1fZXhpdChlZWVwYyk7CitmYWlsX3BsYXRmb3JtOgorCWtmcmVlKGVlZXBjKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGVlZXBjX3dtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCkBAIC0zODcsNyArODQ3LDEyIEBACiAJd21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCk7CiAJZWVlcGNfd21pX2JhY2tsaWdodF9leGl0KGVlZXBjKTsKIAllZWVwY193bWlfaW5wdXRfZXhpdChlZWVwYyk7CisJZWVlcGNfd21pX2xlZF9leGl0KGVlZXBjKTsKKwllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9kZWJ1Z2ZzX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KGVlZXBjKTsKIAorCWtmcmVlKGVlZXBjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk2LDEzICs4NjEsMzEgQEAKIAkJLm5hbWUgPSBFRUVQQ19XTUlfRklMRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkucHJvYmUgPSBlZWVwY193bWlfcGxhdGZvcm1fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUpLAogfTsKIAorc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBlZWVwY193bWlfcGFyc2VfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLAorCQkJCQkJIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCit7CisJcHJfd2FybmluZygiRm91bmQgbGVnYWN5IEFUS0QgZGV2aWNlICglcykiLCBFRUVQQ19BQ1BJX0hJRCk7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZWVwY193bWlfY2hlY2tfYXRrZCh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKEVFRVBDX0FDUElfSElELCBlZWVwY193bWlfcGFyc2VfZGV2aWNlLAorCQkJCSAgJmZvdW5kLCBOVUxMKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZWVlcGNfd21pX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKIAlpbnQgZXJyOwogCiAJaWYgKCF3bWlfaGFzX2d1aWQoRUVFUENfV01JX0VWRU5UX0dVSUQpIHx8CkBAIC00MTEsNTggKzg5NCw0MCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllZWVwYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZWVwY193bWkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVlZXBjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhFRUVQQ19XTUlfRklMRSwgLTEpOwotCWlmICghcGxhdGZvcm1fZGV2aWNlKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhbGxvY2F0ZSBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfcGxhdGZvcm07CisJaWYgKGVlZXBjX3dtaV9jaGVja19hdGtkKCkpIHsKKwkJcHJfd2FybmluZygiV01JIGRldmljZSBwcmVzZW50LCBidXQgbGVnYWN5IEFUS0QgZGV2aWNlIGlzIGFsc28gIgorCQkJICAgInByZXNlbnQgYW5kIGVuYWJsZWQuIik7CisJCXByX3dhcm5pbmcoIllvdSBwcm9iYWJseSBib290ZWQgd2l0aCBhY3BpX29zaT1cIkxpbnV4XCIgb3IgIgorCQkJICAgImFjcGlfb3NpPVwiIVdpbmRvd3MgMjAwOVwiIik7CisJCXByX3dhcm5pbmcoIkNhbid0IGxvYWQgZWVlcGMtd21pLCB1c2UgZGVmYXVsdCBhY3BpX29zaSAiCisJCQkgICAiKHByZWZlcnJlZCkgb3IgZWVlcGMtbGFwdG9wIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGxhdGZvcm1fZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhZGQgcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJZ290byBwdXRfZGV2OworCXBsYXRmb3JtX2RldmljZSA9IGVlZXBjX3dtaV9hZGQoKTsKKwlpZiAoSVNfRVJSKHBsYXRmb3JtX2RldmljZSkpIHsKKwkJZXJyID0gUFRSX0VSUihwbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIGZhaWxfZWVlcGNfd21pOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtX2RldmljZSwgZWVlcGMpOwotCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJfd2FybmluZygiVW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCWdvdG8gZGVsX2RldjsKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RyaXZlcjsKIAl9CiAKLQllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChwbGF0Zm9ybV9kZXZpY2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZGVsX3N5c2ZzOwotCiAJcmV0dXJuIDA7CiAKLWRlbF9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotZGVsX2RldjoKLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBsYXRmb3JtX2RldmljZSk7Ci1wdXRfZGV2OgotCXBsYXRmb3JtX2RldmljZV9wdXQocGxhdGZvcm1fZGV2aWNlKTsKLWZhaWxfcGxhdGZvcm06Ci0Ja2ZyZWUoZWVlcGMpOwotCitmYWlsX3BsYXRmb3JtX2RyaXZlcjoKKwllZWVwY193bWlfcmVtb3ZlKHBsYXRmb3JtX2RldmljZSk7CitmYWlsX2VlZXBjX3dtaToKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWVlcGNfd21pX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKLQotCWVlZXBjX3dtaV9zeXNmc19leGl0KHBsYXRmb3JtX2RldmljZSk7Ci0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybV9kZXZpY2UpOworCWVlZXBjX3dtaV9yZW1vdmUocGxhdGZvcm1fZGV2aWNlKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGxhdGZvcm1fZHJpdmVyKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2UpOwotCWtmcmVlKGVlZXBjKTsKIH0KIAogbW9kdWxlX2luaXQoZWVlcGNfd21pX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKaW5kZXggZjQ0Y2QyNi4uOTVlM2IwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZnVqaXRzdWJsX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBmdWppdHN1Ymxfb3BzID0gewogCS5nZXRfYnJpZ2h0bmVzcyA9IGJsX2dldF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzID0gYmxfdXBkYXRlX3N0YXR1cywKIH07CkBAIC02ODksNyArNjg5LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2ZyZWVfaW5wdXRfZGV2OwogCi0JcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3Bvd2VyKGZ1aml0c3UtPmFjcGlfaGFuZGxlLCAmc3RhdGUpOworCXJlc3VsdCA9IGFjcGlfYnVzX3VwZGF0ZV9wb3dlcihmdWppdHN1LT5hY3BpX2hhbmRsZSwgJnN0YXRlKTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaW5wdXRfZGV2OwpAQCAtODU3LDcgKzg1Nyw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9mcmVlX2lucHV0X2RldjsKIAotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihmdWppdHN1X2hvdGtleS0+YWNwaV9oYW5kbGUsICZzdGF0ZSk7CisJcmVzdWx0ID0gYWNwaV9idXNfdXBkYXRlX3Bvd2VyKGZ1aml0c3VfaG90a2V5LT5hY3BpX2hhbmRsZSwgJnN0YXRlKTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfaW5wdXRfZGV2OwpAQCAtMTI0MCw3ICsxMjQwLDcgQEAKIE1PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVVNJRU1FTlM6KjpwdnI6cnZuRlVKSVRTVTpybkZKTkIxRTY6KjpjdnJTNjQyMDoqIik7CiBNT0RVTEVfQUxJQVMoImRtaToqOnN2bkZVSklUU1U6KjpwdnI6cnZuRlVKSVRTVTpybkZKTkIxOUM6KjpjdnJTNzAyMDoqIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfaWRzW10gPSB7CitzdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgcG5wX2lkc1tdIF9fdXNlZCA9IHsKIAl7LmlkID0gIkZVSjAyYmYifSwKIAl7LmlkID0gIkZVSjAyQjEifSwKIAl7LmlkID0gIkZVSjAyRTMifSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jCmluZGV4IDVmZjEyMjAuLjExNGQ5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgaWRlYXBhZF9hY3BpLmMgLSBMZW5vdm8gSWRlYVBhZCBBQ1BJIEV4dHJhcworICogIGlkZWFwYWQtbGFwdG9wLmMgLSBMZW5vdm8gSWRlYVBhZCBBQ1BJIEV4dHJhcwogICoKICAqICBDb3B5cmlnaHQgwqkgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgogICogIENvcHlyaWdodCDCqSAyMDEwIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KQEAgLTI3LDMxICsyNywxOSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oPgogCi0jZGVmaW5lIElERUFQQURfREVWX0NBTUVSQQkwCi0jZGVmaW5lIElERUFQQURfREVWX1dMQU4JMQotI2RlZmluZSBJREVBUEFEX0RFVl9CTFVFVE9PVEgJMgotI2RlZmluZSBJREVBUEFEX0RFVl8zRwkJMwotI2RlZmluZSBJREVBUEFEX0RFVl9LSUxMU1cJNAorI2RlZmluZSBJREVBUEFEX1JGS0lMTF9ERVZfTlVNCSgzKQogCiBzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlIHsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0Jc3RydWN0IHJma2lsbCAqcmZrWzVdOwotfSAqaWRlYXBhZF9wcml2OwotCi1zdGF0aWMgc3RydWN0IHsKLQljaGFyICpuYW1lOwotCWludCBjZmdiaXQ7Ci0JaW50IG9wY29kZTsKLQlpbnQgdHlwZTsKLX0gaWRlYXBhZF9yZmtfZGF0YVtdID0gewotCXsgImlkZWFwYWRfY2FtZXJhIiwJMTksIDB4MUUsIE5VTV9SRktJTExfVFlQRVMgfSwKLQl7ICJpZGVhcGFkX3dsYW4iLAkxOCwgMHgxNSwgUkZLSUxMX1RZUEVfV0xBTiB9LAotCXsgImlkZWFwYWRfYmx1ZXRvb3RoIiwJMTYsIDB4MTcsIFJGS0lMTF9UWVBFX0JMVUVUT09USCB9LAotCXsgImlkZWFwYWRfM2ciLAkJMTcsIDB4MjAsIFJGS0lMTF9UWVBFX1dXQU4gfSwKLQl7ICJpZGVhcGFkX2tpbGxzdyIsCTAsICAwLCAgICBSRktJTExfVFlQRV9XTEFOIH0KKwlzdHJ1Y3QgcmZraWxsICpyZmtbSURFQVBBRF9SRktJTExfREVWX05VTV07CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2OwogfTsKIAorc3RhdGljIGFjcGlfaGFuZGxlIGlkZWFwYWRfaGFuZGxlOwogc3RhdGljIGJvb2wgbm9fYnRfcmZraWxsOwogbW9kdWxlX3BhcmFtKG5vX2J0X3Jma2lsbCwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vX2J0X3Jma2lsbCwgIk5vIHJma2lsbCBmb3IgYmx1ZXRvb3RoLiIpOwpAQCAtMTYzLDE3ICsxNTEsMTcgQEAKIAlwcl9lcnIoInRpbWVvdXQgaW4gd3JpdGVfZWNfY21kXG4iKTsKIAlyZXR1cm4gLTE7CiB9Ci0vKiB0aGUgYWJvdmUgaXMgQUNQSSBoZWxwZXJzICovCiAKKy8qCisgKiBjYW1lcmEgcG93ZXIKKyAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pZGVhcGFkX2NhbShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBwcml2LT5oYW5kbGU7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKLQlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgMHgxRCwgJnJlc3VsdCkpCisJaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX2hhbmRsZSwgMHgxRCwgJnJlc3VsdCkpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIi0xXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHJlc3VsdCk7CiB9CkBAIC0xODIsMTUgKzE3MCwxMyBAQAogCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IHByaXYtPmhhbmRsZTsKIAlpbnQgcmV0LCBzdGF0ZTsKIAogCWlmICghY291bnQpCiAJCXJldHVybiAwOwogCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmc3RhdGUpICE9IDEpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldCA9IHdyaXRlX2VjX2NtZChoYW5kbGUsIDB4MUUsIHN0YXRlKTsKKwlyZXQgPSB3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsIDB4MUUsIHN0YXRlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlyZXR1cm4gY291bnQ7CkBAIC0xOTgsMTYgKzE4NCwyNyBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoY2FtZXJhX3Bvd2VyLCAwNjQ0LCBzaG93X2lkZWFwYWRfY2FtLCBzdG9yZV9pZGVhcGFkX2NhbSk7CiAKKy8qCisgKiBSZmtpbGwKKyAqLworc3RydWN0IGlkZWFwYWRfcmZrX2RhdGEgeworCWNoYXIgKm5hbWU7CisJaW50IGNmZ2JpdDsKKwlpbnQgb3Bjb2RlOworCWludCB0eXBlOworfTsKKworY29uc3Qgc3RydWN0IGlkZWFwYWRfcmZrX2RhdGEgaWRlYXBhZF9yZmtfZGF0YVtdID0geworCXsgImlkZWFwYWRfd2xhbiIsCTE4LCAweDE1LCBSRktJTExfVFlQRV9XTEFOIH0sCisJeyAiaWRlYXBhZF9ibHVldG9vdGgiLAkxNiwgMHgxNywgUkZLSUxMX1RZUEVfQkxVRVRPT1RIIH0sCisJeyAiaWRlYXBhZF8zZyIsCQkxNywgMHgyMCwgUkZLSUxMX1RZUEVfV1dBTiB9LAorfTsKKwogc3RhdGljIGludCBpZGVhcGFkX3Jma19zZXQodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQogewotCWludCBkZXZpY2UgPSAodW5zaWduZWQgbG9uZylkYXRhOworCXVuc2lnbmVkIGxvbmcgb3Bjb2RlID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKIAotCWlmIChkZXZpY2UgPT0gSURFQVBBRF9ERVZfS0lMTFNXKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB3cml0ZV9lY19jbWQoaWRlYXBhZF9wcml2LT5oYW5kbGUsCi0JCQkgICAgaWRlYXBhZF9yZmtfZGF0YVtkZXZpY2VdLm9wY29kZSwKLQkJCSAgICAhYmxvY2tlZCk7CisJcmV0dXJuIHdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwgb3Bjb2RlLCAhYmxvY2tlZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmZraWxsX29wcyBpZGVhcGFkX3Jma19vcHMgPSB7CkBAIC0yMTcsMjAgKzIxNCwyMCBAQAogc3RhdGljIHZvaWQgaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UpCiB7CiAJc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2KTsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBwcml2LT5oYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBod19ibG9ja2VkOwogCWludCBpOwogCi0JaWYgKHJlYWRfZWNfZGF0YShoYW5kbGUsIDB4MjMsICZod19ibG9ja2VkKSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDIzLCAmaHdfYmxvY2tlZCkpCiAJCXJldHVybjsKIAlod19ibG9ja2VkID0gIWh3X2Jsb2NrZWQ7CiAKLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9XTEFOOyBpIDw9IElERUFQQURfREVWX0tJTExTVzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBJREVBUEFEX1JGS0lMTF9ERVZfTlVNOyBpKyspCiAJCWlmIChwcml2LT5yZmtbaV0pCiAJCQlyZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPnJma1tpXSwgaHdfYmxvY2tlZCk7CiB9CiAKLXN0YXRpYyBpbnQgaWRlYXBhZF9yZWdpc3Rlcl9yZmtpbGwoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLCBpbnQgZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9yZWdpc3Rlcl9yZmtpbGwoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLAorCQkJCQkgICAgIGludCBkZXYpCiB7CiAJc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2KTsKIAlpbnQgcmV0OwpAQCAtMjM5LDcgKzIzNiw3IEBACiAJaWYgKG5vX2J0X3Jma2lsbCAmJgogCSAgICAoaWRlYXBhZF9yZmtfZGF0YVtkZXZdLnR5cGUgPT0gUkZLSUxMX1RZUEVfQkxVRVRPT1RIKSkgewogCQkvKiBGb3JjZSB0byBlbmFibGUgYmx1ZXRvb3RoIHdoZW4gbm9fYnRfcmZraWxsPTEgKi8KLQkJd3JpdGVfZWNfY21kKGlkZWFwYWRfcHJpdi0+aGFuZGxlLAorCQl3cml0ZV9lY19jbWQoaWRlYXBhZF9oYW5kbGUsCiAJCQkgICAgIGlkZWFwYWRfcmZrX2RhdGFbZGV2XS5vcGNvZGUsIDEpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNTAsNyArMjQ3LDcgQEAKIAlpZiAoIXByaXYtPnJma1tkZXZdKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9wcml2LT5oYW5kbGUsIGlkZWFwYWRfcmZrX2RhdGFbZGV2XS5vcGNvZGUtMSwKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCBpZGVhcGFkX3Jma19kYXRhW2Rldl0ub3Bjb2RlLTEsCiAJCQkgJnN3X2Jsb2NrZWQpKSB7CiAJCXJma2lsbF9pbml0X3N3X3N0YXRlKHByaXYtPnJma1tkZXZdLCAwKTsKIAl9IGVsc2UgewpAQCAtMjY2LDcgKzI2Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLCBpbnQgZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IGlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLAorCQkJCQkJaW50IGRldikKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwogCkBAIC0yNzcsNzMgKzI3NSwxNzcgQEAKIAlyZmtpbGxfZGVzdHJveShwcml2LT5yZmtbZGV2XSk7CiB9CiAKKy8qCisgKiBQbGF0Zm9ybSBkZXZpY2UKKyAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlkZWFwYWRfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9jYW1lcmFfcG93ZXIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpZGVhcGFkX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBpZGVhcGFkX2F0dHJpYnV0ZXMKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlkZWFwYWRfcGxhdGZvcm1faW5pdChzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCWludCByZXN1bHQ7CisKKwlwcml2LT5wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImlkZWFwYWQiLCAtMSk7CisJaWYgKCFwcml2LT5wbGF0Zm9ybV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHByaXYtPnBsYXRmb3JtX2RldmljZSwgcHJpdik7CisKKwlyZXN1bHQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHByaXYtPnBsYXRmb3JtX2RldmljZSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RldmljZTsKKworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcHJpdi0+cGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKKwkJCQkgICAgJmlkZWFwYWRfYXR0cmlidXRlX2dyb3VwKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfc3lzZnM7CisJcmV0dXJuIDA7CisKK2ZhaWxfc3lzZnM6CisJcGxhdGZvcm1fZGV2aWNlX2RlbChwcml2LT5wbGF0Zm9ybV9kZXZpY2UpOworZmFpbF9wbGF0Zm9ybV9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwcml2LT5wbGF0Zm9ybV9kZXZpY2UpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGlkZWFwYWRfcGxhdGZvcm1fZXhpdChzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcHJpdi0+cGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKKwkJCSAgICZpZGVhcGFkX2F0dHJpYnV0ZV9ncm91cCk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cGxhdGZvcm1fZGV2aWNlKTsKK30KKworLyoKKyAqIGlucHV0IGRldmljZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGtleV9lbnRyeSBpZGVhcGFkX2tleW1hcFtdID0geworCXsgS0VfS0VZLCAweDA2LCB7IEtFWV9TV0lUQ0hWSURFT01PREUgfSB9LAorCXsgS0VfS0VZLCAweDBELCB7IEtFWV9XTEFOIH0gfSwKKwl7IEtFX0VORCwgMCB9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9pbnB1dF9pbml0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7CisJaW50IGVycm9yOworCisJaW5wdXRkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0ZGV2KSB7CisJCXByX2luZm8oIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbnB1dGRldi0+bmFtZSA9ICJJZGVhcGFkIGV4dHJhIGJ1dHRvbnMiOworCWlucHV0ZGV2LT5waHlzID0gImlkZWFwYWQvaW5wdXQwIjsKKwlpbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0ZGV2LT5kZXYucGFyZW50ID0gJnByaXYtPnBsYXRmb3JtX2RldmljZS0+ZGV2OworCisJZXJyb3IgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGlucHV0ZGV2LCBpZGVhcGFkX2tleW1hcCwgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHNldHVwIGlucHV0IGRldmljZSBrZXltYXBcbiIpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dGRldik7CisJaWYgKGVycm9yKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX2ZyZWVfa2V5bWFwOworCX0KKworCXByaXYtPmlucHV0ZGV2ID0gaW5wdXRkZXY7CisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2tleW1hcDoKKwlzcGFyc2Vfa2V5bWFwX2ZyZWUoaW5wdXRkZXYpOworZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0ZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpZGVhcGFkX2lucHV0X2V4aXQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzcGFyc2Vfa2V5bWFwX2ZyZWUocHJpdi0+aW5wdXRkZXYpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHByaXYtPmlucHV0ZGV2KTsKKwlwcml2LT5pbnB1dGRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGlkZWFwYWRfaW5wdXRfcmVwb3J0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYsCisJCQkJIHVuc2lnbmVkIGxvbmcgc2NhbmNvZGUpCit7CisJc3BhcnNlX2tleW1hcF9yZXBvcnRfZXZlbnQocHJpdi0+aW5wdXRkZXYsIHNjYW5jb2RlLCAxLCB0cnVlKTsKK30KKworLyoKKyAqIG1vZHVsZSBpbml0L2V4aXQKKyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBpZGVhcGFkX2RldmljZV9pZHNbXSA9IHsKIAl7ICJWUEMyMDA0IiwgMH0sCiAJeyAiIiwgMH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBpZGVhcGFkX2RldmljZV9pZHMpOwogCi1zdGF0aWMgaW50IGlkZWFwYWRfYWNwaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlKQorc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UpCiB7Ci0JaW50IGksIGNmZzsKLQlpbnQgZGV2c19wcmVzZW50WzVdOworCWludCByZXQsIGksIGNmZzsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2OwogCiAJaWYgKHJlYWRfbWV0aG9kX2ludChhZGV2aWNlLT5oYW5kbGUsICJfQ0ZHIiwgJmNmZykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZm9yIChpID0gSURFQVBBRF9ERVZfQ0FNRVJBOyBpIDwgSURFQVBBRF9ERVZfS0lMTFNXOyBpKyspIHsKLQkJaWYgKHRlc3RfYml0KGlkZWFwYWRfcmZrX2RhdGFbaV0uY2ZnYml0LCAodW5zaWduZWQgbG9uZyAqKSZjZmcpKQotCQkJZGV2c19wcmVzZW50W2ldID0gMTsKLQkJZWxzZQotCQkJZGV2c19wcmVzZW50W2ldID0gMDsKLQl9Ci0KLQkvKiBUaGUgaGFyZHdhcmUgc3dpdGNoIGlzIGFsd2F5cyBwcmVzZW50ICovCi0JZGV2c19wcmVzZW50W0lERUFQQURfREVWX0tJTExTV10gPSAxOwotCiAJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChkZXZzX3ByZXNlbnRbSURFQVBBRF9ERVZfQ0FNRVJBXSkgewotCQlpbnQgcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZhZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9jYW1lcmFfcG93ZXIpOwotCQlpZiAocmV0KSB7Ci0JCQlrZnJlZShwcml2KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwcml2LT5oYW5kbGUgPSBhZGV2aWNlLT5oYW5kbGU7CiAJZGV2X3NldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYsIHByaXYpOwotCWlkZWFwYWRfcHJpdiA9IHByaXY7Ci0JZm9yIChpID0gSURFQVBBRF9ERVZfV0xBTjsgaSA8PSBJREVBUEFEX0RFVl9LSUxMU1c7IGkrKykgewotCQlpZiAoIWRldnNfcHJlc2VudFtpXSkKLQkJCWNvbnRpbnVlOworCWlkZWFwYWRfaGFuZGxlID0gYWRldmljZS0+aGFuZGxlOwogCi0JCWlkZWFwYWRfcmVnaXN0ZXJfcmZraWxsKGFkZXZpY2UsIGkpOworCXJldCA9IGlkZWFwYWRfcGxhdGZvcm1faW5pdChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIHBsYXRmb3JtX2ZhaWxlZDsKKworCXJldCA9IGlkZWFwYWRfaW5wdXRfaW5pdChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGlucHV0X2ZhaWxlZDsKKworCWZvciAoaSA9IDA7IGkgPCBJREVBUEFEX1JGS0lMTF9ERVZfTlVNOyBpKyspIHsKKwkJaWYgKHRlc3RfYml0KGlkZWFwYWRfcmZrX2RhdGFbaV0uY2ZnYml0LCAodW5zaWduZWQgbG9uZyAqKSZjZmcpKQorCQkJaWRlYXBhZF9yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7CisJCWVsc2UKKwkJCXByaXYtPnJma1tpXSA9IE5VTEw7CiAJfQogCWlkZWFwYWRfc3luY19yZmtfc3RhdGUoYWRldmljZSk7CisKIAlyZXR1cm4gMDsKKworaW5wdXRfZmFpbGVkOgorCWlkZWFwYWRfcGxhdGZvcm1fZXhpdChwcml2KTsKK3BsYXRmb3JtX2ZhaWxlZDoKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlkZWFwYWRfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgX19kZXZleGl0IGlkZWFwYWRfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2aWNlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwogCWludCBpOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZhZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9jYW1lcmFfcG93ZXIpOwotCi0JZm9yIChpID0gSURFQVBBRF9ERVZfV0xBTjsgaSA8PSBJREVBUEFEX0RFVl9LSUxMU1c7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgSURFQVBBRF9SRktJTExfREVWX05VTTsgaSsrKQogCQlpZGVhcGFkX3VucmVnaXN0ZXJfcmZraWxsKGFkZXZpY2UsIGkpOwotCisJaWRlYXBhZF9pbnB1dF9leGl0KHByaXYpOworCWlkZWFwYWRfcGxhdGZvcm1fZXhpdChwcml2KTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldiwgTlVMTCk7CiAJa2ZyZWUocHJpdik7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWRlYXBhZF9hY3BpX25vdGlmeShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIHUzMiBldmVudCkKIHsKKwlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwogCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFkZXZpY2UtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHZwYzEsIHZwYzIsIHZwY19iaXQ7CiAKQEAgLTM1Nyw2ICs0NTksOCBAQAogCQlpZiAodGVzdF9iaXQodnBjX2JpdCwgJnZwYzEpKSB7CiAJCQlpZiAodnBjX2JpdCA9PSA5KQogCQkJCWlkZWFwYWRfc3luY19yZmtfc3RhdGUoYWRldmljZSk7CisJCQllbHNlCisJCQkJaWRlYXBhZF9pbnB1dF9yZXBvcnQocHJpdiwgdnBjX2JpdCk7CiAJCX0KIAl9CiB9CkBAIC0zNzEsMTkgKzQ3NSwxNCBAQAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAotCiBzdGF0aWMgaW50IF9faW5pdCBpZGVhcGFkX2FjcGlfbW9kdWxlX2luaXQodm9pZCkKIHsKLQlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmlkZWFwYWRfYWNwaV9kcml2ZXIpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaWRlYXBhZF9hY3BpX2RyaXZlcik7CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0IGlkZWFwYWRfYWNwaV9tb2R1bGVfZXhpdCh2b2lkKQogewogCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZpZGVhcGFkX2FjcGlfZHJpdmVyKTsKLQogfQogCiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9pcHMuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jCmluZGV4IGYwYjNhZDEuLjEyOTRhMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jCkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogfQogCiB2b2lkCi1pcHNfbGlua190b19pOTE1X2RyaXZlcigpCitpcHNfbGlua190b19pOTE1X2RyaXZlcih2b2lkKQogewogCS8qIFdlIGNhbid0IGNsZWFubHkgZ2V0IGF0IHRoZSB2YXJpb3VzIGlwc19kcml2ZXIgc3RydWN0cyBmcm9tCiAJICogdGhpcyBjYWxsZXIgKHRoZSBpOTE1IGRyaXZlciksIHNvIGp1c3Qgc2V0IGEgZmxhZyBzYXlpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKaW5kZXggZTYxZGI5ZC4uOTMwZTYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMKQEAgLTI0NCw3ICsyNDQsMTEgQEAKIAkJCWdlbmVyaWNfaGFuZGxlX2lycShwZy0+aXJxX2Jhc2UgKyBncGlvKTsKIAkJfQogCX0KLQlkZXNjLT5jaGlwLT5lb2koaXJxKTsKKworCWlmIChkZXNjLT5jaGlwLT5pcnFfZW9pKQorCQlkZXNjLT5jaGlwLT5pcnFfZW9pKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7CisJZWxzZQorCQlkZXZfd2FybihwZy0+Y2hpcC5kZXYsICJtaXNzaW5nIEVPSSBoYW5kbGVyIGZvciBpcnEgJWRcbiIsIGlycSk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBsYXRmb3JtX3BtaWNfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCmluZGV4IGNhMzViMGMuLjE3NTJlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQkJImludGVsX3NjdV9pcGM6IEkyQyBJTlZBTElEX0NNRCA9IDB4JXhcbiIsIGNtZCk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZpcGNsb2NrKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTzsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpcGNsb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTY0Miw3ICs2NDIsNyBAQAogCiAJaWYgKHN0YXR1cyA9PSBJUENfRldfVVBEQVRFX1NVQ0NFU1MpCiAJCXJldHVybiAwOwotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVJTzsKIH0KIEVYUE9SVF9TWU1CT0woaW50ZWxfc2N1X2lwY19md191cGRhdGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwY3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMyMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwY3V0aWwuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIGludGVsX3NjdV9pcGMuYzogRHJpdmVyIGZvciB0aGUgSW50ZWwgU0NVIElQQyBtZWNoYW5pc20KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDgtMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBTcmVlZGhhcmEgRFMgKHNyZWVkaGFyYS5kc0BpbnRlbC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGlvY3RsIGludGVyZmFjZXMgdG8gY2FsbCBpbnRlbCBzY3UgaXBjIGRyaXZlciBhcGkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CisKK3N0YXRpYyB1MzIgbWFqb3I7CisKKyNkZWZpbmUgTUFYX0ZXX1NJWkUgMjY0MTkyCisKKy8qIGlvY3RsIGNvbW1uZHMgKi8KKyNkZWZpbmUJSU5URV9TQ1VfSVBDX1JFR0lTVEVSX1JFQUQJMAorI2RlZmluZSBJTlRFX1NDVV9JUENfUkVHSVNURVJfV1JJVEUJMQorI2RlZmluZSBJTlRFX1NDVV9JUENfUkVHSVNURVJfVVBEQVRFCTIKKyNkZWZpbmUgSU5URV9TQ1VfSVBDX0ZXX1VQREFURQkJMHhBMgorCitzdHJ1Y3Qgc2N1X2lwY19kYXRhIHsKKwl1MzIgICAgIGNvdW50OyAgLyogTm8uIG9mIHJlZ2lzdGVycyAqLworCXUxNiAgICAgYWRkcls1XTsgLyogUmVnaXN0ZXIgYWRkcmVzc2VzICovCisJdTggICAgICBkYXRhWzVdOyAvKiBSZWdpc3RlciBkYXRhICovCisJdTggICAgICBtYXNrOyAvKiBWYWxpZCBmb3IgcmVhZC1tb2RpZnktd3JpdGUgKi8KK307CisKKy8qKgorICoJc2N1X3JlZ19hY2Nlc3MJCS0JaW1wbGVtZW50IHJlZ2lzdGVyIGFjY2VzcyBpb2N0bHMKKyAqCUBjbWQ6IGNvbW1hbmQgd2UgYXJlIGRvaW5nIChyZWFkL3dyaXRlL3VwZGF0ZSkKKyAqCUBkYXRhOiBrZXJuZWwgY29weSBvZiBpb2N0bCBkYXRhCisgKgorICoJQWxsb3cgdGhlIHVzZXIgdG8gcGVyZm9ybSByZWdpc3RlciBhY2Nlc3NlcyBvbiB0aGUgU0NVIHZpYSB0aGUKKyAqCWtlcm5lbCBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgaW50IHNjdV9yZWdfYWNjZXNzKHUzMiBjbWQsIHN0cnVjdCBzY3VfaXBjX2RhdGEgICpkYXRhKQoreworCWludCBjb3VudCA9IGRhdGEtPmNvdW50OworCisJaWYgKGNvdW50ID09IDAgfHwgY291bnQgPT0gMyB8fCBjb3VudCA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9SRUFEOgorCQlyZXR1cm4gaW50ZWxfc2N1X2lwY19yZWFkdihkYXRhLT5hZGRyLCBkYXRhLT5kYXRhLCBjb3VudCk7CisJY2FzZSBJTlRFX1NDVV9JUENfUkVHSVNURVJfV1JJVEU6CisJCXJldHVybiBpbnRlbF9zY3VfaXBjX3dyaXRldihkYXRhLT5hZGRyLCBkYXRhLT5kYXRhLCBjb3VudCk7CisJY2FzZSBJTlRFX1NDVV9JUENfUkVHSVNURVJfVVBEQVRFOgorCQlyZXR1cm4gaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIoZGF0YS0+YWRkclswXSwKKwkJCQkJCSAgICBkYXRhLT5kYXRhWzBdLCBkYXRhLT5tYXNrKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKKy8qKgorICoJc2N1X2lwY19pb2N0bAkJLQljb250cm9sIGlvY3RscyBmb3IgdGhlIFNDVQorICoJQGZwOiBmaWxlIGhhbmRsZSBvZiB0aGUgU0NVIGRldmljZQorICoJQGNtZDogaW9jdGwgY29jZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhc3NlZCBzdHJ1Y3R1cmUKKyAqCisgKglTdXBwb3J0IHRoZSBJL08gYW5kIGZpcm13YXJlIGZsYXNoaW5nIGludGVyZmFjZXMgb2YgdGhlIFNDVQorICovCitzdGF0aWMgbG9uZyBzY3VfaXBjX2lvY3RsKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzY3VfaXBjX2RhdGEgIGRhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY21kID09IElOVEVfU0NVX0lQQ19GV19VUERBVEUpIHsKKwkJCXU4ICpmd2J1ZiA9IGttYWxsb2MoTUFYX0ZXX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKGZ3YnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZndidWYsICh1OCAqKWFyZywgTUFYX0ZXX1NJWkUpKSB7CisJCQkJa2ZyZWUoZndidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJcmV0ID0gaW50ZWxfc2N1X2lwY19md191cGRhdGUoZndidWYsIE1BWF9GV19TSVpFKTsKKwkJCWtmcmVlKGZ3YnVmKTsKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCBhcmdwLCBzaXplb2Yoc3RydWN0IHNjdV9pcGNfZGF0YSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCA9IHNjdV9yZWdfYWNjZXNzKGNtZCwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRhdGEsIHNpemVvZihzdHJ1Y3Qgc2N1X2lwY19kYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY3VfaXBjX2ZvcHMgPSB7CisJLnVubG9ja2VkX2lvY3RsID0gc2N1X2lwY19pb2N0bCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwY19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9jaHJkZXYoMCwgImludGVsX21pZF9zY3UiLCAmc2N1X2lwY19mb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlwY19tb2R1bGVfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yLCAiaW50ZWxfbWlkX3NjdSIpOworfQorCittb2R1bGVfaW5pdChpcGNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaXBjX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCBWMiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVdGlsaXR5IGRyaXZlciBmb3IgaW50ZWwgc2N1IGlwYyIpOworTU9EVUxFX0FVVEhPUigiU3JlZWRoYXJhIDxzcmVlZGhhcmEuZHNAaW50ZWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKaW5kZXggZjIwMDY3Ny4uNWU4MzM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCkBAIC0yMzUsNiArMjM1LDcgQEAKIAk1NywJLyogNzAgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRCAqLwogCS0xLAkvKiA3MSBTT05ZUElfRVZFTlRfQlJJR0hUTkVTU19QUkVTU0VEICovCiAJNTgsCS8qIDcyIFNPTllQSV9FVkVOVF9NRURJQV9QUkVTU0VEICovCisJNTksCS8qIDcyIFNPTllQSV9FVkVOVF9WRU5ET1JfUFJFU1NFRCAqLwogfTsKIAogc3RhdGljIGludCBzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcFtdID0gewpAQCAtMjk3LDYgKzI5OCw3IEBACiAJS0VZX1ZPTFVNRVVQLAkvKiA1NiBTT05ZUElfRVZFTlRfVk9MVU1FX0lOQ19QUkVTU0VEICovCiAJS0VZX1ZPTFVNRURPV04sCS8qIDU3IFNPTllQSV9FVkVOVF9WT0xVTUVfREVDX1BSRVNTRUQgKi8KIAlLRVlfTUVESUEsCS8qIDU4IFNPTllQSV9FVkVOVF9NRURJQV9QUkVTU0VEICovCisJS0VZX1ZFTkRPUiwJLyogNTkgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VEICovCiB9OwogCiAvKiByZWxlYXNlIGJ1dHRvbnMgYWZ0ZXIgYSBzaG9ydCBkZWxheSBpZiBwcmVzc2VkICovCkBAIC04NTYsNyArODU4LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpzb255X2JhY2tsaWdodF9kZXZpY2U7Ci1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgc29ueV9iYWNrbGlnaHRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHNvbnlfYmFja2xpZ2h0X29wcyA9IHsKIAkudXBkYXRlX3N0YXR1cyA9IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMsCiAJLmdldF9icmlnaHRuZXNzID0gc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCiB9OwpAQCAtODk0LDEwICs4OTYsMTggQEAKIAl7IDB4MEEsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAogCXsgMHg4QywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAogCXsgMHgwQywgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCisJeyAweDlkLCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEIH0sCisJeyAweDFkLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCiAJeyAweDlmLCBTT05ZUElfRVZFTlRfQ0RfRUpFQ1RfUFJFU1NFRCB9LAogCXsgMHgxZiwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAogCXsgMHhhMSwgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQgfSwKIAl7IDB4MjEsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKKwl7IDB4YTQsIFNPTllQSV9FVkVOVF9DRF9FSkVDVF9QUkVTU0VEIH0sCisJeyAweDI0LCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAweGE1LCBTT05ZUElfRVZFTlRfVkVORE9SX1BSRVNTRUQgfSwKKwl7IDB4MjUsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKKwl7IDB4YTYsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKKwl7IDB4MjYsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKIAl7IDAsIDAgfSwKIH07CiAKQEAgLTExMzEsNyArMTE0MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgc29ueV9uY19yZmtpbGxfdXBkYXRlKCkKK3N0YXRpYyB2b2lkIHNvbnlfbmNfcmZraWxsX3VwZGF0ZSh2b2lkKQogewogCWVudW0gc29ueV9uY19yZmtpbGwgaTsKIAlpbnQgcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCmluZGV4IGU4YzIxOTkuLmRkNTk5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKQEAgLTU4OSw2ICs1ODksNyBAQAogCQlkZWZhdWx0OgogCQkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgogCQkJICAgICAgICJ3aXRoIGludmFsaWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnXG4iLCBjKTsKKwkJCXZhX2VuZChhcCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTYxMDksNyArNjExMCw3IEBACiAJCQkgICAgICAgQkFDS0xJR0hUX1VQREFURV9IT1RLRVkpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgaWJtX2JhY2tsaWdodF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGlibV9iYWNrbGlnaHRfZGF0YSA9IHsKIAkuZ2V0X2JyaWdodG5lc3MgPSBicmlnaHRuZXNzX2dldCwKIAkudXBkYXRlX3N0YXR1cyAgPSBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMsCiB9OwpAQCAtNjM0NSw3ICs2MzQ2LDcgQEAKIAkJCSJhcyBjaGFuZ2Ugbm90aWZpY2F0aW9uXG4iKTsKIAl0cGFjcGlfaG90a2V5X2RyaXZlcl9tYXNrX3NldChob3RrZXlfZHJpdmVyX21hc2sKIAkJCQl8IFRQX0FDUElfSEtFWV9CUkdIVFVQX01BU0sKLQkJCQl8IFRQX0FDUElfSEtFWV9CUkdIVERXTl9NQVNLKTs7CisJCQkJfCBUUF9BQ1BJX0hLRVlfQlJHSFREV05fTUFTSyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxOTMsNyArNzE5NCw3IEBACiAgKiAJCVRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TIChYMzEvWDQwL1g0MSkKICAqCiAgKglGSVJNV0FSRSBCVUc6IG9uIHNvbWUgbW9kZWxzLCBFQyAweDJmIG1pZ2h0IG5vdCBiZSBpbml0aWFsaXplZCBhdAotICoJYm9vdC4gQXBwYXJlbnRseSB0aGUgRUMgZG9lcyBub3QgaW50aWFsaXplIGl0LCBzbyB1bmxlc3MgQUNQSSBEU0RUCisgKglib290LiBBcHBhcmVudGx5IHRoZSBFQyBkb2VzIG5vdCBpbml0aWFsaXplIGl0LCBzbyB1bmxlc3MgQUNQSSBEU0RUCiAgKglkb2VzIHNvLCBpdHMgaW5pdGlhbCB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAoMHgwNykuCiAgKgogICoJRm9yIGZpcm13YXJlIGJ1Z3MsIHJlZmVyIHRvOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwppbmRleCA0Mjc2ZGE3Li4yMDljY2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwpAQCAtODQxLDcgKzg0MSw3IEBACiAJcmVtb3ZlX3Byb2NfZW50cnkoInZlcnNpb24iLCB0b3NoaWJhX3Byb2NfZGlyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHRvc2hpYmFfYmFja2xpZ2h0X2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgdG9zaGliYV9iYWNrbGlnaHRfZGF0YSA9IHsKICAgICAgICAgLmdldF9icmlnaHRuZXNzID0gZ2V0X2xjZCwKICAgICAgICAgLnVwZGF0ZV9zdGF0dXMgID0gc2V0X2xjZF9zdGF0dXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwppbmRleCBhZWNkOWE5Li4wNWNjNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwpAQCAtNTQ5LDIxICs1NDksMzQgQEAKIHdtaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3bWlfYmxvY2sgKmJsb2NrOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkIHx8ICFoYW5kbGVyKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKGJsb2NrLT5oYW5kbGVyICYmIGJsb2NrLT5oYW5kbGVyICE9IHdtaV9ub3RpZnlfZGVidWcpCi0JCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOworCWxpc3RfZm9yX2VhY2gocCwgJndtaV9ibG9ja19saXN0KSB7CisJCWFjcGlfc3RhdHVzIHdtaV9zdGF0dXM7CisJCWJsb2NrID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgd21pX2Jsb2NrLCBsaXN0KTsKIAotCWJsb2NrLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlibG9jay0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoYmxvY2stPmhhbmRsZXIgJiYKKwkJCSAgICBibG9jay0+aGFuZGxlciAhPSB3bWlfbm90aWZ5X2RlYnVnKQorCQkJCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOwogCi0Jc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDEpOworCQkJYmxvY2stPmhhbmRsZXIgPSBoYW5kbGVyOworCQkJYmxvY2stPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisKKwkJCXdtaV9zdGF0dXMgPSB3bWlfbWV0aG9kX2VuYWJsZShibG9jaywgMSk7CisJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkgICAgKCh3bWlfc3RhdHVzID09IEFFX09LKSAmJiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkpKQorCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCX0KKwl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTc3LDI0ICs1OTAsNDAgQEAKIGFjcGlfc3RhdHVzIHdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoY29uc3QgY2hhciAqZ3VpZCkKIHsKIAlzdHJ1Y3Qgd21pX2Jsb2NrICpibG9jazsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKCFibG9jay0+aGFuZGxlciB8fCBibG9jay0+aGFuZGxlciA9PSB3bWlfbm90aWZ5X2RlYnVnKQotCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ3bWlfYmxvY2tfbGlzdCkgeworCQlhY3BpX3N0YXR1cyB3bWlfc3RhdHVzOworCQlibG9jayA9IGxpc3RfZW50cnkocCwgc3RydWN0IHdtaV9ibG9jaywgbGlzdCk7CiAKLQlpZiAoZGVidWdfZXZlbnQpIHsKLQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IHdtaV9tZXRob2RfZW5hYmxlKGJsb2NrLCAwKTsKLQkJYmxvY2stPmhhbmRsZXIgPSBOVUxMOwotCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoIWJsb2NrLT5oYW5kbGVyIHx8CisJCQkgICAgYmxvY2stPmhhbmRsZXIgPT0gd21pX25vdGlmeV9kZWJ1ZykKKwkJCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKworCQkJaWYgKGRlYnVnX2V2ZW50KSB7CisJCQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJfSBlbHNlIHsKKwkJCQl3bWlfc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDApOworCQkJCWJsb2NrLT5oYW5kbGVyID0gTlVMTDsKKwkJCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkJICAgICgod21pX3N0YXR1cyA9PSBBRV9PSykgJiYKKwkJCQkgICAgIChzdGF0dXMgPT0gQUVfTk9UX0VYSVNUKSkpCisJCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCQl9CisJCX0KIAl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwod21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcik7CkBAIC03MDUsMjIgKzczNCwxMSBAQAogCS5kZXZfYXR0cnMgPSB3bWlfZGV2X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCB3bWlfYmxvY2sgKndtaV9jcmVhdGVfZGV2aWNlKGNvbnN0IHN0cnVjdCBndWlkX2Jsb2NrICpnYmxvY2ssCi0JCQkJCSAgIGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgd21pX2NyZWF0ZV9kZXZpY2UoY29uc3Qgc3RydWN0IGd1aWRfYmxvY2sgKmdibG9jaywKKwkJCSAgICAgc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrLCBhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrOwotCWludCBlcnJvcjsKIAljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAotCXdibG9jayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bWlfYmxvY2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdibG9jaykgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKLQl3YmxvY2stPmdibG9jayA9ICpnYmxvY2s7Ci0KIAl3YmxvY2stPmRldi5jbGFzcyA9ICZ3bWlfY2xhc3M7CiAKIAl3bWlfZ3RvYShnYmxvY2stPmd1aWQsIGd1aWRfc3RyaW5nKTsKQEAgLTcyOCwxNyArNzQ2LDcgQEAKIAogCWRldl9zZXRfZHJ2ZGF0YSgmd2Jsb2NrLT5kZXYsIHdibG9jayk7CiAKLQllcnJvciA9IGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZTsKLQotCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKLQlyZXR1cm4gd2Jsb2NrOwotCi1lcnJfZnJlZToKLQlrZnJlZSh3YmxvY2spOwotZXJyX291dDoKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcmV0dXJuIGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCB3bWlfZnJlZV9kZXZpY2VzKHZvaWQpCkBAIC03NDcsNyArNzU1LDggQEAKIAogCS8qIERlbGV0ZSBkZXZpY2VzIGZvciBhbGwgdGhlIEdVSURzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdibG9jaywgbmV4dCwgJndtaV9ibG9ja19saXN0LCBsaXN0KQotCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOworCQlpZiAod2Jsb2NrLT5kZXYuY2xhc3MpCisJCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgYm9vbCBndWlkX2FscmVhZHlfcGFyc2VkKGNvbnN0IGNoYXIgKmd1aWRfc3RyaW5nKQpAQCAtNzcwLDcgKzc3OSw2IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAljb25zdCBzdHJ1Y3QgZ3VpZF9ibG9jayAqZ2Jsb2NrOwogCXN0cnVjdCB3bWlfYmxvY2sgKndibG9jazsKLQljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IHJldHZhbDsKIAl1MzIgaSwgdG90YWw7CkBAIC03OTIsMjkgKzgwMCwzMiBAQAogCXRvdGFsID0gb2JqLT5idWZmZXIubGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBndWlkX2Jsb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0JCS8qCi0JCSAgU29tZSBXTUkgZGV2aWNlcywgbGlrZSB0aG9zZSBmb3IgblZpZGlhIGhvb2tzLCBoYXZlIGEKLQkJICBkdXBsaWNhdGUgR1VJRC4gSXQncyBub3QgY2xlYXIgd2hhdCB3ZSBzaG91bGQgZG8gaW4gdGhpcwotCQkgIGNhc2UgeWV0LCBzbyBmb3Igbm93LCB3ZSdsbCBqdXN0IGlnbm9yZSB0aGUgZHVwbGljYXRlLgotCQkgIEFueW9uZSB3aG8gd2FudHMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoYXQgZGV2aWNlIGNhbiBjb21lCi0JCSAgdXAgd2l0aCBhIGJldHRlciB3b3JrYXJvdW5kIGZvciB0aGUgbWVzcyB0aGVuLgotCQkqLwotCQlpZiAoZ3VpZF9hbHJlYWR5X3BhcnNlZChnYmxvY2tbaV0uZ3VpZCkgPT0gdHJ1ZSkgewotCQkJd21pX2d0b2EoZ2Jsb2NrW2ldLmd1aWQsIGd1aWRfc3RyaW5nKTsKLQkJCXByX2luZm8oIlNraXBwaW5nIGR1cGxpY2F0ZSBHVUlEICVzXG4iLCBndWlkX3N0cmluZyk7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCWlmIChkZWJ1Z19kdW1wX3dkZykKIAkJCXdtaV9kdW1wX3dkZygmZ2Jsb2NrW2ldKTsKIAotCQl3YmxvY2sgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCBoYW5kbGUpOwotCQlpZiAoSVNfRVJSKHdibG9jaykpIHsKLQkJCXJldHZhbCA9IFBUUl9FUlIod2Jsb2NrKTsKLQkJCXdtaV9mcmVlX2RldmljZXMoKTsKLQkJCWJyZWFrOworCQl3YmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd21pX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2Jsb2NrKQorCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKKwkJd2Jsb2NrLT5nYmxvY2sgPSBnYmxvY2tbaV07CisKKwkJLyoKKwkJICBTb21lIFdNSSBkZXZpY2VzLCBsaWtlIHRob3NlIGZvciBuVmlkaWEgaG9va3MsIGhhdmUgYQorCQkgIGR1cGxpY2F0ZSBHVUlELiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCBkbyBpbiB0aGlzCisJCSAgY2FzZSB5ZXQsIHNvIGZvciBub3csIHdlJ2xsIGp1c3QgaWdub3JlIHRoZSBkdXBsaWNhdGUKKwkJICBmb3IgZGV2aWNlIGNyZWF0aW9uLgorCQkqLworCQlpZiAoIWd1aWRfYWxyZWFkeV9wYXJzZWQoZ2Jsb2NrW2ldLmd1aWQpKSB7CisJCQlyZXR2YWwgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCB3YmxvY2ssIGhhbmRsZSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJd21pX2ZyZWVfZGV2aWNlcygpOworCQkJCWdvdG8gb3V0X2ZyZWVfcG9pbnRlcjsKKwkJCX0KIAkJfQogCisJCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKKwogCQlpZiAoZGVidWdfZXZlbnQpIHsKIAkJCXdibG9jay0+aGFuZGxlciA9IHdtaV9ub3RpZnlfZGVidWc7CiAJCQl3bWlfbWV0aG9kX2VuYWJsZSh3YmxvY2ssIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvTWFrZWZpbGUgYi9kcml2ZXJzL3BucC9NYWtlZmlsZQppbmRleCA4ZGUzNzc1Li5iZmJhODkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BucC9NYWtlZmlsZQpAQCAtMiwxMSArMiwxMyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFBsdWctYW5kLVBsYXkgU3VwcG9ydC4KICMKIAotb2JqLXkJCTo9IGNvcmUubyBjYXJkLm8gZHJpdmVyLm8gcmVzb3VyY2UubyBtYW5hZ2VyLm8gc3VwcG9ydC5vIGludGVyZmFjZS5vIHF1aXJrcy5vCitvYmoteQkJOj0gcG5wLm8KKworcG5wLXkJCTo9IGNvcmUubyBjYXJkLm8gZHJpdmVyLm8gcmVzb3VyY2UubyBtYW5hZ2VyLm8gc3VwcG9ydC5vIGludGVyZmFjZS5vIHF1aXJrcy5vCiAKIG9iai0kKENPTkZJR19QTlBBQ1BJKQkJKz0gcG5wYWNwaS8KIG9iai0kKENPTkZJR19QTlBCSU9TKQkJKz0gcG5wYmlvcy8KIG9iai0kKENPTkZJR19JU0FQTlApCQkrPSBpc2FwbnAvCiAKICMgcG5wX3N5c3RlbV9pbml0IGdvZXMgYWZ0ZXIgcG5wYWNwaS9wbnBiaW9zIGluaXQKLW9iai15CQkJCSs9IHN5c3RlbS5vCitwbnAteQkJCQkrPSBzeXN0ZW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvY29yZS5jIGIvZHJpdmVycy9wbnAvY29yZS5jCmluZGV4IDBmMzRkOTYuLmNiNmNlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9jb3JlLmMKQEAgLTIyMCwxMCArMjIwLDUgQEAKIGludCBwbnBfZGVidWc7CiAKICNpZiBkZWZpbmVkKENPTkZJR19QTlBfREVCVUdfTUVTU0FHRVMpCi1zdGF0aWMgaW50IF9faW5pdCBwbnBfZGVidWdfc2V0dXAoY2hhciAqX191bnVzZWQpCi17Ci0JcG5wX2RlYnVnID0gMTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoInBucC5kZWJ1ZyIsIHBucF9kZWJ1Z19zZXR1cCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHBucF9kZWJ1ZywgaW50LCAwNjQ0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvZHJpdmVyLmMgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwppbmRleCBkMWRiYjlkLi4wMGU5NDAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9kcml2ZXIuYworKysgYi9kcml2ZXJzL3BucC9kcml2ZXIuYwpAQCAtMTg5LDggKzE4OSwxMSBAQAogCWlmICghcG5wX2RydikKIAkJcmV0dXJuIDA7CiAKLQlpZiAocG5wX2Rldi0+cHJvdG9jb2wtPnJlc3VtZSkKLQkJcG5wX2Rldi0+cHJvdG9jb2wtPnJlc3VtZShwbnBfZGV2KTsKKwlpZiAocG5wX2Rldi0+cHJvdG9jb2wtPnJlc3VtZSkgeworCQllcnJvciA9IHBucF9kZXYtPnByb3RvY29sLT5yZXN1bWUocG5wX2Rldik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CiAKIAlpZiAocG5wX2Nhbl93cml0ZShwbnBfZGV2KSkgewogCQllcnJvciA9IHBucF9zdGFydF9kZXYocG5wX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9pc2FwbnAvTWFrZWZpbGUgYi9kcml2ZXJzL3BucC9pc2FwbnAvTWFrZWZpbGUKaW5kZXggY2FjMThiYi4uNmU2MDdhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG5wL2lzYXBucC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgSVNBUE5QIGRyaXZlci4KICMKK29iai15CQkJKz0gcG5wLm8KK3BucC15CQkJOj0gY29yZS5vIGNvbXBhdC5vCiAKLWlzYXBucC1wcm9jLSQoQ09ORklHX1BST0NfRlMpID0gcHJvYy5vCi0KLW9iai15IDo9IGNvcmUubyBjb21wYXQubyAkKGlzYXBucC1wcm9jLXkpCitwbnAtJChDT05GSUdfUFJPQ19GUykJKz0gcHJvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL01ha2VmaWxlIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9NYWtlZmlsZQppbmRleCA5MDUzMjZmLi40MGM5M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvTWFrZWZpbGUKQEAgLTEsNSArMSw2IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIFBOUEFDUEkgZHJpdmVyLgogIworb2JqLXkgKz0gcG5wLm8KIAotb2JqLXkgOj0gY29yZS5vIHJzcGFyc2VyLm8KK3BucC15IDo9IGNvcmUubyByc3BhcnNlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCmluZGV4IDU3MzEzZjQuLmNhODRkNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jCkBAIC04MSwxMiArODEsMTkgQEAKIAogc3RhdGljIGludCBwbnBhY3BpX3NldF9yZXNvdXJjZXMoc3RydWN0IHBucF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gZGV2LT5kYXRhOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFjcGlfZGV2LT5oYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldjsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKIAlpbnQgcmV0OwogCiAJcG5wX2RiZygmZGV2LT5kZXYsICJzZXQgcmVzb3VyY2VzXG4iKTsKKworCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmZGV2LT5kZXYpOworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFjcGlfZGV2KSkpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJBQ1BJIGRldmljZSBub3QgZm91bmQgaW4gJXMhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXJldCA9IHBucGFjcGlfYnVpbGRfcmVzb3VyY2VfdGVtcGxhdGUoZGV2LCAmYnVmZmVyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTA1LDEyICsxMTIsMTggQEAKIAogc3RhdGljIGludCBwbnBhY3BpX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IGRldi0+ZGF0YTsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhY3BpX2Rldi0+aGFuZGxlOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXY7CisJYWNwaV9oYW5kbGUgaGFuZGxlOwogCWludCByZXQ7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgImRpc2FibGUgcmVzb3VyY2VzXG4iKTsKIAorCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmZGV2LT5kZXYpOworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFjcGlfZGV2KSkpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJBQ1BJIGRldmljZSBub3QgZm91bmQgaW4gJXMhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwogCS8qIGFjcGlfdW5yZWdpc3Rlcl9nc2kocG5wX2lycShkZXYsIDApKTsgKi8KIAlyZXQgPSAwOwogCWlmIChhY3BpX2J1c19wb3dlcl9tYW5hZ2VhYmxlKGhhbmRsZSkpCkBAIC0xMjQsNDYgKzEzNyw3NCBAQAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiBzdGF0aWMgYm9vbCBwbnBhY3BpX2Nhbl93YWtldXAoc3RydWN0IHBucF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gZGV2LT5kYXRhOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFjcGlfZGV2LT5oYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldjsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwloYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJmRldi0+ZGV2KTsKKwlpZiAoIWhhbmRsZSB8fCBBQ1BJX0ZBSUxVUkUoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhY3BpX2RldikpKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiQUNQSSBkZXZpY2Ugbm90IGZvdW5kIGluICVzIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQogCiAJcmV0dXJuIGFjcGlfYnVzX2Nhbl93YWtldXAoaGFuZGxlKTsKIH0KIAogc3RhdGljIGludCBwbnBhY3BpX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSBkZXYtPmRhdGE7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gYWNwaV9kZXYtPmhhbmRsZTsKLQlpbnQgcG93ZXJfc3RhdGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldjsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJaW50IGVycm9yID0gMDsKKworCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmZGV2LT5kZXYpOworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFjcGlfZGV2KSkpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJBQ1BJIGRldmljZSBub3QgZm91bmQgaW4gJXMhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KIAogCWlmIChkZXZpY2VfY2FuX3dha2V1cCgmZGV2LT5kZXYpKSB7Ci0JCWludCByYyA9IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3dha2UoJmRldi0+ZGV2LAorCQllcnJvciA9IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3dha2UoJmRldi0+ZGV2LAogCQkJCWRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpOwotCi0JCWlmIChyYykKLQkJCXJldHVybiByYzsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOwogCX0KLQlwb3dlcl9zdGF0ZSA9IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlKCZkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKHBvd2VyX3N0YXRlIDwgMCkKLQkJcG93ZXJfc3RhdGUgPSAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pID8KLQkJCQlBQ1BJX1NUQVRFX0QwIDogQUNQSV9TVEFURV9EMzsKIAotCS8qIGFjcGlfYnVzX3NldF9wb3dlcigpIG9mdGVuIGZhaWxzIChrZXlib2FyZCBwb3J0IGNhbid0IGJlCi0JICogcG93ZXJlZC1kb3duPyksIGFuZCBpbiBhbnkgY2FzZSwgb3VyIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkCi0JICogYnkgcG5wX2J1c19zdXNwZW5kKCkuICBIZW5jZSB3ZSBkb24ndCByZXZlcnQgdGhlIHdha2V1cAotCSAqIHNldHRpbmcgaWYgdGhlIHNldF9wb3dlciBmYWlscy4KLQkgKi8KLQlyZXR1cm4gYWNwaV9idXNfc2V0X3Bvd2VyKGhhbmRsZSwgcG93ZXJfc3RhdGUpOworCWlmIChhY3BpX2J1c19wb3dlcl9tYW5hZ2VhYmxlKGhhbmRsZSkpIHsKKwkJaW50IHBvd2VyX3N0YXRlID0gYWNwaV9wbV9kZXZpY2Vfc2xlZXBfc3RhdGUoJmRldi0+ZGV2LCBOVUxMKTsKKworCQlpZiAocG93ZXJfc3RhdGUgPCAwKQorCQkJcG93ZXJfc3RhdGUgPSAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pID8KKwkJCQkJQUNQSV9TVEFURV9EMCA6IEFDUElfU1RBVEVfRDM7CisKKwkJLyoKKwkJICogYWNwaV9idXNfc2V0X3Bvd2VyKCkgb2Z0ZW4gZmFpbHMgKGtleWJvYXJkIHBvcnQgY2FuJ3QgYmUKKwkJICogcG93ZXJlZC1kb3duPyksIGFuZCBpbiBhbnkgY2FzZSwgb3VyIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkCisJCSAqIGJ5IHBucF9idXNfc3VzcGVuZCgpLiAgSGVuY2Ugd2UgZG9uJ3QgcmV2ZXJ0IHRoZSB3YWtldXAKKwkJICogc2V0dGluZyBpZiB0aGUgc2V0X3Bvd2VyIGZhaWxzLgorCQkgKi8KKwkJZXJyb3IgPSBhY3BpX2J1c19zZXRfcG93ZXIoaGFuZGxlLCBwb3dlcl9zdGF0ZSk7CisJfQorCisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IHBucGFjcGlfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IGRldi0+ZGF0YTsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBhY3BpX2Rldi0+aGFuZGxlOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXY7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZkZXYtPmRldik7CisJaW50IGVycm9yID0gMDsKKworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFjcGlfZGV2KSkpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJBQ1BJIGRldmljZSBub3QgZm91bmQgaW4gJXMhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKQogCQlhY3BpX3BtX2RldmljZV9zbGVlcF93YWtlKCZkZXYtPmRldiwgZmFsc2UpOwotCXJldHVybiBhY3BpX2J1c19zZXRfcG93ZXIoaGFuZGxlLCBBQ1BJX1NUQVRFX0QwKTsKKworCWlmIChhY3BpX2J1c19wb3dlcl9tYW5hZ2VhYmxlKGhhbmRsZSkpCisJCWVycm9yID0gYWNwaV9idXNfc2V0X3Bvd2VyKGhhbmRsZSwgQUNQSV9TVEFURV9EMCk7CisKKwlyZXR1cm4gZXJyb3I7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9NYWtlZmlsZSBiL2RyaXZlcnMvcG5wL3BucGJpb3MvTWFrZWZpbGUKaW5kZXggM2NkM2VkNy4uMjQwYjBmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL01ha2VmaWxlCkBAIC0xLDcgKzEsOCBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBQTlBCSU9TIGRyaXZlci4KICMKK29iai15IDo9IHBucC5vCiAKLXBucGJpb3MtcHJvYy0kKENPTkZJR19QTlBCSU9TX1BST0NfRlMpID0gcHJvYy5vCitwbnAteSA6PSBjb3JlLm8gYmlvc2NhbGxzLm8gcnNwYXJzZXIubwogCi1vYmoteSA6PSBjb3JlLm8gYmlvc2NhbGxzLm8gcnNwYXJzZXIubyAkKHBucGJpb3MtcHJvYy15KQorcG5wLSQoQ09ORklHX1BOUEJJT1NfUFJPQ19GUykgKz0gcHJvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKaW5kZXggNjBkODNkOS4uNjFiZjVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwpAQCAtMTM2LDYgKzEzNiwxNiBAQAogCSAgaW4gaGFuZGhlbGQgYW5kIHBvcnRhYmxlIGVxdWlwbWVudC4gVGhlIE1BWDE3MDQwIGlzIGNvbmZpZ3VyZWQKIAkgIHRvIG9wZXJhdGUgd2l0aCBhIHNpbmdsZSBsaXRoaXVtIGNlbGwKIAorY29uZmlnIEJBVFRFUllfTUFYMTcwNDIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTcwNDIvODk5Ny84OTY2IEZ1ZWwgR2F1Z2UiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBNQVgxNzA0MiBpcyBmdWVsLWdhdWdlIHN5c3RlbXMgZm9yIGxpdGhpdW0taW9uIChMaSspIGJhdHRlcmllcworCSAgaW4gaGFuZGhlbGQgYW5kIHBvcnRhYmxlIGVxdWlwbWVudC4gVGhlIE1BWDE3MDQyIGlzIGNvbmZpZ3VyZWQKKwkgIHRvIG9wZXJhdGUgd2l0aCBhIHNpbmdsZSBsaXRoaXVtIGNlbGwuIE1BWDg5OTcgYW5kIE1BWDg5NjYgYXJlCisJICBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzIHRoYXQgaW5jbHVkZSBmdWVsIGdhdWFnZXMgdGhhdCBhcmUgY29tcGF0aWJsZQorCSAgd2l0aCBNQVgxNzA0Mi4KKwogY29uZmlnIEJBVFRFUllfWjIKIAl0cmlzdGF0ZSAiWjIgYmF0dGVyeSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMgJiYgTUFDSF9aSVBJVDIKQEAgLTE4NSw0ICsxOTUsMTQgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBUV0w0MDMwIEJhdHRlcnkgQ2hhcmdlIEludGVyZmFjZS4KIAorY29uZmlnIENIQVJHRVJfR1BJTworCXRyaXN0YXRlICJHUElPIGNoYXJnZXIiCisJZGVwZW5kcyBvbiBHUElPTElCCisJaGVscAorCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBjaGFyZ2VycyB3aGljaCByZXBvcnQgdGhlaXIgb25saW5lIHN0YXR1cworCSAgdGhyb3VnaCBhIEdQSU8gcGluLgorCisJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBncGlvLWNoYXJnZXIuCisKIGVuZGlmICMgUE9XRVJfU1VQUExZCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQppbmRleCBjNzU3NzJlLi44Mzg1YmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAKIG9iai0kKENPTkZJR19CQVRURVJZX0JRMjd4MDApCSs9IGJxMjd4MDBfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9EQTkwMzApCSs9IGRhOTAzMF9iYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQwKQkrPSBtYXgxNzA0MF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQyKQkrPSBtYXgxNzA0Ml9iYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19CQVRURVJZX1oyKQkrPSB6Ml9iYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19CQVRURVJZX1MzQ19BREMpCSs9IHMzY19hZGNfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQ0hBUkdFUl9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtY2hhcmdlci5vCkBAIC0zMiwzICszMyw0IEBACiBvYmotJChDT05GSUdfQkFUVEVSWV9JTlRFTF9NSUQpCSs9IGludGVsX21pZF9iYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19DSEFSR0VSX0lTUDE3MDQpCSs9IGlzcDE3MDRfY2hhcmdlci5vCiBvYmotJChDT05GSUdfQ0hBUkdFUl9UV0w0MDMwKQkrPSB0d2w0MDMwX2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfR1BJTykJKz0gZ3Bpby1jaGFyZ2VyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvY29sbGllX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvY29sbGllX2JhdHRlcnkuYwppbmRleCAwMzlmNDFhLi41NDhkMjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2NvbGxpZV9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9jb2xsaWVfYmF0dGVyeS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIHN0YXRpYyBpbnQgY29sbGllX2JhdF9zdXNwZW5kKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJLyogZmx1c2ggYWxsIHBlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgKi8KLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtfc3luYygmYmF0X3dvcmspOwogCXJldHVybiAwOwogfQogCkBAIC0zNjIsNyArMzYyLDcgQEAKIGVycl9wc3lfcmVnX21haW46CiAKIAkvKiBzZWUgY29tbWVudCBpbiBjb2xsaWVfYmF0X3JlbW92ZSAqLwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJY2FuY2VsX3dvcmtfc3luYygmYmF0X3dvcmspOwogCiAJaS0tOwogZXJyX2dwaW86CkBAIC0zODIsMTIgKzM4MiwxMSBAQAogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjb2xsaWVfYmF0X21haW4ucHN5KTsKIAogCS8qCi0JICogbm93IGZsdXNoIGFsbCBwZW5kaW5nIHdvcmsuCi0JICogd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIHNjaGVkdWxlcywgc2luY2UgYWxsCi0JICogc291cmNlcyAoaXNyIGFuZCBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkKQotCSAqIGFyZSB1bnJlZ2lzdGVyZWQgbm93LgorCSAqIE5vdyBjYW5jZWwgdGhlIGJhdF93b3JrLiAgV2Ugd29uJ3QgZ2V0IGFueSBtb3JlIHNjaGVkdWxlcywKKwkgKiBzaW5jZSBhbGwgc291cmNlcyAoaXNyIGFuZCBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkKSBhcmUKKwkgKiB1bnJlZ2lzdGVyZWQgbm93LgogCSAqLwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJY2FuY2VsX3dvcmtfc3luYygmYmF0X3dvcmspOwogCiAJZm9yIChpID0gQVJSQVlfU0laRShncGlvcykgLSAxOyBpID49IDA7IGktLSkKIAkJZ3Bpb19mcmVlKGdwaW9zW2ldLmdwaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCmluZGV4IGU3Zjg5NzguLmU1MzQyOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCWlmIChkaS0+cmVtX2NhcGFjaXR5ID4gMTAwKQogCQlkaS0+cmVtX2NhcGFjaXR5ID0gMTAwOwogCi0JaWYgKGRpLT5jdXJyZW50X3VBID49IDEwMEwpCisJaWYgKGRpLT5jdXJyZW50X3VBIDwgLTEwMEwpCiAJCWRpLT5saWZlX3NlYyA9IC0oKGRpLT5hY2N1bV9jdXJyZW50X3VBaCAtIGRpLT5lbXB0eV91QWgpICogMzZMKQogCQkJCQkvIChkaS0+Y3VycmVudF91QSAvIDEwMEwpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Yjg4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiAgRHJpdmVyIGZvciBjaGFyZ2VycyB3aGljaCByZXBvcnQgdGhlaXIgb25saW5lIHN0YXR1cyB0aHJvdWdoIGEgR1BJTyBwaW4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wb3dlci9ncGlvLWNoYXJnZXIuaD4KKworc3RydWN0IGdwaW9fY2hhcmdlciB7CisJY29uc3Qgc3RydWN0IGdwaW9fY2hhcmdlcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwl1bnNpZ25lZCBpbnQgaXJxOworCisJc3RydWN0IHBvd2VyX3N1cHBseSBjaGFyZ2VyOworfTsKKworc3RhdGljIGlycXJldHVybl90IGdwaW9fY2hhcmdlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlciA9IGRldmlkOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fY2hhcmdlciAqcHN5X3RvX2dwaW9fY2hhcmdlcihzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBncGlvX2NoYXJnZXIsIGNoYXJnZXIpOworfQorCitzdGF0aWMgaW50IGdwaW9fY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGdwaW9fY2hhcmdlciAqZ3Bpb19jaGFyZ2VyID0gcHN5X3RvX2dwaW9fY2hhcmdlcihwc3kpOworCWNvbnN0IHN0cnVjdCBncGlvX2NoYXJnZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBncGlvX2NoYXJnZXItPnBkYXRhOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSBncGlvX2dldF92YWx1ZShwZGF0YS0+Z3Bpbyk7CisJCXZhbC0+aW50dmFsIF49IHBkYXRhLT5ncGlvX2FjdGl2ZV9sb3c7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZ3Bpb19jaGFyZ2VyX3Byb3BlcnRpZXNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvX2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgZ3Bpb19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGdwaW9fY2hhcmdlciAqZ3Bpb19jaGFyZ2VyOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmNoYXJnZXI7CisJaW50IHJldDsKKwlpbnQgaXJxOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIGdwaW8gcGluXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZ3Bpb19jaGFyZ2VyID0ga3phbGxvYyhzaXplb2YoKmdwaW9fY2hhcmdlciksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb19jaGFyZ2VyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvYyBkcml2ZXIgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2hhcmdlciA9ICZncGlvX2NoYXJnZXItPmNoYXJnZXI7CisKKwljaGFyZ2VyLT5uYW1lID0gcGRhdGEtPm5hbWUgPyBwZGF0YS0+bmFtZSA6ICJncGlvLWNoYXJnZXIiOworCWNoYXJnZXItPnR5cGUgPSBwZGF0YS0+dHlwZTsKKwljaGFyZ2VyLT5wcm9wZXJ0aWVzID0gZ3Bpb19jaGFyZ2VyX3Byb3BlcnRpZXM7CisJY2hhcmdlci0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGdwaW9fY2hhcmdlcl9wcm9wZXJ0aWVzKTsKKwljaGFyZ2VyLT5nZXRfcHJvcGVydHkgPSBncGlvX2NoYXJnZXJfZ2V0X3Byb3BlcnR5OworCWNoYXJnZXItPnN1cHBsaWVkX3RvID0gcGRhdGEtPnN1cHBsaWVkX3RvOworCWNoYXJnZXItPm51bV9zdXBwbGljYW50cyA9IHBkYXRhLT5udW1fc3VwcGxpY2FudHM7CisKKwlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmdwaW8sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGdwaW8gcGluOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmdwaW8pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBncGlvIHRvIGlucHV0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZ3Bpb19mcmVlOworCX0KKworCWdwaW9fY2hhcmdlci0+cGRhdGEgPSBwZGF0YTsKKworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBjaGFyZ2VyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5OiAlZFxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2dwaW9fZnJlZTsKKwl9CisKKwlpcnEgPSBncGlvX3RvX2lycShwZGF0YS0+Z3Bpbyk7CisJaWYgKGlycSA+IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9hbnlfY29udGV4dF9pcnEoaXJxLCBncGlvX2NoYXJnZXJfaXJxLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgY2hhcmdlcik7CisJCWlmIChyZXQpCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKKwkJZWxzZQorCQkJZ3Bpb19jaGFyZ2VyLT5pcnEgPSBpcnE7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpb19jaGFyZ2VyKTsKKworCXJldHVybiAwOworCitlcnJfZ3Bpb19mcmVlOgorCWdwaW9fZnJlZShwZGF0YS0+Z3Bpbyk7CitlcnJfZnJlZToKKwlrZnJlZShncGlvX2NoYXJnZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGdwaW9fY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGFyZ2VyICpncGlvX2NoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChncGlvX2NoYXJnZXItPmlycSkKKwkJZnJlZV9pcnEoZ3Bpb19jaGFyZ2VyLT5pcnEsICZncGlvX2NoYXJnZXItPmNoYXJnZXIpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmdwaW9fY2hhcmdlci0+Y2hhcmdlcik7CisKKwlncGlvX2ZyZWUoZ3Bpb19jaGFyZ2VyLT5wZGF0YS0+Z3Bpbyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShncGlvX2NoYXJnZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fY2hhcmdlcl9kcml2ZXIgPSB7CisJLnByb2JlID0gZ3Bpb19jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChncGlvX2NoYXJnZXJfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJncGlvLWNoYXJnZXIiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ3Bpb19jaGFyZ2VyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZncGlvX2NoYXJnZXJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGdwaW9fY2hhcmdlcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdwaW9fY2hhcmdlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwaW9fY2hhcmdlcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ3Bpb19jaGFyZ2VyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBjaGFyZ2VycyB3aGljaCByZXBvcnQgdGhlaXIgb25saW5lIHN0YXR1cyB0aHJvdWdoIGEgR1BJTyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvLWNoYXJnZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvaW50ZWxfbWlkX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvaW50ZWxfbWlkX2JhdHRlcnkuYwppbmRleCAzNmNmNDAyLi5iY2UzYTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9pbnRlbF9taWRfYmF0dGVyeS5jCkBAIC03NjUsNyArNzY1LDcgQEAKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcGJpLT51c2IpOwogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwYmktPmJhdHQpOwogCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPmhhbmRsZXIpOwogCWtmcmVlKHBiaSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9pc3AxNzA0X2NoYXJnZXIuYwppbmRleCA3MjUxMjE4Li4yYWQ5YjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmMKQEAgLTU5LDExICs1OSw2MSBAQAogCXN0cnVjdCBub3RpZmllcl9ibG9jawluYjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAotCWNoYXIJCQltb2RlbFs3XTsKKwkvKiBwcm9wZXJ0aWVzICovCisJY2hhcgkJCW1vZGVsWzhdOwogCXVuc2lnbmVkCQlwcmVzZW50OjE7CisJdW5zaWduZWQJCW9ubGluZToxOworCXVuc2lnbmVkCQljdXJyZW50X21heDsKKworCS8qIHRlbXAgc3RvcmFnZSB2YXJpYWJsZXMgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudDsKKwl1bnNpZ25lZAkJbWF4X3Bvd2VyOwogfTsKIAogLyoKKyAqIERldGVybWluZSBpcyB0aGUgY2hhcmdpbmcgcG9ydCBEQ1AgKGRlZGljYXRlZCBjaGFyZ2VyKSBvciBDRFAgKEhvc3QvSFVCCisgKiBjaGFyZ2VycykuCisgKgorICogUkVWSVNJVDogVGhlIG1ldGhvZCBpcyBkZWZpbmVkIGluIEJhdHRlcnkgQ2hhcmdpbmcgU3BlY2lmaWNhdGlvbiBhbmQgaXMKKyAqIGFwcGxpY2FibGUgdG8gYW55IFVMUEkgdHJhbnNjZWl2ZXIuIE5vdGhpbmcgaXNwMTcweCBzcGVjaWZpYyBoZXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpc3AxNzA0X2NoYXJnZXJfdHlwZShzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyICppc3ApCit7CisJdTggcmVnOworCXU4IGZ1bmNfY3RybDsKKwl1OCBvdGdfY3RybDsKKwlpbnQgdHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9EQ1A7CisKKwlmdW5jX2N0cmwgPSBvdGdfaW9fcmVhZChpc3AtPm90ZywgVUxQSV9GVU5DX0NUUkwpOworCW90Z19jdHJsID0gb3RnX2lvX3JlYWQoaXNwLT5vdGcsIFVMUElfT1RHX0NUUkwpOworCisJLyogZGlzYWJsZSBwdWxsZG93bnMgKi8KKwlyZWcgPSBVTFBJX09UR19DVFJMX0RNX1BVTExET1dOIHwgVUxQSV9PVEdfQ1RSTF9EUF9QVUxMRE9XTjsKKwlvdGdfaW9fd3JpdGUoaXNwLT5vdGcsIFVMUElfQ0xSKFVMUElfT1RHX0NUUkwpLCByZWcpOworCisJLyogZnVsbCBzcGVlZCAqLworCW90Z19pb193cml0ZShpc3AtPm90ZywgVUxQSV9DTFIoVUxQSV9GVU5DX0NUUkwpLAorCQkJVUxQSV9GVU5DX0NUUkxfWENWUlNFTF9NQVNLKTsKKwlvdGdfaW9fd3JpdGUoaXNwLT5vdGcsIFVMUElfU0VUKFVMUElfRlVOQ19DVFJMKSwKKwkJCVVMUElfRlVOQ19DVFJMX0ZVTExfU1BFRUQpOworCisJLyogRW5hYmxlIHN0cm9uZyBwdWxsLXVwIG9uIERQICgxLjVLKSBhbmQgcmVzZXQgKi8KKwlyZWcgPSBVTFBJX0ZVTkNfQ1RSTF9URVJNU0VMRUNUIHwgVUxQSV9GVU5DX0NUUkxfUkVTRVQ7CisJb3RnX2lvX3dyaXRlKGlzcC0+b3RnLCBVTFBJX1NFVChVTFBJX0ZVTkNfQ1RSTCksIHJlZyk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCisJcmVnID0gb3RnX2lvX3JlYWQoaXNwLT5vdGcsIFVMUElfREVCVUcpOworCWlmICgocmVnICYgMykgIT0gMykKKwkJdHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9DRFA7CisKKwkvKiByZWNvdmVyIG9yaWdpbmFsIHN0YXRlICovCisJb3RnX2lvX3dyaXRlKGlzcC0+b3RnLCBVTFBJX0ZVTkNfQ1RSTCwgZnVuY19jdHJsKTsKKwlvdGdfaW9fd3JpdGUoaXNwLT5vdGcsIFVMUElfT1RHX0NUUkwsIG90Z19jdHJsKTsKKworCXJldHVybiB0eXBlOworfQorCisvKgogICogSVNQMTcwNCBkZXRlY3RzIFBTLzIgYWRhcHRlcnMgYXMgY2hhcmdlci4gVG8gbWFrZSBzdXJlIHRoZSBkZXRlY3RlZCBjaGFyZ2VyCiAgKiBpcyBhY3R1YWxseSBhIGRlZGljYXRlZCBjaGFyZ2VyLCB0aGUgZm9sbG93aW5nIHN0ZXBzIG5lZWQgdG8gYmUgdGFrZW4uCiAgKi8KQEAgLTEyNywxNiArMTc3LDE5IEBACiBzdGF0aWMgaW5saW5lIGludCBpc3AxNzA0X2NoYXJnZXJfZGV0ZWN0KHN0cnVjdCBpc3AxNzA0X2NoYXJnZXIgKmlzcCkKIHsKIAl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7Ci0JdTgJCXI7CisJdTgJCXB3cl9jdHJsOwogCWludAkJcmV0ID0gMDsKIAorCXB3cl9jdHJsID0gb3RnX2lvX3JlYWQoaXNwLT5vdGcsIElTUDE3MDRfUFdSX0NUUkwpOworCiAJLyogc2V0IFNXIGNvbnRyb2wgYml0IGluIFBXUl9DVFJMIHJlZ2lzdGVyICovCiAJb3RnX2lvX3dyaXRlKGlzcC0+b3RnLCBJU1AxNzA0X1BXUl9DVFJMLAogCQkJSVNQMTcwNF9QV1JfQ1RSTF9TV0NUUkwpOwogCiAJLyogZW5hYmxlIG1hbnVhbCBjaGFyZ2VyIGRldGVjdGlvbiAqLwotCXIgPSAoSVNQMTcwNF9QV1JfQ1RSTF9TV0NUUkwgfCBJU1AxNzA0X1BXUl9DVFJMX0RQVlNSQ19FTik7Ci0Jb3RnX2lvX3dyaXRlKGlzcC0+b3RnLCBVTFBJX1NFVChJU1AxNzA0X1BXUl9DVFJMKSwgcik7CisJb3RnX2lvX3dyaXRlKGlzcC0+b3RnLCBVTFBJX1NFVChJU1AxNzA0X1BXUl9DVFJMKSwKKwkJCUlTUDE3MDRfUFdSX0NUUkxfU1dDVFJMCisJCQl8IElTUDE3MDRfUFdSX0NUUkxfRFBWU1JDX0VOKTsKIAl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAKIAl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzAwKTsKQEAgLTE0Nyw3ICsyMDAsMTAgQEAKIAkJCXJldCA9IGlzcDE3MDRfY2hhcmdlcl92ZXJpZnkoaXNwKTsKIAkJCWJyZWFrOwogCQl9Ci0JfSB3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpICYmIGlzcC0+b25saW5lKTsKKworCS8qIHJlY292ZXIgb3JpZ2luYWwgc3RhdGUgKi8KKwlvdGdfaW9fd3JpdGUoaXNwLT5vdGcsIElTUDE3MDRfUFdSX0NUUkwsIHB3cl9jdHJsKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNTUsNTIgKzIxMSw5MiBAQAogc3RhdGljIHZvaWQgaXNwMTcwNF9jaGFyZ2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewogCWludAkJCWRldGVjdDsKKwl1bnNpZ25lZCBsb25nCQlldmVudDsKKwl1bnNpZ25lZAkJcG93ZXI7CiAJc3RydWN0IGlzcDE3MDRfY2hhcmdlcgkqaXNwID0KIAkJY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpc3AxNzA0X2NoYXJnZXIsIHdvcmspOworCXN0YXRpYyBERUZJTkVfTVVURVgobG9jayk7CiAKLQkvKgotCSAqIEZJWE1FIE9ubHkgc3VwcG9ydGluZyBkZWRpY2F0ZWQgY2hhcmdlcnMgZXZlbiB0aG91Z2ggaXNwMTcwNCBjYW4KLQkgKiBkZXRlY3QgSFVCIGFuZCBIT1NUIGNoYXJnZXJzLiBJZiB0aGUgZGV2aWNlIGhhcyBhbHJlYWR5IGJlZW4KLQkgKiBlbnVtZXJhdGVkLCB0aGUgZGV0ZWN0aW9uIHdpbGwgYnJlYWsgdGhlIGNvbm5lY3Rpb24uCi0JICovCi0JaWYgKGlzcC0+b3RnLT5zdGF0ZSAhPSBPVEdfU1RBVEVfQl9JRExFKQotCQlyZXR1cm47CisJZXZlbnQgPSBpc3AtPmV2ZW50OworCXBvd2VyID0gaXNwLT5tYXhfcG93ZXI7CiAKLQkvKiBkaXNhYmxlIGRhdGEgcHVsbHVwcyAqLwotCWlmIChpc3AtPm90Zy0+Z2FkZ2V0KQotCQl1c2JfZ2FkZ2V0X2Rpc2Nvbm5lY3QoaXNwLT5vdGctPmdhZGdldCk7CisJbXV0ZXhfbG9jaygmbG9jayk7CiAKLQkvKiBkZXRlY3QgY2hhcmdlciAqLwotCWRldGVjdCA9IGlzcDE3MDRfY2hhcmdlcl9kZXRlY3QoaXNwKTsKLQlpZiAoZGV0ZWN0KSB7Ci0JCWlzcC0+cHJlc2VudCA9IGRldGVjdDsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmlzcC0+cHN5KTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBVU0JfRVZFTlRfVkJVUzoKKwkJaXNwLT5vbmxpbmUgPSB0cnVlOworCisJCS8qIGRldGVjdCBjaGFyZ2VyICovCisJCWRldGVjdCA9IGlzcDE3MDRfY2hhcmdlcl9kZXRlY3QoaXNwKTsKKworCQlpZiAoZGV0ZWN0KSB7CisJCQlpc3AtPnByZXNlbnQgPSBkZXRlY3Q7CisJCQlpc3AtPnBzeS50eXBlID0gaXNwMTcwNF9jaGFyZ2VyX3R5cGUoaXNwKTsKKwkJfQorCisJCXN3aXRjaCAoaXNwLT5wc3kudHlwZSkgeworCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9EQ1A6CisJCQlpc3AtPmN1cnJlbnRfbWF4ID0gMTgwMDsKKwkJCWJyZWFrOworCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9DRFA6CisJCQkvKgorCQkJICogT25seSA1MDBtQSBoZXJlIG9yIGhpZ2ggc3BlZWQgY2hpcnAKKwkJCSAqIGhhbmRzaGFraW5nIG1heSBicmVhaworCQkJICovCisJCQlpc3AtPmN1cnJlbnRfbWF4ID0gNTAwOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I6CisJCWRlZmF1bHQ6CisJCQkvKiBlbmFibGUgZGF0YSBwdWxsdXBzICovCisJCQlpZiAoaXNwLT5vdGctPmdhZGdldCkKKwkJCQl1c2JfZ2FkZ2V0X2Nvbm5lY3QoaXNwLT5vdGctPmdhZGdldCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVU0JfRVZFTlRfTk9ORToKKwkJaXNwLT5vbmxpbmUgPSBmYWxzZTsKKwkJaXNwLT5jdXJyZW50X21heCA9IDA7CisJCWlzcC0+cHJlc2VudCA9IDA7CisJCWlzcC0+Y3VycmVudF9tYXggPSAwOworCQlpc3AtPnBzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOworCisJCS8qCisJCSAqIERpc2FibGUgZGF0YSBwdWxsdXBzLiBXZSBuZWVkIHRvIHByZXZlbnQgdGhlIGNvbnRyb2xsZXIgZnJvbQorCQkgKiBlbnVtZXJhdGluZy4KKwkJICoKKwkJICogRklYTUU6IFRoaXMgaXMgaGVyZSB0byBhbGxvdyBjaGFyZ2VyIGRldGVjdGlvbiB3aXRoIEhvc3QvSFVCCisJCSAqIGNoYXJnZXJzLiBUaGUgcHVsbHVwcyBtYXkgYmUgZW5hYmxlZCBlbHNld2hlcmUsIHNvIHRoaXMgY2FuCisJCSAqIG5vdCBiZSB0aGUgZmluYWwgc29sdXRpb24uCisJCSAqLworCQlpZiAoaXNwLT5vdGctPmdhZGdldCkKKwkJCXVzYl9nYWRnZXRfZGlzY29ubmVjdChpc3AtPm90Zy0+Z2FkZ2V0KTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRVZFTlRfRU5VTUVSQVRFRDoKKwkJaWYgKGlzcC0+cHJlc2VudCkKKwkJCWlzcC0+Y3VycmVudF9tYXggPSAxODAwOworCQllbHNlCisJCQlpc3AtPmN1cnJlbnRfbWF4ID0gcG93ZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OwogCX0KIAotCS8qIGVuYWJsZSBkYXRhIHB1bGx1cHMgKi8KLQlpZiAoaXNwLT5vdGctPmdhZGdldCkKLQkJdXNiX2dhZGdldF9jb25uZWN0KGlzcC0+b3RnLT5nYWRnZXQpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZpc3AtPnBzeSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIH0KIAogc3RhdGljIGludCBpc3AxNzA0X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqdW51c2VkKQorCQl1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwb3dlcikKIHsKIAlzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyICppc3AgPQogCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBpc3AxNzA0X2NoYXJnZXIsIG5iKTsKIAotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFVTQl9FVkVOVF9WQlVTOgotCQlzY2hlZHVsZV93b3JrKCZpc3AtPndvcmspOwotCQlicmVhazsKLQljYXNlIFVTQl9FVkVOVF9OT05FOgotCQlpZiAoaXNwLT5wcmVzZW50KSB7Ci0JCQlpc3AtPnByZXNlbnQgPSAwOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmlzcC0+cHN5KTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQorCWlzcC0+ZXZlbnQgPSBldmVudDsKKworCWlmIChwb3dlcikKKwkJaXNwLT5tYXhfcG93ZXIgPSAqKCh1bnNpZ25lZCAqKXBvd2VyKTsKKworCXNjaGVkdWxlX3dvcmsoJmlzcC0+d29yayk7CiAKIAlyZXR1cm4gTk9USUZZX09LOwogfQpAQCAtMjE2LDYgKzMxMiwxMiBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKIAkJdmFsLT5pbnR2YWwgPSBpc3AtPnByZXNlbnQ7CiAJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IGlzcC0+b25saW5lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOgorCQl2YWwtPmludHZhbCA9IGlzcC0+Y3VycmVudF9tYXg7CisJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKIAkJdmFsLT5zdHJ2YWwgPSBpc3AtPm1vZGVsOwogCQlicmVhazsKQEAgLTIzMCw2ICszMzIsOCBAQAogCiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcG93ZXJfcHJvcHNbXSA9IHsKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAogCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKIH07CkBAIC0yODcsMTMgKzM5MSwxMyBAQAogCWlmICghaXNwLT5vdGcpCiAJCWdvdG8gZmFpbDA7CiAKKwlpc3AtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaXNwKTsKKwogCXJldCA9IGlzcDE3MDRfdGVzdF91bHBpKGlzcCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZmFpbDE7CiAKLQlpc3AtPmRldiA9ICZwZGV2LT5kZXY7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaXNwKTsKLQogCWlzcC0+cHN5Lm5hbWUJCT0gImlzcDE3MDQiOwogCWlzcC0+cHN5LnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwogCWlzcC0+cHN5LnByb3BlcnRpZXMJPSBwb3dlcl9wcm9wczsKQEAgLTMxOCw2ICs0MjIsMjMgQEAKIAogCWRldl9pbmZvKGlzcC0+ZGV2LCAicmVnaXN0ZXJlZCB3aXRoIHByb2R1Y3QgaWQgJXNcbiIsIGlzcC0+bW9kZWwpOwogCisJLyoKKwkgKiBUYWtpbmcgb3ZlciB0aGUgRCsgcHVsbHVwLgorCSAqCisJICogRklYTUU6IFRoZSBkZXZpY2Ugd2lsbCBiZSBkaXNjb25uZWN0ZWQgaWYgaXQgd2FzIGFscmVhZHkKKwkgKiBlbnVtZXJhdGVkLiBUaGUgY2hhcmdlciBkcml2ZXIgc2hvdWxkIGJlIGFsd2F5cyBsb2FkZWQgYmVmb3JlIGFueQorCSAqIGdhZGdldCBpcyBsb2FkZWQuCisJICovCisJaWYgKGlzcC0+b3RnLT5nYWRnZXQpCisJCXVzYl9nYWRnZXRfZGlzY29ubmVjdChpc3AtPm90Zy0+Z2FkZ2V0KTsKKworCS8qIERldGVjdCBjaGFyZ2VyIGlmIFZCVVMgaXMgdmFsaWQgKHRoZSBjYWJsZSB3YXMgYWxyZWFkeSBwbHVnZ2VkKS4gKi8KKwlyZXQgPSBvdGdfaW9fcmVhZChpc3AtPm90ZywgVUxQSV9VU0JfSU5UX1NUUyk7CisJaWYgKChyZXQgJiBVTFBJX0lOVF9WQlVTX1ZBTElEKSAmJiAhaXNwLT5vdGctPmRlZmF1bHRfYSkgeworCQlpc3AtPmV2ZW50ID0gVVNCX0VWRU5UX1ZCVVM7CisJCXNjaGVkdWxlX3dvcmsoJmlzcC0+d29yayk7CisJfQorCiAJcmV0dXJuIDA7CiBmYWlsMjoKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmaXNwLT5wc3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9qejQ3NDAtYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9qejQ3NDAtYmF0dGVyeS5jCmluZGV4IGE4MTA4YTcuLjAyNDE0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvano0NzQwLWJhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtNDcsNiArNDgsOCBAQAogCiAJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKworCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QganpfYmF0dGVyeSAqcHN5X3RvX2p6X2JhdHRlcnkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQpAQCAtNjgsNiArNzEsOCBAQAogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWxvbmcgdm9sdGFnZTsKIAorCW11dGV4X2xvY2soJmJhdHRlcnktPmxvY2spOworCiAJSU5JVF9DT01QTEVUSU9OKGJhdHRlcnktPnJlYWRfY29tcGxldGlvbik7CiAKIAllbmFibGVfaXJxKGJhdHRlcnktPmlycSk7CkBAIC05MSw2ICs5Niw4IEBACiAJYmF0dGVyeS0+Y2VsbC0+ZGlzYWJsZShiYXR0ZXJ5LT5wZGV2KTsKIAlkaXNhYmxlX2lycShiYXR0ZXJ5LT5pcnEpOwogCisJbXV0ZXhfdW5sb2NrKCZiYXR0ZXJ5LT5sb2NrKTsKKwogCXJldHVybiB2b2x0YWdlOwogfQogCkBAIC0yNDAsNiArMjQ3LDExIEBACiAJc3RydWN0IGp6X2JhdHRlcnkgKmp6X2JhdHRlcnk7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKIAorCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm1fZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCiAJanpfYmF0dGVyeSA9IGt6YWxsb2Moc2l6ZW9mKCpqel9iYXR0ZXJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFqel9iYXR0ZXJ5KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgc3RydWN0dXJlXG4iKTsKQEAgLTI5MSw2ICszMDMsNyBAQAogCWp6X2JhdHRlcnktPnBkZXYgPSBwZGV2OwogCiAJaW5pdF9jb21wbGV0aW9uKCZqel9iYXR0ZXJ5LT5yZWFkX2NvbXBsZXRpb24pOworCW11dGV4X2luaXQoJmp6X2JhdHRlcnktPmxvY2spOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmp6X2JhdHRlcnktPndvcmssIGp6X2JhdHRlcnlfd29yayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjODgwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogRnVlbCBnYXVnZSBkcml2ZXIgZm9yIE1heGltIDE3MDQyIC8gODk2NiAvIDg5OTcKKyAqICBOb3RlIHRoYXQgTWF4aW0gODk2NiBhbmQgODk5NyBhcmUgbWZkIGFuZCB0aGlzIGlzIGl0cyBzdWJkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBtYXgxNzA0MF9iYXR0ZXJ5LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5Lmg+CisKK2VudW0gbWF4MTcwNDJfcmVnaXN0ZXIgeworCU1BWDE3MDQyX1NUQVRVUwkJPSAweDAwLAorCU1BWDE3MDQyX1ZBTFJUX1RoCT0gMHgwMSwKKwlNQVgxNzA0Ml9UQUxSVF9UaAk9IDB4MDIsCisJTUFYMTcwNDJfU0FMUlRfVGgJPSAweDAzLAorCU1BWDE3MDQyX0F0UmF0ZQkJPSAweDA0LAorCU1BWDE3MDQyX1JlcENhcAkJPSAweDA1LAorCU1BWDE3MDQyX1JlcFNPQwkJPSAweDA2LAorCU1BWDE3MDQyX0FnZQkJPSAweDA3LAorCU1BWDE3MDQyX1RFTVAJCT0gMHgwOCwKKwlNQVgxNzA0Ml9WQ0VMTAkJPSAweDA5LAorCU1BWDE3MDQyX0N1cnJlbnQJPSAweDBBLAorCU1BWDE3MDQyX0F2Z0N1cnJlbnQJPSAweDBCLAorCU1BWDE3MDQyX1FyZXNpZHVhbAk9IDB4MEMsCisJTUFYMTcwNDJfU09DCQk9IDB4MEQsCisJTUFYMTcwNDJfQXZTT0MJCT0gMHgwRSwKKwlNQVgxNzA0Ml9SZW1DYXAJCT0gMHgwRiwKKwlNQVgxNzQwMl9GdWxsQ0FQCT0gMHgxMCwKKwlNQVgxNzA0Ml9UVEUJCT0gMHgxMSwKKwlNQVgxNzA0Ml9WX2VtcHR5CT0gMHgxMiwKKworCU1BWDE3MDQyX1JTTE9XCQk9IDB4MTQsCisKKwlNQVgxNzA0Ml9BdmdUQQkJPSAweDE2LAorCU1BWDE3MDQyX0N5Y2xlcwkJPSAweDE3LAorCU1BWDE3MDQyX0Rlc2lnbkNhcAk9IDB4MTgsCisJTUFYMTcwNDJfQXZnVkNFTEwJPSAweDE5LAorCU1BWDE3MDQyX01pbk1heFRlbXAJPSAweDFBLAorCU1BWDE3MDQyX01pbk1heFZvbHQJPSAweDFCLAorCU1BWDE3MDQyX01pbk1heEN1cnIJPSAweDFDLAorCU1BWDE3MDQyX0NPTkZJRwkJPSAweDFELAorCU1BWDE3MDQyX0lDSEdUZXJtCT0gMHgxRSwKKwlNQVgxNzA0Ml9BdkNhcAkJPSAweDFGLAorCU1BWDE3MDQyX01hbk5hbWUJPSAweDIwLAorCU1BWDE3MDQyX0Rldk5hbWUJPSAweDIxLAorCU1BWDE3MDQyX0RldkNoZW0JPSAweDIyLAorCisJTUFYMTcwNDJfVGVtcE5vbQk9IDB4MjQsCisJTUFYMTcwNDJfVGVtcENvbGQJPSAweDI1LAorCU1BWDE3MDQyX1RlbXBIb3QJPSAweDI2LAorCU1BWDE3MDQyX0FJTgkJPSAweDI3LAorCU1BWDE3MDQyX0xlYXJuQ0ZHCT0gMHgyOCwKKwlNQVgxNzA0Ml9TSEZUQ0ZHCT0gMHgyOSwKKwlNQVgxNzA0Ml9SZWxheENGRwk9IDB4MkEsCisJTUFYMTcwNDJfTWlzY0NGRwk9IDB4MkIsCisJTUFYMTcwNDJfVEdBSU4JCT0gMHgyQywKKwlNQXgxNzA0Ml9UT0ZGCQk9IDB4MkQsCisJTUFYMTcwNDJfQ0dBSU4JCT0gMHgyRSwKKwlNQVgxNzA0Ml9DT0ZGCQk9IDB4MkYsCisKKwlNQVgxNzA0Ml9RX2VtcHR5CT0gMHgzMywKKwlNQVgxNzA0Ml9UX2VtcHR5CT0gMHgzNCwKKworCU1BWDE3MDQyX1JDT01QMAkJPSAweDM4LAorCU1BWDE3MDQyX1RlbXBDbwkJPSAweDM5LAorCU1BWDE3MDQyX1J4CQk9IDB4M0EsCisJTUFYMTcwNDJfVF9lbXB0eTAJPSAweDNCLAorCU1BWDE3MDQyX1Rhc2tQZXJpb2QJPSAweDNDLAorCU1BWDE3MDQyX0ZTVEFUCQk9IDB4M0QsCisKKwlNQVgxNzA0Ml9TSEROVElNRVIJPSAweDNGLAorCisJTUFYMTcwNDJfVkZSZW1DYXAJPSAweDRBLAorCisJTUFYMTcwNDJfUUgJCT0gMHg0RCwKKwlNQVgxNzA0Ml9RTAkJPSAweDRFLAorfTsKKworc3RydWN0IG1heDE3MDQyX2NoaXAgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKK307CisKK3N0YXRpYyBpbnQgbWF4MTcwNDJfd3JpdGVfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCWludCByZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZXJyICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTcwNDJfcmVhZF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWludCByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGVyciAlZFxuIiwgX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4MTcwNDJfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorfTsKKworc3RhdGljIGludCBtYXgxNzA0Ml9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gY29udGFpbmVyX29mKHBzeSwKKwkJCQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCwgYmF0dGVyeSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LAorCQkJCU1BWDE3MDQyX1ZDRUxMKSAqIDgzOyAvKiAxMDAwIC8gMTIgPSA4MyAqLworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9BdmdWQ0VMTCkgKiA4MzsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfU09DKSAvIDI1NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXgxNzA0Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXA7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+YmF0dGVyeS5uYW1lCQk9ICJtYXgxNzA0Ml9iYXR0ZXJ5IjsKKwljaGlwLT5iYXR0ZXJ5LnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwljaGlwLT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eQk9IG1heDE3MDQyX2dldF9wcm9wZXJ0eTsKKwljaGlwLT5iYXR0ZXJ5LnByb3BlcnRpZXMJPSBtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzOworCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpOworCisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmNoaXAtPmJhdHRlcnkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOworCQlrZnJlZShjaGlwKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgeworCQltYXgxNzA0Ml93cml0ZV9yZWcoY2xpZW50LCBNQVgxNzA0Ml9DR0FJTiwgMHgwMDAwKTsKKwkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfTWlzY0NGRywgMHgwMDAzKTsKKwkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfTGVhcm5DRkcsIDB4MDAwNyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDE3MDQyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hpcC0+YmF0dGVyeSk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJa2ZyZWUoY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXgxNzA0Ml9pZFtdID0geworCXsgIm1heDE3MDQyIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXgxNzA0Ml9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXgxNzA0Ml9pMmNfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gIm1heDE3MDQyIiwKKwl9LAorCS5wcm9iZQkJPSBtYXgxNzA0Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1heDE3MDQyX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gbWF4MTcwNDJfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYXgxNzA0Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtYXgxNzA0Ml9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1heDE3MDQyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWF4MTcwNDJfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZtYXgxNzA0Ml9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1heDE3MDQyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYMTcwNDIgRnVlbCBHYXVnZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMKaW5kZXggNWJjMWRjZi4uMGIwZmYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL29scGNfYmF0dGVyeS5jCkBAIC0yMDEsNiArMjAxLDcyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBvbHBjX2JhdF9nZXRfY2hhcmdlX2Z1bGxfZGVzaWduKHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdWludDhfdCBlY19ieXRlOworCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsIHRlY2g7CisJaW50IHJldCwgbWZyOworCisJcmV0ID0gb2xwY19iYXRfZ2V0X3RlY2goJnRlY2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllY19ieXRlID0gQkFUX0FERFJfTUZSX1RZUEU7CisJcmV0ID0gb2xwY19lY19jbWQoRUNfQkFUX0VFUFJPTSwgJmVjX2J5dGUsIDEsICZlY19ieXRlLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWZyID0gZWNfYnl0ZSA+PiA0OworCisJc3dpdGNoICh0ZWNoLmludHZhbCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTmlNSDoKKwkJc3dpdGNoIChtZnIpIHsKKwkJY2FzZSAxOiAvKiBHb2xkIFBlYWsgKi8KKwkJCXZhbC0+aW50dmFsID0gMzAwMDAwMCouODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xpRmU6CisJCXN3aXRjaCAobWZyKSB7CisJCWNhc2UgMTogLyogR29sZCBQZWFrICovCisJCQl2YWwtPmludHZhbCA9IDI4MDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBCWUQgKi8KKwkJCXZhbC0+aW50dmFsID0gMzEwMDAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9scGNfYmF0X2dldF9jaGFyZ2Vfbm93KHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdWludDhfdCBzb2M7CisJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgZnVsbDsKKwlpbnQgcmV0OworCisJcmV0ID0gb2xwY19lY19jbWQoRUNfQkFUX1NPQywgTlVMTCwgMCwgJnNvYywgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9scGNfYmF0X2dldF9jaGFyZ2VfZnVsbF9kZXNpZ24oJmZ1bGwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2YWwtPmludHZhbCA9IHNvYyAqIChmdWxsLmludHZhbCAvIDEwMCk7CisJcmV0dXJuIDA7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlCYXR0ZXJ5IHByb3BlcnRpZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjcsNiArMzMzLDcgQEAKIAkJCXJldHVybiByZXQ7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKIAkJcmV0ID0gb2xwY19lY19jbWQoRUNfQkFUX1ZPTFRBR0UsIE5VTEwsIDAsICh2b2lkICopJmVjX3dvcmQsIDIpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTI3NCw2ICszNDEsNyBAQAogCQl2YWwtPmludHZhbCA9IChzMTYpYmUxNl90b19jcHUoZWNfd29yZCkgKiA5NzYwTCAvIDMyOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CiAJCXJldCA9IG9scGNfZWNfY21kKEVDX0JBVF9DVVJSRU5ULCBOVUxMLCAwLCAodm9pZCAqKSZlY193b3JkLCAyKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0yOTQsNiArMzYyLDE2IEBACiAJCWVsc2UKIAkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJCXJldCA9IG9scGNfYmF0X2dldF9jaGFyZ2VfZnVsbF9kZXNpZ24odmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJcmV0ID0gb2xwY19iYXRfZ2V0X2NoYXJnZV9ub3codmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKIAkJcmV0ID0gb2xwY19lY19jbWQoRUNfQkFUX1RFTVAsIE5VTEwsIDAsICh2b2lkICopJmVjX3dvcmQsIDIpOwogCQlpZiAocmV0KQpAQCAtMzMxLDE2ICs0MDksMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgb2xwY19iYXRfcHJvcHNbXSA9IHsKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBvbHBjX3hvMV9iYXRfcHJvcHNbXSA9IHsKIAlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCiAJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCiAJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCiAJUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAogCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCkBAIC0zNDgsNiArNDMwLDI3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVIsCiB9OwogCisvKiBYTy0xLjUgZG9lcyBub3QgaGF2ZSBhbWJpZW50IHRlbXBlcmF0dXJlIHByb3BlcnR5ICovCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgb2xwY194bzE1X2JhdF9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVIsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVIsCit9OworCiAvKiBFRVBST00gcmVhZGluZyBnb2VzIGNvbXBsZXRlbHkgYXJvdW5kIHRoZSBwb3dlcl9zdXBwbHkgQVBJLCBzYWRseSAqLwogCiAjZGVmaW5lIEVFUFJPTV9TVEFSVAkweDIwCkBAIC00MTksOCArNTIyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpiYXRfcGRldjsKIAogc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgb2xwY19iYXQgPSB7Ci0JLnByb3BlcnRpZXMgPSBvbHBjX2JhdF9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG9scGNfYmF0X3Byb3BzKSwKIAkuZ2V0X3Byb3BlcnR5ID0gb2xwY19iYXRfZ2V0X3Byb3BlcnR5LAogCS51c2VfZm9yX2FwbSA9IDEsCiB9OwpAQCAtNDY2LDYgKzU2NywxMyBAQAogCQlnb3RvIGFjX2ZhaWxlZDsKIAogCW9scGNfYmF0Lm5hbWUgPSBiYXRfcGRldi0+bmFtZTsKKwlpZiAob2xwY19ib2FyZF9hdF9sZWFzdChvbHBjX2JvYXJkX3ByZSgweGQwKSkpIHsgLyogWE8tMS41ICovCisJCW9scGNfYmF0LnByb3BlcnRpZXMgPSBvbHBjX3hvMTVfYmF0X3Byb3BzOworCQlvbHBjX2JhdC5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUob2xwY194bzE1X2JhdF9wcm9wcyk7CisJfSBlbHNlIHsgLyogWE8tMSAqLworCQlvbHBjX2JhdC5wcm9wZXJ0aWVzID0gb2xwY194bzFfYmF0X3Byb3BzOworCQlvbHBjX2JhdC5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUob2xwY194bzFfYmF0X3Byb3BzKTsKKwl9CiAKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmJhdF9wZGV2LT5kZXYsICZvbHBjX2JhdCk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2NvcmUuYyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2NvcmUuYwppbmRleCA5MTYwNmJiLi45NzBmNzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMKKysrIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jCkBAIC0xOTAsMTAgKzE5MCwxMCBAQAogCWdvdG8gc3VjY2VzczsKIAogY3JlYXRlX3RyaWdnZXJzX2ZhaWxlZDoKLQlkZXZpY2VfdW5yZWdpc3Rlcihwc3ktPmRldik7CisJZGV2aWNlX2RlbChkZXYpOwoga29iamVjdF9zZXRfbmFtZV9mYWlsZWQ6CiBkZXZpY2VfYWRkX2ZhaWxlZDoKLQlrZnJlZShkZXYpOworCXB1dF9kZXZpY2UoZGV2KTsKIHN1Y2Nlc3M6CiAJcmV0dXJuIHJjOwogfQpAQCAtMjAxLDcgKzIwMSw3IEBACiAKIHZvaWQgcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJY2FuY2VsX3dvcmtfc3luYygmcHN5LT5jaGFuZ2VkX3dvcmspOwogCXBvd2VyX3N1cHBseV9yZW1vdmVfdHJpZ2dlcnMocHN5KTsKIAlkZXZpY2VfdW5yZWdpc3Rlcihwc3ktPmRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYwppbmRleCBmZTE2YjQ4Li40MjU1ZjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICoJaVBBUSBoMTkzMC9oMTk0MC9yeDE5NTAgYmF0dGVyeSBjb250cm9sZXIgZHJpdmVyCisgKglpUEFRIGgxOTMwL2gxOTQwL3J4MTk1MCBiYXR0ZXJ5IGNvbnRyb2xsZXIgZHJpdmVyCiAgKglDb3B5cmlnaHQgKGMpIFZhc2lseSBLaG9ydXpoaWNrCiAgKglCYXNlZCBvbiBoMTk0MF9iYXR0ZXJ5LmMgYnkgQXJuYXVkIFBhdGFyZAogICoKQEAgLTExMiw2ICsxMTIsMTMgQEAKIAlyZXR1cm4gdm9sdF92YWwgKyBjdXJfdmFsICogaW1wZWRhbmNlIC8gMTAwMDsKIH0KIAorc3RhdGljIGludCBjaGFyZ2VfZmluaXNoZWQoc3RydWN0IHMzY19hZGNfYmF0ICpiYXQpCit7CisJcmV0dXJuIGJhdC0+cGRhdGEtPmdwaW9faW52ZXJ0ZWQgPworCQkhZ3Bpb19nZXRfdmFsdWUoYmF0LT5wZGF0YS0+Z3Bpb19jaGFyZ2VfZmluaXNoZWQpIDoKKwkJZ3Bpb19nZXRfdmFsdWUoYmF0LT5wZGF0YS0+Z3Bpb19jaGFyZ2VfZmluaXNoZWQpOworfQorCiBzdGF0aWMgaW50IHMzY19hZGNfYmF0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCiAJCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKQEAgLTE0MCw3ICsxNDcsNyBAQAogCiAJaWYgKGJhdC0+Y2FibGVfcGx1Z2dlZCAmJgogCQkoKGJhdC0+cGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkIDwgMCkgfHwKLQkJIWdwaW9fZ2V0X3ZhbHVlKGJhdC0+cGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkKSkpIHsKKwkJIWNoYXJnZV9maW5pc2hlZChiYXQpKSkgewogCQlsdXQgPSBiYXQtPnBkYXRhLT5sdXRfYWNpbjsKIAkJbHV0X3NpemUgPSBiYXQtPnBkYXRhLT5sdXRfYWNpbl9jbnQ7CiAJfQpAQCAtMjM2LDggKzI0Myw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAoKGJhdC0+cGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkID49IDApICYmIGlzX3BsdWdnZWQpIHsKLQkJCWlzX2NoYXJnZWQgPSBncGlvX2dldF92YWx1ZSgKLQkJCQltYWluX2JhdC5wZGF0YS0+Z3Bpb19jaGFyZ2VfZmluaXNoZWQpOworCQkJaXNfY2hhcmdlZCA9IGNoYXJnZV9maW5pc2hlZCgmbWFpbl9iYXQpOwogCQkJaWYgKGlzX2NoYXJnZWQpIHsKIAkJCQlpZiAoYmF0LT5wZGF0YS0+ZGlzYWJsZV9jaGFyZ2VyKQogCQkJCQliYXQtPnBkYXRhLT5kaXNhYmxlX2NoYXJnZXIoKTsKQEAgLTQyNyw1ICs0MzMsNSBAQAogbW9kdWxlX2V4aXQoczNjX2FkY19iYXRfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlZhc2lseSBLaG9ydXpoaWNrIDxhbmFyc291bEBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlQQVEgSDE5MzAvSDE5NDAvUlgxOTUwIGJhdHRlcnkgY29udHJvbGVyIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpUEFRIEgxOTMwL0gxOTQwL1JYMTk1MCBiYXR0ZXJ5IGNvbnRyb2xsZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Rvc2FfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci90b3NhX2JhdHRlcnkuYwppbmRleCBlZTA0OTM2Li41M2YwZDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Rvc2FfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvdG9zYV9iYXR0ZXJ5LmMKQEAgLTMzMiw3ICszMzIsNyBAQAogc3RhdGljIGludCB0b3NhX2JhdF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCS8qIGZsdXNoIGFsbCBwZW5kaW5nIHN0YXR1cyB1cGRhdGVzICovCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlmbHVzaF93b3JrX3N5bmMoJmJhdF93b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDIyLDcgKzQyMiw3IEBACiBlcnJfcHN5X3JlZ19tYWluOgogCiAJLyogc2VlIGNvbW1lbnQgaW4gdG9zYV9iYXRfcmVtb3ZlICovCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfd29ya19zeW5jKCZiYXRfd29yayk7CiAKIAlpLS07CiBlcnJfZ3BpbzoKQEAgLTQ0NSwxMiArNDQ1LDExIEBACiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnRvc2FfYmF0X21haW4ucHN5KTsKIAogCS8qCi0JICogbm93IGZsdXNoIGFsbCBwZW5kaW5nIHdvcmsuCi0JICogd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIHNjaGVkdWxlcywgc2luY2UgYWxsCi0JICogc291cmNlcyAoaXNyIGFuZCBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkKQotCSAqIGFyZSB1bnJlZ2lzdGVyZWQgbm93LgorCSAqIE5vdyBjYW5jZWwgdGhlIGJhdF93b3JrLiAgV2Ugd29uJ3QgZ2V0IGFueSBtb3JlIHNjaGVkdWxlcywKKwkgKiBzaW5jZSBhbGwgc291cmNlcyAoaXNyIGFuZCBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkKSBhcmUKKwkgKiB1bnJlZ2lzdGVyZWQgbm93LgogCSAqLwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJY2FuY2VsX3dvcmtfc3luYygmYmF0X3dvcmspOwogCiAJZm9yIChpID0gQVJSQVlfU0laRShncGlvcykgLSAxOyBpID49IDA7IGktLSkKIAkJZ3Bpb19mcmVlKGdwaW9zW2ldLmdwaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCmluZGV4IDUwNzFkODUuLjE1NjU1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB3bTk3eHhfYmF0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmx1c2hfd29ya19zeW5jKCZiYXRfd29yayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+Y2hhcmdlX2dwaW8pLCBkZXYpOwogCQlncGlvX2ZyZWUocGRhdGEtPmNoYXJnZV9ncGlvKTsKIAl9Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfd29ya19zeW5jKCZiYXRfd29yayk7CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhdF9wcyk7CiAJa2ZyZWUocHJvcCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvejJfYmF0dGVyeS5jCmluZGV4IDg1MDY0YTkuLmU1ZWQ1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvejJfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvejJfYmF0dGVyeS5jCkBAIC0yNTQsNyArMjU0LDcgQEAKIAlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOwogCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfd29ya19zeW5jKCZjaGFyZ2VyLT5iYXRfd29yayk7CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoYXJnZXItPmJhdHRfcHMpOwogCiAJa2ZyZWUoY2hhcmdlci0+YmF0dF9wcy5wcm9wZXJ0aWVzKTsKQEAgLTI3MSw3ICsyNzEsOSBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCB6Ml9iYXR0X3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWZsdXNoX3dvcmtfc3luYygmY2hhcmdlci0+YmF0X3dvcmspOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9LY29uZmlnIGIvZHJpdmVycy9wcHMvS2NvbmZpZwppbmRleCAxYWZlNGUwLi5mMGQzMzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcHBzL0tjb25maWcKQEAgLTMwLDYgKzMwLDE3IEBACiAJICBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZy4gIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgaGF2aW5nIGEKIAkgIHByb2JsZW0gd2l0aCBQUFMgc3VwcG9ydCBhbmQgd2FudCB0byBzZWUgbW9yZSBvZiB3aGF0IGlzIGdvaW5nIG9uLgogCitjb25maWcgTlRQX1BQUworCWJvb2wgIlBQUyBrZXJuZWwgY29uc3VtZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQUyAmJiAhTk9fSFoKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHN1cHBvcnQgZm9yIGRpcmVjdCBpbi1rZXJuZWwgdGltZQorCSAgc3luY3Jvbml6YXRpb24gdXNpbmcgYW4gZXh0ZXJuYWwgUFBTIHNpZ25hbC4KKworCSAgSXQgZG9lc24ndCB3b3JrIG9uIHRpY2tsZXNzIHN5c3RlbXMgYXQgdGhlIG1vbWVudC4KKwogc291cmNlIGRyaXZlcnMvcHBzL2NsaWVudHMvS2NvbmZpZwogCitzb3VyY2UgZHJpdmVycy9wcHMvZ2VuZXJhdG9ycy9LY29uZmlnCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL01ha2VmaWxlIGIvZHJpdmVycy9wcHMvTWFrZWZpbGUKaW5kZXggOTg5NjBkZC4uNDQ4M2VhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wcHMvTWFrZWZpbGUKQEAgLTMsNyArMyw4IEBACiAjCiAKIHBwc19jb3JlLXkJCQk6PSBwcHMubyBrYXBpLm8gc3lzZnMubworcHBzX2NvcmUtJChDT05GSUdfTlRQX1BQUykJKz0ga2Mubwogb2JqLSQoQ09ORklHX1BQUykJCTo9IHBwc19jb3JlLm8KLW9iai15CQkJCSs9IGNsaWVudHMvCitvYmoteQkJCQkrPSBjbGllbnRzLyBnZW5lcmF0b3JzLwogCiBjY2ZsYWdzLSQoQ09ORklHX1BQU19ERUJVRykgOj0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnIGIvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnCmluZGV4IDRlODAxYmQ3Li44NTIwYTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9jbGllbnRzL0tjb25maWcKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9LY29uZmlnCkBAIC0yMiw0ICsyMiwxMSBAQAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGEgUFBTIHNvdXJjZSBjb25uZWN0ZWQKIAkgIHdpdGggdGhlIENEIChDYXJyaWVyIERldGVjdCkgcGluIG9mIHlvdXIgc2VyaWFsIHBvcnQuCiAKK2NvbmZpZyBQUFNfQ0xJRU5UX1BBUlBPUlQKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBQUFMgY2xpZW50IgorCWRlcGVuZHMgb24gUFBTICYmIFBBUlBPUlQKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgYSBQUFMgc291cmNlIGNvbm5lY3RlZAorCSAgd2l0aCB0aGUgaW50ZXJydXB0IHBpbiBvZiB5b3VyIHBhcmFsbGVsIHBvcnQuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9jbGllbnRzL01ha2VmaWxlIGIvZHJpdmVycy9wcHMvY2xpZW50cy9NYWtlZmlsZQppbmRleCA4MTJjOWIxLi40MjUxN2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bwcy9jbGllbnRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcHBzL2NsaWVudHMvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAKIG9iai0kKENPTkZJR19QUFNfQ0xJRU5UX0tUSU1FUikJKz0gcHBzLWt0aW1lci5vCiBvYmotJChDT05GSUdfUFBTX0NMSUVOVF9MRElTQykJKz0gcHBzLWxkaXNjLm8KK29iai0kKENPTkZJR19QUFNfQ0xJRU5UX1BBUlBPUlQpICs9IHBwc19wYXJwb3J0Lm8KIAogaWZlcSAoJChDT05GSUdfUFBTX0RFQlVHKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWt0aW1lci5jIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKaW5kZXggZTdlZjViOC4uMjcyODQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMta3RpbWVyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMSw3ICszMiw3IEBACiAgKiBHbG9iYWwgdmFyaWFibGVzCiAgKi8KIAotc3RhdGljIGludCBzb3VyY2U7CitzdGF0aWMgc3RydWN0IHBwc19kZXZpY2UgKnBwczsKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBrdGltZXI7CiAKIC8qCkBAIC00MCwxOSArNDEsMTQgQEAKIAogc3RhdGljIHZvaWQgcHBzX2t0aW1lcl9ldmVudCh1bnNpZ25lZCBsb25nIHB0cikKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgX190czsKLQlzdHJ1Y3QgcHBzX2t0aW1lIHRzOworCXN0cnVjdCBwcHNfZXZlbnRfdGltZSB0czsKIAogCS8qIEZpcnN0IG9mIGFsbCB3ZSBnZXQgdGhlIHRpbWUgc3RhbXAuLi4gKi8KLQlnZXRuc3RpbWVvZmRheSgmX190cyk7CisJcHBzX2dldF90cygmdHMpOwogCi0JcHJfaW5mbygiUFBTIGV2ZW50IGF0ICVsdVxuIiwgamlmZmllcyk7CisJZGV2X2luZm8ocHBzLT5kZXYsICJQUFMgZXZlbnQgYXQgJWx1XG4iLCBqaWZmaWVzKTsKIAotCS8qIC4uLiBhbmQgdHJhbnNsYXRlIGl0IHRvIFBQUyB0aW1lIGRhdGEgc3RydWN0ICovCi0JdHMuc2VjID0gX190cy50dl9zZWM7Ci0JdHMubnNlYyA9IF9fdHMudHZfbnNlYzsKLQotCXBwc19ldmVudChzb3VyY2UsICZ0cywgUFBTX0NBUFRVUkVBU1NFUlQsIE5VTEwpOworCXBwc19ldmVudChwcHMsICZ0cywgUFBTX0NBUFRVUkVBU1NFUlQsIE5VTEwpOwogCiAJbW9kX3RpbWVyKCZrdGltZXIsIGppZmZpZXMgKyBIWik7CiB9CkBAIC02MSwxMiArNTcsMTEgQEAKICAqIFRoZSBlY2hvIGZ1bmN0aW9uCiAgKi8KIAotc3RhdGljIHZvaWQgcHBzX2t0aW1lcl9lY2hvKGludCBzb3VyY2UsIGludCBldmVudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHBwc19rdGltZXJfZWNobyhzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCiB7Ci0JcHJfaW5mbygiZWNobyAlcyAlcyBmb3Igc291cmNlICVkXG4iLAorCWRldl9pbmZvKHBwcy0+ZGV2LCAiZWNobyAlcyAlc1xuIiwKIAkJZXZlbnQgJiBQUFNfQ0FQVFVSRUFTU0VSVCA/ICJhc3NlcnQiIDogIiIsCi0JCWV2ZW50ICYgUFBTX0NBUFRVUkVDTEVBUiA/ICJjbGVhciIgOiAiIiwKLQkJc291cmNlKTsKKwkJZXZlbnQgJiBQUFNfQ0FQVFVSRUNMRUFSID8gImNsZWFyIiA6ICIiKTsKIH0KIAogLyoKQEAgLTg5LDMwICs4NCwyNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcHBzX2t0aW1lcl9leGl0KHZvaWQpCiB7Ci0JZGVsX3RpbWVyX3N5bmMoJmt0aW1lcik7Ci0JcHBzX3VucmVnaXN0ZXJfc291cmNlKHNvdXJjZSk7CisJZGV2X2luZm8ocHBzLT5kZXYsICJrdGltZXIgUFBTIHNvdXJjZSB1bnJlZ2lzdGVyZWRcbiIpOwogCi0JcHJfaW5mbygia3RpbWVyIFBQUyBzb3VyY2UgdW5yZWdpc3RlcmVkXG4iKTsKKwlkZWxfdGltZXJfc3luYygma3RpbWVyKTsKKwlwcHNfdW5yZWdpc3Rlcl9zb3VyY2UocHBzKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcHBzX2t0aW1lcl9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHBwc19yZWdpc3Rlcl9zb3VyY2UoJnBwc19rdGltZXJfaW5mbywKKwlwcHMgPSBwcHNfcmVnaXN0ZXJfc291cmNlKCZwcHNfa3RpbWVyX2luZm8sCiAJCQkJUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfT0ZGU0VUQVNTRVJUKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWdpc3RlciBrdGltZXIgc291cmNlXG4iKTsKLQkJcmV0dXJuIHJldDsKKwlpZiAocHBzID09IE5VTEwpIHsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgUFBTIHNvdXJjZVxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KLQlzb3VyY2UgPSByZXQ7CiAKIAlzZXR1cF90aW1lcigma3RpbWVyLCBwcHNfa3RpbWVyX2V2ZW50LCAwKTsKIAltb2RfdGltZXIoJmt0aW1lciwgamlmZmllcyArIEhaKTsKIAotCXByX2luZm8oImt0aW1lciBQUFMgc291cmNlIHJlZ2lzdGVyZWQgYXQgJWRcbiIsIHNvdXJjZSk7CisJZGV2X2luZm8ocHBzLT5kZXYsICJrdGltZXIgUFBTIHNvdXJjZSByZWdpc3RlcmVkXG4iKTsKIAotCXJldHVybiAgMDsKKwlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQocHBzX2t0aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWxkaXNjLmMgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwcy1sZGlzYy5jCmluZGV4IDhlMTkzMmQuLjc5NDUxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHBzL2NsaWVudHMvcHBzLWxkaXNjLmMKKysrIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHMtbGRpc2MuYwpAQCAtMTksNiArMTksOCBAQAogICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMjcsMzAgKzI5LDE4IEBACiAjZGVmaW5lIFBQU19UVFlfTUFHSUMJCTB4MDAwMQogCiBzdGF0aWMgdm9pZCBwcHNfdHR5X2RjZF9jaGFuZ2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHN0YXR1cywKLQkJCQlzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJCXN0cnVjdCBwcHNfZXZlbnRfdGltZSAqdHMpCiB7Ci0JaW50IGlkID0gKGxvbmcpdHR5LT5kaXNjX2RhdGE7Ci0Jc3RydWN0IHRpbWVzcGVjIF9fdHM7Ci0Jc3RydWN0IHBwc19rdGltZSBwcHNfdHM7CisJc3RydWN0IHBwc19kZXZpY2UgKnBwcyA9IChzdHJ1Y3QgcHBzX2RldmljZSAqKXR0eS0+ZGlzY19kYXRhOwogCi0JLyogRmlyc3Qgb2YgYWxsIHdlIGdldCB0aGUgdGltZSBzdGFtcC4uLiAqLwotCWdldG5zdGltZW9mZGF5KCZfX3RzKTsKLQotCS8qIERvZXMgY2FsbGVyIGdpdmUgdXMgYSB0aW1lc3RhbXA/ICovCi0JaWYgKHRzKSB7CS8qIFllcy4gTGV0J3MgdXNlIGl0ISAqLwotCQlwcHNfdHMuc2VjID0gdHMtPnR2X3NlYzsKLQkJcHBzX3RzLm5zZWMgPSB0cy0+dHZfbnNlYzsKLQl9IGVsc2UgewkvKiBOby4gRG8gaXQgb3Vyc2VsZiEgKi8KLQkJcHBzX3RzLnNlYyA9IF9fdHMudHZfc2VjOwotCQlwcHNfdHMubnNlYyA9IF9fdHMudHZfbnNlYzsKLQl9CisJQlVHX09OKHBwcyA9PSBOVUxMKTsKIAogCS8qIE5vdyBkbyB0aGUgUFBTIGV2ZW50IHJlcG9ydCAqLwotCXBwc19ldmVudChpZCwgJnBwc190cywgc3RhdHVzID8gUFBTX0NBUFRVUkVBU1NFUlQgOiBQUFNfQ0FQVFVSRUNMRUFSLAotCQkJTlVMTCk7CisJcHBzX2V2ZW50KHBwcywgdHMsIHN0YXR1cyA/IFBQU19DQVBUVVJFQVNTRVJUIDoKKwkJCVBQU19DQVBUVVJFQ0xFQVIsIE5VTEwpOwogCi0JcHJfZGVidWcoIlBQUyAlcyBhdCAlbHUgb24gc291cmNlICMlZFxuIiwKLQkJCXN0YXR1cyA/ICJhc3NlcnQiIDogImNsZWFyIiwgamlmZmllcywgaWQpOworCWRldl9kYmcocHBzLT5kZXYsICJQUFMgJXMgYXQgJWx1XG4iLAorCQkJc3RhdHVzID8gImFzc2VydCIgOiAiY2xlYXIiLCBqaWZmaWVzKTsKIH0KIAogc3RhdGljIGludCAoKmFsaWFzX25fdHR5X29wZW4pKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNjAsNiArNTAsNyBAQAogCXN0cnVjdCBwcHNfc291cmNlX2luZm8gaW5mbzsKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJ2ID0gdHR5LT5kcml2ZXI7CiAJaW50IGluZGV4ID0gdHR5LT5pbmRleCArIGRydi0+bmFtZV9iYXNlOworCXN0cnVjdCBwcHNfZGV2aWNlICpwcHM7CiAJaW50IHJldDsKIAogCWluZm8ub3duZXIgPSBUSElTX01PRFVMRTsKQEAgLTcwLDM0ICs2MSw0MiBAQAogCQkJUFBTX09GRlNFVEFTU0VSVCB8IFBQU19PRkZTRVRDTEVBUiB8IFwKIAkJCVBQU19DQU5XQUlUIHwgUFBTX1RTRk1UX1RTUEVDOwogCi0JcmV0ID0gcHBzX3JlZ2lzdGVyX3NvdXJjZSgmaW5mbywgUFBTX0NBUFRVUkVCT1RIIHwgXAorCXBwcyA9IHBwc19yZWdpc3Rlcl9zb3VyY2UoJmluZm8sIFBQU19DQVBUVVJFQk9USCB8IFwKIAkJCQlQUFNfT0ZGU0VUQVNTRVJUIHwgUFBTX09GRlNFVENMRUFSKTsKLQlpZiAocmV0IDwgMCkgeworCWlmIChwcHMgPT0gTlVMTCkgewogCQlwcl9lcnIoImNhbm5vdCByZWdpc3RlciBQUFMgc291cmNlIFwiJXNcIlxuIiwgaW5mby5wYXRoKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXR0eS0+ZGlzY19kYXRhID0gKHZvaWQgKikobG9uZylyZXQ7CisJdHR5LT5kaXNjX2RhdGEgPSBwcHM7CiAKIAkvKiBTaG91bGQgb3BlbiBOX1RUWSBsZGlzYyB0b28gKi8KIAlyZXQgPSBhbGlhc19uX3R0eV9vcGVuKHR0eSk7Ci0JaWYgKHJldCA8IDApCi0JCXBwc191bnJlZ2lzdGVyX3NvdXJjZSgobG9uZyl0dHktPmRpc2NfZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJjYW5ub3Qgb3BlbiB0dHkgbGRpc2MgXCIlc1wiXG4iLCBpbmZvLnBhdGgpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCX0KIAotCXByX2luZm8oIlBQUyBzb3VyY2UgIyVkIFwiJXNcIiBhZGRlZFxuIiwgcmV0LCBpbmZvLnBhdGgpOworCWRldl9pbmZvKHBwcy0+ZGV2LCAic291cmNlIFwiJXNcIiBhZGRlZFxuIiwgaW5mby5wYXRoKTsKIAogCXJldHVybiAwOworCitlcnJfdW5yZWdpc3RlcjoKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJcHBzX3VucmVnaXN0ZXJfc291cmNlKHBwcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgKCphbGlhc19uX3R0eV9jbG9zZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKIHN0YXRpYyB2b2lkIHBwc190dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpbnQgaWQgPSAobG9uZyl0dHktPmRpc2NfZGF0YTsKKwlzdHJ1Y3QgcHBzX2RldmljZSAqcHBzID0gKHN0cnVjdCBwcHNfZGV2aWNlICopdHR5LT5kaXNjX2RhdGE7CiAKLQlwcHNfdW5yZWdpc3Rlcl9zb3VyY2UoaWQpOwogCWFsaWFzX25fdHR5X2Nsb3NlKHR0eSk7CiAKLQlwcl9pbmZvKCJQUFMgc291cmNlICMlZCByZW1vdmVkXG4iLCBpZCk7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCWRldl9pbmZvKHBwcy0+ZGV2LCAicmVtb3ZlZFxuIik7CisJcHBzX3VucmVnaXN0ZXJfc291cmNlKHBwcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjX29wcyBwcHNfbGRpc2Nfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wcHMvY2xpZW50cy9wcHNfcGFycG9ydC5jIGIvZHJpdmVycy9wcHMvY2xpZW50cy9wcHNfcGFycG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjIxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bwcy9jbGllbnRzL3Bwc19wYXJwb3J0LmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBwcHNfcGFycG9ydC5jIC0tIGtlcm5lbCBwYXJhbGxlbCBwb3J0IFBQUyBjbGllbnQKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICAgQWxleGFuZGVyIEdvcmRlZXYgPGxhc2FpbmVAbHZrLmNzLm1zdS5zdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKy8qCisgKiBUT0RPOgorICogaW1wbGVtZW50IGVjaG8gb3ZlciBTRUwgcGluCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycW5yLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHNfa2VybmVsLmg+CisKKyNkZWZpbmUgRFJWREVTQyAicGFyYWxsZWwgcG9ydCBQUFMgY2xpZW50IgorCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworCisjZGVmaW5lIENMRUFSX1dBSVRfTUFYCQkxMDAKKyNkZWZpbmUgQ0xFQVJfV0FJVF9NQVhfRVJST1JTCTUKKworc3RhdGljIHVuc2lnbmVkIGludCBjbGVhcl93YWl0ID0gMTAwOworTU9EVUxFX1BBUk1fREVTQyhjbGVhcl93YWl0LAorCSJNYXhpbXVtIG51bWJlciBvZiBwb3J0IHJlYWRzIHdoZW4gcG9sbGluZyBmb3Igc2lnbmFsIGNsZWFyLCIKKwkiIHplcm8gdHVybnMgY2xlYXIgZWRnZSBjYXB0dXJlIG9mZiBlbnRpcmVseSIpOworbW9kdWxlX3BhcmFtKGNsZWFyX3dhaXQsIHVpbnQsIDApOworCisKKy8qIGludGVybmFsIHBlciBwb3J0IHN0cnVjdHVyZSAqLworc3RydWN0IHBwc19jbGllbnRfcHAgeworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsJLyogcGFycG9ydCBkZXZpY2UgKi8KKwlzdHJ1Y3QgcHBzX2RldmljZSAqcHBzOwkJLyogUFBTIGRldmljZSAqLworCXVuc2lnbmVkIGludCBjdzsJCS8qIHBvcnQgY2xlYXIgdGltZW91dCAqLworCXVuc2lnbmVkIGludCBjd19lcnI7CQkvKiBudW1iZXIgb2YgdGltZW91dHMgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9pc19zZXQoc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJcmV0dXJuIChwb3J0LT5vcHMtPnJlYWRfc3RhdHVzKHBvcnQpICYgUEFSUE9SVF9TVEFUVVNfQUNLKSAhPSAwOworfQorCisvKiBwYXJwb3J0IGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBwYXJwb3J0X2lycSh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IHBwc19ldmVudF90aW1lIHRzX2Fzc2VydCwgdHNfY2xlYXI7CisJc3RydWN0IHBwc19jbGllbnRfcHAgKmRldiA9IGhhbmRsZTsKKwlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGRldi0+cGFyZGV2LT5wb3J0OworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBmaXJzdCBvZiBhbGwgd2UgZ2V0IHRoZSB0aW1lIHN0YW1wLi4uICovCisJcHBzX2dldF90cygmdHNfYXNzZXJ0KTsKKworCWlmIChkZXYtPmN3ID09IDApCisJCS8qIGNsZWFyIGVkZ2UgY2FwdHVyZSBkaXNhYmxlZCAqLworCQlnb3RvIG91dF9hc3NlcnQ7CisKKwkvKiB0cnkgY2FwdHVyZSB0aGUgY2xlYXIgZWRnZSAqLworCisJLyogV2UgaGF2ZSB0byBkaXNhYmxlIGludGVycnVwdHMgaGVyZS4gVGhlIGlkZWEgaXMgdG8gcHJldmVudAorCSAqIG90aGVyIGludGVycnVwdHMgb24gdGhlIHNhbWUgcHJvY2Vzc29yIHRvIGludHJvZHVjZSByYW5kb20KKwkgKiBsYWdzIHdoaWxlIHBvbGxpbmcgdGhlIHBvcnQuIFJlYWRpbmcgZnJvbSBJTyBwb3J0IGlzIGtub3duCisJICogdG8gdGFrZSBhcHByb3hpbWF0ZWx5IDF1cyB3aGlsZSBvdGhlciBpbnRlcnJ1cHQgaGFuZGxlcnMgY2FuCisJICogdGFrZSBtdWNoIG1vcmUgcG90ZW50aWFsbHkuCisJICoKKwkgKiBJbnRlcnJ1cHRzIHdvbid0IGJlIGRpc2FibGVkIGZvciBhIGxvbmcgdGltZSBiZWNhdXNlIHRoZQorCSAqIG51bWJlciBvZiBwb2xscyBpcyBsaW1pdGVkIGJ5IGNsZWFyX3dhaXQgcGFyYW1ldGVyIHdoaWNoIGlzCisJICoga2VwdCByYXRoZXIgbG93LiBTbyBpdCBzaG91bGQgbmV2ZXIgYmUgYW4gaXNzdWUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIGNoZWNrIHRoZSBzaWduYWwgKG5vIHNpZ25hbCBtZWFucyB0aGUgcHVsc2UgaXMgbG9zdCB0aGlzIHRpbWUpICovCisJaWYgKCFzaWduYWxfaXNfc2V0KHBvcnQpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJZGV2X2VycihkZXYtPnBwcy0+ZGV2LCAibG9zdCB0aGUgc2lnbmFsXG4iKTsKKwkJZ290byBvdXRfYXNzZXJ0OworCX0KKworCS8qIHBvbGwgdGhlIHBvcnQgdW50aWwgdGhlIHNpZ25hbCBpcyB1bnNldCAqLworCWZvciAoaSA9IGRldi0+Y3c7IGk7IGktLSkKKwkJaWYgKCFzaWduYWxfaXNfc2V0KHBvcnQpKSB7CisJCQlwcHNfZ2V0X3RzKCZ0c19jbGVhcik7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlkZXYtPmN3X2VyciA9IDA7CisJCQlnb3RvIG91dF9ib3RoOworCQl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogdGltZW91dCAqLworCWRldi0+Y3dfZXJyKys7CisJaWYgKGRldi0+Y3dfZXJyID49IENMRUFSX1dBSVRfTUFYX0VSUk9SUykgeworCQlkZXZfZXJyKGRldi0+cHBzLT5kZXYsICJkaXNhYmxlZCBjbGVhciBlZGdlIGNhcHR1cmUgYWZ0ZXIgJWQiCisJCQkJIiB0aW1lb3V0c1xuIiwgZGV2LT5jd19lcnIpOworCQlkZXYtPmN3ID0gMDsKKwkJZGV2LT5jd19lcnIgPSAwOworCX0KKworb3V0X2Fzc2VydDoKKwkvKiBmaXJlIGFzc2VydCBldmVudCAqLworCXBwc19ldmVudChkZXYtPnBwcywgJnRzX2Fzc2VydCwKKwkJCVBQU19DQVBUVVJFQVNTRVJULCBOVUxMKTsKKwlyZXR1cm47CisKK291dF9ib3RoOgorCS8qIGZpcmUgYXNzZXJ0IGV2ZW50ICovCisJcHBzX2V2ZW50KGRldi0+cHBzLCAmdHNfYXNzZXJ0LAorCQkJUFBTX0NBUFRVUkVBU1NFUlQsIE5VTEwpOworCS8qIGZpcmUgY2xlYXIgZXZlbnQgKi8KKwlwcHNfZXZlbnQoZGV2LT5wcHMsICZ0c19jbGVhciwKKwkJCVBQU19DQVBUVVJFQ0xFQVIsIE5VTEwpOworCXJldHVybjsKK30KKworLyogdGhlIFBQUyBlY2hvIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBwcHNfZWNobyhzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJZGV2X2luZm8ocHBzLT5kZXYsICJlY2hvICVzICVzXG4iLAorCQlldmVudCAmIFBQU19DQVBUVVJFQVNTRVJUID8gImFzc2VydCIgOiAiIiwKKwkJZXZlbnQgJiBQUFNfQ0FQVFVSRUNMRUFSID8gImNsZWFyIiA6ICIiKTsKK30KKworc3RhdGljIHZvaWQgcGFycG9ydF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnBvcnQpCit7CisJc3RydWN0IHBwc19jbGllbnRfcHAgKmRldmljZTsKKwlzdHJ1Y3QgcHBzX3NvdXJjZV9pbmZvIGluZm8gPSB7CisJCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAorCQkucGF0aAkJPSAiIiwKKwkJLm1vZGUJCT0gUFBTX0NBUFRVUkVCT1RIIHwgXAorCQkJCSAgUFBTX09GRlNFVEFTU0VSVCB8IFBQU19PRkZTRVRDTEVBUiB8IFwKKwkJCQkgIFBQU19FQ0hPQVNTRVJUIHwgUFBTX0VDSE9DTEVBUiB8IFwKKwkJCQkgIFBQU19DQU5XQUlUIHwgUFBTX1RTRk1UX1RTUEVDLAorCQkuZWNobwkJPSBwcHNfZWNobywKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkuZGV2CQk9IE5VTEwKKwl9OworCisJZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBwc19jbGllbnRfcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldmljZSkgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCwgbm90IGF0dGFjaGluZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXZpY2UtPnBhcmRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsIEtCVUlMRF9NT0ROQU1FLAorCQkJTlVMTCwgTlVMTCwgcGFycG9ydF9pcnEsIDAsIGRldmljZSk7CisJaWYgKCFkZXZpY2UtPnBhcmRldikgeworCQlwcl9lcnIoImNvdWxkbid0IHJlZ2lzdGVyIHdpdGggJXNcbiIsIHBvcnQtPm5hbWUpOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWlmIChwYXJwb3J0X2NsYWltX29yX2Jsb2NrKGRldmljZS0+cGFyZGV2KSA8IDApIHsKKwkJcHJfZXJyKCJjb3VsZG4ndCBjbGFpbSAlc1xuIiwgcG9ydC0+bmFtZSk7CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZGV2OworCX0KKworCWRldmljZS0+cHBzID0gcHBzX3JlZ2lzdGVyX3NvdXJjZSgmaW5mbywKKwkJCVBQU19DQVBUVVJFQk9USCB8IFBQU19PRkZTRVRBU1NFUlQgfCBQUFNfT0ZGU0VUQ0xFQVIpOworCWlmIChkZXZpY2UtPnBwcyA9PSBOVUxMKSB7CisJCXByX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgUFBTIHNvdXJjZVxuIik7CisJCWdvdG8gZXJyX3JlbGVhc2VfZGV2OworCX0KKworCWRldmljZS0+Y3cgPSBjbGVhcl93YWl0OworCisJcG9ydC0+b3BzLT5lbmFibGVfaXJxKHBvcnQpOworCisJcHJfaW5mbygiYXR0YWNoZWQgdG8gJXNcbiIsIHBvcnQtPm5hbWUpOworCisJcmV0dXJuOworCitlcnJfcmVsZWFzZV9kZXY6CisJcGFycG9ydF9yZWxlYXNlKGRldmljZS0+cGFyZGV2KTsKK2Vycl91bnJlZ2lzdGVyX2RldjoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGRldmljZS0+cGFyZGV2KTsKK2Vycl9mcmVlOgorCWtmcmVlKGRldmljZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnBvcnRfZGV0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldiA9IHBvcnQtPmNhZDsKKwlzdHJ1Y3QgcHBzX2NsaWVudF9wcCAqZGV2aWNlOworCisJLyogRklYTUU6IG9vb2gsIHRoaXMgaXMgdWdseSEgKi8KKwlpZiAoc3RyY21wKHBhcmRldi0+bmFtZSwgS0JVSUxEX01PRE5BTUUpKQorCQkvKiBub3Qgb3VyIHBvcnQgKi8KKwkJcmV0dXJuOworCisJZGV2aWNlID0gcGFyZGV2LT5wcml2YXRlOworCisJcG9ydC0+b3BzLT5kaXNhYmxlX2lycShwb3J0KTsKKwlwcHNfdW5yZWdpc3Rlcl9zb3VyY2UoZGV2aWNlLT5wcHMpOworCXBhcnBvcnRfcmVsZWFzZShwYXJkZXYpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocGFyZGV2KTsKKwlrZnJlZShkZXZpY2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwc19wYXJwb3J0X2RyaXZlciA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS5hdHRhY2ggPSBwYXJwb3J0X2F0dGFjaCwKKwkuZGV0YWNoID0gcGFycG9ydF9kZXRhY2gsCit9OworCisvKiBtb2R1bGUgc3RhZmYgKi8KKworc3RhdGljIGludCBfX2luaXQgcHBzX3BhcnBvcnRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcl9pbmZvKERSVkRFU0MgIlxuIik7CisKKwlpZiAoY2xlYXJfd2FpdCA+IENMRUFSX1dBSVRfTUFYKSB7CisJCXByX2VycigiY2xlYXJfd2FpdCB2YWx1ZSBzaG91bGQgYmUgbm90IGdyZWF0ZXIiCisJCQkJIiB0aGVuICVkXG4iLCBDTEVBUl9XQUlUX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZwcHNfcGFycG9ydF9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBwYXJwb3J0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcHNfcGFycG9ydF9leGl0KHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcHBzX3BhcnBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocHBzX3BhcnBvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChwcHNfcGFycG9ydF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIEdvcmRlZXYgPGxhc2FpbmVAbHZrLmNzLm1zdS5zdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTihEUlZERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2dlbmVyYXRvcnMvS2NvbmZpZyBiL2RyaXZlcnMvcHBzL2dlbmVyYXRvcnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E3M2RkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wcHMvZ2VuZXJhdG9ycy9LY29uZmlnCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgUFBTIGdlbmVyYXRvcnMgY29uZmlndXJhdGlvbgorIworCitjb21tZW50ICJQUFMgZ2VuZXJhdG9ycyBzdXBwb3J0IgorCitjb25maWcgUFBTX0dFTkVSQVRPUl9QQVJQT1JUCisJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgUFBTIHNpZ25hbCBnZW5lcmF0b3IiCisJZGVwZW5kcyBvbiBQQVJQT1JUCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGEgUFBTIHNpZ25hbCBnZW5lcmF0b3Igd2hpY2gKKwkgIHV0aWxpemVzIFNUUk9CRSBwaW4gb2YgYSBwYXJhbGxlbCBwb3J0IHRvIHNlbmQgUFBTIHNpZ25hbHMuIEl0IHVzZXMKKwkgIHBhcnBvcnQgYWJzdHJhY3Rpb24gbGF5ZXIgYW5kIGhydGltZXJzIHRvIHByZWNpc2VseSBjb250cm9sIHRoZSBzaWduYWwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9nZW5lcmF0b3JzL01ha2VmaWxlIGIvZHJpdmVycy9wcHMvZ2VuZXJhdG9ycy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDMzMDRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHBzL2dlbmVyYXRvcnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciBQUFMgZ2VuZXJhdG9ycy4KKyMKKworb2JqLSQoQ09ORklHX1BQU19HRU5FUkFUT1JfUEFSUE9SVCkgKz0gcHBzX2dlbl9wYXJwb3J0Lm8KKworaWZlcSAoJChDT05GSUdfUFBTX0RFQlVHKSx5KQorRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9nZW5lcmF0b3JzL3Bwc19nZW5fcGFycG9ydC5jIGIvZHJpdmVycy9wcHMvZ2VuZXJhdG9ycy9wcHNfZ2VuX3BhcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMyZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wcHMvZ2VuZXJhdG9ycy9wcHNfZ2VuX3BhcnBvcnQuYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIHBwc19nZW5fcGFycG9ydC5jIC0tIGtlcm5lbCBwYXJhbGxlbCBwb3J0IFBQUyBzaWduYWwgZ2VuZXJhdG9yCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgIEFsZXhhbmRlciBHb3JkZWV2IDxsYXNhaW5lQGx2ay5jcy5tc3Uuc3U+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisvKgorICogVE9ETzoKKyAqIGZpeCBpc3N1ZXMgd2hlbiByZWFsdGltZSBjbG9jayBpcyBhZGp1c3RlZCBpbiBhIGxlYXAKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisKKyNkZWZpbmUgRFJWREVTQyAicGFyYWxsZWwgcG9ydCBQUFMgc2lnbmFsIGdlbmVyYXRvciIKKworI2RlZmluZSBTSUdOQUwJCTAKKyNkZWZpbmUgTk9fU0lHTkFMCVBBUlBPUlRfQ09OVFJPTF9TVFJPQkUKKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBTRU5EX0RFTEFZX01BWAkJMTAwMDAwCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VuZF9kZWxheSA9IDMwMDAwOworTU9EVUxFX1BBUk1fREVTQyhkZWxheSwKKwkiRGVsYXkgYmV0d2VlbiBzZXR0aW5nIGFuZCBkcm9wcGluZyB0aGUgc2lnbmFsIChucykiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWxheSwgc2VuZF9kZWxheSwgdWludCwgMCk7CisKKworI2RlZmluZSBTQUZFVFlfSU5URVJWQUwJMzAwMAkvKiBzZXQgdGhlIGhydGltZXIgZWFybGllciBmb3Igc2FmZXR5IChucykgKi8KKworLyogaW50ZXJuYWwgcGVyIHBvcnQgc3RydWN0dXJlICovCitzdHJ1Y3QgcHBzX2dlbmVyYXRvcl9wcCB7CisJc3RydWN0IHBhcmRldmljZSAqcGFyZGV2OwkvKiBwYXJwb3J0IGRldmljZSAqLworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCWxvbmcgcG9ydF93cml0ZV90aW1lOwkJLyogY2FsaWJyYXRlZCBwb3J0IHdyaXRlIHRpbWUgKG5zKSAqLworfTsKKworc3RhdGljIHN0cnVjdCBwcHNfZ2VuZXJhdG9yX3BwIGRldmljZSA9IHsKKwkucGFyZGV2ID0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgYXR0YWNoZWQ7CisKKy8qIGNhbGlicmF0ZWQgdGltZSBiZXR3ZWVuIGEgaHJ0aW1lciBldmVudCBhbmQgdGhlIHJlYWN0aW9uICovCitzdGF0aWMgbG9uZyBocnRpbWVyX2Vycm9yID0gU0FGRVRZX0lOVEVSVkFMOworCisvKiB0aGUga2VybmVsIGhydGltZXIgZXZlbnQgKi8KK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBocnRpbWVyX2V2ZW50KHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgZXhwaXJlX3RpbWUsIHRzMSwgdHMyLCB0czMsIGR0czsKKwlzdHJ1Y3QgcHBzX2dlbmVyYXRvcl9wcCAqZGV2OworCXN0cnVjdCBwYXJwb3J0ICpwb3J0OworCWxvbmcgbGltLCBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UgaGF2ZSB0byBkaXNhYmxlIGludGVycnVwdHMgaGVyZS4gVGhlIGlkZWEgaXMgdG8gcHJldmVudAorCSAqIG90aGVyIGludGVycnVwdHMgb24gdGhlIHNhbWUgcHJvY2Vzc29yIHRvIGludHJvZHVjZSByYW5kb20KKwkgKiBsYWdzIHdoaWxlIHBvbGxpbmcgdGhlIGNsb2NrLiBnZXRuc3RpbWVvZmRheSgpIHRha2VzIDwxdXMgb24KKwkgKiBtb3N0IG1hY2hpbmVzIHdoaWxlIG90aGVyIGludGVycnVwdCBoYW5kbGVycyBjYW4gdGFrZSBtdWNoCisJICogbW9yZSBwb3RlbnRpYWxseS4KKwkgKgorCSAqIE5COiBhcHByb3ggdGltZSB3aXRoIGJsb2NrZWQgaW50ZXJydXB0cyA9CisJICogc2VuZF9kZWxheSArIDMgKiBTQUZFVFlfSU5URVJWQUwKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBmaXJzdCBvZiBhbGwgd2UgZ2V0IHRoZSB0aW1lIHN0YW1wLi4uICovCisJZ2V0bnN0aW1lb2ZkYXkoJnRzMSk7CisJZXhwaXJlX3RpbWUgPSBrdGltZV90b190aW1lc3BlYyhocnRpbWVyX2dldF9zb2Z0ZXhwaXJlcyh0aW1lcikpOworCWRldiA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHBwc19nZW5lcmF0b3JfcHAsIHRpbWVyKTsKKwlsaW0gPSBOU0VDX1BFUl9TRUMgLSBzZW5kX2RlbGF5IC0gZGV2LT5wb3J0X3dyaXRlX3RpbWU7CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgbGF0ZSAqLworCWlmIChleHBpcmVfdGltZS50dl9zZWMgIT0gdHMxLnR2X3NlYyB8fCB0czEudHZfbnNlYyA+IGxpbSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXByX2Vycigid2UgYXJlIGxhdGUgdGhpcyB0aW1lICVsZC4lMDlsZFxuIiwKKwkJCQl0czEudHZfc2VjLCB0czEudHZfbnNlYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBidXN5IGxvb3AgdW50aWwgdGhlIHRpbWUgaXMgcmlnaHQgZm9yIGFuIGFzc2VydCBlZGdlICovCisJZG8geworCQlnZXRuc3RpbWVvZmRheSgmdHMyKTsKKwl9IHdoaWxlIChleHBpcmVfdGltZS50dl9zZWMgPT0gdHMyLnR2X3NlYyAmJiB0czIudHZfbnNlYyA8IGxpbSk7CisKKwkvKiBzZXQgdGhlIHNpZ25hbCAqLworCXBvcnQgPSBkZXYtPnBhcmRldi0+cG9ydDsKKwlwb3J0LT5vcHMtPndyaXRlX2NvbnRyb2wocG9ydCwgU0lHTkFMKTsKKworCS8qIGJ1c3kgbG9vcCB1bnRpbCB0aGUgdGltZSBpcyByaWdodCBmb3IgYSBjbGVhciBlZGdlICovCisJbGltID0gTlNFQ19QRVJfU0VDIC0gZGV2LT5wb3J0X3dyaXRlX3RpbWU7CisJZG8geworCQlnZXRuc3RpbWVvZmRheSgmdHMyKTsKKwl9IHdoaWxlIChleHBpcmVfdGltZS50dl9zZWMgPT0gdHMyLnR2X3NlYyAmJiB0czIudHZfbnNlYyA8IGxpbSk7CisKKwkvKiB1bnNldCB0aGUgc2lnbmFsICovCisJcG9ydC0+b3BzLT53cml0ZV9jb250cm9sKHBvcnQsIE5PX1NJR05BTCk7CisKKwlnZXRuc3RpbWVvZmRheSgmdHMzKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIHVwZGF0ZSBjYWxpYnJhdGVkIHBvcnQgd3JpdGUgdGltZSAqLworCWR0cyA9IHRpbWVzcGVjX3N1Yih0czMsIHRzMik7CisJZGV2LT5wb3J0X3dyaXRlX3RpbWUgPQorCQkoZGV2LT5wb3J0X3dyaXRlX3RpbWUgKyB0aW1lc3BlY190b19ucygmZHRzKSkgPj4gMTsKKworZG9uZToKKwkvKiB1cGRhdGUgY2FsaWJyYXRlZCBocnRpbWVyIGVycm9yICovCisJZHRzID0gdGltZXNwZWNfc3ViKHRzMSwgZXhwaXJlX3RpbWUpOworCWRlbHRhID0gdGltZXNwZWNfdG9fbnMoJmR0cyk7CisJLyogSWYgdGhlIG5ldyBlcnJvciB2YWx1ZSBpcyBiaWdnZXIgdGhlbiB0aGUgb2xkLCB1c2UgdGhlIG5ldworCSAqIHZhbHVlLCBpZiBub3QgdGhlbiBzbG93bHkgbW92ZSB0b3dhcmRzIHRoZSBuZXcgdmFsdWUuIFRoaXMKKwkgKiB3YXkgaXQgc2hvdWxkIGJlIHNhZmUgaW4gYmFkIGNvbmRpdGlvbnMgYW5kIGVmZmljaWVudCBpbgorCSAqIGdvb2QgY29uZGl0aW9ucy4KKwkgKi8KKwlpZiAoZGVsdGEgPj0gaHJ0aW1lcl9lcnJvcikKKwkJaHJ0aW1lcl9lcnJvciA9IGRlbHRhOworCWVsc2UKKwkJaHJ0aW1lcl9lcnJvciA9ICgzICogaHJ0aW1lcl9lcnJvciArIGRlbHRhKSA+PiAyOworCisJLyogdXBkYXRlIHRoZSBocnRpbWVyIGV4cGlyZSB0aW1lICovCisJaHJ0aW1lcl9zZXRfZXhwaXJlcyh0aW1lciwKKwkJCWt0aW1lX3NldChleHBpcmVfdGltZS50dl9zZWMgKyAxLAorCQkJCU5TRUNfUEVSX1NFQyAtIChzZW5kX2RlbGF5ICsKKwkJCQlkZXYtPnBvcnRfd3JpdGVfdGltZSArIFNBRkVUWV9JTlRFUlZBTCArCisJCQkJMiAqIGhydGltZXJfZXJyb3IpKSk7CisKKwlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOworfQorCisvKiBjYWxpYnJhdGUgcG9ydCB3cml0ZSB0aW1lICovCisjZGVmaW5lIFBPUlRfTlRFU1RTX1NISUZUCTUKK3N0YXRpYyB2b2lkIGNhbGlicmF0ZV9wb3J0KHN0cnVjdCBwcHNfZ2VuZXJhdG9yX3BwICpkZXYpCit7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPSBkZXYtPnBhcmRldi0+cG9ydDsKKwlpbnQgaTsKKwlsb25nIGFjYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgUE9SVF9OVEVTVFNfU0hJRlQpOyBpKyspIHsKKwkJc3RydWN0IHRpbWVzcGVjIGEsIGI7CisJCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJCWxvY2FsX2lycV9zYXZlKGlycV9mbGFncyk7CisJCWdldG5zdGltZW9mZGF5KCZhKTsKKwkJcG9ydC0+b3BzLT53cml0ZV9jb250cm9sKHBvcnQsIE5PX1NJR05BTCk7CisJCWdldG5zdGltZW9mZGF5KCZiKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2ZsYWdzKTsKKworCQliID0gdGltZXNwZWNfc3ViKGIsIGEpOworCQlhY2MgKz0gdGltZXNwZWNfdG9fbnMoJmIpOworCX0KKworCWRldi0+cG9ydF93cml0ZV90aW1lID0gYWNjID4+IFBPUlRfTlRFU1RTX1NISUZUOworCXByX2luZm8oInBvcnQgd3JpdGUgdGFrZXMgJWxkbnNcbiIsIGRldi0+cG9ydF93cml0ZV90aW1lKTsKK30KKworc3RhdGljIGlubGluZSBrdGltZV90IG5leHRfaW50cl90aW1lKHN0cnVjdCBwcHNfZ2VuZXJhdG9yX3BwICpkZXYpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJZ2V0bnN0aW1lb2ZkYXkoJnRzKTsKKworCXJldHVybiBrdGltZV9zZXQodHMudHZfc2VjICsKKwkJCSgodHMudHZfbnNlYyA+IDk5MCAqIE5TRUNfUEVSX01TRUMpID8gMSA6IDApLAorCQkJTlNFQ19QRVJfU0VDIC0gKHNlbmRfZGVsYXkgKworCQkJZGV2LT5wb3J0X3dyaXRlX3RpbWUgKyAzICogU0FGRVRZX0lOVEVSVkFMKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnBvcnRfYXR0YWNoKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCWlmIChhdHRhY2hlZCkgeworCQkvKiB3ZSBhbHJlYWR5IGhhdmUgYSBwb3J0ICovCisJCXJldHVybjsKKwl9CisKKwlkZXZpY2UucGFyZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgS0JVSUxEX01PRE5BTUUsCisJCQlOVUxMLCBOVUxMLCBOVUxMLCAwLCAmZGV2aWNlKTsKKwlpZiAoIWRldmljZS5wYXJkZXYpIHsKKwkJcHJfZXJyKCJjb3VsZG4ndCByZWdpc3RlciB3aXRoICVzXG4iLCBwb3J0LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwYXJwb3J0X2NsYWltX29yX2Jsb2NrKGRldmljZS5wYXJkZXYpIDwgMCkgeworCQlwcl9lcnIoImNvdWxkbid0IGNsYWltICVzXG4iLCBwb3J0LT5uYW1lKTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXY7CisJfQorCisJcHJfaW5mbygiYXR0YWNoZWQgdG8gJXNcbiIsIHBvcnQtPm5hbWUpOworCWF0dGFjaGVkID0gMTsKKworCWNhbGlicmF0ZV9wb3J0KCZkZXZpY2UpOworCisJaHJ0aW1lcl9pbml0KCZkZXZpY2UudGltZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX01PREVfQUJTKTsKKwlkZXZpY2UudGltZXIuZnVuY3Rpb24gPSBocnRpbWVyX2V2ZW50OworI2lmZGVmIENPTkZJR19QUkVFTVBUX1JUCisJLyogaHJ0aW1lciBpbnRlcnJ1cHQgd2lsbCBydW4gaW4gdGhlIGludGVycnVwdCBjb250ZXh0IHdpdGggdGhpcyAqLworCWRldmljZS50aW1lci5pcnFzYWZlID0gMTsKKyNlbmRpZgorCisJaHJ0aW1lcl9zdGFydCgmZGV2aWNlLnRpbWVyLCBuZXh0X2ludHJfdGltZSgmZGV2aWNlKSwgSFJUSU1FUl9NT0RFX0FCUyk7CisKKwlyZXR1cm47CisKK2Vycl91bnJlZ2lzdGVyX2RldjoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGRldmljZS5wYXJkZXYpOworfQorCitzdGF0aWMgdm9pZCBwYXJwb3J0X2RldGFjaChzdHJ1Y3QgcGFycG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+Y2FkICE9IGRldmljZS5wYXJkZXYpCisJCXJldHVybjsJLyogbm90IG91ciBwb3J0ICovCisKKwlocnRpbWVyX2NhbmNlbCgmZGV2aWNlLnRpbWVyKTsKKwlwYXJwb3J0X3JlbGVhc2UoZGV2aWNlLnBhcmRldik7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShkZXZpY2UucGFyZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwcHNfZ2VuX3BhcnBvcnRfZHJpdmVyID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLmF0dGFjaCA9IHBhcnBvcnRfYXR0YWNoLAorCS5kZXRhY2ggPSBwYXJwb3J0X2RldGFjaCwKK307CisKKy8qIG1vZHVsZSBzdGFmZiAqLworCitzdGF0aWMgaW50IF9faW5pdCBwcHNfZ2VuX3BhcnBvcnRfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcl9pbmZvKERSVkRFU0MgIlxuIik7CisKKwlpZiAoc2VuZF9kZWxheSA+IFNFTkRfREVMQVlfTUFYKSB7CisJCXByX2VycigiZGVsYXkgdmFsdWUgc2hvdWxkIGJlIG5vdCBncmVhdGVyIgorCQkJCSIgdGhlbiAlZFxuIiwgU0VORF9ERUxBWV9NQVgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcHBzX2dlbl9wYXJwb3J0X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInVuYWJsZSB0byByZWdpc3RlciB3aXRoIHBhcnBvcnRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAgMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwc19nZW5fcGFycG9ydF9leGl0KHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcHBzX2dlbl9wYXJwb3J0X2RyaXZlcik7CisJcHJfaW5mbygiaHJ0aW1lciBhdmcgZXJyb3IgaXMgJWxkbnNcbiIsIGhydGltZXJfZXJyb3IpOworfQorCittb2R1bGVfaW5pdChwcHNfZ2VuX3BhcnBvcnRfaW5pdCk7Cittb2R1bGVfZXhpdChwcHNfZ2VuX3BhcnBvcnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBHb3JkZWV2IDxsYXNhaW5lQGx2ay5jcy5tc3Uuc3U+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9rYXBpLmMgYi9kcml2ZXJzL3Bwcy9rYXBpLmMKaW5kZXggMWFhMDJkYi4uY2JhMWI0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wcHMva2FwaS5jCisrKyBiL2RyaXZlcnMvcHBzL2thcGkuYwpAQCAtMTksMjQgKzE5LDIwIEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wcHNfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0vKgotICogR2xvYmFsIHZhcmlhYmxlcwotICovCi0KLURFRklORV9TUElOTE9DSyhwcHNfaWRyX2xvY2spOwotREVGSU5FX0lEUihwcHNfaWRyKTsKKyNpbmNsdWRlICJrYy5oIgogCiAvKgogICogTG9jYWwgZnVuY3Rpb25zCkBAIC02MCw2MCArNTYsNiBAQAogICogRXhwb3J0ZWQgZnVuY3Rpb25zCiAgKi8KIAotLyogcHBzX2dldF9zb3VyY2UgLSBmaW5kIGEgUFBTIHNvdXJjZQotICogQHNvdXJjZTogdGhlIFBQUyBzb3VyY2UgSUQuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpbmQgYW4gYWxyZWFkeSByZWdpc3RlcmVkIFBQUyBzb3VyY2UgaW50byB0aGUKLSAqIHN5c3RlbS4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIGlmIGZvdW5kIG5vdGhpbmcsIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgcG9pbnRlcgotICogdG8gdGhlIFBQUyBzb3VyY2UgZGF0YSBzdHJ1Y3QgKHRoZSByZWZjb3VudGVyIGlzIGluY3JlbWVudGVkIGJ5IDEpLgotICovCi0KLXN0cnVjdCBwcHNfZGV2aWNlICpwcHNfZ2V0X3NvdXJjZShpbnQgc291cmNlKQotewotCXN0cnVjdCBwcHNfZGV2aWNlICpwcHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcHNfaWRyX2xvY2ssIGZsYWdzKTsKLQotCXBwcyA9IGlkcl9maW5kKCZwcHNfaWRyLCBzb3VyY2UpOwotCWlmIChwcHMgIT0gTlVMTCkKLQkJYXRvbWljX2luYygmcHBzLT51c2FnZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcHNfaWRyX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBwcHM7Ci19Ci0KLS8qIHBwc19wdXRfc291cmNlIC0gZnJlZSB0aGUgUFBTIHNvdXJjZSBkYXRhCi0gKiBAcHBzOiBhIHBvaW50ZXIgdG8gdGhlIFBQUyBzb3VyY2UuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgYSBQUFMgZGF0YSBzdHJ1Y3QgaWYgaXRzIHJlZmNvdW50IGlzIDAuCi0gKi8KLQotdm9pZCBwcHNfcHV0X3NvdXJjZShzdHJ1Y3QgcHBzX2RldmljZSAqcHBzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBzX2lkcl9sb2NrLCBmbGFncyk7Ci0JQlVHX09OKGF0b21pY19yZWFkKCZwcHMtPnVzYWdlKSA9PSAwKTsKLQotCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmcHBzLT51c2FnZSkpIHsKLQkJcHBzID0gTlVMTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIE5vIG1vcmUgcmVmZXJlbmNlIHRvIHRoZSBQUFMgc291cmNlLiBXZSBjYW4gc2FmZWx5IHJlbW92ZSB0aGUKLQkgKiBQUFMgZGF0YSBzdHJ1Y3QuCi0JICovCi0JaWRyX3JlbW92ZSgmcHBzX2lkciwgcHBzLT5pZCk7Ci0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBzX2lkcl9sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUocHBzKTsKLX0KLQogLyogcHBzX3JlZ2lzdGVyX3NvdXJjZSAtIGFkZCBhIFBQUyBzb3VyY2UgaW4gdGhlIHN5c3RlbQogICogQGluZm86IHRoZSBQUFMgaW5mbyBzdHJ1Y3QKICAqIEBkZWZhdWx0X3BhcmFtczogdGhlIGRlZmF1bHQgUFBTIHBhcmFtZXRlcnMgb2YgdGhlIG5ldyBzb3VyY2UKQEAgLTEyMiwzMSArNjQsMzEgQEAKICAqIHNvdXJjZSBpcyBkZXNjcmliZWQgYnkgaW5mbydzIGZpZWxkcyBhbmQgaXQgd2lsbCBoYXZlLCBhcyBkZWZhdWx0IFBQUwogICogcGFyYW1ldGVycywgdGhlIG9uZXMgc3BlY2lmaWVkIGludG8gZGVmYXVsdF9wYXJhbXMuCiAgKgotICogVGhlIGZ1bmN0aW9uIHJldHVybnMsIGluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIFBQUyBzb3VyY2UgSUQuCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucywgaW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUgUFBTIGRldmljZS4gT3RoZXJ3aXNlIE5VTEwuCiAgKi8KIAotaW50IHBwc19yZWdpc3Rlcl9zb3VyY2Uoc3RydWN0IHBwc19zb3VyY2VfaW5mbyAqaW5mbywgaW50IGRlZmF1bHRfcGFyYW1zKQorc3RydWN0IHBwc19kZXZpY2UgKnBwc19yZWdpc3Rlcl9zb3VyY2Uoc3RydWN0IHBwc19zb3VyY2VfaW5mbyAqaW5mbywKKwkJaW50IGRlZmF1bHRfcGFyYW1zKQogewogCXN0cnVjdCBwcHNfZGV2aWNlICpwcHM7Ci0JaW50IGlkOwogCWludCBlcnI7CiAKIAkvKiBTYW5pdHkgY2hlY2tzICovCiAJaWYgKChpbmZvLT5tb2RlICYgZGVmYXVsdF9wYXJhbXMpICE9IGRlZmF1bHRfcGFyYW1zKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicHBzOiAlczogdW5zdXBwb3J0ZWQgZGVmYXVsdCBwYXJhbWV0ZXJzXG4iLAorCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBkZWZhdWx0IHBhcmFtZXRlcnNcbiIsCiAJCQkJCWluZm8tPm5hbWUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDsKIAl9CiAJaWYgKChpbmZvLT5tb2RlICYgKFBQU19FQ0hPQVNTRVJUIHwgUFBTX0VDSE9DTEVBUikpICE9IDAgJiYKIAkJCWluZm8tPmVjaG8gPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInBwczogJXM6IGVjaG8gZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiIsCisJCXByX2VycigiJXM6IGVjaG8gZnVuY3Rpb24gaXMgbm90IGRlZmluZWRcbiIsCiAJCQkJCWluZm8tPm5hbWUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDsKIAl9CiAJaWYgKChpbmZvLT5tb2RlICYgKFBQU19UU0ZNVF9UU1BFQyB8IFBQU19UU0ZNVF9OVFBGUCkpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcHM6ICVzOiB1bnNwZWNpZmllZCB0aW1lIGZvcm1hdFxuIiwKKwkJcHJfZXJyKCIlczogdW5zcGVjaWZpZWQgdGltZSBmb3JtYXRcbiIsCiAJCQkJCWluZm8tPm5hbWUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDsKQEAgLTE2OCw5NCArMTEwLDQ4IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcHMtPnF1ZXVlKTsKIAlzcGluX2xvY2tfaW5pdCgmcHBzLT5sb2NrKTsKLQlhdG9taWNfc2V0KCZwcHMtPnVzYWdlLCAxKTsKLQotCS8qIEdldCBuZXcgSUQgZm9yIHRoZSBuZXcgUFBTIHNvdXJjZSAqLwotCWlmIChpZHJfcHJlX2dldCgmcHBzX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGtmcmVlX3BwczsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxKCZwcHNfaWRyX2xvY2spOwotCi0JLyogTm93IHJlYWxseSBhbGxvY2F0ZSB0aGUgUFBTIHNvdXJjZS4KLQkgKiBBZnRlciBpZHJfZ2V0X25ldygpIGNhbGxpbmcgdGhlIG5ldyBzb3VyY2Ugd2lsbCBiZSBmcmVlbHkgYXZhaWxhYmxlCi0JICogaW50byB0aGUga2VybmVsLgotCSAqLwotCWVyciA9IGlkcl9nZXRfbmV3KCZwcHNfaWRyLCBwcHMsICZpZCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfaWRyX2xvY2spOwotCQlnb3RvIGtmcmVlX3BwczsKLQl9Ci0KLQlpZCA9IGlkICYgTUFYX0lEX01BU0s7Ci0JaWYgKGlkID49IFBQU19NQVhfU09VUkNFUykgewotCQlzcGluX3VubG9ja19pcnEoJnBwc19pZHJfbG9jayk7Ci0KLQkJcHJpbnRrKEtFUk5fRVJSICJwcHM6ICVzOiB0b28gbWFueSBQUFMgc291cmNlcyBpbiB0aGUgc3lzdGVtXG4iLAotCQkJCQlpbmZvLT5uYW1lKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGZyZWVfaWRyOwotCX0KLQlwcHMtPmlkID0gaWQ7Ci0KLQlzcGluX3VubG9ja19pcnEoJnBwc19pZHJfbG9jayk7CiAKIAkvKiBDcmVhdGUgdGhlIGNoYXIgZGV2aWNlICovCiAJZXJyID0gcHBzX3JlZ2lzdGVyX2NkZXYocHBzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgInBwczogJXM6IHVuYWJsZSB0byBjcmVhdGUgY2hhciBkZXZpY2VcbiIsCisJCXByX2VycigiJXM6IHVuYWJsZSB0byBjcmVhdGUgY2hhciBkZXZpY2VcbiIsCiAJCQkJCWluZm8tPm5hbWUpOwotCQlnb3RvIGZyZWVfaWRyOworCQlnb3RvIGtmcmVlX3BwczsKIAl9CiAKLQlwcl9pbmZvKCJuZXcgUFBTIHNvdXJjZSAlcyBhdCBJRCAlZFxuIiwgaW5mby0+bmFtZSwgaWQpOworCWRldl9pbmZvKHBwcy0+ZGV2LCAibmV3IFBQUyBzb3VyY2UgJXNcbiIsIGluZm8tPm5hbWUpOwogCi0JcmV0dXJuIGlkOwotCi1mcmVlX2lkcjoKLQlzcGluX2xvY2tfaXJxKCZwcHNfaWRyX2xvY2spOwotCWlkcl9yZW1vdmUoJnBwc19pZHIsIGlkKTsKLQlzcGluX3VubG9ja19pcnEoJnBwc19pZHJfbG9jayk7CisJcmV0dXJuIHBwczsKIAoga2ZyZWVfcHBzOgogCWtmcmVlKHBwcyk7CiAKIHBwc19yZWdpc3Rlcl9zb3VyY2VfZXhpdDoKLQlwcmludGsoS0VSTl9FUlIgInBwczogJXM6IHVuYWJsZSB0byByZWdpc3RlciBzb3VyY2VcbiIsIGluZm8tPm5hbWUpOworCXByX2VycigiJXM6IHVuYWJsZSB0byByZWdpc3RlciBzb3VyY2VcbiIsIGluZm8tPm5hbWUpOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0wocHBzX3JlZ2lzdGVyX3NvdXJjZSk7CiAKIC8qIHBwc191bnJlZ2lzdGVyX3NvdXJjZSAtIHJlbW92ZSBhIFBQUyBzb3VyY2UgZnJvbSB0aGUgc3lzdGVtCi0gKiBAc291cmNlOiB0aGUgUFBTIHNvdXJjZSBJRAorICogQHBwczogdGhlIFBQUyBzb3VyY2UKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIFBQUyBzb3VyY2UgZnJvbQogICogdGhlIHN5c3RlbS4KICAqLwogCi12b2lkIHBwc191bnJlZ2lzdGVyX3NvdXJjZShpbnQgc291cmNlKQordm9pZCBwcHNfdW5yZWdpc3Rlcl9zb3VyY2Uoc3RydWN0IHBwc19kZXZpY2UgKnBwcykKIHsKLQlzdHJ1Y3QgcHBzX2RldmljZSAqcHBzOwotCi0Jc3Bpbl9sb2NrX2lycSgmcHBzX2lkcl9sb2NrKTsKLQlwcHMgPSBpZHJfZmluZCgmcHBzX2lkciwgc291cmNlKTsKLQotCWlmICghcHBzKSB7Ci0JCUJVRygpOwotCQlzcGluX3VubG9ja19pcnEoJnBwc19pZHJfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwcHNfaWRyX2xvY2spOwotCisJcHBzX2tjX3JlbW92ZShwcHMpOwogCXBwc191bnJlZ2lzdGVyX2NkZXYocHBzKTsKLQlwcHNfcHV0X3NvdXJjZShwcHMpOworCisJLyogZG9uJ3QgaGF2ZSB0byBrZnJlZShwcHMpIGhlcmUgYmVjYXVzZSBpdCB3aWxsIGJlIGRvbmUgb24KKwkgKiBkZXZpY2UgZGVzdHJ1Y3Rpb24gKi8KIH0KIEVYUE9SVF9TWU1CT0wocHBzX3VucmVnaXN0ZXJfc291cmNlKTsKIAogLyogcHBzX2V2ZW50IC0gcmVnaXN0ZXIgYSBQUFMgZXZlbnQgaW50byB0aGUgc3lzdGVtCi0gKiBAc291cmNlOiB0aGUgUFBTIHNvdXJjZSBJRAorICogQHBwczogdGhlIFBQUyBkZXZpY2UKICAqIEB0czogdGhlIGV2ZW50IHRpbWVzdGFtcAogICogQGV2ZW50OiB0aGUgZXZlbnQgdHlwZQogICogQGRhdGE6IHVzZXJkZWYgcG9pbnRlcgpAQCAtMjYzLDc4ICsxNTksNzIgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBlYWNoIFBQUyBjbGllbnQgaW4gb3JkZXIgdG8gcmVnaXN0ZXIgYSBuZXcKICAqIFBQUyBldmVudCBpbnRvIHRoZSBzeXN0ZW0gKGl0J3MgdXN1YWxseSBjYWxsZWQgaW5zaWRlIGFuIElSUSBoYW5kbGVyKS4KICAqCi0gKiBJZiBhbiBlY2hvIGZ1bmN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUFBTIHNvdXJjZSBpdCB3aWxsIGJlIGNhbGxlZAorICogSWYgYW4gZWNobyBmdW5jdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBQUyBkZXZpY2UgaXQgd2lsbCBiZSBjYWxsZWQKICAqIGFzOgotICoJcHBzLT5pbmZvLmVjaG8oc291cmNlLCBldmVudCwgZGF0YSk7CisgKglwcHMtPmluZm8uZWNobyhwcHMsIGV2ZW50LCBkYXRhKTsKICAqLwotCi12b2lkIHBwc19ldmVudChpbnQgc291cmNlLCBzdHJ1Y3QgcHBzX2t0aW1lICp0cywgaW50IGV2ZW50LCB2b2lkICpkYXRhKQordm9pZCBwcHNfZXZlbnQoc3RydWN0IHBwc19kZXZpY2UgKnBwcywgc3RydWN0IHBwc19ldmVudF90aW1lICp0cywgaW50IGV2ZW50LAorCQl2b2lkICpkYXRhKQogewotCXN0cnVjdCBwcHNfZGV2aWNlICpwcHM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY2FwdHVyZWQgPSAwOworCXN0cnVjdCBwcHNfa3RpbWUgdHNfcmVhbDsKIAotCWlmICgoZXZlbnQgJiAoUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfQ0FQVFVSRUNMRUFSKSkgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgInBwczogdW5rbm93biBldmVudCAoJXgpIGZvciBzb3VyY2UgJWRcbiIsCi0JCQlldmVudCwgc291cmNlKTsKLQkJcmV0dXJuOwotCX0KKwkvKiBjaGVjayBldmVudCB0eXBlICovCisJQlVHX09OKChldmVudCAmIChQUFNfQ0FQVFVSRUFTU0VSVCB8IFBQU19DQVBUVVJFQ0xFQVIpKSA9PSAwKTsKIAotCXBwcyA9IHBwc19nZXRfc291cmNlKHNvdXJjZSk7Ci0JaWYgKCFwcHMpCi0JCXJldHVybjsKKwlkZXZfZGJnKHBwcy0+ZGV2LCAiUFBTIGV2ZW50IGF0ICVsZC4lMDlsZFxuIiwKKwkJCXRzLT50c19yZWFsLnR2X3NlYywgdHMtPnRzX3JlYWwudHZfbnNlYyk7CiAKLQlwcl9kZWJ1ZygiUFBTIGV2ZW50IG9uIHNvdXJjZSAlZCBhdCAlbGx1LiUwNnVcbiIsCi0JCQlwcHMtPmlkLCAodW5zaWduZWQgbG9uZyBsb25nKSB0cy0+c2VjLCB0cy0+bnNlYyk7CisJdGltZXNwZWNfdG9fcHBzX2t0aW1lKCZ0c19yZWFsLCB0cy0+dHNfcmVhbCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHBzLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBNdXN0IGNhbGwgdGhlIGVjaG8gZnVuY3Rpb24/ICovCiAJaWYgKChwcHMtPnBhcmFtcy5tb2RlICYgKFBQU19FQ0hPQVNTRVJUIHwgUFBTX0VDSE9DTEVBUikpKQotCQlwcHMtPmluZm8uZWNobyhzb3VyY2UsIGV2ZW50LCBkYXRhKTsKKwkJcHBzLT5pbmZvLmVjaG8ocHBzLCBldmVudCwgZGF0YSk7CiAKIAkvKiBDaGVjayB0aGUgZXZlbnQgKi8KIAlwcHMtPmN1cnJlbnRfbW9kZSA9IHBwcy0+cGFyYW1zLm1vZGU7Ci0JaWYgKChldmVudCAmIFBQU19DQVBUVVJFQVNTRVJUKSAmCi0JCQkocHBzLT5wYXJhbXMubW9kZSAmIFBQU19DQVBUVVJFQVNTRVJUKSkgeworCWlmIChldmVudCAmIHBwcy0+cGFyYW1zLm1vZGUgJiBQUFNfQ0FQVFVSRUFTU0VSVCkgewogCQkvKiBXZSBoYXZlIHRvIGFkZCBhbiBvZmZzZXQ/ICovCiAJCWlmIChwcHMtPnBhcmFtcy5tb2RlICYgUFBTX09GRlNFVEFTU0VSVCkKLQkJCXBwc19hZGRfb2Zmc2V0KHRzLCAmcHBzLT5wYXJhbXMuYXNzZXJ0X29mZl90dSk7CisJCQlwcHNfYWRkX29mZnNldCgmdHNfcmVhbCwKKwkJCQkJJnBwcy0+cGFyYW1zLmFzc2VydF9vZmZfdHUpOwogCiAJCS8qIFNhdmUgdGhlIHRpbWUgc3RhbXAgKi8KLQkJcHBzLT5hc3NlcnRfdHUgPSAqdHM7CisJCXBwcy0+YXNzZXJ0X3R1ID0gdHNfcmVhbDsKIAkJcHBzLT5hc3NlcnRfc2VxdWVuY2UrKzsKLQkJcHJfZGVidWcoImNhcHR1cmUgYXNzZXJ0IHNlcSAjJXUgZm9yIHNvdXJjZSAlZFxuIiwKLQkJCXBwcy0+YXNzZXJ0X3NlcXVlbmNlLCBzb3VyY2UpOworCQlkZXZfZGJnKHBwcy0+ZGV2LCAiY2FwdHVyZSBhc3NlcnQgc2VxICMldVxuIiwKKwkJCXBwcy0+YXNzZXJ0X3NlcXVlbmNlKTsKIAogCQljYXB0dXJlZCA9IH4wOwogCX0KLQlpZiAoKGV2ZW50ICYgUFBTX0NBUFRVUkVDTEVBUikgJgotCQkJKHBwcy0+cGFyYW1zLm1vZGUgJiBQUFNfQ0FQVFVSRUNMRUFSKSkgeworCWlmIChldmVudCAmIHBwcy0+cGFyYW1zLm1vZGUgJiBQUFNfQ0FQVFVSRUNMRUFSKSB7CiAJCS8qIFdlIGhhdmUgdG8gYWRkIGFuIG9mZnNldD8gKi8KIAkJaWYgKHBwcy0+cGFyYW1zLm1vZGUgJiBQUFNfT0ZGU0VUQ0xFQVIpCi0JCQlwcHNfYWRkX29mZnNldCh0cywgJnBwcy0+cGFyYW1zLmNsZWFyX29mZl90dSk7CisJCQlwcHNfYWRkX29mZnNldCgmdHNfcmVhbCwKKwkJCQkJJnBwcy0+cGFyYW1zLmNsZWFyX29mZl90dSk7CiAKIAkJLyogU2F2ZSB0aGUgdGltZSBzdGFtcCAqLwotCQlwcHMtPmNsZWFyX3R1ID0gKnRzOworCQlwcHMtPmNsZWFyX3R1ID0gdHNfcmVhbDsKIAkJcHBzLT5jbGVhcl9zZXF1ZW5jZSsrOwotCQlwcl9kZWJ1ZygiY2FwdHVyZSBjbGVhciBzZXEgIyV1IGZvciBzb3VyY2UgJWRcbiIsCi0JCQlwcHMtPmNsZWFyX3NlcXVlbmNlLCBzb3VyY2UpOworCQlkZXZfZGJnKHBwcy0+ZGV2LCAiY2FwdHVyZSBjbGVhciBzZXEgIyV1XG4iLAorCQkJcHBzLT5jbGVhcl9zZXF1ZW5jZSk7CiAKIAkJY2FwdHVyZWQgPSB+MDsKIAl9CiAKLQkvKiBXYWtlIHVwIGlpZiBjYXB0dXJlZCBzb210aGluZyAqLworCXBwc19rY19ldmVudChwcHMsIHRzLCBldmVudCk7CisKKwkvKiBXYWtlIHVwIGlmIGNhcHR1cmVkIHNvbWV0aGluZyAqLwogCWlmIChjYXB0dXJlZCkgewotCQlwcHMtPmdvID0gfjA7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBzLT5xdWV1ZSk7CisJCXBwcy0+bGFzdF9ldisrOworCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZwcHMtPnF1ZXVlKTsKIAogCQlraWxsX2Zhc3luYygmcHBzLT5hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwcy0+bG9jaywgZmxhZ3MpOwotCi0JLyogTm93IHdlIGNhbiByZWxlYXNlIHRoZSBQUFMgc291cmNlIGZvciAocG9zc2libGUpIGRlcmVnaXN0cmF0aW9uICovCi0JcHBzX3B1dF9zb3VyY2UocHBzKTsKIH0KIEVYUE9SVF9TWU1CT0wocHBzX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2tjLmMgYi9kcml2ZXJzL3Bwcy9rYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bwcy9rYy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogUFBTIGtlcm5lbCBjb25zdW1lciBBUEkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCAgIEFsZXhhbmRlciBHb3JkZWV2IDxsYXNhaW5lQGx2ay5jcy5tc3Uuc3U+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3Bwc19rZXJuZWwuaD4KKworI2luY2x1ZGUgImtjLmgiCisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KKworLyogc3RhdGUgdmFyaWFibGVzIHRvIGJpbmQga2VybmVsIGNvbnN1bWVyICovCitERUZJTkVfU1BJTkxPQ0socHBzX2tjX2hhcmRwcHNfbG9jayk7CisvKiBQUFMgQVBJIChSRkMgMjc4Myk6IGN1cnJlbnQgc291cmNlIGFuZCBtb2RlIGZvciBrZXJuZWwgY29uc3VtZXIgKi8KK3N0cnVjdCBwcHNfZGV2aWNlICpwcHNfa2NfaGFyZHBwc19kZXY7CS8qIHVuaXF1ZSBwb2ludGVyIHRvIGRldmljZSAqLworaW50IHBwc19rY19oYXJkcHBzX21vZGU7CQkvKiBtb2RlIGJpdHMgZm9yIGtlcm5lbCBjb25zdW1lciAqLworCisvKiBwcHNfa2NfYmluZCAtIGNvbnRyb2wgUFBTIGtlcm5lbCBjb25zdW1lciBiaW5kaW5nCisgKiBAcHBzOiB0aGUgUFBTIHNvdXJjZQorICogQGJpbmRfYXJnczoga2VybmVsIGNvbnN1bWVyIGJpbmQgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBiaW5kIG9yIHVuYmluZCBQUFMga2VybmVsIGNvbnN1bWVyIGFjY29yZGluZyB0bworICogc3VwcGxpZWQgcGFyYW1ldGVycy4gU2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK2ludCBwcHNfa2NfYmluZChzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBzdHJ1Y3QgcHBzX2JpbmRfYXJncyAqYmluZF9hcmdzKQoreworCS8qIENoZWNrIGlmIGFub3RoZXIgY29uc3VtZXIgaXMgYWxyZWFkeSBib3VuZCAqLworCXNwaW5fbG9ja19pcnEoJnBwc19rY19oYXJkcHBzX2xvY2spOworCisJaWYgKGJpbmRfYXJncy0+ZWRnZSA9PSAwKQorCQlpZiAocHBzX2tjX2hhcmRwcHNfZGV2ID09IHBwcykgeworCQkJcHBzX2tjX2hhcmRwcHNfbW9kZSA9IDA7CisJCQlwcHNfa2NfaGFyZHBwc19kZXYgPSBOVUxMOworCQkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKKwkJCWRldl9pbmZvKHBwcy0+ZGV2LCAidW5ib3VuZCBrZXJuZWwiCisJCQkJCSIgY29uc3VtZXJcbiIpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKKwkJCWRldl9lcnIocHBzLT5kZXYsICJzZWxlY3RlZCBrZXJuZWwgY29uc3VtZXIiCisJCQkJCSIgaXMgbm90IGJvdW5kXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJZWxzZQorCQlpZiAocHBzX2tjX2hhcmRwcHNfZGV2ID09IE5VTEwgfHwKKwkJCQlwcHNfa2NfaGFyZHBwc19kZXYgPT0gcHBzKSB7CisJCQlwcHNfa2NfaGFyZHBwc19tb2RlID0gYmluZF9hcmdzLT5lZGdlOworCQkJcHBzX2tjX2hhcmRwcHNfZGV2ID0gcHBzOworCQkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKKwkJCWRldl9pbmZvKHBwcy0+ZGV2LCAiYm91bmQga2VybmVsIGNvbnN1bWVyOiAiCisJCQkJImVkZ2U9MHgleFxuIiwgYmluZF9hcmdzLT5lZGdlKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcHBzX2tjX2hhcmRwcHNfbG9jayk7CisJCQlkZXZfZXJyKHBwcy0+ZGV2LCAiYW5vdGhlciBrZXJuZWwgY29uc3VtZXIiCisJCQkJCSIgaXMgYWxyZWFkeSBib3VuZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHBwc19rY19yZW1vdmUgLSB1bmJpbmQga2VybmVsIGNvbnN1bWVyIG9uIFBQUyBzb3VyY2UgcmVtb3ZhbAorICogQHBwczogdGhlIFBQUyBzb3VyY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzYWJsZSBrZXJuZWwgY29uc3VtZXIgb24gUFBTIHNvdXJjZSByZW1vdmFsCisgKiBpZiB0aGlzIHNvdXJjZSB3YXMgYm91bmQgdG8gUFBTIGtlcm5lbCBjb25zdW1lci4gQ2FuIGJlIGNhbGxlZCBvbiBhbnkKKyAqIHNvdXJjZSBzYWZlbHkuIFNob3VsZCBub3QgYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LgorICovCit2b2lkIHBwc19rY19yZW1vdmUoc3RydWN0IHBwc19kZXZpY2UgKnBwcykKK3sKKwlzcGluX2xvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKKwlpZiAocHBzID09IHBwc19rY19oYXJkcHBzX2RldikgeworCQlwcHNfa2NfaGFyZHBwc19tb2RlID0gMDsKKwkJcHBzX2tjX2hhcmRwcHNfZGV2ID0gTlVMTDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKKwkJZGV2X2luZm8ocHBzLT5kZXYsICJ1bmJvdW5kIGtlcm5lbCBjb25zdW1lciIKKwkJCQkiIG9uIGRldmljZSByZW1vdmFsXG4iKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxKCZwcHNfa2NfaGFyZHBwc19sb2NrKTsKK30KKworLyogcHBzX2tjX2V2ZW50IC0gY2FsbCBoYXJkcHBzKCkgb24gUFBTIGV2ZW50CisgKiBAcHBzOiB0aGUgUFBTIHNvdXJjZQorICogQHRzOiBQUFMgZXZlbnQgdGltZXN0YW1wCisgKiBAZXZlbnQ6IFBQUyBldmVudCBlZGdlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyBoYXJkcHBzKCkgd2hlbiBhbiBldmVudCBmcm9tIGJvdW5kIFBQUyBzb3VyY2Ugb2NjdXJzLgorICovCit2b2lkIHBwc19rY19ldmVudChzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLCBzdHJ1Y3QgcHBzX2V2ZW50X3RpbWUgKnRzLAorCQlpbnQgZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBhc3Mgc29tZSBldmVudHMgdG8ga2VybmVsIGNvbnN1bWVyIGlmIGFjdGl2YXRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcHNfa2NfaGFyZHBwc19sb2NrLCBmbGFncyk7CisJaWYgKHBwcyA9PSBwcHNfa2NfaGFyZHBwc19kZXYgJiYgZXZlbnQgJiBwcHNfa2NfaGFyZHBwc19tb2RlKQorCQloYXJkcHBzKCZ0cy0+dHNfcmVhbCwgJnRzLT50c19yYXcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwc19rY19oYXJkcHBzX2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHBzL2tjLmggYi9kcml2ZXJzL3Bwcy9rYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTZmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bwcy9rYy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBQUFMga2VybmVsIGNvbnN1bWVyIEFQSSBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCAgIEFsZXhhbmRlciBHb3JkZWV2IDxsYXNhaW5lQGx2ay5jcy5tc3Uuc3U+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgTElOVVhfUFBTX0tDX0gKKyNkZWZpbmUgTElOVVhfUFBTX0tDX0gKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHBzX2tlcm5lbC5oPgorCisjaWZkZWYgQ09ORklHX05UUF9QUFMKKworZXh0ZXJuIGludCBwcHNfa2NfYmluZChzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLAorCQlzdHJ1Y3QgcHBzX2JpbmRfYXJncyAqYmluZF9hcmdzKTsKK2V4dGVybiB2b2lkIHBwc19rY19yZW1vdmUoc3RydWN0IHBwc19kZXZpY2UgKnBwcyk7CitleHRlcm4gdm9pZCBwcHNfa2NfZXZlbnQoc3RydWN0IHBwc19kZXZpY2UgKnBwcywKKwkJc3RydWN0IHBwc19ldmVudF90aW1lICp0cywgaW50IGV2ZW50KTsKKworCisjZWxzZSAvKiBDT05GSUdfTlRQX1BQUyAqLworCitzdGF0aWMgaW5saW5lIGludCBwcHNfa2NfYmluZChzdHJ1Y3QgcHBzX2RldmljZSAqcHBzLAorCQlzdHJ1Y3QgcHBzX2JpbmRfYXJncyAqYmluZF9hcmdzKSB7IHJldHVybiAtRU9QTk9UU1VQUDsgfQorc3RhdGljIGlubGluZSB2b2lkIHBwc19rY19yZW1vdmUoc3RydWN0IHBwc19kZXZpY2UgKnBwcykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfa2NfZXZlbnQoc3RydWN0IHBwc19kZXZpY2UgKnBwcywKKwkJc3RydWN0IHBwc19ldmVudF90aW1lICp0cywgaW50IGV2ZW50KSB7fQorCisjZW5kaWYgLyogQ09ORklHX05UUF9QUFMgKi8KKworI2VuZGlmIC8qIExJTlVYX1BQU19LQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bwcy9wcHMuYyBiL2RyaXZlcnMvcHBzL3Bwcy5jCmluZGV4IGNhNTE4M2IuLjJiYWFkZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHBzL3Bwcy5jCisrKyBiL2RyaXZlcnMvcHBzL3Bwcy5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjYsOSArMjcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcHBzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImtjLmgiCiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXMKQEAgLTM3LDYgKzQyLDkgQEAKIHN0YXRpYyBkZXZfdCBwcHNfZGV2dDsKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnBwc19jbGFzczsKIAorc3RhdGljIERFRklORV9NVVRFWChwcHNfaWRyX2xvY2spOworc3RhdGljIERFRklORV9JRFIocHBzX2lkcik7CisKIC8qCiAgKiBDaGFyIGRldmljZSBtZXRob2RzCiAgKi8KQEAgLTYxLDE1ICs2OSwxMyBAQAogewogCXN0cnVjdCBwcHNfZGV2aWNlICpwcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHBwc19rcGFyYW1zIHBhcmFtczsKLQlzdHJ1Y3QgcHBzX2ZkYXRhIGZkYXRhOwotCXVuc2lnbmVkIGxvbmcgdGlja3M7CiAJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOwogCWludCBfX3VzZXIgKml1YXJnID0gKGludCBfX3VzZXIgKikgYXJnOwogCWludCBlcnI7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgUFBTX0dFVFBBUkFNUzoKLQkJcHJfZGVidWcoIlBQU19HRVRQQVJBTVM6IHNvdXJjZSAlZFxuIiwgcHBzLT5pZCk7CisJCWRldl9kYmcocHBzLT5kZXYsICJQUFNfR0VUUEFSQU1TXG4iKTsKIAogCQlzcGluX2xvY2tfaXJxKCZwcHMtPmxvY2spOwogCkBAIC04NSw3ICs5MSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQUFNfU0VUUEFSQU1TOgotCQlwcl9kZWJ1ZygiUFBTX1NFVFBBUkFNUzogc291cmNlICVkXG4iLCBwcHMtPmlkKTsKKwkJZGV2X2RiZyhwcHMtPmRldiwgIlBQU19TRVRQQVJBTVNcbiIpOwogCiAJCS8qIENoZWNrIHRoZSBjYXBhYmlsaXRpZXMgKi8KIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCkBAIC05NSwxNCArMTAxLDE0IEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKCEocGFyYW1zLm1vZGUgJiAoUFBTX0NBUFRVUkVBU1NFUlQgfCBQUFNfQ0FQVFVSRUNMRUFSKSkpIHsKLQkJCXByX2RlYnVnKCJjYXB0dXJlIG1vZGUgdW5zcGVjaWZpZWQgKCV4KVxuIiwKKwkJCWRldl9kYmcocHBzLT5kZXYsICJjYXB0dXJlIG1vZGUgdW5zcGVjaWZpZWQgKCV4KVxuIiwKIAkJCQkJCQkJcGFyYW1zLm1vZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQkvKiBDaGVjayBmb3Igc3VwcG9ydGVkIGNhcGFiaWxpdGllcyAqLwogCQlpZiAoKHBhcmFtcy5tb2RlICYgfnBwcy0+aW5mby5tb2RlKSAhPSAwKSB7Ci0JCQlwcl9kZWJ1ZygidW5zdXBwb3J0ZWQgY2FwYWJpbGl0aWVzICgleClcbiIsCisJCQlkZXZfZGJnKHBwcy0+ZGV2LCAidW5zdXBwb3J0ZWQgY2FwYWJpbGl0aWVzICgleClcbiIsCiAJCQkJCQkJCXBhcmFtcy5tb2RlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xMTUsNyArMTIxLDcgQEAKIAkJLyogUmVzdG9yZSB0aGUgcmVhZCBvbmx5IHBhcmFtZXRlcnMgKi8KIAkJaWYgKChwYXJhbXMubW9kZSAmIChQUFNfVFNGTVRfVFNQRUMgfCBQUFNfVFNGTVRfTlRQRlApKSA9PSAwKSB7CiAJCQkvKiBzZWN0aW9uIDMuMyBvZiBSRkMgMjc4MyBpbnRlcnByZXRlZCAqLwotCQkJcHJfZGVidWcoInRpbWUgZm9ybWF0IHVuc3BlY2lmaWVkICgleClcbiIsCisJCQlkZXZfZGJnKHBwcy0+ZGV2LCAidGltZSBmb3JtYXQgdW5zcGVjaWZpZWQgKCV4KVxuIiwKIAkJCQkJCQkJcGFyYW1zLm1vZGUpOwogCQkJcHBzLT5wYXJhbXMubW9kZSB8PSBQUFNfVFNGTVRfVFNQRUM7CiAJCX0KQEAgLTEyOCw3ICsxMzQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgUFBTX0dFVENBUDoKLQkJcHJfZGVidWcoIlBQU19HRVRDQVA6IHNvdXJjZSAlZFxuIiwgcHBzLT5pZCk7CisJCWRldl9kYmcocHBzLT5kZXYsICJQUFNfR0VUQ0FQXG4iKTsKIAogCQllcnIgPSBwdXRfdXNlcihwcHMtPmluZm8ubW9kZSwgaXVhcmcpOwogCQlpZiAoZXJyKQpAQCAtMTM2LDIwICsxNDIsMjYgQEAKIAogCQlicmVhazsKIAotCWNhc2UgUFBTX0ZFVENIOgotCQlwcl9kZWJ1ZygiUFBTX0ZFVENIOiBzb3VyY2UgJWRcbiIsIHBwcy0+aWQpOworCWNhc2UgUFBTX0ZFVENIOiB7CisJCXN0cnVjdCBwcHNfZmRhdGEgZmRhdGE7CisJCXVuc2lnbmVkIGludCBldjsKKworCQlkZXZfZGJnKHBwcy0+ZGV2LCAiUFBTX0ZFVENIXG4iKTsKIAogCQllcnIgPSBjb3B5X2Zyb21fdXNlcigmZmRhdGEsIHVhcmcsIHNpemVvZihzdHJ1Y3QgcHBzX2ZkYXRhKSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlwcHMtPmdvID0gMDsKKwkJZXYgPSBwcHMtPmxhc3RfZXY7CiAKIAkJLyogTWFuYWdlIHRoZSB0aW1lb3V0ICovCiAJCWlmIChmZGF0YS50aW1lb3V0LmZsYWdzICYgUFBTX1RJTUVfSU5WQUxJRCkKLQkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcHMtPnF1ZXVlLCBwcHMtPmdvKTsKKwkJCWVyciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcHMtPnF1ZXVlLAorCQkJCQlldiAhPSBwcHMtPmxhc3RfZXYpOwogCQllbHNlIHsKLQkJCXByX2RlYnVnKCJ0aW1lb3V0ICVsbGQuJTA5ZFxuIiwKKwkJCXVuc2lnbmVkIGxvbmcgdGlja3M7CisKKwkJCWRldl9kYmcocHBzLT5kZXYsICJ0aW1lb3V0ICVsbGQuJTA5ZFxuIiwKIAkJCQkJKGxvbmcgbG9uZykgZmRhdGEudGltZW91dC5zZWMsCiAJCQkJCWZkYXRhLnRpbWVvdXQubnNlYyk7CiAJCQl0aWNrcyA9IGZkYXRhLnRpbWVvdXQuc2VjICogSFo7CkBAIC0xNTcsNyArMTY5LDkgQEAKIAogCQkJaWYgKHRpY2tzICE9IDApIHsKIAkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgKLQkJCQkJCXBwcy0+cXVldWUsIHBwcy0+Z28sIHRpY2tzKTsKKwkJCQkJCXBwcy0+cXVldWUsCisJCQkJCQlldiAhPSBwcHMtPmxhc3RfZXYsCisJCQkJCQl0aWNrcyk7CiAJCQkJaWYgKGVyciA9PSAwKQogCQkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJCX0KQEAgLTE2NSw3ICsxNzksNyBAQAogCiAJCS8qIENoZWNrIGZvciBwZW5kaW5nIHNpZ25hbHMgKi8KIAkJaWYgKGVyciA9PSAtRVJFU1RBUlRTWVMpIHsKLQkJCXByX2RlYnVnKCJwZW5kaW5nIHNpZ25hbCBjYXVnaHRcbiIpOworCQkJZGV2X2RiZyhwcHMtPmRldiwgInBlbmRpbmcgc2lnbmFsIGNhdWdodFxuIik7CiAJCQlyZXR1cm4gLUVJTlRSOwogCQl9CiAKQEAgLTE4NSwxMCArMTk5LDQ0IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlicmVhazsKKwl9CisJY2FzZSBQUFNfS0NfQklORDogeworCQlzdHJ1Y3QgcHBzX2JpbmRfYXJncyBiaW5kX2FyZ3M7CiAKKwkJZGV2X2RiZyhwcHMtPmRldiwgIlBQU19LQ19CSU5EXG4iKTsKKworCQkvKiBDaGVjayB0aGUgY2FwYWJpbGl0aWVzICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmRfYXJncywgdWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwcHNfYmluZF9hcmdzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBDaGVjayBmb3Igc3VwcG9ydGVkIGNhcGFiaWxpdGllcyAqLworCQlpZiAoKGJpbmRfYXJncy5lZGdlICYgfnBwcy0+aW5mby5tb2RlKSAhPSAwKSB7CisJCQlkZXZfZXJyKHBwcy0+ZGV2LCAidW5zdXBwb3J0ZWQgY2FwYWJpbGl0aWVzICgleClcbiIsCisJCQkJCWJpbmRfYXJncy5lZGdlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogVmFsaWRhdGUgcGFyYW1ldGVycyByb3VnaGx5ICovCisJCWlmIChiaW5kX2FyZ3MudHNmb3JtYXQgIT0gUFBTX1RTRk1UX1RTUEVDIHx8CisJCQkJKGJpbmRfYXJncy5lZGdlICYgflBQU19DQVBUVVJFQk9USCkgIT0gMCB8fAorCQkJCWJpbmRfYXJncy5jb25zdW1lciAhPSBQUFNfS0NfSEFSRFBQUykgeworCQkJZGV2X2VycihwcHMtPmRldiwgImludmFsaWQga2VybmVsIGNvbnN1bWVyIGJpbmQiCisJCQkJCSIgcGFyYW1ldGVycyAoJXgpXG4iLCBiaW5kX2FyZ3MuZWRnZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWVyciA9IHBwc19rY19iaW5kKHBwcywgJmJpbmRfYXJncyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7Ci0JCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTk4LDEyICsyNDYsNiBAQAogewogCXN0cnVjdCBwcHNfZGV2aWNlICpwcHMgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2RldiwKIAkJCQkJCXN0cnVjdCBwcHNfZGV2aWNlLCBjZGV2KTsKLQlpbnQgZm91bmQ7Ci0KLQlmb3VuZCA9IHBwc19nZXRfc291cmNlKHBwcy0+aWQpICE9IDA7Ci0JaWYgKCFmb3VuZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBwcHM7CiAKIAlyZXR1cm4gMDsKQEAgLTIxMSwxMSArMjUzLDYgQEAKIAogc3RhdGljIGludCBwcHNfY2Rldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBwcHNfZGV2aWNlICpwcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQkvKiBGcmVlIHRoZSBQUFMgc291cmNlIGFuZCB3YWtlIHVwIChwb3NzaWJsZSkgZGVyZWdpc3RyYXRpb24gKi8KLQlwcHNfcHV0X3NvdXJjZShwcHMpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMywyNSArMjcwLDY3IEBACiAJLnJlbGVhc2UJPSBwcHNfY2Rldl9yZWxlYXNlLAogfTsKIAorc3RhdGljIHZvaWQgcHBzX2RldmljZV9kZXN0cnVjdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBwc19kZXZpY2UgKnBwcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogcmVsZWFzZSBpZCBoZXJlIHRvIHByb3RlY3Qgb3RoZXJzIGZyb20gdXNpbmcgaXQgd2hpbGUgaXQncworCSAqIHN0aWxsIGluIHVzZSAqLworCW11dGV4X2xvY2soJnBwc19pZHJfbG9jayk7CisJaWRyX3JlbW92ZSgmcHBzX2lkciwgcHBzLT5pZCk7CisJbXV0ZXhfdW5sb2NrKCZwcHNfaWRyX2xvY2spOworCisJa2ZyZWUoZGV2KTsKKwlrZnJlZShwcHMpOworfQorCiBpbnQgcHBzX3JlZ2lzdGVyX2NkZXYoc3RydWN0IHBwc19kZXZpY2UgKnBwcykKIHsKIAlpbnQgZXJyOworCWRldl90IGRldnQ7CiAKLQlwcHMtPmRldm5vID0gTUtERVYoTUFKT1IocHBzX2RldnQpLCBwcHMtPmlkKTsKKwltdXRleF9sb2NrKCZwcHNfaWRyX2xvY2spOworCS8qIEdldCBuZXcgSUQgZm9yIHRoZSBuZXcgUFBTIHNvdXJjZSAqLworCWlmIChpZHJfcHJlX2dldCgmcHBzX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgeworCQltdXRleF91bmxvY2soJnBwc19pZHJfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIE5vdyByZWFsbHkgYWxsb2NhdGUgdGhlIFBQUyBzb3VyY2UuCisJICogQWZ0ZXIgaWRyX2dldF9uZXcoKSBjYWxsaW5nIHRoZSBuZXcgc291cmNlIHdpbGwgYmUgZnJlZWx5IGF2YWlsYWJsZQorCSAqIGludG8gdGhlIGtlcm5lbC4KKwkgKi8KKwllcnIgPSBpZHJfZ2V0X25ldygmcHBzX2lkciwgcHBzLCAmcHBzLT5pZCk7CisJbXV0ZXhfdW5sb2NrKCZwcHNfaWRyX2xvY2spOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwcHMtPmlkICY9IE1BWF9JRF9NQVNLOworCWlmIChwcHMtPmlkID49IFBQU19NQVhfU09VUkNFUykgeworCQlwcl9lcnIoIiVzOiB0b28gbWFueSBQUFMgc291cmNlcyBpbiB0aGUgc3lzdGVtXG4iLAorCQkJCQlwcHMtPmluZm8ubmFtZSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2lkcjsKKwl9CisKKwlkZXZ0ID0gTUtERVYoTUFKT1IocHBzX2RldnQpLCBwcHMtPmlkKTsKKwogCWNkZXZfaW5pdCgmcHBzLT5jZGV2LCAmcHBzX2NkZXZfZm9wcyk7CiAJcHBzLT5jZGV2Lm93bmVyID0gcHBzLT5pbmZvLm93bmVyOwogCi0JZXJyID0gY2Rldl9hZGQoJnBwcy0+Y2RldiwgcHBzLT5kZXZubywgMSk7CisJZXJyID0gY2Rldl9hZGQoJnBwcy0+Y2RldiwgZGV2dCwgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInBwczogJXM6IGZhaWxlZCB0byBhZGQgY2hhciBkZXZpY2UgJWQ6JWRcbiIsCisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhZGQgY2hhciBkZXZpY2UgJWQ6JWRcbiIsCiAJCQkJcHBzLT5pbmZvLm5hbWUsIE1BSk9SKHBwc19kZXZ0KSwgcHBzLT5pZCk7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZnJlZV9pZHI7CiAJfQotCXBwcy0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShwcHNfY2xhc3MsIHBwcy0+aW5mby5kZXYsIHBwcy0+ZGV2bm8sIE5VTEwsCisJcHBzLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHBwc19jbGFzcywgcHBzLT5pbmZvLmRldiwgZGV2dCwgcHBzLAogCQkJCQkJCSJwcHMlZCIsIHBwcy0+aWQpOwogCWlmIChJU19FUlIocHBzLT5kZXYpKQogCQlnb3RvIGRlbF9jZGV2OwotCWRldl9zZXRfZHJ2ZGF0YShwcHMtPmRldiwgcHBzKTsKKworCXBwcy0+ZGV2LT5yZWxlYXNlID0gcHBzX2RldmljZV9kZXN0cnVjdDsKIAogCXByX2RlYnVnKCJzb3VyY2UgJXMgZ290IGNkZXYgKCVkOiVkKVxuIiwgcHBzLT5pbmZvLm5hbWUsCiAJCQlNQUpPUihwcHNfZGV2dCksIHBwcy0+aWQpOwpAQCAtMjYxLDEyICszNDAsMTcgQEAKIGRlbF9jZGV2OgogCWNkZXZfZGVsKCZwcHMtPmNkZXYpOwogCitmcmVlX2lkcjoKKwltdXRleF9sb2NrKCZwcHNfaWRyX2xvY2spOworCWlkcl9yZW1vdmUoJnBwc19pZHIsIHBwcy0+aWQpOworCW11dGV4X3VubG9jaygmcHBzX2lkcl9sb2NrKTsKKwogCXJldHVybiBlcnI7CiB9CiAKIHZvaWQgcHBzX3VucmVnaXN0ZXJfY2RldihzdHJ1Y3QgcHBzX2RldmljZSAqcHBzKQogewotCWRldmljZV9kZXN0cm95KHBwc19jbGFzcywgcHBzLT5kZXZubyk7CisJZGV2aWNlX2Rlc3Ryb3kocHBzX2NsYXNzLCBwcHMtPmRldi0+ZGV2dCk7CiAJY2Rldl9kZWwoJnBwcy0+Y2Rldik7CiB9CiAKQEAgLTI4NiwxNCArMzcwLDE0IEBACiAKIAlwcHNfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJwcHMiKTsKIAlpZiAoIXBwc19jbGFzcykgewotCQlwcmludGsoS0VSTl9FUlIgInBwczogZmFpbGVkIHRvIGFsbG9jYXRlIGNsYXNzXG4iKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gYWxsb2NhdGUgY2xhc3NcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcHBzX2NsYXNzLT5kZXZfYXR0cnMgPSBwcHNfYXR0cnM7CiAKIAllcnIgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZwcHNfZGV2dCwgMCwgUFBTX01BWF9TT1VSQ0VTLCAicHBzIik7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJwcHM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaGFyIGRldmljZSByZWdpb25cbiIpOworCQlwcl9lcnIoImZhaWxlZCB0byBhbGxvY2F0ZSBjaGFyIGRldmljZSByZWdpb25cbiIpOwogCQlnb3RvIHJlbW92ZV9jbGFzczsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL01ha2VmaWxlIGIvZHJpdmVycy9wczMvTWFrZWZpbGUKaW5kZXggY2NlYTE1Yy4uNTBjYjFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wczMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wczMvTWFrZWZpbGUKQEAgLTEsNiArMSw2IEBACiBvYmotJChDT05GSUdfUFMzX1ZVQVJUKSArPSBwczMtdnVhcnQubwogb2JqLSQoQ09ORklHX1BTM19QUzNBVikgKz0gcHMzYXZfbW9kLm8KLXBzM2F2X21vZC1vYmpzCQkrPSBwczNhdi5vIHBzM2F2X2NtZC5vCitwczNhdl9tb2QteQkJOj0gcHMzYXYubyBwczNhdl9jbWQubwogb2JqLSQoQ09ORklHX1BQQ19QUzMpICs9IHN5cy1tYW5hZ2VyLWNvcmUubwogb2JqLSQoQ09ORklHX1BTM19TWVNfTUFOQUdFUikgKz0gcHMzLXN5cy1tYW5hZ2VyLm8KIG9iai0kKENPTkZJR19QUzNfU1RPUkFHRSkgKz0gcHMzc3Rvcl9saWIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3Jpby1zY2FuLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYwppbmRleCAxZWI4MmM0Li40NjdlODJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYworKysgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXNjYW4uYwpAQCAtNDYsNyArNDYsNiBAQAogREVGSU5FX1NQSU5MT0NLKHJpb19nbG9iYWxfbGlzdF9sb2NrKTsKIAogc3RhdGljIGludCBuZXh0X2Rlc3RpZCA9IDA7Ci1zdGF0aWMgaW50IG5leHRfc3dpdGNoaWQgPSAwOwogc3RhdGljIGludCBuZXh0X25ldCA9IDA7CiBzdGF0aWMgaW50IG5leHRfY29tcHRhZyA9IDE7CiAKQEAgLTM3OCwxMiArMzc3LDMwIEBACiAJc3RydWN0IHJpb19kZXYgKnJkZXY7CiAJc3RydWN0IHJpb19zd2l0Y2ggKnJzd2l0Y2ggPSBOVUxMOwogCWludCByZXN1bHQsIHJkaWQ7CisJc2l6ZV90IHNpemU7CisJdTMyIHN3cGluZm8gPSAwOwogCi0JcmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByaW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmlvX2Rldik7CisJaWYgKHJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihwb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJCSAgICAgUklPX1BFRl9DQVIsICZyZXN1bHQpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChyZXN1bHQgJiAoUklPX1BFRl9TV0lUQ0ggfCBSSU9fUEVGX01VTFRJUE9SVCkpIHsKKwkJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCQkJCSBSSU9fU1dQX0lORk9fQ0FSLCAmc3dwaW5mbyk7CisJCWlmIChyZXN1bHQgJiBSSU9fUEVGX1NXSVRDSCkgeworCQkJc2l6ZSArPSAoUklPX0dFVF9UT1RBTF9QT1JUUyhzd3BpbmZvKSAqCisJCQkJc2l6ZW9mKHJzd2l0Y2gtPm5leHRkZXZbMF0pKSArIHNpemVvZigqcnN3aXRjaCk7CisJCX0KKwl9CisKKwlyZGV2ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJkZXYpCiAJCXJldHVybiBOVUxMOwogCiAJcmRldi0+bmV0ID0gbmV0OworCXJkZXYtPnBlZiA9IHJlc3VsdDsKKwlyZGV2LT5zd3BpbmZvID0gc3dwaW5mbzsKIAlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIocG9ydCwgZGVzdGlkLCBob3Bjb3VudCwgUklPX0RFVl9JRF9DQVIsCiAJCQkJICZyZXN1bHQpOwogCXJkZXYtPmRpZCA9IHJlc3VsdCA+PiAxNjsKQEAgLTM5Nyw4ICs0MTQsNiBAQAogCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihwb3J0LCBkZXN0aWQsIGhvcGNvdW50LCBSSU9fQVNNX0lORk9fQ0FSLAogCQkJCSAmcmVzdWx0KTsKIAlyZGV2LT5hc21fcmV2ID0gcmVzdWx0ID4+IDE2OwotCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihwb3J0LCBkZXN0aWQsIGhvcGNvdW50LCBSSU9fUEVGX0NBUiwKLQkJCQkgJnJkZXYtPnBlZik7CiAJaWYgKHJkZXYtPnBlZiAmIFJJT19QRUZfRVhUX0ZFQVRVUkVTKSB7CiAJCXJkZXYtPmVmcHRyID0gcmVzdWx0ICYgMHhmZmZmOwogCQlyZGV2LT5waHlzX2VmcHRyID0gcmlvX21wb3J0X2dldF9waHlzZWZiKHBvcnQsIDAsIGRlc3RpZCwKQEAgLTQwOCwxMSArNDIzLDYgQEAKIAkJCQkJCWhvcGNvdW50LCBSSU9fRUZCX0VSUl9NR01OVCk7CiAJfQogCi0JaWYgKHJkZXYtPnBlZiAmIChSSU9fUEVGX1NXSVRDSCB8IFJJT19QRUZfTVVMVElQT1JUKSkgewotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIocG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCQkJIFJJT19TV1BfSU5GT19DQVIsICZyZGV2LT5zd3BpbmZvKTsKLQl9Ci0KIAlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIocG9ydCwgZGVzdGlkLCBob3Bjb3VudCwgUklPX1NSQ19PUFNfQ0FSLAogCQkJCSAmcmRldi0+c3JjX29wcyk7CiAJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKHBvcnQsIGRlc3RpZCwgaG9wY291bnQsIFJJT19EU1RfT1BTX0NBUiwKQEAgLTQyNyw2ICs0MzcsMTAgQEAKIAkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihwb3J0LCBkZXN0aWQsIGhvcGNvdW50LAogCQkJCQkgIFJJT19DT01QT05FTlRfVEFHX0NTUiwgbmV4dF9jb21wdGFnKTsKIAkJcmRldi0+Y29tcF90YWcgPSBuZXh0X2NvbXB0YWcrKzsKKwl9ICBlbHNlIHsKKwkJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCQkJCSBSSU9fQ09NUE9ORU5UX1RBR19DU1IsCisJCQkJCSAmcmRldi0+Y29tcF90YWcpOwogCX0KIAogCWlmIChyaW9fZGV2aWNlX2hhc19kZXN0aWQocG9ydCwgcmRldi0+c3JjX29wcywgcmRldi0+ZHN0X29wcykpIHsKQEAgLTQzNywyMSArNDUxLDIwIEBACiAJCQkJbmV4dF9kZXN0aWQrKzsKIAkJfSBlbHNlCiAJCQlyZGV2LT5kZXN0aWQgPSByaW9fZ2V0X2RldmljZV9pZChwb3J0LCBkZXN0aWQsIGhvcGNvdW50KTsKLQl9IGVsc2UKLQkJLyogU3dpdGNoIGRldmljZSBoYXMgYW4gYXNzb2NpYXRlZCBkZXN0SUQgKi8KLQkJcmRldi0+ZGVzdGlkID0gUklPX0lOVkFMSURfREVTVElEOworCisJCXJkZXYtPmhvcGNvdW50ID0gMHhmZjsKKwl9IGVsc2UgeworCQkvKiBTd2l0Y2ggZGV2aWNlIGhhcyBhbiBhc3NvY2lhdGVkIGRlc3RJRCB3aGljaAorCQkgKiB3aWxsIGJlIGFkanVzdGVkIGxhdGVyCisJCSAqLworCQlyZGV2LT5kZXN0aWQgPSBkZXN0aWQ7CisJCXJkZXYtPmhvcGNvdW50ID0gaG9wY291bnQ7CisJfQogCiAJLyogSWYgYSBQRSBoYXMgYm90aCBzd2l0Y2ggYW5kIG90aGVyIGZ1bmN0aW9ucywgc2hvdyBpdCBhcyBhIHN3aXRjaCAqLwogCWlmIChyaW9faXNfc3dpdGNoKHJkZXYpKSB7Ci0JCXJzd2l0Y2ggPSBremFsbG9jKHNpemVvZigqcnN3aXRjaCkgKwotCQkJCSAgUklPX0dFVF9UT1RBTF9QT1JUUyhyZGV2LT5zd3BpbmZvKSAqCi0JCQkJICBzaXplb2YocnN3aXRjaC0+bmV4dGRldlswXSksCi0JCQkJICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyc3dpdGNoKQotCQkJZ290byBjbGVhbnVwOwotCQlyc3dpdGNoLT5zd2l0Y2hpZCA9IG5leHRfc3dpdGNoaWQ7Ci0JCXJzd2l0Y2gtPmhvcGNvdW50ID0gaG9wY291bnQ7Ci0JCXJzd2l0Y2gtPmRlc3RpZCA9IGRlc3RpZDsKKwkJcnN3aXRjaCA9IHJkZXYtPnJzd2l0Y2g7CisJCXJzd2l0Y2gtPnN3aXRjaGlkID0gcmRldi0+Y29tcF90YWcgJiBSSU9fQ1RBR19VREVWSUQ7CiAJCXJzd2l0Y2gtPnBvcnRfb2sgPSAwOwogCQlyc3dpdGNoLT5yb3V0ZV90YWJsZSA9IGt6YWxsb2Moc2l6ZW9mKHU4KSoKIAkJCQkJUklPX01BWF9ST1VURV9FTlRSSUVTKHBvcnQtPnN5c19zaXplKSwKQEAgLTQ2MiwxNSArNDc1LDEzIEBACiAJCWZvciAocmRpZCA9IDA7IHJkaWQgPCBSSU9fTUFYX1JPVVRFX0VOVFJJRVMocG9ydC0+c3lzX3NpemUpOwogCQkJCXJkaWQrKykKIAkJCXJzd2l0Y2gtPnJvdXRlX3RhYmxlW3JkaWRdID0gUklPX0lOVkFMSURfUk9VVEU7Ci0JCXJkZXYtPnJzd2l0Y2ggPSByc3dpdGNoOwotCQlyc3dpdGNoLT5yZGV2ID0gcmRldjsKIAkJZGV2X3NldF9uYW1lKCZyZGV2LT5kZXYsICIlMDJ4OnM6JTA0eCIsIHJkZXYtPm5ldC0+aWQsCi0JCQkgICAgIHJkZXYtPnJzd2l0Y2gtPnN3aXRjaGlkKTsKKwkJCSAgICAgcnN3aXRjaC0+c3dpdGNoaWQpOwogCQlyaW9fc3dpdGNoX2luaXQocmRldiwgZG9fZW51bSk7CiAKLQkJaWYgKGRvX2VudW0gJiYgcmRldi0+cnN3aXRjaC0+Y2xyX3RhYmxlKQotCQkJcmRldi0+cnN3aXRjaC0+Y2xyX3RhYmxlKHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJCQkgUklPX0dMT0JBTF9UQUJMRSk7CisJCWlmIChkb19lbnVtICYmIHJzd2l0Y2gtPmNscl90YWJsZSkKKwkJCXJzd2l0Y2gtPmNscl90YWJsZShwb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJCQkgICBSSU9fR0xPQkFMX1RBQkxFKTsKIAogCQlsaXN0X2FkZF90YWlsKCZyc3dpdGNoLT5ub2RlLCAmcmlvX3N3aXRjaGVzKTsKIApAQCAtNTA2LDEwICs1MTcsOSBAQAogCXJldHVybiByZGV2OwogCiBjbGVhbnVwOgotCWlmIChyc3dpdGNoKSB7CisJaWYgKHJzd2l0Y2gtPnJvdXRlX3RhYmxlKQogCQlrZnJlZShyc3dpdGNoLT5yb3V0ZV90YWJsZSk7Ci0JCWtmcmVlKHJzd2l0Y2gpOwotCX0KKwogCWtmcmVlKHJkZXYpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNjMyLDggKzY0Miw3IEBACiAKIC8qKgogICogcmlvX3JvdXRlX2FkZF9lbnRyeS0gQWRkIGEgcm91dGUgZW50cnkgdG8gYSBzd2l0Y2ggcm91dGluZyB0YWJsZQotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCB0byBzZW5kIHRyYW5zYWN0aW9uCi0gKiBAcnN3aXRjaDogU3dpdGNoIGRldmljZQorICogQHJkZXY6IFJJTyBkZXZpY2UKICAqIEB0YWJsZTogUm91dGluZyB0YWJsZSBJRAogICogQHJvdXRlX2Rlc3RpZDogRGVzdGluYXRpb24gSUQgdG8gYmUgcm91dGVkCiAgKiBAcm91dGVfcG9ydDogUG9ydCBudW1iZXIgdG8gYmUgcm91dGVkCkBAIC02NDcsMzEgKzY1NiwzMSBAQAogICogb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotcmlvX3JvdXRlX2FkZF9lbnRyeShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgc3RydWN0IHJpb19zd2l0Y2ggKnJzd2l0Y2gsCityaW9fcm91dGVfYWRkX2VudHJ5KHN0cnVjdCByaW9fZGV2ICpyZGV2LAogCQkgICAgdTE2IHRhYmxlLCB1MTYgcm91dGVfZGVzdGlkLCB1OCByb3V0ZV9wb3J0LCBpbnQgbG9jaykKIHsKIAlpbnQgcmM7CiAKIAlpZiAobG9jaykgewotCQlyYyA9IHJpb19sb2NrX2RldmljZShtcG9ydCwgcnN3aXRjaC0+ZGVzdGlkLAotCQkJCSAgICAgcnN3aXRjaC0+aG9wY291bnQsIDEwMDApOworCQlyYyA9IHJpb19sb2NrX2RldmljZShyZGV2LT5uZXQtPmhwb3J0LCByZGV2LT5kZXN0aWQsCisJCQkJICAgICByZGV2LT5ob3Bjb3VudCwgMTAwMCk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IHJzd2l0Y2gtPmFkZF9lbnRyeShtcG9ydCwgcnN3aXRjaC0+ZGVzdGlkLAotCQkJCQlyc3dpdGNoLT5ob3Bjb3VudCwgdGFibGUsCi0JCQkJCXJvdXRlX2Rlc3RpZCwgcm91dGVfcG9ydCk7CisJcmMgPSByZGV2LT5yc3dpdGNoLT5hZGRfZW50cnkocmRldi0+bmV0LT5ocG9ydCwgcmRldi0+ZGVzdGlkLAorCQkJCSAgICAgIHJkZXYtPmhvcGNvdW50LCB0YWJsZSwKKwkJCQkgICAgICByb3V0ZV9kZXN0aWQsIHJvdXRlX3BvcnQpOwogCWlmIChsb2NrKQotCQlyaW9fdW5sb2NrX2RldmljZShtcG9ydCwgcnN3aXRjaC0+ZGVzdGlkLCByc3dpdGNoLT5ob3Bjb3VudCk7CisJCXJpb191bmxvY2tfZGV2aWNlKHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPmRlc3RpZCwKKwkJCQkgIHJkZXYtPmhvcGNvdW50KTsKIAogCXJldHVybiByYzsKIH0KIAogLyoqCiAgKiByaW9fcm91dGVfZ2V0X2VudHJ5LSBSZWFkIGEgcm91dGUgZW50cnkgaW4gYSBzd2l0Y2ggcm91dGluZyB0YWJsZQotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCB0byBzZW5kIHRyYW5zYWN0aW9uCi0gKiBAcnN3aXRjaDogU3dpdGNoIGRldmljZQorICogQHJkZXY6IFJJTyBkZXZpY2UKICAqIEB0YWJsZTogUm91dGluZyB0YWJsZSBJRAogICogQHJvdXRlX2Rlc3RpZDogRGVzdGluYXRpb24gSUQgdG8gYmUgcm91dGVkCiAgKiBAcm91dGVfcG9ydDogUG9pbnRlciB0byByZWFkIHBvcnQgbnVtYmVyIGludG8KQEAgLTY4NSwyMyArNjk0LDI0IEBACiAgKiBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1yaW9fcm91dGVfZ2V0X2VudHJ5KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBzdHJ1Y3QgcmlvX3N3aXRjaCAqcnN3aXRjaCwgdTE2IHRhYmxlLAorcmlvX3JvdXRlX2dldF9lbnRyeShzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTE2IHRhYmxlLAogCQkgICAgdTE2IHJvdXRlX2Rlc3RpZCwgdTggKnJvdXRlX3BvcnQsIGludCBsb2NrKQogewogCWludCByYzsKIAogCWlmIChsb2NrKSB7Ci0JCXJjID0gcmlvX2xvY2tfZGV2aWNlKG1wb3J0LCByc3dpdGNoLT5kZXN0aWQsCi0JCQkJICAgICByc3dpdGNoLT5ob3Bjb3VudCwgMTAwMCk7CisJCXJjID0gcmlvX2xvY2tfZGV2aWNlKHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPmRlc3RpZCwKKwkJCQkgICAgIHJkZXYtPmhvcGNvdW50LCAxMDAwKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KIAotCXJjID0gcnN3aXRjaC0+Z2V0X2VudHJ5KG1wb3J0LCByc3dpdGNoLT5kZXN0aWQsCi0JCQkJCXJzd2l0Y2gtPmhvcGNvdW50LCB0YWJsZSwKLQkJCQkJcm91dGVfZGVzdGlkLCByb3V0ZV9wb3J0KTsKKwlyYyA9IHJkZXYtPnJzd2l0Y2gtPmdldF9lbnRyeShyZGV2LT5uZXQtPmhwb3J0LCByZGV2LT5kZXN0aWQsCisJCQkJICAgICAgcmRldi0+aG9wY291bnQsIHRhYmxlLAorCQkJCSAgICAgIHJvdXRlX2Rlc3RpZCwgcm91dGVfcG9ydCk7CiAJaWYgKGxvY2spCi0JCXJpb191bmxvY2tfZGV2aWNlKG1wb3J0LCByc3dpdGNoLT5kZXN0aWQsIHJzd2l0Y2gtPmhvcGNvdW50KTsKKwkJcmlvX3VubG9ja19kZXZpY2UocmRldi0+bmV0LT5ocG9ydCwgcmRldi0+ZGVzdGlkLAorCQkJCSAgcmRldi0+aG9wY291bnQpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODA5LDE2ICs4MTksMTUgQEAKIAkJcmV0dXJuIC0xOwogCiAJaWYgKHJpb19pc19zd2l0Y2gocmRldikpIHsKLQkJbmV4dF9zd2l0Y2hpZCsrOwogCQlzd19pbnBvcnQgPSBSSU9fR0VUX1BPUlRfTlVNKHJkZXYtPnN3cGluZm8pOwotCQlyaW9fcm91dGVfYWRkX2VudHJ5KHBvcnQsIHJkZXYtPnJzd2l0Y2gsIFJJT19HTE9CQUxfVEFCTEUsCisJCXJpb19yb3V0ZV9hZGRfZW50cnkocmRldiwgUklPX0dMT0JBTF9UQUJMRSwKIAkJCQkgICAgcG9ydC0+aG9zdF9kZXZpY2VpZCwgc3dfaW5wb3J0LCAwKTsKIAkJcmRldi0+cnN3aXRjaC0+cm91dGVfdGFibGVbcG9ydC0+aG9zdF9kZXZpY2VpZF0gPSBzd19pbnBvcnQ7CiAKIAkJZm9yIChkZXN0aWQgPSAwOyBkZXN0aWQgPCBuZXh0X2Rlc3RpZDsgZGVzdGlkKyspIHsKIAkJCWlmIChkZXN0aWQgPT0gcG9ydC0+aG9zdF9kZXZpY2VpZCkKIAkJCQljb250aW51ZTsKLQkJCXJpb19yb3V0ZV9hZGRfZW50cnkocG9ydCwgcmRldi0+cnN3aXRjaCwgUklPX0dMT0JBTF9UQUJMRSwKKwkJCXJpb19yb3V0ZV9hZGRfZW50cnkocmRldiwgUklPX0dMT0JBTF9UQUJMRSwKIAkJCQkJICAgIGRlc3RpZCwgc3dfaW5wb3J0LCAwKTsKIAkJCXJkZXYtPnJzd2l0Y2gtPnJvdXRlX3RhYmxlW2Rlc3RpZF0gPSBzd19pbnBvcnQ7CiAJCX0KQEAgLTg1MCw4ICs4NTksNyBAQAogCQkJCSAgICAiUklPOiBzY2FubmluZyBkZXZpY2Ugb24gcG9ydCAlZFxuIiwKIAkJCQkgICAgcG9ydF9udW0pOwogCQkJCXJkZXYtPnJzd2l0Y2gtPnBvcnRfb2sgfD0gKDEgPDwgcG9ydF9udW0pOwotCQkJCXJpb19yb3V0ZV9hZGRfZW50cnkocG9ydCwgcmRldi0+cnN3aXRjaCwKLQkJCQkJCVJJT19HTE9CQUxfVEFCTEUsCisJCQkJcmlvX3JvdXRlX2FkZF9lbnRyeShyZGV2LCBSSU9fR0xPQkFMX1RBQkxFLAogCQkJCQkJUklPX0FOWV9ERVNUSUQocG9ydC0+c3lzX3NpemUpLAogCQkJCQkJcG9ydF9udW0sIDApOwogCkBAIC04NjUsNyArODczLDcgQEAKIAkJCQkJICAgICBkZXN0aWQgPCBuZXh0X2Rlc3RpZDsgZGVzdGlkKyspIHsKIAkJCQkJCWlmIChkZXN0aWQgPT0gcG9ydC0+aG9zdF9kZXZpY2VpZCkKIAkJCQkJCQljb250aW51ZTsKLQkJCQkJCXJpb19yb3V0ZV9hZGRfZW50cnkocG9ydCwgcmRldi0+cnN3aXRjaCwKKwkJCQkJCXJpb19yb3V0ZV9hZGRfZW50cnkocmRldiwKIAkJCQkJCQkJICAgIFJJT19HTE9CQUxfVEFCTEUsCiAJCQkJCQkJCSAgICBkZXN0aWQsCiAJCQkJCQkJCSAgICBwb3J0X251bSwKQEAgLTkwNCw3ICs5MTIsNyBAQAogCQkJCW5leHRfZGVzdGlkKys7CiAJCX0KIAotCQlyZGV2LT5yc3dpdGNoLT5kZXN0aWQgPSBzd19kZXN0aWQ7CisJCXJkZXYtPmRlc3RpZCA9IHN3X2Rlc3RpZDsKIAl9IGVsc2UKIAkJcHJfZGVidWcoIlJJTzogZm91bmQgJXMgKHZpZCAlNC40eCBkaWQgJTQuNHgpXG4iLAogCQkgICAgcmlvX25hbWUocmRldiksIHJkZXYtPnZpZCwgcmRldi0+ZGlkKTsKQEAgLTk0MSw3ICs5NDksNyBAQAogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogcmlvX2Rpc2NfcGVlcihzdHJ1Y3QgcmlvX25ldCAqbmV0LCBzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0LCB1MTYgZGVzdGlkLAotCSAgICAgIHU4IGhvcGNvdW50KQorCSAgICAgIHU4IGhvcGNvdW50LCBzdHJ1Y3QgcmlvX2RldiAqcHJldiwgaW50IHByZXZfcG9ydCkKIHsKIAl1OCBwb3J0X251bSwgcm91dGVfcG9ydDsKIAlzdHJ1Y3QgcmlvX2RldiAqcmRldjsKQEAgLTk1MSwxNCArOTU5LDE1IEBACiAJaWYgKChyZGV2ID0gcmlvX3NldHVwX2RldmljZShuZXQsIHBvcnQsIGRlc3RpZCwgaG9wY291bnQsIDApKSkgewogCQkvKiBBZGQgZGV2aWNlIHRvIHRoZSBnbG9iYWwgYW5kIGJ1cy9uZXQgc3BlY2lmaWMgbGlzdC4gKi8KIAkJbGlzdF9hZGRfdGFpbCgmcmRldi0+bmV0X2xpc3QsICZuZXQtPmRldmljZXMpOworCQlyZGV2LT5wcmV2ID0gcHJldjsKKwkJaWYgKHByZXYgJiYgcmlvX2lzX3N3aXRjaChwcmV2KSkKKwkJCXByZXYtPnJzd2l0Y2gtPm5leHRkZXZbcHJldl9wb3J0XSA9IHJkZXY7CiAJfSBlbHNlCiAJCXJldHVybiAtMTsKIAogCWlmIChyaW9faXNfc3dpdGNoKHJkZXYpKSB7Ci0JCW5leHRfc3dpdGNoaWQrKzsKLQogCQkvKiBBc3NvY2lhdGVkIGRlc3RpZCBpcyBob3cgd2UgYWNjZXNzZWQgdGhpcyBzd2l0Y2ggKi8KLQkJcmRldi0+cnN3aXRjaC0+ZGVzdGlkID0gZGVzdGlkOworCQlyZGV2LT5kZXN0aWQgPSBkZXN0aWQ7CiAKIAkJcHJfZGVidWcoCiAJCSAgICAiUklPOiBmb3VuZCAlcyAodmlkICU0LjR4IGRpZCAlNC40eCkgd2l0aCAlZCBwb3J0c1xuIiwKQEAgLTk4MSw3ICs5OTAsNyBAQAogCQkJCWZvciAobmRlc3RpZCA9IDA7CiAJCQkJICAgICBuZGVzdGlkIDwgUklPX0FOWV9ERVNUSUQocG9ydC0+c3lzX3NpemUpOwogCQkJCSAgICAgbmRlc3RpZCsrKSB7Ci0JCQkJCXJpb19yb3V0ZV9nZXRfZW50cnkocG9ydCwgcmRldi0+cnN3aXRjaCwKKwkJCQkJcmlvX3JvdXRlX2dldF9lbnRyeShyZGV2LAogCQkJCQkJCSAgICBSSU9fR0xPQkFMX1RBQkxFLAogCQkJCQkJCSAgICBuZGVzdGlkLAogCQkJCQkJCSAgICAmcm91dGVfcG9ydCwgMCk7CkBAIC05OTIsOCArMTAwMSw4IEBACiAJCQkJaWYgKG5kZXN0aWQgPT0gUklPX0FOWV9ERVNUSUQocG9ydC0+c3lzX3NpemUpKQogCQkJCQljb250aW51ZTsKIAkJCQlyaW9fdW5sb2NrX2RldmljZShwb3J0LCBkZXN0aWQsIGhvcGNvdW50KTsKLQkJCQlpZiAocmlvX2Rpc2NfcGVlcgotCQkJCSAgICAobmV0LCBwb3J0LCBuZGVzdGlkLCBob3Bjb3VudCArIDEpIDwgMCkKKwkJCQlpZiAocmlvX2Rpc2NfcGVlcihuZXQsIHBvcnQsIG5kZXN0aWQsCisJCQkJCWhvcGNvdW50ICsgMSwgcmRldiwgcG9ydF9udW0pIDwgMCkKIAkJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9CkBAIC0xMDY5LDE0ICsxMDc4LDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJpb191cGRhdGVfcm91dGVfdGFibGVzKHN0cnVjdCByaW9fbXBvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHJpb19kZXYgKnJkZXY7CisJc3RydWN0IHJpb19kZXYgKnJkZXYsICpzd3JkZXY7CiAJc3RydWN0IHJpb19zd2l0Y2ggKnJzd2l0Y2g7CiAJdTggc3BvcnQ7CiAJdTE2IGRlc3RpZDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJnJpb19kZXZpY2VzLCBnbG9iYWxfbGlzdCkgewogCi0JCWRlc3RpZCA9IChyaW9faXNfc3dpdGNoKHJkZXYpKT9yZGV2LT5yc3dpdGNoLT5kZXN0aWQ6cmRldi0+ZGVzdGlkOworCQlkZXN0aWQgPSByZGV2LT5kZXN0aWQ7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3dpdGNoLCAmcmlvX3N3aXRjaGVzLCBub2RlKSB7CiAKQEAgLTEwODQsMTQgKzEwOTMsMTYgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKFJJT19JTlZBTElEX1JPVVRFID09IHJzd2l0Y2gtPnJvdXRlX3RhYmxlW2Rlc3RpZF0pIHsKKwkJCQlzd3JkZXYgPSBzd190b19yaW9fZGV2KHJzd2l0Y2gpOworCiAJCQkJLyogU2tpcCBpZiBkZXN0aWQgZW5kcyBpbiBlbXB0eSBzd2l0Y2gqLwotCQkJCWlmIChyc3dpdGNoLT5kZXN0aWQgPT0gZGVzdGlkKQorCQkJCWlmIChzd3JkZXYtPmRlc3RpZCA9PSBkZXN0aWQpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJc3BvcnQgPSBSSU9fR0VUX1BPUlRfTlVNKHJzd2l0Y2gtPnJkZXYtPnN3cGluZm8pOworCQkJCXNwb3J0ID0gUklPX0dFVF9QT1JUX05VTShzd3JkZXYtPnN3cGluZm8pOwogCiAJCQkJaWYgKHJzd2l0Y2gtPmFkZF9lbnRyeSkJewotCQkJCQlyaW9fcm91dGVfYWRkX2VudHJ5KHBvcnQsIHJzd2l0Y2gsCisJCQkJCXJpb19yb3V0ZV9hZGRfZW50cnkoc3dyZGV2LAogCQkJCQkJUklPX0dMT0JBTF9UQUJMRSwgZGVzdGlkLAogCQkJCQkJc3BvcnQsIDApOwogCQkJCQlyc3dpdGNoLT5yb3V0ZV90YWJsZVtkZXN0aWRdID0gc3BvcnQ7CkBAIC0xMjAzLDIxICsxMjE0LDIwIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZyaW9fZGV2aWNlcywgZ2xvYmFsX2xpc3QpCiAJCWlmIChyaW9faXNfc3dpdGNoKHJkZXYpKSB7Ci0JCQlyaW9fbG9ja19kZXZpY2UocmRldi0+bmV0LT5ocG9ydCwgcmRldi0+cnN3aXRjaC0+ZGVzdGlkLAotCQkJCQlyZGV2LT5yc3dpdGNoLT5ob3Bjb3VudCwgMTAwMCk7CisJCQlyaW9fbG9ja19kZXZpY2UocmRldi0+bmV0LT5ocG9ydCwgcmRldi0+ZGVzdGlkLAorCQkJCQlyZGV2LT5ob3Bjb3VudCwgMTAwMCk7CiAJCQlmb3IgKGkgPSAwOwogCQkJICAgICBpIDwgUklPX01BWF9ST1VURV9FTlRSSUVTKHJkZXYtPm5ldC0+aHBvcnQtPnN5c19zaXplKTsKIAkJCSAgICAgaSsrKSB7Ci0JCQkJaWYgKHJpb19yb3V0ZV9nZXRfZW50cnkKLQkJCQkgICAgKHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPnJzd2l0Y2gsCi0JCQkJICAgICBSSU9fR0xPQkFMX1RBQkxFLCBpLCAmc3BvcnQsIDApIDwgMCkKKwkJCQlpZiAocmlvX3JvdXRlX2dldF9lbnRyeShyZGV2LAorCQkJCQlSSU9fR0xPQkFMX1RBQkxFLCBpLCAmc3BvcnQsIDApIDwgMCkKIAkJCQkJY29udGludWU7CiAJCQkJcmRldi0+cnN3aXRjaC0+cm91dGVfdGFibGVbaV0gPSBzcG9ydDsKIAkJCX0KIAogCQkJcmlvX3VubG9ja19kZXZpY2UocmRldi0+bmV0LT5ocG9ydCwKLQkJCQkJICByZGV2LT5yc3dpdGNoLT5kZXN0aWQsCi0JCQkJCSAgcmRldi0+cnN3aXRjaC0+aG9wY291bnQpOworCQkJCQkgIHJkZXYtPmRlc3RpZCwKKwkJCQkJICByZGV2LT5ob3Bjb3VudCk7CiAJCX0KIH0KIApAQCAtMTI4NCw3ICsxMjk0LDcgQEAKIAkJCQkJCSAgIG1wb3J0LT5ob3N0X2RldmljZWlkKTsKIAogCQlpZiAocmlvX2Rpc2NfcGVlcihuZXQsIG1wb3J0LCBSSU9fQU5ZX0RFU1RJRChtcG9ydC0+c3lzX3NpemUpLAotCQkJCQkwKSA8IDApIHsKKwkJCQkJMCwgTlVMTCwgMCkgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgIlJJTzogbWFzdGVyIHBvcnQgJWQgZGV2aWNlIGhhcyBmYWlsZWQgZGlzY292ZXJ5XG4iLAogCQkJICAgICAgIG1wb3J0LT5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvLXN5c2ZzLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvLXN5c2ZzLmMKaW5kZXggMTM3ZWQ5My4uNzZiNDE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpby1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW8tc3lzZnMuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKCZyZGV2LT5kZXYsICZyaW9fY29uZmlnX2F0dHIpOwogCi0JaWYgKCFlcnIgJiYgcmRldi0+cnN3aXRjaCkgeworCWlmICghZXJyICYmIChyZGV2LT5wZWYgJiBSSU9fUEVGX1NXSVRDSCkpIHsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZyZGV2LT5kZXYsICZkZXZfYXR0cl9yb3V0ZXMpOwogCQlpZiAoIWVyciAmJiByZGV2LT5yc3dpdGNoLT5zd19zeXNmcykKIAkJCWVyciA9IHJkZXYtPnJzd2l0Y2gtPnN3X3N5c2ZzKHJkZXYsIFJJT19TV19TWVNGU19DUkVBVEUpOwpAQCAtMjM5LDcgKzIzOSw3IEBACiB2b2lkIHJpb19yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCByaW9fZGV2ICpyZGV2KQogewogCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJnJkZXYtPmRldiwgJnJpb19jb25maWdfYXR0cik7Ci0JaWYgKHJkZXYtPnJzd2l0Y2gpIHsKKwlpZiAocmRldi0+cGVmICYgUklPX1BFRl9TV0lUQ0gpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZyZGV2LT5kZXYsICZkZXZfYXR0cl9yb3V0ZXMpOwogCQlpZiAocmRldi0+cnN3aXRjaC0+c3dfc3lzZnMpCiAJCQlyZGV2LT5yc3dpdGNoLT5zd19zeXNmcyhyZGV2LCBSSU9fU1dfU1lTRlNfUkVNT1ZFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9yaW8uYyBiL2RyaXZlcnMvcmFwaWRpby9yaW8uYwppbmRleCA3YjUwODBjLi5jYzJhM2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vcmlvLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL3Jpby5jCkBAIC00NzEsMTYgKzQ3MSw5IEBACiAgKi8KIGludCByaW9fc2V0X3BvcnRfbG9ja291dChzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTMyIHBudW0sIGludCBsb2NrKQogewotCXU4IGhvcGNvdW50ID0gMHhmZjsKLQl1MTYgZGVzdGlkID0gcmRldi0+ZGVzdGlkOwogCXUzMiByZWd2YWw7CiAKLQlpZiAocmRldi0+cnN3aXRjaCkgewotCQlkZXN0aWQgPSByZGV2LT5yc3dpdGNoLT5kZXN0aWQ7Ci0JCWhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7Ci0JfQotCi0JcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQkJIHJkZXYtPnBoeXNfZWZwdHIgKyBSSU9fUE9SVF9OX0NUTF9DU1IocG51bSksCiAJCQkJICZyZWd2YWwpOwogCWlmIChsb2NrKQpAQCAtNDg4LDcgKzQ4MSw3IEBACiAJZWxzZQogCQlyZWd2YWwgJj0gflJJT19QT1JUX05fQ1RMX0xPQ0tPVVQ7CiAKLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJCSAgcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fQ1RMX0NTUihwbnVtKSwKIAkJCQkgIHJlZ3ZhbCk7CiAJcmV0dXJuIDA7CkBAIC01MDcsNyArNTAwLDcgQEAKIHJpb19jaGtfZGV2X3JvdXRlKHN0cnVjdCByaW9fZGV2ICpyZGV2LCBzdHJ1Y3QgcmlvX2RldiAqKm5yZGV2LCBpbnQgKm5wbnVtKQogewogCXUzMiByZXN1bHQ7Ci0JaW50IHBfcG9ydCwgZHN0aWQsIHJjID0gLUVJTzsKKwlpbnQgcF9wb3J0LCByYyA9IC1FSU87CiAJc3RydWN0IHJpb19kZXYgKnByZXYgPSBOVUxMOwogCiAJLyogRmluZCBzd2l0Y2ggd2l0aCBmYWlsZWQgUklPIGxpbmsgKi8KQEAgLTUyMiw5ICs1MTUsNyBAQAogCWlmIChwcmV2ID09IE5VTEwpCiAJCWdvdG8gZXJyX291dDsKIAotCWRzdGlkID0gKHJkZXYtPnBlZiAmIFJJT19QRUZfU1dJVENIKSA/Ci0JCQlyZGV2LT5yc3dpdGNoLT5kZXN0aWQgOiByZGV2LT5kZXN0aWQ7Ci0JcF9wb3J0ID0gcHJldi0+cnN3aXRjaC0+cm91dGVfdGFibGVbZHN0aWRdOworCXBfcG9ydCA9IHByZXYtPnJzd2l0Y2gtPnJvdXRlX3RhYmxlW3JkZXYtPmRlc3RpZF07CiAKIAlpZiAocF9wb3J0ICE9IFJJT19JTlZBTElEX1JPVVRFKSB7CiAJCXByX2RlYnVnKCJSSU86IGxpbmsgZmFpbGVkIG9uIFslc10tUCVkXG4iLApAQCAtNTY3LDE1ICs1NTgsOCBAQAogICovCiBzdGF0aWMgaW50IHJpb19jaGtfZGV2X2FjY2VzcyhzdHJ1Y3QgcmlvX2RldiAqcmRldikKIHsKLQl1OCBob3Bjb3VudCA9IDB4ZmY7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPmRlc3RpZDsKLQotCWlmIChyZGV2LT5yc3dpdGNoKSB7Ci0JCWRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQkJaG9wY291bnQgPSByZGV2LT5yc3dpdGNoLT5ob3Bjb3VudDsKLQl9Ci0KLQlyZXR1cm4gcmlvX21wb3J0X2Noa19kZXZfYWNjZXNzKHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQpOworCXJldHVybiByaW9fbXBvcnRfY2hrX2Rldl9hY2Nlc3MocmRldi0+bmV0LT5ocG9ydCwKKwkJCQkJcmRldi0+ZGVzdGlkLCByZGV2LT5ob3Bjb3VudCk7CiB9CiAKIC8qKgpAQCAtNTg4LDIzICs1NzIsMjAgQEAKIHN0YXRpYyBpbnQKIHJpb19nZXRfaW5wdXRfc3RhdHVzKHN0cnVjdCByaW9fZGV2ICpyZGV2LCBpbnQgcG51bSwgdTMyICpsbmtyZXNwKQogewotCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0ID0gcmRldi0+bmV0LT5ocG9ydDsKLQl1MTYgZGVzdGlkID0gcmRldi0+cnN3aXRjaC0+ZGVzdGlkOwotCXU4IGhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7CiAJdTMyIHJlZ3ZhbDsKIAlpbnQgY2hlY2tjb3VudDsKIAogCWlmIChsbmtyZXNwKSB7CiAJCS8qIFJlYWQgZnJvbSBsaW5rIG1haW50ZW5hbmNlIHJlc3BvbnNlIHJlZ2lzdGVyCiAJCSAqIHRvIGNsZWFyIHZhbGlkIGJpdCAqLwotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fTU5UX1JTUF9DU1IocG51bSksCiAJCQkmcmVndmFsKTsKIAkJdWRlbGF5KDUwKTsKIAl9CiAKIAkvKiBJc3N1ZSBJbnB1dC1zdGF0dXMgY29tbWFuZCAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9NTlRfUkVRX0NTUihwbnVtKSwKIAkJUklPX01OVF9SRVFfQ01EX0lTKTsKIApAQCAtNjE1LDcgKzU5Niw3IEBACiAJY2hlY2tjb3VudCA9IDM7CiAJd2hpbGUgKGNoZWNrY291bnQtLSkgewogCQl1ZGVsYXkoNTApOwotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fTU5UX1JTUF9DU1IocG51bSksCiAJCQkmcmVndmFsKTsKIAkJaWYgKHJlZ3ZhbCAmIFJJT19QT1JUX05fTU5UX1JTUF9SVkFMKSB7CkBAIC02MzUsMTUgKzYxNiwxMiBAQAogICovCiBzdGF0aWMgaW50IHJpb19jbHJfZXJyX3N0b3BwZWQoc3RydWN0IHJpb19kZXYgKnJkZXYsIHUzMiBwbnVtLCB1MzIgZXJyX3N0YXR1cykKIHsKLQlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQl1OCBob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwogCXN0cnVjdCByaW9fZGV2ICpuZXh0ZGV2ID0gcmRldi0+cnN3aXRjaC0+bmV4dGRldltwbnVtXTsKIAl1MzIgcmVndmFsOwogCXUzMiBmYXJfYWNraWQsIGZhcl9saW5rc3RhdCwgbmVhcl9hY2tpZDsKIAogCWlmIChlcnJfc3RhdHVzID09IDApCi0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9FUlJfU1RTX0NTUihwbnVtKSwKIAkJCSZlcnJfc3RhdHVzKTsKIApAQCAtNjYxLDcgKzYzOSw3IEBACiAJCQkgcG51bSwgcmVndmFsKTsKIAkJZmFyX2Fja2lkID0gKHJlZ3ZhbCAmIFJJT19QT1JUX05fTU5UX1JTUF9BU1RBVCkgPj4gNTsKIAkJZmFyX2xpbmtzdGF0ID0gcmVndmFsICYgUklPX1BPUlRfTl9NTlRfUlNQX0xTVEFUOwotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fQUNLX1NUU19DU1IocG51bSksCiAJCQkmcmVndmFsKTsKIAkJcHJfZGVidWcoIlJJT19FTTogU1AlZF9BQ0tfU1RTX0NTUj0weCUwOHhcbiIsIHBudW0sIHJlZ3ZhbCk7CkBAIC02NzksOSArNjU3LDggQEAKIAkJCS8qIEFsaWduIG5lYXIgb3V0c3RhbmRpbmcvb3V0Ym91bmQgYWNrSURzIHdpdGgKIAkJCSAqIGZhciBpbmJvdW5kLgogCQkJICovCi0JCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsCi0JCQkJaG9wY291bnQsIHJkZXYtPnBoeXNfZWZwdHIgKwotCQkJCQlSSU9fUE9SVF9OX0FDS19TVFNfQ1NSKHBudW0pLAorCQkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAorCQkJCXJkZXYtPnBoeXNfZWZwdHIgKyBSSU9fUE9SVF9OX0FDS19TVFNfQ1NSKHBudW0pLAogCQkJCShuZWFyX2Fja2lkIDw8IDI0KSB8CiAJCQkJCShmYXJfYWNraWQgPDwgOCkgfCBmYXJfYWNraWQpOwogCQkJLyogQWxpZ24gZmFyIG91dHN0YW5kaW5nL291dGJvdW5kIGFja0lEcyB3aXRoCkBAIC02OTgsNyArNjc1LDcgQEAKIAkJCQlwcl9kZWJ1ZygiUklPX0VNOiBJbnZhbGlkIG5leHRkZXYgcG9pbnRlciAoTlVMTClcbiIpOwogCQl9CiByZF9lcnI6Ci0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9FUlJfU1RTX0NTUihwbnVtKSwKIAkJCSZlcnJfc3RhdHVzKTsKIAkJcHJfZGVidWcoIlJJT19FTTogU1AlZF9FUlJfU1RTX0NTUj0weCUwOHhcbiIsIHBudW0sIGVycl9zdGF0dXMpOwpAQCAtNzEwLDcgKzY4Nyw3IEBACiAJCQkJICAgICBSSU9fR0VUX1BPUlRfTlVNKG5leHRkZXYtPnN3cGluZm8pLCBOVUxMKTsKIAkJdWRlbGF5KDUwKTsKIAotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fRVJSX1NUU19DU1IocG51bSksCiAJCQkmZXJyX3N0YXR1cyk7CiAJCXByX2RlYnVnKCJSSU9fRU06IFNQJWRfRVJSX1NUU19DU1I9MHglMDh4XG4iLCBwbnVtLCBlcnJfc3RhdHVzKTsKQEAgLTczMCwxMyArNzA3LDEwIEBACiBpbnQgcmlvX2luYl9wd3JpdGVfaGFuZGxlcih1bmlvbiByaW9fcHdfbXNnICpwd19tc2cpCiB7CiAJc3RydWN0IHJpb19kZXYgKnJkZXY7Ci0Jc3RydWN0IHJpb19tcG9ydCAqbXBvcnQ7Ci0JdTggaG9wY291bnQ7Ci0JdTE2IGRlc3RpZDsKIAl1MzIgZXJyX3N0YXR1cywgZW1fcGVycmRldCwgZW1fbHRsZXJyZGV0OwogCWludCByYywgcG9ydG51bTsKIAotCXJkZXYgPSByaW9fZ2V0X2NvbXB0YWcocHdfbXNnLT5lbS5jb21wdGFnLCBOVUxMKTsKKwlyZGV2ID0gcmlvX2dldF9jb21wdGFnKChwd19tc2ctPmVtLmNvbXB0YWcgJiBSSU9fQ1RBR19VREVWSUQpLCBOVUxMKTsKIAlpZiAocmRldiA9PSBOVUxMKSB7CiAJCS8qIERldmljZSByZW1vdmVkIG9yIGVudW1lcmF0aW9uIGVycm9yICovCiAJCXByX2RlYnVnKCJSSU86ICVzIE5vIG1hdGNoaW5nIGRldmljZSBmb3IgQ1RhZyAweCUwOHhcbiIsCkBAIC04MDAsMTcgKzc3NCwxMyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQltcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JZGVzdGlkID0gcmRldi0+cnN3aXRjaC0+ZGVzdGlkOwotCWhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7Ci0KIAkvKgogCSAqIFByb2Nlc3MgdGhlIHBvcnQtd3JpdGUgbm90aWZpY2F0aW9uIGZyb20gc3dpdGNoCiAJICovCiAJaWYgKHJkZXYtPnJzd2l0Y2gtPmVtX2hhbmRsZSkKIAkJcmRldi0+cnN3aXRjaC0+ZW1faGFuZGxlKHJkZXYsIHBvcnRudW0pOwogCi0JcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fRVJSX1NUU19DU1IocG9ydG51bSksCiAJCQkmZXJyX3N0YXR1cyk7CiAJcHJfZGVidWcoIlJJT19QVzogU1AlZF9FUlJfU1RTX0NTUj0weCUwOHhcbiIsIHBvcnRudW0sIGVycl9zdGF0dXMpOwpAQCAtODQwLDcgKzgxMCw3IEBACiAJCQlyZGV2LT5yc3dpdGNoLT5wb3J0X29rICY9IH4oMSA8PCBwb3J0bnVtKTsKIAkJCXJpb19zZXRfcG9ydF9sb2Nrb3V0KHJkZXYsIHBvcnRudW0sIDEpOwogCi0JCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJCXJkZXYtPnBoeXNfZWZwdHIgKwogCQkJCQlSSU9fUE9SVF9OX0FDS19TVFNfQ1NSKHBvcnRudW0pLAogCQkJCVJJT19QT1JUX05fQUNLX0NMRUFSKTsKQEAgLTg1MSwyOCArODIxLDI4IEBACiAJCX0KIAl9CiAKLQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCXJkZXYtPmVtX2VmcHRyICsgUklPX0VNX1BOX0VSUl9ERVRFQ1QocG9ydG51bSksICZlbV9wZXJyZGV0KTsKIAlpZiAoZW1fcGVycmRldCkgewogCQlwcl9kZWJ1ZygiUklPX1BXOiBSSU9fRU1fUCVkX0VSUl9ERVRFQ1Q9MHglMDh4XG4iLAogCQkJIHBvcnRudW0sIGVtX3BlcnJkZXQpOwogCQkvKiBDbGVhciBFTSBQb3J0IE4gRXJyb3IgRGV0ZWN0IENTUiAqLwotCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5lbV9lZnB0ciArIFJJT19FTV9QTl9FUlJfREVURUNUKHBvcnRudW0pLCAwKTsKIAl9CiAKLQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCXJkZXYtPmVtX2VmcHRyICsgUklPX0VNX0xUTF9FUlJfREVURUNULCAmZW1fbHRsZXJyZGV0KTsKIAlpZiAoZW1fbHRsZXJyZGV0KSB7CiAJCXByX2RlYnVnKCJSSU9fUFc6IFJJT19FTV9MVExfRVJSX0RFVEVDVD0weCUwOHhcbiIsCiAJCQkgZW1fbHRsZXJyZGV0KTsKIAkJLyogQ2xlYXIgRU0gTC9UIExheWVyIEVycm9yIERldGVjdCBDU1IgKi8KLQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+ZW1fZWZwdHIgKyBSSU9fRU1fTFRMX0VSUl9ERVRFQ1QsIDApOwogCX0KIAogCS8qIENsZWFyIHJlbWFpbmluZyBlcnJvciBiaXRzIGFuZCBQb3J0LVdyaXRlIFBlbmRpbmcgYml0ICovCi0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9FUlJfU1RTX0NTUihwb3J0bnVtKSwKIAkJCWVycl9zdGF0dXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0X2dlbjIuYyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCmluZGV4IDBiYjg3MWMuLjA5NTAxNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRfZ2VuMi5jCkBAIC0yMDksOSArMjA5LDYgQEAKIHN0YXRpYyBpbnQKIGlkdGcyX2VtX2luaXQoc3RydWN0IHJpb19kZXYgKnJkZXYpCiB7Ci0Jc3RydWN0IHJpb19tcG9ydCAqbXBvcnQgPSByZGV2LT5uZXQtPmhwb3J0OwotCXUxNiBkZXN0aWQgPSByZGV2LT5yc3dpdGNoLT5kZXN0aWQ7Ci0JdTggaG9wY291bnQgPSByZGV2LT5yc3dpdGNoLT5ob3Bjb3VudDsKIAl1MzIgcmVndmFsOwogCWludCBpLCB0bXA7CiAKQEAgLTIyMCwyOSArMjE3LDI1IEBACiAJICogQWxsIHN0YW5kYXJkIEVNIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhdCB1cHBlciBsZXZlbC4KIAkgKi8KIAotCXByX2RlYnVnKCJSSU86ICVzIFslZDolZF1cbiIsIF9fZnVuY19fLCBkZXN0aWQsIGhvcGNvdW50KTsKKwlwcl9kZWJ1ZygiUklPOiAlcyBbJWQ6JWRdXG4iLCBfX2Z1bmNfXywgcmRldi0+ZGVzdGlkLCByZGV2LT5ob3Bjb3VudCk7CiAKIAkvKiBTZXQgUG9ydC1Xcml0ZSBpbmZvIENTUjogUFJJTz0zIGFuZCBDUkY9MSAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfUFdfSU5GT19DU1IsIDB4MDAwMGUwMDApOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX1BXX0lORk9fQ1NSLCAweDAwMDBlMDAwKTsKIAogCS8qCiAJICogQ29uZmlndXJlIExUIExBWUVSIGVycm9yIHJlcG9ydGluZy4KIAkgKi8KIAogCS8qIEVuYWJsZSBzdGFuZGFyZCAoUklPLnA4KSBlcnJvciByZXBvcnRpbmcgKi8KLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJSURUX0xUX0VSUl9SRVBPUlRfRU4sCisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LCBJRFRfTFRfRVJSX1JFUE9SVF9FTiwKIAkJCVJFTV9MVExfRVJSX0lMTFRSQU4gfCBSRU1fTFRMX0VSUl9VTlNPTFIgfAogCQkJUkVNX0xUTF9FUlJfVU5TVVBUUik7CiAKIAkvKiBVc2UgUG9ydC1Xcml0ZXMgZm9yIExUIGxheWVyIGVycm9yIHJlcG9ydGluZy4KIAkgKiBFbmFibGUgcGVyLXBvcnQgcmVzZXQKIAkgKi8KLQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfREVWX0NUUkxfMSwgJnJlZ3ZhbCk7Ci0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCUlEVF9ERVZfQ1RSTF8xLAorCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LCBJRFRfREVWX0NUUkxfMSwgJnJlZ3ZhbCk7CisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LCBJRFRfREVWX0NUUkxfMSwKIAkJCXJlZ3ZhbCB8IElEVF9ERVZfQ1RSTF8xX0dFTlBXIHwgSURUX0RFVl9DVFJMXzFfUFJTVEJFSCk7CiAKIAkvKgpAQCAtMjUwLDQ1ICsyNDMsNDAgQEAKIAkgKi8KIAogCS8qIFJlcG9ydCBhbGwgUklPLnA4IGVycm9ycyBzdXBwb3J0ZWQgYnkgZGV2aWNlICovCi0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCUlEVF9QT1JUX0VSUl9SRVBPUlRfRU5fQkMsIDB4ODA3ZTgwMzcpOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX1BPUlRfRVJSX1JFUE9SVF9FTl9CQywgMHg4MDdlODAzNyk7CiAKIAkvKiBDb25maWd1cmUgcmVwb3J0aW5nIG9mIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGVycm9ycy9ldmVudHMgKi8KLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJSURUX1BPUlRfSVNFUlJfUkVQT1JUX0VOX0JDLCBJRFRfUE9SVF9JTklUX1RYX0FDUVVJUkVEKTsKKwlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsIElEVF9QT1JUX0lTRVJSX1JFUE9SVF9FTl9CQywKKwkJCSAgICBJRFRfUE9SVF9JTklUX1RYX0FDUVVJUkVEKTsKIAogCS8qIFVzZSBQb3J0LVdyaXRlcyBmb3IgcG9ydCBlcnJvciByZXBvcnRpbmcgYW5kIGVuYWJsZSBlcnJvciBsb2dnaW5nICovCiAJdG1wID0gUklPX0dFVF9UT1RBTF9QT1JUUyhyZGV2LT5zd3BpbmZvKTsKIAlmb3IgKGkgPSAwOyBpIDwgdG1wOyBpKyspIHsKLQkJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCUlEVF9QT1JUX09QUyhpKSwgJnJlZ3ZhbCk7Ci0JCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LCBJRFRfUE9SVF9PUFMoaSksICZyZWd2YWwpOworCQlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsCiAJCQkJSURUX1BPUlRfT1BTKGkpLCByZWd2YWwgfCBJRFRfUE9SVF9PUFNfR0VOUFcgfAogCQkJCUlEVF9QT1JUX09QU19QTF9FTE9HIHwKIAkJCQlJRFRfUE9SVF9PUFNfTExfRUxPRyB8CiAJCQkJSURUX1BPUlRfT1BTX0xUX0VMT0cpOwogCX0KIAkvKiBPdmVyd3JpdGUgZXJyb3IgbG9nIGlmIGZ1bGwgKi8KLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJSURUX0VSUl9DQVAsIElEVF9FUlJfQ0FQX0xPR19PVkVSV1IpOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX0VSUl9DQVAsIElEVF9FUlJfQ0FQX0xPR19PVkVSV1IpOwogCiAJLyoKIAkgKiBDb25maWd1cmUgTEFORSBlcnJvciByZXBvcnRpbmcuCiAJICovCiAKIAkvKiBEaXNhYmxlIGxpbmUgZXJyb3IgcmVwb3J0aW5nICovCi0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCUlEVF9MQU5FX0VSUl9SRVBPUlRfRU5fQkMsIDApOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX0xBTkVfRVJSX1JFUE9SVF9FTl9CQywgMCk7CiAKIAkvKiBVc2UgUG9ydC1Xcml0ZXMgZm9yIGxhbmUgZXJyb3IgcmVwb3J0aW5nICh3aGVuIGVuYWJsZWQpCiAJICogKGRvIHBlci1sYW5lIHVwZGF0ZSBiZWNhdXNlIGxhbmVzIG1heSBoYXZlIGRpZmZlcmVudCBjb25maWd1cmF0aW9uKQogCSAqLwogCXRtcCA9IChyZGV2LT5kaWQgPT0gUklPX0RJRF9JRFRDUFMxODQ4KSA/IDQ4IDogMTY7CiAJZm9yIChpID0gMDsgaSA8IHRtcDsgaSsrKSB7Ci0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCQlJRFRfTEFORV9DVFJMKGkpLCAmcmVndmFsKTsKLQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCQlJRFRfTEFORV9DVFJMKGkpLCByZWd2YWwgfCBJRFRfTEFORV9DVFJMX0dFTlBXKTsKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsIElEVF9MQU5FX0NUUkwoaSksICZyZWd2YWwpOworCQlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsIElEVF9MQU5FX0NUUkwoaSksCisJCQkJICAgIHJlZ3ZhbCB8IElEVF9MQU5FX0NUUkxfR0VOUFcpOwogCX0KIAogCS8qCkBAIC0yOTYsNDEgKzI4NCwzMiBAQAogCSAqLwogCiAJLyogRGlzYWJsZSBKVEFHIGFuZCBJMkMgRXJyb3IgY2FwdHVyZSAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfQVVYX1BPUlRfRVJSX0NBUF9FTiwgMCk7CisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LCBJRFRfQVVYX1BPUlRfRVJSX0NBUF9FTiwgMCk7CiAKIAkvKiBEaXNhYmxlIEpUQUcgYW5kIEkyQyBFcnJvciByZXBvcnRpbmcvbG9nZ2luZyAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfQVVYX0VSUl9SRVBPUlRfRU4sIDApOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX0FVWF9FUlJfUkVQT1JUX0VOLCAwKTsKIAogCS8qIERpc2FibGUgUG9ydC1Xcml0ZSBub3RpZmljYXRpb24gZnJvbSBKVEFHICovCi0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCUlEVF9KVEFHX0NUUkwsIDApOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX0pUQUdfQ1RSTCwgMCk7CiAKIAkvKiBEaXNhYmxlIFBvcnQtV3JpdGUgbm90aWZpY2F0aW9uIGZyb20gSTJDICovCi0JcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJSURUX0kyQ19NQ1RSTCwgJnJlZ3ZhbCk7Ci0JcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCUlEVF9JMkNfTUNUUkwsCi0JCQlyZWd2YWwgJiB+SURUX0kyQ19NQ1RSTF9HRU5QVyk7CisJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsIElEVF9JMkNfTUNUUkwsICZyZWd2YWwpOworCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgSURUX0kyQ19NQ1RSTCwgcmVndmFsICYgfklEVF9JMkNfTUNUUkxfR0VOUFcpOwogCiAJLyoKIAkgKiBDb25maWd1cmUgQ0ZHX0JMSyBlcnJvciByZXBvcnRpbmcuCiAJICovCiAKIAkvKiBEaXNhYmxlIENvbmZpZ3VyYXRpb24gQmxvY2sgZXJyb3IgY2FwdHVyZSAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfQ0ZHQkxLX0VSUl9DQVBUVVJFX0VOLCAwKTsKKwlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsIElEVF9DRkdCTEtfRVJSX0NBUFRVUkVfRU4sIDApOwogCiAJLyogRGlzYWJsZSBQb3J0LVdyaXRlcyBmb3IgQ29uZmlndXJhdGlvbiBCbG9jayBlcnJvciByZXBvcnRpbmcgKi8KLQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfQ0ZHQkxLX0VSUl9SRVBPUlQsICZyZWd2YWwpOwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQlJRFRfQ0ZHQkxLX0VSUl9SRVBPUlQsCi0JCQlyZWd2YWwgJiB+SURUX0NGR0JMS19FUlJfUkVQT1JUX0dFTlBXKTsKKwlyaW9fcmVhZF9jb25maWdfMzIocmRldiwgSURUX0NGR0JMS19FUlJfUkVQT1JULCAmcmVndmFsKTsKKwlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsIElEVF9DRkdCTEtfRVJSX1JFUE9SVCwKKwkJCSAgICByZWd2YWwgJiB+SURUX0NGR0JMS19FUlJfUkVQT1JUX0dFTlBXKTsKIAogCS8qIHNldCBUVkFMID0gfjUwdXMgKi8KLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCXJpb193cml0ZV9jb25maWdfMzIocmRldiwKIAkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX0xJTktUT19DVExfQ1NSLCAweDhlIDw8IDgpOwogCiAJcmV0dXJuIDA7CkBAIC0zMzksMTggKzMxOCwxNSBAQAogc3RhdGljIGludAogaWR0ZzJfZW1faGFuZGxlcihzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTggcG9ydG51bSkKIHsKLQlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQl1OCBob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwogCXUzMiByZWd2YWwsIGVtX3BlcnJkZXQsIGVtX2x0bGVycmRldDsKIAotCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwlyaW9fcmVhZF9jb25maWdfMzIocmRldiwKIAkJcmRldi0+ZW1fZWZwdHIgKyBSSU9fRU1fTFRMX0VSUl9ERVRFQ1QsICZlbV9sdGxlcnJkZXQpOwogCWlmIChlbV9sdGxlcnJkZXQpIHsKIAkJLyogU2VydmljZSBMb2dpY2FsL1RyYW5zcG9ydCBMYXllciBFcnJvcihzKSAqLwogCQlpZiAoZW1fbHRsZXJyZGV0ICYgUkVNX0xUTF9FUlJfSU1QU1BFQykgewogCQkJLyogSW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZXJyb3IgcmVwb3J0ZWQgKi8KLQkJCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJCQlJRFRfSVNMVExfQUREUkVTU19DQVAsICZyZWd2YWwpOwogCiAJCQlwcl9kZWJ1ZygiUklPOiAlcyBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpYyBMVEwgZXJyb3JzIiBcCkBAIC0zNTgsMTMgKzMzNCwxMiBAQAogCQkJCSByaW9fbmFtZShyZGV2KSwgZW1fbHRsZXJyZGV0LCByZWd2YWwpOwogCiAJCQkvKiBDbGVhciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhZGRyZXNzIGNhcHR1cmUgQ1NSICovCi0JCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCQlJRFRfSVNMVExfQUREUkVTU19DQVAsIDApOworCQkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LCBJRFRfSVNMVExfQUREUkVTU19DQVAsIDApOwogCiAJCX0KIAl9CiAKLQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCXJkZXYtPmVtX2VmcHRyICsgUklPX0VNX1BOX0VSUl9ERVRFQ1QocG9ydG51bSksICZlbV9wZXJyZGV0KTsKIAlpZiAoZW1fcGVycmRldCkgewogCQkvKiBTZXJ2aWNlIFBvcnQtTGV2ZWwgRXJyb3IocykgKi8KQEAgLTM3MiwxNCArMzQ3LDE0IEBACiAJCQkvKiBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpYyBwb3J0IGVycm9yIHJlcG9ydGVkICovCiAKIAkJCS8qIEdldCBJUyBlcnJvcnMgcmVwb3J0ZWQgKi8KLQkJCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJCQlJRFRfUE9SVF9JU0VSUl9ERVQocG9ydG51bSksICZyZWd2YWwpOwogCiAJCQlwcl9kZWJ1ZygiUklPOiAlcyBJbXBsZW1lbnRhdGlvbiBTcGVjaWZpYyBQb3J0IiBcCiAJCQkJICIgZXJyb3JzIDB4JXhcbiIsIHJpb19uYW1lKHJkZXYpLCByZWd2YWwpOwogCiAJCQkvKiBDbGVhciBhbGwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZXZlbnRzICovCi0JCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJCQlJRFRfUE9SVF9JU0VSUl9ERVQocG9ydG51bSksIDApOwogCQl9CiAJfQpAQCAtMzkxLDE0ICszNjYsMTAgQEAKIGlkdGcyX3Nob3dfZXJybG9nKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmlvX2RldiAqcmRldiA9IHRvX3Jpb19kZXYoZGV2KTsKLQlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQl1OCBob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwogCXNzaXplX3QgbGVuID0gMDsKIAl1MzIgcmVndmFsOwogCi0Jd2hpbGUgKCFyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJCSBJRFRfRVJSX1JELCAmcmVndmFsKSkgeworCXdoaWxlICghcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsIElEVF9FUlJfUkQsICZyZWd2YWwpKSB7CiAJCWlmICghcmVndmFsKSAgICAvKiAwID0gZW5kIG9mIGxvZyAqLwogCQkJYnJlYWs7CiAJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbiwKQEAgLTQ0NSwzICs0MTYsNSBAQAogCiBERUNMQVJFX1JJT19TV0lUQ0hfSU5JVChSSU9fVklEX0lEVCwgUklPX0RJRF9JRFRDUFMxODQ4LCBpZHRnMl9zd2l0Y2hfaW5pdCk7CiBERUNMQVJFX1JJT19TV0lUQ0hfSU5JVChSSU9fVklEX0lEVCwgUklPX0RJRF9JRFRDUFMxNjE2LCBpZHRnMl9zd2l0Y2hfaW5pdCk7CitERUNMQVJFX1JJT19TV0lUQ0hfSU5JVChSSU9fVklEX0lEVCwgUklPX0RJRF9JRFRWUFMxNjE2LCBpZHRnMl9zd2l0Y2hfaW5pdCk7CitERUNMQVJFX1JJT19TV0lUQ0hfSU5JVChSSU9fVklEX0lEVCwgUklPX0RJRF9JRFRTUFMxNjE2LCBpZHRnMl9zd2l0Y2hfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0Y3BzLmMgYi9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvaWR0Y3BzLmMKaW5kZXggZmM5ZjYzNy4uM2E5NzEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL2lkdGNwcy5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy9pZHRjcHMuYwpAQCAtMTE3LDEwICsxMTcsNiBAQAogCiBzdGF0aWMgaW50IGlkdGNwc19zd2l0Y2hfaW5pdChzdHJ1Y3QgcmlvX2RldiAqcmRldiwgaW50IGRvX2VudW0pCiB7Ci0Jc3RydWN0IHJpb19tcG9ydCAqbXBvcnQgPSByZGV2LT5uZXQtPmhwb3J0OwotCXUxNiBkZXN0aWQgPSByZGV2LT5yc3dpdGNoLT5kZXN0aWQ7Ci0JdTggaG9wY291bnQgPSByZGV2LT5yc3dpdGNoLT5ob3Bjb3VudDsKLQogCXByX2RlYnVnKCJSSU86ICVzIGZvciAlc1xuIiwgX19mdW5jX18sIHJpb19uYW1lKHJkZXYpKTsKIAlyZGV2LT5yc3dpdGNoLT5hZGRfZW50cnkgPSBpZHRjcHNfcm91dGVfYWRkX2VudHJ5OwogCXJkZXYtPnJzd2l0Y2gtPmdldF9lbnRyeSA9IGlkdGNwc19yb3V0ZV9nZXRfZW50cnk7CkBAIC0xMzIsNyArMTI4LDcgQEAKIAogCWlmIChkb19lbnVtKSB7CiAJCS8qIHNldCBUVkFMID0gfjUwdXMgKi8KLQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX0xJTktUT19DVExfQ1NSLCAweDhlIDw8IDgpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL3RzaTU2OC5jIGIvZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL3RzaTU2OC5jCmluZGV4IGI5YTM4OWIuLjM5OTRjMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy90c2k1NjguYworKysgYi9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvdHNpNTY4LmMKQEAgLTExMywyMiArMTEzLDE3IEBACiBzdGF0aWMgaW50CiB0c2k1NjhfZW1faW5pdChzdHJ1Y3QgcmlvX2RldiAqcmRldikKIHsKLQlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQl1OCBob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwogCXUzMiByZWd2YWw7CiAJaW50IHBvcnRudW07CiAKLQlwcl9kZWJ1ZygiVFNJNTY4ICVzIFslZDolZF1cbiIsIF9fZnVuY19fLCBkZXN0aWQsIGhvcGNvdW50KTsKKwlwcl9kZWJ1ZygiVFNJNTY4ICVzIFslZDolZF1cbiIsIF9fZnVuY19fLCByZGV2LT5kZXN0aWQsIHJkZXYtPmhvcGNvdW50KTsKIAogCS8qIE1ha2Ugc3VyZSB0aGF0IFBvcnQtV3JpdGVzIGFyZSBkaXNhYmxlZCAoZm9yIGFsbCBwb3J0cykgKi8KIAlmb3IgKHBvcnRudW0gPSAwOwogCSAgICAgcG9ydG51bSA8IFJJT19HRVRfVE9UQUxfUE9SVFMocmRldi0+c3dwaW5mbyk7IHBvcnRudW0rKykgewotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJVFNJNTY4X1NQX01PREUocG9ydG51bSksICZyZWd2YWwpOwotCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCVRTSTU2OF9TUF9NT0RFKHBvcnRudW0pLAotCQkJCXJlZ3ZhbCB8IFRTSTU2OF9TUF9NT0RFX1BXX0RJUyk7CisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LCBUU0k1NjhfU1BfTU9ERShwb3J0bnVtKSwgJnJlZ3ZhbCk7CisJCXJpb193cml0ZV9jb25maWdfMzIocmRldiwgVFNJNTY4X1NQX01PREUocG9ydG51bSksCisJCQkJICAgIHJlZ3ZhbCB8IFRTSTU2OF9TUF9NT0RFX1BXX0RJUyk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvdHNpNTd4LmMgYi9kcml2ZXJzL3JhcGlkaW8vc3dpdGNoZXMvdHNpNTd4LmMKaW5kZXggMjAwM2ZiNi4uMWE2MjkzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3N3aXRjaGVzL3RzaTU3eC5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9zd2l0Y2hlcy90c2k1N3guYwpAQCAtMTU4LDQ4ICsxNTgsNDUgQEAKIHN0YXRpYyBpbnQKIHRzaTU3eF9lbV9pbml0KHN0cnVjdCByaW9fZGV2ICpyZGV2KQogewotCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0ID0gcmRldi0+bmV0LT5ocG9ydDsKLQl1MTYgZGVzdGlkID0gcmRldi0+cnN3aXRjaC0+ZGVzdGlkOwotCXU4IGhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7CiAJdTMyIHJlZ3ZhbDsKIAlpbnQgcG9ydG51bTsKIAotCXByX2RlYnVnKCJUU0k1NzggJXMgWyVkOiVkXVxuIiwgX19mdW5jX18sIGRlc3RpZCwgaG9wY291bnQpOworCXByX2RlYnVnKCJUU0k1NzggJXMgWyVkOiVkXVxuIiwgX19mdW5jX18sIHJkZXYtPmRlc3RpZCwgcmRldi0+aG9wY291bnQpOwogCiAJZm9yIChwb3J0bnVtID0gMDsKIAkgICAgIHBvcnRudW0gPCBSSU9fR0VUX1RPVEFMX1BPUlRTKHJkZXYtPnN3cGluZm8pOyBwb3J0bnVtKyspIHsKIAkJLyogTWFrZSBzdXJlIHRoYXQgUG9ydC1Xcml0ZXMgYXJlIGVuYWJsZWQgKGZvciBhbGwgcG9ydHMpICovCi0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQkJVFNJNTc4X1NQX01PREUocG9ydG51bSksICZyZWd2YWwpOwotCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsCiAJCQkJVFNJNTc4X1NQX01PREUocG9ydG51bSksCiAJCQkJcmVndmFsICYgflRTSTU3OF9TUF9NT0RFX1BXX0RJUyk7CiAKIAkJLyogQ2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJCXJkZXYtPnBoeXNfZWZwdHIgKwogCQkJCQlSSU9fUE9SVF9OX0VSUl9TVFNfQ1NSKHBvcnRudW0pLAogCQkJCSZyZWd2YWwpOwotCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQlyaW9fd3JpdGVfY29uZmlnXzMyKHJkZXYsCiAJCQkJcmRldi0+cGh5c19lZnB0ciArCiAJCQkJCVJJT19QT1JUX05fRVJSX1NUU19DU1IocG9ydG51bSksCiAJCQkJcmVndmFsICYgMHgwNzEyMDIxNCk7CiAKLQkJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQlyaW9fcmVhZF9jb25maWdfMzIocmRldiwKIAkJCQlUU0k1NzhfU1BfSU5UX1NUQVRVUyhwb3J0bnVtKSwgJnJlZ3ZhbCk7Ci0JCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb193cml0ZV9jb25maWdfMzIocmRldiwKIAkJCQlUU0k1NzhfU1BfSU5UX1NUQVRVUyhwb3J0bnVtKSwKIAkJCQlyZWd2YWwgJiAweDAwMDcwMGJkKTsKIAogCQkvKiBFbmFibGUgYWxsIGludGVycnVwdHMgdG8gYWxsb3cgcG9ydHMgdG8gc2VuZCBhIHBvcnQtd3JpdGUgKi8KLQkJcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQlyaW9fcmVhZF9jb25maWdfMzIocmRldiwKIAkJCQlUU0k1NzhfU1BfQ1RMX0lOREVQKHBvcnRudW0pLCAmcmVndmFsKTsKLQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJCVRTSTU3OF9TUF9DVExfSU5ERVAocG9ydG51bSksCiAJCQkJcmVndmFsIHwgMHgwMDBiMDAwMCk7CiAKIAkJLyogU2tpcCBuZXh0IChvZGQpIHBvcnQgaWYgdGhlIGN1cnJlbnQgcG9ydCBpcyBpbiB4NCBtb2RlICovCi0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fQ1RMX0NTUihwb3J0bnVtKSwKIAkJCQkmcmVndmFsKTsKIAkJaWYgKChyZWd2YWwgJiBSSU9fUE9SVF9OX0NUTF9QV0lEVEgpID09IFJJT19QT1JUX05fQ1RMX1BXSURUSF80KQpAQCAtMjA3LDcgKzIwNCw3IEBACiAJfQogCiAJLyogc2V0IFRWQUwgPSB+NTB1cyAqLwotCXJpb19tcG9ydF93cml0ZV9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTElOS1RPX0NUTF9DU1IsIDB4OWEgPDwgOCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIxNywxNCArMjE0LDEyIEBACiB0c2k1N3hfZW1faGFuZGxlcihzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTggcG9ydG51bSkKIHsKIAlzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCA9IHJkZXYtPm5ldC0+aHBvcnQ7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQl1OCBob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwogCXUzMiBpbnRzdGF0LCBlcnJfc3RhdHVzOwogCWludCBzZW5kY291bnQsIGNoZWNrY291bnQ7CiAJdTggcm91dGVfcG9ydDsKIAl1MzIgcmVndmFsOwogCi0JcmlvX21wb3J0X3JlYWRfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJcmRldi0+cGh5c19lZnB0ciArIFJJT19QT1JUX05fRVJSX1NUU19DU1IocG9ydG51bSksCiAJCQkmZXJyX3N0YXR1cyk7CiAKQEAgLTIzMiwxNSArMjI3LDE1IEBACiAJICAgIChlcnJfc3RhdHVzICYgKFJJT19QT1JUX05fRVJSX1NUU19QV19PVVRfRVMgfAogCQkJICBSSU9fUE9SVF9OX0VSUl9TVFNfUFdfSU5QX0VTKSkpIHsKIAkJLyogUmVtb3ZlIGFueSBxdWV1ZWQgcGFja2V0cyBieSBsb2NraW5nL3VubG9ja2luZyBwb3J0ICovCi0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9DVExfQ1NSKHBvcnRudW0pLAogCQkJJnJlZ3ZhbCk7CiAJCWlmICghKHJlZ3ZhbCAmIFJJT19QT1JUX05fQ1RMX0xPQ0tPVVQpKSB7Ci0JCQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LAogCQkJCXJkZXYtPnBoeXNfZWZwdHIgKyBSSU9fUE9SVF9OX0NUTF9DU1IocG9ydG51bSksCiAJCQkJcmVndmFsIHwgUklPX1BPUlRfTl9DVExfTE9DS09VVCk7CiAJCQl1ZGVsYXkoNTApOwotCQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJCXJpb193cml0ZV9jb25maWdfMzIocmRldiwKIAkJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9DVExfQ1NSKHBvcnRudW0pLAogCQkJCXJlZ3ZhbCk7CiAJCX0KQEAgLTI0OCw3ICsyNDMsNyBAQAogCQkvKiBSZWFkIGZyb20gbGluayBtYWludGVuYW5jZSByZXNwb25zZSByZWdpc3RlciB0byBjbGVhcgogCQkgKiB2YWxpZCBiaXQKIAkJICovCi0JCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJcmlvX3JlYWRfY29uZmlnXzMyKHJkZXYsCiAJCQlyZGV2LT5waHlzX2VmcHRyICsgUklPX1BPUlRfTl9NTlRfUlNQX0NTUihwb3J0bnVtKSwKIAkJCSZyZWd2YWwpOwogCkBAIC0yNTcsMTMgKzI1MiwxMiBAQAogCQkgKi8KIAkJc2VuZGNvdW50ID0gMzsKIAkJd2hpbGUgKHNlbmRjb3VudCkgewotCQkJcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKKwkJCXJpb193cml0ZV9jb25maWdfMzIocmRldiwKIAkJCQkJICBUU0k1NzhfU1BfQ1NfVFgocG9ydG51bSksIDB4NDBmYzgwMDApOwogCQkJY2hlY2tjb3VudCA9IDM7CiAJCQl3aGlsZSAoY2hlY2tjb3VudC0tKSB7CiAJCQkJdWRlbGF5KDUwKTsKLQkJCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIoCi0JCQkJCW1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAorCQkJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJCQlyZGV2LT5waHlzX2VmcHRyICsKIAkJCQkJCVJJT19QT1JUX05fTU5UX1JTUF9DU1IocG9ydG51bSksCiAJCQkJCSZyZWd2YWwpOwpAQCAtMjc3LDI1ICsyNzEsMjMgQEAKIAogZXhpdF9lczoKIAkvKiBDbGVhciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBlcnJvciBzdGF0dXMgYml0cyAqLwotCXJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihtcG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCQkgVFNJNTc4X1NQX0lOVF9TVEFUVVMocG9ydG51bSksICZpbnRzdGF0KTsKKwlyaW9fcmVhZF9jb25maWdfMzIocmRldiwgVFNJNTc4X1NQX0lOVF9TVEFUVVMocG9ydG51bSksICZpbnRzdGF0KTsKIAlwcl9kZWJ1ZygiVFNJNTc4WyV4OiV4XSBTUCVkX0lOVF9TVEFUVVM9MHglMDh4XG4iLAotCQkgZGVzdGlkLCBob3Bjb3VudCwgcG9ydG51bSwgaW50c3RhdCk7CisJCSByZGV2LT5kZXN0aWQsIHJkZXYtPmhvcGNvdW50LCBwb3J0bnVtLCBpbnRzdGF0KTsKIAogCWlmIChpbnRzdGF0ICYgMHgxMDAwMCkgewotCQlyaW9fbXBvcnRfcmVhZF9jb25maWdfMzIobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXJpb19yZWFkX2NvbmZpZ18zMihyZGV2LAogCQkJCVRTSTU3OF9TUF9MVVRfUEVJTkYocG9ydG51bSksICZyZWd2YWwpOwogCQlyZWd2YWwgPSAobXBvcnQtPnN5c19zaXplKSA/IChyZWd2YWwgPj4gMTYpIDogKHJlZ3ZhbCA+PiAyNCk7CiAJCXJvdXRlX3BvcnQgPSByZGV2LT5yc3dpdGNoLT5yb3V0ZV90YWJsZVtyZWd2YWxdOwogCQlwcl9kZWJ1ZygiUklPOiBUU0k1NzhbJXNdIFAlZCBMVVQgUGFyaXR5IEVycm9yIChkZXN0SUQ9JWQpXG4iLAogCQkJcmlvX25hbWUocmRldiksIHBvcnRudW0sIHJlZ3ZhbCk7Ci0JCXRzaTU3eF9yb3V0ZV9hZGRfZW50cnkobXBvcnQsIGRlc3RpZCwgaG9wY291bnQsCisJCXRzaTU3eF9yb3V0ZV9hZGRfZW50cnkobXBvcnQsIHJkZXYtPmRlc3RpZCwgcmRldi0+aG9wY291bnQsCiAJCQkJUklPX0dMT0JBTF9UQUJMRSwgcmVndmFsLCByb3V0ZV9wb3J0KTsKIAl9CiAKLQlyaW9fbXBvcnRfd3JpdGVfY29uZmlnXzMyKG1wb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCSAgVFNJNTc4X1NQX0lOVF9TVEFUVVMocG9ydG51bSksCi0JCQkJICBpbnRzdGF0ICYgMHgwMDA3MDBiZCk7CisJcmlvX3dyaXRlX2NvbmZpZ18zMihyZGV2LCBUU0k1NzhfU1BfSU5UX1NUQVRVUyhwb3J0bnVtKSwKKwkJCSAgICBpbnRzdGF0ICYgMHgwMDA3MDBiZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci84OHBtODYwNy5jCmluZGV4IDJjZTJlYjcuLmRkNjMwODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yLzg4cG04NjA3LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvODhwbTg2MDcuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcG04NjA3X3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJICAgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCSAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgcG04NjA3X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1aW50OF90IHZhbCwgbWFzazsKQEAgLTI2Myw2ICsyNjMsNyBAQAogCXJldCA9IGNob29zZV92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CisJKnNlbGVjdG9yID0gcmV0OwogCXZhbCA9ICh1aW50OF90KShyZXQgPDwgaW5mby0+dm9sX3NoaWZ0KTsKIAltYXNrID0gKCgxIDw8IGluZm8tPnZvbF9uYml0cykgLSAxKSAgPDwgaW5mby0+dm9sX3NoaWZ0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCBkZDMwZTg4Li5lMWQ5NDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTE4NiwxMyArMTg2LDI1IEBACiAJIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSB2b2x0YWdlIHJlZ3VsYXRvcnMgb2YgdGhlCiAJIFBDQVAyIFBNSUMuCiAKK2NvbmZpZyBSRUdVTEFUT1JfTUMxM1hYWF9DT1JFCisJdHJpc3RhdGUKKwogY29uZmlnIFJFR1VMQVRPUl9NQzEzNzgzCiAJdHJpc3RhdGUgIlN1cHBvcnQgcmVndWxhdG9ycyBvbiBGcmVlc2NhbGUgTUMxMzc4MyBQTUlDIgogCWRlcGVuZHMgb24gTUZEX01DMTM3ODMKKwlzZWxlY3QgUkVHVUxBVE9SX01DMTNYWFhfQ09SRQogCWhlbHAKIAkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgcmVndWxhdG9ycyBmb3VuZCBvbiB0aGUgRnJlZXNjYWxlIE1DMTM3ODMKIAkgIFBNSUMuCiAKK2NvbmZpZyBSRUdVTEFUT1JfTUMxMzg5MgorCXRyaXN0YXRlICJTdXBwb3J0IHJlZ3VsYXRvcnMgb24gRnJlZXNjYWxlIE1DMTM4OTIgUE1JQyIKKwlkZXBlbmRzIG9uIE1GRF9NQzEzWFhYCisJc2VsZWN0IFJFR1VMQVRPUl9NQzEzWFhYX0NPUkUKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIHJlZ3VsYXRvcnMgZm91bmQgb24gdGhlIEZyZWVzY2FsZSBNQzEzODkyCisJICBQTUlDLgorCiBjb25maWcgUkVHVUxBVE9SX0FCMzEwMAogCXRyaXN0YXRlICJTVC1Fcmljc3NvbiBBQjMxMDAgUmVndWxhdG9yIGZ1bmN0aW9ucyIKIAlkZXBlbmRzIG9uIEFCMzEwMF9DT1JFCkBAIC0yNTAsNSArMjYyLDE1IEBACiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjU4Nlggdm9sdGFnZSByZWd1bGF0b3IgY2hpcHMuCiAKK2NvbmZpZyBSRUdVTEFUT1JfVFBTNjUyNFgKKwl0cmlzdGF0ZSAiVEkgVFBTNjUyNFggUG93ZXIgcmVndWxhdG9ycyIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1MjRYIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXBzLiBUUFM2NTI0WAorCSAgcHJvdmlkZXMgdGhyZWUgc3RlcC1kb3duIGNvbnZlcnRlcnMgYW5kIHR3byBnZW5lcmFsLXB1cnBvc2UgTERPCisJICB2b2x0YWdlIHJlZ3VsYXRvcnMuICBUaGlzIGRldmljZSBpcyBpbnRlcmZhY2VkIHVzaW5nIGEgY3VzdG9taXplZAorCSAgc2VyaWFsIGludGVyZmFjZSBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIHRoZSBzZXF1ZW5jZXIgc2VyaWFsCisJICBwb3J0IGNvbnRyb2xsZXIuCisKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggYmZmODE1Ny4uMGI1ZTg4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTMwLDEwICszMCwxMyBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9QQ0Y1MDYzMykgKz0gcGNmNTA2MzMtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfUENBUCkgKz0gcGNhcC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9NQzEzNzgzKSArPSBtYzEzNzgzLXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX01DMTM4OTIpICs9IG1jMTM4OTItcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfTUMxM1hYWF9DT1JFKSArPSAgbWMxM3h4eC1yZWd1bGF0b3ItY29yZS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FCMzEwMCkgKz0gYWIzMTAwLm8KIAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTAyMykgKz0gdHBzNjUwMjMtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUwN1gpICs9IHRwczY1MDd4LXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjRYKSArPSB0cHM2NTI0eC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl84OFBNODYwNykgKz0gODhwbTg2MDcubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9JU0w2MjcxQSkgKz0gaXNsNjI3MWEtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQUI4NTAwKQkrPSBhYjg1MDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWIzMTAwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjMxMDAuYwppbmRleCBiMzQ5MjY2Li5lZDZmZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hYjMxMDAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjMxMDAuYwpAQCAtMzYyLDcgKzM2Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWIzMTAwX3NldF92b2x0YWdlX3JlZ3VsYXRvcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVnLAotCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCQl1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IGFiMzEwMF9yZWd1bGF0b3IgKmFicmVnID0gcmVnLT5yZWdfZGF0YTsKIAl1OCByZWd2YWw7CkBAIC0zNzMsNiArMzc0LDggQEAKIAlpZiAoYmVzdGluZGV4IDwgMCkKIAkJcmV0dXJuIGJlc3RpbmRleDsKIAorCSpzZWxlY3RvciA9IGJlc3RpbmRleDsKKwogCWVyciA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYnJlZy0+ZGV2LCAwLAogCQkJCQkJYWJyZWctPnJlZ3JlZywgJnJlZ3ZhbCk7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWI4NTAwLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYwppbmRleCBkYjZiNzBmLi5kOWEwNTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9hYjg1MDAuYwpAQCAtMywxOCArMywxMyBAQAogICoKICAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCiAgKgotICogQXV0aG9yOiBTdW5kYXIgSXllciA8c3VuZGFyLml5ZXJAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yczogU3VuZGFyIEl5ZXIgPHN1bmRhci5peWVyQHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqICAgICAgICAgIEJlbmd0IEpvbnNzb24gPGJlbmd0Lmcuam9uc3NvbkBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCiAgKgogICogQUI4NTAwIHBlcmlwaGVyYWwgcmVndWxhdG9ycwogICoKLSAqIEFCODUwMCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHJlZ3VsYXRvcnMsCi0gKiBMRE9zIC0gVkFVRElPLCBWQU5BTUlDMi8yLCBWRElHTUlDLCBWSU5UQ09SRTEyLCBWVFZPVVQsCi0gKiAgICAgICAgVkFVWDEvMi8zLCBWQU5BCi0gKgotICogZm9yIERCODUwMCBjdXQgMS4wIGFuZCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgc2lsaWNvbiwgYWxsIGFjY2Vzc2VzCi0gKiB0byByZWdpc3RlcnMgYXJlIHRocm91Z2ggdGhlIERCODUwMCBTUEkuIEluIGN1dCAxLjEgb253YXJkcywgdGhlc2UKLSAqIGFjY2Vzc2VzIGFyZSB0aHJvdWdoIHRoZSBEQjg1MDAgUFJDTVUgSTJDCi0gKgorICogQUI4NTAwIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcmVndWxhdG9yczoKKyAqICAgVkFVWDEvMi8zLCBWSU5UQ09SRSwgVlRWT1VULCBWQVVESU8sIFZBTUlDMS8yLCBWRE1JQywgVkFOQQogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjgsMzggKzIzLDM3IEBACiAKIC8qKgogICogc3RydWN0IGFiODUwMF9yZWd1bGF0b3JfaW5mbyAtIGFiODUwMCByZWd1bGF0b3IgaW5mb3JtYXRpb24KKyAqIEBkZXY6IGRldmljZSBwb2ludGVyCiAgKiBAZGVzYzogcmVndWxhdG9yIGRlc2NyaXB0aW9uCi0gKiBAYWI4NTAwOiBhYjg1MDAgcGFyZW50CiAgKiBAcmVndWxhdG9yX2RldjogcmVndWxhdG9yIGRldmljZQogICogQG1heF91VjogbWF4aW11bSB2b2x0YWdlIChmb3IgdmFyaWFibGUgdm9sdGFnZSBzdXBwbGllcykKICAqIEBtaW5fdVY6IG1pbmltdW0gdm9sdGFnZSAoZm9yIHZhcmlhYmxlIHZvbHRhZ2Ugc3VwcGxpZXMpCiAgKiBAZml4ZWRfdVY6IHR5cGljYWwgdm9sdGFnZSAoZm9yIGZpeGVkIHZvbHRhZ2Ugc3VwcGxpZXMpCiAgKiBAdXBkYXRlX2Jhbms6IGJhbmsgdG8gY29udHJvbCBvbi9vZmYKICAqIEB1cGRhdGVfcmVnOiByZWdpc3RlciB0byBjb250cm9sIG9uL29mZgotICogQG1hc2s6IG1hc2sgdG8gZW5hYmxlL2Rpc2FibGUgcmVndWxhdG9yCi0gKiBAZW5hYmxlOiBiaXRzIHRvIGVuYWJsZSB0aGUgcmVndWxhdG9yIGluIG5vcm1hbChoaWdoIHBvd2VyKSBtb2RlCisgKiBAdXBkYXRlX21hc2s6IG1hc2sgdG8gZW5hYmxlL2Rpc2FibGUgcmVndWxhdG9yCisgKiBAdXBkYXRlX3ZhbF9lbmFibGU6IGJpdHMgdG8gZW5hYmxlIHRoZSByZWd1bGF0b3IgaW4gbm9ybWFsIChoaWdoIHBvd2VyKSBtb2RlCiAgKiBAdm9sdGFnZV9iYW5rOiBiYW5rIHRvIGNvbnRyb2wgcmVndWxhdG9yIHZvbHRhZ2UKICAqIEB2b2x0YWdlX3JlZzogcmVnaXN0ZXIgdG8gY29udHJvbCByZWd1bGF0b3Igdm9sdGFnZQogICogQHZvbHRhZ2VfbWFzazogbWFzayB0byBjb250cm9sIHJlZ3VsYXRvciB2b2x0YWdlCi0gKiBAc3VwcG9ydGVkX3ZvbHRhZ2VzOiBzdXBwb3J0ZWQgdm9sdGFnZSB0YWJsZQorICogQHZvbHRhZ2VzOiBzdXBwb3J0ZWQgdm9sdGFnZSB0YWJsZQogICogQHZvbHRhZ2VzX2xlbjogbnVtYmVyIG9mIHN1cHBvcnRlZCB2b2x0YWdlcyBmb3IgdGhlIHJlZ3VsYXRvcgogICovCiBzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCByZWd1bGF0b3JfZGVzYwlkZXNjOwotCXN0cnVjdCBhYjg1MDAJCSphYjg1MDA7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYJKnJlZ3VsYXRvcjsKIAlpbnQgbWF4X3VWOwogCWludCBtaW5fdVY7CiAJaW50IGZpeGVkX3VWOwogCXU4IHVwZGF0ZV9iYW5rOwogCXU4IHVwZGF0ZV9yZWc7Ci0JdTggbWFzazsKLQl1OCBlbmFibGU7CisJdTggdXBkYXRlX21hc2s7CisJdTggdXBkYXRlX3ZhbF9lbmFibGU7CiAJdTggdm9sdGFnZV9iYW5rOwogCXU4IHZvbHRhZ2VfcmVnOwogCXU4IHZvbHRhZ2VfbWFzazsKLQlpbnQgY29uc3QgKnN1cHBvcnRlZF92b2x0YWdlczsKKwlpbnQgY29uc3QgKnZvbHRhZ2VzOwogCWludCB2b2x0YWdlc19sZW47CiB9OwogCkBAIC04Myw2ICs3NywxNyBAQAogCTMzMDAwMDAsCiB9OwogCitzdGF0aWMgY29uc3QgaW50IGxkb192YXV4M192b2x0YWdlc1tdID0geworCTEyMDAwMDAsCisJMTUwMDAwMCwKKwkxODAwMDAwLAorCTIxMDAwMDAsCisJMjUwMDAwMCwKKwkyNzUwMDAwLAorCTI3OTAwMDAsCisJMjkxMDAwMCwKK307CisKIHN0YXRpYyBjb25zdCBpbnQgbGRvX3ZpbnRjb3JlX3ZvbHRhZ2VzW10gPSB7CiAJMTIwMDAwMCwKIAkxMjI1MDAwLApAQCAtOTUsNTcgKzEwMCw4MCBAQAogCiBzdGF0aWMgaW50IGFiODUwMF9yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewotCWludCByZWd1bGF0b3JfaWQsIHJldDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhYjg1MDBfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCi0JcmVndWxhdG9yX2lkID0gcmRldl9nZXRfaWQocmRldik7Ci0JaWYgKHJlZ3VsYXRvcl9pZCA+PSBBQjg1MDBfTlVNX1JFR1VMQVRPUlMpCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKHJkZXZfZ2V0X2RldihyZGV2KSwgInJlZ3VsYXRvciBpbmZvIG51bGwgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShpbmZvLT5kZXYsCi0JCWluZm8tPnVwZGF0ZV9iYW5rLCBpbmZvLT51cGRhdGVfcmVnLCBpbmZvLT5tYXNrLCBpbmZvLT5lbmFibGUpOworCQlpbmZvLT51cGRhdGVfYmFuaywgaW5mby0+dXBkYXRlX3JlZywKKwkJaW5mby0+dXBkYXRlX21hc2ssIGluZm8tPnVwZGF0ZV92YWxfZW5hYmxlKTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycihyZGV2X2dldF9kZXYocmRldiksCiAJCQkiY291bGRuJ3Qgc2V0IGVuYWJsZSBiaXRzIGZvciByZWd1bGF0b3JcbiIpOworCisJZGV2X3ZkYmcocmRldl9nZXRfZGV2KHJkZXYpLAorCQkiJXMtZW5hYmxlIChiYW5rLCByZWcsIG1hc2ssIHZhbHVlKTogMHgleCwgMHgleCwgMHgleCwgMHgleFxuIiwKKwkJaW5mby0+ZGVzYy5uYW1lLCBpbmZvLT51cGRhdGVfYmFuaywgaW5mby0+dXBkYXRlX3JlZywKKwkJaW5mby0+dXBkYXRlX21hc2ssIGluZm8tPnVwZGF0ZV92YWxfZW5hYmxlKTsKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewotCWludCByZWd1bGF0b3JfaWQsIHJldDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhYjg1MDBfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCi0JcmVndWxhdG9yX2lkID0gcmRldl9nZXRfaWQocmRldik7Ci0JaWYgKHJlZ3VsYXRvcl9pZCA+PSBBQjg1MDBfTlVNX1JFR1VMQVRPUlMpCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKHJkZXZfZ2V0X2RldihyZGV2KSwgInJlZ3VsYXRvciBpbmZvIG51bGwgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShpbmZvLT5kZXYsCi0JCWluZm8tPnVwZGF0ZV9iYW5rLCBpbmZvLT51cGRhdGVfcmVnLCBpbmZvLT5tYXNrLCAweDApOworCQlpbmZvLT51cGRhdGVfYmFuaywgaW5mby0+dXBkYXRlX3JlZywKKwkJaW5mby0+dXBkYXRlX21hc2ssIDB4MCk7CiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIocmRldl9nZXRfZGV2KHJkZXYpLAogCQkJImNvdWxkbid0IHNldCBkaXNhYmxlIGJpdHMgZm9yIHJlZ3VsYXRvclxuIik7CisKKwlkZXZfdmRiZyhyZGV2X2dldF9kZXYocmRldiksCisJCSIlcy1kaXNhYmxlIChiYW5rLCByZWcsIG1hc2ssIHZhbHVlKTogMHgleCwgMHgleCwgMHgleCwgMHgleFxuIiwKKwkJaW5mby0+ZGVzYy5uYW1lLCBpbmZvLT51cGRhdGVfYmFuaywgaW5mby0+dXBkYXRlX3JlZywKKwkJaW5mby0+dXBkYXRlX21hc2ssIDB4MCk7CisKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9yZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKLQlpbnQgcmVndWxhdG9yX2lkLCByZXQ7CisJaW50IHJldDsKIAlzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQl1OCB2YWx1ZTsKKwl1OCByZWd2YWw7CiAKLQlyZWd1bGF0b3JfaWQgPSByZGV2X2dldF9pZChyZGV2KTsKLQlpZiAocmVndWxhdG9yX2lkID49IEFCODUwMF9OVU1fUkVHVUxBVE9SUykKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIocmRldl9nZXRfZGV2KHJkZXYpLCAicmVndWxhdG9yIGluZm8gbnVsbCBwb2ludGVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGluZm8tPmRldiwKLQkJaW5mby0+dXBkYXRlX2JhbmssIGluZm8tPnVwZGF0ZV9yZWcsICZ2YWx1ZSk7CisJCWluZm8tPnVwZGF0ZV9iYW5rLCBpbmZvLT51cGRhdGVfcmVnLCAmcmVndmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHJkZXZfZ2V0X2RldihyZGV2KSwKIAkJCSJjb3VsZG4ndCByZWFkIDB4JXggcmVnaXN0ZXJcbiIsIGluZm8tPnVwZGF0ZV9yZWcpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICh2YWx1ZSAmIGluZm8tPm1hc2spCisJZGV2X3ZkYmcocmRldl9nZXRfZGV2KHJkZXYpLAorCQkiJXMtaXNfZW5hYmxlZCAoYmFuaywgcmVnLCBtYXNrLCB2YWx1ZSk6IDB4JXgsIDB4JXgsIDB4JXgsIgorCQkiIDB4JXhcbiIsCisJCWluZm8tPmRlc2MubmFtZSwgaW5mby0+dXBkYXRlX2JhbmssIGluZm8tPnVwZGF0ZV9yZWcsCisJCWluZm8tPnVwZGF0ZV9tYXNrLCByZWd2YWwpOworCisJaWYgKHJlZ3ZhbCAmIGluZm8tPnVwZGF0ZV9tYXNrKQogCQlyZXR1cm4gdHJ1ZTsKIAllbHNlCiAJCXJldHVybiBmYWxzZTsKQEAgLTE1MywxMiArMTgxLDEyIEBACiAKIHN0YXRpYyBpbnQgYWI4NTAwX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgdW5zaWduZWQgc2VsZWN0b3IpCiB7Ci0JaW50IHJlZ3VsYXRvcl9pZDsKIAlzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAotCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCWlmIChyZWd1bGF0b3JfaWQgPj0gQUI4NTAwX05VTV9SRUdVTEFUT1JTKQorCWlmIChpbmZvID09IE5VTEwpIHsKKwkJZGV2X2VycihyZGV2X2dldF9kZXYocmRldiksICJyZWd1bGF0b3IgaW5mbyBudWxsIHBvaW50ZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiByZXR1cm4gdGhlIHVWIGZvciB0aGUgZml4ZWQgcmVndWxhdG9ycyAqLwogCWlmIChpbmZvLT5maXhlZF91VikKQEAgLTE2NywzMyArMTk1LDQwIEBACiAJaWYgKHNlbGVjdG9yID49IGluZm8tPnZvbHRhZ2VzX2xlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gaW5mby0+c3VwcG9ydGVkX3ZvbHRhZ2VzW3NlbGVjdG9yXTsKKwlyZXR1cm4gaW5mby0+dm9sdGFnZXNbc2VsZWN0b3JdOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7Ci0JaW50IHJlZ3VsYXRvcl9pZCwgcmV0OworCWludCByZXQsIHZhbDsKIAlzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQl1OCB2YWx1ZTsKKwl1OCByZWd2YWw7CiAKLQlyZWd1bGF0b3JfaWQgPSByZGV2X2dldF9pZChyZGV2KTsKLQlpZiAocmVndWxhdG9yX2lkID49IEFCODUwMF9OVU1fUkVHVUxBVE9SUykKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIocmRldl9nZXRfZGV2KHJkZXYpLCAicmVndWxhdG9yIGluZm8gbnVsbCBwb2ludGVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGluZm8tPmRldiwgaW5mby0+dm9sdGFnZV9iYW5rLAotCQlpbmZvLT52b2x0YWdlX3JlZywgJnZhbHVlKTsKKwlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoaW5mby0+ZGV2LAorCQkJaW5mby0+dm9sdGFnZV9iYW5rLCBpbmZvLT52b2x0YWdlX3JlZywgJnJlZ3ZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihyZGV2X2dldF9kZXYocmRldiksCiAJCQkiY291bGRuJ3QgcmVhZCB2b2x0YWdlIHJlZyBmb3IgcmVndWxhdG9yXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlkZXZfdmRiZyhyZGV2X2dldF9kZXYocmRldiksCisJCSIlcy1nZXRfdm9sdGFnZSAoYmFuaywgcmVnLCBtYXNrLCB2YWx1ZSk6IDB4JXgsIDB4JXgsIDB4JXgsIgorCQkiIDB4JXhcbiIsCisJCWluZm8tPmRlc2MubmFtZSwgaW5mby0+dm9sdGFnZV9iYW5rLCBpbmZvLT52b2x0YWdlX3JlZywKKwkJaW5mby0+dm9sdGFnZV9tYXNrLCByZWd2YWwpOworCiAJLyogdmludGNvcmUgaGFzIGEgZGlmZmVyZW50IGxheW91dCAqLwotCXZhbHVlICY9IGluZm8tPnZvbHRhZ2VfbWFzazsKLQlpZiAocmVndWxhdG9yX2lkID09IEFCODUwMF9MRE9fSU5UQ09SRSkKLQkJcmV0ID0gaW5mby0+c3VwcG9ydGVkX3ZvbHRhZ2VzW3ZhbHVlID4+IDB4M107CisJdmFsID0gcmVndmFsICYgaW5mby0+dm9sdGFnZV9tYXNrOworCWlmIChpbmZvLT5kZXNjLmlkID09IEFCODUwMF9MRE9fSU5UQ09SRSkKKwkJcmV0ID0gaW5mby0+dm9sdGFnZXNbdmFsID4+IDB4M107CiAJZWxzZQotCQlyZXQgPSBpbmZvLT5zdXBwb3J0ZWRfdm9sdGFnZXNbdmFsdWVdOworCQlyZXQgPSBpbmZvLT52b2x0YWdlc1t2YWxdOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIwNiw4ICsyNDEsOCBAQAogCiAJLyogY2hlY2sgdGhlIHN1cHBvcnRlZCB2b2x0YWdlICovCiAJZm9yIChpID0gMDsgaSA8IGluZm8tPnZvbHRhZ2VzX2xlbjsgaSsrKSB7Ci0JCWlmICgoaW5mby0+c3VwcG9ydGVkX3ZvbHRhZ2VzW2ldID49IG1pbl91VikgJiYKLQkJICAgIChpbmZvLT5zdXBwb3J0ZWRfdm9sdGFnZXNbaV0gPD0gbWF4X3VWKSkKKwkJaWYgKChpbmZvLT52b2x0YWdlc1tpXSA+PSBtaW5fdVYpICYmCisJCSAgICAoaW5mby0+dm9sdGFnZXNbaV0gPD0gbWF4X3VWKSkKIAkJCXJldHVybiBpOwogCX0KIApAQCAtMjE1LDE0ICsyNTAsMTcgQEAKIH0KIAogc3RhdGljIGludCBhYjg1MDBfcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCQl1bnNpZ25lZCAqc2VsZWN0b3IpCiB7Ci0JaW50IHJlZ3VsYXRvcl9pZCwgcmV0OworCWludCByZXQ7CiAJc3RydWN0IGFiODUwMF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJdTggcmVndmFsOwogCi0JcmVndWxhdG9yX2lkID0gcmRldl9nZXRfaWQocmRldik7Ci0JaWYgKHJlZ3VsYXRvcl9pZCA+PSBBQjg1MDBfTlVNX1JFR1VMQVRPUlMpCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKHJkZXZfZ2V0X2RldihyZGV2KSwgInJlZ3VsYXRvciBpbmZvIG51bGwgcG9pbnRlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qIGdldCB0aGUgYXBwcm9wcmlhdGUgdm9sdGFnZXMgd2l0aGluIHRoZSByYW5nZSAqLwogCXJldCA9IGFiODUwMF9nZXRfYmVzdF92b2x0YWdlX2luZGV4KHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKQEAgLTIzMiwxNCArMjcwLDIzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJKnNlbGVjdG9yID0gcmV0OworCiAJLyogc2V0IHRoZSByZWdpc3RlcnMgZm9yIHRoZSByZXF1ZXN0ICovCisJcmVndmFsID0gKHU4KXJldDsKIAlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoaW5mby0+ZGV2LAotCQlpbmZvLT52b2x0YWdlX2JhbmssIGluZm8tPnZvbHRhZ2VfcmVnLAotCQlpbmZvLT52b2x0YWdlX21hc2ssICh1OClyZXQpOworCQkJaW5mby0+dm9sdGFnZV9iYW5rLCBpbmZvLT52b2x0YWdlX3JlZywKKwkJCWluZm8tPnZvbHRhZ2VfbWFzaywgcmVndmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycihyZGV2X2dldF9kZXYocmRldiksCiAJCSJjb3VsZG4ndCBzZXQgdm9sdGFnZSByZWcgZm9yIHJlZ3VsYXRvclxuIik7CiAKKwlkZXZfdmRiZyhyZGV2X2dldF9kZXYocmRldiksCisJCSIlcy1zZXRfdm9sdGFnZSAoYmFuaywgcmVnLCBtYXNrLCB2YWx1ZSk6IDB4JXgsIDB4JXgsIDB4JXgsIgorCQkiIDB4JXhcbiIsCisJCWluZm8tPmRlc2MubmFtZSwgaW5mby0+dm9sdGFnZV9iYW5rLCBpbmZvLT52b2x0YWdlX3JlZywKKwkJaW5mby0+dm9sdGFnZV9tYXNrLCByZWd2YWwpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjU0LDE3ICszMDEsMTcgQEAKIAogc3RhdGljIGludCBhYjg1MDBfZml4ZWRfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7Ci0JaW50IHJlZ3VsYXRvcl9pZDsKIAlzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAotCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCWlmIChyZWd1bGF0b3JfaWQgPj0gQUI4NTAwX05VTV9SRUdVTEFUT1JTKQorCWlmIChpbmZvID09IE5VTEwpIHsKKwkJZGV2X2VycihyZGV2X2dldF9kZXYocmRldiksICJyZWd1bGF0b3IgaW5mbyBudWxsIHBvaW50ZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gaW5mby0+Zml4ZWRfdVY7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhYjg1MDBfbGRvX2ZpeGVkX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhYjg1MDBfcmVndWxhdG9yX2ZpeGVkX29wcyA9IHsKIAkuZW5hYmxlCQk9IGFiODUwMF9yZWd1bGF0b3JfZW5hYmxlLAogCS5kaXNhYmxlCT0gYWI4NTAwX3JlZ3VsYXRvcl9kaXNhYmxlLAogCS5pc19lbmFibGVkCT0gYWI4NTAwX3JlZ3VsYXRvcl9pc19lbmFibGVkLApAQCAtMjcyLDg5ICszMTksMTk4IEBACiAJLmxpc3Rfdm9sdGFnZQk9IGFiODUwMF9saXN0X3ZvbHRhZ2UsCiB9OwogCi0jZGVmaW5lIEFCODUwMF9MRE8oX2lkLCBtaW4sIG1heCwgYmFuaywgcmVnLCByZWdfbWFzaywJCVwKLQkJcmVnX2VuYWJsZSwgdm9sdF9iYW5rLCB2b2x0X3JlZywgdm9sdF9tYXNrLAlcCi0JCXZvbHRhZ2VzLCBsZW5fdm9sdHMpCQkJCVwKLXsJCQkJCQkJCVwKLQkuZGVzYwk9IHsJCQkJCQlcCi0JCS5uYW1lCT0gIkxETy0iICNfaWQsCQkJCVwKLQkJLm9wcwk9ICZhYjg1MDBfcmVndWxhdG9yX29wcywJCVwKLQkJLnR5cGUJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCi0JCS5pZAk9IEFCODUwMF9MRE9fIyNfaWQsCQkJXAotCQkub3duZXIJPSBUSElTX01PRFVMRSwJCQkJXAotCX0sCQkJCQkJCVwKLQkubWluX3VWCQk9IChtaW4pICogMTAwMCwJCQkJXAotCS5tYXhfdVYJCT0gKG1heCkgKiAxMDAwLAkJCQlcCi0JLnVwZGF0ZV9iYW5rCT0gYmFuaywJCQkJCVwKLQkudXBkYXRlX3JlZwk9IHJlZywJCQkJCVwKLQkubWFzawkJPSByZWdfbWFzaywJCQkJXAotCS5lbmFibGUJCT0gcmVnX2VuYWJsZSwJCQkJXAotCS52b2x0YWdlX2JhbmsJPSB2b2x0X2JhbmssCQkJCVwKLQkudm9sdGFnZV9yZWcJPSB2b2x0X3JlZywJCQkJXAotCS52b2x0YWdlX21hc2sJPSB2b2x0X21hc2ssCQkJCVwKLQkuc3VwcG9ydGVkX3ZvbHRhZ2VzID0gdm9sdGFnZXMsCQkJCVwKLQkudm9sdGFnZXNfbGVuCT0gbGVuX3ZvbHRzLAkJCQlcCi0JLmZpeGVkX3VWCT0gMCwJCQkJCVwKLX0KLQotI2RlZmluZSBBQjg1MDBfRklYRURfTERPKF9pZCwgZml4ZWQsIGJhbmssIHJlZywJCVwKLQkJCXJlZ19tYXNrLCByZWdfZW5hYmxlKQkJXAotewkJCQkJCQlcCi0JLmRlc2MJPSB7CQkJCQlcCi0JCS5uYW1lCT0gIkxETy0iICNfaWQsCQkJXAotCQkub3BzCT0gJmFiODUwMF9sZG9fZml4ZWRfb3BzLAlcCi0JCS50eXBlCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCQlcCi0JCS5pZAk9IEFCODUwMF9MRE9fIyNfaWQsCQlcCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAkJCVwKLQl9LAkJCQkJCVwKLQkuZml4ZWRfdVYJPSBmaXhlZCAqIDEwMDAsCQkJXAotCS51cGRhdGVfYmFuawk9IGJhbmssCQkJCVwKLQkudXBkYXRlX3JlZwk9IHJlZywJCQkJXAotCS5tYXNrCQk9IHJlZ19tYXNrLAkJCVwKLQkuZW5hYmxlCQk9IHJlZ19lbmFibGUsCQkJXAotfQotCi1zdGF0aWMgc3RydWN0IGFiODUwMF9yZWd1bGF0b3JfaW5mbyBhYjg1MDBfcmVndWxhdG9yX2luZm9bXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvCisJCWFiODUwMF9yZWd1bGF0b3JfaW5mb1tBQjg1MDBfTlVNX1JFR1VMQVRPUlNdID0gewogCS8qCi0JICogVmFyaWFibGUgVm9sdGFnZSBMRE9zCi0JICogbmFtZSwgbWluIHVWLCBtYXggdVYsIGN0cmwgYmFuaywgY3RybCByZWcsIHJlZyBtYXNrLCBlbmFibGUgbWFzaywKLQkgKiAgICAgIHZvbHQgY3RybCBiYW5rLCB2b2x0IGN0cmwgcmVnLCB2b2x0IGN0cmwgbWFzaywgdm9sdCB0YWJsZSwKLQkgKiAgICAgIG51bSBzdXBwb3J0ZWQgdm9sdHMKKwkgKiBWYXJpYWJsZSBWb2x0YWdlIFJlZ3VsYXRvcnMKKwkgKiAgIG5hbWUsIG1pbiBtViwgbWF4IG1WLAorCSAqICAgdXBkYXRlIGJhbmssIHJlZywgbWFzaywgZW5hYmxlIHZhbAorCSAqICAgdm9sdCBiYW5rLCByZWcsIG1hc2ssIHRhYmxlLCB0YWJsZSBsZW5ndGgKIAkgKi8KLQlBQjg1MDBfTERPKEFVWDEsIDExMDAsIDMzMDAsIDB4MDQsIDB4MDksIDB4MywgMHgxLCAweDA0LCAweDFmLCAweGYsCi0JCQlsZG9fdmF1eG5fdm9sdGFnZXMsIEFSUkFZX1NJWkUobGRvX3ZhdXhuX3ZvbHRhZ2VzKSksCi0JQUI4NTAwX0xETyhBVVgyLCAxMTAwLCAzMzAwLCAweDA0LCAweDA5LCAweGMsIDB4NCwgMHgwNCwgMHgyMCwgMHhmLAotCQkJbGRvX3ZhdXhuX3ZvbHRhZ2VzLCBBUlJBWV9TSVpFKGxkb192YXV4bl92b2x0YWdlcykpLAotCUFCODUwMF9MRE8oQVVYMywgMTEwMCwgMzMwMCwgMHgwNCwgMHgwYSwgMHgzLCAweDEsIDB4MDQsIDB4MjEsIDB4ZiwKLQkJCWxkb192YXV4bl92b2x0YWdlcywgQVJSQVlfU0laRShsZG9fdmF1eG5fdm9sdGFnZXMpKSwKLQlBQjg1MDBfTERPKElOVENPUkUsIDExMDAsIDMzMDAsIDB4MDMsIDB4ODAsIDB4NCwgMHg0LCAweDAzLCAweDgwLCAweDM4LAotCQlsZG9fdmludGNvcmVfdm9sdGFnZXMsIEFSUkFZX1NJWkUobGRvX3ZpbnRjb3JlX3ZvbHRhZ2VzKSksCisJW0FCODUwMF9MRE9fQVVYMV0gPSB7CisJCS5kZXNjID0geworCQkJLm5hbWUJCT0gIkxETy1BVVgxIiwKKwkJCS5vcHMJCT0gJmFiODUwMF9yZWd1bGF0b3Jfb3BzLAorCQkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCQkuaWQJCT0gQUI4NTAwX0xET19BVVgxLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGxkb192YXV4bl92b2x0YWdlcyksCisJCX0sCisJCS5taW5fdVYJCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCQk9IDMzMDAwMDAsCisJCS51cGRhdGVfYmFuawkJPSAweDA0LAorCQkudXBkYXRlX3JlZwkJPSAweDA5LAorCQkudXBkYXRlX21hc2sJCT0gMHgwMywKKwkJLnVwZGF0ZV92YWxfZW5hYmxlCT0gMHgwMSwKKwkJLnZvbHRhZ2VfYmFuawkJPSAweDA0LAorCQkudm9sdGFnZV9yZWcJCT0gMHgxZiwKKwkJLnZvbHRhZ2VfbWFzawkJPSAweDBmLAorCQkudm9sdGFnZXMJCT0gbGRvX3ZhdXhuX3ZvbHRhZ2VzLAorCQkudm9sdGFnZXNfbGVuCQk9IEFSUkFZX1NJWkUobGRvX3ZhdXhuX3ZvbHRhZ2VzKSwKKwl9LAorCVtBQjg1MDBfTERPX0FVWDJdID0geworCQkuZGVzYyA9IHsKKwkJCS5uYW1lCQk9ICJMRE8tQVVYMiIsCisJCQkub3BzCQk9ICZhYjg1MDBfcmVndWxhdG9yX29wcywKKwkJCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkJLmlkCQk9IEFCODUwMF9MRE9fQVVYMiwKKwkJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJCS5uX3ZvbHRhZ2VzCT0gQVJSQVlfU0laRShsZG9fdmF1eG5fdm9sdGFnZXMpLAorCQl9LAorCQkubWluX3VWCQkJPSAxMTAwMDAwLAorCQkubWF4X3VWCQkJPSAzMzAwMDAwLAorCQkudXBkYXRlX2JhbmsJCT0gMHgwNCwKKwkJLnVwZGF0ZV9yZWcJCT0gMHgwOSwKKwkJLnVwZGF0ZV9tYXNrCQk9IDB4MGMsCisJCS51cGRhdGVfdmFsX2VuYWJsZQk9IDB4MDQsCisJCS52b2x0YWdlX2JhbmsJCT0gMHgwNCwKKwkJLnZvbHRhZ2VfcmVnCQk9IDB4MjAsCisJCS52b2x0YWdlX21hc2sJCT0gMHgwZiwKKwkJLnZvbHRhZ2VzCQk9IGxkb192YXV4bl92b2x0YWdlcywKKwkJLnZvbHRhZ2VzX2xlbgkJPSBBUlJBWV9TSVpFKGxkb192YXV4bl92b2x0YWdlcyksCisJfSwKKwlbQUI4NTAwX0xET19BVVgzXSA9IHsKKwkJLmRlc2MgPSB7CisJCQkubmFtZQkJPSAiTERPLUFVWDMiLAorCQkJLm9wcwkJPSAmYWI4NTAwX3JlZ3VsYXRvcl9vcHMsCisJCQkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJCS5pZAkJPSBBQjg1MDBfTERPX0FVWDMsCisJCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCQkubl92b2x0YWdlcwk9IEFSUkFZX1NJWkUobGRvX3ZhdXgzX3ZvbHRhZ2VzKSwKKwkJfSwKKwkJLm1pbl91VgkJCT0gMTEwMDAwMCwKKwkJLm1heF91VgkJCT0gMzMwMDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDQsCisJCS51cGRhdGVfcmVnCQk9IDB4MGEsCisJCS51cGRhdGVfbWFzawkJPSAweDAzLAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDAxLAorCQkudm9sdGFnZV9iYW5rCQk9IDB4MDQsCisJCS52b2x0YWdlX3JlZwkJPSAweDIxLAorCQkudm9sdGFnZV9tYXNrCQk9IDB4MDcsCisJCS52b2x0YWdlcwkJPSBsZG9fdmF1eDNfdm9sdGFnZXMsCisJCS52b2x0YWdlc19sZW4JCT0gQVJSQVlfU0laRShsZG9fdmF1eDNfdm9sdGFnZXMpLAorCX0sCisJW0FCODUwMF9MRE9fSU5UQ09SRV0gPSB7CisJCS5kZXNjID0geworCQkJLm5hbWUJCT0gIkxETy1JTlRDT1JFIiwKKwkJCS5vcHMJCT0gJmFiODUwMF9yZWd1bGF0b3Jfb3BzLAorCQkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCQkuaWQJCT0gQUI4NTAwX0xET19JTlRDT1JFLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGxkb192aW50Y29yZV92b2x0YWdlcyksCisJCX0sCisJCS5taW5fdVYJCQk9IDExMDAwMDAsCisJCS5tYXhfdVYJCQk9IDMzMDAwMDAsCisJCS51cGRhdGVfYmFuawkJPSAweDAzLAorCQkudXBkYXRlX3JlZwkJPSAweDgwLAorCQkudXBkYXRlX21hc2sJCT0gMHg0NCwKKwkJLnVwZGF0ZV92YWxfZW5hYmxlCT0gMHgwNCwKKwkJLnZvbHRhZ2VfYmFuawkJPSAweDAzLAorCQkudm9sdGFnZV9yZWcJCT0gMHg4MCwKKwkJLnZvbHRhZ2VfbWFzawkJPSAweDM4LAorCQkudm9sdGFnZXMJCT0gbGRvX3ZpbnRjb3JlX3ZvbHRhZ2VzLAorCQkudm9sdGFnZXNfbGVuCQk9IEFSUkFZX1NJWkUobGRvX3ZpbnRjb3JlX3ZvbHRhZ2VzKSwKKwl9LAogCiAJLyoKLQkgKiBGaXhlZCBWb2x0YWdlIExET3MKLQkgKgkJIG5hbWUsCW8vcCB1ViwgY3RybCBiYW5rLCBjdHJsIHJlZywgZW5hYmxlLCBkaXNhYmxlCisJICogRml4ZWQgVm9sdGFnZSBSZWd1bGF0b3JzCisJICogICBuYW1lLCBmaXhlZCBtViwKKwkgKiAgIHVwZGF0ZSBiYW5rLCByZWcsIG1hc2ssIGVuYWJsZSB2YWwKIAkgKi8KLQlBQjg1MDBfRklYRURfTERPKFRWT1VULAkgIDIwMDAsIDB4MDMsICAgICAgMHg4MCwgICAgIDB4MiwgICAgMHgyKSwKLQlBQjg1MDBfRklYRURfTERPKEFVRElPLCAgIDIwMDAsIDB4MDMsICAgICAgMHg4MywgICAgIDB4MiwgICAgMHgyKSwKLQlBQjg1MDBfRklYRURfTERPKEFOQU1JQzEsIDIwNTAsIDB4MDMsICAgICAgMHg4MywgICAgIDB4NCwgICAgMHg0KSwKLQlBQjg1MDBfRklYRURfTERPKEFOQU1JQzIsIDIwNTAsIDB4MDMsICAgICAgMHg4MywgICAgIDB4OCwgICAgMHg4KSwKLQlBQjg1MDBfRklYRURfTERPKERNSUMsICAgIDE4MDAsIDB4MDMsICAgICAgMHg4MywgICAgIDB4MTAsICAgMHgxMCksCi0JQUI4NTAwX0ZJWEVEX0xETyhBTkEsICAgICAxMjAwLCAweDAzLCAgICAgIDB4ODMsICAgICAweGMsICAgIDB4NCksCisJW0FCODUwMF9MRE9fVFZPVVRdID0geworCQkuZGVzYyA9IHsKKwkJCS5uYW1lCQk9ICJMRE8tVFZPVVQiLAorCQkJLm9wcwkJPSAmYWI4NTAwX3JlZ3VsYXRvcl9maXhlZF9vcHMsCisJCQkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJCS5pZAkJPSBBQjg1MDBfTERPX1RWT1VULAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMjAwMDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDMsCisJCS51cGRhdGVfcmVnCQk9IDB4ODAsCisJCS51cGRhdGVfbWFzawkJPSAweDgyLAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDAyLAorCX0sCisJW0FCODUwMF9MRE9fQVVESU9dID0geworCQkuZGVzYyA9IHsKKwkJCS5uYW1lCQk9ICJMRE8tQVVESU8iLAorCQkJLm9wcwkJPSAmYWI4NTAwX3JlZ3VsYXRvcl9maXhlZF9vcHMsCisJCQkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJCS5pZAkJPSBBQjg1MDBfTERPX0FVRElPLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMjAwMDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDMsCisJCS51cGRhdGVfcmVnCQk9IDB4ODMsCisJCS51cGRhdGVfbWFzawkJPSAweDAyLAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDAyLAorCX0sCisJW0FCODUwMF9MRE9fQU5BTUlDMV0gPSB7CisJCS5kZXNjID0geworCQkJLm5hbWUJCT0gIkxETy1BTkFNSUMxIiwKKwkJCS5vcHMJCT0gJmFiODUwMF9yZWd1bGF0b3JfZml4ZWRfb3BzLAorCQkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCQkuaWQJCT0gQUI4NTAwX0xET19BTkFNSUMxLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMjA1MDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDMsCisJCS51cGRhdGVfcmVnCQk9IDB4ODMsCisJCS51cGRhdGVfbWFzawkJPSAweDA4LAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDA4LAorCX0sCisJW0FCODUwMF9MRE9fQU5BTUlDMl0gPSB7CisJCS5kZXNjID0geworCQkJLm5hbWUJCT0gIkxETy1BTkFNSUMyIiwKKwkJCS5vcHMJCT0gJmFiODUwMF9yZWd1bGF0b3JfZml4ZWRfb3BzLAorCQkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCQkuaWQJCT0gQUI4NTAwX0xET19BTkFNSUMyLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMjA1MDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDMsCisJCS51cGRhdGVfcmVnCQk9IDB4ODMsCisJCS51cGRhdGVfbWFzawkJPSAweDEwLAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDEwLAorCX0sCisJW0FCODUwMF9MRE9fRE1JQ10gPSB7CisJCS5kZXNjID0geworCQkJLm5hbWUJCT0gIkxETy1ETUlDIiwKKwkJCS5vcHMJCT0gJmFiODUwMF9yZWd1bGF0b3JfZml4ZWRfb3BzLAorCQkJLnR5cGUJCT0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCQkuaWQJCT0gQUI4NTAwX0xET19ETUlDLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMTgwMDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDMsCisJCS51cGRhdGVfcmVnCQk9IDB4ODMsCisJCS51cGRhdGVfbWFzawkJPSAweDA0LAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDA0LAorCX0sCisJW0FCODUwMF9MRE9fQU5BXSA9IHsKKwkJLmRlc2MgPSB7CisJCQkubmFtZQkJPSAiTERPLUFOQSIsCisJCQkub3BzCQk9ICZhYjg1MDBfcmVndWxhdG9yX2ZpeGVkX29wcywKKwkJCS50eXBlCQk9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkJLmlkCQk9IEFCODUwMF9MRE9fQU5BLAorCQkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCQkJLm5fdm9sdGFnZXMJPSAxLAorCQl9LAorCQkuZml4ZWRfdVYJCT0gMTIwMDAwMCwKKwkJLnVwZGF0ZV9iYW5rCQk9IDB4MDQsCisJCS51cGRhdGVfcmVnCQk9IDB4MDYsCisJCS51cGRhdGVfbWFzawkJPSAweDBjLAorCQkudXBkYXRlX3ZhbF9lbmFibGUJPSAweDA0LAorCX0sCisKKwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICpmaW5kX3JlZ3VsYXRvcl9pbmZvKGludCBpZCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX3JlZ3VsYXRvcl9pbmZvICppbmZvOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX3JlZ3VsYXRvcl9pbmZvKTsgaSsrKSB7Ci0JCWluZm8gPSAmYWI4NTAwX3JlZ3VsYXRvcl9pbmZvW2ldOwotCQlpZiAoaW5mby0+ZGVzYy5pZCA9PSBpZCkKLQkJCXJldHVybiBpbmZvOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIF9fZGV2aW5pdCBpbnQgYWI4NTAwX3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBhYjg1MDAgKmFiODUwMCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKQEAgLTM2Niw2ICs1MjIsMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShhYjg1MDAtPmRldik7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJudWxsIHBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBwbGF0Zm9ybSBkYXRhIGhhcyB0aGUgY29ycmVjdCBzaXplICovCisJaWYgKHBkYXRhLT5udW1fcmVndWxhdG9yICE9IEFSUkFZX1NJWkUoYWI4NTAwX3JlZ3VsYXRvcl9pbmZvKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogcmVnaXN0ZXIgYWxsIHJlZ3VsYXRvcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfcmVndWxhdG9yX2luZm8pOyBpKyspIHsKQEAgLTM3NCwxMCArNTQwLDIyIEBACiAJCS8qIGFzc2lnbiBwZXItcmVndWxhdG9yIGRhdGEgKi8KIAkJaW5mbyA9ICZhYjg1MDBfcmVndWxhdG9yX2luZm9baV07CiAJCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7Ci0JCWluZm8tPmFiODUwMCA9IGFiODUwMDsKIAorCQkvKiBmaXggZm9yIGhhcmR3YXJlIGJlZm9yZSBhYjg1MDB2Mi4wICovCisJCWlmIChhYng1MDBfZ2V0X2NoaXBfaWQoaW5mby0+ZGV2KSA8IDB4MjApIHsKKwkJCWlmIChpbmZvLT5kZXNjLmlkID09IEFCODUwMF9MRE9fQVVYMykgeworCQkJCWluZm8tPmRlc2Mubl92b2x0YWdlcyA9CisJCQkJCUFSUkFZX1NJWkUobGRvX3ZhdXhuX3ZvbHRhZ2VzKTsKKwkJCQlpbmZvLT52b2x0YWdlcyA9IGxkb192YXV4bl92b2x0YWdlczsKKwkJCQlpbmZvLT52b2x0YWdlc19sZW4gPQorCQkJCQlBUlJBWV9TSVpFKGxkb192YXV4bl92b2x0YWdlcyk7CisJCQkJaW5mby0+dm9sdGFnZV9tYXNrID0gMHhmOworCQkJfQorCQl9CisKKwkJLyogcmVnaXN0ZXIgcmVndWxhdG9yIHdpdGggZnJhbWV3b3JrICovCiAJCWluZm8tPnJlZ3VsYXRvciA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmaW5mby0+ZGVzYywgJnBkZXYtPmRldiwKLQkJCQlwZGF0YS0+cmVndWxhdG9yW2ldLCBpbmZvKTsKKwkJCQkmcGRhdGEtPnJlZ3VsYXRvcltpXSwgaW5mbyk7CiAJCWlmIChJU19FUlIoaW5mby0+cmVndWxhdG9yKSkgewogCQkJZXJyID0gUFRSX0VSUihpbmZvLT5yZWd1bGF0b3IpOwogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlc1xuIiwKQEAgLTM4OSw2ICs1NjcsOSBAQAogCQkJfQogCQkJcmV0dXJuIGVycjsKIAkJfQorCisJCWRldl92ZGJnKHJkZXZfZ2V0X2RldihpbmZvLT5yZWd1bGF0b3IpLAorCQkJIiVzLXByb2JlZFxuIiwgaW5mby0+ZGVzYy5uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQwMSw2ICs1ODIsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfcmVndWxhdG9yX2luZm8pOyBpKyspIHsKIAkJc3RydWN0IGFiODUwMF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IE5VTEw7CiAJCWluZm8gPSAmYWI4NTAwX3JlZ3VsYXRvcl9pbmZvW2ldOworCisJCWRldl92ZGJnKHJkZXZfZ2V0X2RldihpbmZvLT5yZWd1bGF0b3IpLAorCQkJIiVzLXJlbW92ZVxuIiwgaW5mby0+ZGVzYy5uYW1lKTsKKwogCQlyZWd1bGF0b3JfdW5yZWdpc3RlcihpbmZvLT5yZWd1bGF0b3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IGJhNTIxZjAuLjlmYTIwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTEzLDggKzEzLDExIEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgIiVzOiAiIGZtdCwgX19mdW5jX18KKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMjUsMTYgKzI4LDMwIEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yZWd1bGF0b3IuaD4KKwogI2luY2x1ZGUgImR1bW15LmgiCiAKLSNkZWZpbmUgUkVHVUxBVE9SX1ZFUlNJT04gIjAuNSIKKyNkZWZpbmUgcmRldl9lcnIocmRldiwgZm10LCAuLi4pCQkJCQlcCisJcHJfZXJyKCIlczogIiBmbXQsIHJkZXZfZ2V0X25hbWUocmRldiksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHJkZXZfd2FybihyZGV2LCBmbXQsIC4uLikJCQkJCVwKKwlwcl93YXJuKCIlczogIiBmbXQsIHJkZXZfZ2V0X25hbWUocmRldiksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHJkZXZfaW5mbyhyZGV2LCBmbXQsIC4uLikJCQkJCVwKKwlwcl9pbmZvKCIlczogIiBmbXQsIHJkZXZfZ2V0X25hbWUocmRldiksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHJkZXZfZGJnKHJkZXYsIGZtdCwgLi4uKQkJCQkJXAorCXByX2RlYnVnKCIlczogIiBmbXQsIHJkZXZfZ2V0X25hbWUocmRldiksICMjX19WQV9BUkdTX18pCiAKIHN0YXRpYyBERUZJTkVfTVVURVgocmVndWxhdG9yX2xpc3RfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChyZWd1bGF0b3JfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKHJlZ3VsYXRvcl9tYXBfbGlzdCk7Ci1zdGF0aWMgaW50IGhhc19mdWxsX2NvbnN0cmFpbnRzOworc3RhdGljIGJvb2wgaGFzX2Z1bGxfY29uc3RyYWludHM7CiBzdGF0aWMgYm9vbCBib2FyZF93YW50c19kdW1teV9yZWd1bGF0b3I7CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Jvb3Q7CisjZW5kaWYKKwogLyoKICAqIHN0cnVjdCByZWd1bGF0b3JfbWFwCiAgKgpAQCAtNzEsNiArODgsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBfcmVndWxhdG9yX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIHN0YXRpYyB2b2lkIF9ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnJkZXZfZ2V0X25hbWUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CkBAIC0xMTEsMTMgKzEzMCwxMSBAQAogCUJVR19PTigqbWluX3VWID4gKm1heF91Vik7CiAKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGNvbnN0cmFpbnRzIGZvciAlc1xuIiwgX19mdW5jX18sCi0JCSAgICAgICByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJcmRldl9lcnIocmRldiwgIm5vIGNvbnN0cmFpbnRzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmICghKHJkZXYtPmNvbnN0cmFpbnRzLT52YWxpZF9vcHNfbWFzayAmIFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciAlc1xuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJcmRldl9lcnIocmRldiwgIm9wZXJhdGlvbiBub3QgYWxsb3dlZFxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCkBAIC0xMzIsNiArMTQ5LDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIE1ha2Ugc3VyZSB3ZSBzZWxlY3QgYSB2b2x0YWdlIHRoYXQgc3VpdHMgdGhlIG5lZWRzIG9mIGFsbAorICogcmVndWxhdG9yIGNvbnN1bWVycworICovCitzdGF0aWMgaW50IHJlZ3VsYXRvcl9jaGVja19jb25zdW1lcnMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgICBpbnQgKm1pbl91ViwgaW50ICptYXhfdVYpCit7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZWd1bGF0b3IsICZyZGV2LT5jb25zdW1lcl9saXN0LCBsaXN0KSB7CisJCWlmICgqbWF4X3VWID4gcmVndWxhdG9yLT5tYXhfdVYpCisJCQkqbWF4X3VWID0gcmVndWxhdG9yLT5tYXhfdVY7CisJCWlmICgqbWluX3VWIDwgcmVndWxhdG9yLT5taW5fdVYpCisJCQkqbWluX3VWID0gcmVndWxhdG9yLT5taW5fdVY7CisJfQorCisJaWYgKCptaW5fdVYgPiAqbWF4X3VWKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCiAvKiBjdXJyZW50IGNvbnN0cmFpbnQgY2hlY2sgKi8KIHN0YXRpYyBpbnQgcmVndWxhdG9yX2NoZWNrX2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJCWludCAqbWluX3VBLCBpbnQgKm1heF91QSkKQEAgLTEzOSwxMyArMTc3LDExIEBACiAJQlVHX09OKCptaW5fdUEgPiAqbWF4X3VBKTsKIAogCWlmICghcmRldi0+Y29uc3RyYWludHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gY29uc3RyYWludHMgZm9yICVzXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIHJkZXZfZ2V0X25hbWUocmRldikpOworCQlyZGV2X2VycihyZGV2LCAibm8gY29uc3RyYWludHNcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKCEocmRldi0+Y29uc3RyYWludHMtPnZhbGlkX29wc19tYXNrICYgUkVHVUxBVE9SX0NIQU5HRV9DVVJSRU5UKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcGVyYXRpb24gbm90IGFsbG93ZWQgZm9yICVzXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldikpOworCQlyZGV2X2VycihyZGV2LCAib3BlcmF0aW9uIG5vdCBhbGxvd2VkXG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKQEAgLTE3NCwxOCArMjEwLDE1IEBACiAJfQogCiAJaWYgKCFyZGV2LT5jb25zdHJhaW50cykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBjb25zdHJhaW50cyBmb3IgJXNcbiIsIF9fZnVuY19fLAotCQkgICAgICAgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCXJkZXZfZXJyKHJkZXYsICJubyBjb25zdHJhaW50c1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoIShyZGV2LT5jb25zdHJhaW50cy0+dmFsaWRfb3BzX21hc2sgJiBSRUdVTEFUT1JfQ0hBTkdFX01PREUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgJXNcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCXJkZXZfZXJyKHJkZXYsICJvcGVyYXRpb24gbm90IGFsbG93ZWRcbiIpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAlpZiAoIShyZGV2LT5jb25zdHJhaW50cy0+dmFsaWRfbW9kZXNfbWFzayAmIG1vZGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgbW9kZSAleCBmb3IgJXNcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbW9kZSwgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIG1vZGUgJXhcbiIsIG1vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xOTUsMTMgKzIyOCwxMSBAQAogc3RhdGljIGludCByZWd1bGF0b3JfY2hlY2tfZHJtcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGNvbnN0cmFpbnRzIGZvciAlc1xuIiwgX19mdW5jX18sCi0JCSAgICAgICByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJcmRldl9lcnIocmRldiwgIm5vIGNvbnN0cmFpbnRzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmICghKHJkZXYtPmNvbnN0cmFpbnRzLT52YWxpZF9vcHNfbWFzayAmIFJFR1VMQVRPUl9DSEFOR0VfRFJNUykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciAlc1xuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJcmRldl9lcnIocmRldiwgIm9wZXJhdGlvbiBub3QgYWxsb3dlZFxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCXJldHVybiAwOwpAQCAtNTUzLDE4ICs1ODQsMjEgQEAKIAogCWVyciA9IHJlZ3VsYXRvcl9jaGVja19kcm1zKHJkZXYpOwogCWlmIChlcnIgPCAwIHx8ICFyZGV2LT5kZXNjLT5vcHMtPmdldF9vcHRpbXVtX21vZGUgfHwKLQkgICAgIXJkZXYtPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2UgfHwgIXJkZXYtPmRlc2MtPm9wcy0+c2V0X21vZGUpCisJICAgICghcmRldi0+ZGVzYy0+b3BzLT5nZXRfdm9sdGFnZSAmJgorCSAgICAgIXJkZXYtPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKSB8fAorCSAgICAhcmRldi0+ZGVzYy0+b3BzLT5zZXRfbW9kZSkKIAkJcmV0dXJuOwogCiAJLyogZ2V0IG91dHB1dCB2b2x0YWdlICovCi0Jb3V0cHV0X3VWID0gcmRldi0+ZGVzYy0+b3BzLT5nZXRfdm9sdGFnZShyZGV2KTsKKwlvdXRwdXRfdVYgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOwogCWlmIChvdXRwdXRfdVYgPD0gMCkKIAkJcmV0dXJuOwogCiAJLyogZ2V0IGlucHV0IHZvbHRhZ2UgKi8KLQlpZiAocmRldi0+c3VwcGx5ICYmIHJkZXYtPnN1cHBseS0+ZGVzYy0+b3BzLT5nZXRfdm9sdGFnZSkKLQkJaW5wdXRfdVYgPSByZGV2LT5zdXBwbHktPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKLQllbHNlCisJaW5wdXRfdVYgPSAwOworCWlmIChyZGV2LT5zdXBwbHkpCisJCWlucHV0X3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKKwlpZiAoaW5wdXRfdVYgPD0gMCkKIAkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7CiAJaWYgKGlucHV0X3VWIDw9IDApCiAJCXJldHVybjsKQEAgLTU5OCwyMCArNjMyLDE3IEBACiAJICovCiAJaWYgKCFyc3RhdGUtPmVuYWJsZWQgJiYgIXJzdGF0ZS0+ZGlzYWJsZWQpIHsKIAkJaWYgKGNhbl9zZXRfc3RhdGUpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gY29uZmlndXJhdGlvbiBmb3IgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldikpOworCQkJcmRldl93YXJuKHJkZXYsICJObyBjb25maWd1cmF0aW9uXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHJzdGF0ZS0+ZW5hYmxlZCAmJiByc3RhdGUtPmRpc2FibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoIWNhbl9zZXRfc3RhdGUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gd2F5IHRvIHNldCBzdXNwZW5kIHN0YXRlXG4iLAotCQkJX19mdW5jX18pOworCQlyZGV2X2VycihyZGV2LCAibm8gd2F5IHRvIHNldCBzdXNwZW5kIHN0YXRlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02MjAsMTUgKzY1MSwxNCBAQAogCWVsc2UKIAkJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfc3VzcGVuZF9kaXNhYmxlKHJkZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBlbmFibGVkL2Rpc2FibGVcbiIsIF9fZnVuY19fKTsKKwkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBlbmFibGVkL2Rpc2FibGVcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX3ZvbHRhZ2UgJiYgcnN0YXRlLT51ViA+IDApIHsKIAkJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfc3VzcGVuZF92b2x0YWdlKHJkZXYsIHJzdGF0ZS0+dVYpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHNldCB2b2x0YWdlXG4iLAotCQkJCV9fZnVuY19fKTsKKwkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IHZvbHRhZ2VcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTYzNiw3ICs2NjYsNyBAQAogCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX21vZGUgJiYgcnN0YXRlLT5tb2RlID4gMCkgewogCQlyZXQgPSByZGV2LT5kZXNjLT5vcHMtPnNldF9zdXNwZW5kX21vZGUocmRldiwgcnN0YXRlLT5tb2RlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBzZXQgbW9kZVxuIiwgX19mdW5jX18pOworCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBzZXQgbW9kZVxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtNzE0LDI5ICs3NDQsMjcgQEAKIAlpZiAoY29uc3RyYWludHMtPnZhbGlkX21vZGVzX21hc2sgJiBSRUdVTEFUT1JfTU9ERV9TVEFOREJZKQogCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAic3RhbmRieSIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAicmVndWxhdG9yOiAlczogJXNcbiIsIHJkZXZfZ2V0X25hbWUocmRldiksIGJ1Zik7CisJcmRldl9pbmZvKHJkZXYsICIlc1xuIiwgYnVmKTsKIH0KIAogc3RhdGljIGludCBtYWNoaW5lX2NvbnN0cmFpbnRzX3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQogewogCXN0cnVjdCByZWd1bGF0b3Jfb3BzICpvcHMgPSByZGV2LT5kZXNjLT5vcHM7Ci0JY29uc3QgY2hhciAqbmFtZSA9IHJkZXZfZ2V0X25hbWUocmRldik7CiAJaW50IHJldDsKIAogCS8qIGRvIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGNvbnN0cmFpbnQgdm9sdGFnZSAqLwogCWlmIChyZGV2LT5jb25zdHJhaW50cy0+YXBwbHlfdVYgJiYKLQkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViA9PSByZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWICYmCi0JCW9wcy0+c2V0X3ZvbHRhZ2UpIHsKLQkJcmV0ID0gb3BzLT5zZXRfdm9sdGFnZShyZGV2LAotCQkJcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViwgcmRldi0+Y29uc3RyYWludHMtPm1heF91Vik7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhcHBseSAlZHVWIGNvbnN0cmFpbnQgdG8gJXNcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLAotCQkJCSAgICAgICByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWLCBuYW1lKTsKLQkJCQlyZGV2LT5jb25zdHJhaW50cyA9IE5VTEw7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KKwkgICAgcmRldi0+Y29uc3RyYWludHMtPm1pbl91ViA9PSByZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWKSB7CisJCXJldCA9IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2UocmRldiwKKwkJCQkJCXJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVYsCisJCQkJCQlyZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gYXBwbHkgJWR1ViBjb25zdHJhaW50XG4iLAorCQkJCSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKKwkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAkvKiBjb25zdHJhaW4gbWFjaGluZS1sZXZlbCB2b2x0YWdlIHNwZWNzIHRvIGZpdApAQCAtNzY1LDggKzc5Myw3IEBACiAKIAkJLyogZWxzZSByZXF1aXJlIGV4cGxpY2l0IG1hY2hpbmUtbGV2ZWwgY29uc3RyYWludHMgKi8KIAkJaWYgKGNtaW4gPD0gMCB8fCBjbWF4IDw9IDAgfHwgY21heCA8IGNtaW4pIHsKLQkJCXByX2VycigiJXM6ICVzICclcycgdm9sdGFnZSBjb25zdHJhaW50c1xuIiwKLQkJCQkgICAgICAgX19mdW5jX18sICJpbnZhbGlkIiwgbmFtZSk7CisJCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCB2b2x0YWdlIGNvbnN0cmFpbnRzXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTc4NywyMiArODE0LDE5IEBACiAKIAkJLyogZmluYWw6IFttaW5fdVYuLm1heF91Vl0gdmFsaWQgaWZmIGNvbnN0cmFpbnRzIHZhbGlkICovCiAJCWlmIChtYXhfdVYgPCBtaW5fdVYpIHsKLQkJCXByX2VycigiJXM6ICVzICclcycgdm9sdGFnZSBjb25zdHJhaW50c1xuIiwKLQkJCQkgICAgICAgX19mdW5jX18sICJ1bnN1cHBvcnRhYmxlIiwgbmFtZSk7CisJCQlyZGV2X2VycihyZGV2LCAidW5zdXBwb3J0YWJsZSB2b2x0YWdlIGNvbnN0cmFpbnRzXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAkJLyogdXNlIHJlZ3VsYXRvcidzIHN1YnNldCBvZiBtYWNoaW5lIGNvbnN0cmFpbnRzICovCiAJCWlmIChjb25zdHJhaW50cy0+bWluX3VWIDwgbWluX3VWKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IG92ZXJyaWRlICclcycgJXMsICVkIC0+ICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgbmFtZSwgIm1pbl91ViIsCi0JCQkJCWNvbnN0cmFpbnRzLT5taW5fdVYsIG1pbl91Vik7CisJCQlyZGV2X2RiZyhyZGV2LCAib3ZlcnJpZGUgbWluX3VWLCAlZCAtPiAlZFxuIiwKKwkJCQkgY29uc3RyYWludHMtPm1pbl91ViwgbWluX3VWKTsKIAkJCWNvbnN0cmFpbnRzLT5taW5fdVYgPSBtaW5fdVY7CiAJCX0KIAkJaWYgKGNvbnN0cmFpbnRzLT5tYXhfdVYgPiBtYXhfdVYpIHsKLQkJCXByX2RlYnVnKCIlczogb3ZlcnJpZGUgJyVzJyAlcywgJWQgLT4gJWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCBuYW1lLCAibWF4X3VWIiwKLQkJCQkJY29uc3RyYWludHMtPm1heF91ViwgbWF4X3VWKTsKKwkJCXJkZXZfZGJnKHJkZXYsICJvdmVycmlkZSBtYXhfdVYsICVkIC0+ICVkXG4iLAorCQkJCSBjb25zdHJhaW50cy0+bWF4X3VWLCBtYXhfdVYpOwogCQkJY29uc3RyYWludHMtPm1heF91ViA9IG1heF91VjsKIAkJfQogCX0KQEAgLTgyMiwyNiArODQ2LDI1IEBACiAgKiBzZXRfbW9kZS4KICAqLwogc3RhdGljIGludCBzZXRfbWFjaGluZV9jb25zdHJhaW50cyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqY29uc3RyYWludHMpCisJY29uc3Qgc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQogewogCWludCByZXQgPSAwOwotCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0IHJlZ3VsYXRvcl9vcHMgKm9wcyA9IHJkZXYtPmRlc2MtPm9wczsKIAotCXJkZXYtPmNvbnN0cmFpbnRzID0gY29uc3RyYWludHM7CisJcmRldi0+Y29uc3RyYWludHMgPSBrbWVtZHVwKGNvbnN0cmFpbnRzLCBzaXplb2YoKmNvbnN0cmFpbnRzKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQluYW1lID0gcmRldl9nZXRfbmFtZShyZGV2KTsKLQotCXJldCA9IG1hY2hpbmVfY29uc3RyYWludHNfdm9sdGFnZShyZGV2LCBjb25zdHJhaW50cyk7CisJcmV0ID0gbWFjaGluZV9jb25zdHJhaW50c192b2x0YWdlKHJkZXYsIHJkZXYtPmNvbnN0cmFpbnRzKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0OwogCiAJLyogZG8gd2UgbmVlZCB0byBzZXR1cCBvdXIgc3VzcGVuZCBzdGF0ZSAqLwogCWlmIChjb25zdHJhaW50cy0+aW5pdGlhbF9zdGF0ZSkgewotCQlyZXQgPSBzdXNwZW5kX3ByZXBhcmUocmRldiwgY29uc3RyYWludHMtPmluaXRpYWxfc3RhdGUpOworCQlyZXQgPSBzdXNwZW5kX3ByZXBhcmUocmRldiwgcmRldi0+Y29uc3RyYWludHMtPmluaXRpYWxfc3RhdGUpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHNldCBzdXNwZW5kIHN0YXRlIGZvciAlc1xuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgbmFtZSk7CisJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIHNldCBzdXNwZW5kIHN0YXRlXG4iKTsKIAkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC04NDksMTcgKzg3MiwxNCBAQAogCiAJaWYgKGNvbnN0cmFpbnRzLT5pbml0aWFsX21vZGUpIHsKIAkJaWYgKCFvcHMtPnNldF9tb2RlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBzZXRfbW9kZSBvcGVyYXRpb24gZm9yICVzXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBuYW1lKTsKKwkJCXJkZXZfZXJyKHJkZXYsICJubyBzZXRfbW9kZSBvcGVyYXRpb25cbiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJcmV0ID0gb3BzLT5zZXRfbW9kZShyZGV2LCBjb25zdHJhaW50cy0+aW5pdGlhbF9tb2RlKTsKKwkJcmV0ID0gb3BzLT5zZXRfbW9kZShyZGV2LCByZGV2LT5jb25zdHJhaW50cy0+aW5pdGlhbF9tb2RlKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogZmFpbGVkIHRvIHNldCBpbml0aWFsIG1vZGUgZm9yICVzOiAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgbmFtZSwgcmV0KTsKKwkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IGluaXRpYWwgbW9kZTogJWRcbiIsIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTg2NywxMSArODg3LDExIEBACiAJLyogSWYgdGhlIGNvbnN0cmFpbnRzIHNheSB0aGUgcmVndWxhdG9yIHNob3VsZCBiZSBvbiBhdCB0aGlzIHBvaW50CiAJICogYW5kIHdlIGhhdmUgY29udHJvbCB0aGVuIG1ha2Ugc3VyZSBpdCBpcyBlbmFibGVkLgogCSAqLwotCWlmICgoY29uc3RyYWludHMtPmFsd2F5c19vbiB8fCBjb25zdHJhaW50cy0+Ym9vdF9vbikgJiYgb3BzLT5lbmFibGUpIHsKKwlpZiAoKHJkZXYtPmNvbnN0cmFpbnRzLT5hbHdheXNfb24gfHwgcmRldi0+Y29uc3RyYWludHMtPmJvb3Rfb24pICYmCisJICAgIG9wcy0+ZW5hYmxlKSB7CiAJCXJldCA9IG9wcy0+ZW5hYmxlKHJkZXYpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGVuYWJsZSAlc1xuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgbmFtZSk7CisJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIGVuYWJsZVxuIik7CiAJCQlyZGV2LT5jb25zdHJhaW50cyA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtODk5LDkgKzkxOSw4IEBACiAJZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAmc3VwcGx5X3JkZXYtPmRldi5rb2JqLAogCQkJCSJzdXBwbHkiKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBjb3VsZCBub3QgYWRkIGRldmljZSBsaW5rICVzIGVyciAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzdXBwbHlfcmRldi0+ZGV2LmtvYmoubmFtZSwgZXJyKTsKKwkJcmRldl9lcnIocmRldiwgImNvdWxkIG5vdCBhZGQgZGV2aWNlIGxpbmsgJXMgZXJyICVkXG4iLAorCQkJIHN1cHBseV9yZGV2LT5kZXYua29iai5uYW1lLCBlcnIpOwogCQkgICAgICAgZ290byBvdXQ7CiAJfQogCXJkZXYtPnN1cHBseSA9IHN1cHBseV9yZGV2OwpAQCAtOTU3LDEwICs5NzYsMTAgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoY29uc3VtZXJfZGV2LCAiJXMvJXMgaXMgJyVzJyBzdXBwbHk7IGZhaWwgJXMvJXNcbiIsCi0JCQkJZGV2X25hbWUoJm5vZGUtPnJlZ3VsYXRvci0+ZGV2KSwKLQkJCQlub2RlLT5yZWd1bGF0b3ItPmRlc2MtPm5hbWUsCi0JCQkJc3VwcGx5LAotCQkJCWRldl9uYW1lKCZyZGV2LT5kZXYpLCByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJCWRldl9uYW1lKCZub2RlLT5yZWd1bGF0b3ItPmRldiksCisJCQlub2RlLT5yZWd1bGF0b3ItPmRlc2MtPm5hbWUsCisJCQlzdXBwbHksCisJCQlkZXZfbmFtZSgmcmRldi0+ZGV2KSwgcmRldl9nZXRfbmFtZShyZGV2KSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMDMxLDggKzEwNTAsNyBAQAogCQlyZWd1bGF0b3ItPmRldl9hdHRyLnNob3cgPSBkZXZpY2VfcmVxdWVzdGVkX3VBX3Nob3c7CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZyZWd1bGF0b3ItPmRldl9hdHRyKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgYWRkIHJlZ3VsYXRvcl9kZXYiCi0JCQkJIiBsb2FkIHN5c2ZzXG4iLCBfX2Z1bmNfXyk7CisJCQlyZGV2X3dhcm4ocmRldiwgImNvdWxkIG5vdCBhZGQgcmVndWxhdG9yX2RldiByZXF1ZXN0ZWQgbWljcm9hbXBzIHN5c2ZzIGVudHJ5XG4iKTsKIAkJCWdvdG8gYXR0cl9uYW1lX2VycjsKIAkJfQogCkBAIC0xMDQ5LDkgKzEwNjcsOCBAQAogCQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcmRldi0+ZGV2LmtvYmosICZkZXYtPmtvYmosCiAJCQkJCWJ1Zik7CiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IGNvdWxkIG5vdCBhZGQgZGV2aWNlIGxpbmsgJXMgZXJyICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBkZXYtPmtvYmoubmFtZSwgZXJyKTsKKwkJCXJkZXZfd2FybihyZGV2LCAiY291bGQgbm90IGFkZCBkZXZpY2UgbGluayAlcyBlcnIgJWRcbiIsCisJCQkJICBkZXYtPmtvYmoubmFtZSwgZXJyKTsKIAkJCWdvdG8gbGlua19uYW1lX2VycjsKIAkJfQogCX0KQEAgLTEwODgsNyArMTEwNSw3IEBACiAJaW50IHJldDsKIAogCWlmIChpZCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmVndWxhdG9yOiBnZXQoKSB3aXRoIG5vIGlkZW50aWZpZXJcbiIpOworCQlwcl9lcnIoImdldCgpIHdpdGggbm8gaWRlbnRpZmllclxuIik7CiAJCXJldHVybiByZWd1bGF0b3I7CiAJfQogCkBAIC0xMTIyLDggKzExMzksOCBAQAogCSAqIHN1YnN0aXR1dGUgaW4gYSBkdW1teSByZWd1bGF0b3Igc28gY29uc3VtZXJzIGNhbiBjb250aW51ZS4KIAkgKi8KIAlpZiAoIWhhc19mdWxsX2NvbnN0cmFpbnRzKSB7Ci0JCXByX3dhcm5pbmcoIiVzIHN1cHBseSAlcyBub3QgZm91bmQsIHVzaW5nIGR1bW15IHJlZ3VsYXRvclxuIiwKLQkJCSAgIGRldm5hbWUsIGlkKTsKKwkJcHJfd2FybigiJXMgc3VwcGx5ICVzIG5vdCBmb3VuZCwgdXNpbmcgZHVtbXkgcmVndWxhdG9yXG4iLAorCQkJZGV2bmFtZSwgaWQpOwogCQlyZGV2ID0gZHVtbXlfcmVndWxhdG9yX3JkZXY7CiAJCWdvdG8gZm91bmQ7CiAJfQpAQCAtMTI3NCw4ICsxMjkxLDcgQEAKIAkJCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYtPnN1cHBseSk7CiAJCQltdXRleF91bmxvY2soJnJkZXYtPnN1cHBseS0+bXV0ZXgpOwogCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gZW5hYmxlICVzOiAlZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldiksIHJldCk7CisJCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBlbmFibGU6ICVkXG4iLCByZXQpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KQEAgLTEzMDIsMTMgKzEzMTgsMTMgQEAKIAkJCWlmIChyZXQgPj0gMCkgewogCQkJCWRlbGF5ID0gcmV0OwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCSIlczogZW5hYmxlX3RpbWUoKSBmYWlsZWQgZm9yICVzOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldiksCi0JCQkJCXJldCk7CisJCQkJcmRldl93YXJuKHJkZXYsICJlbmFibGVfdGltZSgpIGZhaWxlZDogJWRcbiIsCisJCQkJCSAgIHJldCk7CiAJCQkJZGVsYXkgPSAwOwogCQkJfQogCisJCQl0cmFjZV9yZWd1bGF0b3JfZW5hYmxlKHJkZXZfZ2V0X25hbWUocmRldikpOworCiAJCQkvKiBBbGxvdyB0aGUgcmVndWxhdG9yIHRvIHJhbXA7IGl0IHdvdWxkIGJlIHVzZWZ1bAogCQkJICogdG8gZXh0ZW5kIHRoaXMgZm9yIGJ1bGsgb3BlcmF0aW9ucyBzbyB0aGF0IHRoZQogCQkJICogcmVndWxhdG9ycyBjYW4gcmFtcCB0b2dldGhlci4gICovCkBAIC0xMzE2LDYgKzEzMzIsOCBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAorCQkJdHJhY2VfcmVndWxhdG9yX2VuYWJsZV9kZWxheShyZGV2X2dldF9uYW1lKHJkZXYpKTsKKwogCQkJaWYgKGRlbGF5ID49IDEwMDApIHsKIAkJCQltZGVsYXkoZGVsYXkgLyAxMDAwKTsKIAkJCQl1ZGVsYXkoZGVsYXkgJSAxMDAwKTsKQEAgLTEzMjMsOSArMTM0MSwxMCBAQAogCQkJCXVkZWxheShkZWxheSk7CiAJCQl9CiAKKwkJCXRyYWNlX3JlZ3VsYXRvcl9lbmFibGVfY29tcGxldGUocmRldl9nZXRfbmFtZShyZGV2KSk7CisKIAkJfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpc19lbmFibGVkKCkgZmFpbGVkIGZvciAlczogJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldiksIHJldCk7CisJCQlyZGV2X2VycihyZGV2LCAiaXNfZW5hYmxlZCgpIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCS8qIEZhbGx0aHJvdWdoIG9uIHBvc2l0aXZlIHJldHVybiB2YWx1ZXMgLSBhbHJlYWR5IGVuYWJsZWQgKi8KQEAgLTEzNjcsOCArMTM4Niw3IEBACiAJKnN1cHBseV9yZGV2X3B0ciA9IE5VTEw7CiAKIAlpZiAoV0FSTihyZGV2LT51c2VfY291bnQgPD0gMCwKLQkJCSJ1bmJhbGFuY2VkIGRpc2FibGVzIGZvciAlc1xuIiwKLQkJCXJkZXZfZ2V0X25hbWUocmRldikpKQorCQkgInVuYmFsYW5jZWQgZGlzYWJsZXMgZm9yICVzXG4iLCByZGV2X2dldF9uYW1lKHJkZXYpKSkKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiBhcmUgd2UgdGhlIGxhc3QgdXNlciBhbmQgcGVybWl0dGVkIHRvIGRpc2FibGUgPyAqLwpAQCAtMTM3OCwxMyArMTM5NiwxNiBAQAogCQkvKiB3ZSBhcmUgbGFzdCB1c2VyICovCiAJCWlmIChfcmVndWxhdG9yX2Nhbl9jaGFuZ2Vfc3RhdHVzKHJkZXYpICYmCiAJCSAgICByZGV2LT5kZXNjLT5vcHMtPmRpc2FibGUpIHsKKwkJCXRyYWNlX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXZfZ2V0X25hbWUocmRldikpOworCiAJCQlyZXQgPSByZGV2LT5kZXNjLT5vcHMtPmRpc2FibGUocmRldik7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBkaXNhYmxlICVzXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBkaXNhYmxlXG4iKTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCisJCQl0cmFjZV9yZWd1bGF0b3JfZGlzYWJsZV9jb21wbGV0ZShyZGV2X2dldF9uYW1lKHJkZXYpKTsKKwogCQkJX25vdGlmaWVyX2NhbGxfY2hhaW4ocmRldiwgUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUsCiAJCQkJCSAgICAgTlVMTCk7CiAJCX0KQEAgLTE0NTEsOCArMTQ3Miw3IEBACiAJCS8qIGFoIHdlbGwsIHdobyB3YW50cyB0byBsaXZlIGZvcmV2ZXIuLi4gKi8KIAkJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5kaXNhYmxlKHJkZXYpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGZvcmNlIGRpc2FibGUgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldikpOworCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBmb3JjZSBkaXNhYmxlXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJLyogbm90aWZ5IG90aGVyIGNvbnN1bWVycyB0aGF0IHBvd2VyIGhhcyBiZWVuIGZvcmNlZCBvZmYgKi8KQEAgLTE2MDUsNiArMTYyNSw2MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHNlbGVjdG9yOworCisJdHJhY2VfcmVndWxhdG9yX3NldF92b2x0YWdlKHJkZXZfZ2V0X25hbWUocmRldiksIG1pbl91ViwgbWF4X3VWKTsKKworCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlKSB7CisJCXJldCA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYsCisJCQkJCQkgICAmc2VsZWN0b3IpOworCisJCWlmIChyZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZSkKKwkJCXNlbGVjdG9yID0gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwKKwkJCQkJCQkJIHNlbGVjdG9yKTsKKwkJZWxzZQorCQkJc2VsZWN0b3IgPSAtMTsKKwl9IGVsc2UgaWYgKHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKSB7CisJCWludCBiZXN0X3ZhbCA9IElOVF9NQVg7CisJCWludCBpOworCisJCXNlbGVjdG9yID0gMDsKKworCQkvKiBGaW5kIHRoZSBzbWFsbGVzdCB2b2x0YWdlIHRoYXQgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQKKwkJICogcmFuZ2UuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmRldi0+ZGVzYy0+bl92b2x0YWdlczsgaSsrKSB7CisJCQlyZXQgPSByZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZShyZGV2LCBpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocmV0IDwgYmVzdF92YWwgJiYgcmV0ID49IG1pbl91ViAmJiByZXQgPD0gbWF4X3VWKSB7CisJCQkJYmVzdF92YWwgPSByZXQ7CisJCQkJc2VsZWN0b3IgPSBpOworCQkJfQorCQl9CisKKwkJaWYgKGJlc3RfdmFsICE9IElOVF9NQVgpIHsKKwkJCXJldCA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKHJkZXYsIHNlbGVjdG9yKTsKKwkJCXNlbGVjdG9yID0gYmVzdF92YWw7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmV0ID09IDApCisJCV9ub3RpZmllcl9jYWxsX2NoYWluKHJkZXYsIFJFR1VMQVRPUl9FVkVOVF9WT0xUQUdFX0NIQU5HRSwKKwkJCQkgICAgIE5VTEwpOworCisJdHJhY2VfcmVndWxhdG9yX3NldF92b2x0YWdlX2NvbXBsZXRlKHJkZXZfZ2V0X25hbWUocmRldiksIHNlbGVjdG9yKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogcmVndWxhdG9yX3NldF92b2x0YWdlIC0gc2V0IHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZQogICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQpAQCAtMTYyNiwxMiArMTcwMiwyMCBAQAogaW50IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAorCS8qIElmIHdlJ3JlIHNldHRpbmcgdGhlIHNhbWUgcmFuZ2UgYXMgbGFzdCB0aW1lIHRoZSBjaGFuZ2UKKwkgKiBzaG91bGQgYmUgYSBub29wIChzb21lIGNwdWZyZXEgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgc2FtZQorCSAqIHZvbHRhZ2UgZm9yIG11bHRpcGxlIGZyZXF1ZW5jaWVzLCBmb3IgZXhhbXBsZSkuCisJICovCisJaWYgKHJlZ3VsYXRvci0+bWluX3VWID09IG1pbl91ViAmJiByZWd1bGF0b3ItPm1heF91ViA9PSBtYXhfdVYpCisJCWdvdG8gb3V0OworCiAJLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKCFyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlKSB7CisJaWYgKCFyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlICYmCisJICAgICFyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3NlbCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjQyLDE4ICsxNzI2LDc2IEBACiAJCWdvdG8gb3V0OwogCXJlZ3VsYXRvci0+bWluX3VWID0gbWluX3VWOwogCXJlZ3VsYXRvci0+bWF4X3VWID0gbWF4X3VWOwotCXJldCA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYpOworCisJcmV0ID0gcmVndWxhdG9yX2NoZWNrX2NvbnN1bWVycyhyZGV2LCAmbWluX3VWLCAmbWF4X3VWKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBfcmVndWxhdG9yX2RvX3NldF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKIAogb3V0OgotCV9ub3RpZmllcl9jYWxsX2NoYWluKHJkZXYsIFJFR1VMQVRPUl9FVkVOVF9WT0xUQUdFX0NIQU5HRSwgTlVMTCk7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9zZXRfdm9sdGFnZSk7CiAKKy8qKgorICogcmVndWxhdG9yX3N5bmNfdm9sdGFnZSAtIHJlLWFwcGx5IGxhc3QgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlCisgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCisgKgorICogUmUtYXBwbHkgdGhlIGxhc3QgY29uZmlndXJlZCB2b2x0YWdlLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCisgKiB3aGVyZSBzb21lIGV4dGVybmFsIGNvbnRyb2wgc291cmNlIHRoZSBjb25zdW1lciBpcyBjb29wZXJhdGluZyB3aXRoCisgKiBoYXMgY2F1c2VkIHRoZSBjb25maWd1cmVkIHZvbHRhZ2UgdG8gY2hhbmdlLgorICovCitpbnQgcmVndWxhdG9yX3N5bmNfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CisJaW50IHJldCwgbWluX3VWLCBtYXhfdVY7CisKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisKKwlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UgJiYKKwkgICAgIXJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoaXMgaXMgb25seSBnb2luZyB0byB3b3JrIGlmIHdlJ3ZlIGhhZCBhIHZvbHRhZ2UgY29uZmlndXJlZC4gKi8KKwlpZiAoIXJlZ3VsYXRvci0+bWluX3VWICYmICFyZWd1bGF0b3ItPm1heF91VikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltaW5fdVYgPSByZWd1bGF0b3ItPm1pbl91VjsKKwltYXhfdVYgPSByZWd1bGF0b3ItPm1heF91VjsKKworCS8qIFRoaXMgc2hvdWxkIGJlIGEgcGFyYW5vaWEgY2hlY2suLi4gKi8KKwlyZXQgPSByZWd1bGF0b3JfY2hlY2tfdm9sdGFnZShyZGV2LCAmbWluX3VWLCAmbWF4X3VWKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfY2hlY2tfY29uc3VtZXJzKHJkZXYsICZtaW5fdVYsICZtYXhfdVYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9zeW5jX3ZvbHRhZ2UpOworCiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7Ci0JLyogc2FuaXR5IGNoZWNrICovCisJaW50IHNlbDsKKworCWlmIChyZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlX3NlbCkgeworCQlzZWwgPSByZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlX3NlbChyZGV2KTsKKwkJaWYgKHNlbCA8IDApCisJCQlyZXR1cm4gc2VsOworCQlyZXR1cm4gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwgc2VsKTsKKwl9CiAJaWYgKHJkZXYtPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2UpCiAJCXJldHVybiByZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlKHJkZXYpOwogCWVsc2UKQEAgLTE4ODAsMjEgKzIwMjIsMjAgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBnZXQgb3V0cHV0IHZvbHRhZ2UgKi8KLQlvdXRwdXRfdVYgPSByZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlKHJkZXYpOworCW91dHB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CiAJaWYgKG91dHB1dF91ViA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgb3V0cHV0IHZvbHRhZ2UgZm91bmQgZm9yICVzXG4iLAotCQkJX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldikpOworCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBvdXRwdXQgdm9sdGFnZSBmb3VuZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIGdldCBpbnB1dCB2b2x0YWdlICovCi0JaWYgKHJkZXYtPnN1cHBseSAmJiByZGV2LT5zdXBwbHktPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2UpCi0JCWlucHV0X3VWID0gcmRldi0+c3VwcGx5LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlKHJkZXYtPnN1cHBseSk7Ci0JZWxzZQorCWlucHV0X3VWID0gMDsKKwlpZiAocmRldi0+c3VwcGx5KQorCQlpbnB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKKwlpZiAoaW5wdXRfdVYgPD0gMCkKIAkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7CiAJaWYgKGlucHV0X3VWIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBpbnB1dCB2b2x0YWdlIGZvdW5kIGZvciAlc1xuIiwKLQkJCV9fZnVuY19fLCByZGV2X2dldF9uYW1lKHJkZXYpKTsKKwkJcmRldl9lcnIocmRldiwgImludmFsaWQgaW5wdXQgdm9sdGFnZSBmb3VuZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTkwNywxNiArMjA0OCwxNCBAQAogCQkJCQkJIHRvdGFsX3VBX2xvYWQpOwogCXJldCA9IHJlZ3VsYXRvcl9jaGVja19tb2RlKHJkZXYsIG1vZGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBnZXQgb3B0aW11bSBtb2RlIGZvciAlcyBAIgotCQkJIiAlZCB1QSAlZCAtPiAlZCB1VlxuIiwgX19mdW5jX18sIHJkZXZfZ2V0X25hbWUocmRldiksCi0JCQl0b3RhbF91QV9sb2FkLCBpbnB1dF91Viwgb3V0cHV0X3VWKTsKKwkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBnZXQgb3B0aW11bSBtb2RlIEAgJWQgdUEgJWQgLT4gJWQgdVZcbiIsCisJCQkgdG90YWxfdUFfbG9hZCwgaW5wdXRfdVYsIG91dHB1dF91Vik7CiAJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X21vZGUocmRldiwgbW9kZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHNldCBvcHRpbXVtIG1vZGUgJXggZm9yICVzXG4iLAotCQkJX19mdW5jX18sIG1vZGUsIHJkZXZfZ2V0X25hbWUocmRldikpOworCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIHNldCBvcHRpbXVtIG1vZGUgJXhcbiIsIG1vZGUpOwogCQlnb3RvIG91dDsKIAl9CiAJcmV0ID0gbW9kZTsKQEAgLTIwNDcsNyArMjE4Niw3IEBACiAJcmV0dXJuIDA7CiAKIGVycjoKLQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBlbmFibGUgJXM6ICVkXG4iLCBjb25zdW1lcnNbaV0uc3VwcGx5LCByZXQpOworCXByX2VycigiRmFpbGVkIHRvIGVuYWJsZSAlczogJWRcbiIsIGNvbnN1bWVyc1tpXS5zdXBwbHksIHJldCk7CiAJZm9yICgtLWk7IGkgPj0gMDsgLS1pKQogCQlyZWd1bGF0b3JfZGlzYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOwogCkBAIC0yMDgyLDggKzIyMjEsNyBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZGlzYWJsZSAlczogJWRcbiIsIGNvbnN1bWVyc1tpXS5zdXBwbHksCi0JICAgICAgIHJldCk7CisJcHJfZXJyKCJGYWlsZWQgdG8gZGlzYWJsZSAlczogJWRcbiIsIGNvbnN1bWVyc1tpXS5zdXBwbHksIHJldCk7CiAJZm9yICgtLWk7IGkgPj0gMDsgLS1pKQogCQlyZWd1bGF0b3JfZW5hYmxlKGNvbnN1bWVyc1tpXS5jb25zdW1lcik7CiAKQEAgLTIxNjYsNyArMjMwNCw3IEBACiAJaW50CQkJc3RhdHVzID0gMDsKIAogCS8qIHNvbWUgYXR0cmlidXRlcyBuZWVkIHNwZWNpZmljIG1ldGhvZHMgdG8gYmUgZGlzcGxheWVkICovCi0JaWYgKG9wcy0+Z2V0X3ZvbHRhZ2UpIHsKKwlpZiAob3BzLT5nZXRfdm9sdGFnZSB8fCBvcHMtPmdldF92b2x0YWdlX3NlbCkgewogCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWljcm92b2x0cyk7CiAJCWlmIChzdGF0dXMgPCAwKQogCQkJcmV0dXJuIHN0YXR1czsKQEAgLTIyMDcsNyArMjM0NSw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAKIAkvKiBjb25zdHJhaW50cyBuZWVkIHNwZWNpZmljIHN1cHBvcnRpbmcgbWV0aG9kcyAqLwotCWlmIChvcHMtPnNldF92b2x0YWdlKSB7CisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2UgfHwgb3BzLT5zZXRfdm9sdGFnZV9zZWwpIHsKIAkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pbl9taWNyb3ZvbHRzKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlyZXR1cm4gc3RhdHVzOwpAQCAtMjI3MSw2ICsyNDA5LDIzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIHZvaWQgcmRldl9pbml0X2RlYnVnZnMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJcmRldi0+ZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcihyZGV2X2dldF9uYW1lKHJkZXYpLCBkZWJ1Z2ZzX3Jvb3QpOworCWlmIChJU19FUlIocmRldi0+ZGVidWdmcykgfHwgIXJkZXYtPmRlYnVnZnMpIHsKKwkJcmRldl93YXJuKHJkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwkJcmRldi0+ZGVidWdmcyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInVzZV9jb3VudCIsIDA0NDQsIHJkZXYtPmRlYnVnZnMsCisJCQkgICAmcmRldi0+dXNlX2NvdW50KTsKKwlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm9wZW5fY291bnQiLCAwNDQ0LCByZGV2LT5kZWJ1Z2ZzLAorCQkJICAgJnJkZXYtPm9wZW5fY291bnQpOworI2VuZGlmCit9CisKIC8qKgogICogcmVndWxhdG9yX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgcmVndWxhdG9yCiAgKiBAcmVndWxhdG9yX2Rlc2M6IHJlZ3VsYXRvciB0byByZWdpc3RlcgpAQCAtMjI4Miw3ICsyNDM3LDcgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yX3JlZ2lzdGVyKHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqcmVndWxhdG9yX2Rlc2MsCi0Jc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhLAorCXN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YSwKIAl2b2lkICpkcml2ZXJfZGF0YSkKIHsKIAlzdGF0aWMgYXRvbWljX3QgcmVndWxhdG9yX25vID0gQVRPTUlDX0lOSVQoMCk7CkBAIC0yMzAyLDYgKzI0NTcsMjIgQEAKIAlpZiAoIWluaXRfZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKKwkvKiBPbmx5IG9uZSBvZiBlYWNoIHNob3VsZCBiZSBpbXBsZW1lbnRlZCAqLworCVdBUk5fT04ocmVndWxhdG9yX2Rlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2UgJiYKKwkJcmVndWxhdG9yX2Rlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKTsKKwlXQVJOX09OKHJlZ3VsYXRvcl9kZXNjLT5vcHMtPnNldF92b2x0YWdlICYmCisJCXJlZ3VsYXRvcl9kZXNjLT5vcHMtPnNldF92b2x0YWdlX3NlbCk7CisKKwkvKiBJZiB3ZSdyZSB1c2luZyBzZWxlY3RvcnMgd2UgbXVzdCBpbXBsZW1lbnQgbGlzdF92b2x0YWdlLiAqLworCWlmIChyZWd1bGF0b3JfZGVzYy0+b3BzLT5nZXRfdm9sdGFnZV9zZWwgJiYKKwkgICAgIXJlZ3VsYXRvcl9kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZSkgeworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJaWYgKHJlZ3VsYXRvcl9kZXNjLT5vcHMtPnNldF92b2x0YWdlX3NlbCAmJgorCSAgICAhcmVndWxhdG9yX2Rlc2MtPm9wcy0+bGlzdF92b2x0YWdlKSB7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwogCXJkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2RldiksIEdGUF9LRVJORUwpOwogCWlmIChyZGV2ID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpAQCAtMjM5OSw2ICsyNTcwLDggQEAKIAl9CiAKIAlsaXN0X2FkZCgmcmRldi0+bGlzdCwgJnJlZ3VsYXRvcl9saXN0KTsKKworCXJkZXZfaW5pdF9kZWJ1Z2ZzKHJkZXYpOwogb3V0OgogCW11dGV4X3VubG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwogCXJldHVybiByZGV2OwpAQCAtMjQzMSwxMiArMjYwNCwxNiBAQAogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHJkZXYtPmRlYnVnZnMpOworI2VuZGlmCiAJV0FSTl9PTihyZGV2LT5vcGVuX2NvdW50KTsKIAl1bnNldF9yZWd1bGF0b3Jfc3VwcGxpZXMocmRldik7CiAJbGlzdF9kZWwoJnJkZXYtPmxpc3QpOwogCWlmIChyZGV2LT5zdXBwbHkpCiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZyZGV2LT5kZXYua29iaiwgInN1cHBseSIpOwogCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOworCWtmcmVlKHJkZXYtPmNvbnN0cmFpbnRzKTsKIAltdXRleF91bmxvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl91bnJlZ2lzdGVyKTsKQEAgLTI0NjUsOCArMjY0Miw3IEBACiAJCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcHJlcGFyZSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgcmRldl9nZXRfbmFtZShyZGV2KSk7CisJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIHByZXBhcmVcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0yNTcyLDEwICsyNzQ4LDE2IEBACiB7CiAJaW50IHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gInJlZ3VsYXRvcjogY29yZSB2ZXJzaW9uICVzXG4iLCBSRUdVTEFUT1JfVkVSU0lPTik7Ci0KIAlyZXQgPSBjbGFzc19yZWdpc3RlcigmcmVndWxhdG9yX2NsYXNzKTsKIAorI2lmZGVmIENPTkZJR19ERUJVR19GUworCWRlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmVndWxhdG9yIiwgTlVMTCk7CisJaWYgKElTX0VSUihkZWJ1Z2ZzX3Jvb3QpIHx8ICFkZWJ1Z2ZzX3Jvb3QpIHsKKwkJcHJfd2FybigicmVndWxhdG9yOiBGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwkJZGVidWdmc19yb290ID0gTlVMTDsKKwl9CisjZW5kaWYKKwogCXJlZ3VsYXRvcl9kdW1teV9pbml0KCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjU5MCw3ICsyNzcyLDYgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX29wcyAqb3BzOwogCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzICpjOwogCWludCBlbmFibGVkLCByZXQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKIAogCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIApAQCAtMjYwMiw4ICsyNzgzLDYgQEAKIAkJb3BzID0gcmRldi0+ZGVzYy0+b3BzOwogCQljID0gcmRldi0+Y29uc3RyYWludHM7CiAKLQkJbmFtZSA9IHJkZXZfZ2V0X25hbWUocmRldik7Ci0KIAkJaWYgKCFvcHMtPmRpc2FibGUgfHwgKGMgJiYgYy0+YWx3YXlzX29uKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNjI0LDEzICsyODAzLDEwIEBACiAJCWlmIChoYXNfZnVsbF9jb25zdHJhaW50cykgewogCQkJLyogV2UgbG9nIHNpbmNlIHRoaXMgbWF5IGtpbGwgdGhlIHN5c3RlbSBpZiBpdAogCQkJICogZ29lcyB3cm9uZy4gKi8KLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkaXNhYmxpbmcgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIG5hbWUpOworCQkJcmRldl9pbmZvKHJkZXYsICJkaXNhYmxpbmdcbiIpOwogCQkJcmV0ID0gb3BzLT5kaXNhYmxlKHJkZXYpOwogCQkJaWYgKHJldCAhPSAwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICIlczogY291bGRuJ3QgZGlzYWJsZSAlczogJWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCBuYW1lLCByZXQpOworCQkJCXJkZXZfZXJyKHJkZXYsICJjb3VsZG4ndCBkaXNhYmxlOiAlZFxuIiwgcmV0KTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIFRoZSBpbnRlbnRpb24gaXMgdGhhdCBpbiBmdXR1cmUgd2Ugd2lsbApAQCAtMjYzOCw5ICsyODE0LDcgQEAKIAkJCSAqIHNvIHdhcm4gZXZlbiBpZiB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8KIAkJCSAqIGFueXRoaW5nIGhlcmUuCiAJCQkgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiJXM6IGluY29tcGxldGUgY29uc3RyYWludHMsIGxlYXZpbmcgJXMgb25cbiIsCi0JCQkgICAgICAgX19mdW5jX18sIG5hbWUpOworCQkJcmRldl93YXJuKHJkZXYsICJpbmNvbXBsZXRlIGNvbnN0cmFpbnRzLCBsZWF2aW5nIG9uXG4iKTsKIAkJfQogCiB1bmxvY2s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCmluZGV4IGY4YzQ2NjEuLjM2MmUwODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogLyogREE5MDMwL0RBOTAzNCBjb21tb24gb3BlcmF0aW9ucyAqLwogc3RhdGljIGludCBkYTkwM3hfc2V0X2xkb192b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpkYTkwMzRfZGV2ID0gdG9fZGE5MDN4X2RldihyZGV2KTsKQEAgLTExOSw2ICsxMTksNyBAQAogCX0KIAogCXZhbCA9IChtaW5fdVYgLSBpbmZvLT5taW5fdVYgKyBpbmZvLT5zdGVwX3VWIC0gMSkgLyBpbmZvLT5zdGVwX3VWOworCSpzZWxlY3RvciA9IHZhbDsKIAl2YWwgPDw9IGluZm8tPnZvbF9zaGlmdDsKIAltYXNrID0gKCgxIDw8IGluZm8tPnZvbF9uYml0cykgLSAxKSAgPDwgaW5mby0+dm9sX3NoaWZ0OwogCkBAIC0xODcsNyArMTg4LDggQEAKIAogLyogREE5MDMwIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIHN0YXRpYyBpbnQgZGE5MDMwX3NldF9sZG8xXzE1X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJICAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCQkgICAgICB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJc3RydWN0IGRldmljZSAqZGE5MDN4X2RldiA9IHRvX2RhOTAzeF9kZXYocmRldik7CkBAIC0yMDAsNiArMjAyLDcgQEAKIAl9CiAKIAl2YWwgPSAobWluX3VWIC0gaW5mby0+bWluX3VWICsgaW5mby0+c3RlcF91ViAtIDEpIC8gaW5mby0+c3RlcF91VjsKKwkqc2VsZWN0b3IgPSB2YWw7CiAJdmFsIDw8PSBpbmZvLT52b2xfc2hpZnQ7CiAJbWFzayA9ICgoMSA8PCBpbmZvLT52b2xfbmJpdHMpIC0gMSkgIDw8IGluZm8tPnZvbF9zaGlmdDsKIAl2YWwgfD0gREE5MDMwX0xET19VTkxPQ0s7IC8qIGhhdmUgdG8gc2V0IFVOTE9DSyBiaXRzICovCkBAIC0yMTQsNyArMjE3LDggQEAKIH0KIAogc3RhdGljIGludCBkYTkwMzBfc2V0X2xkbzE0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCSAgICB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IGRhOTAzeF9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJc3RydWN0IGRldmljZSAqZGE5MDN4X2RldiA9IHRvX2RhOTAzeF9kZXYocmRldik7CkBAIC0yMzQsNiArMjM4LDcgQEAKIAkJdmFsID0gKG1pbl91ViAtIHRocmVzaCArIGluZm8tPnN0ZXBfdVYgLSAxKSAvIGluZm8tPnN0ZXBfdVY7CiAJfQogCisJKnNlbGVjdG9yID0gdmFsOwogCXZhbCA8PD0gaW5mby0+dm9sX3NoaWZ0OwogCW1hc2sgPSAoKDEgPDwgaW5mby0+dm9sX25iaXRzKSAtIDEpICA8PCBpbmZvLT52b2xfc2hpZnQ7CiAKQEAgLTI2Myw3ICsyNjgsNyBAQAogCiAvKiBEQTkwMzQgc3BlY2lmaWMgb3BlcmF0aW9ucyAqLwogc3RhdGljIGludCBkYTkwMzRfc2V0X2R2Y192b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpkYTkwMzRfZGV2ID0gdG9fZGE5MDN4X2RldihyZGV2KTsKQEAgLTI3Niw2ICsyODEsNyBAQAogCX0KIAogCXZhbCA9IChtaW5fdVYgLSBpbmZvLT5taW5fdVYgKyBpbmZvLT5zdGVwX3VWIC0gMSkgLyBpbmZvLT5zdGVwX3VWOworCSpzZWxlY3RvciA9IHZhbDsKIAl2YWwgPDw9IGluZm8tPnZvbF9zaGlmdDsKIAltYXNrID0gKCgxIDw8IGluZm8tPnZvbF9uYml0cykgLSAxKSAgPDwgaW5mby0+dm9sX3NoaWZ0OwogCkBAIC0yODksNyArMjk1LDcgQEAKIH0KIAogc3RhdGljIGludCBkYTkwMzRfc2V0X2xkbzEyX3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgZGE5MDN4X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpkYTkwMzRfZGV2ID0gdG9fZGE5MDN4X2RldihyZGV2KTsKQEAgLTMwMiw2ICszMDgsNyBAQAogCiAJdmFsID0gKG1pbl91ViAtIGluZm8tPm1pbl91ViArIGluZm8tPnN0ZXBfdVYgLSAxKSAvIGluZm8tPnN0ZXBfdVY7CiAJdmFsID0gKHZhbCA+PSAyMCkgPyB2YWwgLSAxMiA6ICgodmFsID4gNykgPyA4IDogdmFsKTsKKwkqc2VsZWN0b3IgPSB2YWw7CiAJdmFsIDw8PSBpbmZvLT52b2xfc2hpZnQ7CiAJbWFzayA9ICgoMSA8PCBpbmZvLT52b2xfbmJpdHMpIC0gMSkgIDw8IGluZm8tPnZvbF9zaGlmdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvaXNsNjI3MWEtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9pc2w2MjcxYS1yZWd1bGF0b3IuYwppbmRleCBiOGNjNjM4Li5lNGIzNTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9pc2w2MjcxYS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9pc2w2MjcxYS1yZWd1bGF0b3IuYwpAQCAtNTgsNyArNTgsOSBAQAogCXJldHVybiBkYXRhOwogfQogCi1zdGF0aWMgaW50IGlzbDYyNzFhX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsIGludCBtaW51ViwgaW50IG1heHVWKQorc3RhdGljIGludCBpc2w2MjcxYV9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCWludCBtaW51ViwgaW50IG1heHVWLAorCQkJCXVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgaXNsX3BtaWMgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHZzZWwsIGVyciwgZGF0YTsKQEAgLTc4LDYgKzgwLDggQEAKIAkvKiBDb252ZXJ0IHRoZSBtaWNyb3ZvbHRzIHRvIGRhdGEgZm9yIHRoZSBjaGlwICovCiAJZGF0YSA9ICh2c2VsIC0gSVNMNjI3MUFfVk9MVEFHRV9NSU4pIC8gSVNMNjI3MUFfVk9MVEFHRV9TVEVQOwogCisJKnNlbGVjdG9yID0gZGF0YTsKKwogCW11dGV4X2xvY2soJnBtaWMtPm10eCk7CiAKIAllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShwbWljLT5jbGllbnQsIGRhdGEpOwpAQCAtMTY5LDcgKzE3Myw3IEBACiAJCQkJCQlpbml0X2RhdGEsIHBtaWMpOwogCQlpZiAoSVNfRVJSKHBtaWMtPnJkZXZbaV0pKSB7CiAJCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciAlc1xuIiwgaWQtPm5hbWUpOwotCQkJZXJyID0gUFRSX0VSUihwbWljLT5yZGV2KTsKKwkJCWVyciA9IFBUUl9FUlIocG1pYy0+cmRldltpXSk7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcxLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwppbmRleCAzYmI4MmI2Li4wZjIyZWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzEuYwpAQCAtMTY4LDcgKzE2OCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbHAzOTcxX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAotCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICB1bnNpZ25lZCBpbnQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBscDM5NzEgKmxwMzk3MSA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgbGRvID0gcmRldl9nZXRfaWQoZGV2KSAtIExQMzk3MV9MRE8xOwpAQCAtMTg3LDYgKzE4OCw4IEBACiAJaWYgKHZhbCA+IExET19WT0xfTUFYX0lEWCB8fCB2b2xfbWFwW3ZhbF0gPiBtYXhfdm9sKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzZWxlY3RvciA9IHZhbDsKKwogCXJldHVybiBscDM5NzFfc2V0X2JpdHMobHAzOTcxLCBMUDM5NzFfTERPX1ZPTF9DT05UUl9SRUcobGRvKSwKIAkJCUxET19WT0xfQ09OVFJfTUFTSyA8PCBMRE9fVk9MX0NPTlRSX1NISUZUKGxkbyksCiAJCQl2YWwgPDwgTERPX1ZPTF9DT05UUl9TSElGVChsZG8pKTsKQEAgLTI1Niw3ICsyNTksOCBAQAogfQogCiBzdGF0aWMgaW50IGxwMzk3MV9kY2RjX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCi0JCQkJICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICAgdW5zaWduZWQgaW50ICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgbHAzOTcxICpscDM5NzEgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGJ1Y2sgPSByZGV2X2dldF9pZChkZXYpIC0gTFAzOTcxX0RDREMxOwpAQCAtMjc3LDYgKzI4MSw4IEBACiAJaWYgKHZhbCA+IEJVQ0tfVEFSR0VUX1ZPTF9NQVhfSURYIHx8IHZvbF9tYXBbdmFsXSA+IG1heF92b2wpCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gdmFsOworCiAJcmV0ID0gbHAzOTcxX3NldF9iaXRzKGxwMzk3MSwgTFAzOTcxX0JVQ0tfVEFSR0VUX1ZPTDFfUkVHKGJ1Y2spLAogCSAgICAgICBCVUNLX1RBUkdFVF9WT0xfTUFTSywgdmFsKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHAzOTcyLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYwppbmRleCBlMDcwNjJmLi42YWExYjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9scDM5NzIuYwpAQCAtMjkyLDcgKzI5Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbHAzOTcyX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAotCQkJCSAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICB1bnNpZ25lZCBpbnQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBscDM5NzIgKmxwMzk3MiA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgbGRvID0gcmRldl9nZXRfaWQoZGV2KSAtIExQMzk3Ml9MRE8xOwpAQCAtMzEzLDYgKzMxNCw4IEBACiAJaWYgKHZhbCA+IExQMzk3Ml9MRE9fVk9MX01BWF9JRFgobGRvKSB8fCB2b2xfbWFwW3ZhbF0gPiBtYXhfdm9sKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzZWxlY3RvciA9IHZhbDsKKwogCXNoaWZ0ID0gTFAzOTcyX0xET19WT0xfQ09OVFJfU0hJRlQobGRvKTsKIAlyZXQgPSBscDM5NzJfc2V0X2JpdHMobHAzOTcyLCBMUDM5NzJfTERPX1ZPTF9DT05UUl9SRUcobGRvKSwKIAkJTFAzOTcyX0xET19WT0xfTUFTSyhsZG8pIDw8IHNoaWZ0LCB2YWwgPDwgc2hpZnQpOwpAQCAtNDE2LDcgKzQxOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbHAzOTcyX2RjZGNfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKLQkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBscDM5NzIgKmxwMzk3MiA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgYnVjayA9IHJkZXZfZ2V0X2lkKGRldikgLSBMUDM5NzJfRENEQzE7CkBAIC00MzgsNiArNDQyLDggQEAKIAkgICAgdm9sX21hcFt2YWxdID4gbWF4X3ZvbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqc2VsZWN0b3IgPSB2YWw7CisKIAlyZXQgPSBscDM5NzJfc2V0X2JpdHMobHAzOTcyLCBMUDM5NzJfQlVDS19WT0wxX1JFRyhidWNrKSwKIAkJCQlMUDM5NzJfQlVDS19WT0xfTUFTSywgdmFsKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTU4Ni5jCmluZGV4IDU1OWNmYTIuLjNmNDk1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE1ODYuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNTg2LmMKQEAgLTYzLDEyICs2MywxMiBAQAogCXJldHVybiBtYXgxNTg2LT5taW5fdVYgKyAoc2VsZWN0b3IgKiByYW5nZV91ViAvIE1BWDE1ODZfVjNfTUFYX1ZTRUwpOwogfQogCi1zdGF0aWMgaW50IG1heDE1ODZfdjNfc2V0KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorc3RhdGljIGludCBtYXgxNTg2X3YzX3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCSAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBtYXgxNTg2X2RhdGEgKm1heDE1ODYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBtYXgxNTg2LT5jbGllbnQ7CiAJdW5zaWduZWQgcmFuZ2VfdVYgPSBtYXgxNTg2LT5tYXhfdVYgLSBtYXgxNTg2LT5taW5fdVY7Ci0JdW5zaWduZWQgc2VsZWN0b3I7CiAJdTggdjNfcHJvZzsKIAogCWlmIChtaW5fdVYgPiBtYXgxNTg2LT5tYXhfdVYgfHwgbWF4X3VWIDwgbWF4MTU4Ni0+bWluX3VWKQpAQCAtNzYsMTUgKzc2LDE1IEBACiAJaWYgKG1pbl91ViA8IG1heDE1ODYtPm1pbl91VikKIAkJbWluX3VWID0gbWF4MTU4Ni0+bWluX3VWOwogCi0Jc2VsZWN0b3IgPSAoKG1pbl91ViAtIG1heDE1ODYtPm1pbl91VikgKiBNQVgxNTg2X1YzX01BWF9WU0VMICsKKwkqc2VsZWN0b3IgPSAoKG1pbl91ViAtIG1heDE1ODYtPm1pbl91VikgKiBNQVgxNTg2X1YzX01BWF9WU0VMICsKIAkJCXJhbmdlX3VWIC0gMSkgLyByYW5nZV91VjsKLQlpZiAobWF4MTU4Nl92M19jYWxjX3ZvbHRhZ2UobWF4MTU4Niwgc2VsZWN0b3IpID4gbWF4X3VWKQorCWlmIChtYXgxNTg2X3YzX2NhbGNfdm9sdGFnZShtYXgxNTg2LCAqc2VsZWN0b3IpID4gbWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY2hhbmdpbmcgdm9sdGFnZSB2MyB0byAlZG12XG4iLAotCQltYXgxNTg2X3YzX2NhbGNfdm9sdGFnZShtYXgxNTg2LCBzZWxlY3RvcikgLyAxMDAwKTsKKwkJbWF4MTU4Nl92M19jYWxjX3ZvbHRhZ2UobWF4MTU4NiwgKnNlbGVjdG9yKSAvIDEwMDApOwogCi0JdjNfcHJvZyA9IEkyQ19WM19TRUxFQ1QgfCAodTgpIHNlbGVjdG9yOworCXYzX3Byb2cgPSBJMkNfVjNfU0VMRUNUIHwgKHU4KSAqc2VsZWN0b3I7CiAJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgdjNfcHJvZyk7CiB9CiAKQEAgLTExMCwxMCArMTEwLDEwIEBACiAJcmV0dXJuIHZvbHRhZ2VzX3V2W3NlbGVjdG9yXTsKIH0KIAotc3RhdGljIGludCBtYXgxNTg2X3Y2X3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91VikKK3N0YXRpYyBpbnQgbWF4MTU4Nl92Nl9zZXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkgIHVuc2lnbmVkIGludCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JdW5zaWduZWQgc2VsZWN0b3I7CiAJdTggdjZfcHJvZzsKIAogCWlmIChtaW5fdVYgPCBNQVgxNTg2X1Y2X01JTl9VViB8fCBtaW5fdVYgPiBNQVgxNTg2X1Y2X01BWF9VVikKQEAgLTEyMiwyMSArMTIyLDIxIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKG1pbl91ViA8IDE4MDAwMDApCi0JCXNlbGVjdG9yID0gMDsKKwkJKnNlbGVjdG9yID0gMDsKIAllbHNlIGlmIChtaW5fdVYgPCAyNTAwMDAwKQotCQlzZWxlY3RvciA9IDE7CisJCSpzZWxlY3RvciA9IDE7CiAJZWxzZSBpZiAobWluX3VWIDwgMzAwMDAwMCkKLQkJc2VsZWN0b3IgPSAyOworCQkqc2VsZWN0b3IgPSAyOwogCWVsc2UgaWYgKG1pbl91ViA+PSAzMDAwMDAwKQotCQlzZWxlY3RvciA9IDM7CisJCSpzZWxlY3RvciA9IDM7CiAKLQlpZiAobWF4MTU4Nl92Nl9jYWxjX3ZvbHRhZ2Uoc2VsZWN0b3IpID4gbWF4X3VWKQorCWlmIChtYXgxNTg2X3Y2X2NhbGNfdm9sdGFnZSgqc2VsZWN0b3IpID4gbWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY2hhbmdpbmcgdm9sdGFnZSB2NiB0byAlZG12XG4iLAotCQltYXgxNTg2X3Y2X2NhbGNfdm9sdGFnZShzZWxlY3RvcikgLyAxMDAwKTsKKwkJbWF4MTU4Nl92Nl9jYWxjX3ZvbHRhZ2UoKnNlbGVjdG9yKSAvIDEwMDApOwogCi0JdjZfcHJvZyA9IEkyQ19WNl9TRUxFQ1QgfCAodTgpIHNlbGVjdG9yOworCXY2X3Byb2cgPSBJMkNfVjZfU0VMRUNUIHwgKHU4KSAqc2VsZWN0b3I7CiAJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgdjZfcHJvZyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NDkuYwppbmRleCA2YjYwYTljLi4zMGViOWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjQ5LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY0OS5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIH0KIAogc3RhdGljIGludCBtYXg4NjQ5X3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJICAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkgICAgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBtYXg4NjQ5X3JlZ3VsYXRvcl9pbmZvICppbmZvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAl1bnNpZ25lZCBjaGFyIGRhdGEsIG1hc2s7CkBAIC0xNjgsNiArMTY4LDcgQEAKIAlkYXRhID0gKG1pbl91ViAtIE1BWDg2NDlfRENEQ19WTUlOICsgTUFYODY0OV9EQ0RDX1NURVAgLSAxKQogCQkvIE1BWDg2NDlfRENEQ19TVEVQOwogCW1hc2sgPSBNQVg4NjQ5X1ZPTF9NQVNLOworCSpzZWxlY3RvciA9IGRhdGEgJiBtYXNrOwogCiAJcmV0dXJuIG1heDg2NDlfc2V0X2JpdHMoaW5mby0+aTJjLCBpbmZvLT52b2xfcmVnLCBtYXNrLCBkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYwppbmRleCBjNTcwZTZlLi4zM2Y1ZDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jCkBAIC0xNDEsNyArMTQxLDggQEAKIAlyZXR1cm4gTUFYODY2MF9EQ0RDX01JTl9VViArIHNlbGVjdG9yICogTUFYODY2MF9EQ0RDX1NURVA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4ODY2MF9kY2RjX3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91VikKK3N0YXRpYyBpbnQgbWF4ODY2MF9kY2RjX3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnMpCiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IHJlZywgc2VsZWN0b3IsIGJpdHM7CkBAIC0xNTQsNiArMTU1LDcgQEAKIAogCXNlbGVjdG9yID0gKG1pbl91ViAtIChNQVg4NjYwX0RDRENfTUlOX1VWIC0gTUFYODY2MF9EQ0RDX1NURVAgKyAxKSkKIAkJCS8gTUFYODY2MF9EQ0RDX1NURVA7CisJKnMgPSBzZWxlY3RvcjsKIAogCXJldCA9IG1heDg2NjBfZGNkY19saXN0KHJkZXYsIHNlbGVjdG9yKTsKIAlpZiAocmV0IDwgMCB8fCByZXQgPiBtYXhfdVYpCkBAIC0xOTYsNyArMTk4LDggQEAKIAlyZXR1cm4gTUFYODY2MF9MRE81X01JTl9VViArIHNlbGVjdG9yICogTUFYODY2MF9MRE81X1NURVA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4ODY2MF9sZG81X3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91VikKK3N0YXRpYyBpbnQgbWF4ODY2MF9sZG81X3NldChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnMpCiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IHNlbGVjdG9yOwpAQCAtMjEzLDYgKzIxNiw4IEBACiAJaWYgKHJldCA8IDAgfHwgcmV0ID4gbWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzID0gc2VsZWN0b3I7CisKIAlyZXQgPSBtYXg4NjYwX3dyaXRlKG1heDg2NjAsIE1BWDg2NjBfTURUVjIsIDAsIHNlbGVjdG9yKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMjcwLDcgKzI3NSw4IEBACiAJcmV0dXJuIE1BWDg2NjBfTERPNjdfTUlOX1VWICsgc2VsZWN0b3IgKiBNQVg4NjYwX0xETzY3X1NURVA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4ODY2MF9sZG82N19zZXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCitzdGF0aWMgaW50IG1heDg2NjBfbGRvNjdfc2V0KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLAorCQkJICAgICBpbnQgbWF4X3VWLCB1bnNpZ25lZCBpbnQgKnMpCiB7CiAJc3RydWN0IG1heDg2NjAgKm1heDg2NjAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXU4IHNlbGVjdG9yOwpAQCAtMjg4LDYgKzI5NCw4IEBACiAJaWYgKHJldCA8IDAgfHwgcmV0ID4gbWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzID0gc2VsZWN0b3I7CisKIAlpZiAocmRldl9nZXRfaWQocmRldikgPT0gTUFYODY2MF9WNikKIAkJcmV0dXJuIG1heDg2NjBfd3JpdGUobWF4ODY2MCwgTUFYODY2MF9MMTJWQ1IsIDB4ZjAsIHNlbGVjdG9yKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODkyNS1yZWd1bGF0b3IuYwppbmRleCA1NTJjYWQ4Li44YWUxNDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTI1LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg5MjUtcmVndWxhdG9yLmMKQEAgLTU1LDcgKzU1LDcgQEAKIH0KIAogc3RhdGljIGludCBtYXg4OTI1X3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJICAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkgICAgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgaW50ICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgbWF4ODkyNV9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdW5zaWduZWQgY2hhciBkYXRhLCBtYXNrOwpAQCAtNjYsNiArNjYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YSA9IChtaW5fdVYgLSBpbmZvLT5taW5fdVYgKyBpbmZvLT5zdGVwX3VWIC0gMSkgLyBpbmZvLT5zdGVwX3VWOworCSpzZWxlY3RvciA9IGRhdGE7CiAJZGF0YSA8PD0gaW5mby0+dm9sX3NoaWZ0OwogCW1hc2sgPSAoKDEgPDwgaW5mby0+dm9sX25iaXRzKSAtIDEpIDw8IGluZm8tPnZvbF9zaGlmdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk1Mi5jCmluZGV4IDBkNWRkYTQuLmE4ZjRlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5NTIuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTUyLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogfQogCiBzdGF0aWMgaW50IG1heDg5NTJfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCSAgICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IG1heDg5NTJfZGF0YSAqbWF4ODk1MiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJczggdmlkID0gLTEsIGk7CkBAIC0xNTYsNiArMTU2LDcgQEAKIAlpZiAodmlkID49IDAgJiYgdmlkIDwgTUFYODk1Ml9OVU1fRFZTX01PREUpIHsKIAkJbWF4ODk1Mi0+dmlkMCA9ICh2aWQgJSAyID09IDEpOwogCQltYXg4OTUyLT52aWQxID0gKCgodmlkID4+IDEpICUgMikgPT0gMSk7CisJCSpzZWxlY3RvciA9IHZpZDsKIAkJZ3Bpb19zZXRfdmFsdWUobWF4ODk1Mi0+cGRhdGEtPmdwaW9fdmlkMCwgbWF4ODk1Mi0+dmlkMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKG1heDg5NTItPnBkYXRhLT5ncGlvX3ZpZDEsIG1heDg5NTItPnZpZDEpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODk5OC5jCmluZGV4IDVjMjA3NTYuLjBlYzQ5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg5OTguYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4OTk4LmMKQEAgLTMwNCw3ICszMDQsNyBAQAogfQogCiBzdGF0aWMgaW50IG1heDg5OThfc2V0X3ZvbHRhZ2VfbGRvKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBtYXg4OTk4X2RhdGEgKm1heDg5OTggPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBtYXg4OTk4LT5pb2Rldi0+aTJjOwpAQCAtMzMxLDYgKzMzMSw4IEBACiAJaWYgKGRlc2MtPm1pbiArIGRlc2MtPnN0ZXAqaSA+IG1heF92b2wpCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gaTsKKwogCXJldCA9IG1heDg5OThfZ2V0X3ZvbHRhZ2VfcmVnaXN0ZXIocmRldiwgJnJlZywgJnNoaWZ0LCAmbWFzayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTM1Miw3ICszNTQsNyBAQAogfQogCiBzdGF0aWMgaW50IG1heDg5OThfc2V0X3ZvbHRhZ2VfYnVjayhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBtYXg4OTk4X2RhdGEgKm1heDg5OTggPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCBtYXg4OTk4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KQEAgLTM4NCw2ICszODYsOCBAQAogCWlmIChkZXNjLT5taW4gKyBkZXNjLT5zdGVwKmkgPiBtYXhfdm9sKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzZWxlY3RvciA9IGk7CisKIAlyZXQgPSBtYXg4OTk4X2dldF92b2x0YWdlX3JlZ2lzdGVyKHJkZXYsICZyZWcsICZzaGlmdCwgJm1hc2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC00MjAsNiArNDI0LDkgQEAKIAkJCQl9CiAJCQl9CiAKKwkJCWlmIChwZGF0YS0+YnVja192b2x0YWdlX2xvY2spCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCS8qIG5vIHByZWRlZmluZSByZWd1bGF0b3IgZm91bmQgKi8KIAkJCW1heDg5OTgtPmJ1Y2sxX2lkeCA9IChidWNrMV9sYXN0X3ZhbCAlIDIpICsgMjsKIAkJCWRldl9kYmcobWF4ODk5OC0+ZGV2LCAibWF4ODk5OC0+YnVjazFfaWR4OiVkXG4iLApAQCAtNDQ3LDE4ICs0NTQsMjYgQEAKIAkJCSJCVUNLMiwgaTolZCBidWNrMl92b2wxOiVkLCBidWNrMl92b2wyOiVkXG4iCiAJCQksIGksIG1heDg5OTgtPmJ1Y2syX3ZvbFswXSwgbWF4ODk5OC0+YnVjazJfdm9sWzFdKTsKIAkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmJ1Y2syX3NldDMpKSB7Ci0JCQlpZiAobWF4ODk5OC0+YnVjazJfdm9sWzBdID09IGkpIHsKLQkJCQltYXg4OTk4LT5idWNrMV9pZHggPSAwOwotCQkJCWJ1Y2syX2dwaW9fc2V0KHBkYXRhLT5idWNrMl9zZXQzLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWF4ODk5OC0+YnVjazFfaWR4ID0gMTsKLQkJCQlyZXQgPSBtYXg4OTk4X2dldF92b2x0YWdlX3JlZ2lzdGVyKHJkZXYsICZyZWcsCi0JCQkJCQkJCSAgICZzaGlmdCwKLQkJCQkJCQkJICAgJm1hc2spOwotCQkJCXJldCA9IG1heDg5OThfd3JpdGVfcmVnKGkyYywgcmVnLCBpKTsKLQkJCQltYXg4OTk4LT5idWNrMl92b2xbMV0gPSBpOwotCQkJCWJ1Y2syX2dwaW9fc2V0KHBkYXRhLT5idWNrMl9zZXQzLCAxKTsKKworCQkJLyogY2hlY2sgaWYgcmVxdWVzdGVkIHZvbHRhZ2UgKi8KKwkJCS8qIHZhbHVlIGlzIGFscmVhZHkgZGVmaW5lZCAqLworCQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobWF4ODk5OC0+YnVjazJfdm9sKTsgaisrKSB7CisJCQkJaWYgKG1heDg5OTgtPmJ1Y2syX3ZvbFtqXSA9PSBpKSB7CisJCQkJCW1heDg5OTgtPmJ1Y2syX2lkeCA9IGo7CisJCQkJCWJ1Y2syX2dwaW9fc2V0KHBkYXRhLT5idWNrMl9zZXQzLCBqKTsKKwkJCQkJZ290byBidWNrMl9leGl0OworCQkJCX0KIAkJCX0KKworCQkJaWYgKHBkYXRhLT5idWNrX3ZvbHRhZ2VfbG9jaykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJbWF4ODk5OF9nZXRfdm9sdGFnZV9yZWdpc3RlcihyZGV2LAorCQkJCQkmcmVnLCAmc2hpZnQsICZtYXNrKTsKKwkJCXJldCA9IG1heDg5OThfd3JpdGVfcmVnKGkyYywgcmVnLCBpKTsKKwkJCW1heDg5OTgtPmJ1Y2syX3ZvbFttYXg4OTk4LT5idWNrMl9pZHhdID0gaTsKKwkJCWJ1Y2syX2dwaW9fc2V0KHBkYXRhLT5idWNrMl9zZXQzLCBtYXg4OTk4LT5idWNrMl9pZHgpOworYnVjazJfZXhpdDoKIAkJCWRldl9kYmcobWF4ODk5OC0+ZGV2LCAiJXM6IFNFVDM6JWRcbiIsIGkyYy0+bmFtZSwKIAkJCQlncGlvX2dldF92YWx1ZShwZGF0YS0+YnVjazJfc2V0MykpOwogCQl9IGVsc2UgewpAQCAtNzAzLDYgKzcxOCw5IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWF4ODk5OCk7CiAJaTJjID0gbWF4ODk5OC0+aW9kZXYtPmkyYzsKIAorCW1heDg5OTgtPmJ1Y2sxX2lkeCA9IHBkYXRhLT5idWNrMV9kZWZhdWx0X2lkeDsKKwltYXg4OTk4LT5idWNrMl9pZHggPSBwZGF0YS0+YnVjazJfZGVmYXVsdF9pZHg7CisKIAkvKiBOT1RFOiAqLwogCS8qIEZvciB1bnVzZWQgR1BJTyBOT1QgbWFya2VkIGFzIC0xICh0aGVyZW9mIGVxdWFsIHRvIDApICBXQVJOX09OICovCiAJLyogd2lsbCBiZSBkaXNwbGF5ZWQgKi8KQEAgLTczNSwyMyArNzUzLDQ2IEBACiAJCWkgPSAwOwogCQl3aGlsZSAoYnVjazEyX3ZvbHRhZ2VfbWFwX2Rlc2MubWluICsKIAkJICAgICAgIGJ1Y2sxMl92b2x0YWdlX21hcF9kZXNjLnN0ZXAqaQotCQkgICAgICAgIT0gKHBkYXRhLT5idWNrMV9tYXhfdm9sdGFnZTEgLyAxMDAwKSkKKwkJICAgICAgIDwgKHBkYXRhLT5idWNrMV92b2x0YWdlMSAvIDEwMDApKQogCQkJaSsrOwotCQlwcmludGsoS0VSTl9FUlIgImk6JWQsIGJ1Y2sxX2lkeDolZFxuIiwgaSwgbWF4ODk5OC0+YnVjazFfaWR4KTsKIAkJbWF4ODk5OC0+YnVjazFfdm9sWzBdID0gaTsKIAkJcmV0ID0gbWF4ODk5OF93cml0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19CVUNLMV9WT0xUQUdFMSwgaSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCS8qIFNldCBwcmVkZWZpbmVkIHZhbHVlIGZvciBCVUNLMSByZWdpc3RlciAyICovCiAJCWkgPSAwOwogCQl3aGlsZSAoYnVjazEyX3ZvbHRhZ2VfbWFwX2Rlc2MubWluICsKIAkJICAgICAgIGJ1Y2sxMl92b2x0YWdlX21hcF9kZXNjLnN0ZXAqaQotCQkgICAgICAgIT0gKHBkYXRhLT5idWNrMV9tYXhfdm9sdGFnZTIgLyAxMDAwKSkKKwkJICAgICAgIDwgKHBkYXRhLT5idWNrMV92b2x0YWdlMiAvIDEwMDApKQogCQkJaSsrOwogCiAJCW1heDg5OTgtPmJ1Y2sxX3ZvbFsxXSA9IGk7Ci0JCXByaW50ayhLRVJOX0VSUiAiaTolZCwgYnVjazFfaWR4OiVkXG4iLCBpLCBtYXg4OTk4LT5idWNrMV9pZHgpOwotCQlyZXQgPSBtYXg4OTk4X3dyaXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0JVQ0sxX1ZPTFRBR0UyLCBpKQotCQkJKyByZXQ7CisJCXJldCA9IG1heDg5OThfd3JpdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQlVDSzFfVk9MVEFHRTIsIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBTZXQgcHJlZGVmaW5lZCB2YWx1ZSBmb3IgQlVDSzEgcmVnaXN0ZXIgMyAqLworCQlpID0gMDsKKwkJd2hpbGUgKGJ1Y2sxMl92b2x0YWdlX21hcF9kZXNjLm1pbiArCisJCSAgICAgICBidWNrMTJfdm9sdGFnZV9tYXBfZGVzYy5zdGVwKmkKKwkJICAgICAgIDwgKHBkYXRhLT5idWNrMV92b2x0YWdlMyAvIDEwMDApKQorCQkJaSsrOworCisJCW1heDg5OTgtPmJ1Y2sxX3ZvbFsyXSA9IGk7CisJCXJldCA9IG1heDg5OThfd3JpdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQlVDSzFfVk9MVEFHRTMsIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBTZXQgcHJlZGVmaW5lZCB2YWx1ZSBmb3IgQlVDSzEgcmVnaXN0ZXIgNCAqLworCQlpID0gMDsKKwkJd2hpbGUgKGJ1Y2sxMl92b2x0YWdlX21hcF9kZXNjLm1pbiArCisJCSAgICAgICBidWNrMTJfdm9sdGFnZV9tYXBfZGVzYy5zdGVwKmkKKwkJICAgICAgIDwgKHBkYXRhLT5idWNrMV92b2x0YWdlNCAvIDEwMDApKQorCQkJaSsrOworCisJCW1heDg5OTgtPmJ1Y2sxX3ZvbFszXSA9IGk7CisJCXJldCA9IG1heDg5OThfd3JpdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQlVDSzFfVk9MVEFHRTQsIGkpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNzY4LDE4ICs4MDksMjggQEAKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5idWNrMl9zZXQzLAogCQkJCSAgICAgIG1heDg5OTgtPmJ1Y2syX2lkeCAmIDB4MSk7CiAKLQkJLyogQlVDSzIgLSBzZXQgcHJlc2V0IGRlZmF1bHQgdm9sdGFnZSB2YWx1ZSB0byBidWNrMl92b2xbMF0gKi8KKwkJLyogQlVDSzIgcmVnaXN0ZXIgMSAqLwogCQlpID0gMDsKIAkJd2hpbGUgKGJ1Y2sxMl92b2x0YWdlX21hcF9kZXNjLm1pbiArCiAJCSAgICAgICBidWNrMTJfdm9sdGFnZV9tYXBfZGVzYy5zdGVwKmkKLQkJICAgICAgICE9IChwZGF0YS0+YnVjazJfbWF4X3ZvbHRhZ2UgLyAxMDAwKSkKKwkJICAgICAgIDwgKHBkYXRhLT5idWNrMl92b2x0YWdlMSAvIDEwMDApKQogCQkJaSsrOwotCQlwcmludGsoS0VSTl9FUlIgImk6JWQsIGJ1Y2syX2lkeDolZFxuIiwgaSwgbWF4ODk5OC0+YnVjazJfaWR4KTsKIAkJbWF4ODk5OC0+YnVjazJfdm9sWzBdID0gaTsKIAkJcmV0ID0gbWF4ODk5OF93cml0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19CVUNLMl9WT0xUQUdFMSwgaSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCisJCS8qIEJVQ0syIHJlZ2lzdGVyIDIgKi8KKwkJaSA9IDA7CisJCXdoaWxlIChidWNrMTJfdm9sdGFnZV9tYXBfZGVzYy5taW4gKworCQkgICAgICAgYnVjazEyX3ZvbHRhZ2VfbWFwX2Rlc2Muc3RlcCppCisJCSAgICAgICA8IChwZGF0YS0+YnVjazJfdm9sdGFnZTIgLyAxMDAwKSkKKwkJCWkrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMjolZCwgYnVjazJfaWR4OiVkXG4iLCBpLCBtYXg4OTk4LT5idWNrMl9pZHgpOworCQltYXg4OTk4LT5idWNrMl92b2xbMV0gPSBpOworCQlyZXQgPSBtYXg4OTk4X3dyaXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0JVQ0syX1ZPTFRBR0UyLCBpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fcmVndWxhdG9yczsgaSsrKSB7CkBAIC04MzEsNiArODgyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OThfcG1pY19pZFtdID0geworCXsgIm1heDg5OTgtcG1pYyIsIFRZUEVfTUFYODk5OCB9LAorCXsgImxwMzk3NC1wbWljIiwgVFlQRV9MUDM5NzQgfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDg5OThfcG1pY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibWF4ODk5OC1wbWljIiwKQEAgLTgzOCw2ICs4OTUsNyBAQAogCX0sCiAJLnByb2JlID0gbWF4ODk5OF9wbWljX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYXg4OTk4X3BtaWNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBtYXg4OTk4X3BtaWNfaWQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtYXg4OTk4X3BtaWNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzc4My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTM3ODMtcmVndWxhdG9yLmMKaW5kZXggZWNkOTlmNS4uM2U1ZDBjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzc4My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzNzgzLXJlZ3VsYXRvci5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIFJlZ3VsYXRvciBEcml2ZXIgZm9yIEZyZWVzY2FsZSBNQzEzNzgzIFBNSUMKICAqCisgKiBDb3B5cmlnaHQgMjAxMCBZb25nIFNoZW4gPHlvbmcuc2hlbkBsaW5hcm8ub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDA4IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXggPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CiAgKiBDb3B5cmlnaHQgMjAwOSBBbGJlcnRvIFBhbml6em8gPG1hcmFtYW9wZXJjaGVzZWltb3J0b0BnbWFpbC5jb20+CiAgKgpAQCAtMTcsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSAibWMxM3h4eC5oIgogCiAjZGVmaW5lIE1DMTM3ODNfUkVHX1NXSVRDSEVSUzUJCQkyOQogI2RlZmluZSBNQzEzNzgzX1JFR19TV0lUQ0hFUlM1X1NXM0VOCQkJKDEgPDwgMjApCkBAIC04OSwxNTQgKzkxLDEwNiBAQAogI2RlZmluZSBNQzEzNzgzX1JFR19QT1dFUk1JU0NfUFdHVFNQSV9NCQkJKDMgPDwgMTUpCiAKIAotc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzYzsKLQlpbnQgcmVnOwotCWludCBlbmFibGVfYml0OwotCWludCB2c2VsX3JlZzsKLQlpbnQgdnNlbF9zaGlmdDsKLQlpbnQgdnNlbF9tYXNrOwotCWludCBjb25zdCAqdm9sdGFnZXM7Ci19OwotCiAvKiBWb2x0YWdlIFZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3N3M192YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M19zdzNfdmFsW10gPSB7CiAJNTAwMDAwMCwgNTAwMDAwMCwgNTAwMDAwMCwgNTUwMDAwMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgY29uc3QgbWMxMzc4M192YXVkaW9fdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdmF1ZGlvX3ZhbFtdID0gewogCTI3NzUwMDAsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IG1jMTM3ODNfdmlvaGlfdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdmlvaGlfdmFsW10gPSB7CiAJMjc3NTAwMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgY29uc3QgbWMxMzc4M192aW9sb192YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M192aW9sb192YWxbXSA9IHsKIAkxMjAwMDAwLCAxMzAwMDAwLCAxNTAwMDAwLCAxODAwMDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3ZkaWdfdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdmRpZ192YWxbXSA9IHsKIAkxMjAwMDAwLCAxMzAwMDAwLCAxNTAwMDAwLCAxODAwMDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3ZnZW5fdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdmdlbl92YWxbXSA9IHsKIAkxMjAwMDAwLCAxMzAwMDAwLCAxNTAwMDAwLCAxODAwMDAwLAogCTExMDAwMDAsIDIwMDAwMDAsIDI3NzUwMDAsIDI0MDAwMDAsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IG1jMTM3ODNfdnJmZGlnX3ZhbFtdID0geworc3RhdGljIGNvbnN0IGludCBtYzEzNzgzX3ZyZmRpZ192YWxbXSA9IHsKIAkxMjAwMDAwLCAxNTAwMDAwLCAxODAwMDAwLCAxODc1MDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3ZyZnJlZl92YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M192cmZyZWZfdmFsW10gPSB7CiAJMjQ3NTAwMCwgMjYwMDAwMCwgMjcwMDAwMCwgMjc3NTAwMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgY29uc3QgbWMxMzc4M192cmZjcF92YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M192cmZjcF92YWxbXSA9IHsKIAkyNzAwMDAwLCAyNzc1MDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3ZzaW1fdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdnNpbV92YWxbXSA9IHsKIAkxODAwMDAwLCAyOTAwMDAwLCAzMDAwMDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3Zlc2ltX3ZhbFtdID0geworc3RhdGljIGNvbnN0IGludCBtYzEzNzgzX3Zlc2ltX3ZhbFtdID0gewogCTE4MDAwMDAsIDI5MDAwMDAsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IG1jMTM3ODNfdmNhbV92YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M192Y2FtX3ZhbFtdID0gewogCTE1MDAwMDAsIDE4MDAwMDAsIDI1MDAwMDAsIDI1NTAwMDAsCiAJMjYwMDAwMCwgMjc1MDAwMCwgMjgwMDAwMCwgMzAwMDAwMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgY29uc3QgbWMxMzc4M192cmZiZ192YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M192cmZiZ192YWxbXSA9IHsKIAkxMjUwMDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3Z2aWJfdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdnZpYl92YWxbXSA9IHsKIAkxMzAwMDAwLCAxODAwMDAwLCAyMDAwMDAwLCAzMDAwMDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX3ZtbWNfdmFsW10gPSB7CitzdGF0aWMgY29uc3QgaW50IG1jMTM3ODNfdm1tY192YWxbXSA9IHsKIAkxNjAwMDAwLCAxODAwMDAwLCAyMDAwMDAwLCAyNjAwMDAwLAogCTI3MDAwMDAsIDI4MDAwMDAsIDI5MDAwMDAsIDMwMDAwMDAsCiB9OwogCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IG1jMTM3ODNfdnJmX3ZhbFtdID0geworc3RhdGljIGNvbnN0IGludCBtYzEzNzgzX3ZyZl92YWxbXSA9IHsKIAkxNTAwMDAwLCAxODc1MDAwLCAyNzAwMDAwLCAyNzc1MDAwLAogfTsKIAotc3RhdGljIGNvbnN0IGludCBjb25zdCBtYzEzNzgzX2dwb192YWxbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzc4M19ncG9fdmFsW10gPSB7CiAJMzEwMDAwMCwKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgY29uc3QgbWMxMzc4M19wd2d0ZHJ2X3ZhbFtdID0geworc3RhdGljIGNvbnN0IGludCBtYzEzNzgzX3B3Z3RkcnZfdmFsW10gPSB7CiAJNTUwMDAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBtYzEzNzgzX3JlZ3VsYXRvcl9vcHM7Ci1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbWMxMzc4M19maXhlZF9yZWd1bGF0b3Jfb3BzOwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIG1jMTM3ODNfZ3BvX3JlZ3VsYXRvcl9vcHM7CiAKLSNkZWZpbmUgTUMxMzc4M19ERUZJTkUocHJlZml4LCBfbmFtZSwgX3JlZywgX3ZzZWxfcmVnLCBfdm9sdGFnZXMpCVwKLQlbTUMxMzc4M18gIyMgcHJlZml4ICMjIF8gIyMgX25hbWVdID0gewkJCQlcCi0JCS5kZXNjID0gewkJCQkJCVwKLQkJCS5uYW1lID0gI3ByZWZpeCAiXyIgI19uYW1lLAkJCVwKLQkJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRShfdm9sdGFnZXMpLAkJXAotCQkJLm9wcyA9ICZtYzEzNzgzX3JlZ3VsYXRvcl9vcHMsCQkJXAotCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCi0JCQkuaWQgPSBNQzEzNzgzXyAjIyBwcmVmaXggIyMgXyAjIyBfbmFtZSwJCVwKLQkJCS5vd25lciA9IFRISVNfTU9EVUxFLAkJCQlcCi0JCX0sCQkJCQkJCVwKLQkJLnJlZyA9IE1DMTM3ODNfUkVHXyAjIyBfcmVnLAkJCQlcCi0JCS5lbmFibGVfYml0ID0gTUMxMzc4M19SRUdfICMjIF9yZWcgIyMgXyAjIyBfbmFtZSAjIyBFTiwJXAotCQkudnNlbF9yZWcgPSBNQzEzNzgzX1JFR18gIyMgX3ZzZWxfcmVnLAkJCVwKLQkJLnZzZWxfc2hpZnQgPSBNQzEzNzgzX1JFR18gIyMgX3ZzZWxfcmVnICMjIF8gIyMgX25hbWUgIyMgVlNFTCxcCi0JCS52c2VsX21hc2sgPSBNQzEzNzgzX1JFR18gIyMgX3ZzZWxfcmVnICMjIF8gIyMgX25hbWUgIyMgVlNFTF9NLFwKLQkJLnZvbHRhZ2VzID0gIF92b2x0YWdlcywJCQkJCVwKLQl9CisjZGVmaW5lIE1DMTM3ODNfREVGSU5FKHByZWZpeCwgbmFtZSwgcmVnLCB2c2VsX3JlZywgdm9sdGFnZXMpCVwKKwlNQzEzeHh4X0RFRklORShNQzEzNzgzX1JFR18sIG5hbWUsIHJlZywgdnNlbF9yZWcsIHZvbHRhZ2VzLCBcCisJCQltYzEzeHh4X3JlZ3VsYXRvcl9vcHMpCiAKLSNkZWZpbmUgTUMxMzc4M19GSVhFRF9ERUZJTkUocHJlZml4LCBfbmFtZSwgX3JlZywgX3ZvbHRhZ2VzKQkJXAotCVtNQzEzNzgzXyAjIyBwcmVmaXggIyMgXyAjIyBfbmFtZV0gPSB7CQkJCVwKLQkJLmRlc2MgPSB7CQkJCQkJXAotCQkJLm5hbWUgPSAjcHJlZml4ICJfIiAjX25hbWUsCQkJXAotCQkJLm5fdm9sdGFnZXMgPSBBUlJBWV9TSVpFKF92b2x0YWdlcyksCQlcCi0JCQkub3BzID0gJm1jMTM3ODNfZml4ZWRfcmVndWxhdG9yX29wcywJCVwKLQkJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAotCQkJLmlkID0gTUMxMzc4M18gIyMgcHJlZml4ICMjIF8gIyMgX25hbWUsCQlcCi0JCQkub3duZXIgPSBUSElTX01PRFVMRSwJCQkJXAotCQl9LAkJCQkJCQlcCi0JCS5yZWcgPSBNQzEzNzgzX1JFR18gIyMgX3JlZywJCQkJXAotCQkuZW5hYmxlX2JpdCA9IE1DMTM3ODNfUkVHXyAjIyBfcmVnICMjIF8gIyMgX25hbWUgIyMgRU4sCVwKLQkJLnZvbHRhZ2VzID0gIF92b2x0YWdlcywJCQkJCVwKLQl9CisjZGVmaW5lIE1DMTM3ODNfRklYRURfREVGSU5FKHByZWZpeCwgbmFtZSwgcmVnLCB2b2x0YWdlcykJCVwKKwlNQzEzeHh4X0ZJWEVEX0RFRklORShNQzEzNzgzX1JFR18sIG5hbWUsIHJlZywgdm9sdGFnZXMsIFwKKwkJCW1jMTN4eHhfZml4ZWRfcmVndWxhdG9yX29wcykKIAotI2RlZmluZSBNQzEzNzgzX0dQT19ERUZJTkUocHJlZml4LCBfbmFtZSwgX3JlZywgIF92b2x0YWdlcykJCVwKLQlbTUMxMzc4M18gIyMgcHJlZml4ICMjIF8gIyMgX25hbWVdID0gewkJCQlcCi0JCS5kZXNjID0gewkJCQkJCVwKLQkJCS5uYW1lID0gI3ByZWZpeCAiXyIgI19uYW1lLAkJCVwKLQkJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRShfdm9sdGFnZXMpLAkJXAotCQkJLm9wcyA9ICZtYzEzNzgzX2dwb19yZWd1bGF0b3Jfb3BzLAkJXAotCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCi0JCQkuaWQgPSBNQzEzNzgzXyAjIyBwcmVmaXggIyMgXyAjIyBfbmFtZSwJCVwKLQkJCS5vd25lciA9IFRISVNfTU9EVUxFLAkJCQlcCi0JCX0sCQkJCQkJCVwKLQkJLnJlZyA9IE1DMTM3ODNfUkVHXyAjIyBfcmVnLAkJCQlcCi0JCS5lbmFibGVfYml0ID0gTUMxMzc4M19SRUdfICMjIF9yZWcgIyMgXyAjIyBfbmFtZSAjIyBFTiwJXAotCQkudm9sdGFnZXMgPSAgX3ZvbHRhZ2VzLAkJCQkJXAotCX0KKyNkZWZpbmUgTUMxMzc4M19HUE9fREVGSU5FKHByZWZpeCwgbmFtZSwgcmVnLCB2b2x0YWdlcykJCVwKKwlNQzEzeHh4X0dQT19ERUZJTkUoTUMxMzc4M19SRUdfLCBuYW1lLCByZWcsIHZvbHRhZ2VzLCBcCisJCQltYzEzNzgzX2dwb19yZWd1bGF0b3Jfb3BzKQogCiAjZGVmaW5lIE1DMTM3ODNfREVGSU5FX1NXKF9uYW1lLCBfcmVnLCBfdnNlbF9yZWcsIF92b2x0YWdlcykJCVwKLQlNQzEzNzgzX0RFRklORShTVywgX25hbWUsIF9yZWcsIF92c2VsX3JlZywgX3ZvbHRhZ2VzKQorCU1DMTM3ODNfREVGSU5FKFJFRywgX25hbWUsIF9yZWcsIF92c2VsX3JlZywgX3ZvbHRhZ2VzKQogI2RlZmluZSBNQzEzNzgzX0RFRklORV9SRUdVKF9uYW1lLCBfcmVnLCBfdnNlbF9yZWcsIF92b2x0YWdlcykJCVwKLQlNQzEzNzgzX0RFRklORShSRUdVLCBfbmFtZSwgX3JlZywgX3ZzZWxfcmVnLCBfdm9sdGFnZXMpCisJTUMxMzc4M19ERUZJTkUoUkVHLCBfbmFtZSwgX3JlZywgX3ZzZWxfcmVnLCBfdm9sdGFnZXMpCiAKLXN0YXRpYyBzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3IgbWMxMzc4M19yZWd1bGF0b3JzW10gPSB7CitzdGF0aWMgc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yIG1jMTM3ODNfcmVndWxhdG9yc1tdID0gewogCU1DMTM3ODNfREVGSU5FX1NXKFNXMywgU1dJVENIRVJTNSwgU1dJVENIRVJTNSwgbWMxMzc4M19zdzNfdmFsKSwKIAotCU1DMTM3ODNfRklYRURfREVGSU5FKFJFR1UsIFZBVURJTywgUkVHVUxBVE9STU9ERTAsIG1jMTM3ODNfdmF1ZGlvX3ZhbCksCi0JTUMxMzc4M19GSVhFRF9ERUZJTkUoUkVHVSwgVklPSEksIFJFR1VMQVRPUk1PREUwLCBtYzEzNzgzX3Zpb2hpX3ZhbCksCisJTUMxMzc4M19GSVhFRF9ERUZJTkUoUkVHLCBWQVVESU8sIFJFR1VMQVRPUk1PREUwLCBtYzEzNzgzX3ZhdWRpb192YWwpLAorCU1DMTM3ODNfRklYRURfREVGSU5FKFJFRywgVklPSEksIFJFR1VMQVRPUk1PREUwLCBtYzEzNzgzX3Zpb2hpX3ZhbCksCiAJTUMxMzc4M19ERUZJTkVfUkVHVShWSU9MTywgUkVHVUxBVE9STU9ERTAsIFJFR1VMQVRPUlNFVFRJTkcwLAlcCiAJCQkgICAgbWMxMzc4M192aW9sb192YWwpLAogCU1DMTM3ODNfREVGSU5FX1JFR1UoVkRJRywgUkVHVUxBVE9STU9ERTAsIFJFR1VMQVRPUlNFVFRJTkcwLAlcCkBAIC0yNTUsNyArMjA5LDcgQEAKIAkJCSAgICBtYzEzNzgzX3Zlc2ltX3ZhbCksCiAJTUMxMzc4M19ERUZJTkVfUkVHVShWQ0FNLCBSRUdVTEFUT1JNT0RFMSwgUkVHVUxBVE9SU0VUVElORzAsCVwKIAkJCSAgICBtYzEzNzgzX3ZjYW1fdmFsKSwKLQlNQzEzNzgzX0ZJWEVEX0RFRklORShSRUdVLCBWUkZCRywgUkVHVUxBVE9STU9ERTEsIG1jMTM3ODNfdnJmYmdfdmFsKSwKKwlNQzEzNzgzX0ZJWEVEX0RFRklORShSRUcsIFZSRkJHLCBSRUdVTEFUT1JNT0RFMSwgbWMxMzc4M192cmZiZ192YWwpLAogCU1DMTM3ODNfREVGSU5FX1JFR1UoVlZJQiwgUkVHVUxBVE9STU9ERTEsIFJFR1VMQVRPUlNFVFRJTkcxLAlcCiAJCQkgICAgbWMxMzc4M192dmliX3ZhbCksCiAJTUMxMzc4M19ERUZJTkVfUkVHVShWUkYxLCBSRUdVTEFUT1JNT0RFMSwgUkVHVUxBVE9SU0VUVElORzEsCVwKQEAgLTI2NiwyMTUgKzIyMCwyNCBAQAogCQkJICAgIG1jMTM3ODNfdm1tY192YWwpLAogCU1DMTM3ODNfREVGSU5FX1JFR1UoVk1NQzIsIFJFR1VMQVRPUk1PREUxLCBSRUdVTEFUT1JTRVRUSU5HMSwJXAogCQkJICAgIG1jMTM3ODNfdm1tY192YWwpLAotCU1DMTM3ODNfR1BPX0RFRklORShSRUdVLCBHUE8xLCBQT1dFUk1JU0MsIG1jMTM3ODNfZ3BvX3ZhbCksCi0JTUMxMzc4M19HUE9fREVGSU5FKFJFR1UsIEdQTzIsIFBPV0VSTUlTQywgbWMxMzc4M19ncG9fdmFsKSwKLQlNQzEzNzgzX0dQT19ERUZJTkUoUkVHVSwgR1BPMywgUE9XRVJNSVNDLCBtYzEzNzgzX2dwb192YWwpLAotCU1DMTM3ODNfR1BPX0RFRklORShSRUdVLCBHUE80LCBQT1dFUk1JU0MsIG1jMTM3ODNfZ3BvX3ZhbCksCi0JTUMxMzc4M19HUE9fREVGSU5FKFJFR1UsIFBXR1QxU1BJLCBQT1dFUk1JU0MsIG1jMTM3ODNfcHdndGRydl92YWwpLAotCU1DMTM3ODNfR1BPX0RFRklORShSRUdVLCBQV0dUMlNQSSwgUE9XRVJNSVNDLCBtYzEzNzgzX3B3Z3RkcnZfdmFsKSwKKwlNQzEzNzgzX0dQT19ERUZJTkUoUkVHLCBHUE8xLCBQT1dFUk1JU0MsIG1jMTM3ODNfZ3BvX3ZhbCksCisJTUMxMzc4M19HUE9fREVGSU5FKFJFRywgR1BPMiwgUE9XRVJNSVNDLCBtYzEzNzgzX2dwb192YWwpLAorCU1DMTM3ODNfR1BPX0RFRklORShSRUcsIEdQTzMsIFBPV0VSTUlTQywgbWMxMzc4M19ncG9fdmFsKSwKKwlNQzEzNzgzX0dQT19ERUZJTkUoUkVHLCBHUE80LCBQT1dFUk1JU0MsIG1jMTM3ODNfZ3BvX3ZhbCksCisJTUMxMzc4M19HUE9fREVGSU5FKFJFRywgUFdHVDFTUEksIFBPV0VSTUlTQywgbWMxMzc4M19wd2d0ZHJ2X3ZhbCksCisJTUMxMzc4M19HUE9fREVGSU5FKFJFRywgUFdHVDJTUEksIFBPV0VSTUlTQywgbWMxMzc4M19wd2d0ZHJ2X3ZhbCksCiB9OwogCi1zdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfcHJpdiB7Ci0Jc3RydWN0IG1jMTM3ODMgKm1jMTM3ODM7Ci0JdTMyIHBvd2VybWlzY19wd2d0X3N0YXRlOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3JzW107Ci19OwotCi1zdGF0aWMgaW50IG1jMTM3ODNfcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3N0YXRpYyBpbnQgbWMxMzc4M19wb3dlcm1pc2Nfcm13KHN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2LCB1MzIgbWFzaywKKwkJdTMyIHZhbCkKIHsKLQlzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7Ci0JaW50IHJldDsKLQotCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgaWQ6ICVkXG4iLCBfX2Z1bmNfXywgaWQpOwotCi0JbWMxMzc4M19sb2NrKHByaXYtPm1jMTM3ODMpOwotCXJldCA9IG1jMTM3ODNfcmVnX3Jtdyhwcml2LT5tYzEzNzgzLCBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnJlZywKLQkJCW1jMTM3ODNfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCwKLQkJCW1jMTM3ODNfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1jMTM3ODNfcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCi17Ci0Jc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX3ByaXYgKnByaXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwotCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZFxuIiwgX19mdW5jX18sIGlkKTsKLQotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKLQlyZXQgPSBtYzEzNzgzX3JlZ19ybXcocHJpdi0+bWMxMzc4MywgbWMxMzc4M19yZWd1bGF0b3JzW2lkXS5yZWcsCi0JCQltYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQsIDApOwotCW1jMTM3ODNfdW5sb2NrKHByaXYtPm1jMTM3ODMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYzEzNzgzX3JlZ3VsYXRvcl9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQotewotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQltYzEzNzgzX2xvY2socHJpdi0+bWMxMzc4Myk7Ci0JcmV0ID0gbWMxMzc4M19yZWdfcmVhZChwcml2LT5tYzEzNzgzLCBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnJlZywgJnZhbCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuICh2YWwgJiBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQpICE9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWMxMzc4M19yZWd1bGF0b3JfbGlzdF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCi17Ci0JaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7Ci0KLQlpZiAoc2VsZWN0b3IgPj0gbWMxMzc4M19yZWd1bGF0b3JzW2lkXS5kZXNjLm5fdm9sdGFnZXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIG1jMTM3ODNfcmVndWxhdG9yc1tpZF0udm9sdGFnZXNbc2VsZWN0b3JdOwotfQotCi1zdGF0aWMgaW50IG1jMTM3ODNfZ2V0X2Jlc3Rfdm9sdGFnZV9pbmRleChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCi17Ci0JaW50IHJlZ19pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCWludCBpOwotCWludCBiZXN0bWF0Y2g7Ci0JaW50IGJlc3RpbmRleDsKLQotCS8qCi0JICogTG9jYXRlIHRoZSBtaW5pbXVtIHZvbHRhZ2UgZml0dGluZyB0aGUgY3JpdGVyaWEgb24KLQkgKiB0aGlzIHJlZ3VsYXRvci4gVGhlIHN3aXRjaGFibGUgdm9sdGFnZXMgYXJlIG5vdAotCSAqIGluIHN0cmljdCBmYWxsaW5nIG9yZGVyIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlbQotCSAqIGFsbCBmb3IgdGhlIGJlc3QgbWF0Y2guCi0JICovCi0JYmVzdG1hdGNoID0gSU5UX01BWDsKLQliZXN0aW5kZXggPSAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgbWMxMzc4M19yZWd1bGF0b3JzW3JlZ19pZF0uZGVzYy5uX3ZvbHRhZ2VzOyBpKyspIHsKLQkJaWYgKG1jMTM3ODNfcmVndWxhdG9yc1tyZWdfaWRdLnZvbHRhZ2VzW2ldID49IG1pbl91ViAmJgotCQkgICAgbWMxMzc4M19yZWd1bGF0b3JzW3JlZ19pZF0udm9sdGFnZXNbaV0gPCBiZXN0bWF0Y2gpIHsKLQkJCWJlc3RtYXRjaCA9IG1jMTM3ODNfcmVndWxhdG9yc1tyZWdfaWRdLnZvbHRhZ2VzW2ldOwotCQkJYmVzdGluZGV4ID0gaTsKLQkJfQotCX0KLQotCWlmIChiZXN0aW5kZXggPCAwIHx8IGJlc3RtYXRjaCA+IG1heF91VikgewotCQlkZXZfd2FybigmcmRldi0+ZGV2LCAibm8gcG9zc2libGUgdmFsdWUgZm9yICVkPD14PD0lZCB1VlxuIiwKLQkJCQltaW5fdVYsIG1heF91Vik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gYmVzdGluZGV4OwotfQotCi1zdGF0aWMgaW50IG1jMTM3ODNfcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCQkJaW50IG1pbl91ViwgaW50IG1heF91VikKLXsKLQlzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7Ci0JaW50IHZhbHVlLCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZCBtaW5fdVY6ICVkIG1heF91VjogJWRcbiIsCi0JCV9fZnVuY19fLCBpZCwgbWluX3VWLCBtYXhfdVYpOwotCi0JLyogRmluZCB0aGUgYmVzdCBpbmRleCAqLwotCXZhbHVlID0gbWMxMzc4M19nZXRfYmVzdF92b2x0YWdlX2luZGV4KHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGJlc3QgdmFsdWU6ICVkIFxuIiwgX19mdW5jX18sIHZhbHVlKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gdmFsdWU7Ci0KLQltYzEzNzgzX2xvY2socHJpdi0+bWMxMzc4Myk7Ci0JcmV0ID0gbWMxMzc4M19yZWdfcm13KHByaXYtPm1jMTM3ODMsIG1jMTM3ODNfcmVndWxhdG9yc1tpZF0udnNlbF9yZWcsCi0JCQltYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnZzZWxfbWFzaywKLQkJCXZhbHVlIDw8IG1jMTM3ODNfcmVndWxhdG9yc1tpZF0udnNlbF9zaGlmdCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1jMTM3ODNfcmVndWxhdG9yX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQotewotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKLQlpbnQgcmV0LCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZFxuIiwgX19mdW5jX18sIGlkKTsKLQotCW1jMTM3ODNfbG9jayhwcml2LT5tYzEzNzgzKTsKLQlyZXQgPSBtYzEzNzgzX3JlZ19yZWFkKHByaXYtPm1jMTM3ODMsCi0JCQkJbWMxMzc4M19yZWd1bGF0b3JzW2lkXS52c2VsX3JlZywgJnZhbCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdmFsID0gKHZhbCAmIG1jMTM3ODNfcmVndWxhdG9yc1tpZF0udnNlbF9tYXNrKQotCQk+PiBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnZzZWxfc2hpZnQ7Ci0KLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZCB2YWw6ICVkXG4iLCBfX2Z1bmNfXywgaWQsIHZhbCk7Ci0KLQlCVUdfT04odmFsIDwgMCB8fCB2YWwgPiBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLmRlc2Mubl92b2x0YWdlcyk7Ci0KLQlyZXR1cm4gbWMxMzc4M19yZWd1bGF0b3JzW2lkXS52b2x0YWdlc1t2YWxdOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbWMxMzc4M19yZWd1bGF0b3Jfb3BzID0gewotCS5lbmFibGUgPSBtYzEzNzgzX3JlZ3VsYXRvcl9lbmFibGUsCi0JLmRpc2FibGUgPSBtYzEzNzgzX3JlZ3VsYXRvcl9kaXNhYmxlLAotCS5pc19lbmFibGVkID0gbWMxMzc4M19yZWd1bGF0b3JfaXNfZW5hYmxlZCwKLQkubGlzdF92b2x0YWdlID0gbWMxMzc4M19yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAotCS5zZXRfdm9sdGFnZSA9IG1jMTM3ODNfcmVndWxhdG9yX3NldF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IG1jMTM3ODNfcmVndWxhdG9yX2dldF92b2x0YWdlLAotfTsKLQotc3RhdGljIGludCBtYzEzNzgzX2ZpeGVkX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCi17Ci0JaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7Ci0KLQlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZCBtaW5fdVY6ICVkIG1heF91VjogJWRcbiIsCi0JCV9fZnVuY19fLCBpZCwgbWluX3VWLCBtYXhfdVYpOwotCi0JaWYgKG1pbl91ViA+PSBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnZvbHRhZ2VzWzBdICYmCi0JICAgIG1heF91ViA8PSBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLnZvbHRhZ2VzWzBdKQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1jMTM3ODNfZml4ZWRfcmVndWxhdG9yX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQotewotCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCi0JZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0KLQlyZXR1cm4gbWMxMzc4M19yZWd1bGF0b3JzW2lkXS52b2x0YWdlc1swXTsKLX0KLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIG1jMTM3ODNfZml4ZWRfcmVndWxhdG9yX29wcyA9IHsKLQkuZW5hYmxlID0gbWMxMzc4M19yZWd1bGF0b3JfZW5hYmxlLAotCS5kaXNhYmxlID0gbWMxMzc4M19yZWd1bGF0b3JfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZCA9IG1jMTM3ODNfcmVndWxhdG9yX2lzX2VuYWJsZWQsCi0JLmxpc3Rfdm9sdGFnZSA9IG1jMTM3ODNfcmVndWxhdG9yX2xpc3Rfdm9sdGFnZSwKLQkuc2V0X3ZvbHRhZ2UgPSBtYzEzNzgzX2ZpeGVkX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZSwKLQkuZ2V0X3ZvbHRhZ2UgPSBtYzEzNzgzX2ZpeGVkX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZSwKLX07Ci0KLXN0YXRpYyBpbnQgbWMxMzc4M19wb3dlcm1pc2Nfcm13KHN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2LCB1MzIgbWFzaywKLQkJCQkgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgbWMxMzc4MyAqbWMxMzc4MyA9IHByaXYtPm1jMTM3ODM7CisJc3RydWN0IG1jMTN4eHggKm1jMTM3ODMgPSBwcml2LT5tYzEzeHh4OwogCWludCByZXQ7CiAJdTMyIHZhbHJlYWQ7CiAKIAlCVUdfT04odmFsICYgfm1hc2spOwogCi0JcmV0ID0gbWMxMzc4M19yZWdfcmVhZChtYzEzNzgzLCBNQzEzNzgzX1JFR19QT1dFUk1JU0MsICZ2YWxyZWFkKTsKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKG1jMTM3ODMsIE1DMTM3ODNfUkVHX1BPV0VSTUlTQywgJnZhbHJlYWQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTQ4OSwzNCArMjUyLDM2IEBACiAJdmFscmVhZCA9ICh2YWxyZWFkICYgfk1DMTM3ODNfUkVHX1BPV0VSTUlTQ19QV0dUU1BJX00pIHwKIAkJCQkJCXByaXYtPnBvd2VybWlzY19wd2d0X3N0YXRlOwogCi0JcmV0dXJuIG1jMTM3ODNfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfUkVHX1BPV0VSTUlTQywgdmFscmVhZCk7CisJcmV0dXJuIG1jMTN4eHhfcmVnX3dyaXRlKG1jMTM3ODMsIE1DMTM3ODNfUkVHX1BPV0VSTUlTQywgdmFscmVhZCk7CiB9CiAKIHN0YXRpYyBpbnQgbWMxMzc4M19ncG9fcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKLQlzdHJ1Y3QgbWMxMzc4M19yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvciAqbWMxM3h4eF9yZWd1bGF0b3JzID0gcHJpdi0+bWMxM3h4eF9yZWd1bGF0b3JzOwogCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOwogCWludCByZXQ7Ci0JdTMyIGVuX3ZhbCA9IG1jMTM3ODNfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdDsKKwl1MzIgZW5fdmFsID0gbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS5lbmFibGVfYml0OwogCiAJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7CiAKIAkvKiBQb3dlciBHYXRlIGVuYWJsZSB2YWx1ZSBpcyAwICovCi0JaWYgKGlkID09IE1DMTM3ODNfUkVHVV9QV0dUMVNQSSB8fAotCSAgICBpZCA9PSBNQzEzNzgzX1JFR1VfUFdHVDJTUEkpCisJaWYgKGlkID09IE1DMTM3ODNfUkVHX1BXR1QxU1BJIHx8CisJICAgIGlkID09IE1DMTM3ODNfUkVHX1BXR1QyU1BJKQogCQllbl92YWwgPSAwOwogCi0JbWMxMzc4M19sb2NrKHByaXYtPm1jMTM3ODMpOwotCXJldCA9IG1jMTM3ODNfcG93ZXJtaXNjX3Jtdyhwcml2LCBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQsCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTM3ODNfcG93ZXJtaXNjX3Jtdyhwcml2LCBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQsCiAJCQkJCWVuX3ZhbCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1jMTM3ODNfZ3BvX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CiAJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CiAJaW50IHJldDsKIAl1MzIgZGlzX3ZhbCA9IDA7CkBAIC01MjQsMjcgKzI4OSwyOCBAQAogCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgaWQ6ICVkXG4iLCBfX2Z1bmNfXywgaWQpOwogCiAJLyogUG93ZXIgR2F0ZSBkaXNhYmxlIHZhbHVlIGlzIDEgKi8KLQlpZiAoaWQgPT0gTUMxMzc4M19SRUdVX1BXR1QxU1BJIHx8Ci0JICAgIGlkID09IE1DMTM3ODNfUkVHVV9QV0dUMlNQSSkKLQkJZGlzX3ZhbCA9IG1jMTM3ODNfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdDsKKwlpZiAoaWQgPT0gTUMxMzc4M19SRUdfUFdHVDFTUEkgfHwKKwkgICAgaWQgPT0gTUMxMzc4M19SRUdfUFdHVDJTUEkpCisJCWRpc192YWwgPSBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQ7CiAKLQltYzEzNzgzX2xvY2socHJpdi0+bWMxMzc4Myk7Ci0JcmV0ID0gbWMxMzc4M19wb3dlcm1pc2Nfcm13KHByaXYsIG1jMTM3ODNfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCwKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisJcmV0ID0gbWMxMzc4M19wb3dlcm1pc2Nfcm13KHByaXYsIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCwKIAkJCQkJZGlzX3ZhbCk7Ci0JbWMxMzc4M191bmxvY2socHJpdi0+bWMxMzc4Myk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1jMTM3ODNfZ3BvX3JlZ3VsYXRvcl9pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CiAJaW50IHJldCwgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCi0JbWMxMzc4M19sb2NrKHByaXYtPm1jMTM3ODMpOwotCXJldCA9IG1jMTM3ODNfcmVnX3JlYWQocHJpdi0+bWMxMzc4MywgbWMxMzc4M19yZWd1bGF0b3JzW2lkXS5yZWcsICZ2YWwpOwotCW1jMTM3ODNfdW5sb2NrKHByaXYtPm1jMTM3ODMpOworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0ucmVnLCAmdmFsKTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC01NTQsMjIgKzMyMCwyMiBAQAogCXZhbCA9ICh2YWwgJiB+TUMxMzc4M19SRUdfUE9XRVJNSVNDX1BXR1RTUElfTSkgfAogCSAgICAgIChwcml2LT5wb3dlcm1pc2NfcHdndF9zdGF0ZSBeIE1DMTM3ODNfUkVHX1BPV0VSTUlTQ19QV0dUU1BJX00pOwogCi0JcmV0dXJuICh2YWwgJiBtYzEzNzgzX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQpICE9IDA7CisJcmV0dXJuICh2YWwgJiBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQpICE9IDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBtYzEzNzgzX2dwb19yZWd1bGF0b3Jfb3BzID0gewogCS5lbmFibGUgPSBtYzEzNzgzX2dwb19yZWd1bGF0b3JfZW5hYmxlLAogCS5kaXNhYmxlID0gbWMxMzc4M19ncG9fcmVndWxhdG9yX2Rpc2FibGUsCiAJLmlzX2VuYWJsZWQgPSBtYzEzNzgzX2dwb19yZWd1bGF0b3JfaXNfZW5hYmxlZCwKLQkubGlzdF92b2x0YWdlID0gbWMxMzc4M19yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAotCS5zZXRfdm9sdGFnZSA9IG1jMTM3ODNfZml4ZWRfcmVndWxhdG9yX3NldF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IG1jMTM3ODNfZml4ZWRfcmVndWxhdG9yX2dldF92b2x0YWdlLAorCS5saXN0X3ZvbHRhZ2UgPSBtYzEzeHh4X3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UsCisJLnNldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wcml2ICpwcml2OwotCXN0cnVjdCBtYzEzNzgzICptYzEzNzgzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2OworCXN0cnVjdCBtYzEzeHh4ICptYzEzNzgzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CiAJCWRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhOwpAQCAtNTgzLDcgKzM0OSw4IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaXYtPm1jMTM3ODMgPSBtYzEzNzgzOworCXByaXYtPm1jMTN4eHhfcmVndWxhdG9ycyA9IG1jMTM3ODNfcmVndWxhdG9yczsKKwlwcml2LT5tYzEzeHh4ID0gbWMxMzc4MzsKIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3JlZ3VsYXRvcnM7IGkrKykgewogCQlpbml0X2RhdGEgPSAmcGRhdGEtPnJlZ3VsYXRvcnNbaV07CkBAIC02MTMsNyArMzgwLDcgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgbWMxMzc4M19yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IG1jMTM3ODNfcmVndWxhdG9yX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBtYzEzNzgzX3JlZ3VsYXRvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CiAJCWRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzODkyLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzg5Mi1yZWd1bGF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhmNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWMxMzg5Mi1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDYzNSBAQAorLyoKKyAqIFJlZ3VsYXRvciBEcml2ZXIgZm9yIEZyZWVzY2FsZSBNQzEzODkyIFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBZb25nIFNoZW4gPHlvbmcuc2hlbkBsaW5hcm8ub3JnPgorICoKKyAqIEJhc2VkIG9uIGRyYWZ0IGRyaXZlciBmcm9tIEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbWZkL21jMTM4OTIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgIm1jMTN4eHguaCIKKworI2RlZmluZSBNQzEzODkyX1JFVklTSU9OCQkJNworCisjZGVmaW5lIE1DMTM4OTJfUE9XRVJDVEwwCQkJMTMKKyNkZWZpbmUgTUMxMzg5Ml9QT1dFUkNUTDBfVVNFUk9GRlNQSQkJMworI2RlZmluZSBNQzEzODkyX1BPV0VSQ1RMMF9WQ09JTkNFTExWU0VMCQkyMAorI2RlZmluZSBNQzEzODkyX1BPV0VSQ1RMMF9WQ09JTkNFTExWU0VMX00JKDc8PDIwKQorI2RlZmluZSBNQzEzODkyX1BPV0VSQ1RMMF9WQ09JTkNFTExFTgkJKDE8PDIzKQorCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMF9TV3hISQkJKDE8PDIzKQorCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMAkJCTI0CisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMF9TVzFWU0VMCQkwCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMF9TVzFWU0VMX00JCSgweDFmPDwwKQorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzBfU1cxSEkJCSgxPDwyMykKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMwX1NXMUVOCQkwCisKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMxCQkJMjUKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMxX1NXMlZTRUwJCTAKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMxX1NXMlZTRUxfTQkJKDB4MWY8PDApCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMV9TVzJISQkJKDE8PDIzKQorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzFfU1cyRU4JCTAKKworI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzIJCQkyNgorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzJfU1czVlNFTAkJMAorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzJfU1czVlNFTF9NCQkoMHgxZjw8MCkKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMyX1NXM0hJCQkoMTw8MjMpCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMl9TVzNFTgkJMAorCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTMwkJCTI3CisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTM19TVzRWU0VMCQkwCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTM19TVzRWU0VMX00JCSgweDFmPDwwKQorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzNfU1c0SEkJCSgxPDwyMykKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlMzX1NXNEVOCQkwCisKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlM0CQkJMjgKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlM0X1NXMU1PREUJCTAKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlM0X1NXMU1PREVfQVVUTwkJKDg8PDApCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNF9TVzFNT0RFX00JCSgweGY8PDApCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNF9TVzJNT0RFCQkxMAorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzRfU1cyTU9ERV9BVVRPCQkoODw8MTApCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNF9TVzJNT0RFX00JCSgweGY8PDEwKQorCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNQkJCTI5CisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNV9TVzNNT0RFCQkwCisjZGVmaW5lIE1DMTM4OTJfU1dJVENIRVJTNV9TVzNNT0RFX0FVVE8JCSg4PDwwKQorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzVfU1czTU9ERV9NCQkoMHhmPDwwKQorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzVfU1c0TU9ERQkJOAorI2RlZmluZSBNQzEzODkyX1NXSVRDSEVSUzVfU1c0TU9ERV9BVVRPCQkoODw8OCkKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlM1X1NXNE1PREVfTQkJKDB4Zjw8OCkKKyNkZWZpbmUgTUMxMzg5Ml9TV0lUQ0hFUlM1X1NXQlNURU4JCSgxPDwyMCkKKworI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwCQkzMAorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZHRU4xVlNFTAkwCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9SU0VUVElORzBfVkRJR1ZTRUwJNAorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZHRU4yVlNFTAk2CisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9SU0VUVElORzBfVlBMTFZTRUwJOQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZVU0IyVlNFTAkxMQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZHRU4zVlNFTAkxNAorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZDQU1WU0VMCTE2CisKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JTRVRUSU5HMF9WR0VOMVZTRUxfTQkoMzw8MCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JTRVRUSU5HMF9WRElHVlNFTF9NCSgzPDw0KQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZHRU4yVlNFTF9NCSg3PDw2KQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZQTExWU0VMX00JKDM8PDkpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9SU0VUVElORzBfVlVTQjJWU0VMX00JKDM8PDExKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcwX1ZHRU4zVlNFTF9NCSgxPDwxNCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JTRVRUSU5HMF9WQ0FNVlNFTF9NCSgzPDwxNikKKworI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcxCQkzMQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcxX1ZWSURFT1ZTRUwJMgorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcxX1ZBVURJT1ZTRUwJNAorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcxX1ZTRFZTRUwJNgorCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9SU0VUVElORzFfVlZJREVPVlNFTF9NCSgzPDwyKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUlNFVFRJTkcxX1ZBVURJT1ZTRUxfTQkoMzw8NCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JTRVRUSU5HMV9WU0RWU0VMX00JKDc8PDYpCisKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMAkJCTMyCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVkdFTjFFTgkJKDE8PDApCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVkdFTjFTVERCWQkoMTw8MSkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WR0VOMU1PREUJKDE8PDIpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVklPSElFTgkJKDE8PDMpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVklPSElTVERCWQkoMTw8NCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WSU9ISU1PREUJKDE8PDUpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVkRJR0VOCQkoMTw8OSkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WRElHU1REQlkJKDE8PDEwKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUwX1ZESUdNT0RFCQkoMTw8MTEpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVkdFTjJFTgkJKDE8PDEyKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUwX1ZHRU4yU1REQlkJKDE8PDEzKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUwX1ZHRU4yTU9ERQkoMTw8MTQpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVlBMTEVOCQkoMTw8MTUpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTBfVlBMTFNUREJZCSgxPDwxNikKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WUExMTU9ERQkJKDE8PDE3KQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUwX1ZVU0IyRU4JCSgxPDwxOCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WVVNCMlNUREJZCSgxPDwxOSkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMF9WVVNCMk1PREUJKDE8PDIwKQorCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTEJCQkzMworI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZHRU4zRU4JCSgxPDwwKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZHRU4zU1REQlkJKDE8PDEpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVkdFTjNNT0RFCSgxPDwyKQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZDQU1FTgkJKDE8PDYpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVkNBTVNUREJZCSgxPDw3KQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZDQU1NT0RFCQkoMTw8OCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMV9WQ0FNQ09ORklHRU4JKDE8PDkpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVlZJREVPRU4JCSgxPDwxMikKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMV9WVklERU9TVERCWQkoMTw8MTMpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVlZJREVPTU9ERQkoMTw8MTQpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVkFVRElPRU4JCSgxPDwxNSkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMV9WQVVESU9TVERCWQkoMTw8MTYpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVkFVRElPTU9ERQkoMTw8MTcpCisjZGVmaW5lIE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVlNERU4JCSgxPDwxOCkKKyNkZWZpbmUgTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMV9WU0RTVERCWQkJKDE8PDE5KQorI2RlZmluZSBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZTRE1PREUJCSgxPDwyMCkKKworI2RlZmluZSBNQzEzODkyX1BPV0VSTUlTQwkJCTM0CisjZGVmaW5lIE1DMTM4OTJfUE9XRVJNSVNDX0dQTzFFTgkJKDE8PDYpCisjZGVmaW5lIE1DMTM4OTJfUE9XRVJNSVNDX0dQTzJFTgkJKDE8PDgpCisjZGVmaW5lIE1DMTM4OTJfUE9XRVJNSVNDX0dQTzNFTgkJKDE8PDEwKQorI2RlZmluZSBNQzEzODkyX1BPV0VSTUlTQ19HUE80RU4JCSgxPDwxMikKKyNkZWZpbmUgTUMxMzg5Ml9QT1dFUk1JU0NfUFdHVDFTUElFTgkJKDE8PDE1KQorI2RlZmluZSBNQzEzODkyX1BPV0VSTUlTQ19QV0dUMlNQSUVOCQkoMTw8MTYpCisjZGVmaW5lIE1DMTM4OTJfUE9XRVJNSVNDX0dQTzRBRElORU4JCSgxPDwyMSkKKworI2RlZmluZSBNQzEzODkyX1BPV0VSTUlTQ19QV0dUU1BJX00JCSgzIDw8IDE1KQorCisjZGVmaW5lIE1DMTM4OTJfVVNCMQkJCQk1MAorI2RlZmluZSBNQzEzODkyX1VTQjFfVlVTQkVOCQkJKDE8PDMpCisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92Y29pbmNlbGxbXSA9IHsKKwkyNTAwMDAwLCAyNzAwMDAwLCAyODAwMDAwLCAyOTAwMDAwLCAzMDAwMDAwLCAzMTAwMDAwLAorCTMyMDAwMDAsIDMzMDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfc3cxW10gPSB7CisJNjAwMDAwLCAgIDYyNTAwMCwgIDY1MDAwMCwgIDY3NTAwMCwgIDcwMDAwMCwgIDcyNTAwMCwKKwk3NTAwMDAsICAgNzc1MDAwLCAgODAwMDAwLCAgODI1MDAwLCAgODUwMDAwLCAgODc1MDAwLAorCTkwMDAwMCwgICA5MjUwMDAsICA5NTAwMDAsICA5NzUwMDAsIDEwMDAwMDAsIDEwMjUwMDAsCisJMTA1MDAwMCwgMTA3NTAwMCwgMTEwMDAwMCwgMTEyNTAwMCwgMTE1MDAwMCwgMTE3NTAwMCwKKwkxMjAwMDAwLCAxMjI1MDAwLCAxMjUwMDAwLCAxMjc1MDAwLCAxMzAwMDAwLCAxMzI1MDAwLAorCTEzNTAwMDAsIDEzNzUwMDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml9zd1tdID0geworCTYwMDAwMCwgICA2MjUwMDAsICA2NTAwMDAsICA2NzUwMDAsICA3MDAwMDAsICA3MjUwMDAsCisJNzUwMDAwLCAgIDc3NTAwMCwgIDgwMDAwMCwgIDgyNTAwMCwgIDg1MDAwMCwgIDg3NTAwMCwKKwk5MDAwMDAsICAgOTI1MDAwLCAgOTUwMDAwLCAgOTc1MDAwLCAxMDAwMDAwLCAxMDI1MDAwLAorCTEwNTAwMDAsIDEwNzUwMDAsIDExMDAwMDAsIDExMjUwMDAsIDExNTAwMDAsIDExNzUwMDAsCisJMTIwMDAwMCwgMTIyNTAwMCwgMTI1MDAwMCwgMTI3NTAwMCwgMTMwMDAwMCwgMTMyNTAwMCwKKwkxMzUwMDAwLCAxMzc1MDAwLCAxNDAwMDAwLCAxNDI1MDAwLCAxNDUwMDAwLCAxNDc1MDAwLAorCTE1MDAwMDAsIDE1MjUwMDAsIDE1NTAwMDAsIDE1NzUwMDAsIDE2MDAwMDAsIDE2MjUwMDAsCisJMTY1MDAwMCwgMTY3NTAwMCwgMTcwMDAwMCwgMTcyNTAwMCwgMTc1MDAwMCwgMTc3NTAwMCwKKwkxODAwMDAwLCAxODI1MDAwLCAxODUwMDAwLCAxODc1MDAwCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfc3dic3RbXSA9IHsKKwk1MDAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBtYzEzODkyX3Zpb2hpW10gPSB7CisJMjc3NTAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92cGxsW10gPSB7CisJMTA1MDAwMCwgMTI1MDAwMCwgMTY1MDAwMCwgMTgwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92ZGlnW10gPSB7CisJMTA1MDAwMCwgMTI1MDAwMCwgMTY1MDAwMCwgMTgwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92c2RbXSA9IHsKKwkxODAwMDAwLCAyMDAwMDAwLCAyNjAwMDAwLCAyNzAwMDAwLAorCTI4MDAwMDAsIDI5MDAwMDAsIDMwMDAwMDAsIDMxNTAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfdnVzYjJbXSA9IHsKKwkyNDAwMDAwLCAyNjAwMDAwLCAyNzAwMDAwLCAyNzc1MDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBtYzEzODkyX3Z2aWRlb1tdID0geworCTI3MDAwMDAsIDI3NzUwMDAsIDI1MDAwMDAsIDI2MDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfdmF1ZGlvW10gPSB7CisJMjMwMDAwMCwgMjUwMDAwMCwgMjc3NTAwMCwgMzAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92Y2FtW10gPSB7CisJMjUwMDAwMCwgMjYwMDAwMCwgMjc1MDAwMCwgMzAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbWMxMzg5Ml92Z2VuMVtdID0geworCTEyMDAwMDAsIDE1MDAwMDAsIDI3NzUwMDAsIDMxNTAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfdmdlbjJbXSA9IHsKKwkxMjAwMDAwLCAxNTAwMDAwLCAxNjAwMDAwLCAxODAwMDAwLAorCTI3MDAwMDAsIDI4MDAwMDAsIDMwMDAwMDAsIDMxNTAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfdmdlbjNbXSA9IHsKKwkxODAwMDAwLCAyOTAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBtYzEzODkyX3Z1c2JbXSA9IHsKKwkzMzAwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBtYzEzODkyX2dwb1tdID0geworCTI3NTAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IG1jMTM4OTJfcHdndGRydltdID0geworCTUwMDAwMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbWMxMzg5Ml9ncG9fcmVndWxhdG9yX29wczsKKy8qIHN3IHJlZ3VsYXRvcnMgbmVlZCBzcGVjaWFsIGNhcmUgZHVlIHRvIHRoZSAiaGkgYml0IiAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIG1jMTM4OTJfc3dfcmVndWxhdG9yX29wczsKKworCisjZGVmaW5lIE1DMTM4OTJfRklYRURfREVGSU5FKG5hbWUsIHJlZywgdm9sdGFnZXMpCQlcCisJTUMxM3h4eF9GSVhFRF9ERUZJTkUoTUMxMzg5Ml8sIG5hbWUsIHJlZywgdm9sdGFnZXMsCVwKKwkJCW1jMTN4eHhfZml4ZWRfcmVndWxhdG9yX29wcykKKworI2RlZmluZSBNQzEzODkyX0dQT19ERUZJTkUobmFtZSwgcmVnLCB2b2x0YWdlcykJCQlcCisJTUMxM3h4eF9HUE9fREVGSU5FKE1DMTM4OTJfLCBuYW1lLCByZWcsIHZvbHRhZ2VzLAlcCisJCQltYzEzODkyX2dwb19yZWd1bGF0b3Jfb3BzKQorCisjZGVmaW5lIE1DMTM4OTJfU1dfREVGSU5FKG5hbWUsIHJlZywgdnNlbF9yZWcsIHZvbHRhZ2VzKQlcCisJTUMxM3h4eF9ERUZJTkUoTUMxMzg5Ml8sIG5hbWUsIHJlZywgdnNlbF9yZWcsIHZvbHRhZ2VzLCBcCisJCQltYzEzODkyX3N3X3JlZ3VsYXRvcl9vcHMpCisKKyNkZWZpbmUgTUMxMzg5Ml9ERUZJTkVfUkVHVShuYW1lLCByZWcsIHZzZWxfcmVnLCB2b2x0YWdlcykJXAorCU1DMTN4eHhfREVGSU5FKE1DMTM4OTJfLCBuYW1lLCByZWcsIHZzZWxfcmVnLCB2b2x0YWdlcywgXAorCQkJbWMxM3h4eF9yZWd1bGF0b3Jfb3BzKQorCitzdGF0aWMgc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yIG1jMTM4OTJfcmVndWxhdG9yc1tdID0geworCU1DMTM4OTJfREVGSU5FX1JFR1UoVkNPSU5DRUxMLCBQT1dFUkNUTDAsIFBPV0VSQ1RMMCwgbWMxMzg5Ml92Y29pbmNlbGwpLAorCU1DMTM4OTJfU1dfREVGSU5FKFNXMSwgU1dJVENIRVJTMCwgU1dJVENIRVJTMCwgbWMxMzg5Ml9zdzEpLAorCU1DMTM4OTJfU1dfREVGSU5FKFNXMiwgU1dJVENIRVJTMSwgU1dJVENIRVJTMSwgbWMxMzg5Ml9zdyksCisJTUMxMzg5Ml9TV19ERUZJTkUoU1czLCBTV0lUQ0hFUlMyLCBTV0lUQ0hFUlMyLCBtYzEzODkyX3N3KSwKKwlNQzEzODkyX1NXX0RFRklORShTVzQsIFNXSVRDSEVSUzMsIFNXSVRDSEVSUzMsIG1jMTM4OTJfc3cpLAorCU1DMTM4OTJfRklYRURfREVGSU5FKFNXQlNULCBTV0lUQ0hFUlM1LCBtYzEzODkyX3N3YnN0KSwKKwlNQzEzODkyX0ZJWEVEX0RFRklORShWSU9ISSwgUkVHVUxBVE9STU9ERTAsIG1jMTM4OTJfdmlvaGkpLAorCU1DMTM4OTJfREVGSU5FX1JFR1UoVlBMTCwgUkVHVUxBVE9STU9ERTAsIFJFR1VMQVRPUlNFVFRJTkcwLAlcCisJCW1jMTM4OTJfdnBsbCksCisJTUMxMzg5Ml9ERUZJTkVfUkVHVShWRElHLCBSRUdVTEFUT1JNT0RFMCwgUkVHVUxBVE9SU0VUVElORzAsCVwKKwkJbWMxMzg5Ml92ZGlnKSwKKwlNQzEzODkyX0RFRklORV9SRUdVKFZTRCwgUkVHVUxBVE9STU9ERTEsIFJFR1VMQVRPUlNFVFRJTkcxLAlcCisJCW1jMTM4OTJfdnNkKSwKKwlNQzEzODkyX0RFRklORV9SRUdVKFZVU0IyLCBSRUdVTEFUT1JNT0RFMCwgUkVHVUxBVE9SU0VUVElORzAsCVwKKwkJbWMxMzg5Ml92dXNiMiksCisJTUMxMzg5Ml9ERUZJTkVfUkVHVShWVklERU8sIFJFR1VMQVRPUk1PREUxLCBSRUdVTEFUT1JTRVRUSU5HMSwJXAorCQltYzEzODkyX3Z2aWRlbyksCisJTUMxMzg5Ml9ERUZJTkVfUkVHVShWQVVESU8sIFJFR1VMQVRPUk1PREUxLCBSRUdVTEFUT1JTRVRUSU5HMSwJXAorCQltYzEzODkyX3ZhdWRpbyksCisJTUMxMzg5Ml9ERUZJTkVfUkVHVShWQ0FNLCBSRUdVTEFUT1JNT0RFMSwgUkVHVUxBVE9SU0VUVElORzAsCVwKKwkJbWMxMzg5Ml92Y2FtKSwKKwlNQzEzODkyX0RFRklORV9SRUdVKFZHRU4xLCBSRUdVTEFUT1JNT0RFMCwgUkVHVUxBVE9SU0VUVElORzAsCVwKKwkJbWMxMzg5Ml92Z2VuMSksCisJTUMxMzg5Ml9ERUZJTkVfUkVHVShWR0VOMiwgUkVHVUxBVE9STU9ERTAsIFJFR1VMQVRPUlNFVFRJTkcwLAlcCisJCW1jMTM4OTJfdmdlbjIpLAorCU1DMTM4OTJfREVGSU5FX1JFR1UoVkdFTjMsIFJFR1VMQVRPUk1PREUxLCBSRUdVTEFUT1JTRVRUSU5HMCwJXAorCQltYzEzODkyX3ZnZW4zKSwKKwlNQzEzODkyX0ZJWEVEX0RFRklORShWVVNCLCBVU0IxLCBtYzEzODkyX3Z1c2IpLAorCU1DMTM4OTJfR1BPX0RFRklORShHUE8xLCBQT1dFUk1JU0MsIG1jMTM4OTJfZ3BvKSwKKwlNQzEzODkyX0dQT19ERUZJTkUoR1BPMiwgUE9XRVJNSVNDLCBtYzEzODkyX2dwbyksCisJTUMxMzg5Ml9HUE9fREVGSU5FKEdQTzMsIFBPV0VSTUlTQywgbWMxMzg5Ml9ncG8pLAorCU1DMTM4OTJfR1BPX0RFRklORShHUE80LCBQT1dFUk1JU0MsIG1jMTM4OTJfZ3BvKSwKKwlNQzEzODkyX0dQT19ERUZJTkUoUFdHVDFTUEksIFBPV0VSTUlTQywgbWMxMzg5Ml9wd2d0ZHJ2KSwKKwlNQzEzODkyX0dQT19ERUZJTkUoUFdHVDJTUEksIFBPV0VSTUlTQywgbWMxMzg5Ml9wd2d0ZHJ2KSwKK307CisKK3N0YXRpYyBpbnQgbWMxMzg5Ml9wb3dlcm1pc2Nfcm13KHN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2LCB1MzIgbWFzaywKKwkJCQkgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgbWMxM3h4eCAqbWMxMzg5MiA9IHByaXYtPm1jMTN4eHg7CisJaW50IHJldDsKKwl1MzIgdmFscmVhZDsKKworCUJVR19PTih2YWwgJiB+bWFzayk7CisKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKG1jMTM4OTIsIE1DMTM4OTJfUE9XRVJNSVNDLCAmdmFscmVhZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFVwZGF0ZSB0aGUgc3RvcmVkIHN0YXRlIGZvciBQb3dlciBHYXRlcy4gKi8KKwlwcml2LT5wb3dlcm1pc2NfcHdndF9zdGF0ZSA9CisJCShwcml2LT5wb3dlcm1pc2NfcHdndF9zdGF0ZSAmIH5tYXNrKSB8IHZhbDsKKwlwcml2LT5wb3dlcm1pc2NfcHdndF9zdGF0ZSAmPSBNQzEzODkyX1BPV0VSTUlTQ19QV0dUU1BJX007CisKKwkvKiBDb25zdHJ1Y3QgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLworCXZhbHJlYWQgPSAodmFscmVhZCAmIH5tYXNrKSB8IHZhbDsKKwkvKiBPdmVyd3JpdGUgdGhlIFBXR1R4RU4gd2l0aCB0aGUgc3RvcmVkIHZlcnNpb24gKi8KKwl2YWxyZWFkID0gKHZhbHJlYWQgJiB+TUMxMzg5Ml9QT1dFUk1JU0NfUFdHVFNQSV9NKSB8CisJCXByaXYtPnBvd2VybWlzY19wd2d0X3N0YXRlOworCisJcmV0dXJuIG1jMTN4eHhfcmVnX3dyaXRlKG1jMTM4OTIsIE1DMTM4OTJfUE9XRVJNSVNDLCB2YWxyZWFkKTsKK30KKworc3RhdGljIGludCBtYzEzODkyX2dwb19yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgcmV0OworCXUzMiBlbl92YWwgPSBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQ7CisJdTMyIG1hc2sgPSBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQ7CisKKwlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZFxuIiwgX19mdW5jX18sIGlkKTsKKworCS8qIFBvd2VyIEdhdGUgZW5hYmxlIHZhbHVlIGlzIDAgKi8KKwlpZiAoaWQgPT0gTUMxMzg5Ml9QV0dUMVNQSSB8fCBpZCA9PSBNQzEzODkyX1BXR1QyU1BJKQorCQllbl92YWwgPSAwOworCisJaWYgKGlkID09IE1DMTM4OTJfR1BPNCkKKwkJbWFzayB8PSBNQzEzODkyX1BPV0VSTUlTQ19HUE80QURJTkVOOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTM4OTJfcG93ZXJtaXNjX3Jtdyhwcml2LCBtYXNrLCBlbl92YWwpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYzEzODkyX2dwb19yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldDsKKwl1MzIgZGlzX3ZhbCA9IDA7CisKKwlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZFxuIiwgX19mdW5jX18sIGlkKTsKKworCS8qIFBvd2VyIEdhdGUgZGlzYWJsZSB2YWx1ZSBpcyAxICovCisJaWYgKGlkID09IE1DMTM4OTJfUFdHVDFTUEkgfHwgaWQgPT0gTUMxMzg5Ml9QV0dUMlNQSSkKKwkJZGlzX3ZhbCA9IG1jMTM4OTJfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdDsKKworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwlyZXQgPSBtYzEzODkyX3Bvd2VybWlzY19ybXcocHJpdiwgbWMxMzg5Ml9yZWd1bGF0b3JzW2lkXS5lbmFibGVfYml0LAorCQlkaXNfdmFsKTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWMxMzg5Ml9ncG9fcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCByZXQsIGlkID0gcmRldl9nZXRfaWQocmRldik7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIG1jMTM4OTJfcmVndWxhdG9yc1tpZF0ucmVnLCAmdmFsKTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBQb3dlciBHYXRlcyBzdGF0ZSBpcyBzdG9yZWQgaW4gcG93ZXJtaXNjX3B3Z3Rfc3RhdGUKKwkgKiB3aGVyZSB0aGUgbWVhbmluZyBvZiBiaXRzIGlzIG5lZ2F0ZWQgKi8KKwl2YWwgPSAodmFsICYgfk1DMTM4OTJfUE9XRVJNSVNDX1BXR1RTUElfTSkgfAorCQkocHJpdi0+cG93ZXJtaXNjX3B3Z3Rfc3RhdGUgXiBNQzEzODkyX1BPV0VSTUlTQ19QV0dUU1BJX00pOworCisJcmV0dXJuICh2YWwgJiBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLmVuYWJsZV9iaXQpICE9IDA7Cit9CisKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIG1jMTM4OTJfZ3BvX3JlZ3VsYXRvcl9vcHMgPSB7CisJLmVuYWJsZSA9IG1jMTM4OTJfZ3BvX3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUgPSBtYzEzODkyX2dwb19yZWd1bGF0b3JfZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IG1jMTM4OTJfZ3BvX3JlZ3VsYXRvcl9pc19lbmFibGVkLAorCS5saXN0X3ZvbHRhZ2UgPSBtYzEzeHh4X3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UsCisJLnNldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UsCit9OworCitzdGF0aWMgaW50IG1jMTM4OTJfc3dfcmVndWxhdG9yX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbnQgcmV0LCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXVuc2lnbmVkIGludCB2YWwsIGhpOworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcmVhZChwcml2LT5tYzEzeHh4LAorCQltYzEzODkyX3JlZ3VsYXRvcnNbaWRdLnZzZWxfcmVnLCAmdmFsKTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaGkgID0gdmFsICYgTUMxMzg5Ml9TV0lUQ0hFUlMwX1NXeEhJOworCXZhbCA9ICh2YWwgJiBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLnZzZWxfbWFzaykKKwkJPj4gbWMxMzg5Ml9yZWd1bGF0b3JzW2lkXS52c2VsX3NoaWZ0OworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWQgdmFsOiAlZFxuIiwgX19mdW5jX18sIGlkLCB2YWwpOworCisJaWYgKGhpKQorCQl2YWwgPSAoMjUwMDAgKiB2YWwpICsgMTEwMDAwMDsKKwllbHNlCisJCXZhbCA9ICgyNTAwMCAqIHZhbCkgKyA2MDAwMDA7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IG1jMTM4OTJfc3dfcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCit7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCBoaSwgdmFsdWUsIHZhbCwgbWFzaywgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWQgbWluX3VWOiAlZCBtYXhfdVY6ICVkXG4iLAorCQlfX2Z1bmNfXywgaWQsIG1pbl91ViwgbWF4X3VWKTsKKworCS8qIEZpbmQgdGhlIGJlc3QgaW5kZXggKi8KKwl2YWx1ZSA9IG1jMTN4eHhfZ2V0X2Jlc3Rfdm9sdGFnZV9pbmRleChyZGV2LCBtaW5fdVYsIG1heF91Vik7CisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBiZXN0IHZhbHVlOiAlZFxuIiwgX19mdW5jX18sIHZhbHVlKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gdmFsdWU7CisKKwl2YWx1ZSA9IG1jMTM4OTJfcmVndWxhdG9yc1tpZF0udm9sdGFnZXNbdmFsdWVdOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTN4eHhfcmVnX3JlYWQocHJpdi0+bWMxM3h4eCwKKwkJbWMxMzg5Ml9yZWd1bGF0b3JzW2lkXS52c2VsX3JlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwloaSAgPSB2YWwgJiBNQzEzODkyX1NXSVRDSEVSUzBfU1d4SEk7CisJaWYgKHZhbHVlID4gMTM3NSkKKwkJaGkgPSAxOworCWlmICh2YWx1ZSA8IDExMDApCisJCWhpID0gMDsKKworCWlmIChoaSkgeworCQl2YWx1ZSA9ICh2YWx1ZSAtIDExMDAwMDApIC8gMjUwMDA7CisJCXZhbHVlIHw9IE1DMTM4OTJfU1dJVENIRVJTMF9TV3hISTsKKwl9IGVsc2UKKwkJdmFsdWUgPSAodmFsdWUgLSA2MDAwMDApIC8gMjUwMDA7CisKKwltYXNrID0gbWMxMzg5Ml9yZWd1bGF0b3JzW2lkXS52c2VsX21hc2sgfCBNQzEzODkyX1NXSVRDSEVSUzBfU1d4SEk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcm13KHByaXYtPm1jMTN4eHgsIG1jMTM4OTJfcmVndWxhdG9yc1tpZF0udnNlbF9yZWcsCisJCQltYXNrLCB2YWx1ZSA8PCBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLnZzZWxfc2hpZnQpOworZXJyOgorCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIG1jMTM4OTJfc3dfcmVndWxhdG9yX29wcyA9IHsKKwkuaXNfZW5hYmxlZCA9IG1jMTN4eHhfc3dfcmVndWxhdG9yX2lzX2VuYWJsZWQsCisJLmxpc3Rfdm9sdGFnZSA9IG1jMTN4eHhfcmVndWxhdG9yX2xpc3Rfdm9sdGFnZSwKKwkuc2V0X3ZvbHRhZ2UgPSBtYzEzODkyX3N3X3JlZ3VsYXRvcl9zZXRfdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2UgPSBtYzEzODkyX3N3X3JlZ3VsYXRvcl9nZXRfdm9sdGFnZSwKK307CisKK3N0YXRpYyBpbnQgbWMxMzg5Ml92Y2FtX3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgZW5fdmFsID0gMDsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IHJldCwgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKworCWlmIChtb2RlID09IFJFR1VMQVRPUl9NT0RFX0ZBU1QpCisJCWVuX3ZhbCA9IE1DMTM4OTJfUkVHVUxBVE9STU9ERTFfVkNBTUNPTkZJR0VOOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTN4eHhfcmVnX3Jtdyhwcml2LT5tYzEzeHh4LCBtYzEzODkyX3JlZ3VsYXRvcnNbaWRdLnJlZywKKwkJTUMxMzg5Ml9SRUdVTEFUT1JNT0RFMV9WQ0FNQ09ORklHRU4sIGVuX3ZhbCk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1jMTM4OTJfdmNhbV9nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IHJldCwgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTN4eHhfcmVnX3JlYWQocHJpdi0+bWMxM3h4eCwgbWMxMzg5Ml9yZWd1bGF0b3JzW2lkXS5yZWcsICZ2YWwpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBNQzEzODkyX1JFR1VMQVRPUk1PREUxX1ZDQU1DT05GSUdFTikKKwkJcmV0dXJuIFJFR1VMQVRPUl9NT0RFX0ZBU1Q7CisKKwlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1jMTM4OTJfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXY7CisJc3RydWN0IG1jMTN4eHggKm1jMTM4OTIgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGE7CisJaW50IGksIHJldDsKKwl1MzIgdmFsOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSArCisJCXBkYXRhLT5udW1fcmVndWxhdG9ycyAqIHNpemVvZihwcml2LT5yZWd1bGF0b3JzWzBdKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPm1jMTN4eHhfcmVndWxhdG9ycyA9IG1jMTM4OTJfcmVndWxhdG9yczsKKwlwcml2LT5tYzEzeHh4ID0gbWMxMzg5MjsKKworCW1jMTN4eHhfbG9jayhtYzEzODkyKTsKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKG1jMTM4OTIsIE1DMTM4OTJfUkVWSVNJT04sICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwkvKiBlbmFibGUgc3dpdGNoIGF1dG8gbW9kZSAqLworCWlmICgodmFsICYgMHgwMDAwRkZGRikgPT0gMHg0NWQwKSB7CisJCXJldCA9IG1jMTN4eHhfcmVnX3JtdyhtYzEzODkyLCBNQzEzODkyX1NXSVRDSEVSUzQsCisJCQlNQzEzODkyX1NXSVRDSEVSUzRfU1cxTU9ERV9NIHwKKwkJCU1DMTM4OTJfU1dJVENIRVJTNF9TVzJNT0RFX00sCisJCQlNQzEzODkyX1NXSVRDSEVSUzRfU1cxTU9ERV9BVVRPIHwKKwkJCU1DMTM4OTJfU1dJVENIRVJTNF9TVzJNT0RFX0FVVE8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZnJlZTsKKworCQlyZXQgPSBtYzEzeHh4X3JlZ19ybXcobWMxMzg5MiwgTUMxMzg5Ml9TV0lUQ0hFUlM1LAorCQkJTUMxMzg5Ml9TV0lUQ0hFUlM1X1NXM01PREVfTSB8CisJCQlNQzEzODkyX1NXSVRDSEVSUzVfU1c0TU9ERV9NLAorCQkJTUMxMzg5Ml9TV0lUQ0hFUlM1X1NXM01PREVfQVVUTyB8CisJCQlNQzEzODkyX1NXSVRDSEVSUzVfU1c0TU9ERV9BVVRPKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2ZyZWU7CisJfQorCW1jMTN4eHhfdW5sb2NrKG1jMTM4OTIpOworCisJbWMxMzg5Ml9yZWd1bGF0b3JzW01DMTM4OTJfVkNBTV0uZGVzYy5vcHMtPnNldF9tb2RlCisJCT0gbWMxMzg5Ml92Y2FtX3NldF9tb2RlOworCW1jMTM4OTJfcmVndWxhdG9yc1tNQzEzODkyX1ZDQU1dLmRlc2Mub3BzLT5nZXRfbW9kZQorCQk9IG1jMTM4OTJfdmNhbV9nZXRfbW9kZTsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yZWd1bGF0b3JzOyBpKyspIHsKKwkJaW5pdF9kYXRhID0gJnBkYXRhLT5yZWd1bGF0b3JzW2ldOworCQlwcml2LT5yZWd1bGF0b3JzW2ldID0gcmVndWxhdG9yX3JlZ2lzdGVyKAorCQkJJm1jMTM4OTJfcmVndWxhdG9yc1tpbml0X2RhdGEtPmlkXS5kZXNjLAorCQkJJnBkZXYtPmRldiwgaW5pdF9kYXRhLT5pbml0X2RhdGEsIHByaXYpOworCisJCWlmIChJU19FUlIocHJpdi0+cmVndWxhdG9yc1tpXSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXNcbiIsCisJCQkJbWMxMzg5Ml9yZWd1bGF0b3JzW2ldLmRlc2MubmFtZSk7CisJCQlyZXQgPSBQVFJfRVJSKHByaXYtPnJlZ3VsYXRvcnNbaV0pOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCXJldHVybiAwOworZXJyOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXIocHJpdi0+cmVndWxhdG9yc1tpXSk7CisKK2Vycl9mcmVlOgorCW1jMTN4eHhfdW5sb2NrKG1jMTM4OTIpOworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWMxMzg5Ml9yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQlkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWludCBpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9yZWd1bGF0b3JzOyBpKyspCisJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHByaXYtPnJlZ3VsYXRvcnNbaV0pOworCisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jMTM4OTJfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJtYzEzODkyLXJlZ3VsYXRvciIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKG1jMTM4OTJfcmVndWxhdG9yX3JlbW92ZSksCisJLnByb2JlCT0gbWMxMzg5Ml9yZWd1bGF0b3JfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYzEzODkyX3JlZ3VsYXRvcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWMxMzg5Ml9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChtYzEzODkyX3JlZ3VsYXRvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1jMTM4OTJfcmVndWxhdG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWMxMzg5Ml9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1jMTM4OTJfcmVndWxhdG9yX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJZb25nIFNoZW4gPHlvbmcuc2hlbkBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWd1bGF0b3IgRHJpdmVyIGZvciBGcmVlc2NhbGUgTUMxMzg5MiBQTUlDIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1jMTM4OTItcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LXJlZ3VsYXRvci1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHgtcmVndWxhdG9yLWNvcmUuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIFJlZ3VsYXRvciBEcml2ZXIgZm9yIEZyZWVzY2FsZSBNQzEzeHh4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBZb25nIFNoZW4gPHlvbmcuc2hlbkBsaW5hcm8ub3JnPgorICoKKyAqIEJhc2VkIG9uIG1jMTM3ODMgcmVndWxhdG9yIGRyaXZlciA6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4KKyAqIENvcHlyaWdodCAyMDA5IEFsYmVydG8gUGFuaXp6byA8bWFyYW1hb3BlcmNoZXNlaW1vcnRvQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFJlZ3MgaW5mb3MgdGFrZW4gZnJvbSBtYzEzeHh4IGRyaXZlcnMgZnJvbSBmcmVlc2NhbGUgYW5kIG1jMTN4eHgucGRmIGZpbGUKKyAqIGZyb20gZnJlZXNjYWxlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21mZC9tYzEzeHh4Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlICJtYzEzeHh4LmgiCisKK3N0YXRpYyBpbnQgbWMxM3h4eF9yZWd1bGF0b3JfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3IgKm1jMTN4eHhfcmVndWxhdG9ycyA9IHByaXYtPm1jMTN4eHhfcmVndWxhdG9yczsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcm13KHByaXYtPm1jMTN4eHgsIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0ucmVnLAorCQkJbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS5lbmFibGVfYml0LAorCQkJbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS5lbmFibGVfYml0KTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWMxM3h4eF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldDsKKworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgaWQ6ICVkXG4iLCBfX2Z1bmNfXywgaWQpOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTN4eHhfcmVnX3Jtdyhwcml2LT5tYzEzeHh4LCBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLnJlZywKKwkJCW1jMTN4eHhfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCwgMCk7CisJbWMxM3h4eF91bmxvY2socHJpdi0+bWMxM3h4eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jMTN4eHhfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yX3ByaXYgKnByaXYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvciAqbWMxM3h4eF9yZWd1bGF0b3JzID0gcHJpdi0+bWMxM3h4eF9yZWd1bGF0b3JzOworCWludCByZXQsIGlkID0gcmRldl9nZXRfaWQocmRldik7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW1jMTN4eHhfbG9jayhwcml2LT5tYzEzeHh4KTsKKwlyZXQgPSBtYzEzeHh4X3JlZ19yZWFkKHByaXYtPm1jMTN4eHgsIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0ucmVnLCAmdmFsKTsKKwltYzEzeHh4X3VubG9jayhwcml2LT5tYzEzeHh4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHZhbCAmIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0uZW5hYmxlX2JpdCkgIT0gMDsKK30KKworaW50IG1jMTN4eHhfcmVndWxhdG9yX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCWludCBpZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3IgKm1jMTN4eHhfcmVndWxhdG9ycyA9IHByaXYtPm1jMTN4eHhfcmVndWxhdG9yczsKKworCWlmIChzZWxlY3RvciA+PSBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLmRlc2Mubl92b2x0YWdlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS52b2x0YWdlc1tzZWxlY3Rvcl07Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYzEzeHh4X3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UpOworCitpbnQgbWMxM3h4eF9nZXRfYmVzdF92b2x0YWdlX2luZGV4KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCQkJaW50IG1pbl91ViwgaW50IG1heF91VikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CisJaW50IHJlZ19pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWludCBpOworCWludCBiZXN0bWF0Y2g7CisJaW50IGJlc3RpbmRleDsKKworCS8qCisJICogTG9jYXRlIHRoZSBtaW5pbXVtIHZvbHRhZ2UgZml0dGluZyB0aGUgY3JpdGVyaWEgb24KKwkgKiB0aGlzIHJlZ3VsYXRvci4gVGhlIHN3aXRjaGFibGUgdm9sdGFnZXMgYXJlIG5vdAorCSAqIGluIHN0cmljdCBmYWxsaW5nIG9yZGVyIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlbQorCSAqIGFsbCBmb3IgdGhlIGJlc3QgbWF0Y2guCisJICovCisJYmVzdG1hdGNoID0gSU5UX01BWDsKKwliZXN0aW5kZXggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgbWMxM3h4eF9yZWd1bGF0b3JzW3JlZ19pZF0uZGVzYy5uX3ZvbHRhZ2VzOyBpKyspIHsKKwkJaWYgKG1jMTN4eHhfcmVndWxhdG9yc1tyZWdfaWRdLnZvbHRhZ2VzW2ldID49IG1pbl91ViAmJgorCQkgICAgbWMxM3h4eF9yZWd1bGF0b3JzW3JlZ19pZF0udm9sdGFnZXNbaV0gPCBiZXN0bWF0Y2gpIHsKKwkJCWJlc3RtYXRjaCA9IG1jMTN4eHhfcmVndWxhdG9yc1tyZWdfaWRdLnZvbHRhZ2VzW2ldOworCQkJYmVzdGluZGV4ID0gaTsKKwkJfQorCX0KKworCWlmIChiZXN0aW5kZXggPCAwIHx8IGJlc3RtYXRjaCA+IG1heF91VikgeworCQlkZXZfd2FybigmcmRldi0+ZGV2LCAibm8gcG9zc2libGUgdmFsdWUgZm9yICVkPD14PD0lZCB1VlxuIiwKKwkJCQltaW5fdVYsIG1heF91Vik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gYmVzdGluZGV4OworfQorRVhQT1JUX1NZTUJPTF9HUEwobWMxM3h4eF9nZXRfYmVzdF92b2x0YWdlX2luZGV4KTsKKworc3RhdGljIGludCBtYzEzeHh4X3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwKKwkJaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQoreworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3IgKm1jMTN4eHhfcmVndWxhdG9ycyA9IHByaXYtPm1jMTN4eHhfcmVndWxhdG9yczsKKwlpbnQgdmFsdWUsIGlkID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHJldDsKKworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgaWQ6ICVkIG1pbl91VjogJWQgbWF4X3VWOiAlZFxuIiwKKwkJX19mdW5jX18sIGlkLCBtaW5fdVYsIG1heF91Vik7CisKKwkvKiBGaW5kIHRoZSBiZXN0IGluZGV4ICovCisJdmFsdWUgPSBtYzEzeHh4X2dldF9iZXN0X3ZvbHRhZ2VfaW5kZXgocmRldiwgbWluX3VWLCBtYXhfdVYpOworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgYmVzdCB2YWx1ZTogJWRcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCisJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOworCXJldCA9IG1jMTN4eHhfcmVnX3Jtdyhwcml2LT5tYzEzeHh4LCBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLnZzZWxfcmVnLAorCQkJbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS52c2VsX21hc2ssCisJCQl2YWx1ZSA8PCBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLnZzZWxfc2hpZnQpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYzEzeHh4X3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CisJaW50IHJldCwgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7CisKKwltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CisJcmV0ID0gbWMxM3h4eF9yZWdfcmVhZChwcml2LT5tYzEzeHh4LAorCQkJCW1jMTN4eHhfcmVndWxhdG9yc1tpZF0udnNlbF9yZWcsICZ2YWwpOworCW1jMTN4eHhfdW5sb2NrKHByaXYtPm1jMTN4eHgpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZhbCA9ICh2YWwgJiBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLnZzZWxfbWFzaykKKwkJPj4gbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS52c2VsX3NoaWZ0OworCisJZGV2X2RiZyhyZGV2X2dldF9kZXYocmRldiksICIlcyBpZDogJWQgdmFsOiAlZFxuIiwgX19mdW5jX18sIGlkLCB2YWwpOworCisJQlVHX09OKHZhbCA8IDAgfHwgdmFsID4gbWMxM3h4eF9yZWd1bGF0b3JzW2lkXS5kZXNjLm5fdm9sdGFnZXMpOworCisJcmV0dXJuIG1jMTN4eHhfcmVndWxhdG9yc1tpZF0udm9sdGFnZXNbdmFsXTsKK30KKworc3RydWN0IHJlZ3VsYXRvcl9vcHMgbWMxM3h4eF9yZWd1bGF0b3Jfb3BzID0geworCS5lbmFibGUgPSBtYzEzeHh4X3JlZ3VsYXRvcl9lbmFibGUsCisJLmRpc2FibGUgPSBtYzEzeHh4X3JlZ3VsYXRvcl9kaXNhYmxlLAorCS5pc19lbmFibGVkID0gbWMxM3h4eF9yZWd1bGF0b3JfaXNfZW5hYmxlZCwKKwkubGlzdF92b2x0YWdlID0gbWMxM3h4eF9yZWd1bGF0b3JfbGlzdF92b2x0YWdlLAorCS5zZXRfdm9sdGFnZSA9IG1jMTN4eHhfcmVndWxhdG9yX3NldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZSA9IG1jMTN4eHhfcmVndWxhdG9yX2dldF92b2x0YWdlLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG1jMTN4eHhfcmVndWxhdG9yX29wcyk7CisKK2ludCBtYzEzeHh4X2ZpeGVkX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwKKwkgICAgICAgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQoreworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvcl9wcml2ICpwcml2ID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3IgKm1jMTN4eHhfcmVndWxhdG9ycyA9IHByaXYtPm1jMTN4eHhfcmVndWxhdG9yczsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKworCWRldl9kYmcocmRldl9nZXRfZGV2KHJkZXYpLCAiJXMgaWQ6ICVkIG1pbl91VjogJWQgbWF4X3VWOiAlZFxuIiwKKwkJX19mdW5jX18sIGlkLCBtaW5fdVYsIG1heF91Vik7CisKKwlpZiAobWluX3VWID49IG1jMTN4eHhfcmVndWxhdG9yc1tpZF0udm9sdGFnZXNbMF0gJiYKKwkgICAgbWF4X3VWIDw9IG1jMTN4eHhfcmVndWxhdG9yc1tpZF0udm9sdGFnZXNbMF0pCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYzEzeHh4X2ZpeGVkX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZSk7CisKK2ludCBtYzEzeHh4X2ZpeGVkX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiAqcHJpdiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IG1jMTN4eHhfcmVndWxhdG9yICptYzEzeHh4X3JlZ3VsYXRvcnMgPSBwcml2LT5tYzEzeHh4X3JlZ3VsYXRvcnM7CisJaW50IGlkID0gcmRldl9nZXRfaWQocmRldik7CisKKwlkZXZfZGJnKHJkZXZfZ2V0X2RldihyZGV2KSwgIiVzIGlkOiAlZFxuIiwgX19mdW5jX18sIGlkKTsKKworCXJldHVybiBtYzEzeHh4X3JlZ3VsYXRvcnNbaWRdLnZvbHRhZ2VzWzBdOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWMxM3h4eF9maXhlZF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UpOworCitzdHJ1Y3QgcmVndWxhdG9yX29wcyBtYzEzeHh4X2ZpeGVkX3JlZ3VsYXRvcl9vcHMgPSB7CisJLmVuYWJsZSA9IG1jMTN4eHhfcmVndWxhdG9yX2VuYWJsZSwKKwkuZGlzYWJsZSA9IG1jMTN4eHhfcmVndWxhdG9yX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSBtYzEzeHh4X3JlZ3VsYXRvcl9pc19lbmFibGVkLAorCS5saXN0X3ZvbHRhZ2UgPSBtYzEzeHh4X3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2UsCisJLnNldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlID0gbWMxM3h4eF9maXhlZF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UsCit9OworRVhQT1JUX1NZTUJPTF9HUEwobWMxM3h4eF9maXhlZF9yZWd1bGF0b3Jfb3BzKTsKKworaW50IG1jMTN4eHhfc3dfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtYzEzeHh4X3N3X3JlZ3VsYXRvcl9pc19lbmFibGVkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiWW9uZyBTaGVuIDx5b25nLnNoZW5AbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVndWxhdG9yIERyaXZlciBmb3IgRnJlZXNjYWxlIE1DMTN4eHggUE1JQyIpOworTU9EVUxFX0FMSUFTKCJtYzEzeHh4LXJlZ3VsYXRvci1jb3JlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LmggYi9kcml2ZXJzL3JlZ3VsYXRvci9tYzEzeHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3NTgyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21jMTN4eHguaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIG1jMTN4eHguaCAtIHJlZ3VsYXRvcnMgZm9yIHRoZSBGcmVlc2NhbGUgbWMxM3h4eCBQTUlDCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBZb25nIFNoZW4gPHlvbmcuc2hlbkBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1JFR1VMQVRPUl9NQzEzWFhYX0gKKyNkZWZpbmUgX19MSU5VWF9SRUdVTEFUT1JfTUMxM1hYWF9ICisKKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisKK3N0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvciB7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2M7CisJaW50IHJlZzsKKwlpbnQgZW5hYmxlX2JpdDsKKwlpbnQgdnNlbF9yZWc7CisJaW50IHZzZWxfc2hpZnQ7CisJaW50IHZzZWxfbWFzazsKKwlpbnQgaGlfYml0OworCWludCBjb25zdCAqdm9sdGFnZXM7Cit9OworCitzdHJ1Y3QgbWMxM3h4eF9yZWd1bGF0b3JfcHJpdiB7CisJc3RydWN0IG1jMTN4eHggKm1jMTN4eHg7CisJdTMyIHBvd2VybWlzY19wd2d0X3N0YXRlOworCXN0cnVjdCBtYzEzeHh4X3JlZ3VsYXRvciAqbWMxM3h4eF9yZWd1bGF0b3JzOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3JzW107Cit9OworCitleHRlcm4gaW50IG1jMTN4eHhfc3dfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKK2V4dGVybiBpbnQgbWMxM3h4eF9zd19yZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CitleHRlcm4gaW50IG1jMTN4eHhfZ2V0X2Jlc3Rfdm9sdGFnZV9pbmRleChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpOworZXh0ZXJuIGludCBtYzEzeHh4X3JlZ3VsYXRvcl9saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJCQl1bnNpZ25lZCBzZWxlY3Rvcik7CitleHRlcm4gaW50IG1jMTN4eHhfZml4ZWRfcmVndWxhdG9yX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpOworZXh0ZXJuIGludCBtYzEzeHh4X2ZpeGVkX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CisKK2V4dGVybiBzdHJ1Y3QgcmVndWxhdG9yX29wcyBtYzEzeHh4X3JlZ3VsYXRvcl9vcHM7CitleHRlcm4gc3RydWN0IHJlZ3VsYXRvcl9vcHMgbWMxM3h4eF9maXhlZF9yZWd1bGF0b3Jfb3BzOworCisjZGVmaW5lIE1DMTN4eHhfREVGSU5FKHByZWZpeCwgX25hbWUsIF9yZWcsIF92c2VsX3JlZywgX3ZvbHRhZ2VzLCBfb3BzKQlcCisJW3ByZWZpeCAjIyBfbmFtZV0gPSB7CQkJCVwKKwkJLmRlc2MgPSB7CQkJCQkJXAorCQkJLm5hbWUgPSAjcHJlZml4ICJfIiAjX25hbWUsCQkJXAorCQkJLm5fdm9sdGFnZXMgPSBBUlJBWV9TSVpFKF92b2x0YWdlcyksCQlcCisJCQkub3BzID0gJl9vcHMsCQkJXAorCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJCQkuaWQgPSBwcmVmaXggIyMgX25hbWUsCQlcCisJCQkub3duZXIgPSBUSElTX01PRFVMRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJCS5yZWcgPSBwcmVmaXggIyMgX3JlZywJCQkJXAorCQkuZW5hYmxlX2JpdCA9IHByZWZpeCAjIyBfcmVnICMjIF8gIyMgX25hbWUgIyMgRU4sCVwKKwkJLnZzZWxfcmVnID0gcHJlZml4ICMjIF92c2VsX3JlZywJCQlcCisJCS52c2VsX3NoaWZ0ID0gcHJlZml4ICMjIF92c2VsX3JlZyAjIyBfICMjIF9uYW1lICMjIFZTRUwsXAorCQkudnNlbF9tYXNrID0gcHJlZml4ICMjIF92c2VsX3JlZyAjIyBfICMjIF9uYW1lICMjIFZTRUxfTSxcCisJCS52b2x0YWdlcyA9ICBfdm9sdGFnZXMsCQkJCQlcCisJfQorCisjZGVmaW5lIE1DMTN4eHhfRklYRURfREVGSU5FKHByZWZpeCwgX25hbWUsIF9yZWcsIF92b2x0YWdlcywgX29wcykJXAorCVtwcmVmaXggIyMgX25hbWVdID0gewkJCQlcCisJCS5kZXNjID0gewkJCQkJCVwKKwkJCS5uYW1lID0gI3ByZWZpeCAiXyIgI19uYW1lLAkJCVwKKwkJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRShfdm9sdGFnZXMpLAkJXAorCQkJLm9wcyA9ICZfb3BzLAkJXAorCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCisJCQkuaWQgPSBwcmVmaXggIyMgX25hbWUsCQlcCisJCQkub3duZXIgPSBUSElTX01PRFVMRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJCS5yZWcgPSBwcmVmaXggIyMgX3JlZywJCQkJXAorCQkuZW5hYmxlX2JpdCA9IHByZWZpeCAjIyBfcmVnICMjIF8gIyMgX25hbWUgIyMgRU4sCVwKKwkJLnZvbHRhZ2VzID0gIF92b2x0YWdlcywJCQkJCVwKKwl9CisKKyNkZWZpbmUgTUMxM3h4eF9HUE9fREVGSU5FKHByZWZpeCwgX25hbWUsIF9yZWcsICBfdm9sdGFnZXMsIF9vcHMpCVwKKwlbcHJlZml4ICMjIF9uYW1lXSA9IHsJCQkJXAorCQkuZGVzYyA9IHsJCQkJCQlcCisJCQkubmFtZSA9ICNwcmVmaXggIl8iICNfbmFtZSwJCQlcCisJCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUoX3ZvbHRhZ2VzKSwJCVwKKwkJCS5vcHMgPSAmX29wcywJCVwKKwkJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCQkJXAorCQkJLmlkID0gcHJlZml4ICMjIF9uYW1lLAkJXAorCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCQkJCVwKKwkJfSwJCQkJCQkJXAorCQkucmVnID0gcHJlZml4ICMjIF9yZWcsCQkJCVwKKwkJLmVuYWJsZV9iaXQgPSBwcmVmaXggIyMgX3JlZyAjIyBfICMjIF9uYW1lICMjIEVOLAlcCisJCS52b2x0YWdlcyA9ICBfdm9sdGFnZXMsCQkJCQlcCisJfQorCisjZGVmaW5lIE1DMTN4eHhfREVGSU5FX1NXKF9uYW1lLCBfcmVnLCBfdnNlbF9yZWcsIF92b2x0YWdlcywgb3BzKQlcCisJTUMxM3h4eF9ERUZJTkUoU1csIF9uYW1lLCBfcmVnLCBfdnNlbF9yZWcsIF92b2x0YWdlcywgb3BzKQorI2RlZmluZSBNQzEzeHh4X0RFRklORV9SRUdVKF9uYW1lLCBfcmVnLCBfdnNlbF9yZWcsIF92b2x0YWdlcywgb3BzKQlcCisJTUMxM3h4eF9ERUZJTkUoUkVHVSwgX25hbWUsIF9yZWcsIF92c2VsX3JlZywgX3ZvbHRhZ2VzLCBvcHMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcGNhcC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3BjYXAtcmVndWxhdG9yLmMKaW5kZXggMjlkMDU2Ni4uMzFmNmUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcGNhcC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9wY2FwLXJlZ3VsYXRvci5jCkBAIC0xNTEsNyArMTUxLDggQEAKIH07CiAKIHN0YXRpYyBpbnQgcGNhcF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICAgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBwY2FwX3JlZ3VsYXRvciAqdnJlZyA9ICZ2cmVnX3RhYmxlW3JkZXZfZ2V0X2lkKHJkZXYpXTsKIAl2b2lkICpwY2FwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKQEAgLTE3MCwxMCArMTcxLDEyIEBACiAJCQlpID0gMDsKIAogCQl1ViA9IHZyZWctPnZvbHRhZ2VfdGFibGVbaV0gKiAxMDAwOwotCQlpZiAobWluX3VWIDw9IHVWICYmIHVWIDw9IG1heF91VikKKwkJaWYgKG1pbl91ViA8PSB1ViAmJiB1ViA8PSBtYXhfdVYpIHsKKwkJCSpzZWxlY3RvciA9IGk7CiAJCQlyZXR1cm4gZXp4X3BjYXBfc2V0X2JpdHMocGNhcCwgdnJlZy0+cmVnLAogCQkJCQkodnJlZy0+bl92b2x0YWdlcyAtIDEpIDw8IHZyZWctPmluZGV4LAogCQkJCQlpIDw8IHZyZWctPmluZGV4KTsKKwkJfQogCiAJCWlmIChpID09IDAgJiYgcmRldl9nZXRfaWQocmRldikgPT0gVjEpCiAJCQlpID0gdnJlZy0+bl92b2x0YWdlcyAtIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9wY2Y1MDYzMy1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3BjZjUwNjMzLXJlZ3VsYXRvci5jCmluZGV4IGM4ZjQxZGMuLjY5YTExZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3BjZjUwNjMzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3BjZjUwNjMzLXJlZ3VsYXRvci5jCkBAIC0xMDgsNyArMTA4LDggQEAKIH0KIAogc3RhdGljIGludCBwY2Y1MDYzM19yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJCSAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCBwY2Y1MDYzMyAqcGNmOwogCWludCByZWd1bGF0b3JfaWQsIG1pbGxpdm9sdHM7CkBAIC0xNDcsNiArMTQ4LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJKnNlbGVjdG9yID0gdm9sdF9iaXRzOworCiAJcmV0dXJuIHBjZjUwNjMzX3JlZ193cml0ZShwY2YsIHJlZ25yLCB2b2x0X2JpdHMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTAyMy1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCmluZGV4IGNkNmQ0ZmMuLjYwYTdjYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDIzLXJlZ3VsYXRvci5jCkBAIC0zMjEsNyArMzIxLDggQEAKIH0KIAogc3RhdGljIGludCB0cHM2NTAyM19kY2RjX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCi0JCQkJaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICAgICB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IHRwc19wbWljICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGRjZGMgPSByZGV2X2dldF9pZChkZXYpOwpAQCAtMzQ2LDYgKzM0Nyw4IEBACiAJCQlicmVhazsKIAl9CiAKKwkqc2VsZWN0b3IgPSB2c2VsOworCiAJLyogd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIGluIGNhc2Ugd2UgZm91bmQgYSBtYXRjaCAqLwogCWlmICh2c2VsID09IHRwcy0+aW5mb1tkY2RjXS0+dGFibGVfbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3MSw3ICszNzQsNyBAQAogfQogCiBzdGF0aWMgaW50IHRwczY1MDIzX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAotCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgdHBzX3BtaWMgKnRwcyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgZGF0YSwgdnNlbCwgbGRvID0gcmRldl9nZXRfaWQoZGV2KTsKQEAgLTM5Niw2ICszOTksOCBAQAogCWlmICh2c2VsID09IHRwcy0+aW5mb1tsZG9dLT50YWJsZV9sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gdnNlbDsKKwogCWRhdGEgPSB0cHNfNjUwMjNfcmVnX3JlYWQodHBzLCBUUFM2NTAyM19SRUdfTERPX0NUUkwpOwogCWlmIChkYXRhIDwgMCkKIAkJcmV0dXJuIGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTA3eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCmluZGV4IDAyMGY1ODcuLjA2NDc1NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MDd4LXJlZ3VsYXRvci5jCkBAIC0zNjksNyArMzY5LDggQEAKIH0KIAogc3RhdGljIGludCB0cHM2NTA3eF9wbWljX2RjZGNfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKLQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJCSAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB0cHM2NTA3eF9wbWljICp0cHMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGRhdGEsIHZzZWwsIGRjZGMgPSByZGV2X2dldF9pZChkZXYpOwpAQCAtNDE1LDYgKzQxNiw4IEBACiAJaWYgKHZzZWwgPT0gdHBzLT5pbmZvW2RjZGNdLT50YWJsZV9sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gdnNlbDsKKwogCWRhdGEgPSB0cHM2NTA3eF9wbWljX3JlZ19yZWFkKHRwcywgcmVnKTsKIAlpZiAoZGF0YSA8IDApCiAJCXJldHVybiBkYXRhOwpAQCAtNDUwLDcgKzQ1Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgdHBzNjUwN3hfcG1pY19sZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKLQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQkgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCQkJIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgdHBzNjUwN3hfcG1pYyAqdHBzID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCBkYXRhLCB2c2VsLCBsZG8gPSByZGV2X2dldF9pZChkZXYpOwpAQCAtNDgzLDYgKzQ4Nyw4IEBACiAJaWYgKHZzZWwgPT0gdHBzLT5pbmZvW2xkb10tPnRhYmxlX2xlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqc2VsZWN0b3IgPSB2c2VsOworCiAJZGF0YSA9IHRwczY1MDd4X3BtaWNfcmVnX3JlYWQodHBzLCByZWcpOwogCWlmIChkYXRhIDwgMCkKIAkJcmV0dXJuIGRhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjR4LXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NmE2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTI0eC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqIFJlZ3VsYXRvciBkcml2ZXIgZm9yIFRQUzY1MjR4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueSBraW5kLAorICogd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorCisjZGVmaW5lIFJFR19MRE9fU0VUCQkweDAKKyNkZWZpbmUgTERPX0lMSU1fTUFTSwkJMQkvKiAwID0gNDAwLTgwMCwgMSA9IDkwMC0xNTAwICovCisjZGVmaW5lIExET19WU0VMX01BU0sJCTB4MGYKKyNkZWZpbmUgTERPMl9JTElNX1NISUZUCQkxMgorI2RlZmluZSBMRE8yX1ZTRUxfU0hJRlQJCTQKKyNkZWZpbmUgTERPMV9JTElNX1NISUZUCQk4CisjZGVmaW5lIExETzFfVlNFTF9TSElGVAkJMAorCisjZGVmaW5lIFJFR19CTE9DS19FTgkJMHgxCisjZGVmaW5lIEJMT0NLX01BU0sJCTEKKyNkZWZpbmUgQkxPQ0tfTERPMV9TSElGVAkwCisjZGVmaW5lIEJMT0NLX0xETzJfU0hJRlQJMQorI2RlZmluZSBCTE9DS19MQ0RfU0hJRlQJCTIKKyNkZWZpbmUgQkxPQ0tfVVNCX1NISUZUCQkzCisKKyNkZWZpbmUgUkVHX0RDRENfU0VUCQkweDIKKyNkZWZpbmUgRENEQ19WRENEQ19NQVNLCQkweDFmCisjZGVmaW5lIERDRENfVkRDREMxX1NISUZUCTAKKyNkZWZpbmUgRENEQ19WRENEQzJfU0hJRlQJNQorI2RlZmluZSBEQ0RDX1ZEQ0RDM19TSElGVAkxMAorCisjZGVmaW5lIFJFR19EQ0RDX0VOCQkweDMKKyNkZWZpbmUgRENEQ0RDRENfRU5fTUFTSwkweDEKKyNkZWZpbmUgRENEQ0RDREMxX0VOX1NISUZUCTAKKyNkZWZpbmUgRENEQ0RDREMxX1BHX01TSwlCSVQoMSkKKyNkZWZpbmUgRENEQ0RDREMyX0VOX1NISUZUCTIKKyNkZWZpbmUgRENEQ0RDREMyX1BHX01TSwlCSVQoMykKKyNkZWZpbmUgRENEQ0RDREMzX0VOX1NISUZUCTQKKyNkZWZpbmUgRENEQ0RDREMzX1BHX01TSwlCSVQoNSkKKworI2RlZmluZSBSRUdfVVNCCQkJMHg0CisjZGVmaW5lIFVTQl9JTElNX1NISUZUCQkwCisjZGVmaW5lIFVTQl9JTElNX01BU0sJCTB4MworI2RlZmluZSBVU0JfVFNEX1NISUZUCQkyCisjZGVmaW5lIFVTQl9UU0RfTUFTSwkJMHgzCisjZGVmaW5lIFVTQl9UV0FSTl9TSElGVAkJNAorI2RlZmluZSBVU0JfVFdBUk5fTUFTSwkJMHgzCisjZGVmaW5lIFVTQl9JV0FSTl9TRAkJQklUKDYpCisjZGVmaW5lIFVTQl9GQVNUX0xPT1AJCUJJVCg3KQorCisjZGVmaW5lIFJFR19BTEFSTQkJMHg1CisjZGVmaW5lIEFMQVJNX0xETzEJCUJJVCgwKQorI2RlZmluZSBBTEFSTV9EQ0RDMQkJQklUKDEpCisjZGVmaW5lIEFMQVJNX0RDREMyCQlCSVQoMikKKyNkZWZpbmUgQUxBUk1fRENEQzMJCUJJVCgzKQorI2RlZmluZSBBTEFSTV9MRE8yCQlCSVQoNCkKKyNkZWZpbmUgQUxBUk1fVVNCX1dBUk4JCUJJVCg1KQorI2RlZmluZSBBTEFSTV9VU0JfQUxBUk0JCUJJVCg2KQorI2RlZmluZSBBTEFSTV9MQ0QJCUJJVCg5KQorI2RlZmluZSBBTEFSTV9URU1QX1dBUk0JCUJJVCgxMCkKKyNkZWZpbmUgQUxBUk1fVEVNUF9IT1QJCUJJVCgxMSkKKyNkZWZpbmUgQUxBUk1fTlJTVAkJQklUKDE0KQorI2RlZmluZSBBTEFSTV9QT1dFUlVQCQlCSVQoMTUpCisKKyNkZWZpbmUgUkVHX0lOVF9FTkFCTEUJCTB4NgorI2RlZmluZSBJTlRfTERPMQkJQklUKDApCisjZGVmaW5lIElOVF9EQ0RDMQkJQklUKDEpCisjZGVmaW5lIElOVF9EQ0RDMgkJQklUKDIpCisjZGVmaW5lIElOVF9EQ0RDMwkJQklUKDMpCisjZGVmaW5lIElOVF9MRE8yCQlCSVQoNCkKKyNkZWZpbmUgSU5UX1VTQl9XQVJOCQlCSVQoNSkKKyNkZWZpbmUgSU5UX1VTQl9BTEFSTQkJQklUKDYpCisjZGVmaW5lIElOVF9MQ0QJCQlCSVQoOSkKKyNkZWZpbmUgSU5UX1RFTVBfV0FSTQkJQklUKDEwKQorI2RlZmluZSBJTlRfVEVNUF9IT1QJCUJJVCgxMSkKKyNkZWZpbmUgSU5UX0dMT0JBTF9FTgkJQklUKDE1KQorCisjZGVmaW5lIFJFR19JTlRfU1RBVFVTCQkweDcKKyNkZWZpbmUgU1RBVFVTX0xETzEJCUJJVCgwKQorI2RlZmluZSBTVEFUVVNfRENEQzEJCUJJVCgxKQorI2RlZmluZSBTVEFUVVNfRENEQzIJCUJJVCgyKQorI2RlZmluZSBTVEFUVVNfRENEQzMJCUJJVCgzKQorI2RlZmluZSBTVEFUVVNfTERPMgkJQklUKDQpCisjZGVmaW5lIFNUQVRVU19VU0JfV0FSTgkJQklUKDUpCisjZGVmaW5lIFNUQVRVU19VU0JfQUxBUk0JQklUKDYpCisjZGVmaW5lIFNUQVRVU19MQ0QJCUJJVCg5KQorI2RlZmluZSBTVEFUVVNfVEVNUF9XQVJNCUJJVCgxMCkKKyNkZWZpbmUgU1RBVFVTX1RFTVBfSE9UCQlCSVQoMTEpCisKKyNkZWZpbmUgUkVHX1NPRlRXQVJFX1JFU0VUCTB4YgorI2RlZmluZSBSRUdfV1JJVEVfRU5BQkxFCTB4ZAorI2RlZmluZSBSRUdfUkVWX0lECQkweGYKKworI2RlZmluZSBOX0RDREMJCQkzCisjZGVmaW5lIE5fTERPCQkJMgorI2RlZmluZSBOX1NXSVRDSAkJMgorI2RlZmluZSBOX1JFR1VMQVRPUlMJCSgzIC8qIERDREMgKi8gKyBcCisJCQkJIDIgLyogTERPICovICArIFwKKwkJCQkgMiAvKiBzd2l0Y2ggKi8pCisKKyNkZWZpbmUgRklYRURfSUxJTVNFTAkJQklUKDApCisjZGVmaW5lIEZJWEVEX1ZPTFRBR0UJCUJJVCgxKQorCisjZGVmaW5lIENNRF9SRUFEKHJlZykJCSgocmVnKSA8PCA2KQorI2RlZmluZSBDTURfV1JJVEUocmVnKQkJKEJJVCg1KSB8IChyZWcpIDw8IDYpCisjZGVmaW5lIFNUQVRfQ0xLCQlCSVQoMykKKyNkZWZpbmUgU1RBVF9XUklURQkJQklUKDIpCisjZGVmaW5lIFNUQVRfSU5WQUxJRAkJQklUKDEpCisjZGVmaW5lIFNUQVRfV1AJCQlCSVQoMCkKKworc3RydWN0IGZpZWxkIHsKKwlpbnQJCXJlZzsKKwlpbnQJCXNoaWZ0OworCWludAkJbWFzazsKK307CisKK3N0cnVjdCBzdXBwbHlfaW5mbyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwlpbnQJCW5fdm9sdGFnZXM7CisJY29uc3QgaW50CSp2b2x0YWdlczsKKwlpbnQJCWZpeGVkX3ZvbHRhZ2U7CisJaW50CQluX2lsaW1zZWxzOworCWNvbnN0IGludAkqaWxpbXNlbHM7CisJaW50CQlmaXhlZF9pbGltc2VsOworCWludAkJZmxhZ3M7CisJc3RydWN0IGZpZWxkCWVuYWJsZSwgdm9sdGFnZSwgaWxpbXNlbDsKK307CisKK3N0cnVjdCB0cHM2NTI0eCB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOworCXN0cnVjdCBtdXRleAkJbG9jazsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MJZGVzY1tOX1JFR1VMQVRPUlNdOworCXN0cnVjdCByZWd1bGF0b3JfZGV2CSpyZGV2W05fUkVHVUxBVE9SU107Cit9OworCitzdGF0aWMgaW50IF9fcmVhZF9yZWcoc3RydWN0IHRwczY1MjR4ICpodywgaW50IHJlZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCXUxNiBjbWQgPSBDTURfUkVBRChyZWcpLCBpbjsKKwl1OCBzdGF0dXM7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzNdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIHNpemVvZih0KSk7CisKKwl0WzBdLnR4X2J1ZiA9ICZjbWQ7CisJdFswXS5sZW4gPSAyOworCXRbMF0uYml0c19wZXJfd29yZCA9IDEyOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisKKwl0WzFdLnJ4X2J1ZiA9ICZpbjsKKwl0WzFdLmxlbiA9IDI7CisJdFsxXS5iaXRzX3Blcl93b3JkID0gMTY7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworCXRbMl0ucnhfYnVmID0gJnN0YXR1czsKKwl0WzJdLmxlbiA9IDE7CisJdFsyXS5iaXRzX3Blcl93b3JkID0gNDsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFsyXSwgJm0pOworCisJZXJyb3IgPSBzcGlfc3luYyhody0+c3BpLCAmbSk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJZGV2X2RiZyhody0+ZGV2LCAicmVhZCByZWcgJWQsIGRhdGEgJXgsIHN0YXR1cyAleFxuIiwKKwkJcmVnLCBpbiwgc3RhdHVzKTsKKworCWlmICghKHN0YXR1cyAmIFNUQVRfQ0xLKSB8fCAoc3RhdHVzICYgU1RBVF9XUklURSkpCisJCXJldHVybiAtRUlPOworCisJaWYgKHN0YXR1cyAmIFNUQVRfSU5WQUxJRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaW47Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yZWcoc3RydWN0IHRwczY1MjR4ICpodywgaW50IHJlZykKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmaHctPmxvY2spOworCXJldCA9IF9fcmVhZF9yZWcoaHcsIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZody0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fd3JpdGVfcmVnKHN0cnVjdCB0cHM2NTI0eCAqaHcsIGludCByZWcsIGludCB2YWwpCit7CisJaW50IGVycm9yID0gMDsKKwl1MTYgY21kID0gQ01EX1dSSVRFKHJlZyksIG91dCA9IHZhbDsKKwl1OCBzdGF0dXM7CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzNdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJbWVtc2V0KHQsIDAsIHNpemVvZih0KSk7CisKKwl0WzBdLnR4X2J1ZiA9ICZjbWQ7CisJdFswXS5sZW4gPSAyOworCXRbMF0uYml0c19wZXJfd29yZCA9IDEyOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisKKwl0WzFdLnR4X2J1ZiA9ICZvdXQ7CisJdFsxXS5sZW4gPSAyOworCXRbMV0uYml0c19wZXJfd29yZCA9IDE2OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwl0WzJdLnJ4X2J1ZiA9ICZzdGF0dXM7CisJdFsyXS5sZW4gPSAxOworCXRbMl0uYml0c19wZXJfd29yZCA9IDQ7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMl0sICZtKTsKKworCWVycm9yID0gc3BpX3N5bmMoaHctPnNwaSwgJm0pOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWRldl9kYmcoaHctPmRldiwgIndyb3RlIHJlZyAlZCwgZGF0YSAleCwgc3RhdHVzICV4XG4iLAorCQlyZWcsIG91dCwgc3RhdHVzKTsKKworCWlmICghKHN0YXR1cyAmIFNUQVRfQ0xLKSB8fCAhKHN0YXR1cyAmIFNUQVRfV1JJVEUpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChzdGF0dXMgJiAoU1RBVF9JTlZBTElEIHwgU1RBVF9XUCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IF9fcm13X3JlZyhzdHJ1Y3QgdHBzNjUyNHggKmh3LCBpbnQgcmVnLCBpbnQgbWFzaywgaW50IHZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19yZWFkX3JlZyhodywgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAmPSB+bWFzazsKKwlyZXQgfD0gdmFsOworCisJcmV0ID0gX193cml0ZV9yZWcoaHcsIHJlZywgcmV0KTsKKworCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAwOworfQorCitzdGF0aWMgaW50IHJtd19wcm90ZWN0KHN0cnVjdCB0cHM2NTI0eCAqaHcsIGludCByZWcsIGludCBtYXNrLCBpbnQgdmFsKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZody0+bG9jayk7CisKKwlyZXQgPSBfX3dyaXRlX3JlZyhodywgUkVHX1dSSVRFX0VOQUJMRSwgMSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGh3LT5kZXYsICJmYWlsZWQgdG8gc2V0IHdyaXRlIGVuYWJsZVxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gX19ybXdfcmVnKGh3LCByZWcsIG1hc2ssIHZhbCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihody0+ZGV2LCAiZmFpbGVkIHRvIHJtdyByZWdpc3RlciAlZFxuIiwgcmVnKTsKKworCXJldCA9IF9fd3JpdGVfcmVnKGh3LCBSRUdfV1JJVEVfRU5BQkxFLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoaHctPmRldiwgImZhaWxlZCB0byBjbGVhciB3cml0ZSBlbmFibGVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZody0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlYWRfZmllbGQoc3RydWN0IHRwczY1MjR4ICpodywgY29uc3Qgc3RydWN0IGZpZWxkICpmaWVsZCkKK3sKKwlpbnQgdG1wOworCisJdG1wID0gcmVhZF9yZWcoaHcsIGZpZWxkLT5yZWcpOworCWlmICh0bXAgPCAwKQorCQlyZXR1cm4gdG1wOworCisJcmV0dXJuICh0bXAgPj4gZmllbGQtPnNoaWZ0KSAmIGZpZWxkLT5tYXNrOworfQorCitzdGF0aWMgaW50IHdyaXRlX2ZpZWxkKHN0cnVjdCB0cHM2NTI0eCAqaHcsIGNvbnN0IHN0cnVjdCBmaWVsZCAqZmllbGQsCisJCSAgICAgICBpbnQgdmFsKQoreworCWlmICh2YWwgJiB+ZmllbGQtPm1hc2spCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcmV0dXJuIHJtd19wcm90ZWN0KGh3LCBmaWVsZC0+cmVnLAorCQkJCSAgICBmaWVsZC0+bWFzayA8PCBmaWVsZC0+c2hpZnQsCisJCQkJICAgIHZhbCA8PCBmaWVsZC0+c2hpZnQpOworfQorCitzdGF0aWMgY29uc3QgaW50IGRjZGMxX3ZvbHRhZ2VzW10gPSB7CisJIDgwMDAwMCwgIDgyNTAwMCwgIDg1MDAwMCwgIDg3NTAwMCwKKwkgOTAwMDAwLCAgOTI1MDAwLCAgOTUwMDAwLCAgOTc1MDAwLAorCTEwMDAwMDAsIDEwMjUwMDAsIDEwNTAwMDAsIDEwNzUwMDAsCisJMTEwMDAwMCwgMTEyNTAwMCwgMTE1MDAwMCwgMTE3NTAwMCwKKwkxMjAwMDAwLCAxMjI1MDAwLCAxMjUwMDAwLCAxMjc1MDAwLAorCTEzMDAwMDAsIDEzMjUwMDAsIDEzNTAwMDAsIDEzNzUwMDAsCisJMTQwMDAwMCwgMTQyNTAwMCwgMTQ1MDAwMCwgMTQ3NTAwMCwKKwkxNTAwMDAwLCAxNTI1MDAwLCAxNTUwMDAwLCAxNTc1MDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBkY2RjMl92b2x0YWdlc1tdID0geworCTE0MDAwMDAsIDE0NTAwMDAsIDE1MDAwMDAsIDE1NTAwMDAsCisJMTYwMDAwMCwgMTY1MDAwMCwgMTcwMDAwMCwgMTc1MDAwMCwKKwkxODAwMDAwLCAxODUwMDAwLCAxOTAwMDAwLCAxOTUwMDAwLAorCTIwMDAwMDAsIDIwNTAwMDAsIDIxMDAwMDAsIDIxNTAwMDAsCisJMjIwMDAwMCwgMjI1MDAwMCwgMjMwMDAwMCwgMjM1MDAwMCwKKwkyNDAwMDAwLCAyNDUwMDAwLCAyNTAwMDAwLCAyNTUwMDAwLAorCTI2MDAwMDAsIDI2NTAwMDAsIDI3MDAwMDAsIDI3NTAwMDAsCisJMjgwMDAwMCwgMjg1MDAwMCwgMjkwMDAwMCwgMjk1MDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgZGNkYzNfdm9sdGFnZXNbXSA9IHsKKwkyNDAwMDAwLCAyNDUwMDAwLCAyNTAwMDAwLCAyNTUwMDAwLCAyNjAwMDAwLAorCTI2NTAwMDAsIDI3MDAwMDAsIDI3NTAwMDAsIDI4MDAwMDAsIDI4NTAwMDAsCisJMjkwMDAwMCwgMjk1MDAwMCwgMzAwMDAwMCwgMzA1MDAwMCwgMzEwMDAwMCwKKwkzMTUwMDAwLCAzMjAwMDAwLCAzMjUwMDAwLCAzMzAwMDAwLCAzMzUwMDAwLAorCTM0MDAwMDAsIDM0NTAwMDAsIDM1MDAwMDAsIDM1NTAwMDAsIDM2MDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgaW50IGxkbzFfdm9sdGFnZXNbXSA9IHsKKwk0MzAwMDAwLCA0MzUwMDAwLCA0NDAwMDAwLCA0NDUwMDAwLAorCTQ1MDAwMDAsIDQ1NTAwMDAsIDQ2MDAwMDAsIDQ2NTAwMDAsCisJNDcwMDAwMCwgNDc1MDAwMCwgNDgwMDAwMCwgNDg1MDAwMCwKKwk0OTAwMDAwLCA0OTUwMDAwLCA1MDAwMDAwLCA1MDUwMDAwLAorfTsKKworc3RhdGljIGNvbnN0IGludCBsZG8yX3ZvbHRhZ2VzW10gPSB7CisJMTEwMDAwMCwgMTE1MDAwMCwgMTIwMDAwMCwgMTI1MDAwMCwKKwkxMzAwMDAwLCAxNzAwMDAwLCAxNzUwMDAwLCAxODAwMDAwLAorCTE4NTAwMDAsIDE5MDAwMDAsIDMxNTAwMDAsIDMyMDAwMDAsCisJMzI1MDAwMCwgMzMwMDAwMCwgMzM1MDAwMCwgMzQwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgbGRvX2lsaW1zZWxbXSA9IHsKKwk0MDAwMDAsIDE1MDAwMDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgdXNiX2lsaW1zZWxbXSA9IHsKKwkyMDAwMDAsIDQwMDAwMCwgODAwMDAwLCAxMDAwMDAwCit9OworCisjZGVmaW5lIF9fTUtfRklFTEQoX3JlZywgX21hc2ssIF9zaGlmdCkgXAorCXsgLnJlZyA9IChfcmVnKSwgLm1hc2sgPSAoX21hc2spLCAuc2hpZnQgPSAoX3NoaWZ0KSwgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1cHBseV9pbmZvIHN1cHBseV9pbmZvW05fUkVHVUxBVE9SU10gPSB7CisJeworCQkubmFtZQkJPSAiRENEQzEiLAorCQkuZmxhZ3MJCT0gRklYRURfSUxJTVNFTCwKKwkJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGRjZGMxX3ZvbHRhZ2VzKSwKKwkJLnZvbHRhZ2VzCT0gZGNkYzFfdm9sdGFnZXMsCisJCS5maXhlZF9pbGltc2VsCT0gMjQwMDAwMCwKKwkJLmVuYWJsZQkJPSBfX01LX0ZJRUxEKFJFR19EQ0RDX0VOLCBEQ0RDRENEQ19FTl9NQVNLLAorCQkJCQkgICAgIERDRENEQ0RDMV9FTl9TSElGVCksCisJCS52b2x0YWdlCT0gX19NS19GSUVMRChSRUdfRENEQ19TRVQsIERDRENfVkRDRENfTUFTSywKKwkJCQkJICAgICBEQ0RDX1ZEQ0RDMV9TSElGVCksCisJfSwKKwl7CisJCS5uYW1lCQk9ICJEQ0RDMiIsCisJCS5mbGFncwkJPSBGSVhFRF9JTElNU0VMLAorCQkubl92b2x0YWdlcwk9IEFSUkFZX1NJWkUoZGNkYzJfdm9sdGFnZXMpLAorCQkudm9sdGFnZXMJPSBkY2RjMl92b2x0YWdlcywKKwkJLmZpeGVkX2lsaW1zZWwJPSAxMjAwMDAwLAorCQkuZW5hYmxlCQk9IF9fTUtfRklFTEQoUkVHX0RDRENfRU4sIERDRENEQ0RDX0VOX01BU0ssCisJCQkJCSAgICAgRENEQ0RDREMyX0VOX1NISUZUKSwKKwkJLnZvbHRhZ2UJPSBfX01LX0ZJRUxEKFJFR19EQ0RDX1NFVCwgRENEQ19WRENEQ19NQVNLLAorCQkJCQkgICAgIERDRENfVkRDREMyX1NISUZUKSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIkRDREMzIiwKKwkJLmZsYWdzCQk9IEZJWEVEX0lMSU1TRUwsCisJCS5uX3ZvbHRhZ2VzCT0gQVJSQVlfU0laRShkY2RjM192b2x0YWdlcyksCisJCS52b2x0YWdlcwk9IGRjZGMzX3ZvbHRhZ2VzLAorCQkuZml4ZWRfaWxpbXNlbAk9IDEyMDAwMDAsCisJCS5lbmFibGUJCT0gX19NS19GSUVMRChSRUdfRENEQ19FTiwgRENEQ0RDRENfRU5fTUFTSywKKwkJCQkJRENEQ0RDREMzX0VOX1NISUZUKSwKKwkJLnZvbHRhZ2UJPSBfX01LX0ZJRUxEKFJFR19EQ0RDX1NFVCwgRENEQ19WRENEQ19NQVNLLAorCQkJCQkgICAgIERDRENfVkRDREMzX1NISUZUKSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIkxETzEiLAorCQkubl92b2x0YWdlcwk9IEFSUkFZX1NJWkUobGRvMV92b2x0YWdlcyksCisJCS52b2x0YWdlcwk9IGxkbzFfdm9sdGFnZXMsCisJCS5uX2lsaW1zZWxzCT0gQVJSQVlfU0laRShsZG9faWxpbXNlbCksCisJCS5pbGltc2Vscwk9IGxkb19pbGltc2VsLAorCQkuZW5hYmxlCQk9IF9fTUtfRklFTEQoUkVHX0JMT0NLX0VOLCBCTE9DS19NQVNLLAorCQkJCQkgICAgIEJMT0NLX0xETzFfU0hJRlQpLAorCQkudm9sdGFnZQk9IF9fTUtfRklFTEQoUkVHX0xET19TRVQsIExET19WU0VMX01BU0ssCisJCQkJCSAgICAgTERPMV9WU0VMX1NISUZUKSwKKwkJLmlsaW1zZWwJPSBfX01LX0ZJRUxEKFJFR19MRE9fU0VULCBMRE9fSUxJTV9NQVNLLAorCQkJCQkgICAgIExETzFfSUxJTV9TSElGVCksCisJfSwKKwl7CisJCS5uYW1lCQk9ICJMRE8yIiwKKwkJLm5fdm9sdGFnZXMJPSBBUlJBWV9TSVpFKGxkbzJfdm9sdGFnZXMpLAorCQkudm9sdGFnZXMJPSBsZG8yX3ZvbHRhZ2VzLAorCQkubl9pbGltc2Vscwk9IEFSUkFZX1NJWkUobGRvX2lsaW1zZWwpLAorCQkuaWxpbXNlbHMJPSBsZG9faWxpbXNlbCwKKwkJLmVuYWJsZQkJPSBfX01LX0ZJRUxEKFJFR19CTE9DS19FTiwgQkxPQ0tfTUFTSywKKwkJCQkJICAgICBCTE9DS19MRE8yX1NISUZUKSwKKwkJLnZvbHRhZ2UJPSBfX01LX0ZJRUxEKFJFR19MRE9fU0VULCBMRE9fVlNFTF9NQVNLLAorCQkJCQkgICAgIExETzJfVlNFTF9TSElGVCksCisJCS5pbGltc2VsCT0gX19NS19GSUVMRChSRUdfTERPX1NFVCwgTERPX0lMSU1fTUFTSywKKwkJCQkJICAgICBMRE8yX0lMSU1fU0hJRlQpLAorCX0sCisJeworCQkubmFtZQkJPSAiVVNCIiwKKwkJLmZsYWdzCQk9IEZJWEVEX1ZPTFRBR0UsCisJCS5maXhlZF92b2x0YWdlCT0gNTAwMDAwMCwKKwkJLm5faWxpbXNlbHMJPSBBUlJBWV9TSVpFKHVzYl9pbGltc2VsKSwKKwkJLmlsaW1zZWxzCT0gdXNiX2lsaW1zZWwsCisJCS5lbmFibGUJCT0gX19NS19GSUVMRChSRUdfQkxPQ0tfRU4sIEJMT0NLX01BU0ssCisJCQkJCSAgICAgQkxPQ0tfVVNCX1NISUZUKSwKKwkJLmlsaW1zZWwJPSBfX01LX0ZJRUxEKFJFR19VU0IsIFVTQl9JTElNX01BU0ssCisJCQkJCSAgICAgVVNCX0lMSU1fU0hJRlQpLAorCX0sCisJeworCQkubmFtZQkJPSAiTENEIiwKKwkJLmZsYWdzCQk9IEZJWEVEX1ZPTFRBR0UgfCBGSVhFRF9JTElNU0VMLAorCQkuZml4ZWRfdm9sdGFnZQk9IDUwMDAwMDAsCisJCS5maXhlZF9pbGltc2VsCT0gIDQwMDAwMCwKKwkJLmVuYWJsZQkJPSBfX01LX0ZJRUxEKFJFR19CTE9DS19FTiwgQkxPQ0tfTUFTSywKKwkJCQkJICAgICBCTE9DS19MQ0RfU0hJRlQpLAorCX0sCit9OworCitzdGF0aWMgaW50IGxpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJY29uc3Qgc3RydWN0IHN1cHBseV9pbmZvICppbmZvOworCXN0cnVjdCB0cHM2NTI0eCAqaHc7CisKKwlodwk9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW5mbwk9ICZzdXBwbHlfaW5mb1tyZGV2X2dldF9pZChyZGV2KV07CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGSVhFRF9WT0xUQUdFKQorCQlyZXR1cm4gc2VsZWN0b3IgPyAtRUlOVkFMIDogaW5mby0+Zml4ZWRfdm9sdGFnZTsKKworCXJldHVybiAoKHNlbGVjdG9yIDwgaW5mby0+bl92b2x0YWdlcykgPworCQlpbmZvLT52b2x0YWdlc1tzZWxlY3Rvcl0gOiAtRUlOVkFMKTsKK30KKworc3RhdGljIGludCBzZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJICAgICAgIHVuc2lnbmVkICpzZWxlY3RvcikKK3sKKwljb25zdCBzdHJ1Y3Qgc3VwcGx5X2luZm8gKmluZm87CisJc3RydWN0IHRwczY1MjR4ICpodzsKKwl1bnNpZ25lZCBpOworCisJaHcJPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWluZm8JPSAmc3VwcGx5X2luZm9bcmRldl9nZXRfaWQocmRldildOworCisJaWYgKGluZm8tPmZsYWdzICYgRklYRURfVk9MVEFHRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bl92b2x0YWdlczsgaSsrKQorCQlpZiAobWluX3VWIDw9IGluZm8tPnZvbHRhZ2VzW2ldICYmCisJCSAgICBtYXhfdVYgPj0gaW5mby0+dm9sdGFnZXNbaV0pCisJCQlicmVhazsKKworCWlmIChpID49IGluZm8tPm5fdm9sdGFnZXMpCisJCWkgPSBpbmZvLT5uX3ZvbHRhZ2VzIC0gMTsKKworCSpzZWxlY3RvciA9IGluZm8tPnZvbHRhZ2VzW2ldOworCisJcmV0dXJuIHdyaXRlX2ZpZWxkKGh3LCAmaW5mby0+dm9sdGFnZSwgaSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJY29uc3Qgc3RydWN0IHN1cHBseV9pbmZvICppbmZvOworCXN0cnVjdCB0cHM2NTI0eCAqaHc7CisJaW50IHJldDsKKworCWh3CT0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbmZvCT0gJnN1cHBseV9pbmZvW3JkZXZfZ2V0X2lkKHJkZXYpXTsKKworCWlmIChpbmZvLT5mbGFncyAmIEZJWEVEX1ZPTFRBR0UpCisJCXJldHVybiBpbmZvLT5maXhlZF92b2x0YWdlOworCisJcmV0ID0gcmVhZF9maWVsZChodywgJmluZm8tPnZvbHRhZ2UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChXQVJOX09OKHJldCA+PSBpbmZvLT5uX3ZvbHRhZ2VzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gaW5mby0+dm9sdGFnZXNbcmV0XTsKK30KKworc3RhdGljIGludCBzZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91QSwKKwkJCSAgICAgaW50IG1heF91QSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3VwcGx5X2luZm8gKmluZm87CisJc3RydWN0IHRwczY1MjR4ICpodzsKKwlpbnQgaTsKKworCWh3CT0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbmZvCT0gJnN1cHBseV9pbmZvW3JkZXZfZ2V0X2lkKHJkZXYpXTsKKworCWlmIChpbmZvLT5mbGFncyAmIEZJWEVEX0lMSU1TRUwpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm5faWxpbXNlbHM7IGkrKykKKwkJaWYgKG1pbl91QSA8PSBpbmZvLT5pbGltc2Vsc1tpXSAmJgorCQkgICAgbWF4X3VBID49IGluZm8tPmlsaW1zZWxzW2ldKQorCQkJYnJlYWs7CisKKwlpZiAoaSA+PSBpbmZvLT5uX2lsaW1zZWxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB3cml0ZV9maWVsZChodywgJmluZm8tPmlsaW1zZWwsIGkpOworfQorCitzdGF0aWMgaW50IGdldF9jdXJyZW50X2xpbWl0KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCWNvbnN0IHN0cnVjdCBzdXBwbHlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdHBzNjUyNHggKmh3OworCWludCByZXQ7CisKKwlodwk9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW5mbwk9ICZzdXBwbHlfaW5mb1tyZGV2X2dldF9pZChyZGV2KV07CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBGSVhFRF9JTElNU0VMKQorCQlyZXR1cm4gaW5mby0+Zml4ZWRfaWxpbXNlbDsKKworCXJldCA9IHJlYWRfZmllbGQoaHcsICZpbmZvLT5pbGltc2VsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoV0FSTl9PTihyZXQgPj0gaW5mby0+bl9pbGltc2VscykpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGluZm8tPmlsaW1zZWxzW3JldF07Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX3N1cHBseShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc3VwcGx5X2luZm8gKmluZm87CisJc3RydWN0IHRwczY1MjR4ICpodzsKKworCWh3CT0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlpbmZvCT0gJnN1cHBseV9pbmZvW3JkZXZfZ2V0X2lkKHJkZXYpXTsKKworCXJldHVybiB3cml0ZV9maWVsZChodywgJmluZm8tPmVuYWJsZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGlzYWJsZV9zdXBwbHkoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJY29uc3Qgc3RydWN0IHN1cHBseV9pbmZvICppbmZvOworCXN0cnVjdCB0cHM2NTI0eCAqaHc7CisKKwlodwk9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW5mbwk9ICZzdXBwbHlfaW5mb1tyZGV2X2dldF9pZChyZGV2KV07CisKKwlyZXR1cm4gd3JpdGVfZmllbGQoaHcsICZpbmZvLT5lbmFibGUsIDApOworfQorCitzdGF0aWMgaW50IGlzX3N1cHBseV9lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCWNvbnN0IHN0cnVjdCBzdXBwbHlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdHBzNjUyNHggKmh3OworCisJaHcJPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWluZm8JPSAmc3VwcGx5X2luZm9bcmRldl9nZXRfaWQocmRldildOworCisJcmV0dXJuIHJlYWRfZmllbGQoaHcsICZpbmZvLT5lbmFibGUpOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgcmVndWxhdG9yX29wcyA9IHsKKwkuaXNfZW5hYmxlZAkJPSBpc19zdXBwbHlfZW5hYmxlZCwKKwkuZW5hYmxlCQkJPSBlbmFibGVfc3VwcGx5LAorCS5kaXNhYmxlCQk9IGRpc2FibGVfc3VwcGx5LAorCS5nZXRfdm9sdGFnZQkJPSBnZXRfdm9sdGFnZSwKKwkuc2V0X3ZvbHRhZ2UJCT0gc2V0X3ZvbHRhZ2UsCisJLmxpc3Rfdm9sdGFnZQkJPSBsaXN0X3ZvbHRhZ2UsCisJLnNldF9jdXJyZW50X2xpbWl0CT0gc2V0X2N1cnJlbnRfbGltaXQsCisJLmdldF9jdXJyZW50X2xpbWl0CT0gZ2V0X2N1cnJlbnRfbGltaXQsCit9OworCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwbWljX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0cHM2NTI0eCAqaHcgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlpbnQgaTsKKworCWlmICghaHcpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBOX1JFR1VMQVRPUlM7IGkrKykgeworCQlpZiAoaHctPnJkZXZbaV0pCisJCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcihody0+cmRldltpXSk7CisJCWh3LT5yZGV2W2ldID0gTlVMTDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgTlVMTCk7CisJa2ZyZWUoaHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbWljX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHRwczY1MjR4ICpodzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3BpLT5kZXY7CisJY29uc3Qgc3RydWN0IHN1cHBseV9pbmZvICppbmZvID0gc3VwcGx5X2luZm87CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YTsKKwlpbnQgcmV0ID0gMCwgaTsKKworCWluaXRfZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoIWluaXRfZGF0YSkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBmaW5kIHJlZ3VsYXRvciBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaHcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjUyNHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh3KSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGFsbG9jYXRlIHJlZ3VsYXRvciBwcml2YXRlIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaHcpOworCisJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IHRwczY1MjR4KSk7CisJaHctPmRldiA9IGRldjsKKwlody0+c3BpID0gc3BpX2Rldl9nZXQoc3BpKTsKKwltdXRleF9pbml0KCZody0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9SRUdVTEFUT1JTOyBpKyssIGluZm8rKywgaW5pdF9kYXRhKyspIHsKKwkJaHctPmRlc2NbaV0ubmFtZQk9IGluZm8tPm5hbWU7CisJCWh3LT5kZXNjW2ldLmlkCQk9IGk7CisJCWh3LT5kZXNjW2ldLm5fdm9sdGFnZXMJPSBpbmZvLT5uX3ZvbHRhZ2VzOworCQlody0+ZGVzY1tpXS5vcHMJCT0gJnJlZ3VsYXRvcl9vcHM7CisJCWh3LT5kZXNjW2ldLnR5cGUJPSBSRUdVTEFUT1JfVk9MVEFHRTsKKwkJaHctPmRlc2NbaV0ub3duZXIJPSBUSElTX01PRFVMRTsKKworCQlpZiAoaW5mby0+ZmxhZ3MgJiBGSVhFRF9WT0xUQUdFKQorCQkJaHctPmRlc2NbaV0ubl92b2x0YWdlcyA9IDE7CisKKwkJaHctPnJkZXZbaV0gPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmh3LT5kZXNjW2ldLCBkZXYsCisJCQkJCQkgaW5pdF9kYXRhLCBodyk7CisJCWlmIChJU19FUlIoaHctPnJkZXZbaV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGh3LT5yZGV2W2ldKTsKKwkJCWh3LT5yZGV2W2ldID0gTlVMTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXBtaWNfcmVtb3ZlKHNwaSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHBtaWNfZHJpdmVyID0geworCS5wcm9iZQkJPSBwbWljX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocG1pY19yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0cHM2NTI0eCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbWljX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnBtaWNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHBtaWNfZHJpdmVyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcG1pY19kcml2ZXJfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmcG1pY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocG1pY19kcml2ZXJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVFBTNjUyNFggUE1JQyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkN5cmlsIENoZW1wYXJhdGh5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInNwaTp0cHM2NTI0eCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU4NngtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYwppbmRleCA2ZDIwYjA0Li5iYjA0YTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTg2eC1yZWd1bGF0b3IuYwpAQCAtODUsNyArODUsOCBAQAogCiBzdGF0aWMgaW50IF9fdHBzNjU4NnhfbGRvX3NldF92b2x0YWdlKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCQkgICAgICBzdHJ1Y3QgdHBzNjU4NnhfcmVndWxhdG9yICpyaSwKLQkJCQkgICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICAgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCWludCB2YWwsIHVWOwogCXVpbnQ4X3QgbWFzazsKQEAgLTEwMCw2ICsxMDEsOCBAQAogCQkvKiB1c2UgdGhlIGZpcnN0IGluLXJhbmdlIHZhbHVlICovCiAJCWlmIChtaW5fdVYgPD0gdVYgJiYgdVYgPD0gbWF4X3VWKSB7CiAKKwkJCSpzZWxlY3RvciA9IHZhbDsKKwogCQkJdmFsIDw8PSByaS0+dm9sdF9zaGlmdDsKIAkJCW1hc2sgPSAoKDEgPDwgcmktPnZvbHRfbmJpdHMpIC0gMSkgPDwgcmktPnZvbHRfc2hpZnQ7CiAKQEAgLTExMSwxMiArMTE0LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgdHBzNjU4NnhfbGRvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IHRwczY1ODZ4X3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHRvX3RwczY1ODZ4X2RldihyZGV2KTsKIAotCXJldHVybiBfX3RwczY1ODZ4X2xkb19zZXRfdm9sdGFnZShwYXJlbnQsIHJpLCBtaW5fdVYsIG1heF91Vik7CisJcmV0dXJuIF9fdHBzNjU4NnhfbGRvX3NldF92b2x0YWdlKHBhcmVudCwgcmksIG1pbl91ViwgbWF4X3VWLAorCQkJCQkgIHNlbGVjdG9yKTsKIH0KIAogc3RhdGljIGludCB0cHM2NTg2eF9sZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCkBAIC0xNDAsMTMgKzE0NCwxNCBAQAogfQogCiBzdGF0aWMgaW50IHRwczY1ODZ4X2R2bV9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB0cHM2NTg2eF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSB0b190cHM2NTg2eF9kZXYocmRldik7CiAJaW50IHJldDsKIAotCXJldCA9IF9fdHBzNjU4NnhfbGRvX3NldF92b2x0YWdlKHBhcmVudCwgcmksIG1pbl91ViwgbWF4X3VWKTsKKwlyZXQgPSBfX3RwczY1ODZ4X2xkb19zZXRfdm9sdGFnZShwYXJlbnQsIHJpLCBtaW5fdVYsIG1heF91ViwKKwkJCQkJIHNlbGVjdG9yKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMKaW5kZXggYTU3MjYyYS4uYmQzMzJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3R3bC1yZWd1bGF0b3IuYwpAQCAtMzI5LDcgKzMyOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLXR3bDQwMzBsZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCit0d2w0MDMwbGRvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkgICAgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB0d2xyZWdfaW5mbwkqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50CQkJdnNlbDsKQEAgLTM0NSw5ICszNDYsMTEgQEAKIAkJLyogUkVWSVNJVCBmb3IgVkFVWDIsIGZpcnN0IG1hdGNoIG1heSBub3QgYmUgYmVzdC9sb3dlc3QgKi8KIAogCQkvKiB1c2UgdGhlIGZpcnN0IGluLXJhbmdlIHZhbHVlICovCi0JCWlmIChtaW5fdVYgPD0gdVYgJiYgdVYgPD0gbWF4X3VWKQorCQlpZiAobWluX3VWIDw9IHVWICYmIHVWIDw9IG1heF91VikgeworCQkJKnNlbGVjdG9yID0gdnNlbDsKIAkJCXJldHVybiB0d2xyZWdfd3JpdGUoaW5mbywgVFdMX01PRFVMRV9QTV9SRUNFSVZFUiwKIAkJCQkJCQlWUkVHX1ZPTFRBR0UsIHZzZWwpOworCQl9CiAJfQogCiAJcmV0dXJuIC1FRE9NOwpAQCAtMzg5LDcgKzM5Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLXR3bDYwMzBsZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCit0d2w2MDMwbGRvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkgICAgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB0d2xyZWdfaW5mbwkqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50CQkJdnNlbDsKQEAgLTQwMiw2ICs0MDYsNyBAQAogCSAqIG1WID0gMTAwMG12ICsgMTAwbXYgKiAodnNlbCAtIDEpCiAJICovCiAJdnNlbCA9IChtaW5fdVYvMTAwMCAtIDEwMDApLzEwMCArIDE7CisJKnNlbGVjdG9yID0gdnNlbDsKIAlyZXR1cm4gdHdscmVnX3dyaXRlKGluZm8sIFRXTF9NT0RVTEVfUE1fUkVDRUlWRVIsIFZSRUdfVk9MVEFHRSwgdnNlbCk7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCmluZGV4IGRiZmFmNTkuLjhiMGQyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwpAQCAtMzAyLDcgKzMwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2J1Y2t2X3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IHdtODMxeF9kY2RjICpkY2RjID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkY2RjLT53bTgzMXg7CkBAIC0zMTQsNiArMzE0LDggQEAKIAlpZiAodnNlbCA8IDApCiAJCXJldHVybiB2c2VsOwogCisJKnNlbGVjdG9yID0gdnNlbDsKKwogCS8qIElmIHRoaXMgdmFsdWUgaXMgYWxyZWFkeSBzZXQgdGhlbiBkbyBhIEdQSU8gdXBkYXRlIGlmIHdlIGNhbiAqLwogCWlmIChkY2RjLT5kdnNfZ3BpbyAmJiBkY2RjLT5vbl92c2VsID09IHZzZWwpCiAJCXJldHVybiB3bTgzMXhfYnVja3Zfc2V0X2R2cyhyZGV2LCAwKTsKQEAgLTM3NSwxNCArMzc3LDE0IEBACiAJcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIHJlZywgV004MzFYX0RDMV9TTFBfVlNFTF9NQVNLLCB2c2VsKTsKIH0KIAotc3RhdGljIGludCB3bTgzMXhfYnVja3ZfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODMxeF9idWNrdl9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IHdtODMxeF9kY2RjICpkY2RjID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAogCWlmIChkY2RjLT5kdnNfZ3BpbyAmJiBkY2RjLT5kdnNfZ3Bpb19zdGF0ZSkKLQkJcmV0dXJuIHdtODMxeF9idWNrdl9saXN0X3ZvbHRhZ2UocmRldiwgZGNkYy0+ZHZzX3ZzZWwpOworCQlyZXR1cm4gZGNkYy0+ZHZzX3ZzZWw7CiAJZWxzZQotCQlyZXR1cm4gd204MzF4X2J1Y2t2X2xpc3Rfdm9sdGFnZShyZGV2LCBkY2RjLT5vbl92c2VsKTsKKwkJcmV0dXJuIGRjZGMtPm9uX3ZzZWw7CiB9CiAKIC8qIEN1cnJlbnQgbGltaXQgb3B0aW9ucyAqLwpAQCAtNDI0LDcgKzQyNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzMXhfYnVja3Zfb3BzID0gewogCS5zZXRfdm9sdGFnZSA9IHdtODMxeF9idWNrdl9zZXRfdm9sdGFnZSwKLQkuZ2V0X3ZvbHRhZ2UgPSB3bTgzMXhfYnVja3ZfZ2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlX3NlbCA9IHdtODMxeF9idWNrdl9nZXRfdm9sdGFnZV9zZWwsCiAJLmxpc3Rfdm9sdGFnZSA9IHdtODMxeF9idWNrdl9saXN0X3ZvbHRhZ2UsCiAJLnNldF9zdXNwZW5kX3ZvbHRhZ2UgPSB3bTgzMXhfYnVja3Zfc2V0X3N1c3BlbmRfdm9sdGFnZSwKIAkuc2V0X2N1cnJlbnRfbGltaXQgPSB3bTgzMXhfYnVja3Zfc2V0X2N1cnJlbnRfbGltaXQsCkBAIC02MzYsNyArNjM4LDcgQEAKIH0KIAogc3RhdGljIGludCB3bTgzMXhfYnVja3Bfc2V0X3ZvbHRhZ2VfaW50KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgcmVnLAotCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQlpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCBpbnQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzMXhfZGNkYyAqZGNkYyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGNkYy0+d204MzF4OwpAQCAtNjUwLDE2ICs2NTIsMjAgQEAKIAlpZiAod204MzF4X2J1Y2twX2xpc3Rfdm9sdGFnZShyZGV2LCB2c2VsKSA+IG1heF91VikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqc2VsZWN0b3IgPSB2c2VsOworCiAJcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIHJlZywgV004MzFYX0RDM19PTl9WU0VMX01BU0ssIHZzZWwpOwogfQogCiBzdGF0aWMgaW50IHdtODMxeF9idWNrcF9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgICAgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCQkgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzMXhfZGNkYyAqZGNkYyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdTE2IHJlZyA9IGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19PTl9DT05GSUc7CiAKLQlyZXR1cm4gd204MzF4X2J1Y2twX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIG1pbl91ViwgbWF4X3VWKTsKKwlyZXR1cm4gd204MzF4X2J1Y2twX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIG1pbl91ViwgbWF4X3VWLAorCQkJCQkgICAgc2VsZWN0b3IpOwogfQogCiBzdGF0aWMgaW50IHdtODMxeF9idWNrcF9zZXRfc3VzcGVuZF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LApAQCAtNjY3LDExICs2NzMsMTIgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGMgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXUxNiByZWcgPSBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfU0xFRVBfQ09OVFJPTDsKKwl1bnNpZ25lZCBzZWxlY3RvcjsKIAotCXJldHVybiB3bTgzMXhfYnVja3Bfc2V0X3ZvbHRhZ2VfaW50KHJkZXYsIHJlZywgdVYsIHVWKTsKKwlyZXR1cm4gd204MzF4X2J1Y2twX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIHVWLCB1ViwgJnNlbGVjdG9yKTsKIH0KIAotc3RhdGljIGludCB3bTgzMXhfYnVja3BfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODMxeF9idWNrcF9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IHdtODMxeF9kY2RjICpkY2RjID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkY2RjLT53bTgzMXg7CkBAIC02ODIsMTIgKzY4OSwxMiBAQAogCWlmICh2YWwgPCAwKQogCQlyZXR1cm4gdmFsOwogCi0JcmV0dXJuIHdtODMxeF9idWNrcF9saXN0X3ZvbHRhZ2UocmRldiwgdmFsICYgV004MzFYX0RDM19PTl9WU0VMX01BU0spOworCXJldHVybiB2YWwgJiBXTTgzMVhfREMzX09OX1ZTRUxfTUFTSzsKIH0KIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHdtODMxeF9idWNrcF9vcHMgPSB7CiAJLnNldF92b2x0YWdlID0gd204MzF4X2J1Y2twX3NldF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IHdtODMxeF9idWNrcF9nZXRfdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gd204MzF4X2J1Y2twX2dldF92b2x0YWdlX3NlbCwKIAkubGlzdF92b2x0YWdlID0gd204MzF4X2J1Y2twX2xpc3Rfdm9sdGFnZSwKIAkuc2V0X3N1c3BlbmRfdm9sdGFnZSA9IHdtODMxeF9idWNrcF9zZXRfc3VzcGVuZF92b2x0YWdlLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKaW5kZXggOWVkZjhmNi4uYzk0ZmM1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYwpAQCAtMTEzLDcgKzExMyw4IEBACiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2dwX2xkb19zZXRfdm9sdGFnZV9pbnQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCByZWcsCi0JCQkJCSBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCQkgaW50IG1pbl91ViwgaW50IG1heF91ViwKKwkJCQkJIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBsZG8tPndtODMxeDsKQEAgLTEzMywxNiArMTM0LDIwIEBACiAJaWYgKHJldCA8IG1pbl91ViB8fCByZXQgPiBtYXhfdVYpCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gdnNlbDsKKwogCXJldHVybiB3bTgzMXhfc2V0X2JpdHMod204MzF4LCByZWcsIFdNODMxWF9MRE8xX09OX1ZTRUxfTUFTSywgdnNlbCk7CiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2dwX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCSAgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCWludCByZWcgPSBsZG8tPmJhc2UgKyBXTTgzMVhfTERPX09OX0NPTlRST0w7CiAKLQlyZXR1cm4gd204MzF4X2dwX2xkb19zZXRfdm9sdGFnZV9pbnQocmRldiwgcmVnLCBtaW5fdVYsIG1heF91Vik7CisJcmV0dXJuIHdtODMxeF9ncF9sZG9fc2V0X3ZvbHRhZ2VfaW50KHJkZXYsIHJlZywgbWluX3VWLCBtYXhfdVYsCisJCQkJCSAgICAgc2VsZWN0b3IpOwogfQogCiBzdGF0aWMgaW50IHdtODMxeF9ncF9sZG9fc2V0X3N1c3BlbmRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKQEAgLTE1MCwxMSArMTU1LDEyIEBACiB7CiAJc3RydWN0IHdtODMxeF9sZG8gKmxkbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50IHJlZyA9IGxkby0+YmFzZSArIFdNODMxWF9MRE9fU0xFRVBfQ09OVFJPTDsKKwl1bnNpZ25lZCBpbnQgc2VsZWN0b3I7CiAKLQlyZXR1cm4gd204MzF4X2dwX2xkb19zZXRfdm9sdGFnZV9pbnQocmRldiwgcmVnLCB1ViwgdVYpOworCXJldHVybiB3bTgzMXhfZ3BfbGRvX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIHVWLCB1ViwgJnNlbGVjdG9yKTsKIH0KIAotc3RhdGljIGludCB3bTgzMXhfZ3BfbGRvX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQorc3RhdGljIGludCB3bTgzMXhfZ3BfbGRvX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBsZG8tPndtODMxeDsKQEAgLTE2Nyw3ICsxNzMsNyBAQAogCiAJcmV0ICY9IFdNODMxWF9MRE8xX09OX1ZTRUxfTUFTSzsKIAotCXJldHVybiB3bTgzMXhfZ3BfbGRvX2xpc3Rfdm9sdGFnZShyZGV2LCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgd204MzF4X2dwX2xkb19nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKQEAgLTI4Nyw3ICsyOTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgd204MzF4X2dwX2xkb19vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZSA9IHdtODMxeF9ncF9sZG9fbGlzdF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IHdtODMxeF9ncF9sZG9fZ2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlX3NlbCA9IHdtODMxeF9ncF9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAogCS5zZXRfdm9sdGFnZSA9IHdtODMxeF9ncF9sZG9fc2V0X3ZvbHRhZ2UsCiAJLnNldF9zdXNwZW5kX3ZvbHRhZ2UgPSB3bTgzMXhfZ3BfbGRvX3NldF9zdXNwZW5kX3ZvbHRhZ2UsCiAJLmdldF9tb2RlID0gd204MzF4X2dwX2xkb19nZXRfbW9kZSwKQEAgLTQxMyw3ICs0MTksOCBAQAogfQogCiBzdGF0aWMgaW50IHdtODMxeF9hbGRvX3NldF92b2x0YWdlX2ludChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IHJlZywKLQkJCQkJIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICAgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJICAgICAgIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBsZG8tPndtODMxeDsKQEAgLTQzMywxNiArNDQwLDE5IEBACiAJaWYgKHJldCA8IG1pbl91ViB8fCByZXQgPiBtYXhfdVYpCiAJCXJldHVybiAtRUlOVkFMOwogCisJKnNlbGVjdG9yID0gdnNlbDsKKwogCXJldHVybiB3bTgzMXhfc2V0X2JpdHMod204MzF4LCByZWcsIFdNODMxWF9MRE83X09OX1ZTRUxfTUFTSywgdnNlbCk7CiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2FsZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlpbnQgcmVnID0gbGRvLT5iYXNlICsgV004MzFYX0xET19PTl9DT05UUk9MOwogCi0JcmV0dXJuIHdtODMxeF9hbGRvX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIG1pbl91ViwgbWF4X3VWKTsKKwlyZXR1cm4gd204MzF4X2FsZG9fc2V0X3ZvbHRhZ2VfaW50KHJkZXYsIHJlZywgbWluX3VWLCBtYXhfdVYsCisJCQkJCSAgIHNlbGVjdG9yKTsKIH0KIAogc3RhdGljIGludCB3bTgzMXhfYWxkb19zZXRfc3VzcGVuZF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LApAQCAtNDUwLDExICs0NjAsMTIgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlpbnQgcmVnID0gbGRvLT5iYXNlICsgV004MzFYX0xET19TTEVFUF9DT05UUk9MOworCXVuc2lnbmVkIGludCBzZWxlY3RvcjsKIAotCXJldHVybiB3bTgzMXhfYWxkb19zZXRfdm9sdGFnZV9pbnQocmRldiwgcmVnLCB1ViwgdVYpOworCXJldHVybiB3bTgzMXhfYWxkb19zZXRfdm9sdGFnZV9pbnQocmRldiwgcmVnLCB1ViwgdVYsICZzZWxlY3Rvcik7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X2FsZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODMxeF9hbGRvX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBsZG8tPndtODMxeDsKQEAgLTQ2Nyw3ICs0NzgsNyBAQAogCiAJcmV0ICY9IFdNODMxWF9MRE83X09OX1ZTRUxfTUFTSzsKIAotCXJldHVybiB3bTgzMXhfYWxkb19saXN0X3ZvbHRhZ2UocmRldiwgcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHdtODMxeF9hbGRvX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQpAQCAtNTQ4LDcgKzU1OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzMXhfYWxkb19vcHMgPSB7CiAJLmxpc3Rfdm9sdGFnZSA9IHdtODMxeF9hbGRvX2xpc3Rfdm9sdGFnZSwKLQkuZ2V0X3ZvbHRhZ2UgPSB3bTgzMXhfYWxkb19nZXRfdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gd204MzF4X2FsZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAogCS5zZXRfdm9sdGFnZSA9IHdtODMxeF9hbGRvX3NldF92b2x0YWdlLAogCS5zZXRfc3VzcGVuZF92b2x0YWdlID0gd204MzF4X2FsZG9fc2V0X3N1c3BlbmRfdm9sdGFnZSwKIAkuZ2V0X21vZGUgPSB3bTgzMXhfYWxkb19nZXRfbW9kZSwKQEAgLTY2Niw3ICs2NzcsOCBAQAogCiBzdGF0aWMgaW50IHdtODMxeF9hbGl2ZV9sZG9fc2V0X3ZvbHRhZ2VfaW50KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCQkgICAgaW50IHJlZywKLQkJCQkJICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJCSAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJCQkgICAgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGxkby0+d204MzF4OwpAQCAtNjgwLDE2ICs2OTIsMjAgQEAKIAlpZiAocmV0IDwgbWluX3VWIHx8IHJldCA+IG1heF91VikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqc2VsZWN0b3IgPSB2c2VsOworCiAJcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIHJlZywgV004MzFYX0xETzExX09OX1ZTRUxfTUFTSywgdnNlbCk7CiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2FsaXZlX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYsCisJCQkJCXVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlpbnQgcmVnID0gbGRvLT5iYXNlICsgV004MzFYX0FMSVZFX0xET19PTl9DT05UUk9MOwogCi0JcmV0dXJuIHdtODMxeF9hbGl2ZV9sZG9fc2V0X3ZvbHRhZ2VfaW50KHJkZXYsIHJlZywgbWluX3VWLCBtYXhfdVYpOworCXJldHVybiB3bTgzMXhfYWxpdmVfbGRvX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIG1pbl91ViwgbWF4X3VWLAorCQkJCQkJc2VsZWN0b3IpOwogfQogCiBzdGF0aWMgaW50IHdtODMxeF9hbGl2ZV9sZG9fc2V0X3N1c3BlbmRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKQEAgLTY5NywxMSArNzEzLDEyIEBACiB7CiAJc3RydWN0IHdtODMxeF9sZG8gKmxkbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50IHJlZyA9IGxkby0+YmFzZSArIFdNODMxWF9BTElWRV9MRE9fU0xFRVBfQ09OVFJPTDsKKwl1bnNpZ25lZCBzZWxlY3RvcjsKIAotCXJldHVybiB3bTgzMXhfYWxpdmVfbGRvX3NldF92b2x0YWdlX2ludChyZGV2LCByZWcsIHVWLCB1Vik7CisJcmV0dXJuIHdtODMxeF9hbGl2ZV9sZG9fc2V0X3ZvbHRhZ2VfaW50KHJkZXYsIHJlZywgdVYsIHVWLCAmc2VsZWN0b3IpOwogfQogCi1zdGF0aWMgaW50IHdtODMxeF9hbGl2ZV9sZG9fZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODMxeF9hbGl2ZV9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGxkby0+d204MzF4OwpAQCAtNzE0LDcgKzczMSw3IEBACiAKIAlyZXQgJj0gV004MzFYX0xETzExX09OX1ZTRUxfTUFTSzsKIAotCXJldHVybiB3bTgzMXhfYWxpdmVfbGRvX2xpc3Rfdm9sdGFnZShyZGV2LCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgd204MzF4X2FsaXZlX2xkb19nZXRfc3RhdHVzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQpAQCAtNzM2LDcgKzc1Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzMXhfYWxpdmVfbGRvX29wcyA9IHsKIAkubGlzdF92b2x0YWdlID0gd204MzF4X2FsaXZlX2xkb19saXN0X3ZvbHRhZ2UsCi0JLmdldF92b2x0YWdlID0gd204MzF4X2FsaXZlX2xkb19nZXRfdm9sdGFnZSwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gd204MzF4X2FsaXZlX2xkb19nZXRfdm9sdGFnZV9zZWwsCiAJLnNldF92b2x0YWdlID0gd204MzF4X2FsaXZlX2xkb19zZXRfdm9sdGFnZSwKIAkuc2V0X3N1c3BlbmRfdm9sdGFnZSA9IHdtODMxeF9hbGl2ZV9sZG9fc2V0X3N1c3BlbmRfdm9sdGFnZSwKIAkuZ2V0X3N0YXR1cyA9IHdtODMxeF9hbGl2ZV9sZG9fZ2V0X3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwppbmRleCBmZTRiOGE4Li4xYmNiMjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9pc2lua19zZXRfZmxhc2gpOwogCiBzdGF0aWMgaW50IHdtODM1MF9kY2RjX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbWluX3VWLAotCWludCBtYXhfdVYpCisJCQkJICAgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50IHZvbHRfcmVnLCBkY2RjID0gcmRldl9nZXRfaWQocmRldiksIG1WLApAQCAtMzk3LDE3ICszOTcsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJKnNlbGVjdG9yID0gbVY7CisKIAkvKiBhbGwgRENEQ3MgaGF2ZSBzYW1lIG1WIGJpdHMgKi8KIAl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCB2b2x0X3JlZykgJiB+V004MzUwX0RDMV9WU0VMX01BU0s7CiAJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIHZvbHRfcmVnLCB2YWwgfCBtVik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd204MzUwX2RjZGNfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODM1MF9kY2RjX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCWludCB2b2x0X3JlZywgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpOwotCXUxNiB2YWw7CiAKIAlzd2l0Y2ggKGRjZGMpIHsKIAljYXNlIFdNODM1MF9EQ0RDXzE6CkBAIC00MjksOCArNDMwLDcgQEAKIAl9CiAKIAkvKiBhbGwgRENEQ3MgaGF2ZSBzYW1lIG1WIGJpdHMgKi8KLQl2YWwgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCB2b2x0X3JlZykgJiBXTTgzNTBfREMxX1ZTRUxfTUFTSzsKLQlyZXR1cm4gd204MzUwX2RjZGNfdmFsX3RvX212b2x0cyh2YWwpICogMTAwMDsKKwlyZXR1cm4gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgV004MzUwX0RDMV9WU0VMX01BU0s7CiB9CiAKIHN0YXRpYyBpbnQgd204MzUwX2RjZGNfbGlzdF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LApAQCAtNzU0LDcgKzc1NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgd204MzUwX2xkb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1pbl91ViwKLQlpbnQgbWF4X3VWKQorCQkJCSAgaW50IG1heF91ViwgdW5zaWduZWQgKnNlbGVjdG9yKQogewogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50IHZvbHRfcmVnLCBsZG8gPSByZGV2X2dldF9pZChyZGV2KSwgbVYsIG1pbl9tViA9IG1pbl91ViAvIDEwMDAsCkBAIC03OTcsMTcgKzc5NywxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkqc2VsZWN0b3IgPSBtVjsKKwogCS8qIGFsbCBMRE9zIGhhdmUgc2FtZSBtViBiaXRzICovCiAJdmFsID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgdm9sdF9yZWcpICYgfldNODM1MF9MRE8xX1ZTRUxfTUFTSzsKIAl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgdm9sdF9yZWcsIHZhbCB8IG1WKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTgzNTBfbGRvX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQorc3RhdGljIGludCB3bTgzNTBfbGRvX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCWludCB2b2x0X3JlZywgbGRvID0gcmRldl9nZXRfaWQocmRldik7Ci0JdTE2IHZhbDsKIAogCXN3aXRjaCAobGRvKSB7CiAJY2FzZSBXTTgzNTBfTERPXzE6CkBAIC04MjcsOCArODI4LDcgQEAKIAl9CiAKIAkvKiBhbGwgTERPcyBoYXZlIHNhbWUgbVYgYml0cyAqLwotCXZhbCA9IHdtODM1MF9yZWdfcmVhZCh3bTgzNTAsIHZvbHRfcmVnKSAmIFdNODM1MF9MRE8xX1ZTRUxfTUFTSzsKLQlyZXR1cm4gd204MzUwX2xkb192YWxfdG9fbXZvbHRzKHZhbCkgKiAxMDAwOworCXJldHVybiB3bTgzNTBfcmVnX3JlYWQod204MzUwLCB2b2x0X3JlZykgJiBXTTgzNTBfTERPMV9WU0VMX01BU0s7CiB9CiAKIHN0YXRpYyBpbnQgd204MzUwX2xkb19saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCkBAIC0xMjI1LDcgKzEyMjUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgd204MzUwX2RjZGNfb3BzID0gewogCS5zZXRfdm9sdGFnZSA9IHdtODM1MF9kY2RjX3NldF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IHdtODM1MF9kY2RjX2dldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZV9zZWwgPSB3bTgzNTBfZGNkY19nZXRfdm9sdGFnZV9zZWwsCiAJLmxpc3Rfdm9sdGFnZSA9IHdtODM1MF9kY2RjX2xpc3Rfdm9sdGFnZSwKIAkuZW5hYmxlID0gd204MzUwX2RjZGNfZW5hYmxlLAogCS5kaXNhYmxlID0gd204MzUwX2RjZGNfZGlzYWJsZSwKQEAgLTEyNDksNyArMTI0OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB3bTgzNTBfbGRvX29wcyA9IHsKIAkuc2V0X3ZvbHRhZ2UgPSB3bTgzNTBfbGRvX3NldF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IHdtODM1MF9sZG9fZ2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlX3NlbCA9IHdtODM1MF9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAogCS5saXN0X3ZvbHRhZ2UgPSB3bTgzNTBfbGRvX2xpc3Rfdm9sdGFnZSwKIAkuZW5hYmxlID0gd204MzUwX2xkb19lbmFibGUsCiAJLmRpc2FibGUgPSB3bTgzNTBfbGRvX2Rpc2FibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMKaW5kZXggOTI0YzdlYi4uYjQyZDAxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODQwMC1yZWd1bGF0b3IuYwpAQCAtNjcsNyArNjcsNyBAQAogfQogCiBzdGF0aWMgaW50IHdtODQwMF9sZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKLQkJCQkgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCisJCQkJICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqc2VsZWN0b3IpCiB7CiAJc3RydWN0IHdtODQwMCAqd204NDAwID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXUxNiB2YWw7CkBAIC05Myw2ICs5Myw4IEBACiAJCXZhbCArPSAweGY7CiAJfQogCisJKnNlbGVjdG9yID0gdmFsOworCiAJcmV0dXJuIHdtODQwMF9zZXRfYml0cyh3bTg0MDAsIFdNODQwMF9MRE8xX0NPTlRST0wgKyByZGV2X2dldF9pZChkZXYpLAogCQkJICAgICAgIFdNODQwMF9MRE8xX1ZTRUxfTUFTSywgdmFsKTsKIH0KQEAgLTE1Niw3ICsxNTgsNyBAQAogfQogCiBzdGF0aWMgaW50IHdtODQwMF9kY2RjX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCi0JCQkJICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgd204NDAwICp3bTg0MDAgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdTE2IHZhbDsKQEAgLTE3MSw2ICsxNzMsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlCVUdfT04oODUwMDAwICsgKDI1MDAwICogdmFsKSA8IG1pbl91Vik7CiAKKwkqc2VsZWN0b3IgPSB2YWw7CisKIAlyZXR1cm4gd204NDAwX3NldF9iaXRzKHdtODQwMCwgV004NDAwX0RDREMxX0NPTlRST0xfMSArIG9mZnNldCwKIAkJCSAgICAgICBXTTg0MDBfREMxX1ZTRUxfTUFTSywgdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwppbmRleCAwMzcxM2JjLi4zNWIyOTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCkBAIC04Niw3ICs4Niw3IEBACiAJcmV0dXJuIChzZWxlY3RvciAqIDEwMDAwMCkgKyAyNDAwMDAwOwogfQogCi1zdGF0aWMgaW50IHdtODk5NF9sZG8xX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQorc3RhdGljIGludCB3bTg5OTRfbGRvMV9nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJc3RydWN0IHdtODk5NF9sZG8gKmxkbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJaW50IHZhbDsKQEAgLTk1LDEzICs5NSwxMSBAQAogCWlmICh2YWwgPCAwKQogCQlyZXR1cm4gdmFsOwogCi0JdmFsID0gKHZhbCAmIFdNODk5NF9MRE8xX1ZTRUxfTUFTSykgPj4gV004OTk0X0xETzFfVlNFTF9TSElGVDsKLQotCXJldHVybiB3bTg5OTRfbGRvMV9saXN0X3ZvbHRhZ2UocmRldiwgdmFsKTsKKwlyZXR1cm4gKHZhbCAmIFdNODk5NF9MRE8xX1ZTRUxfTUFTSykgPj4gV004OTk0X0xETzFfVlNFTF9TSElGVDsKIH0KIAogc3RhdGljIGludCB3bTg5OTRfbGRvMV9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKQorCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYsIHVuc2lnbmVkICpzKQogewogCXN0cnVjdCB3bTg5OTRfbGRvICpsZG8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCWludCBzZWxlY3RvciwgdjsKQEAgLTExMSw2ICsxMDksNyBAQAogCWlmICh2IDwgMCB8fCB2ID4gbWF4X3VWKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCSpzID0gc2VsZWN0b3I7CiAJc2VsZWN0b3IgPDw9IFdNODk5NF9MRE8xX1ZTRUxfU0hJRlQ7CiAKIAlyZXR1cm4gd204OTk0X3NldF9iaXRzKGxkby0+d204OTk0LCBXTTg5OTRfTERPXzEsCkBAIC0xMjQsMjAgKzEyMywyOSBAQAogCS5lbmFibGVfdGltZSA9IHdtODk5NF9sZG9fZW5hYmxlX3RpbWUsCiAKIAkubGlzdF92b2x0YWdlID0gd204OTk0X2xkbzFfbGlzdF92b2x0YWdlLAotCS5nZXRfdm9sdGFnZSA9IHdtODk5NF9sZG8xX2dldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZV9zZWwgPSB3bTg5OTRfbGRvMV9nZXRfdm9sdGFnZV9zZWwsCiAJLnNldF92b2x0YWdlID0gd204OTk0X2xkbzFfc2V0X3ZvbHRhZ2UsCiB9OwogCiBzdGF0aWMgaW50IHdtODk5NF9sZG8yX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNlbGVjdG9yKQogeworCXN0cnVjdCB3bTg5OTRfbGRvICpsZG8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCiAJaWYgKHNlbGVjdG9yID4gV004OTk0X0xETzJfTUFYX1NFTEVDVE9SKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiAoc2VsZWN0b3IgKiAxMDAwMDApICsgOTAwMDAwOworCXN3aXRjaCAobGRvLT53bTg5OTQtPnR5cGUpIHsKKwljYXNlIFdNODk5NDoKKwkJcmV0dXJuIChzZWxlY3RvciAqIDEwMDAwMCkgKyA5MDAwMDA7CisJY2FzZSBXTTg5NTg6CisJCXJldHVybiAoc2VsZWN0b3IgKiAxMDAwMDApICsgMTAwMDAwMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiB9CiAKLXN0YXRpYyBpbnQgd204OTk0X2xkbzJfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCitzdGF0aWMgaW50IHdtODk5NF9sZG8yX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3Qgd204OTk0X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlpbnQgdmFsOwpAQCAtMTQ2LDIyICsxNTQsMzEgQEAKIAlpZiAodmFsIDwgMCkKIAkJcmV0dXJuIHZhbDsKIAotCXZhbCA9ICh2YWwgJiBXTTg5OTRfTERPMl9WU0VMX01BU0spID4+IFdNODk5NF9MRE8yX1ZTRUxfU0hJRlQ7Ci0KLQlyZXR1cm4gd204OTk0X2xkbzJfbGlzdF92b2x0YWdlKHJkZXYsIHZhbCk7CisJcmV0dXJuICh2YWwgJiBXTTg5OTRfTERPMl9WU0VMX01BU0spID4+IFdNODk5NF9MRE8yX1ZTRUxfU0hJRlQ7CiB9CiAKIHN0YXRpYyBpbnQgd204OTk0X2xkbzJfc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJICAgaW50IG1pbl91ViwgaW50IG1heF91VikKKwkJCQkgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLCB1bnNpZ25lZCAqcykKIHsKIAlzdHJ1Y3Qgd204OTk0X2xkbyAqbGRvID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAlpbnQgc2VsZWN0b3IsIHY7CiAKLQlzZWxlY3RvciA9IChtaW5fdVYgLSA5MDAwMDApIC8gMTAwMDAwOworCXN3aXRjaCAobGRvLT53bTg5OTQtPnR5cGUpIHsKKwljYXNlIFdNODk5NDoKKwkJc2VsZWN0b3IgPSAobWluX3VWIC0gOTAwMDAwKSAvIDEwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBXTTg5NTg6CisJCXNlbGVjdG9yID0gKG1pbl91ViAtIDEwMDAwMDApIC8gMTAwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAl2ID0gd204OTk0X2xkbzJfbGlzdF92b2x0YWdlKHJkZXYsIHNlbGVjdG9yKTsKIAlpZiAodiA8IDAgfHwgdiA+IG1heF91VikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkqcyA9IHNlbGVjdG9yOwogCXNlbGVjdG9yIDw8PSBXTTg5OTRfTERPMl9WU0VMX1NISUZUOwogCiAJcmV0dXJuIHdtODk5NF9zZXRfYml0cyhsZG8tPndtODk5NCwgV004OTk0X0xET18yLApAQCAtMTc1LDcgKzE5Miw3IEBACiAJLmVuYWJsZV90aW1lID0gd204OTk0X2xkb19lbmFibGVfdGltZSwKIAogCS5saXN0X3ZvbHRhZ2UgPSB3bTg5OTRfbGRvMl9saXN0X3ZvbHRhZ2UsCi0JLmdldF92b2x0YWdlID0gd204OTk0X2xkbzJfZ2V0X3ZvbHRhZ2UsCisJLmdldF92b2x0YWdlX3NlbCA9IHdtODk5NF9sZG8yX2dldF92b2x0YWdlX3NlbCwKIAkuc2V0X3ZvbHRhZ2UgPSB3bTg5OTRfbGRvMl9zZXRfdm9sdGFnZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IGU2NTM5Y2IuLjk1ODNjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCiAKQEAgLTE1Miw2ICsxNTMsMTggQEAKIAlzcGluX2xvY2tfaW5pdCgmcnRjLT5pcnFfdGFza19sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGMtPmlycV9xdWV1ZSk7CiAKKwkvKiBJbml0IHRpbWVycXVldWUgKi8KKwl0aW1lcnF1ZXVlX2luaXRfaGVhZCgmcnRjLT50aW1lcnF1ZXVlKTsKKwlJTklUX1dPUksoJnJ0Yy0+aXJxd29yaywgcnRjX3RpbWVyX2RvX3dvcmspOworCS8qIEluaXQgYWllIHRpbWVyICovCisJcnRjX3RpbWVyX2luaXQoJnJ0Yy0+YWllX3RpbWVyLCBydGNfYWllX3VwZGF0ZV9pcnEsICh2b2lkICopcnRjKTsKKwkvKiBJbml0IHVpZSB0aW1lciAqLworCXJ0Y190aW1lcl9pbml0KCZydGMtPnVpZV9ydGN0aW1lciwgcnRjX3VpZV91cGRhdGVfaXJxLCAodm9pZCAqKXJ0Yyk7CisJLyogSW5pdCBwaWUgdGltZXIgKi8KKwlocnRpbWVyX2luaXQoJnJ0Yy0+cGllX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCXJ0Yy0+cGllX3RpbWVyLmZ1bmN0aW9uID0gcnRjX3BpZV91cGRhdGVfaXJxOworCXJ0Yy0+cGllX2VuYWJsZWQgPSAwOworCiAJc3RybGNweShydGMtPm5hbWUsIG5hbWUsIFJUQ19ERVZJQ0VfTkFNRV9TSVpFKTsKIAlkZXZfc2V0X25hbWUoJnJ0Yy0+ZGV2LCAicnRjJWQiLCBpZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKaW5kZXggYTBjODE2Mi4uOTAzODRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMKQEAgLTE0LDYgKzE0LDIxIEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyBpbnQgX19ydGNfcmVhZF90aW1lKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaW50IGVycjsKKwlpZiAoIXJ0Yy0+b3BzKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKCFydGMtPm9wcy0+cmVhZF90aW1lKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UgeworCQltZW1zZXQodG0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKKwkJZXJyID0gcnRjLT5vcHMtPnJlYWRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKKwl9CisJcmV0dXJuIGVycjsKK30KIAogaW50IHJ0Y19yZWFkX3RpbWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKQEAgLTIzLDE1ICszOCw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICghcnRjLT5vcHMpCi0JCWVyciA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoIXJ0Yy0+b3BzLT5yZWFkX3RpbWUpCi0JCWVyciA9IC1FSU5WQUw7Ci0JZWxzZSB7Ci0JCW1lbXNldCh0bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOwotCQllcnIgPSBydGMtPm9wcy0+cmVhZF90aW1lKHJ0Yy0+ZGV2LnBhcmVudCwgdG0pOwotCX0KLQorCWVyciA9IF9fcnRjX3JlYWRfdGltZShydGMsIHRtKTsKIAltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwogCXJldHVybiBlcnI7CiB9CkBAIC0xMDYsMTg5ICsxMTMsNTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19zZXRfbW1zcyk7CiAKLXN0YXRpYyBpbnQgcnRjX3JlYWRfYWxhcm1faW50ZXJuYWwoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoraW50IHJ0Y19yZWFkX2FsYXJtKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKIHsKIAlpbnQgZXJyOwogCiAJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCi0JaWYgKHJ0Yy0+b3BzID09IE5VTEwpCi0JCWVyciA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoIXJ0Yy0+b3BzLT5yZWFkX2FsYXJtKQotCQllcnIgPSAtRUlOVkFMOwotCWVsc2UgewotCQltZW1zZXQoYWxhcm0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3drYWxybSkpOwotCQllcnIgPSBydGMtPm9wcy0+cmVhZF9hbGFybShydGMtPmRldi5wYXJlbnQsIGFsYXJtKTsKLQl9Ci0KKwlhbGFybS0+ZW5hYmxlZCA9IHJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQ7CisJaWYgKGFsYXJtLT5lbmFibGVkKQorCQlhbGFybS0+dGltZSA9IHJ0Y19rdGltZV90b190bShydGMtPmFpZV90aW1lci5ub2RlLmV4cGlyZXMpOwogCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KIAotaW50IHJ0Y19yZWFkX2FsYXJtKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBydGNfdGltZSBiZWZvcmUsIG5vdzsKLQlpbnQgZmlyc3RfdGltZSA9IDE7Ci0JdW5zaWduZWQgbG9uZyB0X25vdywgdF9hbG07Ci0JZW51bSB7IG5vbmUsIGRheSwgbW9udGgsIHllYXIgfSBtaXNzaW5nID0gbm9uZTsKLQl1bnNpZ25lZCBkYXlzOwotCi0JLyogVGhlIGxvd2VyIGxldmVsIFJUQyBkcml2ZXIgbWF5IHJldHVybiAtMSBpbiBzb21lIGZpZWxkcywKLQkgKiBjcmVhdGluZyBpbnZhbGlkIGFsYXJtLT50aW1lIHZhbHVlcywgZm9yIHJlYXNvbnMgbGlrZToKLQkgKgotCSAqICAgLSBUaGUgaGFyZHdhcmUgbWF5IG5vdCBiZSBjYXBhYmxlIG9mIGZpbGxpbmcgdGhlbSBpbjsKLQkgKiAgICAgbWFueSBhbGFybXMgbWF0Y2ggb25seSBvbiB0aW1lLW9mLWRheSBmaWVsZHMsIG5vdAotCSAqICAgICBkYXkvbW9udGgveWVhciBjYWxlbmRhciBkYXRhLgotCSAqCi0JICogICAtIFNvbWUgaGFyZHdhcmUgdXNlcyBpbGxlZ2FsIHZhbHVlcyBhcyAid2lsZGNhcmQiIG1hdGNoCi0JICogICAgIHZhbHVlcywgd2hpY2ggbm9uLUxpbnV4IGZpcm13YXJlIChsaWtlIGEgQklPUykgbWF5IHRyeQotCSAqICAgICB0byBzZXQgdXAgYXMgZS5nLiAiYWxhcm0gMTUgbWludXRlcyBhZnRlciBlYWNoIGhvdXIiLgotCSAqICAgICBMaW51eCB1c2VzIG9ubHkgb25lc2hvdCBhbGFybXMuCi0JICoKLQkgKiBXaGVuIHdlIHNlZSB0aGF0IGhlcmUsIHdlIGRlYWwgd2l0aCBpdCBieSB1c2luZyB2YWx1ZXMgZnJvbQotCSAqIGEgY3VycmVudCBSVEMgdGltZXN0YW1wIGZvciBhbnkgbWlzc2luZyAoLTEpIHZhbHVlcy4gIFRoZQotCSAqIFJUQyBkcml2ZXIgcHJldmVudHMgInBlcmlvZGljIGFsYXJtIiBtb2Rlcy4KLQkgKgotCSAqIEJ1dCB0aGlzIGNhbiBiZSByYWNleSwgYmVjYXVzZSBzb21lIGZpZWxkcyBvZiB0aGUgUlRDIHRpbWVzdGFtcAotCSAqIG1heSBoYXZlIHdyYXBwZWQgaW4gdGhlIGludGVydmFsIHNpbmNlIHdlIHJlYWQgdGhlIFJUQyBhbGFybSwKLQkgKiB3aGljaCB3b3VsZCBsZWFkIHRvIHVzIGluc2VydGluZyBpbmNvbnNpc3RlbnQgdmFsdWVzIGluIHBsYWNlCi0JICogb2YgdGhlIC0xIGZpZWxkcy4KLQkgKgotCSAqIFJlYWRpbmcgdGhlIGFsYXJtIGFuZCB0aW1lc3RhbXAgaW4gdGhlIHJldmVyc2Ugc2VxdWVuY2UKLQkgKiB3b3VsZCBoYXZlIHRoZSBzYW1lIHJhY2UgY29uZGl0aW9uLCBhbmQgbm90IHNvbHZlIHRoZSBpc3N1ZS4KLQkgKgotCSAqIFNvLCB3ZSBtdXN0IGZpcnN0IHJlYWQgdGhlIFJUQyB0aW1lc3RhbXAsCi0JICogdGhlbiByZWFkIHRoZSBSVEMgYWxhcm0gdmFsdWUsCi0JICogYW5kIHRoZW4gcmVhZCBhIHNlY29uZCBSVEMgdGltZXN0YW1wLgotCSAqCi0JICogSWYgYW55IGZpZWxkcyBvZiB0aGUgc2Vjb25kIHRpbWVzdGFtcCBoYXZlIGNoYW5nZWQKLQkgKiB3aGVuIGNvbXBhcmVkIHdpdGggdGhlIGZpcnN0IHRpbWVzdGFtcCwgdGhlbiB3ZSBrbm93Ci0JICogb3VyIHRpbWVzdGFtcCBtYXkgYmUgaW5jb25zaXN0ZW50IHdpdGggdGhhdCB1c2VkIGJ5Ci0JICogdGhlIGxvdy1sZXZlbCBydGNfcmVhZF9hbGFybV9pbnRlcm5hbCgpIGZ1bmN0aW9uLgotCSAqCi0JICogU28sIHdoZW4gdGhlIHR3byB0aW1lc3RhbXBzIGRpc2FncmVlLCB3ZSBqdXN0IGxvb3AgYW5kIGRvCi0JICogdGhlIHByb2Nlc3MgYWdhaW4gdG8gZ2V0IGEgZnVsbHkgY29uc2lzdGVudCBzZXQgb2YgdmFsdWVzLgotCSAqCi0JICogVGhpcyBjb3VsZCBhbGwgaW5zdGVhZCBiZSBkb25lIGluIHRoZSBsb3dlciBsZXZlbCBkcml2ZXIsCi0JICogYnV0IHNpbmNlIG1vcmUgdGhhbiBvbmUgbG93ZXIgbGV2ZWwgUlRDIGltcGxlbWVudGF0aW9uIG5lZWRzIGl0LAotCSAqIHRoZW4gaXQncyBwcm9iYWJseSBiZXN0IGJlc3QgdG8gZG8gaXQgaGVyZSBpbnN0ZWFkIG9mIHRoZXJlLi4KLQkgKi8KLQotCS8qIEdldCB0aGUgImJlZm9yZSIgdGltZXN0YW1wICovCi0JZXJyID0gcnRjX3JlYWRfdGltZShydGMsICZiZWZvcmUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWRvIHsKLQkJaWYgKCFmaXJzdF90aW1lKQotCQkJbWVtY3B5KCZiZWZvcmUsICZub3csIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKLQkJZmlyc3RfdGltZSA9IDA7Ci0KLQkJLyogZ2V0IHRoZSBSVEMgYWxhcm0gdmFsdWVzLCB3aGljaCBtYXkgYmUgaW5jb21wbGV0ZSAqLwotCQllcnIgPSBydGNfcmVhZF9hbGFybV9pbnRlcm5hbChydGMsIGFsYXJtKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWlmICghYWxhcm0tPmVuYWJsZWQpCi0JCQlyZXR1cm4gMDsKLQotCQkvKiBmdWxsLWZ1bmN0aW9uIFJUQ3Mgd29uJ3QgaGF2ZSBzdWNoIG1pc3NpbmcgZmllbGRzICovCi0JCWlmIChydGNfdmFsaWRfdG0oJmFsYXJtLT50aW1lKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogZ2V0IHRoZSAiYWZ0ZXIiIHRpbWVzdGFtcCwgdG8gZGV0ZWN0IHdyYXBwZWQgZmllbGRzICovCi0JCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmbm93KTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCi0JCS8qIG5vdGUgdGhhdCB0bV9zZWMgaXMgYSAiZG9uJ3QgY2FyZSIgdmFsdWUgaGVyZTogKi8KLQl9IHdoaWxlICggICBiZWZvcmUudG1fbWluICAgIT0gbm93LnRtX21pbgotCQkgfHwgYmVmb3JlLnRtX2hvdXIgICE9IG5vdy50bV9ob3VyCi0JCSB8fCBiZWZvcmUudG1fbW9uICAgIT0gbm93LnRtX21vbgotCQkgfHwgYmVmb3JlLnRtX3llYXIgICE9IG5vdy50bV95ZWFyKTsKLQotCS8qIEZpbGwgaW4gdGhlIG1pc3NpbmcgYWxhcm0gZmllbGRzIHVzaW5nIHRoZSB0aW1lc3RhbXA7IHdlCi0JICoga25vdyB0aGVyZSdzIGF0IGxlYXN0IG9uZSBzaW5jZSBhbGFybS0+dGltZSBpcyBpbnZhbGlkLgotCSAqLwotCWlmIChhbGFybS0+dGltZS50bV9zZWMgPT0gLTEpCi0JCWFsYXJtLT50aW1lLnRtX3NlYyA9IG5vdy50bV9zZWM7Ci0JaWYgKGFsYXJtLT50aW1lLnRtX21pbiA9PSAtMSkKLQkJYWxhcm0tPnRpbWUudG1fbWluID0gbm93LnRtX21pbjsKLQlpZiAoYWxhcm0tPnRpbWUudG1faG91ciA9PSAtMSkKLQkJYWxhcm0tPnRpbWUudG1faG91ciA9IG5vdy50bV9ob3VyOwotCi0JLyogRm9yIHNpbXBsaWNpdHksIG9ubHkgc3VwcG9ydCBkYXRlIHJvbGxvdmVyIGZvciBub3cgKi8KLQlpZiAoYWxhcm0tPnRpbWUudG1fbWRheSA9PSAtMSkgewotCQlhbGFybS0+dGltZS50bV9tZGF5ID0gbm93LnRtX21kYXk7Ci0JCW1pc3NpbmcgPSBkYXk7Ci0JfQotCWlmIChhbGFybS0+dGltZS50bV9tb24gPT0gLTEpIHsKLQkJYWxhcm0tPnRpbWUudG1fbW9uID0gbm93LnRtX21vbjsKLQkJaWYgKG1pc3NpbmcgPT0gbm9uZSkKLQkJCW1pc3NpbmcgPSBtb250aDsKLQl9Ci0JaWYgKGFsYXJtLT50aW1lLnRtX3llYXIgPT0gLTEpIHsKLQkJYWxhcm0tPnRpbWUudG1feWVhciA9IG5vdy50bV95ZWFyOwotCQlpZiAobWlzc2luZyA9PSBub25lKQotCQkJbWlzc2luZyA9IHllYXI7Ci0JfQotCi0JLyogd2l0aCBsdWNrLCBubyByb2xsb3ZlciBpcyBuZWVkZWQgKi8KLQlydGNfdG1fdG9fdGltZSgmbm93LCAmdF9ub3cpOwotCXJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnRfYWxtKTsKLQlpZiAodF9ub3cgPCB0X2FsbSkKLQkJZ290byBkb25lOwotCi0Jc3dpdGNoIChtaXNzaW5nKSB7Ci0KLQkvKiAyNCBob3VyIHJvbGxvdmVyIC4uLiBpZiBpdCdzIG5vdyAxMGFtIE1vbmRheSwgYW4gYWxhcm0gdGhhdAotCSAqIHRoYXQgd2lsbCB0cmlnZ2VyIGF0IDVhbSB3aWxsIGRvIHNvIGF0IDVhbSBUdWVzZGF5LCB3aGljaAotCSAqIGNvdWxkIGFsc28gYmUgaW4gdGhlIG5leHQgbW9udGggb3IgeWVhci4gIFRoaXMgaXMgYSBjb21tb24KLQkgKiBjYXNlLCBlc3BlY2lhbGx5IGZvciBQQ3MuCi0JICovCi0JY2FzZSBkYXk6Ci0JCWRldl9kYmcoJnJ0Yy0+ZGV2LCAiYWxhcm0gcm9sbG92ZXI6ICVzXG4iLCAiZGF5Iik7Ci0JCXRfYWxtICs9IDI0ICogNjAgKiA2MDsKLQkJcnRjX3RpbWVfdG9fdG0odF9hbG0sICZhbGFybS0+dGltZSk7Ci0JCWJyZWFrOwotCi0JLyogTW9udGggcm9sbG92ZXIgLi4uIGlmIGl0J3MgdGhlIDMxdGgsIGFuIGFsYXJtIG9uIHRoZSAzcmQgd2lsbAotCSAqIGJlIG5leHQgbW9udGguICBBbiBhbGFybSBtYXRjaGluZyBvbiB0aGUgMzB0aCwgMjl0aCwgb3IgMjh0aAotCSAqIG1heSBlbmQgdXAgaW4gdGhlIG1vbnRoIGFmdGVyIHRoYXQhICBNYW55IG5ld2VyIFBDcyBzdXBwb3J0Ci0JICogdGhpcyB0eXBlIG9mIGFsYXJtLgotCSAqLwotCWNhc2UgbW9udGg6Ci0JCWRldl9kYmcoJnJ0Yy0+ZGV2LCAiYWxhcm0gcm9sbG92ZXI6ICVzXG4iLCAibW9udGgiKTsKLQkJZG8gewotCQkJaWYgKGFsYXJtLT50aW1lLnRtX21vbiA8IDExKQotCQkJCWFsYXJtLT50aW1lLnRtX21vbisrOwotCQkJZWxzZSB7Ci0JCQkJYWxhcm0tPnRpbWUudG1fbW9uID0gMDsKLQkJCQlhbGFybS0+dGltZS50bV95ZWFyKys7Ci0JCQl9Ci0JCQlkYXlzID0gcnRjX21vbnRoX2RheXMoYWxhcm0tPnRpbWUudG1fbW9uLAotCQkJCQlhbGFybS0+dGltZS50bV95ZWFyKTsKLQkJfSB3aGlsZSAoZGF5cyA8IGFsYXJtLT50aW1lLnRtX21kYXkpOwotCQlicmVhazsKLQotCS8qIFllYXIgcm9sbG92ZXIgLi4uIGVhc3kgZXhjZXB0IGZvciBsZWFwIHllYXJzISAqLwotCWNhc2UgeWVhcjoKLQkJZGV2X2RiZygmcnRjLT5kZXYsICJhbGFybSByb2xsb3ZlcjogJXNcbiIsICJ5ZWFyIik7Ci0JCWRvIHsKLQkJCWFsYXJtLT50aW1lLnRtX3llYXIrKzsKLQkJfSB3aGlsZSAocnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSkgIT0gMCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oJnJ0Yy0+ZGV2LCAiYWxhcm0gcm9sbG92ZXIgbm90IGhhbmRsZWRcbiIpOwotCX0KLQotZG9uZToKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19yZWFkX2FsYXJtKTsKIAoraW50IF9fcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCit7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWxvbmcgbm93LCBzY2hlZHVsZWQ7CisJaW50IGVycjsKKworCWVyciA9IHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmc2NoZWR1bGVkKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSdyZSBub3Qgc2V0dGluZyBhbGFybXMgaW4gdGhlIHBhc3QgKi8KKwllcnIgPSBfX3J0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCXJ0Y190bV90b190aW1lKCZ0bSwgJm5vdyk7CisJaWYgKHNjaGVkdWxlZCA8PSBub3cpCisJCXJldHVybiAtRVRJTUU7CisJLyoKKwkgKiBYWFggLSBXZSBqdXN0IGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoZSBhbGFybSB0aW1lIGlzIG5vdAorCSAqIGluIHRoZSBwYXN0LCBidXQgdGhlcmUgaXMgc3RpbGwgYSByYWNlIHdpbmRvdyB3aGVyZSBpZgorCSAqIHRoZSBpcyBhbGFybSBzZXQgZm9yIHRoZSBuZXh0IHNlY29uZCBhbmQgdGhlIHNlY29uZCB0aWNrcworCSAqIG92ZXIgcmlnaHQgaGVyZSwgYmVmb3JlIHdlIHNldCB0aGUgYWxhcm0uCisJICovCisKKwlpZiAoIXJ0Yy0+b3BzKQorCQllcnIgPSAtRU5PREVWOworCWVsc2UgaWYgKCFydGMtPm9wcy0+c2V0X2FsYXJtKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gcnRjLT5vcHMtPnNldF9hbGFybShydGMtPmRldi5wYXJlbnQsIGFsYXJtKTsKKworCXJldHVybiBlcnI7Cit9CisKIGludCBydGNfc2V0X2FsYXJtKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKIHsKIAlpbnQgZXJyOwpAQCAtMzAwLDE2ICsxNzMsMTggQEAKIAllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJ0Yy0+b3BzX2xvY2spOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0KLQlpZiAoIXJ0Yy0+b3BzKQotCQllcnIgPSAtRU5PREVWOwotCWVsc2UgaWYgKCFydGMtPm9wcy0+c2V0X2FsYXJtKQotCQllcnIgPSAtRUlOVkFMOwotCWVsc2UKLQkJZXJyID0gcnRjLT5vcHMtPnNldF9hbGFybShydGMtPmRldi5wYXJlbnQsIGFsYXJtKTsKLQorCWlmIChydGMtPmFpZV90aW1lci5lbmFibGVkKSB7CisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCQlydGMtPmFpZV90aW1lci5lbmFibGVkID0gMDsKKwl9CisJcnRjLT5haWVfdGltZXIubm9kZS5leHBpcmVzID0gcnRjX3RtX3RvX2t0aW1lKGFsYXJtLT50aW1lKTsKKwlydGMtPmFpZV90aW1lci5wZXJpb2QgPSBrdGltZV9zZXQoMCwgMCk7CisJaWYgKGFsYXJtLT5lbmFibGVkKSB7CisJCXJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQgPSAxOworCQlydGNfdGltZXJfZW5xdWV1ZShydGMsICZydGMtPmFpZV90aW1lcik7CisJfQogCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19zZXRfYWxhcm0pOwogCkBAIC0zMTksNiArMTk0LDE2IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWlmIChydGMtPmFpZV90aW1lci5lbmFibGVkICE9IGVuYWJsZWQpIHsKKwkJaWYgKGVuYWJsZWQpIHsKKwkJCXJ0Yy0+YWllX3RpbWVyLmVuYWJsZWQgPSAxOworCQkJcnRjX3RpbWVyX2VucXVldWUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCQl9IGVsc2UgeworCQkJcnRjX3RpbWVyX3JlbW92ZShydGMsICZydGMtPmFpZV90aW1lcik7CisJCQlydGMtPmFpZV90aW1lci5lbmFibGVkID0gMDsKKwkJfQorCX0KKwogCWlmICghcnRjLT5vcHMpCiAJCWVyciA9IC1FTk9ERVY7CiAJZWxzZSBpZiAoIXJ0Yy0+b3BzLT5hbGFybV9pcnFfZW5hYmxlKQpAQCAtMzM3LDM4ICsyMjIsMTE0IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwKLQlpZiAoZW5hYmxlZCA9PSAwICYmIHJ0Yy0+dWllX2lycV9hY3RpdmUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKLQkJcmV0dXJuIHJ0Y19kZXZfdXBkYXRlX2lycV9lbmFibGVfZW11bChydGMsIGVuYWJsZWQpOworCS8qIG1ha2Ugc3VyZSB3ZSdyZSBjaGFuZ2luZyBzdGF0ZSAqLworCWlmIChydGMtPnVpZV9ydGN0aW1lci5lbmFibGVkID09IGVuYWJsZWQpCisJCWdvdG8gb3V0OworCisJaWYgKGVuYWJsZWQpIHsKKwkJc3RydWN0IHJ0Y190aW1lIHRtOworCQlrdGltZV90IG5vdywgb25lc2VjOworCisJCV9fcnRjX3JlYWRfdGltZShydGMsICZ0bSk7CisJCW9uZXNlYyA9IGt0aW1lX3NldCgxLCAwKTsKKwkJbm93ID0gcnRjX3RtX3RvX2t0aW1lKHRtKTsKKwkJcnRjLT51aWVfcnRjdGltZXIubm9kZS5leHBpcmVzID0ga3RpbWVfYWRkKG5vdywgb25lc2VjKTsKKwkJcnRjLT51aWVfcnRjdGltZXIucGVyaW9kID0ga3RpbWVfc2V0KDEsIDApOworCQlydGMtPnVpZV9ydGN0aW1lci5lbmFibGVkID0gMTsKKwkJcnRjX3RpbWVyX2VucXVldWUocnRjLCAmcnRjLT51aWVfcnRjdGltZXIpOworCX0gZWxzZSB7CisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCAmcnRjLT51aWVfcnRjdGltZXIpOworCQlydGMtPnVpZV9ydGN0aW1lci5lbmFibGVkID0gMDsKIAl9Ci0jZW5kaWYKIAotCWlmICghcnRjLT5vcHMpCi0JCWVyciA9IC1FTk9ERVY7Ci0JZWxzZSBpZiAoIXJ0Yy0+b3BzLT51cGRhdGVfaXJxX2VuYWJsZSkKLQkJZXJyID0gLUVJTlZBTDsKLQllbHNlCi0JCWVyciA9IHJ0Yy0+b3BzLT51cGRhdGVfaXJxX2VuYWJsZShydGMtPmRldi5wYXJlbnQsIGVuYWJsZWQpOwotCitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKLQotI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwKLQkvKgotCSAqIEVuYWJsZSBlbXVsYXRpb24gaWYgdGhlIGRyaXZlciBkaWQgbm90IHByb3ZpZGUKLQkgKiB0aGUgdXBkYXRlX2lycV9lbmFibGUgZnVuY3Rpb24gcG9pbnRlciBvciBpZiByZXR1cm5lZAotCSAqIC1FSU5WQUwgdG8gc2lnbmFsIHRoYXQgaXQgaGFzIGJlZW4gY29uZmlndXJlZCB3aXRob3V0Ci0JICogaW50ZXJydXB0cyBvciB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuCi0JICovCi0JaWYgKGVyciA9PSAtRUlOVkFMKQotCQllcnIgPSBydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwocnRjLCBlbmFibGVkKTsKLSNlbmRpZgogCXJldHVybiBlcnI7CisKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y191cGRhdGVfaXJxX2VuYWJsZSk7CiAKKwogLyoqCi0gKiBydGNfdXBkYXRlX2lycSAtIHJlcG9ydCBSVEMgcGVyaW9kaWMsIGFsYXJtLCBhbmQvb3IgdXBkYXRlIGlycXMKKyAqIHJ0Y19oYW5kbGVfbGVnYWN5X2lycSAtIEFJRSwgVUlFIGFuZCBQSUUgZXZlbnQgaG9vaworICogQHJ0YzogcG9pbnRlciB0byB0aGUgcnRjIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gQUlFLCBVSUUgb3IgUElFIG1vZGUgaW50ZXJydXB0CisgKiBoYXMgb2NjdXJlZCAob3IgYmVlbiBlbXVsYXRlZCkuCisgKgorICogVHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgaXJxX3Rhc2sgZnVuY3Rpb24gY2FsbGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIHJ0Y19oYW5kbGVfbGVnYWN5X2lycShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBpbnQgbnVtLCBpbnQgbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogbWFyayBvbmUgaXJxIG9mIHRoZSBhcHByb3ByaWF0ZSBtb2RlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKKwlydGMtPmlycV9kYXRhID0gKHJ0Yy0+aXJxX2RhdGEgKyAobnVtIDw8IDgpKSB8IChSVENfSVJRRnxtb2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7CisKKwkvKiBjYWxsIHRoZSB0YXNrIGZ1bmMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CisJaWYgKHJ0Yy0+aXJxX3Rhc2spCisJCXJ0Yy0+aXJxX3Rhc2stPmZ1bmMocnRjLT5pcnFfdGFzay0+cHJpdmF0ZV9kYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcnRjLT5pcnFfcXVldWUpOworCWtpbGxfZmFzeW5jKCZydGMtPmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7Cit9CisKKworLyoqCisgKiBydGNfYWllX3VwZGF0ZV9pcnEgLSBBSUUgbW9kZSBydGN0aW1lciBob29rCisgKiBAcHJpdmF0ZTogcG9pbnRlciB0byB0aGUgcnRjX2RldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCB3aGVuIHRoZSBhaWVfdGltZXIgZXhwaXJlcy4KKyAqLwordm9pZCBydGNfYWllX3VwZGF0ZV9pcnEodm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gKHN0cnVjdCBydGNfZGV2aWNlICopcHJpdmF0ZTsKKwlydGNfaGFuZGxlX2xlZ2FjeV9pcnEocnRjLCAxLCBSVENfQUYpOworfQorCisKKy8qKgorICogcnRjX3VpZV91cGRhdGVfaXJxIC0gVUlFIG1vZGUgcnRjdGltZXIgaG9vaworICogQHByaXZhdGU6IHBvaW50ZXIgdG8gdGhlIHJ0Y19kZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgd2hlbiB0aGUgdWllX3RpbWVyIGV4cGlyZXMuCisgKi8KK3ZvaWQgcnRjX3VpZV91cGRhdGVfaXJxKHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IChzdHJ1Y3QgcnRjX2RldmljZSAqKXByaXZhdGU7CisJcnRjX2hhbmRsZV9sZWdhY3lfaXJxKHJ0YywgMSwgIFJUQ19VRik7Cit9CisKKworLyoqCisgKiBydGNfcGllX3VwZGF0ZV9pcnEgLSBQSUUgbW9kZSBocnRpbWVyIGhvb2sKKyAqIEB0aW1lcjogcG9pbnRlciB0byB0aGUgcGllIG1vZGUgaHJ0aW1lcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlbXVsYXRlIFBJRSBtb2RlIGludGVycnVwdHMKKyAqIHVzaW5nIGFuIGhydGltZXIuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHBlcmlvZGljCisgKiBocnRpbWVyIGV4cGlyZXMuCisgKi8KK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IHJ0Y19waWVfdXBkYXRlX2lycShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlrdGltZV90IHBlcmlvZDsKKwlpbnQgY291bnQ7CisJcnRjID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgcnRjX2RldmljZSwgcGllX3RpbWVyKTsKKworCXBlcmlvZCA9IGt0aW1lX3NldCgwLCBOU0VDX1BFUl9TRUMvcnRjLT5pcnFfZnJlcSk7CisJY291bnQgPSBocnRpbWVyX2ZvcndhcmRfbm93KHRpbWVyLCBwZXJpb2QpOworCisJcnRjX2hhbmRsZV9sZWdhY3lfaXJxKHJ0YywgY291bnQsIFJUQ19QRik7CisKKwlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOworfQorCisvKioKKyAqIHJ0Y191cGRhdGVfaXJxIC0gVHJpZ2dlcmVkIHdoZW4gYSBSVEMgaW50ZXJydXB0IG9jY3Vycy4KICAqIEBydGM6IHRoZSBydGMgZGV2aWNlCiAgKiBAbnVtOiBob3cgbWFueSBpcnFzIGFyZSBiZWluZyByZXBvcnRlZCAodXN1YWxseSBvbmUpCiAgKiBAZXZlbnRzOiBtYXNrIG9mIFJUQ19JUlFGIHdpdGggb25lIG9yIG1vcmUgb2YgUlRDX1BGLCBSVENfQUYsIFJUQ19VRgpAQCAtMzc3LDE5ICszMzgsNyBAQAogdm9pZCBydGNfdXBkYXRlX2lycShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLAogCQl1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBldmVudHMpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7Ci0JcnRjLT5pcnFfZGF0YSA9IChydGMtPmlycV9kYXRhICsgKG51bSA8PCA4KSkgfCBldmVudHM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwotCWlmIChydGMtPmlycV90YXNrKQotCQlydGMtPmlycV90YXNrLT5mdW5jKHJ0Yy0+aXJxX3Rhc2stPnByaXZhdGVfZGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Yy0+aXJxX3F1ZXVlKTsKLQlraWxsX2Zhc3luYygmcnRjLT5hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworCXNjaGVkdWxlX3dvcmsoJnJ0Yy0+aXJxd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfdXBkYXRlX2lycSk7CiAKQEAgLTQ3NywxOCArNDI2LDIwIEBACiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChydGMtPm9wcy0+aXJxX3NldF9zdGF0ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOWElPOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwogCWlmIChydGMtPmlycV90YXNrICE9IE5VTEwgJiYgdGFzayA9PSBOVUxMKQogCQllcnIgPSAtRUJVU1k7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgIT0gdGFzaykKIAkJZXJyID0gLUVBQ0NFUzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAotCWlmIChlcnIgPT0gMCkKLQkJZXJyID0gcnRjLT5vcHMtPmlycV9zZXRfc3RhdGUocnRjLT5kZXYucGFyZW50LCBlbmFibGVkKTsKKwlpZiAoZW5hYmxlZCkgeworCQlrdGltZV90IHBlcmlvZCA9IGt0aW1lX3NldCgwLCBOU0VDX1BFUl9TRUMvcnRjLT5pcnFfZnJlcSk7CisJCWhydGltZXJfc3RhcnQoJnJ0Yy0+cGllX3RpbWVyLCBwZXJpb2QsIEhSVElNRVJfTU9ERV9SRUwpOworCX0gZWxzZSB7CisJCWhydGltZXJfY2FuY2VsKCZydGMtPnBpZV90aW1lcik7CisJfQorCXJ0Yy0+cGllX2VuYWJsZWQgPSBlbmFibGVkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTUwOSwyMSArNDYwLDE5NCBAQAogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocnRjLT5vcHMtPmlycV9zZXRfZnJlcSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOWElPOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwogCWlmIChydGMtPmlycV90YXNrICE9IE5VTEwgJiYgdGFzayA9PSBOVUxMKQogCQllcnIgPSAtRUJVU1k7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgIT0gdGFzaykKIAkJZXJyID0gLUVBQ0NFUzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKLQogCWlmIChlcnIgPT0gMCkgewotCQllcnIgPSBydGMtPm9wcy0+aXJxX3NldF9mcmVxKHJ0Yy0+ZGV2LnBhcmVudCwgZnJlcSk7Ci0JCWlmIChlcnIgPT0gMCkKLQkJCXJ0Yy0+aXJxX2ZyZXEgPSBmcmVxOworCQlydGMtPmlycV9mcmVxID0gZnJlcTsKKwkJaWYgKHJ0Yy0+cGllX2VuYWJsZWQpIHsKKwkJCWt0aW1lX3QgcGVyaW9kOworCQkJaHJ0aW1lcl9jYW5jZWwoJnJ0Yy0+cGllX3RpbWVyKTsKKwkJCXBlcmlvZCA9IGt0aW1lX3NldCgwLCBOU0VDX1BFUl9TRUMvcnRjLT5pcnFfZnJlcSk7CisJCQlocnRpbWVyX3N0YXJ0KCZydGMtPnBpZV90aW1lciwgcGVyaW9kLAorCQkJCQlIUlRJTUVSX01PREVfUkVMKTsKKwkJfQogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRjX2lycV9zZXRfZnJlcSk7CisKKy8qKgorICogcnRjX3RpbWVyX2VucXVldWUgLSBBZGRzIGEgcnRjX3RpbWVyIHRvIHRoZSBydGNfZGV2aWNlIHRpbWVycXVldWUKKyAqIEBydGMgcnRjIGRldmljZQorICogQHRpbWVyIHRpbWVyIGJlaW5nIGFkZGVkLgorICoKKyAqIEVucXVldWVzIGEgdGltZXIgb250byB0aGUgcnRjIGRldmljZXMgdGltZXJxdWV1ZSBhbmQgc2V0cworICogdGhlIG5leHQgYWxhcm0gZXZlbnQgYXBwcm9wcmlhdGVseS4KKyAqCisgKiBNdXN0IGhvbGQgb3BzX2xvY2sgZm9yIHByb3BlciBzZXJpYWxpemF0aW9uIG9mIHRpbWVycXVldWUKKyAqLwordm9pZCBydGNfdGltZXJfZW5xdWV1ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcikKK3sKKwl0aW1lcnF1ZXVlX2FkZCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCWlmICgmdGltZXItPm5vZGUgPT0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpKSB7CisJCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOworCQlpbnQgZXJyOworCQlhbGFybS50aW1lID0gcnRjX2t0aW1lX3RvX3RtKHRpbWVyLT5ub2RlLmV4cGlyZXMpOworCQlhbGFybS5lbmFibGVkID0gMTsKKwkJZXJyID0gX19ydGNfc2V0X2FsYXJtKHJ0YywgJmFsYXJtKTsKKwkJaWYgKGVyciA9PSAtRVRJTUUpCisJCQlzY2hlZHVsZV93b3JrKCZydGMtPmlycXdvcmspOworCX0KK30KKworLyoqCisgKiBydGNfdGltZXJfcmVtb3ZlIC0gUmVtb3ZlcyBhIHJ0Y190aW1lciBmcm9tIHRoZSBydGNfZGV2aWNlIHRpbWVycXVldWUKKyAqIEBydGMgcnRjIGRldmljZQorICogQHRpbWVyIHRpbWVyIGJlaW5nIHJlbW92ZWQuCisgKgorICogUmVtb3ZlcyBhIHRpbWVyIG9udG8gdGhlIHJ0YyBkZXZpY2VzIHRpbWVycXVldWUgYW5kIHNldHMKKyAqIHRoZSBuZXh0IGFsYXJtIGV2ZW50IGFwcHJvcHJpYXRlbHkuCisgKgorICogTXVzdCBob2xkIG9wc19sb2NrIGZvciBwcm9wZXIgc2VyaWFsaXphdGlvbiBvZiB0aW1lcnF1ZXVlCisgKi8KK3ZvaWQgcnRjX3RpbWVyX3JlbW92ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlICpuZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpOworCXRpbWVycXVldWVfZGVsKCZydGMtPnRpbWVycXVldWUsICZ0aW1lci0+bm9kZSk7CisKKwlpZiAobmV4dCA9PSAmdGltZXItPm5vZGUpIHsKKwkJc3RydWN0IHJ0Y193a2Fscm0gYWxhcm07CisJCWludCBlcnI7CisJCW5leHQgPSB0aW1lcnF1ZXVlX2dldG5leHQoJnJ0Yy0+dGltZXJxdWV1ZSk7CisJCWlmICghbmV4dCkKKwkJCXJldHVybjsKKwkJYWxhcm0udGltZSA9IHJ0Y19rdGltZV90b190bShuZXh0LT5leHBpcmVzKTsKKwkJYWxhcm0uZW5hYmxlZCA9IDE7CisJCWVyciA9IF9fcnRjX3NldF9hbGFybShydGMsICZhbGFybSk7CisJCWlmIChlcnIgPT0gLUVUSU1FKQorCQkJc2NoZWR1bGVfd29yaygmcnRjLT5pcnF3b3JrKTsKKwl9Cit9CisKKy8qKgorICogcnRjX3RpbWVyX2RvX3dvcmsgLSBFeHBpcmVzIHJ0YyB0aW1lcnMKKyAqIEBydGMgcnRjIGRldmljZQorICogQHRpbWVyIHRpbWVyIGJlaW5nIHJlbW92ZWQuCisgKgorICogRXhwaXJlcyBydGMgdGltZXJzLiBSZXByb2dyYW1zIG5leHQgYWxhcm0gZXZlbnQgaWYgbmVlZGVkLgorICogQ2FsbGVkIHZpYSB3b3JrdGFzay4KKyAqCisgKiBTZXJpYWxpemVzIGFjY2VzcyB0byB0aW1lcnF1ZXVlIHZpYSBvcHNfbG9jayBtdXRleAorICovCit2b2lkIHJ0Y190aW1lcl9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcjsKKwlzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlICpuZXh0OworCWt0aW1lX3Qgbm93OworCXN0cnVjdCBydGNfdGltZSB0bTsKKworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ0Y19kZXZpY2UsIGlycXdvcmspOworCisJbXV0ZXhfbG9jaygmcnRjLT5vcHNfbG9jayk7CithZ2FpbjoKKwlfX3J0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCW5vdyA9IHJ0Y190bV90b19rdGltZSh0bSk7CisJd2hpbGUgKChuZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpKSkgeworCQlpZiAobmV4dC0+ZXhwaXJlcy50djY0ID4gbm93LnR2NjQpCisJCQlicmVhazsKKworCQkvKiBleHBpcmUgdGltZXIgKi8KKwkJdGltZXIgPSBjb250YWluZXJfb2YobmV4dCwgc3RydWN0IHJ0Y190aW1lciwgbm9kZSk7CisJCXRpbWVycXVldWVfZGVsKCZydGMtPnRpbWVycXVldWUsICZ0aW1lci0+bm9kZSk7CisJCXRpbWVyLT5lbmFibGVkID0gMDsKKwkJaWYgKHRpbWVyLT50YXNrLmZ1bmMpCisJCQl0aW1lci0+dGFzay5mdW5jKHRpbWVyLT50YXNrLnByaXZhdGVfZGF0YSk7CisKKwkJLyogUmUtYWRkL2Z3ZCBwZXJpb2RpYyB0aW1lcnMgKi8KKwkJaWYgKGt0aW1lX3RvX25zKHRpbWVyLT5wZXJpb2QpKSB7CisJCQl0aW1lci0+bm9kZS5leHBpcmVzID0ga3RpbWVfYWRkKHRpbWVyLT5ub2RlLmV4cGlyZXMsCisJCQkJCQkJdGltZXItPnBlcmlvZCk7CisJCQl0aW1lci0+ZW5hYmxlZCA9IDE7CisJCQl0aW1lcnF1ZXVlX2FkZCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCQl9CisJfQorCisJLyogU2V0IG5leHQgYWxhcm0gKi8KKwlpZiAobmV4dCkgeworCQlzdHJ1Y3QgcnRjX3drYWxybSBhbGFybTsKKwkJaW50IGVycjsKKwkJYWxhcm0udGltZSA9IHJ0Y19rdGltZV90b190bShuZXh0LT5leHBpcmVzKTsKKwkJYWxhcm0uZW5hYmxlZCA9IDE7CisJCWVyciA9IF9fcnRjX3NldF9hbGFybShydGMsICZhbGFybSk7CisJCWlmIChlcnIgPT0gLUVUSU1FKQorCQkJZ290byBhZ2FpbjsKKwl9CisKKwltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworfQorCisKKy8qIHJ0Y190aW1lcl9pbml0IC0gSW5pdGlhbGl6ZXMgYW4gcnRjX3RpbWVyCisgKiBAdGltZXI6IHRpbWVyIHRvIGJlIGludGlpYWxpemVkCisgKiBAZjogZnVuY3Rpb24gcG9pbnRlciB0byBiZSBjYWxsZWQgd2hlbiB0aW1lciBmaXJlcworICogQGRhdGE6IHByaXZhdGUgZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIEtlcm5lbCBpbnRlcmZhY2UgdG8gaW5pdGlhbGl6aW5nIGFuIHJ0Y190aW1lci4KKyAqLwordm9pZCBydGNfdGltZXJfaW5pdChzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lciwgdm9pZCAoKmYpKHZvaWQqIHApLCB2b2lkKiBkYXRhKQoreworCXRpbWVycXVldWVfaW5pdCgmdGltZXItPm5vZGUpOworCXRpbWVyLT5lbmFibGVkID0gMDsKKwl0aW1lci0+dGFzay5mdW5jID0gZjsKKwl0aW1lci0+dGFzay5wcml2YXRlX2RhdGEgPSBkYXRhOworfQorCisvKiBydGNfdGltZXJfc3RhcnQgLSBTZXRzIGFuIHJ0Y190aW1lciB0byBmaXJlIGluIHRoZSBmdXR1cmUKKyAqIEAgcnRjOiBydGMgZGV2aWNlIHRvIGJlIHVzZWQKKyAqIEAgdGltZXI6IHRpbWVyIGJlaW5nIHNldAorICogQCBleHBpcmVzOiB0aW1lIGF0IHdoaWNoIHRvIGV4cGlyZSB0aGUgdGltZXIKKyAqIEAgcGVyaW9kOiBwZXJpb2QgdGhhdCB0aGUgdGltZXIgd2lsbCByZWN1cgorICoKKyAqIEtlcm5lbCBpbnRlcmZhY2UgdG8gc2V0IGFuIHJ0Y190aW1lcgorICovCitpbnQgcnRjX3RpbWVyX3N0YXJ0KHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIqIHRpbWVyLAorCQkJa3RpbWVfdCBleHBpcmVzLCBrdGltZV90IHBlcmlvZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwltdXRleF9sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlpZiAodGltZXItPmVuYWJsZWQpCisJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCB0aW1lcik7CisKKwl0aW1lci0+bm9kZS5leHBpcmVzID0gZXhwaXJlczsKKwl0aW1lci0+cGVyaW9kID0gcGVyaW9kOworCisJdGltZXItPmVuYWJsZWQgPSAxOworCXJ0Y190aW1lcl9lbnF1ZXVlKHJ0YywgdGltZXIpOworCisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBydGNfdGltZXJfY2FuY2VsIC0gU3RvcHMgYW4gcnRjX3RpbWVyCisgKiBAIHJ0YzogcnRjIGRldmljZSB0byBiZSB1c2VkCisgKiBAIHRpbWVyOiB0aW1lciBiZWluZyBzZXQKKyAqCisgKiBLZXJuZWwgaW50ZXJmYWNlIHRvIGNhbmNlbCBhbiBydGNfdGltZXIKKyAqLworaW50IHJ0Y190aW1lcl9jYW5jZWwoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciogdGltZXIpCit7CisJaW50IHJldCA9IDA7CisJbXV0ZXhfbG9jaygmcnRjLT5vcHNfbG9jayk7CisJaWYgKHRpbWVyLT5lbmFibGVkKQorCQlydGNfdGltZXJfcmVtb3ZlKHJ0YywgdGltZXIpOworCXRpbWVyLT5lbmFibGVkID0gMDsKKwltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKaW5kZXggNTg1NjE2Ny4uYzdmZjhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWNtb3MuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKIC8qIHRoaXMgaXMgZm9yICJnZW5lcmljIGFjY2VzcyB0byBQQy1zdHlsZSBSVEMiIHVzaW5nIENNT1NfUkVBRC9DTU9TX1dSSVRFICovCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcnRjLmg+CkBAIC02ODcsNyArNjg4LDggQEAKICNpZglkZWZpbmVkKENPTkZJR19BVEFSSSkKIAlhZGRyZXNzX3NwYWNlID0gNjQ7CiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hcm1fXykgXAotCQkJfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19taXBzX18pCisJCQl8fCBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX21pcHNfXykgXAorCQkJfHwgZGVmaW5lZChfX3Bvd2VycGNfXykKIAlhZGRyZXNzX3NwYWNlID0gMTI4OwogI2Vsc2UKICN3YXJuaW5nIEFzc3VtaW5nIDEyOCBieXRlcyBvZiBSVEMrTlZSQU0gYWRkcmVzcyBzcGFjZSwgbm90IDY0IGJ5dGVzLgpAQCAtODUwLDcgKzg1Miw3IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAotc3RhdGljIGludCBjbW9zX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3N0YXRpYyBpbnQgY21vc19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY21vc19ydGMJKmNtb3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBjaGFyCXRtcDsKQEAgLTg5OCw3ICs5MDAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBjbW9zX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gY21vc19zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworCXJldHVybiBjbW9zX3N1c3BlbmQoZGV2KTsKIH0KIAogc3RhdGljIGludCBjbW9zX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC05NDUsOSArOTQ3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGNtb3NfcG1fb3BzLCBjbW9zX3N1c3BlbmQsIGNtb3NfcmVzdW1lKTsKKwogI2Vsc2UKLSNkZWZpbmUJY21vc19zdXNwZW5kCU5VTEwKLSNkZWZpbmUJY21vc19yZXN1bWUJTlVMTAogCiBzdGF0aWMgaW5saW5lIGludCBjbW9zX3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTEwNzcsNyArMTA3OSw3IEBACiAKIHN0YXRpYyBpbnQgY21vc19wbnBfc3VzcGVuZChzdHJ1Y3QgcG5wX2RldiAqcG5wLCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKLQlyZXR1cm4gY21vc19zdXNwZW5kKCZwbnAtPmRldiwgbWVzZyk7CisJcmV0dXJuIGNtb3Nfc3VzcGVuZCgmcG5wLT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGNtb3NfcG5wX3Jlc3VtZShzdHJ1Y3QgcG5wX2RldiAqcG5wKQpAQCAtMTE1Nyw4ICsxMTU5LDkgQEAKIAkuc2h1dGRvd24JPSBjbW9zX3BsYXRmb3JtX3NodXRkb3duLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9IChjaGFyICopIGRyaXZlcl9uYW1lLAotCQkuc3VzcGVuZAk9IGNtb3Nfc3VzcGVuZCwKLQkJLnJlc3VtZQkJPSBjbW9zX3Jlc3VtZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtCQk9ICZjbW9zX3BtX29wcywKKyNlbmRpZgogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwppbmRleCAwY2MwOTg0Li4yMTJiMTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCkBAIC00NiwxMDUgKzQ2LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAotLyoKLSAqIFJvdXRpbmUgdG8gcG9sbCBSVEMgc2Vjb25kcyBmaWVsZCBmb3IgY2hhbmdlIGFzIG9mdGVuIGFzIHBvc3NpYmxlLAotICogYWZ0ZXIgZmlyc3QgUlRDX1VJRSB1c2UgdGltZXIgdG8gcmVkdWNlIHBvbGxpbmcKLSAqLwotc3RhdGljIHZvaWQgcnRjX3VpZV90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGNfZGV2aWNlLCB1aWVfdGFzayk7Ci0Jc3RydWN0IHJ0Y190aW1lIHRtOwotCWludCBudW0gPSAwOwotCWludCBlcnI7Ci0KLQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKLQotCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCWlmIChydGMtPnN0b3BfdWllX3BvbGxpbmcgfHwgZXJyKSB7Ci0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKLQl9IGVsc2UgaWYgKHJ0Yy0+b2xkc2VjcyAhPSB0bS50bV9zZWMpIHsKLQkJbnVtID0gKHRtLnRtX3NlYyArIDYwIC0gcnRjLT5vbGRzZWNzKSAlIDYwOwotCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7Ci0JCXJ0Yy0+dWllX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLSAoSFovMTApOwotCQlydGMtPnVpZV90aW1lcl9hY3RpdmUgPSAxOwotCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JCWFkZF90aW1lcigmcnRjLT51aWVfdGltZXIpOwotCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkgewotCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKG51bSkKLQkJcnRjX3VwZGF0ZV9pcnEocnRjLCBudW0sIFJUQ19VRiB8IFJUQ19JUlFGKTsKLX0KLXN0YXRpYyB2b2lkIHJ0Y191aWVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOwotCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7Ci0JcnRjLT51aWVfdGFza19hY3RpdmUgPSAxOwotCWlmICgoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkpCi0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xlYXJfdWllKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCi17Ci0Jc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKHJ0Yy0+dWllX2lycV9hY3RpdmUpIHsKLQkJcnRjLT5zdG9wX3VpZV9wb2xsaW5nID0gMTsKLQkJaWYgKHJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKLQkJCWRlbF90aW1lcl9zeW5jKCZydGMtPnVpZV90aW1lcik7Ci0JCQlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKLQkJCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7Ci0JCX0KLQkJaWYgKHJ0Yy0+dWllX3Rhc2tfYWN0aXZlKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCQkJZmx1c2hfd29ya19zeW5jKCZydGMtPnVpZV90YXNrKTsKLQkJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCQl9Ci0JCXJ0Yy0+dWllX2lycV9hY3RpdmUgPSAwOwotCX0KLQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldF91aWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgdG07Ci0JaW50IGVycjsKLQotCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0Jc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKCFydGMtPnVpZV9pcnFfYWN0aXZlKSB7Ci0JCXJ0Yy0+dWllX2lycV9hY3RpdmUgPSAxOwotCQlydGMtPnN0b3BfdWllX3BvbGxpbmcgPSAwOwotCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7Ci0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMTsKLQkJaWYgKHNjaGVkdWxlX3dvcmsoJnJ0Yy0+dWllX3Rhc2spID09IDApCi0JCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JfQotCXJ0Yy0+aXJxX2RhdGEgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywgdW5zaWduZWQgaW50IGVuYWJsZWQpCi17Ci0JaWYgKGVuYWJsZWQpCi0JCXJldHVybiBzZXRfdWllKHJ0Yyk7Ci0JZWxzZQotCQlyZXR1cm4gY2xlYXJfdWllKHJ0Yyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJ0Y19kZXZfdXBkYXRlX2lycV9lbmFibGVfZW11bCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMICovCiAKIHN0YXRpYyBzc2l6ZV90CiBydGNfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtNDkzLDExICszOTQsNiBAQAogCiAJcnRjLT5kZXYuZGV2dCA9IE1LREVWKE1BSk9SKHJ0Y19kZXZ0KSwgcnRjLT5pZCk7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCi0JSU5JVF9XT1JLKCZydGMtPnVpZV90YXNrLCBydGNfdWllX3Rhc2spOwotCXNldHVwX3RpbWVyKCZydGMtPnVpZV90aW1lciwgcnRjX3VpZV90aW1lciwgKHVuc2lnbmVkIGxvbmcpcnRjKTsKLSNlbmRpZgotCiAJY2Rldl9pbml0KCZydGMtPmNoYXJfZGV2LCAmcnRjX2Rldl9mb3BzKTsKIAlydGMtPmNoYXJfZGV2Lm93bmVyID0gcnRjLT5vd25lcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCBkODI3Y2U1Li4wZDU1OWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0xMDYsOSArMTA2LDkgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0JczMyICgqcmVhZF9ibG9ja19kYXRhKShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCXMzMiAoKnJlYWRfYmxvY2tfZGF0YSkoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCSAgICAgICB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpOwotCXMzMiAoKndyaXRlX2Jsb2NrX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJczMyICgqd3JpdGVfYmxvY2tfZGF0YSkoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCQl1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpOwogfTsKIApAQCAtMTU4LDggKzE1OCw4IEBACiAKICNkZWZpbmUgQkxPQ0tfREFUQV9NQVhfVFJJRVMgMTAKIAotc3RhdGljIHMzMiBkczEzMDdfcmVhZF9ibG9ja19kYXRhX29uY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKLQkJCQkgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKK3N0YXRpYyBzMzIgZHMxMzA3X3JlYWRfYmxvY2tfZGF0YV9vbmNlKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgIHU4IGNvbW1hbmQsIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKIHsKIAlzMzIgaSwgZGF0YTsKIApAQCAtMTcyLDcgKzE3Miw3IEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBzMzIgZHMxMzA3X3JlYWRfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorc3RhdGljIHMzMiBkczEzMDdfcmVhZF9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCiAJCQkJICB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpCiB7CiAJdTggb2xkdmFsdWVzW0kyQ19TTUJVU19CTE9DS19NQVhdOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIHMzMiBkczEzMDdfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorc3RhdGljIHMzMiBkczEzMDdfd3JpdGVfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAogCQkJCSAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKIHsKIAl1OCBjdXJydmFsdWVzW0kyQ19TTUJVU19CTE9DS19NQVhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWxpYi5jIGIvZHJpdmVycy9ydGMvcnRjLWxpYi5jCmluZGV4IDc3Mzg1MWYuLjA3NWYxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1saWIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKQEAgLTExNyw0ICsxMTcsMzIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocnRjX3RtX3RvX3RpbWUpOwogCisvKgorICogQ29udmVydCBydGNfdGltZSB0byBrdGltZQorICovCitrdGltZV90IHJ0Y190bV90b19rdGltZShzdHJ1Y3QgcnRjX3RpbWUgdG0pCit7CisJdGltZV90IHRpbWU7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZSk7CisJcmV0dXJuIGt0aW1lX3NldCh0aW1lLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y190bV90b19rdGltZSk7CisKKy8qCisgKiBDb252ZXJ0IGt0aW1lIHRvIHJ0Y190aW1lCisgKi8KK3N0cnVjdCBydGNfdGltZSBydGNfa3RpbWVfdG9fdG0oa3RpbWVfdCBrdCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHJ0Y190aW1lIHJldDsKKworCXRzID0ga3RpbWVfdG9fdGltZXNwZWMoa3QpOworCS8qIFJvdW5kIHVwIGFueSBucyAqLworCWlmICh0cy50dl9uc2VjKQorCQl0cy50dl9zZWMrKzsKKwlydGNfdGltZV90b190bSh0cy50dl9zZWMsICZyZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfa3RpbWVfdG9fdG0pOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwppbmRleCA2NTc0MDNlLi4wZWMzZjU4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jCkBAIC0xMzksMTIgKzEzOSwxMyBAQAogCWlmIChJU19FUlIocnRjKSkKIAkJcmV0dXJuIFBUUl9FUlIocnRjKTsKIAorCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHJ0Yyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IG1heDY5MDJfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwogCiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4ODk5OC5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDg5OTguYwppbmRleCBmMjJkZWUzLi4zZjdiYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbWF4ODk5OC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tYXg4OTk4LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk4LXByaXZhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjZGVmaW5lIE1BWDg5OThfUlRDX1NFQwkJCTB4MDAKICNkZWZpbmUgTUFYODk5OF9SVENfTUlOCQkJMHgwMQpAQCAtNzMsNiArNzQsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50CSpydGM7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0Y19kZXY7CiAJaW50IGlycTsKKwlib29sIGxwMzk3NF9idWdfd29ya2Fyb3VuZDsKIH07CiAKIHN0YXRpYyB2b2lkIG1heDg5OThfZGF0YV90b190bSh1OCAqZGF0YSwgc3RydWN0IHJ0Y190aW1lICp0bSkKQEAgLTEyNCwxMCArMTI2LDE2IEBACiB7CiAJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1OCBkYXRhWzhdOworCWludCByZXQ7CiAKIAltYXg4OTk4X3RtX3RvX2RhdGEodG0sIGRhdGEpOwogCi0JcmV0dXJuIG1heDg5OThfYnVsa193cml0ZShpbmZvLT5ydGMsIE1BWDg5OThfUlRDX1NFQywgOCwgZGF0YSk7CisJcmV0ID0gbWF4ODk5OF9idWxrX3dyaXRlKGluZm8tPnJ0YywgTUFYODk5OF9SVENfU0VDLCA4LCBkYXRhKTsKKworCWlmIChpbmZvLT5scDM5NzRfYnVnX3dvcmthcm91bmQpCisJCW1zbGVlcCgyMDAwKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbWF4ODk5OF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQpAQCAtMTYzLDEyICsxNzEsMjkgQEAKIAogc3RhdGljIGludCBtYXg4OTk4X3J0Y19zdG9wX2FsYXJtKHN0cnVjdCBtYXg4OTk4X3J0Y19pbmZvICppbmZvKQogewotCXJldHVybiBtYXg4OTk4X3dyaXRlX3JlZyhpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX0NPTkYsIDApOworCWludCByZXQgPSBtYXg4OTk4X3dyaXRlX3JlZyhpbmZvLT5ydGMsIE1BWDg5OThfQUxBUk0wX0NPTkYsIDApOworCisJaWYgKGluZm8tPmxwMzk3NF9idWdfd29ya2Fyb3VuZCkKKwkJbXNsZWVwKDIwMDApOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtYXg4OTk4X3J0Y19zdGFydF9hbGFybShzdHJ1Y3QgbWF4ODk5OF9ydGNfaW5mbyAqaW5mbykKIHsKLQlyZXR1cm4gbWF4ODk5OF93cml0ZV9yZWcoaW5mby0+cnRjLCBNQVg4OTk4X0FMQVJNMF9DT05GLCAweDc3KTsKKwlpbnQgcmV0OworCXU4IGFsYXJtMF9jb25mID0gMHg3NzsKKworCS8qIExQMzk3NCB3aXRoIGRlbGF5IGJ1ZyBjaGlwcyBoYXMgcnRjIGFsYXJtIGJ1Z3Mgd2l0aCAiTU9OVEgiIGZpZWxkICovCisJaWYgKGluZm8tPmxwMzk3NF9idWdfd29ya2Fyb3VuZCkKKwkJYWxhcm0wX2NvbmYgPSAweDU3OworCisJcmV0ID0gbWF4ODk5OF93cml0ZV9yZWcoaW5mby0+cnRjLCBNQVg4OTk4X0FMQVJNMF9DT05GLCBhbGFybTBfY29uZik7CisKKwlpZiAoaW5mby0+bHAzOTc0X2J1Z193b3JrYXJvdW5kKQorCQltc2xlZXAoMjAwMCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1heDg5OThfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQpAQCAtMTg3LDEwICsyMTIsMTMgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChhbHJtLT5lbmFibGVkKQotCQlyZXR1cm4gbWF4ODk5OF9ydGNfc3RhcnRfYWxhcm0oaW5mbyk7CisJaWYgKGluZm8tPmxwMzk3NF9idWdfd29ya2Fyb3VuZCkKKwkJbXNsZWVwKDIwMDApOwogCi0JcmV0dXJuIDA7CisJaWYgKGFscm0tPmVuYWJsZWQpCisJCXJldCA9IG1heDg5OThfcnRjX3N0YXJ0X2FsYXJtKGluZm8pOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtYXg4OTk4X3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTIyNCw2ICsyNTIsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgbWF4ODk5OF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWF4ODk5OF9kZXYgKm1heDg5OTggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKG1heDg5OTgtPmRldik7CiAJc3RydWN0IG1heDg5OThfcnRjX2luZm8gKmluZm87CiAJaW50IHJldDsKIApAQCAtMjQ5LDEwICsyNzgsMTggQEAKIAogCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGluZm8tPmlycSwgTlVMTCwgbWF4ODk5OF9ydGNfYWxhcm1faXJxLCAwLAogCQkJInJ0Yy1hbGFybTAiLCBpbmZvKTsKKwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBhbGFybSBJUlE6ICVkOiAlZFxuIiwKIAkJCWluZm8tPmlycSwgcmV0KTsKIAorCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSVEMgQ0hJUCBOQU1FOiAlc1xuIiwgcGRldi0+aWRfZW50cnktPm5hbWUpOworCWlmIChwZGF0YS0+cnRjX2RlbGF5KSB7CisJCWluZm8tPmxwMzk3NF9idWdfd29ya2Fyb3VuZCA9IHRydWU7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJMUDM5NzQgd2l0aCBSVEMgUkVHRVJSIG9wdGlvbi4iCisJCQkJIiBSVEMgdXBkYXRlcyB3aWxsIGJlIGV4dHJlbWVseSBzbG93LlxuIik7CisJfQorCiAJcmV0dXJuIDA7CiAKIG91dF9ydGM6CkBAIC0yNzMsNiArMzEwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OThfcnRjX2lkW10gPSB7CisJeyAibWF4ODk5OC1ydGMiLCBUWVBFX01BWDg5OTggfSwKKwl7ICJscDM5NzQtcnRjIiwgVFlQRV9MUDM5NzQgfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDg5OThfcnRjX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAibWF4ODk5OC1ydGMiLApAQCAtMjgwLDYgKzMyMyw3IEBACiAJfSwKIAkucHJvYmUJCT0gbWF4ODk5OF9ydGNfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtYXg4OTk4X3J0Y19yZW1vdmUpLAorCS5pZF90YWJsZQk9IG1heDg5OThfcnRjX2lkLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbWF4ODk5OF9ydGNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW9tYXAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMKaW5kZXggNzMzNzdiMC4uZTcyYjUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW9tYXAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCkBAIC00MjksMTMgKzQyOSwxNCBAQAogZmFpbDA6CiAJaW91bm1hcChydGNfYmFzZSk7CiBmYWlsOgotCXJlbGVhc2VfcmVzb3VyY2UobWVtKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBfX2V4aXQgb21hcF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZQkJKm1lbSA9IGRldl9nZXRfZHJ2ZGF0YSgmcnRjLT5kZXYpOwogCiAJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOwogCkBAIC00NDcsOCArNDQ4LDkgQEAKIAlpZiAob21hcF9ydGNfdGltZXIgIT0gb21hcF9ydGNfYWxhcm0pCiAJCWZyZWVfaXJxKG9tYXBfcnRjX2FsYXJtLCBydGMpOwogCi0JcmVsZWFzZV9yZXNvdXJjZShkZXZfZ2V0X2RydmRhdGEoJnJ0Yy0+ZGV2KSk7CiAJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJaW91bm1hcChydGNfYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2dlbmhkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9nZW5oZC5jCmluZGV4IDMwYTFjYTMuLjU1MDViYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2dlbmhkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZ2VuaGQuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAogCWJkZXYgPSBiZGdldF9kaXNrKGJsb2NrLT5nZHAsIDApOwotCWlmICghYmRldiB8fCBibGtkZXZfZ2V0KGJkZXYsIEZNT0RFX1JFQUQpIDwgMCkKKwlpZiAoIWJkZXYgfHwgYmxrZGV2X2dldChiZGV2LCBGTU9ERV9SRUFELCBOVUxMKSA8IDApCiAJCXJldHVybiAtRU5PREVWOwogCS8qCiAJICogU2VlIGZzL3BhcnRpdGlvbi9jaGVjay5jOnJlZ2lzdGVyX2Rpc2sscmVzY2FuX3BhcnRpdGlvbnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2xhc3MuaCBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2xhc3MuaAppbmRleCA3MDdiN2Y0Li45ZTMyNzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmgKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jbGFzcy5oCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqX21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggZTgzOTFiODkuLmI3ZWFmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtMTgzNSw2ICsxODM1LDcgQEAKIAkgKiBhdmFpbGFibGUgYWdhaW4uIEtpY2sgcmUtZGV0ZWN0aW9uLgogCSAqLwogCWNkZXYtPnByaXZhdGUtPmZsYWdzLnJlc3VtaW5nID0gMTsKKwljZGV2LT5wcml2YXRlLT5wYXRoX25ld19tYXNrID0gTFBNX0FOWVBBVEg7CiAJY3NzX3NjaGVkdWxlX2V2YWwoc2NoLT5zY2hpZCk7CiAJc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7CiAJY3NzX2NvbXBsZXRlX3dvcmsoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCmluZGV4IDA5ZTdhMDUuLjMwYjJhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9sY3MuYwpAQCAtODQxLDcgKzg0MSw3IEBACiB9CiAKIC8qKgotICogRW1pdCBidWZmZXIgb2YgYSBsYW4gY29tYW5kLgorICogRW1pdCBidWZmZXIgb2YgYSBsYW4gY29tbWFuZC4KICAqLwogc3RhdGljIHZvaWQKIGxjc19sYW5jbWRfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2NmZGMuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCmluZGV4IDQ2MzQyZmUuLjMwM2RkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfY2ZkYy5jCkBAIC0zMTcsNyArMzE3LDcgQEAKIAogLyoqCiAgKiB6ZmNwX2NmZGNfcG9ydF9kZW5pZWQgLSBQcm9jZXNzICJhY2Nlc3MgZGVuaWVkIiBmb3IgcG9ydAotICogQHBvcnQ6IFRoZSBwb3J0IHdoZXJlIHRoZSBhY2NlcyBoYXMgYmVlbiBkZW5pZWQKKyAqIEBwb3J0OiBUaGUgcG9ydCB3aGVyZSB0aGUgYWNjZXNzIGhhcyBiZWVuIGRlbmllZAogICogQHF1YWw6IFRoZSBGU0Ygc3RhdHVzIHF1YWxpZmllciBmb3IgdGhlIGFjY2VzcyBkZW5pZWQgRlNGIHN0YXR1cwogICovCiB2b2lkIHpmY3BfY2ZkY19wb3J0X2RlbmllZChzdHJ1Y3QgemZjcF9wb3J0ICpwb3J0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCmluZGV4IGE2MjRmNWEuLmU4NTY2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCiAJbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwogCW5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJmbGFzaC1tZW1vcnkiKTsKLQlpZiAobm9kZSAhPSAwICYmIG5vZGUgIT0gLTEpIHsKKwlpZiAobm9kZSAhPSAwICYmIChzMzIpbm9kZSAhPSAtMSkgewogCQlpZiAocHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwKIAkJICAgIChjaGFyICopJnJlZzAsIHNpemVvZihyZWcwKSkgPT0gLTEpIHsKIAkJCXByaW50aygianNmbGFzaDogbm8gXCJyZWdcIiBwcm9wZXJ0eVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwppbmRleCBkYzVhYzZlLi5hMzkxMDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYTEwMHUydy5jCisrKyBiL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogCS8qIEdvIGJhY2sgYW5kIGNoZWNrIHRoZXkgbWF0Y2ggKi8KIAogCW91dGIoUFJHTVJTVCB8IERPV05MT0FELCBob3N0LT5iYXNlICsgT1JDX1JJU0NDVEwpOwkvKiBSZXNldCBwcm9ncmFtIGNvdW50IDAgKi8KLQliaW9zX2FkZHIgLT0gMHgxMDAwOwkvKiBSZXNldCB0aGUgQklPUyBhZGRkcmVzcyAgICAgICovCisJYmlvc19hZGRyIC09IDB4MTAwMDsJLyogUmVzZXQgdGhlIEJJT1MgYWRkcmVzcyAqLwogCWZvciAoaSA9IDAsIGRhdGEzMl9wdHIgPSAodTggKikgJiBkYXRhMzI7CS8qIENoZWNrIHRoZSBjb2RlICAgICAgICovCiAJICAgICBpIDwgMHgxMDAwOwkvKiBGaXJtd2FyZSBjb2RlIHNpemUgPSA0SyAgICAgICovCiAJICAgICBpKyssIGJpb3NfYWRkcisrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKaW5kZXggYWZjOWFlYi4uMDYwYWM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYwpAQCAtOTEsNyArOTEsNyBAQAogICoJYWFjX2ZpYl9zZXR1cAktCXNldHVwIHRoZSBmaWJzCiAgKglAZGV2OiBBZGFwdGVyIHRvIHNldCB1cAogICoKLSAqCUFsbG9jYXRlIHRoZSBQQ0kgc3BhY2UgZm9yIHRoZSBmaWJzLCBtYXAgaXQgYW5kIHRoZW4gaW50aWFsaXNlIHRoZQorICoJQWxsb2NhdGUgdGhlIFBDSSBzcGFjZSBmb3IgdGhlIGZpYnMsIG1hcCBpdCBhbmQgdGhlbiBpbml0aWFsaXNlIHRoZQogICoJZmliIGFyZWEsIHRoZSB1bm1hcHBlZCBmaWIgZGF0YSBhbmQgYWxzbyB0aGUgZnJlZSBsaXN0CiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxIGIvZHJpdmVycy9zY3NpL2FpYzd4eHhfb2xkL2FpYzd4eHguc2VxCmluZGV4IDU5OTdlN2MuLjE1NjViZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4X29sZC9haWM3eHh4LnNlcQorKysgYi9kcml2ZXJzL3Njc2kvYWljN3h4eF9vbGQvYWljN3h4eC5zZXEKQEAgLTExNzgsNyArMTE3OCw3IEBACiAvKgogICogUmV0cmlldmUgYW4gU0NCIGJ5IFNDQklEIGZpcnN0IHNlYXJjaGluZyB0aGUgZGlzY29ubmVjdGVkIGxpc3QgZmFsbGluZwogICogYmFjayB0byBETUEnaW5nIHRoZSBTQ0IgZG93biBmcm9tIHRoZSBob3N0LiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdAotICogQVJHXzEgaXMgdGhlIFNDQklEIG9mIGludGVycmVzdCBhbmQgdGhhdCBTSU5ERVggaXMgdGhlIHBvc2l0aW9uIGluIHRoZQorICogQVJHXzEgaXMgdGhlIFNDQklEIG9mIGludGVyZXN0IGFuZCB0aGF0IFNJTkRFWCBpcyB0aGUgcG9zaXRpb24gaW4gdGhlCiAgKiBkaXNjb25uZWN0ZWQgbGlzdCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZiBTSU5ERVggaXMgU0NCX0xJU1RfTlVMTCwKICAqIHdlIGdvIGRpcmVjdGx5IHRvIHRoZSBob3N0IGZvciB0aGUgU0NCLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaCBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfcmVnX2RlZi5oCmluZGV4IDI4YWFmMzQ5Li40MDI3M2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3JlZ19kZWYuaApAQCAtMTY4OSw3ICsxNjg5LDcgQEAKICNkZWZpbmUJCVBIWV9TVEFSVF9DQUwJCTB4MDEKIAogLyoKLSAqIEhTVF9QQ0lYMiBSZWdpc3RlcnMsIEFkZHJlc3NzIFJhbmdlOiAoMHgwMC0weEZDKQorICogSFNUX1BDSVgyIFJlZ2lzdGVycywgQWRkcmVzcyBSYW5nZTogKDB4MDAtMHhGQykKICAqLwogI2RlZmluZSBQQ0lYX1JFR19CQVNFX0FEUgkJMHhCODA0MDAwMAogCkBAIC0xODAyLDcgKzE4MDIsNyBAQAogI2RlZmluZSBQQ0lDX1RQX0NUUkwJMHhGQwogCiAvKgotICogRVhTSSBSZWdpc3RlcnMsIEFkZHJlc3NzIFJhbmdlOiAoMHgwMC0weEZDKQorICogRVhTSSBSZWdpc3RlcnMsIEFkZHJlc3MgUmFuZ2U6ICgweDAwLTB4RkMpCiAgKi8KICNkZWZpbmUgRVhTSV9SRUdfQkFTRV9BRFIJCVJFR19CQVNFX0FERFJfRVhTSQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zY2IuYwppbmRleCBjNDM2OThiLi4yOTU5MzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NjYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2NiLmMKQEAgLTg2Nyw3ICs4NjcsNyBAQAogICogcmVzb3VyY2VzIHRoZXkgaGF2ZSB3aXRoIHRoaXMgU0NCLCBhbmQgdGhlbiBjYWxsIHRoaXMgb25lIGF0IHRoZQogICogZW5kIG9mIHRoZWlyIHRpbWVvdXQgZnVuY3Rpb24uICBUbyBkbyB0aGlzLCBvbmUgc2hvdWxkIGluaXRpYWxpemUKICAqIHRoZSBhc2NiLT50aW1lci57ZnVuY3Rpb24sIGRhdGEsIGV4cGlyZXN9IHByaW9yIHRvIGNhbGxpbmcgdGhlIHBvc3QKLSAqIGZ1bmNpb24uICBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgcG9zdCBmdW5jdGlvbi4KKyAqIGZ1bmN0aW9uLiBUaGUgdGltZXIgaXMgc3RhcnRlZCBieSB0aGUgcG9zdCBmdW5jdGlvbi4KICAqLwogdm9pZCBhc2RfYXNjYl90aW1lZG91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9zZXEuYwppbmRleCA3NDM3NDYxLi4zOTAxNjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3NlcS5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfc2VxLmMKQEAgLTc5Nyw3ICs3OTcsNyBAQAogCQlpbnQgajsKIAkJLyogU3RhcnQgZnJvbSBQYWdlIDEgb2YgTW9kZSAwIGFuZCAxLiAqLwogCQltb2ZmcyA9IExTRVFfUEFHRV9TSVpFICsgaSpMU0VRX01PREVfU0NSQVRDSF9TSVpFOwotCQkvKiBBbGwgdGhlIGZpZWxkcyBvZiBwYWdlIDEgY2FuIGJlIGludGlhbGl6ZWQgdG8gMC4gKi8KKwkJLyogQWxsIHRoZSBmaWVsZHMgb2YgcGFnZSAxIGNhbiBiZSBpbml0aWFsaXplZCB0byAwLiAqLwogCQlmb3IgKGogPSAwOyBqIDwgTFNFUV9QQUdFX1NJWkU7IGogKz0gNCkKIAkJCWFzZF93cml0ZV9yZWdfZHdvcmQoYXNkX2hhLCBMbVNDUkFUQ0gobHNlcSkrbW9mZnMraiwwKTsKIAl9CkBAIC05MzgsNyArOTM4LDcgQEAKIAlhc2Rfd3JpdGVfcmVnX2R3b3JkKGFzZF9oYSwgU0NCUFJPLCAwKTsKIAlhc2Rfd3JpdGVfcmVnX2R3b3JkKGFzZF9oYSwgQ1NFUUNPTiwgMCk7CiAKLQkvKiBJbnRpYWxpemUgQ1NFUSBNb2RlIDExIEludGVycnVwdCBWZWN0b3JzLgorCS8qIEluaXRpYWxpemUgQ1NFUSBNb2RlIDExIEludGVycnVwdCBWZWN0b3JzLgogCSAqIFRoZSBhZGRyZXNzZXMgYXJlIDE2IGJpdCB3aWRlIGFuZCBpbiBkd29yZCB1bml0cy4KIAkgKiBUaGUgdmFsdWVzIG9mIHRoZWlyIG1hY3JvcyBhcmUgaW4gYnl0ZSB1bml0cy4KIAkgKiBUaHVzIHdlIGhhdmUgdG8gZGl2aWRlIGJ5IDQuICovCkBAIC05NjEsNyArOTYxLDcgQEAKIAlhc2Rfd3JpdGVfcmVnX3dvcmQoYXNkX2hhLCBDUFJHTUNOVCwgY3NlcV9pZGxlX2xvb3ApOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkvKiBJbnRpYWxpemUgTW9kZSBuIExpbmsgbSBJbnRlcnJ1cHQgRW5hYmxlLiAqLworCQkvKiBJbml0aWFsaXplIE1vZGUgbiBMaW5rIG0gSW50ZXJydXB0IEVuYWJsZS4gKi8KIAkJYXNkX3dyaXRlX3JlZ19kd29yZChhc2RfaGEsIENNbklOVEVOKGkpLCBFTl9DTW5SU1BNQlhGKTsKIAkJLyogSW5pdGlhbGl6ZSBNb2RlIG4gUmVxdWVzdCBNYWlsYm94LiAqLwogCQlhc2Rfd3JpdGVfcmVnX2R3b3JkKGFzZF9oYSwgQ01uUkVRTUJYKGkpLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCmluZGV4IDljNDEwYjIuLmMwMzUzY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpAQCAtMTgzOCw3ICsxODM4LDcgQEAKIAogCWNhc2UgQkZBX0lPSU1fU01fQUJPUlQ6CiAJCS8qCi0JCSAqIElPIGlzIGFscmFlZHkgYmVpbmcgY2xlYW5lZCB1cCBpbXBsaWNpdGx5CisJCSAqIElPIGlzIGFscmVhZHkgYmVpbmcgY2xlYW5lZCB1cCBpbXBsaWNpdGx5CiAJCSAqLwogCQlpb2ltLT5pb19jYmZuID0gX19iZmFfY2JfaW9pbV9hYm9ydDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCmluZGV4IDRlMmViOTIuLjQzZmE5ODZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwpAQCAtNTY0Niw3ICs1NjQ2LDcgQEAKIAlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgQkZBX1NUQVRVU19PSzoKIAkJLyoKLQkJICogSW5pdGlhbGlhemUgdGhlIFYtUG9ydCBmaWVsZHMKKwkJICogSW5pdGlhbGl6ZSB0aGUgVi1Qb3J0IGZpZWxkcwogCQkgKi8KIAkJX192cG9ydF9mY2lkKHZwb3J0KSA9IHZwb3J0LT5scHMtPmxwX3BpZDsKIAkJdnBvcnQtPnZwb3J0X3N0YXRzLmZkaXNjX2FjY2VwdHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kYzM5NXguYyBiL2RyaXZlcnMvc2NzaS9kYzM5NXguYwppbmRleCA4ZjFiNWM4Li5iMGY4NTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKKysrIGIvZHJpdmVycy9zY3NpL2RjMzk1eC5jCkBAIC0zNzk2LDcgKzM3OTYsNyBAQAogICogYWRhcHRlcl9hZGRfZGV2aWNlIC0gQWRkcyB0aGUgZGV2aWNlIGluc3RhbmNlIHRvIHRoZSBhZGFwdG9yIGluc3RhbmNlLgogICoKICAqIEBhY2I6IFRoZSBhZGFwdGVyIGRldmljZSB0byBiZSB1cGRhdGVkCi0gKiBAZGNiOiBBIG5ld2x5IGNyZWF0ZWQgYW5kIGludGlhbGlzZWQgZGV2aWNlIGluc3RhbmNlIHRvIGFkZC4KKyAqIEBkY2I6IEEgbmV3bHkgY3JlYXRlZCBhbmQgaW5pdGlhbGlzZWQgZGV2aWNlIGluc3RhbmNlIHRvIGFkZC4KICAqKi8KIHN0YXRpYyB2b2lkIGFkYXB0ZXJfYWRkX2RldmljZShzdHJ1Y3QgQWRhcHRlckN0bEJsayAqYWNiLAogCQlzdHJ1Y3QgRGV2aWNlQ3RsQmxrICpkY2IpCkBAIC00NDk4LDcgKzQ0OTgsNyBAQAogICogaW5pdF9hZGFwdGVyIC0gR3JhYiB0aGUgcmVzb3VyY2UgZm9yIHRoZSBjYXJkLCBzZXR1cCB0aGUgYWRhcHRlcgogICogaW5mb3JtYXRpb24sIHNldCB0aGUgY2FyZCBpbnRvIGEga25vd24gc3RhdGUsIGNyZWF0ZSB0aGUgdmFyaW91cwogICogdGFibGVzIGV0YyBldGMuIFRoaXMgYmFzaWNhbGx5IGdldHMgYWxsIGFkYXB0ZXIgaW5mb3JtYXRpb24gYWxsIHVwCi0gKiB0byBkYXRlLCBpbnRpYWxpc2VkIGFuZCBnZXRzIHRoZSBjaGlwIGluIHN5bmMgd2l0aCBpdC4KKyAqIHRvIGRhdGUsIGluaXRpYWxpc2VkIGFuZCBnZXRzIHRoZSBjaGlwIGluIHN5bmMgd2l0aCBpdC4KICAqCiAgKiBAaG9zdDoJVGhpcyBob3N0cyBhZGFwdGVyIHN0cnVjdHVyZQogICogQGlvX3BvcnQ6CVRoZSBiYXNlIEkvTyBwb3J0CkBAIC00Nzg5LDcgKzQ3ODksNyBAQAogICogdGhhdCBpdCBmaW5kcyBpbiB0aGUgc3lzdGVtLiBUaGUgcGNpX2RldiBzdHJjdXR1cmUgaW5kaWNhdGVzIHdoaWNoCiAgKiBpbnN0YW5jZSB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20uCiAgKiAKLSAqIEBkZXY6IFRoZSBQQ0kgZGV2aWNlIHRvIGludGlhbGl6ZS4KKyAqIEBkZXY6IFRoZSBQQ0kgZGV2aWNlIHRvIGluaXRpYWxpemUuCiAgKiBAaWQ6IExvb2tzIGxpa2UgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiBvdXIgcGNpIGRldmljZSB0YWJsZQogICogdGhhdCB3YXMgYWN0dWFsbHkgbWF0Y2hlZCBieSB0aGUgUENJIHN1YnN5c3RlbS4KICAqCkBAIC00ODYwLDcgKzQ4NjAsNyBAQAogICogZGMzOTV4X3JlbW92ZV9vbmUgLSBDYWxsZWQgdG8gcmVtb3ZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZQogICogYWRhcHRlci4KICAqCi0gKiBAZGV2OiBUaGUgUENJIGRldmljZSB0byBpbnRpYWxpemUuCisgKiBAZGV2OiBUaGUgUENJIGRldmljZSB0byBpbml0aWFsaXplLgogICoqLwogc3RhdGljIHZvaWQgX19kZXZleGl0IGRjMzk1eF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggZGUyZTA5ZS4uOWM1YzhiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtNTc0OCw3ICs1NzQ4LDcgQEAKIAl9CiAKIAlpZiAoaXByX2lzX2dhdGEocmVzKSAmJiByZXMtPnNhdGFfcG9ydCkKLQkJcmV0dXJuIGF0YV9zYXNfcXVldWVjbWQoc2NzaV9jbWQsIGRvbmUsIHJlcy0+c2F0YV9wb3J0LT5hcCk7CisJCXJldHVybiBhdGFfc2FzX3F1ZXVlY21kKHNjc2lfY21kLCByZXMtPnNhdGFfcG9ydC0+YXApOwogCiAJaXByX2NtZCA9IGlwcl9nZXRfZnJlZV9pcHJfY21uZChpb2FfY2ZnKTsKIAlpb2FyY2IgPSAmaXByX2NtZC0+aW9hcmNiOwpAQCAtNzUxNSwxNiArNzUxNSwxMCBAQAogewogCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CiAJdm9sYXRpbGUgdTMyIGludF9yZWc7Ci0JaW50IHJjOwogCiAJRU5URVI7CiAJaW9hX2NmZy0+cGRldi0+c3RhdGVfc2F2ZWQgPSB0cnVlOwotCXJjID0gcGNpX3Jlc3RvcmVfc3RhdGUoaW9hX2NmZy0+cGRldik7Ci0KLQlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7Ci0JCWlwcl9jbWQtPnMuaW9hc2EuaGRyLmlvYXNjID0gY3B1X3RvX2JlMzIoSVBSX0lPQVNDX1BDSV9BQ0NFU1NfRVJST1IpOwotCQlyZXR1cm4gSVBSX1JDX0pPQl9DT05USU5VRTsKLQl9CisJcGNpX3Jlc3RvcmVfc3RhdGUoaW9hX2NmZy0+cGRldik7CiAKIAlpZiAoaXByX3NldF9wY2l4X2NtZF9yZWcoaW9hX2NmZykpIHsKIAkJaXByX2NtZC0+cy5pb2FzYS5oZHIuaW9hc2MgPSBjcHVfdG9fYmUzMihJUFJfSU9BU0NfUENJX0FDQ0VTU19FUlJPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKaW5kZXggY2RjMDZjZC4uNTk2MmQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYwpAQCAtMTI1MCw3ICsxMjUwLDcgQEAKIC8qKgogICogZmNfbHVuX3Jlc2V0KCkgLSBTZW5kIGEgTFVOIFJFU0VUIGNvbW1hbmQgdG8gYSBkZXZpY2UKICAqCQkgICAgYW5kIHdhaXQgZm9yIHRoZSByZXBseQotICogQGxwb3J0OiBUaGUgbG9jYWwgcG9ydCB0byBzZW50IHRoZSBjb21hbmQgb24KKyAqIEBscG9ydDogVGhlIGxvY2FsIHBvcnQgdG8gc2VudCB0aGUgY29tbWFuZCBvbgogICogQGZzcDogICBUaGUgRkNQIHBhY2tldCB0aGF0IGlkZW50aWZpZXMgdGhlIExVTiB0byBiZSByZXNldAogICogQGlkOgkgICBUaGUgU0NTSSBjb21tYW5kIElECiAgKiBAbHVuOiAgIFRoZSBMVU4gSUQgdG8gYmUgcmVzZXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggMjkyNTFmYS4uNTgxNWNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTIxMSw4ICsyMTEsNyBAQAogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOwotCQkJcmVzID0gYXRhX3Nhc19xdWV1ZWNtZChjbWQsIHNjc2lfZG9uZSwKLQkJCQkJICAgICAgIGRldi0+c2F0YV9kZXYuYXApOworCQkJcmVzID0gYXRhX3Nhc19xdWV1ZWNtZChjbWQsIGRldi0+c2F0YV9kZXYuYXApOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPnNhdGFfZGV2LmFwLT5sb2NrLCBmbGFncyk7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCBjMDY0OTFiLi4zNTEyYWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtMTMzNSw3ICsxMzM1LDcgQEAKIH0KIAogLyoqCi0gKiBscGZjX3BhcmFtX2luaXQgLSBJbnRpYWxpemVzIGEgY2ZnIGF0dHJpYnV0ZQorICogbHBmY19wYXJhbV9pbml0IC0gSW5pdGlhbGl6ZXMgYSBjZmcgYXR0cmlidXRlCiAgKgogICogRGVzY3JpcHRpb246CiAgKiBNYWNybyB0aGF0IGdpdmVuIGFuIGF0dHIgZS5nLiBoYmFfcXVldWVfZGVwdGggZXhwYW5kcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCBmOWYxNjBhLi5iYjAxNTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMjg1Miw3ICsyODUyLDcgQEAKIAkJCWlmICh1bmxpa2VseSghZmNmX3JlY29yZCkpIHsKIAkJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkJCUxPR19NQk9YIHwgTE9HX1NMSSwKLQkJCQkJIjI1NTQgQ291bGQgbm90IGFsbG9jYXRlIG1lbW1vcnkgZm9yICIKKwkJCQkJIjI1NTQgQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgogCQkJCQkiZmNmIHJlY29yZFxuIik7CiAJCQkJcmMgPSAtRU5PREVWOwogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwppbmRleCA0NjIyNDJkLi42ZDBiMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYwpAQCAtODA3MSw3ICs4MDcxLDcgQEAKIAkgKiB0aGUgSEJBLgogCSAqLwogCi0JLyogSEJBIGludGVycnVwdCB3aWxsIGJlIGRpYWJsZWQgYWZ0ZXIgdGhpcyBjYWxsICovCisJLyogSEJBIGludGVycnVwdCB3aWxsIGJlIGRpc2FibGVkIGFmdGVyIHRoaXMgY2FsbCAqLwogCWxwZmNfc2xpX2hiYV9kb3duKHBoYmEpOwogCS8qIFN0b3Aga3RocmVhZCBzaWduYWwgc2hhbGwgdHJpZ2dlciB3b3JrX2RvbmUgb25lIG1vcmUgdGltZSAqLwogCWt0aHJlYWRfc3RvcChwaGJhLT53b3JrZXJfdGhyZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDYzNGIyZmUuLmEzNTlkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtMTAxNzIsNyArMTAxNzIsNyBAQAogICogbHBmY19zbGk0X3F1ZXVlX2ZyZWUgLSBmcmVlIGEgcXVldWUgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIG1lbW9yeQogICogQHF1ZXVlOiBUaGUgcXVldWUgc3RydWN0dXJlIHRvIGZyZWUuCiAgKgotICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhIHF1ZXVlIHN0cnVjdHVyZSBhbmQgdGhlIERNQWFibGUgbWVtZW9yeSB1c2VkIGZvcgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhIHF1ZXVlIHN0cnVjdHVyZSBhbmQgdGhlIERNQWFibGUgbWVtb3J5IHVzZWQgZm9yCiAgKiB0aGUgaG9zdCByZXNpZGVudCBxdWV1ZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZXN0cm95aW5nIHRoZQogICogcXVldWUgb24gdGhlIEhCQS4KICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKaW5kZXggZjU2NDQ3NC4uODUzNDExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmgKQEAgLTEzLDcgKzEzLDcgQEAKICAqLwogCiAvKgotICogQ29tYW5kIGNvYWxlc2NpbmcgLSBUaGlzIGZlYXR1cmUgYWxsb3dzIHRoZSBkcml2ZXIgdG8gYmUgYWJsZSB0byBjb21iaW5lCisgKiBDb21tYW5kIGNvYWxlc2NpbmcgLSBUaGlzIGZlYXR1cmUgYWxsb3dzIHRoZSBkcml2ZXIgdG8gYmUgYWJsZSB0byBjb21iaW5lCiAgKiB0d28gb3IgbW9yZSBjb21tYW5kcyBhbmQgaXNzdWUgYXMgb25lIGNvbW1hbmQgaW4gb3JkZXIgdG8gYm9vc3QgSS9PCiAgKiBwZXJmb3JtYW5jZS4gVXNlZnVsIGlmIHRoZSBuYXR1cmUgb2YgdGhlIEkvTyBpcyBzZXF1ZW50aWFsLiBJdCBpcyBub3QgdmVyeQogICogdXNlZnVsIGZvciByYW5kb20gbmF0dXJlZCBJL09zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21tLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYwppbmRleCBhNzAwOGMwLi4yNTUwNmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbW0uYwpAQCAtMjI0LDcgKzIyNCw3IEBACiB7CiAJaW50IGVycjsKIAotCS8qIGluY29uc2lzdGFudDogbXJhaWRfbW1fY29tcGF0X2lvY3RsIGRvZXNuJ3QgdGFrZSB0aGUgQktMICovCisJLyogaW5jb25zaXN0ZW50OiBtcmFpZF9tbV9jb21wYXRfaW9jdGwgZG9lc24ndCB0YWtlIHRoZSBCS0wgKi8KIAltdXRleF9sb2NrKCZtcmFpZF9tbV9tdXRleCk7CiAJZXJyID0gbXJhaWRfbW1faW9jdGwoZmlsZXAsIGNtZCwgYXJnKTsKIAltdXRleF91bmxvY2soJm1yYWlkX21tX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwppbmRleCBmOGM4NmIyLi5iOTUyODVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbTgwMDEvcG04MDAxX2luaXQuYwpAQCAtNjAzLDcgKzYwMyw3IEBACiAjZW5kaWYKIAogaW50eDoKLQkvKiBpbnRpYWxpemUgdGhlIElOVC1YIGludGVycnVwdCAqLworCS8qIGluaXRpYWxpemUgdGhlIElOVC1YIGludGVycnVwdCAqLwogCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLAogCQlTSE9TVF9UT19TQVNfSEEocG04MDAxX2hhLT5zaG9zdCkpOwogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IDMwMGQ1OWYuLjMyMWNmM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtMjIyOCwxMiArMjIyOCw3IEBACiAJCS8qIE9uY2UgZWl0aGVyIGJpc3Qgb3IgcGNpIHJlc2V0IGlzIGRvbmUsIHJlc3RvcmUgUENJIGNvbmZpZwogCQkgKiBzcGFjZS4gSWYgdGhpcyBmYWlscywgcHJvY2VlZCB3aXRoIGhhcmQgcmVzZXQgYWdhaW4KIAkJICovCi0JCWlmIChwY2lfcmVzdG9yZV9zdGF0ZShwaW5zdGFuY2UtPnBkZXYpKSB7Ci0JCQlwbWNyYWlkX2luZm8oImNvbmZpZy1zcGFjZSBlcnJvciByZXNldHRpbmcgYWdhaW5cbiIpOwotCQkJcGluc3RhbmNlLT5pb2Ffc3RhdGUgPSBJT0FfU1RBVEVfSU5fUkVTRVRfQUxFUlQ7Ci0JCQlwbWNyYWlkX3Jlc2V0X2FsZXJ0KGNtZCk7Ci0JCQlicmVhazsKLQkJfQorCQlwY2lfcmVzdG9yZV9zdGF0ZShwaW5zdGFuY2UtPnBkZXYpOwogCiAJCS8qIGZhaWwgYWxsIHBlbmRpbmcgY29tbWFuZHMgKi8KIAkJcG1jcmFpZF9mYWlsX291dHN0YW5kaW5nX2NtZHMocGluc3RhbmNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggNTAxZjY3Yi4uOTA0NWM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTE5NzcsOCArMTk3Nyw3IEBACiAgKgkJaW4uCiAgKgogICoJUmV0dXJucyB6ZXJvIGlmIHVuc3VjY2Vzc2Z1bCBvciBhbiBlcnJvciBpZiBUVVIgZmFpbGVkLiAgRm9yCi0gKglyZW1vdmFibGUgbWVkaWEsIGEgcmV0dXJuIG9mIE5PVF9SRUFEWSBvciBVTklUX0FUVEVOVElPTiBpcwotICoJdHJhbnNsYXRlZCB0byBzdWNjZXNzLCB3aXRoIHRoZSAtPmNoYW5nZWQgZmxhZyB1cGRhdGVkLgorICoJcmVtb3ZhYmxlIG1lZGlhLCBVTklUX0FUVEVOVElPTiBzZXRzIC0+Y2hhbmdlZCBmbGFnLgogICoqLwogaW50CiBzY3NpX3Rlc3RfdW5pdF9yZWFkeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCB0aW1lb3V0LCBpbnQgcmV0cmllcywKQEAgLTIwMDUsMTYgKzIwMDQsNiBAQAogCX0gd2hpbGUgKHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCiAJCSBzc2hkci0+c2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OICYmIC0tcmV0cmllcyk7CiAKLQlpZiAoIXNzaGRyKQotCQkvKiBjb3VsZCBub3QgYWxsb2NhdGUgc2Vuc2UgYnVmZmVyLCBzbyBjYW4ndCBwcm9jZXNzIGl0ICovCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoc2Rldi0+cmVtb3ZhYmxlICYmIHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCi0JICAgIChzc2hkci0+c2Vuc2Vfa2V5ID09IFVOSVRfQVRURU5USU9OIHx8Ci0JICAgICBzc2hkci0+c2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkpIHsKLQkJc2Rldi0+Y2hhbmdlZCA9IDE7Ci0JCXJlc3VsdCA9IDA7Ci0JfQogCWlmICghc3NoZHJfZXh0ZXJuYWwpCiAJCWtmcmVlKHNzaGRyKTsKIAlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbmV0bGluay5jCmluZGV4IGQ1M2U2NTAuLmEyZWQyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9uZXRsaW5rLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCiAKIC8qKgotICogc2NzaV9uZXRsaW5rX2luaXQgLSBDYWxsZWQgYnkgU0NTSSBzdWJzeXN0ZW0gdG8gaW50aWFsaXplCisgKiBzY3NpX25ldGxpbmtfaW5pdCAtIENhbGxlZCBieSBTQ1NJIHN1YnN5c3RlbSB0byBpbml0aWFsaXplCiAgKiAJdGhlIFNDU0kgdHJhbnNwb3J0IG5ldGxpbmsgaW50ZXJmYWNlCiAgKgogICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggNGM2OGQzNi4uNDkwY2UyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC04NjQsMTMgKzg2NCwxNSBAQAogCiAJZXJyb3IgPSBkZXZpY2VfYWRkKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJaWYgKGVycm9yKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImVycm9yIDFcbiIpOworCQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsCisJCQkJImZhaWxlZCB0byBhZGQgZGV2aWNlOiAlZFxuIiwgZXJyb3IpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCWRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZCgmc2Rldi0+c2Rldl9kZXYpOwogCWVycm9yID0gZGV2aWNlX2FkZCgmc2Rldi0+c2Rldl9kZXYpOwogCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9JTkZPICJlcnJvciAyXG4iKTsKKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzZGV2LAorCQkJCSJmYWlsZWQgdG8gYWRkIGNsYXNzIGRldmljZTogJWRcbiIsIGVycm9yKTsKIAkJZGV2aWNlX2RlbCgmc2Rldi0+c2Rldl9nZW5kZXYpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCAzNjUwMjRiMC4uYjY1ZTY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTEwNDMsMTUgKzEwNDMsNyBAQAogCQkJCQkgICAgICBzc2hkcik7CiAJfQogCi0JLyoKLQkgKiBVbmFibGUgdG8gdGVzdCwgdW5pdCBwcm9iYWJseSBub3QgcmVhZHkuICAgVGhpcyB1c3VhbGx5Ci0JICogbWVhbnMgdGhlcmUgaXMgbm8gZGlzYyBpbiB0aGUgZHJpdmUuICBNYXJrIGFzIGNoYW5nZWQsCi0JICogYW5kIHdlIHdpbGwgZmlndXJlIGl0IG91dCBsYXRlciBvbmNlIHRoZSBkcml2ZSBpcwotCSAqIGF2YWlsYWJsZSBhZ2Fpbi4KLQkgKi8KLQlpZiAocmV0dmFsIHx8IChzY3NpX3NlbnNlX3ZhbGlkKHNzaGRyKSAmJgotCQkgICAgICAgLyogMHgzYSBpcyBtZWRpdW0gbm90IHByZXNlbnQgKi8KLQkJICAgICAgIHNzaGRyLT5hc2MgPT0gMHgzYSkpIHsKKwlpZiAocmV0dmFsKSB7CiAJCXNldF9tZWRpYV9ub3RfcHJlc2VudChzZGtwKTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCBkN2IzODNjLi5iZTZiYWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtMTA0LDE0ICsxMDQsMTUgQEAKIHN0YXRpYyB2b2lkIGdldF9zZWN0b3JzaXplKHN0cnVjdCBzY3NpX2NkICopOwogc3RhdGljIHZvaWQgZ2V0X2NhcGFiaWxpdGllcyhzdHJ1Y3Qgc2NzaV9jZCAqKTsKIAotc3RhdGljIGludCBzcl9tZWRpYV9jaGFuZ2Uoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIGludCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNyX2NoZWNrX2V2ZW50cyhzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNsZWFyaW5nLCBpbnQgc2xvdCk7CiBzdGF0aWMgaW50IHNyX3BhY2tldChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgc3RydWN0IHBhY2tldF9jb21tYW5kICopOwogCiBzdGF0aWMgc3RydWN0IGNkcm9tX2RldmljZV9vcHMgc3JfZG9wcyA9IHsKIAkub3BlbgkJCT0gc3Jfb3BlbiwKIAkucmVsZWFzZQkgCT0gc3JfcmVsZWFzZSwKIAkuZHJpdmVfc3RhdHVzCSAJPSBzcl9kcml2ZV9zdGF0dXMsCi0JLm1lZGlhX2NoYW5nZWQJCT0gc3JfbWVkaWFfY2hhbmdlLAorCS5jaGVja19ldmVudHMJCT0gc3JfY2hlY2tfZXZlbnRzLAogCS50cmF5X21vdmUJCT0gc3JfdHJheV9tb3ZlLAogCS5sb2NrX2Rvb3IJCT0gc3JfbG9ja19kb29yLAogCS5zZWxlY3Rfc3BlZWQJCT0gc3Jfc2VsZWN0X3NwZWVkLApAQCAtMTY1LDkwICsxNjYsOTYgQEAKIAltdXRleF91bmxvY2soJnNyX3JlZl9tdXRleCk7CiB9CiAKLS8qIGlkZW50aWNhbCB0byBzY3NpX3Rlc3RfdW5pdF9yZWFkeSBleGNlcHQgdGhhdCBpdCBkb2Vzbid0Ci0gKiBlYXQgdGhlIE5PVF9SRUFEWSByZXR1cm5zIGZvciByZW1vdmFibGUgbWVkaWEgKi8KLWludCBzcl90ZXN0X3VuaXRfcmVhZHkoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgKnNzaGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBzcl9nZXRfZXZlbnRzKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQlpbnQgcmV0cmllcyA9IE1BWF9SRVRSSUVTOwotCWludCB0aGVfcmVzdWx0OwotCXU4IGNtZFtdID0ge1RFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMCB9OworCXU4IGJ1Zls4XTsKKwl1OCBjbWRbXSA9IHsgR0VUX0VWRU5UX1NUQVRVU19OT1RJRklDQVRJT04sCisJCSAgICAgMSwJCQkvKiBwb2xsZWQgKi8KKwkJICAgICAwLCAwLAkJLyogcmVzZXJ2ZWQgKi8KKwkJICAgICAxIDw8IDQsCQkvKiBub3RpZmljYXRpb24gY2xhc3M6IG1lZGlhICovCisJCSAgICAgMCwgMCwJCS8qIHJlc2VydmVkICovCisJCSAgICAgMCwgc2l6ZW9mKGJ1ZiksCS8qIGFsbG9jYXRpb24gbGVuZ3RoICovCisJCSAgICAgMCwJCQkvKiBjb250cm9sICovCisJfTsKKwlzdHJ1Y3QgZXZlbnRfaGVhZGVyICplaCA9ICh2b2lkICopYnVmOworCXN0cnVjdCBtZWRpYV9ldmVudF9kZXNjICptZWQgPSAodm9pZCAqKShidWYgKyA0KTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJaW50IHJlc3VsdDsKIAotCS8qIGlzc3VlIFRFU1RfVU5JVF9SRUFEWSB1bnRpbCB0aGUgaW5pdGlhbCBzdGFydHVwIFVOSVRfQVRURU5USU9OCi0JICogY29uZGl0aW9ucyBhcmUgZ29uZSwgb3IgYSB0aW1lb3V0IGhhcHBlbnMKLQkgKi8KLQlkbyB7Ci0JCXRoZV9yZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX05PTkUsIE5VTEwsCi0JCQkJCSAgICAgIDAsIHNzaGRyLCBTUl9USU1FT1VULAotCQkJCQkgICAgICByZXRyaWVzLS0sIE5VTEwpOwotCQlpZiAoc2NzaV9zZW5zZV92YWxpZChzc2hkcikgJiYKLQkJICAgIHNzaGRyLT5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCi0JCQlzZGV2LT5jaGFuZ2VkID0gMTsKKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX0ZST01fREVWSUNFLCBidWYsIHNpemVvZihidWYpLAorCQkJCSAgJnNzaGRyLCBTUl9USU1FT1VULCBNQVhfUkVUUklFUywgTlVMTCk7CisJaWYgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSAmJiBzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pCisJCXJldHVybiBESVNLX0VWRU5UX01FRElBX0NIQU5HRTsKIAotCX0gd2hpbGUgKHJldHJpZXMgPiAwICYmCi0JCSAoIXNjc2lfc3RhdHVzX2lzX2dvb2QodGhlX3Jlc3VsdCkgfHwKLQkJICAoc2NzaV9zZW5zZV92YWxpZChzc2hkcikgJiYKLQkJICAgc3NoZHItPnNlbnNlX2tleSA9PSBVTklUX0FUVEVOVElPTikpKTsKLQlyZXR1cm4gdGhlX3Jlc3VsdDsKKwlpZiAocmVzdWx0IHx8IGJlMTZfdG9fY3B1KGVoLT5kYXRhX2xlbikgPCBzaXplb2YoKm1lZCkpCisJCXJldHVybiAwOworCisJaWYgKGVoLT5uZWEgfHwgZWgtPm5vdGlmaWNhdGlvbl9jbGFzcyAhPSAweDQpCisJCXJldHVybiAwOworCisJaWYgKG1lZC0+bWVkaWFfZXZlbnRfY29kZSA9PSAxKQorCQlyZXR1cm4gRElTS19FVkVOVF9FSkVDVF9SRVFVRVNUOworCWVsc2UgaWYgKG1lZC0+bWVkaWFfZXZlbnRfY29kZSA9PSAyKQorCQlyZXR1cm4gRElTS19FVkVOVF9NRURJQV9DSEFOR0U7CisJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlCi0gKiBDRFJPTSBkcml2ZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHNlbnNlZCBhIGNoYW5nZSwKLSAqIG9yIHRoZSBkcml2ZSBtYXkgaGF2ZSBzZW5zZWQgb25lIGFuZCBub3QgeWV0IHJlcG9ydGVkIGl0LiAgV2UgbXVzdAotICogYmUgcmVhZHkgZm9yIGVpdGhlciBjYXNlLiBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXBvcnRzIHRoZSBjdXJyZW50Ci0gKiB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBiaXQuICBJZiBmbGFnIGlzIDAsIHRoZW4gdGhlIGNoYW5nZWQgYml0IGlzIHJlc2V0LgotICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBkb25lIGFzIGFuIGlvY3RsLCBidXQgd2Ugd291bGQgbmVlZCB0byBoYXZlCi0gKiBhbiBpbm9kZSBmb3IgdGhhdCB0byB3b3JrLCBhbmQgd2UgZG8gbm90IGFsd2F5cyBoYXZlIG9uZS4KKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gY2hhbmdlZCBvciBlamVjdAorICogYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgYWxyZWFkeQorICogc2Vuc2VkIGEgY2hhbmdlLCBvciB0aGUgZHJpdmUgbWF5IGhhdmUgc2Vuc2VkIG9uZSBhbmQgbm90IHlldAorICogcmVwb3J0ZWQgaXQuICBUaGUgcGFzdCBldmVudHMgYXJlIGFjY3VtdWxhdGVkIGluIHNkZXYtPmNoYW5nZWQgYW5kCisgKiByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBjdXJyZW50IHN0YXRlLgogICovCi0KLXN0YXRpYyBpbnQgc3JfbWVkaWFfY2hhbmdlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc2xvdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3JfY2hlY2tfZXZlbnRzKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJpbmcsIGludCBzbG90KQogewogCXN0cnVjdCBzY3NpX2NkICpjZCA9IGNkaS0+aGFuZGxlOwotCWludCByZXR2YWw7Ci0Jc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcjsKKwlib29sIGxhc3RfcHJlc2VudDsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CisJdW5zaWduZWQgaW50IGV2ZW50czsKKwlpbnQgcmV0OwogCi0JaWYgKENEU0xfQ1VSUkVOVCAhPSBzbG90KSB7Ci0JCS8qIG5vIGNoYW5nZXIgc3VwcG9ydCAqLwotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBubyBjaGFuZ2VyIHN1cHBvcnQgKi8KKwlpZiAoQ0RTTF9DVVJSRU5UICE9IHNsb3QpCisJCXJldHVybiAwOworCisJZXZlbnRzID0gc3JfZ2V0X2V2ZW50cyhjZC0+ZGV2aWNlKTsKKwkvKgorCSAqIEdFVF9FVkVOVF9TVEFUVVNfTk9USUZJQ0FUSU9OIGlzIGVub3VnaCB1bmxlc3MgTUVESUFfQ0hBTkdFCisJICogaXMgYmVpbmcgY2xlYXJlZC4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgZGV2aWNlcyB3aGljaCBoYW5nCisJICogaWYgYXNrZWQgdG8gZXhlY3V0ZSBUVVIgcmVwZWF0ZWRseS4KKwkgKi8KKwlpZiAoIShjbGVhcmluZyAmIERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFKSkKKwkJZ290byBza2lwX3R1cjsKKworCS8qIGxldCdzIHNlZSB3aGV0aGVyIHRoZSBtZWRpYSBpcyB0aGVyZSB3aXRoIFRVUiAqLworCWxhc3RfcHJlc2VudCA9IGNkLT5tZWRpYV9wcmVzZW50OworCXJldCA9IHNjc2lfdGVzdF91bml0X3JlYWR5KGNkLT5kZXZpY2UsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTLCAmc3NoZHIpOworCisJLyoKKwkgKiBNZWRpYSBpcyBjb25zaWRlcmVkIHRvIGJlIHByZXNlbnQgaWYgVFVSIHN1Y2NlZWRzIG9yIGZhaWxzIHdpdGgKKwkgKiBzZW5zZSBkYXRhIGluZGljYXRpbmcgc29tZXRoaW5nIG90aGVyIHRoYW4gbWVkaWEtbm90LXByZXNlbnQKKwkgKiAoQVNDIDB4M2EpLgorCSAqLworCWNkLT5tZWRpYV9wcmVzZW50ID0gc2NzaV9zdGF0dXNfaXNfZ29vZChyZXQpIHx8CisJCShzY3NpX3NlbnNlX3ZhbGlkKCZzc2hkcikgJiYgc3NoZHIuYXNjICE9IDB4M2EpOworCisJaWYgKGxhc3RfcHJlc2VudCAhPSBjZC0+bWVkaWFfcHJlc2VudCkKKwkJZXZlbnRzIHw9IERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFOworc2tpcF90dXI6CisJaWYgKGNkLT5kZXZpY2UtPmNoYW5nZWQpIHsKKwkJZXZlbnRzIHw9IERJU0tfRVZFTlRfTUVESUFfQ0hBTkdFOworCQljZC0+ZGV2aWNlLT5jaGFuZ2VkID0gMDsKIAl9CiAKLQlzc2hkciA9ICBremFsbG9jKHNpemVvZigqc3NoZHIpLCBHRlBfS0VSTkVMKTsKLQlyZXR2YWwgPSBzcl90ZXN0X3VuaXRfcmVhZHkoY2QtPmRldmljZSwgc3NoZHIpOwotCWlmIChyZXR2YWwgfHwgKHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCi0JCSAgICAgICAvKiAweDNhIGlzIG1lZGl1bSBub3QgcHJlc2VudCAqLwotCQkgICAgICAgc3NoZHItPmFzYyA9PSAweDNhKSkgewotCQkvKiBNZWRpYSBub3QgcHJlc2VudCBvciB1bmFibGUgdG8gdGVzdCwgdW5pdCBwcm9iYWJseSBub3QKLQkJICogcmVhZHkuIFRoaXMgdXN1YWxseSBtZWFucyB0aGVyZSBpcyBubyBkaXNjIGluIHRoZSBkcml2ZS4KLQkJICogTWFyayBhcyBjaGFuZ2VkLCBhbmQgd2Ugd2lsbCBmaWd1cmUgaXQgb3V0IGxhdGVyIG9uY2UKLQkJICogdGhlIGRyaXZlIGlzIGF2YWlsYWJsZSBhZ2Fpbi4KLQkJICovCi0JCWNkLT5kZXZpY2UtPmNoYW5nZWQgPSAxOwotCQkvKiBUaGlzIHdpbGwgZm9yY2UgYSBmbHVzaCwgaWYgY2FsbGVkIGZyb20gY2hlY2tfZGlza19jaGFuZ2UgKi8KLQkJcmV0dmFsID0gMTsKLQkJZ290byBvdXQ7Ci0JfTsKLQotCXJldHZhbCA9IGNkLT5kZXZpY2UtPmNoYW5nZWQ7Ci0JY2QtPmRldmljZS0+Y2hhbmdlZCA9IDA7Ci0JLyogSWYgdGhlIGRpc2sgY2hhbmdlZCwgdGhlIGNhcGFjaXR5IHdpbGwgbm93IGJlIGRpZmZlcmVudCwKLQkgKiBzbyB3ZSBmb3JjZSBhIHJlLXJlYWQgb2YgdGhpcyBpbmZvcm1hdGlvbiAqLwotCWlmIChyZXR2YWwpIHsKLQkJLyogY2hlY2sgbXVsdGlzZXNzaW9uIG9mZnNldCBldGMgKi8KLQkJc3JfY2RfY2hlY2soY2RpKTsKLQkJZ2V0X3NlY3RvcnNpemUoY2QpOwotCX0KLQotb3V0OgotCS8qIE5vdGlmeSB1c2Vyc3BhY2UsIHRoYXQgbWVkaWEgaGFzIGNoYW5nZWQuICovCi0JaWYgKHJldHZhbCAhPSBjZC0+cHJldmlvdXNfc3RhdGUpCisJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwlpZiAoZXZlbnRzICYgRElTS19FVkVOVF9NRURJQV9DSEFOR0UpCiAJCXNkZXZfZXZ0X3NlbmRfc2ltcGxlKGNkLT5kZXZpY2UsIFNERVZfRVZUX01FRElBX0NIQU5HRSwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwotCWNkLT5wcmV2aW91c19zdGF0ZSA9IHJldHZhbDsKLQlrZnJlZShzc2hkcik7Ci0KLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBldmVudHM7CiB9Ci0gCisKIC8qCiAgKiBzcl9kb25lIGlzIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBmb3IgdGhlIGRldmljZSBkcml2ZXIuCiAgKgpAQCAtNTMzLDEwICs1NDAsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNyX2Jsb2NrX21lZGlhX2NoYW5nZWQoc3RydWN0IGdlbmRpc2sgKmRpc2spCitzdGF0aWMgdW5zaWduZWQgaW50IHNyX2Jsb2NrX2NoZWNrX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKKwkJCQkJICB1bnNpZ25lZCBpbnQgY2xlYXJpbmcpCiB7CiAJc3RydWN0IHNjc2lfY2QgKmNkID0gc2NzaV9jZChkaXNrKTsKLQlyZXR1cm4gY2Ryb21fbWVkaWFfY2hhbmdlZCgmY2QtPmNkaSk7CisJcmV0dXJuIGNkcm9tX2NoZWNrX2V2ZW50cygmY2QtPmNkaSwgY2xlYXJpbmcpOworfQorCitzdGF0aWMgaW50IHNyX2Jsb2NrX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3Qgc2NzaV9jZCAqY2QgPSBzY3NpX2NkKGRpc2spOworCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzc2hkcjsKKworCS8qIGlmIHRoZSB1bml0IGlzIG5vdCByZWFkeSwgbm90aGluZyBtb3JlIHRvIGRvICovCisJaWYgKHNjc2lfdGVzdF91bml0X3JlYWR5KGNkLT5kZXZpY2UsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTLCAmc3NoZHIpKQorCQlyZXR1cm4gMDsKKworCXNyX2NkX2NoZWNrKCZjZC0+Y2RpKTsKKwlnZXRfc2VjdG9yc2l6ZShjZCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgc3JfYmRvcHMgPQpAQCAtNTQ1LDcgKzU2Nyw4IEBACiAJLm9wZW4JCT0gc3JfYmxvY2tfb3BlbiwKIAkucmVsZWFzZQk9IHNyX2Jsb2NrX3JlbGVhc2UsCiAJLmlvY3RsCQk9IHNyX2Jsb2NrX2lvY3RsLAotCS5tZWRpYV9jaGFuZ2VkCT0gc3JfYmxvY2tfbWVkaWFfY2hhbmdlZCwKKwkuY2hlY2tfZXZlbnRzCT0gc3JfYmxvY2tfY2hlY2tfZXZlbnRzLAorCS5yZXZhbGlkYXRlX2Rpc2sgPSBzcl9ibG9ja19yZXZhbGlkYXRlX2Rpc2ssCiAJLyogCiAJICogTm8gY29tcGF0X2lvY3RsIGZvciBub3cgYmVjYXVzZSBzcl9ibG9ja19pb2N0bCBuZXZlcgogCSAqIHNlZW1zIHRvIHBhc3MgYXJiaXRhcnkgaW9jdGxzIGRvd24gdG8gaG9zdCBkcml2ZXJzLgpAQCAtNjE4LDYgKzY0MSw3IEBACiAJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJzciVkIiwgbWlub3IpOwogCWRpc2stPmZvcHMgPSAmc3JfYmRvcHM7CiAJZGlzay0+ZmxhZ3MgPSBHRU5IRF9GTF9DRDsKKwlkaXNrLT5ldmVudHMgPSBESVNLX0VWRU5UX01FRElBX0NIQU5HRSB8IERJU0tfRVZFTlRfRUpFQ1RfUkVRVUVTVDsKIAogCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkZXYtPnJlcXVlc3RfcXVldWUsIFNSX1RJTUVPVVQpOwogCkBAIC02MjcsNyArNjUxLDcgQEAKIAljZC0+ZGlzayA9IGRpc2s7CiAJY2QtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CiAJY2QtPmRldmljZS0+Y2hhbmdlZCA9IDE7CS8qIGZvcmNlIHJlY2hlY2sgQ0QgdHlwZSAqLwotCWNkLT5wcmV2aW91c19zdGF0ZSA9IDE7CisJY2QtPm1lZGlhX3ByZXNlbnQgPSAxOwogCWNkLT51c2UgPSAxOwogCWNkLT5yZWFkY2Rfa25vd24gPSAwOwogCWNkLT5yZWFkY2RfY2RkYSA9IDA7CkBAIC03ODAsNyArODA0LDcgQEAKIAl9CiAKIAkvKiBlYXQgdW5pdCBhdHRlbnRpb25zICovCi0Jc3JfdGVzdF91bml0X3JlYWR5KGNkLT5kZXZpY2UsICZzc2hkcik7CisJc2NzaV90ZXN0X3VuaXRfcmVhZHkoY2QtPmRldmljZSwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMsICZzc2hkcik7CiAKIAkvKiBhc2sgZm9yIG1vZGUgcGFnZSAweDJhICovCiAJcmMgPSBzY3NpX21vZGVfc2Vuc2UoY2QtPmRldmljZSwgMCwgMHgyYSwgYnVmZmVyLCAxMjgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuaCBiL2RyaXZlcnMvc2NzaS9zci5oCmluZGV4IDFlMTQ0ZGYuLmUwMzZmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5oCisrKyBiL2RyaXZlcnMvc2NzaS9zci5oCkBAIC00MCw3ICs0MCw3IEBACiAJdW5zaWduZWQgeGFfZmxhZzoxOwkvKiBDRCBoYXMgWEEgc2VjdG9ycyA/ICovCiAJdW5zaWduZWQgcmVhZGNkX2tub3duOjE7CS8qIGRyaXZlIHN1cHBvcnRzIFJFQURfQ0QgKDB4YmUpICovCiAJdW5zaWduZWQgcmVhZGNkX2NkZGE6MTsJLyogcmVhZGluZyBhdWRpbyBkYXRhIHVzaW5nIFJFQURfQ0QgKi8KLQl1bnNpZ25lZCBwcmV2aW91c19zdGF0ZToxOwkvKiBtZWRpYSBoYXMgY2hhbmdlZCAqLworCXVuc2lnbmVkIG1lZGlhX3ByZXNlbnQ6MTsJLyogbWVkaWEgaXMgcHJlc2VudCAqLwogCXN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyBjZGk7CiAJLyogV2UgaG9sZCBnZW5kaXNrIGFuZCBzY3NpX2RldmljZSByZWZlcmVuY2VzIG9uIHByb2JlIGFuZCB1c2UKIAkgKiB0aGUgcmVmcyBvbiB0aGlzIGtyZWYgdG8gZGVjaWRlIHdoZW4gdG8gcmVsZWFzZSB0aGVtICovCkBAIC02MSw3ICs2MSw2IEBACiBpbnQgc3JfYXVkaW9faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICosIHVuc2lnbmVkIGludCwgdm9pZCAqKTsKIAogaW50IHNyX2lzX3hhKFNjc2lfQ0QgKik7Ci1pbnQgc3JfdGVzdF91bml0X3JlYWR5KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcik7CiAKIC8qIHNyX3ZlbmRvci5jICovCiB2b2lkIHNyX3ZlbmRvcl9pbml0KFNjc2lfQ0QgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCmluZGV4IDNjZDhmZmIuLjhiZTMwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zcl9pb2N0bC5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJLyogd2UgaGF2ZSBubyBjaGFuZ2VyIHN1cHBvcnQgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICgwID09IHNyX3Rlc3RfdW5pdF9yZWFkeShjZC0+ZGV2aWNlLCAmc3NoZHIpKQorCWlmICghc2NzaV90ZXN0X3VuaXRfcmVhZHkoY2QtPmRldmljZSwgU1JfVElNRU9VVCwgTUFYX1JFVFJJRVMsICZzc2hkcikpCiAJCXJldHVybiBDRFNfRElTQ19PSzsKIAogCS8qIFNLL0FTQy9BU0NRIG9mIDIvNC8xIG1lYW5zICJ1bml0IGlzIGJlY29taW5nIHJlYWR5IiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwppbmRleCA2Yjk3ZGVkLi5iNDU0M2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYworKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwpAQCAtMTg2Niw3ICsxODY2LDcgQEAKICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgc2ltaWxhciB0byBzeW1fc2V0X3dvcmthcm91bmRzKCksIGV4Y2VwdAogICogdGhhdCwgYXQgdGhpcyBwb2ludCwgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIGRldmljZSB3YXMKLSAqIHN1Y2Nlc3NmdWxseSBpbnRpYWxpemVkIGF0IGxlYXN0IG9uY2UgYmVmb3JlLCBhbmQgc28gbW9zdAorICogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIGF0IGxlYXN0IG9uY2UgYmVmb3JlLCBhbmQgc28gbW9zdAogICogb2YgdGhlIHN0ZXBzIHRha2VuIHRoZXJlIGFyZSB1bi1uZWVkZWQgaGVyZS4KICAqLwogc3RhdGljIHZvaWQgc3ltMl9yZXNldF93b3JrYXJvdW5kcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IGVjM2MyMTQuLmMxZGY3NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtNzc2LDI0ICs3NzYsNyBAQAogCWJvb2wgIkVuYWJsZSBVQVJUMCBoYXJkd2FyZSBmbG93IGNvbnRyb2wiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQkZJTl9VQVJUMAogCWhlbHAKLQkgIEVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGRyaXZlci4gVXNpbmcgR1BJTyBlbXVsYXRlIHRoZSBDVFMvUlRTCi0JICBzaWduYWwuCi0KLWNvbmZpZyBVQVJUMF9DVFNfUElOCi0JaW50ICJVQVJUMCBDVFMgcGluIgotCWRlcGVuZHMgb24gQkZJTl9VQVJUMF9DVFNSVFMgJiYgIUJGNTQ4Ci0JZGVmYXVsdCAyMwotCWhlbHAKLQkgIFRoZSBkZWZhdWx0IHBpbiBpcyBHUElPX0dQNy4KLQkgIFJlZmVyIHRvIGFyY2gvYmxhY2tmaW4vbWFjaC0qL2luY2x1ZGUvbWFjaC9ncGlvLmggdG8gc2VlIHRoZSBHUElPIG1hcC4KLQotY29uZmlnIFVBUlQwX1JUU19QSU4KLQlpbnQgIlVBUlQwIFJUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQwX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IDIyCi0JaGVscAotCSAgVGhlIGRlZmF1bHQgcGluIGlzIEdQSU9fR1A2LgotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgorCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLgogCiBjb25maWcgU0VSSUFMX0JGSU5fVUFSVDEKIAlib29sICJFbmFibGUgVUFSVDEiCkBAIC04MDUsMjIgKzc4OCw3IEBACiAJYm9vbCAiRW5hYmxlIFVBUlQxIGhhcmR3YXJlIGZsb3cgY29udHJvbCIKIAlkZXBlbmRzIG9uIFNFUklBTF9CRklOX1VBUlQxCiAJaGVscAotCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLiBVc2luZyBHUElPIGVtdWxhdGUgdGhlIENUUy9SVFMKLQkgIHNpZ25hbC4KLQotY29uZmlnIFVBUlQxX0NUU19QSU4KLQlpbnQgIlVBUlQxIENUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQxX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IC0xCi0JaGVscAotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgotCi1jb25maWcgVUFSVDFfUlRTX1BJTgotCWludCAiVUFSVDEgUlRTIHBpbiIKLQlkZXBlbmRzIG9uIEJGSU5fVUFSVDFfQ1RTUlRTICYmICFCRjU0OAotCWRlZmF1bHQgLTEKLQloZWxwCi0JICBSZWZlciB0byBhcmNoL2JsYWNrZmluL21hY2gtKi9pbmNsdWRlL21hY2gvZ3Bpby5oIHRvIHNlZSB0aGUgR1BJTyBtYXAuCisJICBFbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIHRoZSBkcml2ZXIuCiAKIGNvbmZpZyBTRVJJQUxfQkZJTl9VQVJUMgogCWJvb2wgIkVuYWJsZSBVQVJUMiIKQEAgLTgzMiwyMiArODAwLDcgQEAKIAlib29sICJFbmFibGUgVUFSVDIgaGFyZHdhcmUgZmxvdyBjb250cm9sIgogCWRlcGVuZHMgb24gU0VSSUFMX0JGSU5fVUFSVDIKIAloZWxwCi0JICBFbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIHRoZSBkcml2ZXIuIFVzaW5nIEdQSU8gZW11bGF0ZSB0aGUgQ1RTL1JUUwotCSAgc2lnbmFsLgotCi1jb25maWcgVUFSVDJfQ1RTX1BJTgotCWludCAiVUFSVDIgQ1RTIHBpbiIKLQlkZXBlbmRzIG9uIEJGSU5fVUFSVDJfQ1RTUlRTICYmICFCRjU0OAotCWRlZmF1bHQgLTEKLQloZWxwCi0JICBSZWZlciB0byBhcmNoL2JsYWNrZmluL21hY2gtKi9pbmNsdWRlL21hY2gvZ3Bpby5oIHRvIHNlZSB0aGUgR1BJTyBtYXAuCi0KLWNvbmZpZyBVQVJUMl9SVFNfUElOCi0JaW50ICJVQVJUMiBSVFMgcGluIgotCWRlcGVuZHMgb24gQkZJTl9VQVJUMl9DVFNSVFMgJiYgIUJGNTQ4Ci0JZGVmYXVsdCAtMQotCWhlbHAKLQkgIFJlZmVyIHRvIGFyY2gvYmxhY2tmaW4vbWFjaC0qL2luY2x1ZGUvbWFjaC9ncGlvLmggdG8gc2VlIHRoZSBHUElPIG1hcC4KKwkgIEVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGRyaXZlci4KIAogY29uZmlnIFNFUklBTF9CRklOX1VBUlQzCiAJYm9vbCAiRW5hYmxlIFVBUlQzIgpAQCAtODU5LDIyICs4MTIsNyBAQAogCWJvb2wgIkVuYWJsZSBVQVJUMyBoYXJkd2FyZSBmbG93IGNvbnRyb2wiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQkZJTl9VQVJUMwogCWhlbHAKLQkgIEVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGRyaXZlci4gVXNpbmcgR1BJTyBlbXVsYXRlIHRoZSBDVFMvUlRTCi0JICBzaWduYWwuCi0KLWNvbmZpZyBVQVJUM19DVFNfUElOCi0JaW50ICJVQVJUMyBDVFMgcGluIgotCWRlcGVuZHMgb24gQkZJTl9VQVJUM19DVFNSVFMgJiYgIUJGNTQ4Ci0JZGVmYXVsdCAtMQotCWhlbHAKLQkgIFJlZmVyIHRvIGFyY2gvYmxhY2tmaW4vbWFjaC0qL2luY2x1ZGUvbWFjaC9ncGlvLmggdG8gc2VlIHRoZSBHUElPIG1hcC4KLQotY29uZmlnIFVBUlQzX1JUU19QSU4KLQlpbnQgIlVBUlQzIFJUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQzX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IC0xCi0JaGVscAotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgorCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLgogCiBjb25maWcgU0VSSUFMX0lNWAogCWJvb2wgIklNWCBzZXJpYWwgcG9ydCBzdXBwb3J0IgpAQCAtMTQxMiw3ICsxMzUwLDcgQEAKIAogY29uZmlnIFNFUklBTF9PRl9QTEFURk9STQogCXRyaXN0YXRlICJTZXJpYWwgcG9ydCBvbiBPcGVuIEZpcm13YXJlIHBsYXRmb3JtIGJ1cyIKLQlkZXBlbmRzIG9uIFBQQ19PRiB8fCBNSUNST0JMQVpFCisJZGVwZW5kcyBvbiBPRgogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgfHwgU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGEgUG93ZXJQQyBiYXNlZCBzeXN0ZW0gdGhhdCBoYXMgc2VyaWFsIHBvcnRzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IDM4OTI2NjYuLjJhMWQ1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC0xNzMyLDYgKzE3MzIsMTEgQEAKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG9ydCk7CiAKKwlpZiAocG9ydC0+cnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkgeworCQlVQVJUX1BVVF9NUigmcG9ydC0+dWFydCwgQVRNRUxfVVNfVVNNT0RFX05PUk1BTCk7CisJCVVBUlRfUFVUX0NSKCZwb3J0LT51YXJ0LCBBVE1FTF9VU19SVFNFTik7CisJfQorCiAJcmV0dXJuIDA7CiAKIGVycl9hZGRfcG9ydDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMgYi9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jCmluZGV4IDE5Y2FjOWYuLmUzODFiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYmZpbl81eHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBCbGFja2ZpbiBPbi1DaGlwIFNlcmlhbCBEcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoKQEAgLTEyLDYgKzEyLDkgQEAKICNkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKKyNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgRFJJVkVSX05BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtMjMsMjEgKzI2LDIwIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfS0dEQl9TRVJJQUxfQ09OU09MRV9NT0RVTEUpCi0jaW5jbHVkZSA8bGludXgva2dkYi5oPgotI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvYmZpbl9zZXJpYWxfNXh4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgcG9ydF9tZW1iYXNlKHVhcnQpICAgICAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPnBvcnQubWVtYmFzZSkKKyNkZWZpbmUgZ2V0X2xzcl9jYWNoZSh1YXJ0KSAgICAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPmxzcikKKyNkZWZpbmUgcHV0X2xzcl9jYWNoZSh1YXJ0LCB2KSAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPmxzciA9ICh2KSkKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUKICMgdW5kZWYgQ09ORklHX0VBUkxZX1BSSU5USwpAQCAtNDgsMTIgKzUwLDExIEBACiAjZW5kaWYKIAogLyogVUFSVCBuYW1lIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQkZJTl9TRVJJQUxfTkFNRQkidHR5QkYiCisjZGVmaW5lIEJGSU5fU0VSSUFMX0RFVl9OQU1FCSJ0dHlCRiIKICNkZWZpbmUgQkZJTl9TRVJJQUxfTUFKT1IJMjA0CiAjZGVmaW5lIEJGSU5fU0VSSUFMX01JTk9SCTY0CiAKLXN0YXRpYyBzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCBiZmluX3NlcmlhbF9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotc3RhdGljIGludCBucl9hY3RpdmVfcG9ydHMgPSBBUlJBWV9TSVpFKGJmaW5fc2VyaWFsX3Jlc291cmNlKTsKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqYmZpbl9zZXJpYWxfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0tHREJfU0VSSUFMX0NPTlNPTEUpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFX01PRFVMRSkKQEAgLTc0MywxNCArNzQ0LDE0IEBACiAJCX0KIAl9CiAJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkgewotCQlncGlvX3JlcXVlc3QodWFydC0+cnRzX3BpbiwgRFJJVkVSX05BTUUpOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQodWFydC0+cnRzX3BpbiwgMCk7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCi0JaWYgKHJlcXVlc3RfaXJxKHVhcnQtPnN0YXR1c19pcnEsCisJaWYgKHVhcnQtPmN0c19waW4gPj0gMCAmJiByZXF1ZXN0X2lycSh1YXJ0LT5zdGF0dXNfaXJxLAogCQliZmluX3NlcmlhbF9tY3RybF9jdHNfaW50LAogCQlJUlFGX0RJU0FCTEVELCAiQkZJTl9VQVJUX01PREVNX1NUQVRVUyIsIHVhcnQpKSB7CisJCXVhcnQtPmN0c19waW4gPSAtMTsKIAkJcHJfaW5mbygiVW5hYmxlIHRvIGF0dGFjaCBCbGFja0ZpbiBVQVJUIE1vZGVtIFN0YXR1cyBpbnRlcnJ1cHQuXG4iKTsKIAl9CiAKQEAgLTc5NiwxMSArNzk3LDkgQEAKICNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAJaWYgKHVhcnQtPmN0c19waW4gPj0gMCkKIAkJZnJlZV9pcnEoZ3Bpb190b19pcnEodWFydC0+Y3RzX3BpbiksIHVhcnQpOwotCWlmICh1YXJ0LT5ydHNfcGluID49IDApCi0JCWdwaW9fZnJlZSh1YXJ0LT5ydHNfcGluKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUwotCWlmIChVQVJUX0dFVF9JRVIodWFydCkgJiBFRFNTSSkKKwlpZiAodWFydC0+Y3RzX3BpbiA+PSAwKQogCQlmcmVlX2lycSh1YXJ0LT5zdGF0dXNfaXJxLCB1YXJ0KTsKICNlbmRpZgogfQpAQCAtOTYyLDMzICs5NjEsMzMgQEAKICAqLwogc3RhdGljIHZvaWQgYmZpbl9zZXJpYWxfc2V0X2xkaXNjKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBsZCkKIHsKLQlpbnQgbGluZSA9IHBvcnQtPmxpbmU7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIHNob3J0IHZhbDsKIAogCXN3aXRjaCAobGQpIHsKIAljYXNlIE5fSVJEQToKLQkJdmFsID0gVUFSVF9HRVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0pOworCQl2YWwgPSBVQVJUX0dFVF9HQ1RMKHVhcnQpOwogCQl2YWwgfD0gKElSRU4gfCBSUE9MQyk7Ci0JCVVBUlRfUFVUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdLCB2YWwpOworCQlVQVJUX1BVVF9HQ1RMKHVhcnQsIHZhbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXZhbCA9IFVBUlRfR0VUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdKTsKKwkJdmFsID0gVUFSVF9HRVRfR0NUTCh1YXJ0KTsKIAkJdmFsICY9IH4oSVJFTiB8IFJQT0xDKTsKLQkJVUFSVF9QVVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0sIHZhbCk7CisJCVVBUlRfUFVUX0dDVEwodWFydCwgdmFsKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX3Jlc2V0X2lyZGEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlpbnQgbGluZSA9IHBvcnQtPmxpbmU7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIHNob3J0IHZhbDsKIAotCXZhbCA9IFVBUlRfR0VUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdKTsKKwl2YWwgPSBVQVJUX0dFVF9HQ1RMKHVhcnQpOwogCXZhbCAmPSB+KElSRU4gfCBSUE9MQyk7Ci0JVUFSVF9QVVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0sIHZhbCk7CisJVUFSVF9QVVRfR0NUTCh1YXJ0LCB2YWwpOwogCVNTWU5DKCk7CiAJdmFsIHw9IChJUkVOIHwgUlBPTEMpOwotCVVBUlRfUFVUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdLCB2YWwpOworCVVBUlRfUFVUX0dDVEwodWFydCwgdmFsKTsKIAlTU1lOQygpOwogfQogCkBAIC0xMDcwLDg1ICsxMDY5LDYgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGJmaW5fc2VyaWFsX2h3X2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlgsIERSSVZFUl9OQU1FKTsKLQotIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykgJiYgZGVmaW5lZChDT05GSUdfQkY1NHgpCi0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlRTLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfQ1RTLCBEUklWRVJfTkFNRSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMgotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQyX1RYLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDJfUlgsIERSSVZFUl9OQU1FKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQzCi0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDNfVFgsIERSSVZFUl9OQU1FKTsKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19SWCwgRFJJVkVSX05BTUUpOwotCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDNfQ1RTUlRTKSAmJiBkZWZpbmVkKENPTkZJR19CRjU0eCkKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19SVFMsIERSSVZFUl9OQU1FKTsKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19DVFMsIERSSVZFUl9OQU1FKTsKLSMgZW5kaWYKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYmZpbl9zZXJpYWxfaW5pdF9wb3J0cyh2b2lkKQotewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCBpOwotCi0JaWYgKCFmaXJzdCkKLQkJcmV0dXJuOwotCWZpcnN0ID0gMDsKLQotCWJmaW5fc2VyaWFsX2h3X2luaXQoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9hY3RpdmVfcG9ydHM7IGkrKykgewotCQlzcGluX2xvY2tfaW5pdCgmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5sb2NrKTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC51YXJ0Y2xrICAgPSBnZXRfc2NsaygpOwotCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmZpZm9zaXplICA9IEJGSU5fVUFSVF9UWF9GSUZPX1NJWkU7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQub3BzICAgICAgID0gJmJmaW5fc2VyaWFsX3BvcHM7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQubGluZSAgICAgID0gaTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5pb3R5cGUgICAgPSBVUElPX01FTTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5tZW1iYXNlICAgPQotCQkJKHZvaWQgX19pb21lbSAqKWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfYmFzZV9hZGRyOwotCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0Lm1hcGJhc2UgICA9Ci0JCQliZmluX3NlcmlhbF9yZXNvdXJjZVtpXS51YXJ0X2Jhc2VfYWRkcjsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5pcnEgICAgICAgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9pcnE7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnN0YXR1c19pcnEJICAgID0KLQkJCWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfc3RhdHVzX2lycTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5mbGFncyAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORjsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCi0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnR4X2RvbmUJICAgID0gMTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0udHhfY291bnQJICAgID0gMDsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0udHhfZG1hX2NoYW5uZWwgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF90eF9kbWFfY2hhbm5lbDsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucnhfZG1hX2NoYW5uZWwgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9yeF9kbWFfY2hhbm5lbDsKLQkJaW5pdF90aW1lcigmKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnJ4X2RtYV90aW1lcikpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fSEFSRF9DVFNSVFMpCi0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLmN0c19waW4JICAgID0KLQkJCWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfY3RzX3BpbjsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucnRzX3BpbgkgICAgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9ydHNfcGluOwotI2VuZGlmCi0JfQotfQotCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwgZGVmaW5lZChDT05GSUdfRUFSTFlfUFJJTlRLKQogLyoKICAqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkIChlZywgYnkgYSBib290IGxvYWRlciksCkBAIC0xMTk2LDYgKzExMTYsMzQgQEAKIAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBiZmluX3NlcmlhbF9yZWc7CiAKK3N0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCit7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OworCXdoaWxlICghKFVBUlRfR0VUX0xTUih1YXJ0KSAmIFRIUkUpKQorCQliYXJyaWVyKCk7CisJVUFSVF9QVVRfQ0hBUih1YXJ0LCBjaCk7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwKKwkJIGRlZmluZWQgKENPTkZJR19FQVJMWV9QUklOVEspICovCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorI2RlZmluZSBDTEFTU19CRklOX0NPTlNPTEUJImJmaW4tY29uc29sZSIKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZworICovCitzdGF0aWMgdm9pZAorYmZpbl9zZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKwl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVhcnQtPnBvcnQsIHMsIGNvdW50LCBiZmluX3NlcmlhbF9jb25zb2xlX3B1dGNoYXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCit9CisKIHN0YXRpYyBpbnQgX19pbml0CiBiZmluX3NlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKQEAgLTEyMTUsOSArMTE2MywxMiBAQAogCSAqIGlmIHNvLCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQogCSAqIGNvbnNvbGUgc3VwcG9ydC4KIAkgKi8KLQlpZiAoY28tPmluZGV4ID09IC0xIHx8IGNvLT5pbmRleCA+PSBucl9hY3RpdmVfcG9ydHMpCi0JCWNvLT5pbmRleCA9IDA7Ci0JdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1tjby0+aW5kZXhdOworCWlmIChjby0+aW5kZXggPCAwIHx8IGNvLT5pbmRleCA+PSBCRklOX1VBUlRfTlJfUE9SVFMpCisJCXJldHVybiAtRU5PREVWOworCisJdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CisJaWYgKCF1YXJ0KQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChvcHRpb25zKQogCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CkBAIC0xMjI2LDM2ICsxMTc3LDkgQEAKIAogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKCZ1YXJ0LT5wb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwKLQkJCQkgZGVmaW5lZCAoQ09ORklHX0VBUkxZX1BSSU5USykgKi8KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFCi1zdGF0aWMgdm9pZCBiZmluX3NlcmlhbF9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGNoKQotewotCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICopcG9ydDsKLQl3aGlsZSAoIShVQVJUX0dFVF9MU1IodWFydCkgJiBUSFJFKSkKLQkJYmFycmllcigpOwotCVVBUlRfUFVUX0NIQVIodWFydCwgY2gpOwotCVNTWU5DKCk7Ci19Ci0KLS8qCi0gKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZwotICovCi1zdGF0aWMgdm9pZAotYmZpbl9zZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1tjby0+aW5kZXhdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JdWFydF9jb25zb2xlX3dyaXRlKCZ1YXJ0LT5wb3J0LCBzLCBjb3VudCwgYmZpbl9zZXJpYWxfY29uc29sZV9wdXRjaGFyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1YXJ0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgYmZpbl9zZXJpYWxfY29uc29sZSA9IHsKLQkubmFtZQkJPSBCRklOX1NFUklBTF9OQU1FLAorCS5uYW1lCQk9IEJGSU5fU0VSSUFMX0RFVl9OQU1FLAogCS53cml0ZQkJPSBiZmluX3NlcmlhbF9jb25zb2xlX3dyaXRlLAogCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKIAkuc2V0dXAJCT0gYmZpbl9zZXJpYWxfY29uc29sZV9zZXR1cCwKQEAgLTEyNjMsNDQgKzExODcsMzAgQEAKIAkuaW5kZXgJCT0gLTEsCiAJLmRhdGEJCT0gJmJmaW5fc2VyaWFsX3JlZywKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fc2VyaWFsX3JzX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCWJmaW5fc2VyaWFsX2luaXRfcG9ydHMoKTsKLQlyZWdpc3Rlcl9jb25zb2xlKCZiZmluX3NlcmlhbF9jb25zb2xlKTsKLQotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChiZmluX3NlcmlhbF9yc19jb25zb2xlX2luaXQpOwotCiAjZGVmaW5lIEJGSU5fU0VSSUFMX0NPTlNPTEUJJmJmaW5fc2VyaWFsX2NvbnNvbGUKICNlbHNlCiAjZGVmaW5lIEJGSU5fU0VSSUFMX0NPTlNPTEUJTlVMTAogI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFICovCiAKKyNpZmRlZglDT05GSUdfRUFSTFlfUFJJTlRLCitzdGF0aWMgc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgYmZpbl9lYXJseXByaW50a19wb3J0OworI2RlZmluZSBDTEFTU19CRklOX0VBUkxZUFJJTlRLCSJiZmluLWVhcmx5cHJpbnRrIgogCi0jaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwotc3RhdGljIF9faW5pdCB2b2lkIGVhcmx5X3NlcmlhbF9wdXRjKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZworICovCitzdGF0aWMgdm9pZAorYmZpbl9lYXJseXByaW50a19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQogewotCXVuc2lnbmVkIHRpbWVvdXQgPSAweGZmZmY7Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl3aGlsZSAoKCEoVUFSVF9HRVRfTFNSKHVhcnQpICYgVEhSRSkpICYmIC0tdGltZW91dCkKLQkJY3B1X3JlbGF4KCk7Ci0JVUFSVF9QVVRfQ0hBUih1YXJ0LCBjaCk7Ci19CisJaWYgKGJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmxpbmUgIT0gY28tPmluZGV4KQorCQlyZXR1cm47CiAKLXN0YXRpYyBfX2luaXQgdm9pZCBlYXJseV9zZXJpYWxfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywKLQkJCQkJdW5zaWduZWQgaW50IG4pCi17Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAmYmZpbl9zZXJpYWxfcG9ydHNbY29uLT5pbmRleF07Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBzKyspIHsKLQkJaWYgKCpzID09ICdcbicpCi0JCQllYXJseV9zZXJpYWxfcHV0YygmdWFydC0+cG9ydCwgJ1xyJyk7Ci0JCWVhcmx5X3NlcmlhbF9wdXRjKCZ1YXJ0LT5wb3J0LCAqcyk7Ci0JfQorCXNwaW5fbG9ja19pcnFzYXZlKCZiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5sb2NrLCBmbGFncyk7CisJdWFydF9jb25zb2xlX3dyaXRlKCZiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydCwgcywgY291bnQsCisJCWJmaW5fc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMTMxMSwxOCArMTIyMSwzMjYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIGNvbnNvbGUgYmZpbl9lYXJseV9zZXJpYWxfY29uc29sZSA9IHsKIAkubmFtZSA9ICJlYXJseV9CRnVhcnQiLAotCS53cml0ZSA9IGVhcmx5X3NlcmlhbF93cml0ZSwKKwkud3JpdGUgPSBiZmluX2Vhcmx5cHJpbnRrX2NvbnNvbGVfd3JpdGUsCiAJLmRldmljZSA9IHVhcnRfY29uc29sZV9kZXZpY2UsCiAJLmZsYWdzID0gQ09OX1BSSU5UQlVGRkVSLAogCS5pbmRleCA9IC0xLAogCS5kYXRhICA9ICZiZmluX3NlcmlhbF9yZWcsCiB9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgYmZpbl9zZXJpYWxfcmVnID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5kZXZfbmFtZQkJPSBCRklOX1NFUklBTF9ERVZfTkFNRSwKKwkubWFqb3IJCQk9IEJGSU5fU0VSSUFMX01BSk9SLAorCS5taW5vcgkJCT0gQkZJTl9TRVJJQUxfTUlOT1IsCisJLm5yCQkJPSBCRklOX1VBUlRfTlJfUE9SVFMsCisJLmNvbnMJCQk9IEJGSU5fU0VSSUFMX0NPTlNPTEUsCit9OworCitzdGF0aWMgaW50IGJmaW5fc2VyaWFsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gdWFydF9zdXNwZW5kX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJnVhcnQtPnBvcnQpOworfQorCitzdGF0aWMgaW50IGJmaW5fc2VyaWFsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gdWFydF9yZXN1bWVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmdWFydC0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGRldi0+aWQgPCAwIHx8IHBkZXYtPmlkID49IEJGSU5fVUFSVF9OUl9QT1JUUykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJXcm9uZyBiZmluIHVhcnQgcGxhdGZvcm0gZGV2aWNlIGlkLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChiZmluX3NlcmlhbF9wb3J0c1twZGV2LT5pZF0gPT0gTlVMTCkgeworCisJCXVhcnQgPSBremFsbG9jKHNpemVvZigqdWFydCksIEdGUF9LRVJORUwpOworCQlpZiAoIXVhcnQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZmFpbCB0byBtYWxsb2MgYmZpbl9zZXJpYWxfcG9ydFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQliZmluX3NlcmlhbF9wb3J0c1twZGV2LT5pZF0gPSB1YXJ0OworCisjaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USworCQlpZiAoIShiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlCisJCQkmJiBiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5saW5lID09IHBkZXYtPmlkKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBwZXJpcGhlcmFsIFBJTnMgb2YgY3VycmVudCBwb3J0IGlzIGFsbG9jYXRlZAorCQkJICogaW4gZWFybHlwcmludGsgcHJvYmUgc3RhZ2UsIGRvbid0IGRvIGl0IGFnYWluLgorCQkJICovCisjZW5kaWYKKwkJcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoCisJCQkodW5zaWduZWQgc2hvcnQgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgRFJJVkVSX05BTUUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImZhaWwgdG8gcmVxdWVzdCBiZmluIHNlcmlhbCBwZXJpcGhlcmFsc1xuIik7CisJCQlnb3RvIG91dF9lcnJvcl9mcmVlX21lbTsKKwkJfQorI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKwkJfQorI2VuZGlmCisKKwkJc3Bpbl9sb2NrX2luaXQoJnVhcnQtPnBvcnQubG9jayk7CisJCXVhcnQtPnBvcnQudWFydGNsayAgID0gZ2V0X3NjbGsoKTsKKwkJdWFydC0+cG9ydC5maWZvc2l6ZSAgPSBCRklOX1VBUlRfVFhfRklGT19TSVpFOworCQl1YXJ0LT5wb3J0Lm9wcyAgICAgICA9ICZiZmluX3NlcmlhbF9wb3BzOworCQl1YXJ0LT5wb3J0LmxpbmUgICAgICA9IHBkZXYtPmlkOworCQl1YXJ0LT5wb3J0LmlvdHlwZSAgICA9IFVQSU9fTUVNOworCQl1YXJ0LT5wb3J0LmZsYWdzICAgICA9IFVQRl9CT09UX0FVVE9DT05GOworCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJCWlmIChyZXMgPT0gTlVMTCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIik7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwkJfQorCisJCXVhcnQtPnBvcnQubWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwKKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCk7CisJCWlmICghdWFydC0+cG9ydC5tZW1iYXNlKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbWFwIHVhcnQgSU9cbiIpOworCQkJcmV0ID0gLUVOWElPOworCQkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwkJfQorCQl1YXJ0LT5wb3J0Lm1hcGJhc2UgPSByZXMtPnN0YXJ0OworCisJCXVhcnQtPnBvcnQuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJaWYgKHVhcnQtPnBvcnQuaXJxIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gdWFydCBSWC9UWCBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dF9lcnJvcl91bm1hcDsKKwkJfQorCisJCXVhcnQtPnN0YXR1c19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCQlpZiAodWFydC0+c3RhdHVzX2lycSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVhcnQgc3RhdHVzIElSUSBzcGVjaWZpZWRcbiIpOworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0X2Vycm9yX3VubWFwOworCQl9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJCXVhcnQtPnR4X2RvbmUJICAgID0gMTsKKwkJdWFydC0+dHhfY291bnQJICAgID0gMDsKKworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCQlpZiAocmVzID09IE5VTEwpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVhcnQgVFggRE1BIGNoYW5uZWwgc3BlY2lmaWVkXG4iKTsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dF9lcnJvcl91bm1hcDsKKwkJfQorCQl1YXJ0LT50eF9kbWFfY2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwkJaWYgKHJlcyA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1YXJ0IFJYIERNQSBjaGFubmVsIHNwZWNpZmllZFxuIik7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXRfZXJyb3JfdW5tYXA7CisJCX0KKwkJdWFydC0+cnhfZG1hX2NoYW5uZWwgPSByZXMtPnN0YXJ0OworCisJCWluaXRfdGltZXIoJih1YXJ0LT5yeF9kbWFfdGltZXIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fSEFSRF9DVFNSVFMpCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwkJaWYgKHJlcyA9PSBOVUxMKQorCQkJdWFydC0+Y3RzX3BpbiA9IC0xOworCQllbHNlCisJCQl1YXJ0LT5jdHNfcGluID0gcmVzLT5zdGFydDsKKworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMSk7CisJCWlmIChyZXMgPT0gTlVMTCkKKwkJCXVhcnQtPnJ0c19waW4gPSAtMTsKKwkJZWxzZQorCQkJdWFydC0+cnRzX3BpbiA9IHJlcy0+c3RhcnQ7CisjIGlmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUykKKwkJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkKKwkJCWdwaW9fcmVxdWVzdCh1YXJ0LT5ydHNfcGluLCBEUklWRVJfTkFNRSk7CisjIGVuZGlmCisjZW5kaWYKKwl9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorCWlmICghaXNfZWFybHlfcGxhdGZvcm1fZGV2aWNlKHBkZXYpKSB7CisjZW5kaWYKKwkJdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW3BkZXYtPmlkXTsKKwkJdWFydC0+cG9ydC5kZXYgPSAmcGRldi0+ZGV2OworCQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgdWFydCk7CisJCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZiZmluX3NlcmlhbF9yZWcsICZ1YXJ0LT5wb3J0KTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorCX0KKyNlbmRpZgorCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJaWYgKHVhcnQpIHsKK291dF9lcnJvcl91bm1hcDoKKwkJaW91bm1hcCh1YXJ0LT5wb3J0Lm1lbWJhc2UpOworb3V0X2Vycm9yX2ZyZWVfcGVyaXBoZXJhbHM6CisJCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworb3V0X2Vycm9yX2ZyZWVfbWVtOgorCQlrZnJlZSh1YXJ0KTsKKwkJYmZpbl9zZXJpYWxfcG9ydHNbcGRldi0+aWRdID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiZmluX3NlcmlhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOworCisJaWYgKHVhcnQpIHsKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJnVhcnQtPnBvcnQpOworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKwkJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkKKwkJCWdwaW9fZnJlZSh1YXJ0LT5ydHNfcGluKTsKKyNlbmRpZgorCQlpb3VubWFwKHVhcnQtPnBvcnQubWVtYmFzZSk7CisJCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCQlrZnJlZSh1YXJ0KTsKKwkJYmZpbl9zZXJpYWxfcG9ydHNbcGRldi0+aWRdID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9zZXJpYWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBiZmluX3NlcmlhbF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJmaW5fc2VyaWFsX3JlbW92ZSksCisJLnN1c3BlbmQJPSBiZmluX3NlcmlhbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYmZpbl9zZXJpYWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX0NPTlNPTEUpCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZWFybHlfcGxhdGZvcm1fZHJpdmVyIGVhcmx5X2JmaW5fc2VyaWFsX2RyaXZlciA9IHsKKwkuY2xhc3Nfc3RyID0gQ0xBU1NfQkZJTl9DT05TT0xFLAorCS5wZHJ2ID0gJmJmaW5fc2VyaWFsX2RyaXZlciwKKwkucmVxdWVzdGVkX2lkID0gRUFSTFlfUExBVEZPUk1fSURfVU5TRVQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX3NlcmlhbF9yc19jb25zb2xlX2luaXQodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmVhcmx5X2JmaW5fc2VyaWFsX2RyaXZlciwgRFJJVkVSX05BTUUpOworCisJZWFybHlfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKENMQVNTX0JGSU5fQ09OU09MRSwgQkZJTl9VQVJUX05SX1BPUlRTLCAwKTsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJmJmaW5fc2VyaWFsX2NvbnNvbGUpOworCisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGJmaW5fc2VyaWFsX3JzX2NvbnNvbGVfaW5pdCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKy8qCisgKiBNZW1vcnkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGR1cmluZyBlYXJseXByaW5rIGluaXQgc3RhZ2UuCisgKiBTbywgZG8gaW5kaXZpZHVhbCBwcm9iZSBmb3IgZWFybHlwcmluayB3aXRoIGEgc3RhdGljIHVhcnQgcG9ydCB2YXJpYWJsZS4KKyAqLworc3RhdGljIGludCBiZmluX2Vhcmx5cHJpbnRrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCWlmIChwZGV2LT5pZCA8IDAgfHwgcGRldi0+aWQgPj0gQkZJTl9VQVJUX05SX1BPUlRTKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyb25nIGVhcmx5cHJpbnRrIHBsYXRmb3JtIGRldmljZSBpZC5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdCgKKwkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIERSSVZFUl9OQU1FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZmFpbCB0byByZXF1ZXN0IGJmaW4gc2VyaWFsIHBlcmlwaGVyYWxzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X2Vycm9yX2ZyZWVfcGVyaXBoZXJhbHM7CisJfQorCisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwKKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCk7CisJaWYgKCFiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgdWFydCBJT1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwl9CisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubWFwYmFzZSA9IHJlcy0+c3RhcnQ7CisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubGluZSA9IHBkZXYtPmlkOworCWJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LnVhcnRjbGsgPSBnZXRfc2NsaygpOworCWJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmZpZm9zaXplICA9IEJGSU5fVUFSVF9UWF9GSUZPX1NJWkU7CisJc3Bpbl9sb2NrX2luaXQoJmJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmxvY2spOworCisJcmV0dXJuIDA7CisKK291dF9lcnJvcl9mcmVlX3BlcmlwaGVyYWxzOgorCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkodW5zaWduZWQgc2hvcnQgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZmluX2Vhcmx5cHJpbnRrX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYmZpbl9lYXJseXByaW50a19wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXIgZWFybHlfYmZpbl9lYXJseXByaW50a19kcml2ZXIgPSB7CisJLmNsYXNzX3N0ciA9IENMQVNTX0JGSU5fRUFSTFlQUklOVEssCisJLnBkcnYgPSAmYmZpbl9lYXJseXByaW50a19kcml2ZXIsCisJLnJlcXVlc3RlZF9pZCA9IEVBUkxZX1BMQVRGT1JNX0lEX1VOU0VULAorfTsKIAogc3RydWN0IGNvbnNvbGUgX19pbml0ICpiZmluX2Vhcmx5c2VyaWFsX2luaXQodW5zaWduZWQgaW50IHBvcnQsCiAJCQkJCQl1bnNpZ25lZCBpbnQgY2ZsYWcpCiB7Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQ7CiAJc3RydWN0IGt0ZXJtaW9zIHQ7CisJY2hhciBwb3J0X25hbWVbMjBdOworCisJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0gQkZJTl9VQVJUX05SX1BPUlRTKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogT25seSBwcm9iZSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gcG9ydCBpbiBlYXJseXByaW50ayBib290IGFyZy4KKwkgKiBUaGUgZXhwZWN0ZWQgcG9ydCBpZCBzaG91bGQgYmUgaW5kaWNhdGVkIGluIHBvcnQgbmFtZSBzdHJpbmcuCisJICovCisJc25wcmludGYocG9ydF9uYW1lLCAyMCwgRFJJVkVSX05BTUUgIi4lZCIsIHBvcnQpOworCWVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWFybHlfYmZpbl9lYXJseXByaW50a19kcml2ZXIsCisJCXBvcnRfbmFtZSk7CisJZWFybHlfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKENMQVNTX0JGSU5fRUFSTFlQUklOVEssIDEsIDApOworCisJaWYgKCFiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlKQorCQlyZXR1cm4gTlVMTDsKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFCiAJLyoKQEAgLTEzMzIsMTI0ICsxNTUwLDM2IEBACiAJYmZpbl9zZXJpYWxfY29uc29sZS5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOwogI2VuZGlmCiAKLQlpZiAocG9ydCA9PSAtMSB8fCBwb3J0ID49IG5yX2FjdGl2ZV9wb3J0cykKLQkJcG9ydCA9IDA7Ci0JYmZpbl9zZXJpYWxfaW5pdF9wb3J0cygpOwogCWJmaW5fZWFybHlfc2VyaWFsX2NvbnNvbGUuaW5kZXggPSBwb3J0OwotCXVhcnQgPSAmYmZpbl9zZXJpYWxfcG9ydHNbcG9ydF07CiAJdC5jX2NmbGFnID0gY2ZsYWc7CiAJdC5jX2lmbGFnID0gMDsKIAl0LmNfb2ZsYWcgPSAwOwogCXQuY19sZmxhZyA9IElDQU5PTjsKIAl0LmNfbGluZSA9IHBvcnQ7Ci0JYmZpbl9zZXJpYWxfc2V0X3Rlcm1pb3MoJnVhcnQtPnBvcnQsICZ0LCAmdCk7CisJYmZpbl9zZXJpYWxfc2V0X3Rlcm1pb3MoJmJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LCAmdCwgJnQpOworCiAJcmV0dXJuICZiZmluX2Vhcmx5X3NlcmlhbF9jb25zb2xlOwogfQotCiAjZW5kaWYgLyogQ09ORklHX0VBUkxZX1BSSU5USyAqLwogCi1zdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGJmaW5fc2VyaWFsX3JlZyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5kcml2ZXJfbmFtZQkJPSAiYmZpbi11YXJ0IiwKLQkuZGV2X25hbWUJCT0gQkZJTl9TRVJJQUxfTkFNRSwKLQkubWFqb3IJCQk9IEJGSU5fU0VSSUFMX01BSk9SLAotCS5taW5vcgkJCT0gQkZJTl9TRVJJQUxfTUlOT1IsCi0JLm5yCQkJPSBCRklOX1VBUlRfTlJfUE9SVFMsCi0JLmNvbnMJCQk9IEJGSU5fU0VSSUFMX0NPTlNPTEUsCi19OwotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyspIHsKLQkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ICE9ICZkZXYtPmRldikKLQkJCWNvbnRpbnVlOwotCQl1YXJ0X3N1c3BlbmRfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmZpbl9zZXJpYWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9hY3RpdmVfcG9ydHM7IGkrKykgewotCQlpZiAoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5kZXYgIT0gJmRldi0+ZGV2KQotCQkJY29udGludWU7Ci0JCXVhcnRfcmVzdW1lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJmJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2U7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fcmVzb3VyY2VzOyBpKyssIHJlcysrKQotCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJYnJlYWs7Ci0KLQlpZiAoaSA8IGRldi0+bnVtX3Jlc291cmNlcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyssIHJlcysrKSB7Ci0JCQlpZiAoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5tYXBiYXNlICE9IHJlcy0+c3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmRldiA9ICZkZXYtPmRldjsKLQkJCXVhcnRfYWRkX29uZV9wb3J0KCZiZmluX3NlcmlhbF9yZWcsICZiZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0KTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyspIHsKLQkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ICE9ICZkZXYtPmRldikKLQkJCWNvbnRpbnVlOwotCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ID0gTlVMTDsKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMpCi0JCWdwaW9fZnJlZShiZmluX3NlcmlhbF9wb3J0c1tpXS5jdHNfcGluKTsKLQkJZ3Bpb19mcmVlKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnJ0c19waW4pOwotI2VuZGlmCi0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fc2VyaWFsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYmZpbl9zZXJpYWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBiZmluX3NlcmlhbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBiZmluX3NlcmlhbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYmZpbl9zZXJpYWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJiZmluLXVhcnQiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgYmZpbl9zZXJpYWxfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKLQlwcl9pbmZvKCJTZXJpYWw6IEJsYWNrZmluIHNlcmlhbCBkcml2ZXJcbiIpOwotCi0JYmZpbl9zZXJpYWxfaW5pdF9wb3J0cygpOworCXByX2luZm8oIkJsYWNrZmluIHNlcmlhbCBkcml2ZXJcbiIpOwogCiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmJmaW5fc2VyaWFsX3JlZyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9zZXJpYWxfZHJpdmVyKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZGVidWcoInVhcnQgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmJmaW5fc2VyaWFsX3JlZyk7Ci0JCX0KKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyICVzOiVkXG4iLAorCQkJYmZpbl9zZXJpYWxfcmVnLmRyaXZlcl9uYW1lLCByZXQpOwogCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9zZXJpYWxfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbCB0byByZWdpc3RlciBiZmluIHVhcnRcbiIpOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZiZmluX3NlcmlhbF9yZWcpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NjMsNyArMTU5Myw3IEBACiBtb2R1bGVfaW5pdChiZmluX3NlcmlhbF9pbml0KTsKIG1vZHVsZV9leGl0KGJmaW5fc2VyaWFsX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBdWJyZXkuTGkgPGF1YnJleS5saUBhbmFsb2cuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcsIEF1YnJleSBMaSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCbGFja2ZpbiBnZW5lcmljIHNlcmlhbCBwb3J0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoQkZJTl9TRVJJQUxfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwppbmRleCAxNzg0OWRjLi41YzdhYmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9ud3BzZXJpYWwuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwppbmRleCBjMjkxYjNhLi45MmM5MWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBTdXBlckggb24tY2hpcCBzZXJpYWwgbW9kdWxlIHN1cHBvcnQuICAoU0NJIHdpdGggbm8gRklGTyAvIHdpdGggRklGTykKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwOCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMTEgIFBhdWwgTXVuZHQKICAqICBNb2RpZmllZCB0byBzdXBwb3J0IFNINzcyMCBTQ0lGLiBNYXJrdXMgQnJ1bm5lciwgTWFyayBKb25hcyAoSnVsIDIwMDcpLgogICoKICAqIGJhc2VkIG9mZiBvZiB0aGUgb2xkIGRyaXZlcnMvY2hhci9zaC1zY2kuYyBieToKQEAgLTgxLDE0ICs4MSwyMiBAQAogCXN0cnVjdCB0aW1lcl9saXN0CWJyZWFrX3RpbWVyOwogCWludAkJCWJyZWFrX2ZsYWc7CiAKKwkvKiBTQ1NDUiBpbml0aWFsaXphdGlvbiAqLworCXVuc2lnbmVkIGludAkJc2NzY3I7CisKKwkvKiBTQ0JSUiBjYWxjdWxhdGlvbiBhbGdvICovCisJdW5zaWduZWQgaW50CQlzY2Jycl9hbGdvX2lkOworCiAJLyogSW50ZXJmYWNlIGNsb2NrICovCiAJc3RydWN0IGNsawkJKmljbGs7CiAJLyogRnVuY3Rpb24gY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrCQkqZmNsazsKIAogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwogCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuX3R4OwogCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuX3J4OworCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TSF9TQ0lfRE1BCiAJc3RydWN0IGRldmljZQkJCSpkbWFfZGV2OwogCXVuc2lnbmVkIGludAkJCXNsYXZlX3R4OwpAQCAtNDE1LDkgKzQyMyw5IEBACiAJaWYgKCEoc3RhdHVzICYgU0N4U1JfVER4RShwb3J0KSkpIHsKIAkJY3RybCA9IHNjaV9pbihwb3J0LCBTQ1NDUik7CiAJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCQljdHJsICY9IH5TQ0lfQ1RSTF9GTEFHU19USUU7CisJCQljdHJsICY9IH5TQ1NDUl9USUU7CiAJCWVsc2UKLQkJCWN0cmwgfD0gU0NJX0NUUkxfRkxBR1NfVElFOworCQkJY3RybCB8PSBTQ1NDUl9USUU7CiAJCXNjaV9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwogCQlyZXR1cm47CiAJfQpAQCAtNDU5LDcgKzQ2Nyw3IEBACiAJCQlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9URHhFX0NMRUFSKHBvcnQpKTsKIAkJfQogCi0JCWN0cmwgfD0gU0NJX0NUUkxfRkxBR1NfVElFOworCQljdHJsIHw9IFNDU0NSX1RJRTsKIAkJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCk7CiAJfQogfQpAQCAtNzA4LDcgKzcxNiw3IEBACiAJCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKIAkJCXNjciB8PSAweDQwMDA7CiAJCX0gZWxzZSB7Ci0JCQlzY3IgJj0gflNDSV9DVFJMX0ZMQUdTX1JJRTsKKwkJCXNjciAmPSB+U0NTQ1JfUklFOwogCQl9CiAJCXNjaV9vdXQocG9ydCwgU0NTQ1IsIHNjcik7CiAJCS8qIENsZWFyIGN1cnJlbnQgaW50ZXJydXB0ICovCkBAIC03NzcsNiArNzg1LDE4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydF9yeF9pcnFfbWFzayhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCS8qCisJICogTm90IGFsbCBwb3J0cyAoc3VjaCBhcyBTQ0lGQSkgd2lsbCBzdXBwb3J0IFJFSUUuIFJhdGhlciB0aGFuCisJICogc3BlY2lhbC1jYXNpbmcgdGhlIHBvcnQgdHlwZSwgd2UgY2hlY2sgdGhlIHBvcnQgaW5pdGlhbGl6YXRpb24KKwkgKiBJUlEgZW5hYmxlIG1hc2sgdG8gc2VlIHdoZXRoZXIgdGhlIElSUSBpcyBkZXNpcmVkIGF0IGFsbC4gSWYKKwkgKiBpdCdzIHVuc2V0LCBpdCdzIGxvZ2ljYWxseSBpbmZlcnJlZCB0aGF0IHRoZXJlJ3Mgbm8gcG9pbnQgaW4KKwkgKiB0ZXN0aW5nIGZvciBpdC4KKwkgKi8KKwlyZXR1cm4gU0NTQ1JfUklFIHwgKHRvX3NjaV9wb3J0KHBvcnQpLT5zY3NjciAmIFNDU0NSX1JFSUUpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc2NpX21weGVkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwdHIpCiB7CiAJdW5zaWduZWQgc2hvcnQgc3NyX3N0YXR1cywgc2NyX3N0YXR1cywgZXJyX2VuYWJsZWQ7CkBAIC03ODYsMjIgKzgwNiwyNSBAQAogCiAJc3NyX3N0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CiAJc2NyX3N0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ1NDUik7Ci0JZXJyX2VuYWJsZWQgPSBzY3Jfc3RhdHVzICYgKFNDSV9DVFJMX0ZMQUdTX1JFSUUgfCBTQ0lfQ1RSTF9GTEFHU19SSUUpOworCWVycl9lbmFibGVkID0gc2NyX3N0YXR1cyAmIHBvcnRfcnhfaXJxX21hc2socG9ydCk7CiAKIAkvKiBUeCBJbnRlcnJ1cHQgKi8KLQlpZiAoKHNzcl9zdGF0dXMgJiBTQ3hTUl9URHhFKHBvcnQpKSAmJiAoc2NyX3N0YXR1cyAmIFNDSV9DVFJMX0ZMQUdTX1RJRSkgJiYKKwlpZiAoKHNzcl9zdGF0dXMgJiBTQ3hTUl9URHhFKHBvcnQpKSAmJiAoc2NyX3N0YXR1cyAmIFNDU0NSX1RJRSkgJiYKIAkgICAgIXMtPmNoYW5fdHgpCiAJCXJldCA9IHNjaV90eF9pbnRlcnJ1cHQoaXJxLCBwdHIpOworCiAJLyoKIAkgKiBSeCBJbnRlcnJ1cHQ6IGlmIHdlJ3JlIHVzaW5nIERNQSwgdGhlIERNQSBjb250cm9sbGVyIGNsZWFycyBSREYgLwogCSAqIERSIGZsYWdzCiAJICovCiAJaWYgKCgoc3NyX3N0YXR1cyAmIFNDeFNSX1JEeEYocG9ydCkpIHx8IHMtPmNoYW5fcngpICYmCi0JICAgIChzY3Jfc3RhdHVzICYgU0NJX0NUUkxfRkxBR1NfUklFKSkKKwkgICAgKHNjcl9zdGF0dXMgJiBTQ1NDUl9SSUUpKQogCQlyZXQgPSBzY2lfcnhfaW50ZXJydXB0KGlycSwgcHRyKTsKKwogCS8qIEVycm9yIEludGVycnVwdCAqLwogCWlmICgoc3NyX3N0YXR1cyAmIFNDeFNSX0VSUk9SUyhwb3J0KSkgJiYgZXJyX2VuYWJsZWQpCiAJCXJldCA9IHNjaV9lcl9pbnRlcnJ1cHQoaXJxLCBwdHIpOworCiAJLyogQnJlYWsgSW50ZXJydXB0ICovCiAJaWYgKChzc3Jfc3RhdHVzICYgU0N4U1JfQlJLKHBvcnQpKSAmJiBlcnJfZW5hYmxlZCkKIAkJcmV0ID0gc2NpX2JyX2ludGVycnVwdChpcnEsIHB0cik7CkBAIC05NTEsNyArOTc0LDcgQEAKIAkJc2NoZWR1bGVfd29yaygmcy0+d29ya190eCk7CiAJfSBlbHNlIGlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7CiAJCXUxNiBjdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKTsKLQkJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCAmIH5TQ0lfQ1RSTF9GTEFHU19USUUpOworCQlzY2lfb3V0KHBvcnQsIFNDU0NSLCBjdHJsICYgflNDU0NSX1RJRSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwpAQCAtMTIxNCwxNCArMTIzNywxNiBAQAogCQlpZiAobmV3ICE9IHNjcikKIAkJCXNjaV9vdXQocG9ydCwgU0NTQ1IsIG5ldyk7CiAJfQorCiAJaWYgKHMtPmNoYW5fdHggJiYgIXVhcnRfY2lyY19lbXB0eSgmcy0+cG9ydC5zdGF0ZS0+eG1pdCkgJiYKIAkgICAgcy0+Y29va2llX3R4IDwgMCkKIAkJc2NoZWR1bGVfd29yaygmcy0+d29ya190eCk7CiAjZW5kaWYKKwogCWlmICghcy0+Y2hhbl90eCB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7CiAJCS8qIFNldCBUSUUgKFRyYW5zbWl0IEludGVycnVwdCBFbmFibGUpIGJpdCBpbiBTQ1NDUiAqLwogCQljdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKTsKLQkJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCB8IFNDSV9DVFJMX0ZMQUdTX1RJRSk7CisJCXNjaV9vdXQocG9ydCwgU0NTQ1IsIGN0cmwgfCBTQ1NDUl9USUUpOwogCX0KIH0KIApAQCAtMTIzMSwyMCArMTI1NiwyNCBAQAogCiAJLyogQ2xlYXIgVElFIChUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlKSBiaXQgaW4gU0NTQ1IgKi8KIAljdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKTsKKwogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKQogCQljdHJsICY9IH4weDgwMDA7Ci0JY3RybCAmPSB+U0NJX0NUUkxfRkxBR1NfVElFOworCisJY3RybCAmPSB+U0NTQ1JfVElFOworCiAJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9zdGFydF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXVuc2lnbmVkIHNob3J0IGN0cmwgPSBTQ0lfQ1RSTF9GTEFHU19SSUUgfCBTQ0lfQ1RSTF9GTEFHU19SRUlFOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CiAKLQkvKiBTZXQgUklFIChSZWNlaXZlIEludGVycnVwdCBFbmFibGUpIGJpdCBpbiBTQ1NDUiAqLwotCWN0cmwgfD0gc2NpX2luKHBvcnQsIFNDU0NSKTsKKwljdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKSB8IHBvcnRfcnhfaXJxX21hc2socG9ydCk7CisKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikKIAkJY3RybCAmPSB+MHg0MDAwOworCiAJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCk7CiB9CiAKQEAgLTEyNTIsMTEgKzEyODEsMTMgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBjdHJsOwogCi0JLyogQ2xlYXIgUklFIChSZWNlaXZlIEludGVycnVwdCBFbmFibGUpIGJpdCBpbiBTQ1NDUiAqLwogCWN0cmwgPSBzY2lfaW4ocG9ydCwgU0NTQ1IpOworCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpCiAJCWN0cmwgJj0gfjB4NDAwMDsKLQljdHJsICY9IH4oU0NJX0NUUkxfRkxBR1NfUklFIHwgU0NJX0NUUkxfRkxBR1NfUkVJRSk7CisKKwljdHJsICY9IH5wb3J0X3J4X2lycV9tYXNrKHBvcnQpOworCiAJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCk7CiB9CiAKQEAgLTEyOTYsNyArMTMyNyw3IEBACiAJCXNjciAmPSB+MHg0MDAwOwogCQllbmFibGVfaXJxKHMtPmlycXNbMV0pOwogCX0KLQlzY2lfb3V0KHBvcnQsIFNDU0NSLCBzY3IgfCBTQ0lfQ1RSTF9GTEFHU19SSUUpOworCXNjaV9vdXQocG9ydCwgU0NTQ1IsIHNjciB8IFNDU0NSX1JJRSk7CiAJZGV2X2RiZyhwb3J0LT5kZXYsICJETUEgUnggdGltZWQgb3V0XG4iKTsKIAlzY2hlZHVsZV93b3JrKCZzLT53b3JrX3J4KTsKIH0KQEAgLTE0NDIsMTIgKzE0NzMsMzEgQEAKIAkJcy0+ZGlzYWJsZShwb3J0KTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBzY2lfc2NicnJfY2FsYyh1bnNpZ25lZCBpbnQgYWxnb19pZCwgdW5zaWduZWQgaW50IGJwcywKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZyZXEpCit7CisJc3dpdGNoIChhbGdvX2lkKSB7CisJY2FzZSBTQ0JSUl9BTEdPXzE6CisJCXJldHVybiAoKGZyZXEgKyAxNiAqIGJwcykgLyAoMTYgKiBicHMpIC0gMSk7CisJY2FzZSBTQ0JSUl9BTEdPXzI6CisJCXJldHVybiAoKGZyZXEgKyAxNiAqIGJwcykgLyAoMzIgKiBicHMpIC0gMSk7CisJY2FzZSBTQ0JSUl9BTEdPXzM6CisJCXJldHVybiAoKChmcmVxICogMikgKyAxNiAqIGJwcykgLyAoMTYgKiBicHMpIC0gMSk7CisJY2FzZSBTQ0JSUl9BTEdPXzQ6CisJCXJldHVybiAoKChmcmVxICogMikgKyAxNiAqIGJwcykgLyAoMzIgKiBicHMpIC0gMSk7CisJY2FzZSBTQ0JSUl9BTEdPXzU6CisJCXJldHVybiAoKChmcmVxICogMTAwMCAvIDMyKSAvIGJwcykgLSAxKTsKKwl9CisKKwkvKiBXYXJuLCBidXQgdXNlIGEgc2FmZSBkZWZhdWx0ICovCisJV0FSTl9PTigxKTsKKwlyZXR1cm4gKChmcmVxICsgMTYgKiBicHMpIC8gKDMyICogYnBzKSAtIDEpOworfQorCiBzdGF0aWMgdm9pZCBzY2lfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAogCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewotI2lmZGVmIENPTkZJR19TRVJJQUxfU0hfU0NJX0RNQQogCXN0cnVjdCBzY2lfcG9ydCAqcyA9IHRvX3NjaV9wb3J0KHBvcnQpOwotI2VuZGlmCiAJdW5zaWduZWQgaW50IHN0YXR1cywgYmF1ZCwgc21yX3ZhbCwgbWF4X2JhdWQ7CiAJaW50IHQgPSAtMTsKIAl1MTYgc2NmY3IgPSAwOwpAQCAtMTQ2NCw3ICsxNTE0LDcgQEAKIAogCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLCAwLCBtYXhfYmF1ZCk7CiAJaWYgKGxpa2VseShiYXVkICYmIHBvcnQtPnVhcnRjbGspKQotCQl0ID0gU0NCUlJfVkFMVUUoYmF1ZCwgcG9ydC0+dWFydGNsayk7CisJCXQgPSBzY2lfc2NicnJfY2FsYyhzLT5zY2Jycl9hbGdvX2lkLCBiYXVkLCBwb3J0LT51YXJ0Y2xrKTsKIAogCWRvIHsKIAkJc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKQEAgLTE0OTAsNyArMTU0MCw3IEBACiAJc2NpX291dChwb3J0LCBTQ1NNUiwgc21yX3ZhbCk7CiAKIAlkZXZfZGJnKHBvcnQtPmRldiwgIiVzOiBTTVIgJXgsIHQgJXgsIFNDU0NSICV4XG4iLCBfX2Z1bmNfXywgc21yX3ZhbCwgdCwKLQkJU0NTQ1JfSU5JVChwb3J0KSk7CisJCXMtPnNjc2NyKTsKIAogCWlmICh0ID4gMCkgewogCQlpZiAodCA+PSAyNTYpIHsKQEAgLTE1MDYsNyArMTU1Niw3IEBACiAJc2NpX2luaXRfcGlucyhwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnKTsKIAlzY2lfb3V0KHBvcnQsIFNDRkNSLCBzY2ZjciB8ICgodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpID8gU0NGQ1JfTUNFIDogMCkpOwogCi0Jc2NpX291dChwb3J0LCBTQ1NDUiwgU0NTQ1JfSU5JVChwb3J0KSk7CisJc2NpX291dChwb3J0LCBTQ1NDUiwgcy0+c2NzY3IpOwogCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TSF9TQ0lfRE1BCiAJLyoKQEAgLTE2NzksOSArMTcyOSwxMSBAQAogCXBvcnQtPm1hcGJhc2UJPSBwLT5tYXBiYXNlOwogCXBvcnQtPm1lbWJhc2UJPSBwLT5tZW1iYXNlOwogCi0JcG9ydC0+aXJxCT0gcC0+aXJxc1tTQ0l4X1RYSV9JUlFdOwotCXBvcnQtPmZsYWdzCT0gcC0+ZmxhZ3M7Ci0Jc2NpX3BvcnQtPnR5cGUJPSBwb3J0LT50eXBlID0gcC0+dHlwZTsKKwlwb3J0LT5pcnEJCT0gcC0+aXJxc1tTQ0l4X1RYSV9JUlFdOworCXBvcnQtPmZsYWdzCQk9IHAtPmZsYWdzOworCXNjaV9wb3J0LT50eXBlCQk9IHBvcnQtPnR5cGUgPSBwLT50eXBlOworCXNjaV9wb3J0LT5zY3NjcgkJPSBwLT5zY3NjcjsKKwlzY2lfcG9ydC0+c2NicnJfYWxnb19pZAk9IHAtPnNjYnJyX2FsZ29faWQ7CiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX1NIX1NDSV9ETUEKIAlzY2lfcG9ydC0+ZG1hX2Rldgk9IHAtPmRtYV9kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaCBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCmluZGV4IDRiYzYxNGUuLmIyMjNkNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCkBAIC0xNSwyNyArMTUsMTcgQEAKICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCiAjIGRlZmluZSBTQ1BDUiAgMHhBNDAwMDExNiAvKiAxNiBiaXQgU0NJIGFuZCBTQ0lGICovCiAjIGRlZmluZSBTQ1BEUiAgMHhBNDAwMDEzNiAvKiA4ICBiaXQgU0NJIGFuZCBTQ0lGICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAgICAgICAgIDB4MzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCiAjIGRlZmluZSBTQ0lGMAkJMHhBNDQwMDAwMAogIyBkZWZpbmUgU0NJRjIJCTB4QTQ0MTAwMDAKLSMgZGVmaW5lIFNDU01SX0lyCTB4QTQ0QTAwMDAKLSMgZGVmaW5lIElSREFfU0NJRglTQ0lGMAogIyBkZWZpbmUgU0NQQ1IgMHhBNDAwMDExNgogIyBkZWZpbmUgU0NQRFIgMHhBNDAwMDEzNgotCi0vKiBTZXQgdGhlIGNsb2NrIHNvdXJjZSwKLSAqIFNDSUYyICgweEE0NDEwMDAwKSAtPiBFeHRlcm5hbCBjbG9jaywgU0NLIHBpbiB1c2VkIGFzIGNsb2NrIGlucHV0Ci0gKiBTQ0lGMCAoMHhBNDQwMDAwMCkgLT4gSW50ZXJuYWwgY2xvY2ssIFNDSyBwaW4gYXMgc2VyaWFsIGNsb2NrIG91dHB1dAotICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpIChwb3J0LT5tYXBiYXNlID09IFNDSUYyKSA/IDB4RjMgOiAweEYwCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzY3KSB8fCBcCiAgICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3NykgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzIpCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAweDAwMzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCiAjIGRlZmluZSBQT1JUX1BUQ1IJICAgMHhBNDA1MDExRVVMCiAjIGRlZmluZSBQT1JUX1BWQ1IJICAgMHhBNDA1MDEyMlVMCiAjIGRlZmluZSBTQ0lGX09SRVIJICAgMHgwMjAwICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KQEAgLTQzLDcgKzMzLDYgQEAKICMgZGVmaW5lIFNDU1BUUjEgMHhGRkUwMDAxQyAvKiA4IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NQVFIyIDB4RkZFODAwMjAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAweDNhIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKQEAgLTUzLDM5ICs0MiwzMSBAQAogIyBkZWZpbmUgU0NTUFRSMSAweGZmZTAwMDFjIC8qIDggIGJpdCBTQ0kgKi8KICMgZGVmaW5lIFNDU1BUUjIgMHhGRkU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IFwKLQkweDMwIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLyA6IFwKLQkweDM4IC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8gKQogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQogIyBkZWZpbmUgU0NTUFRSMCAweGZlNjAwMDI0IC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NQVFIxIDB4ZmU2MTAwMjQgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjIgMHhmZTYyMDAyNCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgICAgICAgICAgMHgzOCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikKICMgZGVmaW5lIFNDU1BUUjAgMHhBNDQwMDAwMAkgIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KICMgZGVmaW5lIFBBQ1IgMHhhNDA1MDEwMAogIyBkZWZpbmUgUEJDUiAweGE0MDUwMTAyCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAgICAgICAgIDB4M0IKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykKICMgZGVmaW5lIFNDU1BUUjAgMHhmZmUwMDAxMAkvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTUFRSMSAweGZmZTEwMDEwCS8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NQVFIyIDB4ZmZlMjAwMTAJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjMgMHhmZmUzMDAxMAkvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAweDMyCS8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTAsQ0tFPTEgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKICMgZGVmaW5lIFBBRFIJCQkweEE0MDUwMTIwCiAjIGRlZmluZSBQU0RSCQkJMHhBNDA1MDEzZQogIyBkZWZpbmUgUFdEUgkJCTB4QTQwNTAxNjYKICMgZGVmaW5lIFBTQ1IJCQkweEE0MDUwMTFFCiAjIGRlZmluZSBTQ0lGX09SRVIJCTB4MDAwMQkvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDAwMzgJLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2KQogIyBkZWZpbmUgU0NQRFIwCQkJMHhBNDA1MDEzRSAgICAgIC8qIDE2IGJpdCBTQ0lGMCBQU0RSICovCiAjIGRlZmluZSBTQ1NQVFIwCQlTQ1BEUjAKICMgZGVmaW5lIFNDSUZfT1JFUgkJMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDAwMzggIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykKICMgZGVmaW5lIFNDU1BUUjAgICAgICAgICAgICAgICAgMHhhNDA1MDE2MAogIyBkZWZpbmUgU0NTUFRSMSAgICAgICAgICAgICAgICAweGE0MDUwMTNlCkBAIC05NCw2MiArNzUsMzggQEAKICMgZGVmaW5lIFNDU1BUUjQgICAgICAgICAgICAgICAgMHhhNDA1MDEyOAogIyBkZWZpbmUgU0NTUFRSNSAgICAgICAgICAgICAgICAweGE0MDUwMTI4CiAjIGRlZmluZSBTQ0lGX09SRVIgICAgICAgICAgICAgIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgICAgICAgMHgwMDM4ICAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCiAjIGRlZmluZSBTQ0lGX09SRVIgICAgICAgICAgICAgIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSUZBID8gXAotCTB4MzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovIDogXAotCTB4MzggLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLyApCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQogIyBkZWZpbmUgU0NTUFRSMiAweGZmZTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgMHgzOCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzKQotIyBkZWZpbmUgU0NJRl9CQVNFX0FERFIgICAgMHgwMTAzMDAwMAotIyBkZWZpbmUgU0NJRl9BRERSX1NINSAgICAgUEhZU19QRVJJUEhFUkFMX0JMT0NLK1NDSUZfQkFTRV9BRERSCiAjIGRlZmluZSBTQ0lGX1BUUjJfT0ZGUyAgICAweDAwMDAwMjAKLSMgZGVmaW5lIFNDSUZfTFNSMl9PRkZTICAgIDB4MDAwMDAyNAogIyBkZWZpbmUgU0NTUFRSMiAgICAgICAgICAgKChwb3J0LT5tYXBiYXNlKStTQ0lGX1BUUjJfT0ZGUykgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDTFNSMiAgICAgICAgICAgICgocG9ydC0+bWFwYmFzZSkrU0NJRl9MU1IyX09GRlMpIC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAweDM4CQkvKiBUSUU9MCxSSUU9MCwgVEU9MSxSRT0xLFJFSUU9MSAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfSDgzMDA3KSB8fCBkZWZpbmVkKENPTkZJR19IODMwNjgpCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAgICAgICAgIDB4MzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCiAjIGRlZmluZSBIODMwMF9TQ0lfRFIoY2gpICoodm9sYXRpbGUgY2hhciAqKShQMURSICsgaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19IOFMyNjc4KQotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAgICAgICAgICAweDMwIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLwogIyBkZWZpbmUgSDgzMDBfU0NJX0RSKGNoKSAqKHZvbGF0aWxlIGNoYXIgKikoUDFEUiArIGg4MzAwX3NjaV9waW5zW2NoXS5wb3J0KQogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3KQogIyBkZWZpbmUgU0NTUFRSMCAweGZlNGIwMDIwCiAjIGRlZmluZSBTQ1NQVFIxIDB4ZmU0YjAwMjAKICMgZGVmaW5lIFNDU1BUUjIgMHhmZTRiMDAyMAogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMQotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDM4CiAjIGRlZmluZSBTQ0lGX09OTFkKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykKICMgZGVmaW5lIFNDU1BUUjAgMHhmZmUwMDAyNCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTUFRSMSAweGZmZTA4MDI0IC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NQVFIyIDB4ZmZlMTAwMjAgLyogMTYgYml0IFNDSUYvSVJEQSAqLwogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOAkvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCiAjIGRlZmluZSBTQ1NQVFIwIDB4ZmY5MjMwMjAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjEgMHhmZjkyNDAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTUFRSMiAweGZmOTI1MDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDNjIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEsY2tlPTIgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKICMgZGVmaW5lIFNDU1BUUjAJMHhmZmUwMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTUFRSMQkweGZmZTEwMDI0CS8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIJMHgwMDAxCQkvKiBPdmVycnVuIGVycm9yIGJpdCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU0gyMDA3KQotLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSxDS0UxPTAgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOAotI2Vsc2UKLS8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEsQ0tFMT0xICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4M2EKLSNlbmRpZgotCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikKICMgZGVmaW5lIFNDU1BUUjAJMHhmZmVhMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwpAQCAtMTU5LDcgKzExNiw2IEBACiAjIGRlZmluZSBTQ1NQVFI0CTB4ZmZlZTAwMjQJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjUJMHhmZmVmMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJRl9PUkVSCTB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzYQkvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDEpIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMykgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2KSB8fCBcCkBAIC0xNzQsNTIgKzEzMCwyMSBAQAogIyAgZGVmaW5lIFNDU1BUUjYgMHhmZmZlQjAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyAgZGVmaW5lIFNDU1BUUjcgMHhmZmZlQjgyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBlbmRpZgotIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDM4IC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKICMgZGVmaW5lIFNDU1BUUjAgMHhmODQwMDAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTUFRSMSAweGY4NDEwMDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NQVFIyIDB4Zjg0MjAwMjAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4MzggLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKICMgZGVmaW5lIFNDU1BUUjAgMHhmZmMzMDAyMAkJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjEgMHhmZmM0MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjIgMHhmZmM1MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjMgMHhmZmM2MDAyMAkJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCi0jIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4MzgJLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogI2Vsc2UKICMgZXJyb3IgQ1BVIHN1YnR5cGUgbm90IGRlZmluZWQKICNlbmRpZgogCi0vKiBTQ1NDUiAqLwotI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19USUUgIDB4ODAgLyogYWxsICovCi0jZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JJRSAgMHg0MCAvKiBhbGwgKi8KLSNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfVEUgICAweDIwIC8qIGFsbCAqLwotI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRSAgIDB4MTAgLyogYWxsICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKSAgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykgIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApICB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSAgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikgIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQotI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDB4MDggLyogNzc1MCBTQ0lGICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCi0jZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JFSUUgKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSUZBID8gMCA6IDgpCi0jZWxzZQotI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDAKLSNlbmRpZgotLyogICAgICBTQ0lfQ1RSTF9GTEFHU19NUElFIDB4MDggICogNzcwNyBTQ0ksIDc3MDggU0NJLCA3NzA5IFNDSSwgNzc1MCBTQ0kgKi8KLS8qICAgICAgU0NJX0NUUkxfRkxBR1NfVEVJRSAweDA0ICAqIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0vKiAgICAgIFNDSV9DVFJMX0ZMQUdTX0NLRTEgMHgwMiAgKiBhbGwgKi8KLS8qICAgICAgU0NJX0NUUkxfRkxBR1NfQ0tFMCAweDAxICAqIDc3MDcgU0NJL1NDSUYsIDc3MDggU0NJLCA3NzA5IFNDSS9TQ0lGLCA3NzUwIFNDSSAqLwotCiAvKiBTQ3hTUiBTQ0kgKi8KICNkZWZpbmUgU0NJX1REUkUgIDB4ODAgLyogNzcwNyBTQ0ksIDc3MDggU0NJLCA3NzA5IFNDSSwgNzc1MCBTQ0kgKi8KICNkZWZpbmUgU0NJX1JEUkYgIDB4NDAgLyogNzcwNyBTQ0ksIDc3MDggU0NJLCA3NzA5IFNDSSwgNzc1MCBTQ0kgKi8KQEAgLTMwMCwyMyArMjI1LDExIEBACiAvKiBTQ0ZDUiAqLwogI2RlZmluZSBTQ0ZDUl9SRlJTVCAweDAwMDIKICNkZWZpbmUgU0NGQ1JfVEZSU1QgMHgwMDA0Ci0jZGVmaW5lIFNDRkNSX1RDUlNUIDB4NDAwMAogI2RlZmluZSBTQ0ZDUl9NQ0UgICAweDAwMDgKIAogI2RlZmluZSBTQ0lfTUFKT1IJCTIwNAogI2RlZmluZSBTQ0lfTUlOT1JfU1RBUlQJCTgKIAotLyogR2VuZXJpYyBzZXJpYWwgZmxhZ3MgKi8KLSNkZWZpbmUgU0NJX1JYX1RIUk9UVExFCQkweDAwMDAwMDEKLQotI2RlZmluZSBTQ0lfTUFHSUMgMHhiYWJlZmFjZQotCi0vKgotICogRXZlbnRzIGFyZSB1c2VkIHRvIHNjaGVkdWxlIHRoaW5ncyB0byBoYXBwZW4gYXQgdGltZXItaW50ZXJydXB0Ci0gKiB0aW1lLCBpbnN0ZWFkIG9mIGF0IHJzIGludGVycnVwdCB0aW1lLgotICovCi0jZGVmaW5lIFNDSV9FVkVOVF9XUklURV9XQUtFVVAJMAotCiAjZGVmaW5lIFNDSV9JTihzaXplLCBvZmZzZXQpCQkJCQlcCiAgIGlmICgoc2l6ZSkgPT0gOCkgewkJCQkJCVwKICAgICByZXR1cm4gaW9yZWFkOChwb3J0LT5tZW1iYXNlICsgKG9mZnNldCkpOwkJCVwKQEAgLTQ0NSw4ICszNTgsNiBAQAogU0NJRl9GTlMoU0NTTVIsICAweDAwLCAxNikKIFNDSUZfRk5TKFNDQlJSLCAgMHgwNCwgIDgpCiBTQ0lGX0ZOUyhTQ1NDUiwgIDB4MDgsIDE2KQotU0NJRl9GTlMoU0NURFNSLCAweDBjLCAgOCkKLVNDSUZfRk5TKFNDRkVSLCAgMHgxMCwgMTYpCiBTQ0lGX0ZOUyhTQ3hTUiwgIDB4MTQsIDE2KQogU0NJRl9GTlMoU0NGQ1IsICAweDE4LCAxNikKIFNDSUZfRk5TKFNDRkRSLCAgMHgxYywgMTYpCkBAIC00NzYsOCArMzg3LDYgQEAKIFNDSXhfRk5TKFNDeFNSLCAgMHgxNCwgMTYsIDB4MTAsIDE2KQogU0NJeF9GTlMoU0N4UkRSLCAweDI0LCAgOCwgMHgxNCwgIDgpCiBTQ0l4X0ZOUyhTQ1NQVFIsIDAsICAgICAwLCAgICAwLCAgMCkKLVNDSUZfRk5TKFNDVERTUiwgMHgwYywgIDgpCi1TQ0lGX0ZOUyhTQ0ZFUiwgIDB4MTAsIDE2KQogU0NJRl9GTlMoU0NGQ1IsICAweDE4LCAxNikKIFNDSUZfRk5TKFNDRkRSLCAgMHgxYywgMTYpCiBTQ0lGX0ZOUyhTQ0xTUiwgIDB4MjQsIDE2KQpAQCAtNTAzLDcgKzQxMiw2IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpCiBTQ0lGX0ZOUyhTQ0ZEUiwJCQkJMCwgIDAsIDB4MUMsIDE2KQogU0NJRl9GTlMoU0NTUFRSMiwJCQkwLCAgMCwgMHgyMCwgMTYpCi1TQ0lGX0ZOUyhTQ0xTUjIsCQkJMCwgIDAsIDB4MjQsIDE2KQogU0NJRl9GTlMoU0NURkRSLAkJICAgICAweDBlLCAxNiwgMHgxQywgMTYpCiBTQ0lGX0ZOUyhTQ1JGRFIsCQkgICAgIDB4MGUsIDE2LCAweDIwLCAxNikKIFNDSUZfRk5TKFNDU1BUUiwJCQkwLCAgMCwgMHgyNCwgMTYpCkBAIC01OTcsNjQgKzUwNSwzIEBACiAJcmV0dXJuIDE7CiB9CiAjZW5kaWYKLQotLyoKLSAqIFZhbHVlcyBmb3IgdGhlIEJpdFJhdGUgUmVnaXN0ZXIgKFNDQlJSKQotICoKLSAqIFRoZSB2YWx1ZXMgYXJlIGFjdHVhbGx5IGRpdmlzb3JzIGZvciBhIGZyZXF1ZW5jeSB3aGljaCBjYW4KLSAqIGJlIGludGVybmFsIHRvIHRoZSBTSDMgKDE0Ljc0NTZNSHopIG9yIGRlcml2ZWQgZnJvbSBhbiBleHRlcm5hbAotICogY2xvY2sgc291cmNlLiAgVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGUgaW50ZXJuYWwgY2xvY2sgaXMgdXNlZDsKLSAqIHRvIHN1cHBvcnQgdXNpbmcgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlLCBjb25maWcgb3B0aW9ucyBvcgotICogcG9zc2libHkgY29tbWFuZC1saW5lIG9wdGlvbnMgd291bGQgbmVlZCB0byBiZSBhZGRlZC4KLSAqCi0gKiBBbHNvLCB0byBzdXBwb3J0IHNwZWVkcyBiZWxvdyAyNDAwICh3aHk/KSB0aGUgbG93ZXIgMiBiaXRzIG9mCi0gKiB0aGUgU0NTTVIgcmVnaXN0ZXIgd291bGQgYWxzbyBuZWVkIHRvIGJlIHNldCB0byBub24temVybyB2YWx1ZXMuCi0gKgotICogLS0gR3JlZyBCYW5rcyAyN0ZlYjIwMDAKLSAqCi0gKiBBbnN3ZXI6IFRoZSBTQ0JSUiByZWdpc3RlciBpcyBvbmx5IGVpZ2h0IGJpdHMsIGFuZCB0aGUgdmFsdWUgaW4KLSAqIGl0IGdldHMgbGFyZ2VyIHdpdGggbG93ZXIgYmF1ZCByYXRlcy4gQXQgYXJvdW5kIDI0MDAgKGRlcGVuZGluZyBvbgotICogdGhlIHBlcmlwaGVyaWFsIG1vZHVsZSBjbG9jaykgeW91IHJ1biBvdXQgb2YgYml0cy4gSG93ZXZlciB0aGUKLSAqIGxvd2VyIHR3byBiaXRzIG9mIFNDU01SIGFsbG93IHRoZSBtb2R1bGUgY2xvY2sgdG8gYmUgZGl2aWRlZCBkb3duLAotICogc2NhbGluZyB0aGUgdmFsdWUgd2hpY2ggaXMgbmVlZGVkIGluIFNDQlJSLgotICoKLSAqIC0tIFN0dWFydCBNZW5lZnkgLSAyMyBNYXkgMjAwMAotICoKLSAqIEkgbWVhbnQsIHdoeSB3b3VsZCBhbnlvbmUgYm90aGVyIHdpdGggYml0cmF0ZXMgYmVsb3cgMjQwMC4KLSAqCi0gKiAtLSBHcmVnIEJhbmtzIC0gN0p1bDIwMDAKLSAqCi0gKiBZb3UgInNwZWVkaXN0IiEgIEhvdyB3aWxsIEkgdXNlIG15IDExMGJwcyBBU1ItMzMgdGVsZXR5cGUgd2l0aCBwYXBlcgotICogdGFwZSByZWFkZXIgYXMgYSBjb25zb2xlIQotICoKLSAqIC0tIE1pdGNoIERhdmlzIC0gMTUgSnVsIDIwMDAKLSAqLwotCi0jaWYgKGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgIHx8IFwKLSAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSAgfHwgXAotICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYpKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX1NIX1NIMjAwNykKLSNkZWZpbmUgU0NCUlJfVkFMVUUoYnBzLCBjbGspICgoY2xrKzE2KmJwcykvKDE2KmJwcyktMSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3M0EwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKQotI2RlZmluZSBTQ0JSUl9WQUxVRShicHMsIGNsaykgKCgoY2xrKjIpKzE2KmJwcykvKDMyKmJwcyktMSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykgfHxcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCi1zdGF0aWMgaW5saW5lIGludCBzY2Jycl9jYWxjKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicHMsIGludCBjbGspCi17Ci0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGKQotCQlyZXR1cm4gKGNsaysxNipicHMpLygzMipicHMpLTE7Ci0JZWxzZQotCQlyZXR1cm4gKChjbGsqMikrMTYqYnBzKS8oMTYqYnBzKS0xOwotfQotI2RlZmluZSBTQ0JSUl9WQUxVRShicHMsIGNsaykgc2NicnJfY2FsYyhwb3J0LCBicHMsIGNsaykKLSNlbGlmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQotI2RlZmluZSBTQ0JSUl9WQUxVRShicHMsIGNsaykgKCgoY2xrKjEwMDAvMzIpL2JwcyktMSkKLSNlbHNlIC8qIEdlbmVyaWMgU0ggKi8KLSNkZWZpbmUgU0NCUlJfVkFMVUUoYnBzLCBjbGspICgoY2xrKzE2KmJwcykvKDMyKmJwcyktMSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZmkvc2ZpX2NvcmUuYyBiL2RyaXZlcnMvc2ZpL3NmaV9jb3JlLmMKaW5kZXggY2ViYTU5My4uMDQxMTNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZmkvc2ZpX2NvcmUuYworKysgYi9kcml2ZXJzL3NmaS9zZmlfY29yZS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoc2ZpX3VzZV9pb3JlbWFwKQotCQlyZXR1cm4gaW9yZW1hcChwaHlzLCBzaXplKTsKKwkJcmV0dXJuIGlvcmVtYXBfY2FjaGUocGh5cywgc2l6ZSk7CiAJZWxzZQogCQlyZXR1cm4gZWFybHlfaW9yZW1hcChwaHlzLCBzaXplKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvY2xrL2NvcmUuYyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwppbmRleCAzZjVlMzg3Li41ZjYzYzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKKysrIGIvZHJpdmVycy9zaC9jbGsvY29yZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCmluZGV4IGEwNjcwNDYuLjFhNDc4YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCkBAIC0zNDEsOSArMzQxLDkgQEAKIC8qCiAgKiBGb3IgRE1BLCB0eF9idWYvdHhfZG1hIGhhdmUgdGhlIHNhbWUgcmVsYXRpb25zaGlwIGFzIHJ4X2J1Zi9yeF9kbWE6CiAgKiAgLSBUaGUgYnVmZmVyIGlzIGVpdGhlciB2YWxpZCBmb3IgQ1BVIGFjY2VzcywgZWxzZSBOVUxMCi0gKiAgLSBJZiB0aGUgYnVmZmVyIGlzIHZhbGlkLCBzbyBpcyBpdHMgRE1BIGFkZHJlc3NzCisgKiAgLSBJZiB0aGUgYnVmZmVyIGlzIHZhbGlkLCBzbyBpcyBpdHMgRE1BIGFkZHJlc3MKICAqCi0gKiBUaGlzIGRyaXZlciBtYW5hZ2VzIHRoZSBkbWEgYWRkcmVzc3MgdW5sZXNzIG1lc3NhZ2UtPmlzX2RtYV9tYXBwZWQuCisgKiBUaGlzIGRyaXZlciBtYW5hZ2VzIHRoZSBkbWEgYWRkcmVzcyB1bmxlc3MgbWVzc2FnZS0+aXNfZG1hX21hcHBlZC4KICAqLwogc3RhdGljIGludAogYXRtZWxfc3BpX2RtYV9tYXBfeGZlcihzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggYjAyZDBjYi4uMzRiYjE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiBzdGF0aWMgdm9pZCBzcGlkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xMDAsOSArMTAxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmCUNPTkZJR19QTQotCi1zdGF0aWMgaW50IHNwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNwaV9sZWdhY3lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewogCWludAkJCXZhbHVlID0gMDsKIAlzdHJ1Y3Qgc3BpX2RyaXZlcgkqZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyBpbnQgc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNwaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQJCQl2YWx1ZSA9IDA7CiAJc3RydWN0IHNwaV9kcml2ZXIJKmRydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOwpAQCAtMTMyLDE4ICsxMzIsOTQgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQgc3BpX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfc3VzcGVuZChkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19yZXN1bWUoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfZnJlZXplKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3RoYXcoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19wb3dlcm9mZihkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfSElCRVJOQVRFKTsKK30KKworc3RhdGljIGludCBzcGlfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19yZXN0b3JlKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKK30KICNlbHNlCi0jZGVmaW5lIHNwaV9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgc3BpX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHNwaV9wbV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3BpX3BtX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHNwaV9wbV9mcmVlemUJTlVMTAorI2RlZmluZSBzcGlfcG1fdGhhdwlOVUxMCisjZGVmaW5lIHNwaV9wbV9wb3dlcm9mZglOVUxMCisjZGVmaW5lIHNwaV9wbV9yZXN0b3JlCU5VTEwKICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3BpX3BtID0geworCS5zdXNwZW5kID0gc3BpX3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IHNwaV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IHNwaV9wbV9mcmVlemUsCisJLnRoYXcgPSBzcGlfcG1fdGhhdywKKwkucG93ZXJvZmYgPSBzcGlfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBzcGlfcG1fcmVzdG9yZSwKKwlTRVRfUlVOVElNRV9QTV9PUFMoCisJCXBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kLAorCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAorCQlwbV9nZW5lcmljX3J1bnRpbWVfaWRsZQorCSkKK307CisKIHN0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInNwaSIsCiAJLmRldl9hdHRycwk9IHNwaV9kZXZfYXR0cnMsCiAJLm1hdGNoCQk9IHNwaV9tYXRjaF9kZXZpY2UsCiAJLnVldmVudAkJPSBzcGlfdWV2ZW50LAotCS5zdXNwZW5kCT0gc3BpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzcGlfcmVzdW1lLAorCS5wbQkJPSAmc3BpX3BtLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV9idXNfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaWRldi5jIGIvZHJpdmVycy9zcGkvc3BpZGV2LmMKaW5kZXggNGU2MjQ1ZS4uNjAzNDI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpZGV2LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpZGV2LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogCiAvKgotICogVGhpcyBzdXBwb3J0cyBhY2NjZXNzIHRvIFNQSSBkZXZpY2VzIHVzaW5nIG5vcm1hbCB1c2Vyc3BhY2UgSS9PIGNhbGxzLgorICogVGhpcyBzdXBwb3J0cyBhY2Nlc3MgdG8gU1BJIGRldmljZXMgdXNpbmcgbm9ybWFsIHVzZXJzcGFjZSBJL08gY2FsbHMuCiAgKiBOb3RlIHRoYXQgd2hpbGUgdHJhZGl0aW9uYWwgVU5JWC9QT1NJWCBJL08gc2VtYW50aWNzIGFyZSBoYWxmIGR1cGxleCwKICAqIGFuZCBvZnRlbiBtYXNrIG1lc3NhZ2UgYm91bmRhcmllcywgZnVsbCBTUEkgc3VwcG9ydCByZXF1aXJlcyBmdWxsIGR1cGxleAogICogdHJhbnNmZXJzLiAgVGhlcmUgYXJlIHNldmVyYWwga2luZHMgb2YgaW50ZXJuYWwgbWVzc2FnZSBib3VuZGFyaWVzIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCmluZGV4IGJkYzYzMmI2Li41YzhmY2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvS2NvbmZpZwpAQCAtMTE5LDE2ICsxMTksMTggQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVtcmFyL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc203eHgvS2NvbmZpZyIKQEAgLTE0MSw4ICsxNDMsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90aS1zdC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcveGdpZmIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbXNtL0tjb25maWciCkBAIC0xNzUsNSArMTc1LDkgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9LY29uZmlnIgorCiBlbmRpZiAjICFTVEFHSU5HX0VYQ0xVREVfQlVJTEQKIGVuZGlmICMgU1RBR0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCmluZGV4IDNlZGE1YzcuLmQ1Mzg4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKQEAgLTQyLDE4ICs0MiwxOCBAQAogb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2Lwogb2JqLSQoQ09ORklHX1ZNRV9CVVMpCQkrPSB2bWUvCiBvYmotJChDT05GSUdfTVJTVF9SQVJfSEFORExFUikJKz0gbWVtcmFyLworb2JqLSQoQ09ORklHX0RYX1NFUCkgICAgICAgICAgICArPSBzZXAvCiBvYmotJChDT05GSUdfSUlPKQkJKz0gaWlvLworb2JqLSQoQ09ORklHX0NTNTUzNV9HUElPKQkrPSBjczU1MzVfZ3Bpby8KIG9iai0kKENPTkZJR19aUkFNKQkJKz0genJhbS8KIG9iai0kKENPTkZJR19XTEFHUzQ5X0gyKQkrPSB3bGFnczQ5X2gyLwogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDI1KQkrPSB3bGFnczQ5X2gyNS8KLW9iai0kKENPTkZJR19CQVRNQU5fQURWKQkrPSBiYXRtYW4tYWR2Lwogb2JqLSQoQ09ORklHX1NBTVNVTkdfTEFQVE9QKQkrPSBzYW1zdW5nLWxhcHRvcC8KIG9iai0kKENPTkZJR19GQl9TTTdYWCkJCSs9IHNtN3h4Lwogb2JqLSQoQ09ORklHX1ZJREVPX0RUMzE1NSkJKz0gZHQzMTU1djRsLwogb2JqLSQoQ09ORklHX0NSWVNUQUxIRCkJCSs9IGNyeXN0YWxoZC8KIG9iai0kKENPTkZJR19DWFQxRTEpCQkrPSBjeHQxZTEvCiBvYmotJChDT05GSUdfVElfU1QpCQkrPSB0aS1zdC8KLW9iai0kKENPTkZJR19BRElTMTYyNTUpCQkrPSBhZGlzMTYyNTUvCiBvYmotJChDT05GSUdfRkJfWEdJKQkJKz0geGdpZmIvCiBvYmotJChDT05GSUdfTVNNX1NUQUdJTkcpCSs9IG1zbS8KIG9iai0kKENPTkZJR19FQVNZQ0FQKQkJKz0gZWFzeWNhcC8KQEAgLTY4LDMgKzY4LDUgQEAKIG9iai0kKENPTkZJR19GVDEwMDApCQkrPSBmdDEwMDAvCiBvYmotJChDT05GSUdfU05EX0lOVEVMX1NTVCkJCSs9IGludGVsX3NzdC8KIG9iai0kKENPTkZJR19TUEVBS1VQKQkrPSBzcGVha3VwLworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0NMRUFSUEFEX1RNMTIxNykJKz0gY3B0bTEyMTcvCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fU1lOQVBUSUNTX0kyQ19STUk0KQkrPSBzdGVfcm1pNC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4M2MxZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1jb25maWcgQURJUzE2MjU1Ci0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI1MC8xNjI1NSIKLQlkZXBlbmRzIG9uIFNQSSAmJiBTWVNGUwotCS0tLWhlbHAtLS0KLQlJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCi0JQURJUzE2MjUwLzE2MjU1IExvdyBQb3dlciBHeXJvc2NvcGUuIFRoZSBkcml2ZXIgZXhwb3NlcwotCW9yaWVudGF0aW9uIGFuZCBneXJvc2NvcGUgdmFsdWUsIGFzIHdlbGwgYXMgc2FtcGxlIHJhdGUKLQl0byB0aGUgc3lzZnMuCi0KLQlUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKLQl3aWxsIGJlIGNhbGxlZCBhZGlzMTYyNTUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzOTA4MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb2JqLSQoQ09ORklHX0FESVMxNjI1NSkJCSs9IGFkaXMxNjI1NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5jIGIvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0ZDdjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qCi0gKiBBbmFsb2cgRGV2aWNlcyBBRElTMTYyNTAvQURJUzE2MjU1IExvdyBQb3dlciBHeXJvc2NvcGUKLSAqCi0gKiBXcml0dGVuIGJ5OiBNYXR0aGlhcyBCcnVnZ2VyIDxtX2JydWdnZXJAd2ViLmRlPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBGcmF1bmhvZmVyIEluc3RpdHV0ZSBmb3IgSW50ZWdyYXRlZCBDaXJjdWl0cwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0vKgotICogVGhlIGRyaXZlciBqdXN0IGhhcyBhIGJhcmUgaW50ZXJmYWNlIHRvIHRoZSBzeXNmcyAoc2FtcGxlIHJhdGUgaW4gSHosCi0gKiBvcmllbnRhdGlvbiAoeCwgeSwgeikgYW5kIGd5cm9zY29wZSBkYXRhIGluIMKwL3NlYy4KLSAqCi0gKiBJdCBzaG91bGQgYmUgYWRkZWQgdG8gaWlvIHN1YnN5c3RlbSB3aGVuIHRoaXMgaGFzIGxlZnQgc3RhZ2luZy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlICJhZGlzMTYyNTUuaCIKLQotI2RlZmluZSBBRElTX1NUQVRVUyAgICAgICAgMHgzZAotI2RlZmluZSBBRElTX1NNUExfUFJEX01TQiAgMHgzNwotI2RlZmluZSBBRElTX1NNUExfUFJEX0xTQiAgMHgzNgotI2RlZmluZSBBRElTX01TQ19DVFJMX01TQiAgMHgzNQotI2RlZmluZSBBRElTX01TQ19DVFJMX0xTQiAgMHgzNAotI2RlZmluZSBBRElTX0dQSU9fQ1RSTCAgICAgMHgzMwotI2RlZmluZSBBRElTX0FMTV9TTVBMMSAgICAgMHgyNQotI2RlZmluZSBBRElTX0FMTV9NQUcxICAgICAgMHgyMQotI2RlZmluZSBBRElTX0dZUk9fU0NBTEUgICAgMHgxNwotI2RlZmluZSBBRElTX0dZUk9fT1VUICAgICAgMHgwNQotI2RlZmluZSBBRElTX1NVUFBMWV9PVVQgICAgMHgwMwotI2RlZmluZSBBRElTX0VORFVSQU5DRSAgICAgMHgwMQotCi0vKgotICogZGF0YSBzdHJ1Y3R1cmUgZm9yIGV2ZXJ5IHNlbnNvcgotICoKLSAqIEBkZXY6ICAgICAgIERyaXZlciBtb2RlbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlLgotICogQHNwaTogICAgICAgUG9pbnRlciB0byB0aGUgc3BpIGRldmljZSB3aGljaCB3aWxsIG1hbmFnZSBpL28gdG8gc3BpIGJ1cy4KLSAqIEBkYXRhOiAgICAgIExhc3QgcmVhZCBkYXRhIGZyb20gZGV2aWNlLgotICogQGlycV9hZGlzOiAgR1BJTyBOdW1iZXIgb2YgSVJRIHNpZ25hbAotICogQGlycTogICAgICAgaXJxIGxpbmUgbWFuYWdlIGJ5IGtlcm5lbAotICogQG5lZ2F0aXZlOiAgaW5kaWNhdGVzIGlmIHNlbnNvciBpcyB1cHNpZGUgZG93biAobmVnYXRpdmUgPT0gMSkKLSAqIEBkaXJlY3Rpb246IGluZGljYXRlcyBheGlzICh4LCB5LCB6KSB0aGUgc2Vuc29yIGlzIG1lYXNzdXJpbmcKLSAqLwotc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSBkZXY7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKLQlzMTYgZGF0YTsKLQlpbnQgaXJxOwotCXU4IG5lZ2F0aXZlOwotCWNoYXIgZGlyZWN0aW9uOwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzLAotCQkJCQl1OCBhZHIsCi0JCQkJCXU4ICpyYnVmKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBzcGlhZGlzLT5zcGk7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIxLCB4ZmVyMjsKLQl1OCAqYnVmLCAqcng7Ci0JaW50IHJldDsKLQotCWJ1ZiA9IGt6YWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJ4ID0ga3phbGxvYyg0LCBHRlBfS0VSTkVMKTsKLQlpZiAocnggPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9idWY7Ci0JfQotCi0JYnVmWzBdID0gYWRyOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQltZW1zZXQoJnhmZXIxLCAwLCBzaXplb2YoeGZlcjEpKTsKLQltZW1zZXQoJnhmZXIyLCAwLCBzaXplb2YoeGZlcjIpKTsKLQotCXhmZXIxLnR4X2J1ZiA9IGJ1ZjsKLQl4ZmVyMS5yeF9idWYgPSBidWYgKyAyOwotCXhmZXIxLmxlbiA9IDI7Ci0JeGZlcjEuZGVsYXlfdXNlY3MgPSA5OwotCi0JeGZlcjIudHhfYnVmID0gcnggKyAyOwotCXhmZXIyLnJ4X2J1ZiA9IHJ4OwotCXhmZXIyLmxlbiA9IDI7Ci0KLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjEsICZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyMiwgJm1zZyk7Ci0KLQlyZXQgPSBzcGlfc3luYyhzcGksICZtc2cpOwotCWlmIChyZXQgPT0gMCkgewotCQlyYnVmWzBdID0gcnhbMF07Ci0JCXJidWZbMV0gPSByeFsxXTsKLQl9Ci0KLQlrZnJlZShyeCk7Ci1lcnJfYnVmOgotCWtmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzLAotCQkJCQl1OCBhZHIxLAotCQkJCQl1OCBhZHIyLAotCQkJCQl1OCAqd2J1ZikKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gc3BpYWRpcy0+c3BpOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAgIG1zZzsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICB4ZmVyMSwgeGZlcjI7Ci0JdTggICAgICAgKmJ1ZiwgKnJ4OwotCWludCAgICAgICAgIHJldDsKLQotCWJ1ZiA9IGttYWxsb2MoNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJ4ID0ga3phbGxvYyg0LCBHRlBfS0VSTkVMKTsKLQlpZiAocnggPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9idWY7Ci0JfQotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQltZW1zZXQoJnhmZXIxLCAwLCBzaXplb2YoeGZlcjEpKTsKLQltZW1zZXQoJnhmZXIyLCAwLCBzaXplb2YoeGZlcjIpKTsKLQotCWJ1ZlswXSA9IGFkcjEgfCAweDgwOwotCWJ1ZlsxXSA9ICp3YnVmOwotCi0JYnVmWzJdID0gYWRyMiB8IDB4ODA7Ci0JYnVmWzNdID0gKih3YnVmICsgMSk7Ci0KLQl4ZmVyMS50eF9idWYgPSBidWY7Ci0JeGZlcjEucnhfYnVmID0gcng7Ci0JeGZlcjEubGVuID0gMjsKLQl4ZmVyMS5kZWxheV91c2VjcyA9IDk7Ci0KLQl4ZmVyMi50eF9idWYgPSBidWYrMjsKLQl4ZmVyMi5yeF9idWYgPSByeCsyOwotCXhmZXIyLmxlbiA9IDI7Ci0KLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcjEsICZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyMiwgJm1zZyk7Ci0KLQlyZXQgPSBzcGlfc3luYyhzcGksICZtc2cpOwotCWlmIChyZXQgIT0gMCkKLQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAid3JpdGUgZGF0YSB0byAlI3ggJSN4IGZhaWxlZFxuIiwKLQkJCQlidWZbMF0sIGJ1ZlsyXSk7Ci0KLQlrZnJlZShyeCk7Ci1lcnJfYnVmOgotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlycXJldHVybl90IGFkaXNfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcyA9IGRldl9pZDsKLQlpbnQgc3RhdHVzOwotCXUxNiB2YWx1ZSA9IDA7Ci0KLQlzdGF0dXMgPSAgc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19HWVJPX09VVCwgKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU1BJIEZBSUxFRFxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBwZXJmb3JtIG9uIG5ldyBkYXRhIG9ubHkuLi4gKi8KLQlpZiAodmFsdWUgJiAweDgwMDApIHsKLQkJLyogZGVsZXRlIGVycm9yIGFuZCBuZXcgZGF0YSBiaXQgKi8KLQkJdmFsdWUgPSB2YWx1ZSAmIDB4M2ZmZjsKLQkJLyogc2V0IG5lZ2F0aXZlIHZhbHVlICovCi0JCWlmICh2YWx1ZSAmIDB4MjAwMCkKLQkJCXZhbHVlID0gdmFsdWUgfCAweGUwMDA7Ci0KLQkJaWYgKGxpa2VseShzcGlhZGlzLT5uZWdhdGl2ZSkpCi0JCQl2YWx1ZSA9IC12YWx1ZTsKLQotCQlzcGlhZGlzLT5kYXRhID0gKHMxNikgdmFsdWU7Ci0JfQotCi1leGl0OgotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3NpemVfdCBhZGlzMTYyNTVfc2hvd19kYXRhKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBzcGlhZGlzLT5kYXRhKTsKLX0KLURFVklDRV9BVFRSKGRhdGEsIFNfSVJVR08gLCBhZGlzMTYyNTVfc2hvd19kYXRhLCBOVUxMKTsKLQotc3NpemVfdCBhZGlzMTYyNTVfc2hvd19kaXJlY3Rpb24oc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWNcbiIsIHNwaWFkaXMtPmRpcmVjdGlvbik7Ci19Ci1ERVZJQ0VfQVRUUihkaXJlY3Rpb24sIFNfSVJVR08gLCBhZGlzMTYyNTVfc2hvd19kaXJlY3Rpb24sIE5VTEwpOwotCi1zc2l6ZV90IGFkaXMxNjI1NV9zaG93X3NhbXBsZV9yYXRlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwotCWludCBzdGF0dXMgPSAwOwotCXUxNiB2YWx1ZSA9IDA7Ci0JaW50IHRzID0gMDsKLQotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfU01QTF9QUkRfTVNCLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh2YWx1ZSAmIDB4ODApIHsKLQkJLyogdGltZWJhc2UgPSA2MC41NCBtcyAqLwotCQl0cyA9IDYwNTQwICogKCgweDdmICYgdmFsdWUpICsgMSk7Ci0JfSBlbHNlIHsKLQkJLyogdGltZWJhc2UgPSAxLjk1MyBtcyAqLwotCQl0cyA9IDE5NTMgKiAoKDB4N2YgJiB2YWx1ZSkgKyAxKTsKLQl9Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKDEwMDAqMTAwMCkvdHMpOwotfQotREVWSUNFX0FUVFIoc2FtcGxlX3JhdGUsIFNfSVJVR08gLCBhZGlzMTYyNTVfc2hvd19zYW1wbGVfcmF0ZSwgTlVMTCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNTVfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9kYXRhLmF0dHIsCi0JJmRldl9hdHRyX2RpcmVjdGlvbi5hdHRyLAotCSZkZXZfYXR0cl9zYW1wbGVfcmF0ZS5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI1NV9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGFkaXMxNjI1NV9hdHRyaWJ1dGVzLAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBzcGlfYWRpczE2MjU1X3NodXRkb3duKHN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMpCi17Ci0JdTE2IHZhbHVlID0gMDsKLQkvKiB0dXJuIHNlbnNvciBvZmYgKi8KLQlzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCUFESVNfU01QTF9QUkRfTVNCLCBBRElTX1NNUExfUFJEX0xTQiwKLQkJCSh1OCAqKSZ2YWx1ZSk7Ci0Jc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQlBRElTX01TQ19DVFJMX01TQiwgQURJU19NU0NfQ1RSTF9MU0IsCi0JCQkodTggKikmdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfYnJpbmd1cChzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzKQotewotCWludCBzdGF0dXMgPSAwOwotCXUxNiB2YWx1ZSA9IDA7Ci0KLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX0dZUk9fU0NBTEUsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCWlmICh2YWx1ZSAhPSAweDA4MDApIHsKLQkJZGV2X3dhcm4oJnNwaWFkaXMtPnNwaS0+ZGV2LCAiU2NhbGUgZmFjdG9yIGlzIG5vbmUgZGVmYXVsdCAiCi0JCQkJInZhbHVlICglLjR4KVxuIiwgdmFsdWUpOwotCX0KLQotCS8qIHRpbWViYXNlID0gMS45NTMgbXMsIE5zID0gMCAtPiA1MTIgSHogc2FtcGxlIHJhdGUgKi8KLQl2YWx1ZSA9ICAweDAwMDE7Ci0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQkJQURJU19TTVBMX1BSRF9NU0IsIEFESVNfU01QTF9QUkRfTFNCLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQotCS8qIHN0YXJ0IGludGVybmFsIHNlbGYtdGVzdCAqLwotCXZhbHVlID0gMHgwNDAwOwotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAotCQkJCUFESVNfTVNDX0NUUkxfTVNCLCBBRElTX01TQ19DVFJMX0xTQiwKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0KLQkvKiB3YWl0IDM1IG1zIHRvIGZpbmlzaCBzZWxmLXRlc3QgKi8KLQltc2xlZXAoMzUpOwotCi0JdmFsdWUgPSAweDAwMDA7Ci0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19TVEFUVVMsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCi0JaWYgKHZhbHVlICYgMHgyMykgewotCQlpZiAodmFsdWUgJiAweDIwKSB7Ci0JCQlkZXZfd2Fybigmc3BpYWRpcy0+c3BpLT5kZXYsICJzZWxmLXRlc3QgZXJyb3JcbiIpOwotCQkJc3RhdHVzID0gLUVOT0RFVjsKLQkJCWdvdG8gZXJyOwotCQl9IGVsc2UgaWYgKHZhbHVlICYgMHgzKQl7Ci0JCQlkZXZfd2Fybigmc3BpYWRpcy0+c3BpLT5kZXYsICJTZW5zb3Igdm9sdGFnZSAiCi0JCQkJCQkib3V0IG9mIHJhbmdlLlxuIik7Ci0JCQlzdGF0dXMgPSAtRU5PREVWOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgaW50ZXJydXB0IHRvIGFjdGl2ZSBoaWdoIG9uIERJTzAgd2hlbiBkYXRhIHJlYWR5ICovCi0JdmFsdWUgPSAweDAwMDY7Ci0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQkJQURJU19NU0NfQ1RSTF9NU0IsIEFESVNfTVNDX0NUUkxfTFNCLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQlyZXR1cm4gc3RhdHVzOwotCi1lcnI6Ci0Jc3BpX2FkaXMxNjI1NV9zaHV0ZG93bihzcGlhZGlzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfYWRpczE2MjU1X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0KLQlzdHJ1Y3QgYWRpczE2MjU1X2luaXRfZGF0YSAqaW5pdF9kYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICAqc3BpYWRpczsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXNwaWFkaXMgPSBremFsbG9jKHNpemVvZigqc3BpYWRpcyksIEdGUF9LRVJORUwpOwotCWlmICghc3BpYWRpcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGlhZGlzLT5zcGkgPSBzcGk7Ci0Jc3BpYWRpcy0+ZGlyZWN0aW9uID0gaW5pdF9kYXRhLT5kaXJlY3Rpb247Ci0KLQlpZiAoaW5pdF9kYXRhLT5uZWdhdGl2ZSkKLQkJc3BpYWRpcy0+bmVnYXRpdmUgPSAxOwotCi0Jc3RhdHVzID0gZ3Bpb19yZXF1ZXN0KGluaXRfZGF0YS0+aXJxLCAiYWRpczE2MjU1Iik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQotCXN0YXR1cyA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGluaXRfZGF0YS0+aXJxKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZ3Bpb19lcnI7Ci0KLQlzcGlhZGlzLT5pcnEgPSBncGlvX3RvX2lycShpbml0X2RhdGEtPmlycSk7Ci0KLQlzdGF0dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycShzcGlhZGlzLT5pcnEsCi0JCQlOVUxMLCBhZGlzX2lycV90aHJlYWQsCi0JCQlJUlFGX0RJU0FCTEVELCAiYWRpcy1kcml2ZXIiLCBzcGlhZGlzKTsKLQotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIklSUSByZXF1ZXN0IGZhaWxlZFxuIik7Ci0JCWdvdG8gZ3Bpb19lcnI7Ci0JfQotCi0JZGV2X2RiZygmc3BpLT5kZXYsICJHUElPICVkIElSUSAlZFxuIiwgaW5pdF9kYXRhLT5pcnEsIHNwaWFkaXMtPmlycSk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBzcGlhZGlzKTsKLQlzdGF0dXMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNwaS0+ZGV2LmtvYmosICZhZGlzMTYyNTVfYXR0cl9ncm91cCk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGlycV9lcnI7Ci0KLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X2JyaW5ndXAoc3BpYWRpcyk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIHN5c2ZzX2VycjsKLQotCWRldl9pbmZvKCZzcGktPmRldiwgInNwaV9hZGlzMTYyNTUgZHJpdmVyIGFkZGVkIVxuIik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotCi1zeXNmc19lcnI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZzcGlhZGlzLT5zcGktPmRldi5rb2JqLCAmYWRpczE2MjU1X2F0dHJfZ3JvdXApOwotaXJxX2VycjoKLQlmcmVlX2lycShzcGlhZGlzLT5pcnEsIHNwaWFkaXMpOwotZ3Bpb19lcnI6Ci0JZ3Bpb19mcmVlKGluaXRfZGF0YS0+aXJxKTsKLWVycjoKLQlrZnJlZShzcGlhZGlzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzcGlfYWRpczE2MjU1X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgICpzcGlhZGlzICAgID0gZGV2X2dldF9kcnZkYXRhKCZzcGktPmRldik7Ci0KLQlzcGlfYWRpczE2MjU1X3NodXRkb3duKHNwaWFkaXMpOwotCi0JZnJlZV9pcnEoc3BpYWRpcy0+aXJxLCBzcGlhZGlzKTsKLQlncGlvX2ZyZWUoaXJxX3RvX2dwaW8oc3BpYWRpcy0+aXJxKSk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwaWFkaXMtPnNwaS0+ZGV2LmtvYmosICZhZGlzMTYyNTVfYXR0cl9ncm91cCk7Ci0KLQlrZnJlZShzcGlhZGlzKTsKLQotCWRldl9pbmZvKCZzcGktPmRldiwgInNwaV9hZGlzMTYyNTUgZHJpdmVyIHJlbW92ZWQhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHNwaV9hZGlzMTYyNTVfZHJ2ID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gICJzcGlfYWRpczE2MjU1IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUgPSBzcGlfYWRpczE2MjU1X3Byb2JlLAotCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHNwaV9hZGlzMTYyNTVfcmVtb3ZlKSwKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgX19pbml0IHNwaV9hZGlzMTYyNTVfaW5pdCh2b2lkKQotewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZzcGlfYWRpczE2MjU1X2Rydik7Ci19Ci1tb2R1bGVfaW5pdChzcGlfYWRpczE2MjU1X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3BpX2FkaXMxNjI1NV9leGl0KHZvaWQpCi17Ci0Jc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZzcGlfYWRpczE2MjU1X2Rydik7Ci19Ci1tb2R1bGVfZXhpdChzcGlfYWRpczE2MjU1X2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXR0aGlhcyBCcnVnZ2VyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBkZXZpY2UgZHJpdmVyIGZvciBBRElTMTYyNTUgc2Vuc29yIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5oIGIvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9hZGlzMTYyNTUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMDcwMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2lmbmRlZiBBRElTMTYyNTVfSAotI2RlZmluZSBBRElTMTYyNTVfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IGFkaXMxNjI1NV9pbml0X2RhdGEgewotCWNoYXIgZGlyZWN0aW9uOwotCXU4ICAgbmVnYXRpdmU7Ci0JaW50ICBpcnE7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCmluZGV4IDAxNmM2ZjcuLjdiYjdkYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9hc3VzX29sZWQuYwpAQCAtNzAsNyArNzAsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhzdGFydF9vZmYsCiAJCSAiU2V0IHRvIDEgdG8gc3dpdGNoIG9mZiBPTEVEIGRpc3BsYXkgYWZ0ZXIgaXQgaXMgYXR0YWNoZWQiKTsKIAotZW51bSBvbGVkX3BhY2tfbW9kZXsKK2VudW0gb2xlZF9wYWNrX21vZGUgewogCVBBQ0tfTU9ERV9HMSwKIAlQQUNLX01PREVfRzUwLAogCVBBQ0tfTU9ERV9MQVNUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL2hpZi9zZGlvL2xpbnV4X3NkaW8vc3JjL2hpZi5jIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9oaWYvc2Rpby9saW51eF9zZGlvL3NyYy9oaWYuYwppbmRleCBjMzA3YTU1Li5lOTY2NjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL2hpZi9zZGlvL2xpbnV4X3NkaW8vc3JjL2hpZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvaGlmL3NkaW8vbGludXhfc2Rpby9zcmMvaGlmLmMKQEAgLTg3Niw3ICs4NzYsNyBAQAogdm9pZAogSElGVW5NYXNrSW50ZXJydXB0KEhJRl9ERVZJQ0UgKmRldmljZSkKIHsKLSAgICBpbnQgcmV0OzsKKyAgICBpbnQgcmV0OwogCiAgICAgQVJfREVCVUdfQVNTRVJUKGRldmljZSAhPSBOVUxMKTsKICAgICBBUl9ERUJVR19BU1NFUlQoZGV2aWNlLT5mdW5jICE9IE5VTEwpOwpAQCAtMTE4OCw3ICsxMTg4LDcgQEAKICAgICBISUZfREVWSUNFICpoaWZkZXZpY2U7CiAgICAgQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19UUkFDRSwgKCJBUjYwMDA6IGFkZEhpZkRldmljZVxuIikpOwogICAgIEFSX0RFQlVHX0FTU0VSVChmdW5jICE9IE5VTEwpOwotICAgIGhpZmRldmljZSA9IChISUZfREVWSUNFICopa3phbGxvYyhzaXplb2YoSElGX0RFVklDRSksIEdGUF9LRVJORUwpOworICAgIGhpZmRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKEhJRl9ERVZJQ0UpLCBHRlBfS0VSTkVMKTsKICAgICBBUl9ERUJVR19BU1NFUlQoaGlmZGV2aWNlICE9IE5VTEwpOwogI2lmIEhJRl9VU0VfRE1BX0JPVU5DRV9CVUZGRVIKICAgICBoaWZkZXZpY2UtPmRtYV9idWZmZXIgPSBrbWFsbG9jKEhJRl9ETUFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9vcy9saW51eC9hcjYwMDBfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2FyNjAwMF9kcnYuYwppbmRleCBhNjU5ZjcwLi4xMjZhMzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2FyNjAwMF9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2FyNjAwMF9kcnYuYwpAQCAtNDQzOSw3ICs0NDM5LDcgQEAKICAgICAgICAgZm9yIChpID0gYXNzb2NfcmVxX2llX3BvczsgaSA8IGFzc29jX3JlcV9pZV9wb3MgKyBhc3NvY1JlcUxlbiAtIDQ7IGkrKykgewogICAgICAgICAgICAgQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19XTEFOX0NPTk5FQ1QsKCIlMi4yeCAiLCBhc3NvY0luZm9baV0pKTsKICAgICAgICAgICAgIHNwcmludGYocG9zLCAiJTIuMngiLCBhc3NvY0luZm9baV0pOwotICAgICAgICAgICAgcG9zICs9IDI7OworICAgICAgICAgICAgcG9zICs9IDI7CiAgICAgICAgIH0KICAgICAgICAgQVJfREVCVUdfUFJJTlRGKEFUSF9ERUJVR19XTEFOX0NPTk5FQ1QsKCJcbiIpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2F1dG9mcy9kaXJoYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXV0b2ZzL2Rpcmhhc2guYwppbmRleCA4ZjNlMmI4Li5kM2Y0MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYXV0b2ZzL2Rpcmhhc2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMzAsNyArMzAsNyBAQAogCQkJIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQogewogCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsgICAvKiBVbmxpbmsgZnJvbSBjdXJyZW50IHBvc2l0aW9uICovCi0JYXV0b2ZzX2luaXRfdXNhZ2UoZGgsZW50KTsgIC8qIFJlbGluayBhdCBxdWV1ZSB0YWlsICovCisJYXV0b2ZzX2luaXRfdXNhZ2UoZGgsIGVudCk7ICAvKiBSZWxpbmsgYXQgcXVldWUgdGFpbCAqLwogfQogCiBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19leHBpcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTQ1LDE3ICs0NSwxOCBAQAogCQlzdHJ1Y3QgcGF0aCBwYXRoOwogCQlpbnQgdW1vdW50X29rOwogCi0JCWlmICggbGlzdF9lbXB0eSgmZGgtPmV4cGlyeV9oZWFkKSB8fCBzYmktPmNhdGF0b25pYyApCisJCWlmIChsaXN0X2VtcHR5KCZkaC0+ZXhwaXJ5X2hlYWQpIHx8IHNiaS0+Y2F0YXRvbmljKQogCQkJcmV0dXJuIE5VTEw7CS8qIE5vIGVudHJpZXMgKi8KIAkJLyogV2Uga2VlcCB0aGUgbGlzdCBzb3J0ZWQgYnkgbGFzdF91c2FnZSBhbmQgd2FudCBvbGQgc3R1ZmYgKi8KLQkJZW50ID0gbGlzdF9lbnRyeShkaC0+ZXhwaXJ5X2hlYWQubmV4dCwgc3RydWN0IGF1dG9mc19kaXJfZW50LCBleHApOworCQllbnQgPSBsaXN0X2VudHJ5KGRoLT5leHBpcnlfaGVhZC5uZXh0LAorCQkJCQkJc3RydWN0IGF1dG9mc19kaXJfZW50LCBleHApOwogCQlpZiAoamlmZmllcyAtIGVudC0+bGFzdF91c2FnZSA8IHRpbWVvdXQpCiAJCQlicmVhazsKIAkJLyogTW92ZSB0byBlbmQgb2YgbGlzdCBpbiBjYXNlIGV4cGlyeSBpc24ndCBkZXNpcmFibGUgKi8KIAkJYXV0b2ZzX3VwZGF0ZV91c2FnZShkaCwgZW50KTsKIAogCQkvKiBDaGVjayB0byBzZWUgdGhhdCBlbnRyeSBpcyBleHBpcmFibGUgKi8KLQkJaWYgKCBlbnQtPmlubyA8IEFVVE9GU19GSVJTVF9ESVJfSU5PICkKKwkJaWYgKGVudC0+aW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8pCiAJCQlyZXR1cm4gZW50OyAvKiBTeW1saW5rcyBhcmUgYWx3YXlzIGV4cGlyYWJsZSAqLwogCiAJCS8qIEdldCB0aGUgZGVudHJ5IGZvciB0aGUgYXV0b2ZzIHN1YmRpcmVjdG9yeSAqLwpAQCAtNjMsMTQgKzY0LDE1IEBACiAKIAkJaWYgKCFwYXRoLmRlbnRyeSkgewogCQkJLyogU2hvdWxkIG9ubHkgaGFwcGVuIGluIGNhdGF0b25pYyBtb2RlICovCi0JCQlwcmludGsoImF1dG9mczogZGVudHJ5ID09IE5VTEwgYnV0IGlub2RlIHJhbmdlIGlzIGRpcmVjdG9yeSwgZW50cnkgJXNcbiIsIGVudC0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYXV0b2ZzOiBkZW50cnkgPT0gTlVMTCBidXQgaW5vZGUgXAorCQkJCXJhbmdlIGlzIGRpcmVjdG9yeSwgZW50cnkgJXNcbiIsIGVudC0+bmFtZSk7CiAJCQlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWlmICghcGF0aC5kZW50cnktPmRfaW5vZGUpIHsKIAkJCWRwdXQocGF0aC5kZW50cnkpOwotCQkJcHJpbnRrKCJhdXRvZnM6IG5lZ2F0aXZlIGRlbnRyeSBvbiBleHBpcnkgcXVldWU6ICVzXG4iLAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImF1dG9mczogbmVnYXRpdmUgZGVudHJ5IG9uIGV4cGlyeSBxdWV1ZTogJXNcbiIsCiAJCQkgICAgICAgZW50LT5uYW1lKTsKIAkJCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsKIAkJCWNvbnRpbnVlOwpAQCAtODAsMTQgKzgyLDE2IEBACiAJCSAgIHBvaW50IHRvIHRoZSBtb3VudGVkLW9uLXRvcCByb290LiAqLwogCQlpZiAoIVNfSVNESVIocGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKIAkJICAgICFkX21vdW50cG9pbnQocGF0aC5kZW50cnkpKSB7Ci0JCQlEUFJJTlRLKCgiYXV0b2ZzOiBub3QgZXhwaXJhYmxlIChub3QgYSBtb3VudGVkIGRpcmVjdG9yeSk6ICVzXG4iLCBlbnQtPm5hbWUpKTsKKwkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGUgXAorCQkJCShub3QgYSBtb3VudGVkIGRpcmVjdG9yeSk6ICVzXG4iLCBlbnQtPm5hbWUpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBhdGgubW50ID0gbW50OwogCQlwYXRoX2dldCgmcGF0aCk7CiAJCWlmICghZm9sbG93X2Rvd24oJnBhdGgpKSB7CiAJCQlwYXRoX3B1dCgmcGF0aCk7Ci0JCQlEUFJJTlRLKCgiYXV0b2ZzOiBub3QgZXhwaXJhYmxlIChub3QgYSBtb3VudGVkIGRpcmVjdG9yeSk6ICVzXG4iLCBlbnQtPm5hbWUpKTsKKwkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGVcCisJCQkobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQl3aGlsZSAoZF9tb3VudHBvaW50KHBhdGguZGVudHJ5KSAmJiBmb2xsb3dfZG93bigmcGF0aCkpCkBAIC05NiwzMCArMTAwLDM3IEBACiAJCXBhdGhfcHV0KCZwYXRoKTsKIAogCQlpZiAodW1vdW50X29rKSB7Ci0JCQlEUFJJTlRLKCgiYXV0b2ZzOiBzaWduYWxpbmcgZXhwaXJlIG9uICVzXG4iLCBlbnQtPm5hbWUpKTsKKwkJCURQUklOVEsoKCJhdXRvZnM6IHNpZ25hbGluZyBleHBpcmUgb24gJXNcbiIsCisJCQkJCQkJCWVudC0+bmFtZSkpOwogCQkJcmV0dXJuIGVudDsgLyogRXhwaXJhYmxlISAqLwogCQl9Ci0JCURQUklOVEsoKCJhdXRvZnM6IGRpZG4ndCBleHBpcmUgZHVlIHRvIG1heV91bW91bnQ6ICVzXG4iLCBlbnQtPm5hbWUpKTsKKworCQlEUFJJTlRLKCgiYXV0b2ZzOiBkaWRuJ3QgZXhwaXJlIGR1ZSB0byBtYXlfdW1vdW50OiAlc1xuIiwKKwkJCQkJCQkJZW50LT5uYW1lKSk7CiAJfQogCXJldHVybiBOVUxMOwkJLyogTm8gZXhwaXJhYmxlIGVudHJpZXMgKi8KIH0KIAotdm9pZCBhdXRvZnNfaW5pdGlhbGl6ZV9oYXNoKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpIHsKK3ZvaWQgYXV0b2ZzX2luaXRpYWxpemVfaGFzaChzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoKQorewogCW1lbXNldCgmZGgtPmgsIDAsIEFVVE9GU19IQVNIX1NJWkUqc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmRoLT5leHBpcnlfaGVhZCk7CiB9CiAKLXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgsIHN0cnVjdCBxc3RyICpuYW1lKQorc3RydWN0IGF1dG9mc19kaXJfZW50ICphdXRvZnNfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwKKwkJCQkJCXN0cnVjdCBxc3RyICpuYW1lKQogewogCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZGhuOwogCiAJRFBSSU5USygoImF1dG9mc19oYXNoX2xvb2t1cDogaGFzaCA9IDB4JTA4eCwgbmFtZSA9ICIsIG5hbWUtPmhhc2gpKTsKLQlhdXRvZnNfc2F5KG5hbWUtPm5hbWUsbmFtZS0+bGVuKTsKKwlhdXRvZnNfc2F5KG5hbWUtPm5hbWUsIG5hbWUtPmxlbik7CiAKLQlmb3IgKCBkaG4gPSBkaC0+aFsodW5zaWduZWQpIG5hbWUtPmhhc2ggJSBBVVRPRlNfSEFTSF9TSVpFXSA7IGRobiA7IGRobiA9IGRobi0+bmV4dCApIHsKLQkJaWYgKCBuYW1lLT5oYXNoID09IGRobi0+aGFzaCAmJgorCWZvciAoZGhuID0gZGgtPmhbKHVuc2lnbmVkKSBuYW1lLT5oYXNoICUgQVVUT0ZTX0hBU0hfU0laRV07CisJCWRobjsKKwkJZGhuID0gZGhuLT5uZXh0KSB7CisJCWlmIChuYW1lLT5oYXNoID09IGRobi0+aGFzaCAmJgogCQkgICAgIG5hbWUtPmxlbiA9PSBkaG4tPmxlbiAmJgotCQkgICAgICFtZW1jbXAobmFtZS0+bmFtZSwgZGhuLT5uYW1lLCBuYW1lLT5sZW4pICkKKwkJICAgICAhbWVtY21wKG5hbWUtPm5hbWUsIGRobi0+bmFtZSwgbmFtZS0+bGVuKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtMTMxLDkgKzE0Miw5IEBACiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICoqZGhucDsKIAogCURQUklOVEsoKCJhdXRvZnNfaGFzaF9pbnNlcnQ6IGhhc2ggPSAweCUwOHgsIG5hbWUgPSAiLCBlbnQtPmhhc2gpKTsKLQlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisJYXV0b2ZzX3NheShlbnQtPm5hbWUsIGVudC0+bGVuKTsKIAotCWF1dG9mc19pbml0X3VzYWdlKGRoLGVudCk7CisJYXV0b2ZzX2luaXRfdXNhZ2UoZGgsIGVudCk7CiAJaWYgKGVudC0+ZGVudHJ5KQogCQlkZ2V0KGVudC0+ZGVudHJ5KTsKIApAQCAtMTQxLDE5ICsxNTIsMTkgQEAKIAllbnQtPm5leHQgPSAqZGhucDsKIAllbnQtPmJhY2sgPSBkaG5wOwogCSpkaG5wID0gZW50OwotCWlmICggZW50LT5uZXh0ICkKKwlpZiAoZW50LT5uZXh0KQogCQllbnQtPm5leHQtPmJhY2sgPSAmKGVudC0+bmV4dCk7CiB9CiAKIHZvaWQgYXV0b2ZzX2hhc2hfZGVsZXRlKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQogewogCSooZW50LT5iYWNrKSA9IGVudC0+bmV4dDsKLQlpZiAoIGVudC0+bmV4dCApCisJaWYgKGVudC0+bmV4dCkKIAkJZW50LT5uZXh0LT5iYWNrID0gZW50LT5iYWNrOwogCiAJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOwogCi0JaWYgKCBlbnQtPmRlbnRyeSApCisJaWYgKGVudC0+ZGVudHJ5KQogCQlkcHV0KGVudC0+ZGVudHJ5KTsKIAlrZnJlZShlbnQtPm5hbWUpOwogCWtmcmVlKGVudCk7CkBAIC0xNzYsMzcgKzE4NywzNyBAQAogCWJ1Y2tldCA9ICgqcHRyID4+IDE2KSAtIDE7CiAJZWNvdW50ID0gKnB0ciAmIDB4ZmZmZjsKIAotCWlmICggYnVja2V0IDwgMCApIHsKKwlpZiAoYnVja2V0IDwgMCkKIAkJYnVja2V0ID0gZWNvdW50ID0gMDsKLQl9IAogCiAJRFBSSU5USygoImF1dG9mc19oYXNoX2VudW06IGJ1Y2tldCAlZCwgZW50cnkgJWRcbiIsIGJ1Y2tldCwgZWNvdW50KSk7CiAKIAllbnQgPSBsYXN0ID8gbGFzdC0+bmV4dCA6IE5VTEw7CiAKLQlpZiAoIGVudCApIHsKKwlpZiAoZW50KSB7CiAJCWVjb3VudCsrOwogCX0gZWxzZSB7Ci0JCXdoaWxlICAoIGJ1Y2tldCA8IEFVVE9GU19IQVNIX1NJWkUgKSB7CisJCXdoaWxlICAoYnVja2V0IDwgQVVUT0ZTX0hBU0hfU0laRSkgewogCQkJZW50ID0gZGgtPmhbYnVja2V0XTsKLQkJCWZvciAoIGkgPSBlY291bnQgOyBlbnQgJiYgaSA7IGktLSApCisJCQlmb3IgKGkgPSBlY291bnQgOyBlbnQgJiYgaSA7IGktLSkKIAkJCQllbnQgPSBlbnQtPm5leHQ7Ci0JCQkKKwogCQkJaWYgKGVudCkgewogCQkJCWVjb3VudCsrOyAvKiBQb2ludCB0byAqbmV4dCogZW50cnkgKi8KIAkJCQlicmVhazsKIAkJCX0KLQkJCQorCiAJCQlidWNrZXQrKzsgZWNvdW50ID0gMDsKIAkJfQogCX0KIAogI2lmZGVmIERFQlVHCi0JaWYgKCAhZW50ICkKLQkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBub3RoaW5nIGZvdW5kXG4iKTsKKwlpZiAoIWVudCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgImF1dG9mc19oYXNoX2VudW06IG5vdGhpbmcgZm91bmRcbiIpOwogCWVsc2UgewotCQlwcmludGsoImF1dG9mc19oYXNoX2VudW06IGZvdW5kIGhhc2ggJTA4eCwgbmFtZSIsIGVudC0+aGFzaCk7Ci0JCWF1dG9mc19zYXkoZW50LT5uYW1lLGVudC0+bGVuKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImF1dG9mc19oYXNoX2VudW06IGZvdW5kIGhhc2ggJTA4eCwgbmFtZSIsCisJCQkJCQkJCWVudC0+aGFzaCk7CisJCWF1dG9mc19zYXkoZW50LT5uYW1lLCBlbnQtPmxlbik7CiAJfQogI2VuZGlmCiAKQEAgLTIyMSw5ICsyMzIsOSBAQAogCWludCBpOwogCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OwogCi0JZm9yICggaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKyApIHsKLQkJZm9yICggZW50ID0gZGgtPmhbaV0gOyBlbnQgOyBlbnQgPSBlbnQtPm5leHQgKSB7Ci0JCQlpZiAoIGVudC0+ZGVudHJ5ICkgeworCWZvciAoaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKykgeworCQlmb3IgKGVudCA9IGRoLT5oW2ldIDsgZW50IDsgZW50ID0gZW50LT5uZXh0KSB7CisJCQlpZiAoZW50LT5kZW50cnkpIHsKIAkJCQlkcHV0KGVudC0+ZGVudHJ5KTsKIAkJCQllbnQtPmRlbnRyeSA9IE5VTEw7CiAJCQl9CkBAIC0yMzgsMTAgKzI0OSwxMCBAQAogCWludCBpOwogCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50LCAqbmVudDsKIAotCWZvciAoIGkgPSAwIDsgaSA8IEFVVE9GU19IQVNIX1NJWkUgOyBpKysgKSB7Ci0JCWZvciAoIGVudCA9IHNiaS0+ZGlyaGFzaC5oW2ldIDsgZW50IDsgZW50ID0gbmVudCApIHsKKwlmb3IgKGkgPSAwIDsgaSA8IEFVVE9GU19IQVNIX1NJWkUgOyBpKyspIHsKKwkJZm9yIChlbnQgPSBzYmktPmRpcmhhc2guaFtpXSA7IGVudCA7IGVudCA9IG5lbnQpIHsKIAkJCW5lbnQgPSBlbnQtPm5leHQ7Ci0JCQlpZiAoIGVudC0+ZGVudHJ5ICkKKwkJCWlmIChlbnQtPmRlbnRyeSkKIAkJCQlkcHV0KGVudC0+ZGVudHJ5KTsKIAkJCWtmcmVlKGVudC0+bmFtZSk7CiAJCQlrZnJlZShlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTNmMzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMKLSMgQi5BLlQuTS5BLk4gbWVzaGluZyBwcm90b2NvbAotIwotCi1jb25maWcgQkFUTUFOX0FEVgotCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKLQlkZXBlbmRzIG9uIE5FVAotICAgICAgICBkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0KLSAgICAgICAgQi5BLlQuTS5BLk4uIChiZXR0ZXIgYXBwcm9hY2ggdG8gbW9iaWxlIGFkLWhvYyBuZXR3b3JraW5nKSBpcwotICAgICAgICBhIHJvdXRpbmcgcHJvdG9jb2wgZm9yIG11bHRpLWhvcCBhZC1ob2MgbWVzaCBuZXR3b3Jrcy4gVGhlCi0gICAgICAgIG5ldHdvcmtzIG1heSBiZSB3aXJlZCBvciB3aXJlbGVzcy4gU2VlCi0gICAgICAgIGh0dHA6Ly93d3cub3Blbi1tZXNoLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHVzZXIgc3BhY2UKLSAgICAgICAgdG9vbHMuCi0KLWNvbmZpZyBCQVRNQU5fQURWX0RFQlVHCi0JYm9vbCAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIKLQlkZXBlbmRzIG9uIEJBVE1BTl9BRFYgIT0gbgotCS0tLWhlbHAtLS0KLQotCSAgVGhpcyBpcyBhbiBvcHRpb24gZm9yIHVzZSBieSBkZXZlbG9wZXJzOyBtb3N0IHBlb3BsZSBzaG91bGQKLQkgIHNheSBOIGhlcmUuIFRoaXMgZW5hYmxlcyBjb21waWxhdGlvbiBvZiBzdXBwb3J0IGZvcgotCSAgb3V0cHV0dGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbCBsb2cuIFRoZQotCSAgb3V0cHV0IGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBtb2R1bGUgcGFyYW1ldGVyIGRlYnVnLgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODkyNDI4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSMKLSMgTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0jIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0jIDAyMTEwLTEzMDEsIFVTQQotIwotCi1vYmotJChDT05GSUdfQkFUTUFOX0FEVikgKz0gYmF0bWFuLWFkdi5vCi1iYXRtYW4tYWR2LXkgOj0gbWFpbi5vIGJhdF9kZWJ1Z2ZzLm8gYmF0X3N5c2ZzLm8gc2VuZC5vIHJvdXRpbmcubyBzb2Z0LWludGVyZmFjZS5vIGljbXBfc29ja2V0Lm8gdHJhbnNsYXRpb24tdGFibGUubyBiaXRhcnJheS5vIGhhc2gubyByaW5nX2J1ZmZlci5vIHZpcy5vIGhhcmQtaW50ZXJmYWNlLm8gYWdncmVnYXRpb24ubyBvcmlnaW5hdG9yLm8gdW5pY2FzdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODc4YmIwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi1bc3RhdGU6IDA0LTA5LTIwMTBdCi0KLUJBVE1BTi1BRFYKLS0tLS0tLS0tLS0KLQotQmF0bWFuICBhZHZhbmNlZCAgaXMgIGEgbmV3IGFwcHJvYWNoIHRvIHdpcmVsZXNzIG5ldHdvcmtpbmcgd2hpY2gKLWRvZXMgbm8gbG9uZ2VyIG9wZXJhdGUgb24gdGhlIElQIGJhc2lzLiBVbmxpa2UgdGhlIGJhdG1hbiBkYWVtb24sCi13aGljaCAgZXhjaGFuZ2VzICBpbmZvcm1hdGlvbiAgdXNpbmcgVURQIHBhY2tldHMgYW5kIHNldHMgcm91dGluZwotdGFibGVzLCBiYXRtYW4tYWR2YW5jZWQgb3BlcmF0ZXMgb24gSVNPL09TSSBMYXllciAyIG9ubHkgYW5kIHVzZXMKLWFuZCAgcm91dGVzICAob3IgIGJldHRlcjogYnJpZGdlcykgRXRoZXJuZXQgRnJhbWVzLiBJdCBlbXVsYXRlcyBhCi12aXJ0dWFsIG5ldHdvcmsgc3dpdGNoIG9mIGFsbCBub2RlcyBwYXJ0aWNpcGF0aW5nLiAgVGhlcmVmb3JlIGFsbAotbm9kZXMgIGFwcGVhciAgdG8gYmUgbGluayBsb2NhbCwgdGh1cyBhbGwgaGlnaGVyIG9wZXJhdGluZyBwcm90by0KLWNvbHMgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgd2l0aGluIHRoZSBuZXR3b3JrLiBZb3UgY2FuCi1ydW4gYWxtb3N0IGFueSBwcm90b2NvbCBhYm92ZSBiYXRtYW4gYWR2YW5jZWQsIHByb21pbmVudCBleGFtcGxlcwotYXJlOiBJUHY0LCBJUHY2LCBESENQLCBJUFguCi0KLUJhdG1hbiBhZHZhbmNlZCB3YXMgaW1wbGVtZW50ZWQgYXMgYSBMaW51eCBrZXJuZWwgZHJpdmVyICB0byAgcmUtCi1kdWNlIHRoZSBvdmVyaGVhZCB0byBhIG1pbmltdW0uIEl0IGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgKG90aGVyKQotbmV0d29yayBkcml2ZXIsIGFuZCBjYW4gYmUgdXNlZCBvbiB3aWZpIGFzIHdlbGwgYXMgZXRoZXJuZXQgIGxhbiwKLXZwbiwgIGV0YyAuLi4gKGFueXRoaW5nIHdpdGggZXRoZXJuZXQtc3R5bGUgbGF5ZXIgMikuCi0KLUNPTkZJR1VSQVRJT04KLS0tLS0tLS0tLS0tLS0KLQotTG9hZCB0aGUgYmF0bWFuLWFkdiBtb2R1bGUgaW50byB5b3VyIGtlcm5lbDoKLQotIyBpbnNtb2QgYmF0bWFuLWFkdi5rbwotCi1UaGUgIG1vZHVsZSAgaXMgbm93IHdhaXRpbmcgZm9yIGFjdGl2YXRpb24uIFlvdSBtdXN0IGFkZCBzb21lIGluLQotdGVyZmFjZXMgb24gd2hpY2ggYmF0bWFuIGNhbiBvcGVyYXRlLiBBZnRlciAgbG9hZGluZyAgdGhlICBtb2R1bGUKLWJhdG1hbiAgYWR2YW5jZWQgIHdpbGwgc2NhbiB5b3VyIHN5c3RlbXMgaW50ZXJmYWNlcyB0byBzZWFyY2ggZm9yCi1jb21wYXRpYmxlIGludGVyZmFjZXMuIE9uY2UgZm91bmQsIGl0IHdpbGwgY3JlYXRlICBzdWJmb2xkZXJzICBpbgotdGhlIC9zeXMgZGlyZWN0b3JpZXMgb2YgZWFjaCBzdXBwb3J0ZWQgaW50ZXJmYWNlLCBlLmcuCi0KLSMgbHMgL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2LwotIyBpZmFjZV9zdGF0dXMgIG1lc2hfaWZhY2UKLQotSWYgYW4gaW50ZXJmYWNlIGRvZXMgbm90IGhhdmUgdGhlICJiYXRtYW5fYWR2IiBzdWJmb2xkZXIgaXQgcHJvYi0KLWFibHkgaXMgbm90IHN1cHBvcnRlZC4gTm90IHN1cHBvcnRlZCAgaW50ZXJmYWNlcyAgYXJlOiAgbG9vcGJhY2ssCi1ub24tZXRoZXJuZXQgYW5kIGJhdG1hbidzIG93biBpbnRlcmZhY2VzLgotCi1Ob3RlOiAgQWZ0ZXIgdGhlIG1vZHVsZSB3YXMgbG9hZGVkIGl0IHdpbGwgY29udGludW91c2x5IHdhdGNoIGZvcgotbmV3IGludGVyZmFjZXMgdG8gdmVyaWZ5IHRoZSBjb21wYXRpYmlsaXR5LiBUaGVyZSBpcyBubyAgbmVlZCAgdG8KLXJlbG9hZCB0aGUgbW9kdWxlIGlmIHlvdSBwbHVnIHlvdXIgVVNCIHdpZmkgYWRhcHRlciBpbnRvIHlvdXIgbWEtCi1jaGluZSBhZnRlciBiYXRtYW4gYWR2YW5jZWQgd2FzIGluaXRpYWxseSBsb2FkZWQuCi0KLVRvIGFjdGl2YXRlIGEgIGdpdmVuICBpbnRlcmZhY2UgIHNpbXBseSAgd3JpdGUgICJiYXQwIiAgaW50byAgaXRzCi0ibWVzaF9pZmFjZSIgZmlsZSBpbnNpZGUgdGhlIGJhdG1hbl9hZHYgc3ViZm9sZGVyOgotCi0jIGVjaG8gYmF0MCA+IC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi9tZXNoX2lmYWNlCi0KLVJlcGVhdCAgdGhpcyBzdGVwIGZvciBhbGwgaW50ZXJmYWNlcyB5b3Ugd2lzaCB0byBhZGQuICBOb3cgYmF0bWFuCi1zdGFydHMgdXNpbmcvYnJvYWRjYXN0aW5nIG9uIHRoaXMvdGhlc2UgaW50ZXJmYWNlKHMpLgotCi1CeSByZWFkaW5nIHRoZSAiaWZhY2Vfc3RhdHVzIiBmaWxlIHlvdSBjYW4gY2hlY2sgaXRzIHN0YXR1czoKLQotIyBjYXQgL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2L2lmYWNlX3N0YXR1cwotIyBhY3RpdmUKLQotVG8gZGVhY3RpdmF0ZSBhbiBpbnRlcmZhY2UgeW91IGhhdmUgIHRvICB3cml0ZSAgIm5vbmUiICBpbnRvICBpdHMKLSJtZXNoX2lmYWNlIiBmaWxlOgotCi0jIGVjaG8gbm9uZSA+IC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi9tZXNoX2lmYWNlCi0KLQotQWxsICBtZXNoICB3aWRlICBzZXR0aW5ncyAgY2FuIGJlIGZvdW5kIGluIGJhdG1hbidzIG93biBpbnRlcmZhY2UKLWZvbGRlcjoKLQotIyAgbHMgIC9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC8KLSMgIGFnZ3JlZ2F0ZWRfb2dtcyAgYm9uZGluZyAgb3JpZ19pbnRlcnZhbCAgdmlzX21vZGUKLQotCi1UaGVyZSBpcyBhIHNwZWNpYWwgZm9sZGVyIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25zOgotCi0jICBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9iYXRtYW5fYWR2L2JhdDAvCi0jICBvcmlnaW5hdG9ycyAgc29ja2V0ICB0cmFuc3RhYmxlX2dsb2JhbCAgdHJhbnN0YWJsZV9sb2NhbAotIyAgdmlzX2RhdGEKLQotCi1Tb21lIG9mIHRoZSBmaWxlcyBjb250YWluIGFsbCBzb3J0IG9mIHN0YXR1cyBpbmZvcm1hdGlvbiAgcmVnYXJkLQotaW5nICB0aGUgIG1lc2ggIG5ldHdvcmsuICBGb3IgIGV4YW1wbGUsIHlvdSBjYW4gdmlldyB0aGUgdGFibGUgb2YKLW9yaWdpbmF0b3JzIChtZXNoIHBhcnRpY2lwYW50cykgd2l0aDoKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL29yaWdpbmF0b3JzCi0KLU90aGVyIGZpbGVzIGFsbG93IHRvIGNoYW5nZSBiYXRtYW4ncyBiZWhhdmlvdXIgdG8gYmV0dGVyIGZpdCB5b3VyCi1yZXF1aXJlbWVudHMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gY2hlY2sgdGhlIGN1cnJlbnQgb3JpZ2luYXRvcgotaW50ZXJ2YWwgKHZhbHVlIGluIG1pbGxpc2Vjb25kcyB3aGljaCBkZXRlcm1pbmVzIGhvdyBvZnRlbiBiYXRtYW4KLXNlbmRzIGl0cyBicm9hZGNhc3QgcGFja2V0cyk6Ci0KLSMgY2F0IC9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC9vcmlnX2ludGVydmFsCi0jIDEwMDAKLQotYW5kIGFsc28gY2hhbmdlIGl0cyB2YWx1ZToKLQotIyBlY2hvIDMwMDAgPiAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvb3JpZ19pbnRlcnZhbAotCi1JbiB2ZXJ5IG1vYmlsZSBzY2VuYXJpb3MsIHlvdSBtaWdodCB3YW50IHRvIGFkanVzdCB0aGUgb3JpZ2luYXRvcgotaW50ZXJ2YWwgdG8gYSBsb3dlciB2YWx1ZS4gVGhpcyB3aWxsIG1ha2UgdGhlIG1lc2ggIG1vcmUgIHJlc3Bvbi0KLXNpdmUgdG8gdG9wb2xvZ3kgY2hhbmdlcywgYnV0IHdpbGwgYWxzbyBpbmNyZWFzZSB0aGUgb3ZlcmhlYWQuCi0KLQotVVNBR0UKLS0tLS0tCi0KLVRvICBtYWtlIHVzZSBvZiB5b3VyIG5ld2x5IGNyZWF0ZWQgbWVzaCwgYmF0bWFuIGFkdmFuY2VkIHByb3ZpZGVzCi1hIG5ldyBpbnRlcmZhY2UgImJhdDAiIHdoaWNoIHlvdSBzaG91bGQgdXNlIGZyb20gdGhpcyAgcG9pbnQgIG9uLgotQWxsICBpbnRlcmZhY2VzICBhZGRlZCAgdG8gIGJhdG1hbiAgYWR2YW5jZWQgYXJlIG5vdCByZWxldmFudCBhbnkKLWxvbmdlciBiZWNhdXNlIGJhdG1hbiBoYW5kbGVzIHRoZW0gZm9yIHlvdS4gQmFzaWNhbGx5LCBvbmUgImhhbmRzCi1vdmVyIiB0aGUgZGF0YSBieSB1c2luZyB0aGUgYmF0bWFuIGludGVyZmFjZSBhbmQgYmF0bWFuIHdpbGwgbWFrZQotc3VyZSBpdCByZWFjaGVzIGl0cyBkZXN0aW5hdGlvbi4KLQotVGhlICJiYXQwIiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgbGlrZSBhbnkgIG90aGVyICByZWd1bGFyICBpbnRlci0KLWZhY2UuICBJdCBuZWVkcyBhbiBJUCBhZGRyZXNzIHdoaWNoIGNhbiBiZSBlaXRoZXIgc3RhdGljYWxseSBjb24tCi1maWd1cmVkIG9yIGR5bmFtaWNhbGx5IChieSB1c2luZyBESENQIG9yIHNpbWlsYXIgc2VydmljZXMpOgotCi0jIE5vZGVBOiBpZmNvbmZpZyBiYXQwIDE5Mi4xNjguMC4xCi0jIE5vZGVCOiBpZmNvbmZpZyBiYXQwIDE5Mi4xNjguMC4yCi0jIE5vZGVCOiBwaW5nIDE5Mi4xNjguMC4xCi0KLU5vdGU6ICBJbiAgb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgcmVtb3ZlIGFsbCBJUCBhZGRyZXNzZXMgcHJldmktCi1vdXNseSBhc3NpZ25lZCB0byBpbnRlcmZhY2VzIG5vdyB1c2VkIGJ5IGJhdG1hbiBhZHZhbmNlZCwgZS5nLgotCi0jIGlmY29uZmlnIGV0aDAgMC4wLjAuMAotCi0KLVZJU1VBTElaQVRJT04KLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IHdhbnQgdG9wb2xvZ3kgdmlzdWFsaXphdGlvbiwgYXQgbGVhc3Qgb25lIG1lc2ggIG5vZGUgIG11c3QKLWJlIGNvbmZpZ3VyZWQgYXMgVklTLXNlcnZlcjoKLQotIyBlY2hvICJzZXJ2ZXIiID4gL3N5cy9jbGFzcy9uZXQvYmF0MC9tZXNoL3Zpc19tb2RlCi0KLUVhY2ggIG5vZGUgIGlzICBlaXRoZXIgY29uZmlndXJlZCBhcyAic2VydmVyIiBvciBhcyAiY2xpZW50IiAoZGUtCi1mYXVsdDogImNsaWVudCIpLiAgQ2xpZW50cyBzZW5kIHRoZWlyIHRvcG9sb2d5IGRhdGEgdG8gdGhlIHNlcnZlcgotbmV4dCB0byB0aGVtLCBhbmQgc2VydmVyIHN5bmNocm9uaXplIHdpdGggb3RoZXIgc2VydmVycy4gSWYgdGhlcmUKLWlzIG5vIHNlcnZlciBjb25maWd1cmVkIChkZWZhdWx0KSB3aXRoaW4gdGhlICBtZXNoLCAgbm8gIHRvcG9sb2d5Ci1pbmZvcm1hdGlvbiAgIHdpbGwgIGJlICB0cmFuc21pdHRlZC4gIFdpdGggIHRoZXNlICAic3luY2hyb25pemluZwotc2VydmVycyIsIHRoZXJlIGNhbiBiZSAxIG9yIG1vcmUgdmlzIHNlcnZlcnMgc2hhcmluZyB0aGUgc2FtZSAob3IKLWF0IGxlYXN0IHZlcnkgc2ltaWxhcikgZGF0YS4KLQotV2hlbiAgY29uZmlndXJlZCAgYXMgIHNlcnZlciwgIHlvdSBjYW4gZ2V0IGEgdG9wb2xvZ3kgc25hcHNob3Qgb2YKLXlvdXIgbWVzaDoKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL3Zpc19kYXRhCi0KLVRoaXMgcmF3IG91dHB1dCBpcyBpbnRlbmRlZCB0byBiZSBlYXNpbHkgcGFyc2FibGUgYW5kIGNvbnZlcnRhYmxlCi13aXRoICBvdGhlciB0b29scy4gSGF2ZSBhIGxvb2sgYXQgdGhlIGJhdGN0bCBSRUFETUUgaWYgeW91IHdhbnQgYQotdmlzIG91dHB1dCBpbiBkb3Qgb3IganNvbiBmb3JtYXQgZm9yIGluc3RhbmNlIGFuZCBob3cgdGhvc2UgIG91dC0KLXB1dHMgY291bGQgdGhlbiBiZSB2aXN1YWxpc2VkIGluIGFuIGltYWdlLgotCi1UaGUgcmF3IGZvcm1hdCBjb25zaXN0cyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIHBlciBlbnRyeSB3aGVyZQotZWFjaCBlbnRyeSBpcyBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSAgY2VydGFpbiAgc291cmNlICBpbnRlci0KLWZhY2UuICBFYWNoICBlbnRyeSBjYW4vaGFzIHRvIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0tPiAibWFjIiAtIG1hYyBhZGRyZXNzIG9mIGFuIG9yaWdpbmF0b3IncyBzb3VyY2UgaW50ZXJmYWNlCi0gICAgICAgICAgIChlYWNoIGxpbmUgYmVnaW5zIHdpdGggaXQpCi0tPiAiVFEgbWFjICB2YWx1ZSIgIC0gIHNyYyBtYWMncyBsaW5rIHF1YWxpdHkgdG93YXJkcyBtYWMgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICBvZiBhIG5laWdoYm9yIG9yaWdpbmF0b3IncyBpbnRlcmZhY2Ugd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgdXNlZCBmb3Igcm91dGluZwotLT4gIkhOQSBtYWMiIC0gSE5BIGFubm91bmNlZCBieSBzb3VyY2UgbWFjCi0tPiAiUFJJTUFSWSIgLSB0aGlzICBpcyBhIHByaW1hcnkgaW50ZXJmYWNlCi0tPiAiU0VDIG1hYyIgLSBzZWNvbmRhcnkgbWFjIGFkZHJlc3Mgb2Ygc291cmNlCi0gICAgICAgICAgICAgICAocmVxdWlyZXMgcHJlY2VkaW5nIFBSSU1BUlkpCi0KLVRoZSBUUSB2YWx1ZSBoYXMgYSByYW5nZSBmcm9tIDQgdG8gMjU1IHdpdGggMjU1IGJlaW5nICB0aGUgIGJlc3QuCi1UaGUgSE5BIGVudHJpZXMgYXJlIHNob3dpbmcgd2hpY2ggaG9zdHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgbWVzaAotdmlhIGJhdDAgb3IgYmVpbmcgYnJpZGdlZCBpbnRvIHRoZSBtZXNoIG5ldHdvcmsuICBUaGUgUFJJTUFSWS9TRUMKLXZhbHVlcyBhcmUgb25seSBhcHBsaWVkIG9uIHByaW1hcnkgaW50ZXJmYWNlcwotCi0KLUxPR0dJTkcvREVCVUdHSU5HCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1BbGwgZXJyb3IgbWVzc2FnZXMsIHdhcm5pbmdzIGFuZCBpbmZvcm1hdGlvbiBtZXNzYWdlcyBhcmUgc2VudCB0bwotdGhlIGtlcm5lbCBsb2cuIERlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZyAgc3lzdGVtICBkaXN0cmlidXRpb24KLXRoaXMgIGNhbiAgYmUgcmVhZCBpbiBvbmUgb2YgYSBudW1iZXIgb2Ygd2F5cy4gVHJ5IHVzaW5nIHRoZSBjb20tCi1tYW5kczogZG1lc2csIGxvZ3JlYWQsIG9yIGxvb2tpbmcgaW4gdGhlIGZpbGVzICAvdmFyL2xvZy9rZXJuLmxvZwotb3IgIC92YXIvbG9nL3N5c2xvZy4gIEFsbCAgYmF0bWFuLWFkdiAgbWVzc2FnZXMgYXJlIHByZWZpeGVkIHdpdGgKLSJiYXRtYW4tYWR2OiIgU28gdG8gc2VlIGp1c3QgdGhlc2UgbWVzc2FnZXMgdHJ5Ci0KLSMgZG1lc2cgfCBncmVwIGJhdG1hbi1hZHYKLQotV2hlbiBpbnZlc3RpZ2F0aW5nIHByb2JsZW1zIHdpdGggeW91ciBtZXNoIG5ldHdvcmsgIGl0ICBpcyAgc29tZS0KLXRpbWVzICBuZWNlc3NhcnkgIHRvIHNlZSBtb3JlIGRldGFpbCBkZWJ1ZyBtZXNzYWdlcy4gVGhpcyBtdXN0IGJlCi1lbmFibGVkIHdoZW4gY29tcGlsaW5nIHRoZSBiYXRtYW4tYWR2IG1vZHVsZS4gV2hlbiBidWlsZGluZyAgYmF0LQotbWFuLWFkdiAgYXMgIHBhcnQgb2Yga2VybmVsLCB1c2UgIm1ha2UgbWVudWNvbmZpZyIgYW5kIGVuYWJsZSB0aGUKLW9wdGlvbiAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIuCi0KLVRob3NlIGFkZGl0aW9uYWwgIGRlYnVnIG1lc3NhZ2VzIGNhbiBiZSBhY2Nlc3NlZCAgdXNpbmcgYSBzcGVjaWFsCi1maWxlIGluIGRlYnVnZnMKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL2xvZwotCi1UaGUgYWRkaXRpb25hbCBkZWJ1ZyBvdXRwdXQgaXMgYnkgZGVmYXVsdCBkaXNhYmxlZC4gSXQgY2FuIGJlIGVuLQotYWJsZWQgIGR1cmluZyBydW4gdGltZS4gRm9sbG93aW5nIGxvZ19sZXZlbHMgYXJlIGRlZmluZWQ6Ci0KLTAgLSBBbGwgIGRlYnVnICBvdXRwdXQgIGRpc2FibGVkCi0xIC0gRW5hYmxlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcm91dGluZyAvIGZsb29kaW5nIC8gYnJvYWRjYXN0aW5nCi0yIC0gRW5hYmxlIHJvdXRlIG9yIGhuYSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkCi0zIC0gRW5hYmxlIGFsbCBtZXNzYWdlcwotCi1UaGUgZGVidWcgb3V0cHV0IGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgIHVzaW5nICB0aGUgIGZpbGUKLS9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC9sb2dfbGV2ZWwuIGUuZy4KLQotIyBlY2hvIDIgPiAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvbG9nX2xldmVsCi0KLXdpbGwgZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIGZvciB3aGVuIHJvdXRlcyBvciBITkFzIGNoYW5nZS4KLQotCi1CQVRDVEwKLS0tLS0tLQotCi1BcyBiYXRtYW4gYWR2YW5jZWQgb3BlcmF0ZXMgb24gbGF5ZXIgMiBhbGwgaG9zdHMgcGFydGljaXBhdGluZyBpbgotdGhlICB2aXJ0dWFsIHN3aXRjaCBhcmUgY29tcGxldGVseSB0cmFuc3BhcmVudCBmb3IgYWxsICBwcm90b2NvbHMKLWFib3ZlIGxheWVyIDIuIFRoZXJlZm9yZSB0aGUgY29tbW9uIGRpYWdub3NpcyB0b29scyBkbyAgbm90ICB3b3JrCi1hcyAgZXhwZWN0ZWQuICBUbyAgb3ZlcmNvbWUgdGhlc2UgcHJvYmxlbXMgYmF0Y3RsIHdhcyBjcmVhdGVkLiBBdAotdGhlICBtb21lbnQgdGhlICBiYXRjdGwgY29udGFpbnMgcGluZywgIHRyYWNlcm91dGUsICB0Y3BkdW1wICBhbmQKLWludGVyZmFjZXMgdG8gdGhlIGtlcm5lbCBtb2R1bGUgc2V0dGluZ3MuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBtYW5wYWdlIChtYW4gYmF0Y3RsKS4KLQotYmF0Y3RsIGlzIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvCi0KLQotQ09OVEFDVAotLS0tLS0tLQotCi1QbGVhc2Ugc2VuZCB1cyBjb21tZW50cywgZXhwZXJpZW5jZXMsIHF1ZXN0aW9ucywgYW55dGhpbmcgOikKLQotSVJDOiAgICAgICAgICAgICNiYXRtYW4gICBvbiAgIGlyYy5mcmVlbm9kZS5vcmcKLU1haWxpbmctbGlzdDogICBiLmEudC5tLmEubkBiLmEudC5tLmEubkBsaXN0cy5vcGVuLW1lc2gub3JnCi0gICAgICAgICAgICAgICAgKG9wdGlvbmFsICAgc3Vic2NyaXB0aW9uICAgYXQKLSAgICAgICAgICAgICAgICAgaHR0cHM6Ly9saXN0cy5vcGVuLW1lc2gub3JnL21tL2xpc3RpbmZvL2IuYS50Lm0uYS5uKQotCi1Zb3UgY2FuIGFsc28gY29udGFjdCB0aGUgQXV0aG9yczoKLQotTWFyZWsgIExpbmRuZXIgIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotU2ltb24gIFd1bmRlcmxpY2ggIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzM4NGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAqIHJlbW92ZSBvd24gbGlzdCBmdW5jdGlvbmFsaXR5IGZyb20gaGFzaAotICogdXNlIGhsaXN0X2hlYWQsIGhsaXN0X25vZGUgaW4gaGFzaAotICogZG9uJ3QgdXNlIGNhbGxiYWNrcyBmb3IgY29tcGFyZStjaG9vc2UgaW4gaGFzaAotICogdGhpbmsgYWJvdXQgbW9yZSBlZmZpY2llbnQgd2F5cyBpbnN0ZWFkIG9mIGFic3RyYWN0aW9uIG9mIGhhc2gKLSAqIFJlcXVlc3QgYSBuZXcgcmV2aWV3Ci0gKiBQcm9jZXNzIHRoZSBjb21tZW50cyBmcm9tIHRoZSByZXZpZXcKLSAqIE1vdmUgaW50byBtYWlubGluZSBwcm9wZXIKLQotUGxlYXNlIHNlbmQgYWxsIHBhdGNoZXMgdG86Ci0JTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLQlTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLQlBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+Ci0JYi5hLnQubS5hLm5AbGlzdHMub3Blbi1tZXNoLm9yZwotCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2MjRkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBobmEgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gcGFja2V0ICovCi1zdGF0aWMgaW50IGhuYV9sZW4oc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQpCi17Ci0JcmV0dXJuIGJhdG1hbl9wYWNrZXQtPm51bV9obmEgKiBFVEhfQUxFTjsKLX0KLQotLyogcmV0dXJuIHRydWUgaWYgbmV3X3BhY2tldCBjYW4gYmUgYWdncmVnYXRlZCB3aXRoIGZvcndfcGFja2V0ICovCi1zdGF0aWMgYm9vbCBjYW5fYWdncmVnYXRlX3dpdGgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKm5ld19iYXRtYW5fcGFja2V0LAotCQkJICAgICAgIGludCBwYWNrZXRfbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lLAotCQkJICAgICAgIGJvb2wgZGlyZWN0bGluaywKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKLQkJCSAgICAgICBzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQotewotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KLQkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopZm9yd19wYWNrZXQtPnNrYi0+ZGF0YTsKLQlpbnQgYWdncmVnYXRlZF9ieXRlcyA9IGZvcndfcGFja2V0LT5wYWNrZXRfbGVuICsgcGFja2V0X2xlbjsKLQotCS8qKgotCSAqIHdlIGNhbiBhZ2dyZWdhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHRvIHRoaXMgYWdncmVnYXRlZCBwYWNrZXQKLQkgKiBpZjoKLQkgKgotCSAqIC0gdGhlIHNlbmQgdGltZSBpcyB3aXRoaW4gb3VyIE1BWF9BR0dSRUdBVElPTl9NUyB0aW1lCi0JICogLSB0aGUgcmVzdWx0aW5nIHBhY2tldCB3b250IGJlIGJpZ2dlciB0aGFuCi0JICogICBNQVhfQUdHUkVHQVRJT05fQllURVMKLQkgKi8KLQotCWlmICh0aW1lX2JlZm9yZShzZW5kX3RpbWUsIGZvcndfcGFja2V0LT5zZW5kX3RpbWUpICYmCi0JICAgIHRpbWVfYWZ0ZXJfZXEoc2VuZF90aW1lICsgbXNlY3NfdG9famlmZmllcyhNQVhfQUdHUkVHQVRJT05fTVMpLAotCQkJCQlmb3J3X3BhY2tldC0+c2VuZF90aW1lKSAmJgotCSAgICAoYWdncmVnYXRlZF9ieXRlcyA8PSBNQVhfQUdHUkVHQVRJT05fQllURVMpKSB7Ci0KLQkJLyoqCi0JCSAqIGNoZWNrIGFnZ3JlZ2F0aW9uIGNvbXBhdGliaWxpdHkKLQkJICogLT4gZGlyZWN0IGxpbmsgcGFja2V0cyBhcmUgYnJvYWRjYXN0ZWQgb24KLQkJICogICAgdGhlaXIgaW50ZXJmYWNlIG9ubHkKLQkJICogLT4gYWdncmVnYXRlIHBhY2tldCBpZiB0aGUgY3VycmVudCBwYWNrZXQgaXMKLQkJICogICAgYSAiZ2xvYmFsIiBwYWNrZXQgYXMgd2VsbCBhcyB0aGUgYmFzZQotCQkgKiAgICBwYWNrZXQKLQkJICovCi0KLQkJLyogcGFja2V0cyB3aXRob3V0IGRpcmVjdCBsaW5rIGZsYWcgYW5kIGhpZ2ggVFRMCi0JCSAqIGFyZSBmbG9vZGVkIHRocm91Z2ggdGhlIG5ldCAgKi8KLQkJaWYgKCghZGlyZWN0bGluaykgJiYKLQkJICAgICghKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSykpICYmCi0JCSAgICAoYmF0bWFuX3BhY2tldC0+dHRsICE9IDEpICYmCi0KLQkJICAgIC8qIG93biBwYWNrZXRzIG9yaWdpbmF0aW5nIG5vbi1wcmltYXJ5Ci0JCSAgICAgKiBpbnRlcmZhY2VzIGxlYXZlIG9ubHkgdGhhdCBpbnRlcmZhY2UgKi8KLQkJICAgICgoIWZvcndfcGFja2V0LT5vd24pIHx8Ci0JCSAgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfbnVtID09IDApKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8qIGlmIHRoZSBpbmNvbWluZyBwYWNrZXQgaXMgc2VudCB2aWEgdGhpcyBvbmUKLQkJICogaW50ZXJmYWNlIG9ubHkgLSB3ZSBzdGlsbCBjYW4gYWdncmVnYXRlICovCi0JCWlmICgoZGlyZWN0bGluaykgJiYKLQkJICAgIChuZXdfYmF0bWFuX3BhY2tldC0+dHRsID09IDEpICYmCi0JCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSAmJgotCi0JCSAgICAvKiBwYWNrZXRzIGZyb20gZGlyZWN0IG5laWdoYm9ycyBvcgotCQkgICAgICogb3duIHNlY29uZGFyeSBpbnRlcmZhY2UgcGFja2V0cwotCQkgICAgICogKD0gc2Vjb25kYXJ5IGludGVyZmFjZSBwYWNrZXRzIGluIGdlbmVyYWwpICovCi0JCSAgICAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LIHx8Ci0JCSAgICAgKGZvcndfcGFja2V0LT5vd24gJiYKLQkJICAgICAgZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gIT0gMCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi0jZGVmaW5lIGF0b21pY19kZWNfbm90X3plcm8odikgICAgICAgICAgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAtMSwgMCkKLS8qIGNyZWF0ZSBhIG5ldyBhZ2dyZWdhdGVkIHBhY2tldCBhbmQgYWRkIHRoaXMgcGFja2V0IHRvIGl0ICovCi1zdGF0aWMgdm9pZCBuZXdfYWdncmVnYXRlZF9wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAotCQkJCSAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUsIGJvb2wgZGlyZWN0X2xpbmssCi0JCQkJICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKLQkJCQkgIGludCBvd25fcGFja2V0KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqc2tiX2J1ZmY7Ci0KLQkvKiBvd24gcGFja2V0IHNob3VsZCBhbHdheXMgYmUgc2NoZWR1bGVkICovCi0JaWYgKCFvd25fcGFja2V0KSB7Ci0JCWlmICghYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KSkgewotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkiYmF0bWFuIHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWZvcndfcGFja2V0X2FnZ3IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWZvcndfcGFja2V0X2FnZ3IpIHsKLQkJaWYgKCFvd25fcGFja2V0KQotCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSkgJiYKLQkgICAgKHBhY2tldF9sZW4gPCBNQVhfQUdHUkVHQVRJT05fQllURVMpKQotCQlmb3J3X3BhY2tldF9hZ2dyLT5za2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9BR0dSRUdBVElPTl9CWVRFUyArCi0JCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCWVsc2UKLQkJZm9yd19wYWNrZXRfYWdnci0+c2tiID0gZGV2X2FsbG9jX3NrYihwYWNrZXRfbGVuICsKLQkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0KLQlpZiAoIWZvcndfcGFja2V0X2FnZ3ItPnNrYikgewotCQlpZiAoIW93bl9wYWNrZXQpCi0JCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCQlrZnJlZShmb3J3X3BhY2tldF9hZ2dyKTsKLQkJcmV0dXJuOwotCX0KLQlza2JfcmVzZXJ2ZShmb3J3X3BhY2tldF9hZ2dyLT5za2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0KLQlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0X2FnZ3ItPmxpc3QpOwotCi0Jc2tiX2J1ZmYgPSBza2JfcHV0KGZvcndfcGFja2V0X2FnZ3ItPnNrYiwgcGFja2V0X2xlbik7Ci0JZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47Ci0JbWVtY3B5KHNrYl9idWZmLCBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7Ci0KLQlmb3J3X3BhY2tldF9hZ2dyLT5vd24gPSBvd25fcGFja2V0OwotCWZvcndfcGFja2V0X2FnZ3ItPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7Ci0JZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMgPSAwOwotCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzID0gMDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7Ci0KLQkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLwotCWlmIChkaXJlY3RfbGluaykKLQkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0gMTsKLQotCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9hZGRfaGVhZCgmZm9yd19wYWNrZXRfYWdnci0+bGlzdCwgJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KLQlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXRfYWdnci0+ZGVsYXllZF93b3JrLAotCQkJICBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLAotCQkJICAgJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKLQkJCSAgIHNlbmRfdGltZSAtIGppZmZpZXMpOwotfQotCi0vKiBhZ2dyZWdhdGUgYSBuZXcgcGFja2V0IGludG8gdGhlIGV4aXN0aW5nIGFnZ3JlZ2F0aW9uICovCi1zdGF0aWMgdm9pZCBhZ2dyZWdhdGUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyLAotCQkgICAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKLQkJICAgICAgaW50IHBhY2tldF9sZW4sCi0JCSAgICAgIGJvb2wgZGlyZWN0X2xpbmspCi17Ci0JdW5zaWduZWQgY2hhciAqc2tiX2J1ZmY7Ci0KLQlza2JfYnVmZiA9IHNrYl9wdXQoZm9yd19wYWNrZXRfYWdnci0+c2tiLCBwYWNrZXRfbGVuKTsKLQltZW1jcHkoc2tiX2J1ZmYsIHBhY2tldF9idWZmLCBwYWNrZXRfbGVuKTsKLQlmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfbGVuICs9IHBhY2tldF9sZW47Ci0JZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMrKzsKLQotCS8qIHNhdmUgcGFja2V0IGRpcmVjdCBsaW5rIGZsYWcgc3RhdHVzICovCi0JaWYgKGRpcmVjdF9saW5rKQotCQlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyB8PQotCQkJKDEgPDwgZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMpOwotfQotCi12b2lkIGFkZF9iYXRfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4sCi0JCQkgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsIGNoYXIgb3duX3BhY2tldCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSkKLXsKLQkvKioKLQkgKiBfYWdnciAtPiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgd2Ugd2FudCB0byBhZ2dyZWdhdGUgd2l0aAotCSAqIF9wb3MgLT4gcG9pbnRlciB0byB0aGUgcG9zaXRpb24gaW4gdGhlIHF1ZXVlCi0JICovCi0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyID0gTlVMTCwgKmZvcndfcGFja2V0X3BvcyA9IE5VTEw7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcF9ub2RlOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KLQkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopcGFja2V0X2J1ZmY7Ci0JYm9vbCBkaXJlY3RfbGluayA9IGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBmaW5kIHBvc2l0aW9uIGZvciB0aGUgcGFja2V0IGluIHRoZSBmb3J3YXJkIHF1ZXVlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQkvKiBvd24gcGFja2V0cyBhcmUgbm90IHRvIGJlIGFnZ3JlZ2F0ZWQgKi8KLQlpZiAoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkpICYmICghb3duX3BhY2tldCkpIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZm9yd19wYWNrZXRfcG9zLCB0bXBfbm9kZSwKLQkJCQkgICAgICZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCwgbGlzdCkgewotCQkJaWYgKGNhbl9hZ2dyZWdhdGVfd2l0aChiYXRtYW5fcGFja2V0LAotCQkJCQkgICAgICAgcGFja2V0X2xlbiwKLQkJCQkJICAgICAgIHNlbmRfdGltZSwKLQkJCQkJICAgICAgIGRpcmVjdF9saW5rLAotCQkJCQkgICAgICAgaWZfaW5jb21pbmcsCi0JCQkJCSAgICAgICBmb3J3X3BhY2tldF9wb3MpKSB7Ci0JCQkJZm9yd19wYWNrZXRfYWdnciA9IGZvcndfcGFja2V0X3BvczsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIG5vdGhpbmcgdG8gYWdncmVnYXRlIHdpdGggLSBlaXRoZXIgYWdncmVnYXRpb24gZGlzYWJsZWQgb3Igbm8KLQkgKiBzdWl0YWJsZSBhZ2dyZWdhdGlvbiBwYWNrZXQgZm91bmQgKi8KLQlpZiAoZm9yd19wYWNrZXRfYWdnciA9PSBOVUxMKSB7Ci0JCS8qIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBjYW4gcnVuIHdpdGhvdXQgdGhlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JCS8qKgotCQkgKiBpZiB3ZSBjb3VsZCBub3QgYWdncmVnYXRlIHRoaXMgcGFja2V0IHdpdGggb25lIG9mIHRoZSBvdGhlcnMKLQkJICogd2UgaG9sZCBpdCBiYWNrIGZvciBhIHdoaWxlLCBzbyB0aGF0IGl0IG1pZ2h0IGJlIGFnZ3JlZ2F0ZWQKLQkJICogbGF0ZXIgb24KLQkJICovCi0JCWlmICgoIW93bl9wYWNrZXQpICYmCi0JCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSkpCi0JCQlzZW5kX3RpbWUgKz0gbXNlY3NfdG9famlmZmllcyhNQVhfQUdHUkVHQVRJT05fTVMpOwotCi0JCW5ld19hZ2dyZWdhdGVkX3BhY2tldChwYWNrZXRfYnVmZiwgcGFja2V0X2xlbiwKLQkJCQkgICAgICBzZW5kX3RpbWUsIGRpcmVjdF9saW5rLAotCQkJCSAgICAgIGlmX2luY29taW5nLCBvd25fcGFja2V0KTsKLQl9IGVsc2UgewotCQlhZ2dyZWdhdGUoZm9yd19wYWNrZXRfYWdnciwKLQkJCSAgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCi0JCQkgIGRpcmVjdF9saW5rKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLX0KLQotLyogdW5wYWNrIHRoZSBhZ2dyZWdhdGVkIHBhY2tldHMgYW5kIHByb2Nlc3MgdGhlbSBvbmUgYnkgb25lICovCi12b2lkIHJlY2VpdmVfYWdncl9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCi0JCQkgICAgIGludCBwYWNrZXRfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKLXsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKLQlpbnQgYnVmZl9wb3MgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmOwotCi0JYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKXBhY2tldF9idWZmOwotCi0JZG8gewotCQkvKiBuZXR3b3JrIHRvIGhvc3Qgb3JkZXIgZm9yIG91ciAzMmJpdCBzZXFubywgYW5kIHRoZQotCQkgICBvcmlnX2ludGVydmFsLiAqLwotCQliYXRtYW5fcGFja2V0LT5zZXFubyA9IG50b2hsKGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKLQotCQlobmFfYnVmZiA9IHBhY2tldF9idWZmICsgYnVmZl9wb3MgKyBCQVRfUEFDS0VUX0xFTjsKLQkJcmVjZWl2ZV9iYXRfcGFja2V0KGV0aGhkciwgYmF0bWFuX3BhY2tldCwKLQkJCQkgICBobmFfYnVmZiwgaG5hX2xlbihiYXRtYW5fcGFja2V0KSwKLQkJCQkgICBpZl9pbmNvbWluZyk7Ci0KLQkJYnVmZl9wb3MgKz0gQkFUX1BBQ0tFVF9MRU4gKyBobmFfbGVuKGJhdG1hbl9wYWNrZXQpOwotCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopCi0JCQkocGFja2V0X2J1ZmYgKyBidWZmX3Bvcyk7Ci0JfSB3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsIHBhY2tldF9sZW4sCi0JCQkJICAgYmF0bWFuX3BhY2tldC0+bnVtX2huYSkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTkxYjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9BR0dSRUdBVElPTl9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfQUdHUkVHQVRJT05fSF8KLQotI2luY2x1ZGUgIm1haW4uaCIKLQotLyogaXMgdGhlcmUgYW5vdGhlciBhZ2dyZWdhdGVkIHBhY2tldCBoZXJlPyAqLwotc3RhdGljIGlubGluZSBpbnQgYWdncmVnYXRlZF9wYWNrZXQoaW50IGJ1ZmZfcG9zLCBpbnQgcGFja2V0X2xlbiwgaW50IG51bV9obmEpCi17Ci0JaW50IG5leHRfYnVmZl9wb3MgPSBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOICsgKG51bV9obmEgKiBFVEhfQUxFTik7Ci0KLQlyZXR1cm4gKG5leHRfYnVmZl9wb3MgPD0gcGFja2V0X2xlbikgJiYKLQkJKG5leHRfYnVmZl9wb3MgPD0gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKTsKLX0KLQotdm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAotCQkJICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLCBjaGFyIG93bl9wYWNrZXQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpOwotdm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAotCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmODRhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLQotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLQotI2luY2x1ZGUgImJhdF9kZWJ1Z2ZzLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ2aXMuaCIKLSNpbmNsdWRlICJpY21wX3NvY2tldC5oIgotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYmF0X2RlYnVnZnM7Ci0KLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotI2RlZmluZSBMT0dfQlVGRl9NQVNLIChsb2dfYnVmZl9sZW4tMSkKLSNkZWZpbmUgTE9HX0JVRkYoaWR4KSAoZGVidWdfbG9nLT5sb2dfYnVmZlsoaWR4KSAmIExPR19CVUZGX01BU0tdKQotCi1zdGF0aWMgaW50IGxvZ19idWZmX2xlbiA9IExPR19CVUZfTEVOOwotCi1zdGF0aWMgdm9pZCBlbWl0X2xvZ19jaGFyKHN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZywgY2hhciBjKQotewotCUxPR19CVUZGKGRlYnVnX2xvZy0+bG9nX2VuZCkgPSBjOwotCWRlYnVnX2xvZy0+bG9nX2VuZCsrOwotCi0JaWYgKGRlYnVnX2xvZy0+bG9nX2VuZCAtIGRlYnVnX2xvZy0+bG9nX3N0YXJ0ID4gbG9nX2J1ZmZfbGVuKQotCQlkZWJ1Z19sb2ctPmxvZ19zdGFydCA9IGRlYnVnX2xvZy0+bG9nX2VuZCAtIGxvZ19idWZmX2xlbjsKLX0KLQotc3RhdGljIGludCBmZGVidWdfbG9nKHN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZywgY2hhciAqZm10LCAuLi4pCi17Ci0JaW50IHByaW50ZWRfbGVuOwotCXZhX2xpc3QgYXJnczsKLQlzdGF0aWMgY2hhciBkZWJ1Z19sb2dfYnVmWzI1Nl07Ci0JY2hhciAqcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFkZWJ1Z19sb2cpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRlZF9sZW4gPSB2c2NucHJpbnRmKGRlYnVnX2xvZ19idWYsIHNpemVvZihkZWJ1Z19sb2dfYnVmKSwKLQkJCQkgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0KLQlmb3IgKHAgPSBkZWJ1Z19sb2dfYnVmOyAqcCAhPSAwOyBwKyspCi0JCWVtaXRfbG9nX2NoYXIoZGVidWdfbG9nLCAqcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmRlYnVnX2xvZy0+cXVldWVfd2FpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0JY2hhciB0bXBfbG9nX2J1ZlsyNTZdOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c2NucHJpbnRmKHRtcF9sb2dfYnVmLCBzaXplb2YodG1wX2xvZ19idWYpLCBmbXQsIGFyZ3MpOwotCWZkZWJ1Z19sb2coYmF0X3ByaXYtPmRlYnVnX2xvZywgIlslMTB1XSAlcyIsCi0JCSAgIChqaWZmaWVzIC8gSFopLCB0bXBfbG9nX2J1Zik7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlpbmNfbW9kdWxlX2NvdW50KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZGVjX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBsb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nID0gYmF0X3ByaXYtPmRlYnVnX2xvZzsKLQlpbnQgZXJyb3IsIGkgPSAwOwotCWNoYXIgYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYKLQkgICAgIShkZWJ1Z19sb2ctPmxvZ19lbmQgLSBkZWJ1Z19sb2ctPmxvZ19zdGFydCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JaWYgKCghYnVmKSB8fCAoY291bnQgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRlYnVnX2xvZy0+cXVldWVfd2FpdCwKLQkJCQkoZGVidWdfbG9nLT5sb2dfc3RhcnQgLSBkZWJ1Z19sb2ctPmxvZ19lbmQpKTsKLQotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKCghZXJyb3IpICYmIChpIDwgY291bnQpICYmCi0JICAgICAgIChkZWJ1Z19sb2ctPmxvZ19zdGFydCAhPSBkZWJ1Z19sb2ctPmxvZ19lbmQpKSB7Ci0JCWMgPSBMT0dfQlVGRihkZWJ1Z19sb2ctPmxvZ19zdGFydCk7Ci0KLQkJZGVidWdfbG9nLT5sb2dfc3RhcnQrKzsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCQllcnJvciA9IF9fcHV0X3VzZXIoYywgYnVmKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7Ci0KLQkJYnVmKys7Ci0JCWkrKzsKLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFlcnJvcikKLQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2cgPSBiYXRfcHJpdi0+ZGVidWdfbG9nOwotCi0JcG9sbF93YWl0KGZpbGUsICZkZWJ1Z19sb2ctPnF1ZXVlX3dhaXQsIHdhaXQpOwotCi0JaWYgKGRlYnVnX2xvZy0+bG9nX2VuZCAtIGRlYnVnX2xvZy0+bG9nX3N0YXJ0KQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsb2dfZm9wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBsb2dfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSBsb2dfcmVsZWFzZSwKLQkucmVhZCAgICAgICAgICAgPSBsb2dfcmVhZCwKLQkucG9sbCAgICAgICAgICAgPSBsb2dfcG9sbCwKLQkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCi19OwotCi1zdGF0aWMgaW50IGRlYnVnX2xvZ19zZXR1cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCBkZW50cnkgKmQ7Ci0KLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCi0JCWdvdG8gZXJyOwotCi0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWJ1Z19sb2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19sb2cpCi0JCWdvdG8gZXJyOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5kZWJ1Z19sb2ctPmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJhdF9wcml2LT5kZWJ1Z19sb2ctPnF1ZXVlX3dhaXQpOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImxvZyIsIFNfSUZSRUcgfCBTX0lSVVNSLAotCQkJCWJhdF9wcml2LT5kZWJ1Z19kaXIsIGJhdF9wcml2LCAmbG9nX2ZvcHMpOwotCWlmIChkKQotCQlnb3RvIGVycjsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2xvZ19jbGVhbnVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Ja2ZyZWUoYmF0X3ByaXYtPmRlYnVnX2xvZyk7Ci0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IE5VTEw7Ci19Ci0jZWxzZSAvKiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRyAqLwotc3RhdGljIGludCBkZWJ1Z19sb2dfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQliYXRfcHJpdi0+ZGVidWdfbG9nID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVidWdfbG9nX2NsZWFudXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlyZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBvcmlnaW5hdG9yc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgb3JpZ19zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnN0YWJsZV9nbG9iYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhuYV9nbG9iYWxfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwotfQotCi1zdGF0aWMgaW50IHRyYW5zdGFibGVfbG9jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhuYV9sb2NhbF9zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlzX2RhdGFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHZpc19zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0cnVjdCBiYXRfZGVidWdpbmZvIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0JY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwotfTsKLQotI2RlZmluZSBCQVRfREVCVUdJTkZPKF9uYW1lLCBfbW9kZSwgX29wZW4pCVwKLXN0cnVjdCBiYXRfZGVidWdpbmZvIGJhdF9kZWJ1Z2luZm9fIyNfbmFtZSA9IHsJXAotCS5hdHRyID0geyAubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJXAotCQkgIC5tb2RlID0gX21vZGUsIH0sCQlcCi0JLmZvcHMgPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLAkJXAotCQkgIC5vcGVuID0gX29wZW4sCQlcCi0JCSAgLnJlYWQJPSBzZXFfcmVhZCwJCVwKLQkJICAubGxzZWVrID0gc2VxX2xzZWVrLAkJXAotCQkgIC5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCVwKLQkJfQkJCQlcCi19OwotCi1zdGF0aWMgQkFUX0RFQlVHSU5GTyhvcmlnaW5hdG9ycywgU19JUlVHTywgb3JpZ2luYXRvcnNfb3Blbik7Ci1zdGF0aWMgQkFUX0RFQlVHSU5GTyh0cmFuc3RhYmxlX2dsb2JhbCwgU19JUlVHTywgdHJhbnN0YWJsZV9nbG9iYWxfb3Blbik7Ci1zdGF0aWMgQkFUX0RFQlVHSU5GTyh0cmFuc3RhYmxlX2xvY2FsLCBTX0lSVUdPLCB0cmFuc3RhYmxlX2xvY2FsX29wZW4pOwotc3RhdGljIEJBVF9ERUJVR0lORk8odmlzX2RhdGEsIFNfSVJVR08sIHZpc19kYXRhX29wZW4pOwotCi1zdGF0aWMgc3RydWN0IGJhdF9kZWJ1Z2luZm8gKm1lc2hfZGVidWdpbmZvc1tdID0gewotCSZiYXRfZGVidWdpbmZvX29yaWdpbmF0b3JzLAotCSZiYXRfZGVidWdpbmZvX3RyYW5zdGFibGVfZ2xvYmFsLAotCSZiYXRfZGVidWdpbmZvX3RyYW5zdGFibGVfbG9jYWwsCi0JJmJhdF9kZWJ1Z2luZm9fdmlzX2RhdGEsCi0JTlVMTCwKLX07Ci0KLXZvaWQgZGVidWdmc19pbml0KHZvaWQpCi17Ci0JYmF0X2RlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoREVCVUdGU19CQVRfU1VCRElSLCBOVUxMKTsKLQlpZiAoYmF0X2RlYnVnZnMgPT0gRVJSX1BUUigtRU5PREVWKSkKLQkJYmF0X2RlYnVnZnMgPSBOVUxMOwotfQotCi12b2lkIGRlYnVnZnNfZGVzdHJveSh2b2lkKQotewotCWlmIChiYXRfZGVidWdmcykgewotCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X2RlYnVnZnMpOwotCQliYXRfZGVidWdmcyA9IE5VTEw7Ci0JfQotfQotCi1pbnQgZGVidWdmc19hZGRfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGJhdF9kZWJ1Z2luZm8gKipiYXRfZGVidWc7Ci0Jc3RydWN0IGRlbnRyeSAqZmlsZTsKLQotCWlmICghYmF0X2RlYnVnZnMpCi0JCWdvdG8gb3V0OwotCi0JYmF0X3ByaXYtPmRlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkZXYtPm5hbWUsIGJhdF9kZWJ1Z2ZzKTsKLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCi0JCWdvdG8gb3V0OwotCi0JYmF0X3NvY2tldF9zZXR1cChiYXRfcHJpdik7Ci0JZGVidWdfbG9nX3NldHVwKGJhdF9wcml2KTsKLQotCWZvciAoYmF0X2RlYnVnID0gbWVzaF9kZWJ1Z2luZm9zOyAqYmF0X2RlYnVnOyArK2JhdF9kZWJ1ZykgewotCQlmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgoKCpiYXRfZGVidWcpLT5hdHRyKS5uYW1lLAotCQkJCQkgIFNfSUZSRUcgfCAoKCpiYXRfZGVidWcpLT5hdHRyKS5tb2RlLAotCQkJCQkgIGJhdF9wcml2LT5kZWJ1Z19kaXIsCi0JCQkJCSAgZGV2LCAmKCpiYXRfZGVidWcpLT5mb3BzKTsKLQkJaWYgKCFmaWxlKSB7Ci0JCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBkZWJ1Z2ZzIGZpbGU6ICVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgKCgqYmF0X2RlYnVnKS0+YXR0cikubmFtZSk7Ci0JCQlnb3RvIHJlbV9hdHRyOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci1yZW1fYXR0cjoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X3ByaXYtPmRlYnVnX2Rpcik7Ci0JYmF0X3ByaXYtPmRlYnVnX2RpciA9IE5VTEw7Ci1vdXQ6Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JcmV0dXJuIC1FTk9NRU07Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotfQotCi12b2lkIGRlYnVnZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JZGVidWdfbG9nX2NsZWFudXAoYmF0X3ByaXYpOwotCi0JaWYgKGJhdF9kZWJ1Z2ZzKSB7Ci0JCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShiYXRfcHJpdi0+ZGVidWdfZGlyKTsKLQkJYmF0X3ByaXYtPmRlYnVnX2RpciA9IE5VTEw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGY1MzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCi0KLSNkZWZpbmUgREVCVUdGU19CQVRfU1VCRElSICJiYXRtYW5fYWR2IgotCi12b2lkIGRlYnVnZnNfaW5pdCh2b2lkKTsKLXZvaWQgZGVidWdmc19kZXN0cm95KHZvaWQpOwotaW50IGRlYnVnZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgZGVidWdmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0RFQlVHRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTdmYjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImJhdF9zeXNmcy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAib3JpZ2luYXRvci5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0KLSNkZWZpbmUgdG9fZGV2KG9iaikgICAgIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCi0KLSNkZWZpbmUgQkFUX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQlcCi1zdHJ1Y3QgYmF0X2F0dHJpYnV0ZSBiYXRfYXR0cl8jI19uYW1lID0gewlcCi0JLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCVwKLQkJIC5tb2RlID0gX21vZGUgfSwJCVwKLQkuc2hvdyAgID0gX3Nob3csCQkJXAotCS5zdG9yZSAgPSBfc3RvcmUsCQkJXAotfTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19hZ2dyX29nbXMoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7Ci0JaW50IGFnZ3Jfc3RhdHVzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIGFnZ3Jfc3RhdHVzID09IDAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfYWdncl9vZ21zKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlpbnQgYWdncl90bXAgPSAtMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcxJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJlbmFibGUiLCA2KSA9PSAwKSkKLQkJYWdncl90bXAgPSAxOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzAnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImRpc2FibGUiLCA3KSA9PSAwKSkKLQkJYWdncl90bXAgPSAwOwotCi0JaWYgKGFnZ3JfdG1wIDwgMCkgewotCQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwotCi0JCWJhdF9pbmZvKG5ldF9kZXYsCi0JCQkgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnYWdncmVnYXRlIE9HTScgc2V0dGluZyIKLQkJCSAicmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkgPT0gYWdncl90bXApCi0JCXJldHVybiBjb3VudDsKLQotCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyBhZ2dyZWdhdGlvbiBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpID09IDEgPwotCQkgImVuYWJsZWQiIDogImRpc2FibGVkIiwgYWdncl90bXAgPT0gMSA/ICJlbmFibGVkIiA6Ci0JCSAiZGlzYWJsZWQiKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkLCAodW5zaWduZWQpYWdncl90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19ib25kKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBib25kX3N0YXR1cyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIGJvbmRfc3RhdHVzID09IDAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfYm9uZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlpbnQgYm9uZGluZ19lbmFibGVkX3RtcCA9IC0xOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzEnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImVuYWJsZSIsIDYpID09IDApKQotCQlib25kaW5nX2VuYWJsZWRfdG1wID0gMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcwJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJkaXNhYmxlIiwgNykgPT0gMCkpCi0JCWJvbmRpbmdfZW5hYmxlZF90bXAgPSAwOwotCi0JaWYgKGJvbmRpbmdfZW5hYmxlZF90bXAgPCAwKSB7Ci0JCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKLQkJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQkJYmF0X2VycihuZXRfZGV2LAotCQkJIkludmFsaWQgcGFyYW1ldGVyIGZvciAnYm9uZGluZycgc2V0dGluZyByZWNlaXZlZDogIgotCQkJIiVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKSA9PSBib25kaW5nX2VuYWJsZWRfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgYm9uZGluZyBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCkgPT0gMSA/Ci0JCSAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgYm9uZGluZ19lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkLCAodW5zaWduZWQpYm9uZGluZ19lbmFibGVkX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZyYWcoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7Ci0JaW50IGZyYWdfc3RhdHVzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAotCQkgICAgICAgZnJhZ19zdGF0dXMgPT0gMCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9mcmFnKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCWludCBmcmFnX2VuYWJsZWRfdG1wID0gLTE7Ci0KLQlpZiAoKChjb3VudCA9PSAyKSAmJiAoYnVmZlswXSA9PSAnMScpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiZW5hYmxlIiwgNikgPT0gMCkpCi0JCWZyYWdfZW5hYmxlZF90bXAgPSAxOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzAnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImRpc2FibGUiLCA3KSA9PSAwKSkKLQkJZnJhZ19lbmFibGVkX3RtcCA9IDA7Ci0KLQlpZiAoZnJhZ19lbmFibGVkX3RtcCA8IDApIHsKLQkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCQliYXRfZXJyKG5ldF9kZXYsCi0JCQkiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdmcmFnbWVudGF0aW9uJyBzZXR0aW5nIG9uIG1lc2giCi0JCQkicmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSA9PSBmcmFnX2VuYWJsZWRfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgZnJhZ21lbnRhdGlvbiBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkgPT0gMSA/Ci0JCSAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgZnJhZ19lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkLCAodW5zaWduZWQpZnJhZ19lbmFibGVkX3RtcCk7Ci0JdXBkYXRlX21pbl9tdHUobmV0X2Rldik7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3Zpc19tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCB2aXNfbW9kZSA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAotCQkgICAgICAgdmlzX21vZGUgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSA/Ci0JCQkJCQkJImNsaWVudCIgOiAic2VydmVyIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3Zpc19tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0LCB2aXNfbW9kZV90bXAgPSAtMTsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZmYsIDEwLCAmdmFsKTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmICghcmV0KSAmJiAodmFsID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiY2xpZW50IiwgNikgPT0gMCkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgIm9mZiIsIDMpID09IDApKQotCQl2aXNfbW9kZV90bXAgPSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKCFyZXQpICYmICh2YWwgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAic2VydmVyIiwgNikgPT0gMCkpCi0JCXZpc19tb2RlX3RtcCA9IFZJU19UWVBFX1NFUlZFUl9TWU5DOwotCi0JaWYgKHZpc19tb2RlX3RtcCA8IDApIHsKLQkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCQliYXRfaW5mbyhuZXRfZGV2LAotCQkJICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ3ZpcyBtb2RlJyBzZXR0aW5nIHJlY2VpdmVkOiAiCi0JCQkgIiVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpID09IHZpc19tb2RlX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIHZpcyBtb2RlIGZyb206ICVzIHRvOiAlc1xuIiwKLQkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCQkgImNsaWVudCIgOiAic2VydmVyIiwgdmlzX21vZGVfdG1wID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCQkgImNsaWVudCIgOiAic2VydmVyIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dmlzX21vZGUsICh1bnNpZ25lZCl2aXNfbW9kZV90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19vcmlnX2ludGVydmFsKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVpXG4iLAotCQkgICAgICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX29yaWdfaW50ZXJ2YWwoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19pbnRlcnZhbF90bXA7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZmYsIDEwLCAmb3JpZ19pbnRlcnZhbF90bXApOwotCWlmIChyZXQpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnb3JpZ19pbnRlcnZhbCcgIgotCQkJICJzZXR0aW5nIHJlY2VpdmVkOiAlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvcmlnX2ludGVydmFsX3RtcCA8IEpJVFRFUiAqIDIpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIk5ldyBvcmlnaW5hdG9yIGludGVydmFsIHRvbyBzbWFsbDogJWxpICIKLQkJCSAiKG1pbjogJWkpXG4iLCBvcmlnX2ludGVydmFsX3RtcCwgSklUVEVSICogMik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpID09IG9yaWdfaW50ZXJ2YWxfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgb3JpZ2luYXRvciBpbnRlcnZhbCBmcm9tOiAlaSB0bzogJWxpXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSwKLQkJIG9yaWdfaW50ZXJ2YWxfdG1wKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsLCBvcmlnX2ludGVydmFsX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLXN0YXRpYyBzc2l6ZV90IHNob3dfbG9nX2xldmVsKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBsb2dfbGV2ZWwgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmxvZ19sZXZlbCk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWZmLCAiJWRcbiIsIGxvZ19sZXZlbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2xvZ19sZXZlbChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBsb2dfbGV2ZWxfdG1wOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJmxvZ19sZXZlbF90bXApOwotCWlmIChyZXQpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnbG9nX2xldmVsJyAiCi0JCQkgInNldHRpbmcgcmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGxvZ19sZXZlbF90bXAgPiAzKSB7Ci0JCWJhdF9pbmZvKG5ldF9kZXYsICJOZXcgbG9nIGxldmVsIHRvbyBiaWc6ICVsaSAiCi0JCQkgIihtYXg6ICVpKVxuIiwgbG9nX2xldmVsX3RtcCwgMyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmxvZ19sZXZlbCkgPT0gbG9nX2xldmVsX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIGxvZyBsZXZlbCBmcm9tOiAlaSB0bzogJWxpXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpLAotCQkgbG9nX2xldmVsX3RtcCk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bG9nX2xldmVsLCAodW5zaWduZWQpbG9nX2xldmVsX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotI2VuZGlmCi0KLXN0YXRpYyBCQVRfQVRUUihhZ2dyZWdhdGVkX29nbXMsIFNfSVJVR08gfCBTX0lXVVNSLAotCQlzaG93X2FnZ3Jfb2dtcywgc3RvcmVfYWdncl9vZ21zKTsKLXN0YXRpYyBCQVRfQVRUUihib25kaW5nLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19ib25kLCBzdG9yZV9ib25kKTsKLXN0YXRpYyBCQVRfQVRUUihmcmFnbWVudGF0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19mcmFnLCBzdG9yZV9mcmFnKTsKLXN0YXRpYyBCQVRfQVRUUih2aXNfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdmlzX21vZGUsIHN0b3JlX3Zpc19tb2RlKTsKLXN0YXRpYyBCQVRfQVRUUihvcmlnX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19vcmlnX2ludGVydmFsLCBzdG9yZV9vcmlnX2ludGVydmFsKTsKLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotc3RhdGljIEJBVF9BVFRSKGxvZ19sZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfbG9nX2xldmVsLCBzdG9yZV9sb2dfbGV2ZWwpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqbWVzaF9hdHRyc1tdID0gewotCSZiYXRfYXR0cl9hZ2dyZWdhdGVkX29nbXMsCi0JJmJhdF9hdHRyX2JvbmRpbmcsCi0JJmJhdF9hdHRyX2ZyYWdtZW50YXRpb24sCi0JJmJhdF9hdHRyX3Zpc19tb2RlLAotCSZiYXRfYXR0cl9vcmlnX2ludGVydmFsLAotI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCi0JJmJhdF9hdHRyX2xvZ19sZXZlbCwKLSNlbmRpZgotCU5VTEwsCi19OwotCi1pbnQgc3lzZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBrb2JqZWN0ICpiYXRpZl9rb2JqZWN0ID0gJmRldi0+ZGV2LmtvYmo7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGJhdF9hdHRyaWJ1dGUgKipiYXRfYXR0cjsKLQlpbnQgZXJyOwotCi0JYmF0X3ByaXYtPm1lc2hfb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZChTWVNGU19JRl9NRVNIX1NVQkRJUiwKLQkJCQkJCSAgICBiYXRpZl9rb2JqZWN0KTsKLQlpZiAoIWJhdF9wcml2LT5tZXNoX29iaikgewotCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBkaXJlY3Rvcnk6ICVzLyVzXG4iLCBkZXYtPm5hbWUsCi0JCQlTWVNGU19JRl9NRVNIX1NVQkRJUik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoYmF0X2F0dHIgPSBtZXNoX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLAotCQkJCQkmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWJhdF9lcnIoZGV2LCAiQ2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgU1lTRlNfSUZfTUVTSF9TVUJESVIsCi0JCQkJKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKLQkJCWdvdG8gcmVtX2F0dHI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotcmVtX2F0dHI6Ci0JZm9yIChiYXRfYXR0ciA9IG1lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0KLQlrb2JqZWN0X3B1dChiYXRfcHJpdi0+bWVzaF9vYmopOwotCWJhdF9wcml2LT5tZXNoX29iaiA9IE5VTEw7Ci1vdXQ6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgc3lzZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBiYXRfYXR0cmlidXRlICoqYmF0X2F0dHI7Ci0KLQlmb3IgKGJhdF9hdHRyID0gbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQotCQlzeXNmc19yZW1vdmVfZmlsZShiYXRfcHJpdi0+bWVzaF9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKLQotCWtvYmplY3RfcHV0KGJhdF9wcml2LT5tZXNoX29iaik7Ci0JYmF0X3ByaXYtPm1lc2hfb2JqID0gTlVMTDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19tZXNoX2lmYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYobmV0X2Rldik7Ci0Jc3NpemVfdCBsZW5ndGg7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJcmV0dXJuIDA7Ci0KLQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwgYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfTk9UX0lOX1VTRSA/Ci0JCQkgIm5vbmUiIDogYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLT5uYW1lKTsKLQotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX21lc2hfaWZhY2Uoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KG5ldF9kZXYpOwotCWludCBzdGF0dXNfdG1wID0gLTE7Ci0JaW50IHJldDsKLQotCWlmICghYmF0bWFuX2lmKQotCQlyZXR1cm4gY291bnQ7Ci0KLQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQlpZiAoc3RybGVuKGJ1ZmYpID49IElGTkFNU0laKSB7Ci0JCXByX2VycigiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdtZXNoX2lmYWNlJyBzZXR0aW5nIHJlY2VpdmVkOiAiCi0JCSAgICAgICAiaW50ZXJmYWNlIG5hbWUgdG9vIGxvbmcgJyVzJ1xuIiwgYnVmZik7Ci0JCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cm5jbXAoYnVmZiwgIm5vbmUiLCA0KSA9PSAwKQotCQlzdGF0dXNfdG1wID0gSUZfTk9UX0lOX1VTRTsKLQllbHNlCi0JCXN0YXR1c190bXAgPSBJRl9JX1dBTlRfWU9VOwotCi0JaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBzdGF0dXNfdG1wKSB8fCAoKGJhdG1hbl9pZi0+c29mdF9pZmFjZSkgJiYKLQkgICAgKHN0cm5jbXAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLT5uYW1lLCBidWZmLCBJRk5BTVNJWikgPT0gMCkpKSB7Ci0JCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCWlmIChzdGF0dXNfdG1wID09IElGX05PVF9JTl9VU0UpIHsKLQkJcnRubF9sb2NrKCk7Ci0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlydG5sX3VubG9jaygpOwotCQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKiBpZiB0aGUgaW50ZXJmYWNlIGFscmVhZHkgaXMgaW4gdXNlICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpIHsKLQkJcnRubF9sb2NrKCk7Ci0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlydG5sX3VubG9jaygpOwotCX0KLQotCXJldCA9IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKGJhdG1hbl9pZiwgYnVmZik7Ci0JaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19pZmFjZV9zdGF0dXMoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYobmV0X2Rldik7Ci0Jc3NpemVfdCBsZW5ndGg7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGJhdG1hbl9pZi0+aWZfc3RhdHVzKSB7Ci0JY2FzZSBJRl9UT19CRV9SRU1PVkVEOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJkaXNhYmxpbmdcbiIpOwotCQlicmVhazsKLQljYXNlIElGX0lOQUNUSVZFOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJpbmFjdGl2ZVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgSUZfQUNUSVZFOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJhY3RpdmVcbiIpOwotCQlicmVhazsKLQljYXNlIElGX1RPX0JFX0FDVElWQVRFRDoKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiZW5hYmxpbmdcbiIpOwotCQlicmVhazsKLQljYXNlIElGX05PVF9JTl9VU0U6Ci0JZGVmYXVsdDoKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAibm90IGluIHVzZVxuIik7Ci0JCWJyZWFrOwotCX0KLQotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBCQVRfQVRUUihtZXNoX2lmYWNlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19tZXNoX2lmYWNlLCBzdG9yZV9tZXNoX2lmYWNlKTsKLXN0YXRpYyBCQVRfQVRUUihpZmFjZV9zdGF0dXMsIFNfSVJVR08sIHNob3dfaWZhY2Vfc3RhdHVzLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBiYXRfYXR0cmlidXRlICpiYXRtYW5fYXR0cnNbXSA9IHsKLQkmYmF0X2F0dHJfbWVzaF9pZmFjZSwKLQkmYmF0X2F0dHJfaWZhY2Vfc3RhdHVzLAotCU5VTEwsCi19OwotCi1pbnQgc3lzZnNfYWRkX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmosIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGtvYmplY3QgKmhhcmRpZl9rb2JqZWN0ID0gJmRldi0+ZGV2LmtvYmo7Ci0Jc3RydWN0IGJhdF9hdHRyaWJ1dGUgKipiYXRfYXR0cjsKLQlpbnQgZXJyOwotCi0JKmhhcmRpZl9vYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKFNZU0ZTX0lGX0JBVF9TVUJESVIsCi0JCQkJCQkgICAgaGFyZGlmX2tvYmplY3QpOwotCi0JaWYgKCEqaGFyZGlmX29iaikgewotCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBkaXJlY3Rvcnk6ICVzLyVzXG4iLCBkZXYtPm5hbWUsCi0JCQlTWVNGU19JRl9CQVRfU1VCRElSKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChiYXRfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWJhdF9lcnIoZGV2LCAiQ2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgU1lTRlNfSUZfQkFUX1NVQkRJUiwKLQkJCQkoKCpiYXRfYXR0ciktPmF0dHIpLm5hbWUpOwotCQkJZ290byByZW1fYXR0cjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotCi1yZW1fYXR0cjoKLQlmb3IgKGJhdF9hdHRyID0gYmF0bWFuX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci1vdXQ6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopCi17Ci0Ja29iamVjdF9wdXQoKmhhcmRpZl9vYmopOwotCSpoYXJkaWZfb2JqID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTg2YzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU1lTRlNfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfCi0KLSNkZWZpbmUgU1lTRlNfSUZfTUVTSF9TVUJESVIgIm1lc2giCi0jZGVmaW5lIFNZU0ZTX0lGX0JBVF9TVUJESVIgImJhdG1hbl9hZHYiCi0KLXN0cnVjdCBiYXRfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLX07Ci0KLWludCBzeXNmc19hZGRfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBzeXNmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0Mjc0Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImJpdGFycmF5LmgiCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotLyogcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgZ2l2ZW4gc2VxX2JpdHMgaW5kaWNhdGVzIHRydWUKLSAqIGFuZCBjdXJyX3NlcW5vIGlzIHdpdGhpbiByYW5nZSBvZiBsYXN0X3NlcW5vICovCi11aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQzMl90IGxhc3Rfc2Vxbm8sCi0JCSAgICAgICB1aW50MzJfdCBjdXJyX3NlcW5vKQotewotCWludDMyX3QgZGlmZiwgd29yZF9vZmZzZXQsIHdvcmRfbnVtOwotCi0JZGlmZiA9IGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vOwotCWlmIChkaWZmIDwgMCB8fCBkaWZmID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qIHdoaWNoIHdvcmQgKi8KLQkJd29yZF9udW0gPSAobGFzdF9zZXFubyAtIGN1cnJfc2Vxbm8pIC8gV09SRF9CSVRfU0laRTsKLQkJLyogd2hpY2ggcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIHdvcmQgKi8KLQkJd29yZF9vZmZzZXQgPSAobGFzdF9zZXFubyAtIGN1cnJfc2Vxbm8pICUgV09SRF9CSVRfU0laRTsKLQotCQlpZiAoc2VxX2JpdHNbd29yZF9udW1dICYgMSA8PCB3b3JkX29mZnNldCkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qIHR1cm4gY29ycmVzcG9uZGluZyBiaXQgb24sIHNvIHdlIGNhbiByZW1lbWJlciB0aGF0IHdlIGdvdCB0aGUgcGFja2V0ICovCi12b2lkIGJpdF9tYXJrKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3QgbikKLXsKLQlpbnQzMl90IHdvcmRfb2Zmc2V0LCB3b3JkX251bTsKLQotCS8qIGlmIHRvbyBvbGQsIGp1c3QgZHJvcCBpdCAqLwotCWlmIChuIDwgMCB8fCBuID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQlyZXR1cm47Ci0KLQkvKiB3aGljaCB3b3JkICovCi0Jd29yZF9udW0gPSBuIC8gV09SRF9CSVRfU0laRTsKLQkvKiB3aGljaCBwb3NpdGlvbiBpbiB0aGUgc2VsZWN0ZWQgd29yZCAqLwotCXdvcmRfb2Zmc2V0ID0gbiAlIFdPUkRfQklUX1NJWkU7Ci0KLQlzZXFfYml0c1t3b3JkX251bV0gfD0gMSA8PCB3b3JkX29mZnNldDsJLyogdHVybiB0aGUgcG9zaXRpb24gb24gKi8KLX0KLQotLyogc2hpZnQgdGhlIHBhY2tldCBhcnJheSBieSBuIHBsYWNlcy4gKi8KLXN0YXRpYyB2b2lkIGJpdF9zaGlmdChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCi17Ci0JaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07Ci0JaW50MzJfdCBpOwotCi0JaWYgKG4gPD0gMCB8fCBuID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQlyZXR1cm47Ci0KLQl3b3JkX29mZnNldCA9IG4gJSBXT1JEX0JJVF9TSVpFOy8qIHNoaWZ0IGhvdyBtdWNoIGluc2lkZSBlYWNoIHdvcmQgKi8KLQl3b3JkX251bSA9IG4gLyBXT1JEX0JJVF9TSVpFOwkvKiBzaGlmdCBvdmVyIGhvdyBtdWNoIChmdWxsKSB3b3JkcyAqLwotCi0JZm9yIChpID0gTlVNX1dPUkRTIC0gMTsgaSA+IHdvcmRfbnVtOyBpLS0pIHsKLQkJLyogZ29pbmcgZnJvbSBvbGQgdG8gbmV3LCBzbyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGRhdGEgd2UgY29weQotCQkgKiBmcm9tLgotCQkgKgotCQkgKiBsZWZ0IGlzIGhpZ2gsIHJpZ2h0IGlzIGxvdzogRkVEQyBCQTk4IDc2NTQgMzIxMAotCQkgKgkJCQkJICBeXiBeXgotCQkgKgkJCSAgICAgICB2dnZ2Ci0JCSAqIF5eXl4gPSBmcm9tLCB2dnZ2diA9dG8sIHdlJ2QgaGF2ZSB3b3JkX251bT09MSBhbmQKLQkJICogd29yZF9vZmZzZXQ9PVdPUkRfQklUX1NJWkUvMiA/Pz8/PyBpbiB0aGlzIGV4YW1wbGUuCi0JCSAqICg9MjQgYml0cykKLQkJICoKLQkJICogb3VyIGRlc2lyZWQgb3V0cHV0IHdvdWxkIGJlOiA5ODc2IDU0MzIgMTAwMCAwMDAwCi0JCSAqICovCi0KLQkJc2VxX2JpdHNbaV0gPQotCQkJKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpICsKLQkJCS8qIHRha2UgdGhlIGxvd2VyIHBvcnQgZnJvbSB0aGUgbGVmdCBoYWxmLCBzaGlmdCBpdCBsZWZ0Ci0JCQkgKiB0byBpdHMgZmluYWwgcG9zaXRpb24gKi8KLQkJCShzZXFfYml0c1tpIC0gd29yZF9udW0gLSAxXSA+PgotCQkJIChXT1JEX0JJVF9TSVpFLXdvcmRfb2Zmc2V0KSk7Ci0JCS8qIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmlnaHQgaGFsZiBhbmQgc2hpZnQgaXQgbGVmdCB0bwotCQkgKiBpdCdzIHBvc2l0aW9uICovCi0JCS8qIGZvciBvdXIgZXhhbXBsZSB0aGF0IHdvdWxkIGJlOiB3b3JkWzBdID0gOTgwMCArIDAwNzYgPQotCQkgKiA5ODc2ICovCi0JfQotCS8qIG5vdyBmb3Igb3VyIGxhc3Qgd29yZCwgaT09d29yZF9udW0sIHdlIG9ubHkgaGF2ZSB0aGUgaXQncyAibGVmdCIKLQkgKiBoYWxmLiB0aGF0J3MgdGhlIDEwMDAgd29yZCBpbiBvdXIgZXhhbXBsZS4qLwotCi0Jc2VxX2JpdHNbaV0gPSAoc2VxX2JpdHNbaSAtIHdvcmRfbnVtXSA8PCB3b3JkX29mZnNldCk7Ci0KLQkvKiBwYWQgdGhlIHJlc3Qgd2l0aCAwLCBpZiB0aGVyZSBpcyBhbnl0aGluZyAqLwotCWktLTsKLQotCWZvciAoOyBpID49IDA7IGktLSkKLQkJc2VxX2JpdHNbaV0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBiaXRfcmVzZXRfd2luZG93KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9XT1JEUzsgaSsrKQotCQlzZXFfYml0c1tpXSA9IDA7Ci19Ci0KLQotLyogcmVjZWl2ZSBhbmQgcHJvY2VzcyBvbmUgcGFja2V0IHdpdGhpbiB0aGUgc2VxdWVuY2UgbnVtYmVyIHdpbmRvdy4KLSAqCi0gKiByZXR1cm5zOgotICogIDEgaWYgdGhlIHdpbmRvdyB3YXMgbW92ZWQgKGVpdGhlciBuZXcgb3IgdmVyeSBvbGQpCi0gKiAgMCBpZiB0aGUgd2luZG93IHdhcyBub3QgbW92ZWQvc2hpZnRlZC4KLSAqLwotY2hhciBiaXRfZ2V0X3BhY2tldCh2b2lkICpwcml2LCBUWVBFX09GX1dPUkQgKnNlcV9iaXRzLAotCQkgICAgaW50MzJfdCBzZXFfbnVtX2RpZmYsIGludDhfdCBzZXRfbWFyaykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gKHN0cnVjdCBiYXRfcHJpdiAqKXByaXY7Ci0KLQkvKiBzZXF1ZW5jZSBudW1iZXIgaXMgc2xpZ2h0bHkgb2xkZXIuIFdlIGFscmVhZHkgZ290IGEgc2VxdWVuY2UgbnVtYmVyCi0JICogaGlnaGVyIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGp1c3QgbWFyayBpdC4gKi8KLQotCWlmICgoc2VxX251bV9kaWZmIDw9IDApICYmIChzZXFfbnVtX2RpZmYgPiAtVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7Ci0JCWlmIChzZXRfbWFyaykKLQkJCWJpdF9tYXJrKHNlcV9iaXRzLCAtc2VxX251bV9kaWZmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogc2VxdWVuY2UgbnVtYmVyIGlzIHNsaWdodGx5IG5ld2VyLCBzbyB3ZSBzaGlmdCB0aGUgd2luZG93IGFuZAotCSAqIHNldCB0aGUgbWFyayBpZiByZXF1aXJlZCAqLwotCi0JaWYgKChzZXFfbnVtX2RpZmYgPiAwKSAmJiAoc2VxX251bV9kaWZmIDwgVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7Ci0JCWJpdF9zaGlmdChzZXFfYml0cywgc2VxX251bV9kaWZmKTsKLQotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgMCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIHNlcXVlbmNlIG51bWJlciBpcyBtdWNoIG5ld2VyLCBwcm9iYWJseSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAqLwotCi0JaWYgKChzZXFfbnVtX2RpZmYgPj0gVFFfTE9DQUxfV0lORE9XX1NJWkUpCi0JCXx8IChzZXFfbnVtX2RpZmYgPCBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJXZSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAoJWkpICFcbiIsCi0JCQlzZXFfbnVtX2RpZmYgLSAxKTsKLQkJYml0X3Jlc2V0X3dpbmRvdyhzZXFfYml0cyk7Ci0JCWlmIChzZXRfbWFyaykKLQkJCWJpdF9tYXJrKHNlcV9iaXRzLCAwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogcmVjZWl2ZWQgYSBtdWNoIG9sZGVyIHBhY2tldC4gVGhlIG90aGVyIGhvc3QgZWl0aGVyIHJlc3RhcnRlZAotCSAqIG9yIHRoZSBvbGQgcGFja2V0IGdvdCBkZWxheWVkIHNvbWV3aGVyZSBpbiB0aGUgbmV0d29yay4gVGhlCi0JICogcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIHdpdGhvdXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlmIHRoZQotCSAqIHNlcW5vIHdpbmRvdyBpcyBwcm90ZWN0ZWQuICovCi0KLQlpZiAoKHNlcV9udW1fZGlmZiA8PSAtVFFfTE9DQUxfV0lORE9XX1NJWkUpCi0JCXx8IChzZXFfbnVtX2RpZmYgPj0gRVhQRUNURURfU0VRTk9fUkFOR0UpKSB7Ci0KLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJPdGhlciBob3N0IHByb2JhYmx5IHJlc3RhcnRlZCFcbiIpOwotCi0JCWJpdF9yZXNldF93aW5kb3coc2VxX2JpdHMpOwotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgMCk7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogbmV2ZXIgcmVhY2hlZCAqLwotCXJldHVybiAwOwotfQotCi0vKiBjb3VudCB0aGUgaGFtbWluZyB3ZWlnaHQsIGhvdyBtYW55IGdvb2QgcGFja2V0cyBkaWQgd2UgcmVjZWl2ZT8ganVzdCBjb3VudAotICogdGhlIDEncy4KLSAqLwotaW50IGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cykKLXsKLQlpbnQgaSwgaGFtbWluZyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1dPUkRTOyBpKyspCi0JCWhhbW1pbmcgKz0gaHdlaWdodF9sb25nKHNlcV9iaXRzW2ldKTsKLQotCXJldHVybiBoYW1taW5nOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjFlNjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9CSVRBUlJBWV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8KLQotLyogeW91IHNob3VsZCBjaG9vc2Ugc29tZXRoaW5nIGJpZywgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FzdGUgY3B1Ci0gKiBhbmQga2VlcCB0aGUgdHlwZSBpbiBzeW5jIHdpdGggYml0X3BhY2tldF9jb3VudCAqLwotI2RlZmluZSBUWVBFX09GX1dPUkQgdW5zaWduZWQgbG9uZwotI2RlZmluZSBXT1JEX0JJVF9TSVpFIChzaXplb2YoVFlQRV9PRl9XT1JEKSAqIDgpCi0KLS8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCi0gKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwotdWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MzJfdCBsYXN0X3NlcW5vLAotCQkJCQkgICB1aW50MzJfdCBjdXJyX3NlcW5vKTsKLQotLyogdHVybiBjb3JyZXNwb25kaW5nIGJpdCBvbiwgc28gd2UgY2FuIHJlbWVtYmVyIHRoYXQgd2UgZ290IHRoZSBwYWNrZXQgKi8KLXZvaWQgYml0X21hcmsoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKLQotCi0vKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKLSAqIG5ldywgMCBpZiBvbGQgICovCi1jaGFyIGJpdF9nZXRfcGFja2V0KHZvaWQgKnByaXYsIFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsCi0JCSAgICBpbnQzMl90IHNlcV9udW1fZGlmZiwgaW50OF90IHNldF9tYXJrKTsKLQotLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/ICovCi1pbnQgIGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cyk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVkZTgyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJiYXRfc3lzZnMuaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCi0KLS8qIHByb3RlY3QgdXBkYXRlIGNyaXRpY2FsIHNpZGUgb2YgaWZfbGlzdCAtIGJ1dCBub3QgdGhlIGNvbnRlbnQgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaWZfbGlzdF9sb2NrKTsKLQotc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+bmV0X2RldiA9PSBuZXRfZGV2KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JYmF0bWFuX2lmID0gTlVMTDsKLQotb3V0OgotCWlmIChiYXRtYW5faWYpCi0JCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gYmF0bWFuX2lmOwotfQotCi1zdGF0aWMgaW50IGlzX3ZhbGlkX2lmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobmV0X2Rldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCi0JCXJldHVybiAwOwotCi0JaWYgKG5ldF9kZXYtPmFkZHJfbGVuICE9IEVUSF9BTEVOKQotCQlyZXR1cm4gMDsKLQotCS8qIG5vIGJhdG1hbiBvdmVyIGJhdG1hbiAqLwotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKLQlpZiAobmV0X2Rldi0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQgPT0gaW50ZXJmYWNlX3R4KQotCQlyZXR1cm4gMDsKLSNlbHNlCi0JaWYgKG5ldF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9PSBpbnRlcmZhY2VfdHgpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQkvKiBEZXZpY2UgaXMgYmVpbmcgYnJpZGdlZCAqLwotCS8qIGlmIChuZXRfZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKQotCQlyZXR1cm4gMDsgKi8KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2FjdGl2ZV9iYXRtYW5faWYoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX0FDVElWRSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWJhdG1hbl9pZiA9IE5VTEw7Ci0KLW91dDoKLQlpZiAoYmF0bWFuX2lmKQotCQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGJhdG1hbl9pZjsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3ByaW1hcnlfYWRkcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0OwotCi0JdmlzX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKQotCQkJCWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQltZW1jcHkodmlzX3BhY2tldC0+dmlzX29yaWcsCi0JICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh2aXNfcGFja2V0LT5zZW5kZXJfb3JpZywKLQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9wcmltYXJ5X2lmKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqb2xkX2lmOwotCi0JaWYgKGJhdG1hbl9pZikKLQkJaGFyZGlmX2hvbGQoYmF0bWFuX2lmKTsKLQotCW9sZF9pZiA9IGJhdF9wcml2LT5wcmltYXJ5X2lmOwotCWJhdF9wcml2LT5wcmltYXJ5X2lmID0gYmF0bWFuX2lmOwotCi0JaWYgKG9sZF9pZikKLQkJaGFyZGlmX3B1dChvbGRfaWYpOwotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJcmV0dXJuOwotCi0JYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKLQliYXRtYW5fcGFja2V0LT5mbGFncyA9IFBSSU1BUklFU19GSVJTVF9IT1A7Ci0JYmF0bWFuX3BhY2tldC0+dHRsID0gVFRMOwotCi0JdXBkYXRlX3ByaW1hcnlfYWRkcihiYXRfcHJpdik7Ci0KLQkvKioqCi0JICogaGFja3kgdHJpY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc2VuZCB0aGUgSE5BIGluZm9ybWF0aW9uIHZpYQotCSAqIG91ciBuZXcgcHJpbWFyeSBpbnRlcmZhY2UKLQkgKi8KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDEpOwotfQotCi1zdGF0aWMgYm9vbCBoYXJkaWZfaXNfaWZhY2VfdXAoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWlmIChiYXRtYW5faWYtPm5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX21hY19hZGRyZXNzZXMoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+b3JpZywKLQkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+cHJldl9zZW5kZXIsCi0JICAgICAgIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfa25vd25fbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpICYmCi0JCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPm5ldF9kZXYgPT0gbmV0X2RldikKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsCi0JCQkJICBuZXRfZGV2LT5kZXZfYWRkcikpCi0JCQljb250aW51ZTsKLQotCQlwcl93YXJuaW5nKCJUaGUgbmV3bHkgYWRkZWQgbWFjIGFkZHJlc3MgKCVwTSkgYWxyZWFkeSBleGlzdHMgIgotCQkJICAgIm9uOiAlc1xuIiwgbmV0X2Rldi0+ZGV2X2FkZHIsCi0JCQkgICBiYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUpOwotCQlwcl93YXJuaW5nKCJJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBrZWVwIG1hYyBhZGRyZXNzZXMgIgotCQkJICAgInVuaXF1ZSB0byBhdm9pZCBwcm9ibGVtcyFcbiIpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotaW50IGhhcmRpZl9taW5fbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JLyogYWxsb3cgYmlnIGZyYW1lcyBpZiBhbGwgZGV2aWNlcyBhcmUgY2FwYWJsZSB0byBkbyBzbwotCSAqIChoYXZlIE1UVSA+IDE1MDAgKyBCQVRfSEVBREVSX0xFTikgKi8KLQlpbnQgbWluX210dSA9IEVUSF9EQVRBX0xFTjsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkpCi0JCWdvdG8gb3V0OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpICYmCi0JCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCW1pbl9tdHUgPSBNSU4oYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUgLSBCQVRfSEVBREVSX0xFTiwKLQkJCSAgICAgIG1pbl9tdHUpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLW91dDoKLQlyZXR1cm4gbWluX210dTsKLX0KLQotLyogYWRqdXN0cyB0aGUgTVRVIGlmIGEgbmV3IGludGVyZmFjZSB3aXRoIGEgc21hbGxlciBNVFUgYXBwZWFyZWQuICovCi12b2lkIHVwZGF0ZV9taW5fbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCWludCBtaW5fbXR1OwotCi0JbWluX210dSA9IGhhcmRpZl9taW5fbXR1KHNvZnRfaWZhY2UpOwotCWlmIChzb2Z0X2lmYWNlLT5tdHUgIT0gbWluX210dSkKLQkJc29mdF9pZmFjZS0+bXR1ID0gbWluX210dTsKLX0KLQotc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9JTkFDVElWRSkKLQkJcmV0dXJuOwotCi0JYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCi0JdXBkYXRlX21hY19hZGRyZXNzZXMoYmF0bWFuX2lmKTsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX1RPX0JFX0FDVElWQVRFRDsKLQotCS8qKgotCSAqIHRoZSBmaXJzdCBhY3RpdmUgaW50ZXJmYWNlIGJlY29tZXMgb3VyIHByaW1hcnkgaW50ZXJmYWNlIG9yCi0JICogdGhlIG5leHQgYWN0aXZlIGludGVyZmFjZSBhZnRlciB0aGUgb2xkIHByaW1heSBpbnRlcmZhY2Ugd2FzIHJlbW92ZWQKLQkgKi8KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlzZXRfcHJpbWFyeV9pZihiYXRfcHJpdiwgYmF0bWFuX2lmKTsKLQotCWJhdF9pbmZvKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIkludGVyZmFjZSBhY3RpdmF0ZWQ6ICVzXG4iLAotCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQotCXVwZGF0ZV9taW5fbXR1KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBoYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWlmICgoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKSAmJgotCSAgIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9UT19CRV9BQ1RJVkFURUQpKQotCQlyZXR1cm47Ci0KLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX0lOQUNUSVZFOwotCi0JYmF0X2luZm8oYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiSW50ZXJmYWNlIGRlYWN0aXZhdGVkOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQl1cGRhdGVfbWluX210dShiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotfQotCi1pbnQgaGFyZGlmX2VuYWJsZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCBjaGFyICppZmFjZV9uYW1lKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfTk9UX0lOX1VTRSkKLQkJZ290byBvdXQ7Ci0KLQliYXRtYW5faWYtPnNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpZmFjZV9uYW1lKTsKLQotCWlmICghYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKSB7Ci0JCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IHNvZnRpZl9jcmVhdGUoaWZhY2VfbmFtZSk7Ci0KLQkJaWYgKCFiYXRtYW5faWYtPnNvZnRfaWZhY2UpCi0JCQlnb3RvIGVycjsKLQotCQkvKiBkZXZfZ2V0X2J5X25hbWUoKSBpbmNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGZvciB1cyAqLwotCQlkZXZfaG9sZChiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCX0KLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQliYXRtYW5faWYtPnBhY2tldF9sZW4gPSBCQVRfUEFDS0VUX0xFTjsKLQliYXRtYW5faWYtPnBhY2tldF9idWZmID0ga21hbGxvYyhiYXRtYW5faWYtPnBhY2tldF9sZW4sIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFiYXRtYW5faWYtPnBhY2tldF9idWZmKSB7Ci0JCWJhdF9lcnIoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSBwYWNrZXQgIgotCQkJIiglcyk6IG91dCBvZiBtZW1vcnlcbiIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7Ci0JYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfUEFDS0VUOwotCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQliYXRtYW5fcGFja2V0LT5mbGFncyA9IDA7Ci0JYmF0bWFuX3BhY2tldC0+dHRsID0gMjsKLQliYXRtYW5fcGFja2V0LT50cSA9IFRRX01BWF9WQUxVRTsKLQliYXRtYW5fcGFja2V0LT5udW1faG5hID0gMDsKLQotCWJhdG1hbl9pZi0+aWZfbnVtID0gYmF0X3ByaXYtPm51bV9pZmFjZXM7Ci0JYmF0X3ByaXYtPm51bV9pZmFjZXMrKzsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX0lOQUNUSVZFOwotCW9yaWdfaGFzaF9hZGRfaWYoYmF0bWFuX2lmLCBiYXRfcHJpdi0+bnVtX2lmYWNlcyk7Ci0KLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUuZnVuYyA9IGJhdG1hbl9za2JfcmVjdjsKLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUuZGV2ID0gYmF0bWFuX2lmLT5uZXRfZGV2OwotCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0JZGV2X2FkZF9wYWNrKCZiYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUpOwotCi0JYXRvbWljX3NldCgmYmF0bWFuX2lmLT5zZXFubywgMSk7Ci0JYXRvbWljX3NldCgmYmF0bWFuX2lmLT5mcmFnX3NlcW5vLCAxKTsKLQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJBZGRpbmcgaW50ZXJmYWNlOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpICYmIGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1IDwKLQkJRVRIX0RBVEFfTEVOICsgQkFUX0hFQURFUl9MRU4pCi0JCWJhdF9pbmZvKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwKLQkJCSJUaGUgTVRVIG9mIGludGVyZmFjZSAlcyBpcyB0b28gc21hbGwgKCVpKSB0byBoYW5kbGUgIgotCQkJInRoZSB0cmFuc3BvcnQgb2YgYmF0bWFuLWFkdiBwYWNrZXRzLiBQYWNrZXRzIGdvaW5nICIKLQkJCSJvdmVyIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgZnJhZ21lbnRlZCBvbiBsYXllcjIgIgotCQkJIndoaWNoIGNvdWxkIGltcGFjdCB0aGUgcGVyZm9ybWFuY2UuIFNldHRpbmcgdGhlIE1UVSAiCi0JCQkidG8gJXppIHdvdWxkIHNvbHZlIHRoZSBwcm9ibGVtLlxuIiwKLQkJCWJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSwgYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUsCi0JCQlFVEhfREFUQV9MRU4gKyBCQVRfSEVBREVSX0xFTik7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSAmJiBiYXRtYW5faWYtPm5ldF9kZXYtPm10dSA8Ci0JCUVUSF9EQVRBX0xFTiArIEJBVF9IRUFERVJfTEVOKQotCQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsCi0JCQkiVGhlIE1UVSBvZiBpbnRlcmZhY2UgJXMgaXMgdG9vIHNtYWxsICglaSkgdG8gaGFuZGxlICIKLQkJCSJ0aGUgdHJhbnNwb3J0IG9mIGJhdG1hbi1hZHYgcGFja2V0cy4gSWYgeW91IGV4cGVyaWVuY2UiCi0JCQkiIHByb2JsZW1zIGdldHRpbmcgdHJhZmZpYyB0aHJvdWdoIHRyeSBpbmNyZWFzaW5nIHRoZSAiCi0JCQkiTVRVIHRvICV6aS5cbiIsCi0JCQliYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1LAotCQkJRVRIX0RBVEFfTEVOICsgQkFUX0hFQURFUl9MRU4pOwotCi0JaWYgKGhhcmRpZl9pc19pZmFjZV91cChiYXRtYW5faWYpKQotCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7Ci0JZWxzZQotCQliYXRfZXJyKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIk5vdCB1c2luZyBpbnRlcmZhY2UgJXMgIgotCQkJIihyZXRyeWluZyBsYXRlcik6IGludGVyZmFjZSBub3QgYWN0aXZlXG4iLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQotCS8qIGJlZ2luIHNjaGVkdWxpbmcgb3JpZ2luYXRvciBtZXNzYWdlcyBvbiB0aGF0IGludGVyZmFjZSAqLwotCXNjaGVkdWxlX293bl9wYWNrZXQoYmF0bWFuX2lmKTsKLQotb3V0OgotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgaGFyZGlmX2Rpc2FibGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9BQ1RJVkUpCi0JCWhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0lOQUNUSVZFKQotCQlyZXR1cm47Ci0KLQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJSZW1vdmluZyBpbnRlcmZhY2U6ICVzXG4iLAotCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQlkZXZfcmVtb3ZlX3BhY2soJmJhdG1hbl9pZi0+YmF0bWFuX2Fkdl9wdHlwZSk7Ci0JaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCi0JYmF0X3ByaXYtPm51bV9pZmFjZXMtLTsKLQlvcmlnX2hhc2hfZGVsX2lmKGJhdG1hbl9pZiwgYmF0X3ByaXYtPm51bV9pZmFjZXMpOwotCi0JaWYgKGJhdG1hbl9pZiA9PSBiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlzdHJ1Y3QgYmF0bWFuX2lmICpuZXdfaWY7Ci0KLQkJbmV3X2lmID0gZ2V0X2FjdGl2ZV9iYXRtYW5faWYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQkJc2V0X3ByaW1hcnlfaWYoYmF0X3ByaXYsIG5ld19pZik7Ci0KLQkJaWYgKG5ld19pZikKLQkJCWhhcmRpZl9wdXQobmV3X2lmKTsKLQl9Ci0KLQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKLQliYXRtYW5faWYtPnBhY2tldF9idWZmID0gTlVMTDsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX05PVF9JTl9VU0U7Ci0KLQkvKiBkZWxldGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBiYXRtYW5faWYgKi8KLQlwdXJnZV9vcmlnX3JlZihiYXRfcHJpdik7Ci0JcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhiYXRfcHJpdiwgYmF0bWFuX2lmKTsKLQlkZXZfcHV0KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0KLQkvKiBub2JvZHkgdXNlcyB0aGlzIGludGVyZmFjZSBhbnltb3JlICovCi0JaWYgKCFiYXRfcHJpdi0+bnVtX2lmYWNlcykKLQkJc29mdGlmX2Rlc3Ryb3koYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmF0bWFuX2lmICpoYXJkaWZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQotCXJldCA9IGlzX3ZhbGlkX2lmYWNlKG5ldF9kZXYpOwotCWlmIChyZXQgIT0gMSkKLQkJZ290byBvdXQ7Ci0KLQlkZXZfaG9sZChuZXRfZGV2KTsKLQotCWJhdG1hbl9pZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYXRtYW5faWYpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJhdG1hbl9pZikgewotCQlwcl9lcnIoIkNhbid0IGFkZCBpbnRlcmZhY2UgKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwKLQkJICAgICAgIG5ldF9kZXYtPm5hbWUpOwotCQlnb3RvIHJlbGVhc2VfZGV2OwotCX0KLQotCXJldCA9IHN5c2ZzX2FkZF9oYXJkaWYoJmJhdG1hbl9pZi0+aGFyZGlmX29iaiwgbmV0X2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlX2lmOwotCi0JYmF0bWFuX2lmLT5pZl9udW0gPSAtMTsKLQliYXRtYW5faWYtPm5ldF9kZXYgPSBuZXRfZGV2OwotCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IE5VTEw7Ci0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9OT1RfSU5fVVNFOwotCUlOSVRfTElTVF9IRUFEKCZiYXRtYW5faWYtPmxpc3QpOwotCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+cmVmY250LCAwKTsKLQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCi0JY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2KTsKLQotCXNwaW5fbG9jaygmaWZfbGlzdF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmYmF0bWFuX2lmLT5saXN0LCAmaWZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmlmX2xpc3RfbG9jayk7Ci0KLQkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwotCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0JcmV0dXJuIGJhdG1hbl9pZjsKLQotZnJlZV9pZjoKLQlrZnJlZShiYXRtYW5faWYpOwotcmVsZWFzZV9kZXY6Ci0JZGV2X3B1dChuZXRfZGV2KTsKLW91dDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCS8qIGZpcnN0IGRlYWN0aXZhdGUgaW50ZXJmYWNlICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpCi0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpCi0JCXJldHVybjsKLQotCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfVE9fQkVfUkVNT1ZFRDsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQlzeXNmc19kZWxfaGFyZGlmKCZiYXRtYW5faWYtPmhhcmRpZl9vYmopOwotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLX0KLQotdm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCkKLXsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsICpiYXRtYW5faWZfdG1wOwotCXN0cnVjdCBsaXN0X2hlYWQgaWZfcXVldWU7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaWZfcXVldWUpOwotCi0Jc3Bpbl9sb2NrKCZpZl9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiYXRtYW5faWYsIGJhdG1hbl9pZl90bXAsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmYmF0bWFuX2lmLT5saXN0LCAmaWZfcXVldWUpOwotCX0KLQlzcGluX3VubG9jaygmaWZfbGlzdF9sb2NrKTsKLQotCXJ0bmxfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiYXRtYW5faWYsIGJhdG1hbl9pZl90bXAsICZpZl9xdWV1ZSwgbGlzdCkgewotCQloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCX0KLQlydG5sX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IGhhcmRfaWZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYgPSBnZXRfYmF0bWFuX2lmX2J5X25ldGRldihuZXRfZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCi0JaWYgKCFiYXRtYW5faWYgJiYgZXZlbnQgPT0gTkVUREVWX1JFR0lTVEVSKQotCQliYXRtYW5faWYgPSBoYXJkaWZfYWRkX2ludGVyZmFjZShuZXRfZGV2KTsKLQotCWlmICghYmF0bWFuX2lmKQotCQlnb3RvIG91dDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIE5FVERFVl9VUDoKLQkJaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlicmVhazsKLQljYXNlIE5FVERFVl9HT0lOR19ET1dOOgotCWNhc2UgTkVUREVWX0RPV046Ci0JCWhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlicmVhazsKLQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgotCQlzcGluX2xvY2soJmlmX2xpc3RfbG9jayk7Ci0JCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmlmX2xpc3RfbG9jayk7Ci0KLQkJaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfQ0hBTkdFTVRVOgotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKQotCQkJdXBkYXRlX21pbl9tdHUoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UpIHsKLQkJCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2KTsKLQkJdXBkYXRlX21hY19hZGRyZXNzZXMoYmF0bWFuX2lmKTsKLQotCQliYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JCWlmIChiYXRtYW5faWYgPT0gYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCQl1cGRhdGVfcHJpbWFyeV9hZGRyKGJhdF9wcml2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfTsKLQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0KLW91dDoKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLS8qIHJlY2VpdmUgYSBwYWNrZXQgd2l0aCB0aGUgYmF0bWFuIGV0aGVydHlwZSBjb21pbmcgb24gYSBoYXJkCi0gKiBpbnRlcmZhY2UgKi8KLWludCBiYXRtYW5fc2tiX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQotCWJhdG1hbl9pZiA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJhdG1hbl9pZiwgYmF0bWFuX2Fkdl9wdHlwZSk7Ci0Jc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7Ci0KLQkvKiBza2Igd2FzIHJlbGVhc2VkIGJ5IHNrYl9zaGFyZV9jaGVjaygpICovCi0JaWYgKCFza2IpCi0JCWdvdG8gZXJyX291dDsKLQotCS8qIHBhY2tldCBzaG91bGQgaG9sZCBhdCBsZWFzdCB0eXBlIGFuZCB2ZXJzaW9uICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgMikpKQotCQlnb3RvIGVycl9mcmVlOwotCi0JLyogZXhwZWN0IGEgdmFsaWQgZXRoZXJuZXQgaGVhZGVyIGhlcmUuICovCi0JaWYgKHVubGlrZWx5KHNrYi0+bWFjX2xlbiAhPSBzaXplb2Yoc3RydWN0IGV0aGhkcikKLQkJCQl8fCAhc2tiX21hY19oZWFkZXIoc2tiKSkpCi0JCWdvdG8gZXJyX2ZyZWU7Ci0KLQlpZiAoIWJhdG1hbl9pZi0+c29mdF9pZmFjZSkKLQkJZ290byBlcnJfZnJlZTsKLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpICE9IE1FU0hfQUNUSVZFKQotCQlnb3RvIGVycl9mcmVlOwotCi0JLyogZGlzY2FyZCBmcmFtZXMgb24gbm90IGFjdGl2ZSBpbnRlcmZhY2VzICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBlcnJfZnJlZTsKLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKVxuIiwKLQkJCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCS8qIGFsbCByZWNlaXZlIGhhbmRsZXJzIHJldHVybiB3aGV0aGVyIHRoZXkgcmVjZWl2ZWQgb3IgcmV1c2VkCi0JICogdGhlIHN1cHBsaWVkIHNrYi4gaWYgbm90LCB3ZSBoYXZlIHRvIGZyZWUgdGhlIHNrYi4gKi8KLQotCXN3aXRjaCAoYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUpIHsKLQkJLyogYmF0bWFuIG9yaWdpbmF0b3IgcGFja2V0ICovCi0JY2FzZSBCQVRfUEFDS0VUOgotCQlyZXQgPSByZWN2X2JhdF9wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQotCQkvKiBiYXRtYW4gaWNtcCBwYWNrZXQgKi8KLQljYXNlIEJBVF9JQ01QOgotCQlyZXQgPSByZWN2X2ljbXBfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KLQljYXNlIEJBVF9VTklDQVNUOgotCQlyZXQgPSByZWN2X3VuaWNhc3RfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogZnJhZ21lbnRlZCB1bmljYXN0IHBhY2tldCAqLwotCWNhc2UgQkFUX1VOSUNBU1RfRlJBRzoKLQkJcmV0ID0gcmVjdl91Y2FzdF9mcmFnX3BhY2tldChza2IsIGJhdG1hbl9pZik7Ci0JCWJyZWFrOwotCi0JCS8qIGJyb2FkY2FzdCBwYWNrZXQgKi8KLQljYXNlIEJBVF9CQ0FTVDoKLQkJcmV0ID0gcmVjdl9iY2FzdF9wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQotCQkvKiB2aXMgcGFja2V0ICovCi0JY2FzZSBCQVRfVklTOgotCQlyZXQgPSByZWN2X3Zpc19wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSBORVRfUlhfRFJPUDsKLQl9Ci0KLQlpZiAocmV0ID09IE5FVF9SWF9EUk9QKQotCQlrZnJlZV9za2Ioc2tiKTsKLQotCS8qIHJldHVybiBORVRfUlhfU1VDQ0VTUyBpbiBhbnkgY2FzZSBhcyB3ZQotCSAqIG1vc3QgcHJvYmFibHkgZHJvcHBlZCB0aGUgcGFja2V0IGZvcgotCSAqIHJvdXRpbmctbG9naWNhbCByZWFzb25zLiAqLwotCi0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCi1lcnJfZnJlZToKLQlrZnJlZV9za2Ioc2tiKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIE5FVF9SWF9EUk9QOwotfQotCi1zdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGhhcmRfaWZfZXZlbnQsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTA4ODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9IQVJEX0lOVEVSRkFDRV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfSEFSRF9JTlRFUkZBQ0VfSF8KLQotI2RlZmluZSBJRl9OT1RfSU5fVVNFIDAKLSNkZWZpbmUgSUZfVE9fQkVfUkVNT1ZFRCAxCi0jZGVmaW5lIElGX0lOQUNUSVZFIDIKLSNkZWZpbmUgSUZfQUNUSVZFIDMKLSNkZWZpbmUgSUZfVE9fQkVfQUNUSVZBVEVEIDQKLSNkZWZpbmUgSUZfSV9XQU5UX1lPVSA1Ci0KLWV4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllcjsKLQotc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotaW50IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgY2hhciAqaWZhY2VfbmFtZSk7Ci12b2lkIGhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOwotdm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCk7Ci1pbnQgYmF0bWFuX3NrYl9yZWN2KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLAotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2Rldik7Ci1pbnQgaGFyZGlmX21pbl9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotdm9pZCB1cGRhdGVfbWluX210dShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXJkaWZfaG9sZChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0JYXRvbWljX2luYygmYmF0bWFuX2lmLT5yZWZjbnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFyZGlmX3B1dChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJhdG1hbl9pZi0+cmVmY250KSkgewotCQlkZXZfcHV0KGJhdG1hbl9pZi0+bmV0X2Rldik7Ci0JCWtmcmVlKGJhdG1hbl9pZik7Ci0JfQotfQotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0hBUkRfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjI2ZWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotLyogY2xlYXJzIHRoZSBoYXNoICovCi1zdGF0aWMgdm9pZCBoYXNoX2luaXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKQotewotCWludCBpOwotCi0JaGFzaC0+ZWxlbWVudHMgPSAwOwotCi0JZm9yIChpID0gMCA7IGkgPCBoYXNoLT5zaXplOyBpKyspCi0JCWhhc2gtPnRhYmxlW2ldID0gTlVMTDsKLX0KLQotLyogcmVtb3ZlIHRoZSBoYXNoIHN0cnVjdHVyZS4gaWYgaGFzaGRhdGFfZnJlZV9jYiAhPSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgaGFzaC4gIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlCi0gKiBlbGVtZW50cywgbWVtb3J5IG1pZ2h0IGJlIGxlYWtlZC4gKi8KLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBoYXNoZGF0YV9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQsICpsYXN0X2J1Y2tldDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKLQkJYnVja2V0ID0gaGFzaC0+dGFibGVbaV07Ci0KLQkJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7Ci0JCQlpZiAoZnJlZV9jYiAhPSBOVUxMKQotCQkJCWZyZWVfY2IoYnVja2V0LT5kYXRhLCBhcmcpOwotCi0JCQlsYXN0X2J1Y2tldCA9IGJ1Y2tldDsKLQkJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKLQkJCWtmcmVlKGxhc3RfYnVja2V0KTsKLQkJfQotCX0KLQotCWhhc2hfZGVzdHJveShoYXNoKTsKLX0KLQotLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KLXZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKLXsKLQlrZnJlZShoYXNoLT50YWJsZSk7Ci0Ja2ZyZWUoaGFzaCk7Ci19Ci0KLS8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBGaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIGlmIGFuIGl0ZXJhdG9yCi0gKiBpbml0aWFsaXplZCB3aXRoIEhBU0hJVCgpIGlzIHN1cHBsaWVkIGFzIGl0ZXIuIFVzZSB0aGUgcmV0dXJuZWQKLSAqIChvciBzdXBwbGllZCkgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0ZXJhdGUgcmV0dXJucwotICogTlVMTC4gKi8KLQotc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKLQkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyKQotewotCWlmICghaGFzaCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFpdGVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHNhbml0eSBjaGVja3MgZmlyc3QgKGlmIG91ciBidWNrZXQgZ290IGRlbGV0ZWQgaW4gdGhlIGxhc3QKLQkgKiBpdGVyYXRpb24pOiAqLwotCWlmIChpdGVyLT5idWNrZXQgIT0gTlVMTCkgewotCQlpZiAoaXRlci0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpIHsKLQkJCS8qIHdlJ3JlIG9uIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBpdCBnb3QgcmVtb3ZlZCBhZnRlcgotCQkJICogdGhlIGxhc3QgaXRlcmF0aW9uLiAqLwotCQkJaWYgKCgqaXRlci0+Zmlyc3RfYnVja2V0KSAhPSBpdGVyLT5idWNrZXQpIHsKLQkJCQkvKiB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGxpc3QgKi8KLQkJCQlpZiAoKCppdGVyLT5maXJzdF9idWNrZXQpICE9IE5VTEwpIHsKLQkJCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOwotCQkJCQlpdGVyLT5idWNrZXQgPSAoKml0ZXItPmZpcnN0X2J1Y2tldCk7Ci0JCQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9Ci0JCQkJCQkmaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOwotCQkJCQlyZXR1cm4gaXRlcjsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVyLT5idWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChpdGVyLT5wcmV2X2J1Y2tldCAhPSBOVUxMKSB7Ci0JCQkvKgotCQkJKiB3ZSdyZSBub3Qgb24gdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCB0aGUgYnVja2V0IGdvdAotCQkJKiByZW1vdmVkIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4gIHRoZSBsYXN0IGJ1Y2tldCdzCi0JCQkqIG5leHQgcG9pbnRlciBpcyBub3QgcG9pbnRpbmcgdG8gb3VyIGFjdHVhbCBidWNrZXQKLQkJCSogYW55bW9yZS4gIHNlbGVjdCB0aGUgbmV4dC4KLQkJCSovCi0JCQlpZiAoaXRlci0+cHJldl9idWNrZXQtPm5leHQgIT0gaXRlci0+YnVja2V0KQotCQkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPnByZXZfYnVja2V0OwotCQl9Ci0JfQotCi0JLyogbm93IGFzIHdlIGFyZSBzYW5lLCBzZWxlY3QgdGhlIG5leHQgb25lIGlmIHRoZXJlIGlzIHNvbWUgKi8KLQlpZiAoaXRlci0+YnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGl0ZXItPmJ1Y2tldC0+bmV4dCAhPSBOVUxMKSB7Ci0JCQlpdGVyLT5wcmV2X2J1Y2tldCA9IGl0ZXItPmJ1Y2tldDsKLQkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPmJ1Y2tldC0+bmV4dDsKLQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9IE5VTEw7Ci0JCQlyZXR1cm4gaXRlcjsKLQkJfQotCX0KLQotCS8qIGlmIG5vdCByZXR1cm5lZCB5ZXQsIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3Qgb25lIG9uIHRoZSBpbmRleCBhbmQgaGF2ZQotCSAqIHRvIHNlYXJjaCBmb3J3YXJkICovCi0JaXRlci0+aW5kZXgrKzsKLQkvKiBnbyB0aHJvdWdoIHRoZSBlbnRyaWVzIG9mIHRoZSBoYXNoIHRhYmxlICovCi0Jd2hpbGUgKGl0ZXItPmluZGV4IDwgaGFzaC0+c2l6ZSkgewotCQlpZiAoKGhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XSkgIT0gTlVMTCkgewotCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOwotCQkJaXRlci0+YnVja2V0ID0gaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOwotCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0gJmhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XTsKLQkJCXJldHVybiBpdGVyOwotCQl9IGVsc2UgewotCQkJaXRlci0+aW5kZXgrKzsKLQkJfQotCX0KLQotCS8qIG5vdGhpbmcgdG8gaXRlcmF0ZSBvdmVyIGFueW1vcmUgKi8KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKLQkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSkKLXsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2g7Ci0KLQloYXNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhc2h0YWJsZV90KSAsIEdGUF9BVE9NSUMpOwotCi0JaWYgKGhhc2ggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQloYXNoLT5zaXplID0gc2l6ZTsKLQloYXNoLT50YWJsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50X3QgKikgKiBzaXplLCBHRlBfQVRPTUlDKTsKLQotCWlmIChoYXNoLT50YWJsZSA9PSBOVUxMKSB7Ci0JCWtmcmVlKGhhc2gpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQloYXNoX2luaXQoaGFzaCk7Ci0KLQloYXNoLT5jb21wYXJlID0gY29tcGFyZTsKLQloYXNoLT5jaG9vc2UgPSBjaG9vc2U7Ci0KLQlyZXR1cm4gaGFzaDsKLX0KLQotLyogYWRkcyBkYXRhIHRvIHRoZSBoYXNodGFibGUuIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotaW50IGhhc2hfYWRkKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0LCAqcHJldl9idWNrZXQgPSBOVUxMOwotCi0JaWYgKCFoYXNoKQotCQlyZXR1cm4gLTE7Ci0KLQlpbmRleCA9IGhhc2gtPmNob29zZShkYXRhLCBoYXNoLT5zaXplKTsKLQlidWNrZXQgPSBoYXNoLT50YWJsZVtpbmRleF07Ci0KLQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGhhc2gtPmNvbXBhcmUoYnVja2V0LT5kYXRhLCBkYXRhKSkKLQkJCXJldHVybiAtMTsKLQotCQlwcmV2X2J1Y2tldCA9IGJ1Y2tldDsKLQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCX0KLQotCS8qIGZvdW5kIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCBhZGQgbmV3IGVsZW1lbnQgKi8KLQlidWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudF90KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoYnVja2V0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCWJ1Y2tldC0+ZGF0YSA9IGRhdGE7Ci0JYnVja2V0LT5uZXh0ID0gTlVMTDsKLQotCS8qIGFuZCBsaW5rIGl0ICovCi0JaWYgKHByZXZfYnVja2V0ID09IE5VTEwpCi0JCWhhc2gtPnRhYmxlW2luZGV4XSA9IGJ1Y2tldDsKLQllbHNlCi0JCXByZXZfYnVja2V0LT5uZXh0ID0gYnVja2V0OwotCi0JaGFzaC0+ZWxlbWVudHMrKzsKLQlyZXR1cm4gMDsKLX0KLQotLyogZmluZHMgZGF0YSwgYmFzZWQgb24gdGhlIGtleSBpbiBrZXlkYXRhLiByZXR1cm5zIHRoZSBmb3VuZCBkYXRhIG9uIHN1Y2Nlc3MsCi0gKiBvciBOVUxMIG9uIGVycm9yICovCi12b2lkICpoYXNoX2ZpbmQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICprZXlkYXRhKQotewotCWludCBpbmRleDsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7Ci0KLQlpZiAoIWhhc2gpCi0JCXJldHVybiBOVUxMOwotCi0JaW5kZXggPSBoYXNoLT5jaG9vc2Uoa2V5ZGF0YSAsIGhhc2gtPnNpemUpOwotCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2luZGV4XTsKLQotCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgewotCQlpZiAoaGFzaC0+Y29tcGFyZShidWNrZXQtPmRhdGEsIGtleWRhdGEpKQotCQkJcmV0dXJuIGJ1Y2tldC0+ZGF0YTsKLQotCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKLSAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAotICogaGFzaF9yZW1vdmUoKS4gQnV0IHVzdWFsbHksIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhcyBpdAotICogZmlkZGxlcyB3aXRoIGhhc2gtaW50ZXJuYWxzLiAqLwotdm9pZCAqaGFzaF9yZW1vdmVfYnVja2V0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdF90KQotewotCXZvaWQgKmRhdGFfc2F2ZTsKLQotCWRhdGFfc2F2ZSA9IGhhc2hfaXRfdC0+YnVja2V0LT5kYXRhOwotCi0JaWYgKGhhc2hfaXRfdC0+cHJldl9idWNrZXQgIT0gTlVMTCkKLQkJaGFzaF9pdF90LT5wcmV2X2J1Y2tldC0+bmV4dCA9IGhhc2hfaXRfdC0+YnVja2V0LT5uZXh0OwotCWVsc2UgaWYgKGhhc2hfaXRfdC0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpCi0JCSgqaGFzaF9pdF90LT5maXJzdF9idWNrZXQpID0gaGFzaF9pdF90LT5idWNrZXQtPm5leHQ7Ci0KLQlrZnJlZShoYXNoX2l0X3QtPmJ1Y2tldCk7Ci0JaGFzaC0+ZWxlbWVudHMtLTsKLQotCXJldHVybiBkYXRhX3NhdmU7Ci19Ci0KLS8qIHJlbW92ZXMgZGF0YSBmcm9tIGhhc2gsIGlmIGZvdW5kLiByZXR1cm5zIHBvaW50ZXIgZG8gZGF0YSBvbiBzdWNjZXNzLCBzbyB5b3UKLSAqIGNhbiByZW1vdmUgdGhlIHVzZWQgc3RydWN0dXJlIHlvdXJzZWxmLCBvciBOVUxMIG9uIGVycm9yIC4gIGRhdGEgY291bGQgYmUgdGhlCi0gKiBzdHJ1Y3R1cmUgeW91IHVzZSB3aXRoIGp1c3QgdGhlIGtleSBmaWxsZWQsIHdlIGp1c3QgbmVlZCB0aGUga2V5IGZvcgotICogY29tcGFyaW5nLiAqLwotdm9pZCAqaGFzaF9yZW1vdmUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBoYXNoX2l0X3QgaGFzaF9pdF90OwotCi0JaGFzaF9pdF90LmluZGV4ID0gaGFzaC0+Y2hvb3NlKGRhdGEsIGhhc2gtPnNpemUpOwotCWhhc2hfaXRfdC5idWNrZXQgPSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdOwotCWhhc2hfaXRfdC5wcmV2X2J1Y2tldCA9IE5VTEw7Ci0KLQl3aGlsZSAoaGFzaF9pdF90LmJ1Y2tldCAhPSBOVUxMKSB7Ci0JCWlmIChoYXNoLT5jb21wYXJlKGhhc2hfaXRfdC5idWNrZXQtPmRhdGEsIGRhdGEpKSB7Ci0JCQloYXNoX2l0X3QuZmlyc3RfYnVja2V0ID0KLQkJCQkoaGFzaF9pdF90LmJ1Y2tldCA9PQotCQkJCSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdID8KLQkJCQkgJmhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF0gOiBOVUxMKTsKLQkJCXJldHVybiBoYXNoX3JlbW92ZV9idWNrZXQoaGFzaCwgJmhhc2hfaXRfdCk7Ci0JCX0KLQotCQloYXNoX2l0X3QucHJldl9idWNrZXQgPSBoYXNoX2l0X3QuYnVja2V0OwotCQloYXNoX2l0X3QuYnVja2V0ID0gaGFzaF9pdF90LmJ1Y2tldC0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogcmVzaXplIHRoZSBoYXNoLCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgaGFzaCBvciBOVUxMIG9uCi0gKiBlcnJvci4gcmVtb3ZlcyB0aGUgb2xkIGhhc2ggb24gc3VjY2Vzcy4gKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9yZXNpemUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKm5ld19oYXNoOwotCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKLQlpbnQgaTsKLQotCS8qIGluaXRpYWxpemUgYSBuZXcgaGFzaCB3aXRoIHRoZSBuZXcgc2l6ZSAqLwotCW5ld19oYXNoID0gaGFzaF9uZXcoc2l6ZSwgaGFzaC0+Y29tcGFyZSwgaGFzaC0+Y2hvb3NlKTsKLQotCWlmIChuZXdfaGFzaCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIGNvcHkgdGhlIGVsZW1lbnRzICovCi0JZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewotCQlidWNrZXQgPSBoYXNoLT50YWJsZVtpXTsKLQotCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKLQkJCWhhc2hfYWRkKG5ld19oYXNoLCBidWNrZXQtPmRhdGEpOwotCQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCQl9Ci0JfQotCi0JLyogcmVtb3ZlIGhhc2ggYW5kIGV2ZW50dWFsIG92ZXJmbG93IGJ1Y2tldHMgYnV0IG5vdCB0aGUgY29udGVudAotCSAqIGl0c2VsZi4gKi8KLQloYXNoX2RlbGV0ZShoYXNoLCBOVUxMLCBOVUxMKTsKLQotCXJldHVybiBuZXdfaGFzaDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4ZTE3Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KLQotI2RlZmluZSBIQVNISVQobmFtZSkgc3RydWN0IGhhc2hfaXRfdCBuYW1lID0geyBcCi0JCS5pbmRleCA9IC0xLCAuYnVja2V0ID0gTlVMTCwgXAotCQkucHJldl9idWNrZXQgPSBOVUxMLCBcCi0JCS5maXJzdF9idWNrZXQgPSBOVUxMIH0KLQotCi10eXBlZGVmIGludCAoKmhhc2hkYXRhX2NvbXBhcmVfY2IpKHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50ICgqaGFzaGRhdGFfY2hvb3NlX2NiKSh2b2lkICosIGludCk7Ci10eXBlZGVmIHZvaWQgKCpoYXNoZGF0YV9mcmVlX2NiKSh2b2lkICosIHZvaWQgKik7Ci0KLXN0cnVjdCBlbGVtZW50X3QgewotCXZvaWQgKmRhdGE7CQkvKiBwb2ludGVyIHRvIHRoZSBkYXRhICovCi0Jc3RydWN0IGVsZW1lbnRfdCAqbmV4dDsJLyogb3ZlcmZsb3cgYnVja2V0IHBvaW50ZXIgKi8KLX07Ci0KLXN0cnVjdCBoYXNoX2l0X3QgewotCWludCBpbmRleDsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqcHJldl9idWNrZXQ7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqKmZpcnN0X2J1Y2tldDsKLX07Ci0KLXN0cnVjdCBoYXNodGFibGVfdCB7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqKnRhYmxlOyAgIC8qIHRoZSBoYXNodGFibGUgaXRzZWxmLCB3aXRoIHRoZSBidWNrZXRzICovCi0JaW50IGVsZW1lbnRzOwkJICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyByZWdpc3RlcmVkICovCi0JaW50IHNpemU7CQkgICAgLyogc2l6ZSBvZiBoYXNodGFibGUgKi8KLQloYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmU7LyogY2FsbGJhY2sgdG8gYSBjb21wYXJlIGZ1bmN0aW9uLiAgc2hvdWxkCi0JCQkJICAgICAqIGNvbXBhcmUgMiBlbGVtZW50IGRhdGFzIGZvciB0aGVpciBrZXlzLAotCQkJCSAgICAgKiByZXR1cm4gMCBpZiBzYW1lIGFuZCBub3QgMCBpZiBub3QKLQkJCQkgICAgICogc2FtZSAqLwotCWhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2U7ICAvKiB0aGUgaGFzaGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIGFuIGluZGV4Ci0JCQkJICAgICAqIGJhc2VkIG9uIHRoZSBrZXkgaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0Ci0JCQkJICAgICAqIGFyZ3VtZW50IGFuZCB0aGUgc2l6ZSB0aGUgc2Vjb25kICovCi19OwotCi0vKiBhbGxvY2F0ZXMgYW5kIGNsZWFycyB0aGUgaGFzaCAqLwotc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX25ldyhpbnQgc2l6ZSwgaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlLAotCQkJICAgICBoYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlKTsKLQotLyogcmVtb3ZlIGJ1Y2tldCAodGhpcyBtaWdodCBiZSB1c2VkIGluIGhhc2hfaXRlcmF0ZSgpIGlmIHlvdSBhbHJlYWR5IGZvdW5kIHRoZQotICogYnVja2V0IHlvdSB3YW50IHRvIGRlbGV0ZSBhbmQgZG9uJ3QgbmVlZCB0aGUgb3ZlcmhlYWQgdG8gZmluZCBpdCBhZ2FpbiB3aXRoCi0gKiBoYXNoX3JlbW92ZSgpLiAgQnV0IHVzdWFsbHksIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhcyBpdAotICogZmlkZGxlcyB3aXRoIGhhc2gtaW50ZXJuYWxzLiAqLwotdm9pZCAqaGFzaF9yZW1vdmVfYnVja2V0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdF90KTsKLQotLyogcmVtb3ZlIHRoZSBoYXNoIHN0cnVjdHVyZS4gaWYgaGFzaGRhdGFfZnJlZV9jYiAhPSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgaGFzaC4gIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlCi0gKiBlbGVtZW50cywgbWVtb3J5IG1pZ2h0IGJlIGxlYWtlZC4gKi8KLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBoYXNoZGF0YV9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFyZyk7Ci0KLS8qIGZyZWUgb25seSB0aGUgaGFzaHRhYmxlIGFuZCB0aGUgaGFzaCBpdHNlbGYuICovCi12b2lkIGhhc2hfZGVzdHJveShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpOwotCi0vKiBhZGRzIGRhdGEgdG8gdGhlIGhhc2h0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCi1pbnQgaGFzaF9hZGQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKTsKLQotLyogcmVtb3ZlcyBkYXRhIGZyb20gaGFzaCwgaWYgZm91bmQuIHJldHVybnMgcG9pbnRlciBkbyBkYXRhIG9uIHN1Y2Nlc3MsIHNvIHlvdQotICogY2FuIHJlbW92ZSB0aGUgdXNlZCBzdHJ1Y3R1cmUgeW91cnNlbGYsIG9yIE5VTEwgb24gZXJyb3IgLiAgZGF0YSBjb3VsZCBiZSB0aGUKLSAqIHN0cnVjdHVyZSB5b3UgdXNlIHdpdGgganVzdCB0aGUga2V5IGZpbGxlZCwgd2UganVzdCBuZWVkIHRoZSBrZXkgZm9yCi0gKiBjb21wYXJpbmcuICovCi12b2lkICpoYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpOwotCi0vKiBmaW5kcyBkYXRhLCBiYXNlZCBvbiB0aGUga2V5IGluIGtleWRhdGEuIHJldHVybnMgdGhlIGZvdW5kIGRhdGEgb24gc3VjY2VzcywKLSAqIG9yIE5VTEwgb24gZXJyb3IgKi8KLXZvaWQgKmhhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmtleWRhdGEpOwotCi0vKiByZXNpemUgdGhlIGhhc2gsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXNoIG9yIE5VTEwgb24KLSAqIGVycm9yLiByZW1vdmVzIHRoZSBvbGQgaGFzaCBvbiBzdWNjZXNzICovCi1zdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfcmVzaXplKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaW50IHNpemUpOwotCi0vKiBpdGVyYXRlIHRob3VnaCB0aGUgaGFzaC4gZmlyc3QgZWxlbWVudCBpcyBzZWxlY3RlZCB3aXRoIGl0ZXJfaW4gTlVMTC4gIHVzZQotICogdGhlIHJldHVybmVkIGl0ZXJhdG9yIHRvIGFjY2VzcyB0aGUgZWxlbWVudHMgdW50aWwgaGFzaF9pdF90IHJldHVybnMgTlVMTC4gKi8KLXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRlcmF0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCi0JCQkgICAgICAgc3RydWN0IGhhc2hfaXRfdCAqaXRlcl9pbik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSEFTSF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODU2Y2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0KLQotc3RhdGljIHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50X2hhc2hbMjU2XTsKLQotc3RhdGljIHZvaWQgYmF0X3NvY2tldF9hZGRfcGFja2V0KHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50LAotCQkJCSAgc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKLQkJCQkgIHNpemVfdCBpY21wX2xlbik7Ci0KLXZvaWQgYmF0X3NvY2tldF9pbml0KHZvaWQpCi17Ci0JbWVtc2V0KHNvY2tldF9jbGllbnRfaGFzaCwgMCwgc2l6ZW9mKHNvY2tldF9jbGllbnRfaGFzaCkpOwotfQotCi1zdGF0aWMgaW50IGJhdF9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudDsKLQotCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCi0Jc29ja2V0X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXNvY2tldF9jbGllbnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ja2V0X2NsaWVudF9oYXNoKTsgaSsrKSB7Ci0JCWlmICghc29ja2V0X2NsaWVudF9oYXNoW2ldKSB7Ci0JCQlzb2NrZXRfY2xpZW50X2hhc2hbaV0gPSBzb2NrZXRfY2xpZW50OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKHNvY2tldF9jbGllbnRfaGFzaCkpIHsKLQkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGFkZCBhbm90aGVyIHBhY2tldCBjbGllbnQ6ICIKLQkJICAgICAgICJtYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHJlYWNoZWRcbiIpOwotCQlrZnJlZShzb2NrZXRfY2xpZW50KTsKLQkJcmV0dXJuIC1FWEZVTEw7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QpOwotCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA9IDA7Ci0Jc29ja2V0X2NsaWVudC0+aW5kZXggPSBpOwotCXNvY2tldF9jbGllbnQtPmJhdF9wcml2ID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlzcGluX2xvY2tfaW5pdCgmc29ja2V0X2NsaWVudC0+bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc29ja2V0X2NsaWVudC0+cXVldWVfd2FpdCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBzb2NrZXRfY2xpZW50OwotCi0JaW5jX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJhdF9zb2NrZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29ja2V0X3BhY2tldCAqc29ja2V0X3BhY2tldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGZvciBhbGwgcGFja2V0cyBpbiB0aGUgcXVldWUgLi4uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3Bvc190bXAsICZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0KSB7Ci0JCXNvY2tldF9wYWNrZXQgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLAotCQkJCQkgICBzdHJ1Y3Qgc29ja2V0X3BhY2tldCwgbGlzdCk7Ci0KLQkJbGlzdF9kZWwobGlzdF9wb3MpOwotCQlrZnJlZShzb2NrZXRfcGFja2V0KTsKLQl9Ci0KLQlzb2NrZXRfY2xpZW50X2hhc2hbc29ja2V0X2NsaWVudC0+aW5kZXhdID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0KLQlrZnJlZShzb2NrZXRfY2xpZW50KTsKLQlkZWNfbW9kdWxlX2NvdW50KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYmF0X3NvY2tldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NrZXRfcGFja2V0ICpzb2NrZXRfcGFja2V0OwotCXNpemVfdCBwYWNrZXRfbGVuOwotCWludCBlcnJvcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgKHNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA9PSAwKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlpZiAoKCFidWYpIHx8IChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNvY2tldF9jbGllbnQtPnF1ZXVlX3dhaXQsCi0JCQkJCSBzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4pOwotCi0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0Jc29ja2V0X3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QsCi0JCQkJCSBzdHJ1Y3Qgc29ja2V0X3BhY2tldCwgbGlzdCk7Ci0JbGlzdF9kZWwoJnNvY2tldF9wYWNrZXQtPmxpc3QpOwotCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbi0tOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihidWYsICZzb2NrZXRfcGFja2V0LT5pY21wX3BhY2tldCwKLQkJCSAgICAgICBzb2NrZXRfcGFja2V0LT5pY21wX2xlbik7Ci0KLQlwYWNrZXRfbGVuID0gc29ja2V0X3BhY2tldC0+aWNtcF9sZW47Ci0Ja2ZyZWUoc29ja2V0X3BhY2tldCk7Ci0KLQlpZiAoZXJyb3IpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHBhY2tldF9sZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJhdF9zb2NrZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAotCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBzb2NrZXRfY2xpZW50LT5iYXRfcHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQ7Ci0KLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXNpemVfdCBwYWNrZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCk7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiAiCi0JCQkiaW52YWxpZCBwYWNrZXQgc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKLQkJcGFja2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihwYWNrZXRfbGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiX3B1dChza2IsIHBhY2tldF9sZW4pOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmYsIHBhY2tldF9sZW4pKSB7Ci0JCWxlbiA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKF9fY29weV9mcm9tX3VzZXIoaWNtcF9wYWNrZXQsIGJ1ZmYsIHBhY2tldF9sZW4pKSB7Ci0JCWxlbiA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGljbXBfcGFja2V0LT5wYWNrZXRfdHlwZSAhPSBCQVRfSUNNUCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgotCQkJImdvdCBib2d1cyBwYWNrZXQgdHlwZSAoZXhwZWN0ZWQ6IEJBVF9JQ01QKVxuIik7Ci0JCWxlbiA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6ICIKLQkJCSJnb3QgYm9ndXMgbWVzc2FnZSB0eXBlIChleHBlY3RlZDogRUNIT19SRVFVRVNUKVxuIik7Ci0JCWxlbiA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWNtcF9wYWNrZXQtPnVpZCA9IHNvY2tldF9jbGllbnQtPmluZGV4OwotCi0JaWYgKGljbXBfcGFja2V0LT52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7Ci0JCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IFBBUkFNRVRFUl9QUk9CTEVNOwotCQlpY21wX3BhY2tldC0+dHRsID0gQ09NUEFUX1ZFUlNJT047Ci0JCWJhdF9zb2NrZXRfYWRkX3BhY2tldChzb2NrZXRfY2xpZW50LCBpY21wX3BhY2tldCwgcGFja2V0X2xlbik7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSkgIT0gTUVTSF9BQ1RJVkUpCi0JCWdvdG8gZHN0X3VucmVhY2g7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsCi0JCQkJCQkgICBpY21wX3BhY2tldC0+ZHN0KSk7Ci0KLQlpZiAoIW9yaWdfbm9kZSkKLQkJZ290byB1bmxvY2s7Ci0KLQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQlnb3RvIHVubG9jazsKLQotCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFiYXRtYW5faWYpCi0JCWdvdG8gZHN0X3VucmVhY2g7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlnb3RvIGRzdF91bnJlYWNoOwotCi0JbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLAotCSAgICAgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCWlmIChwYWNrZXRfbGVuID09IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpKQotCQltZW1jcHkoaWNtcF9wYWNrZXQtPnJyLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQotCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0KLQlnb3RvIG91dDsKLQotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotZHN0X3VucmVhY2g6Ci0JaWNtcF9wYWNrZXQtPm1zZ190eXBlID0gREVTVElOQVRJT05fVU5SRUFDSEFCTEU7Ci0JYmF0X3NvY2tldF9hZGRfcGFja2V0KHNvY2tldF9jbGllbnQsIGljbXBfcGFja2V0LCBwYWNrZXRfbGVuKTsKLWZyZWVfc2tiOgotCWtmcmVlX3NrYihza2IpOwotb3V0OgotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmF0X3NvY2tldF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcG9sbF93YWl0KGZpbGUsICZzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0LCB3YWl0KTsKLQotCWlmIChzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4gPiAwKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYmF0X3NvY2tldF9vcGVuLAotCS5yZWxlYXNlID0gYmF0X3NvY2tldF9yZWxlYXNlLAotCS5yZWFkID0gYmF0X3NvY2tldF9yZWFkLAotCS53cml0ZSA9IGJhdF9zb2NrZXRfd3JpdGUsCi0JLnBvbGwgPSBiYXRfc29ja2V0X3BvbGwsCi0JLmxsc2VlayA9IG5vX2xsc2VlaywKLX07Ci0KLWludCBiYXRfc29ja2V0X3NldHVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZDsKLQotCWlmICghYmF0X3ByaXYtPmRlYnVnX2RpcikKLQkJZ290byBlcnI7Ci0KLQlkID0gZGVidWdmc19jcmVhdGVfZmlsZShJQ01QX1NPQ0tFVCwgU19JRlJFRyB8IFNfSVdVU1IgfCBTX0lSVVNSLAotCQkJCWJhdF9wcml2LT5kZWJ1Z19kaXIsIGJhdF9wcml2LCAmZm9wcyk7Ci0JaWYgKGQpCi0JCWdvdG8gZXJyOwotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgYmF0X3NvY2tldF9hZGRfcGFja2V0KHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50LAotCQkJCSAgc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKLQkJCQkgIHNpemVfdCBpY21wX2xlbikKLXsKLQlzdHJ1Y3Qgc29ja2V0X3BhY2tldCAqc29ja2V0X3BhY2tldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc29ja2V0X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIXNvY2tldF9wYWNrZXQpCi0JCXJldHVybjsKLQotCUlOSVRfTElTVF9IRUFEKCZzb2NrZXRfcGFja2V0LT5saXN0KTsKLQltZW1jcHkoJnNvY2tldF9wYWNrZXQtPmljbXBfcGFja2V0LCBpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotCXNvY2tldF9wYWNrZXQtPmljbXBfbGVuID0gaWNtcF9sZW47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JLyogd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sgdGhlIHNvY2tldF9jbGllbnQgY291bGQgaGF2ZSBiZWVuCi0JICogZGVsZXRlZCAqLwotCWlmICghc29ja2V0X2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQkJa2ZyZWUoc29ja2V0X3BhY2tldCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZzb2NrZXRfcGFja2V0LT5saXN0LCAmc29ja2V0X2NsaWVudC0+cXVldWVfbGlzdCk7Ci0Jc29ja2V0X2NsaWVudC0+cXVldWVfbGVuKys7Ci0KLQlpZiAoc29ja2V0X2NsaWVudC0+cXVldWVfbGVuID4gMTAwKSB7Ci0JCXNvY2tldF9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0LAotCQkJCQkJIHN0cnVjdCBzb2NrZXRfcGFja2V0LCBsaXN0KTsKLQotCQlsaXN0X2RlbCgmc29ja2V0X3BhY2tldC0+bGlzdCk7Ci0JCWtmcmVlKHNvY2tldF9wYWNrZXQpOwotCQlzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4tLTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0KTsKLX0KLQotdm9pZCBiYXRfc29ja2V0X3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZV90IGljbXBfbGVuKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpoYXNoID0gc29ja2V0X2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdOwotCi0JaWYgKGhhc2gpCi0JCWJhdF9zb2NrZXRfYWRkX3BhY2tldChoYXNoLCBpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOWIzNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9JQ01QX1NPQ0tFVF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNkZWZpbmUgSUNNUF9TT0NLRVQgInNvY2tldCIKLQotdm9pZCBiYXRfc29ja2V0X2luaXQodm9pZCk7Ci1pbnQgYmF0X3NvY2tldF9zZXR1cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgYmF0X3NvY2tldF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0LAotCQkJICAgICAgIHNpemVfdCBpY21wX2xlbik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4Nzk0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiYmF0X3N5c2ZzLmgiCi0jaW5jbHVkZSAiYmF0X2RlYnVnZnMuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi1zdHJ1Y3QgbGlzdF9oZWFkIGlmX2xpc3Q7Ci0KLXVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQotc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJhdF9ldmVudF93b3JrcXVldWU7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJhdG1hbl9pbml0KHZvaWQpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJmlmX2xpc3QpOwotCi0JLyogdGhlIG5hbWUgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiAxMCBjaGFycyAtIHNlZQotCSAqIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNjM0LyAqLwotCWJhdF9ldmVudF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmF0X2V2ZW50cyIpOwotCi0JaWYgKCFiYXRfZXZlbnRfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJhdF9zb2NrZXRfaW5pdCgpOwotCWRlYnVnZnNfaW5pdCgpOwotCi0JcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoYXJkX2lmX25vdGlmaWVyKTsKLQotCXByX2luZm8oIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCAlcyVzIChjb21wYXRpYmlsaXR5IHZlcnNpb24gJWkpICIKLQkJImxvYWRlZFxuIiwgU09VUkNFX1ZFUlNJT04sIFJFVklTSU9OX1ZFUlNJT05fU1RSLAotCQlDT01QQVRfVkVSU0lPTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGJhdG1hbl9leGl0KHZvaWQpCi17Ci0JZGVidWdmc19kZXN0cm95KCk7Ci0JdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhhcmRfaWZfbm90aWZpZXIpOwotCWhhcmRpZl9yZW1vdmVfaW50ZXJmYWNlcygpOwotCi0JZmx1c2hfd29ya3F1ZXVlKGJhdF9ldmVudF93b3JrcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGJhdF9ldmVudF93b3JrcXVldWUpOwotCWJhdF9ldmVudF93b3JrcXVldWUgPSBOVUxMOwotCi0JcmN1X2JhcnJpZXIoKTsKLX0KLQotaW50IG1lc2hfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2spOwotCi0JSU5JVF9ITElTVF9IRUFEKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCk7Ci0JSU5JVF9ITElTVF9IRUFEKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0KTsKLQotCWlmIChvcmlnaW5hdG9yX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlpZiAoaG5hX2xvY2FsX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlpZiAoaG5hX2dsb2JhbF9pbml0KGJhdF9wcml2KSA8IDEpCi0JCWdvdG8gZXJyOwotCi0JaG5hX2xvY2FsX2FkZChzb2Z0X2lmYWNlLCBzb2Z0X2lmYWNlLT5kZXZfYWRkcik7Ci0KLQlpZiAodmlzX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9BQ1RJVkUpOwotCWdvdG8gZW5kOwotCi1lcnI6Ci0JcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtZXNoIGluZm9ybWF0aW9uIHN0cnVjdHVyZXM6ICIKLQkgICAgICAgIm91dCBvZiBtZW0gP1xuIik7Ci0JbWVzaF9mcmVlKHNvZnRfaWZhY2UpOwotCXJldHVybiAtMTsKLQotZW5kOgotCXJldHVybiAwOwotfQotCi12b2lkIG1lc2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9ERUFDVElWQVRJTkcpOwotCi0JcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhiYXRfcHJpdiwgTlVMTCk7Ci0KLQl2aXNfcXVpdChiYXRfcHJpdik7Ci0KLQlvcmlnaW5hdG9yX2ZyZWUoYmF0X3ByaXYpOwotCi0JaG5hX2xvY2FsX2ZyZWUoYmF0X3ByaXYpOwotCWhuYV9nbG9iYWxfZnJlZShiYXRfcHJpdik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9JTkFDVElWRSk7Ci19Ci0KLXZvaWQgaW5jX21vZHVsZV9jb3VudCh2b2lkKQotewotCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLX0KLQotdm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpCi17Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci19Ci0KLS8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBvcmlnaW5hdG9yICovCi0KLWludCBjb21wYXJlX29yaWcodm9pZCAqZGF0YTEsIHZvaWQgKmRhdGEyKQotewotCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7Ci19Ci0KLS8qIGhhc2hmdW5jdGlvbiB0byBjaG9vc2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlIG9mIGdpdmVuIHNpemUgKi8KLS8qIGhhc2ggYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX3RhYmxlICovCi1pbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKQotewotCXVuc2lnbmVkIGNoYXIgKmtleSA9IGRhdGE7Ci0JdWludDMyX3QgaGFzaCA9IDA7Ci0Jc2l6ZV90IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWhhc2ggKz0ga2V5W2ldOwotCQloYXNoICs9IChoYXNoIDw8IDEwKTsKLQkJaGFzaCBePSAoaGFzaCA+PiA2KTsKLQl9Ci0KLQloYXNoICs9IChoYXNoIDw8IDMpOwotCWhhc2ggXj0gKGhhc2ggPj4gMTEpOwotCWhhc2ggKz0gKGhhc2ggPDwgMTUpOwotCi0JcmV0dXJuIGhhc2ggJSBzaXplOwotfQotCi1pbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgYWRkcikpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpCi17Ci0JcmV0dXJuIChhZGRyWzBdID09ICh1aW50OF90KTB4ZmYpICYmIChhZGRyWzFdID09ICh1aW50OF90KTB4ZmYpOwotfQotCi1pbnQgaXNfbWNhc3QodWludDhfdCAqYWRkcikKLXsKLQlyZXR1cm4gKmFkZHIgJiAweDAxOwotfQotCi1tb2R1bGVfaW5pdChiYXRtYW5faW5pdCk7Ci1tb2R1bGVfZXhpdChiYXRtYW5fZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRShEUklWRVJfREVWSUNFKTsKLSNpZmRlZiBSRVZJU0lPTl9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTT1VSQ0VfVkVSU0lPTiAiLSIgUkVWSVNJT05fVkVSU0lPTik7Ci0jZWxzZQotTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2Y1MTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfCi0KLS8qIEtlcm5lbCBQcm9ncmFtbWluZyAqLwotI2RlZmluZSBMSU5VWAotCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+LCAiIFwKLQkJICAgICAgIlNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPiIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIgotI2RlZmluZSBEUklWRVJfREVWSUNFICJiYXRtYW4tYWR2IgotCi0jZGVmaW5lIFNPVVJDRV9WRVJTSU9OICJuZXh0IgotCi0KLS8qIEIuQS5ULk0uQS5OLiBwYXJhbWV0ZXJzICovCi0KLSNkZWZpbmUgVFFfTUFYX1ZBTFVFIDI1NQotI2RlZmluZSBKSVRURVIgMjAKLSNkZWZpbmUgVFRMIDUwCQkJICAvKiBUaW1lIFRvIExpdmUgb2YgYnJvYWRjYXN0IG1lc3NhZ2VzICovCi0KLSNkZWZpbmUgUFVSR0VfVElNRU9VVCAyMDAJLyogcHVyZ2Ugb3JpZ2luYXRvcnMgYWZ0ZXIgdGltZSBpbiBzZWNvbmRzIGlmIG5vCi0JCQkJICAgKiB2YWxpZCBwYWNrZXQgY29tZXMgaW4gLT4gVE9ETzogY2hlY2sKLQkJCQkgICAqIGluZmx1ZW5jZSBvbiBUUV9MT0NBTF9XSU5ET1dfU0laRSAqLwotI2RlZmluZSBMT0NBTF9ITkFfVElNRU9VVCAzNjAwIC8qIGluIHNlY29uZHMgKi8KLQotI2RlZmluZSBUUV9MT0NBTF9XSU5ET1dfU0laRSA2NAkgIC8qIHNsaWRpbmcgcGFja2V0IHJhbmdlIG9mIHJlY2VpdmVkIG9yaWdpbmF0b3IKLQkJCQkgICAqIG1lc3NhZ2VzIGluIHNxdWVuY2UgbnVtYmVycyAoc2hvdWxkIGJlIGEKLQkJCQkgICAqIG11bHRpcGxlIG9mIG91ciB3b3JkIHNpemUpICovCi0jZGVmaW5lIFRRX0dMT0JBTF9XSU5ET1dfU0laRSA1Ci0jZGVmaW5lIFRRX0xPQ0FMX0JJRFJFQ1RfU0VORF9NSU5JTVVNIDEKLSNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9SRUNWX01JTklNVU0gMQotI2RlZmluZSBUUV9UT1RBTF9CSURSRUNUX0xJTUlUIDEKLQotI2RlZmluZSBUUV9IT1BfUEVOQUxUWSAxMAotCi0jZGVmaW5lIE5VTV9XT1JEUyAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLyBXT1JEX0JJVF9TSVpFKQotCi0jZGVmaW5lIFBBQ0tCVUZGX1NJWkUgMjAwMAotI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyCSAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLwotCi0jZGVmaW5lIFZJU19JTlRFUlZBTCA1MDAwCS8qIDUgc2Vjb25kcyAqLwotCi0vKiBob3cgbXVjaCB3b3JzZSBzZWNvbmRhcnkgaW50ZXJmYWNlcyBtYXkgYmUgdG8KLSAqIHRvIGJlIGNvbnNpZGVyZWQgYXMgYm9uZGluZyBjYW5kaWRhdGVzICovCi0KLSNkZWZpbmUgQk9ORElOR19UUV9USFJFU0hPTEQJNTAKLQotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fQllURVMgNTEyIC8qIHNob3VsZCBub3QgYmUgYmlnZ2VyIHRoYW4gNTEyIGJ5dGVzIG9yCi0JCQkJICAgKiBjaGFuZ2UgdGhlIHNpemUgb2YKLQkJCQkgICAqIGZvcndfcGFja2V0LT5kaXJlY3RfbGlua19mbGFncyAqLwotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fTVMgMTAwCi0KLSNkZWZpbmUgUkVTRVRfUFJPVEVDVElPTl9NUyAzMDAwMAotI2RlZmluZSBFWFBFQ1RFRF9TRVFOT19SQU5HRQk2NTUzNgotLyogZG9uJ3QgcmVzZXQgYWdhaW4gd2l0aGluIDMwIHNlY29uZHMgKi8KLQotI2RlZmluZSBNRVNIX0lOQUNUSVZFIDAKLSNkZWZpbmUgTUVTSF9BQ1RJVkUgMQotI2RlZmluZSBNRVNIX0RFQUNUSVZBVElORyAyCi0KLSNkZWZpbmUgQkNBU1RfUVVFVUVfTEVOCQkyNTYKLSNkZWZpbmUgQkFUTUFOX1FVRVVFX0xFTgkyNTYKLQotLyoKLSAqIERlYnVnIE1lc3NhZ2VzCi0gKi8KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQgLyogQXBwZW5kICdiYXRtYW4tYWR2OiAnIGJlZm9yZQotCQkJCQkgICAgICoga2VybmVsIG1lc3NhZ2VzICovCi0KLSNkZWZpbmUgREJHX0JBVE1BTiAxCS8qIGFsbCBtZXNzYWdlcyByZWxhdGVkIHRvIHJvdXRpbmcgLyBmbG9vZGluZyAvCi0JCQkgKiBicm9hZGNhc3RpbmcgLyBldGMgKi8KLSNkZWZpbmUgREJHX1JPVVRFUyAyCS8qIHJvdXRlIG9yIGhuYSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkICovCi0jZGVmaW5lIERCR19BTEwgMwotCi0jZGVmaW5lIExPR19CVUZfTEVOIDgxOTIgICAgICAgICAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLwotCi0KLS8qCi0gKiAgVmlzCi0gKi8KLQotLyogI2RlZmluZSBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KLQotLyoKLSAqIEtlcm5lbCBoZWFkZXJzCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CS8qIG11dGV4ICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIG5lZWRlZCBieSBhbGwgbW9kdWxlcyAqLwotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgkvKiBuZXRkZXZpY2UgKi8KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgkvKiBldGhlcm5ldCBoZWFkZXIgKi8KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CQkvKiBwb2xsX3RhYmxlICovCi0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgkvKiBrZXJuZWwgdGhyZWFkcyAqLwotI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgkvKiBzY2hlZHVsZSB0eXBlcyAqLwotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgkvKiB3b3JrcXVldWUgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4JCS8qIHN0cnVjdCBzb2NrICovCi0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2lmbmRlZiBSRVZJU0lPTl9WRVJTSU9OCi0jZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIiCi0jZWxzZQotI2RlZmluZSBSRVZJU0lPTl9WRVJTSU9OX1NUUiAiICJSRVZJU0lPTl9WRVJTSU9OCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaWZfbGlzdDsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0X2FkZHJbXTsKLWV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmF0X2V2ZW50X3dvcmtxdWV1ZTsKLQotaW50IG1lc2hfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIG1lc2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIGluY19tb2R1bGVfY291bnQodm9pZCk7Ci12b2lkIGRlY19tb2R1bGVfY291bnQodm9pZCk7Ci1pbnQgY29tcGFyZV9vcmlnKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMik7Ci1pbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKTsKLWludCBpc19teV9tYWModWludDhfdCAqYWRkcik7Ci1pbnQgaXNfYmNhc3QodWludDhfdCAqYWRkcik7Ci1pbnQgaXNfbWNhc3QodWludDhfdCAqYWRkcik7Ci0KLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgYmF0X2RiZyh0eXBlLCBiYXRfcHJpdiwgZm10LCBhcmcuLi4pCQkJXAotCWRvIHsJCQkJCQkJXAotCQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpICYgdHlwZSkJXAotCQkJZGVidWdfbG9nKGJhdF9wcml2LCBmbXQsICMjIGFyZyk7CVwKLQl9CQkJCQkJCVwKLQl3aGlsZSAoMCkKLSNlbHNlIC8qICFDT05GSUdfQkFUTUFOX0FEVl9ERUJVRyAqLwotc3RhdGljIGlubGluZSB2b2lkIGJhdF9kYmcoY2hhciB0eXBlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCQkJICAgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKLQkJCSAgIGNoYXIgKmZtdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgLi4uKQotewotfQotI2VuZGlmCi0KLSNkZWZpbmUgYmF0X3dhcm5pbmcobmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpfbmV0ZGV2ID0gKG5ldF9kZXYpOyAgICAgICAgICAgICAgICAgXAotCQlzdHJ1Y3QgYmF0X3ByaXYgKl9iYXRwcml2ID0gbmV0ZGV2X3ByaXYoX25ldGRldik7ICAgICAgIFwKLQkJYmF0X2RiZyhEQkdfQUxMLCBfYmF0cHJpdiwgZm10LCAjIyBhcmcpOwkJXAotCQlwcl93YXJuaW5nKCIlczogIiBmbXQsIF9uZXRkZXYtPm5hbWUsICMjIGFyZyk7CQlcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgYmF0X2luZm8obmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqX25ldGRldiA9IChuZXRfZGV2KTsgICAgICAgICAgICAgICAgIFwKLQkJc3RydWN0IGJhdF9wcml2ICpfYmF0cHJpdiA9IG5ldGRldl9wcml2KF9uZXRkZXYpOyAgICAgICBcCi0JCWJhdF9kYmcoREJHX0FMTCwgX2JhdHByaXYsIGZtdCwgIyMgYXJnKTsJCVwKLQkJcHJfaW5mbygiJXM6ICIgZm10LCBfbmV0ZGV2LT5uYW1lLCAjIyBhcmcpOwkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIGJhdF9lcnIobmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqX25ldGRldiA9IChuZXRfZGV2KTsgICAgICAgICAgICAgICAgIFwKLQkJc3RydWN0IGJhdF9wcml2ICpfYmF0cHJpdiA9IG5ldGRldl9wcml2KF9uZXRkZXYpOyAgICAgICBcCi0JCWJhdF9kYmcoREJHX0FMTCwgX2JhdHByaXYsIGZtdCwgIyMgYXJnKTsJCVwKLQkJcHJfZXJyKCIlczogIiBmbXQsIF9uZXRkZXYtPm5hbWUsICMjIGFyZyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjcwMDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0vKiBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgZm9yIHRoaXMgb3JpZ2luYXRvciAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLXN0YXRpYyB2b2lkIHB1cmdlX29yaWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotc3RhdGljIHZvaWQgc3RhcnRfcHVyZ2VfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPm9yaWdfd29yaywgcHVyZ2Vfb3JpZyk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZiYXRfcHJpdi0+b3JpZ193b3JrLCAxICogSFopOwotfQotCi1pbnQgb3JpZ2luYXRvcl9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZiAoYmF0X3ByaXYtPm9yaWdfaGFzaCkKLQkJcmV0dXJuIDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JYmF0X3ByaXYtPm9yaWdfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7Ci0KLQlpZiAoIWJhdF9wcml2LT5vcmlnX2hhc2gpCi0JCWdvdG8gZXJyOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jc3RhcnRfcHVyZ2VfdGltZXIoYmF0X3ByaXYpOwotCXJldHVybiAxOwotCi1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBuZWlnaF9ub2RlICoKLWNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKLQkJdWludDhfdCAqbmVpZ2gsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7Ci0KLQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm9yIG9mIG9yaWdpbmF0b3JcbiIpOwotCi0JbmVpZ2hfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZWlnaF9ub2RlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuZWlnaF9ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCUlOSVRfTElTVF9IRUFEKCZuZWlnaF9ub2RlLT5saXN0KTsKLQotCW1lbWNweShuZWlnaF9ub2RlLT5hZGRyLCBuZWlnaCwgRVRIX0FMRU4pOwotCW5laWdoX25vZGUtPm9yaWdfbm9kZSA9IG9yaWdfbmVpZ2hfbm9kZTsKLQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOwotCi0JbGlzdF9hZGRfdGFpbCgmbmVpZ2hfbm9kZS0+bGlzdCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCk7Ci0JcmV0dXJuIG5laWdoX25vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSAoc3RydWN0IG9yaWdfbm9kZSAqKWRhdGE7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IChzdHJ1Y3QgYmF0X3ByaXYgKilhcmc7Ci0KLQkvKiBmb3IgYWxsIG5laWdoYm9ycyB0b3dhcmRzIHRoaXMgb3JpZ2luYXRvciAuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgewotCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOwotCi0JCWxpc3RfZGVsKGxpc3RfcG9zKTsKLQkJa2ZyZWUobmVpZ2hfbm9kZSk7Ci0JfQotCi0JZnJhZ19saXN0X2ZyZWUoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQlobmFfZ2xvYmFsX2RlbF9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsICJvcmlnaW5hdG9yIHRpbWVkIG91dCIpOwotCi0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7Ci0Ja2ZyZWUob3JpZ19ub2RlKTsKLX0KLQotdm9pZCBvcmlnaW5hdG9yX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFiYXRfcHJpdi0+b3JpZ19oYXNoKQotCQlyZXR1cm47Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJhdF9wcml2LT5vcmlnX3dvcmspOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCWhhc2hfZGVsZXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlLCBiYXRfcHJpdik7Ci0JYmF0X3ByaXYtPm9yaWdfaGFzaCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gZmluZHMgb3IgY3JlYXRlcyBhbiBvcmlnaW5hdG9yIGVudHJ5IGZvciB0aGUgZ2l2ZW4KLSAqIGFkZHJlc3MgaWYgaXQgZG9lcyBub3QgZXhpdHMgKi8KLXN0cnVjdCBvcmlnX25vZGUgKmdldF9vcmlnX25vZGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcikKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKLQlpbnQgc2l6ZTsKLQotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBhZGRyKSk7Ci0KLQlpZiAob3JpZ19ub2RlKQotCQlyZXR1cm4gb3JpZ19ub2RlOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcE1cbiIsIGFkZHIpOwotCi0Jb3JpZ19ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9yaWdfbm9kZSksIEdGUF9BVE9NSUMpOwotCWlmICghb3JpZ19ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCUlOSVRfTElTVF9IRUFEKCZvcmlnX25vZGUtPm5laWdoX2xpc3QpOwotCi0JbWVtY3B5KG9yaWdfbm9kZS0+b3JpZywgYWRkciwgRVRIX0FMRU4pOwotCW9yaWdfbm9kZS0+cm91dGVyID0gTlVMTDsKLQlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKLQlvcmlnX25vZGUtPmJjYXN0X3NlcW5vX3Jlc2V0ID0gamlmZmllcyAtIDEKLQkJCQkJLSBtc2Vjc190b19qaWZmaWVzKFJFU0VUX1BST1RFQ1RJT05fTVMpOwotCW9yaWdfbm9kZS0+YmF0bWFuX3NlcW5vX3Jlc2V0ID0gamlmZmllcyAtIDEKLQkJCQkJLSBtc2Vjc190b19qaWZmaWVzKFJFU0VUX1BST1RFQ1RJT05fTVMpOwotCi0Jc2l6ZSA9IGJhdF9wcml2LT5udW1faWZhY2VzICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFM7Ci0KLQlvcmlnX25vZGUtPmJjYXN0X293biA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFvcmlnX25vZGUtPmJjYXN0X293bikKLQkJZ290byBmcmVlX29yaWdfbm9kZTsKLQotCXNpemUgPSBiYXRfcHJpdi0+bnVtX2lmYWNlcyAqIHNpemVvZih1aW50OF90KTsKLQlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCi0JSU5JVF9MSVNUX0hFQUQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQlvcmlnX25vZGUtPmxhc3RfZnJhZ19wYWNrZXQgPSAwOwotCi0JaWYgKCFvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pCi0JCWdvdG8gZnJlZV9iY2FzdF9vd247Ci0KLQlpZiAoaGFzaF9hZGQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgb3JpZ19ub2RlKSA8IDApCi0JCWdvdG8gZnJlZV9iY2FzdF9vd25fc3VtOwotCi0JaWYgKGJhdF9wcml2LT5vcmlnX2hhc2gtPmVsZW1lbnRzICogNCA+IGJhdF9wcml2LT5vcmlnX2hhc2gtPnNpemUpIHsKLQkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCSAgICAgICBiYXRfcHJpdi0+b3JpZ19oYXNoLT5zaXplICogMik7Ci0KLQkJaWYgKCFzd2FwaGFzaCkKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJIkNvdWxkbid0IHJlc2l6ZSBvcmlnIGhhc2ggdGFibGVcbiIpOwotCQllbHNlCi0JCQliYXRfcHJpdi0+b3JpZ19oYXNoID0gc3dhcGhhc2g7Ci0JfQotCi0JcmV0dXJuIG9yaWdfbm9kZTsKLWZyZWVfYmNhc3Rfb3duX3N1bToKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotZnJlZV9iY2FzdF9vd246Ci0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwotZnJlZV9vcmlnX25vZGU6Ci0Ja2ZyZWUob3JpZ19ub2RlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgcHVyZ2Vfb3JpZ19uZWlnaGJvcnMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJCSBzdHJ1Y3QgbmVpZ2hfbm9kZSAqKmJlc3RfbmVpZ2hfbm9kZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlib29sIG5laWdoX3B1cmdlZCA9IGZhbHNlOwotCi0JKmJlc3RfbmVpZ2hfbm9kZSA9IE5VTEw7Ci0KLQkvKiBmb3IgYWxsIG5laWdoYm9ycyB0b3dhcmRzIHRoaXMgb3JpZ2luYXRvciAuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgewotCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOwotCi0JCWlmICgodGltZV9hZnRlcihqaWZmaWVzLAotCQkJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCArIFBVUkdFX1RJTUVPVVQgKiBIWikpIHx8Ci0JCSAgICAobmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyA9PSBJRl9JTkFDVElWRSkgfHwKLQkJICAgIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzID09IElGX1RPX0JFX1JFTU9WRUQpKSB7Ci0KLQkJCWlmIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzID09Ci0JCQkJCQkJSUZfVE9fQkVfUkVNT1ZFRCkKLQkJCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCQkibmVpZ2hib3IgcHVyZ2U6IG9yaWdpbmF0b3IgJXBNLCAiCi0JCQkJCSJuZWlnaGJvcjogJXBNLCBpZmFjZTogJXNcbiIsCi0JCQkJCW9yaWdfbm9kZS0+b3JpZywgbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpOwotCQkJZWxzZQotCQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJCSJuZWlnaGJvciB0aW1lb3V0OiBvcmlnaW5hdG9yICVwTSwgIgotCQkJCQkibmVpZ2hib3I6ICVwTSwgbGFzdF92YWxpZDogJWx1XG4iLAotCQkJCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCi0JCQkJCShuZWlnaF9ub2RlLT5sYXN0X3ZhbGlkIC8gSFopKTsKLQotCQkJbmVpZ2hfcHVyZ2VkID0gdHJ1ZTsKLQkJCWxpc3RfZGVsKGxpc3RfcG9zKTsKLQkJCWtmcmVlKG5laWdoX25vZGUpOwotCQl9IGVsc2UgewotCQkJaWYgKCgqYmVzdF9uZWlnaF9ub2RlID09IE5VTEwpIHx8Ci0JCQkgICAgKG5laWdoX25vZGUtPnRxX2F2ZyA+ICgqYmVzdF9uZWlnaF9ub2RlKS0+dHFfYXZnKSkKLQkJCQkqYmVzdF9uZWlnaF9ub2RlID0gbmVpZ2hfbm9kZTsKLQkJfQotCX0KLQlyZXR1cm4gbmVpZ2hfcHVyZ2VkOwotfQotCi1zdGF0aWMgYm9vbCBwdXJnZV9vcmlnX25vZGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpCi17Ci0Jc3RydWN0IG5laWdoX25vZGUgKmJlc3RfbmVpZ2hfbm9kZTsKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCW9yaWdfbm9kZS0+bGFzdF92YWxpZCArIDIgKiBQVVJHRV9USU1FT1VUICogSFopKSB7Ci0KLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJPcmlnaW5hdG9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXBNLCBsYXN0X3ZhbGlkICVsdVxuIiwKLQkJCW9yaWdfbm9kZS0+b3JpZywgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCWlmIChwdXJnZV9vcmlnX25laWdoYm9ycyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkJCSZiZXN0X25laWdoX25vZGUpKSB7Ci0JCQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJICAgICAgYmVzdF9uZWlnaF9ub2RlLAotCQkJCSAgICAgIG9yaWdfbm9kZS0+aG5hX2J1ZmYsCi0JCQkJICAgICAgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOwotCQkJLyogdXBkYXRlIGJvbmRpbmcgY2FuZGlkYXRlcywgd2UgY291bGQgaGF2ZSBsb3N0Ci0JCQkgKiBzb21lIGNhbmRpZGF0ZXMuICovCi0JCQl1cGRhdGVfYm9uZGluZ19jYW5kaWRhdGVzKGJhdF9wcml2LCBvcmlnX25vZGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBfcHVyZ2Vfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogZm9yIGFsbCBvcmlnaW5zLi4uICovCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCWlmIChwdXJnZV9vcmlnX25vZGUoYmF0X3ByaXYsIG9yaWdfbm9kZSkpIHsKLQkJCWhhc2hfcmVtb3ZlX2J1Y2tldChiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KTsKLQkJCWZyZWVfb3JpZ19ub2RlKG9yaWdfbm9kZSwgYmF0X3ByaXYpOwotCQl9Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgKG9yaWdfbm9kZS0+bGFzdF9mcmFnX3BhY2tldCArCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoRlJBR19USU1FT1VUKSkpKQotCQkJZnJhZ19saXN0X2ZyZWUoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBwdXJnZV9vcmlnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBiYXRfcHJpdiwgb3JpZ193b3JrKTsKLQotCV9wdXJnZV9vcmlnKGJhdF9wcml2KTsKLQlzdGFydF9wdXJnZV90aW1lcihiYXRfcHJpdik7Ci19Ci0KLXZvaWQgcHVyZ2Vfb3JpZ19yZWYoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlfcHVyZ2Vfb3JpZyhiYXRfcHJpdik7Ci19Ci0KLWludCBvcmlnX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlpbnQgYmF0bWFuX2NvdW50ID0gMDsKLQlpbnQgbGFzdF9zZWVuX3NlY3M7Ci0JaW50IGxhc3Rfc2Vlbl9tc2VjczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHx8Ci0JICAgIChiYXRfcHJpdi0+cHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkpIHsKLQkJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJCSAgICAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJCSAgICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgIgotCQkJCSAgImRpc2FibGVkIC0gcHJpbWFyeSBpbnRlcmZhY2Ugbm90IGFjdGl2ZVxuIiwKLQkJCQkgIG5ldF9kZXYtPm5hbWUpOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiW0IuQS5ULk0uQS5OLiBhZHYgJXMlcywgTWFpbklGL01BQzogJXMvJXBNICglcyldXG4iLAotCQkgICBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsCi0JCSAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5uYW1lLAotCQkgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIG5ldF9kZXYtPm5hbWUpOwotCXNlcV9wcmludGYoc2VxLCAiICAlLTE1cyAlcyAoJXMvJWkpICUxN3MgWyUxMHNdOiAlMjBzIC4uLlxuIiwKLQkJICAgIk9yaWdpbmF0b3IiLCAibGFzdC1zZWVuIiwgIiMiLCBUUV9NQVhfVkFMVUUsICJOZXh0aG9wIiwKLQkJICAgIm91dGdvaW5nSUYiLCAiUG90ZW50aWFsIG5leHRob3BzIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0KLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWxhc3Rfc2Vlbl9zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KLQkJCQkJCW9yaWdfbm9kZS0+bGFzdF92YWxpZCkgLyAxMDAwOwotCQlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQotCQkJCQkJb3JpZ19ub2RlLT5sYXN0X3ZhbGlkKSAlIDEwMDA7Ci0KLQkJc2VxX3ByaW50ZihzZXEsICIlcE0gJTRpLiUwM2lzICAgKCUzaSkgJXBNIFslMTBzXToiLAotCQkJICAgb3JpZ19ub2RlLT5vcmlnLCBsYXN0X3NlZW5fc2VjcywgbGFzdF9zZWVuX21zZWNzLAotCQkJICAgb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2Zywgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsCi0JCQkgICBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkobmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewotCQkJc2VxX3ByaW50ZihzZXEsICIgJXBNICglM2kpIiwgbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJICAgbmVpZ2hfbm9kZS0+dHFfYXZnKTsKLQkJfQotCi0JCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKLQkJYmF0bWFuX2NvdW50Kys7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoKGJhdG1hbl9jb3VudCA9PSAwKSkKLQkJc2VxX3ByaW50ZihzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9yaWdfbm9kZV9hZGRfaWYoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgbWF4X2lmX251bSkKLXsKLQl2b2lkICpkYXRhX3B0cjsKLQotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFMsCi0JCQkgICBHRlBfQVRPTUlDKTsKLQlpZiAoIWRhdGFfcHRyKSB7Ci0JCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293biwKLQkgICAgICAgKG1heF9pZl9udW0gLSAxKSAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTKTsKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bik7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd24gPSBkYXRhX3B0cjsKLQotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWRhdGFfcHRyKSB7Ci0JCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sCi0JICAgICAgIChtYXhfaWZfbnVtIC0gMSkgKiBzaXplb2YodWludDhfdCkpOwotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtID0gZGF0YV9wdHI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG9yaWdfaGFzaF9hZGRfaWYoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCBpbnQgbWF4X2lmX251bSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlIQVNISVQoaGFzaGl0KTsKLQotCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgotCSAqIGlmX251bSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAob3JpZ19ub2RlX2FkZF9pZihvcmlnX25vZGUsIG1heF9pZl9udW0pID09IC0xKQotCQkJZ290byBlcnI7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGludCBvcmlnX25vZGVfZGVsX2lmKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgICBpbnQgbWF4X2lmX251bSwgaW50IGRlbF9pZl9udW0pCi17Ci0Jdm9pZCAqZGF0YV9wdHIgPSBOVUxMOwotCWludCBjaHVua19zaXplOwotCi0JLyogbGFzdCBpbnRlcmZhY2Ugd2FzIHJlbW92ZWQgKi8KLQlpZiAobWF4X2lmX251bSA9PSAwKQotCQlnb3RvIGZyZWVfYmNhc3Rfb3duOwotCi0JY2h1bmtfc2l6ZSA9IHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTOwotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogY2h1bmtfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNvcHkgZmlyc3QgcGFydCAqLwotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd24sIGRlbF9pZl9udW0gKiBjaHVua19zaXplKTsKLQotCS8qIGNvcHkgc2Vjb25kIHBhcnQgKi8KLQltZW1jcHkoZGF0YV9wdHIgKyBkZWxfaWZfbnVtICogY2h1bmtfc2l6ZSwKLQkgICAgICAgb3JpZ19ub2RlLT5iY2FzdF9vd24gKyAoKGRlbF9pZl9udW0gKyAxKSAqIGNodW5rX3NpemUpLAotCSAgICAgICAobWF4X2lmX251bSAtIGRlbF9pZl9udW0pICogY2h1bmtfc2l6ZSk7Ci0KLWZyZWVfYmNhc3Rfb3duOgotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duKTsKLQlvcmlnX25vZGUtPmJjYXN0X293biA9IGRhdGFfcHRyOwotCi0JaWYgKG1heF9pZl9udW0gPT0gMCkKLQkJZ290byBmcmVlX293bl9zdW07Ci0KLQlkYXRhX3B0ciA9IGttYWxsb2MobWF4X2lmX251bSAqIHNpemVvZih1aW50OF90KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtLAotCSAgICAgICBkZWxfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotCW1lbWNweShkYXRhX3B0ciArIGRlbF9pZl9udW0gKiBzaXplb2YodWludDhfdCksCi0JICAgICAgIG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSArICgoZGVsX2lmX251bSArIDEpICogc2l6ZW9mKHVpbnQ4X3QpKSwKLQkgICAgICAgKG1heF9pZl9udW0gLSBkZWxfaWZfbnVtKSAqIHNpemVvZih1aW50OF90KSk7Ci0KLWZyZWVfb3duX3N1bToKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotCW9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSA9IGRhdGFfcHRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmX3RtcDsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlIQVNISVQoaGFzaGl0KTsKLQlpbnQgcmV0OwotCi0JLyogcmVzaXplIGFsbCBvcmlnIG5vZGVzIGJlY2F1c2Ugb3JpZ19ub2RlLT5iY2FzdF9vd24oX3N1bSkgZGVwZW5kIG9uCi0JICogaWZfbnVtICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCXJldCA9IG9yaWdfbm9kZV9kZWxfaWYob3JpZ19ub2RlLCBtYXhfaWZfbnVtLAotCQkJCSAgICAgICBiYXRtYW5faWYtPmlmX251bSk7Ci0KLQkJaWYgKHJldCA9PSAtMSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCS8qIHJlbnVtYmVyIHJlbWFpbmluZyBiYXRtYW4gaW50ZXJmYWNlcyBfaW5zaWRlXyBvZiBvcmlnX2hhc2hfbG9jayAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWZfdG1wLCAmaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoYmF0bWFuX2lmX3RtcC0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmID09IGJhdG1hbl9pZl90bXApCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IGJhdG1hbl9pZl90bXAtPnNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmX3RtcC0+aWZfbnVtID4gYmF0bWFuX2lmLT5pZl9udW0pCi0JCQliYXRtYW5faWZfdG1wLT5pZl9udW0tLTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQliYXRtYW5faWYtPmlmX251bSA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotCi1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9NRU07Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2M0MDA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9PUklHSU5BVE9SX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9PUklHSU5BVE9SX0hfCi0KLWludCBvcmlnaW5hdG9yX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIG9yaWdpbmF0b3JfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgcHVyZ2Vfb3JpZ19yZWYoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1zdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpOwotc3RydWN0IG5laWdoX25vZGUgKgotY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQl1aW50OF90ICpuZWlnaCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotaW50IG9yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci1pbnQgb3JpZ19oYXNoX2FkZF9pZihzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGludCBtYXhfaWZfbnVtKTsKLWludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX09SSUdJTkFUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTMzODMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1BBQ0tFVF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfCi0KLSNkZWZpbmUgRVRIX1BfQkFUTUFOICAweDQzMDUJLyogdW5vZmZpY2lhbC9ub3QgcmVnaXN0ZXJlZCBFdGhlcnR5cGUgKi8KLQotI2RlZmluZSBCQVRfUEFDS0VUICAgICAgIDB4MDEKLSNkZWZpbmUgQkFUX0lDTVAgICAgICAgICAweDAyCi0jZGVmaW5lIEJBVF9VTklDQVNUICAgICAgMHgwMwotI2RlZmluZSBCQVRfQkNBU1QgICAgICAgIDB4MDQKLSNkZWZpbmUgQkFUX1ZJUyAgICAgICAgICAweDA1Ci0jZGVmaW5lIEJBVF9VTklDQVNUX0ZSQUcgMHgwNgotCi0vKiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYmF0Y3RsIHdoaWNoIG5lZWRzIHRoZXNlIGRlZmluZXMgKi8KLSNkZWZpbmUgQ09NUEFUX1ZFUlNJT04gMTMKLSNkZWZpbmUgRElSRUNUTElOSyAweDQwCi0jZGVmaW5lIFZJU19TRVJWRVIgMHgyMAotI2RlZmluZSBQUklNQVJJRVNfRklSU1RfSE9QIDB4MTAKLQotLyogSUNNUCBtZXNzYWdlIHR5cGVzICovCi0jZGVmaW5lIEVDSE9fUkVQTFkgMAotI2RlZmluZSBERVNUSU5BVElPTl9VTlJFQUNIQUJMRSAzCi0jZGVmaW5lIEVDSE9fUkVRVUVTVCA4Ci0jZGVmaW5lIFRUTF9FWENFRURFRCAxMQotI2RlZmluZSBQQVJBTUVURVJfUFJPQkxFTSAxMgotCi0vKiB2aXMgZGVmaW5lcyAqLwotI2RlZmluZSBWSVNfVFlQRV9TRVJWRVJfU1lOQwkJMAotI2RlZmluZSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFCQkxCi0KLS8qIGZyYWdtZW50YXRpb24gZGVmaW5lcyAqLwotI2RlZmluZSBVTklfRlJBR19IRUFEIDB4MDEKLQotc3RydWN0IGJhdG1hbl9wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIGZsYWdzOyAgICAvKiAweDQwOiBESVJFQ1RMSU5LIGZsYWcsIDB4MjAgVklTX1NFUlZFUiBmbGFnLi4uICovCi0JdWludDhfdCAgdHE7Ci0JdWludDMyX3Qgc2Vxbm87Ci0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50OF90ICBwcmV2X3NlbmRlcls2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDhfdCAgbnVtX2huYTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQkFUX1BBQ0tFVF9MRU4gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KQotCi1zdHJ1Y3QgaWNtcF9wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCi0JdWludDhfdCAgdHRsOwotCXVpbnQ4X3QgIGRzdFs2XTsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQ4X3QgIHVpZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQkFUX1JSX0xFTiAxNgotCi0vKiBpY21wX3BhY2tldF9yciBtdXN0IHN0YXJ0IHdpdGggYWxsIGZpZWxkcyBmcm9tIGltY3BfcGFja2V0Ci0gKiBhcyB0aGlzIGlzIGFzc3VtZWQgYnkgY29kZSB0aGF0IGhhbmRsZXMgSUNNUCBwYWNrZXRzICovCi1zdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCi0JdWludDhfdCAgdHRsOwotCXVpbnQ4X3QgIGRzdFs2XTsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQ4X3QgIHVpZDsKLQl1aW50OF90ICBycl9jdXI7Ci0JdWludDhfdCAgcnJbQkFUX1JSX0xFTl1bRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHVuaWNhc3RfcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBkZXN0WzZdOwotCXVpbnQ4X3QgIHR0bDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBkZXN0WzZdOwotCXVpbnQ4X3QgIHR0bDsKLQl1aW50OF90ICBmbGFnczsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGJjYXN0X3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDMyX3Qgc2Vxbm87Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgdmlzX3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgICAgICAgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgdmlzX3R5cGU7CSAvKiB3aGljaCB0eXBlIG9mIHZpcy1wYXJ0aWNpcGFudCBzZW50IHRoaXM/ICovCi0JdWludDhfdCAgZW50cmllczsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGJlaGluZCB0aGlzIHN0cnVjdCAqLwotCXVpbnQzMl90IHNlcW5vOwkJIC8qIHNlcXVlbmNlIG51bWJlciAqLwotCXVpbnQ4X3QgIHR0bDsJCSAvKiBUVEwgKi8KLQl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBpbmZvcm1zIGFib3V0IGl0cwotCQkJCSAgKiBuZWlnaGJvcnMgKi8KLQl1aW50OF90ICB0YXJnZXRfb3JpZ1s2XTsgLyogd2hvIHNob3VsZCByZWNlaXZlIHRoaXMgcGFja2V0ICovCi0JdWludDhfdCAgc2VuZGVyX29yaWdbNl07IC8qIHdobyBzZW50IG9yIHJlYnJvYWRjYXN0ZWQgdGhpcyBwYWNrZXQgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmZDM3Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicmluZ19idWZmZXIuaCIKLQotdm9pZCByaW5nX2J1ZmZlcl9zZXQodWludDhfdCBscV9yZWN2W10sIHVpbnQ4X3QgKmxxX2luZGV4LCB1aW50OF90IHZhbHVlKQotewotCWxxX3JlY3ZbKmxxX2luZGV4XSA9IHZhbHVlOwotCSpscV9pbmRleCA9ICgqbHFfaW5kZXggKyAxKSAlIFRRX0dMT0JBTF9XSU5ET1dfU0laRTsKLX0KLQotdWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pCi17Ci0JdWludDhfdCAqcHRyOwotCXVpbnQxNl90IGNvdW50ID0gMCwgaSA9IDAsIHN1bSA9IDA7Ci0KLQlwdHIgPSBscV9yZWN2OwotCi0Jd2hpbGUgKGkgPCBUUV9HTE9CQUxfV0lORE9XX1NJWkUpIHsKLQkJaWYgKCpwdHIgIT0gMCkgewotCQkJY291bnQrKzsKLQkJCXN1bSArPSAqcHRyOwotCQl9Ci0KLQkJaSsrOwotCQlwdHIrKzsKLQl9Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBjYjlhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfUklOR19CVUZGRVJfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfCi0KLXZvaWQgcmluZ19idWZmZXJfc2V0KHVpbnQ4X3QgbHFfcmVjdltdLCB1aW50OF90ICpscV9pbmRleCwgdWludDhfdCB2YWx1ZSk7Ci11aW50OF90IHJpbmdfYnVmZmVyX2F2Zyh1aW50OF90IGxxX3JlY3ZbXSk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUklOR19CVUZGRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3YjY5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJpY21wX3NvY2tldC5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAib3JpZ2luYXRvci5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAicmluZ19idWZmZXIuaCIKLSNpbmNsdWRlICJ2aXMuaCIKLSNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgotI2luY2x1ZGUgInVuaWNhc3QuaCIKLQotdm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQlIQVNISVQoaGFzaGl0KTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JVFlQRV9PRl9XT1JEICp3b3JkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0JCW9yaWdfbm9kZSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0JCXdvcmQgPSAmKG9yaWdfbm9kZS0+YmNhc3Rfb3duW2JhdG1hbl9pZi0+aWZfbnVtICogTlVNX1dPUkRTXSk7Ci0KLQkJYml0X2dldF9wYWNrZXQoYmF0X3ByaXYsIHdvcmQsIDEsIDApOwotCQlvcmlnX25vZGUtPmJjYXN0X293bl9zdW1bYmF0bWFuX2lmLT5pZl9udW1dID0KLQkJCWJpdF9wYWNrZXRfY291bnQod29yZCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9ITkEoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkgICAgICAgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pCi17Ci0JaWYgKChobmFfYnVmZl9sZW4gIT0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHx8Ci0JICAgICgoaG5hX2J1ZmZfbGVuID4gMCkgJiYKLQkgICAgIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA+IDApICYmCi0JICAgICAobWVtY21wKG9yaWdfbm9kZS0+aG5hX2J1ZmYsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pICE9IDApKSkgewotCi0JCWlmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA+IDApCi0JCQlobmFfZ2xvYmFsX2RlbF9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJCSAgICAib3JpZ2luYXRvciBjaGFuZ2VkIGhuYSIpOwotCi0JCWlmICgoaG5hX2J1ZmZfbGVuID4gMCkgJiYgKGhuYV9idWZmICE9IE5VTEwpKQotCQkJaG5hX2dsb2JhbF9hZGRfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkgICAgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfcm91dGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUsCi0JCQkgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pCi17Ci0JLyogcm91dGUgZGVsZXRlZCAqLwotCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkgJiYgKG5laWdoX25vZGUgPT0gTlVMTCkpIHsKLQotCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LCAiRGVsZXRpbmcgcm91dGUgdG93YXJkczogJXBNXG4iLAotCQkJb3JpZ19ub2RlLT5vcmlnKTsKLQkJaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCSAgICAib3JpZ2luYXRvciB0aW1lZCBvdXQiKTsKLQotCQkvKiByb3V0ZSBhZGRlZCAqLwotCX0gZWxzZSBpZiAoKG9yaWdfbm9kZS0+cm91dGVyID09IE5VTEwpICYmIChuZWlnaF9ub2RlICE9IE5VTEwpKSB7Ci0KLQkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKLQkJCSJBZGRpbmcgcm91dGUgdG93YXJkczogJXBNICh2aWEgJXBNKVxuIiwKLQkJCW9yaWdfbm9kZS0+b3JpZywgbmVpZ2hfbm9kZS0+YWRkcik7Ci0JCWhuYV9nbG9iYWxfYWRkX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkgICAgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci0KLQkJLyogcm91dGUgY2hhbmdlZCAqLwotCX0gZWxzZSB7Ci0JCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCQkiQ2hhbmdpbmcgcm91dGUgdG93YXJkczogJXBNICIKLQkJCSIobm93IHZpYSAlcE0gLSB3YXMgdmlhICVwTSlcbiIsCi0JCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCi0JCQlvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7Ci0JfQotCi0Jb3JpZ19ub2RlLT5yb3V0ZXIgPSBuZWlnaF9ub2RlOwotfQotCi0KLXZvaWQgdXBkYXRlX3JvdXRlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCSAgIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLCB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwKLQkJICAgaW50IGhuYV9idWZmX2xlbikKLXsKLQotCWlmIChvcmlnX25vZGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKG9yaWdfbm9kZS0+cm91dGVyICE9IG5laWdoX25vZGUpCi0JCXVwZGF0ZV9yb3V0ZShiYXRfcHJpdiwgb3JpZ19ub2RlLCBuZWlnaF9ub2RlLAotCQkJICAgICBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKLQkvKiBtYXkgYmUganVzdCBITkEgY2hhbmdlZCAqLwotCWVsc2UKLQkJdXBkYXRlX0hOQShiYXRfcHJpdiwgb3JpZ19ub2RlLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKLX0KLQotc3RhdGljIGludCBpc19iaWRpcmVjdGlvbmFsX25laWdoKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsCi0JCQkJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciB0b3RhbF9jb3VudDsKLQotCWlmIChvcmlnX25vZGUgPT0gb3JpZ19uZWlnaF9ub2RlKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsCi0JCQkJICAgICZvcmlnX25vZGUtPm5laWdoX2xpc3QsCi0JCQkJICAgIGxpc3QpIHsKLQotCQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJIG9yaWdfbmVpZ2hfbm9kZS0+b3JpZykgJiYKLQkJCSAgICAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKLQkJCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7Ci0JCX0KLQotCQlpZiAoIW5laWdoX25vZGUpCi0JCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLAotCQkJCQkJICAgICBvcmlnX25laWdoX25vZGUtPm9yaWcsCi0JCQkJCQkgICAgIGlmX2luY29taW5nKTsKLQkJLyogY3JlYXRlX25laWdoYm9yIGZhaWxlZCwgcmV0dXJuIDAgKi8KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJcmV0dXJuIDA7Ci0KLQkJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJLyogZmluZCBwYWNrZXQgY291bnQgb2YgY29ycmVzcG9uZGluZyBvbmUgaG9wIG5laWdoYm9yICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsCi0JCQkJICAgICZvcmlnX25laWdoX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQotCQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJIG9yaWdfbmVpZ2hfbm9kZS0+b3JpZykgJiYKLQkJCSAgICAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKLQkJCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7Ci0JCX0KLQotCQlpZiAoIW5laWdoX25vZGUpCi0JCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLAotCQkJCQkJICAgICBvcmlnX25laWdoX25vZGUtPm9yaWcsCi0JCQkJCQkgICAgIGlmX2luY29taW5nKTsKLQkJLyogY3JlYXRlX25laWdoYm9yIGZhaWxlZCwgcmV0dXJuIDAgKi8KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0Jb3JpZ19ub2RlLT5sYXN0X3ZhbGlkID0gamlmZmllczsKLQotCS8qIHBheSBhdHRlbnRpb24gdG8gbm90IGdldCBhIHZhbHVlIGJpZ2dlciB0aGFuIDEwMCAlICovCi0JdG90YWxfY291bnQgPSAob3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dID4KLQkJICAgICAgIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50ID8KLQkJICAgICAgIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IDoKLQkJICAgICAgIG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSk7Ci0KLQkvKiBpZiB3ZSBoYXZlIHRvbyBmZXcgcGFja2V0cyAodG9vIGxlc3MgZGF0YSkgd2Ugc2V0IHRxX293biB0byB6ZXJvICovCi0JLyogaWYgd2UgcmVjZWl2ZSB0b28gZmV3IHBhY2tldHMgaXQgaXMgbm90IGNvbnNpZGVyZWQgYmlkaXJlY3Rpb25hbCAqLwotCWlmICgodG90YWxfY291bnQgPCBUUV9MT0NBTF9CSURSRUNUX1NFTkRfTUlOSU1VTSkgfHwKLQkgICAgKG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IDwgVFFfTE9DQUxfQklEUkVDVF9SRUNWX01JTklNVU0pKQotCQlvcmlnX25laWdoX25vZGUtPnRxX293biA9IDA7Ci0JZWxzZQotCQkvKiBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCBpcyBuZXZlciB6ZXJvIGFzIHdlCi0JCSAqIG9ubHkgcHVyZ2Ugb2xkIGluZm9ybWF0aW9uIHdoZW4gZ2V0dGluZyBuZXcKLQkJICogaW5mb3JtYXRpb24gKi8KLQkJb3JpZ19uZWlnaF9ub2RlLT50cV9vd24gPSAoVFFfTUFYX1ZBTFVFICogdG90YWxfY291bnQpIC8KLQkJCW5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50OwotCi0JLyoKLQkgKiAxIC0gKCgxLXgpICoqIDMpLCBub3JtYWxpemVkIHRvIFRRX01BWF9WQUxVRSB0aGlzIGRvZXMKLQkgKiBhZmZlY3QgdGhlIG5lYXJseS1zeW1tZXRyaWMgbGlua3Mgb25seSBhIGxpdHRsZSwgYnV0Ci0JICogcHVuaXNoZXMgYXN5bW1ldHJpYyBsaW5rcyBtb3JlLiAgVGhpcyB3aWxsIGdpdmUgYSB2YWx1ZQotCSAqIGJldHdlZW4gMCBhbmQgVFFfTUFYX1ZBTFVFCi0JICovCi0Jb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkgPQotCQlUUV9NQVhfVkFMVUUgLQotCQkoVFFfTUFYX1ZBTFVFICoKLQkJIChUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSAqCi0JCSAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgotCQkgKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpKSAvCi0JCShUUV9MT0NBTF9XSU5ET1dfU0laRSAqCi0JCSBUUV9MT0NBTF9XSU5ET1dfU0laRSAqCi0JCSBUUV9MT0NBTF9XSU5ET1dfU0laRSk7Ci0KLQliYXRtYW5fcGFja2V0LT50cSA9ICgoYmF0bWFuX3BhY2tldC0+dHEgKgotCQkJICAgICAgb3JpZ19uZWlnaF9ub2RlLT50cV9vd24gKgotCQkJICAgICAgb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkpIC8KLQkJCSAgICAgKFRRX01BWF9WQUxVRSAqIFRRX01BWF9WQUxVRSkpOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJImJpZGlyZWN0aW9uYWw6ICIKLQkJIm9yaWcgPSAlLTE1cE0gbmVpZ2ggPSAlLTE1cE0gPT4gb3duX2JjYXN0ID0gJTJpLCAiCi0JCSJyZWFsIHJlY3YgPSAlMmksIGxvY2FsIHRxOiAlM2ksIGFzeW1fcGVuYWx0eTogJTNpLCAiCi0JCSJ0b3RhbCB0cTogJTNpXG4iLAotCQlvcmlnX25vZGUtPm9yaWcsIG9yaWdfbmVpZ2hfbm9kZS0+b3JpZywgdG90YWxfY291bnQsCi0JCW5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50LCBvcmlnX25laWdoX25vZGUtPnRxX293biwKLQkJb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHksIGJhdG1hbl9wYWNrZXQtPnRxKTsKLQotCS8qIGlmIGxpbmsgaGFzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHRyYW5zbWlzc2lvbiBxdWFsaXR5Ci0JICogY29uc2lkZXIgaXQgYmlkaXJlY3Rpb25hbCAqLwotCWlmIChiYXRtYW5fcGFja2V0LT50cSA+PSBUUV9UT1RBTF9CSURSRUNUX0xJTUlUKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKLQkJCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJY2hhciBpc19kdXBsaWNhdGUpCi17Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUgPSBOVUxMLCAqdG1wX25laWdoX25vZGUgPSBOVUxMOwotCWludCB0bXBfaG5hX2J1ZmZfbGVuOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgInVwZGF0ZV9vcmlnaW5hdG9yKCk6ICIKLQkJIlNlYXJjaGluZyBhbmQgdXBkYXRpbmcgb3JpZ2luYXRvciBlbnRyeSBvZiByZWNlaXZlZCBwYWNrZXRcbiIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewotCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJgotCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpIHsKLQkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGlzX2R1cGxpY2F0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCXJpbmdfYnVmZmVyX3NldCh0bXBfbmVpZ2hfbm9kZS0+dHFfcmVjdiwKLQkJCQkmdG1wX25laWdoX25vZGUtPnRxX2luZGV4LCAwKTsKLQkJdG1wX25laWdoX25vZGUtPnRxX2F2ZyA9Ci0JCQlyaW5nX2J1ZmZlcl9hdmcodG1wX25laWdoX25vZGUtPnRxX3JlY3YpOwotCX0KLQotCWlmICghbmVpZ2hfbm9kZSkgewotCQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX3RtcDsKLQotCQlvcmlnX3RtcCA9IGdldF9vcmlnX25vZGUoYmF0X3ByaXYsIGV0aGhkci0+aF9zb3VyY2UpOwotCQlpZiAoIW9yaWdfdG1wKQotCQkJcmV0dXJuOwotCi0JCW5laWdoX25vZGUgPSBjcmVhdGVfbmVpZ2hib3Iob3JpZ19ub2RlLCBvcmlnX3RtcCwKLQkJCQkJICAgICBldGhoZHItPmhfc291cmNlLCBpZl9pbmNvbWluZyk7Ci0JCWlmICghbmVpZ2hfbm9kZSkKLQkJCXJldHVybjsKLQl9IGVsc2UKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJVcGRhdGluZyBleGlzdGluZyBsYXN0LWhvcCBuZWlnaGJvciBvZiBvcmlnaW5hdG9yXG4iKTsKLQotCW9yaWdfbm9kZS0+ZmxhZ3MgPSBiYXRtYW5fcGFja2V0LT5mbGFnczsKLQluZWlnaF9ub2RlLT5sYXN0X3ZhbGlkID0gamlmZmllczsKLQotCXJpbmdfYnVmZmVyX3NldChuZWlnaF9ub2RlLT50cV9yZWN2LAotCQkJJm5laWdoX25vZGUtPnRxX2luZGV4LAotCQkJYmF0bWFuX3BhY2tldC0+dHEpOwotCW5laWdoX25vZGUtPnRxX2F2ZyA9IHJpbmdfYnVmZmVyX2F2ZyhuZWlnaF9ub2RlLT50cV9yZWN2KTsKLQotCWlmICghaXNfZHVwbGljYXRlKSB7Ci0JCW9yaWdfbm9kZS0+bGFzdF90dGwgPSBiYXRtYW5fcGFja2V0LT50dGw7Ci0JCW5laWdoX25vZGUtPmxhc3RfdHRsID0gYmF0bWFuX3BhY2tldC0+dHRsOwotCX0KLQotCXRtcF9obmFfYnVmZl9sZW4gPSAoaG5hX2J1ZmZfbGVuID4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOID8KLQkJCSAgICBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4gOiBobmFfYnVmZl9sZW4pOwotCi0JLyogaWYgdGhpcyBuZWlnaGJvciBhbHJlYWR5IGlzIG91ciBuZXh0IGhvcCB0aGVyZSBpcyBub3RoaW5nCi0JICogdG8gY2hhbmdlICovCi0JaWYgKG9yaWdfbm9kZS0+cm91dGVyID09IG5laWdoX25vZGUpCi0JCWdvdG8gdXBkYXRlX2huYTsKLQotCS8qIGlmIHRoaXMgbmVpZ2hib3IgZG9lcyBub3Qgb2ZmZXIgYSBiZXR0ZXIgVFEgd2Ugd29uJ3QgY29uc2lkZXIgaXQgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IG5laWdoX25vZGUtPnRxX2F2ZykpCi0JCWdvdG8gdXBkYXRlX2huYTsKLQotCS8qIGlmIHRoZSBUUSBpcyB0aGUgc2FtZSBhbmQgdGhlIGxpbmsgbm90IG1vcmUgc3ltZXRyaWMgd2UKLQkgKiB3b24ndCBjb25zaWRlciBpdCBlaXRoZXIgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJgotCSAgICAgKChuZWlnaF9ub2RlLT50cV9hdmcgPT0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZykgJiYKLQkgICAgIChvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dCi0JICAgICAgPj0gbmVpZ2hfbm9kZS0+b3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dKSkpCi0JCWdvdG8gdXBkYXRlX2huYTsKLQotCXVwZGF0ZV9yb3V0ZXMoYmF0X3ByaXYsIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSwKLQkJICAgICAgaG5hX2J1ZmYsIHRtcF9obmFfYnVmZl9sZW4pOwotCXJldHVybjsKLQotdXBkYXRlX2huYToKLQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsIG9yaWdfbm9kZS0+cm91dGVyLAotCQkgICAgICBobmFfYnVmZiwgdG1wX2huYV9idWZmX2xlbik7Ci19Ci0KLS8qIGNoZWNrcyB3aGV0aGVyIHRoZSBob3N0IHJlc3RhcnRlZCBhbmQgaXMgaW4gdGhlIHByb3RlY3Rpb24gdGltZS4KLSAqIHJldHVybnM6Ci0gKiAgMCBpZiB0aGUgcGFja2V0IGlzIHRvIGJlIGFjY2VwdGVkCi0gKiAgMSBpZiB0aGUgcGFja2V0IGlzIHRvIGJlIGlnbm9yZWQuCi0gKi8KLXN0YXRpYyBpbnQgd2luZG93X3Byb3RlY3RlZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgIGludDMyX3Qgc2VxX251bV9kaWZmLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgKmxhc3RfcmVzZXQpCi17Ci0JaWYgKChzZXFfbnVtX2RpZmYgPD0gLVRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQl8fCAoc2VxX251bV9kaWZmID49IEVYUEVDVEVEX1NFUU5PX1JBTkdFKSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCAqbGFzdF9yZXNldCArCi0JCQltc2Vjc190b19qaWZmaWVzKFJFU0VUX1BST1RFQ1RJT05fTVMpKSkgewotCi0JCQkqbGFzdF9yZXNldCA9IGppZmZpZXM7Ci0JCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCSJvbGQgcGFja2V0IHJlY2VpdmVkLCBzdGFydCBwcm90ZWN0aW9uXG4iKTsKLQotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBwcm9jZXNzZXMgYSBiYXRtYW4gcGFja2V0IGZvciBhbGwgaW50ZXJmYWNlcywgYWRqdXN0cyB0aGUgc2VxdWVuY2UgbnVtYmVyIGFuZAotICogZmluZHMgb3V0IHdoZXRoZXIgaXQgaXMgYSBkdXBsaWNhdGUuCi0gKiByZXR1cm5zOgotICogICAxIHRoZSBwYWNrZXQgaXMgYSBkdXBsaWNhdGUKLSAqICAgMCB0aGUgcGFja2V0IGhhcyBub3QgeWV0IGJlZW4gcmVjZWl2ZWQKLSAqICAtMSB0aGUgcGFja2V0IGlzIG9sZCBhbmQgaGFzIGJlZW4gcmVjZWl2ZWQgd2hpbGUgdGhlIHNlcW5vIHdpbmRvdwotICogICAgIHdhcyBwcm90ZWN0ZWQuIENhbGxlciBzaG91bGQgZHJvcCBpdC4KLSAqLwotc3RhdGljIGNoYXIgY291bnRfcmVhbF9wYWNrZXRzKHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqdG1wX25laWdoX25vZGU7Ci0JY2hhciBpc19kdXBsaWNhdGUgPSAwOwotCWludDMyX3Qgc2VxX2RpZmY7Ci0JaW50IG5lZWRfdXBkYXRlID0gMDsKLQlpbnQgc2V0X21hcms7Ci0KLQlvcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKLQlpZiAob3JpZ19ub2RlID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0Jc2VxX2RpZmYgPSBiYXRtYW5fcGFja2V0LT5zZXFubyAtIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vOwotCi0JLyogc2lnbmFsaXplIGNhbGxlciB0aGF0IHRoZSBwYWNrZXQgaXMgdG8gYmUgZHJvcHBlZC4gKi8KLQlpZiAod2luZG93X3Byb3RlY3RlZChiYXRfcHJpdiwgc2VxX2RpZmYsCi0JCQkgICAgICZvcmlnX25vZGUtPmJhdG1hbl9zZXFub19yZXNldCkpCi0JCXJldHVybiAtMTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQotCQlpc19kdXBsaWNhdGUgfD0gZ2V0X2JpdF9zdGF0dXModG1wX25laWdoX25vZGUtPnJlYWxfYml0cywKLQkJCQkJICAgICAgIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLAotCQkJCQkgICAgICAgYmF0bWFuX3BhY2tldC0+c2Vxbm8pOwotCi0JCWlmIChjb21wYXJlX29yaWcodG1wX25laWdoX25vZGUtPmFkZHIsIGV0aGhkci0+aF9zb3VyY2UpICYmCi0JCSAgICAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKLQkJCXNldF9tYXJrID0gMTsKLQkJZWxzZQotCQkJc2V0X21hcmsgPSAwOwotCi0JCS8qIGlmIHRoZSB3aW5kb3cgbW92ZWQsIHNldCB0aGUgdXBkYXRlIGZsYWcuICovCi0JCW5lZWRfdXBkYXRlIHw9IGJpdF9nZXRfcGFja2V0KGJhdF9wcml2LAotCQkJCQkgICAgICB0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzLAotCQkJCQkgICAgICBzZXFfZGlmZiwgc2V0X21hcmspOwotCi0JCXRtcF9uZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA9Ci0JCQliaXRfcGFja2V0X2NvdW50KHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMpOwotCX0KLQotCWlmIChuZWVkX3VwZGF0ZSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJInVwZGF0aW5nIGxhc3Rfc2Vxbm86IG9sZCAlZCwgbmV3ICVkXG4iLAotCQkJb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8sIGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKLQkJb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8gPSBiYXRtYW5fcGFja2V0LT5zZXFubzsKLQl9Ci0KLQlyZXR1cm4gaXNfZHVwbGljYXRlOwotfQotCi0vKiBjb3B5IHByaW1hcnkgYWRkcmVzcyBmb3IgYm9uZGluZyAqLwotc3RhdGljIHZvaWQgbWFya19ib25kaW5nX2FkZHJlc3Moc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsCi0JCQkJIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0KQotCi17Ci0JaWYgKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgUFJJTUFSSUVTX0ZJUlNUX0hPUCkKLQkJbWVtY3B5KG9yaWdfbmVpZ2hfbm9kZS0+cHJpbWFyeV9hZGRyLAotCQkgICAgICAgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIG1hcmsgcG9zc2libGUgYm9uZC5jYW5kaWRhdGVzIGluIHRoZSBuZWlnaGJvciBsaXN0ICovCi12b2lkIHVwZGF0ZV9ib25kaW5nX2NhbmRpZGF0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpCi17Ci0JaW50IGNhbmRpZGF0ZXM7Ci0JaW50IGludGVyZmVyZW5jZV9jYW5kaWRhdGU7Ci0JaW50IGJlc3RfdHE7Ci0Jc3RydWN0IG5laWdoX25vZGUgKnRtcF9uZWlnaF9ub2RlLCAqdG1wX25laWdoX25vZGUyOwotCXN0cnVjdCBuZWlnaF9ub2RlICpmaXJzdF9jYW5kaWRhdGUsICpsYXN0X2NhbmRpZGF0ZTsKLQotCS8qIHVwZGF0ZSB0aGUgY2FuZGlkYXRlcyBmb3IgdGhpcyBvcmlnaW5hdG9yICovCi0JaWYgKCFvcmlnX25vZGUtPnJvdXRlcikgewotCQlvcmlnX25vZGUtPmJvbmQuY2FuZGlkYXRlcyA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQliZXN0X3RxID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQotCS8qIHVwZGF0ZSBib25kLmNhbmRpZGF0ZXMgKi8KLQotCWNhbmRpZGF0ZXMgPSAwOwotCi0JLyogbWFyayBvdGhlciBub2RlcyB3aGljaCBhbHNvIHJlY2VpdmVkICJQUklNQVJJRVMgRklSU1QgSE9QIiBwYWNrZXRzCi0JICogYXMgImJvbmRpbmcgcGFydG5lciIgKi8KLQotCS8qIGZpcnN0LCB6ZXJvIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewotCQl0bXBfbmVpZ2hfbm9kZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IE5VTEw7Ci0JfQotCi0JZmlyc3RfY2FuZGlkYXRlID0gTlVMTDsKLQlsYXN0X2NhbmRpZGF0ZSA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewotCi0JCS8qIG9ubHkgY29uc2lkZXIgaWYgaXQgaGFzIHRoZSBzYW1lIHByaW1hcnkgYWRkcmVzcyAuLi4gICovCi0JCWlmIChtZW1jbXAob3JpZ19ub2RlLT5vcmlnLAotCQkJCXRtcF9uZWlnaF9ub2RlLT5vcmlnX25vZGUtPnByaW1hcnlfYWRkciwKLQkJCQlFVEhfQUxFTikgIT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIC4uLiBhbmQgaXMgZ29vZCBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCAqLwotCQlpZiAodG1wX25laWdoX25vZGUtPnRxX2F2ZyA8IGJlc3RfdHEgLSBCT05ESU5HX1RRX1RIUkVTSE9MRCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGNoZWNrIGlmIHdlIGhhdmUgYW5vdGhlciBjYW5kaWRhdGUgd2l0aCB0aGUgc2FtZQotCQkgKiBtYWMgYWRkcmVzcyBvciBpbnRlcmZhY2UuIElmIHdlIGRvLCB3ZSB3b24ndAotCQkgKiBzZWxlY3QgdGhpcyBjYW5kaWRhdGUgYmVjYXVzZSBvZiBwb3NzaWJsZSBpbnRlcmZlcmVuY2UuICovCi0KLQkJaW50ZXJmZXJlbmNlX2NhbmRpZGF0ZSA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUyLAotCQkJCSZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQotCQkJaWYgKHRtcF9uZWlnaF9ub2RlMiA9PSB0bXBfbmVpZ2hfbm9kZSkKLQkJCQljb250aW51ZTsKLQotCQkJLyogd2Ugb25seSBjYXJlIGlmIHRoZSBvdGhlciBjYW5kaWRhdGUgaXMgZXZlbgotCQkJICogY29uc2lkZXJlZCBhcyBjYW5kaWRhdGUuICovCi0JCQlpZiAodG1wX25laWdoX25vZGUyLT5uZXh0X2JvbmRfY2FuZGlkYXRlID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0KLQotCQkJaWYgKCh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0KLQkJCQl0bXBfbmVpZ2hfbm9kZTItPmlmX2luY29taW5nKQotCQkJCXx8IChtZW1jbXAodG1wX25laWdoX25vZGUtPmFkZHIsCi0JCQkJdG1wX25laWdoX25vZGUyLT5hZGRyLCBFVEhfQUxFTikgPT0gMCkpIHsKLQotCQkJCWludGVyZmVyZW5jZV9jYW5kaWRhdGUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qIGRvbid0IGNhcmUgZnVydGhlciBpZiBpdCBpcyBhbiBpbnRlcmZlcmVuY2UgY2FuZGlkYXRlICovCi0JCWlmIChpbnRlcmZlcmVuY2VfY2FuZGlkYXRlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGZpcnN0X2NhbmRpZGF0ZSA9PSBOVUxMKSB7Ci0JCQlmaXJzdF9jYW5kaWRhdGUgPSB0bXBfbmVpZ2hfbm9kZTsKLQkJCXRtcF9uZWlnaF9ub2RlLT5uZXh0X2JvbmRfY2FuZGlkYXRlID0gZmlyc3RfY2FuZGlkYXRlOwotCQl9IGVsc2UKLQkJCXRtcF9uZWlnaF9ub2RlLT5uZXh0X2JvbmRfY2FuZGlkYXRlID0gbGFzdF9jYW5kaWRhdGU7Ci0KLQkJbGFzdF9jYW5kaWRhdGUgPSB0bXBfbmVpZ2hfbm9kZTsKLQotCQljYW5kaWRhdGVzKys7Ci0JfQotCi0JaWYgKGNhbmRpZGF0ZXMgPiAwKSB7Ci0JCWZpcnN0X2NhbmRpZGF0ZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IGxhc3RfY2FuZGlkYXRlOwotCQlvcmlnX25vZGUtPmJvbmQuc2VsZWN0ZWQgPSBmaXJzdF9jYW5kaWRhdGU7Ci0JfQotCi0Jb3JpZ19ub2RlLT5ib25kLmNhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzOwotfQotCi12b2lkIHJlY2VpdmVfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCAqb3JpZ19ub2RlOwotCWNoYXIgaGFzX2RpcmVjdGxpbmtfZmxhZzsKLQljaGFyIGlzX215X2FkZHIgPSAwLCBpc19teV9vcmlnID0gMCwgaXNfbXlfb2xkb3JpZyA9IDA7Ci0JY2hhciBpc19icm9hZGNhc3QgPSAwLCBpc19iaWRpcmVjdGlvbmFsLCBpc19zaW5nbGVfaG9wX25laWdoOwotCWNoYXIgaXNfZHVwbGljYXRlOwotCXVpbnQzMl90IGlmX2luY29taW5nX3NlcW5vOwotCi0JLyogU2lsZW50bHkgZHJvcCB3aGVuIHRoZSBiYXRtYW4gcGFja2V0IGlzIGFjdHVhbGx5IG5vdCBhCi0JICogY29ycmVjdCBwYWNrZXQuCi0JICoKLQkgKiBUaGlzIG1pZ2h0IGhhcHBlbiBpZiBhIHBhY2tldCBpcyBwYWRkZWQgKGUuZy4gRXRoZXJuZXQgaGFzIGEKLQkgKiBtaW5pbXVtIGZyYW1lIGxlbmd0aCBvZiA2NCBieXRlKSBhbmQgdGhlIGFnZ3JlZ2F0aW9uIGludGVycHJldHMKLQkgKiBpdCBhcyBhbiBhZGRpdGlvbmFsIGxlbmd0aC4KLQkgKgotCSAqIFRPRE86IEEgbW9yZSBzYW5lIHNvbHV0aW9uIHdvdWxkIGJlIHRvIGhhdmUgYSBiaXQgaW4gdGhlCi0JICogYmF0bWFuX3BhY2tldCB0byBkZXRlY3Qgd2hldGhlciB0aGUgcGFja2V0IGlzIHRoZSBsYXN0Ci0JICogcGFja2V0IGluIGFuIGFnZ3JlZ2F0aW9uLiAgSGVyZSB3ZSBleHBlY3QgdGhhdCB0aGUgcGFkZGluZwotCSAqIGlzIGFsd2F5cyB6ZXJvIChvciBub3QgMHgwMSkKLQkgKi8KLQlpZiAoYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUgIT0gQkFUX1BBQ0tFVCkKLQkJcmV0dXJuOwotCi0JLyogY291bGQgYmUgY2hhbmdlZCBieSBzY2hlZHVsZV9vd25fcGFja2V0KCkgKi8KLQlpZl9pbmNvbWluZ19zZXFubyA9IGF0b21pY19yZWFkKCZpZl9pbmNvbWluZy0+c2Vxbm8pOwotCi0JaGFzX2RpcmVjdGxpbmtfZmxhZyA9IChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMCk7Ci0KLQlpc19zaW5nbGVfaG9wX25laWdoID0gKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLAotCQkJCQkgICAgYmF0bWFuX3BhY2tldC0+b3JpZykgPyAxIDogMCk7Ci0KLQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkiUmVjZWl2ZWQgQkFUTUFOIHBhY2tldCB2aWEgTkI6ICVwTSwgSUY6ICVzIFslcE1dICIKLQkJIihmcm9tIE9HOiAlcE0sIHZpYSBwcmV2IE9HOiAlcE0sIHNlcW5vICVkLCB0cSAlZCwgIgotCQkiVFRMICVkLCBWICVkLCBJREYgJWQpXG4iLAotCQlldGhoZHItPmhfc291cmNlLCBpZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSwKLQkJaWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyLCBiYXRtYW5fcGFja2V0LT5vcmlnLAotCQliYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlciwgYmF0bWFuX3BhY2tldC0+c2Vxbm8sCi0JCWJhdG1hbl9wYWNrZXQtPnRxLCBiYXRtYW5fcGFja2V0LT50dGwsIGJhdG1hbl9wYWNrZXQtPnZlcnNpb24sCi0JCWhhc19kaXJlY3RsaW5rX2ZsYWcpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKGV0aGhkci0+aF9zb3VyY2UsCi0JCQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQotCQkJaXNfbXlfYWRkciA9IDE7Ci0KLQkJaWYgKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLAotCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKLQkJCWlzX215X29yaWcgPSAxOwotCi0JCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsCi0JCQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQotCQkJaXNfbXlfb2xkb3JpZyA9IDE7Ci0KLQkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBicm9hZGNhc3RfYWRkcikpCi0JCQlpc19icm9hZGNhc3QgPSAxOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmIChiYXRtYW5fcGFja2V0LT52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGluY29tcGF0aWJsZSBiYXRtYW4gdmVyc2lvbiAoJWkpXG4iLAotCQkJYmF0bWFuX3BhY2tldC0+dmVyc2lvbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfbXlfYWRkcikgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiByZWNlaXZlZCBteSBvd24gYnJvYWRjYXN0IChzZW5kZXI6ICVwTSIKLQkJCSIpXG4iLAotCQkJZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfYnJvYWRjYXN0KSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJEcm9wIHBhY2tldDogIgotCQkiaWdub3JpbmcgYWxsIHBhY2tldHMgd2l0aCBicm9hZGNhc3Qgc291cmNlIGFkZHIgKHNlbmRlcjogJXBNIgotCQkiKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfbXlfb3JpZykgewotCQlUWVBFX09GX1dPUkQgKndvcmQ7Ci0JCWludCBvZmZzZXQ7Ci0KLQkJb3JpZ19uZWlnaF9ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0KLQkJaWYgKCFvcmlnX25laWdoX25vZGUpCi0JCQlyZXR1cm47Ci0KLQkJLyogbmVpZ2hib3IgaGFzIHRvIGluZGljYXRlIGRpcmVjdCBsaW5rIGFuZCBpdCBoYXMgdG8KLQkJICogY29tZSB2aWEgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlICovCi0JCS8qIGlmIHJlY2VpdmVkIHNlcW5vIGVxdWFscyBsYXN0IHNlbmQgc2Vxbm8gc2F2ZSBuZXcKLQkJICogc2Vxbm8gZm9yIGJpZGlyZWN0aW9uYWwgY2hlY2sgKi8KLQkJaWYgKGhhc19kaXJlY3RsaW5rX2ZsYWcgJiYKLQkJICAgIGNvbXBhcmVfb3JpZyhpZl9pbmNvbWluZy0+bmV0X2Rldi0+ZGV2X2FkZHIsCi0JCQkJIGJhdG1hbl9wYWNrZXQtPm9yaWcpICYmCi0JCSAgICAoYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBpZl9pbmNvbWluZ19zZXFubyArIDIgPT0gMCkpIHsKLQkJCW9mZnNldCA9IGlmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFM7Ci0JCQl3b3JkID0gJihvcmlnX25laWdoX25vZGUtPmJjYXN0X293bltvZmZzZXRdKTsKLQkJCWJpdF9tYXJrKHdvcmQsIDApOwotCQkJb3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dID0KLQkJCQliaXRfcGFja2V0X2NvdW50KHdvcmQpOwotCQl9Ci0KLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgIkRyb3AgcGFja2V0OiAiCi0JCQkib3JpZ2luYXRvciBwYWNrZXQgZnJvbSBteXNlbGYgKHZpYSBuZWlnaGJvcilcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX215X29sZG9yaWcpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHJlYnJvYWRjYXN0IGVjaG9zIChzZW5kZXI6ICIKLQkJCSIlcE0pXG4iLCBldGhoZHItPmhfc291cmNlKTsKLQkJcmV0dXJuOwotCX0KLQotCW9yaWdfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0X3ByaXYsIGJhdG1hbl9wYWNrZXQtPm9yaWcpOwotCWlmIChvcmlnX25vZGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaXNfZHVwbGljYXRlID0gY291bnRfcmVhbF9wYWNrZXRzKGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOwotCi0JaWYgKGlzX2R1cGxpY2F0ZSA9PSAtMSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBwYWNrZXQgd2l0aGluIHNlcW5vIHByb3RlY3Rpb24gdGltZSAiCi0JCQkiKHNlbmRlcjogJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dHEgPT0gMCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBvcmlnaW5hdG9yIHBhY2tldCB3aXRoIHRxIGVxdWFsIDBcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogYXZvaWQgdGVtcG9yYXJ5IHJvdXRpbmcgbG9vcHMgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZS0+cm91dGVyKSAmJgotCSAgICAoY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLAotCQkJICBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcikpICYmCi0JICAgICEoY29tcGFyZV9vcmlnKGJhdG1hbl9wYWNrZXQtPm9yaWcsIGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyKSkgJiYKLQkgICAgKGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwKLQkJCSAgb3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKSkpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHJlYnJvYWRjYXN0IHBhY2tldHMgdGhhdCAiCi0JCQkibWF5IG1ha2UgbWUgbG9vcCAoc2VuZGVyOiAlcE0pXG4iLCBldGhoZHItPmhfc291cmNlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGlmIHNlbmRlciBpcyBhIGRpcmVjdCBuZWlnaGJvciB0aGUgc2VuZGVyIG1hYyBlcXVhbHMKLQkgKiBvcmlnaW5hdG9yIG1hYyAqLwotCW9yaWdfbmVpZ2hfbm9kZSA9IChpc19zaW5nbGVfaG9wX25laWdoID8KLQkJCSAgIG9yaWdfbm9kZSA6Ci0JCQkgICBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBldGhoZHItPmhfc291cmNlKSk7Ci0JaWYgKG9yaWdfbmVpZ2hfbm9kZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiBkcm9wIHBhY2tldCBpZiBzZW5kZXIgaXMgbm90IGEgZGlyZWN0IG5laWdoYm9yIGFuZCBpZiB3ZQotCSAqIGRvbid0IHJvdXRlIHRvd2FyZHMgaXQgKi8KLQlpZiAoIWlzX3NpbmdsZV9ob3BfbmVpZ2ggJiYKLQkgICAgKG9yaWdfbmVpZ2hfbm9kZS0+cm91dGVyID09IE5VTEwpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IE9HTSB2aWEgdW5rbm93biBuZWlnaGJvciFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaXNfYmlkaXJlY3Rpb25hbCA9IGlzX2JpZGlyZWN0aW9uYWxfbmVpZ2gob3JpZ19ub2RlLCBvcmlnX25laWdoX25vZGUsCi0JCQkJCQliYXRtYW5fcGFja2V0LCBpZl9pbmNvbWluZyk7Ci0KLQkvKiB1cGRhdGUgcmFua2luZyBpZiBpdCBpcyBub3QgYSBkdXBsaWNhdGUgb3IgaGFzIHRoZSBzYW1lCi0JICogc2Vxbm8gYW5kIHNpbWlsYXIgdHRsIGFzIHRoZSBub24tZHVwbGljYXRlICovCi0JaWYgKGlzX2JpZGlyZWN0aW9uYWwgJiYKLQkgICAgKCFpc19kdXBsaWNhdGUgfHwKLQkgICAgICgob3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8gPT0gYmF0bWFuX3BhY2tldC0+c2Vxbm8pICYmCi0JICAgICAgKG9yaWdfbm9kZS0+bGFzdF90dGwgLSAzIDw9IGJhdG1hbl9wYWNrZXQtPnR0bCkpKSkKLQkJdXBkYXRlX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJICAgIGlmX2luY29taW5nLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuLCBpc19kdXBsaWNhdGUpOwotCi0JbWFya19ib25kaW5nX2FkZHJlc3MoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLCBiYXRtYW5fcGFja2V0KTsKLQl1cGRhdGVfYm9uZGluZ19jYW5kaWRhdGVzKGJhdF9wcml2LCBvcmlnX25vZGUpOwotCi0JLyogaXMgc2luZ2xlIGhvcCAoZGlyZWN0KSBuZWlnaGJvciAqLwotCWlmIChpc19zaW5nbGVfaG9wX25laWdoKSB7Ci0KLQkJLyogbWFyayBkaXJlY3QgbGluayBvbiBpbmNvbWluZyBpbnRlcmZhY2UgKi8KLQkJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkJCTEsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOwotCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJGb3J3YXJkaW5nIHBhY2tldDogIgotCQkJInJlYnJvYWRjYXN0IG5laWdoYm9yIHBhY2tldCB3aXRoIGRpcmVjdCBsaW5rIGZsYWdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbXVsdGlob3Agb3JpZ2luYXRvciAqLwotCWlmICghaXNfYmlkaXJlY3Rpb25hbCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBub3QgcmVjZWl2ZWQgdmlhIGJpZGlyZWN0aW9uYWwgbGlua1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfZHVwbGljYXRlKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGR1cGxpY2F0ZSBwYWNrZXQgcmVjZWl2ZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkZvcndhcmRpbmcgcGFja2V0OiByZWJyb2FkY2FzdCBvcmlnaW5hdG9yIHBhY2tldFxuIik7Ci0Jc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsCi0JCQkJMCwgaG5hX2J1ZmZfbGVuLCBpZl9pbmNvbWluZyk7Ci19Ci0KLWludCByZWN2X2JhdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSkpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3QgaW5kaWNhdGlvbiBidXQgdW5pY2FzdCByZWNpcGllbnQgKi8KLQlpZiAoIWlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCWlmIChza2JfY293KHNrYiwgMCkgPCAwKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBrZWVwIHNrYiBsaW5lYXIgKi8KLQlpZiAoc2tiX2xpbmVhcml6ZShza2IpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJlY2VpdmVfYWdncl9iYXRfcGFja2V0KGV0aGhkciwKLQkJCQlza2ItPmRhdGEsCi0JCQkJc2tiX2hlYWRsZW4oc2tiKSwKLQkJCQliYXRtYW5faWYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJlY3ZfbXlfaWNtcF9wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaWNtcF9sZW4pCi17Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldF9yciAqKXNrYi0+ZGF0YTsKLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBhZGQgZGF0YSB0byBkZXZpY2UgcXVldWUgKi8KLQlpZiAoaWNtcF9wYWNrZXQtPm1zZ190eXBlICE9IEVDSE9fUkVRVUVTVCkgewotCQliYXRfc29ja2V0X3JlY2VpdmVfcGFja2V0KGljbXBfcGFja2V0LCBpY21wX2xlbik7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBhbnN3ZXIgZWNobyByZXF1ZXN0IChwaW5nKSAqLwotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJICAgaWNtcF9wYWNrZXQtPm9yaWcpKTsKLQlyZXQgPSBORVRfUlhfRFJPUDsKLQotCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmCi0JICAgIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgewotCi0JCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCi0JCSAqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KLQkJYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nOwotCQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQkJaWYgKHNrYl9jb3coc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpIDwgMCkKLQkJCXJldHVybiBORVRfUlhfRFJPUDsKLQotCQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7Ci0JCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCQltZW1jcHkoaWNtcF9wYWNrZXQtPmRzdCwgaWNtcF9wYWNrZXQtPm9yaWcsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLAotCQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IEVDSE9fUkVQTFk7Ci0JCWljbXBfcGFja2V0LT50dGwgPSBUVEw7Ci0KLQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQkJcmV0ID0gTkVUX1JYX1NVQ0NFU1M7Ci0KLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlY3ZfaWNtcF90dGxfZXhjZWVkZWQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBpY21wX2xlbikKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50OF90IGRzdGFkZHJbRVRIX0FMRU5dOwotCi0JaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0ICopc2tiLT5kYXRhOwotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCS8qIHNlbmQgVFRMIGV4Y2VlZGVkIGlmIHBhY2tldCBpcyBhbiBlY2hvIHJlcXVlc3QgKHRyYWNlcm91dGUpICovCi0JaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJcHJfZGVidWcoIldhcm5pbmcgLSBjYW4ndCBmb3J3YXJkIGljbXAgcGFja2V0IGZyb20gJXBNIHRvICIKLQkJCSAiJXBNOiB0dGwgZXhjZWVkZWRcbiIsIGljbXBfcGFja2V0LT5vcmlnLAotCQkJIGljbXBfcGFja2V0LT5kc3QpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCSAgICAgaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIGljbXBfcGFja2V0LT5vcmlnKSk7Ci0JcmV0ID0gTkVUX1JYX0RST1A7Ci0KLQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKLQotCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHNrYiwgaWYgbmVlZGVkLCB0byBtb2RpZnkgaXQuICovCi0JCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0ICopIHNrYi0+ZGF0YTsKLQkJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JCW1lbWNweShpY21wX3BhY2tldC0+ZHN0LCBpY21wX3BhY2tldC0+b3JpZywgRVRIX0FMRU4pOwotCQltZW1jcHkoaWNtcF9wYWNrZXQtPm9yaWcsCi0JCSAgICAgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQkJaWNtcF9wYWNrZXQtPm1zZ190eXBlID0gVFRMX0VYQ0VFREVEOwotCQlpY21wX3BhY2tldC0+dHRsID0gVFRMOwotCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JCXJldCA9IE5FVF9SWF9TVUNDRVNTOwotCi0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1pbnQgcmVjdl9pY21wX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCWludCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50OF90IGRzdGFkZHJbRVRIX0FMRU5dOwotCi0JLyoqCi0JICogd2UgdHJ1bmNhdGUgYWxsIGluY29taW5nIGljbXAgcGFja2V0cyBpZiB0aGV5IGRvbid0IG1hdGNoIG91ciBzaXplCi0JICovCi0JaWYgKHNrYi0+bGVuID49IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpKQotCQloZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBub3QgZm9yIG1lICovCi0JaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7Ci0KLQkvKiBhZGQgcmVjb3JkIHJvdXRlIGluZm9ybWF0aW9uIGlmIG5vdCBmdWxsICovCi0JaWYgKChoZHJfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkgJiYKLQkgICAgKGljbXBfcGFja2V0LT5ycl9jdXIgPCBCQVRfUlJfTEVOKSkgewotCQltZW1jcHkoJihpY21wX3BhY2tldC0+cnJbaWNtcF9wYWNrZXQtPnJyX2N1cl0pLAotCQkJZXRoaGRyLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQkJaWNtcF9wYWNrZXQtPnJyX2N1cisrOwotCX0KLQotCS8qIHBhY2tldCBmb3IgbWUgKi8KLQlpZiAoaXNfbXlfbWFjKGljbXBfcGFja2V0LT5kc3QpKQotCQlyZXR1cm4gcmVjdl9teV9pY21wX3BhY2tldChiYXRfcHJpdiwgc2tiLCBoZHJfc2l6ZSk7Ci0KLQkvKiBUVEwgZXhjZWVkZWQgKi8KLQlpZiAoaWNtcF9wYWNrZXQtPnR0bCA8IDIpCi0JCXJldHVybiByZWN2X2ljbXBfdHRsX2V4Y2VlZGVkKGJhdF9wcml2LCBza2IsIGhkcl9zaXplKTsKLQotCXJldCA9IE5FVF9SWF9EUk9QOwotCi0JLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCSAgICAgaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIGljbXBfcGFja2V0LT5kc3QpKTsKLQotCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmCi0JICAgIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgewotCi0JCS8qIGRvbid0IGxvY2sgd2hpbGUgc2VuZGluZyB0aGUgcGFja2V0cyAuLi4gd2UgdGhlcmVmb3JlCi0JCSAqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KLQkJYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nOwotCQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQkJaWYgKHNrYl9jb3coc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpIDwgMCkKLQkJCXJldHVybiBORVRfUlhfRFJPUDsKLQotCQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7Ci0JCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCQkvKiBkZWNyZW1lbnQgdHRsICovCi0JCWljbXBfcGFja2V0LT50dGwtLTsKLQotCQkvKiByb3V0ZSBpdCAqLwotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKLQotCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGZpbmQgYSBzdWl0YWJsZSByb3V0ZXIgZm9yIHRoaXMgb3JpZ2luYXRvciwgYW5kIHVzZQotICogYm9uZGluZyBpZiBwb3NzaWJsZS4gKi8KLXN0cnVjdCBuZWlnaF9ub2RlICpmaW5kX3JvdXRlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKQotewotCXN0cnVjdCBvcmlnX25vZGUgKnByaW1hcnlfb3JpZ19ub2RlOwotCXN0cnVjdCBvcmlnX25vZGUgKnJvdXRlcl9vcmlnOwotCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXIsICpmaXJzdF9jYW5kaWRhdGUsICpiZXN0X3JvdXRlcjsKLQlzdGF0aWMgdWludDhfdCB6ZXJvX21hY1tFVEhfQUxFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07Ci0JaW50IGJvbmRpbmdfZW5hYmxlZDsKLQotCWlmICghb3JpZ19ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCi0JCXJldHVybiBOVUxMOwotCi0JLyogd2l0aG91dCBib25kaW5nLCB0aGUgZmlyc3Qgbm9kZSBzaG91bGQKLQkgKiBhbHdheXMgY2hvb3NlIHRoZSBkZWZhdWx0IHJvdXRlci4gKi8KLQotCWJvbmRpbmdfZW5hYmxlZCA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKTsKLQotCWlmICgoIXJlY3ZfaWYpICYmICghYm9uZGluZ19lbmFibGVkKSkKLQkJcmV0dXJuIG9yaWdfbm9kZS0+cm91dGVyOwotCi0Jcm91dGVyX29yaWcgPSBvcmlnX25vZGUtPnJvdXRlci0+b3JpZ19ub2RlOwotCi0JLyogaWYgd2UgaGF2ZSBzb21ldGhpbmcgaW4gdGhlIHByaW1hcnlfYWRkciwgd2UgY2FuIHNlYXJjaAotCSAqIGZvciBhIHBvdGVudGlhbCBib25kaW5nIGNhbmRpZGF0ZS4gKi8KLQlpZiAobWVtY21wKHJvdXRlcl9vcmlnLT5wcmltYXJ5X2FkZHIsIHplcm9fbWFjLCBFVEhfQUxFTikgPT0gMCkKLQkJcmV0dXJuIG9yaWdfbm9kZS0+cm91dGVyOwotCi0JLyogZmluZCB0aGUgb3JpZ19ub2RlIHdoaWNoIGhhcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UuIG1pZ2h0Ci0JICogZXZlbiBiZSB0aGUgc2FtZSBhcyBvdXIgcm91dGVyX29yaWcgaW4gbWFueSBjYXNlcyAqLwotCi0JaWYgKG1lbWNtcChyb3V0ZXJfb3JpZy0+cHJpbWFyeV9hZGRyLAotCQkJCXJvdXRlcl9vcmlnLT5vcmlnLCBFVEhfQUxFTikgPT0gMCkgewotCQlwcmltYXJ5X29yaWdfbm9kZSA9IHJvdXRlcl9vcmlnOwotCX0gZWxzZSB7Ci0JCXByaW1hcnlfb3JpZ19ub2RlID0gaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsCi0JCQkJCQlyb3V0ZXJfb3JpZy0+cHJpbWFyeV9hZGRyKTsKLQotCQlpZiAoIXByaW1hcnlfb3JpZ19ub2RlKQotCQkJcmV0dXJuIG9yaWdfbm9kZS0+cm91dGVyOwotCX0KLQotCS8qIHdpdGggbGVzcyB0aGFuIDIgY2FuZGlkYXRlcywgd2UgY2FuJ3QgZG8gYW55Ci0JICogYm9uZGluZyBhbmQgcHJlZmVyIHRoZSBvcmlnaW5hbCByb3V0ZXIuICovCi0KLQlpZiAocHJpbWFyeV9vcmlnX25vZGUtPmJvbmQuY2FuZGlkYXRlcyA8IDIpCi0JCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQotCi0JLyogYWxsIG5vZGVzIGJldHdlZW4gc2hvdWxkIGNob29zZSBhIGNhbmRpZGF0ZSB3aGljaAotCSAqIGlzIGlzIG5vdCBvbiB0aGUgaW50ZXJmYWNlIHdoZXJlIHRoZSBwYWNrZXQgY2FtZQotCSAqIGluLiAqLwotCWZpcnN0X2NhbmRpZGF0ZSA9IHByaW1hcnlfb3JpZ19ub2RlLT5ib25kLnNlbGVjdGVkOwotCXJvdXRlciA9IGZpcnN0X2NhbmRpZGF0ZTsKLQotCWlmIChib25kaW5nX2VuYWJsZWQpIHsKLQkJLyogaW4gdGhlIGJvbmRpbmcgY2FzZSwgc2VuZCB0aGUgcGFja2V0cyBpbiBhIHJvdW5kCi0JCSAqIHJvYmluIGZhc2hpb24gb3ZlciB0aGUgcmVtYWluaW5nIGludGVyZmFjZXMuICovCi0JCWRvIHsKLQkJCS8qIHJlY3ZfaWYgPT0gTlVMTCBvbiB0aGUgZmlyc3Qgbm9kZS4gKi8KLQkJCWlmIChyb3V0ZXItPmlmX2luY29taW5nICE9IHJlY3ZfaWYpCi0JCQkJYnJlYWs7Ci0KLQkJCXJvdXRlciA9IHJvdXRlci0+bmV4dF9ib25kX2NhbmRpZGF0ZTsKLQkJfSB3aGlsZSAocm91dGVyICE9IGZpcnN0X2NhbmRpZGF0ZSk7Ci0KLQkJcHJpbWFyeV9vcmlnX25vZGUtPmJvbmQuc2VsZWN0ZWQgPSByb3V0ZXItPm5leHRfYm9uZF9jYW5kaWRhdGU7Ci0KLQl9IGVsc2UgewotCQkvKiBpZiBib25kaW5nIGlzIGRpc2FibGVkLCB1c2UgdGhlIGJlc3Qgb2YgdGhlCi0JCSAqIHJlbWFpbmluZyBjYW5kaWRhdGVzIHdoaWNoIGFyZSBub3QgdXNpbmcKLQkJICogdGhpcyBpbnRlcmZhY2UuICovCi0JCWJlc3Rfcm91dGVyID0gZmlyc3RfY2FuZGlkYXRlOwotCi0JCWRvIHsKLQkJCS8qIHJlY3ZfaWYgPT0gTlVMTCBvbiB0aGUgZmlyc3Qgbm9kZS4gKi8KLQkJCWlmICgocm91dGVyLT5pZl9pbmNvbWluZyAhPSByZWN2X2lmKSAmJgotCQkJCShyb3V0ZXItPnRxX2F2ZyA+IGJlc3Rfcm91dGVyLT50cV9hdmcpKQotCQkJCQliZXN0X3JvdXRlciA9IHJvdXRlcjsKLQotCQkJcm91dGVyID0gcm91dGVyLT5uZXh0X2JvbmRfY2FuZGlkYXRlOwotCQl9IHdoaWxlIChyb3V0ZXIgIT0gZmlyc3RfY2FuZGlkYXRlKTsKLQotCQlyb3V0ZXIgPSBiZXN0X3JvdXRlcjsKLQl9Ci0KLQlyZXR1cm4gcm91dGVyOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfc2l6ZSkKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0KLQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KLQlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBoZHJfc2l6ZSkpKQotCQlyZXR1cm4gLTE7Ci0KLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBwYWNrZXQgd2l0aCB1bmljYXN0IGluZGljYXRpb24gYnV0IGJyb2FkY2FzdCByZWNpcGllbnQgKi8KLQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KLQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCi0JCXJldHVybiAtMTsKLQotCS8qIG5vdCBmb3IgbWUgKi8KLQlpZiAoIWlzX215X21hYyhldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJvdXRlX3VuaWNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZiwgaW50IGhkcl9zaXplKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCi0JLyogcGFja2V0IGZvciBtZSAqLwotCWlmIChpc19teV9tYWModW5pY2FzdF9wYWNrZXQtPmRlc3QpKSB7Ci0JCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIGhkcl9zaXplKTsKLQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCX0KLQotCS8qIFRUTCBleGNlZWRlZCAqLwotCWlmICh1bmljYXN0X3BhY2tldC0+dHRsIDwgMikgewotCQlwcl9kZWJ1ZygiV2FybmluZyAtIGNhbid0IGZvcndhcmQgdW5pY2FzdCBwYWNrZXQgZnJvbSAlcE0gdG8gIgotCQkJICIlcE06IHR0bCBleGNlZWRlZFxuIiwgZXRoaGRyLT5oX3NvdXJjZSwKLQkJCSB1bmljYXN0X3BhY2tldC0+ZGVzdCk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKikKLQkJICAgICBoYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgdW5pY2FzdF9wYWNrZXQtPmRlc3QpKTsKLQotCXJvdXRlciA9IGZpbmRfcm91dGVyKGJhdF9wcml2LCBvcmlnX25vZGUsIHJlY3ZfaWYpOwotCi0JaWYgKCFyb3V0ZXIpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCSAqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KLQotCWJhdG1hbl9pZiA9IHJvdXRlci0+aWZfaW5jb21pbmc7Ci0JbWVtY3B5KGRzdGFkZHIsIHJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCXVuaWNhc3RfcGFja2V0ID0gKHN0cnVjdCB1bmljYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBkZWNyZW1lbnQgdHRsICovCi0JdW5pY2FzdF9wYWNrZXQtPnR0bC0tOwotCi0JLyogcm91dGUgaXQgKi8KLQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCi0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotfQotCi1pbnQgcmVjdl91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKQotewotCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCk7Ci0KLQlpZiAoY2hlY2tfdW5pY2FzdF9wYWNrZXQoc2tiLCBoZHJfc2l6ZSkgPCAwKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBwYWNrZXQgZm9yIG1lICovCi0JaWYgKGlzX215X21hYyh1bmljYXN0X3BhY2tldC0+ZGVzdCkpIHsKLQkJaW50ZXJmYWNlX3J4KHJlY3ZfaWYtPnNvZnRfaWZhY2UsIHNrYiwgaGRyX3NpemUpOwotCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Ci0JfQotCi0JcmV0dXJuIHJvdXRlX3VuaWNhc3RfcGFja2V0KHNrYiwgcmVjdl9pZiwgaGRyX3NpemUpOwotfQotCi1pbnQgcmVjdl91Y2FzdF9mcmFnX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0bXBfZnJhZ19lbnRyeTsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoY2hlY2tfdW5pY2FzdF9wYWNrZXQoc2tiLCBoZHJfc2l6ZSkgPCAwKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCS8qIHBhY2tldCBmb3IgbWUgKi8KLQlpZiAoaXNfbXlfbWFjKHVuaWNhc3RfcGFja2V0LT5kZXN0KSkgewotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCQloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgdW5pY2FzdF9wYWNrZXQtPm9yaWcpKTsKLQotCQlpZiAoIW9yaWdfbm9kZSkgewotCQkJcHJfZGVidWcoImNvdWxkbid0IGZpbmQgb3JpZyBub2RlIGZvciBmcmFnbWVudGF0aW9uXG4iKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCXJldHVybiBORVRfUlhfRFJPUDsKLQkJfQotCi0JCW9yaWdfbm9kZS0+bGFzdF9mcmFnX3BhY2tldCA9IGppZmZpZXM7Ci0KLQkJaWYgKGxpc3RfZW1wdHkoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KSAmJgotCQkJY3JlYXRlX2ZyYWdfYnVmZmVyKCZvcmlnX25vZGUtPmZyYWdfbGlzdCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCXJldHVybiBORVRfUlhfRFJPUDsKLQkJfQotCi0JCXRtcF9mcmFnX2VudHJ5ID0KLQkJCXNlYXJjaF9mcmFnX3BhY2tldCgmb3JpZ19ub2RlLT5mcmFnX2xpc3QsCi0JCQkJCSAgIHVuaWNhc3RfcGFja2V0KTsKLQotCQlpZiAoIXRtcF9mcmFnX2VudHJ5KSB7Ci0JCQljcmVhdGVfZnJhZ19lbnRyeSgmb3JpZ19ub2RlLT5mcmFnX2xpc3QsIHNrYik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Ci0JCX0KLQotCQlza2IgPSBtZXJnZV9mcmFnX3BhY2tldCgmb3JpZ19ub2RlLT5mcmFnX2xpc3QsCi0JCQkJCXRtcF9mcmFnX2VudHJ5LCBza2IpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaW50ZXJmYWNlX3J4KHJlY3ZfaWYtPnNvZnRfaWZhY2UsIHNrYiwgaGRyX3NpemUpOwotCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Ci0JfQotCi0JcmV0dXJuIHJvdXRlX3VuaWNhc3RfcGFja2V0KHNrYiwgcmVjdl9pZiwgaGRyX3NpemUpOwotfQotCi0KLWludCByZWN2X2JjYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJjYXN0X3BhY2tldCAqYmNhc3RfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGJjYXN0X3BhY2tldCk7Ci0JaW50MzJfdCBzZXFfZGlmZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IGluZGljYXRpb24gYnV0IHVuaWNhc3QgcmVjaXBpZW50ICovCi0JaWYgKCFpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogaWdub3JlIGJyb2FkY2FzdHMgc2VudCBieSBteXNlbGYgKi8KLQlpZiAoaXNfbXlfbWFjKGV0aGhkci0+aF9zb3VyY2UpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJjYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCS8qIGlnbm9yZSBicm9hZGNhc3RzIG9yaWdpbmF0ZWQgYnkgbXlzZWxmICovCi0JaWYgKGlzX215X21hYyhiY2FzdF9wYWNrZXQtPm9yaWcpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlpZiAoYmNhc3RfcGFja2V0LT50dGwgPCAyKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCSAgICAgaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIGJjYXN0X3BhY2tldC0+b3JpZykpOwotCi0JaWYgKG9yaWdfbm9kZSA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JLyogY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IGlzIGEgZHVwbGljYXRlICovCi0JaWYgKGdldF9iaXRfc3RhdHVzKG9yaWdfbm9kZS0+YmNhc3RfYml0cywKLQkJCSAgIG9yaWdfbm9kZS0+bGFzdF9iY2FzdF9zZXFubywKLQkJCSAgIG50b2hsKGJjYXN0X3BhY2tldC0+c2Vxbm8pKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCXNlcV9kaWZmID0gbnRvaGwoYmNhc3RfcGFja2V0LT5zZXFubykgLSBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm87Ci0KLQkvKiBjaGVjayB3aGV0aGVyIHRoZSBwYWNrZXQgaXMgb2xkIGFuZCB0aGUgaG9zdCBqdXN0IHJlc3RhcnRlZC4gKi8KLQlpZiAod2luZG93X3Byb3RlY3RlZChiYXRfcHJpdiwgc2VxX2RpZmYsCi0JCQkgICAgICZvcmlnX25vZGUtPmJjYXN0X3NlcW5vX3Jlc2V0KSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCS8qIG1hcmsgYnJvYWRjYXN0IGluIGZsb29kIGhpc3RvcnksIHVwZGF0ZSB3aW5kb3cgcG9zaXRpb24KLQkgKiBpZiByZXF1aXJlZC4gKi8KLQlpZiAoYml0X2dldF9wYWNrZXQoYmF0X3ByaXYsIG9yaWdfbm9kZS0+YmNhc3RfYml0cywgc2VxX2RpZmYsIDEpKQotCQlvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8gPSBudG9obChiY2FzdF9wYWNrZXQtPnNlcW5vKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCS8qIHJlYnJvYWRjYXN0IHBhY2tldCAqLwotCWFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgc2tiKTsKLQotCS8qIGJyb2FkY2FzdCBmb3IgbWUgKi8KLQlpbnRlcmZhY2VfcngocmVjdl9pZi0+c29mdF9pZmFjZSwgc2tiLCBoZHJfc2l6ZSk7Ci0KLQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7Ci19Ci0KLWludCByZWN2X3Zpc19wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHJlY3ZfaWYtPnNvZnRfaWZhY2UpOwotCWludCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCk7Ci0KLQkvKiBrZWVwIHNrYiBsaW5lYXIgKi8KLQlpZiAoc2tiX2xpbmVhcml6ZShza2IpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JdmlzX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBub3QgZm9yIG1lICovCi0JaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBpZ25vcmUgb3duIHBhY2tldHMgKi8KLQlpZiAoaXNfbXlfbWFjKHZpc19wYWNrZXQtPnZpc19vcmlnKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKGlzX215X21hYyh2aXNfcGFja2V0LT5zZW5kZXJfb3JpZykpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCXN3aXRjaCAodmlzX3BhY2tldC0+dmlzX3R5cGUpIHsKLQljYXNlIFZJU19UWVBFX1NFUlZFUl9TWU5DOgotCQlyZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChiYXRfcHJpdiwgdmlzX3BhY2tldCwKLQkJCQkJICAgc2tiX2hlYWRsZW4oc2tiKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOgotCQlyZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KGJhdF9wcml2LCB2aXNfcGFja2V0LAotCQkJCQkgICAgIHNrYl9oZWFkbGVuKHNrYikpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6CS8qIGlnbm9yZSB1bmtub3duIHBhY2tldCAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiBXZSB0YWtlIGEgY29weSBvZiB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LCBzbyB3ZSBzaG91bGQKLQkgICBhbHdheXMgZnJlZSB0aGUgc2tidWYuICovCi0JcmV0dXJuIE5FVF9SWF9EUk9QOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjY3NGM4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9ST1VUSU5HX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9ST1VUSU5HX0hfCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi12b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKLXZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwKLQkJCQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZyk7Ci12b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkgICBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsCi0JCSAgIGludCBobmFfYnVmZl9sZW4pOwotaW50IHJlY3ZfaWNtcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1pbnQgcmVjdl91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X3VjYXN0X2ZyYWdfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotaW50IHJlY3ZfYmNhc3RfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotaW50IHJlY3ZfdmlzX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X2JhdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1zdHJ1Y3QgbmVpZ2hfbm9kZSAqZmluZF9yb3V0ZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLXZvaWQgdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUk9VVElOR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRmNzZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKLQotCi1zdGF0aWMgdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi0vKiBhcHBseSBob3AgcGVuYWx0eSBmb3IgYSBub3JtYWwgbGluayAqLwotc3RhdGljIHVpbnQ4X3QgaG9wX3BlbmFsdHkoY29uc3QgdWludDhfdCB0cSkKLXsKLQlyZXR1cm4gKHRxICogKFRRX01BWF9WQUxVRSAtIFRRX0hPUF9QRU5BTFRZKSkgLyAoVFFfTUFYX1ZBTFVFKTsKLX0KLQotLyogd2hlbiBkbyB3ZSBzY2hlZHVsZSBvdXIgb3duIHBhY2tldCB0byBiZSBzZW50ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvd25fc2VuZF90aW1lKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JcmV0dXJuIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKAotCQkgICBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpIC0KLQkJICAgSklUVEVSICsgKHJhbmRvbTMyKCkgJSAyKkpJVFRFUikpOwotfQotCi0vKiB3aGVuIGRvIHdlIHNjaGVkdWxlIGEgZm9yd2FyZGVkIHBhY2tldCB0byBiZSBzZW50ICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBmb3J3YXJkX3NlbmRfdGltZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhyYW5kb20zMigpICUgKEpJVFRFUi8yKSk7Ci19Ci0KLS8qIHNlbmQgb3V0IGFuIGFscmVhZHkgcHJlcGFyZWQgcGFja2V0IHRvIHRoZSBnaXZlbiBhZGRyZXNzIHZpYSB0aGUKLSAqIHNwZWNpZmllZCBiYXRtYW4gaW50ZXJmYWNlICovCi1pbnQgc2VuZF9za2JfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLAotCQkJCXVpbnQ4X3QgKmRzdF9hZGRyKQotewotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCWdvdG8gc2VuZF9za2JfZXJyOwotCi0JaWYgKHVubGlrZWx5KCFiYXRtYW5faWYtPm5ldF9kZXYpKQotCQlnb3RvIHNlbmRfc2tiX2VycjsKLQotCWlmICghKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKSB7Ci0JCXByX3dhcm5pbmcoIkludGVyZmFjZSAlcyBpcyBub3QgdXAgLSBjYW4ndCBzZW5kIHBhY2tldCB2aWEgIgotCQkJICAgInRoYXQgaW50ZXJmYWNlIVxuIiwgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQkJZ290byBzZW5kX3NrYl9lcnI7Ci0JfQotCi0JLyogcHVzaCB0byB0aGUgZXRoZXJuZXQgaGVhZGVyLiAqLwotCWlmIChteV9za2JfaGVhZF9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCWdvdG8gc2VuZF9za2JfZXJyOwotCi0Jc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYl9tYWNfaGVhZGVyKHNrYik7Ci0JbWVtY3B5KGV0aGhkci0+aF9zb3VyY2UsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoZXRoaGRyLT5oX2Rlc3QsIGRzdF9hZGRyLCBFVEhfQUxFTik7Ci0JZXRoaGRyLT5oX3Byb3RvID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pOwotCi0Jc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIEVUSF9ITEVOKTsKLQlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOwotCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JBVE1BTik7Ci0KLQlza2ItPmRldiA9IGJhdG1hbl9pZi0+bmV0X2RldjsKLQotCS8qIGRldl9xdWV1ZV94bWl0KCkgcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3VsdCBvbiBlcnJvci4JIEhvd2V2ZXIgb24KLQkgKiBjb25nZXN0aW9uIGFuZCB0cmFmZmljIHNoYXBpbmcsIGl0IGRyb3BzIGFuZCByZXR1cm5zIE5FVF9YTUlUX0RST1AKLQkgKiAod2hpY2ggaXMgPiAwKS4gVGhpcyB3aWxsIG5vdCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLiAqLwotCi0JcmV0dXJuIGRldl9xdWV1ZV94bWl0KHNrYik7Ci1zZW5kX3NrYl9lcnI6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIE5FVF9YTUlUX0RST1A7Ci19Ci0KLS8qIFNlbmQgYSBwYWNrZXQgdG8gYSBnaXZlbiBpbnRlcmZhY2UgKi8KLXN0YXRpYyB2b2lkIHNlbmRfcGFja2V0X3RvX2lmKHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCi0JCQkgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JY2hhciAqZndkX3N0cjsKLQl1aW50OF90IHBhY2tldF9udW07Ci0JaW50MTZfdCBidWZmX3BvczsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJcmV0dXJuOwotCi0JcGFja2V0X251bSA9IDA7Ci0JYnVmZl9wb3MgPSAwOwotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilmb3J3X3BhY2tldC0+c2tiLT5kYXRhOwotCi0JLyogYWRqdXN0IGFsbCBmbGFncyBhbmQgbG9nIHBhY2tldHMgKi8KLQl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsCi0JCQkJIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAotCQkJCSBiYXRtYW5fcGFja2V0LT5udW1faG5hKSkgewotCi0JCS8qIHdlIG1pZ2h0IGhhdmUgYWdncmVnYXRlZCBkaXJlY3QgbGluayBwYWNrZXRzIHdpdGggYW4KLQkJICogb3JkaW5hcnkgYmFzZSBwYWNrZXQgKi8KLQkJaWYgKChmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgJiAoMSA8PCBwYWNrZXRfbnVtKSkgJiYKLQkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gYmF0bWFuX2lmKSkKLQkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IERJUkVDVExJTks7Ci0JCWVsc2UKLQkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5ESVJFQ1RMSU5LOwotCi0JCWZ3ZF9zdHIgPSAocGFja2V0X251bSA+IDAgPyAiRm9yd2FyZGluZyIgOiAoZm9yd19wYWNrZXQtPm93biA/Ci0JCQkJCQkJICAgICJTZW5kaW5nIG93biIgOgotCQkJCQkJCSAgICAiRm9yd2FyZGluZyIpKTsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSIlcyAlc3BhY2tldCAob3JpZ2luYXRvciAlcE0sIHNlcW5vICVkLCBUUSAlZCwgVFRMICVkLCIKLQkJCSIgSURGICVzKSBvbiBpbnRlcmZhY2UgJXMgWyVwTV1cbiIsCi0JCQlmd2Rfc3RyLCAocGFja2V0X251bSA+IDAgPyAiYWdncmVnYXRlZCAiIDogIiIpLAotCQkJYmF0bWFuX3BhY2tldC0+b3JpZywgbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAotCQkJYmF0bWFuX3BhY2tldC0+dHEsIGJhdG1hbl9wYWNrZXQtPnR0bCwKLQkJCShiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPwotCQkJICJvbiIgOiAib2ZmIiksCi0JCQliYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOwotCi0JCWJ1ZmZfcG9zICs9IHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKwotCQkJKGJhdG1hbl9wYWNrZXQtPm51bV9obmEgKiBFVEhfQUxFTik7Ci0JCXBhY2tldF9udW0rKzsKLQkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQotCQkJKGZvcndfcGFja2V0LT5za2ItPmRhdGEgKyBidWZmX3Bvcyk7Ci0JfQotCi0JLyogY3JlYXRlIGNsb25lIGJlY2F1c2UgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlICovCi0Jc2tiID0gc2tiX2Nsb25lKGZvcndfcGFja2V0LT5za2IsIEdGUF9BVE9NSUMpOwotCWlmIChza2IpCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgYnJvYWRjYXN0X2FkZHIpOwotfQotCi0vKiBzZW5kIGEgYmF0bWFuIHBhY2tldCAqLwotc3RhdGljIHZvaWQgc2VuZF9wYWNrZXQoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKLXsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9Ci0JCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShmb3J3X3BhY2tldC0+c2tiLT5kYXRhKTsKLQl1bnNpZ25lZCBjaGFyIGRpcmVjdGxpbmsgPSAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDApOwotCi0JaWYgKCFmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcpIHsKLQkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGZvcndhcmQgcGFja2V0OiBpbmNvbWluZyBpZmFjZSBub3QgIgotCQkgICAgICAgInNwZWNpZmllZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzb2Z0X2lmYWNlID0gZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlOwotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlpZiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlyZXR1cm47Ci0KLQkvKiBtdWx0aWhvbWVkIHBlZXIgYXNzdW1lZCAqLwotCS8qIG5vbi1wcmltYXJ5IE9HTXMgYXJlIG9ubHkgYnJvYWRjYXN0ZWQgb24gdGhlaXIgaW50ZXJmYWNlICovCi0JaWYgKChkaXJlY3RsaW5rICYmIChiYXRtYW5fcGFja2V0LT50dGwgPT0gMSkpIHx8Ci0JICAgIChmb3J3X3BhY2tldC0+b3duICYmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA+IDApKSkgewotCi0JCS8qIEZJWE1FOiB3aGF0IGFib3V0IGFnZ3JlZ2F0ZWQgcGFja2V0cyA/ICovCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiJXMgcGFja2V0IChvcmlnaW5hdG9yICVwTSwgc2Vxbm8gJWQsIFRUTCAlZCkgIgotCQkJIm9uIGludGVyZmFjZSAlcyBbJXBNXVxuIiwKLQkJCShmb3J3X3BhY2tldC0+b3duID8gIlNlbmRpbmcgb3duIiA6ICJGb3J3YXJkaW5nIiksCi0JCQliYXRtYW5fcGFja2V0LT5vcmlnLCBudG9obChiYXRtYW5fcGFja2V0LT5zZXFubyksCi0JCQliYXRtYW5fcGFja2V0LT50dGwsCi0JCQlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCi0JCQlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyKTsKLQotCQkvKiBza2IgaXMgb25seSB1c2VkIG9uY2UgYW5kIHRoYW4gZm9yd19wYWNrZXQgaXMgZnJlZSdkICovCi0JCXNlbmRfc2tiX3BhY2tldChmb3J3X3BhY2tldC0+c2tiLCBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcsCi0JCQkJYnJvYWRjYXN0X2FkZHIpOwotCQlmb3J3X3BhY2tldC0+c2tiID0gTlVMTDsKLQotCQlyZXR1cm47Ci0JfQotCi0JLyogYnJvYWRjYXN0IG9uIGV2ZXJ5IGludGVyZmFjZSAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCXNlbmRfcGFja2V0X3RvX2lmKGZvcndfcGFja2V0LCBiYXRtYW5faWYpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQgcmVidWlsZF9iYXRtYW5fcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0JaW50IG5ld19sZW47Ci0JdW5zaWduZWQgY2hhciAqbmV3X2J1ZmY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0KLQluZXdfbGVuID0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArCi0JCQkoYmF0X3ByaXYtPm51bV9sb2NhbF9obmEgKiBFVEhfQUxFTik7Ci0JbmV3X2J1ZmYgPSBrbWFsbG9jKG5ld19sZW4sIEdGUF9BVE9NSUMpOwotCi0JLyoga2VlcCBvbGQgYnVmZmVyIGlmIGttYWxsb2Mgc2hvdWxkIGZhaWwgKi8KLQlpZiAobmV3X2J1ZmYpIHsKLQkJbWVtY3B5KG5ld19idWZmLCBiYXRtYW5faWYtPnBhY2tldF9idWZmLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSk7Ci0JCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiluZXdfYnVmZjsKLQotCQliYXRtYW5fcGFja2V0LT5udW1faG5hID0gaG5hX2xvY2FsX2ZpbGxfYnVmZmVyKGJhdF9wcml2LAotCQkJCW5ld19idWZmICsgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSwKLQkJCQluZXdfbGVuIC0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSk7Ci0KLQkJa2ZyZWUoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7Ci0JCWJhdG1hbl9pZi0+cGFja2V0X2J1ZmYgPSBuZXdfYnVmZjsKLQkJYmF0bWFuX2lmLT5wYWNrZXRfbGVuID0gbmV3X2xlbjsKLQl9Ci19Ci0KLXZvaWQgc2NoZWR1bGVfb3duX3BhY2tldChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0JaW50IHZpc19zZXJ2ZXI7Ci0KLQlpZiAoKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UpIHx8Ci0JICAgIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9UT19CRV9SRU1PVkVEKSkKLQkJcmV0dXJuOwotCi0JdmlzX3NlcnZlciA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCi0JLyoqCi0JICogdGhlIGludGVyZmFjZSBnZXRzIGFjdGl2YXRlZCBoZXJlIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuCi0JICogdGhlIG1vbWVudCBvZiBhY3RpdmF0aW5nIHRoZSBpbnRlcmZhY2UgaW4KLQkgKiBoYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKCkgd2hlcmUgdGhlIG9yaWdpbmF0b3IgbWFjIGlzIHNldCBhbmQKLQkgKiBvdXRkYXRlZCBwYWNrZXRzIChlc3BlY2lhbGx5IHVuaW5pdGlhbGl6ZWQgbWFjIGFkZHJlc3NlcykgaW4gdGhlCi0JICogcGFja2V0IHF1ZXVlCi0JICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX1RPX0JFX0FDVElWQVRFRCkKLQkJYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9BQ1RJVkU7Ci0KLQkvKiBpZiBsb2NhbCBobmEgaGFzIGNoYW5nZWQgYW5kIGludGVyZmFjZSBpcyBhIHByaW1hcnkgaW50ZXJmYWNlICovCi0JaWYgKChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkKSkgJiYKLQkgICAgKGJhdG1hbl9pZiA9PSBiYXRfcHJpdi0+cHJpbWFyeV9pZikpCi0JCXJlYnVpbGRfYmF0bWFuX3BhY2tldChiYXRfcHJpdiwgYmF0bWFuX2lmKTsKLQotCS8qKgotCSAqIE5PVEU6IHBhY2tldF9idWZmIG1pZ2h0IGp1c3QgaGF2ZSBiZWVuIHJlLWFsbG9jYXRlZCBpbgotCSAqIHJlYnVpbGRfYmF0bWFuX3BhY2tldCgpCi0JICovCi0JYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWJhdG1hbl9pZi0+cGFja2V0X2J1ZmY7Ci0KLQkvKiBjaGFuZ2Ugc2VxdWVuY2UgbnVtYmVyIHRvIG5ldHdvcmsgb3JkZXIgKi8KLQliYXRtYW5fcGFja2V0LT5zZXFubyA9Ci0JCWh0b25sKCh1aW50MzJfdClhdG9taWNfcmVhZCgmYmF0bWFuX2lmLT5zZXFubykpOwotCi0JaWYgKHZpc19zZXJ2ZXIgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpCi0JCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IFZJU19TRVJWRVI7Ci0JZWxzZQotCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+VklTX1NFUlZFUjsKLQotCWF0b21pY19pbmMoJmJhdG1hbl9pZi0+c2Vxbm8pOwotCi0Jc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhiYXRtYW5faWYpOwotCXNlbmRfdGltZSA9IG93bl9zZW5kX3RpbWUoYmF0X3ByaXYpOwotCWFkZF9iYXRfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsCi0JCQkgICAgICAgYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiwKLQkJCSAgICAgICBiYXRtYW5faWYtPnBhY2tldF9sZW4sCi0JCQkgICAgICAgYmF0bWFuX2lmLCAxLCBzZW5kX3RpbWUpOwotfQotCi12b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwotCXVuc2lnbmVkIGNoYXIgaW5fdHEsIGluX3R0bCwgdHFfYXZnID0gMDsKLQl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKLQotCWlmIChiYXRtYW5fcGFja2V0LT50dGwgPD0gMSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAidHRsIGV4Y2VlZGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWluX3RxID0gYmF0bWFuX3BhY2tldC0+dHE7Ci0JaW5fdHRsID0gYmF0bWFuX3BhY2tldC0+dHRsOwotCi0JYmF0bWFuX3BhY2tldC0+dHRsLS07Ci0JbWVtY3B5KGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLCBldGhoZHItPmhfc291cmNlLCBFVEhfQUxFTik7Ci0KLQkvKiByZWJyb2FkY2FzdCB0cSBvZiBvdXIgYmVzdCByYW5raW5nIG5laWdoYm9yIHRvIGVuc3VyZSB0aGUgcmVicm9hZGNhc3QKLQkgKiBvZiBvdXIgYmVzdCB0cSB2YWx1ZSAqLwotCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIpICYmIChvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnICE9IDApKSB7Ci0KLQkJLyogcmVicm9hZGNhc3Qgb2dtIG9mIGJlc3QgcmFua2luZyBuZWlnaGJvciBhcyBpcyAqLwotCQlpZiAoIWNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgZXRoaGRyLT5oX3NvdXJjZSkpIHsKLQkJCWJhdG1hbl9wYWNrZXQtPnRxID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQotCQkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT5sYXN0X3R0bCkKLQkJCQliYXRtYW5fcGFja2V0LT50dGwgPSBvcmlnX25vZGUtPnJvdXRlci0+bGFzdF90dGwKLQkJCQkJCQktIDE7Ci0JCX0KLQotCQl0cV9hdmcgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOwotCX0KLQotCS8qIGFwcGx5IGhvcCBwZW5hbHR5ICovCi0JYmF0bWFuX3BhY2tldC0+dHEgPSBob3BfcGVuYWx0eShiYXRtYW5fcGFja2V0LT50cSk7Ci0KLQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkiRm9yd2FyZGluZyBwYWNrZXQ6IHRxX29yaWc6ICVpLCB0cV9hdmc6ICVpLCAiCi0JCSJ0cV9mb3J3OiAlaSwgdHRsX29yaWc6ICVpLCB0dGxfZm9ydzogJWlcbiIsCi0JCWluX3RxLCB0cV9hdmcsIGJhdG1hbl9wYWNrZXQtPnRxLCBpbl90dGwgLSAxLAotCQliYXRtYW5fcGFja2V0LT50dGwpOwotCi0JYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBodG9ubChiYXRtYW5fcGFja2V0LT5zZXFubyk7Ci0KLQkvKiBzd2l0Y2ggb2YgcHJpbWFyaWVzIGZpcnN0IGhvcCBmbGFnIHdoZW4gZm9yd2FyZGluZyAqLwotCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5QUklNQVJJRVNfRklSU1RfSE9QOwotCWlmIChkaXJlY3RsaW5rKQotCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOwotCWVsc2UKLQkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJj0gfkRJUkVDVExJTks7Ci0KLQlzZW5kX3RpbWUgPSBmb3J3YXJkX3NlbmRfdGltZShiYXRfcHJpdik7Ci0JYWRkX2JhdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwKLQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKWJhdG1hbl9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArIGhuYV9idWZmX2xlbiwKLQkJCSAgICAgICBpZl9pbmNvbWluZywgMCwgc2VuZF90aW1lKTsKLX0KLQotc3RhdGljIHZvaWQgZm9yd19wYWNrZXRfZnJlZShzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQotewotCWlmIChmb3J3X3BhY2tldC0+c2tiKQotCQlrZnJlZV9za2IoZm9yd19wYWNrZXQtPnNrYik7Ci0Ja2ZyZWUoZm9yd19wYWNrZXQpOwotfQotCi1zdGF0aWMgdm9pZCBfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICAgICAgc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUlOSVRfSExJU1RfTk9ERSgmZm9yd19wYWNrZXQtPmxpc3QpOwotCi0JLyogYWRkIG5ldyBwYWNrZXQgdG8gcGFja2V0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaGxpc3RfYWRkX2hlYWQoJmZvcndfcGFja2V0LT5saXN0LCAmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KLQlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yaywKLQkJCSAgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yaywKLQkJCSAgIHNlbmRfdGltZSk7Ci19Ci0KLSNkZWZpbmUgYXRvbWljX2RlY19ub3RfemVybyh2KSAgICAgICAgICBhdG9taWNfYWRkX3VubGVzcygodiksIC0xLCAwKQotLyogYWRkIGEgYnJvYWRjYXN0IHBhY2tldCB0byB0aGUgcXVldWUgYW5kIHNldHVwIHRpbWVycy4gYnJvYWRjYXN0IHBhY2tldHMKLSAqIGFyZSBzZW50IG11bHRpcGxlIHRpbWVzIHRvIGluY3JlYXNlIHByb2JhYmlsaXR5IGZvciBiZWVpbmcgcmVjZWl2ZWQuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIE5FVERFVl9UWF9PSyBvbiBzdWNjZXNzIGFuZCBORVRERVZfVFhfQlVTWSBvbgotICogZXJyb3JzLgotICoKLSAqIFRoZSBza2IgaXMgbm90IGNvbnN1bWVkLCBzbyB0aGUgY2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUKLSAqIHNrYiBpcyBmcmVlZC4gKi8KLWludCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwotCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKLQotCWlmICghYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJiY2FzdCBwYWNrZXQgcXVldWUgZnVsbFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCWdvdG8gb3V0OwotCi0JZm9yd19wYWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKLQotCWlmICghZm9yd19wYWNrZXQpCi0JCWdvdG8gb3V0X2FuZF9pbmM7Ci0KLQlza2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwotCWlmICghc2tiKQotCQlnb3RvIHBhY2tldF9mcmVlOwotCi0JLyogYXMgd2UgaGF2ZSBhIGNvcHkgbm93LCBpdCBpcyBzYWZlIHRvIGRlY3JlYXNlIHRoZSBUVEwgKi8KLQliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJjYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQliY2FzdF9wYWNrZXQtPnR0bC0tOwotCi0Jc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQotCWZvcndfcGFja2V0LT5za2IgPSBza2I7Ci0JZm9yd19wYWNrZXQtPmlmX2luY29taW5nID0gYmF0X3ByaXYtPnByaW1hcnlfaWY7Ci0KLQkvKiBob3cgb2Z0ZW4gZGlkIHdlIHNlbmQgdGhlIGJjYXN0IHBhY2tldCA/ICovCi0JZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzID0gMDsKLQotCV9hZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIGZvcndfcGFja2V0LCAxKTsKLQlyZXR1cm4gTkVUREVWX1RYX09LOwotCi1wYWNrZXRfZnJlZToKLQlrZnJlZShmb3J3X3BhY2tldCk7Ci1vdXRfYW5kX2luYzoKLQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCk7Ci1vdXQ6Ci0JcmV0dXJuIE5FVERFVl9UWF9CVVNZOwotfQotCi1zdGF0aWMgdm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KLQkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UgPSBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPnNvZnRfaWZhY2U7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSkgPT0gTUVTSF9ERUFDVElWQVRJTkcpCi0JCWdvdG8gb3V0OwotCi0JLyogcmVicm9hZGNhc3QgcGFja2V0ICovCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJLyogc2VuZCBhIGNvcHkgb2YgdGhlIHNhdmVkIHNrYiAqLwotCQlza2IxID0gc2tiX2Nsb25lKGZvcndfcGFja2V0LT5za2IsIEdGUF9BVE9NSUMpOwotCQlpZiAoc2tiMSkKLQkJCXNlbmRfc2tiX3BhY2tldChza2IxLCBiYXRtYW5faWYsIGJyb2FkY2FzdF9hZGRyKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMrKzsKLQotCS8qIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBtb3JlIGJjYXN0cyB0byBzZW5kICovCi0JaWYgKGZvcndfcGFja2V0LT5udW1fcGFja2V0cyA8IDMpIHsKLQkJX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgZm9yd19wYWNrZXQsCi0JCQkJCSAgKCg1ICogSFopIC8gMTAwMCkpOwotCQlyZXR1cm47Ci0JfQotCi1vdXQ6Ci0JZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7Ci0JYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwotfQotCi12b2lkIHNlbmRfb3V0c3RhbmRpbmdfYmF0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQgPQotCQljb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgZm9yd19wYWNrZXQsIGRlbGF5ZWRfd29yayk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCi0JYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPnNvZnRfaWZhY2UpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZGVsKCZmb3J3X3BhY2tldC0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSkgPT0gTUVTSF9ERUFDVElWQVRJTkcpCi0JCWdvdG8gb3V0OwotCi0Jc2VuZF9wYWNrZXQoZm9yd19wYWNrZXQpOwotCi0JLyoqCi0JICogd2UgaGF2ZSB0byBoYXZlIGF0IGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhlIHF1ZXVlCi0JICogdG8gZGV0ZXJtaW5lIHRoZSBxdWV1ZXMgd2FrZSB1cCB0aW1lIHVubGVzcyB3ZSBhcmUKLQkgKiBzaHV0dGluZyBkb3duCi0JICovCi0JaWYgKGZvcndfcGFja2V0LT5vd24pCi0JCXNjaGVkdWxlX293bl9wYWNrZXQoZm9yd19wYWNrZXQtPmlmX2luY29taW5nKTsKLQotb3V0OgotCS8qIGRvbid0IGNvdW50IG93biBwYWNrZXQgKi8KLQlpZiAoIWZvcndfcGFja2V0LT5vd24pCi0JCWF0b21pY19pbmMoJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCk7Ci0KLQlmb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKLX0KLQotdm9pZCBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcF9ub2RlLCAqc2FmZV90bXBfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGJhdG1hbl9pZikKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKCk6ICVzXG4iLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQllbHNlCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpXG4iKTsKLQotCS8qIGZyZWUgYmNhc3QgbGlzdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZvcndfcGFja2V0LCB0bXBfbm9kZSwgc2FmZV90bXBfbm9kZSwKLQkJCQkgICZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0LCBsaXN0KSB7Ci0KLQkJLyoqCi0JCSAqIGlmIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKSB3YXMgY2FsbGVkIHdpdGggYW4gYXJnbXVtZW50Ci0JCSAqIHdlIGRlbGV0ZSBvbmx5IHBhY2tldHMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBpbnRlcmZhY2UKLQkJICovCi0JCWlmICgoYmF0bWFuX2lmKSAmJgotCQkgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyAhPSBiYXRtYW5faWYpKQotCQkJY29udGludWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkJLyoqCi0JCSAqIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCi0JCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0Ci0JCSAqLwotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JLyogZnJlZSBiYXRtYW4gcGFja2V0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm9yd19wYWNrZXQsIHRtcF9ub2RlLCBzYWZlX3RtcF9ub2RlLAotCQkJCSAgJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0LCBsaXN0KSB7Ci0KLQkJLyoqCi0JCSAqIGlmIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKSB3YXMgY2FsbGVkIHdpdGggYW4gYXJnbXVtZW50Ci0JCSAqIHdlIGRlbGV0ZSBvbmx5IHBhY2tldHMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBpbnRlcmZhY2UKLQkJICovCi0JCWlmICgoYmF0bWFuX2lmKSAmJgotCQkgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyAhPSBiYXRtYW5faWYpKQotCQkJY29udGludWU7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JCS8qKgotCQkgKiBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoKSB3aWxsIGxvY2sgdGhlIGxpc3QgdG8KLQkJICogZGVsZXRlIHRoZSBpdGVtIGZyb20gdGhlIGxpc3QKLQkJICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yayk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjZWZhOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU0VORF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfU0VORF9IXwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotaW50IHNlbmRfc2tiX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwKLQkJCQl1aW50OF90ICpkc3RfYWRkcik7Ci12b2lkIHNjaGVkdWxlX293bl9wYWNrZXQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKLXZvaWQgc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJICAgICBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkgICAgIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJICAgICB1aW50OF90IGRpcmVjdGxpbmssIGludCBobmFfYnVmZl9sZW4sCi0JCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX291dGdvaW5nKTsKLWludCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIHNlbmRfb3V0c3RhbmRpbmdfYmF0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TRU5EX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5OTYxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgImJhdF9kZWJ1Z2ZzLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAiYmF0X3N5c2ZzLmgiCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgInVuaWNhc3QuaCIKLQotCi1zdGF0aWMgaW50IGJhdF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOwotc3RhdGljIHZvaWQgYmF0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbyk7Ci1zdGF0aWMgdTMyIGJhdF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBiYXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSk7Ci1zdGF0aWMgdTMyIGJhdF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB1MzIgYmF0X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBiYXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJhdF9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzID0gYmF0X2dldF9zZXR0aW5ncywKLQkuZ2V0X2RydmluZm8gPSBiYXRfZ2V0X2RydmluZm8sCi0JLmdldF9tc2dsZXZlbCA9IGJhdF9nZXRfbXNnbGV2ZWwsCi0JLnNldF9tc2dsZXZlbCA9IGJhdF9zZXRfbXNnbGV2ZWwsCi0JLmdldF9saW5rID0gYmF0X2dldF9saW5rLAotCS5nZXRfcnhfY3N1bSA9IGJhdF9nZXRfcnhfY3N1bSwKLQkuc2V0X3J4X2NzdW0gPSBiYXRfc2V0X3J4X2NzdW0KLX07Ci0KLWludCBteV9za2JfaGVhZF9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JaW50IHJlc3VsdDsKLQotCS8qKgotCSAqIFRPRE86IFdlIG11c3QgY2hlY2sgaWYgd2UgY2FuIHJlbGVhc2UgYWxsIHJlZmVyZW5jZXMgdG8gbm9uLXBheWxvYWQKLQkgKiBkYXRhIHVzaW5nIHNrYl9oZWFkZXJfcmVsZWFzZSBpbiBvdXIgc2ticyB0byBhbGxvdyBza2JfY293X2hlYWRlciB0bwotCSAqIHdvcmsgb3B0aW1hbGx5LiBUaGlzIG1lYW5zIHRoYXQgdGhvc2Ugc2ticyBhcmUgbm90IGFsbG93ZWQgdG8gcmVhZAotCSAqIG9yIHdyaXRlIGFueSBkYXRhIHdoaWNoIGlzIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBza2ItPmRhdGEKLQkgKiBhZnRlciB0aGF0IGNhbGwgYW5kIHRodXMgYWxsb3cgb3RoZXIgc2ticyB3aXRoIHRoZSBzYW1lIGRhdGEgYnVmZmVyCi0JICogdG8gd3JpdGUgZnJlZWx5IGluIHRoYXQgYXJlYS4KLQkgKi8KLQlyZXN1bHQgPSBza2JfY293X2hlYWQoc2tiLCBsZW4pOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OwotCi0Jc2tiX3B1c2goc2tiLCBsZW4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludGVyZmFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbnRlcmZhY2VfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppbnRlcmZhY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gJmJhdF9wcml2LT5zdGF0czsKLX0KLQotc3RhdGljIGludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKLQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCi0JLyogb25seSBtb2RpZnkgaG5hLXRhYmxlIGlmIGl0IGhhcyBiZWVuIGluaXRpYWxpc2VkIGJlZm9yZSAqLwotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpID09IE1FU0hfQUNUSVZFKSB7Ci0JCWhuYV9sb2NhbF9yZW1vdmUoYmF0X3ByaXYsIGRldi0+ZGV2X2FkZHIsCi0JCQkJICJtYWMgYWRkcmVzcyBjaGFuZ2VkIik7Ci0JCWhuYV9sb2NhbF9hZGQoZGV2LCBhZGRyLT5zYV9kYXRhKTsKLQl9Ci0KLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZXJmYWNlX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCi17Ci0JLyogY2hlY2sgcmFuZ2VzICovCi0JaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gaGFyZGlmX21pbl9tdHUoZGV2KSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2LT5tdHUgPSBuZXdfbXR1OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpbnRlcmZhY2VfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKLQlpbnQgZGF0YV9sZW4gPSBza2ItPmxlbiwgcmV0OwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSkgIT0gTUVTSF9BQ1RJVkUpCi0JCWdvdG8gZHJvcHBlZDsKLQotCXNvZnRfaWZhY2UtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLQotCS8qIFRPRE86IGNoZWNrIHRoaXMgZm9yIGxvY2tzICovCi0JaG5hX2xvY2FsX2FkZChzb2Z0X2lmYWNlLCBldGhoZHItPmhfc291cmNlKTsKLQotCS8qIGV0aGVybmV0IHBhY2tldCBzaG91bGQgYmUgYnJvYWRjYXN0ZWQgKi8KLQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpIHx8IGlzX21jYXN0KGV0aGhkci0+aF9kZXN0KSkgewotCQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQkJZ290byBkcm9wcGVkOwotCi0JCWlmIChteV9za2JfaGVhZF9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSA8IDApCi0JCQlnb3RvIGRyb3BwZWQ7Ci0KLQkJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0JCWJjYXN0X3BhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOwotCQliY2FzdF9wYWNrZXQtPnR0bCA9IFRUTDsKLQotCQkvKiBiYXRtYW4gcGFja2V0IHR5cGU6IGJyb2FkY2FzdCAqLwotCQliY2FzdF9wYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX0JDQVNUOwotCi0JCS8qIGh3IGFkZHJlc3Mgb2YgZmlyc3QgaW50ZXJmYWNlIGlzIHRoZSBvcmlnIG1hYyBiZWNhdXNlIG9ubHkKLQkJICogdGhpcyBtYWMgaXMga25vd24gdGhyb3VnaG91dCB0aGUgbWVzaCAqLwotCQltZW1jcHkoYmNhc3RfcGFja2V0LT5vcmlnLAotCQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQkJLyogc2V0IGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJYmNhc3RfcGFja2V0LT5zZXFubyA9Ci0JCQlodG9ubChhdG9taWNfaW5jX3JldHVybigmYmF0X3ByaXYtPmJjYXN0X3NlcW5vKSk7Ci0KLQkJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBza2IpOwotCi0JCS8qIGEgY29weSBpcyBzdG9yZWQgaW4gdGhlIGJjYXN0IGxpc3QsIHRoZXJlZm9yZSByZW1vdmluZwotCQkgKiB0aGUgb3JpZ2luYWwgc2tiLiAqLwotCQlrZnJlZV9za2Ioc2tiKTsKLQotCS8qIHVuaWNhc3QgcGFja2V0ICovCi0JfSBlbHNlIHsKLQkJcmV0ID0gdW5pY2FzdF9zZW5kX3NrYihza2IsIGJhdF9wcml2KTsKLQkJaWYgKHJldCAhPSAwKQotCQkJZ290byBkcm9wcGVkX2ZyZWVkOwotCX0KLQotCWJhdF9wcml2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JYmF0X3ByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGRhdGFfbGVuOwotCWdvdG8gZW5kOwotCi1kcm9wcGVkOgotCWtmcmVlX3NrYihza2IpOwotZHJvcHBlZF9mcmVlZDoKLQliYXRfcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOwotZW5kOgotCXJldHVybiBORVRERVZfVFhfT0s7Ci19Ci0KLXZvaWQgaW50ZXJmYWNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLAotCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfc2l6ZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQotCS8qIGNoZWNrIGlmIGVub3VnaCBzcGFjZSBpcyBhdmFpbGFibGUgZm9yIHB1bGxpbmcsIGFuZCBwdWxsICovCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQlza2JfcHVsbF9yY3N1bShza2IsIGhkcl9zaXplKTsKLS8qCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIC1zaXplb2Yoc3RydWN0IGV0aGhkcikpOyovCi0KLQkvKiBza2ItPmRldiAmIHNrYi0+cGt0X3R5cGUgYXJlIHNldCBoZXJlICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0hMRU4pKSkKLQkJZ290byBkcm9wcGVkOwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNvZnRfaWZhY2UpOwotCi0JLyogc2hvdWxkIG5vdCBiZSBuZWNjZXNhcnkgYW55bW9yZSBhcyB3ZSB1c2Ugc2tiX3B1bGxfcmNzdW0oKQotCSAqIFRPRE86IHBsZWFzZSB2ZXJpZnkgdGhpcyBhbmQgcmVtb3ZlIHRoaXMgVE9ETwotCSAqIC0tIERlYyAyMXN0IDIwMDksIFNpbW9uIFd1bmRlcmxpY2ggKi8KLQotLyoJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsqLwotCi0JcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwotCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpOwotCi0Jc29mdF9pZmFjZS0+bGFzdF9yeCA9IGppZmZpZXM7Ci0KLQluZXRpZl9yeChza2IpOwotCXJldHVybjsKLQotZHJvcHBlZDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm47Ci19Ci0KLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJhdF9uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbiA9IGludGVyZmFjZV9vcGVuLAotCS5uZG9fc3RvcCA9IGludGVyZmFjZV9yZWxlYXNlLAotCS5uZG9fZ2V0X3N0YXRzID0gaW50ZXJmYWNlX3N0YXRzLAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gaW50ZXJmYWNlX3NldF9tYWNfYWRkciwKLQkubmRvX2NoYW5nZV9tdHUgPSBpbnRlcmZhY2VfY2hhbmdlX210dSwKLQkubmRvX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHgsCi0JLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIGRldl9hZGRyW0VUSF9BTEVOXTsKLQotCWV0aGVyX3NldHVwKGRldik7Ci0KLSNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCi0JZGV2LT5uZXRkZXZfb3BzID0gJmJhdF9uZXRkZXZfb3BzOwotI2Vsc2UKLQlkZXYtPm9wZW4gPSBpbnRlcmZhY2Vfb3BlbjsKLQlkZXYtPnN0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZTsKLQlkZXYtPmdldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0czsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHU7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHg7Ci0jZW5kaWYKLQlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKLQotCS8qKgotCSAqIGNhbid0IGNhbGwgbWluX210dSwgYmVjYXVzZSB0aGUgbmVlZGVkIHZhcmlhYmxlcwotCSAqIGhhdmUgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0Ci0JICovCi0JZGV2LT5tdHUgPSBFVEhfREFUQV9MRU47Ci0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBCQVRfSEVBREVSX0xFTjsgLyogcmVzZXJ2ZSBtb3JlIHNwYWNlIGluIHRoZQotCQkJCQkJKiBza2J1ZmYgZm9yIG91ciBoZWFkZXIgKi8KLQotCS8qIGdlbmVyYXRlIHJhbmRvbSBhZGRyZXNzICovCi0JcmFuZG9tX2V0aGVyX2FkZHIoZGV2X2FkZHIpOwotCW1lbWNweShkZXYtPmRldl9hZGRyLCBkZXZfYWRkciwgRVRIX0FMRU4pOwotCi0JU0VUX0VUSFRPT0xfT1BTKGRldiwgJmJhdF9ldGh0b29sX29wcyk7Ci0KLQltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikpOwotfQotCi1zdHJ1Y3QgbmV0X2RldmljZSAqc29mdGlmX2NyZWF0ZShjaGFyICpuYW1lKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0JaW50IHJldDsKLQotCXNvZnRfaWZhY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikgLCBuYW1lLAotCQkJCSAgIGludGVyZmFjZV9zZXR1cCk7Ci0KLQlpZiAoIXNvZnRfaWZhY2UpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJhdG1hbiBpbnRlcmZhY2U6ICVzXG4iLCBuYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBiYXRtYW4gaW50ZXJmYWNlICclcyc6ICVpXG4iLAotCQkgICAgICAgbmFtZSwgcmV0KTsKLQkJZ290byBmcmVlX3NvZnRfaWZhY2U7Ci0JfQotCi0JYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkLCAxKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkLCAwKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dmlzX21vZGUsIFZJU19UWVBFX0NMSUVOVF9VUERBVEUpOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsLCAxMDAwKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bG9nX2xldmVsLCAwKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkLCAxKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCwgQkNBU1RfUVVFVUVfTEVOKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQsIEJBVE1BTl9RVUVVRV9MRU4pOwotCi0JYXRvbWljX3NldCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUsIE1FU0hfSU5BQ1RJVkUpOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5iY2FzdF9zZXFubywgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAwKTsKLQotCWJhdF9wcml2LT5wcmltYXJ5X2lmID0gTlVMTDsKLQliYXRfcHJpdi0+bnVtX2lmYWNlcyA9IDA7Ci0KLQlyZXQgPSBzeXNmc19hZGRfbWVzaGlmKHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX3NvZnRfaWZhY2U7Ci0KLQlyZXQgPSBkZWJ1Z2ZzX2FkZF9tZXNoaWYoc29mdF9pZmFjZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gdW5yZWdfc3lzZnM7Ci0KLQlyZXQgPSBtZXNoX2luaXQoc29mdF9pZmFjZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gdW5yZWdfZGVidWdmczsKLQotCXJldHVybiBzb2Z0X2lmYWNlOwotCi11bnJlZ19kZWJ1Z2ZzOgotCWRlYnVnZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKLXVucmVnX3N5c2ZzOgotCXN5c2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7Ci11bnJlZ19zb2Z0X2lmYWNlOgotCXVucmVnaXN0ZXJfbmV0ZGV2KHNvZnRfaWZhY2UpOwotCXJldHVybiBOVUxMOwotCi1mcmVlX3NvZnRfaWZhY2U6Ci0JZnJlZV9uZXRkZXYoc29mdF9pZmFjZSk7Ci1vdXQ6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgc29mdGlmX2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0JZGVidWdmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotCXN5c2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7Ci0JbWVzaF9mcmVlKHNvZnRfaWZhY2UpOwotCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHNvZnRfaWZhY2UpOwotfQotCi0vKiBldGh0b29sICovCi1zdGF0aWMgaW50IGJhdF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0JY21kLT5zdXBwb3J0ZWQgPSAwOwotCWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOwotCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKLQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCWNtZC0+cG9ydCA9IFBPUlRfVFA7Ci0JY21kLT5waHlfYWRkcmVzcyA9IDA7Ci0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwotCWNtZC0+bWF4dHhwa3QgPSAwOwotCWNtZC0+bWF4cnhwa3QgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJhdF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCi17Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCIpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBTT1VSQ0VfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJiYXRtYW4iKTsKLX0KLQotc3RhdGljIHUzMiBiYXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi1zdGF0aWMgdm9pZCBiYXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKLXsKLX0KLQotc3RhdGljIHUzMiBiYXRfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHUzMiBiYXRfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0M2E3ZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9TT0ZUX0lOVEVSRkFDRV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfU09GVF9JTlRFUkZBQ0VfSF8KLQotaW50IG15X3NrYl9oZWFkX3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbik7Ci1pbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKTsKLXZvaWQgaW50ZXJmYWNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLAotCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfc2l6ZSk7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqc29mdGlmX2NyZWF0ZShjaGFyICpuYW1lKTsKLXZvaWQgc29mdGlmX2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NPRlRfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdiBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1iYXRtYW4tYWR2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGRkNzYyZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LWJhdG1hbi1hZHYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88aWZhY2U+L2JhdG1hbi1hZHYvbWVzaF9pZmFjZQotRGF0ZTogICAgICAgICAgIE1heSAyMDEwCi1Db250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIFRoZSAvc3lzL2NsYXNzL25ldC88aWZhY2U+L2JhdG1hbi1hZHYvbWVzaF9pZmFjZSBmaWxlCi0gICAgICAgICAgICAgICAgZGlzcGxheXMgdGhlIGJhdG1hbiBtZXNoIGludGVyZmFjZSB0aGlzIDxpZmFjZT4KLSAgICAgICAgICAgICAgICBjdXJyZW50bHkgaXMgYXNzb2NpYXRlZCB3aXRoLgotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPGlmYWNlPi9iYXRtYW4tYWR2L2lmYWNlX3N0YXR1cwotRGF0ZTogICAgICAgICAgIE1heSAyMDEwCi1Db250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIDxpZmFjZT4gYXMgaXQgaXMgc2VlbiBieSBiYXRtYW4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtbWVzaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1tZXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGNkYjYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1tZXNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvYWdncmVnYXRlZF9vZ21zCi1EYXRlOiAgICAgICAgICAgTWF5IDIwMTAKLUNvbnRhY3Q6ICAgICAgICBNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJhdG1hbiBwcm90b2NvbCBtZXNzYWdlcyBvZiB0aGUKLSAgICAgICAgICAgICAgICBtZXNoIDxtZXNoX2lmYWNlPiBzaGFsbCBiZSBhZ2dyZWdhdGVkIG9yIG5vdC4KLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxtZXNoX2lmYWNlPi9tZXNoL2JvbmRpbmcKLURhdGU6ICAgICAgICAgICBKdW5lIDIwMTAKLUNvbnRhY3Q6ICAgICAgICBTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRyYWZmaWMgZ29pbmcgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgICAgICBtZXNoIHdpbGwgYmUgc2VudCB1c2luZyBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IHRoZQotICAgICAgICAgICAgICAgIHNhbWUgdGltZSAoaWYgYXZhaWxhYmxlKS4KLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxtZXNoX2lmYWNlPi9tZXNoL2ZyYWdtZW50YXRpb24KLURhdGU6ICAgICAgICAgICBPY3RvYmVyIDIwMTAKLUNvbnRhY3Q6ICAgICAgICBBbmRyZWFzIExhbmdlciA8YW4ubGFuZ2VyQGdteC5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRyYWZmaWMgZ29pbmcgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgICAgICBtZXNoIHdpbGwgYmUgZnJhZ21lbnRlZCBvciBzaWxlbnRseSBkaXNjYXJkZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgcGFja2V0IHNpemUgZXhjZWVkcyB0aGUgb3V0Z29pbmcgaW50ZXJmYWNlIE1UVS4KLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxtZXNoX2lmYWNlPi9tZXNoL29yaWdfaW50ZXJ2YWwKLURhdGU6ICAgICAgICAgICBNYXkgMjAxMAotQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggYmF0bWFuCi0gICAgICAgICAgICAgICAgc2VuZHMgaXRzIHByb3RvY29sIG1lc3NhZ2VzLgotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvdmlzX21vZGUKLURhdGU6ICAgICAgICAgICBNYXkgMjAxMAotQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBFYWNoIGJhdG1hbiBub2RlIG9ubHkgbWFpbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGl0cwotICAgICAgICAgICAgICAgIG93biBsb2NhbCBuZWlnaGJvcmhvb2QsIHRoZXJlZm9yZSBnZW5lcmF0aW5nIGdyYXBocwotICAgICAgICAgICAgICAgIHNob3dpbmcgdGhlIHRvcG9sb2d5IG9mIHRoZSBlbnRpcmUgbWVzaCBpcyBub3QgZWFzaWx5Ci0gICAgICAgICAgICAgICAgZmVhc2libGUgd2l0aG91dCBoYXZpbmcgYSBjZW50cmFsIGluc3RhbmNlIHRvIGNvbGxlY3QKLSAgICAgICAgICAgICAgICB0aGUgbG9jYWwgdG9wb2xvZ2llcyBmcm9tIGFsbCBub2Rlcy4gVGhpcyBmaWxlIGFsbG93cwotICAgICAgICAgICAgICAgIHRvIGFjdGl2YXRlIHRoZSBjb2xsZWN0aW5nIChzZXJ2ZXIpIG1vZGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxY2NiZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotc3RhdGljIHZvaWQgaG5hX2xvY2FsX3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1zdGF0aWMgdm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSBzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKLQkJCQkgY2hhciAqbWVzc2FnZSk7Ci0KLXN0YXRpYyB2b2lkIGhuYV9sb2NhbF9zdGFydF90aW1lcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUlOSVRfREVMQVlFRF9XT1JLKCZiYXRfcHJpdi0+aG5hX3dvcmssIGhuYV9sb2NhbF9wdXJnZSk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZiYXRfcHJpdi0+aG5hX3dvcmssIDEwICogSFopOwotfQotCi1pbnQgaG5hX2xvY2FsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlpZiAoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoKQotCQlyZXR1cm4gMTsKLQotCWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7Ci0KLQlpZiAoIWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCkKLQkJcmV0dXJuIDA7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDApOwotCWhuYV9sb2NhbF9zdGFydF90aW1lcihiYXRfcHJpdik7Ci0KLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBobmFfbG9jYWxfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLCB1aW50OF90ICphZGRyKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0Jc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXF1aXJlZF9ieXRlczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQlobmFfbG9jYWxfZW50cnkgPQotCQkoKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLAotCQkJCQkJICAgICBhZGRyKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoaG5hX2xvY2FsX2VudHJ5KSB7Ci0JCWhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuID0gamlmZmllczsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG9ubHkgYW5ub3VuY2UgYXMgbWFueSBob3N0cyBhcyBwb3NzaWJsZSBpbiB0aGUgYmF0bWFuLXBhY2tldCBhbmQKLQkgICBzcGFjZSBpbiBiYXRtYW5fcGFja2V0LT5udW1faG5hIFRoYXQgYWxzbyBzaG91bGQgZ2l2ZSBhIGxpbWl0IHRvCi0JICAgTUFDLWZsb29kaW5nLiAqLwotCXJlcXVpcmVkX2J5dGVzID0gKGJhdF9wcml2LT5udW1fbG9jYWxfaG5hICsgMSkgKiBFVEhfQUxFTjsKLQlyZXF1aXJlZF9ieXRlcyArPSBCQVRfUEFDS0VUX0xFTjsKLQotCWlmICgocmVxdWlyZWRfYnl0ZXMgPiBFVEhfREFUQV9MRU4pIHx8Ci0JICAgIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpICYmCi0JICAgICByZXF1aXJlZF9ieXRlcyA+IE1BWF9BR0dSRUdBVElPTl9CWVRFUykgfHwKLQkgICAgKGJhdF9wcml2LT5udW1fbG9jYWxfaG5hICsgMSA+IDI1NSkpIHsKLQkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwKLQkJCSJDYW4ndCBhZGQgbmV3IGxvY2FsIGhuYSBlbnRyeSAoJXBNKTogIgotCQkJIm51bWJlciBvZiBsb2NhbCBobmEgZW50cmllcyBleGNlZWRzIHBhY2tldCBzaXplXG4iLAotCQkJYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0KLQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkiQ3JlYXRpbmcgbmV3IGxvY2FsIGhuYSBlbnRyeTogJXBNXG4iLCBhZGRyKTsKLQotCWhuYV9sb2NhbF9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBobmFfbG9jYWxfZW50cnkpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWhuYV9sb2NhbF9lbnRyeSkKLQkJcmV0dXJuOwotCi0JbWVtY3B5KGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOwotCWhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuID0gamlmZmllczsKLQotCS8qIHRoZSBiYXRtYW4gaW50ZXJmYWNlIG1hYyBhZGRyZXNzIHNob3VsZCBuZXZlciBiZSBwdXJnZWQgKi8KLQlpZiAoY29tcGFyZV9vcmlnKGFkZHIsIHNvZnRfaWZhY2UtPmRldl9hZGRyKSkKLQkJaG5hX2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSA9IDE7Ci0JZWxzZQotCQlobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlID0gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCWhhc2hfYWRkKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgaG5hX2xvY2FsX2VudHJ5KTsKLQliYXRfcHJpdi0+bnVtX2xvY2FsX2huYSsrOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMSk7Ci0KLQlpZiAoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLT5lbGVtZW50cyAqIDQgPgotCQkJCQliYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gtPnNpemUpIHsKLQkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsCi0JCQkJICAgICAgIGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaC0+c2l6ZSAqIDIpOwotCi0JCWlmICghc3dhcGhhc2gpCi0JCQlwcl9lcnIoIkNvdWxkbid0IHJlc2l6ZSBsb2NhbCBobmEgaGFzaCB0YWJsZVxuIik7Ci0JCWVsc2UKLQkJCWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCA9IHN3YXBoYXNoOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBnbG9iYWwgaGFzaCBpZiBwcmVzZW50ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaG5hX2dsb2JhbF9lbnRyeSA9ICgoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKLQkJCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgYWRkcikpOwotCi0JaWYgKGhuYV9nbG9iYWxfZW50cnkpCi0JCV9obmFfZ2xvYmFsX2RlbF9vcmlnKGJhdF9wcml2LCBobmFfZ2xvYmFsX2VudHJ5LAotCQkJCSAgICAgImxvY2FsIGhuYSByZWNlaXZlZCIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLWludCBobmFfbG9jYWxfZmlsbF9idWZmZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQotewotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlIQVNISVQoaGFzaGl0KTsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0KSkgewotCi0JCWlmIChidWZmX2xlbiA8IChpICsgMSkgKiBFVEhfQUxFTikKLQkJCWJyZWFrOwotCi0JCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0JCW1lbWNweShidWZmICsgKGkgKiBFVEhfQUxFTiksIGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgRVRIX0FMRU4pOwotCi0JCWkrKzsKLQl9Ci0KLQkvKiBpZiB3ZSBkaWQgbm90IGdldCBhbGwgbmV3IGxvY2FsIGhuYXMgc2VlIHlvdSBuZXh0IHRpbWUgIDstKSAqLwotCWlmIChpID09IGJhdF9wcml2LT5udW1fbG9jYWxfaG5hKQotCQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGk7Ci19Ci0KLWludCBobmFfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCUhBU0hJVChoYXNoaXQpOwotCUhBU0hJVChoYXNoaXRfY291bnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2l6ZV90IGJ1Zl9zaXplLCBwb3M7Ci0JY2hhciAqYnVmZjsKLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHsKLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgZGlzYWJsZWQgLSAiCi0JCQkgICAgICAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJICAgICAgIG5ldF9kZXYtPm5hbWUpOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiTG9jYWxseSByZXRyaWV2ZWQgYWRkcmVzc2VzIChmcm9tICVzKSAiCi0JCSAgICJhbm5vdW5jZWQgdmlhIEhOQTpcbiIsCi0JCSAgIG5ldF9kZXYtPm5hbWUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JYnVmX3NpemUgPSAxOwotCS8qIEVzdGltYXRlIGxlbmd0aCBmb3I6ICIgKiB4eDp4eDp4eDp4eDp4eDp4eFxuIiAqLwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0X2NvdW50KSkKLQkJYnVmX3NpemUgKz0gMjE7Ci0KLQlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWZmKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYnVmZlswXSA9ICdcMCc7Ci0JcG9zID0gMDsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0KSkgewotCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCXBvcyArPSBzbnByaW50ZihidWZmICsgcG9zLCAyMiwgIiAqICVwTVxuIiwKLQkJCQlobmFfbG9jYWxfZW50cnktPmFkZHIpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0Jc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOwotCWtmcmVlKGJ1ZmYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfaG5hX2xvY2FsX2RlbCh2b2lkICpkYXRhLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IChzdHJ1Y3QgYmF0X3ByaXYgKilhcmc7Ci0KLQlrZnJlZShkYXRhKTsKLQliYXRfcHJpdi0+bnVtX2xvY2FsX2huYS0tOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhuYV9sb2NhbF9kZWwoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5LAotCQkJICBjaGFyICptZXNzYWdlKQotewotCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsICJEZWxldGluZyBsb2NhbCBobmEgZW50cnkgKCVwTSk6ICVzXG4iLAotCQlobmFfbG9jYWxfZW50cnktPmFkZHIsIG1lc3NhZ2UpOwotCi0JaGFzaF9yZW1vdmUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCBobmFfbG9jYWxfZW50cnktPmFkZHIpOwotCV9obmFfbG9jYWxfZGVsKGhuYV9sb2NhbF9lbnRyeSwgYmF0X3ByaXYpOwotfQotCi12b2lkIGhuYV9sb2NhbF9yZW1vdmUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJICAgICAgdWludDhfdCAqYWRkciwgY2hhciAqbWVzc2FnZSkKLXsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCWhuYV9sb2NhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopCi0JCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsIGFkZHIpOwotCWlmIChobmFfbG9jYWxfZW50cnkpCi0JCWhuYV9sb2NhbF9kZWwoYmF0X3ByaXYsIGhuYV9sb2NhbF9lbnRyeSwgbWVzc2FnZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgaG5hX2xvY2FsX3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBiYXRfcHJpdiwgaG5hX3dvcmspOwotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlIQVNISVQoaGFzaGl0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0KSkgewotCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCXRpbWVvdXQgPSBobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiArIExPQ0FMX0hOQV9USU1FT1VUICogSFo7Ci0KLQkJaWYgKCghaG5hX2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSkgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQlobmFfbG9jYWxfZGVsKGJhdF9wcml2LCBobmFfbG9jYWxfZW50cnksCi0JCQkJICAgICAgImFkZHJlc3MgdGltZWQgb3V0Iik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0JaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKGJhdF9wcml2KTsKLX0KLQotdm9pZCBobmFfbG9jYWxfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCWlmICghYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoKQotCQlyZXR1cm47Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJhdF9wcml2LT5obmFfd29yayk7Ci0JaGFzaF9kZWxldGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCBfaG5hX2xvY2FsX2RlbCwgYmF0X3ByaXYpOwotCWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCA9IE5VTEw7Ci19Ci0KLWludCBobmFfZ2xvYmFsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlpZiAoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCkKLQkJcmV0dXJuIDE7Ci0KLQliYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKLQotCWlmICghYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQotewotCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OwotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOwotCWludCBobmFfYnVmZl9jb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyICpobmFfcHRyOwotCi0Jd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gaG5hX2J1ZmZfbGVuKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCQlobmFfcHRyID0gaG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7Ci0JCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKLQkJCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBobmFfcHRyKTsKLQotCQlpZiAoIWhuYV9nbG9iYWxfZW50cnkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQotCQkJaG5hX2dsb2JhbF9lbnRyeSA9Ci0JCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkpLAotCQkJCQlHRlBfQVRPTUlDKTsKLQotCQkJaWYgKCFobmFfZ2xvYmFsX2VudHJ5KQotCQkJCWJyZWFrOwotCi0JCQltZW1jcHkoaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgaG5hX3B0ciwgRVRIX0FMRU4pOwotCi0JCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJCSJDcmVhdGluZyBuZXcgZ2xvYmFsIGhuYSBlbnRyeTogIgotCQkJCSIlcE0gKHZpYSAlcE0pXG4iLAotCQkJCWhuYV9nbG9iYWxfZW50cnktPmFkZHIsIG9yaWdfbm9kZS0+b3JpZyk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQkJCWhhc2hfYWRkKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnkpOwotCi0JCX0KLQotCQlobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gbG9jYWwgaGFzaCBpZiBwcmVzZW50ICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCQlobmFfcHRyID0gaG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7Ci0JCWhuYV9sb2NhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopCi0JCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCBobmFfcHRyKTsKLQotCQlpZiAoaG5hX2xvY2FsX2VudHJ5KQotCQkJaG5hX2xvY2FsX2RlbChiYXRfcHJpdiwgaG5hX2xvY2FsX2VudHJ5LAotCQkJCSAgICAgICJnbG9iYWwgaG5hIHJlY2VpdmVkIik7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJaG5hX2J1ZmZfY291bnQrKzsKLQl9Ci0KLQkvKiBpbml0aWFsaXplLCBhbmQgb3ZlcndyaXRlIGlmIG1hbGxvYyBzdWNjZWVkcyAqLwotCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOwotCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gMDsKLQotCWlmIChobmFfYnVmZl9sZW4gPiAwKSB7Ci0JCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBrbWFsbG9jKGhuYV9idWZmX2xlbiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChvcmlnX25vZGUtPmhuYV9idWZmKSB7Ci0JCQltZW1jcHkob3JpZ19ub2RlLT5obmFfYnVmZiwgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci0JCQlvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9IGhuYV9idWZmX2xlbjsKLQkJfQotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmIChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLT5lbGVtZW50cyAqIDQgPgotCQkJCQliYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLT5zaXplKSB7Ci0JCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwKLQkJCQkgICAgICAgYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaC0+c2l6ZSAqIDIpOwotCi0JCWlmICghc3dhcGhhc2gpCi0JCQlwcl9lcnIoIkNvdWxkbid0IHJlc2l6ZSBnbG9iYWwgaG5hIGhhc2ggdGFibGVcbiIpOwotCQllbHNlCi0JCQliYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoID0gc3dhcGhhc2g7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLWludCBobmFfZ2xvYmFsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OwotCUhBU0hJVChoYXNoaXQpOwotCUhBU0hJVChoYXNoaXRfY291bnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2l6ZV90IGJ1Zl9zaXplLCBwb3M7Ci0JY2hhciAqYnVmZjsKLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHsKLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgZGlzYWJsZWQgLSAiCi0JCQkJICAicGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXRcbiIsCi0JCQkJICBuZXRfZGV2LT5uYW1lKTsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIkdsb2JhbGx5IGFubm91bmNlZCBITkFzIHJlY2VpdmVkIHZpYSB0aGUgbWVzaCAlc1xuIiwKLQkJICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlidWZfc2l6ZSA9IDE7Ci0JLyogRXN0aW1hdGUgbGVuZ3RoIGZvcjogIiAqIHh4Onh4Onh4Onh4Onh4Onh4IHZpYSB4eDp4eDp4eDp4eDp4eDp4eFxuIiovCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCAmaGFzaGl0X2NvdW50KSkKLQkJYnVmX3NpemUgKz0gNDM7Ci0KLQlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWZmKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYnVmZlswXSA9ICdcMCc7Ci0JcG9zID0gMDsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaG5hX2dsb2JhbF9lbnRyeSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDQ0LAotCQkJCSIgKiAlcE0gdmlhICVwTVxuIiwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwKLQkJCQlobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOwotCWtmcmVlKGJ1ZmYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSBzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeSwKLQkJCQkgY2hhciAqbWVzc2FnZSkKLXsKLQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkiRGVsZXRpbmcgZ2xvYmFsIGhuYSBlbnRyeSAlcE0gKHZpYSAlcE0pOiAlc1xuIiwKLQkJaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnLAotCQltZXNzYWdlKTsKLQotCWhhc2hfcmVtb3ZlKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnktPmFkZHIpOwotCWtmcmVlKGhuYV9nbG9iYWxfZW50cnkpOwotfQotCi12b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIGNoYXIgKm1lc3NhZ2UpCi17Ci0Jc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7Ci0JaW50IGhuYV9idWZmX2NvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmhuYV9wdHI7Ci0KLQlpZiAob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPT0gMCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHsKLQkJaG5hX3B0ciA9IG9yaWdfbm9kZS0+aG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7Ci0JCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKLQkJCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBobmFfcHRyKTsKLQotCQlpZiAoKGhuYV9nbG9iYWxfZW50cnkpICYmCi0JCSAgICAoaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID09IG9yaWdfbm9kZSkpCi0JCQlfaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgaG5hX2dsb2JhbF9lbnRyeSwKLQkJCQkJICAgICBtZXNzYWdlKTsKLQotCQlobmFfYnVmZl9jb3VudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPSAwOwotCWtmcmVlKG9yaWdfbm9kZS0+aG5hX2J1ZmYpOwotCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBobmFfZ2xvYmFsX2RlbCh2b2lkICpkYXRhLCB2b2lkICphcmcpCi17Ci0Ja2ZyZWUoZGF0YSk7Ci19Ci0KLXZvaWQgaG5hX2dsb2JhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JaWYgKCFiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoKQotCQlyZXR1cm47Ci0KLQloYXNoX2RlbGV0ZShiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBobmFfZ2xvYmFsX2RlbCwgTlVMTCk7Ci0JYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCA9IE5VTEw7Ci19Ci0KLXN0cnVjdCBvcmlnX25vZGUgKnRyYW5zdGFibGVfc2VhcmNoKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpCi17Ci0Jc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCi0JCQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGFkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFobmFfZ2xvYmFsX2VudHJ5KQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNGM1Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9UUkFOU0xBVElPTl9UQUJMRV9IXwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotaW50IGhuYV9sb2NhbF9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotdm9pZCBobmFfbG9jYWxfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLCB1aW50OF90ICphZGRyKTsKLXZvaWQgaG5hX2xvY2FsX3JlbW92ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkgICAgICB1aW50OF90ICphZGRyLCBjaGFyICptZXNzYWdlKTsKLWludCBobmFfbG9jYWxfZmlsbF9idWZmZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgdW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKTsKLWludCBobmFfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci12b2lkIGhuYV9sb2NhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotaW50IGhuYV9nbG9iYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgaG5hX2dsb2JhbF9hZGRfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSB1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbik7Ci1pbnQgaG5hX2dsb2JhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXZvaWQgaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY2hhciAqbWVzc2FnZSk7Ci12b2lkIGhuYV9nbG9iYWxfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXN0cnVjdCBvcmlnX25vZGUgKnRyYW5zdGFibGVfc2VhcmNoKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmNzM2Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1RZUEVTX0hfCi0KLSNpbmNsdWRlICJwYWNrZXQuaCIKLSNpbmNsdWRlICJiaXRhcnJheS5oIgotCi0jZGVmaW5lIEJBVF9IRUFERVJfTEVOIChzaXplb2Yoc3RydWN0IGV0aGhkcikgKyBcCi0JKChzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA+IHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSA/IFwKLQkgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkgOiBcCi0JIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkpKQotCi0KLXN0cnVjdCBiYXRtYW5faWYgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQxNl90IGlmX251bTsKLQljaGFyIGlmX3N0YXR1czsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlhdG9taWNfdCBzZXFubzsKLQlhdG9taWNfdCBmcmFnX3NlcW5vOwotCXVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmOwotCWludCBwYWNrZXRfbGVuOwotCXN0cnVjdCBrb2JqZWN0ICpoYXJkaWZfb2JqOwotCWF0b21pY190IHJlZmNudDsKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgYmF0bWFuX2Fkdl9wdHlwZTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKLX07Ci0KLS8qKgotICoJb3JpZ19ub2RlIC0gc3RydWN0dXJlIGZvciBvcmlnX2xpc3QgbWFpbnRhaW5pbmcgbm9kZXMgb2YgbWVzaAotICoJQHByaW1hcnlfYWRkcjogaG9zdHMgcHJpbWFyeSBpbnRlcmZhY2UgYWRkcmVzcwotICoJQGxhc3RfdmFsaWQ6IHdoZW4gbGFzdCBwYWNrZXQgZnJvbSB0aGlzIG5vZGUgd2FzIHJlY2VpdmVkCi0gKglAYmNhc3Rfc2Vxbm9fcmVzZXQ6IHRpbWUgd2hlbiB0aGUgYnJvYWRjYXN0IHNlcW5vIHdpbmRvdyB3YXMgcmVzZXQKLSAqCUBiYXRtYW5fc2Vxbm9fcmVzZXQ6IHRpbWUgd2hlbiB0aGUgYmF0bWFuIHNlcW5vIHdpbmRvdyB3YXMgcmVzZXQKLSAqCUBmbGFnczogZm9yIG5vdyBvbmx5IFZJU19TRVJWRVIgZmxhZwotICoJQGxhc3RfcmVhbF9zZXFubzogbGFzdCBhbmQgYmVzdCBrbm93biBzcXVlbmNlIG51bWJlcgotICoJQGxhc3RfdHRsOiB0dGwgb2YgbGFzdCByZWNlaXZlZCBwYWNrZXQKLSAqCUBsYXN0X2JjYXN0X3NlcW5vOiBsYXN0IGJyb2FkY2FzdCBzZXF1ZW5jZSBudW1iZXIgcmVjZWl2ZWQgYnkgdGhpcyBob3N0Ci0gKgotICoJQGNhbmRpZGF0ZXM6IGhvdyBtYW55IGNhbmRpZGF0ZXMgYXJlIGF2YWlsYWJsZQotICoJQHNlbGVjdGVkOiBuZXh0IGJvbmRpbmcgY2FuZGlkYXRlCi0gKi8KLXN0cnVjdCBvcmlnX25vZGUgewotCXVpbnQ4X3Qgb3JpZ1tFVEhfQUxFTl07Ci0JdWludDhfdCBwcmltYXJ5X2FkZHJbRVRIX0FMRU5dOwotCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7Ci0JVFlQRV9PRl9XT1JEICpiY2FzdF9vd247Ci0JdWludDhfdCAqYmNhc3Rfb3duX3N1bTsKLQl1aW50OF90IHRxX293bjsKLQlpbnQgdHFfYXN5bV9wZW5hbHR5OwotCXVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZDsKLQl1bnNpZ25lZCBsb25nIGJjYXN0X3NlcW5vX3Jlc2V0OwotCXVuc2lnbmVkIGxvbmcgYmF0bWFuX3NlcW5vX3Jlc2V0OwotCXVpbnQ4X3QgIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmOwotCWludDE2X3QgaG5hX2J1ZmZfbGVuOwotCXVpbnQzMl90IGxhc3RfcmVhbF9zZXFubzsKLQl1aW50OF90IGxhc3RfdHRsOwotCVRZUEVfT0ZfV09SRCBiY2FzdF9iaXRzW05VTV9XT1JEU107Ci0JdWludDMyX3QgbGFzdF9iY2FzdF9zZXFubzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5laWdoX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmFnX2xpc3Q7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X2ZyYWdfcGFja2V0OwotCXN0cnVjdCB7Ci0JCXVpbnQ4X3QgY2FuZGlkYXRlczsKLQkJc3RydWN0IG5laWdoX25vZGUgKnNlbGVjdGVkOwotCX0gYm9uZDsKLX07Ci0KLS8qKgotICoJbmVpZ2hfbm9kZQotICoJQGxhc3RfdmFsaWQ6IHdoZW4gbGFzdCBwYWNrZXQgdmlhIHRoaXMgbmVpZ2hib3Igd2FzIHJlY2VpdmVkCi0gKi8KLXN0cnVjdCBuZWlnaF9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKLQl1aW50OF90IHJlYWxfcGFja2V0X2NvdW50OwotCXVpbnQ4X3QgdHFfcmVjdltUUV9HTE9CQUxfV0lORE9XX1NJWkVdOwotCXVpbnQ4X3QgdHFfaW5kZXg7Ci0JdWludDhfdCB0cV9hdmc7Ci0JdWludDhfdCBsYXN0X3R0bDsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmV4dF9ib25kX2NhbmRpZGF0ZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdmFsaWQ7Ci0JVFlQRV9PRl9XT1JEIHJlYWxfYml0c1tOVU1fV09SRFNdOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZzsKLX07Ci0KLQotc3RydWN0IGJhdF9wcml2IHsKLQlhdG9taWNfdCBtZXNoX3N0YXRlOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWF0b21pY190IGFnZ3JlZ2F0aW9uX2VuYWJsZWQ7Ci0JYXRvbWljX3QgYm9uZGluZ19lbmFibGVkOwotCWF0b21pY190IGZyYWdfZW5hYmxlZDsKLQlhdG9taWNfdCB2aXNfbW9kZTsKLQlhdG9taWNfdCBvcmlnX2ludGVydmFsOwotCWF0b21pY190IGxvZ19sZXZlbDsKLQlhdG9taWNfdCBiY2FzdF9zZXFubzsKLQlhdG9taWNfdCBiY2FzdF9xdWV1ZV9sZWZ0OwotCWF0b21pY190IGJhdG1hbl9xdWV1ZV9sZWZ0OwotCWNoYXIgbnVtX2lmYWNlczsKLQlzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2c7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqcHJpbWFyeV9pZjsKLQlzdHJ1Y3Qga29iamVjdCAqbWVzaF9vYmo7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdfZGlyOwotCXN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmF0X2xpc3Q7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iY2FzdF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgdmlzX3NlbmRfbGlzdDsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKm9yaWdfaGFzaDsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhuYV9sb2NhbF9oYXNoOwotCXN0cnVjdCBoYXNodGFibGVfdCAqaG5hX2dsb2JhbF9oYXNoOwotCXN0cnVjdCBoYXNodGFibGVfdCAqdmlzX2hhc2g7Ci0Jc3BpbmxvY2tfdCBvcmlnX2hhc2hfbG9jazsgLyogcHJvdGVjdHMgb3JpZ19oYXNoICovCi0Jc3BpbmxvY2tfdCBmb3J3X2JhdF9saXN0X2xvY2s7IC8qIHByb3RlY3RzIGZvcndfYmF0X2xpc3QgKi8KLQlzcGlubG9ja190IGZvcndfYmNhc3RfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyAgKi8KLQlzcGlubG9ja190IGhuYV9saGFzaF9sb2NrOyAvKiBwcm90ZWN0cyBobmFfbG9jYWxfaGFzaCAqLwotCXNwaW5sb2NrX3QgaG5hX2doYXNoX2xvY2s7IC8qIHByb3RlY3RzIGhuYV9nbG9iYWxfaGFzaCAqLwotCXNwaW5sb2NrX3QgdmlzX2hhc2hfbG9jazsgLyogcHJvdGVjdHMgdmlzX2hhc2ggKi8KLQlzcGlubG9ja190IHZpc19saXN0X2xvY2s7IC8qIHByb3RlY3RzIHZpc19pbmZvOjpyZWN2X2xpc3QgKi8KLQlpbnQxNl90IG51bV9sb2NhbF9obmE7Ci0JYXRvbWljX3QgaG5hX2xvY2FsX2NoYW5nZWQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBobmFfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIG9yaWdfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHZpc193b3JrOwotCXN0cnVjdCB2aXNfaW5mbyAqbXlfdmlzX2luZm87Ci19OwotCi1zdHJ1Y3Qgc29ja2V0X2NsaWVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9saXN0OwotCXVuc2lnbmVkIGludCBxdWV1ZV9sZW47Ci0JdW5zaWduZWQgY2hhciBpbmRleDsKLQlzcGlubG9ja190IGxvY2s7IC8qIHByb3RlY3RzIHF1ZXVlX2xpc3QsIHF1ZXVlX2xlbiwgaW5kZXggKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZV93YWl0OwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci19OwotCi1zdHJ1Y3Qgc29ja2V0X3BhY2tldCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXNpemVfdCBpY21wX2xlbjsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgaWNtcF9wYWNrZXQ7Ci19OwotCi1zdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5IHsKLQl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9zZWVuOwotCWNoYXIgbmV2ZXJfcHVyZ2U7Ci19OwotCi1zdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSB7Ci0JdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci19OwotCi0vKioKLSAqCWZvcndfcGFja2V0IC0gc3RydWN0dXJlIGZvciBmb3J3X2xpc3QgbWFpbnRhaW5pbmcgcGFja2V0cyB0byBiZQotICoJICAgICAgICAgICAgICBzZW5kL2ZvcndhcmRlZAotICovCi1zdHJ1Y3QgZm9yd19wYWNrZXQgewotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7Ci0JdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7Ci0JdWludDhfdCBvd247Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1aW50MTZfdCBwYWNrZXRfbGVuOwotCXVpbnQzMl90IGRpcmVjdF9saW5rX2ZsYWdzOwotCXVpbnQ4X3QgbnVtX3BhY2tldHM7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmc7Ci19OwotCi0vKiBXaGlsZSBzY2FubmluZyBmb3IgdmlzLWVudHJpZXMgb2YgYSBwYXJ0aWN1bGFyIHZpcy1vcmlnaW5hdG9yCi0gKiB0aGlzIGxpc3QgY29sbGVjdHMgaXRzIGludGVyZmFjZXMgdG8gY3JlYXRlIGEgc3ViZ3JhcGgvY2x1c3RlcgotICogb3V0IG9mIHRoZW0gbGF0ZXIKLSAqLwotc3RydWN0IGlmX2xpc3RfZW50cnkgewotCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07Ci0JYm9vbCBwcmltYXJ5OwotCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgZGVidWdfbG9nIHsKLQljaGFyIGxvZ19idWZmW0xPR19CVUZfTEVOXTsKLQl1bnNpZ25lZCBsb25nIGxvZ19zdGFydDsKLQl1bnNpZ25lZCBsb25nIGxvZ19lbmQ7Ci0Jc3BpbmxvY2tfdCBsb2NrOyAvKiBwcm90ZWN0cyBsb2dfYnVmZiwgbG9nX3N0YXJ0IGFuZCBsb2dfZW5kICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWVfd2FpdDsKLX07Ci0KLXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdWludDE2X3Qgc2Vxbm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLX07Ci0KLXN0cnVjdCB2aXNfaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICBmaXJzdF9zZWVuOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgcmVjdl9saXN0OwotCQkJICAgIC8qIGxpc3Qgb2Ygc2VydmVyLW5laWdoYm9ycyB3ZSByZWNlaXZlZCBhIHZpcy1wYWNrZXQKLQkJCSAgICAgKiBmcm9tLiAgd2Ugc2hvdWxkIG5vdCByZXBseSB0byB0aGVtLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OwotCXN0cnVjdCBrcmVmIHJlZmNvdW50OwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0JLyogdGhpcyBwYWNrZXQgbWlnaHQgYmUgcGFydCBvZiB0aGUgdmlzIHNlbmQgcXVldWUuICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYl9wYWNrZXQ7Ci0JLyogdmlzX2luZm8gbWF5IGZvbGxvdyBoZXJlKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB2aXNfaW5mb19lbnRyeSB7Ci0JdWludDhfdCAgc3JjW0VUSF9BTEVOXTsKLQl1aW50OF90ICBkZXN0W0VUSF9BTEVOXTsKLQl1aW50OF90ICBxdWFsaXR5OwkvKiBxdWFsaXR5ID0gMCBtZWFucyBITkEgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCByZWN2bGlzdF9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdWludDhfdCBtYWNbRVRIX0FMRU5dOwotfTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU5NDEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogQW5kcmVhcyBMYW5nZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInVuaWNhc3QuaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLQotCi1zdHJ1Y3Qgc2tfYnVmZiAqbWVyZ2VfZnJhZ19wYWNrZXQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCQkgIHN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnAsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1cCA9Ci0JCShzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wX3NrYjsKLQotCS8qIHNldCBza2IgdG8gdGhlIGZpcnN0IHBhcnQgYW5kIHRtcF9za2IgdG8gdGhlIHNlY29uZCBwYXJ0ICovCi0JaWYgKHVwLT5mbGFncyAmIFVOSV9GUkFHX0hFQUQpIHsKLQkJdG1wX3NrYiA9IHRmcC0+c2tiOwotCX0gZWxzZSB7Ci0JCXRtcF9za2IgPSBza2I7Ci0JCXNrYiA9IHRmcC0+c2tiOwotCX0KLQotCXNrYl9wdWxsKHRtcF9za2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCkpOwotCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgdG1wX3NrYi0+bGVuLCBHRlBfQVRPTUlDKSA8IDApIHsKLQkJLyogZnJlZSBidWZmZXJlZCBza2IsIHNrYiB3aWxsIGJlIGZyZWVkIGxhdGVyICovCi0JCWtmcmVlX3NrYih0ZnAtPnNrYik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIG1vdmUgZnJlZSBlbnRyeSB0byBlbmQgKi8KLQl0ZnAtPnNrYiA9IE5VTEw7Ci0JdGZwLT5zZXFubyA9IDA7Ci0JbGlzdF9tb3ZlX3RhaWwoJnRmcC0+bGlzdCwgaGVhZCk7Ci0KLQltZW1jcHkoc2tiX3B1dChza2IsIHRtcF9za2ItPmxlbiksIHRtcF9za2ItPmRhdGEsIHRtcF9za2ItPmxlbik7Ci0Ja2ZyZWVfc2tiKHRtcF9za2IpOwotCXJldHVybiBza2I7Ci19Ci0KLXZvaWQgY3JlYXRlX2ZyYWdfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdGZwOwotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1cCA9Ci0JCShzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCS8qIGZyZWUgYW5kIG9sZGVzdCBwYWNrZXRzIHN0YW5kIGF0IHRoZSBlbmQgKi8KLQl0ZnAgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCp0ZnApLCBsaXN0KTsKLQlrZnJlZV9za2IodGZwLT5za2IpOwotCi0JdGZwLT5zZXFubyA9IG50b2hzKHVwLT5zZXFubyk7Ci0JdGZwLT5za2IgPSBza2I7Ci0JbGlzdF9tb3ZlKCZ0ZnAtPmxpc3QsIGhlYWQpOwotCXJldHVybjsKLX0KLQotaW50IGNyZWF0ZV9mcmFnX2J1ZmZlcihzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotCWludCBpOwotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRlJBR19CVUZGRVJfU0laRTsgaSsrKSB7Ci0JCXRmcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5KSwKLQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXRmcCkgewotCQkJZnJhZ19saXN0X2ZyZWUoaGVhZCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQl0ZnAtPnNrYiA9IE5VTEw7Ci0JCXRmcC0+c2Vxbm8gPSAwOwotCQlJTklUX0xJU1RfSEVBRCgmdGZwLT5saXN0KTsKLQkJbGlzdF9hZGQoJnRmcC0+bGlzdCwgaGVhZCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICpzZWFyY2hfZnJhZ19wYWNrZXQoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCQkJCSBzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdXApCi17Ci0Jc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcDsKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdG1wX3VwID0gTlVMTDsKLQl1aW50MTZfdCBzZWFyY2hfc2Vxbm87Ci0KLQlpZiAodXAtPmZsYWdzICYgVU5JX0ZSQUdfSEVBRCkKLQkJc2VhcmNoX3NlcW5vID0gbnRvaHModXAtPnNlcW5vKSsxOwotCWVsc2UKLQkJc2VhcmNoX3NlcW5vID0gbnRvaHModXAtPnNlcW5vKS0xOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZnAsIGhlYWQsIGxpc3QpIHsKLQotCQlpZiAoIXRmcC0+c2tiKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHRmcC0+c2Vxbm8gPT0gbnRvaHModXAtPnNlcW5vKSkKLQkJCWdvdG8gbW92X3RhaWw7Ci0KLQkJdG1wX3VwID0gKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICopdGZwLT5za2ItPmRhdGE7Ci0KLQkJaWYgKHRmcC0+c2Vxbm8gPT0gc2VhcmNoX3NlcW5vKSB7Ci0KLQkJCWlmICgodG1wX3VwLT5mbGFncyAmIFVOSV9GUkFHX0hFQUQpICE9Ci0JCQkgICAgKHVwLT5mbGFncyAmIFVOSV9GUkFHX0hFQUQpKQotCQkJCXJldHVybiB0ZnA7Ci0JCQllbHNlCi0JCQkJZ290byBtb3ZfdGFpbDsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLQotbW92X3RhaWw6Ci0JbGlzdF9tb3ZlX3RhaWwoJnRmcC0+bGlzdCwgaGVhZCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgZnJhZ19saXN0X2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqcGYsICp0bXBfcGY7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGYsIHRtcF9wZiwgaGVhZCwgbGlzdCkgewotCQkJa2ZyZWVfc2tiKHBmLT5za2IpOwotCQkJbGlzdF9kZWwoJnBmLT5saXN0KTsKLQkJCWtmcmVlKHBmKTsKLQkJfQotCX0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgdW5pY2FzdF9zZW5kX2ZyYWdfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgdWludDhfdCBkc3RhZGRyW10sCi0JCQkgIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSkKLXsKLQlzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqdWNhc3RfZnJhZzEsICp1Y2FzdF9mcmFnMjsKLQlpbnQgaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKmZyYWdfc2tiOwotCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuOwotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJZ290byBkcm9wcGVkOwotCi0JZnJhZ19za2IgPSBkZXZfYWxsb2Nfc2tiKGRhdGFfbGVuIC0gKGRhdGFfbGVuIC8gMikgKyBoZHJfbGVuKTsKLQlza2Jfc3BsaXQoc2tiLCBmcmFnX3NrYiwgZGF0YV9sZW4gLyAyKTsKLQotCWlmIChteV9za2JfaGVhZF9wdXNoKGZyYWdfc2tiLCBoZHJfbGVuKSA8IDAgfHwKLQkgICAgbXlfc2tiX2hlYWRfcHVzaChza2IsIGhkcl9sZW4pIDwgMCkKLQkJZ290byBkcm9wX2ZyYWc7Ci0KLQl1Y2FzdF9mcmFnMSA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQl1Y2FzdF9mcmFnMiA9IChzdHJ1Y3QgdW5pY2FzdF9mcmFnX3BhY2tldCAqKWZyYWdfc2tiLT5kYXRhOwotCi0JdWNhc3RfZnJhZzEtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQl1Y2FzdF9mcmFnMS0+cGFja2V0X3R5cGUgPSBCQVRfVU5JQ0FTVF9GUkFHOwotCXVjYXN0X2ZyYWcxLT50dGwgPSBUVEw7Ci0JbWVtY3B5KHVjYXN0X2ZyYWcxLT5vcmlnLAotCSAgICAgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkodWNhc3RfZnJhZzEtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCi0JbWVtY3B5KHVjYXN0X2ZyYWcyLCB1Y2FzdF9mcmFnMSwgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KSk7Ci0KLQl1Y2FzdF9mcmFnMS0+ZmxhZ3MgfD0gVU5JX0ZSQUdfSEVBRDsKLQl1Y2FzdF9mcmFnMi0+ZmxhZ3MgJj0gflVOSV9GUkFHX0hFQUQ7Ci0KLQl1Y2FzdF9mcmFnMS0+c2Vxbm8gPSBodG9ucygodWludDE2X3QpYXRvbWljX2luY19yZXR1cm4oCi0JCQkJCQkmYmF0bWFuX2lmLT5mcmFnX3NlcW5vKSk7Ci0KLQl1Y2FzdF9mcmFnMi0+c2Vxbm8gPSBodG9ucygodWludDE2X3QpYXRvbWljX2luY19yZXR1cm4oCi0JCQkJCQkmYmF0bWFuX2lmLT5mcmFnX3NlcW5vKSk7Ci0KLQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCXNlbmRfc2tiX3BhY2tldChmcmFnX3NrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQlyZXR1cm4gMDsKLQotZHJvcF9mcmFnOgotCWtmcmVlX3NrYihmcmFnX3NrYik7Ci1kcm9wcGVkOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAxOwotfQotCi1pbnQgdW5pY2FzdF9zZW5kX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCB1bmljYXN0X3BhY2tldCAqdW5pY2FzdF9wYWNrZXQ7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOwotCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuOwotCXVpbnQ4X3QgZHN0YWRkcls2XTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwKLQkJCQkJCSAgIGV0aGhkci0+aF9kZXN0KSk7Ci0KLQkvKiBjaGVjayBmb3IgaG5hIGhvc3QgKi8KLQlpZiAoIW9yaWdfbm9kZSkKLQkJb3JpZ19ub2RlID0gdHJhbnN0YWJsZV9zZWFyY2goYmF0X3ByaXYsIGV0aGhkci0+aF9kZXN0KTsKLQotCXJvdXRlciA9IGZpbmRfcm91dGVyKGJhdF9wcml2LCBvcmlnX25vZGUsIE5VTEwpOwotCi0JaWYgKCFyb3V0ZXIpCi0JCWdvdG8gdW5sb2NrOwotCi0JLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkJKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0KLQliYXRtYW5faWYgPSByb3V0ZXItPmlmX2luY29taW5nOwotCW1lbWNweShkc3RhZGRyLCByb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBkcm9wcGVkOwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSAmJgotCSAgICBkYXRhX2xlbiArIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpID4gYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUpCi0JCXJldHVybiB1bmljYXN0X3NlbmRfZnJhZ19za2Ioc2tiLCBiYXRfcHJpdiwgYmF0bWFuX2lmLAotCQkJCQkgICAgIGRzdGFkZHIsIG9yaWdfbm9kZSk7Ci0KLQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpKSA8IDApCi0JCWdvdG8gZHJvcHBlZDsKLQotCXVuaWNhc3RfcGFja2V0ID0gKHN0cnVjdCB1bmljYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCXVuaWNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047Ci0JLyogYmF0bWFuIHBhY2tldCB0eXBlOiB1bmljYXN0ICovCi0JdW5pY2FzdF9wYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX1VOSUNBU1Q7Ci0JLyogc2V0IHVuaWNhc3QgdHRsICovCi0JdW5pY2FzdF9wYWNrZXQtPnR0bCA9IFRUTDsKLQkvKiBjb3B5IHRoZSBkZXN0aW5hdGlvbiBmb3IgZmFzdGVyIHJvdXRpbmcgKi8KLQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCi0Jc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQlyZXR1cm4gMDsKLQotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotZHJvcHBlZDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3MzY5Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogQW5kcmVhcyBMYW5nZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9VTklDQVNUX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9VTklDQVNUX0hfCi0KLSNkZWZpbmUgRlJBR19USU1FT1VUIDEwMDAwCS8qIHB1cmdlIGZyYWcgbGlzdCBlbnRyeXMgYWZ0ZXIgdGltZSBpbiBtcyAqLwotI2RlZmluZSBGUkFHX0JVRkZFUl9TSVpFIDYJLyogbnVtYmVyIG9mIGxpc3QgZWxlbWVudHMgaW4gYnVmZmVyICovCi0KLXN0cnVjdCBza19idWZmICptZXJnZV9mcmFnX3BhY2tldChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnAsCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLXZvaWQgY3JlYXRlX2ZyYWdfZW50cnkoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgY3JlYXRlX2ZyYWdfYnVmZmVyKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnNlYXJjaF9mcmFnX3BhY2tldChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1cCk7Ci12b2lkIGZyYWdfbGlzdF9mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotaW50IHVuaWNhc3Rfc2VuZF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVU5JQ0FTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyYzFiYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJzZW5kLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJ2aXMuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi0jZGVmaW5lIE1BWF9WSVNfUEFDS0VUX1NJWkUgMTAwMAotCi0vKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBzaWduZWQgaW50ZWdlciBpbiB0d28ncyBjb21wbGVtZW50IHdpdGggdGhlIHNpemVvZiB4ICovCi0jZGVmaW5lIHNtYWxsZXN0X3NpZ25lZF9pbnQoeCkgKDF1IDw8ICg3dSArIDh1ICogKHNpemVvZih4KSAtIDF1KSkpCi0KLS8qIENoZWNrcyBpZiBhIHNlcXVlbmNlIG51bWJlciB4IGlzIGEgcHJlZGVjZXNzb3Ivc3VjY2Vzc29yIG9mIHkuCi0gKiB0aGV5IGhhbmRsZSBvdmVyZmxvd3MvdW5kZXJmbG93cyBhbmQgY2FuIGNvcnJlY3RseSBjaGVjayBmb3IgYQotICogcHJlZGVjZXNzb3Ivc3VjY2Vzc29yIHVubGVzcyB0aGUgdmFyaWFibGUgc2VxdWVuY2UgbnVtYmVyIGhhcyBncm93biBieQotICogbW9yZSB0aGVuIDIqKihiaXR3aWR0aCh4KS0xKS0xLgotICogVGhpcyBtZWFucyB0aGF0IGZvciBhIHVpbnQ4X3Qgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZSAyNTUsIGl0IHdvdWxkIHRoaW5rOgotICogIC0gd2hlbiBhZGRpbmcgbm90aGluZyAtIGl0IGlzIG5laXRoZXIgYSBwcmVkZWNlc3NvciBub3IgYSBzdWNjZXNzb3IKLSAqICAtIGJlZm9yZSBhZGRpbmcgbW9yZSB0aGFuIDEyNyB0byB0aGUgc3RhcnRpbmcgdmFsdWUgLSBpdCBpcyBhIHByZWRlY2Vzc29yLAotICogIC0gd2hlbiBhZGRpbmcgMTI4IC0gaXQgaXMgbmVpdGhlciBhIHByZWRlY2Vzc29yIG5vciBhIHN1Y2Nlc3NvciwKLSAqICAtIGFmdGVyIGFkZGluZyBtb3JlIHRoYW4gMTI3IHRvIHRoZSBzdGFydGluZyB2YWx1ZSAtIGl0IGlzIGEgc3VjY2Vzc29yICovCi0jZGVmaW5lIHNlcV9iZWZvcmUoeCwgeSkgKHt0eXBlb2YoeCkgX2R1bW15ID0gKHggLSB5KTsgXAotCQkJX2R1bW15ID4gc21hbGxlc3Rfc2lnbmVkX2ludChfZHVtbXkpOyB9KQotI2RlZmluZSBzZXFfYWZ0ZXIoeCwgeSkgc2VxX2JlZm9yZSh5LCB4KQotCi1zdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci0KLS8qIGZyZWUgdGhlIGluZm8gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaW5mbyhzdHJ1Y3Qga3JlZiAqcmVmKQotewotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCB2aXNfaW5mbywgcmVmY291bnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBpbmZvLT5iYXRfcHJpdjsKLQlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnksICp0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxpc3RfZGVsX2luaXQoJmluZm8tPnNlbmRfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZpbmZvLT5yZWN2X2xpc3QsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJa2ZyZWUoZW50cnkpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci0Ja2ZyZWVfc2tiKGluZm8tPnNrYl9wYWNrZXQpOwotfQotCi0vKiBDb21wYXJlIHR3byB2aXMgcGFja2V0cywgdXNlZCBieSB0aGUgaGFzaGluZyBhbGdvcml0aG0gKi8KLXN0YXRpYyBpbnQgdmlzX2luZm9fY21wKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMikKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmQxLCAqZDI7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnAxLCAqcDI7Ci0JZDEgPSBkYXRhMTsKLQlkMiA9IGRhdGEyOwotCXAxID0gKHN0cnVjdCB2aXNfcGFja2V0ICopZDEtPnNrYl9wYWNrZXQtPmRhdGE7Ci0JcDIgPSAoc3RydWN0IHZpc19wYWNrZXQgKilkMi0+c2tiX3BhY2tldC0+ZGF0YTsKLQlyZXR1cm4gY29tcGFyZV9vcmlnKHAxLT52aXNfb3JpZywgcDItPnZpc19vcmlnKTsKLX0KLQotLyogaGFzaCBmdW5jdGlvbiB0byBjaG9vc2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlIG9mIGdpdmVuIHNpemUgKi8KLS8qIGhhc2ggYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX3RhYmxlICovCi1zdGF0aWMgaW50IHZpc19pbmZvX2Nob29zZSh2b2lkICpkYXRhLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKnZpc19pbmZvID0gZGF0YTsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXVuc2lnbmVkIGNoYXIgKmtleTsKLQl1aW50MzJfdCBoYXNoID0gMDsKLQlzaXplX3QgaTsKLQotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXZpc19pbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCWtleSA9IHBhY2tldC0+dmlzX29yaWc7Ci0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLQkJaGFzaCArPSBrZXlbaV07Ci0JCWhhc2ggKz0gKGhhc2ggPDwgMTApOwotCQloYXNoIF49IChoYXNoID4+IDYpOwotCX0KLQotCWhhc2ggKz0gKGhhc2ggPDwgMyk7Ci0JaGFzaCBePSAoaGFzaCA+PiAxMSk7Ci0JaGFzaCArPSAoaGFzaCA8PCAxNSk7Ci0KLQlyZXR1cm4gaGFzaCAlIHNpemU7Ci19Ci0KLS8qIGluc2VydCBpbnRlcmZhY2UgdG8gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyBvZiBvbmUgb3JpZ2luYXRvciwgaWYgaXQKLSAqIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGxpc3QgKi8KLXN0YXRpYyB2b2lkIHZpc19kYXRhX2luc2VydF9pbnRlcmZhY2UoY29uc3QgdWludDhfdCAqaW50ZXJmYWNlLAotCQkJCSAgICAgIHN0cnVjdCBobGlzdF9oZWFkICppZl9saXN0LAotCQkJCSAgICAgIGJvb2wgcHJpbWFyeSkKLXsKLQlzdHJ1Y3QgaWZfbGlzdF9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIGlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNvbXBhcmVfb3JpZyhlbnRyeS0+YWRkciwgKHZvaWQgKilpbnRlcmZhY2UpKQotCQkJcmV0dXJuOwotCX0KLQotCS8qIGl0cyBhIG5ldyBhZGRyZXNzLCBhZGQgaXQgdG8gdGhlIGxpc3QgKi8KLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwotCWlmICghZW50cnkpCi0JCXJldHVybjsKLQltZW1jcHkoZW50cnktPmFkZHIsIGludGVyZmFjZSwgRVRIX0FMRU4pOwotCWVudHJ5LT5wcmltYXJ5ID0gcHJpbWFyeTsKLQlobGlzdF9hZGRfaGVhZCgmZW50cnktPmxpc3QsIGlmX2xpc3QpOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aXNfZGF0YV9yZWFkX3ByaW1fc2VjKGNoYXIgKmJ1ZmYsIHN0cnVjdCBobGlzdF9oZWFkICppZl9saXN0KQotewotCXN0cnVjdCBpZl9saXN0X2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXNpemVfdCBsZW4gPSAwOwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoZW50cnktPnByaW1hcnkpCi0JCQlsZW4gKz0gc3ByaW50ZihidWZmICsgbGVuLCAiUFJJTUFSWSwgIik7Ci0JCWVsc2UgewotCQkJbGVuICs9IHNwcmludGYoYnVmZiArIGxlbiwgICJTRUMgJXBNLCAiLCBlbnRyeS0+YWRkcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc2l6ZV90IHZpc19kYXRhX2NvdW50X3ByaW1fc2VjKHN0cnVjdCBobGlzdF9oZWFkICppZl9saXN0KQotewotCXN0cnVjdCBpZl9saXN0X2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXNpemVfdCBjb3VudCA9IDA7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCBpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChlbnRyeS0+cHJpbWFyeSkKLQkJCWNvdW50ICs9IDk7Ci0JCWVsc2UKLQkJCWNvdW50ICs9IDIzOwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotLyogcmVhZCBhbiBlbnRyeSAgKi8KLXN0YXRpYyBzc2l6ZV90IHZpc19kYXRhX3JlYWRfZW50cnkoY2hhciAqYnVmZiwgc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeSwKLQkJCQkgICB1aW50OF90ICpzcmMsIGJvb2wgcHJpbWFyeSkKLXsKLQkvKiBtYXhpbWFsIGxlbmd0aDogbWF4KDQrMTcrMiwgMysxNysxKzMrMikgPT0gMjYgKi8KLQlpZiAocHJpbWFyeSAmJiBlbnRyeS0+cXVhbGl0eSA9PSAwKQotCQlyZXR1cm4gc3ByaW50ZihidWZmLCAiSE5BICVwTSwgIiwgZW50cnktPmRlc3QpOwotCWVsc2UgaWYgKGNvbXBhcmVfb3JpZyhlbnRyeS0+c3JjLCBzcmMpKQotCQlyZXR1cm4gc3ByaW50ZihidWZmLCAiVFEgJXBNICVkLCAiLCBlbnRyeS0+ZGVzdCwKLQkJCSAgICAgICBlbnRyeS0+cXVhbGl0eSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHZpc19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCUhBU0hJVChoYXNoaXQpOwotCUhBU0hJVChoYXNoaXRfY291bnQpOwotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cmllczsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JSExJU1RfSEVBRCh2aXNfaWZfbGlzdCk7Ci0Jc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3MsICpuOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHZpc19zZXJ2ZXIgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQlzaXplX3QgYnVmZl9wb3MsIGJ1Zl9zaXplOwotCWNoYXIgKmJ1ZmY7Ci0KLQlpZiAoKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgfHwKLQkgICAgKHZpc19zZXJ2ZXIgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSkpCi0JCXJldHVybiAwOwotCi0JYnVmX3NpemUgPSAxOwotCS8qIEVzdGltYXRlIGxlbmd0aCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPnZpc19oYXNoLCAmaGFzaGl0X2NvdW50KSkgewotCQlpbmZvID0gaGFzaGl0X2NvdW50LmJ1Y2tldC0+ZGF0YTsKLQkJcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQkJZW50cmllcyA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKLQkJCSAgKChjaGFyICopcGFja2V0ICsgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+ZW50cmllczsgaSsrKSB7Ci0JCQlpZiAoZW50cmllc1tpXS5xdWFsaXR5ID09IDApCi0JCQkJY29udGludWU7Ci0JCQl2aXNfZGF0YV9pbnNlcnRfaW50ZXJmYWNlKGVudHJpZXNbaV0uc3JjLCAmdmlzX2lmX2xpc3QsCi0JCQkJY29tcGFyZV9vcmlnKGVudHJpZXNbaV0uc3JjLCBwYWNrZXQtPnZpc19vcmlnKSk7Ci0JCX0KLQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCAmdmlzX2lmX2xpc3QsIGxpc3QpIHsKLQkJCWJ1Zl9zaXplICs9IDE4ICsgMjYgKiBwYWNrZXQtPmVudHJpZXM7Ci0KLQkJCS8qIGFkZCBwcmltYXJ5L3NlY29uZGFyeSByZWNvcmRzICovCi0JCQlpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5hZGRyLCBwYWNrZXQtPnZpc19vcmlnKSkKLQkJCQlidWZfc2l6ZSArPQotCQkJCQl2aXNfZGF0YV9jb3VudF9wcmltX3NlYygmdmlzX2lmX2xpc3QpOwotCi0JCQlidWZfc2l6ZSArPSAxOwotCQl9Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgcG9zLCBuLCAmdmlzX2lmX2xpc3QsIGxpc3QpIHsKLQkJCWhsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQkJa2ZyZWUoZW50cnkpOwotCQl9Ci0JfQotCi0JYnVmZiA9IGttYWxsb2MoYnVmX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmICghYnVmZikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYnVmZlswXSA9ICdcMCc7Ci0JYnVmZl9wb3MgPSAwOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+dmlzX2hhc2gsICZoYXNoaXQpKSB7Ci0JCWluZm8gPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQotCQkJICAoKGNoYXIgKilwYWNrZXQgKyBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5lbnRyaWVzOyBpKyspIHsKLQkJCWlmIChlbnRyaWVzW2ldLnF1YWxpdHkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCXZpc19kYXRhX2luc2VydF9pbnRlcmZhY2UoZW50cmllc1tpXS5zcmMsICZ2aXNfaWZfbGlzdCwKLQkJCQljb21wYXJlX29yaWcoZW50cmllc1tpXS5zcmMsIHBhY2tldC0+dmlzX29yaWcpKTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsICZ2aXNfaWZfbGlzdCwgbGlzdCkgewotCQkJYnVmZl9wb3MgKz0gc3ByaW50ZihidWZmICsgYnVmZl9wb3MsICIlcE0sIiwKLQkJCQkJICAgIGVudHJ5LT5hZGRyKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+ZW50cmllczsgaSsrKQotCQkJCWJ1ZmZfcG9zICs9IHZpc19kYXRhX3JlYWRfZW50cnkoYnVmZiArIGJ1ZmZfcG9zLAotCQkJCQkJCQkmZW50cmllc1tpXSwKLQkJCQkJCQkJZW50cnktPmFkZHIsCi0JCQkJCQkJCWVudHJ5LT5wcmltYXJ5KTsKLQotCQkJLyogYWRkIHByaW1hcnkvc2Vjb25kYXJ5IHJlY29yZHMgKi8KLQkJCWlmIChjb21wYXJlX29yaWcoZW50cnktPmFkZHIsIHBhY2tldC0+dmlzX29yaWcpKQotCQkJCWJ1ZmZfcG9zICs9Ci0JCQkJCXZpc19kYXRhX3JlYWRfcHJpbV9zZWMoYnVmZiArIGJ1ZmZfcG9zLAotCQkJCQkJCSAgICAgICAmdmlzX2lmX2xpc3QpOwotCi0JCQlidWZmX3BvcyArPSBzcHJpbnRmKGJ1ZmYgKyBidWZmX3BvcywgIlxuIik7Ci0JCX0KLQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBwb3MsIG4sICZ2aXNfaWZfbGlzdCwgbGlzdCkgewotCQkJaGxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCQlrZnJlZShlbnRyeSk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOwotCWtmcmVlKGJ1ZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFkZCB0aGUgaW5mbyBwYWNrZXQgdG8gdGhlIHNlbmQgbGlzdCwgaWYgaXQgd2FzIG5vdAotICogYWxyZWFkeSBsaW5rZWQgaW4uICovCi1zdGF0aWMgdm9pZCBzZW5kX2xpc3RfYWRkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlpZiAobGlzdF9lbXB0eSgmaW5mby0+c2VuZF9saXN0KSkgewotCQlrcmVmX2dldCgmaW5mby0+cmVmY291bnQpOwotCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zZW5kX2xpc3QsICZiYXRfcHJpdi0+dmlzX3NlbmRfbGlzdCk7Ci0JfQotfQotCi0vKiBkZWxldGUgdGhlIGluZm8gcGFja2V0IGZyb20gdGhlIHNlbmQgbGlzdCwgaWYgaXQgd2FzCi0gKiBsaW5rZWQgaW4uICovCi1zdGF0aWMgdm9pZCBzZW5kX2xpc3RfZGVsKHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlpZiAoIWxpc3RfZW1wdHkoJmluZm8tPnNlbmRfbGlzdCkpIHsKLQkJbGlzdF9kZWxfaW5pdCgmaW5mby0+c2VuZF9saXN0KTsKLQkJa3JlZl9wdXQoJmluZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCX0KLX0KLQotLyogdHJpZXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgcmVjZWl2ZSBsaXN0LiAqLwotc3RhdGljIHZvaWQgcmVjdl9saXN0X2FkZChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKLXsKLQlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWVudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlY3ZsaXN0X25vZGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm47Ci0KLQltZW1jcHkoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTik7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIHJlY3ZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLX0KLQotLyogcmV0dXJucyAxIGlmIHRoaXMgbWFjIGlzIGluIHRoZSByZWN2X2xpc3QgKi8KLXN0YXRpYyBpbnQgcmVjdl9saXN0X2lzX2luKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKLXsKLQlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHJlY3ZfbGlzdCwgbGlzdCkgewotCQlpZiAobWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pID09IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogdHJ5IHRvIGFkZCB0aGUgcGFja2V0IHRvIHRoZSB2aXNfaGFzaC4gcmV0dXJuIE5VTEwgaWYgaW52YWxpZCAoZS5nLiB0b28gb2xkLAotICogYnJva2VuLi4gKS4JdmlzIGhhc2ggbXVzdCBiZSBsb2NrZWQgb3V0c2lkZS4gIGlzX25ldyBpcyBzZXQgd2hlbiB0aGUgcGFja2V0Ci0gKiBpcyBuZXdlciB0aGFuIG9sZCBlbnRyaWVzIGluIHRoZSBoYXNoLiAqLwotc3RhdGljIHN0cnVjdCB2aXNfaW5mbyAqYWRkX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgIHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAotCQkJCSAgIGludCB2aXNfaW5mb19sZW4sIGludCAqaXNfbmV3LAotCQkJCSAgIGludCBtYWtlX2Jyb2FkY2FzdCkKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8sICpvbGRfaW5mbzsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqc2VhcmNoX3BhY2tldCwgKm9sZF9wYWNrZXQ7Ci0Jc3RydWN0IHZpc19pbmZvIHNlYXJjaF9lbGVtOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0KLQkqaXNfbmV3ID0gMDsKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoIWJhdF9wcml2LT52aXNfaGFzaCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBzZWUgaWYgdGhlIHBhY2tldCBpcyBhbHJlYWR5IGluIHZpc19oYXNoICovCi0Jc2VhcmNoX2VsZW0uc2tiX3BhY2tldCA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0JaWYgKCFzZWFyY2hfZWxlbS5za2JfcGFja2V0KQotCQlyZXR1cm4gTlVMTDsKLQlzZWFyY2hfcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopc2tiX3B1dChzZWFyY2hfZWxlbS5za2JfcGFja2V0LAotCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQotCW1lbWNweShzZWFyY2hfcGFja2V0LT52aXNfb3JpZywgdmlzX3BhY2tldC0+dmlzX29yaWcsIEVUSF9BTEVOKTsKLQlvbGRfaW5mbyA9IGhhc2hfZmluZChiYXRfcHJpdi0+dmlzX2hhc2gsICZzZWFyY2hfZWxlbSk7Ci0Ja2ZyZWVfc2tiKHNlYXJjaF9lbGVtLnNrYl9wYWNrZXQpOwotCi0JaWYgKG9sZF9pbmZvICE9IE5VTEwpIHsKLQkJb2xkX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKW9sZF9pbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCQlpZiAoIXNlcV9hZnRlcihudG9obCh2aXNfcGFja2V0LT5zZXFubyksCi0JCQkgICAgICAgbnRvaGwob2xkX3BhY2tldC0+c2Vxbm8pKSkgewotCQkJaWYgKG9sZF9wYWNrZXQtPnNlcW5vID09IHZpc19wYWNrZXQtPnNlcW5vKSB7Ci0JCQkJcmVjdl9saXN0X2FkZChiYXRfcHJpdiwgJm9sZF9pbmZvLT5yZWN2X2xpc3QsCi0JCQkJCSAgICAgIHZpc19wYWNrZXQtPnNlbmRlcl9vcmlnKTsKLQkJCQlyZXR1cm4gb2xkX2luZm87Ci0JCQl9IGVsc2UgewotCQkJCS8qIG5ld2VyIHBhY2tldCBpcyBhbHJlYWR5IGluIGhhc2guICovCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJLyogcmVtb3ZlIG9sZCBlbnRyeSAqLwotCQloYXNoX3JlbW92ZShiYXRfcHJpdi0+dmlzX2hhc2gsIG9sZF9pbmZvKTsKLQkJc2VuZF9saXN0X2RlbChvbGRfaW5mbyk7Ci0JCWtyZWZfcHV0KCZvbGRfaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JfQotCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmICghaW5mbykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpbmZvLT5za2JfcGFja2V0ID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKLQkJCQkJIHZpc19pbmZvX2xlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JaWYgKCFpbmZvLT5za2JfcGFja2V0KSB7Ci0JCWtmcmVlKGluZm8pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2tiX3Jlc2VydmUoaW5mby0+c2tiX3BhY2tldCwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2JfcHV0KGluZm8tPnNrYl9wYWNrZXQsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKwotCQkJCQkgICAgICB2aXNfaW5mb19sZW4pOwotCi0Ja3JlZl9pbml0KCZpbmZvLT5yZWZjb3VudCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluZm8tPnNlbmRfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluZm8tPnJlY3ZfbGlzdCk7Ci0JaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7Ci0JaW5mby0+YmF0X3ByaXYgPSBiYXRfcHJpdjsKLQltZW1jcHkocGFja2V0LCB2aXNfcGFja2V0LCBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsgdmlzX2luZm9fbGVuKTsKLQotCS8qIGluaXRpYWxpemUgYW5kIGFkZCBuZXcgcGFja2V0LiAqLwotCSppc19uZXcgPSAxOwotCi0JLyogTWFrZSBpdCBhIGJyb2FkY2FzdCBwYWNrZXQsIGlmIHJlcXVpcmVkICovCi0JaWYgKG1ha2VfYnJvYWRjYXN0KQotCQltZW1jcHkocGFja2V0LT50YXJnZXRfb3JpZywgYnJvYWRjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQotCS8qIHJlcGFpciBpZiBlbnRyaWVzIGlzIGxvbmdlciB0aGFuIHBhY2tldC4gKi8KLQlpZiAocGFja2V0LT5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSkgPiB2aXNfaW5mb19sZW4pCi0JCXBhY2tldC0+ZW50cmllcyA9IHZpc19pbmZvX2xlbiAvIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpOwotCi0JcmVjdl9saXN0X2FkZChiYXRfcHJpdiwgJmluZm8tPnJlY3ZfbGlzdCwgcGFja2V0LT5zZW5kZXJfb3JpZyk7Ci0KLQkvKiB0cnkgdG8gYWRkIGl0ICovCi0JaWYgKGhhc2hfYWRkKGJhdF9wcml2LT52aXNfaGFzaCwgaW5mbykgPCAwKSB7Ci0JCS8qIGRpZCBub3Qgd29yayAoZm9yIHNvbWUgcmVhc29uKSAqLwotCQlrcmVmX3B1dCgmb2xkX2luZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCQlpbmZvID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gaW5mbzsKLX0KLQotLyogaGFuZGxlIHRoZSBzZXJ2ZXIgc3luYyBwYWNrZXQsIGZvcndhcmQgaWYgbmVlZGVkLiAqLwotdm9pZCByZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAotCQkJCWludCB2aXNfaW5mb19sZW4pCi17Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvOwotCWludCBpc19uZXcsIG1ha2VfYnJvYWRjYXN0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHZpc19zZXJ2ZXIgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQotCW1ha2VfYnJvYWRjYXN0ID0gKHZpc19zZXJ2ZXIgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JaW5mbyA9IGFkZF9wYWNrZXQoYmF0X3ByaXYsIHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwKLQkJCSAgJmlzX25ldywgbWFrZV9icm9hZGNhc3QpOwotCWlmICghaW5mbykKLQkJZ290byBlbmQ7Ci0KLQkvKiBvbmx5IGlmIHdlIGFyZSBzZXJ2ZXIgb3Vyc2VsdmVzIGFuZCBwYWNrZXQgaXMgbmV3ZXIgdGhhbiB0aGUgb25lIGluCi0JICogaGFzaC4qLwotCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DICYmIGlzX25ldykKLQkJc2VuZF9saXN0X2FkZChiYXRfcHJpdiwgaW5mbyk7Ci1lbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogaGFuZGxlIGFuIGluY29taW5nIGNsaWVudCB1cGRhdGUgcGFja2V0IGFuZCBzY2hlZHVsZSBmb3J3YXJkIGlmIG5lZWRlZC4gKi8KLXZvaWQgcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCi0JCQkJICBpbnQgdmlzX2luZm9fbGVuKQotewotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCWludCBpc19uZXc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdmlzX3NlcnZlciA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCWludCBhcmVfdGFyZ2V0ID0gMDsKLQotCS8qIGNsaWVudHMgc2hhbGwgbm90IGJyb2FkY2FzdC4gKi8KLQlpZiAoaXNfYmNhc3QodmlzX3BhY2tldC0+dGFyZ2V0X29yaWcpKQotCQlyZXR1cm47Ci0KLQkvKiBBcmUgd2UgdGhlIHRhcmdldCBmb3IgdGhpcyBWSVMgcGFja2V0PyAqLwotCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DCSYmCi0JICAgIGlzX215X21hYyh2aXNfcGFja2V0LT50YXJnZXRfb3JpZykpCi0JCWFyZV90YXJnZXQgPSAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JaW5mbyA9IGFkZF9wYWNrZXQoYmF0X3ByaXYsIHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwKLQkJCSAgJmlzX25ldywgYXJlX3RhcmdldCk7Ci0KLQlpZiAoIWluZm8pCi0JCWdvdG8gZW5kOwotCS8qIG5vdGUgdGhhdCBvdXRkYXRlZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZCBhdCB0aGlzIHBvaW50LiAqLwotCi0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQotCS8qIHNlbmQgb25seSBpZiB3ZSdyZSB0aGUgdGFyZ2V0IHNlcnZlciBvciAuLi4gKi8KLQlpZiAoYXJlX3RhcmdldCAmJiBpc19uZXcpIHsKLQkJcGFja2V0LT52aXNfdHlwZSA9IFZJU19UWVBFX1NFUlZFUl9TWU5DOwkvKiB1cGdyYWRlISAqLwotCQlzZW5kX2xpc3RfYWRkKGJhdF9wcml2LCBpbmZvKTsKLQotCQkvKiAuLi4gd2UncmUgbm90IHRoZSByZWNpcGllbnQgKGFuZCB0aHVzIG5lZWQgdG8gZm9yd2FyZCkuICovCi0JfSBlbHNlIGlmICghaXNfbXlfbWFjKHBhY2tldC0+dGFyZ2V0X29yaWcpKSB7Ci0JCXNlbmRfbGlzdF9hZGQoYmF0X3ByaXYsIGluZm8pOwotCX0KLQotZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIFdhbGsgdGhlIG9yaWdpbmF0b3JzIGFuZCBmaW5kIHRoZSBWSVMgc2VydmVyIHdpdGggdGhlIGJlc3QgdHEuIFNldCB0aGUgcGFja2V0Ci0gKiBhZGRyZXNzIHRvIGl0cyBhZGRyZXNzIGFuZCByZXR1cm4gdGhlIGJlc3RfdHEuCi0gKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgb3JpZ2luYXRvciBoYXNoIGxvY2tlZCAqLwotc3RhdGljIGludCBmaW5kX2Jlc3RfdmlzX3NlcnZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCXN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlIQVNISVQoaGFzaGl0KTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQlpbnQgYmVzdF90cSA9IC0xOwotCi0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQkJaWYgKChvcmlnX25vZGUpICYmIChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkJICAgIChvcmlnX25vZGUtPmZsYWdzICYgVklTX1NFUlZFUikgJiYKLQkJICAgIChvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnID4gYmVzdF90cSkpIHsKLQkJCWJlc3RfdHEgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOwotCQkJbWVtY3B5KHBhY2tldC0+dGFyZ2V0X29yaWcsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCQl9Ci0JfQotCXJldHVybiBiZXN0X3RxOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmlzIHBhY2tldCBpcyBmdWxsLiAqLwotc3RhdGljIGJvb2wgdmlzX3BhY2tldF9mdWxsKHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0KLQlpZiAoTUFYX1ZJU19QQUNLRVRfU0laRSAvIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpCi0JCTwgcGFja2V0LT5lbnRyaWVzICsgMSkKLQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiBnZW5lcmF0ZXMgYSBwYWNrZXQgb2Ygb3duIHZpcyBkYXRhLAotICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGlmIG5vIHBhY2tldCBjb3VsZCBiZSBnZW5lcmF0ZWQgKi8KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfdmlzX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUhBU0hJVChoYXNoaXRfbG9jYWwpOwotCUhBU0hJVChoYXNoaXRfZ2xvYmFsKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvID0gKHN0cnVjdCB2aXNfaW5mbyAqKWJhdF9wcml2LT5teV92aXNfaW5mbzsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQlzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJ5OwotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlpbnQgYmVzdF90cSA9IC0xOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpbmZvLT5maXJzdF9zZWVuID0gamlmZmllczsKLQlwYWNrZXQtPnZpc190eXBlID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JbWVtY3B5KHBhY2tldC0+dGFyZ2V0X29yaWcsIGJyb2FkY2FzdF9hZGRyLCBFVEhfQUxFTik7Ci0JcGFja2V0LT50dGwgPSBUVEw7Ci0JcGFja2V0LT5zZXFubyA9IGh0b25sKG50b2hsKHBhY2tldC0+c2Vxbm8pICsgMSk7Ci0JcGFja2V0LT5lbnRyaWVzID0gMDsKLQlza2JfdHJpbShpbmZvLT5za2JfcGFja2V0LCBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQotCWlmIChwYWNrZXQtPnZpc190eXBlID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpIHsKLQkJYmVzdF90cSA9IGZpbmRfYmVzdF92aXNfc2VydmVyKGJhdF9wcml2LCBpbmZvKTsKLQotCQlpZiAoYmVzdF90cSA8IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdF9nbG9iYWwpKSB7Ci0JCW9yaWdfbm9kZSA9IGhhc2hpdF9nbG9iYWwuYnVja2V0LT5kYXRhOwotCi0JCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgb3JpZ19ub2RlLT5vcmlnKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCQljb250aW51ZTsKLQotCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA8IDEpCi0JCQljb250aW51ZTsKLQotCQkvKiBmaWxsIG9uZSBlbnRyeSBpbnRvIGJ1ZmZlci4gKi8KLQkJZW50cnkgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCi0JCQkJc2tiX3B1dChpbmZvLT5za2JfcGFja2V0LCBzaXplb2YoKmVudHJ5KSk7Ci0JCW1lbWNweShlbnRyeS0+c3JjLAotCQkgICAgICAgb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkciwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGVudHJ5LT5kZXN0LCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKLQkJZW50cnktPnF1YWxpdHkgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOwotCQlwYWNrZXQtPmVudHJpZXMrKzsKLQotCQlpZiAodmlzX3BhY2tldF9mdWxsKGluZm8pKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAotCQkJCQkmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCAmaGFzaGl0X2xvY2FsKSkgewotCQlobmFfbG9jYWxfZW50cnkgPSBoYXNoaXRfbG9jYWwuYnVja2V0LT5kYXRhOwotCQllbnRyeSA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKilza2JfcHV0KGluZm8tPnNrYl9wYWNrZXQsCi0JCQkJCQkJIHNpemVvZigqZW50cnkpKTsKLQkJbWVtc2V0KGVudHJ5LT5zcmMsIDAsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGVudHJ5LT5kZXN0LCBobmFfbG9jYWxfZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKLQkJZW50cnktPnF1YWxpdHkgPSAwOyAvKiAwIG1lYW5zIEhOQSAqLwotCQlwYWNrZXQtPmVudHJpZXMrKzsKLQotCQlpZiAodmlzX3BhY2tldF9mdWxsKGluZm8pKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi0vKiBmcmVlIG9sZCB2aXMgcGFja2V0cy4gTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGlzIHZpc19oYXNoX2xvY2sKLSAqIGhlbGQgKi8KLXN0YXRpYyB2b2lkIHB1cmdlX3Zpc19wYWNrZXRzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+dmlzX2hhc2gsICZoYXNoaXQpKSB7Ci0JCWluZm8gPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCS8qIG5ldmVyIHB1cmdlIG93biBkYXRhLiAqLwotCQlpZiAoaW5mbyA9PSBiYXRfcHJpdi0+bXlfdmlzX2luZm8pCi0JCQljb250aW51ZTsKLQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQkJICAgICAgIGluZm8tPmZpcnN0X3NlZW4gKyBWSVNfVElNRU9VVCAqIEhaKSkgewotCQkJaGFzaF9yZW1vdmVfYnVja2V0KGJhdF9wcml2LT52aXNfaGFzaCwgJmhhc2hpdCk7Ci0JCQlzZW5kX2xpc3RfZGVsKGluZm8pOwotCQkJa3JlZl9wdXQoJmluZm8tPnJlZmNvdW50LCBmcmVlX2luZm8pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicm9hZGNhc3RfdmlzX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSBzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQl1aW50OF90IGRzdGFkZHJbRVRIX0FMRU5dOwotCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQotCS8qIHNlbmQgdG8gYWxsIHJvdXRlcnMgaW4gcmFuZ2UuICovCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCS8qIGlmIGl0J3MgYSB2aXMgc2VydmVyIGFuZCByZWFjaGFibGUsIHNlbmQgaXQuICovCi0JCWlmICgoIW9yaWdfbm9kZSkgfHwgKCFvcmlnX25vZGUtPnJvdXRlcikpCi0JCQljb250aW51ZTsKLQkJaWYgKCEob3JpZ19ub2RlLT5mbGFncyAmIFZJU19TRVJWRVIpKQotCQkJY29udGludWU7Ci0JCS8qIGRvbid0IHNlbmQgaXQgaWYgd2UgYWxyZWFkeSByZWNlaXZlZCB0aGUgcGFja2V0IGZyb20KLQkJICogdGhpcyBub2RlLiAqLwotCQlpZiAocmVjdl9saXN0X2lzX2luKGJhdF9wcml2LCAmaW5mby0+cmVjdl9saXN0LAotCQkJCQkJCW9yaWdfbm9kZS0+b3JpZykpCi0JCQljb250aW51ZTsKLQotCQltZW1jcHkocGFja2V0LT50YXJnZXRfb3JpZywgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCXNrYiA9IHNrYl9jbG9uZShpbmZvLT5za2JfcGFja2V0LCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNrYikKLQkJCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVuaWNhc3RfdmlzX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwKLQkJCQkJCSAgIHBhY2tldC0+dGFyZ2V0X29yaWcpKTsKLQotCWlmICgoIW9yaWdfbm9kZSkgfHwgKCFvcmlnX25vZGUtPnJvdXRlcikpCi0JCWdvdG8gb3V0OwotCi0JLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nOwotCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jc2tiID0gc2tiX2Nsb25lKGluZm8tPnNrYl9wYWNrZXQsIEdGUF9BVE9NSUMpOwotCWlmIChza2IpCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0KLQlyZXR1cm47Ci0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogb25seSBzZW5kIG9uZSB2aXMgcGFja2V0LiBjYWxsZWQgZnJvbSBzZW5kX3Zpc19wYWNrZXRzKCkgKi8KLXN0YXRpYyB2b2lkIHNlbmRfdmlzX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3QgdmlzX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0JaWYgKHBhY2tldC0+dHRsIDwgMikgewotCQlwcl9kZWJ1ZygiRXJyb3IgLSBjYW4ndCBzZW5kIHZpcyBwYWNrZXQ6IHR0bCBleGNlZWRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkocGFja2V0LT5zZW5kZXJfb3JpZywgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLAotCSAgICAgICBFVEhfQUxFTik7Ci0JcGFja2V0LT50dGwtLTsKLQotCWlmIChpc19iY2FzdChwYWNrZXQtPnRhcmdldF9vcmlnKSkKLQkJYnJvYWRjYXN0X3Zpc19wYWNrZXQoYmF0X3ByaXYsIGluZm8pOwotCWVsc2UKLQkJdW5pY2FzdF92aXNfcGFja2V0KGJhdF9wcml2LCBpbmZvKTsKLQlwYWNrZXQtPnR0bCsrOyAvKiByZXN0b3JlIFRUTCAqLwotfQotCi0vKiBjYWxsZWQgZnJvbSB0aW1lcjsgc2VuZCAoYW5kIG1heWJlIGdlbmVyYXRlKSB2aXMgcGFja2V0LiAqLwotc3RhdGljIHZvaWQgc2VuZF92aXNfcGFja2V0cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPQotCQljb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgYmF0X3ByaXYsIHZpc193b3JrKTsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8sICp0ZW1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQlwdXJnZV92aXNfcGFja2V0cyhiYXRfcHJpdik7Ci0KLQlpZiAoZ2VuZXJhdGVfdmlzX3BhY2tldChiYXRfcHJpdikgPT0gMCkgewotCQkvKiBzY2hlZHVsZSBpZiBnZW5lcmF0aW9uIHdhcyBzdWNjZXNzZnVsICovCi0JCXNlbmRfbGlzdF9hZGQoYmF0X3ByaXYsIGJhdF9wcml2LT5teV92aXNfaW5mbyk7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGluZm8sIHRlbXAsICZiYXRfcHJpdi0+dmlzX3NlbmRfbGlzdCwKLQkJCQkgc2VuZF9saXN0KSB7Ci0KLQkJa3JlZl9nZXQoJmluZm8tPnJlZmNvdW50KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCQlzZW5kX3Zpc19wYWNrZXQoYmF0X3ByaXYsIGluZm8pOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCQlzZW5kX2xpc3RfZGVsKGluZm8pOwotCQlrcmVmX3B1dCgmaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jc3RhcnRfdmlzX3RpbWVyKGJhdF9wcml2KTsKLX0KLQotLyogaW5pdCB0aGUgdmlzIHNlcnZlci4gdGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiBpZl9saXN0IGlzIGFscmVhZHkKLSAqIGluaXRpYWxpemVkIChlLmcuIGJhdDAgaXMgaW5pdGlhbGl6ZWQsIGludGVyZmFjZXMgaGF2ZSBiZWVuIGFkZGVkKSAqLwotaW50IHZpc19pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGJhdF9wcml2LT52aXNfaGFzaCkKLQkJcmV0dXJuIDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWJhdF9wcml2LT52aXNfaGFzaCA9IGhhc2hfbmV3KDI1NiwgdmlzX2luZm9fY21wLCB2aXNfaW5mb19jaG9vc2UpOwotCWlmICghYmF0X3ByaXYtPnZpc19oYXNoKSB7Ci0JCXByX2VycigiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXNfaGFzaFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJhdF9wcml2LT5teV92aXNfaW5mbyA9IGttYWxsb2MoTUFYX1ZJU19QQUNLRVRfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFiYXRfcHJpdi0+bXlfdmlzX2luZm8pIHsKLQkJcHJfZXJyKCJDYW4ndCBpbml0aWFsaXplIHZpcyBwYWNrZXRcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQliYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKAotCQkJCQkJc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArCi0JCQkJCQlNQVhfVklTX1BBQ0tFVF9TSVpFICsKLQkJCQkJCXNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JaWYgKCFiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQpCi0JCWdvdG8gZnJlZV9pbmZvOwotCi0Jc2tiX3Jlc2VydmUoYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0LCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoCi0JCQkJCWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSk7Ci0KLQkvKiBwcmVmaWxsIHRoZSB2aXMgaW5mbyAqLwotCWJhdF9wcml2LT5teV92aXNfaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXMgLQotCQkJCQkJbXNlY3NfdG9famlmZmllcyhWSVNfSU5URVJWQUwpOwotCUlOSVRfTElTVF9IRUFEKCZiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnJlY3ZfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmJhdF9wcml2LT5teV92aXNfaW5mby0+c2VuZF9saXN0KTsKLQlrcmVmX2luaXQoJmJhdF9wcml2LT5teV92aXNfaW5mby0+cmVmY291bnQpOwotCWJhdF9wcml2LT5teV92aXNfaW5mby0+YmF0X3ByaXYgPSBiYXRfcHJpdjsKLQlwYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQlwYWNrZXQtPnBhY2tldF90eXBlID0gQkFUX1ZJUzsKLQlwYWNrZXQtPnR0bCA9IFRUTDsKLQlwYWNrZXQtPnNlcW5vID0gMDsKLQlwYWNrZXQtPmVudHJpZXMgPSAwOwotCi0JSU5JVF9MSVNUX0hFQUQoJmJhdF9wcml2LT52aXNfc2VuZF9saXN0KTsKLQotCWlmIChoYXNoX2FkZChiYXRfcHJpdi0+dmlzX2hhc2gsIGJhdF9wcml2LT5teV92aXNfaW5mbykgPCAwKSB7Ci0JCXByX2VycigiQ2FuJ3QgYWRkIG93biB2aXMgcGFja2V0IGludG8gaGFzaFxuIik7Ci0JCS8qIG5vdCBpbiBoYXNoLCBuZWVkIHRvIHJlbW92ZSBpdCBtYW51YWxseS4gKi8KLQkJa3JlZl9wdXQoJmJhdF9wcml2LT5teV92aXNfaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jc3RhcnRfdmlzX3RpbWVyKGJhdF9wcml2KTsKLQlyZXR1cm4gMTsKLQotZnJlZV9pbmZvOgotCWtmcmVlKGJhdF9wcml2LT5teV92aXNfaW5mbyk7Ci0JYmF0X3ByaXYtPm15X3Zpc19pbmZvID0gTlVMTDsKLWVycjoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCXZpc19xdWl0KGJhdF9wcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIGhhc2ggaXRlbSBpbmZvICovCi1zdGF0aWMgdm9pZCBmcmVlX2luZm9fcmVmKHZvaWQgKmRhdGEsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8gPSBkYXRhOwotCi0Jc2VuZF9saXN0X2RlbChpbmZvKTsKLQlrcmVmX3B1dCgmaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci19Ci0KLS8qIHNodXRkb3duIHZpcy1zZXJ2ZXIgKi8KLXZvaWQgdmlzX3F1aXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWlmICghYmF0X3ByaXYtPnZpc19oYXNoKQotCQlyZXR1cm47Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJhdF9wcml2LT52aXNfd29yayk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQkvKiBwcm9wZXJseSByZW1vdmUsIGtpbGwgdGltZXJzIC4uLiAqLwotCWhhc2hfZGVsZXRlKGJhdF9wcml2LT52aXNfaGFzaCwgZnJlZV9pbmZvX3JlZiwgTlVMTCk7Ci0JYmF0X3ByaXYtPnZpc19oYXNoID0gTlVMTDsKLQliYXRfcHJpdi0+bXlfdmlzX2luZm8gPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHNjaGVkdWxlIHBhY2tldHMgZm9yIChyZSl0cmFuc21pc3Npb24gKi8KLXN0YXRpYyB2b2lkIHN0YXJ0X3Zpc190aW1lcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUlOSVRfREVMQVlFRF9XT1JLKCZiYXRfcHJpdi0+dmlzX3dvcmssIHNlbmRfdmlzX3BhY2tldHMpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmYmF0X3ByaXYtPnZpc193b3JrLAotCQkJICAgbXNlY3NfdG9famlmZmllcyhWSVNfSU5URVJWQUwpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjM2IzMzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBTaW1vbiBXdW5kZXJsaWNoLCBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfVklTX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9WSVNfSF8KLQotI2RlZmluZSBWSVNfVElNRU9VVAkJMjAwCS8qIHRpbWVvdXQgb2YgdmlzIHBhY2tldHMgaW4gc2Vjb25kcyAqLwotCi1pbnQgdmlzX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotdm9pZCByZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAotCQkJCWludCB2aXNfaW5mb19sZW4pOwotdm9pZCByZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICBzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKLQkJCQkgIGludCB2aXNfaW5mb19sZW4pOwotaW50IHZpc19pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotdm9pZCB2aXNfcXVpdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9WSVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQWRhcHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9BZGFwdGVyLmgKaW5kZXggNzQ4NDYwZS4uMzI5MDllMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9BZGFwdGVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9BZGFwdGVyLmgKQEAgLTcsNTMgKzcsNiBAQAogI2RlZmluZSBNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVMgMjU2CiAjaW5jbHVkZSAiRGVidWcuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUll7Ci0Jc3RydWN0IF9MSVNUX0VOVFJZIAkqbmV4dDsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgCSpwcmV2OwotfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9CQ01fTElTVF9FTlRSWSB7Ci0KLSAgICBMSVNUX0VOVFJZICAJCUxpbms7Ci0KLX0gQkNNX0xJU1RfRU5UUlksICpQQkNNX0xJU1RfRU5UUlk7Ci0KLXR5cGVkZWYgZW51bSBfUkNCX1NUQVRVUwotewotCURSSVZFUl9QUk9DRVNTRUQ9MSwKLQlBUFBMSUNBVElPTl9QUk9DRVNTRUQKLX0gUkNCX1NUQVRVUywgKlBSQ0JfU1RBVFVTOwotCi0jZGVmaW5lIGZGSUxMRUQgMQotI2RlZmluZSBmRU1QVFkgMAotCi1zdHJ1Y3QgX0JDTV9DQgotewotCS8vIFRoZSBuZXR3b3JrIHBhY2tldCB0aGF0IHRoaXMgUkNCIGlzIHJlY2VpdmluZwotCVBWT0lEICAgICAgCQkJcHZfcGFja2V0OwotCS8vIERlc2NyaWJlcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgLgotCVVJTlQgICAgICAgICAgICAgICAgdWlfcGFja2V0X2xlbmd0aDsKLQkvLyBQb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgaW4gdGhlIHBhY2tldCAob25seSBvbmUgYnVmZmVyIGZvciBSeCkKLQlQVUNIQVIJCQkJYnVmZmVyOwotCWF0b21pY190CSAgICAgICAgc3RhdHVzOwotCVVJTlQJICAgICAgICAgICAgZmlsbGVkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLXR5cGVkZWYgc3RydWN0IF9CQ01fQ0IgQkNNX0NCLCpQQkNNX0NCOwotCi10eXBlZGVmIEJDTV9DQiBCQ01fUkNCLCAqUEJDTV9SQ0I7Ci10eXBlZGVmIEJDTV9DQiBCQ01fVENCLCAqUEJDTV9UQ0I7Ci0KLS8qIFRoaXMgaXMgdG8gYmUgc3RvcmVkIGluIHRoZSAicHZPc0RlcERhdGEiIG9mIEFEQVBURVIgKi8KLXR5cGVkZWYgc3RydWN0IExJTlVYX0RFUF9EQVRBCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJCSp2aXJ0dWFsZGV2OwkvKiBPdXIgSW50ZXJmYWNlICh2ZXRoMCkgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZQkJKmFjdHVhbGRldjsJLyogVHJ1ZSBJbnRlcmZhY2UgKGV0aDApICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0c3RhdHM7CS8qIE5ldCBzdGF0aXN0aWNzICovCi0Jc3RydWN0IGZhc3luY19zdHJ1Y3QJKmFzeW5jX3F1ZXVlOwkvKiBGb3IgYXN5bmNocm9udXMgbm90aWZpY2F0aW9uICovCi0KLX0gTElOVVhfREVQX0RBVEEsICpQTElOVVhfREVQX0RBVEE7Ci0KLQogc3RydWN0IF9MRUFERVIKIHsKIAlVU0hPUlQgCVZjaWQ7CkBAIC00MjksMjYgKzM4MiwyOCBAQAogc3RydWN0IF9NSU5JX0FEQVBURVIKIHsKIAlzdHJ1Y3QgX01JTklfQURBUFRFUiAqbmV4dDsKLQlQVk9JRAkJCSAgICBwdk9zRGVwRGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXUzMgkJCW1zZ19lbmFibGU7CisKIAlDSEFSICAgICAgICAgICAgICAgICpjYURzeFJlcVJlc3A7Ci0JYXRvbWljX3QJCQlBcHBsaWNhdGlvblJ1bm5pbmc7CisJYXRvbWljX3QJCUFwcGxpY2F0aW9uUnVubmluZzsKIAl2b2xhdGlsZSBJTlQJCUN0cmxRdWV1ZUxlbjsKLQlhdG9taWNfdCAgICAgICAgICAgIEFwcEN0cmxRdWV1ZUxlbjsKLQlCT09MRUFOICAgICAgICAgICAgIEFwcEN0cmxRdWV1ZU92ZXJGbG93OwotCWF0b21pY190CQkJQ3VycmVudEFwcGxpY2F0aW9uQ291bnQ7Ci0JYXRvbWljX3QgCQkJUmVnaXN0ZXJlZEFwcGxpY2F0aW9uQ291bnQ7Ci0JQk9PTEVBTgkJCSAgICBUaW1lckFjdGl2ZTsKLQlVTE9ORwkJCQlTdGF0aXN0aWNzUG9pbnRlcjsKKwlhdG9taWNfdCAgICAgICAgICAgIAlBcHBDdHJsUXVldWVMZW47CisJQk9PTEVBTiAgICAgICAgICAgICAJQXBwQ3RybFF1ZXVlT3ZlckZsb3c7CisJYXRvbWljX3QJCUN1cnJlbnRBcHBsaWNhdGlvbkNvdW50OworCWF0b21pY190IAkJUmVnaXN0ZXJlZEFwcGxpY2F0aW9uQ291bnQ7CisJQk9PTEVBTgkJICAJTGlua1VwU3RhdHVzOworCUJPT0xFQU4JCSAgICAJVGltZXJBY3RpdmU7CisJdTMyCQkJU3RhdGlzdGljc1BvaW50ZXI7CiAJc3RydWN0IHNrX2J1ZmYJCSpSeENvbnRyb2xIZWFkOwogCXN0cnVjdCBza19idWZmCQkqUnhDb250cm9sVGFpbDsKLS8vCXNwaW5sb2NrX3QJCQlSeENvbnRyb2xRdWV1ZWxvY2s7CisKIAlzdHJ1Y3Qgc2VtYXBob3JlCVJ4QXBwQ29udHJvbFF1ZXVlbG9jazsKIAlzdHJ1Y3Qgc2VtYXBob3JlCWZ3X2Rvd25sb2FkX3NlbWE7CiAKIAlQUEVSX1RBUkFOR19EQVRBICAgIHBUYXJhbmdzOwogCXNwaW5sb2NrX3QJCQljb250cm9sX3F1ZXVlX2xvY2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJcHJvY2Vzc19yZWFkX3dhaXRfcXVldWU7Ci0JVUxPTkcJCSAgICAJYmNtX2ppZmZpZXM7CS8qIFN0b3JlIEppZmZpZXMgdmFsdWUgKi8KIAogCS8vIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBwYWNrZXQgd2UgaGF2ZSBxdWV1ZWQgaW4gc2VuZAogCS8vIGRlc2VyaWFsaXplZCBtaW5pcG9ydCBzdXBwb3J0IHZhcmlhYmxlcwpAQCAtNDU4LDI0ICs0MTMsMTUgQEAKIAkvLyB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIFR4IGFuZCBSeCBNYWlsQm94IFJlZ2lzdGVycy4KIAlhdG9taWNfdAkJICAgIEN1cnJOdW1GcmVlVHhEZXNjOwogCS8vIHRvIGtlZXAgdHJhY2sgdGhlIG5vIG9mIGJ5dGUgcmVjaWV2ZWQKLQlhdG9taWNfdAkJCVJ4Um9sbE92ZXJDb3VudDsKIAlVU0hPUlQJCQkJUHJldk51bVJlY3ZEZXNjczsKIAlVU0hPUlQJCQkJQ3Vyck51bVJlY3ZEZXNjczsKLQlhdG9taWNfdAkJCUdvb2RSeEJ5dGVDb3VudDsKLQlhdG9taWNfdAkJCUdvb2RSeFBrdENvdW50OwotCWF0b21pY190CQkJQmFkUnhCeXRlQ291bnQ7Ci0JYXRvbWljX3QJCQlSeFBhY2tldERyb3BwZWRDb3VudDsKLQlhdG9taWNfdAkJCUdvb2RUeEJ5dGVDb3VudDsKLQlhdG9taWNfdAkJCVR4VG90YWxQYWNrZXRDb3VudDsKLQlhdG9taWNfdAkJCVR4RHJvcHBlZFBhY2tldENvdW50OwotCVVMT05HCQkJICAgCUxpbmtVcFN0YXR1czsKLQlCT09MRUFOCQkJICAgIFRyYW5zZmVyTW9kZTsKIAlVSU5UCQkJCXUzMlRvdGFsRFNEOwogCVBhY2tldEluZm8JCSAgICBQYWNrSW5mb1tOT19PRl9RVUVVRVNdOwogCVNfQ0xBU1NJRklFUl9SVUxFCWFzdENsYXNzaWZpZXJUYWJsZVtNQVhfQ0xBU1NJRklFUlNdOworCUJPT0xFQU4JCQkgICAgVHJhbnNmZXJNb2RlOwogCiAJLyoqKioqKioqKioqKioqKiBxb3MgKioqKioqKioqKioqKioqKioqLwotCVVJTlQJCQkJYkVUSENTRW5hYmxlZDsKKwlCT09MRUFOCQkJICAgIGJFVEhDU0VuYWJsZWQ7CiAKIAlVTE9ORwkJCSAgICBCRUJ1Y2tldFNpemU7CiAJVUxPTkcJCQkgICAgcnRQU0J1Y2tldFNpemU7CkBAIC00ODMsNyArNDI5LDYgQEAKIAlCT09MRUFOCQkJICAgIEF1dG9MaW5rVXA7CiAJQk9PTEVBTgkJCSAgICBBdXRvU3luY3VwOwogCi0Jc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlpbnQJCQkJbWFqb3I7CiAJaW50CQkJCW1pbm9yOwogCXdhaXRfcXVldWVfaGVhZF90IAl0eF9wYWNrZXRfd2FpdF9xdWV1ZTsKQEAgLTQ5MSw4ICs0MzYsNiBAQAogCWF0b21pY190CQkJcHJvY2Vzc193YWl0aW5nOwogCUJPT0xFQU4gCQkJZndfZG93bmxvYWRfZG9uZTsKIAotCXVuc2lnbmVkIGludAkJY3RybHBrdF9wcmVzZW50OwotCUJPT0xFQU4gCQkJcGFja2V0c19naXZlbl90b19hbGw7CiAJY2hhciAJCQkJKnR4Y3RscGFja2V0W01BWF9DTlRSTF9QS1RTXTsKIAlhdG9taWNfdAkJCWNudHJscGt0Q250IDsKIAlhdG9taWNfdAkJCWluZGV4X2FwcF9yZWFkX2NudHJscGt0OwpAQCAtNTAyLDM0ICs0NDUsMzAgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlIAlyZG13cm1zeW5jOwogCiAJU1RUQVJHRVREU1hCVUZGRVIJYXN0VGFyZ2V0RHN4QnVmZmVyW01BWF9UQVJHRVRfRFNYX0JVRkZFUlNdOwotCVVMT05HCQkJCXVsRnJlZVRhcmdldEJ1ZmZlckNudDsKKwlVTE9ORwkJCXVsRnJlZVRhcmdldEJ1ZmZlckNudDsKIAlVTE9ORyAgICAgICAgICAgICAgCXVsQ3VycmVudFRhcmdldEJ1ZmZlcjsKIAlVTE9ORyAgICAgICAgICAgICAgCXVsVG90YWxUYXJnZXRCdWZmZXJzQXZhaWxhYmxlOwotCXVuc2lnbmVkIGludAkJdGltZW91dDsKLQlpbnQgCQkJCWlycTsKKwogCXVuc2lnbmVkIGxvbmcgCQljaGlwX2lkOwotCXVuc2lnbmVkIGludAkJYkZsYXNoQm9vdDsKLQl1bnNpZ25lZCBpbnQgCQlpZl91cDsKLS8vCXNwaW5sb2NrX3QJCQlzbGVlcGVyX2xvY2s7Ci0JYXRvbWljX3QJCQlyZG1fd3JtX2FjY2VzczsKLQlhdG9taWNfdAkJCXR4X3J4X2FjY2VzczsKKwogCXdhaXRfcXVldWVfaGVhZF90IAlsb3dwb3dlcl9tb2RlX3dhaXRfcXVldWU7Ci0JYXRvbWljX3QJCQliQWJvcnRlZEJ5SG9zdDsKLQlCT09MRUFOCQkJCWJCaW5Eb3dubG9hZGVkOwotCUJPT0xFQU4JCQkJYkNmZ0Rvd25sb2FkZWQ7Ci0JVVNIT1JUCQkJCXVzQmVzdEVmZm9ydFF1ZXVlSW5kZXg7Ci0JQk9PTEVBTgkJCQliU3luY1VwUmVxdWVzdFNlbnQ7Ci0vLwlzdHJ1Y3Qgc2VtYXBob3JlIAlkYXRhX3BhY2tldF9xdWV1ZV9sb2NrOworCisJQk9PTEVBTgkJCWJGbGFzaEJvb3Q7CisJQk9PTEVBTgkJCWJCaW5Eb3dubG9hZGVkOworCUJPT0xFQU4JCQliQ2ZnRG93bmxvYWRlZDsKKwlCT09MRUFOCQkJYlN5bmNVcFJlcXVlc3RTZW50OworCVVTSE9SVAkJCXVzQmVzdEVmZm9ydFF1ZXVlSW5kZXg7CisKIAl3YWl0X3F1ZXVlX2hlYWRfdCAJaW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlOwogCUJPT0xFQU4JCQkJd2FpdGluZ190b19md19kb3dubG9hZF9kb25lOwogCXBpZF90CQkJCWZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkOwogCVBTVEFSR0VUUEFSQU1TCQlwc3RhcmdldHBhcmFtczsKIAlCT09MRUFOCQkJCWRldmljZV9yZW1vdmVkOwogCUJPT0xFQU4JCQkJRGV2aWNlQWNjZXNzOwotCUlOVAkJCQkJRERSU2V0dGluZzsKLQlCT09MRUFOCQkJCWJERFJJbml0RG9uZTsKLQlVTE9ORwkJCQl1bFBvd2VyU2F2ZU1vZGU7CiAJQk9PTEVBTgkJCQliSXNBdXRvQ29ycmVjdEVuYWJsZWQ7CisJQk9PTEVBTgkJCQliRERSSW5pdERvbmU7CisJSU5UCQkJCUREUlNldHRpbmc7CisJVUxPTkcJCQkJdWxQb3dlclNhdmVNb2RlOwogCXNwaW5sb2NrX3QJCQl0eHRyYW5zbWl0bG9jazsKIAlCX1VJTlQ4CQkJCXR4dHJhbnNtaXRfcnVubmluZzsKIAkvKiBUaHJlYWQgZm9yIGNvbnRyb2wgcGFja2V0IGhhbmRsaW5nICovCkBAIC01NjcsMTMgKzUwNiwxMyBAQAogCXVuc2lnbmVkIGludAl1c0lkbGVNb2RlUGF0dGVybjsKIAkvL0JPT0xFQU4JCQliVHJpZWRUb1dha2VVcEZyb21TaHV0ZG93bjsKIAlCT09MRUFOCQkJYkxpbmtEb3duUmVxdWVzdGVkOwotCXVuc2lnbmVkIGludAljaGVja19mb3JfaGFuZzsKKwogCWludCAJCQlkb3dubG9hZEREUjsKIAlQSFNfREVWSUNFX0VYVEVOU0lPTiBzdEJDTVBoc0NvbnRleHQ7CiAJU19IRFJfU1VQUkVTU0lPTl9DT05URVhUSU5GTwlzdFBoc1R4Q29udGV4dEluZm87CiAJdWludDhfdAkJCXVjYVBIU1BrdFJlc3RvcmVCdWZbMjA0OF07CiAJdWludDhfdAkJCWJQSFNFbmFibGVkOwotCWludCAJCQlBdXRvRmlybURsZDsKKwlCT09MRUFOCQkJQXV0b0Zpcm1EbGQ7CiAJQk9PTEVBTiAgICAgICAgIGJNaXBzQ29uZmlnOwogCUJPT0xFQU4gICAgICAgICBiRFBMTENvbmZpZzsKIAlVSU5UMzIJCQlhVHhQa3RTaXplSGlzdFtNSUJTX01BWF9ISVNUX0VOVFJJRVNdOwpAQCAtNTk5LDEwICs1MzgsOSBAQAogCiAKIAlzdHJ1Y3Qgc2VtYXBob3JlCU5WTVJkbVdybUxvY2s7Ci0JQk9PTEVBTgkJCWJOZXR3b3JrSW50ZXJmYWNlUmVnaXN0ZXJlZDsKLQlCT09MRUFOCQkJYk5ldGRldmljZU5vdGlmaWVyUmVnaXN0ZXJlZDsKKwogCXN0cnVjdCBkZXZpY2UgKnBzdENyZWF0ZWRDbGFzc0RldmljZTsKLQlCT09MRUFOCQkJYlVzYkNsYXNzRHJpdmVyUmVnaXN0ZXJlZDsKKwogLy8JQk9PTEVBTgkJCQlJbnRlcmZhY2VVcFN0YXR1czsKIAlQRkxBU0gyWF9DU19JTkZPIHBzRmxhc2gyeENTSW5mbzsKIAlQRkxBU0hfQ1NfSU5GTyBwc0ZsYXNoQ1NJbmZvIDsKQEAgLTYzMCwxNyArNTY4LDEzIEBACiAJc3RydWN0IHNlbWFwaG9yZQlMb3dQb3dlck1vZGVTeW5jOwogCVVMT05HCWxpRHJhaW5DYWxjdWxhdGVkOwogCVVJTlQgZ3Bpb0JpdE1hcDsKKwogICAgIFNfQkNNX0RFQlVHX1NUQVRFIHN0RGVidWdTdGF0ZTsKIAogfTsKIHR5cGVkZWYgc3RydWN0IF9NSU5JX0FEQVBURVIgTUlOSV9BREFQVEVSLCAqUE1JTklfQURBUFRFUjsKIAotCi10eXBlZGVmIHN0cnVjdCBfREVWSUNFX0VYVEVOU0lPTgotewotCVBNSU5JX0FEQVBURVIgcEFkYXB0OwotfURFVklDRV9FWFRFTlNJT04sKlBERVZJQ0VfRVhURU5TSU9OOwotCisjZGVmaW5lIEdFVF9CQ01fQURBUFRFUihuZXRfZGV2KQluZXRkZXZfcHJpdihuZXRfZGV2KQogCiBzdHJ1Y3QgX0VUSF9IRUFERVJfU1RSVUMgewogICAgIFVDSEFSICAgICAgIGF1OERlc3RpbmF0aW9uQWRkcmVzc1s2XTsKQEAgLTY2Nyw4ICs2MDEsOCBAQAogCiB0eXBlZGVmIHN0cnVjdCBfRERSX1NFVFRJTkcKIHsKLQlVTE9ORyB1bFJlZ0FkZHJlc3M7Ci0JVUxPTkcgdWxSZWdWYWx1ZTsKKwlVSU5UIHVsUmVnQWRkcmVzczsKKwlVSU5UIHVsUmVnVmFsdWU7CiB9RERSX1NFVFRJTkcsICpQRERSX1NFVFRJTkc7CiB0eXBlZGVmIEREUl9TRVRUSU5HIEREUl9TRVRfTk9ERSwgKlBERFJfU0VUX05PREU7CiBJTlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQXJwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0FycC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBkODU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0KLS8qCi0gKiBGaWxlIE5hbWU6IEFycC5jCi0gKiBBYnN0cmFjdDogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByb3V0aW5lcyBmb3IgaGFuZGxpbmcgQVJQIFBBQ0tFVFMKLSAqLwotI2luY2x1ZGUgImhlYWRlcnMuaCIKLSNkZWZpbmUJQVJQX1BLVF9TSVpFCTYwCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZ1bmN0aW9uICAgIC0gcmVwbHlfdG9fYXJwX3JlcXVlc3QoKQotICoKLSAqIERlc2NyaXB0aW9uIC0gV2hlbiB0aGlzIGhvc3QgdHJpZXMgdG8gYnJvYWRjYXN0IEFSUCByZXF1ZXN0IHBhY2tldCB0aHJvdWdoCi0gKgkJIAkJIHRoZSB2aXJ0dWFsIGludGVyZmFjZSAodmV0aDApLCByZXBseSBkaXJlY3RseSB0byB1cHBlciBsYXllci4KLSAqCQkgCQkgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgc2tiIGZvciBBUlAgcmVwbHkgcGFja2V0LAotICoJCSAJCSBmaWxscyBpbiB0aGUgZmllbGRzIG9mIHRoZSBwYWNrZXQgYW5kIHRoZW4gc2VuZHMgaXQgdG8KLSAqCQkgCQkgdXBwZXIgbGF5ZXIuCi0gKgotICogUGFyYW1ldGVycyAgLSBza2I6CVBvaW50ZXIgdG8gc2tfYnVmZiBzdHJ1Y3R1cmUgb2YgdGhlIEFSUCByZXF1ZXN0IHBrdC4KLSAqCi0gKiBSZXR1cm5zICAgICAtIE5vbmUKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1WT0lECi1yZXBseV90b19hcnBfcmVxdWVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCVBNSU5JX0FEQVBURVIJCUFkYXB0ZXI7Ci0Jc3RydWN0IEFycEhlYWRlciAJKnBBcnBIZHIgPSBOVUxMOwotCXN0cnVjdCBldGhoZHIJCSpwZXRoaGRyID0gTlVMTDsKLQlVQ0hBUiAJCQkJdWlJUEhkcls0XTsKLQkvKiBDaGVjayBmb3IgdmFsaWQgc2tiICovCi0JaWYoc2tiID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbnZhbGlkIHNrYjogQ2Fubm90IHJlcGx5IHRvIEFSUCByZXF1ZXN0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCi0JQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihza2ItPmRldik7Ci0JLyogUHJpbnQgdGhlIEFSUCBSZXF1ZXN0IFBhY2tldCAqLwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBBUlBfUkVTUCwgREJHX0xWTF9BTEwsICJBUlAgUGFja2V0IER1bXAgOiIpOwotCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9UWCwgQVJQX1JFU1AsIERCR19MVkxfQUxMLCAoUFVDSEFSKShza2ItPmRhdGEpLCBza2ItPmxlbik7Ci0KLQkvKgotCSAqIEV4dHJhY3QgdGhlIEV0aGVybmV0IEhlYWRlciBhbmQgQXJwIFBheWxvYWQgaW5jbHVkaW5nIEhlYWRlcgotICAgICAqLwotCXBldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQlwQXJwSGRyICA9IChzdHJ1Y3QgQXJwSGVhZGVyICopKHNrYi0+ZGF0YStFVEhfSExFTik7Ci0KLQlpZihBZGFwdGVyLT5iRVRIQ1NFbmFibGVkKQotCXsKLQkJaWYobWVtY21wKHBldGhoZHItPmhfc291cmNlLCBBZGFwdGVyLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCi0JCXsKLQkJCWJjbV9rZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8vIFNldCB0aGUgRXRoZXJuZXQgSGVhZGVyIEZpcnN0LgotCW1lbWNweShwZXRoaGRyLT5oX2Rlc3QsIHBldGhoZHItPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JaWYoIW1lbWNtcChwZXRoaGRyLT5oX3NvdXJjZSwgQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKQotCXsKLQkJcGV0aGhkci0+aF9zb3VyY2VbNV0rKzsKLQl9Ci0KLQkvKiBTZXQgdGhlIHJlcGx5IHRvIEFSUCBSZXBseSAqLwotCXBBcnBIZHItPmFycC5hcl9vcCA9IG50b2hzKEFSUE9QX1JFUExZKTsKLQotCS8qIFNldCB0aGUgSFcgQWRkcmVzcyBwcm9wZXJseSAqLwotCW1lbWNweShwQXJwSGRyLT5hcl9zaGEsIHBldGhoZHItPmhfc291cmNlLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHBBcnBIZHItPmFyX3RoYSwgcGV0aGhkci0+aF9kZXN0LCBFVEhfQUxFTik7Ci0KLQkvLyBTd2FwcGluZyB0aGUgSVAgQWRkZHJlc3MKLQltZW1jcHkodWlJUEhkcixwQXJwSGRyLT5hcl9zaXAsNCk7Ci0JbWVtY3B5KHBBcnBIZHItPmFyX3NpcCxwQXJwSGRyLT5hcl90aXAsNCk7Ci0JbWVtY3B5KHBBcnBIZHItPmFyX3RpcCx1aUlQSGRyLDQpOwotCi0JLyogUHJpbnQgdGhlIEFSUCBSZXBseSBQYWNrZXQgKi8KLQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBBUlBfUkVTUCwgREJHX0xWTF9BTEwsICJBUlAgUkVQTFkgUEFDS0VUOiAiKTsKLQotCS8qIFNlbmQgdGhlIFBhY2tldCB0byB1cHBlciBsYXllciAqLwotCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9UWCwgQVJQX1JFU1AsIERCR19MVkxfQUxMLCAoUFVDSEFSKShza2ItPmRhdGEpLCBza2ItPmxlbik7Ci0KLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLHNrYi0+ZGV2KTsKLQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0KLS8vCXNrYi0+bWFjLnJhdz1za2ItPmRhdGErTEVBREVSX1NJWkU7Ci0Jc2tiX3NldF9tYWNfaGVhZGVyIChza2IsIExFQURFUl9TSVpFKTsKLQluZXRpZl9yeChza2IpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBBUlBfUkVTUCwgREJHX0xWTF9BTEwsICI8PT09PT09PT09PT09PVxuIik7Ci0JcmV0dXJuOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKaW5kZXggZmVhZDljNS4uMzE2NzRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMKQEAgLTEyLDcgKzEyLDcgQEAKICoKICogUmV0dXJucwkgIC0gWmVybyhTdWNjZXNzKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzcyA9IE5VTEw7CisKIHN0YXRpYyBpbnQgYmNtX2NoYXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CiAJUE1JTklfQURBUFRFUiAJCUFkYXB0ZXIgPSBOVUxMOwpAQCAtOTMsNyArOTMsNyBAQAogICAgIC8qU3RvcCBRdWV1aW5nIHRoZSBjb250cm9sIHJlc3BvbnNlIFBhY2tldHMqLwogICAgIGF0b21pY19kZWMoJkFkYXB0ZXItPkFwcGxpY2F0aW9uUnVubmluZyk7CiAKLSAgICBiY21fa2ZyZWUocFRhcmFuZyk7CisgICAga2ZyZWUocFRhcmFuZyk7CiAKIAkvKiByZW1vdmUgdGhpcyBmaWxwIGZyb20gdGhlIGFzeW5jaHJvbm91c2x5IG5vdGlmaWVkIGZpbHAncyAqLwogICAgIGZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogCiBzdGF0aWMgc3NpemVfdCBiY21fY2hhcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpmX3BvcykKIHsKLSAgICBQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcgPSAoUFBFUl9UQVJBTkdfREFUQSlmaWxwLT5wcml2YXRlX2RhdGE7CisJUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCVBNSU5JX0FEQVBURVIJQWRhcHRlciA9IHBUYXJhbmctPkFkYXB0ZXI7Ci0gICAgc3RydWN0IHNrX2J1ZmYqIFBhY2tldCA9IE5VTEw7Ci0gICAgVUlOVCAgICAgICAgICAgIFBrdExlbiA9IDA7Ci0JaW50IAkJCXdhaXRfcmV0X3ZhbD0wOworCXN0cnVjdCBza19idWZmKiBQYWNrZXQgPSBOVUxMOworCXNzaXplX3QgICAgICAgICBQa3RMZW4gPSAwOworCWludCAJCXdhaXRfcmV0X3ZhbD0wOwogCiAJd2FpdF9yZXRfdmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKEFkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlLAogCQkocFRhcmFuZy0+UnhBcHBDb250cm9sSGVhZCB8fCBBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkpOwpAQCAtMTM5LDE0ICsxMzksMTYgQEAKIAlpZihQYWNrZXQpCiAJewogCQlQa3RMZW4gPSBQYWNrZXQtPmxlbjsKLQkJaWYoY29weV90b191c2VyKGJ1ZiwgUGFja2V0LT5kYXRhLCBQa3RMZW4pKQorCQlpZihjb3B5X3RvX3VzZXIoYnVmLCBQYWNrZXQtPmRhdGEsIG1pbl90KHNpemVfdCwgUGt0TGVuLCBzaXplKSkpCiAJCXsKLQkJCWJjbV9rZnJlZV9za2IoUGFja2V0KTsKKwkJCWRldl9rZnJlZV9za2IoUGFja2V0KTsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlxuUmV0dXJuaW5nIGZyb20gY29weSB0byB1c2VyIGZhaWx1cmUgXG4iKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUmVhZCAlZCBCeXRlcyBGcm9tIEFkYXB0ZXIgcGFja2V0ID0gMHglcCBieSBwcm9jZXNzICVkIVxuIiwgUGt0TGVuLCBQYWNrZXQsIGN1cnJlbnQtPnBpZCk7Ci0JCWJjbV9rZnJlZV9za2IoUGFja2V0KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJIlJlYWQgJXpkIEJ5dGVzIEZyb20gQWRhcHRlciBwYWNrZXQgPSAlcCBieSBwcm9jZXNzICVkIVxuIiwKKwkJCQlQa3RMZW4sIFBhY2tldCwgY3VycmVudC0+cGlkKTsKKwkJZGV2X2tmcmVlX3NrYihQYWNrZXQpOwogCX0KIAogICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiPD09PT1cbiIpOwpAQCAtMTU1LDE1ICsxNTcsMTIgQEAKIAogc3RhdGljIGxvbmcgYmNtX2NoYXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIFVJTlQgY21kLCBVTE9ORyBhcmcpCiB7Ci0gICAgUFBFUl9UQVJBTkdfREFUQSAgcFRhcmFuZyA9IChQUEVSX1RBUkFOR19EQVRBKWZpbHAtPnByaXZhdGVfZGF0YTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZ3A7CisJUFBFUl9UQVJBTkdfREFUQSAgcFRhcmFuZyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlQTUlOSV9BREFQVEVSIAlBZGFwdGVyID0gcFRhcmFuZy0+QWRhcHRlcjsKIAlJTlQgIAkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwotCUlPQ1RMX0JVRkZFUiAJSW9CdWZmZXI9e307Ci0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0gICAgaW50IHRpbWVvdXQgPSAwOwotI2VuZGlmCi0KKwlpbnQgdGltZW91dCA9IDA7CisJSU9DVExfQlVGRkVSIAlJb0J1ZmZlcjsKIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUGFyYW1ldGVycyBQYXNzZWQgdG8gY29udHJvbCBJT0NUTCBjbWQ9MHglWCBhcmc9MHglbFgiLCBjbWQsIGFyZyk7CiAKQEAgLTIwNCw1MCArMjAzLDQxIEBACiAKIAlTdGF0dXMgPSB2ZW5kb3JleHRuSW9jdGwoQWRhcHRlciwgY21kLCBhcmcpOwogCWlmKFN0YXR1cyAhPSBDT05USU5VRV9DT01NT05fUEFUSCApCi0JewogCQkgcmV0dXJuIFN0YXR1czsKLQl9CiAKIAlzd2l0Y2goY21kKXsKIAkJLy8gUmRtcyBmb3IgU3dpbiBJZGxlLi4uCiAJCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQURfUFJJVkFURToKIAkJewogCQkJUkRNX0JVRkZFUiAgc1JkbUJ1ZmZlciA9IHswfTsKLQkJCVBDSEFSIHRlbXBfYnVmZiA9IE5VTEw7Ci0JCQlVSU5UIEJ1ZmZsZW4gPSAwOwotCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLAotCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJUENIQVIgdGVtcF9idWZmOworCQkJVUlOVCBCdWZmbGVuOwogCisJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKiBGSVhNRTogbmVlZCB0byByZXN0cmljdCBCdWZmTGVuICovCiAJCQlCdWZmbGVuID0gSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICsgKDQgLSBJb0J1ZmZlci5PdXRwdXRMZW5ndGglNCklNDsKLQkJCXRlbXBfYnVmZiA9IChQQ0hBUilrbWFsbG9jKEJ1ZmZsZW4sIEdGUF9LRVJORUwpOworCQkJdGVtcF9idWZmID0ga21hbGxvYyhCdWZmbGVuLCBHRlBfS0VSTkVMKTsKIAkJCWlmKCF0ZW1wX2J1ZmYpCi0JCQl7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQkJfQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCXJldHVybiAtRU5PTUVNOworCiAJCQlTdGF0dXMgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKIAkJCQkJKFBVSU5UKXRlbXBfYnVmZiwgQnVmZmxlbik7Ci0JCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQl7Ci0JCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7Ci0JCQkJcmV0dXJuIFN0YXR1czsKKwkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQl9Ci0JCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCShQQ0hBUil0ZW1wX2J1ZmYsIChVSU5UKUlvQnVmZmVyLk91dHB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOworCisJCQlrZnJlZSh0ZW1wX2J1ZmYpOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEVfUFJJVkFURToKQEAgLTI1NiwxOSArMjQ2LDE2IEBACiAJCQlVSU5UIHVpVGVtcFZhcj0wOwogCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCiAKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwKLQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKIAkJCWlmKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkgJiBWU0dfTU9ERSkgJiYKIAkJCSAJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSl8fApAQCAtMjc3LDggKzI2NCw3IEBACiAJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCVN0YXR1cyA9IHdybWFsdChBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAogCQkJCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc2l6ZW9mKFVMT05HKSk7CkBAIC0zMDUsNTYgKzI5MSwzOSBAQAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGluIElkbGUgTW9kZSwgQmxvY2tpbmcgUmRtc1xuIik7Ci0JCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCX0KIAkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLAotCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCXRlbXBfYnVmZiA9IChQQ0hBUilrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKiBGSVhNRTogZG9uJ3QgdHJ1c3QgdXNlciBzdXBwbGllZCBsZW5ndGggKi8KKwkJCXRlbXBfYnVmZiA9IGttYWxsb2MoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAkJCWlmKCF0ZW1wX2J1ZmYpCi0JCQl7CiAJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQkJfQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQogCi0JCQlpZigKLSNpZiAhZGVmaW5lZChCQ01fU0hNX0lOVEVSRkFDRSkKLQkJCQkoKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKLSNlbmRpZgotCQkJCQkoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpCi0JCQkgICkKKwkJCWlmKCgoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAorCQkJICAgKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSRE0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKIAkJCQkJKGludClzUmRtQnVmZmVyLlJlZ2lzdGVyKTsKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCiAJCQl1aVRlbXBWYXIgPSBzUmRtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwogCQkJU3RhdHVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKIAkJCQkJCShQVUlOVCl0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0JCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJKFBDSEFSKXRlbXBfYnVmZiwgKFVJTlQpSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7CisJCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCisJCQlrZnJlZSh0ZW1wX2J1ZmYpOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEU6CkBAIC0zNjcsMzYgKzMzNiwyOCBAQAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGluIElkbGUgTW9kZSwgQmxvY2tpbmcgV3Jtc1xuIik7Ci0JCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCX0KLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwKLQkJCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoCi0jaWYgIWRlZmluZWQoQkNNX1NITV9JTlRFUkZBQ0UpCiAKLQkJCQkoKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKLSNlbmRpZgotCQkJCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpCi0JCQkgKQorCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNXcm1CdWZmZXIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJaWYoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmKCAoKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKKwkJCQkJKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKSApCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsCiAJCQkJCQkoaW50KXNXcm1CdWZmZXIuUmVnaXN0ZXIpOwotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CisKIAkJCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CiAJCQlpZighKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCiAJCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSl8fApAQCAtNDA2LDggKzM2Nyw3IEBACiAJCQkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAKIAkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCkBAIC00MzYsMTkgKzM5NiwxNCBAQAogCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCX0KIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCSAgICB9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19pbmZvKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZncGlvX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CiAJCQl1aU9wZXJhdGlvbiA9IGdwaW9faW5mby51aUdwaW9WYWx1ZTsKIApAQCAtNTE3LDggKzQ3Miw3IEBACiAJCWJyZWFrOwogCQljYXNlIEJDTV9MRURfVEhSRUFEX1NUQVRFX0NIQU5HRV9SRVE6CiAJCXsKLQotCQkJVVNFUl9USFJFQURfUkVRIHRocmVhZFJlcSA9IHswfTsKKwkJCVVTRVJfVEhSRUFEX1JFUSB0aHJlYWRSZXEgPSB7IDAgfTsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJVc2VyIG1hZGUgTEVEIHRocmVhZCBJbkFjdGl2ZSIpOwogCiAJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKQEAgLTUyOSwyMSArNDgzLDE2IEBACiAJCQkJU3RhdHVzID0gLUVBQ0NFUzsKIAkJCQlicmVhazsKIAkJCX0KLQkJCVN0YXR1cyA9Y29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQlpZihTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSU9CdWZlciBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAKLQkJCVN0YXR1cz0gY29weV9mcm9tX3VzZXIoJnRocmVhZFJlcSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJCWlmKFN0YXR1cykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJbnB1dEJ1ZmZlciBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZih0aHJlYWRSZXEpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRocmVhZFJlcSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJLy9pZiBMRUQgdGhyZWFkIGlzIHJ1bm5pbmcoQWN0aXZlbHkgb3IgSW5hY3RpdmVseSkgc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUKIAkJCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nKQogCQkJewpAQCAtNTcyLDE5ICs1MjEsMTMgQEAKIAkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgCQlicmVhazsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZncGlvX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgICB1aUJpdCAgPSBncGlvX2luZm8udWlHcGlvTnVtYmVyOwogCQkJCSAgLy9TZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyCiAJCQkJU3RhdHVzID0gcmRtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpR1BJT19QSU5fU1RBVEVfUkVHSVNURVIsCkBAIC02MDgsMjUgKzU1MSwxNCBAQAogCQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlciggKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKCBJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJT0J1ZmVyIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoZ3Bpb19tdWx0aV9pbmZvKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoICZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSU9CdWZlciBDb250ZW50cyBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CiAJCQkJaWYoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKT09IEZBTFNFKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIixwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayxBZGFwdGVyLT5ncGlvQml0TWFwKTsKQEAgLTY4Niw3ICs2MTgsNiBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtNzAwLDI1ICs2MzEsMTQgQEAKIAkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAogCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCXsKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZiggSU9DVExfQlVGRkVSKSk7Ci0JCQlpZihTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyB0aGUgSU9CdWZlciBmcm9tIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlciggJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJCWlmKFN0YXR1cykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJT0J1ZmVyIENvbnRlbnRzIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX21vZGUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKCBBZGFwdGVyLCAoIFVJTlQpIEdQSU9fTU9ERV9SRUdJU1RFUiwgKCBQVUlOVCkgdWNSZXNldFZhbHVlLCBzaXplb2YoIFVJTlQpKTsKIAkJCWlmKCBTVEFUVVNfU1VDQ0VTUyAhPSBTdGF0dXMpCkBAIC03NjksNyArNjg5LDYgQEAKIAkJCWlmKFN0YXR1cykKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIENvbnRlbnQgdG8gSU9CdWZlciBmb3IgdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNzgzLDI0ICs3MDIsMjAgQEAKIAkJY2FzZSBJT0NUTF9JRExFX1JFUToKIAkJewogCQkJUFZPSUQgcHZCdWZmZXI9TlVMTDsKLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLAotCQkJCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcHZCdWZmZXI9a21hbGxvYyhJb0J1ZmZlci5JbnB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZighcHZCdWZmZXIpCi0JCQl7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9CiAKLQkJCWlmKGNvcHlfZnJvbV91c2VyKHB2QnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJLyogRklYTUU6IGRvbid0IGFjY2VwdCBhbnkgbGVuZ3RoIGZyb20gdXNlciAqLworCQkJcHZCdWZmZXIgPSBrbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCWlmKCFwdkJ1ZmZlcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJaWYoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCiAJCQl7CiAJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJCWtmcmVlKHB2QnVmZmVyKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtODIwLDEwICs3MzUsOSBAQAogCQkJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOwogCQljbnRybEVuZDoKIAkJCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKLQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQlrZnJlZShwdkJ1ZmZlcik7CiAJCQlicmVhazsKIAkJfQotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RBUlQ6CiAJCXsKIAkJCUlOVCBOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spIDsKQEAgLTg0NCw3ICs3NTgsNyBAQAogCQkJCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKIAkJCQlpZihTdGF0dXMpCiAJCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJyZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIik7CisJCQkJCXByX2VycihQRlggIiVzOiByZXNldF9jYXJkX3Byb2MgRmFpbGVkIVxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKIAkJCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwogCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAJCQkJCWJyZWFrOwpAQCAtODYyLDcgKzc3Niw3IEBACiAJCX0KIAkJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEOgogCQkJewotCQkJCUZJUk1XQVJFX0lORk8gCSpwc0Z3SW5mbz1OVUxMOworCQkJCUZJUk1XQVJFX0lORk8gCSpwc0Z3SW5mbyA9IE5VTEw7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiU3RhcnRpbmcgdGhlIGZpcm13YXJlIGRvd25sb2FkIFBJRCA9MHgleCEhISFcbiIsIGN1cnJlbnQtPnBpZCk7CiAJCQlkb3sKIAkJCQlpZighZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkKQEAgLTg3MSwyOSArNzg1LDIzIEBACiAJCQkJCVN0YXR1cz0tRUlOVkFMOwogCQkJCQlicmVhazsKIAkJCQl9CisKIAkJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KIAkJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgImNvcHlfZnJvbV91c2VyIDEgZmFpbGVkXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkxlbmd0aCBmb3IgRlcgRExEIGlzIDogJWx4XG4iLAogCQkJCQkJCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJCQlwc0Z3SW5mbz1rbWFsbG9jKHNpemVvZigqcHNGd0luZm8pLCBHRlBfS0VSTkVMKTsKKworCQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihGSVJNV0FSRV9JTkZPKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQlwc0Z3SW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOwogCQkJCWlmKCFwc0Z3SW5mbykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIhISEhXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5X2Zyb21fdXNlciAyIGZhaWxlZFxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCQlpZihjb3B5X2Zyb21fdXNlcihwc0Z3SW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCQlpZighcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzIHx8CiAJCQkJCQkocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoID09IDApKQpAQCAtOTI5LDcgKzgzNyw3IEBACiAJCQkgIGlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAkJCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVEw6IEZpcm13YXJlIEZpbGUgVXBsb2FkZWRcbiIpOwotCQkJCWJjbV9rZnJlZShwc0Z3SW5mbyk7CisJCQkJa2ZyZWUocHNGd0luZm8pOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RPUDoKQEAgLTk0Niw3ICs4NTQsNyBAQAogCQkJCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkPVRSVUU7CiAJCQkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQ9VFJVRTsKIAkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7Ci0JCQkJYXRvbWljX3NldCgmQWRhcHRlci0+UnhSb2xsT3ZlckNvdW50LCAwKTsKKwogCQkJCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3M9MDsKIAkJCQlBZGFwdGVyLT5kb3dubG9hZEREUiA9IDA7CiAKQEAgLTk5OSw3ICs5MDcsNiBAQAogCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCQkJYnJlYWs7CiAJCX0KLSNlbmRpZgogCQljYXNlIElPQ1RMX0JFX0JVQ0tFVF9TSVpFOgogCQkJU3RhdHVzID0gMDsKIAkJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5CRUJ1Y2tldFNpemUsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpCkBAIC0xMDUwLDIyICs5NTcsMTYgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgSU9DVExfR0VUX1BBQ0tfSU5GTzoKLQkJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmQWRhcHRlci0+UGFja0luZm8sCi0JCQkJc2l6ZW9mKFBhY2tldEluZm8pKk5PX09GX1FVRVVFUykpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmQWRhcHRlci0+UGFja0luZm8sIHNpemVvZihQYWNrZXRJbmZvKSpOT19PRl9RVUVVRVMpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQlicmVhazsKIAkJY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6CiAJCXsKIAkJCVVJTlQgdWlEYXRhID0gMDsKIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZ1aURhdGEsIGFyZ3AsIHNpemVvZihVSU5UKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJaWYodWlEYXRhKQkvKiBBbGxvdyBBbGwgUGFja2V0cyAqLwogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFXG4iKTsKQEAgLTEwODQsMjIgKzk4NSwxNiBAQAogCQl7CiAJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCVZFUl9GSUxFVkVSU0lPTl9TVFIsIChVSU5UKUlvQnVmZmVyLk91dHB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgVkVSX0ZJTEVWRVJTSU9OX1NUUiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSBJT0NUTF9CQ01fR0VUX0NVUlJFTlRfU1RBVFVTOgogCQl7Ci0JCQlMSU5LX1NUQVRFIHBsaW5rX3N0YXRlOworCQkJTElOS19TVEFURSBsaW5rX3N0YXRlOwogCiAJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQpAQCAtMTEwOCwxOSArMTAwMywxOSBAQAogCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihwbGlua19zdGF0ZSkpIHsKKwkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKSB7CiAJCQkJU3RhdHVzID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwbGlua19zdGF0ZSwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YocGxpbmtfc3RhdGUpKSkgewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwbGlua19zdGF0ZS5iSWRsZU1vZGUgPSAoVUNIQVIpQWRhcHRlci0+SWRsZU1vZGU7Ci0JCQlwbGlua19zdGF0ZS5iU2h1dGRvd25Nb2RlID0gQWRhcHRlci0+YlNodXRTdGF0dXM7Ci0JCQlwbGlua19zdGF0ZS51Y0xpbmtTdGF0dXMgPSAoVUNIQVIpQWRhcHRlci0+TGlua1N0YXR1czsKLQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmcGxpbmtfc3RhdGUsIElvQnVmZmVyLk91dHB1dExlbmd0aCkpIHsKKwkJCW1lbXNldCgmbGlua19zdGF0ZSwgMCwgc2l6ZW9mKGxpbmtfc3RhdGUpKTsKKwkJCWxpbmtfc3RhdGUuYklkbGVNb2RlID0gQWRhcHRlci0+SWRsZU1vZGU7CisJCQlsaW5rX3N0YXRlLmJTaHV0ZG93bk1vZGUgPSBBZGFwdGVyLT5iU2h1dFN0YXR1czsKKwkJCWxpbmtfc3RhdGUudWNMaW5rU3RhdHVzID0gQWRhcHRlci0+TGlua1N0YXR1czsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZsaW5rX3N0YXRlLAorCQkJCQkgbWluX3Qoc2l6ZV90LCBzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKQorCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHlfdG9fdXNlciBGYWlsZWQuLlxuIik7CiAJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQlicmVhazsKQEAgLTExMzEsMTcgKzEwMjYsMTQgQEAKICAgICAgICAgY2FzZSBJT0NUTF9CQ01fU0VUX01BQ19UUkFDSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBVSU5UICB0cmFjaW5nX2ZsYWc7CisKICAgICAgICAgICAgIC8qIGNvcHkgaW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZ0cmFjaW5nX2ZsYWcsIElvQnVmZmVyLklucHV0QnVmZmVyLHNpemVvZihVSU5UKSkpCi0gICAgICAgICAgICB7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkgICAgaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCSAgICByZXR1cm4gLUVGQVVMVDsKKworCSAgICBpZihjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLElvQnVmZmVyLklucHV0QnVmZmVyLHNpemVvZihVSU5UKSkpCisJCSAgICByZXR1cm4gLUVGQVVMVDsKKwogICAgICAgICAgICAgaWYgKHRyYWNpbmdfZmxhZykKICAgICAgICAgICAgICAgICBBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBUUlVFOwogICAgICAgICAgICAgZWxzZQpAQCAtMTE1MSw3MiArMTA0Myw1MyBAQAogCQljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046CiAJCXsKIAkJCVVMT05HIHVsU0ZJZD0wOwotCQkJaWYoY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgYXJncCwKLQkJCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkludmFsaWQgSU8gYnVmZmVyISEhIiApOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQpKQogCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAotCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0KSk7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAorCQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2Yoc3RMb2NhbFNGQWRkSW5kaWNhdGlvbkFsdCkpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJCXNpemVvZih1bFNGSWQpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkludmFsaWQgU0ZJRCEhISAlbHUiLCB1bFNGSWQgKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCisJCQlpZihjb3B5X2Zyb21fdXNlcigmdWxTRklkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVsU0ZJZCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdldCBEU1ggRGF0YSBTRiBJRCBpcyA9JWx4XG4iLCB1bFNGSWQgKTsKLQkJCWdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihBZGFwdGVyLCB1bFNGSWQsCi0JCQkJSW9CdWZmZXIuT3V0cHV0QnVmZmVyKTsKKwkJCWdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihBZGFwdGVyLCB1bFNGSWQsIElvQnVmZmVyLk91dHB1dEJ1ZmZlcik7CiAJCQlTdGF0dXM9U1RBVFVTX1NVQ0NFU1M7CiAJCX0KIAkJYnJlYWs7CiAJCWNhc2UgSU9DVExfQkNNX0dFVF9IT1NUX01JQlM6CiAJCXsKLQkJCVBDSEFSIHRlbXBfYnVmZjsKKwkJCVBWT0lEIHRlbXBfYnVmZjsKIAogCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weV9mcm9tIHVzZXIgZm9yIElvQnVmZiBmYWlsZWRcbiIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpCiAJCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTGVuZ3RoIENoZWNrIGZhaWxlZCAlbHUgJXpkXG4iLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgsCi0JCQkJCQkJCQkJCXNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSk7Ci0JICAgICAgICAgIAlyZXR1cm4gLUVJTlZBTDsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCQkiTGVuZ3RoIENoZWNrIGZhaWxlZCAlbHUgJXpkXG4iLAorCQkJCQkJSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCi0JCQl0ZW1wX2J1ZmYgPSAoUENIQVIpa21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOwotCisJCQkvKiBGSVhNRTogSE9TVF9TVEFUUyBhcmUgdG9vIGJpZyBmb3Iga21hbGxvYyAoMTIyMDQ4KSEgKi8KKwkJCXRlbXBfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpLCBHRlBfS0VSTkVMKTsKIAkJCWlmKCF0ZW1wX2J1ZmYpCi0JCQl7CiAJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQkJfQogCi0JCQlTdGF0dXMgPSBQcm9jZXNzR2V0SG9zdE1pYnMoQWRhcHRlciwKLQkJCQkJKFBVQ0hBUil0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7CisJCQlTdGF0dXMgPSBQcm9jZXNzR2V0SG9zdE1pYnMoQWRhcHRlciwgdGVtcF9idWZmKTsKKwkJCUdldERyb3BwZWRBcHBDbnRybFBrdE1pYnModGVtcF9idWZmLCBwVGFyYW5nKTsKIAotCSAgICAgICAgU3RhdHVzID0gR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicygoUFZPSUQpdGVtcF9idWZmLAotCQkJCQkJCQkJKFBQRVJfVEFSQU5HX0RBVEEpZmlscC0+cHJpdmF0ZV9kYXRhKTsKKwkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX0ZBSUxVUkUpCisJCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCi0JCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLChQQ0hBUil0ZW1wX2J1ZmYsCi0JCQkJc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQliY21fa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQotCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7CisJCQlrZnJlZSh0ZW1wX2J1ZmYpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTIyNiwxMCArMTA5OSw2IEBACiAJCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX01PREU7CiAJCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7CiAJCQkJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yeF9jbnRybHBrdCk7Ci0JCQkJI2lmIDAKLQkJCQlBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPSBUUlVFOwotCQkJCUludGVyZmFjZUFib3J0SWRsZW1vZGUgKEFkYXB0ZXIsIEFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuKTsKLQkJCQkjZW5kaWYKIAkJCX0KIAkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CkBAIC0xMjQ4LDI0ICsxMTE3LDIwIEBACiAJCQkJCVN0YXR1cyA9IC1FQUNDRVM7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCQlpZihjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJewotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CiAKLQkJCQlwdkJ1ZmZlcj1rbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQkvKiBGSVhNRTogcmVzdHJpY3QgbGVuZ3RoICovCisJCQkJcHZCdWZmZXIgPSBrbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKIAkJCQlpZighcHZCdWZmZXIpCi0JCQkJewogCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQogCiAJCQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcihwdkJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlpZihjb3B5X2Zyb21fdXNlcihwdkJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKIAkJCQl7Ci0JCQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQkJCWtmcmVlKHB2QnVmZmVyKTsKIAkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMTI3NSw3ICsxMTQwLDcgQEAKIAkJCQlpZigoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDAgfHwKIAkJCQkJKChVTE9ORylwQnVsa0J1ZmZlci0+UmVnaXN0ZXIgJiAweDMpKQogCQkJCXsKLQkJCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCQkJa2ZyZWUocHZCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsKGludClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIpOwogCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwogCQkJCQlicmVhazsKQEAgLTEyOTAsNyArMTE1NSw3IEBACiAJCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCiAJCQkJCShjbWQgPT0gSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFKSkKIAkJCQl7Ci0JCQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQkJCWtmcmVlKHB2QnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsIkVFUFJPTSBBY2Nlc3MgRGVuaWVkLCBub3QgaW4gVlNHIE1vZGVcbiIpOwogCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKQEAgLTEzMDYsMzAgKzExNzEsMTkgQEAKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIEZhaWxlZFxuIik7CiAJCQkJfQogCi0JCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCQlrZnJlZShwdkJ1ZmZlcik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJY2FzZSBJT0NUTF9CQ01fR0VUX05WTV9TSVpFOgotCQkJewotCiAJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQkvL0lPTG9nKCJmYWlsZWQgTlZNIGZpcnN0Iik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9FRVBST00gfHwgQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIICkgewotCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJCSh1bnNpZ25lZCBjaGFyICopJkFkYXB0ZXItPnVpTlZNRFNEU2l6ZSwgKFVJTlQpc2l6ZW9mKFVJTlQpKSkKLQkJCQl7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQkJcmV0dXJuIFN0YXR1czsKLQkJCQl9Ci0JCQl9CisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKKwkJCWlmKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9FRVBST00gfHwgQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIICkgeworCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZBZGFwdGVyLT51aU5WTURTRFNpemUsIHNpemVvZihVSU5UKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQorCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBJT0NUTF9CQ01fQ0FMX0lOSVQgOgpAQCAtMTMzOCw0MCArMTE5MiwyNiBAQAogCQkJCVVJTlQgdWlTZWN0b3JTaXplID0gMCA7CiAJCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKQogCQkJCXsKLQkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJCWlmKFN0YXR1cykKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb3B5IEZyb20gVXNlciBzcGFjZSBmYWlsZWQuIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKIAkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQl9Ci0JCQkJCWlmIChnZXRfdXNlcih1aVNlY3RvclNpemUsICh1bnNpZ25lZCBpbnQgX191c2VyICopSW9CdWZmZXIuSW5wdXRCdWZmZXIpKQorCisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdWlTZWN0b3JTaXplLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVJTlQpKSkKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQkJCWlmKCh1aVNlY3RvclNpemUgPCBNSU5fU0VDVE9SX1NJWkUpIHx8ICh1aVNlY3RvclNpemUgPiBNQVhfU0VDVE9SX1NJWkUpKQogCQkJCQl7Ci0KLQkJCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJCQkJCQkodW5zaWduZWQgY2hhciAqKSZBZGFwdGVyLT51aVNlY3RvclNpemUgLAotCQkJCQkJCQkJKFVJTlQpc2l6ZW9mKFVJTlQpKTsKLQkJCQkJCWlmKFN0YXR1cykKLQkJCQkJCXsKLQkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDb3BpbmcgdGhlIHNlY3RvciBzaXplIHRvIHVzZSBzcGFjZSBmYWlsZWQuIHN0YXR1czolZCIsU3RhdHVzKTsKLQkJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCQl9CisJCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwKKwkJCQkJCQkJIHNpemVvZihVSU5UKSkpCisJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQlpZihJc0ZsYXNoMngoQWRhcHRlcikpCiAJCQkJCQl7Ci0JCQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkJCQkJCSh1bnNpZ25lZCBjaGFyICopJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAsCi0JCQkJCQkJCQkoVUlOVClzaXplb2YoVUlOVCkpOwotCQkJCQkJCWlmKFN0YXR1cykKLQkJCQkJCQl7Ci0JCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcGluZyB0aGUgc2VjdG9yIHNpemUgdG8gdXNlIHNwYWNlIGZhaWxlZC4gc3RhdHVzOiVkIixTdGF0dXMpOwotCQkJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCQkJfQotCisJCQkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCisJCQkJCQkJCQkgJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAsCisJCQkJCQkJCQkgc2l6ZW9mKFVJTlQpKSkKKwkJCQkJCQkgICAgcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCQl9CiAJCQkJCQllbHNlCiAJCQkJCQl7CkBAIC0xMzk1LDI1ICsxMjM1LDE5IEBACiAJCQl9CiAJCQlicmVhazsKICAgICAgICAgY2FzZSBJT0NUTF9CQ01fU0VUX0RFQlVHIDoKKyNpZmRlZiBERUJVRwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFVTRVJfQkNNX0RCR19TVEFURSBzVXNlckRlYnVnU3RhdGU7CiAKIC8vCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRW50ZXJlZCB0aGUgaW9jdGwgJXggXG4iLCBJT0NUTF9CQ01fU0VUX0RFQlVHICk7CiAKIAkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSW4gU0VUX0RFQlVHIGlvY3RsXG4iKTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSxJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVTRVJfQkNNX0RCR19TVEFURSkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAgIkNvcHkgb2YgSW9CdWZmZXIuSW5wdXRCdWZmZXIgZmFpbGVkIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CisKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVU0VSX0JDTV9EQkdfU1RBVEUpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAogCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSU9DVExfQkNNX1NFVF9ERUJVRzogT25PZmY9JWQgVHlwZSA9IDB4JXggIiwKIAkJCQlzVXNlckRlYnVnU3RhdGUuT25PZmYsIHNVc2VyRGVidWdTdGF0ZS5UeXBlKTsKQEAgLTE0MzYsMTUgKzEyNzAsMTQgQEAKICAgICAgICAgICAgICAgICBCQ01fU0hPV19ERUJVR19CSVRNQVAoQWRhcHRlcik7CiAKIAkJCX0KKyNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgSU9DVExfQkNNX05WTV9SRUFEOgogCQljYXNlIElPQ1RMX0JDTV9OVk1fV1JJVEU6CiAJCQl7Ci0KLQkJCQlOVk1fUkVBRFdSSVRFICBzdE5WTVJlYWRXcml0ZSA9IHt9OworCQkJCU5WTV9SRUFEV1JJVEUgIHN0TlZNUmVhZFdyaXRlOwogCQkJCVBVQ0hBUiBwUmVhZERhdGEgPSBOVUxMOwotCQkJCXZvaWQgX191c2VyICogcEJ1ZmZlcnRvYmVDb3BpZWQgPSBOVUxMOwotCQkJCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwIDsKKwkJCQlVTE9ORyB1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gMDsKIAkJCQlzdHJ1Y3QgdGltZXZhbCB0djAsIHR2MTsKIAkJCQltZW1zZXQoJnR2MCwwLHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwogCQkJCW1lbXNldCgmdHYxLDAsc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CkBAIC0xNDY5LDIxICsxMzAyLDEyIEBACiAJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KIAogCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoSU9DVExfQkNNX05WTV9SRUFEID09IGNtZCkKLQkJCQkJcEJ1ZmZlcnRvYmVDb3BpZWQgPSBJb0J1ZmZlci5PdXRwdXRCdWZmZXI7Ci0JCQkJZWxzZQotCQkJCQlwQnVmZmVydG9iZUNvcGllZCA9IElvQnVmZmVyLklucHV0QnVmZmVyOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWRXcml0ZSwgcEJ1ZmZlcnRvYmVDb3BpZWQsc2l6ZW9mKE5WTV9SRUFEV1JJVEUpKSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQlpZihjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsCisJCQkJCQkgIChJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSA/IElvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAorCQkJCQkJICBzaXplb2YoTlZNX1JFQURXUklURSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCS8vCiAJCQkJLy8gRGVueSB0aGUgYWNjZXNzIGlmIHRoZSBvZmZzZXQgY3Jvc3NlcyB0aGUgY2FsIGFyZWEgbGltaXQuCkBAIC0xNDk2LDE4ICsxMzIwLDE1IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJCXBSZWFkRGF0YSA9KFBDSEFSKWttYWxsb2Moc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgR0ZQX0tFUk5FTCk7Ci0KKwkJCQlwUmVhZERhdGEgPSBremFsbG9jKHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMsIEdGUF9LRVJORUwpOwogCQkJCWlmKCFwUmVhZERhdGEpCiAJCQkJCXJldHVybiAtRU5PTUVNOwogCi0JCQkJbWVtc2V0KHBSZWFkRGF0YSwwLHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOwotCiAJCQkJaWYoY29weV9mcm9tX3VzZXIocFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAogCQkJCQkJCXN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpKQogCQkJCXsKIAkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtMTUyMiw3ICsxMzQzLDcgQEAKIAkJCQkJewogCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwogCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJCX0KIApAQCAtMTUzMywxMyArMTM1NCwxMiBAQAogCiAJCQkJCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAkJCQkJCXsKLQkJCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJCQl9Ci0JCQkJCWlmKGNvcHlfdG9fdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLAotCQkJCQkJCXBSZWFkRGF0YSwgKFVJTlQpc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykpCisJCQkJCWlmKGNvcHlfdG9fdXNlcihzdE5WTVJlYWRXcml0ZS5wQnVmZmVyLHBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykpCiAJCQkJCQl7Ci0JCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQkJfQogCQkJCX0KQEAgLTE1NTQsNyArMTM3NCw3IEBACiAJCQkJCXsKIAkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKIAkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCQl9CiAKQEAgLTE1ODIsNyArMTQwMiw3IEBACiAJCQkJCQkJewogCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOwogCQkJCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCQkJCX0KIApAQCAtMTU5MSw3ICsxNDExLDcgQEAKIAkJCQkJCQl7CiAJCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7CiAJCQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJCQkJfQogCQkJCQkJfQpAQCAtMTYwOCw3ICsxNDI4LDcgQEAKIAogCQkJCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCXsKLQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJCX0KIAkJCQl9CkBAIC0xNjE2LDcgKzE0MzYsNyBAQAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiIHRpbWV0YWtlbiBieSBXcml0ZS9yZWFkIDolbGQgbXNlY1xuIiwodHYxLnR2X3NlYyAtIHR2MC50dl9zZWMpKjEwMDAgKyh0djEudHZfdXNlYyAtIHR2MC50dl91c2VjKS8xMDAwKTsKIAogCi0JCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTYyOSw3ICsxNDQ5LDcgQEAKIAkJCQlVSU5UIEJ1ZmZTaXplID0gMDsKIAkJCQlVSU5UIFJlYWRCeXRlcyA9IDA7CiAJCQkJVUlOVCBSZWFkT2Zmc2V0ID0gMDsKLQkJCQljaGFyIF9fdXNlciAqT3V0UHV0QnVmZiA9IE5VTEw7CisJCQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7CiAKIAkJCQlpZihJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkKIAkJCQl7CkBAIC0xNjM4LDIwICsxNDU4LDEyIEBACiAJCQkJfQogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1JFQUQgQ2FsbGVkIik7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAKIAkJCQkvL1JlYWRpbmcgRkxBU0ggMi54IFJFQUQgc3RydWN0dXJlCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsc2l6ZW9mKEZMQVNIMlhfUkVBRFdSSVRFKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJbnB1dCBCdWZmZXIgZmFpbGVkIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFJlYWQsIElvQnVmZmVyLklucHV0QnVmZmVyLHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAKIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIgLHNGbGFzaDJ4UmVhZC5TZWN0aW9uKTsKQEAgLTE2ODcsNyArMTQ5OSw3IEBACiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CiAJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJYmNtX2tmcmVlKHBSZWFkQnVmZik7CisJCQkJCWtmcmVlKHBSZWFkQnVmZik7CiAJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCX0KIApAQCAtMTcxNSw3ICsxNTI3LDYgQEAKIAkJCQkgCWlmKFN0YXR1cykKIAkJCQkgCXsKIAkJCQkgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQkJYnJlYWs7CiAJCQkJIAl9CiAJCQkJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKQEAgLTE3MjcsMTUgKzE1MzgsMTUgQEAKIAogCQkJCX0KIAkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJYmNtX2tmcmVlKHBSZWFkQnVmZik7CisJCQkJa2ZyZWUocFJlYWRCdWZmKTsKIAogCQkJIH0KIAkJCSBicmVhayA7CiAJCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURSA6CiAJCQkgewogCQkJIAlGTEFTSDJYX1JFQURXUklURSBzRmxhc2gyeFdyaXRlID0gezB9OwotCQkJCVBVQ0hBUiBwV3JpdGVCdWZmID0gTlVMTDsKLQkJCQl2b2lkIF9fdXNlciAqSW5wdXRBZGRyID0gTlVMTDsKKwkJCQlQVUNIQVIgcFdyaXRlQnVmZjsKKwkJCQl2b2lkIF9fdXNlciAqSW5wdXRBZGRyOwogCQkJCVVJTlQgTk9CID0gMDsKIAkJCQlVSU5UIEJ1ZmZTaXplID0gMDsKIAkJCQlVSU5UIFdyaXRlT2Zmc2V0ID0gMDsKQEAgLTE3NTIsMzMgKzE1NjMsMTcgQEAKIAogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURSBDYWxsZWQiKTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAogCQkJCS8vUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhXcml0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlYWRpbmcgb2Ygb3V0cHV0IEJ1ZmZlciBmcm9tIElPQ1RMIGJ1ZmZlciBmYWlscyIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhXcml0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9CiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQuU2VjdGlvbiA6JXgiICxzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiVkIiAsc0ZsYXNoMnhXcml0ZS5vZmZzZXQpOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5udW1PZkJ5dGVzIDoleCIgLHNGbGFzaDJ4V3JpdGUubnVtT2ZCeXRlcyk7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLmJWZXJpZnkgOiV4XG4iICxzRmxhc2gyeFdyaXRlLmJWZXJpZnkpOwotCQkJCSNpZiAwCi0JCQkJaWYoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiA9PSBJU09fSU1BR0UxKSB8fChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gPT0gSVNPX0lNQUdFMikgfHwKLQkJCQkJKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiA9PSBEU0QwKSB8fCAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uID09IERTRDEpIHx8IChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gPT0gRFNEMikpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiSVNPL0RTRCBJbWFnZSB3cml0ZSBpcyBub3QgYWxsb3dlZC4uLi4gICIpOwotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkUgOwotCQkJCX0KLQkJCQkjZW5kaWYKIAkJCQlpZigoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTApICYmIChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMSkgJiYKIAkJCQkJKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EyKSApCiAJCQkJewpAQCAtMTc5OCwxMiArMTU5MywxMCBAQAogCQkJCWVsc2UKIAkJCQkJQnVmZlNpemUgPSBOT0IgOwogCi0JCQkJcFdyaXRlQnVmZiA9IChQQ0hBUilrbWFsbG9jKEJ1ZmZTaXplLCBHRlBfS0VSTkVMKTsKKwkJCQlwV3JpdGVCdWZmID0ga21hbGxvYyhCdWZmU2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYocFdyaXRlQnVmZiA9PSBOVUxMKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOwogCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9CisKIAogCQkJCS8vZXh0cmFjdGluZyB0aGUgcmVtYWluZGVyIG9mIHRoZSBnaXZlbiBvZmZzZXQuCiAJCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSA7CkBAIC0xODIwLDcgKzE2MTMsNyBAQAogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwogCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCWJjbV9rZnJlZShwV3JpdGVCdWZmKTsKKwkJCQkJa2ZyZWUocFdyaXRlQnVmZik7CiAJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCX0KIApAQCAtMTgzMSw3ICsxNjI0LDYgQEAKIAkJCQkgCWlmKFN0YXR1cykKIAkJCQkgCXsKIAkJCQkgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcHkgdG8gdXNlciBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCQlicmVhayA7CiAJCQkJIAl9CiAJCQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCxwV3JpdGVCdWZmLFdyaXRlQnl0ZXMpOwpAQCAtMTg1OSwyOCArMTY1MSwyMiBAQAogCQkJCX0Jd2hpbGUoTk9CID4gMCk7CiAJCQkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKIAkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJYmNtX2tmcmVlKHBXcml0ZUJ1ZmYpOworCQkJCWtmcmVlKHBXcml0ZUJ1ZmYpOwogCQkJIH0KIAkJCSBicmVhayA7CiAJCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIDoKIAkJCSB7CiAKLQkJCSAJUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcCA9IE5VTEwgOworCQkJCSBQRkxBU0gyWF9CSVRNQVAgcHNGbGFzaDJ4Qml0TWFwOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIENhbGxlZCIpOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihGTEFTSDJYX0JJVE1BUCkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlN0cnVjdHVyZSBzaXplIG1pc21hdGNoIExpYiA6MHglbHggRHJpdmVyIDoweCV6eCAiLElvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAotCQkJCXBzRmxhc2gyeEJpdE1hcCA9IChQRkxBU0gyWF9CSVRNQVApa3phbGxvYyhzaXplb2YoRkxBU0gyWF9CSVRNQVApLCBHRlBfS0VSTkVMKTsKKwkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQlwc0ZsYXNoMnhCaXRNYXAgPSBremFsbG9jKHNpemVvZihGTEFTSDJYX0JJVE1BUCksIEdGUF9LRVJORUwpOwogCQkJCWlmKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNZW1vcnkgaXMgbm90IGF2YWlsYWJsZSIpOwpAQCAtMTg5NSwyMCArMTY4MSwxNiBAQAogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwogCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCWJjbV9rZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCQkJCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwogCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQl9CiAKIAkJCQlCY21HZXRGbGFzaDJ4U2VjdGlvbmFsQml0TWFwKEFkYXB0ZXIsIHBzRmxhc2gyeEJpdE1hcCk7CiAJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwgc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weWluZyBGbGFzaDJ4IGJpdE1hcCBmYWlsZWQiKTsKLQkJCQkJYmNtX2tmcmVlKHBzRmxhc2gyeEJpdE1hcCk7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQliY21fa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgcHNGbGFzaDJ4Qml0TWFwLCBzaXplb2YoRkxBU0gyWF9CSVRNQVApKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKKworCQkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CiAJCQkgfQogCQkJIGJyZWFrIDsKIAkJY2FzZSBJT0NUTF9CQ01fU0VUX0FDVElWRV9TRUNUSU9OIDoKQEAgLTE5MjYsMTQgKzE3MDgsMTQgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQogCiAJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCxJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOwogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgZmxhc2ggc2VjdGlvbiB2YWwgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KIAogCQkJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwpAQCAtMTk2MSwyOSArMTc0Myw2IEBACiAJCQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBGQUxTRSA7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTiBjYWxsZWQiKTsKIAotCQkJCSNpZiAwCi0JCQkJU0VDVElPTl9UWVBFIHNlY3Rpb24gPSAwIDsKLQotCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT04gQ2FsbGVkIik7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoKFBDSEFSKSZJb0J1ZmZlciwgKFBDSEFSKWFyZywgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigoUENIQVIpc2VjdGlvbiwoUENIQVIpJklvQnVmZmVyLCBzaXplb2YoSU5UKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJDb3B5IG9mIHNlY3Rpb24gdHlwZSBmYWlsZWQgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiUmVhZCBTZWN0aW9uIDolZCIsIHNlY3Rpb24pOwotCQkJIAlpZihzZWN0aW9uID09IERTRCkKLQkJCQkJQWRhcHRlci0+dWxGbGFzaENhbFN0YXJ0ID0gQWRhcHRlci0+dWlBY3RpdmVEU0RPZmZzZXRBdEZ3RGxkIDsKLQkJCQllbHNlCi0JCQkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFIDsKLQkJCQkjZW5kaWYKIAkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CiAJCQkgfQogCQkJIGJyZWFrIDsKQEAgLTIwMDQsMTQgKzE3NjMsMTQgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQgU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KIAotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZzQ29weVNlY3RTdHJ1dCxJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKEZMQVNIMlhfQ09QWV9TRUNUSU9OKSk7CisJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNDb3B5U2VjdFN0cnV0LCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKEZMQVNIMlhfQ09QWV9TRUNUSU9OKSk7CiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBDb3B5X1NlY3Rpb25fU3RydWN0IGZhaWxlZCB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRlc3RpbmF0aW9uIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbik7CkBAIC0yMDgyLDcgKzE4NDEsNiBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKQpAQCAtMjA5NSwzNSArMTg1MywxOCBAQAogCQkJCXsKIAogCQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRkxBU0gyWF9DU19JTkZPKSkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCIgUGFzc2VkIGJ1ZmZlciBzaXplOjB4JWxYIGlzIGluc3VmZmljaWVudCBmb3IgdGhlIENTIHN0cnVjdHVyZS4uIFxuUmVxdWlyZWQgc2l6ZSA6MHglenggIixJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihGTEFTSDJYX0NTX0lORk8pKTsKLQkJCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLCBzaXplb2YoRkxBU0gyWF9DU19JTkZPKSk7Ci0JCQkJCWlmKFN0YXR1cykKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weWluZyBGbGFzaDJ4IGNzIGluZm8gZmFpbGVkIik7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mbywgc2l6ZW9mKEZMQVNIMlhfQ1NfSU5GTykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihGTEFTSF9DU19JTkZPKSkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCIgUGFzc2VkIGJ1ZmZlciBzaXplOjB4JWxYIGlzIGluc3VmZmljaWVudCBmb3IgdGhlIENTIHN0cnVjdHVyZS4uIFJlcXVpcmVkIHNpemUgOjB4JXp4ICIsSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpOwotCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2hDU0luZm8sIHNpemVvZihGTEFTSF9DU19JTkZPKSk7Ci0JCQkJCWlmKFN0YXR1cykKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weWluZyBGbGFzaCBDUyBpbmZvIGZhaWxlZCIpOwotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaENTSW5mbywgc2l6ZW9mKEZMQVNIX0NTX0lORk8pKSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQkgCSB9CiAJCQkgIH0KQEAgLTIxNDUsMTMgKzE4ODYsMTMgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOwogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgZmxhc2ggc2VjdGlvbiB2YWwgZmFpbGVkIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJSZWFkIFNlY3Rpb24gOiVkIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKQEAgLTIxODEsMTMgKzE5MjIsMTMgQEAKIAkJY2FzZSBJT0NUTF9CQ01fTlZNX1JBV19SRUFEIDoKIAkJCSB7CiAKLQkJCQlOVk1fUkVBRFdSSVRFICBzdE5WTVJlYWQgPSB7fTsKKwkJCQkgTlZNX1JFQURXUklURSBzdE5WTVJlYWQ7CiAJCQkJSU5UIE5PQiA7CiAJCQkJSU5UIEJ1ZmZTaXplIDsKIAkJCQlJTlQgUmVhZE9mZnNldCA9IDA7CiAJCQkJVUlOVCBSZWFkQnl0ZXMgPSAwIDsKLQkJCQlQVUNIQVIgcFJlYWRCdWZmID0gTlVMTCA7Ci0JCQkJY2hhciBfX3VzZXIgKk91dFB1dEJ1ZmYgPSBOVUxMIDsKKwkJCQlQVUNIQVIgcFJlYWRCdWZmOworCQkJCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOwogCiAJCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKQogCQkJCXsKQEAgLTIyMDQsMTAgKzE5NDUsNyBAQAogCQkJCX0KIAogCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWQsIElvQnVmZmVyLk91dHB1dEJ1ZmZlcixzaXplb2YoTlZNX1JFQURXUklURSkpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCU5PQiA9IHN0TlZNUmVhZC51aU51bUJ5dGVzOwogCQkJCS8vSW4gUmF3LVJlYWQgbWF4IEJ1ZmYgc2l6ZSA6IDY0TUIKQEAgLTIyMTcsMTEgKzE5NTUsMTAgQEAKIAkJCQllbHNlCiAJCQkJCUJ1ZmZTaXplID0gTk9CIDsKIAotCQkJCVJlYWRPZmZzZXQgPSBzdE5WTVJlYWQudWlPZmZzZXQgOworCQkJCVJlYWRPZmZzZXQgPSBzdE5WTVJlYWQudWlPZmZzZXQ7CiAJCQkJT3V0UHV0QnVmZiA9IHN0TlZNUmVhZC5wQnVmZmVyOwogCi0KLQkJCQlwUmVhZEJ1ZmYgPSAoUENIQVIpa3phbGxvYyhCdWZmU2l6ZSAsIEdGUF9LRVJORUwpOworCQkJCXBSZWFkQnVmZiA9IGt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKIAkJCQlpZihwUmVhZEJ1ZmYgPT0gTlVMTCkKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKQEAgLTIyMzUsNyArMTk3Miw3IEBACiAJCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJCWJjbV9rZnJlZShwUmVhZEJ1ZmYpOworCQkJCQlrZnJlZShwUmVhZEJ1ZmYpOwogCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCX0KQEAgLTIyNTYsMTMgKzE5OTMsMTIgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAKLQkJCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLHBSZWFkQnVmZixSZWFkQnl0ZXMpOwogCiAJCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihPdXRQdXRCdWZmLCBwUmVhZEJ1ZmYsUmVhZEJ5dGVzKTsKIAkJCQkgCWlmKFN0YXR1cykKIAkJCQkgCXsKIAkJCQkgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJCWJyZWFrOwogCQkJCSAJfQogCQkJCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7CkBAIC0yMjc1LDcgKzIwMTEsNyBAQAogCQkJCX0KIAkJCQlBZGFwdGVyLT5iRmxhc2hSYXdSZWFkID0gRkFMU0UgOwogCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQliY21fa2ZyZWUocFJlYWRCdWZmKTsKKwkJCQlrZnJlZShwUmVhZEJ1ZmYpOwogCQkJCWJyZWFrIDsKIAkJCSB9CiAKQEAgLTIyODgsNyArMjAyNCw2IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC0yMjk2LDcgKzIwMzEsNiBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJjb3B5IG9mIGNvbnRyb2wgYml0IG1hc2sgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuIEdvdCB1c2VyIGRlZmluZWQgY250cmwgbXNnIGJpdCBtYXNrIDolbHgiLCBSeENudHJsTXNnQml0TWFzayk7CkBAIC0yMzE1LDcxICsyMDQ5LDQ0IEBACiAJCQkJRGV2SW5mby51MzJOVk1UeXBlID0gQWRhcHRlci0+ZU5WTVR5cGU7CiAJCQkJRGV2SW5mby51MzJJbnRlcmZhY2VUeXBlID0gQkNNX1VTQjsKIAotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihEZXZJbmZvKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiVXNlciBQYXNzZWQgYnVmZmVyIGxlbmd0aCBpcyBsZXNzIHRoYW4gYWN0dXJhbCBidWZmZXIgc2l6ZSIpOwotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsInVzZXIgcGFzc2VkIGJ1ZmZlciBzaXplIDoweCVsWCwgZXhwZWN0ZWQgc2l6ZSA6MHglengiLElvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKERldkluZm8pKTsKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZEZXZJbmZvLCBzaXplb2YoRGV2SW5mbykpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiY29weWluZyBEZXYgaW5mbyBzdHJ1Y3R1cmUgdG8gdXNlciBzcGFjZSBidWZmZXIgZmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkRldkluZm8sIHNpemVvZihEZXZJbmZvKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQkJYnJlYWsgOwogCiAJCQljYXNlIElPQ1RMX0JDTV9USU1FX1NJTkNFX05FVF9FTlRSWToKIAkJCXsKIAkJCQlTVF9USU1FX0VMQVBTRUQgc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSB7MH07Ci0JCQkJc3RydWN0IHRpbWV2YWwgdHYgPSB7MH0gOwogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklPQ1RMX0JDTV9USU1FX1NJTkNFX05FVF9FTlRSWSBjYWxsZWQiKTsKIAotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihTVF9USU1FX0VMQVBTRUQpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJVc2VyIFBhc3NlZCBidWZmZXIgbGVuZ3RoOjB4JWx4IGlzIGxlc3MgdGhhbiBleHBlY3RlZCBidWZmIHNpemUgOjB4JXpYIixJb0J1ZmZlci5PdXRwdXRMZW5ndGgsc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpOwotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQkJLy9zdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7Ci0JCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCQkJc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkudWw2NFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IHR2LnR2X3NlYyAtIEFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5OworCQkJCXN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSBnZXRfc2Vjb25kcygpIC0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnksIHNpemVvZihTVF9USU1FX0VMQVBTRUQpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImNvcHlpbmcgU1RfVElNRV9FTEFQU0VEIHN0cnVjdHVyZSB0byB1c2VyIHNwYWNlIGJ1ZmZlciBmYWlsZWQiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnksIHNpemVvZihTVF9USU1FX0VMQVBTRUQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCX0KIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIndyb25nIGlucHV0ICV4IixjbWQpOwotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkluIGRlZmF1bHQgaW9jdGwgJWRcbiIsIGNtZCk7Ci0JCQkgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCWNhc2UgSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OOgorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklPQ1RMX0NMT1NFX05PVElGSUNBVElPTiIpOworCQkJYnJlYWs7CiAKKwkJZGVmYXVsdDoKKwkJCXByX2luZm8oRFJWX05BTUUgIjogdW5rbm93biBpb2N0bCBjbWQ9JSN4XG4iLCBjbWQpOworCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAJCQlicmVhazsKIAl9CiAJcmV0dXJuIFN0YXR1czsKQEAgLTIzOTUsNTkgKzIxMDIsMzcgQEAKIAkubGxzZWVrID0gbm9fbGxzZWVrLAogfTsKIAorZXh0ZXJuIHN0cnVjdCBjbGFzcyAqYmNtX2NsYXNzOwogCiBpbnQgcmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKKwogCWlmKEFkYXB0ZXItPm1ham9yPjApCi0gICAgCXJldHVybiBBZGFwdGVyLT5tYWpvcjsKLSAgICBBZGFwdGVyLT5tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAidGFyYW5nIiwgJmJjbV9mb3BzKTsKLSAgICBpZihBZGFwdGVyLT5tYWpvciA8IDApCi0gICAgewotICAgIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInJlZ2lzdGVyX2NocmRldjpGYWlsZWQgdG8gcmVnaXN0ZXJpbmcgV2lNYXggY29udHJvbCBjaGFyIGRldmljZSEiKTsKLSAgICAgICAgcmV0dXJuIEFkYXB0ZXItPm1ham9yOwotICAgIH0KKwkJcmV0dXJuIEFkYXB0ZXItPm1ham9yOwogCi0JYmNtX2NsYXNzID0gTlVMTDsKLQliY21fY2xhc3MgPSBjbGFzc19jcmVhdGUgKFRISVNfTU9EVUxFLCAidGFyYW5nIik7Ci0JaWYoSVNfRVJSIChiY21fY2xhc3MpKQotCXsKLSAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJVbmFibGUgdG8gY3JlYXRlIGNsYXNzXG4iKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXYoQWRhcHRlci0+bWFqb3IsICJ0YXJhbmciKTsKLQkJQWRhcHRlci0+bWFqb3IgPSAwOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlBZGFwdGVyLT5tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBERVZfTkFNRSwgJmJjbV9mb3BzKTsKKwlpZihBZGFwdGVyLT5tYWpvciA8IDApIHsKKwkJcHJfZXJyKERSVl9OQU1FICI6IGNvdWxkIG5vdCBjcmVhdGVkIGNoYXJhY3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gQWRhcHRlci0+bWFqb3I7CiAJfQorCiAJQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlID0gZGV2aWNlX2NyZWF0ZSAoYmNtX2NsYXNzLCBOVUxMLAotCQkJCQkJCQlNS0RFVihBZGFwdGVyLT5tYWpvciwgMCksCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQotCQkJCQkJCQlOVUxMCSwKLSNlbmRpZgotCQkJCQkJCQkidGFyYW5nIik7CisJCQkJCQkJTUtERVYoQWRhcHRlci0+bWFqb3IsIDApLCBBZGFwdGVyLAorCQkJCQkJCURFVl9OQU1FKTsKIAotCWlmKElTX0VSUihBZGFwdGVyLT5wc3RDcmVhdGVkQ2xhc3NEZXZpY2UpKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJjbGFzcyBkZXZpY2UgZGlkIG5vdCBnZXQgY3JlYXRlZCA6ICVsZCIsIFBUUl9FUlIoQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlKSApOworCWlmKElTX0VSUihBZGFwdGVyLT5wc3RDcmVhdGVkQ2xhc3NEZXZpY2UpKSB7CisJCXByX2VycihEUlZfTkFNRSAiOiBjbGFzcyBkZXZpY2UgY3JlYXRlIGZhaWxlZFxuIik7CisJCXVucmVnaXN0ZXJfY2hyZGV2KEFkYXB0ZXItPm1ham9yLCBERVZfTkFNRSk7CisJCXJldHVybiBQVFJfRVJSKEFkYXB0ZXItPnBzdENyZWF0ZWRDbGFzc0RldmljZSk7CiAJfQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiR290IE1ham9yIE5vOiAlZCIsIEFkYXB0ZXItPm1ham9yKTsKLSAgICByZXR1cm4gMDsKKwkJCQorCXJldHVybiAwOwogfQogCiB2b2lkIHVucmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlpZihBZGFwdGVyLT5tYWpvciA+IDApCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImRlc3Ryb3lpbmcgY2xhc3MgZGV2aWNlIik7CisJaWYoQWRhcHRlci0+bWFqb3IgPiAwKSB7CiAJCWRldmljZV9kZXN0cm95IChiY21fY2xhc3MsIE1LREVWKEFkYXB0ZXItPm1ham9yLCAwKSk7CisJCXVucmVnaXN0ZXJfY2hyZGV2KEFkYXB0ZXItPm1ham9yLCBERVZfTkFNRSk7CiAJfQotICAgIGlmKCFJU19FUlIoYmNtX2NsYXNzKSkKLQl7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiZGVzdHJveWluZyBjcmVhdGVkIGNsYXNzICIpOwotICAgICAgICBjbGFzc19kZXN0cm95IChiY21fY2xhc3MpOwotCQliY21fY2xhc3MgPSBOVUxMOwotCX0KLQlpZihBZGFwdGVyLT5tYWpvciA+IDApCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwidW5yZWdpc3RlcmluZyBjaGFyYWN0ZXIgaW50ZXJmYWNlIik7Ci0gICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2KEFkYXB0ZXItPm1ham9yLCAidGFyYW5nIik7Ci0JfQotCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbW5ldC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21uZXQuYwppbmRleCBiYzI5Njk4Li5hNmNlMjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbW5ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtbmV0LmMKQEAgLTEsMjY0ICsxLDIzOCBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotc3RhdGljIElOVCBiY21fbm90aWZ5X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIFVMT05HIGV2ZW50LCBQVk9JRCBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UqKWRldjsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7Ci0JLy9QTUlOSV9BREFQVEVSIAlBZGFwdGVyID0gKFBNSU5JX0FEQVBURVIpbmRldi0+cHJpdjsKLQlpZihzdHJuY21wKG5kZXYtPm5hbWUsZ2JscG5ldGRldi0+bmFtZSw1KT09MCkKLQl7Ci0JCXN3aXRjaChldmVudCkKLQkJewotCQkJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKLQkJCWNhc2UgTkVUREVWX0dPSU5HX0RPV046Ci0JCQkJLyppZ25vcmUgdGhpcyAqLwotCQkJCQlicmVhazsKLQkJCWNhc2UgTkVUREVWX0RPV046Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTkVUREVWX1VQOgotCQkJCWJyZWFrOwotCi0JCQljYXNlIE5FVERFVl9SRUdJU1RFUjoKLQkJCQkgLyogSW5jcmVtZW50IHRoZSBSZWZlcmVuY2UgQ291bnQgZm9yICJ2ZXRoMCIgKi8KLQkJCQkgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBSZWZDb3VudDogJXhcbiIsCi0JCQkJCQkJCQluZXRkZXZfcmVmY250X3JlYWQobmRldikpOwotCQkJCSBkZXZfaG9sZChuZGV2KTsKLQkJCQkgYnJlYWs7Ci0KLQkJCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6Ci0JCQkJIC8qIERlY3JlbWVudCB0aGUgUmVmZXJlbmNlIENvdW50IGZvciAidmV0aDAiICovCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJVbnJlZ2lzdGVyIFJlZkNudDogJXhcbiIsCi0JCQkJCQkJCQluZXRkZXZfcmVmY250X3JlYWQobmRldikpOwotCQkJCWRldl9wdXQobmRldik7Ci0JCQkJYnJlYWs7Ci0JCX07Ci0JfQotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotLyogTm90aWZpZXIgYmxvY2sgdG8gcmVjZWl2ZSBuZXRkZXZpY2UgZXZlbnRzICovCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJjbV9ub3RpZmllcl9ibG9jayA9Ci17Ci0JLm5vdGlmaWVyX2NhbGwgPSBiY21fbm90aWZ5X2V2ZW50LAotfTsKLQogc3RydWN0IG5ldF9kZXZpY2UgKmdibHBuZXRkZXY7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogcHJvdG8tdHlwZSBvZiBsb3dlciBmdW5jdGlvbiAqLwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi1jb25zdCBjaGFyICpiY21WaXJ0RGV2aWNlTmFtZT0iYmNtZXRoIjsKLSNlbmRpZgogCiBzdGF0aWMgSU5UIGJjbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gTlVMTCA7IC8vKFBNSU5JX0FEQVBURVIpZGV2LT5wcml2OwotCUFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKLSAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIj09PT09PT4iKTsKLSAgICBpZihBZGFwdGVyLT5md19kb3dubG9hZF9kb25lPT1GQUxTRSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0JQWRhcHRlci0+aWZfdXA9MTsKLQlpZihBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPT0gMSl7Ci0JCWlmKG5ldGlmX3F1ZXVlX3N0b3BwZWQoQWRhcHRlci0+ZGV2KSl7Ci0JCQluZXRpZl9jYXJyaWVyX29uKEFkYXB0ZXItPmRldik7Ci0JCQluZXRpZl9zdGFydF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCQl9CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisKKwlpZiAoQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9PSBGQUxTRSkgeworCQlwcl9ub3RpY2UoUEZYICIlczogbGluayB1cCBmYWlsZWQgKGRvd25sb2FkIGluIHByb2dyZXNzKVxuIiwKKyAJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICI8PT09PT09Iik7Ci0gICAgcmV0dXJuIDA7Ci19CisJaWYgKG5ldGlmX21zZ19pZnVwKEFkYXB0ZXIpKQorCQlwcl9pbmZvKFBGWCAiJXM6IGVuYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKIAotc3RhdGljIElOVCBiY21fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IE5VTEwgOy8vZ3BhZGFwdGVyIDsKLSAgIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKLSAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCUFkYXB0ZXItPmlmX3VwPTA7Ci0JaWYoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgewotCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJaWYgKEFkYXB0ZXItPkxpbmtVcFN0YXR1cykgeworCQlpZiAobmV0aWZfbXNnX2xpbmsoQWRhcHRlcikpCisJCQlwcl9pbmZvKFBGWCAiJXM6IGxpbmsgdXBcbiIsIGRldi0+bmFtZSk7CisKKwkJbmV0aWZfY2Fycmllcl9vbihBZGFwdGVyLT5kZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShBZGFwdGVyLT5kZXYpOwogCX0KLSAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwiPD09PT09Iik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYmNtX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgIFBMSU5VWF9ERVBfREFUQSBwTGludXhEYXRhPU5VTEw7Ci0JUE1JTklfQURBUFRFUiBBZGFwdGVyID0gTlVMTCA7Ly8gZ3BhZGFwdGVyIDsKLQlBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7Ci0gICAgcExpbnV4RGF0YSA9IChQTElOVVhfREVQX0RBVEEpKEFkYXB0ZXItPnB2T3NEZXBEYXRhKTsKLQotICAgIC8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJEZXYgPSAlcCwgcExpbnV4RGF0YSA9ICVwIiwgZGV2LCBwTGludXhEYXRhKTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9wYWNrZXRzPWF0b21pY19yZWFkKCZBZGFwdGVyLT5SeFJvbGxPdmVyQ291bnQpKjY0KjEwMjQrQWRhcHRlci0+UHJldk51bVJlY3ZEZXNjczsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9ieXRlcz1hdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4Qnl0ZUNvdW50KSthdG9taWNfcmVhZCgmQWRhcHRlci0+QmFkUnhCeXRlQ291bnQpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2Ryb3BwZWQ9YXRvbWljX3JlYWQoJkFkYXB0ZXItPlJ4UGFja2V0RHJvcHBlZENvdW50KTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9lcnJvcnM9YXRvbWljX3JlYWQoJkFkYXB0ZXItPlJ4UGFja2V0RHJvcHBlZENvdW50KTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9sZW5ndGhfZXJyb3JzPTA7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfZnJhbWVfZXJyb3JzPTA7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfY3JjX2Vycm9ycz0wOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnR4X2J5dGVzPWF0b21pY19yZWFkKCZBZGFwdGVyLT5Hb29kVHhCeXRlQ291bnQpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnR4X3BhY2tldHM9YXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMudHhfZHJvcHBlZD1hdG9taWNfcmVhZCgmQWRhcHRlci0+VHhEcm9wcGVkUGFja2V0Q291bnQpOwotCi0gICAgcmV0dXJuICYocExpbnV4RGF0YS0+bmV0c3RhdHMpOwotfQotLyoqCi1AaW5ncm91cCBpbml0X2Z1bmN0aW9ucwotUmVnaXN0ZXIgb3RoZXIgZHJpdmVyIGVudHJ5IHBvaW50cyB3aXRoIHRoZSBrZXJuZWwKLSovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI5KQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiY21OZXREZXZPcHMgPSB7Ci0gICAgLm5kb19vcGVuCQk9IGJjbV9vcGVuLAotICAgIC5uZG9fc3RvcCAJCT0gYmNtX2Nsb3NlLAotICAgIC5uZG9fZ2V0X3N0YXRzIAk9IGJjbV9nZXRfc3RhdHMsCi0gICAgLm5kb19zdGFydF94bWl0CT0gYmNtX3RyYW5zbWl0LAotICAgIC5uZG9fY2hhbmdlX210dQk9IGV0aF9jaGFuZ2VfbXR1LAotICAgIC5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAotICAgIC5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotfTsKLSNlbmRpZgotCi1pbnQgcmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JaW50IHJlc3VsdD0wOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCi0Jdm9pZCAqKnRlbXAgPSBOVUxMOyAvKiBhY3R1YWxseSB3ZSdyZSAqYWxsb2NhdGluZyogdGhlIGRldmljZSBpbiBhbGxvY19ldGhlcmRldiAqLwotI2VuZGlmCi0JQWRhcHRlci0+ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFBNSU5JX0FEQVBURVIpKTsKLQlpZighQWRhcHRlci0+ZGV2KQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJFUlI6IE5vIERldiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZ2JscG5ldGRldgkJCQkJCQk9IEFkYXB0ZXItPmRldjsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjcpCi0JQWRhcHRlci0+ZGV2LT5wcml2ICAgICAgCQkJPSBBZGFwdGVyOwotI2Vsc2UKLQl0ZW1wID0gbmV0ZGV2X3ByaXYoQWRhcHRlci0+ZGV2KTsKLQkqdGVtcCA9ICh2b2lkICopQWRhcHRlcjsKLSNlbmRpZgotCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiaW5pdCBhZGFwdGVycHRyOiAleCAleFxuIiwgKFVJTlQpQWRhcHRlciwgdGVtcCk7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjkpCi0gICAgICAgIEFkYXB0ZXItPmRldi0+bmV0ZGV2X29wcyAgICAgICAgICAgICAgICA9ICZiY21OZXREZXZPcHM7Ci0jZWxzZQotCUFkYXB0ZXItPmRldi0+b3BlbiAgICAgIAkJCT0gYmNtX29wZW47Ci0JQWRhcHRlci0+ZGV2LT5zdG9wICAgICAgICAgICAgICAgCT0gYmNtX2Nsb3NlOwotCUFkYXB0ZXItPmRldi0+Z2V0X3N0YXRzICAgICAgICAgIAk9IGJjbV9nZXRfc3RhdHM7Ci0JQWRhcHRlci0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgCT0gYmNtX3RyYW5zbWl0OwotCUFkYXB0ZXItPmRldi0+aGFyZF9oZWFkZXJfbGVuICAgIAk9IEVUSF9ITEVOICsgTEVBREVSX1NJWkU7Ci0jZW5kaWYKLQotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCUFkYXB0ZXItPmRldi0+bXR1CQkJCQk9IE1UVV9TSVpFOyAvKiAxNDAwIEJ5dGVzICovCi0JLyogUmVhZCB0aGUgTUFDIEFkZHJlc3MgZnJvbSBFRVBST00gKi8KLQlSZWFkTWFjQWRkcmVzc0Zyb21OVk0oQWRhcHRlcik7Ci0KLQotCS8qIFJlZ2lzdGVyIHRoZSBub3RpZmllciBibG9jayBmb3IgZ2V0dGluZyBuZXRkZXZpY2UgZXZlbnRzICovCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJSZWdpc3RlcmluZyBuZXRkZXZpY2Ugbm90aWZpZXJcbiIpOwotCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYmNtX25vdGlmaWVyX2Jsb2NrKTsKLQlpZihyZXN1bHQpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkJDTSBOb3RpZmllciBCbG9jayBkaWQgbm90IGdldCByZWdpc3RlcmVkIik7Ci0JCUFkYXB0ZXItPmJOZXRkZXZpY2VOb3RpZmllclJlZ2lzdGVyZWQgPSBGQUxTRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JZWxzZQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJCQ00gTm90aWZpZXIgZ290IFJlZ2lzdGVyZWQiKTsKLQkJQWRhcHRlci0+Yk5ldGRldmljZU5vdGlmaWVyUmVnaXN0ZXJlZCA9IFRSVUU7Ci0JfQotCi0jZWxzZQotCi0JQWRhcHRlci0+ZGV2LT5tdHUJCQk9IENQRV9NVFVfU0laRTsKLQotI2lmIDAKLQkvL2ZvciBDUEUgLSBoYXJjb2RlIHRoZSB2aXJ0dWFsIG1hYyBhZGRyZXNzCi0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkclswXSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1swXTsKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzFdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzFdOwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbMl0gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbMl07Ci0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkclszXSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1szXTsKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzRdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzRdOwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbNV0gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbNV07Ci0jZWxzZQotCVJlYWRNYWNBZGRyZXNzRnJvbU5WTShBZGFwdGVyKTsKLSNlbmRpZgotCXN0cmNweShBZGFwdGVyLT5kZXYtPm5hbWUsIGJjbVZpcnREZXZpY2VOYW1lKTsgLy9Db3B5IHRoZSBkZXZpY2UgbmFtZQotCi0jZW5kaWYKLQotCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihBZGFwdGVyLT5kZXYpOwotCWlmICghcmVzdWx0KQotCXsKLQkJQWRhcHRlci0+Yk5ldHdvcmtJbnRlcmZhY2VSZWdpc3RlcmVkID0gVFJVRSA7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQmVjZWVtIE5ldHdvcmsgZGV2aWNlIG5hbWUgaXMgJXMhIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKLQl9Ci0JZWxzZQotCXsKLSAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJOZXR3b3JrIGRldmljZSBjYW4gbm90IGJlIHJlZ2lzdGVyZWQhIik7Ci0JCUFkYXB0ZXItPmJOZXR3b3JrSW50ZXJmYWNlUmVnaXN0ZXJlZCA9IEZBTFNFIDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSNpZiAwCi0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsID0gREJHX0xWTF9DVVJSOwotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS50eXBlID0oVUlOVCkweGZmZmZmZmZmOwotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX09USEVSU10gPSAweGZmZmZmZmZmOwotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1JYXSA9IDB4ZmZmZmZmZmY7Ci0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfVFhdID0gMHhmZmZmZmZmZjsKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweGZmZmZmZmZmOwotCi0gcHJpbnRrKCItLS0tLS0tcHNfYWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGU9JXhcbiIsQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpOwotIHByaW50aygiLS0tLS0tLXBzX2FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX09USEVSU109JXhcbiIsQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfT1RIRVJTXSk7Ci0gcHJpbnRrKCItLS0tLS0tcHNfYWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfUlhdPSV4XG4iLEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1JYXSk7Ci0gcHJpbnRrKCItLS0tLS0tcHNfYWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfVFhdPSV4XG4iLEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX1RYXSk7Ci0jZW5kaWYKIAogCXJldHVybiAwOwogfQogCi12b2lkIGJjbV91bnJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIElOVCBiY21fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVucmVnaXN0ZXJpbmcgdGhlIE5ldCBEZXYuLi5cbiIpOwotCWlmKEFkYXB0ZXItPmRldiAmJiAhSVNfRVJSKEFkYXB0ZXItPmRldikgJiYgQWRhcHRlci0+Yk5ldHdvcmtJbnRlcmZhY2VSZWdpc3RlcmVkKQotCQl1bnJlZ2lzdGVyX25ldGRldihBZGFwdGVyLT5kZXYpOwotCQkvKiBVbnJlZ2lzdGVyIHRoZSBub3RpZmllciBibG9jayAqLwotCWlmKEFkYXB0ZXItPmJOZXRkZXZpY2VOb3RpZmllclJlZ2lzdGVyZWQgPT0gVFJVRSkKLQl7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJVbnJlZ2lzdGVyaW5nIG5ldGRldmljZSBub3RpZmllclxuIik7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmYmNtX25vdGlmaWVyX2Jsb2NrKTsKLSAgfQorCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24oQWRhcHRlcikpCisJCXByX2luZm8oUEZYICIlczogZGlzYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmNtX2luaXQodm9pZCkKK3N0YXRpYyB1MTYgYmNtX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXJldHVybiBDbGFzc2lmeVBhY2tldChuZXRkZXZfcHJpdihkZXYpLCBza2IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbiAgICAtCWJjbV90cmFuc21pdCgpCisqCisqIERlc2NyaXB0aW9uIC0gVGhpcyBpcyB0aGUgbWFpbiB0cmFuc21pdCBmdW5jdGlvbiBmb3Igb3VyIHZpcnR1YWwKKyoJCWludGVyZmFjZShldGgwKS4gSXQgaGFuZGxlcyB0aGUgQVJQIHBhY2tldHMuIEl0CisqCQljbG9uZXMgdGhpcyBwYWNrZXQgYW5kIHRoZW4gUXVldWUgaXQgdG8gYSBzdWl0YWJsZQorKiAJCVF1ZXVlLiBUaGVuIGNhbGxzIHRoZSB0cmFuc21pdF9wYWNrZXQoKS4KKyoKKyogUGFyYW1ldGVyICAgLQkgc2tiIC0gUG9pbnRlciB0byB0aGUgc29ja2V0IGJ1ZmZlciBzdHJ1Y3R1cmUKKyoJCSBkZXYgLSBQb2ludGVyIHRvIHRoZSB2aXJ0dWFsIG5ldCBkZXZpY2Ugc3RydWN0dXJlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBuZXRkZXZfdHhfdCBiY21fdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKwl1MTYgcWluZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisKKworCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCB8fCAhQWRhcHRlci0+TGlua1VwU3RhdHVzKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoQWRhcHRlci0+VHJhbnNmZXJNb2RlICE9IElQX1BBQ0tFVF9PTkxZX01PREUpCisJCWdvdG8gZHJvcDsKKworCWlmIChJTlZBTElEX1FVRVVFX0lOREVYID09IHFpbmRleCkKKwkJZ290byBkcm9wOworCisJaWYgKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdCA+PQorCSAgICBTRl9NQVhfQUxMT1dFRF9QQUNLRVRTX1RPX0JBQ0tVUCkKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCisJLyogTm93IEVucXVldWUgdGhlIHBhY2tldCAqLworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKEFkYXB0ZXIpKQorCQlwcl9pbmZvKFBGWCAiJXM6IGVucXVldWVpbmcgcGFja2V0IHRvIHF1ZXVlICVkXG4iLAorCQkJZGV2LT5uYW1lLCBxaW5kZXgpOworCisJc3Bpbl9sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKKwlBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVpQ3VycmVudEJ5dGVzT25Ib3N0ICs9IHNrYi0+bGVuOworCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdCsrOworCisJKigoQl9VSU5UMzIgKikgc2tiLT5jYiArIFNLQl9DQl9MQVRFTkNZX09GRlNFVCkgPSBqaWZmaWVzOworCUVOUVVFVUVQQUNLRVQoQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5GaXJzdFR4UXVldWUsCisJCSAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uTGFzdFR4UXVldWUsIHNrYik7CisJYXRvbWljX2luYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7CisJc3Bpbl91bmxvY2soJkFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uU0ZRdWV1ZUxvY2spOworCisJLyogRklYTUUgLSB0aGlzIGlzIHJhY3kgYW5kIGluY29ycmVjdCwgcmVwbGFjZSB3aXRoIHdvcmsgcXVldWUgKi8KKwlpZiAoIWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKSkgeworCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5UeFBrdEF2YWlsLCAxKTsKKwkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOworCX0KKwlyZXR1cm4gTkVUREVWX1RYX09LOworCisgZHJvcDoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworCisKKy8qKgorQGluZ3JvdXAgaW5pdF9mdW5jdGlvbnMKK1JlZ2lzdGVyIG90aGVyIGRyaXZlciBlbnRyeSBwb2ludHMgd2l0aCB0aGUga2VybmVsCisqLworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiY21OZXREZXZPcHMgPSB7CisgICAgLm5kb19vcGVuCQk9IGJjbV9vcGVuLAorICAgIC5uZG9fc3RvcCAJCT0gYmNtX2Nsb3NlLAorICAgIC5uZG9fc3RhcnRfeG1pdAk9IGJjbV90cmFuc21pdCwKKyAgICAubmRvX2NoYW5nZV9tdHUJPSBldGhfY2hhbmdlX210dSwKKyAgICAubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKKyAgICAubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyAgICAubmRvX3NlbGVjdF9xdWV1ZQk9IGJjbV9zZWxlY3RfcXVldWUsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIHdpbWF4X3R5cGUgPSB7CisJLm5hbWUJPSAid2ltYXgiLAorfTsKKworc3RhdGljIGludCBiY21fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCWNtZC0+c3VwcG9ydGVkCQk9IDA7CisJY21kLT5hZHZlcnRpc2luZwk9IDA7CisJY21kLT5zcGVlZAkJPSBTUEVFRF8xMDAwMDsKKwljbWQtPmR1cGxleAkJPSBEVVBMRVhfRlVMTDsKKwljbWQtPnBvcnQJCT0gUE9SVF9UUDsKKwljbWQtPnBoeV9hZGRyZXNzCT0gMDsKKwljbWQtPnRyYW5zY2VpdmVyCT0gWENWUl9JTlRFUk5BTDsKKwljbWQtPmF1dG9uZWcJCT0gQVVUT05FR19ESVNBQkxFOworCWNtZC0+bWF4dHhwa3QJCT0gMDsKKwljbWQtPm1heHJ4cGt0CQk9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSBBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSk7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIldS4ldSIsCisJCSBBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uLAorCQkgQWRhcHRlci0+dWlGbGFzaExheW91dE1pbm9yVmVyc2lvbik7CisKKwl1c2JfbWFrZV9wYXRoKHVkZXYsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKK30KKworc3RhdGljIHUzMiBiY21fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKworCXJldHVybiBBZGFwdGVyLT5MaW5rVXBTdGF0dXM7Cit9CisKK3N0YXRpYyB1MzIgYmNtX2dldF9tc2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKworCXJldHVybiBBZGFwdGVyLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBiY21fc2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisKKwlBZGFwdGVyLT5tc2dfZW5hYmxlID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJPSBiY21fZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9IGJjbV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsgCT0gYmNtX2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJPSBiY21fZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSBiY21fc2V0X21zZ2xldmVsLAorfTsKKworaW50IHJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBBZGFwdGVyLT5kZXY7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgSW50ZkFkYXB0ZXIgPSBBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXI7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVkZXYgPSBJbnRmQWRhcHRlci0+aW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZGV2aWNlICp4ZGV2ID0gSW50ZkFkYXB0ZXItPnVkZXY7CisKIAlpbnQgcmVzdWx0OwotICAgCXJlc3VsdCA9IEludGVyZmFjZUluaXRpYWxpemUoKTsKLQlpZihyZXN1bHQpCi0JewotIAkJcHJpbnRrKCJJbml0aWFsaXNhdGlvbiBmYWlsZWQgZm9yIHVzYmJjbSIpOworCisJbmV0LT5uZXRkZXZfb3BzID0gJmJjbU5ldERldk9wczsKKwluZXQtPmV0aHRvb2xfb3BzID0gJmJjbV9ldGh0b29sX29wczsKKwluZXQtPm10dSA9IE1UVV9TSVpFOwkvKiAxNDAwIEJ5dGVzICovCisJbmV0LT50eF9xdWV1ZV9sZW4gPSBUWF9RTEVOOworCW5ldC0+ZmxhZ3MgfD0gSUZGX05PQVJQOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKKworCVNFVF9ORVRERVZfREVWVFlQRShuZXQsICZ3aW1heF90eXBlKTsKKworCS8qIFJlYWQgdGhlIE1BQyBBZGRyZXNzIGZyb20gRUVQUk9NICovCisJcmVzdWx0ID0gUmVhZE1hY0FkZHJlc3NGcm9tTlZNKEFkYXB0ZXIpOworCWlmIChyZXN1bHQgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJUEZYICJFcnJvciBpbiBSZWFkaW5nIHRoZSBtYWMgQWRkcmVzczogJWQiLCByZXN1bHQpOworIAkJcmV0dXJuIC1FSU87CiAJfQotCWVsc2UKLQl7Ci0JCXByaW50aygiSW5pdGlhbGlzZWQgdXNiYmNtIik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisKKwlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJZ2JscG5ldGRldiA9IEFkYXB0ZXItPmRldjsKKworCWlmIChuZXRpZl9tc2dfcHJvYmUoQWRhcHRlcikpCisJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsIFBGWCAiJXM6IHJlZ2lzdGVyIHVzYi0lcy0lcyAlcE1cbiIsCisJCQkgbmV0LT5uYW1lLCB4ZGV2LT5idXMtPmJ1c19uYW1lLCB4ZGV2LT5kZXZwYXRoLAorCQkJIG5ldC0+ZGV2X2FkZHIpOworCisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgYmNtX2V4aXQodm9pZCkKK3ZvaWQgdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLSAgICBwcmludGsoIiVzICVzIENhbGxpbmcgSW50ZXJmYWNlRXhpdFxuIixfX0ZJTEVfXywgX19GVU5DVElPTl9fKTsKLQlJbnRlcmZhY2VFeGl0KCk7Ci0gICAgcHJpbnRrKCIlcyAlcyBJbnRlcmZhY2VFeGl0IHJldHVybmVkXG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBBZGFwdGVyLT5kZXY7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgSW50ZkFkYXB0ZXIgPSBBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXI7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVkZXYgPSBJbnRmQWRhcHRlci0+aW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZGV2aWNlICp4ZGV2ID0gSW50ZkFkYXB0ZXItPnVkZXY7CisKKwlpZiAobmV0aWZfbXNnX3Byb2JlKEFkYXB0ZXIpKQorCQlkZXZfaW5mbygmdWRldi0+ZGV2LCBQRlggIiVzOiB1bnJlZ2lzdGVyIHVzYi0lcyVzXG4iLAorCQkJIG5ldC0+bmFtZSwgeGRldi0+YnVzLT5idXNfbmFtZSwgeGRldi0+ZGV2cGF0aCk7CisgCisJdW5yZWdpc3Rlcl9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKIH0KLQotbW9kdWxlX2luaXQoYmNtX2luaXQpOwotbW9kdWxlX2V4aXQoYmNtX2V4aXQpOwotTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYwppbmRleCA2ZjM4OGEzLi41YWM0NTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKQEAgLTE1LDYgKzE1LDcgQEAKIAllRGVsZXRlQ2xhc3NpZmllcgogfUVfQ0xBU1NJRklFUl9BQ1RJT047CiAKK3N0YXRpYyBVTE9ORyBHZXROZXh0VGFyZ2V0QnVmZmVyTG9jYXRpb24oUE1JTklfQURBUFRFUiBBZGFwdGVyLEJfVUlOVDE2IHRpZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24JICAtCVNlYXJjaFNmaWQKQEAgLTI4LDcgKzI5LDcgQEAKICogUmV0dXJucwkgIC0gUXVldWUgaW5kZXggZm9yIHRoaXMgU0ZJRChJZiBtYXRjaGVkKQogCQkJCUVsc2UgSW52YWxpZCBRdWV1ZSBJbmRleChJZiBOb3QgbWF0Y2hlZCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIElOVCBTZWFyY2hTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2ZpZCkKK0lOVCBTZWFyY2hTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2ZpZCkKIHsKIAlJTlQgCWlJbmRleD0wOwogCWZvcihpSW5kZXg9KE5PX09GX1FVRVVFUy0xKTsgaUluZGV4Pj0wOyBpSW5kZXgtLSkKQEAgLTQ3LDI2ICs0OCwxNiBAQAogKiBSZXR1cm5zCSAgLSBRdWV1ZSBpbmRleCBmb3IgdGhlIGZyZWUgU0ZJRAogKgkJCQlFbHNlIHJldHVybnMgSW52YWxpZCBJbmRleC4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1fX2lubGluZSBJTlQgU2VhcmNoRnJlZVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIElOVCBTZWFyY2hGcmVlU2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJVUlOVCAJdWlJbmRleD0wOworCiAJZm9yKHVpSW5kZXg9MDsgdWlJbmRleCA8IChOT19PRl9RVUVVRVMtMSk7IHVpSW5kZXgrKykKIAkJaWYoQWRhcHRlci0+UGFja0luZm9bdWlJbmRleF0udWxTRklEPT0wKQogCQkJcmV0dXJuIHVpSW5kZXg7CiAJcmV0dXJuIE5PX09GX1FVRVVFUysxOwogfQogCi1fX2lubGluZSBpbnQgU2VhcmNoVmNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsdW5zaWduZWQgc2hvcnQgdXNWY2lkKQotewotCSBpbnQgaUluZGV4PTA7Ci0JZm9yKGlJbmRleD0oTk9fT0ZfUVVFVUVTLTEpO2lJbmRleD49MDtpSW5kZXgtLSkKLQkJaWYoQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51c1ZDSURfVmFsdWUgPT0gdXNWY2lkKQotCQkJcmV0dXJuIGlJbmRleDsKLQlyZXR1cm4gTk9fT0ZfUVVFVUVTKzE7Ci0KLX0KLQotCiAvKgogRnVuY3Rpb246CQkJCVNlYXJjaENsc2lkCiBEZXNjcmlwdGlvbjoJCQlUaGlzIHJvdXRpbnVlIHdvdWxkIHNlYXJjaCBDbGFzc2lmaWVyICBoYXZpbmcgc3BlY2lmaWVkIENsYXNzaWZpZXJJRCBhcyBpbnB1dCBwYXJhbWV0ZXIKQEAgLTc2LDcgKzY3LDcgQEAKIFJldHVybjoJCQkJCWludCA6Q2xhc3NpZmllciB0YWJsZSBpbmRleCBvZiBtYXRjaGluZyBlbnRyeQogKi8KIAotX19pbmxpbmUgaW50IFNlYXJjaENsc2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVTE9ORyB1bFNGSUQsQl9VSU5UMTYgIHVpQ2xhc3NpZmllcklEKQorc3RhdGljIGludCBTZWFyY2hDbHNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUxPTkcgdWxTRklELEJfVUlOVDE2ICB1aUNsYXNzaWZpZXJJRCkKIHsKIAl1bnNpZ25lZCBpbnQgdWlDbGFzc2lmaWVySW5kZXggPSAwOwogCWZvcih1aUNsYXNzaWZpZXJJbmRleD0wO3VpQ2xhc3NpZmllckluZGV4PE1BWF9DTEFTU0lGSUVSUzt1aUNsYXNzaWZpZXJJbmRleCsrKQpAQCAtOTQsNyArODUsNyBAQAogVGhpcyByb3V0aW51ZSB3b3VsZCBzZWFyY2ggRnJlZSBhdmFpbGFibGUgQ2xhc3NpZmllciBlbnRyeSBpbiBjbGFzc2lmaWVyIHRhYmxlLgogQHJldHVybiBmcmVlIENsYXNzaWZpZXIgRW50cnkgaW5kZXggaW4gY2xhc3NpZmllciB0YWJsZSBmb3Igc3BlY2lmaWVkIFNGCiAqLwotc3RhdGljIF9faW5saW5lIGludCBTZWFyY2hGcmVlQ2xzaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyIC8qKkFkYXB0ZXIgQ29udGV4dCovCitzdGF0aWMgaW50IFNlYXJjaEZyZWVDbHNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIgLyoqQWRhcHRlciBDb250ZXh0Ki8KIAkJCQkJCSkKIHsKIAl1bnNpZ25lZCBpbnQgdWlDbGFzc2lmaWVySW5kZXggPSAwOwpAQCAtMTA2LDcgKzk3LDcgQEAKIAlyZXR1cm4gTUFYX0NMQVNTSUZJRVJTKzE7CiB9CiAKLVZPSUQgZGVsZXRlU0ZCeVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpU2VhcmNoUnVsZUluZGV4KQorc3RhdGljIFZPSUQgZGVsZXRlU0ZCeVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpU2VhcmNoUnVsZUluZGV4KQogewogCS8vZGVsZXRpbmcgYWxsIHRoZSBwYWNrZXQgaGVsZCBpbiB0aGUgU0YKIAlmbHVzaF9xdWV1ZShBZGFwdGVyLHVpU2VhcmNoUnVsZUluZGV4KTsKQEAgLTk4NSw3ICs5NzYsNyBAQAogCiAJaWYoQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnBzdFNGSW5kaWNhdGlvbikKIAl7Ci0JCWJjbV9rZnJlZShBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0ucHN0U0ZJbmRpY2F0aW9uKTsKKwkJa2ZyZWUoQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnBzdFNGSW5kaWNhdGlvbik7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5wc3RTRkluZGljYXRpb24gPSBOVUxMOwogCX0KIAlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0ucHN0U0ZJbmRpY2F0aW9uID0gcHN0QWRkSW5kaWNhdGlvbjsKQEAgLTEwNjEsMTIgKzEwNTIsNiBAQAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudTMyTWF4VHJhZmZpY0J1cnN0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeSk7Ci0jZW5kaWYKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAidThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51OFZlbmRvclNwZWNpZmljUW9TUGFyYW1MZW5ndGgpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OFZlbmRvclNwZWNpZmljUW9TUGFyYW0JCTogMHglWCIsCkBAIC0xMTE0LDEzICsxMDk5LDYgQEAKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnU4UGFnaW5nUHJlZmVyZW5jZSk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MTZVbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbAkJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnUxNlVuc29saWNpdGVkUG9sbGluZ0ludGVydmFsKTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aCk7Ci0JZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgTUFYX1NUUklOR19MRU47IHVpTG9vcEluZGV4KyspCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50IDogMHglWCIsCi0JCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50W3VpTG9vcEluZGV4XSk7Ci0jZW5kaWYKIAogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAic2ZBdXRob3JpemVkU2V0LnU4SEFSUUNoYW5uZWxNYXBwaW5nICV4ICAleCAleCAiLAogCQkJCSoodW5zaWduZWQgaW50Kilwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudThIQVJRQ2hhbm5lbE1hcHBpbmcsCkBAIC0xMTU4LDExICsxMTM2LDYgQEAKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMF0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzFdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsyXSk7Ci0jaWYgMAotCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1OFByb3RvY29sTGVuZ3RoCQkJCToweCVYICIsCi0JCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2xMZW5ndGgpOwotI2VuZGlmCiAKIAkJZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgMTsgdWlMb29wSW5kZXgrKykKIAkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThQcm90b2NvbCA6IDB4JTAyWCAiLApAQCAtMTI3OCwxNCArMTI1MSw2IEBACiAJCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnU4UW9zUGFyYW1TZXQpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThUcmFmZmljUHJpb3JpdHkJCQk6IDB4JTAyWCIsCiAJCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnU4VHJhZmZpY1ByaW9yaXR5KTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMk1heFN1c3RhaW5lZFRyYWZmaWNSYXRlCTogMHglMDJYIiwKLQkJCW50b2hsKHBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudTMyTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGUpKTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlKTsKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kpOwotI2VuZGlmCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJNYXhUcmFmZmljQnVyc3QJCQk6IDB4JVgiLAogCQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51MzJNYXhUcmFmZmljQnVyc3QpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZQk6IDB4JVgiLApAQCAtMTMzOSwxMyArMTMwNCw2IEBACiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudTE2VGltZUJhc2UpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThQYWdpbmdQcmVmZXJlbmNlCQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnU4UGFnaW5nUHJlZmVyZW5jZSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoKTsKLQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCBNQVhfU1RSSU5HX0xFTjsgdWlMb29wSW5kZXgrKykKLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnQgOiAweCVYIiwKLQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudFt1aUxvb3BJbmRleF0pOwotI2VuZGlmCiAKIAogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThUcmFmZmljSW5kaWNhdGlvblByZWZlcmVuY2UJOiAweCUwMlgiLApAQCAtMTM3OCwxMSArMTMzNiw2IEBACiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzBdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsxXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMl0pOwotI2lmIDAKLQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4UHJvdG9jb2xMZW5ndGgJCQk6MHglMDJYICIsCi0JCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2xMZW5ndGgpOwotI2VuZGlmCiAJCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IDE7IHVpTG9vcEluZGV4KyspCiAJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4UHJvdG9jb2w6IDB4JTAyWCAiLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sKTsKQEAgLTE0OTcsMjAgKzE0NTAsMTAgQEAKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudThRb3NQYXJhbVNldCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFRyYWZmaWNQcmlvcml0eQkJCTogMHglMDJYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudThUcmFmZmljUHJpb3JpdHkpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGUJOiAweCUwMlgiLAotCQludG9obChwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZSkpOwotI2VuZGlmCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJNYXhUcmFmZmljQnVyc3QJCQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJNYXhUcmFmZmljQnVyc3QpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidTMyTWluUmVzZXJ2ZWRUcmFmZmljUmF0ZQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlKTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZQk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5CTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kpOwotI2VuZGlmCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFZlbmRvclNwZWNpZmljUW9TUGFyYW1MZW5ndGgJOiAweCUwMlgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51OFZlbmRvclNwZWNpZmljUW9TUGFyYW1MZW5ndGgpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtCQk6IDB4JTAyWCIsCkBAIC0xNTU4LDEzICsxNTAxLDYgQEAKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTE2VGltZUJhc2UpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiIHU4UGFnaW5nUHJlZmVyZW5jZQkJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudThQYWdpbmdQcmVmZXJlbmNlKTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICIgTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aCk7Ci0JZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgTUFYX1NUUklOR19MRU47IHVpTG9vcEluZGV4KyspCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiIE1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudCA6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRbdWlMb29wSW5kZXhdKTsKLSNlbmRpZgogCiAKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIiB1OFRyYWZmaWNJbmRpY2F0aW9uUHJlZmVyZW5jZQk6IDB4JVgiLApAQCAtMTU5NywxMSArMTUzMyw2IEBACiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzBdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsxXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMl0pOwotI2lmIDAKLQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiIHU4UHJvdG9jb2xMZW5ndGgJCQkJOjB4JVggIiwKLQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbExlbmd0aCk7Ci0jZW5kaWYKIAkJZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgMTsgdWlMb29wSW5kZXgrKykKIAkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiIHU4UHJvdG9jb2wJOiAweCVYICIsCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2wpOwpAQCAtMTcwNiwxMiArMTYzNyw4IEBACiAJCXJldHVybiAwOwogCX0KIAl1bEFkZHJTRlBhcmFtU2V0ID0gbnRvaGwodWxBZGRyU0ZQYXJhbVNldCk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiIFJlc3RvcmVTRlBhcmFtOiBUb3RhbCBXb3JkcyBvZiBEU1ggTWVzc2FnZSBUbyBSZWFkOiAweCV6eCAgRnJvbSBUYXJnZXQgQXQgOiAweCVseCAiLAotCQkJCW5CeXRlc1RvUmVhZC9zaXplb2YoVUxPTkcpLHVsQWRkclNGUGFyYW1TZXQpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJzaXplb2Yoc3RTZXJ2aWNlRmxvd1BhcmFtU0kpID0gJXp4Iiwgc2l6ZW9mKHN0U2VydmljZUZsb3dQYXJhbVNJKSk7CiAKIAkvL1JlYWQgb3V0IHRoZSBTRiBQYXJhbSBTZXQgQXQgdGhlIGluZGljYXRlZCBMb2NhdGlvbgotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJuQnl0ZXNUb1JlYWQgPSAleCIsIG5CeXRlc1RvUmVhZCk7CiAJaWYocmRtKEFkYXB0ZXIsIHVsQWRkclNGUGFyYW1TZXQsIChQVUNIQVIpcHVjRGVzdEJ1ZmZlciwgbkJ5dGVzVG9SZWFkKSA8IDApCiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIApAQCAtMTcxOSwyMyArMTY0NiwyMCBAQAogfQogCiAKLXN0YXRpYyBfX2lubGluZSBVTE9ORyBTdG9yZVNGUGFyYW0oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNTcmNCdWZmZXIsVUxPTkcgIHVsQWRkclNGUGFyYW1TZXQpCitzdGF0aWMgVUxPTkcgU3RvcmVTRlBhcmFtKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjU3JjQnVmZmVyLFVMT05HICB1bEFkZHJTRlBhcmFtU2V0KQogewogICAgIFVJTlQJbkJ5dGVzVG9Xcml0ZSA9IHNpemVvZihzdFNlcnZpY2VGbG93UGFyYW1TSSk7Ci0JVUlOVCAJdWlSZXRWYWwgPTA7CisJaW50IHJldCA9IDA7CiAKIAlpZih1bEFkZHJTRlBhcmFtU2V0ID09IDAgfHwgTlVMTCA9PSBwdWNTcmNCdWZmZXIpCiAJewogCQlyZXR1cm4gMDsKIAl9Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIiBTdG9yZVNGUGFyYW06IFRvdGFsIFdvcmRzIG9mIERTWCBNZXNzYWdlIFRvIFdyaXRlOiAweCV6WCAgVG8gVGFyZ2V0IEF0IDogMHglbFggIiwobkJ5dGVzVG9Xcml0ZS9zaXplb2YoVUxPTkcpKSx1bEFkZHJTRlBhcmFtU2V0KTsKIAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJXUk0gIHdpdGggJXggYnl0ZXMiLG5CeXRlc1RvV3JpdGUpOwotCi0JdWlSZXRWYWwgPSB3cm0oQWRhcHRlcix1bEFkZHJTRlBhcmFtU2V0LChQVUNIQVIpcHVjU3JjQnVmZmVyLCBuQnl0ZXNUb1dyaXRlKTsKLQlpZih1aVJldFZhbCA8IDApIHsKKwlyZXQgPSB3cm0oQWRhcHRlciwgdWxBZGRyU0ZQYXJhbVNldCwgKHU4ICopcHVjU3JjQnVmZmVyLCBuQnl0ZXNUb1dyaXRlKTsKKwlpZiAocmV0IDwgMCkgewogCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiJXM6JWQgV1JNIGZhaWxlZCIsX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiB1aVJldFZhbDsKKwkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC0xNzc4LDcgKzE3MDIsNyBAQAogCX0KIAkvLyBGb3IgRFNBX1JFUSwgb25seSB1cHRvICJwc2ZBdXRob3JpemVkU2V0IiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGFjY2Vzc2VkIGJ5IGRyaXZlciEKIAotCXBzdEFkZEluZGljYXRpb249KHN0TG9jYWxTRkFkZEluZGljYXRpb24gKilrbWFsbG9jKHNpemVvZigqcHN0QWRkSW5kaWNhdGlvbiksIEdGUF9LRVJORUwpOworCXBzdEFkZEluZGljYXRpb249a21hbGxvYyhzaXplb2YoKnBzdEFkZEluZGljYXRpb24pLCBHRlBfS0VSTkVMKTsKIAlpZihOVUxMPT1wc3RBZGRJbmRpY2F0aW9uKQogCQlyZXR1cm4gMDsKIApAQCAtMTg0NCw3ICsxNzY4LDcgQEAKIAogCSgqcHVCdWZmZXJMZW5ndGgpID0gc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb24pOwogCSooc3RMb2NhbFNGQWRkSW5kaWNhdGlvbiAqKXB2QnVmZmVyID0gKnBzdEFkZEluZGljYXRpb247Ci0JYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCXJldHVybiAxOwogfQogCkBAIC0xOTMxLDcgKzE4NTUsNyBAQAogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwogCXJldHVybiBwc3RBZGRJbmRpY2F0aW9uRGVzdDsKIGZhaWxlZF9yZXN0b3JlX3NmX3BhcmFtOgotCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uRGVzdCk7CisJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbkRlc3QpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIjw9PT09PSIgKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE5ODgsNyArMTkxMiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLVVMT05HIEdldE5leHRUYXJnZXRCdWZmZXJMb2NhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsQl9VSU5UMTYgdGlkKQorc3RhdGljIFVMT05HIEdldE5leHRUYXJnZXRCdWZmZXJMb2NhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsQl9VSU5UMTYgdGlkKQogewogCVVMT05HICB1bFRhcmdldERTWEJ1ZmZlckFkZHJlc3M7CiAJVUxPTkcgIHVsVGFyZ2V0RHN4QnVmZmVySW5kZXhUb1VzZSx1bE1heFRyeTsKQEAgLTIwNDksNyArMTk3Myw3IEBACiB7CiAJaWYoQWRhcHRlci0+Y2FEc3hSZXFSZXNwKQogCXsKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7CisJCWtmcmVlKEFkYXB0ZXItPmNhRHN4UmVxUmVzcCk7CiAJfQogCXJldHVybiAwOwogCkBAIC0yMTAyLDcgKzIwMjYsNyBAQAogCiAJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiIFZDSUQgPSAleCIsIG50b2hzKHBzdEFkZEluZGljYXRpb24tPnUxNlZDSUQpKTsKIAkJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwoUFZPSUQpQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKLQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQl9CiAJCWJyZWFrOwogCQljYXNlIERTQV9SU1A6CkBAIC0yMTE4LDcgKzIwNDIsNyBAQAogCQljYXNlIERTQV9BQ0s6CiAJCXsKIAkJCVVJTlQgdWlTZWFyY2hSdWxlSW5kZXg9MDsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2ID0gezB9OworCiAJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICJWQ0lEOjB4JVgiLAogCQkJCW50b2hzKHBzdEFkZEluZGljYXRpb24tPnUxNlZDSUQpKTsKICAgICAgICAgICAgIHVpU2VhcmNoUnVsZUluZGV4PVNlYXJjaEZyZWVTZmlkKEFkYXB0ZXIpOwpAQCAtMjE2OSw3ICsyMDkzLDcgQEAKIAkJCQkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLmJBY3RpdmU9RkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iVmFsaWQ9RkFMU0U7CiAJCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS51c1ZDSURfVmFsdWU9MDsKLQkJCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJCQl9CiAKIAkJCQllbHNlIGlmKHBzZkxvY2FsU2V0LT5iVmFsaWQgJiYgKHBzdEFkZEluZGljYXRpb24tPnU4Q0MgPT0gMCkpCkBAIC0yMjAwLDE0ICsyMTI0LDEzIEBACiAJCQkJCQkJaWYoIUFkYXB0ZXItPkxpbmtVcFN0YXR1cykKIAkJCQkJCQl7CiAJCQkJCQkJCW5ldGlmX2NhcnJpZXJfb24oQWRhcHRlci0+ZGV2KTsKLSAgICAJCQkJCQkJbmV0aWZfc3RhcnRfcXVldWUoQWRhcHRlci0+ZGV2KTsKKwkJCQkJCQkJbmV0aWZfc3RhcnRfcXVldWUoQWRhcHRlci0+ZGV2KTsKIAkJCQkJCQkJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMTsKLQkJCQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KKwkJCQkJCQkJaWYgKG5ldGlmX21zZ19saW5rKEFkYXB0ZXIpKQorCQkJCQkJCQkJcHJfaW5mbyhQRlggIiVzOiBsaW5rIHVwXG4iLCBBZGFwdGVyLT5kZXYtPm5hbWUpOwogCQkJCQkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5UeFBrdEF2YWlsLCAxKTsKIAkJCQkJCQkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwotCQkJCQkJCQlBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeSA9IHR2LnR2X3NlYzsKLQkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICI9PT09PT09PT09PT1UeCBTZXJ2aWNlIEZsb3cgQ3JlYXRlZCEiKTsKKwkJCQkJCQkJQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnkgPSBnZXRfc2Vjb25kcygpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtMjIxOCwxMyArMjE0MSwxMyBAQAogCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0uYkFjdGl2ZT1GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLmJWYWxpZD1GQUxTRTsKIAkJCQkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnVzVkNJRF9WYWx1ZT0wOwotCQkJCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRFNBIEFDSyBkaWQgbm90IGdldCB2YWxpZCBTRklEIik7Ci0JCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KIAkJfQpAQCAtMjIzOSw3ICsyMTYyLDcgQEAKIAkJCSgoc3RMb2NhbFNGQ2hhbmdlSW5kaWNhdGlvbkFsdCopJihBZGFwdGVyLT5jYURzeFJlcVJlc3BbTEVBREVSX1NJWkVdKSktPnU4VHlwZSA9IERTQ19SU1A7CiAKIAkJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwoUFZPSUQpQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKLQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQl9CiAJCWJyZWFrOwogCQljYXNlIERTQ19SU1A6CkBAIC0yMzEyLDEzICsyMjM1LDEzIEBACiAJCQkJZWxzZSBpZihwc3RDaGFuZ2VJbmRpY2F0aW9uLT51OENDID09IDYpCiAJCQkJewogCQkJCQlkZWxldGVTRkJ5U2ZpZChBZGFwdGVyLHVpU2VhcmNoUnVsZUluZGV4KTsKLQkJCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRTQyBBQ0sgZGlkIG5vdCBnZXQgdmFsaWQgU0ZJRCIpOwotCQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCQlrZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKIAkJCQlyZXR1cm4gRkFMU0U7CiAJCQl9CiAJCX0KQEAgLTIzNTUsNyArMjI3OCw3IEBACiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIkRTRCBBQ0sgUmNkLCBsZXQgQXBwIGhhbmRsZSBpdFxuIik7CiAJCQlicmVhazsKIAlkZWZhdWx0OgotCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQlyZXR1cm4gRkFMU0UgOwogCX0KIAlyZXR1cm4gVFJVRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5oCmluZGV4IDg0Nzc4MmMuLjhmNjg5NzY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5oCkBAIC0xNTAsOCArMTUwLDYgQEAKIAogVUxPTkcgU3RvcmVDbUNvbnRyb2xSZXNwb25zZU1lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyLFVJTlQgKnB1QnVmZmVyTGVuZ3RoKTsKIAotVUxPTkcgR2V0TmV4dFRhcmdldEJ1ZmZlckxvY2F0aW9uKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiB0aWQpOwotCiBJTlQgQWxsb2NBZGFwdGVyRHN4QnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBGcmVlQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwpAQCAtMTU5LDcgKzE1Nyw2IEBACiAKIEJPT0xFQU4gQ21Db250cm9sUmVzcG9uc2VNZXNzYWdlKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkJ1ZmZlcik7CiAKLVZPSUQgZGVsZXRlU0ZCeVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpU2VhcmNoUnVsZUluZGV4KTsKIAogI3ByYWdtYSBwYWNrIChwb3ApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKaW5kZXggODkwN2UyMS4uMWM3ZGI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKQEAgLTEsNiArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAKIAogI2RlZmluZSBERFJfRFVNUF9JTlRFUk5BTF9ERVZJQ0VfTUVNT1JZIDB4QkZDMDJCMDAKQEAgLTE4OCwxNyArMTg3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg0MCwweDBGRkYxQjAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg3MCwweDAwMDAwMDAyfQogCQkJCQkJCQkJICB9OwotI2lmIDAKLXN0YXRpYyBERFJfU0VUX05PREUgYXNEUExMXzgwME1IWltdID0gewotCQkJCQkJCQkJCXsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotCQkJCQkJCQkJCXsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODIwLDB4MDNGMTM2NUJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODQwLDB4MEZGRjAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODgwLDB4MDAwMDAzRER9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODYwLDB4MDAwMDAwMDB9Ci0JCQkJCQkJCQkgIH07Ci0jZW5kaWYKIAogI2RlZmluZSBUM0JfU0tJUF9DTE9DS19QUk9HUkFNX0RVTVBfMTMzTUhaIDExICAvL2luZGV4IGZvciAweDBGMDA3MDAwCiBzdGF0aWMgRERSX1NFVF9OT0RFIGFzVDNCX0REUlNldHRpbmcxMzNNSHpbXSA9IHsvLyAgICAgICMgRFBMTCBDbG9jayBTZXR0aW5nCkBAIC03ODgsNyArNzc2LDcgQEAKIHsKIAlQRERSX1NFVFRJTkcgcHNERFJTZXR0aW5nPU5VTEw7CiAJVUxPTkcgUmVnQ291bnQ9MDsKLQlVTE9ORyB2YWx1ZSA9IDA7CisJVUlOVCB2YWx1ZSA9IDA7CiAJVUlOVCAgdWlSZXNldFZhbHVlID0gMDsKIAlVSU5UIHVpQ2xvY2tTZXR0aW5nID0gMDsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CkBAIC05ODIsNyArOTcwLDcgQEAKIAkJewogCQkJdmFsdWUgPSBwc0REUlNldHRpbmctPnVsUmVnVmFsdWU7CiAJCX0KLQkJcmV0dmFsID0gd3JtYWx0KEFkYXB0ZXIsIHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzLCAoUFVJTlQpJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwkJcmV0dmFsID0gd3JtYWx0KEFkYXB0ZXIsIHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCQlpZihTVEFUVVNfU1VDQ0VTUyAhPSByZXR2YWwpIHsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiJXM6JWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogCQkJYnJlYWs7CkBAIC0xMjk4LDUgKzEyODYsNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLSNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDNmMzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI2luY2x1ZGUgImhlYWRlcnMuaCIKLQotc3RhdGljIFVJTlQgY3VycmVudF9kZWJ1Z19sZXZlbD1CQ01fU0NSRUFNOwotCi1pbnQgYmNtX3ByaW50X2J1ZmZlciggVUlOVCBkZWJ1Z19sZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJCQkgIGNoYXIgKmZpbGVfbmFtZSwgaW50IGxpbmVfbnVtYmVyLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZmZXJsZW4sIGVudW0gX0JBU0VfVFlQRSBiYXNlKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVmZl9kdW1wX2Jhc2VbXSA9IHsKLQkJIkRFQyIsICJIRVgiLCAiT0NUIiwgIkJJTiIKLQl9OwotCWlmKGRlYnVnX2xldmVsPj1jdXJyZW50X2RlYnVnX2xldmVsKQotCXsKLQkJaW50IGk9MDsKLQkJcHJpbnRrKCJcbiVzOiVzOiVkOkJ1ZmZlciBkdW1wIG9mIHNpemUgMHgleCBpbiB0aGUgJXM6XG4iLCBmaWxlX25hbWUsIGZ1bmN0aW9uX25hbWUsIGxpbmVfbnVtYmVyLCBidWZmZXJsZW4sIGJ1ZmZfZHVtcF9iYXNlWzFdKTsKLQkJZm9yKDtpPGJ1ZmZlcmxlbjtpKyspCi0JCXsKLQkJCWlmKGkgJiYgIShpJTE2KSApCi0JCQkJcHJpbnRrKCJcbiIpOwotCQkJc3dpdGNoKGJhc2UpCi0JCQl7Ci0JCQkJY2FzZSBCQ01fQkFTRV9UWVBFX0RFQzoKLQkJCQkJcHJpbnRrKCIlMDNkICIsIGJ1ZmZlcltpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQkNNX0JBU0VfVFlQRV9PQ1Q6Ci0JCQkJCXByaW50aygiJTB4MDNvICIsIGJ1ZmZlcltpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQkNNX0JBU0VfVFlQRV9CSU46Ci0JCQkJCXByaW50aygiJTAyeCAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJDTV9CQVNFX1RZUEVfSEVYOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXByaW50aygiJTAyWCAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuaAppbmRleCAzZDc4OGI1Li4zMTM4NzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5oCkBAIC05LDM0ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNkZWZpbmUgTk9ORSAweEZGRkYKIAotdHlwZWRlZiBlbnVtIF9CQVNFX1RZUEUKLXsKLQlCQ01fQkFTRV9UWVBFX0RFQywKLQlCQ01fQkFTRV9UWVBFX09DVCwKLQlCQ01fQkFTRV9UWVBFX0JJTiwKLQlCQ01fQkFTRV9UWVBFX0hFWCwKLQlCQ01fQkFTRV9UWVBFX05PTkUsCi19IEJBU0VfVFlQRSwgKlBCQVNFX1RZUEU7Ci0KLWludCBiY21fcHJpbnRfYnVmZmVyKCBVSU5UIGRlYnVnX2xldmVsLCBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCQkJCSAgY2hhciAqZmlsZV9uYW1lLCBpbnQgbGluZV9udW1iZXIsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcmxlbiwgQkFTRV9UWVBFIGJhc2UpOwotCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLSNkZWZpbmUgQ1BFX1ZJUlRVQUxfRVJST1JfQ09ERV9CQVNFX0FERFIJCSgweEJGQzAyRTAwICsgMHg0QykKLS8vIEVSUk9SIGNvZGVzIGZvciBkZWJ1Z2dpbmcKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHUzMkVycm9yQ291bnRlciA7Ci0jZGVmaW5lIEVSUk9SX0RFVklDRV9SRU1PVkVEICAweDEKLSNkZWZpbmUgRVJST1JfTEVBREVSX0xFTkdUSF9aRVJPICAweDIKLSNkZWZpbmUgRVJST1JfTEVBREVSX0xFTkdUSF9DT1JSVVBURUQgIDB4MwotI2RlZmluZSBFUlJPUl9OT19TS0JVRkYgIDB4NAotCi0jZGVmaW5lIEVSUk9SX0RMX01PRFVMRSAweGFhMDAwMDAwCi1leHRlcm4gdm9pZCAgQ1BFX0VSUk9SX0xPRyh1bnNpZ25lZCBpbnQgbW9kdWxlLHVuc2lnbmVkIGludCBjb2RlKTsKLQotI2VuZGlmCi0KLQotCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjQyLDQzICsyMTQsMzMgQEAKIAogLy8tLS0gT25seSBmb3IgZGlyZWN0IHByaW50aydzOyAiaGlkZGVuIiB0byBBUEkuCiAjZGVmaW5lIERCR19UWVBFX1BSSU5USwkJMwotI2RlZmluZSBQUklOVEtTX09OCQkJMQkvLyAiaGlkZGVuIiBmcm9tIEFQSSwgc2V0IHRvIDAgdG8gdHVybiBvZmYgYWxsIHByaW50aydzCiAKLSNkZWZpbmUgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIFR5cGUsIFN1YlR5cGUsIGRiZ19sZXZlbCwgc3RyaW5nLCBhcmdzLi4uKSBkbyB7IFwKLQlpZiAoKERCR19UWVBFX1BSSU5USyA9PSBUeXBlKSAmJiAoUFJJTlRLU19PTikpIHsJXAotCQlwcmludGsgKCIlczoiIHN0cmluZywgX19GVU5DVElPTl9fLCAjI2FyZ3MpOwlcCi0JCXByaW50aygiXG4iKTsJXAotCX0gZWxzZSBpZiAoIUFkYXB0ZXIpCQkJXAotCQk7CQkJCQkJCVwKLQllbHNlIHsJCQkJCQkJXAotCQlpZiAoKChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCkgJiYJXAotCQkgICAoKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYgKFN1YlR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtUeXBlXSkpKSB7IFwKLQkJICAgCQlpZiAoZGJnX2xldmVsICYgREJHX05PX0ZVTkNfUFJJTlQpCQlcCi0JCQkJCXByaW50ayAoc3RyaW5nLCAjI2FyZ3MpOwkJCQkJCVwKLQkJCQllbHNlCVwKLQkJCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJcHJpbnRrICgiJXM6IiBzdHJpbmcsIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsJXAotCQkJCQlwcmludGsoIlxuIik7IFwKLQkJCQkJfSBcCi0JCX0JXAotCQl9CVwKLX0gd2hpbGUgKDApCisjZGVmaW5lIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBUeXBlLCBTdWJUeXBlLCBkYmdfbGV2ZWwsIHN0cmluZywgYXJncy4uLikgXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKERCR19UWVBFX1BSSU5USyA9PSBUeXBlKQkJCQlcCisJCQlwcl9pbmZvKCIlczoiIHN0cmluZywgX19mdW5jX18sICMjYXJncyk7CVwKKwkJZWxzZSBpZiAoQWRhcHRlciAmJgkJCQkJXAorCQkJIChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCAmJiBcCisJCQkgKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYJCVwKKwkJCSAoU3ViVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW1R5cGVdKSkgeyBcCisJCQlpZiAoZGJnX2xldmVsICYgREJHX05PX0ZVTkNfUFJJTlQpCQlcCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgc3RyaW5nLCAjI2FyZ3MpOwlcCisJCQllbHNlCQkJCQkJXAorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczoiIHN0cmluZywgX19mdW5jX18sICMjYXJncyk7CVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIFR5cGUsIFN1YlR5cGUsIGRiZ19sZXZlbCwgIGJ1ZmZlciwgYnVmZmVybGVuKSBkbyB7IFwKLQkJaWYgKChEQkdfVFlQRV9QUklOVEsgPT0gVHlwZSkgJiYgKFBSSU5US1NfT04pKSB7CVwKLQkJCWJjbV9wcmludF9idWZmZXIoIGRiZ19sZXZlbCwgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18sIGJ1ZmZlciwgYnVmZmVybGVuLCBCQ01fQkFTRV9UWVBFX0hFWCk7CVwKLQkJfSBlbHNlIGlmICghQWRhcHRlcikJCQlcCi0JCQk7CQkJCQkJCVwKLQkJZWxzZSB7CQkJCQkJCVwKLQkJCWlmICgoKGRiZ19sZXZlbCAmIERCR19MVkxfQklUTUFTSykgPD0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsKSAgJiYgXAotCQkJICAgKChUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpICYmIChTdWJUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbVHlwZV0pKSkgeyBcCi0JCQkJCWlmIChkYmdfbGV2ZWwgJiBEQkdfTk9fRlVOQ19QUklOVCkJCVwKLQkJCQkJCWJjbV9wcmludF9idWZmZXIoIGRiZ19sZXZlbCwgTlVMTCwgTlVMTCwgX19MSU5FX18sIGJ1ZmZlciwgYnVmZmVybGVuLCBCQ01fQkFTRV9UWVBFX0hFWCk7CQkJCQkJXAotCQkJCQllbHNlCQkJCQkJCQkJCQkJXAotCQkJCQkJYmNtX3ByaW50X2J1ZmZlciggZGJnX2xldmVsLCBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYnVmZmVyLCBidWZmZXJsZW4sIEJDTV9CQVNFX1RZUEVfSEVYKTsJXAotCQkJfQlcCi0JCX0JXAotCX0gd2hpbGUgKDApCisJaWYgKERCR19UWVBFX1BSSU5USyA9PSBUeXBlIHx8CQkJCQlcCisJICAgIChBZGFwdGVyICYmCQkJCQkJCVwKKwkgICAgIChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCAgJiYgXAorCSAgICAgKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYJCQlcCisJICAgICAoU3ViVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW1R5cGVdKSkpIHsJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6XG4iLCBfX2Z1bmNfXyk7CQkJXAorCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiICIsIERVTVBfUFJFRklYX09GRlNFVCwJXAorCQkJICAgICAgIDE2LCAxLCBidWZmZXIsIGJ1ZmZlcmxlbiwgZmFsc2UpOwlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQogCiAKICNkZWZpbmUgQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpCWRvIHsgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9IYW5kbGVDb250cm9sUGFja2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYwppbmRleCA3YjJlYzI4Li4yYjFlOWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYwpAQCAtMTEsOCArMTEsNyBAQAogRW5xdWV1ZSB0aGUgY29udHJvbCBwYWNrZXQgZm9yIEFwcGxpY2F0aW9uLgogQHJldHVybiBOb25lCiAqLwotVk9JRCBoYW5kbGVfcnhfY29udHJvbF9wYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAJLyoqPFBvaW50ZXIgdG8gdGhlIEFkYXB0ZXIgc3RydWN0dXJlKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikJCQkJLyoqPFBvaW50ZXIgdG8gdGhlIHNvY2tldCBidWZmZXIqLworc3RhdGljIFZPSUQgaGFuZGxlX3J4X2NvbnRyb2xfcGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlQUEVSX1RBUkFOR19EQVRBCXBUYXJhbmcgPSBOVUxMOwogCUJPT0xFQU4gSGlnaFByaW9yaXR5TWVzc2FnZSA9IEZBTFNFOwpAQCAtMjAsOCArMTksMTAgQEAKIAlDSEFSIGNudHJsX21zZ19tYXNrX2JpdCA9IDA7CiAJQk9PTEVBTiBkcm9wX3BrdF9mbGFnID0gVFJVRSA7CiAJVVNIT1JUIHVzU3RhdHVzID0gKihQVVNIT1JUKShza2ItPmRhdGEpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCS8qIEdldCB0aGUgTGVhZGVyIGZpZWxkICovCisKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEoQWRhcHRlcikpCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIFBGWCAicnggY29udHJvbDogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgMCk7CiAKIAlzd2l0Y2godXNTdGF0dXMpCiAJewpAQCAtMTM0LDcgKzEzNSw3IEBACiAgICAgfQogCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOwogICAgIHdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlKTsKLSAgICBiY21fa2ZyZWVfc2tiKHNrYik7CisgICAgZGV2X2tmcmVlX3NrYihza2IpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIkFmdGVyIHdha2VfdXBfaW50ZXJydXB0aWJsZSIpOwogfQogCkBAIC0xODUsMzMgKzE4Niw3IEBACiAJCQl7CiAJCQkJREVRVUVVRVBBQ0tFVChBZGFwdGVyLT5SeENvbnRyb2xIZWFkLEFkYXB0ZXItPlJ4Q29udHJvbFRhaWwpOwogLy8JCQkJQWRhcHRlci0+UnhDb250cm9sSGVhZD1jdHJsX3BhY2tldC0+bmV4dDsKLQkJCQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnJ4X2J5dGVzKz0KLQkJCQkoKFBMRUFERVIpY3RybF9wYWNrZXQtPmRhdGEpLT5QTGVuZ3RoOwogCQkJfQotCQkJI2lmIDAgIC8vSWRsZSBtb2RlIGRlYnVnIHByb2ZpbGluZy4uLgotCQkJaWYoKihQVVNIT1JUKWN0cmxfcGFja2V0LT5kYXRhID09IElETEVfTU9ERV9TVEFUVVMpCi0JCQl7Ci0JCQkJcHVpQnVmZmVyID0gKFBVSU5UKShjdHJsX3BhY2tldC0+ZGF0YSArc2l6ZW9mKFVTSE9SVCkpOwotCQkJCWlmKChudG9obCgqcHVpQnVmZmVyKSA9PSBHT19UT19JRExFX01PREVfUEFZTE9BRCkpCi0JCQkJewotCQkJCQltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKLQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCQkJCWlmKChudG9obCgqKHB1aUJ1ZmZlcisxKSkgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ1BfQ1RSTF9QS1QsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgV2FrZS11cCBNc2cgZnJvbSBmL3cgYXQgdGltZSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ1BfQ1RSTF9QS1QsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgcmVxIE1zZyBmcm9tIGYvdyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmKChudG9obCgqcHVpQnVmZmVyKSA9PSBJRExFX01PREVfU0ZfVVBEQVRFX01TRykpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIkdPVCBJRExFX01PREVfU0ZfVVBEQVRFIE1TRyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkjZW5kaWYKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJkFkYXB0ZXItPmNvbnRyb2xfcXVldWVfbG9jaywgZmxhZ3MpOwogCQkgCWhhbmRsZV9yeF9jb250cm9sX3BhY2tldChBZGFwdGVyLCBjdHJsX3BhY2tldCk7CkBAIC0yMzQsNyArMjA5LDcgQEAKIAkJewogCQkJUGFja2V0VG9Ecm9wPXBUYXJhbmctPlJ4QXBwQ29udHJvbEhlYWQ7CiAJCQlERVFVRVVFUEFDS0VUKHBUYXJhbmctPlJ4QXBwQ29udHJvbEhlYWQscFRhcmFuZy0+UnhBcHBDb250cm9sVGFpbCk7Ci0JCQliY21fa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CisJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CiAJCX0KIAkJcFRhcmFuZy0+QXBwQ3RybFF1ZXVlTGVuID0gMDsKIAkJLy9kcm9wcGVkIGNvbnRybCBwYWNrZXQgc3RhdGlzdGljcyBhbHNvIHNob3VsZCBiZSByZXNldC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSG9zdE1pYnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSG9zdE1pYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNTc4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0hvc3RNaWJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX0hPU1RfTUlCU19ICi0jZGVmaW5lIF9IT1NUX01JQlNfSAotCi1JTlQgUHJvY2Vzc0dldEhvc3RNaWJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQkJCQkJCSAgUFZPSUQgaW9CdWZmZXIsCi0JCQkJCQkgIFVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sLmMKaW5kZXggNWVjM2I4OS4uOTFiNmZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbC5jCkBAIC0xLDUgKzEsOSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIEJPT0xFQU4gTWF0Y2hTcmNJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CitzdGF0aWMgQk9PTEVBTiBNYXRjaERlc3RJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CitzdGF0aWMgVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKKwogc3RhdGljIFVDSEFSICogR2V0TmV4dElQVjZDaGFpbmVkSGVhZGVyKFVDSEFSICoqcHB1Y1BheWxvYWQsVUNIQVIgKnB1Y05leHRIZWFkZXIsQk9PTEVBTiAqYlBhcnNlRG9uZSxVU0hPUlQgKnB1c1BheWxvYWRMZW5ndGgpCiB7CiAJVUNIQVIgKnB1Y1JldEhlYWRlclB0ciA9IE5VTEw7CkBAIC0yNTcsNyArMjYxLDcgQEAKIH0KIAogCi1CT09MRUFOIE1hdGNoU3JjSXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCitzdGF0aWMgQk9PTEVBTiBNYXRjaFNyY0lwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQogewogCVVJTlQgdWlMb29wSW5kZXg9MDsKIAlVSU5UICB1aUlwdjZBZGRJbmRleD0wOwpAQCAtMzEwLDcgKzMxNCw3IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCi1CT09MRUFOIE1hdGNoRGVzdElwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQorc3RhdGljIEJPT0xFQU4gTWF0Y2hEZXN0SXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCiB7CiAJVUlOVCB1aUxvb3BJbmRleD0wOwogCVVJTlQgIHVpSXB2NkFkZEluZGV4PTA7CkBAIC0zNzYsNyArMzgwLDcgQEAKIAogfQogCi1WT0lEIER1bXBJcHY2SGVhZGVyKElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCitzdGF0aWMgVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQogewogCVVDSEFSIHVjVmVyc2lvbjsKIAlVQ0hBUiAgdWNQcmlvIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sSGRyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbEhkci5oCmluZGV4IGI5M2Y3OTAuLmEwZGI1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sSGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2xIZHIuaApAQCAtMTAxLDE1ICsxMDEsMTIgQEAKIAogCiAvL0Z1bmN0aW9uIFByb3RvdHlwZXMKLUJPT0xFQU4gTWF0Y2hTcmNJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7Ci1CT09MRUFOIE1hdGNoRGVzdElwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKIAogVVNIT1JUCUlwVmVyc2lvbjYoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8IFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLwogCQkJCQlQVk9JRCBwY0lwSGVhZGVyLCAvKio8UG9pbnRlciB0byB0aGUgSVAgSGRyIG9mIHRoZSBwYWNrZXQqLwogCQkJCQlTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKTsKIAogVk9JRCBEdW1wSXB2NkFkZHJlc3MoVUxPTkcgKnB1SXB2NkFkZHJlc3MpOwotVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKIAogZXh0ZXJuIEJPT0xFQU4gTWF0Y2hTcmNQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CiBleHRlcm4gQk9PTEVBTiBNYXRjaERlc3RQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VEbGQuYwppbmRleCA2MGMwZjI5Li5kZjY0YWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlRGxkLmMKQEAgLTEsMjAgKzEsMTggQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAogaW50IEludGVyZmFjZUZpbGVEb3dubG9hZCggUFZPSUQgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZscCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbl9jaGlwX2xvYykKIHsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmY9TlVMTDsKICAgIC8vIHVuc2lnbmVkIGludCAgICByZWc9MDsKICAgICBtbV9zZWdtZW50X3QgICAgb2xkZnM9ezB9OwogICAgIGludCAgICAgICAgICAgICBlcnJubz0wLCBsZW49MCAvKixpc19jb25maWdfZmlsZSA9IDAqLzsKICAgICBsb2ZmX3QgICAgICAgICAgcG9zPTA7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUilhcmc7CiAJLy9QTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CisgICAgY2hhciAgICAgICAgICAgICpidWZmPWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwogCi0gICAgYnVmZj0oUENIQVIpa21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgR0ZQX0tFUk5FTCk7CiAgICAgaWYoIWJ1ZmYpCiAgICAgewogICAgICAgICByZXR1cm4gLUVOT01FTTsKQEAgLTQ5LDcgKzQ3LDcgQEAKICAgICAgICAgb25fY2hpcF9sb2MrPU1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCOwogCX0vKiBFbmQgb2YgZm9yKDs7KSovCiAKLQliY21fa2ZyZWUoYnVmZik7CisJa2ZyZWUoYnVmZik7CiAgICAgcmV0dXJuIGVycm5vOwogfQogCkBAIC01Nyw3ICs1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9uX2NoaXBfbG9jKQogewotICAgIGNoYXIgICAgICAgICAgICAqYnVmZj1OVUxMLCAqYnVmZl9yZWFkYmFjaz1OVUxMOworICAgIGNoYXIgICAgICAgICAgICAqYnVmZiwgKmJ1ZmZfcmVhZGJhY2s7CiAgICAgdW5zaWduZWQgaW50ICAgIHJlZz0wOwogICAgIG1tX3NlZ21lbnRfdCAgICBvbGRmcz17MH07CiAgICAgaW50ICAgICAgICAgICAgIGVycm5vPTAsIGxlbj0wLCBpc19jb25maWdfZmlsZSA9IDA7CkBAIC02NiwxMiArNjQsMTIgQEAKIAlJTlQJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUilhcmc7CiAKLSAgICBidWZmPShQQ0hBUilrbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfRE1BKTsKLSAgICBidWZmX3JlYWRiYWNrPShQQ0hBUilrbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCICwgR0ZQX0RNQSk7CisgICAgYnVmZj1rbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfRE1BKTsKKyAgICBidWZmX3JlYWRiYWNrPWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IgLCBHRlBfRE1BKTsKICAgICBpZighYnVmZiB8fCAhYnVmZl9yZWFkYmFjaykKICAgICB7Ci0gICAgICAgIGJjbV9rZnJlZShidWZmKTsKLSAgICAgICAgYmNtX2tmcmVlKGJ1ZmZfcmVhZGJhY2spOworICAgICAgICBrZnJlZShidWZmKTsKKyAgICAgICAga2ZyZWUoYnVmZl9yZWFkYmFjayk7CiAKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgfQpAQCAtMTM4LDggKzEzNiw4IEBACiAgICAgICAgIG9uX2NoaXBfbG9jKz1NQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQjsKICAgICB9LyogRW5kIG9mIHdoaWxlKDEpKi8KIGV4aXQ6Ci0gICAgYmNtX2tmcmVlKGJ1ZmYpOwotICAgIGJjbV9rZnJlZShidWZmX3JlYWRiYWNrKTsKKyAgICBrZnJlZShidWZmKTsKKyAgICBrZnJlZShidWZmX3JlYWRiYWNrKTsKIAlyZXR1cm4gU3RhdHVzOwogfQogCkBAIC0xNjUsNyArMTYzLDcgQEAKIAkJCXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcywgcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKIAlpZihyZXR2YWwpCiAJewotCQliY21fa2ZyZWUgKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKKwkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTIzMSw0MSArMjI5LDYgQEAKIAogCXJldHVybiByZXR2YWw7CiB9Ci0jaWYgMAotc3RhdGljIGludCBiY21fZG93bmxvYWRfYnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQl1bnNpZ25lZCBjaGFyICptYXBwZWRidWZmZXIsIHVuc2lnbmVkIGludCB1MzJGaXJtd2FyZUxlbmd0aCwKLQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKLXsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmY9TlVMTDsKLSAgICB1bnNpZ25lZCBpbnQgICAgbGVuID0gMDsKLQlpbnQgCQkJcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7Ci0JYnVmZiA9IGt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwotCi0JbGVuID0gdTMyRmlybXdhcmVMZW5ndGg7Ci0KLQl3aGlsZSh1MzJGaXJtd2FyZUxlbmd0aCkKLQl7Ci0JCWxlbiA9IE1JTl9WQUwgKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0JCWlmKFNUQVRVU19TVUNDRVNTICE9IChyZXR2YWwgPSBjb3B5X2Zyb21fdXNlcihidWZmLAotCQkJCSh1bnNpZ25lZCBjaGFyICopbWFwcGVkYnVmZmVyLCBsZW4pKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHZhbCA9IHdybSAoQWRhcHRlciwgdTMyU3RhcnRpbmdBZGRyZXNzLCBidWZmLCBsZW4pOwotCQlpZihyZXR2YWwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIndybSBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdTMyU3RhcnRpbmdBZGRyZXNzIAkrPSBsZW47Ci0JCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwotCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwotCX0KLQliY21fa2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgogc3RhdGljIGludCBiY21fY29tcGFyZV9idWZmX2NvbnRlbnRzKHVuc2lnbmVkIGNoYXIgKnJlYWRiYWNrYnVmZiwKIAl1bnNpZ25lZCBjaGFyICpidWZmLHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC0yOTcsNTggKzI2MCw2IEBACiAJfQogCXJldHVybiByZXR2YWw7CiB9Ci0jaWYgMAotc3RhdGljIGludCBiY21fYnVmZmVyX3JlYWRiYWNrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQl1bnNpZ25lZCBjaGFyICptYXBwZWRidWZmZXIsIHVuc2lnbmVkIGludCB1MzJGaXJtd2FyZUxlbmd0aCwKLQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZmID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpyZWFkYmFja2J1ZmYgPSBOVUxMOwotCXVuc2lnbmVkIGludCAgbGVuID0gdTMyRmlybXdhcmVMZW5ndGg7Ci0JaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwotCi0gICAgYnVmZj0odW5zaWduZWQgY2hhciAqKWt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwotCWlmKE5VTEwgPT0gYnVmZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmVhZGJhY2tidWZmID0gICh1bnNpZ25lZCBjaGFyICopa3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYoTlVMTCA9PSByZWFkYmFja2J1ZmYpCi0JewotCQliY21fa2ZyZWUoYnVmZik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkKLQl7Ci0JCWxlbiA9IE1JTl9WQUwgKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0KLQkJLyogcmVhZCBmcm9tIHRoZSBhcHBsIGJ1ZmYgYW5kIHRoZW4gcmVhZCBmcm9tIHRoZSB0YXJnZXQsIGNvbXBhcmUgKi8KLQkJaWYoU1RBVFVTX1NVQ0NFU1MgIT0gKHJldHZhbCA9IGNvcHlfZnJvbV91c2VyKGJ1ZmYsCi0JCQkJKHVuc2lnbmVkIGNoYXIgKiltYXBwZWRidWZmZXIsIGxlbikpKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dmFsID0gcmRtIChBZGFwdGVyLCB1MzJTdGFydGluZ0FkZHJlc3MsIHJlYWRiYWNrYnVmZiwgbGVuKTsKLQkJaWYocmV0dmFsKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJyZG0gZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKFNUQVRVU19TVUNDRVNTICE9Ci0JCQkocmV0dmFsID0gYmNtX2NvbXBhcmVfYnVmZl9jb250ZW50cyAocmVhZGJhY2tidWZmLCBidWZmLCBsZW4pKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJdTMyU3RhcnRpbmdBZGRyZXNzIAkrPSBsZW47Ci0JCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwotCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwotCX0vKiBlbmQgb2Ygd2hpbGUgKHUzMkZpcm13YXJlTGVuZ3RoICYmICFyZXR2YWwpICovCi0JYmNtX2tmcmVlKGJ1ZmYpOwotCWJjbV9rZnJlZShyZWFkYmFja2J1ZmYpOwotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKIGludCBiY21faW9jdGxfZndfZG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGSVJNV0FSRV9JTkZPICpwc0Z3SW5mbykKIHsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNzUsNyArMjg2LDcgQEAKIAllbHNlCiAJewogCi0JCWJ1ZmYgPSAoUFVDSEFSKWt6YWxsb2MocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLEdGUF9LRVJORUwpOworCQlidWZmID0ga3phbGxvYyhwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsR0ZQX0tFUk5FTCk7CiAJCWlmKGJ1ZmY9PU5VTEwpCiAJCXsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiRmFpbGVkIGluIGFsbG9jYXRpb24gbWVtb3J5Iik7CkBAIC0zODksMjMgKzMwMCw2IEBACiAJCQlnb3RvIGVycm9yIDsKIAkJfQogCi0JCSNpZiAwCi0JCXJldHZhbCA9IGJjbV9kb3dubG9hZF9idWZmZXIoQWRhcHRlciwKLQkJCQkodW5zaWduZWQgY2hhciAqKXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcywKLQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsIHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MpOwotCQlpZihyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlVzZXIgc3BhY2UgYnVmZmVyIGRvd25sb2FkIGZhaWxzLi4uLiIpOwotCQl9Ci0JCXJldHZhbCA9IGJjbV9idWZmZXJfcmVhZGJhY2sgKEFkYXB0ZXIsCi0JCQkJKHVuc2lnbmVkIGNoYXIgKilwc0Z3SW5mby0+cHZNYXBwZWRGaXJtd2FyZUFkZHJlc3MsCi0JCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLCBwc0Z3SW5mby0+dTMyU3RhcnRpbmdBZGRyZXNzKTsKLQotCQlpZihyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInJlYWQgYmFjayB2ZXJpZmllciBmYWlsZWQgLi4uLiIpOwotCQl9Ci0JCSNlbmRpZgogCQlyZXR2YWwgPSBidWZmRG5sZFZlcmlmeShBZGFwdGVyLAogCQkJCQlidWZmLAogCQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsCkBAIC00MTcsNyArMzExLDcgQEAKIAkJfQogCX0KIGVycm9yOgotCWJjbV9rZnJlZShidWZmKTsKKwlrZnJlZShidWZmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00NTAsMTEgKzM0NCwxMCBAQAogCQkJUFVDSEFSIG1hcHBlZGJ1ZmZlciwgVUlOVCB1MzJGaXJtd2FyZUxlbmd0aCwKIAkJCVVMT05HIHUzMlN0YXJ0aW5nQWRkcmVzcykKIHsKLQlQVUNIQVIgcmVhZGJhY2tidWZmID0gTlVMTDsKIAlVSU5UIGxlbiA9IHUzMkZpcm13YXJlTGVuZ3RoOwogCUlOVCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIgcmVhZGJhY2tidWZmID0ga3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQixHRlBfS0VSTkVMKTsKIAotCXJlYWRiYWNrYnVmZiA9IChQVUNIQVIpa3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQixHRlBfS0VSTkVMKTsKIAlpZihOVUxMID09IHJlYWRiYWNrYnVmZikKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1FTU9SWSBBTExPQ0FUSU9OIEZBSUxFRCIpOwpAQCAtNDgwLDcgKzM3Myw3IEBACiAJCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwogCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwogCX0vKiBlbmQgb2Ygd2hpbGUgKHUzMkZpcm13YXJlTGVuZ3RoICYmICFyZXR2YWwpICovCi0JYmNtX2tmcmVlKHJlYWRiYWNrYnVmZik7CisJa2ZyZWUocmVhZGJhY2tidWZmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01MDYsNSArMzk5LDQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5jCmluZGV4IDA3NTAzODIuLmJmNWMwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmMKQEAgLTk4LDE0ICs5OCw2IEBACiAJCQlBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPSBGQUxTRTsKIAogCQkJd2FrZV91cCgmQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlKTsKLQkJI2lmIDAKLQkJCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElETEVfTU9ERSwgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQgaXMgUnVubmluZy4gSGVuY2UgU2V0dGluZyB0aGUgTEVEIEV2ZW50IGFzIElETEVNT0RFX0VYSVQiKTsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IElETEVNT0RFX0VYSVQ7Ci0JCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCX0KLQkJI2VuZGlmCiAKIAkJfQogCQllbHNlCkBAIC0xNTQsMTcgKzE0Niw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCi1WT0lEIEludGVyZmFjZVdyaXRlSWRsZU1vZGVXYWtlUGF0dGVybihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0vKglCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X0xvdywgMHgxZDFlKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X0xvdywgMHgxZDFlKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X1VwcCwgMHhkMGVhKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X1VwcCwgMHhkMGVhKTsqLwotCXJldHVybjsKLX0KLQotaW50IEludGVyZmFjZUFib3J0SWRsZW1vZGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCB1bnNpZ25lZCBpbnQgUGF0dGVybikKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWJvcnRJZGxlbW9kZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGludCBQYXR0ZXJuKQogewogCWludCAJc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJdW5zaWduZWQgaW50IHZhbHVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5oCmluZGV4IDFiYzcyM2QuLjg1OWEyZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmgKQEAgLTcsOCArNyw2IEBACiAKIFZPSUQgSW50ZXJmYWNlV3JpdGVJZGxlTW9kZVdha2VQYXR0ZXJuKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLUlOVCBJbnRlcmZhY2VBYm9ydElkbGVtb2RlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgdW5zaWduZWQgaW50IFBhdHRlcm4pOwotCiBJTlQgSW50ZXJmYWNlV2FrZVVwKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIFZPSUQgSW50ZXJmYWNlSGFuZGxlU2h1dGRvd25Nb2RlV2FrZXVwKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCmluZGV4IGU5N2FkOTkuLmQ3OGQ1ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCkBAIC0xLDU0ICsxLDYzIEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgSW50ZXJmYWNlVXNidGFibGVbXSA9IHsKLSAgICB7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKKwl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDNMKSB9LAotICAgIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfWlRFLCBCQ01fVVNCX1BST0RVQ1RfSURfMjI2KSB9LAorCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9UMywgQkNNX1VTQl9QUk9EVUNUX0lEX1NNMjUwKSB9LAorCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9aVEUsIEJDTV9VU0JfUFJPRFVDVF9JRF8yMjYpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX0ZPWENPTk4sIEJDTV9VU0JfUFJPRFVDVF9JRF8xOTAxKSB9LAotICAgIHt9CisJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1pURSwgQkNNX1VTQl9QUk9EVUNUX0lEX1pURV9UVTI1KSB9LAorCXsgfQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBJbnRlcmZhY2VVc2J0YWJsZSk7CiAKLVZPSUQgSW50ZXJmYWNlQWRhcHRlckZyZWUoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworCitzdGF0aWMgY29uc3QgdTMyIGRlZmF1bHRfbXNnID0KKwlORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksKKwl8IE5FVElGX01TR19USU1FUiB8IE5FVElGX01TR19UWF9FUlIgfCBORVRJRl9NU0dfUlhfRVJSCisJfCBORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19JRkRPV047CisKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyB2b2lkIEludGVyZmFjZUFkYXB0ZXJGcmVlKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCiB7Ci0JSU5UIGkgPSAwOwotCS8vIFdha2UgdXAgdGhlIHdhaXRfcXVldWUuLi4KLQlpZihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQl7CisJaW50IGkgPSAwOworCisJLyogV2FrZSB1cCB0aGUgd2FpdF9xdWV1ZS4uLiAqLworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0hBTFQ7CiAJCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CiAJcmVzZXRfY2FyZF9wcm9jKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKLQkvL3dvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcwotCS8vdG8gYWNjZXJ0YWluIHRoZSBkZXZpY2UgaXMgbm90IGJlaW5nIGFjY2Vzc2VkLiBBZnRlciB0aGlzIE5vIFJETS9XUk0gc2hvdWxkIGJlIG1hZGUuCi0Jd2hpbGUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgYmVpbmcgQWNjZXNzZWQgXG4iKTsKKwkvKgorCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcworCSAqIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIgdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgorCSAqLworCXdoaWxlIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcykgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQuXG4iKTsKIAkJbXNsZWVwKDEwMCk7CiAJfQogCS8qIEZyZWUgaW50ZXJydXB0IFVSQiAqLwotCS8vcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUU7Ci0JaWYocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpCi0JewotCQl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpOwotCX0KKwkvKiBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRTsgKi8KKwl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpOwogCiAJLyogRnJlZSB0cmFuc21pdCBVUkJzICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspCi0JewotCQlpZihwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgICE9IE5VTEwpCi0JCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspIHsKKwkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYiAgIT0gTlVMTCkgewogCQkJdXNiX2ZyZWVfdXJiKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYik7CiAJCQlwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPSBOVUxMOwogCQl9CiAJfQogCS8qIEZyZWUgcmVjZWl2ZSBVUkIgYW5kIGJ1ZmZlcnMgKi8KLQlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykKLQl7Ci0JCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgIT0gTlVMTCkKLQkJewotCQkJYmNtX2tmcmVlKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspIHsKKwkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiAhPSBOVUxMKSB7CisJCQlrZnJlZShwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAJCQl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiKTsKIAkJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiA9IE5VTEw7CiAJCX0KQEAgLTU2LDE1MSArNjUsMTA5IEBACiAJQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKTsKIH0KIAotCi0KLXN0YXRpYyBpbnQgdXNiYmNtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgdm9pZCBDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JcmV0dXJuIDA7Ci19CisJdW5zaWduZWQgbG9uZyB1bFJlZyA9IDA7CisJaW50IHJldDsKIAotc3RhdGljIGludCB1c2JiY21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdXNiYmNtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB1c2JiY21fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotVk9JRCBDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JVUxPTkcgdWxSZWcgPSAwOwotCi0vLyBQcm9ncmFtIEVQMiBNQVhfUEtUX1NJWkUKKwkvKiBQcm9ncmFtIEVQMiBNQVhfUEtUX1NJWkUgKi8KIAl1bFJlZyA9IG50b2hsKEVQMl9NUFNfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEyOCw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMjgsIDQsIFRSVUUpOwogCXVsUmVnID0gbnRvaGwoRVAyX01QUyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxMkMsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTJDLCA0LCBUUlVFKTsKIAogCXVsUmVnID0gbnRvaGwoRVAyX0NGR19SRUcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTMyLDQsVFJVRSk7Ci0JaWYoKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSktPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkKLQl7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzMiwgNCwgVFJVRSk7CisJaWYgKCgoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpLT5iSGlnaFNwZWVkRGV2aWNlID09IFRSVUUpIHsKIAkJdWxSZWcgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTM2LDQsVFJVRSk7Ci0JfQotCWVsc2UKLQl7Ci0vLyBVU0UgQlVMSyBFUCBhcyBUWCBpbiBGUyBtb2RlLgorCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTM2LCA0LCBUUlVFKTsKKwl9IGVsc2UgeworCQkvKiBVU0UgQlVMSyBFUCBhcyBUWCBpbiBGUyBtb2RlLiAqLwogCQl1bFJlZyA9IG50b2hsKEVQMl9DRkdfQlVMSyk7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTM2LDQsVFJVRSk7CisJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzYsIDQsIFRSVUUpOwogCX0KIAotCi0vLyBQcm9ncmFtIEVQNCBNQVhfUEtUX1NJWkUuCisJLyogUHJvZ3JhbSBFUDQgTUFYX1BLVF9TSVpFLiAqLwogCXVsUmVnID0gbnRvaGwoRVA0X01QU19SRUcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTNDLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzQywgNCwgVFJVRSk7CiAJdWxSZWcgPSBudG9obChFUDRfTVBTKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDE0MCw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxNDAsIDQsIFRSVUUpOwogCi0vLwlQcm9ncmFtIFRYIEVQIGFzIGludGVycnVwdCAoQWx0ZXJuYXRlIFNldHRpbmcpCi0JaWYoIHJkbWFsdChBZGFwdGVyLDB4MEYwMTEwRjgsIChQVUlOVCkmdWxSZWcsNCkpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInJlYWRpbmcgb2YgVHggRVAgaXMgZmFpbGluZyIpOwotCQlyZXR1cm4gOworCS8qIFByb2dyYW0gVFggRVAgYXMgaW50ZXJydXB0KEFsdGVybmF0ZSBTZXR0aW5nKSAqLworCXJldCA9IHJkbWFsdChBZGFwdGVyLCAweDBGMDExMEY4LCAodTMyICopJnVsUmVnLCBzaXplb2YodTMyKSk7CisJaWYgKHJldCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkicmVhZGluZyBvZiBUeCBFUCBmYWlsZWRcbiIpOworCQlyZXR1cm47CiAJfQogCXVsUmVnIHw9IDB4NjsKIAogCXVsUmVnID0gbnRvaGwodWxSZWcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUNDLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDQywgNCwgVFJVRSk7CiAKIAl1bFJlZyA9IG50b2hsKEVQNF9DRkdfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFDOCw0LFRSVUUpOwotLy8gUHJvZ3JhbSBJU09DSFJPTk9VUyBFUCBzaXplIHRvIHplcm8uCisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDOCwgNCwgVFJVRSk7CisJLyogUHJvZ3JhbSBJU09DSFJPTk9VUyBFUCBzaXplIHRvIHplcm8uICovCiAJdWxSZWcgPSBudG9obChJU09fTVBTX1JFRyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxRDIsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MUQyLCA0LCBUUlVFKTsKIAl1bFJlZyA9IG50b2hsKElTT19NUFMpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUQ2LDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFENiwgNCwgVFJVRSk7CiAKLS8vIFVwZGF0ZSBFRVBST00gVmVyc2lvbi4KLS8vIFJlYWQgNCBieXRlcyBmcm9tIDUwOCBhbmQgbW9kaWZ5IDUxMSBhbmQgNTEwLgotLy8KLQlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsMHgxRkMsKFBVSU5UKSZ1bFJlZyk7CisJLyoKKwkgKiBVcGRhdGUgRUVQUk9NIFZlcnNpb24uCisJICogUmVhZCA0IGJ5dGVzIGZyb20gNTA4IGFuZCBtb2RpZnkgNTExIGFuZCA1MTAuCisJICovCisJUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLCAweDFGQywgKFBVSU5UKSZ1bFJlZyk7CiAJdWxSZWcgJj0gMHgwMTAxRkZGRjsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFGQyw0LFRSVUUpOwotLy8KLS8vVXBkYXRlIGxlbmd0aCBmaWVsZCBpZiByZXF1aXJlZC4gQWxzbyBtYWtlIHRoZSBzdHJpbmcgTlVMTCB0ZXJtaW5hdGVkLgotLy8KLQlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsMHhBOCwoUFVJTlQpJnVsUmVnKTsKLQlpZigodWxSZWcmMHgwMEZGMDAwMCk+PjE2ID4gMHgzMCkKLQl7Ci0JCXVsUmVnID0gKHVsUmVnJjB4RkYwMEZGRkYpfCgweDMwPDwxNik7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4QTgsNCxUUlVFKTsKLQl9Ci0JUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLDB4MTQ4LChQVUlOVCkmdWxSZWcpOwotCWlmKCh1bFJlZyYweDAwRkYwMDAwKT4+MTYgPiAweDMwKQotCXsKLQkJdWxSZWcgPSAodWxSZWcmMHhGRjAwRkZGRil8KDB4MzA8PDE2KTsKLQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxNDgsNCxUUlVFKTsKLQl9Ci0JdWxSZWcgPSAwOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTIyLDQsVFJVRSk7Ci0JdWxSZWcgPSAwOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUMyLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFGQywgNCwgVFJVRSk7CiAKKwkvKiBVcGRhdGUgbGVuZ3RoIGZpZWxkIGlmIHJlcXVpcmVkLiBBbHNvIG1ha2UgdGhlIHN0cmluZyBOVUxMIHRlcm1pbmF0ZWQuICovCisKKwlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsIDB4QTgsIChQVUlOVCkmdWxSZWcpOworCWlmICgodWxSZWcmMHgwMEZGMDAwMCk+PjE2ID4gMHgzMCkgeworCQl1bFJlZyA9ICh1bFJlZyYweEZGMDBGRkZGKXwoMHgzMDw8MTYpOworCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4QTgsIDQsIFRSVUUpOworCX0KKwlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsIDB4MTQ4LCAoUFVJTlQpJnVsUmVnKTsKKwlpZiAoKHVsUmVnJjB4MDBGRjAwMDApPj4xNiA+IDB4MzApIHsKKwkJdWxSZWcgPSAodWxSZWcmMHhGRjAwRkZGRil8KDB4MzA8PDE2KTsKKwkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDE0OCwgNCwgVFJVRSk7CisJfQorCXVsUmVnID0gMDsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTIyLCA0LCBUUlVFKTsKKwl1bFJlZyA9IDA7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDMiwgNCwgVFJVRSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmJjbV9mb3BzID0gewotICAgIC5vcGVuICAgID0gIHVzYmJjbV9vcGVuLAotICAgIC5yZWxlYXNlID0gIHVzYmJjbV9yZWxlYXNlLAotICAgIC5yZWFkICAgID0gIHVzYmJjbV9yZWFkLAotICAgIC53cml0ZSAgID0gIHVzYmJjbV93cml0ZSwKLSAgICAub3duZXIgICA9ICBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHVzYmJjbV9jbGFzcyA9IHsKLSAgICAubmFtZSA9ICAgICAJInVzYmJjbSIsCi0gICAgLmZvcHMgPSAgICAgCSZ1c2JiY21fZm9wcywKLSAgICAubWlub3JfYmFzZSA9ICAgQkNNX1VTQl9NSU5PUl9CQVNFLAotfTsKLQogc3RhdGljIGludAogdXNiYmNtX2RldmljZV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCWludCByZXR2YWwgPTAgOwotICAgCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyID0gTlVMTDsKLQlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyID0gTlVMTDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAgICAgICp1ZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IHJldHZhbDsKKwlQTUlOSV9BREFQVEVSIHBzQWRhcHRlcjsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCi0vLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVzYmJjbSBwcm9iZSEhIik7Ci0JaWYoKGludGYgPT0gTlVMTCkgfHwgKGlkID09IE5VTEwpKQotCXsKLQkvLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImludGYgb3IgaWQgaXMgTlVMTCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBBZGFwdGVyIHN0cnVjdHVyZSAqLwotCWlmKChwc0FkYXB0ZXIgPSBremFsbG9jKHNpemVvZihNSU5JX0FEQVBURVIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiT3V0IG9mIG1lbW9yeSIpOworCS8qIFJlc2VydmUgb25lIGV4dHJhIHF1ZXVlIGZvciB0aGUgYml0LWJ1Y2tldCAqLworCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoTUlOSV9BREFQVEVSKSwgTk9fT0ZfUVVFVUVTKzEpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCBEUlZfTkFNRSAiOiBubyBtZW1vcnkgZm9yIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotICAgIC8qIEluaXQgZGVmYXVsdCBkcml2ZXIgZGVidWcgc3RhdGUgKi8KKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmaW50Zi0+ZGV2KTsKIAotICAgIHBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsID0gREJHX0xWTF9DVVJSOworCXBzQWRhcHRlciA9IG5ldGRldl9wcml2KG5kZXYpOworCXBzQWRhcHRlci0+ZGV2ID0gbmRldjsKKwlwc0FkYXB0ZXItPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1ZywgZGVmYXVsdF9tc2cpOworCisJLyogSW5pdCBkZWZhdWx0IGRyaXZlciBkZWJ1ZyBzdGF0ZSAqLworCisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwgPSBEQkdfTFZMX0NVUlI7CiAJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSA9IERCR19UWVBFX0lOSVRFWElUOwotCW1lbXNldCAocHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZSwgMCwgc2l6ZW9mIChwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlKSk7CiAKLSAgICAvKiBUZWNobmljYWxseSwgb25lIGNhbiBzdGFydCB1c2luZyBCQ01fREVCVUdfUFJJTlQgYWZ0ZXIgdGhpcyBwb2ludC4KKwkvKgorCSAqIFRlY2huaWNhbGx5LCBvbmUgY2FuIHN0YXJ0IHVzaW5nIEJDTV9ERUJVR19QUklOVCBhZnRlciB0aGlzIHBvaW50LgogCSAqIEhvd2V2ZXIsIHJlYWxpemUgdGhhdCBieSBkZWZhdWx0IHRoZSBUeXBlL1N1YnR5cGUgYml0bWFwcyBhcmUgYWxsIHplcm8gbm93OwogCSAqIHNvIG5vIHByaW50cyB3aWxsIGFjdHVhbGx5IGFwcGVhciB1bnRpbCB0aGUgVGVzdEFwcCB0dXJucyBvbiBkZWJ1ZyBwYXRocyB2aWEKIAkgKiB0aGUgaW9jdGwoKTsgc28gcHJhY3RpY2FsbHkgc3BlYWtpbmcsIGluIGVhcmx5IGluaXQsIG5vIGxvZ2dpbmcgaGFwcGVucy4KQEAgLTIxMSwxNjAgKzE3OCwxMjggQEAKIAkgKiBGdXJ0aGVyLCB3ZSB0dXJuIHRoaXMgT0ZGIG9uY2UgaW5pdF9tb2R1bGUoKSBjb21wbGV0ZXMuCiAJICovCiAKLSAgICBwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX0lOSVRFWElUXSA9IDB4ZmY7CisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweGZmOwogCUJDTV9TSE9XX0RFQlVHX0JJVE1BUChwc0FkYXB0ZXIpOwogCiAJcmV0dmFsID0gSW5pdEFkYXB0ZXIocHNBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQgKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkluaXRBZGFwdGVyIEZhaWxlZFxuIik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IEluaXRBZGFwdGVyIEZhaWxlZFxuIik7CiAJCUFkYXB0ZXJGcmVlKHBzQWRhcHRlcik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJLyogQWxsb2NhdGUgaW50ZXJmYWNlIGFkYXB0ZXIgc3RydWN0dXJlICovCi0JaWYoKHBzQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyID0KLQkJa21hbGxvYyhzaXplb2YoU19JTlRFUkZBQ0VfQURBUFRFUiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJPdXQgb2YgbWVtb3J5Iik7Ci0JCUFkYXB0ZXJGcmVlIChwc0FkYXB0ZXIpOworCXBzSW50ZkFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihTX0lOVEVSRkFDRV9BREFQVEVSKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IG5vIG1lbW9yeSBmb3IgSW50ZXJmYWNlIGFkYXB0ZXJcbiIpOworCQlBZGFwdGVyRnJlZShwc0FkYXB0ZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHBzQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLCAwLCBzaXplb2YoU19JTlRFUkZBQ0VfQURBUFRFUikpOwogCi0JcHNJbnRmQWRhcHRlciA9IEludGVyZmFjZUFkYXB0ZXJHZXQocHNBZGFwdGVyKTsKKwlwc0FkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciA9IHBzSW50ZkFkYXB0ZXI7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyID0gcHNBZGFwdGVyOwogCiAJLyogU3RvcmUgdXNiIGludGVyZmFjZSBpbiBJbnRlcmZhY2UgQWRhcHRlciAqLwogCXBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSA9IGludGY7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwc0ludGZBZGFwdGVyKTsKIAotCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJwc0ludGZBZGFwdGVyIDB4JXAiLHBzSW50ZkFkYXB0ZXIpOworCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkicHNJbnRmQWRhcHRlciAweCVwXG4iLCBwc0ludGZBZGFwdGVyKTsKIAlyZXR2YWwgPSBJbnRlcmZhY2VBZGFwdGVySW5pdChwc0ludGZBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JeworCWlmIChyZXR2YWwpIHsKIAkJLyogSWYgdGhlIEZpcm13YXJlL0NmZyBGaWxlIGlzIG5vdCBwcmVzZW50Ci0gCQkgKiB0aGVuIHJldHVybiBzdWNjZXNzLCBsZXQgdGhlIGFwcGxpY2F0aW9uCi0gCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCi0gCQkgKi8KLQkJaWYoLUVOT0VOVCA9PSByZXR2YWwpewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkZpbGUgTm90IEZvdW5kLCBVc2UgQXBwIHRvIERvd25sb2FkXG4iKTsKKwkJICogdGhlbiByZXR1cm4gc3VjY2VzcywgbGV0IHRoZSBhcHBsaWNhdGlvbgorCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCisJCSAqLworCQlpZiAoLUVOT0VOVCA9PSByZXR2YWwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJGaWxlIE5vdCBGb3VuZC4gIFVzZSBhcHAgdG8gZG93bmxvYWQuXG4iKTsKIAkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAkJfQotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiSW50ZXJmYWNlQWRhcHRlckluaXQgRmFpbGVkIFxuIik7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJIkludGVyZmFjZUFkYXB0ZXJJbml0IGZhaWxlZC5cbiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CisJCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKLQkJaWYocHNBZGFwdGVyLT5iVXNiQ2xhc3NEcml2ZXJSZWdpc3RlcmVkID09IFRSVUUpCi0JCQkJdXNiX2RlcmVnaXN0ZXJfZGV2IChpbnRmLCAmdXNiYmNtX2NsYXNzKTsKIAkJSW50ZXJmYWNlQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlcik7Ci0JCXJldHVybiByZXR2YWwgOworCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlpZihwc0FkYXB0ZXItPmNoaXBfaWQgPiBUMykKLQl7Ci0JCXVpbnQzMl90IHVpTmFja1plcm9MZW5ndGhJbnQ9NDsKLQkJaWYod3JtYWx0KHBzQWRhcHRlciwgRElTQUJMRV9VU0JfWkVST19MRU5fSU5ULCAmdWlOYWNrWmVyb0xlbmd0aEludCwgc2l6ZW9mKHVpTmFja1plcm9MZW5ndGhJbnQpKSkKLQkJewotCQkJcmV0dXJuIC1FSU87OwotCQl9CisJaWYgKHBzQWRhcHRlci0+Y2hpcF9pZCA+IFQzKSB7CisJCXVpbnQzMl90IHVpTmFja1plcm9MZW5ndGhJbnQgPSA0OworCisJCXJldHZhbCA9IHdybWFsdChwc0FkYXB0ZXIsIERJU0FCTEVfVVNCX1pFUk9fTEVOX0lOVCwgJnVpTmFja1plcm9MZW5ndGhJbnQsIHNpemVvZih1aU5hY2taZXJvTGVuZ3RoSW50KSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSBVU0ItRGV2aWNlIFN1cHBvcnRzIHJlbW90ZSBXYWtlLVVwICovCi0JaWYoVVNCX0NPTkZJR19BVFRfV0FLRVVQICYgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJtQXR0cmlidXRlcykKLQl7CisJaWYgKFVTQl9DT05GSUdfQVRUX1dBS0VVUCAmIHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5ibUF0dHJpYnV0ZXMpIHsKIAkJLyogSWYgU3VzcGVuZCB0aGVuIG9ubHkgc3VwcG9ydCBkeW5hbWljIHN1c3BlbmQgKi8KLQkJaWYocHNBZGFwdGVyLT5iRG9TdXNwZW5kKQotCQl7CisJCWlmIChwc0FkYXB0ZXItPmJEb1N1c3BlbmQpIHsKICNpZmRlZiBDT05GSUdfUE0KIAkJCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZ1ZGV2LT5kZXYsIDApOwogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCQkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOwotI2Vsc2UKIAkJCXVzYl9lbmFibGVfYXV0b3N1c3BlbmQodWRldik7Ci0jZW5kaWYKLSAJCQlkZXZpY2VfaW5pdF93YWtldXAoJmludGYtPmRldiwxKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzMikKLSAJCQl1c2JfYXV0b3BtX2Rpc2FibGUoaW50Zik7Ci0jZW5kaWYKKwkJCWRldmljZV9pbml0X3dha2V1cCgmaW50Zi0+ZGV2LCAxKTsKIAkJCUlOSVRfV09SSygmcHNJbnRmQWRhcHRlci0+dXNiU3VzcGVuZFdvcmssIHB1dFVzYlN1c3BlbmQpOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOwogI2VuZGlmCi0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzNSkKLSAJCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDE7Ci0jZWxzZQogCQkJdXNiX2Rpc2FibGVfYXV0b3N1c3BlbmQodWRldik7Ci0jZW5kaWYKIAkJfQogCX0KIAotICAgIHBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfSU5JVEVYSVRdID0gMHgwOwotICAgIHJldHVybiByZXR2YWw7CisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgdXNiYmNtX2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgdXNiYmNtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0JUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7Ci0JUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIgPSBOVUxMOwotCXN0cnVjdCB1c2JfZGV2aWNlICAgICAgICp1ZGV2ID0gTlVMTDsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJUE1JTklfQURBUFRFUiBwc0FkYXB0ZXI7CisJc3RydWN0IHVzYl9kZXZpY2UgICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVXNiIGRpc2Nvbm5lY3RlZCIpOwotCWlmKGludGYgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiaW50ZiBwb2ludGVyIGlzIE5VTEwiKTsKKwlpZiAocHNJbnRmQWRhcHRlciA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQotCXBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAicHNJbnRmQWRhcHRlciAweCVwIixwc0ludGZBZGFwdGVyKTsKLQlpZihwc0ludGZBZGFwdGVyID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkludGVyZmFjZUFkYXB0ZXIgcG9pbnRlciBpcyBOVUxMIik7Ci0JCXJldHVybjsKLQl9CisKIAlwc0FkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7Ci0JaWYocHNBZGFwdGVyLT5iRG9TdXNwZW5kKQorCW5ldGlmX2RldmljZV9kZXRhY2gocHNBZGFwdGVyLT5kZXYpOworCisJaWYgKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKIAkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAKIAlwc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRSA7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlJbnRlcmZhY2VBZGFwdGVyRnJlZShwc0ludGZBZGFwdGVyKTsKLQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CiAJdXNiX3B1dF9kZXYodWRldik7Ci0JdXNiX2RlcmVnaXN0ZXJfZGV2IChpbnRmLCAmdXNiYmNtX2NsYXNzKTsKIH0KIAotCi1zdGF0aWMgX19pbmxpbmUgaW50IEFsbG9jVXNiQ2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgQWxsb2NVc2JDYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewogCWludCBpID0gMDsKLQlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykKLQl7Ci0JCWlmKChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPQotCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FudCBhbGxvY2F0ZSBUeCB1cmIgZm9yIGluZGV4ICVkIiwgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspIHsKKwkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPQorCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ2FuJ3QgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAotCWZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1JDQjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspIHsKIAkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgPQotCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FudCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkIiwgaSk7CisJCQkJdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCWlmKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCQlrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDYW50IGFsbG9jYXRlIFJ4IGJ1ZmZlciBmb3IgaW5kZXggJWQiLCBpKTsKKwkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IE1BWF9EQVRBX0JVRkZFUl9TSVpFOwpAQCAtMzcyLDc3ICszMDcsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KIHN0YXRpYyBpbnQgZGV2aWNlX3J1bihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewotCUlOVCB2YWx1ZSA9IDA7CisJaW50IHZhbHVlID0gMDsKIAlVSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCiAJc3RhdHVzID0gSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7Ci0JaWYoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUgZmFpbGVkLlxuIik7CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlwcl9lcnIoRFJWX05BTUUgIkluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZSBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0JaWYoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpCi0JewotCi0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJTZW5kaW5nIGZpcnN0IGludGVycnVwdCBVUkIgZG93bi4uLi4uLiIpOwotCQlpZihTdGFydEludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNhbm5vdCBzZW5kIGludGVycnVwdCBpbiBVUkIiKTsKKwlpZiAoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKKwkJaWYgKFN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCSJDYW5ub3Qgc2VuZCBpbnRlcnJ1cHQgaW4gVVJCXG4iKTsKIAkJfQotCQkvL25vdyByZWdpc3RlciB0aGUgY250cmwgaW50ZXJmYWNlLgotCQkvL2FmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cgd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KIAorCQkvKgorCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4KKwkJICogYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGYvdyB3YWl0aW5nIGZvciA1IHNlYyB0byBnZXQgdGhlIG1haWxib3ggaW50ZXJydXB0LgorCQkgKi8KIAkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBGQUxTRTsKIAkJdmFsdWUgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pb2N0bF9md19kbmxkX3dhaXRfcXVldWUsCiAJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCA1KkhaKTsKIAotCQlpZih2YWx1ZSA9PSAwKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJNYWlsYm94IEludGVycnVwdCBoYXMgbm90IHJlYWNoZWQgdG8gRHJpdmVyLi4iKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIkdvdCB0aGUgbWFpbGJveCBpbnRlcnJ1cHQgLi4uUmVnaXN0ZXJpbmcgY29udHJvbCBpbnRlcmZhY2UuLi5cbiAiKTsKLQkJfQotCQlpZihyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUmVnaXN0ZXIgQ29udHJvbCBEZXZpY2UgZmFpbGVkLi4uIik7CisJCWlmICh2YWx1ZSA9PSAwKQorCQkJcHJfZXJyKERSVl9OQU1FICI6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWFpbGJveCBpbnRlcnJ1cHQuXG4iKTsKKworCQlpZiAocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcikgPCAwKSB7CisJCQlwcl9lcnIoRFJWX05BTUUgIjogUmVnaXN0ZXIgQ29udHJvbCBEZXZpY2UgZmFpbGVkLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkCXByaW50X3VzYl9pbnRlcmZhY2VfZGVzYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICp1c2JfaW50Zl9kZXNjKQotewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIioqKioqKioqKioqKioqKiogSU5URVJGQUNFIERFU0NSSVBUT1IgKioqKioqKioqKioqKioqKioqKioqIik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkxlbmd0aDogJXgiLCB1c2JfaW50Zl9kZXNjLT5iTGVuZ3RoKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRGVzY3JpcHRvclR5cGU6ICV4IiwgdXNiX2ludGZfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJmYWNlTnVtYmVyOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJJbnRlcmZhY2VOdW1iZXIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJBbHRlcm5hdGVTZXR0aW5nOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJBbHRlcm5hdGVTZXR0aW5nKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiTnVtRW5kcG9pbnRzOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJOdW1FbmRwb2ludHMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VDbGFzczogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlQ2xhc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VTdWJDbGFzczogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VQcm90b2NvbDogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlUHJvdG9jb2wpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImlJbnRlcmZhY2UgOiV4XG4iLHVzYl9pbnRmX2Rlc2MtPmlJbnRlcmZhY2UpOwotfQotc3RhdGljIHZvaWQJcHJpbnRfdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICp1c2JfZXBfZGVzYykKLXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIqKioqKioqKioqKioqKioqIEVORFBPSU5UIERFU0NSSVBUT1IgKioqKioqKioqKioqKioqKioqKioqIik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkxlbmd0aCAgOiV4ICIsIHVzYl9lcF9kZXNjLT5iTGVuZ3RoKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRGVzY3JpcHRvclR5cGUgIDoleCAiLCB1c2JfZXBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRW5kcG9pbnRBZGRyZXNzICA6JXggIiwgdXNiX2VwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJtQXR0cmlidXRlcyAgOiV4ICIsIHVzYl9lcF9kZXNjLT5ibUF0dHJpYnV0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIndNYXhQYWNrZXRTaXplICA6JXggIix1c2JfZXBfZGVzYy0+d01heFBhY2tldFNpemUpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcnZhbCAgOiV4ICIsdXNiX2VwX2Rlc2MtPmJJbnRlcnZhbCk7Ci19Ci0KLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X251bShjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKIHsKQEAgLTUxOCwxMjQgKzQxNywxMTEgQEAKIAlyZXR1cm4gKGJjbV91c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOwogfQogCi1JTlQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc2l6ZV90IGJ1ZmZlcl9zaXplOwotCVVMT05HIHZhbHVlOwotCUlOVCByZXR2YWwgPSAwOwotCUlOVCB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gMCA7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IDAgOwogCUJPT0xFQU4gYkJjbTE2ID0gRkFMU0U7CiAJVUlOVCB1aURhdGEgPSAwOwogCiAJLyogU3RvcmUgdGhlIHVzYiBkZXYgaW50byBpbnRlcmZhY2UgYWRhcHRlciAqLwotCXBzSW50ZkFkYXB0ZXItPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KAotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKKwlwc0ludGZBZGFwdGVyLT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKIAotCWlmKChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkpCi0JewotCQlwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID0gVFJVRSA7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJNT0RFTSBJUyBDT05GSUdVUkVEIFRPIEhJR0hfU1BFRUQgIik7Ci0JfQotCWVsc2UKLQl7Ci0JCXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPSBGQUxTRSA7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJNT0RFTSBJUyBDT05GSUdVUkVEIFRPIEZVTExfU1BFRUQgIik7Ci0JfQotCisJcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9IChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pbnRlcmZhY2VfcmRtID0gQmNtUkRNOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3dybSA9IEJjbVdSTTsKIAotCWlmKHJkbWFsdChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIENISVBfSURfUkVHLCAoUFVJTlQpJihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpLCBzaXplb2YoVUlOVCkpIDwgMCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7Ci0JCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQl9Ci0gICAgaWYoMHhiZWNlMzIwMD09KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCZ+KDB4RjApKSkKLQl7Ci0JCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZD0ocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkJn4oMHhGMCkpOworCXJldHZhbCA9IHJkbWFsdChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIENISVBfSURfUkVHLAorCQkJKHUzMiAqKSYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwgc2l6ZW9mKHUzMikpOworCWlmIChyZXR2YWwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7CisJCXJldHVybiByZXR2YWw7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkZpcnN0IFJETSBDaGlwIElEIDB4JWx4XG4iLCBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpOworCWlmICgweGJlY2UzMjAwID09IChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgJiB+KDB4RjApKSkKKwkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkICY9IH4weEYwOwogCi0gICAgaWZhY2VfZGVzYyA9IHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7Ci0JLy9wcmludF91c2JfaW50ZXJmYWNlX2Rlc2MoJihpZmFjZV9kZXNjLT5kZXNjKSk7CisJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIlJETSBDaGlwIElEIDB4JWx4XG4iLAorCQkgcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKIAotCWlmKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpCi0JeworCWlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCi0JCS8vCi0JCS8vVDNCIGRldmljZSB3aWxsIGhhdmUgRUVQUk9NLGNoZWNrIGlmIEVFUFJPTSBpcyBwcm9wZXIgYW5kIEJDTTE2IGNhbiBiZSBkb25lIG9yIG5vdC4KLQkJLy8KLQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCZ1aURhdGEsMHgwLDQpOwotCQlpZih1aURhdGEgPT0gQkVDTSkKLQkJeworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSB7CisJCS8qIFQzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSwgY2hlY2sgaWYgRUVQUk9NIGlzIHByb3BlciBhbmQgQkNNMTYgY2FuIGJlIGRvbmUgb3Igbm90LiAqLworCQlCZWNlZW1FRVBST01CdWxrUmVhZChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsICZ1aURhdGEsIDB4MCwgNCk7CisJCWlmICh1aURhdGEgPT0gQkVDTSkKIAkJCWJCY20xNiA9IFRSVUU7Ci0JCX0KLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIk51bWJlciBvZiBBbHRzZXR0aW5nIGF2aWFpbGFibGUgZm9yIFRoaXMgTW9kZW0gMHgleFxuIiwgcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZyk7Ci0JCWlmKGJCY20xNiA9PSBUUlVFKQotCQl7Ci0JCQkvL3NlbGVjdGluZyBhbHRlcm5hdGUgc2V0dGluZyBvbmUgYXMgYSBkZWZhdWx0IHNldHRpbmcgZm9yIEhpZ2ggU3BlZWQgIG1vZGVtLgotCQkJaWYocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKLQkJCQlyZXR2YWw9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsREVGQVVMVF9TRVRUSU5HXzAsQUxURVJOQVRFX1NFVFRJTkdfMSk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQkNNMTYgaXMgQXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZSIpOwotCQkJaWYocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSkKLQkJCXsKKworCQlkZXZfaW5mbygmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LCAibnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5nICVkXG4iLAorCQkJIHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOworCisJCWlmIChiQmNtMTYgPT0gVFJVRSkgeworCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZyBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCisJCQlpZiAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKKwkJCQlyZXR2YWw9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsIERFRkFVTFRfU0VUVElOR18wLCBBTFRFUk5BVEVfU0VUVElOR18xKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJCQ00xNiBpcyBhcHBsaWNhYmxlIG9uIHRoaXMgZG9uZ2xlXG4iKTsKKwkJCWlmIChyZXR2YWwgfHwgKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpKSB7CiAJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQMiA7CiAJCQkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbRVAyXS5kZXNjOwotCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJJbnRlcmZhY2UgYWx0c2V0dGluZyAgZ290IGZhaWxlZCBvciBNb2VtZCBpcyBjb25maWd1cmVkIHRvIEZTLmhlbmNlIHdpbGwgd29yayBvbiBkZWZhdWx0IHNldHRpbmcgMCBcbiIpOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkgIkludGVyZmFjZSBhbHRzZXR0aW5nIGZhaWxlZCBvciBtb2RlbSBpcyBjb25maWd1cmVkIHRvIEZ1bGwgU3BlZWQsIGhlbmNlIHdpbGwgd29yayBvbiBkZWZhdWx0IHNldHRpbmcgMFxuIik7CiAJCQkJLyoKLQkJCQlJZiBNb2RlbSBpcyBoaWdoIHNwZWVkIGRldmljZSBFUDIgc2hvdWxkIGJlIElOVCBPVVQgRW5kIHBvaW50Ci0JCQkJSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQgcG9pbnQKLQkJCQkqLwotCQkJCWlmKCgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PVRSVUUgKSAmJiAoYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KT09IEZBTFNFKSkKLQkJCQkJfHwoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpPT0gRkFMU0UpKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIkNvbmZpZ3VyaW5nIHRoZSBFRVBST00gIik7Ci0JCQkJCS8vY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludAorCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUgSU5UIE9VVCBFbmQgcG9pbnQKKwkJCQkgKiBJZiBNb2RlIGlzIEZTIHRoZW4gRVAyIHNob3VsZCBiZSBidWxrIGVuZCBwb2ludAorCQkJCSAqLworCQkJCWlmICgoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkgJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gRkFMU0UpKQorCQkJCQl8fCAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSA9PSBGQUxTRSkpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJIkNvbmZpZ3VyaW5nIHRoZSBFRVBST01cbiIpOworCQkJCQkvKiBjaGFuZ2UgdGhlIEVQMiwgRVA0IHRvIElOVCBPVVQgZW5kIHBvaW50ICovCiAJCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkJCQkJLyoKLQkJCQkJSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZyBnZXRzIGNoYW5nZWQgaW4gVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kCi0JCQkJCXJlLWVudW1lcmF0ZSB0aGUgZGV2aWNlCi0JCQkJCSovCisJCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkCisJCQkJCSAqICBpbiBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlCisJCQkJCSAqIHRoZSBkZXZpY2UKKwkJCQkJICovCiAJCQkJCXJldHZhbCA9IHVzYl9yZXNldF9kZXZpY2UocHNJbnRmQWRhcHRlci0+dWRldik7Ci0JCQkJCWlmKHJldHZhbCkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInJlc2V0IGdvdCBmYWlsZWQuIGhlbmNlIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UgXG4iKTsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJCQkJCXJldHVybiByZXR2YWwgOwogCQkJCQl9CiAKIAkJCQl9Ci0JCQkJaWYoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKQotCQkJCXsKLQkJCQkJLy8gT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLgorCQkJCWlmICgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PSBGQUxTRSkgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCQkJLyogT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLiAqLwogCQkJCQlVSU5UIF91aURhdGEgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBGUyBNT0RFIik7Ci0JCQkJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsKFBVQ0hBUikmX3VpRGF0YSwweDEzNiw0LFRSVUUpOworCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgCisJCQkJCQkiUmV2ZXJ0aW5nIEJ1bGsgdG8gSU5UIGFzIGl0IGlzIGluIEZ1bGwgU3BlZWQgbW9kZS5cbiIpOworCQkJCQlCZWNlZW1FRVBST01CdWxrV3JpdGUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCAoUFVDSEFSKSZfdWlEYXRhLCAweDEzNiwgNCwgVFJVRSk7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQl1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gRVA0IDsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtFUDRdLmRlc2M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNob29zaW5nIEFsdFNldHRpbmcgYXMgYSBkZWZhdWx0IHNldHRpbmciKTsKLQkJCQlpZiggYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSA9PSBGQUxTRSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIgRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4Iik7Ci0JCQkJCS8vY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCBhbmQgdXNlIEVQNCBpbiBhbHRzZXR0aW5nCisJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7CisJCQkJaWYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gRkFMU0UpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkiRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4LlxuIik7CisJCQkJCS8qIGNoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQgYW5kIHVzZSBFUDQgaW4gYWx0c2V0dGluZyAqLwogCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCUl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZAotCQkJCQlyZS1lbnVtZXJhdGUgdGhlIGRldmljZQotCQkJCQkqLworCQkJCQkgKiBJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nIGdldHMgY2hhbmdlZCBpbgorCQkJCQkgKiAgVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZSB0aGUKKwkJCQkJICogZGV2aWNlCisJCQkJCSAqLwogCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYpOwotCQkJCQlpZihyZXR2YWwpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJyZXNldCBnb3QgZmFpbGVkLiBoZW5jZSBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlIFxuIik7Ci0JCQkJCQlyZXR1cm4gcmV0dmFsIDsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJCX0KIAogCQkJCX0KQEAgLTY0NCw5OCArNTMwLDY2IEBACiAJfQogCiAJaWZhY2VfZGVzYyA9IHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7Ci0JLy9wcmludF91c2JfaW50ZXJmYWNlX2Rlc2MoJihpZmFjZV9kZXNjLT5kZXNjKSk7Ci0gICAJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDdXJyZW50IG51bWJlciBvZiBlbmRwb2ludHMgOiV4IFxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKLSAgICBmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsrdmFsdWUpCi0JewotICAgICAgICBlbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFt2YWx1ZV0uZGVzYzsKLQkJLy9wcmludF91c2JfZW5kcG9pbnRfZGVzY3JpcHRvcihlbmRwb2ludCk7CiAKLSAgICAgICAgaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0KLQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fcGlwZSA9CisJZm9yICh2YWx1ZSA9IDA7IHZhbHVlIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK3ZhbHVlKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W3ZhbHVlXS5kZXNjOworCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CisJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPQogCQkJCQl1c2JfcmN2YnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKIAkJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkcik7Ci0gICAgICAgIH0KKwkJfQogCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKQotICAgICAgICB7Ci0KLQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KLQkJCXVzYl9zbmRidWxrcGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KKwkJCQl1c2Jfc25kYnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKIAkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKLSAgICAgICAgfQorCQl9CiAKLSAgICAgICAgaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgPQotCQkJCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlciA9CisJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgeworCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIgPQogCQkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgICAgICBpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlcikgewotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJDb3VsZCBub3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCQkJLy9wc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9waXBlID0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkKLSAgICAgICAgewotCi0JCQlpZiggIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgotCQkJCShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSAmJiAodmFsdWUgPT0gdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlcikpCi0JCQl7Ci0JCQkJLy91c2UgZmlyc3QgaW50b3V0IGVuZCBwb2ludCBhcyBhIGJ1bGsgb3V0IGVuZCBwb2ludAotICAgICAgICAgICAgCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQkJLy9wcmludGsoIlxuSU5UIE9VVCBFbmRwb2luZyBidWZmZXIgc2l6ZSA6JXggZW5kcG9pbnQgOiV4XG4iLCBidWZmZXJfc2l6ZSwgdmFsdWUgKzEpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9Ci0JCQkJdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKLQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKLSAgICAgICAgICAJICAJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7Ci0KKwkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fYnVmZmVyKSB7CisJCQkJZGV2X2VycigmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LAorCQkJCQkiY291bGQgbm90IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJZWxzZSBpZih2YWx1ZSA9PSBFUDYpCi0JCQl7Ci0JICAgICAgICAgICAgYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyID0KLQkJCQkJCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlcj0ga21hbGxvYyhidWZmZXJfc2l6ZSwKLQkJCQkJCQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JICAgICAgICAgICAgCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpCi0JCQkJCXsKLQkgICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlciIpOwotCSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJfQorCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkgeworCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKKwkJCQkocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID09IFQzQikgJiYgKHZhbHVlID09IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIpKSB7CisJCQkJLyogdXNlIGZpcnN0IGludG91dCBlbmQgcG9pbnQgYXMgYSBidWxrIG91dCBlbmQgcG9pbnQgKi8KKwkJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPSB1c2Jfc25kaW50cGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQkJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwkJCX0gZWxzZSBpZiAodmFsdWUgPT0gRVA2KSB7CisJCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXI9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpIHsKKwkJCQkJZGV2X2VycigmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LAorCQkJCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJfQogCX0KLSAgICB1c2Jfc2V0X2ludGZkYXRhKHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSwgcHNJbnRmQWRhcHRlcik7Ci0gICAgcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2Rldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UsICZ1c2JiY21fY2xhc3MpOwotCWlmKHJldHZhbCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAidXNiIHJlZ2lzdGVyIGRldiBmYWlsZWQgPSAlZCIsIHJldHZhbCk7Ci0JCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlVzYkNsYXNzRHJpdmVyUmVnaXN0ZXJlZCA9IEZBTFNFOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQllbHNlCi0JewotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJVc2JDbGFzc0RyaXZlclJlZ2lzdGVyZWQgPSBUUlVFOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInVzYiBkZXYgcmVnaXN0ZXJlZCIpOwotCX0KKworCXVzYl9zZXRfaW50ZmRhdGEocHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLCBwc0ludGZBZGFwdGVyKTsKIAogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YmNtX2ZpbGVfZG93bmxvYWQgPSBJbnRlcmZhY2VGaWxlRG93bmxvYWQ7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iY21fZmlsZV9yZWFkYmFja19mcm9tX2NoaXAgPQpAQCAtNzQ0LDY3ICs1OTgsNTEgQEAKIAogCXJldHZhbCA9IENyZWF0ZUludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKTsKIAotCWlmKHJldHZhbCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiIik7CisJaWYgKHJldHZhbCkgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAlyZXR2YWwgPSBBbGxvY1VzYkNiKHBzSW50ZkFkYXB0ZXIpOwotCWlmKHJldHZhbCkKLQl7CisJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQl9CiAKLQotCXJldHZhbCA9IGRldmljZV9ydW4ocHNJbnRmQWRhcHRlcik7Ci0JaWYocmV0dmFsKQotCXsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQotCXJldHVybiAwOworCXJldHVybiBkZXZpY2VfcnVuKHBzSW50ZkFkYXB0ZXIpOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVN1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgSW50ZXJmYWNlU3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgIHBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCS8vQmNtX2tpbGxfYWxsX1VSQnMocHNJbnRmQWRhcHRlcik7CisKIAlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID0gVFJVRTsKIAotCWlmKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpCi0JeworCWlmIChUUlVFID09IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKSB7CiAJCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kID0gRkFMU0U7CiAKLQkJaWYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKQotCQl7CisJCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxpbmtTdGF0dXMgPT0gTElOS1VQX0RPTkUpIHsKIAkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+SWRsZU1vZGUgPSBUUlVFIDsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJIb3N0IEVudGVyZWQgaW4gUE1VIElkbGUgTW9kZS4uIik7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuXG4iKTsKKwkJfSBlbHNlIHsKIAkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlNodXRTdGF0dXMgPSBUUlVFOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS4uIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBTaHV0ZG93biBNb2RlLlxuIik7CiAJCX0KIAl9CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gRkFMU0U7CiAKLQkvL1NpZ25hbGluZyB0aGUgY29udHJvbCBwa3QgcGF0aAorCS8qIFNpZ25hbGluZyB0aGUgY29udHJvbCBwa3QgcGF0aCAqLwogCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVJlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IEludGVyZmFjZVJlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLSAgICBQU19JTlRFUkZBQ0VfQURBUFRFUiAgcHNJbnRmQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCVBTX0lOVEVSRkFDRV9BREFQVEVSICBwc0ludGZBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAltZGVsYXkoMTAwKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzMikKLSAJaW50Zi0+cG1fdXNhZ2VfY250ID0xIDsKLSNlbmRpZgorCiAJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCA9IEZBTFNFOwogCiAJU3RhcnRJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcik7CkBAIC04MTIsNTcgKzY1MCw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVByZVJlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotICAgIHByaW50aygiPT09PT09PT09PT09PT09PT09PT0+Iik7Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IEludGVyZmFjZVBvc3RSZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLSAgICBwcmludGsoIkRvIFBvc3QgY2hpcCByZXNldCBzZXR0aW5nIGhlcmUgaWYgaXQgaXMgcmVxdWlyZWQiKTsKLSAgIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19CiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiYmNtX2RyaXZlciA9IHsKLSAgICAubmFtZSA9ICJ1c2JiY20iLAotICAgIC5wcm9iZSA9IHVzYmJjbV9kZXZpY2VfcHJvYmUsCi0gICAgLmRpc2Nvbm5lY3QgPSB1c2JiY21fZGlzY29ubmVjdCwKLSAgICAuc3VzcGVuZCA9IEludGVyZmFjZVN1c3BlbmQsCi0gICAgLnJlc3VtZSA9IEludGVyZmFjZVJlc3VtZSwKLQkucHJlX3Jlc2V0PUludGVyZmFjZVByZVJlc2V0LAotCS5wb3N0X3Jlc2V0PUludGVyZmFjZVBvc3RSZXNldCwKLSAgICAuaWRfdGFibGUgPSBJbnRlcmZhY2VVc2J0YWJsZSwKLSAgICAuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAorCS5uYW1lID0gInVzYmJjbSIsCisJLnByb2JlID0gdXNiYmNtX2RldmljZV9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYmJjbV9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gSW50ZXJmYWNlU3VzcGVuZCwKKwkucmVzdW1lID0gSW50ZXJmYWNlUmVzdW1lLAorCS5pZF90YWJsZSA9IEludGVyZmFjZVVzYnRhYmxlLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwogCitzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzczsKIAotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VJbml0aWFsaXplCi0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIEZ1bmN0aW9uLgotCQkJCQkJUmVnaXN0ZXJpbmcgdGhlIGRyaXZlciB3aXRoIE5ESVMgLCBvdGhlciBkZXZpY2Ugc3BlY2lmaWMgTkRJUwotCQkJCQkJYW5kIGhhcmR3YXJlIGluaXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCQlCQ01fU1RBVFVTX1NVQ0NFU1MgLSBJZiBJbml0aWFsaXphdGlvbiBvZiB0aGUKLQkJCQkJCUhXIEludGVyZmFjZSB3YXMgc3VjY2Vzc2Z1bC4KLQkJCQkJCU90aGVyICAgICAgICAgICAtIElmIGFuIGVycm9yIG9jY3VyZWQuCi0qLwotSU5UIEludGVyZmFjZUluaXRpYWxpemUodm9pZCkKK3N0YXRpYyBfX2luaXQgaW50IGJjbV9pbml0KHZvaWQpCiB7Ci0vLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyaW5nIFVzYiBkcml2ZXIhISIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcywgJXNcbiIsIERSVl9OQU1FLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CisKKwliY21fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIERSVl9OQU1FKTsKKwlpZiAoSVNfRVJSKGJjbV9jbGFzcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGNvdWxkIG5vdCBjcmVhdGUgY2xhc3NcbiIpOworCQlyZXR1cm4gUFRSX0VSUihiY21fY2xhc3MpOworCX0KKwogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnVzYmJjbV9kcml2ZXIpOwogfQogCi1JTlQgSW50ZXJmYWNlRXhpdCh2b2lkKQorc3RhdGljIF9fZXhpdCB2b2lkIGJjbV9leGl0KHZvaWQpCiB7Ci0JLy9QTUlOSV9BREFQVEVSIHBzQWRhcHRlciA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRGVyZWdpc3RlcmluZyBVc2IgZHJpdmVyISEiKTsKIAl1c2JfZGVyZWdpc3RlcigmdXNiYmNtX2RyaXZlcik7Ci0JcmV0dXJuIHN0YXR1czsKKwljbGFzc19kZXN0cm95KGJjbV9jbGFzcyk7CiB9Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworCittb2R1bGVfaW5pdChiY21faW5pdCk7Cittb2R1bGVfZXhpdChiY21fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaAppbmRleCBlN2E5NmU1Li4wNTgzMTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaApAQCAtOCw5ICs4LDExIEBACiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9UMyAJMHgwMzAwCiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IgCTB4MDIxMAogI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfVDNMIAkweDAyMjAKKyNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1NNMjUwIAkweGJjY2QKICNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1NZTSAgMHgxNUUKICNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEXzE5MDEgMHhlMDE3CiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF8yMjYgIDB4MDEzMgorI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfWlRFX1RVMjUgMHgwMDA3CiAKICNkZWZpbmUgQkNNX1VTQl9NSU5PUl9CQVNFIAkJMTkyCiAKQEAgLTE5LDMzICsyMSw3IEBACiAKIElOVCBJbnRlcmZhY2VFeGl0KHZvaWQpOwogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi1JTlQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgQWRhcHRlcik7Ci0KIElOVCB1c2JiY21fd29ya2VyX3RocmVhZChQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKTsKIAotVk9JRCBJbnRlcmZhY2VBZGFwdGVyRnJlZShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKTsKLQotI2Vsc2UKLUlOVCBJbnRlcmZhY2VBZGFwdGVySW5pdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotI2VuZGlmCi0KLQotI2lmIDAKLQotVUxPTkcgSW50ZXJmYWNlQ2xhaW1BZGFwdGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVZPSUQgSW50ZXJmYWNlRERSQ29udHJvbGxlckluaXQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVUxPTkcgSW50ZXJmYWNlUmVzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVUxPTkcgSW50ZXJmYWNlUmVnaXN0ZXJSZXNvdXJjZXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVk9JRCBJbnRlcmZhY2VVblJlZ2lzdGVyUmVzb3VyY2VzKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVMT05HIEludGVyZmFjZUZpcm13YXJlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotI2VuZGlmCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYwppbmRleCBmOTI4ZmU0Li4yMjBmZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKQEAgLTEsNiArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAKIHN0YXRpYyB2b2lkIHJlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYi8qLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyovKQogewpAQCAtOCw2ICs3LDEwIEBACiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUil1cmItPmNvbnRleHQ7CiAJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKIAorCWlmIChuZXRpZl9tc2dfaW50cihBZGFwdGVyKSkKKwkJcHJfaW5mbyhQRlggIiVzOiBpbnRlcnJ1cHQgc3RhdHVzICVkXG4iLAorCQkJQWRhcHRlci0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCiAJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiRGV2aWNlIGhhcyBHb3QgUmVtb3ZlZC4iKTsKQEAgLTg3LDcgKzkwLDcgQEAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJTiBlbmRQb2ludCAgaGFzIGdvdCBoYWx0ZWQvc3RhbGxlZC4uLm5lZWQgdG8gY2xlYXIgdGhpcyIpOwogCQkJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUUgOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDs7CisJCQkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CiAJCQkJcmV0dXJuOwogCQl9CiAJICAgIC8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KQEAgLTE2NCw0MCArMTY3LDMgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKgotRnVuY3Rpb246CQkJCUludGVyZmFjZUVuYWJsZUludGVycnVwdAotCi1EZXNjcmlwdGlvbjoJCQlUaGlzIGlzIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBGdW5jdGlvbiBmb3IgY29uZmlndXJpbmcKLQkJCQkJCWFuZCBlbmFibGluZyB0aGUgaW50ZXJydXB0cyBvbiB0aGUgZGV2aWNlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnJ1cHRzIHdhcyBzdWNjZXNzZnVsLgotCQkJCQkJT3RoZXIgICAgICAgICAgIC0gSWYgYW4gZXJyb3Igb2NjdXJlZC4KLSovCi0KLXZvaWQgSW50ZXJmYWNlRW5hYmxlSW50ZXJydXB0KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQotfQotCi0vKgotRnVuY3Rpb246CQkJCUludGVyZmFjZURpc2FibGVJbnRlcnJ1cHQKLQotRGVzY3JpcHRpb246CQkJVGhpcyBpcyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgRnVuY3Rpb24gZm9yIGRpc2FibGluZyB0aGUgaW50ZXJydXB0cyBvbiB0aGUgZGV2aWNlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIGRpc2FibGluZyB0aGUgaW50ZXJydXB0cyB3YXMgc3VjY2Vzc2Z1bC4KLQkJCQkJCU90aGVyICAgICAgICAgICAtIElmIGFuIGVycm9yIG9jY3VyZWQuCi0qLwotCi12b2lkIEludGVyZmFjZURpc2FibGVJbnRlcnJ1cHQoUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCi19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCmluZGV4IDhmYzg5M2IuLmE1MTE4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCkBAIC0xLDE3ICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQotUFNfSU5URVJGQUNFX0FEQVBURVIKLUludGVyZmFjZUFkYXB0ZXJHZXQoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpCi17Ci0JaWYocHNBZGFwdGVyID09IE5VTEwpCi0JewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQU19JTlRFUkZBQ0VfQURBUFRFUikocHNBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOwotfQotCiBJTlQKIEludGVyZmFjZVJETShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLAogICAgICAgICAgICAgVUlOVCBhZGRyLApAQCAtMTAyLDcgKzkwLDcgQEAKIAlpZigocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9PSBUUlVFKSAmJiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBXUk0sIERCR19MVkxfQUxMLCJDdXJyZW50bHkgWGFjdGlvbiBpcyBub3QgYWxsb3dlZCBvbiB0aGUgYnVzLi4uIik7Ci0JCXJldHVybiBFQUNDRVM7CisJCXJldHVybiAtRUFDQ0VTOwogCX0KIAogCWlmKHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPT1UUlVFIHx8IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kID09IFRSVUUpCkBAIC0yMzYsOSArMjI0LDcgQEAKIAl9CiAKIAkvKiBDYW5jZWwgQWxsIHN1Ym1pdHRlZCBUWCBVUkIncyAqLwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FuY2VsbGluZyBBbGwgU3VibWl0dGVkIFRYIFVyYnMgXG4iKTsKLQotICAgIGZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKQorCWZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKQogCXsKIAkJdGVtcFVyYiA9IHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYjsKIAkJaWYodGVtcFVyYikKQEAgLTI0OCw5ICsyMzQsNiBAQAogCQl9CiAJfQogCi0KLSAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbmNlbGxpbmcgQWxsIHN1Ym1pdHRlZCBSeCBVcmJzIFxuIik7Ci0KIAlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykKIAl7CiAJCXRlbXBVcmIgPSBwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmI7CkBAIC0yNjEsMTYgKzI0NCwxMSBAQAogCQl9CiAJfQogCi0KIAlhdG9taWNfc2V0KCZwc0ludGZBZGFwdGVyLT51TnVtVGNiVXNlZCwgMCk7CiAJYXRvbWljX3NldCgmcHNJbnRmQWRhcHRlci0+dUN1cnJUY2IsIDApOwogCiAJYXRvbWljX3NldCgmcHNJbnRmQWRhcHRlci0+dU51bVJjYlVzZWQsIDApOwogCWF0b21pY19zZXQoJnBzSW50ZkFkYXB0ZXItPnVDdXJyUmNiLCAwKTsKLQotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVENCOiB1c2VkLSAlZCBjdXItJWRcbiIsIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51TnVtVGNiVXNlZCksIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51Q3VyclRjYikpOwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUkNCOiB1c2VkLSAlZCBjdXItJWRcbiIsIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51TnVtUmNiVXNlZCksIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51Q3VyclJjYikpOwotCiB9CiAKIFZPSUQgcHV0VXNiU3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yODIsOSArMjYwLDYgQEAKIAogCWlmKHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPT0gRkFMU0UpCiAJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKTsKLQllbHNlCi0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJbnRlcmZhY2UgUmVzdW1lZCBDb21wbGV0ZWx5XG4iKTsKIAogfQogCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKaW5kZXggNzRjODFkNC4uNmM5ZTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKQEAgLTEsOSArMSw2IEBACiAjaWZuZGVmIF9fSU5URVJGQUNFX01JU0NfSAogI2RlZmluZSBfX0lOVEVSRkFDRV9NSVNDX0gKIAotUFNfSU5URVJGQUNFX0FEQVBURVIKLUludGVyZmFjZUFkYXB0ZXJHZXQoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpOwotCiBJTlQKIEludGVyZmFjZVJETShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLAogCQkJVUlOVCBhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VSeC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VSeC5jCmluZGV4IDZmZWU5NjguLjUzM2Y4ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlUnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVJ4LmMKQEAgLTEsNSArMSwxNSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKLWV4dGVybiBpbnQgU2VhcmNoVmNpZChQTUlOSV9BREFQVEVSICwgdW5zaWduZWQgc2hvcnQpOworCitzdGF0aWMgaW50IFNlYXJjaFZjaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLHVuc2lnbmVkIHNob3J0IHVzVmNpZCkKK3sKKwlpbnQgaUluZGV4PTA7CisKKwlmb3IoaUluZGV4PShOT19PRl9RVUVVRVMtMSk7aUluZGV4Pj0wO2lJbmRleC0tKQorCQlpZihBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLnVzVkNJRF9WYWx1ZSA9PSB1c1ZjaWQpCisJCQlyZXR1cm4gaUluZGV4OworCXJldHVybiBOT19PRl9RVUVVRVMrMTsKKworfQogCiAKIHN0YXRpYyBQVVNCX1JDQgpAQCAtMzgsMTMgKzQ4LDkgQEAKIAlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CiAJUExFQURFUiBwTGVhZGVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKLQotCSNpZiAwCi0JaW50ICpwdWlCdWZmZXIgPSBOVUxMOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCW1lbXNldCgmdHYsIDAsIHNpemVvZih0dikpOwotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCSNlbmRpZgorCWlmICh1bmxpa2VseShuZXRpZl9tc2dfcnhfc3RhdHVzKEFkYXB0ZXIpKSkKKwkJcHJfaW5mbyhQRlggIiVzOiByeCB1cmIgc3RhdHVzICVkIGxlbmd0aCAlZFxuIiwKKwkJCUFkYXB0ZXItPmRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAlpZigoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkgIHx8CiAJCShUUlVFID09IEFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCkgfHwKQEAgLTg5LDEwICs5NSwxMCBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiTGVhZGVyIFN0YXR1czoweCVoWCwgTGVuZ3RoOjB4JWhYLCBWQ0lEOjB4JWhYIiwgcExlYWRlci0+U3RhdHVzLHBMZWFkZXItPlBMZW5ndGgscExlYWRlci0+VmNpZCk7CiAJaWYoTUFYX0NOVExfUEtUX1NJWkUgPCBwTGVhZGVyLT5QTGVuZ3RoKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29ycnVwdGVkIGxlYWRlciBsZW5ndGguLi4lZFxuIiwKLQkJCQkJcExlYWRlci0+UExlbmd0aCk7Ci0JCWF0b21pY19pbmMoJkFkYXB0ZXItPlJ4UGFja2V0RHJvcHBlZENvdW50KTsKLQkJYXRvbWljX2FkZChwTGVhZGVyLT5QTGVuZ3RoLCAmQWRhcHRlci0+QmFkUnhCeXRlQ291bnQpOworCQlpZiAobmV0aWZfbXNnX3J4X2VycihBZGFwdGVyKSkKKwkJCXByX2luZm8oUEZYICIlczogY29ycnVwdGVkIGxlYWRlciBsZW5ndGguLi4lZFxuIiwKKwkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHBMZWFkZXItPlBMZW5ndGgpOworCQkrK0FkYXB0ZXItPmRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJYXRvbWljX2RlYygmcHNJbnRmQWRhcHRlci0+dU51bVJjYlVzZWQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ1LDEwICsxNTEsOSBAQAogCQlza2JfcHV0IChza2IsIHBMZWFkZXItPlBMZW5ndGggKyBFVEhfSExFTik7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpVG90YWxSeEJ5dGVzKz1wTGVhZGVyLT5QTGVuZ3RoOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVRoaXNQZXJpb2RSeEJ5dGVzKz0gcExlYWRlci0+UExlbmd0aDsKLQkJYXRvbWljX2FkZChwTGVhZGVyLT5QTGVuZ3RoLCAmQWRhcHRlci0+R29vZFJ4Qnl0ZUNvdW50KTsKICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfREFUQSwgREJHX0xWTF9BTEwsICJSZWNpdmVkIERhdGEgcGt0IG9mIGxlbiA6MHglWCIsIHBMZWFkZXItPlBMZW5ndGgpOwogCi0JCWlmKEFkYXB0ZXItPmlmX3VwKQorCQlpZihuZXRpZl9ydW5uaW5nKEFkYXB0ZXItPmRldikpCiAJCXsKIAkJCS8qIE1vdmluZyBhaGVhZCBieSBFVEhfSExFTiB0byB0aGUgZGF0YSBwdHIgYXMgcmVjZWl2ZWQgZnJvbSBGVyAqLwogCQkJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CkBAIC0xNzMsOSArMTc4LDEyIEBACiAJCWVsc2UKIAkJewogCQkgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfREFUQSwgREJHX0xWTF9BTEwsICJpL2Ygbm90IHVwIGhhbmNlIGZyZWVpbmcgU0tCLi4uIik7Ci0JCQliY21fa2ZyZWVfc2tiKHNrYik7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCX0KLQkJYXRvbWljX2luYygmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOworCisJCSsrQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOworCQlBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBMZWFkZXItPlBMZW5ndGg7CisKIAkJZm9yKHVpSW5kZXggPSAwIDsgdWlJbmRleCA8IE1JQlNfTUFYX0hJU1RfRU5UUklFUyA7IHVpSW5kZXgrKykKIAkJewogCQkJaWYoKHBMZWFkZXItPlBMZW5ndGggPD0gTUlCU19QS1RTSVpFSElTVF9SQU5HRSoodWlJbmRleCsxKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguYwppbmRleCA3NzFmN2IzLi5hODQyZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5jCkBAIC0xLDUwICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VUeERhdGFQYWNrZXQKLQotRGVzY3JpcHRpb246CQkJVGhpcyBpcyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgRnVuY3Rpb24gZm9yIFRyYW5zbWl0dGluZwotCQkJCQkJZGF0YSBwYWNrZXQgdG8gdGhlIGRldmljZS4KLQotSW5wdXQgcGFyYW1ldGVyczoJCUlOIFBNSU5JX0FEQVBURVIgQWRhcHRlciAgIC0gTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0JCQkJCQlQVk9JRCBQYWNrZXQJCQkJLSAgUGFja2V0IENvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKLQkJCQkJCVVTSE9SVCB1c1ZjaWQJCQkgICAtIFZDSUQgb24gd2hpY2ggZGF0YSBwYWNrZXQgaXMgdG8gYmUgc2VudAotCi0KLVJldHVybjoJCQkJQkNNX1NUQVRVU19TVUNDRVNTIC0gSWYgVHggd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLQotVUxPTkcgSW50ZXJmYWNlVHhEYXRhUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBQYWNrZXQsVVNIT1JUIHVzVmNpZCkKLXsKLQlVTE9ORwlTdGF0dXMgPSAwOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi1GdW5jdGlvbjoJCQkJSW50ZXJmYWNlVHhDb250cm9sUGFja2V0Ci0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIEZ1bmN0aW9uIGZvciBUcmFuc21pdHRpbmcKLQkJCQkJCWNvbnRyb2wgcGFja2V0IHRvIHRoZSBkZXZpY2UuCi0KLUlucHV0IHBhcmFtZXRlcnM6CQlJTiBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgICAtIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAotCQkJCQkJUFZPSUQgcHZCdWZmZXIJCQkgICAtIEJ1ZmZlciBjb250YWluZyBjb250cm9sIHBhY2tldAotCQkJCQkJVUlOVCB1aUJ1ZmZlckxlbmd0aAkJICAgLSBCdWZmZXIgTGVuZ3RoCi0KLVJldHVybjoJCQkJQkNNX1NUQVRVU19TVUNDRVNTIC0gSWYgY29udHJvbCBwYWNrZXQgdHJhbnNtaXQgd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLQotVUxPTkcgSW50ZXJmYWNlVHhDb250cm9sUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkJ1ZmZlcixVSU5UIHVpQnVmZmVyTGVuZ3RoKQotewotCVVMT05HCVN0YXR1cyA9IDA7Ci0KLQotCi0JcmV0dXJuIFN0YXR1czsKLX0KIC8qdGhpcyBpcyB0cmFuc21pdCBjYWxsLWJhY2soQlVMSyBPVVQpKi8KIHN0YXRpYyB2b2lkIHdyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLyosIHN0cnVjdCBwdF9yZWdzICpyZWdzKi8pCiB7CkBAIC01NCwxMCArOSwxMCBAQAogCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKIAlCT09MRUFOIGJwb3dlckRvd25Nc2cgPSBGQUxTRSA7CiAgICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotI2lmIDAKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlVSU5UIHRpbWVfbXMgPSAwOwotI2VuZGlmCisKKyAgICBpZiAodW5saWtlbHkobmV0aWZfbXNnX3R4X2RvbmUoQWRhcHRlcikpKQorCSAgICBwcl9pbmZvKFBGWCAiJXM6IHRyYW5zbWl0IHN0YXR1cyAlZFxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lLCB1cmItPnN0YXR1cyk7CisKIAlpZih1cmItPnN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAl7CiAJCWlmKHVyYi0+c3RhdHVzID09IC1FUElQRSkKQEAgLTc4LDExICszMyw2IEBACiAKIAlpZihUUlVFID09IHBzQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkKIAl7Ci0JCSNpZiAwCi0JCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCQl0aW1lX21zID0gdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYy8xMDAwOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICIgJXMgSWRsZSBNb2RlIEFDS19TZW50IGdvdCBmcm9tIGRldmljZSBhdCB0aW1lIDoweCV4IiwgX19GVU5DVElPTl9fLCB0aW1lX21zKTsKLQkJI2VuZGlmCiAKIAkJaWYoKChwQ29udHJvbE1zZy0+c3pEYXRhWzBdID09IEdPX1RPX0lETEVfTU9ERV9QQVlMT0FEKSAmJgogCQkJKHBDb250cm9sTXNnLT5zekRhdGFbMV0gPT0gVEFSR0VUX0NBTl9HT19UT19JRExFX01PREUpKSkKQEAgLTE1MiwxNyArMTAyLDEyIEBACiAJfQogCiBlcnJfZXhpdCA6Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCXVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZWxzZQogCXVzYl9mcmVlX2NvaGVyZW50KHVyYi0+ZGV2LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAgCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfZG1hKTsKLSNlbmRpZgogfQogCiAKLXN0YXRpYyBfX2lubGluZSBQVVNCX1RDQiBHZXRCdWxrT3V0VGNiKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCitzdGF0aWMgUFVTQl9UQ0IgR2V0QnVsa091dFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewogCVBVU0JfVENCIHBUY2IgPSBOVUxMOwogCVVJTlQgaW5kZXggPSAwOwpAQCAtMTgzLDIwICsxMjgsMTQgQEAKIAlyZXR1cm4gcFRjYjsKIH0KIAotc3RhdGljIF9faW5saW5lIGludCBUcmFuc21pdFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLCBQVVNCX1RDQiBwVGNiLCBQVk9JRCBkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBUcmFuc21pdFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLCBQVVNCX1RDQiBwVGNiLCBQVk9JRCBkYXRhLCBpbnQgbGVuKQogewogCiAJc3RydWN0IHVyYiAqdXJiID0gcFRjYi0+dXJiOwogCWludCByZXR2YWwgPSAwOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyhwc0ludGZBZGFwdGVyLT51ZGV2LCBsZW4sCi0gCQkJCQkJR0ZQX0FUT01JQywgJnVyYi0+dHJhbnNmZXJfZG1hKTsKLSNlbHNlCiAJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQocHNJbnRmQWRhcHRlci0+dWRldiwgbGVuLAogIAkJCQkJCUdGUF9BVE9NSUMsICZ1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZW5kaWYKLQogCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpCiAJewogCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKQEAgLTI1NSw1ICsxOTQsNCBAQAogCXJldHVybiBUcmFuc21pdFRjYihwc0ludGZBZGFwdGVyLCBwVGNiLCBkYXRhLCBsZW4pOwogfQogCi0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5oCmluZGV4IDA1M2Y2MzEuLjI3MzE0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmgKQEAgLTMsMTEgKzMsNSBAQAogCiBJTlQgSW50ZXJmYWNlVHJhbnNtaXRQYWNrZXQoUFZPSUQgYXJnLCBQVk9JRCBkYXRhLCBVSU5UIGxlbik7CiAKLQotVUxPTkcgSW50ZXJmYWNlVHhEYXRhUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBQYWNrZXQsVVNIT1JUIHVzVmNpZCk7Ci0KLVVMT05HIEludGVyZmFjZVR4Q29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIsVUlOVCB1aUJ1ZmZlckxlbmd0aCk7Ci0KLQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VtYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGI1NjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VtYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9NQUlOXwotI2RlZmluZSBfTUFJTl8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCBfTUlOSV9BREFQVEVSCi17Ci0JU19JTlRFUkZBQ0VfQURBUFRFUiBzdEludGVyZmFjZUFkYXB0ZXI7Ci19TUlOSV9BREFQVEVSLCpQTUlOSV9BREFQVEVSOwotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9MZWFreUJ1Y2tldC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9MZWFreUJ1Y2tldC5jCmluZGV4IGNhZTM4MjMuLmY0Y2Y0MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTGVha3lCdWNrZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0xlYWt5QnVja2V0LmMKQEAgLTc1LDE0ICs3NSwxNCBAQAogKiBSZXR1cm5zICAgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb3dlZCBmb3IgdHJhbnNtaXNzaW9uLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgVUxPTkcgR2V0U0ZUb2tlbkNvdW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUGFja2V0SW5mbyAqcHNTRikKK3N0YXRpYyBVTE9ORyBHZXRTRlRva2VuQ291bnQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQYWNrZXRJbmZvICpwc1NGKQogewogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSXNQYWNrZXRBbGxvd2VkRm9yRmxvdyA9PT0+Iik7CiAJLyogVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KIAlpZihOVUxMID09IEFkYXB0ZXIgfHwgKHBzU0YgPCBBZGFwdGVyLT5QYWNrSW5mbyAmJgogCQkodWludHB0cl90KXBzU0YgPiAodWludHB0cl90KSAmQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0pKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJUEFGRjogR290IHdyb25nIFBhcmFtZXRlcnM6QWRhcHRlcjogJXAsIFFJbmRleDogJWxkXG4iLCBBZGFwdGVyLCAocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklQQUZGOiBHb3Qgd3JvbmcgUGFyYW1ldGVyczpBZGFwdGVyOiAlcCwgUUluZGV4OiAlemRcbiIsIEFkYXB0ZXIsIChwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTQsNTEgKzk0LDI3IEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIk5vdCBlbm91Z2ggdG9rZW5zIGluIHF1ZXVlICVsZCBBdmFpbGFibGUgJXVcbiIsCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIk5vdCBlbm91Z2ggdG9rZW5zIGluIHF1ZXVlICV6ZCBBdmFpbGFibGUgJXVcbiIsCiAJCQkJcHNTRi1BZGFwdGVyLT5QYWNrSW5mbywgcHNTRi0+dWlDdXJyZW50VG9rZW5Db3VudCk7CiAJCQlwc1NGLT51aVBlbmRlZExhc3QgPSAxOwogCQl9CiAJfQogCWVsc2UKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSVBBRkY6IFF1ZXVlICVsZCBub3QgdmFsaWRcbiIsIHBzU0YtQWRhcHRlci0+UGFja0luZm8pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklQQUZGOiBRdWV1ZSAlemQgbm90IHZhbGlkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKIAl9CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJc1BhY2tldEFsbG93ZWRGb3JGbG93IDw9PT0iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgUmVtb3ZlUGFja2V0RnJvbVF1ZXVlKFBhY2tldEluZm8gKnBQYWNrSW5mbyAsIHN0cnVjdCBza19idWZmICpQYWNrZXQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnBzUXVldWVDdXJyZW50PU5VTEwsICpwc0xhc3RRdWV1ZU5vZGU9TlVMTDsKLQlwc1F1ZXVlQ3VycmVudCA9IHBQYWNrSW5mby0+Rmlyc3RUeFF1ZXVlOwotCXdoaWxlKHBzUXVldWVDdXJyZW50KQotCXsKLQkJaWYoUGFja2V0ID09IHBzUXVldWVDdXJyZW50KQotCQl7Ci0JCQlpZihwc1F1ZXVlQ3VycmVudCA9PSBwUGFja0luZm8tPkZpcnN0VHhRdWV1ZSkKLQkJCXsKLQkJCQlwUGFja0luZm8tPkZpcnN0VHhRdWV1ZT1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQkJCQlpZihwc1F1ZXVlQ3VycmVudD09cFBhY2tJbmZvLT5MYXN0VHhRdWV1ZSkKLQkJCQkJcFBhY2tJbmZvLT5MYXN0VHhRdWV1ZT1OVUxMOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBzTGFzdFF1ZXVlTm9kZS0+bmV4dD1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXBzTGFzdFF1ZXVlTm9kZSA9IHBzUXVldWVDdXJyZW50OwotCQlwc1F1ZXVlQ3VycmVudD1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQl9Ci19CiAvKioKIEBpbmdyb3VwIHR4X2Z1bmN0aW9ucwogVGhpcyBmdW5jdGlvbiBkZXNwYXRjaGVzIHBhY2tldCBmcm9tIHRoZSBzcGVjaWZpZWQgcXVldWUuCiBAcmV0dXJuIFplcm8oc3VjY2Vzcykgb3IgTmVnYXRpdmUgdmFsdWUoZmFpbHVyZSkKICovCi1zdGF0aWMgX19pbmxpbmUgSU5UIFNlbmRQYWNrZXRGcm9tUXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQkJCQlQYWNrZXRJbmZvICpwc1NGLAkJLyoqPFF1ZXVlIGlkZW50aWZpZXIqLwotCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiogIFBhY2tldCkJLyoqPFBvaW50ZXIgdG8gdGhlIHBhY2tldCB0byBiZSBzZW50Ki8KK3N0YXRpYyBJTlQgU2VuZFBhY2tldEZyb21RdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPExvZ2ljYWwgQWRhcHRlciovCisJCQkgICAgICAgUGFja2V0SW5mbyAqcHNTRiwJCS8qKjxRdWV1ZSBpZGVudGlmaWVyKi8KKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiogIFBhY2tldCkJLyoqPFBvaW50ZXIgdG8gdGhlIHBhY2tldCB0byBiZSBzZW50Ki8KIHsKIAlJTlQgIAlTdGF0dXM9U1RBVFVTX0ZBSUxVUkU7CiAJVUlOVCB1aUluZGV4ID0wLFBrdExlbiA9IDA7CkBAIC0xODAsOCArMTU2LDcgQEAKICogUmV0dXJucyAgICAgLSBOb25lLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBfX2lubGluZSBWT0lEIENoZWNrQW5kU2VuZFBhY2tldEZyb21JbmRleAotKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUGFja2V0SW5mbyAqcHNTRikKK3N0YXRpYyBWT0lEIENoZWNrQW5kU2VuZFBhY2tldEZyb21JbmRleChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBhY2tldEluZm8gKnBzU0YpCiB7CiAJc3RydWN0IHNrX2J1ZmYJKlF1ZXVlUGFja2V0PU5VTEw7CiAJY2hhciAJCQkqcENvbnRyb2xQYWNrZXQgPSBOVUxMOwpAQCAtMTg5LDcgKzE2NCw3IEBACiAJaW50CQkJCWlQYWNrZXRMZW49MDsKIAogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiJWxkID09PT0+IiwgKHBzU0YtQWRhcHRlci0+UGFja0luZm8pKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICIlemQgPT09PT4iLCAocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOwogCWlmKChwc1NGICE9ICZBZGFwdGVyLT5QYWNrSW5mb1tIaVByaW9yaXR5XSkgJiYgQWRhcHRlci0+TGlua1VwU3RhdHVzICYmIGF0b21pY19yZWFkKCZwc1NGLT51aVBlclNGVHhSZXNvdXJjZUNvdW50KSkvL0dldCBkYXRhIHBhY2tldAogICAJewogCQlpZighcHNTRi0+dWNEaXJlY3Rpb24gKQpAQCAtMTk3LDEwICsxNzIsOCBAQAogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIlVwZGF0ZVRva2VuQ291bnQgIik7CiAJCWlmKEFkYXB0ZXItPklkbGVNb2RlIHx8IEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRGV2aWNlIGlzIGluIElkbGUgTW9kZS4uSGVuY2UgYmxvY2tpbmcgRGF0YSBQYWNrZXRzLi5cbiIpOwotCQkJcmV0dXJuOwotCQl9CisJCQlyZXR1cm47CS8qIGluIGlkbGUgbW9kZSAqLworCiAJCS8vIENoZWNrIGZvciBGcmVlIERlc2NyaXB0b3JzCiAJCWlmKGF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykgPD0gTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTKQogCQl7CkBAIC0yMDgsOSArMTgxLDYgQEAKIAkJCXJldHVybiA7CiAJCX0KIAotI2lmIDAKLQkJUHJ1bmVRdWV1ZShBZGFwdGVyLChwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKSk7Ci0jZW5kaWYKIAkJc3Bpbl9sb2NrX2JoKCZwc1NGLT5TRlF1ZXVlTG9jayk7CiAJCVF1ZXVlUGFja2V0PXBzU0YtPkZpcnN0VHhRdWV1ZTsKIApAQCAtMjQwLDcgKzIxMCw3IEBACiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRm9yIFF1ZXVlOiAlbGRcbiIsIHBzU0YtQWRhcHRlci0+UGFja0luZm8pOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkZvciBRdWV1ZTogJXpkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJcbkF2YWlsYWJsZSBUb2tlbnMgPSAlZCByZXF1aXJlZCA9ICVkXG4iLAogCQkJCQlwc1NGLT51aUN1cnJlbnRUb2tlbkNvdW50LCBpUGFja2V0TGVuKTsKIAkJCQkvL3RoaXMgcGFydCBpbmRpY2F0ZXMgdGhhdCBiZWN1YXNlIG9mIG5vbi1hdmFpbGFiaWxpdHkgb2YgdGhlIHRva2VucwpAQCAtMjkwLDE3ICsyNjAsNiBAQAogCQkJfQogCSAgIAl9CiAJfQotCi0JaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQkvL1R4IG9mIGRhdGEgcGFja2V0IHRvIGRldmljZSBGYWlsZWQKLQl7Ci0JCWlmKEFkYXB0ZXItPmJjbV9qaWZmaWVzID09IDApCi0JCQlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7Ci0JfQotCWVsc2UKLQl7Ci0JCUFkYXB0ZXItPmJjbV9qaWZmaWVzID0gMDsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiPD09PT09Iik7CiB9CiAKIApAQCAtMzg3LDEyICszNDYsNyBAQAogCQlpZihleGl0X2ZsYWcgPT0gVFJVRSApCiAJCSAgICBicmVhayA7CiAJfS8qIGVuZCBvZiBpbm5lciB3aGlsZSBsb29wICovCi0JaWYoQWRhcHRlci0+YmNtX2ppZmZpZXMgPT0gMCAmJgotCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCkgIT0gMCAmJgotCSAgIAl1aVByZXZUb3RhbENvdW50ID09IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkKLQl7Ci0JCUFkYXB0ZXItPmJjbV9qaWZmaWVzID0gamlmZmllczsKLQl9CisKIAl1cGRhdGVfcGVyX2NpZF9yeCAgKEFkYXB0ZXIpOwogCUFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9IDA7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiPD09PT09PSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFjcm9zLmgKaW5kZXggMDI0MTIzNC4uZmViMzUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01hY3Jvcy5oCkBAIC00LDEwICs0LDYgQEAKICNpZm5kZWYJX19NQUNST1NfSF9fCiAjZGVmaW5lIF9fTUFDUk9TX0hfXwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0jZGVmaW5lIGt0aHJlYWRfcnVuKHRocmVhZGZuLGRhdGEsZGF0YWZtdCkoc3RydWN0IHRhc2tfc3RydWN0ICopa2VybmVsX3RocmVhZCh0aHJlYWRmbixkYXRhLDApCi0jZW5kaWYKLQogI2RlZmluZSBUWF9USU1FUl9QRVJJT0QgMTAJLy8xMCBtc2VjCiAjZGVmaW5lIE1BWF9DTEFTU0lGSUVSUyAxMDAKIC8vI2RlZmluZSBNQVhfQ0xBU1NJRklFUlNfUEVSX1NGICAyMApAQCAtMTcsMTAgKzEzLDkgQEAKICNkZWZpbmUgTUFYX0RBVEFfUEtUUyAJCTIwMAogI2RlZmluZSBNQVhfRVRIX1NJWkUgCQkxNTM2CiAjZGVmaW5lIE1BWF9DTlRMX1BLVF9TSVpFIDIwNDgKLS8qIFRJTUVSIFJFTEFURUQgKi8KLSNkZWZpbmUgSklGRklFU18yX1FVQURQQVJUKCkJKFVMT05HKShqaWZmaWVzICogMTAwMDApIC8vIGppZmZpZXMoMW1zZWMpIHRvIFF1YWRwYXJ0KDEwMG5zZWMpCiAKICNkZWZpbmUgTVRVX1NJWkUgMTQwMAorI2RlZmluZSBUWF9RTEVOICA1CiAKICNkZWZpbmUgTUFDX0FERFJfUkVHSVNURVIgMHhiZjYwZDAwMAogCkBAIC0yNjYsNyArMjYxLDcgQEAKIAogI2RlZmluZSBGSVJNV0FSRV9CRUdJTl9BRERSIDB4QkZDMDAwMDAKIAotI2RlZmluZSBJTlZBTElEX1FVRVVFX0lOREVYIChVU0hPUlQpLTEKKyNkZWZpbmUgSU5WQUxJRF9RVUVVRV9JTkRFWCBOT19PRl9RVUVVRVMKIAogI2RlZmluZSBJTlZBTElEX1BJRCAocGlkX3QpLTEKICNkZWZpbmUgRERSXzgwX01IWiAgCTAKQEAgLTMwMCwxMiArMjk1LDcgQEAKIAogLyogSWRsZSBNb2RlIFJlbGF0ZWQgUmVnaXN0ZXJzICovCiAjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9HRU5FUkFUT1JfUkVHSVNUT1IgMHgwRjAwMDA3QwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0jZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX0xPQyAJCTB4YmZjMDJmOWMKLSNkZWZpbmUgQ1BFX1ZJUlRVQUxfTUFJTEJPWF9SRUcgICAgIDB4QkZDMDJFNTgKLSNlbHNlCiAjZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX0xPQyAJCTB4MEZGMDFGRkMKLSNlbmRpZgogCiAjZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX1BBVFRFUk4gCTB4ZDBlYTFkMWUKICNkZWZpbmUgREVWSUNFX0lOVF9PVVRfRVBfUkVHMAkJMHgwRjAxMTg3MApAQCAtMzU1LDEyICszNDUsNyBAQAogCUhZQlJJRF9NT0RFXzYgICA9IDIKIH1QTVVfTU9ERTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKLSNkZWZpbmUgTUFYX1JETV9XUk1fUkVUSVJFUyAxNgotI2Vsc2UKICNkZWZpbmUgTUFYX1JETV9XUk1fUkVUSVJFUyAxCi0jZW5kaWYKLQogCiBlbnVtIGVBYm9ydFBhdHRlcm4gewogCUFCT1JUX1NIVVRET1dOX01PREUgPSAxLApAQCAtMzY5LDI3ICszNTQsNiBAQAogCUFCT1JUX0lETEVfU1lOQ0RPV04gPSAzCiB9OwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotCSNkZWZpbmUgR0VUX0JDTV9BREFQVEVSKG5ldF9kZXYpICAoe1wKLSAgICBQTUlOSV9BREFQVEVSIF9fQWRhcHRlciA9IE5VTEw7CVwKLSAgICBpZiAobmV0X2RldikgICAgeyAgIFwKLSAgICAgICAgIF9fQWRhcHRlciA9IChQTUlOSV9BREFQVEVSKShuZXRfZGV2LT5wcml2KTsgXAotICAgIH0gXAotICAgIGVsc2UgICAgeyAgIFwKLSAgICAgICAgIF9fQWRhcHRlciA9IE5VTEw7ICBcCi0gICAgfV9fQWRhcHRlcjt9ICkKLSNlbHNlCi0JI2RlZmluZSBHRVRfQkNNX0FEQVBURVIobmV0X2RldikgKHtcCi0gICAgUE1JTklfQURBUFRFUiBfX0FkYXB0ZXIgPSBOVUxMOwlcCi0gICAgaWYgKG5ldF9kZXYpICAgIHsgICBcCi0gICAgICAgICBfX0FkYXB0ZXIgPSAoUE1JTklfQURBUFRFUikoKigodW5zaWduZWQgbG9uZyAqKW5ldGRldl9wcml2KG5ldF9kZXYpKSk7ICBcCi0gICAgfSBcCi0gICAgZWxzZSAgICB7ICAgXAotICAgICAgICAgX19BZGFwdGVyID0gTlVMTDsgIFwKLSAgICB9X19BZGFwdGVyO30pCi0KLQotI2VuZGlmCiAKIC8qIE9mZnNldHMgdXNlZCBieSBkcml2ZXIgaW4gc2tiIGNiIHZhcmlhYmxlICovCiAjZGVmaW5lIFNLQl9DQl9DTEFTU0lGSUNBVElPTl9PRkZTRVQgICAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFrZWZpbGUKaW5kZXggYzNhZTI1YS4uNjUyYjdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCiBiY21fd2ltYXgteSA6PSAgSW50ZXJmYWNlRGxkLm8gSW50ZXJmYWNlSWRsZU1vZGUubyBJbnRlcmZhY2VJbml0Lm8gSW50ZXJmYWNlUngubyBcCiAJCUludGVyZmFjZUlzci5vIEludGVyZmFjZU1pc2MubyBJbnRlcmZhY2VUeC5vIFwKLQkJQXJwLm8gQ21Ib3N0Lm8gRGVidWcubyBJUHY2UHJvdG9jb2wubyBRb3MubyBUcmFuc21pdC5vXAorCQlDbUhvc3QubyBJUHY2UHJvdG9jb2wubyBRb3MubyBUcmFuc21pdC5vXAogCQlCY21uZXQubyBERFJJbml0Lm8gSGFuZGxlQ29udHJvbFBhY2tldC5vXAogCQlMZWFreUJ1Y2tldC5vIE1pc2MubyBzb3J0Lm8gQmNtY2hhci5vIGhvc3RtaWJzLm8gUEhTTW9kdWxlLm9cCi0JIAlPc2FsX01pc2MubyBsZWRfY29udHJvbC5vIG52bS5vIHZlbmRvcnNwZWNpZmljZXh0bi5vCisJCWxlZF9jb250cm9sLm8gbnZtLm8gdmVuZG9yc3BlY2lmaWNleHRuLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKaW5kZXggMjI1NTBmNy4uZjU4NWFhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKQEAgLTEsNSArMSwxMiBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIGludCBCY21GaWxlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyk7CitzdGF0aWMgVk9JRCBkb1Bvd2VyQXV0b0NvcnJlY3Rpb24oUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpOworc3RhdGljIHZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y0J1ZmZlcik7CitzdGF0aWMgaW50IGJjbV9wYXJzZV90YXJnZXRfcGFyYW1zKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgdm9pZCBiZWNlZW1fcHJvdG9jb2xfcmVzZXQgKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKIHN0YXRpYyBWT0lEIGRlZmF1bHRfd2ltYXhfcHJvdG9jb2xfaW5pdGlhbGl6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKQEAgLTYwLDIxICs2NywxMSBAQAogICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmcHNBZGFwdGVyLT5kZXZpY2Vfd2FrZV9xdWV1ZSk7CiAgICAgcHNBZGFwdGVyLT5md19kb3dubG9hZF9kb25lPUZBTFNFOwogCi0gICAgcHNBZGFwdGVyLT5wdk9zRGVwRGF0YSA9IChQTElOVVhfREVQX0RBVEEpIGttYWxsb2Moc2l6ZW9mKExJTlVYX0RFUF9EQVRBKSwKLSAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7Ci0KLSAgICBpZihwc0FkYXB0ZXItPnB2T3NEZXBEYXRhID09IE5VTEwpCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkxpbnV4IFNwZWNpZmljIERhdGEgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIG1lbXNldChwc0FkYXB0ZXItPnB2T3NEZXBEYXRhLCAwLCBzaXplb2YoTElOVVhfREVQX0RBVEEpKTsKIAogCWRlZmF1bHRfd2ltYXhfcHJvdG9jb2xfaW5pdGlhbGl6ZShwc0FkYXB0ZXIpOwogCWZvciAoaT0wO2k8TUFYX0NOVFJMX1BLVFM7aSsrKQogCXsKLQkJcHNBZGFwdGVyLT50eGN0bHBhY2tldFtpXSA9IChjaGFyICopa21hbGxvYyhNQVhfQ05UTF9QS1RfU0laRSwKLQkJCQkJCQkJCQkJCUdGUF9LRVJORUwpOworCQlwc0FkYXB0ZXItPnR4Y3RscGFja2V0W2ldID0ga21hbGxvYyhNQVhfQ05UTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCWlmKCFwc0FkYXB0ZXItPnR4Y3RscGFja2V0W2ldKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5vIE1vcmUgQ250bCBwa3RzIGdvdCwgbWF4IGdvdCBpcyAlZCIsIGkpOwpAQCAtMTE3LDcgKzExNCw3IEBACiAKIFZPSUQgQWRhcHRlckZyZWUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCUlOVCBjb3VudCA9IDA7CisJaW50IGNvdW50OwogCiAJYmVjZWVtX3Byb3RvY29sX3Jlc2V0KEFkYXB0ZXIpOwogCkBAIC0xMjUsNzIgKzEyMiw2NiBAQAogCiAJaWYoQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlciAmJiAhSVNfRVJSKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpKQogCSAgCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CisKIAlpZihBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkICYmICFJU19FUlIoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCkpCi0gICAgCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCk7Ci0gICAgd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUpOworCQlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpOworCisJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUpOworCiAJaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiAoQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSB8IEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfSU5BQ1RJVkVMWSkpCiAJCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+TEVESW5mby5sZWRfY250cmxfdGhyZWFkaWQpOwotCWJjbV91bnJlZ2lzdGVyX25ldHdvcmtkZXYoQWRhcHRlcik7CisKKwl1bnJlZ2lzdGVyX25ldHdvcmtkZXYoQWRhcHRlcik7CisKKwkvKiBGSVhNRTogdXNlIHByb3BlciB3YWl0X2V2ZW50IGFuZCByZWZjb3VudGluZyAqLwogCXdoaWxlKGF0b21pY19yZWFkKCZBZGFwdGVyLT5BcHBsaWNhdGlvblJ1bm5pbmcpKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiV2FpdGluZyBmb3IgQXBwbGljYXRpb24gdG8gY2xvc2UuLiAlZFxuIixhdG9taWNfcmVhZCgmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKSk7CiAJCW1zbGVlcCgxMDApOwogCX0KIAl1bnJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShBZGFwdGVyKTsKLQlpZihBZGFwdGVyLT5kZXYgJiYgIUlTX0VSUihBZGFwdGVyLT5kZXYpKQotCQlmcmVlX25ldGRldihBZGFwdGVyLT5kZXYpOwotCWlmKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zICE9IE5VTEwpCi0JewotCQliY21fa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwotCX0KKworCWtmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKKwogCWZvciAoY291bnQgPTA7Y291bnQgPCBNQVhfQ05UUkxfUEtUUztjb3VudCsrKQotCXsKLQkJaWYoQWRhcHRlci0+dHhjdGxwYWNrZXRbY291bnRdKQotCQkJYmNtX2tmcmVlKEFkYXB0ZXItPnR4Y3RscGFja2V0W2NvdW50XSk7Ci0JfQorCQlrZnJlZShBZGFwdGVyLT50eGN0bHBhY2tldFtjb3VudF0pOworCiAJRnJlZUFkYXB0ZXJEc3hCdWZmZXIoQWRhcHRlcik7Ci0JaWYoQWRhcHRlci0+cHZPc0RlcERhdGEpCi0JCWJjbV9rZnJlZSAoQWRhcHRlci0+cHZPc0RlcERhdGEpOwotCWlmKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcik7CisKKwlrZnJlZShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOwogCiAJLy9GcmVlIHRoZSBQSFMgSW50ZXJmYWNlCiAJUGhzQ2xlYW51cCgmQWRhcHRlci0+c3RCQ01QaHNDb250ZXh0KTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCUJjbURlQWxsb2NGbGFzaENTU3RydWN0dXJlKEFkYXB0ZXIpOwotI2VuZGlmCiAKLQliY21fa2ZyZWUgKEFkYXB0ZXIpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIjw9PT09PT09PVxuIik7CisJZnJlZV9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKIH0KIAotCi1pbnQgY3JlYXRlX3dvcmtlcl90aHJlYWRzKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQorc3RhdGljIGludCBjcmVhdGVfd29ya2VyX3RocmVhZHMoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpCiB7Ci0JQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJJbml0IFRocmVhZHMuLi4iKTsKIAkvLyBSeCBDb250cm9sIFBhY2tldHMgUHJvY2Vzc2luZwogCXBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlciA9IGt0aHJlYWRfcnVuKChpbnQgKCopKHZvaWQgKikpCi0JCQljb250cm9sX3BhY2tldF9oYW5kbGVyLCBwc0FkYXB0ZXIsICJDdHJsUGt0SGRsciIpOworCQkJCQkJCWNvbnRyb2xfcGFja2V0X2hhbmRsZXIsIHBzQWRhcHRlciwgIiVzLXJ4IiwgRFJWX05BTUUpOwogCWlmKElTX0VSUihwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJObyBLZXJuZWwgVGhyZWFkLCBidXQgc3RpbGwgcmV0dXJuaW5nIHN1Y2Nlc3NcbiIpOworCQlwcl9ub3RpY2UoRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0ZSBjb250cm9sIHRocmVhZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKHBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CiAJfQorCiAJLy8gVHggVGhyZWFkCiAJcHNBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0ga3RocmVhZF9ydW4oKGludCAoKikodm9pZCAqKSkKLQkJdHhfcGt0X2hhbmRsZXIsIHBzQWRhcHRlciwgIlR4UGt0VGhyZWFkIik7CisJCQkJCQkJdHhfcGt0X2hhbmRsZXIsIHBzQWRhcHRlciwgIiVzLXR4IiwgRFJWX05BTUUpOwogCWlmKElTX0VSUiAocHNBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gS2VybmVsIFRocmVhZCwgYnV0IHN0aWxsIHJldHVybmluZyBzdWNjZXNzIik7CisJCXByX25vdGljZShEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXQgdHJhbnNtaXQgdGhyZWFkXG4iKTsKIAkJa3RocmVhZF9zdG9wKHBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CiAJCXJldHVybiBQVFJfRVJSKHBzQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCk7CiAJfQogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZpbGUgKm9wZW5fZmlybXdhcmVfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNoYXIgKnBhdGgpCitzdGF0aWMgc3RydWN0IGZpbGUgKm9wZW5fZmlybXdhcmVfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAgICAgc3RydWN0IGZpbGUgICAgICAgICAgICAgKmZscD1OVUxMOwogICAgIG1tX3NlZ21lbnRfdCAgICAgICAgb2xkZnM7CkBAIC0yMDAsMjYgKzE5MSwyMCBAQAogICAgIHNldF9mcyhvbGRmcyk7CiAgICAgaWYoSVNfRVJSKGZscCkpCiAgICAgewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJVbmFibGUgVG8gT3BlbiBGaWxlICVzLCBlcnIgICVseCIsCi0JCQkJcGF0aCwgUFRSX0VSUihmbHApKTsKLQkJZmxwID0gTlVMTDsKKwkgICAgcHJfZXJyKERSVl9OQU1FICJVbmFibGUgVG8gT3BlbiBGaWxlICVzLCBlcnIgJWxkIiwKKwkJICAgcGF0aCwgUFRSX0VSUihmbHApKTsKKwkgICAgZmxwID0gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiR290IGZpbGUgZGVzY3JpcHRvciBwb2ludGVyIG9mICVzISIsCi0JCQlwYXRoKTsKLSAgICB9Ci0JaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCi0JewotCQlmbHAgPSBOVUxMOwotCX0KKworICAgIGlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQorCSAgICBmbHAgPSBOVUxMOwogCiAgICAgcmV0dXJuIGZscDsKIH0KIAogCi1pbnQgQmNtRmlsZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8IExvZ2ljYWwgQWRhcHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aCwgICAgIC8qKjwgcGF0aCB0byBpbWFnZSBmaWxlICovCitzdGF0aWMgaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPCBMb2dpY2FsIEFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsICAgICAvKio8IHBhdGggdG8gaW1hZ2UgZmlsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyAgICAvKio8IERvd25sb2FkIEFkZHJlc3Mgb24gdGhlIGNoaXAqLwogICAgICAgICAgICAgICAgICAgICAgICAgKQogewpAQCAtMjQ4LDkgKzIzMyw3IEBACiAgICAgICAgIGdvdG8gZXhpdF9kb3dubG9hZDsKICAgICB9CiAgICAgb2xkZnM9Z2V0X2ZzKCk7c2V0X2ZzKGdldF9kcygpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCiAgICAgdmZzX2xsc2VlayhmbHAsIDAsIDApOwotI2VuZGlmCiAgICAgc2V0X2ZzKG9sZGZzKTsKICAgICBpZihBZGFwdGVyLT5iY21fZmlsZV9yZWFkYmFja19mcm9tX2NoaXAoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJCQkJCQkJCWZscCwgbG9jKSkKQEAgLTI2NSwzMSArMjQ4LDEwIEBACiAJaWYoZmxwICYmICEoSVNfRVJSKGZscCkpKQogICAgIAlmaWxwX2Nsb3NlKGZscCwgY3VycmVudC0+ZmlsZXMpOwogICAgIHNldF9mcyhvbGRmcyk7Ci0gICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0gICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiZmlsZSBkb3dubG9hZCBkb25lIGF0ICVseCIsICgodHYudHZfc2VjICogMTAwMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0di50dl91c2VjLzEwMDApKSk7CisKICAgICByZXR1cm4gZXJyb3JubzsKIH0KIAotCi12b2lkIGJjbV9rZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpZihza2IpCi0gICAgewotICAgIAlrZnJlZV9za2Ioc2tiKTsKLSAgICB9Ci0Jc2tiID0gTlVMTCA7Ci19Ci0KLVZPSUQgYmNtX2tmcmVlKFZPSUQgKnB0cikKLXsKLQlpZihwdHIpCi0JewotCQlrZnJlZShwdHIpOwotCX0KLQlwdHIgPSBOVUxMIDsKLX0KLQogLyoqCiBAaW5ncm91cCBjdHJsX3BrdF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjb250ZW50cyBvZiBnaXZlbiBidWZmZXIKQEAgLTM5NSwxMyArMzU3LDYgQEAKIAkJCS8qU2V0dGluZyBiSWRsZU1vZGVfdHhfZnJvbV9ob3N0IHRvIFRSVUUgdG8gaW5kaWNhdGUgTEVEIGNvbnRyb2wgdGhyZWFkIHRvIHJlcHJlc2VudAogCQkJICB0aGUgd2FrZSB1cCBmcm9tIGlkbGVtb2RlIGlzIGZyb20gaG9zdCovCiAJCQkvL0FkYXB0ZXItPkxFREluZm8uYklkbGVNb2RlX3R4X2Zyb21faG9zdCA9IFRSVUU7Ci0jaWYgMAotCQkJaWYoU1RBVFVTX1NVQ0NFU1MgIT0gSW50ZXJmYWNlSWRsZU1vZGVXYWtldXAoQWRhcHRlcikpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJZGxlIE1vZGUgV2FrZSB1cCBGYWlsZWRcbiIpOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLSNlbmRpZgogCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7CiAJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKIApAQCAtNDg5LDkgKzQ0NCw2IEBACiAJCWF0b21pY19pbmMoJkFkYXB0ZXItPmluZGV4X3dyX3R4Y250cmxwa3QpOwogCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJDYWxsaW5nIHRyYW5zbWl0X3BhY2tldHMiKTsKIAkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQoKTsKLSNlbmRpZgogCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJfQogCWVsc2UKQEAgLTUzMCwxOCArNDgyLDYgQEAKICNlbmRpZgogCiAKLXZvaWQgU2VuZExpbmtEb3duKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQlMSU5LX1JFUVVFU1QJc3RMaW5rRG93blJlcXVlc3Q7Ci0JbWVtc2V0KCZzdExpbmtEb3duUmVxdWVzdCwgMCwgc2l6ZW9mKExJTktfUkVRVUVTVCkpOwotCXN0TGlua0Rvd25SZXF1ZXN0LkxlYWRlci5TdGF0dXM9TElOS19VUF9DT05UUk9MX1JFUTsKLQlzdExpbmtEb3duUmVxdWVzdC5MZWFkZXIuUExlbmd0aD1zaXplb2YoVUxPTkcpOy8vbWluaW11bSA0IGJ5dGVzCi0Jc3RMaW5rRG93blJlcXVlc3Quc3pEYXRhWzBdPUxJTktfRE9XTl9SRVFfUEFZTE9BRDsKLQlBZGFwdGVyLT5iTGlua0Rvd25SZXF1ZXN0ZWQgPSBUUlVFOwotCi0JQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCZzdExpbmtEb3duUmVxdWVzdCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gICAgLSBMaW5rTWVzc2FnZSgpCiAqCkBAIC01NTIsNyArNDkyLDcgQEAKICoKICogUmV0dXJucyAgICAgLSBOb25lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIFZPSUQgTGlua01lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorVk9JRCBMaW5rTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJUExJTktfUkVRVUVTVAlwc3RMaW5rUmVxdWVzdD1OVUxMOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiPT09PT0+Iik7CkBAIC01OTQsNyArNTM0LDcgQEAKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiQ2FsbGluZyBDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0Iik7CiAJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgcHN0TGlua1JlcXVlc3QpOwotCQliY21fa2ZyZWUocHN0TGlua1JlcXVlc3QpOworCQlrZnJlZShwc3RMaW5rUmVxdWVzdCk7CiAJfQogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiTGlua01lc3NhZ2UgPD09PT09Iik7CiAJcmV0dXJuOwpAQCAtNjE0LDggKzU1NCw4IEBACiBWT0lEIFN0YXRpc3RpY3NSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIpCiB7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiJXM9PT09PiIsX19GVU5DVElPTl9fKTsKLQlBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlciA9IG50b2hsKCooUFVMT05HKXB2QnVmZmVyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTdGF0cyBhdCAlbHgiLCBBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlcik7CisJQWRhcHRlci0+U3RhdGlzdGljc1BvaW50ZXIgPSBudG9obCgqKF9fYmUzMiAqKXB2QnVmZmVyKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTdGF0cyBhdCAleCIsIChVSU5UKUFkYXB0ZXItPlN0YXRpc3RpY3NQb2ludGVyKTsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIlcyA8PT09PSIsX19GVU5DVElPTl9fKTsKIAlyZXR1cm47CiB9CkBAIC03NjQsNyArNzA0LDcgQEAKIAogCQkJLyogV2FrZSB0aGUgTEVEIFRocmVhZCB3aXRoIElETEVNT0RFX0VOVEVSIFN0YXRlICovCiAJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExPV1BPV0VSX01PREVfRU5URVI7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZCBpcyBSdW5uaW5nLi5IZW5jZSBTZXR0aW5nIExFRCBFdmVudCBhcyBJRExFTU9ERV9FTlRFUiBqaWZmaWVzOiVsZCIsamlmZmllcyk7OworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQgaXMgUnVubmluZy4uSGVuY2UgU2V0dGluZyBMRUQgRXZlbnQgYXMgSURMRU1PREVfRU5URVIgamlmZmllczolbGQiLGppZmZpZXMpOwogCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAogCQkJLyogV2FpdCBmb3IgMSBTRUMgZm9yIExFRCB0byBPRkYgKi8KQEAgLTc4NywxMiArNzI3LDEwIEBACiAJCQlkb3duKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKIAkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBUUlVFOwogCQkJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQkJLy9LaWxsaW5nIGFsbCBVUkJTLgogCQkJaWYoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7CiAKLSNlbmRpZgogCQl9CiAJCWVsc2UKIAkJewpAQCAtODExLDkgKzc0OSw3IEBACiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImZhaWwgdG8gc2VuZCB0aGUgSWRsZSBtb2RlIFJlcXVlc3QgXG4iKTsKIAkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQlTdGFydEludGVycnVwdFVyYigoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpOwotI2VuZGlmCiAJfQogCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgTXNnIHN1Ym1pdHRlciB0byBRIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKQEAgLTk4MCwxMiArOTE2LDEwIEBACiAKIH0KIAotCi1fX2lubGluZSBpbnQgcmVzZXRfY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcikKK2ludCByZXNldF9jYXJkX3Byb2MoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyKQogewogCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKIAlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwLCB1aVJlc2V0VmFsdWUgPSAwOwpAQCAtMTAwNiwxMSArOTQwLDkgQEAKIAkJd3JtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAJfQogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJLy9raWxsaW5nIGFsbCBzdWJtaXR0ZWQgVVJCcy4KIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gVFJVRSA7CiAJQmNtX2tpbGxfYWxsX1VSQnMocHNJbnRmQWRhcHRlcik7Ci0jZW5kaWYKIAkvKiBSZXNldCB0aGUgVU1BLUIgRGV2aWNlICovCiAJaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKIAl7CkBAIC0xMTExLDExICsxMDQzLDEwIEBACiAKIGVycl9leGl0IDoKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gRkFMU0UgOwotI2VuZGlmCiAJcmV0dXJuIHJldHZhbDsKIH0KIAotX19pbmxpbmUgaW50IHJ1bl9jYXJkX3Byb2MoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyICkKK2ludCBydW5fY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlciApCiB7CiAJdW5zaWduZWQgaW50IHZhbHVlPTA7CiAJewpAQCAtMTE0NiwyMSArMTA3NywxNyBAQAogaW50IEluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZShQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpCiB7CiAKLQlVSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCWludCBzdGF0dXM7CiAJVUlOVCB2YWx1ZSA9IDA7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQl1bnNpZ25lZCBjaGFyICpwQ29uZmlnRmlsZUFkZHIgPSAodW5zaWduZWQgY2hhciAqKUNQRV9NQUNYVklfQ0ZHX0FERFI7Ci0jZW5kaWYKIAkvKgogIAkgKiBDcmVhdGUgdGhlIHRocmVhZHMgZmlyc3QgYW5kIHRoZW4gZG93bmxvYWQgdGhlCiAgCSAqIEZpcm0vRERSIFNldHRpbmdzLi4KICAJICovCiAKLQlpZigoc3RhdHVzID0gY3JlYXRlX3dvcmtlcl90aHJlYWRzKHBzX2FkYXB0ZXIpKTwwKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQ2Fubm90IGNyZWF0ZSB0aHJlYWQiKTsKKwlzdGF0dXMgPSBjcmVhdGVfd29ya2VyX3RocmVhZHMocHNfYWRhcHRlcik7CisJaWYgKHN0YXR1czwwKQogCQlyZXR1cm4gc3RhdHVzOwotCX0KKwogCS8qCiAgCSAqIEZvciBEb3dubG9hZGluZyB0aGUgRmlybSwgcGFyc2UgdGhlIGNmZyBmaWxlIGZpcnN0LgogIAkgKi8KQEAgLTExNjksNyArMTA5Niw2IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKIAl7CiAJCXJkbWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdmFsdWUsIHNpemVvZiAodmFsdWUpKTsKQEAgLTExODcsNyArMTExMyw3IEBACiAJc3RhdHVzID0gZGRyX2luaXQocHNfYWRhcHRlcik7CiAJaWYoc3RhdHVzKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UIChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImRkcl9pbml0IEZhaWxlZFxuIik7CisJCXByX2VycihEUlZfTkFNRSAiZGRyX2luaXQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTEyMDEsNyArMTEyNyw2IEBACiAJCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkVycm9yIGRvd25sb2FkaW5nIENGRyBmaWxlIik7CiAJCWdvdG8gT1VUOwogCX0KLQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJDRkcgZmlsZSBkb3dubG9hZGVkIik7CiAKIAlpZihyZWdpc3Rlcl9uZXR3b3JrZGV2KHBzX2FkYXB0ZXIpKQogCXsKQEAgLTEyNjYsMTIgKzExOTEsNiBAQAogCQkJZ290byBPVVQ7CiAJCX0KIAl9Ci0jaWYgMAotCWVsc2UgaWYocHNBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NKQotCXsKLQkJUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUVFUFJPTVRvTWVtb3J5KCk7Ci0JfQotI2VuZGlmCiAKIAkvKiBEb3dubG9hZCBGaXJtYXJlICovCiAJaWYgKChzdGF0dXMgPSBCY21GaWxlRG93bmxvYWQoIHBzX2FkYXB0ZXIsIEJJTl9GSUxFLCBGSVJNV0FSRV9CRUdJTl9BRERSKSkpCkBAIC0xMjgwLDcgKzExOTksNiBAQAogCQlnb3RvIE9VVDsKIAl9CiAKLQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJCSU4gZmlsZSBkb3dubG9hZGVkIik7CiAJc3RhdHVzID0gcnVuX2NhcmRfcHJvYyhwc19hZGFwdGVyKTsKIAlpZihzdGF0dXMpCiAJewpAQCAtMTI5OSw2OCArMTIxNywxOSBAQAogCQl3YWtlX3VwKCZwc19hZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwogCX0KIAotI2Vsc2UKLQotCXBzX2FkYXB0ZXItPmJERFJJbml0RG9uZSA9IFRSVUU7Ci0JLy9Jbml0aWFsaXppbmcgdGhlIE5WTS4KLQlCY21Jbml0TlZNKHBzX2FkYXB0ZXIpOwotCi0JLy9Qcm9wYWdhdGluZyB0aGUgY2FsIHBhcmFtIGZyb20gRmxhc2ggdG8gRERSCi0JdmFsdWUgPSAwOwotCXdybWFsdChwc19hZGFwdGVyLCBFRVBST01fQ0FMX0RBVEFfSU5URVJOQUxfTE9DIC0gNCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQl3cm1hbHQocHNfYWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQyAtIDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQlpZihwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpCi0JewotCQlzdGF0dXMgPSBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRmxhc2hUb01lbW9yeShwc19hZGFwdGVyKTsKLQkJaWYoc3RhdHVzKQotCQl7Ci0JCQlwcmludGsoIlxuUHJvcG9nYXRpb24gb2YgQ2FsIHBhcmFtIGZyb20gZmxhc2ggdG8gRERSIGZhaWxlZCAuLlxuIiApOwotCQl9Ci0JfQotCi0JLy9Db3B5IGNvbmZpZyBmaWxlIHBhcmFtIHRvIEREUi4KLQltZW1jcHkocENvbmZpZ0ZpbGVBZGRyLHBzX2FkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLCBzaXplb2YoU1RBUkdFVFBBUkFNUykpOwotCi0JaWYocmVnaXN0ZXJfbmV0d29ya2Rldihwc19hZGFwdGVyKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIE5ldGRldmljZSBmYWlsZWQuIENsZWFudXAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQotCXN0YXR1cyA9IEluaXRMZWRTZXR0aW5ncyAocHNfYWRhcHRlcik7Ci0JaWYoc3RhdHVzKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJJTklUIExFRCBGQUlMRURcbiIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCi0JaWYocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzX2FkYXB0ZXIpIDwgMCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvbnRyb2wgRGV2aWNlIGZhaWxlZC4gQ2xlYW51cCBuZWVkcyB0byBiZSBwZXJmb3JtZWQuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXBzX2FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOwotI2VuZGlmCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogCi1pbnQgYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIGludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlleHRlcm4gdm9pZCByZWFkX2NmZ19maWxlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0jZW5kaWYKIAlzdHJ1Y3QgZmlsZSAJCSpmbHA9TlVMTDsKIAltbV9zZWdtZW50X3QgCW9sZGZzPXswfTsKLQljaGFyICpidWZmID0gTlVMTDsKKwljaGFyICpidWZmOwogCWludCBsZW4gPSAwOwogCWxvZmZfdAlwb3MgPSAwOwogCi0JYnVmZj0oUENIQVIpa21hbGxvYyhCVUZGRVJfMUssIEdGUF9LRVJORUwpOworCWJ1ZmY9a21hbGxvYyhCVUZGRVJfMUssIEdGUF9LRVJORUwpOwogCWlmKCFidWZmKQogCXsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzY4LDE0ICsxMjM3LDE0IEBACiAJaWYoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID0KIAkJa21hbGxvYyhzaXplb2YoU1RBUkdFVFBBUkFNUyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCXsKLQkJYmNtX2tmcmVlKGJ1ZmYpOworCQlrZnJlZShidWZmKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWZscD1vcGVuX2Zpcm13YXJlX2ZpbGUoQWRhcHRlciwgQ0ZHX0ZJTEUpOwogCWlmKCFmbHApIHsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTk9UIEFCTEUgVE8gT1BFTiBUSEUgJXMgRklMRSBcbiIsIENGR19GSUxFKTsKLQkJYmNtX2tmcmVlKGJ1ZmYpOwotCQliY21fa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOworCQlrZnJlZShidWZmKTsKKwkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KQEAgLTEzODYsOCArMTI1NSw4IEBACiAJaWYobGVuICE9IHNpemVvZihTVEFSR0VUUEFSQU1TKSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiTWlzbWF0Y2ggaW4gVGFyZ2V0IFBhcmFtIFN0cnVjdHVyZSFcbiIpOwotCQliY21fa2ZyZWUoYnVmZik7Ci0JCWJjbV9rZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CisJCWtmcmVlKGJ1ZmYpOworCQlrZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CiAJCUFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID0gTlVMTDsKIAkJZmlscF9jbG9zZShmbHAsIGN1cnJlbnQtPmZpbGVzKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xMzk5LDM3ICsxMjY4LDM0IEBACiAJICogVmFsdWVzIGluIEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKIAkgKi8KIAltZW1jcHkoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMsIGJ1ZmYsIHNpemVvZihTVEFSR0VUUEFSQU1TKSk7Ci0JYmNtX2tmcmVlIChidWZmKTsKKwlrZnJlZSAoYnVmZik7CiAJYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoQWRhcHRlcik7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlyZWFkX2NmZ19maWxlKEFkYXB0ZXIpOwotCi0jZW5kaWYKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHZvaWQgYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCVVJTlQgdWlIb3N0RHJ2ckNmZzYgPTAsIHVpRUVQUk9NRmxhZyA9IDA7OworCVVJTlQgdWlIb3N0RHJ2ckNmZzYgPTAsIHVpRUVQUk9NRmxhZyA9IDA7CiAKIAlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIyKSAmIEFVVE9fU1lOQ19ESVNBQkxFKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQXV0b1N5bmN1cCBpcyBEaXNhYmxlZFxuIik7CisJCXByX2luZm8oRFJWX05BTUUgIjogQXV0b1N5bmN1cCBpcyBEaXNhYmxlZFxuIik7CiAJCUFkYXB0ZXItPkF1dG9TeW5jdXAgPSBGQUxTRTsKIAl9CiAJZWxzZQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQXV0b1N5bmN1cCBpcyBFbmFibGVkXG4iKTsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiBBdXRvU3luY3VwIGlzIEVuYWJsZWRcbiIpOwogCQlBZGFwdGVyLT5BdXRvU3luY3VwCT0gVFJVRTsKIAl9CisKIAlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fTElOS1VQX0VOQUJMRSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkVuYWJsaW5nIGF1dG9saW5rIHVwIik7CisJCXByX2luZm8oRFJWX05BTUUgIjogRW5hYmxpbmcgYXV0b2xpbmsgdXAiKTsKIAkJQWRhcHRlci0+QXV0b0xpbmtVcCA9IFRSVUU7CiAJfQogCWVsc2UKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkRpc2FibGluZyBhdXRvbGluayB1cCIpOworCQlwcl9pbmZvKERSVl9OQU1FICI6IERpc2FibGluZyBhdXRvbGluayB1cCIpOwogCQlBZGFwdGVyLT5BdXRvTGlua1VwID0gRkFMU0U7CiAJfQogCS8vIFNldHRpbmcgdGhlIEREUiBTZXR0aW5nLi4KQEAgLTE0MzgsNTkgKzEzMDQsNTQgQEAKIAlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPQogCQkJKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpPj4xMikmMHgwRjsKIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsREJHX0xWTF9BTEwsICJQb3dlciBTYXZlIE1vZGU6ICVseFxuIiwKLQkJCQkJCQlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUpOworCXByX2luZm8oRFJWX05BTUUgIjogRERSIFNldHRpbmc6ICV4XG4iLCBBZGFwdGVyLT5ERFJTZXR0aW5nKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IFBvd2VyIFNhdmUgTW9kZTogJWx4XG4iLCBBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUpOwogCWlmKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpICYgQVVUT19GSVJNX0RPV05MT0FEKQogICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRW5hYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CisgICAgICAgIHByX2luZm8oRFJWX05BTUUgIjogRW5hYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CiAgICAgICAgIEFkYXB0ZXItPkF1dG9GaXJtRGxkID0gVFJVRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRGlzYWJsaW5nIEF1dG8gRmlybXdhcmUgRG93bmxvYWRcbiIpOworICAgICAgICBwcl9pbmZvKERSVl9OQU1FICI6IERpc2FibGluZyBBdXRvIEZpcm13YXJlIERvd25sb2FkXG4iKTsKICAgICAgICAgQWRhcHRlci0+QXV0b0Zpcm1EbGQgPSBGQUxTRTsKICAgICB9CiAJdWlIb3N0RHJ2ckNmZzYgPSBudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KTsKIAlBZGFwdGVyLT5iTWlwc0NvbmZpZyA9ICh1aUhvc3REcnZyQ2ZnNj4+MjApJjB4MDE7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJNSVBTQ29uZmlnICAgOiAweCVYXG4iLEFkYXB0ZXItPmJNaXBzQ29uZmlnKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IE1JUFNDb25maWcgICA6IDB4JVhcbiIsQWRhcHRlci0+Yk1pcHNDb25maWcpOwogCS8vdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIAlBZGFwdGVyLT5iRFBMTENvbmZpZyA9ICh1aUhvc3REcnZyQ2ZnNj4+MTkpJjB4MDE7CiAKIAlBZGFwdGVyLT5QbXVNb2RlPSAodWlIb3N0RHJ2ckNmZzYgPj4gMjQgKSAmIDB4MDM7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiUE1VIE1PREU6ICV4IiwgQWRhcHRlci0+UG11TW9kZSk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiBQTVUgTU9ERTogJXgiLCBBZGFwdGVyLT5QbXVNb2RlKTsKIAogICAgIGlmKCh1aUhvc3REcnZyQ2ZnNiA+PiBIT1NUX0JVU19TVVNQRU5EX0JJVCApICYgKDB4MDEpKQogICAgIHsKICAgICAgICAgQWRhcHRlci0+YkRvU3VzcGVuZCA9IFRSVUU7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1ha2luZyBEb1N1c3BlbmQgVFJVRSBhcyBwZXIgY29uZmlnRmlsZSIpOworICAgICAgICBwcl9pbmZvKERSVl9OQU1FICI6IE1ha2luZyBEb1N1c3BlbmQgVFJVRSBhcyBwZXIgY29uZmlnRmlsZSIpOwogICAgIH0KIAogCXVpRUVQUk9NRmxhZyA9IG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVFUFJPTUZsYWcpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInVpRUVQUk9NRmxhZyAgOiAweCVYXG4iLHVpRUVQUk9NRmxhZyk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiB1aUVFUFJPTUZsYWcgIDogMHglWFxuIix1aUVFUFJPTUZsYWcpOwogCUFkYXB0ZXItPmVOVk1UeXBlID0gKE5WTV9UWVBFKSgodWlFRVBST01GbGFnPj40KSYweDMpOwogCi0KIAlBZGFwdGVyLT5iU3RhdHVzV3JpdGUgPSAodWlFRVBST01GbGFnPj42KSYweDE7Ci0JLy9wcmludGsoKCJiU3RhdHVzV3JpdGUgICA6IDB4JVhcbiIsIEFkYXB0ZXItPmJTdGF0dXNXcml0ZSkpOwogCiAJQWRhcHRlci0+dWlTZWN0b3JTaXplSW5DRkcgPSAxMDI0KigweEZGRkYgJiBudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc0KSk7Ci0JLy9wcmludGsoKCJ1aVNlY3RvclNpemUgICA6IDB4JVhcbiIsIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZUluQ0ZHKSk7CiAKIAlBZGFwdGVyLT5iU2VjdG9yU2l6ZU92ZXJyaWRlID0oYm9vbCkgKChudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc0KSk+PjE2KSYweDE7Ci0JLy9wcmludGsoTVBfSU5JVCwoImJTZWN0b3JTaXplT3ZlcnJpZGUgICA6IDB4JVhcbiIsQWRhcHRlci0+YlNlY3RvclNpemVPdmVycmlkZSkpOwogCiAJaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJjB4MDEpCiAJCUFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QUk9UT0NPTF9JRExFX01PREU7Ci0JLy9hdXRvY29ycmVjdGlvbiBwYXJ0CisKIAlpZihBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgIT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BST1RPQ09MX0lETEVfTU9ERSkKIAkJZG9Qb3dlckF1dG9Db3JyZWN0aW9uKEFkYXB0ZXIpOwogCiB9CiAKLVZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQorc3RhdGljIFZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQogewotCVVJTlQgcmVwb3J0aW5nX21vZGUgPSAwOworCVVJTlQgcmVwb3J0aW5nX21vZGU7CiAKIAlyZXBvcnRpbmdfbW9kZSA9IG50b2hsKHBzQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJjB4MDIgOwogCXBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkID0gISgoY2hhcikocHNBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPj4gMykgJiAweDEpOwpAQCAtMTUwNCwyMCArMTM2NSw5IEBACiAJaWYgKHBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkICYmIChwc0FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpKQogCXsKIAkJLy9JZiByZXBvcnRpbmcgbW9kZSBpcyBlbmFibGUsIHN3aXRjaCBQTVUgdG8gUE1DCi0JCSNpZiAwCi0JCWlmKHJlcG9ydGluZ19tb2RlID09IEZBTFNFKQotCQl7Ci0JCQlwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QTVVfU0hVVERPV047Ci0JCQlwc0FkYXB0ZXItPmJEb1N1c3BlbmQgPSBUUlVFOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIlBNVSBzZWxlY3RlZCAuLi4uIik7Ci0KLQkJfQotCQllbHNlCi0JCSNlbmRpZgogCQl7CiAJCQlwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QTVVfQ0xPQ0tfR0FUSU5HOwogCQkJcHNBZGFwdGVyLT5iRG9TdXNwZW5kID1GQUxTRTsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJQTUMgc2VsZWN0ZWQuLiIpOwogCiAJCX0KIApAQCAtMTU0MCwxMiArMTM5MCwxMCBAQAogI2lmIDAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpSZWFkTWFjQWRkckVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVsb25nIGR3QWRkcmVzcykKIHsKLQl1bnNpZ25lZCBjaGFyICpwdWNtYWNhZGRyID0gTlVMTDsKLQlpbnQgc3RhdHVzID0gMCwgaT0wOwotCXVuc2lnbmVkIGludCB0ZW1wID0wOworCWludCBzdGF0dXMgPSAwLCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgdGVtcCA9IDA7CisJdW5zaWduZWQgY2hhciAqcHVjbWFjYWRkciA9IGttYWxsb2MoTUFDX0FERFJFU1NfU0laRSwgR0ZQX0tFUk5FTCk7CiAKLQotCXB1Y21hY2FkZHIgPSAodW5zaWduZWQgY2hhciAqKWttYWxsb2MoTUFDX0FERFJFU1NfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYoIXB1Y21hY2FkZHIpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJObyBCdWZmZXJzIHRvIFJlYWQgdGhlIEVFUFJPTSBBZGRyZXNzXG4iKTsKQEAgLTE1NTgsNyArMTQwNiw3IEBACiAJaWYoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAid3JtIEZhaWxlZC4uXG4iKTsKLQkJYmNtX2tmcmVlKHB1Y21hY2FkZHIpOworCQlrZnJlZShwdWNtYWNhZGRyKTsKIAkJcHVjbWFjYWRkciA9IE5VTEw7CiAJCWdvdG8gT1VUOwogCX0KQEAgLTE1NjgsNyArMTQxNiw3IEBACiAJCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAkJewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmRtIEZhaWxlZC4uXG4iKTsKLQkJCWJjbV9rZnJlZShwdWNtYWNhZGRyKTsKKwkJCWtmcmVlKHB1Y21hY2FkZHIpOwogCQkJcHVjbWFjYWRkciA9IE5VTEw7CiAJCQlnb3RvIE9VVDsKIAkJfQpAQCAtMTU4MCw0MyArMTQyOCw2IEBACiB9CiAjZW5kaWYKIAotI2lmIDAKLUlOVCBSZWFkTWFjQWRkcmVzc0Zyb21FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCXVuc2lnbmVkIGNoYXIgKnB1TWFjQWRkciA9IE5VTEw7Ci0JaW50IGkgPTA7Ci0KLQlwdU1hY0FkZHIgPSBSZWFkTWFjQWRkckVFUFJPTShBZGFwdGVyLDB4MjAwKTsKLQlpZighcHVNYWNBZGRyKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJDb3VsZG4ndCByZXRyaWV2ZSB0aGUgTWFjIEFkZHJlc3NcbiIpOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKChwdU1hY0FkZHJbMF0gPT0gMHgwICAmJiBwdU1hY0FkZHJbMV0gPT0gMHgwICAmJgotCQkJcHVNYWNBZGRyWzJdID09IDB4MCAgJiYgcHVNYWNBZGRyWzNdID09IDB4MCAgJiYKLQkJCXB1TWFjQWRkcls0XSA9PSAweDAgICYmIHB1TWFjQWRkcls1XSA9PSAweDApIHx8Ci0JCSAgIChwdU1hY0FkZHJbMF0gPT0gMHhGRiAmJiBwdU1hY0FkZHJbMV0gPT0gMHhGRiAmJgotCQkJcHVNYWNBZGRyWzJdID09IDB4RkYgJiYgcHVNYWNBZGRyWzNdID09IDB4RkYgJiYKLQkJCXB1TWFjQWRkcls0XSA9PSAweEZGICYmIHB1TWFjQWRkcls1XSA9PSAweEZGKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJbnZhbGlkIE1hYyBBZGRyZXNzXG4iKTsKLQkJCWJjbV9rZnJlZShwdU1hY0FkZHIpOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVGhlIE1hYyBBZGRyZXNzIHJlY2VpdmVkIGlzOiBcbiIpOwotCQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKLSAgICAgICAgZm9yKGk9MDtpPE1BQ19BRERSRVNTX1NJWkU7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiUwMnggIiwgQWRhcHRlci0+ZGV2LT5kZXZfYWRkcltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJcbiIpOwotCQliY21fa2ZyZWUocHVNYWNBZGRyKTsKLQl9Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRFbmRpYW4oQl9VSU5UOCByd0ZsYWcsIFBVSU5UIHB1aUJ1ZmZlciwgVUlOVCB1aUJ5dGVDb3VudCkKIHsKQEAgLTE2NDAsODEgKzE0NTEsMjEgQEAKIHsKIAlJTlQgdWlSZXRWYWwgPTA7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAl1aVJldFZhbCA9IEFkYXB0ZXItPmludGVyZmFjZV9yZG0oQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJdWlBZGRyZXNzLCBwdWNCdWZmLCBzU2l6ZSk7CiAKIAlpZih1aVJldFZhbCA8IDApCiAJCXJldHVybiB1aVJldFZhbDsKIAotI2Vsc2UKLQlpbnQgaW5keDsKLQl1aVJldFZhbCA9IFNUQVRVU19TVUNDRVNTOwotCWlmKHVpQWRkcmVzcyAmIDB4MTAwMDAwMDApIHsKLQkJCS8vIEREUiBNZW1vcnkgQWNjZXNzCi0JCXVpQWRkcmVzcyB8PSBDQUNIRV9BRERSRVNTX01BU0s7Ci0JCW1lbWNweShwdWNCdWZmLCh1bnNpZ25lZCBjaGFyICopdWlBZGRyZXNzICxzU2l6ZSk7Ci0JfQotCWVsc2UgewotCQkvLyBSZWdpc3RlciwgU1BSQU0sIEZsYXNoCi0JCXVpQWRkcmVzcyB8PSBVTkNBQ0hFX0FERFJFU1NfTUFTSzsKLSAgICBpZiAoKHVpQWRkcmVzcyAmIEZMQVNIX0FERFJfTUFTSykgPT0gKEZMQVNIX0NPTlRJR0lPVVNfU1RBUlRfQUREUl9CQ1MzNTAgJiBGTEFTSF9BRERSX01BU0spKQotCXsKLQkJI2lmIGRlZmluZWQoRkxBU0hfRElSRUNUX0FDQ0VTUykKLSAgICAgICAgCW1lbWNweShwdWNCdWZmLCh1bnNpZ25lZCBjaGFyICopdWlBZGRyZXNzICxzU2l6ZSk7Ci0JCSNlbHNlCi0JCQlwcmludGsoIlxuSW52YWxpZCBHU1BJIEFDQ0VTUyA6QWRkciA6JSNYIiwgdWlBZGRyZXNzKTsKLQkJCXVpUmV0VmFsID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCSNlbmRpZgotCX0KLSAgICBlbHNlIGlmKCgodW5zaWduZWQgaW50ICl1aUFkZHJlc3MgJiAweDMpIHx8Ci0JCQkoKHVuc2lnbmVkIGludCApcHVjQnVmZiAmIDB4MykgfHwKLQkJCSgodW5zaWduZWQgaW50IClzU2l6ZSAmIDB4MykpIHsKLQkJICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJyZG1hbHQgOnVuYWxsaWduZWQgcmVnaXN0ZXIgYWNjZXNzIHVpQWRkcmVzcyA9ICAleCxwdWNCdWZmID0gJXggIHNpemUgPSAleFxuIiwodW5zaWduZWQgaW50ICl1aUFkZHJlc3MsKHVuc2lnbmVkIGludCApcHVjQnVmZiwodW5zaWduZWQgaW50IClzU2l6ZSk7Ci0JCQkgdWlSZXRWYWwgPSBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCQllbHNlIHsKLQkJIAlmb3IgKGluZHg9MDtpbmR4PHNTaXplO2luZHgrPTQpewotCQkgICAJCSooUFVJTlQpKHB1Y0J1ZmYgKyBpbmR4KSA9ICooUFVJTlQpKHVpQWRkcmVzcyArIGluZHgpOwotCQkgIAl9Ci0JCX0KLQl9Ci0jZW5kaWYKIAlyZXR1cm4gdWlSZXRWYWw7CiB9CiBpbnQgd3JtKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKIHsKIAlpbnQgaVJldFZhbDsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCWlSZXRWYWwgPSBBZGFwdGVyLT5pbnRlcmZhY2Vfd3JtKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCXVpQWRkcmVzcywgcHVjQnVmZiwgc1NpemUpOwogCi0jZWxzZQotCWludCBpbmR4OwotCWlmKHVpQWRkcmVzcyAmIDB4MTAwMDAwMDApIHsKLQkJLy8gRERSIE1lbW9yeSBBY2Nlc3MKLQkJdWlBZGRyZXNzIHw9IENBQ0hFX0FERFJFU1NfTUFTSzsKLQkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHVpQWRkcmVzcykscHVjQnVmZixzU2l6ZSk7Ci0JfQotCWVsc2UgewotCQkvLyBSZWdpc3RlciwgU1BSQU0sIEZsYXNoCi0JCXVpQWRkcmVzcyB8PSBVTkNBQ0hFX0FERFJFU1NfTUFTSzsKLQotCQlpZigoKHVuc2lnbmVkIGludCApdWlBZGRyZXNzICYgMHgzKSB8fAotCQkJKCh1bnNpZ25lZCBpbnQgKXB1Y0J1ZmYgJiAweDMpIHx8Ci0JCQkoKHVuc2lnbmVkIGludCApc1NpemUgJiAweDMpKSB7Ci0JCSAgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIndybWFsdDogdW5hbGxpZ25lZCByZWdpc3RlciBhY2Nlc3MgdWlBZGRyZXNzID0gICV4LHB1Y0J1ZmYgPSAleCAgc2l6ZSA9ICV4XG4iLCh1bnNpZ25lZCBpbnQgKXVpQWRkcmVzcywodW5zaWduZWQgaW50IClwdWNCdWZmLCh1bnNpZ25lZCBpbnQgKXNTaXplKTsKLQkJCSBpUmV0VmFsID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAJZm9yIChpbmR4PTA7aW5keDxzU2l6ZTtpbmR4Kz00KSB7Ci0JCSAgCQkqKFBVSU5UKSh1aUFkZHJlc3MgKyBpbmR4KSA9ICooUFVJTlQpKHB1Y0J1ZmYgKyBpbmR4KTsKLQkJCX0KLQkJfQotCX0KLQlpUmV0VmFsID0gU1RBVFVTX1NVQ0NFU1M7Ci0jZW5kaWYKIAogCXJldHVybiBpUmV0VmFsOwogfQpAQCAtMTczNSwyNiArMTQ4Niw3IEBACiAJcmV0dXJuIHVpUmV0VmFsOwogfQogCi1pbnQgcmRtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNTaXplKQotewogCi0JSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQlkb3duKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKLQotCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCXsKLQkJc3RhdHVzID0gLUVBQ0NFUzsKLQkJZ290byBleGl0OwotCX0KLQotCXN0YXR1cyA9IHJkbShBZGFwdGVyLCB1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKLQotZXhpdDoKLQl1cCgmQWRhcHRlci0+cmRtd3Jtc3luYyk7Ci0JcmV0dXJuIHN0YXR1cyA7Ci19CiBpbnQgd3JtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNTaXplKQogewogCUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CkBAIC0xOTIxLDEwICsxNjUzLDggQEAKIAkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBUUlVFOwogCQkJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwogCQkJLy9LaWxsaW5nIGFsbCBVUkJTLgotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQkJaWYoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0jZW5kaWYKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE5NDMsMTQgKzE2NzMsMTIgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsImZhaWwgdG8gc2VuZCB0aGUgSWRsZSBtb2RlIFJlcXVlc3QgXG4iKTsKIAkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFOwogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJCVN0YXJ0SW50ZXJydXB0VXJiKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0jZW5kaWYKIAl9CiB9CiAKIAotdm9pZCBIYW5kbGVTaHV0RG93bk1vZGVSZXF1ZXN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjQnVmZmVyKQorc3RhdGljIHZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y0J1ZmZlcikKIHsKIAlCX1VJTlQzMiB1aVJlc2V0VmFsdWUgPSAwOwogCkBAIC0yMDc3LDExICsxODA1LDcgQEAKIAlpZighYXRvbWljX3JlYWQgKCZBZGFwdGVyLT51aU1CdXBkYXRlKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlpZihyZG1hbHQoQWRhcHRlciwgVEFSR0VUX1NGSURfVFhERVNDX01BUF9MT0MsIChQVUlOVCl1aWJ1ZmYsIHNpemVvZihVSU5UKSAqIE1BWF9UQVJHRVRfRFNYX0JVRkZFUlMpPDApCi0jZWxzZQogCWlmKHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIFRBUkdFVF9TRklEX1RYREVTQ19NQVBfTE9DLCAoUFVJTlQpdWlidWZmLCBzaXplb2YoVUlOVCkgKiBNQVhfVEFSR0VUX0RTWF9CVUZGRVJTKTwwKQotI2VuZGlmCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJyZG0gZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwpAQCAtMjEwNyw5ICsxODMxLDcgQEAKIHZvaWQgZmx1c2hfcXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIGlRSW5kZXgpCiB7CiAJc3RydWN0IHNrX2J1ZmYqIAkJCVBhY2tldFRvRHJvcD1OVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKgkJbmV0c3RhdHM9TlVMTDsKLQotCW5ldHN0YXRzID0gJigoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqCQluZXRzdGF0cyA9ICZBZGFwdGVyLT5kZXYtPnN0YXRzOwogCiAJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5TRlF1ZXVlTG9jayk7CiAKQEAgLTIxMzAsMjUgKzE4NTIsMjMgQEAKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLnVpRHJvcHBlZENvdW50Qnl0ZXMgKz0gUGFja2V0VG9Ecm9wLT5sZW47CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMrKzsKIAotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOwogCQkJYXRvbWljX2RlYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7Ci0JCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7Ci0KIAkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uU0ZRdWV1ZUxvY2spOwogCiB9CiAKLXZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZWNlZW1fcHJvdG9jb2xfcmVzZXQgKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlpbnQgaSA9MDsKKwlpbnQgaTsKIAotCWlmKE5VTEwgIT0gQWRhcHRlci0+ZGV2KQotCXsKLQkJbmV0aWZfY2Fycmllcl9vZmYoQWRhcHRlci0+ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCX0KKwlpZiAobmV0aWZfbXNnX2xpbmsoQWRhcHRlcikpCisJCXByX25vdGljZShQRlggIiVzOiBwcm90b2NvbCByZXNldFxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwogCiAJQWRhcHRlci0+SWRsZU1vZGUgPSBGQUxTRTsKIAlBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPSBGQUxTRTsKQEAgLTIxNjYsNzggKzE4ODYsMTggQEAKIAkJQWRhcHRlci0+VGltZXJBY3RpdmUgPSBGQUxTRTsKIAogCW1lbXNldChBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlLCAwLAotCQkJc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykgKgotCQkJTUFYX0ZSQUdNRU5URURJUF9DTEFTU0lGSUNBVElPTl9FTlRSSUVTKTsKKwkgICAgICAgc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykgKiBNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVMpOwogCiAJZm9yKGkgPSAwO2k8SGlQcmlvcml0eTtpKyspCiAJewogCQkvL3Jlc2V0dGluZyBvbmx5IHRoZSBmaXJzdCBzaXplIChTX01JQlNfU0VSVklDRUZMT1dfVEFCTEUpIGZvciB0aGUgU0YuCiAJCS8vIEl0IGlzIHNhbWUgYmV0d2VlbiBNSUJzIGFuZCBTRi4KLQkJbWVtc2V0KChQVk9JRCkmQWRhcHRlci0+UGFja0luZm9baV0sMCxzaXplb2YoU19NSUJTX1NFUlZJQ0VGTE9XX1RBQkxFKSk7CisJCW1lbXNldCgmQWRhcHRlci0+UGFja0luZm9baV0uc3RNaWJzRXh0U2VydmljZUZsb3dUYWJsZSwKKwkJICAgICAgIDAsIHNpemVvZihTX01JQlNfRVhUU0VSVklDRUZMT1dfUEFSQU1FVEVSUykpOwogCX0KIH0KIAogCiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCi0KLSNkZWZpbmUgR0VUX0dUQl9ESUZGKHN0YXJ0LCBlbmQpICBcCi0oIChzdGFydCkgPCAoZW5kKSApPyAoIChlbmQpIC0gKHN0YXJ0KSApIDogKCB+MHgwIC0gKCAoc3RhcnQpIC0gKGVuZCkpICsxICkKLQotdm9pZCB1c2RlbGF5ICggdW5zaWduZWQgaW50IGEpIHsKLQl1bnNpZ25lZCBpbnQgc3RhcnQ9ICoodW5zaWduZWQgaW50ICopMHhhZjgwNTFiNDsKLQl1bnNpZ25lZCBpbnQgZW5kICA9IHN0YXJ0KzE7Ci0JdW5zaWduZWQgaW50IGRpZmYgPSAwOwotCi0Jd2hpbGUoMSkgewotCQllbmQgPSAqKHVuc2lnbmVkIGludCAqKTB4YWY4MDUxYjQ7Ci0JCWRpZmYgPSAoR0VUX0dUQl9ESUZGKHN0YXJ0LGVuZCkpLzgwOwotCQlpZiAoZGlmZiA+PSBhKQotCQkJYnJlYWs7Ci0JfQotfQotdm9pZCByZWFkX2NmZ19maWxlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikgewotCi0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvbmZpZyBGaWxlIFZlcnNpb24gPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDZmdWZXJzaW9uICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDZW50ZXIgRnJlcXVlbmN5ID0gIDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkNlbnRlckZyZXF1ZW5jeSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQmFuZCBBIFNjYW4gPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJCYW5kQVNjYW4gKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbmQgQiBTY2FuID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQmFuZEJTY2FuICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCYW5kIEMgU2NhbiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkJhbmRDU2NhbiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRVJUUFMgT3B0aW9ucyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVydHBzT3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUEhTIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBIU0VuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSGFuZG9mZiBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJIb0VuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSE8gUmVzZXJ2ZWQxID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMySG9SZXNlcnZlZDEgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhPIFJlc2VydmVkMiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkhvUmVzZXJ2ZWQyICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNSU1PIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMk1pbW9FbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBLTXYyIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlNlY3VyaXR5RW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQb3dlcnNhdmluZyBNb2RlcyBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQb3dlclNhdmluZ01vZGVzRW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQb3dlciBTYXZpbmcgTW9kZSBPcHRpb25zID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQVJRIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkFycUVuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSGFycSBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJIYXJxRW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJFRVBST00gRmxhZyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVFUFJPTUZsYWcgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkN1c3RvbWl6ZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQmFuZHdpZHRoID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ29uZmlnQlcgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlNodXREb3duIFRpbWVyIFZhbHVlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyU2h1dERvd25Jbml0VGhyZXNob2xkVGltZXIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlJhZGlvUGFyYW1ldGVyID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUmFkaW9QYXJhbWV0ZXIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBoeVBhcmFtZXRlcjEgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIxICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQaHlQYXJhbWV0ZXIyID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUGh5UGFyYW1ldGVyMiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUGh5UGFyYW1ldGVyMyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBoeVBhcmFtZXRlcjMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIm1fdTMyVGVzdE9wdGlvbnMgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJUZXN0T3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWF4TUFDRGF0YXBlckRMRnJhbWUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJNYXhNQUNEYXRhcGVyRExGcmFtZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWF4TUFDRGF0YXBlclVMRnJhbWUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJNYXhNQUNEYXRhcGVyVUxGcmFtZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29ycjJNYWNGbGFncyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkNvcnIyTWFjRmxhZ3MgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzEgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNCA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzQgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlNlZ21lbnRlZCBQVVNDIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlNlZ21lbnRlZFBVU0NlbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbWNFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJCYW5kQU1DRW5hYmxlICk7Ci19Ci0KLSNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vT3NhbF9NaXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL09zYWxfTWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVmZDIwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vT3NhbF9NaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLyorKwotCi0JQ29weXJpZ2h0IChjKSBCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jLgotCi0JTW9kdWxlIE5hbWU6Ci0JCVdJTl9NaXNjLmMKLQotCUFic3RyYWN0OgotCQlJbXBsZW1lbnRzIHRoZSBNaXNjZWxhbm5lb3VzIE9TIENvbnN0cnV0cwotCQkJTGlua2VkIExpc3RzCi0JCQlEaXNwYXRjaGVyIE9iamVjdHMoRXZlbnRzLFNlbWFwaG9yZXMsU3BpbiBMb2NrcyBhbmQgdGhlIGxpa2UpCi0JCQlGaWxlcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQkJV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdAotCQktLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCU5hbWUJCURhdGUJCUNyZWF0ZWQvcmV2aWV3ZWQvbW9kaWZpZWQKLQkJUmFqZWV2CQkyNC8xLzA4CQlDcmVhdGVkCi0JTm90ZXM6Ci0KLQktLSovCi0jaW5jbHVkZSAiaGVhZGVycy5oIgotCi1ib29sIE9zYWxNZW1Db21wYXJlKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgVUlOVCBsZW4pCi17Ci0JcmV0dXJuIChtZW1jbXAoc3JjLCBkZXN0LCBsZW4pKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5jCmluZGV4IDhhMzhjZjQuLmQxY2ExOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuYwpAQCAtMSwxMCArMSw1NCBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIFVJTlQgQ3JlYXRlU0ZUb0NsYXNzaWZpZXJSdWxlTWFwcGluZyhCX1VJTlQxNiB1aVZjaWQsQl9VSU5UMTYgIHVpQ2xzSWQsU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1RhYmxlLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOworCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmZXJUb1BIU1J1bGVNYXBwaW5nKEJfVUlOVDE2IHVpVmNpZCxCX1VJTlQxNiAgdWlDbHNJZCxTX1NFUlZJQ0VGTE9XX0VOVFJZICpwc3RTZXJ2aWNlRmxvd0VudHJ5LFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOworCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmaWVyUEhTUnVsZShCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7CisKK3N0YXRpYyBVSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllckVudHJ5LFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlICxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKKworc3RhdGljIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoU19QSFNfUlVMRSAqcHNQaHNSdWxlKTsKKworc3RhdGljIEJPT0xFQU4gRGVyZWZQaHNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlLFNfUEhTX1JVTEUgKnBzdFBoc1J1bGUpOworCitzdGF0aWMgVUlOVCBHZXRDbGFzc2lmaWVyRW50cnkoU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsQl9VSU5UMzIgdWlDbHNpZCxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCwgU19DTEFTU0lGSUVSX0VOVFJZICoqcHBzdENsYXNzaWZpZXJFbnRyeSk7CisKK3N0YXRpYyBVSU5UIEdldFBoc1J1bGVFbnRyeShTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSxCX1VJTlQzMiB1aVBIU0ksRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsU19QSFNfUlVMRSAqKnBwc3RQaHNSdWxlKTsKKworc3RhdGljIHZvaWQgZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMoU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpOworCitzdGF0aWMgaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAgKnBoc19tZW1iZXJzLHVuc2lnbmVkIGNoYXIgKmluX2J1ZiwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKm91dF9idWYsdW5zaWduZWQgaW50ICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUgKTsKKworCitzdGF0aWMgaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAorCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsdW5zaWduZWQgaW50IHBoc3YsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7CisKK3N0YXRpYyBpbnQgcGhzX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqaW5fYnVmLHVuc2lnbmVkIGNoYXIgKm91dF9idWYsXAorCQkJCQkJICBTX1BIU19SVUxFICAgKnBoc19ydWxlcyxVSU5UICpoZWFkZXJfc2l6ZSk7CisKKworc3RhdGljIFVMT05HIFBoc0NvbXByZXNzKHZvaWQqIHB2Q29udGV4dCwKKwkJCQkgIEJfVUlOVDE2IHVpVmNpZCwKKwkJCQkgIEJfVUlOVDE2IHVpQ2xzSWQsCisJCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAorCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCisJCQkJICBVSU5UICpwT2xkSGVhZGVyU2l6ZSwKKwkJCQkgIFVJTlQgKnBOZXdIZWFkZXJTaXplICk7CisKK3N0YXRpYyBVTE9ORyBQaHNEZUNvbXByZXNzKHZvaWQqIHB2Q29udGV4dCwKKwkJCQkgIEJfVUlOVDE2IHVpVmNpZCwKKwkJCQkgIHZvaWQgKnB2SW5wdXRCdWZmZXIsCisJCQkJICB2b2lkICpwdk91dHB1dEJ1ZmZlciwKKwkJCQkgIFVJTlQgKnBJbkhlYWRlclNpemUsCisJCQkJICBVSU5UICpwT3V0SGVhZGVyU2l6ZSk7CisKKworCiAjZGVmaW5lIElOCiAjZGVmaW5lIE9VVAogCi12b2lkIER1bXBEYXRhUGFja2V0SGVhZGVyKFBVQ0hBUiBwUGt0KTsKLQogLyoKIEZ1bmN0aW9uOgkJCQlQSFNUcmFuc21pdAogCkBAIC04MSw4ICsxMjUsNiBAQAogCXsKIAogCi0JCS8vRHVtcERhdGFQYWNrZXRIZWFkZXIocHVjUEhTUGt0SGRySW5CdWYpOwotCiAJCS8vIFN0ZXAgMiBTdXByZXNzIEhlYWRlciB1c2luZyBQSFMgYW5kIGZpbGwgaW50byBpbnRlcm1lZGlhdGUgdWNhUEhTUGt0SGRyT3V0QnVmLgogCS8vIFN1cHByZXNzIG9ubHkgaWYgSVAgSGVhZGVyIGFuZCBQSFMgRW5hYmxlZCBGb3IgdGhlIFNlcnZpY2UgRmxvdwogCQlpZigoKHVzUGFja2V0VHlwZSA9PSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNCkgfHwKQEAgLTEyMCwxNSArMTYyLDE1IEBACiAJCQkJCQlpZihuZXdQYWNrZXQgPT0gTlVMTCkKIAkJCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKLQkJCQkJCWJjbV9rZnJlZV9za2IoUGFja2V0KTsKKwkJCQkJCWRldl9rZnJlZV9za2IoUGFja2V0KTsKIAkJCQkJCSpwUGFja2V0ID0gUGFja2V0ID0gbmV3UGFja2V0OwogCQkJCQkJcHVjUEhTUGt0SGRySW5CdWYgPSBQYWNrZXQtPmRhdGEgICsgQnl0ZXNUb1JlbW92ZTsKIAkJCQkJfQogCiAJCQkJCW51bUJ5dGVzQ29tcHJlc3NlZCA9IHVuUGhzT2xkSGRyU2l6ZSAtICh1blBIU05ld1BrdEhlYWRlckxlbitQSFNJX0xFTik7CiAKLQkJCQkJT3NhbE1lbU1vdmUocHVjUEhTUGt0SGRySW5CdWYgKyBudW1CeXRlc0NvbXByZXNzZWQsIHB1Y1BIU1BrdEhkck91dEJ1ZiwgdW5QSFNOZXdQa3RIZWFkZXJMZW4gKyBQSFNJX0xFTik7Ci0JCQkJCU9zYWxNZW1Nb3ZlKFBhY2tldC0+ZGF0YSArIG51bUJ5dGVzQ29tcHJlc3NlZCwgUGFja2V0LT5kYXRhLCBCeXRlc1RvUmVtb3ZlKTsKKwkJCQkJbWVtY3B5KHB1Y1BIU1BrdEhkckluQnVmICsgbnVtQnl0ZXNDb21wcmVzc2VkLCBwdWNQSFNQa3RIZHJPdXRCdWYsIHVuUEhTTmV3UGt0SGVhZGVyTGVuICsgUEhTSV9MRU4pOworCQkJCQltZW1jcHkoUGFja2V0LT5kYXRhICsgbnVtQnl0ZXNDb21wcmVzc2VkLCBQYWNrZXQtPmRhdGEsIEJ5dGVzVG9SZW1vdmUpOwogCQkJCQlza2JfcHVsbChQYWNrZXQsIG51bUJ5dGVzQ29tcHJlc3NlZCk7CiAKIAkJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjIzLDIzICsyNjUsMTIgQEAKIAkJCX0KIAkJfQogCi0JCU9zYWxNZW1Nb3ZlKHBhY2tldC0+ZGF0YSwgQWRhcHRlci0+dWNhUEhTUGt0UmVzdG9yZUJ1ZiwgblN0YW5kYXJkUGt0SGRyTGVuKTsKKwkJbWVtY3B5KHBhY2tldC0+ZGF0YSwgQWRhcHRlci0+dWNhUEhTUGt0UmVzdG9yZUJ1ZiwgblN0YW5kYXJkUGt0SGRyTGVuKTsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLXZvaWQgRHVtcERhdGFQYWNrZXRIZWFkZXIoUFVDSEFSIHBQa3QpCi17Ci0Jc3RydWN0IGlwaGRyICppcGhkID0gKHN0cnVjdCBpcGhkciopcFBrdDsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfU0VORCwgREJHX0xWTF9BTEwsIlBocyBTZW5kL1JlY2lldmUgOiBJUCBQYWNrZXQgSGRyIFxuIik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfU0VORCwgREJHX0xWTF9BTEwsIlRPUyA6ICV4IFxuIixpcGhkLT50b3MpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX1NFTkQsIERCR19MVkxfQUxMLCJTcmMgIElQIDogJXggXG4iLGlwaGQtPnNhZGRyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19TRU5ELCBEQkdfTFZMX0FMTCwiRGVzdCBJUCA6ICV4IFxuIFxuIixpcGhkLT5kYWRkcik7Ci0KLX0KLQogdm9pZCBEdW1wRnVsbFBhY2tldChVQ0hBUiAqcEJ1ZixVSU5UIG5Qa3RMZW4pCiB7CiAJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwpAQCAtMjcwLDE1ICszMDEsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSA9Ci0gICAgICAoU19TRVJWSUNFRkxPV19UQUJMRSopT3NhbE1lbUFsbG9jKHNpemVvZihTX1NFUlZJQ0VGTE9XX1RBQkxFKSwKLSAgICAgICAgICAgIFBIU19NRU1fVEFHKTsKKwkJa3phbGxvYyhzaXplb2YoU19TRVJWSUNFRkxPV19UQUJMRSksIEdGUF9LRVJORUwpOwogCi0gICAgaWYocFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlKQotCXsKLQkJT3NhbFplcm9NZW1vcnkocFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlLAotICAgICAgICAgICAgICBzaXplb2YoU19TRVJWSUNFRkxPV19UQUJMRSkpOwotCX0KLQllbHNlCisgICAgaWYoIXBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuQWxsb2NhdGlvbiBTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgZmFpbGVkIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjg4LDE0ICszMTMsOCBAQAogCWZvcihpPTA7aTxNQVhfU0VSVklDRUZMT1dTO2krKykKIAl7CiAJCVNfU0VSVklDRUZMT1dfRU5UUlkgc1NlcnZpY2VGbG93ID0gcHN0U2VydmljZUZsb3dUYWJsZS0+c3RTRkxpc3RbaV07Ci0JCXNTZXJ2aWNlRmxvdy5wc3RDbGFzc2lmaWVyVGFibGUgPSAoU19DTEFTU0lGSUVSX1RBQkxFKilPc2FsTWVtQWxsb2MoCi0gICAgICAgICAgICBzaXplb2YoU19DTEFTU0lGSUVSX1RBQkxFKSwgUEhTX01FTV9UQUcpOwotCQlpZihzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlKQotCQl7Ci0JCQlPc2FsWmVyb01lbW9yeShzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlLHNpemVvZihTX0NMQVNTSUZJRVJfVEFCTEUpKTsKLQkJCXBzdFNlcnZpY2VGbG93VGFibGUtPnN0U0ZMaXN0W2ldLnBzdENsYXNzaWZpZXJUYWJsZSA9IHNTZXJ2aWNlRmxvdy5wc3RDbGFzc2lmaWVyVGFibGU7Ci0gICAgCX0KLQkJZWxzZQorCQlzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlID0ga3phbGxvYyhzaXplb2YoU19DTEFTU0lGSUVSX1RBQkxFKSwgR0ZQX0tFUk5FTCk7CisJCWlmKCFzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbkFsbG9jYXRpb24gZmFpbGVkIik7CiAJCQlmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhwUGhzZGV2aWNlRXh0ZW5zaW9uLT4KQEAgLTMwNSw5ICszMjQsNyBAQAogCQl9CiAJfQogCi0KLQlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIgPQotICAgICAgICAgIE9zYWxNZW1BbGxvYyhQSFNfQlVGRkVSX1NJWkUsUEhTX01FTV9UQUcpOworCXBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlciA9IGttYWxsb2MoUEhTX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAogICAgIGlmKHBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlciA9PSBOVUxMKQogCXsKQEAgLTMxNywxMiArMzM0LDExIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0KLSAgICAgIE9zYWxNZW1BbGxvYyhQSFNfQlVGRkVSX1NJWkUsUEhTX01FTV9UQUcpOworICAgIHBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0ga21hbGxvYyhQSFNfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmKHBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID09IE5VTEwpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbkFsbG9jYXRpb24gZmFpbGVkIik7Ci0JCU9zYWxNZW1GcmVlKHBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlcixQSFNfQlVGRkVSX1NJWkUpOworCQlrZnJlZShwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIpOwogCQlmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUpOwogCQlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgPSBOVUxMOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTM0MywxNiArMzU5LDExIEBACiAJCXBQSFNEZXZpY2VFeHQtPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSA9IE5VTEw7CiAJfQogCi0JaWYocFBIU0RldmljZUV4dC0+Q29tcHJlc3NlZFR4QnVmZmVyKQotCXsKLQkJT3NhbE1lbUZyZWUocFBIU0RldmljZUV4dC0+Q29tcHJlc3NlZFR4QnVmZmVyLFBIU19CVUZGRVJfU0laRSk7Ci0JCXBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlciA9IE5VTEw7Ci0JfQotCWlmKHBQSFNEZXZpY2VFeHQtPlVuQ29tcHJlc3NlZFJ4QnVmZmVyKQotCXsKLQkJT3NhbE1lbUZyZWUocFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIsUEhTX0JVRkZFUl9TSVpFKTsKLQkJcFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIgPSBOVUxMOwotCX0KKwlrZnJlZShwUEhTRGV2aWNlRXh0LT5Db21wcmVzc2VkVHhCdWZmZXIpOworCXBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlciA9IE5VTEw7CisKKwlrZnJlZShwUEhTRGV2aWNlRXh0LT5VbkNvbXByZXNzZWRSeEJ1ZmZlcik7CisJcFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzgsMjAgKzQ4OSwxMiBAQAogCQkJewogCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0uYlVzZWQgJiYgcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKQogCQkJCXsKLQkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFBIU0kgPT0gdThQSFNJKQotCQkJCQl7Ci0JCQkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQpCi0JCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlCi0JCQkJCQkgICAgICAgICAgLT51OFJlZkNudC0tOwotCQkJCQkJaWYoMCA9PSBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0JCQkJCQkgICAgLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSwKLQkJCQkJCSAgICAgIHNpemVvZihTX1BIU19SVUxFKSk7Ci0JCQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCQktPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwKKwkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLT51OFBIU0kgPT0gdThQSFNJKQkJCQkJeworCQkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLT51OFJlZkNudCkKKwkJCQkJCQlwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUtPnU4UmVmQ250LS07CisJCQkJCQlpZigwID09IHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZS0+dThSZWZDbnQpCisJCQkJCQkJa2ZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKTsKKwkJCQkJCW1lbXNldCgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwgMCwKIAkJCQkJCQlzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CiAJCQkJCX0KIAkJCQl9CkBAIC01NDgsMTAgKzU1MSwxMCBAQAogCQkJCWlmKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThSZWZDbnQpCiAJCQkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFJlZkNudC0tOwogCQkJCWlmKDA9PXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThSZWZDbnQpCi0JCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSk7CiAKIAkJCX0KLQkJCU9zYWxaZXJvTWVtb3J5KHBzdENsYXNzaWZpZXJFbnRyeSxzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CisJCQltZW1zZXQocHN0Q2xhc3NpZmllckVudHJ5LCAwLCBzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CiAJCX0KIAogCQluQ2xzaWRJbmRleCA9IEdldENsYXNzaWZpZXJFbnRyeShwc3RTZXJ2aWNlRmxvd0VudHJ5LT5wc3RDbGFzc2lmaWVyVGFibGUsCkBAIC01NTksMTAgKzU2Miw4IEBACiAKIAkgICBpZigobkNsc2lkSW5kZXggIT0gUEhTX0lOVkFMSURfVEFCTEVfSU5ERVgpICYmICghcHN0Q2xhc3NpZmllckVudHJ5LT5iVW5jbGFzc2lmaWVkUEhTUnVsZSkpCiAJCXsKLQkJCWlmKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSkKLQkJCS8vRGVsZXRlIHRoZSBjbGFzc2lmaWVyIGVudHJ5Ci0JCQlPc2FsTWVtRnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUsc2l6ZW9mKFNfUEhTX1JVTEUpKTsKLQkJCU9zYWxaZXJvTWVtb3J5KHBzdENsYXNzaWZpZXJFbnRyeSxzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CisJCQlrZnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpOworCQkJbWVtc2V0KHBzdENsYXNzaWZpZXJFbnRyeSwgMCwgc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQl9CiAJfQogCXJldHVybiBsU3RhdHVzOwpAQCAtNjE5LDE0ICs2MjAsMTEgQEAKIAkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFJlZkNudC0tOwogCQkJCQlpZigwPT1wc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCSAgICAgICAgICAgIC0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUsCi0JCQkJCQkgICAgICAgICAgICAgc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSk7CiAJCQkJCSAgICBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCX0KLQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLSAgICAgICAgICAgICAgICAgICAgLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOworCQkJCW1lbXNldCgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwgMCwgc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSkKIAkJCQl7CiAJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0KQEAgLTYzNSwxNSArNjMzLDEyIEBACiAJCQkJCQkgICAgICAgICAgICAgICAgICAucHN0UGhzUnVsZS0+dThSZWZDbnQtLTsKIAkJCQkJaWYoMCA9PSBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCSAgICAgIC0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUsCi0JCQkJCQkgICAgICAgc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCisJCQkJCQkgICAgICAtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKTsKIAkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCX0KLQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLSAgICAgICAgICAgICAgICAgIC0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKKwkJCQltZW1zZXQoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sIDAsIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKIAkJCX0KIAkJfQogCQlwc3RTZXJ2aWNlRmxvd0VudHJ5LT5iVXNlZCA9IEZBTFNFOwpAQCAtODQ5LDcgKzg0NCw3IEBACiAvLyBEb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIGZyZWVfcGhzX3NlcnZpY2VmbG93X3J1bGVzKFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dSdWxlc1RhYmxlKQorc3RhdGljIHZvaWQgZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMoU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpCiB7CiAJaW50IGksajsKICAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CkBAIC04NzYsOCArODcxLDcgQEAKICAgCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQtLTsKIAkJCQkJCWlmKDA9PXBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT51OFJlZkNudCkKLQkJCQkJCQlPc2FsTWVtRnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3Rbal0uCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdFBoc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCQkJa2ZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUpOwogCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCQl9CiAJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlKQpAQCAtODg4LDI0ICs4ODIsMjMgQEAKIAkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnU4UmVmQ250LS07CiAJCQkJCQlpZigwPT1wc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQpCi0JCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W2pdCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUsc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCQlrZnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZSk7CiAJCQkJCQlwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZSA9IE5VTEw7CiAJCQkJCX0KIAkJCQl9Ci0JCQkgICAgT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUsc2l6ZW9mKFNfQ0xBU1NJRklFUl9UQUJMRSkpOworCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlKTsKIAkJCSAgICBzdFNlcnZpY2VGbG93RW50cnkucHN0Q2xhc3NpZmllclRhYmxlID0gcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUgPSBOVUxMOwogCQkJfQogCQl9CiAJfQogCi0JT3NhbE1lbUZyZWUocHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUsc2l6ZW9mKFNfU0VSVklDRUZMT1dfVEFCTEUpKTsKLQlwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSA9IE5VTEw7CisgICAga2ZyZWUocHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpOworICAgIHBzU2VydmljZUZsb3dSdWxlc1RhYmxlID0gTlVMTDsKIH0KIAogCiAKLUJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoSU4gU19QSFNfUlVMRSAqcHNQaHNSdWxlKQorc3RhdGljIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoSU4gU19QSFNfUlVMRSAqcHNQaHNSdWxlKQogewogCWlmKHBzUGhzUnVsZSkKIAl7CkBAIC05ODgsOSArOTgxLDkgQEAKIAlyZXR1cm4gUEhTX0lOVkFMSURfVEFCTEVfSU5ERVg7CiB9CiAKLVVJTlQgR2V0UGhzUnVsZUVudHJ5KElOIFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLAotICAgICAgSU4gQl9VSU5UMzIgdWlQSFNJLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LAotICAgICAgT1VUIFNfUEhTX1JVTEUgKipwcHN0UGhzUnVsZSkKK3N0YXRpYyBVSU5UIEdldFBoc1J1bGVFbnRyeShJTiBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSwKKwkJCSAgICBJTiBCX1VJTlQzMiB1aVBIU0ksRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsCisJCQkgICAgT1VUIFNfUEhTX1JVTEUgKipwcHN0UGhzUnVsZSkKIHsKIAlpbnQgIGk7CiAJU19DTEFTU0lGSUVSX0VOVFJZICpwc3RDbGFzc2lmaWVyUnVsZSA9IE5VTEw7CkBAIC0xMTAyLDcgKzEwOTUsNyBAQAogCQlpZihwc1Boc1J1bGUtPnU4UEhTRkxlbmd0aCkKIAkJewogCQkJLy91cGRhdGUgUEhTRgotCQkJT3NhbE1lbU1vdmUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFBIU0YsCisJCQltZW1jcHkocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFBIU0YsCiAJCQkgICAgcHNQaHNSdWxlLT51OFBIU0YgLCBNQVhfUEhTX0xFTkdUSFMpOwogCQl9CiAJCWlmKHBzUGhzUnVsZS0+dThQSFNGTGVuZ3RoKQpAQCAtMTExNCw3ICsxMTA3LDcgQEAKIAkJaWYocHNQaHNSdWxlLT51OFBIU01MZW5ndGgpCiAJCXsKIAkJCS8vdXBkYXRlIFBIU00KLQkJCU9zYWxNZW1Nb3ZlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNNLAorCQkJbWVtY3B5KHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNNLAogCQkJICAgIHBzUGhzUnVsZS0+dThQSFNNLCBNQVhfUEhTX0xFTkdUSFMpOwogCQl9CiAJCWlmKHBzUGhzUnVsZS0+dThQSFNNTGVuZ3RoKQpAQCAtMTE0Nyw3ICsxMTQwLDcgQEAKIAlyZXR1cm4gdWlTdGF0dXM7CiB9CiAKLVVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoSU4gQl9VSU5UMTYgIHVpQ2xzSWQsCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmaWVyUEhTUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCwKICAgICBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLAogICAgIEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSkKIHsKQEAgLTEyMzQsOCArMTIyNyw3IEBACiAJewogCQlpZihwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSA9PSBOVUxMKQogCQl7Ci0JCQlwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSA9IChTX1BIU19SVUxFKilPc2FsTWVtQWxsb2MKLSAgICAgICAgICAgICAgICAoc2l6ZW9mKFNfUEhTX1JVTEUpLFBIU19NRU1fVEFHKTsKKwkJCXBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlID0ga21hbGxvYyhzaXplb2YoU19QSFNfUlVMRSksR0ZQX0tFUk5FTCk7CiAKICAgICAgICAgICBpZihOVUxMID09IHBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlKQogCQkJCXJldHVybiBFUlJfUEhTUlVMRV9NRU1BTExPQ19GQUlMOwpAQCAtMTI0Nyw3ICsxMjM5LDcgQEAKIAkJcHNDbGFzc2lmaWVyUnVsZXMtPmJVbmNsYXNzaWZpZWRQSFNSdWxlID0gcHNQaHNSdWxlLT5iVW5jbGFzc2lmaWVkUEhTUnVsZTsKIAogICAgICAgICAvKiBVcGRhdGUgVGhlIFBIUyBydWxlICovCi0JCU9zYWxNZW1Nb3ZlKHBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlLAorCQltZW1jcHkocHNDbGFzc2lmaWVyUnVsZXMtPnBzdFBoc1J1bGUsCiAJCSAgICBwc1Boc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CiAJfQogCWVsc2UKQEAgLTEyNTksNyArMTI1MSw3IEBACiB9CiAKIAotVUlOVCBVcGRhdGVDbGFzc2lmaWVyUEhTUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCwKK3N0YXRpYyBVSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKElOIEJfVUlOVDE2ICB1aUNsc0lkLAogICAgICAgSU4gU19DTEFTU0lGSUVSX0VOVFJZICpwc3RDbGFzc2lmaWVyRW50cnksCiAgICAgICBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLAogICAgICAgQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKQpAQCAtMTI4OSwxMyArMTI4MSwxMyBAQAogCQkvL1N0ZXAgMi5hIFBIUyBSdWxlIERvZXMgTm90IEV4aXN0IC5DcmVhdGUgTmV3IFBIUyBSdWxlIGZvciB1aUNsc0lkCiAJCWlmKEZBTFNFID09IGJQSFNSdWxlT3JwaGFuZWQpCiAJCXsKLQkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IChTX1BIU19SVUxFKilPc2FsTWVtQWxsb2Moc2l6ZW9mKFNfUEhTX1JVTEUpLFBIU19NRU1fVEFHKTsKKwkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IGttYWxsb2Moc2l6ZW9mKFNfUEhTX1JVTEUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmKE5VTEwgPT0gcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlKQogCQkJewogCQkJCXJldHVybiBFUlJfUEhTUlVMRV9NRU1BTExPQ19GQUlMOwogCQkJfQogCQl9Ci0JCU9zYWxNZW1Nb3ZlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSwgcHNQaHNSdWxlLCBzaXplb2YoU19QSFNfUlVMRSkpOworCQltZW1jcHkocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLCBwc1Boc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CiAKIAl9CiAJZWxzZQpAQCAtMTMwNCwxNCArMTI5Niw4IEBACiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuVHlpbmcgQ2xhc3NpZmllciB0byBFeGlzdGluZyBQSFMgUnVsZSIpOwogCQlpZihiUEhTUnVsZU9ycGhhbmVkKQogCQl7Ci0JCSAgICBpZihwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpCi0JCSAgICB7Ci0JCSAgICAJLy9KdXN0IEZyZWUgdGhlIFBIUyBSdWxlIGFzIFJlZiBDb3VudCBpcyBaZXJvCi0JCSAgICAJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7CisJCQlrZnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpOwogCQkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlID0gTlVMTDsKLQotCQkgICAgfQotCiAJCX0KIAkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlID0gcHN0QWRkUGhzUnVsZTsKIApAQCAtMTMyNiw3ICsxMzEyLDcgQEAKIAogfQogCi1CT09MRUFOIERlcmVmUGhzUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSxTX1BIU19SVUxFICpwc3RQaHNSdWxlKQorc3RhdGljIEJPT0xFQU4gRGVyZWZQaHNSdWxlKElOIEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlLFNfUEhTX1JVTEUgKnBzdFBoc1J1bGUpCiB7CiAJaWYocHN0UGhzUnVsZT09TlVMTCkKIAkJcmV0dXJuIEZBTFNFOwpAQCAtMTM0NSwyMiArMTMzMSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBEdW1wQnVmZmVyKFBWT0lEIEJ1ZmZWQWRkcmVzcywgaW50IHhmZXJTaXplKQotewotCWludCBpOwotCWludCBpUHJpbnRMZW5ndGg7Ci0JUFVDSEFSIHRlbXA9KFBVQ0hBUilCdWZmVkFkZHJlc3M7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotCWlQcmludExlbmd0aD0oeGZlclNpemU8MzI/eGZlclNpemU6MzIpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuIik7Ci0KLQlmb3IgKGk9MDtpIDwgaVByaW50TGVuZ3RoO2krKykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiJXh8Iix0ZW1wW2ldKTsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiXG4iKTsKLX0KLQotCiB2b2lkIER1bXBQaHNSdWxlcyhQUEhTX0RFVklDRV9FWFRFTlNJT04gcERldmljZUV4dGVuc2lvbikKIHsKIAlpbnQgaSxqLGssbDsKQEAgLTE1MjAsOCArMTQ5MCw4IEBACiAvLwlzaXplLVRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIG91dHB1dCBidWZmZXIgaS5lIGR5bmFtaWMgZmllbGRzCiAvLwkwCS1JZiBQSFMgcnVsZSBpcyBOVUxMLklmIFBIU1YgZmllbGQgaXMgbm90IHNldC5JZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAqcGhzX3J1bGUsdW5zaWduZWQgY2hhciAqaW5fYnVmCi0JCQkJCQksdW5zaWduZWQgY2hhciAqb3V0X2J1ZixVSU5UICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUpCitzdGF0aWMgaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAqcGhzX3J1bGUsdW5zaWduZWQgY2hhciAqaW5fYnVmCisJCQksdW5zaWduZWQgY2hhciAqb3V0X2J1ZixVSU5UICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUpCiB7CiAJdW5zaWduZWQgY2hhciAqb2xkX2FkZHIgPSBvdXRfYnVmOwogCWludCBzdXByZXNzID0gMDsKQEAgLTE1ODEsOSArMTU1MSw5IEBACiAvLwkwCS1QYWNrZXQgaGFzIGZhaWxlZCB0aGUgdmVyaWZpY2F0aW9uLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAotCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsCi0JCQkJCQkJCXVuc2lnbmVkIGludCBwaHN2LFVJTlQqIG5ld19oZWFkZXJfc2l6ZSkKK3N0YXRpYyBpbnQgdmVyaWZ5X3N1cHByZXNzX3Boc2YodW5zaWduZWQgY2hhciAqaW5fYnVmZmVyLHVuc2lnbmVkIGNoYXIgKm91dF9idWZmZXIsCisJCQkJdW5zaWduZWQgY2hhciAqcGhzZix1bnNpZ25lZCBjaGFyICpwaHNtLHVuc2lnbmVkIGludCBwaHNzLAorCQkJCXVuc2lnbmVkIGludCBwaHN2LFVJTlQqIG5ld19oZWFkZXJfc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZT0wOwogCWludCBiaXQsaT0wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmgKaW5kZXggYmYyYjU3Ni4uMGRkMDVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5oCkBAIC0yNywxOSArMjcsNiBAQAogCiBpbnQgcGhzX2luaXQoUFBIU19ERVZJQ0VfRVhURU5TSU9OIHBQaHNkZXZpY2VFeHRlbnNpb24sUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotdm9pZCBmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhTX1NFUlZJQ0VGTE9XX1RBQkxFICpwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSk7Ci0KLWludCBwaHNfY29tcHJlc3MoU19QSFNfUlVMRSAgICpwaHNfbWVtYmVycyx1bnNpZ25lZCBjaGFyICppbl9idWYsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpvdXRfYnVmLHVuc2lnbmVkIGludCAqaGVhZGVyX3NpemUsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7Ci0KLQotaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAotCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsdW5zaWduZWQgaW50IHBoc3YsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7Ci0KLWludCBwaHNfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICppbl9idWYsdW5zaWduZWQgY2hhciAqb3V0X2J1ZixcCi0JCQkJCQkgIFNfUEhTX1JVTEUgICAqcGhzX3J1bGVzLFVJTlQgKmhlYWRlcl9zaXplKTsKLQotCiBpbnQgUGhzQ2xlYW51cChQUEhTX0RFVklDRV9FWFRFTlNJT04gcFBIU0RldmljZUV4dCk7CiAKIC8vVXRpbGl0eSBGdW5jdGlvbnMKQEAgLTUyLDQyICszOSwxMCBAQAogVUxPTkcgUGhzRGVsZXRlU0ZSdWxlcyh2b2lkKiBwdkNvbnRleHQsQl9VSU5UMTYgdWlWY2lkKSA7CiAKIAotVUxPTkcgUGhzQ29tcHJlc3Modm9pZCogcHZDb250ZXh0LAotCQkJCSAgQl9VSU5UMTYgdWlWY2lkLAotCQkJCSAgQl9VSU5UMTYgdWlDbHNJZCwKLQkJCQkgIHZvaWQgKnB2SW5wdXRCdWZmZXIsCi0JCQkJICB2b2lkICpwdk91dHB1dEJ1ZmZlciwKLQkJCQkgIFVJTlQgKnBPbGRIZWFkZXJTaXplLAotCQkJCSAgVUlOVCAqcE5ld0hlYWRlclNpemUgKTsKLQotVUxPTkcgUGhzRGVDb21wcmVzcyh2b2lkKiBwdkNvbnRleHQsCi0JCQkJICBCX1VJTlQxNiB1aVZjaWQsCi0JCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAotCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCi0JCQkJICBVSU5UICpwSW5IZWFkZXJTaXplLAotCQkJCSAgVUlOVCAqcE91dEhlYWRlclNpemUpOwotCi0KIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlKFNfUEhTX1JVTEUgKnBzUGhzUnVsZSk7CiAKLUJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoU19QSFNfUlVMRSAqcHNQaHNSdWxlKTsKLQogVUlOVCBHZXRTZXJ2aWNlRmxvd0VudHJ5KFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dUYWJsZSxCX1VJTlQxNiB1aVZjaWQsU19TRVJWSUNFRkxPV19FTlRSWSAqKnBwc3RTZXJ2aWNlRmxvd0VudHJ5KTsKIAotVUlOVCBHZXRDbGFzc2lmaWVyRW50cnkoU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsQl9VSU5UMzIgdWlDbHNpZCxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCwgU19DTEFTU0lGSUVSX0VOVFJZICoqcHBzdENsYXNzaWZpZXJFbnRyeSk7Ci0KLVVJTlQgR2V0UGhzUnVsZUVudHJ5KFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLEJfVUlOVDMyIHVpUEhTSSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxTX1BIU19SVUxFICoqcHBzdFBoc1J1bGUpOwotCi0KLVVJTlQgQ3JlYXRlU0ZUb0NsYXNzaWZpZXJSdWxlTWFwcGluZyhCX1VJTlQxNiB1aVZjaWQsQl9VSU5UMTYgIHVpQ2xzSWQsU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1RhYmxlLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOwotCi1VSU5UIENyZWF0ZUNsYXNzaWZlclRvUEhTUnVsZU1hcHBpbmcoQl9VSU5UMTYgdWlWY2lkLEJfVUlOVDE2ICB1aUNsc0lkLFNfU0VSVklDRUZMT1dfRU5UUlkgKnBzdFNlcnZpY2VGbG93RW50cnksU19QSFNfUlVMRSAqcHNQaHNSdWxlLEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7Ci0KLVVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUgLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOwotCi1VSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllckVudHJ5LFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlICxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKLQotQk9PTEVBTiBEZXJlZlBoc1J1bGUoQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUsU19QSFNfUlVMRSAqcHN0UGhzUnVsZSk7CiAKIHZvaWQgRHVtcFBoc1J1bGVzKFBQSFNfREVWSUNFX0VYVEVOU0lPTiBwRGV2aWNlRXh0ZW5zaW9uKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b2NvbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b2NvbC5oCmluZGV4IDAwZjFjYzEuLmI4YTQwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUHJvdG9jb2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvY29sLmgKQEAgLTg1LDEwICs4NSwxMCBAQAogCUVUSF9IRUFERVJfU1RSVUMgRVRoSGRyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBFVEhfQ1NfRVRIMl9GUkFNRTsKIAorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNAkJbnRvaHMoMHgwODAwKQorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNiAJbnRvaHMoMHg4NmRkKQorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfODAyUVZMQU4gCW50b2hzKDB4ODEwMCkKIAotI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNCBudG9ocygweDA4MDApCi0jZGVmaW5lIEVUSEVSTkVUX0ZSQU1FVFlQRV9JUFY2IG50b2hzKDB4ODZkZCkKLSNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFXzgwMlFWTEFOIDB4ODEwMAogLy9QZXIgU0YgQ1MgU3BlY2lmaWNhdGlvbiBFbmNvZGluZ3MKIHR5cGVkZWYgZW51bSBfRV9TRVJWSUNFRkxPV19DU19TUEVDXwogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaAppbmRleCA3MGVjOGJjLi5iODBiODA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaApAQCAtMSwyMyArMSwxMiBAQAogI2lmbmRlZiBfUFJPVE9UWVBFU19IXwogI2RlZmluZSBfUFJPVE9UWVBFU19IXwogCi1pbnQgQmNtRmlsZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8IExvZ2ljYWwgQWRhcHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aCwgICAgIC8qKjwgcGF0aCB0byBpbWFnZSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbG9jICAgIC8qKjwgRG93bmxvYWQgQWRkcmVzcyBvbiB0aGUgY2hpcCovCi0gICAgICAgICAgICAgICAgICAgICAgICApOwogVk9JRCBMaW5rQ29udHJvbFJlc3BvbnNlTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBwdWNCdWZmZXIpOwogCiBWT0lEIFN0YXRpc3RpY3NSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIpOwogCiBWT0lEIElkbGVNb2RlUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVSU5UIHB1aUJ1ZmZlcik7CiAKLXZvaWQgYmNtX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLVZPSUQgYmNtX2tmcmVlKFZPSUQgKnB0cik7Ci0KLQotVk9JRCBoYW5kbGVfcnhfY29udHJvbF9wYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAJLyoqPFBvaW50ZXIgdG8gdGhlIEFkYXB0ZXIgc3RydWN0dXJlKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CQkJCS8qKjxQb2ludGVyIHRvIHRoZSBzb2NrZXQgYnVmZmVyKi8KLQogaW50IGNvbnRyb2xfcGFja2V0X2hhbmRsZXIJKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIFZPSUQgRGVsZXRlQWxsQ2xhc3NpZmllcnNGb3JTRihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCk7CkBAIC0zOCwyNSArMjcsMTYgQEAKIAogVk9JRCBmbHVzaF9hbGxfcXVldWVzKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLVVTSE9SVAlJcFZlcnNpb240KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPCBQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQkJCQkJc3RydWN0IGlwaGRyICppcGhkLCAvKio8UG9pbnRlciB0byB0aGUgSVAgSGRyIG9mIHRoZSBwYWNrZXQqLwotCQkJCQlTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKTsKLQotVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8UG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlKi8KLQkJCQkJSU5UIGlJbmRleC8qKjxRdWV1ZSBJbmRleCovCi0JCQkJCSk7Ci0KIFZPSUQgUHJ1bmVRdWV1ZUFsbFNGKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBTZWFyY2hTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2ZpZCk7CiAKLVVTSE9SVCBHZXRQYWNrZXRRdWV1ZUluZGV4KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLwotCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiogUGFja2V0IC8qKjwgUG9pbnRlciB0byB0aGUgUGFja2V0IHRvIGJlIHNlbnQqLwotCQkJCQkJCQkpOworVVNIT1JUIENsYXNzaWZ5UGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKIAotVk9JRAotcmVwbHlfdG9fYXJwX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiAgLyoqPHNrX2J1ZmYgb2YgQVJQIHJlcXVlc3QqLwotCQkJCQkJKTsKK0JPT0xFQU4gTWF0Y2hTcmNQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CitCT09MRUFOIE1hdGNoRGVzdFBvcnQoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVTSE9SVCB1c2hTcmNQb3J0KTsKK0JPT0xFQU4gTWF0Y2hQcm90b2NvbChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUNIQVIgdWNQcm90b2NvbCk7CisKIAogSU5UIFNldHVwTmV4dFNlbmQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8TG9naWNhbCBBZGFwdGVyKi8KIAkJCQkJc3RydWN0IHNrX2J1ZmYgKlBhY2tldCwgLyoqPGRhdGEgYnVmZmVyKi8KQEAgLTcwLDExICs1MCw5IEBACiAJCQkJCQkJY2hhciAqcENvbnRyb2xQYWNrZXQvKio8Q29udHJvbCBQYWNrZXQqLwogCQkJCQkJCSk7CiAKLUlOVCBiY21fdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgCQkvKio8IHNrYiAqLwotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IAkvKio8IG5ldCBkZXZpY2UgcG9pbnRlciAqLwotCQkJCQkpOwogCiBpbnQgcmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwordm9pZCB1bnJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAogSU5UIEFsbG9jQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCkBAIC04Miw4ICs2MCw2IEBACiAKIElOVCBGcmVlQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi1pbnQgY3JlYXRlX3dvcmtlcl90aHJlYWRzKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLQogaW50IHR4X3BrdF9oYW5kbGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIGludCAgcmVzZXRfY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgQWRhcHRlciApOwpAQCAtOTIsNyArNjgsNiBAQAogCiBpbnQgSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcik7CiAKLWludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgUmVhZE1hY0FkZHJlc3NGcm9tTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKQEAgLTExMCwyNiArODUsMTUgQEAKIAogaW50IGdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlTRklkLCB2b2lkIF9fdXNlciAqIHVzZXJfYnVmZmVyKTsKIAotdm9pZCBTZW5kTGlua0Rvd24oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQogdm9pZCBTZW5kSWRsZU1vZGVSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi12b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpOwogCi1pbnQgIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBWT0lEIGlvQnVmZmVyLAotCVVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKTsKLQotaW50IEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoUFZPSUQgaW9CdWZmZXIsIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyk7CitpbnQgIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKmJ1Zik7Cit2b2lkIEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqaW9CdWZmZXIsIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyk7CiB2b2lkIGJlY2VlbV9wYXJzZV90YXJnZXRfc3RydWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLXZvaWQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLQogaW50IGJjbV9pb2N0bF9md19kb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZJUk1XQVJFX0lORk8gKnBzRndJbmZvKTsKIAotdm9pZCBiY21fdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLWludCBTZWFyY2hWY2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcix1bnNpZ25lZCBzaG9ydCB1c1ZjaWQpOwotCiB2b2lkIENvcHlNSUJTRXh0ZW5kZWRTRlBhcmFtZXRlcnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCQlDU2VydmljZUZsb3dQYXJhbVNJICpwc2ZMb2NhbFNldCwgVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCk7CiAKQEAgLTE0OSw3ICsxMTMsNiBAQAogCiB2b2lkIENsZWFyVGFyZ2V0RFNYQnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiBUSUQsQk9PTEVBTiBiRnJlZUFsbCk7CiAKLXZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiB2b2lkIGZsdXNoX3F1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBpUUluZGV4KTsKIApAQCAtMTY0LDMxICsxMjcsMTEgQEAKIAlVSU5UIHVpTnVtQnl0ZXMpOwogCiAKLUlOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBXcml0ZUJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aUVFUFJPTU9mZnNldCwgVUlOVCB1aURhdGEpOwogCi1VSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1VSU5UIEJjbUdldEZsYXNoU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgRmxhc2hTZWN0b3JTaXplU2lnLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZSk7Ci0KLUlOVCBCZWNlZW1GbGFzaEJ1bGtXcml0ZSgKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JUFVJTlQgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcywKLQlCT09MRUFOIGJWZXJpZnkpOwotCiBJTlQgUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUZsYXNoVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotSU5UIFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21FRVBST01Ub01lbW9yeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCiAKIElOVCBCZWNlZW1FRVBST01CdWxrV3JpdGUoCiAJUE1JTklfQURBUFRFUiBBZGFwdGVyLApAQCAtMTk4LDExICsxNDEsOCBAQAogCUJPT0xFQU4gYlZlcmlmeSk7CiAKIAotSU5UIFJlYWRCZWNlZW1FRVBST01CdWxrKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIGR3QWRkcmVzcywgVUlOVCAqcGR3RGF0YSwgVUlOVCBkd051bURhdGEpOwotCiBJTlQgUmVhZEJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCBkd0FkZHJlc3MsIFVJTlQgKnBkd0RhdGEpOwogCi1OVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBCZWNlZW1OVk1SZWFkKAogCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKQEAgLTIxNywyNCArMTU3LDEyIEBACiAJVUlOVCB1aU51bUJ5dGVzLAogCUJPT0xFQU4gYlZlcmlmeSk7CiAKLUlOVCBCY21VcGRhdGVTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2VjdG9yU2l6ZSk7CiAKIElOVCBCY21Jbml0TlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLUlOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitJTlQgQmNtVXBkYXRlU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlY3RvclNpemUpOworQk9PTEVBTiBJc1NlY3Rpb25FeGlzdEluRmxhc2goUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwogCi1JTlQgSXNTZWN0aW9uRXhpc3RJblZlbmRvckluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwotCi1WT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIENvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLUlOVCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFJlYWREU0RIZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQRFNEX0hFQURFUiBwc0RTREhlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpOwotSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFJlYWRJU09IZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQSVNPX0hFQURFUiBwc0lTT0hlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBJc29JbWFnZSk7Ci1JTlQgQmNtR2V0QWN0aXZlSVNPKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci1CX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpT2Zmc2V0KTsKIElOVCBCY21HZXRGbGFzaDJ4U2VjdGlvbmFsQml0TWFwKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcCk7CiAKIElOVCBCY21GbGFzaDJ4QnVsa1dyaXRlKApAQCAtMjUxLDcgKzE3OSw2IEBACiAJRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2hTZWN0aW9uVmFsLAogCVVJTlQgdWlPZmZzZXRXaXRoaW5TZWN0aW9uVmFsLAogCVVJTlQgdWlOdW1CeXRlcyk7Ci1JTlQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoU2VjdGlvblZhbCk7CiAKIElOVCBCY21HZXRTZWN0aW9uVmFsU3RhcnRPZmZzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaFNlY3Rpb25WYWwpOwogCkBAIC0yNjQsMzQgKzE5MSwxMyBAQAogSU5UIEJjbUZsYXNoMnhXcml0ZVNpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoU2VjdGlvblZhbCk7CiBJTlQJdmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUEZMQVNIMlhfUkVBRFdSSVRFIHBzRmxhc2gyeFJlYWRXcml0ZSk7CiBJTlQgSXNGbGFzaDJ4KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci1JTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFNhdmVIZWFkZXJJZlByZXNlbnQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVUNIQVIgcEJ1ZmYsIFVJTlQgdWlTZWN0QWxpZ25BZGRyKTsKIElOVAlCY21Db3B5U2VjdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCiAJCQkJCQlGTEFTSDJYX1NFQ1RJT05fVkFMIFNyY1NlY3Rpb24sCiAJCQkJCQlGTEFTSDJYX1NFQ1RJT05fVkFMIERzdFNlY3Rpb24sCiAJCQkJCQlVSU5UIG9mZnNldCwKIAkJCQkJCVVJTlQgbnVtT2ZCeXRlcyk7CiAKLUlOVCBCY21Eb0NoaXBTZWxlY3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7Ci1JTlQgQmNtTWFrZUZsYXNoQ1NBY3RpdmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7Ci1JTlQgUmVhZERTRFNpZ25hdHVyZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZHNkKTsKLUlOVCBSZWFkRFNEUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7Ci1GTEFTSDJYX1NFQ1RJT05fVkFMIGdldEhpZ2hlc3RQcmlEU0QoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBSZWFkSVNPU2lnbmF0dXJlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBpc28pOwotSU5UIFJlYWRJU09Qcmlvcml0eShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKLUZMQVNIMlhfU0VDVElPTl9WQUwgZ2V0SGlnaGVzdFByaUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JCQkJCQkJCQkJUFVJTlQgcEJ1ZmYsCi0JCQkJCQkJCQkJRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwsCi0JCQkJCQkJCQkJVUlOVCB1aU9mZnNldCwKLQkJCQkJCQkJCQlVSU5UIHVpTnVtQnl0ZXMKLQkJCQkJCQkJCQkpOwogCi0vL1VJTlQgZ2V0TnVtT2ZTdWJTZWN0aW9uV2l0aFdSUGVybWlzc29uKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgU0VDVElPTl9UWVBFIHNlY1R5cGUpOwotQk9PTEVBTiBJc1NlY3Rpb25FeGlzdEluRmxhc2goUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwotSU5UIElzU2VjdGlvbldyaXRhYmxlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBTZWN0aW9uKTsKLUlOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotSU5UIENvcnJ1cHRJU09TaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCk7CiBCT09MRUFOIElzTm9uQ0RMZXNzRGV2aWNlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIApAQCAtMzAwLDcgKzIwNiw2IEBACiBpbnQgd3JtYWx0V2l0aExvY2sgKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSk7CiBpbnQgcmRtYWx0V2l0aExvY2sgKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSk7CiAKLWludCByZG1XaXRoTG9jayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQQ0hBUiBwdWNCdWZmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgd3JtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNpemUpOwogSU5UIGJ1ZmZEbmxkVmVyaWZ5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgdW5zaWduZWQgY2hhciAqbWFwcGVkYnVmZmVyLCB1bnNpZ25lZCBpbnQgdTMyRmlybXdhcmVMZW5ndGgsCiAJCXVuc2lnbmVkIGxvbmcgdTMyU3RhcnRpbmdBZGRyZXNzKTsKQEAgLTMwOSwxMSArMjE0LDYgQEAKIFZPSUQgcHV0VXNiU3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogQk9PTEVBTiBJc1JlcUdwaW9Jc0xlZEluTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBncGlvcyk7CiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotSU5UIGJlY2VlbV92aXJ0dWFsX2RldmljZV9pbml0KHZvaWQpOwotVk9JRCB2aXJ0dWFsX21haWxfYm94X2ludGVycnVwdCh2b2lkKTsKLUlOVCBiZWNlZW1fdmlydHVhbF9kZXZpY2VfZXhpdCh2b2lkKTsKLSNlbmRpZgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKaW5kZXggNzViMmI4Ny4uOGNlNDUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCkBAIC00LDE1ICs0LDE0IEBACiAqLwogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotQk9PTEVBTiBNYXRjaFNyY0lwQWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUxPTkcgdWxTcmNJUCk7Ci1CT09MRUFOIE1hdGNoVG9zKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVQ0hBUiB1Y1R5cGVPZlNlcnZpY2UpOwotQk9PTEVBTiBNYXRjaFNyY1BvcnQoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVTSE9SVCB1c2hTcmNQb3J0KTsKLUJPT0xFQU4gTWF0Y2hEZXN0UG9ydChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVVNIT1JUIHVzaERlc3RQb3J0KTsKLUJPT0xFQU4gTWF0Y2hQcm90b2NvbChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUNIQVIgdWNQcm90b2NvbCk7Ci1CT09MRUFOIE1hdGNoRGVzdElwQWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUxPTkcgdWxEZXN0SVApOwotVVNIT1JUIENsYXNzaWZ5UGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKLXZvaWQgRVRoQ1NHZXRQa3RJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkV0aFBheWxvYWQsUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvKTsKLUJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYixQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLCBCX1VJTlQ4IEV0aENTQ3VwcG9ydCk7CitzdGF0aWMgdm9pZCBFVGhDU0dldFBrdEluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2RXRoUGF5bG9hZCxQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8pOworc3RhdGljIEJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYixQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLCBCX1VJTlQ4IEV0aENTQ3VwcG9ydCk7CisKK3N0YXRpYyBVU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBpcGhkciAqaXBoZCwKKwkJCSAgIFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSApOworCitzdGF0aWMgVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgSU5UIGlJbmRleCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gICAgLSBNYXRjaFNyY0lwQWRkcmVzcygpCkBAIC0yMDUsMTEgKzIwNCwxMCBAQAogQ29tcGFyZXMgSVBWNCBJcCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlcgogQHJldHVybiBRdWV1ZSBJbmRleC4KICovCi1VU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjwgUG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlICovCi0JCQkJCXN0cnVjdCBpcGhkciAqaXBoZCwgLyoqPFBvaW50ZXIgdG8gdGhlIElQIEhkciBvZiB0aGUgcGFja2V0Ki8KLQkJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlICkKK3N0YXRpYyBVU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCisJCQkgICBzdHJ1Y3QgaXBoZHIgKmlwaGQsCisJCQkgICBTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKQogewotCS8vSVBIZWFkZXJGb3JtYXQgCQkqcElwSGVhZGVyPU5VTEw7CiAJeHBvcnRoZHIgICAgIAkJKnhwcnRfaGRyPU5VTEw7CiAJQk9PTEVBTgliQ2xhc3NpZmljYXRpb25TdWNjZWVkPUZBTFNFOwogCkBAIC0yNjEsMTUgKzI1OSw2IEBACiAJCS8vaWYgcHJvdG9jb2wgaXMgbm90IFRDUCBvciBVRFAgdGhlbiBubyBuZWVkIG9mIGNvbXBhcmluZyBzb3VyY2UgcG9ydCBhbmQgZGVzdGluYXRpb24gcG9ydAogCQlpZihpcGhkLT5wcm90b2NvbCE9VENQICYmIGlwaGQtPnByb3RvY29sIT1VRFApCiAJCQlicmVhazsKLSNpZiAwCi0JCS8vY2hlY2sgaWYgbWVtb3J5IGlzIGF2YWlsYWJsZSBvZiBzcmMgYW5kIERlc3QgcG9ydAotCQlpZihFVEhfQU5EX0lQX0hFQURFUl9MRU4gKyBMNF9TUkNfUE9SVF9MRU4gKyBMNF9ERVNUX1BPUlRfTEVOID4gUGFja2V0LT5sZW4pCi0JCXsKLQkJCS8vVGhpcyBpcyBub3QgYW4gZXJyb25lb3VzIGNvbmRpdGlvbiBhbmQgcGt0IHdpbGwgYmUgY2hlY2tlZCBmb3IgbmV4dCBjbGFzc2lmaWNhdGlvbi4KLQkJCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYKIAkJLy8qKioqKioqKioqKioqKioqKipDaGVja2luZyBUcmFuc3BvcnQgTGF5ZXIgSGVhZGVyIGZpZWxkIGlmIHByZXNlbnQgKioqKioqKioqKioqKioqKiovLwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFBvcnQgJTA0eCIsCiAJCQkoaXBoZC0+cHJvdG9jb2w9PVVEUCk/eHBydF9oZHItPnVoZHIuc291cmNlOnhwcnRfaGRyLT50aGRyLnNvdXJjZSk7CkBAIC0zMTIsMjkgKzMwMSw2IEBACiAKIAlyZXR1cm4gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZDsKIH0KLS8qKgotQGluZ3JvdXAgdHhfZnVuY3Rpb25zCi1AcmV0dXJuICBRdWV1ZSBJbmRleCBiYXNlZCBvbiBwcmlvcml0eS4KLSovCi1VU0hPUlQgR2V0UGFja2V0UXVldWVJbmRleChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYqIFBhY2tldCAvKio8IFBvaW50ZXIgdG8gdGhlIFBhY2tldCB0byBiZSBzZW50Ki8KLQkJCQkJCQkJKQotewotCVVTSE9SVAkJCXVzSW5kZXg9LTE7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFFVRVVFX0lOREVYLCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCi0JaWYoTlVMTD09QWRhcHRlciB8fCBOVUxMPT1QYWNrZXQpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgUVVFVUVfSU5ERVgsIERCR19MVkxfQUxMLCAiR290IE5VTEwgVmFsdWVzPD09PT09PSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdXNJbmRleCA9IENsYXNzaWZ5UGFja2V0KEFkYXB0ZXIsUGFja2V0KTsKLQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBRVUVVRV9JTkRFWCwgREJHX0xWTF9BTEwsICJHb3QgUXVldWUgSW5kZXggJXgiLHVzSW5kZXgpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBRVUVVRV9JTkRFWCwgREJHX0xWTF9BTEwsICJHZXRQYWNrZXRRdWV1ZUluZGV4IDw9PT09PT09PT09PT09PSIpOwotCXJldHVybiB1c0luZGV4OwotfQogCiBWT0lEIFBydW5lUXVldWVBbGxTRihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CkBAIC0zNTcsMjMgKzMyMywyMSBAQAogZHJvcHMgcGFja2V0cyBmcm9tIHRoZSBIZWFkIHRpbGwgdGhlIG51bWJlciBvZiBieXRlcyBpcwogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heCBxdWV1ZSBzaXplIGZvciB0aGUgcXVldWUuCiAqLwotVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8UG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlKi8KLQkJCQkJSU5UIGlJbmRleC8qKjxRdWV1ZSBJbmRleCovCi0JCQkJCSkKK3N0YXRpYyBWT0lEIFBydW5lUXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBJTlQgaUluZGV4KQogewogCXN0cnVjdCBza19idWZmKiBQYWNrZXRUb0Ryb3A9TlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogIG5ldHN0YXRzPU5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHN0YXRzOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFBSVU5FX1FVRVVFLCBEQkdfTFZMX0FMTCwgIj09PT09PiBJbmRleCAlZCIsaUluZGV4KTsKIAogICAgCWlmKGlJbmRleCA9PSBIaVByaW9yaXR5KQotICAgICAgIAlyZXR1cm47CisJCXJldHVybjsKIAogCWlmKCFBZGFwdGVyIHx8IChpSW5kZXggPCAwKSB8fCAoaUluZGV4ID4gSGlQcmlvcml0eSkpCiAJCXJldHVybjsKIAogCS8qIFRvIFN0b3JlIHRoZSBuZXRkZXZpY2Ugc3RhdGlzdGljICovCi0JbmV0c3RhdHMgPSAmKChQTElOVVhfREVQX0RBVEEpQWRhcHRlci0+cHZPc0RlcERhdGEpLT5uZXRzdGF0czsKKwluZXRzdGF0cyA9ICZBZGFwdGVyLT5kZXYtPnN0YXRzOwogCiAJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLlNGUXVldWVMb2NrKTsKIApAQCAtMzk1LDkgKzM1OSwxMyBAQAogCiAJCWlmKFBhY2tldFRvRHJvcCkKIAkJewotCQkJaWYobmV0c3RhdHMpCi0JCQkJbmV0c3RhdHMtPnR4X2Ryb3BwZWQrKzsKLQkJCWF0b21pY19pbmMoJkFkYXB0ZXItPlR4RHJvcHBlZFBhY2tldENvdW50KTsKKwkJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoQWRhcHRlci0+ZGV2LCBpSW5kZXgpOworCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoQWRhcHRlcikpCisJCQkJcHJfaW5mbyhQRlggIiVzOiB0eCBxdWV1ZSAlZCBvdmVybGltaXRcbiIsIAorCQkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIGlJbmRleCk7CisKKwkJCXR4cS0+dHhfZHJvcHBlZCsrOworCiAJCQlERVFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uRmlyc3RUeFF1ZXVlLAogCQkJCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS5MYXN0VHhRdWV1ZSk7CiAJCQkvLy8gdXBkYXRlIGN1cnJlbnQgYnl0ZXMgYW5kIHBhY2tldHMgY291bnQKQEAgLTQwNyw3ICszNzUsNyBAQAogCQkJLy8vIHVwZGF0ZSBkcm9wcGVkIGJ5dGVzIGFuZCBwYWNrZXRzIGNvdW50cwogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudEJ5dGVzICs9IFBhY2tldFRvRHJvcC0+bGVuOwogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMrKzsKLQkJCWJjbV9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKKwkJCWRldl9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKIAogCQl9CiAKQEAgLTQxNiw3ICszODQsNiBAQAogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMpOwogCiAJCWF0b21pY19kZWMoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpOwotCQlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJkFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uU0ZRdWV1ZUxvY2spOwpAQCAtNDMwLDE2ICszOTcsMTUgQEAKIHsKIAlJTlQJCWlRSW5kZXg7CiAJVUlOVAl1aVRvdGFsUGFja2V0TGVuZ3RoOwotCXN0cnVjdCBza19idWZmKgkJCQlQYWNrZXRUb0Ryb3A9TlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogIAluZXRzdGF0cz1OVUxMOworCXN0cnVjdCBza19idWZmKgkJCVBhY2tldFRvRHJvcD1OVUxMOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiPT09PT0+Iik7Ci0JLyogVG8gU3RvcmUgdGhlIG5ldGRldmljZSBzdGF0aXN0aWMgKi8KLQluZXRzdGF0cyA9ICYoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzOwogCiAvLwlkb3duKCZBZGFwdGVyLT5kYXRhX3BhY2tldF9xdWV1ZV9sb2NrKTsKIAlmb3IoaVFJbmRleD1Mb3dQcmlvcml0eTsgaVFJbmRleDxIaVByaW9yaXR5OyBpUUluZGV4KyspCiAJeworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKEFkYXB0ZXItPmRldiwgaVFJbmRleCk7CisKIAkJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5TRlF1ZXVlTG9jayk7CiAJCXdoaWxlKEFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLkZpcnN0VHhRdWV1ZSkKIAkJewpAQCAtNDQ3LDggKzQxMyw3IEBACiAJCQlpZihQYWNrZXRUb0Ryb3ApCiAJCQl7CiAJCQkJdWlUb3RhbFBhY2tldExlbmd0aCA9IFBhY2tldFRvRHJvcC0+bGVuOwotCQkJCW5ldHN0YXRzLT50eF9kcm9wcGVkKys7Ci0JCQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhEcm9wcGVkUGFja2V0Q291bnQpOworCQkJCXR4cS0+dHhfZHJvcHBlZCsrOwogCQkJfQogCQkJZWxzZQogCQkJCXVpVG90YWxQYWNrZXRMZW5ndGggPSAwOwpAQCAtNDU3LDcgKzQyMiw3IEBACiAJCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5MYXN0VHhRdWV1ZSk7CiAKIAkJCS8qIEZyZWUgdGhlIHNrYiAqLwotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOwogCiAJCQkvLy8gdXBkYXRlIGN1cnJlbnQgYnl0ZXMgYW5kIHBhY2tldHMgY291bnQKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLnVpQ3VycmVudEJ5dGVzT25Ib3N0IC09IHVpVG90YWxQYWNrZXRMZW5ndGg7CkBAIC01NTksMTIgKzUyNCw2IEBACiAKIAlmb3IodWlMb29wSW5kZXggPSBNQVhfQ0xBU1NJRklFUlMgLSAxOyB1aUxvb3BJbmRleCA+PSAwOyB1aUxvb3BJbmRleC0tKQogCXsKLQkJaWYgKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCQl7Ci0JCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCiAJCWlmKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQpCiAJCQlicmVhazsKIAkJLy9JdGVyYXRlIHRocm91Z2ggYWxsIGNsYXNzaWZpZXJzIHdoaWNoIGFyZSBhbHJlYWR5IGluIG9yZGVyIG9mIHByaW9yaXR5CkBAIC04MTAsNyArNzY5LDEwIEBACiB9CiAKIAotQk9PTEVBTiBFVGhDU0NsYXNzaWZ5UGt0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiLFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbyxTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsIEJfVUlOVDggRXRoQ1NDdXBwb3J0KQorc3RhdGljIEJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYiwKKwkJCQlQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sCisJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLAorCQkJCUJfVUlOVDggRXRoQ1NDdXBwb3J0KQogewogCUJPT0xFQU4gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IEZBTFNFOwogCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBFdGhDU01hdGNoU3JjTUFDQWRkcmVzcyhwc3RDbGFzc2lmaWVyUnVsZSwoKEVUSF9IRUFERVJfU1RSVUMgKikoc2tiLT5kYXRhKSktPmF1OFNvdXJjZUFkZHJlc3MpOwpAQCAtODQwLDkgKzgwMiwxMSBAQAogCXJldHVybiBiQ2xhc3NpZmljYXRpb25TdWNjZWVkOwogfQogCi12b2lkIEVUaENTR2V0UGt0SW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZFdGhQYXlsb2FkLFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbykKK3N0YXRpYyB2b2lkIEVUaENTR2V0UGt0SW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZFdGhQYXlsb2FkLAorCQkJICAgIFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbykKIHsKIAlVU0hPUlQgdTE2RXR5cGUgPSBudG9ocygoKEVUSF9IRUFERVJfU1RSVUMqKXB2RXRoUGF5bG9hZCktPnUxNkV0eXBlKTsKKwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAgIkV0aENTR2V0UGt0SW5mbyA6IEV0aCBIZHIgVHlwZSA6ICVYXG4iLHUxNkV0eXBlKTsKIAlpZih1MTZFdHlwZSA+IDB4NWRjKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vVE9ETwppbmRleCAzNjY2MzRiLi5jZDNlOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UT0RPCkBAIC0xLDE1ICsxLDIyIEBACitUaGlzIGRyaXZlciBpcyBiYXJlbHkgZnVuY3Rpb25hbCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KKworQklHOgorCS0gZXhpc3RpbmcgQVBJIGlzICgvZGV2L3RhcmFuZykgc2hvdWxkIGJlIHJlcGxhY2VkCisJICBJcyBpdCBwb3NzaWJsZSB0byB1c2Ugc2FtZSBBUEkgYXMgSW50ZWwgV2ltYXggc3RhY2sgYW5kCisJICBoYXZlIHNhbWUgdXNlciBsZXZlbCBjb21wb25lbnRzLgorCS0gUW9zIGFuZCBxdWV1ZSBtb2RlbCBpcyBub24tc3RhbmRhcmQgYW5kIGluZmxleGlibGUuCisJICBVc2UgZXhpc3RpbmcgVEMgUW9zPworCiBUT0RPOgorCS0gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGJvYXJkIC0gZWxpbWluYXRlIGdsb2JhbCB2YXJpYWJsZXMKKwktIHJlbW92ZSBkZXZlbG9wZXIgZGVidWcgQkNNX0RFQlVHKCkgbWFjcm9zCisJICBhZGQgYSBsaW1pdGVkIG51bWJlciBvZiBtZXNzYWdlcyB0aHJvdWdoIG5ldGlmX21zZygpCiAJLSBmaXggbm9uLXN0YW5kYXJkIGtlcm5lbCBzdHlsZQotCS0gc3BhcnNlIHdhcm5pbmdzCiAJLSBjaGVja3BhdGNoIHdhcm5pbmdzCi0gICAJLSByZW1vdmUgY29tcGF0aWFibGl0eSBjb2RlIGZvciBvbGRlciBrZXJuZWxzCi0JLSByZW1vdmUgI2lmZGVmJ3MKLQktIGZpeCBib2d1cyBkZXZpY2UgbmFtZWluZyBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIChzZWUgYmNtX25vdGlmeV9ldmVudCkKLQktIGZpeCB1c2Ugb2YgZmlsZSBJL08gdG8gbG9hZCBjb25maWcKLQktIHJlcXVlc3QgZmlybXdhcmUKLQktIHVwZGF0ZSB0byBjdXJyZW50IG5ldHdvcmsgZGV2aWNlIEFQSQotCS0gbWVyZ2Ugc29tZSBmaWxlcyB0b2dldGhlcgorCS0gdXNlIHJlcXVlc3QgZmlybXdhcmUKKwktIGZpeCB1c2Ugb2YgZmlsZSBJL08gdG8gbG9hZCBjb25maWcgd2l0aCBiZXR0ZXIgQVBJCisJLSBtZXJnZSBzb21lIGZpbGVzIHRvZ2V0aGVyPwogCS0gY2xlYW51cC9lbGltaW5hdGUgZGVidWcgbWVzc2FnZXMKIAotCS0gaW50ZWdyYXRlIHdpdGggZXhpc3RpbmcgV2ltYXggc3RhY2s/CisKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9UcmFuc21pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UcmFuc21pdC5jCmluZGV4IDEyZjllMTMuLjBmNzAwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHJhbnNtaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1RyYW5zbWl0LmMKQEAgLTYsNyArNiw3IEBACiBkaWdyYXBoIHRyYW5zbWl0MSB7CiBub2RlW3NoYXBlPWJveF0KIGVkZ2Vbd2VpZ2h0PTU7Y29sb3I9cmVkXQotYmNtX3RyYW5zbWl0LT5yZXBseV90b19hcnBfcmVxdWVzdFtsYWJlbD0iQVJQIl0KKwogYmNtX3RyYW5zbWl0LT5HZXRQYWNrZXRRdWV1ZUluZGV4W2xhYmVsPSJJUCBQYWNrZXQiXQogR2V0UGFja2V0UXVldWVJbmRleC0+SXBWZXJzaW9uNFtsYWJlbD0iSVBWNCJdCiBHZXRQYWNrZXRRdWV1ZUluZGV4LT5JcFZlcnNpb242W2xhYmVsPSJJUFY2Il0KQEAgLTM1LDE2OSArMzUsMTYgQEAKIAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRnVuY3Rpb24gICAgLQliY21fdHJhbnNtaXQoKQotKgotKiBEZXNjcmlwdGlvbiAtIFRoaXMgaXMgdGhlIG1haW4gdHJhbnNtaXQgZnVuY3Rpb24gZm9yIG91ciB2aXJ0dWFsCi0qCQkJCWludGVyZmFjZSh2ZXRoMCkuIEl0IGhhbmRsZXMgdGhlIEFSUCBwYWNrZXRzLiBJdAotKgkJCQljbG9uZXMgdGhpcyBwYWNrZXQgYW5kIHRoZW4gUXVldWUgaXQgdG8gYSBzdWl0YWJsZQotKiAJCSAJCVF1ZXVlLiBUaGVuIGNhbGxzIHRoZSB0cmFuc21pdF9wYWNrZXQoKS4KLSoKLSogUGFyYW1ldGVyICAgLQkgc2tiIC0gUG9pbnRlciB0byB0aGUgc29ja2V0IGJ1ZmZlciBzdHJ1Y3R1cmUKLSoJCQkJIGRldiAtIFBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgbmV0IGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJucyAgICAgLQkgemVybyAoc3VjY2Vzcykgb3IgLXZlIHZhbHVlIChmYWlsdXJlKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1JTlQgYmNtX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIAkJLyoqPCBza2IgKi8KLQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAJLyoqPCBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQkJCQkJKQotewotCVBNSU5JX0FEQVBURVIgICAgICAJQWRhcHRlciA9IE5VTEw7Ci0JVVNIT1JUCQkJCXFpbmRleD0wOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCVVJTlQJCXBrdF90eXBlID0gMDsKLQlVSU5UIAkJY2FsbHRyYW5zbWl0ID0gMDsKLQotCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuJXM9PT09PlxuIixfX0ZVTkNUSU9OX18pOwotCi0JbWVtc2V0KCZ0diwgMCwgc2l6ZW9mKHR2KSk7Ci0JLyogQ2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlcnMgKi8KLQlpZihza2IgPT0gTlVMTCB8fCBkZXY9PU5VTEwpCi0JewotCSAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdvdCBOVUxMIHNrYiBvciBkZXZcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7Ci0JaWYoIUFkYXB0ZXIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICJHb3QgSW52YWxpZCBBZGFwdGVyXG4iKTsKLSAgCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSB8fCAhQWRhcHRlci0+TGlua1VwU3RhdHVzKQotCXsKLQkJaWYoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgewotCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQl9Ci0JCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUGFja2V0IHNpemUgOiAlZFxuIiwgc2tiLT5sZW4pOwotCi0JLypBZGQgRXRoZXJuZXQgQ1MgY2hlY2sgaGVyZSovCi0JaWYoQWRhcHRlci0+VHJhbnNmZXJNb2RlID09IElQX1BBQ0tFVF9PTkxZX01PREUgKQotCXsKLSAgICAgICAgcGt0X3R5cGUgPSBudG9ocygqKFBVU0hPUlQpKHNrYi0+ZGF0YSArIDEyKSk7Ci0JCS8qIEdldCB0aGUgcXVldWUgaW5kZXggd2hlcmUgdGhlIHBhY2tldCBpcyB0byBiZSBxdWV1ZWQgKi8KLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR2V0dGluZyB0aGUgUXVldWUgSW5kZXguLi4uLiIpOwotCi0JCXFpbmRleCA9IEdldFBhY2tldFF1ZXVlSW5kZXgoQWRhcHRlcixza2IpOwotCi0JCWlmKChTSE9SVClJTlZBTElEX1FVRVVFX0lOREVYPT0oU0hPUlQpcWluZGV4KQotCQl7Ci0JCQlpZihwa3RfdHlwZSA9PSBFVEhfQVJQX0ZSQU1FKQotCQkJewotCQkJCS8qCi0JCQkJUmVwbHkgZGlyZWN0bHkgdG8gQVJQIHJlcXVlc3QgcGFja2V0Ci0JCQkJQVJQIFNwb29maW5nIG9ubHkgaWYgTk8gRVRIIENTIHJ1bGUgbWF0Y2hlcyBmb3IgaXQKLQkJCQkqLwotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCJBUlAgT1BDT0RFID0gJTAyeCIsCi0KLSAgICAgICAgICAgICAgICAoKihQVUNIQVIpKHNrYi0+ZGF0YSArIDIxKSkpOwotCi0gICAgICAgICAgICAgICAgcmVwbHlfdG9fYXJwX3JlcXVlc3Qoc2tiKTsKLQotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCJBZnRlciByZXBseV90b19hcnBfcmVxdWVzdCBcbiIpOwotCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0gICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLAotICAgIAkJCSJJbnZhbGlkIHF1ZXVlIGluZGV4LCBkcm9wcGluZyBwa3RcbiIpOwotCi0JCQkJYmNtX2tmcmVlX3NrYihza2IpOwotCQkJfQotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotICAgICAgICB9Ci0KLQkJaWYoQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0ID49IFNGX01BWF9BTExPV0VEX1BBQ0tFVFNfVE9fQkFDS1VQKQotCQl7Ci0JCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7Ci0JCQliY21fa2ZyZWVfc2tiKHNrYik7Ci0JCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQotCQkvKiBOb3cgRW5xdWV1ZSB0aGUgcGFja2V0ICovCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiYmNtX3RyYW5zbWl0IEVucXVldWVpbmcgdGhlIFBhY2tldCBUbyBRdWV1ZSAlZCIscWluZGV4KTsKLQkJc3Bpbl9sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKLQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRCeXRlc09uSG9zdCArPSBza2ItPmxlbjsKLQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0Kys7Ci0KLQkJKigoQl9VSU5UMzIgKilza2ItPmNiICsgU0tCX0NCX0xBVEVOQ1lfT0ZGU0VUICkgPSBqaWZmaWVzOwotCQlFTlFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uRmlyc3RUeFF1ZXVlLAotICAJICAgICAgICAgICAgICAgICAgQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5MYXN0VHhRdWV1ZSwgc2tiKTsKLQkJYXRvbWljX2luYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKLQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwiRU5ROiBcbiIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUGt0IExlbiA9ICVkLCBzZWM6ICVsZCwgdXNlYzogJWxkXG4iLAotCQkoc2tiLT5sZW4tRVRIX0hMRU4pLCB0di50dl9zZWMsIHR2LnR2X3VzZWMpOwotCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJc3Bpbl9sb2NrKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0JCWlmKEFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9PSAwKQotCQl7Ci0JCQlBZGFwdGVyLT50eHRyYW5zbWl0X3J1bm5pbmcgPSAxOwotCQkJY2FsbHRyYW5zbWl0ID0gMTsKLQkJfQotCQllbHNlCi0JCQljYWxsdHJhbnNtaXQgPSAwOwotCi0JCXNwaW5fdW5sb2NrKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0jZW5kaWYKLQkJaWYoY2FsbHRyYW5zbWl0ID09IDEpCi0JCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOwotCQllbHNlCi0JCXsKLQkJCWlmKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpCi0JCQl7Ci0JCQkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJCQl2aXJ0dWFsX21haWxfYm94X2ludGVycnVwdCgpOwotI2VuZGlmCi0JCQkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwotCQkJfQotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICI8PT09PSIpOwotCX0KLQllbHNlCi0JCWJjbV9rZnJlZV9za2Ioc2tiKTsKLQotICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KIAogLyoqCiBAaW5ncm91cCBjdHJsX3BrdF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gZGlzcGF0Y2hlcyBjb250cm9sIHBhY2tldCB0byB0aGUgaC93IGludGVyZmFjZQogQHJldHVybiB6ZXJvKHN1Y2Nlc3MpIG9yIC12ZSB2YWx1ZShmYWlsdXJlKQogKi8KLUlOVCBTZW5kQ29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQkJCWNoYXIgKnBDb250cm9sUGFja2V0LyoqPENvbnRyb2wgUGFja2V0Ki8KLQkJCQkJCQkpCitJTlQgU2VuZENvbnRyb2xQYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjaGFyICpwQ29udHJvbFBhY2tldCkKIHsKLQlQTEVBREVSIFBMZWFkZXIgPSBOVUxMOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCW1lbXNldCgmdHYsIDAsIHNpemVvZih0dikpOworCVBMRUFERVIgUExlYWRlciA9IChQTEVBREVSKXBDb250cm9sUGFja2V0OwogCi0KLQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIj09PT09PT09PiIpOwotCi0JUExlYWRlcj0oUExFQURFUilwQ29udHJvbFBhY2tldDsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJUeCIpOwogCWlmKCFwQ29udHJvbFBhY2tldCB8fCAhQWRhcHRlcikKIAl7CkBAIC0yMDgsMTIgKzU1LDYgQEAKIAkJKChQTGVhZGVyLT5QTGVuZ3RoLTEpL01BWF9ERVZJQ0VfREVTQ19TSVpFKSsxKSkKICAgICB7CiAgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIk5PIEZSRUUgREVTQ1JJUFRPUlMgVE8gU0VORCBDT05UUk9MIFBBQ0tFVCIpOwotICAgICAgIAlpZihBZGFwdGVyLT5iY21famlmZmllcyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgIAlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJVUERBVEVEIFRJTUUoaGV4KTogJWx1IiwKLQkJCQlBZGFwdGVyLT5iY21famlmZmllcyk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogICAgIH0KIApAQCAtMjI0LDc2ICs2NSwzMyBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIkxlYWRlciBMZW5ndGg6ICV4IixQTGVhZGVyLT5QTGVuZ3RoKTsKIAlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKIAkJcmV0dXJuIDA7Ci0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCisKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEoQWRhcHRlcikpCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIFBGWCAidHggY29udHJvbDogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMSwgcENvbnRyb2xQYWNrZXQsIFBMZWFkZXItPlBMZW5ndGggKyBMRUFERVJfU0laRSwgMCk7CisKIAlBZGFwdGVyLT5pbnRlcmZhY2VfdHJhbnNtaXQoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJCQlwQ29udHJvbFBhY2tldCwgKFBMZWFkZXItPlBMZW5ndGggKyBMRUFERVJfU0laRSkpOwotI2Vsc2UKLQl0eF9wa3RzX3RvX2Zpcm13YXJlKHBDb250cm9sUGFja2V0LChQTGVhZGVyLT5QTGVuZ3RoICsgTEVBREVSX1NJWkUpLDEpOwogCi0JaWYoUExlYWRlci0+U3RhdHVzPT1JRExFX01FU1NBR0UpCi0JewotCQlpZigoKENPTlRST0xfTUVTU0FHRSopUExlYWRlciktPnN6RGF0YVswXSA9PSBHT19UT19JRExFX01PREVfUEFZTE9BRCAmJgotCQkoKENPTlRST0xfTUVTU0FHRSopUExlYWRlciktPnN6RGF0YVsxXSA9PSBUQVJHRVRfQ0FOX0dPX1RPX0lETEVfTU9ERSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiSWRsZSBNb2RlIEFjayBTZW50IHRvIHRoZSBEZXZpY2VcbiIpOwotICAgICAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiSG9zdCBFbnRlcmluZyBpbnRvIElkbGUgTW9kZVxuIik7Ci0JCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIklkbGVNb2RlIE1zZyBzZW50IHRvIGYvdyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgIT0gVFJVRSkKLQkJCXsKLQkJCQlBZGFwdGVyLT5JZGxlTW9kZSA9IFRSVUU7Ci0JCQkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFIDsKLQkJCX0KLQkJfQotCX0KLQlpZigoUExlYWRlci0+U3RhdHVzID09IExJTktfVVBfQ09OVFJPTF9SRVEpICYmCi0JCSgoUFVDSEFSKXBDb250cm9sUGFja2V0KVtzaXplb2YoTEVBREVSKV0gPT0gTElOS19VUF9BQ0sgJiYKLQkJKChQVUNIQVIpcENvbnRyb2xQYWNrZXQpW3NpemVvZihMRUFERVIpKzFdID09Ci0JCQkJCQkJCUxJTktfU0hVVERPV05fUkVRX0ZST01fRklSTVdBUkUgICYmCi0JCSgoUFVDSEFSKXBDb250cm9sUGFja2V0KVtzaXplb2YoTEVBREVSKSsyXSA9PSBTSFVURE9XTl9BQ0tfRlJPTV9EUklWRVIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJTaHV0IERvd24gQUNLIFNlbnQgYW5kIEhvc3QgZW50ZXJpbmcgU2h1dCBTdGF0ZSBcbiIpOwotCQlpZihBZGFwdGVyLT5iRG9TdXNwZW5kICE9IFRSVUUpCi0JCXsKLQkJCUFkYXB0ZXItPmJTaHV0U3RhdHVzID0gVFJVRTsKLQkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKLQkJCUFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSA9IEZBTFNFOwotCQl9Ci0KLQl9Ci0jZW5kaWYKLQotCSgoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHMudHhfcGFja2V0cysrOwotCSgoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHMudHhfYnl0ZXMrPQotCQkJUExlYWRlci0+UExlbmd0aDsKIAlhdG9taWNfZGVjKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYyk7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiPD09PT09PT09PSIpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KLXN0YXRpYwlMRUFERVIgTGVhZGVyPXswfTsKKwogLyoqCiBAaW5ncm91cCB0eF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gZGVzcGF0Y2hlcyB0aGUgSVAgcGFja2V0cyB3aXRoIHRoZSBnaXZlbiB2Y2lkCiB0byB0aGUgdGFyZ2V0IHZpYSB0aGUgaG9zdCBoL3cgaW50ZXJmYWNlLgogQHJldHVybiAgemVybyhzdWNjZXNzKSBvciAtdmUgdmFsdWUoZmFpbHVyZSkKICovCi1JTlQgU2V0dXBOZXh0U2VuZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0LCAvKio8ZGF0YSBidWZmZXIqLwotCQkJCQlVU0hPUlQgVmNpZCkJCQkvKio8VkNJRCBmb3IgdGhpcyBwYWNrZXQqLworSU5UIFNldHVwTmV4dFNlbmQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAgc3RydWN0IHNrX2J1ZmYgKlBhY2tldCwgVVNIT1JUIFZjaWQpCiB7CiAJaW50CQlzdGF0dXM9MDsKLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotCWludCBkb250ZnJlZSA9IDA7Ci0jZW5kaWYKIAlCT09MRUFOIGJIZWFkZXJTdXByZXNzaW9uRW5hYmxlZCA9IEZBTFNFOwogCUJfVUlOVDE2ICAgICAgICAgICAgdWlDbGFzc2lmaWVyUnVsZUlEOwotCWludCBRdWV1ZUluZGV4ID0gTk9fT0ZfUVVFVUVTICsgMTsKKwl1MTYJUXVldWVJbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhQYWNrZXQpOworCUxFQURFUiBMZWFkZXI9ezB9OwogCi0JaWYoIUFkYXB0ZXIgfHwgIVBhY2tldCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiR290IE5VTEwgQWRhcHRlciBvciBQYWNrZXQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmKFBhY2tldC0+bGVuID4gTUFYX0RFVklDRV9ERVNDX1NJWkUpCiAJewogCQlzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTMwMiwxNCArMTAwLDEwIEBACiAKIAkvKiBHZXQgdGhlIENsYXNzaWZpZXIgUnVsZSBJRCAqLwogCXVpQ2xhc3NpZmllclJ1bGVJRCA9ICooKFVJTlQzMiopIChQYWNrZXQtPmNiKStTS0JfQ0JfQ0xBU1NJRklDQVRJT05fT0ZGU0VUKTsKLQlRdWV1ZUluZGV4ID0gU2VhcmNoVmNpZCggQWRhcHRlcixWY2lkKTsKLQlpZihRdWV1ZUluZGV4IDwgTk9fT0ZfUVVFVUVTKQotCXsKLQkJYkhlYWRlclN1cHJlc3Npb25FbmFibGVkID0KLQkJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLmJIZWFkZXJTdXBwcmVzc2lvbkVuYWJsZWQ7Ci0JCWJIZWFkZXJTdXByZXNzaW9uRW5hYmxlZCA9Ci0JCQliSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgJiBBZGFwdGVyLT5iUEhTRW5hYmxlZDsKLQl9CisKKwliSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgPSBBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS5iSGVhZGVyU3VwcHJlc3Npb25FbmFibGVkCisJCSYgQWRhcHRlci0+YlBIU0VuYWJsZWQ7CisKIAlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKIAkJewogCQlzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTMyNywxNSArMTIxLDEwIEBACiAKIAlMZWFkZXIuVmNpZAk9IFZjaWQ7CiAKLSAgICBpZihUQ1BfQUNLID09ICooKFVJTlQzMiopIChQYWNrZXQtPmNiKSArIFNLQl9DQl9UQ1BBQ0tfT0ZGU0VUICkpCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIlNlbmRpbmcgVENQIEFDS1xuIik7CisJaWYoVENQX0FDSyA9PSAqKChVSU5UMzIqKSAoUGFja2V0LT5jYikgKyBTS0JfQ0JfVENQQUNLX09GRlNFVCApKQogCQlMZWFkZXIuU3RhdHVzID0gTEVBREVSX1NUQVRVU19UQ1BfQUNLOwotCX0KIAllbHNlCi0JewogCQlMZWFkZXIuU3RhdHVzID0gTEVBREVSX1NUQVRVUzsKLQl9CiAKIAlpZihBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS5iRXRoQ1NTdXBwb3J0KQogCXsKQEAgLTM1MSw2OCArMTQwLDUzIEBACiAJCXNrYl9wdXNoKFBhY2tldCwgTEVBREVSX1NJWkUpOwogCQltZW1jcHkoUGFja2V0LT5kYXRhLCAmTGVhZGVyLCBMRUFERVJfU0laRSk7CiAJfQotCiAJZWxzZQogCXsKIAkJTGVhZGVyLlBMZW5ndGggPSBQYWNrZXQtPmxlbiAtIEVUSF9ITEVOOwogCQltZW1jcHkoKExFQURFUiopc2tiX3B1bGwoUGFja2V0LCAoRVRIX0hMRU4gLSBMRUFERVJfU0laRSkpLCAmTGVhZGVyLCBMRUFERVJfU0laRSk7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJQYWNrZXQtPmxlbiA9ICVkIiwgUGFja2V0LT5sZW4pOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVmNpZCA9ICVkIiwgVmNpZCk7Ci0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlzdGF0dXMgPSBBZGFwdGVyLT5pbnRlcmZhY2VfdHJhbnNtaXQoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJUGFja2V0LT5kYXRhLCAoTGVhZGVyLlBMZW5ndGggKyBMRUFERVJfU0laRSkpOwotI2Vsc2UKLQlzdGF0dXMgPSB0eF9wa3RzX3RvX2Zpcm13YXJlKFBhY2tldCxQYWNrZXQtPmxlbiwwKTsKLSNlbmRpZgogCWlmKHN0YXR1cykKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVHggRmFpbGVkLi5cbiIpOworCQkrK0FkYXB0ZXItPmRldi0+c3RhdHMudHhfZXJyb3JzOworCQlpZiAobmV0aWZfbXNnX3R4X2VycihBZGFwdGVyKSkKKwkJCXByX2luZm8oUEZYICIlczogdHJhbnNtaXQgZXJyb3IgJWRcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSwKKwkJCQlzdGF0dXMpOwogCX0KIAllbHNlCiAJeworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKEFkYXB0ZXItPmRldiwgUXVldWVJbmRleCk7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpVG90YWxUeEJ5dGVzICs9IExlYWRlci5QTGVuZ3RoOwotCQlhdG9taWNfYWRkKExlYWRlci5QTGVuZ3RoLCAmQWRhcHRlci0+R29vZFR4Qnl0ZUNvdW50KTsKLQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhUb3RhbFBhY2tldENvdW50KTsKLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotICAgIGRvbnRmcmVlID0gMTsKLSNlbmRpZgotCX0KIAotCWF0b21pY19kZWMoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKTsKKwkJdHhxLT50eF9ieXRlcyArPSBMZWFkZXIuUExlbmd0aDsKKwkJKyt0eHEtPnR4X3BhY2tldHM7CiAKLWVyckV4aXQ6Ci0KLQlpZihTVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCi0JewogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aUN1cnJlbnRUb2tlbkNvdW50IC09IExlYWRlci5QTGVuZ3RoIDw8IDM7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpU2VudEJ5dGVzICs9IChQYWNrZXQtPmxlbik7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpU2VudFBhY2tldHMrKzsKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0uTnVtT2ZQYWNrZXRzU2VudCsrOwogCiAJCWF0b21pY19kZWMoJkFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpUGVyU0ZUeFJlc291cmNlQ291bnQpOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCWlmKGF0b21pY19yZWFkKCZBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVBlclNGVHhSZXNvdXJjZUNvdW50KSA8IDApCi0JCXsKLQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpUGVyU0ZUeFJlc291cmNlQ291bnQsIDApOwotCQl9Ci0jZW5kaWYKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0udWlUaGlzUGVyaW9kU2VudEJ5dGVzICs9IExlYWRlci5QTGVuZ3RoOwogCX0KIAorCWF0b21pY19kZWMoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKTsKIAotI2lmZGVmIEdETUFfSU5URVJGQUNFCi0gIGlmKCFkb250ZnJlZSl7Ci0gIAliY21fa2ZyZWVfc2tiKFBhY2tldCk7Ci0gIH0KLSNlbHNlCi0gIAliY21fa2ZyZWVfc2tiKFBhY2tldCk7Ci0jZW5kaWYKK2VyckV4aXQ6CisKKwlkZXZfa2ZyZWVfc2tiKFBhY2tldCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCB0eF9wZW5kaW5nKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3sKKwlyZXR1cm4gKGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKQorCQkmJiBNSU5JTVVNX1BFTkRJTkdfREVTQ1JJUFRPUlMgPCBhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKQorCQl8fCBBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCB8fCAoMSA9PSBBZGFwdGVyLT5kb3dubG9hZEREUik7Cit9CisKIC8qKgogQGluZ3JvdXAgdHhfZnVuY3Rpb25zCiBUcmFuc21pdCB0aHJlYWQKQEAgLTQyMCw1NyArMTk0LDI2IEBACiBpbnQgdHhfcGt0X2hhbmRsZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyICAvKio8IHBvaW50ZXIgdG8gYWRhcHRlciBvYmplY3QqLwogCQkJCSkKIHsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlpbnQgc3RhdHVzID0gMDsKLSNlbmRpZgogCi0JVUlOVCBjYWxsdHJhbnNtaXQgPSAxOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkVudHJpbmcgdG8gd2FpdCBmb3Igc2lnbmFsIGZyb20gdGhlIGludGVycnVwdCBzZXJ2aWNlIHRocmVhZCFBZGFwdGVyID0gJXAiLEFkYXB0ZXIpOwotCi0KLQl3aGlsZSgxKQotCXsKLQkJaWYoQWRhcHRlci0+TGlua1VwU3RhdHVzKXsKKwl3aGlsZSghIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkvKiBGSVhNRSAtIHRoZSB0aW1lb3V0IGxvb2tzIGxpa2Ugd29ya2Fyb3VuZCBmb3IgcmFjZXkgdXNhZ2Ugb2YgVHhQa3RBdmFpbCAqLworCQlpZihBZGFwdGVyLT5MaW5rVXBTdGF0dXMpCiAJCQl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUsCi0JCQkJKChhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkgJiYKLQkJCQkoTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTIDwKLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKSAmJgotCQkJCShBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBGQUxTRSkpKSB8fAotCQkJCSgxID09IEFkYXB0ZXItPmRvd25sb2FkRERSKSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJCQl8fCAoVFJVRSA9PSBBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQpCi0jZW5kaWYKLQkJCQksIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJfQotCQllbHNlewotCQkJd2FpdF9ldmVudChBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSwKLQkJCQkoKGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKSAmJgotCQkJCShNSU5JTVVNX1BFTkRJTkdfREVTQ1JJUFRPUlMgPAotCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpICYmCi0JCQkJKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IEZBTFNFKSkpIHx8Ci0JCQkJKDEgPT0gQWRhcHRlci0+ZG93bmxvYWRERFIpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKQotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCQkJCXx8IChUUlVFID09IEFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCkKLSNlbmRpZgotCQkJCSk7Ci0JCX0KKwkJCQkJICAgdHhfcGVuZGluZyhBZGFwdGVyKSwgbXNlY3NfdG9famlmZmllcygxMCkpOworCQllbHNlCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUsCisJCQkJCQkgdHhfcGVuZGluZyhBZGFwdGVyKSk7CiAKLQkJaWYoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJFeGl0aW5nIHRoZSB0eCB0aHJlYWQuLlxuIik7Ci0JCQlBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0gTlVMTDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKKwkJaWYgKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQorCQkJYnJlYWs7CiAKIAkJaWYoQWRhcHRlci0+ZG93bmxvYWRERFIgPT0gMSkKIAkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRG93bmxvYWRpbmcgRERSIFNldHRpbmdzXG4iKTsKIAkJCUFkYXB0ZXItPmRvd25sb2FkRERSICs9MTsKIAkJCXN0YXR1cyA9IGRvd25sb2FkX2Rkcl9zZXR0aW5ncyhBZGFwdGVyKTsKIAkJCWlmKHN0YXR1cykKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJERFIgRE9XTkxPQUQgRkFJTEVEIVxuIik7CisJCQkJcHJfZXJyKFBGWCAiRERSIERPV05MT0FEIEZBSUxFRCEgJWRcbiIsIHN0YXR1cyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC00ODksNyArMjMyLDYgQEAKIAkJCQl1cGRhdGVfcGVyX3NmX2Rlc2NfY250cyhBZGFwdGVyKTsKIAkJCX0KIAkJfQotI2VuZGlmCiAKIAkJaWYoIGF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykgJiYKIAkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPT0gU1lOQ19VUF9SRVFVRVNUICYmCkBAIC01MDcsNDkgKzI0OSwxMiBAQAogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwogCQl9CiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCQlzcGluX2xvY2tfYmgoJkFkYXB0ZXItPnR4dHJhbnNtaXRsb2NrKTsKLQkJaWYoQWRhcHRlci0+dHh0cmFuc21pdF9ydW5uaW5nID09IDApCi0JCXsKLQkJCUFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9IDE7Ci0JCQljYWxsdHJhbnNtaXQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCWNhbGx0cmFuc21pdCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2JoKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0jZW5kaWYKLQotCQlpZihjYWxsdHJhbnNtaXQpCi0JCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOworCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOwogCiAJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDApOwogCX0KKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkV4aXRpbmcgdGhlIHR4IHRocmVhZC4uXG4iKTsKKwlBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KLQotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi1leHRlcm4gUE1JTklfQURBUFRFUiBwc0FkYXB0ZXJ0ZXN0Owotdm9pZCAgdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQodm9pZCkKLXsKLQotI2lmbmRlZiBHRE1BX0lOVEVSRkFDRQotCVBVSU5UIHB0ciA9ICAoUFVJTlQpQ1BFX1ZJUlRVQUxfTUFJTEJPWF9SRUc7Ci0JVUlOVCBpbnR2YWwgPSAoVUlOVCkoKCpwdHIgJiAweEZGMDApID4+IDgpOwotCWlmIChpbnR2YWwgIT0gMCkKLQl7Ci0JCWF0b21pY19zZXQoJnBzQWRhcHRlcnRlc3QtPkN1cnJOdW1GcmVlVHhEZXNjLAlpbnR2YWwpOwotCQlhdG9taWNfc2V0ICgmcHNBZGFwdGVydGVzdC0+dWlNQnVwZGF0ZSwgVFJVRSk7Ci0KLQkJLy9tYWtlIGl0IHRvIDAKLQkJKnB0ciA9ICpwdHIgJiAweGZmZmYwMGZmOwotCX0KLSNlbmRpZgotfQotdW5zaWduZWQgaW50IHRvdGFsX3R4X3BrdHNfcGVuZGluZyh2b2lkKQotewotCXJldHVybiBhdG9taWNfcmVhZCgmcHNBZGFwdGVydGVzdC0+VG90YWxQYWNrZXRDb3VudCk7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vY250cmxfU2lnbmFsaW5nSW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2NudHJsX1NpZ25hbGluZ0ludGVyZmFjZS5oCmluZGV4IDRjYmUzMDAuLjg5MDc3ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vY250cmxfU2lnbmFsaW5nSW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9jbnRybF9TaWduYWxpbmdJbnRlcmZhY2UuaApAQCAtMiwxOSArMiw2IEBACiAjZGVmaW5lIENOVFJMX1NJR05BTElOR19JTlRFUkZBQ0VfCiAKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLQotI2luY2x1ZGUgPG1hY19jb21tb24uaD4KLSNpbmNsdWRlIDxtc2dfRHNhLmg+Ci0jaW5jbHVkZSA8bXNnX0RzYy5oPgotI2luY2x1ZGUgPG1zZ19Ec2QuaD4KLSNpbmNsdWRlIDxzY2hfZGVmaW5pdGlvbnMuaD4KLXVzaW5nIG5hbWVzcGFjZSBCZWNlZW07Ci0jaWZkZWYgRU5BQkxFX0NPUlJJR0VORFVNMl9VUERBVEUKLWV4dGVybiBCX1VJTlQzMiBnX3UzMkNvcnIyTWFjRmxhZ3M7Ci0jZW5kaWYKLQotI2Vsc2UKIAogCiAjZGVmaW5lIERTQV9SRVEgMTEKQEAgLTI4LDcgKzE1LDYgQEAKICNkZWZpbmUgRFNEX0FDSyAxOQogI2RlZmluZSBNQVhfQ0xBU1NJRklFUlNfSU5fU0YgIDQKIAotI2VuZGlmCiAKICNkZWZpbmUgTUFYX1NUUklOR19MRU4gMjAKICNkZWZpbmUgTUFYX1BIU19MRU5HVEhTIDI1NQpAQCAtNTcsMzcgKzQzLDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3N0cnVjdHVyZSBEZWZpbml0aW9ucy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vIFxicmllZiBjbGFzcyBjQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZQotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLWNsYXNzIENDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0l7Ci0JcHVibGljOgotCQkvLy8gXGJyaWVmIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQlDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJKCk6Ci0JCXU4Q2xhc3NpZmllclJ1bGVQcmlvcml0eShtQ2xhc3NpZmllclJ1bGVQcmlvcml0eSksCi0JCXU4SVBUeXBlT2ZTZXJ2aWNlTGVuZ3RoKG1JUFR5cGVPZlNlcnZpY2UpLAotCQl1OFByb3RvY29sKG1Qcm90b2NvbCksCi0JCXU4SVBNYXNrZWRTb3VyY2VBZGRyZXNzTGVuZ3RoKDApLAotCQl1OElQRGVzdGluYXRpb25BZGRyZXNzTGVuZ3RoKDApLAotCQl1OFByb3RvY29sU291cmNlUG9ydFJhbmdlTGVuZ3RoKDApLAotCQl1OFByb3RvY29sRGVzdFBvcnRSYW5nZUxlbmd0aCgwKSwKLQkJdThFdGhlcm5ldERlc3RNYWNBZGRyZXNzTGVuZ3RoKDApLAotCQl1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc0xlbmd0aCgwKSwKLQkJdThFdGhlcnR5cGVMZW5ndGgoMCksCi0JCXUxNlVzZXJQcmlvcml0eShtVXNlclByaW9yaXR5KSwKLQkJdTE2VkxBTklEKG1WTEFOSUQpLAotCQl1OEFzc29jaWF0ZWRQSFNJKG1Bc3NvY2lhdGVkUEhTSSksCi0JCXUxNlBhY2tldENsYXNzaWZpY2F0aW9uUnVsZUluZGV4KG1QYWNrZXRDbGFzc2lmaWVyUnVsZUluZGV4KSwKLQkJdThWZW5kb3JTcGVjaWZpY0NsYXNzaWZpZXJQYXJhbUxlbmd0aChtVmVuZG9yU3BlY2lmaWNDbGFzc2lmaWVyUGFyYW1MZW5ndGgpLAotCQl1OElQdjZGbG93TGFibGVMZW5ndGgobUlQdjZGbG93TGFibGVMZW5ndGgpLAotCQl1OENsYXNzaWZpZXJBY3Rpb25SdWxlKG1DbGFzc2lmaWVyQWN0aW9uUnVsZSkKLQotCQl7fQotICAgICAgICAgICAgICB2b2lkIFJlc2V0KCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJKCk7Ci0gICAgICAgICAgICAgIH0KLSNlbHNlCiBzdHJ1Y3QgX3N0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJewotI2VuZGlmCiAKIAkvKiogIDE2Yml0IFVzZXJQcmlvcml0eSBPZiBUaGUgU2VydmljZSBGbG93Ki8KICAgICBCX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIHUxNlVzZXJQcmlvcml0eTsKQEAgLTE0NSwyOSArMTAxLDEwIEBACiAgICAgQl9VSU5UOAkJCQkJCQl1OENsYXNzaWZpZXJBY3Rpb25SdWxlOwogICAgIEJfVUlOVDE2CQkJCQkJCXUxNlZhbGlkaXR5Qml0TWFwOwogfTsKLSNpZm5kZWYgQkVDRUVNX1RBUkdFVAogdHlwZWRlZiBzdHJ1Y3QgX3N0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJIENDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0ksc3RDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0ksICpwc3RDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0k7Ci0jZW5kaWYKIAogLy8vIFxicmllZiBjbGFzcyBDUGhzUnVsZVNJCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotY2xhc3MgQ1Boc1J1bGVTSXsKLQlwdWJsaWM6Ci0JCS8vLyBcYnJpZWYgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcwotCQlDUGhzUnVsZVNJKCk6Ci0JCQl1OFBIU0kobVBIU0kpLAotCQkJdThQSFNGTGVuZ3RoKDApLAotCQkJdThQSFNNTGVuZ3RoKDApLAotCQkJdThQSFNTKG1QSFNTKSwKLQkJCXU4UEhTVihtUEhTViksCi0JCQl1OFZlbmRvclNwZWNpZmljUEhTUGFyYW1zTGVuZ3RoKG1WZW5kb3JTcGVjaWZpY1BIU1BhcmFtTGVuZ3RoKXt9Ci0gICAgICAgICAgICAgICAgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAJCUNQaHNSdWxlU0koKTsKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX3N0UGhzUnVsZVNJIHsKLSNlbmRpZgogCS8qKiAgOGJpdCBQSFMgSW5kZXggT2YgVGhlIFNlcnZpY2UgRmxvdyovCiAgICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBIU0k7CiAJLyoqICBQSFNGIExlbmd0aCBPZiBUaGUgU2VydmljZSBGbG93Ki8KQEAgLTE4OCwzMSArMTI1LDExIEBACiAgICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFZlbmRvclNwZWNpZmljUEhTUGFyYW1zW1ZFTkRPUl9QSFNfUEFSQU1fTEVOR1RIXTsKIAogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQYWRkaW5nWzJdOwotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLX07Ci0jZWxzZQogfXN0UGhzUnVsZVNJLCpwc3RQaHNSdWxlU0k7CiB0eXBlZGVmIHN0UGhzUnVsZVNJIENQaHNSdWxlU0k7Ci0jZW5kaWYKIAogLy8vIFxicmllZiBzdHJ1Y3R1cmUgY0NvbnZlcmdlbmNlU0xUeXBlcwotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLWNsYXNzIENDb252ZXJnZW5jZVNMVHlwZXN7Ci0JcHVibGljOgotCQkvLy8gXGJyaWVmIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQkJQ0NvbnZlcmdlbmNlU0xUeXBlcygpOgotCQl1OENsYXNzZmllckRTQ0FjdGlvbihtQ2xhc3NpZmllckRTQ0FjdGlvbiksCi0JCXU4UGhzRFNDQWN0aW9uCShtUGhzRFNDQWN0aW9uKQotCQl7fQotICAgICAgICAgICAgICB2b2lkIFJlc2V0KCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDQ29udmVyZ2VuY2VTTFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLlJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNQaHNSdWxlLlJlc2V0KCk7Ci0gICAgICAgICAgICAgIH0KLSNlbHNlCiBzdHJ1Y3QgX3N0Q29udmVyZ2VuY2VTTFR5cGVzewotI2VuZGlmCiAJLyoqICA4Yml0IFBocyBDbGFzc2ZpZXIgQWN0aW9uIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThDbGFzc2ZpZXJEU0NBY3Rpb247CiAJLyoqICA4Yml0IFBocyBEU0MgQWN0aW9uIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwpAQCAtMjIwLDExMSArMTM3LDE1IEBACiAJLyoqICAgMTZiaXQgUGFkZGluZyAqLwogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQYWRkaW5nWzJdOwogICAgIC8vLyBcYnJpZWYgY2xhc3MgY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSAgICAgIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlOwotI2Vsc2UKICAgICBzdENQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSAgICAgY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGU7Ci0jZW5kaWYKICAgICAvLy8gXGJyaWVmIGNsYXNzIENQaHNSdWxlU0kKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ1Boc1J1bGVTSQkJCQljUGhzUnVsZTsKLSNlbHNlCiAgICAgIHN0cnVjdCBfc3RQaHNSdWxlU0kJCWNQaHNSdWxlOwotI2VuZGlmCiB9OwotI2lmbmRlZiBCRUNFRU1fVEFSR0VUCiB0eXBlZGVmIHN0cnVjdCBfc3RDb252ZXJnZW5jZVNMVHlwZXMgc3RDb252ZXJnZW5jZVNMVHlwZXMsQ0NvbnZlcmdlbmNlU0xUeXBlcywgKnBzdENvbnZlcmdlbmNlU0xUeXBlczsKLSNlbmRpZgogCiAKIC8vLyBcYnJpZWYgc3RydWN0dXJlIENTZXJ2aWNlRmxvd1BhcmFtU0kKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi1jbGFzcyBDU2VydmljZUZsb3dQYXJhbVNJewotCXB1YmxpYzoKLQkJLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JCUNTZXJ2aWNlRmxvd1BhcmFtU0koKToKLQkJCXUzMlNGSUQobVNGaWQpLAotCQkJdTE2Q0lEKG1DaWQpLAotCQkJdThTZXJ2aWNlQ2xhc3NOYW1lTGVuZ3RoKG1TZXJ2aWNlQ2xhc3NOYW1lTGVuZ3RoKSwKLQkJCXU4TUJTU2VydmljZShtTUJTU2VydmljZSksCi0JCQl1OFFvc1BhcmFtU2V0KG1Rb3NQYXJhbVNldFR5cGUpLAotCQkJdThUcmFmZmljUHJpb3JpdHkobVRyYWZmaWNQcmlvcml0eSksCi0JCQl1MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZShtTWF4aW11bVN1c3RhaW5lZFRyYWZmaWNSYXRlKSwKLQkJCXUzMk1heFRyYWZmaWNCdXJzdChtTWF4aW11bVRyYWZmaWNCdXJzdCksCi0JCQl1MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlKG1NaW5pbXVtUmVzZXJ2ZWRUcmFmZmljUmF0ZSksCi0JCQl1OFNlcnZpY2VGbG93U2NoZWR1bGluZ1R5cGUobVNlcnZpY2VGbG93U2NoZWR1bGluZ1R5cGUpLAotCQkJdThSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5KG1SZXF1ZXN0VHJhbnNtaXNzaW9uUG9saWN5KSwKLQkJCXUzMlRvbGVyYXRlZEppdHRlcihtVG9sZXJhdGVkSml0dGVyKSwKLQkJCXUzMk1heGltdW1MYXRlbmN5KG1NYXhpbXVtTGF0ZW5jeSksCi0JCQl1OEZpeGVkTGVuZ3RoVlNWYXJpYWJsZUxlbmd0aFNEVUluZGljYXRvcgotCQkJKG1GaXhlZExlbmd0aFZTVmFyaWFibGVMZW5ndGgpLAotCQkJdThTRFVTaXplKG1TRFVTaXplKSwKLQkJCXUxNlRhcmdldFNBSUQobVRhcmdldFNBSUQpLAotCQkJdThBUlFFbmFibGUobUFSUUVuYWJsZSksCi0JCQl1MTZBUlFXaW5kb3dTaXplKG1BUlFXaW5kb3dTaXplKSwKLQkJCXUxNkFSUUJsb2NrTGlmZVRpbWUobUFSUUJsb2NrTGlmZVRpbWUpLAotCQkJdTE2QVJRU3luY0xvc3NUaW1lT3V0KG1BUlFTeW5jTG9zc1RpbWVPdXQpLAotCQkJdThBUlFEZWxpdmVySW5PcmRlcihtQVJRRGVsaXZlckluT3JkZXIpLAotCQkJdTE2QVJRUnhQdXJnZVRpbWVPdXQobUFSUVJYUHVyZ2VUaW1lT3V0KSwKLQkJCS8vQWRkIEFSUSBCTE9DSyBTSVpFLCBBUlEgVFggYW5kIFJYIGRlbGF5IGluaXRpYWxpemF0aW9ucyBoZXJlCi0JCQkvL2FmdGVyIHdlIG1vdmUgdG8gb25seSBDT1JSMgotCQkJdThSeEFSUUFja1Byb2Nlc3NpbmdUaW1lKG1SeEFSUUFja1Byb2Nlc3NpbmdUaW1lKSwKLQkJCXU4Q1NTcGVjaWZpY2F0aW9uKG1DU1NwZWNpZmljYXRpb24pLAotCQkJdThUeXBlT2ZEYXRhRGVsaXZlcnlTZXJ2aWNlKG1UeXBlT2ZEYXRhRGVsaXZlcnlTZXJ2aWNlKSwKLQkJCXUxNlNEVUludGVyQXJyaXZhbFRpbWUobVNEVUludGVyQXJyaXZhbFRpbWUpLAotCQkJdTE2VGltZUJhc2UobVRpbWVCYXNlKSwKLQkJCXU4UGFnaW5nUHJlZmVyZW5jZShtUGFnaW5nUHJlZmVyZW5jZSksCi0JCQl1OE1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudChtTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoKSwKLQkJCXU4VHJhZmZpY0luZGljYXRpb25QcmVmZXJlbmNlKG1UcmFmZmljSW5kaWNhdGlvblByZWZlcmVuY2UpLAotCQkJdThHbG9iYWxTZXJ2aWNlc0NsYXNzTmFtZUxlbmd0aChtR2xvYmFsU2VydmljZXNDbGFzc05hbWVMZW5ndGgpLAotCQkJdThTTkZlZWRiYWNrRW5hYmxlZChtU05GZWVkYmFja0VuYWJsZWQpLAotCQkJdThGU05TaXplKG1GU05TaXplKSwKLQkJCXU4Q0lEQWxsb2NhdGlvbjRhY3RpdmVCU3NMZW5ndGgobUNJREFsbG9jYXRpb240YWN0aXZlQlNzTGVuZ3RoKSwKLQkJCXUxNlVuc29saWNpdGVkR3JhbnRJbnRlcnZhbChtVW5zb2xpY2l0ZWRHcmFudEludGVydmFsKSwKLQkJCXUxNlVuc29saWNpdGVkUG9sbGluZ0ludGVydmFsKG1VbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbCksCi0JCQl1OFBEVVNORXh0ZW5kZWRTdWJoZWFkZXI0SGFycVJlb3JkZXJpbmcobVBEVVNORXh0ZW5kZWRTdWJoZWFkZXI0SGFycVJlb3JkZXJpbmcpLAotCQkJdThNQlNDb250ZW50c0lETGVuZ3RoKG1NQlNDb250ZW50c0lETGVuZ3RoKSwKLQkJCXU4SEFSUVNlcnZpY2VGbG93cyhtSEFSUVNlcnZpY2VGbG93cyksCi0JCQl1OEF1dGhUb2tlbkxlbmd0aChtQXV0aFRva2VuTGVuZ3RoKSwKLQkJCXU4SGFycUNoYW5uZWxNYXBwaW5nTGVuZ3RoKG1IYXJxQ2hhbm5lbE1hcHBpbmdMZW5ndGgpLAotCQkJdThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKG1WZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKSwKLSAgICAgICAgICAgIGJWYWxpZChGQUxTRSksCi0JICAgICB1OFRvdGFsQ2xhc3NpZmllcnMoKQotewotLy9SZW1vdmUgdGhlIGJvbGNrIGFmdGVyIHdlIG1vdmUgdG8gQ29ycjIgb25seSBjb2RlCi0jaWZkZWYgRU5BQkxFX0NPUlJJR0VORFVNMl9VUERBVEUKLQlpZigoZ191MzJDb3JyMk1hY0ZsYWdzICYgQ09SUl8yX0RTWCkgIHx8ICAoZ191MzJDb3JyMk1hY0ZsYWdzICYgQ09SUl8yX0FSUSkpCi0JewotCS8qIElFRUUgQ29tbWVudCAjNjI3IC8gTVRHIENvbW1lbnQgIzQyNiAqLwotICAgICAgIAl1MTZBUlFCbG9ja1NpemUgPSBtQVJRQmxvY2tTaXplOwotCQlpZihnX3UzMkNvcnIyTWFjRmxhZ3MgJiBDT1JSXzJfQVJRKSB7Ci0JCQl1MTZBUlFSZXRyeVR4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRUeERlbGF5OwotCQkJaWYoZ191MzJWRU5ET1JfVFlQRSA9PSBWRU5ET1JfQUxDQVRFTCkgewotCQkJCXUxNkFSUVJldHJ5UnhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFJ4RGVsYXlfQUxVOwotCQkJfSBlbHNlIHsKLQkJCQl1MTZBUlFSZXRyeVJ4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRSeERlbGF5OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdTE2QVJRUmV0cnlUeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0VHhEZWxheUNvcnIxOwotCQkJdTE2QVJRUmV0cnlSeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0UnhEZWxheUNvcnIxOwotCQl9Ci0JfQotCWVsc2UKLSNlbmRpZgotCXsKLQkJdTE2QVJRQmxvY2tTaXplID0gbUFSUUJsb2NrU2l6ZUNvcnIxOwotCQl1MTZBUlFSZXRyeVR4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRUeERlbGF5Q29ycjE7Ci0JCXUxNkFSUVJldHJ5UnhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFJ4RGVsYXlDb3JyMTsKLQl9Ci19Ci0KLQl2b2lkIENvbXB1dGVNYWNPdmVyaGVhZChCX1VJTlQ4CXU4U2VjT3ZyaGVhZCk7Ci0JQl9VSU5UMTYJR2V0TWFjT3ZlcmhlYWQoKSB7IHJldHVybiAJdTE2TWFjT3ZlcmhlYWQ7IH0KLSNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfc3RTZXJ2aWNlRmxvd1BhcmFtU0l7Ci0jZW5kaWYgLy9lbmQgb2YgaWZkZWYgQkVDRUVNX1RBUkdFVAogCiAgICAgIC8qKiAgMzJiaXRTRklEIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwogICAgIEJfVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgdTMyU0ZJRDsKQEAgLTM2NywxMSArMTg4LDYgQEAKIAogCSAvKiogIDE2Yml0IEFSUSBQdXJnZSB0aW1lb3V0ICovCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZBUlFSeFB1cmdlVGltZU91dDsKLSNpZiAwIC8vZGVmIEVOQUJMRV9DT1JSSUdFTkRVTTJfVVBEQVRFCi0vKiBJRUVFIENvbW1lbnQgIzYyNyAvIE1URyBDb21tZW50ICM0MjYgKi8KLSAgICAvLy8gXGJyaWVmIFNpemUgb2YgYW4gQVJRIGJsb2NrLCBjaGFuZ2VkIGZyb20gMiBieXRlcyB0byAxCi0gICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIHU4QVJRQmxvY2tTaXplOwotI2VuZGlmCiAvL1RPRE86OlJlbW92ZSB0aGlzIG9uY2Ugd2UgbW92ZSB0byBhIG5ldyBDT1JSMiBkcml2ZXIKICAgICAvLy8gXGJyaWVmIFNpemUgb2YgYW4gQVJRIGJsb2NrCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZBUlFCbG9ja1NpemU7CkBAIC00OTYsMzUgKzMxMiwxOCBAQAogCUJfVUlOVDgJCQkJCQkJYlZhbGlkOwkvKio8ICBWYWxpZGl0eSBmbGFnICovCiAJQl9VSU5UOAkJCQl1OFBhZGRpbmc7CSAvKio8ICBQYWRkaW5nIGJ5dGUqLwogCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotLyoqCi1TdHJ1Y3R1cmUgZm9yIENvbnZlcmdlbmNlIFN1YkxheWVyIFR5cGVzIHdpdGggYSBtYXhpbXVtIG9mIDQgY2xhc3NpZmllcnMKLSovCi0JQ0NvbnZlcmdlbmNlU0xUeXBlcwkJY0NvbnZlcmdlbmNlU0xUeXBlc1tNQVhfQ0xBU1NJRklFUlNfSU5fU0ZdOwotI2Vsc2UKIC8qKgogU3RydWN0dXJlIGZvciBDb252ZXJnZW5jZSBTdWJMYXllciBUeXBlcyB3aXRoIGEgbWF4aW11bSBvZiA0IGNsYXNzaWZpZXJzCiAqLwogCXN0Q29udmVyZ2VuY2VTTFR5cGVzCQljQ29udmVyZ2VuY2VTTFR5cGVzW01BWF9DTEFTU0lGSUVSU19JTl9TRl07Ci0jZW5kaWYKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLX07Ci0jZWxzZQogfSBzdFNlcnZpY2VGbG93UGFyYW1TSSwgKnBzdFNlcnZpY2VGbG93UGFyYW1TSTsKIHR5cGVkZWYgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgQ1NlcnZpY2VGbG93UGFyYW1TSTsKLSNlbmRpZgogCiAvKioKIHN0cnVjdHVyZSBzdExvY2FsU0ZBZGRSZXF1ZXN0CiAqLwogdHlwZWRlZiBzdHJ1Y3QgX3N0TG9jYWxTRkFkZFJlcXVlc3R7Ci0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCSAgIF9zdExvY2FsU0ZBZGRSZXF1ZXN0KCApIDoKLQkgICAJdThUeXBlKDB4MDApLCAgZUNvbm5lY3Rpb25EaXIoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MTZDSUQoMHgwMDAwKSwgIHUxNlZDSUQoMHgwMDAwKQotCSAgIAkJe30KLSNlbmRpZgogCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFR5cGU7CS8qKjwgIFR5cGUqLwogCUJfVUlOVDggICAgICBlQ29ubmVjdGlvbkRpcjsJCS8qKjwgIENvbm5lY3Rpb24gZGlyZWN0aW9uKi8KQEAgLTUzNSwxOSArMzM0LDkgQEAKIAkvLy8gXGJyaWVmIDE2Yml0VkNJRAogCUJfVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgdTE2VkNJRDsJLyoqPCAgMTZiaXQgVkNJRCovCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgUGFyYW1ldGVyU2V0Ci0jaWZkZWYgQkVDRUVNX1NJR05BTExJTkdfSU5URVJGQUNFX0FQSQotCUNTZXJ2aWNlRmxvd1BhcmFtU0kgc2ZQYXJhbWV0ZXJTZXQ7Ci0jZW5kaWYKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmUGFyYW1ldGVyU2V0OwotI2Vsc2UKIAlzdFNlcnZpY2VGbG93UGFyYW1TSQkqcHNmUGFyYW1ldGVyU2V0OwkvKio8ICBzdHJ1Y3R1cmUgUGFyYW1ldGVyU2V0Ki8KLSNlbmRpZgogCi0jaWZkZWYgVVNJTkdfVlhXT1JLUwotICAgIFVTRV9EQVRBX01FTU9SWV9NQU5BR0VSKCk7Ci0jZW5kaWYKIH1zdExvY2FsU0ZBZGRSZXF1ZXN0LCAqcHN0TG9jYWxTRkFkZFJlcXVlc3Q7CiAKIApAQCAtNTU1LDEyICszNDQsNiBAQAogc3RydWN0dXJlIHN0TG9jYWxTRkFkZEluZGljYXRpb24KICovCiB0eXBlZGVmIHN0cnVjdCBfc3RMb2NhbFNGQWRkSW5kaWNhdGlvbnsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgX3N0TG9jYWxTRkFkZEluZGljYXRpb24oICkgOgotCSAgIAl1OFR5cGUoMHgwMCksICBlQ29ubmVjdGlvbkRpcigweDAwKSwKLQkJdTE2VElEKDB4MDAwMCksIHUxNkNJRCgweDAwMDApLCAgdTE2VkNJRCgweDAwMDApCi0JICAgCQl7fQotI2VuZGlmCiAKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4VHlwZTsJLyoqPCAgVHlwZSovCiAJQl9VSU5UOCAgICAgIGVDb25uZWN0aW9uRGlyOwkvKio8ICBDb25uZWN0aW9uIERpcmVjdGlvbiovCkBAIC01NzEsMzcgKzM1NCwxOSBAQAogICAgIC8vLyBcYnJpZWYgMTZiaXRWQ0lECiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZWQ0lEOwkgLyoqPCAgMTZiaXRWQ0lEKi8KIAotI2lmZGVmIAlCRUNFRU1fU0lHTkFMTElOR19JTlRFUkZBQ0VfQVBJCi0JQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgc2ZBdXRob3JpemVkU2V0OwotICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEFkbWl0dGVkU2V0Ci0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgc2ZBZG1pdHRlZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBY3RpdmVTZXQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICBzZkFjdGl2ZVNldDsKLSNlbmRpZgogCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQXV0aG9yaXplZFNldAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQXV0aG9yaXplZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBZG1pdHRlZFNldAotICAgIENTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBZG1pdHRlZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBY3RpdmVTZXQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQWN0aXZlU2V0OwotI2Vsc2UKICAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBdXRob3JpemVkU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBdXRob3JpemVkU2V0OwkvKio8ICBBdXRob3JpemVkU2V0IG9mIHR5cGUgc3RTZXJ2aWNlRmxvd1BhcmFtU0kqLwogICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEFkbWl0dGVkU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBZG1pdHRlZFNldDsJLyoqPCAgQWRtaXR0ZWRTZXQgb2YgdHlwZSBzdFNlcnZpY2VGbG93UGFyYW1TSSovCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQWN0aXZlU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBY3RpdmVTZXQ7CS8qKjwgIHNmQWN0aXZlU2V0IG9mIHR5cGUgc3RTZXJ2aWNlRmxvd1BhcmFtU0kqLwotI2VuZGlmCiAJQl9VSU5UOAkJCQkgICB1OENDOwkvKio8ICBDb25maXJtYXRpb24gQ29kZSovCiAJQl9VSU5UOAkJCQkgICB1OFBhZGQ7CQkvKio8ICA4LWJpdCBQYWRkaW5nICovCiAKICAgICBCX1VJTlQxNiAgICAgICAgICAgICAgIHUxNlBhZGQ7CS8qKjwgMTYgYml0IFBhZGRpbmcgKi8KIAotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGQWRkSW5kaWNhdGlvbjsKIAogCkBAIC02MTksMzMgKzM4NCwxNyBAQAogc3RydWN0dXJlIHN0TG9jYWxTRkRlbGV0ZVJlcXVlc3QKICovCiB0eXBlZGVmIHN0cnVjdCBfc3RMb2NhbFNGRGVsZXRlUmVxdWVzdHsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgX3N0TG9jYWxTRkRlbGV0ZVJlcXVlc3QoICkgOgotCSAgIAl1OFR5cGUoMHgwMCksICB1OFBhZGRpbmcoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MzJTRklEICgweDAwMDAwMDAwKQotCSAgIAkJe30KLSNlbmRpZgogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThUeXBlOwkgLyoqPCBUeXBlKi8KIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZzsJIC8qKjwgIFBhZGRpbmcgYnl0ZSovCiAJQl9VSU5UMTYJCQl1MTZUSUQ7CQkgLyoqPCAgVElEKi8KICAgICAvLy8gXGJyaWVmIDMyYml0U0ZJRAogICAgIEJfVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgdTMyU0ZJRDsJIC8qKjwgIFNGSUQqLwotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGRGVsZXRlUmVxdWVzdCwgKnBzdExvY2FsU0ZEZWxldGVSZXF1ZXN0OwogCiAvKioKIHN0cnVjdHVyZSBzdExvY2FsU0ZEZWxldGVJbmRpY2F0aW9uCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbnsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgc3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbiggKSA6Ci0JICAgCXU4VHlwZSgweDAwKSwgIHU4UGFkZGluZygweDAwKSwKLQkJdTE2VElEKDB4MDAwMCksIHUxNkNJRCgweDAwMDApLAotCQl1MTZWQ0lEKDB4MDAwMCksdTMyU0ZJRCAoMHgwMDAwMDAwMCkKLQkgICAJCXt9Ci0jZW5kaWYKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4VHlwZTsJLyoqPCBUeXBlICovCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBhZGRpbmc7CS8qKjwgUGFkZGluZyAgKi8KIAlCX1VJTlQxNgkJCXUxNlRJRDsJCQkvKio8IFRJRCAqLwpAQCAtNjU4LDkgKzQwNyw2IEBACiAJLy8vIFxicmllZiA4Yml0IENvbmZpcm1hdGlvbiBjb2RlCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OENvbmZpcm1hdGlvbkNvZGU7CS8qKjwgQ29uZmlybWF0aW9uIGNvZGUgKi8KIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZzFbM107CQkvKio8IDMgYnl0ZSBQYWRkaW5nICAqLwotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbjsKIAogdHlwZWRlZiBzdHJ1Y3QgX3N0SU1fU0ZIb3N0Tm90aWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCmluZGV4IDlkNGUzYWMuLjExNDhlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKQEAgLTM2LDI2ICszNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2VuZGlmCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCi0jaW5jbHVkZSA8bWFjX2NvbW1vbi5oPgotI2luY2x1ZGUgPG1zZ19Ec2EuaD4KLSNpbmNsdWRlIDxtc2dfRHNjLmg+Ci0jaW5jbHVkZSA8bXNnX0RzZC5oPgotI2luY2x1ZGUgPHNjaF9kZWZpbml0aW9ucy5oPgotdXNpbmcgbmFtZXNwYWNlIEJlY2VlbTsKLSNpZmRlZiBFTkFCTEVfQ09SUklHRU5EVU0yX1VQREFURQotZXh0ZXJuIEJfVUlOVDMyIGdfdTMyQ29ycjJNYWNGbGFnczsKLSNlbmRpZgotI2VuZGlmCiAKICNpbmNsdWRlICJUeXBlZGVmcy5oIgogI2luY2x1ZGUgIlZlcnNpb24uaCIKQEAgLTcxLDM5ICs1NCwyOCBAQAogI2luY2x1ZGUgIkNtSG9zdC5oIgogI2luY2x1ZGUgIkREUkluaXQuaCIKICNpbmNsdWRlICJEZWJ1Zy5oIgotI2luY2x1ZGUgIkhvc3RNaWJzLmgiCiAjaW5jbHVkZSAiSVB2NlByb3RvY29sSGRyLmgiCi0jaW5jbHVkZSAib3NhbF9taXNjLmgiCiAjaW5jbHVkZSAiUEhTTW9kdWxlLmgiCiAjaW5jbHVkZSAiUHJvdG9jb2wuaCIKICNpbmNsdWRlICJQcm90b3R5cGVzLmgiCiAjaW5jbHVkZSAiUXVldWUuaCIKICNpbmNsdWRlICJ2ZW5kb3JzcGVjaWZpY2V4dG4uaCIKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCiAjaW5jbHVkZSAiSW50ZXJmYWNlTWFjcm9zLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlQWRhcHRlci5oIgogI2luY2x1ZGUgIkludGVyZmFjZUlzci5oIgotI2luY2x1ZGUgIkludGVyZmFjZW1haW4uaCIKICNpbmNsdWRlICJJbnRlcmZhY2VNaXNjLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlUnguaCIKICNpbmNsdWRlICJJbnRlcmZhY2VUeC5oIgotI2VuZGlmCiAjaW5jbHVkZSAiSW50ZXJmYWNlSWRsZU1vZGUuaCIKICNpbmNsdWRlICJJbnRlcmZhY2VJbml0LmgiCiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotI2luY2x1ZGUgPGxpbnV4L2NwZV9jb25maWcuaD4KLQotI2lmZGVmIEdETUFfSU5URVJGQUNFCi0jaW5jbHVkZSAiR2RtYUludGVyZmFjZS5oIgotI2luY2x1ZGUgInN5bXBob255LmgiCi0jZWxzZQotI2luY2x1ZGUgInZpcnR1YWxfaW50ZXJmYWNlLmgiCi0KLSNlbmRpZgotCi0jZW5kaWYKKyNkZWZpbmUgRFJWX05BTUUJImJlY2VlbSIKKyNkZWZpbmUgREVWX05BTUUJInRhcmFuZyIKKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OICJCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jLiBXaU1BWCBkcml2ZXIiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIkNvcHlyaWdodCAyMDEwLiBCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jIgorI2RlZmluZSBEUlZfVkVSU0lPTglWRVJfRklMRVZFUlNJT05fU1RSCisjZGVmaW5lIFBGWAkJRFJWX05BTUUgIiAiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCmluZGV4IGU5ZGE1MTMuLmMxM2VhNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKQEAgLTEwLDEyICsxMCw4IEBACiAgKi8KICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLUlOVCAgUHJvY2Vzc0dldEhvc3RNaWJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQkJCQkJCSAgUFZPSUQgaW9CdWZmZXIsCi0JCQkJCQkgIFVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKQorSU5UICBQcm9jZXNzR2V0SG9zdE1pYnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBTX01JQlNfSE9TVF9TVEFUU19NSUJTICpwc3RIb3N0TWlicykKIHsKLQotCVNfTUlCU19IT1NUX1NUQVRTX01JQlMgKnBzdEhvc3RNaWJzICAgICAgICAgPSBOVUxMOwogCVNfU0VSVklDRUZMT1dfRU5UUlkgICAgKnBzdFNlcnZpY2VGbG93RW50cnkgPSBOVUxMOwogCVNfUEhTX1JVTEUgICAgICAgICAgICAgKnBzdFBoc1J1bGUgICAgICAgICAgPSBOVUxMOwogCVNfQ0xBU1NJRklFUl9UQUJMRSAgICAgKnBzdENsYXNzaWZpZXJUYWJsZSAgPSBOVUxMOwpAQCAtMzAsMTUgKzI2LDYgQEAKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCX0KIAotCWlmKGlvQnVmZmVyID09IE5VTEwpCi0JewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KGlvQnVmZmVyLDAsc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKTsKLQotCXBzdEhvc3RNaWJzID0gKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKilpb0J1ZmZlcjsKLQotCiAJLy9Db3B5IHRoZSBjbGFzc2lmaWVyIFRhYmxlCiAJZm9yKG5DbGFzc2lmaWVySW5kZXg9MDsgbkNsYXNzaWZpZXJJbmRleCA8IE1BWF9DTEFTU0lGSUVSUzsKIAkJCW5DbGFzc2lmaWVySW5kZXgrKykKQEAgLTU0LDcgKzQxLDcgQEAKIAl7CiAJaWYoQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLmJWYWxpZCkKIAl7Ci0JCQlPc2FsTWVtTW92ZSgoUFZPSUQpJnBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwoUFZPSUQpJkFkYXB0ZXItPlBhY2tJbmZvW25TZkluZGV4XSxzaXplb2YoU19NSUJTX1NFUlZJQ0VGTE9XX1RBQkxFKSk7CisJCQltZW1jcHkoKFBWT0lEKSZwc3RIb3N0TWlicy0+YXN0U0Z0YWJsZVtuU2ZJbmRleF0sKFBWT0lEKSZBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0sc2l6ZW9mKFNfTUlCU19TRVJWSUNFRkxPV19UQUJMRSkpOwogCX0KIAllbHNlCiAJewpAQCAtODMsNyArNzAsNyBAQAogCiAJCQlwc3RIb3N0TWlicy0+YXN0UGhzUnVsZXNUYWJsZVtuUGhzVGFibGVJbmRleF0udWxTRklEID0gQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLnVsU0ZJRDsKIAotCQkJT3NhbE1lbU1vdmUoJnBzdEhvc3RNaWJzLT5hc3RQaHNSdWxlc1RhYmxlW25QaHNUYWJsZUluZGV4XS51OFBIU0ksCisJCQltZW1jcHkoJnBzdEhvc3RNaWJzLT5hc3RQaHNSdWxlc1RhYmxlW25QaHNUYWJsZUluZGV4XS51OFBIU0ksCiAJCQkJCQkmcHN0UGhzUnVsZS0+dThQSFNJLAogCQkJCQkJc2l6ZW9mKFNfUEhTX1JVTEUpKTsKIAkJCQluUGhzVGFibGVJbmRleCsrOwpAQCAtOTUsMTIgKzgyLDkgQEAKIAl9CiAKIAotCiAJLy9jb3B5IG90aGVyIEhvc3QgU3RhdGlzdGljcyBwYXJhbWV0ZXJzCi0JcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFRyYW5zbWl0cyA9Ci0JCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7Ci0JcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFJlY2VpdmVzID0KLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOworCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkdvb2RUcmFuc21pdHMgPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFJlY2VpdmVzID0gQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOwogCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkN1cnJOdW1GcmVlRGVzYyA9CiAJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpOwogCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkJFQnVja2V0U2l6ZSA9IEFkYXB0ZXItPkJFQnVja2V0U2l6ZTsKQEAgLTExNSwxMyArOTksMTAgQEAKIH0KIAogCi1JTlQgR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicyhQVk9JRCBpb0J1ZmZlciwgUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nKQorVk9JRCBHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKnBzdEhvc3RNaWJzLCBjb25zdCBQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcpCiB7Ci0JU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqcHN0SG9zdE1pYnMgPSAoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqKWlvQnVmZmVyOwotCi0JbWVtY3B5KChQVk9JRCkmKHBzdEhvc3RNaWJzLT5zdERyb3BwZWRBcHBDbnRybE1zZ3MpLChQVk9JRCkmKHBUYXJhbmctPnN0RHJvcHBlZEFwcENudHJsTXNncyksc2l6ZW9mKFNfTUlCU19EUk9QUEVEX0FQUF9DTlRSTF9NRVNTQUdFUykpOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKKwltZW1jcHkoJihwc3RIb3N0TWlicy0+c3REcm9wcGVkQXBwQ250cmxNc2dzKSwKKwkgICAgICAgJihwVGFyYW5nLT5zdERyb3BwZWRBcHBDbnRybE1zZ3MpLHNpemVvZihTX01JQlNfRFJPUFBFRF9BUFBfQ05UUkxfTUVTU0FHRVMpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2xlZF9jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2xlZF9jb250cm9sLmMKaW5kZXggOTdhZGFhZS4uMTZlOTM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9sZWRfY29udHJvbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbGVkX2NvbnRyb2wuYwpAQCAtMTA4LDUyICsxMDgsMTYgQEAKIAl1bG9uZyB0aW1lb3V0ID0gMDsKIAogCS8qUmVhZCBpbml0aWFsIHZhbHVlIG9mIHBhY2tldHMgc2VudC9yZWNlaXZlZCAqLwotCUluaXRpYWxfbnVtX29mX3BhY2t0c190eCA9IGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFRvdGFsUGFja2V0Q291bnQpOwotCUluaXRpYWxfbnVtX29mX3BhY2t0c19yeCA9IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Hb29kUnhQa3RDb3VudCk7CisJSW5pdGlhbF9udW1fb2ZfcGFja3RzX3R4ID0gQWRhcHRlci0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzOworCUluaXRpYWxfbnVtX29mX3BhY2t0c19yeCA9IEFkYXB0ZXItPmRldi0+c3RhdHMucnhfcGFja2V0czsKKwogCS8qU2NhbGUgdGhlIHJhdGUgb2YgdHJhbnNmZXIgdG8gbm8gb2YgYmxpbmtzLiovCiAJbnVtX29mX3RpbWVfdHg9IFNjYWxlUmF0ZW9mVHJhbnNmZXIoKFVMT05HKXJhdGVfb2ZfdHJhbnNmZXJfdHgpOwogCW51bV9vZl90aW1lX3J4PSBTY2FsZVJhdGVvZlRyYW5zZmVyKChVTE9ORylyYXRlX29mX3RyYW5zZmVyX3J4KTsKIAogCXdoaWxlKChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBGQUxTRSkpCiAJewotCQkjaWYgMAotCQlpZigwID09IG51bV9vZl90aW1lX3R4ICYmIDAgPT0gbnVtX29mX3RpbWVfcngpCi0JCXsKLQkJCXRpbWVvdXQgPSAxMDAwOwotCQkJU3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50LAotCQkJCWN1cnJkcml2ZXJzdGF0ZSE9IEFkYXB0ZXItPkRyaXZlclN0YXRlIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSwKLQkJCQltc2Vjc190b19qaWZmaWVzICh0aW1lb3V0KSk7Ci0JCQlpZihrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkxlZCB0aHJlYWQgZ290IHNpZ25hbCB0byBleGl0Li5oZW5jZSBleGl0aW5nIik7Ci0JCQkJQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmc9IEJDTV9MRURfVEhSRUFEX0RJU0FCTEVEOwotCQkJCXJldHVybiBFVkVOVF9TSUdOQUxFRDsKLQkJCX0KLQkJCWlmKFN0YXR1cykKLQkJCQlyZXR1cm4gRVZFTlRfU0lHTkFMRUQ7Ci0KLQkJfQotCQkjZW5kaWYKLQogCQl0aW1lb3V0ID0gNTA7Ci0JCSNpZiAwCi0JCS8qVHVybiBvbiBMRUQgaWYgVHggaXMgaGlnaCBiYW5kd2lkdGgqLwotCQlpZihudW1fb2ZfdGltZV90eCA+IE1BWF9OVU1fT0ZfQkxJTktTKQotCQl7Ci0JCQlUVVJOX09OX0xFRCgxPDxHUElPX051bV90eCwgdWlUeExlZEluZGV4KTsKLQkJCW51bV9vZl90aW1lX3R4ID0gMDsKLQkJCWJCbGlua0JvdGhMRUQgPSBGQUxTRTsKLQkJCW51bV9vZl90aW1lID0gbnVtX29mX3RpbWVfcng7Ci0JCX0KLQkJCS8qVHVybiBvbiBMRUQgaWYgUnggaXMgaGlnaCBiYW5kd2lkdGgqLwotCQlpZihudW1fb2ZfdGltZV9yeCA+IE1BWF9OVU1fT0ZfQkxJTktTKQotCQl7Ci0JCQlUVVJOX09OX0xFRCgxPDxHUElPX051bV9yeCwgdWlSeExlZEluZGV4KTsKLQkJCW51bV9vZl90aW1lX3J4ID0gMDsKLQkJCWJCbGlua0JvdGhMRUQgPSBGQUxTRTsKLQkJCW51bV9vZl90aW1lID0gbnVtX29mX3RpbWVfdHg7Ci0JCX0KLQkJI2VuZGlmCiAJCS8qQmxpbmsgVHggYW5kIFJ4IExFRCB3aGVuIGJvdGggVHggYW5kIFJ4IGlzIGluIG5vcm1hbCBiYW5kd2lkdGgqLwogCQlpZihiQmxpbmtCb3RoTEVEKQogCQl7CkBAIC0yNDksOSArMjEzLDEwIEBACiAgCQkgKiBSZWFkIHRoZSBUeCAmIFJ4IHBhY2tldHMgdHJhbnNtaXNzaW9uIGFmdGVyIDEgc2Vjb25kIGFuZAogIAkJICogY2FsY3VsYXRlIHJhdGUgb2YgdHJhbnNmZXIKICAJCSAqLwotCQlGaW5hbF9udW1fb2ZfcGFja3RzX3R4ID0gYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7CisJCUZpbmFsX251bV9vZl9wYWNrdHNfdHggPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJCUZpbmFsX251bV9vZl9wYWNrdHNfcnggPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHM7CisKIAkJcmF0ZV9vZl90cmFuc2Zlcl90eCA9IEZpbmFsX251bV9vZl9wYWNrdHNfdHggLSBJbml0aWFsX251bV9vZl9wYWNrdHNfdHg7Ci0JCUZpbmFsX251bV9vZl9wYWNrdHNfcnggPSBhdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOwogCQlyYXRlX29mX3RyYW5zZmVyX3J4ID0gRmluYWxfbnVtX29mX3BhY2t0c19yeCAtIEluaXRpYWxfbnVtX29mX3BhY2t0c19yeDsKIAogCQkvKlJlYWQgaW5pdGlhbCB2YWx1ZSBvZiBwYWNrZXRzIHNlbnQvcmVjZWl2ZWQgKi8KQEAgLTI5Myw3ICsyNTgsNyBAQAogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDpWYWxpZGF0ZURTRFBhcmFtc0NoZWNrc3VtOiAweCVseCAweCVYIix1bFBhcmFtT2Zmc2V0LCB1c1BhcmFtTGVuKTsKIAotCXB1QnVmZmVyID0gT3NhbE1lbUFsbG9jKHVzUGFyYW1MZW4sIiFNRU0iKTsKKwlwdUJ1ZmZlciA9IGttYWxsb2ModXNQYXJhbUxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYoIXB1QnVmZmVyKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDogVmFsaWRhdGVEU0RQYXJhbXNDaGVja3N1bSBBbGxvY2F0aW9uIGZhaWxlZCIpOwpAQCAtMzQxLDEwICszMDYsNyBAQAogCX0KIAogZXhpdDoKLQlpZihwdUJ1ZmZlcikKLQl7Ci0JCU9zYWxNZW1GcmVlKHB1QnVmZmVyLCB1c1BhcmFtTGVuKTsKLQl9CisJa2ZyZWUocHVCdWZmZXIpOwogCXJldHVybiBTdGF0dXM7CiB9CiAKQEAgLTQ5NywxMiArNDU5LDEwIEBACiB7CiAJaW50IFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCVVDSEFSIEdQSU9fQXJyYXlbTlVNX09GX0xFRFMrMV07IC8qQXJyYXkgdG8gc3RvcmUgR1BJTyBudW1iZXJzIGZyb20gRUVQUk9NKi8KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlVSU5UIHVpSW5kZXggPSAwOwogCVVJTlQgdWlOdW1fb2ZfTEVEX1R5cGUgPSAwOwogCVBVQ0hBUiBwdUNGR0RhdGEJPSBOVUxMOwogCVVDSEFSIGJEYXRhID0gMDsKLSNlbmRpZgogCW1lbXNldChHUElPX0FycmF5LCBESVNBQkxFX0dQSU9fTlVNLCBOVU1fT0ZfTEVEUysxKTsKIAogCWlmKCFBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyB8fCBJU19FUlIoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpKQpAQCAtNTI0LDEwICs0ODQsNiBAQAogCQkqYkVuYWJsZVRocmVhZCA9IEZBTFNFOwogCQlyZXR1cm4gU3RhdHVzOwogCX0KLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCSpiRW5hYmxlVGhyZWFkID0gRkFMU0U7Ci0JcmV0dXJuIFN0YXR1cyA7Ci0jZWxzZQogICAvKgogICAgICAqIENPTkZJRyBmaWxlIHJlYWQgc3VjY2Vzc2Z1bGx5LiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgb2YKICAgICAgKiB1aUZpbGVOYW1lQnVmZmVyU2l6ZQpAQCAtNTc4LDIzICs1MzQsNyBAQAogCX0KIAlpZih1aU51bV9vZl9MRURfVHlwZSA+PSBOVU1fT0ZfTEVEUykKIAkJKmJFbmFibGVUaHJlYWQgPSBGQUxTRTsKLSNlbmRpZgogCi0jaWYgMAotCWZvcih1aUluZGV4PTA7IHVpSW5kZXg8TlVNX09GX0xFRFM7IHVpSW5kZXgrKykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRFN0YXRlWyVkXS5MRURfVHlwZSA9ICV4XG4iLCB1aUluZGV4LAotCQkJQWRhcHRlci0+TEVESW5mby5MRURTdGF0ZVt1aUluZGV4XS5MRURfVHlwZSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRFN0YXRlWyVkXS5MRURfT25fU3RhdGUgPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uTEVEX09uX1N0YXRlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEU3RhdGVbJWRdLkxFRF9CbGlua19TdGF0ZSA9ICV4XG4iLCB1aUluZGV4LAotCQkJQWRhcHRlci0+TEVESW5mby5MRURTdGF0ZVt1aUluZGV4XS5MRURfQmxpbmtfU3RhdGUpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRURTdGF0ZVslZF0uR1BJT19OdW0gPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uR1BJT19OdW0pOwotCX0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkOiBQb2xhcml0eSA9ICVkXG4iLAotCQkJQWRhcHRlci0+TEVESW5mby5CaXRQb2xhcnR5KTsKLSNlbmRpZgogCXJldHVybiBTdGF0dXM7CiB9CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MjEsMjAgKzY2MSw2IEBACiAJCQlUVVJOX09GRl9MRUQoMTw8R1BJT19udW0sIHVpTGVkSW5kZXgpOwogCQkJcmV0dXJuIDsvL1NUQVRVU19GQUlMVVJFOwogCQl9Ci0JI2lmIDAKLQkJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkRldmljZSByZW1vdmVkIGhlbmNlIGV4aXRpbmcgZnJvbSBMZWQgVGhyZWFkLi4iKTsKLQkJCXJldHVybiA7IC8vLUVOT0RFVjsKLQkJfQotCSNlbmRpZgotCQkjaWYgMAotCQlpZigoR1BJT19udW0gIT0gRElTQUJMRV9HUElPX05VTSkgJiYKLQkJCSgoY3VycmRyaXZlcnN0YXRlICE9IEZXX0RPV05MT0FEKSAmJgotCQkJKGN1cnJkcml2ZXJzdGF0ZSAhPSBOT1JNQUxfT1BFUkFUSU9OKSAmJgotCQkJKGN1cnJkcml2ZXJzdGF0ZSAhPSBJRExFTU9ERV9FWElUKSkpCi0JCQlUVVJOX09GRl9MRUQoMTw8R1BJT19udW0sIHVpTGVkSW5kZXgpOwotCQkjZW5kaWYKIAogCQlpZihHUElPX251bSAhPSBESVNBQkxFX0dQSU9fTlVNKQogCQl7CkBAIC03NTIsMTAgKzY3OCw2IEBACiAJCQljYXNlIERSSVZFUl9JTklUOgogCQkJewogCQkJCWN1cnJkcml2ZXJzdGF0ZSA9IERSSVZFUl9JTklUOy8vQWRhcHRlci0+RHJpdmVyU3RhdGU7Ci0JI2lmIDAKLQkJCQlMZWRHcGlvSW5pdChBZGFwdGVyKTsKLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IFRSVUU7Ci0JI2VuZGlmCiAJCQkJQmNtR2V0R1BJT1BpbkluZm8oQWRhcHRlciwgJkdQSU9fbnVtLCAmZHVtbXlHUElPTnVtLCAmdWlMZWRJbmRleCwgJmR1bW15SW5kZXgsIGN1cnJkcml2ZXJzdGF0ZSk7CiAKIAkJCQlpZihHUElPX251bSAgIT0gRElTQUJMRV9HUElPX05VTSkKQEAgLTc2OCwxMyArNjkwLDYgQEAKIAkJCXsKIAkJCQkvL0JDTV9ERUJVR19QUklOVCAoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkOiBGV19ETl9ET05FIGNhbGxlZFxuIik7CiAJCQkJY3VycmRyaXZlcnN0YXRlID0gRldfRE9XTkxPQUQ7Ci0JCQkjaWYgMAotCQkJCWlmKEFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID09IEZBTFNFKQotCQkJCXsKLQkJCQkJTGVkR3Bpb0luaXQoQWRhcHRlcik7Ci0JCQkJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gVFJVRTsKLQkJCQl9Ci0JCQkjZW5kaWYKIAkJCQlCY21HZXRHUElPUGluSW5mbyhBZGFwdGVyLCAmR1BJT19udW0sICZkdW1teUdQSU9OdW0sICAmdWlMZWRJbmRleCwgJmR1bW15SW5kZXgsIGN1cnJkcml2ZXJzdGF0ZSk7CiAKIAkJCQlpZihHUElPX251bSAhPSBESVNBQkxFX0dQSU9fTlVNKQpAQCAtNzk2LDEyICs3MTEsNiBAQAogCQkJYnJlYWs7CiAKIAkJCWNhc2UgU0hVVERPV05fRVhJVDoKLQkJCSNpZiAwCi0JCQlpZihBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BNVV9TSFVURE9XTikKLQkJCXsKLQkJCQlMZWRHcGlvSW5pdChBZGFwdGVyKTsKLQkJCX0KLQkJCSNlbmRpZgogCQkJLy9ubyBicmVhaywgY29udGludWUgdG8gTk9fTkVUV09SS19FTlRSWSBzdGF0ZSBhcyB3ZWxsLgogCiAJCQljYXNlIE5PX05FVFdPUktfRU5UUlk6CkBAIC04NzUsMzQgKzc4NCw2IEBACiAJCQlicmVhazsKIAkJCWNhc2UgSURMRU1PREVfRVhJVDoKIAkJCXsKLSNpZiAwCi0JCQkJVUNIQVIgR1BJT19udW1fdHggPSBESVNBQkxFX0dQSU9fTlVNOwotCQkJCVVDSEFSIEdQSU9fbnVtX3J4ID0gRElTQUJMRV9HUElPX05VTTsKLQkJCQlVQ0hBUiB1aVR4TGVkSW5kZXggPSAwOwotCQkJCVVDSEFSIHVpUnhMZWRJbmRleCA9IDA7Ci0KLQkJCQljdXJyZHJpdmVyc3RhdGUgID0gSURMRU1PREVfRVhJVDsKLQkJCQlpZihERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUE1VX1NIVVRET1dOID09IEFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSkKLQkJCQl7Ci0JCQkJCUxlZEdwaW9Jbml0KEFkYXB0ZXIpOwotCQkJCX0KLQkJCQlCY21HZXRHUElPUGluSW5mbyhBZGFwdGVyLCAmR1BJT19udW1fdHgsICZHUElPX251bV9yeCwgJnVpVHhMZWRJbmRleCwmdWlSeExlZEluZGV4LGN1cnJkcml2ZXJzdGF0ZSk7Ci0KLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJJZGxlX2xlZF9vZmYgPSAgRkFMU0U7Ci0KLQkJCQlpZigoR1BJT19udW1fdHggPT0gRElTQUJMRV9HUElPX05VTSkgJiYgKEdQSU9fbnVtX3J4ID09IERJU0FCTEVfR1BJT19OVU0pKQotCQkJCXsKLQkJCQkJR1BJT19udW0gPSBESVNBQkxFX0dQSU9fTlVNIDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGltZW91dCA9IDUwOwotCQkJCQlpZihBZGFwdGVyLT5MRURJbmZvLmJJZGxlTW9kZV90eF9mcm9tX2hvc3QpCi0JCQkJCQlMRURfQmxpbmsoQWRhcHRlciwgMTw8R1BJT19udW1fdHgsIHVpVHhMZWRJbmRleCwgdGltZW91dCwgLTEsY3VycmRyaXZlcnN0YXRlKTsKLQkJCQkJZWxzZQotCQkJCQkJTEVEX0JsaW5rKEFkYXB0ZXIsIDE8PEdQSU9fbnVtX3J4LCB1aVJ4TGVkSW5kZXgsIHRpbWVvdXQsIC0xLGN1cnJkcml2ZXJzdGF0ZSk7Ci0JCQkJfQotI2VuZGlmCiAJCQl9CiAJCQlicmVhazsKIAkJCWNhc2UgRFJJVkVSX0hBTFQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYwppbmRleCA0MWM5YWI4Li5jNzI5MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKQEAgLTEsNiArMSw1NiBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAogI2RlZmluZSBEV09SRCB1bnNpZ25lZCBpbnQKKworc3RhdGljIElOVCBCY21Eb0NoaXBTZWxlY3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7CitzdGF0aWMgSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIElOVCBCY21HZXRBY3RpdmVJU08oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBVSU5UIEJjbUdldEVFUFJPTVNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBJTlQgQmNtR2V0Rmxhc2hDU0luZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBVSU5UIEJjbUdldEZsYXNoU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgRmxhc2hTZWN0b3JTaXplU2lnLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZSk7CisKK3N0YXRpYyBWT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIElOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBOVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKworc3RhdGljIEJfVUlOVDggSXNPZmZzZXRXcml0YWJsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlPZmZzZXQpOworc3RhdGljIElOVCBJc1NlY3Rpb25Xcml0YWJsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgU2VjdGlvbik7CitzdGF0aWMgSU5UIElzU2VjdGlvbkV4aXN0SW5WZW5kb3JJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKTsKKworc3RhdGljIElOVCBSZWFkRFNEUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7CitzdGF0aWMgSU5UIFJlYWREU0RTaWduYXR1cmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7CitzdGF0aWMgSU5UIFJlYWRJU09Qcmlvcml0eShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKK3N0YXRpYyBJTlQgUmVhZElTT1NpZ25hdHVyZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKKworc3RhdGljIElOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOworc3RhdGljIElOVCBDb3JydXB0SVNPU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOworc3RhdGljIElOVCBTYXZlSGVhZGVySWZQcmVzZW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUFVDSEFSIHBCdWZmLCBVSU5UIHVpU2VjdEFsaWduQWRkcik7CitzdGF0aWMgSU5UIFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVSU5UIHBCdWZmLAorCQkJCQkgIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsLAorCQkJCQkgIFVJTlQgdWlPZmZzZXQsIFVJTlQgdWlOdW1CeXRlcyk7CitzdGF0aWMgRkxBU0gyWF9TRUNUSU9OX1ZBTCBnZXRIaWdoZXN0UHJpRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgRkxBU0gyWF9TRUNUSU9OX1ZBTCBnZXRIaWdoZXN0UHJpSVNPKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgQmVjZWVtRmxhc2hCdWxrUmVhZCgKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCisJUFVJTlQgcEJ1ZmZlciwKKwlVSU5UIHVpT2Zmc2V0LAorCVVJTlQgdWlOdW1CeXRlcyk7CisKK3N0YXRpYyBJTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCisJUE1JTklfQURBUFRFUiBBZGFwdGVyLAorCVBVSU5UIHBCdWZmZXIsCisJVUlOVCB1aU9mZnNldCwKKwlVSU5UIHVpTnVtQnl0ZXMsCisJQk9PTEVBTiBiVmVyaWZ5KTsKKworc3RhdGljIElOVCBHZXRGbGFzaEJhc2VBZGRyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgZHdBZGRyZXNzLCBVSU5UICpwZHdEYXRhLCBVSU5UIGR3TnVtRGF0YSk7CisKIC8vIFByb2NlZHVyZToJUmVhZEVFUFJPTVN0YXR1c1JlZ2lzdGVyCiAvLwogLy8gRGVzY3JpcHRpb246IFJlYWRzIHRoZSBzdGFuZGFyZCBFRVBST00gU3RhdHVzIFJlZ2lzdGVyLgpAQCAtMjI4LDIxMyArMjc4LDI3IEBACiAJCVJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsIHVpVGVtcE9mZnNldCArIE1BWF9SV19TSVpFLCAoUFVJTlQpJnVpRGF0YVs0XSwgNCk7CiAJfQogCi0JT3NhbE1lbU1vdmUoIChQVUNIQVIpIHBCdWZmZXIsICggKChQVUNIQVIpJnVpRGF0YVswXSkgKyB1aUJ5dGVPZmZzZXQgKSwgNCk7CisJbWVtY3B5KCAoUFVDSEFSKSBwQnVmZmVyLCAoICgoUFVDSEFSKSZ1aURhdGFbMF0pICsgdWlCeXRlT2Zmc2V0ICksIDQpOwogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfSAvKiBSZWFkQmVjZWVtRUVQUk9NKCkgKi8KIAogCi0jaWYgMAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJvY2VkdXJlOglJc0VFUFJPTVdyaXRlRG9uZQotLy8KLS8vIERlc2NyaXB0aW9uOiBSZWFkcyB0aGUgU1BJIHN0YXR1cyB0byBzZWUgdGhlIHN0YXR1cyBvZiBwcmV2aW91cyB3cml0ZS4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwkJQWRhcHRlciAgICAtIHB0ciB0byBBZGFwdGVyIG9iamVjdCBpbnN0YW5jZQotLy8KLS8vIFJldHVybnM6Ci0vLwkJQk9PTEVBTiAtIFRSVUUgIC0gd3JpdGUgd2VudCB0aHJvdWdoCi0vLyAgICAgICAgICAgICAgLSBGQUxTRSAtIFdyaXRlIEZhaWxlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQk9PTEVBTiBJc0VFUFJPTVdyaXRlRG9uZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JVUlOVCB1aVJldHJpZXMgPSAxNjsKLQkvL1VJTlQgdWlTdGF0dXMgID0gMDsKLQlVSU5UIHZhbHVlOwotCi0JLy9zbGVlcCBmb3IgMS4ybXMgLi53b3JzdCBjYXNlIEVFUFJPTSB3cml0ZSBjYW4gdGFrZSB1cCB0byAxLjJtcy4KLQltZGVsYXkoMik7Ci0KLQl2YWx1ZSA9IDA7Ci0JcmRtYWx0KEFkYXB0ZXIsIEVFUFJPTV9TUElfUV9TVEFUVVMxX1JFRywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQotCXdoaWxlKCgodmFsdWUgPj4gMTQpICYgMSkgPT0gMSkKLQl7Ci0JCS8vIEVFUFJPTV9TUElfUV9TVEFUVVMxX1JFRyB3aWxsIGJlIGNsZWFyZWQgb25seSBpZiB3cml0ZSBiYWNrIHRvIHRoYXQuCi0JCXZhbHVlID0gKDB4MSA8PCAxNCk7Ci0JCXdybWFsdChBZGFwdGVyLCBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJdWRlbGF5KDEwMDApOwotCQl1aVJldHJpZXMtLTsKLQkJaWYodWlSZXRyaWVzID09IDApCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdChBZGFwdGVyLCBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JfQotCXJldHVybiBUUlVFOwotCi0KLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcm9jZWR1cmU6CVJlYWRCZWNlZW1FRVBST01CdWxrCi0vLwotLy8gRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZWFkcyAxNkJ5dGUgZGF0YSBmcm9tIEVFUFJPTQotLy8KLS8vIEFyZ3VtZW50czoKLS8vCQlBZGFwdGVyICAgICAtIHB0ciB0byBBZGFwdGVyIG9iamVjdCBpbnN0YW5jZQotLy8gICAgICAgICAgZHdBZGRyZXNzIC0gRUVQUk9NIE9mZnNldCB0byByZWFkIHRoZSBkYXRhIGZyb20uCi0vLyAgICAgICAgICBwZHdEYXRhICAgIC0gUG9pbnRlciB0byBkb3VibGUgd29yZCB3aGVyZSBkYXRhIG5lZWRzIHRvIGJlIHN0b3JlZCBpbi4KLS8vCi0vLyBSZXR1cm5zOgotLy8JCU9TQUxfU1RBVFVTX0NPREU6Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlOVCBSZWFkQmVjZWVtRUVQUk9NQnVsayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsRFdPUkQgZHdBZGRyZXNzLCBEV09SRCAqcGR3RGF0YSkKLXsKLQlEV09SRCBkd1JldHJpZXMgPSAxNjsKLQlEV09SRCBkd0luZGV4ID0gMDsKLQlVSU5UIHZhbHVlLCB0bXBWYWw7Ci0KLQotCXZhbHVlID0gMDsKLQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQkvL3JlYWQgMHgwZjAwMzAyMCB1bnRpbGwgIGJpdCAxIG9mIDB4MGYwMDMwMDggaXMgc2V0LgotCXdoaWxlKCgodmFsdWUgPj4gMSkgJiAxKSA9PSAwKQotCXsKLQotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ0bXBWYWwsIHNpemVvZih0bXBWYWwpKTsKLQkJZHdSZXRyaWVzLS07Ci0JCWlmKGR3UmV0cmllcyA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JfQotCi0JdmFsdWUgPSBkd0FkZHJlc3MgfCAweGZiMDAwMDAwOwotCXdybWFsdCAoQWRhcHRlciwgMHgwZjAwMzAxOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQotCXVkZWxheSgxMDAwKTsKLQl2YWx1ZSA9IDA7Ci0JZm9yKGR3SW5kZXggPSAwO2R3SW5kZXggPCA0IDsgZHdJbmRleCsrKQotCXsKLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gPSB2YWx1ZTsKLQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdCAoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJcGR3RGF0YVtkd0luZGV4XSB8PSAodmFsdWUgPDwgOCk7Ci0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gfD0gKHZhbHVlIDw8IDE2KTsKLQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdCAoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJcGR3RGF0YVtkd0luZGV4XSB8PSAodmFsdWUgPDwgMjQpOwotCi0JfQotCXJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcm9jZWR1cmU6CVJlYWRCZWNlZW1FRVBST00KLS8vCi0vLyBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHJlYWRzIDRCeXRlIGRhdGEgZnJvbSBFRVBST00KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwkJQWRhcHRlciAgICAgLSBwdHIgdG8gQWRhcHRlciBvYmplY3QgaW5zdGFuY2UKLS8vICAgICAgICAgIGR3QWRkcmVzcyAtIEVFUFJPTSBPZmZzZXQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLgotLy8gICAgICAgICAgcGR3RGF0YSAgICAtIFBvaW50ZXIgdG8gZG91YmxlIHdvcmQgd2hlcmUgZGF0YSBuZWVkcyB0byBiZSBzdG9yZWQgaW4uCi0vLwotLy8gUmV0dXJuczoKLS8vCQlPU0FMX1NUQVRVU19DT0RFOgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JTlQgUmVhZEJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsRFdPUkQgZHdBZGRyZXNzLCBEV09SRCAqcGR3RGF0YSkKLXsKLQotCURXT1JEIGR3UmVhZFZhbHVlID0gMDsKLQlEV09SRCBkd1JldHJpZXMgPSAxNiwgZHdDb21wbGV0ZVdvcmQgPSAwOwotCVVJTlQJdmFsdWUsIHRtcFZhbDsKLQotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCXdoaWxlICgoKHZhbHVlID4+IDEpICYgMSkgPT0gMCkgewotCQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnRtcFZhbCwgc2l6ZW9mKHRtcFZhbCkpOwotCi0JCWlmIChkd1JldHJpZXMgPT0gMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCX0KLQotCi0JLy93cm0gKDB4MGYwMDMwMTgsIDB4TmJYWFhYWFgpICAgICAgLy8gTiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHUgd2FudCB0byByZWFkICAoMCBtZWFucyAxLCBmIG1lYW5zIDE2LCAgIGIgaXMgdGhlIG9wY29kZSBmb3IgcGFnZSByZWFkKQotCS8vICAgICBGb2xsb3cgaXQgdXAgYnkgTiBleGVjdXRpb25zIG9mICByZG0oMHgwZjAwMzAyMCkgdG8gcmVhZCB0aGUgcnhlZCBieXRlcyBmcm9tIHJ4IHF1ZXVlLgotCWR3QWRkcmVzcyB8PSAweDNiMDAwMDAwOwotCXdybWFsdChBZGFwdGVyLCAweDBmMDAzMDE4LCZkd0FkZHJlc3MsNCk7Ci0JbWRlbGF5KDEwKTsKLQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAyMCwmZHdSZWFkVmFsdWUsNCk7Ci0JZHdDb21wbGV0ZVdvcmQ9ZHdSZWFkVmFsdWU7Ci0JcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsJmR3UmVhZFZhbHVlLDQpOwotCWR3Q29tcGxldGVXb3JkfD0oZHdSZWFkVmFsdWU8PDgpOwotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDIwLCZkd1JlYWRWYWx1ZSw0KTsKLQlkd0NvbXBsZXRlV29yZHw9KGR3UmVhZFZhbHVlPDwxNik7Ci0JcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsJmR3UmVhZFZhbHVlLDQpOwotCWR3Q29tcGxldGVXb3JkfD0oZHdSZWFkVmFsdWU8PDI0KTsKLQotCSpwZHdEYXRhID0gZHdDb21wbGV0ZVdvcmQ7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgogCiBJTlQgUmVhZE1hY0FkZHJlc3NGcm9tTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlJTlQgU3RhdHVzPTAsIGk7Ci0JdW5zaWduZWQgY2hhciBwdU1hY0FkZHJbNl0gPSB7MH07Ci0JSU5UIEFsbFplcm9NYWMgPSAwOwotCUlOVCBBbGxGRk1hYyA9IDA7CisJSU5UIFN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIHB1TWFjQWRkcls2XTsKIAogCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwKIAkJCShQVUlOVCkmcHVNYWNBZGRyWzBdLAogCQkJSU5JVF9QQVJBTVNfMV9NQUNBRERSRVNTX0FERFJFU1MsCiAJCQlNQUNfQUREUkVTU19TSVpFKTsKIAotCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRXJyb3IgaW4gUmVhZGluZyB0aGUgbWFjIEFkZHJlcyB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQlyZXR1cm4gU3RhdHVzOwotCX0KLQotCW1lbWNweShBZGFwdGVyLT5kZXYtPmRldl9hZGRyLCBwdU1hY0FkZHIsIE1BQ19BRERSRVNTX1NJWkUpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiTW9kZW0gTUFDIEFkZHIgOiIpOwotICAgIEJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIERCR19MVkxfQUxMLCZBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzBdLE1BQ19BRERSRVNTX1NJWkUpOwotCWZvcihpPTA7aTxNQUNfQUREUkVTU19TSVpFO2krKykKLQl7Ci0KLQkJaWYoQWRhcHRlci0+ZGV2LT5kZXZfYWRkcltpXSA9PSAweDAwKQotCQkJQWxsWmVyb01hYysrOwotCQlpZihBZGFwdGVyLT5kZXYtPmRldl9hZGRyW2ldID09IDB4RkYpCi0JCQlBbGxGRk1hYysrOwotCi0JfQotCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiXG4iKTsKLQlpZihBbGxaZXJvTWFjID09IE1BQ19BRERSRVNTX1NJWkUpCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiV2FybmluZyA6OiBNQUMgQWRkcmVzcyBoYXMgYWxsIDAwJ3MiKTsKLQlpZihBbGxGRk1hYyA9PSBNQUNfQUREUkVTU19TSVpFKQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIldhcm5pbmcgOjogTUFDIEFkZHJlc3MgaGFzIGFsbCBGRidzIik7CisJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQorCQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKIAogCXJldHVybiBTdGF0dXM7Ci0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDc2LDcgKzM0MCw3IEBACiAJCVJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsdWlUZW1wT2Zmc2V0LChQVUlOVCkmdWlEYXRhWzBdLDQpOwogCQlpZih1aUJ5dGVzUmVtYWluaW5nID49IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcykpCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOworCQkJbWVtY3B5KHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOwogCiAJCQl1aUJ5dGVzUmVtYWluaW5nIC09IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcyk7CiAJCQl1aUluZGV4ICs9IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcyk7CkBAIC00ODQsNyArMzQ4LDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksdWlCeXRlc1JlbWFpbmluZyk7CisJCQltZW1jcHkocEJ1ZmZlciwoKChQVUNIQVIpJnVpRGF0YVswXSkrdWlFeHRyYUJ5dGVzKSx1aUJ5dGVzUmVtYWluaW5nKTsKIAkJCXVpSW5kZXggKz0gdWlCeXRlc1JlbWFpbmluZzsKIAkJCXVpT2Zmc2V0ICs9IHVpQnl0ZXNSZW1haW5pbmc7CiAJCQl1aUJ5dGVzUmVtYWluaW5nID0gMDsKQEAgLTUwOCw3ICszNzIsNyBAQAogCQkJICogV2UgcmVhZCA0IER3b3JkcyBvZiBkYXRhICovCiAJCQlpZigwID09IFJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsdWlPZmZzZXQsJnVpRGF0YVswXSw0KSkKIAkJCXsKLQkJCQlPc2FsTWVtTW92ZShwY0J1ZmYrdWlJbmRleCwmdWlEYXRhWzBdLE1BWF9SV19TSVpFKTsKKwkJCQltZW1jcHkocGNCdWZmK3VpSW5kZXgsJnVpRGF0YVswXSxNQVhfUldfU0laRSk7CiAJCQkJdWlPZmZzZXQgKz0gTUFYX1JXX1NJWkU7CiAJCQkJdWlCeXRlc1JlbWFpbmluZyAtPSBNQVhfUldfU0laRTsKIAkJCQl1aUluZGV4ICs9IE1BWF9SV19TSVpFOwpAQCAtNTIzLDcgKzM4Nyw3IEBACiAJCXsKIAkJCWlmKDAgPT0gUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLHVpT2Zmc2V0LCZ1aURhdGFbMF0pKQogCQkJewotCQkJCU9zYWxNZW1Nb3ZlKHBjQnVmZit1aUluZGV4LCZ1aURhdGFbMF0sNCk7CisJCQkJbWVtY3B5KHBjQnVmZit1aUluZGV4LCZ1aURhdGFbMF0sNCk7CiAJCQkJdWlPZmZzZXQgKz0gNDsKIAkJCQl1aUJ5dGVzUmVtYWluaW5nIC09IDQ7CiAJCQkJdWlJbmRleCArPTQ7CkBAIC01NDAsNyArNDA0LDcgQEAKIAkJCXBDaGFyQnVmZiArPSB1aUluZGV4OwogCQkJaWYoMCA9PSBSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsdWlPZmZzZXQsJnVpRGF0YVswXSkpCiAJCQl7Ci0JCQkJT3NhbE1lbU1vdmUocENoYXJCdWZmLCZ1aURhdGFbMF0sdWlCeXRlc1JlbWFpbmluZyk7Ly9jb3B5IG9ubHkgYnl0ZXMgcmVxdWVzdGVkLgorCQkJCW1lbWNweShwQ2hhckJ1ZmYsJnVpRGF0YVswXSx1aUJ5dGVzUmVtYWluaW5nKTsvL2NvcHkgb25seSBieXRlcyByZXF1ZXN0ZWQuCiAJCQkJdWlCeXRlc1JlbWFpbmluZyA9IDA7CiAJCQl9CiAJCQllbHNlCkBAIC01NzEsNyArNDM1LDcgQEAKIC8vCQk8RkFJTFVSRT4JCQktIGlmIGZhaWxlZC4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSU5UIEJlY2VlbUZsYXNoQnVsa1JlYWQoCitzdGF0aWMgSU5UIEJlY2VlbUZsYXNoQnVsa1JlYWQoCiAJUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCVBVSU5UIHBCdWZmZXIsCiAJVUlOVCB1aU9mZnNldCwKQEAgLTY1MywxNiArNTE3LDggQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVVJTlQgQmNtR2V0Rmxhc2hTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBVSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0jaWYgMAotCWlmKEFkYXB0ZXItPmJERFJJbml0RG9uZSkKLQl7Ci0JCXJldHVybiByZG0oQWRhcHRlcixGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQUZURVJfSU5JVHxGTEFTSF9TSVpFX0FERFIpOwotCX0KLQotCXJldHVybiByZG0oQWRhcHRlcixGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQkVGT1JFX0lOSVR8RkxBU0hfU0laRV9BRERSKTsKLSNlbmRpZgogCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKIAkJcmV0dXJuIAkoQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRGcm9tRFNEU3RhcnRGb3JEU0RIZWFkZXIgKyBzaXplb2YoRFNEX0hFQURFUikpOwogCWVsc2UKQEAgLTY4NCw3ICs1NDAsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBVSU5UIEJjbUdldEVFUFJPTVNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCVVJTlQgdWlEYXRhID0gMDsKIAlVSU5UIHVpSW5kZXggPSAwOwpAQCAtNzMzLDYwICs1ODksNiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgMAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8KLS8vICBXcml0ZUJlY2VlbUVFUFJPTTogV3JpdGVzIDQgYnl0ZSBkYXRhIHRvIEVFUFJPTSBvZmZzZXQuCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICB1aUVFUFJPTU9mZnNldCAtIE9mZnNldCB0byBiZSB3cml0dGVuIHRvLgotLy8gICAgICAgICAgICAgICAgICAgICB1aURhdGEgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbi4KLS8vCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUlOVCBXcml0ZUJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aUVFUFJPTU9mZnNldCwgVUlOVCB1aURhdGEpCi17Ci0JSU5UIFN0YXR1cyA9IDA7Ci0JVUxPTkcgdWxSZEJrID0gMDsKLQlVTE9ORyB1bFJldHJ5Q291bnQgPSAzOwotCVVJTlQgdmFsdWU7Ci0KLQlpZih1aUVFUFJPTU9mZnNldCA+IEVFUFJPTV9FTkQpCi0JewotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQl1aURhdGEgPSBodG9ubCh1aURhdGEpOwotCXdoaWxlKHVsUmV0cnlDb3VudC0tKQotCXsKLQkJdmFsdWUgPSAweDA2MDAwMDAwOwotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxOCwmdmFsdWUsIHNpemVvZih2YWx1ZSkpOy8vZmx1c2ggdGhlIEVFUFJPTSBGSUZPLgotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxQywmdWlEYXRhLCBzaXplb2YodWlEYXRhKSk7Ci0JCXZhbHVlID0gMHgzQTAwMDAwMCB8IHVpRUVQUk9NT2Zmc2V0OwotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxOCwmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQlfX3VkZWxheSgxMDAwMDApOwotCQkvL3JlYWQgYmFjayBhbmQgdmVyaWZ5LgotCQlTdGF0dXMgPSBSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsdWlFRVBST01PZmZzZXQsKFVJTlQgKikmdWxSZEJrKTsKLQkJaWYoU3RhdHVzID09IDApCi0JCXsKLQkJCWlmKHVsUmRCayA9PSB1aURhdGEpCi0JCQl7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXcml0ZUJlY2VlbUVFUFJPTTogUmVhZGJhY2sgZG9lcyBub3QgbWF0Y2hcbiIpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV3JpdGVCZWNlZW1FRVBST006IFJlYWRiYWNrIGZhaWxlZFxuIik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQcm9jZWR1cmU6CUZsYXNoU2VjdG9yRXJhc2UKQEAgLTk3Myw3ICs3NzUsNyBAQAogLy8gbmVlZCBub3Qgd3JpdGUgMHhGRkZGRkZGRiBiZWNhdXNlIHdyaXRlIHJlcXVpcmVzIGFuIGVyYXNlIGFuZCBlcmFzZSB3aWxsCiAvLyBtYWtlIHdob2xlIHNlY3RvciAweEZGRkZGRkZGLgogLy8KLQlpZiAoIU9zYWxNZW1Db21wYXJlKHBEYXRhLCB1aUVyYXNlUGF0dGVybiwgTUFYX1JXX1NJWkUpKQorCWlmICghbWVtY21wKHBEYXRhLCB1aUVyYXNlUGF0dGVybiwgTUFYX1JXX1NJWkUpKQogCXsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTEzOCw3ICs5NDAsNyBAQAogLy8gbmVlZCBub3Qgd3JpdGUgMHhGRkZGRkZGRiBiZWNhdXNlIHdyaXRlIHJlcXVpcmVzIGFuIGVyYXNlIGFuZCBlcmFzZSB3aWxsCiAvLyBtYWtlIHdob2xlIHNlY3RvciAweEZGRkZGRkZGLgogLy8KLQlpZiAoIU9zYWxNZW1Db21wYXJlKHBEYXRhLHVpRXJhc2VQYXR0ZXJuLE1BWF9SV19TSVpFKSkKKwlpZiAoIW1lbWNtcChwRGF0YSx1aUVyYXNlUGF0dGVybixNQVhfUldfU0laRSkpCiAJewogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzMyLDcgKzExMzQsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSU5UIEJlY2VlbUZsYXNoQnVsa1dyaXRlKAorc3RhdGljIElOVCBCZWNlZW1GbGFzaEJ1bGtXcml0ZSgKIAlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCiAJUFVJTlQgcEJ1ZmZlciwKIAlVSU5UIHVpT2Zmc2V0LApAQCAtMTM1MywxNSArMTE1NSw2IEBACiAJVUlOVCB1aVRlbXAgCQkJCT0gMDsKIAlVSU5UIGluZGV4IAkJCQkJPSAwOwogCVVJTlQgdWlQYXJ0T2Zmc2V0IAkJCT0gMDsKLQkjaWYgMAotCXN0cnVjdCB0aW1ldmFsIHR2MSA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0djIgPSB7MH07Ci0KLQlzdHJ1Y3QgdGltZXZhbCB0ciA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0ZSA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0dyA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0d3YgPSB7MH07Ci0JI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJDTV9TSE1fSU5URVJGQUNFKSAmJiAhZGVmaW5lZChGTEFTSF9ESVJFQ1RfQUNDRVNTKQogICBTdGF0dXMgPSBiY21mbGFzaF9yYXdfd3JpdGUoKHVpT2Zmc2V0L0ZMQVNIX1BBUlRfU0laRSksKHVpT2Zmc2V0ICUgRkxBU0hfUEFSVF9TSVpFKSwoIHVuc2lnbmVkIGNoYXIgKilwQnVmZmVyLHVpTnVtQnl0ZXMpOwpAQCAtMTM3NywxMiArMTE3MCw5IEBACiAJdWlDdXJyU2VjdE9mZnNldEFkZHIJPSB1aU9mZnNldCAmIChBZGFwdGVyLT51aVNlY3RvclNpemUgLSAxKTsKIAl1aVNlY3RCb3VuZGFyeQkgIAkJPSB1aVNlY3RBbGlnbkFkZHIgKyBBZGFwdGVyLT51aVNlY3RvclNpemU7CiAKLQkvL3BUZW1wQnVmZiA9IE9zYWxNZW1BbGxvYyhNQVhfU0VDVE9SX1NJWkUsJyFNVk4nKTsKLQlwVGVtcEJ1ZmYgPSBPc2FsTWVtQWxsb2MoQWRhcHRlci0+dWlTZWN0b3JTaXplICwiIU1WTiIpOworCXBUZW1wQnVmZiA9IGttYWxsb2MoQWRhcHRlci0+dWlTZWN0b3JTaXplLCBHRlBfS0VSTkVMKTsKIAlpZihOVUxMID09IHBUZW1wQnVmZikKLQl7CiAJCWdvdG8gQmVjZWVtRmxhc2hCdWxrV3JpdGVfRVhJVDsKLQl9CiAvLwogLy8gY2hlY2sgaWYgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBpcyBvdmVybGFwcGVkIGFjY3Jvc3Mgc2VjdG9ycwogLy8KQEAgLTEzOTksNyArMTE4OSw2IEBACiAJCQl1aU51bVNlY3RUb2JlUmVhZCsrOwogCQl9CiAJfQotCSNpZiAxCiAJLy9DaGVjayB3aGV0aGVyIFJlcXVlc3RlZCBzZWN0b3IgaXMgd3JpdGFibGUgb3Igbm90IGluIGNhc2Ugb2YgZmxhc2gyeCB3cml0ZS4gQnV0IGlmICB3cml0ZSBjYWxsIGlzCiAJLy8gZm9yIERTRCBjYWxpYnJhdGlvbiwgYWxsb3cgaXQgd2l0aG91dCBjaGVja2luZyBvZiBzZWN0b3IgcGVybWlzc2lvbgogCkBAIC0xNDIwLDcgKzEyMDksNiBAQAogCQkJIGluZGV4ID0gaW5kZXggKyAxIDsKIAkJfQogCX0KLQkjZW5kaWYKIAlBZGFwdGVyLT5TZWxlY3RlZENoaXAgPSBSRVNFVF9DSElQX1NFTEVDVDsKIAl3aGlsZSh1aU51bVNlY3RUb2JlUmVhZCkKIAl7CkBAIC0xNDQ4LDEzICsxMjM2LDEzIEBACiAJCWlmKHVpTnVtU2VjdFRvYmVSZWFkID4gMSkKIAkJewogCi0JCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CisJCQltZW1jcHkoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQkJcGNCdWZmZXIgKz0gKCh1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSkpOwogCQkJdWlOdW1CeXRlcyAtPSAodWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJCU9zYWxNZW1Nb3ZlKCZwVGVtcEJ1ZmZbdWlDdXJyU2VjdE9mZnNldEFkZHJdLHBjQnVmZmVyLHVpTnVtQnl0ZXMpOworCQkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKIAkJfQogCiAJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKQEAgLTE1MDMsNyArMTI5MSw3IEBACiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7Ci0JCQkJCWlmKE9zYWxNZW1Db21wYXJlKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQorCQkJCQlpZihtZW1jbXAodWNSZWFkQmssJnBUZW1wQnVmZlt1aUluZGV4XSxNQVhfUldfU0laRSkpCiAJCQkJCXsKIAkJCQkJCWlmKFNUQVRVU19TVUNDRVNTICE9ICgqQWRhcHRlci0+ZnBGbGFzaFdyaXRlV2l0aFN0YXR1c0NoZWNrKShBZGFwdGVyLHVpUGFydE9mZnNldCt1aUluZGV4LCZwVGVtcEJ1ZmZbdWlJbmRleF0pKQogCQkJCQkJewpAQCAtMTU0MSwxMCArMTMyOSw4IEBACiAJewogCQlCY21SZXN0b3JlQmxvY2tQcm90ZWN0U3RhdHVzKEFkYXB0ZXIsdWxTdGF0dXMpOwogCX0KLQlpZihwVGVtcEJ1ZmYpCi0JewotCQlPc2FsTWVtRnJlZShwVGVtcEJ1ZmYsQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKLQl9CisJCisJa2ZyZWUocFRlbXBCdWZmKTsKIAogCUFkYXB0ZXItPlNlbGVjdGVkQ2hpcCA9IFJFU0VUX0NISVBfU0VMRUNUOwogCXJldHVybiBTdGF0dXM7CkBAIC0xNTk5LDE0ICsxMzg1LDEwIEBACiAJdWlDdXJyU2VjdE9mZnNldEFkZHIJPSB1aU9mZnNldCAmIChBZGFwdGVyLT51aVNlY3RvclNpemUgLSAxKTsKIAl1aVNlY3RCb3VuZGFyeQkJCT0gdWlTZWN0QWxpZ25BZGRyICsgQWRhcHRlci0+dWlTZWN0b3JTaXplOwogCi0KLQotLy8JcFRlbXBCdWZmID0gT3NhbE1lbUFsbG9jKE1BWF9TRUNUT1JfU0laRSwnIU1WTicpOwotCXBUZW1wQnVmZiA9IE9zYWxNZW1BbGxvYyhBZGFwdGVyLT51aVNlY3RvclNpemUsIiFNVk4iKTsKKwlwVGVtcEJ1ZmYgPSBrbWFsbG9jKEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYoTlVMTCA9PSBwVGVtcEJ1ZmYpCi0JewogCQlnb3RvIEJlY2VlbUZsYXNoQnVsa1dyaXRlU3RhdHVzX0VYSVQ7Ci0JfQorCiAvLwogLy8gY2hlY2sgaWYgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBpcyBvdmVybGFwcGVkIGFjY3Jvc3Mgc2VjdG9ycwogLy8KQEAgLTE2NjIsMTMgKzE0NDQsMTMgQEAKIAkJaWYodWlOdW1TZWN0VG9iZVJlYWQgPiAxKQogCQl7CiAKLQkJCU9zYWxNZW1Nb3ZlKCZwVGVtcEJ1ZmZbdWlDdXJyU2VjdE9mZnNldEFkZHJdLHBjQnVmZmVyLHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKTsKKwkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CiAJCQlwY0J1ZmZlciArPSAoKHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKSk7CiAJCQl1aU51bUJ5dGVzIC09ICh1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKKwkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKIAkJfQogCiAJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKQEAgLTE2OTgsMjUgKzE0ODAsMTAgQEAKIAkJewogCQkJZm9yKHVpSW5kZXggPSAwO3VpSW5kZXggPCBBZGFwdGVyLT51aVNlY3RvclNpemU7dWlJbmRleCArPSBNQVhfUldfU0laRSkKIAkJCXsKLSNpZiAwCi0JCQkJaWYoMCA9PSBCZWNlZW1GbGFzaEJ1bGtSZWFkKEFkYXB0ZXIsdWlSZWFkQmssdWlPZmZzZXRGcm9tU2VjdFN0YXJ0K3VpSW5kZXggKyBBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgLE1BWF9SV19TSVpFKSkKLQkJCQl7Ci0JCQkJCWZvcih1aVJlYWRJbmRleCA9IDA7dWlSZWFkSW5kZXggPCA0OyB1aVJlYWRJbmRleCsrKQotCQkJCQl7Ci0JCQkJCQlpZigqKChQVUlOVCkmcFRlbXBCdWZmW3VpSW5kZXgrdWlSZWFkSW5kZXgqNF0pICE9IHVpUmVhZEJrW3VpUmVhZEluZGV4XSkKLQkJCQkJCXsKLQkJCQkJCQlTdGF0dXMgPSAtMTsKLQkJCQkJCQlnb3RvIEJlY2VlbUZsYXNoQnVsa1dyaXRlU3RhdHVzX0VYSVQ7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotI2VuZGlmCiAKIAkJCQlpZihTVEFUVVNfU1VDQ0VTUyA9PSBCZWNlZW1GbGFzaEJ1bGtSZWFkKEFkYXB0ZXIsKFBVSU5UKXVjUmVhZEJrLHVpT2Zmc2V0RnJvbVNlY3RTdGFydCt1aUluZGV4LE1BWF9SV19TSVpFKSkKIAkJCQl7Ci0JCQkJCWlmKE9zYWxNZW1Db21wYXJlKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQorCQkJCQlpZihtZW1jbXAodWNSZWFkQmssJnBUZW1wQnVmZlt1aUluZGV4XSxNQVhfUldfU0laRSkpCiAJCQkJCXsKIAkJCQkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogCQkJCQkJZ290byBCZWNlZW1GbGFzaEJ1bGtXcml0ZVN0YXR1c19FWElUOwpAQCAtMTc0NywxMCArMTUxNCw4IEBACiAJewogCQlCY21SZXN0b3JlQmxvY2tQcm90ZWN0U3RhdHVzKEFkYXB0ZXIsdWxTdGF0dXMpOwogCX0KLQlpZihwVGVtcEJ1ZmYpCi0JewotCQlPc2FsTWVtRnJlZShwVGVtcEJ1ZmYsQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKLQl9CisKKwlrZnJlZShwVGVtcEJ1ZmYpOwogCUFkYXB0ZXItPlNlbGVjdGVkQ2hpcCA9IFJFU0VUX0NISVBfU0VMRUNUOwogCXJldHVybiBTdGF0dXM7CiAKQEAgLTE3NzEsNyArMTUzNiw3IEBACiAKIElOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRUVQUk9NVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCVBDSEFSIHBCdWZmID0gT3NhbE1lbUFsbG9jKEJVRkZFUl80SywiM01WTiIpOworCVBDSEFSIHBCdWZmID0ga21hbGxvYyhCVUZGRVJfNEssIEdGUF9LRVJORUwpOwogCVVJTlQgdWlFZXByb21TaXplID0gMDsKIAlVSU5UIHVpSW5kZXggPSAwOwogCVVJTlQgdWlCeXRlc1RvQ29weSA9IDA7CkBAIC0xNzg3LDE0ICsxNTUyLDE0IEBACiAJaWYoMCAhPSBCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aUVlcHJvbVNpemUsRUVQUk9NX1NJWkVfT0ZGU0VULDQpKQogCXsKIAotCQlPc2FsTWVtRnJlZShwQnVmZixCVUZGRVJfNEspOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAl1aUVlcHJvbVNpemUgPj49IDE2OwogCWlmKHVpRWVwcm9tU2l6ZSA+IDEwMjQqMTAyNCkKIAl7Ci0JCU9zYWxNZW1GcmVlKHBCdWZmLEJVRkZFUl80Syk7CisJCWtmcmVlKHBCdWZmKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTgyMCw3ICsxNTg1LDcgQEAKIAl3cm1hbHQoQWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQy00LCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAJdmFsdWUgPSAweGJlYWRiZWFkOwogCXdybWFsdChBZGFwdGVyLCBFRVBST01fQ0FMX0RBVEFfSU5URVJOQUxfTE9DLTgsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQlPc2FsTWVtRnJlZShwQnVmZixNQVhfUldfU0laRSk7CisJa2ZyZWUocEJ1ZmYpOwogCiAJcmV0dXJuIFN0YXR1czsKIApAQCAtMTg3MywxNiArMTYzOCwxMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcEJ1ZmYgPSBPc2FsTWVtQWxsb2ModWlFZXByb21TaXplLCAwKTsKLQorCXBCdWZmID0ga21hbGxvYyh1aUVlcHJvbVNpemUsIEdGUF9LRVJORUwpOwogCWlmICggcEJ1ZmYgPT0gTlVMTCApCi0JewogCQlyZXR1cm4gLTE7Ci0JfQogCiAJaWYoMCAhPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsKFBVSU5UKXBCdWZmLHVpQ2FsU3RhcnRBZGRyLCB1aUVlcHJvbVNpemUpKQogCXsKLQkJT3NhbE1lbUZyZWUocEJ1ZmYsIDApOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE5MDUsNyArMTY2Nyw3IEBACiAJCXVpQnl0ZXNUb0NvcHkgPSBNSU4oQlVGRkVSXzRLLHVpRWVwcm9tU2l6ZSk7CiAJfQogCi0JT3NhbE1lbUZyZWUocEJ1ZmYsIDApOworCWtmcmVlKHBCdWZmKTsKIAlyZXR1cm4gU3RhdHVzOwogCiB9CkBAIC0xOTQ3LDE0ICsxNzA5LDE0IEBACiAJCXsvLyBmb3IgdGhlIHJlcXVlc3RzIG1vcmUgdGhhbiBvciBlcXVhbCB0byBNQVhfUldfU0laRSBieXRlcywgdXNlIGJ1bGsgcmVhZCBmdW5jdGlvbiB0byBtYWtlIHRoZSBhY2Nlc3MgZmFzdGVyLgogCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmYXVpRGF0YVswXSx1aU9mZnNldCxNQVhfUldfU0laRSk7CiAKLQkJCWlmKE9zYWxNZW1Db21wYXJlKCZwQnVmZmVyW3VpSW5kZXhdLCZhdWlEYXRhWzBdLE1BWF9SV19TSVpFKSkKKwkJCWlmKG1lbWNtcCgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCiAJCQl7CiAJCQkJLy8gcmUtd3JpdGUKIAkJCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKShwQnVmZmVyK3VpSW5kZXgpLHVpT2Zmc2V0LE1BWF9SV19TSVpFLEZBTFNFKTsKIAkJCQltZGVsYXkoMyk7CiAJCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmYXVpRGF0YVswXSx1aU9mZnNldCxNQVhfUldfU0laRSk7CiAKLQkJCQlpZihPc2FsTWVtQ29tcGFyZSgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCisJCQkJaWYobWVtY21wKCZwQnVmZmVyW3VpSW5kZXhdLCZhdWlEYXRhWzBdLE1BWF9SV19TSVpFKSkKIAkJCQl7CiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CkBAIC0xOTg2LDcgKzE3NDgsNyBAQAogCQllbHNlCiAJCXsgLy8gSGFuZGxlIHRoZSByZWFkcyBsZXNzIHRoYW4gNCBieXRlcy4uLgogCQkJdWlEYXRhID0gMDsKLQkJCU9zYWxNZW1Nb3ZlKCZ1aURhdGEsKChQVUNIQVIpcEJ1ZmZlcikrKHVpSW5kZXgqc2l6ZW9mKFVJTlQpKSx1aU51bUJ5dGVzKTsKKwkJCW1lbWNweSgmdWlEYXRhLCgoUFVDSEFSKXBCdWZmZXIpKyh1aUluZGV4KnNpemVvZihVSU5UKSksdWlOdW1CeXRlcyk7CiAJCQlCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aVJkYmssdWlPZmZzZXQsNCk7CiAKIAkJCWlmKG1lbWNtcCgmdWlEYXRhLCAmdWlSZGJrLCB1aU51bUJ5dGVzKSkKQEAgLTIxODYsNyArMTk0OCw3IEBACiAKIAkJaWYodWlCeXRlc1RvQ29weSA+PSAoMTYgLXVpRXh0cmFCeXRlcykpCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLHBCdWZmZXIsTUFYX1JXX1NJWkUtIHVpRXh0cmFCeXRlcyk7CisJCQltZW1jcHkoKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcykscEJ1ZmZlcixNQVhfUldfU0laRS0gdWlFeHRyYUJ5dGVzKTsKIAogCQkJaWYgKCBTVEFUVVNfRkFJTFVSRSA9PSBCZWNlZW1FRVBST01Xcml0ZVBhZ2UoIEFkYXB0ZXIsIHVpRGF0YSwgdWlUZW1wT2Zmc2V0ICkgKQogCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CkBAIC0yMTk3LDcgKzE5NTksNyBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJT3NhbE1lbU1vdmUoKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcykscEJ1ZmZlcix1aUJ5dGVzVG9Db3B5KTsKKwkJCW1lbWNweSgoKChQVUNIQVIpJnVpRGF0YVswXSkrdWlFeHRyYUJ5dGVzKSxwQnVmZmVyLHVpQnl0ZXNUb0NvcHkpOwogCiAJCQlpZiAoIFNUQVRVU19GQUlMVVJFID09IEJlY2VlbUVFUFJPTVdyaXRlUGFnZSggQWRhcHRlciwgdWlEYXRhLCB1aVRlbXBPZmZzZXQgKSApCiAJCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKQEAgLTIyMzMsNyArMTk5NSw3IEBACiAJLy8gVG8gcHJvZ3JhbSBub24gMTZieXRlIGFsaWduZWQgZGF0YSwgcmVhZCAxNmJ5dGUgYW5kIHRoZW4gdXBkYXRlLgogCS8vCiAJCQlCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aURhdGFbMF0sdWlPZmZzZXQsMTYpOwotCQkJT3NhbE1lbU1vdmUoJnVpRGF0YVswXSxwQnVmZmVyK3VpSW5kZXgsdWlCeXRlc1RvQ29weSk7CisJCQltZW1jcHkoJnVpRGF0YVswXSxwQnVmZmVyK3VpSW5kZXgsdWlCeXRlc1RvQ29weSk7CiAKIAogCQkJaWYgKCBTVEFUVVNfRkFJTFVSRSA9PSBCZWNlZW1FRVBST01Xcml0ZVBhZ2UoIEFkYXB0ZXIsIHVpRGF0YSwgdWlPZmZzZXQgKSApCkBAIC0yNTM1LDcgKzIyOTcsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpCitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpCiB7CiAJVUlOVCB1aVNlY3RvclNpemUgPSAwOwogCVVJTlQgdWlTZWN0b3JTaWcgPSAwOwpAQCAtMjY0MiwyMCArMjQwNCw4IEBACiAKIElOVCBCY21Jbml0TlZNKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcikKIHsKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotI2lmZGVmIEZMQVNIX0RJUkVDVF9BQ0NFU1MKLQl1bnNpZ25lZCBpbnQgZGF0YSxkYXRhMSxkYXRhMiA9IDE7Ci0Jd3JtKHBzX2FkYXB0ZXIsIFBBRF9TRUxFQ1RfUkVHSVNURVIsICZkYXRhMiwgNCk7Ci0JZGF0YTEgPSByZG0ocHNfYWRhcHRlcixTWVNfQ0ZHLCZkYXRhLDQpOwotCWRhdGExID0gcmRtKHBzX2FkYXB0ZXIsU1lTX0NGRywmZGF0YSw0KTsKLQlkYXRhMiA9IChkYXRhIHwgMHg4MCB8IDB4ODAwMCk7Ci0Jd3JtKHBzX2FkYXB0ZXIsU1lTX0NGRywgJmRhdGEyLDQpOyAvLyBvdmVyLXdyaXRlIGFzIEZsYXNoIGJvb3QgbW9kZQotI2VuZGlmCi0JcHNfYWRhcHRlci0+ZU5WTVR5cGUgPSBOVk1fRkxBU0g7Ci0jZWxzZQogCUJjbVZhbGlkYXRlTnZtVHlwZShwc19hZGFwdGVyKTsKIAlCY21Jbml0RUVQUk9NUXVldWVzKHBzX2FkYXB0ZXIpOwotI2VuZGlmCiAKIAlpZihwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fQVVUT0RFVEVDVCkKIAl7CkBAIC0yNjg0LDcgKzI0MzQsNyBAQAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUlOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgQmNtR2V0TnZtU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSkKIAl7CkBAIC0yNzA4LDcgKzI0NTgsNyBAQAogLy8gUmV0dXJuczoKIC8vCQk8Vk9JRD4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZPSUQgQmNtVmFsaWRhdGVOdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBWT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAkvLwpAQCAtMjc3NSw3ICsyNTI1LDcgQEAKIAlpZihwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyA9PSBOVUxMKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNhbid0IEFsbG9jYXRlIG1lbW9yeSBmb3IgRmxhc2ggMi54Iik7Ci0JCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOworCQlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI3ODMsOCArMjUzMyw4IEBACiAJaWYocHNBZGFwdGVyLT5wc0ZsYXNoMnhWZW5kb3JJbmZvID09IE5VTEwpCiAJewogCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ2FuJ3QgQWxsb2NhdGUgVmVuZG9yIEluZm8gTWVtb3J5IGZvciBGbGFzaCAyLngiKTsKLQkJYmNtX2tmcmVlKHBzQWRhcHRlci0+cHNGbGFzaENTSW5mbyk7Ci0JCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7CisJCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaENTSW5mbyk7CisJCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNzk4LDkgKzI1NDgsOSBAQAogCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiIEFkYXB0ZXIgc3RydWN0dXJlIHBvaW50IGlzIE5VTEwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOwotCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7Ci0JYmNtX2tmcmVlKHBzQWRhcHRlci0+cHNGbGFzaDJ4VmVuZG9ySW5mbyk7CisJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvKTsKKwlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7CisJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoMnhWZW5kb3JJbmZvKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1MgOwogfQogCkBAIC0yOTU0LDcgKzI3MDQsNyBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotSU5UIElzU2VjdGlvbkV4aXN0SW5WZW5kb3JJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKQorc3RhdGljIElOVCBJc1NlY3Rpb25FeGlzdEluVmVuZG9ySW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbikKIHsKICAJcmV0dXJuICggQWRhcHRlci0+dWlWZW5kb3JFeHRuRmxhZyAmJgogIAkJKEFkYXB0ZXItPnBzRmxhc2gyeFZlbmRvckluZm8tPlZlbmRvclNlY3Rpb25bc2VjdGlvbl0uQWNjZXNzRmxhZ3MgJiBGTEFTSDJYX1NFQ1RJT05fUFJFU0VOVCkgJiYKQEAgLTMwNTIsNyArMjgwMiw3IEBACiAvLwkJPFZPSUQ+CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUlOVCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldEZsYXNoQ1NJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAkvL0ZMQVNIX0NTX0lORk8gc0ZsYXNoQ3NJbmZvID0gezB9OwogCkBAIC0zMDcwLDcgKzI4MjAsNiBAQAogCW1lbXNldChBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCAwICxzaXplb2YoRkxBU0hfQ1NfSU5GTykpOwogCW1lbXNldChBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIDAgLHNpemVvZihGTEFTSDJYX0NTX0lORk8pKTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCWlmKCFBZGFwdGVyLT5iRERSSW5pdERvbmUpCiAJewogCQl7CkBAIC0zMDc5LDcgKzI4MjgsNiBAQAogCQl9CiAJfQogCi0jZW5kaWYKIAogCS8vIFJlYWRpbmcgZmlyc3QgOCBCeXRlcyB0byBnZXQgdGhlIEZsYXNoIExheW91dAogCS8vIE1hZ2ljTnVtYmVyKDQgYnl0ZXMpICtGbGFzaExheW91dE1pbm9yVmVyc2lvbigyIEJ5dGVzKSArRmxhc2hMYXlvdXRNYWpvclZlcnNpb24oMiBCeXRlcykKQEAgLTMxNDcsOSArMjg5NSw3IEBACiAJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCX0KIAkJQ29udmVydEVuZGlhbk9mMlhDU1N0cnVjdHVyZShBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8pOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQlCY21EdW1wRmxhc2gyWENTU3RydWN0dXJlKEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyxBZGFwdGVyKTsKLSNlbmRpZgogCQlpZigoRkxBU0hfQ09OVFJPTF9TVFJVQ1RfU0lHTkFUVVJFID09IEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+TWFnaWNOdW1iZXIpICYmCiAJCSAgIChTQ1NJX0ZJUk1XQVJFX01JTk9SX1ZFUlNJT04gPD0gTUlOT1JfVkVSU0lPTihBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8tPlNDU0lGaXJtd2FyZVZlcnNpb24pKSAmJgogCQkgICAoRkxBU0hfU0VDVE9SX1NJWkVfU0lHID09IEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+Rmxhc2hTZWN0b3JTaXplU2lnKSAmJgpAQCAtMzE4MSwyMSArMjkyNywxMCBAQAogCUNvbmNlcm5zOiB3aGF0IGlmIENTIHNlY3RvciBzaXplIGRvZXMgbm90IG1hdGNoIHdpdGggdGhpcyBzZWN0b3Igc2l6ZSA/Pz8KIAl3aGF0IGlzIHRoZSBpbmRpY2F0aW9uIG9mIEFjY2Vzc0JpdE1hcCAgaW4gQ1MgaW4gZmxhc2ggMi54ID8/Pz8KIAkqLwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCUFkYXB0ZXItPnVsRmxhc2hJRCA9IEJjbVJlYWRGbGFzaFJESUQoQWRhcHRlcik7Ci0jZW5kaWYKIAogCUFkYXB0ZXItPnVpRmxhc2hMYXlvdXRNYWpvclZlcnNpb24gPSB1aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uOwogCi0JI2lmIDAKLQlpZihGTEFTSF9QQVJUX1NTVDI1VkYwODBCID09IEFkYXB0ZXItPnVsRmxhc2hJRCkKLQl7Ci0JLy8KLQkvLyAxTUIgZmxhc2ggaGFzIGJlZW4gc2VsZWN0ZWQuIHdlIGhhdmUgdG8gdXNlIDY0SyBhcyBzZWN0b3Igc2l6ZSBubyBtYXR0ZXIgd2hhdCBpcyBrZXB0IGluIEZMQVNIX0NTLgotCS8vCi0JCUFkYXB0ZXItPnVpU2VjdG9yU2l6ZSA9IDB4MTAwMDA7Ci0JfQotCSNlbmRpZgogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKIH0KQEAgLTMyMTQsNyArMjk0OSw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1OVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBOVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlVSU5UIHVpRGF0YSA9IDA7CiAKQEAgLTM1NjksMzkgKzMzMDQsNiBAQAogfQogCiAvKioKLSoJUmVhZERTREhlYWRlciA6IFJlYWQgdGhlIERTRCBtYXAgZm9yIHRoZSBEU0QgU2VjdGlvbiB2YWwgcHJvdmlkZWQgaW4gQXJndW1lbnQuCi0qCUBBZGFwdGVyIDogQmVjZWVtIFByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKLSoJQHBzRFNESGVhZGVyIDpQb2ludGVyIG9mIHRoZSBidWZmZXIgd2hlcmUgaGVhZGVyIGhhcyB0byBiZSByZWFkCi0qCUBkc2QgOnZhbHVlIG9mIHRoZSBEeWFubWljIERTRCBsaWtlIERTRDAgb2YgRFNEMSBvciBEU0QyCi0qCi0qCVJldHVybiBWYWx1ZTotCi0qCQlpZiBzdWNlZWRzIHJldHVybiBTVEFUVVNfU1VDQ0VTUyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlLgotKiovCi1JTlQgUmVhZERTREhlYWRlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBEU0RfSEVBREVSIHBzRFNESGVhZGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCkKLXsKLQlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0KLQlTdGF0dXMgPUJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLAotCQkJCQkJICAgIChQVUlOVClwc0RTREhlYWRlciwKLQkJCQkJCQlkc2QsCi0JCQkJCQkJQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRGcm9tRFNEU3RhcnRGb3JEU0RIZWFkZXIsCi0JCQkJCQkJc2l6ZW9mKERTRF9IRUFERVIpKTsKLQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJEU0RJbWFnZU1hZ2ljTnVtYmVyIDowWCV4IiwgbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlTWFnaWNOdW1iZXIpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiRFNESW1hZ2VTaXplIDowWCV4ICIsbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlU2l6ZSkpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJEU0RJbWFnZUNSQyA6MFgleCIsbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlQ1JDKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIkRTREltYWdlUHJpb3JpdHkgOjBYJXgiLG50b2hsKHBzRFNESGVhZGVyLT5EU0RJbWFnZVByaW9yaXR5KSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRFNEIEhlYWRlciByZWFkIGlzIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCX0KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qKgogKglCY21HZXRBY3RpdmVEU0QgOiBTZXQgdGhlIEFjdGl2ZSBEU0QgaW4gQWRhcHRlciBTdHJ1Y3R1cmUgd2hpY2ggaGFzIHRvIGJlIGR1bXBlZCBpbiBERFIKICoJQEFkYXB0ZXIgOi1Ecml2ZXJzIHByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKICoKQEAgLTM2MDksNyArMzMxMSw3IEBACiAqCQlSZXR1cm4gU1RBVFVTX1NVQ0VTUyBpZiBnZXQgc3VjZXNzIGluIHNldHRpbmcgdGhlIHJpZ2h0IERTRCBlbHNlIG5lZ2FpdmUgZXJyb3IgY29kZQogKgogKiovCi1JTlQgQmNtR2V0QWN0aXZlRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgQmNtR2V0QWN0aXZlRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlGTEFTSDJYX1NFQ1RJT05fVkFMIHVpSGlnaGVzdFByaURTRCA9IDAgOwogCkBAIC0zNjQ3LDM5ICszMzQ5LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLS8qKgotKglSZWFkSVNPVW5SZXNlcnZlZEJ5dGVzIDogUmVhZCB0aGUgSVNPIG1hcCBmb3IgdGhlIElTTyBTZWN0aW9uIHZhbCBwcm92aWRlZCBpbiBBcmd1bWVudC4KLSoJQEFkYXB0ZXIgOiBEcml2ZXIgUHJpdmF0ZSBEYXRhIFN0cnVjdHVyZQotKglAcHNJU09IZWFkZXIgOlBvaW50ZXIgb2YgdGhlIGxvY2F0aW9uIHdoZXJlIGhlYWRlciBoYXMgdG8gYmUgcmVhZAotKglASXNvSW1hZ2UgOnZhbHVlIG9mIHRoZSBEeWFubWljIElTTyBsaWtlIElTT19JTUFHRTEgb2YgSVNPX0lNQUdFMgotKgotKglSZXR1cm4gVmFsdWU6LQotKgkJaWYgc3VjZWVkcyByZXR1cm4gU1RBVFVTX1NVQ0NFU1Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSoqLwotCi1JTlQgUmVhZElTT0hlYWRlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBJU09fSEVBREVSIHBzSVNPSGVhZGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIElzb0ltYWdlKQotewotCUlOVCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQotCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLAotCQkJCQkgICAgKFBVSU5UKXBzSVNPSGVhZGVyLAotCQkJCQkJSXNvSW1hZ2UsCi0JCQkJCQkwLAotCQkJCQkJc2l6ZW9mKElTT19IRUFERVIpKTsKLQotCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIklTT0ltYWdlTWFnaWNOdW1iZXIgOjBYJXgiLCBudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VNYWdpY051bWJlcikpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJJU09JbWFnZVNpemUgOjBYJXggIixudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VTaXplKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIklTT0ltYWdlQ1JDIDowWCV4IixudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VDUkMpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiSVNPSW1hZ2VQcmlvcml0eSA6MFgleCIsbnRvaGwocHNJU09IZWFkZXItPklTT0ltYWdlUHJpb3JpdHkpKTsKLQl9Ci0JZWxzZQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSVNPIEhlYWRlciBSZWFkIGZhaWxlZCIpOwotCX0KLQlyZXR1cm4gU3RhdHVzOwotfQogCiAvKioKICoJQmNtR2V0QWN0aXZlSVNPIDotIFNldCB0aGUgQWN0aXZlIElTTyBpbiBBZGFwdGVyIERhdGEgU3RydWN0dWUKQEAgLTM2OTEsNyArMzM2MCw3IEBACiAqCiAqKi8KIAotSU5UIEJjbUdldEFjdGl2ZUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldEFjdGl2ZUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAlJTlQgSGlnaGVzdFByaUlTTyA9IDAgOwpAQCAtNDU4OCw3ICs0MjU3LDcgQEAKIAogCX0KIAotCWJjbV9rZnJlZShCdWZmKTsKKwlrZnJlZShCdWZmKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC00Nzg5LDcgKzQ0NTgsNyBAQAogCVN1Y2Nlc3MgOi0gQmFzZSBBZGRyZXNzIG9mIHRoZSBGbGFzaAogKiovCiAKLUlOVCBHZXRGbGFzaEJhc2VBZGRyKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAlVSU5UIHVpQmFzZUFkZHIgPSAwOwpAQCAtNDg2NiwyMCArNDUzNSw2IEBACiAJCXJldHVybiAgLUVJTlZBTDsKIAl9CiAKLQkjaWYgMAotCWVsc2UKLQl7Ci0JCWlmKChTcmNTZWN0aW9uID09IFZTQTApIHx8IChTcmNTZWN0aW9uID09IFZTQTEpIHx8IChTcmNTZWN0aW9uID09IFZTQTIpKQotCQl7Ci0JCQlpZigoRHN0U2VjdGlvbiAhPSBWU0EwKSAmJiAoRHN0U2VjdGlvbiAhPSBWU0ExKSAmJiAoRHN0U2VjdGlvbiAhPSBWU0EyKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIlNvdXJjZSBhbmQgRGVzdGlvbiBzZWN0b24gaXMgbm90IG9mIHNhbWUgdHlwZSIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQl9Ci0JI2VuZGlmCiAJLy9pZiBvZmZzZXQgemVybyBtZWFucyBoYXZlIHRvIGNvcHkgY29tcGxldGUgc2VjdG9uCiAKIAlpZihudW1PZkJ5dGVzID09IDApCkBAIC00OTU0LDcgKzQ2MDksNyBAQAogCQkJCUJ5dGVzVG9CZUNvcGllZCA9IG51bU9mQnl0ZXM7CiAJCX0KIAl9d2hpbGUobnVtT2ZCeXRlcyA+IDApIDsKLQliY21fa2ZyZWUocEJ1ZmYpOworCWtmcmVlKHBCdWZmKTsKIAlBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9IEZBTFNFIDsKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtNDk3OSwxNCArNDYzNCw2IEBACiAJVUlOVCB1aVNlY3RBbGlnbkFkZHIgPSAwOwogCVVJTlQgc2lnID0gMDsKIAotCSNpZiAwCi0JLy9pZiBDaGVuZ2VzIGluIEhlYWRlciBpcyBhbGxvd2VkLCBSZXR1cm4gYmFjawotCWlmKEFkYXB0ZXItPmJIZWFkZXJDaGFuZ2VBbGxvd2VkID09IFRSVUUpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJIZWFkZXIgQ2hhbmdlIGlzIGFsbG93ZWQiKTsKLQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKLQl9Ci0JI2VuZGlmCiAJLy9tYWtpbmcgdGhlIG9mZnNldCBzZWN0b3IgYWxsaWduZWQKIAl1aVNlY3RBbGlnbkFkZHIgPSB1aU9mZnNldCAmIH4oQWRhcHRlci0+dWlTZWN0b3JTaXplIC0gMSk7CiAKQEAgLTUwMjQsNyArNDY3MSw3IEBACiAJCS8vUmVwbGFjZSBCdWZmZXIgY29udGVudCB3aXRoIEhlYWRlcgogCQltZW1jcHkocEJ1ZmYgK29mZnNldFRvUHJvdGVjdCxwVGVtcEJ1ZmYsSGVhZGVyU2l6ZVRvUHJvdGVjdCk7CiAKLQkJYmNtX2tmcmVlKHBUZW1wQnVmZik7CisJCWtmcmVlKHBUZW1wQnVmZik7CiAJfQogCWlmKGJIYXNIZWFkZXIgJiYgQWRhcHRlci0+YlNpZ0NvcnJ1cHRlZCkKIAl7CkBAIC01MDQ0LDI5ICs0NjkxLDcgQEAKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9Ci1JTlQgQmNtTWFrZUZsYXNoQ1NBY3RpdmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCkKLXsKLQlVSU5UIEdQSU9Db25maWcgPSAwIDsKIAotCi0JaWYoQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9PSBGQUxTRSkKLQl7Ci0JCS8vQXBwbGljYWJsZSBmb3IgRmxhc2gyLngKLQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpID09IEZBTFNFKQotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KLQotCWlmKG9mZnNldC9GTEFTSF9QQVJUX1NJWkUpCi0JewotCQkvL2JpdFsxNC4uMTJdIC0+IHdpbGwgc2VsZWN0IG1ha2UgQWN0aXZlIENTMSwgQ1MyIG9yIENTMwotCQkvLyBTZWxlY3QgQ1MxLCBDUzIgYW5kIENTMyAoQ1MwIGlzIGRlZGljYXRlZCBwaW4pCi0JCXJkbWFsdChBZGFwdGVyLEZMQVNIX0dQSU9fQ09ORklHX1JFRywgJkdQSU9Db25maWcsIDQpOwotCQlHUElPQ29uZmlnIHw9ICg3IDw8IDEyKTsKLQkJd3JtYWx0KEFkYXB0ZXIsRkxBU0hfR1BJT19DT05GSUdfUkVHLCAmR1BJT0NvbmZpZywgNCk7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKLX0KIC8qKgogQmNtRG9DaGlwU2VsZWN0IDogVGhpcyB3aWxsIHNlbGNldCB0aGUgYXBwcm9wcmlhdGUgY2hpcCBmb3Igd3JpdGluZy4KIEBBZGFwYXRlciA6LSBCY20gRHJpdmVyIFByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKQEAgLTUwNzQsNyArNDY5OSw3IEBACiBPdXRQdXQ6LQogCVNlbGVjdCB0aGUgQXBwcm9wcmlhdGUgY2hpcCBhbmQgcmV0cm4gc3RhdHVzIFN1Y2VzcwogKiovCi1JTlQgQmNtRG9DaGlwU2VsZWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpCitzdGF0aWMgSU5UIEJjbURvQ2hpcFNlbGVjdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgb2Zmc2V0KQogewogCVVJTlQgRmxhc2hDb25maWcgPSAwOwogCUlOVCBDaGlwTnVtID0gMDsKQEAgLTUzNjUsMzkgKzQ5OTAsNiBAQAogCXJldHVybiBTdGF0dXM7CiB9CiAKLSNpZiAwCi1VSU5UIGdldE51bU9mU3ViU2VjdGlvbldpdGhXUlBlcm1pc3NvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFNFQ1RJT05fVFlQRSBzZWNUeXBlKQotewotCi0JVUlOVCBudW1PZldSU3ViU2VjID0gMDsKLQlzd2l0Y2goc2VjVHlwZSkKLQl7Ci0JCWNhc2UgSVNPIDoKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsSVNPX0lNQUdFMSkpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJaWYoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlcixJU09fSU1BR0UyKSkKLQkJCQludW1PZldSU3ViU2VjID0gbnVtT2ZXUlN1YlNlYyArIDE7Ci0JCQlicmVhazsKLQotCQljYXNlIERTRCA6Ci0JCQlpZihJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLERTRDIpKQotCQkJCW51bU9mV1JTdWJTZWMgPSBudW1PZldSU3ViU2VjICsgMTsKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsRFNEMSkpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJaWYoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlcixEU0QwKSkKLQkJCQludW1PZldSU3ViU2VjID0gbnVtT2ZXUlN1YlNlYyArIDE7Ci0JCQlicmVhayA7Ci0KLQkJY2FzZSBWU0EgOgotCQkJCS8vZm9yIFZTQSBBZGQgY29kZSBIZXJlCi0JCSBkZWZhdWx0IDoKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiSW52YWxpZCBzZWN0b248JWQ+IGlzIHBhc3NlZCIsIHNlY1R5cGUpO1wKLQkJCW51bU9mV1JTdWJTZWMgPSAwOwotCi0JfQotCXJldHVybiBudW1PZldSU3ViU2VjOwotfQotI2VuZGlmCiBCT09MRUFOIElzU2VjdGlvbkV4aXN0SW5GbGFzaChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbikKIHsKIApAQCAtNTQ3OSw3ICs1MDcxLDcgQEAKIAkJcmV0dXJuIFN0YXR1cyA7CiB9CiAKLUlOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpCitzdGF0aWMgSU5UIENvcnJ1cHREU0RTaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCkKIHsKIAogCVBVQ0hBUiBwQnVmZiA9IE5VTEw7CkBAIC01NTQzLDE2ICs1MTM1LDE2IEBACiAJZWxzZQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCQ00gU2lnbmF0dXJlIGlzIG5vdCBwcmVzZW50IGluIGhlYWRlciIpOwotCQliY21fa2ZyZWUocEJ1ZmYpOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQliY21fa2ZyZWUocEJ1ZmYpOworCWtmcmVlKHBCdWZmKTsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIkNvcnJ1cHRlZCB0aGUgc2lnbmF0dXJlIik7CiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKIH0KIAotSU5UIENvcnJ1cHRJU09TaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCkKK3N0YXRpYyBJTlQgQ29ycnVwdElTT1NpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKQogewogCiAJUFVDSEFSIHBCdWZmID0gTlVMTDsKQEAgLTU1OTMsMTQgKzUxODUsMTQgQEAKIAllbHNlCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJDTSBTaWduYXR1cmUgaXMgbm90IHByZXNlbnQgaW4gaGVhZGVyIik7Ci0JCWJjbV9rZnJlZShwQnVmZik7CisJCWtmcmVlKHBCdWZmKTsKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCX0KIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiQ29ycnVwdGVkIHRoZSBzaWduYXR1cmUiKTsKIAlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLHBCdWZmLE1BWF9SV19TSVpFKTsKIAotCWJjbV9rZnJlZShwQnVmZik7CisJa2ZyZWUocEJ1ZmYpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5oCmluZGV4IDZlYzZjYTguLjY1MWI1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uaApAQCAtMzIzLDE1ICszMjMsNiBAQAogCiAKIAotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0KLSNkZWZpbmUgRkxBU0hfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAwMDAwCi1leHRlcm4gaW50IGJjbWZsYXNoX3Jhd19yZWFkKHVuc2lnbmVkIGludCBmbGFzaF9pZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqaW5idWYsIHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIGludCBiY21mbGFzaF9yYXdfd3JpdGUodW5zaWduZWQgaW50IGZsYXNoX2lkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIGludCBiY21mbGFzaF9yYXdfd3JpdGVub2VyYXNlKHVuc2lnbmVkIGludCBmbGFzaF9pZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqb3V0YnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQotCi0jZW5kaWYKIAogI2RlZmluZSBGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQUZURVJfSU5JVCAgIDB4MUMwMDAwMDAKICNkZWZpbmUgRkxBU0hfQ09OVElHSU9VU19TVEFSVF9BRERSX0JFRk9SRV9JTklUICAweDFGMDAwMDAwCkBAIC00MTQsNzYgKzQwNSw1IEBACiAKICNkZWZpbmUgRklFTERfT0ZGU0VUX0lOX0hFQURFUihIZWFkZXJQb2ludGVyLEZpZWxkKSAoKFBVQ0hBUikmKChIZWFkZXJQb2ludGVyKShOVUxMKSktPkZpZWxkIC0gKFBVQ0hBUikoTlVMTCkpCiAKLSNpZiAwCi1JTlQgQmVjZWVtRUVQUk9NQnVsa1JlYWQoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMpOwotCi0KLUlOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVJTlQgQmNtR2V0Rmxhc2hTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVJTlQgQmNtR2V0Rmxhc2hTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLQotCi1JTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQotSU5UIFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21GbGFzaFRvTWVtb3J5KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLUlOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRUVQUk9NVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotCi1JTlQgQmVjZWVtRUVQUk9NQnVsa1dyaXRlKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUNIQVIgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcywKLQlCT09MRUFOIGJWZXJpZnkpOwotCi0KLUlOVCBSZWFkQmVjZWVtRUVQUk9NKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIGR3QWRkcmVzcywgVUlOVCAqcGR3RGF0YSk7Ci0KLU5WTV9UWVBFIEJjbUdldE52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotSU5UIEJlY2VlbU5WTVJlYWQoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMpOwotCi1JTlQgQmVjZWVtTlZNV3JpdGUoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQotSU5UIFJlYWRNYWNBZGRyZXNzRnJvbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1JTlQgQmNtVXBkYXRlU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlY3RvclNpemUpOwotCi1JTlQgQmNtSW5pdE5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIEJjbUdldEZsYXNoQ1NJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLSNlbmRpZgotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9vc2FsX21pc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vb3NhbF9taXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGFkZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9vc2FsX21pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLQkvKisrCi0KLQlDb3B5cmlnaHQgKGMpIEJlY2VlbSBDb21tdW5pY2F0aW9ucyBJbmMuCi0KLQlNb2R1bGUgTmFtZToKLQkJT1NBTF9NaXNjLmgKLQotCUFic3RyYWN0OgotCQlQcm92aWRlcyB0aGUgT1MgQWJzdHJhY3RlZCBtYWNyb3MgdG8gYWNjZXNzOgotCQkJTGlua2VkIExpc3RzCi0JCQlEaXNwYXRjaGVyIE9iamVjdHMoRXZlbnRzLFNlbWFwaG9yZXMsU3BpbiBMb2NrcyBhbmQgdGhlIGxpa2UpCi0JCQlGaWxlcwotCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCQlXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0Ci0JCS0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTmFtZQkJRGF0ZQkJQ3JlYXRlZC9yZXZpZXdlZC9tb2RpZmllZAotCQlSYWplZXYJCTI0LzEvMDgJCUNyZWF0ZWQKLQlOb3RlczoKLQotCS0tKi8KLSNpZm5kZWYgX09TQUxfTUlTQ19IXwotI2RlZmluZSBfT1NBTF9NSVNDX0hfCi0vL09TQUwgTWFjcm9zCi0vL09TQUwgUHJpbWl0aXZlcwotdHlwZWRlZiBQVUNIQVIgIFBPU0FMX05XX1BBQ0tFVCAgOwkJLy9OdyBwYWNrZXRzCi0KLQotI2RlZmluZSBPc2FsTWVtQWxsb2Mobix0KSBrbWFsbG9jKG4sR0ZQX0tFUk5FTCkKLQotI2RlZmluZSBPc2FsTWVtRnJlZSh4LG4pIGJjbV9rZnJlZSh4KQotCi0jZGVmaW5lIE9zYWxNZW1Nb3ZlKGRlc3QsIHNyYywgbGVuKQkJXAotewkJCQkJCQkJCQlcCi0JCQltZW1jcHkoZGVzdCxzcmMsIGxlbik7CQlcCi19Ci0KLSNkZWZpbmUgT3NhbFplcm9NZW1vcnkocERlc3QsIExlbikJCVwKLXsJCQkJCQkJCQkJXAotCQkJbWVtc2V0KHBEZXN0LDAsTGVuKTsJCVwKLX0KLQotLy8jZGVmaW5lIE9zYWxNZW1TZXQocFNyYyxDaGFyLExlbikgbWVtc2V0KHBTcmMsQ2hhcixMZW4pCi0KLWJvb2wgT3NhbE1lbUNvbXBhcmUodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBVSU5UIGxlbik7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCmluZGV4IGEyN2JiMGIuLjk5ZTY3NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCkBAIC00MywxNCArNDMsOCBAQAogCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L2R3bXcyL2xpbnV4LWZpcm13YXJlLmdpdAogCWh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9kd213Mi9saW51eC1maXJtd2FyZS5naXQKIAotRm9yIGFsbCBjaGlwcywgY29weSBicmNtL2JjbTQzeHgtMC02MTAtODA5LTAuZncgYW5kCi1icmNtL2JjbTQzeHhfaGRyLTAtNjEwLTgwOS0wLmZ3IHRvIC9saWIvZmlybXdhcmUvYnJjbSAob3Igd2hlcmV2ZXIgZmlybXdhcmUgaXMKLW5vcm1hbGx5IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtKS4gIEluIHRoZSAvbGliL2Zpcm13YXJlL2JyY20gZGlyZWN0b3J5LCB0aGVuCi1jcmVhdGUgdGhlIGZvbGxvd2luZyBzeW1saW5rczoKLQotCWxuIC1zIGJjbTQzeHgtMC02MTAtODA5LTAuZncgYmNtNDN4eC0wLmZ3Ci0JbG4gLXMgYmNtNDN4eF9oZHItMC02MTAtODA5LTAuZncgYmNtNDN4eF9oZHItMC5mdwotCitGb3IgYWxsIGNoaXBzLCBjb3B5IGJyY20vYmNtNDN4eC0wLmZ3IGFuZCBicmNtL2JjbTQzeHhfaGRyLTAuZncgdG8KKy9saWIvZmlybXdhcmUvYnJjbSAob3Igd2hlcmV2ZXIgZmlybXdhcmUgaXMgbm9ybWFsbHkgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtKS4KIAogQ3VycmVudGx5IHN1cHBvcnRlZCBjaGlwcwogPT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKaW5kZXggNDM2MDFmYS4uYmUyOWU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKQEAgLTI1LDggKzI1LDkgQEAKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9kd213Mi9saW51eC1maXJtd2FyZS5naXQKIAlodHRwczovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvZHdtdzIvbGludXgtZmlybXdhcmUuZ2l0CiAKLUZvciA0MzI5IGNoaXAsIGNvcHkgYnJjbS9iY200MzI5LWZ1bGxtYWMtNC0yMTgtMjQ4LTUuYmluIGFuZAotYmNtNDMyOS1mdWxsbWFjLTQtMjE4LTI0OC01LnR4dCB0byAvbGliL2Zpcm13YXJlL2JyY20KK0ZvciA0MzI5IGNoaXAsIGNvcHkgYnJjbS9iY200MzI5LWZ1bGxtYWMtNC5iaW4gYW5kIGJyY20vYmNtNDMyOS1mdWxsbWFjLTQudHh0Cit0byAvbGliL2Zpcm13YXJlL2JyY20gKG9yIHdoZXJldmVyIGZpcm13YXJlIGlzIG5vcm1hbGx5IGluc3RhbGxlZCBvbiB5b3VyCitzeXN0ZW0pLgogCiBDb250YWN0IEluZm86CiA9PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwppbmRleCA0YzYxM2RhLi5hY2Y0M2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKQEAgLTE2LDEzICsxNiwxNCBAQAogLyogKioqKioqKioqKioqKioqKioqIEJDTVNESCBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8YmNtZGV2cy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8aG5kc29jLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgotI2luY2x1ZGUgPG9zbC5oPgogCiAjaW5jbHVkZSA8YmNtc2RoLmg+CQkvKiBCUkNNIEFQSSBmb3IgU0RJTwogCQkJIGNsaWVudHMgKHN1Y2ggYXMgd2wsIGRoZCkgKi8KQEAgLTM4LDcgKzM5LDcgQEAKIAlib29sIGluaXRfc3VjY2VzczsJLyogdW5kZXJseWluZyBkcml2ZXIgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkICovCiAJdm9pZCAqc2Rpb2g7CQkvKiBoYW5kbGVyIGZvciBzZGlvaCAqLwogCXUzMiB2ZW5kZXZpZDsJLyogVGFyZ2V0IFZlbmRvciBhbmQgRGV2aWNlIElEIG9uIFNEIGJ1cyAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJYm9vbCByZWdmYWlsOwkJLyogU2F2ZSBzdGF0dXMgb2YgbGFzdAogCQkJCSByZWdfcmVhZC9yZWdfd3JpdGUgY2FsbCAqLwogCXUzMiBzYndhZDsJCS8qIFNhdmUgYmFja3BsYW5lIHdpbmRvdyBhZGRyZXNzICovCkBAIC01NSw3ICs1Niw4IEBACiB9CiAjZW5kaWYKIAotYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpjZmdoZGwsIHZvaWQgKipyZWdzdmEsIHVpbnQgaXJxKQorYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2ZnaGRsLAorCQkJCXZvaWQgKipyZWdzdmEsIHVpbnQgaXJxKQogewogCWJjbXNkaF9pbmZvX3QgKmJjbXNkaDsKIApAQCAtODQsNyArODYsNyBAQAogCXJldHVybiBiY21zZGg7CiB9CiAKLWludCBiY21zZGhfZGV0YWNoKG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK2ludCBiY21zZGhfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpCiB7CiAJYmNtc2RoX2luZm9fdCAqYmNtc2RoID0gKGJjbXNkaF9pbmZvX3QgKikgc2RoOwogCkBAIC00NTEsNyArNDUzLDcgQEAKIAogaW50CiBiY21zZGhfcmVjdl9idWYodm9pZCAqc2RoLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKKwkJdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QsCiAJCWJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpCiB7CiAJYmNtc2RoX2luZm9fdCAqYmNtc2RoID0gKGJjbXNkaF9pbmZvX3QgKikgc2RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX2xpbnV4LmMKaW5kZXggOTAyOGNkMC4uZDI0YjVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9saW51eC5jCkBAIC0yMCw4ICsyMCw3IEBACiAKICNkZWZpbmUgX19VTkRFRl9OT19WRVJTSU9OX18KIAotI2luY2x1ZGUgPGxpbnV4dmVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKQEAgLTU3LDcgKzU2LDcgQEAKICNlbHNlCiAJc3RydWN0IHBjaV9kZXYgKmRldjsJLyogcGNpIGRldmljZSBoYW5kbGUgKi8KICNlbmRpZgkJCQkvKiBCQ01QTEFURk9STV9CVVMgKi8KLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXZvaWQgKnJlZ3M7CQkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBhZGRyZXNzICovCiAJYmNtc2RoX2luZm9fdCAqc2RoOwkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBoYW5kbGUgKi8KIAl2b2lkICpjaDsKQEAgLTEzOSwyMiArMTM4LDExIEBACiAjZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwogCiAjaWZuZGVmIEJDTUxYU0RNTUMKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBiY21zZGhfZHJpdmVyID0gewotCS5uYW1lID0gInB4YTJ4eC1tY2kiLAotCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLnByb2JlID0gYmNtc2RoX3Byb2JlLAotCS5yZW1vdmUgPSBiY21zZGhfcmVtb3ZlLAotCS5zdXNwZW5kID0gTlVMTCwKLQkucmVzdW1lID0gTlVMTCwKLX07Ci0jZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwotCi0jaWZuZGVmIEJDTUxYU0RNTUMKIHN0YXRpYwogI2VuZGlmCQkJCS8qIEJDTUxYU0RNTUMgKi8KIGludCBiY21zZGhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCW9zbF90ICpvc2ggPSBOVUxMOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gTlVMTDsKIAliY21zZGhfaGNfdCAqc2RoYyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyByZWdzID0gMDsKIAliY21zZGhfaW5mb190ICpzZGggPSBOVUxMOwpAQCAtMTg5LDcgKzE3Nyw3IEBACiAJfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoT09CX0lOVFJfT05MWSkgKi8KIAkvKiBhbGxvY2F0ZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBpbmZvICovCi0Jb3NoID0gb3NsX2F0dGFjaChkZXYsIFBDSV9CVVMsIGZhbHNlKTsKKwlvc2ggPSBvc2xfYXR0YWNoKGRldiwgUENJX0JVUyk7CiAJaWYgKCFvc2gpIHsKIAkJU0RMWF9NU0coKCIlczogb3NsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7CiAJCWdvdG8gZXJyOwpAQCAtMjU4LDcgKzI0Niw3IEBACiBpbnQgYmNtc2RoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJYmNtc2RoX2hjX3QgKnNkaGMsICpwcmV2OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlzZGhjID0gc2RoY2luZm87CiAJZHJ2aW5mby5kZXRhY2goc2RoYy0+Y2gpOwpAQCAtMjkxLDI2OSArMjc5LDIzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotI2Vsc2UJCQkJLyogQkNNUExBVEZPUk1fQlVTICovCi0KLSNpZiAhZGVmaW5lZChCQ01MWFNETU1DKQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIFBDSSBwcm9iZSBhbmQgcmVtb3ZlIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJjbXNkaF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYmNtc2RoX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCi0vKioKLSAqIHBjaSBpZCB0YWJsZQotICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYmNtc2RoX3BjaV9kZXZpZFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci17Ci0JLnZlbmRvciA9IFBDSV9BTllfSUQsCi0JLmRldmljZSA9IFBDSV9BTllfSUQsCi0JLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCi0JLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JLmNsYXNzID0gMCwKLQkuY2xhc3NfbWFzayA9IDAsCi0JLmRyaXZlcl9kYXRhID0gMCwKLX0sCi17MCx9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmNtc2RoX3BjaV9kZXZpZCk7Ci0KLS8qKgotICogU0RJTyBIb3N0IENvbnRyb2xsZXIgcGNpIGRyaXZlciBpbmZvCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiY21zZGhfcGNpX2RyaXZlciA9IHsKLQkubm9kZSA9IHt9LAotCS5uYW1lID0gImJjbXNkaCIsCi0JLmlkX3RhYmxlID0gYmNtc2RoX3BjaV9kZXZpZCwKLQkucHJvYmUgPSBiY21zZGhfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBiY21zZGhfcGNpX3JlbW92ZSwKLQkuc3VzcGVuZCA9IE5VTEwsCi0JLnJlc3VtZSA9IE5VTEwsCi19OwotCi1leHRlcm4gdWludCBzZF9wY2lfc2xvdDsJLyogRm9yY2UgZGV0ZWN0aW9uIHRvIGEgcGFydGljdWxhciBQQ0kgKi8KLQkJCQkvKiBzbG90IG9ubHkgLiBBbGxvd3MgZm9yIGhhdmluZyBtdWx0aXBsZSAqLwotCQkJCS8qIFdMIGRldmljZXMgYXQgb25jZSBpbiBhIFBDICovCi0JCQkJLyogT25seSBvbmUgaW5zdGFuY2Ugb2YgZGhkIHdpbGwgYmUgKi8KLQkJCQkvKiB1c2FibGUgYXQgYSB0aW1lICovCi0JCQkJLyogVXBwZXIgd29yZCBpcyBidXMgbnVtYmVyLCAqLwotCQkJCS8qIGxvd2VyIHdvcmQgaXMgc2xvdCBudW1iZXIgKi8KLQkJCQkvKiBEZWZhdWx0IHZhbHVlIG9mIDB4RkZGRmZmZmYgdHVybnMgdGhpcyAqLwotCQkJCS8qIG9mZiAqLwotbW9kdWxlX3BhcmFtKHNkX3BjaV9zbG90LCB1aW50LCAwKTsKLQotLyoqCi0gKiBEZXRlY3Qgc3VwcG9ydGVkIFNESU8gSG9zdCBDb250cm9sbGVyIGFuZCBhdHRhY2ggaWYgZm91bmQuCi0gKgotICogRGV0ZXJtaW5lIGlmIHRoZSBkZXZpY2UgZGVzY3JpYmVkIGJ5IHBkZXYgaXMgYSBzdXBwb3J0ZWQgU0RJTyBIb3N0Ci0gKiBDb250cm9sbGVyLiAgSWYgc28sIGF0dGFjaCB0byBpdCBhbmQgYXR0YWNoIHRvIHRoZSB0YXJnZXQgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotYmNtc2RoX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlvc2xfdCAqb3NoID0gTlVMTDsKLQliY21zZGhfaGNfdCAqc2RoYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZWdzOwotCWJjbXNkaF9pbmZvX3QgKnNkaCA9IE5VTEw7Ci0JaW50IHJjOwotCi0JaWYgKHNkX3BjaV9zbG90ICE9IDB4RkZGRmZmZmYpIHsKLQkJaWYgKHBkZXYtPmJ1cy0+bnVtYmVyICE9IChzZF9wY2lfc2xvdCA+PiAxNikgfHwKLQkJICAgIFBDSV9TTE9UKHBkZXYtPmRldmZuKSAhPSAoc2RfcGNpX3Nsb3QgJiAweGZmZmYpKSB7Ci0JCQlTRExYX01TRygoIiVzOiAlczogYnVzICVYLCBzbG90ICVYLCB2ZW5kICVYLCBkZXYgJVhcbiIsCi0JCQkJICBfX2Z1bmNfXywKLQkJCQkgIGJjbXNkaF9jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpID8KLQkJCQkgICJGb3VuZCBjb21wYXRpYmxlIFNESU9IQyIgOgotCQkJCSAgIlByb2JpbmcgdW5rbm93biBkZXZpY2UiLAotCQkJCSAgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKLQkJCQkgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlTRExYX01TRygoIiVzOiAlczogYnVzICVYLCBzbG90ICVYLCB2ZW5kb3IgJVgsIGRldmljZSAlWCAiCi0JCQkiKGdvb2QgUENJIGxvY2F0aW9uKVxuIiwgX19mdW5jX18sCi0JCQliY21zZGhfY2hpcG1hdGNoKHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSA/Ci0JCQkiVXNpbmcgY29tcGF0aWJsZSBTRElPSEMiIDogIldBUk5JTkcsIGZvcmNlZCB1c2UgIgotCQkJIm9mIHVua293biBkZXZpY2UiLAotCQlwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBwZGV2LT52ZW5kb3IsCi0JCXBkZXYtPmRldmljZSkpOwotCX0KLQotCWlmICgocGRldi0+dmVuZG9yID09IFZFTkRPUl9USSkKLQkgICAgJiYgKChwZGV2LT5kZXZpY2UgPT0gUENJWFgyMV9GTEFTSE1FRElBX0lEKQotCQl8fCAocGRldi0+ZGV2aWNlID09IFBDSVhYMjFfRkxBU0hNRURJQTBfSUQpKSkgewotCQl1MzIgY29uZmlnX3JlZzsKLQotCQlTRExYX01TRygoIiVzOiBEaXNhYmxpbmcgVEkgRmxhc2hNZWRpYSBDb250cm9sbGVyLlxuIiwKLQkJCSAgX19mdW5jX18pKTsKLQkJb3NoID0gb3NsX2F0dGFjaChwZGV2LCBQQ0lfQlVTLCBmYWxzZSk7Ci0JCWlmICghb3NoKSB7Ci0JCQlTRExYX01TRygoIiVzOiBvc2xfYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJY29uZmlnX3JlZyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCAweDRjLCA0KTsKLQotCQkvKgotCQkgKiBTZXQgTU1DX1NEX0RJUyBiaXQgaW4gRmxhc2hNZWRpYSBDb250cm9sbGVyLgotCQkgKiBEaXNibGluZyB0aGUgU0QvTU1DIENvbnRyb2xsZXIgaW4gdGhlIEZsYXNoTWVkaWEgQ29udHJvbGxlcgotCQkgKiBhbGxvd3MgdGhlIFN0YW5kYXJkIFNEIEhvc3QgQ29udHJvbGxlciB0byB0YWtlIG92ZXIgY29udHJvbAotCQkgKiBvZiB0aGUgU0QgU2xvdC4KLQkJICovCi0JCWNvbmZpZ19yZWcgfD0gMHgwMjsKLQkJT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCAweDRjLCA0LCBjb25maWdfcmVnKTsKLQkJb3NsX2RldGFjaChvc2gpOwotCX0KLQkvKiBtYXRjaCB0aGlzIHBjaSBkZXZpY2Ugd2l0aCB3aGF0IHdlIHN1cHBvcnQgKi8KLQkvKiB3ZSBjYW4ndCBzb2xlbHkgcmVseSBvbiB0aGlzIHRvIGJlbGlldmUgaXQgaXMKLQkJb3VyIFNESU8gSG9zdCBDb250cm9sbGVyISAqLwotCWlmICghYmNtc2RoX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogdGhpcyBpcyBhIHBjaSBkZXZpY2Ugd2UgbWlnaHQgc3VwcG9ydCAqLwotCVNETFhfTVNHKCgiJXM6IEZvdW5kIHBvc3NpYmxlIFNESU8gSG9zdCBDb250cm9sbGVyOiAiCi0JCSJidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwgX19mdW5jX18sCi0JCXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCVBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKSk7Ci0KLQkvKiB1c2UgYmNtc2RoX3F1ZXJ5X2RldmljZSgpIHRvIGdldCB0aGUgdmVuZG9yIElEIG9mIHRoZSB0YXJnZXQgZGV2aWNlCi0JICogc28gaXQgd2lsbCBldmVudHVhbGx5IGFwcGVhciBpbiB0aGUgQnJvYWRjb20gc3RyaW5nIG9uIHRoZSBjb25zb2xlCi0JICovCi0KLQkvKiBhbGxvY2F0ZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBpbmZvICovCi0Jb3NoID0gb3NsX2F0dGFjaChwZGV2LCBQQ0lfQlVTLCBmYWxzZSk7Ci0JaWYgKCFvc2gpIHsKLQkJU0RMWF9NU0coKCIlczogb3NsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlzZGhjID0ga3phbGxvYyhzaXplb2YoYmNtc2RoX2hjX3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNkaGMpIHsKLQkJU0RMWF9NU0coKCIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCXNkaGMtPm9zaCA9IG9zaDsKLQotCXNkaGMtPmRldiA9IHBkZXY7Ci0KLQkvKiBtYXAgdG8gYWRkcmVzcyB3aGVyZSBob3N0IGNhbiBhY2Nlc3MgKi8KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyYykgewotCQlTRExYX01TRygoIiVzOiBDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlzZGggPSBiY21zZGhfYXR0YWNoKG9zaCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkodm9pZCAqKikmcmVncywgcGRldi0+aXJxKTsKLQlpZiAoIXNkaCkgewotCQlTRExYX01TRygoIiVzOiBiY21zZGhfYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc2RoYy0+c2RoID0gc2RoOwotCi0JLyogdHJ5IHRvIGF0dGFjaCB0byB0aGUgdGFyZ2V0IGRldmljZSAqLwotCXNkaGMtPmNoID0gZHJ2aW5mby5hdHRhY2goVkVORE9SX0JST0FEQ09NLCAvKiBwZGV2LT52ZW5kb3IsICovCi0JCQkJYmNtc2RoX3F1ZXJ5X2RldmljZShzZGgpICYgMHhGRkZGLCAwLCAwLCAwLCAwLAotCQkJCSh2b2lkICopcmVncywgTlVMTCwgc2RoKTsKLQlpZiAoIXNkaGMtPmNoKSB7Ci0JCVNETFhfTVNHKCgiJXM6IGRldmljZSBhdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBjaGFpbiBTRElPIEhvc3QgQ29udHJvbGxlciBpbmZvIHRvZ2V0aGVyICovCi0Jc2RoYy0+bmV4dCA9IHNkaGNpbmZvOwotCXNkaGNpbmZvID0gc2RoYzsKLQotCXJldHVybiAwOwotCi0JLyogZXJyb3IgaGFuZGxpbmcgKi8KLWVycjoKLQlpZiAoc2RoYy0+c2RoKQotCQliY21zZGhfZGV0YWNoKHNkaGMtPm9zaCwgc2RoYy0+c2RoKTsKLQlpZiAoc2RoYykKLQkJa2ZyZWUoc2RoYyk7Ci0JaWYgKG9zaCkKLQkJb3NsX2RldGFjaChvc2gpOwotCXJldHVybiAtRU5PREVWOwotfQotCi0vKioKLSAqIERldGFjaCBmcm9tIHRhcmdldCBkZXZpY2VzIGFuZCBTRElPIEhvc3QgQ29udHJvbGxlcgotICovCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYmNtc2RoX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JYmNtc2RoX2hjX3QgKnNkaGMsICpwcmV2OwotCW9zbF90ICpvc2g7Ci0KLQkvKiBmaW5kIHRoZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBmb3IgdGhpcwotCQkgcGRldiBhbmQgdGFrZSBpdCBvdXQgZnJvbSB0aGUgbGlzdCAqLwotCWZvciAoc2RoYyA9IHNkaGNpbmZvLCBwcmV2ID0gTlVMTDsgc2RoYzsgc2RoYyA9IHNkaGMtPm5leHQpIHsKLQkJaWYgKHNkaGMtPmRldiA9PSBwZGV2KSB7Ci0JCQlpZiAocHJldikKLQkJCQlwcmV2LT5uZXh0ID0gc2RoYy0+bmV4dDsKLQkJCWVsc2UKLQkJCQlzZGhjaW5mbyA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlwcmV2ID0gc2RoYzsKLQl9Ci0JaWYgKCFzZGhjKQotCQlyZXR1cm47Ci0KLQlkcnZpbmZvLmRldGFjaChzZGhjLT5jaCk7Ci0KLQliY21zZGhfZGV0YWNoKHNkaGMtPm9zaCwgc2RoYy0+c2RoKTsKLQotCS8qIHJlbGVhc2UgU0RJTyBIb3N0IENvbnRyb2xsZXIgaW5mbyAqLwotCW9zaCA9IHNkaGMtPm9zaDsKLQlrZnJlZShzZGhjKTsKLQlvc2xfZGV0YWNoKG9zaCk7Ci19Ci0jZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwogI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwogCiBleHRlcm4gaW50IHNkaW9fZnVuY3Rpb25faW5pdCh2b2lkKTsKIAogaW50IGJjbXNkaF9yZWdpc3RlcihiY21zZGhfZHJpdmVyX3QgKmRyaXZlcikKIHsKLQlpbnQgZXJyb3IgPSAwOwotCiAJZHJ2aW5mbyA9ICpkcml2ZXI7CiAKLSNpZiBkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykKLSNpZiBkZWZpbmVkKEJDTUxYU0RNTUMpCiAJU0RMWF9NU0coKCJMaW51eCBLZXJuZWwgU0RJTy9NTUMgRHJpdmVyXG4iKSk7Ci0JZXJyb3IgPSBzZGlvX2Z1bmN0aW9uX2luaXQoKTsKLSNlbHNlCi0JU0RMWF9NU0coKCJJbnRlbCBQWEEyNzAgU0RJTyBEcml2ZXJcbiIpKTsKLQllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmYmNtc2RoX2RyaXZlcik7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01MWFNETU1DKSAqLwotCXJldHVybiBlcnJvcjsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykgKi8KLQotI2lmICFkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykgJiYgIWRlZmluZWQoQkNNTFhTRE1NQykKLQllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJjbXNkaF9wY2lfZHJpdmVyKTsKLQlpZiAoIWVycm9yKQotCQlyZXR1cm4gMDsKLQotCVNETFhfTVNHKCgiJXM6IHBjaV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkIDB4JXhcbiIsIF9fZnVuY19fLCBlcnJvcikpOwotI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwotCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBzZGlvX2Z1bmN0aW9uX2luaXQoKTsKIH0KIAogZXh0ZXJuIHZvaWQgc2Rpb19mdW5jdGlvbl9jbGVhbnVwKHZvaWQpOwogCiB2b2lkIGJjbXNkaF91bnJlZ2lzdGVyKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChCQ01QTEFURk9STV9CVVMpICYmICFkZWZpbmVkKEJDTUxYU0RNTUMpCi0JCWRyaXZlcl91bnJlZ2lzdGVyKCZiY21zZGhfZHJpdmVyKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQkNNTFhTRE1NQykKIAlzZGlvX2Z1bmN0aW9uX2NsZWFudXAoKTsKLSNlbmRpZgkJCQkvKiBCQ01MWFNETU1DICovCi0jaWYgIWRlZmluZWQoQkNNUExBVEZPUk1fQlVTKSAmJiAhZGVmaW5lZChCQ01MWFNETU1DKQotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmNtc2RoX3BjaV9kcml2ZXIpOwotI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwogfQogCiAjaWYgZGVmaW5lZChPT0JfSU5UUl9PTkxZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKaW5kZXggZjZjOWM0NS4uZDM5OWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCkBAIC0xNCwxMSArMTQsMTIgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+Ci0jaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxvc2wuaD4KKyNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHNkaW8uaD4JCS8qIFNESU8gRGV2aWNlIGFuZCBQcm90b2NvbCBTcGVjcyAqLwogI2luY2x1ZGUgPHNkaW9oLmg+CQkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBTcGVjaWZpY2F0aW9uICovCiAjaW5jbHVkZSA8YmNtc2RidXMuaD4JCS8qIGJjbXNkaCB0by9mcm9tIHNwZWNpZmljIGNvbnRyb2xsZXIgQVBJcyAqLwpAQCAtMTExLDcgKzExMiw3IEBACiAvKgogICoJUHVibGljIGVudHJ5IHBvaW50cyAmIGV4dGVybidzCiAgKi8KLWV4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpiYXIwLCB1aW50IGlycSkKK2V4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqYmFyMCwgdWludCBpcnEpCiB7CiAJc2Rpb2hfaW5mb190ICpzZDsKIAlpbnQgZXJyX3JldDsKQEAgLTE3NCw3ICsxNzUsNyBAQAogCXJldHVybiBzZDsKIH0KIAotZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9kZXRhY2gob3NsX3QgKm9zaCwgc2Rpb2hfaW5mb190ICpzZCkKK2V4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzZGlvaF9pbmZvX3QgKnNkKQogewogCXNkX3RyYWNlKCgiJXNcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTc1MCw3ICs3NTEsNyBAQAogCXNkX3RyYWNlKCgiJXM6IEZ1bmMgPSAlZFxuIiwgX19mdW5jX18sIGZ1bmMpKTsKIAogCWlmICghc2QtPmZ1bmNfY2lzX3B0cltmdW5jXSkgewotCQliemVybyhjaXMsIGxlbmd0aCk7CisJCW1lbXNldChjaXMsIDAsIGxlbmd0aCk7CiAJCXNkX2VycigoIiVzOiBubyBmdW5jX2Npc19wdHJbJWRdXG4iLCBfX2Z1bmNfXywgZnVuYykpOwogCQlyZXR1cm4gU0RJT0hfQVBJX1JDX0ZBSUw7CiAJfQpAQCAtOTI3LDEzICs5MjgsMTMgQEAKIAogc3RhdGljIFNESU9IX0FQSV9SQwogc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2Rpb2hfaW5mb190ICpzZCwgdWludCBmaXhfaW5jLCB1aW50IHdyaXRlLCB1aW50IGZ1bmMsCi0JCSAgICAgdWludCBhZGRyLCB2b2lkICpwa3QpCisJCSAgICAgdWludCBhZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWJvb2wgZmlmbyA9IChmaXhfaW5jID09IFNESU9IX0RBVEFfRklYKTsKIAl1MzIgU0dDb3VudCA9IDA7CiAJaW50IGVycl9yZXQgPSAwOwogCi0Jdm9pZCAqcG5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnBuZXh0OwogCiAJc2RfdHJhY2UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTk0Myw4ICs5NDQsOCBAQAogCiAJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyICovCiAJc2Rpb19jbGFpbV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSk7Ci0JZm9yIChwbmV4dCA9IHBrdDsgcG5leHQ7IHBuZXh0ID0gUEtUTkVYVChwbmV4dCkpIHsKLQkJdWludCBwa3RfbGVuID0gUEtUTEVOKHBuZXh0KTsKKwlmb3IgKHBuZXh0ID0gcGt0OyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgeworCQl1aW50IHBrdF9sZW4gPSBwbmV4dC0+bGVuOwogCQlwa3RfbGVuICs9IDM7CiAJCXBrdF9sZW4gJj0gMHhGRkZGRkZGQzsKIApAQCAtOTYxLDIzICs5NjIsMjMgQEAKIAkJICogaXMgc3VwcG9zZWQgdG8gZ2l2ZQogCQkgKiB1cyBzb21ldGhpbmcgd2UgY2FuIHdvcmsgd2l0aC4KIAkJICovCi0JCUFTU0VSVCgoKHUzMikgKFBLVERBVEEocGt0KSkgJiBETUFfQUxJR05fTUFTSykgPT0gMCk7CisJCUFTU0VSVCgoKHUzMikgKHBrdC0+ZGF0YSkgJiBETUFfQUxJR05fTUFTSykgPT0gMCk7CiAKIAkJaWYgKCh3cml0ZSkgJiYgKCFmaWZvKSkgewogCQkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSBQS1REQVRBKHBuZXh0KSksCisJCQkJCQkgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAogCQkJCQkJICAgcGt0X2xlbik7CiAJCX0gZWxzZSBpZiAod3JpdGUpIHsKIAkJCWVycl9yZXQgPSBzZGlvX21lbWNweV90b2lvKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgUEtUREFUQShwbmV4dCkpLAorCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJCSAgIHBrdF9sZW4pOwogCQl9IGVsc2UgaWYgKGZpZm8pIHsKIAkJCWVycl9yZXQgPSBzZGlvX3JlYWRzYihnSW5zdGFuY2UtPmZ1bmNbZnVuY10sCi0JCQkJCSAgICAgICgodTggKikgUEtUREFUQShwbmV4dCkpLAorCQkJCQkgICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAogCQkJCQkgICAgICBhZGRyLCBwa3RfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLAotCQkJCQkJICAgICAoKHU4ICopIFBLVERBVEEocG5leHQpKSwKKwkJCQkJCSAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJCSAgICAgYWRkciwgcGt0X2xlbik7CiAJCX0KIApAQCAtMTAyNSwxMCArMTAyNiwxMCBAQAogZXh0ZXJuIFNESU9IX0FQSV9SQwogc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2hfaW5mb190ICpzZCwgdWludCBwaW9fZG1hLCB1aW50IGZpeF9pbmMsIHVpbnQgd3JpdGUsCiAJCSAgICAgdWludCBmdW5jLCB1aW50IGFkZHIsIHVpbnQgcmVnX3dpZHRoLCB1aW50IGJ1Zmxlbl91LAotCQkgICAgIHU4ICpidWZmZXIsIHZvaWQgKnBrdCkKKwkJICAgICB1OCAqYnVmZmVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCVNESU9IX0FQSV9SQyBTdGF0dXM7Ci0Jdm9pZCAqbXlwa3QgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpteXBrdCA9IE5VTEw7CiAKIAlzZF90cmFjZSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKIApAQCAtMTAzOCw1MiArMTAzOSw1MiBAQAogCWlmIChwa3QgPT0gTlVMTCkgewogCQlzZF9kYXRhKCgiJXM6IENyZWF0aW5nIG5ldyAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKIAkJCSBfX2Z1bmNfXywgd3JpdGUgPyAiVFgiIDogIlJYIiwgYnVmbGVuX3UpKTsKLQkJbXlwa3QgPSBQS1RHRVQoc2QtPm9zaCwgYnVmbGVuX3UsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwkJbXlwa3QgPSBwa3RfYnVmX2dldF9za2Ioc2QtPm9zaCwgYnVmbGVuX3UpOwogCQlpZiAoIW15cGt0KSB7Ci0JCQlzZF9lcnIoKCIlczogUEtUR0VUIGZhaWxlZDogbGVuICVkXG4iLAorCQkJc2RfZXJyKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgYnVmbGVuX3UpKTsKIAkJCXJldHVybiBTRElPSF9BUElfUkNfRkFJTDsKIAkJfQogCiAJCS8qIEZvciBhIHdyaXRlLCBjb3B5IHRoZSBidWZmZXIgZGF0YSBpbnRvIHRoZSBwYWNrZXQuICovCiAJCWlmICh3cml0ZSkKLQkJCWJjb3B5KGJ1ZmZlciwgUEtUREFUQShteXBrdCksIGJ1Zmxlbl91KTsKKwkJCWJjb3B5KGJ1ZmZlciwgbXlwa3QtPmRhdGEsIGJ1Zmxlbl91KTsKIAogCQlTdGF0dXMgPQogCQkgICAgc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2QsIGZpeF9pbmMsIHdyaXRlLCBmdW5jLCBhZGRyLCBteXBrdCk7CiAKIAkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwogCQlpZiAoIXdyaXRlKQotCQkJYmNvcHkoUEtUREFUQShteXBrdCksIGJ1ZmZlciwgYnVmbGVuX3UpOworCQkJYmNvcHkobXlwa3QtPmRhdGEsIGJ1ZmZlciwgYnVmbGVuX3UpOwogCi0JCVBLVEZSRUUoc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKLQl9IGVsc2UgaWYgKCgodTMyKSAoUEtUREFUQShwa3QpKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7CisJCXBrdF9idWZfZnJlZV9za2Ioc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwl9IGVsc2UgaWYgKCgodTMyKSAocGt0LT5kYXRhKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7CiAJCS8qIENhc2UgMjogV2UgaGF2ZSBhIHBhY2tldCwgYnV0IGl0IGlzIHVuYWxpZ25lZC4gKi8KIAogCQkvKiBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdCBoYXZlIGEgY2hhaW4uICovCi0JCUFTU0VSVChQS1RORVhUKHBrdCkgPT0gTlVMTCk7CisJCUFTU0VSVChwa3QtPm5leHQgPT0gTlVMTCk7CiAKIAkJc2RfZGF0YSgoIiVzOiBDcmVhdGluZyBhbGlnbmVkICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJIF9fZnVuY19fLCB3cml0ZSA/ICJUWCIgOiAiUlgiLCBQS1RMRU4ocGt0KSkpOwotCQlteXBrdCA9IFBLVEdFVChzZC0+b3NoLCBQS1RMRU4ocGt0KSwgd3JpdGUgPyB0cnVlIDogZmFsc2UpOworCQkJIF9fZnVuY19fLCB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QtPmxlbikpOworCQlteXBrdCA9IHBrdF9idWZfZ2V0X3NrYihzZC0+b3NoLCBwa3QtPmxlbik7CiAJCWlmICghbXlwa3QpIHsKLQkJCXNkX2VycigoIiVzOiBQS1RHRVQgZmFpbGVkOiBsZW4gJWRcbiIsCi0JCQkJX19mdW5jX18sIFBLVExFTihwa3QpKSk7CisJCQlzZF9lcnIoKCIlczogcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAorCQkJCV9fZnVuY19fLCBwa3QtPmxlbikpOwogCQkJcmV0dXJuIFNESU9IX0FQSV9SQ19GQUlMOwogCQl9CiAKIAkJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KIAkJaWYgKHdyaXRlKQotCQkJYmNvcHkoUEtUREFUQShwa3QpLCBQS1REQVRBKG15cGt0KSwgUEtUTEVOKHBrdCkpOworCQkJYmNvcHkocGt0LT5kYXRhLCBteXBrdC0+ZGF0YSwgcGt0LT5sZW4pOwogCiAJCVN0YXR1cyA9CiAJCSAgICBzZGlvaF9yZXF1ZXN0X3BhY2tldChzZCwgZml4X2luYywgd3JpdGUsIGZ1bmMsIGFkZHIsIG15cGt0KTsKIAogCQkvKiBGb3IgYSByZWFkLCBjb3B5IHRoZSBwYWNrZXQgZGF0YSBiYWNrIHRvIHRoZSBidWZmZXIuICovCiAJCWlmICghd3JpdGUpCi0JCQliY29weShQS1REQVRBKG15cGt0KSwgUEtUREFUQShwa3QpLCBQS1RMRU4obXlwa3QpKTsKKwkJCWJjb3B5KG15cGt0LT5kYXRhLCBwa3QtPmRhdGEsIG15cGt0LT5sZW4pOwogCi0JCVBLVEZSRUUoc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihzZC0+b3NoLCBteXBrdCwgd3JpdGUgPyB0cnVlIDogZmFsc2UpOwogCX0gZWxzZSB7CQkvKiBjYXNlIDM6IFdlIGhhdmUgYSBwYWNrZXQgYW5kCiAJCQkJIGl0IGlzIGFsaWduZWQuICovCiAJCXNkX2RhdGEoKCIlczogQWxpZ25lZCAlcyBQYWNrZXQsIGRpcmVjdCBETUFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tY19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWNfbGludXguYwppbmRleCBhZTdiNTY2Li5jZWFhNDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tY19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jX2xpbnV4LmMKQEAgLTE1LDcgKzE1LDkgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogcmVxdWVzdF9pcnEoKSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHNkaW8uaD4JCS8qIFNESU8gU3BlY3MgKi8KICNpbmNsdWRlIDxiY21zZGJ1cy5oPgkJLyogYmNtc2RoIHRvL2Zyb20gc3BlY2lmaWMgY29udHJvbGxlciBBUElzICovCkBAIC0yMTEsNyArMjEzLDcgQEAKIAlpZiAoIWdJbnN0YW5jZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQliemVybygmc2RtbWNfZGV2LCBzaXplb2Yoc2RtbWNfZGV2KSk7CisJbWVtc2V0KCZzZG1tY19kZXYsIDAsIHNpemVvZihzZG1tY19kZXYpKTsKIAllcnJvciA9IHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZiY21zZGhfc2RtbWNfZHJpdmVyKTsKIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCmluZGV4IDU3ZDA2YjIuLjY5YzZhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaApAQCAtNzcsNyArNzcsNyBAQAogLyogQ29tbW9uIHN0cnVjdHVyZSBmb3IgbW9kdWxlIGFuZCBpbnN0YW5jZSBsaW5rYWdlICovCiB0eXBlZGVmIHN0cnVjdCBkaGRfcHViIHsKIAkvKiBMaW5rYWdlIHBvbnRlcnMgKi8KLQlvc2xfdCAqb3NoOwkJLyogT1NMIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogT1NMIGhhbmRsZSAqLwogCXN0cnVjdCBkaGRfYnVzICpidXM7CS8qIEJ1cyBtb2R1bGUgaGFuZGxlICovCiAJc3RydWN0IGRoZF9wcm90ICpwcm90OwkvKiBQcm90b2NvbCBtb2R1bGUgaGFuZGxlICovCiAJc3RydWN0IGRoZF9pbmZvICppbmZvOwkvKiBJbmZvIG1vZHVsZSBoYW5kbGUgKi8KQEAgLTI3NywxNSArMjc3LDE2IEBACiAgKi8KIAogLyogVG8gYWxsb3cgb3NsX2F0dGFjaC9kZXRhY2ggY2FsbHMgZnJvbSBvcy1pbmRlcGVuZGVudCBtb2R1bGVzICovCi1vc2xfdCAqZGhkX29zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlKTsKLXZvaWQgZGhkX29zbF9kZXRhY2gob3NsX3QgKm9zaCk7CitzdHJ1Y3Qgb3NsX2luZm8gKmRoZF9vc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSk7Cit2b2lkIGRoZF9vc2xfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAogLyogSW5kaWNhdGlvbiBmcm9tIGJ1cyBtb2R1bGUgcmVnYXJkaW5nIHByZXNlbmNlL2luc2VydGlvbiBvZiBkb25nbGUuCiAgKiBSZXR1cm4gZGhkX3B1Yl90IHBvaW50ZXIsIHVzZWQgYXMgaGFuZGxlIHRvIE9TIG1vZHVsZSBpbiBsYXRlciBjYWxscy4KICAqIFJldHVybmVkIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBidXMgYW5kIHByb3QgcG9pbnRlcnMgZmlsbGVkIGluLgogICogYnVzX2hkcmxlbiBzcGVjaWZpZXMgcmVxdWlyZWQgaGVhZHJvb20gZm9yIGJ1cyBtb2R1bGUgaGVhZGVyLgogICovCi1leHRlcm4gZGhkX3B1Yl90ICpkaGRfYXR0YWNoKG9zbF90ICpvc2gsIHN0cnVjdCBkaGRfYnVzICpidXMsIHVpbnQgYnVzX2hkcmxlbik7CitleHRlcm4gZGhkX3B1Yl90ICpkaGRfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgZGhkX2J1cyAqYnVzLAorCQkJCXVpbnQgYnVzX2hkcmxlbik7CiBleHRlcm4gaW50IGRoZF9uZXRfYXR0YWNoKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlkeCk7CiAKIC8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyByZW1vdmFsL2Fic2VuY2Ugb2YgZG9uZ2xlICovCkBAIC0yOTQsMTAgKzI5NSwxMiBAQAogLyogSW5kaWNhdGlvbiBmcm9tIGJ1cyBtb2R1bGUgdG8gY2hhbmdlIGZsb3ctY29udHJvbCBzdGF0ZSAqLwogZXh0ZXJuIHZvaWQgZGhkX3R4Zmxvd2NvbnRyb2woZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIGJvb2wgb24pOwogCi1leHRlcm4gYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwgdm9pZCAqcGt0LCBpbnQgcHJlYyk7CitleHRlcm4gYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYyk7CiAKIC8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KLWV4dGVybiB2b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcnhwLCBpbnQgbnVtcGt0KTsKK2V4dGVybiB2b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKIAogLyogUmV0dXJuIHBvaW50ZXIgdG8gaW50ZXJmYWNlIG5hbWUgKi8KIGV4dGVybiBjaGFyICpkaGRfaWZuYW1lKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlkeCk7CkBAIC0zMDYsNyArMzA5LDcgQEAKIGV4dGVybiB2b2lkIGRoZF9zY2hlZF9kcGMoZGhkX3B1Yl90ICpkaGRwKTsKIAogLyogTm90aWZ5IHR4IGNvbXBsZXRpb24gKi8KLWV4dGVybiB2b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgdm9pZCAqdHhwLCBib29sIHN1Y2Nlc3MpOworZXh0ZXJuIHZvaWQgZGhkX3R4Y29tcGxldGUoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwLCBib29sIHN1Y2Nlc3MpOwogCiAvKiBRdWVyeSBpb2N0bCAqLwogZXh0ZXJuIGludCBkaGRjZGNfcXVlcnlfaW9jdGwoZGhkX3B1Yl90ICpkaGQsIGludCBpZmlkeCwgdWludCBjbWQsIHZvaWQgKmJ1ZiwKQEAgLTM3Nyw3ICszODAsNyBAQAogCQkJICAgaW50IGxlbik7CiAKIC8qIFNlbmQgcGFja2V0IHRvIGRvbmdsZSB2aWEgZGF0YSBjaGFubmVsICovCi1leHRlcm4gaW50IGRoZF9zZW5kcGt0KGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCB2b2lkICpwa3QpOworZXh0ZXJuIGludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CiAKIC8qIFNlbmQgZXZlbnQgdG8gaG9zdCAqLwogZXh0ZXJuIHZvaWQgZGhkX3NlbmR1cF9ldmVudChkaGRfcHViX3QgKmRoZHAsIHdsX2V2ZW50X21zZ190ICpldmVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKaW5kZXggM2IzOWM5OS4uY2QwZDU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKQEAgLTI2LDggKzI2LDggQEAKIGV4dGVybiB2b2lkIGRoZF9idXNfdW5yZWdpc3Rlcih2b2lkKTsKIAogLyogRG93bmxvYWQgZmlybXdhcmUgaW1hZ2UgYW5kIG52cmFtIGltYWdlICovCi1leHRlcm4gYm9vbCBkaGRfYnVzX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICogb3NoLAotCQkJCSAgICAgIGNoYXIgKmZ3X3BhdGgsIGNoYXIgKm52X3BhdGgpOworZXh0ZXJuIGJvb2wgZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLAorCSAgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGFyICpmd19wYXRoLCBjaGFyICpudl9wYXRoKTsKIAogLyogU3RvcCBidXMgbW9kdWxlOiBjbGVhciBwZW5kaW5nIGZyYW1lcywgZGlzYWJsZSBkYXRhIGZsb3cgKi8KIGV4dGVybiB2b2lkIGRoZF9idXNfc3RvcChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBib29sIGVuZm9yY2VfbXV0ZXgpOwpAQCAtMzYsNyArMzYsNyBAQAogZXh0ZXJuIGludCBkaGRfYnVzX2luaXQoZGhkX3B1Yl90ICpkaGRwLCBib29sIGVuZm9yY2VfbXV0ZXgpOwogCiAvKiBTZW5kIGEgZGF0YSBmcmFtZSB0byB0aGUgZG9uZ2xlLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHR4cC4gKi8KLWV4dGVybiBpbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgdm9pZCAqdHhwKTsKK2V4dGVybiBpbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnR4cCk7CiAKIC8qIFNlbmQvcmVjZWl2ZSBhIGNvbnRyb2wgbWVzc2FnZSB0by9mcm9tIHRoZSBkb25nbGUuCiAgKiBFeHBlY3RzIGNhbGxlciB0byBlbmZvcmNlIGEgc2luZ2xlIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwppbmRleCBiY2JhYWM5Li5iN2I1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KIApAQCAtMjk3LDYgKzI5OCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgUEtUU1VNTkVFREVEKHNrYikgXAorCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisjZGVmaW5lIFBLVFNFVFNVTUdPT0Qoc2tiLCB4KSBcCisJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5pcF9zdW1tZWQgPSBcCisJCSgoeCkgPyBDSEVDS1NVTV9VTk5FQ0VTU0FSWSA6IENIRUNLU1VNX05PTkUpKQorCisvKiBQS1RTRVRTVU1ORUVERUQgYW5kIFBLVFNVTUdPT0QgYXJlIG5vdCBwb3NzaWJsZSBiZWNhdXNlCisJc2tiLT5pcF9zdW1tZWQgaXMgb3ZlcmxvYWRlZCAqLworCiBpbnQKIGRoZF9wcm90X2lvdmFyX29wKGRoZF9wdWJfdCAqZGhkcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICB2b2lkICpwYXJhbXMsIGludCBwbGVuLCB2b2lkICphcmcsIGludCBsZW4sIGJvb2wgc2V0KQpAQCAtMzA5LDcgKzMxOSw3IEBACiAJYmNtX2JwcmludGYoc3RyYnVmLCAiUHJvdG9jb2wgQ0RDOiByZXFpZCAlZFxuIiwgZGhkcC0+cHJvdC0+cmVxaWQpOwogfQogCi12b2lkIGRoZF9wcm90X2hkcnB1c2goZGhkX3B1Yl90ICpkaGQsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmKQordm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3RidWYpCiB7CiAjaWZkZWYgQkRDCiAJc3RydWN0IGJkY19oZWFkZXIgKmg7CkBAIC0zMjAsMzMgKzMzMCwzMyBAQAogI2lmZGVmIEJEQwogCS8qIFB1c2ggQkRDIGhlYWRlciB1c2VkIHRvIGNvbnZleSBwcmlvcml0eSBmb3IgYnVzZXMgdGhhdCBkb24ndCAqLwogCi0JUEtUUFVTSChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKKwlza2JfcHVzaChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKIAotCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKilQS1REQVRBKHBrdGJ1Zik7CisJaCA9IChzdHJ1Y3QgYmRjX2hlYWRlciAqKShwa3RidWYtPmRhdGEpOwogCiAJaC0+ZmxhZ3MgPSAoQkRDX1BST1RPX1ZFUiA8PCBCRENfRkxBR19WRVJfU0hJRlQpOwogCWlmIChQS1RTVU1ORUVERUQocGt0YnVmKSkKIAkJaC0+ZmxhZ3MgfD0gQkRDX0ZMQUdfU1VNX05FRURFRDsKIAotCWgtPnByaW9yaXR5ID0gKFBLVFBSSU8ocGt0YnVmKSAmIEJEQ19QUklPUklUWV9NQVNLKTsKKwloLT5wcmlvcml0eSA9IChwa3RidWYtPnByaW9yaXR5ICYgQkRDX1BSSU9SSVRZX01BU0spOwogCWgtPmZsYWdzMiA9IDA7CiAJaC0+cnNzaSA9IDA7CiAjZW5kaWYJCQkJLyogQkRDICovCiAJQkRDX1NFVF9JRl9JRFgoaCwgaWZpZHgpOwogfQogCi1ib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHZvaWQgKnBrdGJ1ZiwgdTggKiBmY2JpdHMpCitib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHN0cnVjdCBza19idWZmICpwa3RidWYsIHU4ICogZmNiaXRzKQogewogI2lmZGVmIEJEQwogCXN0cnVjdCBiZGNfaGVhZGVyICpoOwogCi0JaWYgKFBLVExFTihwa3RidWYpIDwgQkRDX0hFQURFUl9MRU4pIHsKKwlpZiAocGt0YnVmLT5sZW4gPCBCRENfSEVBREVSX0xFTikgewogCQlESERfRVJST1IoKCIlczogcnggZGF0YSB0b28gc2hvcnQgKCVkIDwgJWQpXG4iLAotCQkJICAgX19mdW5jX18sIFBLVExFTihwa3RidWYpLCBCRENfSEVBREVSX0xFTikpOworCQkJICAgX19mdW5jX18sIHBrdGJ1Zi0+bGVuLCBCRENfSEVBREVSX0xFTikpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CiAKLQloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopUEtUREFUQShwa3RidWYpOworCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKikocGt0YnVmLT5kYXRhKTsKIAogCSpmY2JpdHMgPSBoLT5wcmlvcml0eSA+PiBCRENfUFJJT1JJVFlfRkNfU0hJRlQ7CiAJaWYgKChoLT5mbGFnczIgJiBCRENfRkxBRzJfRkNfRkxBRykgPT0gQkRDX0ZMQUcyX0ZDX0ZMQUcpCkBAIC0zNTUsNyArMzY1LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqZGhkLCBpbnQgKmlmaWR4LCB2b2lkICpwa3RidWYpCitpbnQgZGhkX3Byb3RfaGRycHVsbChkaGRfcHViX3QgKmRoZCwgaW50ICppZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdGJ1ZikKIHsKICNpZmRlZiBCREMKIAlzdHJ1Y3QgYmRjX2hlYWRlciAqaDsKQEAgLTM2NiwxMyArMzc2LDEzIEBACiAjaWZkZWYgQkRDCiAJLyogUG9wIEJEQyBoZWFkZXIgdXNlZCB0byBjb252ZXkgcHJpb3JpdHkgZm9yIGJ1c2VzIHRoYXQgZG9uJ3QgKi8KIAotCWlmIChQS1RMRU4ocGt0YnVmKSA8IEJEQ19IRUFERVJfTEVOKSB7CisJaWYgKHBrdGJ1Zi0+bGVuIDwgQkRDX0hFQURFUl9MRU4pIHsKIAkJREhEX0VSUk9SKCgiJXM6IHJ4IGRhdGEgdG9vIHNob3J0ICglZCA8ICVkKVxuIiwgX19mdW5jX18sCi0JCQkgICBQS1RMRU4ocGt0YnVmKSwgQkRDX0hFQURFUl9MRU4pKTsKKwkJCSAgIHBrdGJ1Zi0+bGVuLCBCRENfSEVBREVSX0xFTikpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CiAKLQloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopUEtUREFUQShwa3RidWYpOworCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKikocGt0YnVmLT5kYXRhKTsKIAogCSppZmlkeCA9IEJEQ19HRVRfSUZfSURYKGgpOwogCWlmICgqaWZpZHggPj0gREhEX01BWF9JRlMpIHsKQEAgLTM5NSw5ICs0MDUsOSBAQAogCQlQS1RTRVRTVU1HT09EKHBrdGJ1ZiwgdHJ1ZSk7CiAJfQogCi0JUEtUU0VUUFJJTyhwa3RidWYsIChoLT5wcmlvcml0eSAmIEJEQ19QUklPUklUWV9NQVNLKSk7CisJcGt0YnVmLT5wcmlvcml0eSA9IGgtPnByaW9yaXR5ICYgQkRDX1BSSU9SSVRZX01BU0s7CiAKLQlQS1RQVUxMKHBrdGJ1ZiwgQkRDX0hFQURFUl9MRU4pOworCXNrYl9wdWxsKHBrdGJ1ZiwgQkRDX0hFQURFUl9MRU4pOwogI2VuZGlmCQkJCS8qIEJEQyAqLwogCiAJcmV0dXJuIDA7CkBAIC00NjcsNyArNDc3LDcgQEAKIAkJZGhkX29zX3Byb3RvX3VuYmxvY2soZGhkKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JbWVtY3B5KGRoZC0+bWFjLm9jdGV0LCBidWYsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoZGhkLT5tYWMub2N0ZXQsIGJ1ZiwgRVRIX0FMRU4pOwogCiAJZGhkX29zX3Byb3RvX3VuYmxvY2soZGhkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwppbmRleCA3MDMxODhmLi4zZGJmNzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgpAQCAtMzI2LDkgKzMyNywxMCBAQAogCX0KIH0KIAotYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwgdm9pZCAqcGt0LCBpbnQgcHJlYykKK2Jvb2wgZGhkX3ByZWNfZW5xKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHBrdHEgKnEsIHN0cnVjdCBza19idWZmICpwa3QsCisJCSAgaW50IHByZWMpCiB7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAlpbnQgZXByZWMgPSAtMTsJCS8qIHByZWNlZGVuY2UgdG8gZXZpY3QgZnJvbSAqLwogCWJvb2wgZGlzY2FyZF9vbGRlc3Q7CiAKQEAgLTM2Niw3ICszNjgsNyBAQAogCQkJQVNTRVJUKHApOwogCQl9CiAKLQkJUEtURlJFRShkaGRwLT5vc2gsIHAsIHRydWUpOworCQlwa3RfYnVmX2ZyZWVfc2tiKGRoZHAtPm9zaCwgcCwgdHJ1ZSk7CiAJfQogCiAJLyogRW5xdWV1ZSAqLwpAQCAtODMyLDcgKzgzNCw3IEBACiAJdTE2IGZsYWdzOwogCWludCBldmxlbjsKIAotCWlmIChiY21wKEJSQ01fT1VJLCAmcHZ0X2RhdGEtPmJjbV9oZHIub3VpWzBdLCBET1QxMV9PVUlfTEVOKSkgeworCWlmIChtZW1jbXAoQlJDTV9PVUksICZwdnRfZGF0YS0+YmNtX2hkci5vdWlbMF0sIERPVDExX09VSV9MRU4pKSB7CiAJCURIRF9FUlJPUigoIiVzOiBtaXNtYXRjaGVkIE9VSSwgYmFpbGluZ1xuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIEJDTUVfRVJST1I7CiAJfQpAQCAtMTI1NCw3ICsxMjU2LDcgQEAKIAkgKi8KIAlyZXQgPSBkaGRfY3VzdG9tX2dldF9tYWNfYWRkcmVzcyhlYV9hZGRyLm9jdGV0KTsKIAlpZiAoIXJldCkgewotCQliY21fbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsICh2b2lkICopJmVhX2FkZHIsIEVUSEVSX0FERFJfTEVOLAorCQliY21fbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsICh2b2lkICopJmVhX2FkZHIsIEVUSF9BTEVOLAogCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlyZXQgPSBkaGRjZGNfc2V0X2lvY3RsKGRoZCwgMCwgV0xDX1NFVF9WQVIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMTI2Miw3ICsxMjY0LDcgQEAKIAkJCQkgICBfX2Z1bmNfXywgcmV0KSk7CiAJCX0gZWxzZQogCQkJbWVtY3B5KGRoZC0+bWFjLm9jdGV0LCAodm9pZCAqKSZlYV9hZGRyLAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJfQogI2VuZGlmCQkJCS8qIEdFVF9DVVNUT01fTUFDX0VOQUJMRSAqLwogCkBAIC0xNTMyLDcgKzE1MzQsNyBAQAogCQkJCQlicmVhazsKIAogCQkJCWlmICghbWVtY21wCi0JCQkJICAgIChiaS0+QlNTSUQub2N0ZXQsIGFkZHIsIEVUSEVSX0FERFJfTEVOKSkgeworCQkJCSAgICAoYmktPkJTU0lELm9jdGV0LCBhZGRyLCBFVEhfQUxFTikpIHsKIAkJCQkJREhEX0lTQ0FOKCgiJXM6IERlbCBCU1NbJTIuMmQ6JTIuMmRdICIKIAkJCQkJIiVYOiVYOiVYOiVYOiVYOiVYXG4iLAogCQkJCQlfX2Z1bmNfXywgbCwgaSwgYmktPkJTU0lELm9jdGV0WzBdLApAQCAtMTY3MCw3ICsxNjcyLDcgQEAKIAljaGFyIGJ1ZltXTENfSU9DVExfU01MRU5dOwogCiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZih3bF9pc2Nhbl9wYXJhbXNfdCkpOwotCW1lbWNweSgmcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZwYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAogCXBhcmFtcy5wYXJhbXMuYnNzX3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKIAlwYXJhbXMucGFyYW1zLnNjYW5fdHlwZSA9IERPVDExX1NDQU5UWVBFX0FDVElWRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2N1c3RvbV9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jdXN0b21fZ3Bpby5jCmluZGV4IGY2NDcwMzQuLmMzZjE4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2N1c3RvbV9ncGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY3VzdG9tX2dwaW8uYwpAQCAtMTQsNyArMTQsNyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPHdsX2l3Lmg+CiAKLSNkZWZpbmUgV0xfRVJST1IoeCkgcHJpbnRmIHgKLSNkZWZpbmUgV0xfVFJBQ0UoeCkKKyNkZWZpbmUgV0xfRVJST1IoZm10LCBhcmdzLi4uKSBwcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX1RSQUNFKGZtdCwgYXJncy4uLikgbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjaWZkZWYgQ1VTVE9NRVJfSFcKIGV4dGVybiB2b2lkIGJjbV93bGFuX3Bvd2VyX29mZihpbnQpOwpAQCAtNjcsMTMgKzY3LDEzIEBACiAjZW5kaWYKIAogCWlmIChkaGRfb29iX2dwaW9fbnVtIDwgMCkgewotCQlXTF9FUlJPUigoIiVzOiBFUlJPUiBjdXN0b21lciBzcGVjaWZpYyBIb3N0IEdQSU8gaXMgTk9UIGRlZmluZWRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IEVSUk9SIGN1c3RvbWVyIHNwZWNpZmljIEhvc3QgR1BJTyBpcyBOT1QgZGVmaW5lZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBkaGRfb29iX2dwaW9fbnVtOwogCX0KIAotCVdMX0VSUk9SKCgiJXM6IGN1c3RvbWVyIHNwZWNpZmljIEhvc3QgR1BJTyBudW1iZXIgaXMgKCVkKVxuIiwKLQkJICBfX2Z1bmNfXywgZGhkX29vYl9ncGlvX251bSkpOworCVdMX0VSUk9SKCIlczogY3VzdG9tZXIgc3BlY2lmaWMgSG9zdCBHUElPIG51bWJlciBpcyAoJWQpXG4iLAorCQkgX19mdW5jX18sIGRoZF9vb2JfZ3Bpb19udW0pOwogCiAjaWYgZGVmaW5lZCBDVVNUT01FUl9IVwogCWhvc3Rfb29iX2lycSA9IE1TTV9HUElPX1RPX0lOVChkaGRfb29iX2dwaW9fbnVtKTsKQEAgLTkzLDQwICs5Myw0MCBAQAogewogCXN3aXRjaCAob25vZmYpIHsKIAljYXNlIFdMQU5fUkVTRVRfT0ZGOgotCQlXTF9UUkFDRSgoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gaW5zZXJ0IFdMQU4gUkVTRVRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byBpbnNlcnQgV0xBTiBSRVNFVFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAjaWZkZWYgQ1VTVE9NRVJfSFcKIAkJYmNtX3dsYW5fcG93ZXJfb2ZmKDIpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCiAjaWZkZWYgQ1VTVE9NRVJfSFcyCiAJCXdpZmlfc2V0X3Bvd2VyKDAsIDApOwogI2VuZGlmCi0JCVdMX0VSUk9SKCgiPT09PT09PT09PT0gV0xBTiBwbGFjZWQgaW4gUkVTRVQgPT09PT09PT1cbiIpKTsKKwkJV0xfRVJST1IoIj09PT09PT09PT09IFdMQU4gcGxhY2VkIGluIFJFU0VUID09PT09PT09XG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fUkVTRVRfT046Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGxjIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gcmVtb3ZlIFdMQU4gUkVTRVRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGxjIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gcmVtb3ZlIFdMQU4gUkVTRVRcbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29uKDIpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCiAjaWZkZWYgQ1VTVE9NRVJfSFcyCiAJCXdpZmlfc2V0X3Bvd2VyKDEsIDApOwogI2VuZGlmCi0JCVdMX0VSUk9SKCgiPT09PT09PT09PT0gV0xBTiBnb2luZyBiYWNrIHRvIGxpdmUgID09PT09PT09XG4iKSk7CisJCVdMX0VSUk9SKCI9PT09PT09PT09PSBXTEFOIGdvaW5nIGJhY2sgdG8gbGl2ZSAgPT09PT09PT1cbiIpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9QT1dFUl9PRkY6Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byB0dXJuIG9mZiBXTF9SRUdfT05cbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byB0dXJuIG9mZiBXTF9SRUdfT05cbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29mZigxKTsKICNlbmRpZgkJCQkvKiBDVVNUT01FUl9IVyAqLwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9QT1dFUl9PTjoKLQkJV0xfVFJBQ0UoKCIlczogY2FsbCBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIHR1cm4gb24gV0xfUkVHX09OXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gdHVybiBvbiBXTF9SRUdfT05cbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29uKDEpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCkBAIC0xNDAsNyArMTQwLDcgQEAKIC8qIEZ1bmN0aW9uIHRvIGdldCBjdXN0b20gTUFDIGFkZHJlc3MgKi8KIGludCBkaGRfY3VzdG9tX2dldF9tYWNfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0JV0xfVFJBQ0UoKCIlcyBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgiJXMgRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCmluZGV4IDkzMzVmMDIuLmRiNDUwODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CkBAIC0yMTEsNyArMjEwLDcgQEAKIAlpbnQgaWR4OwkJLyogaWZhY2UgaWR4IGluIGRvbmdsZSAqLwogCWludCBzdGF0ZTsJCS8qIGludGVyZmFjZSBzdGF0ZSAqLwogCXVpbnQgc3VidW5pdDsJCS8qIHN1YnVuaXQgKi8KLQl1OCBtYWNfYWRkcltFVEhFUl9BRERSX0xFTl07CS8qIGFzc2lnbmVkIE1BQyBhZGRyZXNzICovCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwkvKiBhc3NpZ25lZCBNQUMgYWRkcmVzcyAqLwogCWJvb2wgYXR0YWNoZWQ7CQkvKiBEZWxheWVkIGF0dGFjaG1lbnQgd2hlbiB1bnNldCAqLwogCWJvb2wgdHhmbG93Y29udHJvbDsJLyogUGVyIGludGVyZmFjZSBmbG93IGNvbnRyb2wgaW5kaWNhdG9yICovCiAJY2hhciBuYW1lW0lGTkFNU0laXTsJLyogbGludXggaW50ZXJmYWNlIG5hbWUgKi8KQEAgLTcwOSw3ICs3MDgsNyBAQAogCiAJLyogU2VuZCBkb3duIHRoZSBtdWx0aWNhc3QgbGlzdCBmaXJzdC4gKi8KIAotCWJ1ZmxlbiA9IHNpemVvZigibWNhc3RfbGlzdCIpICsgc2l6ZW9mKGNudCkgKyAoY250ICogRVRIRVJfQUREUl9MRU4pOworCWJ1ZmxlbiA9IHNpemVvZigibWNhc3RfbGlzdCIpICsgc2l6ZW9mKGNudCkgKyAoY250ICogRVRIX0FMRU4pOwogCWJ1ZnAgPSBidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZwKSB7CiAJCURIRF9FUlJPUigoIiVzOiBvdXQgb2YgbWVtb3J5IGZvciBtY2FzdF9saXN0LCBjbnQgJWRcbiIsCkBAIC03MjcsOCArNzI2LDggQEAKIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CiAJCWlmICghY250KQogCQkJYnJlYWs7Ci0JCW1lbWNweShidWZwLCBoYS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOwotCQlidWZwICs9IEVUSEVSX0FERFJfTEVOOworCQltZW1jcHkoYnVmcCwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJYnVmcCArPSBFVEhfQUxFTjsKIAkJY250LS07CiAJfQogCkBAIC04MTIsNyArODExLDcgQEAKIAogCURIRF9UUkFDRSgoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXykpOwogCWlmICghYmNtX21raW92YXIKLQkgICAgKCJjdXJfZXRoZXJhZGRyIiwgKGNoYXIgKilhZGRyLCBFVEhFUl9BRERSX0xFTiwgYnVmLCAzMikpIHsKKwkgICAgKCJjdXJfZXRoZXJhZGRyIiwgKGNoYXIgKilhZGRyLCBFVEhfQUxFTiwgYnVmLCAzMikpIHsKIAkJREhEX0VSUk9SKCgiJXM6IG1raW92YXIgZmFpbGVkIGZvciBjdXJfZXRoZXJhZGRyXG4iLAogCQkJICAgZGhkX2lmbmFtZSgmZGhkLT5wdWIsIGlmaWR4KSkpOwogCQlyZXR1cm4gLTE7CkBAIC04MjgsNyArODI3LDcgQEAKIAkJREhEX0VSUk9SKCgiJXM6IHNldCBjdXJfZXRoZXJhZGRyIGZhaWxlZFxuIiwKIAkJCSAgIGRoZF9pZm5hbWUoJmRoZC0+cHViLCBpZmlkeCkpKTsKIAl9IGVsc2UgewotCQltZW1jcHkoZGhkLT5pZmxpc3RbaWZpZHhdLT5uZXQtPmRldl9hZGRyLCBhZGRyLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShkaGQtPmlmbGlzdFtpZmlkeF0tPm5ldC0+ZGV2X2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTk4LDcgKzk5Nyw3IEBACiAJCXJldHVybiAtMTsKIAogCUFTU0VSVChkaGQtPnN5c2lvY190c2spOwotCW1lbWNweSgmZGhkLT5tYWN2YWx1ZSwgc2EtPnNhX2RhdGEsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJmRoZC0+bWFjdmFsdWUsIHNhLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAJZGhkLT5zZXRfbWFjYWRkcmVzcyA9IHRydWU7CiAJdXAoJmRoZC0+c3lzaW9jX3NlbSk7CiAKQEAgLTEwMTksNyArMTAxOCw3IEBACiAJdXAoJmRoZC0+c3lzaW9jX3NlbSk7CiB9CiAKLWludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmKQoraW50IGRoZF9zZW5kcGt0KGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQogewogCWludCByZXQ7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgKGRoZHAtPmluZm8pOwpAQCAtMTAyOSwxMyArMTAyOCwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFVwZGF0ZSBtdWx0aWNhc3Qgc3RhdGlzdGljICovCi0JaWYgKFBLVExFTihwa3RidWYpID49IEVUSEVSX0FERFJfTEVOKSB7Ci0JCXU4ICpwa3RkYXRhID0gKHU4ICopIFBLVERBVEEocGt0YnVmKTsKKwlpZiAocGt0YnVmLT5sZW4gPj0gRVRIX0FMRU4pIHsKKwkJdTggKnBrdGRhdGEgPSAodTggKikgKHBrdGJ1Zi0+ZGF0YSk7CiAJCXN0cnVjdCBldGhlcl9oZWFkZXIgKmVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKilwa3RkYXRhOwogCi0JCWlmIChFVEhFUl9JU01VTFRJKGVoLT5ldGhlcl9kaG9zdCkpCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihlaC0+ZXRoZXJfZGhvc3QpKQogCQkJZGhkcC0+dHhfbXVsdGljYXN0Kys7Ci0JCWlmIChudG9oMTYoZWgtPmV0aGVyX3R5cGUpID09IEVUSEVSX1RZUEVfODAyXzFYKQorCQlpZiAobnRvaDE2KGVoLT5ldGhlcl90eXBlKSA9PSBFVEhfUF9QQUUpCiAJCQlhdG9taWNfaW5jKCZkaGQtPnBlbmRfODAyMXhfY250KTsKIAl9CiAKQEAgLTEwNTMsNiArMTA1MiwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitvc2xfcGt0X2ZybW5hdGl2ZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWZvciAobnNrYiA9IHNrYjsgbnNrYjsgbnNrYiA9IG5za2ItPm5leHQpCisJCW9zaC0+cGt0YWxsb2NlZCsrOworCisJcmV0dXJuICh2b2lkICopc2tiOworfQorI2RlZmluZSBQS1RGUk1OQVRJVkUob3NoLCBza2IpCVwKKwlvc2xfcGt0X2ZybW5hdGl2ZSgob3NoKSwgKHN0cnVjdCBza19idWZmICopKHNrYikpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorb3NsX3BrdF90b25hdGl2ZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcGt0KQoreworCXN0cnVjdCBza19idWZmICpuc2tiOworCisJZm9yIChuc2tiID0gKHN0cnVjdCBza19idWZmICopcGt0OyBuc2tiOyBuc2tiID0gbnNrYi0+bmV4dCkKKwkJb3NoLT5wa3RhbGxvY2VkLS07CisKKwlyZXR1cm4gKHN0cnVjdCBza19idWZmICopcGt0OworfQorI2RlZmluZSBQS1RUT05BVElWRShvc2gsIHBrdCkJXAorCW9zbF9wa3RfdG9uYXRpdmUoKG9zaCksIChwa3QpKQorCiBzdGF0aWMgaW50IGRoZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJaW50IHJldDsKQEAgLTExMzMsMTMgKzExNTgsMTUgQEAKIAkJbmV0aWZfd2FrZV9xdWV1ZShuZXQpOwogfQogCi12b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmLCBpbnQgbnVtcGt0KQordm9pZCBkaGRfcnhfZnJhbWUoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3RidWYsCisJCSAgaW50IG51bXBrdCkKIHsKIAlkaGRfaW5mb190ICpkaGQgPSAoZGhkX2luZm9fdCAqKSBkaGRwLT5pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqZXRoOwogCXVpbnQgbGVuOwotCXZvaWQgKmRhdGEsICpwbmV4dCwgKnNhdmVfcGt0YnVmOworCXZvaWQgKmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnBuZXh0LCAqc2F2ZV9wa3RidWY7CiAJaW50IGk7CiAJZGhkX2lmX3QgKmlmcDsKIAl3bF9ldmVudF9tc2dfdCBldmVudDsKQEAgLTExNTAsOCArMTE3Nyw4IEBACiAKIAlmb3IgKGkgPSAwOyBwa3RidWYgJiYgaSA8IG51bXBrdDsgaSsrLCBwa3RidWYgPSBwbmV4dCkgewogCi0JCXBuZXh0ID0gUEtUTkVYVChwa3RidWYpOwotCQlQS1RTRVRORVhUKHBrdGJ1ZiwgTlVMTCk7CisJCXBuZXh0ID0gcGt0YnVmLT5uZXh0OworCQlwa3RidWYtPm5leHQgPSBOVUxMOwogCiAJCXNrYiA9IFBLVFRPTkFUSVZFKGRoZHAtPm9zaCwgcGt0YnVmKTsKIApAQCAtMTE5MCw3ICsxMjE3LDcgQEAKIAkJLyogUHJvY2VzcyBzcGVjaWFsIGV2ZW50IHBhY2tldHMgYW5kIHRoZW4gZGlzY2FyZCB0aGVtICovCiAJCWlmIChudG9oMTYoc2tiLT5wcm90b2NvbCkgPT0gRVRIRVJfVFlQRV9CUkNNKQogCQkJZGhkX3dsX2hvc3RfZXZlbnQoZGhkLCAmaWZpZHgsCi0JCQkJCSAgc2tiLT5tYWNfaGVhZGVyLAorCQkJCQkgIHNrYl9tYWNfaGVhZGVyKHNrYiksCiAJCQkJCSAgJmV2ZW50LCAmZGF0YSk7CiAKIAkJQVNTRVJUKGlmaWR4IDwgREhEX01BWF9JRlMgJiYgZGhkLT5pZmxpc3RbaWZpZHhdKTsKQEAgLTEyMjMsNyArMTI1MCw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgdm9pZCAqdHhwLCBib29sIHN1Y2Nlc3MpCit2b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHNrX2J1ZmYgKnR4cCwgYm9vbCBzdWNjZXNzKQogewogCXVpbnQgaWZpZHg7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgKGRoZHAtPmluZm8pOwpAQCAtMTIzMiwxMCArMTI1OSwxMCBAQAogCiAJZGhkX3Byb3RfaGRycHVsbChkaGRwLCAmaWZpZHgsIHR4cCk7CiAKLQllaCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopUEtUREFUQSh0eHApOworCWVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKikodHhwLT5kYXRhKTsKIAl0eXBlID0gbnRvaDE2KGVoLT5ldGhlcl90eXBlKTsKIAotCWlmICh0eXBlID09IEVUSEVSX1RZUEVfODAyXzFYKQorCWlmICh0eXBlID09IEVUSF9QX1BBRSkKIAkJYXRvbWljX2RlYygmZGhkLT5wZW5kXzgwMjF4X2NudCk7CiAKIH0KQEAgLTE2MjEsNiArMTY0OCw1MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgczE2IGxpbnV4YmNtZXJyb3JtYXBbXSA9IHsgMCwJLyogMCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0VSUk9SICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFEQVJHICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFET1BUSU9OICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9UVVAgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RET1dOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9UQVAgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RTVEEgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURLRVlJRFggKi8KKwktRUlOVkFMLAkJLyogQkNNRV9SQURJT09GRiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVEJBTkRMT0NLRUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT0NMSyAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0JBRFJBVEVTRVQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURCQU5EICovCisJLUUyQklHLAkJCS8qIEJDTUVfQlVGVE9PU0hPUlQgKi8KKwktRTJCSUcsCQkJLyogQkNNRV9CVUZUT09MT05HICovCisJLUVCVVNZLAkJCS8qIEJDTUVfQlVTWSAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVEFTU09DSUFURUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURTU0lETEVOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfT1VUT0ZSQU5HRUNIQU4gKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURDSEFOICovCisJLUVGQVVMVCwJCS8qIEJDTUVfQkFEQUREUiAqLworCS1FTk9NRU0sCQkvKiBCQ01FX05PUkVTT1VSQ0UgKi8KKwktRU9QTk9UU1VQUCwJCS8qIEJDTUVfVU5TVVBQT1JURUQgKi8KKwktRU1TR1NJWkUsCQkvKiBCQ01FX0JBRExFTkdUSCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVFJFQURZICovCisJLUVQRVJNLAkJCS8qIEJDTUVfTk9UUEVSTUlUVEVEICovCisJLUVOT01FTSwJCS8qIEJDTUVfTk9NRU0gKi8KKwktRUlOVkFMLAkJLyogQkNNRV9BU1NPQ0lBVEVEICovCisJLUVSQU5HRSwJCS8qIEJDTUVfUkFOR0UgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RGT1VORCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX1dNRV9OT1RfRU5BQkxFRCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX1RTUEVDX05PVEZPVU5EICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQUNNX05PVFNVUFBPUlRFRCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVF9XTUVfQVNTT0NJQVRJT04gKi8KKwktRUlPLAkJCS8qIEJDTUVfU0RJT19FUlJPUiAqLworCS1FTk9ERVYsCQkvKiBCQ01FX0RPTkdMRV9ET1dOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfVkVSU0lPTiAqLworCS1FSU8sCQkJLyogQkNNRV9UWEZBSUwgKi8KKwktRUlPLAkJCS8qIEJDTUVfUlhGQUlMICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9ERVZJQ0UgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OTU9ERV9ESVNBQkxFRCAqLworCS1FTk9EQVRBLAkJLyogQkNNRV9OT05SRVNJREVOVCAqLworfTsKKwogc3RhdGljIGludCBkaGRfaW9jdGxfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gKihkaGRfaW5mb190ICoqKSBuZXRkZXZfcHJpdihuZXQpOwpAQCAtMTc0Miw3ICsxODE0LDEyIEBACiAJaWYgKGJ1ZikKIAkJa2ZyZWUoYnVmKTsKIAotCXJldHVybiBPU0xfRVJST1IoYmNtZXJyb3IpOworCWlmIChiY21lcnJvciA+IDApCisJCWJjbWVycm9yID0gMDsKKwllbHNlIGlmIChiY21lcnJvciA8IEJDTUVfTEFTVCkKKwkJYmNtZXJyb3IgPSBCQ01FX0VSUk9SOworCisJcmV0dXJuIGxpbnV4YmNtZXJyb3JtYXBbLWJjbWVycm9yXTsKIH0KIAogc3RhdGljIGludCBkaGRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQpAQCAtMTc4OSw3ICsxODY2LDcgQEAKIAkJfQogCQlhdG9taWNfc2V0KCZkaGQtPnBlbmRfODAyMXhfY250LCAwKTsKIAotCQltZW1jcHkobmV0LT5kZXZfYWRkciwgZGhkLT5wdWIubWFjLm9jdGV0LCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShuZXQtPmRldl9hZGRyLCBkaGQtPnB1Yi5tYWMub2N0ZXQsIEVUSF9BTEVOKTsKIAogI2lmZGVmIFRPRQogCQkvKiBHZXQgY3VycmVudCBUT0UgbW9kZSBmcm9tIGRvbmdsZSAqLwpAQCAtMTgxNCwxMiArMTg5MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLW9zbF90ICpkaGRfb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUpCitzdHJ1Y3Qgb3NsX2luZm8gKmRoZF9vc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSkKIHsKLQlyZXR1cm4gb3NsX2F0dGFjaChwZGV2LCBidXN0eXBlLCB0cnVlKTsKKwlyZXR1cm4gb3NsX2F0dGFjaChwZGV2LCBidXN0eXBlKTsKIH0KIAotdm9pZCBkaGRfb3NsX2RldGFjaChvc2xfdCAqb3NoKQordm9pZCBkaGRfb3NsX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlvc2xfZGV0YWNoKG9zaCk7CiB9CkBAIC0xODQ1LDcgKzE5MjIsNyBAQAogCWRoZC0+aWZsaXN0W2lmaWR4XSA9IGlmcDsKIAlzdHJsY3B5KGlmcC0+bmFtZSwgbmFtZSwgSUZOQU1TSVopOwogCWlmIChtYWNfYWRkciAhPSBOVUxMKQotCQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIG1hY19hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmaWZwLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWlmIChoYW5kbGUgPT0gTlVMTCkgewogCQlpZnAtPnN0YXRlID0gV0xDX0VfSUZfQUREOwpAQCAtMTg3Nyw3ICsxOTU0LDggQEAKIAl1cCgmZGhkLT5zeXNpb2Nfc2VtKTsKIH0KIAotZGhkX3B1Yl90ICpkaGRfYXR0YWNoKG9zbF90ICpvc2gsIHN0cnVjdCBkaGRfYnVzICpidXMsIHVpbnQgYnVzX2hkcmxlbikKK2RoZF9wdWJfdCAqZGhkX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IGRoZF9idXMgKmJ1cywKKwkJCXVpbnQgYnVzX2hkcmxlbikKIHsKIAlkaGRfaW5mb190ICpkaGQgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CkBAIC0yMTk5LDE5ICsyMjc3LDExIEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkaGRfc2V0X211bHRpY2FzdF9saXN0CiB9OwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGRoZF9vcHNfdmlydCA9IHsKLQkubmRvX2dldF9zdGF0cyA9IGRoZF9nZXRfc3RhdHMsCi0JLm5kb19kb19pb2N0bCA9IGRoZF9pb2N0bF9lbnRyeSwKLQkubmRvX3N0YXJ0X3htaXQgPSBkaGRfc3RhcnRfeG1pdCwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGRoZF9zZXRfbWFjX2FkZHJlc3MsCi0JLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkaGRfc2V0X211bHRpY2FzdF9saXN0Ci19OwotCiBpbnQgZGhkX25ldF9hdHRhY2goZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgpCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgZGhkcC0+aW5mbzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwotCXU4IHRlbXBfYWRkcltFVEhFUl9BRERSX0xFTl0gPSB7CisJdTggdGVtcF9hZGRyW0VUSF9BTEVOXSA9IHsKIAkJMHgwMCwgMHg5MCwgMHg0YywgMHgxMSwgMHgyMiwgMHgzM307CiAKIAlESERfVFJBQ0UoKCIlczogaWZpZHggJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwpAQCAtMjIyOSw3ICsyMjk5LDcgQEAKIAkgKi8KIAlpZiAoaWZpZHggIT0gMCkgewogCQkvKiBmb3IgdmlydHVhbCBpbnRlcmZhY2VzIHVzZSB0aGUgcHJpbWFyeSBNQUMgICovCi0JCW1lbWNweSh0ZW1wX2FkZHIsIGRoZC0+cHViLm1hYy5vY3RldCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkodGVtcF9hZGRyLCBkaGQtPnB1Yi5tYWMub2N0ZXQsIEVUSF9BTEVOKTsKIAogCX0KIApAQCAtMjI1Nyw3ICsyMzI3LDcgQEAKIAogCWRoZC0+cHViLnJ4c3ogPSBuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuICsgZGhkLT5wdWIuaGRybGVuOwogCi0JbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIHRlbXBfYWRkciwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweShuZXQtPmRldl9hZGRyLCB0ZW1wX2FkZHIsIEVUSF9BTEVOKTsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0KSAhPSAwKSB7CiAJCURIRF9FUlJPUigoIiVzOiBjb3VsZG4ndCByZWdpc3RlciB0aGUgbmV0IGRldmljZVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4X3NjaGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eF9zY2hlZC5jCmluZGV4IGJmOGRmOTguLmM2NmYxYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4X3NjaGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXhfc2NoZWQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KIAogaW50IHNldFNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwb2xpY3ksIHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaAppbmRleCBjYzQyZmE0Li5hNTMwOWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmgKQEAgLTQ2LDE1ICs0NiwxNiBAQAogLyogU3RvcCBwcm90b2NvbDogc3luYyB3L2RvbmdsZSBzdGF0ZS4gKi8KIGV4dGVybiB2b2lkIGRoZF9wcm90X3N0b3AoZGhkX3B1Yl90ICpkaGRwKTsKIAotZXh0ZXJuIGJvb2wgZGhkX3Byb3RvX2ZjaW5mbyhkaGRfcHViX3QgKmRoZCwgdm9pZCAqcGt0YnVmLCB1OCAqZmNiaXRzKTsKK2V4dGVybiBib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHN0cnVjdCBza19idWZmICpwa3RidWYsCisJCQkgICAgIHU4ICpmY2JpdHMpOwogCiAvKiBBZGQgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLgogICogQ2FsbGVyIG11c3QgcmVzZXJ2ZSBwcm90X2hkcmxlbiBwcmVwZW5kIHNwYWNlLgogICovCi1leHRlcm4gdm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqLCBpbnQgaWZpZHgsIHZvaWQgKnR4cCk7CitleHRlcm4gdm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICp0eHApOwogCiAvKiBSZW1vdmUgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLiAqLwotZXh0ZXJuIGludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqLCBpbnQgKmlmaWR4LCB2b2lkICpyeHApOworZXh0ZXJuIGludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqLCBpbnQgKmlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcnhwKTsKIAogLyogVXNlIHByb3RvY29sIHRvIGlzc3VlIGlvY3RsIHRvIGRvbmdsZSAqLwogZXh0ZXJuIGludCBkaGRfcHJvdF9pb2N0bChkaGRfcHViX3QgKmRoZCwgaW50IGlmaWR4LCB3bF9pb2N0bF90ICppb2MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKaW5kZXggYjIyODFkOS4uM2VkY2U0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtc2RoLmg+CiAKQEAgLTE0Myw3ICsxNDQsNyBAQAogICogYnVmcG9vbCB3YXMgcHJlc2VudCBmb3IgZ3NwaSBidXMuCiAgKi8KICNkZWZpbmUgUEtURlJFRTIoKQkJaWYgKChidXMtPmJ1cyAhPSBTUElfQlVTKSB8fCBidXMtPnVzZWJ1ZnBvb2wpIFwKLQkJCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCQkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOwogREhEX1NQSU5XQUlUX1NMRUVQX0lOSVQoc2Rpb2hfc3BpbndhaXRfc2xlZXApOwogZXh0ZXJuIGludCBkaGRjZGNfc2V0X2lvY3RsKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHVpbnQgY21kLCB2b2lkICpidWYsCiAJCQkgICAgdWludCBsZW4pOwpAQCAtMjAyLDggKzIwMyw4IEBACiAJdTggcnhfc2VxOwkJLyogUmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgKGV4cGVjdGVkKSAqLwogCWJvb2wgcnhza2lwOwkJLyogU2tpcCByZWNlaXZlIChhd2FpdGluZyBOQUsgQUNLKSAqLwogCi0Jdm9pZCAqZ2xvbWQ7CQkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCi0Jdm9pZCAqZ2xvbTsJCS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCisJc3RydWN0IHNrX2J1ZmYgKmdsb21kOwkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCisJc3RydWN0IHNrX2J1ZmYgKmdsb207CS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCiAJdWludCBnbG9tZXJyOwkJLyogR2xvbSBwYWNrZXQgcmVhZCBlcnJvcnMgKi8KIAogCXU4ICpyeGJ1ZjsJCS8qIEJ1ZmZlciBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgcGFja2V0cyAqLwpAQCAtMzU2LDE2ICszNTcsMTYgQEAKICNpZiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICYmIGRlZmluZWQoU0RJT19JU1JfVEhSRUFEKQogI2Vycm9yIE9PQl9JTlRSX09OTFkgaXMgTk9UIHdvcmtpbmcgd2l0aCBTRElPX0lTUl9USFJFQUQKICNlbmRpZgkvKiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICYmIGRlZmluZWQoU0RJT19JU1JfVEhSRUFEKSAqLwotI2RlZmluZSBQS1RBTElHTihvc2gsIHAsIGxlbiwgYWxpZ24pCQkJCQlcCisjZGVmaW5lIFBLVEFMSUdOKF9vc2gsIF9wLCBfbGVuLCBfYWxpZ24pCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVpbnQgZGF0YWxpZ247CQkJCQkJXAotCQlkYXRhbGlnbiA9ICh1bnNpZ25lZCBsb25nKVBLVERBVEEoKHApKTsJCQlcCi0JCWRhdGFsaWduID0gcm91bmR1cChkYXRhbGlnbiwgKGFsaWduKSkgLSBkYXRhbGlnbjsJXAotCQlBU1NFUlQoZGF0YWxpZ24gPCAoYWxpZ24pKTsJCQkJXAotCQlBU1NFUlQoUEtUTEVOKChwKSkgPj0gKChsZW4pICsgZGF0YWxpZ24pKTsJXAorCQlkYXRhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSgoX3ApLT5kYXRhKTsJCQlcCisJCWRhdGFsaWduID0gcm91bmR1cChkYXRhbGlnbiwgKF9hbGlnbikpIC0gZGF0YWxpZ247CVwKKwkJQVNTRVJUKGRhdGFsaWduIDwgKF9hbGlnbikpOwkJCQlcCisJCUFTU0VSVCgoX3ApLT5sZW4gPj0gKChfbGVuKSArIGRhdGFsaWduKSk7CQlcCiAJCWlmIChkYXRhbGlnbikJCQkJCQlcCi0JCQlQS1RQVUxMKChwKSwgZGF0YWxpZ24pOwkJCVwKLQkJUEtUU0VUTEVOKChwKSwgKGxlbikpOwkJCQlcCisJCQlza2JfcHVsbCgoX3ApLCBkYXRhbGlnbik7CQkJXAorCQlfX3NrYl90cmltKChfcCksIChfbGVuKSk7CQkJCVwKIAl9IHdoaWxlICgwKQogCiAvKiBMaW1pdCBvbiByb3VuZGluZyB1cCBmcmFtZXMgKi8KQEAgLTQzMCwyNyArNDMxLDMwIEBACiAjZW5kaWYJCQkJLyogREhEX0RFQlVHICAqLwogc3RhdGljIGludCBkaGRzZGlvX2Rvd25sb2FkX3N0YXRlKGRoZF9idXNfdCAqYnVzLCBib29sIGVudGVyKTsKIAotc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKTsKLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gpOworc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBzdGF0aWMgdm9pZCBkaGRzZGlvX2Rpc2Nvbm5lY3Qodm9pZCAqcHRyKTsKIHN0YXRpYyBib29sIGRoZHNkaW9fY2hpcG1hdGNoKHUxNiBjaGlwaWQpOwotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9hdHRhY2goZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCwKLQkJCQkgdm9pZCAqcmVnc3ZhLCB1MTYgZGV2aWQpOwotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCk7Ci1zdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2luaXQoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCk7Ci1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfZG9uZ2xlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqIG9zaCk7CitzdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2F0dGFjaChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkJIHZvaWQgKnNkaCwgdm9pZCAqcmVnc3ZhLCB1MTYgZGV2aWQpOworc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCSB2b2lkICpzZGgpOworc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9pbml0KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqc2RoKTsKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9kb25nbGUoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqIG9zaCk7CiAKIHN0YXRpYyB1aW50IHByb2Nlc3NfbnZyYW1fdmFycyhjaGFyICp2YXJidWYsIHVpbnQgbGVuKTsKIAogc3RhdGljIHZvaWQgZGhkX2RvbmdsZV9zZXRtZW1zaXplKHN0cnVjdCBkaGRfYnVzICpidXMsIGludCBtZW1fc2l6ZSk7CiBzdGF0aWMgaW50IGRoZF9iY21zZGhfcmVjdl9idWYoZGhkX2J1c190ICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkJICAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCi0JCQkgICAgICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSk7CisJCQkgICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCwgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsCisJCQkgICAgICAgdm9pZCAqaGFuZGxlKTsKIHN0YXRpYyBpbnQgZGhkX2JjbXNkaF9zZW5kX2J1ZihkaGRfYnVzX3QgKmJ1cywgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCQkgICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKLQkJCSAgICAgICBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKTsKKwkJCSAgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwKKwkJCSAgICAgICB2b2lkICpoYW5kbGUpOwogCi1zdGF0aWMgYm9vbCBkaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsCitzdGF0aWMgYm9vbCBkaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJCSAgICAgIHZvaWQgKnNkaCk7CiBzdGF0aWMgaW50IF9kaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMpOwogCkBAIC05MDAsMTYgKzkwNCwxNyBAQAogCiAvKiBXcml0ZXMgYSBIVy9TVyBoZWFkZXIgaW50byB0aGUgcGFja2V0IGFuZCBzZW5kcyBpdC4gKi8KIC8qIEFzc3VtZXM6IChhKSBoZWFkZXIgc3BhY2UgYWxyZWFkeSB0aGVyZSwgKGIpIGNhbGxlciBob2xkcyBsb2NrICovCi1zdGF0aWMgaW50IGRoZHNkaW9fdHhwa3QoZGhkX2J1c190ICpidXMsIHZvaWQgKnBrdCwgdWludCBjaGFuLCBib29sIGZyZWVfcGt0KQorc3RhdGljIGludCBkaGRzZGlvX3R4cGt0KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IGNoYW4sCisJCQkgYm9vbCBmcmVlX3BrdCkKIHsKIAlpbnQgcmV0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTggKmZyYW1lOwogCXUxNiBsZW4sIHBhZCA9IDA7CiAJdTMyIHN3aGVhZGVyOwogCXVpbnQgcmV0cmllcyA9IDA7CiAJYmNtc2RoX2luZm9fdCAqc2RoOwotCXZvaWQgKm5ldzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3OwogCWludCBpOwogCiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwpAQCAtOTIyLDQ2ICs5MjcsNDYgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWZyYW1lID0gKHU4ICopIFBLVERBVEEocGt0KTsKKwlmcmFtZSA9ICh1OCAqKSAocGt0LT5kYXRhKTsKIAogCS8qIEFkZCBhbGlnbm1lbnQgcGFkZGluZywgYWxsb2NhdGUgbmV3IHBhY2tldCBpZiBuZWVkZWQgKi8KIAlwYWQgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUgJSBESERfU0RBTElHTik7CiAJaWYgKHBhZCkgewotCQlpZiAoUEtUSEVBRFJPT00ocGt0KSA8IHBhZCkgeworCQlpZiAoc2tiX2hlYWRyb29tKHBrdCkgPCBwYWQpIHsKIAkJCURIRF9JTkZPKCgiJXM6IGluc3VmZmljaWVudCBoZWFkcm9vbSAlZCBmb3IgJWQgcGFkXG4iLAotCQkJCSAgX19mdW5jX18sIChpbnQpUEtUSEVBRFJPT00ocGt0KSwgcGFkKSk7CisJCQkJICBfX2Z1bmNfXywgc2tiX2hlYWRyb29tKHBrdCksIHBhZCkpOwogCQkJYnVzLT5kaGQtPnR4X3JlYWxsb2MrKzsKLQkJCW5ldyA9IFBLVEdFVChvc2gsIChQS1RMRU4ocGt0KSArIERIRF9TREFMSUdOKSwgdHJ1ZSk7CisJCQluZXcgPSBwa3RfYnVmX2dldF9za2Iob3NoLCAocGt0LT5sZW4gKyBESERfU0RBTElHTikpOwogCQkJaWYgKCFuZXcpIHsKIAkJCQlESERfRVJST1IoKCIlczogY291bGRuJ3QgYWxsb2NhdGUgbmV3ICVkLWJ5dGUgIgogCQkJCQkicGFja2V0XG4iLAotCQkJCQlfX2Z1bmNfXywgUEtUTEVOKHBrdCkgKyBESERfU0RBTElHTikpOworCQkJCQlfX2Z1bmNfXywgcGt0LT5sZW4gKyBESERfU0RBTElHTikpOwogCQkJCXJldCA9IEJDTUVfTk9NRU07CiAJCQkJZ290byBkb25lOwogCQkJfQogCi0JCQlQS1RBTElHTihvc2gsIG5ldywgUEtUTEVOKHBrdCksIERIRF9TREFMSUdOKTsKLQkJCWJjb3B5KFBLVERBVEEocGt0KSwgUEtUREFUQShuZXcpLCBQS1RMRU4ocGt0KSk7CisJCQlQS1RBTElHTihvc2gsIG5ldywgcGt0LT5sZW4sIERIRF9TREFMSUdOKTsKKwkJCWJjb3B5KHBrdC0+ZGF0YSwgbmV3LT5kYXRhLCBwa3QtPmxlbik7CiAJCQlpZiAoZnJlZV9wa3QpCi0JCQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgdHJ1ZSk7CiAJCQkvKiBmcmVlIHRoZSBwa3QgaWYgY2FubmVkIG9uZSBpcyBub3QgdXNlZCAqLwogCQkJZnJlZV9wa3QgPSB0cnVlOwogCQkJcGt0ID0gbmV3OwotCQkJZnJhbWUgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7CiAJCQlBU1NFUlQoKCh1bnNpZ25lZCBsb25nKWZyYW1lICUgREhEX1NEQUxJR04pID09IDApOwogCQkJcGFkID0gMDsKIAkJfSBlbHNlIHsKLQkJCVBLVFBVU0gocGt0LCBwYWQpOwotCQkJZnJhbWUgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJc2tiX3B1c2gocGt0LCBwYWQpOworCQkJZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7CiAKLQkJCUFTU0VSVCgocGFkICsgU0RQQ01fSERSTEVOKSA8PSAoaW50KVBLVExFTihwa3QpKTsKLQkJCWJ6ZXJvKGZyYW1lLCBwYWQgKyBTRFBDTV9IRFJMRU4pOworCQkJQVNTRVJUKChwYWQgKyBTRFBDTV9IRFJMRU4pIDw9IChpbnQpKHBrdC0+bGVuKSk7CisJCQltZW1zZXQoZnJhbWUsIDAsIHBhZCArIFNEUENNX0hEUkxFTik7CiAJCX0KIAl9CiAJQVNTRVJUKHBhZCA8IERIRF9TREFMSUdOKTsKIAogCS8qIEhhcmR3YXJlIHRhZzogMiBieXRlIGxlbiBmb2xsb3dlZCBieSAyIGJ5dGUgfmxlbiBjaGVjayAoYWxsIExFKSAqLwotCWxlbiA9ICh1MTYpIFBLVExFTihwa3QpOworCWxlbiA9ICh1MTYpIChwa3QtPmxlbik7CiAJKih1MTYgKikgZnJhbWUgPSBodG9sMTYobGVuKTsKIAkqKCgodTE2ICopIGZyYW1lKSArIDEpID0gaHRvbDE2KH5sZW4pOwogCkBAIC05NzQsNyArOTc5LDcgQEAKIAlodG9sMzJfdWFfc3RvcmUoMCwgZnJhbWUgKyBTRFBDTV9GUkFNRVRBR19MRU4gKyBzaXplb2Yoc3doZWFkZXIpKTsKIAogI2lmZGVmIERIRF9ERUJVRwotCXR4X3BhY2tldHNbUEtUUFJJTyhwa3QpXSsrOworCXR4X3BhY2tldHNbcGt0LT5wcmlvcml0eV0rKzsKIAlpZiAoREhEX0JZVEVTX09OKCkgJiYKIAkgICAgKCgoREhEX0NUTF9PTigpICYmIChjaGFuID09IFNEUENNX0NPTlRST0xfQ0hBTk5FTCkpIHx8CiAJICAgICAgKERIRF9EQVRBX09OKCkgJiYgKGNoYW4gIT0gU0RQQ01fQ09OVFJPTF9DSEFOTkVMKSkpKSkgewpAQCAtOTg5LDcgKzk5NCw3IEBACiAJCXUxNiBwYWQgPSBidXMtPmJsb2Nrc2l6ZSAtIChsZW4gJSBidXMtPmJsb2Nrc2l6ZSk7CiAJCWlmICgocGFkIDw9IGJ1cy0+cm91bmR1cCkgJiYgKHBhZCA8IGJ1cy0+YmxvY2tzaXplKSkKICNpZmRlZiBOT1RVU0VECi0JCQlpZiAocGFkIDw9IFBLVFRBSUxST09NKHBrdCkpCisJCQlpZiAocGFkIDw9IHNrYl90YWlscm9vbShwa3QpKQogI2VuZGlmCQkJCS8qIE5PVFVTRUQgKi8KIAkJCQlsZW4gKz0gcGFkOwogCX0gZWxzZSBpZiAobGVuICUgREhEX1NEQUxJR04pIHsKQEAgLTk5OSw3ICsxMDA0LDcgQEAKIAkvKiBTb21lIGNvbnRyb2xsZXJzIGhhdmUgdHJvdWJsZSB3aXRoIG9kZCBieXRlcyAtLSByb3VuZCB0byBldmVuICovCiAJaWYgKGZvcmNlYWxpZ24gJiYgKGxlbiAmIChBTElHTk1FTlQgLSAxKSkpIHsKICNpZmRlZiBOT1RVU0VECi0JCWlmIChQS1RUQUlMUk9PTShwa3QpKQorCQlpZiAoc2tiX3RhaWxyb29tKHBrdCkpCiAjZW5kaWYKIAkJCWxlbiA9IHJvdW5kdXAobGVuLCBBTElHTk1FTlQpOwogI2lmZGVmIE5PVFVTRUQKQEAgLTEwNTAsMzQgKzEwNTUsMzQgQEAKIAogZG9uZToKIAkvKiByZXN0b3JlIHBrdCBidWZmZXIgcG9pbnRlciBiZWZvcmUgY2FsbGluZyB0eCBjb21wbGV0ZSByb3V0aW5lICovCi0JUEtUUFVMTChwa3QsIFNEUENNX0hEUkxFTiArIHBhZCk7CisJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4gKyBwYWQpOwogCWRoZF9vc19zZHVubG9jayhidXMtPmRoZCk7CiAJZGhkX3R4Y29tcGxldGUoYnVzLT5kaGQsIHBrdCwgcmV0ICE9IDApOwogCWRoZF9vc19zZGxvY2soYnVzLT5kaGQpOwogCiAJaWYgKGZyZWVfcGt0KQotCQlQS1RGUkVFKG9zaCwgcGt0LCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgdHJ1ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgdm9pZCAqcGt0KQoraW50IGRoZF9idXNfdHhkYXRhKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJaW50IHJldCA9IEJDTUVfRVJST1I7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl1aW50IGRhdGFsZW4sIHByZWM7CiAKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKIAlvc2ggPSBidXMtPmRoZC0+b3NoOwotCWRhdGFsZW4gPSBQS1RMRU4ocGt0KTsKKwlkYXRhbGVuID0gcGt0LT5sZW47CiAKICNpZmRlZiBTRFRFU1QKIAkvKiBQdXNoIHRoZSB0ZXN0IGhlYWRlciBpZiBkb2luZyBsb29wYmFjayAqLwogCWlmIChidXMtPmV4dF9sb29wKSB7CiAJCXU4ICpkYXRhOwotCQlQS1RQVVNIKHBrdCwgU0RQQ01fVEVTVF9IRFJMRU4pOwotCQlkYXRhID0gUEtUREFUQShwa3QpOworCQlza2JfcHVzaChwa3QsIFNEUENNX1RFU1RfSERSTEVOKTsKKwkJZGF0YSA9IHBrdC0+ZGF0YTsKIAkJKmRhdGErKyA9IFNEUENNX1RFU1RfRUNIT1JFUTsKIAkJKmRhdGErKyA9ICh1OCkgYnVzLT5sb29waWQrKzsKIAkJKmRhdGErKyA9IChkYXRhbGVuID4+IDApOwpAQCAtMTA4NywxMCArMTA5MiwxMCBAQAogI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwogCiAJLyogQWRkIHNwYWNlIGZvciB0aGUgaGVhZGVyICovCi0JUEtUUFVTSChwa3QsIFNEUENNX0hEUkxFTik7Ci0JQVNTRVJUKElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpUEtUREFUQShwa3QpLCAyKSk7CisJc2tiX3B1c2gocGt0LCBTRFBDTV9IRFJMRU4pOworCUFTU0VSVChJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKShwa3QtPmRhdGEpLCAyKSk7CiAKLQlwcmVjID0gUFJJTzJQUkVDKChQS1RQUklPKHBrdCkgJiBQUklPTUFTSykpOworCXByZWMgPSBQUklPMlBSRUMoKHBrdC0+cHJpb3JpdHkgJiBQUklPTUFTSykpOwogCiAJLyogQ2hlY2sgZm9yIGV4aXN0aW5nIHF1ZXVlLCBjdXJyZW50IGZsb3ctY29udHJvbCwKIAkJCSBwZW5kaW5nIGV2ZW50LCBvciBwZW5kaW5nIGNsb2NrICovCkBAIC0xMTA1LDkgKzExMTAsOSBAQAogCQkvKiBQcmlvcml0eSBiYXNlZCBlbnEgKi8KIAkJZGhkX29zX3NkbG9ja190eHEoYnVzLT5kaGQpOwogCQlpZiAoZGhkX3ByZWNfZW5xKGJ1cy0+ZGhkLCAmYnVzLT50eHEsIHBrdCwgcHJlYykgPT0gZmFsc2UpIHsKLQkJCVBLVFBVTEwocGt0LCBTRFBDTV9IRFJMRU4pOworCQkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwogCQkJZGhkX3R4Y29tcGxldGUoYnVzLT5kaGQsIHBrdCwgZmFsc2UpOwotCQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCB0cnVlKTsKIAkJCURIRF9FUlJPUigoIiVzOiBvdXQgb2YgYnVzLT50eHEgISEhXG4iLCBfX2Z1bmNfXykpOwogCQkJcmV0ID0gQkNNRV9OT1JFU09VUkNFOwogCQl9IGVsc2UgewpAQCAtMTE2Miw3ICsxMTY3LDcgQEAKIAogc3RhdGljIHVpbnQgZGhkc2Rpb19zZW5kZnJvbXEoZGhkX2J1c190ICpidXMsIHVpbnQgbWF4ZnJhbWVzKQogewotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXUzMiBpbnRzdGF0dXMgPSAwOwogCXVpbnQgcmV0cmllcyA9IDA7CiAJaW50IHJldCA9IDAsIHByZWNfb3V0OwpAQCAtMTE4Niw3ICsxMTkxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWRoZF9vc19zZHVubG9ja190eHEoYnVzLT5kaGQpOwotCQlkYXRhbGVuID0gUEtUTEVOKHBrdCkgLSBTRFBDTV9IRFJMRU47CisJCWRhdGFsZW4gPSBwa3QtPmxlbiAtIFNEUENNX0hEUkxFTjsKIAogI2lmbmRlZiBTRFRFU1QKIAkJcmV0ID0gZGhkc2Rpb190eHBrdChidXMsIHBrdCwgU0RQQ01fREFUQV9DSEFOTkVMLCB0cnVlKTsKQEAgLTEyNDcsNyArMTI1Miw3IEBACiAJCQlmcmFtZSAtPSBkb2ZmOwogCQkJbGVuICs9IGRvZmY7CiAJCQltc2dsZW4gKz0gZG9mZjsKLQkJCWJ6ZXJvKGZyYW1lLCBkb2ZmICsgU0RQQ01fSERSTEVOKTsKKwkJCW1lbXNldChmcmFtZSwgMCwgZG9mZiArIFNEUENNX0hEUkxFTik7CiAJCX0KIAkJQVNTRVJUKGRvZmYgPCBESERfU0RBTElHTik7CiAJfQpAQCAtMjUzMSw3ICsyNTM2LDcgQEAKIAkJaWYgKCF2YnVmZmVyKQogCQkJcmV0dXJuIEJDTUVfTk9NRU07CiAKLQkJYnplcm8odmJ1ZmZlciwgdmFyc2l6ZSk7CisJCW1lbXNldCh2YnVmZmVyLCAwLCB2YXJzaXplKTsKIAkJYmNvcHkoYnVzLT52YXJzLCB2YnVmZmVyLCBidXMtPnZhcnN6KTsKIAogCQkvKiBXcml0ZSB0aGUgdmFycyBsaXN0ICovCkBAIC0yODIzLDcgKzI4MjgsNyBAQAogCiB2b2lkIGRoZF9idXNfc3RvcChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBib29sIGVuZm9yY2VfbXV0ZXgpCiB7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCXUzMiBsb2NhbF9ob3N0aW50bWFzazsKIAl1OCBzYXZlY2xrOwogCXVpbnQgcmV0cmllczsKQEAgLTI4NzcsMTAgKzI4ODIsMTAgQEAKIAogCS8qIENsZWFyIGFueSBoZWxkIGdsb21taW5nIHN0dWZmICovCiAJaWYgKGJ1cy0+Z2xvbWQpCi0JCVBLVEZSRUUob3NoLCBidXMtPmdsb21kLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb21kLCBmYWxzZSk7CiAKIAlpZiAoYnVzLT5nbG9tKQotCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKIAogCWJ1cy0+Z2xvbSA9IGJ1cy0+Z2xvbWQgPSBOVUxMOwogCkBAIC0zMTc4LDggKzMxODMsOCBAQAogCXU4ICpkcHRyLCBudW0gPSAwOwogCiAJdTE2IHN1YmxlbiwgY2hlY2s7Ci0Jdm9pZCAqcGZpcnN0LCAqcGxhc3QsICpwbmV4dCwgKnNhdmVfcGZpcnN0OwotCW9zbF90ICpvc2ggPSBidXMtPmRoZC0+b3NoOworCXN0cnVjdCBza19idWZmICpwZmlyc3QsICpwbGFzdCwgKnBuZXh0LCAqc2F2ZV9wZmlyc3Q7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCiAJaW50IGVycmNvZGU7CiAJdTggY2hhbiwgc2VxLCBkb2ZmLCBzZmRvZmY7CkBAIC0zMTk5LDggKzMyMDQsOCBAQAogCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7CiAKIAkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dCA9IE5VTEw7Ci0JCWRsZW4gPSAodTE2KSBQS1RMRU4oYnVzLT5nbG9tZCk7Ci0JCWRwdHIgPSBQS1REQVRBKGJ1cy0+Z2xvbWQpOworCQlkbGVuID0gKHUxNikgKGJ1cy0+Z2xvbWQtPmxlbik7CisJCWRwdHIgPSBidXMtPmdsb21kLT5kYXRhOwogCQlpZiAoIWRsZW4gfHwgKGRsZW4gJiAxKSkgewogCQkJREhEX0VSUk9SKCgiJXM6IGJhZCBnbG9tZCBsZW4oJWQpLCBpZ25vcmUgZGVzY3JpcHRvclxuIiwKIAkJCV9fZnVuY19fLCBkbGVuKSk7CkBAIC0zMjM1LDE5ICszMjQwLDE5IEBACiAJCQl9CiAKIAkJCS8qIEFsbG9jYXRlL2NoYWluIHBhY2tldCBmb3IgbmV4dCBzdWJmcmFtZSAqLwotCQkJcG5leHQgPSBQS1RHRVQob3NoLCBzdWJsZW4gKyBESERfU0RBTElHTiwgZmFsc2UpOworCQkJcG5leHQgPSBwa3RfYnVmX2dldF9za2Iob3NoLCBzdWJsZW4gKyBESERfU0RBTElHTik7CiAJCQlpZiAocG5leHQgPT0gTlVMTCkgewotCQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkLCBudW0gJWQgbGVuICVkXG4iLAorCQkJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkLCBudW0gJWQgbGVuICVkXG4iLAogCQkJCQkgICBfX2Z1bmNfXywgbnVtLCBzdWJsZW4pKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCUFTU0VSVCghUEtUTElOSyhwbmV4dCkpOworCQkJQVNTRVJUKCEocG5leHQtPnByZXYpKTsKIAkJCWlmICghcGZpcnN0KSB7CiAJCQkJQVNTRVJUKCFwbGFzdCk7CiAJCQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dDsKIAkJCX0gZWxzZSB7CiAJCQkJQVNTRVJUKHBsYXN0KTsKLQkJCQlQS1RTRVRORVhUKHBsYXN0LCBwbmV4dCk7CisJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKIAkJCQlwbGFzdCA9IHBuZXh0OwogCQkJfQogCkBAIC0zMjcxLDEzICszMjc2LDEzIEBACiAJCQlwZmlyc3QgPSBwbmV4dCA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQlpZiAocGZpcnN0KQotCQkJCVBLVEZSRUUob3NoLCBwZmlyc3QsIGZhbHNlKTsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGZpcnN0LCBmYWxzZSk7CiAJCQlidXMtPmdsb20gPSBOVUxMOwogCQkJbnVtID0gMDsKIAkJfQogCiAJCS8qIERvbmUgd2l0aCBkZXNjcmlwdG9yIHBhY2tldCAqLwotCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOwogCQlidXMtPmdsb21kID0gTlVMTDsKIAkJYnVzLT5uZXh0bGVuID0gMDsKIApAQCAtMzI5MCwxMCArMzI5NSwxMCBAQAogCQlpZiAoREhEX0dMT01fT04oKSkgewogCQkJREhEX0dMT00oKCIlczogdHJ5IHN1cGVyZnJhbWUgcmVhZCwgcGFja2V0IGNoYWluOlxuIiwKIAkJCQlfX2Z1bmNfXykpOwotCQkJZm9yIChwbmV4dCA9IGJ1cy0+Z2xvbTsgcG5leHQ7IHBuZXh0ID0gUEtUTkVYVChwbmV4dCkpIHsKKwkJCWZvciAocG5leHQgPSBidXMtPmdsb207IHBuZXh0OyBwbmV4dCA9IHBuZXh0LT5uZXh0KSB7CiAJCQkJREhEX0dMT00oKCIgICAgJXA6ICVwIGxlbiAweCUwNHggKCVkKVxuIiwKLQkJCQkJICBwbmV4dCwgKHU4ICopIFBLVERBVEEocG5leHQpLAotCQkJCQkgIFBLVExFTihwbmV4dCksIFBLVExFTihwbmV4dCkpKTsKKwkJCQkJICBwbmV4dCwgKHU4ICopIChwbmV4dC0+ZGF0YSksCisJCQkJCSAgcG5leHQtPmxlbiwgcG5leHQtPmxlbikpOwogCQkJfQogCQl9CiAKQEAgLTMzMDksNyArMzMxNCw3IEBACiAJCQkJCQkgICAgICBiY21zZGhfY3VyX3Nid2FkCiAJCQkJCQkgICAgICAoYnVzLT5zZGgpLCBTRElPX0ZVTkNfMiwKIAkJCQkJCSAgICAgIEYyU1lOQywKLQkJCQkJCSAgICAgICh1OCAqKSBQS1REQVRBKHBmaXJzdCksCisJCQkJCQkgICAgICAodTggKikgcGZpcnN0LT5kYXRhLAogCQkJCQkJICAgICAgZGxlbiwgcGZpcnN0LCBOVUxMLCBOVUxMKTsKIAkJfSBlbHNlIGlmIChidXMtPmRhdGFwdHIpIHsKIAkJCWVycmNvZGUgPSBkaGRfYmNtc2RoX3JlY3ZfYnVmKGJ1cywKQEAgLTMzNDYsNyArMzM1MSw3IEBACiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQkJUEtURlJFRShvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKIAkJCQlidXMtPmdsb20gPSBOVUxMOwpAQCAtMzM1NSwxMyArMzM2MCwxMyBAQAogCQl9CiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfR0xPTV9PTigpKSB7Ci0JCQlwcmhleCgiU1VQRVJGUkFNRSIsIFBLVERBVEEocGZpcnN0KSwKLQkJCSAgICAgIG1pbl90KGludCwgUEtUTEVOKHBmaXJzdCksIDQ4KSk7CisJCQlwcmhleCgiU1VQRVJGUkFNRSIsIHBmaXJzdC0+ZGF0YSwKKwkJCSAgICAgIG1pbl90KGludCwgcGZpcnN0LT5sZW4sIDQ4KSk7CiAJCX0KICNlbmRpZgogCiAJCS8qIFZhbGlkYXRlIHRoZSBzdXBlcmZyYW1lIGhlYWRlciAqLwotCQlkcHRyID0gKHU4ICopIFBLVERBVEEocGZpcnN0KTsKKwkJZHB0ciA9ICh1OCAqKSAocGZpcnN0LT5kYXRhKTsKIAkJc3VibGVuID0gbHRvaDE2X3VhKGRwdHIpOwogCQljaGVjayA9IGx0b2gxNl91YShkcHRyICsgc2l6ZW9mKHUxNikpOwogCkBAIC0zMzk5LDExICszNDA0LDExIEBACiAJCQkJICAgX19mdW5jX18pKTsKIAkJCWVycmNvZGUgPSAtMTsKIAkJfSBlbHNlIGlmICgoZG9mZiA8IFNEUENNX0hEUkxFTikgfHwKLQkJCSAgIChkb2ZmID4gKFBLVExFTihwZmlyc3QpIC0gU0RQQ01fSERSTEVOKSkpIHsKKwkJCSAgIChkb2ZmID4gKHBmaXJzdC0+bGVuIC0gU0RQQ01fSERSTEVOKSkpIHsKIAkJCURIRF9FUlJPUigoIiVzIChzdXBlcmZyYW1lKTogQmFkIGRhdGEgb2Zmc2V0ICVkOiBIVyAlZCAiCiAJCQkJInBrdCAlZCBtaW4gJWRcbiIsCiAJCQkJX19mdW5jX18sIGRvZmYsIHN1YmxlbiwKLQkJCQlQS1RMRU4ocGZpcnN0KSwgU0RQQ01fSERSTEVOKSk7CisJCQkJcGZpcnN0LT5sZW4sIFNEUENNX0hEUkxFTikpOwogCQkJZXJyY29kZSA9IC0xOwogCQl9CiAKQEAgLTM0MjQsMTQgKzM0MjksMTQgQEAKIAkJYnVzLT50eF9tYXggPSB0eG1heDsKIAogCQkvKiBSZW1vdmUgc3VwZXJmcmFtZSBoZWFkZXIsIHJlbWVtYmVyIG9mZnNldCAqLwotCQlQS1RQVUxMKHBmaXJzdCwgZG9mZik7CisJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAJCXNmZG9mZiA9IGRvZmY7CiAKIAkJLyogVmFsaWRhdGUgYWxsIHRoZSBzdWJmcmFtZSBoZWFkZXJzICovCiAJCWZvciAobnVtID0gMCwgcG5leHQgPSBwZmlyc3Q7IHBuZXh0ICYmICFlcnJjb2RlOwotCQkgICAgIG51bSsrLCBwbmV4dCA9IFBLVE5FWFQocG5leHQpKSB7Ci0JCQlkcHRyID0gKHU4ICopIFBLVERBVEEocG5leHQpOwotCQkJZGxlbiA9ICh1MTYpIFBLVExFTihwbmV4dCk7CisJCSAgICAgbnVtKyssIHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJCWRwdHIgPSAodTggKikgKHBuZXh0LT5kYXRhKTsKKwkJCWRsZW4gPSAodTE2KSAocG5leHQtPmxlbik7CiAJCQlzdWJsZW4gPSBsdG9oMTZfdWEoZHB0cik7CiAJCQljaGVjayA9IGx0b2gxNl91YShkcHRyICsgc2l6ZW9mKHUxNikpOwogCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwpAQCAtMzQ2OSwxMyArMzQ3NCwxMyBAQAogCQkJCSBhIGNvdXBsZSByZXRyaWVzICovCiAJCQlpZiAoYnVzLT5nbG9tZXJyKysgPCAzKSB7CiAJCQkJLyogUmVzdG9yZSBzdXBlcmZyYW1lIGhlYWRlciBzcGFjZSAqLwotCQkJCVBLVFBVU0gocGZpcnN0LCBzZmRvZmYpOworCQkJCXNrYl9wdXNoKHBmaXJzdCwgc2Zkb2ZmKTsKIAkJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIHRydWUpOwogCQkJfSBlbHNlIHsKIAkJCQlidXMtPmdsb21lcnIgPSAwOwogCQkJCWRoZHNkaW9fcnhmYWlsKGJ1cywgdHJ1ZSwgZmFsc2UpOwogCQkJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKLQkJCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOwogCQkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwogCQkJCWJ1cy0+Z2xvbSA9IE5VTEw7CkBAIC0zNDkxLDEwICszNDk2LDEwIEBACiAKIAkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwogCQlmb3IgKG51bSA9IDA7IHBmaXJzdDsgcnhzZXErKywgcGZpcnN0ID0gcG5leHQpIHsKLQkJCXBuZXh0ID0gUEtUTkVYVChwZmlyc3QpOwotCQkJUEtUU0VUTkVYVChwZmlyc3QsIE5VTEwpOworCQkJcG5leHQgPSBwZmlyc3QtPm5leHQ7CisJCQlwZmlyc3QtPm5leHQgPSBOVUxMOwogCi0JCQlkcHRyID0gKHU4ICopIFBLVERBVEEocGZpcnN0KTsKKwkJCWRwdHIgPSAodTggKikgKHBmaXJzdC0+ZGF0YSk7CiAJCQlzdWJsZW4gPSBsdG9oMTZfdWEoZHB0cik7CiAJCQljaGFuID0gU0RQQ01fUEFDS0VUX0NIQU5ORUwoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7CiAJCQlzZXEgPSBTRFBDTV9QQUNLRVRfU0VRVUVOQ0UoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7CkBAIC0zNTAyLDggKzM1MDcsOCBAQAogCiAJCQlESERfR0xPTSgoIiVzOiBHZXQgc3ViZnJhbWUgJWQsICVwKCVwLyVkKSwgc3VibGVuICVkICIKIAkJCQkiY2hhbiAlZCBzZXEgJWRcbiIsCi0JCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBQS1REQVRBKHBmaXJzdCksCi0JCQkJUEtUTEVOKHBmaXJzdCksIHN1YmxlbiwgY2hhbiwgc2VxKSk7CisJCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCisJCQkJcGZpcnN0LT5sZW4sIHN1YmxlbiwgY2hhbiwgc2VxKSk7CiAKIAkJCUFTU0VSVCgoY2hhbiA9PSBTRFBDTV9EQVRBX0NIQU5ORUwpCiAJCQkgICAgICAgfHwgKGNoYW4gPT0gU0RQQ01fRVZFTlRfQ0hBTk5FTCkpOwpAQCAtMzUxOSwxMyArMzUyNCwxMyBAQAogCQkJCXByaGV4KCJSeCBTdWJmcmFtZSBEYXRhIiwgZHB0ciwgZGxlbik7CiAjZW5kaWYKIAotCQkJUEtUU0VUTEVOKHBmaXJzdCwgc3VibGVuKTsKLQkJCVBLVFBVTEwocGZpcnN0LCBkb2ZmKTsKKwkJCV9fc2tiX3RyaW0ocGZpcnN0LCBzdWJsZW4pOworCQkJc2tiX3B1bGwocGZpcnN0LCBkb2ZmKTsKIAotCQkJaWYgKFBLVExFTihwZmlyc3QpID09IDApIHsKLQkJCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBmaXJzdCwgZmFsc2UpOworCQkJaWYgKHBmaXJzdC0+bGVuID09IDApIHsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBmaXJzdCwgZmFsc2UpOwogCQkJCWlmIChwbGFzdCkgewotCQkJCQlQS1RTRVRORVhUKHBsYXN0LCBwbmV4dCk7CisJCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7CiAJCQkJfSBlbHNlIHsKIAkJCQkJQVNTRVJUKHNhdmVfcGZpcnN0ID09IHBmaXJzdCk7CiAJCQkJCXNhdmVfcGZpcnN0ID0gcG5leHQ7CkBAIC0zNTM2LDkgKzM1NDEsOSBAQAogCQkJCURIRF9FUlJPUigoIiVzOiByeCBwcm90b2NvbCBlcnJvclxuIiwKIAkJCQkJICAgX19mdW5jX18pKTsKIAkJCQlidXMtPmRoZC0+cnhfZXJyb3JzKys7Ci0JCQkJUEtURlJFRShvc2gsIHBmaXJzdCwgZmFsc2UpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwZmlyc3QsIGZhbHNlKTsKIAkJCQlpZiAocGxhc3QpIHsKLQkJCQkJUEtUU0VUTkVYVChwbGFzdCwgcG5leHQpOworCQkJCQlwbGFzdC0+bmV4dCA9IHBuZXh0OwogCQkJCX0gZWxzZSB7CiAJCQkJCUFTU0VSVChzYXZlX3BmaXJzdCA9PSBwZmlyc3QpOwogCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwpAQCAtMzU0OCw3ICszNTUzLDcgQEAKIAogCQkJLyogdGhpcyBwYWNrZXQgd2lsbCBnbyB1cCwgbGluayBiYWNrIGludG8KIAkJCQkgY2hhaW4gYW5kIGNvdW50IGl0ICovCi0JCQlQS1RTRVRORVhUKHBmaXJzdCwgcG5leHQpOworCQkJcGZpcnN0LT5uZXh0ID0gcG5leHQ7CiAJCQlwbGFzdCA9IHBmaXJzdDsKIAkJCW51bSsrOwogCkBAIC0zNTU2LDExICszNTYxLDExIEBACiAJCQlpZiAoREhEX0dMT01fT04oKSkgewogCQkJCURIRF9HTE9NKCgiJXMgc3ViZnJhbWUgJWQgdG8gc3RhY2ssICVwKCVwLyVkKSAiCiAJCQkJIm54dC9sbmsgJXAvJXBcbiIsCi0JCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBQS1REQVRBKHBmaXJzdCksCi0JCQkJUEtUTEVOKHBmaXJzdCksIFBLVE5FWFQocGZpcnN0KSwKLQkJCQlQS1RMSU5LKHBmaXJzdCkpKTsKLQkJCQlwcmhleCgiIiwgKHU4ICopIFBLVERBVEEocGZpcnN0KSwKLQkJCQkgICAgICBtaW5fdChpbnQsIFBLVExFTihwZmlyc3QpLCAzMikpOworCQkJCV9fZnVuY19fLCBudW0sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAorCQkJCXBmaXJzdC0+bGVuLCBwZmlyc3QtPm5leHQsCisJCQkJcGZpcnN0LT5wcmV2KSk7CisJCQkJcHJoZXgoIiIsICh1OCAqKSBwZmlyc3QtPmRhdGEsCisJCQkJICAgICAgbWluX3QoaW50LCBwZmlyc3QtPmxlbiwgMzIpKTsKIAkJCX0KICNlbmRpZgkJCQkvKiBESERfREVCVUcgKi8KIAkJfQpAQCAtMzU4MCw3ICszNTg1LDcgQEAKIC8qIFJldHVybiB0cnVlIGlmIHRoZXJlIG1heSBiZSBtb3JlIGZyYW1lcyB0byByZWFkICovCiBzdGF0aWMgdWludCBkaGRzZGlvX3JlYWRmcmFtZXMoZGhkX2J1c190ICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKIHsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJYmNtc2RoX2luZm9fdCAqc2RoID0gYnVzLT5zZGg7CiAKIAl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KQEAgLTM1ODgsNyArMzU5Myw3IEBACiAJdTggZmNiaXRzOwkJLyogRXh0cmFjdGVkIGZjYml0cyBmcm9tIHNvZnR3YXJlIGhlYWRlciAqLwogCXU4IGRlbHRhOwogCi0Jdm9pZCAqcGt0OwkJLyogUGFja2V0IGZvciBldmVudCBvciBkYXRhIGZyYW1lcyAqLworCXN0cnVjdCBza19idWZmICpwa3Q7CQkvKiBQYWNrZXQgZm9yIGV2ZW50IG9yIGRhdGEgZnJhbWVzICovCiAJdTE2IHBhZDsJCS8qIE51bWJlciBvZiBwYWQgYnl0ZXMgdG8gcmVhZCAqLwogCXUxNiByZGxlbjsJCS8qIFRvdGFsIG51bWJlciBvZiBieXRlcyB0byByZWFkICovCiAJdTggcnhzZXE7CQkvKiBOZXh0IHNlcXVlbmNlIG51bWJlciB0byBleHBlY3QgKi8KQEAgLTM2NzUsNyArMzY4MCw3IEBACiAJCQkgKi8KIAkJCS8qIEFsbG9jYXRlIGEgcGFja2V0IGJ1ZmZlciAqLwogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJcGt0ID0gUEtUR0VUKG9zaCwgcmRsZW4gKyBESERfU0RBTElHTiwgZmFsc2UpOworCQkJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgcmRsZW4gKyBESERfU0RBTElHTik7CiAJCQlpZiAoIXBrdCkgewogCQkJCWlmIChidXMtPmJ1cyA9PSBTUElfQlVTKSB7CiAJCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IGZhbHNlOwpAQCAtMzcyMSw3ICszNzI2LDcgQEAKIAkJCQl9IGVsc2UgewogCQkJCQkvKiBHaXZlIHVwIG9uIGRhdGEsCiAJCQkJCXJlcXVlc3QgcnR4IG9mIGV2ZW50cyAqLwotCQkJCQlESERfRVJST1IoKCIlcyAobmV4dGxlbik6IFBLVEdFVCBmYWlsZWQ6IGxlbiAlZCByZGxlbiAlZCAiICJleHBlY3RlZCByeHNlcSAlZFxuIiwKKwkJCQkJREhEX0VSUk9SKCgiJXMgKG5leHRsZW4pOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWQgcmRsZW4gJWQgIiAiZXhwZWN0ZWQgcnhzZXEgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgbGVuLCByZGxlbiwgcnhzZXEpKTsKIAkJCQkJLyogSnVzdCBnbyB0cnkgYWdhaW4gdy9ub3JtYWwKIAkJCQkJaGVhZGVyIHJlYWQgKi8KQEAgLTM3MzIsOSArMzczNyw5IEBACiAJCQkJaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpCiAJCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IHRydWU7CiAKLQkJCQlBU1NFUlQoIVBLVExJTksocGt0KSk7CisJCQkJQVNTRVJUKCEocGt0LT5wcmV2KSk7CiAJCQkJUEtUQUxJR04ob3NoLCBwa3QsIHJkbGVuLCBESERfU0RBTElHTik7Ci0JCQkJcnhidWYgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJCXJ4YnVmID0gKHU4ICopIChwa3QtPmRhdGEpOwogCQkJCS8qIFJlYWQgdGhlIGVudGlyZSBmcmFtZSAqLwogCQkJCXNkcmV0ID0KIAkJCQkgICAgZGhkX2JjbXNkaF9yZWN2X2J1ZihidXMsCkBAIC0zNzQ4LDcgKzM3NTMsNyBAQAogCQkJCWlmIChzZHJldCA8IDApIHsKIAkJCQkJREhEX0VSUk9SKCgiJXMgKG5leHRsZW4pOiByZWFkICVkIGJ5dGVzIGZhaWxlZDogJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgcmRsZW4sIHNkcmV0KSk7Ci0JCQkJCVBLVEZSRUUoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CisJCQkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQkJCWJ1cy0+ZGhkLT5yeF9lcnJvcnMrKzsKIAkJCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAJCQkJCS8qIEZvcmNlIHJldHJ5IHcvbm9ybWFsIGhlYWRlciByZWFkLgpAQCAtMzg5Niw3ICszOTAxLDcgQEAKIAkJCQkJCQkgICAgIGRvZmYpOwogCQkJCQlpZiAoYnVzLT51c2VidWZwb29sKSB7CiAJCQkJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQkJCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBrdCwKKwkJCQkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LAogCQkJCQkJCWZhbHNlKTsKIAkJCQkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJCQl9CkBAIC00MDg2LDEwICs0MDkxLDEwIEBACiAJCX0KIAogCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCXBrdCA9IFBLVEdFVChvc2gsIChyZGxlbiArIGZpcnN0cmVhZCArIERIRF9TREFMSUdOKSwgZmFsc2UpOworCQlwa3QgPSBwa3RfYnVmX2dldF9za2Iob3NoLCAocmRsZW4gKyBmaXJzdHJlYWQgKyBESERfU0RBTElHTikpOwogCQlpZiAoIXBrdCkgewogCQkJLyogR2l2ZSB1cCBvbiBkYXRhLCByZXF1ZXN0IHJ0eCBvZiBldmVudHMgKi8KLQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkOiByZGxlbiAlZCBjaGFuICVkXG4iLAorCQkJREhEX0VSUk9SKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IHJkbGVuICVkIGNoYW4gJWRcbiIsCiAJCQkJICAgX19mdW5jX18sIHJkbGVuLCBjaGFuKSk7CiAJCQlidXMtPmRoZC0+cnhfZHJvcHBlZCsrOwogCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CkBAIC00MDk4LDE3ICs0MTAzLDE3IEBACiAJCX0KIAkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAKLQkJQVNTRVJUKCFQS1RMSU5LKHBrdCkpOworCQlBU1NFUlQoIShwa3QtPnByZXYpKTsKIAogCQkvKiBMZWF2ZSByb29tIGZvciB3aGF0IHdlIGFscmVhZHkgcmVhZCwgYW5kIGFsaWduIHJlbWFpbmRlciAqLwotCQlBU1NFUlQoZmlyc3RyZWFkIDwgKFBLVExFTihwa3QpKSk7Ci0JCVBLVFBVTEwocGt0LCBmaXJzdHJlYWQpOworCQlBU1NFUlQoZmlyc3RyZWFkIDwgcGt0LT5sZW4pOworCQlza2JfcHVsbChwa3QsIGZpcnN0cmVhZCk7CiAJCVBLVEFMSUdOKG9zaCwgcGt0LCByZGxlbiwgREhEX1NEQUxJR04pOwogCiAJCS8qIFJlYWQgdGhlIHJlbWFpbmluZyBmcmFtZSBkYXRhICovCiAJCXNkcmV0ID0KIAkJICAgIGRoZF9iY21zZGhfcmVjdl9idWYoYnVzLCBiY21zZGhfY3VyX3Nid2FkKHNkaCksIFNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsICgodTggKikgUEtUREFUQShwa3QpKSwgcmRsZW4sCisJCQkJCUYyU1lOQywgKCh1OCAqKSAocGt0LT5kYXRhKSksIHJkbGVuLAogCQkJCQlwa3QsIE5VTEwsIE5VTEwpOwogCQlidXMtPmYycnhkYXRhKys7CiAJCUFTU0VSVChzZHJldCAhPSBCQ01FX1BFTkRJTkcpOwpAQCAtNDEyMiw3ICs0MTI3LDcgQEAKIAkJCQkgICAgICAgPyAiZGF0YSIgOiAidGVzdCIpKSwKIAkJCQkgICBzZHJldCkpOwogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCWJ1cy0+ZGhkLT5yeF9lcnJvcnMrKzsKIAkJCWRoZHNkaW9fcnhmYWlsKGJ1cywgdHJ1ZSwgUkVUUllDSEFOKGNoYW4pKTsKQEAgLTQxMzAsMTIgKzQxMzUsMTIgQEAKIAkJfQogCiAJCS8qIENvcHkgdGhlIGFscmVhZHktcmVhZCBwb3J0aW9uICovCi0JCVBLVFBVU0gocGt0LCBmaXJzdHJlYWQpOwotCQliY29weShidXMtPnJ4aGRyLCBQS1REQVRBKHBrdCksIGZpcnN0cmVhZCk7CisJCXNrYl9wdXNoKHBrdCwgZmlyc3RyZWFkKTsKKwkJYmNvcHkoYnVzLT5yeGhkciwgcGt0LT5kYXRhLCBmaXJzdHJlYWQpOwogCiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfQllURVNfT04oKSAmJiBESERfREFUQV9PTigpKQotCQkJcHJoZXgoIlJ4IERhdGEiLCBQS1REQVRBKHBrdCksIGxlbik7CisJCQlwcmhleCgiUnggRGF0YSIsIHBrdC0+ZGF0YSwgbGVuKTsKICNlbmRpZgogCiBkZWxpdmVyOgpAQCAtNDE0NiwxMiArNDE1MSwxMiBAQAogCQkJCQlfX2Z1bmNfXywgbGVuKSk7CiAjaWZkZWYgREhEX0RFQlVHCiAJCQkJaWYgKERIRF9HTE9NX09OKCkpIHsKLQkJCQkJcHJoZXgoIkdsb20gRGF0YSIsIFBLVERBVEEocGt0KSwgbGVuKTsKKwkJCQkJcHJoZXgoIkdsb20gRGF0YSIsIHBrdC0+ZGF0YSwgbGVuKTsKIAkJCQl9CiAjZW5kaWYKLQkJCQlQS1RTRVRMRU4ocGt0LCBsZW4pOworCQkJCV9fc2tiX3RyaW0ocGt0LCBsZW4pOwogCQkJCUFTU0VSVChkb2ZmID09IFNEUENNX0hEUkxFTik7Ci0JCQkJUEtUUFVMTChwa3QsIFNEUENNX0hEUkxFTik7CisJCQkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwogCQkJCWJ1cy0+Z2xvbWQgPSBwa3Q7CiAJCQl9IGVsc2UgewogCQkJCURIRF9FUlJPUigoIiVzOiBnbG9tIHN1cGVyZnJhbWUgdy9vICIKQEAgLTQxNjIsOCArNDE2Nyw4IEBACiAJCX0KIAogCQkvKiBGaWxsIGluIHBhY2tldCBsZW4gYW5kIHByaW8sIGRlbGl2ZXIgdXB3YXJkICovCi0JCVBLVFNFVExFTihwa3QsIGxlbik7Ci0JCVBLVFBVTEwocGt0LCBkb2ZmKTsKKwkJX19za2JfdHJpbShwa3QsIGxlbik7CisJCXNrYl9wdWxsKHBrdCwgZG9mZik7CiAKICNpZmRlZiBTRFRFU1QKIAkJLyogVGVzdCBjaGFubmVsIHBhY2tldHMgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5ICovCkBAIC00MTczLDE1ICs0MTc4LDE1IEBACiAJCX0KICNlbmRpZgkJCQkvKiBTRFRFU1QgKi8KIAotCQlpZiAoUEtUTEVOKHBrdCkgPT0gMCkgeworCQlpZiAocGt0LT5sZW4gPT0gMCkgewogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKGRoZF9wcm90X2hkcnB1bGwoYnVzLT5kaGQsICZpZmlkeCwgcGt0KSAhPSAwKSB7CiAJCQlESERfRVJST1IoKCIlczogcnggcHJvdG9jb2wgZXJyb3JcbiIsIF9fZnVuY19fKSk7CiAJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKIAkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJYnVzLT5kaGQtPnJ4X2Vycm9ycysrOwogCQkJY29udGludWU7CkBAIC00NjI2LDExICs0NjMxLDExIEBACiAKIHN0YXRpYyB2b2lkIGRoZHNkaW9fcGt0Z2VuKGRoZF9idXNfdCAqYnVzKQogewotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXU4ICpkYXRhOwogCXVpbnQgcGt0Y291bnQ7CiAJdWludCBmaWxsYnl0ZTsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJdTE2IGxlbjsKIAogCS8qIERpc3BsYXkgY3VycmVudCBjb3VudCBpZiBhcHByb3ByaWF0ZSAqLwpAQCAtNDY1OCwxNiArNDY2MywxNiBAQAogCiAJCS8qIEFsbG9jYXRlIGFuIGFwcHJvcHJpYXRlLXNpemVkIHBhY2tldCAqLwogCQlsZW4gPSBidXMtPnBrdGdlbl9sZW47Ci0JCXBrdCA9IFBLVEdFVChvc2gsCisJCXBrdCA9IHBrdF9idWZfZ2V0X3NrYihvc2gsCiAJCQkobGVuICsgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4gKyBESERfU0RBTElHTiksCiAJCQl0cnVlKTsKIAkJaWYgKCFwa3QpIHsKLQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKKwkJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKIAkJCWJyZWFrOwogCQl9CiAJCVBLVEFMSUdOKG9zaCwgcGt0LCAobGVuICsgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4pLAogCQkJIERIRF9TREFMSUdOKTsKLQkJZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdCkgKyBTRFBDTV9IRFJMRU47CisJCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47CiAKIAkJLyogV3JpdGUgdGVzdCBoZWFkZXIgY21kIGFuZCBleHRyYSBiYXNlZCBvbiBtb2RlICovCiAJCXN3aXRjaCAoYnVzLT5wa3RnZW5fbW9kZSkgewpAQCAtNDY4OSw3ICs0Njk0LDcgQEAKIAkJZGVmYXVsdDoKIAkJCURIRF9FUlJPUigoIlVucmVjb2duaXplZCBwa3RnZW4gbW9kZSAlZFxuIiwKIAkJCQkgICBidXMtPnBrdGdlbl9tb2RlKSk7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCB0cnVlKTsKKwkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIHRydWUpOwogCQkJYnVzLT5wa3RnZW5fY291bnQgPSAwOwogCQkJcmV0dXJuOwogCQl9CkBAIC00NzA2LDkgKzQ3MTEsOSBAQAogCiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfQllURVNfT04oKSAmJiBESERfREFUQV9PTigpKSB7Ci0JCQlkYXRhID0gKHU4ICopIFBLVERBVEEocGt0KSArIFNEUENNX0hEUkxFTjsKKwkJCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47CiAJCQlwcmhleCgiZGhkc2Rpb19wa3RnZW46IFR4IERhdGEiLCBkYXRhLAotCQkJICAgICAgUEtUTEVOKHBrdCkgLSBTRFBDTV9IRFJMRU4pOworCQkJICAgICAgcGt0LT5sZW4gLSBTRFBDTV9IRFJMRU4pOwogCQl9CiAjZW5kaWYKIApAQCAtNDczMywxOSArNDczOCwxOSBAQAogCiBzdGF0aWMgdm9pZCBkaGRzZGlvX3NkdGVzdF9zZXQoZGhkX2J1c190ICpidXMsIGJvb2wgc3RhcnQpCiB7Ci0Jdm9pZCAqcGt0OworCXN0cnVjdCBza19idWZmICpwa3Q7CiAJdTggKmRhdGE7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCiAJLyogQWxsb2NhdGUgdGhlIHBhY2tldCAqLwotCXBrdCA9IFBLVEdFVChvc2gsIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOICsgREhEX1NEQUxJR04sCisJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4gKyBESERfU0RBTElHTiwKIAkJCXRydWUpOwogCWlmICghcGt0KSB7Ci0JCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKKwkJREhEX0VSUk9SKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQhXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCVBLVEFMSUdOKG9zaCwgcGt0LCAoU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4pLCBESERfU0RBTElHTik7Ci0JZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdCkgKyBTRFBDTV9IRFJMRU47CisJZGF0YSA9ICh1OCAqKSAocGt0LT5kYXRhKSArIFNEUENNX0hEUkxFTjsKIAogCS8qIEZpbGwgaW4gdGhlIHRlc3QgaGVhZGVyICovCiAJKmRhdGErKyA9IFNEUENNX1RFU1RfU0VORDsKQEAgLTQ3NTgsOSArNDc2Myw5IEBACiAJCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKIH0KIAotc3RhdGljIHZvaWQgZGhkc2Rpb190ZXN0cmN2KGRoZF9idXNfdCAqYnVzLCB2b2lkICpwa3QsIHVpbnQgc2VxKQorc3RhdGljIHZvaWQgZGhkc2Rpb190ZXN0cmN2KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IHNlcSkKIHsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJdTggKmRhdGE7CiAJdWludCBwa3RsZW47CiAKQEAgLTQ3NzAsMTYgKzQ3NzUsMTYgQEAKIAl1MTYgb2Zmc2V0OwogCiAJLyogQ2hlY2sgZm9yIG1pbiBsZW5ndGggKi8KLQlwa3RsZW4gPSBQS1RMRU4ocGt0KTsKKwlwa3RsZW4gPSBwa3QtPmxlbjsKIAlpZiAocGt0bGVuIDwgU0RQQ01fVEVTVF9IRFJMRU4pIHsKIAkJREhEX0VSUk9SKCgiZGhkc2Rpb19yZXN0cmN2OiB0b3NzIHJ1bnQgZnJhbWUsIHBrdGxlbiAlZFxuIiwKIAkJCSAgIHBrdGxlbikpOwotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIEV4dHJhY3QgaGVhZGVyIGZpZWxkcyAqLwotCWRhdGEgPSBQS1REQVRBKHBrdCk7CisJZGF0YSA9IHBrdC0+ZGF0YTsKIAljbWQgPSAqZGF0YSsrOwogCWV4dHJhID0gKmRhdGErKzsKIAlsZW4gPSAqZGF0YSsrOwpAQCAtNDc5Miw3ICs0Nzk3LDcgQEAKIAkJCURIRF9FUlJPUigoImRoZHNkaW9fdGVzdHJjdjogZnJhbWUgbGVuZ3RoIG1pc21hdGNoLCAiCiAJCQkJInBrdGxlbiAlZCBzZXEgJWQiICIgY21kICVkIGV4dHJhICVkIGxlbiAlZFxuIiwKIAkJCQlwa3RsZW4sIHNlcSwgY21kLCBleHRyYSwgbGVuKSk7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC00ODAyLDE5ICs0ODA3LDE5IEBACiAJY2FzZSBTRFBDTV9URVNUX0VDSE9SRVE6CiAJCS8qIFJ4LT5UeCB0dXJuYXJvdW5kIG9rIChldmVuIG9uIE5ESVMgdy9jdXJyZW50CiAJCQkgaW1wbGVtZW50YXRpb24pICovCi0JCSoodTggKikgKFBLVERBVEEocGt0KSkgPSBTRFBDTV9URVNUX0VDSE9SU1A7CisJCSoodTggKikgKHBrdC0+ZGF0YSkgPSBTRFBDTV9URVNUX0VDSE9SU1A7CiAJCWlmIChkaGRzZGlvX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9URVNUX0NIQU5ORUwsIHRydWUpID09IDApIHsKIAkJCWJ1cy0+cGt0Z2VuX3NlbnQrKzsKIAkJfSBlbHNlIHsKIAkJCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKLQkJCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJfQogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCiAJY2FzZSBTRFBDTV9URVNUX0VDSE9SU1A6CiAJCWlmIChidXMtPmV4dF9sb29wKSB7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCQlicmVhazsKIAkJfQpAQCAtNDgyNywxMiArNDgzMiwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCiAJY2FzZSBTRFBDTV9URVNUX0RJU0NBUkQ6Ci0JCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCkBAIC00ODQyLDcgKzQ4NDcsNyBAQAogCQlESERfSU5GTygoImRoZHNkaW9fdGVzdHJjdjogdW5zdXBwb3J0ZWQgb3IgdW5rbm93biBjb21tYW5kLCAiCiAJCQkicGt0bGVuICVkIHNlcSAlZCIgIiBjbWQgJWQgZXh0cmEgJWQgbGVuICVkXG4iLAogCQkJcGt0bGVuLCBzZXEsIGNtZCwgZXh0cmEsIGxlbikpOwotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00OTYwLDcgKzQ5NjUsNyBAQAogCWRoZF9idXNfdCAqYnVzID0gZGhkcC0+YnVzOwogCXUzMiBhZGRyLCB2YWw7CiAJaW50IHJ2OwotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCiAJLyogQWRkcmVzcyBjb3VsZCBiZSB6ZXJvIGlmIENPTlNPTEUgOj0gMCBpbiBkb25nbGUgTWFrZWZpbGUgKi8KIAlpZiAoYnVzLT5jb25zb2xlX2FkZHIgPT0gMCkKQEAgLTUwMDMsNyArNTAwOCw3IEBACiAJLyogQnVtcCBkb25nbGUgYnkgc2VuZGluZyBhbiBlbXB0eSBldmVudCBwa3QuCiAJICogc2RwY21fc2VuZHVwIChSWCkgY2hlY2tzIGZvciB2aXJ0dWFsIGNvbnNvbGUgaW5wdXQuCiAJICovCi0JcGt0ID0gUEtUR0VUKGJ1cy0+ZGhkLT5vc2gsIDQgKyBTRFBDTV9SRVNFUlZFLCB0cnVlKTsKKwlwa3QgPSBwa3RfYnVmX2dldF9za2IoYnVzLT5kaGQtPm9zaCwgNCArIFNEUENNX1JFU0VSVkUpOwogCWlmICgocGt0ICE9IE5VTEwpICYmIGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKQogCQlkaGRzZGlvX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9FVkVOVF9DSEFOTkVMLCB0cnVlKTsKIApAQCAtNTA2MSw3ICs1MDY2LDcgQEAKIAogc3RhdGljIHZvaWQgKmRoZHNkaW9fcHJvYmUodTE2IHZlbmlkLCB1MTYgZGV2aWQsIHUxNiBidXNfbm8sCiAJCQkgICB1MTYgc2xvdCwgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdm9pZCAqcmVnc3ZhLAotCQkJICAgb3NsX3QgKm9zaCwgdm9pZCAqc2RoKQorCQkJICAgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlpbnQgcmV0OwogCWRoZF9idXNfdCAqYnVzOwpAQCAtNTIyMCw4ICs1MjI1LDggQEAKIH0KIAogc3RhdGljIGJvb2wKLWRoZHNkaW9fcHJvYmVfYXR0YWNoKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCwgdm9pZCAqcmVnc3ZhLAotCQkgICAgIHUxNiBkZXZpZCkKK2RoZHNkaW9fcHJvYmVfYXR0YWNoKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgsCisJCQl2b2lkICpyZWdzdmEsIHUxNiBkZXZpZCkKIHsKIAl1OCBjbGtjdGwgPSAwOwogCWludCBlcnIgPSAwOwpAQCAtNTI4MCw3ICs1Mjg1LDcgQEAKIAkJCQkJImZhaWxlZFxuIiwgZm4pKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWJ6ZXJvKGNpc1tmbl0sIFNCU0RJT19DSVNfU0laRV9MSU1JVCk7CisJCQltZW1zZXQoY2lzW2ZuXSwgMCwgU0JTRElPX0NJU19TSVpFX0xJTUlUKTsKIAogCQkJZXJyID0gYmNtc2RoX2Npc19yZWFkKHNkaCwgZm4sIGNpc1tmbl0sCiAJCQkJCQlTQlNESU9fQ0lTX1NJWkVfTElNSVQpOwpAQCAtNTM3OCw3ICs1MzgzLDggQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpCitzdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX21hbGxvYyhkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkJIHZvaWQgKnNkaCkKIHsKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTU0MTksNyArNTQyNSw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2luaXQoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK3N0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfaW5pdChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlzMzIgZm51bTsKIApAQCAtNTQ5Niw3ICs1NTAyLDcgQEAKIH0KIAogYm9vbAotZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqb3NoLAorZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCSAgY2hhciAqZndfcGF0aCwgY2hhciAqbnZfcGF0aCkKIHsKIAlib29sIHJldDsKQEAgLTU1MDksNyArNTUxNSw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1kaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK2RoZHNkaW9fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGRoZF9idXMgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlib29sIHJldDsKIApAQCAtNTUyNCw3ICs1NTMwLDcgQEAKIH0KIAogLyogRGV0YWNoIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKm9zaCkKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01NTU0LDcgKzU1NjAsNyBAQAogCURIRF9UUkFDRSgoIiVzOiBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gpCitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTU1NzMsNyArNTU3OSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfZG9uZ2xlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKQorc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX2RvbmdsZShkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01OTg2LDcgKzU5OTIsNyBAQAogCiBzdGF0aWMgaW50CiBkaGRfYmNtc2RoX3JlY3ZfYnVmKGRoZF9idXNfdCAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCisJCSAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJICAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpCiB7CiAJaW50IHN0YXR1czsKQEAgLTYwMDAsNyArNjAwNiw3IEBACiAKIHN0YXRpYyBpbnQKIGRoZF9iY21zZGhfc2VuZF9idWYoZGhkX2J1c190ICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLCB1aW50IGZsYWdzLAotCQkgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKKwkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAogCQkgICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSkKIHsKIAlyZXR1cm4gYmNtc2RoX3NlbmRfYnVmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMKaW5kZXggZWEwODI1Mi4uOTkxNDYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwpAQCAtMTYsNyArMTYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KICNpbmNsdWRlIDxvc2wuaD4KIAogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CkBAIC0zMCwxMCArMjksNiBAQAogI2luY2x1ZGUgPGRoZGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCi0jaW5jbHVkZSA8cHJvdG8vZXRoZXJuZXQuaD4KLSNpbmNsdWRlIDxkbmdsX3N0YXRzLmg+Ci0jaW5jbHVkZSA8ZGhkLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM0Miw3ICszMzcsNyBAQAogCXN0cnVjdCB3bF9pZmFjZSAqY2k7CQkJCQkJXAogCWlmICh1bmxpa2VseSghKHdsX2NmZzgwMjExX2RldiAmJiAJCQkJXAogCQkoY2kgPSB3bF9nZXRfZHJ2ZGF0YSh3bF9jZmc4MDIxMV9kZXYpKSkpKSB7CQlcCi0JCVdMX0VSUigoIndsX2NmZzgwMjExX2RldiBpcyB1bmF2YWlsYWJsZVxuIikpOwkJXAorCQlXTF9FUlIoIndsX2NmZzgwMjExX2RldiBpcyB1bmF2YWlsYWJsZVxuIik7CQlcCiAJCUJVRygpOwkJCQkJCQlcCiAJfSAJCQkJCQkJCVwKIAljaV90b193bChjaSk7CQkJCQkJCVwKQEAgLTM1Miw4ICszNDcsOCBAQAogZG8gewkJCQkJCQkJCVwKIAlzdHJ1Y3Qgd2xfcHJpdiAqd2wgPSB3aXBoeV90b193bCh3aXBoeSk7CQkJXAogCWlmICh1bmxpa2VseSghdGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmd2wtPnN0YXR1cykpKSB7CVwKLQkJV0xfSU5GTygoImRldmljZSBpcyBub3QgcmVhZHkgOiBzdGF0dXMgKCVkKVxuIiwJCVwKLQkJCShpbnQpd2wtPnN0YXR1cykpOwkJCQlcCisJCVdMX0lORk8oImRldmljZSBpcyBub3QgcmVhZHkgOiBzdGF0dXMgKCVkKVxuIiwJCVwKKwkJCShpbnQpd2wtPnN0YXR1cyk7CQkJCVwKIAkJcmV0dXJuIC1FSU87CQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC02MTgsOCArNjEzLDggQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6Ci0JCVdMX0VSUigoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIHR5cGVcbiIsCi0JCQl0eXBlKSk7CisJCVdMX0VSUigidHlwZSAoJWQpIDogY3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgdHlwZVxuIiwKKwkJICAgICAgIHR5cGUpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJd2wtPmNvbmYtPm1vZGUgPSBXTF9NT0RFX0lCU1M7CkBAIC02MzUsMTUgKzYzMCwxNSBAQAogCWFwID0gaHRvZDMyKGFwKTsKIAl3ZGV2ID0gbmRldi0+aWVlZTgwMjExX3B0cjsKIAl3ZGV2LT5pZnR5cGUgPSB0eXBlOwotCVdMX0RCRygoIiVzIDogYXAgKCVkKSwgaW5mcmEgKCVkKVxuIiwgbmRldi0+bmFtZSwgYXAsIGluZnJhKSk7CisJV0xfREJHKCIlcyA6IGFwICglZCksIGluZnJhICglZClcbiIsIG5kZXYtPm5hbWUsIGFwLCBpbmZyYSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0lORlJBIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0FQLCAmYXAsIHNpemVvZihhcCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjUzLDcgKzY0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHdsX2lzY2FuX3ByZXAoc3RydWN0IHdsX3NjYW5fcGFyYW1zICpwYXJhbXMsIHN0cnVjdCB3bGNfc3NpZCAqc3NpZCkKIHsKLQltZW1jcHkoJnBhcmFtcy0+YnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmcGFyYW1zLT5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhfQUxFTik7CiAJcGFyYW1zLT5ic3NfdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOwogCXBhcmFtcy0+c2Nhbl90eXBlID0gMDsKIAlwYXJhbXMtPm5wcm9iZXMgPSAtMTsKQEAgLTcwNSw3ICs3MDAsNyBAQAogCiAJaWYgKHNzaWQgJiYgc3NpZC0+U1NJRF9sZW4pCiAJCXBhcmFtc19zaXplICs9IHNpemVvZihzdHJ1Y3Qgd2xjX3NzaWQpOwotCXBhcmFtcyA9IChzdHJ1Y3Qgd2xfaXNjYW5fcGFyYW1zICopa3phbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcGFyYW1zID0ga3phbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCFwYXJhbXMpKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQocGFyYW1zLCAwLCBwYXJhbXNfc2l6ZSk7CkBAIC03MjIsOSArNzE3LDkgQEAKIAkJCQlpc2Nhbi0+aW9jdGxfYnVmLCBXTENfSU9DVExfU01MRU4pOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCQlXTF9JTkZPKCgic3lzdGVtIGJ1c3kgOiBpc2NhbiBjYW5jZWxlZFxuIikpOworCQkJV0xfSU5GTygic3lzdGVtIGJ1c3kgOiBpc2NhbiBjYW5jZWxlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCX0KIAlrZnJlZShwYXJhbXMpOwpAQCAtNzQ4LDcgKzc0Myw3IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKHdsX3RvX25kZXYod2wpLCBXTENfU0VUX1BBU1NJVkVfU0NBTiwKIAkJCSZwYXNzaXZlX3NjYW4sIHNpemVvZihwYXNzaXZlX3NjYW4pKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9EQkcoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfREJHKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3bF9zZXRfbXBjKG5kZXYsIDApOwpAQCAtNzc0LDEyICs3NjksMTIgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChXTF9TVEFUVVNfU0NBTk5JTkcsICZ3bC0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCgiU2Nhbm5pbmcgYWxyZWFkeSA6IHN0YXR1cyAoJWQpXG4iLCAoaW50KXdsLT5zdGF0dXMpKTsKKwkJV0xfRVJSKCJTY2FubmluZyBhbHJlYWR5IDogc3RhdHVzICglZClcbiIsIChpbnQpd2wtPnN0YXR1cyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAlpZiAodW5saWtlbHkodGVzdF9iaXQoV0xfU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZ3bC0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCgiU2Nhbm5pbmcgYmVpbmcgYWJvcnRlZCA6IHN0YXR1cyAoJWQpXG4iLAotCQkJKGludCl3bC0+c3RhdHVzKSk7CisJCVdMX0VSUigiU2Nhbm5pbmcgYmVpbmcgYWJvcnRlZCA6IHN0YXR1cyAoJWQpXG4iLAorCQkgICAgICAgKGludCl3bC0+c3RhdHVzKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCkBAIC04MTEsMjYgKzgwNiwyNiBAQAogCQllbHNlCiAJCQlnb3RvIHNjYW5fb3V0OwogCX0gZWxzZSB7Ci0JCVdMX0RCRygoInNzaWQgXCIlc1wiLCBzc2lkX2xlbiAoJWQpXG4iLAotCQkJc3NpZHMtPnNzaWQsIHNzaWRzLT5zc2lkX2xlbikpOworCQlXTF9EQkcoInNzaWQgXCIlc1wiLCBzc2lkX2xlbiAoJWQpXG4iLAorCQkgICAgICAgc3NpZHMtPnNzaWQsIHNzaWRzLT5zc2lkX2xlbik7CiAJCW1lbXNldCgmc3ItPnNzaWQsIDAsIHNpemVvZihzci0+c3NpZCkpOwogCQlzci0+c3NpZC5TU0lEX2xlbiA9CiAJCQkgICAgbWluX3QodTgsIHNpemVvZihzci0+c3NpZC5TU0lEKSwgc3NpZHMtPnNzaWRfbGVuKTsKIAkJaWYgKHNyLT5zc2lkLlNTSURfbGVuKSB7CiAJCQltZW1jcHkoc3ItPnNzaWQuU1NJRCwgc3NpZHMtPnNzaWQsIHNyLT5zc2lkLlNTSURfbGVuKTsKIAkJCXNyLT5zc2lkLlNTSURfbGVuID0gaHRvZDMyKHNyLT5zc2lkLlNTSURfbGVuKTsKLQkJCVdMX0RCRygoIlNwZWNpZmljIHNjYW4gc3NpZD1cIiVzXCIgbGVuPSVkXG4iLAotCQkJCQlzci0+c3NpZC5TU0lELCBzci0+c3NpZC5TU0lEX2xlbikpOworCQkJV0xfREJHKCJTcGVjaWZpYyBzY2FuIHNzaWQ9XCIlc1wiIGxlbj0lZFxuIiwKKwkJCSAgICAgICBzci0+c3NpZC5TU0lELCBzci0+c3NpZC5TU0lEX2xlbik7CiAJCQlzcGVjX3NjYW4gPSB0cnVlOwogCQl9IGVsc2UgewotCQkJV0xfREJHKCgiQnJvYWRjYXN0IHNjYW5cbiIpKTsKKwkJCVdMX0RCRygiQnJvYWRjYXN0IHNjYW5cbiIpOwogCQl9Ci0JCVdMX0RCRygoInNyLT5zc2lkLlNTSURfbGVuICglZClcbiIsIHNyLT5zc2lkLlNTSURfbGVuKSk7CisJCVdMX0RCRygic3ItPnNzaWQuU1NJRF9sZW4gKCVkKVxuIiwgc3ItPnNzaWQuU1NJRF9sZW4pOwogCQlwYXNzaXZlX3NjYW4gPSB3bC0+YWN0aXZlX3NjYW4gPyAwIDogMTsKIAkJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfUEFTU0lWRV9TQ0FOLAogCQkJCSZwYXNzaXZlX3NjYW4sIHNpemVvZihwYXNzaXZlX3NjYW4pKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoIldMQ19TRVRfUEFTU0lWRV9TQ0FOIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfU0VUX1BBU1NJVkVfU0NBTiBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJZ290byBzY2FuX291dDsKIAkJfQogCQl3bF9zZXRfbXBjKG5kZXYsIDApOwpAQCAtODM4LDEwICs4MzMsMTAgQEAKIAkJCQlzaXplb2Yoc3ItPnNzaWQpKTsKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSAtRUJVU1kpIHsKLQkJCQlXTF9JTkZPKCgic3lzdGVtIGJ1c3kgOiBzY2FuIGZvciBcIiVzXCIgIgotCQkJCQkiY2FuY2VsZWRcbiIsIHNyLT5zc2lkLlNTSUQpKTsKKwkJCQlXTF9JTkZPKCJzeXN0ZW0gYnVzeSA6IHNjYW4gZm9yIFwiJXNcIiBjYW5jZWxlZFxuIiwKKwkJCQkJc3ItPnNzaWQuU1NJRCk7CiAJCQl9IGVsc2UgewotCQkJCVdMX0VSUigoIldMQ19TQ0FOIGVycm9yICglZClcbiIsIGVycikpOworCQkJCVdMX0VSUigiV0xDX1NDQU4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCX0KIAkJCXdsX3NldF9tcGMobmRldiwgMSk7CiAJCQlnb3RvIHNjYW5fb3V0OwpAQCAtODY1LDcgKzg2MCw3IEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJZXJyID0gX193bF9jZmc4MDIxMV9zY2FuKHdpcGh5LCBuZGV2LCByZXF1ZXN0LCBOVUxMKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9EQkcoKCJzY2FuIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9EQkcoInNjYW4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTg4NCw3ICs4NzksNyBAQAogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9WQVIsIGJ1ZiwgbGVuKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC05MDcsNyArOTAyLDcgQEAKIAlCVUdfT04odW5saWtlbHkoIWxlbikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19HRVRfVkFSLCAmdmFyLCBsZW4pOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJfQogCSpyZXR2YWwgPSBkdG9oMzIodmFyLnZhbCk7CiAKQEAgLTkyMCw3ICs5MTUsNyBAQAogCiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAicnRzdGhyZXNoIiwgcnRzX3RocmVzaG9sZCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTkzMiw3ICs5MjcsNyBAQAogCiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAiZnJhZ3RocmVzaCIsIGZyYWdfdGhyZXNob2xkKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJFcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJFcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtOTQ2LDcgKzk0MSw3IEBACiAJcmV0cnkgPSBodG9kMzIocmV0cnkpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIGNtZCwgJnJldHJ5LCBzaXplb2YocmV0cnkpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJjbWQgKCVkKSAsIGVycm9yICglZClcbiIsIGNtZCwgZXJyKSk7CisJCVdMX0VSUigiY21kICglZCkgLCBlcnJvciAoJWQpXG4iLCBjbWQsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBlcnI7CkBAIC0xMDA2LDcgKzEwMDEsNyBAQAogCiAJQ0hFQ0tfU1lTX1VQKCk7CiAJaWYgKHBhcmFtcy0+YnNzaWQpIHsKLQkJV0xfRVJSKCgiSW52YWxpZCBic3NpZFxuIikpOworCQlXTF9FUlIoIkludmFsaWQgYnNzaWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCWJzcyA9IGNmZzgwMjExX2dldF9pYnNzKHdpcGh5LCBOVUxMLCBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4pOwpAQCAtMTAzMiw3ICsxMDI3LDcgQEAKIAl9CiAJaWYgKGJzcykgewogCQl3bC0+aWJzc19zdGFydGVyID0gZmFsc2U7Ci0JCVdMX0RCRygoIkZvdW5kIElCU1NcbiIpKTsKKwkJV0xfREJHKCJGb3VuZCBJQlNTXG4iKTsKIAl9IGVsc2UgewogCQl3bC0+aWJzc19zdGFydGVyID0gdHJ1ZTsKIAl9CkBAIC0xMDQ5LDE0ICsxMDQ0LDE0IEBACiAJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA9IGh0b2QzMihwYXJhbXMtPnNzaWRfbGVuKTsKIAlpZiAocGFyYW1zLT5ic3NpZCkKIAkJbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIHBhcmFtcy0+YnNzaWQsCi0JCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgICBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgMCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1zZXQoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsCiAJCQlzaXplb2Yoam9pbl9wYXJhbXMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJFcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJFcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTA4NywxMCArMTA4MiwxMCBAQAogCQl2YWwgPSBXUEEyX0FVVEhfUFNLIHwgV1BBMl9BVVRIX1VOU1BFQ0lGSUVEOwogCWVsc2UKIAkJdmFsID0gV1BBX0FVVEhfRElTQUJMRUQ7Ci0JV0xfREJHKCgic2V0dGluZyB3cGFfYXV0aCB0byAweCUweFxuIiwgdmFsKSk7CisJV0xfREJHKCJzZXR0aW5nIHdwYV9hdXRoIHRvIDB4JTB4XG4iLCB2YWwpOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJzZXQgd3BhX2F1dGggZmFpbGVkICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInNldCB3cGFfYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7CkBAIC0xMTA5LDI3ICsxMTA0LDI3IEBACiAJc3dpdGNoIChzbWUtPmF1dGhfdHlwZSkgewogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKIAkJdmFsID0gMDsKLQkJV0xfREJHKCgib3BlbiBzeXN0ZW1cbiIpKTsKKwkJV0xfREJHKCJvcGVuIHN5c3RlbVxuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgogCQl2YWwgPSAxOwotCQlXTF9EQkcoKCJzaGFyZWQga2V5XG4iKSk7CisJCVdMX0RCRygic2hhcmVkIGtleVxuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6CiAJCXZhbCA9IDI7Ci0JCVdMX0RCRygoImF1dG9tYXRpY1xuIikpOworCQlXTF9EQkcoImF1dG9tYXRpY1xuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUDoKLQkJV0xfREJHKCgibmV0d29yayBlYXBcbiIpKTsKKwkJV0xfREJHKCJuZXR3b3JrIGVhcFxuIik7CiAJZGVmYXVsdDoKIAkJdmFsID0gMjsKLQkJV0xfRVJSKCgiaW52YWxpZCBhdXRoIHR5cGUgKCVkKVxuIiwgc21lLT5hdXRoX3R5cGUpKTsKKwkJV0xfRVJSKCJpbnZhbGlkIGF1dGggdHlwZSAoJWQpXG4iLCBzbWUtPmF1dGhfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImF1dGgiLCB2YWwpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInNldCBhdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzZXQgYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7CkBAIC0xMTYyLDggKzExNTcsOCBAQAogCQkJcHZhbCA9IEFFU19FTkFCTEVEOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBwYWlyd2lzZSAoJWQpXG4iLAotCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0pKTsKKwkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgcGFpcndpc2UgKCVkKVxuIiwKKwkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTE4MywxNiArMTE3OCwxNiBAQAogCQkJZ3ZhbCA9IEFFU19FTkFCTEVEOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkpOworCQkJV0xfRVJSKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAorCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCVdMX0RCRygoInB2YWwgKCVkKSBndmFsICglZClcbiIsIHB2YWwsIGd2YWwpKTsKKwlXTF9EQkcoInB2YWwgKCVkKSBndmFsICglZClcbiIsIHB2YWwsIGd2YWwpOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndzZWMiLCBwdmFsIHwgZ3ZhbCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTEyMTQsNyArMTIwOSw3IEBACiAJaWYgKHNtZS0+Y3J5cHRvLm5fYWttX3N1aXRlcykgewogCQllcnIgPSB3bF9kZXZfaW50dmFyX2dldChkZXYsICJ3cGFfYXV0aCIsICZ2YWwpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiY291bGQgbm90IGdldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiY291bGQgbm90IGdldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlpZiAodmFsICYgKFdQQV9BVVRIX1BTSyB8IFdQQV9BVVRIX1VOU1BFQ0lGSUVEKSkgewpAQCAtMTIyNiw4ICsxMjIxLDggQEAKIAkJCQl2YWwgPSBXUEFfQVVUSF9QU0s7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCVdMX0VSUigoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCi0JCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkpOworCQkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKKwkJCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIGlmICh2YWwgJiAoV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRCkpIHsKQEAgLTEyMzksMTYgKzEyMzQsMTYgQEAKIAkJCQl2YWwgPSBXUEEyX0FVVEhfUFNLOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCQlzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApKTsKKwkJCQlXTF9FUlIoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCisJCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KIAotCQlXTF9EQkcoKCJzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLCB2YWwpKTsKKwkJV0xfREJHKCJzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLCB2YWwpOwogCQllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIHZhbCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJjb3VsZCBub3Qgc2V0IHdwYV9hdXRoICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3Qgc2V0IHdwYV9hdXRoICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMTI2OCwxMSArMTI2MywxMSBAQAogCXMzMiB2YWw7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJrZXkgbGVuICglZClcbiIsIHNtZS0+a2V5X2xlbikpOworCVdMX0RCRygia2V5IGxlbiAoJWQpXG4iLCBzbWUtPmtleV9sZW4pOwogCWlmIChzbWUtPmtleV9sZW4pIHsKIAkJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7Ci0JCVdMX0RCRygoIndwYV92ZXJzaW9ucyAweCV4IGNpcGhlcl9wYWlyd2lzZSAweCV4XG4iLAotCQkJc2VjLT53cGFfdmVyc2lvbnMsIHNlYy0+Y2lwaGVyX3BhaXJ3aXNlKSk7CisJCVdMX0RCRygid3BhX3ZlcnNpb25zIDB4JXggY2lwaGVyX3BhaXJ3aXNlIDB4JXhcbiIsCisJCSAgICAgICBzZWMtPndwYV92ZXJzaW9ucywgc2VjLT5jaXBoZXJfcGFpcndpc2UpOwogCQlpZiAoIQogCQkgICAgKHNlYy0+d3BhX3ZlcnNpb25zICYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMSB8CiAJCQkJCSAgTkw4MDIxMV9XUEFfVkVSU0lPTl8yKSkKQEAgLTEyODIsNyArMTI3Nyw3IEBACiAJCQlrZXkubGVuID0gKHUzMikgc21lLT5rZXlfbGVuOwogCQkJa2V5LmluZGV4ID0gKHUzMikgc21lLT5rZXlfaWR4OwogCQkJaWYgKHVubGlrZWx5KGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSkgewotCQkJCVdMX0VSUigoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5LmxlbikpOworCQkJCVdMX0VSUigiVG9vIGxvbmcga2V5IGxlbmd0aCAoJXUpXG4iLCBrZXkubGVuKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCW1lbWNweShrZXkuZGF0YSwgc21lLT5rZXksIGtleS5sZW4pOwpAQCAtMTI5NSwyNyArMTI5MCwyNyBAQAogCQkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoKCJJbnZhbGlkIGFsZ29yaXRobSAoJWQpXG4iLAotCQkJCQlzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKSk7CisJCQkJV0xfRVJSKCJJbnZhbGlkIGFsZ29yaXRobSAoJWQpXG4iLAorCQkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCS8qIFNldCB0aGUgbmV3IGtleS9pbmRleCAqLwotCQkJV0xfREJHKCgia2V5IGxlbmd0aCAoJWQpIGtleSBpbmRleCAoJWQpIGFsZ28gKCVkKVxuIiwKLQkJCQlrZXkubGVuLCBrZXkuaW5kZXgsIGtleS5hbGdvKSk7Ci0JCQlXTF9EQkcoKCJrZXkgXCIlc1wiXG4iLCBrZXkuZGF0YSkpOworCQkJV0xfREJHKCJrZXkgbGVuZ3RoICglZCkga2V5IGluZGV4ICglZCkgYWxnbyAoJWQpXG4iLAorCQkJICAgICAgIGtleS5sZW4sIGtleS5pbmRleCwga2V5LmFsZ28pOworCQkJV0xfREJHKCJrZXkgXCIlc1wiXG4iLCBrZXkuZGF0YSk7CiAJCQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwogCQkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksCiAJCQkJCXNpemVvZihrZXkpKTsKIAkJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQkJV0xfRVJSKCgiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCQlpZiAoc2VjLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTSkgewotCQkJCVdMX0RCRygoInNldCBhdXRoX3R5cGUgdG8gc2hhcmVkIGtleVxuIikpOworCQkJCVdMX0RCRygic2V0IGF1dGhfdHlwZSB0byBzaGFyZWQga2V5XG4iKTsKIAkJCQl2YWwgPSAxOwkvKiBzaGFyZWQga2V5ICovCiAJCQkJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAiYXV0aCIsIHZhbCk7CiAJCQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCQkJV0xfRVJSKCgic2V0IGF1dGggZmFpbGVkICglZClcbiIsIGVycikpOworCQkJCQlXTF9FUlIoInNldCBhdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQkJCQlyZXR1cm4gZXJyOwogCQkJCX0KIAkJCX0KQEAgLTEzMzcsMTUgKzEzMzIsMTUgQEAKIAogCUNIRUNLX1NZU19VUCgpOwogCWlmICh1bmxpa2VseSghc21lLT5zc2lkKSkgewotCQlXTF9FUlIoKCJJbnZhbGlkIHNzaWRcbiIpKTsKKwkJV0xfRVJSKCJJbnZhbGlkIHNzaWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCWlmIChjaGFuKSB7CiAJCXdsLT5jaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW4tPmNlbnRlcl9mcmVxKTsKLQkJV0xfREJHKCgiY2hhbm5lbCAoJWQpLCBjZW50ZXJfcmVxICglZClcbiIsIHdsLT5jaGFubmVsLAotCQkJY2hhbi0+Y2VudGVyX2ZyZXEpKTsKKwkJV0xfREJHKCJjaGFubmVsICglZCksIGNlbnRlcl9yZXEgKCVkKVxuIiwKKwkJICAgICAgIHdsLT5jaGFubmVsLCBjaGFuLT5jZW50ZXJfZnJlcSk7CiAJfQotCVdMX0RCRygoImllICglcCksIGllX2xlbiAoJXpkKVxuIiwgc21lLT5pZSwgc21lLT5pZV9sZW4pKTsKKwlXTF9EQkcoImllICglcCksIGllX2xlbiAoJXpkKVxuIiwgc21lLT5pZSwgc21lLT5pZV9sZW4pOwogCWVyciA9IHdsX3NldF93cGFfdmVyc2lvbihkZXYsIHNtZSk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CkBAIC0xMzc4LDE4ICsxMzczLDE4IEBACiAJbWVtY3B5KCZqb2luX3BhcmFtcy5zc2lkLlNTSUQsIHNtZS0+c3NpZCwgam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7CiAJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA9IGh0b2QzMihqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKIAl3bF91cGRhdGVfcHJvZih3bCwgTlVMTCwgJmpvaW5fcGFyYW1zLnNzaWQsIFdMX1BST0ZfU1NJRCk7Ci0JbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAogCXdsX2NoX3RvX2NoYW5zcGVjKHdsLT5jaGFubmVsLCAmam9pbl9wYXJhbXMsICZqb2luX3BhcmFtc19zaXplKTsKLQlXTF9EQkcoKCJqb2luX3BhcmFtX3NpemUgJWRcbiIsIGpvaW5fcGFyYW1zX3NpemUpKTsKKwlXTF9EQkcoImpvaW5fcGFyYW1fc2l6ZSAlZFxuIiwgam9pbl9wYXJhbXNfc2l6ZSk7CiAKIAlpZiAoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA8IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJV0xfREJHKCgic3NpZCBcIiVzXCIsIGxlbiAoJWQpXG4iLCBqb2luX3BhcmFtcy5zc2lkLlNTSUQsCi0JCQlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKSk7CisJCVdMX0RCRygic3NpZCBcIiVzXCIsIGxlbiAoJWQpXG4iLAorCQkgICAgICAgam9pbl9wYXJhbXMuc3NpZC5TU0lELCBqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKIAl9CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsIGpvaW5fcGFyYW1zX3NpemUpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXNldF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZ3bC0+c3RhdHVzKTsKQEAgLTE0MDYsMTcgKzE0MDEsMTcgQEAKIAlib29sIGFjdCA9IGZhbHNlOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgiUmVhc29uICVkXG4iLCByZWFzb25fY29kZSkpOworCVdMX0RCRygiUmVhc29uICVkXG4iLCByZWFzb25fY29kZSk7CiAJQ0hFQ0tfU1lTX1VQKCk7CiAJYWN0ID0gKihib29sICopIHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9BQ1QpOwogCWlmIChsaWtlbHkoYWN0KSkgewogCQlzY2J2YWwudmFsID0gcmVhc29uX2NvZGU7Ci0JCW1lbWNweSgmc2NidmFsLmVhLCAmd2wtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmc2NidmFsLmVhLCAmd2wtPmJzc2lkLCBFVEhfQUxFTik7CiAJCXNjYnZhbC52YWwgPSBodG9kMzIoc2NidmFsLnZhbCk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19ESVNBU1NPQywgJnNjYnZhbCwKIAkJCQlzaXplb2Yoc2NiX3ZhbF90KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xNDQxLDEzICsxNDM2LDEzIEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOgogCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCgiVFhfUE9XRVJfTElNSVRURUQgLSBkYm0gaXMgbmVnYXRpdmVcbiIpKTsKKwkJCVdMX0VSUigiVFhfUE9XRVJfTElNSVRFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKIAljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6CiAJCWlmIChkYm0gPCAwKSB7Ci0JCQlXTF9FUlIoKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZS4uXG4iKSk7CisJCQlXTF9FUlIoIlRYX1BPV0VSX0ZJWEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOwpAQCAtMTQ1Nyw3ICsxNDUyLDcgQEAKIAlkaXNhYmxlID0gaHRvZDMyKGRpc2FibGUpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1JBRElPLCAmZGlzYWJsZSwgc2l6ZW9mKGRpc2FibGUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX1JBRElPIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfUkFESU8gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE0NjgsNyArMTQ2Myw3IEBACiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQobmRldiwgInF0eHBvd2VyIiwKIAkJCShzMzIpIChiY21fbXdfdG9fcWRibSh0eHB3cm13KSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInF0eHBvd2VyIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInF0eHBvd2VyIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdsLT5jb25mLT50eF9wb3dlciA9IGRibTsKQEAgLTE0ODcsNyArMTQ4Miw3IEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJZXJyID0gd2xfZGV2X2ludHZhcl9nZXQobmRldiwgInF0eHBvd2VyIiwgJnR4cHdyZGJtKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXN1bHQgPSAodTgpICh0eHB3cmRibSAmIH5XTF9UWFBXUl9PVkVSUklERSk7CkBAIC0xNTA0LDEyICsxNDk5LDEyIEBACiAJczMyIHdzZWM7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCkpOworCVdMX0RCRygia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwogCUNIRUNLX1NZU19VUCgpOwogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9XU0VDLCAmd3NlYywgc2l6ZW9mKHdzZWMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfR0VUX1dTRUMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdzZWMgPSBkdG9oMzIod3NlYyk7CkBAIC0xNTIwLDcgKzE1MTUsNyBAQAogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWV9QUklNQVJZLCAmaW5kZXgsCiAJCQkJc2l6ZW9mKGluZGV4KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTUzNyw4ICsxNTMyLDggQEAKIAlrZXkuaW5kZXggPSAodTMyKSBrZXlfaWR4OwogCS8qIEluc3RlYWQgb2YgYmNhc3QgZm9yIGVhIGFkZHJlc3MgZm9yIGRlZmF1bHQgd2VwIGtleXMsCiAJCSBkcml2ZXIgbmVlZHMgaXQgdG8gYmUgTnVsbCAqLwotCWlmICghRVRIRVJfSVNNVUxUSShtYWNfYWRkcikpCi0JCW1lbWNweSgoY2hhciAqKSZrZXkuZWEsICh2b2lkICopbWFjX2FkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkKKwkJbWVtY3B5KChjaGFyICopJmtleS5lYSwgKHZvaWQgKiltYWNfYWRkciwgRVRIX0FMRU4pOwogCWtleS5sZW4gPSAodTMyKSBwYXJhbXMtPmtleV9sZW47CiAJLyogY2hlY2sgZm9yIGtleSBpbmRleCBjaGFuZ2UgKi8KIAlpZiAoa2V5LmxlbiA9PSAwKSB7CkBAIC0xNTQ2LDE2ICsxNTQxLDE2IEBACiAJCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfS0VZLCAma2V5LCBzaXplb2Yoa2V5KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJrZXkgZGVsZXRlIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJrZXkgZGVsZXRlIGVycm9yICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSB7Ci0JCQlXTF9FUlIoKCJJbnZhbGlkIGtleSBsZW5ndGggKCVkKVxuIiwga2V5LmxlbikpOworCQkJV0xfRVJSKCJJbnZhbGlkIGtleSBsZW5ndGggKCVkKVxuIiwga2V5Lmxlbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCVdMX0RCRygoIlNldHRpbmcgdGhlIGtleSBpbmRleCAlZFxuIiwga2V5LmluZGV4KSk7CisJCVdMX0RCRygiU2V0dGluZyB0aGUga2V5IGluZGV4ICVkXG4iLCBrZXkuaW5kZXgpOwogCQltZW1jcHkoa2V5LmRhdGEsIHBhcmFtcy0+a2V5LCBrZXkubGVuKTsKIAogCQlpZiAocGFyYW1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewpAQCAtMTU3OSwyNiArMTU3NCwyNiBAQAogCQlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDE7Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDEyODsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKIAkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fVEtJUDsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKIAkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fQUVTX0NDTTsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9DQ01QXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJJbnZhbGlkIGNpcGhlciAoMHgleClcbiIsIHBhcmFtcy0+Y2lwaGVyKSk7CisJCQlXTF9FUlIoIkludmFsaWQgY2lwaGVyICgweCV4KVxuIiwgcGFyYW1zLT5jaXBoZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKQEAgLTE2MDYsNyArMTYwMSw3IEBACiAJCWRoZF93YWl0X3BlbmQ4MDIxeChkZXYpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMTYyMyw3ICsxNjE4LDcgQEAKIAlzMzIgd3NlYzsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJV0xfREJHKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJQ0hFQ0tfU1lTX1VQKCk7CiAKIAlpZiAobWFjX2FkZHIpCkBAIC0xNjM0LDcgKzE2MjksNyBAQAogCWtleS5pbmRleCA9ICh1MzIpIGtleV9pZHg7CiAKIAlpZiAodW5saWtlbHkoa2V5LmxlbiA+IHNpemVvZihrZXkuZGF0YSkpKSB7Ci0JCVdMX0VSUigoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5LmxlbikpOworCQlXTF9FUlIoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5Lmxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltZW1jcHkoa2V5LmRhdGEsIHBhcmFtcy0+a2V5LCBrZXkubGVuKTsKQEAgLTE2NDMsMjYgKzE2MzgsMjYgQEAKIAlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxOwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fVEtJUDsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgogCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUNcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fQUVTX0NDTTsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlIoKCJJbnZhbGlkIGNpcGhlciAoMHgleClcbiIsIHBhcmFtcy0+Y2lwaGVyKSk7CisJCVdMX0VSUigiSW52YWxpZCBjaXBoZXIgKDB4JXgpXG4iLCBwYXJhbXMtPmNpcGhlcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTY3MCwyMSArMTY2NSwyMSBAQAogCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXZhbCA9IFdFUF9FTkFCTEVEOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfZ2V0KGRldiwgIndzZWMiLCAmd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJd3NlYyAmPSB+KFdFUF9FTkFCTEVEKTsKIAl3c2VjIHw9IHZhbDsKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3c2VjIiwgd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE2OTIsNyArMTY4Nyw3IEBACiAJdmFsID0gaHRvZDMyKHZhbCk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9BVVRILCAmdmFsLCBzaXplb2YodmFsKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfQVVUSCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTcxNCw3ICsxNzA5LDcgQEAKIAlrZXkuZmxhZ3MgPSBXTF9QUklNQVJZX0tFWTsKIAlrZXkuYWxnbyA9IENSWVBUT19BTEdPX09GRjsKIAotCVdMX0RCRygoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJV0xfREJHKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJLyogU2V0IHRoZSBuZXcga2V5L2luZGV4ICovCiAJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwpAQCAtMTcyMiwxMCArMTcxNywxMCBAQAogCQlpZiAoZXJyID09IC1FSU5WQUwpIHsKIAkJCWlmIChrZXkuaW5kZXggPj0gRE9UMTFfTUFYX0RFRkFVTFRfS0VZUykgewogCQkJCS8qIHdlIGlnbm9yZSB0aGlzIGtleSBpbmRleCBpbiB0aGlzIGNhc2UgKi8KLQkJCQlXTF9EQkcoKCJpbnZhbGlkIGtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJCQkJV0xfREJHKCJpbnZhbGlkIGtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTczMywxNCArMTcyOCwxNCBAQAogCXZhbCA9IDA7CiAJZXJyID0gd2xfZGV2X2ludHZhcl9nZXQoZGV2LCAid3NlYyIsICZ3c2VjKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJnZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJnZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3c2VjICY9IH4oV0VQX0VOQUJMRUQpOwogCXdzZWMgfD0gdmFsOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndzZWMiLCB3c2VjKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJzZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTc0OCw3ICsxNzQzLDcgQEAKIAl2YWwgPSBodG9kMzIodmFsKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0FVVEgsICZ2YWwsIHNpemVvZih2YWwpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0FVVEggZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBlcnI7CkBAIC0xNzY2LDcgKzE3NjEsNyBAQAogCXMzMiB3c2VjOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpKTsKKwlXTF9EQkcoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAlDSEVDS19TWVNfVVAoKTsKIAogCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CkBAIC0xNzc4LDcgKzE3NzMsNyBAQAogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9XU0VDLCAmd3NlYywgc2l6ZW9mKHdzZWMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfR0VUX1dTRUMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdzZWMgPSBkdG9oMzIod3NlYyk7CkBAIC0xNzg3LDIyICsxNzgyLDIyIEBACiAJCXNlYyA9IHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9TRUMpOwogCQlpZiAoc2VjLT5jaXBoZXJfcGFpcndpc2UgJiBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCkgewogCQkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpOwogCQl9IGVsc2UgaWYgKHNlYy0+Y2lwaGVyX3BhaXJ3aXNlICYgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7CiAJCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0XG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBUS0lQX0VOQUJMRUQ6CiAJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7CiAJCWJyZWFrOwogCWNhc2UgQUVTX0VOQUJMRUQ6CiAJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUNcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCVdMX0VSUigoIkludmFsaWQgYWxnbyAoMHgleClcbiIsIHdzZWMpKTsKKwkJV0xfRVJSKCJJbnZhbGlkIGFsZ28gKDB4JXgpXG4iLCB3c2VjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xODE0LDcgKzE4MDksNyBAQAogd2xfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2lkeCkKIHsKLQlXTF9JTkZPKCgiTm90IHN1cHBvcnRlZFxuIikpOworCVdMX0lORk8oIk5vdCBzdXBwb3J0ZWRcbiIpOwogCUNIRUNLX1NZU19VUCgpOwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4MzEsMjAgKzE4MjYsMjAgQEAKIAogCUNIRUNLX1NZU19VUCgpOwogCWlmICh1bmxpa2VseQotCSAgICAobWVtY21wKG1hYywgd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX0JTU0lEKSwgRVRIRVJfQUREUl9MRU4pKSkgewotCQlXTF9FUlIoKCJXcm9uZyBNYWMgYWRkcmVzc1xuIikpOworCSAgICAobWVtY21wKG1hYywgd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX0JTU0lEKSwgRVRIX0FMRU4pKSkgeworCQlXTF9FUlIoIldyb25nIE1hYyBhZGRyZXNzXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJLyogUmVwb3J0IHRoZSBjdXJyZW50IHR4IHJhdGUgKi8KIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX1JBVEUsICZyYXRlLCBzaXplb2YocmF0ZSkpOwogCWlmIChlcnIpIHsKLQkJV0xfRVJSKCgiQ291bGQgbm90IGdldCByYXRlICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgcmF0ZSAoJWQpXG4iLCBlcnIpOwogCX0gZWxzZSB7CiAJCXJhdGUgPSBkdG9oMzIocmF0ZSk7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1RYX0JJVFJBVEU7CiAJCXNpbmZvLT50eHJhdGUubGVnYWN5ID0gcmF0ZSAqIDU7Ci0JCVdMX0RCRygoIlJhdGUgJWQgTWJwc1xuIiwgKHJhdGUgLyAyKSkpOworCQlXTF9EQkcoIlJhdGUgJWQgTWJwc1xuIiwgcmF0ZSAvIDIpOwogCX0KIAogCWlmICh0ZXN0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmd2wtPnN0YXR1cykpIHsKQEAgLTE4NTIsMTMgKzE4NDcsMTMgQEAKIAkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9SU1NJLCAmc2NiX3ZhbCwKIAkJCQlzaXplb2Yoc2NiX3ZhbF90KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZ2V0IHJzc2kgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgcnNzaSAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlyc3NpID0gZHRvaDMyKHNjYl92YWwudmFsKTsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fU0lHTkFMOwogCQlzaW5mby0+c2lnbmFsID0gcnNzaTsKLQkJV0xfREJHKCgiUlNTSSAlZCBkQm1cbiIsIHJzc2kpKTsKKwkJV0xfREJHKCJSU1NJICVkIGRCbVxuIiwgcnNzaSk7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTE4NzQsMTMgKzE4NjksMTMgQEAKIAlDSEVDS19TWVNfVVAoKTsKIAlwbSA9IGVuYWJsZWQgPyBQTV9GQVNUIDogUE1fT0ZGOwogCXBtID0gaHRvZDMyKHBtKTsKLQlXTF9EQkcoKCJwb3dlciBzYXZlICVzXG4iLCAocG0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSkpOworCVdMX0RCRygicG93ZXIgc2F2ZSAlc1xuIiwgKHBtID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfUE0sICZwbSwgc2l6ZW9mKHBtKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaWYgKGVyciA9PSAtRU5PREVWKQotCQkJV0xfREJHKCgibmV0X2RldmljZSBpcyBub3QgcmVhZHkgeWV0XG4iKSk7CisJCQlXTF9EQkcoIm5ldF9kZXZpY2UgaXMgbm90IHJlYWR5IHlldFxuIik7CiAJCWVsc2UKLQkJCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTkzMiw3ICsxOTI3LDcgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX0NVUlJfUkFURVNFVCwgJnJhdGVzZXQsCiAJCQlzaXplb2YocmF0ZXNldCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgY3VycmVudCByYXRlc2V0ICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgY3VycmVudCByYXRlc2V0ICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xOTUyLDcgKzE5NDcsNyBAQAogCQlyYXRlID0gdmFsIC8gNTAwMDAwOwogCX0KIAotCVdMX0RCRygoInJhdGUgJWQgbWJwc1xuIiwgKHJhdGUgLyAyKSkpOworCVdMX0RCRygicmF0ZSAlZCBtYnBzXG4iLCByYXRlIC8gMik7CiAKIAkvKgogCSAqCkBAIC0xOTYyLDcgKzE5NTcsNyBAQAogCWVycl9iZyA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImJnX3JhdGUiLCByYXRlKTsKIAllcnJfYSA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImFfcmF0ZSIsIHJhdGUpOwogCWlmICh1bmxpa2VseShlcnJfYmcgJiYgZXJyX2EpKSB7Ci0JCVdMX0VSUigoImNvdWxkIG5vdCBzZXQgZml4ZWQgcmF0ZSAoJWQpICglZClcbiIsIGVycl9iZywgZXJyX2EpKTsKKwkJV0xfRVJSKCJjb3VsZCBub3Qgc2V0IGZpeGVkIHJhdGUgKCVkKSAoJWQpXG4iLCBlcnJfYmcsIGVycl9hKTsKIAkJcmV0dXJuIGVycl9iZyB8IGVycl9hOwogCX0KIApAQCAtMjAwNywxMiArMjAwMiwxMiBAQAogewogCWludCBpLCBqOwogCi0JV0xfREJHKCgiTm8gb2YgZWxlbWVudHMgJWRcbiIsIHBta19saXN0LT5wbWtpZHMubnBta2lkKSk7CisJV0xfREJHKCJObyBvZiBlbGVtZW50cyAlZFxuIiwgcG1rX2xpc3QtPnBta2lkcy5ucG1raWQpOwogCWZvciAoaSA9IDA7IGkgPCBwbWtfbGlzdC0+cG1raWRzLm5wbWtpZDsgaSsrKSB7Ci0JCVdMX0RCRygoIlBNS0lEWyVkXTogJXBNID1cbiIsIGksCi0JCQkmcG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCkpOworCQlXTF9EQkcoIlBNS0lEWyVkXTogJXBNID1cbiIsIGksCisJCSAgICAgICAmcG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCk7CiAJCWZvciAoaiA9IDA7IGogPCBXUEEyX1BNS0lEX0xFTjsgaisrKSB7Ci0JCQlXTF9EQkcoKCIlMDJ4XG4iLCBwbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLlBNS0lEW2pdKSk7CisJCQlXTF9EQkcoIiUwMnhcbiIsIHBta19saXN0LT5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pOwogCQl9CiAJfQogCWlmIChsaWtlbHkoIWVycikpIHsKQEAgLTIwMzQsMTEgKzIwMjksMTEgQEAKIAlDSEVDS19TWVNfVVAoKTsKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkOyBpKyspCiAJCWlmICghbWVtY21wKHBta3NhLT5ic3NpZCwgJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLkJTU0lELAotCQkJICAgIEVUSEVSX0FERFJfTEVOKSkKKwkJCSAgICBFVEhfQUxFTikpCiAJCQlicmVhazsKIAlpZiAoaSA8IFdMX05VTV9QTUtJRFNfTUFYKSB7CiAJCW1lbWNweSgmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsIHBta3NhLT5ic3NpZCwKLQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJICAgICAgIEVUSF9BTEVOKTsKIAkJbWVtY3B5KCZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5QTUtJRCwgcG1rc2EtPnBta2lkLAogCQkgICAgICAgV1BBMl9QTUtJRF9MRU4pOwogCQlpZiAoaSA9PSB3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWQpCkBAIC0yMDQ2LDEyICsyMDQxLDEyIEBACiAJfSBlbHNlIHsKIAkJZXJyID0gLUVJTlZBTDsKIAl9Ci0JV0xfREJHKCgic2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPVxuIiwKLQkJJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW3dsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZF0uQlNTSUQpKTsKKwlXTF9EQkcoInNldF9wbWtzYSxJV19QTUtTQV9BREQgLSBQTUtJRDogJXBNID1cbiIsCisJICAgICAgICZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFt3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWRdLkJTU0lEKTsKIAlmb3IgKGkgPSAwOyBpIDwgV1BBMl9QTUtJRF9MRU47IGkrKykgewotCQlXTF9EQkcoKCIlMDJ4XG4iLAotCQkJd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkXS4KLQkJCVBNS0lEW2ldKSk7CisJCVdMX0RCRygiJTAyeFxuIiwKKwkJICAgICAgIHdsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW3dsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZF0uCisJCSAgICAgICBQTUtJRFtpXSk7CiAJfQogCiAJZXJyID0gd2xfdXBkYXRlX3Bta2xpc3QoZGV2LCB3bC0+cG1rX2xpc3QsIGVycik7CkBAIC0yMDY5LDE5ICsyMDY0LDE5IEBACiAJaW50IGk7CiAKIAlDSEVDS19TWVNfVVAoKTsKLQltZW1jcHkoJnBta2lkLnBta2lkWzBdLkJTU0lELCBwbWtzYS0+YnNzaWQsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJnBta2lkLnBta2lkWzBdLkJTU0lELCBwbWtzYS0+YnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkoJnBta2lkLnBta2lkWzBdLlBNS0lELCBwbWtzYS0+cG1raWQsIFdQQTJfUE1LSURfTEVOKTsKIAotCVdMX0RCRygoImRlbF9wbWtzYSxJV19QTUtTQV9SRU1PVkUgLSBQTUtJRDogJXBNID1cbiIsCi0JCSZwbWtpZC5wbWtpZFswXS5CU1NJRCkpOworCVdMX0RCRygiZGVsX3Bta3NhLElXX1BNS1NBX1JFTU9WRSAtIFBNS0lEOiAlcE0gPVxuIiwKKwkgICAgICAgJnBta2lkLnBta2lkWzBdLkJTU0lEKTsKIAlmb3IgKGkgPSAwOyBpIDwgV1BBMl9QTUtJRF9MRU47IGkrKykgewotCQlXTF9EQkcoKCIlMDJ4XG4iLCBwbWtpZC5wbWtpZFswXS5QTUtJRFtpXSkpOworCQlXTF9EQkcoIiUwMnhcbiIsIHBta2lkLnBta2lkWzBdLlBNS0lEW2ldKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkOyBpKyspCiAJCWlmICghbWVtY21wCiAJCSAgICAocG1rc2EtPmJzc2lkLCAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsCi0JCSAgICAgRVRIRVJfQUREUl9MRU4pKQorCQkgICAgIEVUSF9BTEVOKSkKIAkJCWJyZWFrOwogCiAJaWYgKCh3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWQgPiAwKQpAQCAtMjA5MCw3ICsyMDg1LDcgQEAKIAkJZm9yICg7IGkgPCAod2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkIC0gMSk7IGkrKykgewogCQkJbWVtY3B5KCZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKIAkJCSAgICAgICAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaSArIDFdLkJTU0lELAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQltZW1jcHkoJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLlBNS0lELAogCQkJICAgICAgICZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpICsgMV0uUE1LSUQsCiAJCQkgICAgICAgV1BBMl9QTUtJRF9MRU4pOwpAQCAtMjE2OCwxMyArMjE2MywxMyBAQAogCiAJd2RldiA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3ZGV2KSkgewotCQlXTF9FUlIoKCJDb3VsZCBub3QgYWxsb2NhdGUgd2lyZWxlc3MgZGV2aWNlXG4iKSk7CisJCVdMX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIHdpcmVsZXNzIGRldmljZVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAl3ZGV2LT53aXBoeSA9CiAJICAgIHdpcGh5X25ldygmd2xfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IHdsX3ByaXYpICsgc2l6ZW9mX2lmYWNlKTsKIAlpZiAodW5saWtlbHkoIXdkZXYtPndpcGh5KSkgewotCQlXTF9FUlIoKCJDb3VsZG4gbm90IGFsbG9jYXRlIHdpcGh5IGRldmljZVxuIikpOworCQlXTF9FUlIoIkNvdWxkbiBub3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byB3aXBoeV9uZXdfb3V0OwogCX0KQEAgLTIyMDQsNyArMjE5OSw3IEBACiAjZW5kaWYJCQkJLyogIVdMX1BPV0VSU0FWRV9ESVNBQkxFRCAqLwogCWVyciA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKLQkJV0xfRVJSKCgiQ291bGRuIG5vdCByZWdpc3RlciB3aXBoeSBkZXZpY2UgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiQ291bGRuIG5vdCByZWdpc3RlciB3aXBoeSBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKIAkJZ290byB3aXBoeV9yZWdpc3Rlcl9vdXQ7CiAJfQogCXJldHVybiB3ZGV2OwpAQCAtMjIyMyw3ICsyMjE4LDcgQEAKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2xfdG9fd2Rldih3bCk7CiAKIAlpZiAodW5saWtlbHkoIXdkZXYpKSB7Ci0JCVdMX0VSUigoIndkZXYgaXMgaW52YWxpZFxuIikpOworCQlXTF9FUlIoIndkZXYgaXMgaW52YWxpZFxuIik7CiAJCXJldHVybjsKIAl9CiAJd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CkBAIC0yMjQxLDExICsyMjM2LDExIEBACiAKIAlic3NfbGlzdCA9IHdsLT5ic3NfbGlzdDsKIAlpZiAodW5saWtlbHkoYnNzX2xpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikpIHsKLQkJV0xfRVJSKCgiVmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJYnNzX2xpc3QtPnZlcnNpb24pKTsKKwkJV0xfRVJSKCJWZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCSAgICAgICBic3NfbGlzdC0+dmVyc2lvbik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9Ci0JV0xfREJHKCgic2Nhbm5lZCBBUCBjb3VudCAoJWQpXG4iLCBic3NfbGlzdC0+Y291bnQpKTsKKwlXTF9EQkcoInNjYW5uZWQgQVAgY291bnQgKCVkKVxuIiwgYnNzX2xpc3QtPmNvdW50KTsKIAliaSA9IG5leHRfYnNzKGJzc19saXN0LCBiaSk7CiAJZm9yX2VhY2hfYnNzKGJzc19saXN0LCBiaSwgaSkgewogCQllcnIgPSB3bF9pbmZvcm1fc2luZ2xlX2Jzcyh3bCwgYmkpOwpAQCAtMjI3MCwxNCArMjI2NSwxNCBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KGR0b2gzMihiaS0+bGVuZ3RoKSA+IFdMX0JTU19JTkZPX01BWCkpIHsKLQkJV0xfREJHKCgiQmVhY29uIGlzIGxhcmdlciB0aGFuIGJ1ZmZlci4gRGlzY2FyZGluZ1xuIikpOworCQlXTF9EQkcoIkJlYWNvbiBpcyBsYXJnZXIgdGhhbiBidWZmZXIuIERpc2NhcmRpbmdcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlub3RpZl9ic3NfaW5mbyA9CiAJICAgIGt6YWxsb2Moc2l6ZW9mKCpub3RpZl9ic3NfaW5mbykgKyBzaXplb2YoKm1nbXQpIC0gc2l6ZW9mKHU4KSArCiAJCSAgICBXTF9CU1NfSU5GT19NQVgsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghbm90aWZfYnNzX2luZm8pKSB7Ci0JCVdMX0VSUigoIm5vdGlmX2Jzc19pbmZvIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIm5vdGlmX2Jzc19pbmZvIGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKW5vdGlmX2Jzc19pbmZvLT5mcmFtZV9idWY7CkBAIC0yMjg5LDcgKzIyODQsNyBAQAogCWVsc2UKIAkJYmFuZCA9IHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKIAlub3RpZl9ic3NfaW5mby0+cnNzaSA9IGJpLT5SU1NJOwotCW1lbWNweShtZ210LT5ic3NpZCwgJmJpLT5CU1NJRCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweShtZ210LT5ic3NpZCwgJmJpLT5CU1NJRCwgRVRIX0FMRU4pOwogCW1nbXRfdHlwZSA9IHdsLT5hY3RpdmVfc2NhbiA/CiAJCUlFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQIDogSUVFRTgwMjExX1NUWVBFX0JFQUNPTjsKIAlpZiAoIW1lbWNtcChiaS0+U1NJRCwgc3ItPnNzaWQuU1NJRCwgYmktPlNTSURfbGVuKSkgewpAQCAtMjMyMSwxNyArMjMxNiwxNyBAQAogCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobm90aWZfYnNzX2luZm8tPmNoYW5uZWwpOwogCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOwogCi0JV0xfREJHKCgiU1NJRCA6IFwiJXNcIiwgcnNzaSAlZCwgY2hhbm5lbCAlZCwgY2FwYWJpbGl0eSA6IDB4MDQleCwgYnNzaWQgJXBNXG4iLAotCQliaS0+U1NJRCwKLQkJbm90aWZfYnNzX2luZm8tPnJzc2ksIG5vdGlmX2Jzc19pbmZvLT5jaGFubmVsLAotCQltZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvLCAmYmktPkJTU0lEKSk7CisJV0xfREJHKCJTU0lEIDogXCIlc1wiLCByc3NpICVkLCBjaGFubmVsICVkLCBjYXBhYmlsaXR5IDogMHgwNCV4LCBic3NpZCAlcE1cbiIsCisJICAgICAgIGJpLT5TU0lELAorCSAgICAgICBub3RpZl9ic3NfaW5mby0+cnNzaSwgbm90aWZfYnNzX2luZm8tPmNoYW5uZWwsCisJICAgICAgIG1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8sICZiaS0+QlNTSUQpOwogCiAJc2lnbmFsID0gbm90aWZfYnNzX2luZm8tPnJzc2kgKiAxMDA7CiAJaWYgKHVubGlrZWx5KCFjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKHdpcGh5LCBjaGFubmVsLCBtZ210LAogCQkJCQkJbGUxNl90b19jcHUKIAkJCQkJCShub3RpZl9ic3NfaW5mby0+ZnJhbWVfbGVuKSwKIAkJCQkJCXNpZ25hbCwgR0ZQX0tFUk5FTCkpKSB7Ci0JCVdMX0VSUigoImNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUgZXJyb3JcbiIpKTsKKwkJV0xfRVJSKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKTsKIAkJa2ZyZWUobm90aWZfYnNzX2luZm8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yMzk5LDEyICsyMzk0LDEyIEBACiAJCWlmICh3bF9pc19pYnNzbW9kZSh3bCkpIHsKIAkJCWNmZzgwMjExX2lic3Nfam9pbmVkKG5kZXYsIChzOCAqKSZlLT5hZGRyLAogCQkJCQkgICAgIEdGUF9LRVJORUwpOwotCQkJV0xfREJHKCgiam9pbmVkIGluIElCU1MgbmV0d29ya1xuIikpOworCQkJV0xfREJHKCJqb2luZWQgaW4gSUJTUyBuZXR3b3JrXG4iKTsKIAkJfSBlbHNlIHsKIAkJCXdsX2Jzc19jb25uZWN0X2RvbmUod2wsIG5kZXYsIGUsIGRhdGEsIHRydWUpOwotCQkJV0xfREJHKCgiam9pbmVkIGluIEJTUyBuZXR3b3JrIFwiJXNcIlxuIiwKLQkJCQkoKHN0cnVjdCB3bGNfc3NpZCAqKQotCQkJCSB3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfU1NJRCkpLT5TU0lEKSk7CisJCQlXTF9EQkcoImpvaW5lZCBpbiBCU1MgbmV0d29yayBcIiVzXCJcbiIsCisJCQkgICAgICAgKChzdHJ1Y3Qgd2xjX3NzaWQgKikKKwkJCQl3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfU1NJRCkpLT5TU0lEKTsKIAkJfQogCQlhY3QgPSB0cnVlOwogCQl3bF91cGRhdGVfcHJvZih3bCwgZSwgJmFjdCwgV0xfUFJPRl9BQ1QpOwpAQCAtMjQ1OSw3ICsyNDU0LDcgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX1ZBUiwgKHZvaWQgKil3bC0+aW9jdGxfYnVmLAogCQkJV0xfSU9DVExfTEVOX01BWCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJbWVtY3B5KGJ1Ziwgd2wtPmlvY3RsX2J1ZiwgYnVmX2xlbik7CkBAIC0yNDc5LDcgKzI0NzQsNyBAQAogCWVyciA9IHdsX2Rldl9idWZ2YXJfZ2V0KG5kZXYsICJhc3NvY19pbmZvIiwgd2wtPmV4dHJhX2J1ZiwKIAkJCQlXTF9BU1NPQ19JTkZPX01BWCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiY291bGQgbm90IGdldCBhc3NvYyBpbmZvICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgYXNzb2MgaW5mbyAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlhc3NvY19pbmZvID0gKHN0cnVjdCB3bF9hc3NvY19pZWxlbiAqKXdsLT5leHRyYV9idWY7CkBAIC0yNDg5LDcgKzI0ODQsNyBAQAogCQllcnIgPSB3bF9kZXZfYnVmdmFyX2dldChuZGV2LCAiYXNzb2NfcmVxX2llcyIsIHdsLT5leHRyYV9idWYsCiAJCQkJCVdMX0FTU09DX0lORk9fTUFYKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgYXNzb2MgcmVxICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlcSAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQljb25uX2luZm8tPnJlcV9pZV9sZW4gPSByZXFfbGVuOwpAQCAtMjUwMyw3ICsyNDk4LDcgQEAKIAkJZXJyID0gd2xfZGV2X2J1ZnZhcl9nZXQobmRldiwgImFzc29jX3Jlc3BfaWVzIiwgd2wtPmV4dHJhX2J1ZiwKIAkJCQkJV0xfQVNTT0NfSU5GT19NQVgpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiY291bGQgbm90IGdldCBhc3NvYyByZXNwICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlc3AgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJY29ubl9pbmZvLT5yZXNwX2llX2xlbiA9IHJlc3BfbGVuOwpAQCAtMjUxMyw4ICsyNTA4LDggQEAKIAkJY29ubl9pbmZvLT5yZXNwX2llX2xlbiA9IDA7CiAJCWNvbm5faW5mby0+cmVzcF9pZSA9IE5VTEw7CiAJfQotCVdMX0RCRygoInJlcSBsZW4gKCVkKSByZXNwIGxlbiAoJWQpXG4iLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCi0JCWNvbm5faW5mby0+cmVzcF9pZV9sZW4pKTsKKwlXTF9EQkcoInJlcSBsZW4gKCVkKSByZXNwIGxlbiAoJWQpXG4iLAorCSAgICAgICBjb25uX2luZm8tPnJlcV9pZV9sZW4sIGNvbm5faW5mby0+cmVzcF9pZV9sZW4pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI1NDcsOCArMjU0Miw4IEBACiAJCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbnVtID0KIAkJCWh0b2QzMihqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSk7CiAKLQkJV0xfREJHKCgiam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdPSAlI1gsIGNoYW5uZWwgJWQsIGNoYW5zcGVjICUjWFxuIiwKLQkJCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSwgY2gsIGNoYW5zcGVjKSk7CisJCVdMX0RCRygiam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdPSAlI1gsIGNoYW5uZWwgJWQsIGNoYW5zcGVjICUjWFxuIiwKKwkJICAgICAgIGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSwgY2gsIGNoYW5zcGVjKTsKIAl9CiB9CiAKQEAgLTI1NzUsMTYgKzI1NzAsMTYgQEAKIAogCXJ0bmxfbG9jaygpOwogCWlmICh1bmxpa2VseSghYnNzKSkgewotCQlXTF9EQkcoKCJDb3VsZCBub3QgZmluZCB0aGUgQVBcbiIpKTsKKwkJV0xfREJHKCJDb3VsZCBub3QgZmluZCB0aGUgQVBcbiIpOwogCQkqKHUzMiAqKSB3bC0+ZXh0cmFfYnVmID0gaHRvZDMyKFdMX0VYVFJBX0JVRl9NQVgpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfQlNTX0lORk8sCiAJCQkJd2wtPmV4dHJhX2J1ZiwgV0xfRVhUUkFfQlVGX01BWCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZ2V0IGJzcyBpbmZvICVkXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGdldCBic3MgaW5mbyAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gdXBkYXRlX2Jzc19pbmZvX291dDsKIAkJfQogCQliaSA9IChzdHJ1Y3Qgd2xfYnNzX2luZm8gKikod2wtPmV4dHJhX2J1ZiArIDQpOwotCQlpZiAodW5saWtlbHkobWVtY21wKCZiaS0+QlNTSUQsICZ3bC0+YnNzaWQsIEVUSEVSX0FERFJfTEVOKSkpIHsKKwkJaWYgKHVubGlrZWx5KG1lbWNtcCgmYmktPkJTU0lELCAmd2wtPmJzc2lkLCBFVEhfQUxFTikpKSB7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwogCQl9CkBAIC0yNTk2LDcgKzI1OTEsNyBAQAogCQlpZV9sZW4gPSBiaS0+aWVfbGVuZ3RoOwogCQliZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihiaS0+YmVhY29uX3BlcmlvZCk7CiAJfSBlbHNlIHsKLQkJV0xfREJHKCgiRm91bmQgdGhlIEFQIGluIHRoZSBsaXN0IC0gQlNTSUQgJXBNXG4iLCBic3MtPmJzc2lkKSk7CisJCVdMX0RCRygiRm91bmQgdGhlIEFQIGluIHRoZSBsaXN0IC0gQlNTSUQgJXBNXG4iLCBic3MtPmJzc2lkKTsKIAkJaWUgPSBic3MtPmluZm9ybWF0aW9uX2VsZW1lbnRzOwogCQlpZV9sZW4gPSBic3MtPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50czsKIAkJYmVhY29uX2ludGVydmFsID0gYnNzLT5iZWFjb25faW50ZXJ2YWw7CkBAIC0yNjE1LDcgKzI2MTAsNyBAQAogCQllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfRFRJTVBSRCwKIAkJCSZkdGltX3BlcmlvZCwgc2l6ZW9mKGR0aW1fcGVyaW9kKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJXTENfR0VUX0RUSU1QUkQgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIldMQ19HRVRfRFRJTVBSRCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwogCQl9CiAJfQpAQCAtMjYzNiwxMyArMjYzMSwxMyBAQAogCXMzMiBlcnIgPSAwOwogCiAJd2xfZ2V0X2Fzc29jX2llcyh3bCk7Ci0JbWVtY3B5KCZ3bC0+YnNzaWQsICZlLT5hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZ3bC0+YnNzaWQsICZlLT5hZGRyLCBFVEhfQUxFTik7CiAJd2xfdXBkYXRlX2Jzc19pbmZvKHdsKTsKIAljZmc4MDIxMV9yb2FtZWQobmRldiwKIAkJCSh1OCAqKSZ3bC0+YnNzaWQsCiAJCQljb25uX2luZm8tPnJlcV9pZSwgY29ubl9pbmZvLT5yZXFfaWVfbGVuLAogCQkJY29ubl9pbmZvLT5yZXNwX2llLCBjb25uX2luZm8tPnJlc3BfaWVfbGVuLCBHRlBfS0VSTkVMKTsKLQlXTF9EQkcoKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpKTsKKwlXTF9EQkcoIlJlcG9ydCByb2FtaW5nIHJlc3VsdFxuIik7CiAKIAlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZ3bC0+c3RhdHVzKTsKIApAQCAtMjY1Nyw3ICsyNjUyLDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCXdsX2dldF9hc3NvY19pZXMod2wpOwotCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCXdsX3VwZGF0ZV9ic3NfaW5mbyh3bCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVElORywgJndsLT5zdGF0dXMpKSB7CiAJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KG5kZXYsCkBAIC0yNjY4LDE1ICsyNjYzLDE1IEBACiAJCQkJCWNvbm5faW5mby0+cmVzcF9pZV9sZW4sCiAJCQkJCWNvbXBsZXRlZCA/IFdMQU5fU1RBVFVTX1NVQ0NFU1MgOiBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQsCiAJCQkJCUdGUF9LRVJORUwpOwotCQlXTF9EQkcoKCJSZXBvcnQgY29ubmVjdCByZXN1bHQgLSBjb25uZWN0aW9uICVzXG4iLAotCQkJY29tcGxldGVkID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIikpOworCQlXTF9EQkcoIlJlcG9ydCBjb25uZWN0IHJlc3VsdCAtIGNvbm5lY3Rpb24gJXNcbiIsCisJCSAgICAgICBjb21wbGV0ZWQgPyAic3VjY2VlZGVkIiA6ICJmYWlsZWQiKTsKIAl9IGVsc2UgewogCQljZmc4MDIxMV9yb2FtZWQobmRldiwKIAkJCQkodTggKikmd2wtPmJzc2lkLAogCQkJCWNvbm5faW5mby0+cmVxX2llLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCiAJCQkJY29ubl9pbmZvLT5yZXNwX2llLCBjb25uX2luZm8tPnJlc3BfaWVfbGVuLAogCQkJCUdGUF9LRVJORUwpOwotCQlXTF9EQkcoKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpKTsKKwkJV0xfREJHKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpOwogCX0KIAlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZ3bC0+c3RhdHVzKTsKIApAQCAtMjcxNiw3ICsyNzExLDcgQEAKIAkJcmV0dXJuIHdsX3dha2V1cF9pc2Nhbih3bF90b19pc2Nhbih3bCkpOwogCiAJaWYgKHVubGlrZWx5KCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIikpOworCQlXTF9FUlIoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAodW5saWtlbHkoIXdsLT5zY2FuX3JlcXVlc3QpKSB7CkBAIC0yNzI1LDE0ICsyNzIwLDE0IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19HRVRfQ0hBTk5FTCwgJmNoYW5uZWxfaW5mb3JtLAogCQkJc2l6ZW9mKGNoYW5uZWxfaW5mb3JtKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2NhbiBidXN5ICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInNjYW4gYnVzeSAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIHNjYW5fZG9uZV9vdXQ7CiAJfQogCWNoYW5uZWxfaW5mb3JtLnNjYW5fY2hhbm5lbCA9IGR0b2gzMihjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpOwogCWlmICh1bmxpa2VseShjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpKSB7CiAKLQkJV0xfREJHKCgiY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsICglZClcbiIsCi0JCQljaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpKTsKKwkJV0xfREJHKCJjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwgKCVkKVxuIiwKKwkJICAgICAgIGNoYW5uZWxfaW5mb3JtLnNjYW5fY2hhbm5lbCk7CiAJfQogCXdsLT5ic3NfbGlzdCA9IHdsLT5zY2FuX3Jlc3VsdHM7CiAJYnNzX2xpc3QgPSB3bC0+YnNzX2xpc3Q7CkBAIC0yNzQwLDcgKzI3MzUsNyBAQAogCWJzc19saXN0LT5idWZsZW4gPSBodG9kMzIobGVuKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NDQU5fUkVTVUxUUywgYnNzX2xpc3QsIGxlbik7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiJXMgU2Nhbl9yZXN1bHRzIGVycm9yICglZClcbiIsIG5kZXYtPm5hbWUsIGVycikpOworCQlXTF9FUlIoIiVzIFNjYW5fcmVzdWx0cyBlcnJvciAoJWQpXG4iLCBuZGV2LT5uYW1lLCBlcnIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHNjYW5fZG9uZV9vdXQ7CiAJfQpAQCAtMjc5NCw1NSArMjc4OSw1NCBAQAogCiBzdGF0aWMgczMyIHdsX2luaXRfcHJpdl9tZW0oc3RydWN0IHdsX3ByaXYgKndsKQogewotCXdsLT5zY2FuX3Jlc3VsdHMgPSAodm9pZCAqKWt6YWxsb2MoV0xfU0NBTl9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+c2Nhbl9yZXN1bHRzID0ga3phbGxvYyhXTF9TQ0FOX0JVRl9NQVgsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnNjYW5fcmVzdWx0cykpIHsKLQkJV0xfRVJSKCgiU2NhbiByZXN1bHRzIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIlNjYW4gcmVzdWx0cyBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+Y29uZiA9ICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5jb25mKSwgR0ZQX0tFUk5FTCk7CisJd2wtPmNvbmYgPSBremFsbG9jKHNpemVvZigqd2wtPmNvbmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5jb25mKSkgewotCQlXTF9FUlIoKCJ3bF9jb25mIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIndsX2NvbmYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPnByb2ZpbGUgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+cHJvZmlsZSksIEdGUF9LRVJORUwpOworCXdsLT5wcm9maWxlID0ga3phbGxvYyhzaXplb2YoKndsLT5wcm9maWxlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+cHJvZmlsZSkpIHsKLQkJV0xfRVJSKCgid2xfcHJvZmlsZSBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJ3bF9wcm9maWxlIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5ic3NfaW5mbyA9ICh2b2lkICopa3phbGxvYyhXTF9CU1NfSU5GT19NQVgsIEdGUF9LRVJORUwpOworCXdsLT5ic3NfaW5mbyA9IGt6YWxsb2MoV0xfQlNTX0lORk9fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5ic3NfaW5mbykpIHsKLQkJV0xfRVJSKCgiQnNzIGluZm9ybWF0aW9uIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIkJzcyBpbmZvcm1hdGlvbiBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+c2Nhbl9yZXFfaW50ID0KLQkgICAgKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPnNjYW5fcmVxX2ludCksIEdGUF9LRVJORUwpOworCXdsLT5zY2FuX3JlcV9pbnQgPSBremFsbG9jKHNpemVvZigqd2wtPnNjYW5fcmVxX2ludCksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnNjYW5fcmVxX2ludCkpIHsKLQkJV0xfRVJSKCgiU2NhbiByZXEgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiU2NhbiByZXEgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmlvY3RsX2J1ZiA9ICh2b2lkICopa3phbGxvYyhXTF9JT0NUTF9MRU5fTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+aW9jdGxfYnVmID0ga3phbGxvYyhXTF9JT0NUTF9MRU5fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5pb2N0bF9idWYpKSB7Ci0JCVdMX0VSUigoIklvY3RsIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJJb2N0bCBidWYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmV4dHJhX2J1ZiA9ICh2b2lkICopa3phbGxvYyhXTF9FWFRSQV9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+ZXh0cmFfYnVmID0ga3phbGxvYyhXTF9FWFRSQV9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5leHRyYV9idWYpKSB7Ci0JCVdMX0VSUigoIkV4dHJhIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJFeHRyYSBidWYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmlzY2FuID0gKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPmlzY2FuKSwgR0ZQX0tFUk5FTCk7CisJd2wtPmlzY2FuID0ga3phbGxvYyhzaXplb2YoKndsLT5pc2NhbiksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPmlzY2FuKSkgewotCQlXTF9FUlIoKCJJc2NhbiBidWYgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiSXNjYW4gYnVmIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5mdyA9ICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5mdyksIEdGUF9LRVJORUwpOworCXdsLT5mdyA9IGt6YWxsb2Moc2l6ZW9mKCp3bC0+ZncpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5mdykpIHsKLQkJV0xfRVJSKCgiZncgb2JqZWN0IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoImZ3IG9iamVjdCBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+cG1rX2xpc3QgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+cG1rX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwl3bC0+cG1rX2xpc3QgPSBremFsbG9jKHNpemVvZigqd2wtPnBta19saXN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+cG1rX2xpc3QpKSB7Ci0JCVdMX0VSUigoInBtayBsaXN0IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoInBtayBsaXN0IGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQogCkBAIC0yODg0LDcgKzI4NzgsNyBAQAogCXdsLT5ldmVudF90c2sgPSBrdGhyZWFkX3J1bih3bF9ldmVudF9oYW5kbGVyLCB3bCwgIndsX2V2ZW50X2hhbmRsZXIiKTsKIAlpZiAoSVNfRVJSKHdsLT5ldmVudF90c2spKSB7CiAJCXdsLT5ldmVudF90c2sgPSBOVUxMOwotCQlXTF9FUlIoKCJmYWlsZWQgdG8gY3JlYXRlIGV2ZW50IHRocmVhZFxuIikpOworCQlXTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgZXZlbnQgdGhyZWFkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJldHVybiAwOwpAQCAtMjkxNyw3ICsyOTExLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdsX3RvX25kZXYod2wpOwogCiAJaWYgKHVubGlrZWx5KCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIikpOworCQlXTF9FUlIoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGxpa2VseSh3bC0+c2Nhbl9yZXF1ZXN0KSkgewpAQCAtMjkzMSw3ICsyOTI1LDcgQEAKIHN0YXRpYyBzMzIgd2xfd2FrZXVwX2lzY2FuKHN0cnVjdCB3bF9pc2Nhbl9jdHJsICppc2NhbikKIHsKIAlpZiAobGlrZWx5KGlzY2FuLT5zdGF0ZSAhPSBXTF9JU0NBTl9TVEFURV9JRExFKSkgewotCQlXTF9EQkcoKCJ3YWtlIHVwIGlzY2FuXG4iKSk7CisJCVdMX0RCRygid2FrZSB1cCBpc2NhblxuIik7CiAJCXVwKCZpc2Nhbi0+c3luYyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI5NjEsMTQgKzI5NTUsMTQgQEAKIAkJCQlXTF9JU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUsIGlzY2FuLT5zY2FuX2J1ZiwKIAkJCQlXTF9JU0NBTl9CVUZfTUFYKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXN1bHRzLT5idWZsZW4gPSBkdG9oMzIocmVzdWx0cy0+YnVmbGVuKTsKIAlyZXN1bHRzLT52ZXJzaW9uID0gZHRvaDMyKHJlc3VsdHMtPnZlcnNpb24pOwogCXJlc3VsdHMtPmNvdW50ID0gZHRvaDMyKHJlc3VsdHMtPmNvdW50KTsKLQlXTF9EQkcoKCJyZXN1bHRzLT5jb3VudCA9ICVkXG4iLCByZXN1bHRzLT5jb3VudCkpOwotCVdMX0RCRygoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pKTsKKwlXTF9EQkcoInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KTsKKwlXTF9EQkcoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pOwogCSpzdGF0dXMgPSBkdG9oMzIobGlzdF9idWYtPnN0YXR1cyk7CiAJKmJzc19saXN0ID0gcmVzdWx0czsKIApAQCAtMzA1Myw3ICszMDQ3LDcgQEAKIAkJZXJyID0gd2xfZ2V0X2lzY2FuX3Jlc3VsdHMoaXNjYW4sICZzdGF0dXMsICZ3bC0+YnNzX2xpc3QpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJc3RhdHVzID0gV0xfU0NBTl9SRVNVTFRTX0FCT1JURUQ7Ci0JCQlXTF9FUlIoKCJBYm9ydCBpc2NhblxuIikpOworCQkJV0xfRVJSKCJBYm9ydCBpc2NhblxuIik7CiAJCX0KIAkJcnRubF91bmxvY2soKTsKIAkJZWwtPmhhbmRsZXJbc3RhdHVzXSAod2wpOwpAQCAtMzA2Miw3ICszMDU2LDcgQEAKIAkJZGVsX3RpbWVyX3N5bmMoJmlzY2FuLT50aW1lcik7CiAJCWlzY2FuLT50aW1lcl9vbiA9IDA7CiAJfQotCVdMX0RCRygoIiVzIHdhcyB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0RCRygiJXMgd2FzIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzA3Myw3ICszMDY3LDcgQEAKIAogCWlmIChpc2NhbikgewogCQlpc2Nhbi0+dGltZXJfb24gPSAwOwotCQlXTF9EQkcoKCJ0aW1lciBleHBpcmVkXG4iKSk7CisJCVdMX0RCRygidGltZXIgZXhwaXJlZFxuIik7CiAJCXdsX3dha2V1cF9pc2Nhbihpc2Nhbik7CiAJfQogfQpAQCAtMzA4OCw3ICszMDgyLDcgQEAKIAkJc2VtYV9pbml0KCZpc2Nhbi0+c3luYywgMCk7CiAJCWlzY2FuLT50c2sgPSBrdGhyZWFkX3J1bih3bF9pc2Nhbl90aHJlYWQsIGlzY2FuLCAid2xfaXNjYW4iKTsKIAkJaWYgKElTX0VSUihpc2Nhbi0+dHNrKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpOwogCQkJaXNjYW4tPnRzayA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMzEyMyw3ICszMTE3LDcgQEAKIAkJc2VtYV9pbml0KCZpc2Nhbi0+c3luYywgMCk7CiAJCWlzY2FuLT50c2sgPSBrdGhyZWFkX3J1bih3bF9pc2Nhbl90aHJlYWQsIGlzY2FuLCAid2xfaXNjYW4iKTsKIAkJaWYgKElTX0VSUihpc2Nhbi0+dHNrKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpOwogCQkJaXNjYW4tPnRzayA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMzE5MiwxNyArMzE4NiwxNyBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFuZGV2KSkgewotCQlXTF9FUlIoKCJuZGV2IGlzIGludmFpbGRcbiIpKTsKKwkJV0xfRVJSKCJuZGV2IGlzIGludmFsaWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJd2xfY2ZnODAyMTFfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsX2RldiksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2xfY2ZnODAyMTFfZGV2KSkgewotCQlXTF9FUlIoKCJ3bF9jZmc4MDIxMV9kZXYgaXMgaW52YWxpZFxuIikpOworCQlXTF9FUlIoIndsX2NmZzgwMjExX2RldiBpcyBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCVdMX0RCRygoImZ1bmMgJXBcbiIsIHdsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKSkpOworCVdMX0RCRygiZnVuYyAlcFxuIiwgd2xfY2ZnODAyMTFfZ2V0X3NkaW9fZnVuYygpKTsKIAl3ZGV2ID0gd2xfYWxsb2Nfd2RldihzaXplb2Yoc3RydWN0IHdsX2lmYWNlKSwgJndsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKS0+ZGV2KTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHdkZXYpKSkKKwlpZiAoSVNfRVJSKHdkZXYpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdkZXYtPmlmdHlwZSA9IHdsX21vZGVfdG9fbmw4MDIxMV9pZnR5cGUoV0xfTU9ERV9CU1MpOwpAQCAtMzIxNiw3ICszMjEwLDcgQEAKIAl3ZGV2LT5uZXRkZXYgPSBuZGV2OwogCWVyciA9IHdsX2luaXRfcHJpdih3bCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRmFpbGVkIHRvIGluaXQgaXdtX3ByaXYgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRmFpbGVkIHRvIGluaXQgaXdtX3ByaXYgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBjZmc4MDIxMV9hdHRhY2hfb3V0OwogCX0KIAl3bF9zZXRfZHJ2ZGF0YSh3bF9jZmc4MDIxMV9kZXYsIGNpKTsKQEAgLTMyNjEsMTkgKzMyNTUsMTkgQEAKIAkJCWJyZWFrOwogCQllID0gd2xfZGVxX2V2ZW50KHdsKTsKIAkJaWYgKHVubGlrZWx5KCFlKSkgewotCQkJV0xfRVJSKCgiZXFldWUgZW1wdHkuLlxuIikpOworCQkJV0xfRVJSKCJldmVudCBxdWV1ZSBlbXB0eS4uLlxuIik7CiAJCQlCVUcoKTsKIAkJfQotCQlXTF9EQkcoKCJldmVudCB0eXBlICglZClcbiIsIGUtPmV0eXBlKSk7CisJCVdMX0RCRygiZXZlbnQgdHlwZSAoJWQpXG4iLCBlLT5ldHlwZSk7CiAJCWlmICh3bC0+ZWwuaGFuZGxlcltlLT5ldHlwZV0pIHsKIAkJCXdsLT5lbC5oYW5kbGVyW2UtPmV0eXBlXSAod2wsIHdsX3RvX25kZXYod2wpLCAmZS0+ZW1zZywKIAkJCQkJCSAgZS0+ZWRhdGEpOwogCQl9IGVsc2UgewotCQkJV0xfREJHKCgiVW5rbm93biBFdmVudCAoJWQpOiBpZ25vcmluZ1xuIiwgZS0+ZXR5cGUpKTsKKwkJCVdMX0RCRygiVW5rbm93biBFdmVudCAoJWQpOiBpZ25vcmluZ1xuIiwgZS0+ZXR5cGUpOwogCQl9CiAJCXdsX3B1dF9ldmVudChlKTsKIAl9Ci0JV0xfREJHKCgiJXMgd2FzIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKSk7CisJV0xfREJHKCIlcyB3YXMgdGVybWluYXRlZFxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0zMjg2LDcgKzMyODAsNyBAQAogCXM4ICplc3RyID0gKGV2ZW50X3R5cGUgPD0gc2l6ZW9mKHdsX2RiZ19lc3RyKSAvIFdMX0RCR19FU1RSX01BWCAtIDEpID8KIAkgICAgd2xfZGJnX2VzdHJbZXZlbnRfdHlwZV0gOiAoczggKikgIlVua25vd24iOwogI2VuZGlmCQkJCS8qIChXTF9EQkdfTEVWRUwgPiAwKSAqLwotCVdMX0RCRygoImV2ZW50X3R5cGUgKCVkKToiICJXTENfRV8iICIlc1xuIiwgZXZlbnRfdHlwZSwgZXN0cikpOworCVdMX0RCRygiZXZlbnRfdHlwZSAoJWQpOiIgIldMQ19FXyIgIiVzXG4iLCBldmVudF90eXBlLCBlc3RyKTsKIAlpZiAobGlrZWx5KCF3bF9lbnFfZXZlbnQod2wsIGV2ZW50X3R5cGUsIGUsIGRhdGEpKSkKIAkJd2xfd2FrZXVwX2V2ZW50KHdsKTsKIH0KQEAgLTMzNDEsNyArMzMzNSw3IEBACiAKIAllID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsX2V2ZW50X3EpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWUpKSB7Ci0JCVdMX0VSUigoImV2ZW50IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoImV2ZW50IGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzM4NSw4ICszMzc5LDggQEAKIAlzd2l0Y2ggKGlmdHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJV0xfRVJSKCgidHlwZSAoJWQpIDogY3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgbW9kZVxuIiwKLQkJCWlmdHlwZSkpOworCQlXTF9FUlIoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIG1vZGVcbiIsCisJCSAgICAgICBpZnR5cGUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlyZXR1cm4gZXJyOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CkBAIC0zMzk2LDIwICszMzkwLDIwIEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7Ci0JCVdMX0VSUigoImludmFsaWQgdHlwZSAoJWQpXG4iLCBpZnR5cGUpKTsKKwkJV0xfRVJSKCJpbnZhbGlkIHR5cGUgKCVkKVxuIiwgaWZ0eXBlKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaW5mcmEgPSBodG9kMzIoaW5mcmEpOwogCWFwID0gaHRvZDMyKGFwKTsKLQlXTF9EQkcoKCIlcyBhcCAoJWQpLCBpbmZyYSAoJWQpXG4iLCBuZGV2LT5uYW1lLCBhcCwgaW5mcmEpKTsKKwlXTF9EQkcoIiVzIGFwICglZCksIGluZnJhICglZClcbiIsIG5kZXYtPm5hbWUsIGFwLCBpbmZyYSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0lORlJBIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0FQLCAmYXAsIHNpemVvZihhcCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzQzMSw3ICszNDI1LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfVVAsICZ1cCwgc2l6ZW9mKHVwKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1VQIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19VUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMzQ0Miw3ICszNDM2LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1BNLCAmcG93ZXJfbW9kZSwgc2l6ZW9mKHBvd2VyX21vZGUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX1BNIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfUE0gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM0NTksMTQgKzM0NTMsMTQgQEAKIAkJICAgIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInR4Z2xvbWFsaWduIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInR4Z2xvbWFsaWduIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX2dsb21fb3V0OwogCX0KIAkvKiBkaXNhYmxlIGdsb20gb3B0aW9uIHBlciBkZWZhdWx0ICovCiAJYmNtX21raW92YXIoImJ1czp0eGdsb20iLCAoY2hhciAqKSZnbG9tLCA0LCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInR4Z2xvbSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJ0eGdsb20gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBkb25nbGVfZ2xvbV9vdXQ7CiAJfQogZG9uZ2xlX2dsb21fb3V0OgpAQCAtMzQ4Nyw3ICszNDgxLDcgQEAKIAkJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJiY25fdGltZW91dCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYmNuX3RpbWVvdXQgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7CiAJCX0KIAl9CkBAIC0zNDk2LDcgKzM0OTAsNyBAQAogCWJjbV9ta2lvdmFyKCJyb2FtX29mZiIsIChjaGFyICopJnJvYW12YXIsIDQsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgicm9hbV9vZmYgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigicm9hbV9vZmYgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBkb25nbGVfcm9tX291dDsKIAl9CiBkb25nbGVfcm9tX291dDoKQEAgLTM1MTYsNyArMzUxMCw3IEBACiAJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19HRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJHZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJHZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGRvbmdsZV9ldmVudG1zZ19vdXQ7CiAJfQogCW1lbWNweShldmVudG1hc2ssIGlvdmJ1ZiwgV0xfRVZFTlRJTkdfTUFTS19MRU4pOwpAQCAtMzU0NCw3ICszNTM4LDcgQEAKIAkJICAgIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIlNldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIlNldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX2V2ZW50bXNnX291dDsKIAl9CiAKQEAgLTM1NjIsOSArMzU1Niw5IEBACiAJCQlzaXplb2Yoc2Nhbl9hc3NvY190aW1lKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiU2NhbiBhc3NvYyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oIlNjYW4gYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIlNjYW4gYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiU2NhbiBhc3NvYyB0aW1lIGVycm9yICglZClcbiIsIGVycik7CiAJCX0KIAkJZ290byBkb25nbGVfc2NhbnRpbWVfb3V0OwogCX0KQEAgLTM1NzIsOSArMzU2Niw5IEBACiAJCQlzaXplb2Yoc2Nhbl91bmFzc29jX3RpbWUpKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApIHsKLQkJCVdMX0lORk8oKCJTY2FuIHVuYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJTY2FuIHVuYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIlNjYW4gdW5hc3NvYyB0aW1lIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJTY2FuIHVuYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCWdvdG8gZG9uZ2xlX3NjYW50aW1lX291dDsKIAl9CkBAIC0zNTk1LDkgKzM1ODksOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKQotCQkJV0xfSU5GTygoImFycG9lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oImFycG9lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQllbHNlCi0JCQlXTF9FUlIoKCJhcnBvZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYXJwb2UgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAogCQlnb3RvIGRvbmdsZV9vZmZsb2FkX291dDsKIAl9CkBAIC0zNjA1LDkgKzM1OTksOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKQotCQkJV0xfSU5GTygoImFycF9vbCBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJhcnBfb2wgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCWVsc2UKLQkJCVdMX0VSUigoImFycF9vbCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYXJwX29sIGVycm9yICglZClcbiIsIGVycik7CiAKIAkJZ290byBkb25nbGVfb2ZmbG9hZF9vdXQ7CiAJfQpAQCAtMzYyMCwxMiArMzYxNCwxMiBAQAogewogCWludCBpOwogCWlmIChzdHJuY21wKHNyYywgIjB4IiwgMikgIT0gMCAmJiBzdHJuY21wKHNyYywgIjBYIiwgMikgIT0gMCkgewotCQlXTF9FUlIoKCJNYXNrIGludmFsaWQgZm9ybWF0LiBOZWVkcyB0byBzdGFydCB3aXRoIDB4XG4iKSk7CisJCVdMX0VSUigiTWFzayBpbnZhbGlkIGZvcm1hdC4gTmVlZHMgdG8gc3RhcnQgd2l0aCAweFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJc3JjID0gc3JjICsgMjsJCS8qIFNraXAgcGFzdCAweCAqLwogCWlmIChzdHJsZW4oc3JjKSAlIDIgIT0gMCkgewotCQlXTF9FUlIoKCJNYXNrIGludmFsaWQgZm9ybWF0LiBOZWVkcyB0byBiZSBvZiBldmVuIGxlbmd0aFxuIikpOworCQlXTF9FUlIoIk1hc2sgaW52YWxpZCBmb3JtYXQuIE5lZWRzIHRvIGJlIG9mIGV2ZW4gbGVuZ3RoXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlmb3IgKGkgPSAwOyAqc3JjICE9ICdcMCc7IGkrKykgewpAQCAtMzY4NCw3ICszNjc4LDcgQEAKIAkJCQkJICAgICAgbWFza19hbmRfcGF0dGVyblttYXNrX3NpemVdKSk7CiAKIAlpZiAobWFza19zaXplICE9IHBhdHRlcm5fc2l6ZSkgewotCQlXTF9FUlIoKCJNYXNrIGFuZCBwYXR0ZXJuIG5vdCB0aGUgc2FtZSBzaXplXG4iKSk7CisJCVdMX0VSUigiTWFzayBhbmQgcGF0dGVybiBub3QgdGhlIHNhbWUgc2l6ZVxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZ2xlX2ZpbHRlcl9vdXQ7CiAJfQpAQCAtMzcwNCw5ICszNjk4LDkgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGJ1ZiwgYnVmX2xlbik7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiZmlsdGVyIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oImZpbHRlciBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoImZpbHRlciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZmlsdGVyICglZClcbiIsIGVycik7CiAJCX0KIAkJZ290byBkb25nbGVfZmlsdGVyX291dDsKIAl9CkBAIC0zNzE3LDkgKzM3MTEsOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiZmlsdGVyX21vZGUgbm90IHN1cHBvcnRlZFxuIikpOworCQkJV0xfSU5GTygiZmlsdGVyX21vZGUgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJmaWx0ZXJfbW9kZSAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZmlsdGVyX21vZGUgKCVkKVxuIiwgZXJyKTsKIAkJfQogCQlnb3RvIGRvbmdsZV9maWx0ZXJfb3V0OwogCX0KQEAgLTM4MDAsMTIgKzM3OTQsMTIgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfUEhZTElTVCwgJnBoeV9saXN0LAogCQkJc2l6ZW9mKHBoeV9saXN0KSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlwaHkgPSAoKGNoYXIgKikmcGh5X2xpc3QpWzFdOwotCVdMX0RCRygoIiVjIHBoeVxuIiwgcGh5KSk7CisJV0xfREJHKCIlYyBwaHlcbiIsIHBoeSk7CiAJaWYgKHBoeSA9PSAnbicgfHwgcGh5ID09ICdhJykgewogCQl3aXBoeSA9IHdsX3RvX3dpcGh5KHdsKTsKIAkJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gJl9fd2xfYmFuZF81Z2h6X247CkBAIC0zOTExLDcgKzM5MDUsNyBAQAogCWNhc2UgV0xfUFJPRl9TU0lEOgogCQlyZXR1cm4gJndsLT5wcm9maWxlLT5zc2lkOwogCX0KLQlXTF9FUlIoKCJpbnZhbGlkIGl0ZW0gKCVkKVxuIiwgaXRlbSkpOworCVdMX0VSUigiaW52YWxpZCBpdGVtICglZClcbiIsIGl0ZW0pOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zOTMyLDkgKzM5MjYsOSBAQAogCQlicmVhazsKIAljYXNlIFdMX1BST0ZfQlNTSUQ6CiAJCWlmIChkYXRhKQotCQkJbWVtY3B5KHdsLT5wcm9maWxlLT5ic3NpZCwgZGF0YSwgRVRIRVJfQUREUl9MRU4pOworCQkJbWVtY3B5KHdsLT5wcm9maWxlLT5ic3NpZCwgZGF0YSwgRVRIX0FMRU4pOwogCQllbHNlCi0JCQltZW1zZXQod2wtPnByb2ZpbGUtPmJzc2lkLCAwLCBFVEhFUl9BRERSX0xFTik7CisJCQltZW1zZXQod2wtPnByb2ZpbGUtPmJzc2lkLCAwLCBFVEhfQUxFTik7CiAJCWJyZWFrOwogCWNhc2UgV0xfUFJPRl9TRUM6CiAJCW1lbWNweSgmd2wtPnByb2ZpbGUtPnNlYywgZGF0YSwgc2l6ZW9mKHdsLT5wcm9maWxlLT5zZWMpKTsKQEAgLTM5NDksNyArMzk0Myw3IEBACiAJCXdsLT5wcm9maWxlLT5kdGltX3BlcmlvZCA9ICoodTggKilkYXRhOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlIoKCJ1bnN1cHBvcnRlZCBpdGVtICglZClcbiIsIGl0ZW0pKTsKKwkJV0xfRVJSKCJ1bnN1cHBvcnRlZCBpdGVtICglZClcbiIsIGl0ZW0pOwogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQpAQCAtMzk5MSw3ICszOTg1LDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShpZS0+b2Zmc2V0ICsgbCArIDIgPiBXTF9UTFZfSU5GT19NQVgpKSB7Ci0JCVdMX0VSUigoImVpIGNyb3NzZXMgYnVmZmVyIGJvdW5kYXJ5XG4iKSk7CisJCVdMX0VSUigiZWkgY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJaWUtPmJ1ZltpZS0+b2Zmc2V0XSA9IHQ7CkBAIC00MDA4LDcgKzQwMDIsNyBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KGllLT5vZmZzZXQgKyBpZV9zaXplID4gV0xfVExWX0lORk9fTUFYKSkgewotCQlXTF9FUlIoKCJlaV9zdHJlYW0gY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpKTsKKwkJV0xfRVJSKCJlaV9zdHJlYW0gY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJbWVtY3B5KCZpZS0+YnVmW2llLT5vZmZzZXRdLCBpZV9zdHJlYW0sIGllX3NpemUpOwpAQCAtNDAyMyw3ICs0MDE3LDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShpZS0+b2Zmc2V0ID4gZHN0X3NpemUpKSB7Ci0JCVdMX0VSUigoImRzdF9zaXplIGlzIG5vdCBlbm91Z2hcbiIpKTsKKwkJV0xfRVJSKCJkc3Rfc2l6ZSBpcyBub3QgZW5vdWdoXG4iKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCW1lbWNweShkc3QsICZpZS0+YnVmWzBdLCBpZS0+b2Zmc2V0KTsKQEAgLTQxMjMsMzcgKzQxMTcsMzcgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoImZpbGUgbmFtZSA6IFwiJXNcIlxuIiwgZmlsZV9uYW1lKSk7CisJV0xfREJHKCJmaWxlIG5hbWUgOiBcIiVzXCJcbiIsIGZpbGVfbmFtZSk7CiAJd2wgPSBXTF9QUklWX0dFVCgpOwogCiAJaWYgKCF0ZXN0X2JpdChXTF9GV19MT0FESU5HX0RPTkUsICZ3bC0+ZnctPnN0YXR1cykpIHsKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LT5md19lbnRyeSwgZmlsZV9uYW1lLAogCQkJCSZ3bF9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldik7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZG93bmxvYWQgZncgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBkb3dubG9hZCBmdyAoJWQpXG4iLCBlcnIpOwogCQkJZ290byByZXFfZndfb3V0OwogCQl9CiAJCXNldF9iaXQoV0xfRldfTE9BRElOR19ET05FLCAmd2wtPmZ3LT5zdGF0dXMpOwogCQlmd19lbnRyeSA9IHdsLT5mdy0+ZndfZW50cnk7CiAJCWlmIChmd19lbnRyeSkgewotCQkJV0xfREJHKCgiZncgc2l6ZSAoJXpkKSwgZGF0YSAoJXApXG4iLCBmd19lbnRyeS0+c2l6ZSwKLQkJCQlmd19lbnRyeS0+ZGF0YSkpOworCQkJV0xfREJHKCJmdyBzaXplICglemQpLCBkYXRhICglcClcbiIsCisJCQkgICAgICAgZndfZW50cnktPnNpemUsIGZ3X2VudHJ5LT5kYXRhKTsKIAkJfQogCX0gZWxzZSBpZiAoIXRlc3RfYml0KFdMX05WUkFNX0xPQURJTkdfRE9ORSwgJndsLT5mdy0+c3RhdHVzKSkgewogCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZ3bC0+ZnctPmZ3X2VudHJ5LCBmaWxlX25hbWUsCiAJCQkJJndsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKS0+ZGV2KTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoIkNvdWxkIG5vdCBkb3dubG9hZCBudnJhbSAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGRvd25sb2FkIG52cmFtICglZClcbiIsIGVycik7CiAJCQlnb3RvIHJlcV9md19vdXQ7CiAJCX0KIAkJc2V0X2JpdChXTF9OVlJBTV9MT0FESU5HX0RPTkUsICZ3bC0+ZnctPnN0YXR1cyk7CiAJCWZ3X2VudHJ5ID0gd2wtPmZ3LT5md19lbnRyeTsKIAkJaWYgKGZ3X2VudHJ5KSB7Ci0JCQlXTF9EQkcoKCJudnJhbSBzaXplICglemQpLCBkYXRhICglcClcbiIsIGZ3X2VudHJ5LT5zaXplLAotCQkJCWZ3X2VudHJ5LT5kYXRhKSk7CisJCQlXTF9EQkcoIm52cmFtIHNpemUgKCV6ZCksIGRhdGEgKCVwKVxuIiwKKwkJCSAgICAgICBmd19lbnRyeS0+c2l6ZSwgZndfZW50cnktPmRhdGEpOwogCQl9CiAJfSBlbHNlIHsKLQkJV0xfREJHKCgiRG93bmxvYWRpbmcgYWxyZWFkeSBkb25lLiBOb3RoaW5nIHRvIGRvIG1vcmVcbiIpKTsKKwkJV0xfREJHKCJEb3dubG9hZGluZyBhbHJlYWR5IGRvbmUuIE5vdGhpbmcgdG8gZG8gbW9yZVxuIik7CiAJCWVyciA9IC1FUEVSTTsKIAl9CiAKQEAgLTQxODksMTAgKzQxODMsMTAgQEAKIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KG5kZXYsICJtcGMiLCBtcGMpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImZhaWwgdG8gc2V0IG1wY1xuIikpOworCQlXTF9FUlIoImZhaWwgdG8gc2V0IG1wY1xuIik7CiAJCXJldHVybjsKIAl9Ci0JV0xfREJHKCgiTVBDIDogJWRcbiIsIG1wYykpOworCVdMX0RCRygiTVBDIDogJWRcbiIsIG1wYyk7CiB9CiAKIHN0YXRpYyBpbnQgd2xfZGVidWdmc19hZGRfbmV0ZGV2X3BhcmFtcyhzdHJ1Y3Qgd2xfcHJpdiAqd2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmgKaW5kZXggNzcwZTYzZi4uNDgyNjkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaApAQCAtNTQsMzQgKzU0LDM2IEBACiAKICNkZWZpbmUgV0xfREJHX0xFVkVMIDEJCS8qIDAgaW52YWxpZGF0ZXMgYWxsIGRlYnVnIG1lc3NhZ2VzLgogCQkJCSBkZWZhdWx0IGlzIDEgKi8KLSNkZWZpbmUJV0xfRVJSKGFyZ3MpCQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCQlcCi0JaWYgKHdsX2RiZ19sZXZlbCAmIFdMX0RCR19FUlIpIHsJCQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBAJXMgOiAiLCBfX2Z1bmNfXyk7CVwKLQkJCXByaW50ayBhcmdzOwkJCQkJCVwKLQkJfSAJCQkJCQkJCVwKLQl9CQkJCQkJCQkJXAorI2RlZmluZQlXTF9FUlIoZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh3bF9kYmdfbGV2ZWwgJiBXTF9EQkdfRVJSKSB7CQkJXAorCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1IgQCVzIDogIiBmbXQsCVwKKwkJCSAgICAgICBfX2Z1bmNfXywgIyNhcmdzKTsJCVwKKwkJfQkJCQkJCVwKKwl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCi0jZGVmaW5lCVdMX0lORk8oYXJncykJCQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJCVwKLQlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0lORk8pIHsJCQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICJJTkZPIEAlcyA6ICIsIF9fZnVuY19fKTsJXAotCQkJcHJpbnRrIGFyZ3M7CQkJCQkJXAotCQl9CQkJCQkJCQlcCi0JfQkJCQkJCQkJCVwKKworI2RlZmluZQlXTF9JTkZPKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0lORk8pIHsJCQlcCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsJCQkJXAorCQkJcHJpbnRrKEtFUk5fRVJSICJJTkZPIEAlcyA6ICIgZm10LAlcCisJCQkgICAgICAgX19mdW5jX18sICMjYXJncyk7CQlcCisJCX0JCQkJCQlcCisJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQorCiAjaWYgKFdMX0RCR19MRVZFTCA+IDApCi0jZGVmaW5lCVdMX0RCRyhhcmdzKQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKKyNkZWZpbmUJV0xfREJHKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKIAlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0RCRykgewkJCVwKLQkJcHJpbnRrKEtFUk5fRVJSICJERUJVRyBAJXMgOiIsIF9fZnVuY19fKTsJXAotCQlwcmludGsgYXJnczsJCQkJCQkJXAotCX0JCQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiREVCVUcgQCVzIDoiIGZtdCwJCVwKKwkJICAgICAgIF9fZnVuY19fLCAjI2FyZ3MpOwkJCVwKKwl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAjZWxzZQkJCQkvKiAhKFdMX0RCR19MRVZFTCA+IDApICovCi0jZGVmaW5lCVdMX0RCRyhhcmdzKQorI2RlZmluZQlXTF9EQkcoZm10LCBhcmdzLi4uKSBub3ByaW50ayhmbXQsICMjYXJncykKICNlbmRpZgkJCQkvKiAoV0xfREJHX0xFVkVMID4gMCkgKi8KIAogI2RlZmluZSBXTF9TQ0FOX1JFVFJZX01BWAkzCS8qIHVzZWQgZm9yIGlic3Mgc2NhbiAqLwpAQCAtMjM3LDcgKzIzOSw3IEBACiBzdHJ1Y3Qgd2xfcHJvZmlsZSB7CiAJdTMyIG1vZGU7CiAJc3RydWN0IHdsY19zc2lkIHNzaWQ7Ci0JdTggYnNzaWRbRVRIRVJfQUREUl9MRU5dOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1MTYgYmVhY29uX2ludGVydmFsOwogCXU4IGR0aW1fcGVyaW9kOwogCXN0cnVjdCB3bF9zZWN1cml0eSBzZWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKaW5kZXggOTc5YTQ5NC4uZGI2ZTY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYwpAQCAtMTUsOCArMTUsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCkBAIC0zMSwyMCArMzIsMTggQEAKICNpbmNsdWRlIDxkaGQuaD4KICNpbmNsdWRlIDxkaGRpb2N0bC5oPgogCi10eXBlZGVmIHZvaWQgd2xjX2luZm9fdDsKLXR5cGVkZWYgdm9pZCB3bF9pbmZvX3Q7CiB0eXBlZGVmIGNvbnN0IHN0cnVjdCBzaV9wdWIgc2lfdDsKICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAKICNpbmNsdWRlIDxwcm90by9ldGhlcm5ldC5oPgogI2luY2x1ZGUgPGRuZ2xfc3RhdHMuaD4KICNpbmNsdWRlIDxkaGQuaD4KLSNkZWZpbmUgV0xfRVJST1IoeCkgcHJpbnRmIHgKLSNkZWZpbmUgV0xfVFJBQ0UoeCkKLSNkZWZpbmUgV0xfQVNTT0MoeCkKLSNkZWZpbmUgV0xfSU5GT1JNKHgpCi0jZGVmaW5lIFdMX1dTRUMoeCkKLSNkZWZpbmUgV0xfU0NBTih4KQorCisjZGVmaW5lIFdMX0VSUk9SKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfSU5GT1JNKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9XU0VDKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9TQ0FOKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjaW5jbHVkZSA8d2xfaXcuaD4KIApAQCAtMTg3LDEyICsxODYsMTIgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWlmICghZGV2KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGRldiBpcyBudWxsXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IGRldiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JV0xfSU5GT1JNKCgiXG4lcywgUElEOiV4OiBzZW5kIExvY2FsIElPQ1RMIC0+IGRoZDogY21kOjB4JXgsIGJ1ZjolcCwgIgotCQkibGVuOiVkICxcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCBsZW4pKTsKKwlXTF9JTkZPUk0oIlxuJXMsIFBJRDoleDogc2VuZCBMb2NhbCBJT0NUTCAtPiBkaGQ6IGNtZDoweCV4LCBidWY6JXAsIGxlbjolZFxuIiwKKwkJICBfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjbWQsIGFyZywgbGVuKTsKIAogCWlmIChnX29ub2ZmID09IEdfV0xBTl9TRVRfT04pIHsKIAkJbWVtc2V0KCZpb2MsIDAsIHNpemVvZihpb2MpKTsKQEAgLTIwNSw3ICsyMDQsNyBAQAogCiAJCXJldCA9IGRldl9vcGVuKGRldik7CiAJCWlmIChyZXQpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEVycm9yIGRldl9vcGVuOiAlZFxuIiwgX19mdW5jX18sIHJldCkpOworCQkJV0xfRVJST1IoIiVzOiBFcnJvciBkZXZfb3BlbjogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC0yMTQsNyArMjEzLDcgQEAKIAkJcmV0ID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCAmaWZyLCBTSU9DREVWUFJJVkFURSk7CiAJCXNldF9mcyhmcyk7CiAJfSBlbHNlIHsKLQkJV0xfVFJBQ0UoKCIlczogY2FsbCBhZnRlciBkcml2ZXIgc3RvcCA6IGlnbm9yZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX1RSQUNFKCIlczogY2FsbCBhZnRlciBkcml2ZXIgc3RvcCA6IGlnbm9yZWRcbiIsIF9fZnVuY19fKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTMzNSw3ICszMzQsNyBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3Qgc29ja2FkZHIgYnNzaWQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXQ09NTUlUXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdDT01NSVRcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX1NTSUQsICZzc2lkLCBzaXplb2Yoc3NpZCkpOwogCWlmIChlcnJvcikKQEAgLTM0NiwxMSArMzQ1LDExIEBACiAJaWYgKCFzc2lkLlNTSURfbGVuKQogCQlyZXR1cm4gMDsKIAotCWJ6ZXJvKCZic3NpZCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOwotCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19SRUFTU09DLCAmYnNzaWQsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1zZXQoJmJzc2lkLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1JFQVNTT0MsICZic3NpZCwgRVRIX0FMRU4pOwogCWlmIChlcnJvcikgewotCQlXTF9FUlJPUigoIiVzOiBXTENfUkVBU1NPQyB0byAlcyBmYWlsZWQgXG4iLCBfX2Z1bmNfXywKLQkJCSAgc3NpZC5TU0lEKSk7CisJCVdMX0VSUk9SKCIlczogV0xDX1JFQVNTT0MgdG8gJXMgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fLCBzc2lkLlNTSUQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC0zNjEsNyArMzYwLDcgQEAKIHdsX2l3X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQogewotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdOQU1FXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdOQU1FXG4iLCBkZXYtPm5hbWUpOwogCiAJc3RyY3B5KGN3cnEsICJJRUVFIDgwMi4xMS1EUyIpOwogCkBAIC0zNzUsNyArMzc0LDcgQEAKIAlpbnQgZXJyb3IsIGNoYW47CiAJdWludCBzZiA9IDA7CiAKLQlXTF9UUkFDRSgoIlxuICVzICVzOiBTSU9DU0lXRlJFUVxuIiwgX19mdW5jX18sIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCJcbiAlcyAlczogU0lPQ1NJV0ZSRVFcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogCiAJaWYgKGZ3cnEtPmUgPT0gMCAmJiBmd3JxLT5tIDwgTUFYQ0hBTk5FTCkgewogCQljaGFuID0gZndycS0+bTsKQEAgLTQxMCw3ICs0MDksNyBAQAogCWNoYW5uZWxfaW5mb190IGNpOwogCWludCBlcnJvcjsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdGUkVRXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdGUkVRXG4iLCBkZXYtPm5hbWUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9DSEFOTkVMLCAmY2ksIHNpemVvZihjaSkpOwogCWlmIChlcnJvcikKQEAgLTQyNyw3ICs0MjYsNyBAQAogewogCWludCBpbmZyYSA9IDAsIGFwID0gMCwgZXJyb3IgPSAwOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV01PREVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV01PREVcbiIsIGRldi0+bmFtZSk7CiAKIAlzd2l0Y2ggKCp1d3JxKSB7CiAJY2FzZSBJV19NT0RFX01BU1RFUjoKQEAgLTQ2Miw3ICs0NjEsNyBAQAogewogCWludCBlcnJvciwgaW5mcmEgPSAwLCBhcCA9IDA7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXTU9ERVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXTU9ERVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKGVycm9yKQpAQCAtNTAxLDE0ICs1MDAsMTQgQEAKIAl7MzAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDB9CiAJfTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdSQU5HRVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUkFOR0VcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoYW5uZWxzID0ga21hbGxvYygoTUFYQ0hBTk5FTCArIDEpICogNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGFubmVscykgewotCQlXTF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvYyBjaGFubmVsc1xuIikpOworCQlXTF9FUlJPUigiQ291bGQgbm90IGFsbG9jIGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWxpc3QgPSAod2xfdTMyX2xpc3RfdCAqKSBjaGFubmVsczsKQEAgLTY4NCwxNCArNjgzLDE0IEBACiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWV4dHJhOwogCWludCBpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1NQWVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXU1BZXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpdy0+c3B5X251bSA9IG1pbl90KGludCwgQVJSQVlfU0laRShpdy0+c3B5X2FkZHIpLCBkd3JxLT5sZW5ndGgpOwogCWZvciAoaSA9IDA7IGkgPCBpdy0+c3B5X251bTsgaSsrKQotCQltZW1jcHkoJml3LT5zcHlfYWRkcltpXSwgYWRkcltpXS5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmaXctPnNweV9hZGRyW2ldLCBhZGRyW2ldLnNhX2RhdGEsIEVUSF9BTEVOKTsKIAltZW1zZXQoaXctPnNweV9xdWFsLCAwLCBzaXplb2YoaXctPnNweV9xdWFsKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTcwNiwxNCArNzA1LDE0IEBACiAJc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwgPSAoc3RydWN0IGl3X3F1YWxpdHkgKikmYWRkcltpdy0+c3B5X251bV07CiAJaW50IGk7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXU1BZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdTUFlcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWR3cnEtPmxlbmd0aCA9IGl3LT5zcHlfbnVtOwogCWZvciAoaSA9IDA7IGkgPCBpdy0+c3B5X251bTsgaSsrKSB7Ci0JCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZpdy0+c3B5X2FkZHJbaV0sIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJml3LT5zcHlfYWRkcltpXSwgRVRIX0FMRU4pOwogCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CiAJCW1lbWNweSgmcXVhbFtpXSwgJml3LT5zcHlfcXVhbFtpXSwgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CiAJCWl3LT5zcHlfcXVhbFtpXS51cGRhdGVkID0gMDsKQEAgLTc1MSw4ICs3NTAsOCBAQAogCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSA9CiAJCSAgICBodG9kMzIoam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0pOwogCi0JCVdMX1RSQUNFKCgiJXMgIGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXT0gJVhcbiIsCi0JCQkgIF9fZnVuY19fLCBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0pKTsKKwkJV0xfVFJBQ0UoIiVzICBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF09ICVYXG4iLAorCQkJIF9fZnVuY19fLCBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0pOwogCX0KIAlyZXR1cm4gMTsKIH0KQEAgLTc2NSwxNiArNzY0LDE3IEBACiAJd2xfam9pbl9wYXJhbXNfdCBqb2luX3BhcmFtczsKIAlpbnQgam9pbl9wYXJhbXNfc2l6ZTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdBUFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQVBcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoYXdycS0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgewotCQlXTF9FUlJPUigoIkludmFsaWQgSGVhZGVyLi4uc2FfZmFtaWx5XG4iKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIEhlYWRlci4uLnNhX2ZhbWlseVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChFVEhFUl9JU0JDQVNUKGF3cnEtPnNhX2RhdGEpIHx8IEVUSEVSX0lTTlVMTEFERFIoYXdycS0+c2FfZGF0YSkpIHsKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYXdycS0+c2FfZGF0YSkgfHwKKwkgICAgaXNfemVyb19ldGhlcl9hZGRyKGF3cnEtPnNhX2RhdGEpKSB7CiAJCXNjYl92YWxfdCBzY2J2YWw7Ci0JCWJ6ZXJvKCZzY2J2YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKKwkJbWVtc2V0KCZzY2J2YWwsIDAsIHNpemVvZihzY2JfdmFsX3QpKTsKIAkJKHZvaWQpZGV2X3dsY19pb2N0bChkZXYsIFdMQ19ESVNBU1NPQywgJnNjYnZhbCwKIAkJCQkgICAgc2l6ZW9mKHNjYl92YWxfdCkpOwogCQlyZXR1cm4gMDsKQEAgLTc4NSwyMyArNzg1LDIzIEBACiAKIAltZW1jcHkoam9pbl9wYXJhbXMuc3NpZC5TU0lELCBnX3NzaWQuU1NJRCwgZ19zc2lkLlNTSURfbGVuKTsKIAlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gaHRvZDMyKGdfc3NpZC5TU0lEX2xlbik7Ci0JbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIGF3cnEtPnNhX2RhdGEsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCi0JV0xfVFJBQ0UoKCIlcyAgdGFyZ2V0X2NoYW5uZWw9JWRcbiIsIF9fZnVuY19fLAotCQkgIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKSk7CisJV0xfVFJBQ0UoIiVzICB0YXJnZXRfY2hhbm5lbD0lZFxuIiwKKwkJIF9fZnVuY19fLCBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCk7CiAJd2xfaXdfY2hfdG9fY2hhbnNwZWMoZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwsICZqb2luX3BhcmFtcywKIAkJCSAgICAgJmpvaW5fcGFyYW1zX3NpemUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsCiAJCQkJam9pbl9wYXJhbXNfc2l6ZSk7CiAJaWYgKGVycm9yKSB7Ci0JCVdMX0VSUk9SKCgiJXMgSW52YWxpZCBpb2N0bCBkYXRhPSVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVzIEludmFsaWQgaW9jdGwgZGF0YT0lZFxuIiwgX19mdW5jX18sIGVycm9yKTsKIAl9CiAKIAlpZiAoZ19zc2lkLlNTSURfbGVuKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IGpvaW4gU1NJRD0lcyBCU1NJRD0lcE0gY2g9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgYXdycS0+c2FfZGF0YSwKLQkJCSAgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpKTsKKwkJV0xfVFJBQ0UoIiVzOiBqb2luIFNTSUQ9JXMgQlNTSUQ9JXBNIGNoPSVkXG4iLAorCQkJIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgYXdycS0+c2FfZGF0YSwKKwkJCSBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCk7CiAJfQogCiAJbWVtc2V0KCZnX3NzaWQsIDAsIHNpemVvZihnX3NzaWQpKTsKQEAgLTgxMiwxMiArODEyLDEyIEBACiB3bF9pd19nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKIHsKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXQVBcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FQXG4iLCBkZXYtPm5hbWUpOwogCiAJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhFUl9BRERSX0xFTik7CisJbWVtc2V0KGF3cnEtPnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKIAotCSh2b2lkKWRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX0JTU0lELCBhd3JxLT5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJKHZvaWQpZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfQlNTSUQsIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwogfQpAQCAtODMxLDE2ICs4MzEsMTYgQEAKIAlzY2JfdmFsX3Qgc2NidmFsOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXTUxNRSBESVNBU1NPQy9ERUFVVEhcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV01MTUUgRElTQVNTT0MvREVBVVRIXG4iLCBkZXYtPm5hbWUpOwogCiAJbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKWV4dHJhOwogCWlmIChtbG1lID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJJbnZhbGlkIGlvY3RsIGRhdGEuXG4iKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIGlvY3RsIGRhdGFcbiIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJc2NidmFsLnZhbCA9IG1sbWUtPnJlYXNvbl9jb2RlOwotCWJjb3B5KCZtbG1lLT5hZGRyLnNhX2RhdGEsICZzY2J2YWwuZWEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgmbWxtZS0+YWRkci5zYV9kYXRhLCAmc2NidmFsLmVhLCBFVEhfQUxFTik7CiAKIAlpZiAobWxtZS0+Y21kID09IElXX01MTUVfRElTQVNTT0MpIHsKIAkJc2NidmFsLnZhbCA9IGh0b2QzMihzY2J2YWwudmFsKTsKQEAgLTg1Myw3ICs4NTMsNyBAQAogCQkgICAgZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TQ0JfREVBVVRIRU5USUNBVEVfRk9SX1JFQVNPTiwKIAkJCQkgICZzY2J2YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIkludmFsaWQgaW9jdGwgZGF0YS5cbiIpKTsKKwkJV0xfRVJST1IoIkludmFsaWQgaW9jdGwgZGF0YVxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTg3NCw3ICs4NzQsNyBAQAogCWludCBlcnJvciwgaTsKIAl1aW50IGJ1ZmxlbiA9IGR3cnEtPmxlbmd0aDsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdBUExJU1RcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FQTElTVFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODg2LDcgKzg4Niw3IEBACiAJbGlzdC0+YnVmbGVuID0gaHRvZDMyKGJ1Zmxlbik7CiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NDQU5fUkVTVUxUUywgbGlzdCwgYnVmbGVuKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCIlZDogU2NhbiByZXN1bHRzIGVycm9yICVkXG4iLCBfX0xJTkVfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVkOiBTY2FuIHJlc3VsdHMgZXJyb3IgJWRcbiIsIF9fTElORV9fLCBlcnJvcik7CiAJCWtmcmVlKGxpc3QpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtODk0LDggKzg5NCw4IEBACiAJbGlzdC0+dmVyc2lvbiA9IGR0b2gzMihsaXN0LT52ZXJzaW9uKTsKIAlsaXN0LT5jb3VudCA9IGR0b2gzMihsaXN0LT5jb3VudCk7CiAJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJICBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQlrZnJlZShsaXN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTExLDcgKzkxMSw3IEBACiAJCWlmICghKGR0b2gxNihiaS0+Y2FwYWJpbGl0eSkgJiBET1QxMV9DQVBfRVNTKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1lbWNweShhZGRyW2R3cnEtPmxlbmd0aF0uc2FfZGF0YSwgJmJpLT5CU1NJRCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoYWRkcltkd3JxLT5sZW5ndGhdLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSF9BTEVOKTsKIAkJYWRkcltkd3JxLT5sZW5ndGhdLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJcXVhbFtkd3JxLT5sZW5ndGhdLnF1YWwgPSByc3NpX3RvX3F1YWwoZHRvaDE2KGJpLT5SU1NJKSk7CiAJCXF1YWxbZHdycS0+bGVuZ3RoXS5sZXZlbCA9IDB4MTAwICsgZHRvaDE2KGJpLT5SU1NJKTsKQEAgLTk1MiwxMyArOTUyLDEzIEBACiAJd2xfYnNzX2luZm9fdCAqYmkgPSBOVUxMOwogCWludCBpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0FQTElTVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXQVBMSVNUXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKCFpc2NhbikgfHwgKCFpc2Nhbi0+c3lzaW9jX3RzaykpIHsKLQkJV0xfRVJST1IoKCIlcyBlcnJvclxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTY2LDkgKzk2Niw4IEBACiAJd2hpbGUgKGJ1ZikgewogCQlsaXN0ID0gJigod2xfaXNjYW5fcmVzdWx0c190ICopIGJ1Zi0+aXNjYW5fYnVmKS0+cmVzdWx0czsKIAkJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQkJV0xfRVJST1IoKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gIgotCQkJCSJXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJCV9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKSk7CisJCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkJIF9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTk4NSw3ICs5ODQsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQltZW1jcHkoYWRkcltkd3JxLT5sZW5ndGhdLnNhX2RhdGEsICZiaS0+QlNTSUQsCi0JCQkgICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCWFkZHJbZHdycS0+bGVuZ3RoXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCQlxdWFsW2R3cnEtPmxlbmd0aF0ucXVhbCA9CiAJCQkgICAgcnNzaV90b19xdWFsKGR0b2gxNihiaS0+UlNTSSkpOwpAQCAtMTAxNiw3ICsxMDE1LDcgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCW1lbWNweSgmcGFyYW1zLT5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZwYXJhbXMtPmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAlwYXJhbXMtPmJzc190eXBlID0gRE9UMTFfQlNTVFlQRV9BTlk7CiAJcGFyYW1zLT5zY2FuX3R5cGUgPSAwOwogCXBhcmFtcy0+bnByb2JlcyA9IC0xOwpAQCAtMTA0MywxNSArMTA0MiwxNSBAQAogCWlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+YWN0aW9uID0gaHRvZDE2KGFjdGlvbik7CiAJaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5zY2FuX2R1cmF0aW9uID0gaHRvZDE2KDApOwogCi0JV0xfU0NBTigoIiVzIDogbnByb2Jlcz0lZFxuIiwgX19mdW5jX18sCi0JCSBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ucHJvYmVzKSk7Ci0JV0xfU0NBTigoImFjdGl2ZV90aW1lPSVkXG4iLAotCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYWN0aXZlX3RpbWUpKTsKLQlXTF9TQ0FOKCgicGFzc2l2ZV90aW1lPSVkXG4iLAotCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMucGFzc2l2ZV90aW1lKSk7Ci0JV0xfU0NBTigoImhvbWVfdGltZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuaG9tZV90aW1lKSk7Ci0JV0xfU0NBTigoInNjYW5fdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuc2Nhbl90eXBlKSk7Ci0JV0xfU0NBTigoImJzc190eXBlPSVkXG4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ic3NfdHlwZSkpOworCVdMX1NDQU4oIiVzIDogbnByb2Jlcz0lZFxuIiwKKwkJX19mdW5jX18sIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLm5wcm9iZXMpOworCVdMX1NDQU4oImFjdGl2ZV90aW1lPSVkXG4iLAorCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYWN0aXZlX3RpbWUpOworCVdMX1NDQU4oInBhc3NpdmVfdGltZT0lZFxuIiwKKwkJIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLnBhc3NpdmVfdGltZSk7CisJV0xfU0NBTigiaG9tZV90aW1lPSVkXG4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ob21lX3RpbWUpOworCVdMX1NDQU4oInNjYW5fdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuc2Nhbl90eXBlKTsKKwlXTF9TQ0FOKCJic3NfdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYnNzX3R5cGUpOwogCiAJKHZvaWQpZGV2X2l3X2lvdmFyX3NldGJ1Zihpc2Nhbi0+ZGV2LCAiaXNjYW4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AsCiAJCQkJICBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1fc2l6ZSwgaXNjYW4tPmlvY3RsYnVmLApAQCAtMTA2Niw3ICsxMDY1LDcgQEAKIAlpZiAoaXNjYW4pIHsKIAkJaXNjYW4tPnRpbWVyX29uID0gMDsKIAkJaWYgKGlzY2FuLT5pc2Nhbl9zdGF0ZSAhPSBJU0NBTl9TVEFURV9JRExFKSB7Ci0JCQlXTF9UUkFDRSgoInRpbWVyIHRyaWdnZXJcbiIpKTsKKwkJCVdMX1RSQUNFKCJ0aW1lciB0cmlnZ2VyXG4iKTsKIAkJCXVwKCZpc2Nhbi0+c3lzaW9jX3NlbSk7CiAJCX0KIAl9CkBAIC0xMTAxLDggKzExMDAsOCBAQAogCX0gZWxzZSB7CiAJCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKGlzY2FuX2J1Zl90KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmKSB7Ci0JCQlXTF9FUlJPUigoIiVzIGNhbid0IGFsbG9jIGlzY2FuX2J1Zl90IDogZ29pbmcgdG8gYWJvcnQgIgotCQkJCSJjdXJyZWN0IGlzY2FuXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzIGNhbid0IGFsbG9jIGlzY2FuX2J1Zl90IDogZ29pbmcgdG8gYWJvcnQgY3VycmVudCBpc2NhblxuIiwKKwkJCQkgX19mdW5jX18pOwogCQkJTVVURVhfVU5MT0NLX1dMX1NDQU5fU0VUKCk7CiAJCQlyZXR1cm4gV0xfU0NBTl9SRVNVTFRTX05PX01FTTsKIAkJfQpAQCAtMTEzNSwxMSArMTEzNCwxMSBAQAogCQlyZXN1bHRzLT5idWZsZW4gPSBkdG9oMzIocmVzdWx0cy0+YnVmbGVuKTsKIAkJcmVzdWx0cy0+dmVyc2lvbiA9IGR0b2gzMihyZXN1bHRzLT52ZXJzaW9uKTsKIAkJcmVzdWx0cy0+Y291bnQgPSBkdG9oMzIocmVzdWx0cy0+Y291bnQpOwotCQlXTF9UUkFDRSgoInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KSk7Ci0JCVdMX1RSQUNFKCgicmVzdWx0cy0+YnVmbGVuID0gJWRcbiIsIHJlc3VsdHMtPmJ1ZmxlbikpOworCQlXTF9UUkFDRSgicmVzdWx0cy0+Y291bnQgPSAlZFxuIiwgcmVzdWx0cy0+Y291bnQpOworCQlXTF9UUkFDRSgicmVzdWx0cy0+YnVmbGVuID0gJWRcbiIsIHJlc3VsdHMtPmJ1Zmxlbik7CiAJCXN0YXR1cyA9IGR0b2gzMihsaXN0X2J1Zi0+c3RhdHVzKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIiVzIHJldHVybnMgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXMpKTsKKwkJV0xfRVJST1IoIiVzIHJldHVybnMgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXMpOwogCQlzdGF0dXMgPSBXTF9TQ0FOX1JFU1VMVFNfTk9fTUVNOwogCX0KIAlNVVRFWF9VTkxPQ0tfV0xfU0NBTl9TRVQoKTsKQEAgLTExNDgsOCArMTE0Nyw4IEBACiAKIHN0YXRpYyB2b2lkIHdsX2l3X2ZvcmNlX3NwZWNpZmljX3NjYW4oaXNjYW5faW5mb190ICppc2NhbikKIHsKLQlXTF9UUkFDRSgoIiVzIGZvcmNlIFNwZWNpZmljIFNDQU4gZm9yICVzXG4iLCBfX2Z1bmNfXywKLQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRCkpOworCVdMX1RSQUNFKCIlcyBmb3JjZSBTcGVjaWZpYyBTQ0FOIGZvciAlc1xuIiwKKwkJIF9fZnVuY19fLCBnX3NwZWNpZmljX3NzaWQuU1NJRCk7CiAJcnRubF9sb2NrKCk7CiAKIAkodm9pZClkZXZfd2xjX2lvY3RsKGlzY2FuLT5kZXYsIFdMQ19TQ0FOLCAmZ19zcGVjaWZpY19zc2lkLApAQCAtMTE2Niw3ICsxMTY1LDcgQEAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CiAKIAl3aXJlbGVzc19zZW5kX2V2ZW50KGlzY2FuLT5kZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0JV0xfVFJBQ0UoKCJTZW5kIEV2ZW50IElTQ0FOIGNvbXBsZXRlXG4iKSk7CisJV0xfVFJBQ0UoIlNlbmQgRXZlbnQgSVNDQU4gY29tcGxldGVcbiIpOwogI2VuZGlmCiB9CiAKQEAgLTExOTAsOCArMTE4OSw4IEBACiAJCXN0YXR1cyA9IHdsX2l3X2lzY2FuX2dldChpc2Nhbik7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQgJiYgKGlzY2FuX3Bhc3NfYWJvcnQgPT0gdHJ1ZSkpIHsKLQkJCVdMX1RSQUNFKCgiJXMgR2V0IHJlc3VsdHMgZnJvbSBzcGVjaWZpYyBzY2FuICIKLQkJCQkic3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpKTsKKwkJCVdMX1RSQUNFKCIlcyBHZXQgcmVzdWx0cyBmcm9tIHNwZWNpZmljIHNjYW4gc3RhdHVzID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJd2xfaXdfc2VuZF9zY2FuX2NvbXBsZXRlKGlzY2FuKTsKIAkJCWlzY2FuX3Bhc3NfYWJvcnQgPSBmYWxzZTsKIAkJCXN0YXR1cyA9IC0xOwpAQCAtMTE5OSw3ICsxMTk4LDcgQEAKIAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19QQVJUSUFMOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgaW5jb21wbGV0ZVxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBpbmNvbXBsZXRlXG4iKTsKIAkJCXJ0bmxfbG9jaygpOwogCQkJd2xfaXdfaXNjYW4oaXNjYW4sIE5VTEwsIFdMX1NDQU5fQUNUSU9OX0NPTlRJTlVFKTsKIAkJCXJ0bmxfdW5sb2NrKCk7CkBAIC0xMjA4LDE4ICsxMjA3LDE4IEBACiAJCQlpc2Nhbi0+dGltZXJfb24gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX1NVQ0NFU1M6Ci0JCQlXTF9UUkFDRSgoImlzY2FucmVzdWx0cyBjb21wbGV0ZVxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBjb21wbGV0ZVxuIik7CiAJCQlpc2Nhbi0+aXNjYW5fc3RhdGUgPSBJU0NBTl9TVEFURV9JRExFOwogCQkJd2xfaXdfc2VuZF9zY2FuX2NvbXBsZXRlKGlzY2FuKTsKIAkJCWJyZWFrOwogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19QRU5ESU5HOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgcGVuZGluZ1xuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBwZW5kaW5nXG4iKTsKIAkJCW1vZF90aW1lcigmaXNjYW4tPnRpbWVyLAogCQkJCSAgamlmZmllcyArIGlzY2FuLT50aW1lcl9tcyAqIEhaIC8gMTAwMCk7CiAJCQlpc2Nhbi0+dGltZXJfb24gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX0FCT1JURUQ6Ci0JCQlXTF9UUkFDRSgoImlzY2FucmVzdWx0cyBhYm9ydGVkXG4iKSk7CisJCQlXTF9UUkFDRSgiaXNjYW5yZXN1bHRzIGFib3J0ZWRcbiIpOwogCQkJaXNjYW4tPmlzY2FuX3N0YXRlID0gSVNDQU5fU1RBVEVfSURMRTsKIAkJCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPT0gMCkKIAkJCQl3bF9pd19zZW5kX3NjYW5fY29tcGxldGUoaXNjYW4pOwpAQCAtMTIyOSwxMiArMTIyOCwxMiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX05PX01FTToKLQkJCVdMX1RSQUNFKCgiaXNjYW5yZXN1bHRzIGNhbid0IGFsbG9jIG1lbW9yeTogc2tpcFxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBjYW4ndCBhbGxvYyBtZW1vcnk6IHNraXBcbiIpOwogCQkJaXNjYW4tPmlzY2FuX3N0YXRlID0gSVNDQU5fU1RBVEVfSURMRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJWRcbiIsCi0JCQkJICBzdGF0dXMpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJWRcbiIsCisJCQkJIHN0YXR1cyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEyNTMsMTEgKzEyNTIsMTEgQEAKIAkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJaW50IGVycm9yOwotCVdMX1RSQUNFKCgiXG46JXMgZGV2OiVzOiBTSU9DU0lXU0NBTiA6IFNDQU5cbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiXG46JXMgZGV2OiVzOiBTSU9DU0lXU0NBTiA6IFNDQU5cbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogCiAJZ19zZXRfZXNzaWRfYmVmb3JlX3NjYW4gPSBmYWxzZTsKICNpZiBkZWZpbmVkKENTQ0FOKQotCVdMX0VSUk9SKCgiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogU2NhbiBmcm9tIFNJT0NHSVdTQ0FOIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCkBAIC0xMjc0LDkgKzEyNzMsOCBAQAogCQlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgewogCQkJc3RydWN0IGl3X3NjYW5fcmVxICpyZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxICopZXh0cmE7CiAJCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7Ci0JCQkJV0xfVFJBQ0UoKCIlcyBTcGVjaWZpYyBTQ0FOIGlzIG5vdCBkb25lIGlnbm9yZSAiCi0JCQkJCSJzY2FuIGZvciA9ICVzXG4iLAotCQkJCQlfX2Z1bmNfXywgcmVxLT5lc3NpZCkpOworCQkJCVdMX1RSQUNFKCIlcyBTcGVjaWZpYyBTQ0FOIGlzIG5vdCBkb25lIGlnbm9yZSBzY2FuIGZvciA9ICVzXG4iLAorCQkJCQkgX19mdW5jX18sIHJlcS0+ZXNzaWQpOwogCQkJCXJldHVybiAtRUJVU1k7CiAJCQl9IGVsc2UgewogCQkJCWdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbiA9IG1pbl90KHNpemVfdCwKQEAgLTEyODcsOSArMTI4NSw5IEBACiAJCQkJZ19zcGVjaWZpY19zc2lkLlNTSURfbGVuID0KIAkJCQkgICAgaHRvZDMyKGdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbik7CiAJCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMTsKLQkJCQlXTF9UUkFDRSgoIiMjIyBTcGVjaWZpYyBzY2FuIHNzaWQ9JXMgbGVuPSVkXG4iLAotCQkJCQkgIGdfc3BlY2lmaWNfc3NpZC5TU0lELAotCQkJCQkgIGdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbikpOworCQkJCVdMX1RSQUNFKCIjIyMgU3BlY2lmaWMgc2NhbiBzc2lkPSVzIGxlbj0lZFxuIiwKKwkJCQkJIGdfc3BlY2lmaWNfc3NpZC5TU0lELAorCQkJCQkgZ19zcGVjaWZpY19zc2lkLlNTSURfbGVuKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEyOTcsOCArMTI5NSw4IEBACiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NDQU4sICZnX3NwZWNpZmljX3NzaWQsCiAJCQkJc2l6ZW9mKGdfc3BlY2lmaWNfc3NpZCkpOwogCWlmIChlcnJvcikgewotCQlXTF9UUkFDRSgoIiMjIyMgU2V0IFNDQU4gZm9yICVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRCwgZXJyb3IpKTsKKwkJV0xfVFJBQ0UoIiMjIyMgU2V0IFNDQU4gZm9yICVzIGZhaWxlZCB3aXRoICVkXG4iLAorCQkJIGdfc3BlY2lmaWNfc3NpZC5TU0lELCBlcnJvcik7CiAJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDA7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMxNyw3ICsxMzE1LDcgQEAKIAogCXdsX2l3X3NldF9ldmVudF9tYXNrKGRldik7CiAKLQlXTF9UUkFDRSgoIisrKzogU2V0IEJyb2FkY2FzdCBJU0NBTlxuIikpOworCVdMX1RSQUNFKCIrKys6IFNldCBCcm9hZGNhc3QgSVNDQU5cbiIpOwogCW1lbXNldCgmc3NpZCwgMCwgc2l6ZW9mKHNzaWQpKTsKIAogCWlzY2FuLT5saXN0X2N1ciA9IGlzY2FuLT5saXN0X2hkcjsKQEAgLTEzNDYsMjAgKzEzNDQsMjAgQEAKIAl3bGNfc3NpZF90IHNzaWQ7CiAJaXNjYW5faW5mb190ICppc2NhbiA9IGdfaXNjYW47CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXU0NBTiA6IElTQ0FOXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdTQ0FOIDogSVNDQU5cbiIsIGRldi0+bmFtZSk7CiAKICNpZiBkZWZpbmVkKENTQ0FOKQotCVdMX0VSUk9SKCgiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogU2NhbiBmcm9tIFNJT0NHSVdTQ0FOIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCiAJaWYgKGdfb25vZmYgPT0gR19XTEFOX1NFVF9PRkYpIHsKLQkJV0xfVFJBQ0UoKCIlczogZHJpdmVyIGlzIG5vdCB1cCB5ZXQgYWZ0ZXIgU1RBUlRcbiIsIF9fZnVuY19fKSk7CisJCVdMX1RSQUNFKCIlczogZHJpdmVyIGlzIG5vdCB1cCB5ZXQgYWZ0ZXIgU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogI2lmZGVmIFBOT19TVVBQT1JUCiAJaWYgKGRoZF9kZXZfZ2V0X3Bub19zdGF0dXMoZGV2KSkgewotCQlXTF9FUlJPUigoIiVzOiBTY2FuIGNhbGxlZCB3aGVuIFBOTyBpcyBhY3RpdmVcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogU2NhbiBjYWxsZWQgd2hlbiBQTk8gaXMgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CiAJfQogI2VuZGlmCiAKQEAgLTEzNjcsOCArMTM2NSw4IEBACiAJCXJldHVybiB3bF9pd19zZXRfc2NhbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKIAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKLQkJV0xfVFJBQ0UoKCIlcyBTcGVjaWZpYyBTQ0FOIGFscmVhZHkgcnVubmluZyBpZ25vcmluZyBCQyBzY2FuXG4iLAotCQkJICBfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXMgU3BlY2lmaWMgU0NBTiBhbHJlYWR5IHJ1bm5pbmcgaWdub3JpbmcgQkMgc2NhblxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBFQlVTWTsKIAl9CiAKQEAgLTEzODYsOCArMTM4NCw4IEBACiAJCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCiAJCQlpZiAoaXNjYW4tPmlzY2FuX3N0YXRlID09IElTQ0FOX1NUQVRFX1NDQU5JTkcpIHsKLQkJCQlXTF9UUkFDRSgoIiVzIElTQ0FOIGFscmVhZHkgaW4gcHJvZ3Jlc3MgXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJV0xfVFJBQ0UoIiVzIElTQ0FOIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTE0MDYsNyArMTQwNCw3IEBACiAJdTggKmllID0gKndwYWllOwogCiAJaWYgKChpZVsxXSA+PSA2KSAmJgotCSAgICAhYmNtcCgoY29uc3Qgdm9pZCAqKSZpZVsyXSwgKGNvbnN0IHZvaWQgKikoV1BBX09VSSAiXHgwMSIpLCA0KSkgeworCSAgICAhbWVtY21wKChjb25zdCB2b2lkICopJmllWzJdLCAoY29uc3Qgdm9pZCAqKShXUEFfT1VJICJceDAxIiksIDQpKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTQyMiw3ICsxNDIwLDcgQEAKIAl1OCAqaWUgPSAqd3BzaWU7CiAKIAlpZiAoKGllWzFdID49IDQpICYmCi0JICAgICFiY21wKChjb25zdCB2b2lkICopJmllWzJdLCAoY29uc3Qgdm9pZCAqKShXUEFfT1VJICJceDA0IiksIDQpKSB7CisJICAgICFtZW1jbXAoKGNvbnN0IHZvaWQgKikmaWVbMl0sIChjb25zdCB2b2lkICopKFdQQV9PVUkgIlx4MDQiKSwgNCkpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0xNTAxLDkgKzE0OTksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGxpc3QtPmNvdW50ICYmIGkgPCBJV19NQVhfQVA7IGkrKykgewogCQlpZiAobGlzdC0+dmVyc2lvbiAhPSBXTF9CU1NfSU5GT19WRVJTSU9OKSB7Ci0JCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSAiCi0JCQkJIldMX0JTU19JTkZPX1ZFUlNJT05cbiIsCi0JCQkJX19mdW5jX18sIGxpc3QtPnZlcnNpb24pKTsKKwkJCVdMX0VSUk9SKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKKwkJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC0xNTExLDExICsxNTA4LDExIEBACiAJCQkJCSAgICAgZHRvaDMyKGJpLT5sZW5ndGgpKSA6IGxpc3QtPgogCQkgICAgYnNzX2luZm87CiAKLQkJV0xfVFJBQ0UoKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgYmktPlNTSUQpKTsKKwkJV0xfVFJBQ0UoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBiaS0+U1NJRCk7CiAKIAkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJmJpLT5CU1NJRCwgRVRIX0FMRU4pOwogCQlldmVudCA9CiAJCSAgICBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBldmVudCwgZW5kLCAmaXdlLAogCQkJCQkgSVdfRVZfQUREUl9MRU4pOwpAQCAtMTU5MCwxMSArMTU4NywxMSBAQAogCiAJcmV0ID0gZXZlbnQgLSBleHRyYTsKIAlpZiAocmV0IDwgMCkgewotCQlXTF9FUlJPUigoIj09PiBXcm9uZyBzaXplXG4iKSk7CisJCVdMX0VSUk9SKCI9PT4gV3Jvbmcgc2l6ZVxuIik7CiAJCXJldCA9IDA7CiAJfQotCVdMX1RSQUNFKCgiJXM6IHNpemU9JWQgYnl0ZXMgcHJlcGFyZWRcbiIsIF9fZnVuY19fLAotCQkgICh1bnNpZ25lZCBpbnQpKGV2ZW50IC0gZXh0cmEpKSk7CisJV0xfVFJBQ0UoIiVzOiBzaXplPSVkIGJ5dGVzIHByZXBhcmVkXG4iLAorCQkgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpKGV2ZW50IC0gZXh0cmEpKTsKIAlyZXR1cm4gKHVpbnQpcmV0OwogfQogCkBAIC0xNjE0LDEwICsxNjExLDEwIEBACiAJaXNjYW5fYnVmX3QgKnBfYnVmOwogI2VuZGlmCiAKLQlXTF9UUkFDRSgoIiVzOiBidWZsZW5fZnJvbV91c2VyICVkOiBcbiIsIGRldi0+bmFtZSwgYnVmbGVuX2Zyb21fdXNlcikpOworCVdMX1RSQUNFKCIlczogYnVmbGVuX2Zyb21fdXNlciAlZDpcbiIsIGRldi0+bmFtZSwgYnVmbGVuX2Zyb21fdXNlcik7CiAKIAlpZiAoIWV4dHJhKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IHdsX2l3X2dldF9zY2FuIHJldHVybiAtRUlOVkFMXG4iLCBkZXYtPm5hbWUpKTsKKwkJV0xfVFJBQ0UoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVJTlZBTFxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNjMxLDggKzE2MjgsOCBAQAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKIAkJbGlzdCA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFsaXN0KSB7Ci0JCQlXTF9UUkFDRSgoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVOT01FTVxuIiwKLQkJCQkgIGRldi0+bmFtZSkpOworCQkJV0xfVFJBQ0UoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVOT01FTVxuIiwKKwkJCQkgZGV2LT5uYW1lKTsKIAkJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDA7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTY0Miw4ICsxNjM5LDggQEAKIAlsaXN0LT5idWZsZW4gPSBodG9kMzIobGVuKTsKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0NBTl9SRVNVTFRTLCBsaXN0LCBsZW4pOwogCWlmIChlcnJvcikgewotCQlXTF9FUlJPUigoIiVzOiAlcyA6IFNjYW5fcmVzdWx0cyBFUlJPUiAlZFxuIiwgZGV2LT5uYW1lLAotCQkJICBfX2Z1bmNfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVzOiAlcyA6IFNjYW5fcmVzdWx0cyBFUlJPUiAlZFxuIiwKKwkJCSBkZXYtPm5hbWUsIF9fZnVuY19fLCBlcnJvcik7CiAJCWR3cnEtPmxlbmd0aCA9IGxlbjsKIAkJaWYgKGdfc2Nhbl9zcGVjaWZpZWRfc3NpZCkgewogCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMDsKQEAgLTE2NTYsOCArMTY1Myw4IEBACiAJbGlzdC0+Y291bnQgPSBkdG9oMzIobGlzdC0+Y291bnQpOwogCiAJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJICBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7CiAJCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCQkJa2ZyZWUobGlzdCk7CkBAIC0xNjY2LDggKzE2NjMsOCBAQAogCX0KIAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKLQkJV0xfVFJBQ0UoKCIlczogU3BlY2lmaWVkIHNjYW4gQVBzIGluIHRoZSBsaXN0ID0lZFxuIiwKLQkJCSAgX19mdW5jX18sIGxpc3QtPmNvdW50KSk7CisJCVdMX1RSQUNFKCIlczogU3BlY2lmaWVkIHNjYW4gQVBzIGluIHRoZSBsaXN0ID0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgbGlzdC0+Y291bnQpOwogCQlsZW5fcmV0ID0KIAkJICAgIChfX3UxNikgd2xfaXdfZ2V0X3NjYW5fcHJlcChsaXN0LCBpbmZvLCBleHRyYSwKIAkJCQkJCWJ1Zmxlbl9mcm9tX3VzZXIpOwpAQCAtMTY3OCw4ICsxNjc1LDggQEAKIAkJd2hpbGUgKHBfYnVmICE9IGlzY2FuLT5saXN0X2N1cikgewogCQkJbGlzdF9tZXJnZSA9CiAJCQkgICAgJigod2xfaXNjYW5fcmVzdWx0c190ICopIHBfYnVmLT5pc2Nhbl9idWYpLT5yZXN1bHRzOwotCQkJV0xfVFJBQ0UoKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgbGlzdF9tZXJnZS0+Y291bnQpKTsKKwkJCVdMX1RSQUNFKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBsaXN0X21lcmdlLT5jb3VudCk7CiAJCQlpZiAobGlzdF9tZXJnZS0+Y291bnQgPiAwKQogCQkJCWxlbl9yZXQgKz0KIAkJCQkgICAgKF9fdTE2KSB3bF9pd19nZXRfc2Nhbl9wcmVwKGxpc3RfbWVyZ2UsCkBAIC0xNjg5LDggKzE2ODYsOCBAQAogCQl9CiAjZWxzZQogCQlsaXN0X21lcmdlID0gKHdsX3NjYW5fcmVzdWx0c190ICopIGdfc2NhbjsKLQkJV0xfVFJBQ0UoKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsIF9fZnVuY19fLAotCQkJICBsaXN0X21lcmdlLT5jb3VudCkpOworCQlXTF9UUkFDRSgiJXM6IEJjYXN0IEFQcyBsaXN0PSVkXG4iLAorCQkJIF9fZnVuY19fLCBsaXN0X21lcmdlLT5jb3VudCk7CiAJCWlmIChsaXN0X21lcmdlLT5jb3VudCA+IDApCiAJCQlsZW5fcmV0ICs9CiAJCQkgICAgKF9fdTE2KSB3bF9pd19nZXRfc2Nhbl9wcmVwKGxpc3RfbWVyZ2UsIGluZm8sCkBAIC0xNzE0LDggKzE3MTEsOCBAQAogCWR3cnEtPmxlbmd0aCA9IGxlbjsKIAlkd3JxLT5mbGFncyA9IDA7CiAKLQlXTF9UUkFDRSgoIiVzIHJldHVybiB0byBXRSAlZCBieXRlcyBBUHM9JWRcbiIsIF9fZnVuY19fLAotCQkgIGR3cnEtPmxlbmd0aCwgbGlzdC0+Y291bnQpKTsKKwlXTF9UUkFDRSgiJXMgcmV0dXJuIHRvIFdFICVkIGJ5dGVzIEFQcz0lZFxuIiwKKwkJIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgsIGxpc3QtPmNvdW50KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTczNiwyNiArMTczMywyNiBAQAogCXUzMiBjb3VudGVyID0gMDsKIAl1OCBjaGFubmVsOwogCi0JV0xfVFJBQ0UoKCIlcyAlcyBidWZsZW5fZnJvbV91c2VyICVkOlxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXywKLQkJICBkd3JxLT5sZW5ndGgpKTsKKwlXTF9UUkFDRSgiJXMgJXMgYnVmbGVuX2Zyb21fdXNlciAlZDpcbiIsCisJCSBkZXYtPm5hbWUsIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgpOwogCiAJaWYgKCFleHRyYSkgewotCQlXTF9UUkFDRSgoIiVzOiBJTlZBTElEIFNJT0NHSVdTQ0FOIEdFVCBiYWQgcGFyYW1ldGVyXG4iLAotCQkJICBkZXYtPm5hbWUpKTsKKwkJV0xfVFJBQ0UoIiVzOiBJTlZBTElEIFNJT0NHSVdTQ0FOIEdFVCBiYWQgcGFyYW1ldGVyXG4iLAorCQkJIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICgoIWlzY2FuKSB8fCAoIWlzY2FuLT5zeXNpb2NfdHNrKSkgewotCQlXTF9FUlJPUigoIiVzc3lzaW9jX3Rza1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzc3lzaW9jX3Rza1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gd2xfaXdfZ2V0X3NjYW4oZGV2LCBpbmZvLCBkd3JxLCBleHRyYSk7CiAJfQogCiAJaWYgKGlzY2FuLT5pc2Nhbl9zdGF0ZSA9PSBJU0NBTl9TVEFURV9TQ0FOSU5HKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdTQ0FOIEdFVCBzdGlsbCBzY2FubmluZ1xuIiwgZGV2LT5uYW1lKSk7CisJCVdMX1RSQUNFKCIlczogU0lPQ0dJV1NDQU4gR0VUIHN0aWxsIHNjYW5uaW5nXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXU0NBTiBHRVQgYnJvYWRjYXN0IHJlc3VsdHNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1NDQU4gR0VUIGJyb2FkY2FzdCByZXN1bHRzXG4iLCBkZXYtPm5hbWUpOwogCWFwY250ID0gMDsKIAlwX2J1ZiA9IGlzY2FuLT5saXN0X2hkcjsKIAl3aGlsZSAocF9idWYgIT0gaXNjYW4tPmxpc3RfY3VyKSB7CkBAIC0xNzY0LDkgKzE3NjEsOCBAQAogCQljb3VudGVyICs9IGxpc3QtPmNvdW50OwogCiAJCWlmIChsaXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pIHsKLQkJCVdMX0VSUk9SKCgiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9ICIKLQkJCQkiV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCQlfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQkJV0xfRVJST1IoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkJCSBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNzc5LDE0ICsxNzc1LDE0IEBACiAJCQlBU1NFUlQoKCh1bnNpZ25lZCBsb25nKWJpICsgZHRvaDMyKGJpLT5sZW5ndGgpKSA8PQogCQkJICAgICAgICgodW5zaWduZWQgbG9uZylsaXN0ICsgV0xDX0lXX0lTQ0FOX01BWExFTikpOwogCi0JCQlpZiAoZXZlbnQgKyBFVEhFUl9BRERSX0xFTiArIGJpLT5TU0lEX2xlbiArCisJCQlpZiAoZXZlbnQgKyBFVEhfQUxFTiArIGJpLT5TU0lEX2xlbiArCiAJCQkgICAgSVdfRVZfVUlOVF9MRU4gKyBJV19FVl9GUkVRX0xFTiArIElXX0VWX1FVQUxfTEVOID49CiAJCQkgICAgZW5kKQogCQkJCXJldHVybiAtRTJCSUc7CiAJCQlpd2UuY21kID0gU0lPQ0dJV0FQOwogCQkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmYmktPkJTU0lELAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlldmVudCA9CiAJCQkgICAgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgZXZlbnQsIGVuZCwgJml3ZSwKIAkJCQkJCSBJV19FVl9BRERSX0xFTik7CkBAIC0xODc2LDggKzE4NzIsOCBAQAogCWR3cnEtPmxlbmd0aCA9IGV2ZW50IC0gZXh0cmE7CiAJZHdycS0+ZmxhZ3MgPSAwOwogCi0JV0xfVFJBQ0UoKCIlcyByZXR1cm4gdG8gV0UgJWQgYnl0ZXMgQVBzPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBkd3JxLT5sZW5ndGgsIGNvdW50ZXIpKTsKKwlXTF9UUkFDRSgiJXMgcmV0dXJuIHRvIFdFICVkIGJ5dGVzIEFQcz0lZFxuIiwKKwkJIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgsIGNvdW50ZXIpOwogCiAJaWYgKCFkd3JxLT5sZW5ndGgpCiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTg5NSw3ICsxODkxLDcgQEAKIAl3bF9qb2luX3BhcmFtc190IGpvaW5fcGFyYW1zOwogCWludCBqb2luX3BhcmFtc19zaXplOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0VTU0lEXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdFU1NJRFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmIChnX3NldF9lc3NpZF9iZWZvcmVfc2NhbikKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC0xOTIzLDcgKzE5MTksNyBAQAogCiAJbWVtY3B5KCZqb2luX3BhcmFtcy5zc2lkLlNTSUQsIGdfc3NpZC5TU0lELCBnX3NzaWQuU1NJRF9sZW4pOwogCWpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPSBodG9kMzIoZ19zc2lkLlNTSURfbGVuKTsKLQltZW1jcHkoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIX0FMRU4pOwogCiAJd2xfaXdfY2hfdG9fY2hhbnNwZWMoZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwsICZqb2luX3BhcmFtcywKIAkJCSAgICAgJmpvaW5fcGFyYW1zX3NpemUpOwpAQCAtMTkzMSwxMSArMTkyNywxMSBAQAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TRVRfU1NJRCwgJmpvaW5fcGFyYW1zLAogCQkJCWpvaW5fcGFyYW1zX3NpemUpOwogCWlmIChlcnJvcikKLQkJV0xfRVJST1IoKCJJbnZhbGlkIGlvY3RsIGRhdGE9JWRcbiIsIGVycm9yKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIGlvY3RsIGRhdGE9JWRcbiIsIGVycm9yKTsKIAogCWlmIChnX3NzaWQuU1NJRF9sZW4pIHsKLQkJV0xfVFJBQ0UoKCIlczogam9pbiBTU0lEPSVzIGNoPSVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgZ19zc2lkLlNTSUQsIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKSk7CisJCVdMX1RSQUNFKCIlczogam9pbiBTU0lEPSVzIGNoPSVkXG4iLAorCQkJIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE5NDgsMTQgKzE5NDQsMTQgQEAKIAl3bGNfc3NpZF90IHNzaWQ7CiAJaW50IGVycm9yOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0VTU0lEXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFU1NJRFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9TU0lELCAmc3NpZCwgc2l6ZW9mKHNzaWQpKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCJFcnJvciBnZXR0aW5nIHRoZSBTU0lEXG4iKSk7CisJCVdMX0VSUk9SKCJFcnJvciBnZXR0aW5nIHRoZSBTU0lEXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTk3Niw3ICsxOTcyLDcgQEAKIHsKIAl3bF9pd190ICppdyA9ICood2xfaXdfdCAqKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdOSUNLTlxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXTklDS05cbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5OTYsNyArMTk5Miw3IEBACiB7CiAJd2xfaXdfdCAqaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXTklDS05cbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV05JQ0tOXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDE0LDcgKzIwMTAsNyBAQAogCXdsX3JhdGVzZXRfdCByYXRlc2V0OwogCWludCBlcnJvciwgcmF0ZSwgaSwgZXJyb3JfYmcsIGVycm9yX2E7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXUkFURVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXUkFURVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfQ1VSUl9SQVRFU0VULCAmcmF0ZXNldCwKIAkJCQlzaXplb2YocmF0ZXNldCkpOwpAQCAtMjA2Myw3ICsyMDU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJhdGU7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXUkFURVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUkFURVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUkFURSwgJnJhdGUsIHNpemVvZihyYXRlKSk7CiAJaWYgKGVycm9yKQpAQCAtMjA4MCw3ICsyMDc2LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJ0czsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdSVFNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1JUU1xuIiwgZGV2LT5uYW1lKTsKIAogCWlmICh2d3JxLT5kaXNhYmxlZCkKIAkJcnRzID0gRE9UMTFfREVGQVVMVF9SVFNfTEVOOwpAQCAtMjEwMiw3ICsyMDk4LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJ0czsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdSVFNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1JUU1xuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pbnR2YXJfZ2V0KGRldiwgInJ0c3RocmVzaCIsICZydHMpOwogCWlmIChlcnJvcikKQEAgLTIxMjEsNyArMjExNyw3IEBACiB7CiAJaW50IGVycm9yLCBmcmFnOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0ZSQUdcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0ZSQUdcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAodndycS0+ZGlzYWJsZWQpCiAJCWZyYWcgPSBET1QxMV9ERUZBVUxUX0ZSQUdfTEVOOwpAQCAtMjE0Myw3ICsyMTM5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGZyYWd0aHJlc2hvbGQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRlJBR1xuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRlJBR1xuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pbnR2YXJfZ2V0KGRldiwgImZyYWd0aHJlc2giLCAmZnJhZ3RocmVzaG9sZCk7CiAJaWYgKGVycm9yKQpAQCAtMjE2Myw3ICsyMTU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGRpc2FibGU7CiAJdTE2IHR4cHdybXc7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1RYUE9XXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdUWFBPV1xuIiwgZGV2LT5uYW1lKTsKIAogCWRpc2FibGUgPSB2d3JxLT5kaXNhYmxlZCA/IFdMX1JBRElPX1NXX0RJU0FCTEUgOiAwOwogCWRpc2FibGUgKz0gV0xfUkFESU9fU1dfRElTQUJMRSA8PCAxNjsKQEAgLTIyMDAsNyArMjE5Niw3IEBACiAJaW50IGVycm9yLCBkaXNhYmxlLCB0eHB3cmRibTsKIAl1OCByZXN1bHQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXVFhQT1dcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1RYUE9XXG4iLCBkZXYtPm5hbWUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9SQURJTywgJmRpc2FibGUsIHNpemVvZihkaXNhYmxlKSk7CiAJaWYgKGVycm9yKQpAQCAtMjIyOSw3ICsyMjI1LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGxybCwgc3JsOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1JFVFJZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdSRVRSWVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICh2d3JxLT5kaXNhYmxlZCB8fCAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI3Nyw3ICsyMjczLDcgQEAKIHsKIAlpbnQgZXJyb3IsIGxybCwgc3JsOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1JFVFJZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdSRVRSWVxuIiwgZGV2LT5uYW1lKTsKIAogCXZ3cnEtPmRpc2FibGVkID0gMDsKIApAQCAtMjMxNyw3ICsyMzEzLDcgQEAKIAl3bF93c2VjX2tleV90IGtleTsKIAlpbnQgZXJyb3IsIHZhbCwgd3NlYzsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdFTkNPREVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0VOQ09ERVxuIiwgZGV2LT5uYW1lKTsKIAogCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CiAKQEAgLTI0MDksOSArMjQwNSw5IEBACiAJd2xfd3NlY19rZXlfdCBrZXk7CiAJaW50IGVycm9yLCB2YWwsIHdzZWMsIGF1dGg7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRU5DT0RFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFTkNPREVcbiIsIGRldi0+bmFtZSk7CiAKLQliemVybygma2V5LCBzaXplb2Yod2xfd3NlY19rZXlfdCkpOworCW1lbXNldCgma2V5LCAwLCBzaXplb2Yod2xfd3NlY19rZXlfdCkpOwogCiAJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgPT0gMCkgewogCQlmb3IgKGtleS5pbmRleCA9IDA7IGtleS5pbmRleCA8IERPVDExX01BWF9ERUZBVUxUX0tFWVM7CkBAIC0yNDY1LDcgKzI0NjEsNyBAQAogewogCWludCBlcnJvciwgcG07CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXUE9XRVJcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1BPV0VSXG4iLCBkZXYtPm5hbWUpOwogCiAJcG0gPSB2d3JxLT5kaXNhYmxlZCA/IFBNX09GRiA6IFBNX01BWDsKIApAQCAtMjQ4NCw3ICsyNDgwLDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBtOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1BPV0VSXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdQT1dFUlxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUE0sICZwbSwgc2l6ZW9mKHBtKSk7CiAJaWYgKGVycm9yKQpAQCAtMjUwMyw3ICsyNDk5LDcgQEAKIAkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICppd3AsIGNoYXIgKmV4dHJhKQogewogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0dFTklFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdHRU5JRVxuIiwgZGV2LT5uYW1lKTsKIAogCUNIRUNLX0VYVFJBX0ZPUl9OVUxMKGV4dHJhKTsKIApAQCAtMjUxNiw3ICsyNTEyLDcgQEAKIHdsX2l3X2dldF93cGFpZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKml3cCwgY2hhciAqZXh0cmEpCiB7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0dFTklFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdHRU5JRVxuIiwgZGV2LT5uYW1lKTsKIAlpd3AtPmxlbmd0aCA9IDY0OwogCWRldl93bGNfYnVmdmFyX2dldChkZXYsICJ3cGFpZSIsIGV4dHJhLCBpd3AtPmxlbmd0aCk7CiAJcmV0dXJuIDA7CkBAIC0yNTMxLDcgKzI1MjcsNyBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqaXdlOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0VOQ09ERUVYVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXRU5DT0RFRVhUXG4iLCBkZXYtPm5hbWUpOwogCiAJQ0hFQ0tfRVhUUkFfRk9SX05VTEwoZXh0cmEpOwogCkBAIC0yNTQ4LDE0ICsyNTQ0LDE0IEBACiAKIAlrZXkubGVuID0gaXdlLT5rZXlfbGVuOwogCi0JaWYgKCFFVEhFUl9JU01VTFRJKGl3ZS0+YWRkci5zYV9kYXRhKSkKKwlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGl3ZS0+YWRkci5zYV9kYXRhKSkKIAkJYmNvcHkoKHZvaWQgKikmaXdlLT5hZGRyLnNhX2RhdGEsIChjaGFyICopJmtleS5lYSwKLQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkgICAgICBFVEhfQUxFTik7CiAKIAlpZiAoa2V5LmxlbiA9PSAwKSB7CiAJCWlmIChpd2UtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewotCQkJV0xfV1NFQygoIkNoYW5naW5nIHRoZSB0aGUgcHJpbWFyeSBLZXkgdG8gJWRcbiIsCi0JCQkJIGtleS5pbmRleCkpOworCQkJV0xfV1NFQygiQ2hhbmdpbmcgdGhlIHRoZSBwcmltYXJ5IEtleSB0byAlZFxuIiwKKwkJCQlrZXkuaW5kZXgpOwogCQkJa2V5LmluZGV4ID0gaHRvZDMyKGtleS5pbmRleCk7CiAJCQllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0VUX0tFWV9QUklNQVJZLAogCQkJCQkgICAgICAma2V5LmluZGV4LCBzaXplb2Yoa2V5LmluZGV4KSk7CkBAIC0yNTY5LDkgKzI1NjUsOSBAQAogCQlpZiAoaXdlLT5rZXlfbGVuID4gc2l6ZW9mKGtleS5kYXRhKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCVdMX1dTRUMoKCJTZXR0aW5nIHRoZSBrZXkgaW5kZXggJWRcbiIsIGtleS5pbmRleCkpOworCQlXTF9XU0VDKCJTZXR0aW5nIHRoZSBrZXkgaW5kZXggJWRcbiIsIGtleS5pbmRleCk7CiAJCWlmIChpd2UtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewotCQkJV0xfV1NFQygoImtleSBpcyBhIFByaW1hcnkgS2V5XG4iKSk7CisJCQlXTF9XU0VDKCJrZXkgaXMgYSBQcmltYXJ5IEtleVxuIik7CiAJCQlrZXkuZmxhZ3MgPSBXTF9QUklNQVJZX0tFWTsKIAkJfQogCkBAIC0yNjM4LDE1ICsyNjM0LDE1IEBACiAJdWludCBpOwogCWludCByZXQgPSAwOwogCi0JV0xfV1NFQygoIiVzOiBTSU9DU0lXUE1LU0FcbiIsIGRldi0+bmFtZSkpOworCVdMX1dTRUMoIiVzOiBTSU9DU0lXUE1LU0FcbiIsIGRldi0+bmFtZSk7CiAKIAlDSEVDS19FWFRSQV9GT1JfTlVMTChleHRyYSk7CiAKIAlpd3Bta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKWV4dHJhOwogCiAJaWYgKGl3cG1rc2EtPmNtZCA9PSBJV19QTUtTQV9GTFVTSCkgewotCQlXTF9XU0VDKCgid2xfaXdfc2V0X3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKLQkJYnplcm8oKGNoYXIgKikmcG1raWRfbGlzdCwgc2l6ZW9mKHBta2lkX2xpc3QpKTsKKwkJV0xfV1NFQygid2xfaXdfc2V0X3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpOworCQltZW1zZXQoKGNoYXIgKikmcG1raWRfbGlzdCwgMCwgc2l6ZW9mKHBta2lkX2xpc3QpKTsKIAl9CiAKIAllbHNlIGlmIChpd3Bta3NhLT5jbWQgPT0gSVdfUE1LU0FfUkVNT1ZFKSB7CkBAIC0yNjU2LDMwICsyNjUyLDMwIEBACiAJCQlwbWtpZHB0ciA9ICZwbWtpZDsKIAogCQkJYmNvcHkoJml3cG1rc2EtPmJzc2lkLnNhX2RhdGFbMF0sCi0JCQkgICAgICAmcG1raWRwdHItPnBta2lkWzBdLkJTU0lELCBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICAmcG1raWRwdHItPnBta2lkWzBdLkJTU0lELCBFVEhfQUxFTik7CiAJCQliY29weSgmaXdwbWtzYS0+cG1raWRbMF0sICZwbWtpZHB0ci0+cG1raWRbMF0uUE1LSUQsCiAJCQkgICAgICBXUEEyX1BNS0lEX0xFTik7CiAKLQkJCVdMX1dTRUMoKCJ3bF9pd19zZXRfcG1rc2E6SVdfUE1LU0FfUkVNT1ZFOlBNS0lEOiAiCi0JCQkJIiVwTSA9ICIsICZwbWtpZHB0ci0+cG1raWRbMF0uQlNTSUQpKTsKKwkJCVdMX1dTRUMoIndsX2l3X3NldF9wbWtzYTpJV19QTUtTQV9SRU1PVkU6UE1LSUQ6ICVwTSA9ICIsCisJCQkJJnBta2lkcHRyLT5wbWtpZFswXS5CU1NJRCk7CiAJCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykKLQkJCQlXTF9XU0VDKCgiJTAyeCAiLCBwbWtpZHB0ci0+cG1raWRbMF0uUE1LSURbal0pKTsKLQkJCVdMX1dTRUMoKCJcbiIpKTsKKwkJCQlXTF9XU0VDKCIlMDJ4ICIsIHBta2lkcHRyLT5wbWtpZFswXS5QTUtJRFtqXSk7CisJCQlXTF9XU0VDKCJcbiIpOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZDsgaSsrKQotCQkJaWYgKCFiY21wCisJCQlpZiAoIW1lbWNtcAogCQkJICAgICgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKLQkJCSAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lELCBFVEhFUl9BRERSX0xFTikpCisJCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIX0FMRU4pKQogCQkJCWJyZWFrOwogCiAJCWlmICgocG1raWRfbGlzdC5wbWtpZHMubnBta2lkID4gMCkKIAkJICAgICYmIChpIDwgcG1raWRfbGlzdC5wbWtpZHMubnBta2lkKSkgewotCQkJYnplcm8oJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLCBzaXplb2YocG1raWRfdCkpOworCQkJbWVtc2V0KCZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXSwgMCwgc2l6ZW9mKHBta2lkX3QpKTsKIAkJCWZvciAoOyBpIDwgKHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCAtIDEpOyBpKyspIHsKIAkJCQliY29weSgmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaSArIDFdLkJTU0lELAogCQkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCQkgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJICAgICAgRVRIX0FMRU4pOwogCQkJCWJjb3B5KCZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpICsgMV0uUE1LSUQsCiAJCQkJICAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLlBNS0lELAogCQkJCSAgICAgIFdQQTJfUE1LSURfTEVOKTsKQEAgLTI2OTEsMTQgKzI2ODcsMTQgQEAKIAogCWVsc2UgaWYgKGl3cG1rc2EtPmNtZCA9PSBJV19QTUtTQV9BREQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZDsgaSsrKQotCQkJaWYgKCFiY21wCisJCQlpZiAoIW1lbWNtcAogCQkJICAgICgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKLQkJCSAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lELCBFVEhFUl9BRERSX0xFTikpCisJCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIX0FMRU4pKQogCQkJCWJyZWFrOwogCQlpZiAoaSA8IE1BWFBNS0lEKSB7CiAJCQliY29weSgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKIAkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCWJjb3B5KCZpd3Bta3NhLT5wbWtpZFswXSwKIAkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5QTUtJRCwKIAkJCSAgICAgIFdQQTJfUE1LSURfTEVOKTsKQEAgLTI3MTAsMjUgKzI3MDYsMjUgQEAKIAkJCXVpbnQgajsKIAkJCXVpbnQgazsKIAkJCWsgPSBwbWtpZF9saXN0LnBta2lkcy5ucG1raWQ7Ci0JCQlXTF9XU0VDKCgid2xfaXdfc2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPSAiLAotCQkJCSZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtrXS5CU1NJRCkpOworCQkJV0xfV1NFQygid2xfaXdfc2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPSAiLAorCQkJCSZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtrXS5CU1NJRCk7CiAJCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykKLQkJCQlXTF9XU0VDKCgiJTAyeCAiLAotCQkJCQkgcG1raWRfbGlzdC5wbWtpZHMucG1raWRba10uUE1LSURbal0pKTsKLQkJCVdMX1dTRUMoKCJcbiIpKTsKKwkJCQlXTF9XU0VDKCIlMDJ4ICIsCisJCQkJCXBta2lkX2xpc3QucG1raWRzLnBta2lkW2tdLlBNS0lEW2pdKTsKKwkJCVdMX1dTRUMoIlxuIik7CiAJCX0KIAl9Ci0JV0xfV1NFQygoIlBSSU5USU5HIHBta2lkIExJU1QgLSBObyBvZiBlbGVtZW50cyAlZFxuIiwKLQkJIHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCkpOworCVdMX1dTRUMoIlBSSU5USU5HIHBta2lkIExJU1QgLSBObyBvZiBlbGVtZW50cyAlZFxuIiwKKwkJcG1raWRfbGlzdC5wbWtpZHMubnBta2lkKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG1raWRfbGlzdC5wbWtpZHMubnBta2lkOyBpKyspIHsKIAkJdWludCBqOwotCQlXTF9XU0VDKCgiUE1LSURbJWRdOiAlcE0gPSAiLCBpLAotCQkJJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lEKSk7CisJCVdMX1dTRUMoIlBNS0lEWyVkXTogJXBNID0gIiwKKwkJCWksICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCk7CiAJCWZvciAoaiA9IDA7IGogPCBXUEEyX1BNS0lEX0xFTjsgaisrKQotCQkJV0xfV1NFQygoIiUwMnggIiwgcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pKTsKLQkJV0xfV1NFQygoIlxuIikpOworCQkJV0xfV1NFQygiJTAyeCAiLCBwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5QTUtJRFtqXSk7CisJCVdMX1dTRUMoIlxuIik7CiAJfQotCVdMX1dTRUMoKCJcbiIpKTsKKwlXTF9XU0VDKCJcbiIpOwogCiAJaWYgKCFyZXQpCiAJCXJldCA9IGRldl93bGNfYnVmdmFyX3NldChkZXYsICJwbWtpZF9pbmZvIiwgKGNoYXIgKikmcG1raWRfbGlzdCwKQEAgLTI3NDIsNyArMjczOCw3IEBACiAJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKIHsKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRU5DT0RFRVhUXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFTkNPREVFWFRcbiIsIGRldi0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NTcsMTMgKzI3NTMsMTMgQEAKIAlpbnQgdmFsID0gMDsKIAl3bF9pd190ICppdyA9ICood2xfaXdfdCAqKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdBVVRIXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdBVVRIXG4iLCBkZXYtPm5hbWUpOwogCiAJcGFyYW1pZCA9IHZ3cnEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWDsKIAlwYXJhbXZhbCA9IHZ3cnEtPnZhbHVlOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0FVVEgsIHBhcmFtaWQgPSAweCUweCwgcGFyYW12YWwgPSAweCUweFxuIiwKLQkJICBkZXYtPm5hbWUsIHBhcmFtaWQsIHBhcmFtdmFsKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQVVUSCwgcGFyYW1pZCA9IDB4JTB4LCBwYXJhbXZhbCA9IDB4JTB4XG4iLAorCQkgZGV2LT5uYW1lLCBwYXJhbWlkLCBwYXJhbXZhbCk7CiAKIAlzd2l0Y2ggKHBhcmFtaWQpIHsKIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CkBAIC0yNzczLDggKzI3NjksOCBAQAogCQkJdmFsID0gV1BBX0FVVEhfUFNLIHwgV1BBX0FVVEhfVU5TUEVDSUZJRUQ7CiAJCWVsc2UgaWYgKHBhcmFtdmFsICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQogCQkJdmFsID0gV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKLQkJV0xfSU5GT1JNKCgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvIDB4JTB4XG4iLCBfX2Z1bmNfXywKLQkJCSAgIF9fTElORV9fLCB2YWwpKTsKKwkJV0xfSU5GT1JNKCIlczogJWQ6IHNldHRpbmcgd3BhX2F1dGggdG8gMHglMHhcbiIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKTsKIAkJZXJyb3IgPSBkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAid3BhX2F1dGgiLCB2YWwpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0yNzk3LDIwICsyNzkzLDE5IEBACiAJCX0KIAogCQlpZiAoaXctPnByaXZhY3lfaW52b2tlZCAmJiAhdmFsKSB7Ci0JCQlXTF9XU0VDKCgiJXM6ICVzOiAnUHJpdmFjeSBpbnZva2VkJyB0cnVlIGJ1dCBjbGVhcmluZyAiCi0JCQkJIndzZWMsIGFzc3VtaW5nICIgIndlJ3JlIGEgV1BTIGVucm9sbGVlXG4iLAotCQkJCWRldi0+bmFtZSwgX19mdW5jX18pKTsKKwkJCVdMX1dTRUMoIiVzOiAlczogJ1ByaXZhY3kgaW52b2tlZCcgdHJ1ZSBidXQgY2xlYXJpbmcgd3NlYywgYXNzdW1pbmcgd2UncmUgYSBXUFMgZW5yb2xsZWVcbiIsCisJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQllcnJvciA9IGRldl93bGNfaW50dmFyX3NldChkZXYsICJpc19XUFNfZW5yb2xsZWUiLAogCQkJCQkJCXRydWUpOwogCQkJaWYgKGVycm9yKSB7Ci0JCQkJV0xfV1NFQygoIkZhaWxlZCB0byBzZXQgaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJV0xfV1NFQygiRmFpbGVkIHRvIHNldCBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCXJldHVybiBlcnJvcjsKIAkJCX0KIAkJfSBlbHNlIGlmICh2YWwpIHsKIAkJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJZmFsc2UpOwogCQkJaWYgKGVycm9yKSB7Ci0JCQkJV0xfV1NFQygoIkZhaWxlZCB0byBjbGVhciBpc19XUFNfZW5yb2xsZWVcbiIpKTsKKwkJCQlXTF9XU0VDKCJGYWlsZWQgdG8gY2xlYXIgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CiAJCX0KQEAgLTI4MzcsOCArMjgzMiw4IEBACiAJCQllbHNlCiAJCQkJdmFsID0gV1BBMl9BVVRIX1VOU1BFQ0lGSUVEOwogCQl9Ci0JCVdMX0lORk9STSgoIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwgX19mdW5jX18sCi0JCQkgICBfX0xJTkVfXywgdmFsKSk7CisJCVdMX0lORk9STSgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCk7CiAJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjg1MCw3ICsyODQ1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCVdMX0lORk9STSgoIlNldHRpbmcgdGhlIEQxMWF1dGggJWRcbiIsIHBhcmFtdmFsKSk7CisJCVdMX0lORk9STSgiU2V0dGluZyB0aGUgRDExYXV0aCAlZFxuIiwgcGFyYW12YWwpOwogCQlpZiAocGFyYW12YWwgPT0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCiAJCQl2YWwgPSAwOwogCQllbHNlIGlmIChwYXJhbXZhbCA9PSBJV19BVVRIX0FMR19TSEFSRURfS0VZKQpAQCAtMjg3OSw4ICsyODc0LDggQEAKIAkJCQlkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHZhbCk7CiAJCQl9CiAJCQl2YWwgPSAwOwotCQkJV0xfSU5GT1JNKCgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKSk7CisJCQlXTF9JTkZPUk0oIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKTsKIAkJCWRldl93bGNfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIDApOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC0yODk3LDcgKzI4OTIsNyBAQAogCiAjaWYgV0lSRUxFU1NfRVhUID4gMTcKIAljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgotCQlXTF9JTkZPUk0oKCIlczogSVdfQVVUSF9ST0FNSU5HX0NPTlRST0xcbiIsIF9fZnVuY19fKSk7CisJCVdMX0lORk9STSgiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CiAJCXsKQEAgLTI5MDgsOCArMjkwMyw3IEBACiAJCQkJZXJyb3IgPSBkZXZfd2xjX2ludHZhcl9zZXQoZGV2LAogCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsIGZhbHNlKTsKIAkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJV0xfV1NFQygoIkZhaWxlZCB0byBjbGVhciBpb3ZhciAiCi0JCQkJCQkiaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBjbGVhciBpb3ZhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTI5MjMsOCArMjkxNyw3IEBACiAJCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJdHJ1ZSk7CiAJCQkJCWlmIChlcnJvcikgewotCQkJCQkJV0xfV1NFQygoIkZhaWxlZCB0byBzZXQgaW92YXIgIgotCQkJCQkJImlzX1dQU19lbnJvbGxlZVxuIikpOworCQkJCQkJV0xfV1NFQygiRmFpbGVkIHRvIHNldCBpb3ZhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQkJcmV0dXJuIGVycm9yOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKQEAgLTI5MzIsOCArMjkyNSw3IEBACiAJCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJZmFsc2UpOwogCQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gY2xlYXIgIgotCQkJCQkJCSJpc19XUFNfZW5yb2xsZWVcbiIpKTsKKwkJCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBjbGVhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQkJcmV0dXJuIGVycm9yOwogCQkJCQl9CiAJCQkJfQpAQCAtMjk2MCw3ICsyOTUyLDcgQEAKIAlpbnQgdmFsOwogCXdsX2l3X3QgKml3ID0gKih3bF9pd190ICoqKSBuZXRkZXZfcHJpdihkZXYpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0FVVEhcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FVVEhcbiIsIGRldi0+bmFtZSk7CiAKIAlwYXJhbWlkID0gdndycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYOwogCkBAIC0zMDQwLDcgKzMwMzIsNyBAQAogCQlicmVhazsKICNpZiBXSVJFTEVTU19FWFQgPiAxNwogCWNhc2UgSVdfQVVUSF9ST0FNSU5HX0NPTlRST0w6Ci0JCVdMX0VSUk9SKCgiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CiAJCXBhcmFtdmFsID0gaXctPnByaXZhY3lfaW52b2tlZDsKQEAgLTMxNTcsMTkgKzMxNDksMTkgQEAKIAljaGFyICpleHRyYSA9IE5VTEw7CiAJaW50IHRva2VuX3NpemUgPSAxLCBtYXhfdG9rZW5zID0gMCwgcmV0ID0gMDsKIAotCVdMX1RSQUNFKCgiXG4lcywgY21kOiV4IGFsbGVkIHZpYSBkaGQtPmRvX2lvY3RsKCllbnRyeSBwb2ludFxuIiwKLQkJICBfX2Z1bmNfXywgY21kKSk7CisJV0xfVFJBQ0UoIlxuJXMsIGNtZDoleCBhbGxlZCB2aWEgZGhkLT5kb19pb2N0bCgpZW50cnkgcG9pbnRcbiIsCisJCSBfX2Z1bmNfXywgY21kKTsKIAlpZiAoY21kIDwgU0lPQ0lXRklSU1QgfHwKIAkJSVdfSU9DVExfSURYKGNtZCkgPj0gQVJSQVlfU0laRSh3bF9pd19oYW5kbGVyKSkgewotCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggOiBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fLAotCQkJY21kKSk7CisJCVdMX0VSUk9SKCIlczogZXJyb3IgaW4gY21kPSV4IDogb3V0IG9mIHJhbmdlXG4iLAorCQkJIF9fZnVuY19fLCBjbWQpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJaGFuZGxlciA9IHdsX2l3X2hhbmRsZXJbSVdfSU9DVExfSURYKGNtZCldOwogCWlmICghaGFuZGxlcikgewotCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggOiBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGNtZCkpOworCQlXTF9FUlJPUigiJXM6IGVycm9yIGluIGNtZD0leCA6IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgX19mdW5jX18sIGNtZCk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyMzQsOSArMzIyNiw4IEBACiAKIAlpZiAobWF4X3Rva2VucyAmJiB3cnEtPnUuZGF0YS5wb2ludGVyKSB7CiAJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiBtYXhfdG9rZW5zKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggd3JxLT51LmRhdGEubGVuZ3RoPSVkICIKLQkJCSI+IG1heF90b2tlbnM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgY21kLCB3cnEtPnUuZGF0YS5sZW5ndGgsIG1heF90b2tlbnMpKTsKKwkJCVdMX0VSUk9SKCIlczogZXJyb3IgaW4gY21kPSV4IHdycS0+dS5kYXRhLmxlbmd0aD0lZCA+IG1heF90b2tlbnM9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBjbWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgbWF4X3Rva2Vucyk7CiAJCQlyZXR1cm4gLUUyQklHOwogCQl9CiAJCWV4dHJhID0ga21hbGxvYyhtYXhfdG9rZW5zICogdG9rZW5fc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0zMzM5LDcgKzMzMzAsNyBAQAogCQltZW1zZXQoc3RyaW5nQnVmLCAwLCBidWZsZW4pOwogCQlzbnByaW50ZihzdHJpbmdCdWYsIGJ1ZmxlbiwgIiVzICVzICUwMmQgJTAyZCIsCiAJCQkgbmFtZSwgY2F1c2UsIHN0YXR1cywgcmVhc29uKTsKLQkJV0xfSU5GT1JNKCgiQ29ubmVjdGlvbiBzdGF0dXM6ICVzXG4iLCBzdHJpbmdCdWYpKTsKKwkJV0xfSU5GT1JNKCJDb25uZWN0aW9uIHN0YXR1czogJXNcbiIsIHN0cmluZ0J1Zik7CiAJCXJldHVybiB0cnVlOwogCX0gZWxzZSB7CiAJCXJldHVybiBmYWxzZTsKQEAgLTMzODMsNDYgKzMzNzQsNDYgQEAKIAlpdyA9IDA7CiAKIAlpZiAoIWRldikgewotCQlXTF9FUlJPUigoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBkZXY9JXMgZXZlbnQ9JWRcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUsIGV2ZW50X3R5cGUpKTsKKwlXTF9UUkFDRSgiJXM6IGRldj0lcyBldmVudD0lZFxuIiwgX19mdW5jX18sIGRldi0+bmFtZSwgZXZlbnRfdHlwZSk7CiAKIAlzd2l0Y2ggKGV2ZW50X3R5cGUpIHsKIAljYXNlIFdMQ19FX1RYRkFJTDoKIAkJY21kID0gSVdFVlRYRFJPUDsKLQkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhfQUxFTik7CiAJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCWJyZWFrOwogI2lmIFdJUkVMRVNTX0VYVCA+IDE0CiAJY2FzZSBXTENfRV9KT0lOOgogCWNhc2UgV0xDX0VfQVNTT0NfSU5EOgogCWNhc2UgV0xDX0VfUkVBU1NPQ19JTkQ6Ci0JCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQljbWQgPSBJV0VWUkVHSVNURVJFRDsKIAkJYnJlYWs7CiAJY2FzZSBXTENfRV9ERUFVVEhfSU5EOgogCWNhc2UgV0xDX0VfRElTQVNTT0NfSU5EOgogCQljbWQgPSBTSU9DR0lXQVA7Ci0JCWJ6ZXJvKHdycXUuYWRkci5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbXNldCh3cnF1LmFkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQliemVybygmZXh0cmEsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtc2V0KCZleHRyYSwgMCwgRVRIX0FMRU4pOwogCQlicmVhazsKIAljYXNlIFdMQ19FX0xJTks6CiAJY2FzZSBXTENfRV9ORElTX0xJTks6CiAJCWNtZCA9IFNJT0NHSVdBUDsKIAkJaWYgKCEoZmxhZ3MgJiBXTENfRVZFTlRfTVNHX0xJTkspKSB7Ci0JCQliemVybyh3cnF1LmFkZHIuc2FfZGF0YSwgRVRIRVJfQUREUl9MRU4pOwotCQkJYnplcm8oJmV4dHJhLCBFVEhFUl9BRERSX0xFTik7CisJCQltZW1zZXQod3JxdS5hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJCW1lbXNldCgmZXh0cmEsIDAsIEVUSF9BTEVOKTsKIAkJCVdBS0VfTE9DS19USU1FT1VUKGl3LT5wdWIsIFdBS0VfTE9DS19MSU5LX0RPV05fVE1PVVQsCiAJCQkJCSAgMjAgKiBIWik7CiAJCX0gZWxzZSB7Ci0JCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhFUl9BRERSX0xFTik7Ci0JCQlXTF9UUkFDRSgoIkxpbmsgVVBcbiIpKTsKKwkJCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCVdMX1RSQUNFKCJMaW5rIFVQXG4iKTsKIAogCQl9CiAJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CkBAIC0zNDMzLDggKzM0MjQsOCBAQAogCQkJd3JxdS5kYXRhLmxlbmd0aCA9IGRhdGFsZW4gKyAxOwogCQkJZXh0cmFbMF0gPSBXTENfRV9BQ1RJT05fRlJBTUU7CiAJCQltZW1jcHkoJmV4dHJhWzFdLCBkYXRhLCBkYXRhbGVuKTsKLQkJCVdMX1RSQUNFKCgiV0xDX0VfQUNUSU9OX0ZSQU1FIGxlbiAlZCBcbiIsCi0JCQkJICB3cnF1LmRhdGEubGVuZ3RoKSk7CisJCQlXTF9UUkFDRSgiV0xDX0VfQUNUSU9OX0ZSQU1FIGxlbiAlZFxuIiwKKwkJCQkgd3JxdS5kYXRhLmxlbmd0aCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTM0NjQsNyArMzQ1NSw3IEBACiAJCQllbHNlCiAJCQkJbWljZXJyZXZ0LT5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOwogCQkJbWVtY3B5KG1pY2VycmV2dC0+c3JjX2FkZHIuc2FfZGF0YSwgJmUtPmFkZHIsCi0JCQkgICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCW1pY2VycmV2dC0+c3JjX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCiAJCQlicmVhazsKQEAgLTM0ODcsMTQgKzM0NzgsMTQgQEAKIAkJCQl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19wbWtpZF9jYW5kKTsKIAkJCQlwbWtpZGNhbmQgPSBwbWtjYW5kbGlzdC0+cG1raWRfY2FuZDsKIAkJCQl3aGlsZSAoY291bnQpIHsKLQkJCQkJYnplcm8oaXdwbWtpZGNhbmQsCisJCQkJCW1lbXNldChpd3Bta2lkY2FuZCwgMCwKIAkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpd19wbWtpZF9jYW5kKSk7CiAJCQkJCWlmIChwbWtpZGNhbmQtPnByZWF1dGgpCiAJCQkJCQlpd3Bta2lkY2FuZC0+ZmxhZ3MgfD0KIAkJCQkJCSAgICBJV19QTUtJRF9DQU5EX1BSRUFVVEg7CiAJCQkJCWJjb3B5KCZwbWtpZGNhbmQtPkJTU0lELAogCQkJCQkgICAgICAmaXdwbWtpZGNhbmQtPmJzc2lkLnNhX2RhdGEsCi0JCQkJCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCQkJICAgICAgRVRIX0FMRU4pOwogI2lmbmRlZiBTQU5ER0FURTJHCiAJCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICZ3cnF1LAogCQkJCQkJCSAgICBleHRyYSk7CkBAIC0zNTE1LDEzICszNTA2LDEzIEBACiAJCX0gZWxzZSB7CiAJCQljbWQgPSBTSU9DR0lXU0NBTjsKIAkJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpOwotCQkJV0xfVFJBQ0UoKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFIGZyb20gc3BlY2lmaWMgIgotCQkJCSJzY2FuICVkXG4iLCBnX2lzY2FuLT5pc2Nhbl9zdGF0ZSkpOworCQkJV0xfVFJBQ0UoIkV2ZW50IFdMQ19FX1NDQU5fQ09NUExFVEUgZnJvbSBzcGVjaWZpYyBzY2FuICVkXG4iLAorCQkJCSBnX2lzY2FuLT5pc2Nhbl9zdGF0ZSk7CiAJCX0KICNlbHNlCiAJCWNtZCA9IFNJT0NHSVdTQ0FOOwogCQl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKLQkJV0xfVFJBQ0UoKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFXG4iKSk7CisJCVdMX1RSQUNFKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFXG4iKTsKICNlbmRpZgogCQlicmVhazsKIApAQCAtMzUyOSw5ICszNTIwLDkgQEAKIAkJewogCQkJd2xjX3NzaWRfdCAqc3NpZDsKIAkJCXNzaWQgPSAod2xjX3NzaWRfdCAqKSBkYXRhOwotCQkJV0xfRVJST1IoKCIlcyBFdmVudCBXTENfRV9QRk5fTkVUX0ZPVU5ELCBzZW5kICVzIHVwIDogIgotCQkJCSJmaW5kICVzIGxlbj0lZFxuIiwgX19mdW5jX18sIFBOT19FVkVOVF9VUCwKLQkJCQlzc2lkLT5TU0lELCBzc2lkLT5TU0lEX2xlbikpOworCQkJV0xfRVJST1IoIiVzIEV2ZW50IFdMQ19FX1BGTl9ORVRfRk9VTkQsIHNlbmQgJXMgdXAgOiBmaW5kICVzIGxlbj0lZFxuIiwKKwkJCQkgX19mdW5jX18sIFBOT19FVkVOVF9VUCwKKwkJCQkgc3NpZC0+U1NJRCwgc3NpZC0+U1NJRF9sZW4pOwogCQkJV0FLRV9MT0NLX1RJTUVPVVQoaXctPnB1YiwgV0FLRV9MT0NLX1BOT19GSU5EX1RNT1VULAogCQkJCQkgIDIwICogSFopOwogCQkJY21kID0gSVdFVkNVU1RPTTsKQEAgLTM1NDIsNyArMzUzMyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJV0xfVFJBQ0UoKCJVbmtub3duIEV2ZW50ICVkOiBpZ25vcmluZ1xuIiwgZXZlbnRfdHlwZSkpOworCQlXTF9UUkFDRSgiVW5rbm93biBFdmVudCAlZDogaWdub3JpbmdcbiIsIGV2ZW50X3R5cGUpOwogCQlicmVhazsKIAl9CiAjaWZuZGVmIFNBTkRHQVRFMkcKQEAgLTM1ODMsMTUgKzM1NzQsMTUgQEAKIAkJZ290byBkb25lOwogCiAJcGh5X25vaXNlID0gZHRvaDMyKHBoeV9ub2lzZSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgcGh5IG5vaXNlPSVkXG4iLCBwaHlfbm9pc2UpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIHBoeSBub2lzZT0lZFxuIiwgcGh5X25vaXNlKTsKIAotCWJ6ZXJvKCZzY2JfdmFsLCBzaXplb2Yoc2NiX3ZhbF90KSk7CisJbWVtc2V0KCZzY2JfdmFsLCAwLCBzaXplb2Yoc2NiX3ZhbF90KSk7CiAJcmVzID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUlNTSSwgJnNjYl92YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKIAlpZiAocmVzKQogCQlnb3RvIGRvbmU7CiAKIAlyc3NpID0gZHRvaDMyKHNjYl92YWwudmFsKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyByc3NpPSVkXG4iLCByc3NpKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyByc3NpPSVkXG4iLCByc3NpKTsKIAlpZiAocnNzaSA8PSBXTF9JV19SU1NJX05PX1NJR05BTCkKIAkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOwogCWVsc2UgaWYgKHJzc2kgPD0gV0xfSVdfUlNTSV9WRVJZX0xPVykKQEAgLTM2MTQsMjMgKzM2MDUsMjEgQEAKICNlbmRpZgogCiAjaWYgV0lSRUxFU1NfRVhUID4gMTEKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycz0lZFxuIiwKLQkJICAoaW50KXNpemVvZih3bF9jbnRfdCkpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzPSV6dVxuIiwgc2l6ZW9mKHdsX2NudF90KSk7CiAKIAltZW1zZXQoJmNudCwgMCwgc2l6ZW9mKHdsX2NudF90KSk7CiAJcmVzID0KIAkgICAgZGV2X3dsY19idWZ2YXJfZ2V0KGRldiwgImNvdW50ZXJzIiwgKGNoYXIgKikmY250LCBzaXplb2Yod2xfY250X3QpKTsKIAlpZiAocmVzKSB7Ci0JCVdMX0VSUk9SKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIGZhaWxlZCBlcnJvcj0lZFxuIiwKLQkJCSAgcmVzKSk7CisJCVdMX0VSUk9SKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgZmFpbGVkIGVycm9yPSVkXG4iLAorCQkJIHJlcyk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAljbnQudmVyc2lvbiA9IGR0b2gxNihjbnQudmVyc2lvbik7CiAJaWYgKGNudC52ZXJzaW9uICE9IFdMX0NOVF9UX1ZFUlNJT04pIHsKLQkJV0xfVFJBQ0UoKCJcdEluY29ycmVjdCB2ZXJzaW9uIG9mIGNvdW50ZXJzIHN0cnVjdDogZXhwZWN0ZWQgIgotCQkJIiVkOyBnb3QgJWRcbiIsCi0JCQlXTF9DTlRfVF9WRVJTSU9OLCBjbnQudmVyc2lvbikpOworCQlXTF9UUkFDRSgiXHRJbmNvcnJlY3QgdmVyc2lvbiBvZiBjb3VudGVycyBzdHJ1Y3Q6IGV4cGVjdGVkICVkOyBnb3QgJWRcbiIsCisJCQkgV0xfQ05UX1RfVkVSU0lPTiwgY250LnZlcnNpb24pOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0zNjQxLDIyICszNjMwLDIyIEBACiAJd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSBkdG9oMzIoY250LnJ4cnVudCkgKyBkdG9oMzIoY250LnJ4Z2lhbnQpOwogCXdzdGF0cy0+bWlzcy5iZWFjb24gPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgdHhmcmFtZT0lZCB0eGJ5dGU9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC50eGZyYW1lKSwgZHRvaDMyKGNudC50eGJ5dGUpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhmcm10b29sb25nPSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnhmcm10b29sb25nKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4YmFkcGxjcD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4YmFkcGxjcCkpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHVuZGVjPSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnh1bmRlYykpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGZyYWdlcnI9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC5yeGZyYWdlcnIpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgdHhmYWlsPSVkXG4iLAotCQkgIGR0b2gzMihjbnQudHhmYWlsKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4cnVudD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4cnVudCkpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGdpYW50PSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnhnaWFudCkpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHR4ZnJhbWU9JWQgdHhieXRlPSVkXG4iLAorCQkgZHRvaDMyKGNudC50eGZyYW1lKSwgZHRvaDMyKGNudC50eGJ5dGUpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4ZnJtdG9vbG9uZz0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4ZnJtdG9vbG9uZykpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhiYWRwbGNwPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnhiYWRwbGNwKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHVuZGVjPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnh1bmRlYykpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhmcmFnZXJyPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnhmcmFnZXJyKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyB0eGZhaWw9JWRcbiIsCisJCSAgZHRvaDMyKGNudC50eGZhaWwpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4cnVudD0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4cnVudCkpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhnaWFudD0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4Z2lhbnQpKTsKICNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgPiAxMSAqLwogCiBkb25lOgpAQCAtMzY5MCw4ICszNjc5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGlzY2FuLCAwLCBzaXplb2YoaXNjYW5faW5mb190KSk7CiAKLQlpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AgPQotCSAgICAod2xfaXNjYW5fcGFyYW1zX3QgKikga21hbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wID0ga21hbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3ApCiAJCXJldHVybiAtRU5PTUVNOwogCWlzY2FuLT5pc2Nhbl9leF9wYXJhbV9zaXplID0gcGFyYW1zX3NpemU7CkBAIC0zNzIzLDkgKzM3MTEsNyBAQAogCXByaXZfZGV2ID0gZGV2OwogCU1VVEVYX0xPQ0tfU09GVEFQX1NFVF9JTklUKGl3LT5wdWIpOwogI2VuZGlmCi0JZ19zY2FuID0gTlVMTDsKLQotCWdfc2NhbiA9ICh2b2lkICopa21hbGxvYyhHX1NDQU5fUkVTVUxUUywgR0ZQX0tFUk5FTCk7CisJZ19zY2FuID0ga21hbGxvYyhHX1NDQU5fUkVTVUxUUywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnX3NjYW4pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmgKaW5kZXggZWRiZjYxZi4uYzg2MzdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuaApAQCAtNzgsNyArNzgsNyBAQAogCiAjZGVmaW5lIENIRUNLX0VYVFJBX0ZPUl9OVUxMKGV4dHJhKSBcCiBpZiAoIWV4dHJhKSB7IFwKLQlXTF9FUlJPUigoIiVzOiBlcnJvciA6IGV4dHJhIGlzIG51bGwgcG9pbnRlclxuIiwgX19mdW5jX18pKTsgXAorCVdMX0VSUk9SKCIlczogZXJyb3IgOiBleHRyYSBpcyBudWxsIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsJXAogCXJldHVybiAtRUlOVkFMOyBcCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U1ZDhmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQkNNX1JQQ19IXwotI2RlZmluZSBfQkNNX1JQQ19IXwotCi0jaW5jbHVkZSA8cnBjX29zbC5oPgotCi10eXBlZGVmIHN0cnVjdCBycGNfaW5mbyBycGNfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2J1ZiBycGNfYnVmX3Q7Ci1zdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvOwotdHlwZWRlZiB2b2lkICgqcnBjX2Rpc3BhdGNoX2NiX3QpICh2b2lkICpjdHgsIHN0cnVjdCBycGNfYnVmICpidWYpOwotdHlwZWRlZiB2b2lkICgqcnBjX3Jlc3luY19jYl90KSAodm9pZCAqY3R4KTsKLXR5cGVkZWYgdm9pZCAoKnJwY19kb3duX2NiX3QpICh2b2lkICpjdHgpOwotdHlwZWRlZiB2b2lkICgqcnBjX3R4ZG9uZV9jYl90KSAodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKTsKLWV4dGVybiBzdHJ1Y3QgcnBjX2luZm8gKmJjbV9ycGNfYXR0YWNoKHZvaWQgKnBkZXYsIG9zbF90ICpvc2gsCi0JCQkJICAgICAgIHN0cnVjdCBycGNfdHJhbnNwb3J0X2luZm8gKnJwY190aCk7Ci0KLWV4dGVybiB2b2lkIGJjbV9ycGNfZGV0YWNoKHN0cnVjdCBycGNfaW5mbyAqcnBjKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfZG93bihzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3dhdGNoZG9nKHN0cnVjdCBycGNfaW5mbyAqcnBjKTsKLQotZXh0ZXJuIHN0cnVjdCBycGNfYnVmICpiY21fcnBjX2J1Zl9hbGxvYyhzdHJ1Y3QgcnBjX2luZm8gKnJwYywgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX2J1Zl9mcmVlKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0vKiBnZXQgcnBjIHRyYW5zcG9ydCBoYW5kbGUgKi8KLWV4dGVybiBzdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvICpiY21fcnBjX3RwX2dldChzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci0KLS8qIGNhbGxiYWNrIGZvcjogZGF0YV9yeCwgZG93biwgcmVzeW5jICovCi1leHRlcm4gdm9pZCBiY21fcnBjX3J4Y2JfaW5pdChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgdm9pZCAqY3R4LAotCQkJICAgICAgcnBjX2Rpc3BhdGNoX2NiX3QgY2IsIHZvaWQgKmRuY3R4LAotCQkJICAgICAgcnBjX2Rvd25fY2JfdCBkbmNiLCBycGNfcmVzeW5jX2NiX3QgcmVzeW5jX2NiLAotCQkJICAgICAgcnBjX3R4ZG9uZV9jYl90KTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfcnhjYl9kZWluaXQoc3RydWN0IHJwY19pbmZvICpycGNpKTsKLQotLyogSE9TVCBvciBDTElFTlQgcnBjIGNhbGwsIHJlcXVpcmluZyBubyByZXR1cm4gdmFsdWUgKi8KLWV4dGVybiBpbnQgYmNtX3JwY19jYWxsKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0KLS8qIEhPU1QgcnBjIGNhbGwsIGRlbWFuZGluZyByZXR1cm4uCi0gKiAgIFRoZSB0aHJlYWQgbWF5IGJlIHN1c3BlbmRlZCBhbmQgY29udHJvbCByZXR1cm5zIGJhY2sgdG8gT1MKLSAqICAgVGhlIHRocmVhZCB3aWxsIHJlc3VtZSh3YWtlZCB1cCkgb24gZWl0aGVyIHRoZSByZXR1cm4gc2lnbmFsIHJlY2VpdmVkIG9yIHRpbWVvdXQKLSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBkZXBlbmQgb24gT1MKLSAqLwotZXh0ZXJuIHN0cnVjdCBycGNfYnVmICpiY21fcnBjX2NhbGxfd2l0aF9yZXR1cm4oc3RydWN0IHJwY19pbmZvICpycGMsCi0JCQkJCQlzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0KLS8qIENMSUVOVCBycGMgY2FsbCB0byByZXNwb25kIHRvIGJjbV9ycGNfY2FsbF93aXRoX3JldHVybiwgcmVxdWlyaW5nIG5vIHJldHVybiB2YWx1ZSAqLwotZXh0ZXJuIGludCBiY21fcnBjX2NhbGxfcmV0dXJuKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqcmV0Yik7Ci0KLWV4dGVybiB1aW50IGJjbV9ycGNfYnVmX2hlYWRlcl9sZW4oc3RydWN0IHJwY19pbmZvICpycGNpKTsKLQotI2RlZmluZSBSUENfUEtUTE9HX1NJWkUJCTUwCS8qIERlcHRoIG9mIHRoZSBoaXN0b3J5ICovCi0jZGVmaW5lIFJQQ19QS1RMT0dfUkRfTEVOCTMKLSNkZWZpbmUgUlBDX1BLVExPR19EVU1QX1NJWkUJMTUwCS8qIGR1bXAgc2l6ZSBzaG91bGQgYmUgbW9yZSB0aGFuIHRoZSBwcm9kdWN0IG9mIGFib3ZlIHR3byAqLwotZXh0ZXJuIGludCBiY21fcnBjX3BrdGxvZ19nZXQoc3RydWN0IHJwY19pbmZvICpycGNpLCB1MzIgKmJ1ZiwKLQkJCSAgICAgIHVpbnQgYnVmX3NpemUsIGJvb2wgc2VuZCk7Ci1leHRlcm4gaW50IGJjbV9ycGNfZHVtcChycGNfaW5mb190ICpycGNpLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLQotLyogSElHSC9CTUFDOiBiaXQgMTUtODogUlBDIG1vZHVsZSwgYml0IDctMDogVFAgbW9kdWxlICovCi0jZGVmaW5lIFJQQ19FUlJPUl9WQUwJMHgwMDAxCi0jZGVmaW5lIFJQQ19UUkFDRV9WQUwJMHgwMDAyCi0jZGVmaW5lIFJQQ19QS1RUUkFDRV9WQUwgMHgwMDA0Ci0jZGVmaW5lIFJQQ19QS1RMT0dfVkFMCTB4MDAwOAotZXh0ZXJuIHZvaWQgYmNtX3JwY19tc2dsZXZlbF9zZXQoc3RydWN0IHJwY19pbmZvICpycGNpLCB1MTYgbXNnbGV2ZWwsCi0JCQkJIGJvb2wgaGlnaF9sb3cpOwotCi0jZW5kaWYJCQkJLyogX0JDTV9SUENfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjX3RwLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwY190cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjhkYzZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjX3RwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2JjbV9ycGNfdHBfaF8KLSNkZWZpbmUgX2JjbV9ycGNfdHBfaF8KLSNpbmNsdWRlIDxiY21fcnBjLmg+Ci0KLSNkZWZpbmUgREJVU19SWF9CVUZGRVJfU0laRV9SUEMJKDIxMDApCS8qIHJ4YnVmc2l6ZSBmb3IgZGJ1c19hdHRhY2gsIGxpbnV4IG9ubHkgZm9yIG5vdyAqLwotCi0jZGVmaW5lIEJDTV9SUENfVFBfRU5DQVBfTEVOCTQJLyogVFAgaGVhZGVyIGlzIDQgYnl0ZXMgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX01BU0sJMHhmZmZmMDAwMAotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX1NISUZUCTE2Ci0jZGVmaW5lIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUJMHgwMDAxMDAwMAkvKiBIT1NULT5ETkdMIGFtcGR1IGFnZ3JlZ2F0aW9uICovCi0jZGVmaW5lIEJDTV9SUENfVFBfSE9TVF9BR0dfVEVTVAkweDAwMTAwMDAwCS8qIEhPU1QtPkROR0wgdGVzdCBhZ2dyZWdhdGlvbiAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX01BU0sJMHgwMDAwZmZmZgotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX0RQQwkJMHgwMDAwMDAwMQkvKiBETkdMLT5IT1NUIGRhdGEgYWdncmVnYXRpb24gKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19GTE9XQ1RMCTB4MDAwMDAwMDIJLyogRE5HTC0+SE9TVCB0eCBmbG93Y29udHJvbCBhZ2cgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19URVNUCTB4MDAwMDAwMTAJLyogRE5HTC0+SE9TVCB0ZXN0IGFnZyAqLwotCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfTUFYX1NGUkFNRQkzCS8qIG1heCBhZ2cgc3ViZnJhbWVzLCBtdXN0IGJlIDw9IFVTQl9OVFhEICovCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfTUFYX0JZVEUJNDAwMAkvKiBtYXggYWdnIGJ5dGVzICovCi0KLSNkZWZpbmUgQkNNX1JQQ19UUF9IT1NUX0FHR19NQVhfU0ZSQU1FICAzCS8qIG1heCBhZ2cgc3ViZnJhbWVzLCBBTVBEVSBvbmx5LCAzIGlzIGVub3VnaCAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX01BWF9CWVRFICAgIDM0MDAJLyogbWF4IGFnZyBieXRlczsgdG8gZml0IDIrIHRjcC91ZHAgcGt0cy4gRWFjaCBvbmU6Ci0JCQkJCQkgKiA4MDIuM3BrdCArIDgwMi4xMSBoZHIgKyBycGMgaGRyICsgdHAgaGRyIDwgMTcwMEIKLQkJCQkJCSAqIE5lZWQgdG8gYmUgaW4gc3luYyB3aXRoIGRvbmdsZSB1c2IgcnggZG1hCi0JCQkJCQkgKiAgcnhidWZzaXplKFVTQkJVTEtfUlhCVUZfR0lBTlQgaW4gdXNiZGV2X3NiLmMpCi0JCQkJCQkgKi8KLS8qIFRQLURCVVMgcGt0cyBmbG93Y29udHJvbCAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlRYUQk1MAkvKiBxdWV1ZSBzaXplIGZvciBUWCBvbiBidWxrIE9VVCwgYWdncmVnYXRpb24gcG9zc2libGUgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05SWFEJNTAJLyogcXVldWUgc2l6ZSBmb3IgUlggb24gYnVsayBJTiwgYWdncmVnYXRpb24gcG9zc2libGUgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05SWFFfQ1RSTAkxCS8qIHF1ZXVlIHNpemUgZm9yIFJYIG9uIGN0bCBFUDAgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlJYUV9QS1QJKEJDTV9SUENfVFBfREJVU19OUlhRICogQkNNX1JQQ19UUF9ETkdMX0FHR19NQVhfU0ZSQU1FKQotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlRYUV9QS1QJKEJDTV9SUENfVFBfREJVU19OVFhRICogQkNNX1JQQ19UUF9IT1NUX0FHR19NQVhfU0ZSQU1FKQotCi10eXBlZGVmIHN0cnVjdCBycGNfdHJhbnNwb3J0X2luZm8gcnBjX3RwX2luZm9fdDsKLQotdHlwZWRlZiB2b2lkICgqcnBjX3R4X2NvbXBsZXRlX2ZuX3QpICh2b2lkICosIHJwY19idWZfdCAqLCBpbnQgc3RhdHVzKTsKLXR5cGVkZWYgdm9pZCAoKnJwY19yeF9mbl90KSAodm9pZCAqLCBycGNfYnVmX3QgKik7Ci0KLSNpZmRlZiBXTENfTE9XCi10eXBlZGVmIHZvaWQgKCpycGNfdHhmbG93Y3RsX2NiX3QpICh2b2lkICpjdHgsIGJvb2wgb24pOwotI2VuZGlmCi0KLWV4dGVybiBycGNfdHBfaW5mb190ICpiY21fcnBjX3RwX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpidXMpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9kZXRhY2gocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2Rvd24ocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX3dhdGNoZG9nKHJwY190cF9pbmZvX3QgKnJwY2IpOwotCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfYnVmX3NlbmQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpidWYpOwotCi0vKiBjYWxsYmFjayBmb3IgdHhfY29tcGxldGUsIHJ4X3BrdCAqLwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9yZWdpc3Rlcl9jYihycGNfdHBfaW5mb190ICpycGNiLAotCQkJCSAgIHJwY190eF9jb21wbGV0ZV9mbl90IHR4Y21wbHQsCi0JCQkJICAgdm9pZCAqdHhfY29udGV4dCwgcnBjX3J4X2ZuX3Qgcnhwa3QsCi0JCQkJICAgdm9pZCAqcnhfY29udGV4dCwgcnBjX29zbF90ICpycGNfb3NoKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfZGVyZWdpc3Rlcl9jYihycGNfdHBfaW5mb190ICpycGNiKTsKLQotLyogQnVmZmVyIG1hbmlwdWxhdGlvbiAqLwotZXh0ZXJuIHVpbnQgYmNtX3JwY19idWZfdHBfaGVhZGVyX2xlbihycGNfdHBfaW5mb190ICpycGNiKTsKLWV4dGVybiBycGNfYnVmX3QgKmJjbV9ycGNfdHBfYnVmX2FsbG9jKHJwY190cF9pbmZvX3QgKnJwY2IsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9idWZfZnJlZShycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmJ1Zik7Ci1leHRlcm4gaW50IGJjbV9ycGNfYnVmX2xlbl9nZXQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiKTsKLWV4dGVybiBpbnQgYmNtX3JwY19idWZfbGVuX3NldChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsIHVpbnQgbGVuKTsKLWV4dGVybiBycGNfYnVmX3QgKmJjbV9ycGNfYnVmX25leHRfZ2V0KHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX2J1Zl9uZXh0X3NldChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsCi0JCQkJIHJwY19idWZfdCAqbmV4dGIpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmJjbV9ycGNfYnVmX2RhdGEocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICpiY21fcnBjX2J1Zl9wdXNoKHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYiwKLQkJCQkgICAgICAgdWludCBkZWx0YSk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciAqYmNtX3JwY19idWZfcHVsbChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsCi0JCQkJICAgICAgIHVpbnQgZGVsdGEpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9idWZfcmVsZWFzZShycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmJ1Zik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2J1Zl9jbnRfYWRqdXN0KHJwY190cF9pbmZvX3QgKnJwY2IsIGludCBhZGp1c3QpOwotLyogUlBDIGNhbGxfd2l0aF9yZXR1cm4gKi8KLWV4dGVybiBpbnQgYmNtX3JwY190cF9yZWN2X3J0bihycGNfdHBfaW5mb190ICpycGNiKTsKLWV4dGVybiBpbnQgYmNtX3JwY190cF9nZXRfZGV2aWNlX3NwZWVkKHJwY190cF9pbmZvX3QgKnJwY190aCk7Ci0jaWZkZWYgQkNNREJHCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfZHVtcChycGNfdHBfaW5mb190ICpycGNiLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLSNlbmRpZgotCi0jaWZkZWYgV0xDX0xPVwotLyogaW50ZXJjZXB0IFVTQiBwa3QgdG8gcGFyc2UgUlBDIGhlYWRlcjogVVNCIGRyaXZlciByeC0+IHdsX3NlbmQgLT4gdGhpcyAtPiB3bCBkcml2ZXIgKi8KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfcnhfZnJvbV9kbmdsYnVzKHJwY190cF9pbmZvX3QgKnJwY190aCwgc3RydWN0IGxidWYgKmxiKTsKLQotLyogUlBDIGNhbGxyZXR1cm4gcGt0LCBnbyB0byBVU0IgZHJpdmVyIHR4ICovCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfc2VuZF9jYWxscmV0dXJuKHJwY190cF9pbmZvX3QgKnJwY190aCwgcnBjX2J1Zl90ICpiKTsKLQotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9kdW1wKHJwY190cF9pbmZvX3QgKnJwY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGwocnBjX3RwX2luZm9fdCAqcnBjYiwgYm9vbCBzdGF0ZSwgaW50IHByaW8pOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGxjYl9pbml0KHJwY190cF9pbmZvX3QgKnJwY190aCwgdm9pZCAqY3R4LAotCQkJCQlycGNfdHhmbG93Y3RsX2NiX3QgY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGxjYl9kZWluaXQocnBjX3RwX2luZm9fdCAqcnBjX3RoKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhxX3dtX3NldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4IGhpd20sCi0JCQkJICB1OCBsb3dtKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhxX3dtX2dldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4ICpoaXdtLAotCQkJCSAgdTggKmxvd20pOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KLQotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9hZ2dfc2V0KHJwY190cF9pbmZvX3QgKnJwY2IsIHUzMiByZWFzb24sIGJvb2wgc2V0KTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYWdnX2xpbWl0X3NldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4IHNmLAotCQkJCSAgICAgdTE2IGJ5dGVzKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYWdnX2xpbWl0X2dldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4ICpzZiwKLQkJCQkgICAgIHUxNiAqYnl0ZXMpOwotCi0jZGVmaW5lIEJDTV9SUENfVFBfTVNHX0xFVkVMX01BU0sJMHgwMGZmCi0vKiBkb25nbGUgbXNnIGxldmVsICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfRE5HTF9FUlJfVkFMCQkweDAwMDEJLyogRE5HTCBUUCBlcnJvciBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0RCR19WQUwJCTB4MDAwMgkvKiBETkdMIFRQIGRiZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0FHR19WQUwJCTB4MDAwNAkvKiBETkdMIFRQIGFnZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0RFQV9WQUwJCTB4MDAwOAkvKiBETkdMIFRQIGRlYWcgbXNnICovCi0KLS8qIGhvc3QgbXNnIGxldmVsICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfSE9TVF9FUlJfVkFMCQkweDAwMDEJLyogRE5HTCBUUCBlcnJvciBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0RCR19WQUwJCTB4MDAwMgkvKiBETkdMIFRQIGRiZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0FHR19WQUwJCTB4MDAwNAkvKiBETkdMIFRQIGFnZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0RFQV9WQUwJCTB4MDAwOAkvKiBETkdMIFRQIGRlYWcgbXNnICovCi0KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfbXNnbGV2ZWxfc2V0KHJwY190cF9pbmZvX3QgKnJwY190aCwgdTggbXNnbGV2ZWwsCi0JCQkJICAgIGJvb2wgaGlnaF9sb3cpOwotCi0jZW5kaWYJCQkJLyogX2JjbV9ycGNfdHBfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21feGRyLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZiZDc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21feGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQkNNX1hEUl9ICi0jZGVmaW5lIF9CQ01fWERSX0gKLQotLyoKLSAqIGJjbV94ZHJfYnVmX3QKLSAqIFN0cnVjdHVyZSB1c2VkIGZvciBib29ra2VlcGluZyBvZiBhIGJ1ZmZlciBiZWluZyBwYWNrZWQgb3IgdW5wYWNrZWQuCi0gKiBLZWVwcyBhIGN1cnJlbnQgcmVhZC93cml0ZSBwb2ludGVyIGFuZCBzaXplIGFzIHdlbGwgYXMKLSAqIHRoZSBvcmlnaW5hbCBidWZmZXIgcG9pbnRlciBhbmQgc2l6ZS4KLSAqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1OCAqYnVmOwkJLyogcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdidWYgKi8KLQl1aW50IHNpemU7CQkvKiBjdXJyZW50IChyZXNpZHVhbCkgc2l6ZSBpbiBieXRlcyAqLwotCXU4ICpvcmlnYnVmOwkJLyogdW5tb2RpZmllZCBwb2ludGVyIHRvIG9yaWduYWwgYnVmZmVyICovCi0JdWludCBvcmlnc2l6ZTsJCS8qIHVubW9kaWZpZWQgb3JpZ25hbCBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotfSBiY21feGRyX2J1Zl90OwotCi12b2lkIGJjbV94ZHJfYnVmX2luaXQoYmNtX3hkcl9idWZfdCAqYiwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKLQotaW50IGJjbV94ZHJfcGFja191MzIoYmNtX3hkcl9idWZfdCAqYiwgdTMyIHZhbCk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfdTMyKGJjbV94ZHJfYnVmX3QgKmIsIHUzMiAqcHZhbCk7Ci1pbnQgYmNtX3hkcl9wYWNrX3MzMihiY21feGRyX2J1Zl90ICpiLCBzMzIgdmFsKTsKLWludCBiY21feGRyX3VucGFja19zMzIoYmNtX3hkcl9idWZfdCAqYiwgczMyICpwdmFsKTsKLWludCBiY21feGRyX3BhY2tfczgoYmNtX3hkcl9idWZfdCAqYiwgczggdmFsKTsKLWludCBiY21feGRyX3VucGFja19zOChiY21feGRyX2J1Zl90ICpiLCBzOCAqcHZhbCk7Ci1pbnQgYmNtX3hkcl9wYWNrX29wYXF1ZShiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqZGF0YSk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfb3BhcXVlKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICoqcGRhdGEpOwotaW50IGJjbV94ZHJfdW5wYWNrX29wYXF1ZV9jcHkoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKmRhdGEpOwotaW50IGJjbV94ZHJfcGFja19vcGFxdWVfdmFybGVuKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICpkYXRhKTsKLWludCBiY21feGRyX3VucGFja19vcGFxdWVfdmFybGVuKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgKnBsZW4sIHZvaWQgKipwZGF0YSk7Ci1pbnQgYmNtX3hkcl9wYWNrX3N0cmluZyhiY21feGRyX2J1Zl90ICpiLCBjaGFyICpzdHIpOwotaW50IGJjbV94ZHJfdW5wYWNrX3N0cmluZyhiY21feGRyX2J1Zl90ICpiLCB1aW50ICpwbGVuLCBjaGFyICoqcHN0cik7Ci0KLWludCBiY21feGRyX3BhY2tfdThfdmVjKGJjbV94ZHJfYnVmX3QgKiwgdTggKnZlYywgdTMyIGVsZW1zKTsKLWludCBiY21feGRyX3VucGFja191OF92ZWMoYmNtX3hkcl9idWZfdCAqLCB1OCAqdmVjLCB1MzIgZWxlbXMpOwotaW50IGJjbV94ZHJfcGFja191MTZfdmVjKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICp2ZWMpOwotaW50IGJjbV94ZHJfdW5wYWNrX3UxNl92ZWMoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKnZlYyk7Ci1pbnQgYmNtX3hkcl9wYWNrX3UzMl92ZWMoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKnZlYyk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfdTMyX3ZlYyhiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqdmVjKTsKLQotaW50IGJjbV94ZHJfcGFja19vcGFxdWVfcmF3KGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICpkYXRhKTsKLWludCBiY21feGRyX3BhY2tfb3BhcXVlX3BhZChiY21feGRyX2J1Zl90ICpiKTsKLQotI2VuZGlmCQkJCS8qIF9CQ01fWERSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21kZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtZGVmcy5oCmluZGV4IGRjNTJlOWRiLi43NDYwMWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtZGVmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21kZWZzLmgKQEAgLTQyLDkgKzQyLDYgQEAKICNkZWZpbmUgQkNNRkFTVFBBVEgKICNlbmRpZgogCi0vKiBQdXQgc29tZSBsaWJyYXJ5IGRhdGEvY29kZSBpbnRvIFJPTSB0byByZWR1Y2UgUkFNIHJlcXVpcmVtZW50cyAqLwotI2RlZmluZSBCQ01ST01GTihfZm4pCQlfZm4KLQogLyogQnVzIHR5cGVzICovCiAjZGVmaW5lCVNJX0JVUwkJCTAJLyogU09DIEludGVyY29ubmVjdCAqLwogI2RlZmluZQlQQ0lfQlVTCQkJMQkvKiBQQ0kgdGFyZ2V0ICovCkBAIC01NCwzNSArNTEsNiBAQAogI2RlZmluZSBTUElfQlVTCQkJNgkvKiBnU1BJIHRhcmdldCAqLwogI2RlZmluZSBSUENfQlVTCQkJNwkvKiBSUEMgdGFyZ2V0ICovCiAKLS8qIEFsbG93cyBzaXplIG9wdGltaXphdGlvbiBmb3Igc2luZ2xlLWJ1cyBpbWFnZSAqLwotI2lmZGVmIEJDTUJVU1RZUEUKLSNkZWZpbmUgQlVTVFlQRShidXMpIAkoQkNNQlVTVFlQRSkKLSNlbHNlCi0jZGVmaW5lIEJVU1RZUEUoYnVzKSAJKGJ1cykKLSNlbmRpZgotCi0vKiBBbGxvd3Mgc2l6ZSBvcHRpbWl6YXRpb24gZm9yIHNpbmdsZS1iYWNrcGxhbmUgaW1hZ2UgKi8KLSNpZmRlZiBCQ01DSElQVFlQRQotI2RlZmluZSBDSElQVFlQRShidXMpIAkoQkNNQ0hJUFRZUEUpCi0jZWxzZQotI2RlZmluZSBDSElQVFlQRShidXMpIAkoYnVzKQotI2VuZGlmCi0KLS8qIEFsbG93cyBzaXplIG9wdGltaXphdGlvbiBmb3IgU1BST00gc3VwcG9ydCAqLwotI2RlZmluZSBTUFJPTUJVUwkoUENJX0JVUykKLQotLyogQWxsb3dzIHNpemUgb3B0aW1pemF0aW9uIGZvciBzaW5nbGUtY2hpcCBpbWFnZSAqLwotI2lmZGVmIEJDTUNISVBJRAotI2RlZmluZSBDSElQSUQoY2hpcCkJKEJDTUNISVBJRCkKLSNlbHNlCi0jZGVmaW5lIENISVBJRChjaGlwKQkoY2hpcCkKLSNlbmRpZgotCi0jaWZkZWYgQkNNQ0hJUFJFVgotI2RlZmluZSBDSElQUkVWKHJldikJKEJDTUNISVBSRVYpCi0jZWxzZQotI2RlZmluZSBDSElQUkVWKHJldikJKHJldikKLSNlbmRpZgogCiAvKiBEZWZpbmVzIGZvciBETUEgQWRkcmVzcyBXaWR0aCAtIFNoYXJlZCBiZXR3ZWVuIE9TTCBhbmQgSE5ERE1BICovCiAjZGVmaW5lIERNQUREUl9NQVNLXzMyIDB4MAkvKiBBZGRyZXNzIG1hc2sgZm9yIDMyLWJpdHMgKi8KQEAgLTE0NiwzMSArMTE0LDExIEBACiAKICNkZWZpbmUgQkNNRVhUUkFIRFJPT00gMTcyCiAKLS8qIEhlYWRyb29tIHJlcXVpcmVkIGZvciBkb25nbGUtdG8taG9zdCBjb21tdW5pY2F0aW9uLiAgUGFja2V0cyBhbGxvY2F0ZWQKLSAqIGxvY2FsbHkgaW4gdGhlIGRvbmdsZSAoZS5nLiBmb3IgQ0RDIGlvY3RscyBvciBSTkRJUyBtZXNzYWdlcykgc2hvdWxkCi0gKiBsZWF2ZSB0aGlzIG11Y2ggcm9vbSBpbiBmcm9udCBmb3IgbG93LWxldmVsIG1lc3NhZ2UgaGVhZGVycyB3aGljaCBtYXkKLSAqIGJlIG5lZWRlZCB0byBnZXQgYWNyb3NzIHRoZSBkb25nbGUgYnVzIHRvIHRoZSBob3N0LiAgKFRoZXNlIG1lc3NhZ2VzCi0gKiBkb24ndCBnbyBvdmVyIHRoZSBuZXR3b3JrLCBzbyByb29tIGZvciB0aGUgZnVsbCBXTCBoZWFkZXIgYWJvdmUgd291bGQKLSAqIGJlIGEgd2FzdGUuKS4KLSovCi0jZGVmaW5lIEJDTURPTkdMRUhEUlNaIDEyCi0jZGVmaW5lIEJDTURPTkdMRVBBRFNaIDE2Ci0KLSNkZWZpbmUgQkNNRE9OR0xFT1ZFUkhFQUQJKEJDTURPTkdMRUhEUlNaICsgQkNNRE9OR0xFUEFEU1opCi0KICNpZmRlZiBCQ01EQkcKLQotI2RlZmluZSBCQ01EQkdfRVJSCi0KICNpZm5kZWYgQkNNREJHX0FTU0VSVAogI2RlZmluZSBCQ01EQkdfQVNTRVJUCi0jZW5kaWYJCQkJLyogQkNNREJHX0FTU0VSVCAqLwotCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLSNpZiBkZWZpbmVkKEJDTURCR19BU1NFUlQpCi0jZGVmaW5lIEJDTUFTU0VSVF9TVVBQT1JUCi0jZW5kaWYKKyNlbmRpZgkvKiBCQ01EQkdfQVNTRVJUICovCisjZW5kaWYJLyogQkNNREJHICovCiAKIC8qIE1hY3JvcyBmb3IgZG9pbmcgZGVmaW5pdGlvbiBhbmQgZ2V0L3NldCBvZiBiaXRmaWVsZHMKICAqIFVzYWdlIGV4YW1wbGUsIGUuZy4gYSB0aHJlZS1iaXQgZmllbGQgKGJpdHMgNC02KToKQEAgLTE5MCwxMSArMTM4LDEwIEBACiAJCSgoKHZhbCkgJiAofihmaWVsZCAjIyBfTSA8PCBmaWVsZCAjIyBfUykpKSB8IFwKIAkJICgodW5zaWduZWQpKGJpdHMpIDw8IGZpZWxkICMjIF9TKSkKIAotLyogZGVmaW5lIEJDTVNNQUxMIHRvIHJlbW92ZSBtaXNjIGZlYXR1cmVzIGZvciBtZW1vcnktY29uc3RyYWluZWQgZW52aXJvbm1lbnRzICovCi0jZGVmaW5lCUJDTVNQQUNFCi0jZGVmaW5lIGJjbXNwYWNlCXRydWUJLyogaWYgKGJjbXNwYWNlKSBjb2RlIGlzIHJldGFpbmVkICovCi0KIC8qIE1heC4gbnZyYW0gdmFyaWFibGUgdGFibGUgc2l6ZSAqLwogI2RlZmluZQlNQVhTWl9OVlJBTV9WQVJTCTQwOTYKIAorLyogaGFuZGxlIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCB3bF9pbmZvOworCiAjZW5kaWYJCQkJLyogX2JjbWRlZnNfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGJ1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkYnVzLmgKaW5kZXggY2E5OTQ5NS4uODkwNTlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkYnVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkYnVzLmgKQEAgLTQ2LDggKzQ2LDggQEAKICAqICBUaGUgaGFuZGxlciBzaGFsbCBiZSBwcm92aWRlZCBieSBhbGwgc3Vic2VxdWVudCBjYWxscy4gTm8gbG9jYWwgY2FjaGUKICAqICBjZmdoZGwgcG9pbnRzIHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHBjaSBkZXZpY2UgbWFwcGVkIG1lbW9yeQogICovCi1leHRlcm4gc2Rpb2hfaW5mb190ICpzZGlvaF9hdHRhY2gob3NsX3QgKm9zaCwgdm9pZCAqY2ZnaGRsLCB1aW50IGlycSk7Ci1leHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2RldGFjaChvc2xfdCAqb3NoLCBzZGlvaF9pbmZvX3QgKnNpKTsKK2V4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2ZnaGRsLCB1aW50IGlycSk7CitleHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc2Rpb2hfaW5mb190ICpzaSk7CiBleHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2ludGVycnVwdF9yZWdpc3RlcihzZGlvaF9pbmZvX3QgKnNpLAogCQkJCQkgICAgIHNkaW9oX2NiX2ZuX3QgZm4sIHZvaWQgKmFyZ2gpOwogZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9pbnRlcnJ1cHRfZGVyZWdpc3RlcihzZGlvaF9pbmZvX3QgKnNpKTsKQEAgLTc5LDcgKzc5LDcgQEAKIAkJCQkJIHVpbnQgZml4X2luYywgdWludCBydywgdWludCBmbmNfbnVtLAogCQkJCQkgdTMyIGFkZHIsIHVpbnQgcmVnd2lkdGgsCiAJCQkJCSB1MzIgYnVmbGVuLCB1OCAqYnVmZmVyLAotCQkJCQkgdm9pZCAqcGt0KTsKKwkJCQkJIHN0cnVjdCBza19idWZmICpwa3QpOwogCiAvKiBnZXQgY2lzIGRhdGEgKi8KIGV4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfY2lzX3JlYWQoc2Rpb2hfaW5mb190ICpzaSwgdWludCBmdWMsIHU4ICpjaXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoLmgKaW5kZXggNmI4MDk4My4uMGUxZjc5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGguaApAQCAtNDAsMTEgKzQwLDExIEBACiAgKiAgICBpbXBsZW1lbnRhdGlvbiBtYXkgbWFpbnRhaW4gYSBzaW5nbGUgImRlZmF1bHQiIGhhbmRsZSAoZS5nLiB0aGUgZmlyc3Qgb3IKICAqICAgIG1vc3QgcmVjZW50IG9uZSkgdG8gZW5hYmxlIHNpbmdsZS1pbnN0YW5jZSBpbXBsZW1lbnRhdGlvbnMgdG8gcGFzcyBOVUxMLgogICovCi1leHRlcm4gYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpjZmdoZGwsIHZvaWQgKipyZWdzdmEsCi0JCQkJICAgIHVpbnQgaXJxKTsKK2V4dGVybiBiY21zZGhfaW5mb190ICpiY21zZGhfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpjZmdoZGwsCisJCQkJICAgIHZvaWQgKipyZWdzdmEsIHVpbnQgaXJxKTsKIAogLyogRGV0YWNoIC0gZnJlZXVwIHJlc291cmNlcyBhbGxvY2F0ZWQgaW4gYXR0YWNoICovCi1leHRlcm4gaW50IGJjbXNkaF9kZXRhY2gob3NsX3QgKm9zaCwgdm9pZCAqc2RoKTsKK2V4dGVybiBpbnQgYmNtc2RoX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqc2RoKTsKIAogLyogUXVlcnkgaWYgU0QgZGV2aWNlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKi8KIGV4dGVybiBib29sIGJjbXNkaF9pbnRyX3F1ZXJ5KHZvaWQgKnNkaCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJCSAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCiAJCQkgICBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKTsKIGV4dGVybiBpbnQgYmNtc2RoX3JlY3ZfYnVmKHZvaWQgKnNkaCwgdTMyIGFkZHIsIHVpbnQgZm4sIHVpbnQgZmxhZ3MsCi0JCQkgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgdm9pZCAqcGt0LAorCQkJICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QsCiAJCQkgICBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKTsKIAogLyogRmxhZ3MgYml0cyAqLwpAQCAtMTc0LDggKzE3NCw4IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJLyogYXR0YWNoIHRvIGRldmljZSAqLwogCXZvaWQgKigqYXR0YWNoKSAodTE2IHZlbmRfaWQsIHUxNiBkZXZfaWQsIHUxNiBidXMsIHUxNiBzbG90LAotCQkJIHUxNiBmdW5jLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnJlZ3N2YSwgb3NsX3QgKm9zaCwKLQkJCSB2b2lkICpwYXJhbSk7CisJCQkgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdm9pZCAqcmVnc3ZhLAorCQkJIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpwYXJhbSk7CiAJLyogZGV0YWNoIGZyb20gZGV2aWNlICovCiAJdm9pZCAoKmRldGFjaCkgKHZvaWQgKmNoKTsKIH0gYmNtc2RoX2RyaXZlcl90OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaF9zZG1tYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaF9zZG1tYy5oCmluZGV4IDdkNWFhNzEuLjRkNjcxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGhfc2RtbWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoX3NkbW1jLmgKQEAgLTUxLDcgKzUxLDcgQEAKICNkZWZpbmUgQ0xJRU5UX0lOVFIgCQkweDEwMAkvKiBHZXQgcmlkIG9mIHRoaXMhICovCiAKIHN0cnVjdCBzZGlvaF9pbmZvIHsKLQlvc2xfdCAqb3NoOwkJLyogb3NoIGhhbmRsZXIgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIG9zaCBoYW5kbGVyICovCiAJYm9vbCBjbGllbnRfaW50cl9lbmFibGVkOwkvKiBpbnRlcnJ1cHQgY29ubm5lY3RlZCBmbGFnICovCiAJYm9vbCBpbnRyX2hhbmRsZXJfdmFsaWQ7CS8qIGNsaWVudCBkcml2ZXIgaW50ZXJydXB0IGhhbmRsZXIgdmFsaWQgKi8KIAlzZGlvaF9jYl9mbl90IGludHJfaGFuZGxlcjsJLyogcmVnaXN0ZXJlZCBpbnRlcnJ1cHQgaGFuZGxlciAqLwpAQCAtOTQsOCArOTQsOCBAQAogICovCiAKIC8qIFJlZ2lzdGVyIG1hcHBpbmcgcm91dGluZXMgKi8KLWV4dGVybiB1MzIgKnNkaW9oX3NkbW1jX3JlZ19tYXAob3NsX3QgKm9zaCwgczMyIGFkZHIsIGludCBzaXplKTsKLWV4dGVybiB2b2lkIHNkaW9oX3NkbW1jX3JlZ191bm1hcChvc2xfdCAqb3NoLCBzMzIgYWRkciwgaW50IHNpemUpOworZXh0ZXJuIHUzMiAqc2Rpb2hfc2RtbWNfcmVnX21hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgczMyIGFkZHIsIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHNkaW9oX3NkbW1jX3JlZ191bm1hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgczMyIGFkZHIsIGludCBzaXplKTsKIAogLyogSW50ZXJydXB0IChkZSlyZWdpc3RyYXRpb24gcm91dGluZXMgKi8KIGV4dGVybiBpbnQgc2Rpb2hfc2RtbWNfcmVnaXN0ZXJfaXJxKHNkaW9oX2luZm9fdCAqc2QsIHVpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc3JvbS5oCmluZGV4IDlkNTM2NTcuLmNkY2VmNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNyb20uaApAQCAtMjAsMTUgKzIwLDE1IEBACiAjaW5jbHVkZSA8YmNtc3JvbV9mbXQuaD4KIAogLyogUHJvdG90eXBlcyAqLwotZXh0ZXJuIGludCBzcm9tX3Zhcl9pbml0KHNpX3QgKnNpaCwgdWludCBidXMsIHZvaWQgKmN1cm1hcCwgb3NsX3QgKm9zaCwKLQkJCSBjaGFyICoqdmFycywgdWludCAqY291bnQpOworZXh0ZXJuIGludCBzcm9tX3Zhcl9pbml0KHNpX3QgKnNpaCwgdWludCBidXMsIHZvaWQgKmN1cm1hcCwKKwkJCSBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKIAotZXh0ZXJuIGludCBzcm9tX3JlYWQoc2lfdCAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLCBvc2xfdCAqb3NoLAorZXh0ZXJuIGludCBzcm9tX3JlYWQoc2lfdCAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJICAgICB1aW50IGJ5dGVvZmYsIHVpbnQgbmJ5dGVzLCB1MTYgKmJ1ZiwgYm9vbCBjaGVja19jcmMpOwogCiAvKiBwYXJzZSBzdGFuZGFyZCBQQ01DSUEgY2lzLCBub3JtYWxseSB1c2VkIGJ5IFNCL1BDTUNJQS9TRElPL1NQSS9PVFAKICAqICAgYW5kIGV4dHJhY3QgZnJvbSBpdCBpbnRvIG5hbWU9dmFsdWUgcGFpcnMKICAqLwotZXh0ZXJuIGludCBzcm9tX3BhcnNlY2lzKG9zbF90ICpvc2gsIHU4ICoqcGNpcywgdWludCBjaXNjbnQsCitleHRlcm4gaW50IHNyb21fcGFyc2VjaXMoc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4ICoqcGNpcywgdWludCBjaXNjbnQsCiAJCQkgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKICNlbmRpZgkJCQkvKiBfYmNtc3JvbV9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXV0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtdXRpbHMuaAppbmRleCBiNTMzMTU5Li5hOGY3NmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtdXRpbHMuaApAQCAtMzAsNyArMzAsNiBAQAogCX07CiAKIC8qICoqIGRyaXZlci1vbmx5IHNlY3Rpb24gKiogKi8KLSNpbmNsdWRlIDxvc2wuaD4KIAogI2RlZmluZSBHUElPX1BJTl9OT1RERUZJTkVEIAkweDIwCS8qIFBpbiBub3QgZGVmaW5lZCAqLwogCkBAIC01NiwxMCArNTUsMTAgQEAKICNlbmRpZgogCiAJdHlwZWRlZiBzdHJ1Y3QgcGt0cV9wcmVjIHsKLQkJdm9pZCAqaGVhZDsJLyogZmlyc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KLQkJdm9pZCAqdGFpbDsJLyogbGFzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLwotCQl1MTYgbGVuOwkvKiBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KLQkJdTE2IG1heDsJLyogbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CS8qIGZpcnN0IHBhY2tldCB0byBkZXF1ZXVlICovCisJCXN0cnVjdCBza19idWZmICp0YWlsOwkvKiBsYXN0IHBhY2tldCB0byBkZXF1ZXVlICovCisJCXUxNiBsZW47CQkvKiBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KKwkJdTE2IG1heDsJCS8qIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCiAJfSBwa3RxX3ByZWNfdDsKIAogLyogbXVsdGktcHJpb3JpdHkgcGt0IHF1ZXVlICovCkBAIC0xMDUsMjMgKzEwNCwyNiBAQAogI2RlZmluZSBwa3RxX3BwZWVrKHBxLCBwcmVjKSAgICAgICAgICAgICgocHEpLT5xW3ByZWNdLmhlYWQpCiAjZGVmaW5lIHBrdHFfcHBlZWtfdGFpbChwcSwgcHJlYykgICAgICAgKChwcSktPnFbcHJlY10udGFpbCkKIAotCWV4dGVybiB2b2lkICpwa3RxX3BlbnEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgdm9pZCAqcCk7Ci0JZXh0ZXJuIHZvaWQgKnBrdHFfcGVucV9oZWFkKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIHZvaWQgKnApOwotCWV4dGVybiB2b2lkICpwa3RxX3BkZXEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYyk7Ci0JZXh0ZXJuIHZvaWQgKnBrdHFfcGRlcV90YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX3BlbnEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnApOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX3BkZXFfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKTsKKwogLyogRW1wdHkgdGhlIHF1ZXVlIGF0IHBhcnRpY3VsYXIgcHJlY2VkZW5jZSBsZXZlbCAqLwogI2lmZGVmIEJSQ01fRlVMTE1BQwotCWV4dGVybiB2b2lkIHBrdHFfcGZsdXNoKG9zbF90ICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCisJZXh0ZXJuIHZvaWQgcGt0cV9wZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCiAJCWJvb2wgZGlyKTsKICNlbHNlCi0JZXh0ZXJuIHZvaWQgcGt0cV9wZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKKwlleHRlcm4gdm9pZCBwa3RxX3BmbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKIAkJYm9vbCBkaXIsIGlmcGt0X2NiX3QgZm4sIGludCBhcmcpOwogI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCiAvKiBvcGVyYXRpb25zIG9uIGEgc2V0IG9mIHByZWNlZGVuY2VzIGluIHBhY2tldCBxdWV1ZSAqLwogCi0JZXh0ZXJuIGludCBwa3RxX21sZW4oc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wKTsKLQlleHRlcm4gdm9pZCAqcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwgaW50ICpwcmVjX291dCk7CitleHRlcm4gaW50IHBrdHFfbWxlbihzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXApOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX21kZXEoc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wLCBpbnQgKnByZWNfb3V0KTsKIAogLyogb3BlcmF0aW9ucyBvbiBwYWNrZXQgcXVldWUgYXMgYSB3aG9sZSAqLwogCkBAIC0xNDAsMjAgKzE0MiwxOSBAQAogCiAJZXh0ZXJuIHZvaWQgcGt0cV9pbml0KHN0cnVjdCBwa3RxICpwcSwgaW50IG51bV9wcmVjLCBpbnQgbWF4X2xlbik7CiAvKiBwcmVjX291dCBtYXkgYmUgTlVMTCBpZiBjYWxsZXIgaXMgbm90IGludGVyZXN0ZWQgaW4gcmV0dXJuIHZhbHVlICovCi0JZXh0ZXJuIHZvaWQgKnBrdHFfcGVla190YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50ICpwcmVjX291dCk7CisJZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpOwogI2lmZGVmIEJSQ01fRlVMTE1BQwotCWV4dGVybiB2b2lkIHBrdHFfZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcik7CisJZXh0ZXJuIHZvaWQgcGt0cV9mbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcik7CiAjZWxzZQotCWV4dGVybiB2b2lkIHBrdHFfZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpciwKKwlleHRlcm4gdm9pZCBwa3RxX2ZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAogCQlpZnBrdF9jYl90IGZuLCBpbnQgYXJnKTsKICNlbmRpZgogCiAvKiBleHRlcm5zICovCiAvKiBwYWNrZXQgKi8KLQlleHRlcm4gdWludCBwa3Rmcm9tYnVmKG9zbF90ICpvc2gsIHZvaWQgKnAsIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1Zik7Ci0JZXh0ZXJuIHVpbnQgcGt0c2VnY250KG9zbF90ICpvc2gsIHZvaWQgKnApOwotCWV4dGVybiB1aW50IHBrdHRvdGxlbihvc2xfdCAqb3NoLCB2b2lkICpwKTsKKwlleHRlcm4gdWludCBwa3Rmcm9tYnVmKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkJCSAgICAgICB1aW50IG9mZnNldCwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKTsKKwlleHRlcm4gdWludCBwa3R0b3RsZW4oc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBza19idWZmICpwKTsKIAogLyogZXRoZXJuZXQgYWRkcmVzcyAqLwogCWV4dGVybiBpbnQgYmNtX2V0aGVyX2F0b2UoY2hhciAqcCwgc3RydWN0IGV0aGVyX2FkZHIgKmVhKTsKQEAgLTE2Niw3ICsxNjcsOCBAQAogCWV4dGVybiBjaGFyICpnZXR2YXIoY2hhciAqdmFycywgY29uc3QgY2hhciAqbmFtZSk7CiAJZXh0ZXJuIGludCBnZXRpbnR2YXIoY2hhciAqdmFycywgY29uc3QgY2hhciAqbmFtZSk7CiAjaWZkZWYgQkNNREJHCi0JZXh0ZXJuIHZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBvc2xfdCAqb3NoLCB2b2lkICpwMCk7CisJZXh0ZXJuIHZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnAwKTsKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KICNkZWZpbmUgYmNtX3BlcmZfZW5hYmxlKCkKICNkZWZpbmUgYmNtc3RhdHMoZm10KQpAQCAtMzU5LDcgKzM2MSwyMSBAQAogI2RlZmluZSBDRUlMKHgsIHkpCQkoKCh4KSArICgoeSktMSkpIC8gKHkpKQogI2RlZmluZQlJU1BPV0VST0YyKHgpCQkoKCgoeCktMSkmKHgpKSA9PSAwKQogCi0vKiBiaXQgbWFwIHJlbGF0ZWQgbWFjcm9zICovCisvKiBtYXAgcGh5c2ljYWwgdG8gdmlydHVhbCBJL08gKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTU1DX01TTTdYMDBBKQorI2RlZmluZSBSRUdfTUFQKHBhLCBzaXplKSAgICAgICBpb3JlbWFwX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpKHBhKSwgXAorCQkJCQkodW5zaWduZWQgbG9uZykoc2l6ZSkpCisjZWxzZQorI2RlZmluZSBSRUdfTUFQKHBhLCBzaXplKSAgICAgICAodm9pZCAqKSgwKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5EX1JFRyhvc2gsIHIsIHYpCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpICYgKHYpKQorI2RlZmluZSBPUl9SRUcob3NoLCByLCB2KQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSB8ICh2KSkKKworI2RlZmluZSBTRVRfUkVHKG9zaCwgciwgbWFzaywgdmFsKSBcCisJCVdfUkVHKChvc2gpLCAociksICgoUl9SRUcoKG9zaCksIHIpICYgfihtYXNrKSkgfCAodmFsKSkpCisKICNpZm5kZWYgc2V0Yml0CiAjaWZuZGVmIE5CQlkJCQkvKiB0aGUgQlNEIGZhbWlseSBkZWZpbmVzIE5CQlkgKi8KICNkZWZpbmUJTkJCWQk4CQkvKiA4IGJpdHMgcGVyIGJ5dGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kMTEuaAppbmRleCBjMDc1NDhjLi5iZTJkNDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZDExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2QxMS5oCkBAIC0xNywxMyArMTcsNiBAQAogI2lmbmRlZglfRDExX0gKICNkZWZpbmUJX0QxMV9ICiAKLSNpbmNsdWRlIDxiY21kZWZzLmg+Ci0jaW5jbHVkZSA8YmNtZGV2cy5oPgotI2luY2x1ZGUgPGhuZHNvYy5oPgotI2luY2x1ZGUgPHNiaG5kcGlvLmg+Ci0jaW5jbHVkZSA8c2JobmRkbWEuaD4KLSNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KLQogLyogVGhpcyBtYXJrcyB0aGUgc3RhcnQgb2YgYSBwYWNrZWQgc3RydWN0dXJlIHNlY3Rpb24uICovCiAjaW5jbHVkZSA8cGFja2VkX3NlY3Rpb25fc3RhcnQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2RidXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kYnVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZmZlYTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2RidXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfX0RCVVNfSF9fCi0jZGVmaW5lIF9fREJVU19IX18KLQotI2lmZGVmIEJDTURCRwotI2RlZmluZSBEQlVTRVJSKGFyZ3MpICAgICAgICBkbyB7IGlmIChuZXRfcmF0ZWxpbWl0KCkpIHByaW50ZiBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBEQlVTVFJBQ0UoYXJncykKLSNkZWZpbmUgREJVU0RCR0xPQ0soYXJncykKLQotI2Vsc2UKLSNkZWZpbmUgREJVU1RSQUNFKGFyZ3MpCi0jZGVmaW5lIERCVVNFUlIoYXJncykKLSNkZWZpbmUgREJVU0RCR0xPQ0soYXJncykKLSNlbmRpZgotCi1lbnVtIHsKLQlEQlVTX09LID0gMCwKLQlEQlVTX0VSUiA9IC0yMDAsCi0JREJVU19FUlJfVElNRU9VVCwKLQlEQlVTX0VSUl9ESVNDT05ORUNULAotCURCVVNfRVJSX05PREVWSUNFLAotCURCVVNfRVJSX1VOU1VQUE9SVEVELAotCURCVVNfRVJSX1BFTkRJTkcsCi0JREJVU19FUlJfTk9NRU0sCi0JREJVU19FUlJfVFhGQUlMLAotCURCVVNfRVJSX1RYVElNRU9VVCwKLQlEQlVTX0VSUl9UWERST1AsCi0JREJVU19FUlJfUlhGQUlMLAotCURCVVNfRVJSX1JYRFJPUCwKLQlEQlVTX0VSUl9UWENUTEZBSUwsCi0JREJVU19FUlJfUlhDVExGQUlMLAotCURCVVNfRVJSX1JFR19QQVJBTSwKLQlEQlVTX1NUQVRVU19DQU5DRUxMRUQKLX07Ci0KLSNkZWZpbmUgRVJSX0NCTUFTS19UWEZBSUwJCTB4MDAwMDAwMDEKLSNkZWZpbmUgRVJSX0NCTUFTS19SWEZBSUwJCTB4MDAwMDAwMDIKLSNkZWZpbmUgRVJSX0NCTUFTS19BTEwJCQkweEZGRkZGRkZGCi0KLSNkZWZpbmUgREJVU19DQkNUTF9XUklURQkJMAotI2RlZmluZSBEQlVTX0NCQ1RMX1JFQUQJCQkxCi0KLSNkZWZpbmUgREJVU19UWF9SRVRSWV9MSU1JVAkJMwkvKiByZXRyaWVzIGZvciBmYWlsZWQgdHhpcmIgKi8KLSNkZWZpbmUgREJVU19UWF9USU1FT1VUX0lOVEVSVkFMCTI1MAkvKiB0aW1lb3V0IGZvciB0eGlyYiBjb21wbGV0ZSwgaW4gbXMgKi8KLQotI2RlZmluZSBEQlVTX0JVRkZFUl9TSVpFX1RYCTUwMDAKLSNkZWZpbmUgREJVU19CVUZGRVJfU0laRV9SWAk1MDAwCi0KLSNkZWZpbmUgREJVU19CVUZGRVJfU0laRV9UWF9OT0FHRwkyMDQ4Ci0jZGVmaW5lIERCVVNfQlVGRkVSX1NJWkVfUlhfTk9BR0cJMjA0OAotCi0vKiBEQlVTIHR5cGVzICovCi1lbnVtIHsKLQlEQlVTX1VTQiwKLQlEQlVTX1NESU8sCi0JREJVU19TUEksCi0JREJVU19VTktOT1dOCi19OwotCi1lbnVtIGRidXNfc3RhdGUgewotCURCVVNfU1RBVEVfRExfUEVORElORywKLQlEQlVTX1NUQVRFX0RMX0RPTkUsCi0JREJVU19TVEFURV9VUCwKLQlEQlVTX1NUQVRFX0RPV04sCi0JREJVU19TVEFURV9QTlBfRldETCwKLQlEQlVTX1NUQVRFX0RJU0NPTk5FQ1QKLX07Ci0KLWVudW0gZGJ1c19wbnBfc3RhdGUgewotCURCVVNfUE5QX0RJU0NPTk5FQ1QsCi0JREJVU19QTlBfU0xFRVAsCi0JREJVU19QTlBfUkVTVU1FCi19OwotCi10eXBlZGVmIGVudW0gX0RFVklDRV9TUEVFRCB7Ci0JSU5WQUxJRF9TUEVFRCA9IC0xLAotCUxPV19TUEVFRCA9IDEsCQkvKiBVU0IgMS4xOiAxLjUgTWJwcyAqLwotCUZVTExfU1BFRUQsCQkvKiBVU0IgMS4xOiAxMiAgTWJwcyAqLwotCUhJR0hfU1BFRUQsCQkvKiBVU0IgMi4wOiA0ODAgTWJwcyAqLwotCVNVUEVSX1NQRUVELAkJLyogVVNCIDMuMDogNC44IEdicHMgKi8KLX0gREVWSUNFX1NQRUVEOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGJ1c3R5cGU7Ci0JaW50IHZpZDsKLQlpbnQgcGlkOwotCWludCBkZXZpZDsKLQlpbnQgY2hpcHJldjsJCS8qIGNoaXAgcmV2c2lvbiBudW1iZXIgKi8KLQlpbnQgbXR1OwotCWludCBuY2hhbjsJCS8qIERhdGEgQ2hhbm5lbHMgKi8KLX0gZGJ1c19hdHRyaWJfdDsKLQotLyogRklYOiBBY2NvdW50IGZvciBlcnJvcnMgcmVsYXRlZCB0byBEQlVTOwotICogTGV0IHVwcGVyIGxheWVyIGFjY291bnQgZm9yIHBhY2tldHMvYnl0ZXMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXUzMiByeF9lcnJvcnM7Ci0JdTMyIHR4X2Vycm9yczsKLQl1MzIgcnhfZHJvcHBlZDsKLQl1MzIgdHhfZHJvcHBlZDsKLX0gZGJ1c19zdGF0c190OwotCi0vKgotICogQ29uZmlndXJhYmxlIEJVUyBwYXJhbWV0ZXJzCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlib29sIHJ4Y3RsX2RlZmVycmVzcG9rOwotfSBkYnVzX2NvbmZpZ190OwotCi1zdHJ1Y3QgZGJ1c19jYWxsYmFja3M7Ci1zdHJ1Y3QgZXhlY19wYXJtczsKLQotdHlwZWRlZiB2b2lkICooKnByb2JlX2NiX3QpICh2b2lkICphcmcsIGNvbnN0IGNoYXIgKmRlc2MsIHUzMiBidXN0eXBlLAotCQkJICAgICB1MzIgaGRybGVuKTsKLXR5cGVkZWYgdm9pZCAoKmRpc2Nvbm5lY3RfY2JfdCkgKHZvaWQgKmFyZyk7Ci10eXBlZGVmIHZvaWQgKigqZXhlY19jYl90KSAoc3RydWN0IGV4ZWNfcGFybXMgKmFyZ3MpOwotCi0vKiBDbGllbnQgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgZHVyaW5nIGRidXNfYXR0YWNoKCkgKi8KLXR5cGVkZWYgc3RydWN0IGRidXNfY2FsbGJhY2tzIHsKLQl2b2lkICgqc2VuZF9jb21wbGV0ZSkgKHZvaWQgKmNiYXJnLCB2b2lkICppbmZvLCBpbnQgc3RhdHVzKTsKLQl2b2lkICgqcmVjdl9idWYpICh2b2lkICpjYmFyZywgdTggKmJ1ZiwgaW50IGxlbik7Ci0Jdm9pZCAoKnJlY3ZfcGt0KSAodm9pZCAqY2JhcmcsIHZvaWQgKnBrdCk7Ci0Jdm9pZCAoKnR4Zmxvd2NvbnRyb2wpICh2b2lkICpjYmFyZywgYm9vbCBvbm9mZik7Ci0Jdm9pZCAoKmVycmhhbmRsZXIpICh2b2lkICpjYmFyZywgaW50IGVycik7Ci0Jdm9pZCAoKmN0bF9jb21wbGV0ZSkgKHZvaWQgKmNiYXJnLCBpbnQgdHlwZSwgaW50IHN0YXR1cyk7Ci0Jdm9pZCAoKnN0YXRlX2NoYW5nZSkgKHZvaWQgKmNiYXJnLCBpbnQgc3RhdGUpOwotCXZvaWQgKigqcGt0Z2V0KSAodm9pZCAqY2JhcmcsIHVpbnQgbGVuLCBib29sIHNlbmQpOwotCXZvaWQgKCpwa3RmcmVlKSAodm9pZCAqY2JhcmcsIHZvaWQgKnAsIGJvb2wgc2VuZCk7Ci19IGRidXNfY2FsbGJhY2tzX3Q7Ci0KLXN0cnVjdCBkYnVzX3B1YjsKLXN0cnVjdCBiY21zdHJidWY7Ci1zdHJ1Y3QgZGJ1c19pcmI7Ci1zdHJ1Y3QgZGJ1c19pcmJfcng7Ci1zdHJ1Y3QgZGJ1c19pcmJfdHg7Ci1zdHJ1Y3QgZGJ1c19pbnRmX2NhbGxiYWNrczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXZvaWQgKigqYXR0YWNoKSAoc3RydWN0IGRidXNfcHViICpwdWIsIHZvaWQgKmNiYXJnLAotCQkJIHN0cnVjdCBkYnVzX2ludGZfY2FsbGJhY2tzICpjYnMpOwotCXZvaWQgKCpkZXRhY2gpIChzdHJ1Y3QgZGJ1c19wdWIgKnB1Yiwgdm9pZCAqYnVzKTsKLQotCWludCAoKnVwKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpkb3duKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpzZW5kX2lyYikgKHZvaWQgKmJ1cywgc3RydWN0IGRidXNfaXJiX3R4ICp0eGlyYik7Ci0JaW50ICgqcmVjdl9pcmIpICh2b2lkICpidXMsIHN0cnVjdCBkYnVzX2lyYl9yeCAqcnhpcmIpOwotCWludCAoKmNhbmNlbF9pcmIpICh2b2lkICpidXMsIHN0cnVjdCBkYnVzX2lyYl90eCAqdHhpcmIpOwotCWludCAoKnNlbmRfY3RsKSAodm9pZCAqYnVzLCB1OCAqYnVmLCBpbnQgbGVuKTsKLQlpbnQgKCpyZWN2X2N0bCkgKHZvaWQgKmJ1cywgdTggKmJ1ZiwgaW50IGxlbik7Ci0JaW50ICgqZ2V0X3N0YXRzKSAodm9pZCAqYnVzLCBkYnVzX3N0YXRzX3QgKnN0YXRzKTsKLQlpbnQgKCpnZXRfYXR0cmliKSAodm9pZCAqYnVzLCBkYnVzX2F0dHJpYl90ICphdHRyaWIpOwotCi0JaW50ICgqcG5wKSAodm9pZCAqYnVzLCBpbnQgZXZlbnQpOwotCWludCAoKnJlbW92ZSkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqcmVzdW1lKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpzdXNwZW5kKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpzdG9wKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpyZXNldCkgKHZvaWQgKmJ1cyk7Ci0KLQkvKiBBY2Nlc3MgdG8gYnVzIGJ1ZmZlcnMgZGlyZWN0bHkgKi8KLQl2b2lkICooKnBrdGdldCkgKHZvaWQgKmJ1cywgaW50IGxlbik7Ci0Jdm9pZCAoKnBrdGZyZWUpICh2b2lkICpidXMsIHZvaWQgKnBrdCk7Ci0KLQlpbnQgKCppb3Zhcl9vcCkgKHZvaWQgKmJ1cywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwKLQkJCSB2b2lkICphcmcsIGludCBsZW4sIGJvb2wgc2V0KTsKLQl2b2lkICgqZHVtcCkgKHZvaWQgKmJ1cywgc3RydWN0IGJjbXN0cmJ1ZiAqc3RyYnVmKTsKLQlpbnQgKCpzZXRfY29uZmlnKSAodm9pZCAqYnVzLCBkYnVzX2NvbmZpZ190ICpjb25maWcpOwotCWludCAoKmdldF9jb25maWcpICh2b2lkICpidXMsIGRidXNfY29uZmlnX3QgKmNvbmZpZyk7Ci0KLQkgYm9vbCgqZGV2aWNlX2V4aXN0cykgKHZvaWQgKmJ1cyk7Ci0JIGJvb2woKmRsbmVlZGVkKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpkbHN0YXJ0KSAodm9pZCAqYnVzLCB1OCAqZncsIGludCBsZW4pOwotCWludCAoKmRscnVuKSAodm9pZCAqYnVzKTsKLQkgYm9vbCgqcmVjdl9uZWVkZWQpICh2b2lkICpidXMpOwotCi0Jdm9pZCAqKCpleGVjX3J4bG9jaykgKHZvaWQgKmJ1cywgZXhlY19jYl90IGZ1bmMsCi0JCQkgICAgICBzdHJ1Y3QgZXhlY19wYXJtcyAqYXJncyk7Ci0Jdm9pZCAqKCpleGVjX3R4bG9jaykgKHZvaWQgKmJ1cywgZXhlY19jYl90IGZ1bmMsCi0JCQkgICAgICBzdHJ1Y3QgZXhlY19wYXJtcyAqYXJncyk7Ci0KLQlpbnQgKCp0eF90aW1lcl9pbml0KSAodm9pZCAqYnVzKTsKLQlpbnQgKCp0eF90aW1lcl9zdGFydCkgKHZvaWQgKmJ1cywgdWludCB0aW1lb3V0KTsKLQlpbnQgKCp0eF90aW1lcl9zdG9wKSAodm9pZCAqYnVzKTsKLQotCWludCAoKnNjaGVkX2RwYykgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqbG9jaykgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqdW5sb2NrKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpzY2hlZF9wcm9iZV9jYikgKHZvaWQgKmJ1cyk7Ci0KLQlpbnQgKCpzaHV0ZG93bikgKHZvaWQgKmJ1cyk7Ci0KLQlpbnQgKCpyZWN2X3N0b3ApICh2b2lkICpidXMpOwotCWludCAoKnJlY3ZfcmVzdW1lKSAodm9pZCAqYnVzKTsKLQotCS8qIEFkZCBmcm9tIHRoZSBib3R0b20gKi8KLX0gZGJ1c19pbnRmX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRidXNfcHViIHsKLQlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKLQlkYnVzX3N0YXRzX3Qgc3RhdHM7Ci0JZGJ1c19hdHRyaWJfdCBhdHRyaWI7Ci0JZW51bSBkYnVzX3N0YXRlIGJ1c3N0YXRlOwotCURFVklDRV9TUEVFRCBkZXZpY2Vfc3BlZWQ7Ci0JaW50IG50eHEsIG5yeHEsIHJ4c2l6ZTsKLQl2b2lkICpidXM7Ci0Jc3RydWN0IHNoYXJlZF9pbmZvICpzaDsKLX0gZGJ1c19wdWJfdDsKLQotI2RlZmluZSBCVVNfSU5GTyhidXMsIHR5cGUpICgoKHR5cGUgKikgYnVzKS0+cHViLT5idXMpCi0KLS8qCi0gKiBQdWJsaWMgQnVzIEZ1bmN0aW9uIEludGVyZmFjZQotICovCi1leHRlcm4gaW50IGRidXNfcmVnaXN0ZXIoaW50IHZpZCwgaW50IHBpZCwgcHJvYmVfY2JfdCBwcmNiLAotCQkJIGRpc2Nvbm5lY3RfY2JfdCBkaXNjYiwgdm9pZCAqcHJhcmcsIHZvaWQgKnBhcmFtMSwKLQkJCSB2b2lkICpwYXJhbTIpOwotZXh0ZXJuIGludCBkYnVzX2RlcmVnaXN0ZXIodm9pZCk7Ci0KLWV4dGVybiBjb25zdCBkYnVzX3B1Yl90ICpkYnVzX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgaW50IHJ4c2l6ZSwgaW50IG5yeHEsCi0JCQkJICAgICBpbnQgbnR4cSwgdm9pZCAqY2JhcmcsCi0JCQkJICAgICBkYnVzX2NhbGxiYWNrc190ICpjYnMsCi0JCQkJICAgICBzdHJ1Y3Qgc2hhcmVkX2luZm8gKnNoKTsKLWV4dGVybiB2b2lkIGRidXNfZGV0YWNoKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci0KLWV4dGVybiBpbnQgZGJ1c191cChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIGludCBkYnVzX2Rvd24oY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiBpbnQgZGJ1c19zdG9wKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gaW50IGRidXNfc2h1dGRvd24oY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiB2b2lkIGRidXNfZmxvd2N0cmxfcngoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBib29sIG9uKTsKLQotZXh0ZXJuIGludCBkYnVzX3NlbmRfYnVmKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgdTggKmJ1ZiwgaW50IGxlbiwKLQkJCSB2b2lkICppbmZvKTsKLWV4dGVybiBpbnQgZGJ1c19zZW5kX3BrdChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHZvaWQgKnBrdCwgdm9pZCAqaW5mbyk7Ci1leHRlcm4gaW50IGRidXNfc2VuZF9jdGwoY29uc3QgZGJ1c19wdWJfdCAqcHViLCB1OCAqYnVmLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgZGJ1c19yZWN2X2N0bChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHU4ICpidWYsIGludCBsZW4pOwotCi1leHRlcm4gaW50IGRidXNfZ2V0X3N0YXRzKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgZGJ1c19zdGF0c190ICpzdGF0cyk7Ci1leHRlcm4gaW50IGRidXNfZ2V0X2F0dHJpYihjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGRidXNfYXR0cmliX3QgKmF0dHJpYik7Ci1leHRlcm4gaW50IGRidXNfZ2V0X2RldmljZV9zcGVlZChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIGludCBkYnVzX3NldF9jb25maWcoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBkYnVzX2NvbmZpZ190ICpjb25maWcpOwotZXh0ZXJuIGludCBkYnVzX2dldF9jb25maWcoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBkYnVzX2NvbmZpZ190ICpjb25maWcpOwotCi1leHRlcm4gdm9pZCAqZGJ1c19wa3RnZXQoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIGRidXNfcGt0ZnJlZShjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHZvaWQgKnBrdCk7Ci0KLWV4dGVybiBpbnQgZGJ1c19zZXRfZXJybWFzayhjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHUzMiBtYXNrKTsKLWV4dGVybiBpbnQgZGJ1c19wbnBfc2xlZXAoY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiBpbnQgZGJ1c19wbnBfcmVzdW1lKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgaW50ICpmd19yZWxvYWQpOwotZXh0ZXJuIGludCBkYnVzX3BucF9kaXNjb25uZWN0KGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci0KLWV4dGVybiBpbnQgZGJ1c19pb3Zhcl9vcChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCk7Ci0jaWZkZWYgQkNNREJHCi1leHRlcm4gdm9pZCBkYnVzX2hpc3RfZHVtcChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHN0cnVjdCBiY21zdHJidWYgKmIpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotLyoKLSAqIFByaXZhdGUgQ29tbW9uIEJ1cyBJbnRlcmZhY2UKLSAqLwotCi0vKiBJTyBSZXF1ZXN0IEJsb2NrIChJUkIpICovCi10eXBlZGVmIHN0cnVjdCBkYnVzX2lyYiB7Ci0Jc3RydWN0IGRidXNfaXJiICpuZXh0OwkvKiBpdCdzIGNhc3RlZCBmcm9tIGRidXNfaXJiX3R4IG9yIGRidXNfaXJiX3J4IHN0cnVjdCAqLwotfSBkYnVzX2lyYl90OwotCi10eXBlZGVmIHN0cnVjdCBkYnVzX2lyYl9yeCB7Ci0Jc3RydWN0IGRidXNfaXJiIGlyYjsJLyogTXVzdCBiZSBmaXJzdCAqLwotCXU4ICpidWY7Ci0JaW50IGJ1Zl9sZW47Ci0JaW50IGFjdHVhbF9sZW47Ci0Jdm9pZCAqcGt0OwotCXZvaWQgKmluZm87Ci0Jdm9pZCAqYXJnOwotfSBkYnVzX2lyYl9yeF90OwotCi10eXBlZGVmIHN0cnVjdCBkYnVzX2lyYl90eCB7Ci0Jc3RydWN0IGRidXNfaXJiIGlyYjsJLyogTXVzdCBiZSBmaXJzdCAqLwotCXU4ICpidWY7Ci0JaW50IGxlbjsKLQl2b2lkICpwa3Q7Ci0JaW50IHJldHJ5X2NvdW50OwotCXZvaWQgKmluZm87Ci0Jdm9pZCAqYXJnOwotfSBkYnVzX2lyYl90eF90OwotCi0vKiBEQlVTIGludGVyZmFjZSBjYWxsYmFja3MgYXJlIGRpZmZlcmVudCBmcm9tIHVzZXIgY2FsbGJhY2tzCi0gKiBzbywgaW50ZXJuYWxseSwgZGlmZmVyZW50IGluZm8gY2FuIGJlIHBhc3NlZCB0byB1cHBlciBsYXllcgotICovCi10eXBlZGVmIHN0cnVjdCBkYnVzX2ludGZfY2FsbGJhY2tzIHsKLQl2b2lkICgqc2VuZF9pcmJfdGltZW91dCkgKHZvaWQgKmNiYXJnLCBkYnVzX2lyYl90eF90ICp0eGlyYik7Ci0Jdm9pZCAoKnNlbmRfaXJiX2NvbXBsZXRlKSAodm9pZCAqY2JhcmcsIGRidXNfaXJiX3R4X3QgKnR4aXJiLAotCQkJCSAgIGludCBzdGF0dXMpOwotCXZvaWQgKCpyZWN2X2lyYl9jb21wbGV0ZSkgKHZvaWQgKmNiYXJnLCBkYnVzX2lyYl9yeF90ICpyeGlyYiwKLQkJCQkgICBpbnQgc3RhdHVzKTsKLQl2b2lkICgqZXJyaGFuZGxlcikgKHZvaWQgKmNiYXJnLCBpbnQgZXJyKTsKLQl2b2lkICgqY3RsX2NvbXBsZXRlKSAodm9pZCAqY2JhcmcsIGludCB0eXBlLCBpbnQgc3RhdHVzKTsKLQl2b2lkICgqc3RhdGVfY2hhbmdlKSAodm9pZCAqY2JhcmcsIGludCBzdGF0ZSk7Ci0JIGJvb2woKmlzcikgKHZvaWQgKmNiYXJnLCBib29sICp3YW50ZHBjKTsKLQkgYm9vbCgqZHBjKSAodm9pZCAqY2JhcmcsIGJvb2wgYm91bmRlZCk7Ci0Jdm9pZCAoKndhdGNoZG9nKSAodm9pZCAqY2JhcmcpOwotCXZvaWQgKigqcGt0Z2V0KSAodm9pZCAqY2JhcmcsIHVpbnQgbGVuLCBib29sIHNlbmQpOwotCXZvaWQgKCpwa3RmcmVlKSAodm9pZCAqY2JhcmcsIHZvaWQgKnAsIGJvb2wgc2VuZCk7Ci0Jc3RydWN0IGRidXNfaXJiICooKmdldGlyYikgKHZvaWQgKmNiYXJnLCBib29sIHNlbmQpOwotCXZvaWQgKCpyeGVycl9pbmRpY2F0ZSkgKHZvaWQgKmNiYXJnLCBib29sIG9uKTsKLX0gZGJ1c19pbnRmX2NhbGxiYWNrc190OwotCi0vKgotICogUG9ydGluZzogVG8gc3VwcG9ydCBuZXcgYnVzLCBwb3J0IHRoZXNlIGZ1bmN0aW9ucyBiZWxvdwotICovCi0KLS8qCi0gKiBCdXMgc3BlY2lmaWMgSW50ZXJmYWNlCi0gKiBJbXBsZW1lbnRlZCBieSBkYnVzX3VzYi5jL2RidXNfc2Rpby5jCi0gKi8KLWV4dGVybiBpbnQgZGJ1c19idXNfcmVnaXN0ZXIoaW50IHZpZCwgaW50IHBpZCwgcHJvYmVfY2JfdCBwcmNiLAotCQkJICAgICBkaXNjb25uZWN0X2NiX3QgZGlzY2IsIHZvaWQgKnByYXJnLAotCQkJICAgICBkYnVzX2ludGZfdCAqKmludGYsIHZvaWQgKnBhcmFtMSwgdm9pZCAqcGFyYW0yKTsKLWV4dGVybiBpbnQgZGJ1c19idXNfZGVyZWdpc3Rlcih2b2lkKTsKLQotLyoKLSAqIEJ1cy1zcGVjaWZpYyBhbmQgT1Mtc3BlY2lmaWMgSW50ZXJmYWNlCi0gKiBJbXBsZW1lbnRlZCBieSBkYnVzX3VzYl9bbGludXgvbmRpc10uYy9kYnVzX3NkaW9fW2xpbnV4L25kaXNdLmMKLSAqLwotZXh0ZXJuIGludCBkYnVzX2J1c19vc2xfcmVnaXN0ZXIoaW50IHZpZCwgaW50IHBpZCwgcHJvYmVfY2JfdCBwcmNiLAotCQkJCSBkaXNjb25uZWN0X2NiX3QgZGlzY2IsIHZvaWQgKnByYXJnLAotCQkJCSBkYnVzX2ludGZfdCAqKmludGYsIHZvaWQgKnBhcmFtMSwKLQkJCQkgdm9pZCAqcGFyYW0yKTsKLWV4dGVybiBpbnQgZGJ1c19idXNfb3NsX2RlcmVnaXN0ZXIodm9pZCk7Ci0KLS8qCi0gKiBCdXMtc3BlY2lmaWMsIE9TLXNwZWNpZmljLCBIVy1zcGVjaWZpYyBJbnRlcmZhY2UKLSAqIE1haW5seSBmb3IgU0RJTyBIb3N0IEhXIGNvbnRyb2xsZXIKLSAqLwotZXh0ZXJuIGludCBkYnVzX2J1c19vc2xfaHdfcmVnaXN0ZXIoaW50IHZpZCwgaW50IHBpZCwgcHJvYmVfY2JfdCBwcmNiLAotCQkJCSAgICBkaXNjb25uZWN0X2NiX3QgZGlzY2IsIHZvaWQgKnByYXJnLAotCQkJCSAgICBkYnVzX2ludGZfdCAqKmludGYpOwotZXh0ZXJuIGludCBkYnVzX2J1c19vc2xfaHdfZGVyZWdpc3Rlcih2b2lkKTsKLQotI2VuZGlmCQkJCS8qIF9fREJVU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9lcGl2ZXJzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZXBpdmVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTZiNTE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9lcGl2ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfZXBpdmVyc19oXwotI2RlZmluZSBfZXBpdmVyc19oXwotCi0jZGVmaW5lCUVQSV9NQUpPUl9WRVJTSU9OCTUKLQotI2RlZmluZQlFUElfTUlOT1JfVkVSU0lPTgk3NQotCi0jZGVmaW5lCUVQSV9SQ19OVU1CRVIJCTExCi0KLSNkZWZpbmUJRVBJX0lOQ1JFTUVOVEFMX05VTUJFUgkwCi0KLSNkZWZpbmUgRVBJX0JVSUxEX05VTUJFUgkxCi0KLSNkZWZpbmUJRVBJX1ZFUlNJT04JCXsgNSwgNzUsIDExLCAwIH0KLQotI2lmZGVmIEJDTVNESU8KLS8qIEVQSV9WRVJTSU9OX05VTSBtdXN0IG1hdGNoIEZXIHZlcnNpb24gKi8KLSNkZWZpbmUJRVBJX1ZFUlNJT05fTlVNCQkweDA1NGIwYzAwCi0jZWxzZQotI2RlZmluZQlFUElfVkVSU0lPTl9OVU0JCTB4MDU0YjBiMDAKLSNlbmRpZgotCi0jZGVmaW5lIEVQSV9WRVJTSU9OX0RFVgkJNS43NS4xMQotCi0vKiBEcml2ZXIgVmVyc2lvbiBTdHJpbmcsIEFTQ0lJLCAzMiBjaGFycyBtYXggKi8KLSNkZWZpbmUJRVBJX1ZFUlNJT05fU1RSCQkiNS43NS4xMSIKLQotI2VuZGlmCQkJCS8qIF9lcGl2ZXJzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kZG1hLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kZG1hLmgKaW5kZXggYmVlNGM4OS4uNGM1NDYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZGRtYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRkbWEuaApAQCAtMTksNyArMTksNyBAQAogCiAjaWZuZGVmIF9obmRkbWFfcHViXwogI2RlZmluZSBfaG5kZG1hX3B1Yl8KLXR5cGVkZWYgY29uc3Qgc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hX3Q7CitzdHJ1Y3QgaG5kZG1hX3B1YjsKICNlbmRpZgkJCQkvKiBfaG5kZG1hX3B1Yl8gKi8KIAogLyogcmFuZ2UgcGFyYW0gZm9yIGRtYV9nZXRuZXh0dHhwKCkgYW5kIGRtYV90eHJlY2xhaW0gKi8KQEAgLTMwLDUyICszMCw1NCBAQAogfSB0eGRfcmFuZ2VfdDsKIAogLyogZG1hIGZ1bmN0aW9uIHR5cGUgKi8KLXR5cGVkZWYgdm9pZCAoKmRpX2RldGFjaF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eHJlc2V0X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4cmVzZXRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhpZGxlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eGluaXRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhlbmFibGVkX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV9yeGluaXRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4c3VzcGVuZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhyZXN1bWVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRpZGxlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGludCAoKmRpX3R4ZmFzdF90KSAoaG5kZG1hX3QgKmRtYWgsIHZvaWQgKnAsIGJvb2wgY29tbWl0KTsKLXR5cGVkZWYgaW50ICgqZGlfdHh1bmZyYW1lZF90KSAoaG5kZG1hX3QgKmRtYWgsIHZvaWQgKnAsIHVpbnQgbGVuLAordHlwZWRlZiB2b2lkICgqZGlfZGV0YWNoX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3R4cmVzZXRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhyZXNldF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeGlkbGVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4aW5pdF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV90eGVuYWJsZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3J4aW5pdF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHhzdXNwZW5kX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eHJlc3VtZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV90eHN1c3BlbmRlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV90eHN1c3BlbmRlZGlkbGVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgaW50ICgqZGlfdHhmYXN0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgc3RydWN0IHNrX2J1ZmYgKnAsCisJCQkgICAgYm9vbCBjb21taXQpOwordHlwZWRlZiBpbnQgKCpkaV90eHVuZnJhbWVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgdm9pZCAqcCwgdWludCBsZW4sCiAJCQkJYm9vbCBjb21taXQpOwotdHlwZWRlZiB2b2lkICooKmRpX2dldHBvc190KSAoaG5kZG1hX3QgKmRpLCBib29sIGRpcmVjdGlvbik7Ci10eXBlZGVmIHZvaWQgKCpkaV9maWZvbG9vcGJhY2tlbmFibGVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhzdG9wcGVkX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4c3RvcHBlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeGVuYWJsZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeGVuYWJsZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9yeF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeGZpbGxfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4cmVjbGFpbV90KSAoaG5kZG1hX3QgKmRtYWgsIHR4ZF9yYW5nZV90IHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3J4cmVjbGFpbV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICgqZGlfZ2V0dmFyX3QpIChobmRkbWFfdCAqZG1haCwgY29uc3QgY2hhciAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKigqZGlfZ2V0bmV4dHR4cF90KSAoaG5kZG1hX3QgKmRtYWgsIHR4ZF9yYW5nZV90IHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9nZXRuZXh0cnhwX3QpIChobmRkbWFfdCAqZG1haCwgYm9vbCBmb3JjZWFsbCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfcGVla25leHR0eHBfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9wZWVrbmV4dHJ4cF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfcnhwYXJhbV9nZXRfdCkgKGhuZGRtYV90ICpkbWFoLCB1MTYgKnJ4b2Zmc2V0LAordHlwZWRlZiB2b2lkICooKmRpX2dldHBvc190KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRpLCBib29sIGRpcmVjdGlvbik7Cit0eXBlZGVmIHZvaWQgKCpkaV9maWZvbG9vcGJhY2tlbmFibGVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfdHhzdG9wcGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4c3RvcHBlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeGVuYWJsZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeGVuYWJsZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAqKCpkaV9yeF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeGZpbGxfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4cmVjbGFpbV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHR4ZF9yYW5nZV90IHJhbmdlKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3J4cmVjbGFpbV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICgqZGlfZ2V0dmFyX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK3R5cGVkZWYgdm9pZCAqKCpkaV9nZXRuZXh0dHhwX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgdHhkX3JhbmdlX3QgcmFuZ2UpOwordHlwZWRlZiB2b2lkICooKmRpX2dldG5leHRyeHBfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCBib29sIGZvcmNlYWxsKTsKK3R5cGVkZWYgdm9pZCAqKCpkaV9wZWVrbmV4dHR4cF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICooKmRpX3BlZWtuZXh0cnhwX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV9yeHBhcmFtX2dldF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHUxNiAqcnhvZmZzZXQsCiAJCQkJICB1MTYgKnJ4YnVmc2l6ZSk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eGJsb2NrX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHVuYmxvY2tfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdWludCgqZGlfdHhhY3RpdmVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4cm90YXRlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV9jb3VudGVycmVzZXRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdWludCgqZGlfY3RybGZsYWdzX3QpIChobmRkbWFfdCAqZG1haCwgdWludCBtYXNrLCB1aW50IGZsYWdzKTsKLXR5cGVkZWYgY2hhciAqKCpkaV9kdW1wX3QpIChobmRkbWFfdCAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKK3R5cGVkZWYgdm9pZCAoKmRpX3R4YmxvY2tfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4dW5ibG9ja190KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB1aW50KCpkaV90eGFjdGl2ZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHhyb3RhdGVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX2NvdW50ZXJyZXNldF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB1aW50KCpkaV9jdHJsZmxhZ3NfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCB1aW50IG1hc2ssIHVpbnQgZmxhZ3MpOwordHlwZWRlZiBjaGFyICooKmRpX2R1bXBfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAogCQkJICAgIGJvb2wgZHVtcHJpbmcpOwotdHlwZWRlZiBjaGFyICooKmRpX2R1bXB0eF90KSAoaG5kZG1hX3QgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCit0eXBlZGVmIGNoYXIgKigqZGlfZHVtcHR4X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKIAkJCSAgICAgIGJvb2wgZHVtcHJpbmcpOwotdHlwZWRlZiBjaGFyICooKmRpX2R1bXByeF90KSAoaG5kZG1hX3QgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCit0eXBlZGVmIGNoYXIgKigqZGlfZHVtcHJ4X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKIAkJCSAgICAgIGJvb2wgZHVtcHJpbmcpOwotdHlwZWRlZiB1aW50KCpkaV9yeGFjdGl2ZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB1aW50KCpkaV90eHBlbmRpbmdfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdWludCgqZGlfdHhjb21taXR0ZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKK3R5cGVkZWYgdWludCgqZGlfcnhhY3RpdmVfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdWludCgqZGlfdHhwZW5kaW5nX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHVpbnQoKmRpX3R4Y29tbWl0dGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7CiAKIC8qIGRtYSBvcHN2ZWMgKi8KIHR5cGVkZWYgc3RydWN0IGRpX2Zjbl9zIHsKQEAgLTE0MSw3ICsxNDMsOCBAQAogCXVpbnQgdHhub2J1ZjsJCS8qIHR4IG91dCBvZiBkbWEgZGVzY3JpcHRvcnMgKi8KIH07CiAKLWV4dGVybiBobmRkbWFfdCAqZG1hX2F0dGFjaChvc2xfdCAqb3NoLCBjaGFyICpuYW1lLCBzaV90ICpzaWgsCitleHRlcm4gc3RydWN0IGhuZGRtYV9wdWIgKmRtYV9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoYXIgKm5hbWUsCisJCQkgICAgc2lfdCAqc2loLAogCQkJICAgIHZvaWQgKmRtYXJlZ3N0eCwgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsCiAJCQkgICAgdWludCBucnhkLCB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCiAJCQkgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpOwpAQCAtMjM4LDYgKzI0MSw2IEBACiBleHRlcm4gdWludCBkbWFfYWRkcndpZHRoKHNpX3QgKnNpaCwgdm9pZCAqZG1hcmVncyk7CiAKIC8qIHBpbyBoZWxwZXJzICovCi1leHRlcm4gdm9pZCBkbWFfdHhwaW9sb29wYmFjayhvc2xfdCAqb3NoLCBkbWEzMnJlZ3NfdCAqKTsKK2V4dGVybiB2b2lkIGRtYV90eHBpb2xvb3BiYWNrKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBkbWEzMnJlZ3NfdCAqKTsKIAogI2VuZGlmCQkJCS8qIF9obmRkbWFfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRwbXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRwbXUuaAppbmRleCBiYmNmMGVlLi5hMDExMGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kcG11LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZHBtdS5oCkBAIC0yOCw0NCArMjgsNDQgQEAKICNkZWZpbmUgU0VUX0xET19WT0xUQUdFX0xOTERPMQk5CiAjZGVmaW5lIFNFVF9MRE9fVk9MVEFHRV9MTkxETzJfU0VMCTEwCiAKLWV4dGVybiB2b2lkIHNpX3BtdV9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfY2hpcF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfcGxsX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1MzIgeHRhbGZyZXEpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpOworZXh0ZXJuIHZvaWQgc2lfcG11X2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdm9pZCBzaV9wbXVfY2hpcF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiB4dGFsZnJlcSk7CitleHRlcm4gdm9pZCBzaV9wbXVfcmVzX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAotZXh0ZXJuIHUzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBmb3JjZSk7CitleHRlcm4gdTMyIHNpX3BtdV9mb3JjZV9pbHAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBmb3JjZSk7CiAKLWV4dGVybiB1MzIgc2lfcG11X3NpX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB1MzIgc2lfcG11X21lbV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHUzMiBzaV9wbXVfYWxwX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X3NpX2Nsb2NrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfY3B1X2Nsb2NrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfbWVtX2Nsb2NrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfYWxwX2Nsb2NrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfaWxwX2Nsb2NrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCi1leHRlcm4gdm9pZCBzaV9wbXVfc2V0X3N3aXRjaGVyX3ZvbHRhZ2Uoc2lfdCAqc2loLCBvc2xfdCAqb3NoLAorZXh0ZXJuIHZvaWQgc2lfcG11X3NldF9zd2l0Y2hlcl92b2x0YWdlKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkJCXU4IGJiX3ZvbHRhZ2UsIHU4IHJmX3ZvbHRhZ2UpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3NldF9sZG9fdm9sdGFnZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHU4IGxkbywKK2V4dGVybiB2b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggbGRvLAogCQkJCSAgIHU4IHZvbHRhZ2UpOwotZXh0ZXJuIHUxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3JjYWwoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKK2V4dGVybiB1MTYgc2lfcG11X2Zhc3RfcHdydXBfZGVsYXkoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdm9pZCBzaV9wbXVfcmNhbChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIGV4dGVybiB2b2lkIHNpX3BtdV9wbGx1cGQoc2lfdCAqc2loKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBzcHVyYXZvaWQpOworZXh0ZXJuIHZvaWQgc2lfcG11X3NwdXJhdm9pZChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBzcHVyYXZvaWQpOwogCi1leHRlcm4gYm9vbCBzaV9wbXVfaXNfb3RwX3Bvd2VyZWQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB1MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7CitleHRlcm4gYm9vbCBzaV9wbXVfaXNfb3RwX3Bvd2VyZWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9tZWFzdXJlX2FscGNsayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAogZXh0ZXJuIHUzMiBzaV9wbXVfY2hpcGNvbnRyb2woc2lfdCAqc2loLCB1aW50IHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpOwogZXh0ZXJuIHUzMiBzaV9wbXVfcmVnY29udHJvbChzaV90ICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdTMyIHNpX3BtdV9wbGxjb250cm9sKHNpX3QgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB2b2lkIHNpX3BtdV9wbGx1cGQoc2lfdCAqc2loKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIGVuYWJsZSk7CitleHRlcm4gdm9pZCBzaV9wbXVfc3Byb21fZW5hYmxlKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgZW5hYmxlKTsKIAogZXh0ZXJuIHZvaWQgc2lfcG11X3JhZGlvX2VuYWJsZShzaV90ICpzaWgsIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB1MzIgc2lfcG11X3dhaXRmb3JjbGtfb25fYmFja3BsYW5lKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK2V4dGVybiB1MzIgc2lfcG11X3dhaXRmb3JjbGtfb25fYmFja3BsYW5lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkJCSAgICAgdTMyIGNsaywgdTMyIGRlbGF5KTsKIAotZXh0ZXJuIHZvaWQgc2lfcG11X290cF9wb3dlcihzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgb24pOwotZXh0ZXJuIHZvaWQgc2lfc2Rpb2RfZHJpdmVfc3RyZW5ndGhfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsCitleHRlcm4gdm9pZCBzaV9wbXVfb3RwX3Bvd2VyKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgb24pOworZXh0ZXJuIHZvaWQgc2lfc2Rpb2RfZHJpdmVfc3RyZW5ndGhfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJCQkgdTMyIGRyaXZlc3RyZW5ndGgpOwogCiAjZW5kaWYJCQkJLyogX2huZHBtdV9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4X29zbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4X29zbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM4NjBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eF9vc2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfbGludXhfb3NsX2hfCi0jZGVmaW5lIF9saW51eF9vc2xfaF8KLQotCi0vKiBMaW51eCBLZXJuZWw6IEZpbGUgT3BlcmF0aW9uczogc3RhcnQgKi8KLWV4dGVybiB2b2lkICpvc2xfb3Nfb3Blbl9pbWFnZShjaGFyICpmaWxlbmFtZSk7Ci1leHRlcm4gaW50IG9zbF9vc19nZXRfaW1hZ2VfYmxvY2soY2hhciAqYnVmLCBpbnQgbGVuLCB2b2lkICppbWFnZSk7Ci1leHRlcm4gdm9pZCBvc2xfb3NfY2xvc2VfaW1hZ2Uodm9pZCAqaW1hZ2UpOwotLyogTGludXggS2VybmVsOiBGaWxlIE9wZXJhdGlvbnM6IGVuZCAqLwotCi1leHRlcm4gb3NsX3QgKm9zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlLCBib29sIHBrdHRhZyk7Ci1leHRlcm4gdm9pZCBvc2xfZGV0YWNoKG9zbF90ICpvc2gpOwotCi1leHRlcm4gdTMyIGdfYXNzZXJ0X3R5cGU7Ci0KLSNpZiBkZWZpbmVkKEJDTURCR19BU1NFUlQpCi0jZGVmaW5lIEFTU0VSVChleHApIFwKLQkgIGRvIHsgaWYgKCEoZXhwKSkgb3NsX2Fzc2VydCgjZXhwLCBfX0ZJTEVfXywgX19MSU5FX18pOyB9IHdoaWxlICgwKQotZXh0ZXJuIHZvaWQgb3NsX2Fzc2VydChjaGFyICpleHAsIGNoYXIgKmZpbGUsIGludCBsaW5lKTsKLSNlbHNlCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgR0NDX1ZFUlNJT04gXAotCQkJKF9fR05VQ19fICogMTAwMDAgKyBfX0dOVUNfTUlOT1JfXyAqIDEwMCArIF9fR05VQ19QQVRDSExFVkVMX18pCi0jaWYgR0NDX1ZFUlNJT04gPiAzMDEwMAotI2RlZmluZSBBU1NFUlQoZXhwKQlkbyB7fSB3aGlsZSAoMCkKLSNlbHNlCi0JCQkvKiBBU1NFUlQgY291bGQgY2F1c2Ugc2VnbWVudGF0aW9uIGZhdWx0IG9uIEdDQzMuMSwgdXNlIGVtcHR5IGluc3RlYWQgKi8KLSNkZWZpbmUgQVNTRVJUKGV4cCkKLSNlbmRpZgkJCQkvKiBHQ0NfVkVSU0lPTiA+IDMwMTAwICovCi0jZW5kaWYJCQkJLyogX19HTlVDX18gKi8KLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCR19BU1NFUlQpICovCi0KLS8qIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBtYWNyb3MgKi8KLSNkZWZpbmUJT1NMX1BDSV9SRUFEX0NPTkZJRyhvc2gsIG9mZnNldCwgc2l6ZSkgXAotCW9zbF9wY2lfcmVhZF9jb25maWcoKG9zaCksIChvZmZzZXQpLCAoc2l6ZSkpCi0jZGVmaW5lCU9TTF9QQ0lfV1JJVEVfQ09ORklHKG9zaCwgb2Zmc2V0LCBzaXplLCB2YWwpIFwKLQlvc2xfcGNpX3dyaXRlX2NvbmZpZygob3NoKSwgKG9mZnNldCksIChzaXplKSwgKHZhbCkpCi1leHRlcm4gdTMyIG9zbF9wY2lfcmVhZF9jb25maWcob3NsX3QgKm9zaCwgdWludCBvZmZzZXQsIHVpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBvc2xfcGNpX3dyaXRlX2NvbmZpZyhvc2xfdCAqb3NoLCB1aW50IG9mZnNldCwgdWludCBzaXplLCB1aW50IHZhbCk7Ci0KLS8qIFBDSSBkZXZpY2UgYnVzICMgYW5kIHNsb3QgIyAqLwotI2RlZmluZSBPU0xfUENJX0JVUyhvc2gpCW9zbF9wY2lfYnVzKG9zaCkKLSNkZWZpbmUgT1NMX1BDSV9TTE9UKG9zaCkJb3NsX3BjaV9zbG90KG9zaCkKLWV4dGVybiB1aW50IG9zbF9wY2lfYnVzKG9zbF90ICpvc2gpOwotZXh0ZXJuIHVpbnQgb3NsX3BjaV9zbG90KG9zbF90ICpvc2gpOwotCi0vKiBQa3R0YWcgZmxhZyBzaG91bGQgYmUgcGFydCBvZiBwdWJsaWMgaW5mb3JtYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlib29sIHBrdHRhZzsKLQl1aW50IHBrdGFsbG9jZWQ7CS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgcGFja2V0IGJ1ZmZlcnMgKi8KLQlib29sIG1tYnVzOwkJLyogQnVzIHN1cHBvcnRzIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXIgYWNjZXNzZXMgKi8KLQlwa3RmcmVlX2NiX2ZuX3QgdHhfZm47CS8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBQS1RGUkVFICovCi0Jdm9pZCAqdHhfY3R4OwkJLyogQ29udGV4dCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSNpZiBkZWZpbmVkKEJDTVNESU8pICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLQlvc2xfcnJlZ19mbl90IHJyZWdfZm47CS8qIFJlYWQgUmVnaXN0ZXIgZnVuY3Rpb24gKi8KLQlvc2xfd3JlZ19mbl90IHdyZWdfZm47CS8qIFdyaXRlIFJlZ2lzdGVyIGZ1bmN0aW9uICovCi0Jdm9pZCAqcmVnX2N0eDsJCS8qIENvbnRleHQgdG8gdGhlIHJlZyBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLSNlbmRpZgotfSBvc2xfcHViaW5mb190OwotCi0jZGVmaW5lIFBLVEZSRUVTRVRDQihvc2gsIF90eF9mbiwgX3R4X2N0eCkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCSgob3NsX3B1YmluZm9fdCAqKW9zaCktPnR4X2ZuID0gX3R4X2ZuOwkJXAotCQkoKG9zbF9wdWJpbmZvX3QgKilvc2gpLT50eF9jdHggPSBfdHhfY3R4OwlcCi0JfSB3aGlsZSAoMCkKLQotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotI2RlZmluZSBSRUdPUFNTRVQob3NoLCBycmVnLCB3cmVnLCBjdHgpCQkJXAotCWRvIHsJCQkJCQlcCi0JCSgob3NsX3B1YmluZm9fdCAqKW9zaCktPnJyZWdfZm4gPSBycmVnOwlcCi0JCSgob3NsX3B1YmluZm9fdCAqKW9zaCktPndyZWdfZm4gPSB3cmVnOwlcCi0JCSgob3NsX3B1YmluZm9fdCAqKW9zaCktPnJlZ19jdHggPSBjdHg7CVwKLQl9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgQlVTX1NXQVAzMih2KQkJKHYpCi0KLSNkZWZpbmUJRE1BX0NPTlNJU1RFTlRfQUxJR04Jb3NsX2RtYV9jb25zaXN0ZW50X2FsaWduKCkKLWV4dGVybiB1aW50IG9zbF9kbWFfY29uc2lzdGVudF9hbGlnbih2b2lkKTsKLWV4dGVybiB2b2lkICpvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQob3NsX3QgKm9zaCwgdWludCBzaXplLCB1MTYgYWxpZ24sCi0JCQkJICAgICAgdWludCAqdG90LCB1bnNpZ25lZCBsb25nICpwYXApOwotCi0jaWZkZWYgQlJDTV9GVUxMTUFDCi0jZGVmaW5lCURNQV9BTExPQ19DT05TSVNURU5UKG9zaCwgc2l6ZSwgcGFwLCBkbWFoLCBhbGlnbmJpdHMpIFwKLQlvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoKG9zaCksIChzaXplKSwgKDApLCAodG90KSwgKHBhcCkpCi0jZWxzZQotI2RlZmluZQlETUFfQUxMT0NfQ09OU0lTVEVOVChvc2gsIHNpemUsIGFsaWduLCB0b3QsIHBhcCwgZG1haCkgXAotCW9zbF9kbWFfYWxsb2NfY29uc2lzdGVudCgob3NoKSwgKHNpemUpLCAoYWxpZ24pLCAodG90KSwgKHBhcCkpCi0jZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCi0KLSNkZWZpbmUJRE1BX0ZSRUVfQ09OU0lTVEVOVChvc2gsIHZhLCBzaXplLCBwYSwgZG1haCkgXAotCW9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KChvc2gpLCAodm9pZCAqKSh2YSksIChzaXplKSwgKHBhKSkKLWV4dGVybiB2b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KG9zbF90ICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsIHVuc2lnbmVkIGxvbmcgcGEpOwotCi0vKiBtYXAvdW5tYXAgZGlyZWN0aW9uICovCi0jZGVmaW5lCURNQV9UWAkxCQkvKiBUWCBkaXJlY3Rpb24gZm9yIERNQSAqLwotI2RlZmluZQlETUFfUlgJMgkJLyogUlggZGlyZWN0aW9uIGZvciBETUEgKi8KLQotLyogbWFwL3VubWFwIHNoYXJlZCAoZG1hLWFibGUpIG1lbW9yeSAqLwotI2RlZmluZQlETUFfTUFQKG9zaCwgdmEsIHNpemUsIGRpcmVjdGlvbiwgcCwgZG1haCkgXAotCW9zbF9kbWFfbWFwKChvc2gpLCAodmEpLCAoc2l6ZSksIChkaXJlY3Rpb24pKQotI2RlZmluZQlETUFfVU5NQVAob3NoLCBwYSwgc2l6ZSwgZGlyZWN0aW9uLCBwLCBkbWFoKSBcCi0Jb3NsX2RtYV91bm1hcCgob3NoKSwgKHBhKSwgKHNpemUpLCAoZGlyZWN0aW9uKSkKLWV4dGVybiB1aW50IG9zbF9kbWFfbWFwKG9zbF90ICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsIGludCBkaXJlY3Rpb24pOwotZXh0ZXJuIHZvaWQgb3NsX2RtYV91bm1hcChvc2xfdCAqb3NoLCB1aW50IHBhLCB1aW50IHNpemUsIGludCBkaXJlY3Rpb24pOwotCi0vKiBBUEkgZm9yIERNQSBhZGRyZXNzaW5nIGNhcGFiaWxpdHkgKi8KLSNkZWZpbmUgT1NMX0RNQUREUldJRFRIKG9zaCwgYWRkcndpZHRoKSBkbyB7fSB3aGlsZSAoMCkKLQotLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2lmIGRlZmluZWQoQkNNU0RJTykKLSNpZmRlZiBCUkNNX0ZVTExNQUMKLSNpbmNsdWRlIDxiY21zZGguaD4KLSNlbmRpZgotI2RlZmluZSBPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikgKGJjbXNkaF9yZWdfd3JpdGUoTlVMTCwgKHVuc2lnbmVkIGxvbmcpKHIpLCBzaXplb2YoKihyKSksICh2KSkpCi0jZGVmaW5lIE9TTF9SRUFEX1JFRyhvc2gsIHIpIChiY21zZGhfcmVnX3JlYWQoTlVMTCwgKHVuc2lnbmVkIGxvbmcpKHIpLCBzaXplb2YoKihyKSkpKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEJDTVNESU8pCi0jZGVmaW5lIFNFTEVDVF9CVVNfV1JJVEUob3NoLCBtbWFwX29wLCBidXNfb3ApIGlmICgoKG9zbF9wdWJpbmZvX3QgKikob3NoKSktPm1tYnVzKSBcCi0JCW1tYXBfb3AgZWxzZSBidXNfb3AKLSNkZWZpbmUgU0VMRUNUX0JVU19SRUFEKG9zaCwgbW1hcF9vcCwgYnVzX29wKSAoKChvc2xfcHViaW5mb190ICopKG9zaCkpLT5tbWJ1cykgPyBcCi0JCW1tYXBfb3AgOiBidXNfb3AKLSNlbHNlCi0jZGVmaW5lIFNFTEVDVF9CVVNfV1JJVEUob3NoLCBtbWFwX29wLCBidXNfb3ApIG1tYXBfb3AKLSNkZWZpbmUgU0VMRUNUX0JVU19SRUFEKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBtbWFwX29wCi0jZW5kaWYKLQotI2RlZmluZSBPU0xfRVJST1IoYmNtZXJyb3IpCW9zbF9lcnJvcihiY21lcnJvcikKLWV4dGVybiBpbnQgb3NsX2Vycm9yKGludCBiY21lcnJvcik7Ci0KLS8qIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgcGFja2V0IGJ1ZmZlciBkcml2ZXIgdXNlcyBmb3IgZXRoZXJuZXQgTVRVIGluIGJ5dGVzICovCi0jZGVmaW5lCVBLVEJVRlNaCTIwNDgJLyogbGFyZ2VzdCByZWFzb25hYmxlIHBhY2tldCBidWZmZXIsIGRyaXZlciB1c2VzIGZvciBldGhlcm5ldCBNVFUgKi8KLQotI2RlZmluZSBPU0xfU1lTVVBUSU1FKCkJCSgodTMyKWppZmZpZXMgKiAoMTAwMCAvIEhaKSkKLSNkZWZpbmUJcHJpbnRmKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCAsICMjIGFyZ3MpCi0jaWZkZWYgQlJDTV9GVUxMTUFDCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIGZvciB2c24vcHJpbnRmJ3MgKi8KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogZm9yIG1lbSosIHN0ciogKi8KLSNlbmRpZgotLyogYmNvcHknczogTGludXgga2VybmVsIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSAoYW55bW9yZSkgKi8KLSNkZWZpbmUJYmNvcHkoc3JjLCBkc3QsIGxlbikJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCi0jZGVmaW5lCWJjbXAoYjEsIGIyLCBsZW4pCW1lbWNtcCgoYjEpLCAoYjIpLCAobGVuKSkKLSNkZWZpbmUJYnplcm8oYiwgbGVuKQkJbWVtc2V0KChiKSwgJ1wwJywgKGxlbikpCi0KLS8qIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KLSNpZiBkZWZpbmVkKE9TTFJFR09QUykKLSNlbHNlCi0jaWZuZGVmIElMX0JJR0VORElBTgotI2lmbmRlZiBfX21pcHNfXwotI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCi0JU0VMRUNUX0JVU19SRUFEKG9zaCwgc2l6ZW9mKCoocikpID09IHNpemVvZih1OCkgPyByZWFkYigodm9sYXRpbGUgdTgqKShyKSkgOiBcCi0Jc2l6ZW9mKCoocikpID09IHNpemVvZih1MTYpID8gcmVhZHcoKHZvbGF0aWxlIHUxNiopKHIpKSA6IFwKLQlyZWFkbCgodm9sYXRpbGUgdTMyKikocikpLCBPU0xfUkVBRF9SRUcob3NoLCByKSkgXAotKQotI2Vsc2UJCQkJLyogX19taXBzX18gKi8KLSNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAotCVNFTEVDVF9CVVNfUkVBRChvc2gsIFwKLQkJKHsgXAotCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQkJY2FzZSBzaXplb2YodTgpOiBcCi0JCQkJX19vc2xfdiA9IHJlYWRiKCh2b2xhdGlsZSB1OCopKHIpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQljYXNlIHNpemVvZih1MTYpOiBcCi0JCQkJX19vc2xfdiA9IHJlYWR3KCh2b2xhdGlsZSB1MTYqKShyKSk7IFwKLQkJCQlicmVhazsgXAotCQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJCV9fb3NsX3YgPSBcCi0JCQkJcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQl9IFwKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKLQkJCV9fb3NsX3Y7IFwKLQkJfSksIFwKLQkJKHsgXAotCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQkJX19vc2xfdiA9IE9TTF9SRUFEX1JFRyhvc2gsIHIpOyBcCi0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCi0JCQlfX29zbF92OyBcCi0JCX0pKSBcCi0pCi0jZW5kaWYJCQkJLyogX19taXBzX18gKi8KLQotI2RlZmluZSBXX1JFRyhvc2gsIHIsIHYpIGRvIHsgXAotCVNFTEVDVF9CVVNfV1JJVEUob3NoLCAgXAotCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQkJd3JpdGViKCh1OCkodiksICh2b2xhdGlsZSB1OCopKHIpKTsgYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTE2KTogXAotCQkJd3JpdGV3KCh1MTYpKHYpLCAodm9sYXRpbGUgdTE2KikocikpOyBicmVhazsgXAotCQljYXNlIHNpemVvZih1MzIpOiBcCi0JCQl3cml0ZWwoKHUzMikodiksICh2b2xhdGlsZSB1MzIqKShyKSk7IGJyZWFrOyBcCi0JCX0sIFwKLQkJKE9TTF9XUklURV9SRUcob3NoLCByLCB2KSkpOyBcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCQkJCS8qIElMX0JJR0VORElBTiAqLwotI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCi0JU0VMRUNUX0JVU19SRUFEKG9zaCwgXAotCQkoeyBcCi0JCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCi0JCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCQljYXNlIHNpemVvZih1OCk6IFwKLQkJCQlfX29zbF92ID0gXAotCQkJCXJlYWRiKCh2b2xhdGlsZSB1OCopKChyKV4zKSk7IFwKLQkJCQlicmVhazsgXAotCQkJY2FzZSBzaXplb2YodTE2KTogXAotCQkJCV9fb3NsX3YgPSBcCi0JCQkJcmVhZHcoKHZvbGF0aWxlIHUxNiopKChyKV4yKSk7IFwKLQkJCQlicmVhazsgXAotCQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJCV9fb3NsX3YgPSByZWFkbCgodm9sYXRpbGUgdTMyKikocikpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCX0gXAotCQkJX19vc2xfdjsgXAotCQl9KSwgXAotCQlPU0xfUkVBRF9SRUcob3NoLCByKSkgXAotKQotI2RlZmluZSBXX1JFRyhvc2gsIHIsIHYpIGRvIHsgXAotCVNFTEVDVF9CVVNfV1JJVEUob3NoLCAgXAotCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCWNhc2Ugc2l6ZW9mKHU4KToJXAotCQkJd3JpdGViKCh1OCkodiksIFwKLQkJCSh2b2xhdGlsZSB1OCopKChyKV4zKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6CVwKLQkJCXdyaXRldygodTE2KSh2KSwgXAotCQkJKHZvbGF0aWxlIHUxNiopKChyKV4yKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUzMik6CVwKLQkJCXdyaXRlbCgodTMyKSh2KSwgXAotCQkJKHZvbGF0aWxlIHUzMiopKHIpKTsgYnJlYWs7IFwKLQkJfSwgXAotCQkoT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpKSk7IFwKLQl9IHdoaWxlICgwKQotI2VuZGlmCQkJCS8qIElMX0JJR0VORElBTiAqLwotCi0jZW5kaWYJCQkJLyogT1NMUkVHT1BTICovCi0KLSNkZWZpbmUJQU5EX1JFRyhvc2gsIHIsIHYpCQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSAmICh2KSkKLSNkZWZpbmUJT1JfUkVHKG9zaCwgciwgdikJCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpIHwgKHYpKQotCi0vKiBiY29weSwgYmNtcCwgYW5kIGJ6ZXJvIGZ1bmN0aW9ucyAqLwotI2RlZmluZQliY29weShzcmMsIGRzdCwgbGVuKQltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSkKLSNkZWZpbmUJYmNtcChiMSwgYjIsIGxlbikJbWVtY21wKChiMSksIChiMiksIChsZW4pKQotI2RlZmluZQliemVybyhiLCBsZW4pCQltZW1zZXQoKGIpLCAnXDAnLCAobGVuKSkKLQotLyogdW5jYWNoZWQvY2FjaGVkIHZpcnR1YWwgYWRkcmVzcyAqLwotI2lmZGVmIF9fbWlwc19fCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2RlZmluZSBPU0xfVU5DQUNIRUQodmEpCSgodm9pZCAqKUtTRUcxQUREUigodmEpKSkKLSNkZWZpbmUgT1NMX0NBQ0hFRCh2YSkJCSgodm9pZCAqKUtTRUcwQUREUigodmEpKSkKLSNlbHNlCi0jZGVmaW5lIE9TTF9VTkNBQ0hFRCh2YSkJKCh2b2lkICopdmEpCi0jZGVmaW5lIE9TTF9DQUNIRUQodmEpCQkoKHZvaWQgKil2YSkKLSNlbmRpZgkJCQkvKiBtaXBzICovCi0KLSNpZiBkZWZpbmVkKG1pcHMpCi0jZGVmaW5lCU9TTF9HRVRDWUNMRVMoeCkJKCh4KSA9IHJlYWRfYzBfY291bnQoKSAqIDIpCi0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQotI2RlZmluZQlPU0xfR0VUQ1lDTEVTKHgpCXJkdHNjbCgoeCkpCi0jZWxzZQotI2RlZmluZSBPU0xfR0VUQ1lDTEVTKHgpCSgoeCkgPSAwKQotI2VuZGlmCQkJCS8qIGRlZmluZWQobWlwcykgKi8KLQotLyogZGVyZWZlcmVuY2UgYW4gYWRkcmVzcyB0aGF0IG1heSBjYXVzZSBhIGJ1cyBleGNlcHRpb24gKi8KLSNpZmRlZiBtaXBzCi0jZGVmaW5lCUJVU1BST0JFKHZhbCwgYWRkcikJZ2V0X2RiZSgodmFsKSwgKGFkZHIpKQotI2luY2x1ZGUgPGFzbS9wYWNjZXNzLmg+Ci0jZWxzZQotI2RlZmluZQlCVVNQUk9CRSh2YWwsIGFkZHIpCSh7ICh2YWwpID0gUl9SRUcoTlVMTCwgKGFkZHIpKTsgMDsgfSkKLSNlbmRpZgkJCQkvKiBtaXBzICovCi0KLS8qIG1hcC91bm1hcCBwaHlzaWNhbCB0byB2aXJ0dWFsIEkvTyAqLwotI2lmICFkZWZpbmVkKENPTkZJR19NTUNfTVNNN1gwMEEpCi0jZGVmaW5lCVJFR19NQVAocGEsIHNpemUpCWlvcmVtYXBfbm9jYWNoZSgodW5zaWduZWQgbG9uZykocGEpLCAodW5zaWduZWQgbG9uZykoc2l6ZSkpCi0jZWxzZQotI2RlZmluZSBSRUdfTUFQKHBhLCBzaXplKSAgICAgICAodm9pZCAqKSgwKQotI2VuZGlmCQkJCS8qICFkZWZpbmVkKENPTkZJR19NTUNfTVNNN1gwMEEgKi8KLSNkZWZpbmUJUkVHX1VOTUFQKHZhKQkJaW91bm1hcCgodmEpKQotCi0jZGVmaW5lCVJfU00ocikJCQkoKihyKSkKLSNkZWZpbmUJV19TTShyLCB2KQkJKCoocikgPSAodikpCi0jZGVmaW5lCUJaRVJPX1NNKHIsIGxlbikJbWVtc2V0KChyKSwgJ1wwJywgKGxlbikpCi0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLSNpbmNsdWRlIDxsaW51eHZlci5oPgkJLyogdXNlIGN1cnJlbnQgMi40LnggY2FsbGluZyBjb252ZW50aW9ucyAqLwotI2VuZGlmCi0KLS8qIHBhY2tldCBwcmltaXRpdmVzICovCi0jZGVmaW5lCVBLVEdFVChvc2gsIGxlbiwgc2VuZCkJCW9zbF9wa3RnZXQoKG9zaCksIChsZW4pKQotI2RlZmluZQlQS1RGUkVFKG9zaCwgc2tiLCBzZW5kKQkJb3NsX3BrdGZyZWUoKG9zaCksIChza2IpLCAoc2VuZCkpCi0jZGVmaW5lCVBLVERBVEEoc2tiKQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmRhdGEpCi0jZGVmaW5lCVBLVExFTihza2IpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+bGVuKQotI2RlZmluZSBQS1RIRUFEUk9PTShza2IpCQkoUEtUREFUQShza2IpLSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5oZWFkKSkKLSNkZWZpbmUgUEtUVEFJTFJPT00oc2tiKSAoKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmVuZCktKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPnRhaWwpKQotI2RlZmluZQlQS1RORVhUKHNrYikJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5uZXh0KQotI2RlZmluZQlQS1RTRVRORVhUKHNrYiwgeCkJXAotCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5uZXh0ID0gKHN0cnVjdCBza19idWZmICopKHgpKQotI2RlZmluZQlQS1RTRVRMRU4oc2tiLCBsZW4pCV9fc2tiX3RyaW0oKHN0cnVjdCBza19idWZmICopKHNrYiksIChsZW4pKQotI2RlZmluZQlQS1RQVVNIKHNrYiwgYnl0ZXMpCXNrYl9wdXNoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpLCAoYnl0ZXMpKQotI2RlZmluZQlQS1RQVUxMKHNrYiwgYnl0ZXMpCXNrYl9wdWxsKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpLCAoYnl0ZXMpKQotI2RlZmluZQlQS1RUQUcoc2tiKQkJKCh2b2lkICopKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmNiKSkKLSNkZWZpbmUgUEtUQUxMT0NFRChvc2gpCQkoKChvc2xfcHViaW5mb190ICopKG9zaCkpLT5wa3RhbGxvY2VkKQotI2RlZmluZSBQS1RTRVRQT09MKG9zaCwgc2tiLCB4LCB5KQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgUEtUUE9PTChvc2gsIHNrYikJCWZhbHNlCi1leHRlcm4gdm9pZCAqb3NsX3BrdGdldChvc2xfdCAqb3NoLCB1aW50IGxlbik7Ci1leHRlcm4gdm9pZCBvc2xfcGt0ZnJlZShvc2xfdCAqb3NoLCB2b2lkICpza2IsIGJvb2wgc2VuZCk7Ci0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLWV4dGVybiB2b2lkICpvc2xfcGt0Z2V0X3N0YXRpYyhvc2xfdCAqb3NoLCB1aW50IGxlbik7Ci1leHRlcm4gdm9pZCBvc2xfcGt0ZnJlZV9zdGF0aWMob3NsX3QgKm9zaCwgdm9pZCAqc2tiLCBib29sIHNlbmQpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgKgotb3NsX3BrdF9mcm1uYXRpdmUob3NsX3B1YmluZm9fdCAqb3NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBza19idWZmICpuc2tiOwotCi0JaWYgKG9zaC0+cGt0dGFnKQotCQliemVybygodm9pZCAqKXNrYi0+Y2IsIE9TTF9QS1RUQUdfU1opOwotCi0JZm9yIChuc2tiID0gc2tiOyBuc2tiOyBuc2tiID0gbnNrYi0+bmV4dCkKLQkJb3NoLT5wa3RhbGxvY2VkKys7Ci0KLQlyZXR1cm4gKHZvaWQgKilza2I7Ci19Ci0jZGVmaW5lIFBLVEZSTU5BVElWRShvc2gsIHNrYikJXAotCW9zbF9wa3RfZnJtbmF0aXZlKCgob3NsX3B1YmluZm9fdCAqKW9zaCksIChzdHJ1Y3Qgc2tfYnVmZiopKHNrYikpCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgotb3NsX3BrdF90b25hdGl2ZShvc2xfcHViaW5mb190ICpvc2gsIHZvaWQgKnBrdCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQotCWlmIChvc2gtPnBrdHRhZykKLQkJYnplcm8oKChzdHJ1Y3Qgc2tfYnVmZiAqKXBrdCktPmNiLCBPU0xfUEtUVEFHX1NaKTsKLQotCWZvciAobnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXBrdDsgbnNrYjsgbnNrYiA9IG5za2ItPm5leHQpCi0JCW9zaC0+cGt0YWxsb2NlZC0tOwotCi0JcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKXBrdDsKLX0KLSNkZWZpbmUgUEtUVE9OQVRJVkUob3NoLCBwa3QpCVwKLQlvc2xfcGt0X3RvbmF0aXZlKChvc2xfcHViaW5mb190ICopKG9zaCksIChwa3QpKQotI2Vsc2UgLyogIUJSQ01fRlVMTE1BQyAqLwotI2RlZmluZSBQS1RVTkFMTE9DKG9zaCkJCQkoKChvc2xfcHViaW5mb190ICopKG9zaCkpLT5wa3RhbGxvY2VkLS0pCi0KLSNkZWZpbmUJUEtUU0VUU0tJUENUKG9zaCwgc2tiKQotI2RlZmluZQlQS1RDTFJTS0lQQ1Qob3NoLCBza2IpCi0jZGVmaW5lCVBLVFNLSVBDVChvc2gsIHNrYikKLSNlbmRpZgkvKiBCUkNNX0ZVTExNQUMgKi8KLQotI2RlZmluZQlQS1RMSU5LKHNrYikJCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+cHJldikKLSNkZWZpbmUJUEtUU0VUTElOSyhza2IsIHgpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+cHJldiA9IChzdHJ1Y3Qgc2tfYnVmZiopKHgpKQotI2RlZmluZQlQS1RQUklPKHNrYikJCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+cHJpb3JpdHkpCi0jZGVmaW5lCVBLVFNFVFBSSU8oc2tiLCB4KQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPnByaW9yaXR5ID0gKHgpKQotI2RlZmluZSBQS1RTVU1ORUVERUQoc2tiKQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotI2RlZmluZSBQS1RTRVRTVU1HT09EKHNrYiwgeCkJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5pcF9zdW1tZWQgPSBcCi0JCQkJCQkoKHgpID8gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgOiBDSEVDS1NVTV9OT05FKSkKLS8qIFBLVFNFVFNVTU5FRURFRCBhbmQgUEtUU1VNR09PRCBhcmUgbm90IHBvc3NpYmxlIGJlY2F1c2Ugc2tiLT5pcF9zdW1tZWQgaXMgb3ZlcmxvYWRlZCAqLwotI2RlZmluZSBQS1RTSEFSRUQoc2tiKSAgICAgICAgICAgICAgICAgICgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5jbG9uZWQpCi0KLSNpZiBkZWZpbmVkKEJDTVNESU8pICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLSNkZWZpbmUgUlBDX1JFQURfUkVHKG9zaCwgcikgKFwKLQlzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHU4KSA/IG9zbF9yZWFkYigob3NoKSwgKHZvbGF0aWxlIHU4KikocikpIDogXAotCXNpemVvZigqKHIpKSA9PSBzaXplb2YodTE2KSA/IG9zbF9yZWFkdygob3NoKSwgKHZvbGF0aWxlIHUxNiopKHIpKSA6IFwKLQlvc2xfcmVhZGwoKG9zaCksICh2b2xhdGlsZSB1MzIqKShyKSkgXAotKQotI2RlZmluZSBSUENfV1JJVEVfUkVHKG9zaCwgciwgdikgZG8geyBcCi0Jc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQlvc2xfd3JpdGViKChvc2gpLCAodm9sYXRpbGUgdTgqKShyKSwgKHU4KSh2KSk7IFwKLQkJYnJlYWs7IFwKLQljYXNlIHNpemVvZih1MTYpOiBcCi0JCW9zbF93cml0ZXcoKG9zaCksICh2b2xhdGlsZSB1MTYqKShyKSwgKHUxNikodikpOyBcCi0JCWJyZWFrOyBcCi0JY2FzZSBzaXplb2YodTMyKTogXAotCQlvc2xfd3JpdGVsKChvc2gpLCAodm9sYXRpbGUgdTMyKikociksICh1MzIpKHYpKTsgXAotCQlicmVhazsgXAotCX0gXAotfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHU4IG9zbF9yZWFkYihvc2xfdCAqb3NoLCB2b2xhdGlsZSB1OCAqcik7Ci1leHRlcm4gdTE2IG9zbF9yZWFkdyhvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MTYgKnIpOwotZXh0ZXJuIHUzMiBvc2xfcmVhZGwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyKTsKLWV4dGVybiB2b2lkIG9zbF93cml0ZWIob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTggKnIsIHU4IHYpOwotZXh0ZXJuIHZvaWQgb3NsX3dyaXRldyhvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MTYgKnIsIHUxNiB2KTsKLWV4dGVybiB2b2lkIG9zbF93cml0ZWwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyLCB1MzIgdik7Ci0jZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotCi0jZW5kaWYJCQkJLyogX2xpbnV4X29zbF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4dmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXh2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MjE0MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXh2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9saW51eHZlcl9oXwotI2RlZmluZSBfbGludXh2ZXJfaF8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLQotI3VuZGVmIElQX1RPUwotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jZW5kaWYJCQkJLyogX2xpbnV4dmVyX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbmljcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbmljcGNpLmgKaW5kZXggY2UxNDZlOC4uOTI4ODE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL25pY3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9uaWNwY2kuaApAQCAtNDUsMTcgKzQ1LDE3IEBACiAjZWxzZQogc3RydWN0IHNicGNpZXJlZ3M7CiAKLWV4dGVybiB1OCBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkob3NsX3QgKm9zaCwgdTggcmVxX2NhcF9pZCwKK2V4dGVybiB1OCBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkoc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IHJlcV9jYXBfaWQsCiAJCQkJCSB1bnNpZ25lZCBjaGFyICpidWYsIHUzMiAqYnVmbGVuKTsKLWV4dGVybiB1aW50IHBjaWVfcmVhZHJlZyhvc2xfdCAqb3NoLCBzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MsCitleHRlcm4gdWludCBwY2llX3JlYWRyZWcoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncywKIAkJCSB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCk7Ci1leHRlcm4gdWludCBwY2llX3dyaXRlcmVnKG9zbF90ICpvc2gsIHN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncywKK2V4dGVybiB1aW50IHBjaWVfd3JpdGVyZWcoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncywKIAkJCSAgdWludCBhZGRydHlwZSwgdWludCBvZmZzZXQsIHVpbnQgdmFsKTsKIAogZXh0ZXJuIHU4IHBjaWVfY2xrcmVxKHZvaWQgKnBjaCwgdTMyIG1hc2ssIHUzMiB2YWwpOwogZXh0ZXJuIHUzMiBwY2llX2xjcmVnKHZvaWQgKnBjaCwgdTMyIG1hc2ssIHUzMiB2YWwpOwogCi1leHRlcm4gdm9pZCAqcGNpY29yZV9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncyk7CitleHRlcm4gdm9pZCAqcGNpY29yZV9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9kZWluaXQodm9pZCAqcGNoKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfYXR0YWNoKHZvaWQgKnBjaCwgY2hhciAqcHZhcnMsIGludCBzdGF0ZSk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX2h3dXAodm9pZCAqcGNoKTsKQEAgLTcwLDEwICs3MCwxMCBAQAogZXh0ZXJuIHUzMiBwY2ljb3JlX3BjaWVyZWcodm9pZCAqcGNoLCB1MzIgb2Zmc2V0LCB1MzIgbWFzaywKIAkJCSAgICAgIHUzMiB2YWwsIHVpbnQgdHlwZSk7CiAKLWV4dGVybiBib29sIHBjaWNvcmVfcG1lY2FwX2Zhc3Qob3NsX3QgKm9zaCk7CitleHRlcm4gYm9vbCBwY2ljb3JlX3BtZWNhcF9mYXN0KHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfcG1lZW4odm9pZCAqcGNoKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfcG1lY2xyKHZvaWQgKnBjaCk7CiBleHRlcm4gYm9vbCBwY2ljb3JlX3BtZXN0YXQodm9pZCAqcGNoKTsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTVNESU8pIHx8IChkZWZpbmVkKEJDTUJVU1RZUEUpICYmIChCQ01CVVNUWVBFID09IFNJX0JVUykpICovCisjZW5kaWYgLyogZGVmaW5lZChCQ01TRElPKXx8KGRlZmluZWQoQkNNQlVTVFlQRSkgJiYgKEJDTUJVU1RZUEU9PVNJX0JVUykpICovCiAKICNlbmRpZgkJCQkvKiBfTklDUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9vc2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9vc2wuaAppbmRleCBjMGViYjNkLi5iMjgyMzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvb3NsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL29zbC5oCkBAIC0xOCw0MiArMTgsMTk3IEBACiAjZGVmaW5lIF9vc2xfaF8KIAogLyogb3NsIGhhbmRsZSB0eXBlIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IG9zbF9pbmZvIG9zbF90Oworc3RydWN0IG9zbF9pbmZvIHsKKwl1aW50IHBrdGFsbG9jZWQ7CS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgcGFja2V0IGJ1ZmZlcnMgKi8KKwlib29sIG1tYnVzOwkJLyogQnVzIHN1cHBvcnRzIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXJzICovCisJdWludCBtYWdpYzsKKwl2b2lkICpwZGV2OworCXVpbnQgYnVzdHlwZTsKK307CisKIHR5cGVkZWYgc3RydWN0IG9zbF9kbWFpbmZvIG9zbGRtYV90OwogCi0jZGVmaW5lIE9TTF9QS1RUQUdfU1oJMzIJLyogU2l6ZSBvZiBQa3RUYWcgKi8KIAotLyogRHJpdmVycyB1c2UgUEtURlJFRVNFVENCIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hlbiBhIHBhY2tldCBpcyBmcmVlZCBieSBPU0wgKi8KLXR5cGVkZWYgdm9pZCAoKnBrdGZyZWVfY2JfZm5fdCkgKHZvaWQgKmN0eCwgdm9pZCAqcGt0LCB1bnNpZ25lZCBpbnQgc3RhdHVzKTsKK2V4dGVybiBzdHJ1Y3Qgb3NsX2luZm8gKm9zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlKTsKK2V4dGVybiB2b2lkIG9zbF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCi0jaWZkZWYgQkNNU0RJTwotLyogRHJpdmVycyB1c2UgUkVHT1BTU0VUKCkgdG8gcmVnaXN0ZXIgcmVnaXN0ZXIgcmVhZC93cml0ZSBmdW5jaXRvbnMgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50ICgqb3NsX3JyZWdfZm5fdCkgKHZvaWQgKmN0eCwgdm9pZCAqcmVnLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Ci10eXBlZGVmIHZvaWQgKCpvc2xfd3JlZ19mbl90KSAodm9pZCAqY3R4LCB2b2lkICpyZWcsIHVuc2lnbmVkIGludCB2YWwsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIHUzMiBnX2Fzc2VydF90eXBlOworCisjaWYgZGVmaW5lZChCQ01EQkdfQVNTRVJUKQorI2RlZmluZSBBU1NFUlQoZXhwKSBcCisJICBkbyB7IGlmICghKGV4cCkpIG9zbF9hc3NlcnQoI2V4cCwgX19GSUxFX18sIF9fTElORV9fKTsgfSB3aGlsZSAoMCkKK2V4dGVybiB2b2lkIG9zbF9hc3NlcnQoY2hhciAqZXhwLCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisjZWxzZQorI2RlZmluZSBBU1NFUlQoZXhwKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAgLyogZGVmaW5lZChCQ01EQkdfQVNTRVJUKSAqLworCisvKiBQQ0kgZGV2aWNlIGJ1cyAjIGFuZCBzbG90ICMgKi8KKyNkZWZpbmUgT1NMX1BDSV9CVVMob3NoKQlvc2xfcGNpX2J1cyhvc2gpCisjZGVmaW5lIE9TTF9QQ0lfU0xPVChvc2gpCW9zbF9wY2lfc2xvdChvc2gpCitleHRlcm4gdWludCBvc2xfcGNpX2J1cyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdWludCBvc2xfcGNpX3Nsb3Qoc3RydWN0IG9zbF9pbmZvICpvc2gpOworCisjZGVmaW5lIEJVU19TV0FQMzIodikJCSh2KQorCitleHRlcm4gdm9pZCAqb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHNpemUsCisJCQkJICAgICAgdTE2IGFsaWduLCB1aW50ICp0b3QsIHVuc2lnbmVkIGxvbmcgKnBhcCk7CisKKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNkZWZpbmUJRE1BX0FMTE9DX0NPTlNJU1RFTlQob3NoLCBzaXplLCBwYXAsIGRtYWgsIGFsaWduYml0cykgXAorCW9zbF9kbWFfYWxsb2NfY29uc2lzdGVudCgob3NoKSwgKHNpemUpLCAoMCksICh0b3QpLCAocGFwKSkKKyNlbHNlCisjZGVmaW5lCURNQV9BTExPQ19DT05TSVNURU5UKG9zaCwgc2l6ZSwgYWxpZ24sIHRvdCwgcGFwLCBkbWFoKSBcCisJb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KChvc2gpLCAoc2l6ZSksIChhbGlnbiksICh0b3QpLCAocGFwKSkKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KKworI2RlZmluZQlETUFfRlJFRV9DT05TSVNURU5UKG9zaCwgdmEsIHNpemUsIHBhLCBkbWFoKSBcCisJb3NsX2RtYV9mcmVlX2NvbnNpc3RlbnQoKG9zaCksICh2b2lkICopKHZhKSwgKHNpemUpLCAocGEpKQorZXh0ZXJuIHZvaWQgb3NsX2RtYV9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnZhLAorCQkJCSAgICB1aW50IHNpemUsIHVuc2lnbmVkIGxvbmcgcGEpOworCisvKiBtYXAvdW5tYXAgZGlyZWN0aW9uICovCisjZGVmaW5lCURNQV9UWAkxCQkvKiBUWCBkaXJlY3Rpb24gZm9yIERNQSAqLworI2RlZmluZQlETUFfUlgJMgkJLyogUlggZGlyZWN0aW9uIGZvciBETUEgKi8KKworLyogbWFwL3VubWFwIHNoYXJlZCAoZG1hLWFibGUpIG1lbW9yeSAqLworI2RlZmluZQlETUFfTUFQKG9zaCwgdmEsIHNpemUsIGRpcmVjdGlvbiwgcCwgZG1haCkgXAorCW9zbF9kbWFfbWFwKChvc2gpLCAodmEpLCAoc2l6ZSksIChkaXJlY3Rpb24pKQorI2RlZmluZQlETUFfVU5NQVAob3NoLCBwYSwgc2l6ZSwgZGlyZWN0aW9uLCBwLCBkbWFoKSBcCisJb3NsX2RtYV91bm1hcCgob3NoKSwgKHBhKSwgKHNpemUpLCAoZGlyZWN0aW9uKSkKK2V4dGVybiB1aW50IG9zbF9kbWFfbWFwKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLAorCQkJaW50IGRpcmVjdGlvbik7CitleHRlcm4gdm9pZCBvc2xfZG1hX3VubWFwKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHBhLCB1aW50IHNpemUsCisJCQkgIGludCBkaXJlY3Rpb24pOworCisvKiByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjaWYgZGVmaW5lZChCQ01TRElPKQorI2lmZGVmIEJSQ01fRlVMTE1BQworI2luY2x1ZGUgPGJjbXNkaC5oPgorI2VuZGlmCisjZGVmaW5lIE9TTF9XUklURV9SRUcob3NoLCByLCB2KSBcCisJCShiY21zZGhfcmVnX3dyaXRlKE5VTEwsICh1bnNpZ25lZCBsb25nKShyKSwgc2l6ZW9mKCoocikpLCAodikpKQorI2RlZmluZSBPU0xfUkVBRF9SRUcob3NoLCByKSBcCisJCShiY21zZGhfcmVnX3JlYWQoTlVMTCwgKHVuc2lnbmVkIGxvbmcpKHIpLCBzaXplb2YoKihyKSkpKQogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eF9vc2wuaD4KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoqIFJlZ2lzdGVyIG1hbmlwdWxhdGlvbiBtYWNyb3MuCi0qLwotCi0jZGVmaW5lCVNFVF9SRUcob3NoLCByLCBtYXNrLCB2YWwpCVdfUkVHKChvc2gpLCAociksICgoUl9SRUcoKG9zaCksIHIpICYgfihtYXNrKSkgfCAodmFsKSkpCi0KLSNpZm5kZWYgQU5EX1JFRwotI2RlZmluZSBBTkRfUkVHKG9zaCwgciwgdikJCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpICYgKHYpKQotI2VuZGlmCQkJCS8qICFBTkRfUkVHICovCi0KLSNpZm5kZWYgT1JfUkVHCi0jZGVmaW5lIE9SX1JFRyhvc2gsIHIsIHYpCQlXX1JFRyhvc2gsIChyKSwgUl9SRUcob3NoLCByKSB8ICh2KSkKLSNlbmRpZgkJCQkvKiAhT1JfUkVHICovCi0KLSNpZiAhZGVmaW5lZChPU0xfU1lTVVBUSU1FKQotI2RlZmluZSBPU0xfU1lTVVBUSU1FKCkgKDApCi0jZGVmaW5lIE9TTF9TWVNVUFRJTUVfU1VQUE9SVCBmYWxzZQorI2lmIGRlZmluZWQoQkNNU0RJTykKKyNkZWZpbmUgU0VMRUNUX0JVU19XUklURShvc2gsIG1tYXBfb3AsIGJ1c19vcCkgXAorCWlmICgob3NoKS0+bW1idXMpIFwKKwkJbW1hcF9vcCBlbHNlIGJ1c19vcAorI2RlZmluZSBTRUxFQ1RfQlVTX1JFQUQob3NoLCBtbWFwX29wLCBidXNfb3ApIFwKKwkoKG9zaCktPm1tYnVzKSA/ICBtbWFwX29wIDogYnVzX29wCiAjZWxzZQotI2RlZmluZSBPU0xfU1lTVVBUSU1FX1NVUFBPUlQgdHJ1ZQotI2VuZGlmCQkJCS8qIE9TTF9TWVNVUFRJTUUgKi8KKyNkZWZpbmUgU0VMRUNUX0JVU19XUklURShvc2gsIG1tYXBfb3AsIGJ1c19vcCkgbW1hcF9vcAorI2RlZmluZSBTRUxFQ1RfQlVTX1JFQUQob3NoLCBtbWFwX29wLCBidXNfb3ApIG1tYXBfb3AKKyNlbmRpZgogCi0jZW5kaWYJCQkJLyogX29zbF9oXyAqLworLyogdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBwYWNrZXQgYnVmZmVyIGRyaXZlciB1c2VzIGZvciBldGhlcm5ldCBNVFUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJUEtUQlVGU1oJMjA0OAorCisjZGVmaW5lIE9TTF9TWVNVUFRJTUUoKQkJKCh1MzIpamlmZmllcyAqICgxMDAwIC8gSFopKQorI2RlZmluZQlwcmludGYoZm10LCBhcmdzLi4uKQlwcmludGsoZm10ICwgIyMgYXJncykKKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogZm9yIHZzbi9wcmludGYncyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBmb3IgbWVtKiwgc3RyKiAqLworI2VuZGlmCisvKiBiY29weSdzOiBMaW51eCBrZXJuZWwgZG9lc24ndCBwcm92aWRlIHRoZXNlIChhbnltb3JlKSAqLworI2RlZmluZQliY29weShzcmMsIGRzdCwgbGVuKQltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSkKKworLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBJTF9CSUdFTkRJQU4KKyNpZm5kZWYgX19taXBzX18KKyNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAorCVNFTEVDVF9CVVNfUkVBRChvc2gsIHNpemVvZigqKHIpKSA9PSBzaXplb2YodTgpID8gXAorCXJlYWRiKCh2b2xhdGlsZSB1OCopKHIpKSA6IFwKKwlzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHUxNikgPyByZWFkdygodm9sYXRpbGUgdTE2KikocikpIDogXAorCXJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSksIE9TTF9SRUFEX1JFRyhvc2gsIHIpKSBcCispCisjZWxzZQkJCQkvKiBfX21pcHNfXyAqLworI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCisJU0VMRUNUX0JVU19SRUFEKG9zaCwgXAorCQkoeyBcCisJCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCisJCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCisJCQljYXNlIHNpemVvZih1OCk6IFwKKwkJCQlfX29zbF92ID0gcmVhZGIoKHZvbGF0aWxlIHU4KikocikpOyBcCisJCQkJYnJlYWs7IFwKKwkJCWNhc2Ugc2l6ZW9mKHUxNik6IFwKKwkJCQlfX29zbF92ID0gcmVhZHcoKHZvbGF0aWxlIHUxNiopKHIpKTsgXAorCQkJCWJyZWFrOyBcCisJCQljYXNlIHNpemVvZih1MzIpOiBcCisJCQkJX19vc2xfdiA9IFwKKwkJCQlyZWFkbCgodm9sYXRpbGUgdTMyKikocikpOyBcCisJCQkJYnJlYWs7IFwKKwkJCX0gXAorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAorCQkJX19vc2xfdjsgXAorCQl9KSwgXAorCQkoeyBcCisJCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCisJCQlfX29zbF92ID0gT1NMX1JFQURfUkVHKG9zaCwgcik7IFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKKwkJCV9fb3NsX3Y7IFwKKwkJfSkpIFwKKykKKyNlbmRpZgkJCQkvKiBfX21pcHNfXyAqLworCisjZGVmaW5lIFdfUkVHKG9zaCwgciwgdikgZG8geyBcCisJU0VMRUNUX0JVU19XUklURShvc2gsICBcCisJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKKwkJY2FzZSBzaXplb2YodTgpOiBcCisJCQl3cml0ZWIoKHU4KSh2KSwgKHZvbGF0aWxlIHU4KikocikpOyBicmVhazsgXAorCQljYXNlIHNpemVvZih1MTYpOiBcCisJCQl3cml0ZXcoKHUxNikodiksICh2b2xhdGlsZSB1MTYqKShyKSk7IGJyZWFrOyBcCisJCWNhc2Ugc2l6ZW9mKHUzMik6IFwKKwkJCXdyaXRlbCgodTMyKSh2KSwgKHZvbGF0aWxlIHUzMiopKHIpKTsgYnJlYWs7IFwKKwkJfSwgXAorCQkoT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpKSk7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UJCQkJLyogSUxfQklHRU5ESUFOICovCisjZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKKwlTRUxFQ1RfQlVTX1JFQUQob3NoLCBcCisJCSh7IFwKKwkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKKwkJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKKwkJCWNhc2Ugc2l6ZW9mKHU4KTogXAorCQkJCV9fb3NsX3YgPSBcCisJCQkJcmVhZGIoKHZvbGF0aWxlIHU4KikoKHIpXjMpKTsgXAorCQkJCWJyZWFrOyBcCisJCQljYXNlIHNpemVvZih1MTYpOiBcCisJCQkJX19vc2xfdiA9IFwKKwkJCQlyZWFkdygodm9sYXRpbGUgdTE2KikoKHIpXjIpKTsgXAorCQkJCWJyZWFrOyBcCisJCQljYXNlIHNpemVvZih1MzIpOiBcCisJCQkJX19vc2xfdiA9IHJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSk7IFwKKwkJCQlicmVhazsgXAorCQkJfSBcCisJCQlfX29zbF92OyBcCisJCX0pLCBcCisJCU9TTF9SRUFEX1JFRyhvc2gsIHIpKSBcCispCisjZGVmaW5lIFdfUkVHKG9zaCwgciwgdikgZG8geyBcCisJU0VMRUNUX0JVU19XUklURShvc2gsICBcCisJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKKwkJY2FzZSBzaXplb2YodTgpOglcCisJCQl3cml0ZWIoKHU4KSh2KSwgXAorCQkJKHZvbGF0aWxlIHU4KikoKHIpXjMpKTsgYnJlYWs7IFwKKwkJY2FzZSBzaXplb2YodTE2KToJXAorCQkJd3JpdGV3KCh1MTYpKHYpLCBcCisJCQkodm9sYXRpbGUgdTE2KikoKHIpXjIpKTsgYnJlYWs7IFwKKwkJY2FzZSBzaXplb2YodTMyKToJXAorCQkJd3JpdGVsKCh1MzIpKHYpLCBcCisJCQkodm9sYXRpbGUgdTMyKikocikpOyBicmVhazsgXAorCQl9LCBcCisJCShPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikpKTsgXAorCX0gd2hpbGUgKDApCisjZW5kaWYJCQkJLyogSUxfQklHRU5ESUFOICovCisKKyNkZWZpbmUJYmNvcHkoc3JjLCBkc3QsIGxlbikJbWVtY3B5KChkc3QpLCAoc3JjKSwgKGxlbikpCisKKy8qIHBhY2tldCBwcmltaXRpdmVzICovCitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdF9idWZfZ2V0X3NrYihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBsZW4pOworZXh0ZXJuIHZvaWQgcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kKTsKKworI2VuZGlmIC8qIF9vc2xfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by9ldGhlcm5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL2V0aGVybmV0LmgKaW5kZXggY2MxN2I0Mi4uNTY3NDA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL2V0aGVybmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL2V0aGVybmV0LmgKQEAgLTE3LDI4ICsxNywyMiBAQAogI2lmbmRlZiBfTkVUX0VUSEVSTkVUX0hfCiAjZGVmaW5lIF9ORVRfRVRIRVJORVRfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKICNpbmNsdWRlIDxwYWNrZWRfc2VjdGlvbl9zdGFydC5oPgogCi0jZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CiAjZGVmaW5lCUVUSEVSX1RZUEVfTEVOCQkyCiAjZGVmaW5lCUVUSEVSX0NSQ19MRU4JCTQKLSNkZWZpbmUJRVRIRVJfSERSX0xFTgkJKEVUSEVSX0FERFJfTEVOICogMiArIEVUSEVSX1RZUEVfTEVOKQogI2RlZmluZQlFVEhFUl9NSU5fTEVOCQk2NAogI2RlZmluZQlFVEhFUl9NSU5fREFUQQkJNDYKICNkZWZpbmUJRVRIRVJfTUFYX0xFTgkJMTUxOAogI2RlZmluZQlFVEhFUl9NQVhfREFUQQkJMTUwMAogCi0jZGVmaW5lIEVUSEVSX1RZUEVfTUlOCQkweDA2MDAKLSNkZWZpbmUJRVRIRVJfVFlQRV9JUAkJMHgwODAwCi0jZGVmaW5lIEVUSEVSX1RZUEVfQVJQCQkweDA4MDYKLSNkZWZpbmUgRVRIRVJfVFlQRV84MDIxUQkweDgxMDAKICNkZWZpbmUJRVRIRVJfVFlQRV9CUkNNCQkweDg4NmMKLSNkZWZpbmUJRVRIRVJfVFlQRV84MDJfMVgJMHg4ODhlCi0jZGVmaW5lCUVUSEVSX1RZUEVfODAyXzFYX1BSRUFVVEggMHg4OGM3CiAKLSNkZWZpbmUgRVRIRVJfREVTVF9PRkZTRVQJKDAgKiBFVEhFUl9BRERSX0xFTikKLSNkZWZpbmUgRVRIRVJfU1JDX09GRlNFVAkoMSAqIEVUSEVSX0FERFJfTEVOKQotI2RlZmluZSBFVEhFUl9UWVBFX09GRlNFVAkoMiAqIEVUSEVSX0FERFJfTEVOKQorI2RlZmluZSBFVEhFUl9ERVNUX09GRlNFVAkoMCAqIEVUSF9BTEVOKQorI2RlZmluZSBFVEhFUl9TUkNfT0ZGU0VUCSgxICogRVRIX0FMRU4pCisjZGVmaW5lIEVUSEVSX1RZUEVfT0ZGU0VUCSgyICogRVRIX0FMRU4pCiAKICNkZWZpbmUJRVRIRVJfSVNfVkFMSURfTEVOKGZvbykJXAogCSgoZm9vKSA+PSBFVEhFUl9NSU5fTEVOICYmIChmb28pIDw9IEVUSEVSX01BWF9MRU4pCkBAIC01Myw1MCArNDcsMTggQEAKIH0KIAogQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCBldGhlcl9oZWFkZXIgewotCXU4IGV0aGVyX2Rob3N0W0VUSEVSX0FERFJfTEVOXTsKLQl1OCBldGhlcl9zaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfZGhvc3RbRVRIX0FMRU5dOworCXU4IGV0aGVyX3Nob3N0W0VUSF9BTEVOXTsKIAl1MTYgZXRoZXJfdHlwZTsKIH0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVDsKIAogQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCBldGhlcl9hZGRyIHsKLQl1OCBvY3RldFtFVEhFUl9BRERSX0xFTl07CisJdTggb2N0ZXRbRVRIX0FMRU5dOwogfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUOwogCi0jZGVmaW5lIEVUSEVSX1NFVF9MT0NBTEFERFIoZWEpCSgoKHU4ICopKGVhKSlbMF0gPSAoKCh1OCAqKShlYSkpWzBdIHwgMikpCi0jZGVmaW5lIEVUSEVSX0lTX0xPQ0FMQUREUihlYSkgCSgoKHU4ICopKGVhKSlbMF0gJiAyKQotI2RlZmluZSBFVEhFUl9DTFJfTE9DQUxBRERSKGVhKQkoKCh1OCAqKShlYSkpWzBdID0gXAotCSgoKHU4ICopKGVhKSlbMF0gJiAweGQpKQotI2RlZmluZSBFVEhFUl9UT0dHTEVfTE9DQUxBRERSKGVhKQkoKCh1OCAqKShlYSkpWzBdID0gXAotCSgoKHU4ICopKGVhKSlbMF0gXiAyKSkKLQogI2RlZmluZSBFVEhFUl9TRVRfVU5JQ0FTVChlYSkJKCgodTggKikoZWEpKVswXSA9ICgoKHU4ICopKGVhKSlbMF0gJiB+MSkpCiAKLSNkZWZpbmUgRVRIRVJfSVNNVUxUSShlYSkgKCgoY29uc3QgdTggKikoZWEpKVswXSAmIDEpCi0KLSNkZWZpbmUJZXRoZXJfY21wKGEsIGIpCSghKCgoc2hvcnQgKilhKVswXSA9PSAoKHNob3J0ICopYilbMF0pIHwgXAotCQkJICEoKChzaG9ydCAqKWEpWzFdID09ICgoc2hvcnQgKiliKVsxXSkgfCBcCi0JCQkgISgoKHNob3J0ICopYSlbMl0gPT0gKChzaG9ydCAqKWIpWzJdKSkKLQotI2RlZmluZQlldGhlcl9jb3B5KHMsIGQpIHsgXAotCQkoKHNob3J0ICopZClbMF0gPSAoKHNob3J0ICopcylbMF07IFwKLQkJKChzaG9ydCAqKWQpWzFdID0gKChzaG9ydCAqKXMpWzFdOyBcCi0JCSgoc2hvcnQgKilkKVsyXSA9ICgoc2hvcnQgKilzKVsyXTsgfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgZXRoZXJfYmNhc3QgPSB7IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fSB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyIGV0aGVyX251bGwgPSB7IHswLCAwLCAwLCAwLCAwLCAwfSB9OwotCi0jZGVmaW5lIEVUSEVSX0lTQkNBU1QoZWEpCSgoKCh1OCAqKShlYSkpWzBdICYJCVwKLQkoKHU4ICopKGVhKSlbMV0gJgkJXAotCSgodTggKikoZWEpKVsyXSAmCQlcCi0JKCh1OCAqKShlYSkpWzNdICYJCVwKLQkoKHU4ICopKGVhKSlbNF0gJgkJXAotCSgodTggKikoZWEpKVs1XSkgPT0gMHhmZikKLSNkZWZpbmUgRVRIRVJfSVNOVUxMQUREUihlYSkJKCgoKHU4ICopKGVhKSlbMF0gfAkJXAotCSgodTggKikoZWEpKVsxXSB8CQlcCi0JKCh1OCAqKShlYSkpWzJdIHwJCVwKLQkoKHU4ICopKGVhKSlbM10gfAkJXAotCSgodTggKikoZWEpKVs0XSB8CQlcCi0JKCh1OCAqKShlYSkpWzVdKSA9PSAwKQogCiAjZGVmaW5lIEVUSEVSX01PVkVfSERSKGQsIHMpIFwKIGRvIHsgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL3dwYS5oCmluZGV4IGVjODRjOWYuLjEwYzJmYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by93cGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vd3BhLmgKQEAgLTE5LDk1ICsxOSw3IEBACiAKICNpbmNsdWRlIDxwcm90by9ldGhlcm5ldC5oPgogCi0jaW5jbHVkZSA8cGFja2VkX3NlY3Rpb25fc3RhcnQuaD4KLQotI2RlZmluZSBET1QxMV9SQ19JTlZBTElEX1dQQV9JRQkJMTMKLSNkZWZpbmUgRE9UMTFfUkNfTUlDX0ZBSUxVUkUJCTE0Ci0jZGVmaW5lIERPVDExX1JDXzRXSF9USU1FT1VUCQkxNQotI2RlZmluZSBET1QxMV9SQ19HVEtfVVBEQVRFX1RJTUVPVVQJMTYKLSNkZWZpbmUgRE9UMTFfUkNfV1BBX0lFX01JU01BVENICTE3Ci0jZGVmaW5lIERPVDExX1JDX0lOVkFMSURfTUNfQ0lQSEVSCTE4Ci0jZGVmaW5lIERPVDExX1JDX0lOVkFMSURfVUNfQ0lQSEVSCTE5Ci0jZGVmaW5lIERPVDExX1JDX0lOVkFMSURfQUtNUAkJMjAKLSNkZWZpbmUgRE9UMTFfUkNfQkFEX1dQQV9WRVJTSU9OCTIxCi0jZGVmaW5lIERPVDExX1JDX0lOVkFMSURfV1BBX0NBUAkyMgotI2RlZmluZSBET1QxMV9SQ184MDIxWF9BVVRIX0ZBSUwJMjMKLQogI2RlZmluZSBXUEEyX1BNS0lEX0xFTgkxNgotCi10eXBlZGVmIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCXU4IHRhZzsKLQl1OCBsZW5ndGg7Ci0JdTggb3VpWzNdOwotCXU4IG91aV90eXBlOwotCUJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCQl1OCBsb3c7Ci0JCXU4IGhpZ2g7Ci0JfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHZlcnNpb247Ci19IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Qgd3BhX2llX2ZpeGVkX3Q7Ci0jZGVmaW5lIFdQQV9JRV9PVUlUWVBFX0xFTgk0Ci0jZGVmaW5lIFdQQV9JRV9GSVhFRF9MRU4JOAotI2RlZmluZSBXUEFfSUVfVEFHX0ZJWEVEX0xFTgk2Ci0KLXR5cGVkZWYgQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JdTggdGFnOwotCXU4IGxlbmd0aDsKLQlCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQkJdTggbG93OwotCQl1OCBoaWdoOwotCX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB2ZXJzaW9uOwotfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHdwYV9yc25faWVfZml4ZWRfdDsKLSNkZWZpbmUgV1BBX1JTTl9JRV9GSVhFRF9MRU4JNAotI2RlZmluZSBXUEFfUlNOX0lFX1RBR19GSVhFRF9MRU4JMgotdHlwZWRlZiB1OCB3cGFfcG1raWRfdFtXUEEyX1BNS0lEX0xFTl07Ci0KLXR5cGVkZWYgQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JdTggb3VpWzNdOwotCXU4IHR5cGU7Ci19IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Qgd3BhX3N1aXRlX3QsIHdwYV9zdWl0ZV9tY2FzdF90OwotI2RlZmluZSBXUEFfU1VJVEVfTEVOCTQKLQotdHlwZWRlZiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQlCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQkJdTggbG93OwotCQl1OCBoaWdoOwotCX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCBjb3VudDsKLQl3cGFfc3VpdGVfdCBsaXN0WzFdOwotfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHdwYV9zdWl0ZV91Y2FzdF90LCB3cGFfc3VpdGVfYXV0aF9rZXlfbWdtdF90OwotI2RlZmluZSBXUEFfSUVfU1VJVEVfQ09VTlRfTEVOCTIKLXR5cGVkZWYgQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JCXU4IGxvdzsKLQkJdTggaGlnaDsKLQl9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1QgY291bnQ7Ci0Jd3BhX3Bta2lkX3QgbGlzdFsxXTsKLX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB3cGFfcG1raWRfbGlzdF90OwotCi0jZGVmaW5lIFdQQV9DSVBIRVJfTk9ORQkJMAotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUF80MAkxCi0jZGVmaW5lIFdQQV9DSVBIRVJfVEtJUAkJMgotI2RlZmluZSBXUEFfQ0lQSEVSX0FFU19PQ0IJMwotI2RlZmluZSBXUEFfQ0lQSEVSX0FFU19DQ00JNAotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUF8xMDQJNQotCi0jZGVmaW5lIElTX1dQQV9DSVBIRVIoY2lwaGVyKQkoKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9OT05FIHx8IFwKLQkJCQkgKGNpcGhlcikgPT0gV1BBX0NJUEhFUl9XRVBfNDAgfHwgXAotCQkJCSAoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX1dFUF8xMDQgfHwgXAotCQkJCSAoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX1RLSVAgfHwgXAotCQkJCSAoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX0FFU19PQ0IgfHwgXAotCQkJCSAoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX0FFU19DQ00pCi0KLSNkZWZpbmUgV1BBX1RLSVBfQ01fREVURUNUCTYwCi0jZGVmaW5lIFdQQV9US0lQX0NNX0JMT0NLCTYwCi0KLSNkZWZpbmUgUlNOX0NBUF9MRU4JCTIKLQotI2RlZmluZSBSU05fQ0FQX1BSRUFVVEgJCQkweDAwMDEKLSNkZWZpbmUgUlNOX0NBUF9OT1BBSVJXSVNFCQkweDAwMDIKLSNkZWZpbmUgUlNOX0NBUF9QVEtfUkVQTEFZX0NOVFJfTUFTSwkweDAwMEMKLSNkZWZpbmUgUlNOX0NBUF9QVEtfUkVQTEFZX0NOVFJfU0hJRlQJMgotI2RlZmluZSBSU05fQ0FQX0dUS19SRVBMQVlfQ05UUl9NQVNLCTB4MDAzMAotI2RlZmluZSBSU05fQ0FQX0dUS19SRVBMQVlfQ05UUl9TSElGVAk0CiAjZGVmaW5lIFJTTl9DQVBfMV9SRVBMQVlfQ05UUgkJMAogI2RlZmluZSBSU05fQ0FQXzJfUkVQTEFZX0NOVFJTCQkxCiAjZGVmaW5lIFJTTl9DQVBfNF9SRVBMQVlfQ05UUlMJCTIKQEAgLTExOCwxMCArMzAsNCBAQAogI2RlZmluZSBXUEFfQ0FQX1JFUExBWV9DTlRSX1NISUZUCVJTTl9DQVBfUFRLX1JFUExBWV9DTlRSX1NISUZUCiAjZGVmaW5lIFdQQV9DQVBfUkVQTEFZX0NOVFJfTUFTSwlSU05fQ0FQX1BUS19SRVBMQVlfQ05UUl9NQVNLCiAKLSNkZWZpbmUgV1BBX0NBUF9MRU4JUlNOX0NBUF9MRU4KLQotI2RlZmluZQlXUEFfQ0FQX1dQQTJfUFJFQVVUSAkJUlNOX0NBUF9QUkVBVVRICi0KLSNpbmNsdWRlIDxwYWNrZWRfc2VjdGlvbl9lbmQuaD4KLQogI2VuZGlmCQkJCS8qIF9wcm90b193cGFfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9ycGNfb3NsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcnBjX29zbC5oCmluZGV4IDRhMjY0ODAuLmM1OWQ5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9ycGNfb3NsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3JwY19vc2wuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBfcnBjb3NsX2hfCiAKIHR5cGVkZWYgc3RydWN0IHJwY19vc2wgcnBjX29zbF90OwotZXh0ZXJuIHJwY19vc2xfdCAqcnBjX29zbF9hdHRhY2gob3NsX3QgKm9zaCk7CitleHRlcm4gcnBjX29zbF90ICpycGNfb3NsX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBleHRlcm4gdm9pZCBycGNfb3NsX2RldGFjaChycGNfb3NsX3QgKnJwY19vc2gpOwogCiAjZGVmaW5lIFJQQ19PU0xfTE9DSyhycGNfb3NoKSBycGNfb3NsX2xvY2soKHJwY19vc2gpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3NpdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9zaXV0aWxzLmgKaW5kZXggNTdjMzY1MC4uYTkzNTA5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3NpdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc2l1dGlscy5oCkBAIC0xOSw5ICsxOSw2IEBACiAKICNpbmNsdWRlIDxobmRzb2MuaD4KIAotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jaW5jbHVkZSAiYmNtX3JwYy5oIgotI2VuZGlmCiAvKgogICogRGF0YSBzdHJ1Y3R1cmUgdG8gZXhwb3J0IGFsbCBjaGlwIHNwZWNpZmljIGNvbW1vbiB2YXJpYWJsZXMKICAqICAgcHVibGljIChyZWFkLW9ubHkpIHBvcnRpb24gb2Ygc2l1dGlscyBoYW5kbGUgcmV0dXJuZWQgYnkgc2lfYXR0YWNoKCkKQEAgLTUwLDE5ICs0NywxMiBAQAogCXVpbnQgc29jaXJldjsJCS8qIFNPQyBpbnRlcmNvbm5lY3QgcmV2ICovCiAJYm9vbCBwY2lfcHIzMjQxNDsKIAotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0JcnBjX2luZm9fdCAqcnBjOwotI2VuZGlmCiB9OwogCiAvKiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhlIHNpX3QgbXVzdCBiZSB3cml0YWJsZSB0byBhbGxvdyBzdGF0ZXMgc3luYyBmcm9tIEJNQUMgdG8gSElHSCBkcml2ZXIKICAqIGZvciBtb25vbGl0aGljIGRyaXZlciwgaXQgaXMgcmVhZG9ubHkgdG8gcHJldmVudCBhY2NpZGVudCBjaGFuZ2UKICAqLwotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi10eXBlZGVmIHN0cnVjdCBzaV9wdWIgc2lfdDsKLSNlbHNlCiB0eXBlZGVmIGNvbnN0IHN0cnVjdCBzaV9wdWIgc2lfdDsKLSNlbmRpZgogCiAvKgogICogTWFueSBvZiB0aGUgcm91dGluZXMgYmVsb3cgdGFrZSBhbiAnc2loJyBoYW5kbGUgYXMgdGhlaXIgZmlyc3QgYXJnLgpAQCAtMTI4LDggKzExOCw4IEBACiAjZGVmaW5lIEdQSU9fQ1RSTF9FUEFfRU5fTUFTSyAweDQwCiAKIC8qID09PSBleHBvcnRlZCBmdW5jdGlvbnMgPT09ICovCi1leHRlcm4gc2lfdCAqc2lfYXR0YWNoKHVpbnQgcGNpZGV2LCBvc2xfdCAqb3NoLCB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsCi0JCSAgICAgICB2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeik7CitleHRlcm4gc2lfdCAqc2lfYXR0YWNoKHVpbnQgcGNpZGV2LCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncywKKwkJICAgICAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywgdWludCAqdmFyc3opOwogCiBleHRlcm4gdm9pZCBzaV9kZXRhY2goc2lfdCAqc2loKTsKIGV4dGVybiBib29sIHNpX3BjaV93YXIxNjE2NShzaV90ICpzaWgpOwpAQCAtMTM4LDcgKzEyOCw3IEBACiBleHRlcm4gdWludCBzaV9mbGFnKHNpX3QgKnNpaCk7CiBleHRlcm4gdWludCBzaV9jb3JlaWR4KHNpX3QgKnNpaCk7CiBleHRlcm4gdWludCBzaV9jb3JlcmV2KHNpX3QgKnNpaCk7Ci1leHRlcm4gdm9pZCAqc2lfb3NoKHNpX3QgKnNpaCk7CitzdHJ1Y3Qgb3NsX2luZm8gKnNpX29zaChzaV90ICpzaWgpOwogZXh0ZXJuIHVpbnQgc2lfY29yZXJlZyhzaV90ICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKIAkJdWludCB2YWwpOwogZXh0ZXJuIHZvaWQgc2lfd3JpdGVfd3JhcHBlcnJlZyhzaV90ICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpOwpAQCAtMjI3LDcgKzIxNyw3IEBACiAvKiBtaXNjIHNpIGluZm8gbmVlZGVkIGJ5IHNvbWUgb2YgdGhlIHJvdXRpbmVzICovCiB0eXBlZGVmIHN0cnVjdCBzaV9pbmZvIHsKIAlzdHJ1Y3Qgc2lfcHViIHB1YjsJLyogYmFjayBwbGFuZSBwdWJsaWMgc3RhdGUgKG11c3QgYmUgZmlyc3QgZmllbGQpICovCi0Jdm9pZCAqb3NoOwkJLyogb3NsIG9zIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogb3NsIG9zIGhhbmRsZSAqLwogCXZvaWQgKnNkaDsJCS8qIGJjbXNkaCBoYW5kbGUgKi8KIAl1aW50IGRldl9jb3JlaWQ7CS8qIHRoZSBjb3JlIHByb3ZpZGVzIGRyaXZlciBmdW5jdGlvbnMgKi8KIAl2b2lkICppbnRyX2FyZzsJCS8qIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbiBhcmcgKi8KQEAgLTMwNSw5ICsyOTUsOSBAQAogI2RlZmluZQlJTFBfRElWXzVNSFoJCTAJLyogSUxQID0gNSBNSHogKi8KICNkZWZpbmUJSUxQX0RJVl8xTUhaCQk0CS8qIElMUCA9IDEgTUh6ICovCiAKLSNkZWZpbmUgUENJKHNpKQkJKChCVVNUWVBFKChzaSktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJglcCisjZGVmaW5lIFBDSShzaSkJCSgoKHNpKS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgJiYJXAogCQkJICgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJX0NPUkVfSUQpKQotI2RlZmluZSBQQ0lFKHNpKQkoKEJVU1RZUEUoKHNpKS0+cHViLmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCVwKKyNkZWZpbmUgUENJRShzaSkJKCgoc2kpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKSAmJglcCiAJCQkgKChzaSktPnB1Yi5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpKQogI2RlZmluZSBQQ0lfRk9SQ0VIVChzaSkJXAogCShQQ0lFKHNpKSAmJiAoc2ktPnB1Yi5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkpCkBAIC0zNDQsOSArMzM0LDkgQEAKIGNoYXIgKnNpX2dldG52cmFtZmx2YXIoc2lfdCAqc2loLCBjb25zdCBjaGFyICpuYW1lKTsKIAogLyogQU1CQSBJbnRlcmNvbm5lY3QgZXhwb3J0ZWQgZXh0ZXJucyAqLwotZXh0ZXJuIHNpX3QgKmFpX2F0dGFjaCh1aW50IHBjaWRldiwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLAotCQkgICAgICAgdm9pZCAqc2RoLCBjaGFyICoqdmFycywgdWludCAqdmFyc3opOwotZXh0ZXJuIHNpX3QgKmFpX2thdHRhY2gob3NsX3QgKm9zaCk7CitleHRlcm4gc2lfdCAqYWlfYXR0YWNoKHVpbnQgcGNpZGV2LCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncywKKwkJICAgICAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywgdWludCAqdmFyc3opOworZXh0ZXJuIHNpX3QgKmFpX2thdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpOwogZXh0ZXJuIHZvaWQgYWlfc2NhbihzaV90ICpzaWgsIHZvaWQgKnJlZ3MsIHVpbnQgZGV2aWQpOwogCiBleHRlcm4gdWludCBhaV9mbGFnKHNpX3QgKnNpaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvd2xpb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3dsaW9jdGwuaAppbmRleCA5Njg2NmZiLi45YmU3OTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvd2xpb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS93bGlvY3RsLmgKQEAgLTMzLDgyICszMyw5IEBACiAjZGVmaW5lIEJXTF9ERUZBVUxUX1BBQ0tJTkcKICNpbmNsdWRlIDxwYWNrZWRfc2VjdGlvbl9zdGFydC5oPgogCi0vKiBMZWdhY3kgc3RydWN0dXJlIHRvIGhlbHAga2VlcCBiYWNrd2FyZCBjb21wYXRpYmxlIHdsIHRvb2wgYW5kIHRyYXkgYXBwICovCi0KLSNkZWZpbmUJTEVHQUNZX1dMX0JTU19JTkZPX1ZFUlNJT04JMTA3CS8qIG9sZGVyIHZlcnNpb24gb2Ygd2xfYnNzX2luZm8gc3RydWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHdsX2Jzc19pbmZvXzEwNyB7Ci0JdTMyIHZlcnNpb247CQkvKiB2ZXJzaW9uIGZpZWxkICovCi0JdTMyIGxlbmd0aDsJCS8qIGJ5dGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhpcyByZWNvcmQsCi0JCQkJICogc3RhcnRpbmcgYXQgdmVyc2lvbiBhbmQgaW5jbHVkaW5nIElFcwotCQkJCSAqLwotCXN0cnVjdCBldGhlcl9hZGRyIEJTU0lEOwotCXUxNiBiZWFjb25fcGVyaW9kOwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1MTYgY2FwYWJpbGl0eTsJLyogQ2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwotCXU4IFNTSURfbGVuOwotCXU4IFNTSURbMzJdOwotCXN0cnVjdCB7Ci0JCXVpbnQgY291bnQ7CS8qICMgcmF0ZXMgaW4gdGhpcyBzZXQgKi8KLQkJdTggcmF0ZXNbMTZdOwkvKiByYXRlcyBpbiA1MDBrYnBzIHVuaXRzIHcvaGkgYml0IHNldCBpZiBiYXNpYyAqLwotCX0gcmF0ZXNldDsJCS8qIHN1cHBvcnRlZCByYXRlcyAqLwotCXU4IGNoYW5uZWw7CQkvKiBDaGFubmVsIG5vLiAqLwotCXUxNiBhdGltX3dpbmRvdzsJLyogdW5pdHMgYXJlIEt1c2VjICovCi0JdTggZHRpbV9wZXJpb2Q7CS8qIERUSU0gcGVyaW9kICovCi0JczE2IFJTU0k7CQkvKiByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCAoaW4gZEJtKSAqLwotCXM4IHBoeV9ub2lzZTsJCS8qIG5vaXNlIChpbiBkQm0pICovCi0JdTMyIGllX2xlbmd0aDsJLyogYnl0ZSBsZW5ndGggb2YgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLQkvKiB2YXJpYWJsZSBsZW5ndGggSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLX0gd2xfYnNzX2luZm9fMTA3X3Q7Ci0KLS8qCi0gKiBQZXItQlNTIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KLSAqLwotCi0jZGVmaW5lCUxFR0FDWTJfV0xfQlNTX0lORk9fVkVSU0lPTgkxMDgJLyogb2xkIHZlcnNpb24gb2Ygd2xfYnNzX2luZm8gc3RydWN0ICovCi0KLS8qIEJTUyBpbmZvIHN0cnVjdHVyZQotICogQXBwbGljYXRpb25zIE1VU1QgQ0hFQ0sgaWVfb2Zmc2V0IGZpZWxkIGFuZCBsZW5ndGggZmllbGQgdG8gYWNjZXNzIElFcyBhbmQKLSAqIG5leHQgYnNzX2luZm8gc3RydWN0dXJlIGluIGEgdmVjdG9yIChpbiB3bF9zY2FuX3Jlc3VsdHNfdCkKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xfYnNzX2luZm9fMTA4IHsKLQl1MzIgdmVyc2lvbjsJCS8qIHZlcnNpb24gZmllbGQgKi8KLQl1MzIgbGVuZ3RoOwkJLyogYnl0ZSBsZW5ndGggb2YgZGF0YSBpbiB0aGlzIHJlY29yZCwKLQkJCQkgKiBzdGFydGluZyBhdCB2ZXJzaW9uIGFuZCBpbmNsdWRpbmcgSUVzCi0JCQkJICovCi0Jc3RydWN0IGV0aGVyX2FkZHIgQlNTSUQ7Ci0JdTE2IGJlYWNvbl9wZXJpb2Q7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLwotCXUxNiBjYXBhYmlsaXR5OwkvKiBDYXBhYmlsaXR5IGluZm9ybWF0aW9uICovCi0JdTggU1NJRF9sZW47Ci0JdTggU1NJRFszMl07Ci0Jc3RydWN0IHsKLQkJdWludCBjb3VudDsJLyogIyByYXRlcyBpbiB0aGlzIHNldCAqLwotCQl1OCByYXRlc1sxNl07CS8qIHJhdGVzIGluIDUwMGticHMgdW5pdHMgdy9oaSBiaXQgc2V0IGlmIGJhc2ljICovCi0JfSByYXRlc2V0OwkJLyogc3VwcG9ydGVkIHJhdGVzICovCi0JY2hhbnNwZWNfdCBjaGFuc3BlYzsJLyogY2hhbnNwZWMgZm9yIGJzcyAqLwotCXUxNiBhdGltX3dpbmRvdzsJLyogdW5pdHMgYXJlIEt1c2VjICovCi0JdTggZHRpbV9wZXJpb2Q7CS8qIERUSU0gcGVyaW9kICovCi0JczE2IFJTU0k7CQkvKiByZWNlaXZlIHNpZ25hbCBzdHJlbmd0aCAoaW4gZEJtKSAqLwotCXM4IHBoeV9ub2lzZTsJCS8qIG5vaXNlIChpbiBkQm0pICovCi0KLQl1OCBuX2NhcDsJCS8qIEJTUyBpcyA4MDIuMTFOIENhcGFibGUgKi8KLQl1MzIgbmJzc19jYXA7CS8qIDgwMi4xMU4gQlNTIENhcGFiaWxpdGllcyAoYmFzZWQgb24gSFRfQ0FQXyopICovCi0JdTggY3RsX2NoOwkJLyogODAyLjExTiBCU1MgY29udHJvbCBjaGFubmVsIG51bWJlciAqLwotCXUzMiByZXNlcnZlZDMyWzFdOwkvKiBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uIG9mIEJTUyBwcm9wZXJ0aWVzICovCi0JdTggZmxhZ3M7CQkvKiBmbGFncyAqLwotCXU4IHJlc2VydmVkWzNdOwkvKiBSZXNlcnZlZCBmb3IgZXhwYW5zaW9uIG9mIEJTUyBwcm9wZXJ0aWVzICovCi0JdTggYmFzaWNfbWNzW01DU1NFVF9MRU5dOwkvKiA4MDIuMTFOIEJTUyByZXF1aXJlZCBNQ1Mgc2V0ICovCi0KLQl1MTYgaWVfb2Zmc2V0OwkvKiBvZmZzZXQgYXQgd2hpY2ggSUVzIHN0YXJ0LCBmcm9tIGJlZ2lubmluZyAqLwotCXUzMiBpZV9sZW5ndGg7CS8qIGJ5dGUgbGVuZ3RoIG9mIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCi0JLyogQWRkIG5ldyBmaWVsZHMgaGVyZSAqLwotCS8qIHZhcmlhYmxlIGxlbmd0aCBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotfSB3bF9ic3NfaW5mb18xMDhfdDsKLQogI2lmZGVmIEJSQ01fRlVMTE1BQworCiAjZGVmaW5lCVdMX0JTU19JTkZPX1ZFUlNJT04JMTA4CS8qIGN1cnJlbnQgdmVyIG9mIHdsX2Jzc19pbmZvIHN0cnVjdCAqLwotI2Vsc2UKLSNkZWZpbmUJV0xfQlNTX0lORk9fVkVSU0lPTgkxMDkJLyogY3VycmVudCB2ZXIgb2Ygd2xfYnNzX2luZm8gc3RydWN0ICovCi0jZW5kaWYKIAogLyogQlNTIGluZm8gc3RydWN0dXJlCiAgKiBBcHBsaWNhdGlvbnMgTVVTVCBDSEVDSyBpZV9vZmZzZXQgZmllbGQgYW5kIGxlbmd0aCBmaWVsZCB0byBhY2Nlc3MgSUVzIGFuZApAQCAtMTQ4LDEyICs3NSwxNCBAQAogCS8qIEFkZCBuZXcgZmllbGRzIGhlcmUgKi8KIAkvKiB2YXJpYWJsZSBsZW5ndGggSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KIH0gd2xfYnNzX2luZm9fdDsKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgd2xjX3NzaWQgewogCXUzMiBTU0lEX2xlbjsKIAl1bnNpZ25lZCBjaGFyIFNTSURbMzJdOwogfSB3bGNfc3NpZF90OwogCisjaWZkZWYgQlJDTV9GVUxMTUFDCiB0eXBlZGVmIHN0cnVjdCBjaGFuX3NjYW5kYXRhIHsKIAl1OCB0eHBvd2VyOwogCXU4IHBhZDsKQEAgLTMwOCw2ICsyMzcsNyBAQAogCXN0cnVjdCBldGhlcl9hZGRyIGJzc2lkOwogCXN0cnVjdCBldGhlcl9hZGRyIG1hYzsKIH0gd2xfcHJvYmVfcGFyYW1zX3Q7CisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKICNkZWZpbmUgV0xfTlVNUkFURVMJCTE2CS8qIG1heCAjIG9mIHJhdGVzIGluIGEgcmF0ZXNldCAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xfcmF0ZXNldCB7CkBAIC0zMTUsNiArMjQ1LDcgQEAKIAl1OCByYXRlc1tXTF9OVU1SQVRFU107CS8qIHJhdGVzIGluIDUwMGticHMgdW5pdHMgdy9oaSBiaXQgc2V0IGlmIGJhc2ljICovCiB9IHdsX3JhdGVzZXRfdDsKIAorI2lmZGVmIEJSQ01fRlVMTE1BQwogdHlwZWRlZiBzdHJ1Y3Qgd2xfcmF0ZXNldF9hcmdzIHsKIAl1MzIgY291bnQ7CQkvKiAjIHJhdGVzIGluIHRoaXMgc2V0ICovCiAJdTggcmF0ZXNbV0xfTlVNUkFURVNdOwkvKiByYXRlcyBpbiA1MDBrYnBzIHVuaXRzIHcvaGkgYml0IHNldCBpZiBiYXNpYyAqLwpAQCAtMzUyLDYgKzI4Myw4IEBACiB9IHdsX2pvaW5fcGFyYW1zX3Q7CiAjZGVmaW5lIFdMX0pPSU5fUEFSQU1TX0ZJWEVEX1NJWkUgCShzaXplb2Yod2xfam9pbl9wYXJhbXNfdCkgLSBzaXplb2YoY2hhbnNwZWNfdCkpCiAKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KKwogLyogZGVmaW5lcyB1c2VkIGJ5IHRoZSBucmF0ZSBpb3ZhciAqLwogI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJMHgwMDAwMDA4MAkvKiBNU0MgaW4gdXNlLGluZGljYXRlcyBiMC02IGhvbGRzIGFuIG1jcyAqLwogI2RlZmluZSBOUkFURV9SQVRFX01BU0sgMHgwMDAwMDA3ZgkvKiByYXRlL21jcyB2YWx1ZSAqLwpAQCAtMzkxLDYgKzMyNCw3IEBACiAKICNkZWZpbmUgSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUwk3CS8qIE1DUyB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRoaXMgZW5hYmxlIG11bHRpcGxlIHN0cmVhbXMgKi8KIAorI2lmZGVmIEJSQ01fRlVMTE1BQwogI2RlZmluZSBNQVhfQ0NBX0NIQU5ORUxTIDM4CS8qIE1heCBudW1iZXIgb2YgMjAgTWh6IHdpZGUgY2hhbm5lbHMgKi8KICNkZWZpbmUgTUFYX0NDQV9TRUNTICAgICA2MAkvKiBDQ0Ega2VlcHMgdGhpcyBtYW55IHNlY29uZHMgaGlzdG9yeSAqLwogCkBAIC00MjgsOCArMzYyLDExIEBACiAJY2NhX2Nvbmdlc3RfdCBzZWNzWzFdOwkvKiBEYXRhICovCiB9IGNjYV9jb25nZXN0X2NoYW5uZWxfcmVxX3Q7CiAKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KKwogI2RlZmluZSBXTENfQ05UUllfQlVGX1NaCTQJLyogQ291bnRyeSBzdHJpbmcgaXMgMyBieXRlcyArIE5VTCAqLwogCisjaWZkZWYgQlJDTV9GVUxMTUFDCiB0eXBlZGVmIHN0cnVjdCB3bF9jb3VudHJ5IHsKIAljaGFyIGNvdW50cnlfYWJicmV2W1dMQ19DTlRSWV9CVUZfU1pdOwkvKiBudWwtdGVybWluYXRlZCBjb3VudHJ5IGNvZGUgdXNlZCBpbgogCQkJCQkJICogdGhlIENvdW50cnkgSUUKQEAgLTUxNiw2ICs0NTMsNyBAQAogCXdsX3JtX3JlcF9lbHRfdCByZXBbMV07CS8qIHZhcmlhYmxlIGxlbmd0aCBibG9jayBvZiByZXBvcnRzICovCiB9IHdsX3JtX3JlcF90OwogI2RlZmluZSBXTF9STV9SRVBfRklYRURfTEVOCTgKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAogLyogRW51bWVyYXRlIGNyeXB0byBhbGdvcml0aG1zICovCiAjZGVmaW5lCUNSWVBUT19BTEdPX09GRgkJCTAKQEAgLTYyMSwyOCArNTU5LDYgQEAKIAl1OCBhY3RpdmVoaTsKIH0gd2xfbGVkX2luZm9fdDsKIAotLyogZmxhZ3MgKi8KLSNkZWZpbmUgV0xDX0FTU09DX1JFUV9JU19SRUFTU09DIDB4MDEJLyogYXNzb2MgcmVxIHdhcyBhY3R1YWxseSBhIHJlYXNzb2MgKi8KLQotLyogc3JvbSByZWFkL3dyaXRlIHN0cnVjdCBwYXNzZWQgdGhyb3VnaCBpb2N0bCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVpbnQgYnl0ZW9mZjsJCS8qIGJ5dGUgb2Zmc2V0ICovCi0JdWludCBuYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgKi8KLQl1MTYgYnVmWzFdOwotfSBzcm9tX3J3X3Q7Ci0KLS8qIHNpbWlsYXIgY2lzIChzcm9tIG9yIG90cCkgc3RydWN0IFtpb3ZhcjogbWF5IG5vdCBiZSBhbGlnbmVkXSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXUzMiBzb3VyY2U7CQkvKiBjaXMgc291cmNlICovCi0JdTMyIGJ5dGVvZmY7CQkvKiBieXRlIG9mZnNldCAqLwotCXUzMiBuYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgKi8KLQkvKiBkYXRhIGZvbGxvd3MgaGVyZSAqLwotfSBjaXNfcndfdDsKLQotI2RlZmluZSBXTENfQ0lTX0RFRkFVTFQJMAkvKiBidWlsdC1pbiBkZWZhdWx0ICovCi0jZGVmaW5lIFdMQ19DSVNfU1JPTQkxCS8qIHNvdXJjZSBpcyBzcHJvbSAqLwotI2RlZmluZSBXTENfQ0lTX09UUAkyCS8qIHNvdXJjZSBpcyBvdHAgKi8KLQogLyogUl9SRUcgYW5kIFdfUkVHIHN0cnVjdCBwYXNzZWQgdGhyb3VnaCBpb2N0bCAqLwogdHlwZWRlZiBzdHJ1Y3QgewogCXUzMiBieXRlb2ZmOwkJLyogYnl0ZSBvZmZzZXQgb2YgdGhlIGZpZWxkIGluIGQxMXJlZ3NfdCAqLwpAQCAtNjUxLDEwMiArNTY3LDE0IEBACiAJdWludCBiYW5kOwkJLyogYmFuZCAob3B0aW9uYWwpICovCiB9IHJ3X3JlZ190OwogCi0vKiBTdHJ1Y3R1cmUgdXNlZCBieSBHRVQvU0VUX0FUVEVOIGlvY3RscyAtIGl0IGNvbnRyb2xzIHBvd2VyIGluIGIvZy1iYW5kICovCi0vKiBQQ0wgLSBQb3dlciBDb250cm9sIExvb3AgKi8KLS8qIGN1cnJlbnQgZ2FpbiBzZXR0aW5nIGlzIHJlcGxhY2VkIGJ5IHVzZXIgaW5wdXQgKi8KLSNkZWZpbmUgV0xfQVRURU5fQVBQX0lOUFVUX1BDTF9PRkYJMAkvKiB0dXJuIG9mZiBQQ0wsIGFwcGx5IHN1cHBsaWVkIGlucHV0ICovCi0jZGVmaW5lIFdMX0FUVEVOX1BDTF9PTgkJCTEJLyogdHVybiBvbiBQQ0wgKi8KLS8qIGN1cnJlbnQgZ2FpbiBzZXR0aW5nIGlzIG1haW50YWluZWQgKi8KLSNkZWZpbmUgV0xfQVRURU5fUENMX09GRgkJMgkvKiB0dXJuIG9mZiBQQ0wuICovCiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgYXV0b19jdHJsOwkvKiBXTF9BVFRFTl9YWCAqLwotCXUxNiBiYjsJCS8qIEJhc2ViYW5kIGF0dGVudWF0aW9uICovCi0JdTE2IHJhZGlvOwkJLyogUmFkaW8gYXR0ZW51YXRpb24gKi8KLQl1MTYgdHhjdGwxOwkJLyogUmFkaW8gVFhfQ1RMMSB2YWx1ZSAqLwotfSBhdHRlbl90OwotCi0vKiBQZXItQUMgcmV0cnkgcGFyYW1ldGVycyAqLwotc3RydWN0IHdtZV90eF9wYXJhbXNfcyB7Ci0JdTggc2hvcnRfcmV0cnk7Ci0JdTggc2hvcnRfZmFsbGJhY2s7Ci0JdTggbG9uZ19yZXRyeTsKLQl1OCBsb25nX2ZhbGxiYWNrOwotCXUxNiBtYXhfcmF0ZTsJLyogSW4gdW5pdHMgb2YgNTEyIEticHMgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHdtZV90eF9wYXJhbXNfcyB3bWVfdHhfcGFyYW1zX3Q7Ci0KLSNkZWZpbmUgV0xfV01FX1RYX1BBUkFNU19JT19CWVRFUyAoc2l6ZW9mKHdtZV90eF9wYXJhbXNfdCkgKiBBQ19DT1VOVCkKLQotLyogZGVmaW5lcyB1c2VkIGJ5IHBvd2VyaWR4IGlvdmFyIC0gaXQgY29udHJvbHMgcG93ZXIgaW4gYS1iYW5kICovCi0vKiBjdXJyZW50IGdhaW4gc2V0dGluZyBpcyBtYWludGFpbmVkICovCi0jZGVmaW5lIFdMX1BXUklEWF9QQ0xfT0ZGCS0yCS8qIHR1cm4gb2ZmIFBDTC4gICovCi0jZGVmaW5lIFdMX1BXUklEWF9QQ0xfT04JLTEJLyogdHVybiBvbiBQQ0wgKi8KLSNkZWZpbmUgV0xfUFdSSURYX0xPV0VSX0xJTUlUCS0yCS8qIGxvd2VyIGxpbWl0ICovCi0jZGVmaW5lIFdMX1BXUklEWF9VUFBFUl9MSU1JVAk2MwkvKiB1cHBlciBsaW1pdCAqLwotLyogdmFsdWUgPj0gMCBjYXVzZXMKLSAqCS0gaW5wdXQgdG8gYmUgc2V0IHRvIHRoYXQgdmFsdWUKLSAqCS0gUENMIHRvIGJlIG9mZgotICovCi0KLS8qIFVzZWQgdG8gZ2V0IHNwZWNpZmljIGxpbmsvYWMgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWludCBhYzsKLQl1OCB2YWw7Ci0Jc3RydWN0IGV0aGVyX2FkZHIgZWE7Ci19IGxpbmtfdmFsX3Q7Ci0KLSNkZWZpbmUgQkNNX01BQ19TVEFUVVNfSU5ESUNBVElPTgkoMHg0MDAxMDIwMEwpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYgdmVyOwkJLyogdmVyc2lvbiBvZiB0aGlzIHN0cnVjdCAqLwotCXUxNiBsZW47CQkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KLQl1MTYgY2FwOwkJLyogc3RhJ3MgYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KLQl1MzIgZmxhZ3M7CQkvKiBmbGFncyBkZWZpbmVkIGJlbG93ICovCi0JdTMyIGlkbGU7CQkvKiB0aW1lIHNpbmNlIGRhdGEgcGt0IHJ4J2QgZnJvbSBzdGEgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBlYTsJLyogU3RhdGlvbiBhZGRyZXNzICovCi0Jd2xfcmF0ZXNldF90IHJhdGVzZXQ7CS8qIHJhdGVzZXQgaW4gdXNlICovCi0JdTMyIGluOwkJLyogc2Vjb25kcyBlbGFwc2VkIHNpbmNlIGFzc29jaWF0ZWQgKi8KLQl1MzIgbGlzdGVuX2ludGVydmFsX2lubXM7CS8qIE1pbiBMaXN0ZW4gaW50ZXJ2YWwgaW4gbXMgZm9yIHRoaXMgU1RBICovCi0JdTMyIHR4X3BrdHM7CQkvKiAjIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgKi8KLQl1MzIgdHhfZmFpbHVyZXM7CS8qICMgb2YgcGFja2V0cyBmYWlsZWQgKi8KLQl1MzIgcnhfdWNhc3RfcGt0czsJLyogIyBvZiB1bmljYXN0IHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1MzIgcnhfbWNhc3RfcGt0czsJLyogIyBvZiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAqLwotCXUzMiB0eF9yYXRlOwkJLyogUmF0ZSBvZiBsYXN0IHN1Y2Nlc3NmdWwgdHggZnJhbWUgKi8KLQl1MzIgcnhfcmF0ZTsJCS8qIFJhdGUgb2YgbGFzdCBzdWNjZXNzZnVsIHJ4IGZyYW1lICovCi0JdTMyIHJ4X2RlY3J5cHRfc3VjY2VlZHM7CS8qICMgb2YgcGFja2V0IGRlY3J5cHRlZCBzdWNjZXNzZnVsbHkgKi8KLQl1MzIgcnhfZGVjcnlwdF9mYWlsdXJlczsJLyogIyBvZiBwYWNrZXQgZGVjcnlwdGVkIHVuc3VjY2Vzc2Z1bGx5ICovCi19IHN0YV9pbmZvX3Q7Ci0KLSNkZWZpbmUgV0xfT0xEX1NUQUlORk9fU0laRQlvZmZzZXRvZihzdGFfaW5mb190LCB0eF9wa3RzKQotCi0jZGVmaW5lIFdMX1NUQV9WRVIJCTMKLQotLyogRmxhZ3MgZm9yIHN0YV9pbmZvX3QgaW5kaWNhdGluZyBwcm9wZXJ0aWVzIG9mIFNUQSAqLwotI2RlZmluZSBXTF9TVEFfQlJDTQkJMHgxCS8qIFJ1bm5pbmcgYSBCcm9hZGNvbSBkcml2ZXIgKi8KLSNkZWZpbmUgV0xfU1RBX1dNRQkJMHgyCS8qIFdNTSBhc3NvY2lhdGlvbiAqLwotI2RlZmluZSBXTF9TVEFfQUJDQVAJCTB4NAotI2RlZmluZSBXTF9TVEFfQVVUSEUJCTB4OAkvKiBBdXRoZW50aWNhdGVkICovCi0jZGVmaW5lIFdMX1NUQV9BU1NPQwkJMHgxMAkvKiBBc3NvY2lhdGVkICovCi0jZGVmaW5lIFdMX1NUQV9BVVRITwkJMHgyMAkvKiBBdXRob3JpemVkICovCi0jZGVmaW5lIFdMX1NUQV9XRFMJCTB4NDAJLyogV2lyZWxlc3MgRGlzdHJpYnV0aW9uIFN5c3RlbSAqLwotI2RlZmluZSBXTF9TVEFfV0RTX0xJTktVUAkweDgwCS8qIFdEUyB0cmFmZmljL3Byb2JlcyBmbG93aW5nIHByb3Blcmx5ICovCi0jZGVmaW5lIFdMX1NUQV9QUwkJMHgxMDAJLyogU1RBIGlzIGluIHBvd2VyIHNhdmUgbW9kZSBmcm9tIEFQJ3Mgdmlld3BvaW50ICovCi0jZGVmaW5lIFdMX1NUQV9BUFNEX0JFCQkweDIwMAkvKiBBUFNEIGRlbHYvdHJpZ2dlciBmb3IgQUNfQkUgaXMgZGVmYXVsdCBlbmFibGVkICovCi0jZGVmaW5lIFdMX1NUQV9BUFNEX0JLCQkweDQwMAkvKiBBUFNEIGRlbHYvdHJpZ2dlciBmb3IgQUNfQksgaXMgZGVmYXVsdCBlbmFibGVkICovCi0jZGVmaW5lIFdMX1NUQV9BUFNEX1ZJCQkweDgwMAkvKiBBUFNEIGRlbHYvdHJpZ2dlciBmb3IgQUNfVkkgaXMgZGVmYXVsdCBlbmFibGVkICovCi0jZGVmaW5lIFdMX1NUQV9BUFNEX1ZPCQkweDEwMDAJLyogQVBTRCBkZWx2L3RyaWdnZXIgZm9yIEFDX1ZPIGlzIGRlZmF1bHQgZW5hYmxlZCAqLwotI2RlZmluZSBXTF9TVEFfTl9DQVAJCTB4MjAwMAkvKiBTVEEgODAyLjExbiBjYXBhYmxlICovCi0jZGVmaW5lIFdMX1NUQV9TQ0JTVEFUUwkJMHg0MDAwCS8qIFBlciBTVEEgZGVidWcgc3RhdHMgKi8KLQotI2RlZmluZSBXTF9XRFNfTElOS1VQCQlXTF9TVEFfV0RTX0xJTktVUAkvKiBkZXByZWNhdGVkICovCi0KKyNpZmRlZiBCUkNNX0ZVTExNQUMKIC8qIFVzZWQgdG8gZ2V0IHNwZWNpZmljIFNUQSBwYXJhbWV0ZXJzICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdTMyIHZhbDsKIAlzdHJ1Y3QgZXRoZXJfYWRkciBlYTsKIH0gc2NiX3ZhbF90OworI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCiAvKiBjaGFubmVsIGVuY29kaW5nICovCiB0eXBlZGVmIHN0cnVjdCBjaGFubmVsX2luZm8gewpAQCAtNzcwLDYgKzU5OCw3IEBACiAJdWludCByeF9vY2FzdF9nb29kX3BrdDsJLyogdW5pY2FzdCBwYWNrZXRzIGRlc3RpbmVkIGZvciBvdGhlcnMgKi8KIH0gZ2V0X3BrdGNudF90OwogCisjaWZkZWYgQlJDTV9GVUxMTUFDCiAvKiBMaW51eCBuZXR3b3JrIGRyaXZlciBpb2N0bCBlbmNvZGluZyAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xfaW9jdGwgewogCXVpbnQgY21kOwkJLyogY29tbW9uIGlvY3RsIGRlZmluaXRpb24gKi8KQEAgLTc3OSwxMSArNjA4LDggQEAKIAl1aW50IHVzZWQ7CQkvKiBieXRlcyByZWFkIG9yIHdyaXR0ZW4gKG9wdGlvbmFsKSAqLwogCXVpbnQgbmVlZGVkOwkJLyogYnl0ZXMgbmVlZGVkIChvcHRpb25hbCkgKi8KIH0gd2xfaW9jdGxfdDsKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAotLyogcmVmZXJlbmNlIHRvIHdsX2lvY3RsX3Qgc3RydWN0IHVzZWQgYnkgdXNlcm1vZGUgZHJpdmVyICovCi0jZGVmaW5lIGlvY3RsX3N1YnR5cGUJc2V0CS8qIHN1YnR5cGUgcGFyYW0gKi8KLSNkZWZpbmUgaW9jdGxfcGlkCXVzZWQJLyogcGlkIHBhcmFtICovCi0jZGVmaW5lIGlvY3RsX3N0YXR1cwluZWVkZWQJLyogc3RhdHVzIHBhcmFtICovCiAKIC8qCiAgKiBTdHJ1Y3R1cmUgZm9yIHBhc3NpbmcgaGFyZHdhcmUgYW5kIHNvZnR3YXJlCkBAIC04MTAsNDUgKzYzNiwxMSBAQAogCiAjZGVmaW5lIFdMX1JFVl9JTkZPX0xFR0FDWV9MRU5HVEgJNDgKIAotI2RlZmluZSBXTF9CUkFORF9NQVggMTAKLXR5cGVkZWYgc3RydWN0IHdsX2luc3RhbmNlX2luZm8gewotCXVpbnQgaW5zdGFuY2U7Ci0JY2hhciBicmFuZFtXTF9CUkFORF9NQVhdOwotfSB3bF9pbnN0YW5jZV9pbmZvX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byBjaGFuZ2Ugc2l6ZSBvZiB0eCBmaWZvICovCi10eXBlZGVmIHN0cnVjdCB3bF90eGZpZm9fc3ogewotCXUxNiBtYWdpYzsKLQl1MTYgZmlmbzsKLQl1MTYgc2l6ZTsKLX0gd2xfdHhmaWZvX3N6X3Q7Ci0vKiBtYWdpYyBwYXR0ZXJuIHVzZWQgZm9yIG1pc21hdGNoIGRyaXZlciBhbmQgd2wgKi8KLSNkZWZpbmUgV0xfVFhGSUZPX1NaX01BR0lDCTB4YTVhNQotCi0vKiBUcmFuc2ZlciBpbmZvIGFib3V0IGFuIElPVmFyIGZyb20gdGhlIGRyaXZlciAqLwotLyogTWF4IHN1cHBvcnRlZCBJT1YgbmFtZSBzaXplIGluIGJ5dGVzLCArIDEgZm9yIG51bCB0ZXJtaW5hdGlvbiAqLwotI2RlZmluZSBXTENfSU9WX05BTUVfTEVOIDMwCi10eXBlZGVmIHN0cnVjdCB3bGNfaW92X3RyeF9zIHsKLQl1OCBtb2R1bGU7Ci0JdTggdHlwZTsKLQljaGFyIG5hbWVbV0xDX0lPVl9OQU1FX0xFTl07Ci19IHdsY19pb3ZfdHJ4X3Q7Ci0KLS8qIGNoZWNrIHRoaXMgbWFnaWMgbnVtYmVyICovCi0jZGVmaW5lIFdMQ19JT0NUTF9NQUdJQwkJMHgxNGU0NmM3NwotCi0jZGVmaW5lIFBST0NfRU5UUllfTkFNRSAiYnJjbV9kZWJ1ZyIKLS8qIGJ1bXAgdGhpcyBudW1iZXIgaWYgeW91IGNoYW5nZSB0aGUgaW9jdGwgaW50ZXJmYWNlICovCi0jZGVmaW5lIFdMQ19JT0NUTF9WRVJTSU9OCTEKLQogI2lmZGVmIEJSQ01fRlVMTE1BQwotI2RlZmluZQlXTENfSU9DVExfTUFYTEVOCTgxOTIKLSNlbHNlCi0jZGVmaW5lCVdMQ19JT0NUTF9NQVhMRU4JCTMwNzIJLyogbWF4IGxlbmd0aCBpb2N0bCBidWZmZXIgcmVxdWlyZWQgKi8KLSNlbmRpZgogI2RlZmluZQlXTENfSU9DVExfU01MRU4JCQkyNTYJLyogInNtYWxsIiBsZW5ndGggaW9jdGwgYnVmZmVyIHJlcXVpcmVkICovCiAjZGVmaW5lIFdMQ19JT0NUTF9NRURMRU4JCTE1MzYJLyogIm1lZCIgbGVuZ3RoIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwotI2RlZmluZSBXTENfU0FNUExFQ09MTEVDVF9NQVhMRU4JMTAyNDAJLyogTWF4IFNhbXBsZSBDb2xsZWN0IGJ1ZmZlciBmb3IgdHdvIGNvcmVzICovCisjZGVmaW5lCVdMQ19JT0NUTF9NQVhMRU4JODE5MgorI2VuZGlmCiAKIC8qIGNvbW1vbiBpb2N0bCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBXTENfR0VUX01BR0lDCQkJCTAKQEAgLTEzOTksMjMgKzExOTEsNiBAQAogI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1M0MF9GSVJTVAkgICAgICAgIDI4CiAjZGVmaW5lIFdMX1RYX1BPV0VSX01DUzQwX05VTQkgICAgICAgIDE3CiAKLXR5cGVkZWYgc3RydWN0IHsKLQl1MzIgZmxhZ3M7Ci0JY2hhbnNwZWNfdCBjaGFuc3BlYzsJLyogdHhwd3IgcmVwb3J0IGZvciB0aGlzIGNoYW5uZWwgKi8KLQljaGFuc3BlY190IGxvY2FsX2NoYW5zcGVjOwkvKiBjaGFubmVsIG9uIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkICovCi0JdTggbG9jYWxfbWF4OwkvKiBsb2NhbCBtYXggYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwotCXU4IGxvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIGNvbnN0cmFpbnQgYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwotCXM4IGFudGdhaW5bMl07CS8qIEFudCBnYWluIGZvciBlYWNoIGJhbmQgLSBmcm9tIFNST00gKi8KLQl1OCByZl9jb3JlczsJCS8qIGNvdW50IG9mIFJGIENvcmVzIGJlaW5nIHJlcG9ydGVkICovCi0JdTggZXN0X1BvdXRbNF07CS8qIExhdGVzdCB0eCBwb3dlciBvdXQgZXN0aW1hdGUgcGVyIFJGCi0JCQkJICogY2hhaW4gd2l0aG91dCBhZGp1c3RtZW50Ci0JCQkJICovCi0JdTggZXN0X1BvdXRfY2NrOwkvKiBMYXRlc3QgQ0NLIHR4IHBvd2VyIG91dCBlc3RpbWF0ZSAqLwotCXU4IHVzZXJfbGltaXRbV0xfVFhfUE9XRVJfUkFURVNfTEVHQUNZXTsJLyogVXNlciBsaW1pdCAqLwotCXU4IHJlZ19saW1pdFtXTF9UWF9QT1dFUl9SQVRFU19MRUdBQ1ldOwkvKiBSZWd1bGF0b3J5IHBvd2VyIGxpbWl0ICovCi0JdTggYm9hcmRfbGltaXRbV0xfVFhfUE9XRVJfUkFURVNfTEVHQUNZXTsJLyogTWF4IHBvd2VyIGJvYXJkIGNhbiBzdXBwb3J0IChTUk9NKSAqLwotCXU4IHRhcmdldFtXTF9UWF9QT1dFUl9SQVRFU19MRUdBQ1ldOwkvKiBMYXRlc3QgdGFyZ2V0IHBvd2VyICovCi19IHR4X3Bvd2VyX2xlZ2FjeTJfdDsKIAogI2RlZmluZSBXTF9UWF9QT1dFUl9SQVRFUwkgICAgICAgMTAxCiAjZGVmaW5lIFdMX1RYX1BPV0VSX0NDS19GSVJTVAkgICAgICAgMApAQCAtMTg0OCw2MyArMTYyMyw2IEBACiAJdTggcmV0cnk7CQkvKiByZXRyeSB2YWx1ZSAqLwogfTsKIAotLyogc3RydWN0dXJlIGZvciBhZGR0cyBhcmd1bWVudHMgKi8KLS8qIEZvciBpb2N0bHMgdGhhdCB0YWtlIGEgbGlzdCBvZiBUU1BFQyAqLwotc3RydWN0IHRzbGlzdCB7Ci0JaW50IGNvdW50OwkJLyogbnVtYmVyIG9mIHRzcGVjcyAqLwotCXN0cnVjdCB0c2luZm9fYXJnIHRzaW5mb1sxXTsJLyogdmFyaWFibGUgbGVuZ3RoIGFycmF5IG9mIHRzaW5mbyAqLwotfTsKLQotLyogc3RydWN0dXJlIGZvciBhZGR0cy9kZWx0cyBhcmd1bWVudHMgKi8KLXR5cGVkZWYgc3RydWN0IHRzcGVjX2FyZyB7Ci0JdTE2IHZlcnNpb247CQkvKiBzZWUgZGVmaW5pdGlvbiBvZiBUU1BFQ19BUkdfVkVSU0lPTiAqLwotCXUxNiBsZW5ndGg7CQkvKiBsZW5ndGggb2YgZW50aXJlIHN0cnVjdHVyZSAqLwotCXVpbnQgZmxhZzsJCS8qIGJpdCBmaWVsZCAqLwotCS8qIFRTUEVDIEFyZ3VtZW50cyAqLwotCXN0cnVjdCB0c2luZm9fYXJnIHRzaW5mbzsJLyogVFMgSW5mbyBiaXQgZmllbGQgKi8KLQl1MTYgbm9tX21zZHVfc2l6ZTsJLyogKE5vbWluYWwgb3IgZml4ZWQpIE1TRFUgU2l6ZSAoYnl0ZXMpICovCi0JdTE2IG1heF9tc2R1X3NpemU7CS8qIE1heGltdW0gTVNEVSBTaXplIChieXRlcykgKi8KLQl1aW50IG1pbl9zcnZfaW50ZXJ2YWw7CS8qIE1pbmltdW0gU2VydmljZSBJbnRlcnZhbCAodXMpICovCi0JdWludCBtYXhfc3J2X2ludGVydmFsOwkvKiBNYXhpbXVtIFNlcnZpY2UgSW50ZXJ2YWwgKHVzKSAqLwotCXVpbnQgaW5hY3Rpdml0eV9pbnRlcnZhbDsJLyogSW5hY3Rpdml0eSBJbnRlcnZhbCAodXMpICovCi0JdWludCBzdXNwZW5zaW9uX2ludGVydmFsOwkvKiBTdXNwZW5zaW9uIEludGVydmFsICh1cykgKi8KLQl1aW50IHNydl9zdGFydF90aW1lOwkvKiBTZXJ2aWNlIFN0YXJ0IFRpbWUgKHVzKSAqLwotCXVpbnQgbWluX2RhdGFfcmF0ZTsJLyogTWluaW11bSBEYXRhIFJhdGUgKGJwcykgKi8KLQl1aW50IG1lYW5fZGF0YV9yYXRlOwkvKiBNZWFuIERhdGEgUmF0ZSAoYnBzKSAqLwotCXVpbnQgcGVha19kYXRhX3JhdGU7CS8qIFBlYWsgRGF0YSBSYXRlIChicHMpICovCi0JdWludCBtYXhfYnVyc3Rfc2l6ZTsJLyogTWF4aW11bSBCdXJzdCBTaXplIChieXRlcykgKi8KLQl1aW50IGRlbGF5X2JvdW5kOwkvKiBEZWxheSBCb3VuZCAodXMpICovCi0JdWludCBtaW5fcGh5X3JhdGU7CS8qIE1pbmltdW0gUEhZIFJhdGUgKGJwcykgKi8KLQl1MTYgc3VycGx1c19idzsJLyogU3VycGx1cyBCYW5kd2lkdGggQWxsb3dhbmNlIChyYW5nZSAxLjAgdG8gOC4wKSAqLwotCXUxNiBtZWRpdW1fdGltZTsJLyogTWVkaXVtIFRpbWUgKDMyIHVzL3MgcGVyaW9kcykgKi8KLQl1OCBkaWFsb2dfdG9rZW47CS8qIGRpYWxvZyB0b2tlbiAqLwotfSB0c3BlY19hcmdfdDsKLQotLyogdHNwZWMgYXJnIGZvciBkZXNpcmVkIHN0YXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IHRzcGVjX3Blcl9zdGFfYXJnIHsKLQlzdHJ1Y3QgZXRoZXJfYWRkciBlYTsKLQlzdHJ1Y3QgdHNwZWNfYXJnIHRzOwotfSB0c3BlY19wZXJfc3RhX2FyZ190OwotCi0vKiBzdHJ1Y3R1cmUgZm9yIG1heCBiYW5kd2lkdGggZm9yIGVhY2ggYWNjZXNzIGNhdGVnb3J5ICovCi10eXBlZGVmIHN0cnVjdCB3bWVfbWF4X2JhbmR3aWR0aCB7Ci0JdTMyIGFjW0FDX0NPVU5UXTsJLyogbWF4IGJhbmR3aWR0aCBmb3IgZWFjaCBhY2Nlc3MgY2F0ZWdvcnkgKi8KLX0gd21lX21heF9iYW5kd2lkdGhfdDsKLQotI2RlZmluZSBXTF9XTUVfTUJXX1BBUkFNU19JT19CWVRFUyAoc2l6ZW9mKHdtZV9tYXhfYmFuZHdpZHRoX3QpKQotCi0vKiBjdXJyZW50IHZlcnNpb24gb2Ygd2xfdHNwZWNfYXJnX3Qgc3RydWN0ICovCi0jZGVmaW5lCVRTUEVDX0FSR19WRVJTSU9OCQkyCS8qIGN1cnJlbnQgdmVyc2lvbiBvZiB3bF90c3BlY19hcmdfdCBzdHJ1Y3QgKi8KLSNkZWZpbmUgVFNQRUNfQVJHX0xFTkdUSAkJNTUJLyogYXJndW1lbnQgbGVuZ3RoIGZyb20gdHNpbmZvIHRvIG1lZGl1bV90aW1lICovCi0jZGVmaW5lIFRTUEVDX0RFRkFVTFRfRElBTE9HX1RPS0VOCTQyCS8qIGRlZmF1bHQgZGlhbG9nIHRva2VuICovCi0jZGVmaW5lIFRTUEVDX0RFRkFVTFRfU0JXX0ZBQ1RPUgkweDMwMDAJLyogZGVmYXVsdCBzdXJwbHVzIGJ3ICovCi0KLS8qIGRlZmluZSBmb3IgZmxhZyAqLwotI2RlZmluZSBUU1BFQ19QRU5ESU5HCQkwCS8qIFRTUEVDIHBlbmRpbmcgKi8KLSNkZWZpbmUgVFNQRUNfQUNDRVBURUQJCTEJLyogVFNQRUMgYWNjZXB0ZWQgKi8KLSNkZWZpbmUgVFNQRUNfUkVKRUNURUQJCTIJLyogVFNQRUMgcmVqZWN0ZWQgKi8KLSNkZWZpbmUgVFNQRUNfVU5LTk9XTgkJMwkvKiBUU1BFQyB1bmtub3duICovCi0jZGVmaW5lIFRTUEVDX1NUQVRVU19NQVNLCTcJLyogVFNQRUMgc3RhdHVzIG1hc2sgKi8KIAogLyogU29mdHdhcmUgZmVhdHVyZSBmbGFnIGRlZmluZXMgdXNlZCBieSB3bGZlYXR1cmVmbGFnICovCiAjZGVmaW5lIFdMX1NXRkxfTk9IV1JBRElPCTB4MDAwNApAQCAtMTkxMywxNiArMTYzMSw2IEBACiAKICNkZWZpbmUgV0xfTElGRVRJTUVfTUFYIDB4RkZGRgkvKiBNYXggdmFsdWUgaW4gbXMgKi8KIAotLyoKLSAqIERvbmdsZSBwYXR0ZXJuIG1hdGNoaW5nIGZpbHRlci4KLSAqLwotCi0vKiBQYWNrZXQgZmlsdGVyIHR5cGVzLiBDdXJyZW50bHksIG9ubHkgcGF0dGVybiBtYXRjaGluZyBpcyBzdXBwb3J0ZWQuICovCi10eXBlZGVmIGVudW0gd2xfcGt0X2ZpbHRlcl90eXBlIHsKLQlXTF9QS1RfRklMVEVSX1RZUEVfUEFUVEVSTl9NQVRDSAkvKiBQYXR0ZXJuIG1hdGNoaW5nIGZpbHRlciAqLwotfSB3bF9wa3RfZmlsdGVyX3R5cGVfdDsKLQotI2RlZmluZSBXTF9QS1RfRklMVEVSX1RZUEUgd2xfcGt0X2ZpbHRlcl90eXBlX3QKIAogLyogUGF0dGVybiBtYXRjaGluZyBmaWx0ZXIuIFNwZWNpZmllcyBhbiBvZmZzZXQgd2l0aGluIHJlY2VpdmVkIHBhY2tldHMgdG8KICAqIHN0YXJ0IG1hdGNoaW5nLCB0aGUgcGF0dGVybiB0byBtYXRjaCwgdGhlIHNpemUgb2YgdGhlIHBhdHRlcm4sIGFuZCBhIGJpdG1hc2sKQEAgLTE5NTcsMjAgKzE2NjUsNiBAQAogCXUzMiBlbmFibGU7CQkvKiBFbmFibGUvZGlzYWJsZSBib29sICovCiB9IHdsX3BrdF9maWx0ZXJfZW5hYmxlX3Q7CiAKLS8qIElPVkFSICJwa3RfZmlsdGVyX2xpc3QiIHBhcmFtZXRlci4gVXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbHRlcnMuICovCi10eXBlZGVmIHN0cnVjdCB3bF9wa3RfZmlsdGVyX2xpc3QgewotCXUzMiBudW07CQkvKiBOdW1iZXIgb2YgaW5zdGFsbGVkIHBhY2tldCBmaWx0ZXJzICovCi0Jd2xfcGt0X2ZpbHRlcl90IGZpbHRlclsxXTsJLyogVmFyaWFibGUgYXJyYXkgb2YgcGFja2V0IGZpbHRlcnMuICovCi19IHdsX3BrdF9maWx0ZXJfbGlzdF90OwotCi0jZGVmaW5lIFdMX1BLVF9GSUxURVJfTElTVF9GSVhFRF9MRU4JICBvZmZzZXRvZih3bF9wa3RfZmlsdGVyX2xpc3RfdCwgZmlsdGVyKQotCi0vKiBJT1ZBUiAicGt0X2ZpbHRlcl9zdGF0cyIgcGFyYW1ldGVyLiBVc2VkIHRvIHJldHJpZXZlIGRlYnVnIHN0YXRpc3RpY3MuICovCi10eXBlZGVmIHN0cnVjdCB3bF9wa3RfZmlsdGVyX3N0YXRzIHsKLQl1MzIgbnVtX3BrdHNfbWF0Y2hlZDsJLyogIyBmaWx0ZXIgbWF0Y2hlcyBmb3Igc3BlY2lmaWVkIGZpbHRlciBpZCAqLwotCXUzMiBudW1fcGt0c19mb3J3YXJkZWQ7CS8qICMgcGFja2V0cyBmd2RlZCBmcm9tIGRvbmdsZSB0byBob3N0IGZvciBhbGwgZmlsdGVycyAqLwotCXUzMiBudW1fcGt0c19kaXNjYXJkZWQ7CS8qICMgcGFja2V0cyBkaXNjYXJkZWQgYnkgZG9uZ2xlIGZvciBhbGwgZmlsdGVycyAqLwotfSB3bF9wa3RfZmlsdGVyX3N0YXRzX3Q7CiAKICNkZWZpbmUJV0xDX1JTU0lfSU5WQUxJRAkgMAkvKiBpbnZhbGlkIFJTU0kgdmFsdWUgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9jbW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfY21uLmMKaW5kZXggODI4NzI2MTEuLjNiZWQzN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfY21uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9jbW4uYwpAQCAtMjAsMTAgKzIwLDE1IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KICNpbmNsdWRlIDxiY21udnJhbS5oPgogI2luY2x1ZGUgPHNiY2hpcGMuaD4KKyNpbmNsdWRlIDxiY21kZXZzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgogCiAjaW5jbHVkZSA8d2xjX3BoeV9pbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5cmVnX24uaD4KQEAgLTE2Myw3ICsxNjgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAocyA9IHZhcnM7IHMgJiYgKnM7KSB7Ci0JCWlmICgoYmNtcChzLCBuYW1lLCBsZW4pID09IDApICYmIChzW2xlbl0gPT0gJz0nKSkKKwkJaWYgKChtZW1jbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCiAJCQlyZXR1cm4gJnNbbGVuICsgMV07CiAKIAkJd2hpbGUgKCpzKyspCkBAIC0yNzIsNyArMjc3LDcgQEAKIAogdm9pZCB3cml0ZV9yYWRpb19yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCiAJCXJldHVybjsKQEAgLTI5Niw3ICszMDEsNyBAQAogCQlXX1JFRyhvc2gsICZwaS0+cmVncy0+cGh5NHdkYXRhbG8sIHZhbCk7CiAJfQogCi0JaWYgKEJVU1RZUEUocGktPnNoLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHBpLT5zaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmICgrK3BpLT5waHlfd3JlZyA+PSBwaS0+cGh5X3dyZWdfbGltaXQpIHsKIAkJCSh2b2lkKVJfUkVHKG9zaCwgJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKIAkJCXBpLT5waHlfd3JlZyA9IDA7CkBAIC00MDUsNyArNDEwLDcgQEAKIAogdTE2IHJlYWRfcGh5X3JlZyhwaHlfaW5mb190ICpwaSwgdTE2IGFkZHIpCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAKIAlvc2ggPSBwaS0+c2gtPm9zaDsKQEAgLTQyNiw3ICs0MzEsNyBAQAogCiB2b2lkIHdyaXRlX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00NDEsNyArNDQ2LDcgQEAKICNlbHNlCiAJV19SRUcob3NoLCAodm9sYXRpbGUgdTMyICopKCZyZWdzLT5waHlyZWdhZGRyKSwKIAkgICAgICBhZGRyIHwgKHZhbCA8PCAxNikpOwotCWlmIChCVVNUWVBFKHBpLT5zaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChwaS0+c2gtPmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoKytwaS0+cGh5X3dyZWcgPj0gcGktPnBoeV93cmVnX2xpbWl0KSB7CiAJCQlwaS0+cGh5X3dyZWcgPSAwOwogCQkJKHZvaWQpUl9SRUcob3NoLCAmcmVncy0+cGh5dmVyc2lvbik7CkBAIC00NTIsNyArNDU3LDcgQEAKIAogdm9pZCBhbmRfcGh5X3JlZyhwaHlfaW5mb190ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAKIAlvc2ggPSBwaS0+c2gtPm9zaDsKQEAgLTQ3Myw3ICs0NzgsNyBAQAogCiB2b2lkIG9yX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00OTQsNyArNDk5LDcgQEAKIAogdm9pZCBtb2RfcGh5X3JlZyhwaHlfaW5mb190ICpwaSwgdTE2IGFkZHIsIHUxNiBtYXNrLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC01OTEsNyArNTk2LDcgQEAKIAogdm9pZCB3bGNfcGh5X3NoYXJlZF9kZXRhY2goc2hhcmVkX3BoeV90ICpwaHlfc2gpCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCWlmIChwaHlfc2gpIHsKIAkJb3NoID0gcGh5X3NoLT5vc2g7CkBAIC02MDksNyArNjE0LDcgQEAKIAl1MzIgc2ZsYWdzID0gMDsKIAl1aW50IHBoeXZlcnNpb247CiAJaW50IGk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCW9zaCA9IHNoLT5vc2g7CiAKQEAgLTEwODAsOCArMTA4NSw4IEBACiAJcGktPnRibF9kYXRhX2hpID0gdGJsRGF0YUhpOwogCXBpLT50YmxfZGF0YV9sbyA9IHRibERhdGFMbzsKIAotCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAotCSAgICAgQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKKwlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJICAgICBwaS0+c2gtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKIAkgICAgKHBpLT5zaC0+Y2hpcHJldiA9PSAxKSkgewogCQlwaS0+dGJsX2FkZHIgPSB0YmxBZGRyOwogCQlwaS0+dGJsX3NhdmVfaWQgPSB0YmxfaWQ7CkBAIC0xMDkzLDggKzEwOTgsOCBAQAogewogCUFTU0VSVCgod2lkdGggPT0gOCkgfHwgKHdpZHRoID09IDE2KSB8fCAod2lkdGggPT0gMzIpKTsKIAotCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAotCSAgICAgQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKKwlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJICAgICBwaS0+c2gtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKIAkgICAgKHBpLT5zaC0+Y2hpcHJldiA9PSAxKSAmJgogCSAgICAocGktPnRibF9zYXZlX2lkID09IE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCkpIHsKIAkJcmVhZF9waHlfcmVnKHBpLCBwaS0+dGJsX2RhdGFfbG8pOwpAQCAtMTEzMiw4ICsxMTM3LDggQEAKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgcHRibF9pbmZvLT50YmxfbGVuOyBpZHgrKykgewogCi0JCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAotCQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQgfHwKKwkJICAgICBwaS0+c2gtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKIAkJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkgJiYKIAkJICAgICh0YmxfaWQgPT0gTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVUKSkgewogCQkJcmVhZF9waHlfcmVnKHBpLCB0YmxEYXRhTG8pOwpAQCAtMTE3NSw4ICsxMTgwLDggQEAKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgcHRibF9pbmZvLT50YmxfbGVuOyBpZHgrKykgewogCi0JCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAotCQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQgfHwKKwkJICAgICBwaS0+c2gtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkgJiYKIAkJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkpIHsKIAkJCSh2b2lkKXJlYWRfcGh5X3JlZyhwaSwgdGJsRGF0YUxvKTsKIApAQCAtMTUzNCw3ICsxNTM5LDcgQEAKIAogCUFTU0VSVCgoYmFuZCA9PSBXTENfQkFORF8yRykgfHwgKGJhbmQgPT0gV0xDX0JBTkRfNUcpKTsKIAotCWJ6ZXJvKGNoYW5uZWxzLCBzaXplb2YoY2hhbnZlY190KSk7CisJbWVtc2V0KGNoYW5uZWxzLCAwLCBzaXplb2YoY2hhbnZlY190KSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFuX2luZm9fYWxsKTsgaSsrKSB7CiAJCWNoYW5uZWwgPSBjaGFuX2luZm9fYWxsW2ldLmNoYW47CkBAIC0xODk2LDcgKzE5MDEsNyBAQAogCQl0eF9wd3JfbWluID0gbWluKHR4X3B3cl9taW4sIHR4X3B3cl90YXJnZXRbcmF0ZV0pOwogCX0KIAotCWJ6ZXJvKHBpLT50eF9wb3dlcl9vZmZzZXQsIHNpemVvZihwaS0+dHhfcG93ZXJfb2Zmc2V0KSk7CisJbWVtc2V0KHBpLT50eF9wb3dlcl9vZmZzZXQsIDAsIHNpemVvZihwaS0+dHhfcG93ZXJfb2Zmc2V0KSk7CiAJcGktPnR4X3Bvd2VyX21heCA9IHR4X3B3cl9tYXg7CiAJcGktPnR4X3Bvd2VyX21pbiA9IHR4X3B3cl9taW47CiAJcGktPnR4X3Bvd2VyX21heF9yYXRlX2luZCA9IHR4X3B3cl9tYXhfcmF0ZV9pbmQ7CkBAIC0yNTA3LDcgKzI1MTIsNyBAQAogCXM4IGNtcGx4X3B3cl9kYm1bUEhZX0NPUkVfTUFYXTsKIAl1OCBpOwogCi0JYnplcm8oKHU4ICopIGNtcGx4X3B3cl9kYm0sIHNpemVvZihjbXBseF9wd3JfZGJtKSk7CisJbWVtc2V0KCh1OCAqKSBjbXBseF9wd3JfZGJtLCAwLCBzaXplb2YoY21wbHhfcHdyX2RibSkpOwogCUFTU0VSVChwaS0+cHVicGkucGh5X2NvcmVudW0gPD0gUEhZX0NPUkVfTUFYKTsKIAl3bGNfcGh5X2NvbXB1dGVfZEIoY21wbHhfcHdyLCBjbXBseF9wd3JfZGJtLCBwaS0+cHVicGkucGh5X2NvcmVudW0pOwogCkBAIC0yNjIxLDkgKzI2MjYsOSBAQAogCQkJdTggd2FpdF9jcnMgPSAwOwogCQkJdTggaTsKIAotCQkJYnplcm8oKHU4ICopIGVzdCwgc2l6ZW9mKGVzdCkpOwotCQkJYnplcm8oKHU4ICopIGNtcGx4X3B3ciwgc2l6ZW9mKGNtcGx4X3B3cikpOwotCQkJYnplcm8oKHU4ICopIG5vaXNlX2RibV9hbnQsIHNpemVvZihub2lzZV9kYm1fYW50KSk7CisJCQltZW1zZXQoKHU4ICopIGVzdCwgMCwgc2l6ZW9mKGVzdCkpOworCQkJbWVtc2V0KCh1OCAqKSBjbXBseF9wd3IsIDAsIHNpemVvZihjbXBseF9wd3IpKTsKKwkJCW1lbXNldCgodTggKikgbm9pc2VfZGJtX2FudCwgMCwgc2l6ZW9mKG5vaXNlX2RibV9hbnQpKTsKIAogCQkJbG9nX251bV9zYW1wcyA9IFBIWV9OT0lTRV9TQU1QTEVfTE9HX05VTV9OUEhZOwogCQkJbnVtX3NhbXBzID0gMSA8PCBsb2dfbnVtX3NhbXBzOwpAQCAtMjcwNCw4ICsyNzA5LDggQEAKIAl1OCBpZHgsIGNvcmU7CiAKIAlBU1NFUlQocGktPnB1YnBpLnBoeV9jb3JlbnVtIDw9IFBIWV9DT1JFX01BWCk7Ci0JYnplcm8oKHU4ICopIGNtcGx4X3B3ciwgc2l6ZW9mKGNtcGx4X3B3cikpOwotCWJ6ZXJvKCh1OCAqKSBub2lzZV9kYm1fYW50LCBzaXplb2Yobm9pc2VfZGJtX2FudCkpOworCW1lbXNldCgodTggKikgY21wbHhfcHdyLCAwLCBzaXplb2YoY21wbHhfcHdyKSk7CisJbWVtc2V0KCh1OCAqKSBub2lzZV9kYm1fYW50LCAwLCBzaXplb2Yobm9pc2VfZGJtX2FudCkpOwogCiAJZm9yIChpZHggPSAwLCBjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgaWR4ICs9IDIsIGNvcmUrKykgewogCQlsbyA9IHdsYXBpX2JtYWNfcmVhZF9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAoaWR4KSk7CkBAIC0zMzI1LDcgKzMzMzAsNyBAQAogCiB2b2lkIHdsY19sY25waHlfZXBhX3N3aXRjaChwaHlfaW5mb190ICpwaSwgYm9vbCBtb2RlKQogewotCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSAmJgorCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkgJiYKIAkgICAgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pKSB7CiAJCWlmIChtb2RlKSB7CiAJCQl1MTYgdHhhbnQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaGFsLmgKaW5kZXggNTIyNjBiMi4uNTE0ZTE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9oYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2hhbC5oCkBAIC0xMjIsMTEgKzEyMiw3IEBACiAKIHN0cnVjdCBwaHlfcHViOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3JwY19waHkgd2xjX3BoeV90OwotI2Vsc2UKIHR5cGVkZWYgc3RydWN0IHBoeV9wdWIgd2xjX3BoeV90OwotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHNoYXJlZF9waHlfcGFyYW1zIHsKIAl2b2lkICpvc2g7CkBAIC0xNTAsNyArMTQ2LDYgQEAKIAl1MzIgYm9hcmRmbGFnczI7CiB9IHNoYXJlZF9waHlfcGFyYW1zX3Q7CiAKLSNpZmRlZiBXTENfTE9XCiAKIGV4dGVybiBzaGFyZWRfcGh5X3QgKndsY19waHlfc2hhcmVkX2F0dGFjaChzaGFyZWRfcGh5X3BhcmFtc190ICpzaHApOwogZXh0ZXJuIHZvaWQgd2xjX3BoeV9zaGFyZWRfZGV0YWNoKHNoYXJlZF9waHlfdCAqcGh5X3NoKTsKQEAgLTE4OSw3ICsxODQsNiBAQAogZXh0ZXJuIHZvaWQgd2xjX3BoeV9zd2l0Y2hfcmFkaW8od2xjX3BoeV90ICpwcGksIGJvb2wgb24pOwogZXh0ZXJuIHZvaWQgd2xjX3BoeV9hbmFjb3JlKHdsY19waHlfdCAqcHBpLCBib29sIG9uKTsKIAotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogZXh0ZXJuIHZvaWQgd2xjX3BoeV9CU1Npbml0KHdsY19waHlfdCAqcHBpLCBib29sIGJvbmx5YXAsIGludCByc3NpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaW50LmgKaW5kZXggOTUxM2I4Ny4uNzJlZWU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9pbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2ludC5oCkBAIC01MjcsNyArNTI3LDcgQEAKIHN0cnVjdCBzaGFyZWRfcGh5IHsKIAlzdHJ1Y3QgcGh5X2luZm8gKnBoeV9oZWFkOwogCXVpbnQgdW5pdDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXNpX3QgKnNpaDsKIAl2b2lkICpwaHlzaGltOwogCXVpbnQgY29yZXJldjsKQEAgLTExNTgsNyArMTE1OCw3IEBACiAJIChwaS0+aXBhNWdfb24gJiYgQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkpCiAKICNkZWZpbmUgV0xDX1BIWV9XQVJfUFI1MTU3MShwaSkgXAotCWlmICgoQlVTVFlQRSgocGkpLT5zaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgJiYgTlJFVl9MVCgocGkpLT5wdWJwaS5waHlfcmV2LCAzKSkgXAorCWlmICgoKHBpKS0+c2gtPmJ1c3R5cGUgPT0gUENJX0JVUykgJiYgTlJFVl9MVCgocGkpLT5wdWJwaS5waHlfcmV2LCAzKSkgXAogCQkodm9pZClSX1JFRygocGkpLT5zaC0+b3NoLCAmKHBpKS0+cmVncy0+bWFjY29udHJvbCkKIAogZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYWxfcGVyaWNhbF9ucGh5X3J1bihwaHlfaW5mb190ICpwaSwgdTggY2FsdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2xjbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9sY24uYwppbmRleCAzZDMxMTJlLi4zYWMyYjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2xjbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbGNuLmMKQEAgLTE3LDEzICsxNywxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPHFtYXRoLmg+CiAjaW5jbHVkZSA8b3NsLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8aG5kcG11Lmg+CiAKKyNpbmNsdWRlIDxiY21kZXZzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgorCiAjaW5jbHVkZSA8d2xjX3BoeV9yYWRpby5oPgogI2luY2x1ZGUgPHdsY19waHlfaW50Lmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9sY24uaD4KQEAgLTEzMjcsNyArMTMzMiw3IEBACiAJdTMyIGRhdGFfYnVmWzY0XTsKIAlwaHl0YmxfaW5mb190IHRhYjsKIAotCWJ6ZXJvKGRhdGFfYnVmLCBzaXplb2YoZGF0YV9idWYpKTsKKwltZW1zZXQoZGF0YV9idWYsIDAsIHNpemVvZihkYXRhX2J1ZikpOwogCiAJdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfVFhQV1JDVEw7CiAJdGFiLnRibF93aWR0aCA9IDMyOwpAQCAtMTk1MSw3ICsxOTU2LDcgQEAKIAliYW5kX2lkeCA9IChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpID8gMSA6IDApOwogCiAJY2FsX2dhaW5zID0gKnRhcmdldF9nYWluczsKLQliemVybyhuY29ycl9vdmVycmlkZSwgc2l6ZW9mKG5jb3JyX292ZXJyaWRlKSk7CisJbWVtc2V0KG5jb3JyX292ZXJyaWRlLCAwLCBzaXplb2YobmNvcnJfb3ZlcnJpZGUpKTsKIAlmb3IgKGogPSAwOyBqIDwgaXFjYWxfZ2FpbnBhcmFtc19udW1nYWluc19sY25waHlbYmFuZF9pZHhdOyBqKyspIHsKIAkJaWYgKGhhc2ggPT0gdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5W2JhbmRfaWR4XVtqXVswXSkgewogCQkJY2FsX2dhaW5zLmdtX2dhaW4gPQpAQCAtMjUyOSw3ICsyNTM0LDcgQEAKIAl0YWIudGJsX3dpZHRoID0gMzI7CiAJdGFiLnRibF9vZmZzZXQgPSAwOwogCi0JYnplcm8odGVtcF9vZmZzZXQsIHNpemVvZih0ZW1wX29mZnNldCkpOworCW1lbXNldCh0ZW1wX29mZnNldCwgMCwgc2l6ZW9mKHRlbXBfb2Zmc2V0KSk7CiAJZm9yIChqID0gMTsgaiA8IDEyODsgaiArPSAyKQogCQl0ZW1wX29mZnNldFtqXSA9IDB4ODAwMDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9uLmMKaW5kZXggOTUwMDA4Zi4uYzZjY2U4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9uLmMKQEAgLTE4LDEzICsxOCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPHNpdXRpbHMuaD4KICNpbmNsdWRlIDxzYmNoaXBjLmg+CiAjaW5jbHVkZSA8aG5kcG11Lmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CiAKKyNpbmNsdWRlIDxiY21kZXZzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgorCiAjaW5jbHVkZSA8d2xjX3BoeV9yYWRpby5oPgogI2luY2x1ZGUgPHdsY19waHlfaW50Lmg+CiAjaW5jbHVkZSA8d2xjX3BoeXJlZ19uLmg+CkBAIC0xNDU1NCw3ICsxNDU1OSw3IEBACiAJCX0KIAl9CiAKLQlpZiAoKCFQSFlfSVBBKHBpKSkgJiYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTUzNTdfQ0hJUF9JRCkpIHsKKwlpZiAoKCFQSFlfSVBBKHBpKSkgJiYgKHBpLT5zaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpKSB7CiAJCXNpX3BtdV9jaGlwY29udHJvbChwaS0+c2gtPnNpaCwgMSwgQ0NUUkw1MzU3X0VYVFBBLAogCQkJCSAgIENDVFJMNTM1N19FWFRQQSk7CiAJfQpAQCAtMTc1OTksNyArMTc2MDQsNyBAQAogCiAJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19YVEFMUFVPVlJfUElOQ1RSTCwgMHgxLCAweDEpOwogCi0JaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09ICFCQ002MzYyX0NISVBfSUQpIHsKKwlpZiAocGktPnNoLT5jaGlwID09ICFCQ002MzYyX0NISVBfSUQpIHsKIAogCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1hUQUxQVU9WUl9QSU5DVFJMLCAweDIsIDB4Mik7CiAJfQpAQCAtMTgwMDcsOCArMTgwMTIsOCBAQAogCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjIgfAogCQkJCQlSQURJT18yMDU2X1NZTiwgMHgxZik7CiAKLQkJCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAotCQkJICAgIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2Ml9DSElQX0lEKSkgeworCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkJICAgIChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpIHsKIAogCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKIAkJCQkJCVJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSNCB8CkBAIC0xODA3MCw4ICsxODA3NSw4IEBACiAJCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCiAJCQkJCQkgUEFER19JREFDLCAweGNjKTsKIAotCQkJCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAotCQkJCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2X0NISVBfSUQpIHx8CisJCQkJICAgIChwaS0+c2gtPmNoaXAgPT0KIAkJCQkgICAgIEJDTTQ3MTYyX0NISVBfSUQpKSB7CiAJCQkJCWJpYXMgPSAweDQwOwogCQkJCQljYXNjYmlhcyA9IDB4NDU7CkBAIC0xODA4MywxMSArMTgwODgsMTEgQEAKIAkJCQkJYmlhcyA9IDB4MjU7CiAJCQkJCWNhc2NiaWFzID0gMHgyMDsKIAotCQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJCWlmICgocGktPnNoLT5jaGlwID09CiAJCQkJCSAgICAgQkNNNDMyMjRfQ0hJUF9JRCkKLQkJCQkJICAgIHx8IChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQkgICAgfHwgKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkJQkNNNDMyMjVfQ0hJUF9JRCkKLQkJCQkJICAgIHx8IChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQkgICAgfHwgKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkJQkNNNDM0MjFfQ0hJUF9JRCkpIHsKIAkJCQkJCWlmIChwaS0+c2gtPmNoaXBwa2cgPT0KIAkJCQkJCSAgICBCQ000MzIyNF9GQUJfU01JQykgewpAQCAtMTgxOTgsOSArMTgyMDMsOSBAQAogCiAJCQljYXNjYmlhcyA9IDB4MzA7CiAKLQkJCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKLQkJCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpIHsKKwkJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkJICAgIChwaS0+c2gtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpIHsKIAkJCQlpZiAocGktPnNoLT5jaGlwcGtnID09IEJDTTQzMjI0X0ZBQl9TTUlDKSB7CiAJCQkJCWNhc2NiaWFzID0gMHgzNTsKIAkJCQl9CkBAIC0xODkyNyw3ICsxODkzMiw3IEBACiAJCQljYXNlIDM4OgogCQkJY2FzZSAxMDI6CiAJCQljYXNlIDExODoKLQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgJiYKKwkJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2X0NISVBfSUQpICYmCiAJCQkJICAgIChwaS0+c2gtPmNoaXBwa2cgPT0gQkNNNDcxN19QS0dfSUQpKSB7CiAJCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzBdID0gMzI7CiAJCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMF0gPSAweDIxZjsKQEAgLTE5MDYyLDcgKzE5MDY3LDcgQEAKIAkJCQlpZiAocGktPm5waHlfYWJhbmRfc3B1cndhcl9lbiAmJgogCQkJCSAgICAoKHZhbCA9PSAzOCkgfHwgKHZhbCA9PSAxMDIpCiAJCQkJICAgICB8fCAodmFsID09IDExOCkpKSB7Ci0JCQkJCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0KIAkJCQkJICAgICBCQ000NzE2X0NISVBfSUQpCiAJCQkJCSAgICAmJiAocGktPnNoLT5jaGlwcGtnID09CiAJCQkJCQlCQ000NzE3X1BLR19JRCkpIHsKQEAgLTE5MDc3LDggKzE5MDgyLDggQEAKIAkJaWYgKHBpLT5waHlfc3B1cmF2b2lkID09IFNQVVJBVk9JRF9GT1JDRU9OKQogCQkJc3B1cmF2b2lkID0gMTsKIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2Ml9DSElQX0lEKSkgeworCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2X0NISVBfSUQpIHx8CisJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpKSB7CiAJCQlzaV9wbXVfc3B1cmF2b2lkKHBpLT5zaC0+c2loLCBwaS0+c2gtPm9zaCwgc3B1cmF2b2lkKTsKIAkJfSBlbHNlIHsKIAkJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgZmFsc2UpOwpAQCAtMTkwODYsOSArMTkwOTEsOSBAQAogCQkJd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9jdGwocGktPnNoLT5waHlzaGltLCB0cnVlKTsKIAkJfQogCi0JCWlmICgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpIHx8CisJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CiAKIAkJCWlmIChzcHVyYXZvaWQgPT0gMSkgewogCkBAIC0xOTEwNSw4ICsxOTExMCw4IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoISgoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAotCQkgICAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpKSB7CisJCWlmICghKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkgICAgICAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpKSkgewogCQkJd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9yZXNldChwaS0+c2gtPnBoeXNoaW0pOwogCQl9CiAKQEAgLTIxMDYyLDExICsyMTA2NywxMSBAQAogCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDB4MDMsIDE2LAogCQkJCQkgJmF1eEFEQ19yc3NpX2N0cmxIX3NhdmUpOwogCi0JCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ001MzU3X0NISVBfSUQpIHsKKwkJaWYgKHBpLT5zaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpIHsKIAkJCXJhZGlvX3RlbXBbMF0gPSAoMTkzICogKHJhZGlvX3RlbXBbMV0gKyByYWRpb190ZW1wMlsxXSkKIAkJCQkJICsgODggKiAoYXV4QURDX1ZsKSAtIDI3MTExICsKIAkJCQkJIDEyOCkgLyAyNTY7Ci0JCX0gZWxzZSBpZiAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgeworCQl9IGVsc2UgaWYgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIzNl9DSElQX0lEKSB7CiAJCQlyYWRpb190ZW1wWzBdID0gKDE5OCAqIChyYWRpb190ZW1wWzFdICsgcmFkaW9fdGVtcDJbMV0pCiAJCQkJCSArIDkxICogKGF1eEFEQ19WbCkgLSAyNzI0MyArCiAJCQkJCSAxMjgpIC8gMjU2OwpAQCAtMjYyNzcsNyArMjYyODIsNyBAQAogCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7CiAKIAkJCXR4X3B3cmN0cmxfdGJsID0gbnBoeV90cGNfdHhnYWluX2lwYV9yZXY2OwotCQkJaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpIHsKKwkJCWlmIChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNjJfQ0hJUF9JRCkgewogCiAJCQkJdHhfcHdyY3RybF90YmwgPSBucGh5X3RwY190eGdhaW5faXBhX3JldjU7CiAJCQl9CkBAIC0yNjgzMyw3ICsyNjgzOCw3IEBACiAJCXBoeV9hMiA9IDYzOwogCiAJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNjM2Ml9DSElQX0lEKSB7CisJCQlpZiAocGktPnNoLT5jaGlwID09IEJDTTYzNjJfQ0hJUF9JRCkgewogCQkJCXBoeV9hMSA9IDM1OwogCQkJCXBoeV9hMyA9IDM1OwogCQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDQpCkBAIC0yNjk0Niw3ICsyNjk1MSw3IEBACiAJCQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewogCQkJCQkJcGh5X2E1ID0gMHgwMGY3IHwgKHBoeV9hNCA8PCA4KTsKIAotCQkJCQkJaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJCQlpZiAocGktPnNoLT5jaGlwID09CiAJCQkJCQkgICAgQkNNNDcxNjJfQ0hJUF9JRCkgewogCQkJCQkJCXBoeV9hNSA9CiAJCQkJCQkJICAgIDB4MTBmNyB8IChwaHlfYTQgPDwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0YmxfbGNuLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX2xjbi5jCmluZGV4IDZjZTllNWQuLjMzMGI4ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0YmxfbGNuLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9sY24uYwpAQCAtMTUsNiArMTUsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHl0YmxfbGNuLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9uLmMKaW5kZXggN2NjMmM1Ni4uYTlmYzE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9uLmMKQEAgLTE2LDYgKzE2LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPHdsY19waHlfaW50Lmg+CiAjaW5jbHVkZSA8d2xjX3BoeXRibF9uLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZGJnLmgKaW5kZXggZTYzYjI3ZS4uNTRhZjI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZGJnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZGJnLmgKQEAgLTIwLDE1ICsyMCwyMCBAQAogLyogd2xfbXNnX2xldmVsIGlzIGEgYml0IHZlY3RvciB3aXRoIGRlZnMgaW4gd2xpb2N0bC5oICovCiBleHRlcm4gdTMyIHdsX21zZ19sZXZlbDsKIAotI2RlZmluZSBXTF9QUklOVChhcmdzKQkJcHJpbnRmIGFyZ3MKLSNkZWZpbmUgV0xfTk9ORShhcmdzKQorI2RlZmluZSBXTF9OT05FKGZtdCwgYXJncy4uLikgbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorCisjZGVmaW5lIFdMX1BSSU5UKGxldmVsLCBmbXQsIGFyZ3MuLi4pCQlcCitkbyB7CQkJCQkJXAorCWlmICh3bF9tc2dfbGV2ZWwgJiBsZXZlbCkJCVwKKwkJcHJpbnRrKGZtdCwgIyNhcmdzKTsJCVwKK30gd2hpbGUgKDApCiAKICNpZmRlZiBCQ01EQkcKIAotI2RlZmluZQlXTF9FUlJPUihhcmdzKQkJZG8ge2lmICgod2xfbXNnX2xldmVsICYgV0xfRVJST1JfVkFMKSkgV0xfUFJJTlQoYXJncyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lCVdMX1RSQUNFKGFyZ3MpCQlkbyB7aWYgKHdsX21zZ19sZXZlbCAmIFdMX1RSQUNFX1ZBTCkgV0xfUFJJTlQoYXJncyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVKGFyZ3MpCQlkbyB7aWYgKHdsX21zZ19sZXZlbCAmIFdMX0FNUERVX1ZBTCkgV0xfUFJJTlQoYXJncyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0ZGUExEKGFyZ3MpCQlkbyB7aWYgKHdsX21zZ19sZXZlbCAmIFdMX0ZGUExEX1ZBTCkgV0xfUFJJTlQoYXJncyk7IH0gd2hpbGUgKDApCisjZGVmaW5lCVdMX0VSUk9SKGZtdCwgYXJncy4uLikJV0xfUFJJTlQoV0xfRVJST1JfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUJV0xfVFJBQ0UoZm10LCBhcmdzLi4uKQlXTF9QUklOVChXTF9UUkFDRV9WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVShmbXQsIGFyZ3MuLi4pCVdMX1BSSU5UKFdMX0FNUERVX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0ZGUExEKGZtdCwgYXJncy4uLikJV0xfUFJJTlQoV0xfRkZQTERfVkFMLCBmbXQsICMjYXJncykKIAogI2RlZmluZSBXTF9FUlJPUl9PTigpCQkod2xfbXNnX2xldmVsICYgV0xfRVJST1JfVkFMKQogCkBAIC00NCwzNSArNDksNTAgQEAKIAogZXh0ZXJuIHUzMiB3bF9hbXBkdV9kYmc7CiAKLSNkZWZpbmUgV0xfQU1QRFVfVVBETihhcmdzKSBkbyB7aWYgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX1VQRE5fVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfUlgoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9SWF9WQUwpIHtXTF9BTVBEVShhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVV9FUlIoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9FUlJfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfVFgoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9UWF9WQUwpIHtXTF9BTVBEVShhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVV9DVEwoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9DVExfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfSFcoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9IV19WQUwpIHtXTF9BTVBEVShhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVV9IV1RYUyhhcmdzKSBkbyB7aWYgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXVFhTX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX0hXREJHKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfSFdEQkdfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKKyNkZWZpbmUgV0xfQU1QRFVfUFJJTlQobGV2ZWwsIGZtdCwgYXJncy4uLikJXAorZG8gewkJCQkJCVwKKwlpZiAod2xfYW1wZHVfZGJnICYgbGV2ZWwpIHsJCVwKKwkJV0xfQU1QRFUoZm10LCAjI2FyZ3MpOwkJXAorCX0JCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgV0xfQU1QRFVfVVBETihmbXQsIGFyZ3MuLi4pCQkJXAorCVdMX0FNUERVX1BSSU5UKFdMX0FNUERVX1VQRE5fVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfUlgoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9SWF9WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9FUlIoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9FUlJfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfVFgoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9UWF9WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9DVEwoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9DVExfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFcoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9IV19WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IV1RYUyhmbXQsIGFyZ3MuLi4pCQkJXAorCVdMX0FNUERVX1BSSU5UKFdMX0FNUERVX0hXVFhTX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXREJHKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfSFdEQkdfVkFMLCBmbXQsICMjYXJncykKICNkZWZpbmUgV0xfQU1QRFVfRVJSX09OKCkgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0VSUl9WQUwpCiAjZGVmaW5lIFdMX0FNUERVX0hXX09OKCkgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXX1ZBTCkKICNkZWZpbmUgV0xfQU1QRFVfSFdUWFNfT04oKSAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfSFdUWFNfVkFMKQogCiAjZWxzZQkJCQkvKiBCQ01EQkcgKi8KIAotI2RlZmluZQlXTF9FUlJPUihhcmdzKQotI2RlZmluZQlXTF9UUkFDRShhcmdzKQotI2RlZmluZSBXTF9BTVBEVShhcmdzKQotI2RlZmluZSBXTF9GRlBMRChhcmdzKQorI2RlZmluZQlXTF9FUlJPUihmbXQsIGFyZ3MuLi4pCQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lCVdMX1RSQUNFKGZtdCwgYXJncy4uLikJCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFUoZm10LCBhcmdzLi4uKQkJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9GRlBMRChmbXQsIGFyZ3MuLi4pCQlub19wcmludGsoZm10LCAjI2FyZ3MpCiAKICNkZWZpbmUgV0xfRVJST1JfT04oKQkJMAogCi0jZGVmaW5lIFdMX0FNUERVX1VQRE4oYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfUlgoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfRVJSKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX1RYKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX0NUTChhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9IVyhhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9IV1RYUyhhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9VUEROKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9SWChmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfRVJSKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9UWChmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfQ1RMKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IVyhmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXREJHKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogI2RlZmluZSBXTF9BTVBEVV9FUlJfT04oKSAgICAgICAwCiAjZGVmaW5lIFdMX0FNUERVX0hXX09OKCkgICAgICAgIDAKICNkZWZpbmUgV0xfQU1QRFVfSFdUWFNfT04oKSAgICAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9leHBvcnQuaAppbmRleCAwODQ0MmY4Li5hYThiNWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9leHBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9leHBvcnQuaApAQCAtNDUsMTAgKzQ1LDEwIEBACiAJCQkgaW50IHBlcmlvZGljKTsKIGV4dGVybiBib29sIHdsX2RlbF90aW1lcihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHN0cnVjdCB3bF90aW1lciAqdGltZXIpOwogCi1leHRlcm4gdWludCB3bF9idWZfdG9fcGt0Y29weShvc2xfdCAqb3NoLCB2b2lkICpwLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCi0JCQkgICAgICB1aW50IG9mZnNldCk7Ci1leHRlcm4gdm9pZCAqd2xfZ2V0X3BrdGJ1ZmZlcihvc2xfdCAqb3NoLCBpbnQgbGVuKTsKLWV4dGVybiBpbnQgd2xfc2V0X3BrdGxlbihvc2xfdCAqb3NoLCB2b2lkICpwLCBpbnQgbGVuKTsKK2V4dGVybiB1aW50IHdsX2J1Zl90b19wa3Rjb3B5KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpwLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICBpbnQgbGVuLCB1aW50IG9mZnNldCk7CitleHRlcm4gdm9pZCAqd2xfZ2V0X3BrdGJ1ZmZlcihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgaW50IGxlbik7CitleHRlcm4gaW50IHdsX3NldF9wa3RsZW4oc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnAsIGludCBsZW4pOwogCiAjZGVmaW5lIHdsX3NvcnRfYnNzbGlzdChhLCBiKSBmYWxzZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuYwppbmRleCBkMDYwMzc3Li5iZGQ2MjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmMKQEAgLTIxLDcyICsyMSwzNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2RlZmluZSBXTENfTUFYQlNTQ0ZHCQkxCS8qIHNpbmdsZSBCU1MgY29uZmlncyAqLwogCiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGVwaXZlcnMuaD4KLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogI2luY2x1ZGUgPHBoeV92ZXJzaW9uLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHBjaWNmZy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CiAjaW5jbHVkZSA8d2xjX3B1Yi5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KICNpbmNsdWRlIDx3bF9kYmcuaD4KLSNpZmRlZiBCQ01TRElPCi0jaW5jbHVkZSA8YmNtc2RoLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0jaW5jbHVkZSAiZGJ1cy5oIgotI2luY2x1ZGUgImJjbV9ycGNfdHAuaCIKLSNpbmNsdWRlICJiY21fcnBjLmgiCi0jaW5jbHVkZSAiYmNtX3hkci5oIgotI2luY2x1ZGUgIndsY19ycGMuaCIKLSNlbmRpZgogCiAjaW5jbHVkZSA8d2xfbWFjODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAjaW5jbHVkZSA8d2xfdWNvZGUuaD4KICNpbmNsdWRlIDxkMTF1Y29kZV9leHQuaD4KLSNlbmRpZgogCi0jaWZkZWYgQkNNU0RJTwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKnNkaW9tbWNfZGV2OwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLAotCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKLWJvb2wgd2xjX3NlbmRwa3RfbWFjODAyMTEod2xjX2luZm9fdCAqd2xjLCB2b2lkICpzZHUsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXZvaWQgd2xjX21hY19iY25fcHJvbWlzY19jaGFuZ2Uod2xjX2luZm9fdCAqd2xjLCBib29sIHByb21pc2MpOwotdm9pZCB3bGNfc2V0X2FkZHJtYXRjaCh3bGNfaW5mb190ICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAotCQkgICAgICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOwogCiBzdGF0aWMgdm9pZCB3bF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogc3RhdGljIHZvaWQgX3dsX3RpbWVyKHdsX3RpbWVyX3QgKnQpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotI2RlZmluZSBSUENRX0xPQ0soX3dsLCBfZmxhZ3MpIHNwaW5fbG9ja19pcnFzYXZlKCYoX3dsKS0+cnBjcV9sb2NrLCAoX2ZsYWdzKSkKLSNkZWZpbmUgUlBDUV9VTkxPQ0soX3dsLCBfZmxhZ3MpICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoX3dsKS0+cnBjcV9sb2NrLCAoX2ZsYWdzKSkKLSNkZWZpbmUgVFhRX0xPQ0soX3dsLCBfZmxhZ3MpIHNwaW5fbG9ja19pcnFzYXZlKCYoX3dsKS0+dHhxX2xvY2ssIChfZmxhZ3MpKQotI2RlZmluZSBUWFFfVU5MT0NLKF93bCwgX2ZsYWdzKSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKF93bCktPnR4cV9sb2NrLCAoX2ZsYWdzKSkKLXN0YXRpYyB2b2lkIHdsX3JwY19kb3duKHZvaWQgKndsaCk7Ci1zdGF0aWMgdm9pZCB3bF9ycGNxX2ZyZWUod2xfaW5mb190ICp3bCk7Ci1zdGF0aWMgdm9pZCB3bF9ycGNxX2Rpc3BhdGNoKHN0cnVjdCB3bF90YXNrICp0YXNrKTsKLXN0YXRpYyB2b2lkIHdsX3JwY19kaXNwYXRjaF9zY2hlZHVsZSh2b2lkICpjdHgsIHN0cnVjdCBycGNfYnVmICpidWYpOwotc3RhdGljIHZvaWQgd2xfc3RhcnRfdHhxd29yayhzdHJ1Y3Qgd2xfdGFzayAqdGFzayk7Ci1zdGF0aWMgdm9pZCB3bF90eHFfZnJlZSh3bF9pbmZvX3QgKndsKTsKLXN0YXRpYyB2b2lkIHdsX3RpbWVyX3Rhc2sod2xfdGFza190ICp0YXNrKTsKLXN0YXRpYyBpbnQgd2xfc2NoZWR1bGVfdGFzayh3bF9pbmZvX3QgKndsLCB2b2lkICgqZm4pIChzdHJ1Y3Qgd2xfdGFzayAqKSwKLQkJCSAgICB2b2lkICpjb250ZXh0KTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIHN0YXRpYyBpbnQgaWVlZV9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyBpbnQgaWVlZV9od19yYXRlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpAQCAtMTM0LDE2ICs5OCwxNCBAQAogCXU4IHJ4X2hkclsxNl0sIHR4X2hkclsxNl07CiB9OwogCi0jaWZuZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgV0xfREVWX0lGKGRldikJCSgod2xfaWZfdCAqKW5ldGRldl9wcml2KGRldikpCi0jZGVmaW5lCVdMX0lORk8oZGV2KQkJKCh3bF9pbmZvX3QgKikoV0xfREVWX0lGKGRldiktPndsKSkJLyogcG9pbnRzIHRvIHdsICovCi1zdGF0aWMgaW50IHdsX3JlcXVlc3RfZncod2xfaW5mb190ICp3bCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotc3RhdGljIHZvaWQgd2xfcmVsZWFzZV9mdyh3bF9pbmZvX3QgKndsKTsKLSNlbmRpZgorI2RlZmluZSBXTF9ERVZfSUYoZGV2KQkJKChzdHJ1Y3Qgd2xfaWYgKiluZXRkZXZfcHJpdihkZXYpKQorI2RlZmluZQlXTF9JTkZPKGRldikJCSgoc3RydWN0IHdsX2luZm8gKikoV0xfREVWX0lGKGRldiktPndsKSkKK3N0YXRpYyBpbnQgd2xfcmVxdWVzdF9mdyhzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyB2b2lkIHdsX3JlbGVhc2VfZncoc3RydWN0IHdsX2luZm8gKndsKTsKIAogLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGludCB3bF9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB3bF9pbmZvX3QgKndsKTsKLXN0YXRpYyBpbnQgd2xfc3RhcnRfaW50KHdsX2luZm9fdCAqd2wsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorc3RhdGljIGludCB3bF9zdGFydChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgd2xfaW5mbyAqd2wpOworc3RhdGljIGludCB3bF9zdGFydF9pbnQoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCXN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgd2xfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKQEAgLTE1Miw3ICsxMTQsNiBAQAogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkJyb2FkY29tIDgwMi4xMW4gV0xBTiBjYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogCi0jaWZuZGVmIEJDTVNESU8KIC8qIHJlY29nbml6ZWQgUENJIElEcyAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHdsX2lkX3RhYmxlW10gPSB7CiAJe1BDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCS8qIDQzMjI1IDJHICovCkBAIC0xNjMsNTUgKzEyNCwxOCBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgd2xfaWRfdGFibGUpOwogc3RhdGljIHZvaWQgd2xfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLSNlbmRpZgkJCQkvKiAhQkNNU0RJTyAqLwogCi0jaWZkZWYgQkNNU0RJTwotc3RhdGljIHVpbnQgc2RfZHJpdmVzdHJlbmd0aCA9IDY7Ci1tb2R1bGVfcGFyYW0oc2RfZHJpdmVzdHJlbmd0aCwgdWludCwgMCk7Ci0jZW5kaWYKIAogI2lmZGVmIEJDTURCRwogc3RhdGljIGludCBtc2dsZXZlbCA9IDB4ZGVhZGJlZWY7CiBtb2R1bGVfcGFyYW0obXNnbGV2ZWwsIGludCwgMCk7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIHN0YXRpYyBpbnQgcGh5bXNnbGV2ZWwgPSAweGRlYWRiZWVmOwogbW9kdWxlX3BhcmFtKHBoeW1zZ2xldmVsLCBpbnQsIDApOwotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAotc3RhdGljIGludCBvbmVvbmx5OwotbW9kdWxlX3BhcmFtKG9uZW9ubHksIGludCwgMCk7Ci0KLXN0YXRpYyBpbnQgcGlvbW9kZTsKLW1vZHVsZV9wYXJhbShwaW9tb2RlLCBpbnQsIDApOwotCi1zdGF0aWMgaW50IGluc3RhbmNlX2Jhc2U7CS8qIFN0YXJ0aW5nIGluc3RhbmNlIG51bWJlciAqLwotbW9kdWxlX3BhcmFtKGluc3RhbmNlX2Jhc2UsIGludCwgMCk7Ci0KLSNpZiBkZWZpbmVkKEJDTURCRykKLXN0YXRpYyBjaGFyICptYWNhZGRyOwotbW9kdWxlX3BhcmFtKG1hY2FkZHIsIGNoYXJwLCBTX0lSVUdPKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IG5vbXBjID0gMTsKLW1vZHVsZV9wYXJhbShub21wYywgaW50LCAwKTsKLQotc3RhdGljIGNoYXIgbmFtZVtJRk5BTVNJWl0gPSAiZXRoJWQiOwotbW9kdWxlX3BhcmFtX3N0cmluZyhuYW1lLCBuYW1lLCBJRk5BTVNJWiwgMCk7Ci0KLSNpZm5kZWYJU1JDQkFTRQotI2RlZmluZQlTUkNCQVNFICIuIgotI2VuZGlmCi0KLSNkZWZpbmUgV0xfTUFHSUMgCTB4ZGVhZGJlZWYKLQogI2RlZmluZSBIV19UT19XTChodykJIChody0+cHJpdikKICNkZWZpbmUgV0xfVE9fSFcod2wpCSAgKHdsLT5wdWItPmllZWVfaHcpCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotc3RhdGljIGludCB3bF9vcHNfdHhfbmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwotI2Vsc2UKIHN0YXRpYyBpbnQgd2xfb3BzX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSNlbmRpZgogc3RhdGljIGludCB3bF9vcHNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogc3RhdGljIHZvaWQgd2xfb3BzX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogc3RhdGljIGludCB3bF9vcHNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTI0OSwyOCArMTczLDEzIEBACiAJCQkgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCiAJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbik7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi1zdGF0aWMgaW50IHdsX29wc190eF9ubChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpbnQgc3RhdHVzOwotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKLQlpZiAoIXdsLT5wdWItPnVwKSB7Ci0JCVdMX0VSUk9SKCgib3BzLT50eCBjYWxsZWQgd2hpbGUgZG93blxuIikpOwotCQlzdGF0dXMgPSAtRU5FVERPV047Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc3RhdHVzID0gd2xfc3RhcnQoc2tiLCB3bCk7Ci0gZG9uZToKLQlyZXR1cm4gc3RhdHVzOwotfQotI2Vsc2UKIHN0YXRpYyBpbnQgd2xfb3BzX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBzdGF0dXM7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCVdMX0xPQ0sod2wpOwogCWlmICghd2wtPnB1Yi0+dXApIHsKLQkJV0xfRVJST1IoKCJvcHMtPnR4IGNhbGxlZCB3aGlsZSBkb3duXG4iKSk7CisJCVdMX0VSUk9SKCJvcHMtPnR4IGNhbGxlZCB3aGlsZSBkb3duXG4iKTsKIAkJc3RhdHVzID0gLUVORVRET1dOOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMjc5LDEzICsxODgsMTQgQEAKIAlXTF9VTkxPQ0sod2wpOwogCXJldHVybiBzdGF0dXM7CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiBzdGF0aWMgaW50IHdsX29wc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7Ci0JLyogc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjdXJjaGFuID0gaHctPmNvbmYuY2hhbm5lbDsgKi8KLQlXTF9OT05FKCgiJXMgOiBJbml0aWFsIGNoYW5uZWw6ICVkXG4iLCBfX2Z1bmNfXywgY3VyY2hhbi0+aHdfdmFsdWUpKTsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKKwkvKgorCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjdXJjaGFuID0gaHctPmNvbmYuY2hhbm5lbDsKKwkgIFdMX05PTkUoIiVzIDogSW5pdGlhbCBjaGFubmVsOiAlZFxuIiwgX19mdW5jX18sIGN1cmNoYW4tPmh3X3ZhbHVlKTsKKwkqLwogCiAJV0xfTE9DSyh3bCk7CiAJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKQEAgLTI5Niw3ICsyMDYsNyBAQAogCiBzdGF0aWMgdm9pZCB3bF9vcHNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CiAJQVNTRVJUKHdsKTsKIAlXTF9MT0NLKHdsKTsKIAl3bF9kb3duKHdsKTsKQEAgLTMwOSw3ICsyMTksNyBAQAogc3RhdGljIGludAogd2xfb3BzX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0Jd2xfaW5mb190ICp3bDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CiAJaW50IGVycjsKIAogCS8qIEp1c3QgU1RBIGZvciBub3cgKi8KQEAgLTMxOCw4ICsyMjgsOCBAQAogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfV0RTICYmCiAJICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewotCQlXTF9FUlJPUigoIiVzOiBBdHRlbXB0IHRvIGFkZCB0eXBlICVkLCBvbmx5IFNUQSBmb3Igbm93XG4iLAotCQkJICBfX2Z1bmNfXywgdmlmLT50eXBlKSk7CisJCVdMX0VSUk9SKCIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSBTVEEgZm9yIG5vd1xuIiwKKwkJCSBfX2Z1bmNfXywgdmlmLT50eXBlKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtMzI5LDcgKzIzOSw3IEBACiAJV0xfVU5MT0NLKHdsKTsKIAogCWlmIChlcnIgIT0gMCkKLQkJV0xfRVJST1IoKCIlczogd2xfdXAoKSByZXR1cm5lZCAlZFxuIiwgX19mdW5jX18sIGVycikpOworCQlXTF9FUlJPUigiJXM6IHdsX3VwKCkgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTM0Myw3ICsyNTMsNyBAQAogaWVlZV9zZXRfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAogCQkgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSB0eXBlKQogewotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCBlcnIgPSAwOwogCiAJc3dpdGNoICh0eXBlKSB7CkBAIC0zNTUsOCArMjY1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgogCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBQTFVTOgotCQlXTF9FUlJPUigoIiVzOiBOZWVkIHRvIGltcGxlbWVudCA0MCBNaHogQ2hhbm5lbHMhXG4iLAotCQkJICBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IE5lZWQgdG8gaW1wbGVtZW50IDQwIE1oeiBDaGFubmVscyFcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0zNjgsMTcgKzI3NywxNyBAQAogc3RhdGljIGludCB3bF9vcHNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0Jd2xfaW5mb190ICp3bCA9IEhXX1RPX1dMKGh3KTsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBIV19UT19XTChodyk7CiAJaW50IGVyciA9IDA7CiAJaW50IG5ld19pbnQ7CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9MSVNURU5fSU5URVJWQUwpIHsKLQkJV0xfTk9ORSgoIiVzOiBTZXR0aW5nIGxpc3RlbiBpbnRlcnZhbCB0byAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgY29uZi0+bGlzdGVuX2ludGVydmFsKSk7CisJCVdMX05PTkUoIiVzOiBTZXR0aW5nIGxpc3RlbiBpbnRlcnZhbCB0byAlZFxuIiwKKwkJCV9fZnVuY19fLCBjb25mLT5saXN0ZW5faW50ZXJ2YWwpOwogCQlpZiAod2xjX2lvdmFyX3NldGludAogCQkgICAgKHdsLT53bGMsICJiY25fbGlfYmNuIiwgY29uZi0+bGlzdGVuX2ludGVydmFsKSkgewotCQkJV0xfRVJST1IoKCIlczogRXJyb3Igc2V0dGluZyBsaXN0ZW5faW50ZXJ2YWxcbiIsCi0JCQkJICBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBFcnJvciBzZXR0aW5nIGxpc3Rlbl9pbnRlcnZhbFxuIiwKKwkJCQkgX19mdW5jX18pOwogCQkJZXJyID0gLUVJTzsKIAkJCWdvdG8gY29uZmlnX291dDsKIAkJfQpAQCAtMzg2LDQxICsyOTUsNDIgQEAKIAkJQVNTRVJUKG5ld19pbnQgPT0gY29uZi0+bGlzdGVuX2ludGVydmFsKTsKIAl9CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfTU9OSVRPUikKLQkJV0xfTk9ORSgoIk5lZWQgdG8gc2V0IG1vbml0b3IgbW9kZVxuIikpOworCQlXTF9OT05FKCJOZWVkIHRvIHNldCBtb25pdG9yIG1vZGVcbiIpOwogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BTKQotCQlXTF9OT05FKCgiTmVlZCB0byBzZXQgUG93ZXItc2F2ZSBtb2RlXG4iKSk7CisJCVdMX05PTkUoIk5lZWQgdG8gc2V0IFBvd2VyLXNhdmUgbW9kZVxuIik7CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikgewotCQlXTF9OT05FKCgiJXM6IFNldHRpbmcgdHggcG93ZXIgdG8gJWQgZGJtXG4iLCBfX2Z1bmNfXywKLQkJCSBjb25mLT5wb3dlcl9sZXZlbCkpOworCQlXTF9OT05FKCIlczogU2V0dGluZyB0eCBwb3dlciB0byAlZCBkYm1cbiIsCisJCQlfX2Z1bmNfXywgY29uZi0+cG93ZXJfbGV2ZWwpOwogCQlpZiAod2xjX2lvdmFyX3NldGludAogCQkgICAgKHdsLT53bGMsICJxdHhwb3dlciIsIGNvbmYtPnBvd2VyX2xldmVsICogNCkpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEVycm9yIHNldHRpbmcgcG93ZXJfbGV2ZWxcbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgcG93ZXJfbGV2ZWxcbiIsIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGNvbmZpZ19vdXQ7CiAJCX0KIAkJd2xjX2lvdmFyX2dldGludCh3bC0+d2xjLCAicXR4cG93ZXIiLCAmbmV3X2ludCk7CiAJCWlmIChuZXdfaW50ICE9IChjb25mLT5wb3dlcl9sZXZlbCAqIDQpKQotCQkJV0xfRVJST1IoKCIlczogUG93ZXIgbGV2ZWwgcmVxICE9IGFjdHVhbCwgJWQgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgY29uZi0+cG93ZXJfbGV2ZWwgKiA0LCBuZXdfaW50KSk7CisJCQlXTF9FUlJPUigiJXM6IFBvd2VyIGxldmVsIHJlcSAhPSBhY3R1YWwsICVkICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgY29uZi0+cG93ZXJfbGV2ZWwgKiA0LCBuZXdfaW50KTsKIAl9CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgewogCQllcnIgPSBpZWVlX3NldF9jaGFubmVsKGh3LCBjb25mLT5jaGFubmVsLCBjb25mLT5jaGFubmVsX3R5cGUpOwogCX0KIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9SRVRSWV9MSU1JVFMpIHsKLQkJV0xfTk9ORSgoIiVzOiBzcmwgJWQsIGxybCAlZFxuIiwgX19mdW5jX18sCi0JCQkgY29uZi0+c2hvcnRfZnJhbWVfbWF4X3R4X2NvdW50LAotCQkJIGNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KSk7CisJCVdMX05PTkUoIiVzOiBzcmwgJWQsIGxybCAlZFxuIiwKKwkJCV9fZnVuY19fLAorCQkJY29uZi0+c2hvcnRfZnJhbWVfbWF4X3R4X2NvdW50LAorCQkJY29uZi0+bG9uZ19mcmFtZV9tYXhfdHhfY291bnQpOwogCQlpZiAod2xjX3NldAogCQkgICAgKHdsLT53bGMsIFdMQ19TRVRfU1JMLAogCQkgICAgIGNvbmYtPnNob3J0X2ZyYW1lX21heF90eF9jb3VudCkgPCAwKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBFcnJvciBzZXR0aW5nIHNybFxuIiwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogRXJyb3Igc2V0dGluZyBzcmxcbiIsIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGNvbmZpZ19vdXQ7CiAJCX0KIAkJaWYgKHdsY19zZXQod2wtPndsYywgV0xDX1NFVF9MUkwsIGNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KQogCQkgICAgPCAwKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBFcnJvciBzZXR0aW5nIGxybFxuIiwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogRXJyb3Igc2V0dGluZyBscmxcbiIsIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGNvbmZpZ19vdXQ7CiAJCX0KQEAgLTQzNSwzMiArMzQ1LDI5IEBACiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqaW5mbywgdTMyIGNoYW5nZWQpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IEhXX1RPX1dMKGh3KTsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBIV19UT19XTChodyk7CiAJaW50IHZhbDsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlXTF9MT0NLKHdsKTsKLSNlbmRpZgogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgewotCQlXTF9FUlJPUigoIkFzc29jaWF0ZWQ6XHQlc1xuIiwgaW5mby0+YXNzb2MgPyAiVHJ1ZSIgOiAiRmFsc2UiKSk7CisJCVdMX0VSUk9SKCJBc3NvY2lhdGVkOlx0JXNcbiIsIGluZm8tPmFzc29jID8gIlRydWUiIDogIkZhbHNlIik7CiAJCS8qIGFzc29jaWF0aW9uIHN0YXR1cyBjaGFuZ2VkIChhc3NvY2lhdGVkL2Rpc2Fzc29jaWF0ZWQpCiAJCSAqIGFsc28gaW1wbGllcyBhIGNoYW5nZSBpbiB0aGUgQUlELgogCQkgKi8KIAl9CiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfQ1RTX1BST1QpIHsKLQkJV0xfTk9ORSgoIlVzZV9jdHNfcHJvdDpcdCVzIEltcGxlbWVudCBtZVxuIiwKLQkJCSBpbmZvLT51c2VfY3RzX3Byb3QgPyAiVHJ1ZSIgOiAiRmFsc2UiKSk7CisJCVdMX05PTkUoIlVzZV9jdHNfcHJvdDpcdCVzIEltcGxlbWVudCBtZVxuIiwKKwkJCWluZm8tPnVzZV9jdHNfcHJvdCA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBDVFMgcHJvdGVjdGlvbiBjaGFuZ2VkICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1BSRUFNQkxFKSB7Ci0JCVdMX05PTkUoKCJTaG9ydCBwcmVhbWJsZTpcdCVzIEltcGxlbWVudCBtZVxuIiwKLQkJCSBpbmZvLT51c2Vfc2hvcnRfcHJlYW1ibGUgPyAiVHJ1ZSIgOiAiRmFsc2UiKSk7CisJCVdMX05PTkUoIlNob3J0IHByZWFtYmxlOlx0JXMgSW1wbGVtZW50IG1lXG4iLAorCQkJaW5mby0+dXNlX3Nob3J0X3ByZWFtYmxlID8gIlRydWUiIDogIkZhbHNlIik7CiAJCS8qIHByZWFtYmxlIGNoYW5nZWQgKi8KIAl9CiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfU0xPVCkgewotCQlXTF9OT05FKCgiQ2hhbmdpbmcgc2hvcnQgc2xvdDpcdCVzXG4iLAotCQkJIGluZm8tPnVzZV9zaG9ydF9zbG90ID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9OT05FKCJDaGFuZ2luZyBzaG9ydCBzbG90Olx0JXNcbiIsCisJCQlpbmZvLT51c2Vfc2hvcnRfc2xvdCA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQlpZiAoaW5mby0+dXNlX3Nob3J0X3Nsb3QpCiAJCQl2YWwgPSAxOwogCQllbHNlCkBAIC00NzAsMzkgKzM3NywzNiBAQAogCX0KIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpIHsKLQkJV0xfTk9ORSgoIiVzOiBIVCBtb2RlIC0gSW1wbGVtZW50IG1lXG4iLCBfX2Z1bmNfXykpOworCQlXTF9OT05FKCIlczogSFQgbW9kZSAtIEltcGxlbWVudCBtZVxuIiwgX19mdW5jX18pOwogCQkvKiA4MDIuMTFuIHBhcmFtZXRlcnMgY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSB7Ci0JCVdMX05PTkUoKCJOZWVkIHRvIGNoYW5nZSBCYXNpYyBSYXRlczpcdDB4JXghIEltcGxlbWVudCBtZVxuIiwKLQkJCSAodTMyKSBpbmZvLT5iYXNpY19yYXRlcykpOworCQlXTF9OT05FKCJOZWVkIHRvIGNoYW5nZSBCYXNpYyBSYXRlczpcdDB4JXghIEltcGxlbWVudCBtZVxuIiwKKwkJCSh1MzIpIGluZm8tPmJhc2ljX3JhdGVzKTsKIAkJLyogQmFzaWMgcmF0ZXNldCBjaGFuZ2VkICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OX0lOVCkgewotCQlXTF9OT05FKCgiQmVhY29uIEludGVydmFsOlx0JWQgSW1wbGVtZW50IG1lXG4iLAotCQkJIGluZm8tPmJlYWNvbl9pbnQpKTsKKwkJV0xfTk9ORSgiQmVhY29uIEludGVydmFsOlx0JWQgSW1wbGVtZW50IG1lXG4iLAorCQkJaW5mby0+YmVhY29uX2ludCk7CiAJCS8qIEJlYWNvbiBpbnRlcnZhbCBjaGFuZ2VkICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKLQkJV0xfTk9ORSgoIm5ldyBCU1NJRDpcdGFpZCAlZCAgYnNzOiVwTVxuIiwgaW5mby0+YWlkLAotCQkJaW5mby0+YnNzaWQpKTsKKwkJV0xfTk9ORSgibmV3IEJTU0lEOlx0YWlkICVkICBic3M6JXBNXG4iLAorCQkJaW5mby0+YWlkLCBpbmZvLT5ic3NpZCk7CiAJCS8qIEJTU0lEIGNoYW5nZWQsIGZvciB3aGF0ZXZlciByZWFzb24gKElCU1MgYW5kIG1hbmFnZWQgbW9kZSkgKi8KIAkJLyogRklYTUU6IG5lZWQgdG8gc3RvcmUgYnNzaWQgaW4gYnNzY2ZnICovCiAJCXdsY19zZXRfYWRkcm1hdGNoKHdsLT53bGMsIFJDTV9CU1NJRF9PRkZTRVQsCiAJCQkJICAoc3RydWN0IGV0aGVyX2FkZHIgKilpbmZvLT5ic3NpZCk7CiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OKSB7Ci0JCVdMX0VSUk9SKCgiQlNTX0NIQU5HRURfQkVBQ09OXG4iKSk7CisJCVdMX0VSUk9SKCJCU1NfQ0hBTkdFRF9CRUFDT05cbiIpOwogCQkvKiBCZWFjb24gZGF0YSBjaGFuZ2VkLCByZXRyaWV2ZSBuZXcgYmVhY29uIChiZWFjb25pbmcgbW9kZXMpICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKLQkJV0xfRVJST1IoKCJCZWFjb24gZW5hYmxlZDpcdCVzXG4iLAotCQkJICBpbmZvLT5lbmFibGVfYmVhY29uID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9FUlJPUigiQmVhY29uIGVuYWJsZWQ6XHQlc1xuIiwKKwkJCSBpbmZvLT5lbmFibGVfYmVhY29uID8gIlRydWUiIDogIkZhbHNlIik7CiAJCS8qIEJlYWNvbmluZyBzaG91bGQgYmUgZW5hYmxlZC9kaXNhYmxlZCAoYmVhY29uaW5nIG1vZGVzKSAqLwogCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JV0xfVU5MT0NLKHdsKTsKLSNlbmRpZgogCXJldHVybjsKIH0KIApAQCAtNTExLDI3ICs0MTUsMjQgQEAKIAkJCXVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAogCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCkKIHsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKLSNlbmRpZgorCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCiAJY2hhbmdlZF9mbGFncyAmPSBNQUNfRklMVEVSUzsKIAkqdG90YWxfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUFJPTUlTQ19JTl9CU1MpCi0JCVdMX0VSUk9SKCgiRklGX1BST01JU0NfSU5fQlNTXG4iKSk7CisJCVdMX0VSUk9SKCJGSUZfUFJPTUlTQ19JTl9CU1NcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0FMTE1VTFRJKQotCQlXTF9FUlJPUigoIkZJRl9BTExNVUxUSVxuIikpOworCQlXTF9FUlJPUigiRklGX0FMTE1VTFRJXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9GQ1NGQUlMKQotCQlXTF9FUlJPUigoIkZJRl9GQ1NGQUlMXG4iKSk7CisJCVdMX0VSUk9SKCJGSUZfRkNTRkFJTFxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUExDUEZBSUwpCi0JCVdMX0VSUk9SKCgiRklGX1BMQ1BGQUlMXG4iKSk7CisJCVdMX0VSUk9SKCJGSUZfUExDUEZBSUxcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0NPTlRST0wpCi0JCVdMX0VSUk9SKCgiRklGX0NPTlRST0xcbiIpKTsKKwkJV0xfRVJST1IoIkZJRl9DT05UUk9MXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9PVEhFUl9CU1MpCi0JCVdMX0VSUk9SKCgiRklGX09USEVSX0JTU1xuIikpOworCQlXTF9FUlJPUigiRklGX09USEVSX0JTU1xuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykgewotCQlXTF9OT05FKCgiRklGX0JDTl9QUkJSRVNQX1BST01JU0NcbiIpKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQorCQlXTF9OT05FKCJGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQ1xuIik7CiAJCVdMX0xPQ0sod2wpOwogCQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKIAkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlIHw9IE1BQzgwMjExX1BST01JU0NfQkNOUzsKQEAgLTU0MSw3ICs0NDIsNiBAQAogCQkJd2wtPnB1Yi0+bWFjODAyMTFfc3RhdGUgJj0gfk1BQzgwMjExX1BST01JU0NfQkNOUzsKIAkJfQogCQlXTF9VTkxPQ0sod2wpOwotI2VuZGlmCiAJfQogCXJldHVybjsKIH0KQEAgLTU0OSwyNSArNDQ5LDI1IEBACiBzdGF0aWMgaW50CiB3bF9vcHNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgYm9vbCBzZXQpCiB7Ci0JV0xfRVJST1IoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCB3bF9vcHNfc3dfc2Nhbl9zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKLQlXTF9OT05FKCgiU2NhbiBTdGFydFxuIikpOworCVdMX05PTkUoIlNjYW4gU3RhcnRcbiIpOwogCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgd2xfb3BzX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0JV0xfTk9ORSgoIlNjYW4gQ29tcGxldGVcbiIpKTsKKwlXTF9OT05FKCJTY2FuIENvbXBsZXRlXG4iKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHdsX29wc19zZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1NjQgdHNmKQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKQEAgLTU3NSwxMyArNDc1LDEzIEBACiB3bF9vcHNfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB3bF9vcHNfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkKIHsKLQlXTF9FUlJPUigoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4OSwxMCArNDg5LDEwIEBACiB3bF9vcHNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKLQlXTF9OT05FKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX05PTkUoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXN3aXRjaCAoY21kKSB7CiAJZGVmYXVsdDoKLQkJV0xfRVJST1IoKCIlczogVWtub3duIGNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgY21kKSk7CisJCVdMX0VSUk9SKCIlczogVW5rbm93biBjbWQgPSAlZFxuIiwgX19mdW5jX18sIGNtZCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm47CkBAIC02MDIsMTEgKzUwMiwxMSBAQAogd2xfb3BzX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUxNiBxdWV1ZSwKIAkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKIHsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CiAKLQlXTF9OT05FKCgiJXM6IEVudGVyIChXTUUgY29uZmlnKVxuIiwgX19mdW5jX18pKTsKLQlXTF9OT05FKCgicXVldWUgJWQsIHR4b3AgJWQsIGN3bWluICVkLCBjd21heCAlZCwgYWlmcyAlZFxuIiwgcXVldWUsCi0JCSBwYXJhbXMtPnR4b3AsIHBhcmFtcy0+Y3dfbWluLCBwYXJhbXMtPmN3X21heCwgcGFyYW1zLT5haWZzKSk7CisJV0xfTk9ORSgiJXM6IEVudGVyIChXTUUgY29uZmlnKVxuIiwgX19mdW5jX18pOworCVdMX05PTkUoInF1ZXVlICVkLCB0eG9wICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIGFpZnMgJWRcbiIsIHF1ZXVlLAorCQkgcGFyYW1zLT50eG9wLCBwYXJhbXMtPmN3X21pbiwgcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+YWlmcyk7CiAKIAlXTF9MT0NLKHdsKTsKIAl3bGNfd21lX3NldHBhcmFtcyh3bC0+d2xjLCBxdWV1ZSwgKHZvaWQgKilwYXJhbXMsIHRydWUpOwpAQCAtNjE3LDcgKzUxNyw3IEBACiAKIHN0YXRpYyB1NjQgd2xfb3BzX2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0JV0xfRVJST1IoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC02MjgsMTEgKzUyOCwxMSBAQAogCXN0cnVjdCBzY2IgKnNjYjsKIAogCWludCBpOwotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAogCS8qIEluaXQgdGhlIHNjYiAqLwogCXNjYiA9IChzdHJ1Y3Qgc2NiICopc3RhLT5kcnZfcHJpdjsKLQliemVybyhzY2IsIHNpemVvZihzdHJ1Y3Qgc2NiKSk7CisJbWVtc2V0KHNjYiwgMCwgc2l6ZW9mKHN0cnVjdCBzY2IpKTsKIAlmb3IgKGkgPSAwOyBpIDwgTlVNUFJJTzsgaSsrKQogCQlzY2ItPnNlcWN0bFtpXSA9IDB4RkZGRjsKIAlzY2ItPnNlcWN0bF9ub25xb3MgPSAweEZGRkY7CkBAIC02NDEsMjAgKzU0MSwxMiBAQAogCXdsLT5wdWItPmdsb2JhbF9zY2IgPSBzY2I7CiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1ID0gJihzY2ItPnNjYl9hbXBkdSk7CiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1LT5zY2IgPSBzY2I7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXdsLT5wdWItPmdsb2JhbF9hbXBkdS0+bWF4X3BkdSA9IEFNUERVX05VTV9NUERVOwotI2Vsc2UKIAl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSAxNjsKLSNlbmRpZgogCXBrdHFfaW5pdCgmc2NiLT5zY2JfYW1wZHUudHhxLCBBTVBEVV9NQVhfU0NCX1RJRCwKIAkJICBBTVBEVV9NQVhfU0NCX1RJRCAqIFBLVFFfTEVOX0RFRkFVTFQpOwogCiAJc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkID0gdHJ1ZTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzE2SzsKLSNlbHNlCiAJc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzY0SzsKLSNlbmRpZgogCXN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZOwogCXN0YS0+aHRfY2FwLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCB8CiAJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKQEAgLTY2OCw3ICs1NjAsNyBAQAogd2xfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewotCVdMX05PTkUoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfTk9ORSgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4MSwxOSArNTczLDE5IEBACiAjaWYgZGVmaW5lZChCQ01EQkcpCiAJc3RydWN0IHNjYiAqc2NiID0gKHN0cnVjdCBzY2IgKilzdGEtPmRydl9wcml2OwogI2VuZGlmCi0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCiAJQVNTRVJUKHNjYi0+bWFnaWMgPT0gU0NCX01BR0lDKTsKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgotCQlXTF9OT05FKCgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVFxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVFxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QOgotCQlXTF9OT05FKCgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXykpOworCQlXTF9OT05FKCIlczogYWN0aW9uID0gSUVFRTgwMjExX0FNUERVX1JYX1NUT1BcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CiAJCWlmICghd2xjX2FnZ3JlZ2F0YWJsZSh3bC0+d2xjLCB0aWQpKSB7Ci0JCQkvKiBXTF9FUlJPUigoIlNUQVJUOiB0aWQgJWQgaXMgbm90IGFnZycgYWJsZSwgcmV0dXJuIEZBSUxVUkUgdG8gc3RhY2tcbiIsIHRpZCkpOyAqLworCQkJLyogV0xfRVJST1IoIlNUQVJUOiB0aWQgJWQgaXMgbm90IGFnZycgYWJsZSwgcmV0dXJuIEZBSUxVUkUgdG8gc3RhY2tcbiIsIHRpZCk7ICovCiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJLyogWFhYOiBVc2UgdGhlIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBwcm92aWRlZCAuLi4gKi8KQEAgLTcwNywyMiArNTk5LDE4IEBACiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CiAJCS8qIE5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSAqLwogCQkvKiBQb3dlciBzYXZlIHdha2V1cCAqLwotCQlXTF9OT05FKCgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTFxuIiwKLQkJCSBfX2Z1bmNfXykpOworCQlXTF9OT05FKCIlczogYWN0aW9uID0gSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMXG4iLAorCQkJX19mdW5jX18pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIiVzOiBJbnZhbGlkIGNvbW1hbmQsIGlnbm9yaW5nXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IEludmFsaWQgY29tbWFuZCwgaWdub3JpbmdcbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIHdsX29wcyA9IHsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLnR4ID0gd2xfb3BzX3R4X25sLAotI2Vsc2UKIAkudHggPSB3bF9vcHNfdHgsCi0jZW5kaWYKIAkuc3RhcnQgPSB3bF9vcHNfc3RhcnQsCiAJLnN0b3AgPSB3bF9vcHNfc3RvcCwKIAkuYWRkX2ludGVyZmFjZSA9IHdsX29wc19hZGRfaW50ZXJmYWNlLApAQCAtNzQ0LDEwICs2MzIsMTAgQEAKIAkuYW1wZHVfYWN0aW9uID0gd2xfYW1wZHVfYWN0aW9uLAogfTsKIAotc3RhdGljIGludCB3bF9zZXRfaGludCh3bF9pbmZvX3QgKndsLCBjaGFyICphYmJyZXYpCitzdGF0aWMgaW50IHdsX3NldF9oaW50KHN0cnVjdCB3bF9pbmZvICp3bCwgY2hhciAqYWJicmV2KQogewotCVdMX0VSUk9SKCgiJXM6IFNlbmRpbmcgY291bnRyeSBjb2RlICVjJWMgdG8gTUFDODAyMTFcbiIsIF9fZnVuY19fLAotCQkgIGFiYnJldlswXSwgYWJicmV2WzFdKSk7CisJV0xfRVJST1IoIiVzOiBTZW5kaW5nIGNvdW50cnkgY29kZSAlYyVjIHRvIE1BQzgwMjExXG4iLAorCQkgX19mdW5jX18sIGFiYnJldlswXSwgYWJicmV2WzFdKTsKIAlyZXR1cm4gcmVndWxhdG9yeV9oaW50KHdsLT5wdWItPmllZWVfaHctPndpcGh5LCBhYmJyZXYpOwogfQogCkBAIC03NjIsMTE3ICs2NTAsNjEgQEAKICAqIGEgd2FybmluZyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBidXQgbm90IHVzZWQgaWYgd2UgZGVjbGFyZQogICogaXQgYXMgc3RhdGljLgogICovCi1zdGF0aWMgd2xfaW5mb190ICp3bF9hdHRhY2godTE2IHZlbmRvciwgdTE2IGRldmljZSwgdW5zaWduZWQgbG9uZyByZWdzLAorc3RhdGljIHN0cnVjdCB3bF9pbmZvICp3bF9hdHRhY2godTE2IHZlbmRvciwgdTE2IGRldmljZSwgdW5zaWduZWQgbG9uZyByZWdzLAogCQkJICAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSwgdWludCBpcnEpCiB7Ci0Jd2xfaW5mb190ICp3bDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCB3bF9pbmZvICp3bDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlpbnQgdW5pdCwgZXJyOwogCiAJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHI7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJdTggcGVybVtFVEhfQUxFTl07CiAKLQl1bml0ID0gd2xfZm91bmQgKyBpbnN0YW5jZV9iYXNlOworCXVuaXQgPSB3bF9mb3VuZDsKIAllcnIgPSAwOwogCiAJaWYgKHVuaXQgPCAwKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogdW5pdCBudW1iZXIgb3ZlcmZsb3csIGV4aXRpbmdcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHVuaXQgbnVtYmVyIG92ZXJmbG93LCBleGl0aW5nXG4iLCB1bml0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKG9uZW9ubHkgJiYgKHVuaXQgIT0gaW5zdGFuY2VfYmFzZSkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9hdHRhY2g6IG9uZW9ubHkgaXMgc2V0LCBleGl0aW5nXG4iLCB1bml0KSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIFJlcXVpcmVzIHBrdHRhZyBmZWF0dXJlICovCi0Jb3NoID0gb3NsX2F0dGFjaChidHBhcmFtLCBidXN0eXBlLCB0cnVlKTsKKwlvc2ggPSBvc2xfYXR0YWNoKGJ0cGFyYW0sIGJ1c3R5cGUpOwogCUFTU0VSVChvc2gpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZih3bF9pbmZvX3QpLCAmd2xfb3BzKTsKLQlpZiAoIWh3KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGllZWU4MDIxMV9hbGxvY19odyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCUFTU0VSVCgwKTsKLQl9Ci0KLQliemVybyhody0+cHJpdiwgc2l6ZW9mKCp3bCkpOwotCXdsID0gaHctPnByaXY7Ci0jZWxzZQogCS8qIGFsbG9jYXRlIHByaXZhdGUgaW5mbyAqLwogCWh3ID0gcGNpX2dldF9kcnZkYXRhKGJ0cGFyYW0pOwkvKiBidHBhcmFtID09IHBkZXYgKi8KIAl3bCA9IGh3LT5wcml2OwotI2VuZGlmCiAJQVNTRVJUKHdsKTsKIAotCXdsLT5tYWdpYyA9IFdMX01BR0lDOwogCXdsLT5vc2ggPSBvc2g7CiAJYXRvbWljX3NldCgmd2wtPmNhbGxiYWNrcywgMCk7CiAKIAkvKiBzZXR1cCB0aGUgYm90dG9tIGhhbGYgaGFuZGxlciAqLwogCXRhc2tsZXRfaW5pdCgmd2wtPnRhc2tsZXQsIHdsX2RwYywgKHVuc2lnbmVkIGxvbmcpIHdsKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bC0+cnBjX3RoID0gYmNtX3JwY190cF9hdHRhY2gob3NoLCBOVUxMKTsKLQlpZiAod2wtPnJwY190aCA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGJjbV9ycGNfdHBfYXR0YWNoIGZhaWxlZCFcbiIsIHVuaXQsCi0JCQkgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9CiAKLQl3bC0+cnBjID0gYmNtX3JwY19hdHRhY2goTlVMTCwgb3NoLCB3bC0+cnBjX3RoKTsKLQlpZiAod2wtPnJwYyA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGJjbV9ycGNfYXR0YWNoIGZhaWxlZCFcbiIsIHVuaXQsCi0JCQkgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBpbml0IHR4IHdvcmsgcXVldWUgZm9yIHdsX3N0YXJ0L3NlbmQgcGt0OyBubyBuZWVkIHRvIGRlc3Ryb3kgd29ya2l0ZW0gICovCi0JSU5JVF9XT1JLKCZ3bC0+dHhxX3Rhc2sud29yaywgKHdvcmtfZnVuY190KSB3bF9zdGFydF90eHF3b3JrKTsKLQl3bC0+dHhxX3Rhc2suY29udGV4dCA9IHdsOwotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KLQotI2lmZGVmIEJDTVNESU8KLQlTRVRfSUVFRTgwMjExX0RFVihodywgc2Rpb21tY19kZXYpOwotI2VuZGlmCiAKIAliYXNlX2FkZHIgPSByZWdzOwogCiAJaWYgKGJ1c3R5cGUgPT0gUENJX0JVUykgewotCQkvKiBwaW9tb2RlIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBjb21tYW5kIGFyZ3VtZW50ICovCi0JCXdsLT5waW9tb2RlID0gcGlvbW9kZTsKLQkJV0xfVFJBQ0UoKCJQQ0kvJXNcbiIsIHdsLT5waW9tb2RlID8gIlBJTyIgOiAiRE1BIikpOworCQl3bC0+cGlvbW9kZSA9IGZhbHNlOwogCX0gZWxzZSBpZiAoYnVzdHlwZSA9PSBSUENfQlVTKSB7CiAJCS8qIERvIG5vdGhpbmcgKi8KIAl9IGVsc2UgewogCQlidXN0eXBlID0gUENJX0JVUzsKLQkJV0xfVFJBQ0UoKCJmb3JjZSB0byBQQ0lcbiIpKTsKKwkJV0xfVFJBQ0UoImZvcmNlIHRvIFBDSVxuIik7CiAJfQogCXdsLT5iY21fYnVzdHlwZSA9IGJ1c3R5cGU7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JaWYgKHdsLT5iY21fYnVzdHlwZSA9PSBSUENfQlVTKSB7Ci0JCXdsLT5yZWdzdmEgPSAodm9pZCAqKTA7Ci0JCWJ0cGFyYW0gPSB3bC0+cnBjOwotCX0gZWxzZQotI2VuZGlmCiAJd2wtPnJlZ3N2YSA9IGlvcmVtYXBfbm9jYWNoZShiYXNlX2FkZHIsIFBDSV9CQVIwX1dJTlNaKTsKIAlpZiAod2wtPnJlZ3N2YSA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogaW9yZW1hcCgpIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXNwaW5fbG9ja19pbml0KCZ3bC0+cnBjcV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmd2wtPnR4cV9sb2NrKTsKLQotCXNlbWFfaW5pdCgmd2wtPnNlbSwgMSk7Ci0jZWxzZQogCXNwaW5fbG9ja19pbml0KCZ3bC0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJndsLT5pc3JfbG9jayk7Ci0jZW5kaWYKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJLyogcHJlcGFyZSB1Y29kZSAqLwogCWlmICh3bF9yZXF1ZXN0X2Z3KHdsLCAoc3RydWN0IHBjaV9kZXYgKilidHBhcmFtKSkgewogCQlwcmludGYoIiVzOiBGYWlsZWQgdG8gZmluZCBmaXJtd2FyZSB1c3VhbGx5IGluICVzXG4iLApAQCAtODgxLDE3ICs3MTMsMTQgQEAKIAkJd2xfcmVtb3ZlKChzdHJ1Y3QgcGNpX2RldiAqKWJ0cGFyYW0pOwogCQlnb3RvIGZhaWwxOwogCX0KLSNlbmRpZgogCiAJLyogY29tbW9uIGxvYWQtdGltZSBpbml0aWFsaXphdGlvbiAqLwogCXdsLT53bGMgPSB3bGNfYXR0YWNoKCh2b2lkICopd2wsIHZlbmRvciwgZGV2aWNlLCB1bml0LCB3bC0+cGlvbW9kZSwgb3NoLAogCQkJICAgICB3bC0+cmVnc3ZhLCB3bC0+YmNtX2J1c3R5cGUsIGJ0cGFyYW0sICZlcnIpOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJd2xfcmVsZWFzZV9mdyh3bCk7Ci0jZW5kaWYKIAlpZiAoIXdsLT53bGMpIHsKLQkJcHJpbnRmKCIlczogJXMgd2xjX2F0dGFjaCgpIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCi0JCQlLQlVJTERfTU9ETkFNRSwgRVBJX1ZFUlNJT05fU1RSLCBlcnIpOworCQlwcmludGYoIiVzOiB3bGNfYXR0YWNoKCkgZmFpbGVkIHdpdGggY29kZSAlZFxuIiwKKwkJCUtCVUlMRF9NT0ROQU1FLCBlcnIpOwogCQlnb3RvIGZhaWw7CiAJfQogCXdsLT5wdWIgPSB3bGNfcHViKHdsLT53bGMpOwpAQCAtOTAwLDUyICs3MjksMzUgQEAKIAlBU1NFUlQod2wtPnB1Yi0+aWVlZV9odyk7CiAJQVNTRVJUKHdsLT5wdWItPmllZWVfaHctPnByaXYgPT0gd2wpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVJFR09QU1NFVChvc2gsIChvc2xfcnJlZ19mbl90KSB3bGNfcmVnX3JlYWQsCi0JCSAgKG9zbF93cmVnX2ZuX3QpIHdsY19yZWdfd3JpdGUsIHdsLT53bGMpOwotCXdsLT5ycGNfZGlzcGF0Y2hfY3R4LnJwYyA9IHdsLT5ycGM7Ci0Jd2wtPnJwY19kaXNwYXRjaF9jdHgud2xjID0gd2wtPndsYzsKLQliY21fcnBjX3J4Y2JfaW5pdCh3bC0+cnBjLCB3bCwgd2xfcnBjX2Rpc3BhdGNoX3NjaGVkdWxlLCB3bCwKLQkJCSAgd2xfcnBjX2Rvd24sIE5VTEwsIE5VTEwpOwotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAotCWlmIChub21wYykgewotCQlpZiAod2xjX2lvdmFyX3NldGludCh3bC0+d2xjLCAibXBjIiwgMCkpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogRXJyb3Igc2V0dGluZyBNUEMgdmFyaWFibGUgdG8gMFxuIiwKLQkJCQkgIHVuaXQpKTsKLQkJfQorCWlmICh3bGNfaW92YXJfc2V0aW50KHdsLT53bGMsICJtcGMiLCAwKSkgeworCQlXTF9FUlJPUigid2wlZDogRXJyb3Igc2V0dGluZyBNUEMgdmFyaWFibGUgdG8gMFxuIiwgdW5pdCk7CiAJfQotI2lmZGVmIEJDTVNESU8KLQkvKiBTZXQgU0RJTyBkcml2ZSBzdHJlbmd0aCAqLwotCXdsY19pb3Zhcl9zZXRpbnQod2wtPndsYywgInNkX2RyaXZlc3RyZW5ndGgiLCBzZF9kcml2ZXN0cmVuZ3RoKTsKLSNlbmRpZgogCi0jaWZkZWYgV0xDX0xPVwogCS8qIHJlZ2lzdGVyIG91ciBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCWlmIChyZXF1ZXN0X2lycShpcnEsIHdsX2lzciwgSVJRRl9TSEFSRUQsIEtCVUlMRF9NT0ROQU1FLCB3bCkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiByZXF1ZXN0X2lycSgpIGZhaWxlZFxuIiwgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogcmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIsIHVuaXQpOwogCQlnb3RvIGZhaWw7CiAJfQogCXdsLT5pcnEgPSBpcnE7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiAJLyogcmVnaXN0ZXIgbW9kdWxlICovCiAJd2xjX21vZHVsZV9yZWdpc3Rlcih3bC0+cHViLCBOVUxMLCAibGludXgiLCB3bCwgTlVMTCwgd2xfbGludXhfd2F0Y2hkb2csCiAJCQkgICAgTlVMTCk7CiAKIAlpZiAoaWVlZV9od19pbml0KGh3KSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBpZWVlX2h3X2luaXQgZmFpbGVkIVxuIiwgdW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBpZWVlX2h3X2luaXQgZmFpbGVkIVxuIiwgdW5pdCwgX19mdW5jX18pOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JYmNvcHkoJndsLT5wdWItPmN1cl9ldGhlcmFkZHIsIHBlcm0sIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgmd2wtPnB1Yi0+Y3VyX2V0aGVyYWRkciwgcGVybSwgRVRIX0FMRU4pOwogCUFTU0VSVChpc192YWxpZF9ldGhlcl9hZGRyKHBlcm0pKTsKIAlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihodywgcGVybSk7CiAKIAllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpOwogCWlmIChlcnIpIHsKLQkJV0xfRVJST1IoKCIlczogaWVlZTgwMjExX3JlZ2lzdGVyX2h3IGZhaWxlZCwgc3RhdHVzICVkXG4iLAotCQkJICBfX2Z1bmNfXywgZXJyKSk7CisJCVdMX0VSUk9SKCIlczogaWVlZTgwMjExX3JlZ2lzdGVyX2h3IGZhaWxlZCwgc3RhdHVzICVkXG4iLAorCQkJIF9fZnVuY19fLCBlcnIpOwogCX0KIAogCWlmICh3bC0+cHViLT5zcm9tX2Njb2RlWzBdKQpAQCAtOTUzLDE5ICs3NjUsMTQgQEAKIAllbHNlCiAJCWVyciA9IHdsX3NldF9oaW50KHdsLCAiVVMiKTsKIAlpZiAoZXJyKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IHJlZ3VsYXRvcnlfaGludCBmYWlsZWQsIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sCi0JCQkgIGVycikpOworCQlXTF9FUlJPUigiJXM6IHJlZ3VsYXRvcnlfaGludCBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZXJyKTsKIAl9Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKLQlXTF9FUlJPUigoIndsJWQ6IEJyb2FkY29tIEJDTTQzeHggODAyLjExIE1BQzgwMjExIERyaXZlciAiCi0JCSAgRVBJX1ZFUlNJT05fU1RSICIgKCIgUEhZX1ZFUlNJT05fU1RSICIpIiwgdW5pdCkpOwotI2Vsc2UKLQlXTF9FUlJPUigoIndsJWQ6IEJyb2FkY29tIEJDTTQzeHggODAyLjExIE1BQzgwMjExIERyaXZlciAiCi0JCSAgRVBJX1ZFUlNJT05fU1RSLCB1bml0KSk7Ci0jZW5kaWYKKwlXTF9FUlJPUigid2wlZDogQnJvYWRjb20gQkNNNDN4eCA4MDIuMTEgTUFDODAyMTEgRHJpdmVyICgiIFBIWV9WRVJTSU9OX1NUUiAiKSIsCisJCSB1bml0KTsKIAogI2lmZGVmIEJDTURCRwotCXByaW50ZigiIChDb21waWxlZCBpbiAiIFNSQ0JBU0UgIiBhdCAiIF9fVElNRV9fICIgb24gIiBfX0RBVEVfXyAiKSIpOworCXByaW50ZigiIChDb21waWxlZCBhdCAiIF9fVElNRV9fICIgb24gIiBfX0RBVEVfXyAiKSIpOwogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCXByaW50ZigiXG4iKTsKIApAQCAtOTc4LDU0ICs3ODUsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotc3RhdGljIHZvaWQgKndsX2RidXNfcHJvYmVfY2Iodm9pZCAqYXJnLCBjb25zdCBjaGFyICpkZXNjLCB1MzIgYnVzdHlwZSwKLQkJCSAgICAgIHUzMiBoZHJsZW4pCi17Ci0Jd2xfaW5mb190ICp3bDsKLQlXTF9FUlJPUigoIiVzOlxuIiwgX19mdW5jX18pKTsKLQotCXdsID0gd2xfYXR0YWNoKEJDTV9ETkdMX1ZJRCwgQkNNX0ROR0xfQkRDX1BJRCwgKHVuc2lnbmVkIGxvbmcpIE5VTEwsIFJQQ19CVVMsCi0JCU5VTEwsIDApOwotCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCIlczogd2xfYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQl9Ci0KLQkvKiBUaGlzIGlzIGxhdGVyIHBhc3NlZCB0byB3bF9kYnVzX2Rpc2Nvbm5lY3RfY2IgKi8KLQlyZXR1cm4gd2w7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX2RidXNfZGlzY29ubmVjdF9jYih2b2lkICphcmcpCi17Ci0Jd2xfaW5mb190ICp3bCA9IGFyZzsKLQotCVdMX0VSUk9SKCgiJXM6XG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKHdsKSB7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQlpZiAod2wtPnB1Yi0+aWVlZV9odykgewotCQkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcod2wtPnB1Yi0+aWVlZV9odyk7Ci0JCQlXTF9FUlJPUigoIiVzOiBCYWNrIGZyb20gZG93blxuIiwgX19mdW5jX18pKTsKLQkJfQotCQl3bGNfZGV2aWNlX3JlbW92ZWQod2wtPndsYyk7Ci0JCXdsY19ibWFjX2RuZ2xfcmVib290KHdsLT5ycGMpOwotCQliY21fcnBjX2Rvd24od2wtPnJwYyk7Ci0jZW5kaWYKLQkJV0xfTE9DSyh3bCk7Ci0JCXdsX2Rvd24od2wpOwotCQlXTF9VTkxPQ0sod2wpOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsLT5wdWItPmllZWVfaHcpIHsKLQkJCWllZWU4MDIxMV9mcmVlX2h3KHdsLT5wdWItPmllZWVfaHcpOwotCQkJV0xfRVJST1IoKCIlczogQmFjayBmcm9tIGllZWU4MDIxMV9mcmVlX2h3XG4iLAotCQkJCSAgX19mdW5jX18pKTsKLQkJCXdsLT5wdWItPmllZWVfaHcgPSBOVUxMOwotCQl9Ci0jZW5kaWYKLQkJd2xfZnJlZSh3bCk7Ci0JfQotfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogCiAjZGVmaW5lIENIQU4yR0haKGNoYW5uZWwsIGZyZXFlbmN5LCBjaGZsYWdzKSAgeyBcCkBAIC0xMTYzLDI5ICs5MjIsMTMgQEAKIAkJICAgLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCB8CiAJCSAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKIAkJICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQXzQwTUhaX0lOVE9MRVJBTlQsCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQkgICAuaHRfc3VwcG9ydGVkID0gdHJ1ZSwKLQkJICAgLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl8xNkssCi0jZWxzZQogCQkgICAuaHRfc3VwcG9ydGVkID0gdHJ1ZSwKIAkJICAgLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl82NEssCi0jZW5kaWYKIAkJICAgLmFtcGR1X2RlbnNpdHkgPSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZLAogCQkgICAubWNzID0gewogCQkJICAgLyogcGxhY2Vob2xkZXJzIGZvciBub3cgKi8KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCQkgICAvKgotCQkJICAgICogcnhfbWFza1swXSA9IDB4ZmYgYnkgZGVmYXVsdAotCQkJICAgICogcnhfbWFza1sxXSA9IDB4ZmYgaWYgbnVtYmVyIG9mIHJ4IGNoYWluID49MgotCQkJICAgICogcnhfbWFza1syXSA9IDB4ZmYgaWYgbnVtYmVyIG9mIHJ4IGNoYWluID49MwotCQkJICAgICogcnhfbWFza1s0XSA9IDEgaWYgNDBNaHogaXMgc3VwcG9ydGVkCi0JCQkgICAgKi8KLQkJCSAgIC5yeF9tYXNrID0gezB4ZmYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAotCQkJICAgLnJ4X2hpZ2hlc3QgPSA3MiwJLyogbWF4IHJhdGUgb2Ygc2luZ2xlIHN0cmVhbSAqLwotI2Vsc2UKIAkJCSAgIC5yeF9tYXNrID0gezB4ZmYsIDB4ZmYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAogCQkJICAgLnJ4X2hpZ2hlc3QgPSA1MDAsCi0jZW5kaWYKIAkJCSAgIC50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUR9CiAJCSAgIH0KIH07CkBAIC0xMjEyLDcgKzk1NSw3IEBACiAKIHN0YXRpYyBpbnQgaWVlZV9od19yYXRlX2luaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IEhXX1RPX1dMKGh3KTsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBIV19UT19XTChodyk7CiAJaW50IGhhc181ZzsKIAljaGFyIHBoeV9saXN0WzRdOwogCkBAIC0xMjIyLDIwICs5NjUsMTYgQEAKIAlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gTlVMTDsKIAogCWlmICh3bGNfZ2V0KHdsLT53bGMsIFdMQ19HRVRfUEhZTElTVCwgKGludCAqKSZwaHlfbGlzdCkgPCAwKSB7Ci0JCVdMX0VSUk9SKCgiUGh5IGxpc3QgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJQaHkgbGlzdCBmYWlsZWRcbiIpOwogCX0KLQlXTF9OT05FKCgiJXM6IHBoeWxpc3QgPSAlY1xuIiwgX19mdW5jX18sIHBoeV9saXN0WzBdKSk7CisJV0xfTk9ORSgiJXM6IHBoeWxpc3QgPSAlY1xuIiwgX19mdW5jX18sIHBoeV9saXN0WzBdKTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJaWYgKHBoeV9saXN0WzBdID09ICduJyB8fCBwaHlfbGlzdFswXSA9PSAnYycpIHsKIAkJaWYgKHBoeV9saXN0WzBdID09ICdjJykgewogCQkJLyogU2luZ2xlIHN0cmVhbSAqLwogCQkJd2xfYmFuZF8yR0h6X25waHkuaHRfY2FwLm1jcy5yeF9tYXNrWzFdID0gMDsKIAkJCXdsX2JhbmRfMkdIel9ucGh5Lmh0X2NhcC5tY3MucnhfaGlnaGVzdCA9IDcyOwogCQl9Ci0jZWxzZQotCWlmIChwaHlfbGlzdFswXSA9PSAncycpIHsKLSNlbmRpZgogCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJndsX2JhbmRfMkdIel9ucGh5OwogCX0gZWxzZSB7CiAJCUJVRygpOwpAQCAtMTI0NSwxMSArOTg0LDcgQEAKIAkvKiBBc3N1bWUgYWxsIGJhbmRzIHVzZSB0aGUgc2FtZSBwaHkuICBUcnVlIGZvciAxMW4gZGV2aWNlcy4gKi8KIAlpZiAoTkJBTkRTX1BVQih3bC0+cHViKSA+IDEpIHsKIAkJaGFzXzVnKys7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIAkJaWYgKHBoeV9saXN0WzBdID09ICduJyB8fCBwaHlfbGlzdFswXSA9PSAnYycpIHsKLSNlbHNlCi0JCWlmIChwaHlfbGlzdFswXSA9PSAncycpIHsKLSNlbmRpZgogCQkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9CiAJCQkgICAgJndsX2JhbmRfNUdIel9ucGh5OwogCQl9IGVsc2UgewpAQCAtMTI1Nyw3ICs5OTIsNyBAQAogCQl9CiAJfQogCi0JV0xfTk9ORSgoIiVzOiAyZ2h6ID0gJWQsIDVnaHogPSAlZFxuIiwgX19mdW5jX18sIDEsIGhhc181ZykpOworCVdMX05PTkUoIiVzOiAyZ2h6ID0gJWQsIDVnaHogPSAlZFxuIiwgX19mdW5jX18sIDEsIGhhc181Zyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyODgsNyArMTAyMyw2IEBACiAJcmV0dXJuIGllZWVfaHdfcmF0ZV9pbml0KGh3KTsKIH0KIAotI2lmbmRlZiBCQ01TRElPCiAvKioKICAqIGRldGVybWluZXMgaWYgYSBkZXZpY2UgaXMgYSBXTCBkZXZpY2UsIGFuZCBpZiBzbywgYXR0YWNoZXMgaXQuCiAgKgpAQCAtMTMwMCwxNSArMTAzNCwxNSBAQAogd2xfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCWludCByYzsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAl1MzIgdmFsOwogCiAJQVNTRVJUKHBkZXYpOwogCi0JV0xfVFJBQ0UoKCIlczogYnVzICVkIHNsb3QgJWQgZnVuYyAlZCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQkgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCSAgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpKTsKKwlXTF9UUkFDRSgiJXM6IGJ1cyAlZCBzbG90ICVkIGZ1bmMgJWQgaXJxICVkXG4iLAorCQkgX19mdW5jX18sIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCSBQQ0lfRlVOQyhwZGV2LT5kZXZmbiksIHBkZXYtPmlycSk7CiAKIAlpZiAoKHBkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NKSB8fAogCSAgICAoKChwZGV2LT5kZXZpY2UgJiAweGZmMDApICE9IDB4NDMwMCkgJiYKQEAgLTEzMTgsOSArMTA1Miw5IEBACiAKIAlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyYykgewotCQlXTF9FUlJPUigoIiVzOiBDYW5ub3QgZW5hYmxlIGRldmljZSAlZC0lZF8lZFxuIiwgX19mdW5jX18sCi0JCQkgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCQkgIFBDSV9GVU5DKHBkZXYtPmRldmZuKSkpOworCQlXTF9FUlJPUigiJXM6IENhbm5vdCBlbmFibGUgZGV2aWNlICVkLSVkXyVkXG4iLAorCQkJIF9fZnVuY19fLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorCQkJIFBDSV9GVU5DKHBkZXYtPmRldmZuKSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKQEAgLTEzMjksOSArMTA2Myw5IEBACiAJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwogCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHdsX2luZm9fdCksICZ3bF9vcHMpOworCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3Qgd2xfaW5mbyksICZ3bF9vcHMpOwogCWlmICghaHcpIHsKLQkJV0xfRVJST1IoKCIlczogaWVlZTgwMjExX2FsbG9jX2h3IGZhaWxlZFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfMTsKIAl9CkBAIC0xMzQwLDM0ICsxMDc0LDM0IEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOwogCi0JYnplcm8oaHctPnByaXYsIHNpemVvZigqd2wpKTsKKwltZW1zZXQoaHctPnByaXYsIDAsIHNpemVvZigqd2wpKTsKIAogCXdsID0gd2xfYXR0YWNoKHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCiAJCSAgICAgICBQQ0lfQlVTLCBwZGV2LCBwZGV2LT5pcnEpOwogCiAJaWYgKCF3bCkgewotCQlXTF9FUlJPUigoIiVzOiAlczogd2xfYXR0YWNoIGZhaWxlZCFcbiIsCi0JCQlLQlVJTERfTU9ETkFNRSwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiAlczogd2xfYXR0YWNoIGZhaWxlZCFcbiIsCisJCQkgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXJldHVybiAwOwogIGVycl8xOgotCVdMX0VSUk9SKCgiJXM6IGVycl8xOiBNYWpvciBob2Fya2FnZVxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IGVycl8xOiBNYWpvciBob2Fya2FnZVxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCiAjaWZkZWYgTElOVVhTVEFfUFMKIHN0YXRpYyBpbnQgd2xfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCi0JV0xfVFJBQ0UoKCJ3bDogd2xfc3VzcGVuZFxuIikpOworCVdMX1RSQUNFKCJ3bDogd2xfc3VzcGVuZFxuIik7CiAKIAlodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAl3bCA9IEhXX1RPX1dMKGh3KTsKIAlpZiAoIXdsKSB7Ci0JCVdMX0VSUk9SKCgid2w6IHdsX3N1c3BlbmQ6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpKTsKKwkJV0xfRVJST1IoIndsOiB3bF9zdXNwZW5kOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMzgyLDE2ICsxMTE2LDE2IEBACiAKIHN0YXRpYyBpbnQgd2xfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCWludCBlcnIgPSAwOwogCXUzMiB2YWw7CiAKLQlXTF9UUkFDRSgoIndsOiB3bF9yZXN1bWVcbiIpKTsKKwlXTF9UUkFDRSgid2w6IHdsX3Jlc3VtZVxuIik7CiAJaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBIV19UT19XTChodyk7CiAJaWYgKCF3bCkgewotCQlXTF9FUlJPUigoIndsOiB3bF9yZXN1bWU6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpKTsKKwkJV0xfRVJST1IoIndsOiB3bF9yZXN1bWU6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE0MjEsMTcgKzExNTUsMTcgQEAKIAogc3RhdGljIHZvaWQgd2xfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCiAJaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBIV19UT19XTChodyk7CiAJaWYgKCF3bCkgewotCQlXTF9FUlJPUigoIndsOiB3bF9yZW1vdmU6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpKTsKKwkJV0xfRVJST1IoIndsOiB3bF9yZW1vdmU6IHBjaV9nZXRfZHJ2ZGF0YSBmYWlsZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmICghd2xjX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSkpIHsKLQkJV0xfRVJST1IoKCJ3bDogd2xfcmVtb3ZlOiB3bGNfY2hpcG1hdGNoIGZhaWxlZFxuIikpOworCQlXTF9FUlJPUigid2w6IHdsX3JlbW92ZTogd2xjX2NoaXBtYXRjaCBmYWlsZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmICh3bC0+d2xjKSB7CkBAIC0xNDM5LDcgKzExNzMsNyBAQAogCQlXTF9MT0NLKHdsKTsKIAkJd2xfZG93bih3bCk7CiAJCVdMX1VOTE9DSyh3bCk7Ci0JCVdMX05PTkUoKCIlczogRG93blxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IERvd25cbiIsIF9fZnVuY19fKTsKIAl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCkBAIC0xNDU5LDcgKzExOTMsNiBAQAogIC5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKHdsX3JlbW92ZSksCiAgLmlkX3RhYmxlID0gd2xfaWRfdGFibGUsCiB9OwotI2VuZGlmCQkJCS8qICFCQ01TRElPICovCiAKIC8qKgogICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIFdMIGRyaXZlci4KQEAgLTE0ODAsNyArMTIxMyw2IEBACiAJCWlmICh2YXIpCiAJCQl3bF9tc2dfbGV2ZWwgPSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwogCX0KLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCXsKIAkJZXh0ZXJuIHUzMiBwaHloYWxfbXNnX2xldmVsOwogCkBAIC0xNDkyLDI1ICsxMjI0LDEzIEBACiAJCQkJcGh5aGFsX21zZ19sZXZlbCA9IHNpbXBsZV9zdHJ0b3VsKHZhciwgTlVMTCwgMCk7CiAJCX0KIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCi0jaWZuZGVmIEJDTVNESU8KIAllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJndsX3BjaV9kcml2ZXIpOwogCWlmICghZXJyb3IpCiAJCXJldHVybiAwOwogCi0jZW5kaWYJCQkJLyogIUJDTVNESU8gKi8KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBCTUFDX05PVEU6IGRlZmluZSBoYXJkY29kZSBudW1iZXIsIHdoeSBOT0RFVklDRSBpcyBvayA/ICovCi0JZXJyb3IgPQotCSAgICBkYnVzX3JlZ2lzdGVyKEJDTV9ETkdMX1ZJRCwgMCwgd2xfZGJ1c19wcm9iZV9jYiwKLQkJCSAgd2xfZGJ1c19kaXNjb25uZWN0X2NiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyb3IgPT0gREJVU19FUlJfTk9ERVZJQ0UpIHsKLQkJZXJyb3IgPSBEQlVTX09LOwotCX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xNTI0LDEzICsxMjQ0LDggQEAKICAqLwogc3RhdGljIHZvaWQgX19leGl0IHdsX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0jaWZuZGVmIEJDTVNESU8KIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJndsX3BjaV9kcml2ZXIpOwotI2VuZGlmCQkJCS8qICFCQ01TRElPICovCiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JZGJ1c19kZXJlZ2lzdGVyKCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBtb2R1bGVfaW5pdCh3bF9tb2R1bGVfaW5pdCk7CkBAIC0xNTQzLDE5ICsxMjU4LDE3IEBACiAgKiBieSB0aGUgd2wgcGFyYW1ldGVyLgogICoKICAqLwotdm9pZCB3bF9mcmVlKHdsX2luZm9fdCAqd2wpCit2b2lkIHdsX2ZyZWUoc3RydWN0IHdsX2luZm8gKndsKQogewogCXdsX3RpbWVyX3QgKnQsICpuZXh0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlBU1NFUlQod2wpOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJLyogZnJlZSB1Y29kZSBkYXRhICovCiAJaWYgKHdsLT5mdy5md19jbnQpCiAJCXdsX3Vjb2RlX2RhdGFfZnJlZSgpOwogCWlmICh3bC0+aXJxKQogCQlmcmVlX2lycSh3bC0+aXJxLCB3bCk7Ci0jZW5kaWYKIAogCS8qIGtpbGwgZHBjICovCiAJdGFza2xldF9raWxsKCZ3bC0+dGFza2xldCk7CkBAIC0xNTkzLDEwMyArMTMwNiw1MCBAQAogCSAqIHVucmVnaXN0ZXJfbmV0ZGV2KCkgY2FsbHMgZ2V0X3N0YXRzKCkgd2hpY2ggbWF5IHJlYWQgY2hpcCByZWdpc3RlcnMKIAkgKiBzbyB3ZSBjYW5ub3QgdW5tYXAgdGhlIGNoaXAgcmVnaXN0ZXJzIHVudGlsIGFmdGVyIGNhbGxpbmcgdW5yZWdpc3Rlcl9uZXRkZXYoKSAuCiAJICovCi0JaWYgKHdsLT5yZWdzdmEgJiYgQlVTVFlQRSh3bC0+YmNtX2J1c3R5cGUpICE9IFNESU9fQlVTICYmCi0JICAgIEJVU1RZUEUod2wtPmJjbV9idXN0eXBlKSAhPSBKVEFHX0JVUykgeworCWlmICh3bC0+cmVnc3ZhICYmIHdsLT5iY21fYnVzdHlwZSAhPSBTRElPX0JVUyAmJgorCSAgICB3bC0+YmNtX2J1c3R5cGUgIT0gSlRBR19CVVMpIHsKIAkJaW91bm1hcCgodm9pZCAqKXdsLT5yZWdzdmEpOwogCX0KIAl3bC0+cmVnc3ZhID0gTlVMTDsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bF9ycGNxX2ZyZWUod2wpOwotCi0Jd2xfdHhxX2ZyZWUod2wpOwotCi0JaWYgKHdsLT5ycGMpIHsKLQkJYmNtX3JwY19kZXRhY2god2wtPnJwYyk7Ci0JCXdsLT5ycGMgPSBOVUxMOwotCX0KLQotCWlmICh3bC0+cnBjX3RoKSB7Ci0JCWJjbV9ycGNfdHBfZGV0YWNoKHdsLT5ycGNfdGgpOwotCQl3bC0+cnBjX3RoID0gTlVMTDsKLQl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiAJb3NsX2RldGFjaChvc2gpOwogfQogCi0jaWZkZWYgV0xDX0xPVwogLyogdHJhbnNtaXQgYSBwYWNrZXQgKi8KLXN0YXRpYyBpbnQgQkNNRkFTVFBBVEggd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgd2xfaW5mb190ICp3bCkKK3N0YXRpYyBpbnQgQkNNRkFTVFBBVEggd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHdsX2luZm8gKndsKQogewogCWlmICghd2wpCiAJCXJldHVybiAtRU5FVERPV047CiAKIAlyZXR1cm4gd2xfc3RhcnRfaW50KHdsLCBXTF9UT19IVyh3bCksIHNrYik7CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiBzdGF0aWMgaW50IEJDTUZBU1RQQVRICi13bF9zdGFydF9pbnQod2xfaW5mb190ICp3bCwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit3bF9zdGFydF9pbnQoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JV0xfTE9DSyh3bCk7Ci0jZW5kaWYKIAl3bGNfc2VuZHBrdF9tYWM4MDIxMSh3bC0+d2xjLCBza2IsIGh3KTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JV0xfVU5MT0NLKHdsKTsKLSNlbmRpZgogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLXZvaWQgd2xfdHhmbG93Y29udHJvbCh3bF9pbmZvX3QgKndsLCBzdHJ1Y3Qgd2xfaWYgKndsaWYsIGJvb2wgc3RhdGUsIGludCBwcmlvKQordm9pZCB3bF90eGZsb3djb250cm9sKHN0cnVjdCB3bF9pbmZvICp3bCwgc3RydWN0IHdsX2lmICp3bGlmLCBib29sIHN0YXRlLAorCQkgICAgICBpbnQgcHJpbykKIHsKLQlXTF9FUlJPUigoIlNob3VsZG4ndCBiZSBoZXJlICVzXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCJTaG91bGRuJ3QgYmUgaGVyZSAlc1xuIiwgX19mdW5jX18pOwogfQogCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotLyogU2NoZWR1bGUgYSBjb21wbGV0aW9uIGhhbmRsZXIgdG8gcnVuIGF0IHNhZmUgdGltZSAqLwotc3RhdGljIGludAotd2xfc2NoZWR1bGVfdGFzayh3bF9pbmZvX3QgKndsLCB2b2lkICgqZm4pIChzdHJ1Y3Qgd2xfdGFzayAqdGFzayksCi0JCSB2b2lkICpjb250ZXh0KQordm9pZCB3bF9pbml0KHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLQl3bF90YXNrX3QgKnRhc2s7Ci0KLQlXTF9UUkFDRSgoIndsJWQ6IHdsX3NjaGVkdWxlX3Rhc2tcbiIsIHdsLT5wdWItPnVuaXQpKTsKLQotCXRhc2sgPSBrbWFsbG9jKHNpemVvZih3bF90YXNrX3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXRhc2spIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9zY2hlZHVsZV90YXNrOiBvdXQgb2YgbWVtb3J5XG4iLCB3bC0+cHViLT51bml0KSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCUlOSVRfV09SSygmdGFzay0+d29yaywgKHdvcmtfZnVuY190KSBmbik7Ci0JdGFzay0+Y29udGV4dCA9IGNvbnRleHQ7Ci0KLQlpZiAoIXNjaGVkdWxlX3dvcmsoJnRhc2stPndvcmspKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogc2NoZWR1bGVfd29yaygpIGZhaWxlZFxuIiwgd2wtPnB1Yi0+dW5pdCkpOwotCQlrZnJlZSh0YXNrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXRvbWljX2luYygmd2wtPmNhbGxiYWNrcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpICovCi0KLXZvaWQgd2xfaW5pdCh3bF9pbmZvX3QgKndsKQotewotCVdMX1RSQUNFKCgid2wlZDogd2xfaW5pdFxuIiwgd2wtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bF9pbml0XG4iLCB3bC0+cHViLT51bml0KTsKIAogCXdsX3Jlc2V0KHdsKTsKIAogCXdsY19pbml0KHdsLT53bGMpOwogfQogCi11aW50IHdsX3Jlc2V0KHdsX2luZm9fdCAqd2wpCit1aW50IHdsX3Jlc2V0KHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsX3Jlc2V0XG4iLCB3bC0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsX3Jlc2V0XG4iLCB3bC0+cHViLT51bml0KTsKIAogCXdsY19yZXNldCh3bC0+d2xjKTsKIApAQCAtMTcwMywyNSArMTM2MywyMiBAQAogICogVGhlc2UgYXJlIGludGVycnVwdCBvbi9vZmYgZW50cnkgcG9pbnRzLiBEaXNhYmxlIGludGVycnVwdHMKICAqIGR1cmluZyBpbnRlcnJ1cHQgc3RhdGUgdHJhbnNpdGlvbi4KICAqLwotdm9pZCBCQ01GQVNUUEFUSCB3bF9pbnRyc29uKHdsX2luZm9fdCAqd2wpCit2b2lkIEJDTUZBU1RQQVRIIHdsX2ludHJzb24oc3RydWN0IHdsX2luZm8gKndsKQogewotI2lmIGRlZmluZWQoV0xDX0xPVykKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJSU5UX0xPQ0sod2wsIGZsYWdzKTsKIAl3bGNfaW50cnNvbih3bC0+d2xjKTsKIAlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogfQogCi1ib29sIHdsX2FsbG9jX2RtYV9yZXNvdXJjZXMod2xfaW5mb190ICp3bCwgdWludCBhZGRyd2lkdGgpCitib29sIHdsX2FsbG9jX2RtYV9yZXNvdXJjZXMoc3RydWN0IHdsX2luZm8gKndsLCB1aW50IGFkZHJ3aWR0aCkKIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdTMyIEJDTUZBU1RQQVRIIHdsX2ludHJzb2ZmKHdsX2luZm9fdCAqd2wpCit1MzIgQkNNRkFTVFBBVEggd2xfaW50cnNvZmYoc3RydWN0IHdsX2luZm8gKndsKQogewotI2lmIGRlZmluZWQoV0xDX0xPVykKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBzdGF0dXM7CiAKQEAgLTE3MjksMjMgKzEzODYsMTggQEAKIAlzdGF0dXMgPSB3bGNfaW50cnNvZmYod2wtPndsYyk7CiAJSU5UX1VOTE9DSyh3bCwgZmxhZ3MpOwogCXJldHVybiBzdGF0dXM7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIH0KIAotdm9pZCB3bF9pbnRyc3Jlc3RvcmUod2xfaW5mb190ICp3bCwgdTMyIG1hY2ludG1hc2spCit2b2lkIHdsX2ludHJzcmVzdG9yZShzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHUzMiBtYWNpbnRtYXNrKQogewotI2lmIGRlZmluZWQoV0xDX0xPVykKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJSU5UX0xPQ0sod2wsIGZsYWdzKTsKIAl3bGNfaW50cnNyZXN0b3JlKHdsLT53bGMsIG1hY2ludG1hc2spOwogCUlOVF9VTkxPQ0sod2wsIGZsYWdzKTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKLWludCB3bF91cCh3bF9pbmZvX3QgKndsKQoraW50IHdsX3VwKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xNzU3LDcgKzE0MDksNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotdm9pZCB3bF9kb3duKHdsX2luZm9fdCAqd2wpCit2b2lkIHdsX2Rvd24oc3RydWN0IHdsX2luZm8gKndsKQogewogCXVpbnQgY2FsbGJhY2tzLCByZXRfdmFsID0gMDsKIApAQCAtMTc2OCwyNCArMTQyMCwyMSBAQAogCS8qIHdhaXQgZm9yIGRvd24gY2FsbGJhY2tzIHRvIGNvbXBsZXRlICovCiAJV0xfVU5MT0NLKHdsKTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJLyogRm9yIEhJR0hfb25seSBkcml2ZXIsIGl0J3MgaW1wb3J0YW50IHRvIGFjdHVhbGx5IHNjaGVkdWxlIG90aGVyIHdvcmssCiAJICogbm90IGp1c3Qgc3BpbiB3YWl0IHNpbmNlIGV2ZXJ5dGhpbmcgcnVucyBhdCBzY2hlZHVsZSBsZXZlbAogCSAqLwogCVNQSU5XQUlUKChhdG9taWNfcmVhZCgmd2wtPmNhbGxiYWNrcykgPiBjYWxsYmFja3MpLCAxMDAgKiAxMDAwKTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIAlXTF9MT0NLKHdsKTsKIH0KIAogaXJxcmV0dXJuX3QgQkNNRkFTVFBBVEggd2xfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCi0Jd2xfaW5mb190ICp3bDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CiAJYm9vbCBvdXJzLCB3YW50ZHBjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl3bCA9ICh3bF9pbmZvX3QgKikgZGV2X2lkOworCXdsID0gKHN0cnVjdCB3bF9pbmZvICopIGRldl9pZDsKIAogCVdMX0lTUkxPQ0sod2wsIGZsYWdzKTsKIApAQCAtMTgwNSwxNyArMTQ1NCwxMyBAQAogCVdMX0lTUlVOTE9DSyh3bCwgZmxhZ3MpOwogCiAJcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Ci0jZWxzZQotCXJldHVybiBJUlFfUkVUVkFMKDApOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIH0KIAogc3RhdGljIHZvaWQgQkNNRkFTVFBBVEggd2xfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSNpZmRlZiBXTENfTE9XCi0Jd2xfaW5mb190ICp3bDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CiAKLQl3bCA9ICh3bF9pbmZvX3QgKikgZGF0YTsKKwl3bCA9IChzdHJ1Y3Qgd2xfaW5mbyAqKSBkYXRhOwogCiAJV0xfTE9DSyh3bCk7CiAKQEAgLTE4NDYsMjAgKzE0OTEsMTkgQEAKIAogIGRvbmU6CiAJV0xfVU5MT0NLKHdsKTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKLXN0YXRpYyB2b2lkIHdsX2xpbmtfdXAod2xfaW5mb190ICp3bCwgY2hhciAqaWZuYW1lKQorc3RhdGljIHZvaWQgd2xfbGlua191cChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIGNoYXIgKmlmbmFtZSkKIHsKLQlXTF9FUlJPUigoIndsJWQ6IGxpbmsgdXAgKCVzKVxuIiwgd2wtPnB1Yi0+dW5pdCwgaWZuYW1lKSk7CisJV0xfRVJST1IoIndsJWQ6IGxpbmsgdXAgKCVzKVxuIiwgd2wtPnB1Yi0+dW5pdCwgaWZuYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgd2xfbGlua19kb3duKHdsX2luZm9fdCAqd2wsIGNoYXIgKmlmbmFtZSkKK3N0YXRpYyB2b2lkIHdsX2xpbmtfZG93bihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIGNoYXIgKmlmbmFtZSkKIHsKLQlXTF9FUlJPUigoIndsJWQ6IGxpbmsgZG93biAoJXMpXG4iLCB3bC0+cHViLT51bml0LCBpZm5hbWUpKTsKKwlXTF9FUlJPUigid2wlZDogbGluayBkb3duICglcylcbiIsIHdsLT5wdWItPnVuaXQsIGlmbmFtZSk7CiB9CiAKLXZvaWQgd2xfZXZlbnQod2xfaW5mb190ICp3bCwgY2hhciAqaWZuYW1lLCB3bGNfZXZlbnRfdCAqZSkKK3ZvaWQgd2xfZXZlbnQoc3RydWN0IHdsX2luZm8gKndsLCBjaGFyICppZm5hbWUsIHdsY19ldmVudF90ICplKQogewogCiAJc3dpdGNoIChlLT5ldmVudC5ldmVudF90eXBlKSB7CkBAIC0xODc3LDEyICsxNTIxLDcgQEAKIAogc3RhdGljIHZvaWQgd2xfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJX3dsX3RpbWVyKCh3bF90aW1lcl90ICopIGRhdGEpOwotI2Vsc2UKLQl3bF90aW1lcl90ICp0ID0gKHdsX3RpbWVyX3QgKikgZGF0YTsKLQl3bF9zY2hlZHVsZV90YXNrKHQtPndsLCB3bF90aW1lcl90YXNrLCB0KTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiB9CiAKIHN0YXRpYyB2b2lkIF93bF90aW1lcih3bF90aW1lcl90ICp0KQpAQCAtMTkwNiwxOCArMTU0NSwxOCBAQAogCVdMX1VOTE9DSyh0LT53bCk7CiB9CiAKLXdsX3RpbWVyX3QgKndsX2luaXRfdGltZXIod2xfaW5mb190ICp3bCwgdm9pZCAoKmZuKSAodm9pZCAqYXJnKSwgdm9pZCAqYXJnLAord2xfdGltZXJfdCAqd2xfaW5pdF90aW1lcihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHZvaWQgKCpmbikgKHZvaWQgKmFyZyksIHZvaWQgKmFyZywKIAkJCSAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAl3bF90aW1lcl90ICp0OwogCiAJdCA9IGttYWxsb2Moc2l6ZW9mKHdsX3RpbWVyX3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXQpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9pbml0X3RpbWVyOiBvdXQgb2YgbWVtb3J5XG4iLCB3bC0+cHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bF9pbml0X3RpbWVyOiBvdXQgb2YgbWVtb3J5XG4iLCB3bC0+cHViLT51bml0KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JYnplcm8odCwgc2l6ZW9mKHdsX3RpbWVyX3QpKTsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKHdsX3RpbWVyX3QpKTsKIAogCWluaXRfdGltZXIoJnQtPnRpbWVyKTsKIAl0LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHQ7CkBAIC0xOTQwLDEyICsxNTc5LDEyIEBACiAvKiBCTUFDX05PVEU6IEFkZCB0aW1lciBhZGRzIG9ubHkgdGhlIGtlcm5lbCB0aW1lciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIG1vcmUgYWNjdXJhdGUKICAqIGFzIHdlbGwgYXMgaXQncyBlYXNpZXIgdG8gbWFrZSBpdCBwZXJpb2RpYwogICovCi12b2lkIHdsX2FkZF90aW1lcih3bF9pbmZvX3QgKndsLCB3bF90aW1lcl90ICp0LCB1aW50IG1zLCBpbnQgcGVyaW9kaWMpCit2b2lkIHdsX2FkZF90aW1lcihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHdsX3RpbWVyX3QgKnQsIHVpbnQgbXMsIGludCBwZXJpb2RpYykKIHsKICNpZmRlZiBCQ01EQkcKIAlpZiAodC0+c2V0KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IEFscmVhZHkgc2V0LiBOYW1lOiAlcywgcGVyICVkXG4iLAotCQkJICBfX2Z1bmNfXywgdC0+bmFtZSwgcGVyaW9kaWMpKTsKKwkJV0xfRVJST1IoIiVzOiBBbHJlYWR5IHNldC4gTmFtZTogJXMsIHBlciAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgdC0+bmFtZSwgcGVyaW9kaWMpOwogCX0KICNlbmRpZgogCUFTU0VSVCghdC0+c2V0KTsKQEAgLTE5NjAsNyArMTU5OSw3IEBACiB9CiAKIC8qIHJldHVybiB0cnVlIGlmIHRpbWVyIHN1Y2Nlc3NmdWxseSBkZWxldGVkLCBmYWxzZSBpZiBzdGlsbCBwZW5kaW5nICovCi1ib29sIHdsX2RlbF90aW1lcih3bF9pbmZvX3QgKndsLCB3bF90aW1lcl90ICp0KQorYm9vbCB3bF9kZWxfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB3bF90aW1lcl90ICp0KQogewogCWlmICh0LT5zZXQpIHsKIAkJdC0+c2V0ID0gZmFsc2U7CkBAIC0xOTczLDcgKzE2MTIsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi12b2lkIHdsX2ZyZWVfdGltZXIod2xfaW5mb190ICp3bCwgd2xfdGltZXJfdCAqdCkKK3ZvaWQgd2xfZnJlZV90aW1lcihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHdsX3RpbWVyX3QgKnQpCiB7CiAJd2xfdGltZXJfdCAqdG1wOwogCkBAIC0yMDA5LDcgKzE2NDgsNyBAQAogCiBzdGF0aWMgaW50IHdsX2xpbnV4X3dhdGNoZG9nKHZvaWQgKmN0eCkKIHsKLQl3bF9pbmZvX3QgKndsID0gKHdsX2luZm9fdCAqKSBjdHg7CisJc3RydWN0IHdsX2luZm8gKndsID0gKHN0cnVjdCB3bF9pbmZvICopIGN0eDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBOVUxMOwogCXVpbnQgaWQ7CiAJLyogcmVmcmVzaCBzdGF0cyAqLwpAQCAtMjA0OSwyMzMgKzE2ODgsMTIgQEAKIAl1MzIgaWR4OwogfTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXN0YXRpYyB2b2lkIHdsX3JwY19kb3duKHZvaWQgKndsaCkKLXsKLQl3bF9pbmZvX3QgKndsID0gKHdsX2luZm9fdCAqKSAod2xoKTsKLQotCXdsY19kZXZpY2VfcmVtb3ZlZCh3bC0+d2xjKTsKLQotCXdsX3JwY3FfZnJlZSh3bCk7Ci19Ci0KLXN0YXRpYyBpbnQgQkNNRkFTVFBBVEggd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgd2xfaW5mb190ICp3bCkKLXsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlza2ItPnByZXYgPSBOVUxMOwotCi0JLyogTG9jayB0aGUgcXVldWUgYXMgdGFza2xldCBjb3VsZCBiZSBydW5uaW5nIGF0IHRoaXMgdGltZSAqLwotCVRYUV9MT0NLKHdsLCBmbGFncyk7Ci0JaWYgKHdsLT50eHFfaGVhZCA9PSBOVUxMKQotCQl3bC0+dHhxX2hlYWQgPSBza2I7Ci0JZWxzZSB7Ci0JCXdsLT50eHFfdGFpbC0+cHJldiA9IHNrYjsKLQl9Ci0Jd2wtPnR4cV90YWlsID0gc2tiOwotCi0JaWYgKHdsLT50eHFfZGlzcGF0Y2hlZCA9PSBmYWxzZSkgewotCQl3bC0+dHhxX2Rpc3BhdGNoZWQgPSB0cnVlOwotCi0JCWlmIChzY2hlZHVsZV93b3JrKCZ3bC0+dHhxX3Rhc2sud29yaykpIHsKLQkJCWF0b21pY19pbmMoJndsLT5jYWxsYmFja3MpOwotCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9zdGFydC9zY2hlZHVsZV93b3JrIGZhaWxlZFxuIiwKLQkJCQkgIHdsLT5wdWItPnVuaXQpKTsKLQkJfQotCX0KLQotCVRYUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQotCXJldHVybiAwOwotCi19Ci0KLXN0YXRpYyB2b2lkIHdsX3N0YXJ0X3R4cXdvcmsoc3RydWN0IHdsX3Rhc2sgKnRhc2spCi17Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgdGFzay0+Y29udGV4dDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludCBjb3VudCA9IDA7Ci0KLQlXTF9UUkFDRSgoIndsJWQ6IHdsX3N0YXJ0X3R4cXdvcmtcbiIsIHdsLT5wdWItPnVuaXQpKTsKLQotCS8qIEZpcnN0IHJlbW92ZSBhbiBlbnRyeSB0aGVuIGdvIGZvciBleGVjdXRpb24gKi8KLQlUWFFfTE9DSyh3bCwgZmxhZ3MpOwotCXdoaWxlICh3bC0+dHhxX2hlYWQpIHsKLQkJc2tiID0gd2wtPnR4cV9oZWFkOwotCQl3bC0+dHhxX2hlYWQgPSBza2ItPnByZXY7Ci0JCXNrYi0+cHJldiA9IE5VTEw7Ci0JCWlmICh3bC0+dHhxX2hlYWQgPT0gTlVMTCkKLQkJCXdsLT50eHFfdGFpbCA9IE5VTEw7Ci0JCVRYUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQotCQkvKiBpdCBoYXMgV0xfTE9DSy9XTF9VTkxPQ0sgaW5zaWRlICovCi0JCXdsX3N0YXJ0X2ludCh3bCwgV0xfVE9fSFcod2wpLCBza2IpOwotCi0JCS8qIGJvdW5kZWQgb3VyIGV4ZWN1dGlvbiwgcmVzaGVkdWxlIG91cnNlbGYgbmV4dCAqLwotCQlpZiAoKytjb3VudCA+PSAxMCkKLQkJCWJyZWFrOwotCi0JCVRYUV9MT0NLKHdsLCBmbGFncyk7Ci0JfQotCi0JaWYgKGNvdW50ID49IDEwKSB7Ci0JCWlmICghc2NoZWR1bGVfd29yaygmd2wtPnR4cV90YXNrLndvcmspKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsX3N0YXJ0L3NjaGVkdWxlX3dvcmsgZmFpbGVkXG4iLAotCQkJCSAgd2wtPnB1Yi0+dW5pdCkpOwotCQkJYXRvbWljX2RlYygmd2wtPmNhbGxiYWNrcyk7Ci0JCX0KLQl9IGVsc2UgewotCQl3bC0+dHhxX2Rpc3BhdGNoZWQgPSBmYWxzZTsKLQkJVFhRX1VOTE9DSyh3bCwgZmxhZ3MpOwotCQlhdG9taWNfZGVjKCZ3bC0+Y2FsbGJhY2tzKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3R4cV9mcmVlKHdsX2luZm9fdCAqd2wpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmICh3bC0+dHhxX2hlYWQgPT0gTlVMTCkgewotCQlBU1NFUlQod2wtPnR4cV90YWlsID09IE5VTEwpOwotCQlyZXR1cm47Ci0JfQotCi0Jd2hpbGUgKHdsLT50eHFfaGVhZCkgewotCQlza2IgPSB3bC0+dHhxX2hlYWQ7Ci0JCXdsLT50eHFfaGVhZCA9IHNrYi0+cHJldjsKLQkJUEtURlJFRSh3bC0+b3NoLCBza2IsIHRydWUpOwotCX0KLQotCXdsLT50eHFfdGFpbCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3JwY3FfZnJlZSh3bF9pbmZvX3QgKndsKQotewotCXJwY19idWZfdCAqYnVmOwotCi0JaWYgKHdsLT5ycGNxX2hlYWQgPT0gTlVMTCkgewotCQlBU1NFUlQod2wtPnJwY3FfdGFpbCA9PSBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlICh3bC0+cnBjcV9oZWFkKSB7Ci0JCWJ1ZiA9IHdsLT5ycGNxX2hlYWQ7Ci0JCXdsLT5ycGNxX2hlYWQgPSBiY21fcnBjX2J1Zl9uZXh0X2dldCh3bC0+cnBjX3RoLCBidWYpOwotCQliY21fcnBjX2J1Zl9mcmVlKHdsLT5ycGNfZGlzcGF0Y2hfY3R4LnJwYywgYnVmKTsKLQl9Ci0KLQl3bC0+cnBjcV90YWlsID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgd2xfcnBjcV9kaXNwYXRjaChzdHJ1Y3Qgd2xfdGFzayAqdGFzaykKLXsKLQl3bF9pbmZvX3QgKndsID0gKHdsX2luZm9fdCAqKSB0YXNrLT5jb250ZXh0OwotCXJwY19idWZfdCAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBGaXJzdCByZW1vdmUgYW4gZW50cnkgdGhlbiBnbyBmb3IgZXhlY3V0aW9uICovCi0JUlBDUV9MT0NLKHdsLCBmbGFncyk7Ci0Jd2hpbGUgKHdsLT5ycGNxX2hlYWQpIHsKLQkJYnVmID0gd2wtPnJwY3FfaGVhZDsKLQkJd2wtPnJwY3FfaGVhZCA9IGJjbV9ycGNfYnVmX25leHRfZ2V0KHdsLT5ycGNfdGgsIGJ1Zik7Ci0KLQkJaWYgKHdsLT5ycGNxX2hlYWQgPT0gTlVMTCkKLQkJCXdsLT5ycGNxX3RhaWwgPSBOVUxMOwotCQlSUENRX1VOTE9DSyh3bCwgZmxhZ3MpOwotCi0JCVdMX0xPQ0sod2wpOwotCQl3bGNfcnBjX2hpZ2hfZGlzcGF0Y2goJndsLT5ycGNfZGlzcGF0Y2hfY3R4LCBidWYpOwotCQlXTF9VTkxPQ0sod2wpOwotCi0JCVJQQ1FfTE9DSyh3bCwgZmxhZ3MpOwotCX0KLQotCXdsLT5ycGNxX2Rpc3BhdGNoZWQgPSBmYWxzZTsKLQotCVJQQ1FfVU5MT0NLKHdsLCBmbGFncyk7Ci0KLQlrZnJlZSh0YXNrKTsKLQlhdG9taWNfZGVjKCZ3bC0+Y2FsbGJhY2tzKTsKLX0KLQotc3RhdGljIHZvaWQgd2xfcnBjcV9hZGQod2xfaW5mb190ICp3bCwgcnBjX2J1Zl90ICpidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWJjbV9ycGNfYnVmX25leHRfc2V0KHdsLT5ycGNfdGgsIGJ1ZiwgTlVMTCk7Ci0KLQkvKiBMb2NrIHRoZSBxdWV1ZSBhcyB0YXNrbGV0IGNvdWxkIGJlIHJ1bm5pbmcgYXQgdGhpcyB0aW1lICovCi0JUlBDUV9MT0NLKHdsLCBmbGFncyk7Ci0JaWYgKHdsLT5ycGNxX2hlYWQgPT0gTlVMTCkKLQkJd2wtPnJwY3FfaGVhZCA9IGJ1ZjsKLQllbHNlCi0JCWJjbV9ycGNfYnVmX25leHRfc2V0KHdsLT5ycGNfdGgsIHdsLT5ycGNxX3RhaWwsIGJ1Zik7Ci0KLQl3bC0+cnBjcV90YWlsID0gYnVmOwotCi0JaWYgKHdsLT5ycGNxX2Rpc3BhdGNoZWQgPT0gZmFsc2UpIHsKLQkJd2wtPnJwY3FfZGlzcGF0Y2hlZCA9IHRydWU7Ci0JCXdsX3NjaGVkdWxlX3Rhc2sod2wsIHdsX3JwY3FfZGlzcGF0Y2gsIHdsKTsKLQl9Ci0KLQlSUENRX1VOTE9DSyh3bCwgZmxhZ3MpOwotfQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgcnBjX25hbWVfdGJsW10gPSBSUENfSURfVEFCTEU7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLS8qIGRvbmdsZS1zaWRlIHJwYyBkaXNwYXRjaCByb3V0aW5lICovCi1zdGF0aWMgdm9pZCB3bF9ycGNfZGlzcGF0Y2hfc2NoZWR1bGUodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKQotewotCWJjbV94ZHJfYnVmX3QgYjsKLQl3bF9pbmZvX3QgKndsID0gKHdsX2luZm9fdCAqKSBjdHg7Ci0Jd2xjX3JwY19pZF90IHJwY19pZDsKLQlpbnQgZXJyOwotCi0JYmNtX3hkcl9idWZfaW5pdCgmYiwgYmNtX3JwY19idWZfZGF0YSh3bC0+cnBjX3RoLCBidWYpLAotCQkJIGJjbV9ycGNfYnVmX2xlbl9nZXQod2wtPnJwY190aCwgYnVmKSk7Ci0KLQllcnIgPSBiY21feGRyX3VucGFja191MzIoJmIsICZycGNfaWQpOwotCUFTU0VSVCghZXJyKTsKLQlXTF9UUkFDRSgoIiVzOiBEaXNwYXRjaCBpZCAlc1xuIiwgX19mdW5jX18sCi0JCSAgV0xDX1JQQ19JRF9MT09LVVAocnBjX25hbWVfdGJsLCBycGNfaWQpKSk7Ci0KLQkvKiBIYW5kbGUgZmV3IGVtZXJnZW5jeSBvbmVzICovCi0Jc3dpdGNoIChycGNfaWQpIHsKLQlkZWZhdWx0OgotCQl3bF9ycGNxX2FkZCh3bCwgYnVmKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bF90aW1lcl90YXNrKHdsX3Rhc2tfdCAqdGFzaykKLXsKLQl3bF90aW1lcl90ICp0ID0gKHdsX3RpbWVyX3QgKikgdGFzay0+Y29udGV4dDsKLQotCV93bF90aW1lcih0KTsKLQlrZnJlZSh0YXNrKTsKLQotCS8qIFRoaXMgZGVjIGlzIGZvciB0aGUgdGFza19zY2hlZHVsZS4gVGhlIHRpbWVyIHJlbGF0ZWQKLQkgKiBjYWxsYmFjayBpcyBkZWNyZW1lbnRlZCBpbiBfd2xfdGltZXIKLQkgKi8KLQlhdG9taWNfZGVjKCZ0LT53bC0+Y2FsbGJhY2tzKTsKLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi0KLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogY2hhciAqd2xfZmlybXdhcmVzW1dMX01BWF9GV10gPSB7CiAJImJyY20vYmNtNDN4eCIsCiAJTlVMTAogfTsKIAotI2lmZGVmIFdMQ19MT1cKLWludCB3bF91Y29kZV9pbml0X2J1Zih3bF9pbmZvX3QgKndsLCB2b2lkICoqcGJ1ZiwgdTMyIGlkeCkKK2ludCB3bF91Y29kZV9pbml0X2J1ZihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHZvaWQgKipwYnVmLCB1MzIgaWR4KQogewogCWludCBpLCBlbnRyeTsKIAljb25zdCB1OCAqcGRhdGE7CkBAIC0yMzAxLDcgKzE3MTksNyBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IHdsX3Vjb2RlX2luaXRfdWludCh3bF9pbmZvX3QgKndsLCB1MzIgKmRhdGEsIHUzMiBpZHgpCitpbnQgd2xfdWNvZGVfaW5pdF91aW50KHN0cnVjdCB3bF9pbmZvICp3bCwgdTMyICpkYXRhLCB1MzIgaWR4KQogewogCWludCBpLCBlbnRyeTsKIAljb25zdCB1OCAqcGRhdGE7CkBAIC0yMzIxLDIyICsxNzM5LDIxIEBACiAJcHJpbnRmKCJFUlJPUjogdWNvZGUgdGFnOiVkIGNhbiBub3QgYmUgZm91bmQhXG4iLCBpZHgpOwogCXJldHVybiAtMTsKIH0KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKLXN0YXRpYyBpbnQgd2xfcmVxdWVzdF9mdyh3bF9pbmZvX3QgKndsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgd2xfcmVxdWVzdF9mdyhzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWludCBzdGF0dXM7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJnBkZXYtPmRldjsKIAljaGFyIGZ3X25hbWVbMTAwXTsKIAlpbnQgaTsKIAotCWJ6ZXJvKCh2b2lkICopJndsLT5mdywgc2l6ZW9mKHN0cnVjdCB3bF9maXJtd2FyZSkpOworCW1lbXNldCgodm9pZCAqKSZ3bC0+ZncsIDAsIHNpemVvZihzdHJ1Y3Qgd2xfZmlybXdhcmUpKTsKIAlmb3IgKGkgPSAwOyBpIDwgV0xfTUFYX0ZXOyBpKyspIHsKIAkJaWYgKHdsX2Zpcm13YXJlc1tpXSA9PSBOVUxMKQogCQkJYnJlYWs7CiAJCXNwcmludGYoZndfbmFtZSwgIiVzLSVkLmZ3Iiwgd2xfZmlybXdhcmVzW2ldLAogCQkJVUNPREVfTE9BREVSX0FQSV9WRVIpOwotCQlXTF9OT05FKCgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSkpOworCQlXTF9OT05FKCJyZXF1ZXN0IGZ3ICVzXG4iLCBmd19uYW1lKTsKIAkJc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LmZ3X2JpbltpXSwgZndfbmFtZSwgZGV2aWNlKTsKIAkJaWYgKHN0YXR1cykgewogCQkJcHJpbnRmKCIlczogZmFpbCB0byBsb2FkIGZpcm13YXJlICVzXG4iLApAQCAtMjM0NCw3ICsxNzYxLDcgQEAKIAkJCXdsX3JlbGVhc2VfZncod2wpOwogCQkJcmV0dXJuIHN0YXR1czsKIAkJfQotCQlXTF9OT05FKCgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSkpOworCQlXTF9OT05FKCJyZXF1ZXN0IGZ3ICVzXG4iLCBmd19uYW1lKTsKIAkJc3ByaW50Zihmd19uYW1lLCAiJXNfaGRyLSVkLmZ3Iiwgd2xfZmlybXdhcmVzW2ldLAogCQkJVUNPREVfTE9BREVSX0FQSV9WRVIpOwogCQlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZ3bC0+ZncuZndfaGRyW2ldLCBmd19uYW1lLCBkZXZpY2UpOwpAQCAtMjM1NiwyMiArMTc3MywxOSBAQAogCQl9CiAJCXdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0gPQogCQkgICAgd2wtPmZ3LmZ3X2hkcltpXS0+c2l6ZSAvIChzaXplb2Yoc3RydWN0IHdsX2Z3X2hkcikpOwotCQlXTF9OT05FKCgicmVxdWVzdCBmdyAlcyBmaW5kOiAlZCBlbnRyaWVzXG4iLCBmd19uYW1lLAotCQkJIHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0pKTsKKwkJV0xfTk9ORSgicmVxdWVzdCBmdyAlcyBmaW5kOiAlZCBlbnRyaWVzXG4iLAorCQkJZndfbmFtZSwgd2wtPmZ3Lmhkcl9udW1fZW50cmllc1tpXSk7CiAJfQogCXdsLT5mdy5md19jbnQgPSBpOwotCXdsX3Vjb2RlX2RhdGFfaW5pdCh3bCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHdsX3Vjb2RlX2RhdGFfaW5pdCh3bCk7CiB9CiAKLSNpZmRlZiBXTENfTE9XCiB2b2lkIHdsX3Vjb2RlX2ZyZWVfYnVmKHZvaWQgKnApCiB7CiAJa2ZyZWUocCk7CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCi1zdGF0aWMgdm9pZCB3bF9yZWxlYXNlX2Z3KHdsX2luZm9fdCAqd2wpCitzdGF0aWMgdm9pZCB3bF9yZWxlYXNlX2Z3KHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSAwOyBpIDwgV0xfTUFYX0ZXOyBpKyspIHsKQEAgLTIzNzksNCArMTc5Myw1NCBAQAogCQlyZWxlYXNlX2Zpcm13YXJlKHdsLT5mdy5md19oZHJbaV0pOwogCX0KIH0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCisKKworLyoKKyAqIGNoZWNrcyB2YWxpZGl0eSBvZiBhbGwgZmlybXdhcmUgaW1hZ2VzIGxvYWRlZCBmcm9tIHVzZXIgc3BhY2UKKyAqLworaW50IHdsX2NoZWNrX2Zpcm13YXJlcyhzdHJ1Y3Qgd2xfaW5mbyAqd2wpCit7CisJaW50IGk7CisJaW50IGVudHJ5OworCWludCByYyA9IDA7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2hkcjsKKwlzdHJ1Y3Qgd2xfZndfaGRyICp1Y29kZV9oZHI7CisJZm9yIChpID0gMDsgaSA8IFdMX01BWF9GVyAmJiByYyA9PSAwOyBpKyspIHsKKwkJZncgPSAgd2wtPmZ3LmZ3X2JpbltpXTsKKwkJZndfaGRyID0gd2wtPmZ3LmZ3X2hkcltpXTsKKwkJaWYgKGZ3ID09IE5VTEwgJiYgZndfaGRyID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGZ3ID09IE5VTEwgfHwgZndfaGRyID09IE5VTEwpIHsKKwkJCVdMX0VSUk9SKCIlczogaW52YWxpZCBiaW4vaGRyIGZ3XG4iLCBfX2Z1bmNfXyk7CisJCQlyYyA9IC1FQkFERjsKKwkJfSBlbHNlIGlmIChmd19oZHItPnNpemUgJSBzaXplb2Yoc3RydWN0IHdsX2Z3X2hkcikpIHsKKwkJCVdMX0VSUk9SKCIlczogbm9uIGludGVncmFsIGZ3IGhkciBmaWxlIHNpemUgJWQvJXp1XG4iLAorCQkJCSBfX2Z1bmNfXywgZndfaGRyLT5zaXplLAorCQkJCSBzaXplb2Yoc3RydWN0IHdsX2Z3X2hkcikpOworCQkJcmMgPSAtRUJBREY7CisJCX0gZWxzZSBpZiAoZnctPnNpemUgPCBNSU5fRldfU0laRSB8fCBmdy0+c2l6ZSA+IE1BWF9GV19TSVpFKSB7CisJCQlXTF9FUlJPUigiJXM6IG91dCBvZiBib3VuZHMgZncgZmlsZSBzaXplICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgZnctPnNpemUpOworCQkJcmMgPSAtRUJBREY7CisJCX0gZWxzZSB7CisJCQkvKiBjaGVjayBpZiB1Y29kZSBzZWN0aW9uIG92ZXJydW5zIGZpcm13YXJlIGltYWdlICovCisJCQl1Y29kZV9oZHIgPSAoc3RydWN0IHdsX2Z3X2hkciAqKWZ3X2hkci0+ZGF0YTsKKwkJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0gJiYgcmM7CisJCQkgICAgIGVudHJ5KyssIHVjb2RlX2hkcisrKSB7CisJCQkJaWYgKHVjb2RlX2hkci0+b2Zmc2V0ICsgdWNvZGVfaGRyLT5sZW4gPgorCQkJCSAgICBmdy0+c2l6ZSkgeworCQkJCQlXTF9FUlJPUigiJXM6IGNvbmZsaWN0aW5nIGJpbi9oZHJcbiIsCisJCQkJCQkgX19mdW5jX18pOworCQkJCQlyYyA9IC1FQkFERjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHJjID09IDAgJiYgd2wtPmZ3LmZ3X2NudCAhPSBpKSB7CisJCVdMX0VSUk9SKCIlczogaW52YWxpZCBmd19jbnQ9JWRcbiIsIF9fZnVuY19fLCB3bC0+ZncuZndfY250KTsKKwkJcmMgPSAtRUJBREY7CisJfQorCXJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmgKaW5kZXggNzhjZWU0NC4uYmIzOWI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5oCkBAIC02MCw1OCArNjAsMzIgQEAKIH07CiAKIHN0cnVjdCB3bF9pbmZvIHsKLQl3bGNfcHViX3QgKnB1YjsJCS8qIHBvaW50ZXIgdG8gcHVibGljIHdsYyBzdGF0ZSAqLworCXN0cnVjdCB3bGNfcHViICpwdWI7CQkvKiBwb2ludGVyIHRvIHB1YmxpYyB3bGMgc3RhdGUgKi8KIAl2b2lkICp3bGM7CQkvKiBwb2ludGVyIHRvIHByaXZhdGUgY29tbW9uIG9zLWluZGVwZW5kZW50IGRhdGEgKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGVyICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZXIgKi8KIAl1MzIgbWFnaWM7CiAKIAlpbnQgaXJxOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwkvKiB1c2Ugc2VtYXBob3JlIHRvIGFsbG93IHNsZWVwICovCi0jZWxzZQogCXNwaW5sb2NrX3QgbG9jazsJLyogcGVyLWRldmljZSBwZXJpbWV0ZXIgbG9jayAqLwogCXNwaW5sb2NrX3QgaXNyX2xvY2s7CS8qIHBlci1kZXZpY2UgSVNSIHN5bmNocm9uaXphdGlvbiBsb2NrICovCi0jZW5kaWYKIAl1aW50IGJjbV9idXN0eXBlOwkvKiBidXMgdHlwZSAqLwogCWJvb2wgcGlvbW9kZTsJCS8qIHNldCBmcm9tIGluc21vZCBhcmd1bWVudCAqLwogCXZvaWQgKnJlZ3N2YTsJCS8qIG9wYXF1ZSBjaGlwIHJlZ2lzdGVycyB2aXJ0dWFsIGFkZHJlc3MgKi8KIAlhdG9taWNfdCBjYWxsYmFja3M7CS8qICMgb3V0c3RhbmRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zICovCiAJc3RydWN0IHdsX3RpbWVyICp0aW1lcnM7CS8qIHRpbWVyIGNsZWFudXAgcXVldWUgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsJLyogZHBjIHRhc2tsZXQgKi8KLSNpZmRlZiBCQ01TRElPCi0JYmNtc2RoX2luZm9fdCAqc2RoOwkvKiBwb2ludGVyIHRvIHNkaW8gYnVzIGhhbmRsZXIgKi8KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogY3VycmVudCBpcnEgZmxhZ3MgKi8KLSNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAJYm9vbCByZXNjaGVkOwkJLyogZHBjIG5lZWRzIHRvIGJlIGFuZCBpcyByZXNjaGVkdWxlZCAqLwogI2lmZGVmIExJTlVYU1RBX1BTCiAJdTMyIHBjaV9wc3N0YXRlWzE2XTsJLyogcGNpIHBzLXN0YXRlIHNhdmUvcmVzdG9yZSAqLwogI2VuZGlmCiAJLyogUlBDLCBoYW5kbGUsIGxvY2ssIHR4cSwgd29ya2l0ZW0gKi8KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JcnBjX2luZm9fdCAqcnBjOwkvKiBSUEMgaGFuZGxlICovCi0JcnBjX3RwX2luZm9fdCAqcnBjX3RoOwkvKiBSUEMgdHJhbnNwb3J0IGhhbmRsZSAqLwotCXdsY19ycGNfY3R4X3QgcnBjX2Rpc3BhdGNoX2N0eDsKLQotCWJvb2wgcnBjcV9kaXNwYXRjaGVkOwkvKiBBdm9pZCBzY2hlZHVsaW5nIG11bHRpcGxlIHRhc2tzICovCi0Jc3BpbmxvY2tfdCBycGNxX2xvY2s7CS8qIExvY2sgZm9yIHRoZSBxdWV1ZSAqLwotCXJwY19idWZfdCAqcnBjcV9oZWFkOwkvKiBSUEMgUSAqLwotCXJwY19idWZfdCAqcnBjcV90YWlsOwkvKiBQb2ludHMgdG8gdGhlIGxhc3QgYnVmICovCi0KLQlib29sIHR4cV9kaXNwYXRjaGVkOwkvKiBBdm9pZCBzY2hlZHVsaW5nIG11bHRpcGxlIHRhc2tzICovCi0Jc3BpbmxvY2tfdCB0eHFfbG9jazsJLyogTG9jayBmb3IgdGhlIHF1ZXVlICovCi0Jc3RydWN0IHNrX2J1ZmYgKnR4cV9oZWFkOwkvKiBUWCBRICovCi0Jc3RydWN0IHNrX2J1ZmYgKnR4cV90YWlsOwkvKiBQb2ludHMgdG8gdGhlIGxhc3QgYnVmICovCi0KLQl3bF90YXNrX3QgdHhxX3Rhc2s7CS8qIHdvcmsgcXVldWUgZm9yIHdsX3N0YXJ0KCkgKi8KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAJdWludCBzdGF0c19pZDsJCS8qIHRoZSBjdXJyZW50IHNldCBvZiBzdGF0cyAqLwogCS8qIHBpbmctcG9uZyBzdGF0cyBjb3VudGVycyB1cGRhdGVkIGJ5IExpbnV4IHdhdGNoZG9nICovCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHNfd2F0Y2hkb2dbMl07CiAJc3RydWN0IHdsX2Zpcm13YXJlIGZ3OwogfTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAjZGVmaW5lIFdMX0xPQ0sod2wpCXNwaW5fbG9ja19iaCgmKHdsKS0+bG9jaykKICNkZWZpbmUgV0xfVU5MT0NLKHdsKQlzcGluX3VubG9ja19iaCgmKHdsKS0+bG9jaykKIApAQCAtMTIyLDE3ICs5Niw2IEBACiAvKiBsb2NraW5nIHVuZGVyIFdMX0xPQ0soKSB0byBzeW5jaHJvbml6ZSB3aXRoIHdsX2lzciAqLwogI2RlZmluZSBJTlRfTE9DSyh3bCwgZmxhZ3MpCXNwaW5fbG9ja19pcnFzYXZlKCYod2wpLT5pc3JfbG9jaywgZmxhZ3MpCiAjZGVmaW5lIElOVF9VTkxPQ0sod2wsIGZsYWdzKQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYod2wpLT5pc3JfbG9jaywgZmxhZ3MpCi0jZWxzZQkJCQkvKiBCQ01TRElPICovCi0KLSNkZWZpbmUgV0xfTE9DSyh3bCkJZG93bigmKHdsKS0+c2VtKQotI2RlZmluZSBXTF9VTkxPQ0sod2wpCXVwKCYod2wpLT5zZW0pCi0KLSNkZWZpbmUgV0xfSVNSTE9DSyh3bCkKLSNkZWZpbmUgV0xfSVNSVU5MT0NLKHdsKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KLQotLyogaGFuZGxlIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IHdsX2luZm8gd2xfaW5mb190OwogCiAjaWZuZGVmIFBDSV9EMAogI2RlZmluZSBQQ0lfRDAJCTAKQEAgLTE0OCwxNCArMTExLDcgQEAKIAogZXh0ZXJuIGludCBfX2RldmluaXQgd2xfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1leHRlcm4gdm9pZCB3bF9mcmVlKHdsX2luZm9fdCAqd2wpOworZXh0ZXJuIHZvaWQgd2xfZnJlZShzdHJ1Y3Qgd2xfaW5mbyAqd2wpOwogZXh0ZXJuIGludCB3bF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7Ci1leHRlcm4gaW50IHdsX3Vjb2RlX2RhdGFfaW5pdCh3bF9pbmZvX3QgKndsKTsKLWV4dGVybiB2b2lkIHdsX3Vjb2RlX2RhdGFfZnJlZSh2b2lkKTsKLSNpZmRlZiBXTENfTE9XCi1leHRlcm4gdm9pZCB3bF91Y29kZV9mcmVlX2J1Zih2b2lkICopOwotZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X2J1Zih3bF9pbmZvX3QgKndsLCB2b2lkICoqcGJ1ZiwgdTMyIGlkeCk7Ci1leHRlcm4gaW50IHdsX3Vjb2RlX2luaXRfdWludCh3bF9pbmZvX3QgKndsLCB1MzIgKmRhdGEsIHUzMiBpZHgpOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogI2VuZGlmCQkJCS8qIF93bF9tYWM4MDIxMV9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlLmgKaW5kZXggYTFiYTM3Mi4uMmEwZjQwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZS5oCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNkZWZpbmUgTUlOX0ZXX1NJWkUgNDAwMDAJLyogbWluaW11bSBmaXJtd2FyZSBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgTUFYX0ZXX1NJWkUgMTUwMDAwCisKIHR5cGVkZWYgc3RydWN0IGQxMWluaXQgewogCXUxNiBhZGRyOwogCXUxNiBzaXplOwpAQCAtMzUsMyArMzgsMTIgQEAKIGV4dGVybiB1MzIgYmNtNDN4eF8yNF9sY25zejsKIGV4dGVybiB1MzIgKmJjbTQzeHhfYm9tbWFqb3I7CiBleHRlcm4gdTMyICpiY200M3h4X2JvbW1pbm9yOworCitleHRlcm4gaW50IHdsX3Vjb2RlX2RhdGFfaW5pdChzdHJ1Y3Qgd2xfaW5mbyAqd2wpOworZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZGF0YV9mcmVlKHZvaWQpOworCitleHRlcm4gaW50IHdsX3Vjb2RlX2luaXRfYnVmKHN0cnVjdCB3bF9pbmZvICp3bCwgdm9pZCAqKnBidWYsIHVuc2lnbmVkIGludCBpZHgpOworZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X3VpbnQoc3RydWN0IHdsX2luZm8gKndsLCB1bnNpZ25lZCAqZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBpZHgpOworZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZnJlZV9idWYodm9pZCAqKTsKK2V4dGVybiBpbnQgIHdsX2NoZWNrX2Zpcm13YXJlcyhzdHJ1Y3Qgd2xfaW5mbyAqd2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZV9sb2FkZXIuYwppbmRleCAwYjQxYTljLi4yM2UxMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZV9sb2FkZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZV9sb2FkZXIuYwpAQCAtMTQsMTcgKzE0LDEyIEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLXR5cGVkZWYgc3RydWN0IHdsX2luZm8gd2xfaW5mb190OwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPGQxMXVjb2RlX2V4dC5oPgogI2luY2x1ZGUgPHdsX3Vjb2RlLmg+CiAKLWV4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF9idWYod2xfaW5mb190ICp3bCwgdm9pZCAqKnBidWYsIHVuc2lnbmVkIGludCBpZHgpOwotZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X3VpbnQod2xfaW5mb190ICp3bCwgdW5zaWduZWQgKmRhdGEsIHVuc2lnbmVkIGludCBpZHgpOwotZXh0ZXJuIGludCB3bF91Y29kZV9kYXRhX2luaXQod2xfaW5mb190ICp3bCk7Ci1leHRlcm4gdm9pZCB3bF91Y29kZV9kYXRhX2ZyZWUodm9pZCk7Ci1leHRlcm4gdm9pZCB3bF91Y29kZV9mcmVlX2J1Zih2b2lkICopOworCiAKIGQxMWluaXRfdCAqZDExbGNuMGJzaW5pdHZhbHMyNDsKIGQxMWluaXRfdCAqZDExbGNuMGluaXR2YWxzMjQ7CkBAIC00Miw4ICszNywxMiBAQAogdTMyICpiY200M3h4X2JvbW1ham9yOwogdTMyICpiY200M3h4X2JvbW1pbm9yOwogCi1pbnQgd2xfdWNvZGVfZGF0YV9pbml0KHdsX2luZm9fdCAqd2wpCitpbnQgd2xfdWNvZGVfZGF0YV9pbml0KHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKKwlpbnQgcmM7CisJcmMgPSB3bF9jaGVja19maXJtd2FyZXMod2wpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKIAl3bF91Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMWxjbjBic2luaXR2YWxzMjQsCiAJCQkgIEQxMUxDTjBCU0lOSVRWQUxTMjQpOwogCXdsX3Vjb2RlX2luaXRfYnVmKHdsLCAodm9pZCAqKikmZDExbGNuMGluaXR2YWxzMjQsIEQxMUxDTjBJTklUVkFMUzI0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FsbG9jLmMKaW5kZXggMmRjODlmOS4uNzQ2NDM5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FsbG9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FsbG9jLmMKQEAgLTE3LDI4ICsxNywzMyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHNpdXRpbHMuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX3B1Yi5oPgogI2luY2x1ZGUgPHdsY19rZXkuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CisjaW5jbHVkZSA8d2xjX2V2ZW50Lmg+CiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAjaW5jbHVkZSA8d2xjX2FsbG9jLmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKLXN0YXRpYyB3bGNfcHViX3QgKndsY19wdWJfbWFsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCAqZXJyLAotCQkJCSB1aW50IGRldmlkKTsKLXN0YXRpYyB2b2lkIHdsY19wdWJfbWZyZWUob3NsX3QgKm9zaCwgd2xjX3B1Yl90ICpwdWIpOworc3RhdGljIHN0cnVjdCB3bGNfcHViICp3bGNfcHViX21hbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0LAorCQkJCSAgICAgIHVpbnQgKmVyciwgdWludCBkZXZpZCk7CitzdGF0aWMgdm9pZCB3bGNfcHViX21mcmVlKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgd2xjX3B1YiAqcHViKTsKIHN0YXRpYyB2b2lkIHdsY190dW5hYmxlc19pbml0KHdsY190dW5hYmxlc190ICp0dW5hYmxlcywgdWludCBkZXZpZCk7CiAKLXZvaWQgKndsY19jYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0LCB1aW50IHNpemUpCit2b2lkICp3bGNfY2FsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQsIHVpbnQgc2l6ZSkKIHsKIAl2b2lkICppdGVtOwogCiAJaXRlbSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeVxuIiwgdW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBvdXQgb2YgbWVtb3J5XG4iLCB1bml0LCBfX2Z1bmNfXyk7CiAJcmV0dXJuIGl0ZW07CiB9CiAKQEAgLTU4LDE4ICs2MywxNCBAQAogCXR1bmFibGVzLT5hbXBkdWRhdGFoaXdhdCA9IFdMQ19BTVBEVURBVEFISVdBVDsKIAl0dW5hYmxlcy0+cnhibmQgPSBSWEJORDsKIAl0dW5hYmxlcy0+dHhzYm5kID0gVFhTQk5EOwotI2lmIGRlZmluZWQoV0xDX0hJR0hfT05MWSkgJiYgZGVmaW5lZChOVFhEX1VTQl80MzE5KQotCWlmIChkZXZpZCA9PSBCQ000MzE5X0NISVBfSUQpIHsKLQkJdHVuYWJsZXMtPm50eGQgPSBOVFhEX1VTQl80MzE5OwotCX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiB9CiAKLXN0YXRpYyB3bGNfcHViX3QgKndsY19wdWJfbWFsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCAqZXJyLCB1aW50IGRldmlkKQorc3RhdGljIHN0cnVjdCB3bGNfcHViICp3bGNfcHViX21hbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0LAorCQkJCSAgICAgIHVpbnQgKmVyciwgdWludCBkZXZpZCkKIHsKLQl3bGNfcHViX3QgKnB1YjsKKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwogCi0JcHViID0gKHdsY19wdWJfdCAqKSB3bGNfY2FsbG9jKG9zaCwgdW5pdCwgc2l6ZW9mKHdsY19wdWJfdCkpOworCXB1YiA9IChzdHJ1Y3Qgd2xjX3B1YiAqKSB3bGNfY2FsbG9jKG9zaCwgdW5pdCwgc2l6ZW9mKHN0cnVjdCB3bGNfcHViKSk7CiAJaWYgKHB1YiA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDAxOwogCQlnb3RvIGZhaWw7CkBAIC05OSw3ICsxMDAsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfcHViX21mcmVlKG9zbF90ICpvc2gsIHdsY19wdWJfdCAqcHViKQorc3RhdGljIHZvaWQgd2xjX3B1Yl9tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHdsY19wdWIgKnB1YikKIHsKIAlpZiAocHViID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTExNCw3ICsxMTUsNyBAQAogCWtmcmVlKHB1Yik7CiB9CiAKLXdsY19ic3NjZmdfdCAqd2xjX2Jzc2NmZ19tYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0KQord2xjX2Jzc2NmZ190ICp3bGNfYnNzY2ZnX21hbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0KQogewogCXdsY19ic3NjZmdfdCAqY2ZnOwogCkBAIC0xMzQsNyArMTM1LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCB3bGNfYnNzY2ZnX21mcmVlKG9zbF90ICpvc2gsIHdsY19ic3NjZmdfdCAqY2ZnKQordm9pZCB3bGNfYnNzY2ZnX21mcmVlKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB3bGNfYnNzY2ZnX3QgKmNmZykKIHsKIAlpZiAoY2ZnID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTE1NSw3ICsxNTYsNyBAQAogCWtmcmVlKGNmZyk7CiB9CiAKLXZvaWQgd2xjX2Jzc2NmZ19JRF9hc3NpZ24od2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmJzc2NmZykKK3ZvaWQgd2xjX2Jzc2NmZ19JRF9hc3NpZ24oc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19ic3NjZmdfdCAqYnNzY2ZnKQogewogCWJzc2NmZy0+SUQgPSB3bGMtPm5leHRfYnNzY2ZnX0lEOwogCXdsYy0+bmV4dF9ic3NjZmdfSUQrKzsKQEAgLTE2NCwxMSArMTY1LDEzIEBACiAvKgogICogVGhlIGNvbW1vbiBkcml2ZXIgZW50cnkgcm91dGluZS4gRXJyb3IgY29kZXMgc2hvdWxkIGJlIHVuaXF1ZQogICovCi13bGNfaW5mb190ICp3bGNfYXR0YWNoX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwgdWludCBkZXZpZCkKK3N0cnVjdCB3bGNfaW5mbyAqd2xjX2F0dGFjaF9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwgdWludCAqZXJyLAorCQkJICAgICAgdWludCBkZXZpZCkKIHsKLQl3bGNfaW5mb190ICp3bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGM7CiAKLQl3bGMgPSAod2xjX2luZm9fdCAqKSB3bGNfY2FsbG9jKG9zaCwgdW5pdCwgc2l6ZW9mKHdsY19pbmZvX3QpKTsKKwl3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIHdsY19jYWxsb2Mob3NoLCB1bml0LAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgd2xjX2luZm8pKTsKIAlpZiAod2xjID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMDI7CiAJCWdvdG8gZmFpbDsKQEAgLTE3Niw3ICsxNzksNyBAQAogCiAJd2xjLT5od3J4b2ZmID0gV0xfSFdSWE9GRjsKIAotCS8qIGFsbG9jYXRlIHdsY19wdWJfdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKwkvKiBhbGxvY2F0ZSBzdHJ1Y3Qgd2xjX3B1YiBzdGF0ZSBzdHJ1Y3R1cmUgKi8KIAl3bGMtPnB1YiA9IHdsY19wdWJfbWFsbG9jKG9zaCwgdW5pdCwgZXJyLCBkZXZpZCk7CiAJaWYgKHdsYy0+cHViID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMDM7CkBAIC0xODQsMTcgKzE4NywxNiBAQAogCX0KIAl3bGMtPnB1Yi0+d2xjID0gd2xjOwogCi0JLyogYWxsb2NhdGUgd2xjX2h3X2luZm9fdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKwkvKiBhbGxvY2F0ZSBzdHJ1Y3Qgd2xjX2h3X2luZm8gc3RhdGUgc3RydWN0dXJlICovCiAKLQl3bGMtPmh3ID0gKHdsY19od19pbmZvX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKLQkJc2l6ZW9mKHdsY19od19pbmZvX3QpKTsKKwl3bGMtPmh3ID0gKHN0cnVjdCB3bGNfaHdfaW5mbyAqKXdsY19jYWxsb2Mob3NoLCB1bml0LAorCQlzaXplb2Yoc3RydWN0IHdsY19od19pbmZvKSk7CiAJaWYgKHdsYy0+aHcgPT0gTlVMTCkgewogCQkqZXJyID0gMTAwNTsKIAkJZ290byBmYWlsOwogCX0KIAl3bGMtPmh3LT53bGMgPSB3bGM7CiAKLSNpZmRlZiBXTENfTE9XCiAJd2xjLT5ody0+YmFuZHN0YXRlWzBdID0gKHdsY19od2JhbmRfdCAqKXdsY19jYWxsb2Mob3NoLCB1bml0LAogCQkoc2l6ZW9mKHdsY19od2JhbmRfdCkgKiBNQVhCQU5EUykpOwogCWlmICh3bGMtPmh3LT5iYW5kc3RhdGVbMF0gPT0gTlVMTCkgewpAQCAtMjA5LDcgKzIxMSw2IEBACiAJCQkgICAgIChzaXplb2Yod2xjX2h3YmFuZF90KSAqIGkpKTsKIAkJfQogCX0KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAl3bGMtPm1vZHVsZWNiID0gKG1vZHVsZWNiX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKIAkJc2l6ZW9mKG1vZHVsZWNiX3QpICogV0xDX01BWE1PRFVMRVMpOwpAQCAtMjY2LDggKzI2Nyw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQl3bGMtPmJhbmRzdGF0ZVswXSA9ICh3bGNiYW5kX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKLQkJCQkoc2l6ZW9mKHdsY2JhbmRfdCkgKiBNQVhCQU5EUykpOworCXdsYy0+YmFuZHN0YXRlWzBdID0gKHN0cnVjdCB3bGNiYW5kICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCisJCQkJKHNpemVvZihzdHJ1Y3Qgd2xjYmFuZCkqTUFYQkFORFMpKTsKIAlpZiAod2xjLT5iYW5kc3RhdGVbMF0gPT0gTlVMTCkgewogCQkqZXJyID0gMTAyNTsKIAkJZ290byBmYWlsOwpAQCAtMjc2LDEyICsyNzcsMTMgQEAKIAogCQlmb3IgKGkgPSAxOyBpIDwgTUFYQkFORFM7IGkrKykgewogCQkJd2xjLT5iYW5kc3RhdGVbaV0gPQotCQkJICAgICh3bGNiYW5kX3QgKikgKCh1bnNpZ25lZCBsb25nKXdsYy0+YmFuZHN0YXRlWzBdICsKLQkJCQkJICAgKHNpemVvZih3bGNiYW5kX3QpICogaSkpOworCQkJICAgIChzdHJ1Y3Qgd2xjYmFuZCAqKSAoKHVuc2lnbmVkIGxvbmcpd2xjLT5iYW5kc3RhdGVbMF0KKwkJCSAgICArIChzaXplb2Yoc3RydWN0IHdsY2JhbmQpKmkpKTsKIAkJfQogCX0KIAotCXdsYy0+Y29yZXN0YXRlID0gKHdsY2NvcmVfdCAqKXdsY19jYWxsb2Mob3NoLCB1bml0LCBzaXplb2Yod2xjY29yZV90KSk7CisJd2xjLT5jb3Jlc3RhdGUgPSAoc3RydWN0IHdsY2NvcmUgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKKwkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgd2xjY29yZSkpOwogCWlmICh3bGMtPmNvcmVzdGF0ZSA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDI2OwogCQlnb3RvIGZhaWw7CkBAIC0zMDEsNyArMzAzLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCB3bGNfZGV0YWNoX21mcmVlKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCkKK3ZvaWQgd2xjX2RldGFjaF9tZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0zNTUsMTIgKzM1NywxMCBAQAogCX0KIAogCWlmICh3bGMtPmh3KSB7Ci0jaWZkZWYgV0xDX0xPVwogCQlpZiAod2xjLT5ody0+YmFuZHN0YXRlWzBdKSB7CiAJCQlrZnJlZSh3bGMtPmh3LT5iYW5kc3RhdGVbMF0pOwogCQkJd2xjLT5ody0+YmFuZHN0YXRlWzBdID0gTlVMTDsKIAkJfQotI2VuZGlmCiAKIAkJLyogZnJlZSBodyBzdHJ1Y3QgKi8KIAkJa2ZyZWUod2xjLT5odyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5oCmluZGV4IDY3OGEyYjkuLmFjMzRmNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5oCkBAIC0xNCwxMiArMTQsMTIgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotZXh0ZXJuIHZvaWQgKndsY19jYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0LCB1aW50IHNpemUpOworZXh0ZXJuIHZvaWQgKndsY19jYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwgdWludCBzaXplKTsKIAotZXh0ZXJuIHdsY19pbmZvX3QgKndsY19hdHRhY2hfbWFsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCAqZXJyLAotCQkJCSAgICAgdWludCBkZXZpZCk7Ci1leHRlcm4gdm9pZCB3bGNfZGV0YWNoX21mcmVlKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCk7CitleHRlcm4gc3RydWN0IHdsY19pbmZvICp3bGNfYXR0YWNoX21hbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0LAorCQkJCQkgIHVpbnQgKmVyciwgdWludCBkZXZpZCk7CitleHRlcm4gdm9pZCB3bGNfZGV0YWNoX21mcmVlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKIHN0cnVjdCB3bGNfYnNzY2ZnOwotZXh0ZXJuIHN0cnVjdCB3bGNfYnNzY2ZnICp3bGNfYnNzY2ZnX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQpOwotZXh0ZXJuIHZvaWQgd2xjX2Jzc2NmZ19tZnJlZShvc2xfdCAqb3NoLCBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqY2ZnKTsKK2V4dGVybiBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqd2xjX2Jzc2NmZ19tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCk7CitleHRlcm4gdm9pZCB3bGNfYnNzY2ZnX21mcmVlKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqY2ZnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmMKaW5kZXggYTRlNDlmMy4uZDc0OTkxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmMKQEAgLTE2LDE5ICsxNiwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KLSNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CiAjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDxobmRkbWEuaD4KICNpbmNsdWRlIDxkMTEuaD4KICNpbmNsdWRlIDx3bGNfcmF0ZS5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CisjaW5jbHVkZSA8d2xjX2V2ZW50Lmg+CiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9oYWwuaD4KICNpbmNsdWRlIDx3bGNfYW50c2VsLmg+CkBAIC0zNiwxMSArMzYsOCBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19hbXBkdS5oPgogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgorI2luY2x1ZGUgPHdsX2RiZy5oPgogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotI2luY2x1ZGUgPGJjbV9ycGNfdHAuaD4KLSNpbmNsdWRlIDx3bGNfcnBjdHguaD4KLSNlbmRpZgogCiAjZGVmaW5lIEFNUERVX01BWF9NUERVCQkzMgkvKiBtYXggbnVtYmVyIG9mIG1wZHVzIGluIGFuIGFtcGR1ICovCiAjZGVmaW5lIEFNUERVX05VTV9NUERVX0xFR0FDWQkxNgkvKiBtYXggbnVtYmVyIG9mIG1wZHVzIGluIGFuIGFtcGR1IHRvIGEgbGVnYWN5ICovCkBAIC0xMDEsNyArOTgsNyBAQAogCiAvKiBBTVBEVSBtb2R1bGUgc3BlY2lmaWMgc3RhdGUgKi8KIHN0cnVjdCBhbXBkdV9pbmZvIHsKLQl3bGNfaW5mb190ICp3bGM7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGMgc3RydWN0dXJlICovCisJc3RydWN0IHdsY19pbmZvICp3bGM7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGMgc3RydWN0dXJlICovCiAJaW50IHNjYl9oYW5kbGU7CQkvKiBzY2IgY3ViYnkgaGFuZGxlIHRvIHJldHJpZXZlIGRhdGEgZnJvbSBzY2IgKi8KIAl1OCBpbmlfZW5hYmxlW0FNUERVX01BWF9TQ0JfVElEXTsJLyogcGVyLXRpZCBpbml0aWF0b3IgZW5hYmxlL2Rpc2FibGUgb2YgYW1wZHUgKi8KIAl1OCBiYV90eF93c2l6ZTsJLyogVHggYmEgd2luZG93IHNpemUgKGluIHBkdSkgKi8KQEAgLTEyNSwxMSArMTIyLDYgQEAKIAkJCQkgKi8KIAl3bGNfZmlmb19pbmZvX3QgZmlmb190YltOVU1fRkZQTERfRklGT107CS8qIHRhYmxlIG9mIGZpZm8gaW5mb3MgICovCiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jdm9pZCAqcDsKLQl0eF9zdGF0dXNfdCB0eHM7Ci0JYm9vbCB3YWl0aW5nX3N0YXR1czsJLyogVG8gaGVscCBzYW5pdHkgY2hlY2tzICovCi0jZW5kaWYKIH07CiAKICNkZWZpbmUgQU1QRFVfQ0xFQU5VUEZMQUdfUlggICAoMHgxKQpAQCAtMTM4LDM4ICsxMzAsMzkgQEAKICNkZWZpbmUgU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpICgmKHNjYi0+c2NiX2FtcGR1KSkKICNkZWZpbmUgU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHRpZCkgKCYoc2NiX2FtcGR1LT5pbmlbdGlkXSkpCiAKLXN0YXRpYyB2b2lkIHdsY19mZnBsZF9pbml0KGFtcGR1X2luZm9fdCAqYW1wZHUpOwotc3RhdGljIGludCB3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGNfaW5mb190ICp3bGMsIGludCBmKTsKLXN0YXRpYyB2b2lkIHdsY19mZnBsZF9jYWxjX21jczJhbXBkdV90YWJsZShhbXBkdV9pbmZvX3QgKmFtcGR1LCBpbnQgZik7CitzdGF0aWMgdm9pZCB3bGNfZmZwbGRfaW5pdChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOworc3RhdGljIGludCB3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGYpOworc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgaW50IGYpOwogCi1zdGF0aWMgc2NiX2FtcGR1X3RpZF9pbmlfdCAqd2xjX2FtcGR1X2luaXRfdGlkX2luaShhbXBkdV9pbmZvX3QgKmFtcGR1LAorc3RhdGljIHNjYl9hbXBkdV90aWRfaW5pX3QgKndsY19hbXBkdV9pbml0X3RpZF9pbmkoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LAogCQkJCQkJICAgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwKIAkJCQkJCSAgIHU4IHRpZCwgYm9vbCBvdmVycmlkZSk7Ci1zdGF0aWMgdm9pZCBhbXBkdV9jbGVhbnVwX3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwKK3N0YXRpYyB2b2lkIGFtcGR1X2NsZWFudXBfdGlkX2luaShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCisJCQkJICBzY2JfYW1wZHVfdCAqc2NiX2FtcGR1LAogCQkJCSAgdTggdGlkLCBib29sIGZvcmNlKTsKLXN0YXRpYyB2b2lkIGFtcGR1X3VwZGF0ZV9tYXhfdHhsZW4oYW1wZHVfaW5mb190ICphbXBkdSwgdTggZHVyKTsKLXN0YXRpYyB2b2lkIHNjYl9hbXBkdV91cGRhdGVfY29uZmlnKGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYik7Ci1zdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZ19hbGwoYW1wZHVfaW5mb190ICphbXBkdSk7CitzdGF0aWMgdm9pZCBhbXBkdV91cGRhdGVfbWF4X3R4bGVuKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgdTggZHVyKTsKK3N0YXRpYyB2b2lkIHNjYl9hbXBkdV91cGRhdGVfY29uZmlnKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKTsKK3N0YXRpYyB2b2lkIHNjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwogCiAjZGVmaW5lIHdsY19hbXBkdV90eGZsb3djb250cm9sKGEsIGIsIGMpCWRvIHt9IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZCB3bGNfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCi0JCQkJCSAgdm9pZCAqcCwgdHhfc3RhdHVzX3QgKnR4cywKLQkJCQkJICB1MzIgZnJtdHhzdGF0dXMsCi0JCQkJCSAgdTMyIGZybXR4c3RhdHVzMik7CitzdGF0aWMgdm9pZCB3bGNfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCisJCQkJCSAgc3RydWN0IHNjYiAqc2NiLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpwLCB0eF9zdGF0dXNfdCAqdHhzLAorCQkJCQkgIHUzMiBmcm10eHN0YXR1cywgdTMyIGZybXR4c3RhdHVzMik7CiAKLXN0YXRpYyBpbmxpbmUgdTE2IHBrdF90eGhfc2VxbnVtKHdsY19pbmZvX3QgKndsYywgdm9pZCAqcCkKK3N0YXRpYyBpbmxpbmUgdTE2IHBrdF90eGhfc2VxbnVtKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlkMTF0eGhfdCAqdHhoOwogCXN0cnVjdCBkb3QxMV9oZWFkZXIgKmg7Ci0JdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocCk7CisJdHhoID0gKGQxMXR4aF90ICopIHAtPmRhdGE7CiAJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKCh1OCAqKSAodHhoICsgMSkgKyBEMTFfUEhZX0hEUl9MRU4pOwogCXJldHVybiBsdG9oMTYoaC0+c2VxKSA+PiBTRVFOVU1fU0hJRlQ7CiB9CiAKLWFtcGR1X2luZm9fdCAqd2xjX2FtcGR1X2F0dGFjaCh3bGNfaW5mb190ICp3bGMpCitzdHJ1Y3QgYW1wZHVfaW5mbyAqd2xjX2FtcGR1X2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlhbXBkdV9pbmZvX3QgKmFtcGR1OworCXN0cnVjdCBhbXBkdV9pbmZvICphbXBkdTsKIAlpbnQgaTsKIAogCS8qIHNvbWUgY29kZSBkZXBlbmRzIG9uIHBhY2tlZCBzdHJ1Y3R1cmVzICovCkBAIC0xNzksOSArMTcyLDEwIEBACiAJQVNTRVJUKHdsYy0+cHViLT50dW5hYmxlcy0+YW1wZHVudW1tcGR1IDw9IEFNUERVX01BWF9NUERVKTsKIAlBU1NFUlQod2xjLT5wdWItPnR1bmFibGVzLT5hbXBkdW51bW1wZHUgPiAwKTsKIAotCWFtcGR1ID0ga3phbGxvYyhzaXplb2YoYW1wZHVfaW5mb190KSwgR0ZQX0FUT01JQyk7CisJYW1wZHUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW1wZHVfaW5mbyksIEdGUF9BVE9NSUMpOwogCWlmICghYW1wZHUpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYW1wZHVfYXR0YWNoOiBvdXQgb2YgbWVtXG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2FtcGR1X2F0dGFjaDogb3V0IG9mIG1lbVxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlhbXBkdS0+d2xjID0gd2xjOwpAQCAtMjA5LDEwICsyMDMsNiBAQAogCQlhbXBkdS0+cnhfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzMySzsKIAllbHNlCiAJCWFtcGR1LT5yeF9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfNjRLOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBSZXN0cmljdCB0byBzbWFsbGVyIHJjdiBzaXplIGZvciBCTUFDIGRvbmdsZSAqLwotCWFtcGR1LT5yeF9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfMzJLOwotI2VuZGlmCiAJYW1wZHUtPnJldHJ5X2xpbWl0ID0gQU1QRFVfREVGX1JFVFJZX0xJTUlUOwogCWFtcGR1LT5ycl9yZXRyeV9saW1pdCA9IEFNUERVX0RFRl9SUl9SRVRSWV9MSU1JVDsKIApAQCAtMjMyLDcgKzIyMiw3IEBACiAJcmV0dXJuIGFtcGR1OwogfQogCi12b2lkIHdsY19hbXBkdV9kZXRhY2goYW1wZHVfaW5mb190ICphbXBkdSkKK3ZvaWQgd2xjX2FtcGR1X2RldGFjaChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJaW50IGk7CiAKQEAgLTI1MCwxMiArMjQwLDEyIEBACiAJa2ZyZWUoYW1wZHUpOwogfQogCi12b2lkIHNjYl9hbXBkdV9jbGVhbnVwKGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYikKK3ZvaWQgc2NiX2FtcGR1X2NsZWFudXAoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIAl1OCB0aWQ7CiAKLQlXTF9BTVBEVV9VUEROKCgic2NiX2FtcGR1X2NsZWFudXA6IGVudGVyXG4iKSk7CisJV0xfQU1QRFVfVVBETigic2NiX2FtcGR1X2NsZWFudXA6IGVudGVyXG4iKTsKIAlBU1NFUlQoc2NiX2FtcGR1KTsKIAogCWZvciAodGlkID0gMDsgdGlkIDwgQU1QRFVfTUFYX1NDQl9USUQ7IHRpZCsrKSB7CkBAIC0yNjYsMTIgKzI1NiwxMiBAQAogLyogcmVzZXQgdGhlIGFtcGR1IHN0YXRlIG1hY2hpbmUgc28gdGhhdCBpdCBjYW4gZ3JhY2VmdWxseSBoYW5kbGUgcGFja2V0cyB0aGF0IHdlcmUKICAqIGZyZWVkIGZyb20gdGhlIGRtYSBhbmQgdHggcXVldWVzIGR1cmluZyByZWluaXQKICAqLwotdm9pZCB3bGNfYW1wZHVfcmVzZXQoYW1wZHVfaW5mb190ICphbXBkdSkKK3ZvaWQgd2xjX2FtcGR1X3Jlc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKIHsKLQlXTF9OT05FKCgiJXM6IEVudGVyaW5nXG4iLCBfX2Z1bmNfXykpOworCVdMX05PTkUoIiVzOiBFbnRlcmluZ1xuIiwgX19mdW5jX18pOwogfQogCi1zdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCitzdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYikKIHsKIAlzY2JfYW1wZHVfdCAqc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwogCWludCBpOwpAQCAtMzAxLDEyICsyOTEsMTIgQEAKIAlBU1NFUlQoc2NiX2FtcGR1LT5yZWxlYXNlKTsKIH0KIAotdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZ19hbGwoYW1wZHVfaW5mb190ICphbXBkdSkKK3ZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWdfYWxsKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKIHsKIAlzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhhbXBkdSwgYW1wZHUtPndsYy0+cHViLT5nbG9iYWxfc2NiKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2luaXQoYW1wZHVfaW5mb190ICphbXBkdSkKK3N0YXRpYyB2b2lkIHdsY19mZnBsZF9pbml0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKIHsKIAlpbnQgaSwgajsKIAl3bGNfZmlmb19pbmZvX3QgKmZpZm87CkBAIC0zMzAsOSArMzIwLDkgQEAKICAqIFJldHVybiAxIGlmIHByZS1sb2FkaW5nIG5vdCBhY3RpdmUsIC0xIGlmIG5vdCBhbiB1bmRlcmZsb3cgZXZlbnQsCiAgKiAwIGlmIHByZS1sb2FkaW5nIG1vZHVsZSB0b29rIGNhcmUgb2YgdGhlIGV2ZW50LgogICovCi1zdGF0aWMgaW50IHdsY19mZnBsZF9jaGVja190eGZ1bmZsKHdsY19pbmZvX3QgKndsYywgaW50IGZpZCkKK3N0YXRpYyBpbnQgd2xjX2ZmcGxkX2NoZWNrX3R4ZnVuZmwoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBmaWQpCiB7Ci0JYW1wZHVfaW5mb190ICphbXBkdSA9IHdsYy0+YW1wZHU7CisJc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1ID0gd2xjLT5hbXBkdTsKIAl1MzIgcGh5X3JhdGUgPSBNQ1NfUkFURShGRlBMRF9NQVhfTUNTLCB0cnVlLCBmYWxzZSk7CiAJdTMyIHR4dW5mbF9yYXRpbzsKIAl1OCBtYXhfbXBkdTsKQEAgLTM0OSw3ICszMzksNyBAQAogCQkJIE1fVUNPREVfTUFDU1RBVCArIG9mZnNldG9mKG1hY3N0YXRfdCwgdHhmdW5mbFtmaWRdKSk7CiAJbmV3X3R4dW5mbCA9ICh1MTYpIChjdXJfdHh1bmZsIC0gZmlmby0+cHJldl90eGZ1bmZsKTsKIAlpZiAobmV3X3R4dW5mbCA9PSAwKSB7Ci0JCVdMX0ZGUExEKCgiY2hlY2tfdHh1bmZsIDogVFggc3RhdHVzIEZSQUcgc2V0IGJ1dCBubyB0eCB1bmRlcmZsb3dzXG4iKSk7CisJCVdMX0ZGUExEKCJjaGVja190eHVuZmwgOiBUWCBzdGF0dXMgRlJBRyBzZXQgYnV0IG5vIHR4IHVuZGVyZmxvd3NcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCWZpZm8tPnByZXZfdHhmdW5mbCA9IGN1cl90eHVuZmw7CkBAIC0zNTksNyArMzQ5LDcgQEAKIAogCS8qIGNoZWNrIGlmIGZpZm8gaXMgYmlnIGVub3VnaCAqLwogCWlmICh3bGNfeG10Zmlmb19zel9nZXQod2xjLCBmaWQsICZ4bXRmaWZvX3N6KSkgewotCQlXTF9GRlBMRCgoImNoZWNrX3R4dW5mbCA6IGdldCB4bXRmaWZvX3N6IGZhaWxlZC5cbiIpKTsKKwkJV0xfRkZQTEQoImNoZWNrX3R4dW5mbCA6IGdldCB4bXRmaWZvX3N6IGZhaWxlZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTM3Myw4ICszNjMsOCBAQAogCWlmIChmaWZvLT5hY2N1bV90eGZ1bmZsIDwgMTApCiAJCXJldHVybiAwOwogCi0JV0xfRkZQTEQoKCJhbXBkdV9jb3VudCAlZCAgdHhfdW5kZXJmbG93cyAlZFxuIiwKLQkJICBjdXJyZW50X2FtcGR1X2NudCwgZmlmby0+YWNjdW1fdHhmdW5mbCkpOworCVdMX0ZGUExEKCJhbXBkdV9jb3VudCAlZCAgdHhfdW5kZXJmbG93cyAlZFxuIiwKKwkJIGN1cnJlbnRfYW1wZHVfY250LCBmaWZvLT5hY2N1bV90eGZ1bmZsKTsKIAogCS8qCiAJICAgY29tcHV0ZSB0aGUgY3VycmVudCByYXRpbyBvZiB0eCB1bmZsIHBlciBhbXBkdS4KQEAgLTQyNyw4ICs0MTcsOCBAQAogCQkgICAgICAobWF4X21wZHUgKiBGRlBMRF9NUERVX1NJWkUgLSBmaWZvLT5hbXBkdV9wbGRfc2l6ZSkpCiAJCSAgICAgLyAobWF4X21wZHUgKiBGRlBMRF9NUERVX1NJWkUpKSAqIDEwMDsKIAotCQlXTF9GRlBMRCgoIkRNQSBlc3RpbWF0ZWQgdHJhbnNmZXIgcmF0ZSAlZDsgcHJlLWxvYWQgc2l6ZSAlZFxuIiwKLQkJCSAgZmlmby0+ZG1heGZlcnJhdGUsIGZpZm8tPmFtcGR1X3BsZF9zaXplKSk7CisJCVdMX0ZGUExEKCJETUEgZXN0aW1hdGVkIHRyYW5zZmVyIHJhdGUgJWQ7IHByZS1sb2FkIHNpemUgJWRcbiIsCisJCQkgZmlmby0+ZG1heGZlcnJhdGUsIGZpZm8tPmFtcGR1X3BsZF9zaXplKTsKIAl9IGVsc2UgewogCiAJCS8qIGRlY3JlYXNlIGFtcGR1IHNpemUgKi8KQEAgLTQ1MCw3ICs0NDAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoYW1wZHVfaW5mb190ICphbXBkdSwgaW50IGYpCitzdGF0aWMgdm9pZCB3bGNfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBpbnQgZikKIHsKIAlpbnQgaTsKIAl1MzIgcGh5X3JhdGUsIGRtYV9yYXRlLCB0bXA7CkBAIC00ODMsMTEgKzQ3MywxMiBAQAogfQogCiBzdGF0aWMgdm9pZCBCQ01GQVNUUEFUSAotd2xjX2FtcGR1X2FnZyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsIHZvaWQgKnAsIHVpbnQgcHJlYykKK3dsY19hbXBkdV9hZ2coc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsIHN0cnVjdCBza19idWZmICpwLAorCSAgICAgIHVpbnQgcHJlYykKIHsKIAlzY2JfYW1wZHVfdCAqc2NiX2FtcGR1OwogCXNjYl9hbXBkdV90aWRfaW5pX3QgKmluaTsKLQl1OCB0aWQgPSAodTgpIFBLVFBSSU8ocCk7CisJdTggdGlkID0gKHU4KSAocC0+cHJpb3JpdHkpOwogCiAJc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwogCkBAIC01MDAsMTEgKzQ5MSwxMiBAQAogfQogCiBpbnQgQkNNRkFTVFBBVEgKLXdsY19zZW5kYW1wZHUoYW1wZHVfaW5mb190ICphbXBkdSwgd2xjX3R4cV9pbmZvX3QgKnFpLCB2b2lkICoqcGR1LCBpbnQgcHJlYykKK3dsY19zZW5kYW1wZHUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCB3bGNfdHhxX2luZm9fdCAqcWksCisJICAgICAgc3RydWN0IHNrX2J1ZmYgKipwZHUsIGludCBwcmVjKQogewotCXdsY19pbmZvX3QgKndsYzsKLQlvc2xfdCAqb3NoOwotCXZvaWQgKnAsICpwa3RbQU1QRFVfTUFYX01QRFVdOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOworCXN0cnVjdCBza19idWZmICpwLCAqcGt0W0FNUERVX01BWF9NUERVXTsKIAl1OCB0aWQsIG5kZWxpbTsKIAlpbnQgZXJyID0gMDsKIAl1OCBwcmVhbWJsZV90eXBlID0gV0xDX0dGX1BSRUFNQkxFOwpAQCAtNTQwLDcgKzUzMiw3IEBACiAKIAlBU1NFUlQocCk7CiAKLQl0aWQgPSAodTgpIFBLVFBSSU8ocCk7CisJdGlkID0gKHU4KSAocC0+cHJpb3JpdHkpOwogCUFTU0VSVCh0aWQgPCBBTVBEVV9NQVhfU0NCX1RJRCk7CiAKIAlmID0gYW1wZHUtPmZpZm9fdGIgKyBwcmlvMmZpZm9bdGlkXTsKQEAgLTU2MSw3ICs1NTMsNyBAQAogCXdsY19hbXBkdV9hZ2coYW1wZHUsIHNjYiwgcCwgdGlkKTsKIAogCWlmICh3bGMtPmJsb2NrX2RhdGFmaWZvKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IEZpZm8gYmxvY2tlZFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBGaWZvIGJsb2NrZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEJDTUVfQlVTWTsKIAl9CiAJcnJfcmV0cnlfbGltaXQgPSBhbXBkdS0+cnJfcmV0cnlfbGltaXRfdGlkW3RpZF07CkBAIC01NzYsNyArNTY4LDcgQEAKIAkJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgewogCQkJZXJyID0gd2xjX3ByZXBfcGR1KHdsYywgcCwgJmZpZm8pOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogQU1QRFUgZmxhZyBpcyBvZmYhXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBBTVBEVSBmbGFnIGlzIG9mZiFcbiIsIF9fZnVuY19fKTsKIAkJCSpwZHUgPSBOVUxMOwogCQkJZXJyID0gMDsKIAkJCWJyZWFrOwpAQCAtNTg0LDE0ICs1NzYsMTYgQEAKIAogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJyID09IEJDTUVfQlVTWSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX3NlbmRhbXBkdTogcHJlcF94ZHUgcmV0cnk7IHNlcSAweCV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgc2VxKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJldHJ5OyBzZXEgMHgleFxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBzZXEpOwogCQkJCVdMQ05USU5DUihhbXBkdS0+Y250LT5zZHVyZXRyeSk7CiAJCQkJKnBkdSA9IHA7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIGVycm9yIGluIHRoZSBwYWNrZXQ7IHJlamVjdCBpdCAqLwotCQkJV0xfQU1QRFVfRVJSKCgid2wlZDogd2xjX3NlbmRhbXBkdTogcHJlcF94ZHUgcmVqZWN0ZWQ7IHNlcSAweCV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgc2VxKSk7CisJCQlXTF9BTVBEVV9FUlIoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJlamVjdGVkOyBzZXEgMHgleFxuIiwKKwkJCQkgICAgIHdsYy0+cHViLT51bml0LCBzZXEpOwogCQkJV0xDTlRJTkNSKGFtcGR1LT5jbnQtPnNkdXJlamVjdGVkKTsKIAogCQkJKnBkdSA9IE5VTEw7CkBAIC02MDAsNyArNTk0LDcgQEAKIAogCQkvKiBwa3QgaXMgZ29vZCB0byBiZSBhZ2dyZWdhdGVkICovCiAJCUFTU0VSVCh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpOwotCQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwKTsKKwkJdHhoID0gKGQxMXR4aF90ICopIHAtPmRhdGE7CiAJCXBsY3AgPSAodTggKikgKHR4aCArIDEpOwogCQloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikocGxjcCArIEQxMV9QSFlfSERSX0xFTik7CiAJCXNlcSA9IGx0b2gxNihoLT5zZXEpID4+IFNFUU5VTV9TSElGVDsKQEAgLTYzMyw4ICs2MjcsOCBAQAogCQluZGVsaW0gPSB0eGgtPlJUU1BMQ1BGYWxsYmFja1tBTVBEVV9GQlJfTlVMTF9ERUxJTV07CiAJCXNlZ19jbnQgKz0gMTsKIAotCQlXTF9BTVBEVV9UWCgoIndsJWQ6IHdsY19zZW5kYW1wZHU6IG1wZHUgJWQgcGxjcF9sZW4gJWRcbiIsCi0JCQkgICAgIHdsYy0+cHViLT51bml0LCBjb3VudCwgbGVuKSk7CisJCVdMX0FNUERVX1RYKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBtcGR1ICVkIHBsY3BfbGVuICVkXG4iLAorCQkJICAgIHdsYy0+cHViLT51bml0LCBjb3VudCwgbGVuKTsKIAogCQkvKgogCQkgKiBhZ2dyZWdhdGVhYmxlIG1wZHUuIEZvciB1Y29kZS9odyBhZ2csCkBAIC02NjUsNyArNjU5LDggQEAKIAogCQlkbWFfbGVuICs9ICh1MTYpIHBrdHRvdGxlbihvc2gsIHApOwogCi0JCVdMX0FNUERVX1RYKCgid2wlZDogd2xjX3NlbmRhbXBkdTogYW1wZHVfbGVuICVkIHNlZ19jbnQgJWQgbnVsbCBkZWxpbSAlZFxuIiwgd2xjLT5wdWItPnVuaXQsIGFtcGR1X2xlbiwgc2VnX2NudCwgbmRlbGltKSk7CisJCVdMX0FNUERVX1RYKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBhbXBkdV9sZW4gJWQgc2VnX2NudCAlZCBudWxsIGRlbGltICVkXG4iLAorCQkJICAgIHdsYy0+cHViLT51bml0LCBhbXBkdV9sZW4sIHNlZ19jbnQsIG5kZWxpbSk7CiAKIAkJdHhoLT5NYWNUeENvbnRyb2xMb3cgPSBodG9sMTYobWNsKTsKIApAQCAtNjk1LDggKzY5MCw4IEBACiAJCQkgICAgbWluKHNjYl9hbXBkdS0+bWF4X3J4bGVuLAogCQkJCWFtcGR1LT5tYXhfdHhsZW5bbWNzXVtpczQwXVtzZ2ldKTsKIAotCQkJV0xfTk9ORSgoInNlbmRhbXBkdTogc2dpICVkLCBpczQwICVkLCBtY3MgJWRcbiIsIHNnaSwKLQkJCQkgaXM0MCwgbWNzKSk7CisJCQlXTF9OT05FKCJzZW5kYW1wZHU6IHNnaSAlZCwgaXM0MCAlZCwgbWNzICVkXG4iLAorCQkJCXNnaSwgaXM0MCwgbWNzKTsKIAogCQkJbWF4bGVuID0gNjQgKiAxMDI0OwkvKiBYWFggRml4IG1lIHRvIGhvbm9yIHJlYWwgbWF4X3J4bGVuICovCiAKQEAgLTczOSwxMyArNzM0LDE0IEBACiAJCS8qIHRlc3Qgd2hldGhlciB0byBhZGQgbW9yZSAqLwogCQlpZiAoKE1DU19SQVRFKG1jcywgdHJ1ZSwgZmFsc2UpID49IGYtPmRtYXhmZXJyYXRlKSAmJgogCQkgICAgKGNvdW50ID09IGYtPm1jczJhbXBkdV90YWJsZVttY3NdKSkgewotCQkJV0xfQU1QRFVfRVJSKCgid2wlZDogUFIgMzc2NDQ6IHN0b3BwaW5nIGFtcGR1IGF0ICVkIGZvciBtY3MgJWQiLCB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIG1jcykpOworCQkJV0xfQU1QRFVfRVJSKCJ3bCVkOiBQUiAzNzY0NDogc3RvcHBpbmcgYW1wZHUgYXQgJWQgZm9yIG1jcyAlZFxuIiwKKwkJCQkgICAgIHdsYy0+cHViLT51bml0LCBjb3VudCwgbWNzKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKGNvdW50ID09IHNjYl9hbXBkdS0+bWF4X3BkdSkgewotCQkJV0xfTk9ORSgoIlN0b3AgdGFraW5nIGZyb20gcSwgcmVhY2hlZCAlZCBkZWVwXG4iLAotCQkJCSBzY2JfYW1wZHUtPm1heF9wZHUpKTsKKwkJCVdMX05PTkUoIlN0b3AgdGFraW5nIGZyb20gcSwgcmVhY2hlZCAlZCBkZWVwXG4iLAorCQkJCXNjYl9hbXBkdS0+bWF4X3BkdSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC03NTUsNyArNzUxLDcgQEAKIAogCQlpZiAocCkgewogCQkJaWYgKCh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCi0JCQkgICAgKCh1OCkgUEtUUFJJTyhwKSA9PSB0aWQpKSB7CisJCQkgICAgKCh1OCkgKHAtPnByaW9yaXR5KSA9PSB0aWQpKSB7CiAKIAkJCQlwbGVuID0KIAkJCQkgICAgcGt0dG90bGVuKG9zaCwgcCkgKyBBTVBEVV9NQVhfTVBEVV9PVkVSSEVBRDsKQEAgLTc2MywxNSArNzU5LDE2IEBACiAKIAkJCQlpZiAoKHBsZW4gKyBhbXBkdV9sZW4pID4gbWF4bGVuKSB7CiAJCQkJCXAgPSBOVUxMOwotCQkJCQlXTF9FUlJPUigoIiVzOiBCb2d1cyBwbGVuICMxXG4iLAotCQkJCQkJICBfX2Z1bmNfXykpOworCQkJCQlXTF9FUlJPUigiJXM6IEJvZ3VzIHBsZW4gIzFcbiIsCisJCQkJCQkgX19mdW5jX18pOwogCQkJCQlBU1NFUlQoMyA9PSA0KTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJLyogY2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBkZXNjcmlwdG9ycyBhdmFpbGFibGUgKi8KIAkJCQlpZiAoVFhBVkFJTCh3bGMsIGZpZm8pIDw9IChzZWdfY250ICsgMSkpIHsKLQkJCQkJV0xfRVJST1IoKCIlczogTm8gZmlmbyBzcGFjZSAgICEhISEhIVxuIiwgX19mdW5jX18pKTsKKwkJCQkJV0xfRVJST1IoIiVzOiBObyBmaWZvIHNwYWNlICAgISEhISEhXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKIAkJCQkJcCA9IE5VTEw7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KQEAgLTc4OSw3ICs3ODYsNyBAQAogCQlXTENOVEFERChhbXBkdS0+Y250LT50eG1wZHUsIGNvdW50KTsKIAogCQkvKiBwYXRjaCB1cCB0aGUgbGFzdCB0eGggKi8KLQkJdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocGt0W2NvdW50IC0gMV0pOworCQl0eGggPSAoZDExdHhoX3QgKikgcGt0W2NvdW50IC0gMV0tPmRhdGE7CiAJCW1jbCA9IGx0b2gxNih0eGgtPk1hY1R4Q29udHJvbExvdyk7CiAJCW1jbCAmPSB+VFhDX0FNUERVX01BU0s7CiAJCW1jbCB8PSAoVFhDX0FNUERVX0xBU1QgPDwgVFhDX0FNUERVX1NISUZUKTsKQEAgLTgwNyw3ICs4MDQsNyBAQAogCQlhbXBkdV9sZW4gLT0gcm91bmR1cChsZW4sIDQpIC0gbGVuOwogCiAJCS8qIHBhdGNoIHVwIHRoZSBmaXJzdCB0eGggJiBwbGNwICovCi0JCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHBrdFswXSk7CisJCXR4aCA9IChkMTF0eGhfdCAqKSBwa3RbMF0tPmRhdGE7CiAJCXBsY3AgPSAodTggKikgKHR4aCArIDEpOwogCiAJCVdMQ19TRVRfTUlNT19QTENQX0xFTihwbGNwLCBhbXBkdV9sZW4pOwpAQCAtODc4LDI3ICs4NzUsMTggQEAKIAkJCVdMQ19TRVRfTUlNT19QTENQX0FNUERVKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjayk7CiAJCX0KIAotCQlXTF9BTVBEVV9UWCgoIndsJWQ6IHdsY19zZW5kYW1wZHU6IGNvdW50ICVkIGFtcGR1X2xlbiAlZFxuIiwKLQkJCSAgICAgd2xjLT5wdWItPnVuaXQsIGNvdW50LCBhbXBkdV9sZW4pKTsKKwkJV0xfQU1QRFVfVFgoIndsJWQ6IHdsY19zZW5kYW1wZHU6IGNvdW50ICVkIGFtcGR1X2xlbiAlZFxuIiwKKwkJCSAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIGFtcGR1X2xlbik7CiAKIAkJLyogaW5mb3JtIHJhdGVfc2VsIGlmIGl0IHRoaXMgaXMgYSByYXRlIHByb2JlIHBrdCAqLwogCQlmcmFtZWlkID0gbHRvaDE2KHR4aC0+VHhGcmFtZUlEKTsKIAkJaWYgKGZyYW1laWQgJiBUWEZJRF9SQVRFX1BST0JFX01BU0spIHsKLQkJCVdMX0VSUk9SKCgiJXM6IFhYWCB3aGF0IHRvIGRvIHdpdGggVFhGSURfUkFURV9QUk9CRV9NQVNLIT9cbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IFhYWCB3aGF0IHRvIGRvIHdpdGggVFhGSURfUkFURV9QUk9CRV9NQVNLIT9cbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJfQotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsYy0+cnBjX2FnZyAmIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUpCi0JCQliY21fcnBjX3RwX2FnZ19zZXQoYmNtX3JwY190cF9nZXQod2xjLT5ycGMpLAotCQkJCQkgICBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVLCB0cnVlKTsKLSNlbmRpZgogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAkJCXdsY190eGZpZm8od2xjLCBmaWZvLCBwa3RbaV0sIGkgPT0gKGNvdW50IC0gMSksCiAJCQkJICAgYW1wZHUtPnR4cGt0X3dlaWdodCk7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQlpZiAod2xjLT5ycGNfYWdnICYgQkNNX1JQQ19UUF9IT1NUX0FHR19BTVBEVSkKLQkJCWJjbV9ycGNfdHBfYWdnX3NldChiY21fcnBjX3RwX2dldCh3bGMtPnJwYyksCi0JCQkJCSAgIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUsIGZhbHNlKTsKLSNlbmRpZgogCiAJfQogCS8qIGVuZGlmIChjb3VudCkgKi8KQEAgLTkwNiwxMSArODk0LDExIEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbXBkdV9kb3R4c3RhdHVzKGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqcCwKLQkJICAgICB0eF9zdGF0dXNfdCAqdHhzKQord2xjX2FtcGR1X2RvdHhzdGF0dXMoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnAsIHR4X3N0YXR1c190ICp0eHMpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdTsKLQl3bGNfaW5mb190ICp3bGMgPSBhbXBkdS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gYW1wZHUtPndsYzsKIAlzY2JfYW1wZHVfdGlkX2luaV90ICppbmk7CiAJdTMyIHMxID0gMCwgczIgPSAwOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKQEAgLTkyMiw3ICs5MTAsNyBAQAogCUFTU0VSVCh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19BTVBEVSk7CiAJc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwogCUFTU0VSVChzY2JfYW1wZHUpOwotCWluaSA9IFNDQl9BTVBEVV9JTkkoc2NiX2FtcGR1LCBQS1RQUklPKHApKTsKKwlpbmkgPSBTQ0JfQU1QRFVfSU5JKHNjYl9hbXBkdSwgcC0+cHJpb3JpdHkpOwogCUFTU0VSVChpbmktPnNjYiA9PSBzY2IpOwogCiAJLyogQk1BQ19OT1RFOiBGb3IgdGhlIHNwbGl0IGRyaXZlciwgc2Vjb25kIGxldmVsIHR4c3RhdHVzIGNvbWVzIGxhdGVyCkBAIC05MzAsNyArOTE4LDYgQEAKIAkgKiBjYWxsIHRoZSBmaXJzdCBvbmUKIAkgKi8KIAlpZiAodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfQUNLX1JDVikgewotI2lmZGVmIFdMQ19MT1cKIAkJdTggc3RhdHVzX2RlbGF5ID0gMDsKIAogCQkvKiB3YWl0IHRpbGwgdGhlIG5leHQgOCBieXRlcyBvZiB0eHN0YXR1cyBpcyBhdmFpbGFibGUgKi8KQEAgLTk0OCw1NCArOTM1LDE0IEBACiAJCUFTU0VSVCghKHMxICYgVFhfU1RBVFVTX0lOVEVSTUVESUFURSkpOwogCQlBU1NFUlQoczEgJiBUWF9TVEFUVVNfQU1QRFUpOwogCQlzMiA9IFJfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5mcm10eHN0YXR1czIpOwotI2Vsc2UJCQkJLyogV0xDX0xPVyAqLwotCi0JCS8qIFN0b3JlIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBpbiBhbXBkdSBzdHJ1Y3R1cmUgKi8KLQkJV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfYW1wZHVfZG90eHN0YXR1czogSGlnaCBSZWN2ZFxuIiwKLQkJCSAgICAgd2xjLT5wdWItPnVuaXQpKTsKLQotCQlBU1NFUlQoIWFtcGR1LT5wKTsKLQkJYW1wZHUtPnAgPSBwOwotCQliY29weSh0eHMsICZhbXBkdS0+dHhzLCBzaXplb2YodHhfc3RhdHVzX3QpKTsKLQkJYW1wZHUtPndhaXRpbmdfc3RhdHVzID0gdHJ1ZTsKLQkJcmV0dXJuOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAl9CiAKIAl3bGNfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShhbXBkdSwgc2NiLCBwLCB0eHMsIHMxLCBzMik7CiAJd2xjX2FtcGR1X3R4Zmxvd2NvbnRyb2wod2xjLCBzY2JfYW1wZHUsIGluaSk7CiB9CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi12b2lkIHdsY19hbXBkdV90eHN0YXR1c19jb21wbGV0ZShhbXBkdV9pbmZvX3QgKmFtcGR1LCB1MzIgczEsIHUzMiBzMikKLXsKLQlXTF9BTVBEVV9UWCgoIndsJWQ6IHdsY19hbXBkdV90eHN0YXR1c19jb21wbGV0ZTogSGlnaCBSZWN2ZCAweCV4IDB4JXggcDolcFxuIiwgYW1wZHUtPndsYy0+cHViLT51bml0LCBzMSwgczIsIGFtcGR1LT5wKSk7Ci0KLQlBU1NFUlQoYW1wZHUtPndhaXRpbmdfc3RhdHVzKTsKLQotCS8qIFRoZSBwYWNrZXQgbWF5IGhhdmUgYmVlbiBmcmVlZCBpZiB0aGUgU0NCIHdlbnQgYXdheSwgaWYgc28sIHRoZW4gc3RpbGwgZnJlZSB0aGUKLQkgKiBETUEgY2hhaW4KLQkgKi8KLQlpZiAoYW1wZHUtPnApIHsKLQkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCQlzdHJ1Y3Qgc2NiICpzY2I7Ci0KLQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoYW1wZHUtPnApOwotCQlzY2IgPSAoc3RydWN0IHNjYiAqKXR4X2luZm8tPmNvbnRyb2wuc3RhLT5kcnZfcHJpdjsKLQotCQl3bGNfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShhbXBkdSwgc2NiLCBhbXBkdS0+cCwgJmFtcGR1LT50eHMsCi0JCQkJCSAgICAgIHMxLCBzMik7Ci0JCWFtcGR1LT5wID0gTlVMTDsKLQl9Ci0KLQlhbXBkdS0+d2FpdGluZ19zdGF0dXMgPSBmYWxzZTsKLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi12b2lkIHJhdGVfc3RhdHVzKHdsY19pbmZvX3QgKndsYywgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvLAotCQkgdHhfc3RhdHVzX3QgKnR4cywgdTggbWNzKTsKLQogdm9pZAotcmF0ZV9zdGF0dXMod2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8sCityYXRlX3N0YXR1cyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvLAogCSAgICB0eF9zdGF0dXNfdCAqdHhzLCB1OCBtY3MpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGUgPSB0eF9pbmZvLT5zdGF0dXMucmF0ZXM7CkBAIC0xMDA4LDE3ICs5NTUsMTUgQEAKIAl9CiB9CiAKLWV4dGVybiB2b2lkIHdsY190eHFfZW5xKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpzZHUsCi0JCQl1aW50IHByZWMpOwotCiAjZGVmaW5lIFNIT1JUTkFNRSAiQU1QRFUgc3RhdHVzIgogCiBzdGF0aWMgdm9pZCBCQ01GQVNUUEFUSAotd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpwLAotCQkJICAgICAgdHhfc3RhdHVzX3QgKnR4cywgdTMyIHMxLCB1MzIgczIpCit3bGNfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpwLCB0eF9zdGF0dXNfdCAqdHhzLAorCQkJICAgICAgdTMyIHMxLCB1MzIgczIpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdTsKLQl3bGNfaW5mb190ICp3bGMgPSBhbXBkdS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gYW1wZHUtPndsYzsKIAlzY2JfYW1wZHVfdGlkX2luaV90ICppbmk7CiAJdTggYml0bWFwWzhdLCBxdWV1ZSwgdGlkOwogCWQxMXR4aF90ICp0eGg7CkBAIC0xMDM3LDcgKzk4Miw3IEBACiAKICNpZmRlZiBCQ01EQkcKIAl1OCBob2xlW0FNUERVX01BWF9NUERVXTsKLQliemVybyhob2xlLCBzaXplb2YoaG9sZSkpOworCW1lbXNldChob2xlLCAwLCBzaXplb2YoaG9sZSkpOwogI2VuZGlmCiAKIAlBU1NFUlQodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKTsKQEAgLTEwNDYsNyArOTkxLDcgQEAKIAlzY2JfYW1wZHUgPSBTQ0JfQU1QRFVfQ1VCQlkoYW1wZHUsIHNjYik7CiAJQVNTRVJUKHNjYl9hbXBkdSk7CiAKLQl0aWQgPSAodTgpIFBLVFBSSU8ocCk7CisJdGlkID0gKHU4KSAocC0+cHJpb3JpdHkpOwogCiAJaW5pID0gU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHRpZCk7CiAJcmV0cnlfbGltaXQgPSBhbXBkdS0+cmV0cnlfbGltaXRfdGlkW3RpZF07CkBAIC0xMDU0LDcgKzk5OSw3IEBACiAKIAlBU1NFUlQoaW5pLT5zY2IgPT0gc2NiKTsKIAotCWJ6ZXJvKGJpdG1hcCwgc2l6ZW9mKGJpdG1hcCkpOworCW1lbXNldChiaXRtYXAsIDAsIHNpemVvZihiaXRtYXApKTsKIAlxdWV1ZSA9IHR4cy0+ZnJhbWVpZCAmIFRYRklEX1FVRVVFX01BU0s7CiAJQVNTRVJUKHF1ZXVlIDwgQUNfQ09VTlQpOwogCkBAIC0xMDkxLDEzICsxMDM2LDE2IEBACiAJCWlmIChzdXByX3N0YXR1cykgewogCQkJdXBkYXRlX3JhdGUgPSBmYWxzZTsKIAkJCWlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9CQURDSCkgewotCQkJCVdMX0VSUk9SKCgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBpbGxlZ2FsIGNoYW5uZWwgcG9zc2libHkgJWRcbiIsIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpKTsKKwkJCQlXTF9FUlJPUigiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBpbGxlZ2FsIGNoYW5uZWwgcG9zc2libHkgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywKKwkJCQkJIENIU1BFQ19DSEFOTkVMKHdsYy0+ZGVmYXVsdF9ic3MtPmNoYW5zcGVjKSk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9GUkFHKQotCQkJCQlXTF9OT05FKCgiJXM6IEFNUERVIGZyYWcgZXJyXG4iLAotCQkJCQkJIF9fZnVuY19fKSk7CisJCQkJCVdMX05PTkUoIiVzOiBBTVBEVSBmcmFnIGVyclxuIiwKKwkJCQkJCV9fZnVuY19fKTsKIAkJCQllbHNlCi0JCQkJCVdMX0VSUk9SKCgiJXM6IHdsY19hbXBkdV9kb3R4c3RhdHVzOiBzdXByX3N0YXR1cyAweCV4XG4iLCBfX2Z1bmNfXywgc3Vwcl9zdGF0dXMpKTsKKwkJCQkJV0xfRVJST1IoIiVzOiB3bGNfYW1wZHVfZG90eHN0YXR1czogc3Vwcl9zdGF0dXMgMHgleFxuIiwKKwkJCQkJCSBfX2Z1bmNfXywgc3Vwcl9zdGF0dXMpOwogCQkJfQogCQkJLyogbm8gbmVlZCB0byByZXRyeSBmb3IgYmFkY2g7IHdpbGwgZmFpbCBhZ2FpbiAqLwogCQkJaWYgKHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0JBRENIIHx8CkBAIC0xMTE2LDIyICsxMDY0LDE4IEBACiAJCQkJaWYgKHdsY19mZnBsZF9jaGVja190eGZ1bmZsKHdsYywgcHJpbzJmaWZvW3RpZF0pCiAJCQkJICAgID4gMCkgewogCQkJCQl0eF9lcnJvciA9IHRydWU7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQkJCQkvKiBXaXRoIEJNQUMsIFRYIFVuZGVyZmxvd3Mgc2hvdWxkIG5vdCBoYXBwZW4gKi8KLQkJCQkJV0xfRVJST1IoKCJ3bCVkOiBCTUFDIFRYIFVuZGVyZmxvdz8iLAotCQkJCQkJICB3bGMtPnB1Yi0+dW5pdCkpOwotI2VuZGlmCiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKHR4cy0+cGh5ZXJyKSB7CiAJCQl1cGRhdGVfcmF0ZSA9IGZhbHNlOwogCQkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eHBoeWVycik7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hbXBkdV9kb3R4c3RhdHVzOiB0eCBwaHkgZXJyb3IgKDB4JXgpXG4iLCB3bGMtPnB1Yi0+dW5pdCwgdHhzLT5waHllcnIpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYW1wZHVfZG90eHN0YXR1czogdHggcGh5IGVycm9yICgweCV4KVxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIHR4cy0+cGh5ZXJyKTsKIAogI2lmZGVmIEJDTURCRwogCQkJaWYgKFdMX0VSUk9SX09OKCkpIHsKIAkJCQlwcnBrdCgidHhwa3QgKEFNUERVKSIsIHdsYy0+b3NoLCBwKTsKLQkJCQl3bGNfcHJpbnRfdHhkZXNjKChkMTF0eGhfdCAqKSBQS1REQVRBKHApKTsKKwkJCQl3bGNfcHJpbnRfdHhkZXNjKChkMTF0eGhfdCAqKSBwLT5kYXRhKTsKIAkJCQl3bGNfcHJpbnRfdHhzdGF0dXModHhzKTsKIAkJCX0KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KQEAgLTExNDIsNyArMTA4Niw3IEBACiAJd2hpbGUgKHApIHsKIAkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocCk7CiAJCUFTU0VSVCh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpOwotCQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwKTsKKwkJdHhoID0gKGQxMXR4aF90ICopIHAtPmRhdGE7CiAJCW1jbCA9IGx0b2gxNih0eGgtPk1hY1R4Q29udHJvbExvdyk7CiAJCXBsY3AgPSAodTggKikgKHR4aCArIDEpOwogCQloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikocGxjcCArIEQxMV9QSFlfSERSX0xFTik7CkBAIC0xMTU4LDEwICsxMTAyLDkgQEAKIAkJaWYgKGJhX3JlY2QpIHsKIAkJCWJpbmRleCA9IE1PRFNVQl9QT1cyKHNlcSwgc3RhcnRfc2VxLCBTRVFOVU1fTUFYKTsKIAotCQkJV0xfQU1QRFVfVFgoKCIlczogdGlkICVkIHNlcSBpcyAlZCwgc3RhcnRfc2VxIGlzICVkLCAiCi0JCQkJICAgICAiYmluZGV4IGlzICVkIHNldCAlZCwgaW5kZXggJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgdGlkLCBzZXEsIHN0YXJ0X3NlcSwgYmluZGV4LAotCQkJCSAgICAgaXNzZXQoYml0bWFwLCBiaW5kZXgpLCBpbmRleCkpOworCQkJV0xfQU1QRFVfVFgoIiVzOiB0aWQgJWQgc2VxIGlzICVkLCBzdGFydF9zZXEgaXMgJWQsIGJpbmRleCBpcyAlZCBzZXQgJWQsIGluZGV4ICVkXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgdGlkLCBzZXEsIHN0YXJ0X3NlcSwgYmluZGV4LAorCQkJCSAgICBpc3NldChiaXRtYXAsIGJpbmRleCksIGluZGV4KTsKIAogCQkJLyogaWYgYWNrZWQgdGhlbiBjbGVhciBiaXQgYW5kIGZyZWUgcGFja2V0ICovCiAJCQlpZiAoKGJpbmRleCA8IEFNUERVX1RYX0JBX01BWF9XU0laRSkKQEAgLTExODYsOCArMTEyOSw4IEBACiAJCQkJICAgICBzdGF0dXMgJiBUWF9TVEFUVVNfRlJNX1JUWF9NQVNLKSA+PgogCQkJCSAgICBUWF9TVEFUVVNfRlJNX1JUWF9TSElGVDsKIAotCQkJCVBLVFBVTEwocCwgRDExX1BIWV9IRFJfTEVOKTsKLQkJCQlQS1RQVUxMKHAsIEQxMV9UWEhfTEVOKTsKKwkJCQlza2JfcHVsbChwLCBEMTFfUEhZX0hEUl9MRU4pOworCQkJCXNrYl9wdWxsKHAsIEQxMV9UWEhfTEVOKTsKIAogCQkJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywKIAkJCQkJCQkgICAgcCk7CkBAIC0xMjEyLDkgKzExNTUsMTAgQEAKIAkJCQlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXModHhfaW5mbyk7CiAJCQkJdHhfaW5mby0+ZmxhZ3MgfD0KIAkJCQkgICAgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFVfTk9fQkFDSzsKLQkJCQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JCQkJUEtUUFVMTChwLCBEMTFfVFhIX0xFTik7Ci0JCQkJV0xfRVJST1IoKCIlczogQkEgVGltZW91dCwgc2VxICVkLCBpbl90cmFuc2l0ICVkXG4iLCBTSE9SVE5BTUUsIHNlcSwgaW5pLT50eF9pbl90cmFuc2l0KSk7CisJCQkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7CisJCQkJV0xfRVJST1IoIiVzOiBCQSBUaW1lb3V0LCBzZXEgJWQsIGluX3RyYW5zaXQgJWRcbiIsCisJCQkJCSBTSE9SVE5BTUUsIHNlcSwgaW5pLT50eF9pbl90cmFuc2l0KTsKIAkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsCiAJCQkJCQkJICAgIHApOwogCQkJfQpAQCAtMTI0Miw3ICsxMTg2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFtcGR1X2NsZWFudXBfdGlkX2luaShhbXBkdV9pbmZvX3QgKmFtcGR1LCBzY2JfYW1wZHVfdCAqc2NiX2FtcGR1LCB1OCB0aWQsCithbXBkdV9jbGVhbnVwX3RpZF9pbmkoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzY2JfYW1wZHVfdCAqc2NiX2FtcGR1LCB1OCB0aWQsCiAJCSAgICAgIGJvb2wgZm9yY2UpCiB7CiAJc2NiX2FtcGR1X3RpZF9pbmlfdCAqaW5pOwpAQCAtMTI1MCw4ICsxMTk0LDggQEAKIAlpZiAoIWluaSkKIAkJcmV0dXJuOwogCi0JV0xfQU1QRFVfQ1RMKCgid2wlZDogYW1wZHVfY2xlYW51cF90aWRfaW5pOiB0aWQgJWRcbiIsCi0JCSAgICAgIGFtcGR1LT53bGMtPnB1Yi0+dW5pdCwgdGlkKSk7CisJV0xfQU1QRFVfQ1RMKCJ3bCVkOiBhbXBkdV9jbGVhbnVwX3RpZF9pbmk6IHRpZCAlZFxuIiwKKwkJICAgICBhbXBkdS0+d2xjLT5wdWItPnVuaXQsIHRpZCk7CiAKIAlpZiAoaW5pLT50eF9pbl90cmFuc2l0ICYmICFmb3JjZSkKIAkJcmV0dXJuOwpAQCAtMTI2NCw3ICsxMjA4LDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSB0aGUgaW5pdGlhdG9yIGNvZGUgZm9yIHRpZCAqLwotc3RhdGljIHNjYl9hbXBkdV90aWRfaW5pX3QgKndsY19hbXBkdV9pbml0X3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwKK3N0YXRpYyBzY2JfYW1wZHVfdGlkX2luaV90ICp3bGNfYW1wZHVfaW5pdF90aWRfaW5pKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwKIAkJCQkJCSAgIHNjYl9hbXBkdV90ICpzY2JfYW1wZHUsCiAJCQkJCQkgICB1OCB0aWQsIGJvb2wgb3ZlcnJpZGUpCiB7CkBAIC0xMjc3LDcgKzEyMjEsNyBAQAogCiAJLyogY2hlY2sgZm9yIHBlci10aWQgY29udHJvbCBvZiBhbXBkdSAqLwogCWlmICghYW1wZHUtPmluaV9lbmFibGVbdGlkXSkgewotCQlXTF9FUlJPUigoIiVzOiBSZWplY3RpbmcgdGlkICVkXG4iLCBfX2Z1bmNfXywgdGlkKSk7CisJCVdMX0VSUk9SKCIlczogUmVqZWN0aW5nIHRpZCAlZFxuIiwgX19mdW5jX18sIHRpZCk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTI5MCwyMSArMTIzNCwyMSBAQAogCXJldHVybiBpbmk7CiB9CiAKLWludCB3bGNfYW1wZHVfc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUsIGJvb2wgb24pCitpbnQgd2xjX2FtcGR1X3NldChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIGJvb2wgb24pCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAKIAl3bGMtPnB1Yi0+X2FtcGR1ID0gZmFsc2U7CiAKIAlpZiAob24pIHsKIAkJaWYgKCFOX0VOQUIod2xjLT5wdWIpKSB7Ci0JCQlXTF9BTVBEVV9FUlIoKCJ3bCVkOiBkcml2ZXIgbm90IG5tb2RlIGVuYWJsZWRcbiIsCi0JCQkJICAgICAgd2xjLT5wdWItPnVuaXQpKTsKKwkJCVdMX0FNUERVX0VSUigid2wlZDogZHJpdmVyIG5vdCBubW9kZSBlbmFibGVkXG4iLAorCQkJCSAgICAgd2xjLT5wdWItPnVuaXQpOwogCQkJcmV0dXJuIEJDTUVfVU5TVVBQT1JURUQ7CiAJCX0KIAkJaWYgKCF3bGNfYW1wZHVfY2FwKGFtcGR1KSkgewotCQkJV0xfQU1QRFVfRVJSKCgid2wlZDogZGV2aWNlIG5vdCBhbXBkdSBjYXBhYmxlXG4iLAotCQkJCSAgICAgIHdsYy0+cHViLT51bml0KSk7CisJCQlXTF9BTVBEVV9FUlIoIndsJWQ6IGRldmljZSBub3QgYW1wZHUgY2FwYWJsZVxuIiwKKwkJCQkgICAgIHdsYy0+cHViLT51bml0KTsKIAkJCXJldHVybiBCQ01FX1VOU1VQUE9SVEVEOwogCQl9CiAJCXdsYy0+cHViLT5fYW1wZHUgPSBvbjsKQEAgLTEzMTMsNyArMTI1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWJvb2wgd2xjX2FtcGR1X2NhcChhbXBkdV9pbmZvX3QgKmFtcGR1KQorYm9vbCB3bGNfYW1wZHVfY2FwKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKIHsKIAlpZiAoV0xDX1BIWV8xMU5fQ0FQKGFtcGR1LT53bGMtPmJhbmQpKQogCQlyZXR1cm4gdHJ1ZTsKQEAgLTEzMjEsNyArMTI2NSw3IEBACiAJCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgYW1wZHVfdXBkYXRlX21heF90eGxlbihhbXBkdV9pbmZvX3QgKmFtcGR1LCB1OCBkdXIpCitzdGF0aWMgdm9pZCBhbXBkdV91cGRhdGVfbWF4X3R4bGVuKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgdTggZHVyKQogewogCXUzMiByYXRlLCBtY3M7CiAKQEAgLTEzNDMsNyArMTI4Nyw3IEBACiB9CiAKIHU4IEJDTUZBU1RQQVRICi13bGNfYW1wZHVfbnVsbF9kZWxpbV9jbnQoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAord2xjX2FtcGR1X251bGxfZGVsaW1fY250KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAogCQkJIHJhdGVzcGVjX3QgcnNwZWMsIGludCBwaHlsZW4pCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdTsKQEAgLTEzNzksMjUgKzEzMjMsMjUgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLXZvaWQgd2xjX2FtcGR1X21hY2FkZHJfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2FtcGR1X21hY2FkZHJfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWNoYXIgdGVtcGxhdGVbVF9SQU1fQUNDRVNTX1NaICogMl07CiAKIAkvKiBkcml2ZXIgbmVlZHMgdG8gd3JpdGUgdGhlIHRhIGluIHRoZSB0ZW1wbGF0ZTsgdGEgaXMgYXQgb2Zmc2V0IDE2ICovCi0JYnplcm8odGVtcGxhdGUsIHNpemVvZih0ZW1wbGF0ZSkpOwotCWJjb3B5KChjaGFyICopd2xjLT5wdWItPmN1cl9ldGhlcmFkZHIub2N0ZXQsIHRlbXBsYXRlLCBFVEhFUl9BRERSX0xFTik7CisJbWVtc2V0KHRlbXBsYXRlLCAwLCBzaXplb2YodGVtcGxhdGUpKTsKKwliY29weSgoY2hhciAqKXdsYy0+cHViLT5jdXJfZXRoZXJhZGRyLm9jdGV0LCB0ZW1wbGF0ZSwgRVRIX0FMRU4pOwogCXdsY193cml0ZV90ZW1wbGF0ZV9yYW0od2xjLCAoVF9CQV9UUExfQkFTRSArIDE2KSwgKFRfUkFNX0FDQ0VTU19TWiAqIDIpLAogCQkJICAgICAgIHRlbXBsYXRlKTsKIH0KIAotYm9vbCB3bGNfYWdncmVnYXRhYmxlKHdsY19pbmZvX3QgKndsYywgdTggdGlkKQorYm9vbCB3bGNfYWdncmVnYXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCB0aWQpCiB7CiAJcmV0dXJuIHdsYy0+YW1wZHUtPmluaV9lbmFibGVbdGlkXTsKIH0KIAotdm9pZCB3bGNfYW1wZHVfc2htX3VwZChhbXBkdV9pbmZvX3QgKmFtcGR1KQordm9pZCB3bGNfYW1wZHVfc2htX3VwZChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAKIAkvKiBFeHRlbmQgdWNvZGUgaW50ZXJuYWwgd2F0Y2hkb2cgdGltZXIgdG8gbWF0Y2ggbGFyZ2VyIHJlY2VpdmVkIGZyYW1lcyAqLwogCWlmICgoYW1wZHUtPnJ4X2ZhY3RvciAmIEhUX1BBUkFNU19SWF9GQUNUT1JfTUFTSykgPT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmgKaW5kZXggYzcyMWIxNi4uMDM0NTdmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FtcGR1LmgKQEAgLTE3LDI0ICsxNywyMCBAQAogI2lmbmRlZiBfd2xjX2FtcGR1X2hfCiAjZGVmaW5lIF93bGNfYW1wZHVfaF8KIAotZXh0ZXJuIGFtcGR1X2luZm9fdCAqd2xjX2FtcGR1X2F0dGFjaCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X2RldGFjaChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKLWV4dGVybiBib29sIHdsY19hbXBkdV9jYXAoYW1wZHVfaW5mb190ICphbXBkdSk7Ci1leHRlcm4gaW50IHdsY19hbXBkdV9zZXQoYW1wZHVfaW5mb190ICphbXBkdSwgYm9vbCBvbik7Ci1leHRlcm4gaW50IHdsY19zZW5kYW1wZHUoYW1wZHVfaW5mb190ICphbXBkdSwgd2xjX3R4cV9pbmZvX3QgKnFpLCB2b2lkICoqYWdncCwKLQkJCSBpbnQgcHJlYyk7Ci1leHRlcm4gdm9pZCB3bGNfYW1wZHVfZG90eHN0YXR1cyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsIHZvaWQgKnAsCi0JCQkJIHR4X3N0YXR1c190ICp0eHMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3Jlc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X21hY2FkZHJfdXBkKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYW1wZHVfc2htX3VwZChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKK2V4dGVybiBzdHJ1Y3QgYW1wZHVfaW5mbyAqd2xjX2FtcGR1X2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfZGV0YWNoKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSk7CitleHRlcm4gYm9vbCB3bGNfYW1wZHVfY2FwKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSk7CitleHRlcm4gaW50IHdsY19hbXBkdV9zZXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBib29sIG9uKTsKK2V4dGVybiBpbnQgd2xjX3NlbmRhbXBkdShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHdsY190eHFfaW5mb190ICpxaSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKmFnZ3AsIGludCBwcmVjKTsKK2V4dGVybiB2b2lkIHdsY19hbXBkdV9kb3R4c3RhdHVzKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcCwgdHhfc3RhdHVzX3QgKnR4cyk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfcmVzZXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKK2V4dGVybiB2b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfc2htX3VwZChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwogCi1leHRlcm4gdTggd2xjX2FtcGR1X251bGxfZGVsaW1fY250KGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKK2V4dGVybiB1OCB3bGNfYW1wZHVfbnVsbF9kZWxpbV9jbnQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCiAJCQkJICAgICAgcmF0ZXNwZWNfdCByc3BlYywgaW50IHBoeWxlbik7Ci1leHRlcm4gdm9pZCBzY2JfYW1wZHVfY2xlYW51cChhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLWV4dGVybiB2b2lkIHdsY19hbXBkdV90eHN0YXR1c19jb21wbGV0ZShhbXBkdV9pbmZvX3QgKmFtcGR1LCB1MzIgczEsCi0JCQkJCXUzMiBzMik7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHNjYl9hbXBkdV9jbGVhbnVwKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKTsKIAogI2VuZGlmCQkJCS8qIF93bGNfYW1wZHVfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuYwppbmRleCA1ZmY4ODMxLi40MDJkZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5jCkBAIC0xOSwxOCArMTksMjMgQEAKICNpZmRlZiBXTEFOVFNFTAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDxkMTEuaD4KICNpbmNsdWRlIDx3bGNfcmF0ZS5oPgogI2luY2x1ZGUgPHdsY19rZXkuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xfZGJnLmg+CisjaW5jbHVkZSA8d2xjX2V2ZW50Lmg+CiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAjaW5jbHVkZSA8d2xjX2JtYWMuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2hhbC5oPgpAQCAtNTgsMTAgKzYzLDExIEBACiAjZGVmaW5lIEFOVF9TRUxDRkdfREVGXzJ4NAkweDAyCS8qIGRlZmF1bHQgYW50ZW5uYSBjb25maWd1cmF0aW9uICovCiAKIC8qIHN0YXRpYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgd2xjX2FudHNlbF9jZmd1cGQoYW50c2VsX2luZm9fdCAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCk7Ci1zdGF0aWMgdTggd2xjX2FudHNlbF9pZDJhbnRjZmcoYW50c2VsX2luZm9fdCAqYXNpLCB1OCBpZCk7Ci1zdGF0aWMgdTE2IHdsY19hbnRzZWxfYW50Y2ZnMmFudHNlbChhbnRzZWxfaW5mb190ICphc2ksIHU4IGFudF9jZmcpOwotc3RhdGljIHZvaWQgd2xjX2FudHNlbF9pbml0X2NmZyhhbnRzZWxfaW5mb190ICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsLAorc3RhdGljIGludCB3bGNfYW50c2VsX2NmZ3VwZChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwpOworc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBpZCk7CitzdGF0aWMgdTE2IHdsY19hbnRzZWxfYW50Y2ZnMmFudHNlbChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTggYW50X2NmZyk7CitzdGF0aWMgdm9pZCB3bGNfYW50c2VsX2luaXRfY2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLAorCQkJCXdsY19hbnRzZWxjZmdfdCAqYW50c2VsLAogCQkJCWJvb2wgYXV0b19zZWwpOwogCiBjb25zdCB1MTYgbWltb18yeDRfZGl2X2FudHNlbHBhdF90YmxbXSA9IHsKQEAgLTg4LDE0ICs5NCwxNSBAQAogCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAJLyogcGF0IHRvIGFudHNlbGlkICovCiB9OwogCi1hbnRzZWxfaW5mb190ICp3bGNfYW50c2VsX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsCi0JCQkJCQkgIHdsY19wdWJfdCAqcHViLAotCQkJCQkJICB3bGNfaHdfaW5mb190ICp3bGNfaHcpIHsKLQlhbnRzZWxfaW5mb190ICphc2k7CitzdHJ1Y3QgYW50c2VsX2luZm8gKndsY19hbnRzZWxfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCSAgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCSAgICAgIHN0cnVjdCB3bGNfcHViICpwdWIsCisJCQkJICAgICAgc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpIHsKKwlzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaTsKIAotCWFzaSA9IGt6YWxsb2Moc2l6ZW9mKGFudHNlbF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKwlhc2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW50c2VsX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFzaSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hbnRzZWxfYXR0YWNoOiBvdXQgb2YgbWVtXG4iLCBwdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19hbnRzZWxfYXR0YWNoOiBvdXQgb2YgbWVtXG4iLCBwdWItPnVuaXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEyNCw3ICsxMzEsNyBAQAogCQkJCWFzaS0+YW50c2VsX2F2YWlsID0gZmFsc2U7CiAJCQl9IGVsc2UgewogCQkJCWFzaS0+YW50c2VsX2F2YWlsID0gZmFsc2U7Ci0JCQkJV0xfRVJST1IoKCJ3bGNfYW50c2VsX2F0dGFjaDogMm8zIGJvYXJkIGNmZyBpbnZhbGlkXG4iKSk7CisJCQkJV0xfRVJST1IoIndsY19hbnRzZWxfYXR0YWNoOiAybzMgYm9hcmQgY2ZnIGludmFsaWRcbiIpOwogCQkJCUFTU0VSVCgwKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMTUyLDcgKzE1OSw3IEBACiAJcmV0dXJuIGFzaTsKIH0KIAotdm9pZCB3bGNfYW50c2VsX2RldGFjaChhbnRzZWxfaW5mb190ICphc2kpCit2b2lkIHdsY19hbnRzZWxfZGV0YWNoKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpKQogewogCWlmICghYXNpKQogCQlyZXR1cm47CkBAIC0xNjAsNyArMTY3LDcgQEAKIAlrZnJlZShhc2kpOwogfQogCi12b2lkIHdsY19hbnRzZWxfaW5pdChhbnRzZWxfaW5mb190ICphc2kpCit2b2lkIHdsY19hbnRzZWxfaW5pdChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSkKIHsKIAlpZiAoKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4MykgfHwKIAkgICAgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4NCkpCkBAIC0xNjksNyArMTc2LDcgQEAKIAogLyogYm9hcmRsZXZlbCBhbnRlbm5hIHNlbGVjdGlvbjogaW5pdCBhbnRlbm5hIHNlbGVjdGlvbiBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyB2b2lkCi13bGNfYW50c2VsX2luaXRfY2ZnKGFudHNlbF9pbmZvX3QgKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwsCit3bGNfYW50c2VsX2luaXRfY2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCwKIAkJICAgIGJvb2wgYXV0b19zZWwpCiB7CiAJaWYgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4MykgewpAQCAtMjAwLDcgKzIwNyw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbnRzZWxfYW50Y2ZnX2dldChhbnRzZWxfaW5mb190ICphc2ksIGJvb2wgdXNlZGVmLCBib29sIHNlbCwKK3dsY19hbnRzZWxfYW50Y2ZnX2dldChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgYm9vbCB1c2VkZWYsIGJvb2wgc2VsLAogCQkgICAgICB1OCBhbnRzZWxpZCwgdTggZmJhbnRzZWxpZCwgdTggKmFudGNmZywKIAkJICAgICAgdTggKmZiYW50Y2ZnKQogewpAQCAtMjMyLDcgKzIzOSw3IEBACiB9CiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGNvbnZlcnQgbWltb19hbnRzZWwgKHVjb2RlIGludGVyZmFjZSkgdG8gaWQgKi8KLXU4IHdsY19hbnRzZWxfYW50c2VsMmlkKGFudHNlbF9pbmZvX3QgKmFzaSwgdTE2IGFudHNlbCkKK3U4IHdsY19hbnRzZWxfYW50c2VsMmlkKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1MTYgYW50c2VsKQogewogCXU4IGFudHNlbGlkID0gMDsKIApAQCAtMjUxLDcgKzI1OCw3IEBACiB9CiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGNvbnZlcnQgaWQgdG8gYW50X2NmZyAqLwotc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKGFudHNlbF9pbmZvX3QgKmFzaSwgdTggaWQpCitzdGF0aWMgdTggd2xjX2FudHNlbF9pZDJhbnRjZmcoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHU4IGlkKQogewogCXU4IGFudGNmZyA9IEFOVF9TRUxDRkdfREVGXzJ4MjsKIApAQCAtMjcwLDcgKzI3Nyw3IEBACiB9CiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGNvbnZlcnQgYW50X2NmZyB0byBtaW1vX2FudHNlbCAodWNvZGUgaW50ZXJmYWNlKSAqLwotc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoYW50c2VsX2luZm9fdCAqYXNpLCB1OCBhbnRfY2ZnKQorc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHU4IGFudF9jZmcpCiB7CiAJdTggaWR4ID0gV0xDX0FOVElEWF8xMU4oV0xDX0FOVFNFTF8xMU4oYW50X2NmZykpOwogCXUxNiBtaW1vX2FudHNlbCA9IDA7CkBAIC0yOTAsOSArMjk3LDkgQEAKIH0KIAogLyogYm9hcmRsZXZlbCBhbnRlbm5hIHNlbGVjdGlvbjogdWNvZGUgaW50ZXJmYWNlIGNvbnRyb2wgKi8KLXN0YXRpYyBpbnQgd2xjX2FudHNlbF9jZmd1cGQoYW50c2VsX2luZm9fdCAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCkKK3N0YXRpYyBpbnQgd2xjX2FudHNlbF9jZmd1cGQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsKQogewotCXdsY19pbmZvX3QgKndsYyA9IGFzaS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gYXNpLT53bGM7CiAJdTggYW50X2NmZzsKIAl1MTYgbWltb19hbnRzZWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuaAppbmRleCAxZDA0OGJiLi44ODc1YjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5oCkBAIC0xNiwxMyArMTYsMTUgQEAKIAogI2lmbmRlZiBfd2xjX2FudHNlbF9oXwogI2RlZmluZSBfd2xjX2FudHNlbF9oXwotZXh0ZXJuIGFudHNlbF9pbmZvX3QgKndsY19hbnRzZWxfYXR0YWNoKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwKLQkJCQkJd2xjX3B1Yl90ICpwdWIsCi0JCQkJCXdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYW50c2VsX2RldGFjaChhbnRzZWxfaW5mb190ICphc2kpOwotZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9pbml0KGFudHNlbF9pbmZvX3QgKmFzaSk7Ci1leHRlcm4gdm9pZCB3bGNfYW50c2VsX2FudGNmZ19nZXQoYW50c2VsX2luZm9fdCAqYXNpLCBib29sIHVzZWRlZiwgYm9vbCBzZWwsCitleHRlcm4gc3RydWN0IGFudHNlbF9pbmZvICp3bGNfYW50c2VsX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkJCXN0cnVjdCB3bGNfcHViICpwdWIsCisJCQkJCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19hbnRzZWxfZGV0YWNoKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpKTsKK2V4dGVybiB2b2lkIHdsY19hbnRzZWxfaW5pdChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSk7CitleHRlcm4gdm9pZCB3bGNfYW50c2VsX2FudGNmZ19nZXQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIGJvb2wgdXNlZGVmLAorCQkJCSAgYm9vbCBzZWwsCiAJCQkJICB1OCBpZCwgdTggZmJpZCwgdTggKmFudGNmZywKIAkJCQkgIHU4ICpmYmFudGNmZyk7Ci1leHRlcm4gdTggd2xjX2FudHNlbF9hbnRzZWwyaWQoYW50c2VsX2luZm9fdCAqYXNpLCB1MTYgYW50c2VsKTsKK2V4dGVybiB1OCB3bGNfYW50c2VsX2FudHNlbDJpZChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTE2IGFudHNlbCk7CiAjZW5kaWYJCQkJLyogX3dsY19hbnRzZWxfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5jCmluZGV4IGI3MGY5ZDAuLjY5ZjYwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuYwpAQCAtMTQsMTMgKzE0LDEzIEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZm5kZWYgV0xDX0xPVwotI2Vycm9yICJUaGlzIGZpbGUgbmVlZHMgV0xDX0xPVyIKLSNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8cHJvdG8vODAyLjExLmg+CkBAIC00MiwxMiArNDIsMTQgQEAKICNpbmNsdWRlIDx3bGNfY2hhbm5lbC5oPgogI2luY2x1ZGUgPGJjbXNyb20uaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CisjaW5jbHVkZSA8YmNtZGV2cy5oPgogLyogQk1BQ19OT1RFOiBhIFdMQ19ISUdIIGNvbXBpbGUgaW5jbHVkZSBvZiB3bGMuaCBhZGRzIGluIG1vcmUgc3RydWN0dXJlcyBhbmQgdHlwZQogICogZGVwZW5kZW5jaWVzLiBOZWVkIHRvIGluY2x1ZGUgdGhlc2UgdG8gZmlsZXMgdG8gYWxsb3cgYSBjbGVhbiBpbmNsdWRlIG9mIHdsYy5oCiAgKiB3aXRoIFdMQ19ISUdIIGRlZmluZWQuCiAgKiBBdCBzb21lIHBvaW50IHdlIG1heSBiZSBhYmxlIHRvIHNraXAgdGhlIGluY2x1ZGUgb2Ygd2xjLmggYW5kIGluc3RlYWQganVzdAogICogZGVmaW5lIGEgc3R1YiB3bGNfaW5mbyBhbmQgYmFuZCBzdHJ1Y3QgdG8gYWxsb3cgcnBjIGNhbGxzIHRvIGdldCB0aGUgcnBjIGhhbmRsZS4KICAqLworI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9zaGltLmg+CkBAIC01NSw5ICs1Nyw2IEBACiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+CiAjaW5jbHVkZSAid2xfdWNvZGUuaCIKICNpbmNsdWRlICJkMTF1Y29kZV9leHQuaCIKLSNpZmRlZiBCQ01TRElPCi0jaW5jbHVkZSA8YmNtc2RoLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxiY21vdHAuaD4KIAogLyogQk1BQ19OT1RFOiBXaXRoIFdMQ19ISUdIIGRlZmluZWQsIHNvbWUgZm5zIGluIHRoaXMgZmlsZSBtYWtlIGNhbGxzIHRvIGhpZ2ggbGV2ZWwKQEAgLTY5LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxwY2llX2NvcmUuaD4KIAogI2luY2x1ZGUgPHdsY19hbGxvYy5oPgorI2luY2x1ZGUgPHdsX2RiZy5oPgogCiAjZGVmaW5lCVRJTUVSX0lOVEVSVkFMX1dBVENIRE9HX0JNQUMJMTAwMAkvKiB3YXRjaGRvZyB0aW1lciwgaW4gdW5pdCBvZiBtcyAqLwogCkBAIC0xMTMsNjQgKzExMyw2NSBAQAogCXs5LCA1OCwgMjIsIDE0LCAxNCwgNX0sCS8qIGNvcmVyZXYgMjQ6IDIzMDQsIDE0ODQ4LCA1NjMyLCAzNTg0LCAzNTg0LCAxMjgwICovCiB9OwogCi1zdGF0aWMgdm9pZCB3bGNfY2xrY3RsX2Nsayh3bGNfaHdfaW5mb190ICp3bGMsIHVpbnQgbW9kZSk7Ci1zdGF0aWMgdm9pZCB3bGNfY29yZWluaXQod2xjX2luZm9fdCAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19jbGtjdGxfY2xrKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLCB1aW50IG1vZGUpOworc3RhdGljIHZvaWQgd2xjX2NvcmVpbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogLyogdXNlZCBieSB3bGNfd2FrZXVjb2RlX2luaXQoKSAqLwotc3RhdGljIHZvaWQgd2xjX3dyaXRlX2luaXRzKHdsY19od19pbmZvX3QgKndsY19odywgY29uc3QgZDExaW5pdF90ICppbml0cyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfd3JpdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY29uc3QgZDExaW5pdF90ICppbml0cyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfd3JpdGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNvbnN0IHUzMiB1Y29kZVtdLAogCQkJICAgIGNvbnN0IHVpbnQgbmJ5dGVzKTsKLXN0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZCh3bGNfaHdfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3R4YW50X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX2Rvd25sb2FkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCiAvKiB1c2VkIGJ5IHdsY19kcGMoKSAqLwotc3RhdGljIGJvb2wgd2xjX2JtYWNfZG90eHN0YXR1cyh3bGNfaHdfaW5mb190ICp3bGMsIHR4X3N0YXR1c190ICp0eHMsCitzdGF0aWMgYm9vbCB3bGNfYm1hY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLAogCQkJCXUzMiBzMik7Ci1zdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NCh3bGNfaHdfaW5mb190ICp3bGMpOwotc3RhdGljIGJvb2wgd2xjX2JtYWNfdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjLCBib29sIGJvdW5kLCBib29sICpmYXRhbCk7Ci1zdGF0aWMgYm9vbCB3bGNfYm1hY19yZWN2KHdsY19od19pbmZvX3QgKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKTsKK3N0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzX2NvcmVyZXY0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLCBib29sIGJvdW5kLCBib29sICpmYXRhbCk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY19yZWN2KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sIGJvb2wgYm91bmQpOwogCiAvKiB1c2VkIGJ5IHdsY19kb3duKCkgKi8KLXN0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyh3bGNfaW5mb190ICp3bGMpOworc3RhdGljIHZvaWQgd2xjX2ZsdXNocXVldWVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAotc3RhdGljIHZvaWQgd2xjX3dyaXRlX21oZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiAqbWhmcyk7Ci1zdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIHdsY19jb3JlcmV2X2ZpZm9maXh1cCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX3dyaXRlX21oZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2ICptaGZzKTsKK3N0YXRpYyB2b2lkIHdsY19tY3RybF9yZXNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfY29yZXJldl9maWZvZml4dXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCiAvKiBMb3cgTGV2ZWwgUHJvdG90eXBlcyAqLwotc3RhdGljIHUxNiB3bGNfYm1hY19yZWFkX29iam1lbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAorc3RhdGljIHUxNiB3bGNfYm1hY19yZWFkX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsCiAJCQkJICAgdTMyIHNlbCk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY193cml0ZV9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCi0JCQkJICB1MzIgc2VsKTsKLXN0YXRpYyBib29sIHdsY19ibWFjX2F0dGFjaF9kbWFwaW8od2xjX2luZm9fdCAqd2xjLCB1aW50IGosIGJvb2wgd21lKTsKLXN0YXRpYyB2b2lkIHdsY19ibWFjX2RldGFjaF9kbWFwaW8od2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIHdsY191Y29kZV9ic2luaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyBib29sIHdsY192YWxpZGJvYXJkdHlwZSh3bGNfaHdfaW5mb190ICp3bGMpOwotc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyBjaGFyICp3bGNfZ2V0X21hY2FkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIHdsY19taGZkZWYod2xjX2luZm9fdCAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpOwotc3RhdGljIHZvaWQgd2xjX21jdHJsX3dyaXRlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIHdsY191Y29kZV9tdXRlX292ZXJyaWRlX2NsZWFyKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdTMyIHdsY193bGludHJzb2ZmKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfd2xpbnRyc3Jlc3RvcmUod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50bWFzayk7Ci1zdGF0aWMgdm9pZCB3bGNfZ3Bpb19pbml0KHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLAorc3RhdGljIHZvaWQgd2xjX2JtYWNfd3JpdGVfb2JqbWVtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwKKwkJCQkgIHUxNiB2LCB1MzIgc2VsKTsKK3N0YXRpYyBib29sIHdsY19ibWFjX2F0dGFjaF9kbWFwaW8oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgaiwgYm9vbCB3bWUpOworc3RhdGljIHZvaWQgd2xjX2JtYWNfZGV0YWNoX2RtYXBpbyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfYnNpbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyBib29sIHdsY192YWxpZGJvYXJkdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYyk7CitzdGF0aWMgYm9vbCB3bGNfaXNnb29kY2hpcChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgY2hhciAqd2xjX2dldF9tYWNhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY19taGZkZWYoc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiAqbWhmcywgdTE2IG1oZjJfaW5pdCk7CitzdGF0aWMgdm9pZCB3bGNfbWN0cmxfd3JpdGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9tdXRlX292ZXJyaWRlX2NsZWFyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB1MzIgd2xjX3dsaW50cnNvZmYoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHZvaWQgd2xjX3dsaW50cnNyZXN0b3JlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgbWFjaW50bWFzayk7CitzdGF0aWMgdm9pZCB3bGNfZ3Bpb19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9od19iY250ZW1wbGF0ZTAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHZvaWQgKmJjbiwKIAkJCQkgICAgICBpbnQgbGVuKTsKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9od19iY250ZW1wbGF0ZTEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sCiAJCQkJICAgICAgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY19ic2luaXQod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKLXN0YXRpYyB1MzIgd2xjX3NldGJhbmRfaW5hY3Qod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KTsKLXN0YXRpYyB2b2lkIHdsY19ibWFjX3NldGJhbmQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGJhbmR1bml0LAorc3RhdGljIHZvaWQgd2xjX2JtYWNfYnNpbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKK3N0YXRpYyB1MzIgd2xjX3NldGJhbmRfaW5hY3Qoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpOworc3RhdGljIHZvaWQgd2xjX2JtYWNfc2V0YmFuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBiYW5kdW5pdCwKIAkJCSAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNob3J0c2xvdCk7Ci1zdGF0aWMgdm9pZCB3bGNfdXBkX29mZG1fcGN0bDFfdGFibGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLXN0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3VwZGF0ZV9zbG90X3RpbWluZyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkJYm9vbCBzaG9ydHNsb3QpOworc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCQkgICAgIHU4IHJhdGUpOwogCiAvKiA9PT0gTG93IExldmVsIGZ1bmN0aW9ucyA9PT0gKi8KIAotdm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpCit2b2lkIHdsY19ibWFjX3NldF9zaG9ydHNsb3Qoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgc2hvcnRzbG90KQogewogCXdsY19ody0+c2hvcnRzbG90ID0gc2hvcnRzbG90OwogCkBAIC0xODYsOSArMTg3LDEwIEBACiAgKiBvciBzaG9ydHNsb3QgMTFnICg5dXMgc2xvdHMpCiAgKiBUaGUgUFNNIG5lZWRzIHRvIGJlIHN1c3BlbmRlZCBmb3IgdGhpcyBjYWxsLgogICovCi1zdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNob3J0c2xvdCkKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3VwZGF0ZV9zbG90X3RpbWluZyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkJYm9vbCBzaG9ydHNsb3QpCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKQEAgLTIwNSw3ICsyMDcsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY191Y29kZV9ic2luaXQpICh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCBXTEJBTkRJTklURk4od2xjX3Vjb2RlX2JzaW5pdCkgKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCS8qIGluaXQgbWljcm9jb2RlIGhvc3QgZmxhZ3MgKi8KIAl3bGNfd3JpdGVfbWhmKHdsY19odywgd2xjX2h3LT5iYW5kLT5taGZzKTsKQEAgLTIxNSwzMCArMjE3LDMyIEBACiAJCWlmIChXTENJU05QSFkod2xjX2h3LT5iYW5kKSkgewogCQkJd2xjX3dyaXRlX2luaXRzKHdsY19odywgZDExbjBic2luaXR2YWxzMTYpOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjQpKSB7CiAJCQlpZiAoV0xDSVNMQ05QSFkod2xjX2h3LT5iYW5kKSkgewogCQkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMWxjbjBic2luaXR2YWxzMjQpOwogCQkJfSBlbHNlCi0JCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LAorCQkJCQkgd2xjX2h3LT5jb3JlcmV2KTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgY29yZXJldiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAkJfQogCX0KIH0KIAogLyogc3dpdGNoIHRvIG5ldyBiYW5kIGJ1dCBsZWF2ZSBpdCBpbmFjdGl2ZSAqLwotc3RhdGljIHUzMiBXTEJBTkRJTklURk4od2xjX3NldGJhbmRfaW5hY3QpICh3bGNfaW5mb190ICp3bGMsIHVpbnQgYmFuZHVuaXQpCitzdGF0aWMgdTMyIFdMQkFORElOSVRGTih3bGNfc2V0YmFuZF9pbmFjdCkgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmR1bml0KQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCXUzMiBtYWNpbnRtYXNrOwogCXUzMiB0bXA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19zZXRiYW5kX2luYWN0XG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3NldGJhbmRfaW5hY3RcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlBU1NFUlQoYmFuZHVuaXQgIT0gd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCk7CiAJQVNTRVJUKHNpX2lzY29yZXVwKHdsY19ody0+c2loKSk7CkBAIC0yNjksMjQgKzI3MywyNCBAQAogICogUGFyYW0gJ2JvdW5kJyBpbmRpY2F0ZXMgbWF4LiAjIGZyYW1lcyB0byBwcm9jZXNzIGJlZm9yZSBicmVhayBvdXQuCiAgKi8KIHN0YXRpYyBib29sIEJDTUZBU1RQQVRICi13bGNfYm1hY19yZWN2KHdsY19od19pbmZvX3QgKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKQord2xjX2JtYWNfcmVjdihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKQogewotCXZvaWQgKnA7Ci0Jdm9pZCAqaGVhZCA9IE5VTEw7Ci0Jdm9pZCAqdGFpbCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJc3RydWN0IHNrX2J1ZmYgKmhlYWQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICp0YWlsID0gTlVMTDsKIAl1aW50IG4gPSAwOwogCXVpbnQgYm91bmRfbGltaXQgPSBib3VuZCA/IHdsY19ody0+d2xjLT5wdWItPnR1bmFibGVzLT5yeGJuZCA6IC0xOwogCXUzMiB0c2ZfaCwgdHNmX2w7CiAJd2xjX2QxMXJ4aGRyX3QgKndsY19yeGhkciA9IE5VTEw7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkvKiBnYXRoZXIgcmVjZWl2ZWQgZnJhbWVzICovCiAJd2hpbGUgKChwID0gZG1hX3J4KHdsY19ody0+ZGlbZmlmb10pKSkgewogCiAJCWlmICghdGFpbCkKIAkJCWhlYWQgPSB0YWlsID0gcDsKIAkJZWxzZSB7Ci0JCQlQS1RTRVRMSU5LKHRhaWwsIHApOworCQkJdGFpbC0+cHJldiA9IHA7CiAJCQl0YWlsID0gcDsKIAkJfQogCkBAIC0zMDMsMTEgKzMwNywxMSBAQAogCiAJLyogcHJvY2VzcyBlYWNoIGZyYW1lICovCiAJd2hpbGUgKChwID0gaGVhZCkgIT0gTlVMTCkgewotCQloZWFkID0gUEtUTElOSyhoZWFkKTsKLQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKKwkJaGVhZCA9IGhlYWQtPnByZXY7CisJCXAtPnByZXYgPSBOVUxMOwogCiAJCS8qIHJlY29yZCB0aGUgdHNmX2wgaW4gd2xjX3J4ZDExaGRyICovCi0JCXdsY19yeGhkciA9ICh3bGNfZDExcnhoZHJfdCAqKSBQS1REQVRBKHApOworCQl3bGNfcnhoZHIgPSAod2xjX2QxMXJ4aGRyX3QgKikgcC0+ZGF0YTsKIAkJd2xjX3J4aGRyLT50c2ZfbCA9IGh0b2wzMih0c2ZfbCk7CiAKIAkJLyogY29tcHV0ZSB0aGUgUlNTSSBmcm9tIGQxMXJ4aGRyIGFuZCByZWNvcmQgaXQgaW4gd2xjX3J4ZDExaHIgKi8KQEAgLTMyMywxNSArMzI3LDE1IEBACiAgKiAgIFJldHVybiB0cnVlIGlmIGFub3RoZXIgZHBjIG5lZWRzIHRvIGJlIHJlLXNjaGVkdWxlZC4gZmFsc2Ugb3RoZXJ3aXNlLgogICogICBQYXJhbSAnYm91bmRlZCcgaW5kaWNhdGVzIGlmIGFwcGxpY2FibGUgbG9vcHMgc2hvdWxkIGJlIGJvdW5kZWQuCiAgKi8KLWJvb2wgQkNNRkFTVFBBVEggd2xjX2RwYyh3bGNfaW5mb190ICp3bGMsIGJvb2wgYm91bmRlZCkKK2Jvb2wgQkNNRkFTVFBBVEggd2xjX2RwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCBib3VuZGVkKQogewogCXUzMiBtYWNpbnRzdGF0dXM7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkJd2xfZG93bih3bGMtPndsKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTM0MCw4ICszNDQsOCBAQAogCW1hY2ludHN0YXR1cyA9IHdsYy0+bWFjaW50c3RhdHVzOwogCXdsYy0+bWFjaW50c3RhdHVzID0gMDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2RwYzogbWFjaW50c3RhdHVzIDB4JXhcbiIsIHdsY19ody0+dW5pdCwKLQkJICBtYWNpbnRzdGF0dXMpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2RwYzogbWFjaW50c3RhdHVzIDB4JXhcbiIsCisJCSB3bGNfaHctPnVuaXQsIG1hY2ludHN0YXR1cyk7CiAKIAlpZiAobWFjaW50c3RhdHVzICYgTUlfUFJRKSB7CiAJCS8qIFByb2Nlc3MgcHJvYmUgcmVxdWVzdCBGSUZPICovCkBAIC0zNjQsNyArMzY4LDcgQEAKIAkJaWYgKHdsY19ibWFjX3R4c3RhdHVzKHdsYy0+aHcsIGJvdW5kZWQsICZmYXRhbCkpCiAJCQl3bGMtPm1hY2ludHN0YXR1cyB8PSBNSV9URlM7CiAJCWlmIChmYXRhbCkgewotCQkJV0xfRVJST1IoKCJNSV9URlM6IGZhdGFsXG4iKSk7CisJCQlXTF9FUlJPUigiTUlfVEZTOiBmYXRhbFxuIik7CiAJCQlnb3RvIGZhdGFsOwogCQl9CiAJfQpAQCAtMzc0LDcgKzM3OCw3IEBACiAKIAkvKiBBVElNIHdpbmRvdyBlbmQgKi8KIAlpZiAobWFjaW50c3RhdHVzICYgTUlfQVRJTVdJTkVORCkgewotCQlXTF9UUkFDRSgoIndsY19pc3I6IGVuZCBvZiBBVElNIHdpbmRvd1xuIikpOworCQlXTF9UUkFDRSgid2xjX2lzcjogZW5kIG9mIEFUSU0gd2luZG93XG4iKTsKIAogCQlPUl9SRUcod2xjX2h3LT5vc2gsICZyZWdzLT5tYWNjb21tYW5kLCB3bGMtPnF2YWxpZCk7CiAJCXdsYy0+cXZhbGlkID0gMDsKQEAgLTM5NSw3ICszOTksNyBAQAogCS8qIFRYIEZJRk8gc3VzcGVuZC9mbHVzaCBjb21wbGV0aW9uICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX1RYU1RPUCkgewogCQlpZiAod2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQod2xjX2h3LCBUWF9EQVRBX0ZJRk8pKSB7Ci0JCQkvKiAgICAgIFdMX0VSUk9SKCgiZHBjOiBmaWZvX3N1c3BlbmRfY29tbGV0ZVxuIikpOyAqLworCQkJLyogICAgICBXTF9FUlJPUigiZHBjOiBmaWZvX3N1c3BlbmRfY29tbGV0ZVxuIik7ICovCiAJCX0KIAl9CiAKQEAgLTQwNSwxMSArNDA5LDEyIEBACiAJfQogCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0dQMCkgewotCQlXTF9FUlJPUigoIndsJWQ6IFBTTSBtaWNyb2NvZGUgd2F0Y2hkb2cgZmlyZWQgYXQgJWQgKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLCB3bGNfaHctPnVuaXQsIHdsY19ody0+bm93KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHdsY19ody0+bm93KTsKIAogCQlwcmludGtfb25jZSgiJXMgOiBQU00gV2F0Y2hkb2csIGNoaXBpZCAweCV4LCBjaGlwcmV2IDB4JXhcbiIsCi0JCQkgICAgX19mdW5jX18sIENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCksCi0JCQkgICAgQ0hJUFJFVih3bGNfaHctPnNpaC0+Y2hpcHJldikpOworCQkJCQlfX2Z1bmNfXywgd2xjX2h3LT5zaWgtPmNoaXAsCisJCQkJCXdsY19ody0+c2loLT5jaGlwcmV2KTsKIAogCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPnBzbXdkcyk7CiAKQEAgLTQyNyw3ICs0MzIsOCBAQAogCQl1MzIgcmZkID0gUl9SRUcod2xjX2h3LT5vc2gsICZyZWdzLT5waHlkZWJ1ZykgJiBQREJHX1JGRDsKICNlbmRpZgogCi0JCVdMX0VSUk9SKCgid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsIHdsY19ody0+dW5pdCwgcmZkKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIFJGIERpc2FibGUgSW5wdXQgMHgleFxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHJmZCk7CiAKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT5yZmRpc2FibGUpOwogCX0KQEAgLTQ1MiwxMCArNDU4LDEwIEBACiAvKiBjb21tb24gbG93LWxldmVsIHdhdGNoZG9nIGNvZGUgKi8KIHZvaWQgd2xjX2JtYWNfd2F0Y2hkb2codm9pZCAqYXJnKQogewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSBhcmc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY193YXRjaGRvZ1xuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3dhdGNoZG9nXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJaWYgKCF3bGNfaHctPnVwKQogCQlyZXR1cm47CkBAIC00NzYsMTMgKzQ4MiwxMyBAQAogfQogCiB2b2lkCi13bGNfYm1hY19zZXRfY2hhbnNwZWMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLCBib29sIG11dGUsCi0JCSAgICAgIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQord2xjX2JtYWNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAorCQkgICAgICBib29sIG11dGUsIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQogewogCXVpbnQgYmFuZHVuaXQ7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX3NldF9jaGFuc3BlYyAweCV4XG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgY2hhbnNwZWMpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfc2V0X2NoYW5zcGVjIDB4JXhcbiIsCisJCSB3bGNfaHctPnVuaXQsIGNoYW5zcGVjKTsKIAogCXdsY19ody0+Y2hhbnNwZWMgPSBjaGFuc3BlYzsKIApAQCAtNTIwLDcgKzUyNiw4IEBACiAJfQogfQogCi1pbnQgd2xjX2JtYWNfcmV2aW5mb19nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB3bGNfYm1hY19yZXZpbmZvX3QgKnJldmluZm8pCitpbnQgd2xjX2JtYWNfcmV2aW5mb19nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkgd2xjX2JtYWNfcmV2aW5mb190ICpyZXZpbmZvKQogewogCXNpX3QgKnNpaCA9IHdsY19ody0+c2loOwogCXVpbnQgaWR4OwpAQCAtNTU4LDIwICs1NjUsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsY19ibWFjX3N0YXRlX2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHdsY19ibWFjX3N0YXRlX3QgKnN0YXRlKQoraW50IHdsY19ibWFjX3N0YXRlX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgd2xjX2JtYWNfc3RhdGVfdCAqc3RhdGUpCiB7CiAJc3RhdGUtPm1hY2h3Y2FwID0gd2xjX2h3LT5tYWNod2NhcDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHdsY19pbmZvX3QgKndsYywgdWludCBqLCBib29sIHdtZSkKK3N0YXRpYyBib29sIHdsY19ibWFjX2F0dGFjaF9kbWFwaW8oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgaiwgYm9vbCB3bWUpCiB7CiAJdWludCBpOwogCWNoYXIgbmFtZVs4XTsKIAkvKiB1Y29kZSBob3N0IGZsYWcgMiBuZWVkZWQgZm9yIHBpbyBtb2RlLCBpbmRlcGVuZGVudCBvZiBiYW5kIGFuZCBmaWZvICovCiAJdTE2IHBpb19taGYyID0gMDsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1aW50IHVuaXQgPSB3bGNfaHctPnVuaXQ7CiAJd2xjX3R1bmFibGVzX3QgKnR1bmUgPSB3bGMtPnB1Yi0+dHVuYWJsZXM7CiAKQEAgLTU4MSw3ICs1ODgsNyBAQAogCWlmICh3bGNfaHctPmRpWzBdID09IDApIHsJLyogSW5pdCBGSUZPcyAqLwogCQl1aW50IGFkZHJ3aWR0aDsKIAkJaW50IGRtYV9hdHRhY2hfZXJyID0gMDsKLQkJb3NsX3QgKm9zaCA9IHdsY19ody0+b3NoOworCQlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHdsY19ody0+b3NoOwogCiAJCS8qIEZpbmQgb3V0IHRoZSBETUEgYWRkcmVzc2luZyBjYXBhYmlsaXR5IGFuZCBsZXQgT1Mga25vdwogCQkgKiBBbGwgdGhlIGNoYW5uZWxzIHdpdGhpbiBvbmUgRE1BIGNvcmUgaGF2ZSAnY29tbW9uLW1pbmltdW0nIHNhbWUKQEAgLTU4OSwxMCArNTk2LDEwIEBACiAJCSAqLwogCQlhZGRyd2lkdGggPQogCQkgICAgZG1hX2FkZHJ3aWR0aCh3bGNfaHctPnNpaCwgRE1BUkVHKHdsY19odywgRE1BX1RYLCAwKSk7Ci0JCU9TTF9ETUFERFJXSURUSChvc2gsIGFkZHJ3aWR0aCk7CiAKIAkJaWYgKCF3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHdsY19ody0+d2xjLT53bCwgYWRkcndpZHRoKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYXR0YWNoOiBhbGxvY19kbWFfcmVzb3VyY2VzIGZhaWxlZFxuIiwgdW5pdCkpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19hdHRhY2g6IGFsbG9jX2RtYV9yZXNvdXJjZXMgZmFpbGVkXG4iLAorCQkJCSB1bml0KTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC02NjUsOCArNjcyLDcgQEAKIC8qIENsZWFuZXIgdG8gbGVhdmUgdGhpcyBhcyBpZiB3aXRoIEFQIGRlZmluZWQgKi8KIAogCQlpZiAoZG1hX2F0dGFjaF9lcnIpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogZG1hX2F0dGFjaCBmYWlsZWRcbiIsCi0JCQkJICB1bml0KSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2F0dGFjaDogZG1hX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTY4NCw3ICs2OTAsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfYm1hY19kZXRhY2hfZG1hcGlvKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY19ibWFjX2RldGFjaF9kbWFwaW8oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdWludCBqOwogCkBAIC03MDIsMTEgKzcwOCwxMSBAQAogICogICAgaW5pdGlhbGl6ZSBzb2Z0d2FyZSBzdGF0ZSBmb3IgZWFjaCBjb3JlIGFuZCBiYW5kCiAgKiAgICBwdXQgdGhlIHdob2xlIGNoaXAgaW4gcmVzZXQoZHJpdmVyIGRvd24gc3RhdGUpLCBubyBjbG9jawogICovCi1pbnQgd2xjX2JtYWNfYXR0YWNoKHdsY19pbmZvX3QgKndsYywgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LAotCQkgICAgYm9vbCBwaW9tb2RlLCBvc2xfdCAqb3NoLCB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwKLQkJICAgIHZvaWQgKmJ0cGFyYW0pCitpbnQgd2xjX2JtYWNfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCisJCSAgICBib29sIHBpb21vZGUsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzdmEsCisJCSAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0pCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3OwogCWQxMXJlZ3NfdCAqcmVnczsKIAljaGFyICptYWNhZGRyID0gTlVMTDsKIAljaGFyICp2YXJzOwpAQCAtNzE1LDggKzcyMSw4IEBACiAJYm9vbCB3bWUgPSBmYWxzZTsKIAlzaGFyZWRfcGh5X3BhcmFtc190IHNoYV9wYXJhbXM7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsCi0JCSAgdmVuZG9yLCBkZXZpY2UpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleFxuIiwKKwkJIHVuaXQsIHZlbmRvciwgZGV2aWNlKTsKIAogCUFTU0VSVChzaXplb2Yod2xjX2QxMXJ4aGRyX3QpIDw9IFdMX0hXUlhPRkYpOwogCkBAIC03MjksNyArNzM1LDcgQEAKIAl3bGNfaHctPmJhbmQgPSB3bGNfaHctPmJhbmRzdGF0ZVswXTsKIAl3bGNfaHctPl9waW9tb2RlID0gcGlvbW9kZTsKIAotCS8qIHBvcHVsYXRlIHdsY19od19pbmZvX3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KKwkvKiBwb3B1bGF0ZSBzdHJ1Y3Qgd2xjX2h3X2luZm8gd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KIAl3bGNfYm1hY19pbmZvX2luaXQod2xjX2h3KTsKIAogCS8qCkBAIC03NDAsNyArNzQ2LDcgQEAKIAl3bGNfaHctPnNpaCA9IHNpX2F0dGFjaCgodWludCkgZGV2aWNlLCBvc2gsIHJlZ3N2YSwgYnVzdHlwZSwgYnRwYXJhbSwKIAkJCQkmd2xjX2h3LT52YXJzLCAmd2xjX2h3LT52YXJzX3NpemUpOwogCWlmICh3bGNfaHctPnNpaCA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBzaV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHNpX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSAxMTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTc2MCwyMSArNzY2LDIyIEBACiAJCXZhciA9IGdldHZhcih2YXJzLCAidmVuZGlkIik7CiAJCWlmICh2YXIpIHsKIAkJCXZlbmRvciA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKHZhciwgTlVMTCwgMCk7Ci0JCQlXTF9FUlJPUigoIk92ZXJyaWRpbmcgdmVuZG9yIGlkID0gMHgleFxuIiwgdmVuZG9yKSk7CisJCQlXTF9FUlJPUigiT3ZlcnJpZGluZyB2ZW5kb3IgaWQgPSAweCV4XG4iLCB2ZW5kb3IpOwogCQl9CiAJCXZhciA9IGdldHZhcih2YXJzLCAiZGV2aWQiKTsKIAkJaWYgKHZhcikgewogCQkJdTE2IGRldmlkID0gKHUxNikgc2ltcGxlX3N0cnRvdWwodmFyLCBOVUxMLCAwKTsKIAkJCWlmIChkZXZpZCAhPSAweGZmZmYpIHsKIAkJCQlkZXZpY2UgPSBkZXZpZDsKLQkJCQlXTF9FUlJPUigoIk92ZXJyaWRpbmcgZGV2aWNlIGlkID0gMHgleFxuIiwKLQkJCQkJICBkZXZpY2UpKTsKKwkJCQlXTF9FUlJPUigiT3ZlcnJpZGluZyBkZXZpY2UgaWQgPSAweCV4XG4iLAorCQkJCQkgZGV2aWNlKTsKIAkJCX0KIAkJfQogCiAJCS8qIHZlcmlmeSBhZ2FpbiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCAqLwogCQlpZiAoIXdsY19jaGlwbWF0Y2godmVuZG9yLCBkZXZpY2UpKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogVW5zdXBwb3J0ZWQgdmVuZG9yL2RldmljZSAoMHgleC8weCV4KVxuIiwgdW5pdCwgdmVuZG9yLCBkZXZpY2UpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IFVuc3VwcG9ydGVkIHZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsCisJCQkJIHVuaXQsIHZlbmRvciwgZGV2aWNlKTsKIAkJCWVyciA9IDEyOwogCQkJZ290byBmYWlsOwogCQl9CkBAIC04MDksNyArODE2LDggQEAKIAl3bGNfYm1hY19jb3JlcmVzZXQod2xjX2h3LCBXTENfVVNFX0NPUkVGTEFHUyk7CiAKIAlpZiAoIXdsY19ibWFjX3ZhbGlkYXRlX2NoaXBfYWNjZXNzKHdsY19odykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHZhbGlkYXRlX2NoaXBfYWNjZXNzIGZhaWxlZFxuIiwgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB2YWxpZGF0ZV9jaGlwX2FjY2VzcyBmYWlsZWRcbiIsCisJCQkgdW5pdCk7CiAJCWVyciA9IDE0OwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtODIxLDcgKzgyOSw4IEBACiAJCWogPSBCT0FSRFJFVl9QUk9NT1RFRDsKIAl3bGNfaHctPmJvYXJkcmV2ID0gKHUxNikgajsKIAlpZiAoIXdsY192YWxpZGJvYXJkdHlwZSh3bGNfaHcpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBVbnN1cHBvcnRlZCBCcm9hZGNvbSBib2FyZCB0eXBlICgweCV4KSIgIiBvciByZXZpc2lvbiBsZXZlbCAoMHgleClcbiIsIHVuaXQsIHdsY19ody0+c2loLT5ib2FyZHR5cGUsIHdsY19ody0+Ym9hcmRyZXYpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogVW5zdXBwb3J0ZWQgQnJvYWRjb20gYm9hcmQgdHlwZSAoMHgleCkiICIgb3IgcmV2aXNpb24gbGV2ZWwgKDB4JXgpXG4iLAorCQkJIHVuaXQsIHdsY19ody0+c2loLT5ib2FyZHR5cGUsIHdsY19ody0+Ym9hcmRyZXYpOwogCQllcnIgPSAxNTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTgzMyw3ICs4NDIsNyBAQAogCSAgICB8fCAod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX05PUExMRE9XTikpCiAJCXdsY19ibWFjX3BsbHJlcSh3bGNfaHcsIHRydWUsIFdMQ19QTExSRVFfU0hBUkVEKTsKIAotCWlmICgoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwlpZiAoKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJICAgICYmIChzaV9wY2lfd2FyMTYxNjUod2xjX2h3LT5zaWgpKSkKIAkJd2xjLT53YXIxNjE2NSA9IHRydWU7CiAKQEAgLTg0NCw3ICs4NTMsNyBAQAogCX0gZWxzZQogCQl3bGNfaHctPl9uYmFuZHMgPSAxOwogCi0JaWYgKChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzMjI1X0NISVBfSUQpKQorCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpCiAJCXdsY19ody0+X25iYW5kcyA9IDE7CiAKIAkvKiBCTUFDX05PVEU6IHJlbW92ZSBpbml0IG9mIHB1YiB2YWx1ZXMgd2hlbiB3bGNfYXR0YWNoKCkgdW5jb25kaXRpb25hbGx5IGRvZXMgdGhlCkBAIC04NjMsOCArODcyLDggQEAKIAl3bGNfaHctPnBoeXNoaW0gPSB3bGNfcGh5X3NoaW1fYXR0YWNoKHdsY19odywgd2xjLT53bCwgd2xjKTsKIAogCWlmICh3bGNfaHctPnBoeXNoaW0gPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogd2xjX3BoeV9zaGltX2F0dGFjaCBmYWlsZWRcbiIsCi0JCQkgIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogd2xjX3BoeV9zaGltX2F0dGFjaCBmYWlsZWRcbiIsCisJCQkgdW5pdCk7CiAJCWVyciA9IDI1OwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtOTMxLDcgKzk0MCw4IEBACiAJCXdsY19ody0+YmFuZC0+cGkgPSB3bGNfcGh5X2F0dGFjaCh3bGNfaHctPnBoeV9zaCwKIAkJCSh2b2lkICopcmVncywgd2xjX2h3LT5iYW5kLT5iYW5kdHlwZSwgdmFycyk7CiAJCWlmICh3bGNfaHctPmJhbmQtPnBpID09IE5VTEwpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB3bGNfcGh5X2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHdsY19waHlfYXR0YWNoIGZhaWxlZFxuIiwKKwkJCQkgdW5pdCk7CiAJCQllcnIgPSAxNzsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtOTYxLDcgKzk3MSw5IEBACiAJCQkJZ290byBiYWRfcGh5OwogCQl9IGVsc2UgewogIGJhZF9waHk6Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdW5zdXBwb3J0ZWQgcGh5IHR5cGUvcmV2ICglZC8lZClcbiIsIHVuaXQsIHdsY19ody0+YmFuZC0+cGh5dHlwZSwgd2xjX2h3LT5iYW5kLT5waHlyZXYpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHVuc3VwcG9ydGVkIHBoeSB0eXBlL3JldiAoJWQvJWQpXG4iLAorCQkJCSB1bml0LAorCQkJCSB3bGNfaHctPmJhbmQtPnBoeXR5cGUsIHdsY19ody0+YmFuZC0+cGh5cmV2KTsKIAkJCWVyciA9IDE4OwogCQkJZ290byBmYWlsOwogCQl9CkBAIC05OTMsNyArMTAwNSw3IEBACiAJd2xjX2NvcmVkaXNhYmxlKHdsY19odyk7CiAKIAkvKiBNYXRjaCBkcml2ZXIgImRvd24iIHN0YXRlICovCi0JaWYgKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCXNpX3BjaV9kb3duKHdsY19ody0+c2loKTsKIAogCS8qIHJlZ2lzdGVyIHNiIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KQEAgLTEwMTYsMjcgKzEwMjgsMjcgQEAKIAkvKiBpbml0IGV0aGVyYWRkciBzdGF0ZSB2YXJpYWJsZXMgKi8KIAltYWNhZGRyID0gd2xjX2dldF9tYWNhZGRyKHdsY19odyk7CiAJaWYgKG1hY2FkZHIgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogbWFjYWRkciBub3QgZm91bmRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogbWFjYWRkciBub3QgZm91bmRcbiIsIHVuaXQpOwogCQllcnIgPSAyMTsKIAkJZ290byBmYWlsOwogCX0KIAliY21fZXRoZXJfYXRvZShtYWNhZGRyLCAmd2xjX2h3LT5ldGhlcmFkZHIpOwotCWlmIChFVEhFUl9JU0JDQVNUKChjaGFyICopJndsY19ody0+ZXRoZXJhZGRyKSB8fAotCSAgICBFVEhFUl9JU05VTExBRERSKChjaGFyICopJndsY19ody0+ZXRoZXJhZGRyKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogYmFkIG1hY2FkZHIgJXNcbiIsIHVuaXQsCi0JCQkgIG1hY2FkZHIpKTsKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIod2xjX2h3LT5ldGhlcmFkZHIub2N0ZXQpIHx8CisJICAgIGlzX3plcm9fZXRoZXJfYWRkcih3bGNfaHctPmV0aGVyYWRkci5vY3RldCkpIHsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogYmFkIG1hY2FkZHIgJXNcbiIsCisJCQkgdW5pdCwgbWFjYWRkcik7CiAJCWVyciA9IDIyOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JV0xfRVJST1IoKCIlczo6IGRldmljZWlkIDB4JXggbmJhbmRzICVkIGJvYXJkIDB4JXggbWFjYWRkcjogJXNcbiIsCi0JCSAgX19mdW5jX18sIHdsY19ody0+ZGV2aWNlaWQsIHdsY19ody0+X25iYW5kcywKLQkJICB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCBtYWNhZGRyKSk7CisJV0xfRVJST1IoIiVzOjogZGV2aWNlaWQgMHgleCBuYmFuZHMgJWQgYm9hcmQgMHgleCBtYWNhZGRyOiAlc1xuIiwKKwkJIF9fZnVuY19fLCB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsCisJCSB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCBtYWNhZGRyKTsKIAogCXJldHVybiBlcnI7CiAKICBmYWlsOgotCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIGVycikpOworCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IGZhaWxlZCB3aXRoIGVyciAlZFxuIiwgdW5pdCwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMDQ1LDkgKzEwNTcsOSBAQAogICogbWF5IGdldCBvdmVycmlkZXMgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbgogICogIEJNQUNfTk9URVMsIG1vdmUgbG93IG91dCBhbmQgcmVzb2x2ZSB0aGUgZGFuZ2xpbmcgb25lcwogICovCi12b2lkIHdsY19ibWFjX2luZm9faW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfaHctPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19ody0+d2xjOwogCiAJLyogc2V0IGRlZmF1bHQgc3cgbWFjaW50bWFzayB2YWx1ZSAqLwogCXdsYy0+ZGVmbWFjaW50bWFzayA9IERFRl9NQUNJTlRNQVNLOwpAQCAtMTA2NywxMSArMTA3OSwxMSBAQAogLyoKICAqIGxvdyBsZXZlbCBkZXRhY2gKICAqLwotaW50IHdsY19ibWFjX2RldGFjaCh3bGNfaW5mb190ICp3bGMpCitpbnQgd2xjX2JtYWNfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXVpbnQgaTsKIAl3bGNfaHdiYW5kX3QgKmJhbmQ7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJaW50IGNhbGxiYWNrczsKIAogCWNhbGxiYWNrcyA9IDA7CkBAIC0xMDgyLDcgKzEwOTQsNyBAQAogCQkgKi8KIAkJc2lfZGVyZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHdsY19ody0+c2loKTsKIAotCQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCQlzaV9wY2lfc2xlZXAod2xjX2h3LT5zaWgpOwogCX0KIApAQCAtMTExOCw5ICsxMTMwLDkgQEAKIAogfQogCi12b2lkIHdsY19ibWFjX3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19yZXNldFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPnJlc2V0KTsKIApAQCAtMTEzNSwxMyArMTE0NywxMyBAQAogfQogCiB2b2lkCi13bGNfYm1hY19pbml0KHdsY19od19pbmZvX3QgKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKK3dsY19ibWFjX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCiAJCQkgIGJvb2wgbXV0ZSkgewogCXUzMiBtYWNpbnRtYXNrOwogCWJvb2wgZmFzdGNsazsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfaHctPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19ody0+d2xjOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19pbml0XG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfaW5pdFxuIiwgd2xjX2h3LT51bml0KTsKIAogCS8qIHJlcXVlc3QgRkFTVCBjbG9jayBpZiBub3Qgb24gKi8KIAlmYXN0Y2xrID0gd2xjX2h3LT5mb3JjZWZhc3RjbGs7CkBAIC0xMTg2LDExICsxMTk4LDExIEBACiAJCXdsY19jbGtjdGxfY2xrKHdsY19odywgQ0xLX0RZTkFNSUMpOwogfQogCi1pbnQgd2xjX2JtYWNfdXBfcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfdXBfcHJlcChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAl1aW50IGNvcmVtYXNrOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCUFTU0VSVCh3bGNfaHctPndsYy0+cHViLT5od191cCAmJiB3bGNfaHctPndsYy0+bWFjaW50bWFzayA9PSAwKTsKIApAQCAtMTIwOCw3ICsxMjIwLDcgQEAKIAkgKi8KIAljb3JlbWFzayA9ICgxIDw8IHdsY19ody0+d2xjLT5jb3JlLT5jb3JlaWR4KTsKIAotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQlzaV9wY2lfc2V0dXAod2xjX2h3LT5zaWgsIGNvcmVtYXNrKTsKIAogCUFTU0VSVChzaV9jb3JlaWQod2xjX2h3LT5zaWgpID09IEQxMV9DT1JFX0lEKTsKQEAgLTEyMTksMTMgKzEyMzEsMTMgQEAKIAkgKi8KIAlpZiAod2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHdsY19odykpIHsKIAkJLyogcHV0IFNCIFBDSSBpbiBkb3duIHN0YXRlIGFnYWluICovCi0JCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCQlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJCXNpX3BjaV9kb3duKHdsY19ody0+c2loKTsKIAkJd2xjX2JtYWNfeHRhbCh3bGNfaHcsIE9GRik7CiAJCXJldHVybiBCQ01FX1JBRElPT0ZGOwogCX0KIAotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQlzaV9wY2lfdXAod2xjX2h3LT5zaWgpOwogCiAJLyogcmVzZXQgdGhlIGQxMSBjb3JlICovCkBAIC0xMjM0LDkgKzEyNDYsOSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2xjX2JtYWNfdXBfZmluaXNoKHdsY19od19pbmZvX3QgKndsY19odykKK2ludCB3bGNfYm1hY191cF9maW5pc2goc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCXdsY19ody0+dXAgPSB0cnVlOwogCXdsY19waHlfaHdfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIHRydWUpOwpAQCAtMTI0OCwxMiArMTI2MCwxMiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2xjX2JtYWNfZG93bl9wcmVwKHdsY19od19pbmZvX3QgKndsY19odykKK2ludCB3bGNfYm1hY19kb3duX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJYm9vbCBkZXZfZ29uZTsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJaWYgKCF3bGNfaHctPnVwKQogCQlyZXR1cm4gY2FsbGJhY2tzOwpAQCAtMTI3NiwxMiArMTI4OCwxMiBAQAogCXJldHVybiBjYWxsYmFja3M7CiB9CiAKLWludCB3bGNfYm1hY19kb3duX2ZpbmlzaCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfZG93bl9maW5pc2goc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdWludCBjYWxsYmFja3MgPSAwOwogCWJvb2wgZGV2X2dvbmU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJaWYgKCF3bGNfaHctPnVwKQogCQlyZXR1cm4gY2FsbGJhY2tzOwpAQCAtMTMxMSw3ICsxMzIzLDcgQEAKIAogCQkvKiB0dXJuIG9mZiBwcmltYXJ5IHh0YWwgYW5kIHBsbCAqLwogCQlpZiAoIXdsY19ody0+bm9yZXNldCkgewotCQkJaWYgKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJCQlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJCQlzaV9wY2lfZG93bih3bGNfaHctPnNpaCk7CiAJCQl3bGNfYm1hY194dGFsKHdsY19odywgT0ZGKTsKIAkJfQpAQCAtMTMyMCw3ICsxMzMyLDcgQEAKIAlyZXR1cm4gY2FsbGJhY2tzOwogfQogCi12b2lkIHdsY19ibWFjX3dhaXRfZm9yX3dha2Uod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY193YWl0X2Zvcl93YWtlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCA0KSkJLyogbm8gc2xvd2Nsb2NrICovCiAJCXVkZWxheSg1KTsKQEAgLTEzMzYsMjkgKzEzNDgsMzAgQEAKIAlBU1NFUlQod2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3LCBNX1VDT0RFX0RCR1NUKSAhPSBEQkdTVF9BU0xFRVApOwogfQogCi12b2lkIHdsY19ibWFjX2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHN0cnVjdCBldGhlcl9hZGRyICplYSkKK3ZvaWQgd2xjX2JtYWNfaHdfZXRoZXJhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpCiB7Ci0JYmNvcHkoJndsY19ody0+ZXRoZXJhZGRyLCBlYSwgRVRIRVJfQUREUl9MRU4pOworCWJjb3B5KCZ3bGNfaHctPmV0aGVyYWRkciwgZWEsIEVUSF9BTEVOKTsKIH0KIAotdm9pZCB3bGNfYm1hY19zZXRfaHdfZXRoZXJhZGRyKHdsY19od19pbmZvX3QgKndsY19odywgc3RydWN0IGV0aGVyX2FkZHIgKmVhKQordm9pZCB3bGNfYm1hY19zZXRfaHdfZXRoZXJhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJICAgICAgIHN0cnVjdCBldGhlcl9hZGRyICplYSkKIHsKLQliY29weShlYSwgJndsY19ody0+ZXRoZXJhZGRyLCBFVEhFUl9BRERSX0xFTik7CisJYmNvcHkoZWEsICZ3bGNfaHctPmV0aGVyYWRkciwgRVRIX0FMRU4pOwogfQogCi1pbnQgd2xjX2JtYWNfYmFuZHR5cGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQoraW50IHdsY19ibWFjX2JhbmR0eXBlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXJldHVybiB3bGNfaHctPmJhbmQtPmJhbmR0eXBlOwogfQogCi12b2lkICp3bGNfY3VyX3BoeSh3bGNfaW5mb190ICp3bGMpCit2b2lkICp3bGNfY3VyX3BoeShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlyZXR1cm4gKHZvaWQgKil3bGNfaHctPmJhbmQtPnBpOwogfQogCiAvKiBjb250cm9sIGNoaXAgY2xvY2sgdG8gc2F2ZSBwb3dlciwgZW5hYmxlIGR5bmFtaWMgY2xvY2sgb3IgZm9yY2UgZmFzdCBjbG9jayAqLwotc3RhdGljIHZvaWQgd2xjX2Nsa2N0bF9jbGsod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG1vZGUpCitzdGF0aWMgdm9pZCB3bGNfY2xrY3RsX2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBtb2RlKQogewogCWlmIChQTVVDVExfRU5BQih3bGNfaHctPnNpaCkpIHsKIAkJLyogbmV3IGNoaXBzIHdpdGggUE1VLCBDQ1NfRk9SQ0VIVCB3aWxsIGRpc3RyaWJ1dGUgdGhlIEhUIGNsb2NrIG9uIGJhY2twbGFuZSwKQEAgLTE0NTUsMTEgKzE0NjgsMTEgQEAKIAogLyogc2V0IGluaXRpYWwgaG9zdCBmbGFncyB2YWx1ZSAqLwogc3RhdGljIHZvaWQKLXdsY19taGZkZWYod2xjX2luZm9fdCAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpCit3bGNfbWhmZGVmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAKLQliemVybyhtaGZzLCBzaXplb2YodTE2KSAqIE1IRk1BWCk7CisJbWVtc2V0KG1oZnMsIDAsIE1IRk1BWCAqIHNpemVvZih1MTYpKTsKIAogCW1oZnNbTUhGMl0gfD0gbWhmMl9pbml0OwogCkBAIC0xNDg1LDcgKzE0OTgsNyBAQAogICogICAgICAgICAgICAgICAgICAgV0xDX0JBTkRfQUxMICA8LS0tIEFsbCBiYW5kcwogICovCiB2b2lkCi13bGNfYm1hY19taGYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLAord2xjX2JtYWNfbWhmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLAogCSAgICAgaW50IGJhbmRzKQogewogCXUxNiBzYXZlOwpAQCAtMTUzOSw3ICsxNTUyLDcgQEAKIAl9CiB9CiAKLXUxNiB3bGNfYm1hY19taGZfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggaWR4LCBpbnQgYmFuZHMpCit1MTYgd2xjX2JtYWNfbWhmX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggaWR4LCBpbnQgYmFuZHMpCiB7CiAJd2xjX2h3YmFuZF90ICpiYW5kOwogCUFTU0VSVChpZHggPCBNSEZNQVgpOwpAQCAtMTU2NSw3ICsxNTc4LDcgQEAKIAlyZXR1cm4gYmFuZC0+bWhmc1tpZHhdOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd3JpdGVfbWhmKHdsY19od19pbmZvX3QgKndsY19odywgdTE2ICptaGZzKQorc3RhdGljIHZvaWQgd2xjX3dyaXRlX21oZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2ICptaGZzKQogewogCXU4IGlkeDsKIAl1MTYgYWRkcltdID0gewpAQCAtMTU4Myw3ICsxNTk2LDcgQEAKIC8qIHNldCB0aGUgbWFjY29udHJvbCByZWdpc3RlciB0byBkZXNpcmVkIHJlc2V0IHN0YXRlIGFuZAogICogaW5pdGlhbGl6ZSB0aGUgc3cgY2FjaGUgb2YgdGhlIHJlZ2lzdGVyCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19tY3RybF9yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJLyogSUhSIGFjY2Vzc2VzIGFyZSBhbHdheXMgZW5hYmxlZCwgUFNNIGRpc2FibGVkLCBIUFMgb2ZmIGFuZCBXQUtFIG9uICovCiAJd2xjX2h3LT5tYWNjb250cm9sID0gMDsKQEAgLTE1OTQsNyArMTYwNyw3IEBACiB9CiAKIC8qIHNldCBvciBjbGVhciBtYWNjb250cm9sIGJpdHMgKi8KLXZvaWQgd2xjX2JtYWNfbWN0cmwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgbWFzaywgdTMyIHZhbCkKK3ZvaWQgd2xjX2JtYWNfbWN0cmwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBtYXNrLCB1MzIgdmFsKQogewogCXUzMiBtYWNjb250cm9sOwogCXUzMiBuZXdfbWFjY29udHJvbDsKQEAgLTE2MTYsNyArMTYyOSw3IEBACiB9CiAKIC8qIHdyaXRlIHRoZSBzb2Z0d2FyZSBzdGF0ZSBvZiBtYWNjb250cm9sIGFuZCBvdmVycmlkZXMgdG8gdGhlIG1hY2NvbnRyb2wgcmVnaXN0ZXIgKi8KLXN0YXRpYyB2b2lkIHdsY19tY3RybF93cml0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfbWN0cmxfd3JpdGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdTMyIG1hY2NvbnRyb2wgPSB3bGNfaHctPm1hY2NvbnRyb2w7CiAKQEAgLTE2MzMsNyArMTY0Niw3IEBACiAJV19SRUcod2xjX2h3LT5vc2gsICZ3bGNfaHctPnJlZ3MtPm1hY2NvbnRyb2wsIG1hY2NvbnRyb2wpOwogfQogCi12b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCit2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIG92ZXJyaWRlX2JpdCkKIHsKIAlBU1NFUlQoKHdsY19ody0+d2FrZV9vdmVycmlkZSAmIG92ZXJyaWRlX2JpdCkgPT0gMCk7CiAKQEAgLTE2NTAsNyArMTY2Myw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX2NsZWFyKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIG92ZXJyaWRlX2JpdCkKK3ZvaWQgd2xjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCiB7CiAJQVNTRVJUKHdsY19ody0+d2FrZV9vdmVycmlkZSAmIG92ZXJyaWRlX2JpdCk7CiAKQEAgLTE2NzEsNyArMTY4NCw3IEBACiAgKiBTVEEgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAxIDwtLS0gVGhpcyB3aWxsIGVuc3VyZSBubyBiZWFjb25zCiAgKiBJQlNTICAgICAgICAgICAgICAwICAgICAgICAgICAgICAwCiAgKi8KLXN0YXRpYyB2b2lkIHdsY191Y29kZV9tdXRlX292ZXJyaWRlX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJd2xjX2h3LT5tdXRlX292ZXJyaWRlID0gMTsKIApAQCAtMTY4Nyw3ICsxNzAwLDcgQEAKIH0KIAogLyogQ2xlYXIgdGhlIG92ZXJyaWRlIG9uIEFQIGFuZCBJTkZSQSBiaXRzICovCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAod2xjX2h3LT5tdXRlX292ZXJyaWRlID09IDApCiAJCXJldHVybjsKQEAgLTE3MDcsMTYgKzE3MjAsMTYgQEAKICAqIFdyaXRlIGEgTUFDIGFkZHJlc3MgdG8gdGhlIHJjbXRhIHN0cnVjdHVyZQogICovCiB2b2lkCi13bGNfYm1hY19zZXRfcmNtdGEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBpbnQgaWR4LAord2xjX2JtYWNfc2V0X3JjbXRhKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBpbnQgaWR4LAogCQkgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdm9sYXRpbGUgdTE2ICpvYmpkYXRhMTYgPSAodm9sYXRpbGUgdTE2ICopJnJlZ3MtPm9iamRhdGE7CiAJdTMyIG1hY19obTsKIAl1MTYgbWFjX2w7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJQVNTRVJUKHdsY19ody0+Y29yZXJldiA+IDQpOwogCkBAIC0xNzQwLDE2ICsxNzUzLDE2IEBACiAgKiBXcml0ZSBhIE1BQyBhZGRyZXNzIHRvIHRoZSBnaXZlbiBtYXRjaCByZWcgb2Zmc2V0IGluIHRoZSBSWEUgbWF0Y2ggZW5naW5lLgogICovCiB2b2lkCi13bGNfYm1hY19zZXRfYWRkcm1hdGNoKHdsY19od19pbmZvX3QgKndsY19odywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCit3bGNfYm1hY19zZXRfYWRkcm1hdGNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBpbnQgbWF0Y2hfcmVnX29mZnNldCwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAl1MTYgbWFjX2w7CiAJdTE2IG1hY19tOwogCXUxNiBtYWNfaDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19zZXRfYWRkcm1hdGNoXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfc2V0X2FkZHJtYXRjaFxuIiwgd2xjX2h3LT51bml0KTsKIAogCUFTU0VSVCgobWF0Y2hfcmVnX29mZnNldCA8IFJDTV9TSVpFKSB8fCAod2xjX2h3LT5jb3JlcmV2ID09IDQpKTsKIApAQCAtMTc2OSw3ICsxNzgyLDcgQEAKIH0KIAogdm9pZAotd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19od19pbmZvX3QgKndsY19odywgaW50IG9mZnNldCwgaW50IGxlbiwKK3dsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IG9mZnNldCwgaW50IGxlbiwKIAkJCSAgICB2b2lkICpidWYpCiB7CiAJZDExcmVnc190ICpyZWdzOwpAQCAtMTc3OCw5ICsxNzkxLDkgQEAKICNpZmRlZiBJTF9CSUdFTkRJQU4KIAl2b2xhdGlsZSB1MTYgKmRwdHIgPSBOVUxMOwogI2VuZGlmCQkJCS8qIElMX0JJR0VORElBTiAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbVxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbVxuIiwgd2xjX2h3LT51bml0KTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0xODEyLDkgKzE4MjUsOSBAQAogCX0KIH0KIAotdm9pZCB3bGNfYm1hY19zZXRfY3dtaW4od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgbmV3bWluKQordm9pZCB3bGNfYm1hY19zZXRfY3dtaW4oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBuZXdtaW4pCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCW9zaCA9IHdsY19ody0+b3NoOwogCXdsY19ody0+YmFuZC0+Q1dtaW4gPSBuZXdtaW47CkBAIC0xODI0LDkgKzE4MzcsOSBAQAogCVdfUkVHKG9zaCwgJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWluKTsKIH0KIAotdm9pZCB3bGNfYm1hY19zZXRfY3dtYXgod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgbmV3bWF4KQordm9pZCB3bGNfYm1hY19zZXRfY3dtYXgoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBuZXdtYXgpCiB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCW9zaCA9IHdsY19ody0+b3NoOwogCXdsY19ody0+YmFuZC0+Q1dtYXggPSBuZXdtYXg7CkBAIC0xODM2LDcgKzE4NDksNyBAQAogCVdfUkVHKG9zaCwgJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWF4KTsKIH0KIAotdm9pZCB3bGNfYm1hY19id19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgYncpCit2b2lkIHdsY19ibWFjX2J3X3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IGJ3KQogewogCWJvb2wgZmFzdGNsazsKIAl1MzIgdG1wOwpAQCAtMTg2MSw3ICsxODc0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdsY193cml0ZV9od19iY250ZW1wbGF0ZTAod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCit3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCkBAIC0xODc1LDcgKzE4ODgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHZvaWQgKmJjbiwgaW50IGxlbikKK3dsY193cml0ZV9od19iY250ZW1wbGF0ZTEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHZvaWQgKmJjbiwgaW50IGxlbikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAKQEAgLTE4OTAsNyArMTkwMyw3IEBACiAKIC8qIG1hYyBpcyBhc3N1bWVkIHRvIGJlIHN1c3BlbmRlZCBhdCB0aGlzIHBvaW50ICovCiB2b2lkCi13bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4sCit3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHZvaWQgKmJjbiwgaW50IGxlbiwKIAkJCSAgICAgICBib29sIGJvdGgpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwpAQCAtMTkxMSwxMCArMTkyNCwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19ibWFjX3VwZF9zeW50aHB1KSAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19ibWFjX3VwZF9zeW50aHB1KSAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdTE2IHY7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAkvKiB1cGRhdGUgU1lOVEhQVV9ETFkgKi8KIAogCWlmIChXTENJU0xDTlBIWSh3bGMtPmJhbmQpKSB7CkBAIC0xOTMwLDEyICsxOTQzLDEyIEBACiAKIC8qIGJhbmQtc3BlY2lmaWMgaW5pdCAqLwogc3RhdGljIHZvaWQKLVdMQkFORElOSVRGTih3bGNfYm1hY19ic2luaXQpICh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCitXTEJBTkRJTklURk4od2xjX2JtYWNfYnNpbml0KSAoc3RydWN0IHdsY19pbmZvICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX2JzaW5pdDogYmFuZHVuaXQgJWRcbiIsIHdsY19ody0+dW5pdCwKLQkJICB3bGNfaHctPmJhbmQtPmJhbmR1bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2JzaW5pdDogYmFuZHVuaXQgJWRcbiIsCisJCSB3bGNfaHctPnVuaXQsIHdsY19ody0+YmFuZC0+YmFuZHVuaXQpOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKFBIWV9UWVBFKFJfUkVHKHdsY19ody0+b3NoLCAmd2xjX2h3LT5yZWdzLT5waHl2ZXJzaW9uKSkgIT0KQEAgLTE5NjksOSArMTk4Miw5IEBACiAJd2xjX2JtYWNfdXBkX3N5bnRocHUod2xjX2h3KTsKIH0KIAotdm9pZCB3bGNfYm1hY19jb3JlX3BoeV9jbGsod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsaykKK3ZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsaykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX2NvcmVfcGh5X2NsazogY2xrICVkXG4iLCB3bGNfaHctPnVuaXQsIGNsaykpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeV9jbGs6IGNsayAlZFxuIiwgd2xjX2h3LT51bml0LCBjbGspOwogCiAJd2xjX2h3LT5waHljbGsgPSBjbGs7CiAKQEAgLTE5OTQsOSArMjAwNyw5IEBACiB9CiAKIC8qIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBQSFkgUExMICovCi12b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfY29yZV9waHlwbGxfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJc2lfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAogCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2xfYWRkciksIH4wLCAwKTsKQEAgLTIwMTUsNyArMjAyOCw3IEBACiAvKiBsaWdodCB3YXkgdG8gdHVybiBvbiBwaHkgY2xvY2sgd2l0aG91dCByZXNldCBmb3IgTlBIWSBvbmx5CiAgKiAgcmVmZXIgdG8gd2xjX2JtYWNfY29yZV9waHlfY2xrIGZvciBmdWxsIHZlcnNpb24KICAqLwotdm9pZCB3bGNfYm1hY19waHljbGtfZmdjKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspCit2b2lkIHdsY19ibWFjX3BoeWNsa19mZ2Moc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgY2xrKQogewogCS8qIHN1cHBvcnQobmVjZXNzYXJ5IGZvciBOUEhZIGFuZCBIWVBIWSkgb25seSAqLwogCWlmICghV0xDSVNOUEhZKHdsY19ody0+YmFuZCkpCkBAIC0yMDI4LDcgKzIwNDEsNyBAQAogCiB9CiAKLXZvaWQgd2xjX2JtYWNfbWFjcGh5Y2xrX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKQordm9pZCB3bGNfYm1hY19tYWNwaHljbGtfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsaykKIHsKIAlpZiAoT04gPT0gY2xrKQogCQlzaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9NUENMS0UsIFNJQ0ZfTVBDTEtFKTsKQEAgLTIwMzYsMTMgKzIwNDksMTMgQEAKIAkJc2lfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfTVBDTEtFLCAwKTsKIH0KIAotdm9pZCB3bGNfYm1hY19waHlfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19waHlfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJd2xjX3BoeV90ICpwaWggPSB3bGNfaHctPmJhbmQtPnBpOwogCXUzMiBwaHlfYndfY2xrYml0czsKIAlib29sIHBoeV9pbl9yZXNldCA9IGZhbHNlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19waHlfcmVzZXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19waHlfcmVzZXRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlpZiAocGloID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTIwODAsOSArMjA5Myw5IEBACiAKIC8qIHN3aXRjaCB0byBhbmQgaW5pdGlhbGl6ZSBuZXcgYmFuZCAqLwogc3RhdGljIHZvaWQKLVdMQkFORElOSVRGTih3bGNfYm1hY19zZXRiYW5kKSAod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGJhbmR1bml0LAorV0xCQU5ESU5JVEZOKHdsY19ibWFjX3NldGJhbmQpIChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBiYW5kdW5pdCwKIAkJCQljaGFuc3BlY190IGNoYW5zcGVjKSB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAl1MzIgbWFjaW50bWFzazsKIAogCUFTU0VSVChOQkFORFNfSFcod2xjX2h3KSA+IDEpOwpAQCAtMjEyMiw5ICsyMTM1LDkgQEAKIH0KIAogLyogbG93LWxldmVsIGJhbmQgc3dpdGNoIHV0aWxpdHkgcm91dGluZSAqLwotdm9pZCBXTEJBTkRJTklURk4od2xjX3NldHhiYW5kKSAod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGJhbmR1bml0KQordm9pZCBXTEJBTkRJTklURk4od2xjX3NldHhiYW5kKSAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0eGJhbmQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsIGJhbmR1bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19zZXR4YmFuZDogYmFuZHVuaXQgJWRcbiIsIHdsY19ody0+dW5pdCwgYmFuZHVuaXQpOwogCiAJd2xjX2h3LT5iYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbYmFuZHVuaXRdOwogCkBAIC0yMTM4LDE5ICsyMTUxLDE5IEBACiAJfQogfQogCi1zdGF0aWMgYm9vbCB3bGNfaXNnb29kY2hpcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgYm9vbCB3bGNfaXNnb29kY2hpcChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAogCS8qIHJlamVjdCB1bnN1cHBvcnRlZCBjb3JlcmV2ICovCiAJaWYgKCFWQUxJRF9DT1JFUkVWKHdsY19ody0+Y29yZXJldikpIHsKLQkJV0xfRVJST1IoKCJ1bnN1cHBvcnRlZCBjb3JlIHJldiAlZFxuIiwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCVdMX0VSUk9SKCJ1bnN1cHBvcnRlZCBjb3JlIHJldiAlZFxuIiwgd2xjX2h3LT5jb3JlcmV2KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfdmFsaWRib2FyZHR5cGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIGJvb2wgd2xjX3ZhbGlkYm9hcmR0eXBlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgZ29vZGJvYXJkID0gdHJ1ZTsKIAl1aW50IGJvYXJkcmV2ID0gd2xjX2h3LT5ib2FyZHJldjsKQEAgLTIxNzQsNyArMjE4Nyw3IEBACiAJcmV0dXJuIGdvb2Rib2FyZDsKIH0KIAotc3RhdGljIGNoYXIgKndsY19nZXRfbWFjYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgY2hhciAqd2xjX2dldF9tYWNhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWNvbnN0IGNoYXIgKnZhcm5hbWUgPSAibWFjYWRkciI7CiAJY2hhciAqbWFjYWRkcjsKQEAgLTIxOTEsNyArMjIwNCw4IEBACiAKIAltYWNhZGRyID0gZ2V0dmFyKHdsY19ody0+dmFycywgdmFybmFtZSk7CiAJaWYgKG1hY2FkZHIgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19nZXRfbWFjYWRkcjogbWFjYWRkciBnZXR2YXIoJXMpIG5vdCBmb3VuZFxuIiwgd2xjX2h3LT51bml0LCB2YXJuYW1lKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfZ2V0X21hY2FkZHI6IG1hY2FkZHIgZ2V0dmFyKCVzKSBub3QgZm91bmRcbiIsCisJCQkgd2xjX2h3LT51bml0LCB2YXJuYW1lKTsKIAl9CiAKIAlyZXR1cm4gbWFjYWRkcjsKQEAgLTIyMDMsNyArMjIxNyw3IEBACiAgKiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGNhbGxlZCB3aGVuIGRyaXZlciBpcyBkb3duIGFuZCB3L28gY2xvY2sKICAqIGl0IG9wZXJhdGVzIG9uIGRpZmZlcmVudCByZWdpc3RlcnMgZGVwZW5kaW5nIG9uIGNvcmVyZXYgYW5kIGJvYXJkZmxhZy4KICAqLwotYm9vbCB3bGNfYm1hY19yYWRpb19yZWFkX2h3ZGlzYWJsZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorYm9vbCB3bGNfYm1hY19yYWRpb19yZWFkX2h3ZGlzYWJsZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJYm9vbCB2LCBjbGssIHh0YWw7CiAJdTMyIHJlc2V0Yml0cyA9IDAsIGZsYWdzID0gMDsKQEAgLTIyMjYsOSArMjI0MCw5IEBACiAJCQlmbGFncyB8PSBTSUNGX1BDTEtFOwogCiAJCS8qIEFJIGNoaXAgZG9lc24ndCByZXN0b3JlIGJhcjB3aW4yIG9uIGhpYmVybmF0aW9uL3Jlc3VtZSwgbmVlZCBzdyBmaXh1cCAqLwotCQlpZiAoKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzMjI1X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSkKKwkJaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAorCQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpIHx8CisJCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpCiAJCQl3bGNfaHctPnJlZ3MgPQogCQkJICAgIChkMTFyZWdzX3QgKikgc2lfc2V0Y29yZSh3bGNfaHctPnNpaCwgRDExX0NPUkVfSUQsCiAJCQkJCQkgICAgIDApOwpAQCAtMjI0OSwxMiArMjI2MywxMiBAQAogfQogCiAvKiBJbml0aWFsaXplIGp1c3QgdGhlIGhhcmR3YXJlIHdoZW4gY29taW5nIG91dCBvZiBQT1Igb3IgUzMvUzUgc3lzdGVtIHN0YXRlcyAqLwotdm9pZCB3bGNfYm1hY19od191cCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX2h3X3VwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWlmICh3bGNfaHctPndsYy0+cHViLT5od191cCkKIAkJcmV0dXJuOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCS8qCiAJICogRW5hYmxlIHBsbCBhbmQgeHRhbCwgaW5pdGlhbGl6ZSB0aGUgcG93ZXIgY29udHJvbCByZWdpc3RlcnMsCkBAIC0yMjY0LDEzICsyMjc4LDEzIEBACiAJc2lfY2xrY3RsX2luaXQod2xjX2h3LT5zaWgpOwogCXdsY19jbGtjdGxfY2xrKHdsY19odywgQ0xLX0ZBU1QpOwogCi0JaWYgKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpIHsKKwlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlzaV9wY2lfZml4Y2ZnKHdsY19ody0+c2loKTsKIAogCQkvKiBBSSBjaGlwIGRvZXNuJ3QgcmVzdG9yZSBiYXIwd2luMiBvbiBoaWJlcm5hdGlvbi9yZXN1bWUsIG5lZWQgc3cgZml4dXAgKi8KLQkJaWYgKChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpCisJCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKQogCQkJd2xjX2h3LT5yZWdzID0KIAkJCSAgICAoZDExcmVnc190ICopIHNpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELAogCQkJCQkJICAgICAwKTsKQEAgLTIyODMsNyArMjI5Nyw3IEBACiAJd2xjX2h3LT53bGMtPnB1Yi0+aHdfdXAgPSB0cnVlOwogCiAJaWYgKCh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKQotCSAgICAmJiAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzEzX0NISVBfSUQpKSB7CisJICAgICYmICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CiAJCWlmICghCiAJCSAgICAod2xjX2h3LT5ib2FyZHJldiA+PSAweDEyNTAKIAkJICAgICAmJiAod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX0ZFTV9CVCkpKQpAQCAtMjI5MSwxMCArMjMwNSwxMCBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2RtYV9yeHJlc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdWludCBmaWZvKQorc3RhdGljIGJvb2wgd2xjX2RtYV9yeHJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8pCiB7Ci0JaG5kZG1hX3QgKmRpID0gd2xjX2h3LT5kaVtmaWZvXTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBobmRkbWFfcHViICpkaSA9IHdsY19ody0+ZGlbZmlmb107CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAoRDExUkVWX0xUKHdsY19ody0+Y29yZXJldiwgMTIpKSB7CiAJCWJvb2wgcnhpZGxlID0gdHJ1ZTsKQEAgLTIzMDksNyArMjMyMyw4IEBACiAJCQkgNTAwMDApOwogCiAJCWlmICghcnhpZGxlICYmIChyY3ZfZnJtX2NudCAhPSAwKSkKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IHJ4ZG1hWyVkXSBub3QgaWRsZSAmJiByY3ZfZnJtX2NudCglZCkgbm90IHplcm9cbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGZpZm8sIHJjdl9mcm1fY250KSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IHJ4ZG1hWyVkXSBub3QgaWRsZSAmJiByY3ZfZnJtX2NudCglZCkgbm90IHplcm9cbiIsCisJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGZpZm8sIHJjdl9mcm1fY250KTsKIAkJbWRlbGF5KDIpOwogCX0KIApAQCAtMjMyNCw3ICsyMzM5LDcgQEAKICAqICAgY2xlYXIgc29mdHdhcmUgbWFjaW50c3RhdHVzIGZvciBmcmVzaCBuZXcgc3RhcnQKICAqIG9uZSB0ZXN0aW5nIGhhY2sgd2xjX2h3LT5ub3Jlc2V0IHdpbGwgYnlwYXNzIHRoZSBkMTEvcGh5IHJlc2V0CiAgKi8KLXZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGZsYWdzKQordm9pZCB3bGNfYm1hY19jb3JlcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBmbGFncykKIHsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJdWludCBpOwpAQCAtMjMzNCw3ICsyMzQ5LDcgQEAKIAlpZiAoZmxhZ3MgPT0gV0xDX1VTRV9DT1JFRkxBR1MpCiAJCWZsYWdzID0gKHdsY19ody0+YmFuZC0+cGkgPyB3bGNfaHctPmJhbmQtPmNvcmVfZmxhZ3MgOiAwKTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJcmVncyA9IHdsY19ody0+cmVnczsKIApAQCAtMjM0NywxNyArMjM2MiwyMCBAQAogCWlmIChzaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpIHsKIAkJZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCiAJCQlpZiAoKHdsY19ody0+ZGlbaV0pICYmICghZG1hX3R4cmVzZXQod2xjX2h3LT5kaVtpXSkpKSB7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZG1hX3R4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGkpKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLAorCQkJCQkgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgaSk7CiAJCQl9CiAKIAkJaWYgKCh3bGNfaHctPmRpW1JYX0ZJRk9dKQogCQkgICAgJiYgKCF3bGNfZG1hX3J4cmVzZXQod2xjX2h3LCBSWF9GSUZPKSkpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV9yeHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBSWF9GSUZPKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IGRtYV9yeHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLAorCQkJCSB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBSWF9GSUZPKTsKIAkJfQogCQlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgNCkKIAkJICAgICYmIHdsY19ody0+ZGlbUlhfVFhTVEFUVVNfRklGT10KIAkJICAgICYmICghd2xjX2RtYV9yeHJlc2V0KHdsY19odywgUlhfVFhTVEFUVVNfRklGTykpKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfVFhTVEFUVVNfRklGTykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKKwkJCQkgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfVFhTVEFUVVNfRklGTyk7CiAJCX0KIAl9CiAJLyogaWYgbm9yZXNldCwganVzdCBzdG9wIHRoZSBwc20gYW5kIHJldHVybiAqLwpAQCAtMjQxMywxNCArMjQzMSwxNCBAQAogICogdHhmaWZvIHNpemVzIG5lZWRzIHRvIGJlIG1vZGlmaWVkKGluY3JlYXNlZCkgc2luY2UgdGhlIG5ld2VyIGNvcmVzCiAgKiBoYXZlIG1vcmUgbWVtb3J5LgogICovCi1zdGF0aWMgdm9pZCB3bGNfY29yZXJldl9maWZvZml4dXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX2NvcmVyZXZfZmlmb2ZpeHVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAl1MTYgZmlmb19udTsKIAl1MTYgdHhmaWZvX3N0YXJ0YmxrID0gVFhGSUZPX1NUQVJUX0JMSywgdHhmaWZvX2VuZGJsazsKIAl1MTYgdHhmaWZvX2RlZiwgdHhmaWZvX2RlZjE7CiAJdTE2IHR4Zmlmb19jbWQ7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCWlmIChEMTFSRVZfTFQod2xjX2h3LT5jb3JlcmV2LCA5KSkKIAkJZ290byBleGl0OwpAQCAtMjQ3MywyMiArMjQ5MSwyMiBAQAogICogICBjb25maWcgb3RoZXIgY29yZSByZWdpc3RlcnMKICAqICAgaW5pdCBkbWEKICAqLwotc3RhdGljIHZvaWQgd2xjX2NvcmVpbml0KHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19jb3JlaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJdTMyIHNmbGFnczsKIAl1aW50IGJjbmludF91czsKIAl1aW50IGkgPSAwOwogCWJvb2wgZmlmb3N6X2ZpeHVwID0gZmFsc2U7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlpbnQgZXJyID0gMDsKIAl1MTYgYnVmW05GSUZPXTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jb3JlaW5pdFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jb3JlaW5pdFxuIiwgd2xjX2h3LT51bml0KTsKIAogCS8qIHJlc2V0IFBTTSAqLwogCXdsY19ibWFjX21jdHJsKHdsY19odywgfjAsIChNQ1RMX0lIUl9FTiB8IE1DVExfUFNNX0pNUF8wIHwgTUNUTF9XQUtFKSk7CkBAIC0yNTExLDggKzI1MjksOCBAQAogCVNQSU5XQUlUKCgoUl9SRUcob3NoLCAmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCksCiAJCSAxMDAwICogMTAwMCk7CiAJaWYgKChSX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRzdGF0dXMpICYgTUlfTUFDU1NQTkREKSA9PSAwKQotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19jb3JlaW5pdDogdWNvZGUgZGlkIG5vdCBzZWxmLXN1c3BlbmQhXG4iLAotCQkJICB3bGNfaHctPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19jb3JlaW5pdDogdWNvZGUgZGlkIG5vdCBzZWxmLXN1c3BlbmQhXG4iLAorCQkJIHdsY19ody0+dW5pdCk7CiAKIAl3bGNfZ3Bpb19pbml0KHdsYyk7CiAKQEAgLTI1MjIsMTggKzI1NDAsMTggQEAKIAkJaWYgKFdMQ0lTTlBIWSh3bGNfaHctPmJhbmQpKQogCQkJd2xjX3dyaXRlX2luaXRzKHdsY19odywgZDExbjBpbml0dmFsczE2KTsKIAkJZWxzZQotCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJfSBlbHNlIGlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyNCkpIHsKIAkJaWYgKFdMQ0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMWxjbjBpbml0dmFsczI0KTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCQl9CiAJfSBlbHNlIHsKLQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgY29yZXJldiAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgY29yZXJldiAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCX0KIAogCS8qIEZvciBvbGQgdWNvZGUsIHR4ZmlmbyBzaXplcyBuZWVkcyB0byBiZSBtb2RpZmllZChpbmNyZWFzZWQpIGZvciBDb3JlcmV2ID49IDkgKi8KQEAgLTI1NzUsNyArMjU5Myw4IEBACiAJCWVyciA9IC0xOwogCX0KIAlpZiAoZXJyICE9IDApIHsKLQkJV0xfRVJST1IoKCJ3bGNfY29yZWluaXQ6IHR4ZmlmbyBtaXNtYXRjaDogdWNvZGUgc2l6ZSAlZCBkcml2ZXIgc2l6ZSAlZCBpbmRleCAlZFxuIiwgYnVmW2ldLCB3bGNfaHctPnhtdGZpZm9fc3pbaV0sIGkpKTsKKwkJV0xfRVJST1IoIndsY19jb3JlaW5pdDogdHhmaWZvIG1pc21hdGNoOiB1Y29kZSBzaXplICVkIGRyaXZlciBzaXplICVkIGluZGV4ICVkXG4iLAorCQkJIGJ1ZltpXSwgd2xjX2h3LT54bXRmaWZvX3N6W2ldLCBpKTsKIAkJLyogRE8gTk9UIEFTU0VSVCBjb3JlcmV2IDwgNCBldmVuIHRoZXJlIGlzIGEgbWlzbWF0Y2gKIAkJICogc2htZW0sIHNpbmNlIGRyaXZlciBkb24ndCBvdmVyd3JpdGUgdGhvc2UgY2hpcCBhbmQKIAkJICogdWNvZGUgaW5pdGlhbGl6ZSBkYXRhIHdpbGwgYmUgdXNlZC4KQEAgLTI2ODQsMTUgKzI3MDMsMTUgQEAKICAqICAtIDU1OTI0MSA9IDB4ODg4ODkgPT4gdHNmX2Nsa19mcmFjX2ggPSAweDgsIHRzZl9jbGtfZnJhY19sID0gMHg4ODg5CiAgKi8KIAotdm9pZCB3bGNfYm1hY19zd2l0Y2hfbWFjZnJlcSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHNwdXJtb2RlKQordm9pZCB3bGNfYm1hY19zd2l0Y2hfbWFjZnJlcShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggc3B1cm1vZGUpCiB7CiAJZDExcmVnc190ICpyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJcmVncyA9IHdsY19ody0+cmVnczsKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAotCWlmICgoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSkgeworCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKSB7CiAJCWlmIChzcHVybW9kZSA9PSBXTF9TUFVSQVZPSURfT04yKSB7CS8qIDEyNk1oeiAqLwogCQkJV19SRUcob3NoLCAmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4MjA4Mik7CiAJCQlXX1JFRyhvc2gsICZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHg4KTsKQEAgLTI3MTUsMTIgKzI3MzQsMTIgQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBHUElPcyB0aGF0IGFyZSBjb250cm9sbGVkIGJ5IEQxMSBjb3JlICovCi1zdGF0aWMgdm9pZCB3bGNfZ3Bpb19pbml0KHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19ncGlvX2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzOwogCXUzMiBnYywgZ207Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0yNzgwLDkgKzI3OTksOSBAQAogCXNpX2dwaW9jb250cm9sKHdsY19ody0+c2loLCBnbSwgZ2MsIEdQSU9fRFJWX1BSSU9SSVRZKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX2Rvd25sb2FkKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKLQl3bGNfaW5mb190ICp3bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGM7CiAJd2xjID0gd2xjX2h3LT53bGM7CiAKIAlpZiAod2xjX2h3LT51Y29kZV9sb2FkZWQpCkBAIC0yNzk0LDMwICsyODEzLDMwIEBACiAJCQkJCWJjbTQzeHhfMTZfbWltb3N6KTsKIAkJCXdsY19ody0+dWNvZGVfbG9hZGVkID0gdHJ1ZTsKIAkJfSBlbHNlCi0JCQlXTF9FUlJPUigoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQkJV0xfRVJST1IoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAl9IGVsc2UgaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDI0KSkgewogCQlpZiAoV0xDSVNMQ05QSFkod2xjX2h3LT5iYW5kKSkgewogCQkJd2xjX3Vjb2RlX3dyaXRlKHdsY19odywgYmNtNDN4eF8yNF9sY24sCiAJCQkJCWJjbTQzeHhfMjRfbGNuc3opOwogCQkJd2xjX2h3LT51Y29kZV9sb2FkZWQgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191Y29kZV93cml0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNvbnN0IHUzMiB1Y29kZVtdLAorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKIAkJCSAgICAgIGNvbnN0IHVpbnQgbmJ5dGVzKSB7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdWludCBpOwogCXVpbnQgY291bnQ7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3Vjb2RlX3dyaXRlXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3Vjb2RlX3dyaXRlXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJQVNTRVJUKElTX0FMSUdORUQobmJ5dGVzLCBzaXplb2YodTMyKSkpOwogCkBAIC0yODI5LDEzICsyODQ4LDEzIEBACiAJCVdfUkVHKG9zaCwgJnJlZ3MtPm9iamRhdGEsIHVjb2RlW2ldKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3dyaXRlX2luaXRzKHdsY19od19pbmZvX3QgKndsY19odywgY29uc3QgZDExaW5pdF90ICppbml0cykKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY29uc3QgZDExaW5pdF90ICppbml0cykKIHsKIAlpbnQgaTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXZvbGF0aWxlIHU4ICpiYXNlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfd3JpdGVfaW5pdHNcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfd3JpdGVfaW5pdHNcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAliYXNlID0gKHZvbGF0aWxlIHU4ICopd2xjX2h3LT5yZWdzOwpAQCAtMjg1Miw3ICsyODcxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3R4YW50X3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAl1MTYgcGh5Y3RsOwogCXUxNiBwaHl0eGFudCA9IHdsY19ody0+Ym1hY19waHl0eGFudDsKQEAgLTI4NjksNyArMjg4OCw3IEBACiAJd2xjX2JtYWNfd3JpdGVfc2htKHdsY19odywgTV9SU1BfUENUTFdELCBwaHljdGwpOwogfQogCi12b2lkIHdsY19ibWFjX3R4YW50X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBwaHl0eGFudCkKK3ZvaWQgd2xjX2JtYWNfdHhhbnRfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpCiB7CiAJLyogdXBkYXRlIHN3IHN0YXRlICovCiAJd2xjX2h3LT5ibWFjX3BoeXR4YW50ID0gcGh5dHhhbnQ7CkBAIC0yODgxLDEyICsyOTAwLDEyIEBACiAKIH0KIAotdTE2IHdsY19ibWFjX2dldF90eGFudCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit1MTYgd2xjX2JtYWNfZ2V0X3R4YW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXJldHVybiAodTE2KSB3bGNfaHctPndsYy0+c3RmLT50eGFudDsKIH0KIAotdm9pZCB3bGNfYm1hY19hbnRzZWxfdHlwZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBhbnRzZWxfdHlwZSkKK3ZvaWQgd2xjX2JtYWNfYW50c2VsX3R5cGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBhbnRzZWxfdHlwZSkKIHsKIAl3bGNfaHctPmFudHNlbF90eXBlID0gYW50c2VsX3R5cGU7CiAKQEAgLTI4OTQsNyArMjkxMyw3IEBACiAJd2xjX3BoeV9hbnRzZWxfdHlwZV9zZXQod2xjX2h3LT5iYW5kLT5waSwgYW50c2VsX3R5cGUpOwogfQogCi12b2lkIHdsY19ibWFjX2ZpZm9lcnJvcnMod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19maWZvZXJyb3JzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAl1aW50IHVuaXQ7CkBAIC0yOTExLDQ0ICsyOTMwLDQ1IEBACiAJCWlmICghaW50c3RhdHVzKQogCQkJY29udGludWU7CiAKLQkJV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19maWZvZXJyb3JzOiBpbnRzdGF0dXMlZCAweCV4XG4iLCB1bml0LAotCQkJICBpZHgsIGludHN0YXR1cykpOworCQlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfZmlmb2Vycm9yczogaW50c3RhdHVzJWQgMHgleFxuIiwKKwkJCSB1bml0LCBpZHgsIGludHN0YXR1cyk7CiAKIAkJaWYgKGludHN0YXR1cyAmIElfUk8pIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogcmVjZWl2ZSBmaWZvIG92ZXJmbG93XG4iLAotCQkJCSAgdW5pdCwgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogcmVjZWl2ZSBmaWZvIG92ZXJmbG93XG4iLAorCQkJCSB1bml0LCBpZHgpOwogCQkJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPnJ4b2Zsbyk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9QQykgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiBkZXNjcmlwdG9yIGVycm9yXG4iLCB1bml0LAotCQkJCSAgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogZGVzY3JpcHRvciBlcnJvclxuIiwKKwkJCQkgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5kbWFkZSk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9QRCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiBkYXRhIGVycm9yXG4iLCB1bml0LCBpZHgpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiBmaWZvICVkOiBkYXRhIGVycm9yXG4iLCB1bml0LCBpZHgpOwogCQkJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPmRtYWRhKTsKIAkJCWZhdGFsID0gdHJ1ZTsKIAkJfQogCiAJCWlmIChpbnRzdGF0dXMgJiBJX0RFKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IGRlc2NyaXB0b3IgcHJvdG9jb2wgZXJyb3JcbiIsCi0JCQkJICB1bml0LCBpZHgpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiBmaWZvICVkOiBkZXNjcmlwdG9yIHByb3RvY29sIGVycm9yXG4iLAorCQkJCSB1bml0LCBpZHgpOwogCQkJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPmRtYXBlKTsKIAkJCWZhdGFsID0gdHJ1ZTsKIAkJfQogCiAJCWlmIChpbnRzdGF0dXMgJiBJX1JVKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZGVzY3JpcHRvciB1bmRlcmZsb3dcbiIsIHVuaXQsIGlkeCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZGVzY3JpcHRvciB1bmRlcmZsb3dcbiIsCisJCQkJIGlkeCwgdW5pdCk7CiAJCQlXTENOVElOQ1Iod2xjX2h3LT53bGMtPnB1Yi0+X2NudC0+cnh1ZmxvW2lkeF0pOwogCQl9CiAKIAkJaWYgKGludHN0YXR1cyAmIElfWFUpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogdHJhbnNtaXQgZmlmbyB1bmRlcmZsb3dcbiIsCi0JCQkJICBpZHgsIHVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiBmaWZvICVkOiB0cmFuc21pdCBmaWZvIHVuZGVyZmxvd1xuIiwKKwkJCQkgaWR4LCB1bml0KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT50eHVmbG8pOwogCQkJZmF0YWwgPSB0cnVlOwogCQl9CkBAIC0yOTYyLDkgKzI5ODIsOSBAQAogCX0KIH0KIAotdm9pZCB3bGNfaW50cnNvbih3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19pbnRyc29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCUFTU0VSVCh3bGMtPmRlZm1hY2ludG1hc2spOwogCXdsYy0+bWFjaW50bWFzayA9IHdsYy0+ZGVmbWFjaW50bWFzazsKIAlXX1JFRyh3bGNfaHctPm9zaCwgJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgd2xjLT5tYWNpbnRtYXNrKTsKQEAgLTI5NzUsNyArMjk5NSw3IEBACiAgKiAgYnV0IGFsc28gYmVjYXVzZSBwZXItcG9ydCBjb2RlIG1heSByZXF1aXJlIHN5bmMgd2l0aCB2YWxpZCBpbnRlcnJ1cHQuCiAgKi8KIAotc3RhdGljIHUzMiB3bGNfd2xpbnRyc29mZih3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdTMyIHdsY193bGludHJzb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWlmICghd2xjLT5ody0+dXApCiAJCXJldHVybiAwOwpAQCAtMjk4Myw3ICszMDAzLDcgQEAKIAlyZXR1cm4gd2xfaW50cnNvZmYod2xjLT53bCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193bGludHJzcmVzdG9yZSh3bGNfaW5mb190ICp3bGMsIHUzMiBtYWNpbnRtYXNrKQorc3RhdGljIHZvaWQgd2xjX3dsaW50cnNyZXN0b3JlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgbWFjaW50bWFzaykKIHsKIAlpZiAoIXdsYy0+aHctPnVwKQogCQlyZXR1cm47CkBAIC0yOTkxLDkgKzMwMTEsOSBAQAogCXdsX2ludHJzcmVzdG9yZSh3bGMtPndsLCBtYWNpbnRtYXNrKTsKIH0KIAotdTMyIHdsY19pbnRyc29mZih3bGNfaW5mb190ICp3bGMpCit1MzIgd2xjX2ludHJzb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCXUzMiBtYWNpbnRtYXNrOwogCiAJaWYgKCF3bGNfaHctPmNsaykKQEAgLTMwMTAsOSArMzAzMCw5IEBACiAJcmV0dXJuIHdsYy0+bWFjaW50c3RhdHVzID8gMCA6IG1hY2ludG1hc2s7CiB9CiAKLXZvaWQgd2xjX2ludHJzcmVzdG9yZSh3bGNfaW5mb190ICp3bGMsIHUzMiBtYWNpbnRtYXNrKQordm9pZCB3bGNfaW50cnNyZXN0b3JlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgbWFjaW50bWFzaykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlpZiAoIXdsY19ody0+Y2xrKQogCQlyZXR1cm47CiAKQEAgLTMwMjAsNyArMzA0MCw3IEBACiAJV19SRUcod2xjX2h3LT5vc2gsICZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2ssIHdsYy0+bWFjaW50bWFzayk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfbXV0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24sIG1ib29sIGZsYWdzKQordm9pZCB3bGNfYm1hY19tdXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIG9uLCBtYm9vbCBmbGFncykKIHsKIAlzdHJ1Y3QgZXRoZXJfYWRkciBudWxsX2V0aGVyX2FkZHIgPSB7IHswLCAwLCAwLCAwLCAwLCAwfSB9OwogCkBAIC0zMDU2LDEyICszMDc2LDEyIEBACiAJCXdsY191Y29kZV9tdXRlX292ZXJyaWRlX2NsZWFyKHdsY19odyk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2RlYWYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHVzZXJfZmxhZykKK3ZvaWQgd2xjX2JtYWNfc2V0X2RlYWYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgdXNlcl9mbGFnKQogewogCXdsY19waHlfc2V0X2RlYWYod2xjX2h3LT5iYW5kLT5waSwgdXNlcl9mbGFnKTsKIH0KIAotaW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgdWludCBmaWZvLCB1aW50ICpibG9ja3MpCitpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQogewogCWlmIChmaWZvID49IE5GSUZPKQogCQlyZXR1cm4gQkNNRV9SQU5HRTsKQEAgLTMwNzEsNyArMzA5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB3bGNfYm1hY194bXRmaWZvX3N6X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgdWludCBibG9ja3MpCitpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywgdWludCBibG9ja3MpCiB7CiAJaWYgKGZpZm8gPj0gTkZJRk8gfHwgYmxvY2tzID4gMjk5KQogCQlyZXR1cm4gQkNNRV9SQU5HRTsKQEAgLTMwOTEsNyArMzExMSw3IEBACiAgKiBiZSBwdWxsaW5nIGRhdGEgaW50byBhIHR4IGZpZm8sIGJ5IHRoZSB0aW1lIHRoZSBNQUMgYWNrcyB0aGUgc3VzcGVuZAogICogcmVxdWVzdC4KICAqLwotYm9vbCB3bGNfYm1hY190eF9maWZvX3N1c3BlbmRlZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgdHhfZmlmbykKK2Jvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgdHhfZmlmbykKIHsKIAkvKiBjaGVjayB0aGF0IGEgc3VzcGVuZCBoYXMgYmVlbiByZXF1ZXN0ZWQgYW5kIGlzIG5vIGxvbmdlciBwZW5kaW5nICovCiAKQEAgLTMxMTAsNyArMzEzMCw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgdHhfZmlmbykKK3ZvaWQgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCiB7CiAJdTggZmlmbyA9IDEgPDwgdHhfZmlmbzsKIApAQCAtMzE0MSw3ICszMTYxLDcgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2JtYWNfdHhfZmlmb19yZXN1bWUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCit2b2lkIHdsY19ibWFjX3R4X2ZpZm9fcmVzdW1lKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCiB7CiAJLyogQk1BQ19OT1RFOiBXTENfVFhfRklGT19FTkFCIGlzIGRvbmUgaW4gd2xjX2RwYygpIGZvciBETUEgY2FzZSBidXQgbmVlZCB0byBiZSBkb25lCiAJICogaGVyZSBmb3IgUElPIG90aGVyd2lzZSB0aGUgd2F0Y2hkb2cgd2lsbCBjYXRjaCB0aGUgaW5jb25zaXN0ZW5jeSBhbmQgZmlyZQpAQCAtMzE2OSwyMCArMzE4OSwyMCBAQAogICogICAwIGlmIHRoZSBpbnRlcnJ1cHQgaXMgbm90IGZvciB1cywgb3Igd2UgYXJlIGluIHNvbWUgc3BlY2lhbCBjYXNlczsKICAqICAgZGV2aWNlIGludGVycnVwdCBzdGF0dXMgYml0cyBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyIHdsY19pbnRzdGF0dXMod2xjX2luZm9fdCAqd2xjLCBib29sIGluX2lzcikKK3N0YXRpYyBpbmxpbmUgdTMyIHdsY19pbnRzdGF0dXMoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgaW5faXNyKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAl1MzIgbWFjaW50c3RhdHVzOwogCXUzMiBpbnRzdGF0dXNfcnhmaWZvLCBpbnRzdGF0dXNfdHhzZmlmbzsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKIAkvKiBtYWNpbnRzdGF0dXMgaW5jbHVkZXMgYSBETUEgaW50ZXJydXB0IHN1bW1hcnkgYml0ICovCiAJbWFjaW50c3RhdHVzID0gUl9SRUcob3NoLCAmcmVncy0+bWFjaW50c3RhdHVzKTsKIAotCVdMX1RSQUNFKCgid2wlZDogbWFjaW50c3RhdHVzOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIG1hY2ludHN0YXR1cykpOworCVdMX1RSQUNFKCJ3bCVkOiBtYWNpbnRzdGF0dXM6IDB4JXhcbiIsIHdsY19ody0+dW5pdCwgbWFjaW50c3RhdHVzKTsKIAogCS8qIGRldGVjdCBjYXJkYnVzIHJlbW92ZWQsIGluIHBvd2VyIGRvd24oc3VzcGVuZCkgYW5kIGluIHJlc2V0ICovCiAJaWYgKERFVklDRVJFTU9WRUQod2xjKSkKQEAgLTMyMDcsOSArMzIyNyw3IEBACiAJICovCiAJLyogdHVybiBvZmYgdGhlIGludGVycnVwdHMgKi8KIAlXX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRtYXNrLCAwKTsKLSNpZm5kZWYgQkNNU0RJTwogCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludG1hc2spOwkvKiBzeW5jIHJlYWRiYWNrICovCi0jZW5kaWYKIAl3bGMtPm1hY2ludG1hc2sgPSAwOwogCiAJLyogY2xlYXIgZGV2aWNlIGludGVycnVwdHMgKi8KQEAgLTMyMjQsNyArMzI0Miw5IEBACiAJCQkgICAgUl9SRUcob3NoLAogCQkJCSAgJnJlZ3MtPmludGN0cmxyZWdzW1JYX1RYU1RBVFVTX0ZJRk9dLgogCQkJCSAgaW50c3RhdHVzKTsKLQkJCVdMX1RSQUNFKCgid2wlZDogaW50c3RhdHVzX3J4ZmlmbyAweCV4LCBpbnRzdGF0dXNfdHhzZmlmbyAweCV4XG4iLCB3bGNfaHctPnVuaXQsIGludHN0YXR1c19yeGZpZm8sIGludHN0YXR1c190eHNmaWZvKSk7CisJCQlXTF9UUkFDRSgid2wlZDogaW50c3RhdHVzX3J4ZmlmbyAweCV4LCBpbnRzdGF0dXNfdHhzZmlmbyAweCV4XG4iLAorCQkJCSB3bGNfaHctPnVuaXQsCisJCQkJIGludHN0YXR1c19yeGZpZm8sIGludHN0YXR1c190eHNmaWZvKTsKIAogCQkJLyogZGVmZXIgdW5zb2xpY2l0ZWQgaW50ZXJydXB0IGhpbnRzICovCiAJCQlpbnRzdGF0dXNfcnhmaWZvICY9IERFRl9SWElOVE1BU0s7CkBAIC0zMjYxLDcgKzMyODEsNyBAQAogCiAvKiBVcGRhdGUgd2xjLT5tYWNpbnRzdGF0dXMgYW5kIHdsYy0+aW50c3RhdHVzW10uICovCiAvKiBSZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4gZmFsc2Ugb3RoZXJ3aXNlICovCi1ib29sIHdsY19pbnRyc3VwZCh3bGNfaW5mb190ICp3bGMpCitib29sIHdsY19pbnRyc3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1MzIgbWFjaW50c3RhdHVzOwogCkBAIC0zMjg2LDkgKzMzMDYsOSBAQAogICogKndhbnRkcGMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBmdXJ0aGVyIHdsY19kcGMoKSBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLAogICogZmFsc2Ugb3RoZXJ3aXNlLgogICovCi1ib29sIEJDTUZBU1RQQVRIIHdsY19pc3Iod2xjX2luZm9fdCAqd2xjLCBib29sICp3YW50ZHBjKQorYm9vbCBCQ01GQVNUUEFUSCB3bGNfaXNyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sICp3YW50ZHBjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCXUzMiBtYWNpbnRzdGF0dXM7CiAKIAkqd2FudGRwYyA9IGZhbHNlOwpAQCAtMzMwMCw3ICszMzIwLDcgQEAKIAltYWNpbnRzdGF0dXMgPSB3bGNfaW50c3RhdHVzKHdsYywgdHJ1ZSk7CiAKIAlpZiAobWFjaW50c3RhdHVzID09IDB4ZmZmZmZmZmYpCi0JCVdMX0VSUk9SKCgiREVWSUNFUkVNT1ZFRCBkZXRlY3RlZCBpbiB0aGUgSVNSIGNvZGUgcGF0aC5cbiIpKTsKKwkJV0xfRVJST1IoIkRFVklDRVJFTU9WRUQgZGV0ZWN0ZWQgaW4gdGhlIElTUiBjb2RlIHBhdGhcbiIpOwogCiAJLyogaXQgaXMgbm90IGZvciB1cyAqLwogCWlmIChtYWNpbnRzdGF0dXMgPT0gMCkKQEAgLTMzMTcsMjAgKzMzMzcsMjAgQEAKIH0KIAogLyogcHJvY2VzcyB0eCBjb21wbGV0aW9uIGV2ZW50cyBmb3IgY29yZXJldiA8IDUgKi8KLXN0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzX2NvcmVyZXY0KHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzX2NvcmVyZXY0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCXZvaWQgKnN0YXR1c19wOworCXN0cnVjdCBza19idWZmICpzdGF0dXNfcDsKIAl0eF9zdGF0dXNfdCAqdHhzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJYm9vbCBmYXRhbCA9IGZhbHNlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfdHhzdGF0dXNyZWN2XG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3R4c3RhdHVzcmVjdlxuIiwgd2xjX2h3LT51bml0KTsKIAogCW9zaCA9IHdsY19ody0+b3NoOwogCiAJd2hpbGUgKCFmYXRhbCAmJiAoc3RhdHVzX3AgPSBkbWFfcngod2xjX2h3LT5kaVtSWF9UWFNUQVRVU19GSUZPXSkpKSB7CiAKLQkJdHhzID0gKHR4X3N0YXR1c190ICopIFBLVERBVEEoc3RhdHVzX3ApOworCQl0eHMgPSAodHhfc3RhdHVzX3QgKikgc3RhdHVzX3AtPmRhdGE7CiAJCS8qIE1BQyB1c2VzIGxpdHRsZSBlbmRpYW4gb25seSAqLwogCQlsdG9oMTZfYnVmKCh2b2lkICopdHhzLCBzaXplb2YodHhfc3RhdHVzX3QpKTsKIApAQCAtMzM0MCw3ICszMzYwLDcgQEAKIAogCQlmYXRhbCA9IHdsY19ibWFjX2RvdHhzdGF0dXMod2xjX2h3LCB0eHMsIDApOwogCi0JCVBLVEZSRUUob3NoLCBzdGF0dXNfcCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgc3RhdHVzX3AsIGZhbHNlKTsKIAl9CiAKIAlpZiAoZmF0YWwpCkBAIC0zMzUzLDcgKzMzNzMsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBCQ01GQVNUUEFUSAotd2xjX2JtYWNfZG90eHN0YXR1cyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHR4X3N0YXR1c190ICp0eHMsIHUzMiBzMikKK3dsY19ibWFjX2RvdHhzdGF0dXMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHR4X3N0YXR1c190ICp0eHMsIHUzMiBzMikKIHsKIAkvKiBkaXNjYXJkIGludGVybWVkaWF0ZSBpbmRpY2F0aW9ucyBmb3IgdWNvZGUgd2l0aCBvbmUgbGVnaXRpbWF0ZSBjYXNlOgogCSAqICAgZS5nLiBpZiAidXNlUlRTIiBpcyBzZXQuIHVjb2RlIGRpZCBhIHN1Y2Nlc3NmdWwgcnRzL2N0cyBleGNoYW5nZSwgYnV0IHRoZSBzdWJzZXF1ZW50CkBAIC0zMzcyLDEyICszMzkyLDEyIEBACiAgKiBSZXR1cm4gdHJ1ZSBpZiBtb3JlIHR4IHN0YXR1cyBuZWVkIHRvIGJlIHByb2Nlc3NlZC4gZmFsc2Ugb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgYm9vbCBCQ01GQVNUUEFUSAotd2xjX2JtYWNfdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGJvdW5kLCBib29sICpmYXRhbCkKK3dsY19ibWFjX3R4c3RhdHVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGJvdW5kLCBib29sICpmYXRhbCkKIHsKIAlib29sIG1vcmVwZW5kaW5nID0gZmFsc2U7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfdHhzdGF0dXNcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY190eHN0YXR1c1xuIiwgd2xjX2h3LT51bml0KTsKIAogCWlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCA0KSkgewogCQkvKiB0byByZXRpcmUgc29vbiAqLwpAQCAtMzM4OCw3ICszNDA4LDcgQEAKIAl9IGVsc2UgewogCQkvKiBjb3JlcmV2ID49IDUgKi8KIAkJZDExcmVnc190ICpyZWdzOwotCQlvc2xfdCAqb3NoOworCQlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAkJdHhfc3RhdHVzX3QgdHhzdGF0dXMsICp0eHM7CiAJCXUzMiBzMSwgczI7CiAJCXVpbnQgbiA9IDA7CkBAIC0zNDAyLDggKzM0MjIsOCBAQAogCQkgICAgICAgJiYgKHMxID0gUl9SRUcob3NoLCAmcmVncy0+ZnJtdHhzdGF0dXMpKSAmIFRYU19WKSB7CiAKIAkJCWlmIChzMSA9PSAweGZmZmZmZmZmKSB7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLAotCQkJCQkgIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwKKwkJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCQkJCUFTU0VSVChzMSAhPSAweGZmZmZmZmZmKTsKIAkJCQlyZXR1cm4gbW9yZXBlbmRpbmc7CiAJCQl9CkBAIC0zNDM2LDE1ICszNDU2LDE1IEBACiAJcmV0dXJuIG1vcmVwZW5kaW5nOwogfQogCi12b2lkIHdsY19zdXNwZW5kX21hY19hbmRfd2FpdCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdTMyIG1jLCBtaTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjX2h3LT51bml0LCB3bGNfaHctPmJhbmQtPmJhbmR1bml0KTsKIAogCS8qCiAJICogVHJhY2sgb3ZlcmxhcHBpbmcgc3VzcGVuZCByZXF1ZXN0cwpAQCAtMzQ2MSw3ICszNDgxLDcgQEAKIAltYyA9IFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2NvbnRyb2wpOwogCiAJaWYgKG1jID09IDB4ZmZmZmZmZmYpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkJd2xfZG93bih3bGMtPndsKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM0NzEsNyArMzQ5MSw3IEBACiAKIAltaSA9IFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cyk7CiAJaWYgKG1pID09IDB4ZmZmZmZmZmYpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkJd2xfZG93bih3bGMtPndsKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM0ODMsMTUgKzM1MDMsMTggQEAKIAkJIFdMQ19NQVhfTUFDX1NVU1BFTkQpOwogCiAJaWYgKCEoUl9SRUcob3NoLCAmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQ6IHdhaXRlZCAlZCB1UyBhbmQgIgotCQkJICAiTUlfTUFDU1NQTkREIGlzIHN0aWxsIG5vdCBvbi5cbiIsCi0JCQkgIHdsY19ody0+dW5pdCwgV0xDX01BWF9NQUNfU1VTUEVORCkpOwotCQlXTF9FUlJPUigoIndsJWQ6IHBzbWRlYnVnIDB4JTA4eCwgcGh5ZGVidWcgMHglMDh4LCBwc21fYnJjIDB4JTA0eFxuIiwgd2xjX2h3LT51bml0LCBSX1JFRyhvc2gsICZyZWdzLT5wc21kZWJ1ZyksIFJfUkVHKG9zaCwgJnJlZ3MtPnBoeWRlYnVnKSwgUl9SRUcob3NoLCAmcmVncy0+cHNtX2JyYykpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19zdXNwZW5kX21hY19hbmRfd2FpdDogd2FpdGVkICVkIHVTIGFuZCBNSV9NQUNTU1BOREQgaXMgc3RpbGwgbm90IG9uLlxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIFdMQ19NQVhfTUFDX1NVU1BFTkQpOworCQlXTF9FUlJPUigid2wlZDogcHNtZGVidWcgMHglMDh4LCBwaHlkZWJ1ZyAweCUwOHgsIHBzbV9icmMgMHglMDR4XG4iLAorCQkJIHdsY19ody0+dW5pdCwKKwkJCSBSX1JFRyhvc2gsICZyZWdzLT5wc21kZWJ1ZyksCisJCQkgUl9SRUcob3NoLCAmcmVncy0+cGh5ZGVidWcpLAorCQkJIFJfUkVHKG9zaCwgJnJlZ3MtPnBzbV9icmMpKTsKIAl9CiAKIAltYyA9IFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2NvbnRyb2wpOwogCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNTAwLDE1ICszNTIzLDE1IEBACiAJQVNTRVJUKCEobWMgJiBNQ1RMX0VOX01BQykpOwogfQogCi12b2lkIHdsY19lbmFibGVfbWFjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2VuYWJsZV9tYWMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXUzMiBtYywgbWk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2VuYWJsZV9tYWM6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgd2xjLT5iYW5kLT5iYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfZW5hYmxlX21hYzogYmFuZHVuaXQgJWRcbiIsCisJCSB3bGNfaHctPnVuaXQsIHdsYy0+YmFuZC0+YmFuZHVuaXQpOwogCiAJLyoKIAkgKiBUcmFjayBvdmVybGFwcGluZyBzdXNwZW5kIHJlcXVlc3RzCkBAIC0zNTM5LDcgKzM1NjIsNyBAQAogCXdsY191Y29kZV93YWtlX292ZXJyaWRlX2NsZWFyKHdsY19odywgV0xDX1dBS0VfT1ZFUlJJREVfTUFDU1VTUEVORCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfaWZzY3RsX2VkY3JzX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgYWJpZSwgYm9vbCBpc2h0KQordm9pZCB3bGNfYm1hY19pZnNjdGxfZWRjcnNfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGFiaWUsIGJvb2wgaXNodCkKIHsKIAlpZiAoIShXTENJU05QSFkod2xjX2h3LT5iYW5kKSAmJiAoRDExUkVWX0dFKHdsY19ody0+Y29yZXJldiwgMTYpKSkpCiAJCXJldHVybjsKQEAgLTM1NzUsNyArMzU5OCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfdXBkX29mZG1fcGN0bDFfdGFibGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXU4IHJhdGU7CiAJdTggcmF0ZXNbOF0gPSB7CkBAIC0zNjA5LDcgKzM2MzIsNyBAQAogCX0KIH0KIAotc3RhdGljIHUxNiB3bGNfYm1hY19vZmRtX3JhdGV0YWJsZV9vZmZzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCByYXRlKQorc3RhdGljIHUxNiB3bGNfYm1hY19vZmRtX3JhdGV0YWJsZV9vZmZzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHJhdGUpCiB7CiAJdWludCBpOwogCXU4IHBsY3BfcmF0ZSA9IDA7CkBAIC0zNjQyLDcgKzM2NjUsNyBAQAogCXJldHVybiAyICogd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3LCBNX1JUX0RJUk1BUF9BICsgKHBsY3BfcmF0ZSAqIDIpKTsKIH0KIAotdm9pZCB3bGNfYm1hY19iYW5kX3N0Zl9zc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzdGZfbW9kZSkKK3ZvaWQgd2xjX2JtYWNfYmFuZF9zdGZfc3Nfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCBzdGZfbW9kZSkKIHsKIAl3bGNfaHctPmh3X3N0Zl9zc19vcG1vZGUgPSBzdGZfbW9kZTsKIApAQCAtMzY1MSw3ICszNjc0LDcgQEAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX2JtYWNfcmVhZF90c2Yod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgKnRzZl9sX3B0ciwKK3dsY19ibWFjX3JlYWRfdHNmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgKnRzZl9sX3B0ciwKIAkJICB1MzIgKnRzZl9oX3B0cikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CkBAIC0zNjYzLDE0ICszNjg2LDE0IEBACiAJcmV0dXJuOwogfQogCi1ib29sIHdsY19ibWFjX3ZhbGlkYXRlX2NoaXBfYWNjZXNzKHdsY19od19pbmZvX3QgKndsY19odykKK2Jvb2wgd2xjX2JtYWNfdmFsaWRhdGVfY2hpcF9hY2Nlc3Moc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJZDExcmVnc190ICpyZWdzOwogCXUzMiB3LCB2YWw7CiAJdm9sYXRpbGUgdTE2ICpyZWcxNjsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2Vzc1xuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJcmVncyA9IHdsY19ody0+cmVnczsKIAlvc2ggPSB3bGNfaHctPm9zaDsKQEAgLTM2OTAsNyArMzcxMyw4IEBACiAJKHZvaWQpUl9SRUcob3NoLCAmcmVncy0+b2JqYWRkcik7CiAJdmFsID0gUl9SRUcob3NoLCAmcmVncy0+b2JqZGF0YSk7CiAJaWYgKHZhbCAhPSAodTMyKSAweGFhNTU1NWFhKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4YWE1NTU1YWFcbiIsIHdsY19ody0+dW5pdCwgdmFsKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogU0hNID0gMHgleCwgZXhwZWN0ZWQgMHhhYTU1NTVhYVxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHZhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTM3MDIsNyArMzcyNiw4IEBACiAJKHZvaWQpUl9SRUcob3NoLCAmcmVncy0+b2JqYWRkcik7CiAJdmFsID0gUl9SRUcob3NoLCAmcmVncy0+b2JqZGF0YSk7CiAJaWYgKHZhbCAhPSAodTMyKSAweDU1YWFhYTU1KSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4NTVhYWFhNTVcbiIsIHdsY19ody0+dW5pdCwgdmFsKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogU0hNID0gMHgleCwgZXhwZWN0ZWQgMHg1NWFhYWE1NVxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHZhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTM3MzIsMTIgKzM3NTcsMTQgQEAKIAkJLyogdmVyaWZ5IHdpdGggdGhlIDE2IGJpdCByZWdpc3RlcnMgdGhhdCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAqLwogCQl2YWwgPSBSX1JFRyhvc2gsICZyZWdzLT50c2ZfY2Zwc3RydF9sKTsKIAkJaWYgKHZhbCAhPSAodWludCkgMHhCQkJCKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiB0c2ZfY2Zwc3RydF9sID0gMHgleCwgZXhwZWN0ZWQiICIgMHgleFxuIiwgd2xjX2h3LT51bml0LCB2YWwsIDB4QkJCQikpOworCQkJV0xfRVJST1IoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiB0c2ZfY2Zwc3RydF9sID0gMHgleCwgZXhwZWN0ZWQgMHgleFxuIiwKKwkJCQkgd2xjX2h3LT51bml0LCB2YWwsIDB4QkJCQik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJdmFsID0gUl9SRUcob3NoLCAmcmVncy0+dHNmX2NmcHN0cnRfaCk7CiAJCWlmICh2YWwgIT0gKHVpbnQpIDB4Q0NDQykgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfaCA9IDB4JXgsIGV4cGVjdGVkIiAiIDB4JXhcbiIsIHdsY19ody0+dW5pdCwgdmFsLCAweENDQ0MpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfaCA9IDB4JXgsIGV4cGVjdGVkIDB4JXhcbiIsCisJCQkJIHdsY19ody0+dW5pdCwgdmFsLCAweENDQ0MpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTM3NDksNyArMzc3NiwxMCBAQAogCXcgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNjb250cm9sKTsKIAlpZiAoKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSkgJiYKIAkgICAgKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9HTU9ERSB8IE1DVExfV0FLRSkpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IG1hY2NvbnRyb2wgPSAweCV4LCBleHBlY3RlZCAweCV4IG9yIDB4JXhcbiIsIHdsY19ody0+dW5pdCwgdywgKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSwgKE1DVExfSUhSX0VOIHwgTUNUTF9HTU9ERSB8IE1DVExfV0FLRSkpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBtYWNjb250cm9sID0gMHgleCwgZXhwZWN0ZWQgMHgleCBvciAweCV4XG4iLAorCQkJIHdsY19ody0+dW5pdCwgdywKKwkJCSAoTUNUTF9JSFJfRU4gfCBNQ1RMX1dBS0UpLAorCQkJIChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMzc1OCwxMyArMzc4OCwxMyBAQAogCiAjZGVmaW5lIFBIWVBMTF9XQUlUX1VTCTEwMDAwMAogCi12b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24pCit2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbikKIHsKIAlkMTFyZWdzX3QgKnJlZ3M7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl1MzIgdG1wOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGxcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGxcbiIsIHdsY19ody0+dW5pdCk7CiAKIAl0bXAgPSAwOwogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CkBAIC0zNzg1LDggKzM4MTUsOCBAQAogCQkJdG1wID0gUl9SRUcob3NoLCAmcmVncy0+Y2xrX2N0bF9zdCk7CiAJCQlpZiAoKHRtcCAmIChDQ1NfRVJTUkNfQVZBSUxfSFQpKSAhPQogCQkJICAgIChDQ1NfRVJTUkNfQVZBSUxfSFQpKSB7Ci0JCQkJV0xfRVJST1IoKCIlczogdHVybiBvbiBQSFkgUExMIGZhaWxlZFxuIiwKLQkJCQkJICBfX2Z1bmNfXykpOworCQkJCVdMX0VSUk9SKCIlczogdHVybiBvbiBQSFkgUExMIGZhaWxlZFxuIiwKKwkJCQkJIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoMCk7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0zODAzLDggKzM4MzMsOCBAQAogCQkJICAgICAoQ0NTX0VSU1JDX0FWQUlMX0QxMVBMTCB8IENDU19FUlNSQ19BVkFJTF9QSFlQTEwpKQogCQkJICAgICE9CiAJCQkgICAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfCBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkgewotCQkJCVdMX0VSUk9SKCgiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCi0JCQkJCSAgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJQVNTRVJUKDApOwogCQkJfQogCQl9CkBAIC0zODE3LDExICszODQ3LDExIEBACiAJfQogfQogCi12b2lkIHdsY19jb3JlZGlzYWJsZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19jb3JlZGlzYWJsZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlib29sIGRldl9nb25lOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQoIXdsY19ody0+dXApOwogCkBAIC0zODU3LDkgKzM4ODcsOSBAQAogfQogCiAvKiBwb3dlciBib3RoIHRoZSBwbGwgYW5kIGV4dGVybmFsIG9zY2lsbGF0b3Igb24vb2ZmICovCi12b2lkIHdsY19ibWFjX3h0YWwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHdhbnQpCit2b2lkIHdsY19ibWFjX3h0YWwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgd2FudCkKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX3h0YWw6IHdhbnQgJWRcbiIsIHdsY19ody0+dW5pdCwgd2FudCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY194dGFsOiB3YW50ICVkXG4iLCB3bGNfaHctPnVuaXQsIHdhbnQpOwogCiAJLyogZG9udCBwb3dlciBkb3duIGlmIHBsbGRvd24gaXMgZmFsc2Ugb3Igd2UgbXVzdCBwb2xsIGh3IHJhZGlvIGRpc2FibGUgKi8KIAlpZiAoIXdhbnQgJiYgd2xjX2h3LT5wbGxyZXEpCkBAIC0zODc2LDkgKzM5MDYsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX2ZsdXNocXVldWVzKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1aW50IGk7CiAKIAl3bGMtPnR4cGVuZDE2MTY1d2FyID0gMDsKQEAgLTM4ODgsOCArMzkxOCw4IEBACiAJCWlmICh3bGNfaHctPmRpW2ldKSB7CiAJCQlkbWFfdHhyZWNsYWltKHdsY19ody0+ZGlbaV0sIEhORERNQV9SQU5HRV9BTEwpOwogCQkJVFhQS1RQRU5EQ0xSKHdsYywgaSk7Ci0JCQlXTF9UUkFDRSgoIndsY19mbHVzaHF1ZXVlczogcGt0cGVuZCBmaWZvICVkIGNsZWFyZWRcbiIsCi0JCQkJICBpKSk7CisJCQlXTF9UUkFDRSgid2xjX2ZsdXNocXVldWVzOiBwa3RwZW5kIGZpZm8gJWQgY2xlYXJlZFxuIiwKKwkJCQkgaSk7CiAJCX0KIAogCS8qIGZyZWUgYW55IHBvc3RlZCByeCBwYWNrZXRzICovCkBAIC0zODk4LDEyICszOTI4LDEyIEBACiAJCWRtYV9yeHJlY2xhaW0od2xjX2h3LT5kaVtSWF9UWFNUQVRVU19GSUZPXSk7CiB9CiAKLXUxNiB3bGNfYm1hY19yZWFkX3NobSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0KQordTE2IHdsY19ibWFjX3JlYWRfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCkKIHsKIAlyZXR1cm4gd2xjX2JtYWNfcmVhZF9vYmptZW0od2xjX2h3LCBvZmZzZXQsIE9CSkFERFJfU0hNX1NFTCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfd3JpdGVfc2htKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2KQordm9pZCB3bGNfYm1hY193cml0ZV9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdikKIHsKIAl3bGNfYm1hY193cml0ZV9vYmptZW0od2xjX2h3LCBvZmZzZXQsIHYsIE9CSkFERFJfU0hNX1NFTCk7CiB9CkBAIC0zOTEyLDcgKzM5NDIsNyBAQAogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcyBhbmQKICAqIEJ1ZmZlciBsZW5ndGggJ2xlbicgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBieXRlcwogICovCi12b2lkIHdsY19ibWFjX3NldF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCit2b2lkIHdsY19ibWFjX3NldF9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgaW50IGxlbikKIHsKIAlpbnQgaTsKIApAQCAtMzkyOSw3ICszOTU5LDcgQEAKIH0KIAogc3RhdGljIHUxNgotd2xjX2JtYWNfcmVhZF9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTMyIHNlbCkKK3dsY19ibWFjX3JlYWRfb2JqbWVtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTMyIHNlbCkKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdm9sYXRpbGUgdTE2ICpvYmpkYXRhX2xvID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwpAQCAtMzk1MCw3ICszOTgwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdsY19ibWFjX3dyaXRlX29iam1lbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgdTMyIHNlbCkKK3dsY19ibWFjX3dyaXRlX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LCB1MzIgc2VsKQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAl2b2xhdGlsZSB1MTYgKm9iamRhdGFfbG8gPSAodm9sYXRpbGUgdTE2ICopJnJlZ3MtPm9iamRhdGE7CkBAIC0zOTczLDcgKzQwMDMsNyBAQAogICogJ3NlbCcgc2VsZWN0cyB0aGUgdHlwZSBvZiBtZW1vcnkKICAqLwogdm9pZAotd2xjX2JtYWNfY29weXRvX29iam1lbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCBjb25zdCB2b2lkICpidWYsCit3bGNfYm1hY19jb3B5dG9fb2JqbWVtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLAogCQkgICAgICAgaW50IGxlbiwgdTMyIHNlbCkKIHsKIAl1MTYgdjsKQEAgLTM5OTksNyArNDAyOSw3IEBACiAgKiAnc2VsJyBzZWxlY3RzIHRoZSB0eXBlIG9mIG1lbW9yeQogICovCiB2b2lkCi13bGNfYm1hY19jb3B5ZnJvbV9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdm9pZCAqYnVmLAord2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdm9pZCAqYnVmLAogCQkJIGludCBsZW4sIHUzMiBzZWwpCiB7CiAJdTE2IHY7CkBAIC00MDIwLDE2ICs0MDUwLDE2IEBACiAJfQogfQogCi12b2lkIHdsY19ibWFjX2NvcHlmcm9tX3ZhcnMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFyICoqYnVmLCB1aW50ICpsZW4pCit2b2lkIHdsY19ibWFjX2NvcHlmcm9tX3ZhcnMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNoYXIgKipidWYsIHVpbnQgKmxlbikKIHsKLQlXTF9UUkFDRSgoIndsY19ibWFjX2NvcHlmcm9tX3ZhcnMsIG52cmFtIHZhcnMgdG90bGVuPSVkXG4iLAotCQkgIHdsY19ody0+dmFyc19zaXplKSk7CisJV0xfVFJBQ0UoIndsY19ibWFjX2NvcHlmcm9tX3ZhcnMsIG52cmFtIHZhcnMgdG90bGVuPSVkXG4iLAorCQkgd2xjX2h3LT52YXJzX3NpemUpOwogCiAJKmJ1ZiA9IHdsY19ody0+dmFyczsKIAkqbGVuID0gd2xjX2h3LT52YXJzX3NpemU7CiB9CiAKLXZvaWQgd2xjX2JtYWNfcmV0cnlsaW1pdF91cGQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgU1JMLCB1MTYgTFJMKQordm9pZCB3bGNfYm1hY19yZXRyeWxpbWl0X3VwZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IFNSTCwgdTE2IExSTCkKIHsKIAl3bGNfaHctPlNSTCA9IFNSTDsKIAl3bGNfaHctPkxSTCA9IExSTDsKQEAgLTQwNDcsMTcgKzQwNzcsMTcgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X25vcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG5vcmVzZXRfZmxhZykKK3ZvaWQgd2xjX2JtYWNfc2V0X25vcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgbm9yZXNldF9mbGFnKQogewogCXdsY19ody0+bm9yZXNldCA9IG5vcmVzZXRfZmxhZzsKIH0KIAotdm9pZCB3bGNfYm1hY19zZXRfdWNvZGVfbG9hZGVkKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB1Y29kZV9sb2FkZWQpCit2b2lkIHdsY19ibWFjX3NldF91Y29kZV9sb2FkZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgdWNvZGVfbG9hZGVkKQogewogCXdsY19ody0+dWNvZGVfbG9hZGVkID0gdWNvZGVfbG9hZGVkOwogfQogCi12b2lkIHdsY19ibWFjX3BsbHJlcSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQordm9pZCB3bGNfYm1hY19wbGxyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQogewogCUFTU0VSVChyZXFfYml0KTsKIApAQCAtNDA4OCw3ICs0MTE4LDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2Nsayh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24pCit2b2lkIHdsY19ibWFjX3NldF9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgb24pCiB7CiAJaWYgKG9uKSB7CiAJCS8qIHBvd2VyIHVwIHBsbCBhbmQgb3NjaWxsYXRvciAqLwpAQCAtNDExMCw3ICs0MTQwLDcgQEAKIH0KIAogLyogdGhpcyB3aWxsIGJlIHRydWUgZm9yIGFsbCBhaSBjaGlwcyAqLwotYm9vbCB3bGNfYm1hY190YWNsZWFyKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB0YV9vaykKK2Jvb2wgd2xjX2JtYWNfdGFjbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCB0YV9vaykKIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTQxMTgsNyArNDE0OCw3IEBACiAvKiBMb3dlciBkb3duIHJlbGV2YW50IEdQSU9zIGxpa2UgTEVEIHdoZW4gZ29pbmcgZG93biB3L28KICAqIGRvaW5nIFBDSSBjb25maWcgY3ljbGVzIG9yIHRvdWNoaW5nIGludGVycnVwdHMKICAqLwotdm9pZCB3bGNfZ3Bpb19mYXN0X2RlaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ncGlvX2Zhc3RfZGVpbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWlmICgod2xjX2h3ID09IE5VTEwpIHx8ICh3bGNfaHctPnNpaCA9PSBOVUxMKSkKIAkJcmV0dXJuOwpAQCAtNDEyNiwxNyArNDE1NiwxNyBAQAogCS8qIE9ubHkgY2hpcHMgd2l0aCBpbnRlcm5hbCBidXMgb3IgUENJRSBjb3JlcyBvciBjZXJ0YWluIFBDSSBjb3JlcwogCSAqIGFyZSBhYmxlIHRvIHN3aXRjaCBjb3JlcyB3L28gZGlzYWJsaW5nIGludGVycnVwdHMKIAkgKi8KLQlpZiAoISgoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gU0lfQlVTKSB8fAotCSAgICAgICgoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgJiYKKwlpZiAoISgod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCSAgICAgICgod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykgJiYKIAkgICAgICAgKCh3bGNfaHctPnNpaC0+YnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKSB8fAogCQkod2xjX2h3LT5zaWgtPmJ1c2NvcmVyZXYgPj0gMTMpKSkpKQogCQlyZXR1cm47CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKLWJvb2wgd2xjX2JtYWNfcmFkaW9faHcod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGVuYWJsZSkKK2Jvb2wgd2xjX2JtYWNfcmFkaW9faHcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgZW5hYmxlKQogewogCS8qIERvIG5vdCBhY2Nlc3MgUGh5IHJlZ2lzdGVycyBpZiBjb3JlIGlzIG5vdCB1cCAqLwogCWlmIChzaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkgPT0gZmFsc2UpCkBAIC00MTcxLDcgKzQyMDEsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi11MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggcmF0ZSkKK3UxNiB3bGNfYm1hY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHJhdGUpCiB7CiAJdTE2IHRhYmxlX3B0cjsKIAl1OCBwaHlfcmF0ZSwgaW5kZXg7CkBAIC00MTk1LDEyICs0MjI1LDEyIEBACiAJcmV0dXJuIDIgKiB3bGNfYm1hY19yZWFkX3NobSh3bGNfaHcsIHRhYmxlX3B0ciArIChpbmRleCAqIDIpKTsKIH0KIAotdm9pZCB3bGNfYm1hY19zZXRfdHhwd3JfcGVyY2VudCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHZhbCkKK3ZvaWQgd2xjX2JtYWNfc2V0X3R4cHdyX3BlcmNlbnQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHZhbCkKIHsKIAl3bGNfcGh5X3R4cHdyX3BlcmNlbnRfc2V0KHdsY19ody0+YmFuZC0+cGksIHZhbCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYW50c2VsX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBhbnRzZWxfYXZhaWwpCit2b2lkIHdsY19ibWFjX2FudHNlbF9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBhbnRzZWxfYXZhaWwpCiB7CiAJd2xjX2h3LT5hbnRzZWxfYXZhaWwgPSBhbnRzZWxfYXZhaWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaAppbmRleCA4NzJiYzhkLi45ODE1MGFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5oCkBAIC01Nyw3ICs1Nyw4IEBACiAJfSBiYW5kW01BWEJBTkRTXTsKIH0gd2xjX2JtYWNfcmV2aW5mb190OwogCi0vKiBkdXAgc3RhdGUgYmV0d2VlbiBCTUFDKHdsY19od19pbmZvX3QpIGFuZCBISUdIKHdsY19pbmZvX3QpIGRyaXZlciAqLworLyogZHVwIHN0YXRlIGJldHdlZW4gQk1BQyhzdHJ1Y3Qgd2xjX2h3X2luZm8pIGFuZCBISUdIKHN0cnVjdCB3bGNfaW5mbykKKyAgIGRyaXZlciAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xjX2JtYWNfc3RhdGUgewogCXUzMiBtYWNod2NhcDsJLyogbWFjIGh3IGNhcGliaWxpdHkgKi8KIAl1MzIgcHJlYW1ibGVfb3ZyOwkvKiBwcmVhbWJsZSBvdmVycmlkZSAqLwpAQCAtMTMwLDE0OCArMTMxLDE0MyBAQAogCVdMQ0hXX1NUQVRFX0xBU1QKIH0gd2xjX2JtYWNfc3RhdGVfaWRfdDsKIAotZXh0ZXJuIGludCB3bGNfYm1hY19hdHRhY2god2xjX2luZm9fdCAqd2xjLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAotCQkJICAgdWludCB1bml0LCBib29sIHBpb21vZGUsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3N2YSwKLQkJCSAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2RldGFjaCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIGludCB3bGNfYm1hY19hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsCisJCQkgICB1aW50IHVuaXQsIGJvb2wgcGlvbW9kZSwgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgICB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSk7CitleHRlcm4gaW50IHdsY19ibWFjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdm9pZCB3bGNfYm1hY193YXRjaGRvZyh2b2lkICphcmcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5mb19pbml0KHdsY19od19pbmZvX3QgKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19pbmZvX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCiAvKiB1cC9kb3duLCByZXNldCwgY2xrICovCi0jaWZkZWYgV0xDX0xPVwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfeHRhbCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgd2FudCk7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHdsY19ibWFjX3h0YWwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgd2FudCk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcHl0b19vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weXRvX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkgICB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLAogCQkJCSAgIHUzMiBzZWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAogCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1MzIgc2VsKTsKICNkZWZpbmUgd2xjX2JtYWNfY29weWZyb21fc2htKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbikgICAgICAgICAgICAgICAgIFwKIAl3bGNfYm1hY19jb3B5ZnJvbV9vYmptZW0od2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbGVuLCBPQkpBRERSX1NITV9TRUwpCiAjZGVmaW5lIHdsY19ibWFjX2NvcHl0b19zaG0od2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbGVuKSAgICAgICAgICAgICAgICAgICBcCiAJd2xjX2JtYWNfY29weXRvX29iam1lbSh3bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4sIE9CSkFERFJfU0hNX1NFTCkKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZV9waHlwbGxfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGh5Y2xrX2ZnYyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21hY3BoeWNsa19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsayk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19waHlfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlX3BoeV9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgY2xrKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbik7CitleHRlcm4gdm9pZCB3bGNfYm1hY19waHljbGtfZmdjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19tYWNwaHljbGtfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19waHlfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKIAkJCSAgYm9vbCBtdXRlKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfdXBfcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIGludCB3bGNfYm1hY191cF9maW5pc2god2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfZG93bl9wcmVwKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2Rvd25fZmluaXNoKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzcHVybW9kZSk7CitleHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY191cF9maW5pc2goc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY19kb3duX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY19kb3duX2ZpbmlzaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBmbGFncyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zd2l0Y2hfbWFjZnJlcShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggc3B1cm1vZGUpOwogCiAvKiBjaGFuc3BlYywgdWNvZGUgaW50ZXJmYWNlICovCi1leHRlcm4gaW50IHdsY19ibWFjX2JhbmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2hhbnNwZWMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAorZXh0ZXJuIGludCB3bGNfYm1hY19iYW5kdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2hhbnNwZWMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJICBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJCSAgYm9vbCBtdXRlLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cik7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3R4Zmlmbyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgdm9pZCAqcCwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3R4ZmlmbyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLCB2b2lkICpwLAogCQkJICAgIGJvb2wgY29tbWl0LCB1MTYgZnJhbWVpZCwgdTggdHhwa3RwZW5kKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sCitleHRlcm4gaW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sCiAJCQkJICAgdWludCAqYmxvY2tzKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21oZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGlkeCwgdTE2IG1hc2ssCitleHRlcm4gdm9pZCB3bGNfYm1hY19taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgdTE2IG1hc2ssCiAJCQkgdTE2IHZhbCwgaW50IGJhbmRzKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21jdHJsKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19taGZfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggaWR4LCBpbnQgYmFuZHMpOwotZXh0ZXJuIGludCB3bGNfYm1hY194bXRmaWZvX3N6X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywKK2V4dGVybiB2b2lkIHdsY19ibWFjX21jdHJsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgbWFzaywgdTMyIHZhbCk7CitleHRlcm4gdTE2IHdsY19ibWFjX21oZl9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywKIAkJCQkgICB1aW50IGJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY190eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19nZXRfdHhhbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2FudHNlbF90eXBlX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGFudHNlbF90eXBlKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfcmV2aW5mb19nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhhbnRfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpOworZXh0ZXJuIHUxNiB3bGNfYm1hY19nZXRfdHhhbnQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYW50c2VsX3R5cGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgICAgdTggYW50c2VsX3R5cGUpOworZXh0ZXJuIGludCB3bGNfYm1hY19yZXZpbmZvX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQl3bGNfYm1hY19yZXZpbmZvX3QgKnJldmluZm8pOwotZXh0ZXJuIGludCB3bGNfYm1hY19zdGF0ZV9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB3bGNfYm1hY19zdGF0ZV90ICpzdGF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19yZWFkX3NobSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCitleHRlcm4gaW50IHdsY19ibWFjX3N0YXRlX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCSAgICAgIHdsY19ibWFjX3N0YXRlX3QgKnN0YXRlKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX3NobShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2KTsKK2V4dGVybiB1MTYgd2xjX2JtYWNfcmVhZF9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwKIAkJCSAgICAgaW50IGxlbik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCBpbnQgb2Zmc2V0LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBpbnQgb2Zmc2V0LAogCQkJCQlpbnQgbGVuLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fdmFycyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYXIgKipidWYsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFyICoqYnVmLAogCQkJCSAgIHVpbnQgKmxlbik7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3Byb2Nlc3NfcHNfc3dpdGNoKHdsY19od19pbmZvX3QgKndsYywKK2V4dGVybiB2b2lkIHdsY19ibWFjX3Byb2Nlc3NfcHNfc3dpdGNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLAogCQkJCSAgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEsIHM4IHBzX29uKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfYm1hY19od19ldGhlcmFkZHIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfaHdfZXRoZXJhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCSAgICAgIHN0cnVjdCBldGhlcl9hZGRyICplYSk7Ci1leHRlcm4gYm9vbCB3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdmFsaWRhdGVfY2hpcF9hY2Nlc3Moc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19yZWFkX2h3ZGlzYWJsZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG9ydHNsb3Qod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNob3J0c2xvdCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19tdXRlKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB3YW50LCBtYm9vbCBmbGFncyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfZGVhZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdXNlcl9mbGFnKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2JhbmRfc3RmX3NzX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHN0Zl9tb2RlKTsKK2V4dGVybiBib29sIHdsY19ibWFjX3JhZGlvX3JlYWRfaHdkaXNhYmxlZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNob3J0c2xvdCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19tdXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHdhbnQsIG1ib29sIGZsYWdzKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9kZWFmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVzZXJfZmxhZyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19iYW5kX3N0Zl9zc19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHN0Zl9tb2RlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd2FpdF9mb3Jfd2FrZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3R4X2ZpZm9fcmVzdW1lKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dhaXRfZm9yX3dha2Uoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJICAgICAgIHVpbnQgdHhfZmlmbyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY190eF9maWZvX3N1c3BlbmQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgdHhfZmlmbyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY190eF9maWZvX3Jlc3VtZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odywKK2V4dGVybiB2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJdTMyIG92ZXJyaWRlX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJICB1MzIgb3ZlcnJpZGVfYml0KTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3JjbXRhKHdsY19od19pbmZvX3QgKndsY19odywgaW50IGlkeCwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9yY210YShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IGlkeCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfYWRkcm1hdGNoKHdsY19od19pbmZvX3QgKndsY19odywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfYWRkcm1hdGNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgIGludCBtYXRjaF9yZWdfb2Zmc2V0LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHZvaWQgKmJjbiwKLQkJCQkJICAgaW50IGxlbiwgYm9vbCBib3RoKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkJICAgdm9pZCAqYmNuLCBpbnQgbGVuLCBib29sIGJvdGgpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19yZWFkX3RzZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVhZF90c2Yoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAogCQkJICAgICAgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21pbik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY3dtYXgod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgbmV3bWF4KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHdsY19od19pbmZvX3QgKndsYywgYm9vbCBub3Jlc2V0X2ZsYWcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3Vjb2RlX2xvYWRlZCh3bGNfaHdfaW5mb190ICp3bGMsIGJvb2wgdWNvZGVfbG9hZGVkKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IG5ld21pbik7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY3dtYXgoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBuZXdtYXgpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X25vcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGMsIGJvb2wgbm9yZXNldF9mbGFnKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF91Y29kZV9sb2FkZWQoc3RydWN0IHdsY19od19pbmZvICp3bGMsCisJCQkJICAgICAgYm9vbCB1Y29kZV9sb2FkZWQpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19yZXRyeWxpbWl0X3VwZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBTUkwsCitleHRlcm4gdm9pZCB3bGNfYm1hY19yZXRyeWxpbWl0X3VwZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IFNSTCwKIAkJCQkgICAgdTE2IExSTCk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2ZpZm9lcnJvcnMod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2ZpZm9lcnJvcnMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9yZWJvb3QocnBjX2luZm9fdCAqKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcnBjX2FnZyhycGNfaW5mb190ICosIHUxNiBhZ2cpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfbXNnbGV2ZWwocnBjX2luZm9fdCAqLCB1MTYgbGV2ZWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfdHhxX3dtX3NldChycGNfaW5mb190ICpycGMsIHUzMiB3bSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY190eHFfd21fZ2V0KHJwY19pbmZvX3QgKnJwYywgdTMyICp3bSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY19hZ2dfbGltaXRfc2V0KHJwY19pbmZvX3QgKnJwYywgdTMyIHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY19hZ2dfbGltaXRfZ2V0KHJwY19pbmZvX3QgKnJwYywgdTMyICpwdmFsKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfZGVidWdfdGVtcGxhdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLSNlbmRpZgogCiAvKiBBUEkgZm9yIEJNQUMgZHJpdmVyIChlLmcuIHdsY19waHkuYyBldGMpICovCiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2J3X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBidyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19wbGxyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBvbik7Ci1leHRlcm4gYm9vbCB3bGNfYm1hY190YWNsZWFyKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB0YV9vayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19id19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBidyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19wbGxyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgc2V0LAorCQkJICAgIG1ib29sIHJlcV9iaXQpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbik7CitleHRlcm4gYm9vbCB3bGNfYm1hY190YWNsZWFyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHRhX29rKTsKIGV4dGVybiB2b2lkIHdsY19ibWFjX2h3X3VwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZHVtcCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHN0cnVjdCBiY21zdHJidWYgKmIsCitleHRlcm4gdm9pZCB3bGNfYm1hY19kdW1wKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAogCQkJICB3bGNfYm1hY19kdW1wX2lkX3QgZHVtcF9pZCk7Ci1leHRlcm4gdm9pZCB3bGNfZ3Bpb19mYXN0X2RlaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2dwaW9fZmFzdF9kZWluaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19odyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB1MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggcmF0ZSk7CitleHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19odyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBlbmFibGUpOworZXh0ZXJuIHUxNiB3bGNfYm1hY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHJhdGUpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19hc3NlcnRfdHlwZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgdHlwZSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfdHhwd3JfcGVyY2VudCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19ibGlua19zeW5jKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGxlZF9waW5zKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGFiaWUsCitleHRlcm4gdm9pZCB3bGNfYm1hY19hc3NlcnRfdHlwZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiB0eXBlKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF90eHB3cl9wZXJjZW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCB2YWwpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYmxpbmtfc3luYyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIGxlZF9waW5zKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgYWJpZSwKIAkJCQkgICAgICBib29sIGlzaHQpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGFudHNlbF9hdmFpbCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ic3NjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ic3NjZmcuaAppbmRleCBhZTU1NDJhLi5kNmExOTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYnNzY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2Jzc2NmZy5oCkBAIC0zNCw3ICszNCw4IEBACiAjZGVmaW5lIE1BWE1BQ0xJU1QJCTY0CS8qIG1heCAjIHNvdXJjZSBNQUMgbWF0Y2hlcyAqLwogI2RlZmluZSBCQ05fVEVNUExBVEVfQ09VTlQgCTIKIAotLyogSXRlcmF0b3IgZm9yICJhc3NvY2lhdGVkIiBTVEEgYnNzIGNvbmZpZ3M6ICAod2xjX2luZm9fdCAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KKy8qIEl0ZXJhdG9yIGZvciAiYXNzb2NpYXRlZCIgU1RBIGJzcyBjb25maWdzOgorICAgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KICNkZWZpbmUgRk9SRUFDSF9BU19TVEEod2xjLCBpZHgsIGNmZykgXAogCWZvciAoaWR4ID0gMDsgKGludCkgaWR4IDwgV0xDX01BWEJTU0NGRzsgaWR4KyspIFwKIAkJaWYgKChjZmcgPSAod2xjKS0+YnNzY2ZnW2lkeF0pICYmIEJTU0NGR19TVEEoY2ZnKSAmJiBjZmctPmFzc29jaWF0ZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmgKaW5kZXggYTQxNWUxZi4uM2RlY2I3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jZmcuaApAQCAtMjMsMTQgKzIzLDYgQEAKIAogI2RlZmluZSBJU19TSU5HTEVCQU5EXzVHKGRldmljZSkJMAogCi0vKiBLZWVwIFdMQ19ISUdIX09OTFksIFdMQ19TUExJVCBmb3IgVVNCIGV4dGVuc2lvbiBsYXRlciBvbiAqLwotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19ISUdIX09OTFkKLSNlbmRpZgotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19TUExJVAotI2VuZGlmCi0KIC8qICoqKiogQ29yZSB0eXBlL3JldiBkZWZhdWx0cyAqKioqICovCiAjZGVmaW5lIEQxMV9ERUZBVUxUCTB4MGZmZmZmYjAJLyogU3VwcG9ydGVkICBEMTEgcmV2czogNCwgNSwgNy0yNwogCQkJCQkgKiBhbHNvIG5lZWQgdG8gdXBkYXRlIHdsYy5oIE1BWENPUkVSRVYKQEAgLTYxLDIyICs1Myw2IEBACiAJCQkJCSAqICAgICAgMyAgICAgICA1MzU2YTAKIAkJCQkJICovCiAKLSNpZmRlZiBCQ01TRElPCi0jZGVmaW5lIEQxMUNPTkYgMHgxMDAwMDAKLSNkZWZpbmUgU1NMUE5DT05GIDIKLSNkZWZpbmUgR0NDT05GCTAKLSNkZWZpbmUgQUNDT05GCTAKLSNkZWZpbmUgTkNPTkYJMAotI2RlZmluZSBMUENPTkYJMAotI2RlZmluZSBMQ05DT05GCTAKLSNkZWZpbmUgTlRYRCAzMgotI2RlZmluZSBOUlhEIDE2Ci0jZGVmaW5lIE5SWEJVRlBPU1QgOAotI2RlZmluZSBXTENfREFUQUhJV0FUIDMyCi0jZGVmaW5lIFJYQk5EIDgKLSNkZWZpbmUgTUFYUEtUQ0IgNjQKLSNkZWZpbmUgQU1QRFVfTlVNX01QRFUgOAotI2VuZGlmCiAKIC8qIEZvciB1bmRlZmluZWQgdmFsdWVzLCB1c2UgZGVmYXVsdHMgKi8KICNpZm5kZWYgRDExQ09ORgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jaGFubmVsLmMKaW5kZXggNTA5MjgwMy4uYTM1YzE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2hhbm5lbC5jCkBAIC0xOSwxNiArMTksMjEgQEAKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3N0Zi5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIHR5cGVkZWYgc3RydWN0IHdsY19jbV9iYW5kIHsKIAl1OCBsb2NhbGVfZmxhZ3M7CS8qIGxvY2FsZV9pbmZvX3QgZmxhZ3MgKi8KQEAgLTM5LDggKzQ0LDggQEAKIH0gd2xjX2NtX2JhbmRfdDsKIAogc3RydWN0IHdsY19jbV9pbmZvIHsKLQl3bGNfcHViX3QgKnB1YjsKLQl3bGNfaW5mb190ICp3bGM7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAljaGFyIHNyb21fY2NvZGVbV0xDX0NOVFJZX0JVRl9TWl07CS8qIENvdW50cnkgQ29kZSBpbiBTUk9NICovCiAJdWludCBzcm9tX3JlZ3JldjsJLyogUmVndWxhdG9yeSBSZXYgZm9yIHRoZSBTUk9NIGNjb2RlICovCiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CS8qIGN1cnJlbnQgY291bnRyeSBkZWYgKi8KQEAgLTM3Nyw3ICszODIsNyBAQAogewogCXU4IGk7CiAKLQliemVybyhjaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ190YWJsZV9sb2NhbGVfYmFzZSk7IGkrKykgewogCQlpZiAobG9jYWxlLT52YWxpZF9jaGFubmVscyAmICgxIDw8IGkpKSB7CkBAIC01NjIsOCArNTY3LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDJnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NzMsOCArNTc4LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDVnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01ODQsOCArNTg5LDggQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fMmdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gMmcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzJnX3RhYmxlW2xvY2FsZV9pZHhdOwpAQCAtNTk0LDI2ICs1OTksMjYgQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fNWdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gNWcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzVnX3RhYmxlW2xvY2FsZV9pZHhdOwogfQogCi13bGNfY21faW5mb190ICp3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK3dsY19jbV9pbmZvX3QgKndsY19jaGFubmVsX21ncl9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX2NtX2luZm9fdCAqd2xjX2NtOwogCWNoYXIgY291bnRyeV9hYmJyZXZbV0xDX0NOVFJZX0JVRl9TWl07CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7Ci0Jd2xjX3B1Yl90ICpwdWIgPSB3bGMtPnB1YjsKKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViID0gd2xjLT5wdWI7CiAJY2hhciAqY2NvZGU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsY19jbSA9IGt6YWxsb2Moc2l6ZW9mKHdsY19jbV9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAod2xjX2NtID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeSIsIHB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBvdXQgb2YgbWVtb3J5IiwgcHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAl3bGNfY20tPnB1YiA9IHB1YjsKQEAgLTYyNCwxMiArNjI5LDEzIEBACiAJY2NvZGUgPSBnZXR2YXIod2xjLT5wdWItPnZhcnMsICJjY29kZSIpOwogCWlmIChjY29kZSkgewogCQlzdHJuY3B5KHdsYy0+cHViLT5zcm9tX2Njb2RlLCBjY29kZSwgV0xDX0NOVFJZX0JVRl9TWiAtIDEpOwotCQlXTF9OT05FKCgiJXM6IFNST00gY291bnRyeSBjb2RlIGlzICVjJWNcbiIsIF9fZnVuY19fLAotCQkJIHdsYy0+cHViLT5zcm9tX2Njb2RlWzBdLCB3bGMtPnB1Yi0+c3JvbV9jY29kZVsxXSkpOworCQlXTF9OT05FKCIlczogU1JPTSBjb3VudHJ5IGNvZGUgaXMgJWMlY1xuIiwKKwkJCV9fZnVuY19fLAorCQkJd2xjLT5wdWItPnNyb21fY2NvZGVbMF0sIHdsYy0+cHViLT5zcm9tX2Njb2RlWzFdKTsKIAl9CiAKIAkvKiBpbnRlcm5hbCBjb3VudHJ5IGluZm9ybWF0aW9uIHdoaWNoIG11c3QgbWF0Y2ggcmVndWxhdG9yeSBjb25zdHJhaW50cyBpbiBmaXJtd2FyZSAqLwotCWJ6ZXJvKGNvdW50cnlfYWJicmV2LCBXTENfQ05UUllfQlVGX1NaKTsKKwltZW1zZXQoY291bnRyeV9hYmJyZXYsIDAsIFdMQ19DTlRSWV9CVUZfU1opOwogCXN0cm5jcHkoY291bnRyeV9hYmJyZXYsICJYMiIsIHNpemVvZihjb3VudHJ5X2FiYnJldikgLSAxKTsKIAljb3VudHJ5ID0gd2xjX2NvdW50cnlfbG9va3VwKHdsYywgY291bnRyeV9hYmJyZXYpOwogCkBAIC02NTksNyArNjY1LDcgQEAKIAogdTggd2xjX2NoYW5uZWxfbG9jYWxlX2ZsYWdzKHdsY19jbV9pbmZvX3QgKndsY19jbSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIHdsY19jbS0+YmFuZHN0YXRlW3dsYy0+YmFuZC0+YmFuZHVuaXRdLmxvY2FsZV9mbGFnczsKIH0KQEAgLTcxMSw3ICs3MTcsOSBAQAogCWNoYXIgbWFwcGVkX2Njb2RlW1dMQ19DTlRSWV9CVUZfU1pdOwogCXVpbnQgbWFwcGVkX3JlZ3JldjsKIAotCVdMX05PTkUoKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwgX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LCB3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpKTsKKwlXTF9OT05FKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwKKwkJX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LAorCQl3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpOwogCiAJLyogaWYgcmVncmV2IGlzIC0xLCBsb29rdXAgdGhlIG1hcHBlZCBjb3VudHJ5IGNvZGUsCiAJICogb3RoZXJ3aXNlIHVzZSB0aGUgY2NvZGUgYW5kIHJlZ3JldiBkaXJlY3RseQpAQCAtNzUwLDcgKzc1OCw3IEBACiB7CiAJY29uc3QgbG9jYWxlX21pbW9faW5mb190ICpsaV9taW1vOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxvY2FsZTsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCWNoYXIgcHJldl9jb3VudHJ5X2FiYnJldltXTENfQ05UUllfQlVGX1NaXTsKIAogCUFTU0VSVChjb3VudHJ5ICE9IE5VTEwpOwpAQCAtNzU4LDcgKzc2Niw3IEBACiAJLyogc2F2ZSBjdXJyZW50IGNvdW50cnkgc3RhdGUgKi8KIAl3bGNfY20tPmNvdW50cnkgPSBjb3VudHJ5OwogCi0JYnplcm8oJnByZXZfY291bnRyeV9hYmJyZXYsIFdMQ19DTlRSWV9CVUZfU1opOworCW1lbXNldCgmcHJldl9jb3VudHJ5X2FiYnJldiwgMCwgV0xDX0NOVFJZX0JVRl9TWik7CiAJc3RybmNweShwcmV2X2NvdW50cnlfYWJicmV2LCB3bGNfY20tPmNvdW50cnlfYWJicmV2LAogCQlXTENfQ05UUllfQlVGX1NaIC0gMSk7CiAKQEAgLTgxNCw3ICs4MjIsNyBAQAogCQkJCQkJIGNoYXIgKm1hcHBlZF9jY29kZSwKIAkJCQkJCSB1aW50ICptYXBwZWRfcmVncmV2KQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CiAJdWludCBzcm9tX3JlZ3JldiA9IHdsY19jbS0+c3JvbV9yZWdyZXY7CiAJY29uc3QgY2hhciAqc3JvbV9jY29kZSA9IHdsY19jbS0+c3JvbV9jY29kZTsKQEAgLTgyMiw4ICs4MzAsOCBAQAogCiAJLyogY2hlY2sgZm9yIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2NvZGUgc2l6ZSAqLwogCWlmIChzdHJsZW4oY2NvZGUpID4gKFdMQ19DTlRSWV9CVUZfU1ogLSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjY29kZSBcIiVzXCIgdG9vIGxvbmcgZm9yIG1hdGNoXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2NvZGUgXCIlc1wiIHRvbyBsb25nIGZvciBtYXRjaFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC04MzgsNyArODQ2LDcgQEAKIAlpZiAoIXN0cmNtcChzcm9tX2Njb2RlLCBjY29kZSkpIHsKIAkJKm1hcHBlZF9yZWdyZXYgPSBzcm9tX3JlZ3JldjsKIAkJbWFwcGVkID0gMDsKLQkJV0xfRVJST1IoKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKTsKIAkJQVNTRVJUKDApOwogCX0gZWxzZSB7CiAJCW1hcHBlZCA9CkBAIC04OTAsNyArODk4LDcgQEAKIAkJfQogCX0KIAotCVdMX0VSUk9SKCgiJXM6IFJldHVybmluZyBOVUxMXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogUmV0dXJuaW5nIE5VTExcbiIsIF9fZnVuY19fKTsKIAlBU1NFUlQoMCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC04OTgsOSArOTA2LDkgQEAKIHN0YXRpYyBpbnQKIHdsY19jaGFubmVsc19pbml0KHdsY19jbV9pbmZvX3QgKndsY19jbSwgY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnkpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGksIGo7Ci0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxpOwogCWNoYW52ZWNfdCBzdXBfY2hhbjsKIAljb25zdCBsb2NhbGVfbWltb19pbmZvX3QgKmxpX21pbW87CkBAIC05NTIsNyArOTYwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgd2xjX2NoYW5uZWxzX2NvbW1pdCh3bGNfY21faW5mb190ICp3bGNfY20pCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGNoYW47CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIApAQCAtOTY5LDcgKzk3Nyw5IEBACiAJaWYgKGNoYW4gPT0gSU5WQ0hBTk5FTCkgewogCQkvKiBjb3VudHJ5L2xvY2FsZSB3aXRoIG5vIHZhbGlkIGNoYW5uZWxzLCBzZXQgdGhlIHJhZGlvIGRpc2FibGUgYml0ICovCiAJCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fQ09VTlRSWV9ESVNBQkxFKTsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogbm8gdmFsaWQgY2hhbm5lbCBmb3IgXCIlc1wiIG5iYW5kcyAlZCBiYW5kbG9ja2VkICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBubyB2YWxpZCBjaGFubmVsIGZvciBcIiVzXCIgbmJhbmRzICVkIGJhbmRsb2NrZWQgJWRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpOwogCX0gZWxzZQogCSAgICBpZiAobWJvb2xpc3NldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCiAJCVdMX1JBRElPX0NPVU5UUllfRElTQUJMRSkpIHsKQEAgLTk5OCwxMiArMTAwOCwxMiBAQAogLyogcmVzZXQgdGhlIHF1aWV0IGNoYW5uZWxzIHZlY3RvciB0byB0aGUgdW5pb24gb2YgdGhlIHJlc3RyaWN0ZWQgYW5kIHJhZGFyIGNoYW5uZWwgc2V0cyAqLwogdm9pZCB3bGNfcXVpZXRfY2hhbm5lbHNfcmVzZXQod2xjX2NtX2luZm9fdCAqd2xjX2NtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJdWludCBpLCBqOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBjaGFudmVjX3QgKmNoYW52ZWM7CiAKLQliemVybygmd2xjX2NtLT5xdWlldF9jaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldCgmd2xjX2NtLT5xdWlldF9jaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJYmFuZCA9IHdsYy0+YmFuZDsKIAlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7CkBAIC0xMDM2LDcgKzEwNDYsNyBAQAogICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjBfZGIod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIFZBTElEX0NIQU5ORUwyMCh3bGMsIHZhbCkgfHwKIAkJKCF3bGMtPmJhbmRsb2NrZWQKQEAgLTEwNTQsNyArMTA2NCw3IEBACiAvKiBJcyB0aGUgY2hhbm5lbCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBjdXJyZW50IGJhbmQ/ICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjAod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuICgodmFsIDwgTUFYQ0hBTk5FTCkgJiYKIAkJaXNzZXQod2xjX2NtLT5iYW5kc3RhdGVbd2xjLT5iYW5kLT5iYW5kdW5pdF0udmFsaWRfY2hhbm5lbHMudmVjLApAQCAtMTA2NCw3ICsxMDc0LDcgQEAKIC8qIElzIHRoZSA0MCBNSHogYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBzcGVjaWZpZWQgYmFuZD8gKi8KIGJvb2wgd2xjX3ZhbGlkXzQwY2hhbnNwZWNfaW5fYmFuZCh3bGNfY21faW5mb190ICp3bGNfY20sIHVpbnQgYmFuZHVuaXQpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAogCXJldHVybiAoKCh3bGNfY20tPmJhbmRzdGF0ZVtiYW5kdW5pdF0uCiAJCSAgbG9jYWxlX2ZsYWdzICYgKFdMQ19OT19NSU1PIHwgV0xDX05PXzQwTUhaKSkgPT0gMCkKQEAgLTExNjIsNyArMTE3Miw3IEBACiB3bGNfY2hhbm5lbF9zZXRfY2hhbnNwZWMod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJIHU4IGxvY2FsX2NvbnN0cmFpbnRfcWRibSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXN0cnVjdCB0eHB3cl9saW1pdHMgdHhwd3I7CiAKIAl3bGNfY2hhbm5lbF9yZWdfbGltaXRzKHdsY19jbSwgY2hhbnNwZWMsICZ0eHB3cik7CkBAIC0xMTc5LDcgKzExODksNyBAQAogd2xjX2NoYW5uZWxfc2V0X3R4cG93ZXJfbGltaXQod2xjX2NtX2luZm9fdCAqd2xjX2NtLAogCQkJICAgICAgdTggbG9jYWxfY29uc3RyYWludF9xZGJtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIAogCXdsY19jaGFubmVsX3JlZ19saW1pdHMod2xjX2NtLCB3bGMtPmNoYW5zcGVjLCAmdHhwd3IpOwpAQCAtMTI5OSwxMyArMTMwOSwxMyBAQAogd2xjX2NoYW5uZWxfcmVnX2xpbWl0cyh3bGNfY21faW5mb190ICp3bGNfY20sIGNoYW5zcGVjX3QgY2hhbnNwZWMsCiAJCSAgICAgICB0eHB3cl9saW1pdHNfdCAqdHhwd3IpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGk7CiAJdWludCBjaGFuOwogCWludCBtYXhwd3I7CiAJaW50IGRlbHRhOwogCWNvbnN0IGNvdW50cnlfaW5mb190ICpjb3VudHJ5OwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBsb2NhbGVfaW5mb190ICpsaTsKIAlpbnQgY29uZHVjdGVkX21heDsKIAlpbnQgY29uZHVjdGVkX29mZG1fbWF4OwpAQCAtMTMxNCw3ICsxMzI0LDcgQEAKIAlpbnQgbWF4cHdyX2lkeDsKIAl1aW50IGo7CiAKLQliemVybyh0eHB3ciwgc2l6ZW9mKHR4cHdyX2xpbWl0c190KSk7CisJbWVtc2V0KHR4cHdyLCAwLCBzaXplb2YodHhwd3JfbGltaXRzX3QpKTsKIAogCWlmICghd2xjX3ZhbGlkX2NoYW5zcGVjX2RiKHdsY19jbSwgY2hhbnNwZWMpKSB7CiAJCWNvdW50cnkgPSB3bGNfY291bnRyeV9sb29rdXAod2xjLCB3bGMtPmF1dG9jb3VudHJ5X2RlZmF1bHQpOwpAQCAtMTUyOCwxMyArMTUzOCwxMyBAQAogc3RhdGljIGJvb2wKIHdsY192YWxpZF9jaGFuc3BlY19leHQod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoc3BlYywgYm9vbCBkdWFsYmFuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXU4IGNoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChjaHNwZWMpOwogCiAJLyogY2hlY2sgdGhlIGNoYW5zcGVjICovCiAJaWYgKHdmX2Noc3BlY19tYWxmb3JtZWQoY2hzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IG1hbGZvcm1lZCBjaGFuc3BlYyAweCV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgY2hzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBtYWxmb3JtZWQgY2hhbnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgY2hzcGVjKTsKIAkJQVNTRVJUKDApOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwppbmRleCA3ZTFiZjBlLi5kYWJkNzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwpAQCAtMTYsOSArMTYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KQEAgLTMyLDYgKzM2LDcgQEAKICNpZmRlZiBNU0dUUkFDRQogI2luY2x1ZGUgPG1zZ3RyYWNlLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIHZvaWQgd2xjX3RpbWVyX2NiKHZvaWQgKmFyZyk7CkBAIC00Miw3ICs0Nyw3IEBACiAJd2xjX2V2ZW50X3QgKnRhaWw7CiAJc3RydWN0IHdsY19pbmZvICp3bGM7CiAJdm9pZCAqd2w7Ci0Jd2xjX3B1Yl90ICpwdWI7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKIAlib29sIHRwZW5kaW5nOwogCWJvb2wgd29ya3BlbmRpbmc7CiAJc3RydWN0IHdsX3RpbWVyICp0aW1lcjsKQEAgLTUzLDcgKzU4LDggQEAKIC8qCiAgKiBFeHBvcnQgZnVuY3Rpb25zCiAgKi8KLXdsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2god2xjX3B1Yl90ICpwdWIsIHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICp3bCwKK3dsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2goc3RydWN0IHdsY19wdWIgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJdm9pZCAqd2wsCiAJCQkJd2xjX2V2ZW50cV9jYl90IGNiKQogewogCXdsY19ldmVudHFfdCAqZXE7CkBAIC02OSw4ICs3NSw4IEBACiAKIAllcS0+dGltZXIgPSB3bF9pbml0X3RpbWVyKGVxLT53bCwgd2xjX3RpbWVyX2NiLCBlcSwgImV2ZW50cSIpOwogCWlmICghZXEtPnRpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2V2ZW50cV9hdHRhY2g6IHRpbWVyIGZhaWxlZFxuIiwKLQkJCSAgcHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfZXZlbnRxX2F0dGFjaDogdGltZXIgZmFpbGVkXG4iLAorCQkJIHB1Yi0+dW5pdCk7CiAJCWtmcmVlKGVxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAppbmRleCBlNDQzZGFlLi5lNzU1ODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaApAQCAtMjEsNyArMjEsOCBAQAogCiB0eXBlZGVmIHZvaWQgKCp3bGNfZXZlbnRxX2NiX3QpICh2b2lkICphcmcpOwogCi1leHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaCh3bGNfcHViX3QgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCitleHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaChzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2xjX2luZm8gKndsYywKIAkJCQkgICAgICAgdm9pZCAqd2wsIHdsY19ldmVudHFfY2JfdCBjYik7CiBleHRlcm4gaW50IHdsY19ldmVudHFfZGV0YWNoKHdsY19ldmVudHFfdCAqZXEpOwogZXh0ZXJuIGludCB3bGNfZXZlbnRxX2Rvd24od2xjX2V2ZW50cV90ICplcSk7CkBAIC0zOCw3ICszOSw3IEBACiBleHRlcm4gaW50IHdsY19ldmVudHFfdGVzdF9pbmQod2xjX2V2ZW50cV90ICplcSwgaW50IGV0KTsKIGV4dGVybiBpbnQgd2xjX2V2ZW50cV9zZXRfaW5kKHdsY19ldmVudHFfdCAqZXEsIHVpbnQgZXQsIGJvb2wgb24pOwogZXh0ZXJuIHZvaWQgd2xjX2V2ZW50cV9mbHVzaCh3bGNfZXZlbnRxX3QgKmVxKTsKLWV4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHdsY19pbmZvX3QgKndsYywgd2xfZXZlbnRfbXNnX3QgKm1zZywKK2V4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bF9ldmVudF9tc2dfdCAqbXNnLAogCQkJCSBjb25zdCB3bGNfZXZlbnRfdCAqZSwgdTggKmRhdGEsCiAJCQkJIHUzMiBsZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCmluZGV4IGZlYWZmY2MuLjFkNWQwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCkBAIC0xNSw5ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC0yNyw3ICsyOCw3IEBACiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAjaW5jbHVkZSA8YmNtc3JvbS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDxlcGl2ZXJzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KICNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPHdsY19rZXkuaD4KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+CiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KQEAgLTQ3LDI3ICs0OSwxMSBAQAogI2luY2x1ZGUgPHdsY19hbXBkdS5oPgogI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgotI2lmZGVmIEJDTVNESU8KLSNpbmNsdWRlIDxiY21zZGguaD4KLSNlbHNlCiAjaW5jbHVkZSAiZDExdWNvZGVfZXh0LmgiCi0jZW5kaWYKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0jaW5jbHVkZSA8YmNtX3JwY190cC5oPgotI2luY2x1ZGUgPGJjbV9ycGMuaD4KLSNpbmNsdWRlIDxiY21feGRyLmg+Ci0jaW5jbHVkZSA8d2xjX3JwYy5oPgotI2luY2x1ZGUgPHdsY19ycGN0eC5oPgotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNpbmNsdWRlIDx3bGNfYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSN1bmRlZiBSX1JFRwotI3VuZGVmIFdfUkVHCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgUlBDX1JFQURfUkVHKG9zaCwgcikKLSNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBSUENfV1JJVEVfUkVHKG9zaCwgciwgdikKLSNlbmRpZgogCiAvKgogICogYnVmZmVyIGxlbmd0aCBuZWVkZWQgZm9yIHdsY19mb3JtYXRfc3NpZApAQCAtMTA3LDEyICs5Myw4IEBACiAvKiBUbyBpbmZvcm0gdGhlIHVjb2RlIG9mIHRoZSBsYXN0IG1jYXN0IGZyYW1lIHBvc3RlZCBzbyB0aGF0IGl0IGNhbiBjbGVhciBtb3JlZGF0YSBiaXQgKi8KICNkZWZpbmUgQkNNQ0ZJRCh3bGMsIGZpZCkgd2xjX2JtYWNfd3JpdGVfc2htKCh3bGMpLT5odywgTV9CQ01DX0ZJRCwgKGZpZCkpCiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQotI2RlZmluZSBXTENfV0FSMTYxNjUod2xjKSAoQlVTVFlQRSh3bGMtPnB1Yi0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTICYmIFwKKyNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKHdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUyAmJiBcCiAJCQkJKCFBUF9FTkFCKHdsYy0+cHViKSkgJiYgKHdsYy0+d2FyMTYxNjUpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKGZhbHNlKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogLyogZGVidWcvdHJhY2UgKi8KIHVpbnQgd2xfbXNnX2xldmVsID0KQEAgLTEzNSw5ICsxMTcsMTEgQEAKIAogI2RlZmluZSBTQ0FOX0lOX1BST0dSRVNTKHgpCTAKIAorI2RlZmluZSBFUElfVkVSU0lPTl9OVU0JCTB4MDU0YjBiMDAKKwogI2lmZGVmIEJDTURCRwogLyogcG9pbnRlciB0byBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCB3bC93bGMgKi8KLXN0YXRpYyB3bGNfaW5mb190ICp3bGNfaW5mb19kYmcgPSAod2xjX2luZm9fdCAqKSAoTlVMTCk7CitzdGF0aWMgc3RydWN0IHdsY19pbmZvICp3bGNfaW5mb19kYmcgPSAoc3RydWN0IHdsY19pbmZvICopIChOVUxMKTsKICNlbmRpZgogCiAvKiBJT1ZhciB0YWJsZSAqLwpAQCAtMjM4LDkxICsyMjIsOTEgQEAKICNkZWZpbmUgV0xDX1JFUExBWV9DTlRSU19WQUxVRQlXUEFfQ0FQXzE2X1JFUExBWV9DTlRSUwogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1leHRlcm4gdm9pZCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpOwotc3RhdGljIHUxNiBCQ01GQVNUUEFUSCB3bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqcCwKK3N0YXRpYyB1MTYgQkNNRkFTVFBBVEggd2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwLAogCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiLCB1aW50IGZyYWcsCiAJCQkJCSAgICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwKIAkJCQkJICAgICAgIHVpbnQgbmV4dF9mcmFnX2xlbiwKIAkJCQkJICAgICAgIHdzZWNfa2V5X3QgKmtleSwKIAkJCQkJICAgICAgIHJhdGVzcGVjX3QgcnNwZWNfb3ZlcnJpZGUpOwotYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHZvaWQgKnNkdSwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCB3bGNfd21lX3NldHBhcmFtcyh3bGNfaW5mb190ICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywgYm9vbCBzdXNwZW5kKTsKLXN0YXRpYyB2b2lkIHdsY19ic3NfZGVmYXVsdF9pbml0KHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHJhdGVzcGVjX3QgbWFjODAyMTFfd2xjX3NldF9ucmF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqY3VyX2JhbmQsCi0JCQkJCSB1MzIgaW50X3ZhbCk7Ci1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpOworCitzdGF0aWMgdm9pZCB3bGNfYnNzX2RlZmF1bHRfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgcmF0ZXNwZWNfdCBtYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgc3RydWN0IHdsY2JhbmQgKmN1cl9iYW5kLCB1MzIgaW50X3ZhbCk7CitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKTsKIHN0YXRpYyB2b2lkIHdsY193YXRjaGRvZ19ieV90aW1lcih2b2lkICphcmcpOwotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpOwotc3RhdGljIGludCB3bGNfaW92YXJfcmFuZ2VjaGVjayh3bGNfaW5mb190ICp3bGMsIHUzMiB2YWwsCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKTsKK3N0YXRpYyBpbnQgd2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsCiAJCQkJY29uc3QgYmNtX2lvdmFyX3QgKnZpKTsKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdTggd2xjX2xvY2FsX2NvbnN0cmFpbnRfcWRibShzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKIC8qIHNlbmQgYW5kIHJlY2VpdmUgKi8KLXN0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpOwotc3RhdGljIHZvaWQgd2xjX3R4cV9mcmVlKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgd2xjX3R4cV9pbmZvX3QgKnFpKTsKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAogCQkJCSAgICAgYm9vbCBvbiwgaW50IHByaW8pOwotc3RhdGljIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfYWlydGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitzdGF0aWMgdm9pZCB3bGNfdHhmbG93Y29udHJvbF9yZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IHdsY19jb21wdXRlX2FpcnRpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJICB1aW50IGxlbmd0aCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9jY2tfcGxjcChyYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9vZmRtX3BsY3AocmF0ZXNwZWNfdCByYXRlLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApOwogc3RhdGljIHZvaWQgd2xjX2NvbXB1dGVfbWltb19wbGNwKHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsIHU4ICpwbGNwKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfZnJhbWVfZHVyKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHUxNiB3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCQkgICAgdTggcHJlYW1ibGVfdHlwZSwgdWludCBuZXh0X2ZyYWdfbGVuKTsKLXN0YXRpYyB2b2lkIHdsY19yZWN2Y3RsKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgZDExcnhoZHJfdCAqcnhoLAotCQkJdm9pZCAqcCk7Ci1zdGF0aWMgdWludCB3bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdm9pZCB3bGNfcmVjdmN0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQlkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwKTsKK3N0YXRpYyB1aW50IHdsY19jYWxjX2ZyYW1lX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgZHVyKTsKLXN0YXRpYyB1aW50IHdsY19jYWxjX2Fja190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYWNrX3RpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCSAgICAgIHU4IHByZWFtYmxlX3R5cGUpOwotc3RhdGljIHVpbnQgd2xjX2NhbGNfY3RzX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdWludCB3bGNfY2FsY19jdHNfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSk7CiAvKiBpbnRlcnJ1cHQsIHVwL2Rvd24sIGJhbmQgKi8KLXN0YXRpYyB2b2lkIHdsY19zZXRiYW5kKHdsY19pbmZvX3QgKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgY2hhbnNwZWNfdCB3bGNfaW5pdF9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKLXN0YXRpYyB2b2lkIHdsY19ic2luaXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyBpbnQgd2xjX2R1dHlfY3ljbGVfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAorc3RhdGljIHZvaWQgd2xjX3NldGJhbmQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpOworc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpOworc3RhdGljIHZvaWQgd2xjX2JzaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgaW50IHdsY19kdXR5X2N5Y2xlX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAogCQkJICAgICAgYm9vbCB3cml0ZVRvU2htKTsKLXN0YXRpYyB2b2lkIHdsY19yYWRpb19od2Rpc2FibGVfdXBkKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdGFydCh3bGNfaW5mb190ICp3bGMpOworc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fdXBkKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19yYWRpb191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCiAvKiBzY2FuLCBhc3NvY2lhdGlvbiwgQlNTICovCi1zdGF0aWMgdWludCB3bGNfY2FsY19iYV90aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICB1OCBwcmVhbWJsZV90eXBlKTsKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9zZ2lfcngod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKTsKLXN0YXRpYyB2b2lkIHdsY193YXIxNjE2NSh3bGNfaW5mb190ICp3bGMsIGJvb2wgdHgpOworc3RhdGljIHZvaWQgd2xjX3VwZGF0ZV9taW1vX2JhbmRfYndjYXAoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGJ3Y2FwKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfc2dpX3J4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfbGRwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczggdmFsKTsKK3N0YXRpYyB2b2lkIHdsY193YXIxNjE2NShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCB0eCk7CiAKIHN0YXRpYyB2b2lkIHdsY19wcm9jZXNzX2V2ZW50cSh2b2lkICphcmcpOwotc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfYXR0YWNoX3N0Zl9hbnRfaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdGltZXJzX2RlaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfb2ZkbV9yYXRlc2V0X3dhcih3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGludCBfd2xjX2lvY3RsKHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19hdHRhY2hfc3RmX2FudF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB1aW50IHdsY19hdHRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY190aW1lcnNfZGVpbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBpbnQgX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQkgICAgICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLXZvaWQgd2xjX2dldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfZ2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGMtPnJlZ3M7CiAJdTMyIHYzMjsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID4gNCk7CiAKQEAgLTM0NCwxNCArMzI4LDE0IEBACiAjZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCiAKIC8qIGtlZXAgdGhlIGNoaXAgYXdha2UgaWYgbmVlZGVkICovCi1ib29sIHdsY19zdGF5X2F3YWtlKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKIC8qIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIFBNIGJpdCBzaG91bGQgYmUgc2V0IGluIG91dGdvaW5nIGZyYW1lcyBhbmQgU1RBWV9BV0FLRSBpcyBtZWFuaW5nZnVsCiAgKi8KLWJvb2wgd2xjX3BzX2FsbG93ZWQod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfYWxsb3dlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqY2ZnOwpAQCAtMzc4LDkgKzM2Miw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgd2xjX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX3Jlc2V0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVzZXRcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsYy0+Y2hlY2tfZm9yX3VuYWxpZ25lZF90YnR0ID0gZmFsc2U7CiAKQEAgLTM4OSwzNCArMzczLDE5IEBACiAJCXdsY19zdGF0c3VwZCh3bGMpOwogCiAJCS8qIHJlc2V0IG91ciBzbmFwc2hvdCBvZiBtYWNzdGF0IGNvdW50ZXJzICovCi0JCWJ6ZXJvKChjaGFyICopd2xjLT5jb3JlLT5tYWNzdGF0X3NuYXBzaG90LCBzaXplb2YobWFjc3RhdF90KSk7CisJCW1lbXNldCgoY2hhciAqKXdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdCwgMCwKKwkJCXNpemVvZihtYWNzdGF0X3QpKTsKIAl9CiAKIAl3bGNfYm1hY19yZXNldCh3bGMtPmh3KTsKIAl3bGNfYW1wZHVfcmVzZXQod2xjLT5hbXBkdSk7CiAJd2xjLT50eHJldHJpZWQgPSAwOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIE5lZWQgdG8gc2V0IGEgZmxhZyh0byBiZSBjbGVhcmVkIGFzeW5jaHJvbm91c2x5IGJ5IEJNQUMgZHJpdmVyIHdpdGggaGlnaCBjYWxsKQotCSAqICBpbiBvcmRlciB0byBwcmV2ZW50IHdsY19ycGN0eF90eHJlY2xhaW0oKSBmcm9tIHNjcmV3aW5nIHdsY19ycGN0eF9nZXRuZXh0dHhwKCksCi0JICogIHdoaWNoIGNvdWxkIGJlIGludm9rZWQgYnkgYWxyZWFkeSBRVUVVRUQgaGlnaCBjYWxsKHMpIGZyb20gQk1BQyBkcml2ZXIgYmVmb3JlCi0JICogIHdsY19ibWFjX3Jlc2V0KCkgZmluaXNoZXMuCi0JICogSXQncyBub3QgbmVlZGVkIGJlZm9yZSBpbiBtb25vbGl0aGljIGRyaXZlciBtb2RlbCBiZWNhdXNlIGQxMWNvcmUgaW50ZXJydXB0cyB3b3VsZAotCSAqICBoYXZlIGJlZW4gY2xlYXJlZCBpbnN0YW50bHkgaW4gd2xjX2JtYWNfcmVzZXQoKSBhbmQgbm8gdHhzdGF0dXMgaW50ZXJydXB0Ci0JICogIHdpbGwgY29tZSB0byBkcml2ZXIgdG8gZmV0Y2ggdGhvc2UgZmx1c2hlZCBkbWEgcGt0IHBvaW50ZXJzLgotCSAqLwotCXdsYy0+cmVzZXRfYm1hY19wZW5kaW5nID0gdHJ1ZTsKLQotCXdsY19ycGN0eF90eHJlY2xhaW0od2xjLT5ycGN0eCk7Ci0KLQl3bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKLQl3bGNfcGh5X2FudF9yeGRpdl9zZXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmFudF9yeF9vdnIpOwotI2VuZGlmCiB9CiAKLXZvaWQgd2xjX2ZhdGFsX2Vycm9yKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2ZhdGFsX2Vycm9yKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX0VSUk9SKCgid2wlZDogZmF0YWwgZXJyb3IsIHJlaW5pdGlhbGl6aW5nXG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX0VSUk9SKCJ3bCVkOiBmYXRhbCBlcnJvciwgcmVpbml0aWFsaXppbmdcbiIsIHdsYy0+cHViLT51bml0KTsKIAl3bF9pbml0KHdsYy0+d2wpOwogfQogCkBAIC00MjUsNyArMzk0LDcgQEAKICAqIGlmIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFyZSBpbiBjb25mbGljdCAoYmFuZGxvY2tlZCwgMTFuIG1vZGUgZGlzYWJsZWQsCiAgKiBpbnZhbGlkIGNoYW5uZWwgZm9yIGN1cnJlbnQgY291bnRyeSwgZXRjLikKICAqLwotc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYyA9CiAJICAgIDEgfCBXTF9DSEFOU1BFQ19CV18yMCB8IFdMX0NIQU5TUEVDX0NUTF9TQl9OT05FIHwKQEAgLTQ0MSw3ICs0MTAsNyBAQAogCiBzdHJ1Y3Qgc2NiIGdsb2JhbF9zY2I7CiAKLXN0YXRpYyB2b2lkIHdsY19pbml0X3NjYih3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBzY2IgKnNjYikKK3N0YXRpYyB2b2lkIHdsY19pbml0X3NjYihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNjYiAqc2NiKQogewogCWludCBpOwogCXNjYi0+ZmxhZ3MgPSBTQ0JfV01FQ0FQIHwgU0NCX0hUQ0FQOwpAQCAtNDQ5LDcgKzQxOCw3IEBACiAJCXNjYi0+c2VxbnVtW2ldID0gMDsKIH0KIAotdm9pZCB3bGNfaW5pdCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAljaGFuc3BlY190IGNoYW5zcGVjOwpAQCAtNDU3LDcgKzQyNiw3IEBACiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJYm9vbCBtdXRlID0gZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19pbml0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfaW5pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJcmVncyA9IHdsYy0+cmVnczsKIApAQCAtNTgzLDEzICs1NTIsMTMgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX21hY19iY25fcHJvbWlzY19jaGFuZ2Uod2xjX2luZm9fdCAqd2xjLCBib29sIHByb21pc2MpCit2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpCiB7CiAJd2xjLT5iY25taXNjX21vbml0b3IgPSBwcm9taXNjOwogCXdsY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKIH0KIAotdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX21hY19iY25fcHJvbWlzYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoKEFQX0VOQUIod2xjLT5wdWIpICYmIChOX0VOQUIod2xjLT5wdWIpIHx8IHdsYy0+YmFuZC0+Z21vZGUpKSB8fAogCSAgICB3bGMtPmJjbm1pc2NfaWJzcyB8fCB3bGMtPmJjbm1pc2Nfc2NhbiB8fCB3bGMtPmJjbm1pc2NfbW9uaXRvcikKQEAgLTU5OSw3ICs1NjgsNyBAQAogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzIE1DVExfUFJPTUlTQyBhbmQgTUNUTF9LRUVQQ09OVFJPTCAqLwotdm9pZCB3bGNfbWFjX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfbWFjX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHByb21pc2NfYml0cyA9IDA7CiAKQEAgLTYyMSw3ICs1OTAsNyBAQAogfQogCiAvKiBjaGVjayBpZiBocHMgYW5kIHdha2Ugc3RhdGVzIG9mIHN3IGFuZCBodyBhcmUgaW4gc3luYyAqLwotYm9vbCB3bGNfcHNfY2hlY2sod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJYm9vbCByZXMgPSB0cnVlOwogCWJvb2wgaHBzLCB3YWtlOwpAQCAtNjM2LDggKzYwNSw4IEBACiAJCSAqIHRvIGF2b2lkIGFzc2VydAogCQkgKi8KIAkJaWYgKHRtcCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LAotCQkJCSAgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQkJcmV0dXJuIERFVklDRVJFTU9WRUQod2xjKTsKIAkJfQogCkBAIC02NDYsNyArNjE1LDggQEAKIAkJaWYgKGhwcyAhPSAoKHRtcCAmIE1DVExfSFBTKSAhPSAwKSkgewogCQkJaW50IGlkeDsKIAkJCXdsY19ic3NjZmdfdCAqY2ZnOwotCQkJV0xfRVJST1IoKCJ3bCVkOiBocHMgbm90IHN5bmMsIHN3ICVkLCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBocHMsIHRtcCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGhwcyBub3Qgc3luYywgc3cgJWQsIG1hY2NvbnRyb2wgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGhwcywgdG1wKTsKIAkJCUZPUkVBQ0hfQlNTKHdsYywgaWR4LCBjZmcpIHsKIAkJCQlpZiAoIUJTU0NGR19TVEEoY2ZnKSkKIAkJCQkJY29udGludWU7CkBAIC02NTQsMjMgKzYyNCwxNCBAQAogCiAJCQlyZXMgPSBmYWxzZTsKIAkJfQotI2lmZGVmIFdMQ19MT1cKIAkJLyogRm9yIGEgbW9ub2xpdGhpYyBidWlsZCB0aGUgd2FrZSBjaGVjayBjYW4gYmUgZXhhY3Qgc2luY2UgaXQgbG9va3MgYXQgd2FrZQogCQkgKiBvdmVycmlkZSBiaXRzLiBUaGUgTUNUTF9XQUtFIGJpdCBzaG91bGQgbWF0Y2ggdGhlICd3YWtlJyB2YWx1ZS4KIAkJICovCiAJCXdha2UgPSBTVEFZX0FXQUtFKHdsYykgfHwgd2xjLT5ody0+d2FrZV9vdmVycmlkZTsKIAkJd2FrZV9vayA9ICh3YWtlID09ICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSk7Ci0jZWxzZQotCQkvKiBGb3IgYSBzcGxpdCBidWlsZCB3ZSB3aWxsIG5vdCBoYXZlIGFjY2VzcyB0byBhbnkgd2FrZSBvdmVycmlkZXMgZnJvbSB0aGUgbG93Ci0JCSAqIGxldmVsLiBUaGUgY2hlY2sgY2FuIG9ubHkgbWFrZSBzdXJlIHRoZSBNQ1RMX1dBS0UgYml0IGlzIG9uIGlmIHRoZSBoaWdoCi0JCSAqIGxldmVsICd3YWtlJyB2YWx1ZSBpcyB0cnVlLiBJZiB0aGUgaGlnaCBsZXZlbCAnd2FrZScgaXMgZmFsc2UsIHRoZSBNQ1RMX1dBS0UKLQkJICogbWF5IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlIGR1ZSB0byB0aGUgbG93IGxldmVsIG92ZXJyaWRlLgotCQkgKi8KLQkJd2FrZSA9IFNUQVlfQVdBS0Uod2xjKTsKLQkJd2FrZV9vayA9ICh3YWtlICYmICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSkgfHwgIXdha2U7Ci0jZW5kaWYKIAkJaWYgKGhwcyAmJiAhd2FrZV9vaykgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApOwogCQkJcmVzID0gZmFsc2U7CiAJCX0KIAl9CkBAIC02NzksNyArNjQwLDcgQEAKIH0KIAogLyogcHVzaCBzdyBocHMgYW5kIHdha2Ugc3RhdGUgdGhyb3VnaCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfc2V0X3BzX2N0cmwod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc2V0X3BzX2N0cmwoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHYxLCB2MjsKIAlib29sIGhwcywgd2FrZTsKQEAgLTY4OCw4ICs2NDksOCBAQAogCWhwcyA9IFBTX0FMTE9XRUQod2xjKTsKIAl3YWtlID0gaHBzID8gKFNUQVlfQVdBS0Uod2xjKSkgOiB0cnVlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0X3BzX2N0cmw6IGhwcyAlZCB3YWtlICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICBocHMsIHdha2UpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3NldF9wc19jdHJsOiBocHMgJWQgd2FrZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBocHMsIHdha2UpOwogCiAJdjEgPSBSX1JFRyh3bGMtPm9zaCwgJndsYy0+cmVncy0+bWFjY29udHJvbCk7CiAJdjIgPSAwOwpAQCAtNzE0LDcgKzY3NSw3IEBACiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJaW50IGVyciA9IDA7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCWlmIChjZmcgPT0gd2xjLT5jZmcpIHsKIAkJLyogZW50ZXIgdGhlIE1BQyBhZGRyIGludG8gdGhlIFJYRSBtYXRjaCByZWdpc3RlcnMgKi8KQEAgLTczMSw3ICs2OTIsNyBAQAogICovCiB2b2lkIHdsY19zZXRfYnNzaWQod2xjX2Jzc2NmZ190ICpjZmcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCS8qIGlmIHByaW1hcnkgY29uZmlnLCB3ZSBuZWVkIHRvIHVwZGF0ZSBCU1NJRCBpbiBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCiAJaWYgKGNmZyA9PSB3bGMtPmNmZykgewpAQCAtNzQ4LDcgKzcwOSw3IEBACiAgKiBTdXNwZW5kIHRoZSB0aGUgTUFDIGFuZCB1cGRhdGUgdGhlIHNsb3QgdGltaW5nCiAgKiBmb3Igc3RhbmRhcmQgMTFiL2cgKDIwdXMgc2xvdHMpIG9yIHNob3J0c2xvdCAxMWcgKDl1cyBzbG90cykuCiAgKi8KLXZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qod2xjX2luZm9fdCAqd2xjLCBib29sIHNob3J0c2xvdCkKK3ZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2hvcnRzbG90KQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpjZmc7CkBAIC03NzYsNyArNzM3LDcgQEAKIAl3bGNfYm1hY19zZXRfc2hvcnRzbG90KHdsYy0+aHcsIHNob3J0c2xvdCk7CiB9CiAKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IGxvY2FsOwogCXMxNiBsb2NhbF9tYXg7CkBAIC04MDMsNyArNzY0LDcgQEAKIH0KIAogLyogcHJvcGFnYXRlIGhvbWUgY2hhbnNwZWMgdG8gYWxsIGJzc2NmZ3MgaW4gY2FzZSBic3NjZmctPmN1cnJlbnRfYnNzLT5jaGFuc3BlYyBpcyByZWZlcmVuY2VkICovCi12b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCit2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAlpZiAod2xjLT5ob21lX2NoYW5zcGVjICE9IGNoYW5zcGVjKSB7CiAJCWludCBpZHg7CkBAIC04MjEsNyArNzgyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKK3N0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCS8qIFNhdmUgb3VyIGNvcHkgb2YgdGhlIGNoYW5zcGVjICovCiAJd2xjLT5jaGFuc3BlYyA9IGNoYW5zcGVjOwpAQCAtODQwLDE1ICs4MDEsMTUgQEAKIAogfQogCi12b2lkIHdsY19zZXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQordm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXVpbnQgYmFuZHVuaXQ7CiAJYm9vbCBzd2l0Y2hiYW5kID0gZmFsc2U7CiAJY2hhbnNwZWNfdCBvbGRfY2hhbnNwZWMgPSB3bGMtPmNoYW5zcGVjOwogCiAJaWYgKCF3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYykpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCUFTU0VSVCh3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSk7CiAJCXJldHVybjsKIAl9CkBAIC04NTksNyArODIwLDkgQEAKIAkJaWYgKHdsYy0+YmFuZC0+YmFuZHVuaXQgIT0gYmFuZHVuaXQgfHwgd2xjLT5iYW5kaW5pdF9wZW5kaW5nKSB7CiAJCQlzd2l0Y2hiYW5kID0gdHJ1ZTsKIAkJCWlmICh3bGMtPmJhbmRsb2NrZWQpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjaHNwZWMgJWQgYmFuZCBpcyBsb2NrZWQhXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2hzcGVjICVkIGJhbmQgaXMgbG9ja2VkIVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywKKwkJCQkJIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJLyogQk1BQ19OT1RFOiBzaG91bGQgdGhlIHNldGJhbmQgY2FsbCBjb21lIGFmdGVyIHRoZSB3bGNfYm1hY19jaGFuc3BlYygpID8KQEAgLTg5NSw3ICs4NTgsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnB3ciwgdWludCBsZW4pCitzdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqcHdyLCB1aW50IGxlbikKIHsKIAl0eHB3cl9saW1pdHNfdCB0eHB3cjsKIAl0eF9wb3dlcl90IHBvd2VyOwpAQCAtOTA5LDcgKzg3Miw3IEBACiAJZWxzZSBpZiAobGVuIDwgc2l6ZW9mKHR4X3Bvd2VyX3QpKQogCQlyZXR1cm4gQkNNRV9CVUZUT09TSE9SVDsKIAotCWJ6ZXJvKCZwb3dlciwgc2l6ZW9mKHR4X3Bvd2VyX3QpKTsKKwltZW1zZXQoJnBvd2VyLCAwLCBzaXplb2YodHhfcG93ZXJfdCkpOwogCiAJcG93ZXIuY2hhbnNwZWMgPSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQzsKIAlpZiAod2xjLT5wdWItPmFzc29jaWF0ZWQpCkBAIC0xMDMxLDcgKzk5NCw3IEBACiAJfSBlbHNlIHsKIAkJaW50IGJhbmRfaWR4ID0gQ0hTUEVDX0lTMkcocG93ZXIuY2hhbnNwZWMpID8gMCA6IDE7CiAKLQkJYnplcm8ob2xkX3Bvd2VyLCBzaXplb2YodHhfcG93ZXJfbGVnYWN5X3QpKTsKKwkJbWVtc2V0KG9sZF9wb3dlciwgMCwgc2l6ZW9mKHR4X3Bvd2VyX2xlZ2FjeV90KSk7CiAKIAkJb2xkX3Bvd2VyLT50eHB3cl9sb2NhbF9tYXggPSBwb3dlci5sb2NhbF9tYXg7CiAJCW9sZF9wb3dlci0+dHhwd3JfbG9jYWxfY29uc3RyYWludCA9IHBvd2VyLmxvY2FsX2NvbnN0cmFpbnQ7CkBAIC0xMDY0LDcgKzEwMjcsNyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwogCi1zdGF0aWMgdTMyIHdsY193YXRjaGRvZ19iYWNrdXBfYmkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHUzMiB3bGNfd2F0Y2hkb2dfYmFja3VwX2JpKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXUzMiBiaTsKIAliaSA9IDIgKiB3bGMtPmNmZy0+Y3VycmVudF9ic3MtPmR0aW1fcGVyaW9kICoKQEAgLTEwODMsNyArMTA0Niw3IEBACiAvKiBDaGFuZ2UgdG8gcnVuIHRoZSB3YXRjaGRvZyBlaXRoZXIgZnJvbSBhIHBlcmlvZGljIHRpbWVyIG9yIGZyb20gdGJ0dCBoYW5kbGVyLgogICogQ2FsbCB3YXRjaGRvZyBmcm9tIHRidHQgaGFuZGxlciBpZiB0YnR0IGlzIHRydWUsIHdhdGNoZG9nIHRpbWVyIG90aGVyd2lzZS4KICAqLwotdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KQordm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpCiB7CiAJLyogbWFrZSBzdXJlIGNoYW5naW5nIHdhdGNoZG9nIGRyaXZlciBpcyBhbGxvd2VkICovCiAJaWYgKCF3bGMtPnB1Yi0+dXAgfHwgIXdsYy0+cHViLT5hbGlnbl93ZF90YnR0KQpAQCAtMTExMiw3ICsxMDc1LDcgQEAKIAl9CiB9CiAKLXJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQorcmF0ZXNwZWNfdCB3bGNfbG93ZXN0X2Jhc2ljX3JzcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAlyYXRlc3BlY190IGxvd2VzdF9iYXNpY19yc3BlYzsKIAl1aW50IGk7CkBAIC0xMTQwLDcgKzExMDMsNyBAQAogICogIHJhdGVzcGVjICAgICBDQ0sJCWFudCA9IHdsYy0+c3RmLT50eGFudAogICogIAkJT0ZETQkJYW50ID0gMwogICovCi12b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCBiY25fcnNwZWMpCit2b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IGJjbl9yc3BlYykKIHsKIAl1MTYgcGh5Y3RsOwogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKQEAgLTExNTksOSArMTEyMiw5IEBACiAvKiBjZW50cmFsaXplZCBwcm90ZWN0aW9uIGNvbmZpZyBjaGFuZ2UgZnVuY3Rpb24gdG8gc2ltcGxpZnkgZGVidWdnaW5nLCBubyBjb25zaXN0ZW5jeSBjaGVja2luZwogICogdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb24gY2hhbmdlcyB0byBhdm9pZCBvdmVyaGVhZCBpbiBwZXJpb2RpYyBmdW5jdGlvbgogKi8KLXZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHdsY19pbmZvX3QgKndsYywgdWludCBpZHgsIGludCB2YWwpCit2b2lkIHdsY19wcm90ZWN0aW9uX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBpZHgsIGludCB2YWwpCiB7Ci0JV0xfVFJBQ0UoKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCkpOworCVdMX1RSQUNFKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCk7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgV0xDX1BST1RfR19TUEVDOgpAQCAtMTIwNSw3ICsxMTY4LDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeCh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAl3bGMtPmh0X2NhcC5jYXAgJj0gfihIVF9DQVBfU0hPUlRfR0lfMjAgfCBIVF9DQVBfU0hPUlRfR0lfNDApOwogCXdsYy0+aHRfY2FwLmNhcCB8PSAodmFsICYgV0xDX05fU0dJXzIwKSA/IEhUX0NBUF9TSE9SVF9HSV8yMCA6IDA7CkBAIC0xMjE3LDcgKzExODAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKQorc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpCiB7CiAJd2xjLT5zdGYtPmxkcGMgPSB2YWw7CiAKQEAgLTEyMzYsNyArMTE5OSw3IEBACiAgKiB1Y29kZSwgaHdtYWMgdXBkYXRlCiAgKiAgICBDaGFubmVsIGRlcGVuZGVudCB1cGRhdGVzIGZvciB1Y29kZSBhbmQgaHcKICAqLwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZW5hYmxlIG9yIGRpc2FibGUgYW55IGFjdGl2ZSBJQlNTcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QKIAkgKiB3ZSBhcmUgb24gdGhlIGhvbWUgY2hhbm5lbApAQCAtMTI2MywxMyArMTIyNiwxMyBAQAogCXdsY19tYWNfcHJvbWlzYyh3bGMpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZCh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCitzdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAl3bGNfcmF0ZXNldF90IGRlZmF1bHRfcmF0ZXNldDsKIAl1aW50IHBhcmtiYW5kOwogCXVpbnQgaSwgYmFuZF9vcmRlclsyXTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JhbmRpbml0X29yZGVyZWRcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19iYW5kaW5pdF9vcmRlcmVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJLyoKIAkgKiBXZSBtaWdodCBoYXZlIGJlZW4gYmFuZGxvY2tlZCBkdXJpbmcgZG93biBhbmQgdGhlIGNoaXAgcG93ZXItY3ljbGVkIChoaWJlcm5hdGUpLgogCSAqIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGJhbmQgdG8gcGFyayBvbgpAQCAtMTMxMCwxMCArMTI3MywxMCBAQAogfQogCiAvKiBiYW5kLXNwZWNpZmljIGluaXQgKi8KLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYnNpbml0KSAod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19ic2luaXQpIChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICB3bGMtPmJhbmQtPmJhbmR1bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHdsYy0+YmFuZC0+YmFuZHVuaXQpOwogCiAJLyogd3JpdGUgdWNvZGUgQUNLL0NUUyByYXRlIHRhYmxlICovCiAJd2xjX3NldF9yYXRldGFibGUod2xjKTsKQEAgLTEzMjgsNyArMTI5MSw3IEBACiB9CiAKIC8qIHN3aXRjaCB0byBhbmQgaW5pdGlhbGl6ZSBuZXcgYmFuZCAqLwotc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpCiB7CiAJaW50IGlkeDsKIAl3bGNfYnNzY2ZnX3QgKmNmZzsKQEAgLTEzNTMsNyArMTMxNiw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYSBXTUUgUGFyYW1ldGVyIEluZm8gRWxlbWVudCB3aXRoIGRlZmF1bHQgU1RBIHBhcmFtZXRlcnMgZnJvbSBXTU0gU3BlYywgVGFibGUgMTIgKi8KLXZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSkKK3ZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKQogewogCXN0YXRpYyBjb25zdCB3bWVfcGFyYW1faWVfdCBzdGFkZWYgPSB7CiAJCVdNRV9PVUksCkBAIC0xMzc4LDcgKzEzNDEsNyBAQAogCW1lbWNweShwZSwgJnN0YWRlZiwgc2l6ZW9mKCpwZSkpOwogfQogCi12b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLCBib29sIHN1c3BlbmQpCit2b2lkIHdsY193bWVfc2V0cGFyYW1zKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgYWNpLCB2b2lkICphcmcsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaTsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTM4OSw3ICsxMzUyLDcgQEAKIAogCS8qIE9ubHkgYXBwbHkgcGFyYW1zIGlmIHRoZSBjb3JlIGlzIG91dCBvZiByZXNldCBhbmQgaGFzIGNsb2NrcyAqLwogCWlmICghd2xjLT5jbGspIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlcyA6IG5vLWNsb2NrXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzIDogbm8tY2xvY2tcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0MDIsNyArMTM2NSw3IEBACiAJd2xjLT53bWVfYWRtY3RsID0gMDsKIAogCWRvIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKIAkJLyogc2V0IHRoZSBhZG1pc3Npb24gY29udHJvbCBwb2xpY3kgZm9yIHRoaXMgQUMgKi8KQEAgLTE0MjEsOCArMTM4NCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTQ1OSw3ICsxNDIyLDcgQEAKIAogdm9pZCB3bGNfZWRjZl9zZXRwYXJhbXMod2xjX2Jzc2NmZ190ICpjZmcsIGJvb2wgc3VzcGVuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBjZmctPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGNmZy0+d2xjOwogCXVpbnQgYWNpLCBpLCBqOwogCWVkY2ZfYWNwYXJhbV90ICplZGNmX2FjcDsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTQ4Myw3ICsxNDQ2LDcgQEAKIAl3bGMtPndtZV9hZG1jdGwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFDX0NPVU5UOyBpKyssIGVkY2ZfYWNwKyspIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJYWNpID0gKGVkY2ZfYWNwLT5BQ0kgJiBFRENGX0FDSV9NQVNLKSA+PiBFRENGX0FDSV9TSElGVDsKIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKQEAgLTE1MDUsOCArMTQ2OCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTU0OCwyMCArMTUxMSwxOSBAQAogCiB9CiAKLWJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpCitib29sIHdsY190aW1lcnNfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJd2xjLT53ZHRpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfd2F0Y2hkb2dfYnlfdGltZXIsCiAJCXdsYywgIndhdGNoZG9nIik7CiAJaWYgKCF3bGMtPndkdGltZXIpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAgd2xfaW5pdF90aW1lciBmb3Igd2R0aW1lciBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICB3bF9pbml0X3RpbWVyIGZvciB3ZHRpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAl3bGMtPnJhZGlvX3RpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfcmFkaW9fdGltZXIsCiAJCXdsYywgInJhZGlvIik7CiAJaWYgKCF3bGMtPnJhZGlvX3RpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwKLQkJCSAgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE1NzUsNyArMTUzNyw3IEBACiAgKiBJbml0aWFsaXplIHdsY19pbmZvIGRlZmF1bHQgdmFsdWVzIC4uLgogICogbWF5IGdldCBvdmVycmlkZXMgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbgogICovCi12b2lkIHdsY19pbmZvX2luaXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdW5pdCkKK3ZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJaW50IGk7CiAJLyogQXNzdW1lIHRoZSBkZXZpY2UgaXMgdGhlcmUgdW50aWwgcHJvdmVuIG90aGVyd2lzZSAqLwpAQCAtMTY4Niw3ICsxNjQ4LDcgQEAKIAl3bGMtPnByODA4Mzhfd2FyID0gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3N0YXRlX2JtYWNfc3luYyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgYm9vbCB3bGNfc3RhdGVfYm1hY19zeW5jKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY19ibWFjX3N0YXRlX3Qgc3RhdGVfYm1hYzsKIApAQCAtMTcwMCw3ICsxNjYyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCBlcnIgPSAwOwogCXVpbnQgdW5pdDsKQEAgLTE3MDgsMTUgKzE2NzAsMTQgQEAKIAogCXdsYy0+YXNpID0gd2xjX2FudHNlbF9hdHRhY2god2xjLCB3bGMtPm9zaCwgd2xjLT5wdWIsIHdsYy0+aHcpOwogCWlmICh3bGMtPmFzaSA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX2FudHNlbF9hdHRhY2ggZmFpbGVkXG4iLAotCQkJICB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW50c2VsX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA0NDsKIAkJZ290byBmYWlsOwogCX0KIAogCXdsYy0+YW1wZHUgPSB3bGNfYW1wZHVfYXR0YWNoKHdsYyk7CiAJaWYgKHdsYy0+YW1wZHUgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19hbXBkdV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW1wZHVfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDUwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTcyNSwxMyArMTY4NiwxMyBAQAogCXdsYy0+ZXZlbnRxID0KIAkgICAgd2xjX2V2ZW50cV9hdHRhY2god2xjLT5wdWIsIHdsYywgd2xjLT53bCwgd2xjX3Byb2Nlc3NfZXZlbnRxKTsKIAlpZiAod2xjLT5ldmVudHEgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19ldmVudHFfYXR0YWNoZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfZXZlbnRxX2F0dGFjaGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDU3OwogCQlnb3RvIGZhaWw7CiAJfQogCiAJaWYgKCh3bGNfc3RmX2F0dGFjaCh3bGMpICE9IDApKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX3N0Zl9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfc3RmX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA2ODsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE3MzksOSArMTcwMCw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotd2xjX3B1Yl90ICp3bGNfcHViKHZvaWQgKndsYykKK3N0cnVjdCB3bGNfcHViICp3bGNfcHViKHZvaWQgKndsYykKIHsKLQlyZXR1cm4gKCh3bGNfaW5mb190ICopIHdsYyktPnB1YjsKKwlyZXR1cm4gKChzdHJ1Y3Qgd2xjX2luZm8gKikgd2xjKS0+cHViOwogfQogCiAjZGVmaW5lIENISVBfU1VQUE9SVFNfMTFOKHdsYykgCTEKQEAgLTE3NTAsMjUgKzE3MTEsMjUgQEAKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwogdm9pZCAqd2xjX2F0dGFjaCh2b2lkICp3bCwgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LCBib29sIHBpb21vZGUsCi0JCSBvc2xfdCAqb3NoLCB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSwKLQkJIHVpbnQgKnBlcnIpCisJCSBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCisJCSB2b2lkICpidHBhcmFtLCB1aW50ICpwZXJyKQogewotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAl1aW50IGVyciA9IDA7CiAJdWludCBqOwotCXdsY19wdWJfdCAqcHViOworCXN0cnVjdCB3bGNfcHViICpwdWI7CiAJd2xjX3R4cV9pbmZvX3QgKnFpOwogCXVpbnQgbl9kaXNhYmxlZDsKIAotCVdMX05PTkUoKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsCi0JCSBkZXZpY2UpKTsKKwlXTF9OT05FKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJCXVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsIGRldmljZSk7CiAKIAlBU1NFUlQoV1NFQ19NQVhfUkNNVEFfS0VZUyA8PSBXU0VDX01BWF9LRVlTKTsKIAlBU1NFUlQoV1NFQ19NQVhfREVGQVVMVF9LRVlTID09IFdMQ19ERUZBVUxUX0tFWVMpOwogCiAJLyogc29tZSBjb2RlIGRlcGVuZHMgb24gcGFja2VkIHN0cnVjdHVyZXMgKi8KLQlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhFUl9BRERSX0xFTik7Ci0JQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhFUl9IRFJfTEVOKTsKKwlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhfQUxFTik7CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhfSExFTik7CiAJQVNTRVJUKHNpemVvZihkMTFyZWdzX3QpID09IFNJX0NPUkVfU0laRSk7CiAJQVNTRVJUKHNpemVvZihvZmRtX3BoeV9oZHJfdCkgPT0gRDExX1BIWV9IRFJfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGNja19waHlfaGRyX3QpID09IEQxMV9QSFlfSERSX0xFTik7CkBAIC0xNzgwLDggKzE3NDEsMTAgQEAKIAlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBkb3QxMV9iY25fcHJiKSA9PSBET1QxMV9CQ05fUFJCX0xFTik7CiAJQVNTRVJUKHNpemVvZih0eF9zdGF0dXNfdCkgPT0gVFhTVEFUVVNfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGh0X2NhcF9pZV90KSA9PSBIVF9DQVBfSUVfTEVOKTsKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIAlBU1NFUlQob2Zmc2V0b2Yod2xfc2Nhbl9wYXJhbXNfdCwgY2hhbm5lbF9saXN0KSA9PQogCSAgICAgICBXTF9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFKTsKKyNlbmRpZgogCUFTU0VSVChJU19BTElHTkVEKG9mZnNldG9mKHdzZWNfa2V5X3QsIGRhdGEpLCBzaXplb2YodTMyKSkpOwogCUFTU0VSVChJU1BPV0VST0YyKE1BX1dJTkRPV19TWikpOwogCkBAIC0xNzk3LDggKzE3NjAsOCBAQAogCSAgICAgICB8fCAoV1BBX0NBUF80X1JFUExBWV9DTlRSUyA9PSBXTENfUkVQTEFZX0NOVFJTX1ZBTFVFCiAJCSAgICYmIDQgPT0gV0xDX05VTVJYSVZTKSk7CiAKLQkvKiBhbGxvY2F0ZSB3bGNfaW5mb190IHN0YXRlIGFuZCBpdHMgc3Vic3RydWN0dXJlcyAqLwotCXdsYyA9ICh3bGNfaW5mb190ICopIHdsY19hdHRhY2hfbWFsbG9jKG9zaCwgdW5pdCwgJmVyciwgZGV2aWNlKTsKKwkvKiBhbGxvY2F0ZSBzdHJ1Y3Qgd2xjX2luZm8gc3RhdGUgYW5kIGl0cyBzdWJzdHJ1Y3R1cmVzICovCisJd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSB3bGNfYXR0YWNoX21hbGxvYyhvc2gsIHVuaXQsICZlcnIsIGRldmljZSk7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJd2xjLT5vc2ggPSBvc2g7CkBAIC0xODE5LDcgKzE3ODIsNyBAQAogCS8qIEJ5IGRlZmF1bHQgcmVzdHJpY3QgVEtJUCBhc3NvY2lhdGlvbnMgZnJvbSAxMW4gU1RBJ3MgKi8KIAl3bGMtPmh0X3dzZWNfcmVzdHJpY3Rpb24gPSBXTENfSFRfVEtJUF9SRVNUUklDVDsKIAotCS8qIHBvcHVsYXRlIHdsY19pbmZvX3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KKwkvKiBwb3B1bGF0ZSBzdHJ1Y3Qgd2xjX2luZm8gd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KIAl3bGNfaW5mb19pbml0KHdsYywgdW5pdCk7CiAKIAkvKiB1cGRhdGUgc3RhL2FwIHJlbGF0ZWQgcGFyYW1ldGVycyAqLwpAQCAtMTg1MSwxMCArMTgxNCw2IEBACiAJLyogcHJvcGFnYXRlICp2YXJzKiBmcm9tIEJNQUMgZHJpdmVyIHRvIGhpZ2ggZHJpdmVyICovCiAJd2xjX2JtYWNfY29weWZyb21fdmFycyh3bGMtPmh3LCAmcHViLT52YXJzLCAmd2xjLT52YXJzX3NpemUpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1RSQUNFKCgibnZyYW0gOiB2YXJzICVwICwgdmFyc19zaXplICVkXG4iLCBwdWItPnZhcnMsCi0JCSAgd2xjLT52YXJzX3NpemUpKTsKLSNlbmRpZgogCiAJLyogc2V0IG1heGltdW0gYWxsb3dlZCBkdXR5IGN5Y2xlICovCiAJd2xjLT50eF9kdXR5X2N5Y2xlX29mZG0gPQpAQCAtMTg3MiwxOSArMTgzMSwxNyBAQAogCXdsY19waHlfc3RmX2NoYWluX2luaXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmh3X3R4Y2hhaW4sCiAJCQkgICAgICAgd2xjLT5zdGYtPmh3X3J4Y2hhaW4pOwogCi0jaWZkZWYgV0xDX0xPVwogCS8qIHB1bGwgdXAgc29tZSBpbmZvIHJlc3VsdGluZyBmcm9tIHRoZSBsb3cgYXR0YWNoICovCiAJewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCiAJCQl3bGMtPmNvcmUtPnR4YXZhaWxbaV0gPSB3bGMtPmh3LT50eGF2YWlsW2ldOwogCX0KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAl3bGNfYm1hY19od19ldGhlcmFkZHIod2xjLT5odywgJndsYy0+cGVybV9ldGhlcmFkZHIpOwogCiAJYmNvcHkoKGNoYXIgKikmd2xjLT5wZXJtX2V0aGVyYWRkciwgKGNoYXIgKikmcHViLT5jdXJfZXRoZXJhZGRyLAotCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkgICAgICBFVEhfQUxFTik7CiAKIAlmb3IgKGogPSAwOyBqIDwgTkJBTkRTKHdsYyk7IGorKykgewogCQkvKiBVc2UgYmFuZCAxIGZvciBzaW5nbGUgYmFuZCAxMWEgKi8KQEAgLTE5NDIsNyArMTg5OSw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWlmICghd2xjX3RpbWVyc19pbml0KHdsYywgdW5pdCkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogd2xjX2luaXRfdGltZXIgZmFpbGVkXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IHdsY19pbml0X3RpbWVyIGZhaWxlZFxuIiwgdW5pdCwgX19mdW5jX18pOwogCQllcnIgPSAzMjsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE5NTAsOCArMTkwNyw4IEBACiAJLyogZGVwZW5kIG9uIHJhdGVzZXQsIGdtb2RlICovCiAJd2xjLT5jbWkgPSB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsYyk7CiAJaWYgKCF3bGMtPmNtaSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IDMzOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTk2Niw4ICsxOTIzLDggQEAKIAkvKiBhbGxvY2F0ZSBvdXIgaW5pdGlhbCBxdWV1ZSAqLwogCXFpID0gd2xjX3R4cV9hbGxvYyh3bGMsIG9zaCk7CiAJaWYgKHFpID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHRvIG1hbGxvYyB0eCBxdWV1ZVxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgdG8gbWFsbG9jIHR4IHF1ZXVlXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fKTsKIAkJZXJyID0gMTAwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjAzNyw3ICsxOTk0LDcgQEAKIAl3bGNfcmFkaW9fbXBjX3VwZCh3bGMpOwogCiAJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSkgewotCQlpZiAoKENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSkgPT0gQkNNNDMyMzVfQ0hJUF9JRCkgeworCQlpZiAoKHdsYy0+cHViLT5zaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQpIHsKIAkJCWlmICgoZ2V0aW50dmFyKHdsYy0+cHViLT52YXJzLCAiYWEyZyIpID09IDcpIHx8CiAJCQkgICAgKGdldGludHZhcih3bGMtPnB1Yi0+dmFycywgImFhNWciKSA9PSA3KSkgewogCQkJCXdsY19ibWFjX2FudHNlbF9zZXQod2xjLT5odywgMSk7CkBAIC0yMDUzLDcgKzIwMTAsNyBAQAogCXJldHVybiAodm9pZCAqKXdsYzsKIAogIGZhaWw6Ci0JV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHdpdGggZXJyICVkXG4iLCB1bml0LCBfX2Z1bmNfXywgZXJyKSk7CisJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIF9fZnVuY19fLCBlcnIpOwogCWlmICh3bGMpCiAJCXdsY19kZXRhY2god2xjKTsKIApAQCAtMjA2Miw3ICsyMDE5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCB1bml0OwogCXVuaXQgPSB3bGMtPnB1Yi0+dW5pdDsKQEAgLTIwNzEsNyArMjAyOCw4IEBACiAJCS8qIGRlZmF1bHQgYW50ZW5uYSBnYWluIGZvciBzcm9tIHJldiAxIGlzIDIgZEJtICg4IHFkYm0pICovCiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIGlmICh3bGMtPmJhbmQtPmFudGdhaW4gPT0gLTEpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBhbnRlbm5hcyBhdmFpbGFibGUgaW4gc3JvbSwgdXNpbmcgMmRCXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20sIHVzaW5nIDJkQlxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIHsKIAkJczggZ2FpbiwgZnJhY3Q7CkBAIC0yMDkzLDcgKzIwNTEsNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGFhOwogCXVpbnQgdW5pdDsKQEAgLTIxMTAsNyArMjA2OCw4IEBACiAJCWFhID0gKHM4KSBnZXRpbnR2YXIodmFycywKIAkJCQkgICAgICAoQkFORF81RyhiYW5kdHlwZSkgPyAiYWExIiA6ICJhYTAiKSk7CiAJaWYgKChhYSA8IDEpIHx8IChhYSA+IDE1KSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIGFudGVubmFzIGF2YWlsYWJsZSBpbiBzcm9tICgweCV4KSwgdXNpbmcgMy5cbiIsIHVuaXQsIF9fZnVuY19fLCBhYSkpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20gKDB4JXgpLCB1c2luZyAzXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fLCBhYSk7CiAJCWFhID0gMzsKIAl9CiAKQEAgLTIxMzIsMTM2ICsyMDkxLDggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLS8qIEhJR0hfT05MWSBibWFjX2F0dGFjaCwgd2hpY2ggc3luYyBvdmVyIExPV19PTkxZIGJtYWNfYXR0YWNoIHN0YXRlcyAqLwotaW50IHdsY19ibWFjX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkJICAgIGJvb2wgcGlvbW9kZSwgb3NsX3QgKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCi0JCSAgICB2b2lkICpidHBhcmFtKQotewotCXdsY19ibWFjX3JldmluZm9fdCByZXZpbmZvOwotCXVpbnQgaWR4ID0gMDsKLQlycGNfaW5mb190ICpycGMgPSAocnBjX2luZm9fdCAqKSBidHBhcmFtOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gUlBDX0JVUyk7Ci0KLQkvKiBpbnN0YWxsIHRoZSBycGMgaGFuZGxlIGluIHRoZSB2YXJpb3VzIHN0YXRlIHN0cnVjdHVyZXMgdXNlZCBieSBzdHViIFJQQyBmdW5jdGlvbnMgKi8KLQl3bGMtPnJwYyA9IHJwYzsKLQl3bGMtPmh3LT5ycGMgPSBycGM7Ci0Jd2xjLT5ody0+b3NoID0gb3NoOwotCi0Jd2xjLT5yZWdzID0gMDsKLQotCXdsYy0+cnBjdHggPSB3bGNfcnBjdHhfYXR0YWNoKHdsYy0+cHViLCB3bGMpOwotCWlmICh3bGMtPnJwY3R4ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qCi0JICogRklGTyAwCi0JICogVFg6IFRYX0FDX0JLX0ZJRk8gKFRYIEFDIEJhY2tncm91bmQgZGF0YSBwYWNrZXRzKQotCSAqLwotCS8qIEFsd2F5cyBpbml0aWFsaXplZCAqLwotCUFTU0VSVChOUlBDVFhCVUZQT1NUIDw9IE5UWEQpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9EQVRBX0ZJRk8sIE5SUENUWEJVRlBPU1QpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9DVExfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0Jd2xjX3JwY3R4X2ZpZm9pbml0KHdsYy0+cnBjdHgsIFRYX0JDTUNfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0KLQkvKiBWSSBhbmQgQksgaW5pdGVkIG9ubHkgaWYgV01FICovCi0JaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewotCQl3bGNfcnBjdHhfZmlmb2luaXQod2xjLT5ycGN0eCwgVFhfQUNfQktfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0JCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9BQ19WSV9GSUZPLCBOUlBDVFhCVUZQT1NUKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBTQiBoYW5kbGUgKi8KLQl3bGMtPnB1Yi0+c2loID0gb3NsX21hbGxvYyh3bGMtPm9zaCwgc2l6ZW9mKHNpX3QpKTsKLQlpZiAoIXdsYy0+cHViLT5zaWgpCi0JCXJldHVybiAtMTsKLQliemVybyh3bGMtPnB1Yi0+c2loLCBzaXplb2Yoc2lfdCkpOwotCi0JLyogc3luYyB1cCByZXZpbmZvIHdpdGggQk1BQyAqLwotCWJ6ZXJvKCZyZXZpbmZvLCBzaXplb2Yod2xjX2JtYWNfcmV2aW5mb190KSk7Ci0JaWYgKHdsY19ibWFjX3JldmluZm9fZ2V0KHdsYy0+aHcsICZyZXZpbmZvKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0Jd2xjLT52ZW5kb3JpZCA9ICh1MTYpIHJldmluZm8udmVuZG9yaWQ7Ci0Jd2xjLT5kZXZpY2VpZCA9ICh1MTYpIHJldmluZm8uZGV2aWNlaWQ7Ci0KLQl3bGMtPnB1Yi0+Ym9hcmRyZXYgPSAodTE2KSByZXZpbmZvLmJvYXJkcmV2OwotCXdsYy0+cHViLT5jb3JlcmV2ID0gcmV2aW5mby5jb3JlcmV2OwotCXdsYy0+cHViLT5zcm9tcmV2ID0gKHU4KSByZXZpbmZvLnNyb21yZXY7Ci0Jd2xjLT5wdWItPnNpaC0+Y2hpcHJldiA9IHJldmluZm8uY2hpcHJldjsKLQl3bGMtPnB1Yi0+c2loLT5jaGlwID0gcmV2aW5mby5jaGlwOwotCXdsYy0+cHViLT5zaWgtPmNoaXBwa2cgPSByZXZpbmZvLmNoaXBwa2c7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR0eXBlID0gcmV2aW5mby5ib2FyZHR5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR2ZW5kb3IgPSByZXZpbmZvLmJvYXJkdmVuZG9yOwotCXdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPSByZXZpbmZvLmJ1c3R5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+YnVzY29yZXR5cGUgPSByZXZpbmZvLmJ1c2NvcmV0eXBlOwotCXdsYy0+cHViLT5zaWgtPmJ1c2NvcmVyZXYgPSByZXZpbmZvLmJ1c2NvcmVyZXY7Ci0Jd2xjLT5wdWItPnNpaC0+aXNzaW0gPSAoYm9vbCkgcmV2aW5mby5pc3NpbTsKLQl3bGMtPnB1Yi0+c2loLT5ycGMgPSBycGM7Ci0KLQlpZiAocmV2aW5mby5uYmFuZHMgPT0gMCB8fCByZXZpbmZvLm5iYW5kcyA+IDIpCi0JCXJldHVybiAtMTsKLQl3bGMtPnB1Yi0+X25iYW5kcyA9IHJldmluZm8ubmJhbmRzOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCB3bGMtPnB1Yi0+X25iYW5kczsgaWR4KyspIHsKLQkJdWludCBiYW5kdW5pdCwgYmFuZHR5cGU7CS8qIFRvIGFjY2VzcyBiYW5kc3RhdGUgKi8KLQkJd2xjX3BoeV90ICpwaSA9IG9zbF9tYWxsb2Mod2xjLT5vc2gsIHNpemVvZih3bGNfcGh5X3QpKTsKLQotCQlpZiAoIXBpKQotCQkJcmV0dXJuIC0xOwotCQliemVybyhwaSwgc2l6ZW9mKHdsY19waHlfdCkpOwotCQlwaS0+cnBjID0gcnBjOwotCi0JCWJhbmR1bml0ID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHVuaXQ7Ci0JCWJhbmR0eXBlID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cmFkaW9yZXYgPQotCQkgICAgKHU4KSByZXZpbmZvLmJhbmRbaWR4XS5yYWRpb3JldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5waHl0eXBlID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGh5cmV2ID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXJldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5yYWRpb2lkID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnJhZGlvaWQ7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+YWJncGh5X2VuY29yZSA9Ci0JCSAgICByZXZpbmZvLmJhbmRbaWR4XS5hYmdwaHlfZW5jb3JlOwotCi0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGkgPSBwaTsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5iYW5kdW5pdCA9IGJhbmR1bml0OwotCQl3bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF0tPmJhbmR0eXBlID0gYmFuZHR5cGU7Ci0JfQotCi0JLyogbWlzYyBzdHVmZiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZyZWUgdGhlIGNvbnZlbmllbmNlIGhhbmRsZXMgKi8KLWludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQotewotCXVpbnQgaWR4OwotCi0JaWYgKHdsYy0+cHViLT5zaWgpIHsKLQkJb3NsX21mcmVlKHdsYy0+b3NoLCAodm9pZCAqKXdsYy0+cHViLT5zaWgsIHNpemVvZihzaV90KSk7Ci0JCXdsYy0+cHViLT5zaWggPSBOVUxMOwotCX0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYQkFORFM7IGlkeCsrKQotCQlpZiAod2xjLT5iYW5kc3RhdGVbaWR4XS0+cGkpIHsKLQkJCWtmcmVlKHdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpKTsKLQkJCXdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpID0gTlVMTDsKLQkJfQotCi0JaWYgKHdsYy0+cnBjdHgpIHsKLQkJd2xjX3JwY3R4X2RldGFjaCh3bGMtPnJwY3R4KTsKLQkJd2xjLT5ycGN0eCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KLQotc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZnJlZSB0aW1lciBzdGF0ZSAqLwogCWlmICh3bGMtPndkdGltZXIpIHsKQEAgLTIyNzQsNyArMjEwNSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZSh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5hc2kpIHsKIAkJd2xjX2FudHNlbF9kZXRhY2god2xjLT5hc2kpOwpAQCAtMjI5Nyw3ICsyMTI4LDcgQEAKICAqICAgIE9uZSBleGNlcHRpb24gaXMgc2IgcmVnaXN0ZXIgYWNjZXNzLCB3aGljaCBpcyBwb3NzaWJsZSBpZiBjcnlzdGFsIGlzIHR1cm5lZCBvbgogICogQWZ0ZXIgImRvd24iIHN0YXRlLCBkcml2ZXIgc2hvdWxkIGF2b2lkIHNvZnR3YXJlIHRpbWVyIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiByYWRpb19tb25pdG9yLgogICovCi11aW50IHdsY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQordWludCB3bGNfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXVpbnQgaTsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yMzA1LDcgKzIxMzYsNyBAQAogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTIzMjgsMTUgKzIxNTksNiBAQAogCiAJLyogZnJlZSBvdGhlciBzdGF0ZSAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIEhpZ2gtT25seSBkcml2ZXIgaGFzIGFuIGFsbG9jYXRlZCBjb3B5IG9mIHZhcnMsIG1vbm9saXRoaWMganVzdAotCSAqIHJlZmVyZW5jZXMgdGhlIHdsYy0+aHctPnZhcnMgd2hpY2ggaXMgZnJlZWQgaW4gd2xjX2JtYWNfZGV0YWNoKCkKLQkgKi8KLQlpZiAod2xjLT5wdWItPnZhcnMpIHsKLQkJa2ZyZWUod2xjLT5wdWItPnZhcnMpOwotCQl3bGMtPnB1Yi0+dmFycyA9IE5VTEw7Ci0JfQotI2VuZGlmCiAKICNpZmRlZiBCQ01EQkcKIAlpZiAod2xjLT5jb3VudHJ5X2llX292ZXJyaWRlKSB7CkBAIC0yMzYwLDEzICsyMTgyLDYgQEAKIAkvKiBEZXRhY2ggZnJvbSBpb3ZhciBtYW5hZ2VyICovCiAJd2xjX21vZHVsZV91bnJlZ2lzdGVyKHdsYy0+cHViLCAid2xjX2lvdmFycyIsIHdsYyk7CiAKLQkvKgotCSAgIGlmICh3bGMtPmFwKSB7Ci0JICAgd2xjX2FwX2RldGFjaCh3bGMtPmFwKTsKLQkgICB3bGMtPmFwID0gTlVMTDsKLQkgICB9Ci0JICovCi0KIAl3aGlsZSAod2xjLT50eF9xdWV1ZXMgIT0gTlVMTCkgewogCQl3bGNfdHhxX2ZyZWUod2xjLCB3bGMtPm9zaCwgd2xjLT50eF9xdWV1ZXMpOwogCX0KQEAgLTIzODMsNyArMjE5OCw3IEBACiB9CiAKIC8qIHVwZGF0ZSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgImFwIiAqLwotdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2FwX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXdsYy0+UExDUEhkcl9vdmVycmlkZSA9IFdMQ19QTENQX0FVVE87CS8qIEFQOiBzaG9ydCBub3QgYWxsb3dlZCwgYnV0IG5vdCBlbmZvcmNlZCAqLwpAQCAtMjM5OCw3ICsyMjEzLDcgQEAKIH0KIAogLyogcmVhZCBod2Rpc2FibGUgc3RhdGUgYW5kIHByb3BhZ2F0ZSB0byB3bGMgZmxhZyAqLwotc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8gfHwgd2xjLT5wdWItPmh3X29mZikKIAkJcmV0dXJuOwpAQCAtMjQxMSwxNyArMjIyNiwxNyBAQAogfQogCiAvKiByZXR1cm4gdHJ1ZSBpZiBNaW5pbXVtIFBvd2VyIENvbnN1bXB0aW9uIHNob3VsZCBiZSBlbnRlcmVkLCBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgd2xjX2lzX25vbl9kZWxheV9tcGMod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXJldHVybiAod2xjLT5tcGNfZGVsYXlfb2ZmID09IDApICYmICh3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGMpKTsKIH0KIAotdm9pZCB3bGNfcmFkaW9fbXBjX3VwZCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWJvb2wgbXBjX3JhZGlvLCByYWRpb19zdGF0ZTsKIApAQCAtMjQ3Nyw3ICsyMjkyLDcgQEAKICAqIGNlbnRyYWxpemVkIHJhZGlvIGRpc2FibGUvZW5hYmxlIGZ1bmN0aW9uLAogICogaW52b2tlIHJhZGlvIGVuYWJsZS9kaXNhYmxlIGFmdGVyIHVwZGF0aW5nIGh3cmFkaW8gc3RhdHVzCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19yYWRpb191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQl3bGNfcmFkaW9fZGlzYWJsZSh3bGMpOwpAQCAtMjQ4Niw3ICsyMzAxLDcgQEAKIH0KIAogLyogbWFpbnRhaW4gTEVEIGJlaGF2aW9yIGluIGRvd24gc3RhdGUgKi8KLXN0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTI0OTksNyArMjMxNCw3IEBACiAJfQogfQogCi12b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKCF3bGMtPnB1Yi0+dXApIHsKIAkJd2xjX2Rvd25fbGVkX3VwZCh3bGMpOwpAQCAtMjUxMCw3ICsyMzI1LDcgQEAKIAl3bF9kb3duKHdsYy0+d2wpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19yYWRpb19lbmFibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT51cCkKIAkJcmV0dXJuOwpAQCAtMjUyNiwxMCArMjM0MSwxMCBAQAogLyogcGVyaW9kaWNhbCBxdWVyeSBodyByYWRpbyBidXR0b24gd2hpbGUgZHJpdmVyIGlzICJkb3duIiAqLwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNTQ0LDcgKzIzNTksNyBAQAogCXdsY19yYWRpb191cGQod2xjKTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIGlmIEhXUkFESU8gZmVhdHVyZSBpcyBkaXNhYmxlZCAqLwogCWlmICh3bGMtPnJhZGlvX21vbml0b3IgfHwgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8pKQpAQCAtMjU1Niw3ICsyMzcxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdG9wKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RvcChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+cmFkaW9fbW9uaXRvcikKIAkJcmV0dXJuIHRydWU7CkBAIC0yNTcwLDcgKzIzODUsNyBAQAogfQogCiAvKiBicmluZyB0aGUgZHJpdmVyIGRvd24sIGJ1dCBkb24ndCByZXNldCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfb3V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX291dChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGNfYm1hY19zZXRfbm9yZXNldCh3bGMtPmh3LCB0cnVlKTsKIAl3bGNfcmFkaW9fdXBkKHdsYyk7CkBAIC0yNTkxLDcgKzI0MDYsNyBAQAogICogaWYgdGhlcmUgaXMgbm8gcGFja2V0IHBlbmRpbmcgZm9yIHRoZSBGSUZPLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHByZWMgYml0cyBzaG91bGQgYmUgc2V0CiAgKiBpbiBwcmVjX21hcC4gT2YgY291cnNlLCBpZ25vcmUgdGhpcyBydWxlIHdoZW4gYmxvY2tfZGF0YWZpZm8gaXMgc2V0CiAgKi8KLXN0YXRpYyBib29sIHdsY190eF9wcmVjX21hcF92ZXJpZnkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3R4X3ByZWNfbWFwX3ZlcmlmeShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBGb3Igbm9uLVdNRSwgYm90aCBmaWZvcyBoYXZlIG92ZXJsYXBwaW5nIHByZWNfbWFwLiBTbyBpdCdzIGFuIGVycm9yIG9ubHkgaWYgYm90aAogCSAqIGZhaWwgdGhlIGNoZWNrLgpAQCAtMjYxMyw3ICsyNDI4LDcgQEAKIAogc3RhdGljIHZvaWQgd2xjX3dhdGNoZG9nX2J5X3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfd2F0Y2hkb2coYXJnKTsKIAlpZiAoV0xDX1dBVENIRE9HX1RCVFQod2xjKSkgewogCQkvKiBzZXQgdG8gbm9ybWFsIG9zbCB3YXRjaGRvZyBwZXJpb2QgKi8KQEAgLTI2MjYsMTcgKzI0NDEsMTcgQEAKIC8qIGNvbW1vbiB3YXRjaGRvZyBjb2RlICovCiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKQogewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgYXJnOwogCWludCBpOwogCXdsY19ic3NjZmdfdCAqY2ZnOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfd2F0Y2hkb2dcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY193YXRjaGRvZ1xuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJaWYgKCF3bGMtPnB1Yi0+dXApCiAJCXJldHVybjsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjY3LDEzICsyNDgyLDcgQEAKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQlyZXR1cm47CiAKLSNpZmRlZiBXTENfTE9XCiAJd2xjX2JtYWNfd2F0Y2hkb2cod2xjKTsKLSNlbmRpZgotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBtYWludGVuYW5jZSAqLwotCXdsY19ibWFjX3JwY193YXRjaGRvZyh3bGMpOwotI2VuZGlmCiAKIAkvKiBvY2Nhc2lvbmFsbHkgc2FtcGxlIG1hYyBzdGF0IGNvdW50ZXJzIHRvIGRldGVjdCAxNi1iaXQgY291bnRlciB3cmFwICovCiAJaWYgKChXTENfVVBEQVRFX1NUQVRTKHdsYykpCkBAIC0yNzAyLDEwICsyNTExLDggQEAKIAkJd2xjLT50ZW1wc2Vuc2VfbGFzdHRpbWUgPSB3bGMtPnB1Yi0+bm93OwogCQl3bGNfdGVtcHNlbnNlX3VwZCh3bGMpOwogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0cnVlKSk7Ci0jZW5kaWYKIAogCS8qIFZlcmlmeSB0aGF0IHR4X3ByZWNfbWFwIGFuZCBmaWZvcyBhcmUgaW4gc3luYyB0byBhdm9pZCBsb2NrIHVwcyAqLwogCUFTU0VSVCh3bGNfdHhfcHJlY19tYXBfdmVyaWZ5KHdsYykpOwpAQCAtMjcxNCw5ICsyNTIxLDkgQEAKIH0KIAogLyogbWFrZSBpbnRlcmZhY2Ugb3BlcmF0aW9uYWwgKi8KLWludCB3bGNfdXAod2xjX2luZm9fdCAqd2xjKQoraW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAogCS8qIEhXIGlzIHR1cm5lZCBvZmYgc28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyBpdCAqLwogCWlmICh3bGMtPnB1Yi0+aHdfb2ZmIHx8IERFVklDRVJFTU9WRUQod2xjKSkKQEAgLTI3MjgsNyArMjUzNSw3IEBACiAJfQogCiAJaWYgKCh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmIChDSElQSUQod2xjLT5wdWItPnNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAod2xjLT5wdWItPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CiAJCWlmICh3bGMtPnB1Yi0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAmJiAod2xjLT5wdWItPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkgewogCQkJd2xjX21oZih3bGMsIE1IRjUsIE1IRjVfNDMxM19HUElPQ1RSTCwKQEAgLTI3NjEsNyArMjU2OCw4IEBACiAJCQkJCWlmICghQlNTQ0ZHX1NUQShic3NjZmcpCiAJCQkJCSAgICB8fCAhYnNzY2ZnLT5lbmFibGUgfHwgIWJzc2NmZy0+QlNTKQogCQkJCQkJY29udGludWU7Ci0JCQkJCVdMX0VSUk9SKCgid2wlZC4lZDogd2xjX3VwOiByZmRpc2FibGUgLT4gIiAid2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0LCBpZHgpKTsKKwkJCQkJV0xfRVJST1IoIndsJWQuJWQ6IHdsY191cDogcmZkaXNhYmxlIC0+ICIgIndsY19ic3NjZmdfZGlzYWJsZSgpXG4iLAorCQkJCQkJIHdsYy0+cHViLT51bml0LCBpZHgpOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlCkBAIC0yODIyLDEwICsyNjMwLDEwIEBACiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGJhc2UgcHJlY2VkZW5jZSBtYXAgZm9yIGRlcXVldWVpbmcgZnJvbSB0eHEgYmFzZWQgb24gV01FIHNldHRpbmdzICovCi1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPnR4X3ByZWNfbWFwID0gV0xDX1BSRUNfQk1QX0FMTDsKLQliemVybyh3bGMtPmZpZm8ycHJlY19tYXAsIHNpemVvZih1MTYpICogTkZJRk8pOworCW1lbXNldCh3bGMtPmZpZm8ycHJlY19tYXAsIDAsIE5GSUZPICogc2l6ZW9mKHUxNikpOwogCiAJLyogRm9yIG5vbi1XTUUsIGJvdGggZmlmb3MgaGF2ZSBvdmVybGFwcGluZyBNQVhQUklPLiBTbyBqdXN0IGRpc2FibGUgYWxsIHByZWNlZGVuY2VzCiAJICogaWYgZWl0aGVyIGlzIGZ1bGwuCkBAIC0yODQxLDcgKzI2NDksNyBAQAogCX0KIH0KIAotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1aW50IHdsY19kb3duX2RlbF90aW1lcihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CiAKQEAgLTI4NTMsNyArMjY2MSw3IEBACiAgKiBkaXNhYmxlIHRoZSBoYXJkd2FyZSwgZnJlZSBhbnkgdHJhbnNpZW50IGJ1ZmZlciBzdGF0ZS4KICAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZHJpdmVyIGNhbGxiYWNrcyBzdGlsbCBwZW5kaW5nLgogICovCi11aW50IHdsY19kb3duKHdsY19pbmZvX3QgKndsYykKK3VpbnQgd2xjX2Rvd24oc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yODYxLDEyICsyNjY5LDEyIEBACiAJYm9vbCBkZXZfZ29uZSA9IGZhbHNlOwogCXdsY190eHFfaW5mb190ICpxaTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGdvaW5nIGRvd24gcGF0aCAqLwogCWlmICh3bGMtPmdvaW5nX2Rvd24pIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogRHJpdmVyIGdvaW5nIGRvd24gc28gcmV0dXJuXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBEcml2ZXIgZ29pbmcgZG93biBzbyByZXR1cm5cbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghd2xjLT5wdWItPnVwKQpAQCAtMjkyMiwxNCArMjczMCwxMSBAQAogCS8qIHdsY19ibWFjX2Rvd25fZmluaXNoIGhhcyBkb25lIHdsY19jb3JlZGlzYWJsZSgpLiBzbyBjbGsgaXMgb2ZmICovCiAJd2xjLT5jbGsgPSBmYWxzZTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bGNfcnBjdHhfdHhyZWNsYWltKHdsYy0+cnBjdHgpOwotI2VuZGlmCiAKIAkvKiBWZXJpZnkgYWxsIHBhY2tldHMgYXJlIGZsdXNoZWQgZnJvbSB0aGUgZHJpdmVyICovCi0JaWYgKFBLVEFMTE9DRUQod2xjLT5vc2gpICE9IDApIHsKLQkJV0xfRVJST1IoKCIlZCBwYWNrZXRzIG5vdCBmcmVlZCBhdCB3bGNfZG93biEhISEhIVxuIiwKLQkJCSAgUEtUQUxMT0NFRCh3bGMtPm9zaCkpKTsKKwlpZiAod2xjLT5vc2gtPnBrdGFsbG9jZWQgIT0gMCkgeworCQlXTF9FUlJPUigiJWQgcGFja2V0cyBub3QgZnJlZWQgYXQgd2xjX2Rvd24hISEhISFcbiIsCisJCQkgd2xjLT5vc2gtPnBrdGFsbG9jZWQpOwogCX0KICNpZmRlZiBCQ01EQkcKIAkvKiBTaW5jZSBhbGwgdGhlIHBhY2tldHMgc2hvdWxkIGhhdmUgYmVlbiBmcmVlZCwKQEAgLTI5NDMsNyArMjc0OCw3IEBACiB9CiAKIC8qIFNldCB0aGUgY3VycmVudCBnbW9kZSBjb25maWd1cmF0aW9uICovCi1pbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZykKK2ludCB3bGNfc2V0X2dtb2RlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBnbW9kZSwgYm9vbCBjb25maWcpCiB7CiAJaW50IHJldCA9IDA7CiAJdWludCBpOwpAQCAtMjk1OCw3ICsyNzYzLDcgQEAKIAlib29sIHByZWFtYmxlX3Jlc3RyaWN0ID0gZmFsc2U7CS8qIFJlc3RyaWN0IGFzc29jaWF0aW9uIHRvIHN0YXRpb25zIHRoYXQgc3VwcG9ydCBzaG9ydAogCQkJCQkgKiBwcmVhbWJsZXMKIAkJCQkJICovCi0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCiAJLyogaWYgTi1zdXBwb3J0IGlzIGVuYWJsZWQsIGFsbG93IEdtb2RlIHNldCBhcyBsb25nIGFzIHJlcXVlc3RlZAogCSAqIEdtb2RlIGlzIG5vdCBHTU9ERV9MRUdBQ1lfQgpAQCAtMjk4NSwxMCArMjc5MCwxMCBAQAogCQl3bGNfcHJvdGVjdGlvbl91cGQod2xjLCBXTENfUFJPVF9HX1VTRVIsIGdtb2RlKTsKIAogCS8qIENsZWFyIHN1cHBvcnRlZCByYXRlcyBmaWx0ZXIgKi8KLQliemVybygmd2xjLT5zdXBfcmF0ZXNfb3ZlcnJpZGUsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCS8qIENsZWFyIHJhdGVzZXQgb3ZlcnJpZGUgKi8KLQliemVybygmcnMsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCXN3aXRjaCAoZ21vZGUpIHsKIAljYXNlIEdNT0RFX0xFR0FDWV9COgpAQCAtMzAyNiw4ICsyODMxLDggQEAKIAogCWRlZmF1bHQ6CiAJCS8qIEVycm9yICovCi0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGludmFsaWQgZ21vZGUgJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkJICBfX2Z1bmNfXywgZ21vZGUpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBpbnZhbGlkIGdtb2RlICVkXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgZ21vZGUpOwogCQlyZXR1cm4gQkNNRV9VTlNVUFBPUlRFRDsKIAl9CiAKQEAgLTMwOTMsNyArMjg5OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bGNfbm1vZGVfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpCitzdGF0aWMgaW50IHdsY19ubW9kZV92YWxpZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKQogewogCWludCBlcnIgPSAwOwogCkBAIC0zMTE3LDcgKzI5MjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCB3bGNfc2V0X25tb2RlKHdsY19pbmZvX3QgKndsYywgczMyIG5tb2RlKQoraW50IHdsY19zZXRfbm1vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBubW9kZSkKIHsKIAl1aW50IGk7CiAJaW50IGVycjsKQEAgLTMxNzYsNyArMjk4MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKQogewogCXdsY19yYXRlc2V0X3QgcnMsIG5ldzsKIAl1aW50IGJhbmR1bml0OwpAQCAtMzIxOSwxOCArMzAyNCwxOCBAQAogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50IGFyZykKK2ludCB3bGNfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW9jdGwod2xjLCBjbWQsICh2b2lkICopJmFyZywgc2l6ZW9mKGFyZyksIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgZ2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfZ2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50ICphcmcpCitpbnQgd2xjX2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgaW50ICphcmcpCiB7CiAJcmV0dXJuIHdsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBzaXplb2YoaW50KSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IHI7CiAJYm9vbCB3YXIgPSBmYWxzZTsKQEAgLTMyNDYsMTQgKzMwNTEsMTYgQEAKIH0KIAogaW50Ci13bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQord2xjX2lvY3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sCisJICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKIAlyZXR1cm4gX3dsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBsZW4sIHdsY2lmKTsKIH0KIAogLyogY29tbW9uIGlvY3RsIGhhbmRsZXIuIHJldHVybjogMD1vaywgLTE9ZXJyb3IsIHBvc2l0aXZlPXBhcnRpY3VsYXIgZXJyb3IgKi8KIHN0YXRpYyBpbnQKLV93bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQorX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorCSAgIHN0cnVjdCB3bGNfaWYgKndsY2lmKQogewogCWludCB2YWwsICpwdmFsOwogCWJvb2wgYm9vbF92YWw7CkBAIC0zMjY1LDcgKzMwNzIsNyBAQAogCXVpbnQgYmFuZDsKIAlyd19yZWdfdCAqcjsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXdsY19ic3NfaW5mb190ICpjdXJyZW50X2JzczsKIAogCS8qIHVwZGF0ZSBic3NjZmcgcG9pbnRlciAqLwpAQCAtMzI4MCw3ICszMDg3LDcgQEAKIAogCS8qIElmIHRoZSBkZXZpY2UgaXMgdHVybmVkIG9mZiwgdGhlbiBpdCdzIG5vdCAicmVtb3ZlZCIgKi8KIAlpZiAoIXdsYy0+cHViLT5od19vZmYgJiYgREVWSUNFUkVNT1ZFRCh3bGMpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQl3bF9kb3duKHdsYy0+d2wpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CkBAIC0zMzAwLDggKzMxMDcsOCBAQAogCWJvb2xfdmFsID0gdmFsICE9IDA7CiAKIAlpZiAoY21kICE9IFdMQ19TRVRfQ0hBTk5FTCkKLQkJV0xfTk9ORSgoIldMQ19JT0NUTDogY21kICVkIHZhbCAweCV4ICglZCkgbGVuICVkXG4iLCBjbWQsCi0JCQkgKHVpbnQpIHZhbCwgdmFsLCBsZW4pKTsKKwkJV0xfTk9ORSgiV0xDX0lPQ1RMOiBjbWQgJWQgdmFsIDB4JXggKCVkKSBsZW4gJWRcbiIsCisJCQljbWQsICh1aW50KXZhbCwgdmFsLCBsZW4pOwogCiAJYmNtZXJyb3IgPSAwOwogCXJlZ3MgPSB3bGMtPnJlZ3M7CkBAIC0zMzIxLDggKzMxMjgsOCBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKChhcmcgPT0gTlVMTCkgfHwgKGxlbiA8PSAwKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogQ29tbWFuZCAlZCBuZWVkcyBhcmd1bWVudHNcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNtZCkpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBDb21tYW5kICVkIG5lZWRzIGFyZ3VtZW50c1xuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBjbWQpOwogCQkJYmNtZXJyb3IgPSBCQ01FX0JBREFSRzsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMzM4OCwxMCArMzE5NSw2IEBACiAJCQkJd2xjX3NldF9jaGFuc3BlYyh3bGMsIGNoc3BlYyk7CiAJCQkJd2xjX2VuYWJsZV9tYWMod2xjKTsKIAkJCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCQkvKiBkZWxheSBmb3IgY2hhbm5lbCBjaGFuZ2UgKi8KLQkJCW1zbGVlcCg1MCk7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM2NTksOCArMzQ2Miw4IEBACiAJCQkvKiA0MzIyIHN1cHBvcnRzIGFudGRpdiBpbiBwaHksIG5vIG5lZWQgdG8gc2V0IGl0IHRvIHVjb2RlICovCiAJCQlpZiAoV0xDSVNOUEhZKHdsYy0+YmFuZCkKIAkJCSAgICAmJiBEMTFSRVZfSVMod2xjLT5wdWItPmNvcmVyZXYsIDE2KSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogY2FuJ3Qgc2V0IHVjYW50ZGl2IGZvciA0MzIyXG4iLAotCQkJCQkgIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IGNhbid0IHNldCB1Y2FudGRpdiBmb3IgNDMyMlxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCQliY21lcnJvciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCQl9IGVsc2UKIAkJCQl3bGNfbWhmKHdsYywgTUhGMSwgTUhGMV9BTlRESVYsCkBAIC0zNzU3LDggKzM1NjAsOCBAQAogCQkJaWYgKChyYWRpb21hc2sgPT0gMCkgfHwgKHJhZGlvbWFzayAmIH52YWxpZGJpdHMpCiAJCQkgICAgfHwgKHJhZGlvdmFsICYgfnZhbGlkYml0cykKIAkJCSAgICB8fCAoKHJhZGlvdmFsICYgfnJhZGlvbWFzaykgIT0gMCkpIHsKLQkJCQlXTF9FUlJPUigoIlNFVF9SQURJTyB3aXRoIHdyb25nIGJpdHMgMHgleFxuIiwKLQkJCQkJICB2YWwpKTsKKwkJCQlXTF9FUlJPUigiU0VUX1JBRElPIHdpdGggd3JvbmcgYml0cyAweCV4XG4iLAorCQkJCQkgdmFsKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zNzg4LDcgKzM1OTEsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQliemVybygoY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKKwkJCW1lbXNldCgoY2hhciAqKSZrZXksIDAsIHNpemVvZihrZXkpKTsKIAkJCWlmIChzcmNfa2V5KSB7CiAJCQkJa2V5LmluZGV4ID0gc3JjX2tleS0+aWQ7CiAJCQkJa2V5LmxlbiA9IHNyY19rZXktPmxlbjsKQEAgLTM4MDAsNyArMzYwMyw3IEBACiAJCQkJCWtleS5mbGFncyB8PSBXTF9QUklNQVJZX0tFWTsKIAogCQkJCWJjb3B5KHNyY19rZXktPmVhLm9jdGV0LCBrZXkuZWEub2N0ZXQsCi0JCQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCX0KIAogCQkJYmNvcHkoKGNoYXIgKikma2V5LCBhcmcsIHNpemVvZihrZXkpKTsKQEAgLTM4MzUsOCArMzYzOCw4IEBACiAJCQkJdTE2IGxvOwogCQkJCXUzMiBoaTsKIAkJCQkvKiBncm91cCBrZXlzIGluIFdQQS1OT05FIChJQlNTIG9ubHksIEFFUyBhbmQgVEtJUCkgdXNlIGEgZ2xvYmFsIFRYSVYgKi8KLQkJCQlpZiAoKGJzc2NmZy0+V1BBX2F1dGggJiBXUEFfQVVUSF9OT05FKQotCQkJCSAgICAmJiBFVEhFUl9JU05VTExBRERSKCZrZXktPmVhKSkgeworCQkJCWlmICgoYnNzY2ZnLT5XUEFfYXV0aCAmIFdQQV9BVVRIX05PTkUpICYmCisJCQkJICAgIGlzX3plcm9fZXRoZXJfYWRkcihrZXktPmVhLm9jdGV0KSkgewogCQkJCQlsbyA9IGJzc2NmZy0+d3BhX25vbmVfdHhpdi5sbzsKIAkJCQkJaGkgPSBic3NjZmctPndwYV9ub25lX3R4aXYuaGk7CiAJCQkJfSBlbHNlIHsKQEAgLTM4ODUsNyArMzY4OCw3IEBACiAJCQl3bGNfcmF0ZXNldF90IHJzOwogCQkJd2xfcmF0ZXNldF90ICpyZXRfcnMgPSAod2xfcmF0ZXNldF90ICopIGFyZzsKIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAkJCXdsY19kZWZhdWx0X3JhdGVzZXQod2xjLCAod2xjX3JhdGVzZXRfdCAqKSAmcnMpOwogCiAJCQlpZiAobGVuIDwgKGludCkocnMuY291bnQgKyBzaXplb2YocnMuY291bnQpKSkgewpAQCAtMzkxMyw3ICszNzE2LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCQkJLyogQ29weSBvbmx5IGxlZ2FjeSByYXRlc2V0IHNlY3Rpb24gKi8KIAkJCXJzLmNvdW50ID0gaW5fcnMtPmNvdW50OwpAQCAtNDI0Nyw3ICs0MDUwLDcgQEAKIAogCQkJLyogY2hlY2sgZm9yIGFuIGVtcHR5IHJhdGVzZXQgdG8gY2xlYXIgdGhlIG92ZXJyaWRlICovCiAJCQlpZiAocnMuY291bnQgPT0gMCkgewotCQkJCWJ6ZXJvKCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwKKwkJCQltZW1zZXQoJndsYy0+c3VwX3JhdGVzX292ZXJyaWRlLCAwLAogCQkJCSAgICAgIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC00Mzk0LDcgKzQxOTcsNyBAQAogI2VuZGlmCiAKIAljYXNlIFdMQ19MQVNUOgotCQlXTF9FUlJPUigoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pOwogCX0KICBkb25lOgogCkBAIC00NDA2LDIxICs0MjA5LDE5IEBACiAJCX0KIAogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAkvKiBJbiBod19vZmYgY29uZGl0aW9uLCBJT0NUTHMgdGhhdCByZWFjaCBoZXJlIGFyZSBkZWVtZWQgc2FmZSBidXQgdGFjbGVhciB3b3VsZAogCSAqIGNlcnRhaW5seSByZXN1bHQgaW4gZ2V0dGluZyAtMSBmb3IgcmVnaXN0ZXIgcmVhZHMuIFNvIHNraXAgdGFfY2xlYXIgYWx0b2dldGhlcgogCSAqLwogCWlmICghKHdsYy0+cHViLT5od19vZmYpKQogCQlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0YV9vaykgfHwgIXRhX29rKTsKLSNlbmRpZgogCiAJcmV0dXJuIGJjbWVycm9yOwogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBjb25zb2xpZGF0ZWQgcmVnaXN0ZXIgYWNjZXNzIGlvY3RsIGVycm9yIGNoZWNraW5nICovCi1pbnQgd2xjX2lvY3JlZ2Noayh3bGNfaW5mb190ICp3bGMsIHVpbnQgYmFuZCkKK2ludCB3bGNfaW9jcmVnY2hrKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmQpCiB7CiAJLyogaWYgYmFuZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgYmFuZCAqLwogCWlmICgoYmFuZCAhPSBXTENfQkFORF9BVVRPKSAmJiAoYmFuZCAhPSAodWludCkgd2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC00NDQwLDcgKzQyNDEsNyBAQAogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBGb3Igc29tZSBpb2N0bHMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBwaSBwb2ludGVyIG1hdGNoZXMgdGhlIGN1cnJlbnQgcGh5ICovCi1pbnQgd2xjX2lvY3BpY2hrKHdsY19pbmZvX3QgKndsYywgdWludCBwaHl0eXBlKQoraW50IHdsY19pb2NwaWNoayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBwaHl0eXBlKQogewogCWlmICh3bGMtPmJhbmQtPnBoeXR5cGUgIT0gcGh5dHlwZSkKIAkJcmV0dXJuIEJDTUVfQkFEQkFORDsKQEAgLTQ0NzQsMjEgKzQyNzUsMjEgQEAKIH0KIAogLyogc2ltcGxpZmllZCBpbnRlZ2VyIGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldGludCh3bGNfaW5mb190ICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQoraW50IHdsY19pb3Zhcl9nZXRpbnQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCBhcmcsIHNpemVvZihzMzIpLCBJT1ZfR0VULAogCQkJICAgIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIFdMQ19TRVRfVkFSIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfaW92YXJfc2V0aW50KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZykKK2ludCB3bGNfaW92YXJfc2V0aW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCAodm9pZCAqKSZhcmcsIHNpemVvZihhcmcpLAogCQkJICAgIElPVl9TRVQsIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIHM4IGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldHM4KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgczggKmFyZykKK2ludCB3bGNfaW92YXJfZ2V0czgoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHM4ICphcmcpCiB7CiAJaW50IGlvdmFyX2ludDsKIAlpbnQgZXJyOwpAQCAtNDUwNywxMSArNDMwOCwxMSBAQAogICogY2FsbGluZyBmdW5jdGlvbiBtdXN0IGtlZXAgJ2lvdmFycycgdW50aWwgd2xjX21vZHVsZV91bnJlZ2lzdGVyIGlzIGNhbGxlZC4KICAqICdpb3ZhcicgbXVzdCBoYXZlIHRoZSBsYXN0IGVudHJ5J3MgbmFtZSBmaWVsZCBiZWluZyBOVUxMIGFzIHRlcm1pbmF0b3IuCiAgKi8KLWludCB3bGNfbW9kdWxlX3JlZ2lzdGVyKHdsY19wdWJfdCAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAoraW50IHdsY19tb2R1bGVfcmVnaXN0ZXIoc3RydWN0IHdsY19wdWIgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKIAkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpX2ZuLAogCQkJd2F0Y2hkb2dfZm5fdCB3X2ZuLCBkb3duX2ZuX3QgZF9mbikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGk7CiAKIAlBU1NFUlQobmFtZSAhPSBOVUxMKTsKQEAgLTQ1MzcsOSArNDMzOCw5IEBACiB9CiAKIC8qIHVucmVnaXN0ZXIgbW9kdWxlIGNhbGxiYWNrcyAqLwotaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKQoraW50IHdsY19tb2R1bGVfdW5yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpoZGwpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgcHViLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIHB1Yi0+d2xjOwogCWludCBpOwogCiAJaWYgKHdsYyA9PSBOVUxMKQpAQCAtNDU1MCw3ICs0MzUxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgV0xDX01BWE1PRFVMRVM7IGkrKykgewogCQlpZiAoIXN0cmNtcCh3bGMtPm1vZHVsZWNiW2ldLm5hbWUsIG5hbWUpICYmCiAJCSAgICAod2xjLT5tb2R1bGVjYltpXS5oZGwgPT0gaGRsKSkgewotCQkJYnplcm8oJndsYy0+bW9kdWxlY2JbaV0sIHNpemVvZihtb2R1bGVjYl90KSk7CisJCQltZW1zZXQoJndsYy0+bW9kdWxlY2JbaV0sIDAsIHNpemVvZihtb2R1bGVjYl90KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ1NjAsNyArNDM2MSw3IEBACiB9CiAKIC8qIFdyaXRlIFdNRSB0dW5hYmxlIHBhcmFtZXRlcnMgZm9yIHJldHJhbnNtaXQvbWF4IHJhdGUgZnJvbSB3bGMgc3RydWN0IHRvIHVjb2RlICovCi1zdGF0aWMgdm9pZCB3bGNfd21lX3JldHJpZXNfd3JpdGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBhYzsKIApAQCAtNDU4Miw3ICs0MzgzLDcgQEAKICAqIEFsbCBwb2ludGVycyBtYXkgcG9pbnQgaW50byB0aGUgc2FtZSBidWZmZXIuCiAgKi8KIGludAotd2xjX2lvdmFyX29wKHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwKK3dsY19pb3Zhcl9vcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkgICAgIHZvaWQgKnBhcmFtcywgaW50IHBfbGVuLCB2b2lkICphcmcsIGludCBsZW4sCiAJICAgICBib29sIHNldCwgc3RydWN0IHdsY19pZiAqd2xjaWYpCiB7CkBAIC00NjA2LDggKzQ0MDcsOCBAQAogCiAJaWYgKCFzZXQgJiYgKGxlbiA9PSBzaXplb2YoaW50KSkgJiYKIAkgICAgIShJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKShhcmcpLCAodWludCkgc2l6ZW9mKGludCkpKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzIHVuYWxpZ25lZCBnZXQgcHRyIGZvciAlc1xuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlcyB1bmFsaWduZWQgZ2V0IHB0ciBmb3IgJXNcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKTsKIAkJQVNTRVJUKDApOwogCX0KIApAQCAtNDYyMiwxMSArNDQyMyw2IEBACiAJLyogaW92YXIgbmFtZSBub3QgZm91bmQgKi8KIAlpZiAoaSA+PSBXTENfTUFYTU9EVUxFUykgewogCQllcnIgPSBCQ01FX1VOU1VQUE9SVEVEOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJZXJyID0KLQkJICAgIGJjbXNkaF9pb3Zhcl9vcCh3bGMtPmJ0cGFyYW0sIG5hbWUsIHBhcmFtcywgcF9sZW4sIGFyZywgbGVuLAotCQkJCSAgICBzZXQpOwotI2VuZGlmCiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ2NTgsMTAgKzQ0NTQsMTAgQEAKIH0KIAogaW50Ci13bGNfaW92YXJfY2hlY2sod2xjX3B1Yl90ICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAord2xjX2lvdmFyX2NoZWNrKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQlib29sIHNldCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwogCkBAIC00NzI5LDcgKzQ1MjUsNyBAQAogCSAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwYXJhbXMsIHVpbnQgcF9sZW4sIHZvaWQgKmFyZywgaW50IGxlbiwKIAkgICAgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBoZGw7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBoZGw7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwpAQCAtNDczOSw3ICs0NTM1LDcgQEAKIAlib29sIGJvb2xfdmFsMjsKIAl3bGNfYnNzX2luZm9fdCAqY3VycmVudF9ic3M7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlic3NjZmcgPSBOVUxMOwogCWN1cnJlbnRfYnNzID0gTlVMTDsKQEAgLTQ3NjIsOCArNDU1OCw4IEBACiAJYm9vbF92YWwgPSAoaW50X3ZhbCAhPSAwKSA/IHRydWUgOiBmYWxzZTsKIAlib29sX3ZhbDIgPSAoaW50X3ZhbDIgIT0gMCkgPyB0cnVlIDogZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOiBpZCAlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAotCQkgIElPVl9JRChhY3Rpb25pZCkpKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IGlkICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBJT1ZfSUQoYWN0aW9uaWQpKTsKIAkvKiBEbyB0aGUgYWN0dWFsIHBhcmFtZXRlciBpbXBsZW1lbnRhdGlvbiAqLwogCXN3aXRjaCAoYWN0aW9uaWQpIHsKIApAQCAtNDgyMSw3ICs0NjE3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB1bnN1cHBvcnRlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogdW5zdXBwb3J0ZWRcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCWJyZWFrOwogCX0KQEAgLTQ4MzMsNyArNDYyOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdsY19pb3Zhcl9yYW5nZWNoZWNrKHdsY19pbmZvX3QgKndsYywgdTMyIHZhbCwgY29uc3QgYmNtX2lvdmFyX3QgKnZpKQord2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSkKIHsKIAlpbnQgZXJyID0gMDsKIAl1MzIgbWluX3ZhbCA9IDA7CkBAIC00OTMwLDcgKzQ3MjYsNyBAQAogI2RlZmluZSBNQUNTVEFUVVBEKG5hbWUpIFwKIAl3bGNfY3RydXBkX2NhY2hlKG1hY3N0YXRzLm5hbWUsICZ3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPm5hbWUsICZ3bGMtPnB1Yi0+X2NudC0+bmFtZSkKIAotdm9pZCB3bGNfc3RhdHN1cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc3RhdHN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGk7CiAjaWZkZWYgQkNNREJHCkBAIC00OTU2LDggKzQ3NTIsOCBAQAogCS8qIGNoZWNrIGZvciByeCBmaWZvIDAgb3ZlcmZsb3cgKi8KIAlkZWx0YSA9ICh1MTYpICh3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPnJ4ZjBvdmZsIC0gcnhmMG92ZmwpOwogCWlmIChkZWx0YSkKLQkJV0xfRVJST1IoKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwgd2xjLT5wdWItPnVuaXQsCi0JCQkgIGRlbHRhKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgZGVsdGEpOwogCiAJLyogY2hlY2sgZm9yIHR4IGZpZm8gdW5kZXJmbG93cyAqLwogCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7CkBAIC00OTY1LDggKzQ3NjEsOCBAQAogCQkgICAgKHUxNikgKHdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdC0+dHhmdW5mbFtpXSAtCiAJCQkgICAgICB0eGZ1bmZsW2ldKTsKIAkJaWYgKGRlbHRhKQotCQkJV0xfRVJST1IoKCJ3bCVkOiAldSB0eCBmaWZvICVkIHVuZGVyZmxvd3MhXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXUgdHggZmlmbyAlZCB1bmRlcmZsb3dzIVxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTUwMTUsNyArNDgxMSw3IEBACiBib29sIHdsY19jaGlwbWF0Y2godTE2IHZlbmRvciwgdTE2IGRldmljZSkKIHsKIAlpZiAodmVuZG9yICE9IFZFTkRPUl9CUk9BRENPTSkgewotCQlXTF9FUlJPUigoIndsY19jaGlwbWF0Y2g6IHVua25vd24gdmVuZG9yIGlkICUwNHhcbiIsIHZlbmRvcikpOworCQlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biB2ZW5kb3IgaWQgJTA0eFxuIiwgdmVuZG9yKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNTAyNyw3ICs0ODIzLDcgQEAKIAlpZiAoKGRldmljZSA9PSBCQ000MzIzNl9EMTFOX0lEKSB8fCAoZGV2aWNlID09IEJDTTQzMjM2X0QxMU4yR19JRCkpCiAJCXJldHVybiB0cnVlOwogCi0JV0xfRVJST1IoKCJ3bGNfY2hpcG1hdGNoOiB1bmtub3duIGRldmljZSBpZCAlMDR4XG4iLCBkZXZpY2UpKTsKKwlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biBkZXZpY2UgaWQgJTA0eFxuIiwgZGV2aWNlKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTUxODIsMjAgKzQ5NzgsMTIgQEAKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIAotdTE2IHdsY19yYXRlX3NobV9vZmZzZXQod2xjX2luZm9fdCAqd2xjLCB1OCByYXRlKQordTE2IHdsY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGMtPmh3LCByYXRlKTsKIH0KIAogLyogQ2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmVkICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotdm9pZCB3bGNfZGV2aWNlX3JlbW92ZWQodm9pZCAqYXJnKQotewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKLQotCXdsYy0+ZGV2aWNlX3ByZXNlbnQgPSBmYWxzZTsKLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIC8qCiAgKiBBdHRlbXB0cyB0byBxdWV1ZSBhIHBhY2tldCBvbnRvIGEgbXVsdGlwbGUtcHJlY2VkZW5jZSBxdWV1ZSwKQEAgLTUyMDcsMTYgKzQ5OTUsMTYgQEAKICAqIFJldHVybnMgdHJ1ZSBpZiBwYWNrZXQgY29uc3VtZWQgKHF1ZXVlZCksIGZhbHNlIGlmIG5vdC4KICAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3ByZWNfZW5xKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwgaW50IHByZWMpCit3bGNfcHJlY19lbnEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKQogewogCXJldHVybiB3bGNfcHJlY19lbnFfaGVhZCh3bGMsIHEsIHBrdCwgcHJlYywgZmFsc2UpOwogfQogCiBib29sIEJDTUZBU1RQQVRICi13bGNfcHJlY19lbnFfaGVhZCh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjLAotCQkgIGJvb2wgaGVhZCkKK3dsY19wcmVjX2VucV9oZWFkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3QgcGt0cSAqcSwgc3RydWN0IHNrX2J1ZmYgKnBrdCwKKwkJICBpbnQgcHJlYywgYm9vbCBoZWFkKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAJaW50IGVwcmVjID0gLTE7CQkvKiBwcmVjZWRlbmNlIHRvIGV2aWN0IGZyb20gKi8KIAogCS8qIERldGVybWluZSBwcmVjZWRlbmNlIGZyb20gd2hpY2ggdG8gZXZpY3QgcGFja2V0LCBpZiBhbnkgKi8KQEAgLTUyMjYsOCArNTAxNCw4IEBACiAJCXAgPSBwa3RxX3BlZWtfdGFpbChxLCAmZXByZWMpOwogCQlBU1NFUlQocCAhPSBOVUxMKTsKIAkJaWYgKGVwcmVjID4gcHJlYykgewotCQkJV0xfRVJST1IoKCIlczogRmFpbGluZzogZXByZWMgJWQgPiBwcmVjICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIGVwcmVjLCBwcmVjKSk7CisJCQlXTF9FUlJPUigiJXM6IEZhaWxpbmc6IGVwcmVjICVkID4gcHJlYyAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGVwcmVjLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KQEAgLTUyNDMsOCArNTAzMSw4IEBACiAKIAkJLyogUmVmdXNlIG5ld2VyIHBhY2tldCB1bmxlc3MgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZGVzdCAqLwogCQlpZiAoZXByZWMgPT0gcHJlYyAmJiAhZGlzY2FyZF9vbGRlc3QpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IE5vIHdoZXJlIHRvIGdvLCBwcmVjID09ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHByZWMpKTsKKwkJCVdMX0VSUk9SKCIlczogTm8gd2hlcmUgdG8gZ28sIHByZWMgPT0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC01MjU2LDE0ICs1MDQ0LDE0IEBACiAJCS8qIEluY3JlbWVudCB3bWUgc3RhdHMgKi8KIAkJaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewogCQkJV0xDTlRJTkNSKHdsYy0+cHViLT5fd21lX2NudC0+Ci0JCQkJICB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLnBhY2tldHMpOworCQkJCSAgdHhfZmFpbGVkW1dNRV9QUklPMkFDKHAtPnByaW9yaXR5KV0ucGFja2V0cyk7CiAJCQlXTENOVEFERCh3bGMtPnB1Yi0+X3dtZV9jbnQtPgotCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLmJ5dGVzLAorCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMocC0+cHJpb3JpdHkpXS5ieXRlcywKIAkJCQkgcGt0dG90bGVuKHdsYy0+b3NoLCBwKSk7CiAJCX0KIAogCQlBU1NFUlQoMCk7Ci0JCVBLVEZSRUUod2xjLT5vc2gsIHAsIHRydWUpOworCQlwa3RfYnVmX2ZyZWVfc2tiKHdsYy0+b3NoLCBwLCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUyNzcsMjUgKzUwNjUsMjYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpCit2b2lkIEJDTUZBU1RQQVRIIHdsY190eHFfZW5xKHZvaWQgKmN0eCwgc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2R1LAorCQkJICAgICB1aW50IHByZWMpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgY3R4OworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSBjdHg7CiAJd2xjX3R4cV9pbmZvX3QgKnFpID0gd2xjLT5hY3RpdmVfcXVldWU7CS8qIENoZWNrIG1lICovCiAJc3RydWN0IHBrdHEgKnEgPSAmcWktPnE7CiAJaW50IHByaW87CiAKLQlwcmlvID0gUEtUUFJJTyhzZHUpOworCXByaW8gPSBzZHUtPnByaW9yaXR5OwogCiAJQVNTRVJUKHBrdHFfbWF4KHEpID49IHdsYy0+cHViLT50dW5hYmxlcy0+ZGF0YWhpd2F0KTsKIAogCWlmICghd2xjX3ByZWNfZW5xKHdsYywgcSwgc2R1LCBwcmVjKSkgewogCQlpZiAoIUVEQ0ZfRU5BQih3bGMtPnB1YikKIAkJICAgIHx8ICh3bGMtPnB1Yi0+d2xmZWF0dXJlZmxhZyAmIFdMX1NXRkxfRkxPV0NPTlRST0wpKQotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCk7CiAKIAkJLyogQVNTRVJUKDkgPT0gOCk7ICovLyogWFhYIHdlIG1pZ2h0IGhpdCB0aGlzIGNvbmR0aW9uIGluIGNhc2UgcGFja2V0IGZsb29kaW5nIGZyb20gbWFjODAyMTEgc3RhY2sgKi8KLQkJUEtURlJFRSh3bGMtPm9zaCwgc2R1LCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYih3bGMtPm9zaCwgc2R1LCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUzMTcsMTMgKzUxMDYsMTQgQEAKIH0KIAogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3NlbmRwa3RfbWFjODAyMTEod2xjX2luZm9fdCAqd2xjLCB2b2lkICpzZHUsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQord2xjX3NlbmRwa3RfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpzZHUsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJdTggcHJpbzsKIAl1aW50IGZpZm87CiAJdm9pZCAqcGt0OwogCXN0cnVjdCBzY2IgKnNjYiA9ICZnbG9iYWxfc2NiOwotCXN0cnVjdCBkb3QxMV9oZWFkZXIgKmQxMV9oZWFkZXIgPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKVBLVERBVEEoc2R1KTsKKwlzdHJ1Y3QgZG90MTFfaGVhZGVyICpkMTFfaGVhZGVyID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoc2R1LT5kYXRhKTsKIAl1MTYgdHlwZSwgZmM7CiAKIAlBU1NFUlQoc2R1KTsKQEAgLTUzMzIsMTMgKzUxMjIsMTMgQEAKIAl0eXBlID0gRkNfVFlQRShmYyk7CiAKIAkvKiA4MDIuMTEgc3RhbmRhcmQgcmVxdWlyZXMgbWFuYWdlbWVudCB0cmFmZmljIHRvIGdvIGF0IGhpZ2hlc3QgcHJpb3JpdHkgKi8KLQlwcmlvID0gKHR5cGUgPT0gRkNfVFlQRV9EQVRBID8gUEtUUFJJTyhzZHUpIDogTUFYUFJJTyk7CisJcHJpbyA9ICh0eXBlID09IEZDX1RZUEVfREFUQSA/IHNkdS0+cHJpb3JpdHkgOiBNQVhQUklPKTsKIAlmaWZvID0gcHJpbzJmaWZvW3ByaW9dOwogCi0JQVNTRVJUKCh1aW50KSBQS1RIRUFEUk9PTShzZHUpID49IFRYT0ZGKTsKLQlBU1NFUlQoIVBLVFNIQVJFRChzZHUpKTsKLQlBU1NFUlQoIVBLVE5FWFQoc2R1KSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHNkdSkpOworCUFTU0VSVCgodWludCkgc2tiX2hlYWRyb29tKHNkdSkgPj0gVFhPRkYpOworCUFTU0VSVCghKHNkdS0+Y2xvbmVkKSk7CisJQVNTRVJUKCEoc2R1LT5uZXh0KSk7CisJQVNTRVJUKCEoc2R1LT5wcmV2KSk7CiAJQVNTRVJUKGZpZm8gPCBORklGTyk7CiAKIAlwa3QgPSBzZHU7CkBAIC01MzUyLDkgKzUxNDIsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpCit2b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSkKIHsKLQl2b2lkICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOworCXN0cnVjdCBza19idWZmICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOwogCWludCBwcmVjOwogCXUxNiBwcmVjX21hcDsKIAlpbnQgZXJyID0gMCwgaSwgY291bnQ7CkBAIC01NDI3LDcgKzUyMTcsNyBAQAogICogZm9yIE1DIGZyYW1lcyBzbyBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIHNlcXVlbmNlIG51bWJlci4KICAqLwogc3RhdGljIGlubGluZSB1MTYKLWJjbWNfZmlkX2dlbmVyYXRlKHdsY19pbmZvX3QgKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCitiY21jX2ZpZF9nZW5lcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCiB7CiAJdTE2IGZyYW1laWQ7CiAKQEAgLTU0NDEsMTMgKzUyMzEsMTQgQEAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmbyh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsIHM4IHR4cGt0cGVuZCkKK3dsY190eGZpZm8oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgZmlmbywgc3RydWN0IHNrX2J1ZmYgKnAsIGJvb2wgY29tbWl0LAorCSAgIHM4IHR4cGt0cGVuZCkKIHsKIAl1MTYgZnJhbWVpZCA9IElOVkFMSURGSUQ7CiAJZDExdHhoX3QgKnR4aDsKIAogCUFTU0VSVChmaWZvIDwgTkZJRk8pOwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHApOworCXR4aCA9IChkMTF0eGhfdCAqKSAocC0+ZGF0YSk7CiAKIAkvKiBXaGVuIGEgQkMvTUMgZnJhbWUgaXMgYmVpbmcgY29tbWl0dGVkIHRvIHRoZSBCQ01DIGZpZm8gdmlhIERNQSAoTk9UIFBJTyksIHVwZGF0ZQogCSAqIHVjb2RlIG9yIEJTUyBpbmZvIGFzIGFwcHJvcHJpYXRlLgpAQCAtNTQ2MCwyMSArNTI1MSwxNCBAQAogCWlmIChXTENfV0FSMTYxNjUod2xjKSkKIAkJd2xjX3dhcjE2MTY1KHdsYywgdHJ1ZSk7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JaWYgKFJQQ1RYX0VOQUIod2xjLT5wdWIpKSB7Ci0JCSh2b2lkKXdsY19ycGN0eF90eCh3bGMtPnJwY3R4LCBmaWZvLCBwLCBjb21taXQsIGZyYW1laWQsCi0JCQkJICAgdHhwa3RwZW5kKTsKLQkJcmV0dXJuOwotCX0KLSNlbHNlCiAKIAkvKiBCdW1wIHVwIHBlbmRpbmcgY291bnQgZm9yIGlmIG5vdCB1c2luZyBycGMuIElmIHJwYyBpcyB1c2VkLCB0aGlzIHdpbGwgYmUgaGFuZGxlZAogCSAqIGluIHdsY19ibWFjX3R4ZmlmbygpCiAJICovCiAJaWYgKGNvbW1pdCkgewogCQlUWFBLVFBFTkRJTkMod2xjLCBmaWZvLCB0eHBrdHBlbmQpOwotCQlXTF9UUkFDRSgoIndsY190eGZpZm8sIHBrdHBlbmQgaW5jICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCQkgIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKSk7CisJCVdMX1RSQUNFKCJ3bGNfdHhmaWZvLCBwa3RwZW5kIGluYyAlZCB0byAlZFxuIiwKKwkJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAl9CiAKIAkvKiBDb21taXQgQkNNQyBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIFNITSBmcmFtZSBJRCBsb2NhdGlvbiAqLwpAQCAtNTQ4MiwxMyArNTI2NiwxMiBAQAogCQlCQ01DRklEKHdsYywgZnJhbWVpZCk7CiAKIAlpZiAoZG1hX3R4ZmFzdCh3bGMtPmh3LT5kaVtmaWZvXSwgcCwgY29tbWl0KSA8IDApIHsKLQkJV0xfRVJST1IoKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKSk7CisJCVdMX0VSUk9SKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKTsKIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBzdGF0aWMgdTE2Ci13bGNfY29tcHV0ZV9haXJ0aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdWludCBsZW5ndGgpCit3bGNfY29tcHV0ZV9haXJ0aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCkKIHsKIAl1MTYgdXNlYyA9IDA7CiAJdWludCBtYWNfcmF0ZSA9IFJTUEVDMlJBVEUocnNwZWMpOwpAQCAtNTUyMyw3ICs1MzA2LDggQEAKIAkJCXVzZWMgPSAobGVuZ3RoIDw8IDMpIC8gMTE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAkJCUFTU0VSVCgoY29uc3QgY2hhciAqKSJCYWQgcGh5X3JhdGUiID09IE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1MzMsNyArNTMxNyw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCit3bGNfY29tcHV0ZV9wbGNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCiB7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKIAkJd2xjX2NvbXB1dGVfbWltb19wbGNwKHJzcGVjLCBsZW5ndGgsIHBsY3ApOwpAQCAtNTU3NCw3ICs1MzU4LDcgQEAKIAlyYXRlX3NpZ25hbCA9IHJhdGVfaW5mb1tyYXRlXSAmIFJBVEVfTUFTSzsKIAlBU1NFUlQocmF0ZV9zaWduYWwgIT0gMCk7CiAKLQliemVybyhwbGNwLCBEMTFfUEhZX0hEUl9MRU4pOworCW1lbXNldChwbGNwLCAwLCBEMTFfUEhZX0hEUl9MRU4pOwogCUQxMUFfUEhZX0hEUl9TUkFURSgob2ZkbV9waHlfaGRyX3QgKikgcGxjcCwgcmF0ZV9zaWduYWwpOwogCiAJdG1wID0gKGxlbmd0aCAmIDB4ZmZmKSA8PCA1OwpAQCAtNTYxOSw3ICs1NDAzLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsY19jY2tfcGxjcF9zZXQ6IHVuc3VwcG9ydGVkIHJhdGUgJWRcbiIsIHJhdGVfNTAwKSk7CisJCVdMX0VSUk9SKCJ3bGNfY2NrX3BsY3Bfc2V0OiB1bnN1cHBvcnRlZCByYXRlICVkXG4iLCByYXRlXzUwMCk7CiAJCXJhdGVfNTAwID0gV0xDX1JBVEVfMU07CiAJCXVzZWMgPSBsZW5ndGggPDwgMzsKIAkJYnJlYWs7CkBAIC01NjU3LDcgKzU0NDEsNyBAQAogICogcHJlYW1ibGVfdHlwZQl1c2Ugc2hvcnQvR0Ygb3IgbG9uZy9NTSBQTENQIGhlYWRlcgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHU4IHByZWFtYmxlX3R5cGUsCit3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgdWludCBuZXh0X2ZyYWdfbGVuKQogewogCXUxNiBkdXIsIHNpZnM7CkBAIC01NjkxLDcgKzU0NzUsNyBAQAogICogZnJhbWVfbGVuCQluZXh0IE1QRFUgZnJhbWUgbGVuZ3RoIGluIGJ5dGVzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NvbXB1dGVfcnRzY3RzX2R1cih3bGNfaW5mb190ICp3bGMsIGJvb2wgY3RzX29ubHksIHJhdGVzcGVjX3QgcnRzX3JhdGUsCit3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LCByYXRlc3BlY190IHJ0c19yYXRlLAogCQkgICAgICAgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLCB1OCBydHNfcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgIHU4IGZyYW1lX3ByZWFtYmxlX3R5cGUsIHVpbnQgZnJhbWVfbGVuLCBib29sIGJhKQogewpAQCAtNTcyMiw3ICs1NTA2LDcgQEAKIAlyZXR1cm4gZHVyOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfcGh5X3JzcGVjX2NoZWNrKHdsY19pbmZvX3QgKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIGJvb2wgd2xjX3BoeV9yc3BlY19jaGVjayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQogewogCWlmIChJU19NQ1MocnNwZWMpKSB7CiAJCXVpbnQgbWNzID0gcnNwZWMgJiBSU1BFQ19SQVRFX01BU0s7CkBAIC01NzQ4LDcgKzU1MzIsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi11MTYgQkNNRkFTVFBBVEggd2xjX3BoeXR4Y3RsMV9jYWxjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiBCQ01GQVNUUEFUSCB3bGNfcGh5dHhjdGwxX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCiB7CiAJdTE2IHBoeWN0bDEgPSAwOwogCXUxNiBidzsKQEAgLTU3NTksNyArNTU0Myw4IEBACiAJCWJ3ID0gUlNQRUNfR0VUX0JXKHJzcGVjKTsKIAkJLyogMTBNaHogaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJaWYgKGJ3IDwgUEhZX1RYQzFfQldfMjBNSFopIHsKLQkJCVdMX0VSUk9SKCgid2xjX3BoeXR4Y3RsMV9jYWxjOiBidyAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldCwgc2V0IHRvIDIwTFxuIiwgYncpKTsKKwkJCVdMX0VSUk9SKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IGJ3ICVkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LCBzZXQgdG8gMjBMXG4iLAorCQkJCSBidyk7CiAJCQlidyA9IFBIWV9UWEMxX0JXXzIwTUhaOwogCQl9CiAKQEAgLTU3ODQsNyArNTU2OSw3IEBACiAJCS8qIGdldCB0aGUgcGh5Y3RsIGJ5dGUgZnJvbSByYXRlIHBoeWNmZyB0YWJsZSAqLwogCQlwaHljZmcgPSB3bGNfcmF0ZV9sZWdhY3lfcGh5Y3RsKFJTUEVDMlJBVEUocnNwZWMpKTsKIAkJaWYgKHBoeWNmZyA9PSAtMSkgewotCQkJV0xfRVJST1IoKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IHdyb25nIGxlZ2FjeSBPRkRNL0NDSyByYXRlXG4iKSk7CisJCQlXTF9FUlJPUigid2xjX3BoeXR4Y3RsMV9jYWxjOiB3cm9uZyBsZWdhY3kgT0ZETS9DQ0sgcmF0ZVxuIik7CiAJCQlBU1NFUlQoMCk7CiAJCQlwaHljZmcgPSAwOwogCQl9CkBAIC01Nzk4LDE2ICs1NTgzLDE0IEBACiAJLyogcGh5IGNsb2NrIG11c3Qgc3VwcG9ydCA0ME1oeiBpZiB0eCBkZXNjcmlwdG9yIHVzZXMgaXQgKi8KIAlpZiAoKHBoeWN0bDEgJiBQSFlfVFhDMV9CV19NQVNLKSA+PSBQSFlfVFhDMV9CV180ME1IWikgewogCQlBU1NFUlQoQ0hTUEVDX1dMQ19CVyh3bGMtPmNoYW5zcGVjKSA9PSBXTENfNDBfTUhaKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCQlBU1NFUlQod2xjLT5jaGFuc3BlYyA9PSB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKSk7Ci0jZW5kaWYKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAJcmV0dXJuIHBoeWN0bDE7CiB9CiAKIHJhdGVzcGVjX3QgQkNNRkFTVFBBVEgKLXdsY19yc3BlY190b19ydHNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBib29sIHVzZV9yc3BlYywKK3dsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIGJvb2wgdXNlX3JzcGVjLAogCQkgICAgICAgdTE2IG1pbW9fY3RsY2hidykKIHsKIAlyYXRlc3BlY190IHJ0c19yc3BlYyA9IDA7CkBAIC01ODYzLDE1ICs1NjQ2LDE1IEBACiAgKgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgIHZvaWQgKnAsIHN0cnVjdCBzY2IgKnNjYiwgdWludCBmcmFnLAord2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgIHN0cnVjdCBza19idWZmICpwLCBzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQgZnJhZywKIAkJICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwgdWludCBuZXh0X2ZyYWdfbGVuLAogCQkgICAgIHdzZWNfa2V5X3QgKmtleSwgcmF0ZXNwZWNfdCByc3BlY19vdmVycmlkZSkKIHsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwogCWQxMXR4aF90ICp0eGg7CiAJdTggKnBsY3AsIHBsY3BfZmFsbGJhY2tbRDExX1BIWV9IRFJfTEVOXTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWludCBsZW4sIHBoeWxlbiwgcnRzX3BoeWxlbjsKIAl1MTYgZmMsIHR5cGUsIGZyYW1laWQsIG1jaCwgcGh5Y3RsLCB4ZnRzLCBtYWlucmF0ZXM7CiAJdTE2IHNlcSA9IDAsIG1jbCA9IDAsIHN0YXR1cyA9IDA7CkBAIC01OTExLDcgKzU2OTQsNyBAQAogCW9zaCA9IHdsYy0+b3NoOwogCiAJLyogbG9jYXRlIDgwMi4xMSBNQUMgaGVhZGVyICovCi0JaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopUEtUREFUQShwKTsKKwloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikocC0+ZGF0YSk7CiAJZmMgPSBsdG9oMTYoaC0+ZmMpOwogCXR5cGUgPSBGQ19UWVBFKGZjKTsKIApAQCAtNTkzNSwyOSArNTcxOCwyOSBAQAogCUFTU0VSVCh0eF9pbmZvKTsKIAogCS8qIGFkZCBQTENQICovCi0JcGxjcCA9IFBLVFBVU0gocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlwbGNwID0gc2tiX3B1c2gocCwgRDExX1BIWV9IRFJfTEVOKTsKIAogCS8qIGFkZCBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1RQVVNIKHAsIEQxMV9UWEhfTEVOKTsKLQliemVybygoY2hhciAqKXR4aCwgRDExX1RYSF9MRU4pOworCXR4aCA9IChkMTF0eGhfdCAqKSBza2JfcHVzaChwLCBEMTFfVFhIX0xFTik7CisJbWVtc2V0KChjaGFyICopdHhoLCAwLCBEMTFfVFhIX0xFTik7CiAKIAkvKiBzZXR1cCBmcmFtZWlkICovCiAJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7CiAJCS8qIG5vbi1BUCBTVEEgc2hvdWxkIG5ldmVyIHVzZSBCQ01DIHF1ZXVlICovCiAJCUFTU0VSVChxdWV1ZSAhPSBUWF9CQ01DX0ZJRk8pOwogCQlpZiAocXVldWUgPT0gVFhfQkNNQ19GSUZPKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBBU1NFUlQgcXVldWUgPT0gVFhfQkNNQyFcbiIsCi0JCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogQVNTRVJUIHF1ZXVlID09IFRYX0JDTUMhXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJZnJhbWVpZCA9IGJjbWNfZmlkX2dlbmVyYXRlKHdsYywgTlVMTCwgdHhoKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgZmlyc3QgZnJhZ21lbnQgKi8KIAkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpIHsKLQkJCQlTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkrKzsKKwkJCQlTQ0JfU0VRTlVNKHNjYiwgcC0+cHJpb3JpdHkpKys7CiAJCQl9CiAKIAkJCS8qIGV4dHJhY3QgZnJhZ21lbnQgbnVtYmVyIGZyb20gZnJhbWUgZmlyc3QgKi8KIAkJCXNlcSA9IGx0b2gxNihzZXEpICYgRlJBR05VTV9NQVNLOwotCQkJc2VxIHw9IChTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkgPDwgU0VRTlVNX1NISUZUKTsKKwkJCXNlcSB8PSAoU0NCX1NFUU5VTShzY2IsIHAtPnByaW9yaXR5KSA8PCBTRVFOVU1fU0hJRlQpOwogCQkJaC0+c2VxID0gaHRvbDE2KHNlcSk7CiAKIAkJCWZyYW1laWQgPSAoKHNlcSA8PCBUWEZJRF9TRVFfU0hJRlQpICYgVFhGSURfU0VRX01BU0spIHwKQEAgLTU5ODEsMTMgKzU3NjQsNiBAQAogCWlmICh0eHJhdGVbMV0tPmlkeCA8IDApIHsKIAkJdHhyYXRlWzFdID0gdHhyYXRlWzBdOwogCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogRG91YmxlIHByb3RlY3Rpb24gLCBqdXN0IGluIGNhc2UgKi8KLQlpZiAodHhyYXRlWzBdLT5pZHggPiBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTKQotCQl0eHJhdGVbMF0tPmlkeCA9IEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1M7Ci0JaWYgKHR4cmF0ZVsxXS0+aWR4ID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykKLQkJdHhyYXRlWzFdLT5pZHggPSBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTOwotI2VuZGlmCiAKIAlmb3IgKGsgPSAwOyBrIDwgaHctPm1heF9yYXRlczsgaysrKSB7CiAJCWlzX21jc1trXSA9CkBAIC02MDM0LDcgKzU4MTAsOCBAQAogCQkJQVNTRVJUKFJTUEVDX0FDVElWRShyc3BlY1trXSkpOwogCQkJcnNwZWNba10gPSBXTENfUkFURV8xTTsKIAkJfSBlbHNlIHsKLQkJCWlmIChXTEFOVFNFTF9FTkFCKHdsYykgJiYgIUVUSEVSX0lTTVVMVEkoJmgtPmExKSkgeworCQkJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSAmJgorCQkJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hMS5vY3RldCkpIHsKIAkJCQkvKiBzZXQgdHggYW50ZW5uYSBjb25maWcgKi8KIAkJCQl3bGNfYW50c2VsX2FudGNmZ19nZXQod2xjLT5hc2ksIGZhbHNlLCBmYWxzZSwgMCwKIAkJCQkJCSAgICAgIDAsICZhbnRjZmcsICZmYmFudGNmZyk7CkBAIC02MTMxLDcgKzU5MDgsOCBAQAogCiAJCQlpZiAoKHR4cmF0ZVtrXS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKQogCQkJICAgICYmICghSVNfTUNTKHJzcGVjW2tdKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJRUVFODAyMTFfVFhfUkNfTUNTICE9IElTX01DUyhyc3BlYylcbiIsIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogSUVFRTgwMjExX1RYX1JDX01DUyAhPSBJU19NQ1MocnNwZWMpXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoMCAmJiAiUmF0ZSBtaXNtYXRjaCIpOwogCQkJfQogCkBAIC02MTk1LDcgKzU5NzMsOCBAQAogCSAgICBwbGNwWzBdOwogCiAJLyogRFVSIGZpZWxkIGZvciBtYWluIHJhdGUgKi8KLQlpZiAoKGZjICE9IEZDX1BTX1BPTEwpICYmICFFVEhFUl9JU01VTFRJKCZoLT5hMSkgJiYgIXVzZV9yaWZzKSB7CisJaWYgKChmYyAhPSBGQ19QU19QT0xMKSAmJgorCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpICYmICF1c2VfcmlmcykgewogCQlkdXJpZCA9CiAJCSAgICB3bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjLCByc3BlY1swXSwgcHJlYW1ibGVfdHlwZVswXSwKIAkJCQkJICBuZXh0X2ZyYWdfbGVuKTsKQEAgLTYyMTMsNyArNTk5Miw3IEBACiAJLyogRFVSIGZpZWxkIGZvciBmYWxsYmFjayByYXRlICovCiAJaWYgKGZjID09IEZDX1BTX1BPTEwpCiAJCXR4aC0+RnJhZ0R1ckZhbGxiYWNrID0gaC0+ZHVyaWQ7Ci0JZWxzZSBpZiAoRVRIRVJfSVNNVUxUSSgmaC0+YTEpIHx8IHVzZV9yaWZzKQorCWVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSB8fCB1c2VfcmlmcykKIAkJdHhoLT5GcmFnRHVyRmFsbGJhY2sgPSAwOwogCWVsc2UgewogCQlkdXJpZCA9IHdsY19jb21wdXRlX2ZyYW1lX2R1cih3bGMsIHJzcGVjWzFdLApAQCAtNjIyNSw3ICs2MDA0LDcgQEAKIAlpZiAoZnJhZyA9PSAwKQogCQltY2wgfD0gVFhDX1NUQVJUTVNEVTsKIAotCWlmICghRVRIRVJfSVNNVUxUSSgmaC0+YTEpKQorCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpKQogCQltY2wgfD0gVFhDX0lNTUVEQUNLOwogCiAJaWYgKEJBTkRfNUcod2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC02MjYwLDcgKzYwMzksNyBAQAogCXR4aC0+VHhGZXNUaW1lRmFsbGJhY2sgPSBodG9sMTYoMCk7CiAKIAkvKiBUeEZyYW1lUkEgKi8KLQliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSF9BTEVOKTsKIAogCS8qIFR4RnJhbWVJRCAqLwogCXR4aC0+VHhGcmFtZUlEID0gaHRvbDE2KGZyYW1laWQpOwpAQCAtNjM0NywxMSArNjEyNiwxMSBAQAogCiAJCWlmICh1c2VfY3RzKSB7CiAJCQlydHMtPmZjID0gaHRvbDE2KEZDX0NUUyk7Ci0JCQliY29weSgoY2hhciAqKSZoLT5hMiwgKGNoYXIgKikmcnRzLT5yYSwgRVRIRVJfQUREUl9MRU4pOworCQkJYmNvcHkoKGNoYXIgKikmaC0+YTIsIChjaGFyICopJnJ0cy0+cmEsIEVUSF9BTEVOKTsKIAkJfSBlbHNlIHsKIAkJCXJ0cy0+ZmMgPSBodG9sMTYoKHUxNikgRkNfUlRTKTsKIAkJCWJjb3B5KChjaGFyICopJmgtPmExLCAoY2hhciAqKSZydHMtPnJhLAotCQkJICAgICAgMiAqIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgIDIgKiBFVEhfQUxFTik7CiAJCX0KIAogCQkvKiBtYWlucmF0ZQpAQCAtNjM2Miw5ICs2MTQxLDEwIEBACiAJCQkgICAgICBEMTFBX1BIWV9IRFJfR1JBVEUoKG9mZG1fcGh5X2hkcl90ICopIHJ0c19wbGNwKSA6CiAJCQkgICAgICBydHNfcGxjcFswXSkgPDwgODsKIAl9IGVsc2UgewotCQliemVybygoY2hhciAqKXR4aC0+UlRTUGh5SGVhZGVyLCBEMTFfUEhZX0hEUl9MRU4pOwotCQliemVybygoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgc2l6ZW9mKHN0cnVjdCBkb3QxMV9ydHNfZnJhbWUpKTsKLQkJYnplcm8oKGNoYXIgKil0eGgtPlJUU1BMQ1BGYWxsYmFjaywKKwkJbWVtc2V0KChjaGFyICopdHhoLT5SVFNQaHlIZWFkZXIsIDAsIEQxMV9QSFlfSERSX0xFTik7CisJCW1lbXNldCgoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgZG90MTFfcnRzX2ZyYW1lKSk7CisJCW1lbXNldCgoY2hhciAqKXR4aC0+UlRTUExDUEZhbGxiYWNrLCAwLAogCQkgICAgICBzaXplb2YodHhoLT5SVFNQTENQRmFsbGJhY2spKTsKIAkJdHhoLT5SVFNEdXJGYWxsYmFjayA9IDA7CiAJfQpAQCAtNjQ1Myw3ICs2MjMzLDcgQEAKIAlpZiAoU0NCX1dNRShzY2IpICYmIHFvcyAmJiB3bGMtPmVkY2ZfdHhvcFthY10pIHsKIAkJdWludCBmcmFnX2R1ciwgZHVyLCBkdXJfZmFsbGJhY2s7CiAKLQkJQVNTRVJUKCFFVEhFUl9JU01VTFRJKCZoLT5hMSkpOworCQlBU1NFUlQoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSk7CiAKIAkJLyogV01FOiBVcGRhdGUgVFhPUCB0aHJlc2hvbGQgKi8KIAkJaWYgKCghKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpICYmIChmcmFnID09IDApKSB7CkBAIC02NTIzLDE5ICs2MzAzLDIzIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzIHR4b3AgaW52YWxpZCBmb3IgcmF0ZSAlZFxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgZmlmb19uYW1lc1txdWV1ZV0sCi0JCQkJCSAgUlNQRUMyUkFURShyc3BlY1swXSkpKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXMgdHhvcCBpbnZhbGlkIGZvciByYXRlICVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIGZpZm9fbmFtZXNbcXVldWVdLAorCQkJCQkgUlNQRUMyUkFURShyc3BlY1swXSkpOwogCiAJCQlpZiAoZHVyID4gd2xjLT5lZGNmX3R4b3BbYWNdKQotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6ICVzIHR4b3AgZXhjZWVkZWQgcGh5bGVuICVkLyVkIGR1ciAlZC8lZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBmaWZvX25hbWVzW3F1ZXVlXSwgcGh5bGVuLCB3bGMtPmZyYWd0aHJlc2hbcXVldWVdLCBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogJXMgdHhvcCBleGNlZWRlZCBwaHlsZW4gJWQvJWQgZHVyICVkLyVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJCQkgZmlmb19uYW1lc1txdWV1ZV0sCisJCQkJCSBwaHlsZW4sIHdsYy0+ZnJhZ3RocmVzaFtxdWV1ZV0sCisJCQkJCSBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKK3ZvaWQgd2xjX3RidHQoc3RydWN0IHdsY19pbmZvICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKIHsKIAl3bGNfYnNzY2ZnX3QgKmNmZyA9IHdsYy0+Y2ZnOwogCkBAIC02NTcxLDE5ICs2MzU1LDE5IEBACiB9CiAKIC8qIEdQIHRpbWVyIGlzIGEgZnJlZXJ1bm5pbmcgMzIgYml0IGNvdW50ZXIsIGRlY3JlbWVudHMgYXQgMSB1cyByYXRlICovCi12b2lkIHdsY19od3RpbWVyX2dwdGltZXJfc2V0KHdsY19pbmZvX3QgKndsYywgdWludCB1cykKK3ZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdXMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwkvKiBubyBncHRpbWVyIGluIGVhcmxpZXIgcmV2cyAqLwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCB1cyk7CiB9CiAKLXZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19od3RpbWVyX2dwdGltZXJfYWJvcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9jYih3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2NiKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCS8qIHdoZW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCwgdGhlIGNvdW50ZXIgaXMgbG9hZGVkIHdpdGggbGFzdCB2YWx1ZQogCSAqIHdyaXR0ZW4gYW5kIGNvbnRpbnVlIHRvIGRlY3JlbWVudC4gU28gaXQgaGFzIHRvIGJlIGNsZWFuZWQgZmlyc3QKQEAgLTY1OTYsNyArNjM4MCw3IEBACiAgKiBQT0xJQ1k6IG5vIG1hY2luc3RhdHVzIGNoYW5nZSwgbm8gYm91bmRpbmcgbG9vcC4KICAqICAgICAgICAgQWxsIGRwYyBib3VuZGluZyBzaG91bGQgYmUgaGFuZGxlZCBpbiBCTUFDIGRwYywgbGlrZSB0eHN0YXR1cyBhbmQgcnhpbnQKICAqLwotdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKQordm9pZCB3bGNfaGlnaF9kcGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiBtYWNpbnRzdGF0dXMpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwogI2lmZGVmIEJDTURCRwpAQCAtNjYzNCw4ICs2NDE4LDggQEAKIAlpZiAobWFjaW50c3RhdHVzICYgfihNSV9UQlRUIHwgTUlfVFhTVE9QKSkgewogCQliY21fZm9ybWF0X2ZsYWdzKGludF9mbGFncywgbWFjaW50c3RhdHVzLCBmbGFnc3RyLAogCQkJCSBzaXplb2YoZmxhZ3N0cikpOwotCQlXTF9UUkFDRSgoIndsJWQ6IG1hY2ludHN0YXR1cyAweCV4ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgbWFjaW50c3RhdHVzLCBmbGFnc3RyKSk7CisJCVdMX1RSQUNFKCJ3bCVkOiBtYWNpbnRzdGF0dXMgMHgleCAlc1xuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgbWFjaW50c3RhdHVzLCBmbGFnc3RyKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTY2NTAsMTEgKzY0MzQsMTIgQEAKIAkJd2xjX3RidHQod2xjLCByZWdzKTsKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjLT5wdWItPnVuaXQsIHdsYy0+cHViLT5ub3cpKTsKKwkJV0xfRVJST1IoIndsJWQ6IFBTTSBtaWNyb2NvZGUgd2F0Y2hkb2cgZmlyZWQgYXQgJWQgKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCB3bGMtPnB1Yi0+bm93KTsKIAogCQlwcmludGtfb25jZSgiJXMgOiBQU00gV2F0Y2hkb2csIGNoaXBpZCAweCV4LCBjaGlwcmV2IDB4JXhcbiIsCi0JCQkgICAgX19mdW5jX18sIENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSwKLQkJCSAgICBDSElQUkVWKHdsYy0+cHViLT5zaWgtPmNoaXByZXYpKTsKKwkJCQkJX19mdW5jX18sIHdsYy0+cHViLT5zaWgtPmNoaXAsCisJCQkJCXdsYy0+cHViLT5zaWgtPmNoaXByZXYpOwogCiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cHNtd2RzKTsKIApAQCAtNjY2OCw3ICs2NDUzLDkgQEAKIAl9CiAKIAlpZiAobWFjaW50c3RhdHVzICYgTUlfUkZESVNBQkxFKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIFJGIERpc2FibGUgSW5wdXQgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwKKwkJCSBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKTsKIAkJLyogZGVsYXkgdGhlIGNsZWFudXAgdG8gd2xfZG93biBpbiBJQlNTIGNhc2UgKi8KIAkJaWYgKChSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSkgewogCQkJaW50IGlkeDsKQEAgLTY2NzcsNyArNjQ2NCw4IEBACiAJCQkJaWYgKCFCU1NDRkdfU1RBKGJzc2NmZykgfHwgIWJzc2NmZy0+ZW5hYmxlCiAJCQkJICAgIHx8ICFic3NjZmctPkJTUykKIAkJCQkJY29udGludWU7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZHBjOiByZmRpc2FibGUgLT4gd2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IHdsY19kcGM6IHJmZGlzYWJsZSAtPiB3bGNfYnNzY2ZnX2Rpc2FibGUoKVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCX0KIAkJfQogCX0KQEAgLTY2ODYsMTQgKzY0NzQsMTIgQEAKIAlpZiAoIXBrdHFfZW1wdHkoJndsYy0+YWN0aXZlX3F1ZXVlLT5xKSkKIAkJd2xjX3NlbmRfcSh3bGMsIHdsYy0+YWN0aXZlX3F1ZXVlKTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJQVNTRVJUKHdsY19wc19jaGVjayh3bGMpKTsKLSNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCAqd2xjXzE1NDIwd2FyKHdsY19pbmZvX3QgKndsYywgdWludCBxdWV1ZSkKK3N0YXRpYyB2b2lkICp3bGNfMTU0MjB3YXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgcXVldWUpCiB7Ci0JaG5kZG1hX3QgKmRpOworCXN0cnVjdCBobmRkbWFfcHViICpkaTsKIAl2b2lkICpwOwogCiAJQVNTRVJUKHF1ZXVlIDwgTkZJRk8pOwpAQCAtNjcxNSwxMyArNjUwMSwxNCBAQAogCWlmIChkbWFfdHhhY3RpdmUod2xjLT5ody0+ZGlbcXVldWVdKSA9PSAwKSB7CiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+dHhkbWF3YXIpOwogCQlpZiAoIWRtYV90eHJlc2V0KGRpKSkKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKTsKIAkJZG1hX3R4aW5pdChkaSk7CiAJfQogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd2FyMTYxNjUod2xjX2luZm9fdCAqd2xjLCBib29sIHR4KQorc3RhdGljIHZvaWQgd2xjX3dhcjE2MTY1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHR4KQogewogCWlmICh0eCkgewogCQkvKiB0aGUgcG9zdC1pbmNyZW1lbnQgaXMgdXNlZCBpbiBTVEFZX0FXQUtFIG1hY3JvICovCkBAIC02NzM3LDE0ICs2NTI0LDE0IEBACiAvKiBwcm9jZXNzIGFuIGluZGl2aWR1YWwgdHhfc3RhdHVzX3QgKi8KIC8qIFdMQ19ISUdIX0FQSSAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKK3dsY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKIHsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCXVpbnQgcXVldWU7CiAJZDExdHhoX3QgKnR4aDsKIAlzdHJ1Y3Qgc2NiICpzY2IgPSBOVUxMOwogCWJvb2wgZnJlZV9wZHU7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlpbnQgdHhfcnRzLCB0eF9mcmFtZV9jb3VudCwgdHhfcnRzX2NvdW50OwogCXVpbnQgdG90bGVuLCBzdXByX3N0YXR1czsKIAlib29sIGxhc3RmcmFtZTsKQEAgLTY3NjgsNyArNjU1NSw3IEBACiAJCQkgKCh0eHMtPgogCQkJICAgc3RhdHVzICYgVFhfU1RBVFVTX0ZSTV9SVFhfTUFTSykgPj4KIAkJCSAgVFhfU1RBVFVTX0ZSTV9SVFhfU0hJRlQpKTsKLQkJV0xfRVJST1IoKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNjc4OSwxMiArNjU3NiwxMiBAQAogCWlmIChwID09IE5VTEwpCiAJCWdvdG8gZmF0YWw7CiAKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwKTsKKwl0eGggPSAoZDExdHhoX3QgKikgKHAtPmRhdGEpOwogCW1jbCA9IGx0b2gxNih0eGgtPk1hY1R4Q29udHJvbExvdyk7CiAKIAlpZiAodHhzLT5waHllcnIpIHsKLQkJV0xfRVJST1IoKCJwaHllcnIgMHgleCwgcmF0ZSAweCV4XG4iLCB0eHMtPnBoeWVyciwKLQkJCSAgdHhoLT5NYWluUmF0ZXMpKTsKKwkJV0xfRVJST1IoInBoeWVyciAweCV4LCByYXRlIDB4JXhcbiIsCisJCQkgdHhzLT5waHllcnIsIHR4aC0+TWFpblJhdGVzKTsKIAkJd2xjX3ByaW50X3R4ZGVzYyh0eGgpOwogCQl3bGNfcHJpbnRfdHhzdGF0dXModHhzKTsKIAl9CkBAIC02ODI1LDggKzY2MTIsOCBAQAogCiAJc3Vwcl9zdGF0dXMgPSB0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19TVVBSX01BU0s7CiAJaWYgKHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0JBRENIKQotCQlXTF9OT05FKCgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAotCQkJIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpKTsKKwkJV0xfTk9ORSgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAorCQkJX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKHdsYy0+ZGVmYXVsdF9ic3MtPmNoYW5zcGVjKSk7CiAKIAl0eF9ydHMgPSBodG9sMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpICYgVFhDX1NFTkRSVFM7CiAJdHhfZnJhbWVfY291bnQgPQpAQCAtNjgzNyw3ICs2NjI0LDcgQEAKIAlsYXN0ZnJhbWUgPSAoZmMgJiBGQ19NT1JFRlJBRykgPT0gMDsKIAogCWlmICghbGFzdGZyYW1lKSB7Ci0JCVdMX0VSUk9SKCgiTm90IGxhc3QgZnJhbWUhXG4iKSk7CisJCVdMX0VSUk9SKCJOb3QgbGFzdCBmcmFtZSFcbiIpOwogCX0gZWxzZSB7CiAJCXUxNiBzZmJsLCBsZmJsOwogCQlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXModHhfaW5mbyk7CkBAIC02ODc5LDE3ICs2NjY2LDE3IEBACiAJd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGMsIHF1ZXVlLCAxKTsKIAogCWlmIChsYXN0ZnJhbWUpIHsKLQkJUEtUU0VUTkVYVChwLCBOVUxMKTsKLQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKKwkJcC0+bmV4dCA9IE5VTEw7CisJCXAtPnByZXYgPSBOVUxMOwogCQl3bGMtPnR4cmV0cmllZCA9IDA7CiAJCS8qIHJlbW92ZSBQTENQICYgQnJvYWRjb20gdHggZGVzY3JpcHRvciBoZWFkZXIgKi8KLQkJUEtUUFVMTChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQlQS1RQVUxMKHAsIEQxMV9UWEhfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwogCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsIHApOwogCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfdHhfc3RhdHVzKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIiVzOiBOb3QgbGFzdCBmcmFtZSA9PiBub3QgY2FsbGluZyB0eF9zdGF0dXNcbiIsCi0JCQkgIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogTm90IGxhc3QgZnJhbWUgPT4gbm90IGNhbGxpbmcgdHhfc3RhdHVzXG4iLAorCQkJIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC02ODk3LDI0ICs2Njg0LDE4IEBACiAgZmF0YWw6CiAJQVNTRVJUKDApOwogCWlmIChwKQotCQlQS1RGUkVFKG9zaCwgcCwgdHJ1ZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCB0cnVlKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBJZiB0aGlzIGlzIGEgc3BsaXQgZHJpdmVyLCBkbyB0aGUgYmlnLWhhbW1lciBoZXJlLgotCSAqIElmIHRoaXMgaXMgYSBtb25vbGl0aGljIGRyaXZlciwgd2xjX2JtYWMuYzp3bGNfZHBjKCkgd2lsbCBkbyB0aGUgYmlnLWhhbW1lci4KLQkgKi8KLQl3bF9pbml0KHdsYy0+d2wpOwotI2VuZGlmCiAJcmV0dXJuIHRydWU7CiAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgczggdHhwa3RwZW5kKQord2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpCiB7CiAJVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdHhwa3RwZW5kKTsKLQlXTF9UUkFDRSgoIndsY190eGZpZm9fY29tcGxldGUsIHBrdHBlbmQgZGVjICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCSAgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykpKTsKKwlXTF9UUkFDRSgid2xjX3R4Zmlmb19jb21wbGV0ZSwgcGt0cGVuZCBkZWMgJWQgdG8gJWRcbiIsCisJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAogCS8qIFRoZXJlIGlzIG1vcmUgcm9vbTsgbWFyayBwcmVjZWRlbmNlcyByZWxhdGVkIHRvIHRoaXMgRklGTyBzZW5kYWJsZSAqLwogCVdMQ19UWF9GSUZPX0VOQUIod2xjLCBmaWZvKTsKQEAgLTcwMTQsNyArNjc5NSw3IEBACiB9CiAKIC8qIFVwZGF0ZSBiZWFjb24gbGlzdGVuIGludGVydmFsIGluIHNoYXJlZCBtZW1vcnkgKi8KLXZvaWQgd2xjX2Jjbl9saV91cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfYmNuX2xpX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXJldHVybjsKQEAgLTcwMjgsNyArNjgwOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcmVwX21hYzgwMjExX3N0YXR1cyh3bGNfaW5mb190ICp3bGMsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCwKK3ByZXBfbWFjODAyMTFfc3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwLAogCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCiB7CiAJdTMyIHRzZl9sLCB0c2ZfaDsKQEAgLTcwNjEsNyArNjg0Miw3IEBACiAJLyogcXVhbCAqLwogCXJ4X3N0YXR1cy0+YW50ZW5uYSA9IChyeGgtPlBoeVJ4U3RhdHVzXzAgJiBQUlhTMF9SWEFOVF9VUFNVQkJBTkQpID8gMSA6IDA7CS8qIGFudCAqLwogCi0JcGxjcCA9IFBLVERBVEEocCk7CisJcGxjcCA9IHAtPmRhdGE7CiAKIAlyc3BlYyA9IHdsY19jb21wdXRlX3JzcGVjKHJ4aCwgcGxjcCk7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKQEAgLTcxMDgsMTkgKzY4ODksMTkgQEAKIAkJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSAxMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biByYXRlXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIHJhdGVcbiIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIERldGVybWluZSBzaG9ydCBwcmVhbWJsZSBhbmQgcmF0ZV9pZHggKi8KIAkJcHJlYW1ibGUgPSAwOwogCQlpZiAoSVNfQ0NLKHJzcGVjKSkgewogCQkJaWYgKHJ4aC0+UGh5UnhTdGF0dXNfMCAmIFBSWFMwX1NIT1JUSCkKLQkJCQlXTF9FUlJPUigoIlNob3J0IENDS1xuIikpOworCQkJCVdMX0VSUk9SKCJTaG9ydCBDQ0tcbiIpOwogCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CiAJCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtNzEyOSwxNiArNjkxMCwxNyBAQAogCiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0RFQ0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfUExDUF9DUkM7Ci0JCVdMX0VSUk9SKCgiJXM6ICBSWF9GTEFHX0ZBSUxFRF9QTENQX0NSQ1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiAgUlhfRkxBR19GQUlMRURfUExDUF9DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKLQkJV0xfRVJST1IoKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfcmVjdmN0bCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCkKK3dsY19yZWN2Y3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZDExcnhoZHJfdCAqcnhoLAorCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlpbnQgbGVuX21wZHU7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwpAQCAtNzE1NSwxMiArNjkzNywxMiBAQAogCXByZXBfbWFjODAyMTFfc3RhdHVzKHdsYywgcnhoLCBwLCAmcnhfc3RhdHVzKTsKIAogCS8qIG1hYyBoZWFkZXIrYm9keSBsZW5ndGgsIGV4Y2x1ZGUgQ1JDIGFuZCBwbGNwIGhlYWRlciAqLwotCWxlbl9tcGR1ID0gUEtUTEVOKHApIC0gRDExX1BIWV9IRFJfTEVOIC0gRE9UMTFfRkNTX0xFTjsKLQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JUEtUU0VUTEVOKHAsIGxlbl9tcGR1KTsKKwlsZW5fbXBkdSA9IHAtPmxlbiAtIEQxMV9QSFlfSERSX0xFTiAtIERPVDExX0ZDU19MRU47CisJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlfX3NrYl90cmltKHAsIGxlbl9tcGR1KTsKIAotCUFTU0VSVCghUEtUTkVYVChwKSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHApKTsKKwlBU1NFUlQoIShwLT5uZXh0KSk7CisJQVNTRVJUKCEocC0+cHJldikpOwogCiAJQVNTRVJUKElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhLCAyKSk7CiAKQEAgLTcxNjgsMTcgKzY5NTAsMTcgQEAKIAlpZWVlODAyMTFfcnhfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywgcCk7CiAKIAlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfcngpOwotCVBLVFVOQUxMT0Mob3NoKTsKKwlvc2gtPnBrdGFsbG9jZWQtLTsKIAlyZXR1cm47CiB9CiAKLXZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCit2b2lkIHdsY19ic3NfbGlzdF9mcmVlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCiB7CiAJdWludCBpbmRleDsKIAl3bGNfYnNzX2luZm9fdCAqYmk7CiAKIAlpZiAoIWJzc19saXN0KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IEF0dGVtcHRpbmcgdG8gZnJlZSBOVUxMIGxpc3RcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogQXR0ZW1wdGluZyB0byBmcmVlIE5VTEwgbGlzdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCS8qIGluc3BlY3QgYWxsIEJTUyBkZXNjcmlwdG9yICovCkBAIC03MjAxLDQ4ICs2OTgzLDQ4IEBACiAgKiBQYXJhbSAnYm91bmQnIGluZGljYXRlcyBtYXguICMgZnJhbWVzIHRvIHByb2Nlc3MgYmVmb3JlIGJyZWFrIG91dC4KICAqLwogLyogV0xDX0hJR0hfQVBJICovCi12b2lkIEJDTUZBU1RQQVRIIHdsY19yZWN2KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcCkKK3ZvaWQgQkNNRkFTVFBBVEggd2xjX3JlY3Yoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwKQogewogCWQxMXJ4aGRyX3QgKnJ4aDsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTE2IGZjOwogCXVpbnQgbGVuOwogCWJvb2wgaXNfYW1zZHU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19yZWN2XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVjdlxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJb3NoID0gd2xjLT5vc2g7CiAKIAkvKiBmcmFtZSBzdGFydHMgd2l0aCByeGhkciAqLwotCXJ4aCA9IChkMTFyeGhkcl90ICopIFBLVERBVEEocCk7CisJcnhoID0gKGQxMXJ4aGRyX3QgKikgKHAtPmRhdGEpOwogCiAJLyogc3RyaXAgb2ZmIHJ4aGRyICovCi0JUEtUUFVMTChwLCB3bGMtPmh3cnhvZmYpOworCXNrYl9wdWxsKHAsIHdsYy0+aHdyeG9mZik7CiAKIAkvKiBmaXh1cCByeCBoZWFkZXIgZW5kaWFubmVzcyAqLwogCWx0b2gxNl9idWYoKHZvaWQgKilyeGgsIHNpemVvZihkMTFyeGhkcl90KSk7CiAKIAkvKiBNQUMgaW5zZXJ0cyAyIHBhZCBieXRlcyBmb3IgYTQgaGVhZGVycyBvciBRb1Mgb3IgQS1NU0RVIHN1YmZyYW1lcyAqLwogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19QQlBSRVMpIHsKLQkJaWYgKFBLVExFTihwKSA8IDIpIHsKKwkJaWYgKHAtPmxlbiA8IDIpIHsKIAkJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cnhydW50KTsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgUEtUTEVOKHApKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBwLT5sZW4pOwogCQkJZ290byB0b3NzOwogCQl9Ci0JCVBLVFBVTEwocCwgMik7CisJCXNrYl9wdWxsKHAsIDIpOwogCX0KIAotCWggPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKShQS1REQVRBKHApICsgRDExX1BIWV9IRFJfTEVOKTsKLQlsZW4gPSBQS1RMRU4ocCk7CisJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHAtPmRhdGEgKyBEMTFfUEhZX0hEUl9MRU4pOworCWxlbiA9IHAtPmxlbjsKIAogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19GQ1NFUlIpIHsKIAkJaWYgKHdsYy0+cHViLT5tYWM4MDIxMV9zdGF0ZSAmIE1BQzgwMjExX1BST01JU0NfQkNOUykgewotCQkJV0xfRVJST1IoKCJGQ1NFUlIgd2hpbGUgc2Nhbm5pbmcqKioqKioqIC0gdG9zc2luZ1xuIikpOworCQkJV0xfRVJST1IoIkZDU0VSUiB3aGlsZSBzY2FubmluZyoqKioqKiogLSB0b3NzaW5nXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiUkNTRVJSISEhXG4iKSk7CisJCQlXTF9FUlJPUigiUkNTRVJSISEhXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfQogCX0KQEAgLTcyNjEsMTAgKzcwNDMsMTAgQEAKIAlpZiAoIWlzX2Ftc2R1KSB7CiAJCS8qIENUUyBhbmQgQUNLIENUTCBmcmFtZXMgYXJlIHcvbyBhMiAqLwogCQlpZiAoRkNfVFlQRShmYykgPT0gRkNfVFlQRV9EQVRBIHx8IEZDX1RZUEUoZmMpID09IEZDX1RZUEVfTU5HKSB7Ci0JCQlpZiAoKEVUSEVSX0lTTlVMTEFERFIoJmgtPmEyKSB8fCBFVEhFUl9JU01VTFRJKCZoLT5hMikpKSB7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZHJvcHBpbmcgYSBmcmFtZSB3aXRoICIKLQkJCQkJImludmFsaWQgc3JjIG1hYyBhZGRyZXNzLCBhMjogJXBNXG4iLAotCQkJCQl3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sICZoLT5hMikpOworCQkJaWYgKChpc196ZXJvX2V0aGVyX2FkZHIoaC0+YTIub2N0ZXQpIHx8CisJCQkgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmEyLm9jdGV0KSkpIHsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IGRyb3BwaW5nIGEgZnJhbWUgd2l0aCBpbnZhbGlkIHNyYyBtYWMgYWRkcmVzcywgYTI6ICVwTVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgJmgtPmEyKTsKIAkJCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPnJ4YmFkc3JjbWFjKTsKIAkJCQlnb3RvIHRvc3M7CiAJCQl9CkBAIC03Mjc5LDcgKzcwNjEsNyBAQAogCX0KIAogCWlmIChpc19hbXNkdSkgewotCQlXTF9FUlJPUigoIiVzOiBpc19hbXNkdSBjYXVzaW5nIHRvc3NcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogaXNfYW1zZHUgY2F1c2luZyB0b3NzXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdG9zczsKIAl9CiAKQEAgLTcyODcsNyArNzA2OSw3IEBACiAJcmV0dXJuOwogCiAgdG9zczoKLQlQS1RGUkVFKG9zaCwgcCwgZmFsc2UpOworCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBmYWxzZSk7CiB9CiAKIC8qIGNhbGN1bGF0ZSBmcmFtZSBkdXJhdGlvbiBmb3IgTWl4ZWQtbW9kZSBMLVNJRyBzcG9vZmluZywgcmV0dXJuCkBAIC03Mjk3LDEyICs3MDc5LDEyIEBACiAgKiAgIGxlbiA9IDMobnN5bXMgKyBuc3RyZWFtICsgMykgLSAzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NhbGNfbHNpZ19sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1aW50IG1hY19sZW4pCit3bGNfY2FsY19sc2lnX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdWludCBtYWNfbGVuKQogewogCXVpbnQgbnN5bXMsIGxlbiA9IDAsIGtOZHBzOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfY2FsY19sc2lnX2xlbjogcmF0ZSAlZCwgbGVuJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkgIFJTUEVDMlJBVEUocmF0ZXNwZWMpLCBtYWNfbGVuKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2xzaWdfbGVuOiByYXRlICVkLCBsZW4lZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBSU1BFQzJSQVRFKHJhdGVzcGVjKSwgbWFjX2xlbik7CiAKIAlpZiAoSVNfTUNTKHJhdGVzcGVjKSkgewogCQl1aW50IG1jcyA9IHJhdGVzcGVjICYgUlNQRUNfUkFURV9NQVNLOwpAQCAtNzMzOCw3ICs3MTIwLDcgQEAKIAogLyogY2FsY3VsYXRlIGZyYW1lIGR1cmF0aW9uIG9mIGEgZ2l2ZW4gcmF0ZSBhbmQgbGVuZ3RoLCByZXR1cm4gdGltZSBpbiB1c2VjIHVuaXQgKi8KIHVpbnQgQkNNRkFTVFBBVEgKLXdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgIHVpbnQgbWFjX2xlbikKIHsKIAl1aW50IG5zeW1zLCBkdXIgPSAwLCBOZHBzLCBrTmRwczsKQEAgLTczNDYsMTEgKzcxMjgsMTIgQEAKIAogCWlmIChyYXRlID09IDApIHsKIAkJQVNTRVJUKDApOwotCQlXTF9FUlJPUigoIndsJWQ6IFdBUjogdXNpbmcgcmF0ZSBvZiAxIG1icHNcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBXQVI6IHVzaW5nIHJhdGUgb2YgMSBtYnBzXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJCXJhdGUgPSBXTENfUkFURV8xTTsKIAl9CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWQsIGxlbiVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2NhbGNfZnJhbWVfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgbGVuJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0MDgsMTMgKzcxOTEsMTQgQEAKIAogLyogVGhlIG9wcG9zaXRlIG9mIHdsY19jYWxjX2ZyYW1lX3RpbWUgKi8KIHN0YXRpYyB1aW50Ci13bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAogCQkgICB1aW50IGR1cikKIHsKIAl1aW50IG5zeW1zLCBtYWNfbGVuLCBOZHBzLCBrTmRwczsKIAl1aW50IHJhdGUgPSBSU1BFQzJSQVRFKHJhdGVzcGVjKTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfZnJhbWVfbGVuOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkLCBkdXIgJWRcbiIsIHdsYy0+cHViLT51bml0LCByYXRlc3BlYywgcHJlYW1ibGVfdHlwZSwgZHVyKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX2xlbjogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgZHVyICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJhdGVzcGVjLCBwcmVhbWJsZV90eXBlLCBkdXIpOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0NTQsMTAgKzcyMzgsMTAgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2JhX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQord2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMsIHByZWFtYmxlX3R5cGUpOwogCS8qIFNwZWMgOS42OiBhY2sgcmF0ZSBpcyB0aGUgaGlnaGVzdCByYXRlIGluIEJTU0Jhc2ljUmF0ZVNldCB0aGF0IGlzIGxlc3MgdGhhbgogCSAqIG9yIGVxdWFsIHRvIHRoZSByYXRlIG9mIHRoZSBpbW1lZGlhdGVseSBwcmV2aW91cyBmcmFtZSBpbiB0aGUgRkVTCiAJICovCkBAIC03NDcxLDEyICs3MjU1LDEyIEBACiB9CiAKIHN0YXRpYyB1aW50IEJDTUZBU1RQQVRICi13bGNfY2FsY19hY2tfdGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIHU4IHByZWFtYmxlX3R5cGUpCit3bGNfY2FsY19hY2tfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKIAl1aW50IGR1ciA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2Fja190aW1lOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAotCQkgIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfY2FsY19hY2tfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiAJLyogU3BlYyA5LjY6IGFjayByYXRlIGlzIHRoZSBoaWdoZXN0IHJhdGUgaW4gQlNTQmFzaWNSYXRlU2V0IHRoYXQgaXMgbGVzcyB0aGFuCiAJICogb3IgZXF1YWwgdG8gdGhlIHJhdGUgb2YgdGhlIGltbWVkaWF0ZWx5IHByZXZpb3VzIGZyYW1lIGluIHRoZSBGRVMKIAkgKi8KQEAgLTc0OTEsMTUgKzcyNzUsMTUgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2N0c190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKK3dsY19jYWxjX2N0c190aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfY3RzX3RpbWU6IHJhdGVzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2N0c190aW1lOiByYXRlc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKTsKIAlyZXR1cm4gd2xjX2NhbGNfYWNrX3RpbWUod2xjLCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiB9CiAKIC8qIGRlcml2ZSB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbXSB0YWJsZSBmcm9tICdyYXRlc2V0JyAqLwotdm9pZCB3bGNfcmF0ZV9sb29rdXBfaW5pdCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJhdGVzZXQpCit2b2lkIHdsY19yYXRlX2xvb2t1cF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpyYXRlc2V0KQogewogCXU4IHJhdGU7CiAJdTggbWFuZGF0b3J5OwpAQCAtNzUwOSw3ICs3MjkzLDcgQEAKIAl1aW50IGk7CiAKIAkvKiBpbmNvbWluZyByYXRlcyBhcmUgaW4gNTAwa2JwcyB1bml0cyBhcyBpbiA4MDIuMTEgU3VwcG9ydGVkIFJhdGVzICovCi0JYnplcm8oYnIsIFdMQ19NQVhSQVRFICsgMSk7CisJbWVtc2V0KGJyLCAwLCBXTENfTUFYUkFURSArIDEpOwogCiAJLyogRm9yIGVhY2ggYmFzaWMgcmF0ZSBpbiB0aGUgcmF0ZXMgbGlzdCwgbWFrZSBhbiBlbnRyeSBpbiB0aGUKIAkgKiBiZXN0IGJhc2ljIGxvb2t1cC4KQEAgLTc1MjMsNyArNzMwNyw4IEBACiAJCXJhdGUgPSAocmF0ZXNldC0+cmF0ZXNbaV0gJiBSQVRFX01BU0spOwogCiAJCWlmIChyYXRlID4gV0xDX01BWFJBVEUpIHsKLQkJCVdMX0VSUk9SKCgid2xjX3JhdGVfbG9va3VwX2luaXQ6IGludmFsaWQgcmF0ZSAweCVYIGluIHJhdGUgc2V0XG4iLCByYXRlc2V0LT5yYXRlc1tpXSkpOworCQkJV0xfRVJST1IoIndsY19yYXRlX2xvb2t1cF9pbml0OiBpbnZhbGlkIHJhdGUgMHglWCBpbiByYXRlIHNldFxuIiwKKwkJCQkgcmF0ZXNldC0+cmF0ZXNbaV0pOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzU4OCw3ICs3MzczLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9yYXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfcmF0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCiB7CiAJdTggcGh5X3JhdGUsIGluZGV4OwogCXU4IGJhc2ljX3BoeV9yYXRlLCBiYXNpY19pbmRleDsKQEAgLTc2MjEsNyArNzQwNiw3IEBACiAJd2xjX3dyaXRlX3NobSh3bGMsIChiYXNpY190YWJsZSArIGluZGV4ICogMiksIGJhc2ljX3B0cik7CiB9CiAKLXN0YXRpYyBjb25zdCB3bGNfcmF0ZXNldF90ICp3bGNfcmF0ZXNldF9nZXRfaHdycyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgY29uc3Qgd2xjX3JhdGVzZXRfdCAqd2xjX3JhdGVzZXRfZ2V0X2h3cnMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY29uc3Qgd2xjX3JhdGVzZXRfdCAqcnNfZGZsdDsKIApAQCAtNzYzOCw3ICs3NDIzLDcgQEAKIAlyZXR1cm4gcnNfZGZsdDsKIH0KIAotdm9pZCB3bGNfc2V0X3JhdGV0YWJsZSh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWNvbnN0IHdsY19yYXRlc2V0X3QgKnJzX2RmbHQ7CiAJd2xjX3JhdGVzZXRfdCByczsKQEAgLTc2NzQsNyArNzQ1OSw4IEBACiAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJhdGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmFuZC4KICAqIFdMQ19CQU5EX0FVVE8gaW5kaWNhdGVzIHRoZSBjdXJyZW50IGJhbmQuCiAgKi8KLWJvb2wgd2xjX3ZhbGlkX3JhdGUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBpbnQgYmFuZCwgYm9vbCB2ZXJib3NlKQorYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgaW50IGJhbmQsCisJCSAgICBib29sIHZlcmJvc2UpCiB7CiAJd2xjX3JhdGVzZXRfdCAqaHdfcmF0ZXNldDsKIAl1aW50IGk7CkBAIC03NzAxLDE2ICs3NDg3LDE3IEBACiAJCQlyZXR1cm4gdHJ1ZTsKICBlcnJvcjoKIAlpZiAodmVyYm9zZSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY192YWxpZF9yYXRlOiByYXRlIHNwZWMgMHgleCBub3QgaW4gaHdfcmF0ZXNldFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdmFsaWRfcmF0ZTogcmF0ZSBzcGVjIDB4JXggbm90IGluIGh3X3JhdGVzZXRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApCitzdGF0aWMgdm9pZCB3bGNfdXBkYXRlX21pbW9fYmFuZF9id2NhcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggYndjYXApCiB7CiAJdWludCBpOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAogCWZvciAoaSA9IDA7IGkgPCBOQkFORFMod2xjKTsgaSsrKSB7CiAJCWlmIChJU19TSU5HTEVCQU5EXzVHKHdsYy0+ZGV2aWNlaWQpKQpAQCAtNzczNCw3ICs3NTIxLDcgQEAKIAl3bGMtPm1pbW9fYmFuZF9id2NhcCA9IGJ3Y2FwOwogfQogCi12b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHdsY19pbmZvX3QgKndsYywgdWludCBmcmFtZV9sZW4pCit2b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZyYW1lX2xlbikKIHsKIAljb25zdCB3bGNfcmF0ZXNldF90ICpyc19kZmx0OwogCXdsY19yYXRlc2V0X3QgcnM7CkBAIC03Nzc3LDE0ICs3NTY0LDE0IEBACiB9CiAKIHUxNgotd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgYm9vbCBzaG9ydF9wcmVhbWJsZSwKLQkJICAgICAgYm9vbCBwaHlkZWxheSkKK3dsY19jb21wdXRlX2JjbnRzZm9mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKKwkJICAgICAgYm9vbCBzaG9ydF9wcmVhbWJsZSwgYm9vbCBwaHlkZWxheSkKIHsKIAl1aW50IGJjbnRzZm9mZiA9IDA7CiAKIAlpZiAoSVNfTUNTKHJzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHJlY2QgYmVhY29uIHdpdGggbWNzIHJhdGU7IHJzcGVjIDB4JXhcbiIsCi0JCQkgIHdsYy0+cHViLT51bml0LCByc3BlYykpOworCQlXTF9FUlJPUigid2wlZDogcmVjZCBiZWFjb24gd2l0aCBtY3MgcmF0ZTsgcnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMpOwogCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJLyogdHggZGVsYXkgZnJvbSBNQUMgdGhyb3VnaCBwaHkgdG8gYWlyICgyLjEgdXNlYykgKwogCQkgKiBwaHkgaGVhZGVyIHRpbWUgKHByZWFtYmxlICsgUExDUCBTSUdOQUwgPT0gMjAgdXNlYykgKwpAQCAtNzgyNCw3ICs3NjExLDcgQEAKICAqCWFuZCBpbmNsdWRlZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSA0IGJ5dGUgRkNTLgogICovCiBzdGF0aWMgdm9pZAotd2xjX2Jjbl9wcmJfdGVtcGxhdGUod2xjX2luZm9fdCAqd2xjLCB1aW50IHR5cGUsIHJhdGVzcGVjX3QgYmNuX3JzcGVjLAord2xjX2Jjbl9wcmJfdGVtcGxhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHlwZSwgcmF0ZXNwZWNfdCBiY25fcnNwZWMsCiAJCSAgICAgd2xjX2Jzc2NmZ190ICpjZmcsIHUxNiAqYnVmLCBpbnQgKmxlbikKIHsKIAljY2tfcGh5X2hkcl90ICpwbGNwOwpAQCAtNzg0Myw3ICs3NjMwLDcgQEAKIAkqbGVuID0gaGRyX2xlbiArIGJvZHlfbGVuOwkvKiByZXR1cm4gYWN0dWFsIHNpemUgKi8KIAogCS8qIGZvcm1hdCBQSFkgYW5kIE1BQyBoZWFkZXJzICovCi0JYnplcm8oKGNoYXIgKilidWYsIGhkcl9sZW4pOworCW1lbXNldCgoY2hhciAqKWJ1ZiwgMCwgaGRyX2xlbik7CiAKIAlwbGNwID0gKGNja19waHlfaGRyX3QgKikgYnVmOwogCkBAIC03ODcyLDkgKzc2NTksOSBAQAogCS8qIEExIGZpbGxlZCBpbiBieSBNQUMgZm9yIHByYiByZXNwLCBicm9hZGNhc3QgZm9yIGJjbiAqLwogCWlmICh0eXBlID09IEZDX0JFQUNPTikKIAkJYmNvcHkoKGNvbnN0IGNoYXIgKikmZXRoZXJfYmNhc3QsIChjaGFyICopJmgtPmRhLAotCQkgICAgICBFVEhFUl9BRERSX0xFTik7Ci0JYmNvcHkoKGNoYXIgKikmY2ZnLT5jdXJfZXRoZXJhZGRyLCAoY2hhciAqKSZoLT5zYSwgRVRIRVJfQUREUl9MRU4pOwotCWJjb3B5KChjaGFyICopJmNmZy0+QlNTSUQsIChjaGFyICopJmgtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgIEVUSF9BTEVOKTsKKwliY29weSgoY2hhciAqKSZjZmctPmN1cl9ldGhlcmFkZHIsIChjaGFyICopJmgtPnNhLCBFVEhfQUxFTik7CisJYmNvcHkoKGNoYXIgKikmY2ZnLT5CU1NJRCwgKGNoYXIgKikmaC0+YnNzaWQsIEVUSF9BTEVOKTsKIAogCS8qIFNFUSBmaWxsZWQgaW4gYnkgTUFDICovCiAKQEAgLTc4OTEsNyArNzY3OCw3IEBACiAgKiB0ZW1wbGF0ZSB1cGRhdGVkLgogICogT3RoZXJ3aXNlLCBpdCB1cGRhdGVzIHRoZSBoYXJkd2FyZSB0ZW1wbGF0ZS4KICAqLwotdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX2Jzc191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKIHsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwogCkBAIC03OTA3LDcgKzc2OTQsNyBAQAogCQl1MTYgYmNuW0JDTl9UTVBMX0xFTiAvIDJdOwogCQl1MzIgYm90aF92YWxpZCA9IE1DTURfQkNOMFZMRCB8IE1DTURfQkNOMVZMRDsKIAkJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwotCQlvc2xfdCAqb3NoID0gTlVMTDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBOVUxMOwogCiAJCW9zaCA9IHdsYy0+b3NoOwogCkBAIC03OTQ0LDcgKzc3MzEsNyBAQAogLyoKICAqIFVwZGF0ZSBhbGwgYmVhY29ucyBmb3IgdGhlIHN5c3RlbS4KICAqLwotdm9pZCB3bGNfdXBkYXRlX2JlYWNvbih3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CkBAIC03OTU3LDE0ICs3NzQ0LDE0IEBACiB9CiAKIC8qIFdyaXRlIHNzaWQgaW50byBzaGFyZWQgbWVtb3J5ICovCi12b2lkIHdsY19zaG1fc3NpZF91cGQod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX3NobV9zc2lkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJdTggKnNzaWRwdHIgPSBjZmctPlNTSUQ7CiAJdTE2IGJhc2UgPSBNX1NTSUQ7CiAJdTggc3NpZGJ1ZltET1QxMV9NQVhfU1NJRF9MRU5dOwogCiAJLyogcGFkZGluZyB0aGUgc3NpZCB3aXRoIHplcm8gYW5kIGNvcHkgaXQgaW50byBzaG0gKi8KLQliemVybyhzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOworCW1lbXNldChzc2lkYnVmLCAwLCBET1QxMV9NQVhfU1NJRF9MRU4pOwogCWJjb3B5KHNzaWRwdHIsIHNzaWRidWYsIGNmZy0+U1NJRF9sZW4pOwogCiAJd2xjX2NvcHl0b19zaG0od2xjLCBiYXNlLCBzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOwpAQCAtNzk3Myw3ICs3NzYwLDcgQEAKIAkJd2xjX3dyaXRlX3NobSh3bGMsIE1fU1NJRExFTiwgKHUxNikgY2ZnLT5TU0lEX2xlbik7CiB9CiAKLXZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHdsY19pbmZvX3QgKndsYywgYm9vbCBzdXNwZW5kKQordm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqYnNzY2ZnOwpAQCAtNzk4Niw3ICs3NzczLDcgQEAKIH0KIAogdm9pZAotd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLCBib29sIHN1c3BlbmQpCit3bGNfYnNzX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKQogewogCXUxNiBwcmJfcmVzcFtCQ05fVE1QTF9MRU4gLyAyXTsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwpAQCAtODAyNyw5ICs3ODE0LDkgQEAKIH0KIAogLyogcHJlcGFyZXMgcGR1IGZvciB0cmFuc21pc3Npb24uIHJldHVybnMgQkNNIGVycm9yIGNvZGVzICovCi1pbnQgd2xjX3ByZXBfcGR1KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcGR1LCB1aW50ICpmaWZvcCkKK2ludCB3bGNfcHJlcF9wZHUoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwZHUsIHVpbnQgKmZpZm9wKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdWludCBmaWZvOwogCWQxMXR4aF90ICp0eGg7CiAJc3RydWN0IGRvdDExX2hlYWRlciAqaDsKQEAgLTgwMzksNyArNzgyNiw3IEBACiAJb3NoID0gd2xjLT5vc2g7CiAKIAlBU1NFUlQocGR1KTsKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwZHUpOworCXR4aCA9IChkMTF0eGhfdCAqKSAocGR1LT5kYXRhKTsKIAlBU1NFUlQodHhoKTsKIAloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoKHU4ICopICh0eGggKyAxKSArIEQxMV9QSFlfSERSX0xFTik7CiAJQVNTRVJUKGgpOwpAQCAtODA2Niw3ICs3ODUzLDcgQEAKIH0KIAogLyogaW5pdCB0eCByZXBvcnRlZCByYXRlIG1lY2hhbmlzbSAqLwotdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaTsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKQEAgLTgwODAsMTMgKzc4NjcsMTMgQEAKIHZvaWQgd2xjX2Jzc2NmZ19yZXByYXRlX2luaXQod2xjX2Jzc2NmZ190ICpic3NjZmcpCiB7CiAJYnNzY2ZnLT50eHJzcGVjaWR4ID0gMDsKLQliemVybygoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOworCW1lbXNldCgoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgMCwgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOwogfQogCiAvKiBSZXRyaWV2ZSBhIGNvbnNvbGlkYXRlZCBzZXQgb2YgcmV2aXNpb24gaW5mb3JtYXRpb24sCiAgKiB0eXBpY2FsbHkgZm9yIHRoZSBXTENfR0VUX1JFVklORk8gaW9jdGwKICAqLwotaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pCitpbnQgd2xjX2dldF9yZXZpc2lvbl9pbmZvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICpidWYsIHVpbnQgbGVuKQogewogCXdsY19yZXZfaW5mb190ICpyaW5mbyA9ICh3bGNfcmV2X2luZm9fdCAqKSBidWY7CiAKQEAgLTgxMjAsNyArNzkwNyw3IEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXZvaWQgd2xjX2RlZmF1bHRfcmF0ZXNldCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQordm9pZCB3bGNfZGVmYXVsdF9yYXRlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAl3bGNfcmF0ZXNldF9kZWZhdWx0KHJzLCBOVUxMLCB3bGMtPmJhbmQtPnBoeXR5cGUsIHdsYy0+YmFuZC0+YmFuZHR5cGUsCiAJCQkgICAgZmFsc2UsIFJBVEVfTUFTS19GVUxMLCAoYm9vbCkgTl9FTkFCKHdsYy0+cHViKSwKQEAgLTgxMjgsMTQgKzc5MTUsMTQgQEAKIAkJCSAgICB3bGMtPnN0Zi0+dHhzdHJlYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYzsKLQl3bGNiYW5kX3QgKmJhbmQ7CisJc3RydWN0IHdsY2JhbmQgKmJhbmQ7CiAJd2xjX2Jzc19pbmZvX3QgKmJpID0gd2xjLT5kZWZhdWx0X2JzczsKIAogCS8qIGluaXQgZGVmYXVsdCBhbmQgdGFyZ2V0IEJTUyB3aXRoIHNvbWUgc2FuZSBpbml0aWFsIHZhbHVlcyAqLwotCWJ6ZXJvKChjaGFyICopKGJpKSwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CisJbWVtc2V0KChjaGFyICopKGJpKSwgMCwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CiAJYmktPmJlYWNvbl9wZXJpb2QgPSBJU1NJTV9FTkFCKHdsYy0+cHViLT5zaWgpID8gQkVBQ09OX0lOVEVSVkFMX0RFRl9RVCA6CiAJICAgIEJFQUNPTl9JTlRFUlZBTF9ERUZBVUxUOwogCWJpLT5kdGltX3BlcmlvZCA9IElTU0lNX0VOQUIod2xjLT5wdWItPnNpaCkgPyBEVElNX0lOVEVSVkFMX0RFRl9RVCA6CkBAIC04MTY2LDcgKzc5NTMsNyBAQAogLyogRGVmZXJyZWQgZXZlbnQgcHJvY2Vzc2luZyAqLwogc3RhdGljIHZvaWQgd2xjX3Byb2Nlc3NfZXZlbnRxKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfZXZlbnRfdCAqZXRtcDsKIAogCXdoaWxlICgoZXRtcCA9IHdsY19ldmVudHFfZGVxKHdsYy0+ZXZlbnRxKSkpIHsKQEAgLTgxOTIsNyArNzk3OSw4IEBACiB9CiAKIHN0YXRpYyByYXRlc3BlY190Ci1tYWM4MDIxMV93bGNfc2V0X25yYXRlKHdsY19pbmZvX3QgKndsYywgd2xjYmFuZF90ICpjdXJfYmFuZCwgdTMyIGludF92YWwpCittYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqY3VyX2JhbmQsCisJCSAgICAgICB1MzIgaW50X3ZhbCkKIHsKIAl1OCBzdGYgPSAoaW50X3ZhbCAmIE5SQVRFX1NURl9NQVNLKSA+PiBOUkFURV9TVEZfU0hJRlQ7CiAJdTggcmF0ZSA9IGludF92YWwgJiBOUkFURV9SQVRFX01BU0s7CkBAIC04MjExLDggKzc5OTksOCBAQAogCWlmIChOX0VOQUIod2xjLT5wdWIpICYmIGlzbWNzKSB7CiAJCS8qIG1jcyBvbmx5IGFsbG93ZWQgd2hlbiBubW9kZSAqLwogCQlpZiAoc3RmID4gUEhZX1RYQzFfTU9ERV9TRE0pIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJYmNtZXJyb3IgPSBCQ01FX1JBTkdFOwogCQkJZ290byBkb25lOwogCQl9CkBAIC04MjIyLDggKzgwMTAsOCBAQAogCQkJaWYgKCFDSFNQRUNfSVM0MCh3bGMtPmhvbWVfY2hhbnNwZWMpIHx8CiAJCQkgICAgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKQogCQkJICAgICAmJiAoc3RmICE9IFBIWV9UWEMxX01PREVfQ0REKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIG1jcyAzMlxuIiwKLQkJCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgbWNzIDMyXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJZ290byBkb25lOwogCQkJfQpAQCAtODIzMSw3ICs4MDE5LDggQEAKIAkJfSBlbHNlIGlmIChyYXRlID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykgewogCQkJLyogbWNzID4gNyBtdXN0IHVzZSBzdGYgU0RNICovCiAJCQlpZiAoc3RmICE9IFBIWV9UWEMxX01PREVfU0RNKSB7Ci0JCQkJV0xfVFJBQ0UoKCJ3bCVkOiAlczogZW5hYmxpbmcgU0RNIG1vZGUgZm9yIG1jcyAlZFxuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKSk7CisJCQkJV0xfVFJBQ0UoIndsJWQ6ICVzOiBlbmFibGluZyBTRE0gbW9kZSBmb3IgbWNzICVkXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKTsKIAkJCQlzdGYgPSBQSFlfVFhDMV9NT0RFX1NETTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTgyMzksMzcgKzgwMjgsMzcgQEAKIAkJCWlmICgoc3RmID4gUEhZX1RYQzFfTU9ERV9TVEJDKSB8fAogCQkJICAgICghV0xDX1NUQkNfQ0FQX1BIWSh3bGMpCiAJCQkgICAgICYmIChzdGYgPT0gUEhZX1RYQzFfTU9ERV9TVEJDKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCi0JCQkJCSAgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCisJCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKElTX09GRE0ocmF0ZSkpIHsKIAkJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9DREQpICYmIChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBPRkRNXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgT0ZETVxuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSBpZiAoSVNfQ0NLKHJhdGUpKSB7CiAJCWlmICgoY3VyX2JhbmQtPmJhbmR0eXBlICE9IFdMQ19CQU5EXzJHKQogCQkgICAgfHwgKHN0ZiAhPSBQSFlfVFhDMV9NT0RFX1NJU08pKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwgV0xDV0xVTklUKHdsYyksCi0JCQkJICBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IFVua25vd24gcmF0ZSB0eXBlXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBVbmtub3duIHJhdGUgdHlwZVxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CiAJLyogbWFrZSBzdXJlIG11bHRpcGxlIGFudGVubmFlIGFyZSBhdmFpbGFibGUgZm9yIG5vbi1zaXNvIHJhdGVzICovCiAJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSAmJiAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBTSVNPIGFudGVubmEgYnV0ICFTSVNPIHJlcXVlc3RcbiIsCi0JCQkgIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IFNJU08gYW50ZW5uYSBidXQgIVNJU08gcmVxdWVzdFxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC04MzAwLDEzICs4MDg5LDEzIEBACiAKIAlyZXR1cm4gcnNwZWM7CiAgZG9uZToKLQlXTF9FUlJPUigoIkhvYXJrXG4iKSk7CisJV0xfRVJST1IoIkhvYXJrXG4iKTsKIAlyZXR1cm4gcmF0ZTsKIH0KIAogLyogZm9ybXVsYTogIElETEVfQlVTWV9SQVRJT19YXzE2ID0gKDEwMC1kdXR5X2N5Y2xlKS9kdXR5X2N5Y2xlKjE2ICovCiBzdGF0aWMgaW50Ci13bGNfZHV0eV9jeWNsZV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgZHV0eV9jeWNsZSwgYm9vbCBpc09GRE0sCit3bGNfZHV0eV9jeWNsZV9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBkdXR5X2N5Y2xlLCBib29sIGlzT0ZETSwKIAkJICAgYm9vbCB3cml0ZVRvU2htKQogewogCWludCBpZGxlX2J1c3lfcmF0aW9feF8xNiA9IDA7CkBAIC04MzE0LDggKzgxMDMsNyBAQAogCSAgICBpc09GRE0gPyBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X09GRE0gOgogCSAgICBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X0NDSzsKIAlpZiAoZHV0eV9jeWNsZSA+IDEwMCB8fCBkdXR5X2N5Y2xlIDwgMCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCQlyZXR1cm4gQkNNRV9SQU5HRTsKIAl9CiAJaWYgKGR1dHlfY3ljbGUpCkBAIC04MzM1LDcgKzgxMjMsNyBAQAogLyogUmVhZCBhIHNpbmdsZSB1MTYgZnJvbSBzaGFyZWQgbWVtb3J5LgogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcwogICovCi11MTYgd2xjX3JlYWRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQpCit1MTYgd2xjX3JlYWRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCkKIHsKIAlyZXR1cm4gd2xjX2JtYWNfcmVhZF9zaG0od2xjLT5odywgb2Zmc2V0KTsKIH0KQEAgLTgzNDMsNyArODEzMSw3IEBACiAvKiBXcml0ZSBhIHNpbmdsZSB1MTYgdG8gc2hhcmVkIG1lbW9yeS4KICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MKICAqLwotdm9pZCB3bGNfd3JpdGVfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2KQordm9pZCB3bGNfd3JpdGVfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfc2htKHdsYy0+aHcsIG9mZnNldCwgdik7CiB9CkBAIC04MzUyLDcgKzgxNDAsNyBAQAogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcyBhbmQKICAqIFJhbmdlIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX3NldF9zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCit2b2lkIHdsY19zZXRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCiB7CiAJLyogb2Zmc2V0IGFuZCBsZW4gbmVlZCB0byBiZSBldmVuICovCiAJQVNTRVJUKChvZmZzZXQgJiAxKSA9PSAwKTsKQEAgLTgzNjgsNyArODE1Niw3IEBACiAgKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAogICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX2NvcHl0b19zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQordm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM4NCw3ICs4MTcyLDcgQEAKICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MgYW5kCiAgKiBCdWZmZXIgbGVuZ3RoICdsZW4nIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKICAqLwotdm9pZCB3bGNfY29weWZyb21fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3ZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM5Nyw3MSArODE4NSw3MyBAQAogfQogCiAvKiB3cmFwcGVyIEJNQUMgZnVuY3Rpb25zIHRvIGZvciBISUdIIGRyaXZlciBhY2Nlc3MgKi8KLXZvaWQgd2xjX21jdHJsKHdsY19pbmZvX3QgKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCit2b2lkIHdsY19tY3RybChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJd2xjX2JtYWNfbWN0cmwod2xjLT5odywgbWFzaywgdmFsKTsKIH0KIAotdm9pZCB3bGNfY29yZXJlc2V0KHdsY19pbmZvX3QgKndsYywgdTMyIGZsYWdzKQordm9pZCB3bGNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgZmxhZ3MpCiB7CiAJd2xjX2JtYWNfY29yZXJlc2V0KHdsYy0+aHcsIGZsYWdzKTsKIH0KIAotdm9pZCB3bGNfbWhmKHdsY19pbmZvX3QgKndsYywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwgaW50IGJhbmRzKQordm9pZCB3bGNfbWhmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLCBpbnQgYmFuZHMpCiB7CiAJd2xjX2JtYWNfbWhmKHdsYy0+aHcsIGlkeCwgbWFzaywgdmFsLCBiYW5kcyk7CiB9CiAKLXUxNiB3bGNfbWhmX2dldCh3bGNfaW5mb190ICp3bGMsIHU4IGlkeCwgaW50IGJhbmRzKQordTE2IHdsY19taGZfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIGludCBiYW5kcykKIHsKIAlyZXR1cm4gd2xjX2JtYWNfbWhmX2dldCh3bGMtPmh3LCBpZHgsIGJhbmRzKTsKIH0KIAotaW50IHdsY194bXRmaWZvX3N6X2dldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQoraW50IHdsY194bXRmaWZvX3N6X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCB1aW50ICpibG9ja3MpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHdsYy0+aHcsIGZpZm8sIGJsb2Nrcyk7CiB9CiAKLXZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbSh3bGNfaW5mb190ICp3bGMsIGludCBvZmZzZXQsIGludCBsZW4sIHZvaWQgKmJ1ZikKK3ZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKKwkJCSAgICB2b2lkICpidWYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYy0+aHcsIG9mZnNldCwgbGVuLCBidWYpOwogfQogCi12b2lkIHdsY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjX2luZm9fdCAqd2xjLCB2b2lkICpiY24sIGludCBsZW4sIGJvb2wgYm90aCkKK3ZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorCQkJICAgICAgIGJvb2wgYm90aCkKIHsKIAl3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjLT5odywgYmNuLCBsZW4sIGJvdGgpOwogfQogCiB2b2lkCi13bGNfc2V0X2FkZHJtYXRjaCh3bGNfaW5mb190ICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAord2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAogCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQogewogCXdsY19ibWFjX3NldF9hZGRybWF0Y2god2xjLT5odywgbWF0Y2hfcmVnX29mZnNldCwgYWRkcik7CiB9CiAKLXZvaWQgd2xjX3NldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfc2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAl3bGNfYm1hY19zZXRfcmNtdGEod2xjLT5odywgaWR4LCBhZGRyKTsKIH0KIAotdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwgdTMyICp0c2ZfaF9wdHIpCit2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsIHUzMiAqdHNmX2hfcHRyKQogewogCXdsY19ibWFjX3JlYWRfdHNmKHdsYy0+aHcsIHRzZl9sX3B0ciwgdHNmX2hfcHRyKTsKIH0KIAotdm9pZCB3bGNfc2V0X2N3bWluKHdsY19pbmZvX3QgKndsYywgdTE2IG5ld21pbikKK3ZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbikKIHsKIAl3bGMtPmJhbmQtPkNXbWluID0gbmV3bWluOwogCXdsY19ibWFjX3NldF9jd21pbih3bGMtPmh3LCBuZXdtaW4pOwogfQogCi12b2lkIHdsY19zZXRfY3dtYXgod2xjX2luZm9fdCAqd2xjLCB1MTYgbmV3bWF4KQordm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KQogewogCXdsYy0+YmFuZC0+Q1dtYXggPSBuZXdtYXg7CiAJd2xjX2JtYWNfc2V0X2N3bWF4KHdsYy0+aHcsIG5ld21heCk7CiB9CiAKLXZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfZmlmb2Vycm9ycyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAogCXdsY19ibWFjX2ZpZm9lcnJvcnMod2xjLT5odyk7CkBAIC04NDY5LDE5ICs4MjU5LDE2IEBACiAKIC8qIFNlYXJjaCBtZW0gcncgdXRpbGl0aWVzICovCiAKLXZvaWQgd2xjX3BsbHJlcSh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQordm9pZCB3bGNfcGxscmVxKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKIHsKIAl3bGNfYm1hY19wbGxyZXEod2xjLT5odywgc2V0LCByZXFfYml0KTsKIH0KIAotdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0X2JtYWNfZG9uZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2xjLT5yZXNldF9ibWFjX3BlbmRpbmcgPSBmYWxzZTsKLSNlbmRpZgogfQogCi12b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHU4IG1pbW9wc19tb2RlKQordm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKQogewogCXdsYy0+aHRfY2FwLmNhcCAmPSB+SFRfQ0FQX01JTU9fUFNfTUFTSzsKIAl3bGMtPmh0X2NhcC5jYXAgfD0gKG1pbW9wc19tb2RlIDw8IEhUX0NBUF9NSU1PX1BTX1NISUZUKTsKQEAgLTg0OTQsNyArODI4MSw3IEBACiAKIC8qIGNoZWNrIGZvciB0aGUgcGFydGljdWxhciBwcmlvcml0eSBmbG93IGNvbnRyb2wgYml0IGJlaW5nIHNldCAqLwogYm9vbAotd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKK3dsY190eGZsb3djb250cm9sX3ByaW9faXNzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKIHsKIAl1aW50IHByaW9fbWFzazsKIApAQCAtODUwOSwxMiArODI5NiwxMyBAQAogfQogCiAvKiBwcm9wb2dhdGUgdGhlIGZsb3cgY29udHJvbCB0byBhbGwgaW50ZXJmYWNlcyB1c2luZyB0aGUgZ2l2ZW4gdHggcXVldWUgKi8KLXZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sIGludCBwcmlvKQordm9pZCB3bGNfdHhmbG93Y29udHJvbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAorCQkgICAgICAgYm9vbCBvbiwgaW50IHByaW8pCiB7CiAJdWludCBwcmlvX2JpdHM7CiAJdWludCBjdXJfYml0czsKIAotCVdMX0VSUk9SKCgiJXM6IGZsb3cgY29udHJvIGtpY2tzIGluXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogZmxvdyBjb250cm9sIGtpY2tzIGluXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAocHJpbyA9PSBBTExQUklPKSB7CiAJCXByaW9fYml0cyA9IFRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSzsKQEAgLTg1NTEsNyArODMzOSw3IEBACiB9CiAKIHZvaWQKLXdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfb3ZlcnJpZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwgYm9vbCBvbiwKIAkJCSAgIHVpbnQgb3ZlcnJpZGUpCiB7CiAJdWludCBwcmV2X292ZXJyaWRlOwpAQCAtODU5OCw3ICs4Mzg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY190eHFfaW5mb190ICpxaTsKIApAQCAtODYxMSwxMCArODM5OSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotd2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgaW50IHByaW8pCiB7Ci0Jd2xjX2lmX3QgKndsY2lmOworCXN0cnVjdCB3bGNfaWYgKndsY2lmOwogCiAJZm9yICh3bGNpZiA9IHdsYy0+d2xjaWZfbGlzdDsgd2xjaWYgIT0gTlVMTDsgd2xjaWYgPSB3bGNpZi0+bmV4dCkgewogCQlpZiAod2xjaWYtPnFpID09IHFpICYmIHdsY2lmLT5mbGFncyAmIFdMQ19JRl9MSU5LRUQpCkBAIC04NjIyLDcgKzg0MTAsNyBAQAogCX0KIH0KIAotc3RhdGljIHdsY190eHFfaW5mb190ICp3bGNfdHhxX2FsbG9jKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCkKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJd2xjX3R4cV9pbmZvX3QgKnFpLCAqcDsKIApAQCAtODY1Miw3ICs4NDQwLDggQEAKIAlyZXR1cm4gcWk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eHFfZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIHdsY190eHFfaW5mb190ICpxaSkKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKQogewogCXdsY190eHFfaW5mb190ICpwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCmluZGV4IDZhNzc1OTEuLjVkZjk5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCkBAIC0xNywxOSArMTcsMTAgQEAKICNpZm5kZWYgX3dsY19oXwogI2RlZmluZSBfd2xjX2hfCiAKLSNpbmNsdWRlIDx3bGNfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHdsX2RiZy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2hhbC5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+Ci0jaWZkZWYgV0xDX1NQTElUCi0jaW5jbHVkZSA8YmNtX3JwYy5oPgotI2VuZGlmCi0KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+Ci0KICNpbmNsdWRlIDx3bGNfc2NiLmg+CiAKICNkZWZpbmUgTUFfV0lORE9XX1NaCQk4CS8qIG1vdmluZyBhdmVyYWdlIHdpbmRvdyBzaXplICovCkBAIC0yMjAsMTUgKzIxMSwxMSBAQAogICogKHNvbWUgcGxhdGZvcm1zIHJldHVybiBhbGwgMCkuCiAgKiBJZiBjbG9ja3MgYXJlIHByZXNlbnQsIGNhbGwgdGhlIHNiIHJvdXRpbmUgd2hpY2ggd2lsbCBmaWd1cmUgb3V0IGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZC4KICAqLwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgREVWSUNFUkVNT1ZFRCh3bGMpCSghd2xjLT5kZXZpY2VfcHJlc2VudCkKLSNlbHNlCiAjZGVmaW5lIERFVklDRVJFTU9WRUQod2xjKSAgICAgIFwKIAkoKHdsYy0+aHctPmNsaykgPyAgIFwKIAkoKFJfUkVHKHdsYy0+aHctPm9zaCwgJndsYy0+aHctPnJlZ3MtPm1hY2NvbnRyb2wpICYgXAogCShNQ1RMX1BTTV9KTVBfMCB8IE1DVExfSUhSX0VOKSkgIT0gTUNUTF9JSFJfRU4pIDogXAogCShzaV9kZXZpY2VyZW1vdmVkKHdsYy0+aHctPnNpaCkpKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogI2RlZmluZSBXTENXTFVOSVQod2xjKQkJKCh3bGMpLT5wdWItPnVuaXQpCiAKQEAgLTMxNSwyMiArMzAyLDIwIEBACiAvKgogICogY29yZSBzdGF0ZSAobWFjKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNjb3JlIHsKLSNpZmRlZiBXTENfTE9XCitzdHJ1Y3Qgd2xjY29yZSB7CiAJdWludCBjb3JlaWR4OwkJLyogIyBzYiBlbnVtZXJhdGVkIGNvcmUgKi8KIAogCS8qIGZpZm8gKi8KIAl1aW50ICp0eGF2YWlsW05GSUZPXTsJLyogIyB0eCBkZXNjcmlwdG9ycyBhdmFpbGFibGUgKi8KIAlzMTYgdHhwa3RwZW5kW05GSUZPXTsJLyogdHggYWRtaXNzaW9uIGNvbnRyb2wgKi8KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAltYWNzdGF0X3QgKm1hY3N0YXRfc25hcHNob3Q7CS8qIG1hYyBodyBwcmV2IHJlYWQgdmFsdWVzICovCi19IHdsY2NvcmVfdDsKK307CiAKIC8qCiAgKiBiYW5kIHN0YXRlIChwaHkrYW5hK3JhZGlvKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNiYW5kIHsKK3N0cnVjdCB3bGNiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KIApAQCAtMzU5LDEzICszNDQsMTMgQEAKIAl1MTYgQ1dtaW47CQkvKiBUaGUgbWluaW11bSBzaXplIG9mIGNvbnRlbnRpb24gd2luZG93LCBpbiB1bml0IG9mIGFTbG90VGltZSAqLwogCXUxNiBDV21heDsJCS8qIFRoZSBtYXhpbXVtIHNpemUgb2YgY29udGVudGlvbiB3aW5kb3csIGluIHVuaXQgb2YgYVNsb3RUaW1lICovCiAJdTE2IGJjbnRzZm9mZjsJLyogYmVhY29uIHRzZiBvZmZzZXQgKi8KLX0gd2xjYmFuZF90OworfTsKIAogLyogZ2VuZXJpYyBmdW5jdGlvbiBjYWxsYmFjayB0YWtlcyBqdXN0IG9uZSBhcmcgKi8KIHR5cGVkZWYgdm9pZCAoKmNiX2ZuX3QpICh2b2lkICopOwogCiAvKiB0eCBjb21wbGV0aW9uIGNhbGxiYWNrIHRha2VzIDMgYXJncyAqLwotdHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAod2xjX2luZm9fdCAqd2xjLCB1aW50IHR4c3RhdHVzLCB2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHhzdGF0dXMsIHZvaWQgKmFyZyk7CiAKIHR5cGVkZWYgc3RydWN0IHBrdF9jYiB7CiAJcGtjYl9mbl90IGZuOwkJLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHR4IGZyYW1lIGNvbXBsZXRlcyAqLwpAQCAtMzk4LDE0ICszODMsMTQgQEAKIAogLyogdmlydHVhbCBpbnRlcmZhY2UgKi8KIHN0cnVjdCB3bGNfaWYgewotCXdsY19pZl90ICpuZXh0OworCXN0cnVjdCB3bGNfaWYgKm5leHQ7CiAJdTggdHlwZTsJCS8qIFdMQ19JRlRZUEVfQlNTIG9yIFdMQ19JRlRZUEVfV0RTICovCiAJdTggaW5kZXg7CQkvKiBhc3NpZ25lZCBpbiB3bF9hZGRfaWYoKSwgaW5kZXggb2YgdGhlIHdsaWYgaWYgYW55LAogCQkJCSAqIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kaW5nIHRvIGJzc2NmZy5faWR4IG9yCiAJCQkJICogQUlEMlBWQk1BUChzY2IpLgogCQkJCSAqLwogCXU4IGZsYWdzOwkJLyogZmxhZ3MgZm9yIHRoZSBpbnRlcmZhY2UgKi8KLQl3bF9pZl90ICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCisJc3RydWN0IHdsX2lmICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCiAJc3RydWN0IHdsY190eHFfaW5mbyAqcWk7CS8qIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0eCBxdWV1ZSAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHNjYiAqc2NiOwkvKiBwb2ludGVyIHRvIHNjYiBpZiBXTENfSUZUWVBFX1dEUyAqLwpAQCAtNDE2LDcgKzQwMSw2IEBACiAvKiBmbGFncyBmb3IgdGhlIGludGVyZmFjZSAqLwogI2RlZmluZSBXTENfSUZfTElOS0VECQkweDAyCS8qIHRoaXMgaW50ZXJmYWNlIGlzIGxpbmtlZCB0byBhIHdsX2lmICovCiAKLSNpZmRlZiBXTENfTE9XCiB0eXBlZGVmIHN0cnVjdCB3bGNfaHdiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KQEAgLTQzMywyMCArNDE3LDE1IEBACiAJd2xjX3BoeV90ICpwaTsJCS8qIHBvaW50ZXIgdG8gcGh5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCiAJYm9vbCBhYmdwaHlfZW5jb3JlOwogfSB3bGNfaHdiYW5kX3Q7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiBzdHJ1Y3Qgd2xjX2h3X2luZm8gewotI2lmZGVmIFdMQ19TUExJVAotCXJwY19pbmZvX3QgKnJwYzsJLyogSGFuZGxlIHRvIFJQQyBtb2R1bGUgKi8KLSNlbmRpZgotCW9zbF90ICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KIAlib29sIF9waW9tb2RlOwkJLyogdHJ1ZSBpZiBwaW8gbW9kZSAqLwotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAogCS8qIGZpZm8gKi8KLQlobmRkbWFfdCAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KKwlzdHJ1Y3QgaG5kZG1hX3B1YiAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KIAotI2lmZGVmIFdMQ19MT1cKIAl1aW50IHVuaXQ7CQkvKiBkZXZpY2UgaW5zdGFuY2UgbnVtYmVyICovCiAKIAkvKiB2ZXJzaW9uIGluZm8gKi8KQEAgLTQ5NywzMSArNDc2LDIxIEBACiAJYm9vbCBmb3JjZWZhc3RjbGs7CS8qIHRydWUgaWYgdGhlIGgvdyBpcyBmb3JjaW5nIHRoZSB1c2Ugb2YgZmFzdCBjbGsgKi8KIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAlib29sIHNiY2xrOwkJLyogc2IgaGFzIGNsb2NrICovCi0JYm1hY19wbXFfdCAqYm1hY19wbXE7CS8qICBibWFjIFBNIHN0YXRlcyBkZXJpdmVkIGZyb20gdWNvZGUgUE1RICovCisJc3RydWN0IGJtYWNfcG1xICpibWFjX3BtcTsgLyogIGJtYWMgUE0gc3RhdGVzIGRlcml2ZWQgZnJvbSB1Y29kZSBQTVEgKi8KIAlib29sIHBoeWNsazsJCS8qIHBoeSBpcyBvdXQgb2YgcmVzZXQgYW5kIGhhcyBjbG9jayAqLwogCWJvb2wgZG1hX2xwYms7CQkvKiBjb3JlIGlzIGluIERNQSBsb29wYmFjayAqLwogCi0jaWZkZWYgQkNNU0RJTwotCXZvaWQgKnNkaDsKLSNlbmRpZgogCWJvb2wgdWNvZGVfbG9hZGVkOwkvKiB0cnVlIGFmdGVyIHVjb2RlIGRvd25sb2FkZWQgKi8KIAotI2lmZGVmIFdMQ19MT1dfT05MWQotCXN0cnVjdCB3bF90aW1lciAqd2R0aW1lcjsJLyogdGltZXIgZm9yIHdhdGNoZG9nIHJvdXRpbmUgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBvcmlnX2V0aGVyYWRkcjsJLyogb3JpZ2luYWwgaHcgZXRoZXJuZXQgYWRkcmVzcyAqLwotCXUxNiBycGNfZG5nbF9hZ2c7CS8qIHJwYyBhZ2cgY29udHJvbCBmb3IgZG9uZ2xlICovCi0JdTMyIG1lbV9yZXF1aXJlZF9kZWY7CS8qIG1lbW9yeSByZXF1aXJlZCB0byByZXBsZW5pc2ggUlggRE1BIHJpbmcgKi8KLQl1MzIgbWVtX3JlcXVpcmVkX2xvd2VyOwkvKiBtZW1vcnkgcmVxdWlyZWQgd2l0aCBsb3dlciBSWCBib3VuZCAqLwotCXUzMiBtZW1fcmVxdWlyZWRfbGVhc3Q7CS8qIG1pbmltdW0gbWVtb3J5IHJlcXVpcmVtZW50IHRvIGhhbmRsZSBSWCAqLwotCi0jZW5kaWYJCQkJLyogV0xDX0xPV19PTkxZICovCiAKIAl1OCBod19zdGZfc3Nfb3Btb2RlOwkvKiBTVEYgc2luZ2xlIHN0cmVhbSBvcGVyYXRpb24gbW9kZSAqLwogCXU4IGFudHNlbF90eXBlOwkvKiBUeXBlIG9mIGJvYXJkbGV2ZWwgbWltbyBhbnRlbm5hIHN3aXRjaC1sb2dpYwogCQkJCSAqIDAgPSBOL0EsIDEgPSAyeDQgYm9hcmQsIDIgPSAyeDMgQ0IyIGJvYXJkCiAJCQkJICovCi0JdTMyIGFudHNlbF9hdmFpbDsJLyogcHV0IGFudHNlbF9pbmZvX3QgaGVyZSBpZiBtb3JlIGluZm8gaXMgbmVlZGVkICovCi0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLworCXUzMiBhbnRzZWxfYXZhaWw7CS8qCisJCQkJICogcHV0IHN0cnVjdCBhbnRzZWxfaW5mbyBoZXJlIGlmIG1vcmUgaW5mbyBpcworCQkJCSAqIG5lZWRlZAorCQkJCSAqLwogfTsKIAogLyogVFggUXVldWUgaW5mb3JtYXRpb24KQEAgLTU0MSwxNSArNTEwLDEyIEBACiAgKiBQcmluY2lwYWwgY29tbW9uIChvcy1pbmRlcGVuZGVudCkgc29mdHdhcmUgZGF0YSBzdHJ1Y3R1cmUuCiAgKi8KIHN0cnVjdCB3bGNfaW5mbyB7Ci0Jd2xjX3B1Yl90ICpwdWI7CQkvKiBwb2ludGVyIHRvIHdsYyBwdWJsaWMgc3RhdGUgKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byB3bGMgcHVibGljIHN0YXRlICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLwogCXN0cnVjdCB3bF9pbmZvICp3bDsJLyogcG9pbnRlciB0byBvcy1zcGVjaWZpYyBwcml2YXRlIHN0YXRlICovCiAJZDExcmVnc190ICpyZWdzOwkvKiBwb2ludGVyIHRvIGRldmljZSByZWdpc3RlcnMgKi8KIAotCXdsY19od19pbmZvX3QgKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KLSNpZmRlZiBXTENfU1BMSVQKLQlycGNfaW5mb190ICpycGM7CS8qIEhhbmRsZSB0byBSUEMgbW9kdWxlICovCi0jZW5kaWYKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KIAogCS8qIGNsb2NrICovCiAJaW50IGNsa3JlcV9vdmVycmlkZTsJLyogc2V0dGluZyBmb3IgY2xrcmVxIGZvciBQQ0lFIDogQXV0bywgMCwgMSAqLwpAQCAtNTY2LDEwICs1MzIsMTEgQEAKIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAogCS8qIG11bHRpYmFuZCAqLwotCXdsY2NvcmVfdCAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLwotCXdsY2JhbmRfdCAqYmFuZDsJLyogcG9pbnRlciB0byBhY3RpdmUgcGVyLWJhbmQgc3RhdGUgKi8KLQl3bGNjb3JlX3QgKmNvcmVzdGF0ZTsJLyogcGVyLWNvcmUgc3RhdGUgKG9uZSBwZXIgaHcgY29yZSkgKi8KLQl3bGNiYW5kX3QgKmJhbmRzdGF0ZVtNQVhCQU5EU107CS8qIHBlci1iYW5kIHN0YXRlIChvbmUgcGVyIHBoeS9yYWRpbykgKi8KKwlzdHJ1Y3Qgd2xjY29yZSAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwkvKiBwb2ludGVyIHRvIGFjdGl2ZSBwZXItYmFuZCBzdGF0ZSAqLworCXN0cnVjdCB3bGNjb3JlICpjb3Jlc3RhdGU7CS8qIHBlci1jb3JlIHN0YXRlIChvbmUgcGVyIGh3IGNvcmUpICovCisJLyogcGVyLWJhbmQgc3RhdGUgKG9uZSBwZXIgcGh5L3JhZGlvKTogKi8KKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZHN0YXRlW01BWEJBTkRTXTsKIAogCWJvb2wgd2FyMTYxNjU7CQkvKiBQQ0kgc2xvdyBjbG9jayAxNjE2NSB3YXIgZmxhZyAqLwogCkBAIC01ODQsMTUgKzU1MSw5IEBACiAJczggdHhwd3JfbG9jYWxfbWF4OwkvKiByZWd1bGF0b3J5IGxvY2FsIHR4cHdyIG1heCAqLwogCXU4IHR4cHdyX2xvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIHBvd2VyIGNvbnRyYWludCBpbiBkQiAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXJwY3R4X2luZm9fdCAqcnBjdHg7CS8qIFJQQyBUWCBtb2R1bGUgKi8KLQlib29sIHJlc2V0X2JtYWNfcGVuZGluZzsJLyogYm1hYyByZXNldCBpcyBpbiBwcm9ncmVzc2luZyAqLwotCXUzMiBycGNfYWdnOwkJLyogaG9zdCBhZ2c6IGJpdCAxNi0zMSwgYm1hYyBhZ2c6IGJpdCAwLTE1ICovCi0JdTMyIHJwY19tc2dsZXZlbDsJLyogaG9zdCBycGM6IGJpdCAxNi0zMSwgYm1hYyBycGM6IGJpdCAwLTE1ICovCi0jZW5kaWYKIAotCWFtcGR1X2luZm9fdCAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCi0JYW50c2VsX2luZm9fdCAqYXNpOwkvKiBhbnRzZWwgbW9kdWxlIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCisJc3RydWN0IGFudHNlbF9pbmZvICphc2k7CS8qIGFudHNlbCBtb2R1bGUgaGFuZGxlciAqLwogCXdsY19jbV9pbmZvX3QgKmNtaTsJLyogY2hhbm5lbCBtYW5hZ2VyIG1vZHVsZSBoYW5kbGVyICovCiAKIAl2b2lkICpidHBhcmFtOwkJLyogYnVzIHR5cGUgc3BlY2lmaWMgY29va2llICovCkBAIC03OTIsOCArNzUzLDYgQEAKIAlhY19iaXRtYXBfdCBhcHNkX3RyaWdnZXJfYWM7CS8qIFBlcm1pc3NpYmxlIEFjZXNzIENhdGVnb3J5IGluIHdoaWNoIEFQU0QgTnVsbAogCQkJCQkgKiBUcmlnZ2VyIGZyYW1lcyBjYW4gYmUgc2VuZAogCQkJCQkgKi8KLQl3bGNfYXBfaW5mb190ICphcDsKLQogCXU4IGh0cGh5X21lbWJlcnNoaXA7CS8qIEhUIFBIWSBtZW1iZXJzaGlwICovCiAKIAlib29sIF9yZWd1bGF0b3J5X2RvbWFpbjsJLyogODAyLjExZCBlbmFibGVkPyAqLwpAQCAtODExLDcgKzc3MCw3IEBACiAKIAl1MTYgbmV4dF9ic3NjZmdfSUQ7CiAKLQl3bGNfaWZfdCAqd2xjaWZfbGlzdDsJLyogbGlua2VkIGxpc3Qgb2Ygd2xjX2lmIHN0cnVjdHMgKi8KKwlzdHJ1Y3Qgd2xjX2lmICp3bGNpZl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiB3bGNfaWYgc3RydWN0cyAqLwogCXdsY190eHFfaW5mb190ICphY3RpdmVfcXVldWU7CS8qIHR4cSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgdHJhbnNtaXQgY29udGV4dCAqLwogCXUzMiBtcGNfZHVyOwkJLyogdG90YWwgdGltZSAobXMpIGluIG1wYyBtb2RlIGV4Y2VwdCBmb3IgdGhlCiAJCQkJICogcG9ydGlvbiBzaW5jZSByYWRpbyBpcyB0dXJuZWQgb2ZmIGxhc3QgdGltZQpAQCAtODI1LDggKzc4NCw4IEBACiAKIC8qIGFudHNlbCBtb2R1bGUgc3BlY2lmaWMgc3RhdGUgKi8KIHN0cnVjdCBhbnRzZWxfaW5mbyB7Ci0Jd2xjX2luZm9fdCAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwotCXdsY19wdWJfdCAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KIAl1OCBhbnRzZWxfdHlwZTsJLyogVHlwZSBvZiBib2FyZGxldmVsIG1pbW8gYW50ZW5uYSBzd2l0Y2gtbG9naWMKIAkJCQkgKiAwID0gTi9BLCAxID0gMng0IGJvYXJkLCAyID0gMngzIENCMiBib2FyZAogCQkJCSAqLwpAQCAtODQyLDIzICs4MDEsOSBAQAogI2RlZmluZSBJU19NQkFORF9VTkxPQ0tFRCh3bGMpIFwKIAkoKE5CQU5EUyh3bGMpID4gMSkgJiYgISh3bGMpLT5iYW5kbG9ja2VkKQogCi0jaWZkZWYgV0xDX0xPVwogI2RlZmluZSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQyB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMgKHdsYy0+Y2hhbnNwZWMpCi0jZW5kaWYKIAogLyogc3VtIHRoZSBpbmRpdmlkdWFsIGZpZm8gdHggcGVuZGluZyBwYWNrZXQgY291bnRzICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotI2RlZmluZSBUWFBLVFBFTkRUT1Qod2xjKQkJKHdsY19ycGN0eF90eHBrdHBlbmQoKHdsYyktPnJwY3R4LCAwLCB0cnVlKSkKLSNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhwa3RwZW5kKCh3bGMpLT5ycGN0eCwgKGZpZm8pLCBmYWxzZSkpCi0jZGVmaW5lIFRYUEtUUEVORElOQyh3bGMsIGZpZm8sIHZhbCkJKHdsY19ycGN0eF90eHBrdHBlbmRpbmMoKHdsYyktPnJwY3R4LCAoZmlmbyksICh2YWwpKSkKLSNkZWZpbmUgVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdmFsKQkod2xjX3JwY3R4X3R4cGt0cGVuZGRlYygod2xjKS0+cnBjdHgsIChmaWZvKSwgKHZhbCkpKQotI2RlZmluZSBUWFBLVFBFTkRDTFIod2xjLCBmaWZvKQkJKHdsY19ycGN0eF90eHBrdHBlbmRjbHIoKHdsYyktPnJwY3R4LCAoZmlmbykpKQotI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhhdmFpbCgod2xjKS0+cnBjdHgsIChmaWZvKSkpCi0jZGVmaW5lIEdFVE5FWFRUWFAod2xjLCBfcXVldWUpCQkod2xjX3JwY3R4X2dldG5leHR0eHAoKHdsYyktPnJwY3R4LCAoX3F1ZXVlKSkpCi0KLSNlbHNlCiAjZGVmaW5lCVRYUEtUUEVORFRPVCh3bGMpICgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzBdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFsxXSArIFwKIAkod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzJdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFszXSkKICNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWyhmaWZvKV0pCkBAIC04NjgsNDggKzgxMyw0OSBAQAogI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSgqKHdsYyktPmNvcmUtPnR4YXZhaWxbKGZpZm8pXSkKICNkZWZpbmUgR0VUTkVYVFRYUCh3bGMsIF9xdWV1ZSkJCQkJCQkJCVwKIAkJZG1hX2dldG5leHR0eHAoKHdsYyktPmh3LT5kaVsoX3F1ZXVlKV0sIEhORERNQV9SQU5HRV9UUkFOU01JVFRFRCkKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKICNkZWZpbmUgV0xDX0lTX01BVENIX1NTSUQod2xjLCBzc2lkMSwgc3NpZDIsIGxlbjEsIGxlbjIpIFwKLQkoKGxlbjEgPT0gbGVuMikgJiYgIWJjbXAoc3NpZDEsIHNzaWQyLCBsZW4xKSkKKwkoKGxlbjEgPT0gbGVuMikgJiYgIW1lbWNtcChzc2lkMSwgc3NpZDIsIGxlbjEpKQogCi0vKiBBUEkgc2hhcmVkIGJ5IGJvdGggV0xDX0hJR0ggYW5kIFdMQ19MT1cgZHJpdmVyICovCi1leHRlcm4gdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKTsKLWV4dGVybiB2b2lkIHdsY19mYXRhbF9lcnJvcih3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVjdih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnApOwotZXh0ZXJuIGJvb2wgd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4Mik7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCB2b2lkICpwLCBib29sIGNvbW1pdCwKLQkJICAgICAgIHM4IHR4cGt0cGVuZCk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvX2NvbXBsZXRlKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdCh3bGNfaW5mb190ICp3bGMsIGludCB1bml0KTsKK2V4dGVybiB2b2lkIHdsY19oaWdoX2RwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludHN0YXR1cyk7CitleHRlcm4gdm9pZCB3bGNfZmF0YWxfZXJyb3Ioc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yZWN2KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CitleHRlcm4gYm9vbCB3bGNfZG90eHN0YXR1cyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdHhfc3RhdHVzX3QgKnR4cywgdTMyIGZybV90eDIpOworZXh0ZXJuIHZvaWQgd2xjX3R4ZmlmbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkJICAgICAgIGJvb2wgY29tbWl0LCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4cV9lbnEodm9pZCAqY3R4LCBzdHJ1Y3Qgc2NiICpzY2IsIHN0cnVjdCBza19idWZmICpzZHUsCisJCQl1aW50IHByZWMpOworZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHMpOwotZXh0ZXJuIGludCB3bGNfeG10Zmlmb19zel9nZXQod2xjX2luZm9fdCAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19pbmZvX3QgKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKK2V4dGVybiBpbnQgd2xjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7CitleHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAogCQkJCSAgIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHdsY19pbmZvX3QgKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAogCQkJCSAgICAgIGJvb2wgYm90aCk7CiAjaWYgZGVmaW5lZChCQ01EQkcpCi1leHRlcm4gdm9pZCB3bGNfZ2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX2dldF9yY210YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGlkeCwKKwkJCSAgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOwogI2VuZGlmCi1leHRlcm4gdm9pZCB3bGNfc2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwKK2V4dGVybiB2b2lkIHdsY19zZXRfcmNtdGEoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBpZHgsCiAJCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKLWV4dGVybiB2b2lkIHdsY19zZXRfYWRkcm1hdGNoKHdsY19pbmZvX3QgKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwKK2V4dGVybiB2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsCiAJCQkgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbih3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtaW4pOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21heCh3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtYXgpOwotZXh0ZXJuIHZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19wbGxyZXEod2xjX2luZm9fdCAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcHJvdGVjdGlvbl91cGQod2xjX2luZm9fdCAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgdXMpOwotZXh0ZXJuIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbik7CitleHRlcm4gdm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KTsKK2V4dGVybiB2b2lkIHdsY19maWZvZXJyb3JzKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19wbGxyZXEoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KTsKK2V4dGVybiB2b2lkIHdsY19yZXNldF9ibWFjX2RvbmUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCB1cyk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2Fib3J0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3J4aChkMTFyeGhkcl90ICpyeGgpOwotZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2hkcnMod2xjX2luZm9fdCAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKK2V4dGVybiB2b2lkIHdsY19wcmludF9oZHJzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKIAkJCSAgIGQxMXR4aF90ICp0eGgsIGQxMXJ4aGRyX3QgKnJ4aCwgdWludCBsZW4pOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4ZGVzYyhkMTF0eGhfdCAqdHhoKTsKICNlbmRpZgpAQCAtOTE3LDEyNCArODYzLDEyNiBAQAogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2RvdDExX21hY19oZHIodTggKmJ1ZiwgaW50IGxlbik7CiAjZW5kaWYKIAotI2lmZGVmIFdMQ19MT1cKLWV4dGVybiB2b2lkIHdsY19zZXR4YmFuZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQpOwotZXh0ZXJuIHZvaWQgd2xjX2NvcmVkaXNhYmxlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHdsY19zZXR4YmFuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBiYW5kdW5pdCk7CitleHRlcm4gdm9pZCB3bGNfY29yZWRpc2FibGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgaW50IGJhbmQsCitleHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLCBpbnQgYmFuZCwKIAkJCSAgIGJvb2wgdmVyYm9zZSk7Ci1leHRlcm4gdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gdm9pZCB3bGNfYXBfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgd2xjX3NobV9zc2lkX3VwZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnKTsKLWV4dGVybiBpbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CitleHRlcm4gdm9pZCB3bGNfc2htX3NzaWRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZyk7CitleHRlcm4gaW50IHdsY19zZXRfZ21vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CiAKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsY19pbmZvX3QgKndsYywgYm9vbCBwcm9taXNjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfcHJvbWlzYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCitleHRlcm4gdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCBwcm9taXNjKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX21hY19wcm9taXNjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgICAgICBpbnQgcHJpbyk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmbG93Y29udHJvbF9vdmVycmlkZSh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksCiAJCQkJICAgICAgIGJvb2wgb24sIHVpbnQgb3ZlcnJpZGUpOwotZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKLQkJCQkJIGludCBwcmlvKTsKLWV4dGVybiB2b2lkIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpOwotZXh0ZXJuIGludCB3bGNfcHJlcF9wZHUod2xjX2luZm9fdCAqd2xjLCB2b2lkICpwZHUsIHVpbnQgKmZpZm8pOworZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY190eHFfaW5mb190ICpxaSwgaW50IHByaW8pOworZXh0ZXJuIHZvaWQgd2xjX3NlbmRfcShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK2V4dGVybiBpbnQgd2xjX3ByZXBfcGR1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1LCB1aW50ICpmaWZvKTsKIAotZXh0ZXJuIHUxNiB3bGNfY2FsY19sc2lnX2xlbih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZXNwZWMsCitleHRlcm4gdTE2IHdsY19jYWxjX2xzaWdfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAogCQkJCXVpbnQgbWFjX2xlbik7Ci1leHRlcm4gcmF0ZXNwZWNfdCB3bGNfcnNwZWNfdG9fcnRzX3JzcGVjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywKK2V4dGVybiByYXRlc3BlY190IHdsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJCSBib29sIHVzZV9yc3BlYywgdTE2IG1pbW9fY3RsY2hidyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX3J0c2N0c19kdXIod2xjX2luZm9fdCAqd2xjLCBib29sIGN0c19vbmx5LAorZXh0ZXJuIHUxNiB3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LAogCQkJCSAgICAgcmF0ZXNwZWNfdCBydHNfcmF0ZSwgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLAogCQkJCSAgICAgdTggcnRzX3ByZWFtYmxlX3R5cGUsCiAJCQkJICAgICB1OCBmcmFtZV9wcmVhbWJsZV90eXBlLCB1aW50IGZyYW1lX2xlbiwKIAkJCQkgICAgIGJvb2wgYmEpOwogCi1leHRlcm4gdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncyk7CitleHRlcm4gdm9pZCB3bGNfdGJ0dChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgZDExcmVnc190ICpyZWdzKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQotZXh0ZXJuIHZvaWQgd2xjX2R1bXBfaWUod2xjX2luZm9fdCAqd2xjLCBiY21fdGx2X3QgKmllLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKK2V4dGVybiB2b2lkIHdsY19kdW1wX2llKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBiY21fdGx2X3QgKmllLAorCQkJc3RydWN0IGJjbXN0cmJ1ZiAqYik7CiAjZW5kaWYKIAotZXh0ZXJuIGJvb2wgd2xjX3BzX2NoZWNrKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdm9pZCB3bGNfYnNzY2ZnX3JlcHJhdGVfaW5pdCh3bGNfYnNzY2ZnX3QgKmJzc2NmZyk7CiBleHRlcm4gdm9pZCB3bGNfdWludDY0X3N1Yih1MzIgKmFfaGlnaCwgdTMyICphX2xvdywgdTMyIGJfaGlnaCwKIAkJCSAgIHUzMiBiX2xvdyk7CiBleHRlcm4gdTMyIHdsY19jYWxjX3RidHRfb2Zmc2V0KHUzMiBiaSwgdTMyIHRzZl9oLCB1MzIgdHNmX2wpOwogCiAvKiBTaGFyZWQgbWVtb3J5IGFjY2VzcyAqLwotZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7Ci1leHRlcm4gdTE2IHdsY19yZWFkX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkIHdsY19zZXRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2LCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIHdsY19jb3B5dG9fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKK2V4dGVybiB2b2lkIHdsY193cml0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7CitleHRlcm4gdTE2IHdsY19yZWFkX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgaW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKIAkJCSAgIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB2b2lkICpidWYsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IGxlbik7CiAKLWV4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqYnNzY2ZnKTsKK2V4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19ic3NfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgIHN0cnVjdCB3bGNfYnNzY2ZnICpic3NjZmcpOwogCi1leHRlcm4gdm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aod2xjX2luZm9fdCAqd2xjLCBib29sIHN1c3BlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLAorZXh0ZXJuIHZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcsCiAJCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX21wY191cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucV9oZWFkKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKLQkJCSAgICAgIGludCBwcmVjLCBib29sIGhlYWQpOwotZXh0ZXJuIHUxNiB3bGNfcGh5dHhjdGwxX2NhbGMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKLWV4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLAorZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19pc19ub25fZGVsYXlfbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19wcmVjX2VucShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKKwkJCSBpbnQgcHJlYyk7CitleHRlcm4gYm9vbCB3bGNfcHJlY19lbnFfaGVhZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYywgYm9vbCBoZWFkKTsKK2V4dGVybiB1MTYgd2xjX3BoeXR4Y3RsMV9jYWxjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsCiAJCQkgICAgIHU4ICpwbGNwKTsKLWV4dGVybiB1aW50IHdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAorZXh0ZXJuIHVpbnQgd2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywKIAkJCQl1OCBwcmVhbWJsZV90eXBlLCB1aW50IG1hY19sZW4pOwogCi1leHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKIAotZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpOworZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdW5pdCk7CiAKIGV4dGVybiBjb25zdCBiY21faW92YXJfdCB3bGNfaW92YXJzW107CiAKIGV4dGVybiBpbnQgd2xjX2RvaW92YXIodm9pZCAqaGRsLCBjb25zdCBiY21faW92YXJfdCAqdmksIHUzMiBhY3Rpb25pZCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywgdWludCBwX2xlbiwgdm9pZCAqYXJnLAotCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCB3bGNfaWZfdCAqd2xjaWYpOworCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLWV4dGVybiB2b2lkIHdsY19wcmludF9pZXMod2xjX2luZm9fdCAqd2xjLCB1OCAqaWVzLCB1aW50IGllc19sZW4pOworZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2llcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggKmllcywgdWludCBpZXNfbGVuKTsKICNlbmRpZgogCi1leHRlcm4gaW50IHdsY19zZXRfbm1vZGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqYnNzY2ZnLAotCQkJCSAgICAgIHU4IG1pbW9wc19tb2RlKTsKK2V4dGVybiBpbnQgd2xjX3NldF9ubW9kZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKTsKK2V4dGVybiB2b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggbWltb3BzX21vZGUpOworZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgICB3bGNfYnNzY2ZnX3QgKmJzc2NmZywgdTggbWltb3BzX21vZGUpOwogCi1leHRlcm4gdm9pZCB3bGNfc3dpdGNoX3Nob3J0c2xvdCh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2hvcnRzbG90KTsKK2V4dGVybiB2b2lkIHdsY19zd2l0Y2hfc2hvcnRzbG90KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNob3J0c2xvdCk7CiBleHRlcm4gdm9pZCB3bGNfc2V0X2Jzc2lkKHdsY19ic3NjZmdfdCAqY2ZnKTsKIGV4dGVybiB2b2lkIHdsY19lZGNmX3NldHBhcmFtcyh3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKTsKLWV4dGVybiB2b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLAotCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3NldF9yYXRldGFibGUod2xjX2luZm9fdCAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIGV4dGVybiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpOwotZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQod2xjX2luZm9fdCAqd2xjLAorZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCSAgcmF0ZXNwZWNfdCBiY25fcmF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZnJhbWVfbGVuKTsKLWV4dGVybiByYXRlc3BlY190IHdsY19sb3dlc3RfYmFzaWNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpycyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX2JjbnRzZm9mZih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitleHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmcmFtZV9sZW4pOworZXh0ZXJuIHJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY19yYXRlc2V0X3QgKnJzKTsKK2V4dGVybiB1MTYgd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLAogCQkJCSAgICBib29sIHNob3J0X3ByZWFtYmxlLCBib29sIHBoeWRlbGF5KTsKLWV4dGVybiB2b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYmNuX2xpX3VwZCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2Jjbl9saV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCi1leHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX291dCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9ob21lX2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KTsKLWV4dGVybiBib29sIHdsY19wc19hbGxvd2VkKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfc3RheV9hd2FrZSh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSk7CitleHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYnVmLCB1aW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfb3V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpOworZXh0ZXJuIGJvb2wgd2xjX3BzX2FsbG93ZWQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGJvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19ic3NfbGlzdF90ICpic3NfbGlzdCk7CitleHRlcm4gdm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKTsKICNlbmRpZgkJCQkvKiBfd2xjX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcGh5X3NoaW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCmluZGV4IGJmOGUyZTEuLjhiZDRlZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCkBAIC0yNCw5ICsyNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KLSNpbmNsdWRlIDxiY211dGlscy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPG9zbC5oPgorI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAKICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxiY21zcm9tLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogCiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAKQEAgLTUzLDIxICs1NSwyMyBAQAogI2luY2x1ZGUgPHdsY19waHlfc2hpbS5oPgogI2luY2x1ZGUgPHdsY19waHlfaGFsLmg+CiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIC8qIFBIWSBTSElNIG1vZHVsZSBzcGVjaWZpYyBzdGF0ZSAqLwogc3RydWN0IHdsY19waHlfc2hpbV9pbmZvIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCiAJdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KIAl2b2lkICp3bDsJCS8qIHBvaW50ZXIgdG8gb3Mtc3BlY2lmaWMgcHJpdmF0ZSBzdGF0ZSAqLwogfTsKIAotd2xjX3BoeV9zaGltX2luZm9fdCAqd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCit3bGNfcGh5X3NoaW1faW5mb190ICp3bGNfcGh5X3NoaW1fYXR0YWNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCQkJICAgICAgIHZvaWQgKndsLCB2b2lkICp3bGMpIHsKIAl3bGNfcGh5X3NoaW1faW5mb190ICpwaHlzaGltID0gTlVMTDsKIAogCXBoeXNoaW0gPSBremFsbG9jKHNpemVvZih3bGNfcGh5X3NoaW1faW5mb190KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaHlzaGltKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX3BoeV9zaGltX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgd2xjX2h3LT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfcGh5X3NoaW1fYXR0YWNoOiBvdXQgb2YgbWVtXG4iLAorCQkJIHdsY19ody0+dW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwaHlzaGltLT53bGNfaHcgPSB3bGNfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmgKaW5kZXggYTZhOGMzMy4uMTQ2YTY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3B1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19wdWIuaApAQCAtMjUxLDcgKzI1MSw3IEBACiAgKiBQdWJsaWMgcG9ydGlvbiBvZiAiY29tbW9uIiBvcy1pbmRlcGVuZGVudCBzdGF0ZSBzdHJ1Y3R1cmUuCiAgKiBUaGUgd2xjIGhhbmRsZSBwb2ludHMgYXQgdGhpcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3B1YiB7CitzdHJ1Y3Qgd2xjX3B1YiB7CiAJdm9pZCAqd2xjOwogCiAJc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZV9odzsKQEAgLTI2MCw3ICsyNjAsNyBAQAogCXVpbnQgbWFjODAyMTFfc3RhdGU7CiAJdWludCB1bml0OwkJLyogZGV2aWNlIGluc3RhbmNlIG51bWJlciAqLwogCXVpbnQgY29yZXJldjsJCS8qIGNvcmUgcmV2aXNpb24gKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIHBvaW50ZXIgdG8gb3MgaGFuZGxlICovCiAJc2lfdCAqc2loOwkJLyogU0IgaGFuZGxlIChjb29raWUgZm9yIHNpdXRpbHMgY2FsbHMpICovCiAJY2hhciAqdmFyczsJCS8qICJlbnZpcm9ubWVudCIgbmFtZT12YWx1ZSAqLwogCWJvb2wgdXA7CQkvKiBpbnRlcmZhY2UgdXAgYW5kIHJ1bm5pbmcgKi8KQEAgLTMxOCw5ICszMTgsNiBAQAogCQkJCSAqIGlzIGltcGxlbWVudGVkIHByb3Blcmx5IGluIG9zbCBvZiB0aGF0IHBvcnQKIAkJCQkgKiB3aGVuIGl0IGVuYWJsZXMgdGhpcyBQb3dlciBTYXZlIGZlYXR1cmUuCiAJCQkJICovCi0jaWZkZWYgQkNNU0RJTwotCXVpbnQgc2Rpb2RfZHJpdmVfc3RyZW5ndGg7CS8qIFNESU8gZHJpdmUgc3RyZW5ndGggKi8KLSNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKIAl1MTYgYm9hcmRyZXY7CS8qIHZlcnNpb24gIyBvZiBwYXJ0aWN1bGFyIGJvYXJkICovCiAJdTggc3JvbXJldjsJCS8qIHZlcnNpb24gIyBvZiB0aGUgc3JvbSAqLwpAQCAtMzMzLDcgKzMzMCw3IEBACiAJYm9vbCBfbG1hY3Byb3RvOwkvKiBsbWFjIHByb3RvY29sIG1vZHVsZSBpbmNsdWRlZCBhbmQgZW5hYmxlZCAqLwogCWJvb2wgcGh5XzExbmNhcGFibGU7CS8qIHRoZSBQSFkvSFcgaXMgY2FwYWJsZSBvZiA4MDIuMTFOICovCiAJYm9vbCBfYW1wZHVtYWM7CQkvKiBtYWMgYXNzaXN0IGFtcGR1IGVuYWJsZWQgb3Igbm90ICovCi19IHdsY19wdWJfdDsKK307CiAKIC8qIHdsX21vbml0b3Igcnggc3RhdHVzIHBlciBwYWNrZXQgKi8KIHR5cGVkZWYgc3RydWN0IHdsX3J4c3RzIHsKQEAgLTQzNywxNyArNDM0LDEzIEBACiAjZGVmaW5lIEVEQ0ZfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpKQogI2RlZmluZSBRT1NfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpIHx8IE5fRU5BQihwdWIpKQogCi0jZGVmaW5lIE1PTklUT1JfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+bW9uaXRvcikKKyNkZWZpbmUgTU9OSVRPUl9FTkFCKHdsYykJKCh3bGMpLT5tb25pdG9yKQogCi0jZGVmaW5lIFBST01JU0NfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+cHJvbWlzYykKLQotZXh0ZXJuIHZvaWQgd2xjX3BrdHRhZ19pbmZvX21vdmUod2xjX3B1Yl90ICpwdWIsIHZvaWQgKnBrdF9mcm9tLCB2b2lkICpwa3RfdG8pOwotCi0jZGVmaW5lIFdMUEtUVEFHU0NCKHApIChXTFBLVFRBRyhwKS0+X3NjYikKKyNkZWZpbmUgUFJPTUlTQ19FTkFCKHdsYykJKCh3bGMpLT5wcm9taXNjKQogCiAjZGVmaW5lCVdMQ19QUkVDX0NPVU5UCQkxNgkvKiBNYXggcHJlY2VkZW5jZSBsZXZlbCBpbXBsZW1lbnRlZCAqLwogCi0vKiBwcmkgaXMgUEtUUFJJTyBlbmNvZGVkIGluIHRoZSBwYWNrZXQuIFRoaXMgbWFwcyB0aGUgUGFja2V0IHByaW9yaXR5IHRvCisvKiBwcmkgaXMgcHJpb3JpdHkgZW5jb2RlZCBpbiB0aGUgcGFja2V0LiBUaGlzIG1hcHMgdGhlIFBhY2tldCBwcmlvcml0eSB0bwogICogZW5xdWV1ZSBwcmVjZWRlbmNlIGFzIGRlZmluZWQgaW4gd2xjX3ByZWNfbWFwCiAgKi8KIGV4dGVybiBjb25zdCB1OCB3bGNfcHJpbzJwcmVjX21hcFtdOwpAQCAtNDk3LDggKzQ5MCw4IEBACiAKIC8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHBvcnQgKi8KIGV4dGVybiB2b2lkICp3bGNfYXR0YWNoKHZvaWQgKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JCQlib29sIHBpb21vZGUsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLAotCQkJdm9pZCAqYnRwYXJhbSwgdWludCAqcGVycik7CisJCQlib29sIHBpb21vZGUsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzdmEsCisJCQl1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgKnBlcnIpOwogZXh0ZXJuIHVpbnQgd2xjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdWludCB3bGNfZG93bihzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC01MTcsOCArNTEwLDEwIEBACiBleHRlcm4gYm9vbCB3bGNfaW50cnN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogZXh0ZXJuIGJvb2wgd2xjX2lzcihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCAqd2FudGRwYyk7CiBleHRlcm4gYm9vbCB3bGNfZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGJvdW5kZWQpOwotZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19pZl90ICp3bGNpZiwgdm9pZCAqcCwKLQkJCSAgICAgIHVpbnQgYWMpOworZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfaWYgKndsY2lmLAorCQkJICAgICAgdm9pZCAqcCwgdWludCBhYyk7CitleHRlcm4gYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnNkdSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogZXh0ZXJuIGludCB3bGNfaW92YXJfb3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywKIAkJCWludCBwX2xlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCwKIAkJCXN0cnVjdCB3bGNfaWYgKndsY2lmKTsKQEAgLTUyNyw4ICs1MjIsMTMgQEAKIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHdsY19zdGF0c3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY19nZXRfaGVhZGVyX2xlbih2b2lkKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9zZXRwYXJhbXMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywKKwkJCSAgICAgIGJvb2wgc3VzcGVuZCk7CiAKLWV4dGVybiB3bGNfcHViX3QgKndsY19wdWIodm9pZCAqd2xjKTsKK2V4dGVybiBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yih2b2lkICp3bGMpOwogCiAvKiBjb21tb24gZnVuY3Rpb25zIGZvciBldmVyeSBwb3J0ICovCiBleHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwpAQCAtNTU0LDEzICs1NTQsMTUgQEAKIC8qIGlvY3RsICovCiBleHRlcm4gaW50IHdsY19pb3Zhcl9nZXRzOChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgczggKmFyZyk7Ci1leHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayh3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKnZpLCB2b2lkICphcmcsCitleHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayhzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqdmksCisJCQkgICB2b2lkICphcmcsCiAJCQkgICBpbnQgbGVuLCBib29sIHNldCk7CiAKLWV4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKK2V4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpb3Zhcl9mbiwKIAkJCSAgICAgICB3YXRjaGRvZ19mbl90IHdhdGNoZG9nX2ZuLCBkb3duX2ZuX3QgZG93bl9mbik7Ci1leHRlcm4gaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKTsKK2V4dGVybiBpbnQgd2xjX21vZHVsZV91bnJlZ2lzdGVyKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHZvaWQgKmhkbCk7CiBleHRlcm4gdm9pZCB3bGNfZXZlbnRfaWYoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfYnNzY2ZnICpjZmcsCiAJCQkgd2xjX2V2ZW50X3QgKmUsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKIGV4dGVybiB2b2lkIHdsY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC02MTcsMTAgKzYxOSw2IEBACiAjZGVmaW5lIEJBTkRfMkdfTkFNRQkJIjIuNEciCiAjZGVmaW5lIEJBTkRfNUdfTkFNRQkJIjVHIgogCi0jaWYgZGVmaW5lZChCQ01TRElPKSB8fCBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi12b2lkIHdsY19kZXZpY2VfcmVtb3ZlZCh2b2lkICphcmcpOwotI2VuZGlmCi0KIC8qIEJNQUMgUlBDOiA3IHUzMiBwYXJhbXM6IHBrdHRvdGxlbiwgZmlmbywgY29tbWl0LCBmaWQsIHR4cGt0cGVuZCwgcGt0ZmxhZywgcnBjX2lkICovCiAjZGVmaW5lIFdMQ19SUENUWF9QQVJBTVMJCTMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcmF0ZS5jCmluZGV4IGQyZDcyNTYuLmFiN2QwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JhdGUuYwpAQCAtMTcsMTIgKzE3LDE0IEBACiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxkMTEuaD4KICNpbmNsdWRlIDx3bGNfcmF0ZS5oPgpAQCAtMjk3LDcgKzI5OSw3IEBACiAJdWludCBjb3VudDsKIAl1aW50IGk7CiAKLQliemVybyhyYXRlc2V0LCBzaXplb2YocmF0ZXNldCkpOworCW1lbXNldChyYXRlc2V0LCAwLCBzaXplb2YocmF0ZXNldCkpOwogCWNvdW50ID0gcnMtPmNvdW50OwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzOTY0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX1dMQ19SUENfSF8KLSNkZWZpbmUgX1dMQ19SUENfSF8KLQotI2luY2x1ZGUgPHdsY190eXBlcy5oPgotCi0vKiBSUEMgSURzLCByZW9yZGVyaW5nIGlzIE9LLiBUaGlzIG5lZWRzIHRvIGJlIGluIHN5bmMgd2l0aCBSUENfSURfVEFCTEUgYmVsb3cgKi8KLXR5cGVkZWYgZW51bSB7Ci0JV0xSUENfTlVMTF9JRCA9IDAsCi0JV0xSUENfV0xDX1JFR19SRUFEX0lELAotCVdMUlBDX1dMQ19SRUdfV1JJVEVfSUQsCi0JV0xSUENfV0xDX01IRl9TRVRfSUQsCi0JV0xSUENfV0xDX01IRl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVVBfUFJFUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9XTl9QUkVQX0lELAotCVdMUlBDX1dMQ19CTUFDX0RPV05fRklOSVNIX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVNFVF9JRCwKLQlXTFJQQ19XTENfRE5HTF9SRUJPT1RfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX0FHR19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19JTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DV01JTl9JRCwKLQlXTFJQQ19XTENfQk1BQ19NVVRFX0lELAotCVdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCwKLQlXTFJQQ19XTENfUEhZX0hPTERfVVBEX0lELAotCVdMUlBDX1dMQ19QSFlfTVVURV9VUERfSUQsCi0JV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lELAotCVdMUlBDX1dMQ19QSFlfQU5UX1JYRElWX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FOVF9SWERJVl9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9GUkVRVFJBQ0tfRU5EX0lELAotCVdMUlBDX1dMQ19QSFlfRlJFUVRSQUNLX1NUQVJUX0lELAotCVdMUlBDX1dMQ19QSFlfSU9DVExfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9TQU1QTEVfUkVRVUVTVF9JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9QRVJJQ0FMX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfU1JPTUxJTUlUX0lELAotCVdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9SVU5fSUQsCi0JV0xSUENfV0xDX1BIWV9URVNUX0lTT05fSUQsCi0JV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lELAotCVdMUlBDX1dMQ19CTUFDX0NPUFlUT19PQkpNRU1fSUQsCi0JV0xSUENfV0xDX0VOQUJMRV9NQUNfSUQsCi0JV0xSUENfV0xDX01DVFJMX0lELAotCVdMUlBDX1dMQ19DT1JFUkVTRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9TSE1fSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX0FERFJNQVRDSF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfQ1dNQVhfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9TSE1fSUQsCi0JV0xSUENfV0xDX1NVU1BFTkRfTUFDX0FORF9XQUlUX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCwKLQlXTFJQQ19XTENfQk1BQ19XUklURV9URU1QTEFURV9SQU1fSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVORF9JRCwKLQlXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVOREVEX0lELAotCVdMUlBDX1dMQ19IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX0JNQUNfQ0hBTlNQRUNfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1RYQU5UX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVFhGSUZPX0lELAotCVdMUlBDX1dMQ19SQURJT19SRUFEX0hXRElTQUJMRURfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lELAotCVdMUlBDX1dMQ19TRVRfU0hPUlRTTE9UX0lELAotCVdMUlBDX1dMQ19XQUlUX0ZPUl9XQUtFX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfSFdfQ1RSTF9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0hXX0NUUkxfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCwKLQlXTFJQQ19XTENfQkFORF9TVEZfU1NfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9GSVJTVF9DSEFOU1BFQ19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9DSEFOTkVMU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVZJTkZPX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9DT01QTEVURV9JRCwKLQlXTFJQQ19XTENfUkVDVl9JRCwKLQlXTFJQQ19XTENfRE9UWFNUQVRVU19JRCwKLQlXTFJQQ19XTENfSElHSF9EUENfSUQsCi0JV0xSUENfV0xDX0ZBVEFMX0VSUk9SX0lELAotCVdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9BVkdfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fR0VUX0lELAotCVdMUlBDX1dMQ19QSFlfVEtJUF9SSUZTX1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lELAotCVdMUlBDX1dMQ19CTUFDX1JFVFJZTElNSVRfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX1dJUkVfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19XSVJFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCwKLQlXTFJQQ19XTENfQU1QRFVfVFhTVEFUVVNfQ09NUExFVEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRklGT0VSUk9SU19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0dFVF9UQVJHRVRfTUFYX0lELAotCVdMUlBDX1dMQ19OT0lTRV9DQl9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9IV19NQVNLX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BMTFJFUV9JRCwKLQlXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DTEtfSUQsCi0JV0xSUENfV0xDX1BIWV9PRkRNX1JBVEVTRVRfV0FSX0lELAotCVdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9JT1ZBUlNfSUQsCi0JV0xSUENfV0xDX0JNQUNfRFVNUF9JRCwKLQlXTFJQQ19XTENfQ0lTV1JJVEVfSUQsCi0JV0xSUENfV0xDX0NJU0RVTVBfSUQsCi0JV0xSUENfV0xDX1VQREFURV9QSFlfTU9ERV9JRCwKLQlXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19FVkVOVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkFURV9TSE1fT0ZGU0VUX0lELAotCVdMUlBDX1NJX0lTQ09SRV9VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19QU19TV0lUQ0hfSUQsCi0JV0xSUENfV0xDX1BIWV9TVEZfU1NNT0RFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19ERUJVR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX01TR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX0NGR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX1RZUEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1BIWUNBTF9DQUNIRV9GTEFHX0lELAotCVdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9JTklUX0lELAotCVdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0RFSU5JVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19IV19VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfVFhQV1JfUEVSQ0VOVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fQUNUSVZFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lELAotCVdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FDSU1fTk9JU0VNX1JFU0VUX05QSFlfSUQsCi0JV0xSUENfV0xDX1BIWV9JTlRFUkZFUl9TRVRfTlBIWV9JRCwKLQlXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lELAotCVdMUlBDX1dMQ19QS1RFTkdUWCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfREVBRiwKLQlXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGLAotCVdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfRkxBR1NfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19TVFVDS1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DQ0FfU1RBVFNfUkVBRF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQsCi0JV0xSUENfV0xDX1BIWV9MRFBDX1NFVF9JRCwKLQotCVdMUlBDX0xBU1QKLX0gd2xjX3JwY19pZF90OwotCi0jaWYgZGVmaW5lZChCQ01EQkcpIHwgMAotc3RydWN0IG5hbWVfZW50cnkgewotCWludCBpZDsKLQljaGFyICpuYW1lOwotfTsKLQotI2RlZmluZSBOQU1FX0VOVFJZKHgpIHt4LCAjeH0KLQotI2RlZmluZSBSUENfSURfVEFCTEUgeyBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1JFQURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1dSSVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01IRl9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTUhGX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VQX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX0ZJTklTSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0ROR0xfUkVCT09UX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19SUENfVFhRX1dNX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX0FHR19MSU1JVF9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JTklUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUlOX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTVVURV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSE9MRF9VUERfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX01VVEVfVVBEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfR0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19FTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19TVEFSVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU9DVExfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX1NBTVBMRV9SRVFVRVNUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DQUxfUEVSSUNBTF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NST01MSU1JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX1JVTl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVEVTVF9JU09OX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWVRPX09CSk1FTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FTkFCTEVfTUFDX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01DVFJMX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0NPUkVSRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFQURfU0hNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfQUREUk1BVENIX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUFYX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19TVVNQRU5EX01BQ19BTkRfV0FJVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1RFTVBMQVRFX1JBTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19UWF9GSUZPX1NVU1BFTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19TVVNQRU5ERURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfSFdfRVRIRVJBRERSX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DSEFOU1BFQ19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEFOVF9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEZJRk9fSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkFESU9fUkVBRF9IV0RJU0FCTEVEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9TSE9SVFNMT1RfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfV0FJVF9GT1JfV0FLRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CQU5EX1NURl9TU19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0JBTkRfRklSU1RfQ0hBTlNQRUNfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9CQU5EX0NIQU5ORUxTX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVWSU5GT19HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19YTVRGSUZPX1NaX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1hNVEZJRk9fU1pfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUk1fQ0NBX0NPTVBMRVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JFQ1ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfRE9UWFNUQVRVU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19ISUdIX0RQQ19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19GQVRBTF9FUlJPUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX0FWR19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9JTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RLSVBfUklGU19XQVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVUUllMSU1JVF9VUERfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19BTVBEVV9UWFNUQVRVU19DT01QTEVURV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0ZJRk9FUlJPUlNfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NQVhfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTk9JU0VfQ0JfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0hXX01BU0tfSU5JVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QTExSRVFfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NMS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfT0ZETV9SQVRFU0VUX1dBUl9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET0lPVkFSU19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0RVTVBfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTV1JJVEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTRFVNUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19VUERBVEVfUEhZX01PREVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0JMSU5LX0VWRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JBVEVfU0hNX09GRlNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1NJX0lTQ09SRV9VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1BTX1NXSVRDSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU1RGX1NTTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ERUJVR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FWFRMT0dfTVNHX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0VYVExPR19DRkdfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX0JDTV9BU1NFUlRfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0lOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9ERUlOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19IV19VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9UWFBXUl9QRVJDRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX0FDVElWRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQUNJTV9OT0lTRU1fUkVTRVRfTlBIWV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU5URVJGRVJfU0VUX05QSFlfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BLVEVOR1RYKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0RFQUYpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0NDQV9TVEFUU19SRUFEX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQU5UU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0xEUENfU0VUX0lEKSwJXAotCXswLCBOVUxMfSBcCi0JfQotCi1zdGF0aWMgX19pbmxpbmUgY2hhciAqX3dsY19ycGNfaWRfbG9va3VwKGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5ICp0YmwsIGludCBfaWQpCi17Ci0JY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgKmVsdCA9IHRibDsKLQlzdGF0aWMgY2hhciBfX3Vua25vd25bNjRdOwotCWZvciAoOyBlbHQtPm5hbWUgIT0gTlVMTDsgZWx0KyspIHsKLQkJaWYgKF9pZCA9PSBlbHQtPmlkKQotCQkJYnJlYWs7Ci0JfQotCWlmIChfaWQgPT0gZWx0LT5pZCkKLQkJc3RybmNweShfX3Vua25vd24sIGVsdC0+bmFtZSwgc2l6ZW9mKF9fdW5rbm93bikpOwotCWVsc2UKLQkJc25wcmludGYoX191bmtub3duLCBzaXplb2YoX191bmtub3duKSwgIklEOiVkIiwgX2lkKTsKLQlyZXR1cm4gX191bmtub3duOwotfQotCi0jZGVmaW5lIFdMQ19SUENfSURfTE9PS1VQKHRibCwgX2lkKSAoX3dsY19ycGNfaWRfbG9va3VwKHRibCwgX2lkKSkKLQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiByZWZlciB0byB0eHB3cl9saW1pdHNfdCBmb3IgZWFjaCBlbGVtZW50cywgbWNzMzIgaXMgdGhlIGF0IHRoZSBlbmQgZm9yIDEgYnl0ZSAqLwotI2RlZmluZSBUWFBPV0VSX1hEUl9TWgkocm91bmR1cChXTENfTlVNX1JBVEVTX0NDSywgNCkgKyByb3VuZHVwKFdMQ19OVU1fUkFURVNfT0ZETSwgNCkgKiA0ICsgXAotCXJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0sIDQpICogNiArIHJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0sIDQpICogMiArIFwKLQlyb3VuZHVwKDEsIDQpKQotCi0jZGVmaW5lIHdsY19ycGNfdHhwd3JfbGltaXRzKGIsIHR4cHdyLCBvcCwgZXJyKQlcCi0JZG8gewkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPmNjaywgV0xDX05VTV9SQVRFU19DQ0spOwkJXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtLCBXTENfTlVNX1JBVEVTX09GRE0pOwlcCi0JCUFTU0VSVCghKGVycikpOwkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCVwKLQkJLyogMjAgTUh6IExlZ2FjeSBPRkRNIHJhdGVzIHdpdGggQ0REIHRyYW5zbWlzc2lvbiAqLwkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+b2ZkbV9jZGQsIFdMQ19OVU1fUkFURVNfT0ZETSk7ICAgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX3Npc28sIFdMQ19OVU1fUkFURVNfT0ZETSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkvKiA0MCBNSHogTGVnYWN5IE9GRE0gcmF0ZXMgd2l0aCBDREQgdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX2NkZCwgV0xDX05VTV9SQVRFU19PRkRNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3JwY19jdHggewotCXJwY19pbmZvX3QgKnJwYzsKLQl3bGNfaW5mb190ICp3bGM7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3OwotfSB3bGNfcnBjX2N0eF90OwotCi1zdGF0aWMgaW5saW5lIHJwY19idWZfdCAqd2xjX3JwY19idWZfYWxsb2MocnBjX2luZm9fdCAqcnBjLCBiY21feGRyX2J1Zl90ICpiLAotCQkJCQkgICB1aW50IGxlbiwgd2xjX3JwY19pZF90IHJwY19pZCkKLXsKLQlycGNfYnVmX3QgKnJwY19idWY7Ci0KLQlycGNfYnVmID0gYmNtX3JwY19idWZfYWxsb2MocnBjLCBsZW4gKyBzaXplb2YodTMyKSk7Ci0KLQlpZiAoIXJwY19idWYpCi0JCXJldHVybiBOVUxMOwotCi0JYmNtX3hkcl9idWZfaW5pdChiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIHJwY19idWYpLAotCQkJIGxlbiArIHNpemVvZih1MzIpKTsKLQotCWJjbV94ZHJfcGFja191MzIoYiwgcnBjX2lkKTsKLQotCXJldHVybiBycGNfYnVmOwotfQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgX19pbmxpbmUgd2xjX3JwY19pZF90Ci13bGNfcnBjX2lkX2dldChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgcnBjX2J1Zl90ICpidWYpCi17Ci0Jd2xjX3JwY19pZF90IHJwY19pZDsKLQliY21feGRyX2J1Zl90IGI7Ci0KLQliY21feGRyX2J1Zl9pbml0KCZiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIGJ1ZiksCi0JCQkgc2l6ZW9mKHUzMikpOwotCi0JYmNtX3hkcl91bnBhY2tfdTMyKCZiLCAodTMyICopKCh1bnNpZ25lZCBsb25nKSAmIHJwY19pZCkpOwotCXJldHVybiBycGNfaWQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIF9faW5saW5lIGludCBfd2xjX3JwY19jYWxsKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBycGNfYnVmX3QgKnNlbmQpCi17Ci0JaW50IF9lcnIgPSAwOwotI2lmIGRlZmluZWQoQkNNREJHKQotCXdsY19ycGNfaWRfdCBycGNfaWQgPSB3bGNfcnBjX2lkX2dldChycGMsIHNlbmQpOwotCS8qIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5IHJwY19uYW1lX3RibFtdID0gUlBDX0lEX1RBQkxFOyAqLwotCXN0YXRpYyBzdHJ1Y3QgbmFtZV9lbnRyeSBycGNfbmFtZV90YmxbXSA9IFJQQ19JRF9UQUJMRTsKLQlXTF9UUkFDRSgoIiVzOiBDYWxsZWQgaWQgJXNcbiIsIF9fZnVuY19fLAotCQkgIFdMQ19SUENfSURfTE9PS1VQKHJwY19uYW1lX3RibCwgcnBjX2lkKSkpOwotI2VuZGlmCi0JX2VyciA9IGJjbV9ycGNfY2FsbChycGMsIHNlbmQpOwotCWlmIChfZXJyKSB7Ci0jaWYgZGVmaW5lZChCQ01EQkcpCi0JCVdMX0VSUk9SKCgiJXM6IENhbGwgaWQgJXMgRkFJTEVEXG4iLCBfX2Z1bmNfXywKLQkJCSAgV0xDX1JQQ19JRF9MT09LVVAocnBjX25hbWVfdGJsLCBycGNfaWQpKSk7Ci0jZW5kaWYKLQkJX2VyciA9IDA7Ci0JfQotCXJldHVybiBfZXJyOwotfQotCi0jZGVmaW5lIHdsY19ycGNfY2FsbChycGMsIHNlbmQpIChfd2xjX3JwY19jYWxsKHJwYywgc2VuZCkpCi0KLSNpbmNsdWRlIDxzYmhuZGRtYS5oPgotI2luY2x1ZGUgPHNiaG5kcGlvLmg+Ci0jaW5jbHVkZSA8ZDExLmg+Ci0KLSNpZmRlZiBXTENfTE9XCi1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZGlzcGF0Y2god2xjX3JwY19jdHhfdCAqcnBjX2N0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZHVtcF90eGZpZm9oaXN0KHdsY19od19pbmZvX3QgKndsY19odywKLQkJCQkJIGJvb2wgZHVtcF9jbGVhcik7Ci0jZWxzZQotZXh0ZXJuIHZvaWQgd2xjX3JwY19oaWdoX2Rpc3BhdGNoKHdsY19ycGNfY3R4X3QgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci0jZW5kaWYKLQotLyogUGFja2VkIHN0cnVjdHVyZSBmb3IgZWFzZSBvZiB0cmFuc3BvcnQgYWNyb3NzIFJQQyBidXMgYWxvbmcgdTMyIGJvdW5kYXJ5ICovCi10eXBlZGVmIHN0cnVjdCB3bGNfcnBjX3R4c3RhdHVzIHsKLQl1MzIgUEFEX2ZyYW1lbGVuOwotCXUzMiBzdGF0dXNfZnJhbWVpZDsKLQl1MzIgc2VxdWVuY2VfbGFzdHR4dGltZTsKLQl1MzIgYWNrcGh5cnhzaF9waHllcnI7Ci19IHdsY19ycGNfdHhzdGF0dXNfdDsKLQotc3RhdGljIGlubGluZQotICAgIHZvaWQgdHhzdGF0dXMycnBjX3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHN0YXR1cywKLQkJCSAgICAgICB3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cykKLXsKLQlycGNfdHhzdGF0dXMtPlBBRF9mcmFtZWxlbiA9IHR4c3RhdHVzLT5mcmFtZWxlbjsKLQlycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID0KLQkgICAgKHR4c3RhdHVzLT5zdGF0dXMgPDwgMTYpIHwgdHhzdGF0dXMtPmZyYW1laWQ7Ci0JcnBjX3R4c3RhdHVzLT5zZXF1ZW5jZV9sYXN0dHh0aW1lID0KLQkgICAgKHR4c3RhdHVzLT5zZXF1ZW5jZSA8PCAxNikgfCB0eHN0YXR1cy0+bGFzdHR4dGltZTsKLQlycGNfdHhzdGF0dXMtPmFja3BoeXJ4c2hfcGh5ZXJyID0KLQkgICAgKHR4c3RhdHVzLT5hY2twaHlyeHNoIDw8IDE2KSB8IHR4c3RhdHVzLT5waHllcnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLSAgICB2b2lkIHJwY190eHN0YXR1czJ0eHN0YXR1cyh3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cywKLQkJCSAgICAgICB0eF9zdGF0dXNfdCAqdHhzdGF0dXMpCi17Ci0JdHhzdGF0dXMtPmZyYW1lbGVuID0gcnBjX3R4c3RhdHVzLT5QQURfZnJhbWVsZW4gJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnN0YXR1cyA9IChycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID4+IDE2KSAmIDB4ZmZmZjsKLQl0eHN0YXR1cy0+ZnJhbWVpZCA9IHJwY190eHN0YXR1cy0+c3RhdHVzX2ZyYW1laWQgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnNlcXVlbmNlID0gKHJwY190eHN0YXR1cy0+c2VxdWVuY2VfbGFzdHR4dGltZSA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmxhc3R0eHRpbWUgPSBycGNfdHhzdGF0dXMtPnNlcXVlbmNlX2xhc3R0eHRpbWUgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmFja3BoeXJ4c2ggPSAocnBjX3R4c3RhdHVzLT5hY2twaHlyeHNoX3BoeWVyciA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnBoeWVyciA9IHJwY190eHN0YXR1cy0+YWNrcGh5cnhzaF9waHllcnIgJiAweGZmZmY7Ci19Ci0KLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcmVib290KHJwY19pbmZvX3QgKnJwYyk7Ci0KLSNlbmRpZgkJCQkvKiBXTENfUlBDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGN0eC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjcxNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfd2xjX3JwY3R4X2hfCi0jZGVmaW5lIF93bGNfcnBjdHhfaF8KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RydWN0IHdsY19pbmZvOwotCi0vKiBUaGlzIGNvbnRyb2xzIGhvdyBtYW55IHBhY2tldHMgYXJlIGdpdmVuIHRvIHRoZSBkb25nbGUuIFRoaXMgaXMgcmVxdWlyZWQgYXMKLSAqIE5UWEQgbmVlZHMgdG8gYmUgcG93ZXIgb2YgMiBidXQgd2UgbWF5IG5vdCBoYXZlIGVub3VnaCBtZW1vcnkgdG8gYWJzb3JiIHRoYXQKLSAqIGxhcmdlIG51bWJlciBvZiBmcmFtZXMKLSAqLwotI2lmbmRlZiBOUlBDVFhCVUZQT1NUCi0jZGVmaW5lIE5SUENUWEJVRlBPU1QgTlRYRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi0KLXN0cnVjdCB3bGNfcnBjX3BoeSB7Ci0Jc3RydWN0IHJwY19pbmZvICpycGM7Ci19OwotCi0jZGVmaW5lIFJQQ1RYX0VOQUIocHViKQkJKHRydWUpCi1leHRlcm4gcnBjdHhfaW5mb190ICp3bGNfcnBjdHhfYXR0YWNoKHdsY19wdWJfdCAqcHViLCBzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9maWZvaW5pdChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHVpbnQgbnR4ZCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfZGV0YWNoKHJwY3R4X2luZm9fdCAqcnBjdHgpOwotZXh0ZXJuIGludCB3bGNfcnBjdHhfZHVtcChycGN0eF9pbmZvX3QgKnJwY3R4LCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLWV4dGVybiB2b2lkICp3bGNfcnBjdHhfZ2V0bmV4dHR4cChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8pOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eF9pbmZvX3QgKnJwY3R4KTsKLWV4dGVybiB1aW50IHdsY19ycGN0eF90eGF2YWlsKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9wa3RlbmcocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB2b2lkICpwKTsKLWV4dGVybiBpbnQgd2xjX3JwY3R4X3R4KHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsCi0JCQl1MTYgZnJhbWVpZCwgdTggdHhwa3RwZW5kKTsKLWV4dGVybiB2b2lkIHdsY19ycGN0eF90eHBrdHBlbmRpbmMocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cGt0cGVuZGRlYyhycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF90eHBrdHBlbmQocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCBib29sIGFsbCk7Ci0KLSNlbHNlCi0jZGVmaW5lCVJQQ1RYX0VOQUIocHViKQkJCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2F0dGFjaChwdWIsIHdsYykJKE5VTEwpCi0jZGVmaW5lCXdsY19ycGN0eF9maWZvaW5pdChycGN0eCwgZmlmbywgbnR4ZCkgKDApCi0jZGVmaW5lCXdsY19ycGN0eF9kZXRhY2gocnBjdHgpCQlBU1NFUlQoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4YXZhaWwocnBjdHgsIGYpCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2R1bXAocnBjdHgsIGIpCQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X2dldG5leHR0eHAocnBjdHgsIGYpCQkoTlVMTCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eCkJCUFTU0VSVCgwKQotI2RlZmluZQl3bGNfcnBjdHhfcGt0ZW5nKHJwY3R4LCBmaWZvLCBwKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eChycGN0eCwgZiwgcCwgYywgZmlkLCB0KQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cGt0cGVuZGluYyhycGN0eCwgZiwgdmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmRkZWMocnBjdHgsIGYsIHZhbCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZQl3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4LCBmKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmQocnBjdHgsIGYsIGFsbCkJKDApCi0KLSNlbmRpZgkJCQkvKiBXTENfSElHSCAqLwotCi0jZW5kaWYJCQkJLyogX3dsY19ycGN0eF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oCmluZGV4IGNlMjZjNzQuLmZlODRlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zY2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc2NiLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHByb3RvLzgwMi4xZC5oPgogCi1leHRlcm4gYm9vbCB3bGNfYWdncmVnYXRhYmxlKHdsY19pbmZvX3QgKndsYywgdTggdGlkKTsKK2V4dGVybiBib29sIHdsY19hZ2dyZWdhdGFibGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHRpZCk7CiAKICNkZWZpbmUgQU1QRFVfVFhfQkFfTUFYX1dTSVpFCTY0CS8qIG1heCBUeCBiYSB3aW5kb3cgc2l6ZSAoaW4gcGR1KSAqLwogLyogc3RydWN0dXJlIHRvIHN0b3JlIHBlci10aWQgc3RhdGUgZm9yIHRoZSBhbXBkdSBpbml0aWF0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYwppbmRleCA0NzI4YWQ5Li44OTc1YjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5jCkBAIC0xNSw4ICsxNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgpAQCAtMjUsMjkgKzI1LDMzIEBACiAjaW5jbHVkZSA8cHJvdG8vODAyLjExLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CiAjaW5jbHVkZSA8d2xjX2Jzc2NmZy5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zdGYuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogI2RlZmluZSBXTENfU1RGX1NTX1NUQkNfUlgod2xjKSAoV0xDSVNOUEhZKHdsYy0+YmFuZCkgJiYgXAogCU5SRVZfR1Qod2xjLT5iYW5kLT5waHlyZXYsIDMpICYmIE5SRVZfTEUod2xjLT5iYW5kLT5waHlyZXYsIDYpKQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGJvb2wgd2xjX3N0Zl9zdGJjX3R4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHdsY19pbmZvX3QgKndsYywgdTggTnN0cywgdTggdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXN0YXRpYyB2b2lkIHdsY19zdGZfc3RiY19yeF9odF91cGRhdGUod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyBzOCB3bGNfc3RmX3N0YmNfcnhfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19zdGZfc3RiY190eF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCB2YWwpOworc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKIAotc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOworc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IF93bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKIAogI2RlZmluZSBOU1RTXzEJMQogI2RlZmluZSBOU1RTXzIJMgpAQCAtNjEsNyArNjUsNyBAQAogCSgweDBmKQkJCS8qIEZvciBOc3RzID0gNCwgZW5hYmxlIGFsbCBjb3JlcyAqLwogfTsKIAotc3RhdGljIHZvaWQgd2xjX3N0Zl9zdGJjX3J4X2h0X3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKQogewogCUFTU0VSVCgodmFsID09IEhUX0NBUF9SWF9TVEJDX05PKQogCSAgICAgICB8fCAodmFsID09IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKTsKQEAgLTgyLDcgKzg2LDcgQEAKIH0KIAogLyogZXZlcnkgV0xDX1RFTVBTRU5TRV9QRVJJT0Qgc2Vjb25kcyB0ZW1wZXJhdHVyZSBjaGVjayB0byBkZWNpZGUgd2hldGhlciB0byB0dXJuIG9uL29mZiB0eGNoYWluICovCi12b2lkIHdsY190ZW1wc2Vuc2VfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3RlbXBzZW5zZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX3BoeV90ICpwaSA9IHdsYy0+YmFuZC0+cGk7CiAJdWludCBhY3RpdmVfY2hhaW5zLCB0eGNoYWluOwpAQCAtMTA2LDcgKzExMCw3IEBACiB9CiAKIHZvaWQKLXdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsIHUxNiAqc3NfYWxnb19jaGFubmVsLAord2xjX3N0Zl9zc19hbGdvX2NoYW5uZWxfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKnNzX2FsZ29fY2hhbm5lbCwKIAkJCSAgICBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXR4X3Bvd2VyX3QgcG93ZXI7CkBAIC0xNDcsMTIgKzE1MSwxMiBAQAogCQlzZXRiaXQoc3NfYWxnb19jaGFubmVsLCBQSFlfVFhDMV9NT0RFX1NUQkMpOwogfQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gKHdsYy0+aHRfY2FwLmNhcCAmIEhUX0NBUF9SWF9TVEJDX01BU0spID4+IEhUX0NBUF9SWF9TVEJDX1NISUZUOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHdsY19pbmZvX3QgKndsYywgczMyIGludF92YWwpCitzdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gQVVUTykgJiYgKGludF92YWwgIT0gT0ZGKSAmJiAoaW50X3ZhbCAhPSBPTikpIHsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTczLDcgKzE3Nyw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgd2xjX3N0Zl9zdGJjX3J4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQorYm9vbCB3bGNfc3RmX3N0YmNfcnhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gSFRfQ0FQX1JYX1NUQkNfTk8pCiAJICAgICYmIChpbnRfdmFsICE9IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKSB7CkBAIC0xOTAsMTAgKzE5NCwxMCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHdsY19zdGZfdHhjb3JlX3NldCh3bGNfaW5mb190ICp3bGMsIHU4IE5zdHMsIHU4IGNvcmVfbWFzaykKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCBjb3JlX21hc2spCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogTnN0cyAlZCBjb3JlX21hc2sgJXhcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IE5zdHMgJWQgY29yZV9tYXNrICV4XG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spOwogCiAJQVNTRVJUKChOc3RzID4gMCkgJiYgKE5zdHMgPD0gTUFYX1NUUkVBTVNfU1VQUE9SVEVEKSk7CiAKQEAgLTIyNywxMiArMjMxLDEyIEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKQorc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAlpbnQgaTsKIAl1OCBjb3JlX21hc2sgPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCkpOworCVdMX1RSQUNFKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCk7CiAKIAl3bGMtPnN0Zi0+c3BhdGlhbF9wb2xpY3kgPSAoczgpIHZhbDsKIAlmb3IgKGkgPSAxOyBpIDw9IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKSB7CkBAIC0yNDMsNyArMjQ3LDcgQEAKIAlyZXR1cm4gQkNNRV9PSzsKIH0KIAotaW50IHdsY19zdGZfdHhjaGFpbl9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKK2ludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKIHsKIAl1OCB0eGNoYWluID0gKHU4KSBpbnRfdmFsOwogCXU4IHR4c3RyZWFtczsKQEAgLTI3NCwxMyArMjc4LDE1IEBACiAJCQkJaWYgKFJTUEVDX1NURih3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUpCiAJCQkJICAgICE9IFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUgPSAwOwotCQkJCQlXTF9FUlJPUigoIiVzKCk6IHRlbXAgc2Vuc2Ugb3ZlcnJpZGUgbm9uLVNJU08iICIgcnNwZWNfb3ZlcnJpZGUuXG4iLCBfX2Z1bmNfXykpOworCQkJCQlXTF9FUlJPUigiJXMoKTogdGVtcCBzZW5zZSBvdmVycmlkZSBub24tU0lTTyByc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJCWlmIChSU1BFQ19TVEYKIAkJCQkgICAgKHdsYy0+YmFuZHN0YXRlW2ldLT5tcnNwZWNfb3ZlcnJpZGUpICE9CiAJCQkJICAgIFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+bXJzcGVjX292ZXJyaWRlID0gMDsKLQkJCQkJV0xfRVJST1IoKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIiAiIG1yc3BlY19vdmVycmlkZS5cbiIsIF9fZnVuY19fKSk7CisJCQkJCVdMX0VSUk9SKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIG1yc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJfQogCX0KQEAgLTMwMyw3ICszMDksNyBAQAogCXJldHVybiBCQ01FX09LOwogfQogCi1pbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQoraW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKQogewogCXU4IHJ4Y2hhaW5fY250OwogCXU4IHJ4Y2hhaW4gPSAodTgpIGludF92YWw7CkBAIC0zNjcsNyArMzczLDcgQEAKIH0KIAogLyogdXBkYXRlIHdsYy0+c3RmLT5zc19vcG1vZGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgb3BlcmF0aW9uYWwgc3RmX3NzIG1vZGUgd2UncmUgdXNpbmcgKi8KLWludCB3bGNfc3RmX3NzX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqYmFuZCkKK2ludCB3bGNfc3RmX3NzX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHdsY2JhbmQgKmJhbmQpCiB7CiAJaW50IHJldF9jb2RlID0gMDsKIAl1OCBwcmV2X3N0Zl9zczsKQEAgLTQwMiw3ICs0MDgsNyBAQAogCXJldHVybiByZXRfY29kZTsKIH0KIAotaW50IHdsY19zdGZfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK2ludCB3bGNfc3RmX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfU0lTTzsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfQ0REOwpAQCAtNDI1LDExICs0MzEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfc3RmX2RldGFjaCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogfQogCi1pbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzOCB2YWwpCitpbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHM4IHZhbCkKIHsKIAlpbnQgYmNtZXJyb3IgPSBCQ01FX09LOwogCkBAIC00NzYsNyArNDgyLDcgQEAKICAqICAgIGRvIHR4LWFudGVubmEgc2VsZWN0aW9uIGZvciBTSVNPIHRyYW5zbWlzc2lvbnMKICAqIGZvciBOUkVWPj03LCBiaXQgNiBhbmQgYml0IDcgbWVhbiBhbnRlbm5hIDAgYW5kIDEgcmVzcGVjdGl2ZWx5LCBuaXQ2K2JpdDcgbWVhbnMgYm90aCBjb3JlcyBhY3RpdmUKICovCi1zdGF0aWMgdm9pZCBfd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIF93bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJczggdHhhbnQ7CiAKQEAgLTUxNywxMiArNTIzLDEyIEBACiAJd2xjX2JtYWNfdHhhbnRfc2V0KHdsYy0+aHcsIHdsYy0+c3RmLT5waHl0eGFudCk7CiB9CiAKLXZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCV93bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKIH0KIAotdm9pZCB3bGNfc3RmX3BoeV9jaGFpbl9jYWxjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfY2hhaW5fY2FsYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBnZXQgYXZhaWxhYmxlIHJ4L3R4IGNoYWlucyAqLwogCXdsYy0+c3RmLT5od190eGNoYWluID0gKHU4KSBnZXRpbnR2YXIod2xjLT5wdWItPnZhcnMsICJ0eGNoYWluIik7CkBAIC01NTksNyArNTY1LDcgQEAKIAl3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldCh3bGMsIE1JTl9TUEFUSUFMX0VYUEFOU0lPTik7CiB9CiAKLXN0YXRpYyB1MTYgX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAl1MTYgcGh5dHhhbnQgPSB3bGMtPnN0Zi0+cGh5dHhhbnQ7CiAKQEAgLTU3MiwxMiArNTc4LDEyIEBACiAJcmV0dXJuIHBoeXR4YW50OwogfQogCi11MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCit1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAlyZXR1cm4gX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjLCByc3BlYyk7CiB9CiAKLXUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKQogewogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKIAl1MTYgbWFzayA9IFBIWV9UWENfQU5UX01BU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmgKaW5kZXggZWU5YjAyYS4uOGRlNjM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuaApAQCAtMjAsMjMgKzIwLDI0IEBACiAjZGVmaW5lIE1JTl9TUEFUSUFMX0VYUEFOU0lPTgkwCiAjZGVmaW5lIE1BWF9TUEFUSUFMX0VYUEFOU0lPTgkxCiAKLWV4dGVybiBpbnQgd2xjX3N0Zl9hdHRhY2god2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gaW50IHdsY19zdGZfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3RlbXBzZW5zZV91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsCitleHRlcm4gdm9pZCB3bGNfdGVtcHNlbnNlX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3NzX2FsZ29fY2hhbm5lbF9nZXQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCXUxNiAqc3NfYWxnb19jaGFubmVsLAogCQkJCQljaGFuc3BlY190IGNoYW5zcGVjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9zc191cGRhdGUod2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl90eGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsLCBib29sIGZvcmNlKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLWV4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCk7CitleHRlcm4gaW50IHdsY19zdGZfc3NfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSk7CitleHRlcm4gaW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK2V4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKIAotZXh0ZXJuIGludCB3bGNfc3RmX2FudF90eGFudF92YWxpZGF0ZSh3bGNfaW5mb190ICp3bGMsIHM4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOwotZXh0ZXJuIHUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7Ci1leHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gaW50IHdsY19zdGZfYW50X3R4YW50X3ZhbGlkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpOworZXh0ZXJuIHZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHUxNiB3bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB1MTYgd2xjX3N0Zl9kMTFoZHJzX3BoeWN0bF90eGFudChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgcmF0ZXNwZWNfdCByc3BlYyk7CiAjZW5kaWYJCQkJLyogX3dsY19zdGZfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKaW5kZXggMzMwNDdlYi4uZGY2ZTA0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKQEAgLTE5LDM0ICsxOSwxOSBAQAogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogCi10eXBlZGVmIHN0cnVjdCB3bGNfaW5mbyB3bGNfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2h3X2luZm8gd2xjX2h3X2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19pZiB3bGNfaWZfdDsKLXR5cGVkZWYgc3RydWN0IHdsX2lmIHdsX2lmX3Q7Ci10eXBlZGVmIHN0cnVjdCBsZWRfaW5mbyBsZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19sZWQgYm1hY19sZWRfdDsKLXR5cGVkZWYgc3RydWN0IGJtYWNfbGVkX2luZm8gYm1hY19sZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc2NiX21vZHVsZSBzY2JfbW9kdWxlX3Q7Ci10eXBlZGVmIHN0cnVjdCBiYV9pbmZvIGJhX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IGFtcGR1X2luZm8gYW1wZHVfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgcmF0ZXNlbF9pbmZvIHJhdGVzZWxfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2FwX2luZm8gd2xjX2FwX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19hdXRoX2luZm8gd2xjX2F1dGhfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc3VwcGxpY2FudCBzdXBwbGljYW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBhdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3JfdDsKLXR5cGVkZWYgc3RydWN0IGFudHNlbF9pbmZvIGFudHNlbF9pbmZvX3Q7Ci0jaWYgIWRlZmluZWQoV0xDX0xPVykKLXR5cGVkZWYgc3RydWN0IHJwY3R4X2luZm8gcnBjdHhfaW5mb190OwotI2VuZGlmCi0jaWZkZWYgV0xDX0xPVwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19wbXEgYm1hY19wbXFfdDsKLSNlbmRpZgorc3RydWN0IHdsY19pbmZvOworc3RydWN0IHdsY19od19pbmZvOworc3RydWN0IHdsY19pZjsKK3N0cnVjdCB3bF9pZjsKK3N0cnVjdCBhbXBkdV9pbmZvOworc3RydWN0IGFudHNlbF9pbmZvOworc3RydWN0IGJtYWNfcG1xOwogCiBzdHJ1Y3QgZDExaW5pdDsKIAogI2lmbmRlZiBfaG5kZG1hX3B1Yl8KICNkZWZpbmUgX2huZGRtYV9wdWJfCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBobmRkbWFfcHViIGhuZGRtYV90Oworc3RydWN0IGhuZGRtYV9wdWI7CiAjZW5kaWYJCQkJLyogX2huZGRtYV9wdWJfICovCiAKICNlbmRpZgkJCQkvKiBfd2xjX3R5cGVzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2FpdXRpbHMuYwppbmRleCA3NWE3ZTNhLi5kZGQyZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9haXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGhuZHNvYy5oPgpAQCAtMjYsOCArMzEsOCBAQAogI2luY2x1ZGUgPHBjaWNmZy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KIAotI2RlZmluZSBCQ000NzE2Ml9ETVAoKSAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKLQkJKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSAmJiBcCisjZGVmaW5lIEJDTTQ3MTYyX0RNUCgpICgoc2loLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKKwkJKHNpaC0+Y2hpcHJldiA9PSAwKSAmJiBcCiAJCShzaWktPmNvcmVpZFtzaWktPmN1cmlkeF0gPT0gTUlQUzc0S19DT1JFX0lEKSkKIAogLyogRVJPTSBwYXJzaW5nICovCkBAIC0xMTUsNyArMTIwLDcgQEAKIAogCWVyb21iYXNlID0gUl9SRUcoc2lpLT5vc2gsICZjYy0+ZXJvbXB0cik7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCWVyb21wdHIgPSAodTMyICopIFJFR19NQVAoZXJvbWJhc2UsIFNJX0NPUkVfU0laRSk7CiAJCWJyZWFrOwpAQCAtMTI1LDcgKzEzMCw3IEBACiAJCXNpaS0+Y3Vyd3JhcCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJlZ3MgKyBTSV9DT1JFX1NJWkUpOwogCiAJCS8qIE5vdyBwb2ludCB0aGUgd2luZG93IGF0IHRoZSBlcm9tICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4sIDQsIGVyb21iYXNlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBlcm9tYmFzZSk7CiAJCWVyb21wdHIgPSByZWdzOwogCQlicmVhazsKIApAQCAtMzMwLDcgKzMzNSw3IEBACiAJQVNTRVJUKChzaWktPmludHJzZW5hYmxlZF9mbiA9PSBOVUxMKQogCSAgICAgICB8fCAhKCooc2lpKS0+aW50cnNlbmFibGVkX2ZuKSAoKHNpaSktPmludHJfYXJnKSk7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCS8qIG1hcCBuZXcgb25lICovCiAJCWlmICghc2lpLT5yZWdzW2NvcmVpZHhdKSB7CkBAIC0zNDcsMTAgKzM1MiwxMCBAQAogCiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBwb2ludCBiYXIwIHdpbmRvdyAqLwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0JBUjBfV0lOLCA0LCBhZGRyKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBhZGRyKTsKIAkJcmVncyA9IHNpaS0+Y3VybWFwOwogCQkvKiBwb2ludCBiYXIwIDJuZCA0S0Igd2luZG93ICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4yLCA0LCB3cmFwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOMiwgd3JhcCk7CiAJCWJyZWFrOwogCiAjaWZkZWYgQkNNU0RJTwpAQCAtNTA0LDcgKzUwOSw3IEBACiAJaWYgKGNvcmVpZHggPj0gU0lfTUFYQ09SRVMpCiAJCXJldHVybiAwOwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHsKKwlpZiAoc2loLT5idXN0eXBlID09IFNJX0JVUykgewogCQkvKiBJZiBpbnRlcm5hbCBidXMsIHdlIGNhbiBhbHdheXMgZ2V0IGF0IGV2ZXJ5dGhpbmcgKi8KIAkJZmFzdCA9IHRydWU7CiAJCS8qIG1hcCBpZiBkb2VzIG5vdCBleGlzdCAqLwpAQCAtNTE0LDcgKzUxOSw3IEBACiAJCQlBU1NFUlQoR09PRFJFR1Moc2lpLT5yZWdzW2NvcmVpZHhdKSk7CiAJCX0KIAkJciA9ICh1MzIgKikgKCh1bnNpZ25lZCBjaGFyICopIHNpaS0+cmVnc1tjb3JlaWR4XSArIHJlZ29mZik7Ci0JfSBlbHNlIGlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCX0gZWxzZSBpZiAoc2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJLyogSWYgcGNpL3BjaWUsIHdlIGNhbiBnZXQgYXQgcGNpL3BjaWUgcmVncyBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMgKi8KIAogCQlpZiAoKHNpaS0+Y29yZWlkW2NvcmVpZHhdID09IENDX0NPUkVfSUQpICYmIFNJX0ZBU1Qoc2lpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jCmluZGV4IGM5MDk4MzIuLmQ4MjBlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21vdHAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtb3RwLmMKQEAgLTE0LDExICsxNCwxMyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CkBAIC03Nyw3ICs3OSw3IEBACiAJdWludCBjY3JldjsJCS8qIGNoaXBjIHJldmlzaW9uICovCiAJb3RwX2ZuX3QgKmZuOwkJLyogT1RQIGZ1bmN0aW9ucyAqLwogCXNpX3QgKnNpaDsJCS8qIFNhdmVkIHNiIGhhbmRsZSAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKICNpZmRlZiBCQ01JUFhPVFAKIAkvKiBJUFggT1RQIHNlY3Rpb24gKi8KQEAgLTIyMSw3ICsyMjMsNyBAQAogewogCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAkJcmV0ID0gb3NpemV3ICogMiAtIE9UUF9TWl9GVV83MiAtIE9UUF9TWl9DSEVDS1NVTTsKQEAgLTI3MSw4ICsyNzMsOCBAQAogCS8qIFJlYWQgT1RQIGxvY2sgYml0cyBhbmQgc3VicmVnaW9uIHByb2dyYW1tZWQgaW5kaWNhdGlvbiBiaXRzICovCiAJb2ktPnN0YXR1cyA9IFJfUkVHKG9pLT5vc2gsICZjYy0+b3Rwc3RhdHVzKTsKIAotCWlmICgoQ0hJUElEKG9pLT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpCi0JICAgIHx8IChDSElQSUQob2ktPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkKKwkgICAgfHwgKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKIAkJdTMyIHBfYml0czsKIAkJcF9iaXRzID0KIAkJICAgIChpcHhvdHBfb3RwcihvaSwgY2MsIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfUF9PRkYpICYKQEAgLTU2OSw3ICs1NzEsNyBAQAogc3RhdGljIHUxNiBobmRvdHBfb3Rwcih2b2lkICpvaCwgY2hpcGNyZWdzX3QgKmNjLCB1aW50IHduKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod24gPCAoKG9pLT5zaXplIC8gMikgKyBPVFBfUkNfTElNX09GRikpOwpAQCAtNTg0LDcgKzU4Niw3IEBACiBzdGF0aWMgdTE2IGhuZG90cF9vdHByb2ZmKHZvaWQgKm9oLCBjaGlwY3JlZ3NfdCAqY2MsIGludCB3b2ZmKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod29mZiA+PSAoLSgoaW50KW9pLT5zaXplIC8gMikpKTsKQEAgLTYwMyw3ICs2MDUsNyBAQAogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwogCXVpbnQgaywgcm93LCBjb2w7CiAJdTMyIG90cHAsIHN0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2gob2ktPnNpaCk7CiAJcm93ID0gaWR4IC8gNjU7CkBAIC02MzYsNyArNjM4LDcgQEAKIAlvdHBpbmZvX3QgKm9pOwogCXUzMiBjYXAgPSAwLCBjbGtkaXYsIG90cGRpdiA9IDA7CiAJdm9pZCAqcmV0ID0gTlVMTDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJb2kgPSAmb3RwaW5mbzsKIApAQCAtOTAwLDcgKzkwMiw3IEBACiAJdm9pZCAqcmV0ID0gTlVMTDsKIAogCW9pID0gJm90cGluZm87Ci0JYnplcm8ob2ksIHNpemVvZihvdHBpbmZvX3QpKTsKKwltZW1zZXQob2ksIDAsIHNpemVvZihvdHBpbmZvX3QpKTsKIAogCW9pLT5jY3JldiA9IHNpaC0+Y2NyZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtc3JvbS5jCmluZGV4IDEyODJlZjcuLjE5ZDQ1MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXNyb20uYwpAQCAtMTUsOSArMTUsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxobmRzb2MuaD4KQEAgLTY2LDI5ICs2OCwzMCBAQAogCiAjZGVmaW5lIFNST01fQ0lTX1NJTkdMRQkxCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqY291bnQpOworc3RhdGljIGludCBpbml0dmFyc19zcm9tX3NpKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmN1cm1hcCwKKwkJCSAgICBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogc3RhdGljIHZvaWQgX2luaXR2YXJzX3Nyb21fcGNpKHU4IHNyb21yZXYsIHUxNiAqc3JvbSwgdWludCBvZmYsCiAJCQkgICAgICAgdmFyYnVmX3QgKmIpOwogc3RhdGljIGludCBpbml0dmFyc19zcm9tX3BjaShzaV90ICpzaWgsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCiAJCQkgICAgIHVpbnQgKmNvdW50KTsKIHN0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2hfc2koc2lfdCAqc2loLCBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKLXN0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8ob3NsX3QgKm9zaCwgdTggY21kKTsKLXN0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKG9zbF90ICpvc2gsIHUxNiBhZGRyLCB1MTYgKmRhdGEpOworc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8oc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IGNtZCk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sIHVpbnQgd29yZG9mZiwKLQkJCSAgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sCisJCQkgIHVpbnQgd29yZG9mZiwgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKK3N0YXRpYyBpbnQgb3RwX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKICNlbmRpZgotc3RhdGljIHUxNiBzcm9tX2NjX2NtZChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmNjcmVncywgdTMyIGNtZCwKK3N0YXRpYyB1MTYgc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAogCQkJICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKTsKIAotc3RhdGljIGludCBpbml0dmFyc190YWJsZShvc2xfdCAqb3NoLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICoqdmFycywKLQkJCSAgdWludCAqY291bnQpOwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKip2cCwgdWludCBsZW4pOworc3RhdGljIGludCBpbml0dmFyc190YWJsZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwKKwkJCSAgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZwLAorCQkJICB1aW50IGxlbik7CiAKIC8qIEluaXRpYWxpemF0aW9uIG9mIHZhcmJ1ZiBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyB2b2lkIHZhcmJ1Zl9pbml0KHZhcmJ1Zl90ICpiLCBjaGFyICpidWYsIHVpbnQgc2l6ZSkKQEAgLTEyOSw3ICsxMzIsNyBAQAogCWlmIChzICE9IE5VTEwpIHsKIAkJbGVuID0gKHNpemVfdCkgKHMgLSBiLT5idWYpOwogCQlmb3IgKHMgPSBiLT5iYXNlOyBzIDwgYi0+YnVmOykgewotCQkJaWYgKChiY21wKHMsIGItPmJ1ZiwgbGVuKSA9PSAwKSAmJiBzW2xlbl0gPT0gJz0nKSB7CisJCQlpZiAoKG1lbWNtcChzLCBiLT5idWYsIGxlbikgPT0gMCkgJiYgc1tsZW5dID09ICc9JykgewogCQkJCWxlbiA9IHN0cmxlbihzKSArIDE7CiAJCQkJbWVtbW92ZShzLCAocyArIGxlbiksCiAJCQkJCSgoYi0+YnVmICsgciArIDEpIC0gKHMgKyBsZW4pKSk7CkBAIC0xNTUsMjEgKzE1OCwyMSBAQAogICogSW5pdGlhbGl6ZSBsb2NhbCB2YXJzIGZyb20gdGhlIHJpZ2h0IHNvdXJjZSBmb3IgdGhpcyBwbGF0Zm9ybS4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLWludCBzcm9tX3Zhcl9pbml0KHNpX3QgKnNpaCwgdWludCBidXN0eXBlLCB2b2lkICpjdXJtYXAsIG9zbF90ICpvc2gsCitpbnQgc3JvbV92YXJfaW5pdChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJICBjaGFyICoqdmFycywgdWludCAqY291bnQpCiB7CiAJdWludCBsZW47CiAKIAlsZW4gPSAwOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAJaWYgKHZhcnMgPT0gTlVMTCB8fCBjb3VudCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCSp2YXJzID0gTlVMTDsKIAkqY291bnQgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKGJ1c3R5cGUpKSB7CisJc3dpdGNoIChidXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBKVEFHX0JVUzoKIAkJcmV0dXJuIGluaXR2YXJzX3Nyb21fc2koc2loLCBvc2gsIGN1cm1hcCwgdmFycywgY291bnQpOwpAQCAtMTk0LDcgKzE5Nyw3IEBACiAKIC8qIHN1cHBvcnQgb25seSAxNi1iaXQgd29yZCByZWFkIGZyb20gc3JvbSAqLwogaW50Ci1zcm9tX3JlYWQoc2lfdCAqc2loLCB1aW50IGJ1c3R5cGUsIHZvaWQgKmN1cm1hcCwgb3NsX3QgKm9zaCwKK3Nyb21fcmVhZChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYykKIHsKIAl1aW50IG9mZiwgbnc7CkBAIC0yMDIsNyArMjA1LDcgQEAKIAl1aW50IGk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAKIAkvKiBjaGVjayBpbnB1dCAtIDE2LWJpdCBhY2Nlc3Mgb25seSAqLwogCWlmIChieXRlb2ZmICYgMSB8fCBuYnl0ZXMgJiAxIHx8IChieXRlb2ZmICsgbmJ5dGVzKSA+IFNST01fTUFYKQpAQCAtMjExLDcgKzIxNCw3IEBACiAJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJbncgPSBuYnl0ZXMgLyAyOwogCi0JaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJaWYgKCFjdXJtYXApCiAJCQlyZXR1cm4gMTsKIApAQCAtMjMzLDcgKzIzNiw3IEBACiAJCX0KICNlbmRpZgogI2lmZGVmIEJDTVNESU8KLQl9IGVsc2UgaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU0RJT19CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJCW53ID0gbmJ5dGVzIC8gMjsKIAkJZm9yIChpID0gMDsgaSA8IG53OyBpKyspIHsKQEAgLTI0Miw3ICsyNDUsNyBAQAogCQkJCXJldHVybiAxOwogCQl9CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotCX0gZWxzZSBpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBTSV9CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0lfQlVTKSB7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7CiAJCXJldHVybiAxOwpAQCAtMzc2LDcgKzM3OSw4IEBACiAvKiBGb3IgZG9uZ2xlIEhXLCBhY2NlcHQgcGFydGlhbCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIEJDTURPTkdMRUNBU0UobikKIAotaW50IHNyb21fcGFyc2VjaXMob3NsX3QgKm9zaCwgdTggKnBjaXNbXSwgdWludCBjaXNjbnQsIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKK2ludCBzcm9tX3BhcnNlY2lzKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCAqcGNpc1tdLCB1aW50IGNpc2NudCwgY2hhciAqKnZhcnMsCisJCSAgdWludCAqY291bnQpCiB7CiAJY2hhciBlYWJ1ZlszMl07CiAJY2hhciAqYmFzZTsKQEAgLTQwMiw3ICs0MDYsNyBAQAogCQlyZXR1cm4gLTI7CiAKIAl2YXJidWZfaW5pdCgmYiwgYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7Ci0JYnplcm8oYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7CisJbWVtc2V0KGJhc2UsIDAsIE1BWFNaX05WUkFNX1ZBUlMpOwogCWVhYnVmWzBdID0gJ1wwJzsKIAlmb3IgKGNpc251bSA9IDA7IGNpc251bSA8IGNpc2NudDsgY2lzbnVtKyspIHsKIAkJY2lzID0gKnBjaXMrKzsKQEAgLTQ5NiwxMiArNTAwLDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCS8qIHNldCBtYWNhZGRyIGlmIEhOQlVfTUFDQUREUiBub3Qgc2VlbiB5ZXQgKi8KLQkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcKLQkJCQkJICAgICYmIGNpc1tpXSA9PSBMQU5fTklECi0JCQkJCSAgICAmJiAhKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMl0pKQotCQkJCQkgICAgJiYgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDJdKSkpIHsKKwkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcgJiYKKwkJCQkJICAgIGNpc1tpXSA9PSBMQU5fTklEICYmCisJCQkJCSAgICAhaXNfemVyb19ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSAmJgorCQkJCQkgICAgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSkgewogCQkJCQkJQVNTRVJUKGNpc1tpICsgMV0gPT0KLQkJCQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJCQkJc25wcmludGYoZWFidWYsIHNpemVvZihlYWJ1ZiksCiAJCQkJCQkJIiVwTSIsICZjaXNbaSArIDJdKTsKIApAQCAtOTcwLDggKzk3NCw4IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBITkJVX01BQ0FERFI6Ci0JCQkJCWlmICghKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMV0pKSAmJgotCQkJCQkgICAgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDFdKSkpIHsKKwkJCQkJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pICYmCisJCQkJCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pKSB7CiAJCQkJCQlzbnByaW50ZihlYWJ1Ziwgc2l6ZW9mKGVhYnVmKSwKIAkJCQkJCQkiJXBNIiwgJmNpc1tpICsgMV0pOwogCkBAIC0xNDA1LDggKzE0MDksOCBAQAogICogbm90IGluIHRoZSBidXMgY29yZXMuCiAgKi8KIHN0YXRpYyB1MTYKLXNyb21fY2NfY21kKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLCB1aW50IHdvcmRvZmYsCi0JICAgIHUxNiBkYXRhKQorc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAorCSAgICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKQogewogCWNoaXBjcmVnc190ICpjYyA9IChjaGlwY3JlZ3NfdCAqKSBjY3JlZ3M7CiAJdWludCB3YWl0X2NudCA9IDEwMDA7CkBAIC0xNDM5LDcgKzE0NDMsNyBAQAogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwogc3RhdGljIGludAotc3Byb21fcmVhZF9wY2kob3NsX3QgKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCitzcHJvbV9yZWFkX3BjaShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCiAJICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCiB7CiAJaW50IGVyciA9IDA7CkBAIC0xNDk5LDcgKzE1MDMsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KQorc3RhdGljIGludCBvdHBfcmVhZF9wY2koc3RydWN0IG9zbF9pbmZvICpvc2gsIHNpX3QgKnNpaCwgdTE2ICpidWYsIHVpbnQgYnVmc3opCiB7CiAJdTggKm90cDsKIAl1aW50IHN6ID0gT1RQX1NaX01BWCAvIDI7CS8qIHNpemUgaW4gd29yZHMgKi8KQEAgLTE1NDcsOCArMTU1MSw4IEBACiAqIENyZWF0ZSB2YXJpYWJsZSB0YWJsZSBmcm9tIG1lbW9yeS4KICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICovCi1zdGF0aWMgaW50IGluaXR2YXJzX3RhYmxlKG9zbF90ICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKip2YXJzLAotCQkJICB1aW50ICpjb3VudCkKK3N0YXRpYyBpbnQgaW5pdHZhcnNfdGFibGUoc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsCisJCQkgIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKIHsKIAlpbnQgYyA9IChpbnQpKGVuZCAtIHN0YXJ0KTsKIApAQCAtMTU3NCw3ICsxNTc4LDggQEAKICAqIG9mIHRoZSB0YWJsZSB1cG9uIGVudGVyIGFuZCB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZSB1cG9uIGV4aXQgd2hlbiBzdWNjZXNzLgogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKipiYXNlLCB1aW50IGxlbikKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKmJhc2UsCisJCQkgIHVpbnQgbGVuKQogewogCWNoYXIgKnZwID0gKmJhc2U7CiAJY2hhciAqZmxhc2g7CkBAIC0xNjM0LDcgKzE2MzksNyBAQAogICovCiBzdGF0aWMgaW50IGluaXR2YXJzX2ZsYXNoX3NpKHNpX3QgKnNpaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewotCW9zbF90ICpvc2ggPSBzaV9vc2goc2loKTsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHNpX29zaChzaWgpOwogCWNoYXIgKnZwLCAqYmFzZTsKIAlpbnQgZXJyOwogCkBAIC0xODQ1LDcgKzE4NTAsNyBAQAogCXUzMiBzcjsKIAl2YXJidWZfdCBiOwogCWNoYXIgKnZwLCAqYmFzZSA9IE5VTEw7Ci0Jb3NsX3QgKm9zaCA9IHNpX29zaChzaWgpOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gc2lfb3NoKHNpaCk7CiAJYm9vbCBmbGFzaCA9IGZhbHNlOwogCWludCBlcnIgPSAwOwogCkBAIC0xOTg2LDcgKzE5OTEsNyBAQAogICogUmVhZCB0aGUgU0RJTyBjaXMgYW5kIGNhbGwgcGFyc2VjaXMgdG8gaW5pdGlhbGl6ZSB0aGUgdmFycy4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQorc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewogCXU4ICpjaXNbU0JTRElPX05VTV9GVU5DVElPTiArIDFdOwogCXVpbnQgZm4sIG51bWZuOwpAQCAtMjAyMCw3ICsyMDI1LDcgQEAKIH0KIAogLyogc2V0IFNESU8gc3Byb20gY29tbWFuZCByZWdpc3RlciAqLwotc3RhdGljIGludCBzcHJvbV9jbWRfc2Rpbyhvc2xfdCAqb3NoLCB1OCBjbWQpCitzdGF0aWMgaW50IHNwcm9tX2NtZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBjbWQpCiB7CiAJdTggc3RhdHVzID0gMDsKIAl1aW50IHdhaXRfY250ID0gMTAwMDsKQEAgLTIwNDAsNyArMjA0NSw3IEBACiB9CiAKIC8qIHJlYWQgYSB3b3JkIGZyb20gdGhlIFNESU8gc3JvbSAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3NkaW8ob3NsX3QgKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSkKK3N0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1MTYgYWRkciwgdTE2ICpkYXRhKQogewogCXU4IGFkZHJfbCwgYWRkcl9oLCBkYXRhX2wsIGRhdGFfaDsKIApAQCAtMjA2OCw4ICsyMDczLDggQEAKIH0KICNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqdmFyc3opCitzdGF0aWMgaW50IGluaXR2YXJzX3Nyb21fc2koc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY3VybWFwLAorCQkJICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAkvKiBTZWFyY2ggZmxhc2ggbnZyYW0gc2VjdGlvbiBmb3Igc3JvbSB2YXJpYWJsZXMgKi8KIAlyZXR1cm4gaW5pdHZhcnNfZmxhc2hfc2koc2loLCB2YXJzLCB2YXJzeik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCmluZGV4IDk3ODllYTQuLmZkMzBjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCkBAIC0xOSw4ICsxOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbW52cmFtLmg+CkBAIC0zMCwyNiArMzIsMjYgQEAKICNpbmNsdWRlIDxwcm90by84MDIuMWQuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KIAotCiAvKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCi11aW50IHBrdGZyb21idWYob3NsX3QgKm9zaCwgdm9pZCAqcCwgdWludCBvZmZzZXQsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3VpbnQgcGt0ZnJvbWJ1ZihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAsIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLAorCQl1bnNpZ25lZCBjaGFyICpidWYpCiB7CiAJdWludCBuLCByZXQgPSAwOwogCiAJLyogc2tpcCAnb2Zmc2V0JyBieXRlcyAqLwotCWZvciAoOyBwICYmIG9mZnNldDsgcCA9IFBLVE5FWFQocCkpIHsKLQkJaWYgKG9mZnNldCA8ICh1aW50KSBQS1RMRU4ocCkpCisJZm9yICg7IHAgJiYgb2Zmc2V0OyBwID0gcC0+bmV4dCkgeworCQlpZiAob2Zmc2V0IDwgKHVpbnQpIChwLT5sZW4pKQogCQkJYnJlYWs7Ci0JCW9mZnNldCAtPSBQS1RMRU4ocCk7CisJCW9mZnNldCAtPSBwLT5sZW47CiAJfQogCiAJaWYgKCFwKQogCQlyZXR1cm4gMDsKIAogCS8qIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKDsgcCAmJiBsZW47IHAgPSBQS1RORVhUKHApKSB7Ci0JCW4gPSBtaW4oKHVpbnQpIFBLVExFTihwKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7Ci0JCWJjb3B5KGJ1ZiwgUEtUREFUQShwKSArIG9mZnNldCwgbik7CisJZm9yICg7IHAgJiYgbGVuOyBwID0gcC0+bmV4dCkgeworCQluID0gbWluKCh1aW50KSAocC0+bGVuKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7CisJCWJjb3B5KGJ1ZiwgcC0+ZGF0YSArIG9mZnNldCwgbik7CiAJCWJ1ZiArPSBuOwogCQlsZW4gLT0gbjsKIAkJcmV0ICs9IG47CkBAIC01OSwxMyArNjEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogLyogcmV0dXJuIHRvdGFsIGxlbmd0aCBvZiBidWZmZXIgY2hhaW4gKi8KLXVpbnQgQkNNRkFTVFBBVEggcGt0dG90bGVuKG9zbF90ICpvc2gsIHZvaWQgKnApCit1aW50IEJDTUZBU1RQQVRIIHBrdHRvdGxlbihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnApCiB7CiAJdWludCB0b3RhbDsKIAogCXRvdGFsID0gMDsKLQlmb3IgKDsgcDsgcCA9IFBLVE5FWFQocCkpCi0JCXRvdGFsICs9IFBLVExFTihwKTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpCisJCXRvdGFsICs9IHAtPmxlbjsKIAlyZXR1cm4gdG90YWw7CiB9CiAKQEAgLTczLDEyICs3NSwxMyBAQAogICogb3NsIG11bHRpcGxlLXByZWNlZGVuY2UgcGFja2V0IHF1ZXVlCiAgKiBoaV9wcmVjIGlzIGFsd2F5cyA+PSB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0IG5vbi1lbXB0eSBwcmVjZWRlbmNlCiAgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCB2b2lkICpwKQorc3RydWN0IHNrX2J1ZmYgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7CiAKIAlBU1NFUlQocHJlYyA+PSAwICYmIHByZWMgPCBwcS0+bnVtX3ByZWMpOwotCUFTU0VSVChQS1RMSU5LKHApID09IE5VTEwpOwkvKiBxdWV1ZWluZyBjaGFpbnMgbm90IGFsbG93ZWQgKi8KKwlBU1NFUlQocC0+cHJldiA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCiAKIAlBU1NFUlQoIXBrdHFfZnVsbChwcSkpOwogCUFTU0VSVCghcGt0cV9wZnVsbChwcSwgcHJlYykpOwpAQCAtODYsNyArODksNyBAQAogCXEgPSAmcHEtPnFbcHJlY107CiAKIAlpZiAocS0+aGVhZCkKLQkJUEtUU0VUTElOSyhxLT50YWlsLCBwKTsKKwkJcS0+dGFpbC0+cHJldiA9IHA7CiAJZWxzZQogCQlxLT5oZWFkID0gcDsKIApAQCAtMTAxLDEyICsxMDQsMTMgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgdm9pZCAqcCkKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlzdHJ1Y3QgcGt0cV9wcmVjICpxOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKLQlBU1NFUlQoUEtUTElOSyhwKSA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCisJQVNTRVJUKHAtPnByZXYgPT0gTlVMTCk7CS8qIHF1ZXVlaW5nIGNoYWlucyBub3QgYWxsb3dlZCAqLwogCiAJQVNTRVJUKCFwa3RxX2Z1bGwocHEpKTsKIAlBU1NFUlQoIXBrdHFfcGZ1bGwocHEsIHByZWMpKTsKQEAgLTExNiw3ICsxMjAsNyBAQAogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBwOwogCi0JUEtUU0VUTElOSyhwLCBxLT5oZWFkKTsKKwlwLT5wcmV2ID0gcS0+aGVhZDsKIAlxLT5oZWFkID0gcDsKIAlxLT5sZW4rKzsKIApAQCAtMTI4LDEwICsxMzIsMTAgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTQxLDcgKzE0NSw3IEBACiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwlxLT5oZWFkID0gcC0+cHJldjsKIAlpZiAocS0+aGVhZCA9PSBOVUxMKQogCQlxLT50YWlsID0gTlVMTDsKIApAQCAtMTQ5LDE1ICsxNTMsMTUgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BkZXFfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2OwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTY3LDExICsxNzEsMTEgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAocHJldiA9IE5VTEw7IHAgIT0gcS0+dGFpbDsgcCA9IFBLVExJTksocCkpCisJZm9yIChwcmV2ID0gTlVMTDsgcCAhPSBxLT50YWlsOyBwID0gcC0+cHJldikKIAkJcHJldiA9IHA7CiAKIAlpZiAocHJldikKLQkJUEtUU0VUTElOSyhwcmV2LCBOVUxMKTsKKwkJcHJldi0+cHJldiA9IE5VTEw7CiAJZWxzZQogCQlxLT5oZWFkID0gTlVMTDsKIApAQCAtMTg0LDE3ICsxODgsMTcgQEAKIH0KIAogI2lmZGVmIEJSQ01fRlVMTE1BQwotdm9pZCBwa3RxX3BmbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCBib29sIGRpcikKK3ZvaWQgcGt0cV9wZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIGJvb2wgZGlyKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CiAJd2hpbGUgKHApIHsKLQkJcS0+aGVhZCA9IFBLVExJTksocCk7Ci0JCVBLVFNFVExJTksocCwgTlVMTCk7Ci0JCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQlxLT5oZWFkID0gcC0+cHJldjsKKwkJcC0+cHJldiA9IE5VTEw7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBkaXIpOwogCQlxLT5sZW4tLTsKIAkJcHEtPmxlbi0tOwogCQlwID0gcS0+aGVhZDsKQEAgLTIwMyw3ICsyMDcsNyBAQAogCXEtPnRhaWwgPSBOVUxMOwogfQogCi12b2lkIHBrdHFfZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKK3ZvaWQgcGt0cV9mbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKIHsKIAlpbnQgcHJlYzsKIAlmb3IgKHByZWMgPSAwOyBwcmVjIDwgcHEtPm51bV9wcmVjOyBwcmVjKyspCkBAIC0yMTIsMTEgKzIxNiwxMSBAQAogfQogI2Vsc2UgLyogIUJSQ01fRlVMTE1BQyAqLwogdm9pZAotcGt0cV9wZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsIGlmcGt0X2NiX3QgZm4sCi0JICAgIGludCBhcmcpCitwa3RxX3BmbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsCisJICAgIGlmcGt0X2NiX3QgZm4sIGludCBhcmcpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwLCAqcHJldiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CkBAIC0yMjQsMTcgKzIyOCwxNyBAQAogCQlpZiAoZm4gPT0gTlVMTCB8fCAoKmZuKSAocCwgYXJnKSkgewogCQkJYm9vbCBoZWFkID0gKHAgPT0gcS0+aGVhZCk7CiAJCQlpZiAoaGVhZCkKLQkJCQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwkJCQlxLT5oZWFkID0gcC0+cHJldjsKIAkJCWVsc2UKLQkJCQlQS1RTRVRMSU5LKHByZXYsIFBLVExJTksocCkpOwotCQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKLQkJCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQkJCXByZXYtPnByZXYgPSBwLT5wcmV2OworCQkJcC0+cHJldiA9IE5VTEw7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcCwgZGlyKTsKIAkJCXEtPmxlbi0tOwogCQkJcHEtPmxlbi0tOwotCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IFBLVExJTksocHJldikpOworCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IHByZXYtPnByZXYpOwogCQl9IGVsc2UgewogCQkJcHJldiA9IHA7Ci0JCQlwID0gUEtUTElOSyhwKTsKKwkJCXAgPSBwLT5wcmV2OwogCQl9CiAJfQogCkBAIC0yNDQsNyArMjQ4LDggQEAKIAl9CiB9CiAKLXZvaWQgcGt0cV9mbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLCBpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQordm9pZCBwa3RxX2ZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAorCQlpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQogewogCWludCBwcmVjOwogCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+bnVtX3ByZWM7IHByZWMrKykKQEAgLTI2MSw3ICsyNjYsNyBAQAogCUFTU0VSVChudW1fcHJlYyA+IDAgJiYgbnVtX3ByZWMgPD0gUEtUUV9NQVhfUFJFQyk7CiAKIAkvKiBwcSBpcyB2YXJpYWJsZSBzaXplOyBvbmx5IHplcm8gb3V0IHdoYXQncyByZXF1ZXN0ZWQgKi8KLQliemVybyhwcSwKKwltZW1zZXQocHEsIDAsCiAJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHBrdHEsIHEpICsgKHNpemVvZihzdHJ1Y3QgcGt0cV9wcmVjKSAqIG51bV9wcmVjKSk7CiAKIAlwcS0+bnVtX3ByZWMgPSAodTE2KSBudW1fcHJlYzsKQEAgLTI3Miw3ICsyNzcsNyBAQAogCQlwcS0+cVtwcmVjXS5tYXggPSBwcS0+bWF4OwogfQogCi12b2lkICpwa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgKnByZWNfb3V0KQogewogCWludCBwcmVjOwogCkBAIC0zMDMsMTAgKzMwOCwxMSBAQAogCXJldHVybiBsZW47CiB9CiAvKiBQcmlvcml0eSBkZXF1ZXVlIGZyb20gYSBzcGVjaWZpYyBzZXQgb2YgcHJlY2VkZW5jZXMgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwKKwkJCQkgICAgICBpbnQgKnByZWNfb3V0KQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAlpbnQgcHJlYzsKIAogCWlmIChwcS0+bGVuID09IDApCkBAIC0zMjUsNyArMzMxLDcgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXEtPmhlYWQgPSBQS1RMSU5LKHApOworCXEtPmhlYWQgPSBwLT5wcmV2OwogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBOVUxMOwogCkBAIC0zMzYsNyArMzQyLDcgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTM3Myw3ICszNzksNyBAQAogCiAJLyogZmlyc3QgbG9vayBpbiB2YXJzW10gKi8KIAlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpAQCAtNDA0LDE1ICs0MTAsMTUgQEAKIAogI2lmIGRlZmluZWQoQkNNREJHKQogLyogcHJldHR5IGhleCBwcmludCBhIHBrdCBidWZmZXIgY2hhaW4gKi8KLXZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBvc2xfdCAqb3NoLCB2b2lkICpwMCkKK3ZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAwKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAKIAlpZiAobXNnICYmIChtc2dbMF0gIT0gJ1wwJykpCiAJCXByaW50ZigiJXM6XG4iLCBtc2cpOwogCi0JZm9yIChwID0gcDA7IHA7IHAgPSBQS1RORVhUKHApKQotCQlwcmhleChOVUxMLCBQS1REQVRBKHApLCBQS1RMRU4ocCkpOworCWZvciAocCA9IHAwOyBwOyBwID0gcC0+bmV4dCkKKwkJcHJoZXgoTlVMTCwgcC0+ZGF0YSwgcC0+bGVuKTsKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY213aWZpLmMKaW5kZXggMWJiNmM3OC4uODFlNTRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtd2lmaS5jCkBAIC0xNSw2ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYwppbmRleCBmZTUwM2U3Li5kMDg4NjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZGRtYS5jCkBAIC0xNiw3ICsxNiw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CkBAIC0yOCw2ICsyOSwxMCBAQAogI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8aG5kZG1hLmg+CiAKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNlbmRpZgorCiAvKiBkZWJ1Zy90cmFjZSAqLwogI2lmZGVmIEJDTURCRwogI2RlZmluZQlETUFfRVJST1IoYXJncykgXApAQCAtNjgsMTEgKzczLDEyIEBACiAKICNkZWZpbmUJRElfSU5GTyhkbWFoKQkoKGRtYV9pbmZvX3QgKilkbWFoKQogCisjZGVmaW5lIFJfU00ocikJCSgqKHIpKQorI2RlZmluZSBXX1NNKHIsIHYpCSgqKHIpID0gKHYpKQorCiAvKiBkbWEgZW5naW5lIHNvZnR3YXJlIHN0YXRlICovCiB0eXBlZGVmIHN0cnVjdCBkbWFfaW5mbyB7Ci0Jc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOwkvKiBleHBvcnRlZCBzdHJ1Y3R1cmUsIGRvbid0IHVzZSBobmRkbWFfdCwKLQkJCQkJICogd2hpY2ggY291bGQgYmUgY29uc3QKLQkJCQkJICovCisJc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOyAvKiBleHBvcnRlZCBzdHJ1Y3R1cmUgKi8KIAl1aW50ICptc2dfbGV2ZWw7CS8qIG1lc3NhZ2UgbGV2ZWwgcG9pbnRlciAqLwogCWNoYXIgbmFtZVtNQVhOQU1FTF07CS8qIGNhbGxlcnMgbmFtZSBmb3IgZGlhZyBtc2dzICovCiAKQEAgLTIyMiw3ICsyMjgsNyBAQAogc3RhdGljIHZvaWQgX2RtYV9maWZvbG9vcGJhY2tlbmFibGUoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIHVpbnQgX2RtYV9jdHJsZmxhZ3MoZG1hX2luZm9fdCAqZGksIHVpbnQgbWFzaywgdWludCBmbGFncyk7CiBzdGF0aWMgdTggZG1hX2FsaWduX3NpemV0b2JpdHModWludCBzaXplKTsKLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKTsKIApAQCAtMjMxLDcgKzIzNyw3IEBACiBzdGF0aWMgYm9vbCBkbWEzMl90eHJlc2V0KGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTMyX3J4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfdHhzdXNwZW5kZWRpZGxlKGRtYV9pbmZvX3QgKmRpKTsKLXN0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCB2b2lkICpwMCwgYm9vbCBjb21taXQpOworc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTMyX2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKIHN0YXRpYyB2b2lkICpkbWEzMl9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKTsKIHN0YXRpYyB2b2lkIGRtYTMyX3R4cm90YXRlKGRtYV9pbmZvX3QgKmRpKTsKQEAgLTI0NiwxNCArMjUyLDE0IEBACiBzdGF0aWMgYm9vbCBkbWEzMl9yeHN0b3BwZWQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfcnhlbmFibGVkKGRtYV9pbmZvX3QgKmRpKTsKIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CitzdGF0aWMgYm9vbCBfZG1hMzJfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CiAKIC8qIFByb3RvdHlwZXMgZm9yIDY0LWJpdCByb3V0aW5lcyAqLwogc3RhdGljIGJvb2wgZG1hNjRfYWxsb2MoZG1hX2luZm9fdCAqZGksIHVpbnQgZGlyZWN0aW9uKTsKIHN0YXRpYyBib29sIGRtYTY0X3R4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hNjRfcnhyZXNldChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF90eHN1c3BlbmRlZGlkbGUoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGludCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCk7CitzdGF0aWMgaW50IGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgc3RydWN0IHNrX2J1ZmYgKnAwLCBib29sIGNvbW1pdCk7CiBzdGF0aWMgaW50IGRtYTY0X3R4dW5mcmFtZWQoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCB1aW50IGxlbiwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldHBvcyhkbWFfaW5mb190ICpkaSwgYm9vbCBkaXJlY3Rpb24pOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKQEAgLTI3MCw3ICsyNzYsNyBAQAogc3RhdGljIGJvb2wgZG1hNjRfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTY0X3J4c3RvcHBlZChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF9yeGVuYWJsZWQoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHBhcml0eTMyKHUzMiBkYXRhKTsKIApAQCAtMzY4LDEwICszNzQsMTAgQEAKIAkzOQogfTsKIAotaG5kZG1hX3QgKmRtYV9hdHRhY2gob3NsX3QgKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLCB2b2lkICpkbWFyZWdzdHgsCi0JCSAgICAgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsIHVpbnQgbnJ4ZCwgdWludCByeGJ1ZnNpemUsCi0JCSAgICAgaW50IHJ4ZXh0aGVhZHJvb20sIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwKLQkJICAgICB1aW50ICptc2dfbGV2ZWwpCitzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1hX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLAorCQkgICAgIHZvaWQgKmRtYXJlZ3N0eCwgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsCisJCSAgICAgdWludCBucnhkLCB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCisJCSAgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpCiB7CiAJZG1hX2luZm9fdCAqZGk7CiAJdWludCBzaXplOwpAQCAtNTcwLDcgKzU3Niw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gKGhuZGRtYV90ICopIGRpOworCXJldHVybiAoc3RydWN0IGhuZGRtYV9wdWIgKikgZGk7CiAKICBmYWlsOgogCV9kbWFfZGV0YWNoKGRpKTsKQEAgLTY2Myw3ICs2NjksNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncykKK3N0YXRpYyBib29sIF9kbWEzMl9hZGRyZXh0KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzKQogewogCXUzMiB3OwogCkBAIC05MDIsNyArOTA4LDcgQEAKIAogCS8qIGNsZWFyIHJ4IGRlc2NyaXB0b3IgcmluZyAqLwogCWlmIChETUE2NF9FTkFCKGRpKSAmJiBETUE2NF9NT0RFKGRpKSkgewotCQlCWkVST19TTSgodm9pZCAqKWRpLT5yeGQ2NCwKKwkJbWVtc2V0KCh2b2lkICopZGktPnJ4ZDY0LCAnXDAnLAogCQkJIChkaS0+bnJ4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkJLyogRE1BIGVuZ2luZSB3aXRoIG91dCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCkBAIC05MTYsNyArOTIyLDcgQEAKIAkJaWYgKGRpLT5hbGlnbmRlc2NfNGspCiAJCQlfZG1hX2RkdGFibGVfaW5pdChkaSwgRE1BX1JYLCBkaS0+cnhkcGEpOwogCX0gZWxzZSBpZiAoRE1BMzJfRU5BQihkaSkpIHsKLQkJQlpFUk9fU00oKHZvaWQgKilkaS0+cnhkMzIsCisJCW1lbXNldCgodm9pZCAqKWRpLT5yeGQzMiwgJ1wwJywKIAkJCSAoZGktPm5yeGQgKiBzaXplb2YoZG1hMzJkZF90KSkpOwogCQlfZG1hX3J4ZW5hYmxlKGRpKTsKIAkJX2RtYV9kZHRhYmxlX2luaXQoZGksIERNQV9SWCwgZGktPnJ4ZHBhKTsKQEAgLTk3OCw3ICs5ODQsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9yeChkbWFfaW5mb190ICpkaSkKIHsKLQl2b2lkICpwLCAqaGVhZCwgKnRhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpoZWFkLCAqdGFpbDsKIAl1aW50IGxlbjsKIAl1aW50IHBrdF9sZW47CiAJaW50IHJlc2lkID0gMDsKQEAgLTk4OCwzMCArOTk0LDMxIEBACiAJaWYgKGhlYWQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBsdG9oMTYoKih1MTYgKikgKFBLVERBVEEoaGVhZCkpKTsKKwlsZW4gPSBsdG9oMTYoKih1MTYgKikgKGhlYWQtPmRhdGEpKTsKIAlETUFfVFJBQ0UoKCIlczogZG1hX3J4IGxlbiAlZFxuIiwgZGktPm5hbWUsIGxlbikpOwogCiAjaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgT1NMX1VOQ0FDSEVEKHZhKSAgICAgICAgKCh2b2lkICopS1NFRzFBRERSKCh2YSkpKQogCWlmICghbGVuKSB7Ci0JCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChQS1REQVRBKGhlYWQpKSkpCisJCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChoZWFkLT5kYXRhKSkpCiAJCQl1ZGVsYXkoMSk7CiAKLQkJKih1MTYgKikgUEtUREFUQShoZWFkKSA9IGh0b2wxNigodTE2KSBsZW4pOworCQkqKHUxNiAqKSAoaGVhZC0+ZGF0YSkgPSBodG9sMTYoKHUxNikgbGVuKTsKIAl9CiAjZW5kaWYJCQkJLyogZGVmaW5lZChfX21pcHNfXykgKi8KIAogCS8qIHNldCBhY3R1YWwgbGVuZ3RoICovCiAJcGt0X2xlbiA9IG1pbigoZGktPnJ4b2Zmc2V0ICsgbGVuKSwgZGktPnJ4YnVmc2l6ZSk7Ci0JUEtUU0VUTEVOKGhlYWQsIHBrdF9sZW4pOworCV9fc2tiX3RyaW0oaGVhZCwgcGt0X2xlbik7CiAJcmVzaWQgPSBsZW4gLSAoZGktPnJ4YnVmc2l6ZSAtIGRpLT5yeG9mZnNldCk7CiAKIAkvKiBjaGVjayBmb3Igc2luZ2xlIG9yIG11bHRpLWJ1ZmZlciByeCAqLwogCWlmIChyZXNpZCA+IDApIHsKIAkJdGFpbCA9IGhlYWQ7CiAJCXdoaWxlICgocmVzaWQgPiAwKSAmJiAocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpKSkgewotCQkJUEtUU0VUTkVYVCh0YWlsLCBwKTsKKwkJCXRhaWwtPm5leHQgPSBwOwogCQkJcGt0X2xlbiA9IG1pbihyZXNpZCwgKGludClkaS0+cnhidWZzaXplKTsKLQkJCVBLVFNFVExFTihwLCBwa3RfbGVuKTsKKwkJCV9fc2tiX3RyaW0ocCwgcGt0X2xlbik7CiAKIAkJCXRhaWwgPSBwOwogCQkJcmVzaWQgLT0gZGktPnJ4YnVmc2l6ZTsKQEAgLTEwMzcsNyArMTA0NCw3IEBACiAJCWlmICgoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9SWE1VTFRJKSA9PSAwKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4OiBiYWQgZnJhbWUgbGVuZ3RoICglZClcbiIsCiAJCQkJICAgZGktPm5hbWUsIGxlbikpOwotCQkJUEtURlJFRShkaS0+b3NoLCBoZWFkLCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIGhlYWQsIGZhbHNlKTsKIAkJCWRpLT5obmRkbWEucnhnaWFudHMrKzsKIAkJCWdvdG8gbmV4dF9mcmFtZTsKIAkJfQpAQCAtMTA1Myw3ICsxMDYwLDcgQEAKICAqLwogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEggX2RtYV9yeGZpbGwoZG1hX2luZm9fdCAqZGkpCiB7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAl1MTYgcnhpbiwgcnhvdXQ7CiAJdTMyIGZsYWdzID0gMDsKIAl1aW50IG47CkBAIC0xMDg1LDcgKzEwOTIsNyBAQAogCQkgICBzaXplIHRvIGJlIGFsbG9jYXRlZAogCQkgKi8KIAotCQlwID0gb3NsX3BrdGdldChkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKKwkJcCA9IHBrdF9idWZfZ2V0X3NrYihkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKIAogCQlpZiAocCA9PSBOVUxMKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4ZmlsbDogb3V0IG9mIHJ4YnVmc1xuIiwKQEAgLTExMDksMTcgKzExMTYsMTggQEAKIAkJfQogCQkvKiByZXNlcnZlIGFuIGV4dHJhIGhlYWRyb29tLCBpZiBhcHBsaWNhYmxlICovCiAJCWlmIChleHRyYV9vZmZzZXQpCi0JCQlQS1RQVUxMKHAsIGV4dHJhX29mZnNldCk7CisJCQlza2JfcHVsbChwLCBleHRyYV9vZmZzZXQpOwogCiAJCS8qIERvIGEgY2FjaGVkIHdyaXRlIGluc3RlYWQgb2YgdW5jYWNoZWQgd3JpdGUgc2luY2UgRE1BX01BUAogCQkgKiB3aWxsIGZsdXNoIHRoZSBjYWNoZS4KIAkJICovCi0JCSoodTMyICopIChQS1REQVRBKHApKSA9IDA7CisJCSoodTMyICopIChwLT5kYXRhKSA9IDA7CiAKIAkJaWYgKERNQVNHTElTVF9FTkFCKQotCQkJYnplcm8oJmRpLT5yeHBfZG1haFtyeG91dF0sIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CisJCQltZW1zZXQoJmRpLT5yeHBfZG1haFtyeG91dF0sIDAsCisJCQkJc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAotCQlwYSA9IERNQV9NQVAoZGktPm9zaCwgUEtUREFUQShwKSwKKwkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIHAtPmRhdGEsCiAJCQkgICAgIGRpLT5yeGJ1ZnNpemUsIERNQV9SWCwgcCwgJmRpLT5yeHBfZG1haFtyeG91dF0pOwogCiAJCUFTU0VSVChJU19BTElHTkVEKFBIWVNBRERSTE8ocGEpLCA0KSk7CkBAIC0xMjIwLDE1ICsxMjI4LDEwIEBACiB7CiAJdm9pZCAqcDsKIAotCS8qICJ1bnVzZWQgbG9jYWwiIHdhcm5pbmcgc3VwcHJlc3Npb24gZm9yIE9TTHMgdGhhdAotCSAqIGRlZmluZSBQS1RGUkVFKCkgd2l0aG91dCB1c2luZyB0aGUgZGktPm9zaCBhcmcKLQkgKi8KLQlkaSA9IGRpOwotCiAJRE1BX1RSQUNFKCgiJXM6IGRtYV9yeHJlY2xhaW1cbiIsIGRpLT5uYW1lKSk7CiAKIAl3aGlsZSAoKHAgPSBfZG1hX2dldG5leHRyeHAoZGksIHRydWUpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2IoZGktPm9zaCwgcCwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKQpAQCAtMTM3Miw3ICsxMzc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkbWFfdHhwaW9sb29wYmFjayhvc2xfdCAqb3NoLCBkbWEzMnJlZ3NfdCAqcmVncykKK3ZvaWQgZG1hX3R4cGlvbG9vcGJhY2soc3RydWN0IG9zbF9pbmZvICpvc2gsIGRtYTMycmVnc190ICpyZWdzKQogewogCU9SX1JFRyhvc2gsICZyZWdzLT5jb250cm9sLCBYQ19MRSk7CiB9CkBAIC0xMzk1LDcgKzEzOTgsNyBAQAogICogZGVzY3JpcHRvciByaW5nIHNpemUgYWxpZ25lZCBsb2NhdGlvbi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaW5nIHdpbGwKICAqIG5vdCBjcm9zcyBwYWdlIGJvdW5kYXJ5CiAgKi8KLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKQogewpAQCAtMTQzNCw3ICsxNDM3LDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQzMiwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTMyZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkMzIsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWEzMmRkX3QpKSk7CiAKIAlpZiAoKGRpLT5obmRkbWEuZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSA9PSAwKQogCQljb250cm9sIHw9IFhDX1BEOwpAQCAtMTQ5MSw3ICsxNDk0LDcgQEAKIAkJcmV0dXJuOwogCiAJd2hpbGUgKChwID0gZG1hMzJfZ2V0bmV4dHR4cChkaSwgcmFuZ2UpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIH0KIAogc3RhdGljIGJvb2wgZG1hMzJfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKQpAQCAtMTY1MSw5ICsxNjU0LDkgQEAKICAqIFdBUk5JTkc6IGNhbGwgbXVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBlcnJvci4KICAqICAgdGhlIGVycm9yKHRvc3MgZnJhbWVzKSBjb3VsZCBiZSBmYXRhbCBhbmQgY2F1c2UgbWFueSBzdWJzZXF1ZW50IGhhcmQgdG8gZGVidWcgcHJvYmxlbXMKICAqLwotc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCkKK3N0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCBzdHJ1Y3Qgc2tfYnVmZiAqcDAsIGJvb2wgY29tbWl0KQogewotCXZvaWQgKnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCXVpbnQgbGVuOwogCXUxNiB0eG91dDsKQEAgLTE2NzIsMTIgKzE2NzUsMTIgQEAKIAkJdWludCBuc2VncywgajsKIAkJaG5kZG1hX3NlZ19tYXBfdCAqbWFwOwogCi0JCWRhdGEgPSBQS1REQVRBKHApOwotCQlsZW4gPSBQS1RMRU4ocCk7CisJCWRhdGEgPSBwLT5kYXRhOworCQlsZW4gPSBwLT5sZW47CiAjaWZkZWYgQkNNX0RNQVBBRAogCQlsZW4gKz0gUEtURE1BUEFEKGRpLT5vc2gsIHApOwogI2VuZGlmCi0JCW5leHQgPSBQS1RORVhUKHApOworCQluZXh0ID0gcC0+bmV4dDsKIAogCQkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KIAkJaWYgKE5FWFRUWEQodHhvdXQpID09IGRpLT50eGluKQpAQCAtMTY4Nyw3ICsxNjkwLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCXBhID0gRE1BX01BUChkaS0+b3NoLCBkYXRhLCBsZW4sIERNQV9UWCwgcCwKQEAgLTE3NjEsNyArMTc2NSw3IEBACiAKICBvdXRvZnR4ZDoKIAlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHNcbiIsIGRpLT5uYW1lKSk7Ci0JUEtURlJFRShkaS0+b3NoLCBwMCwgdHJ1ZSk7CisJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwMCwgdHJ1ZSk7CiAJZGktPmhuZGRtYS50eGF2YWlsID0gMDsKIAlkaS0+aG5kZG1hLnR4bm9idWYrKzsKIAlyZXR1cm4gLTE7CkBAIC0xOTU5LDcgKzE5NjMsNyBAQAogCQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKIAkJCWJjb3B5KCZkaS0+dHhwX2RtYWhbb2xkXSwgJmRpLT50eHBfZG1haFtuZXddLAogCQkJICAgICAgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbb2xkXSwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKKwkJCW1lbXNldCgmZGktPnR4cF9kbWFoW29sZF0sIDAsIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAJCX0KIAogCQlkaS0+dHhwW29sZF0gPSBOVUxMOwpAQCAtMTk4OSw3ICsxOTkzLDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQ2NCwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTY0ZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkNjQsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkvKiBETUEgZW5naW5lIHdpdGggb3V0IGFsaWdubWVudCByZXF1aXJlbWVudCByZXF1aXJlcyB0YWJsZSB0byBiZSBpbml0ZWQKIAkgKiBiZWZvcmUgZW5hYmxpbmcgdGhlIGVuZ2luZQpAQCAtMjA2MCw3ICsyMDY0LDcgQEAKIAl3aGlsZSAoKHAgPSBkbWE2NF9nZXRuZXh0dHhwKGRpLCByYW5nZSkpKSB7CiAJCS8qIEZvciB1bmZyYW1lZCBkYXRhLCB3ZSBkb24ndCBoYXZlIGFueSBwYWNrZXRzIHRvIGZyZWUgKi8KIAkJaWYgKCEoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9VTkZSQU1FRCkpCi0JCQlQS1RGUkVFKGRpLT5vc2gsIHAsIHRydWUpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIAl9CiB9CiAKQEAgLTIzMDAsOSArMjMwNCwxMCBAQAogICogV0FSTklORzogY2FsbCBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGVycm9yLgogICogICB0aGUgZXJyb3IodG9zcyBmcmFtZXMpIGNvdWxkIGJlIGZhdGFsIGFuZCBjYXVzZSBtYW55IHN1YnNlcXVlbnQgaGFyZCB0byBkZWJ1ZyBwcm9ibGVtcwogICovCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgdm9pZCAqcDAsIGJvb2wgY29tbWl0KQorc3RhdGljIGludCBCQ01GQVNUUEFUSCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwKKwkJCQkgICAgYm9vbCBjb21taXQpCiB7Ci0Jdm9pZCAqcCwgKm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJdWludCBsZW47CiAJdTE2IHR4b3V0OwpAQCAtMjMyMSwxMiArMjMyNiwxMiBAQAogCQl1aW50IG5zZWdzLCBqOwogCQlobmRkbWFfc2VnX21hcF90ICptYXA7CiAKLQkJZGF0YSA9IFBLVERBVEEocCk7Ci0JCWxlbiA9IFBLVExFTihwKTsKKwkJZGF0YSA9IHAtPmRhdGE7CisJCWxlbiA9IHAtPmxlbjsKICNpZmRlZiBCQ01fRE1BUEFECiAJCWxlbiArPSBQS1RETUFQQUQoZGktPm9zaCwgcCk7CiAjZW5kaWYJCQkJLyogQkNNX0RNQVBBRCAqLwotCQluZXh0ID0gUEtUTkVYVChwKTsKKwkJbmV4dCA9IHAtPm5leHQ7CiAKIAkJLyogcmV0dXJuIG5vbnplcm8gaWYgb3V0IG9mIHR4IGRlc2NyaXB0b3JzICovCiAJCWlmIChORVhUVFhEKHR4b3V0KSA9PSBkaS0+dHhpbikKQEAgLTIzMzcsNyArMjM0Miw4IEBACiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIGRhdGEsIGxlbiwgRE1BX1RYLCBwLAogCQkJICAgICAmZGktPnR4cF9kbWFoW3R4b3V0XSk7CkBAIC0yNDA5LDcgKzI0MTUsNyBAQAogCiAgb3V0b2Z0eGQ6CiAJRE1BX0VSUk9SKCgiJXM6IGRtYV90eGZhc3Q6IG91dCBvZiB0eGRzICEhIVxuIiwgZGktPm5hbWUpKTsKLQlQS1RGUkVFKGRpLT5vc2gsIHAwLCB0cnVlKTsKKwlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIHAwLCB0cnVlKTsKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSAwOwogCWRpLT5obmRkbWEudHhub2J1ZisrOwogCXJldHVybiAtMTsKQEAgLTI1NjMsNyArMjU2OSw3IEBACiAJcmV0dXJuIHJ4cDsKIH0KIAotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCiB7CiAJdTMyIHc7CiAJT1JfUkVHKG9zaCwgJmRtYTY0cmVncy0+Y29udHJvbCwgRDY0X1hDX0FFKTsKQEAgLTI2MzUsNyArMjY0MSw3IEBACiAJCWlmIChETUFTR0xJU1RfRU5BQikgewogCQkJYmNvcHkoJmRpLT50eHBfZG1haFtvbGRdLCAmZGktPnR4cF9kbWFoW25ld10sCiAJCQkgICAgICBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOwotCQkJYnplcm8oJmRpLT50eHBfZG1haFtvbGRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbb2xkXSwgMCwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAkJfQogCiAJCWRpLT50eHBbb2xkXSA9IE5VTEw7CkBAIC0yNjU0LDcgKzI2NjAsNyBAQAogdWludCBkbWFfYWRkcndpZHRoKHNpX3QgKnNpaCwgdm9pZCAqZG1hcmVncykKIHsKIAlkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2goc2loKTsKIApAQCAtMjY2NCw4ICsyNjcwLDggQEAKIAkJLyogYmFja3BsYW5lIGFyZSA2NC1iaXQgY2FwYWJsZSAqLwogCQlpZiAoc2lfYmFja3BsYW5lNjQoc2loKSkKIAkJCS8qIElmIGJ1cyBpcyBTeXN0ZW0gQmFja3BsYW5lIG9yIFBDSUUgdGhlbiB3ZSBjYW4gYWNjZXNzIDY0LWJpdHMgKi8KLQkJCWlmICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFNJX0JVUykgfHwKLQkJCSAgICAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJgorCQkJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCQkJICAgICgoc2loLT5idXN0eXBlID09IFBDSV9CVVMpICYmCiAJCQkgICAgIChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpKQogCQkJCXJldHVybiBETUFERFJXSURUSF82NDsKIApAQCAtMjY3OSw4ICsyNjg1LDggQEAKIAlkbWEzMnJlZ3MgPSAoZG1hMzJyZWdzX3QgKikgZG1hcmVnczsKIAogCS8qIEZvciBTeXN0ZW0gQmFja3BsYW5lLCBQQ0lFIGJ1cyBvciBhZGRyZXh0IGZlYXR1cmUsIDMyLWJpdHMgb2sgKi8KLQlpZiAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHx8Ci0JICAgICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCSAgICAoKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCSAgICAgJiYgc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCiAJICAgIHx8IChfZG1hMzJfYWRkcmV4dChvc2gsIGRtYTMycmVncykpKQogCQlyZXR1cm4gRE1BRERSV0lEVEhfMzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMKaW5kZXggYThmMzMwNi4uNmNjNTlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZHBtdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRwbXUuYwpAQCAtMTMsOSArMTMsMTQgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KQEAgLTQwLDIzICs0NSwyMyBAQAogI2RlZmluZQlQTVVfTk9ORShhcmdzKQogCiAvKiBQTEwgY29udHJvbHMvY2xvY2tzICovCi1zdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgIHUzMiB4dGFsKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9hbHBjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKK3N0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYyk7CitzdGF0aWMgdTMyIHNpX3BtdTFfYWxwY2xrMChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpOwogCiAvKiBQTVUgcmVzb3VyY2VzICovCiBzdGF0aWMgYm9vbCBzaV9wbXVfcmVzX2RlcGZsdHJfYmIoc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9uY2Ioc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9wYWxkbyhzaV90ICpzaWgpOwogc3RhdGljIGJvb2wgc2lfcG11X3Jlc19kZXBmbHRyX25wYWxkbyhzaV90ICpzaWgpOwotc3RhdGljIHUzMiBzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCitzdGF0aWMgdTMyIHNpX3BtdV9yZXNfZGVwcyhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgICB1MzIgcnNyY3MsIGJvb2wgYWxsKTsKLXN0YXRpYyB1aW50IHNpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHVpbnQgc2lfcG11X3Jlc191cHRpbWUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAogCQkJICAgICAgdTggcnNyYyk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfcmVzX21hc2tzKHNpX3QgKnNpaCwgdTMyICogcG1pbiwgdTMyICogcG1heCk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaV90ICpzaWgsIGNoaXBjcmVnc190ICpjYywKLQkJCQkgICAgICAgb3NsX3QgKm9zaCwgdTggc3B1cmF2b2lkKTsKKwkJCQkgICAgICAgc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IHNwdXJhdm9pZCk7CiAKIHN0YXRpYyB2b2lkIHNpX3BtdV9zZXRfNDMzMF9wbGxkaXZzKHNpX3QgKnNpaCk7CiAKQEAgLTEwMSw3ICsxMDYsNyBAQAogfQogCiAvKiBTZXR1cCBzd2l0Y2hlciB2b2x0YWdlICovCi12b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHU4IGJiX3ZvbHRhZ2UsCit2b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBiYl92b2x0YWdlLAogCQkJCSB1OCByZl92b2x0YWdlKQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTEyNCwxNCArMTI5LDE0IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBsZG8sIHU4IHZvbHRhZ2UpCit2b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggbGRvLCB1OCB2b2x0YWdlKQogewogCXU4IHNyX2NudGxfc2hpZnQgPSAwLCByY19zaGlmdCA9IDAsIHNoaWZ0ID0gMCwgbWFzayA9IDA7CiAJdTggYWRkciA9IDA7CiAKIAlBU1NFUlQoc2loLT5jY2NhcHMgJiBDQ19DQVBfUE1VKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMzNl9DSElQX0lEOgogCQlzd2l0Y2ggKGxkbykgewogCQljYXNlIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTToKQEAgLTE4Miw3ICsxODcsNyBAQAogLyogZDExIHNsb3cgdG8gZmFzdCBjbG9jayB0cmFuc2l0aW9uIHRpbWUgaW4gc2xvdyBjbG9jayBjeWNsZXMgKi8KICNkZWZpbmUgRDExU0NDX1NMT1cyRkFTVF9UUkFOU0lUSU9OCTIKIAotdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCXVpbnQgZGVsYXkgPSBQTVVfTUFYX1RSQU5TSVRJT05fRExZOwogCWNoaXBjcmVnc190ICpjYzsKQEAgLTE5OSw3ICsyMDQsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0yNTksNyArMjY0LDcgQEAKIAlyZXR1cm4gKHUxNikgZGVsYXk7CiB9CiAKLXUzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBmb3JjZSkKK3UzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgZm9yY2UpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTU5OSw3ICs2MDQsNyBAQAogCXJzcmNzID0gKHNpaC0+cG11Y2FwcyAmIFBDQVBfUkNfTUFTSykgPj4gUENBUF9SQ19TSElGVDsKIAogCS8qIGRldGVybWluZSBtaW4vbWF4IHJzcmMgbWFza3MgKi8KLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCWNhc2UgQkNNNDM0MjFfQ0hJUF9JRDoKQEAgLTY3Nyw3ICs2ODIsNyBAQAogfQogCiAvKiBpbml0aWFsaXplIFBNVSByZXNvdXJjZXMgKi8KLXZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3ZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTY5Niw3ICs3MDEsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIE9wdGltaXplIHJlc291cmNlcyB1cC9kb3duIHRpbWVycyAqLwogCQlpZiAoSVNTSU1fRU5BQihzaWgpKSB7CkBAIC0xMDk1LDcgKzExMDAsNyBAQAogI2lmZGVmIEJDTURCRwogCWNoYXIgY2huWzhdOwogI2VuZGlmCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJldHVybiBwbXUxX3h0YWx0YWIwXzg4MF80MzI5OwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTEyMyw3ICsxMTI4LDcgQEAKIAljaGFyIGNobls4XTsKICNlbmRpZgogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIERlZmF1bHQgdG8gMzg0MDBLaHogKi8KIAkJcmV0dXJuICZwbXUxX3h0YWx0YWIwXzg4MF80MzI5W1BNVTFfWFRBTFRBQjBfODgwXzM4NDAwS107CkBAIC0xMTU1LDcgKzExNjAsNyBAQAogCWNoYXIgY2huWzhdOwogI2VuZGlmCiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIEZWQ09fODgwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTE3OCw3ICsxMTgzLDcgQEAKIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCWNvbnN0IHBtdTFfeHRhbHRhYjBfdCAqeHQ7CiAJdTMyIHhmOwpAQCAtMTIwMyw3ICsxMjA4LDggQEAKICAqIGNhc2UgdGhlIHh0YWwgZnJlcXVlbmN5IGlzIHVua25vd24gdG8gdGhlIHMvdyBzbyB3ZSBuZWVkIHRvIGNhbGwKICAqIHNpX3BtdTFfeHRhbGRlZjAoKSB3aGVyZXZlciBpdCBpcyBuZWVkZWQgdG8gcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZS4KICAqLwotc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdTMyIHh0YWwpCitzdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKKwkJCSAgICAgdTMyIHh0YWwpCiB7CiAJY29uc3QgcG11MV94dGFsdGFiMF90ICp4dDsKIAl1MzIgdG1wOwpAQCAtMTIzMyw4ICsxMjM5LDggQEAKIAkgKi8KIAlpZiAoKCgoUl9SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wpICYgUENUTF9YVEFMRlJFUV9NQVNLKSA+PgogCSAgICAgIFBDVExfWFRBTEZSRVFfU0hJRlQpID09IHh0LT54ZikgJiYKLQkgICAgISgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQotCSAgICAgIHx8IChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKQorCSAgICAgIHx8IChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkpIHsKIAkJUE1VX01TRygoIlBMTCBhbHJlYWR5IHByb2dyYW1tZWQgZm9yICVkLiVkIE1IelxuIiwKIAkJCSB4dC0+ZnJlZiAvIDEwMDAsIHh0LT5mcmVmICUgMTAwMCkpOwogCQlyZXR1cm47CkBAIC0xMjQ0LDcgKzEyNTAsNyBAQAogCVBNVV9NU0coKCJQcm9ncmFtbWluZyBQTEwgZm9yICVkLiVkIE1IelxuIiwgeHQtPmZyZWYgLyAxMDAwLAogCQkgeHQtPmZyZWYgJSAxMDAwKSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJLyogQ2hhbmdlIHRoZSBCQlBMTCBkcml2ZSBzdHJlbmd0aCB0byA4IGZvciBhbGwgY2hhbm5lbHMgKi8KIAkJYnVmX3N0cmVuZ3RoID0gMHg4ODg4ODg7CkBAIC0xMzUxLDExICsxMzU3LDExIEBACiAJICAgICAgcDJkaXYgPDwgUE1VMV9QTEwwX1BDMF9QMkRJVl9TSElGVCkgJiBQTVUxX1BMTDBfUEMwX1AyRElWX01BU0spOwogCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMzBfQ0hJUF9JRCkpCisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkKIAkJc2lfcG11X3NldF80MzMwX3BsbGRpdnMoc2loKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKQotCSAgICAmJiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKQorCSAgICAmJiAoc2loLT5jaGlwcmV2ID09IDApKSB7CiAKIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+cGxsY29udHJvbF9kYXRhKTsKQEAgLTEzNjMsOSArMTM2OSw5IEBACiAJCXRtcCA9IHRtcCB8IERPVDExTUFDXzg4ME1IWl9DTEtfRElWSVNPUl9WQUw7CiAJCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAJfQotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSkKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpIHx8CisJICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01GQjsKIAllbHNlCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01BU0g7CkBAIC0xNDA3LDcgKzE0MTMsNyBAQAogCS8qIHRvIG9wZXJhdGUgdGhlIDQzMTkgdXNiIGluIDI0TUh6LzQ4TUh6OyBjaGlwY29udHJvbFsyXVs4NDo4M10gbmVlZHMKIAkgKiB0byBiZSB1cGRhdGVkLgogCSAqLwotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQorCWlmICgoc2loLT5jaGlwID09IEJDTTQzMTlfQ0hJUF9JRCkKIAkgICAgJiYgKHh0LT5mcmVmICE9IFhUQUxfRlJFUV8zMDAwME1IWikpIHsKIAkJV19SRUcob3NoLCAmY2MtPmNoaXBjb250cm9sX2FkZHIsIFBNVTFfUExMMF9DSElQQ1RMMik7CiAJCXRtcCA9CkBAIC0xNDM2LDggKzE0NDIsOCBAQAogCQlQQ1RMX0lMUF9ESVZfTUFTSykgfAogCSAgICAoKHh0LT54ZiA8PCBQQ1RMX1hUQUxGUkVRX1NISUZUKSAmIFBDVExfWFRBTEZSRVFfTUFTSyk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkKLQkgICAgJiYgQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApIHsKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpCisJICAgICYmIHNpaC0+Y2hpcHJldiA9PSAwKSB7CiAJCS8qIGNsZWFyIHRoZSBodHN0cmV0Y2ggYmVmb3JlIGNsZWFyaW5nIEhUUmVxRW4gKi8KIAkJQU5EX1JFRyhvc2gsICZjYy0+Y2xrc3RyZXRjaCwgfkNTVFJFVENIX0hUKTsKIAkJdG1wICY9IH5QQ1RMX0hUX1JFUV9FTjsKQEAgLTE0NDgsNyArMTQ1NCw3IEBACiAKIC8qIHF1ZXJ5IHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCXUzMiB0bXAsIG0xZGl2OwogI2lmZGVmIEJDTURCRwpAQCAtMTUwMiw3ICsxNTA4LDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTEwgKi8KLXZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdWludCB4dGFsZnJlcSkKK3ZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgeHRhbGZyZXEpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTE1MTcsNyArMTUyMyw3IEBACiAJY2MgPSBzaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJaWYgKHh0YWxmcmVxID09IDApCiAJCQl4dGFsZnJlcSA9IDM4NDAwOwpAQCAtMTU1NSw3ICsxNTYxLDcgQEAKIH0KIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCi11MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpCit1MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xNTcxLDcgKzE1NzcsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0xNjE2LDcgKzE2MjIsNyBAQAogICogcGxscmVnICJwbGwwIiBpLmUuIDEyIGZvciBtYWluIDYgZm9yIHBoeSwgMCBmb3IgbWlzYy4KICAqLwogc3RhdGljIHUzMgotc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdWludCBwbGwwLAorc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgcGxsMCwKIAkJCSAgdWludCBtKSB7CiAJdTMyIHRtcCwgZGl2LCBuZGl2LCBwMSwgcDIsIGZjOwogCkBAIC0xNjMxLDcgKzE2MzcsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpIHsKIAkJLyogRGV0ZWN0IGZhaWx1cmUgaW4gY2xvY2sgc2V0dGluZyAqLwogCQlpZiAoKFJfUkVHKG9zaCwgJmNjLT5jaGlwc3RhdHVzKSAmIDB4NDAwMDApICE9IDApIHsKIAkJCXJldHVybiAxMzMgKiAxMDAwMDAwOwpAQCAtMTY2OSw3ICsxNjc1LDcgQEAKIC8qIEZvciBkZXNpZ25zIHRoYXQgZmVlZCB0aGUgc2FtZSBjbG9jayB0byBib3RoIGJhY2twbGFuZQogICogYW5kIENQVSBqdXN0IHJldHVybiB0aGUgQ1BVIGNsb2NrIHNwZWVkLgogICovCi11MzIgc2lfcG11X3NpX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfc2lfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTY4NSw3ICsxNjkxLDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzQyMV9DSElQX0lEOgpAQCAtMTcwMiw3ICsxNzA4LDcgQEAKIAkJCQkgIFBNVTVfTUFJTlBMTF9TSSk7CiAJCWJyZWFrOwogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCWNsb2NrID0gMzg0MDAgKiAxMDAwOwogCQllbHNlCiAJCQljbG9jayA9IHNpX3BtdTFfY3B1Y2xrMChzaWgsIG9zaCwgY2MpOwpAQCAtMTc0OCw3ICsxNzU0LDcgQEAKIH0KIAogLyogcXVlcnkgQ1BVIGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTc1NywxNCArMTc2MywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTc5Miw3ICsxNzk4LDcgQEAKIH0KIAogLyogcXVlcnkgbWVtb3J5IGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTgwMSwxNCArMTgwNywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM2X0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTg0MSw3ICsxODQ3LDcgQEAKIAogc3RhdGljIHUzMiBpbHBjeWNsZXNfcGVyX3NlYzsKIAotdTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlpZiAoSVNTSU1fRU5BQihzaWgpKQogCQlyZXR1cm4gSUxQX0NMT0NLOwpAQCAtMTkwNSw3ICsxOTExLDcgQEAKICNkZWZpbmUgU0RJT0RfRFJWU1RSX0tFWShjaGlwLCBwbXUpCSgoKGNoaXApIDw8IDE2KSB8IChwbXUpKQogCiB2b2lkCi1zaV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK3NpX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJIHUzMiBkcml2ZXN0cmVuZ3RoKSB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeCwgaW50cl92YWwgPSAwOwpAQCAtMTk3Niw3ICsxOTgyLDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgKi8KLXZvaWQgc2lfcG11X2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xOTkzLDcgKzE5OTksNyBAQAogCWVsc2UgaWYgKHNpaC0+cG11cmV2ID49IDIpCiAJCU9SX1JFRyhvc2gsICZjYy0+cG11Y29udHJvbCwgUENUTF9OT0lMUF9PTl9XQUlUKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CiAJCS8qIEZpeCBmb3IgNDMyOWIwIGJhZCBMUE9NIHN0YXRlLiAqLwogCQlXX1JFRyhvc2gsICZjYy0+cmVnY29udHJvbF9hZGRyLCAyKTsKIAkJT1JfUkVHKG9zaCwgJmNjLT5yZWdjb250cm9sX2RhdGEsIDB4MTAwKTsKQEAgLTIwMDgsNyArMjAxNCw3IEBACiAKIC8qIFJldHVybiB1cCB0aW1lIGluIElMUCBjeWNsZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4gKi8KIHN0YXRpYyB1aW50Ci1zaV9wbXVfcmVzX3VwdGltZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywKK3NpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKIAkJCSAgICAgIHU4IHJzcmMpIHsKIAl1MzIgZGVwczsKIAl1aW50IHVwLCBpLCBkdXAsIGRtYXg7CkBAIC0yMDQ1LDcgKzIwNTEsNyBAQAogCiAvKiBSZXR1cm4gZGVwZW5kYW5jaWVzIChkaXJlY3Qgb3IgYWxsL2luZGlyZWN0KSBmb3IgdGhlIGdpdmVuIHJlc291cmNlcyAqLwogc3RhdGljIHUzMgotc2lfcG11X3Jlc19kZXBzKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCitzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCiAJCWJvb2wgYWxsKQogewogCXUzMiBkZXBzID0gMDsKQEAgLTIwNjUsNyArMjA3MSw3IEBACiB9CiAKIC8qIHBvd2VyIHVwL2Rvd24gT1RQIHRocm91Z2ggUE1VIHJlc291cmNlcyAqLwotdm9pZCBzaV9wbXVfb3RwX3Bvd2VyKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBvbikKK3ZvaWQgc2lfcG11X290cF9wb3dlcihzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIG9uKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMDg0LDcgKzIwOTAsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJzcmNzID0gUE1VUkVTX0JJVChSRVM0MzI5X09UUF9QVSk7CiAJCWJyZWFrOwpAQCAtMjEzNSw3ICsyMTQxLDcgQEAKIAlzaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKLXZvaWQgc2lfcG11X3JjYWwoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfcmNhbChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMTQ3LDcgKzIxNTMsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6ewogCQkJdTggcmNhbF9jb2RlOwogCQkJdTMyIHZhbDsKQEAgLTIyMTgsNyArMjIyNCw3IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBzcHVyYXZvaWQpCit2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggc3B1cmF2b2lkKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHgsIGludHJfdmFsOwpAQCAtMjIzMCw3ICsyMjM2LDcgQEAKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKIAkvKiBmb3JjZSB0aGUgSFQgb2ZmICAqLwotCWlmIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHsKKwlpZiAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgewogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrKTsKIAkJdG1wICY9IH5SRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI0NCw3ICsyMjUwLDcgQEAKIAlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaWgsIGNjLCBvc2gsIHNwdXJhdm9pZCk7CiAKIAkvKiBlbmFibGUgSFQgYmFjayBvbiAgKi8KLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzM2X0NISVBfSUQpIHsKIAkJdG1wID0gUl9SRUcob3NoLCAmY2MtPm1heF9yZXNfbWFzayk7CiAJCXRtcCB8PSBSRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI1NSw3ICsyMjYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNpX3BtdV9zcHVyYXZvaWRfcGxsdXBkYXRlKHNpX3QgKnNpaCwgY2hpcGNyZWdzX3QgKmNjLCBvc2xfdCAqb3NoLAorc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc2lfdCAqc2loLCBjaGlwY3JlZ3NfdCAqY2MsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgdTggc3B1cmF2b2lkKQogewogCXUzMiB0bXAgPSAwOwpAQCAtMjI2MywxNCArMjI2OSwxNCBAQAogCXU4IGJjbTUzNTdfYmNtNDMyMzZfcDFkaXZbXSA9IHsgMHgxLCAweDUsIDB4NSB9OwogCXU4IGJjbTUzNTdfYmNtNDMyMzZfbmRpdltdID0geyAweDMwLCAweGY2LCAweGZjIH07CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTUzNTdfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjM1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIzNl9DSElQX0lEOgogCWNhc2UgQkNNNDMyMzhfQ0hJUF9JRDoKIAogCQkvKiBCQ001MzU3IG5lZWRzIHRvIHRvdWNoIFBMTDFfUExMQ1RMWzAyXSwgc28gb2Zmc2V0IFBMTDBfUExMQ1RMWzAyXSBieSA2ICovCi0JCXBoeXBsbF9vZmZzZXQgPSAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSA/IDYgOiAwOworCQlwaHlwbGxfb2Zmc2V0ID0gKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpID8gNiA6IDA7CiAKIAkJLyogUk1XIG9ubHkgdGhlIFAxIGRpdmlkZXIgKi8KIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwKQEAgLTI0NTEsNyArMjQ1Nyw3IEBACiAJV19SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wsIHRtcCk7CiB9CiAKLWJvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK2Jvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdWludCBpZHg7CiAJY2hpcGNyZWdzX3QgKmNjOwpAQCAtMjQ2Miw3ICsyNDY4LDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlzdCA9IChSX1JFRyhvc2gsICZjYy0+cmVzX3N0YXRlKSAmIFBNVVJFU19CSVQoUkVTNDMyOV9PVFBfUFUpKQogCQkgICAgIT0gMDsKQEAgLTI1MDMsOSArMjUwOSw5IEBACiAKIHZvaWQKICNpZiBkZWZpbmVkKEJDTURCRykKLXNpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIGVuYWJsZSkKK3NpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBlbmFibGUpCiAjZWxzZQotc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgZW5hYmxlKQorc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIGVuYWJsZSkKICNlbmRpZgogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI1MjEsNyArMjUyNyw3IEBACiB9CiAKIC8qIGluaXRpYWxpemUgUE1VIGNoaXAgY29udHJvbHMgYW5kIG90aGVyIGNoaXAgbGV2ZWwgc3R1ZmYgKi8KLXZvaWQgc2lfcG11X2NoaXBfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpCit2b2lkIHNpX3BtdV9jaGlwX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAl1aW50IG9yaWdpZHg7CiAKQEAgLTI1NDMsMTEgKzI1NDksMTEgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgc3dpdGNoL3JlZ3VsYXRvcnMgKi8KLXZvaWQgc2lfcG11X3N3cmVnX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzM2X0NISVBfSUQ6CiAJCS8qIFJlZHVjZSBDTERPIFBXTSBvdXRwdXQgdm9sdGFnZSB0byAxLjJWICovCiAJCXNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2loLCBvc2gsIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTSwgMHhlKTsKQEAgLTI1NTYsNyArMjU2Miw3IEBACiAJCQkJICAgICAgIDB4ZSk7CiAJCS8qIFJlZHVjZSBMTkxETzEgb3V0cHV0IHZvbHRhZ2UgdG8gMS4yViAqLwogCQlzaV9wbXVfc2V0X2xkb192b2x0YWdlKHNpaCwgb3NoLCBTRVRfTERPX1ZPTFRBR0VfTE5MRE8xLCAweGUpOwotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCXNpX3BtdV9yZWdjb250cm9sKHNpaCwgMiwgMHg0MDAwMDAsIDB4NDAwMDAwKTsKIAkJYnJlYWs7CiAKQEAgLTI1NzMsNyArMjU3OSw3IEBACiB7CiAJQVNTRVJUKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMTlfQ0hJUF9JRDoKIAkJaWYgKGVuYWJsZSkKIAkJCXNpX3dyaXRlX3dyYXBwZXJyZWcoc2loLCBBSV9PT0JTRUxPVVRCNzQsCkBAIC0yNTg3LDcgKzI1OTMsNyBAQAogCiAvKiBXYWl0IGZvciBhIHBhcnRpY3VsYXIgY2xvY2sgbGV2ZWwgdG8gYmUgb24gdGhlIGJhY2twbGFuZSAqLwogdTMyCi1zaV9wbXVfd2FpdGZvcmNsa19vbl9iYWNrcGxhbmUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1MzIgY2xrLAorc2lfcG11X3dhaXRmb3JjbGtfb25fYmFja3BsYW5lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBjbGssCiAJCQkgICAgICAgdTMyIGRlbGF5KQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI2MTYsNyArMjYyMiw3IEBACiAKICNkZWZpbmUgRVhUX0lMUF9IWiAzMjc2OAogCi11MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jCmluZGV4IDJiYjViODcuLmU2NzE2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9saW51eF9vc2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbGludXhfb3NsLmMKQEAgLTIwLDE0NSArMjAsNTcgQEAKICNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgogI2VuZGlmCQkJCS8qIG1pcHMgKi8KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAKIAotI2RlZmluZSBQQ0lfQ0ZHX1JFVFJZIAkJMTAKLQogI2RlZmluZSBPU19IQU5ETEVfTUFHSUMJCTB4MTIzNGFiY2QJLyogTWFnaWMgIyB0byByZWNvZ25pc2Ugb3NoICovCiAjZGVmaW5lIEJDTV9NRU1fRklMRU5BTUVfTEVOIAkyNAkvKiBNZW0uIGZpbGVuYW1lIGxlbmd0aCAqLwogCi1zdHJ1Y3Qgb3NsX2luZm8gewotCW9zbF9wdWJpbmZvX3QgcHViOwotCXVpbnQgbWFnaWM7Ci0Jdm9pZCAqcGRldjsKLQl1aW50IGZhaWxlZDsKLQl1aW50IGJ1c3R5cGU7Ci19OwotCiAvKiBHbG9iYWwgQVNTRVJUIHR5cGUgZmxhZyAqLwogdTMyIGdfYXNzZXJ0X3R5cGU7CiAKLSNpZmRlZiBCUkNNX0ZVTExNQUMKLXN0YXRpYyBzMTYgbGludXhiY21lcnJvcm1hcFtdID0geyAwLAkvKiAwICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfRVJST1IgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURBUkcgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURPUFRJT04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RVUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVERPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RBUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVFNUQSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREtFWUlEWCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX1JBRElPT0ZGICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQkFORExPQ0tFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PQ0xLICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfQkFEUkFURVNFVCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREJBTkQgKi8KLQktRTJCSUcsCQkJLyogQkNNRV9CVUZUT09TSE9SVCAqLwotCS1FMkJJRywJCQkvKiBCQ01FX0JVRlRPT0xPTkcgKi8KLQktRUJVU1ksCQkJLyogQkNNRV9CVVNZICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQVNTT0NJQVRFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRFNTSURMRU4gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9PVVRPRlJBTkdFQ0hBTiAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRENIQU4gKi8KLQktRUZBVUxULAkJLyogQkNNRV9CQURBRERSICovCi0JLUVOT01FTSwJCS8qIEJDTUVfTk9SRVNPVVJDRSAqLwotCS1FT1BOT1RTVVBQLAkJLyogQkNNRV9VTlNVUFBPUlRFRCAqLwotCS1FTVNHU0laRSwJCS8qIEJDTUVfQkFETEVOR1RIICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UUkVBRFkgKi8KLQktRVBFUk0sCQkJLyogQkNNRV9OT1RQRVJNSVRURUQgKi8KLQktRU5PTUVNLAkJLyogQkNNRV9OT01FTSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0FTU09DSUFURUQgKi8KLQktRVJBTkdFLAkJLyogQkNNRV9SQU5HRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVEZPVU5EICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfV01FX05PVF9FTkFCTEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfVFNQRUNfTk9URk9VTkQgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9BQ01fTk9UU1VQUE9SVEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UX1dNRV9BU1NPQ0lBVElPTiAqLwotCS1FSU8sCQkJLyogQkNNRV9TRElPX0VSUk9SICovCi0JLUVOT0RFViwJCS8qIEJDTUVfRE9OR0xFX0RPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9WRVJTSU9OICovCi0JLUVJTywJCQkvKiBCQ01FX1RYRkFJTCAqLwotCS1FSU8sCQkJLyogQkNNRV9SWEZBSUwgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT0RFVklDRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05NT0RFX0RJU0FCTEVEICovCi0JLUVOT0RBVEEsCQkvKiBCQ01FX05PTlJFU0lERU5UICovCi0KLS8qIFdoZW4gYW4gbmV3IGVycm9yIGNvZGUgaXMgYWRkZWQgdG8gYmNtdXRpbHMuaCwgYWRkIG9zCi0gKiBzcGNlY2lmaWMgZXJyb3IgdHJhbnNsYXRpb24gaGVyZSBhcyB3ZWxsCi0gKi8KLS8qIGNoZWNrIGlmIEJDTUVfTEFTVCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgdXBkYXRlZCAqLwotI2lmIEJDTUVfTEFTVCAhPSAtNDIKLSNlcnJvciAiWW91IG5lZWQgdG8gYWRkIGEgT1MgZXJyb3IgdHJhbnNsYXRpb24gaW4gdGhlIGxpbnV4YmNtZXJyb3JtYXAgXAotCWZvciBuZXcgZXJyb3IgY29kZSBkZWZpbmVkIGluIGJjbXV0aWxzLmgiCi0jZW5kaWYKLX07Ci0KLS8qIHRyYW5zbGF0ZSBiY21lcnJvcnMgaW50byBsaW51eCBlcnJvcnMgKi8KLWludCBvc2xfZXJyb3IoaW50IGJjbWVycm9yKQorc3RydWN0IG9zbF9pbmZvICpvc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSkKIHsKLQlpZiAoYmNtZXJyb3IgPiAwKQotCQliY21lcnJvciA9IDA7Ci0JZWxzZSBpZiAoYmNtZXJyb3IgPCBCQ01FX0xBU1QpCi0JCWJjbWVycm9yID0gQkNNRV9FUlJPUjsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCS8qIEFycmF5IGJvdW5kcyBjb3ZlcmVkIGJ5IEFTU0VSVCBpbiBvc2xfYXR0YWNoICovCi0JcmV0dXJuIGxpbnV4YmNtZXJyb3JtYXBbLWJjbWVycm9yXTsKLX0KLSNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KLQotb3NsX3QgKm9zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlLCBib29sIHBrdHRhZykKLXsKLQlvc2xfdCAqb3NoOwotCi0Jb3NoID0ga21hbGxvYyhzaXplb2Yob3NsX3QpLCBHRlBfQVRPTUlDKTsKKwlvc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlBU1NFUlQob3NoKTsKIAotCWJ6ZXJvKG9zaCwgc2l6ZW9mKG9zbF90KSk7Ci0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLQkvKiBDaGVjayB0aGF0IGVycm9yIG1hcCBoYXMgdGhlIHJpZ2h0IG51bWJlciBvZiBlbnRyaWVzIGluIGl0ICovCi0JQVNTRVJUKEFCUyhCQ01FX0xBU1QpID09IChBUlJBWV9TSVpFKGxpbnV4YmNtZXJyb3JtYXApIC0gMSkpOwotI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCW1lbXNldChvc2gsIDAsIHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pKTsKIAogCW9zaC0+bWFnaWMgPSBPU19IQU5ETEVfTUFHSUM7Ci0Jb3NoLT5mYWlsZWQgPSAwOwogCW9zaC0+cGRldiA9IHBkZXY7Ci0Jb3NoLT5wdWIucGt0dGFnID0gcGt0dGFnOwogCW9zaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKIAlzd2l0Y2ggKGJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBQQ01DSUFfQlVTOgotCQlvc2gtPnB1Yi5tbWJ1cyA9IHRydWU7CisJCW9zaC0+bW1idXMgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIEpUQUdfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJY2FzZSBVU0JfQlVTOgogCWNhc2UgU1BJX0JVUzoKIAljYXNlIFJQQ19CVVM6Ci0JCW9zaC0+cHViLm1tYnVzID0gZmFsc2U7CisJCW9zaC0+bW1idXMgPSBmYWxzZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNTRVJUKGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCi0jaWYgZGVmaW5lZChCQ01EQkcpICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLQlpZiAocGt0dGFnKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCUFTU0VSVChPU0xfUEtUVEFHX1NaIDw9IHNpemVvZihza2ItPmNiKSk7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIG9zaDsKIH0KIAotdm9pZCBvc2xfZGV0YWNoKG9zbF90ICpvc2gpCit2b2lkIG9zbF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJaWYgKG9zaCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNjcsOCArNzksNyBAQAogCWtmcmVlKG9zaCk7CiB9CiAKLS8qIFJldHVybiBhIG5ldyBwYWNrZXQuIHplcm8gb3V0IHBrdHRhZyAqLwotdm9pZCAqQkNNRkFTVFBBVEggb3NsX3BrdGdldChvc2xfdCAqb3NoLCB1aW50IGxlbikKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RfYnVmX2dldF9za2Ioc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE3NywyNCArODgsMjAgQEAKIAkJc2tiX3B1dChza2IsIGxlbik7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCi0JCW9zaC0+cHViLnBrdGFsbG9jZWQrKzsKKwkJb3NoLT5wa3RhbGxvY2VkKys7CiAJfQogCi0JcmV0dXJuICh2b2lkICopc2tiOworCXJldHVybiBza2I7CiB9CiAKIC8qIEZyZWUgdGhlIGRyaXZlciBwYWNrZXQuIEZyZWUgdGhlIHRhZyBpZiBwcmVzZW50ICovCi12b2lkIEJDTUZBU1RQQVRIIG9zbF9wa3RmcmVlKG9zbF90ICpvc2gsIHZvaWQgKnAsIGJvb2wgc2VuZCkKK3ZvaWQgQkNNRkFTVFBBVEggcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kKQogewotCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXN0cnVjdCBza19idWZmICpuc2tiOwogCWludCBuZXN0ID0gMDsKIAotCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXA7CiAJQVNTRVJUKHNrYik7CiAKLQlpZiAoc2VuZCAmJiBvc2gtPnB1Yi50eF9mbikKLQkJb3NoLT5wdWIudHhfZm4ob3NoLT5wdWIudHhfY3R4LCBwLCAwKTsKLQogCS8qIHBlcnZlcnNpb246IHdlIHVzZSBza2ItPm5leHQgdG8gY2hhaW4gbXVsdGktc2tiIHBhY2tldHMgKi8KIAl3aGlsZSAoc2tiKSB7CiAJCW5za2IgPSBza2ItPm5leHQ7CkBAIC0yMTEsNjMgKzExOCwxNCBAQAogCQkJICovCiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQkJb3NoLT5wdWIucGt0YWxsb2NlZC0tOworCQlvc2gtPnBrdGFsbG9jZWQtLTsKIAkJbmVzdCsrOwogCQlza2IgPSBuc2tiOwogCX0KIH0KIAotdTMyIG9zbF9wY2lfcmVhZF9jb25maWcob3NsX3QgKm9zaCwgdWludCBvZmZzZXQsIHVpbnQgc2l6ZSkKLXsKLQl1aW50IHZhbCA9IDA7Ci0JdWludCByZXRyeSA9IFBDSV9DRkdfUkVUUlk7Ci0KLQlBU1NFUlQoKG9zaCAmJiAob3NoLT5tYWdpYyA9PSBPU19IQU5ETEVfTUFHSUMpKSk7Ci0KLQkvKiBvbmx5IDRieXRlIGFjY2VzcyBzdXBwb3J0ZWQgKi8KLQlBU1NFUlQoc2l6ZSA9PSA0KTsKLQotCWRvIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCAmdmFsKTsKLQkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZmRlZiBCQ01EQkcKLQlpZiAocmV0cnkgPCBQQ0lfQ0ZHX1JFVFJZKQotCQlwcmludGsoIlBDSSBDT05GSUcgUkVBRCBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBvc2xfcGNpX3dyaXRlX2NvbmZpZyhvc2xfdCAqb3NoLCB1aW50IG9mZnNldCwgdWludCBzaXplLCB1aW50IHZhbCkKLXsKLQl1aW50IHJldHJ5ID0gUENJX0NGR19SRVRSWTsKLQotCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKLQotCS8qIG9ubHkgNGJ5dGUgYWNjZXNzIHN1cHBvcnRlZCAqLwotCUFTU0VSVChzaXplID09IDQpOwotCi0JZG8gewotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCB2YWwpOwotCQlpZiAob2Zmc2V0ICE9IFBDSV9CQVIwX1dJTikKLQkJCWJyZWFrOwotCQlpZiAob3NsX3BjaV9yZWFkX2NvbmZpZyhvc2gsIG9mZnNldCwgc2l6ZSkgPT0gdmFsKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZiBkZWZpbmVkKEJDTURCRykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotCWlmIChyZXRyeSA8IFBDSV9DRkdfUkVUUlkpCi0JCXByaW50aygiUENJIENPTkZJRyBXUklURSBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotfQotCiAvKiByZXR1cm4gYnVzICMgZm9yIHRoZSBwY2kgZGV2aWNlIHBvaW50ZWQgYnkgb3NoLT5wZGV2ICovCi11aW50IG9zbF9wY2lfYnVzKG9zbF90ICpvc2gpCit1aW50IG9zbF9wY2lfYnVzKHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCkBAIC0yNzUsNDAgKzEzMywzNyBAQAogfQogCiAvKiByZXR1cm4gc2xvdCAjIGZvciB0aGUgcGNpIGRldmljZSBwb2ludGVkIGJ5IG9zaC0+cGRldiAqLwotdWludCBvc2xfcGNpX3Nsb3Qob3NsX3QgKm9zaCkKK3VpbnQgb3NsX3BjaV9zbG90KHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCiAJcmV0dXJuIFBDSV9TTE9UKCgoc3RydWN0IHBjaV9kZXYgKilvc2gtPnBkZXYpLT5kZXZmbik7CiB9CiAKLXVpbnQgb3NsX2RtYV9jb25zaXN0ZW50X2FsaWduKHZvaWQpCi17Ci0JcmV0dXJuIFBBR0VfU0laRTsKLX0KLQotdm9pZCAqb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KG9zbF90ICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCit2b2lkICpvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCiAJCQkgICAgICAgdWludCAqYWxsb2NlZCwgdW5zaWduZWQgbG9uZyAqcGFwKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCWlmIChhbGlnbl9iaXRzKSB7CiAJCXUxNiBhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwotCQlpZiAoIUlTX0FMSUdORUQoRE1BX0NPTlNJU1RFTlRfQUxJR04sIGFsaWduKSkKKwkJaWYgKCFJU19BTElHTkVEKFBBR0VfU0laRSwgYWxpZ24pKQogCQkJc2l6ZSArPSBhbGlnbjsKIAkJKmFsbG9jZWQgPSBzaXplOwogCX0KIAlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCAoZG1hX2FkZHJfdCAqKSBwYXApOwogfQogCi12b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KG9zbF90ICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsIHVuc2lnbmVkIGxvbmcgcGEpCit2b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHBhKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCB2YSwgKGRtYV9hZGRyX3QpIHBhKTsKIH0KIAotdWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChvc2xfdCAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLCBpbnQgZGlyZWN0aW9uKQordWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwKKwkJCSAgICAgaW50IGRpcmVjdGlvbikKIHsKIAlpbnQgZGlyOwogCkBAIC0zMTcsNyArMTcyLDggQEAKIAlyZXR1cm4gcGNpX21hcF9zaW5nbGUob3NoLT5wZGV2LCB2YSwgc2l6ZSwgZGlyKTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCBvc2xfZG1hX3VubWFwKG9zbF90ICpvc2gsIHVpbnQgcGEsIHVpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3ZvaWQgQkNNRkFTVFBBVEggb3NsX2RtYV91bm1hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBwYSwgdWludCBzaXplLAorCQkJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAJaW50IGRpcjsKIApAQCAtMzczLDUyICsyMjksMyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHX0FTU0VSVCkgKi8KIAotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotdTggb3NsX3JlYWRiKG9zbF90ICpvc2gsIHZvbGF0aWxlIHU4ICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1OCkgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1OCkpKTsKLX0KLQotdTE2IG9zbF9yZWFkdyhvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MTYgKnIpCi17Ci0Jb3NsX3JyZWdfZm5fdCBycmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQlyZXR1cm4gKHUxNikgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1MTYpKSk7Ci19Ci0KLXUzMiBvc2xfcmVhZGwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1MzIpICgocnJlZykgKGN0eCwgKHZvaWQgKilyLCBzaXplb2YodTMyKSkpOwotfQotCi12b2lkIG9zbF93cml0ZWIob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTggKnIsIHU4IHYpCi17Ci0Jb3NsX3dyZWdfZm5fdCB3cmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPndyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQkoKHdyZWcpIChjdHgsICh2b2lkICopciwgdiwgc2l6ZW9mKHU4KSkpOwotfQotCi12b2lkIG9zbF93cml0ZXcob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTE2ICpyLCB1MTYgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTE2KSkpOwotfQotCi12b2lkIG9zbF93cml0ZWwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyLCB1MzIgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTMyKSkpOwotfQotI2VuZGlmCS8qIEJDTVNESU8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYwppbmRleCAyM2Y4NmRkLi41NmU2NThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbmljcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL25pY3BjaS5jCkBAIC0xNCw4ICsxNCw5IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CkBAIC0zNSw3ICszNiw3IEBACiAJfSByZWdzOwkJCS8qIE1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgdG8gdGhlIGNvcmUgKi8KIAogCXNpX3QgKnNpaDsJCS8qIFN5c3RlbSBpbnRlcmNvbm5lY3QgaGFuZGxlICovCi0Jb3NsX3QgKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KIAl1OCBwY2llY2FwX2xjcmVnX29mZnNldDsJLyogUENJRSBjYXBhYmlsaXR5IExDcmVnIG9mZnNldCBpbiB0aGUgY29uZmlnIHNwYWNlICovCiAJYm9vbCBwY2llX3ByNDI3Njc7CiAJdTggcGNpZV9wb2xhcml0eTsKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLyogZGVidWcvdHJhY2UgKi8KICNkZWZpbmUJUENJX0VSUk9SKGFyZ3MpCi0jZGVmaW5lIFBDSUVfUFVCKHNpaCkgKChCVVNUWVBFKChzaWgpLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJiAoKHNpaCktPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpCisjZGVmaW5lIFBDSUVfUFVCKHNpaCkgXAorCSgoKHNpaCktPmJ1c3R5cGUgPT0gUENJX0JVUykgJiYgKChzaWgpLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpKQogCiAvKiByb3V0aW5lcyB0byBhY2Nlc3MgbWRpbyBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzICovCiBzdGF0aWMgYm9vbCBwY2llX21kaW9zZXRibG9jayhwY2ljb3JlX2luZm9fdCAqcGksIHVpbnQgYmxrKTsKQEAgLTcxLDM1ICs3Myw2IEBACiAKICNkZWZpbmUgUENJRV9BU1BNKHNpaCkJKChQQ0lFX1BVQihzaWgpKSAmJiAoKChzaWgpLT5idXNjb3JlcmV2ID49IDMpICYmICgoc2loKS0+YnVzY29yZXJldiA8PSA1KSkpCiAKLSNkZWZpbmUgRFdPUkRfQUxJR04oeCkgICh4ICYgfigweDAzKSkKLSNkZWZpbmUgQllURV9QT1MoeCkgKHggJiAweDMpCi0jZGVmaW5lIFdPUkRfUE9TKHgpICh4ICYgMHgxKQotCi0jZGVmaW5lIEJZVEVfU0hJRlQoeCkgICg4ICogQllURV9QT1MoeCkpCi0jZGVmaW5lIFdPUkRfU0hJRlQoeCkgICgxNiAqIFdPUkRfUE9TKHgpKQotCi0jZGVmaW5lIEJZVEVfVkFMKGEsIHgpICgoYSA+PiBCWVRFX1NISUZUKHgpKSAmIDB4RkYpCi0jZGVmaW5lIFdPUkRfVkFMKGEsIHgpICgoYSA+PiBXT1JEX1NISUZUKHgpKSAmIDB4RkZGRikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfYnl0ZShhKSBcCi0JKEJZVEVfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfd29yZChhKSBcCi0JKFdPUkRfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZmZmKQotCi0jZGVmaW5lIHdyaXRlX3BjaV9jZmdfYnl0ZShhLCB2YWwpIGRvIHsgXAotCXUzMiB0bXB2YWw7IFwKLQl0bXB2YWwgPSAoT1NMX1BDSV9SRUFEX0NPTkZJRyhvc2gsIERXT1JEX0FMSUdOKGEpLCA0KSAmIH4weEZGIDw8IEJZVEVfUE9TKGEpKSB8IFwKLQkJdmFsIDw8IEJZVEVfUE9TKGEpOyBcCi0JT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCwgdG1wdmFsKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgd3JpdGVfcGNpX2NmZ193b3JkKGEsIHZhbCkgZG8geyBcCi0JdTMyIHRtcHZhbDsgXAotCXRtcHZhbCA9IChPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQpICYgfjB4RkZGRiA8PCBXT1JEX1BPUyhhKSkgfCBcCi0JCXZhbCA8PCBXT1JEX1BPUyhhKTsgXAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQsIHRtcHZhbCk7IFwKLQl9IHdoaWxlICgwKQogCiAvKiBkZWxheSBuZWVkZWQgYmV0d2VlbiB0aGUgbWRpbyBjb250cm9sLyBtZGlvZGF0YSByZWdpc3RlciBkYXRhIGFjY2VzcyAqLwogI2RlZmluZSBQUjI4ODI5X0RFTEFZKCkgdWRlbGF5KDEwKQpAQCAtMTA3LDcgKzgwLDcgQEAKIC8qIEluaXRpYWxpemUgdGhlIFBDSSBjb3JlLiBJdCdzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgZG9uZQogICogb25seSBvbmNlCiAgKi8KLXZvaWQgKnBjaWNvcmVfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MpCit2b2lkICpwY2ljb3JlX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncykKIHsKIAlwY2ljb3JlX2luZm9fdCAqcGk7CiAKQEAgLTE0OSw4ICsxMjIsOCBAQAogLyogcmV0dXJuIGNhcF9vZmZzZXQgaWYgcmVxdWVzdGVkIGNhcGFiaWxpdHkgZXhpc3RzIGluIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAvKiBOb3RlIHRoYXQgaXQncyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXQncyBhIHBjaSBidXMgKi8KIHU4Ci1wY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkob3NsX3QgKm9zaCwgdTggcmVxX2NhcF9pZCwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJICAgIHUzMiAqYnVmbGVuKQorcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCByZXFfY2FwX2lkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdTMyICpidWZsZW4pCiB7CiAJdTggY2FwX2lkOwogCXU4IGNhcF9wdHIgPSAwOwpAQCAtMTU4LDI5ICsxMzEsMjkgQEAKIAl1OCBieXRlX3ZhbDsKIAogCS8qIGNoZWNrIGZvciBIZWFkZXIgdHlwZSAwICovCi0JYnl0ZV92YWwgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0hEUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0hEUiwgJmJ5dGVfdmFsKTsKIAlpZiAoKGJ5dGVfdmFsICYgMHg3ZikgIT0gUENJX0hFQURFUl9OT1JNQUwpCiAJCWdvdG8gZW5kOwogCiAJLyogY2hlY2sgaWYgdGhlIGNhcGFiaWxpdHkgcG9pbnRlciBmaWVsZCBleGlzdHMgKi8KLQlieXRlX3ZhbCA9IHJlYWRfcGNpX2NmZ19ieXRlKFBDSV9DRkdfU1RBVCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX1NUQVQsICZieXRlX3ZhbCk7CiAJaWYgKCEoYnl0ZV92YWwgJiBQQ0lfQ0FQUFRSX1BSRVNFTlQpKQogCQlnb3RvIGVuZDsKIAotCWNhcF9wdHIgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0NBUFBUUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0NBUFBUUiwgJmNhcF9wdHIpOwogCS8qIGNoZWNrIGlmIHRoZSBjYXBhYmlsaXR5IHBvaW50ZXIgaXMgMHgwMCAqLwogCWlmIChjYXBfcHRyID09IDB4MDApCiAJCWdvdG8gZW5kOwogCiAJLyogbG9vcCB0aHIndSB0aGUgY2FwYWJpbGl0eSBsaXN0IGFuZCBzZWUgaWYgdGhlIHBjaWUgY2FwYWJpbHR5IGV4aXN0cyAqLwogCi0JY2FwX2lkID0gcmVhZF9wY2lfY2ZnX2J5dGUoY2FwX3B0cik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAogCXdoaWxlIChjYXBfaWQgIT0gcmVxX2NhcF9pZCkgewotCQljYXBfcHRyID0gcmVhZF9wY2lfY2ZnX2J5dGUoKGNhcF9wdHIgKyAxKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG9zaC0+cGRldiwgY2FwX3B0ciArIDEsICZjYXBfcHRyKTsKIAkJaWYgKGNhcF9wdHIgPT0gMHgwMCkKIAkJCWJyZWFrOwotCQljYXBfaWQgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfcHRyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAl9CiAJaWYgKGNhcF9pZCAhPSByZXFfY2FwX2lkKSB7CiAJCWdvdG8gZW5kOwpAQCAtMTk5LDcgKzE3Miw3IEBACiAJCQlidWZzaXplID0gU1pQQ1IgLSBjYXBfZGF0YTsKIAkJKmJ1ZmxlbiA9IGJ1ZnNpemU7CiAJCXdoaWxlIChidWZzaXplLS0pIHsKLQkJCSpidWYgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfZGF0YSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShvc2gtPnBkZXYsIGNhcF9kYXRhLCBidWYpOwogCQkJY2FwX2RhdGErKzsKIAkJCWJ1ZisrOwogCQl9CkBAIC0yMTAsNyArMTgzLDggQEAKIAogLyogKioqKiogUmVnaXN0ZXIgQWNjZXNzIEFQSSAqLwogdWludAotcGNpZV9yZWFkcmVnKG9zbF90ICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0KQorcGNpZV9yZWFkcmVnKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLAorCSAgICAgdWludCBvZmZzZXQpCiB7CiAJdWludCByZXR2YWwgPSAweEZGRkZGRkZGOwogCkBAIC0yMzYsOCArMjEwLDggQEAKIH0KIAogdWludAotcGNpZV93cml0ZXJlZyhvc2xfdCAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCwKLQkgICAgICB1aW50IHZhbCkKK3BjaWVfd3JpdGVyZWcoc3RydWN0IG9zbF9pbmZvICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsCisJICAgICAgdWludCBvZmZzZXQsIHVpbnQgdmFsKQogewogCUFTU0VSVChwY2llcmVncyAhPSBOVUxMKTsKIApAQCAtMzczLDE1ICszNDcsMTUgQEAKIAlpZiAoIW9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJLyogc2V0IG9wZXJhdGlvbiAqLwogCWlmIChtYXNrKSB7CiAJCWlmICh2YWwpCiAJCQlyZWdfdmFsIHw9IFBDSUVfQ0xLUkVRX0VOQUI7CiAJCWVsc2UKIAkJCXJlZ192YWwgJj0gflBDSUVfQ0xLUkVRX0VOQUI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIG9mZnNldCwgc2l6ZW9mKHUzMiksIHJlZ192YWwpOwotCQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHJlZ192YWwpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJfQogCWlmIChyZWdfdmFsICYgUENJRV9DTEtSRVFfRU5BQikKIAkJcmV0dXJuIDE7CkBAIC0zOTMsNyArMzY3LDcgQEAKIHsKIAl1MzIgdzsKIAlzaV90ICpzaWggPSBwaS0+c2loOwotCW9zbF90ICpvc2ggPSBwaS0+b3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gcGktPm9zaDsKIAlzYnBjaWVyZWdzX3QgKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAKIAlpZiAoIVBDSUVfUFVCKHNpaCkgfHwgc2loLT5idXNjb3JlcmV2IDwgNykKQEAgLTUwMiwxMiArNDc2LDEyIEBACiAKIAkJV19SRUcocGktPm9zaCwgcmVnMTYsIHZhbDE2KTsKIAotCQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJCXNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKKwkJCQkJJncpOwogCQl3ICY9IH5QQ0lFX0FTUE1fRU5BQjsKIAkJdyB8PSBwaS0+cGNpZV93YXJfYXNwbV9vdnI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKLQkJCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LAorCQkJCQlwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCX0KIAogCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV07CkBAIC01NzcsNyArNTUxLDcgQEAKIHN0YXRpYyB2b2lkIHBjaWVfd2FyX3BjaV9zZXR1cChwY2ljb3JlX2luZm9fdCAqcGkpCiB7CiAJc2lfdCAqc2loID0gcGktPnNpaDsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAJc2JwY2llcmVnc190ICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXUzMiB3OwogCkBAIC02OTQsMTEgKzY2OCw5IEBACiAJaWYgKCFwaSB8fCAhUENJRV9BU1BNKHBpLT5zaWgpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsICZ3KTsKIAl3ICY9IH5QQ0lFX0NBUF9MQ1JFR19BU1BNTDE7Ci0JT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgcGktPnBjaWVjYXBfbGNyZWdfb2Zmc2V0LCBzaXplb2YodTMyKSwKLQkJCSAgICAgdyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCiAJcGktPnBjaWVfcHI0Mjc2NyA9IGZhbHNlOwogfQpAQCAtNzE4LDcgKzY5MCw3IEBACiAKIC8qICoqKioqIFdha2Utb24td2lyZWxlc3MtTEFOIChXT1dMKSBzdXBwb3J0IGZ1bmN0aW9ucyAqKioqKiAqLwogLyogSnVzdCB1c2VzIFBDSSBjb25maWcgYWNjZXNzZXMgdG8gZmluZCBvdXQsIHdoZW4gbmVlZGVkIGJlZm9yZSBzYl9hdHRhY2ggaXMgZG9uZSAqLwotYm9vbCBwY2ljb3JlX3BtZWNhcF9mYXN0KG9zbF90ICpvc2gpCitib29sIHBjaWNvcmVfcG1lY2FwX2Zhc3Qoc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdTggY2FwX3B0cjsKIAl1MzIgcG1lY2FwOwpAQCAtNzMwLDcgKzcwMiw3IEBACiAJaWYgKCFjYXBfcHRyKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlwbWVjYXAgPSBPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgY2FwX3B0ciwgc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvc2gtPnBkZXYsIGNhcF9wdHIsICZwbWVjYXApOwogCiAJcmV0dXJuIChwbWVjYXAgJiBQTUVfQ0FQX1BNX1NUQVRFUykgIT0gMDsKIH0KQEAgLTc1Myw5ICs3MjUsOCBAQAogCiAJCXBpLT5wbWVjYXBfb2Zmc2V0ID0gY2FwX3B0cjsKIAotCQlwbWVjYXAgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCwKLQkJCQkJc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQsCisJCQkJCSZwbWVjYXApOwogCiAJCS8qIEF0IGxlYXN0IG9uZSBzdGF0ZSBjYW4gZ2VuZXJhdGUgUE1FICovCiAJCXBpLT5wbWVjYXAgPSAocG1lY2FwICYgUE1FX0NBUF9QTV9TVEFURVMpICE9IDA7CkBAIC03NzQsMTEgKzc0NSwxMSBAQAogCWlmICghcGNpY29yZV9wbWVjYXAocGkpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAotCQkJCXNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKKwkJCQkmdyk7CiAJdyB8PSAoUE1FX0NTUl9QTUVfRU4pOwotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIC8qCkBAIC03OTIsOCArNzYzLDggQEAKIAlpZiAoIXBjaWNvcmVfcG1lY2FwKHBpKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcocGktPm9zaCwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKLQkJCQlzaXplb2YodTMyKSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCisJCQkJJncpOwogCiAJcmV0dXJuICh3ICYgUE1FX0NTUl9QTUVfU1RBVCkgPT0gUE1FX0NTUl9QTUVfU1RBVDsKIH0KQEAgLTgwOCwyMiArNzc5LDIzIEBACiAJaWYgKCFwY2ljb3JlX3BtZWNhcChwaSkpCiAJCXJldHVybjsKIAotCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAorCQkJCSZ3KTsKIAogCVBDSV9FUlJPUigoInBjaWNvcmVfcGNpX3BtZWNsciBQTUVDU1IgOiAweCV4XG4iLCB3KSk7CiAKIAkvKiBQTUVTVEFUIGlzIGNsZWFyZWQgYnkgd3JpdGluZyAxIHRvIGl0ICovCiAJdyAmPSB+KFBNRV9DU1JfUE1FX0VOKTsKIAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIHUzMiBwY2llX2xjcmVnKHZvaWQgKnBjaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJcGNpY29yZV9pbmZvX3QgKnBpID0gKHBjaWNvcmVfaW5mb190ICopIHBjaDsKIAl1OCBvZmZzZXQ7CisJdTMyIHRtcHZhbDsKIAogCW9mZnNldCA9IHBpLT5wY2llY2FwX2xjcmVnX29mZnNldDsKIAlpZiAoIW9mZnNldCkKQEAgLTgzMSw5ICs4MDMsMTAgQEAKIAogCS8qIHNldCBvcGVyYXRpb24gKi8KIAlpZiAobWFzaykKLQkJT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgb2Zmc2V0LCBzaXplb2YodTMyKSwgdmFsKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHZhbCk7CiAKLQlyZXR1cm4gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmdG1wdmFsKTsKKwlyZXR1cm4gdG1wdmFsOwogfQogCiB1MzIKQEAgLTg0Miw3ICs4MTUsNyBAQAogCXUzMiByZWdfdmFsID0gMDsKIAlwY2ljb3JlX2luZm9fdCAqcGkgPSAocGNpY29yZV9pbmZvX3QgKikgcGNoOwogCXNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAKIAlpZiAobWFzaykgewogCQlQQ0lfRVJST1IoKCJQQ0lFUkVHOiAweCV4IHdyaXRldmFsICAweCV4XG4iLCBvZmZzZXQsIHZhbCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL252cmFtL252cmFtX3JvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwppbmRleCBmODAzNzVjLi5lNGQ0MWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwpAQCAtNDksNyArNDksNyBAQAogLyogY29weSBmbGFzaCB0byByYW0gKi8KIHN0YXRpYyB2b2lkIGdldF9mbGFzaF9udnJhbShzaV90ICpzaWgsIHN0cnVjdCBudnJhbV9oZWFkZXIgKm52aCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXVpbnQgbnZzLCBidWZzejsKIAl2YXJzX3QgKm5ldzsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJbGVuID0gc3RybGVuKG5hbWUpOwogCiAJZm9yIChzID0gdmFyczsgKHMgPCBsaW0pICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zYnV0aWxzLmMKaW5kZXggZTRjMGJhYi4uNjNjM2FiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2J1dGlscy5jCkBAIC0xNiw2ICsxNiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgpAQCAtODcsNyArOTAsNyBAQAogewogCXUzMiBzYmFkZHIgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJCXNiYWRkciA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2lpLT5jdXJtYXA7CkBAIC0yNDgsNyArMjUxLDcgQEAKIAkJCWVsc2UgewogCQkJCS8qIE9sZGVyIGNoaXBzICovCiAJCQkJU0lfRVJST1IoKCJzYl9jaGlwMm51bWNvcmVzOiB1bnN1cHBvcnRlZCBjaGlwICIKLQkJCQkJIjB4JXhcbiIsIENISVBJRChzaWktPnB1Yi5jaGlwKSkpOworCQkJCQkJICAiMHgleFxuIiwgc2lpLT5wdWIuY2hpcCkpOwogCQkJCUFTU0VSVCgwKTsKIAkJCQludW1jb3JlcyA9IDE7CiAJCQl9CkBAIC0zNDQsNyArMzQ3LDcgQEAKIAl1MzIgc2JhZGRyID0gc2lpLT5jb3Jlc2JhW2NvcmVpZHhdOwogCXZvaWQgKnJlZ3M7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaS0+cHViLmJ1c3R5cGUpIHsKICNpZmRlZiBCQ01TRElPCiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CkBAIC00MDksOCArNDEyLDggQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCWlmICgoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBTRElPX0JVUykgfHwKLQkgICAgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKHNpaS0+cHViLmJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8CisJICAgIChzaWktPnB1Yi5idXN0eXBlID09IFNQSV9CVVMpKSB7CiAKIAkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7CiAJCW9yaWdpZHggPSBzaV9jb3JlaWR4KHNpaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NpdXRpbHMuYwppbmRleCBmM2VhN2UxLi5iNjZkZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zaXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KQEAgLTUzLDcgKzU4LDcgQEAKICNlbmRpZgogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgb3NsX3QgKm9zaCwKK3N0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCSAgICAgIHZvaWQgKnJlZ3MsIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywKIAkJCSAgICAgIHVpbnQgKnZhcnN6KTsKIHN0YXRpYyBib29sIHNpX2J1c2NvcmVfcHJlcChzaV9pbmZvX3QgKnNpaSwgdWludCBidXN0eXBlLCB1aW50IGRldmlkLApAQCAtODEsOCArODYsOCBAQAogICogdmFycyAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIGFyZWEgZm9yICJlbnZpcm9ubWVudCIgdmFyaWFibGVzCiAgKiB2YXJzeiAtIHBvaW50ZXIgdG8gaW50IHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmFycwogICovCi1zaV90ICpzaV9hdHRhY2godWludCBkZXZpZCwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCi0JCWNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKK3NpX3QgKnNpX2F0dGFjaCh1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLAorCQl2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAlzaV9pbmZvX3QgKnNpaTsKIApAQCAtMTEzLDEyICsxMTgsMTIgQEAKIAogI2lmbmRlZiBCUkNNX0ZVTExNQUMKIAkvKiBrbHVkZ2UgdG8gZW5hYmxlIHRoZSBjbG9jayBvbiB0aGUgNDMwNiB3aGljaCBsYWNrcyBhIHNsb3djbG9jayAqLwotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQorCWlmIChidXN0eXBlID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQogCQlzaV9jbGtjdGxfeHRhbCgmc2lpLT5wdWIsIFhUQUwgfCBQTEwsIE9OKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChCQ01TRElPKQotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB7CisJaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJaW50IGVycjsKIAkJdTggY2xrc2V0OwogCkBAIC0yMjAsNyArMjI1LDcgQEAKIAkJU0lfVk1TRygoIkNPUkVbJWRdOiBpZCAweCV4IHJldiAlZCBiYXNlIDB4JXggcmVncyAweCVwXG4iLAogCQkJIGksIGNpZCwgY3Jldiwgc2lpLT5jb3Jlc2JhW2ldLCBzaWktPnJlZ3NbaV0pKTsKIAotCQlpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJCWlmIChjaWQgPT0gUENJX0NPUkVfSUQpIHsKIAkJCQlwY2lpZHggPSBpOwogCQkJCXBjaXJldiA9IGNyZXY7CkBAIC0yMzIsOCArMjM3LDggQEAKIAkJCX0KIAkJfQogI2lmZGVmIEJDTVNESU8KLQkJZWxzZSBpZiAoKChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB8fAotCQkJICAoQlVTVFlQRShidXN0eXBlKSA9PSBTUElfQlVTKSkgJiYKKwkJZWxzZSBpZiAoKChidXN0eXBlID09IFNESU9fQlVTKSB8fAorCQkJICAoYnVzdHlwZSA9PSBTUElfQlVTKSkgJiYKIAkJCSAoKGNpZCA9PSBQQ01DSUFfQ09SRV9JRCkgfHwgKGNpZCA9PSBTRElPRF9DT1JFX0lEKSkpIHsKIAkJCXNpaS0+cHViLmJ1c2NvcmVyZXYgPSBjcmV2OwogCQkJc2lpLT5wdWIuYnVzY29yZXR5cGUgPSBjaWQ7CkBAIC0yNTUsNyArMjYwLDcgQEAKIAkqIG9yIGRvd25sb2FkZWQgY29kZSB3YXMKIAkqIGFscmVhZHkgcnVubmluZy4KIAkqLwotCWlmICgoQlVTVFlQRShidXN0eXBlKSA9PSBTRElPX0JVUykgfHwgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8IChidXN0eXBlID09IFNQSV9CVVMpKSB7CiAJCWlmIChzaV9zZXRjb3JlKCZzaWktPnB1YiwgQVJNN1NfQ09SRV9JRCwgMCkgfHwKIAkJCXNpX3NldGNvcmUoJnNpaS0+cHViLCBBUk1DTTNfQ09SRV9JRCwgMCkpCiAJCQlzaV9jb3JlX2Rpc2FibGUoJnNpaS0+cHViLCAwKTsKQEAgLTI4MSw3ICsyODYsNyBAQAogCQkgc2lpLT5wdWIuYnVzY29yZXR5cGUsIHNpaS0+cHViLmJ1c2NvcmVyZXYpKTsKIAogCS8qIGZpeHVwIG5lY2Vzc2FyeSBjaGlwL2NvcmUgY29uZmlndXJhdGlvbnMgKi8KLQlpZiAoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoU0lfRkFTVChzaWkpKSB7CiAJCQlpZiAoIXNpaS0+cGNoKSB7CiAJCQkJc2lpLT5wY2ggPSAodm9pZCAqKXBjaWNvcmVfaW5pdCgKQEAgLTMwOCwxMCArMzEzLDEwIEBACiAJdWludCB3ID0gMDsKIAogCS8qIGdldCBib2FyZHR5cGUgYW5kIGJvYXJkcmV2ICovCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfU1ZJRCwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9DRkdfU1ZJRCwgJncpOwogCQkvKiBMZXQgbnZyYW0gdmFyaWFibGVzIG92ZXJyaWRlIHN1YnN5c3RlbSBWZW5kL0lEICovCiAJCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gKHUxNilzaV9nZXRkZXZwYXRoaW50dmFyKCZzaWktPnB1YiwKIAkJCSJib2FyZHZlbmRvciIpOwpAQCAtMzY0LDcgKzM2OSw3IEBACiAvKiB0aGlzIGlzIHdpbGwgbWFrZSBTb25pY3MgY2FsbHMgZGlyZWN0bHksIHNpbmNlIFNvbmljcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBTaSBhYnN0cmFjdGlvbiAqLwogLyogdGhpcyBoYXMgYmVlbiBjdXN0b21pemVkIGZvciB0aGUgYmNtIDQzMjkgT05MWSAqLwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBvc2xfdCAqb3NoLAorc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgICAgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCiAJCQkgICAgICBjaGFyICoqdmFycywgdWludCAqdmFyc3opCiB7CkBAIC0zNzYsNyArMzgxLDcgQEAKIAogCUFTU0VSVChHT09EUkVHUyhyZWdzKSk7CiAKLQliemVybygodW5zaWduZWQgY2hhciAqKSBzaWksIHNpemVvZihzaV9pbmZvX3QpKTsKKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgc2lpLCAwLCBzaXplb2Yoc2lfaW5mb190KSk7CiAKIAlzYXZld2luID0gMDsKIApAQCAtMzkwLDExICszOTUsNiBAQAogCWNjID0gKGNoaXBjcmVnc190ICopIHNpaS0+Y3VybWFwOwogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKLQlpZiAoYnVzdHlwZSAhPSBCVVNUWVBFKGJ1c3R5cGUpKSB7Ci0JCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IGJ1cyB0eXBlICVkIGRvZXMgbm90IG1hdGNoIGNvbmZpZ3VyZWQgYnVzIHR5cGUgJWRcbiIsIGJ1c3R5cGUsIEJVU1RZUEUoYnVzdHlwZSkpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJLyogYnVzL2NvcmUvY2xrIHNldHVwIGZvciByZWdpc3RlciBhY2Nlc3MgKi8KIAlpZiAoIXNpX2J1c2NvcmVfcHJlcChzaWksIGJ1c3R5cGUsIGRldmlkLCBzZGgpKSB7CiAJCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IHNpX2NvcmVfY2xrX3ByZXAgZmFpbGVkICVkXG4iLApAQCAtNDE0LDcgKzQxNCw3IEBACiAJc2loLT5jaGlwcmV2ID0gKHcgJiBDSURfUkVWX01BU0spID4+IENJRF9SRVZfU0hJRlQ7CiAJc2loLT5jaGlwcGtnID0gKHcgJiBDSURfUEtHX01BU0spID4+IENJRF9QS0dfU0hJRlQ7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkgJiYKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpICYmCiAJCShzaWgtPmNoaXBwa2cgIT0gQkNNNDMyOV8yODlQSU5fUEtHX0lEKSkKIAkJCXNpaC0+Y2hpcHBrZyA9IEJDTTQzMjlfMTgyUElOX1BLR19JRDsKIApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAkvKiBJbml0IG52cmFtIGZyb20gc3Byb20vb3RwIGlmIHRoZXkgZXhpc3QgKi8KIAlpZiAoc3JvbV92YXJfaW5pdAotCSAgICAoJnNpaS0+cHViLCBCVVNUWVBFKGJ1c3R5cGUpLCByZWdzLCBzaWktPm9zaCwgdmFycywgdmFyc3opKSB7CisJICAgICgmc2lpLT5wdWIsIGJ1c3R5cGUsIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKIAkJU0lfRVJST1IoKCJzaV9kb2F0dGFjaDogc3JvbV92YXJfaW5pdCBmYWlsZWQ6IGJhZCBzcm9tXG4iKSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC00OTksNyArNDk5LDcgQEAKIH0KIAogI2Vsc2UJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIG9zbF90ICpvc2gsCitzdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkgICAgICB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnNkaCwKIAkJCSAgICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAJQVNTRVJUKEdPT0RSRUdTKHJlZ3MpKTsKIAotCWJ6ZXJvKCh1bnNpZ25lZCBjaGFyICopIHNpaSwgc2l6ZW9mKHNpX2luZm9fdCkpOworCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSBzaWksIDAsIHNpemVvZihzaV9pbmZvX3QpKTsKIAogCXNhdmV3aW4gPSAwOwogCkBAIC01MjIsMzAgKzUyMiwyOSBAQAogCXNpaS0+b3NoID0gb3NoOwogCiAJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBhIHNpIGNvcmUgbWltaWMnaW5nIGEgcGNpIGNvcmUgKi8KLQlpZiAoKGJ1c3R5cGUgPT0gUENJX0JVUykgJiYKLQkgICAgKE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9TUFJPTV9DT05UUk9MLCBzaXplb2YodTMyKSkgPT0KLQkgICAgIDB4ZmZmZmZmZmYpKSB7Ci0JCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsIHN3aXRjaGluZyB0byBTSSAiICJkZXZpZDoweCV4XG4iLCBfX2Z1bmNfXywgZGV2aWQpKTsKLQkJYnVzdHlwZSA9IFNJX0JVUzsKKwlpZiAoYnVzdHlwZSA9PSBQQ0lfQlVTKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX1NQUk9NX0NPTlRST0wsICAmdyk7CisJCWlmICh3ID09IDB4ZmZmZmZmZmYpIHsKKwkJCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsICIKKwkJCQkiIHN3aXRjaGluZyB0byBTSSBkZXZpZDoweCV4XG4iLAorCQkJCV9fZnVuY19fLCBkZXZpZCkpOworCQkJYnVzdHlwZSA9IFNJX0JVUzsKKwkJfQogCX0KIAogCS8qIGZpbmQgQ2hpcGNvbW1vbiBhZGRyZXNzICovCiAJaWYgKGJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlzYXZld2luID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9CQVIwX1dJTiwgJnNhdmV3aW4pOwogCQlpZiAoIUdPT0RDT1JFQUREUihzYXZld2luLCBTSV9FTlVNX0JBU0UpKQogCQkJc2F2ZXdpbiA9IFNJX0VOVU1fQkFTRTsKLQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgNCwgU0lfRU5VTV9CQVNFKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLAorCQkJCSAgICAgICBTSV9FTlVNX0JBU0UpOwogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSByZWdzOwogCX0gZWxzZSB7CiAJCWNjID0gKGNoaXBjcmVnc190ICopIFJFR19NQVAoU0lfRU5VTV9CQVNFLCBTSV9DT1JFX1NJWkUpOwogCX0KIAogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7Ci0JaWYgKGJ1c3R5cGUgIT0gQlVTVFlQRShidXN0eXBlKSkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBidXMgdHlwZSAlZCBkb2VzIG5vdCBtYXRjaCBjb25maWd1cmVkIGJ1cyB0eXBlICVkXG4iLCBidXN0eXBlLCBCVVNUWVBFKGJ1c3R5cGUpKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCiAJaWYgKCFzaV9idXNjb3JlX3ByZXAoc2lpLCBidXN0eXBlLCBkZXZpZCwgc2RoKSkgewpAQCAtNTY5LDcgKzU2OCw3IEBACiAJc2loLT5pc3NpbSA9IElTX1NJTShzaWgtPmNoaXBwa2cpOwogCiAJLyogc2NhbiBmb3IgY29yZXMgKi8KLQlpZiAoQ0hJUFRZUEUoc2lpLT5wdWIuc29jaXR5cGUpID09IFNPQ0lfQUkpIHsKKwlpZiAoc2lpLT5wdWIuc29jaXR5cGUgPT0gU09DSV9BSSkgewogCQlTSV9NU0coKCJGb3VuZCBjaGlwIHR5cGUgQUkgKDB4JTA4eClcbiIsIHcpKTsKIAkJLyogcGFzcyBjaGlwYyBhZGRyZXNzIGluc3RlYWQgb2Ygb3JpZ2luYWwgY29yZSBiYXNlICovCiAJCWFpX3NjYW4oJnNpaS0+cHViLCAodm9pZCAqKWNjLCBkZXZpZCk7CkBAIC01OTIsMTAgKzU5MSwxMCBAQAogCS8qIGFzc3VtZSBjdXJyZW50IGNvcmUgaXMgQ0MgKi8KIAlpZiAoKHNpaS0+cHViLmNjcmV2ID09IDB4MjUpCiAJICAgICYmCi0JICAgICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRAotCSAgICAgIHx8IENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQKLQkgICAgICB8fCBDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzIzOF9DSElQX0lEKQotCSAgICAgJiYgKENISVBSRVYoc2lpLT5wdWIuY2hpcHJldikgPD0gMikpKSB7CisJICAgICgoc2loLT5jaGlwID09IEJDTTQzMjM2X0NISVBfSUQKKwkgICAgICB8fCBzaWgtPmNoaXAgPT0gQkNNNDMyMzVfQ0hJUF9JRAorCSAgICAgIHx8IHNpaC0+Y2hpcCA9PSBCQ000MzIzOF9DSElQX0lEKQorCSAgICAgJiYgKHNpaS0+cHViLmNoaXByZXYgPD0gMikpKSB7CiAKIAkJaWYgKChjYy0+Y2hpcHN0YXR1cyAmIENTVDQzMjM2X0JQX0NMSykgIT0gMCkgewogCQkJdWludCBjbGtkaXY7CkBAIC02MTMsNyArNjEyLDcgQEAKIAogCS8qIEluaXQgbnZyYW0gZnJvbSBzcHJvbS9vdHAgaWYgdGhleSBleGlzdCAqLwogCWlmIChzcm9tX3Zhcl9pbml0Ci0JICAgICgmc2lpLT5wdWIsIEJVU1RZUEUoYnVzdHlwZSksIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKKwkgICAgKCZzaWktPnB1YiwgYnVzdHlwZSwgcmVncywgc2lpLT5vc2gsIHZhcnMsIHZhcnN6KSkgewogCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBzcm9tX3Zhcl9pbml0IGZhaWxlZDogYmFkIHNyb21cbiIpKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTY1MSwxMCArNjUwLDEwIEBACiAJCXBjaWNvcmVfYXR0YWNoKHNpaS0+cGNoLCBwdmFycywgU0lfRE9BVFRBQ0gpOwogCX0KIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkgICAgKHNpaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkgewogCQkvKiBlbmFibGUgMTIgbUEgZHJpdmUgc3RyZW50aCBmb3IgNDMyMjQgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMTUgKi8KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKSk7CiAJCQlzaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAogCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbCksCkBAIC02NjMsMjggKzY2MiwyOCBAQAogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA+PSAxKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPj0gMSkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRCMCsgV0FSc1xuIikpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpIHsKIAkJLyogZW5hYmxlIDEyIG1BIGRyaXZlIHN0cmVudGggZm9yIDQzMTMgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMSAqLwogCQlTSV9NU0coKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpKTsKIAkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMxM18xMk1BX0xFRF9EUklWRSwKIAkJCQkgICBDQ1RSTF80MzEzXzEyTUFfTEVEX0RSSVZFKTsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMV9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzMxX0NISVBfSUQpIHsKIAkJLyogRW5hYmxlIEV4dCBQQSBsaW5lcyBkZXBlbmRpbmcgb24gY2hpcCBwYWNrYWdlIG9wdGlvbiAqLwogCQlzaV9jaGlwY29udHJsX2VwYTQzMzEoc2loLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gc2lpOwogIGV4aXQ6Ci0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzA4LDE3ICs3MDcsMTcgQEAKIAlpZiAoc2lpID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gU0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKQogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNJX01BWENPUkVTOyBpZHgrKykKIAkJCWlmIChzaWktPnJlZ3NbaWR4XSkgewotCQkJCVJFR19VTk1BUChzaWktPnJlZ3NbaWR4XSk7CisJCQkJaW91bm1hcChzaWktPnJlZ3NbaWR4XSk7CiAJCQkJc2lpLT5yZWdzW2lkeF0gPSBOVUxMOwogCQkJfQogCiAjaWZuZGVmIEJSQ01fRlVMTE1BQwogCW52cmFtX2V4aXQoKHZvaWQgKilzaV9sb2NhbCk7CS8qIGZyZWUgdXAgbnZyYW0gYnVmZmVycyAqLwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzMwLDcgKzcyOSw3IEBACiAJCWtmcmVlKHNpaSk7CiB9CiAKLXZvaWQgKnNpX29zaChzaV90ICpzaWgpCitzdHJ1Y3Qgb3NsX2luZm8gKnNpX29zaChzaV90ICpzaWgpCiB7CiAJc2lfaW5mb190ICpzaWk7CiAKQEAgLTc2Niw3ICs3NjUsNyBAQAogCiB1aW50IHNpX2ZsYWcoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9mbGFnKHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTc3Niw3ICs3NzUsNyBAQAogCiB2b2lkIHNpX3NldGludChzaV90ICpzaWgsIGludCBzaWZsYWcpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfc2V0aW50KHNpaCwgc2lmbGFnKTsKIAllbHNlCiAJCUFTU0VSVCgwKTsKQEAgLTgwOCw3ICs4MDcsNyBAQAogI2lmbmRlZiBCQ01TRElPCiB1aW50IHNpX2NvcmVyZXYoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlcmV2KHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTg1MSw3ICs4NTAsNyBAQAogCWlmICghR09PRElEWChpZHgpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9zZXRjb3JlaWR4KHNpaCwgaWR4KTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC04NjYsNyArODY1LDcgQEAKICNpZm5kZWYgQkNNU0RJTwogdm9pZCAqc2lfc2V0Y29yZWlkeChzaV90ICpzaWgsIHVpbnQgY29yZWlkeCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGNvcmVpZHgpOwogCWVsc2UgewogCQlBU1NFUlQoMCk7CkBAIC05MTgsNyArOTE3LDcgQEAKIAogdTMyIHNpX2NvcmVfY2ZsYWdzKHNpX3QgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVfY2ZsYWdzKHNpaCwgbWFzaywgdmFsKTsKIAllbHNlIHsKIAkJQVNTRVJUKDApOwpAQCAtOTI4LDcgKzkyNyw3IEBACiAKIHUzMiBzaV9jb3JlX3NmbGFncyhzaV90ICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlX3NmbGFncyhzaWgsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTkzOCw3ICs5MzcsNyBAQAogCiBib29sIHNpX2lzY29yZXVwKHNpX3QgKnNpaCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfaXNjb3JldXAoc2loKTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC05NTMsNyArOTUyLDcgQEAKIHZvaWQgc2lfd3JpdGVfd3JhcHBlcnJlZyhzaV90ICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCiB7CiAJLyogb25seSBmb3IgNDMxOSwgbm8gcmVxdWlyZW1lbnQgZm9yIFNPQ0lfU0IgKi8KLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkgeworCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpIHsKIAkJYWlfd3JpdGVfd3JhcF9yZWcoc2loLCBvZmZzZXQsIHZhbCk7CiAJfQogfQpAQCAtOTYxLDcgKzk2MCw3IEBACiB1aW50IHNpX2NvcmVyZWcoc2lfdCAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssIHVpbnQgdmFsKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBjb3JlaWR4LCByZWdvZmYsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAjaWZkZWYgQkNNU0RJTwpAQCAtOTc2LDcgKzk3NSw3IEBACiB2b2lkIHNpX2NvcmVfZGlzYWJsZShzaV90ICpzaWgsIHUzMiBiaXRzKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfY29yZV9kaXNhYmxlKHNpaCwgYml0cyk7CiAjaWZkZWYgQkNNU0RJTwogCWVsc2UKQEAgLTk4Niw3ICs5ODUsNyBAQAogCiB2b2lkIHNpX2NvcmVfcmVzZXQoc2lfdCAqc2loLCB1MzIgYml0cywgdTMyIHJlc2V0Yml0cykKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlhaV9jb3JlX3Jlc2V0KHNpaCwgYml0cywgcmVzZXRiaXRzKTsKICNpZmRlZiBCQ01TRElPCiAJZWxzZQpAQCAtMTA0Myw4ICsxMDQyLDggQEAKIAogCWlmIChQTVVDVExfRU5BQihzaWgpKSB7CiAKLQkJaWYgKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzE5X0NISVBfSUQpICYmCi0JCSAgICAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApICYmICh0aWNrcyAhPSAwKSkgeworCQlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpICYmCisJCSAgICAoc2loLT5jaGlwcmV2ID09IDApICYmICh0aWNrcyAhPSAwKSkgewogCQkJc2lfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKIAkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2xrX2N0bF9zdCksIH4wLCAweDIpOwogCQkJc2lfc2V0Y29yZShzaWgsIFVTQjIwRF9DT1JFX0lELCAwKTsKQEAgLTEwODUsMTYgKzEwODQsMTggQEAKIHN0YXRpYyB1aW50IHNpX3Nsb3djbGtfc3JjKHNpX2luZm9fdCAqc2lpKQogewogCWNoaXBjcmVnc190ICpjYzsKKwl1MzIgdmFsOwogCiAJQVNTRVJUKFNJX0ZBU1Qoc2lpKSB8fCBzaV9jb3JlaWQoJnNpaS0+cHViKSA9PSBDQ19DT1JFX0lEKTsKIAogCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCi0JCSAgICAoT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSkKLQkJICAgICAmIFBDSV9DRkdfR1BJT19TQ1MpKQotCQkJcmV0dXJuIFNDQ19TU19QQ0k7Ci0JCWVsc2UKLQkJCXJldHVybiBTQ0NfU1NfWFRBTDsKKwkJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVQsCisJCQkJCSAgICAgICZ2YWwpOworCQkJaWYgKHZhbCAmIFBDSV9DRkdfR1BJT19TQ1MpCisJCQkJcmV0dXJuIFNDQ19TU19QQ0k7CisJCX0KKwkJcmV0dXJuIFNDQ19TU19YVEFMOwogCX0gZWxzZSBpZiAoc2lpLT5wdWIuY2NyZXYgPCAxMCkgewogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSBzaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgc2lpLT5jdXJpZHgpOwogCQlyZXR1cm4gUl9SRUcoc2lpLT5vc2gsICZjYy0+c2xvd19jbGtfY3RsKSAmIFNDQ19TU19NQVNLOwpAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAogI2lmZGVmIEJDTVNESU8KIAljYXNlIFNESU9fQlVTOgpAQCAtMTI3NiwxMiArMTI3Nyw5IEBACiAJCWlmIChQQ0lFKHNpaSkpCiAJCQlyZXR1cm4gLTE7CiAKLQkJaW4gPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19JTiwgc2l6ZW9mKHUzMikpOwotCQlvdXQgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSk7Ci0JCW91dGVuID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVEVOLAotCQkJCQlzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fSU4sICZpbik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fT1VULCAmb3V0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVRFTiwgJm91dGVuKTsKIAogCQkvKgogCQkgKiBBdm9pZCBnbGl0Y2hpbmcgdGhlIGNsb2NrIGlmIEdQUlMgaXMgYWxyZWFkeSB1c2luZyBpdC4KQEAgLTEzMDIsMTggKzEzMDAsMTggQEAKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1hUQUw7CiAJCQkJaWYgKHdoYXQgJiBQTEwpCiAJCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCQkgICAgIHNpemVvZih1MzIpLCBvdXQpOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVRFTiwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVCwgb3V0KTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVEVOLCBvdXRlbik7CiAJCQkJdWRlbGF5KFhUQUxfT05fREVMQVkpOwogCQkJfQogCiAJCQkvKiB0dXJuIHBsbCBvbiAqLwogCQkJaWYgKHdoYXQgJiBQTEwpIHsKIAkJCQlvdXQgJj0gflBDSV9DRkdfR1BJT19QTEw7Ci0JCQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVCwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwKKwkJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CiAJCQkJbWRlbGF5KDIpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTMyMSwxMCArMTMxOSwxMCBAQAogCQkJCW91dCAmPSB+UENJX0NGR19HUElPX1hUQUw7CiAJCQlpZiAod2hhdCAmIFBMTCkKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1BMTDsKLQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7Ci0JCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VURU4sCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsCisJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAkJfQogCiAJZGVmYXVsdDoKQEAgLTEzNzgsNyArMTM3Niw3IEBACiAJCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwogCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7CiAKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFNJX0JVUykgJiYKKwkJaWYgKChzaWktPnB1Yi5idXN0eXBlID09IFNJX0JVUykgJiYKIAkJICAgIHNpX3NldGNvcmUoJnNpaS0+cHViLCBNSVBTMzNfQ09SRV9JRCwgMCkgJiYKIAkJICAgIChzaV9jb3JlcmV2KCZzaWktPnB1YikgPD0gNykgJiYgKHNpaS0+cHViLmNjcmV2ID49IDEwKSkKIAkJCWdvdG8gZG9uZTsKQEAgLTE0NjAsNyArMTQ1OCw3IEBACiAJaWYgKCFwYXRoIHx8IHNpemUgPD0gMCkKIAkJcmV0dXJuIC0xOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewogCWNhc2UgU0lfQlVTOgogCWNhc2UgSlRBR19CVVM6CiAJCXNsZW4gPSBzbnByaW50ZihwYXRoLCAoc2l6ZV90KSBzaXplLCAic2IvJXUvIiwgc2lfY29yZWlkeChzaWgpKTsKQEAgLTE1NTAsNyArMTU0OCw3IEBACiB7CiAJdTggY2FwX3B0cjsKIAotCWlmIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpICE9IFBDSV9CVVMpCisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY2FwX3B0ciA9CkBAIC0xNjE3LDcgKzE2MTUsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJaWYgKFBDSV9GT1JDRUhUKHNpaSkpCkBAIC0xNjQ2LDcgKzE2NDQsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJLyogcmVsZWFzZSBGT1JDRUhUIHNpbmNlIGNoaXAgaXMgZ29pbmcgdG8gImRvd24iIHN0YXRlICovCkBAIC0xNjY5LDcgKzE2NjcsNyBAQAogCiAJc2lpID0gU0lfSU5GTyhzaWgpOwogCi0JaWYgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgIT0gUENJX0JVUykKKwlpZiAoc2lpLT5wdWIuYnVzdHlwZSAhPSBQQ0lfQlVTKQogCQlyZXR1cm47CiAKIAlBU1NFUlQoUENJKHNpaSkgfHwgUENJRShzaWkpKTsKQEAgLTE2OTIsOSArMTY5MCw5IEBACiAJICovCiAJaWYgKFBDSUUoc2lpKSB8fCAoUENJKHNpaSkgJiYgKChzaWktPnB1Yi5idXNjb3JlcmV2KSA+PSA2KSkpIHsKIAkJLyogcGNpIGNvbmZpZyB3cml0ZSB0byBzZXQgdGhpcyBjb3JlIGJpdCBpbiBQQ0lJbnRNYXNrICovCi0JCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfSU5UX01BU0ssIHNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfSU5UX01BU0ssICZ3KTsKIAkJdyB8PSAoY29yZW1hc2sgPDwgUENJX1NCSU1fU0hJRlQpOwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0lOVF9NQVNLLCBzaXplb2YodTMyKSwgdyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9JTlRfTUFTSywgdyk7CiAJfSBlbHNlIHsKIAkJLyogc2V0IHNiaW50dmVjIGJpdCBmb3Igb3VyIGZsYWcgbnVtYmVyICovCiAJCXNpX3NldGludChzaWgsIHNpZmxhZyk7CkBAIC0xNzMxLDcgKzE3MjksNyBAQAogCiAJc2lfaW5mb190ICpzaWkgPSBTSV9JTkZPKHNpaCk7CiAKLQlBU1NFUlQoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKTsKKwlBU1NFUlQoc2lpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKTsKIAogCS8qIEZpeHVwIFBJIGluIFNST00gc2hhZG93IGFyZWEgdG8gZW5hYmxlIHRoZSBjb3JyZWN0IFBDSSBjb3JlIGFjY2VzcyAqLwogCS8qIHNhdmUgdGhlIGN1cnJlbnQgaW5kZXggKi8KQEAgLTE3NzcsNyArMTc3NSw3IEBACiAJICogaWdub3JlIHJlc2VydmF0aW9uIGlmIGl0J3MgaGlnaCBwcmlvcml0eSAoZS5nLiwgdGVzdCBhcHBzKQogCSAqLwogCWlmICgocHJpb3JpdHkgIT0gR1BJT19ISV9QUklPUklUWSkgJiYKLQkgICAgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKKwkgICAgKHNpaC0+YnVzdHlwZSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKIAkJbWFzayA9IHByaW9yaXR5ID8gKHNpX2dwaW9yZXNlcnZhdGlvbiAmIG1hc2spIDoKIAkJICAgICgoc2lfZ3Bpb3Jlc2VydmF0aW9uIHwgbWFzaykgJiB+KHNpX2dwaW9yZXNlcnZhdGlvbikpOwogCQl2YWwgJj0gbWFzazsKQEAgLTE5MjksMTAgKzE5MjcsMTAgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJCUFTU0VSVChzaWktPm9zaCAhPSBOVUxMKTsKLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfVklELCBzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0NGR19WSUQsICZ3KTsKIAkJaWYgKCh3ICYgMHhGRkZGKSAhPSBWRU5ET1JfQlJPQURDT00pCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJYnJlYWs7CkBAIC0xOTU5LDcgKzE5NTcsNyBAQAogCQlyZXR1cm4gc3JvbWN0cmwgJiBTUkNfUFJFU0VOVDsKIAl9CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIChzaWgtPmNoaXBzdCAmIENTVDQzMjlfU1BST01fU0VMKSAhPSAwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTk3OSw3ICsxOTc3LDcgQEAKIAogYm9vbCBzaV9pc19vdHBfZGlzYWJsZWQoc2lfdCAqc2loKQogewotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMyOV9TUFJPTV9PVFBfU0VMX01BU0spID09CiAJCSAgICBDU1Q0MzI5X09UUF9QV1JETjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKaW5kZXggNGEyOWVkNy4uZGNhODYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKQEAgLTExNyw4ICsxMTcsNyBAQAogCiAJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CiAJCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdi0+bW9kdWxlKSkgewotCQkJcHJpbnRrCi0JCQkgICAgKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGRyaXYtPm51bV9uYW1lcykgewpAQCAtMjA1LDkgKzIwNCw4IEBACiAJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCQlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPmRyaXZlciA9PSBkcml2ZXIpIHsKIAkJCWlmIChkZXYtPnVzZV9jb3VudCkKLQkJCQlwcmludGsKLQkJCQkgICAgKEtFUk5fV0FSTklORyAiQlVHISBkZXRhY2hpbmcgZGV2aWNlIHdpdGggdXNlX2NvdW50PSVkXG4iLAotCQkJCSAgICAgZGV2LT51c2VfY291bnQpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJVRyEgZGV0YWNoaW5nIGRldmljZSB3aXRoIHVzZV9jb3VudD0lZFxuIiwKKwkJCQkJCWRldi0+dXNlX2NvdW50KTsKIAkJCWNvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKQEAgLTQ0Miw3ICs0NDAsOSBAQAogCQl1bnNpZ25lZCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgYXN5bmMtPm5fYnVmX3BhZ2VzOyArK2kpIHsKIAkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpIHsKLQkJCQljbGVhcl9iaXQoUEdfcmVzZXJ2ZWQsICYodmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciktPmZsYWdzKSk7CisJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOwogCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CiAJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCSAgUEFHRV9TSVpFLApAQCAtNDcwLDEwICs0NzAsOCBAQAogCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAogCQlhc3luYy0+YnVmX3BhZ2VfbGlzdCA9Ci0JCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlKSAqIG5fcGFnZXMpOworCQkgICAgdnphbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9idWZfcGFnZSkgKiBuX3BhZ2VzKTsKIAkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7Ci0JCQltZW1zZXQoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QsIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CiAJCQlwYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbl9wYWdlcyk7CiAJCX0KIAkJaWYgKHBhZ2VzKSB7CkBAIC00OTYsOCArNDk0LDEwIEBACiAJCQkJCWJyZWFrOwogCiAJCQkJc2V0X2JpdChQR19yZXNlcnZlZCwKLQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKLQkJCQlwYWdlc1tpXSA9IHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOworCQkJCXBhZ2VzW2ldID0gdmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCQl2aXJ0X2FkZHIpOwogCQkJfQogCQl9CiAJCWlmIChpID09IG5fcGFnZXMpIHsKQEAgLTUxNCw3ICs1MTQsMTAgQEAKIAkJCQkJICAgIE5VTEwpIHsKIAkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWNsZWFyX2JpdChQR19yZXNlcnZlZCwgJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKKwkJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJdmlydF9hZGRyKS0+ZmxhZ3MpKTsKIAkJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKIAkJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCQkgIFBBR0VfU0laRSwKQEAgLTY0Niw4ICs2NDksNyBAQAogewogCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2NvdW50ICsgbmJ5dGVzIC0KIAkJICBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50KSA+IDApIHsKLQkJcHJpbnRrCi0JCSAgICAoS0VSTl9JTkZPICJjb21lZGk6IGF0dGVtcHRlZCB0byB3cml0ZS1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gd3JpdGUtYWxsb2NhdGVkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYXR0ZW1wdGVkIHRvIHdyaXRlLWZyZWUgbW9yZSBieXRlcyB0aGFuIGhhdmUgYmVlbiB3cml0ZS1hbGxvY2F0ZWQuXG4iKTsKIAkJbmJ5dGVzID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CiAJfQogCWFzeW5jLT5idWZfd3JpdGVfY291bnQgKz0gbmJ5dGVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKaW5kZXggNzM2MWQ1MC4uMGU2YWZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCWJfRXh0ZXJuR2F0ZSA9ICh1bnNpZ25lZCBjaGFyKSBkYXRhWzNdOwogCWJfQ3ljbGVNb2RlID0gKHVuc2lnbmVkIGNoYXIpIGRhdGFbNF07CiAJYl9JbnRlcnJ1cHRFbmFibGUgPSAodW5zaWduZWQgY2hhcikgZGF0YVs1XTsKLQlpX1JldHVyblZhbHVlID0gaW5zbi0+bjs7CisJaV9SZXR1cm5WYWx1ZSA9IGluc24tPm47CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwkvKiAgU2F2ZSB0aGUgY3VycmVudCBwcm9jZXNzIHRhc2sgc3RydWN0dXJlICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgdGhlIG1vZHVsZSBudW1iZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYwppbmRleCA5M2Q3YzA1Li43NmYyNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5jCkBAIC0yNzEwLDEwICsyNzEwLDEwIEBACiAJCQl9IGVsc2UgewogCQkJCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAJCQl9Ci0JCQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkJCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAkJCWR3X0R1bW15ID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MzgpOwogCQkJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7Ci0JCQlwcmludGsoIlxuRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIiKTsKKwkJCXByaW50aygiXG5FbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIiKTsKIAkJfQogCQlwcmludGsoIlxuUmVhZCBFZXByb20iKTsKIAkJaV9FZXByb21SZWFkTWFpbkhlYWRlcihpb19hZGRyWzBdLCB0aGlzX2JvYXJkLT5wY19FZXByb21DaGlwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jCmluZGV4IDkxMmJjMGYuLmE3NmVkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfQVBDSTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X0FQQ0kxNzEwLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogCiAJZGV2cHJpdi0+c19Cb2FyZEluZm9zLmJfQm9hcmRWZXJzaW9uID0gMTsKIAotCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xlciAqLworCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAlkd19EdW1teSA9IGlubChkZXZwcml2LT5zX0JvYXJkSW5mb3MudWlfQWRkcmVzcyArIDB4MzgpOwogCW91dGwoZHdfRHVtbXkgfCAweDIwMDAsIGRldnByaXYtPnNfQm9hcmRJbmZvcy51aV9BZGRyZXNzICsgMHgzOCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAyYThhNmM3Li42MmY0MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC0yODUwLDcgKzI4NTAsNyBAQAogCWlfTG9naWMgPSAwOwogCWlfQ291bnRlckxvZ2ljID0gMDsKIAlpX0ludGVycnVwdE1hc2sgPSAwOwotCWlfSW5wdXRDaGFubmVsID0gMDs7CisJaV9JbnB1dENoYW5uZWwgPSAwOwogCWlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAwOwogCWlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwOwogCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCmluZGV4IDEyZmNjMzUuLjhhNTg0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGlmIGVsc2UgZGF0YVszXT09MSkgKi8KIAl9CQkJLyogaWYgZWxzZSBkYXRhWzNdPT0wKSAqLwotCXJldHVybiAoaW5zbi0+bik7OworCXJldHVybiAoaW5zbi0+bik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggYjk0M2EwNi4uYTkzZTIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtMzAxMSw3ICszMDExLDcgQEAKIAogCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAKLQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sbGVyICovCiAJZHdfRHVtbXkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bCgwLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uKTsJLyogUmVzZXRzIHRoZSBvdXRwdXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwppbmRleCAzNTZhMTg5Li5hY2FjZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCkBAIC0zMzksNyArMzM5LDcgQEAKIGludCBpX0FQQ0kzNTAxX1dyaXRlQW5hbG9nT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDAsIHVsX0NoYW5uZWxfbm8sIHVsX1BvbGFyaXR5LCB1bF9EQUNfUmVhZHkgPSAwOzsKKwl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDEgPSAwLCB1bF9DaGFubmVsX25vLCB1bF9Qb2xhcml0eSwgdWxfREFDX1JlYWR5ID0gMDsKIAogCXVsX0NoYW5uZWxfbm8gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IDVkMDY0NTcuLjdlZGViMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTk3MSw3ICs5NzEsNyBAQAogCWlmICh0aGlzYm9hcmQtPmFvX2NoYW5zID4gMCkgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CiAJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW9fY2hhbnM7OworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvX2NoYW5zOwogCQlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5hb19iaXRzKSAtIDE7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnBjaTIzMF9hb19yYW5nZTsKIAkJcy0+aW5zbl93cml0ZSA9ICZwY2kyMzBfYW9fd2luc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDAzNDViNGMuLmJiOTM2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoIWxpbmspCiAJCXJldHVybiAtRUlPOwogCi0JZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7OworCWRldi0+aW9iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXByaW50aygiSS9PIGJhc2U9MHglMDRseCAiLCBkZXYtPmlvYmFzZSk7CiAKIAlwcmludGsoImZpbmdlcnByaW50OlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCmluZGV4IGNmY2JkOWIuLmQ4YWVmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCkBAIC0zNzAsNyArMzcwLDcgQEAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2c19vcGVuZWRbQ09NRURJX05VTV9CT0FSRF9NSU5PUlNdOwogCiAJbWVtc2V0KGRldnNfb3BlbmVkLCAwLCBzaXplb2YoZGV2c19vcGVuZWQpKTsKLQlkZXZwcml2LT5uYW1lWzBdID0gMDs7CisJZGV2cHJpdi0+bmFtZVswXSA9IDA7CiAJLyogTG9vcCB0aHJvdWdoIGFsbCBjb21lZGkgZGV2aWNlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSwKIAkgICBidWlsZGluZyBvdXIgZGV2aWNlIGxpc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05ERVZDT05GT1BUUyAmJiAoIWkgfHwgaXQtPm9wdGlvbnNbaV0pOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCmluZGV4IDM5YTZhODUuLmU0NzExZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwpAQCAtMTksNyArMTksNyBAQAogICoJCQkJLSAxNiBiaXQKICAqCiAgKglvbmx5IE9ORSBQQ0ktMjAzNDEgbW9kdWxlIHBvc3NpYmxlCi0gKiAJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQorICoJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQogICoJbm8gZXh0ZXJuIHRyaWdnZXIgaW1wbGVtZW50ZWQKICAqCiAgKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgNCBvbi1ib2FyZCBkaWZmZXJlbnRpYWwgY2hhbm5lbHMgc3VwcG9ydGVkCkBAIC04MywxMSArODMsMTEgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2RlZmluZSBQQ0kyMDAwMF9JRAkJCTB4MWQKLSNkZWZpbmUgUENJMjAzNDFfSUQgICAgCQkJMHg3NwotI2RlZmluZSBQQ0kyMDAwNl9JRCAgICAgIAkJMHhlMworI2RlZmluZSBQQ0kyMDM0MV9JRAkJCTB4NzcKKyNkZWZpbmUgUENJMjAwMDZfSUQJCQkweGUzCiAjZGVmaW5lIFBDSTIweHh4X0VNUFRZX0lECQkweGZmCiAKLSNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUIAkJMHgxMDAKKyNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUCQkJMHgxMDAKICNkZWZpbmUgUENJMjAwMDBfTU9EVUxFUwkJMwogCiAjZGVmaW5lIFBDSTIwMDAwX0RJT18wCQkJMHg4MApAQCAtMjQ2LDcgKzI0Niw3IEBACiAJCQlwY2kyMDAwNl9pbml0KGRldiwgcywgaXQtPm9wdGlvbnNbMiAqIGkgKyAyXSwKIAkJCQkgICAgICBpdC0+b3B0aW9uc1syICogaSArIDNdKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiCi0JCQkgICAgICAgImlpX3BjaTIwa2MgUENJLTIwMDA2IG1vZHVsZSBpbiBzbG90ICVkIFxuIiwKKwkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAwMDYgbW9kdWxlIGluIHNsb3QgJWRcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vciwgaSArIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJMjAzNDFfSUQ6CkBAIC0yNTUsNyArMjU1LDcgQEAKIAkJCXBjaTIwMzQxX2luaXQoZGV2LCBzLCBpdC0+b3B0aW9uc1syICogaSArIDJdLAogCQkJCSAgICAgIGl0LT5vcHRpb25zWzIgKiBpICsgM10pOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIKLQkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAzNDEgbW9kdWxlIGluIHNsb3QgJWQgXG4iLAorCQkJICAgICAgICJpaV9wY2kyMGtjIFBDSS0yMDM0MSBtb2R1bGUgaW4gc2xvdCAlZFxuIiwKIAkJCSAgICAgICBkZXYtPm1pbm9yLCBpICsgMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTM3Niw5ICszNzYsMjAgQEAKIHN0YXRpYyBjb25zdCBpbnQgcGNpMjAzNDFfdGltZWJhc2VbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCB9Owogc3RhdGljIGNvbnN0IGludCBwY2kyMDM0MV9zZXR0bGluZ190aW1lW10gPSB7IDB4NTgsIDB4NTgsIDB4OTMsIDB4OTkgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7IDEsIHtCSVBfUkFOR0UoMC41KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wNSA9IHsgMSwge0JJUF9SQU5HRSgwLjA1KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wMjUgPSB7IDEsIHtCSVBfUkFOR0UoMC4wMjUpfSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuNSl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuMDUpfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzAyNSA9IHsKKwkxLAorCXtCSVBfUkFOR0UoMC4wMjUpfQorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCBwY2kyMDM0MV9yYW5nZXNbXSA9IHsKIAkmcmFuZ2VfYmlwb2xhcjUsCkBAIC00MDgsMTIgKzQxOSwxOCBAQAogCXMtPm1heGRhdGEgPSAweGZmZmY7CiAJcy0+cmFuZ2VfdGFibGUgPSBwY2kyMDM0MV9yYW5nZXNbb3B0MF07CiAKLQlvcHRpb24gPSBzZHAtPnBjaTIwMzQxLnRpbWViYXNlIHwgUENJMjAzNDFfUkVQTU9ERTsJLyogZGVwZW5kcyBvbiBnYWluLCB0cmlnZ2VyLCByZXBldGl0aW9uIG1vZGUgKi8KKwkvKiBkZXBlbmRzIG9uIGdhaW4sIHRyaWdnZXIsIHJlcGV0aXRpb24gbW9kZSAqLworCW9wdGlvbiA9IHNkcC0+cGNpMjAzNDEudGltZWJhc2UgfCBQQ0kyMDM0MV9SRVBNT0RFOwogCi0Jd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CS8qIGluaXRpYWxpemUgTW9kdWxlICovCi0Jd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOwkvKiBzZXQgUGFjZXIgKi8KLQl3cml0ZWIob3B0aW9uLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX09QVF9SRUcpOwkvKiBvcHRpb24gcmVnaXN0ZXIgKi8KLQl3cml0ZWIoc2RwLT5wY2kyMDM0MS5zZXR0bGluZ190aW1lLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX1NFVF9USU1FX1JFRyk7CS8qIHNldHRsaW5nIHRpbWUgY291bnRlciAqLworCS8qIGluaXRpYWxpemUgTW9kdWxlICovCisJd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CisJLyogc2V0IFBhY2VyICovCisJd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOworCS8qIG9wdGlvbiByZWdpc3RlciAqLworCXdyaXRlYihvcHRpb24sIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfT1BUX1JFRyk7CisJLyogc2V0dGxpbmcgdGltZSBjb3VudGVyICovCisJd3JpdGViKHNkcC0+cGNpMjAzNDEuc2V0dGxpbmdfdGltZSwKKwkJc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TRVRfVElNRV9SRUcpOwogCS8qIHRyaWdnZXIgbm90IGltcGxlbWVudGVkICovCiAJcmV0dXJuIDA7CiB9CkBAIC00MjksMTEgKzQ0NiwxNSBAQAogCXVuc2lnbmVkIGludCBjbGI7CS8qIGNoYW5uZWwgbGlzdCBieXRlICovCiAJdW5zaWduZWQgaW50IGJvYXJkZGF0YTsKIAotCXdyaXRlYigxLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0xDSEFOX0FERFJfUkVHKTsJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJd3JpdGViKDEsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTENIQU5fQUREUl9SRUcpOwogCWNsYiA9IFBDSTIwMzQxX0RBSVNZX0NIQUlOIHwgUENJMjAzNDFfTVVYIHwgKHNkcC0+cGNpMjAzNDEuYWlfZ2FpbiA8PCAzKQogCSAgICB8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCXdyaXRlYihjbGIsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ0hBTl9MSVNUKTsKLQl3cml0ZWIoMHgwMCwgc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9DQ19SRVNFVCk7CS8qIHJlc2V0IHNldHRsaW5nIHRpbWUgY291bnRlciBhbmQgdHJpZ2dlciBkZWxheSBjb3VudGVyICovCisKKwkvKiByZXNldCBzZXR0bGluZyB0aW1lIGNvdW50ZXIgYW5kIHRyaWdnZXIgZGVsYXkgY291bnRlciAqLworCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NDX1JFU0VUKTsKKwogCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NIQU5fUkVTRVQpOwogCiAJLyogZ2VuZXJhdGUgUGFjZXIgKi8KQEAgLTQ0NCw5ICs0NjUsMTIgQEAKIAkJICogdGhlIHdob2xlIGludGVycnVwdCBzdHVmZgogCQkgKi8KIAkJaiA9IDA7Ci0JCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CS8qIGdlbmVyYXRlIFBhY2VyICovCisJCS8qIGdlbmVyYXRlIFBhY2VyICovCisJCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CisKIAkJZW9jID0gcmVhZGIoc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TVEFUVVNfUkVHKTsKLQkJd2hpbGUgKChlb2MgPCAweDgwKSAmJiBqIDwgMTAwKSB7CS8qIHBvbGwgSW50ZXJydXB0IEZsYWcgKi8KKwkJLyogcG9sbCBJbnRlcnJ1cHQgRmxhZyAqLworCQl3aGlsZSAoKGVvYyA8IDB4ODApICYmIGogPCAxMDApIHsKIAkJCWorKzsKIAkJCWVvYyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU1RBVFVTX1JFRyk7CiAJCX0KQEAgLTQ2MCw3ICs0ODQsOSBAQAogCQlsbyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEpOwogCQloaSA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEgKyAxKTsKIAkJYm9hcmRkYXRhID0gbG8gKyAweDEwMCAqIGhpOwotCQlkYXRhW2ldID0gKHNob3J0KSgoYm9hcmRkYXRhICsgMHg4MDAwKSAmIDB4ZmZmZik7CS8qIGJvYXJkLWRhdGEgLT4gY29tZWRpLWRhdGEgKi8KKworCQkvKiBib2FyZC1kYXRhIC0+IGNvbWVkaS1kYXRhICovCisJCWRhdGFbaV0gPSAoc2hvcnQpKChib2FyZGRhdGEgKyAweDgwMDApICYgMHhmZmZmKTsKIAl9CiAKIAlyZXR1cm4gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDhiMzgzZWUuLjVjNmM3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtNTQsNiArNTQsNyBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSlIzIDB4MTc2MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwgMHgzMTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVcgMHgxMTExCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTCAweDMxMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMIDB4MzExMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM180X0NIQU5ORUwgMHgzMTE0CkBAIC03Myw2ICs3NCw4IEBACiAJewogCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwsCiAJCSAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgeworCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXLAorCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMLAogCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMLApAQCAtODA3LDYgKzgxMCwxMCBAQAogCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVc6eworCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTDp7CiAJCQkJCWRldnByaXYtPm5fY2hhbm5lbHMgPSAyOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYwppbmRleCBiMGQ0NGI1Li5hOTYxMTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpb2NtZC5jCkBAIC02MiwxMSArNjIsMTAgQEAKIAl1bnNpZ25lZCBpbnB1dF9zZWxlY3RfYml0cyA9IDA7CiAKIAlpZiAoZW5hYmxlKSB7Ci0JCWlmIChyZWFkX25vdF93cml0ZSkgeworCQlpZiAocmVhZF9ub3Rfd3JpdGUpCiAJCQlpbnB1dF9zZWxlY3RfYml0cyB8PSBHaV9SZWFkX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWlucHV0X3NlbGVjdF9iaXRzIHw9IEdpX1dyaXRlX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0KIAl9CiAJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQlOSVRJT19HaV9JbnB1dF9TZWxlY3RfUmVnKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpLApAQCAtODQsOSArODMsOCBAQAogCQkJCWdpX2RtYV9jb25maWdfYml0cyB8PSBHaV9ETUFfRW5hYmxlX0JpdDsKIAkJCQlnaV9kbWFfY29uZmlnX2JpdHMgfD0gR2lfRE1BX0ludF9CaXQ7CiAJCQl9Ci0JCQlpZiAocmVhZF9ub3Rfd3JpdGUgPT0gMCkgeworCQkJaWYgKHJlYWRfbm90X3dyaXRlID09IDApCiAJCQkJZ2lfZG1hX2NvbmZpZ19iaXRzIHw9IEdpX0RNQV9Xcml0ZV9CaXQ7Ci0JCQl9CiAJCQluaV90aW9fc2V0X2JpdHMoY291bnRlciwKIAkJCQkJTklUSU9fR2lfRE1BX0NvbmZpZ19SZWcoY291bnRlci0+CiAJCQkJCQkJCWNvdW50ZXJfaW5kZXgpLApAQCAtMTc0LDcgKzE3Miw3IEBACiBzdGF0aWMgaW50IG5pX3Rpb19vdXRwdXRfY21kKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKIHsKLQlwcmludGsoIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKIAlyZXR1cm4gLUVOT1RTVVBQOwogCiAJY291bnRlci0+bWl0ZV9jaGFuLT5kaXIgPSBDT01FRElfT1VUUFVUOwpAQCAtMTk4LDkgKzE5Niw4IEBACiAJCXNldF9nYXRlX3NvdXJjZSA9IDE7CiAJCWdhdGVfc291cmNlID0gY21kLT5jb252ZXJ0X2FyZzsKIAl9Ci0JaWYgKHNldF9nYXRlX3NvdXJjZSkgeworCWlmIChzZXRfZ2F0ZV9zb3VyY2UpCiAJCXJldHZhbCA9IG5pX3Rpb19zZXRfZ2F0ZV9zcmMoY291bnRlciwgMCwgZ2F0ZV9zb3VyY2UpOwotCX0KIAlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKIAkJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQkJTklUSU9fR2lfSW50ZXJydXB0X0VuYWJsZV9SZWcoY291bnRlci0+CkBAIC0yMjEsMjIgKzIxOCwyMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKIAlpZiAoY291bnRlci0+bWl0ZV9jaGFuID09IE5VTEwpIHsKLQkJcHJpbnRrCi0JCSAgICAoIm5pX3RpbzogY29tbWFuZHMgb25seSBzdXBwb3J0ZWQgd2l0aCBETUEuICBJbnRlcnJ1cHQtZHJpdmVuIGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuaV90aW86IGNvbW1hbmRzIG9ubHkgc3VwcG9ydGVkIHdpdGggRE1BLiAgSW50ZXJydXB0LWRyaXZlbiBjb21tYW5kcyBub3QgeWV0IGltcGxlbWVudGVkLlxuIik7CiAJCXJldHZhbCA9IC1FSU87CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gbmlfdGlvX2NtZF9zZXR1cChjb3VudGVyLCBhc3luYyk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJaWYgKGNtZC0+ZmxhZ3MgJiBDTURGX1dSSVRFKSB7CisJCQlpZiAoY21kLT5mbGFncyAmIENNREZfV1JJVEUpCiAJCQkJcmV0dmFsID0gbmlfdGlvX291dHB1dF9jbWQoY291bnRlciwgYXN5bmMpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlyZXR2YWwgPSBuaV90aW9faW5wdXRfY21kKGNvdW50ZXIsIGFzeW5jKTsKLQkJCX0KIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jbWQpOwogCiBpbnQgbmlfdGlvX2NtZHRlc3Qoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CkBAIC0zNDIsNiArMzM4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZHRlc3QpOwogCiBpbnQgbmlfdGlvX2NhbmNlbChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlcikKIHsKQEAgLTM0OSw5ICszNDYsOCBAQAogCiAJbmlfdGlvX2FybShjb3VudGVyLCAwLCAwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCWlmIChjb3VudGVyLT5taXRlX2NoYW4pIHsKKwlpZiAoY291bnRlci0+bWl0ZV9jaGFuKQogCQltaXRlX2RtYV9kaXNhcm0oY291bnRlci0+bWl0ZV9jaGFuKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogCW5pX3Rpb19jb25maWd1cmVfZG1hKGNvdW50ZXIsIDAsIDApOwogCkBAIC0zNjEsMTAgKzM1NywxMSBAQAogCQkJMHgwKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jYW5jZWwpOwogCi0JLyogRHVyaW5nIGJ1ZmZlcmVkIGlucHV0IGNvdW50ZXIgb3BlcmF0aW9uIGZvciBlLXNlcmllcywgdGhlIGdhdGUgaW50ZXJydXB0IGlzIGFja2VkCi0JICAgYXV0b21hdGljYWxseSBieSB0aGUgZG1hIGNvbnRyb2xsZXIsIGR1ZSB0byB0aGUgR2lfUmVhZC9Xcml0ZV9BY2tub3dsZWRnZXNfSVJRIGJpdHMKLQkgICBpbiB0aGUgaW5wdXQgc2VsZWN0IHJlZ2lzdGVyLiAgKi8KKwkvKiBEdXJpbmcgYnVmZmVyZWQgaW5wdXQgY291bnRlciBvcGVyYXRpb24gZm9yIGUtc2VyaWVzLCB0aGUgZ2F0ZQorCSAgIGludGVycnVwdCBpcyBhY2tlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkbWEgY29udHJvbGxlciwgZHVlIHRvIHRoZQorCSAgIEdpX1JlYWQvV3JpdGVfQWNrbm93bGVkZ2VzX0lSUSBiaXRzIGluIHRoZSBpbnB1dCBzZWxlY3QgcmVnaXN0ZXIuICAqLwogc3RhdGljIGludCBzaG91bGRfYWNrX2dhdGUoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3Miw3ICszNjksMTAgQEAKIAogCXN3aXRjaCAoY291bnRlci0+Y291bnRlcl9kZXYtPnZhcmlhbnQpIHsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9tX3NlcmllczoKLQljYXNlIG5pX2dwY3RfdmFyaWFudF82NjB4OgkvKiAgbm90IHN1cmUgaWYgNjYweCByZWFsbHkgc3VwcG9ydHMgZ2F0ZSBpbnRlcnJ1cHRzICh0aGUgYml0cyBhcmUgbm90IGxpc3RlZCBpbiByZWdpc3Rlci1sZXZlbCBtYW51YWwpICovCisJLyogIG5vdCBzdXJlIGlmIDY2MHggcmVhbGx5IHN1cHBvcnRzIGdhdGUKKwkgICAgaW50ZXJydXB0cyAodGhlIGJpdHMgYXJlIG5vdCBsaXN0ZWQKKwkgICAgaW4gcmVnaXN0ZXItbGV2ZWwgbWFudWFsKSAqLworCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCXJldHVybiAxOwogCQlicmVhazsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9lX3NlcmllczoKQEAgLTQxNiw3ICs0MTYsOCBAQAogCWlmIChneHhfc3RhdHVzICYgR2lfR2F0ZV9FcnJvcl9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKIAkJYWNrIHw9IEdpX0dhdGVfRXJyb3JfQ29uZmlybV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCk7CiAJCWlmIChnYXRlX2Vycm9yKSB7Ci0JCQkvKjY2MHggZG9uJ3Qgc3VwcG9ydCBhdXRvbWF0aWMgYWNrbm93bGVkZ2VtZW50IG9mIGdhdGUgaW50ZXJydXB0IHZpYSBkbWEgcmVhZC93cml0ZQorCQkJLyo2NjB4IGRvbid0IHN1cHBvcnQgYXV0b21hdGljIGFja25vd2xlZGdlbWVudAorCQkJICBvZiBnYXRlIGludGVycnVwdCB2aWEgZG1hIHJlYWQvd3JpdGUKIAkJCSAgIGFuZCByZXBvcnQgYm9ndXMgZ2F0ZSBlcnJvcnMgKi8KIAkJCWlmIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCAhPQogCQkJICAgIG5pX2dwY3RfdmFyaWFudF82NjB4KSB7CkBAIC00MjksOSArNDMwLDggQEAKIAkJaWYgKHRjX2Vycm9yKQogCQkJKnRjX2Vycm9yID0gMTsKIAl9Ci0JaWYgKGdpX3N0YXR1cyAmIEdpX1RDX0JpdCkgeworCWlmIChnaV9zdGF0dXMgJiBHaV9UQ19CaXQpCiAJCWFjayB8PSBHaV9UQ19JbnRlcnJ1cHRfQWNrX0JpdDsKLQl9CiAJaWYgKGdpX3N0YXR1cyAmIEdpX0dhdGVfSW50ZXJydXB0X0JpdCkgewogCQlpZiAoc2hvdWxkX2Fja19nYXRlKGNvdW50ZXIpKQogCQkJYWNrIHw9IEdpX0dhdGVfSW50ZXJydXB0X0Fja19CaXQ7CkBAIC00NTIsMTMgKzQ1MiwxNCBAQAogCQkJCSAgTklUSU9fR3h4X0pvaW50X1N0YXR1czJfUmVnCiAJCQkJICAoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYKIAkJICAgIEdpX1Blcm1hbmVudF9TdGFsZV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKLQkJCXByaW50aygiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQlpZiAocGVybV9zdGFsZV9kYXRhKQogCQkJCSpwZXJtX3N0YWxlX2RhdGEgPSAxOwogCQl9CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2Fja25vd2xlZGdlX2FuZF9jb25maXJtKTsKIAogdm9pZCBuaV90aW9faGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCkBAIC00NzIsMjAgKzQ3MywxOSBAQAogCW5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybShjb3VudGVyLCAmZ2F0ZV9lcnJvciwgJnRjX2Vycm9yLAogCQkJCSAgICAgICAmcGVybV9zdGFsZV9kYXRhLCBOVUxMKTsKIAlpZiAoZ2F0ZV9lcnJvcikgewotCQlwcmludGsoIiVzOiBHaV9HYXRlX0Vycm9yIGRldGVjdGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfR2F0ZV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fZnVuY19fKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJfQotCWlmIChwZXJtX3N0YWxlX2RhdGEpIHsKKwlpZiAocGVybV9zdGFsZV9kYXRhKQogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKLQl9CiAJc3dpdGNoIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCkgewogCWNhc2UgbmlfZ3BjdF92YXJpYW50X21fc2VyaWVzOgogCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCWlmIChyZWFkX3JlZ2lzdGVyKGNvdW50ZXIsCi0JCQkJICBOSVRJT19HaV9ETUFfU3RhdHVzX1JlZwotCQkJCSAgKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpKSAmIEdpX0RSUV9FcnJvcl9CaXQpCi0JCXsKLQkJCXByaW50aygiJXM6IEdpX0RSUV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJTklUSU9fR2lfRE1BX1N0YXR1c19SZWcKKwkJCQkoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYgR2lfRFJRX0Vycm9yX0JpdCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfRFJRX0Vycm9yIGRldGVjdGVkLlxuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJfQogCQlicmVhazsKQEAgLTUwNiw2ICs1MDYsNyBAQAogCW1pdGVfc3luY19pbnB1dF9kbWEoY291bnRlci0+bWl0ZV9jaGFuLCBzLT5hc3luYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQpOwogCiB2b2lkIG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCkBAIC01MTYsNiArNTE3LDcgQEAKIAljb3VudGVyLT5taXRlX2NoYW4gPSBtaXRlX2NoYW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX3NldF9taXRlX2NoYW5uZWwpOwogCiBzdGF0aWMgaW50IF9faW5pdCBuaV90aW9jbWRfaW5pdF9tb2R1bGUodm9pZCkKIHsKQEAgLTUyOSwxMCArNTMxLDMgQEAKIH0KIAogbW9kdWxlX2V4aXQobmlfdGlvY21kX2NsZWFudXBfbW9kdWxlKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY21kdGVzdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY2FuY2VsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19oYW5kbGVfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggNjBlYmZjMy4uYWE4YWVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAlpbnQgcmV0OwotCXJlc291cmNlX3NpemVfdCBwaHlzTGFzMDsJLyogY29uZmlndWF0aW9uICovCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMwOwkvKiBjb25maWd1cmF0aW9uICovCiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMxOwkvKiBkYXRhIGFyZWEgKi8KIAlyZXNvdXJjZV9zaXplX3QgcGh5c0xjZmc7CS8qIFBMWDkwODAgKi8KICNpZmRlZiBVU0VfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwppbmRleCAzNjA3YWFlLi4yYjM0ZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogfTsKIAogc3RydWN0IGNvdW50ZXJfbW9kZV9yZWdpc3Rlcl90IHsKLSNpZiBkZWZpbmVkIChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJdW5zaWduZWQgc2hvcnQgY291dFNvdXJjZToxOwogCXVuc2lnbmVkIHNob3J0IGNvdXRQb2xhcml0eToxOwogCXVuc2lnbmVkIHNob3J0IGF1dG9Mb2FkUmVzZXRSY2FwOjM7CkBAIC0yMDcsNyArMjA3LDkgQEAKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKICAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCi0gICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2UKKyAgIHN0cnVjdC4KKyovCiBzdHJ1Y3QgczUyNl9wcml2YXRlIHsKIAogCWludCBkYXRhOwpAQCAtMzA0LDcgKzMwNiw3IEBACiAvKiBpbnQgc3ViZGV2X2NoYW5uZWwgPSAwOyAqLwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0JcHJpbnRrKCJjb21lZGklZDogczUyNjogIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6ICIsIGRldi0+bWlub3IpOwogCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CiAJaWYgKCFpb2Jhc2UgfHwgIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgUzUyNl9JT1NJWkUsIHRoaXNib2FyZC0+bmFtZSkpIHsKQEAgLTMxNyw3ICszMTksOCBAQAogCiAJLyoqKiBtYWtlIGl0IGEgbGl0dGxlIHF1aWV0ZXIsIGV4dywgOC8yOS8wNgogCWZvciAoaSA9IDA7IGkgPCBTNTI2X05VTV9QT1JUUzsgaSsrKSB7Ci0JCXByaW50aygiMHglMDJ4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKKwkJcHJpbnRrKCIweCUwMng6IDB4JTA0eFxuIiwgQUREUl9SRUcoczUyNl9wb3J0c1tpXSksCisJCQkJaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CiAJfQogCSoqKi8KIApAQCAtNDAyLDcgKzQwNSw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoZWRcbiIpOwogCiAJcmV0dXJuIDE7CiAKQEAgLTQxMSw3ICs0MTQsNyBAQAogCS8qIE9uZS1zaG90IChzb2Z0d2FyZSB0cmlnZ2VyKSAqLwogCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJY21SZWcucmVnLmNvdXRQb2xhcml0eSA9IDE7CS8qICBQb2xhcml0eSBpbnZlcnRlZCAqLwotCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDE7CS8qICBBdXRvIGxvYWQgMDpkaXNhYmxlZCwgMTplbmFibGVkICovCisJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMTsvKiAgQXV0byBsb2FkIDA6ZGlzYWJsZWQsIDE6ZW5hYmxlZCAqLwogCWNtUmVnLnJlZy5od0N0RW5hYmxlU291cmNlID0gMzsJLyogIE5PVCBSQ0FQICovCiAJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCWNtUmVnLnJlZy5jbG9ja1NvdXJjZSA9IDI7CS8qICBJbnRlcm5hbCAqLwpAQCAtNDI2LDEwICs0MjksMTIgQEAKIAlvdXR3KDB4MDAwMSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILCBzdWJkZXZfY2hhbm5lbCkpOwogCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgKi8KLQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLwotCi0Jb3V0dygweDAwMDgsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CisJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZWxzZQogCkBAIC00NDcsMTEgKzQ1MiwxMiBAQAogCWNtUmVnLnJlZy5yZXNlcnZlZCA9IDA7CiAKIAluID0gMDsKLQlwcmludGsoIk1vZGUgcmVnPTB4JTA0eCwgMHglMDRseFxuIiwgY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwKLQkJCQkJCQkJCW4pKTsKKwlwcmludGsoS0VSTl9JTkZPICJNb2RlIHJlZz0weCUwNHgsIDB4JTA0bHhcbiIsCisJCWNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAlvdXR3KGNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAl1ZGVsYXkoMTAwMCk7Ci0JcHJpbnRrKCJSZWFkIGJhY2sgbW9kZSByZWc9MHglMDR4XG4iLCBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBuKSkpOworCXByaW50ayhLRVJOX0lORk8gIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsCisJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKIAkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgaGlnaCB3b3JkICovCiAvKiB2YWx1ZSA9IChzaG9ydCkgKDB4NTUpOyAqLwpAQCAtNDY2LDIwICs0NzIsMjMgQEAKIAogCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJaWYgKGNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9PSAwKSB7Ci0JCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsKKwkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgbikpOwogCX0KIAogCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgbikpOwogCXVkZWxheSgxMDAwKTsKLQlwcmludGsoIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsIGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZCBiYWNrIG1vZGUgcmVnPTB4JTA0eFxuIiwKKwkJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKICNlbmRpZgotCXByaW50aygiQ3VycmVudCByZWdpc3RyZXM6XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJDdXJyZW50IHJlZ2lzdHJlczpcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFM1MjZfTlVNX1BPUlRTOyBpKyspIHsKLQkJcHJpbnRrKCIweCUwMmx4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLAotCQkgICAgICAgaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CisJCXByaW50ayhLRVJOX0lORk8gIjB4JTAybHg6IDB4JTA0eFxuIiwKKwkJCUFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC00OTQsNyArNTAzLDcgQEAKICAqLwogc3RhdGljIGludCBzNTI2X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5pb2Jhc2UgPiAwKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgUzUyNl9JT1NJWkUpOwpAQCAtNTEzLDcgKzUyMiw3IEBACiAKIAkvKiAgQ2hlY2sgaWYgKG4gPiAwKSAqLwogCWlmIChpbnNuLT5uIDw9IDApIHsKLQkJcHJpbnRrKCJzNTI2OiBJTlNOX1JFQUQ6IG4gc2hvdWxkIGJlID4gMFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9SRUFEOiBuIHNob3VsZCBiZSA+IDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogIFJlYWQgdGhlIGxvdyB3b3JkIGZpcnN0ICovCkBAIC01MjIsNyArNTMxLDggQEAKIAkJZGF0YWhpZ2ggPSBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBILCBjb3VudGVyX2NoYW5uZWwpKTsKIAkJZGF0YVtpXSA9IChpbnQpKGRhdGFoaWdoICYgMHgwMEZGKTsKIAkJZGF0YVtpXSA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhbG93ICYgMHhGRkZGKTsKLS8qIHByaW50aygiczUyNiBHUENUWyVkXTogJXgoMHglMDR4LCAweCUwNHgpXG4iLCBjb3VudGVyX2NoYW5uZWwsIGRhdGFbaV0sIGRhdGFoaWdoLCBkYXRhbG93KTsgKi8KKwkJLyogcHJpbnRrKCJzNTI2IEdQQ1RbJWRdOiAleCgweCUwNHgsIDB4JTA0eClcbiIsCisJCSAgIGNvdW50ZXJfY2hhbm5lbCwgZGF0YVtpXSwgZGF0YWhpZ2gsIGRhdGFsb3cpOyAqLwogCX0KIAlyZXR1cm4gaTsKIH0KQEAgLTUzNiw3ICs1NDYsOCBAQAogCXNob3J0IHZhbHVlOwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0vKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsIHN1YmRldl9jaGFubmVsKTsgKi8KKwkvKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsCisJCQkJCQlzdWJkZXZfY2hhbm5lbCk7ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0dQQ1RfQ09ORklHX0RBVEE7IGkrKykgewogCQlkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5kYXRhW2ldID0KQEAgLTU1NCw3ICs1NjUsNyBAQAogCQkgICBkYXRhWzJdOiBQcmUtbG9hZCBSZWdpc3RlciBWYWx1ZQogCQkgICBkYXRhWzNdOiBDb250ZXIgQ29udHJvbCBSZWdpc3RlcgogCQkgKi8KLQkJcHJpbnRrKCJzNTI2OiBHUENUX0lOU05fQ09ORklHOiBDb25maWd1cmluZyBFbmNvZGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX0NPTkZJRzogQ29uZmlndXJpbmcgRW5jb2RlclxuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQb3NpdGlvbk1lYXN1cmVtZW50OwogCkBAIC01NjMsNyArNTc0LDcgQEAKIAkJLyogT25lLXNob3QgKHNvZnR3YXJlIHRyaWdnZXIpICovCiAJCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJCWNtUmVnLnJlZy5jb3V0UG9sYXJpdHkgPSAxOwkvKiAgUG9sYXJpdHkgaW52ZXJ0ZWQgKi8KLQkJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMDsJLyogIEF1dG8gbG9hZCBkaXNhYmxlZCAqLworCQljbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPSAwOy8qICBBdXRvIGxvYWQgZGlzYWJsZWQgKi8KIAkJY21SZWcucmVnLmh3Q3RFbmFibGVTb3VyY2UgPSAzOwkvKiAgTk9UIFJDQVAgKi8KIAkJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCQljbVJlZy5yZWcuY2xvY2tTb3VyY2UgPSAyOwkvKiAgSW50ZXJuYWwgKi8KQEAgLTU3OCwxMCArNTg5LDEzIEBACiAJCW91dHcoMHgwMDAxLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsIHN1YmRldl9jaGFubmVsKSk7CiAJCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBMb2FkIHRoZSBjb3VudGVyIGZyb20gUFIwICovCisJCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCi0JCW91dHcoMHgwMDA4LCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwkJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCQlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZW5kaWYKIApAQCAtNTk0LDMwICs2MDgsMzQgQEAKIAogCQkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgaWYgaXQgaXMgc29mdHdhcmUgcHJlbG9hZCAqLwogCQlpZiAoY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID09IDApIHsKLQkJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCB0aGUgY291bnRlciAqLwotLyogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsgICAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMAorCQkJICogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsKKwkJCSAqLwogCQl9CiAjZWxzZQotCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsJLyogIDAgcXVhZHJhdHVyZSwgMSBzb2Z0d2FyZSBjb250cm9sICovCisJCS8qICAwIHF1YWRyYXR1cmUsIDEgc29mdHdhcmUgY29udHJvbCAqLworCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsKIAogCQkvKiAgZGF0YVsxXSBjb250YWlucyBHUENUX1gxLCBHUENUX1gyIG9yIEdQQ1RfWDQgKi8KLQkJaWYgKGluc24tPmRhdGFbMV0gPT0gR1BDVF9YMikgeworCQlpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1gyKQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMTsKLQkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzFdID09IEdQQ1RfWDQpIHsKKwkJZWxzZSBpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1g0KQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMjsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMDsKLQkJfQogCiAJCS8qICBXaGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBpbmRleHB1bHNlOiAqLwotCQlpZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKKwkJLyppZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUxvd0hpZ2gpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hIaWdoKSB7Ci0JCX0KKwkJfSovCiAJCS8qICBUYWtlIGludG8gYWNjb3VudCB0aGUgaW5kZXggcHVsc2U/ICovCiAJCWlmIChpbnNuLT5kYXRhWzNdID09IEdQQ1RfUkVTRVRfQ09VTlRFUl9PTl9JTkRFWCkKLQkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CiAKIAkJLyogIFNldCBDb3VudGVyIE1vZGUgUmVnaXN0ZXIgKi8KIAkJY21SZWcudmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbMV0gJiAweEZGRkYpOwpAQCAtNjM4LDggKzY1NiwxMCBAQAogCQl9CiAJCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJCWlmIChjbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPT0gMCkgewotCQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CiAJCX0KICNlbmRpZgogCQlicmVhazsKQEAgLTY1Miw3ICs2NzIsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBTaW5nbGVQdWxzZUdlbmVyYXRpb247CiAKQEAgLTY5Nyw3ICs3MTcsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQdWxzZVRyYWluR2VuZXJhdGlvbjsKIApAQCAtNzM1LDcgKzc1NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTc1MSwyMCArNzcxLDIxIEBACiAJc2hvcnQgdmFsdWU7CiAJdW5pb24gY21SZWcgY21SZWc7CiAKLQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9XUklURSBvbiBjaGFubmVsICVkXG4iLCBzdWJkZXZfY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX1dSSVRFIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkJCXN1YmRldl9jaGFubmVsKTsKIAljbVJlZy52YWx1ZSA9IGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIHN1YmRldl9jaGFubmVsKSk7Ci0JcHJpbnRrKCJzNTI2OiBDb3VudGVyIE1vZGUgUmVnaXN0ZXI6ICV4XG4iLCBjbVJlZy52YWx1ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogQ291bnRlciBNb2RlIFJlZ2lzdGVyOiAleFxuIiwgY21SZWcudmFsdWUpOwogCS8qICBDaGVjayB3aGF0IEFwcGxpY2F0aW9uIG9mIENvdW50ZXIgdGhpcyBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgZm9yICovCiAJc3dpdGNoIChkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5hcHApIHsKIAljYXNlIFBvc2l0aW9uTWVhc3VyZW1lbnQ6Ci0JCXByaW50aygiUzUyNjogSU5TTl9XUklURTogUE1cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQTVxuIik7CiAJCW91dHcoMHhGRkZGICYgKCgqZGF0YSkgPj4gMTYpLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsCiAJCQkJCQkJICAgICBzdWJkZXZfY2hhbm5lbCkpOwogCQlvdXR3KDB4RkZGRiAmICgqZGF0YSksIEFERFJfQ0hBTl9SRUcoUkVHX0MwTCwgc3ViZGV2X2NoYW5uZWwpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNpbmdsZVB1bHNlR2VuZXJhdGlvbjoKLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOwogCQlvdXR3KDB4RkZGRiAmICgoKmRhdGEpID4+IDE2KSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILAogCQkJCQkJCSAgICAgc3ViZGV2X2NoYW5uZWwpKTsKIAkJb3V0dygweEZGRkYgJiAoKmRhdGEpLCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CkBAIC03NzcsMTQgKzc5OCwxNCBAQAogCQkgICBUaGUgYWJvdmUgcGVyaW9kcyBtdXN0IGJlIGV4cHJlc3NlZCBhcyBhIG11bHRpcGxlIG9mIHRoZQogCQkgICBwdWxzZSBmcmVxdWVuY3kgb24gdGhlIHNlbGVjdGVkIHNvdXJjZQogCQkgKi8KLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOwogCQlpZiAoKGluc24tPmRhdGFbMV0gPiBpbnNuLT5kYXRhWzBdKSAmJiAoaW5zbi0+ZGF0YVswXSA+IDApKSB7CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMF0gPQogCQkJICAgIGluc24tPmRhdGFbMF07CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMV0gPQogCQkJICAgIGluc24tPmRhdGFbMV07CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoInM1MjY6IElOU05fV1JJVEU6IFBURzogUHJvYmxlbSB3aXRoIFB1bHNlIHBhcmFtcyAtPiAlZCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9XUklURTogUFRHOiBQcm9ibGVtIHdpdGggUHVsc2UgcGFyYW1zIC0+ICVkICVkXG4iLAogCQkJCWluc24tPmRhdGFbMF0sIGluc24tPmRhdGFbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg3Myw3ICs4OTQsNyBAQAogCQlpZiAoaSA9PSBUSU1FT1VUKSB7CiAJCQkvKiBwcmludGsoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHByaW50aygpCiAJCQkgKiB3aGVuZXZlciB0aGUgY29kZSBjYW4gYmUgY2FsbGVkIGZyb20gcmVhbC10aW1lLiAqLwotCQkJcHJpbnRrKCJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAogCQkJICAgICAgIGludyhBRERSX1JFRyhSRUdfSVNSKSkpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KQEAgLTkwNiwxMSArOTI3LDE0IEBACiAJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLwotLyogb3V0dyhkYXRhW2ldLCBkZXYtPmlvYmFzZSArIFJFR19BREQpOyAgICB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyICovCi0JCW91dHcoZGF0YVtpXSwgQUREUl9SRUcoUkVHX0FERCkpOwkvKiAgd3JpdGUgdGhlIGRhdGEgdG8gcHJlbG9hZCByZWdpc3RlciAqLworCQkvKiB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyCisJCSAqIG91dHcoZGF0YVtpXSwgZGV2LT5pb2Jhc2UgKyBSRUdfQUREKTsKKwkJICovCisJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHByZWxvYWQgcmVnaXN0ZXIgKi8KKwkJb3V0dyhkYXRhW2ldLCBBRERSX1JFRyhSRUdfQUREKSk7CiAJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKIC8qIG91dHcodmFsICsgMSwgZGV2LT5pb2Jhc2UgKyBSRUdfREFDKTsgIHN0YXJ0cyB0aGUgRC9BIGNvbnZlcnNpb24uICovCi0JCW91dHcodmFsICsgMSwgQUREUl9SRUcoUkVHX0RBQykpOwkvKiAgc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4gKi8KKwkJb3V0dyh2YWwgKyAxLCBBRERSX1JFRyhSRUdfREFDKSk7IC8qc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4qLwogCX0KIAogCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCkBAIC05NTQsNyArOTc4LDcgQEAKIAogCS8qIG9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0YWwKIAkgKiBpbnB1dCBhbmQgb3V0cHV0IGxpbmVzLiAqLwotCWRhdGFbMV0gPSBpbncoQUREUl9SRUcoUkVHX0RJTykpICYgMHhGRjsJLyogIGxvdyA4IGJpdHMgYXJlIHRoZSBkYXRhICovCisJZGF0YVsxXSA9IGludyhBRERSX1JFRyhSRUdfRElPKSkgJiAweEZGOyAvKiBsb3cgOCBiaXRzIGFyZSB0aGUgZGF0YSAqLwogCS8qIG9yIHdlIGNvdWxkIGp1c3QgcmV0dXJuIHRoZSBzb2Z0d2FyZSBjb3B5IG9mIHRoZSBvdXRwdXQgdmFsdWVzIGlmCiAJICogaXQgd2FzIGEgcHVyZWx5IGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSAqLwogCS8qIGRhdGFbMV09cy0+c3RhdGUgJiAweEZGOyAqLwpAQCAtOTY5LDcgKzk5Myw3IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgZ3JvdXAsIG1hc2s7CiAKLQlwcmludGsoIlM1MjYgRElPIGluc25fY29uZmlnXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJTNTI2IERJTyBpbnNuX2NvbmZpZ1xuIik7CiAKIAkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKIAkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCkBAIC05ODAsMTEgKzEwMDQsMTIgQEAKIAltYXNrID0gMHhGIDw8IChncm91cCA8PCAyKTsKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6Ci0JCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOyAgLy8gYml0IDEwLzExIHNldCB0aGUgZ3JvdXAgMS8yJ3MgbW9kZQorCQkvKiBiaXQgMTAvMTEgc2V0IHRoZSBncm91cCAxLzIncyBtb2RlICovCisJCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOwogCQlzLT5pb19iaXRzIHw9IG1hc2s7CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgotCQlzLT5zdGF0ZSAmPSB+KDEgPDwgKGdyb3VwICsgMTApKTsvLyAxIGlzIG91dHB1dCwgMCBpcyBpbnB1dC4KKwkJcy0+c3RhdGUgJj0gfigxIDw8IChncm91cCArIDEwKSk7IC8qIDEgaXMgb3V0cHV0LCAwIGlzIGlucHV0LiAqLwogCQlzLT5pb19iaXRzICY9IH5tYXNrOwogCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCBkZTc4NGZmLi42OTZlZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0yMzk4LDcgKzIzOTgsNyBAQAogCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOwogCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKIAkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKLQkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZHV4IGNvbW1hbmRzXG4iKTsKIAkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKIAkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjb25maWcgVE9VQ0hTQ1JFRU5fQ0xFQVJQQURfVE0xMjE3CisJdHJpc3RhdGUgIlN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTciCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlkZXBlbmRzIG9uIElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTcgQ29udHJvbGxlcgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbGVhcnBhZF90bTEyMTcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNsZWFycGFkX3RtMTIxNy5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzOTIyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPCkBAIC0wLDAgKzEsNSBAQAorLSBXYWl0IGZvciB0aGUgb2ZmaWNpYWwgdXBzdHJlYW0gZ2VuZXJhbCBjbGVhcnBhZCBkcml2ZXJzIGFzIHByb21pc2VkIG92ZXIKKyAgdGhlIHBhc3QgZmV3IG1vbnRocworLSBNZXJnZSBhbnkgZGV2aWNlIHN1cHBvcnQgbmVlZGVkIGZyb20gdGhpcyBkcml2ZXIgaW50byBpdAorLSBEZWxldGUgdGhpcyBkcml2ZXIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTRiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvY2xlYXJwYWRfdG0xMjE3LmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qCisgKiBjbGVhcnBhZF90bTEyMTcuYyAtIFRvdWNoIFNjcmVlbiBkcml2ZXIgZm9yIFN5bmFwdGljcyBDbGVhcnBhZAorICogVE0xMjE3IGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycAorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWZub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBRdWVzdGlvbnMvQ29tbWVudHMvQnVnIGZpeGVzIHRvIFJhbWVzaCBBZ2Fyd2FsIChyYW1lc2guYWdhcndhbEBpbnRlbC5jb20pCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjcF90bTEyMTcuaCIKKworI2RlZmluZSBDUFRNMTIxN19ERVZJQ0VfTkFNRQkJImNwdG0xMjE3IgorI2RlZmluZSBDUFRNMTIxN19EUklWRVJfTkFNRQkJQ1BUTTEyMTdfREVWSUNFX05BTUUKKworI2RlZmluZSBNQVhfVE9VQ0hfU1VQUE9SVEVECQkyCisjZGVmaW5lIFRPVUNIX1NVUFBPUlRFRAkJCTEKKyNkZWZpbmUgU0FNUExJTkdfRlJFUQkJCTgwCS8qIEZyZXF1ZW5jeSBpbiBIWiAqLworI2RlZmluZSBERUxBWV9CVFdJTl9TQU1QTEUJCSgxMDAwIC8gU0FNUExJTkdfRlJFUSkKKyNkZWZpbmUgV0FJVF9GT1JfUkVTUE9OU0UJCTUJLyogNW1zZWMganVzdCB3b3JrcyAqLworI2RlZmluZSBNQVhfUkVUUklFUwkJCTUJLyogQXMgYWJvdmUgKi8KKyNkZWZpbmUgSU5DUkVNRU5UQUxfREVMQVkJCTUJLyogQXMgYWJvdmUgKi8KKworLyogUmVnc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBUTUExMjE3X0RFVl9TVEFUVVMJCTB4MTMJLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSBUTUExMjE3X0lOVF9TVEFUVVMJCTB4MTQJLyogSW50ZXJydXB0IFN0YXR1cyAqLworCisvKiBDb250cm9sbGVyIGNhbiBkZXRlY3QgdXB0byAyIHBvc3NpYmxlIGZpbmdlciB0b3VjaGVzLgorICogRWFjaCBmaW5nZXIgdG91Y2ggcHJvdmlkZXMgIDEyIGJpdCBYIFkgY28tb3JkaW5hdGVzLCB0aGUgdmFsdWVzIGFyZSBzcGxpdAorICogYWNyb3NzIDIgcmVnaXN0ZXJzLCBhbmQgYW4gOCBiaXQgIFogdmFsdWUgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVJfU1RBVEUJCTB4MTggLyogRmluZ2VyIFN0YXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjgJMHgxOSAvKiBIaWdoZXIgOCBiaXQgb2YgWCBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9ZX0hJR0hFUjgJMHgxQSAvKiBIaWdoZXIgOCBiaXQgb2YgWSBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YWV9MT1dFUjQJMHgxQiAvKiBMb3dlciA0IGJpdHMgb2YgWCBhbmQgWSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjFfWl9WQUxVRQkJMHgxRCAvKiA4IGJpdCBaIHZhbHVlIGZvciBmaW5nZXIgMSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWF9ISUdIRVI4CTB4MUUgLyogSGlnaGVyIDggYml0IG9mIFggY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWV9ISUdIRVI4CTB4MUYgLyogSGlnaGVyIDggYml0IG9mIFkgY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWFlfTE9XRVI0CTB4MjAgLyogTG93ZXIgNCBiaXRzIG9mIFggYW5kIFkgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVIyX1pfVkFMVUUJCTB4MjIgLyogOCBiaXQgWiB2YWx1ZSBmb3IgZmluZ2VyIDIgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ1RSTAkJMHgyMyAvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBUTUExMjE3X0lOVEVSUlVQVF9FTkFCTEUJMHgyNCAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFRNQTEyMTdfUkVQT1JUX01PREUJCTB4MkIgLyogUmVwb3J0aW5nIE1vZGUgKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9MT1dFUjgJCTB4MzEgLyogQml0IDAtNyBmb3IgTWF4IFggKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9ISUdIRVI0CQkweDMyIC8qIEJpdCA4LTExIGZvciBNYXggWCAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0xPV0VSOAkJMHgzMyAvKiBCaXQgMC03IGZvciBNYXggWSAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0hJR0hFUjQJCTB4MzQgLyogQml0IDgtMTEgZm9yIE1heCBZICovCisjZGVmaW5lIFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVAkweDY3IC8qIERldmljZSBDTUQgcmVnIGZvciByZXNldCAqLworI2RlZmluZSBUTUExMjE3X0RFVklDRV9DTURfUkVaRVJPCTB4NjkgLyogRGV2aWNlIENNRCByZWcgZm9yIHJlemVybyAqLworCisjZGVmaW5lIFRNQTEyMTdfTUFOVUZBQ1RVUkVSX0lECQkweDczIC8qIE1hbnVmYWN0dXJlciBJZCAqLworI2RlZmluZSBUTUExMjE3X1BST0RVQ1RfRkFNSUxZCQkweDc1IC8qIFByb2R1Y3QgRmFtaWx5ICovCisjZGVmaW5lIFRNQTEyMTdfRklSTVdBUkVfUkVWSVNJT04JMHg3NiAvKiBGaXJtd2FyZSBSZXZpc2lvbiAqLworI2RlZmluZSBUTUExMjE3X1NFUklBTF9OT19ISUdICQkweDdDIC8qIEJpdCA4LTE1IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfU0VSSUFMX05PX0xPVwkJMHg3RCAvKiBCaXQgMC03IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfUFJPRFVDVF9JRF9TVEFSVAkweDdFIC8qIFN0YXJ0IGFkZHJlc3MgZm9yIDEwIGJ5dGUgSUQgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ0FQQUJJTElUWQkweDhCIC8qIFJlcG9ydGluZyBjYXBhYmlsaXR5ICovCisKKworLyoKKyAqIFRoZSB0b3VjaCBwb3NpdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB0b3VjaF9zdGF0ZSB7CisJaW50CXg7CisJaW50CXk7CisJYm9vbCBidXR0b247Cit9OworCisvKiBEZXZpY2UgU3BlY2lmaWMgaW5mbyBnaXZlbiBieSB0aGUgY29udHJvbGxlciAqLworc3RydWN0IGNwX2Rldl9pbmZvIHsKKwl1MTYJbWF4WDsKKwl1MTYJbWF4WTsKK307CisKKy8qIFZlbmRvciByZWxhdGVkIGluZm8gZ2l2ZW4gYnkgdGhlIGNvbnRyb2xsZXIgKi8KK3N0cnVjdCBjcF92ZW5kb3JfaW5mbyB7CisJdTgJdmVuZG9yX2lkOworCXU4CXByb2R1Y3RfZmFtaWx5OworCXU4CWZpcm13YXJlX3JldjsKKwl1MTYJc2VyaWFsX25vOworfTsKKworLyoKKyAqIFByaXZhdGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkZXZpY2UgZGV0YWlscworICovCitzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSB7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBjcF92ZW5kb3JfaW5mbwl2aW5mbzsKKwlzdHJ1Y3QgY3BfZGV2X2luZm8JZGluZm87CisJc3RydWN0IGlucHV0X2Rldl9pbmZvIHsKKwkJY2hhcgkJCXBoeXNbMzJdOworCQljaGFyCQkJbmFtZVsxMjhdOworCQlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKKwkJc3RydWN0IHRvdWNoX3N0YXRlCXRvdWNoOworCX0gY3BfaW5wdXRfaW5mb1tNQVhfVE9VQ0hfU1VQUE9SVEVEXTsKKworCWludAl0aHJlYWRfcnVubmluZzsKKwlzdHJ1Y3QgbXV0ZXgJdGhyZWFkX211dGV4OworCisJaW50IGdwaW87Cit9OworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9uIHRoZSBkZXZpY2UKKyAqIGFzIHBlciB0aGUgUk1JIHByb3JvY29sLiBUZWNobmljYWxseSwgYSBwYWdlIHNlbGVjdCBzaG91bGQgYmUgd3JpdHRlbgorICogYmVmb3JlIGRvaW5nIHJlYWQvd3JpdGUgYnV0IHNpbmNlIHRoZSByZWdpc3RlciBvZmZzZXRzIGFyZSBiZWxvdyAweEZGCisgKiB3ZSBjYW4gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHBhZ2Ugd2hpY2ggaXMgMHgwMAorICovCitzdGF0aWMgaW50IGNwX3RtMTIxN19yZWFkKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cywKKwkJCQl1OCAqcmVxLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSwgcmV0dmFsOworCisJLyogU2VuZCB0aGUgYWRkcmVzcyAqLworCXJldHZhbCA9IGkyY19tYXN0ZXJfc2VuZCh0cy0+Y2xpZW50LCAmcmVxWzBdLCAxKTsKKwlpZiAocmV0dmFsICE9IDEpIHsKKwkJZGV2X2Vycih0cy0+ZGV2LCAiY3BfdG0xMjE3OiBJMkMgc2VuZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltc2xlZXAoV0FJVF9GT1JfUkVTUE9OU0UpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVUUklFUzsgaSsrKSB7CisJCXJldHZhbCA9IGkyY19tYXN0ZXJfcmVjdih0cy0+Y2xpZW50LCAmcmVxWzFdLCBzaXplKTsKKwkJaWYgKHJldHZhbCA9PSBzaXplKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1zbGVlcChJTkNSRU1FTlRBTF9ERUxBWSk7CisJCQlkZXZfZGJnKHRzLT5kZXYsICJjcF90bTEyMTc6IFJldHJ5IGNvdW50IGlzICVkXG4iLCBpKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsICE9IHNpemUpCisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVhZCBmcm9tIGRldmljZSBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfd3JpdGUoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzLAorCQkJCXU4ICpyZXEsIGludCBzaXplKQoreworCWludCByZXR2YWw7CisKKwkvKiBTZW5kIHRoZSBhZGRyZXNzIGFuZCB0aGUgZGF0YSB0byBiZSB3cml0dGVuICovCisJcmV0dmFsID0gaTJjX21hc3Rlcl9zZW5kKHRzLT5jbGllbnQsICZyZXFbMF0sIHNpemUgKyAxKTsKKwlpZiAocmV0dmFsICE9IHNpemUgKyAxKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogSTJDIHdyaXRlICBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuIFRCRCB3aHkgdGhpcyBpcyByZXF1aXJlZCAqLworCW1zbGVlcChXQUlUX0ZPUl9SRVNQT05TRSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfbWFza19pbnRlcnJ1cHQoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCXU4IHJlcVsyXTsKKwlpbnQgcmV0dmFsOworCisJcmVxWzBdID0gVE1BMTIxN19JTlRFUlJVUFRfRU5BQkxFOworCXJlcVsxXSA9IDB4MDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisJaWYgKHJldHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCXJlcVswXSA9IFRNQTEyMTdfSU5URVJSVVBUX0VOQUJMRTsKKwlyZXFbMV0gPSAweGE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190b3VjaChzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSAqdHMsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbnB1dF9kZXZfaW5mbyAqaW5wdXRfaW5mbyA9CisJCShzdHJ1Y3QgaW5wdXRfZGV2X2luZm8gKikmdHMtPmNwX2lucHV0X2luZm9baW5kZXhdOworCXU4IHh5X2RhdGFbNl07CisKKwlpZiAoaW5kZXggPT0gMCkKKwkJeHlfZGF0YVswXSA9IFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjg7CisJZWxzZQorCQl4eV9kYXRhWzBdID0gVE1BMTIxN19GSU5HRVIyX1hfSElHSEVSODsKKworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCB4eV9kYXRhLCA1KTsKKwlpZiAocmV0dmFsIDwgNSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IFhZIHJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vdGU6IEN1cnJlbnRseSBub3QgdXNpbmcgdGhlIFogdmFsdWVzIGJ1dCBtYXkgYmUgcmVxdXJpZWQgaW4KKwkgICB0aGUgZnV0dXJlLiAqLworCWlucHV0X2luZm8tPnRvdWNoLnggPSAoeHlfZGF0YVsxXSA8PCA0KQorCQkJCQl8ICh4eV9kYXRhWzNdICYgMHgwRik7CisJaW5wdXRfaW5mby0+dG91Y2gueSA9ICh4eV9kYXRhWzJdIDw8IDQpCisJCQkJCXwgKCh4eV9kYXRhWzNdICYgMHhGMCkgPj4gNCk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pbmZvLT5pbnB1dCwgQUJTX1gsIGlucHV0X2luZm8tPnRvdWNoLngpOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaW5mby0+aW5wdXQsIEFCU19ZLCBpbnB1dF9pbmZvLT50b3VjaC55KTsKKwlpbnB1dF9zeW5jKGlucHV0X2luZm8tPmlucHV0KTsKK30KKworc3RhdGljIHZvaWQgY3BfdG0xMjE3X2dldF9kYXRhKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbCwgaSwgZmluZ2VyX3RvdWNoZWQgPSAwOworCisJZG8geworCQlyZXFbMF0gPSBUTUExMjE3X0ZJTkdFUl9TVEFURTsKKwkJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJCWlmIChyZXR2YWwgIT0gMSkgeworCQkJZGV2X2Vycih0cy0+ZGV2LAorCQkJCSJjcF90bTEyMTc6IFJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpbmdlcl90b3VjaGVkID0gMDsKKwkJLyogU3RhcnQgc2FtcGxpbmcgdW50aWwgdGhlIHByZXNzdXJlIGlzIGJlbG93CisJCSAgdGhyZXNob2xkICovCisJCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQkJaWYgKHJlcVsxXSAmIDB4MykgeworCQkJCWZpbmdlcl90b3VjaGVkKys7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAwKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiB0b3VjaCBldmVudCAqLworCQkJCQlpbnB1dF9yZXBvcnRfa2V5KAorCQkJCQkJdHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQsCisJCQkJCQlCVE5fVE9VQ0gsIDEpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAxOworCQkJCX0KKwkJCQlwcm9jZXNzX3RvdWNoKHRzLCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAxKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiByZWxlYXNlIGV2ZW50ICovCisJCQkJCWlucHV0X3JlcG9ydF9rZXkoCisJCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCwKKwkJCQkJCUJUTl9UT1VDSCwgMCk7CisJCQkJCWlucHV0X3N5bmModHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAwOworCQkJCX0KKwkJCX0KKwkJCXJlcVsxXSA9IHJlcVsxXSA+PiAyOworCQl9CisJCW1zbGVlcChERUxBWV9CVFdJTl9TQU1QTEUpOworCX0gd2hpbGUgKGZpbmdlcl90b3VjaGVkID4gMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjcF90bTEyMTdfc2FtcGxlX3RocmVhZChpbnQgaXJxLCB2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICopIGhhbmRsZTsKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCS8qIENoZWRrIGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZyAqLworCW11dGV4X2xvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCWlmICh0cy0+dGhyZWFkX3J1bm5pbmcgPT0gMSkgeworCQltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIHsKKwkJdHMtPnRocmVhZF9ydW5uaW5nID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZ0cy0+dGhyZWFkX211dGV4KTsKKwl9CisKKwkvKiBNYXNrIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCB0aGUgY2F1c2Ugb2YgdGhlCisJICAgSW50ZXJydXB0ICovCisJcmVxWzBdID0gVE1BMTIxN19JTlRfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJZ290byBleGl0X3RocmVhZDsKKworCWlmICghKHJlcVsxXSAmIDB4OCkpCisJCWdvdG8gZXhpdF90aHJlYWQ7CisKKwljcF90bTEyMTdfZ2V0X2RhdGEodHMpOworCitleGl0X3RocmVhZDoKKwkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgYmVmb3JlIGdvaW5nIHRvIHNsZWVwICovCisJcmV0dmFsID0gY3BfdG0xMjE3X3VubWFza19pbnRlcnJ1cHQodHMpOworCisJbXV0ZXhfbG9jaygmdHMtPnRocmVhZF9tdXRleCk7CisJdHMtPnRocmVhZF9ydW5uaW5nID0gMDsKKwltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN19pbml0X2RhdGEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisJdTgJcmVxWzJdOworCisJLyogUmVhZCB0aGUgdmVuZG9yIGlkLyBmdyByZXZpc2lvbiBldGMuIElnbm9yaW5nIHJldHVybiBjaGVjayBhcyB0aGlzCisJICAgaXMgbm9uIGNyaXRpY2FsIGluZm8gICovCisJcmVxWzBdID0gVE1BMTIxN19NQU5VRkFDVFVSRVJfSUQ7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnZlbmRvcl9pZCA9IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfUFJPRFVDVF9GQU1JTFk7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnByb2R1Y3RfZmFtaWx5ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19GSVJNV0FSRV9SRVZJU0lPTjsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uZmlybXdhcmVfcmV2ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19TRVJJQUxfTk9fSElHSDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gKHJlcVsxXSA8PCA4KTsKKworCXJlcVswXSA9IFRNQTEyMTdfU0VSSUFMX05PX0xPVzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gdHMtPnZpbmZvLnNlcmlhbF9ubyB8IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1hfSElHSEVSNDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IChyZXFbMV0gJiAweEYpIDw8IDg7CisKKwlyZXFbMF0gPSBUTUExMjE3X01BWF9YX0xPV0VSODsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IHRzLT5kaW5mby5tYXhYIHwgcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19NQVhfWV9ISUdIRVI0OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gKHJlcVsxXSAmIDB4RikgPDwgODsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1lfTE9XRVI4OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gdHMtPmRpbmZvLm1heFkgfCByZXFbMV07CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICoJU2V0IHVwIGEgR1BJTyBmb3IgdXNlIGFzIHRoZSBpbnRlcnJ1cHQuIFdlIGNhbid0IHNpbXBseSBkbyB0aGlzIGF0CisgKglib290IHRpbWUgYmVjYXVzZSB0aGUgR1BJTyBkcml2ZXJzIHRoZW1zZWx2ZXMgbWF5IG5vdCBiZSBhcm91bmQgYXQKKyAqCWJvb3QvZmlybXdhcmUgc2V0IHVwIHRpbWUgdG8gZG8gdGhlIHdvcmsuIEluc3RlYWQgZGVmZXIgaXQgdG8gZHJpdmVyCisgKglkZXRlY3Rpb24uCisgKi8KKworc3RhdGljIGludCBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisKKwkvKiBIb29rIHVwIHRoZSBpcnEgaGFuZGxlciAqLworCXJldHZhbCA9IGdwaW9fcmVxdWVzdCh0cy0+Z3BpbywgImNwX3RtMTIxN190b3VjaCIpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBncGlvX2RpcmVjdGlvbl9pbnB1dCh0cy0+Z3Bpbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2Vycih0cy0+ZGV2LAorCQkiY3BfdG0xMjE3OiBHUElPIGRpcmVjdGlvbiBjb25maWd1cmF0aW9uIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJCQkJCXJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZ3Bpb190b19pcnEodHMtPmdwaW8pOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyB0byBJUlEgZmFpbGVkaSwiCisJCSIgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJfQorCWRldl9kYmcodHMtPmRldiwKKwkJImNwX3RtMTIxNzogR290IElSUSBudW1iZXIgaXMgJWQgZm9yIEdQSU8gJWRcbiIsCisJCXJldHZhbCwgdHMtPmdwaW8pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2X2luZm8JKmlucHV0X2luZm87CisJc3RydWN0IGNwX3RtMTIxN19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwl1OCByZXFbMl07CisJaW50IGksIHJldHZhbDsKKworCS8qIE5vIHBkYXRhIGlzIGZpbmUgLSB3ZSB0aGVuIHVzZSAibm9ybWFsIiBJUlEgbW9kZSAqLworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdHMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY3BfdG0xMjE3OiBQcml2YXRlIERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdHMtPmNsaWVudCA9IGNsaWVudDsKKwl0cy0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHRzKTsKKworCXRzLT50aHJlYWRfcnVubmluZyA9IDA7CisJbXV0ZXhfaW5pdCgmdHMtPnRocmVhZF9tdXRleCk7CisKKwkvKiBSZXNldCB0aGUgQ29udHJvbGxlciAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVDsKKwlyZXFbMV0gPSAweDE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IENvbnRyb2xsZXIgcmVzZXQgZmFpbGVkXG4iKTsKKwkJa2ZyZWUodHMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDbGVhciB1cCB0aGUgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHJlc2V0LiAqLworCXJlcVswXSA9IFRNQTEyMTdfSU5UX1NUQVRVUzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKworCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwljcF90bTEyMTdfaW5pdF9kYXRhKHRzKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlIGV2ZW50IGRldmljZXMgd2hlbgorCSAgIG11bHRpLXBvaW50ZXIgaXMgZW5hYmxlZCwgdGhlIGNvZGUgaGFzIG5vdCBiZWVuIHRlc3RlZAorCSAgIHdpdGggTVBYICovCisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoaW5wdXRfZGV2ID09IE5VTEwpIHsKKwkJCWRldl9lcnIodHMtPmRldiwKKwkJCQkiY3BfdG0xMjE3OklucHV0IERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJCWtmcmVlKHRzKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlucHV0X2luZm8gPSAmdHMtPmNwX2lucHV0X2luZm9baV07CisJCXNucHJpbnRmKGlucHV0X2luZm8tPm5hbWUsIHNpemVvZihpbnB1dF9pbmZvLT5uYW1lKSwKKwkJCSJjcF90bTEyMTdfdG91Y2hzY3JlZW5fJWQiLCBpKTsKKwkJaW5wdXRfZGV2LT5uYW1lID0gaW5wdXRfaW5mby0+bmFtZTsKKwkJc25wcmludGYoaW5wdXRfaW5mby0+cGh5cywgc2l6ZW9mKGlucHV0X2luZm8tPnBoeXMpLAorCQkJIiVzL2lucHV0JWQiLCBkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBpKTsKKworCQlpbnB1dF9kZXYtPnBoeXMgPSBpbnB1dF9pbmZvLT5waHlzOworCQlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCisJCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwkJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIHRzLT5kaW5mby5tYXhYLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgdHMtPmRpbmZvLm1heFksIDAsIDApOworCisJCXJldHZhbCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkJIklucHV0IGRldiByZWdpc3RyYXRpb24gZmFpbGVkIGZvciAlc1xuIiwKKwkJCQkJaW5wdXRfZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpbnB1dF9pbmZvLT5pbnB1dCA9IGlucHV0X2RldjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBDaGVjayBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgZGV2aWNlICovCisJcmVxWzBdID0gVE1BMTIxN19ERVZfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXFbMV0gIT0gMCkgeworCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkiY3BfdG0xMjE3OiBEZXZpY2UgU3RhdHVzIDB4JXggIT0gMDogY29uZmlnIGZhaWxlZFxuIiwKKwkJCXJlcVsxXSk7CisKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3BpbykgeworCQl0cy0+Z3BpbyA9IHBkYXRhLT5ncGlvOworCQlyZXR2YWwgPSBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEodHMpOworCX0gZWxzZQorCQlyZXR2YWwgPSBjbGllbnQtPmlycTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJZ290byBmYWlsOworCX0KKworCWNsaWVudC0+aXJxID0gcmV0dmFsOworCisKKwlyZXR2YWwgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJTlVMTCwgY3BfdG0xMjE3X3NhbXBsZV90aHJlYWQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAiY3BfdG0xMjE3X3RvdWNoIiwgdHMpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVxdWVzdCBJUlEgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gZmFpbF9ncGlvOworCX0KKworCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyAqLworCXJldHZhbCA9IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHRzKTsKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKK2ZhaWxfZ3BpbzoKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CitmYWlsOgorCS8qIENsZWFuIHVwIGJlZm9yZSByZXR1cm5pbmcgZmFpbHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQlpZiAodHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpIHsKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJfQorCX0KKwlrZnJlZSh0cyk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCisvKgorICogY3BfdG0xMjE3IHN1c3BlbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBQdXQgdGhlIGNvbnRyb2xsZXIgdG8gc2xlZXAgKi8KKwlyZXFbMF0gPSBUTUExMjE3X0RFVklDRV9DVFJMOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXJlcVsxXSA9IChyZXFbMV0gJiAweEY4KSB8IDB4MTsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY3BfdG0xMjE3X3Jlc3VtZQorICoKKyAqLworc3RhdGljIGludCBjcF90bTEyMTdfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBUYWtlIHRoZSBjb250cm9sbGVyIG91dCBvZiBzbGVlcCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJcmVxWzFdID0gKHJlcVsxXSAmIDB4RjgpIHwgMHg0OworCXJldHZhbCA9IGNwX3RtMTIxN193cml0ZSh0cywgcmVxLCAxKTsKKworCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVyIHNldHRpbmdzIHNpbmMgdGhlIHBvd2VyIHRvIHRoZQorCSAgIGNvdWxkIGhhdmUgYmVlbiBjdXQgb2ZmICovCisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBTZXR1cCB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwlyZXR2YWwgPSBjcF90bTEyMTdfdW5tYXNrX2ludGVycnVwdCh0cyk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNwX3RtMTIxN19yZW1vdmUKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCk7CisJa2ZyZWUodHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3BfdG0xMjE3X2lkdGFibGVbXSA9IHsKKwl7IENQVE0xMjE3X0RFVklDRV9OQU1FLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgY3BfdG0xMjE3X2lkdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgY3BfdG0xMjE3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBDUFRNMTIxN19EUklWRVJfTkFNRSwKKwl9LAorCS5pZF90YWJsZQk9IGNwX3RtMTIxN19pZHRhYmxlLAorCS5wcm9iZQkJPSBjcF90bTEyMTdfcHJvYmUsCisJLnJlbW92ZQkJPSBjcF90bTEyMTdfcmVtb3ZlLAorCS5zdXNwZW5kICAgID0gY3BfdG0xMjE3X3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBjcF90bTEyMTdfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2xlYXJwYWRfdG0xMjE3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmNwX3RtMTIxN19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYXJwYWRfdG0xMjE3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmY3BfdG0xMjE3X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNsZWFycGFkX3RtMTIxN19pbml0KTsKK21vZHVsZV9leGl0KGNsZWFycGFkX3RtMTIxN19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmFtZXNoIEFnYXJ3YWwgPHJhbWVzaC5hZ2Fyd2FsQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3luYXB0aWNzIFRNMTIxNyBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNlMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NwX3RtMTIxNy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorCitzdHJ1Y3QgY3BfdG0xMjE3X3BsYXRmb3JtX2RhdGEKK3sKKwlpbnQgZ3BpbzsJCS8qIElmIG5vdCBzZXQgdXNlcyB0aGUgSVJRIHJlc291cmNlIDAgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKaW5kZXggZjYzMTg1Ny4uMTUzZGRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCkBAIC0xNzExLDcgKzE3MTEsNyBAQAogCX0KIAogCUJDTUxPRyhCQ01MT0dfSU5GTywgIkZpcm13YXJlIERvd25sb2FkZWQgU3VjY2Vzc2Z1bGx5XG4iKTsKLQlyZXR1cm4gQkNfU1RTX1NVQ0NFU1M7OworCXJldHVybiBCQ19TVFNfU1VDQ0VTUzsKIH0KIAogZW51bSBCQ19TVEFUVVMgY3J5c3RhbGhkX2RvX2Z3X2NtZChzdHJ1Y3QgY3J5c3RhbGhkX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKaW5kZXggMjhjNmI4Yy4uNzE5ZTcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCiAJQkNNTE9HX0VOVEVSOwogCi0JcGluZm8gPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXBpbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghcGluZm8pIHsKIAkJQkNNTE9HX0VSUigiY291bGQgbm90IGdldCBhZHBcbiIpOwogCQlyZXR1cm47CkBAIC02MjYsNyArNjI2LDcgQEAKIAlzdHJ1Y3QgY3J5c3RhbGhkX2lvY3RsX2RhdGEgKnRlbXA7CiAJZW51bSBCQ19TVEFUVVMgc3RzID0gQkNfU1RTX1NVQ0NFU1M7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02NjAsNyArNjYwLDcgQEAKIAllbnVtIEJDX1NUQVRVUyBzdHMgPSBCQ19TVFNfU1VDQ0VTUzsKIAlpbnQgcmM7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjNhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vS2NvbmZpZwpAQCAtMCwwICsxLDExIEBACitjb25maWcgQ1M1NTM1X0dQSU8KKwl0cmlzdGF0ZSAiQU1EIENTNTUzNS9DUzU1MzYgR1BJTyAoR2VvZGUgQ29tcGFuaW9uIERldmljZSkiCisJZGVwZW5kcyBvbiBYODZfMzIKKwloZWxwCisJICBOb3RlOiB0aGlzIGRyaXZlciBpcyBERVBSRUNBVEVELiAgUGxlYXNlIHVzZSB0aGUgY3M1NTM1LWdwaW8gbW9kdWxlCisJICBpbiB0aGUgR1BJTyBzZWN0aW9uIGluc3RlYWQgKENPTkZJR19HUElPX0NTNTUzNSkuCisKKwkgIEdpdmUgdXNlcnNwYWNlIGFjY2VzcyB0byB0aGUgR1BJTyBwaW5zIG9uIHRoZSBBTUQgQ1M1NTM1IGFuZAorCSAgQ1M1NTM2IEdlb2RlIGNvbXBhbmlvbiBkZXZpY2VzLgorCisJICBJZiBjb21waWxlZCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgY3M1NTM1X2dwaW8uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3YzRiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQ1M1NTM1X0dQSU8pCSs9IGNzNTUzNV9ncGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NzNTUzNV9ncGlvL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkMWNkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVGhpcyBpcyBhbiBvYnNvbGV0ZSBkcml2ZXIgZm9yIHNvbWUgdGhlIENTNTUzNSBhbmQgQ1M1NTM2IHNvdXRoYnJpZGdlIEdQSU9zLgorSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgYSBkcml2ZXIgdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIExpbnV4IEdQSU8gc3Vic3lzdGVtLgorUGxlYXNlIHN3aXRjaCB0byB0aGF0IGRyaXZlciwgYW5kIGxldCBkaWxpbmdlckBxdWV1ZWQubmV0IGtub3cgaWYgdGhlcmUncworYW55dGhpbmcgbWlzc2luZyBmcm9tIHRoZSBuZXcgZHJpdmVyLgorCitUaGlzIGRyaXZlciBpcyBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gMi42LjQwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2NzNTUzNV9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3M1NTM1X2dwaW8vY3M1NTM1X2dwaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9jaGFyL2NzNTUzNV9ncGlvLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9jczU1MzVfZ3Bpby9jczU1MzVfZ3Bpby5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IDlhMjA1YTMuLjE2MGY2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC02MzAsNyArNjMwLDcgQEAKICAqIE9ubHkgYm9hcmRzIHdpdGggZWVwcm9tIGFuZCBieXRlIDEgYXQgZWVwcm9tPTEgaGF2ZSBpdAogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDI1ODIxX2F1ZGlvX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4MjU4MjFfYXVkaW9fcGNpX3RibCkgPSB7CiAJezB4MTRmMSwgMHgwOTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7MCx9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCmluZGV4IGRjYmU2YjYuLjUyMjI0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAKLWV4dGVybiBpbnQgIGxvZ19sZXZlbDsKK2V4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CiAKICNkZWZpbmUgQ09NRVRfTlVNX1NBTVBMRVMgICAyNCAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHdhdmVmb3JtIHRhYmxlICovCiAjZGVmaW5lIENPTUVUX05VTV9VTklUUyAgICAgNSAgIC8qIE51bWJlciBvZiBwb2ludHMgcGVyIGVudHJ5IGluIHRhYmxlICovCkBAIC0yOTIsMTIgKzI5MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGkuZS5GUE1PREU9MCAoQDB4MjApICovCiAgICAgICAgIGlmICgobW9yZVBhcmFtcyAmIENGR19DTEtfUE9SVF9NQVNLKSA9PSBDRkdfQ0xLX1BPUlRfSU5URVJOQUwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQogICAgICAgICAgICAgICAgIHByX2luZm8oIj4+ICVzOiBjbG9ja21hc3RlciBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+dHhfdGltZSwgMHgwZCk7IC8qIGludGVybmFsIG9zY2lsbGF0b3IgKi8KICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19TQkVCVUcxMikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19TQkVCVUcxMikKICAgICAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2ttYXN0ZXIgZXh0ZXJuYWwgY2xvY2tcbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPnR4X3RpbWUsIDB4MDkpOyAvKiBsb29wIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChleHRlcm5hbCkgKi8KQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcsIDB4MjEpOyAgICAgICAgLyogU2xhdmUgTW9kZSAoQ01PREU9MSkgKi8KICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZywgMHgyMCk7ICAvKiBTbGF2ZSBNb2RlIGkuZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGUE1PREU9MSAoQDB4MjApICovCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfU0JFQlVHMTIpCiAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2tzbGF2ZSBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICBwY2lfd3JpdGVfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT50eF90aW1lLCAweDBkKTsgICAgIC8qIG9zY2lsbGF0b3IgdGltaW5nICovCiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKaW5kZXggYWIzOTljMi4uZDlhOWFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC01NCw3ICs1NCw3IEBACiAKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZHJ2cl9zdGF0ZTsKIAogCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtODAsNyArODAsNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgaWYgKGRydnJfc3RhdGUgIT0gU0JFX0RSVlJfQVZBSUxBQkxFKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIF9fZnVuY19fLCBkcnZyX3N0YXRlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKaW5kZXggODkyMDBlNy4uYzUxN2NjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgU1RBVElDICBzdGF0aWMKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZXJyb3JfZmxhZzsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGlmICgoaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtICgmaGktPm1mZ19pbmZvLmRhdGEpKSA9PSBQUk9NX0ZPUk1BVF9VbmspCiAgICAgewogICAgICAgICAvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7CiAgICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOwogICAgIH0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCmluZGV4IGM3OTMwMjguLjBmNzhmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogI2VuZGlmCiAKIGludCAgICAgICAgIGVycm9yX2ZsYWc7ICAgICAgICAgLyogbW9kdWxlIGxvYWQgZXJyb3IgcmVwb3J0aW5nICovCi1pbnQgICAgICAgICBsb2dfbGV2ZWwgPSBMT0dfRVJST1I7CitpbnQgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gTE9HX0VSUk9SOwogaW50ICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQgPSBMT0dfRVJST1I7Ci1tb2R1bGVfcGFyYW0obG9nX2xldmVsLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGN4dDFlMV9sb2dfbGV2ZWwsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXJ1ID0gTVVTWUNDX01SVTsKIGludCAgICAgICAgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CkBAIC00OTcsNyArNDk3LDcgQEAKICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwogICAgIGlmIChyZXQpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjcmVhdGVfY2hhblslZF0gcmVnaXN0cmF0aW9uIGVycm9yID0gJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY3AtPmNoYW5udW0sIHJldCk7CiAgICAgICAgIGZyZWVfbmV0ZGV2IChkZXYpOyAgICAgICAgICAvKiBjbGVhbnVwICovCkBAIC03MjIsMTEgKzcyMiwxMSBAQAogU1RBVElDICAgICAgc3RhdHVzX3QKIGRvX3NldF9sb2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHVuc2lnbmVkIGludCBsb2dfbGV2ZWw7CisgICAgdW5zaWduZWQgaW50IGN4dDFlMV9sb2dfbGV2ZWw7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZsb2dfbGV2ZWwsIGRhdGEsIHNpemVvZiAoaW50KSkpCisgICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mIChpbnQpKSkKICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgc2JlY29tX3NldF9sb2dsZXZlbCAobG9nX2xldmVsKTsKKyAgICBzYmVjb21fc2V0X2xvZ2xldmVsIChjeHQxZTFfbG9nX2xldmVsKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTExNSw5ICsxMTE1LDkgQEAKICAgICAgICAgcmV0dXJuIC1ydG47ICAgICAgICAgICAgICAgIC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KIAogICAgIC8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGxvZ19sZXZlbCAhPSBsb2dfbGV2ZWxfZGVmYXVsdCkKLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bG9nX2xldmVsPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQsIGxvZ19sZXZlbCk7CisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCisgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKyAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgICAgaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKICAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXJ1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYwppbmRleCBmYzE1NjEwLi5mMjc0Yzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKQEAgLTk3LDcgKzk3LDcgQEAKIC8qIGdsb2JhbCBkcml2ZXIgdmFyaWFibGVzICovCiBleHRlcm4gY2lfdCAqYzRfbGlzdDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7Ci1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogCiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X21ydTsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXR1OwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKICAgICBpZiAoKHIgIT0gcmVxKSAmJiAocmVxICE9IFNSX0NISVBfUkVTRVQpICYmICgrK3JjbnQgPD0gTVVTWUNDX1NSX1JFVFJZX0NOVCkpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiAlZCAtIHJlaXNzdWUgc3J2IHJlcS9sYXN0ICV4LyV4IChoZHcgcmVhZHMgJXgpLCBDaGFuICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCByY250LCByZXEsIHBpLT5zcl9sYXN0LCByLAogICAgICAgICAgICAgICAgICAgICAocGktPnBvcnRudW0gKiBNVVNZQ0NfTkNIQU5TKSArIChyZXEgJiAweDFmKSk7CkBAIC05NTEsNyArOTUxLDcgQEAKICAgICBjaCA9IHBpLT5jaGFuW2djaGFuXTsKICAgICBpZiAoY2ggPT0gMCB8fCBjaC0+c3RhdGUgIT0gVVApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0VSUk9SKQogICAgICAgICAgICAgcHJfaW5mbygiJXM6IGludHI6IHhtaXQgRU9NIG9uIHVuaW5pdGlhbGl6ZWQgY2hhbm5lbCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBnY2hhbik7CiAgICAgfQpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBNVVNZQ0NfVFhfT1dORUQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBQb3J0ICVkIENoYW4gJTJkIC0gdW5leHBlY3RlZCBUWCBtc2cgb3duZXJzaGlwIGludHIgKG1kICVwIHN0cyAleClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogTm90IG91ciBtZGVzYywgZG9uZSAqLwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFBvcnQgJWQgQ2hhbiAlMmQgLSByZWNvdmVyZWQgVFggbXNnIG93bmVyc2hpcCBbJWRdIChtZCAlcCBzdHMgJXgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgcGktPnBvcnRudW0sIGNoLT5jaGFubnVtLCByZWFkQ291bnQsIG1kLCBzdGF0dXMpOwogICAgICAgICAgICAgfQpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBtZC0+c3RhdHVzID0gMDsKICNpZmRlZiBSTERfVFhGVUxMX0RFQlVHCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICBwcl9pbmZvKCJ+fiB0eF9lb206IHR4X2Z1bGwgJXggIHR4ZF9mcmVlICVkIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhfZnVsbCwgY2gtPnR4ZF9mcmVlLCBjaC0+dHhkX2ZyZWUgKyAxKTsKICNlbmRpZgpAQCAtMTA2Myw3ICsxMDYzLDcgQEAKIAogICAgICAgICBpZiAoKGNoLT5wLmNoYW5fbW9kZSAhPSBDRkdfQ0hfUFJPVE9fVFJBTlMpICYmIChzdGF0dXMgJiBFT0JJUlFfRU5BQkxFKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBNb2RlICgleCkgaW5jb3JyZWN0IEVPQiBzdGF0dXMgKCV4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgY2gtPnAuY2hhbl9tb2RlLCBzdGF0dXMpOwogICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBFT01JUlFfRU5BQkxFKSA9PSAwKQpAQCAtMTA5NCw3ICsxMDk0LDcgQEAKICAgICAgICAgewogCiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygidHhfZW9tWyVkXTogZW5hYmxlIHhtaXQgdHhfZnVsbCBubyBtb3JlLCB0eGRfZnJlZSAlZCB0eGRfbnVtLzIgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+Y2hhbm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMDgsNyArMTEwOCw3IEBACiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwogICAgIGVsc2UgaWYgKGNoLT50eF9mdWxsKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICAgICAgICAgIHByX2luZm8oInR4X2VvbVslZF06IGJ5cGFzcyBUWCBlbmFibGUgdGhvdWdoIHJvb20gYXZhaWxhYmxlPyAodHhkX2ZyZWUgJWQgdHhkX251bS8yICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0sCiAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMzgsNyArMTEzOCw3IEBACiAgICAgY2ggPSBwaS0+Y2hhbltnY2hhbl07CiAgICAgaWYgKGNoID09IDAgfHwgY2gtPnN0YXRlICE9IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPiBMT0dfRVJST1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogaW50cjogcmVjZWl2ZSBFT00gb24gdW5pbml0aWFsaXplZCBjaGFubmVsICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGdjaGFuKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAogICAgIGlmIChuZXh0SW50ICE9IElOVFJQVFNfTkVYVElOVCAoY2ktPmludGxvZy50aGlzX3N0YXR1c19uZXcpKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBub3RlIC0gdXBkYXRlZCBJU0QgZnJvbSAlMDh4IHRvICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBzdGF0dXMsCkBAIC0xMzM3LDExICsxMzM3LDExIEBACiAgICAgY2ktPmludGxvZy5sYXN0X3N0YXR1c19uZXcgPSBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldzsKICAgICBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldyA9IGN1cnJJbnQ7CiAKLSAgICBpZiAoKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikgJiYgKHN0YXR1cyAmIElOVFJQVFNfSU5URlVMTF9NKSkKKyAgICBpZiAoKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICYmIChzdGF0dXMgJiBJTlRSUFRTX0lOVEZVTExfTSkpCiAgICAgewogICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIGZ1bGwgY29uZGl0aW9uIG9jY3VycmVkXG4iLCBjaS0+ZGV2bmFtZSk7CiAgICAgfQotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgcHJfaW5mbygiJXM6IGludGVycnVwdHMgcGVuZGluZywgaXNkIEAgMHglcDogJXggY3VyciAlZCBjbnQgJWQgTkVYVCAlZFxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgJmNpLT5yZWctPmlzZCwKICAgICAgICAgc3RhdHVzLCBuZXh0SW50LCBpbnRDbnQsIChpbnRDbnQgKyBuZXh0SW50KSAmIChJTlRfUVVFVUVfU0laRSAtIDEpKTsKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiAgICAgICAgIGlmICgoY3VyckludCA9PSBiYWRJbnQpIHx8IChjdXJySW50ID09IGJhZEludDIpKSAgICAgICAgLyogY2F0Y2ggZmFpbHVyZSBvZiBCdWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaXggY2hlY2tpbmcgKi8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBJbGxlZ2FsIEludGVycnVwdCBEZXRlY3RlZCBAIDB4JXAsIG1vZCAlZC4pXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsICZjaS0+aXFkX3BbaGVhZHhdLCBoZWFkeCk7CiAKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAgICAgICAgIGNpLT5pcWRfcFtoZWFkeF0gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChJTlRfRU1QVFlfRU5UUlkpOwogICAgICAgICBGTFVTSF9NRU1fV1JJVEUgKCk7CiAKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiAlMDh4IC0+IGVycjogJTJkLCIsIGN1cnJJbnQsIGVycik7CkBAIC0xNDk3LDcgKzE0OTcsNyBAQAogICAgICAgICBzd2l0Y2ggKGV2ZW50KQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRVZFX1NBQ0s6ICAgICAgICAgICAgICAvKiBTZXJ2aWNlIFJlcXVlc3QgQWNrbm93bGVkZ2UgKi8KLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZvbGF0aWxlIHVfaW50MzJfdCByOwogCkBAIC0xNTM0LDcgKzE1MzQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0IGV2ZW50OiAlZCwgaXFkWyVkXTogJTA4eCwgcG9ydDogJWRcbiIsIGNpLT5kZXZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGhlYWR4LCBjdXJySW50LCBncm91cCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE1NzMsOSArMTU3Myw5IEBACiAKICAgICAgICAgICAgICAgICB7CiAjaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgIGlmICgxIHx8IGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJmbG93IFtPTlJdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXggUVN0b3BwZWQgJXggZnJlZSAlZFxuIiwKQEAgLTE2MDUsNyArMTYwNSw3IEBACiAgICAgICAgICAgICAgICAgY2gtPnMucnhfb3Zlcl9lcnJvcnMrKzsKICAgICAgICAgICAgICAgICBjaC0+Y2hfc3RhcnRfcnggPSBDSF9TVEFSVF9SWF9PTlI7CiAKLSAgICAgICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVyZmxvdyBbT05SXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKQEAgLTE2MjMsNyArMTYyMyw3IEBACiAgICAgICAgICAgICAgICAgICogUGVyIE1VU1lDQyBtYW51YWwsIFNlY3Rpb24gIDYuNC44LjMgW1RyYW5zbWl0IEVycm9yc10sCiAgICAgICAgICAgICAgICAgICogdGhpcyBCVUZGIGVycm9yIHJlcXVpcmVzIFRyYW5zbWl0IGNoYW5uZWwgcmVhY3RpdmF0aW9uLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJydW4gW0JVRkZdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoLT5jaGFubnVtLCBjaC0+cC5jaGFuX21vZGUpOwogICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgLyogUlggYnVmZmVyIG92ZXJydW4gKi8KQEAgLTE2MzYsNyArMTYzNiw3IEBACiAgICAgICAgICAgICAgICAgICogc3BhY2UgZm9yIHRoaXMgY2hhbm5lbC4gIFJlY2VpdmUgY2hhbm5lbCByZWFjdGl2YXRpb24gaXMKICAgICAgICAgICAgICAgICAgKiBub3QgcmVxdWlyZWQsIGJ1dCBkYXRhIGhhcyBiZWVuIGxvc3QuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVycnVuIFtCVUZGXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKICAgICAgICAgICAgICAgICAvKgpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCBvbiBlcnIgKi8KIAogICAgICAgICAvKiBDaGVjayBmb3IgaW50ZXJydXB0IGxvc3QgY29uZGl0aW9uICovCi0gICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAobG9nX2xldmVsID49IExPR19FUlJPUikpCisgICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpKQogICAgICAgICB7CiAgICAgICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIG92ZXJmbG93IC0gSUxPU1QgYXNzZXJ0ZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lKTsKQEAgLTE2NjcsNyArMTY2Nyw3IEBACiAgICAgICAgIEZMVVNIX01FTV9XUklURSAoKTsKICAgICAgICAgRkxVU0hfTUVNX1JFQUQgKCk7CiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAqLwotICAgIGlmICgobG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCisgICAgaWYgKChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCiAgICAgewogICAgICAgICBpbnQgICAgICAgICBiaDsKIApAQCAtMTgyMSw5ICsxODIxLDkgQEAKICAgICAgICAgcmV0dXJuIEVST0ZTOyAgICAgICAgICAgICAgIC8qIGhvdyBlbHNlIHRvIGZsYWcgdW53cml0YWJsZSBzdGF0ZSA/ICovCiAKICNpZmRlZiBSTERfVFJBTlNfREVCVUd4Ci0gICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICBpZiAoMSB8fCBjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICNlbHNlCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogI2VuZGlmCiAgICAgewogICAgICAgICBwcl9pbmZvKCIrKyBzdGFydF94bXRbJWRdOiBzdGF0ZSAleCBzdGFydCAleCBmdWxsICVkIGZyZWUgJWQgcmVxdWlyZWQgJWQgc3RvcHBlZCAleFxuIiwKQEAgLTE4NDYsNyArMTg0Niw3IEBACiAKICAgICBpZiAodHhkX25lZWRfY250ID09IDApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogICAgICAgICAgICAgcHJfaW5mbygiJXMgY2hhbm5lbCAlZDogbm8gVFggZGF0YSBpbiBVc2VyIGJ1ZmZlclxuIiwgY2ktPmRldm5hbWUsIGNoYW5udW0pOwogICAgICAgICBPU19tZW1fdG9rZW5fZnJlZSAobWVtX3Rva2VuKTsKICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gc2VuZCAqLwpAQCAtMTg1Nyw3ICsxODU3LDcgQEAKICAgICBpZiAodHhkX25lZWRfY250ID4gY2gtPnR4ZF9udW0pIC8qIG5ldmVyIGVub3VnaCBkZXNjcmlwdG9ycyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGFyZ2UgYSBidWZmZXIgKi8KICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXQ6IGRpc2NhcmRpbmcgYnVmZmVyLCBpbnN1ZmZpY2llbnQgZGVzY3JpcHRvciBjbnQgJWQsIG5lZWQgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhkX251bSwgdHhkX25lZWRfY250ICsgMSk7CkBAIC0xODc0LDcgKzE4NzQsNyBAQAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgaWYgKHR4ZF9uZWVkX2NudCA+IGNoLT50eGRfZnJlZSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXRbJWRdOiBFQlVTWSAtIG5lZWQgbW9yZSBkZXNjcmlwdG9ycywgaGF2ZSAlZCBvZiAlZCBuZWVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaGFubnVtLCBjaC0+dHhkX2ZyZWUsIGNoLT50eGRfbnVtLCB0eGRfbmVlZF9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKaW5kZXggNWM4YTNlYi4uMzQxZTdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIHZvaWQgICAgICAgIG11c3ljY191cGRhdGVfdGltZXNsb3RzIChtcGlfdCAqKTsKIAogZXh0ZXJuIHZvaWQgbXVzeWNjX3VwZGF0ZV90eF90aHAgKG1jaF90ICopOwotZXh0ZXJuIGludCAgbG9nX2xldmVsOworZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXJ1OwogZXh0ZXJuIGludCAgY3h0MWUxX21heF9tdHU7CiBleHRlcm4gaW50ICBtYXhfcnhkZXNjX3VzZWQsIG1heF9yeGRlc2NfZGVmYXVsdDsKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBjYXJkIDAgb25seSAqLwogICAgIH0gZWxzZQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCAhPSBkKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCAhPSBkKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcl9pbmZvKCJsb2cgbGV2ZWwgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBsb2dfbGV2ZWwsIGQpOwotICAgICAgICAgICAgbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLworICAgICAgICAgICAgcHJfaW5mbygibG9nIGxldmVsIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCwgZCk7CisgICAgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgbG9nX2xldmVsKTsKKyAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgfQogfQogCkBAIC01MTMsNyArNTEzLDcgQEAKICAgICAgICAgICAgIGlmICgodmFsdWUgPT0gMHgxYykgfHwgKHZhbHVlID09IDB4MTkpIHx8ICh2YWx1ZSA9PSAweDEyKSkKICAgICAgICAgICAgICAgICBjNF9sb29wX3BvcnQgKGNpLCBwb3J0bnVtLCBDT01FVF9NRElBR19MQk9GRik7ICAvKiB0YWtlIHBvcnQgb3V0IG9mIGFueQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3BiayBtb2RlICovCi0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMHgzZikKICAgICAgICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IEJPQyB2YWx1ZSA9ICV4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHZhbHVlLCBwb3J0bnVtKTsKQEAgLTUzMyw3ICs1MzMsNyBAQAogewogICAgIGlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgcHJfaW5mbygiZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIGRydnJfc3RhdGUpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzk0LDE5ICs3OTQsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPm1kaWFnLCBjbWQpOwotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBtb2RlIGNoYW5nZWQgdG8gJTJ4IGZyb20gJTJ4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjbWQsIGxvb3BWYWx1ZSwgcG9ydG51bSk7CiAgICAgICAgIGxvb3BWYWx1ZSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+bWRpYWcpICYgQ09NRVRfTURJQUdfTEJNQVNLOwogICAgICAgICBpZiAobG9vcFZhbHVlICE9IGNtZCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfRVJST1IpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHdyaXRlIHRvIGxvb3AgcmVnaXN0ZXIgZmFpbGVkLCB1bmtub3duIHN0YXRlIGZvciBQb3J0ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHBvcnRudW0pOwogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBhbHJlYWR5IGluIHRoYXQgbW9kZSAoJTJ4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGxvb3BWYWx1ZSk7CiAgICAgfQpAQCAtOTk3LDcgKzk5Nyw3IEBACiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgcHAgPSAmY2ktPnBvcnRbcG9ydG51bV0ucDsKICAgICBlMW1vZGUgPSBJU19GUkFNRV9BTllfRTEgKHBwLT5wb3J0X21vZGUpOwotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICB7CiAgICAgICAgIHByX2luZm8oIiVzOiBjNF9zZXRfcG9ydFslZF06ICBlbnRlcmVkLCBlMW1vZGUgPSAleCwgb3BlbmNoYW5zICVkLlxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwKQEAgLTEyNzgsMTIgKzEyNzgsMTIgQEAKICAgICB9CiAgICAgaWYgKG1heCAhPSAqbGVuKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogd2FudGVkIHRvIGFsbG9jYXRlICVkIGZpZm8gc3BhY2UsIGJ1dCBnb3Qgb25seSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCAqbGVuLCBtYXgpOwogICAgICAgICAqbGVuID0gbWF4OwogICAgIH0KLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWQgZmlmbyBhdCAlZCBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIG1heCwgc3RhcnQsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IG1heHN0YXJ0OyBpIDwgKG1heHN0YXJ0ICsgbWF4KTsgaSsrKQpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIHsKICAgICBpbnQgICAgICAgICBpOwogCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICBwcl9pbmZvKCIlczogZGVhbGxvY2F0ZWQgZmlmbyBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKICAgICAgICAgcmV0dXJuIEVOT0VOVDsKICAgICBpZiAoY2gtPnN0YXRlID09IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogY2hhbm5lbCBhbHJlYWR5IFVQLCBncmFjZWZ1bCBlYXJseSBleGl0XG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKICAgICB7CiAgICAgICAgIGlmIChjaC0+cC5iaXRtYXNrW2ldICYgcGktPnRzbVtpXSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRUlOVkFMIChhdHRlbXB0IHRvIGNmZyBpbi11c2Ugb3IgdW5hdmFpbGFibGUgVGltZVNsb3RbJWRdKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBpKTsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAgICAgbmJ1ZiA9IG50cyAvIDggPyBudHMgLyA4IDogMTsKICAgICBpZiAoIW5idWYpCiAgICAgewotICAgICAgICAvKiBpZiggbG9nX2xldmVsID49IExPR19XQVJOKSAgKi8KKyAgICAgICAgLyogaWYoIGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICAqLwogICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRU5PQlVGUyAobm8gVGltZVNsb3RzIGFzc2lnbmVkKVxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY2hhbm51bSk7CiAgICAgICAgIHJldHVybiBFTk9CVUZTOyAgICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCkBAIC0xNDIwLDcgKzE0MjAsNyBAQAogCiAjaWYgMAogICAgIC8qIERFQlVHIElORk8gKi8KLSAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICBwcl9pbmZvKCIlczogbW9kZSAleCByeG51bSAlZCAocnh1c2VkICVkIGRlZiAlZCkgdHhudW0gJWQgKHR4dXNlZCAlZCBkZWYgJWQpXG4iLAogICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+cC5jaGFuX21vZGUsCiAgICAgICAgICAgICAgICAgcnhudW0sIG1heF9yeGRlc2NfdXNlZCwgbWF4X3J4ZGVzY19kZWZhdWx0LApAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKIAogICAgICAgICAgICAgICAgaWYgKCEobSA9IE9TX21lbV90b2tlbl9hbGxvYyAoY3h0MWUxX21heF9tcnUpKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjNF9jaGFuX3VwWyVkXSAtIHRva2VuIGFsbG9jIGZhaWx1cmUsIHNpemUgPSAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBjeHQxZTFfbWF4X21ydSk7CiAgICAgICAgICAgICBnb3RvIGVycmZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCmluZGV4IDVhNzJjYjUuLjUwMWEzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCkBAIC04Niw3ICs4Niw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtOTksNyArOTksNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9LY29uZmlnCmluZGV4IDlkNWZlNGQuLmJkOTZmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZwpAQCAtMSw3ICsxLDYgQEAKIGNvbmZpZyBFQVNZQ0FQCiAJdHJpc3RhdGUgIkVhc3lDQVAgVVNCIElEIDA1ZTE6MDQwOCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgotCWRlcGVuZHMgb24gQktMICMgcGxlYXNlIGZpeAogCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpbnRlZ3JhdGVkIGF1ZGlvL3ZpZGVvIGRyaXZlciBmb3IgRWFzeUNBUCBjYXJkcyB3aXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCmluZGV4IDhhM2Q5MTEuLmYxZjJmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCkBAIC0xMCw0ICsxMCw1IEBACiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVAogY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9ICiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUworY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKaW5kZXggMzc3NTQ4MS4uNmI1YWMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL1JFQURNRQpAQCAtMjQsNiArMjQsOSBAQAogQlVJTEQgT1BUSU9OUyBBTkQgREVQRU5ERU5DSUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorVW5sZXNzIEVBU1lDQVBfREVCVUcgaXMgZGVmaW5lZCBkdXJpbmcgY29tcGlsYXRpb24gaXQgd2lsbCBub3QgYmUgcG9zc2libGUKK3RvIHNlbGVjdCBhIGRlYnVnIGxldmVsIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBpbnN0YWxsYXRpb24uCisKIElmIHRoZSBwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgdW5kZWZpbmVkIGR1cmluZyBjb21waWxhdGlvbgogdGhlIGJ1aWx0IG1vZHVsZSBpcyBlbnRpcmVseSBpbmRlcGVuZGVudCBvZiB0aGUgdmlkZW9kZXYgbW9kdWxlLCBhbmQgd2hlbgogdGhlIEVhc3lDQVAgaXMgcGh5c2ljYWxseSBwbHVnZ2VkIGludG8gYSBVU0IgcG9ydCB0aGUgc3BlY2lhbCBmaWxlcwpAQCAtMzMsNDEgKzM2LDU0IEBACiBJZiB0aGUgcGFyYW1ldGVyIEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UIGlzIGRlZmluZWQgZHVyaW5nIGNvbXBpbGF0aW9uCiB0aGUgYnVpbHQgZWFzeWNhcCBtb2R1bGUgaXMgY29uZmlndXJlZCB0byByZWdpc3RlciB3aXRoIHRoZSB2aWRlb2RldiBtb2R1bGUsCiBpbiB3aGljaCBjYXNlIHRoZSBzcGVjaWFsIGZpbGVzIGNyZWF0ZWQgd2hlbiB0aGUgRWFzeUNBUCBpcyBwbHVnZ2VkIGluIGFyZQotL2Rldi92aWRlbzAgYW5kIC9kZXYvZWFzeXNuZDAuICBVc2Ugb2YgdGhlIGVhc3ljYXAgbW9kdWxlIGFzIGEgY2xpZW50IG9mCi10aGUgdmlkZW9kZXYgbW9kdWxlIGhhcyByZWNlaXZlZCB2ZXJ5IGxpdHRsZSB0ZXN0aW5nIGFzIG9mIEp1bmUgMjAxMC4KKy9kZXYvdmlkZW8wIGFuZCAvZGV2L2Vhc3lzbmQwLgogCitEdXJpbmcgaW4tdHJlZSBidWlsZHMgdGhlIGZvbGxvd2luZyBzaG91bGQgc2hvdWxkIGJlIGRlZmluZWQgd2hlbmV2ZXIgdGhlCitwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgZGVmaW5lZDoKIAotS05PV04gQlVJTEQgUFJPQkxFTVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gKK0VBU1lDQVBfTkVFRFNfVjRMMl9GT1BTCitFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMCiAKLSgxKSBSZWNlbnQgZ2NjIHZlcnNpb25zIG1heSBnZW5lcmF0ZSB0aGUgbWVzc2FnZToKLQotICAgICB3YXJuaW5nOiB0aGUgZnJhbWUgc2l6ZSBvZiAuLi4uIGJ5dGVzIGlzIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMKLQotVGhpcyB3YXJuaW5nIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNwZWNpZnlpbmcgaW4gdGhlIE1ha2VmaWxlOgotCi0gICAgIEVYVFJBX0NGTEFHUyArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTgxOTIKLQotYnV0IGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gcmVtb3ZlIHRoZSBjYXVzZSBvZiB0aGUgd2FybmluZy4KK0lmIHRoZSBidWlsZCBpcyBwZXJmb3JtZWQgb3V0LW9mLXRyZWUgYWdhaW5zdCBvbGRlciBrZXJuZWxzIHRoZSBwYXJhbWV0ZXJzCit0byBiZSBkZWZpbmVkIGRlcGVuZCBvbiB0aGUga2VybmVsIHZlcnNpb24gaW4gYSB3YXkgd2hpY2ggd2lsbCBub3QgYmUKK2Rpc2N1c3NlZCBoZXJlLgogCiAKIEtOT1dOIFJVTlRJTUUgSVNTVUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0oMSkgUmFuZG9tbHkgKG1heWJlIDUgdG8gMTAlIG9mIG9jY2FzaW9ucykgdGhlIGRyaXZlciBmYWlscyB0byBwcm9kdWNlIGFueQotb3V0cHV0IGF0IHN0YXJ0LXVwLiAgQ2xvc2luZyBtcGxheWVyIChvciB3aGF0ZXZlciB0aGUgdXNlciBwcm9ncmFtIGlzKSBhbmQKLXJlc3RhcnRpbmcgaXQgcmVzdG9yZXMgbm9ybWFsIHBlcmZvcm1hbmNlIHdpdGhvdXQgYW55IG90aGVyIHJlbWVkaWFsIGFjdGlvbgotYmVpbmcgbmVjZXNzYXJ5LiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBub3Qga25vd24uCisoMSkgSW50ZW50aW9uYWxseSwgdGhpcyBkcml2ZXIgd2lsbCBub3Qgc3RyZWFtIG1hdGVyaWFsIHdoaWNoIGlzIHVuYW1iaWd1b3VzbHkKK2lkZW50aWZpZWQgYnkgdGhlIGhhcmR3YXJlIGFzIGNvcHktcHJvdGVjdGVkLiAgTm9ybWFsIHZpZGVvIG91dHB1dCB3aWxsIGJlCitwcmVzZW50IGZvciBhYm91dCBhIG1pbnV0ZSBidXQgd2lsbCB0aGVuIGZyZWV6ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KIAotKDIpIEludGVudGlvbmFsbHksIHRoaXMgZHJpdmVyIHdpbGwgbm90IHN0cmVhbSBtYXRlcmlhbCB3aGljaCBpcyB1bmFtYmlndW91c2x5Ci1pZGVudGlmaWVkIGJ5IHRoZSBoYXJkd2FyZSBhcyBjb3B5LXByb3RlY3RlZC4gIFRoZSB2aWRlbyBvdXRwdXQgd2lsbCBmcmVlemUKLXdpdGhpbiBhYm91dCBhIG1pbnV0ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KLQotKDMpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAorKDIpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAogYWx3YXlzIHdvcmsgcHJvcGVybHkuCiAKLSg0KSBSZWR1Y2VkLXJlc29sdXRpb24gUy1WaWRlbyBzZWVtcyB0byBzdWZmZXIgZnJvbSBtb2lyZSBhcnRlZmFjdHMuICBObwotYXR0ZW1wdCBoYXMgeWV0IGJlZW4gbWFkZSB0byByZW1lbWR5IHRoaXMuCisoMykgUmVkdWNlZC1yZXNvbHV0aW9uIFMtVmlkZW8gc2VlbXMgdG8gc3VmZmVyIGZyb20gbW9pcmUgYXJ0ZWZhY3RzLgorCisKK0lOUFVUIE5VTUJFUklORworLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIFMtVklERU8gaW5wdXQgY2FibGUgdGhlIGRyaXZlciByZWdhcmRzIGEgcmVxdWVzdCBmb3IKK2lucHV0cyBudW1iZXJlZCAwIG9yIDEgYXMgcmVmZXJyaW5nIHRvIENWQlMgYW5kIGEgcmVxdWVzdCBmb3IgaW5wdXQKK251bWJlcmVkIDUgYXMgcmVmZXJyaW5nIHRvIFMtVklERU8uCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIGZvdXIgQ1ZCUyBpbnB1dHMgdGhlIGRyaXZlciBleHBlY3RzIHRvIGJlIGFza2VkIGZvcgorYW55IG9uZSBvZiBpbnB1dHMgbnVtYmVyZWQgMSwyLDMsNC4gIElmIGlucHV0IDAgaXMgYXNrZWQgZm9yLCBpdCBpcworaW50ZXJwcmV0ZWQgYXMgaW5wdXQgMS4KKworCitNT0RVTEUgUEFSQU1FVEVSUworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhyZWUgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQ6CisKK2RlYnVnICAgICAgdGhlIGVhc3ljYXAgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgYXQgZGlhZ25vc3RpYyBsZXZlbCBuICgwIHRvIDkpCitnYWluICAgICAgIGF1ZGlvIGdhaW4gbGV2ZWwgbiAoMCB0byAzMSwgZGVmYXVsdCBpcyAxNikKK2JhcnMgICAgICAgMCA9PiAgdGVzdGNhcmQgYmFycyB3aGVuIGluY29taW5nIHZpZGVvIHNpZ25hbCBpcyBsb3N0CisgICAgICAgICAgIDEgPT4gIHRlc3RjYXJkIGJhcnMgd2hlbiBpbmNvbWluZyB2aWRlbyBzaWduYWwgaXMgbG9zdCAoZGVmYXVsdCkKIAogCiBTVVBQT1JURUQgVFYgU1RBTkRBUkRTIEFORCBSRVNPTFVUSU9OUwpAQCAtODIsMTggKzk4LDI5IEBACiAgICAgUEFMXzYwLCAgICAgICBOVFNDXzQ0MywKICAgICBQQUxfTS4KIAorSW4gYWRkaXRpb24sIHRoZSBkcml2ZXIgb2ZmZXJzICJjdXN0b20iIHBzZXVkby1zdGFuZGFyZHMgd2l0aCBhIGZyYW1lcmF0ZQord2hpY2ggaXMgMjAlIG9mIHRoZSB1c3VhbCBmcmFtZXJhdGUuICBUaGVzZSBwc2V1ZG8tc3RhbmRhcmRzIGFyZSBuYW1lZDoKKworICAgIFBBTF9CR0hJTl9TTE9XLCAgICBOVFNDX05fNDQzX1NMT1csCisgICAgUEFMX05jX1NMT1csICAgICAgIE5UU0NfTl9TTE9XLAorICAgIFNFQ0FNX1NMT1csICAgICAgICBOVFNDX01fU0xPVywgICAgICAgIE5UU0NfTV9KUF9TTE9XLAorICAgIFBBTF82MF9TTE9XLCAgICAgICBOVFNDXzQ0M19TTE9XLAorICAgIFBBTF9NX1NMT1cuCisKKwogVGhlIGF2YWlsYWJsZSBwaWN0dXJlIHNpemVzIGFyZToKIAogICAgICBhdCAyNSBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NTc2LCA3MDR4NTc2LCA2NDB4NDgwLCAzNjB4Mjg4LCAzMjB4MjQwOwotICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwOworICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwLgogCiAKIFdIQVQnUyBURVNURUQgQU5EIFdIQVQnUyBOT1QKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUgYW5kIHN1ZmZpY2llbnRseQotcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZSB0byBmZm1wZWcgaXMgaW1wbGVtZW50ZWQsIGJ1dCBzZXJpb3VzCi1hdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgcmVtYWluLgorVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUsIHpvbmVtaW5kZXIsCit4YXd0diwgZ3N0cmVhbWVyIGFuZCBzdWZmaWNpZW50bHkgcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZQordG8gZmZtcGVnIGlzIGltcGxlbWVudGVkLCBidXQgc2VyaW91cyBhdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMKK3JlbWFpbi4KIAogVGhlIGRyaXZlciBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFsbCB0aGUgVFYgc3RhbmRhcmRzIGFjY2VwdGVkIGJ5IHRoZQogaGFyZHdhcmUsIGJ1dCBhcyB5ZXQgaXQgaGFzIGFjdHVhbGx5IGJlZW4gdGVzdGVkIG9uIG9ubHkgYSBmZXcgb2YgdGhlc2UuCkBAIC0xMDEsMTAgKzEyOCw3IEBACiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdGVzdCBhbmQgY2FsaWJyYXRlIHRoZSBTLXZpZGVvIGlucHV0IG15c2VsZiBiZWNhdXNlIEkKIGRvIG5vdCBwb3NzZXNzIGFueSBlcXVpcG1lbnQgd2l0aCBTLXZpZGVvIG91dHB1dC4KIAotVGhpcyBkcml2ZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgVjRMMSBJT0NUTCBjb21tYW5kcywgc28gcHJvZ3JhbXMgc3VjaAotYXMgY2Ftb3JhbWEgYXJlIG5vdCBjb21wYXRpYmxlLiAgVGhlcmUgYXJlIHJlcG9ydHMgdGhhdCB0aGUgZHJpdmVyIGRvZXMKLXdvcmsgd2l0aCBzdWZmaWNpZW50bHkgcmVjZW50IChWNEwyKSB2ZXJzaW9ucyBvZiB6b25lbWluZGVyLCBidXQgSSBoYXZlIG5vdAotYXR0ZW1wdGVkIHRvIGNvbmZpcm0gdGhpcyBteXNlbGYuCitUaGlzIGRyaXZlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBWNEwxIElPQ1RMIGNvbW1hbmRzLgogCiAKIFVERVYgUlVMRVMKQEAgLTEyMCw2ICsxNDQsMTcgQEAKIExBQkVMPSJlYXN5Y2FwX3J1bGVzX2VuZCIKIAogCitNT0RQUk9CRSBDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBlYXN5Y2FwIG1vZHVsZSBpcyBpbiBjb21wZXRpdGlvbiB3aXRoIHRoZSBtb2R1bGUgc25kLXVzYi1hdWRpbyBmb3IgdGhlCitFYXN5Q0FQJ3MgYXVkaW8gY2hhbm5lbCwgYW5kIGl0cyBpbnN0YWxsYXRpb24gY2FuIGJlIGFpZGVkIGJ5IHByb3ZpZGluZyBhCitmaWxlIGluIGRpcmVjdG9yeSAvZXRjL21vZHByb2JlLmQgd2l0aCBjb250ZW50OgorCitvcHRpb25zIGVhc3ljYXAgIGdhaW49MTYgYmFycz0xCitpbnN0YWxsIGVhc3ljYXAgL3NiaW4vcm1tb2Qgc25kLXVzYi1hdWRpbzsgL3NiaW4vbW9kcHJvYmUgLS1pZ25vcmUtaW5zdGFsbCBlYXN5Y2FwCisKKwogQUNLTk9XTEVHRU1FTlRTIEFORCBSRUZFUkVOQ0VTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRoaXMgZHJpdmVyIG1ha2VzIHVzZSBvZiBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFN5bnRlayBTZW1pY29uIERDLTExMjUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaAppbmRleCA4ODQyNjNiLi44ZWJmOTZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaApAQCAtMzMsNiArMzMsNyBAQAogICogICAgICAgICAgICAgICAgRUFTWUNBUF9ORUVEU19VU0JWSURFT19ICiAgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gKICAqICAgICAgICAgICAgICAgIEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTCisgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMCiAgKgogICogIElGIFJFUVVJUkVEIFRIRVkgTVVTVCBCRSBFWFRFUk5BTExZIERFRklORUQsIEZPUiBFWEFNUExFIEFTIENPTVBJTEVSCiAgKiAgT1BUSU9OUy4KQEAgLTQyLDM1ICs0MywyNCBAQAogI2lmICghZGVmaW5lZChFQVNZQ0FQX0gpKQogI2RlZmluZSBFQVNZQ0FQX0gKIAotI2lmIGRlZmluZWQoRUFTWUNBUF9ERUJVRykKLSNpZiAoOSA8IEVBU1lDQVBfREVCVUcpCi0jZXJyb3IgRGVidWcgbGV2ZWxzIDAgdG8gOSBhcmUgb2theS5cCi0gIFRvIGFjaGlldmUgaGlnaGVyIGxldmVscywgcmVtb3ZlIHRoaXMgdHJhcCBtYW51YWxseSBmcm9tIGVhc3ljYXAuaAotI2VuZGlmCi0jZW5kaWYgLypFQVNZQ0FQX0RFQlVHKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgVEhFU0UgQVJFIE5PUk1BTExZIERFRklORUQKKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAgUEFUSUVOQ0UgIDUwMAorI3VuZGVmICAgUFJFRkVSX05UU0MKKyNkZWZpbmUgIFBFUlNFVkVSRQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUSEVTRSBBUkUgRk9SIE1BSU5URU5BTkNFIE9OTFkgLSBOT1JNQUxMWSBVTkRFRklORUQ6CiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSN1bmRlZiAgUFJFRkVSX05UU0MKICN1bmRlZiAgRUFTWUNBUF9URVNUQ0FSRAogI3VuZGVmICBFQVNZQ0FQX1RFU1RUT05FCi0jdW5kZWYgIExPQ0tGUkFNRQogI3VuZGVmICBOT1JFQURCQUNLCiAjdW5kZWYgIEFVRElPVElNRQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqCi0gKiAgREVGSU5FICAgQlJJREdFUiAgIFRPIEFDVElWQVRFIFRIRSBST1VUSU5FIEZPUiBCUklER0lORyBWSURFT1RBUEUgRFJPUE9VVFMuCi0gKgotICogICAgICAgICAgICAgKioqIFVOREVSIERFVkVMT1BNRU5UL1RFU1RJTkcgLSBOT1QgUkVBRFkgWUVUISoqKgotICoKLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI3VuZGVmICBCUklER0VSCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTkyLDI1ICs4MiwxNCBAQAogCiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQotI2lmICghZGVmaW5lZChfX09MRF9WSURJT0NfKSkKLSNkZWZpbmUgX19PTERfVklESU9DXwotI2VuZGlmIC8qICFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pICovCi0KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotCiAjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCiAvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KLQotI2lmICghZGVmaW5lZChfX09MRF9WSURJT0NfKSkKLSNkZWZpbmUgX19PTERfVklESU9DXwotI2VuZGlmIC8qICFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLQogI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19VU0JWSURFT19IKQogI2luY2x1ZGUgPGNvbmZpZy92aWRlby91c2J2aWRlby5oPgogI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19VU0JWSURFT19IKi8KQEAgLTEyMSw3ICsxMDAsNiBAQAogCiAjZGVmaW5lIFNUUklOR0laRV9BR0FJTih4KSAjeAogI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFX0FHQUlOKHgpCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qICBWRU5ET1IsIFBST0RVQ1Q6ICBTeW50ZWsgU2VtaWNvbmR1Y3RvciBDby4sIEx0ZAogICoKQEAgLTEzNSwxMiArMTEzLDEyIEBACiAjZGVmaW5lIFVTQl9FQVNZQ0FQX1ZFTkRPUl9JRAkweDA1ZTEKICNkZWZpbmUgVVNCX0VBU1lDQVBfUFJPRFVDVF9JRAkweDA0MDgKIAotI2RlZmluZSBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OICIwLjguMjEiCisjZGVmaW5lIEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04gIjAuOC40MSIKICNkZWZpbmUgRUFTWUNBUF9EUklWRVJfREVTQ1JJUFRJT04gImVhc3ljYXBkYzYwIgogCiAjZGVmaW5lIFVTQl9TS0VMX01JTk9SX0JBU0UgICAgIDE5MgotI2RlZmluZSBWSURFT19ERVZJQ0VfTUFOWSA4Ci0KKyNkZWZpbmUgRE9OR0xFX01BTlkgOAorI2RlZmluZSBJTlBVVF9NQU5ZIDYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgREVGQVVMVCBMVU1JTkFOQ0UsIENPTlRSQVNULCBTQVRVUkFUSU9OIEFORCBIVUUKQEAgLTE2NCw2ICsxNDIsOCBAQAogI2lmIChVU0JfMl8wX01BWFBBQ0tFVFNJWkUgPiBQQUdFX1NJWkUpCiAjZXJyb3IgdmlkZW9faXNvY19idWZmZXJbLl0gd2lsbCBub3QgYmUgYmlnIGVub3VnaAogI2VuZGlmCisjZGVmaW5lIFZJREVPX0pVTktfVE9MRVJBVEUgVklERU9fSVNPQ19CVUZGRVJfTUFOWQorI2RlZmluZSBWSURFT19MT1NUX1RPTEVSQVRFIDUwCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFZJREVPIEJVRkZFUlMKQEAgLTIxMCw3ICsxOTAsMTcgQEAKICNkZWZpbmUgIE5UU0NfTV9KUCAgICAgIDUKICNkZWZpbmUgIFBBTF82MCAgICAgICAgIDcKICNkZWZpbmUgIFBBTF9NICAgICAgICAgIDkKLSNkZWZpbmUgIFNUQU5EQVJEX01BTlkgMTAKKyNkZWZpbmUgIFBBTF9CR0hJTl9TTE9XICAgIDEwCisjZGVmaW5lICBQQUxfTmNfU0xPVyAgICAgICAxMgorI2RlZmluZSAgU0VDQU1fU0xPVyAgICAgICAgMTQKKyNkZWZpbmUgIE5UU0NfTl9TTE9XICAgICAgIDE2CisjZGVmaW5lICBOVFNDX05fNDQzX1NMT1cgICAxOAorI2RlZmluZSAgTlRTQ19NX1NMT1cgICAgICAgMTEKKyNkZWZpbmUgIE5UU0NfNDQzX1NMT1cgICAgIDEzCisjZGVmaW5lICBOVFNDX01fSlBfU0xPVyAgICAxNQorI2RlZmluZSAgUEFMXzYwX1NMT1cgICAgICAgMTcKKyNkZWZpbmUgIFBBTF9NX1NMT1cgICAgICAgIDE5CisjZGVmaW5lICBTVEFOREFSRF9NQU5ZIDIwCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIEVOVU1TCkBAIC0yMzgsNyArMjI4LDYgQEAKIGVudW0gewogRklFTERfTk9ORSwKIEZJRUxEX0lOVEVSTEFDRUQsCi1GSUVMRF9BTFRFUk5BVEUsCiBJTlRFUkxBQ0VfTUFOWQogfTsKICNkZWZpbmUgU0VUVElOR1NfTUFOWQkoU1RBTkRBUkRfTUFOWSAqIFwKQEAgLTI1MSwxMSArMjQwLDE4IEBACiAgKiAgU1RSVUNUVVJFIERFRklOSVRJT05TCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBlYXN5Y2FwX2RvbmdsZSB7CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CitzdHJ1Y3QgbXV0ZXggbXV0ZXhfdmlkZW87CitzdHJ1Y3QgbXV0ZXggbXV0ZXhfYXVkaW87Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IGRhdGFfYnVmZmVyIHsKIHN0cnVjdCBsaXN0X2hlYWQgbGlzdF9oZWFkOwogdm9pZCAqcGdvOwogdm9pZCAqcHRvOwogX191MTYga291bnQ7CitfX3UxNiBpbnB1dDsKIH07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgZGF0YV91cmIgewpAQCAtMjc0LDYgKzI3MCwyMiBAQAogY2hhciBuYW1lWzEyOF07CiBzdHJ1Y3QgdjRsMl9mb3JtYXQgdjRsMl9mb3JtYXQ7CiB9Oworc3RydWN0IGlucHV0c2V0IHsKK2ludCBpbnB1dDsKK2ludCBpbnB1dF9vazsKK2ludCBzdGFuZGFyZF9vZmZzZXQ7CitpbnQgc3RhbmRhcmRfb2Zmc2V0X29rOworaW50IGZvcm1hdF9vZmZzZXQ7CitpbnQgZm9ybWF0X29mZnNldF9vazsKK2ludCBicmlnaHRuZXNzOworaW50IGJyaWdodG5lc3Nfb2s7CitpbnQgY29udHJhc3Q7CitpbnQgY29udHJhc3Rfb2s7CitpbnQgc2F0dXJhdGlvbjsKK2ludCBzYXR1cmF0aW9uX29rOworaW50IGh1ZTsKK2ludCBodWVfb2s7Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgZWFzeWNhcC5pbGsgPT0gMCAgID0+ICBDVkJTK1MtVklERU8gSEFSRFdBUkUsIEFVRElPIHdNYXhQYWNrZXRTaXplPTI1NgpAQCAtMjgyLDYgKzI5NCwxOSBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgZWFzeWNhcCB7CisjZGVmaW5lIFRFTExUQUxFICJleHBlY3RlZHN0cmluZyIKK2NoYXIgdGVsbHRhbGVbMTZdOworaW50IGlzZG9uZ2xlOworCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKK3N0cnVjdCB2aWRlb19kZXZpY2UgdmlkZW9fZGV2aWNlOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2aWNlOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KK2ludCBzdGF0dXM7CiB1bnNpZ25lZCBpbnQgYXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50OwogdW5zaWduZWQgaW50IGF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudDsKIHVuc2lnbmVkIGludCBhdWRpb19idWZmZXJfcGFnZV9tYW55OwpAQCAtMjkxLDI2ICszMTYsMTQgQEAKIF9fczE2IG9sZGF1ZGlvOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi1zdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgZWFzeWNhcF9mb3JtYXRbMSArIFNFVFRJTkdTX01BTlldOwotCiBpbnQgaWxrOwogYm9vbCBtaWNyb3Bob25lOwogCi0vKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KLSNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQotc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZTsKLSNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotCiBzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CiAKIHN0cnVjdCBrcmVmIGtyZWY7CiAKLXN0cnVjdCBtdXRleCBtdXRleF9tbWFwX3ZpZGVvW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKLXN0cnVjdCBtdXRleCBtdXRleF90aW1ldmFsMDsKLXN0cnVjdCBtdXRleCBtdXRleF90aW1ldmFsMTsKLQogaW50IHF1ZXVlZFtGUkFNRV9CVUZGRVJfTUFOWV07CiBpbnQgZG9uZVtGUkFNRV9CVUZGRVJfTUFOWV07CiAKQEAgLTMyMSwxNiArMzM0LDI0IEBACiBpbnQgcG9sbGVkOwogaW50IHN0YW5kYXJkX29mZnNldDsKIGludCBmb3JtYXRfb2Zmc2V0Oworc3RydWN0IGlucHV0c2V0IGlucHV0c2V0W0lOUFVUX01BTlldOwogCitib29sIG50c2M7CiBpbnQgZnBzOwogaW50IHVzZWM7CiBpbnQgdG9sZXJhdGU7CitpbnQgc2tpcDsKK2ludCBza2lwcGVkOworaW50IGxvc3RbSU5QVVRfTUFOWV07CiBpbnQgbWVyaXRbMTgwXTsKIAogc3RydWN0IHRpbWV2YWwgdGltZXZhbDA7CiBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMTsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwyOworc3RydWN0IHRpbWV2YWwgdGltZXZhbDM7CitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsNjsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWw3Oworc3RydWN0IHRpbWV2YWwgdGltZXZhbDg7CiBsb25nIGxvbmcgaW50IGRuYnlkdDsKIAogaW50ICAgIHZpZGVvX2ludGVyZmFjZTsKQEAgLTM0Nyw4ICszNjgsNiBAQAogaW50ICAgIHZpZGVvX2VvZjsKIGludCAgICB2aWRlb19qdW5rOwogCi1pbnQgICAgZnVkZ2U7Ci0KIHN0cnVjdCBkYXRhX2J1ZmZlciB2aWRlb19pc29jX2J1ZmZlcltWSURFT19JU09DX0JVRkZFUl9NQU5ZXTsKIHN0cnVjdCBkYXRhX2J1ZmZlciBcCiAJICAgICBmaWVsZF9idWZmZXJbRklFTERfQlVGRkVSX01BTlldWyhGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpXTsKQEAgLTM1OCw2ICszNzcsMTMgQEAKIHN0cnVjdCBsaXN0X2hlYWQgdXJiX3ZpZGVvX2hlYWQ7CiBzdHJ1Y3QgbGlzdF9oZWFkICpwdXJiX3ZpZGVvX2hlYWQ7CiAKK19fdTggY2FjaGVbOF07CitfX3U4ICpwY2FjaGU7CitpbnQgdmlkZW9fbXQ7CitpbnQgYXVkaW9fbXQ7Citsb25nIGxvbmcgYXVkaW9fYnl0ZXM7CitfX3UzMiBpc2VxdWVuY2U7CisKIGludCB2bWFfbWFueTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzgzLDcgKzQwOSw2IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIF9fdTMyICAgICAgICAgICAgICAgICAgIHBpeGVsZm9ybWF0OwotX191MzIgICAgICAgICAgICAgICAgICAgZmllbGQ7CiBpbnQgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKIGludCAgICAgICAgICAgICAgICAgICAgIGhlaWdodDsKIGludCAgICAgICAgICAgICAgICAgICAgIGJ5dGVzcGVycGl4ZWw7CkBAIC00NjMsOCArNDg4LDEwIEBACiB2b2lkICAgICAgICAgICAgIGVhc3ljYXBfY29tcGxldGUoc3RydWN0IHVyYiAqKTsKIGludCAgICAgICAgICAgICAgZWFzeWNhcF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIGludCAgICAgICAgICAgICAgZWFzeWNhcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLWxvbmcgICAgICAgICAgICAgZWFzeWNhcF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsICB1bnNpZ25lZCBsb25nKTsKLQorbG9uZyAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCBcCisJCQkJCQkJCXVuc2lnbmVkIGxvbmcpOworaW50ICAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50ICAgICAgICAgICAgICBlYXN5Y2FwX29wZW5fbm9pbm9kZShzdHJ1Y3QgZmlsZSAqKTsKQEAgLTQ4OSwxMiArNTE2LDEwIEBACiBpbnQgICAgICAgICAgICAgIGZpZWxkMmZyYW1lKHN0cnVjdCBlYXN5Y2FwICopOwogaW50ICAgICAgICAgICAgICByZWRhdWIoc3RydWN0IGVhc3ljYXAgKiwgdm9pZCAqLCB2b2lkICosIFwKIAkJCQkJCWludCwgaW50LCBfX3U4LCBfX3U4LCBib29sKTsKLXZvaWQgICAgICAgICAgICAgZGVicmllZihzdHJ1Y3QgZWFzeWNhcCAqKTsKLXZvaWQgICAgICAgICAgICAgc2F5cmVhZG9ubHkoc3RydWN0IGVhc3ljYXAgKik7CiB2b2lkICAgICAgICAgICAgIGVhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKiwgaW50KTsKLWludCAgICAgICAgICAgICAgZXhwbGFpbl9pb2N0bChfX3UzMik7Ci1pbnQgICAgICAgICAgICAgIGV4cGxhaW5fY2lkKF9fdTMyKTsKIGludCAgICAgICAgICAgICAgZmlsbGluX2Zvcm1hdHModm9pZCk7CitpbnQgICAgICAgICAgICAgIHJlc2V0KHN0cnVjdCBlYXN5Y2FwICopOworaW50ICAgICAgICAgICAgICBuZXdpbnB1dChzdHJ1Y3QgZWFzeWNhcCAqLCBpbnQpOwogaW50ICAgICAgICAgICAgICBhZGp1c3Rfc3RhbmRhcmQoc3RydWN0IGVhc3ljYXAgKiwgdjRsMl9zdGRfaWQpOwogaW50ICAgICAgICAgICAgICBhZGp1c3RfZm9ybWF0KHN0cnVjdCBlYXN5Y2FwICosIF9fdTMyLCBfX3UzMiwgX191MzIsIFwKIAkJCQkJCQkJaW50LCBib29sKTsKQEAgLTUxMiw3ICs1MzcsMTAgQEAKIHNzaXplX3QgICAgICAgICAgZWFzeXNuZF9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogaW50ICAgICAgICAgICAgICBlYXN5c25kX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogaW50ICAgICAgICAgICAgICBlYXN5c25kX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotbG9uZyAgICAgICAgICAgICBlYXN5c25kX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgIHVuc2lnbmVkIGxvbmcpOworbG9uZyAgICAgICAgICAgICBlYXN5c25kX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCBcCisJCQkJCQkJCXVuc2lnbmVkIGxvbmcpOworaW50ICAgICAgICAgICAgICBlYXN5c25kX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CiB1bnNpZ25lZCBpbnQgICAgIGVhc3lzbmRfcG9sbChzdHJ1Y3QgZmlsZSAqLCBwb2xsX3RhYmxlICopOwogdm9pZCAgICAgICAgICAgICBlYXN5c25kX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqKTsKIGludCAgICAgICAgICAgICAgc3VibWl0X2F1ZGlvX3VyYnMoc3RydWN0IGVhc3ljYXAgKik7CkBAIC01MzIsMTEgKzU2MCwxMSBAQAogaW50ICAgICAgICAgICAgICBjb25maXJtX3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIGNvbmZpcm1fc3RyZWFtKHN0cnVjdCB1c2JfZGV2aWNlICopOwogCi1pbnQgICAgICAgICAgICAgIHNldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLWludCAgICAgICAgICAgICAgc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBzZXR1cF9zdGsoc3RydWN0IHVzYl9kZXZpY2UgKiwgYm9vbCk7CitpbnQgICAgICAgICAgICAgIHNldHVwX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKIGludCAgICAgICAgICAgICAgc2V0dXBfdnQoc3RydWN0IHVzYl9kZXZpY2UgKik7Ci1pbnQgICAgICAgICAgICAgIGNoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLWludCAgICAgICAgICAgICAgY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOworaW50ICAgICAgICAgICAgICBjaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKiwgYm9vbCk7CitpbnQgICAgICAgICAgICAgIGNoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKIGludCAgICAgICAgICAgICAgcmVhZHlfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICopOwogaW50ICAgICAgICAgICAgICBtZXJpdF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIGNoZWNrX3Z0KHN0cnVjdCB1c2JfZGV2aWNlICopOwpAQCAtNTU0LDEyICs1ODIsOSBAQAogaW50ICAgICAgICAgICAgICB3cml0ZV8zMDAoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIHJlYWRfdnQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYpOwogaW50ICAgICAgICAgICAgICB3cml0ZV92dChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNiwgX191MTYpOwotCi1pbnQgICAgICAgICAgICAgIHNldDJ0bzc4KHN0cnVjdCB1c2JfZGV2aWNlICopOwotaW50ICAgICAgICAgICAgICBzZXQydG85MyhzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLQogaW50ICAgICAgICAgICAgICByZWdzZXQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYsIF9fdTE2KTsKIGludCAgICAgICAgICAgICAgcmVnZ2V0KHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2LCB2b2lkICopOworaW50CQlpc2RvbmdsZShzdHJ1Y3QgZWFzeWNhcCAqKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCB7CiBsb25nIGxvbmcgaW50IHF1b3RpZW50OwpAQCAtNTg3LDI0ICs2MTIsNDEgQEAKIAl9IFwKIH0gd2hpbGUgKDApCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KKy8qCisgKiAgTUFDUk9TIFNBTSguLi4pIEFORCBKT00oLi4uKSBBTExPVyBESUFHTk9TVElDIE9VVFBVVCBUTyBCRSBUQUdHRUQgV0lUSAorICogIFRIRSBJREVOVElUWSBPRiBUSEUgRE9OR0xFIFRPIFdISUNIIElUIEFQUExJRVMsIEJVVCBJRiBJTlZPS0VEIFdIRU4gVEhFCisgKiAgUE9JTlRFUiBwZWFzeWNhcCBJUyBJTlZBTElEIEFOIE9vcHMgSVMgTElLRUxZLCBBTkQgSVRTIENBVVNFIE1BWSBOT1QgQkUKKyAqICBJTU1FRElBVEVMWSBPQlZJT1VTIEZST00gQSBDQVNVQUwgUkVBRElORyBPRiBUSEUgU09VUkNFIENPREUuICBCRVdBUkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBTQVkoZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKLQlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDogJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAorCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOjogJXM6ICIgXAorCQkJZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTsgXAogfSB3aGlsZSAoMCkKLQorI2RlZmluZSBTQU0oZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKKwlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDo6JWklczogIiBcCisJCQlmb3JtYXQsIHBlYXN5Y2FwLT5pc2RvbmdsZSwgX19mdW5jX18sICMjYXJncyk7XAorfSB3aGlsZSAoMCkKIAogI2lmIGRlZmluZWQoRUFTWUNBUF9ERUJVRykKICNkZWZpbmUgSk9UKG4sIGZvcm1hdCwgYXJncy4uLikgZG8geyBcCiAJaWYgKG4gPD0gZWFzeWNhcF9kZWJ1ZykgeyBcCi0JCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOiAlczogIiBmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCisJCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOjogJXM6ICIgXAorCQkJZm9ybWF0LCBfX2Z1bmNfXywgIyNhcmdzKTtcCiAJfSBcCiB9IHdoaWxlICgwKQorI2RlZmluZSBKT00obiwgZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKKwlpZiAobiA8PSBlYXN5Y2FwX2RlYnVnKSB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVhc3ljYXA6OiVpJXM6ICIgXAorCQkJZm9ybWF0LCBwZWFzeWNhcC0+aXNkb25nbGUsIF9fZnVuY19fLCAjI2FyZ3MpO1wKKwl9IFwKK30gd2hpbGUgKDApCisKICNlbHNlCiAjZGVmaW5lIEpPVChuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBKT00obiwgZm9ybWF0LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZiAvKkVBU1lDQVBfREVCVUcqLwogCi0jZGVmaW5lIFBPVVQgSk9UKDgsICI6LShpbiBmaWxlICVzIGxpbmUgJTRpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCi0KICNkZWZpbmUgTUlDUk9TRUNPTkRTKFgsIFkpIFwKIAkJCSgoMTAwMDAwMCooKGxvbmcgbG9uZyBpbnQpKFgudHZfc2VjIC0gWS50dl9zZWMpKSkgKyBcCiAJCQkJCShsb25nIGxvbmcgaW50KShYLnR2X3VzZWMgLSBZLnR2X3VzZWMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9kZWJ1Zy5oCmluZGV4IDFkMTBkN2UuLmI2YjU3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmgKQEAgLTI1LDMgKzI1LDUgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gaW50IGVhc3ljYXBfZGVidWc7CitleHRlcm4gaW50IGVhc3ljYXBfZ2FpbjsKK2V4dGVybiBzdHJ1Y3QgZWFzeWNhcF9kb25nbGUgZWFzeWNhcF9kb25nbGVbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwppbmRleCA5YTQyYWUwLi40NDc5NTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCkBAIC0zNiw1MyArMzYsMTAxIEBACiAgKiAgVU5MRVNTIFRIRVJFIElTIEEgUFJFTUFUVVJFIEVSUk9SIFJFVFVSTiBUSElTIFJPVVRJTkUgVVBEQVRFUyBUSEUKICAqICBGT0xMT1dJTkc6CiAgKiAgICAgICAgICBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0CisgKiAgICAgICAgICBwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zdGFuZGFyZF9vZmZzZXQKICAqICAgICAgICAgIHBlYXN5Y2FwLT5mcHMKICAqICAgICAgICAgIHBlYXN5Y2FwLT51c2VjCiAgKiAgICAgICAgICBwZWFzeWNhcC0+dG9sZXJhdGUKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5za2lwCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCBhZGp1c3Rfc3RhbmRhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCB2NGwyX3N0ZF9pZCBzdGRfaWQpCiB7CiBzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBjb25zdCAqcGVhc3ljYXBfc3RhbmRhcmQ7CiBfX3UxNiByZWcsIHNldDsKLWludCBpciwgcmMsIG5lZWQ7CitpbnQgaXIsIHJjLCBuZWVkLCBrOwogdW5zaWduZWQgaW50IGl0d2FzLCBpc25vdzsKK2Jvb2wgcmVzdWJtaXQ7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFswXTsKIHdoaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKLQlpZiAoc3RkX2lkICYgcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaWQpCisJaWYgKHN0ZF9pZCA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZCkKIAkJYnJlYWs7CiAJcGVhc3ljYXBfc3RhbmRhcmQrKzsKIH0KIGlmICgweEZGRkYgPT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKLQlTQVkoIkVSUk9SOiAweCUwOFg9c3RkX2lkOiBzdGFuZGFyZCBub3QgZm91bmRcbiIsIFwKKwlwZWFzeWNhcF9zdGFuZGFyZCA9ICZlYXN5Y2FwX3N0YW5kYXJkWzBdOworCXdoaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKKwkJaWYgKHN0ZF9pZCAmIHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmlkKQorCQkJYnJlYWs7CisJCXBlYXN5Y2FwX3N0YW5kYXJkKys7CisJfQorfQoraWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCVNBTSgiRVJST1I6IDB4JTA4WD1zdGRfaWQ6IHN0YW5kYXJkIG5vdCBmb3VuZFxuIiwgXAogCQkJCQkJCSh1bnNpZ25lZCBpbnQpc3RkX2lkKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KLVNBWSgidXNlciByZXF1ZXN0cyBzdGFuZGFyZDogJXNcbiIsIFwKK1NBTSgic2VsZWN0ZWQgc3RhbmRhcmQ6ICVzXG4iLCBcCiAJCQkmKHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLm5hbWVbMF0pKTsKIGlmIChwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0ID09IFwKIAkJCShpbnQpKHBlYXN5Y2FwX3N0YW5kYXJkIC0gJmVhc3ljYXBfc3RhbmRhcmRbMF0pKSB7Ci0JU0FZKCJyZXF1ZXN0ZWQgc3RhbmRhcmQgYWxyZWFkeSBpbiBlZmZlY3RcbiIpOworCVNBTSgicmVxdWVzdGVkIHN0YW5kYXJkIGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKIAlyZXR1cm4gMDsKIH0KIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPSAoaW50KShwZWFzeWNhcF9zdGFuZGFyZCAtICZlYXN5Y2FwX3N0YW5kYXJkWzBdKTsKK2ZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyAgaysrKSB7CisJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0X29rKSB7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0ID0gXAorCQkJCQkJcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldDsKKwl9Cit9CitpZiAoKDAgPD0gcGVhc3ljYXAtPmlucHV0KSAmJiAoSU5QVVRfTUFOWSA+IHBlYXN5Y2FwLT5pbnB1dCkpIHsKKwlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0OworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnN0YW5kYXJkX29mZnNldF9vayA9IDE7Cit9IGVsc2UKKwlKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dFxuIiwgcGVhc3ljYXAtPmlucHV0KTsKIHBlYXN5Y2FwLT5mcHMgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5mcmFtZXBlcmlvZC5kZW5vbWluYXRvciAvIFwKIAkJcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuZnJhbWVwZXJpb2QubnVtZXJhdG9yOwotaWYgKCFwZWFzeWNhcC0+ZnBzKSB7Ci0JU0FZKCJNSVNUQUtFOiBmcmFtZXMtcGVyLXNlY29uZCBpcyB6ZXJvXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKK3N3aXRjaCAocGVhc3ljYXAtPmZwcykgeworY2FzZSA2OgorY2FzZSAzMDogeworCXBlYXN5Y2FwLT5udHNjID0gdHJ1ZTsKKwlicmVhazsKIH0KLUpPVCg4LCAiJWkgZnJhbWVzLXBlci1zZWNvbmRcbiIsIHBlYXN5Y2FwLT5mcHMpOwotcGVhc3ljYXAtPnVzZWMgPSAxMDAwMDAwIC8gKDIgKiBwZWFzeWNhcC0+ZnBzKTsKLXBlYXN5Y2FwLT50b2xlcmF0ZSA9IDEwMDAgKiAoMjUgLyBwZWFzeWNhcC0+ZnBzKTsKLQota2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKLQorY2FzZSA1OgorY2FzZSAyNTogeworCXBlYXN5Y2FwLT5udHNjID0gZmFsc2U7CisJYnJlYWs7Cit9CitkZWZhdWx0OiB7CisJU0FNKCJNSVNUQUtFOiAlaT1mcmFtZXMtcGVyLXNlY29uZFxuIiwgcGVhc3ljYXAtPmZwcyk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9Cit9CitKT00oOCwgIiVpIGZyYW1lcy1wZXItc2Vjb25kXG4iLCBwZWFzeWNhcC0+ZnBzKTsKK2lmICgweDgwMDAgJiBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCXBlYXN5Y2FwLT5za2lwID0gNTsKKwlwZWFzeWNhcC0+dXNlYyA9IDEwMDAwMDAgLyAoMiAqICg1ICogcGVhc3ljYXAtPmZwcykpOworCXBlYXN5Y2FwLT50b2xlcmF0ZSA9IDEwMDAgKiAoMjUgLyAoNSAqIHBlYXN5Y2FwLT5mcHMpKTsKK30gZWxzZSB7CisJcGVhc3ljYXAtPnNraXAgPSAwOworCXBlYXN5Y2FwLT51c2VjID0gMTAwMDAwMCAvICgyICogcGVhc3ljYXAtPmZwcyk7CisJcGVhc3ljYXAtPnRvbGVyYXRlID0gMTAwMCAqICgyNSAvIHBlYXN5Y2FwLT5mcHMpOworfQoraWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgeworCXJlc3VibWl0ID0gdHJ1ZTsKKwlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworfSBlbHNlCisJcmVzdWJtaXQgPSBmYWxzZTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQUE3MTEzSCBEQVRBU0hFRVQgUEFHRSA0NCwgVEFCTEUgNDIKQEAgLTk0LDU1ICsxNDIsNDEgQEAKIAlyZWcgPSAweDBBOyAgc2V0ID0gMHg5NTsKIAlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAlpZiAoMCA+IGlyKQotCQlTQVkoIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCQlTQU0oIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOwogCWVsc2UKIAkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwotCi0KLQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCi0KIAlyYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKIAlpZiAoMCAhPSByYykKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgIiBcCisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyICIgXAogCQkJIjB4JTAyWCB0byAweCUwMlggZm9yIEpQIHN0YW5kYXJkXG4iLCByZWcsIHNldCk7CiAJZWxzZSB7CiAJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJCWlmICgwID4gaXIpCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwogCQllbHNlCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJfQogCiAJcmVnID0gMHgwQjsgIHNldCA9IDB4NDg7CiAJaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJaWYgKDAgPiBpcikKLQkJU0FZKCJFUlJPUjogY2Fubm90IHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWFxuIiwgcmVnKTsKKwkJU0FNKCJFUlJPUjogY2Fubm90IHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWFxuIiwgcmVnKTsKIAllbHNlCiAJCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKLQotCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAlyYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKIAlpZiAoMCAhPSByYykKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWCAiIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWCAiIFwKIAkJCQkJCSJmb3IgSlAgc3RhbmRhcmRcbiIsIHJlZywgc2V0KTsKIAllbHNlIHsKIAkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAkJaWYgKDAgPiBpcikKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJInRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CiAJCWVsc2UKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC0xNzYsMjMgKzIxMCwyMCBAQAogaWYgKG5lZWQpIHsKIAlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAlpZiAoMCA+IGlyKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOwogCWVsc2UKIAkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwotCi0Jc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwogCWlmICgwICE9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KSkgewotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgIiBcCiAJCQkiMHglMDJYIHRvIDB4JTAyWCBmb3IgdGFibGUgNDJcbiIsIHJlZywgc2V0KTsKIAl9IGVsc2UgewogCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCQlpZiAoMCA+IGlyKQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkidG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKIAkJZWxzZQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CiAJfQogfQpAQCAtMjA0LDcgKzIzNSw3IEBACiByZWcgPSAweDA4OwogaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiBpZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggIiBcCisJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCAiIFwKIAkJCQkJCSJzbyBjYW5ub3QgcmVzZXRcbiIsIHJlZyk7CiBlbHNlIHsKIAlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7CkBAIC0yMTIsMTkgKzI0MywxOCBAQAogCQlzZXQgPSBpdHdhcyB8IDB4NDAgOwogCWVsc2UKIAkJc2V0ID0gaXR3YXMgJiB+MHg0MCA7Ci0KLXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KLXJjICA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKLWlmICgwICE9IHJjKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgc2V0KTsKLWVsc2UgewotCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7Ci0JaWYgKDAgPiBpcikKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKLQllbHNlCi0JCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAotCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCXJjICA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKKwlpZiAoMCAhPSByYykKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWFxuIiwgXAorCQkJCQkJCQlyZWcsIHNldCk7CisJZWxzZSB7CisJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CisJCWlmICgwID4gaXIpCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCB0byAweCUwMlhcbiIsIFwKKwkJCQkJCQkJcmVnLCBpc25vdyk7CisJCWVsc2UKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKIAl9CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIzNSw3ICsyNjUsNyBAQAogcmVnID0gMHg0MDsKIGlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogaWYgKDAgPiBpcikKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYICIgXAorCVNBTSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggIiBcCiAJCQkJCQkic28gY2Fubm90IHJlc2V0XG4iLCByZWcpOwogZWxzZSB7CiAJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwpAQCAtMjQzLDE5ICsyNzMsMTggQEAKIAkJc2V0ID0gaXR3YXMgfCAweDgwIDsKIAllbHNlCiAJCXNldCA9IGl0d2FzICYgfjB4ODAgOwotCi1zZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCi1yYyA9IHdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZywgc2V0KTsKLWlmICgwICE9IHJjKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgc2V0KTsKLWVsc2UgewotCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7Ci0JaWYgKDAgPiBpcikKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKLQllbHNlCi0JCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAotCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOworCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOworCWlmICgwICE9IHJjKQorCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCQkJCQkJCXJlZywgc2V0KTsKKwllbHNlIHsKKwkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwkJaWYgKDAgPiBpcikKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkIHRvIDB4JTAyWFxuIiwgXAorCQkJCQkJCQlyZWcsIGlzbm93KTsKKwkJZWxzZQorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjY2LDQxICsyOTUsMzkgQEAKIHJlZyA9IDB4NUE7CiBpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIGlmICgwID4gaXIpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCBidXQgY29udGludWluZ1xuIiwgcmVnKTsKKwlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYIGJ1dCBjb250aW51aW5nXG4iLCByZWcpOwogCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKIAlpZiAocGVhc3ljYXBfc3RhbmRhcmQtPm1hc2sgJiAweDAwMDEpCiAJCXNldCA9IDB4MEEgOwogCWVsc2UKIAkJc2V0ID0gMHgwNyA7Ci0KLQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJaWYgKDAgIT0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIFwKIAkJCQkJCQkJcmVnLCBzZXQpOwogCWVsc2UgewogCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCQlpZiAoMCA+IGlyKQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIgorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIgogCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwogCQllbHNlCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCiAJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwogCX0KLQlpZiAoMCAhPSBjaGVja19zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkKLQkJU0FZKCJFUlJPUjogY2hlY2tfc2FhKCkgZmFpbGVkXG4iKTsKK2lmICh0cnVlID09IHJlc3VibWl0KQorCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFRIRSBBTEdPUklUSE0gRk9SIFJFU1BPTkRJTkcgVE8gVEhFIFZJRElPX1NfRk1UIElPQ1RMIERFUEVORFMgT04gVEhFCi0gKiAgQ1VSUkVOVCBWQUxVRSBPRiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0LgorICogIFRIRSBBTEdPUklUSE0gRk9SIFJFU1BPTkRJTkcgVE8gVEhFIFZJRElPX1NfRk1UIElPQ1RMIFJFUVVJUkVTCisgKiAgQSBWQUxJRCBWQUxVRSBPRiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0LCBPVEhFUldJU0UgLUVCVVNZIElTIFJFVFVSTkVELgorICoKICAqICBQUk9WSURFRCBUSEUgQVJHVU1FTlQgdHJ5IElTIGZhbHNlIEFORCBUSEVSRSBJUyBOTyBQUkVNQVRVUkUgRVJST1IgUkVUVVJOCiAgKiAgVEhJUyBST1VUSU5FIFVQREFURVMgVEhFIEZPTExPV0lORzoKICAqICAgICAgICAgIHBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0CisgKiAgICAgICAgICBwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5mb3JtYXRfb2Zmc2V0CiAgKiAgICAgICAgICBwZWFzeWNhcC0+cGl4ZWxmb3JtYXQKLSAqICAgICAgICAgIHBlYXN5Y2FwLT5maWVsZAogICogICAgICAgICAgcGVhc3ljYXAtPmhlaWdodAogICogICAgICAgICAgcGVhc3ljYXAtPndpZHRoCiAgKiAgICAgICAgICBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbApAQCAtMzIxLDM5ICszNDgsOTMgQEAKIHN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqcGVhc3ljYXBfZm9ybWF0LCAqcGVhc3ljYXBfYmVzdF9mb3JtYXQ7CiBfX3UxNiBtYXNrOwogc3RydWN0IHVzYl9kZXZpY2UgKnA7Ci1pbnQgbWlzcywgbXVsdGlwbGllciwgYmVzdDsKLWNoYXIgYmZbNV0sICpwYzsKK2ludCBtaXNzLCBtdWx0aXBsaWVyLCBiZXN0LCBrOworY2hhciBiZls1XSwgZm9bMzJdLCAqcGM7CiBfX3UzMiB1YzsKK2Jvb2wgcmVzdWJtaXQ7CiAKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQoraWYgKDAgPiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KSB7CisJSk9NKDgsICIlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwlyZXR1cm4gLUVCVVNZOworfQogcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWF5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWF5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIHBjID0gJmJmWzBdOwotdWMgPSBwaXhlbGZvcm1hdDsgIG1lbWNweSgodm9pZCAqKXBjLCAodm9pZCAqKSgmdWMpLCA0KTsgIGJmWzRdID0gMDsKLW1hc2sgPSBlYXN5Y2FwX3N0YW5kYXJkW3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRdLm1hc2s7Ci1TQVkoInNvdWdodDogICAgJWl4JWksJXMoMHglMDhYKSwlaT1maWVsZCwweCUwMlg9c3RkIG1hc2tcbiIsIFwKK3VjID0gcGl4ZWxmb3JtYXQ7CittZW1jcHkoKHZvaWQgKilwYywgKHZvaWQgKikoJnVjKSwgNCk7CitiZls0XSA9IDA7CittYXNrID0gMHhGRiAmIGVhc3ljYXBfc3RhbmRhcmRbcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldF0ubWFzazsKK1NBTSgic291Z2h0OiAgICAlaXglaSwlcygweCUwOFgpLCVpPWZpZWxkLDB4JTAyWD1zdGQgbWFza1xuIiwgXAogCQkJCXdpZHRoLCBoZWlnaHQsIHBjLCBwaXhlbGZvcm1hdCwgZmllbGQsIG1hc2spOworc3dpdGNoIChmaWVsZCkgeworY2FzZSBWNEwyX0ZJRUxEX0FOWTogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0FOWSAiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9OT05FOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfTk9ORSIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX1RPUDogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX1RPUCIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTTogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0JPVFRPTSIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfU0VRX1RCOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfU0VRX1RCIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfU0VRX0JUOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfU0VRX0JUIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfQUxURVJOQVRFOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfQUxURVJOQVRFIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRF9UQjogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfSU5URVJMQUNFRF9CVCIpOworCWJyZWFrOworfQorZGVmYXVsdDogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEXy4uLiBVTktOT1dOICAiKTsKKwlicmVhazsKK30KK30KK1NBTSgic291Z2h0OiAgICAlc1xuIiwgJmZvWzBdKTsKIGlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgewotCWZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOwotCVNBWSgicHJlZmVyOiAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ9ZmllbGQsIHdhcyBWNEwyX0ZJRUxEX0FOWVxuIik7CisJZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJU0FNKCJwcmVmZXI6ICAgIFY0TDJfRklFTERfTk9ORT1maWVsZCwgd2FzIFY0TDJfRklFTERfQU5ZXG4iKTsKIH0KIHBlYXN5Y2FwX2Jlc3RfZm9ybWF0ID0gKHN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqKU5VTEw7CiBwZWFzeWNhcF9mb3JtYXQgPSAmZWFzeWNhcF9mb3JtYXRbMF07CiB3aGlsZSAoMCAhPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKLQlKT1QoMTYsICIuPiAlaSAlaSAweCUwOFggJWl4JWlcbiIsIFwKKwlKT00oMTYsICIuPiAlaSAlaSAweCUwOFggJWl4JWlcbiIsIFwKIAkJcGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgwMSwKIAkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLAogCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQsCiAJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCwKIAkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCk7CiAKLQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDBGKSA9PSAobWFzayAmIDB4MEYpKSAmJiBcCisJaWYgKCgocGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgxRikgPT0gKG1hc2sgJiAweDFGKSkgJiYgXAogCQkocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkID09IGZpZWxkKSAmJiBcCiAJCShwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gXAogCQkJCQkJCXBpeGVsZm9ybWF0KSAmJiBcCkBAIC0zNjUsMTEgKzQ0NiwxMSBAQAogCXBlYXN5Y2FwX2Zvcm1hdCsrOwogfQogaWYgKDAgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSB7Ci0JU0FZKCJjYW5ub3QgZG86ICVpeCVpIHdpdGggc3RhbmRhcmQgbWFzayAweCUwMlhcbiIsIFwKKwlTQU0oImNhbm5vdCBkbzogJWl4JWkgd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAogCQkJCQkJCXdpZHRoLCBoZWlnaHQsIG1hc2spOwogCXBlYXN5Y2FwX2Zvcm1hdCA9ICZlYXN5Y2FwX2Zvcm1hdFswXTsgIGJlc3QgPSAtMTsKIAl3aGlsZSAoMCAhPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKLQkJaWYgKCgocGVhc3ljYXBfZm9ybWF0LT5tYXNrICYgMHgwRikgPT0gKG1hc2sgJiAweDBGKSkgJiYgXAorCQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDFGKSA9PSAobWFzayAmIDB4MUYpKSAmJiBcCiAJCQkJIChwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXhcCiAJCQkJCQkuZmllbGQgPT0gZmllbGQpICYmIFwKIAkJCQkgKHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeFwKQEAgLTM4NiwxNiArNDY3LDE2IEBACiAJCXBlYXN5Y2FwX2Zvcm1hdCsrOwogCX0KIAlpZiAoLTEgPT0gYmVzdCkgewotCQlTQVkoImNhbm5vdCBkbyAlaXguLi4gd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAorCQlTQU0oImNhbm5vdCBkbyAlaXguLi4gd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAogCQkJCQkJCQl3aWR0aCwgbWFzayk7Ci0JCVNBWSgiY2Fubm90IGRvIC4uLnglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCisJCVNBTSgiY2Fubm90IGRvIC4uLnglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCiAJCQkJCQkJCWhlaWdodCwgbWFzayk7Ci0JCVNBWSgiICAgICAgICAgICAlaXglaSB1bm1hdGNoZWRcbiIsIHdpZHRoLCBoZWlnaHQpOworCQlTQU0oIiAgICAgICAgICAgJWl4JWkgdW5tYXRjaGVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKIAkJcmV0dXJuIHBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0OwogCX0KIH0KIGlmICgoc3RydWN0IGVhc3ljYXBfZm9ybWF0ICopTlVMTCA9PSBwZWFzeWNhcF9iZXN0X2Zvcm1hdCkgewotCVNBWSgiTUlTVEFLRTogcGVhc3ljYXBfYmVzdF9mb3JtYXQgaXMgTlVMTCIpOworCVNBTSgiTUlTVEFLRTogcGVhc3ljYXBfYmVzdF9mb3JtYXQgaXMgTlVMTCIpOwogCXJldHVybiAtRUlOVkFMOwogfQogcGVhc3ljYXBfZm9ybWF0ID0gcGVhc3ljYXBfYmVzdF9mb3JtYXQ7CkBAIC00MDYsMjMgKzQ4Nyw0MyBAQAogLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwogCiBpZiAoZmFsc2UgIT0gdHJ5KSB7Ci0JU0FZKCJNSVNUQUtFOiB0cnVlPT10cnkgd2hlcmUgaXMgc2hvdWxkIGJlIGZhbHNlXG4iKTsKKwlTQU0oIk1JU1RBS0U6IHRydWU9PXRyeSB3aGVyZSBpcyBzaG91bGQgYmUgZmFsc2VcbiIpOwogCXJldHVybiAtRUlOVkFMOwogfQotU0FZKCJhY3Rpb25pbmc6ICVpeCVpICVzXG4iLCBcCitTQU0oImFjdGlvbmluZzogJWl4JWkgJXNcbiIsIFwKIAkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCwgXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCwKIAkJCSZwZWFzeWNhcF9mb3JtYXQtPm5hbWVbMF0pOwogcGVhc3ljYXAtPmhlaWdodCAgICAgICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0OwogcGVhc3ljYXAtPndpZHRoICAgICAgICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGg7CiBwZWFzeWNhcC0+cGl4ZWxmb3JtYXQgICA9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdDsKLXBlYXN5Y2FwLT5maWVsZCAgICAgICAgID0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkOwogcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQgPSAoaW50KShwZWFzeWNhcF9mb3JtYXQgLSAmZWFzeWNhcF9mb3JtYXRbMF0pOwotcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgPSAoMHgwMEYwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKSA+PiA0IDsKKworCitmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uZm9ybWF0X29mZnNldF9vaykgeworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uZm9ybWF0X29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0OworCX0KK30KK2lmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmZvcm1hdF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcC0+Zm9ybWF0X29mZnNldDsKKwlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5mb3JtYXRfb2Zmc2V0X29rID0gMTsKK30gZWxzZQorCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOworCisKKworcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgPSAoMHgwMEUwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKSA+PiA1IDsKIGlmICgweDAxMDAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spCiAJcGVhc3ljYXAtPmJ5dGVzd2Fwb3JkZXIgPSB0cnVlOwogZWxzZQogCXBlYXN5Y2FwLT5ieXRlc3dhcG9yZGVyID0gZmFsc2U7CitpZiAoMHgwMjAwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKQorCXBlYXN5Y2FwLT5za2lwID0gNTsKK2Vsc2UKKwlwZWFzeWNhcC0+c2tpcCA9IDA7CiBpZiAoMHgwODAwICYgcGVhc3ljYXBfZm9ybWF0LT5tYXNrKQogCXBlYXN5Y2FwLT5kZWNpbWF0ZXBpeGVsID0gdHJ1ZTsKIGVsc2UKQEAgLTQzOSwyNyArNTQwLDExIEBACiAJCQkJCW11bHRpcGxpZXIgKiBwZWFzeWNhcC0+aGVpZ2h0OwogcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkID0gcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwgKiBcCiAJCQkJCXBlYXN5Y2FwLT53aWR0aCAqIHBlYXN5Y2FwLT5oZWlnaHQ7Ci0KLWlmICh0cnVlID09IHBlYXN5Y2FwLT5vZmZlcmZpZWxkcykgewotCVNBWSgiV0FSTklORzogJWk9cGVhc3ljYXAtPmZpZWxkIGlzIHVudGVzdGVkOiAiIFwKLQkJCQkicGxlYXNlIHJlcG9ydCBwcm9ibGVtc1xuIiwgcGVhc3ljYXAtPmZpZWxkKTsKLQotCi0vKgotICogICAgRklYTUUgLS0tLSBUSElTIElTIFVOVEVTVEVELCBNQVkgQkUgKEFORCBQUk9CQUJMWSBJUykgSU5DT1JSRUNUOgotICoKLSAqICAgIHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfdXNlZCA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfdXNlZCAvIDI7Ci0gKgotICogICAgU08gRE8gTk9UIFJJU0sgSVQgWUVULgotICoKLSAqLwotCi0KLQotfQotCi1raWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOwotCitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmVzdWJtaXQgPSB0cnVlOworCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Cit9IGVsc2UKKwlyZXN1Ym1pdCA9IGZhbHNlOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBQQUwKQEAgLTQ3NCwxMyArNTU5LDEzIEBACiAJCQkoMjg4ID09IFwKIAkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgewogCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDAsIDB4MDAwMSwgMHgwNUEwLCAweDAxMjEpKSB7Ci0JCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlTQU0oIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSBpZiAoKDcwNCA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpICYmIFwKIAkJCSg1NzYgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDA0LCAweDAwMDEsIDB4MDU4NCwgMHgwMTIxKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgaWYgKCgoNjQwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXApAQCAtNDkxLDExICs1NzYsMTEgQEAKIAkJCSgyNDAgPT0gXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CiAJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAxNCwgMHgwMDIwLCAweDA1MTQsIDB4MDExMCkpIHsKLQkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCVNBTSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlIHsKLQkJU0FZKCJNSVNUQUtFOiBiYWQgZm9ybWF0LCBjYW5ub3Qgc2V0IHJlc29sdXRpb25cbiIpOworCQlTQU0oIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUxMiw3ICs1OTcsNyBAQAogCQkJKDI0MCA9PSBcCiAJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDAwLCAweDAwMDMsIDB4MDVBMCwgMHgwMEYzKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgaWYgKCgoNjQwID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXApAQCAtNTIzLDI4ICs2MDgsMzEgQEAKIAkJCSgyNDAgPT0gXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CiAJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAxNCwgMHgwMDAzLCAweDA1MTQsIDB4MDBGMykpIHsKLQkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCVNBTSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlIHsKLQkJU0FZKCJNSVNUQUtFOiBiYWQgZm9ybWF0LCBjYW5ub3Qgc2V0IHJlc29sdXRpb25cbiIpOworCQlTQU0oIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY2hlY2tfc3RrKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KK2lmICh0cnVlID09IHJlc3VibWl0KQorCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKIHJldHVybiAoaW50KShwZWFzeWNhcF9iZXN0X2Zvcm1hdCAtICZlYXN5Y2FwX2Zvcm1hdFswXSk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X2JyaWdodG5lc3Moc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC01NTMsMzcgKzY0MSw1NiBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA8PSBwZWFzeWNhcC0+YnJpZ2h0bmVzcykgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCXBlYXN5Y2FwLT5icmlnaHRuZXNzKSkgeworCQkJaWYgKHBlYXN5Y2FwLT5icmlnaHRuZXNzID09IHZhbHVlKSB7CisJCQkJU0FNKCJ1bmNoYW5nZWQgYnJpZ2h0bmVzcyBhdCAgMHglMDJYXG4iLCBcCisJCQkJCQkJCXZhbHVlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQogCQlwZWFzeWNhcC0+YnJpZ2h0bmVzcyA9IHZhbHVlOworCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5icmlnaHRuZXNzX29rKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5icmlnaHRuZXNzID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5icmlnaHRuZXNzOworCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uYnJpZ2h0bmVzcyA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+YnJpZ2h0bmVzczsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmJyaWdodG5lc3Nfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludClwZWFzeWNhcC0+YnJpZ2h0bmVzczsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWlmICghd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgwQSwgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIGJyaWdodG5lc3MgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oImFkanVzdGluZyBicmlnaHRuZXNzIHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgYnJpZ2h0bmVzcyAiIFwKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzICIgXAogCQkJCQkJCSJ0byAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWJyZWFrOwogCX0KIAlpMSsrOwogfQotU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGJyaWdodG5lc3M6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBhZGp1c3RfY29udHJhc3Qoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC01OTIsMzcgKzY5OSw1OCBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCisKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPmNvbnRyYXN0KSAmJiBcCisJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA+PSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0KSkgeworCQkJaWYgKHBlYXN5Y2FwLT5jb250cmFzdCA9PSB2YWx1ZSkgeworCQkJCVNBTSgidW5jaGFuZ2VkIGNvbnRyYXN0IGF0ICAweCUwMlhcbiIsIHZhbHVlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQogCQlwZWFzeWNhcC0+Y29udHJhc3QgPSB2YWx1ZTsKKwkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uY29udHJhc3Rfb2spIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uY29udHJhc3QgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0OworCQkJfQorCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uY29udHJhc3QgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmNvbnRyYXN0OworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uY29udHJhc3Rfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludCkgKHBlYXN5Y2FwLT5jb250cmFzdCAtIDEyOCk7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEIsIG1vb2QpKSB7Ci0JCQlTQVkoImFkanVzdGluZyBjb250cmFzdCB0byAgMHglMDJYXG4iLCBtb29kKTsKKwkJCVNBTSgiYWRqdXN0aW5nIGNvbnRyYXN0IHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3QgdG8gIiBcCisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3QgdG8gIiBcCiAJCQkJCQkJIjB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJYnJlYWs7CiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgY29udHJhc3Q6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBjb250cmFzdDogY29udHJvbCBub3QgZm91bmRcbiIpOwogcmV0dXJuIC1FTk9FTlQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X3NhdHVyYXRpb24oc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgdmFsdWUpCiB7CiB1bnNpZ25lZCBpbnQgbW9vZDsKLWludCBpMTsKK2ludCBpMSwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC02MzEsMzcgKzc1OSw1OCBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCisJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtIDw9IHBlYXN5Y2FwLT5zYXR1cmF0aW9uKSAmJiBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPj0gXAorCQkJCQkJcGVhc3ljYXAtPnNhdHVyYXRpb24pKSB7CisJCQlpZiAocGVhc3ljYXAtPnNhdHVyYXRpb24gPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCBzYXR1cmF0aW9uIGF0ICAweCUwMlhcbiIsIFwKKwkJCQkJCQkJdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5zYXR1cmF0aW9uID0gdmFsdWU7CisJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspIHsKKwkJCWlmICghcGVhc3ljYXAtPmlucHV0c2V0W2tdLnNhdHVyYXRpb25fb2spIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc2F0dXJhdGlvbiA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+c2F0dXJhdGlvbjsKKwkJCX0KKwkJfQorCQlpZiAoKDAgPD0gcGVhc3ljYXAtPmlucHV0KSAmJiAoSU5QVVRfTUFOWSA+IHBlYXN5Y2FwLT5pbnB1dCkpIHsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnNhdHVyYXRpb24gPSBcCisJCQkJCQkJcGVhc3ljYXAtPnNhdHVyYXRpb247CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5zYXR1cmF0aW9uX29rID0gMTsKKwkJfSBlbHNlCisJCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dFxuIiwgcGVhc3ljYXAtPmlucHV0KTsKIAkJbW9vZCA9IDB4MDBGRiAmICh1bnNpZ25lZCBpbnQpIChwZWFzeWNhcC0+c2F0dXJhdGlvbiAtIDEyOCk7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEMsIG1vb2QpKSB7Ci0JCQlTQVkoImFkanVzdGluZyBzYXR1cmF0aW9uIHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3Rpbmcgc2F0dXJhdGlvbiB0byAgMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHNhdHVyYXRpb24gdG8gIiBcCisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbiB0byAiIFwKIAkJCQkJCQkiMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAl9CiAJaTErKzsKIH0KLVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBzYXR1cmF0aW9uOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbjogY29udHJvbCBub3QgZm91bmRcbiIpOwogcmV0dXJuIC1FTk9FTlQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYWRqdXN0X2h1ZShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKIHsKIHVuc2lnbmVkIGludCBtb29kOwotaW50IGkxLCBpMjsKK2ludCBpMSwgaTIsIGs7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaTEgPSAwOwpAQCAtNjcwLDI3ICs4MTksNDAgQEAKIAkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPiB2YWx1ZSkgfHwgXAogCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtIDwgdmFsdWUpKQogCQkJdmFsdWUgPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmRlZmF1bHRfdmFsdWU7CisKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPmh1ZSkgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCQlwZWFzeWNhcC0+aHVlKSkgeworCQkJaWYgKHBlYXN5Y2FwLT5odWUgPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCBodWUgYXQgIDB4JTAyWFxuIiwgdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5odWUgPSB2YWx1ZTsKKwkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uaHVlX29rKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5odWUgPSBwZWFzeWNhcC0+aHVlOworCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uaHVlID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5odWU7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5odWVfb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQlpMiA9IHBlYXN5Y2FwLT5odWUgLSAxMjg7CiAJCW1vb2QgPSAweDAwRkYgJiAoKGludCkgaTIpOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJaWYgKCF3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDBELCBtb29kKSkgewotCQkJU0FZKCJhZGp1c3RpbmcgaHVlIHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3RpbmcgaHVlIHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlIHRvIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlIHRvIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJYnJlYWs7CiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgaHVlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY5OSwzMyArODYxLDQ1IEBACiBfX3M4IG1vb2Q7CiBpbnQgaTE7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaTEgPSAwOwogd2hpbGUgKDB4RkZGRkZGRkYgIT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCWlmIChWNEwyX0NJRF9BVURJT19WT0xVTUUgPT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCi0JCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtIDwgdmFsdWUpKQorCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPnZvbHVtZSkgJiYgXAorCQkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCQlwZWFzeWNhcC0+dm9sdW1lKSkgeworCQkJaWYgKHBlYXN5Y2FwLT52b2x1bWUgPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCB2b2x1bWUgYXQgIDB4JTAyWFxuIiwgdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT52b2x1bWUgPSB2YWx1ZTsKIAkJbW9vZCA9ICgxNiA+IHBlYXN5Y2FwLT52b2x1bWUpID8gMTYgOiBcCiAJCQkoKDMxIDwgcGVhc3ljYXAtPnZvbHVtZSkgPyAzMSA6IFwKIAkJCShfX3M4KSBwZWFzeWNhcC0+dm9sdW1lKTsKIAkJaWYgKCFhdWRpb19nYWluc2V0KHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIHZvbHVtZSB0byAweCUwMVhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3Rpbmcgdm9sdW1lIHRvIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWUgdG8gIiBcCi0JCQkJCQkJIjB4JTFYXG4iLCBtb29kKTsKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWUgdG8gIiBcCisJCQkJCQkJIjB4JTJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwogCX0KIGkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgdm9sdW1lOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CitTQU0oIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgdm9sdW1lOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc0NCw4ICs5MTgsMTIgQEAKIHsKIGludCBpMTsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC03NTYsMTMgKzkzNCwxMyBAQAogCQljYXNlIDE6IHsKIAkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsKIAkJCXBlYXN5Y2FwLT50aW1ldmFsMC50dl9zZWMgPSAwOwotCQkJU0FZKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKKwkJCVNBTSgiYWRqdXN0aW5nIG11dGU6ICVpPXBlYXN5Y2FwLT5hdWRpb19pZGxlXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJZGVmYXVsdDogewogCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUgPSAwOwotCQkJU0FZKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKKwkJCVNBTSgiYWRqdXN0aW5nIG11dGU6ICVpPXBlYXN5Y2FwLT5hdWRpb19pZGxlXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTc3MSw0NyArOTQ5LDEwNyBAQAogCX0KIAlpMSsrOwogfQotU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGVhc3ljYXBfaW9jdGxfYmtsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgKChkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkgfHwgXAorCShkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwpKSkKK2xvbmcKK2Vhc3ljYXBfaW9jdGxfbm9pbm9kZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpIHsKKwlyZXR1cm4gKGxvbmcpZWFzeWNhcF9pb2N0bCgoc3RydWN0IGlub2RlICopTlVMTCwgZmlsZSwgY21kLCBhcmcpOworfQorI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlR8fEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAorZWFzeWNhcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci1zdGF0aWMgc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlICpwOwotc3RhdGljIF9fdTMyIGlzZXF1ZW5jZTsKK3N0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK3N0cnVjdCB1c2JfZGV2aWNlICpwOworaW50IGtkOwogCitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIHBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC0xOwogfQotcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CitwID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworaWYgKE5VTEwgPT0gcCkgeworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOworaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBNT1NUIE9GIFRIRSBWQVJJQUJMRVMgREVDTEFSRUQgc3RhdGljIElOIFRIRSBjYXNle30gQkxPQ0tTIEJFTE9XIEFSRSBTTwotICogIERFQ0xBUkVEIFNJTVBMWSBUTyBBVk9JRCBBIENPTVBJTEVSIFdBUk5JTkcgT0YgVEhFIEtJTkQ6Ci0gKiAgZWFzeWNhcF9pb2N0bC5jOiB3YXJuaW5nOgotICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmFtZSBzaXplIG9mIC4uLiBieXRlcyBpcyBsYXJnZXIgdGhhbiAxMDI0IGJ5dGVzCi0gKi8KKyAqICBNRUFOV0hJTEUsIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBNQVkgSEFWRSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwLAorICogIElOIFdISUNIIENBU0UgQSBSRVBFQVQgQ0FMTCBUTyBpc2RvbmdsZSgpIFdJTEwgRkFJTC4KKyAqICBJRiBORUNFU1NBUlksIEJBSUwgT1VULgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoa2QgIT0gaXNkb25nbGUocGVhc3ljYXApKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlmIChOVUxMID09IGZpbGUpIHsKKwkJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwkJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXAgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CisJaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KK30gZWxzZSB7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElGIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBIQVMgQUxSRUFEWSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwIEJFRk9SRSBUSEUKKyAqICBBVFRFTVBUIFRPIEFDUVVJUkUgVEhFIFNFTUFQSE9SRSwgaXNkb25nbGUoKSBXSUxMIEhBVkUgRkFJTEVELiAgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJldHVybiAtRVJFU1RBUlRTWVM7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzd2l0Y2ggKGNtZCkgewogY2FzZSBWSURJT0NfUVVFUllDQVA6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2NGwyX2NhcGFiaWxpdHk7Ci0Jc3RhdGljIGNoYXIgdmVyc2lvblsxNl0sICpwMSwgKnAyOwotCXN0YXRpYyBpbnQgaSwgcmMsIGtbM107Ci0Jc3RhdGljIGxvbmcgbG5nOworCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgdjRsMl9jYXBhYmlsaXR5OworCWNoYXIgdmVyc2lvblsxNl0sICpwMSwgKnAyOworCWludCBpLCByYywga1szXTsKKwlsb25nIGxuZzsKIAotCUpPVCg4LCAiVklESU9DX1FVRVJZQ0FQXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RVUVSWUNBUFxuIik7CiAKIAlpZiAoMTYgPD0gc3RybGVuKEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04pKSB7Ci0JCVNBWSgiRVJST1I6IGJhZCBkcml2ZXIgdmVyc2lvbiBzdHJpbmdcbiIpOyByZXR1cm4gLUVJTlZBTDsKKwkJU0FNKCJFUlJPUjogYmFkIGRyaXZlciB2ZXJzaW9uIHN0cmluZ1xuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN0cmNweSgmdmVyc2lvblswXSwgRUFTWUNBUF9EUklWRVJfVkVSU0lPTik7CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKQEAgLTgyNiw4ICsxMDY0LDkgQEAKIAkJaWYgKDMgPiBpKSB7CiAJCQlyYyA9IChpbnQpIHN0cmljdF9zdHJ0b2wocDEsIDEwLCAmbG5nKTsKIAkJCWlmICgwICE9IHJjKSB7Ci0JCQkJU0FZKCJFUlJPUjogJWk9c3RyaWN0X3N0cnRvbCglcywuLCwpXG4iLCBcCisJCQkJU0FNKCJFUlJPUjogJWk9c3RyaWN0X3N0cnRvbCglcywuLCwpXG4iLCBcCiAJCQkJCQkJCXJjLCBwMSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJa1tpXSA9IChpbnQpbG5nOwpAQCAtODQ0LDcgKzEwODMsNyBAQAogCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAKIAl2NGwyX2NhcGFiaWxpdHkudmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKGtbMF0sIGtbMV0sIGtbMl0pOwotCUpPVCg4LCAidjRsMl9jYXBhYmlsaXR5LnZlcnNpb249KCVpLCVpLCVpKVxuIiwga1swXSwga1sxXSwga1syXSk7CisJSk9NKDgsICJ2NGwyX2NhcGFiaWxpdHkudmVyc2lvbj0oJWksJWksJWkpXG4iLCBrWzBdLCBrWzFdLCBrWzJdKTsKIAogCXN0cmxjcHkoJnY0bDJfY2FwYWJpbGl0eS5jYXJkWzBdLCAiRWFzeUNBUCBEQzYwIiwgXAogCQlzaXplb2YodjRsMl9jYXBhYmlsaXR5LmNhcmQpKTsKQEAgLTg1MywyNiArMTA5MiwyNiBAQAogCQkJCXNpemVvZih2NGwyX2NhcGFiaWxpdHkuYnVzX2luZm8pKSA8IDApIHsKIAkJc3RybGNweSgmdjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvWzBdLCAiRWFzeUNBUCBidXNfaW5mbyIsIFwKIAkJCQkJc2l6ZW9mKHY0bDJfY2FwYWJpbGl0eS5idXNfaW5mbykpOwotCQlKT1QoOCwgIiVzPXY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1xuIiwgXAorCQlKT00oOCwgIiVzPXY0bDJfY2FwYWJpbGl0eS5idXNfaW5mb1xuIiwgXAogCQkJCQkmdjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvWzBdKTsKIAl9CiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfY2FwYWJpbGl0eSwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTUlOUFVUOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2lucHV0IHY0bDJfaW5wdXQ7Ci0Jc3RhdGljIF9fdTMyIGluZGV4OworCXN0cnVjdCB2NGwyX2lucHV0IHY0bDJfaW5wdXQ7CisJX191MzIgaW5kZXg7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNSU5QVVRcbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1JTlBVVFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9pbnB1dCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC04ODksNyArMTEyOCw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMTogewpAQCAtOTAxLDcgKzExNDAsNyBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDI6IHsKQEAgLTkxMyw3ICsxMTUyLDcgQEAKIAkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKIAkJCQlWNEwyX1NURF9OVFNDIDsKIAkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAzOiB7CkBAIC05MjUsNyArMTE2NCw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNDogewpAQCAtOTM3LDcgKzExNzYsNyBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDU6IHsKQEAgLTk0OSwzMSArMTE4OCwzMiBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OiB7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGlucHV0c1xuIiwgaW5kZXgpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBpbnB1dHNcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJfQogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfaW5wdXQsIFwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9pbnB1dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19JTlBVVDogewotCXN0YXRpYyBfX3UzMiBpbmRleDsKKwlfX3UzMiBpbmRleDsKIAotCUpPVCg4LCAiVklESU9DX0dfSU5QVVRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfSU5QVVRcbiIpOwogCWluZGV4ID0gKF9fdTMyKXBlYXN5Y2FwLT5pbnB1dDsKLQlKT1QoOCwgInVzZXIgaXMgdG9sZDogJWlcbiIsIGluZGV4KTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJWlcbiIsIGluZGV4KTsKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5kZXgsIHNpemVvZihfX3UzMikpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwpAQCAtOTgxLDc5ICsxMjIxLDg5IEBACiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0lOUFVUOgogCXsKLQlzdGF0aWMgX191MzIgaW5kZXg7CisJX191MzIgaW5kZXg7CisJaW50IHJjOwogCi0JSk9UKDgsICJWSURJT0NfU19JTlBVVFxuIik7CisJSk9NKDgsICJWSURJT0NfU19JTlBVVFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5kZXgsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKF9fdTMyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgaW5wdXQgJWlcbiIsIGluZGV4KTsKKwlKT00oOCwgInVzZXIgcmVxdWVzdHMgaW5wdXQgJWlcbiIsIGluZGV4KTsKIAogCWlmICgoaW50KWluZGV4ID09IHBlYXN5Y2FwLT5pbnB1dCkgewotCQlTQVkoInJlcXVlc3RlZCBpbnB1dCBhbHJlYWR5IGluIGVmZmVjdFxuIik7CisJCVNBTSgicmVxdWVzdGVkIGlucHV0IGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCgwID4gaW5kZXgpIHx8ICg1IDwgaW5kZXgpKSB7Ci0JCUpPVCg4LCAiRVJST1I6ICBiYWQgcmVxdWVzdGVkIGlucHV0OiAlaVxuIiwgaW5kZXgpOworCWlmICgoMCA+IGluZGV4KSB8fCAoSU5QVVRfTUFOWSA8PSBpbmRleCkpIHsKKwkJSk9NKDgsICJFUlJPUjogIGJhZCByZXF1ZXN0ZWQgaW5wdXQ6ICVpXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXBlYXN5Y2FwLT5pbnB1dCA9IChpbnQpaW5kZXg7CiAKLQlzZWxlY3RfaW5wdXQocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+aW5wdXQsIDkpOwotCisJcmMgPSBuZXdpbnB1dChwZWFzeWNhcCwgKGludClpbmRleCk7CisJaWYgKDAgPT0gcmMpIHsKKwkJSk9NKDgsICJuZXdpbnB1dCguLCVpKSBPS1xuIiwgKGludClpbmRleCk7CisJfSBlbHNlIHsKKwkJU0FNKCJFUlJPUjogbmV3aW5wdXQoLiwlaSkgcmV0dXJuZWQgJWlcbiIsIChpbnQpaW5kZXgsIHJjKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNQVVESU86IHsKLQlKT1QoOCwgIlZJRElPQ19FTlVNQVVESU9cbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1BVURJT1xuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTUFVRE9VVDogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9hdWRpb291dCB2NGwyX2F1ZGlvb3V0OworCXN0cnVjdCB2NGwyX2F1ZGlvb3V0IHY0bDJfYXVkaW9vdXQ7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNQVVET1VUXG4iKTsKKwlKT00oOCwgIlZJRElPQ19FTlVNQVVET1VUXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2F1ZGlvb3V0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvb3V0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAoMCAhPSB2NGwyX2F1ZGlvb3V0LmluZGV4KQorCWlmICgwICE9IHY0bDJfYXVkaW9vdXQuaW5kZXgpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJbWVtc2V0KCZ2NGwyX2F1ZGlvb3V0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfYXVkaW9vdXQpKTsKIAl2NGwyX2F1ZGlvb3V0LmluZGV4ID0gMDsKIAlzdHJjcHkoJnY0bDJfYXVkaW9vdXQubmFtZVswXSwgIlNvdW5kdHJhY2siKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2F1ZGlvb3V0LCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpb291dCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllDVFJMOiB7Ci0Jc3RhdGljIGludCBpMTsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHY0bDJfcXVlcnljdHJsOworCWludCBpMTsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdjRsMl9xdWVyeWN0cmw7CiAKLQlKT1QoOCwgIlZJRElPQ19RVUVSWUNUUkxcbiIpOworCUpPTSg4LCAiVklESU9DX1FVRVJZQ1RSTFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9xdWVyeWN0cmwsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlpMSA9IDA7CiAJd2hpbGUgKDB4RkZGRkZGRkYgIT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewogCQlpZiAoZWFzeWNhcF9jb250cm9sW2kxXS5pZCA9PSB2NGwyX3F1ZXJ5Y3RybC5pZCkgewotCQkJSk9UKDgsICJWSURJT0NfUVVFUllDVFJMICAlcz1lYXN5Y2FwX2NvbnRyb2xbJWldIiBcCisJCQlKT00oOCwgIlZJRElPQ19RVUVSWUNUUkwgICVzPWVhc3ljYXBfY29udHJvbFslaV0iIFwKIAkJCQkiLm5hbWVcbiIsICZlYXN5Y2FwX2NvbnRyb2xbaTFdLm5hbWVbMF0sIGkxKTsKIAkJCW1lbWNweSgmdjRsMl9xdWVyeWN0cmwsICZlYXN5Y2FwX2NvbnRyb2xbaTFdLCBcCiAJCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7CkBAIC0xMDYyLDEyNyArMTMxMiwxMzcgQEAKIAkJaTErKzsKIAl9CiAJaWYgKDB4RkZGRkZGRkYgPT0gZWFzeWNhcF9jb250cm9sW2kxXS5pZCkgewotCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBjb250cm9sc1xuIiwgaTEpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBjb250cm9sc1xuIiwgaTEpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9xdWVyeWN0cmwsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllNRU5VOiB7Ci0JSk9UKDgsICJWSURJT0NfUVVFUllNRU5VIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RVUVSWU1FTlUgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKLQlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfQ1RSTDogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIHY0bDJfY29udHJvbDsKKwlzdHJ1Y3QgdjRsMl9jb250cm9sICpwdjRsMl9jb250cm9sOwogCi0JSk9UKDgsICJWSURJT0NfR19DVFJMXG4iKTsKLQotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2NvbnRyb2wsICh2b2lkIF9fdXNlciAqKWFyZywgXAorCUpPTSg4LCAiVklESU9DX0dfQ1RSTFxuIik7CisJcHY0bDJfY29udHJvbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB2NGwyX2NvbnRyb2wpIHsKKwkJU0FNKCJFUlJPUjogb3V0IG9mIG1lbW9yeVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKHB2NGwyX2NvbnRyb2wsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2NvbnRyb2wpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXN3aXRjaCAodjRsMl9jb250cm9sLmlkKSB7CisJc3dpdGNoIChwdjRsMl9jb250cm9sLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogewotCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+YnJpZ2h0bmVzczsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIGJyaWdodG5lc3M6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT5icmlnaHRuZXNzOworCQlKT00oOCwgInVzZXIgZW5xdWlyZXMgYnJpZ2h0bmVzczogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPmNvbnRyYXN0OwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgY29udHJhc3Q6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT5jb250cmFzdDsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIGNvbnRyYXN0OiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiB7Ci0JCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT5zYXR1cmF0aW9uOwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgc2F0dXJhdGlvbjogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPnNhdHVyYXRpb247CisJCUpPTSg4LCAidXNlciBlbnF1aXJlcyBzYXR1cmF0aW9uOiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9IVUU6IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPmh1ZTsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIGh1ZTogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPmh1ZTsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIGh1ZTogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOiB7Ci0JCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT52b2x1bWU7Ci0JCUpPVCg4LCAidXNlciBlbnF1aXJlcyB2b2x1bWU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHBlYXN5Y2FwLT52b2x1bWU7CisJCUpPTSg4LCAidXNlciBlbnF1aXJlcyB2b2x1bWU6ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IHsKIAkJaWYgKDEgPT0gcGVhc3ljYXAtPm11dGUpCi0JCQl2NGwyX2NvbnRyb2wudmFsdWUgPSB0cnVlOworCQkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSB0cnVlOwogCQllbHNlCi0JCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBmYWxzZTsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIG11dGU6ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSBmYWxzZTsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIG11dGU6ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OiB7Ci0JCVNBWSgiRVJST1I6IHVua25vd24gVjRMMiBjb250cm9sOiAweCUwOFg9aWRcbiIsIFwKLQkJCQkJCQl2NGwyX2NvbnRyb2wuaWQpOwotCQlleHBsYWluX2NpZCh2NGwyX2NvbnRyb2wuaWQpOworCQlTQU0oIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCisJCQkJCQkJcHY0bDJfY29udHJvbC0+aWQpOworCQlrZnJlZShwdjRsMl9jb250cm9sKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJfQotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2NvbnRyb2wsIFwKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9jb250cm9sLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfY29udHJvbCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWtmcmVlKHB2NGwyX2NvbnRyb2wpOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTF9PTEQpCiBjYXNlIFZJRElPQ19TX0NUUkxfT0xEOiB7Ci0JSk9UKDgsICJWSURJT0NfU19DVFJMX09MRCByZXF1aXJlZCBhdCBsZWFzdCBmb3IgeGF3dHZcbiIpOworCUpPTSg4LCAiVklESU9DX1NfQ1RSTF9PTEQgcmVxdWlyZWQgYXQgbGVhc3QgZm9yIHhhd3R2XG4iKTsKIH0KICNlbmRpZiAvKlZJRElPQ19TX0NUUkxfT0xEKi8KIGNhc2UgVklESU9DX1NfQ1RSTDoKIAl7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdjRsMl9jb250cm9sOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgdjRsMl9jb250cm9sOwogCi0JSk9UKDgsICJWSURJT0NfU19DVFJMXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0NUUkxcbiIpOwogCiAJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfY29udHJvbCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlzd2l0Y2ggKHY0bDJfY29udHJvbC5pZCkgewogCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgYnJpZ2h0bmVzcyAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJSk9NKDgsICJ1c2VyIHJlcXVlc3RzIGJyaWdodG5lc3MgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CiAJCWlmICgwICE9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgY29udHJhc3QgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCUpPTSg4LCAidXNlciByZXF1ZXN0cyBjb250cmFzdCAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X2NvbnRyYXN0KHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiB7Ci0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBzYXR1cmF0aW9uICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgc2F0dXJhdGlvbiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X3NhdHVyYXRpb24ocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCiAJCQk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0hVRTogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgaHVlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgaHVlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAoMCAhPSBhZGp1c3RfaHVlKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IHsKLQkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIHZvbHVtZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJSk9NKDgsICJ1c2VyIHJlcXVlc3RzIHZvbHVtZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgdjRsMl9jb250cm9sLnZhbHVlKSkKIAkJCTsKIAkJYnJlYWs7CkBAIC0xMTkwLDQwICsxNDUwLDQxIEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiB7CiAJCWludCBtdXRlOwogCi0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBtdXRlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgbXV0ZSAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKHRydWUgPT0gdjRsMl9jb250cm9sLnZhbHVlKQogCQkJbXV0ZSA9IDE7CiAJCWVsc2UKIAkJCW11dGUgPSAwOwogCiAJCWlmICgwICE9IGFkanVzdF9tdXRlKHBlYXN5Y2FwLCBtdXRlKSkKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlIHRvICVpXG4iLCBtdXRlKTsKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBtdXRlIHRvICVpXG4iLCBtdXRlKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJFUlJPUjogdW5rbm93biBWNEwyIGNvbnRyb2w6IDB4JTA4WD1pZFxuIiwgXAorCQlTQU0oIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCiAJCQkJCQkJdjRsMl9jb250cm9sLmlkKTsKLQkJZXhwbGFpbl9jaWQodjRsMl9jb250cm9sLmlkKTsKLQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQorCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0VYVF9DVFJMUzogewotCUpPVCg4LCAiVklESU9DX1NfRVhUX0NUUkxTIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0VYVF9DVFJMUyB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTV9GTVQ6IHsKLQlzdGF0aWMgX191MzIgaW5kZXg7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2ZtdGRlc2MgdjRsMl9mbXRkZXNjOworCV9fdTMyIGluZGV4OworCXN0cnVjdCB2NGwyX2ZtdGRlc2MgdjRsMl9mbXRkZXNjOwogCi0JSk9UKDgsICJWSURJT0NfRU5VTV9GTVRcbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1fRk1UXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2ZtdGRlc2MsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm10ZGVzYykpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xMjM4LDExNyArMTQ5OSwzMjcgQEAKIAkJdjRsMl9mbXRkZXNjLmZsYWdzID0gMDsKIAkJc3RyY3B5KCZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0sICJ1eXZ5Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAxOiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAieXV5MiIpOwogCQl2NGwyX2ZtdGRlc2MucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMjogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjI0Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMzogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInJnYjMyIik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNDogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjI0Iik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IyNDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNTogewogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgImJncjMyIik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgZm9ybWF0c1xuIiwgaW5kZXgpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBmb3JtYXRzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCX0KIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mbXRkZXNjLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKgorICogIFRIRSBSRVNQT05TRSBUTyBWSURJT0NfRU5VTV9GUkFNRVNJWkVTIE1VU1QgQkUgQ09ORElUSU9ORUQgT04gVEhFCisgKiAgVEhFIENVUlJFTlQgU1RBTkRBUkQsIEJFQ0FVU0UgVEhBVCBJUyBXSEFUIGdzdHJlYW1lciBFWFBFQ1RTLiAgQkVXQVJFLgorKi8KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0VOVU1fRlJBTUVTSVpFUzogewotCUpPVCg4LCAiVklESU9DX0VOVU1fRlJBTUVTSVpFUyB1bnN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJX191MzIgaW5kZXg7CisJc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gdjRsMl9mcm1zaXplZW51bTsKKworCUpPTSg4LCAiVklESU9DX0VOVU1fRlJBTUVTSVpFU1xuIik7CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mcm1zaXplZW51bSwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5kZXggPSB2NGwyX2ZybXNpemVlbnVtLmluZGV4OworCisJdjRsMl9mcm1zaXplZW51bS50eXBlID0gKF9fdTMyKSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURTsKKworCWlmICh0cnVlID09IHBlYXN5Y2FwLT5udHNjKSB7CisJCXN3aXRjaCAoaW5kZXgpIHsKKwkJY2FzZSAwOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gNjQwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSA0ODA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQkgZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSAzMjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDI0MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gNzIwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSA0ODA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDM2MDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gMjQwOworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OiB7CisJCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBmcmFtZXNpemVzXG4iLCBpbmRleCk7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChpbmRleCkgeworCQljYXNlIDA6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA2NDA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDQ4MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAxOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gMzIwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSAyNDA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMjogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDcwNDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gNTc2OworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA3MjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDU3NjsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSA0OiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gMzYwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSAyODg7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZyYW1lc2l6ZXNcbiIsIGluZGV4KTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCX0KKwl9CisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfZnJtc2l6ZWVudW0sIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CiB9CisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKgorICogIFRIRSBSRVNQT05TRSBUTyBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUyBNVVNUIEJFIENPTkRJVElPTkVEIE9OIFRIRQorICogIFRIRSBDVVJSRU5UIFNUQU5EQVJELCBCRUNBVVNFIFRIQVQgSVMgV0hBVCBnc3RyZWFtZXIgRVhQRUNUUy4gIEJFV0FSRS4KKyovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTOiB7Ci0JSk9UKDgsICJWSURJT0NfRU5VTV9GUkFNRV9JTlRFUlZBTFMgdW5zdXBwb3J0ZWRcbiIpOwotCXJldHVybiAtRUlOVkFMOworCV9fdTMyIGluZGV4OworCWludCBkZW5vbWluYXRvcjsKKwlzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSB2NGwyX2ZybWl2YWxlbnVtOworCisJSk9NKDgsICJWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMU1xuIik7CisKKwlpZiAocGVhc3ljYXAtPmZwcykKKwkJZGVub21pbmF0b3IgPSBwZWFzeWNhcC0+ZnBzOworCWVsc2UgeworCQlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykKKwkJCWRlbm9taW5hdG9yID0gMzA7CisJCWVsc2UKKwkJCWRlbm9taW5hdG9yID0gMjU7CisJfQorCisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZnJtaXZhbGVudW0sICh2b2lkIF9fdXNlciAqKWFyZywgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWluZGV4ID0gdjRsMl9mcm1pdmFsZW51bS5pbmRleDsKKworCXY0bDJfZnJtaXZhbGVudW0udHlwZSA9IChfX3UzMikgVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEU7CisKKwlzd2l0Y2ggKGluZGV4KSB7CisJY2FzZSAwOiB7CisJCXY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yID0gMTsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yOworCQlKT00oOCwgIiVpPWluZGV4OiAlaS8laVxuIiwgaW5kZXgsIFwKKwkJCShpbnQpKHY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yKSwgXAorCQkJKGludCkodjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvcikpOworCQlicmVhazsKKwl9CisJY2FzZSAxOiB7CisJCXY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUubnVtZXJhdG9yID0gMTsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yLzU7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVpLyVpXG4iLCBpbmRleCwgXAorCQkJKGludCkodjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5udW1lcmF0b3IpLCBcCisJCQkoaW50KSh2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLmRlbm9taW5hdG9yKSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OiB7CisJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZyYW1laW50ZXJ2YWxzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCX0KKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mcm1pdmFsZW51bSwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZnJtaXZhbGVudW0pKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfRk1UOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7CisJc3RydWN0IHY0bDJfZm9ybWF0ICpwdjRsMl9mb3JtYXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcHY0bDJfcGl4X2Zvcm1hdDsKIAotCUpPVCg4LCAiVklESU9DX0dfRk1UXG4iKTsKLQotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2Zvcm1hdCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJSk9NKDgsICJWSURJT0NfR19GTVRcbiIpOworCXB2NGwyX2Zvcm1hdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCksIEdGUF9LRVJORUwpOworCWlmICghcHY0bDJfZm9ybWF0KSB7CisJCVNBTSgiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwdjRsMl9waXhfZm9ybWF0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCksIEdGUF9LRVJORUwpOworCWlmICghcHY0bDJfcGl4X2Zvcm1hdCkgeworCQlTQU0oIkVSUk9SOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJa2ZyZWUocHY0bDJfZm9ybWF0KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIocHY0bDJfZm9ybWF0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2Zvcm1hdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQlQT1VUOworCWlmIChwdjRsMl9mb3JtYXQtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1lbXNldCgmdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOwotCXY0bDJfZm9ybWF0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JbWVtY3B5KCYodjRsMl9mb3JtYXQuZm10LnBpeCksIFwKLQkJCSAmKGVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XVwKLQkJCS52NGwyX2Zvcm1hdC5mbXQucGl4KSwgc2l6ZW9mKHY0bDJfcGl4X2Zvcm1hdCkpOwotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCW1lbXNldChwdjRsMl9waXhfZm9ybWF0LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCXB2NGwyX2Zvcm1hdC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwltZW1jcHkoJnB2NGwyX2Zvcm1hdC0+Zm10LnBpeCwgXAorCQkJICZlYXN5Y2FwX2Zvcm1hdFtwZWFzeWNhcC0+Zm9ybWF0X29mZnNldF1cCisJCQkudjRsMl9mb3JtYXQuZm10LnBpeCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJXNcbiIsIFwKIAkJCSZlYXN5Y2FwX2Zvcm1hdFtwZWFzeWNhcC0+Zm9ybWF0X29mZnNldF0ubmFtZVswXSk7CiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mb3JtYXQsIFwKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9mb3JtYXQsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KKwlrZnJlZShwdjRsMl9mb3JtYXQpOworCWtmcmVlKHB2NGwyX3BpeF9mb3JtYXQpOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfVFJZX0ZNVDoKIGNhc2UgVklESU9DX1NfRk1UOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7Ci0Jc3RhdGljIGJvb2wgdHJ5OwotCXN0YXRpYyBpbnQgYmVzdF9mb3JtYXQ7CisJc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgdjRsMl9waXhfZm9ybWF0OworCWJvb2wgdHJ5OworCWludCBiZXN0X2Zvcm1hdDsKIAogCWlmIChWSURJT0NfVFJZX0ZNVCA9PSBjbWQpIHsKLQkJSk9UKDgsICJWSURJT0NfVFJZX0ZNVFxuIik7CisJCUpPTSg4LCAiVklESU9DX1RSWV9GTVRcbiIpOwogCQl0cnkgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCUpPVCg4LCAiVklESU9DX1NfRk1UXG4iKTsKKwkJSk9NKDgsICJWSURJT0NfU19GTVRcbiIpOwogCQl0cnkgPSBmYWxzZTsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mb3JtYXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTEzNTksNyArMTgzMCwxMiBAQAogCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLCBcCiAJCQkJCXRyeSk7CiAJaWYgKDAgPiBiZXN0X2Zvcm1hdCkgewotCQlKT1QoOCwgIldBUk5JTkc6IGFkanVzdF9mb3JtYXQoKSByZXR1cm5lZCAlaVxuIiwgYmVzdF9mb3JtYXQpOworCQlpZiAoLUVCVVNZID09IGJlc3RfZm9ybWF0KSB7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCUpPTSg4LCAiV0FSTklORzogYWRqdXN0X2Zvcm1hdCgpIHJldHVybmVkICVpXG4iLCBiZXN0X2Zvcm1hdCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogLyouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qLwpAQCAtMTM2OCwyOSArMTg0NCwyOSBAQAogCiAJbWVtY3B5KCYodjRsMl9mb3JtYXQuZm10LnBpeCksICYoZWFzeWNhcF9mb3JtYXRbYmVzdF9mb3JtYXRdXAogCQkJLnY0bDJfZm9ybWF0LmZtdC5waXgpLCBzaXplb2YodjRsMl9waXhfZm9ybWF0KSk7Ci0JSk9UKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCAmZWFzeWNhcF9mb3JtYXRbYmVzdF9mb3JtYXRdLm5hbWVbMF0pOworCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgJmVhc3ljYXBfZm9ybWF0W2Jlc3RfZm9ybWF0XS5uYW1lWzBdKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2Zvcm1hdCwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19DUk9QQ0FQOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2Nyb3BjYXAgdjRsMl9jcm9wY2FwOworCXN0cnVjdCB2NGwyX2Nyb3BjYXAgdjRsMl9jcm9wY2FwOwogCi0JSk9UKDgsICJWSURJT0NfQ1JPUENBUFxuIik7CisJSk9NKDgsICJWSURJT0NfQ1JPUENBUFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9jcm9wY2FwLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Nyb3BjYXApKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmICh2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCUpPVCg4LCAidjRsMl9jcm9wY2FwLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXG4iKTsKKwkJSk9NKDgsICJ2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVcbiIpOwogCiAJbWVtc2V0KCZ2NGwyX2Nyb3BjYXAsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSk7CiAJdjRsMl9jcm9wY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CkBAIC0xNDA1LDExICsxODgxLDExIEBACiAJdjRsMl9jcm9wY2FwLnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7CiAJdjRsMl9jcm9wY2FwLnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKIAotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlaXglaVxuIiwgcGVhc3ljYXAtPndpZHRoLCBwZWFzeWNhcC0+aGVpZ2h0KTsKKwlKT00oOCwgInVzZXIgaXMgdG9sZDogJWl4JWlcbiIsIHBlYXN5Y2FwLT53aWR0aCwgcGVhc3ljYXAtPmhlaWdodCk7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9jcm9wY2FwLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jcm9wY2FwKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CkBAIC0xNDE3LDEzICsxODkzLDE1IEBACiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX0NST1A6CiBjYXNlIFZJRElPQ19TX0NST1A6IHsKLQlKT1QoOCwgIlZJRElPQ19HX0NST1B8VklESU9DX1NfQ1JPUCAgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfQ1JPUHxWSURJT0NfU19DUk9QICB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllTVEQ6IHsKLQlKT1QoOCwgIlZJRElPQ19RVUVSWVNURDogIiBcCisJSk9NKDgsICJWSURJT0NfUVVFUllTVEQ6ICIgXAogCQkJIkVhc3lDQVAgaXMgaW5jYXBhYmxlIG9mIGRldGVjdGluZyBzdGFuZGFyZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogCWJyZWFrOwogfQpAQCAtMTQzNiwxNiArMTkxNCwxNiBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIFZJRElPQ19FTlVNU1REOiB7Ci0Jc3RhdGljIGludCBsYXN0MCA9IC0xLCBsYXN0MSA9IC0xLCBsYXN0MiA9IC0xLCBsYXN0MyA9IC0xOwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2NGwyX3N0YW5kYXJkOwotCXN0YXRpYyBfX3UzMiBpbmRleDsKLQlzdGF0aWMgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworCWludCBsYXN0MCA9IC0xLCBsYXN0MSA9IC0xLCBsYXN0MiA9IC0xLCBsYXN0MyA9IC0xOworCXN0cnVjdCB2NGwyX3N0YW5kYXJkIHY0bDJfc3RhbmRhcmQ7CisJX191MzIgaW5kZXg7CisJc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOwogCi0JSk9UKDgsICJWSURJT0NfRU5VTVNURFxuIik7CisJSk9NKDgsICJWSURJT0NfRU5VTVNURFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9zdGFuZGFyZCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWluZGV4ID0gdjRsMl9zdGFuZGFyZC5pbmRleDsKQEAgLTE0NjYsMTAgKzE5NDQsMTEgQEAKIAkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKIAl9CiAJaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgewotCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBzdGFuZGFyZHNcbiIsIGluZGV4KTsKKwkJSk9NKDgsICIlaT1pbmRleDogZXhoYXVzdHMgc3RhbmRhcmRzXG4iLCBpbmRleCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgXAorCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgXAogCQkJCSYocGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQubmFtZVswXSkpOwogCW1lbWNweSgmdjRsMl9zdGFuZGFyZCwgJihwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZCksIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSk7CkBAIC0xNDc4LDg3ICsxOTU3LDEwMSBAQAogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfc3RhbmRhcmQsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX1NURDogewotCXN0YXRpYyB2NGwyX3N0ZF9pZCBzdGRfaWQ7Ci0Jc3RhdGljIHN0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKKwl2NGwyX3N0ZF9pZCBzdGRfaWQ7CisJc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOwogCi0JSk9UKDgsICJWSURJT0NfR19TVERcbiIpOworCUpPTSg4LCAiVklESU9DX0dfU1REXG4iKTsKKworCWlmICgwID4gcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCkgeworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmc3RkX2lkLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XTsKIAlzdGRfaWQgPSBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZDsKIAotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAorCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAogCQkJCSZwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5uYW1lWzBdKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzdGRfaWQsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19TVEQ6IHsKLQlzdGF0aWMgdjRsMl9zdGRfaWQgc3RkX2lkOwotCXN0YXRpYyBpbnQgcmM7CisJdjRsMl9zdGRfaWQgc3RkX2lkOworCWludCByYzsKIAotCUpPVCg4LCAiVklESU9DX1NfU1REXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX1NURFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmc3RkX2lkLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJCXNpemVvZih2NGwyX3N0ZF9pZCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJSk9NKDgsICJVc2VyIHJlcXVlc3RzIHN0YW5kYXJkOiAweCUwOFglMDhYXG4iLCBcCisJCShpbnQpKChzdGRfaWQgJiAoKCh2NGwyX3N0ZF9pZCkweEZGRkZGRkZGKSA8PCAzMikpID4+IDMyKSwgXAorCQkoaW50KShzdGRfaWQgJiAoKHY0bDJfc3RkX2lkKTB4RkZGRkZGRkYpKSk7CisKIAlyYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgc3RkX2lkKTsKIAlpZiAoMCA+IHJjKSB7Ci0JCUpPVCg4LCAiV0FSTklORzogYWRqdXN0X3N0YW5kYXJkKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJSk9NKDgsICJXQVJOSU5HOiBhZGp1c3Rfc3RhbmRhcmQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1JFUUJVRlM6IHsKLQlzdGF0aWMgaW50IG5idWZmZXJzOwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB2NGwyX3JlcXVlc3RidWZmZXJzOworCWludCBuYnVmZmVyczsKKwlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB2NGwyX3JlcXVlc3RidWZmZXJzOwogCi0JSk9UKDgsICJWSURJT0NfUkVRQlVGU1xuIik7CisJSk9NKDgsICJWSURJT0NfUkVRQlVGU1xuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9yZXF1ZXN0YnVmZmVycywgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAluYnVmZmVycyA9IHY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQ7Ci0JSk9UKDgsICIgICAgICAgICAgICAgICAgICAgVXNlciByZXF1ZXN0cyAlaSBidWZmZXJzIC4uLlxuIiwgbmJ1ZmZlcnMpOworCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgIFVzZXIgcmVxdWVzdHMgJWkgYnVmZmVycyAuLi5cbiIsIG5idWZmZXJzKTsKIAlpZiAobmJ1ZmZlcnMgPCAyKQogCQluYnVmZmVycyA9IDI7CiAJaWYgKG5idWZmZXJzID4gRlJBTUVfQlVGRkVSX01BTlkpCiAJCW5idWZmZXJzID0gRlJBTUVfQlVGRkVSX01BTlk7CiAJaWYgKHY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQgPT0gbmJ1ZmZlcnMpIHsKLQkJSk9UKDgsICIgICAgICAgICAgICAgICAgICAgLi4uIGFncmVlIHRvICAlaSBidWZmZXJzXG4iLCBcCisJCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgIC4uLiBhZ3JlZSB0byAgJWkgYnVmZmVyc1xuIiwgXAogCQkJCQkJCQluYnVmZmVycyk7CiAJfSBlbHNlIHsKLQkJSk9UKDgsICIgICAgICAgICAgICAgICAgICAuLi4gaW5zaXN0IG9uICAlaSBidWZmZXJzXG4iLCBcCisJCUpPTSg4LCAiICAgICAgICAgICAgICAgICAgLi4uIGluc2lzdCBvbiAgJWkgYnVmZmVyc1xuIiwgXAogCQkJCQkJCQluYnVmZmVycyk7CiAJCXY0bDJfcmVxdWVzdGJ1ZmZlcnMuY291bnQgPSBuYnVmZmVyczsKIAl9CkBAIC0xNTY2LDMyICsyMDU5LDM1IEBACiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9yZXF1ZXN0YnVmZmVycywgXAogCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUVVFUllCVUY6IHsKLQlzdGF0aWMgX191MzIgaW5kZXg7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CiAKLQlKT1QoOCwgIlZJRElPQ19RVUVSWUJVRlxuIik7CisJSk9NKDgsICJWSURJT0NfUVVFUllCVUZcbiIpOwogCiAJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpIHsKLQkJSk9UKDgsICJyZXR1cm5pbmcgLTEgYmVjYXVzZSAgJWk9dmlkZW9fZW9mXG4iLCBcCisJCUpPTSg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgJWk9dmlkZW9fZW9mXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2VvZik7Ci0JCXJldHVybiAtMTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9idWZmZXIsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWluZGV4ID0gdjRsMl9idWZmZXIuaW5kZXg7CiAJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTYwMiw0OSArMjA5OCw1NSBAQAogCXY0bDJfYnVmZmVyLmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBcCiAJCQkJCQlwZWFzeWNhcC0+ZG9uZVtpbmRleF0gfCBcCiAJCQkJCQlwZWFzeWNhcC0+cXVldWVkW2luZGV4XTsKLQl2NGwyX2J1ZmZlci5maWVsZCA9IHBlYXN5Y2FwLT5maWVsZDsKKwl2NGwyX2J1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAl2NGwyX2J1ZmZlci5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCXY0bDJfYnVmZmVyLm0ub2Zmc2V0ID0gaW5kZXggKiBGUkFNRV9CVUZGRVJfU0laRTsKIAl2NGwyX2J1ZmZlci5sZW5ndGggPSBGUkFNRV9CVUZGRVJfU0laRTsKIAotCUpPVCgxNiwgIiAgJTEwaT1pbmRleFxuIiwgdjRsMl9idWZmZXIuaW5kZXgpOwotCUpPVCgxNiwgIiAgMHglMDhYPXR5cGVcbiIsIHY0bDJfYnVmZmVyLnR5cGUpOwotCUpPVCgxNiwgIiAgJTEwaT1ieXRlc3VzZWRcbiIsIHY0bDJfYnVmZmVyLmJ5dGVzdXNlZCk7Ci0JSk9UKDE2LCAiICAweCUwOFg9ZmxhZ3NcbiIsIHY0bDJfYnVmZmVyLmZsYWdzKTsKLQlKT1QoMTYsICIgICUxMGk9ZmllbGRcbiIsIHY0bDJfYnVmZmVyLmZpZWxkKTsKLQlKT1QoMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl91c2VjXG4iLCBcCisJSk9NKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7CisJSk9NKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7CisJSk9NKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKKwlKT00oMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOworCUpPTSgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOworCUpPTSgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3VzZWNcbiIsIFwKIAkJCQkJIChsb25nKXY0bDJfYnVmZmVyLnRpbWVzdGFtcC50dl91c2VjKTsKLQlKT1QoMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKLQlKT1QoMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7Ci0JSk9UKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7Ci0JSk9UKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKKwlKT00oMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKKwlKT00oMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7CisJSk9NKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7CisJSk9NKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2J1ZmZlciwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RQlVGOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CiAKLQlKT1QoOCwgIlZJRElPQ19RQlVGXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RQlVGXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2J1ZmZlciwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodjRsMl9idWZmZXIubWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJfQorCWlmICh2NGwyX2J1ZmZlci5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlpZiAodjRsMl9idWZmZXIuaW5kZXggPCAwIHx8IFwKLQkJICh2NGwyX2J1ZmZlci5pbmRleCA+PSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkpKQorCQkgKHY0bDJfYnVmZmVyLmluZGV4ID49IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwogCiAJcGVhc3ljYXAtPmRvbmVbdjRsMl9idWZmZXIuaW5kZXhdICAgPSAwOwpAQCAtMTY1MiwxMSArMjE1NCwxMSBAQAogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfYnVmZmVyLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCUpPVCg4LCAiLi4uLi4gICB1c2VyIHF1ZXVlaW5nIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAorCUpPTSg4LCAiLi4uLi4gICB1c2VyIHF1ZXVlaW5nIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAogCQkJCQkJKGludCl2NGwyX2J1ZmZlci5pbmRleCk7CiAKIAlwZWFzeWNhcC0+ZnJhbWVfbG9jayA9IDA7CkBAIC0xNjY3LDM2ICsyMTY5LDYwIEBACiBjYXNlIFZJRElPQ19EUUJVRjoKIAl7CiAjaWYgZGVmaW5lZChBVURJT1RJTUUpCi0Jc3RhdGljIHN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCBzZHI7Ci0Jc3RhdGljIGxvbmcgbG9uZyBpbnQgYWJvdmUsIGJlbG93LCBkbmJ5ZHQsIGZ1ZGdlLCBzbGw7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWxsOwotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMDsKKwlzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOworCWxvbmcgbG9uZyBpbnQgYWJvdmUsIGJlbG93LCBkbmJ5ZHQsIGZ1ZGdlLCBzbGw7CisJdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGw7CisJc3RydWN0IHRpbWV2YWwgdGltZXZhbDg7CiAJc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7CiAjZW5kaWYgLypBVURJT1RJTUUqLwotCXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsLCB0aW1ldmFsMjsKLQlzdGF0aWMgaW50IGksIGo7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsLCB0aW1ldmFsMjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsMl9idWZmZXI7CisJaW50IHJjZHE7CisJX191MTYgaW5wdXQ7CiAKLQlKT1QoOCwgIlZJRElPQ19EUUJVRlxuIik7CisJSk9NKDgsICJWSURJT0NfRFFCVUZcbiIpOwogCiAJaWYgKChwZWFzeWNhcC0+dmlkZW9faWRsZSkgfHwgKHBlYXN5Y2FwLT52aWRlb19lb2YpKSB7Ci0JCUpPVCg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgIiBcCisJCUpPTSg4LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSAgIiBcCiAJCQkJIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2VvZlxuIiwgXAogCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9idWZmZXIsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKSB7CisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkvKgorCQkgKiAgSU4gSVRTIDUwICJmcHMiIE1PREUgdHZ0aW1lIFNFRU1TIEFMV0FZUyBUTyBSRVFVRVNUCisJCSAqICBWNEwyX0ZJRUxEX0JPVFRPTQorCQkqLworCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJaWYgKFY0TDJfRklFTERfVE9QID09IHY0bDJfYnVmZmVyLmZpZWxkKQorCQkJSk9NKDgsICJ1c2VyIHdhbnRzIFY0TDJfRklFTERfVE9QXG4iKTsKKwkJZWxzZSBpZiAoVjRMMl9GSUVMRF9CT1RUT00gPT0gdjRsMl9idWZmZXIuZmllbGQpCisJCQlKT00oOCwgInVzZXIgd2FudHMgVjRMMl9GSUVMRF9CT1RUT01cbiIpOworCQllbHNlIGlmIChWNEwyX0ZJRUxEX0FOWSA9PSB2NGwyX2J1ZmZlci5maWVsZCkKKwkJCUpPTSg4LCAidXNlciB3YW50cyBWNEwyX0ZJRUxEX0FOWVxuIik7CisJCWVsc2UKKwkJCUpPTSg4LCAidXNlciB3YW50cyBWNEwyX0ZJRUxEXy4uLlVOS05PV046ICVpXG4iLCBcCisJCQkJCQkJdjRsMl9idWZmZXIuZmllbGQpOworCX0KIAogCWlmICghcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAtRUlPIGJlY2F1c2UgdmlkZW8gdXJicyBub3Qgc3RyZWFtaW5nXG4iKTsKKwkJSk9NKDE2LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSB2aWRlbyB1cmJzIG5vdCBzdHJlYW1pbmdcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlPOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE3MDgsMTkgKzIyMzQsMjggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCWlmICghcGVhc3ljYXAtPnBvbGxlZCkgewotCQlpZiAoLUVJTyA9PSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKSkKLQkJCXJldHVybiAtRUlPOworCQlkbyB7CisJCQlyY2RxID0gZWFzeWNhcF9kcWJ1ZihwZWFzeWNhcCwgMCk7CisJCQlpZiAoLUVJTyA9PSByY2RxKSB7CisJCQkJSk9NKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICIgXAorCQkJCQkJImRxYnVmKCkgcmV0dXJuZWQgLUVJT1xuIik7CisJCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IHdoaWxlICgwICE9IHJjZHEpOwogCX0gZWxzZSB7Ci0JCWlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKQorCQlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgeworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9CiAJaWYgKFY0TDJfQlVGX0ZMQUdfRE9ORSAhPSBwZWFzeWNhcC0+ZG9uZVtwZWFzeWNhcC0+ZnJhbWVfcmVhZF0pIHsKLQkJU0FZKCJFUlJPUjogVjRMMl9CVUZfRkxBR19ET05FICE9IDB4JTA4WFxuIiwgXAorCQlTQU0oIkVSUk9SOiBWNEwyX0JVRl9GTEFHX0RPTkUgIT0gMHglMDhYXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSk7CiAJfQogCXBlYXN5Y2FwLT5wb2xsZWQgPSAwOwogCi0JaWYgKCEoaXNlcXVlbmNlICUgMTApKSB7CisJaWYgKCEocGVhc3ljYXAtPmlzZXF1ZW5jZSAlIDEwKSkgewogCQlmb3IgKGkgPSAwOyBpIDwgMTc5OyBpKyspCiAJCQlwZWFzeWNhcC0+bWVyaXRbaV0gPSBwZWFzeWNhcC0+bWVyaXRbaSsxXTsKIAkJcGVhc3ljYXAtPm1lcml0WzE3OV0gPSBtZXJpdF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKQEAgLTE3MjgsNyArMjI2Myw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAkJCWogKz0gcGVhc3ljYXAtPm1lcml0W2ldOwogCQlpZiAoOTAgPCBqKSB7Ci0JCQlTQVkoImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gIiBcCisJCQlTQU0oImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gIiBcCiAJCQkJCQkJIm9uIGNvbmRpdGlvbiBibHVlXG4iKTsKIAkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOyBwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKIAkJfQpAQCAtMTczOCwzMSArMjI3MywyMyBAQAogCXY0bDJfYnVmZmVyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJdjRsMl9idWZmZXIuYnl0ZXN1c2VkID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkOwogCXY0bDJfYnVmZmVyLmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQgfCBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JdjRsMl9idWZmZXIuZmllbGQgPSAgcGVhc3ljYXAtPmZpZWxkOwotCWlmIChWNEwyX0ZJRUxEX0FMVEVSTkFURSA9PSB2NGwyX2J1ZmZlci5maWVsZCkKLQkJdjRsMl9idWZmZXIuZmllbGQgPSBcCi0JCQkJMHgwMDBGICYgKHBlYXN5Y2FwLT5cCi0JCQkJZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCk7CisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKQorCQl2NGwyX2J1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfQk9UVE9NOworCWVsc2UKKwkJdjRsMl9idWZmZXIuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKIAl0aW1ldmFsMiA9IHRpbWV2YWw7CiAKICNpZiBkZWZpbmVkKEFVRElPVElNRSkKIAlpZiAoIXBlYXN5Y2FwLT50aW1ldmFsMC50dl9zZWMpIHsKLQkJdGltZXZhbDAgPSB0aW1ldmFsOworCQl0aW1ldmFsOCA9IHRpbWV2YWw7CiAJCXRpbWV2YWwxID0gdGltZXZhbDsKIAkJdGltZXZhbDIgPSB0aW1ldmFsOwogCQlkbmJ5ZHQgPSAxOTIwMDA7Ci0KLQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpKQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJcGVhc3ljYXAtPnRpbWV2YWwwID0gdGltZXZhbDA7Ci0JCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpOworCQlwZWFzeWNhcC0+dGltZXZhbDAgPSB0aW1ldmFsODsKIAl9IGVsc2UgewotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQlkbmJ5ZHQgPSBwZWFzeWNhcC0+ZG5ieWR0OwogCQl0aW1ldmFsMSA9IHBlYXN5Y2FwLT50aW1ldmFsMTsKLQkJbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CiAJCWFib3ZlID0gZG5ieWR0ICogTUlDUk9TRUNPTkRTKHRpbWV2YWwsIHRpbWV2YWwxKTsKIAkJYmVsb3cgPSAxOTIwMDA7CiAJCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKQEAgLTE3NzQsNzIgKzIzMDEsNzYgQEAKIAkJdGltZXZhbDIudHZfdXNlYyA9IHNkci5yZW1haW5kZXI7CiAJCXRpbWV2YWwyLnR2X3NlYyA9IHRpbWV2YWwxLnR2X3NlYyArIHNkci5xdW90aWVudDsKIAl9Ci0JaWYgKCEoaXNlcXVlbmNlICUgNTAwKSkgeworCWlmICghKHBlYXN5Y2FwLT5pc2VxdWVuY2UgJSA1MDApKSB7CiAJCWZ1ZGdlID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCiAJCQkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAtIFwKIAkJCQkJCXRpbWV2YWwyLnR2X3NlYykpICsgXAogCQkJCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBcCi0JCQkJdGltZXZhbDIudHZfdXNlYyk7CisJCQkJCQl0aW1ldmFsMi50dl91c2VjKTsKIAkJc2RyID0gc2lnbmVkX2RpdihmdWRnZSwgMTAwMCk7CiAJCXNsbCA9IHNkci5xdW90aWVudDsKIAkJdWxsID0gc2RyLnJlbWFpbmRlcjsKIAotCQlTQVkoIiU1bGxpLiUtM2xsaT1tcyB0aW1lc3RhbXAgZnVkZ2VcbiIsIHNsbCwgdWxsKTsKKwkJU0FNKCIlNWxsaS4lLTNsbGk9bXMgdGltZXN0YW1wIGZ1ZGdlXG4iLCBzbGwsIHVsbCk7CiAJfQogI2VuZGlmIC8qQVVESU9USU1FKi8KIAogCXY0bDJfYnVmZmVyLnRpbWVzdGFtcCA9IHRpbWV2YWwyOwotCXY0bDJfYnVmZmVyLnNlcXVlbmNlID0gaXNlcXVlbmNlKys7CisJdjRsMl9idWZmZXIuc2VxdWVuY2UgPSBwZWFzeWNhcC0+aXNlcXVlbmNlKys7CiAJdjRsMl9idWZmZXIubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKIAl2NGwyX2J1ZmZlci5tLm9mZnNldCA9IHY0bDJfYnVmZmVyLmluZGV4ICogRlJBTUVfQlVGRkVSX1NJWkU7CiAJdjRsMl9idWZmZXIubGVuZ3RoID0gRlJBTUVfQlVGRkVSX1NJWkU7CiAKLQlKT1QoMTYsICIgICUxMGk9aW5kZXhcbiIsIHY0bDJfYnVmZmVyLmluZGV4KTsKLQlKT1QoMTYsICIgIDB4JTA4WD10eXBlXG4iLCB2NGwyX2J1ZmZlci50eXBlKTsKLQlKT1QoMTYsICIgICUxMGk9Ynl0ZXN1c2VkXG4iLCB2NGwyX2J1ZmZlci5ieXRlc3VzZWQpOwotCUpPVCgxNiwgIiAgMHglMDhYPWZsYWdzXG4iLCB2NGwyX2J1ZmZlci5mbGFncyk7Ci0JSk9UKDE2LCAiICAlMTBpPWZpZWxkXG4iLCB2NGwyX2J1ZmZlci5maWVsZCk7Ci0JSk9UKDE2LCAiICAlMTBsaT10aW1lc3RhbXAudHZfdXNlY1xuIiwgXAorCUpPTSgxNiwgIiAgJTEwaT1pbmRleFxuIiwgdjRsMl9idWZmZXIuaW5kZXgpOworCUpPTSgxNiwgIiAgMHglMDhYPXR5cGVcbiIsIHY0bDJfYnVmZmVyLnR5cGUpOworCUpPTSgxNiwgIiAgJTEwaT1ieXRlc3VzZWRcbiIsIHY0bDJfYnVmZmVyLmJ5dGVzdXNlZCk7CisJSk9NKDE2LCAiICAweCUwOFg9ZmxhZ3NcbiIsIHY0bDJfYnVmZmVyLmZsYWdzKTsKKwlKT00oMTYsICIgICUxMGk9ZmllbGRcbiIsIHY0bDJfYnVmZmVyLmZpZWxkKTsKKwlKT00oMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl9zZWNcbiIsIFwKKwkJCQkJKGxvbmcpdjRsMl9idWZmZXIudGltZXN0YW1wLnR2X3NlYyk7CisJSk9NKDE2LCAiICAlMTBsaT10aW1lc3RhbXAudHZfdXNlY1xuIiwgXAogCQkJCQkobG9uZyl2NGwyX2J1ZmZlci50aW1lc3RhbXAudHZfdXNlYyk7Ci0JSk9UKDE2LCAiICAlMTBpPXNlcXVlbmNlXG4iLCB2NGwyX2J1ZmZlci5zZXF1ZW5jZSk7Ci0JSk9UKDE2LCAiICAweCUwOFg9bWVtb3J5XG4iLCB2NGwyX2J1ZmZlci5tZW1vcnkpOwotCUpPVCgxNiwgIiAgJTEwaT1tLm9mZnNldFxuIiwgdjRsMl9idWZmZXIubS5vZmZzZXQpOwotCUpPVCgxNiwgIiAgJTEwaT1sZW5ndGhcbiIsIHY0bDJfYnVmZmVyLmxlbmd0aCk7CisJSk9NKDE2LCAiICAlMTBpPXNlcXVlbmNlXG4iLCB2NGwyX2J1ZmZlci5zZXF1ZW5jZSk7CisJSk9NKDE2LCAiICAweCUwOFg9bWVtb3J5XG4iLCB2NGwyX2J1ZmZlci5tZW1vcnkpOworCUpPTSgxNiwgIiAgJTEwaT1tLm9mZnNldFxuIiwgdjRsMl9idWZmZXIubS5vZmZzZXQpOworCUpPTSgxNiwgIiAgJTEwaT1sZW5ndGhcbiIsIHY0bDJfYnVmZmVyLmxlbmd0aCk7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9idWZmZXIsIFwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCUpPVCg4LCAiLi4uLi4gdXNlciBpcyBvZmZlcmVkIGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAorCWlucHV0ID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltwZWFzeWNhcC0+ZnJhbWVfcmVhZF1bMF0uaW5wdXQ7CisJaWYgKDB4MDggJiBpbnB1dCkgeworCQlKT00oOCwgInVzZXIgaXMgb2ZmZXJlZCBmcmFtZSBidWZmZXIgJWksIGlucHV0ICVpXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5mcmFtZV9yZWFkLCAoMHgwNyAmIGlucHV0KSk7CisJfSBlbHNlIHsKKwkJSk9NKDgsICJ1c2VyIGlzIG9mZmVyZWQgZnJhbWUgYnVmZmVyICVpXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmZyYW1lX3JlYWQpOworCX0KIAlwZWFzeWNhcC0+ZnJhbWVfbG9jayA9IDE7CisJSk9NKDgsICIlaT1wZWFzeWNhcC0+ZnJhbWVfZmlsbFxuIiwgcGVhc3ljYXAtPmZyYW1lX2ZpbGwpOwogCWlmIChwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9PSBwZWFzeWNhcC0+ZnJhbWVfZmlsbCkgewogCQlpZiAocGVhc3ljYXAtPmZyYW1lX2xvY2spIHsKLQkJCUpPVCg4LCAiRVJST1I6ICBmaWxsaW5nIGZyYW1lIGJ1ZmZlciAiIFwKKwkJCUpPTSg4LCAiV09SUlk6ICBmaWxsaW5nIGZyYW1lIGJ1ZmZlciAiIFwKIAkJCQkJCSJ3aGlsZSBvZmZlcmVkIHRvIHVzZXJcbiIpOwogCQl9CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBBVURJTyBVUkJTIEhBVkUgQUxSRUFEWSBCRUVOIFNVQk1JVFRFRCBXSEVOIFRISVMgQ09NTUFORCBJUyBSRUNFSVZFRDsKLSAqICBWSURFTyBVUkJTIEhBVkUgTk9ULgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIFZJRElPQ19TVFJFQU1PTjogewotCXN0YXRpYyBpbnQgaTsKKwlpbnQgaTsKIAotCUpPVCg4LCAiVklESU9DX1NUUkVBTU9OXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TVFJFQU1PTlxuIik7CiAKLQlpc2VxdWVuY2UgPSAwOworCXBlYXN5Y2FwLT5pc2VxdWVuY2UgPSAwOwogCWZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAkJcGVhc3ljYXAtPm1lcml0W2ldID0gMDsKIAlpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKQEAgLTE4NTEsMTAgKzIzODIsMTEgQEAKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1NUUkVBTU9GRjogewotCUpPVCg4LCAiVklESU9DX1NUUkVBTU9GRlxuIik7CisJSk9NKDgsICJWSURJT0NfU1RSRUFNT0ZGXG4iKTsKIAogCWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTE4NjYsNyArMjM5OCw3IEBACiAgKiAgVEhFIFVTRVJTUEFDRSBQUk9HUkFNLCBFLkcuIG1wbGF5ZXIsIE1BWSBIQU5HIE9OIEVYSVQuICAgQkVXQVJFLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDgsICJjYWxsaW5nIHdha2VfdXAgb24gd3FfdmlkZW8gYW5kIHdxX2F1ZGlvXG4iKTsKKwlKT00oOCwgImNhbGxpbmcgd2FrZV91cCBvbiB3cV92aWRlbyBhbmQgd3FfYXVkaW9cbiIpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV92aWRlbykpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV9hdWRpbykpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTg3NCwxMTEgKzI0MDYsMjAwIEBACiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX1BBUk06IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfc3RyZWFtcGFybSB2NGwyX3N0cmVhbXBhcm07CisJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcHY0bDJfc3RyZWFtcGFybTsKIAotCUpPVCg4LCAiVklESU9DX0dfUEFSTVxuIik7Ci0KLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9zdHJlYW1wYXJtLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwlKT00oOCwgIlZJRElPQ19HX1BBUk1cbiIpOworCXB2NGwyX3N0cmVhbXBhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdjRsMl9zdHJlYW1wYXJtKSB7CisJCVNBTSgiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcihwdjRsMl9zdHJlYW1wYXJtLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKSkgewotCQlQT1VUOworCQlrZnJlZShwdjRsMl9zdHJlYW1wYXJtKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlpZiAodjRsMl9zdHJlYW1wYXJtLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCVBPVVQ7CisJaWYgKHB2NGwyX3N0cmVhbXBhcm0tPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgPSAwOwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuY2FwdHVyZW1vZGUgPSAwOwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDE7Ci0JdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPSAzMDsKLQl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55OwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9zdHJlYW1wYXJtLCBcCisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLmNhcGFiaWxpdHkgPSAwOworCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZSA9IDA7CisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSAxOworCisJaWYgKHBlYXN5Y2FwLT5mcHMpIHsKKwkJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5cCisJCQkJCQlkZW5vbWluYXRvciA9IHBlYXN5Y2FwLT5mcHM7CisJfSBlbHNlIHsKKwkJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuXAorCQkJCQkJZGVub21pbmF0b3IgPSAzMDsKKwkJfSBlbHNlIHsKKwkJCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUuXAorCQkJCQkJZGVub21pbmF0b3IgPSAyNTsKKwkJfQorCX0KKworCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueTsKKwlwdjRsMl9zdHJlYW1wYXJtLT5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlID0gMDsKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBwdjRsMl9zdHJlYW1wYXJtLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfc3RyZWFtcGFybSk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOwogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19QQVJNOiB7Ci0JSk9UKDgsICJWSURJT0NfU19QQVJNIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX1BBUk0gdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfQVVESU86IHsKLQlKT1QoOCwgIlZJRElPQ19HX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX0FVRElPOiB7Ci0JSk9UKDgsICJWSURJT0NfU19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfU19BVURJTyB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU19UVU5FUjogewotCUpPVCg4LCAiVklESU9DX1NfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX1NfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfRkJVRjoKIGNhc2UgVklESU9DX1NfRkJVRjoKIGNhc2UgVklESU9DX09WRVJMQVk6IHsKLQlKT1QoOCwgIlZJRElPQ19HX0ZCVUZ8VklESU9DX1NfRkJVRnxWSURJT0NfT1ZFUkxBWSB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfR19GQlVGfFZJRElPQ19TX0ZCVUZ8VklESU9DX09WRVJMQVkgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfVFVORVI6IHsKLQlKT1QoOCwgIlZJRElPQ19HX1RVTkVSIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX1RVTkVSIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiBjYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKIGNhc2UgVklESU9DX1NfRlJFUVVFTkNZOiB7Ci0JSk9UKDgsICJWSURJT0NfR19GUkVRVUVOQ1l8VklESU9DX1NfRlJFUVVFTkNZIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX0ZSRVFVRU5DWXxWSURJT0NfU19GUkVRVUVOQ1kgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGRlZmF1bHQ6IHsKLQlKT1QoOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgVjRMMiBJT0NUTCBjb21tYW5kOiAweCUwOFhcbiIsIGNtZCk7Ci0JZXhwbGFpbl9pb2N0bChjbWQpOwotCVBPVVQ7CisJSk9NKDgsICJFUlJPUjogdW5yZWNvZ25pemVkIFY0TDIgSU9DVEwgY29tbWFuZDogMHglMDhYXG4iLCBjbWQpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogfQorbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworSk9NKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKIHJldHVybiAwOwogfQotCi1sb25nIGVhc3ljYXBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlsb25nIHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gZWFzeWNhcF9pb2N0bF9ia2woaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gcmV0OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiAoKGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKSB8fCBcCisJKGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkpKQorbG9uZworZWFzeXNuZF9pb2N0bF9ub2lub2RlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykgeworCXJldHVybiAobG9uZyllYXN5c25kX2lvY3RsKChzdHJ1Y3QgaW5vZGUgKilOVUxMLCBmaWxlLCBjbWQsIGFyZyk7CiB9Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBlYXN5c25kX2lvY3RsX2JrbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVHx8RUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CitlYXN5c25kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIHN0cnVjdCB1c2JfZGV2aWNlICpwOworaW50IGtkOwogCitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIHBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTC5cbiIpOwotCXJldHVybiAtMTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIHAgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoTlVMTCA9PSBwKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQora2QgPSBpc2RvbmdsZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAsCisgKiAgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorICogIElGIE5FQ0VTU0FSWSwgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChrZCAhPSBpc2RvbmdsZShwZWFzeWNhcCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaWYgKE5VTEwgPT0gZmlsZSkgeworCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAgQkVGT1JFIFRIRQorICogIEFUVEVNUFQgVE8gQUNRVUlSRSBUSEUgU0VNQVBIT1JFLCBpc2RvbmdsZSgpIFdJTEwgSEFWRSBGQUlMRUQuICBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN3aXRjaCAoY21kKSB7CiBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzogewogCWludCBjYXBzOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUQ0FQU1xuIik7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMTk5MiwxMyArMjYxMywxNSBAQAogCQljYXBzID0gMHgwNDQwMDAwMDsKICNlbmRpZiAvKlVQU0FNUExFKi8KIAotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjYXBzLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNhcHMsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiB7CiAJaW50IGluY29taW5nOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKwlKT00oOCwgIlNORENUTF9EU1BfR0VURk1UU1xuIik7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjAxMiwxNiArMjYzNSwyMCBAQAogCQlpbmNvbWluZyA9IEFGTVRfUzE2X0xFOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfU0VURk1UOiB7CiAJaW50IGluY29taW5nLCBvdXRnb2luZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU0VURk1UXG4iKTsKLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCUpPTSg4LCAiU05EQ1RMX0RTUF9TRVRGTVRcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0yMDM2LDIyICsyNjYzLDI3IEBACiAjZW5kaWYgLypVUFNBTVBMRSovCiAKIAlpZiAoaW5jb21pbmcgIT0gb3V0Z29pbmcpIHsKLQkJSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1vdXRnb2luZ1xuIiwgb3V0Z29pbmcpOwotCQlKT1QoOCwgIiAgICAgICAgY2YuICVpPUFGTVRfUzE2X0xFXG4iLCBBRk1UX1MxNl9MRSk7Ci0JCUpPVCg4LCAiICAgICAgICBjZi4gJWk9QUZNVF9VOFxuIiwgQUZNVF9VOCk7CisJCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9b3V0Z29pbmdcbiIsIG91dGdvaW5nKTsKKwkJSk9NKDgsICIgICAgICAgIGNmLiAlaT1BRk1UX1MxNl9MRVxuIiwgQUZNVF9TMTZfTEUpOworCQlKT00oOCwgIiAgICAgICAgY2YuICVpPUFGTVRfVThcbiIsIEFGTVRfVTgpOwogCQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmb3V0Z29pbmcsIFwKLQkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQkJCQkJCQlzaXplb2YoaW50KSkpIHsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FSU5WQUwgOwogCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX1NURVJFT1xuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfU1RFUkVPXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCX0KKwlKT00oOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjA2NSwxNiArMjY5NywyMCBAQAogCQlpbmNvbWluZyA9IDE7CiAjZW5kaWYgLypVUFNBTVBMRSovCiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU1BFRURcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX1NQRUVEXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCX0KKwlKT00oOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CiAKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCWlmICh0cnVlID09IHBlYXN5Y2FwLT5taWNyb3Bob25lKQpAQCAtMjA4OCwyOSArMjcyNCwzNyBAQAogCQlpbmNvbWluZyA9IDQ4MDAwOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfR0VUVFJJR0dFUlxuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUVFJJR0dFUlxuIik7CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwotCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwl9CisJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOwogCiAJaW5jb21pbmcgPSBQQ01fRU5BQkxFX0lOUFVUOwotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWJyZWFrOwogfQogY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX1NFVFRSSUdHRVJcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX1NFVFRSSUdHRVJcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiBjZiAweCV4PVBDTV9FTkFCTEVfSU5QVVQgIiBcCisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwlKT00oOCwgIi4uLi4uLi4uLi4uIGNmIDB4JXg9UENNX0VOQUJMRV9JTlBVVCAiIFwKIAkJCQkiMHgleD1QQ01fRU5BQkxFX09VVFBVVFxuIiwgXAogCQkJCQlQQ01fRU5BQkxFX0lOUFVULCBQQ01fRU5BQkxFX09VVFBVVCk7CiAJOwpAQCAtMjEyMSwxOSArMjc2NSwyMyBAQAogfQogY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX0dFVEJMS1NJWkVcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX0dFVEJMS1NJWkVcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAlpbmNvbWluZyA9IHBlYXN5Y2FwLT5hdWRpb19ieXRlc19wZXJfZnJhZ21lbnQ7Ci0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOiB7CiAJc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGF1ZGlvX2J1Zl9pbmZvOwogCi0JSk9UKDgsICJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CisJSk9NKDgsICJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CiAKIAlhdWRpb19idWZfaW5mby5ieXRlcyAgICAgID0gcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudDsKIAlhdWRpb19idWZfaW5mby5mcmFnbWVudHMgID0gMTsKQEAgLTIxNDEsNTU1ICsyNzg5LDMxIEBACiAJYXVkaW9fYnVmX2luZm8uZnJhZ3N0b3RhbCA9IDA7CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmYXVkaW9fYnVmX2luZm8sIFwKLQkJCQkJCQkJc2l6ZW9mKGludCkpKQorCQkJCQkJCQlzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CitjYXNlIDB4MDAwMDU0MDE6CitjYXNlIDB4MDAwMDU0MDI6CitjYXNlIDB4MDAwMDU0MDM6CitjYXNlIDB4MDAwMDU0MDQ6CitjYXNlIDB4MDAwMDU0MDU6CitjYXNlIDB4MDAwMDU0MDY6IHsKKwlKT00oOCwgIlNORENUTF9UTVJfLi4uOiAweCUwOFggdW5zdXBwb3J0ZWRcbiIsIGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CiBkZWZhdWx0OiB7Ci0JSk9UKDgsICJFUlJPUjogdW5yZWNvZ25pemVkIERTUCBJT0NUTCBjb21tYW5kOiAweCUwOFhcbiIsIGNtZCk7Ci0JUE9VVDsKKwlKT00oOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgRFNQIElPQ1RMIGNvbW1hbmQ6IDB4JTA4WFxuIiwgY21kKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIH0KK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIHJldHVybiAwOwogfQotCi1sb25nIGVhc3lzbmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLQlsb25nIHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gZWFzeXNuZF9pb2N0bF9ia2woaW5vZGUsIGZpbGUsIGNtZCwgYXJnKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZXhwbGFpbl9pb2N0bChfX3UzMiB3b3QpCi17Ci1pbnQgazsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiAgVEhFIERBVEEgRk9SIFRIRSBBUlJBWSBtZXNzIEJFTE9XIFdFUkUgQ09OU1RSVUNURUQgQlkgUlVOTklORyBUSEUgRk9MTE9XSU5HCi0gKiAgU0hFTEwgU0NSSVBUOgotICogICMKLSAqICBjYXQgL3Vzci9zcmMvbGludXgtaGVhZGVycy1gdW5hbWUgLXJgL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggfCBcCi0gKiAgICAgZ3JlcCAiXiNkZWZpbmUgVklESU9DXyIgLSB8IGdyZXAgLXYgIl9PTEQiIC0gfCBcCi0gKiAgICAgc2VkIC1lICJzLF9JTy4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAotICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCi0gKiAgICAgc2VkIC1lICJzLAksLGc7cywgLCxnIiA+aW9jdGwudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+aW9jdGwudG1wCi0gKiAgZXhpdCAwCi0gKiAgIwotICogQU5EIFJFSU5TVEFUSU5HIFRIRSBFWENJU0VEICJfT0xEIiBDQVNFUyBXRVJFIExBVEVSIE1BTlVBTExZLgotICoKLSAqIFRIRSBEQVRBIEZPUiBUSEUgQVJSQVkgbWVzczEgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKLSAqIFNIRUxMIFNDUklQVDoKLSAqICBjYXQgL3Vzci9zcmMvbGludXgtaGVhZGVycy1gdW5hbWUgLXJgL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaCB8IFwKLSAqICAgICBncmVwICJeI2RlZmluZSBWSURJT0MiIC0gfCBncmVwIC12ICJfT0xEIiAtIHwgXAotICogICAgIHNlZCAtZSAicyxfSU8uKiQsLDtwIiB8IHNlZCAtZSAiTjtzLFxuLCwgIiB8IFwKLSAqICAgICBzZWQgLWUgInMvXiNkZWZpbmUgLyAgey87cy8jZGVmaW5lIC8sIFwiLztzLyQvXCJ9LC8iIHwgXAotICogICAgIHNlZCAtZSAicywgICAsLGc7cywgLCxnIiA+aW9jdGwudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+aW9jdGwudG1wCi0gKiAgZXhpdCAwCi0gKiAgIwotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgc3RydWN0IG1lc3MgewotCV9fdTMyIGNvbW1hbmQ7Ci0JY2hhciAgbmFtZVs2NF07Ci19IG1lc3NbXSA9IHsKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUNBUCkKLXtWSURJT0NfUVVFUllDQVAsICJWSURJT0NfUVVFUllDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1JFU0VSVkVEKQote1ZJRElPQ19SRVNFUlZFRCwgIlZJRElPQ19SRVNFUlZFRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GTVQpCi17VklESU9DX0VOVU1fRk1ULCAiVklESU9DX0VOVU1fRk1UIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0ZNVCkKLXtWSURJT0NfR19GTVQsICJWSURJT0NfR19GTVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfRk1UKQote1ZJRElPQ19TX0ZNVCwgIlZJRElPQ19TX0ZNVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUkVRQlVGUykKLXtWSURJT0NfUkVRQlVGUywgIlZJRElPQ19SRVFCVUZTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUJVRikKLXtWSURJT0NfUVVFUllCVUYsICJWSURJT0NfUVVFUllCVUYifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRkJVRikKLXtWSURJT0NfR19GQlVGLCAiVklESU9DX0dfRkJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19GQlVGKQote1ZJRElPQ19TX0ZCVUYsICJWSURJT0NfU19GQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19PVkVSTEFZKQote1ZJRElPQ19PVkVSTEFZLCAiVklESU9DX09WRVJMQVkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1FCVUYpCi17VklESU9DX1FCVUYsICJWSURJT0NfUUJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRFFCVUYpCi17VklESU9DX0RRQlVGLCAiVklESU9DX0RRQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TVFJFQU1PTikKLXtWSURJT0NfU1RSRUFNT04sICJWSURJT0NfU1RSRUFNT04ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NUUkVBTU9GRikKLXtWSURJT0NfU1RSRUFNT0ZGLCAiVklESU9DX1NUUkVBTU9GRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19QQVJNKQote1ZJRElPQ19HX1BBUk0sICJWSURJT0NfR19QQVJNIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1BBUk0pCi17VklESU9DX1NfUEFSTSwgIlZJRElPQ19TX1BBUk0ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfU1REKQote1ZJRElPQ19HX1NURCwgIlZJRElPQ19HX1NURCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19TVEQpCi17VklESU9DX1NfU1RELCAiVklESU9DX1NfU1REIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNU1REKQote1ZJRElPQ19FTlVNU1RELCAiVklESU9DX0VOVU1TVEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1JTlBVVCkKLXtWSURJT0NfRU5VTUlOUFVULCAiVklESU9DX0VOVU1JTlBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19DVFJMKQote1ZJRElPQ19HX0NUUkwsICJWSURJT0NfR19DVFJMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0NUUkwpCi17VklESU9DX1NfQ1RSTCwgIlZJRElPQ19TX0NUUkwifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfVFVORVIpCi17VklESU9DX0dfVFVORVIsICJWSURJT0NfR19UVU5FUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19UVU5FUikKLXtWSURJT0NfU19UVU5FUiwgIlZJRElPQ19TX1RVTkVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRElPKQote1ZJRElPQ19HX0FVRElPLCAiVklESU9DX0dfQVVESU8ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQVVESU8pCi17VklESU9DX1NfQVVESU8sICJWSURJT0NfU19BVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUVVFUllDVFJMKQote1ZJRElPQ19RVUVSWUNUUkwsICJWSURJT0NfUVVFUllDVFJMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWU1FTlUpCi17VklESU9DX1FVRVJZTUVOVSwgIlZJRElPQ19RVUVSWU1FTlUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfSU5QVVQpCi17VklESU9DX0dfSU5QVVQsICJWSURJT0NfR19JTlBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19JTlBVVCkKLXtWSURJT0NfU19JTlBVVCwgIlZJRElPQ19TX0lOUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX09VVFBVVCkKLXtWSURJT0NfR19PVVRQVVQsICJWSURJT0NfR19PVVRQVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfT1VUUFVUKQote1ZJRElPQ19TX09VVFBVVCwgIlZJRElPQ19TX09VVFBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTU9VVFBVVCkKLXtWSURJT0NfRU5VTU9VVFBVVCwgIlZJRElPQ19FTlVNT1VUUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRE9VVCkKLXtWSURJT0NfR19BVURPVVQsICJWSURJT0NfR19BVURPVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQVVET1VUKQote1ZJRElPQ19TX0FVRE9VVCwgIlZJRElPQ19TX0FVRE9VVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19NT0RVTEFUT1IpCi17VklESU9DX0dfTU9EVUxBVE9SLCAiVklESU9DX0dfTU9EVUxBVE9SIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX01PRFVMQVRPUikKLXtWSURJT0NfU19NT0RVTEFUT1IsICJWSURJT0NfU19NT0RVTEFUT1IifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRlJFUVVFTkNZKQote1ZJRElPQ19HX0ZSRVFVRU5DWSwgIlZJRElPQ19HX0ZSRVFVRU5DWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19GUkVRVUVOQ1kpCi17VklESU9DX1NfRlJFUVVFTkNZLCAiVklESU9DX1NfRlJFUVVFTkNZIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19DUk9QQ0FQKQote1ZJRElPQ19DUk9QQ0FQLCAiVklESU9DX0NST1BDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQ1JPUCkKLXtWSURJT0NfR19DUk9QLCAiVklESU9DX0dfQ1JPUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19DUk9QKQote1ZJRElPQ19TX0NST1AsICJWSURJT0NfU19DUk9QIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0pQRUdDT01QKQote1ZJRElPQ19HX0pQRUdDT01QLCAiVklESU9DX0dfSlBFR0NPTVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfSlBFR0NPTVApCi17VklESU9DX1NfSlBFR0NPTVAsICJWSURJT0NfU19KUEVHQ09NUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUVVFUllTVEQpCi17VklESU9DX1FVRVJZU1RELCAiVklESU9DX1FVRVJZU1REIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19UUllfRk1UKQote1ZJRElPQ19UUllfRk1ULCAiVklESU9DX1RSWV9GTVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1BVURJTykKLXtWSURJT0NfRU5VTUFVRElPLCAiVklESU9DX0VOVU1BVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTUFVRE9VVCkKLXtWSURJT0NfRU5VTUFVRE9VVCwgIlZJRElPQ19FTlVNQVVET1VUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX1BSSU9SSVRZKQote1ZJRElPQ19HX1BSSU9SSVRZLCAiVklESU9DX0dfUFJJT1JJVFkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfUFJJT1JJVFkpCi17VklESU9DX1NfUFJJT1JJVFksICJWSURJT0NfU19QUklPUklUWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19TTElDRURfVkJJX0NBUCkKLXtWSURJT0NfR19TTElDRURfVkJJX0NBUCwgIlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19MT0dfU1RBVFVTKQote1ZJRElPQ19MT0dfU1RBVFVTLCAiVklESU9DX0xPR19TVEFUVVMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRVhUX0NUUkxTKQote1ZJRElPQ19HX0VYVF9DVFJMUywgIlZJRElPQ19HX0VYVF9DVFJMUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19FWFRfQ1RSTFMpCi17VklESU9DX1NfRVhUX0NUUkxTLCAiVklESU9DX1NfRVhUX0NUUkxTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19UUllfRVhUX0NUUkxTKQote1ZJRElPQ19UUllfRVhUX0NUUkxTLCAiVklESU9DX1RSWV9FWFRfQ1RSTFMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1fRlJBTUVTSVpFUykKLXtWSURJT0NfRU5VTV9GUkFNRVNJWkVTLCAiVklESU9DX0VOVU1fRlJBTUVTSVpFUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUykKLXtWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUywgIlZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0VOQ19JTkRFWCkKLXtWSURJT0NfR19FTkNfSU5ERVgsICJWSURJT0NfR19FTkNfSU5ERVgifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOQ09ERVJfQ01EKQote1ZJRElPQ19FTkNPREVSX0NNRCwgIlZJRElPQ19FTkNPREVSX0NNRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfVFJZX0VOQ09ERVJfQ01EKQote1ZJRElPQ19UUllfRU5DT0RFUl9DTUQsICJWSURJT0NfVFJZX0VOQ09ERVJfQ01EIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0NISVBfSURFTlQpCi17VklESU9DX0dfQ0hJUF9JREVOVCwgIlZJRElPQ19HX0NISVBfSURFTlQifSwKLSNlbmRpZgogCi0jaWYgZGVmaW5lZChWSURJT0NfT1ZFUkxBWV9PTEQpCi17VklESU9DX09WRVJMQVlfT0xELCAiVklESU9DX09WRVJMQVlfT0xEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1BBUk1fT0xEKQote1ZJRElPQ19TX1BBUk1fT0xELCAiVklESU9DX1NfUEFSTV9PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTF9PTEQpCi17VklESU9DX1NfQ1RSTF9PTEQsICJWSURJT0NfU19DVFJMX09MRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19BVURJT19PTEQpCi17VklESU9DX0dfQVVESU9fT0xELCAiVklESU9DX0dfQVVESU9fT0xEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRE9VVF9PTEQpCi17VklESU9DX0dfQVVET1VUX09MRCwgIlZJRElPQ19HX0FVRE9VVF9PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0NST1BDQVBfT0xEKQote1ZJRElPQ19DUk9QQ0FQX09MRCwgIlZJRElPQ19DUk9QQ0FQX09MRCJ9LAotI2VuZGlmCi17MHhGRkZGRkZGRiwgIiJ9Ci19OwogCi1zdGF0aWMgc3RydWN0IG1lc3MgbWVzczFbXSA9IFwKLXsKLSNpZiBkZWZpbmVkKFZJRElPQ0dDQVApCi17VklESU9DR0NBUCwgIlZJRElPQ0dDQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0NIQU4pCi17VklESU9DR0NIQU4sICJWSURJT0NHQ0hBTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTQ0hBTikKLXtWSURJT0NTQ0hBTiwgIlZJRElPQ1NDSEFOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dUVU5FUikKLXtWSURJT0NHVFVORVIsICJWSURJT0NHVFVORVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU1RVTkVSKQote1ZJRElPQ1NUVU5FUiwgIlZJRElPQ1NUVU5FUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHUElDVCkKLXtWSURJT0NHUElDVCwgIlZJRElPQ0dQSUNUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NQSUNUKQote1ZJRElPQ1NQSUNULCAiVklESU9DU1BJQ1QifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DQ0FQVFVSRSkKLXtWSURJT0NDQVBUVVJFLCAiVklESU9DQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHV0lOKQote1ZJRElPQ0dXSU4sICJWSURJT0NHV0lOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NXSU4pCi17VklESU9DU1dJTiwgIlZJRElPQ1NXSU4ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0ZCVUYpCi17VklESU9DR0ZCVUYsICJWSURJT0NHRkJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTRkJVRikKLXtWSURJT0NTRkJVRiwgIlZJRElPQ1NGQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0tFWSkKLXtWSURJT0NLRVksICJWSURJT0NLRVkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0ZSRVEpCi17VklESU9DR0ZSRVEsICJWSURJT0NHRlJFUSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTRlJFUSkKLXtWSURJT0NTRlJFUSwgIlZJRElPQ1NGUkVRIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dBVURJTykKLXtWSURJT0NHQVVESU8sICJWSURJT0NHQVVESU8ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU0FVRElPKQote1ZJRElPQ1NBVURJTywgIlZJRElPQ1NBVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTWU5DKQote1ZJRElPQ1NZTkMsICJWSURJT0NTWU5DIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ01DQVBUVVJFKQote1ZJRElPQ01DQVBUVVJFLCAiVklESU9DTUNBUFRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR01CVUYpCi17VklESU9DR01CVUYsICJWSURJT0NHTUJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHVU5JVCkKLXtWSURJT0NHVU5JVCwgIlZJRElPQ0dVTklUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dDQVBUVVJFKQote1ZJRElPQ0dDQVBUVVJFLCAiVklESU9DR0NBUFRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU0NBUFRVUkUpCi17VklESU9DU0NBUFRVUkUsICJWSURJT0NTQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTUExBWU1PREUpCi17VklESU9DU1BMQVlNT0RFLCAiVklESU9DU1BMQVlNT0RFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NXUklURU1PREUpCi17VklESU9DU1dSSVRFTU9ERSwgIlZJRElPQ1NXUklURU1PREUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR1BMQVlJTkZPKQote1ZJRElPQ0dQTEFZSU5GTywgIlZJRElPQ0dQTEFZSU5GTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTTUlDUk9DT0RFKQote1ZJRElPQ1NNSUNST0NPREUsICJWSURJT0NTTUlDUk9DT0RFIn0sCi0jZW5kaWYKLXsweEZGRkZGRkZGLCAiIn0KLX07Ci0KLWsgPSAwOwotd2hpbGUgKG1lc3Nba10ubmFtZVswXSkgewotCWlmICh3b3QgPT0gbWVzc1trXS5jb21tYW5kKSB7Ci0JCUpPVCg4LCAiaW9jdGwgMHglMDhYIGlzICVzXG4iLCBcCi0JCQkJCW1lc3Nba10uY29tbWFuZCwgJm1lc3Nba10ubmFtZVswXSk7Ci0JCXJldHVybiAwOwotCX0KLQlrKys7Ci19Ci1KT1QoOCwgImlvY3RsIDB4JTA4WCBpcyBub3QgaW4gdmlkZW9kZXYyLmhcbiIsIHdvdCk7Ci0KLWsgPSAwOwotd2hpbGUgKG1lc3MxW2tdLm5hbWVbMF0pIHsKLQlpZiAod290ID09IG1lc3MxW2tdLmNvbW1hbmQpIHsKLQkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXMgKFY0TDEpXG4iLCBcCi0JCQkJCW1lc3MxW2tdLmNvbW1hbmQsICZtZXNzMVtrXS5uYW1lWzBdKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWsrKzsKLX0KLUpPVCg4LCAiaW9jdGwgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2Rldi5oXG4iLCB3b3QpOwotcmV0dXJuIC0xOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGV4cGxhaW5fY2lkKF9fdTMyIHdvdCkKLXsKLWludCBrOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBUSEUgREFUQSBGT1IgVEhFIEFSUkFZIG1lc3MgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKLSAqICBTSEVMTCBTQ1JJUFQ6Ci0gKiAgIwotICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCB8IFwKLSAqICAgICBncmVwICJeI2RlZmluZSBWNEwyX0NJRF8iIHwgIFwKLSAqICAgICBzZWQgLWUgInMsKC4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAotICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCi0gKiAgICAgc2VkIC1lICJzLAksLGc7cywgLCxnIiB8IGdyZXAgLXYgIl9CQVNFIiB8IGdyZXAgLXYgIk1QRUciID5jaWQudG1wCi0gKiAgZWNobyAiezB4RkZGRkZGRkYsXCJcIn0iID4+Y2lkLnRtcAotICogIGV4aXQgMAotICogICMKLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHN0cnVjdCBtZXNzCi17Ci1fX3UzMiBjb21tYW5kOwotY2hhciAgbmFtZVs2NF07Ci19IG1lc3NbXSA9IHsKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1VTRVJfQ0xBU1MpCi17VjRMMl9DSURfVVNFUl9DTEFTUywgIlY0TDJfQ0lEX1VTRVJfQ0xBU1MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQlJJR0hUTkVTUykKLXtWNEwyX0NJRF9CUklHSFRORVNTLCAiVjRMMl9DSURfQlJJR0hUTkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9DT05UUkFTVCkKLXtWNEwyX0NJRF9DT05UUkFTVCwgIlY0TDJfQ0lEX0NPTlRSQVNUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1NBVFVSQVRJT04pCi17VjRMMl9DSURfU0FUVVJBVElPTiwgIlY0TDJfQ0lEX1NBVFVSQVRJT04ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfSFVFKQote1Y0TDJfQ0lEX0hVRSwgIlY0TDJfQ0lEX0hVRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19WT0xVTUUpCi17VjRMMl9DSURfQVVESU9fVk9MVU1FLCAiVjRMMl9DSURfQVVESU9fVk9MVU1FIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UpCi17VjRMMl9DSURfQVVESU9fQkFMQU5DRSwgIlY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fQkFTUykKLXtWNEwyX0NJRF9BVURJT19CQVNTLCAiVjRMMl9DSURfQVVESU9fQkFTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19UUkVCTEUpCi17VjRMMl9DSURfQVVESU9fVFJFQkxFLCAiVjRMMl9DSURfQVVESU9fVFJFQkxFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX01VVEUpCi17VjRMMl9DSURfQVVESU9fTVVURSwgIlY0TDJfQ0lEX0FVRElPX01VVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fTE9VRE5FU1MpCi17VjRMMl9DSURfQVVESU9fTE9VRE5FU1MsICJWNEwyX0NJRF9BVURJT19MT1VETkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9CTEFDS19MRVZFTCkKLXtWNEwyX0NJRF9CTEFDS19MRVZFTCwgIlY0TDJfQ0lEX0JMQUNLX0xFVkVMIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSkKLXtWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsICJWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSkKLXtWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFLCAiVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9SRURfQkFMQU5DRSkKLXtWNEwyX0NJRF9SRURfQkFMQU5DRSwgIlY0TDJfQ0lEX1JFRF9CQUxBTkNFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSkKLXtWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsICJWNEwyX0NJRF9CTFVFX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfR0FNTUEpCi17VjRMMl9DSURfR0FNTUEsICJWNEwyX0NJRF9HQU1NQSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9XSElURU5FU1MpCi17VjRMMl9DSURfV0hJVEVORVNTLCAiVjRMMl9DSURfV0hJVEVORVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFKQote1Y0TDJfQ0lEX0VYUE9TVVJFLCAiVjRMMl9DSURfRVhQT1NVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVUT0dBSU4pCi17VjRMMl9DSURfQVVUT0dBSU4sICJWNEwyX0NJRF9BVVRPR0FJTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9HQUlOKQote1Y0TDJfQ0lEX0dBSU4sICJWNEwyX0NJRF9HQUlOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hGTElQKQote1Y0TDJfQ0lEX0hGTElQLCAiVjRMMl9DSURfSEZMSVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVkZMSVApCi17VjRMMl9DSURfVkZMSVAsICJWNEwyX0NJRF9WRkxJUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9IQ0VOVEVSKQote1Y0TDJfQ0lEX0hDRU5URVIsICJWNEwyX0NJRF9IQ0VOVEVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1ZDRU5URVIpCi17VjRMMl9DSURfVkNFTlRFUiwgIlY0TDJfQ0lEX1ZDRU5URVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1kpCi17VjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1ksICJWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9IVUVfQVVUTykKLXtWNEwyX0NJRF9IVUVfQVVUTywgIlY0TDJfQ0lEX0hVRV9BVVRPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUpCi17VjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwgIlY0TDJfQ0lEX1dISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfU0hBUlBORVNTKQote1Y0TDJfQ0lEX1NIQVJQTkVTUywgIlY0TDJfQ0lEX1NIQVJQTkVTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OKQote1Y0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04sICJWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NIUk9NQV9BR0MpCi17VjRMMl9DSURfQ0hST01BX0FHQywgIlY0TDJfQ0lEX0NIUk9NQV9BR0MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQ09MT1JfS0lMTEVSKQote1Y0TDJfQ0lEX0NPTE9SX0tJTExFUiwgIlY0TDJfQ0lEX0NPTE9SX0tJTExFUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9MQVNUUDEpCi17VjRMMl9DSURfTEFTVFAxLCAiVjRMMl9DSURfTEFTVFAxIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NBTUVSQV9DTEFTUykKLXtWNEwyX0NJRF9DQU1FUkFfQ0xBU1MsICJWNEwyX0NJRF9DQU1FUkFfQ0xBU1MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkVfQVVUTykKLXtWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLCAiVjRMMl9DSURfRVhQT1NVUkVfQVVUTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURSkKLXtWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURSwgIlY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkpCi17VjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSwgIlY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfUEFOX1JFTEFUSVZFKQote1Y0TDJfQ0lEX1BBTl9SRUxBVElWRSwgIlY0TDJfQ0lEX1BBTl9SRUxBVElWRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9USUxUX1JFTEFUSVZFKQote1Y0TDJfQ0lEX1RJTFRfUkVMQVRJVkUsICJWNEwyX0NJRF9USUxUX1JFTEFUSVZFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1BBTl9SRVNFVCkKLXtWNEwyX0NJRF9QQU5fUkVTRVQsICJWNEwyX0NJRF9QQU5fUkVTRVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVElMVF9SRVNFVCkKLXtWNEwyX0NJRF9USUxUX1JFU0VULCAiVjRMMl9DSURfVElMVF9SRVNFVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9QQU5fQUJTT0xVVEUpCi17VjRMMl9DSURfUEFOX0FCU09MVVRFLCAiVjRMMl9DSURfUEFOX0FCU09MVVRFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUpCi17VjRMMl9DSURfVElMVF9BQlNPTFVURSwgIlY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRk9DVVNfQUJTT0xVVEUpCi17VjRMMl9DSURfRk9DVVNfQUJTT0xVVEUsICJWNEwyX0NJRF9GT0NVU19BQlNPTFVURSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9GT0NVU19SRUxBVElWRSkKLXtWNEwyX0NJRF9GT0NVU19SRUxBVElWRSwgIlY0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0ZPQ1VTX0FVVE8pCi17VjRMMl9DSURfRk9DVVNfQVVUTywgIlY0TDJfQ0lEX0ZPQ1VTX0FVVE8ifSwKLSNlbmRpZgotezB4RkZGRkZGRkYsICIifQotfTsKLQotayA9IDA7Ci13aGlsZSAobWVzc1trXS5uYW1lWzBdKSB7Ci0JaWYgKHdvdCA9PSBtZXNzW2tdLmNvbW1hbmQpIHsKLQkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXNcbiIsIFwKLQkJCQkJbWVzc1trXS5jb21tYW5kLCAmbWVzc1trXS5uYW1lWzBdKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWsrKzsKLX0KLUpPVCg4LCAiY2lkIDB4JTA4WCBpcyBub3QgaW4gdmlkZW9kZXYyLmhcbiIsIHdvdCk7Ci1yZXR1cm4gLTE7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9sb3cuYwppbmRleCBhZDFmYzRjLi4yOGM0ZDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKQEAgLTM4LDE0OCArMzgsMjA5IEBACiAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJlYXN5Y2FwX2RlYnVnLmgiCiAjaW5jbHVkZSAiZWFzeWNhcC5oIgorI2luY2x1ZGUgImVhc3ljYXBfZGVidWcuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1jb25zdCBzdHJ1Y3Qgc3RrMTE2MGNvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc3RrMTE2MGNvbmZpZ1syNTZdID0gewotCXsweDAwMCwgMHgwMDk4fSwKLQl7MHgwMDIsIDB4MDA5M30sCitjb25zdCBzdHJ1Y3Qgc3RrMTE2MGNvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc3RrMTE2MGNvbmZpZ1BBTFsyNTZdID0geworCQl7MHgwMDAsIDB4MDA5OH0sCisJCXsweDAwMiwgMHgwMDkzfSwKIAotCXsweDAwMSwgMHgwMDAzfSwKLQl7MHgwMDMsIDB4MDA4MH0sCi0JezB4MDBELCAweDAwMDB9LAotCXsweDAwRiwgMHgwMDAyfSwKLQl7MHgwMTgsIDB4MDAxMH0sCi0JezB4MDE5LCAweDAwMDB9LAotCXsweDAxQSwgMHgwMDE0fSwKLQl7MHgwMUIsIDB4MDAwRX0sCi0JezB4MDFDLCAweDAwNDZ9LAorCQl7MHgwMDEsIDB4MDAwM30sCisJCXsweDAwMywgMHgwMDgwfSwKKwkJezB4MDBELCAweDAwMDB9LAorCQl7MHgwMEYsIDB4MDAwMn0sCisJCXsweDAxOCwgMHgwMDEwfSwKKwkJezB4MDE5LCAweDAwMDB9LAorCQl7MHgwMUEsIDB4MDAxNH0sCisJCXsweDAxQiwgMHgwMDBFfSwKKwkJezB4MDFDLCAweDAwNDZ9LAogCi0JezB4MTAwLCAweDAwMzN9LAotCXsweDEwMywgMHgwMDAwfSwKLQl7MHgxMDQsIDB4MDAwMH0sCi0JezB4MTA1LCAweDAwMDB9LAotCXsweDEwNiwgMHgwMDAwfSwKKwkJezB4MTAwLCAweDAwMzN9LAorCQl7MHgxMDMsIDB4MDAwMH0sCisJCXsweDEwNCwgMHgwMDAwfSwKKwkJezB4MTA1LCAweDAwMDB9LAorCQl7MHgxMDYsIDB4MDAwMH0sCiAKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworLyoKKyAqICBSRVNPTFVUSU9OIDY0MHg0ODAKKyovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisJCXsweDExMCwgMHgwMDA4fSwKKwkJezB4MTExLCAweDAwMDB9LAorCQl7MHgxMTIsIDB4MDAyMH0sCisJCXsweDExMywgMHgwMDAwfSwKKwkJezB4MTE0LCAweDA1MDh9LAorCQl7MHgxMTUsIDB4MDAwNX0sCisJCXsweDExNiwgMHgwMTEwfSwKKwkJezB4MTE3LCAweDAwMDF9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCi0jdW5kZWYgIE9MRE1BUkdJTgotI2lmIGRlZmluZWQoT0xETUFSR0lOKQotCXsweDExMCwgMHgwMDA4fSwKLSNlbHNlCi0JezB4MTEwLCAweDAwMTR9LAotI2VuZGlmIC8qT0xETUFSR0lOKi8KKwkJezB4MjAyLCAweDAwMEZ9LAorCQl7MHgyMDMsIDB4MDA0QX0sCisJCXsweDJGRiwgMHgwMDAwfSwKIAotCXsweDExMSwgMHgwMDAwfSwKLQl7MHgxMTIsIDB4MDAwM30sCi0JezB4MTEzLCAweDAwMDB9LAotCi0jaWYgZGVmaW5lZChPTERNQVJHSU4pCi0JezB4MTE0LCAweDA1MDh9LAotI2Vsc2UKLQl7MHgxMTQsIDB4MDUxNH0sCi0jZW5kaWYgLypPTERNQVJHSU4qLwotCi0JezB4MTE1LCAweDAwMDV9LAotCXsweDExNiwgMHgwMEYzfSwKLQl7MHgxMTcsIDB4MDAwMH0sCi0KLSNlbHNlIC8qICEgUFJFRkVSX05UU0MqLwotCi0jaWYgZGVmaW5lZChPTERNQVJHSU4pCi0JezB4MTEwLCAweDAwMDh9LAotI2Vsc2UKLQl7MHgxMTAsIDB4MDAxNH0sCi0jZW5kaWYgLypPTERNQVJHSU4qLwotCi0JezB4MTExLCAweDAwMDB9LAotCXsweDExMiwgMHgwMDIwfSwKLQl7MHgxMTMsIDB4MDAwMH0sCi0KLSNpZiBkZWZpbmVkKE9MRE1BUkdJTikKLQl7MHgxMTQsIDB4MDUwOH0sCi0jZWxzZQotCXsweDExNCwgMHgwNTE0fSwKLSNlbmRpZiAvKk9MRE1BUkdJTiovCi0KLQl7MHgxMTUsIDB4MDAwNX0sCi0JezB4MTE2LCAweDAxMTB9LAotCXsweDExNywgMHgwMDAxfSwKLQotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCi0JezB4MjAyLCAweDAwMEZ9LAotCXsweDIwMywgMHgwMDRBfSwKLQl7MHgyRkYsIDB4MDAwMH0sCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JezB4RkZGLCAweEZGRkZ9Ci0JfTsKKwkJezB4RkZGLCAweEZGRkZ9Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1jb25zdCBzdHJ1Y3Qgc2FhNzExM2NvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc2FhNzExM2NvbmZpZ1syNTZdID0gewotCXsweDAxLCAweDA4fSwKLQl7MHgwMiwgMHg4MH0sCi0JezB4MDMsIDB4MzN9LAotCXsweDA0LCAweDAwfSwKLQl7MHgwNSwgMHgwMH0sCi0JezB4MDYsIDB4RTl9LAotCXsweDA3LCAweDBEfSwKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQotCXsweDA4LCAweDc4fSwKK2NvbnN0IHN0cnVjdCBzdGsxMTYwY29uZmlnIHN0azExNjBjb25maWdOVFNDWzI1Nl0gPSB7CisJCXsweDAwMCwgMHgwMDk4fSwKKwkJezB4MDAyLCAweDAwOTN9LAorCisJCXsweDAwMSwgMHgwMDAzfSwKKwkJezB4MDAzLCAweDAwODB9LAorCQl7MHgwMEQsIDB4MDAwMH0sCisJCXsweDAwRiwgMHgwMDAyfSwKKwkJezB4MDE4LCAweDAwMTB9LAorCQl7MHgwMTksIDB4MDAwMH0sCisJCXsweDAxQSwgMHgwMDE0fSwKKwkJezB4MDFCLCAweDAwMEV9LAorCQl7MHgwMUMsIDB4MDA0Nn0sCisKKwkJezB4MTAwLCAweDAwMzN9LAorCQl7MHgxMDMsIDB4MDAwMH0sCisJCXsweDEwNCwgMHgwMDAwfSwKKwkJezB4MTA1LCAweDAwMDB9LAorCQl7MHgxMDYsIDB4MDAwMH0sCisKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qCisgKiAgUkVTT0xVVElPTiA2NDB4NDgwCisqLworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCQl7MHgxMTAsIDB4MDAwOH0sCisJCXsweDExMSwgMHgwMDAwfSwKKwkJezB4MTEyLCAweDAwMDN9LAorCQl7MHgxMTMsIDB4MDAwMH0sCisJCXsweDExNCwgMHgwNTA4fSwKKwkJezB4MTE1LCAweDAwMDV9LAorCQl7MHgxMTYsIDB4MDBGM30sCisJCXsweDExNywgMHgwMDAwfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKworCQl7MHgyMDIsIDB4MDAwRn0sCisJCXsweDIwMywgMHgwMDRBfSwKKwkJezB4MkZGLCAweDAwMDB9LAorCisJCXsweEZGRiwgMHhGRkZGfQorfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworY29uc3Qgc3RydWN0IHNhYTcxMTNjb25maWcgeyBpbnQgcmVnOyBpbnQgc2V0OyB9IHNhYTcxMTNjb25maWdQQUxbMjU2XSA9IHsKKwkJezB4MDEsIDB4MDh9LAorI2lmIGRlZmluZWQoQU5USUFMSUFTKQorCQl7MHgwMiwgMHhDMH0sCiAjZWxzZQotCXsweDA4LCAweDM4fSwKLSNlbmRpZiAvKiAhIFBSRUZFUl9OVFNDKi8KLQl7MHgwOSwgMHgwMH0sCi0JezB4MEEsIFNBQV8wQV9ERUZBVUxUfSwKLQl7MHgwQiwgU0FBXzBCX0RFRkFVTFR9LAotCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCi0JezB4MEQsIFNBQV8wRF9ERUZBVUxUfSwKLQl7MHgwRSwgMHgwMX0sCi0JezB4MEYsIDB4MzZ9LAotCXsweDEwLCAweDAwfSwKLQl7MHgxMSwgMHgwQ30sCi0JezB4MTIsIDB4RTd9LAotCXsweDEzLCAweDAwfSwKLQl7MHgxNSwgMHgwMH0sCi0JezB4MTYsIDB4MDB9LAotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0JezB4NDAsIDB4ODJ9LAorCQl7MHgwMiwgMHg4MH0sCisjZW5kaWYgLypBTlRJQUxJQVMqLworCQl7MHgwMywgMHgzM30sCisJCXsweDA0LCAweDAwfSwKKwkJezB4MDUsIDB4MDB9LAorCQl7MHgwNiwgMHhFOX0sCisJCXsweDA3LCAweDBEfSwKKwkJezB4MDgsIDB4Mzh9LAorCQl7MHgwOSwgMHgwMH0sCisJCXsweDBBLCBTQUFfMEFfREVGQVVMVH0sCisJCXsweDBCLCBTQUFfMEJfREVGQVVMVH0sCisJCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCisJCXsweDBELCBTQUFfMERfREVGQVVMVH0sCisJCXsweDBFLCAweDAxfSwKKwkJezB4MEYsIDB4MzZ9LAorCQl7MHgxMCwgMHgwMH0sCisJCXsweDExLCAweDBDfSwKKwkJezB4MTIsIDB4RTd9LAorCQl7MHgxMywgMHgwMH0sCisJCXsweDE1LCAweDAwfSwKKwkJezB4MTYsIDB4MDB9LAorCQl7MHg0MCwgMHgwMn0sCisJCXsweDQxLCAweEZGfSwKKwkJezB4NDIsIDB4RkZ9LAorCQl7MHg0MywgMHhGRn0sCisJCXsweDQ0LCAweEZGfSwKKwkJezB4NDUsIDB4RkZ9LAorCQl7MHg0NiwgMHhGRn0sCisJCXsweDQ3LCAweEZGfSwKKwkJezB4NDgsIDB4RkZ9LAorCQl7MHg0OSwgMHhGRn0sCisJCXsweDRBLCAweEZGfSwKKwkJezB4NEIsIDB4RkZ9LAorCQl7MHg0QywgMHhGRn0sCisJCXsweDRELCAweEZGfSwKKwkJezB4NEUsIDB4RkZ9LAorCQl7MHg0RiwgMHhGRn0sCisJCXsweDUwLCAweEZGfSwKKwkJezB4NTEsIDB4RkZ9LAorCQl7MHg1MiwgMHhGRn0sCisJCXsweDUzLCAweEZGfSwKKwkJezB4NTQsIDB4RkZ9LAorCQl7MHg1NSwgMHhGRn0sCisJCXsweDU2LCAweEZGfSwKKwkJezB4NTcsIDB4RkZ9LAorCQl7MHg1OCwgMHg0MH0sCisJCXsweDU5LCAweDU0fSwKKwkJezB4NUEsIDB4MDd9LAorCQl7MHg1QiwgMHg4M30sCisKKwkJezB4RkYsIDB4RkZ9Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3Qgc2FhNzExM2NvbmZpZyBzYWE3MTEzY29uZmlnTlRTQ1syNTZdID0geworCQl7MHgwMSwgMHgwOH0sCisjaWYgZGVmaW5lZChBTlRJQUxJQVMpCisJCXsweDAyLCAweEMwfSwKICNlbHNlCi0JezB4NDAsIDB4MDJ9LAotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCXsweDQxLCAweEZGfSwKLQl7MHg0MiwgMHhGRn0sCi0JezB4NDMsIDB4RkZ9LAotCXsweDQ0LCAweEZGfSwKLQl7MHg0NSwgMHhGRn0sCi0JezB4NDYsIDB4RkZ9LAotCXsweDQ3LCAweEZGfSwKLQl7MHg0OCwgMHhGRn0sCi0JezB4NDksIDB4RkZ9LAotCXsweDRBLCAweEZGfSwKLQl7MHg0QiwgMHhGRn0sCi0JezB4NEMsIDB4RkZ9LAotCXsweDRELCAweEZGfSwKLQl7MHg0RSwgMHhGRn0sCi0JezB4NEYsIDB4RkZ9LAotCXsweDUwLCAweEZGfSwKLQl7MHg1MSwgMHhGRn0sCi0JezB4NTIsIDB4RkZ9LAotCXsweDUzLCAweEZGfSwKLQl7MHg1NCwgMHhGRn0sCi0JezB4NTUsIDB4RkZ9LAotCXsweDU2LCAweEZGfSwKLQl7MHg1NywgMHhGRn0sCi0JezB4NTgsIDB4NDB9LAotCXsweDU5LCAweDU0fSwKLSNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQotCXsweDVBLCAweDBBfSwKLSNlbHNlCi0JezB4NUEsIDB4MDd9LAotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCXsweDVCLCAweDgzfSwKLQl7MHhGRiwgMHhGRn0KLQl9OworCQl7MHgwMiwgMHg4MH0sCisjZW5kaWYgLypBTlRJQUxJQVMqLworCQl7MHgwMywgMHgzM30sCisJCXsweDA0LCAweDAwfSwKKwkJezB4MDUsIDB4MDB9LAorCQl7MHgwNiwgMHhFOX0sCisJCXsweDA3LCAweDBEfSwKKwkJezB4MDgsIDB4Nzh9LAorCQl7MHgwOSwgMHgwMH0sCisJCXsweDBBLCBTQUFfMEFfREVGQVVMVH0sCisJCXsweDBCLCBTQUFfMEJfREVGQVVMVH0sCisJCXsweDBDLCBTQUFfMENfREVGQVVMVH0sCisJCXsweDBELCBTQUFfMERfREVGQVVMVH0sCisJCXsweDBFLCAweDAxfSwKKwkJezB4MEYsIDB4MzZ9LAorCQl7MHgxMCwgMHgwMH0sCisJCXsweDExLCAweDBDfSwKKwkJezB4MTIsIDB4RTd9LAorCQl7MHgxMywgMHgwMH0sCisJCXsweDE1LCAweDAwfSwKKwkJezB4MTYsIDB4MDB9LAorCQl7MHg0MCwgMHg4Mn0sCisJCXsweDQxLCAweEZGfSwKKwkJezB4NDIsIDB4RkZ9LAorCQl7MHg0MywgMHhGRn0sCisJCXsweDQ0LCAweEZGfSwKKwkJezB4NDUsIDB4RkZ9LAorCQl7MHg0NiwgMHhGRn0sCisJCXsweDQ3LCAweEZGfSwKKwkJezB4NDgsIDB4RkZ9LAorCQl7MHg0OSwgMHhGRn0sCisJCXsweDRBLCAweEZGfSwKKwkJezB4NEIsIDB4RkZ9LAorCQl7MHg0QywgMHhGRn0sCisJCXsweDRELCAweEZGfSwKKwkJezB4NEUsIDB4RkZ9LAorCQl7MHg0RiwgMHhGRn0sCisJCXsweDUwLCAweEZGfSwKKwkJezB4NTEsIDB4RkZ9LAorCQl7MHg1MiwgMHhGRn0sCisJCXsweDUzLCAweEZGfSwKKwkJezB4NTQsIDB4RkZ9LAorCQl7MHg1NSwgMHhGRn0sCisJCXsweDU2LCAweEZGfSwKKwkJezB4NTcsIDB4RkZ9LAorCQl7MHg1OCwgMHg0MH0sCisJCXsweDU5LCAweDU0fSwKKwkJezB4NUEsIDB4MEF9LAorCQl7MHg1QiwgMHg4M30sCisKKwkJezB4RkYsIDB4RkZ9Cit9OwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTg3LDYgKzI0OCw5IEBACiBjb25maXJtX3Jlc29sdXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnApCiB7CiBfX3U4IGdldDAsIGdldDEsIGdldDIsIGdldDMsIGdldDQsIGdldDUsIGdldDYsIGdldDc7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMTEwLCAmZ2V0MCk7CiBHRVQocCwgMHgwMTExLCAmZ2V0MSk7CiBHRVQocCwgMHgwMTEyLCAmZ2V0Mik7CkBAIC0yMjcsNiArMjkxLDggQEAKIF9fdTE2IGdldDI7CiBfX3U4IGlnb3Q7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQyID0gMHg4MCAmIGlnb3Q7CiBpZiAoMHg4MCA9PSBnZXQyKQogCUpPVCg4LCAiY29uZmlybV9zdHJlYW06ICBPS1xuIik7CkBAIC0yMzYsMTUgKzMwMiwyNCBAQAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQKLXNldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK3NldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCwgYm9vbCBudHNjKQogewogaW50IGkwOwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogaTAgPSAwOwotd2hpbGUgKDB4RkZGICE9IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCVNFVChwLCBzdGsxMTYwY29uZmlnW2kwXS5yZWcsIHN0azExNjBjb25maWdbaTBdLnNldCk7Ci0JaTArKzsKK2lmICh0cnVlID09IG50c2MpIHsKKwl3aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZykgeworCQlTRVQocCwgc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZywgc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCk7CisJCWkwKys7CiAJfQorfSBlbHNlIHsKKwl3aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCVNFVChwLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcsIHN0azExNjBjb25maWdQQUxbaTBdLnNldCk7CisJCWkwKys7CisJfQorfQogCiB3cml0ZV8zMDAocCk7CiAKQEAgLTI1MiwxOSArMzI3LDI2IEBACiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAotc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQorc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBib29sIG50c2MpCiB7CiBpbnQgaTAsIGlyOwogCi0KLXNldDJ0bzc4KHApOwotCi0KK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci13aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnW2kwXS5yZWcpIHsKLQlpciA9IHdyaXRlX3NhYShwLCBzYWE3MTEzY29uZmlnW2kwXS5yZWcsIHNhYTcxMTNjb25maWdbaTBdLnNldCk7Ci0JaTArKzsKK2lmICh0cnVlID09IG50c2MpIHsKKwl3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCWlyID0gd3JpdGVfc2FhKHAsIHNhYTcxMTNjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJc2FhNzExM2NvbmZpZ05UU0NbaTBdLnNldCk7CisJCWkwKys7CiAJfQorfSBlbHNlIHsKKwl3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJaXIgPSB3cml0ZV9zYWEocCwgc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCXNhYTcxMTNjb25maWdQQUxbaTBdLnNldCk7CisJCWkwKys7CisJfQorfQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI3Myw2ICszNTUsOCBAQAogewogX191OCBpZ290MCwgaWdvdDI7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBHRVQocCwgMHgwMDAyLCAmaWdvdDIpOwogR0VUKHAsIDB4MDAwMCwgJmlnb3QwKTsKIFNFVChwLCAweDAwMDIsIHNldDIpOwpAQCAtMjgzLDYgKzM2Nyw4IEBACiBpbnQKIHdyaXRlX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCwgX191MTYgcmVnMCwgX191MTYgc2V0MCkKIHsKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgyMDAsIDB4MDApOwogU0VUKHAsIDB4MjA0LCByZWcwKTsKIFNFVChwLCAweDIwNSwgc2V0MCk7CkBAIC0zMDYsNiArMzkyLDggQEAKIF9fdTE2IGdvdDUwMiwgZ290NTAzOwogX191MTYgc2V0NTAyLCBzZXQ1MDM7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgwNTA0LCByZWcwKTsKIFNFVChwLCAweDA1MDAsIDB4MDA4Qik7CiAKQEAgLTM0MSw2ICs0MjksOCBAQAogX191OCBpZ290OwogX191MTYgZ290NTAyLCBnb3Q1MDM7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgwNTA0LCByZWcwKTsKIFNFVChwLCAweDA1MDAsIDB4MDA4Qik7CiAKQEAgLTM2MCw2ICs0NTAsOCBAQAogaW50CiB3cml0ZV8zMDAoc3RydWN0IHVzYl9kZXZpY2UgKnApCiB7CitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogU0VUKHAsIDB4MzAwLCAweDAwMTIpOwogU0VUKHAsIDB4MzUwLCAweDAwMkQpOwogU0VUKHAsIDB4MzUxLCAweDAwMDEpOwpAQCAtMzc2LDI0ICs0NjgsNDggQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWNoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK2NoZWNrX3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqcCwgYm9vbCBudHNjKQogewogaW50IGkwLCBpciwgcmM7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci0KIHJjID0gMDsKLXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdbaTBdLnJlZykgewotCWlmICgweDBGID09IHNhYTcxMTNjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9CitpZiAodHJ1ZSA9PSBudHNjKSB7CisJd2hpbGUgKDB4RkYgIT0gc2FhNzExM2NvbmZpZ05UU0NbaTBdLnJlZykgeworCQlpZiAoMHgwRiA9PSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCQlpMCsrOworCQkJY29udGludWU7CisJCX0KIAotCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ1tpMF0ucmVnKTsKLQlpZiAoaXIgIT0gc2FhNzExM2NvbmZpZ1tpMF0uc2V0KSB7Ci0JCVNBWSgiU0FBIHJlZ2lzdGVyIDB4JTAyWCBoYXMgMHglMDJYLCBleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCXNhYTcxMTNjb25maWdbaTBdLnJlZywgaXIsIHNhYTcxMTNjb25maWdbaTBdLnNldCk7Ci0JCXJjLS07CisJCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ05UU0NbaTBdLnJlZyk7CisJCWlmIChpciAhPSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0uc2V0KSB7CisJCQlTQVkoIlNBQSByZWdpc3RlciAweCUwMlggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnLCBcCisJCQkJCQlpciwgc2FhNzExM2NvbmZpZ05UU0NbaTBdLnNldCk7CisJCQlyYy0tOworCQl9CisJCWkwKys7CiAJfQotCWkwKys7Cit9IGVsc2UgeworCXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdQQUxbaTBdLnJlZykgeworCQlpZiAoMHgwRiA9PSBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJCWkwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlyID0gcmVhZF9zYWEocCwgc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnKTsKKwkJaWYgKGlyICE9IHNhYTcxMTNjb25maWdQQUxbaTBdLnNldCkgeworCQkJU0FZKCJTQUEgcmVnaXN0ZXIgMHglMDJYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCQlpciwgc2FhNzExM2NvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJCXJjLS07CisJCX0KKwkJaTArKzsKKwl9CiB9CiBpZiAoLTggPiByYykKIAlyZXR1cm4gcmM7CkBAIC00MDYsNiArNTIyLDggQEAKIHsKIGludCByYzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIHJjID0gcmVhZF9zYWEocCwgMHgxRik7CiBpZiAoKDAgPiByYykgfHwgKDB4MDIgJiByYykpCiAJcmV0dXJuIDEgOwpAQCAtNDE2LDI5ICs1MzQsNDYgQEAKIGludAogcmVhZHlfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQogewotaW50IGosIHJjOwotc3RhdGljIGludCBtYXggPSAxMDsKLQoraW50IGosIHJjLCByYXRlOworY29uc3QgaW50IG1heCA9IDUsIG1hcmt0aW1lID0gUEFUSUVOQ0UvNTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICAgUkVUVVJOUyAgICAwICAgICBGT1IgSU5URVJMQUNFRCAgICAgICA1MCBIegorICogICAgICAgICAgICAgIDEgICAgIEZPUiBOT04tSU5URVJMQUNFRCAgIDUwIEh6CisgKiAgICAgICAgICAgICAgMiAgICAgRk9SIElOVEVSTEFDRUQgICAgICAgNjAgSHoKKyAqICAgICAgICAgICAgICAzICAgICBGT1IgTk9OLUlOVEVSTEFDRUQgICA2MCBIegorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGogPSAwOwogd2hpbGUgKG1heCA+IGopIHsKIAlyYyA9IHJlYWRfc2FhKHAsIDB4MUYpOwogCWlmICgwIDw9IHJjKSB7Ci0JCWlmICgoMSA9PSAoMHgwMSAmIHJjKSkmJigwID09ICgweDQwICYgcmMpKSkKKwkJaWYgKDAgPT0gKDB4NDAgJiByYykpCisJCQlicmVhazsKKwkJaWYgKDEgPT0gKDB4MDEgJiByYykpCiAJCQlicmVhazsKIAl9Ci0JbXNsZWVwKDEwMCk7ICBqKys7CisJbXNsZWVwKG1hcmt0aW1lKTsKKwlqKys7CiB9CiBpZiAobWF4ID09IGopCiAJcmV0dXJuIC0xOwogZWxzZSB7Ci0JaWYgKDB4MjAgJiByYykKKwlpZiAoMHgyMCAmIHJjKSB7CisJCXJhdGUgPSAyOwogCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgNjAgSHpcbiIpOwotCWVsc2UKKwl9IGVsc2UgeworCQlyYXRlID0gMDsKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIDUwIEh6XG4iKTsKKwl9CiAJaWYgKDB4ODAgJiByYykKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIGludGVybGFjaW5nXG4iKTsKLQllbHNlCisJZWxzZSB7CisJCXJhdGUrKzsKIAkJSk9UKDgsICJoYXJkd2FyZSBkZXRlY3RzIG5vIGludGVybGFjaW5nXG4iKTsKKwl9CiB9CiByZXR1cm4gMDsKIH0KQEAgLTQ0Nyw0NSArNTgyLDgwIEBACiAvKgogICogIE5PVEU6IFRIRSBGT0xMT1dJTkcgQVJFIE5PVCBDSEVDS0VEOgogICogIFJFR0lTVEVSUyAweDAwMCwgMHgwMDI6ICBGVU5DVElPTkFMSVRZIElTIE5PVCBLTk9XTgotICogIFJFR0lTVEVSICAweDEwMDogIEFDQ0VQVCBBTFNPICgweDgwIHwgc3RrMTE2MGNvbmZpZ1suXS5zZXQpCisgKiAgUkVHSVNURVIgIDB4MTAwOiAgQUNDRVBUIEFMU08gKDB4ODAgfCBzdGsxMTYwY29uZmlnLi4uLlsuXS5zZXQpCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1jaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKnApCitjaGVja19zdGsoc3RydWN0IHVzYl9kZXZpY2UgKnAsIGJvb2wgbnRzYykKIHsKIGludCBpMCwgaXI7CisKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci13aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JaWYgKDB4MDAwID09IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9Ci0JaWYgKDB4MDAyID09IHN0azExNjBjb25maWdbaTBdLnJlZykgewotCQlpMCsrOyBjb250aW51ZTsKLQl9Ci0KLQlpciA9IHJlYWRfc3RrKHAsIHN0azExNjBjb25maWdbaTBdLnJlZyk7Ci0KLQlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSAmJiBcCi0JCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpKSAmJiBcCi0JCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSB7Ci0JCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCi0JCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOworaWYgKHRydWUgPT0gbnRzYykgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCWlmICgweDAwMCA9PSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCQlpZiAoMHgwMDIgPT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaXIgPSByZWFkX3N0ayhwLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKTsKKwkJaWYgKDB4MTAwID09IHN0azExNjBjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgJiYgXAorCQkJCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCkpKSAmJiBcCisJCQkJCSgweEZGRkYgIT0gXAorCQkJCQlzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgeworCQkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXN0azExNjBjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KTsKKwkJCQl9CisJCQlpMCsrOyBjb250aW51ZTsKIAkJCX0KLQkJaTArKzsgY29udGludWU7CisJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgJiYgXAorCQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnNldCkpIHsKKwkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXN0azExNjBjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KTsKIAkJfQotCi0JaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpICYmIFwKLQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KSkgewotCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCi0JCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKLQkJCQkJc3RrMTE2MGNvbmZpZ1tpMF0ucmVnLCBpciwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5zZXQpOwotCQl9Ci0JaTArKzsKKwkJaTArKzsKIAl9Cit9IGVsc2UgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJaWYgKDB4MDAwID09IHN0azExNjBjb25maWdQQUxbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaWYgKDB4MDAyID09IHN0azExNjBjb25maWdQQUxbaTBdLnJlZykgeworCQkJaTArKzsgY29udGludWU7CisJCX0KKwkJaXIgPSByZWFkX3N0ayhwLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpOworCQlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCQlpZiAoKGlyICE9ICgweEZGICYgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgJiYgXAorCQkJCQkoaXIgIT0gKDB4ODAgfCAoMHhGRiAmIFwKKwkJCQkJc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkpICYmIFwKKwkJCQkJKDB4RkZGRiAhPSBcCisJCQkJCXN0azExNjBjb25maWdQQUxbaTBdLnNldCkpIHsKKwkJCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpOworCQkJCX0KKwkJCWkwKys7IGNvbnRpbnVlOworCQkJfQorCQlpZiAoKGlyICE9ICgweEZGICYgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgJiYgXAorCQkJCSgweEZGRkYgIT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgeworCQkJU0FZKCJTVEsgcmVnaXN0ZXIgMHglMDNYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnLCBcCisJCQkJCQlpciwgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJfQorCQlpMCsrOworCX0KK30KIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00OTQsNiArNjY0LDggQEAKIHsKIF9fdTggaWdvdDsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIFNFVChwLCAweDIwOCwgcmVnMCk7CiBTRVQocCwgMHgyMDAsIDB4MjApOwogaWYgKDAgIT0gd2FpdF9pMmMocCkpCkBAIC01MDgsMTIgKzY4MCwxNCBAQAogewogX191OCBpZ290OwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogaWdvdCA9IDA7CiBHRVQocCwgcmVnMCwgJmlnb3QpOwogcmV0dXJuIGlnb3Q7CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgIEhBUkRXQVJFICAgIFVTRVJTUEFDRSBJTlBVVCBOVU1CRVIgICBQSFlTSUNBTCBJTlBVVCAgIERSSVZFUiBpbnB1dCBWQUxVRQogICoKQEAgLTUzNCw4MSArNzA4LDEwMCBAQAogaW50CiBzZWxlY3RfaW5wdXQoc3RydWN0IHVzYl9kZXZpY2UgKnAsIGludCBpbnB1dCwgaW50IG1vZGUpCiB7CitpbnQgaXI7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBzdG9wXzEwMChwKTsKLQotbXNsZWVwKDIwKTsKIHN3aXRjaCAoaW5wdXQpIHsKIGNhc2UgMDoKIGNhc2UgMTogewotCVNFVChwLCAweDAwMDAsIDB4MDA5OCk7IGJyZWFrOworCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyIGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOworCX0KKwlTRVQocCwgMHgwMDAwLCAweDAwOTgpOworCVNFVChwLCAweDAwMDIsIDB4MDA3OCk7CisJYnJlYWs7CiB9CiBjYXNlIDI6IHsKLQlTRVQocCwgMHgwMDAwLCAweDAwOTApOyBicmVhazsKKwlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwMiwgMHg4MCkpIHsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKKwl9CisJU0VUKHAsIDB4MDAwMCwgMHgwMDkwKTsKKwlTRVQocCwgMHgwMDAyLCAweDAwNzgpOworCWJyZWFrOwogfQogY2FzZSAzOiB7Ci0JU0VUKHAsIDB4MDAwMCwgMHgwMDg4KTsgYnJlYWs7CisJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODApKSB7CisJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICVpXG4iLCBcCisJCQkJCQkJCQlpbnB1dCk7CisJfQorCVNFVChwLCAweDAwMDAsIDB4MDA4OCk7CisJU0VUKHAsIDB4MDAwMiwgMHgwMDc4KTsKKwlicmVhazsKIH0KIGNhc2UgNDogewotCVNFVChwLCAweDAwMDAsIDB4MDA4MCk7IGJyZWFrOworCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyIGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOworCX0KKwlTRVQocCwgMHgwMDAwLCAweDAwODApOworCVNFVChwLCAweDAwMDIsIDB4MDA3OCk7CisJYnJlYWs7CiB9CiBjYXNlIDU6IHsKIAlpZiAoOSAhPSBtb2RlKQogCQltb2RlID0gNzsKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIDc6Ci0JCXsKKwljYXNlIDc6IHsKIAkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODcpKSB7Ci0JCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKLQkJCQkicmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgIiBcCi0JCQkJIiVpXG4iLCBpbnB1dCk7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyICIgXAorCQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOwogCQl9CiAJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA1LCAweEZGKSkgewotCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCi0JCQkJInJlZ2lzdGVyIDB4MDUgZm9yIGlucHV0ICIgXAotCQkJCSIlaVxuIiwgaW5wdXQpOworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNSAiIFwKKwkJCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKIAkJfQogCQlicmVhazsKIAl9Ci0JY2FzZSA5OgotCQl7CisJY2FzZSA5OiB7CiAJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDg5KSkgewotCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCi0JCQkJInJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICIgXAotCQkJCSIlaVxuIiwgaW5wdXQpOworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwMiAiIFwKKwkJCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKIAkJfQogCQlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwNSwgMHgwMCkpIHsKLQkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBICIgXAotCQkJCSJyZWdpc3RlciAweDA1IGZvciBpbnB1dCAiIFwKLQkJCQkiJWlcbiIsIGlucHV0KTsKKwkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDUgIiBcCisJCQkJCQkiZm9yIGlucHV0ICVpXG4iLCBpbnB1dCk7CiAJCX0KLQkJYnJlYWs7CisJYnJlYWs7CiAJfQotCWRlZmF1bHQ6Ci0JCXsKKwlkZWZhdWx0OiB7CiAJCVNBWSgiTUlTVEFLRTogIGJhZCBtb2RlOiAlaVxuIiwgbW9kZSk7CiAJCXJldHVybiAtMTsKLQkJfQorCX0KIAl9CiAJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDQsIDB4MDApKSB7Ci0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDQgIiBcCi0JCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNCBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKIAl9CiAJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDksIDB4ODApKSB7Ci0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDkgIiBcCi0JCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwOSBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKIAl9CisJU0VUKHAsIDB4MDAwMiwgMHgwMDkzKTsKIAlicmVhazsKIH0KLWRlZmF1bHQ6Ci0JeworZGVmYXVsdDogewogCVNBWSgiRVJST1I6ICBiYWQgaW5wdXQ6ICVpXG4iLCBpbnB1dCk7CiAJcmV0dXJuIC0xOwogfQogfQotbXNsZWVwKDIwKTsKLVNFVChwLCAweDAwMDIsIDB4MDA5Myk7Ci1tc2xlZXAoMjApOworaXIgPSByZWFkX3N0ayhwLCAweDAwKTsKK0pPVCg4LCAiU1RLIHJlZ2lzdGVyIDB4MDAgaGFzIDB4JTAyWFxuIiwgaXIpOworaXIgPSByZWFkX3NhYShwLCAweDAyKTsKK0pPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4MDIgaGFzIDB4JTAyWFxuIiwgaXIpOwogCiBzdGFydF8xMDAocCk7CiAKQEAgLTYyMSw2ICs4MTQsOCBAQAogewogX191MTYgdTB4MDExMSwgdTB4MDExMywgdTB4MDExNSwgdTB4MDExNzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIHUweDAxMTEgPSAoKDB4RkYwMCAmIHNldDApID4+IDgpOwogdTB4MDExMyA9ICgoMHhGRjAwICYgc2V0MSkgPj4gOCk7CiB1MHgwMTE1ID0gKCgweEZGMDAgJiBzZXQyKSA+PiA4KTsKQEAgLTY0MSwxMyArODM2LDI1IEBACiBpbnQKIHN0YXJ0XzEwMChzdHJ1Y3QgdXNiX2RldmljZSAqcCkKIHsKLV9fdTE2IGdldDA7Ci1fX3U4IGlnb3Q7CitfX3UxNiBnZXQxMTYsIGdldDExNywgZ2V0MDsKK19fdTggaWdvdDExNiwgaWdvdDExNywgaWdvdDsKIAotR0VUKHAsIDB4MDEwMCwgJmlnb3QpOyAgZ2V0MCA9IGlnb3Q7Ci1tc2xlZXAoMHgxZjQpOworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKK0dFVChwLCAweDAxMTYsICZpZ290MTE2KTsKK2dldDExNiA9IGlnb3QxMTY7CitHRVQocCwgMHgwMTE3LCAmaWdvdDExNyk7CitnZXQxMTcgPSBpZ290MTE3OworU0VUKHAsIDB4MDExNiwgMHgwMDAwKTsKK1NFVChwLCAweDAxMTcsIDB4MDAwMCk7CisKK0dFVChwLCAweDAxMDAsICZpZ290KTsKK2dldDAgPSBpZ290OwogU0VUKHAsIDB4MDEwMCwgKDB4ODAgfCBnZXQwKSk7Ci1tc2xlZXAoMHgxZjQpOworCitTRVQocCwgMHgwMTE2LCBnZXQxMTYpOworU0VUKHAsIDB4MDExNywgZ2V0MTE3KTsKKwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY1NywxMCArODY0LDExIEBACiBfX3UxNiBnZXQwOwogX191OCBpZ290OwogCi1HRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKLW1zbGVlcCgweDFmNCk7CitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOworR0VUKHAsIDB4MDEwMCwgJmlnb3QpOworZ2V0MCA9IGlnb3Q7CiBTRVQocCwgMHgwMTAwLCAoMHg3RiAmIGdldDApKTsKLW1zbGVlcCgweDFmNCk7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjc0LDkgKzg4MiwxMSBAQAogewogX191MTYgZ2V0MDsKIF9fdTggaWdvdDsKLWNvbnN0IGludCBtYXggPSA0OworY29uc3QgaW50IG1heCA9IDI7CiBpbnQgazsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGZvciAoayA9IDA7ICBrIDwgbWF4OyAgaysrKSB7CiAJR0VUKHAsIDB4MDIwMSwgJmlnb3QpOyAgZ2V0MCA9IGlnb3Q7CiAJc3dpdGNoIChnZXQwKSB7CkBAIC02ODUsNyArODk1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgMHgwMDogewotCQltc2xlZXAoMTApOworCQltc2xlZXAoMjApOwogCQljb250aW51ZTsKIAl9CiAJZGVmYXVsdDogewpAQCAtNzAzLDggKzkxMyw3IEBACiBpbnQgcmMwLCByYzE7CiAKIGlmICghcHVzYl9kZXZpY2UpCi0JcmV0dXJuIC1FRkFVTFQ7Ci0KKwlyZXR1cm4gLUVOT0RFVjsKIHJjMSA9IDA7ICBpZ290ID0gMDsKIHJjMCA9IHVzYl9jb250cm9sX21zZyhwdXNiX2RldmljZSwgdXNiX3NuZGN0cmxwaXBlKHB1c2JfZGV2aWNlLCAwKSwgXAogCQkoX191OCkweDAxLCBcCkBAIC03NDEsMjcgKzk1MCwxNCBAQAogY2FzZSAweDIwNToKIGNhc2UgMHgzNTA6CiBjYXNlIDB4MzUxOiB7Ci0JaWYgKDAgIT0gaWdvdCkgeworCWlmICgwICE9ICgweEZGICYgaWdvdCkpIHsKIAkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCBmb3IgU1RLIHJlZ2lzdGVyIDB4JTAzWFxuIiwgXAogCQkJCQkJCQlpZ290LCBpbmRleCk7CiAJfQogYnJlYWs7CiB9Ci1jYXNlIDB4MTE0OgotY2FzZSAweDExNjogewotCWlmICgoMHhGRiAmIHZhbHVlKSAhPSBpZ290KSB7Ci0JCUpPVCg4LCAidW5leHBlY3RlZCAweCUwMlggIT0gMHglMDJYICIgXAotCQkJCQkJImZvciBTVEsgcmVnaXN0ZXIgMHglMDNYXG4iLCBcCi0JCQkJCQlpZ290LCB2YWx1ZSwgaW5kZXgpOwotCX0KLWJyZWFrOwotfQotY2FzZSAweDIwMDogewotCWlmICgwID09IGlnb3QpCi0JCWJyZWFrOwotfQogZGVmYXVsdDogewotCWlmICh2YWx1ZSAhPSBpZ290KSB7CisJaWYgKCgweEZGICYgdmFsdWUpICE9ICgweEZGICYgaWdvdCkpIHsKIAkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCAhPSAweCUwMlggIiBcCiAJCQkJCSJmb3IgU1RLIHJlZ2lzdGVyIDB4JTAzWFxuIiwgXAogCQkJCQlpZ290LCB2YWx1ZSwgaW5kZXgpOwpAQCAtNzgwLDggKzk3Niw3IEBACiBpbnQgaXI7CiAKIGlmICghcHVzYl9kZXZpY2UpCi0JcmV0dXJuIC1FRkFVTFQ7Ci0KKwlyZXR1cm4gLUVOT0RFVjsKIGlyID0gdXNiX2NvbnRyb2xfbXNnKHB1c2JfZGV2aWNlLCB1c2JfcmN2Y3RybHBpcGUocHVzYl9kZXZpY2UsIDApLCBcCiAJCShfX3U4KTB4MDAsIFwKIAkJKF9fdTgpKFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFKSwgXApAQCAtNzk2LDYgKzk5MSw4IEBACiBpbnQKIHdha2V1cF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlKQogeworaWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVOT0RFVjsKIHJldHVybiB1c2JfY29udHJvbF9tc2cocHVzYl9kZXZpY2UsIHVzYl9zbmRjdHJscGlwZShwdXNiX2RldmljZSwgMCksIFwKIAkJKF9fdTgpVVNCX1JFUV9TRVRfRkVBVFVSRSwgXAogCQkoX191OCkoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9TVEFOREFSRCB8IFVTQl9SRUNJUF9ERVZJQ0UpLCBcCkBAIC04MDYsNiArMTAwMywxMiBAQAogCQkoaW50KTUwMDAwKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorYXVkaW9fc2V0dXAoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlOwordW5zaWduZWQgY2hhciBidWZmZXJbMV07CitpbnQgcmMsIGlkMSwgaWQyOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6CkBAIC04MTQsMjkgKzEwMTcsMjEgQEAKICAqICBUTyBFTkFCTEUgQVVESU8gIFRIRSBWQUxVRSAweDAyMDAgTVVTVCBCRSBTRU5ULgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQKLWF1ZGlvX3NldHVwKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKLXsKLXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZTsKLXN0YXRpYyBfX3U4IHJlcXVlc3QgPSAweDAxOwotc3RhdGljIF9fdTggcmVxdWVzdHR5cGUgPSBcCitjb25zdCBfX3U4IHJlcXVlc3QgPSAweDAxOworY29uc3QgX191OCByZXF1ZXN0dHlwZSA9IFwKIAkJKF9fdTgpKFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFKTsKLQotc3RhdGljIF9fdTE2IHZhbHVlX3VubXV0ZSA9IDB4MDIwMDsKLXN0YXRpYyBfX3UxNiBpbmRleCA9IDB4MDMwMTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzFdOwotc3RhdGljIF9fdTE2IGxlbmd0aCA9IDE7Ci1pbnQgcmMsIGlkMSwgaWQyOworY29uc3QgX191MTYgdmFsdWVfdW5tdXRlID0gMHgwMjAwOworY29uc3QgX191MTYgaW5kZXggPSAweDAzMDE7Citjb25zdCBfX3UxNiBsZW5ndGggPSAxOwogCiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkKIAlyZXR1cm4gLUVGQVVMVDsKIAogcHVzYl9kZXZpY2UgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CiBpZiAoTlVMTCA9PSBwdXNiX2RldmljZSkKLQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gLUVOT0RFVjsKIAotSk9UKDgsICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCVwKK0pPTSg4LCAiJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAlcCiAJCQlyZXF1ZXN0dHlwZSwgcmVxdWVzdCwJCVwKIAkJCSgweDAwRkYgJiB2YWx1ZV91bm11dGUpLAlcCiAJCQkoMHhGRjAwICYgdmFsdWVfdW5tdXRlKSA+PiA4LAlcCkBAIC04NzUsNDEgKzEwNzAsMjUgQEAKICAqICAgICAgICAgICAgICAgICAgICBUSEUgVVBQRVIgQllURSBTRUVNUyBUTyBIQVZFIE5PIEVGRkVDVC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIFNFVChwdXNiX2RldmljZSwgMHgwNTAwLCAweDAwOTQpOwotCiBTRVQocHVzYl9kZXZpY2UsIDB4MDUwMCwgMHgwMDhDKTsKLQogU0VUKHB1c2JfZGV2aWNlLCAweDA1MDYsIDB4MDAwMSk7CiBTRVQocHVzYl9kZXZpY2UsIDB4MDUwNywgMHgwMDAwKTsKLQogaWQxID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDdDKTsKIGlkMiA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDA3RSk7Ci1TQVkoIjB4JTA0WDoweCUwNFggaXMgYXVkaW8gdmVuZG9yIGlkXG4iLCBpZDEsIGlkMik7Ci0KK1NBTSgiMHglMDRYOjB4JTA0WCBpcyBhdWRpbyB2ZW5kb3IgaWRcbiIsIGlkMSwgaWQyKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0qICAgU0VMRUNUIEFVRElPIFNPVVJDRSAiTElORSBJTiIgQU5EIFNFVCBERUZBVUxUIEdBSU4gVE8gMCBkQi4KLSoKLSogICBUSEVTRSBDT01NQU5EUyBTRUVNIFRPIEJFIEFDQ0VQVEVEIChUSE9VR0ggUE9TU0lCTFkgSUdOT1JFRCkgRVZFTiBXSEVOCi0qICAgVEhFUkUgSVMgTk8gU0VQQVJBVEUgQVVESU8gQ0hJUCBQUkVTRU5ULgorICogIFNFTEVDVCBBVURJTyBTT1VSQ0UgIkxJTkUgSU4iIEFORCBTRVQgVEhFIEFVRElPIEdBSU4uCiAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDgwMDApOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQywgMHg4MDAwKTsKLQotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwRSwgMHgwMDAwKTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTAsIDB4MDAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEyLCAweDgwMDApOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxNiwgMHgwMDAwKTsKLQotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSwgMHgwNDA0KTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4MDAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDAwMDApOwotCitpZiAoMzEgPCBlYXN5Y2FwX2dhaW4pCisJZWFzeWNhcF9nYWluID0gMzE7CitpZiAoMCA+IGVhc3ljYXBfZ2FpbikKKwllYXN5Y2FwX2dhaW4gPSAwOworaWYgKDAgIT0gYXVkaW9fZ2FpbnNldChwdXNiX2RldmljZSwgKF9fczgpZWFzeWNhcF9nYWluKSkKKwlTQVkoIkVSUk9SOiBhdWRpb19nYWluc2V0KCkgZmFpbGVkXG4iKTsKIGNoZWNrX3Z0KHB1c2JfZGV2aWNlKTsKLQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MTgsNiArMTA5Nyw4IEBACiB7CiBpbnQgaWdvdDsKIAoraWYgKCFwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVOT0RFVjsKIGlnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIpOwogaWYgKDAgPiBpZ290KQogCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgwMlxuIik7CkBAIC05NDIsMTcgKzExMjMsMjMgQEAKIGlmICgweDgwMDAgJiBpZ290KQogCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDEyKTsKIAoraWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxNCk7CitpZiAoMCA+IGlnb3QpCisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE0XG4iKTsKK2lmICgweDgwMDAgJiBpZ290KQorCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDE0KTsKKwogaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxNik7CiBpZiAoMCA+IGlnb3QpCiAJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE2XG4iKTsKIGlmICgweDgwMDAgJiBpZ290KQogCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDE2KTsKIAotaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxQSk7CitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDE4KTsKIGlmICgwID4gaWdvdCkKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MUFcbiIpOworCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxOFxuIik7CiBpZiAoMHg4MDAwICYgaWdvdCkKLQlTQVkoInJlZ2lzdGVyIDB4JTAyWCBtdXRlZFxuIiwgMHgxQSk7CisJU0FZKCJyZWdpc3RlciAweCUwMlggbXV0ZWRcbiIsIDB4MTgpOwogCiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkKQEAgLTk2NCwxNCArMTE1MSwxOCBAQAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBOT1RFOiAgVEhJUyBET0VTIElOQ1JFQVNFIFRIRSBWT0xVTUUgRFJBTUFUSUNBTExZOgotICogICAgICAgICBhdWRpb19nYWluc2V0KHB1c2JfZGV2aWNlLCAweDAwMEYpOworLyogIE5PVEU6ICBUSElTIERPRVMgSU5DUkVBU0UgVEhFIFZPTFVNRSBEUkFNQVRJQ0FMTFk6CisgKiAgICAgICAgICAgICAgICAgICAgICBhdWRpb19nYWluc2V0KHB1c2JfZGV2aWNlLCAweDAwMEYpOwogICoKLSAqICBJRiAxNjxsb3VkPDMxIFZUMTYyMUEgUkVHSVNURVIgMHgxQyBJUyBTRVQgRk9SIFBPU0lUSVZFIEdBSU4uCi0gKiAgSUYgbG91ZDw9MTYgVlQxNjIxQSBSRUdJU1RFUiAweDFDIElTIFNFVCBGT1IgWkVSTyBHQUlOLgotICogIFRIRVJFIElTIE5FVkVSIEFOWSAoQURESVRJT05BTCkgQVRURU5VQVRJT04uCi0gKi8KKyAqICAgICAgIGxvdWQgICAgICAgIGRCICByZWdpc3RlciAweDEwICAgICAgZEIgcmVnaXN0ZXIgMHgxQyAgICBkQiB0b3RhbAorICogICAgICAgICAwICAgICAgICAgICAgICAgLTM0LjUgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAtMzQuNQorICogICAgICAgIC4uICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLi4uLgorICogICAgICAgIDE1ICAgICAgICAgICAgICAgIDEwLjUgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMTAuNQorICogICAgICAgIDE2ICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMTIuMAorICogICAgICAgIDE3ICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAgMS41ICAgICAgICAgICAgMTMuNQorICogICAgICAgIC4uICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAgICAgICAuLi4uICAgICAgICAgICAgLi4uLgorICogICAgICAgIDMxICAgICAgICAgICAgICAgIDEyLjAgICAgICAgICAgICAgICAgICAyMi41ICAgICAgICAgICAgMzQuNQorKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludAogYXVkaW9fZ2FpbnNldChzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UsIF9fczggbG91ZCkKQEAgLTk4MCwyNSArMTE3MSw2NSBAQAogX191OCB1ODsKIF9fdTE2IG11dGU7CiAKLWlmICgxNiA+IGxvdWQpCi0JbG91ZCA9IDE2OwotdTggPSAweDAwMEYgJiAoX191OCkobG91ZCAtIDE2KTsKK2lmIChOVUxMID09IHB1c2JfZGV2aWNlKQorCXJldHVybiAtRU5PREVWOworaWYgKDAgPiBsb3VkKQorCWxvdWQgPSAwOworaWYgKDMxIDwgbG91ZCkKKwlsb3VkID0gMzE7CiAKIHdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4ODAwMCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDBFKTsKK2lmICgwID4gaWdvdCkgeworCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgwRVxuIik7CisJbXV0ZSA9IDB4MDAwMDsKK30gZWxzZQorCW11dGUgPSAweDgwMDAgJiAoKHVuc2lnbmVkIGludClpZ290KTsKK211dGUgPSAwOwogCitpZiAoMTYgPiBsb3VkKQorCXU4ID0gMHgwMSB8ICgweDAwMUYgJiAoKChfX3U4KSgxNSAtIGxvdWQpKSA8PCAxKSk7CitlbHNlCisJdTggPSAwOworCitKT1QoOCwgIjB4JTA0WD0obXV0ZXx1OCkgZm9yIFZUMTYxMkEgcmVnaXN0ZXIgMHgwRVxuIiwgbXV0ZSB8IHU4KTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMEUsIChtdXRlIHwgdTgpKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTApOworaWYgKDAgPiBpZ290KSB7CisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDEwXG4iKTsKKwltdXRlID0gMHgwMDAwOworfSBlbHNlCisJbXV0ZSA9IDB4ODAwMCAmICgodW5zaWduZWQgaW50KWlnb3QpOworbXV0ZSA9IDA7CisKK0pPVCg4LCAiMHglMDRYPShtdXRlfHU4fCh1ODw8OCkpIGZvciBWVDE2MTJBIHJlZ2lzdGVyIDB4MTAsLi4uMHgxOFxuIiwgXAorCQkJCQkJCW11dGUgfCB1OCB8ICh1OCA8PCA4KSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEwLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDEyLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE0LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE2LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE4LCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkgewogCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIik7CiAJbXV0ZSA9IDB4MDAwMDsKIH0gZWxzZQogCW11dGUgPSAweDgwMDAgJiAoKHVuc2lnbmVkIGludClpZ290KTsKK211dGUgPSAwOwogCi1KT1QoOCwgIjB4JTA0WD0obXV0ZXx1OHwodTg8PDgpKVxuIiwgbXV0ZSB8IHU4IHwgKHU4IDw8IDgpKTsKK2lmICgxNiA8PSBsb3VkKQorCXU4ID0gMHgwMDBGICYgKF9fdTgpKGxvdWQgLSAxNik7CitlbHNlCisJdTggPSAwOwogCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDgwMDApOworSk9UKDgsICIweCUwNFg9KG11dGV8dTh8KHU4PDw4KSkgZm9yIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIiwgXAorCQkJCQkJCW11dGUgfCB1OCB8ICh1OCA8PCA4KSk7CiB3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAobXV0ZSB8IHU4IHwgKHU4IDw8IDgpKSk7Cit3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFBLCAweDA0MDQpOwogd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwMiwgMHgwMDAwKTsKLQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDA3LDM1ICsxMjM4LDExIEBACiB7CiBpbnQgaWdvdDsKIAoraWYgKE5VTEwgPT0gcHVzYl9kZXZpY2UpCisJcmV0dXJuIC1FTk9ERVY7CiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFDKTsKIGlmICgwID4gaWdvdCkKIAlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MUNcbiIpOwogcmV0dXJuIGlnb3Q7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQKLXNldDJ0bzc4KHN0cnVjdCB1c2JfZGV2aWNlICpwKQotewotaW50IGlyOwotCi1tc2xlZXAoMjApOwotaXIgPSByZWdzZXQocCwgMHgwMDAyLCAweDAwNzgpOwotaWYgKDAgPiBpcikKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IHJlZ2lzdGVyIDB4MDAwMiB0byAweDAwNzhcbiIpOwotbXNsZWVwKDIwKTsKLXJldHVybiBpcjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotc2V0MnRvOTMoc3RydWN0IHVzYl9kZXZpY2UgKnApCi17Ci1pbnQgaXI7Ci0KLW1zbGVlcCgyMCk7Ci1pciA9IHJlZ3NldChwLCAweDAwMDIsIDB4MDA5Myk7Ci1pZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgcmVnaXN0ZXIgMHgwMDAyIHRvIDB4MDA3OFxuIik7Ci1tc2xlZXAoMjApOwotcmV0dXJuIGlyOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwppbmRleCA1YTRiYmQ5Li5hY2MxZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYwpAQCAtMzAsOSArMzAsMjkgQEAKIAogI2luY2x1ZGUgImVhc3ljYXAuaCIKICNpbmNsdWRlICJlYXN5Y2FwX3N0YW5kYXJkLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9pb2N0bC5oIgogCi1pbnQgZWFzeWNhcF9kZWJ1ZzsKLW1vZHVsZV9wYXJhbShlYXN5Y2FwX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK3N0YXRpYyBpbnQgZWFzeWNhcF9kZWJ1ZzsKK3N0YXRpYyBpbnQgZWFzeWNhcF9iYXJzOworaW50IGVhc3ljYXBfZ2FpbiA9IDE2OworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBlYXN5Y2FwX2RlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZChiYXJzLCBlYXN5Y2FwX2JhcnMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGdhaW4sIGVhc3ljYXBfZ2FpbiwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgZG9uZ2xlX3RoaXMgSVMgSU5ESVNQRU5TSUJMWSBzdGF0aWMgQkVDQVVTRSBGVU5DVElPTiBlYXN5Y2FwX3VzYl9wcm9iZSgpCisgKiAgSVMgQ0FMTEVEIFNVQ0NFU1NJVkVMWSBGT1IgSU5URVJGQUNFUyAwLCAxLCAyIEFORCBUSEUgUE9JTlRFUiBwZWFzeWNhcAorICogIEFMTE9DQVRFRCBEVVJJTkcgVEhFIFBST0JJTkcgT0YgSU5URVJGQUNFIDAgTVVTVCBCRSBSRU1FTUJFUkVEIFdIRU4KKyAqICBQUk9CSU5HIElOVEVSRkFDRVMgMSBBTkQgMi4KKyAqCisgKiAgSU9DVEwgTE9DS0lORyBJUyBET05FIEFUIE1PRFVMRSBMRVZFTCwgTk9UIERFVklDRSBMRVZFTC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBlYXN5Y2FwX2RvbmdsZSBlYXN5Y2FwX2RvbmdsZVtET05HTEVfTUFOWV07CitzdGF0aWMgaW50IGRvbmdsZV90aGlzOworc3RhdGljIGludCBkb25nbGVfZG9uZTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTYzLDIyICs4MywyNSBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBlYXN5Y2FwX29wZW4sCiAJLnJlbGVhc2UJPSBlYXN5Y2FwX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gZWFzeWNhcF9pb2N0bCwKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwpCisJLnVubG9ja2VkX2lvY3RsCT0gZWFzeWNhcF9pb2N0bF9ub2lub2RlLAorI2Vsc2UKKwkuaW9jdGwJCT0gZWFzeWNhcF9pb2N0bCwKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwqLwogCS5wb2xsCQk9IGVhc3ljYXBfcG9sbCwKIAkubW1hcAkJPSBlYXN5Y2FwX21tYXAsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9Owogc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGVhc3ljYXBfdm1fb3BzID0gewotLm9wZW4gID0gZWFzeWNhcF92bWFfb3BlbiwKLS5jbG9zZSA9IGVhc3ljYXBfdm1hX2Nsb3NlLAotLmZhdWx0ID0gZWFzeWNhcF92bWFfZmF1bHQsCisJLm9wZW4gID0gZWFzeWNhcF92bWFfb3BlbiwKKwkuY2xvc2UgPSBlYXN5Y2FwX3ZtYV9jbG9zZSwKKwkuZmF1bHQgPSBlYXN5Y2FwX3ZtYV9mYXVsdCwKIH07CiBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBlYXN5Y2FwX2NsYXNzID0gewotLm5hbWUgPSAidXNiL2Vhc3ljYXAlZCIsCi0uZm9wcyA9ICZlYXN5Y2FwX2ZvcHMsCi0ubWlub3JfYmFzZSA9IFVTQl9TS0VMX01JTk9SX0JBU0UsCisJLm5hbWUgPSAidXNiL2Vhc3ljYXAlZCIsCisJLmZvcHMgPSAmZWFzeWNhcF9mb3BzLAorCS5taW5vcl9iYXNlID0gVVNCX1NLRUxfTUlOT1JfQkFTRSwKIH07Ci0KIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCiAjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUykKQEAgLTg2LDE2ICsxMDksMTcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZWFzeWNhcF9vcGVuX25vaW5vZGUsCiAJLnJlbGVhc2UJPSBlYXN5Y2FwX3JlbGVhc2Vfbm9pbm9kZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsLAorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkKKwkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsX25vaW5vZGUsCisjZWxzZQorCS5pb2N0bAkJPSBlYXN5Y2FwX2lvY3RsLAorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCiAJLnBvbGwJCT0gZWFzeWNhcF9wb2xsLAogCS5tbWFwCQk9IGVhc3ljYXBfbW1hcCwKIH07CiAjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUyovCi1pbnQgdmlkZW9fZGV2aWNlX21hbnkgLyo9MCovOwotc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2FycmF5W1ZJREVPX0RFVklDRV9NQU5ZXSwgKnB2aWRlb19kZXZpY2U7CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCiAvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFBBUkFNRVRFUlMgVVNFRCBXSEVOIFJFR0lTVEVSSU5HIFRIRSBBVURJTyBJTlRFUkZBQ0UKQEAgLTEwNSw3ICsxMjksMTEgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCT0gZWFzeXNuZF9vcGVuLAogCS5yZWxlYXNlCT0gZWFzeXNuZF9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9IGVhc3lzbmRfaW9jdGwsCisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKQorCS51bmxvY2tlZF9pb2N0bAk9IGVhc3lzbmRfaW9jdGxfbm9pbm9kZSwKKyNlbHNlCisJLmlvY3RsCQk9IGVhc3lzbmRfaW9jdGwsCisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKi8KIAkucmVhZAkJPSBlYXN5c25kX3JlYWQsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9OwpAQCAtMTE1LDE3ICsxNDMsMjYgQEAKIC5taW5vcl9iYXNlID0gVVNCX1NLRUxfTUlOT1JfQkFTRSwKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBJVCBJUyBOT1QgQVBQUk9QUklBVEUgRk9SIGVhc3ljYXBfb3BlbigpIFRPIFNVQk1JVCBUSEUgVklERU8gVVJCUyBIRVJFLAotICogIEJFQ0FVU0UgVEhFUkUgV0lMTCBBTFdBWVMgQkUgU1VCU0VRVUVOVCBORUdPVElBVElPTiBPRiBUViBTVEFOREFSRCBBTkQKLSAqICBGT1JNQVQgQlkgSU9DVEwgQU5EIElUIElTIElOQURWSVNBQkxFIFRPIEhBVkUgVEhFIFVSQlMgUlVOTklORyBXSElMRQotICogIFJFR0lTVEVSUyBPRiBUSEUgU0E3MTEzSCBBUkUgQkVJTkcgTUFOSVBVTEFURUQuCi0gKgotICogIFRIRSBTVUJNSVNTSU9OIE9GIFZJREVPIFVSQlMgSVMgVEhFUkVGT1JFIERFTEFZRUQgVU5USUwgVEhFIElPQ1RMIENPTU1BTkQKLSAqICBTVFJFQU1PTiBJUyBSRUNFSVZFRC4KLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiAgVEhJUyBST1VUSU5FIERPRVMgTk9UIERFVEVDVCBEVVBMSUNBVEUgT0NDVVJSRU5DRVMgT0YgUE9JTlRFUiBwZWFzeWNhcAorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAoraXNkb25nbGUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworaW50IGs7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkKKwlyZXR1cm4gLTI7Citmb3IgKGsgPSAwOyBrIDwgRE9OR0xFX01BTlk7IGsrKykgeworCWlmIChlYXN5Y2FwX2RvbmdsZVtrXS5wZWFzeWNhcCA9PSBwZWFzeWNhcCkgeworCQlwZWFzeWNhcC0+aXNkb25nbGUgPSBrOworCQlyZXR1cm4gazsKKwl9Cit9CityZXR1cm4gLTE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50CkBAIC0xNDAsMTUgKzE3NywxNyBAQAogewogI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CisjZWxzZQorc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZTsKICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KLXN0cnVjdCB1c2JfZGV2aWNlICpwOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwotaW50IGksIGssIG0sIHJjOworaW50IHJjOwogCiBKT1QoNCwgIlxuIik7CiBTQVkoIj09PT09PT09PT1PUEVOPT09PT09PT09XG4iKTsKIAogcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCiBpZiAoKHN0cnVjdCBpbm9kZSAqKU5VTEwgPT0gaW5vZGUpIHsKIAlTQVkoIkVSUk9SOiBpbm9kZSBpcyBOVUxMLlxuIik7CkBAIC0xNjIsMTYxICsyMDEsNDI3IEBACiBwZWFzeWNhcCA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOwogLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjZWxzZQotZm9yIChpID0gMDsgIGkgPCB2aWRlb19kZXZpY2VfbWFueTsgIGkrKykgewotCXB2aWRlb19kZXZpY2UgPSBwdmlkZW9fYXJyYXlbaV07Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCAhPSBwdmlkZW9fZGV2aWNlKSB7Ci0JCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7Ci0JCWJyZWFrOwotCX0KLX0KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKLQlTQVkoIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworcHZpZGVvX2RldmljZSA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CitpZiAoKHN0cnVjdCB2aWRlb19kZXZpY2UgKilOVUxMID09IHB2aWRlb19kZXZpY2UpIHsKKwlTQVkoIkVSUk9SOiBwdmlkZW9fZGV2aWNlIGlzIE5VTEwuXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWZpbGUtPnByaXZhdGVfZGF0YSA9IHBlYXN5Y2FwOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBJTklUSUFMSVpBVElPTgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKLQotZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgewotCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKQotCQltZW1zZXQocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28sIDAsIFBBR0VfU0laRSk7CitwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKXZpZGVvX2dldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UpOworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOwogfQotcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHApIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9IGVsc2UgewotCUpPVCgxNiwgIjB4JTA4bFg9cGVhc3ljYXAtPnB1c2JfZGV2aWNlXG4iLCBcCisJSk9NKDE2LCAiMHglMDhsWD1wZWFzeWNhcC0+cHVzYl9kZXZpY2VcbiIsIFwKIAkJCQkJKGxvbmcgaW50KXBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CiB9CitmaWxlLT5wcml2YXRlX2RhdGEgPSBwZWFzeWNhcDsKIHJjID0gd2FrZXVwX2RldmljZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJ3YWtldXBfZGV2aWNlKCkgT0tcbiIpOworCUpPTSg4LCAid2FrZXVwX2RldmljZSgpIE9LXG4iKTsKIGVsc2UgewotCVNBWSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCVNBTSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCWlmICgtRU5PREVWID09IHJjKQorCQlTQU0oIkVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgLUVOT0RFVlxuIik7CisJZWxzZQorCQlTQU0oIkVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CitwZWFzeWNhcC0+aW5wdXQgPSAwOworcmMgPSByZXNldChwZWFzeWNhcCk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHJlc2V0KCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLXJjID0gc2V0dXBfc3RrKHApOyAgcGVhc3ljYXAtPmlucHV0ID0gMDsKLWlmICgwID09IHJjKQotCUpPVCg4LCAic2V0dXBfc3RrKCkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogc2V0dXBfc3RrKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKK3JldHVybiAwOwogfQotcmMgPSBzZXR1cF9zYWEocCk7Ci1pZiAoMCA9PSByYykKLQlKT1QoOCwgInNldHVwX3NhYSgpIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGNoZWNrX3NhYShwKTsKLWlmICgwID09IHJjKQotCUpPVCg4LCAiY2hlY2tfc2FhKCkgT0tcbiIpOwotZWxzZSBpZiAoLTggPCByYykKLQlTQVkoImNoZWNrX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci1lbHNlIHsKLQlTQVkoIkVSUk9SOiBjaGVja19zYWEoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCA9IC0xOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0KLXJjID0gYWRqdXN0X3N0YW5kYXJkKHBlYXN5Y2FwLCBWNEwyX1NURF9OVFNDX00pOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJhZGp1c3Rfc3RhbmRhcmQoLixOVFNDX00pIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IGFkanVzdF9zdGFuZGFyZCguLE5UU0NfTSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X2Zvcm1hdChwZWFzeWNhcCwgNjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9VWVZZLCBWNEwyX0ZJRUxEX05PTkUsIFwKLQkJCQkJCQkJCWZhbHNlKTsKLWlmICgwIDw9IHJjKQotCUpPVCg4LCAiYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsVVlWWSkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsVVlWWSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotI2Vsc2UKLQotcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFwKLQkJKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKLQkJVjRMMl9TVERfUEFMX0kgfCBWNEwyX1NURF9QQUxfTikpOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJhZGp1c3Rfc3RhbmRhcmQoLixQQUxfQkdISU4pIE9LXG4iKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IGFkanVzdF9zdGFuZGFyZCguLFBBTF9CR0hJTikgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X2Zvcm1hdChwZWFzeWNhcCwgNjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9VWVZZLCBWNEwyX0ZJRUxEX05PTkUsIFwKLQkJCQkJCQkJCWZhbHNlKTsKLWlmICgwIDw9IHJjKQotCUpPVCg4LCAiYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsdXl2eSxmYWxzZSkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2Zvcm1hdCguLDY0MCw0ODAsdXl2eSxmYWxzZSkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotI2VuZGlmIC8qICFQUkVGRVJfTlRTQyovCisvKgorICogIFJFU0VUIFRIRSBIQVJEV0FSRSBUTyBJVFMgUkVGRVJFTkNFIFNUQVRFLgorICoKKyAqICBUSElTIFJPVVRJTkUgTUFZIEJFIENBTExFRCBSRVBFQVRFRExZIElGIGVhc3ljYXBfY29tcGxldGUoKSBERVRFQ1RTCisgKiAgQSBCQUQgVklERU8gRlJBTUUgU0laRS4KKyovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1yYyA9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCAtODE5Mik7Ci1pZiAoMCAhPSByYykgewotCVNBWSgiRVJST1I6IGFkanVzdF9icmlnaHRuZXNzKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7CitpbnQKK3Jlc2V0KHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKK3sKK3N0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKK2ludCBpLCByYywgaW5wdXQsIHJhdGU7Citib29sIG50c2MsIG90aGVyOworCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotcmMgPSBhZGp1c3RfY29udHJhc3QocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2NvbnRyYXN0KGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGFkanVzdF9zYXR1cmF0aW9uKHBlYXN5Y2FwLCAtODE5Mik7Ci1pZiAoMCAhPSByYykgewotCVNBWSgiRVJST1I6IGFkanVzdF9zYXR1cmF0aW9uKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1yYyA9IGFkanVzdF9odWUocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2h1ZShkZWZhdWx0KSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQoraW5wdXQgPSBwZWFzeWNhcC0+aW5wdXQ7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCi0JCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CisvKgorICogIElGIFRIRSBTQUE3MTEzSCBIQVMgQUxSRUFEWSBBQ1FVSVJFRCBTWU5DLCBVU0UgSVRTIEhBUkRXQVJFLURFVEVDVEVECisgKiAgRklFTEQgRlJFUVVFTkNZIFRPIERJU1RJTkdVSVNIIE5UU0MgRlJPTSBQQUwuICBUSElTIElTIEVTU0VOVElBTCBGT1IKKyAqICBnc3RyZWFtZXIgQU5EIE9USEVSIFVTRVJTUEFDRSBQUk9HUkFNUyBXSElDSCBNQVkgTk9UIEFUVEVNUFQgVE8gSU5JVElBVEUKKyAqICBBIFNXSVRDSCBCRVRXRUVOIFBBTCBBTkQgTlRTQy4KKyAqCisgKiAgRlVOQ1RJT04gcmVhZHlfc2FhKCkgTUFZIFJFUVVJUkUgQSBTVUJTVEFOVElBTCBGUkFDVElPTiBPRiBBIFNFQ09ORCBUTworICogIENPTVBMRVRFLCBTTyBTSE9VTEQgTk9UIEJFIElOVk9LRUQgV0lUSE9VVCBHT09EIFJFQVNPTi4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitvdGhlciA9IGZhbHNlOworaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpCisJSk9NKDgsICJ0cnVlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK2Vsc2UKKwlKT00oOCwgImZhbHNlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK3JhdGUgPSByZWFkeV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK2lmICgwID4gcmF0ZSkgeworCUpPTSg4LCAibm90IHJlYWR5IHRvIGNhcHR1cmUgYWZ0ZXIgJWkgbXMgLi4uXG4iLCBQQVRJRU5DRSk7CisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJSk9NKDgsICIuLi4gdHJ5aW5nIFBBTCAuLi5cbiIpOyAgbnRzYyA9IGZhbHNlOworCX0gZWxzZSB7CisJCUpPTSg4LCAiLi4uIHRyeWluZyBOVFNDIC4uLlxuIik7IG50c2MgPSB0cnVlOworfQorcmMgPSBzZXR1cF9zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBudHNjKTsKIGlmICgwID09IHJjKQotCUpPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgT0tcbiIsIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UsIFwKLQkJCQkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKKwlKT00oNCwgInNldHVwX3N0aygpIE9LXG4iKTsKIGVsc2UgewotCVNBWSgiRVJST1I6IHVzYl9zZXRfaW50ZXJmYWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlTQU0oIkVSUk9SOiBzZXR1cF9zdGsoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCXJldHVybiAtRUZBVUxUOwogfQotcmMgPSBzdGFydF8xMDAocCk7CityYyA9IHNldHVwX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIG50c2MpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJzdGFydF8xMDAoKSBPS1xuIik7CisJSk9NKDQsICJzZXR1cF9zYWEoKSBPS1xuIik7CiBlbHNlIHsKLQlTQVkoIkVSUk9SOiBzdGFydF8xMDAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCVNBTSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1wZWFzeWNhcC0+dmlkZW9faXNvY19zZXF1ZW5jZSA9IFZJREVPX0lTT0NfQlVGRkVSX01BTlkgLSAxOwotcGVhc3ljYXAtPnZpZGVvX2lkbGUgPSAwOwotcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOworcmF0ZSA9IHJlYWR5X3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworaWYgKDAgPiByYXRlKSB7CisJSk9NKDgsICJub3QgcmVhZHkgdG8gY2FwdHVyZSBhZnRlciAlaSBtcyAuLi5cbiIsIFBBVElFTkNFKTsKKwlKT00oOCwgIi4uLiBzYWEgcmVnaXN0ZXIgMHgxRiBoYXMgMHglMDJYXG4iLCBcCisJCQkJcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDFGKSk7CisJbnRzYyA9IHBlYXN5Y2FwLT5udHNjOworCX0gZWxzZSB7CisJCUpPTSg4LCAiLi4uIHN1Y2Nlc3MgYXQgc2Vjb25kIHRyeTogICVpPXJhdGVcbiIsIHJhdGUpOworCQludHNjID0gKDAgPCAocmF0ZS8yKSkgPyB0cnVlIDogZmFsc2UgOworCQlvdGhlciA9IHRydWU7CisJfQorfSBlbHNlIHsKKwlKT00oOCwgIi4uLiBzdWNjZXNzIGF0IGZpcnN0IHRyeTogICVpPXJhdGVcbiIsIHJhdGUpOworCW50c2MgPSAoMCA8IHJhdGUvMikgPyB0cnVlIDogZmFsc2UgOworfQoraWYgKHRydWUgPT0gbnRzYykKKwlKT00oOCwgInRydWU9bnRzY1xuIik7CitlbHNlCisJSk9NKDgsICJmYWxzZT1udHNjXG4iKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworcmMgPSBzZXR1cF9zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBudHNjKTsKK2lmICgwID09IHJjKQorCUpPTSg0LCAic2V0dXBfc3RrKCkgT0tcbiIpOworZWxzZSB7CisJU0FNKCJFUlJPUjogc2V0dXBfc3RrKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gc2V0dXBfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgbnRzYyk7CitpZiAoMCA9PSByYykKKwlKT00oNCwgInNldHVwX3NhYSgpIE9LXG4iKTsKK2Vsc2UgeworCVNBTSgiRVJST1I6IHNldHVwX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKIGZvciAoaSA9IDA7IGkgPCAxODA7IGkrKykKIAlwZWFzeWNhcC0+bWVyaXRbaV0gPSAwOwogcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDA7CiBwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKLQogZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJFU1RPUkUgSU5QVVQgQU5EIEZPUkNFIFJFRlJFU0ggT0YgU1RBTkRBUkQsIEZPUk1BVCwgRVRDLgorICoKKyAqIFdISUxFIFRISVMgUFJPQ0VEVVJFIElTIElOIFBST0dSRVNTLCBTT01FIElPQ1RMIENPTU1BTkRTIFdJTEwgUkVUVVJOIC1FQlVTWS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitwZWFzeWNhcC0+aW5wdXQgPSAtODE5MjsKK3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPSAtODE5MjsKK2lmICh0cnVlID09IG90aGVyKSB7CisJcGVhc3ljYXBfc3RhbmRhcmQgPSAmZWFzeWNhcF9zdGFuZGFyZFswXTsKKwl3aGlsZSAoMHhGRkZGICE9IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJCWlmICh0cnVlID09IG50c2MpIHsKKwkJCWlmIChOVFNDX00gPT0gXAorCQkJCXBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmluZGV4KSB7CisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcF9zdGFuZGFyZCAtIFwKKwkJCQkJCQkmZWFzeWNhcF9zdGFuZGFyZFswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChQQUxfQkdISU4gPT0gXAorCQkJCXBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmluZGV4KSB7CisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcF9zdGFuZGFyZCAtCisJCQkJCQkJJmVhc3ljYXBfc3RhbmRhcmRbMF07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKKwl9CisJaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCQlTQU0oIkVSUk9SOiBzdGFuZGFyZCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CitKT00oOCwgIiVpPXBlYXN5Y2FwLT5pbnB1dHNldFslaV0uc3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCXBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uc3RhbmRhcmRfb2Zmc2V0LCBpbnB1dCk7Cit9CitwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCA9IC04MTkyOworcGVhc3ljYXAtPmJyaWdodG5lc3MgPSAtODE5MjsKK3BlYXN5Y2FwLT5jb250cmFzdCA9IC04MTkyOworcGVhc3ljYXAtPnNhdHVyYXRpb24gPSAtODE5MjsKK3BlYXN5Y2FwLT5odWUgPSAtODE5MjsKIAotcGVhc3ljYXAtPmZ1ZGdlID0gMDsKK3JjID0gbmV3aW5wdXQocGVhc3ljYXAsIGlucHV0KTsKIAotSk9UKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CitpZiAoMCA9PSByYykKKwlKT00oNCwgInJlc3RvcmVkIGlucHV0LCBzdGFuZGFyZCBhbmQgZm9ybWF0XG4iKTsKK2Vsc2UgeworCVNBTSgiRVJST1I6IG5ld2lucHV0KC4sJWkpIHJldHVybmVkICVpXG4iLCByYywgaW5wdXQpOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpCisJSk9NKDgsICJ0cnVlPXBlYXN5Y2FwLT5udHNjXG4iKTsKK2Vsc2UKKwlKT00oOCwgImZhbHNlPXBlYXN5Y2FwLT5udHNjXG4iKTsKKworaWYgKDAgPiBwZWFzeWNhcC0+aW5wdXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+Zm9ybWF0X29mZnNldFxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+YnJpZ2h0bmVzcykgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5icmlnaHRuZXNzXG4iLCBwZWFzeWNhcC0+YnJpZ2h0bmVzcyk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5jb250cmFzdCkgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5jb250cmFzdFxuIiwgcGVhc3ljYXAtPmNvbnRyYXN0KTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPnNhdHVyYXRpb24pIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+c2F0dXJhdGlvblxuIiwgcGVhc3ljYXAtPnNhdHVyYXRpb24pOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+aHVlKSB7CisJU0FNKCJNSVNUQUtFOiAgJWk9cGVhc3ljYXAtPmh1ZVxuIiwgcGVhc3ljYXAtPmh1ZSk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CityZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgVEhFIFJFUVVFU1RFRCBJTlBVVCBJUyBUSEUgU0FNRSBBUyBUSEUgRVhJU1RJTkcgSU5QVVQsIERPIE5PVEhJTkcuCisgKiAgT1RIRVJXSVNFOgorICogICAgICBLSUxMIFVSQlMsIENMRUFSIEZJRUxEIEFORCBGUkFNRSBCVUZGRVJTIEFORCBSRVNFVCBUSEVJUgorICogICAgICAgICAgIF9yZWFkIEFORCBfZmlsbCBQT0lOVEVSUy4KKyAqICAgICAgU0VMRUNUIFRIRSBORVcgSU5QVVQuCisgKiAgICAgIEFESlVTVCBUSEUgU1RBTkRBUkQsIEZPUk1BVCwgQlJJR0hUTkVTUywgQ09OVFJBU1QsIFNBVFVSQVRJT04gQU5EIEhVRQorICogICAgICAgICAgT04gVEhFIEJBU0lTIE9GIElORk9STUFUSU9OIElOIFNUUlVDVFVSRSBlYXN5Y2FwLmlucHV0c2V0W2lucHV0XS4KKyAqICAgICAgUkVTVUJNSVQgVEhFIFVSQlMgSUYgU1RSRUFNSU5HIFdBUyBBTFJFQURZIElOIFBST0dSRVNTLgorICoKKyAqICBOT1RFOgorICogICAgICBUSElTIFJPVVRJTkUgTUFZIEJFIENBTExFRCBGUkVRVUVOVExZIEJZIFpPTkVNSU5ERVIgVklBIElPQ1RMLAorICogICAgICBTTyBJVCBTSE9VTEQgV1JJVEUgT05MWSBTUEFSSU5HTFkgVE8gVEhFIExPR0ZJTEUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CituZXdpbnB1dChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCBpbnB1dCkKK3sKK2ludCByYywgaywgbSwgbW9vZCwgb2ZmOworaW50IGlucHV0bm93LCB2aWRlb19pZGxlbm93LCBhdWRpb19pZGxlbm93OworYm9vbCByZXN1Ym1pdDsKKworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPTSg4LCAiJWk9aW5wdXQgc291Z2h0XG4iLCBpbnB1dCk7CisKK2lmICgwID4gaW5wdXQgJiYgSU5QVVRfTUFOWSA8PSBpbnB1dCkKKwlyZXR1cm4gLUVOT0VOVDsKK2lucHV0bm93ID0gcGVhc3ljYXAtPmlucHV0OworaWYgKGlucHV0ID09IGlucHV0bm93KQorCXJldHVybiAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBTVFJFQU1JTkcgSVMgSU4gUFJPR1JFU1MgVEhFIFVSQlMgQVJFIEtJTExFRCBBVCBUSElTCisgKiAgU1RBR0UgQU5EIFdJTEwgQkUgUkVTVUJNSVRURUQgUFJJT1IgVE8gRVhJVCBGUk9NIFRIRSBST1VUSU5FLgorICogIElGIE5PIFNUUkVBTUlORyBJUyBJTiBQUk9HUkVTUyBOTyBVUkJTIFdJTEwgQkUgU1VCTUlUVEVEIEJZIFRIRQorICogIFJPVVRJTkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordmlkZW9faWRsZW5vdyA9IHBlYXN5Y2FwLT52aWRlb19pZGxlOworYXVkaW9faWRsZW5vdyA9IHBlYXN5Y2FwLT5hdWRpb19pZGxlOworCitwZWFzeWNhcC0+dmlkZW9faWRsZSA9IDE7CitwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDE7CitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmVzdWJtaXQgPSB0cnVlOworCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Cit9IGVsc2UKKwlyZXN1Ym1pdCA9IGZhbHNlOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRU5PREVWOworfQorcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsCisJCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vZmYpOworaWYgKDAgIT0gcmMpIHsKKwlTQU0oIkVSUk9SOiB1c2Jfc2V0X2ludGVyZmFjZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CityYyA9IHN0b3BfMTAwKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHN0b3BfMTAwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2ZvciAoayA9IDA7IGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgaysrKSB7CisJZm9yIChtID0gMDsgbSA8IEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgbSsrKQorCQltZW1zZXQocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28sIDAsIFBBR0VfU0laRSk7Cit9Citmb3IgKGsgPSAwOyBrIDwgRlJBTUVfQlVGRkVSX01BTlk7IGsrKykgeworCWZvciAobSA9IDA7IG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7IG0rKykKKwkJbWVtc2V0KHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvLCAwLCBQQUdFX1NJWkUpOworfQorcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSAwOworcGVhc3ljYXAtPmZpZWxkX2ZpbGwgPSAwOworCitwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IDA7CitwZWFzeWNhcC0+ZnJhbWVfZmlsbCA9IDA7Citmb3IgKGsgPSAwOyBrIDwgcGVhc3ljYXAtPmlucHV0OyBrKyspIHsKKwkocGVhc3ljYXAtPmZyYW1lX2ZpbGwpKys7CisJaWYgKHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSA8PSBwZWFzeWNhcC0+ZnJhbWVfZmlsbCkKKwkJcGVhc3ljYXAtPmZyYW1lX2ZpbGwgPSAwOworfQorcGVhc3ljYXAtPmlucHV0ID0gaW5wdXQ7CitzZWxlY3RfaW5wdXQocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+aW5wdXQsIDkpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKGlucHV0ID09IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uaW5wdXQpIHsKKwlvZmYgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLnN0YW5kYXJkX29mZnNldDsKKwlpZiAob2ZmICE9IHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpIHsKKwkJcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFwKKwkJCQllYXN5Y2FwX3N0YW5kYXJkW29mZl0udjRsMl9zdGFuZGFyZC5pZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3Rfc3RhbmRhcmQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgdW5jaGFuZ2VkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwl9CisJb2ZmID0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5mb3JtYXRfb2Zmc2V0OworCWlmIChvZmYgIT0gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpIHsKKwkJcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCBcCisJCQllYXN5Y2FwX2Zvcm1hdFtvZmZdLnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgsIFwKKwkJCWVhc3ljYXBfZm9ybWF0W29mZl0udjRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQsIFwKKwkJCWVhc3ljYXBfZm9ybWF0W29mZl0udjRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCwgXAorCQkJZWFzeWNhcF9mb3JtYXRbb2ZmXS52NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkLCBmYWxzZSk7CisJCWlmICgwID4gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9mb3JtYXQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+Zm9ybWF0X29mZnNldFxuIiwgcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQpOworCX0gZWxzZSB7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQgdW5jaGFuZ2VkXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCk7CisJfQorCW1vb2QgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmJyaWdodG5lc3M7CisJaWYgKG1vb2QgIT0gcGVhc3ljYXAtPmJyaWdodG5lc3MpIHsKKwkJcmMgPSBhZGp1c3RfYnJpZ2h0bmVzcyhwZWFzeWNhcCwgbW9vZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3RfYnJpZ2h0bmVzcyByZXR1cm5lZCAlaVxuIiwgcmMpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+YnJpZ2h0bmVzc1xuIiwgcGVhc3ljYXAtPmJyaWdodG5lc3MpOworCX0KKwltb29kID0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5jb250cmFzdDsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+Y29udHJhc3QpIHsKKwkJcmMgPSBhZGp1c3RfY29udHJhc3QocGVhc3ljYXAsIG1vb2QpOworCQlpZiAoMCAhPSByYykgeworCQkJU0FNKCJFUlJPUjogYWRqdXN0X2NvbnRyYXN0IHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5jb250cmFzdFxuIiwgcGVhc3ljYXAtPmNvbnRyYXN0KTsKKwl9CisJbW9vZCA9IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uc2F0dXJhdGlvbjsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+c2F0dXJhdGlvbikgeworCQlyYyA9IGFkanVzdF9zYXR1cmF0aW9uKHBlYXN5Y2FwLCBtb29kKTsKKwkJaWYgKDAgIT0gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9zYXR1cmF0aW9uIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zYXR1cmF0aW9uXG4iLCBwZWFzeWNhcC0+c2F0dXJhdGlvbik7CisJfQorCW1vb2QgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmh1ZTsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+aHVlKSB7CisJCXJjID0gYWRqdXN0X2h1ZShwZWFzeWNhcCwgbW9vZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3RfaHVlIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5odWVcbiIsIHBlYXN5Y2FwLT5odWUpOworCX0KK30gZWxzZSB7CisJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0WyVpXSB1bnBvcHVsYXRlZFxuIiwgaW5wdXQpOworCXJldHVybiAtRU5PRU5UOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRU5PREVWOworfQorcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsCisJCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlLCBcCisJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHVzYl9zZXRfaW50ZXJmYWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gc3RhcnRfMTAwKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHN0YXJ0XzEwMCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAodHJ1ZSA9PSByZXN1Ym1pdCkKKwlzdWJtaXRfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisKK3BlYXN5Y2FwLT52aWRlb19pc29jX3NlcXVlbmNlID0gVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDE7CitwZWFzeWNhcC0+dmlkZW9faWRsZSA9IHZpZGVvX2lkbGVub3c7CitwZWFzeWNhcC0+YXVkaW9faWRsZSA9IGF1ZGlvX2lkbGVub3c7CitwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7CisKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzI2LDMzICs2MzEsMjUgQEAKIHN0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOwogc3RydWN0IHVyYiAqcHVyYjsKIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7Ci1pbnQgaiwgaXNiYWQsIG0sIHJjOworaW50IGosIGlzYmFkLCBub3NwYywgbSwgcmM7CiBpbnQgaXNidWY7CiAKLWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOworCXJldHVybiAtRU5PREVWOwogfQogaWYgKCFwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKLQotCi0KLQotCi0KLQotCi0JSk9UKDQsICJzdWJtaXNzaW9uIG9mIGFsbCB2aWRlbyB1cmJzXG4iKTsKLQlpZiAoMCAhPSByZWFkeV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkgewotCQlTQVkoIkVSUk9SOiBub3QgcmVhZHkgdG8gY2FwdHVyZSBhZnRlciB3YWl0aW5nICIgXAotCQkJCQkJCSJvbmUgc2Vjb25kXG4iKTsKLQkJU0FZKCIuLi4uLiAgY29udGludWluZyBhbnl3YXlcbiIpOwotCX0KLQlpc2JhZCA9IDA7ICBtID0gMDsKKwlKT00oNCwgInN1Ym1pc3Npb24gb2YgYWxsIHZpZGVvIHVyYnNcbiIpOworCWlzYmFkID0gMDsgIG5vc3BjID0gMDsgIG0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKQEAgLTM4OSw0NCArNjg2LDU3IEBACiAJCQkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfS0VSTkVMKTsKIAkJCQlpZiAoMCAhPSByYykgewogCQkJCQlpc2JhZCsrOwotCQkJCQlTQVkoIkVSUk9SOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKKwkJCQkJU0FNKCJFUlJPUjogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgIiBcCiAJCQkJCQkJImZvciB1cmIgd2l0aCByYzpcbiIpOwogCQkJCQlzd2l0Y2ggKHJjKSB7CiAJCQkJCWNhc2UgLUVOT01FTTogewotCQkJCQkJU0FZKCJFTk9NRU1cbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVOT01FTT0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTk9ERVY6IHsKLQkJCQkJCVNBWSgiRU5PREVWXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FTk9ERVY9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5YSU86IHsKLQkJCQkJCVNBWSgiRU5YSU9cbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVOWElPPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVJTlZBTDogewotCQkJCQkJU0FZKCJFSU5WQUxcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVJTlZBTD0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FQUdBSU46IHsKLQkJCQkJCVNBWSgiRUFHQUlOXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FQUdBSU49IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUZCSUc6IHsKLQkJCQkJCVNBWSgiRUZCSUdcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVGQklHPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVQSVBFOiB7Ci0JCQkJCQlTQVkoIkVQSVBFXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FUElQRT0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTVNHU0laRTogewotCQkJCQkJU0FZKCJFTVNHU0laRVxuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRU1TR1NJWkU9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY2FzZSAtRU5PU1BDOiB7CisJCQkJCQlub3NwYysrOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJZGVmYXVsdDogewotCQkJCQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgJWlcbiIsXAotCQkJCQkJCQkJIHJjKTsKKwkJCQkJCVNBTSgiRVJST1I6ICVpPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iLFwKKwkJCQkJCQlyYyk7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQl9CkBAIC00MzQsMTQgKzc0NCwyMCBAQAogCQkJCQltKys7CiAJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCWlzYmFkKys7CisJCQkJCSBpc2JhZCsrOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJIGlzYmFkKys7CiAJCQl9CiAJCX0KKwlpZiAobm9zcGMpIHsKKwkJU0FNKCItRU5PU1BDPXVzYl9zdWJtaXRfdXJiKCkgZm9yICVpIHVyYnNcbiIsIG5vc3BjKTsKKwkJU0FNKCIuLi4uLiAgcG9zc2libHkgaW5hZGVxdWF0ZSBVU0IgYmFuZHdpZHRoXG4iKTsKKwkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJfQorCiAJaWYgKGlzYmFkKSB7Ci0JCUpPVCg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CisJCUpPTSg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAogCQkJCQkJCQlsaXN0X2hlYWQpOwpAQCAtNDU0LDE2ICs3NzAsMTAgQEAKIAkJcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nID0gMDsKIAl9IGVsc2UgewogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAxOwotCQlKT1QoNCwgInN1Ym1pdHRlZCAlaSB2aWRlbyB1cmJzXG4iLCBtKTsKKwkJSk9NKDQsICJzdWJtaXR0ZWQgJWkgdmlkZW8gdXJic1xuIiwgbSk7CiAJfQotCi0KLQotCi0KLQogfSBlbHNlIHsKLQlKT1QoNCwgImFscmVhZHkgc3RyZWFtaW5nIHZpZGVvIHVyYnNcbiIpOworCUpPTSg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgdmlkZW8gdXJic1xuIik7CiB9CiByZXR1cm4gMDsKIH0KQEAgLTQ3NSwzNSArNzg1LDMyIEBACiBzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdF9oZWFkOwogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiAKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgewotCi0KLQogCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAwOwotCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCUpPTSg0LCAia2lsbGluZyB2aWRlbyB1cmJzXG4iKTsKIAkJbSA9IDA7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAogCQkJCQkJCQlsaXN0X2hlYWQpOwotCQkJaWYgKChzdHJ1Y3QgZGF0YV91cmIgKilOVUxMICE9IHBkYXRhX3VyYikgewotCQkJCWlmICgoc3RydWN0IHVyYiAqKU5VTEwgIT0gcGRhdGFfdXJiLT5wdXJiKSB7CisJCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlpZiAoTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CiAJCQkJCW0rKzsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJSk9UKDQsICIlaSB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgbSk7CisJCUpPTSg0LCAiJWkgdmlkZW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0gZWxzZSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIH0gZWxzZSB7Ci0JSk9UKDgsICIlaT12aWRlb19pc29jX3N0cmVhbWluZywgbm8gdmlkZW8gdXJicyBraWxsZWRcbiIsIFwKKwlKT00oOCwgIiVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nLCBubyB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpOwogfQogcmV0dXJuIDA7CkBAIC01MzMsMTEgKzg0MCwxNSBAQAogCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWlmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKLQlTQVkoIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOwogCXJldHVybiAtRUZBVUxUOwogfQotSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKK2lmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQU0oIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKICMKQEAgLTU1MCw2MyArODYxLDQ1IEBACiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQogaW50Ci12aWRlb2Rldl9yZWxlYXNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnB2ZCkKK3ZpZGVvZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqcHZpZGVvX2RldmljZSkKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKLWludCBpLCBqLCBrOwogCiBKT1QoNCwgIlxuIik7CiAKLWsgPSAwOwotZm9yIChpID0gMDsgIGkgPCB2aWRlb19kZXZpY2VfbWFueTsgIGkrKykgewotCXB2aWRlb19kZXZpY2UgPSBwdmlkZW9fYXJyYXlbaV07Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCAhPSBwdmlkZW9fZGV2aWNlKSB7Ci0JCWlmIChwdmQtPm1pbm9yID09IHB2aWRlb19kZXZpY2UtPm1pbm9yKSB7Ci0JCQlwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKVwKLQkJCQkJdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7Ci0JCQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCQkJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKLQkJCQlTQVkoImVuZGluZyB1bnN1Y2Nlc3NmdWxseVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0JCQlpZiAoMCAhPSBraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApKSB7Ci0JCQkJU0FZKCJFUlJPUjoga2lsbF92aWRlb191cmJzKCkgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCUpPVCg0LCAiZnJlZWluZyB2aWRlb19kZXZpY2Ugc3RydWN0dXJlOiAiIFwKLQkJCQkJCQkiL2Rldi92aWRlbyVpXG4iLCBpKTsKLQkJCWtmcmVlKCh2b2lkICopcHZpZGVvX2RldmljZSk7Ci0JCQlmb3IgKGogPSBpOyAgaiA8IChWSURFT19ERVZJQ0VfTUFOWSAtIDEpOyAgaisrKQotCQkJCXB2aWRlb19hcnJheVtqXSA9IHB2aWRlb19hcnJheVtqICsgMV07Ci0JCQl2aWRlb19kZXZpY2VfbWFueS0tOyAgaysrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci1pZiAoIWspIHsKLQlTQVkoIkVSUk9SOiBsb3N0IHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgZm9yICVpPW1pbm9yXG4iLCBwdmQtPm1pbm9yKTsKLQlTQVkoImNhbm5vdCBmcmVlOiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworcGVhc3ljYXAgPSB2aWRlb19nZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlKTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLQotSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQU0oIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKIHJldHVybiAwOwogfQogI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBUSElTIEZVTkNUSU9OIElTIENBTExFRCBGUk9NIFdJVEhJTiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkuCi0gKiAgQlkgVEhJUyBTVEFHRSBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWSBVTlBMVUdHRUQuCi0gKiAgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRCBBTkQgU0hPVUxEIEhBVkUgQkVFTiBTRVQgVE8gTlVMTC4KKyAqICBUSElTIEZVTkNUSU9OIElTIENBTExFRCBGUk9NIFdJVEhJTiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgQU5EIElTCisgKiAgUFJPVEVDVEVEIEJZIFNFTUFQSE9SRVMgU0VUIEFORCBDTEVBUkVEIEJZIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiAgQlkgVEhJUyBTVEFHRSBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWSBVTlBMVUdHRUQsIFNPCisgKiAgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZAogZWFzeWNhcF9kZWxldGUoc3RydWN0IGtyZWYgKnBrcmVmKQogewotaW50IGssIG0sIGxvc3Q7CitpbnQgaywgbSwgZ29uZSwga2Q7CiBpbnQgYWxsb2NhdGlvbl92aWRlb191cmIsIGFsbG9jYXRpb25fdmlkZW9fcGFnZSwgYWxsb2NhdGlvbl92aWRlb19zdHJ1Y3Q7CiBpbnQgYWxsb2NhdGlvbl9hdWRpb191cmIsIGFsbG9jYXRpb25fYXVkaW9fcGFnZSwgYWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3Q7CiBpbnQgcmVnaXN0ZXJlZF92aWRlbywgcmVnaXN0ZXJlZF9hdWRpbzsKQEAgLTYxNywyMiArOTEwLDI3IEBACiBKT1QoNCwgIlxuIik7CiAKIHBlYXN5Y2FwID0gY29udGFpbmVyX29mKHBrcmVmLCBzdHJ1Y3QgZWFzeWNhcCwga3JlZik7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEw6IGNhbm5vdCBwZXJmb3JtIGRlbGV0aW9uc1xuIik7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBTSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEw6IGNhbm5vdCBwZXJmb3JtIGRlbGV0aW9uc1xuIik7CiAJcmV0dXJuOwogfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybjsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBGUkVFIFZJREVPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpIHsKLQlKT1QoNCwgImZyZWVpbmcgdmlkZW8gdXJic1xuIik7CisJSk9NKDQsICJmcmVlaW5nIHZpZGVvIHVyYnNcbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCA9PSBwZGF0YV91cmIpCi0JCQlKT1QoNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CisJCQlKT00oNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CiAJCWVsc2UgewogCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQl1c2JfZnJlZV91cmIocGRhdGFfdXJiLT5wdXJiKTsKQEAgLTY0Myw5ICs5NDEsOSBAQAogCQl9CiAJfQogCi0JSk9UKDQsICIlaSB2aWRlbyB1cmJzIGZyZWVkXG4iLCBtKTsKKwlKT00oNCwgIiVpIHZpZGVvIHVyYnMgZnJlZWRcbiIsIG0pOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCUpPVCg0LCAiZnJlZWluZyB2aWRlbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzLlxuIik7CisJSk9NKDQsICJmcmVlaW5nIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKIAltID0gMDsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocGxpc3RfaGVhZCwgcGxpc3RfbmV4dCwgcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewogCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKQEAgLTY1NiwxNCArOTU0LDEyIEBACiAJCQltKys7CiAJCX0KIAl9Ci0JSk9UKDQsICIlaSB2aWRlbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzIGZyZWVkXG4iLCBtKTsKLQlKT1QoNCwgInNldHRpbmcgcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZD1OVUxMXG4iKTsKKwlKT00oNCwgIiVpIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOworCUpPTSg0LCAic2V0dGluZyBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkPU5VTExcbiIpOwogCXBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEw7Ci0JfSBlbHNlIHsKLUpPVCg0LCAicGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCBpcyBOVUxMXG4iKTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyB2aWRlbyBpc29jIGJ1ZmZlcnMuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyB2aWRlbyBpc29jIGJ1ZmZlcnMuXG4iKTsKIG0gPSAwOwogZm9yIChrID0gMDsgIGsgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ucGdvKSB7CkBAIC02NzYsMTAgKzk3MiwxMCBAQAogCQltKys7CiAJfQogfQotSk9UKDQsICJpc29jIHZpZGVvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBtICogKDB4MDEgPDwgVklERU9fSVNPQ19PUkRFUikpOworSk9NKDQsICJpc29jIHZpZGVvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBtICogKDB4MDEgPDwgVklERU9fSVNPQ19PUkRFUikpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIHZpZGVvIGZpZWxkIGJ1ZmZlcnMuXG4iKTsKLWxvc3QgPSAwOworSk9NKDQsICJmcmVlaW5nIHZpZGVvIGZpZWxkIGJ1ZmZlcnMuXG4iKTsKK2dvbmUgPSAwOwogZm9yIChrID0gMDsgIGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgIGsrKykgewogCWZvciAobSA9IDA7ICBtIDwgRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28pIHsKQEAgLTY4NywxNCArOTgzLDE0IEBACiAJCQkJCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykpOwogCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28gPSAodm9pZCAqKU5VTEw7CiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IDE7Ci0JCQlsb3N0Kys7CisJCQlnb25lKys7CiAJCX0KIAl9CiB9Ci1KT1QoNCwgInZpZGVvIGZpZWxkIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKK0pPTSg0LCAidmlkZW8gZmllbGQgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGdvbmUpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIHZpZGVvIGZyYW1lIGJ1ZmZlcnMuXG4iKTsKLWxvc3QgPSAwOworSk9NKDQsICJmcmVlaW5nIHZpZGVvIGZyYW1lIGJ1ZmZlcnMuXG4iKTsKK2dvbmUgPSAwOwogZm9yIChrID0gMDsgIGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgIGsrKykgewogCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28pIHsKQEAgLTcwMiwyMyArOTk4LDIzIEBACiAJCQkJCShwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbykpOwogCQkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28gPSAodm9pZCAqKU5VTEw7CiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlIC09IDE7Ci0JCQlsb3N0Kys7CisJCQlnb25lKys7CiAJCX0KIAl9CiB9Ci1KT1QoNCwgInZpZGVvIGZyYW1lIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBsb3N0KTsKK0pPTSg0LCAidmlkZW8gZnJhbWUgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGdvbmUpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBGUkVFIEFVRElPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpIHsKLQlKT1QoNCwgImZyZWVpbmcgYXVkaW8gdXJic1xuIik7CisJSk9NKDQsICJmcmVlaW5nIGF1ZGlvIHVyYnNcbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCA9PSBwZGF0YV91cmIpCi0JCQlKT1QoNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CisJCQlKT00oNCwgIkVSUk9SOiBwZGF0YV91cmIgaXMgTlVMTFxuIik7CiAJCWVsc2UgewogCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKIAkJCQl1c2JfZnJlZV91cmIocGRhdGFfdXJiLT5wdXJiKTsKQEAgLTcyOCw5ICsxMDI0LDkgQEAKIAkJCX0KIAkJfQogCX0KLQlKT1QoNCwgIiVpIGF1ZGlvIHVyYnMgZnJlZWRcbiIsIG0pOworCUpPTSg0LCAiJWkgYXVkaW8gdXJicyBmcmVlZFxuIiwgbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJmcmVlaW5nIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKKwlKT00oNCwgImZyZWVpbmcgYXVkaW8gZGF0YV91cmIgc3RydWN0dXJlcy5cbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdF9oZWFkLCBwbGlzdF9uZXh0LCBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwpAQCAtNzQxLDE0ICsxMDM3LDEyIEBACiAJCQltKys7CiAJCX0KIAl9Ci1KT1QoNCwgIiVpIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOwotSk9UKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQ9TlVMTFxuIik7CitKT00oNCwgIiVpIGF1ZGlvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOworSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQ9TlVMTFxuIik7CiBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkID0gKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMOwotfSBlbHNlIHsKLUpPVCg0LCAicGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCBpcyBOVUxMXG4iKTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyBhdWRpbyBpc29jIGJ1ZmZlcnMuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyBhdWRpbyBpc29jIGJ1ZmZlcnMuXG4iKTsKIG0gPSAwOwogZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJba10ucGdvKSB7CkBAIC03NjEsMjIgKzEwNTUsMjIgQEAKIAkJbSsrOwogCX0KIH0KLUpPVCg0LCAiZWFzeXNuZF9kZWxldGUoKTogaXNvYyBhdWRpbyBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgXAorSk9NKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBcCiAJCQkJCW0gKiAoMHgwMSA8PCBBVURJT19JU09DX09SREVSKSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgYXVkaW8gYnVmZmVycy5cbiIpOwotbG9zdCA9IDA7CitKT00oNCwgImZyZWVpbmcgYXVkaW8gYnVmZmVycy5cbiIpOworZ29uZSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55OyAgaysrKSB7CiAJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW2tdLnBnbykgewogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSk7CiAJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvID0gKHZvaWQgKilOVUxMOwogCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlIC09IDE7Ci0JCWxvc3QrKzsKKwkJZ29uZSsrOwogCX0KIH0KLUpPVCg0LCAiZWFzeXNuZF9kZWxldGUoKTogYXVkaW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGxvc3QpOworSk9NKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBhdWRpbyBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgZ29uZSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgZWFzeWNhcCBzdHJ1Y3R1cmUuXG4iKTsKK0pPTSg0LCAiZnJlZWluZyBlYXN5Y2FwIHN0cnVjdHVyZS5cbiIpOwogYWxsb2NhdGlvbl92aWRlb191cmIgICAgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmI7CiBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2U7CiBhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdDsKQEAgLTc4NSwxNSArMTA3OSwxNiBAQAogYWxsb2NhdGlvbl9hdWRpb19wYWdlICAgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlOwogYWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSBwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3Q7CiByZWdpc3RlcmVkX2F1ZGlvICAgICAgICA9IHBlYXN5Y2FwLT5yZWdpc3RlcmVkX2F1ZGlvOwotbSA9IDA7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCAhPSBwZWFzeWNhcCkgewotCWtmcmVlKHBlYXN5Y2FwKTsgIHBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKLQlhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCAtPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOwotCW0rKzsKLX0KLUpPVCg0LCAiJWkgZWFzeWNhcCBzdHJ1Y3R1cmUgZnJlZWRcbiIsIG0pOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitrZnJlZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJZWFzeWNhcF9kb25nbGVba2RdLnBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKKwlKT1QoNCwgIiAgIG51bGwtLT5lYXN5Y2FwX2RvbmdsZVslaV0ucGVhc3ljYXBcbiIsIGtkKTsKKwlhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCAtPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOworfSBlbHNlIHsKKwlTQVkoIkVSUk9SOiBjYW5ub3QgcHVyZ2UgZWFzeWNhcF9kb25nbGVbXS5wZWFzeWNhcCIpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogU0FZKCIlOGk9IHZpZGVvIHVyYnMgICAgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fdXJiKTsKIFNBWSgiJThpPSB2aWRlbyBwYWdlcyAgICBhZnRlciBhbGwgZGVsZXRpb25zXG4iLCBhbGxvY2F0aW9uX3ZpZGVvX3BhZ2UpOwogU0FZKCIlOGk9IHZpZGVvIHN0cnVjdHMgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fc3RydWN0KTsKQEAgLTgxMCwyNyArMTEwNSw4NSBAQAogdW5zaWduZWQgaW50IGVhc3ljYXBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK2ludCByYywga2Q7CiAKIEpPVCg4LCAiXG4iKTsKIAogaWYgKE5VTEwgPT0gKChwb2xsX3RhYmxlICopd2FpdCkpCiAJSk9UKDgsICJXQVJOSU5HOiAgcG9sbCB0YWJsZSBwb2ludGVyIGlzIE5VTEwgLi4uIGNvbnRpbnVpbmdcbiIpOwotaWYgKE5VTEwgPT0gKChzdHJ1Y3QgZmlsZSAqKWZpbGUpKSB7CitpZiAoKHN0cnVjdCBmaWxlICopTlVMTCA9PSBmaWxlKSB7CiAJU0FZKCJFUlJPUjogIGZpbGUgcG9pbnRlciBpcyBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOwogfQogcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitrZCA9IGlzZG9uZ2xlKHBlYXN5Y2FwKTsKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pKSB7CisJCVNBWSgiRVJST1I6IGNhbm5vdCBkb3duIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qCisJICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIKKwkgKiAgcGVhc3ljYXAsIElOIFdISUNIIENBU0UgQSBSRVBFQVQgQ0FMTCBUTyBpc2RvbmdsZSgpIFdJTEwgRkFJTC4KKwkgKiAgSUYgTkVDRVNTQVJZLCBCQUlMIE9VVC4KKwkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoTlVMTCA9PSBmaWxlKSB7CisJCVNBWSgiRVJST1I6ICBmaWxlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsIFwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9Cit9IGVsc2UKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qCisJICogIElGIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBIQVMgQUxSRUFEWSBGUkVFRCBQT0lOVEVSIHBlYXN5Y2FwCisJICogIEJFRk9SRSBUSEUgQVRURU1QVCBUTyBBQ1FVSVJFIFRIRSBTRU1BUEhPUkUsIGlzZG9uZ2xlKCkgV0lMTAorCSAqICBIQVZFIEZBSUxFRC4gIEJBSUwgT1VULgorCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcmMgPSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKTsKIHBlYXN5Y2FwLT5wb2xsZWQgPSAxOwotCi1pZiAoMCA9PSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKSkKK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKK2lmICgwID09IHJjKQogCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwogZWxzZQogCXJldHVybiBQT0xMRVJSOwotCiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04NDEsNyArMTE5NCw3IEBACiBpbnQKIGVhc3ljYXBfZHFidWYoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgbW9kZSkKIHsKLWludCBtaXNzLCByYzsKK2ludCBpbnB1dCwgaWZpZWxkLCBtaXNzLCByYzsKIAogSk9UKDgsICJcbiIpOwogCkBAIC04NDksMTI5ICsxMjAyLDE4OCBAQAogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1I6ICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZmllbGQgPSAwOworSk9NKDgsICIlaT1pZmllbGRcbiIsIGlmaWVsZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFdBSVQgRk9SIEZJRUxEIDAKKyAqICBDSEVDSyBGT1IgTE9TVCBJTlBVVCBTSUdOQUwuCisgKgorICogIEZPUiBUSEUgRk9VUi1DVkJTIEVhc3lDQVAsIFRISVMgRE9FUyBOT1QgV09SSyBBUyBFWFBFQ1RFRC4KKyAqICBJRiBJTlBVVCAwIElTIFBSRVNFTlQgQU5EIFNZTkMgQUNRVUlSRUQsIFVOUExVR0dJTkcgSU5QVVQgNCBET0VTIE5PVAorICogIFJFU1VMVCBJTiBTRVRUSU5HIEJJVCAweDQwIE9OIFJFR0lTVEVSIDB4MUYsIFBSRVNVTUFCTFkgQkVDQVVTRSBUSEVSRQorICogIElTIEZMWVdIRUVMSU5HIE9OIElOUFVUIDAuICBUSEUgVVBTSE9UIElTOgorICoKKyAqICAgIElOUFVUIDAgICBQTFVHR0VELCBJTlBVVCA0ICAgUExVR0dFRCA9PiBTQ1JFRU4gMCBPSywgICBTQ1JFRU4gNCBPSworICogICAgSU5QVVQgMCAgIFBMVUdHRUQsIElOUFVUIDQgVU5QTFVHR0VEID0+IFNDUkVFTiAwIE9LLCAgIFNDUkVFTiA0IEJMQUNLCisgKiAgICBJTlBVVCAwIFVOUExVR0dFRCwgSU5QVVQgNCAgIFBMVUdHRUQgPT4gU0NSRUVOIDAgQkFSUywgU0NSRUVOIDQgT0sKKyAqICAgIElOUFVUIDAgVU5QTFVHR0VELCBJTlBVVCA0IFVOUExVR0dFRCA9PiBTQ1JFRU4gMCBCQVJTLCBTQ1JFRU4gNCBCQVJTCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW5wdXQgPSBwZWFzeWNhcC0+aW5wdXQ7CitpZiAoMCA8PSBpbnB1dCAmJiBJTlBVVF9NQU5ZID4gaW5wdXQpIHsKKwlyYyA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgxRik7CisJaWYgKDAgPD0gcmMpIHsKKwkJaWYgKHJjICYgMHg0MCkKKwkJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSArPSAxOworCQllbHNlCisJCQlwZWFzeWNhcC0+bG9zdFtpbnB1dF0gLT0gMjsKKworCWlmICgwID4gcGVhc3ljYXAtPmxvc3RbaW5wdXRdKQorCQlwZWFzeWNhcC0+bG9zdFtpbnB1dF0gPSAwOworCWVsc2UgaWYgKCgyICogVklERU9fTE9TVF9UT0xFUkFURSkgPCBwZWFzeWNhcC0+bG9zdFtpbnB1dF0pCisJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSA9ICgyICogVklERU9fTE9TVF9UT0xFUkFURSk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXQUlUIEZPUiBGSUVMRCBpZmllbGQgICgwID0+IFRPUCwgMSA9PiBCT1RUT00pCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIG1pc3MgPSAwOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCi0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKIHdoaWxlICgocGVhc3ljYXAtPmZpZWxkX3JlYWQgPT0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHx8IFwKIAkJCQkoMCAhPSAoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpIHx8IFwKLQkJCQkoMCAhPSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkoaWZpZWxkICE9ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpIHsKLQltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwotCiAJaWYgKG1vZGUpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JSk9UKDgsICJmaXJzdCB3YWl0ICBvbiB3cV92aWRlbywgIiBcCisJSk9NKDgsICJmaXJzdCB3YWl0ICBvbiB3cV92aWRlbywgIiBcCiAJCQkJIiVpPWZpZWxkX3JlYWQgICVpPWZpZWxkX2ZpbGxcbiIsIFwKIAkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwpOwogCi0JbXNsZWVwKDEpOwogCWlmICgwICE9ICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX3ZpZGVvLCBcCiAJCQkocGVhc3ljYXAtPnZpZGVvX2lkbGUgfHwgcGVhc3ljYXAtPnZpZGVvX2VvZiAgfHwgXAogCQkJKChwZWFzeWNhcC0+ZmllbGRfcmVhZCAhPSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgJiYgXAogCQkJCSgwID09ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgJiYgXAotCQkJCSgwID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpKSkpKXsKLQkJU0FZKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CisJCQkJKGlmaWVsZCA9PSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpKSkpKSkgeworCQlTQU0oImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKLQkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZVxuIiwgcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwotCQlyZXR1cm4gLUVJTzsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZSAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSk7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgewotCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19lb2ZcbiIsIHBlYXN5Y2FwLT52aWRlb19lb2YpOwotCQlkZWJyaWVmKHBlYXN5Y2FwKTsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJI2lmIGRlZmluZWQoUEVSU0VWRVJFKQorCQlpZiAoMSA9PSBwZWFzeWNhcC0+c3RhdHVzKSB7CisJCQlKT00oOCwgInBlcnNldmVyaW5nIC4uLlxuIik7CisJCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMDsKKwkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAwOworCQkJaWYgKDAgIT0gcmVzZXQocGVhc3ljYXApKSB7CisJCQkJSk9NKDgsICIgLi4uIGZhaWxlZCAuLi4gcmV0dXJuaW5nIC1FSU9cbiIpOworCQkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOworCQkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOworCQkJCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlwZWFzeWNhcC0+c3RhdHVzID0gMDsKKwkJCUpPTSg4LCAiIC4uLiBPSyAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJI2VuZGlmIC8qUEVSU0VWRVJFKi8KKwkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOwogCQlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworCQlKT00oOCwgInJldHVybmluZyAtRUlPXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogbWlzcysrOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCi0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKIH0KLW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci1KT1QoOCwgImZpcnN0IGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CitKT00oOCwgImZpcnN0IGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CiAKIHJjID0gZmllbGQyZnJhbWUocGVhc3ljYXApOwogaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCi1pZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpIHsKLQlwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IHBlYXN5Y2FwLT5mcmFtZV9maWxsOwotCShwZWFzeWNhcC0+ZnJhbWVfZmlsbCkrKzsKLQlpZiAocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55IDw9IHBlYXN5Y2FwLT5mcmFtZV9maWxsKQotCQlwZWFzeWNhcC0+ZnJhbWVfZmlsbCA9IDA7Ci0KLQlpZiAoMHgwMSAmIGVhc3ljYXBfc3RhbmRhcmRbcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldF0ubWFzaykgewotCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCA9IFwKLQkJCQkJCQlWNEwyX0ZJRUxEX0JPVFRPTTsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5rb3VudCA9IFwKLQkJCQkJCQlWNEwyX0ZJRUxEX1RPUDsKLQl9Ci1KT1QoOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7Ci1KT1QoOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7Ci19CisJU0FNKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBXQUlUIEZPUiBGSUVMRCAxCisgKiAgV0FJVCBGT1IgVEhFIE9USEVSIEZJRUxECiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChpZmllbGQpCisJaWZpZWxkID0gMDsKK2Vsc2UKKwlpZmllbGQgPSAxOwogbWlzcyA9IDA7Ci1pZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogd2hpbGUgKChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgfHwgXAogCQkJCSgwICE9ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgfHwgXAotCQkJCSgwID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCShpZmllbGQgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkgewotCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci0KIAlpZiAobW9kZSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlKT1QoOCwgInNlY29uZCB3YWl0IG9uIHdxX3ZpZGVvLCAiIFwKKwlKT00oOCwgInNlY29uZCB3YWl0IG9uIHdxX3ZpZGVvLCAiIFwKIAkJCQkiJWk9ZmllbGRfcmVhZCAgJWk9ZmllbGRfZmlsbFxuIiwgXAogCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCk7Ci0JbXNsZWVwKDEpOwogCWlmICgwICE9ICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX3ZpZGVvLCBcCiAJCQkocGVhc3ljYXAtPnZpZGVvX2lkbGUgfHwgcGVhc3ljYXAtPnZpZGVvX2VvZiAgfHwgXAogCQkJKChwZWFzeWNhcC0+ZmllbGRfcmVhZCAhPSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgJiYgXAogCQkJCSgwID09ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgJiYgXAotCQkJCSgwICE9ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpKSkpKXsKLQkJU0FZKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CisJCQkJKGlmaWVsZCA9PSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5cCisJCQkJCQkJCWtvdW50KSkpKSkpKSB7CisJCVNBTSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKHBlYXN5Y2FwLT52aWRlb19pZGxlKSB7Ci0JCUpPVCg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2lkbGVcbiIsIHBlYXN5Y2FwLT52aWRlb19pZGxlKTsKLQkJcmV0dXJuIC1FSU87CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2lkbGUgLi4uIHJldHVybmluZyAtRUFHQUlOXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOworCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpIHsKLQkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKLQkJZGVicmllZihwZWFzeWNhcCk7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2VvZlxuIiwgcGVhc3ljYXAtPnZpZGVvX2VvZik7CisJCSNpZiBkZWZpbmVkKFBFUlNFVkVSRSkKKwkJaWYgKDEgPT0gcGVhc3ljYXAtPnN0YXR1cykgeworCQkJSk9NKDgsICJwZXJzZXZlcmluZyAuLi5cbiIpOworCQkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDA7CisJCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKKwkJCWlmICgwICE9IHJlc2V0KHBlYXN5Y2FwKSkgeworCQkJCUpPTSg4LCAiIC4uLiBmYWlsZWQgLi4uIHJldHVybmluZyAtRUlPXG4iKTsKKwkJCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKKwkJCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKKwkJCQlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcGVhc3ljYXAtPnN0YXR1cyA9IDA7CisJCQlKT00oOCwgIiAuLi4gT0sgLi4uIHJldHVybmluZyAtRUFHQUlOXG4iKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCSNlbmRpZiAvKlBFUlNFVkVSRSovCisJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOworCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKIAkJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKwkJSk9NKDgsICJyZXR1cm5pbmcgLUVJT1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIG1pc3MrKzsKLWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpKQotCXJldHVybiAtRVJFU1RBUlRTWVM7CiB9Ci1tdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwotSk9UKDgsICJzZWNvbmQgYXdha2VuaW5nIG9uIHdxX3ZpZGVvIGFmdGVyICVpIHdhaXRzXG4iLCBtaXNzKTsKK0pPTSg4LCAic2Vjb25kIGF3YWtlbmluZyBvbiB3cV92aWRlbyBhZnRlciAlaSB3YWl0c1xuIiwgbWlzcyk7CiAKIHJjID0gZmllbGQyZnJhbWUocGVhc3ljYXApOwogaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCisJU0FNKCJFUlJPUjogZmllbGQyZnJhbWUoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBXQVNURSBUSElTIEZSQU1FCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKDAgIT0gcGVhc3ljYXAtPnNraXApIHsKKwlwZWFzeWNhcC0+c2tpcHBlZCsrOworCWlmIChwZWFzeWNhcC0+c2tpcCAhPSBwZWFzeWNhcC0+c2tpcHBlZCkKKwkJcmV0dXJuIHBlYXN5Y2FwLT5za2lwIC0gcGVhc3ljYXAtPnNraXBwZWQ7CisJcGVhc3ljYXAtPnNraXBwZWQgPSAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogcGVhc3ljYXAtPmZyYW1lX3JlYWQgPSBwZWFzeWNhcC0+ZnJhbWVfZmlsbDsKIHBlYXN5Y2FwLT5xdWV1ZWRbcGVhc3ljYXAtPmZyYW1lX3JlYWRdID0gMDsKIHBlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSAgID0gVjRMMl9CVUZfRkxBR19ET05FOwpAQCAtOTg4LDggKzE0MDAsOCBAQAogCQkJCQkJCVY0TDJfRklFTERfQk9UVE9NOwogfQogCi1KT1QoOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7Ci1KT1QoOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CitKT00oOCwgInNldHRpbmc6ICAgICVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7CitKT00oOCwgImJ1bXBlZCB0bzogICVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CiAKIHJldHVybiAwOwogfQpAQCAtMTAwMywxNCArMTQxNSwxMiBAQAogICogIG9kZD09ZmFsc2UgSVMgVFJBTlNGRVJSRUQgVE8gVEhFIEZSQU1FIEJVRkZFUi4KICAqCiAgKiAgVEhFIEJPT0xFQU4gUEFSQU1FVEVSIG9mZmVyZmllbGRzIElTIHRydWUgT05MWSBXSEVOIFRIRSBVU0VSIFBST0dSQU0KLSAqICBDSE9PU0VTIFRIRSBPUFRJT04gVjRMMl9GSUVMRF9BTFRFUk5BVEUuICBOTyBVU0VSU1BBQ0UgUFJPR1JBTSBURVNURUQKLSAqICBUTyBEQVRFIEhBUyBET05FIFRISVMuICBCVUdTIEFSRSBMSUtFTFkuCisgKiAgQ0hPT1NFUyBUSEUgT1BUSU9OIFY0TDJfRklFTERfSU5URVJMQUNFRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50CiBmaWVsZDJmcmFtZShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCiB7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZXZhbDA7CiBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOwogbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3c7CiBfX3UzMiByZW1haW5kZXI7CkBAIC0xMDE5LDE2ICsxNDI5LDI2IEBACiB2b2lkICpwZXgsICpwYWQ7CiBpbnQga2V4LCBrYWQsIG1leCwgbWFkLCByZXgsIHJhZCwgcmFkMjsKIGludCBjMiwgYzMsIHcyLCB3MywgY3osIHd6OwotaW50IHJjLCBieXRlc3BlcnBpeGVsLCBtdWx0aXBsaWVyLCBtdWNoLCBtb3JlLCBvdmVyLCBydW1wLCBjYWNoZXM7CitpbnQgcmMsIGJ5dGVzcGVycGl4ZWwsIG11bHRpcGxpZXIsIG11Y2gsIG1vcmUsIG92ZXIsIHJ1bXAsIGNhY2hlcywgaW5wdXQ7CiBfX3U4IG1hc2ssIG1hcmdpbjsKLWJvb2wgb2RkLCBpc3V5LCBkZWNpbWF0ZXBpeGVsLCBvZmZlcmZpZWxkczsKK2Jvb2wgb2RkLCBpc3V5LCBkZWNpbWF0ZXBpeGVsLCBvZmZlcmZpZWxkcywgYmFkaW5wdXQ7CiAKLUpPVCg4LCAiPT09PT0gIHBhcml0eSAlaSwgZmllbGQgYnVmZmVyICVpIC0tPiBmcmFtZSBidWZmZXIgJWlcbiIsIFwKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK2JhZGlucHV0ID0gZmFsc2U7CitpbnB1dCA9IDB4MDcgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5pbnB1dDsKKworSk9NKDgsICI9PT09PSAgcGFyaXR5ICVpLCBpbnB1dCAweCUwMlgsIGZpZWxkIGJ1ZmZlciAlaSAtLT4gIiBcCisJCQkJCQkiZnJhbWUgYnVmZmVyICVpXG4iLCBcCiAJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCxcCisJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5pbnB1dCxcCiAJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZyYW1lX2ZpbGwpOwotSk9UKDgsICI9PT09PSAgJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwpOworSk9NKDgsICI9PT09PSAgJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWwpOwogaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKQotCUpPVCg4LCAiPT09PT0gb2ZmZXJmaWVsZHNcbiIpOworCUpPTSg4LCAiPT09PT0gb2ZmZXJmaWVsZHNcbiIpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgpAQCAtMTAzNiwxNSArMTQ1NiwxNyBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAocGVhc3ljYXAtPmZpZWxkX3JlYWQgPT0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKLQlTQVkoIkVSUk9SOiBvbiBlbnRyeSwgc3RpbGwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKKwlTQU0oIkVSUk9SOiBvbiBlbnRyeSwgc3RpbGwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCk7CiAJcmV0dXJuIDA7CiB9CiAjaWYgZGVmaW5lZChFQVNZQ0FQX1RFU1RDQVJEKQogZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOwogI2Vsc2UKLWlmICgwICE9ICgweDA0MDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpCi0JZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOworaWYgKDAgPD0gaW5wdXQgJiYgSU5QVVRfTUFOWSA+IGlucHV0KSB7CisJaWYgKGVhc3ljYXBfYmFycyAmJiBWSURFT19MT1NUX1RPTEVSQVRFIDw9IHBlYXN5Y2FwLT5sb3N0W2lucHV0XSkKKwkJZWFzeWNhcF90ZXN0Y2FyZChwZWFzeWNhcCwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOworfQogI2VuZGlmIC8qRUFTWUNBUF9URVNUQ0FSRCovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTEwNTUsNyArMTQ3Nyw3IEBACiBpZiAoKDIgIT0gYnl0ZXNwZXJwaXhlbCkgJiYgXAogCQkJKDMgIT0gYnl0ZXNwZXJwaXhlbCkgJiYgXAogCQkJKDQgIT0gYnl0ZXNwZXJwaXhlbCkpIHsKLQlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOworCVNBTSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgYnl0ZXNwZXJwaXhlbCk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAodHJ1ZSA9PSBkZWNpbWF0ZXBpeGVsKQpAQCAtMTA4Miw4ICsxNTA0LDggQEAKIGVsc2UKIAlvZGQgPSBmYWxzZTsKIAotaWYgKCh0cnVlID09IG9kZCkgJiYgKGZhbHNlID09IG9mZmVyZmllbGRzKSAmJihmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSkgewotCUpPVCg4LCAiICBpbml0aWFsIHNraXBwaW5nICAgICU0aSAgICAgICAgICBieXRlcyBwLiU0aVxuIiwgXAoraWYgKCh0cnVlID09IG9kZCkgJiYgKGZhbHNlID09IGRlY2ltYXRlcGl4ZWwpKSB7CisJSk9NKDgsICIgIGluaXRpYWwgc2tpcHBpbmcgICAgJTRpICAgICAgICAgIGJ5dGVzIHAuJTRpXG4iLCBcCiAJCQkJCQkJdzMvbXVsdGlwbGllciwgbWFkKTsKIAlwYWQgKz0gKHczIC8gbXVsdGlwbGllcik7ICByYWQgLT0gKHczIC8gbXVsdGlwbGllcik7CiB9CkBAIC0xMTA4LDcgKzE1MzAsNyBAQAogCQkJcnVtcCA9IDA7CiAKIAkJCWlmIChtdWNoICUgMikgewotCQkJCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCQkJCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCkBAIC0xMTE2LDEzICsxNTM4LDExIEBACiAJCQkJCW11Y2gpIC8gMjsKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmICgxIDwgYnl0ZXNwZXJwaXhlbCkgewotCQkJCWlmICgocmFkICogXAotCQkJCQkyKSA8IChtdWNoICogXAotCQkJCQkJYnl0ZXNwZXJwaXhlbCkpIHsKKwkJCQlpZiAocmFkICogMiA8IG11Y2ggKiBieXRlc3BlcnBpeGVsKSB7CiAJCQkJCS8qCiAJCQkJCSoqICAgSU5KVURJQ0lPVVMgQUxURVJBVElPTiBPRiBUSElTCi0JCQkJCSoqICAgQkxPQ0sgV0lMTCBDQVVTRSBCUkVBS0FHRS4KLQkJCQkJKiogICBCRVdBUkUuCisJCQkJCSoqICAgU1RBVEVNRU5UIEJMT0NLIFdJTEwgQ0FVU0UKKwkJCQkJKiogICBCUkVBS0FHRS4gIEJFV0FSRS4KIAkJCQkJKiovCiAJCQkJCXJhZDIgPSByYWQgKyBieXRlc3BlcnBpeGVsIC0gMTsKIAkJCQkJbXVjaCA9ICgoKCgyICogXApAQCAtMTE0NSwxOCArMTU2NSwyNSBAQAogCQkJCX0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCX0gZWxzZSB7Ci0JCQkJU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBcCisJCQkJU0FNKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBcCiAJCQkJCQlieXRlc3BlcnBpeGVsKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmIChydW1wKQogCQkJCWNhY2hlcysrOwotCisJCQkJaWYgKHRydWUgPT0gYmFkaW5wdXQpIHsKKwkJCQkJSk9NKDgsICJFUlJPUjogMHglMDJYPS0+ZmllbGRfYnVmZmVyIiBcCisJCQkJCQkiWyVpXVslaV0uaW5wdXQsICIgXAorCQkJCQkJIjB4JTAyWD0oMHgwOHwtPmlucHV0KVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtrZXhdW21leF0uaW5wdXQsIGtleCwgbWV4LCBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKTsKKwkJCQl9CiAJCQlyYyA9IHJlZGF1YihwZWFzeWNhcCwgcGFkLCBwZXgsIG11Y2gsIG1vcmUsIFwKIAkJCQkJCQltYXNrLCBtYXJnaW4sIGlzdXkpOwogCQkJaWYgKDAgPiByYykgewotCQkJCVNBWSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CisJCQkJU0FNKCJFUlJPUjogcmVkYXViKCkgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCWlmIChtdWNoICUgNCkgewpAQCAtMTE3MSw2ICsxNTk4LDkgQEAKIAkJCQltZXgrKzsKIAkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CiAJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJCWlmIChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5pbnB1dCAhPSBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKQorCQkJCQliYWRpbnB1dCA9IHRydWU7CiAJCQl9CiAJCQlwYWQgICs9IG1vcmU7CiAJCQlyYWQgLT0gbW9yZTsKQEAgLTExOTAsNyArMTYyMCw3IEBACiAgKiAgVU5MRVNTIElUIElTIFRIRSBMQVNUIExJTkUgT0YgQU4gT0REIEZSQU1FCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJaWYgKCgoZmFsc2UgPT0gb2RkKSB8fCAoY3ogIT0gd3opKSYmKGZhbHNlID09IG9mZmVyZmllbGRzKSkgeworCQlpZiAoKGZhbHNlID09IG9kZCkgfHwgKGN6ICE9IHd6KSkgewogCQkJb3ZlciA9IHczOwogCQkJZG8gewogCQkJCWlmICghcmFkKSB7CkBAIC0xMjI0LDcgKzE2NTQsNyBAQAogCQkJcnVtcCA9IDA7CiAKIAkJCWlmIChtdWNoICUgMikgewotCQkJCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCQkJCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCkBAIC0xMjMyLDEyICsxNjYyLDExIEBACiAJCQkJCW11Y2gpIC8gNDsKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJCWlmICgxIDwgYnl0ZXNwZXJwaXhlbCkgewotCQkJCWlmICgocmFkICogNCkgPCAobXVjaCAqIFwKLQkJCQkJCWJ5dGVzcGVycGl4ZWwpKSB7CisJCQkJaWYgKHJhZCAqIDQgPCBtdWNoICogYnl0ZXNwZXJwaXhlbCkgewogCQkJCQkvKgogCQkJCQkqKiAgIElOSlVESUNJT1VTIEFMVEVSQVRJT04gT0YgVEhJUwotCQkJCQkqKiAgIEJMT0NLIFdJTEwgQ0FVU0UgQlJFQUtBR0UuCi0JCQkJCSoqICAgQkVXQVJFLgorCQkJCQkqKiAgIFNUQVRFTUVOVCBCTE9DSyBXSUxMIENBVVNFCisJCQkJCSoqICAgQlJFQUtBR0UuICBCRVdBUkUuCiAJCQkJCSoqLwogCQkJCQlyYWQyID0gcmFkICsgYnl0ZXNwZXJwaXhlbCAtIDE7CiAJCQkJCW11Y2ggPSAoKCgoMiAqIHJhZDIpL2J5dGVzcGVycGl4ZWwpLzIpXApAQCAtMTI2MSw3ICsxNjkwLDcgQEAKIAkJCQkJfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJCX0gZWxzZSB7Ci0JCQkJCVNBWSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgXAorCQkJCQlTQU0oIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIFwKIAkJCQkJCWJ5dGVzcGVycGl4ZWwpOwogCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQl9CkBAIC0xMjY5LDEwICsxNjk4LDE4IEBACiAJCQlpZiAocnVtcCkKIAkJCQljYWNoZXMrKzsKIAorCQkJCWlmICh0cnVlID09IGJhZGlucHV0KSB7CisJCQkJCUpPTSg4LCAiRVJST1I6IDB4JTAyWD0tPmZpZWxkX2J1ZmZlciIgXAorCQkJCQkJIlslaV1bJWldLmlucHV0LCAiIFwKKwkJCQkJCSIweCUwMlg9KDB4MDh8LT5pbnB1dClcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCQlba2V4XVttZXhdLmlucHV0LCBrZXgsIG1leCwgXAorCQkJCQkJKDB4MDh8cGVhc3ljYXAtPmlucHV0KSk7CisJCQkJfQogCQkJcmMgPSByZWRhdWIocGVhc3ljYXAsIHBhZCwgcGV4LCBtdWNoLCBtb3JlLCBcCiAJCQkJCQkJbWFzaywgbWFyZ2luLCBpc3V5KTsKIAkJCWlmICgwID4gcmMpIHsKLQkJCQlTQVkoIkVSUk9SOiByZWRhdWIoKSBmYWlsZWRcbiIpOworCQkJCVNBTSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCQlvdmVyIC09IG11Y2g7ICAgY3ogKz0gbXVjaDsKQEAgLTEyODEsNiArMTcxOCw5IEBACiAJCQkJbWV4Kys7CiAJCQkJcGV4ID0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdW21leF0ucGdvOwogCQkJCXJleCA9IFBBR0VfU0laRTsKKwkJCQlpZiAocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrZXhdW21leF0uaW5wdXQgIT0gXAorCQkJCQkJKDB4MDh8cGVhc3ljYXAtPmlucHV0KSkKKwkJCQkJYmFkaW5wdXQgPSB0cnVlOwogCQkJfQogCQkJcGFkICArPSBtb3JlOwogCQkJcmFkIC09IG1vcmU7CkBAIC0xMzA3LDYgKzE3NDcsMTYgQEAKIAkJCQltZXgrKzsKIAkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CiAJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJCWlmIChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5pbnB1dCAhPSBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKSB7CisJCQkJCUpPTSg4LCAiRVJST1I6IDB4JTAyWD0tPmZpZWxkX2J1ZmZlciJcCisJCQkJCQkiWyVpXVslaV0uaW5wdXQsICIgXAorCQkJCQkJIjB4JTAyWD0oMHgwOHwtPmlucHV0KVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtrZXhdW21leF0uaW5wdXQsIGtleCwgbWV4LCBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKTsKKwkJCQkJYmFkaW5wdXQgPSB0cnVlOworCQkJCX0KIAkJCX0KIAkJCW11Y2ggPSBvdmVyOwogCQkJaWYgKHJleCA8IG11Y2gpCkBAIC0xMzI1LDM5ICsxNzc1LDM5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjMiA9IChtZXggKyAxKSpQQUdFX1NJWkUgLSByZXg7CiBpZiAoY3ogIT0gYzIpCi0JU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgcmVhZFxuIiwgYzIgLSBjeik7CisJU0FNKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgcmVhZFxuIiwgYzIgLSBjeik7CiBjMyA9IChtYWQgKyAxKSpQQUdFX1NJWkUgLSByYWQ7CiAKIGlmIChmYWxzZSA9PSBkZWNpbWF0ZXBpeGVsKSB7CiAJaWYgKGJ5dGVzcGVycGl4ZWwgKiBcCiAJCWN6ICE9IGMzKSBcCi0JCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKKwkJU0FNKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgd3JpdHRlblxuIiwgXAogCQkJCQkJYzMgLSAoYnl0ZXNwZXJwaXhlbCAqIFwKIAkJCQkJCQkJCWN6KSk7CiB9IGVsc2UgewogCWlmIChmYWxzZSA9PSBvZGQpIHsKIAkJaWYgKGJ5dGVzcGVycGl4ZWwgKiBcCiAJCQljeiAhPSAoNCAqIGMzKSkKLQkJCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKKwkJCVNBTSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpIGluIGJ5dGVzIHdyaXR0ZW5cbiIsIFwKIAkJCQkJCSgyKmMzKS0oYnl0ZXNwZXJwaXhlbCAqIFwKIAkJCQkJCQkJCWN6KSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoMCAhPSBjMykKLQkJCQlTQVkoIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSAiIFwKKwkJCQlTQU0oIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSAiIFwKIAkJCQkJCSJpbiBieXRlcyB3cml0dGVuXG4iLCBjMyk7CiAJCX0KIH0KIGlmIChydW1wKQotCVNBWSgiRVJST1I6IHVuZGlzY2hhcmdlZCBjYWNoZSBhdCBlbmQgb2YgbGluZSBpbiBmcmFtZSBidWZmZXJcbiIpOworCVNBTSgiV09SUlk6IHVuZGlzY2hhcmdlZCBjYWNoZSBhdCBlbmQgb2YgbGluZSBpbiBmcmFtZSBidWZmZXJcbiIpOwogCi1KT1QoOCwgIj09PT09IGZpZWxkMmZyYW1lKCk6ICVpIGJ5dGVzIC0tPiAlaSBieXRlcyAoaW5jbCBza2lwKVxuIiwgYzIsIGMzKTsKLUpPVCg4LCAiPT09PT0gZmllbGQyZnJhbWUoKTogJWk9bWFkICAlaT1yYWRcbiIsIG1hZCwgcmFkKTsKK0pPTSg4LCAiPT09PT0gZmllbGQyZnJhbWUoKTogJWkgYnl0ZXMgLS0+ICVpIGJ5dGVzIChpbmNsIHNraXApXG4iLCBjMiwgYzMpOworSk9NKDgsICI9PT09PSBmaWVsZDJmcmFtZSgpOiAlaT1tYWQgICVpPXJhZFxuIiwgbWFkLCByYWQpOwogCiBpZiAodHJ1ZSA9PSBvZGQpCi0JSk9UKDgsICIrKysrKyBmaWVsZDJmcmFtZSgpOiAgZnJhbWUgYnVmZmVyICVpIGlzIGZ1bGxcbiIsIGthZCk7CisJSk9NKDgsICIrKysrKyBmaWVsZDJmcmFtZSgpOiAgZnJhbWUgYnVmZmVyICVpIGlzIGZ1bGxcbiIsIGthZCk7CiAKIGlmIChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkKLQlTQVkoIldBUk5JTkc6IG9uIGV4aXQsIGZpbGxpbmcgZmllbGQgYnVmZmVyICVpXG4iLCBcCisJU0FNKCJXQVJOSU5HOiBvbiBleGl0LCBmaWxsaW5nIGZpZWxkIGJ1ZmZlciAlaVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC0xMzY1LDIzICsxODE1LDI0IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGRvX2dldHRpbWVvZmRheSgmdGltZXZhbCk7Ci1pZiAodGltZXZhbDAudHZfc2VjKSB7CitpZiAocGVhc3ljYXAtPnRpbWV2YWw2LnR2X3NlYykgewogCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCi0JCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgIC0gdGltZXZhbDAudHZfc2VjKSkgKyBcCi0JCQkgKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIHRpbWV2YWwwLnR2X3VzZWMpOworCQkoKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfc2VjIC0gXAorCQkJCQlwZWFzeWNhcC0+dGltZXZhbDYudHZfc2VjKSkgKyBcCisJCSAobG9uZyBsb25nIGludCkodGltZXZhbC50dl91c2VjIC0gcGVhc3ljYXAtPnRpbWV2YWw2LnR2X3VzZWMpOwogCWFib3ZlID0gKGxvbmcgbG9uZyBpbnQpMTAwMDAwMDsKIAogCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKIAlhYm92ZSA9IHNkci5xdW90aWVudDsKIAlyZW1haW5kZXIgPSAoX191MzIpc2RyLnJlbWFpbmRlcjsKIAotCUpPVCg4LCAidmlkZW8gc3RyZWFtaW5nIGF0ICUzbGxpLiUwM2kgZmllbGRzIHBlciBzZWNvbmRcbiIsIGFib3ZlLCBcCisJSk9NKDgsICJ2aWRlbyBzdHJlYW1pbmcgYXQgJTNsbGkuJTAzaSBmaWVsZHMgcGVyIHNlY29uZFxuIiwgYWJvdmUsIFwKIAkJCQkJCQkocmVtYWluZGVyLzEwMDApKTsKIH0KLXRpbWV2YWwwID0gdGltZXZhbDsKK3BlYXN5Y2FwLT50aW1ldmFsNiA9IHRpbWV2YWw7CiAKIGlmIChjYWNoZXMpCi0JSk9UKDgsICIlaT1jYWNoZXNcbiIsIGNhY2hlcyk7CisJSk9NKDgsICIlaT1jYWNoZXNcbiIsIGNhY2hlcyk7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0MzQsNyArMTg4NSw3IEBACiAJCQkJCV9fdTggbWFzaywgX191OCBtYXJnaW4sIGJvb2wgaXN1eSkKIHsKIHN0YXRpYyBfX3MzMiBheVsyNTZdLCBidVsyNTZdLCBydlsyNTZdLCBndVsyNTZdLCBndlsyNTZdOwotc3RhdGljIF9fdTggY2FjaGVbOF0sICpwY2FjaGU7CitfX3U4ICpwY2FjaGU7CiBfX3U4IHIsIGcsIGIsIHksIHUsIHYsIGMsICpwMiwgKnAzLCAqcHosICpwcjsKIGludCAgYnl0ZXNwZXJwaXhlbDsKIGJvb2wgYnl0ZXN3YXBvcmRlciwgZGVjaW1hdGVwaXhlbCwgbGFzdDsKQEAgLTE0NDIsNyArMTg5Myw3IEBACiBfX3MzMiBzMzI7CiAKIGlmIChtdWNoICUgMikgewotCVNBWSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOworCVNBTSgiTUlTVEFLRTogbXVjaCBpcyBvZGRcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogYnl0ZXNwZXJwaXhlbCA9IHBlYXN5Y2FwLT5ieXRlc3BlcnBpeGVsOwpAQCAtMTQ3NSwzMCArMTkyNiwzMSBAQAogCQlheVtqXSA9IGF5WzE2XTsKIAlmb3IgKGogPSAyMzY7IGogPCAyNTY7IGorKykKIAkJYXlbal0gPSBheVsyMzVdOwotCUpPVCg4LCAibG9va3VwIHRhYmxlcyBhcmUgcHJlcGFyZWRcbiIpOworCUpPTSg4LCAibG9va3VwIHRhYmxlcyBhcmUgcHJlcGFyZWRcbiIpOwogfQotaWYgKChfX3U4ICopTlVMTCA9PSBwY2FjaGUpCi0JcGNhY2hlID0gJmNhY2hlWzBdOworcGNhY2hlID0gcGVhc3ljYXAtPnBjYWNoZTsKK2lmIChOVUxMID09IHBjYWNoZSkKKwlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUUkFOU0ZFUiBDT05URU5UUyBPRiBDQUNIRSBUTyBUSEUgRlJBTUUgQlVGRkVSCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICghcGNhY2hlKSB7Ci0JU0FZKCJNSVNUQUtFOiBwY2FjaGUgaXMgTlVMTFxuIik7CisJU0FNKCJNSVNUQUtFOiBwY2FjaGUgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWlmIChwY2FjaGUgIT0gJmNhY2hlWzBdKQotCUpPVCgxNiwgImNhY2hlIGhhcyAlaSBieXRlc1xuIiwgKGludCkocGNhY2hlIC0gJmNhY2hlWzBdKSk7Ci1wMiA9ICZjYWNoZVswXTsKLXAzID0gKF9fdTggKilwYWQgLSAoaW50KShwY2FjaGUgLSAmY2FjaGVbMF0pOworaWYgKHBjYWNoZSAhPSAmcGVhc3ljYXAtPmNhY2hlWzBdKQorCUpPTSgxNiwgImNhY2hlIGhhcyAlaSBieXRlc1xuIiwgKGludCkocGNhY2hlIC0gJnBlYXN5Y2FwLT5jYWNoZVswXSkpOworcDIgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOworcDMgPSAoX191OCAqKXBhZCAtIChpbnQpKHBjYWNoZSAtICZwZWFzeWNhcC0+Y2FjaGVbMF0pOwogd2hpbGUgKHAyIDwgcGNhY2hlKSB7CiAJKnAzKysgPSAqcDI7ICBwMisrOwogfQotcGNhY2hlID0gJmNhY2hlWzBdOworcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIGlmIChwMyAhPSBwYWQpIHsKLQlTQVkoIk1JU1RBS0U6IHBvaW50ZXIgbWlzYWxpZ25tZW50XG4iKTsKKwlTQU0oIk1JU1RBS0U6IHBvaW50ZXIgbWlzYWxpZ25tZW50XG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE1MTMsNyArMTk2NSw3IEBACiAJdiA9ICoocDIgLSAxKTsKIAogaWYgKHJ1bXApCi0JSk9UKDE2LCAiJTRpPW11Y2ggICU0aT1tb3JlICAlaT1ydW1wXG4iLCBtdWNoLCBtb3JlLCBydW1wKTsKKwlKT00oMTYsICIlNGk9bXVjaCAgJTRpPW1vcmUgICVpPXJ1bXBcbiIsIG11Y2gsIG1vcmUsIHJ1bXApOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwpIHsKQEAgLTE2MTksNyArMjA3MSw3IEBACiAJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSByOwpAQCAtMTYzNCw3ICsyMDg2LDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTE2OTIsNyArMjE0NCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKLQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CiAJCQkJCWNhc2UgMTogewogCQkJCQkJKnAzID0gYjsKQEAgLTE3MDcsNyArMjE1OSw3IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CkBAIC0xNzY4LDcgKzIyMjAsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IHI7CkBAIC0xNzgzLDcgKzIyMzUsNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTE4NDQsNyArMjI5Niw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQkJY2FzZSAxOiB7CiAJCQkJCQkJKnAzID0gYjsKQEAgLTE4NTksNyArMjMxMSw3IEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSIlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTkyNCw3ICsyMzc2LDcgQEAKIAkJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSByOwpAQCAtMTk0OCw3ICsyNDAwLDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTIwMDYsNyArMjQ1OCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKLQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CiAJCQkJCWNhc2UgMTogewogCQkJCQkJKnAzID0gYjsKQEAgLTIwMzAsNyArMjQ4Miw3IEBACiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CkBAIC0yMDkzLDcgKzI1NDUsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IHI7CkBAIC0yMTE3LDcgKzI1NjksNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBcCiAJCQkJCQkJcnVtcCk7CkBAIC0yMTc4LDcgKzI2MzAsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQkJcGNhY2hlID0gJmNhY2hlWzBdOworCQkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJCWNhc2UgMTogewogCQkJCQkJCSpwMyA9IGI7CkBAIC0yMjAyLDcgKzI2NTQsNyBAQAogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQkJZGVmYXVsdDogewotCQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkiJWk9cnVtcFxuIiwgXAogCQkJCQkJCWJ5dGVzcGVycGl4ZWwgLSBydW1wKTsKIAkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIyMjYsNDggKzI2NzgsMTMgQEAKIAlicmVhazsKIAl9CiBkZWZhdWx0OiB7Ci0JU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBieXRlc3BlcnBpeGVsKTsKKwlTQU0oIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOwogCXJldHVybiAtRUZBVUxUOwogCX0KIH0KIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotZGVicmllZihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCi17Ci1pZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCAhPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQljaGVja19zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQljaGVja19zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQlzYXlyZWFkb25seShwZWFzeWNhcCk7Ci0JU0FZKCIlaT1wZWFzeWNhcC0+ZmllbGRfZmlsbFxuIiwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwpOwotCVNBWSgiJWk9cGVhc3ljYXAtPmZpZWxkX3JlYWRcbiIsIHBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKLQlTQVkoIiVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7Ci0JU0FZKCIlaT1wZWFzeWNhcC0+ZnJhbWVfcmVhZFxuIiwgcGVhc3ljYXAtPmZyYW1lX3JlYWQpOwotfQotcmV0dXJuOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotc2F5cmVhZG9ubHkoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQotewotc3RhdGljIGludCBkb25lOwotaW50IGdvdDAwLCBnb3QxRiwgZ290NjAsIGdvdDYxLCBnb3Q2MjsKLQotaWYgKCghZG9uZSkgJiYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSkgewotCWRvbmUgPSAxOwotCWdvdDAwID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDAwKTsKLQlnb3QxRiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgxRik7Ci0JZ290NjAgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4NjApOwotCWdvdDYxID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDYxKTsKLQlnb3Q2MiA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHg2Mik7Ci0JU0FZKCIweCUwMlg9cmVnMHgwMCAgMHglMDJYPXJlZzB4MUZcbiIsIGdvdDAwLCBnb3QxRik7Ci0JU0FZKCIweCUwMlg9cmVnMHg2MCAgMHglMDJYPXJlZzB4NjEgIDB4JTAyWD1yZWcweDYyXG4iLCBcCi0JCQkJCQkJZ290NjAsIGdvdDYxLCBnb3Q2Mik7Ci19Ci1yZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNFRSBDT1JCRVQgRVQgQUwuICJMSU5VWCBERVZJQ0UgRFJJVkVSUyIsIDNyZCBFRElUSU9OLCBQQUdFUyA0MzAtNDM0CkBAIC0yMjkyLDExICsyNzA5LDE2IEBACiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiAKIHBlYXN5Y2FwID0gcHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotaWYgKE5VTEwgIT0gcGVhc3ljYXApCi0JcGVhc3ljYXAtPnZtYV9tYW55Kys7Ci0KK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuOworfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybjsKK30KK3BlYXN5Y2FwLT52bWFfbWFueSsrOwogSk9UKDgsICIlaT1wZWFzeWNhcC0+dm1hX21hbnlcbiIsIHBlYXN5Y2FwLT52bWFfbWFueSk7Ci0KIHJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMDYsMTAgKzI3MjgsMTYgQEAKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIAogcGVhc3ljYXAgPSBwdm1hLT52bV9wcml2YXRlX2RhdGE7Ci1pZiAoTlVMTCAhPSBwZWFzeWNhcCkgewotCXBlYXN5Y2FwLT52bWFfbWFueS0tOwotCUpPVCg4LCAiJWk9cGVhc3ljYXAtPnZtYV9tYW55XG4iLCBwZWFzeWNhcC0+dm1hX21hbnkpOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm47CiB9CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQorcGVhc3ljYXAtPnZtYV9tYW55LS07CitKT1QoOCwgIiVpPXBlYXN5Y2FwLT52bWFfbWFueVxuIiwgcGVhc3ljYXAtPnZtYV9tYW55KTsKIHJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzNTUsMjQgKzI3ODMsMjIgQEAKIAlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gcmV0Y29kZTsKIH0KLW11dGV4X2xvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogcGJ1ZiA9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvOwogaWYgKE5VTEwgPT0gcGJ1ZikgewotCVNBWSgiRVJST1I6ICBwYnVmIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6ICBwYnVmIGlzIE5VTExcbiIpOwogCWdvdG8gZmluaXNoOwogfQogcGFnZSA9IHZpcnRfdG9fcGFnZShwYnVmKTsKIGlmIChOVUxMID09IHBhZ2UpIHsKLQlTQVkoIkVSUk9SOiAgcGFnZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiAgcGFnZSBpcyBOVUxMXG4iKTsKIAlnb3RvIGZpbmlzaDsKIH0KIGdldF9wYWdlKHBhZ2UpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZmluaXNoOgotbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKTsKIGlmIChOVUxMID09IHBhZ2UpIHsKLQlTQVkoIkVSUk9SOiAgcGFnZSBpcyBOVUxMIGFmdGVyIGdldF9wYWdlKHBhZ2UpXG4iKTsKKwlTQU0oIkVSUk9SOiAgcGFnZSBpcyBOVUxMIGFmdGVyIGdldF9wYWdlKHBhZ2UpXG4iKTsKIH0gZWxzZSB7CiAJcHZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0Y29kZSA9IFZNX0ZBVUxUX01JTk9SOwpAQCAtMjM4Myw3ICsyODA5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgT04gQ09NUExFVElPTiBPRiBBIFZJREVPIFVSQiBJVFMgREFUQSBJUyBDT1BJRUQgVE8gVEhFIEZJRUxEIEJVRkZFUlMKLSAqICBQUk9WSURFRCBwZWFzeWNhcC0+dmlkZW9faWRsZSBJUyBaRVIwLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCisgKiAgUFJPVklERUQgcGVhc3ljYXAtPnZpZGVvX2lkbGUgSVMgWkVSTy4gIFJFR0FSRExFU1MgT0YgVEhJUyBCRUlORyBUUlVFLAogICogIElUIElTIFJFU1VCTUlUVEVEIFBST1ZJREVEIHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyBJUyBOT1QgWkVSTy4KICAqCiAgKiAgVEhJUyBGVU5DVElPTiBJUyBBTiBJTlRFUlJVUFQgU0VSVklDRSBST1VUSU5FIEFORCBNVVNUIE5PVCBTTEVFUC4KQEAgLTI0MDAsNyArMjgyNiw4IEBACiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg4MDAwKSAgID0+IEFUIExFQVNUIE9ORSBVUkIgQ09NUExFVEVEIFdJVEggRVJST1JTCiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHg0MDAwKSAgID0+IEJVRkZFUiBIQVMgVE9PIE1VQ0ggREFUQQogICogICAgICAwICE9IChrb3VudCAmIDB4MjAwMCkgICA9PiBCVUZGRVIgSEFTIE5PVCBFTk9VR0ggREFUQQotICogICAgICAwICE9IChrb3VudCAmIDB4MDQwMCkgICA9PiBGSUVMRCBXQVMgU1VCTUlUVEVEIEJZIEJSSURHRVIgUk9VVElORQorICogICAgICAwICE9IChrb3VudCAmIDB4MTAwMCkgICA9PiBCVUZGRVIgSEFTIERBVEEgRlJPTSBESVNQQVJBVEUgSU5QVVRTCisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwNDAwKSAgID0+IFJFU0VSVkVECiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwMjAwKSAgID0+IEZJRUxEIEJVRkZFUiBOT1QgWUVUIENIRUNLRUQKICAqICAgICAgMCAhPSAoa291bnQgJiAweDAxMDApICAgPT4gQlVGRkVSIEhBUyBUV08gRVhUUkEgQllURVMgLSBXSFk/CiAgKi8KQEAgLTI0MDgsMTkgKzI4MzUsMTQgQEAKIHZvaWQKIGVhc3ljYXBfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKIHsKLXN0YXRpYyBpbnQgbXQ7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBmaWVsZF9idWZmZXI7CiBjaGFyIGVycmJ1ZlsxNl07CiBpbnQgaSwgbW9yZSwgbXVjaCwgbGVhcCwgcmMsIGxhc3Q7CiBpbnQgdmlkZW9maWVsZGFtb3VudDsKLXVuc2lnbmVkIGludCBvdmVycmlkZTsKK3Vuc2lnbmVkIGludCBvdmVycmlkZSwgYmFkOwogaW50IGZyYW1lc3RhdHVzLCBmcmFtZWxlbmd0aCwgZnJhbWVhY3R1YWwsIGZyYW1lb2Zmc2V0OwogX191OCAqcHU7Ci0jaWYgZGVmaW5lZChCUklER0VSKQotc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKLWxvbmcgbG9uZyB1c2VjOwotI2VuZGlmIC8qQlJJREdFUiovCiAKIGlmIChOVUxMID09IHB1cmIpIHsKIAlTQVkoIkVSUk9SOiBlYXN5Y2FwX2NvbXBsZXRlKCk6IHB1cmIgaXMgTlVMTFxuIik7CkBAIC0yNDMxLDc0ICsyODUzLDc4IEBACiAJU0FZKCJFUlJPUjogZWFzeWNhcF9jb21wbGV0ZSgpOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm47CiB9Ci0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm47Cit9CiBpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikKIAlyZXR1cm47Ci0KIGZvciAoaSA9IDA7IGkgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyBpKyspCiAJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJbaV0ucGdvKQogCQlicmVhazsKLUpPVCgxNiwgIiUyaT11cmJcbiIsIGkpOworSk9NKDE2LCAiJTJpPXVyYlxuIiwgaSk7CiBsYXN0ID0gcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc2VxdWVuY2U7CiBpZiAoKCgoVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDEpID09IGxhc3QpICYmIFwKIAkJCQkJCSgwICE9IGkpKSB8fCBcCiAJKCgoVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDEpICE9IGxhc3QpICYmIFwKIAkJCQkJCSgobGFzdCArIDEpICE9IGkpKSkgewotCVNBWSgiRVJST1I6IG91dC1vZi1vcmRlciB1cmJzICVpLCVpIC4uLiBjb250aW51aW5nXG4iLCBsYXN0LCBpKTsKKwlKT00oMTYsICJFUlJPUjogb3V0LW9mLW9yZGVyIHVyYnMgJWksJWkgLi4uIGNvbnRpbnVpbmdcbiIsIGxhc3QsIGkpOwogfQogcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc2VxdWVuY2UgPSBpOwogCiBpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKLQlKT1QoMTYsICIlaT12aWRlb19pZGxlICAlaT12aWRlb19pc29jX3N0cmVhbWluZ1xuIiwgXAorCUpPTSgxNiwgIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCiAJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSwgcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKTsKIAlpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CiAJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICgwICE9IHJjKSB7Ci0JCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCAiIFwKLQkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGggcmM6XG4iLCBcCi0JCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwogCQkJc3dpdGNoIChyYykgewogCQkJY2FzZSAtRU5PTUVNOiB7Ci0JCQkJU0FZKCJFTk9NRU1cbiIpOworCQkJCVNBTSgiRU5PTUVNXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsKKwkJCQlTQU0oIkVOT0RFVlxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTlhJTzogewotCQkJCVNBWSgiRU5YSU9cbiIpOworCQkJCVNBTSgiRU5YSU9cbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUlOVkFMOiB7Ci0JCQkJU0FZKCJFSU5WQUxcbiIpOworCQkJCVNBTSgiRUlOVkFMXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVBR0FJTjogewotCQkJCVNBWSgiRUFHQUlOXG4iKTsKKwkJCQlTQU0oIkVBR0FJTlxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FRkJJRzogewotCQkJCVNBWSgiRUZCSUdcbiIpOworCQkJCVNBTSgiRUZCSUdcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQlTQVkoIkVQSVBFXG4iKTsKKwkJCQlTQU0oIkVQSVBFXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJU0FZKCJFTVNHU0laRVxuIik7CisJCQkJU0FNKCJFTVNHU0laRVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTk9TUEM6IHsKLQkJCQlTQVkoIkVOT1NQQ1xuIik7CisJCQkJU0FNKCJFTk9TUENcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJZGVmYXVsdDogewotCQkJCVNBWSgiMHglMDhYXG4iLCByYyk7CisJCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCX0KKwkJCWlmICgtRU5PREVWICE9IHJjKSBcCisJCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9dmlkZW9faWRsZSwgIiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKCkgIiBcCisJCQkJCQkJImZhaWxlZCB3aXRoIHJjOlxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAkJfQogCX0KIHJldHVybjsKQEAgLTI1MDYsODAgKzI5MzIsODAgQEAKIG92ZXJyaWRlID0gMDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgewotCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CisJU0FNKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKIAlyZXR1cm47CiB9CiBpZiAocHVyYi0+c3RhdHVzKSB7CiAJaWYgKCgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgfHwgKC1FTk9FTlQgPT0gcHVyYi0+c3RhdHVzKSkgewotCQlKT1QoOCwgInVyYiBzdGF0dXMgLUVTSFVURE9XTiBvciAtRU5PRU5UXG4iKTsKKwkJSk9NKDgsICJ1cmIgc3RhdHVzIC1FU0hVVERPV04gb3IgLUVOT0VOVFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfZmlsbF1bMF0ua291bnQpIHw9IDB4ODAwMCA7Ci0JU0FZKCJFUlJPUjogYmFkIHVyYiBzdGF0dXM6XG4iKTsKKwlTQU0oIkVSUk9SOiBiYWQgdXJiIHN0YXR1czpcbiIpOwogCXN3aXRjaCAocHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAtRUlOUFJPR1JFU1M6IHsKLQkJU0FZKCItRUlOUFJPR1JFU1NcbiIpOyBicmVhazsKKwkJU0FNKCItRUlOUFJPR1JFU1NcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PU1I6IHsKLQkJU0FZKCItRU5PU1JcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PU1JcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBJUEU6IHsKLQkJU0FZKCItRVBJUEVcbiIpOyBicmVhazsKKwkJU0FNKCItRVBJUEVcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU9WRVJGTE9XOiB7Ci0JCVNBWSgiLUVPVkVSRkxPV1xuIik7IGJyZWFrOworCQlTQU0oIi1FT1ZFUkZMT1dcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBST1RPOiB7Ci0JCVNBWSgiLUVQUk9UT1xuIik7IGJyZWFrOworCQlTQU0oIi1FUFJPVE9cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUlMU0VROiB7Ci0JCVNBWSgiLUVJTFNFUVxuIik7IGJyZWFrOworCQlTQU0oIi1FSUxTRVFcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVRJTUVET1VUOiB7Ci0JCVNBWSgiLUVUSU1FRE9VVFxuIik7IGJyZWFrOworCQlTQU0oIi1FVElNRURPVVRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU1TR1NJWkU6IHsKLQkJU0FZKCItRU1TR1NJWkVcbiIpOyBicmVhazsKKwkJU0FNKCItRU1TR1NJWkVcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU9QTk9UU1VQUDogewotCQlTQVkoIi1FT1BOT1RTVVBQXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVBGTk9TVVBQT1JUOiB7Ci0JCVNBWSgiLUVQRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCQlTQU0oIi1FUEZOT1NVUFBPUlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFGTk9TVVBQT1JUOiB7Ci0JCVNBWSgiLUVBRk5PU1VQUE9SVFxuIik7IGJyZWFrOworCQlTQU0oIi1FQUZOT1NVUFBPUlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFERFJJTlVTRTogewotCQlTQVkoIi1FQUREUklOVVNFXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUFERFJOT1RBVkFJTDogewotCQlTQVkoIi1FQUREUk5PVEFWQUlMXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PQlVGUzogewotCQlTQVkoIi1FTk9CVUZTXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT0JVRlNcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUlTQ09OTjogewotCQlTQVkoIi1FSVNDT05OXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJU0NPTk5cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PVENPTk46IHsKLQkJU0FZKCItRU5PVENPTk5cbiIpOyBicmVhazsKKwkJU0FNKCItRU5PVENPTk5cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRVNIVVRET1dOOiB7Ci0JCVNBWSgiLUVTSFVURE9XTlxuIik7IGJyZWFrOworCQlTQU0oIi1FU0hVVERPV05cbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PRU5UOiB7Ci0JCVNBWSgiLUVOT0VOVFxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9FTlRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRUNPTk5SRVNFVDogewotCQlTQVkoIi1FQ09OTlJFU0VUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVDT05OUkVTRVRcbiIpOyBicmVhazsKIAl9CiAJY2FzZSAtRU5PU1BDOiB7Ci0JCVNBWSgiRU5PU1BDXG4iKTsgYnJlYWs7CisJCVNBTSgiRU5PU1BDXG4iKTsgYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKKwkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKIAl9CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjYzOCw3ICszMDY0LDcgQEAKIAkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09OTlJFU0VUIik7IGJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PU1BDOiB7Ci0JCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCQlTQU0oIkVOT1NQQ1xuIik7IGJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVNIVVRET1dOOiB7CiAJCQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVNIVVRET1dOIik7IGJyZWFrOwpAQCAtMjY1Myw3ICszMDc5LDcgQEAKIAkJZnJhbWVhY3R1YWwgPSBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwogCQlmcmFtZW9mZnNldCA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKIAotCQlKT1QoMTYsICJmcmFtZVslMmldOiIgXAorCQlKT00oMTYsICJmcmFtZVslMmldOiIgXAogCQkJCSIlNGk9c3RhdHVzICIgIFwKIAkJCQkiJTRpPWFjdHVhbCAiICBcCiAJCQkJIiU0aT1sZW5ndGggIiAgXApAQCAtMjY2NywxOSArMzA5MywyMCBAQAogCQkJCVBBR0VfU0laRSkgKyBcCiAJCQkJKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gcGZpZWxkX2J1ZmZlci0+cGdvKTsKIAkJaWYgKDQgPT0gbW9yZSkKLQkJCW10Kys7CisJCQlwZWFzeWNhcC0+dmlkZW9fbXQrKzsKIAkJaWYgKDQgPCBtb3JlKSB7Ci0JCQlpZiAobXQpIHsKLQkJCQlKT1QoOCwgIiU0aSBlbXB0eSB2aWRlbyB1cmIgZnJhbWVzXG4iLCBtdCk7Ci0JCQkJbXQgPSAwOworCQkJaWYgKHBlYXN5Y2FwLT52aWRlb19tdCkgeworCQkJCUpPTSg4LCAiJTRpIGVtcHR5IHZpZGVvIHVyYiBmcmFtZXNcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9fbXQpOworCQkJCXBlYXN5Y2FwLT52aWRlb19tdCA9IDA7CiAJCQl9CiAJCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfcGFnZVxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXApAQCAtMjcxMiwxMSArMzEzOSwxMyBAQAogCQkJCQkJcGVhc3ljYXAtPnZpZGVvZmllbGRhbW91bnQpIHsKIAkJCQkJaWYgKDIgPT0gdmlkZW9maWVsZGFtb3VudCAtIFwKIAkJCQkJCQlwZWFzeWNhcC0+XAotCQkJCQkJCXZpZGVvZmllbGRhbW91bnQpCisJCQkJCQkJdmlkZW9maWVsZGFtb3VudCkgewogCQkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAogCQkJCQkJCVswXS5rb3VudCkgfD0gMHgwMTAwOwotCQkJCQllbHNlCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayArPSAoMSArIFwKKwkJCQkJCQlWSURFT19KVU5LX1RPTEVSQVRFKTsKKwkJCQkJfSBlbHNlCiAJCQkJCQkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCiAJCQkJCQkJWzBdLmtvdW50KSB8PSAweDQwMDA7CkBAIC0yNzI3LDUzICszMTU2LDc0IEBACiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAogCQkJCQkJCVswXS5rb3VudCkgfD0gMHgyMDAwOwogCQkJCQl9Ci0JCQkJaWYgKCEoMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJYmFkID0gMHhGRjAwICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCi0JCQkJCQlbMF0ua291bnQpKSB7Ci0JCQkJCShwZWFzeWNhcC0+dmlkZW9fanVuayktLTsKLQkJCQkJaWYgKC0xNiA+IHBlYXN5Y2FwLT52aWRlb19qdW5rKQotCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtMTY7Ci0JCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gXAorCQkJCQkJWzBdLmtvdW50OworCQkJCQlpZiAoIWJhZCkgeworCQkJCQkJKHBlYXN5Y2FwLT52aWRlb19qdW5rKS0tOworCQkJCQkJaWYgKC1WSURFT19KVU5LX1RPTEVSQVRFID4gXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rKSBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPVwKKwkJCQkJCQktVklERU9fSlVOS19UT0xFUkFURTsKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gXAogCQkJCQkJCShwZWFzeWNhcC0+XAogCQkJCQkJCQlmaWVsZF9maWxsKSsrOwotCi0JCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCkKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsID0gMDsKLQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOwotCQkJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5cCi0JCQkJCQlmaWVsZF9idWZmZXJcCi0JCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAotCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKLQkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAorCQkJCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IFwKKwkJCQkJCQkJcGVhc3ljYXAtPlwKKwkJCQkJCQkJZmllbGRfZmlsbCkKKwkJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJCQlmaWVsZF9maWxsID0gMDsKKwkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKKwkJCQkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfZmlsbF1cCisJCQkJCQkJW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfcGFnZV07CisJCQkJCQlwZmllbGRfYnVmZmVyLT5wdG8gPSBcCiAJCQkJCQkJcGZpZWxkX2J1ZmZlci0+cGdvOwotCi0JCQkJCUpPVCg4LCAiYnVtcGVkIHRvOiAlaT1wZWFzeWNhcC0+IiBcCi0JCQkJCQkiZmllbGRfZmlsbCAgJWk9cGFyaXR5XG4iLCBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAotCQkJCQkJMHgwMEZGICYgcGZpZWxkX2J1ZmZlci0+a291bnQpOwotCQkJCQlKT1QoOCwgImZpZWxkIGJ1ZmZlciAlaSBoYXMgJWkgIiBcCi0JCQkJCQkiYnl0ZXMgZml0IHRvIGJlIHJlYWRcbiIsIFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBcCi0JCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKLQkJCQkJSk9UKDgsICJ3YWtldXAgY2FsbCB0byB3cV92aWRlbywgIiBcCi0JCQkJCQkiJWk9ZmllbGRfcmVhZCAlaT1maWVsZF9maWxsICJcCi0JCQkJCQkiJWk9cGFyaXR5XG4iLCBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgXAotCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKLQkJCQkJCTB4MDBGRiAmIHBlYXN5Y2FwLT5cCi0JCQkJCQlmaWVsZF9idWZmZXJbcGVhc3ljYXAtPlwKLQkJCQkJCWZpZWxkX3JlYWRdWzBdLmtvdW50KTsKLQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPlwKLQkJCQkJCQkJd3FfdmlkZW8pKTsKLQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOworCQkJCQkJSk9NKDgsICJidW1wZWQgdG86ICVpPSJcCisJCQkJCQkJInBlYXN5Y2FwLT4iIFwKKwkJCQkJCQkiZmllbGRfZmlsbCAgJWk9IlwKKwkJCQkJCQkicGFyaXR5XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKKwkJCQkJCQkweDAwRkYgJiBcCisJCQkJCQkJcGZpZWxkX2J1ZmZlci0+a291bnQpOworCQkJCQkJSk9NKDgsICJmaWVsZCBidWZmZXIgJWkgaGFzICJcCisJCQkJCQkJIiVpIGJ5dGVzIGZpdCB0byBiZSAiXAorCQkJCQkJCSJyZWFkXG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKKwkJCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKKwkJCQkJCUpPTSg4LCAid2FrZXVwIGNhbGwgdG8gIlwKKwkJCQkJCQkid3FfdmlkZW8sICIgXAorCQkJCQkJCSIlaT1maWVsZF9yZWFkICJcCisJCQkJCQkJIiVpPWZpZWxkX2ZpbGwgIlwKKwkJCQkJCQkiJWk9cGFyaXR5XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAorCQkJCQkJCTB4MDBGRiAmIHBlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfYnVmZmVyXAorCQkJCQkJCVtwZWFzeWNhcC0+XAorCQkJCQkJCWZpZWxkX3JlYWRdWzBdLmtvdW50KTsKKwkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZVwKKwkJCQkJCQkoJihwZWFzeWNhcC0+XAorCQkJCQkJCQkgd3FfdmlkZW8pKTsKKwkJCQkJCWRvX2dldHRpbWVvZmRheVwKKwkJCQkJCQkoJnBlYXN5Y2FwLT50aW1ldmFsNyk7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rKys7Ci0JCQkJCUpPVCg4LCAiZmllbGQgYnVmZmVyICVpIGhhZCAlaSAiIFwKLQkJCQkJCSJieXRlcywgbm93IGRpc2NhcmRlZFxuIiwgXAorCQkJCQlpZiAoYmFkICYgMHgwMDEwKSBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayArPSBcCisJCQkJCQkoMSArIFZJREVPX0pVTktfVE9MRVJBVEUvMik7CisJCQkJCUpPTSg4LCAiZmllbGQgYnVmZmVyICVpIGhhZCAlaSAiIFwKKwkJCQkJCSJieXRlcywgbm93IGRpc2NhcmRlZDogIlwKKwkJCQkJCSIweCUwNFhcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCi0JCQkJCQl2aWRlb2ZpZWxkYW1vdW50KTsKLQorCQkJCQkJdmlkZW9maWVsZGFtb3VudCxcCisJCQkJCQkoMHhGRjAwICYgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1bMF0uXAorCQkJCQkJa291bnQpKTsKIAkJCQkJKHBlYXN5Y2FwLT5maWVsZF9maWxsKSsrOwogCiAJCQkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBcCkBAIC0yNzg3LDIwICszMjM3LDIyIEBACiAJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKIAkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287CiAKLQkJCQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKKwkJCQkJSk9NKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKIAkJCQkJCSJmaWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCiAJCQkJCQkweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7CiAJCQkJfQogCQkJCWlmICg4ID09IG1vcmUpIHsKLQkJCQkJSk9UKDgsICJlbmQtb2YtZmllbGQ6IHJlY2VpdmVkICIgXAorCQkJCQlKT00oOCwgImVuZC1vZi1maWVsZDogcmVjZWl2ZWQgIiBcCiAJCQkJCQkicGFyaXR5IGJ5dGUgMHglMDJYXG4iLCBcCiAJCQkJCQkoMHhGRiAmICpwdSkpOwogCQkJCQlpZiAoMHg0MCAmICpwdSkKIAkJCQkJCXBmaWVsZF9idWZmZXItPmtvdW50ID0gMHgwMDAwOwogCQkJCQllbHNlCiAJCQkJCQlwZmllbGRfYnVmZmVyLT5rb3VudCA9IDB4MDAwMTsKLQkJCQkJSk9UKDgsICJlbmQtb2YtZmllbGQ6IDB4JTAyWD1rb3VudFxuIixcCisJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0ID0gMHgwOCB8IFwKKwkJCQkJCSgweDA3ICYgcGVhc3ljYXAtPmlucHV0KTsKKwkJCQkJSk9NKDgsICJlbmQtb2YtZmllbGQ6IDB4JTAyWD1rb3VudFxuIixcCiAJCQkJCQkweEZGICYgcGZpZWxkX2J1ZmZlci0+a291bnQpOwogCQkJCX0KIAkJCX0KQEAgLTI4MTMsMTIgKzMyNjUsMTIgQEAKIAkJCW1vcmUgLT0gbGVhcDsKIAogCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB7Ci0JCQkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCWlmIChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUgPD0gXAogCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlKSB7Ci0JCQkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9wYWdlXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKQEAgLTI4MjksNyArMzI4MSw3IEBACiAJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOwogCQkJCWlmIChQQUdFX1NJWkUgPCAocGZpZWxkX2J1ZmZlci0+cHRvIC0gXAogCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbykpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkIHBmaWVsZF9idWZmZXItPnB0b1xuIik7CisJCQkJCVNBTSgiRVJST1I6IGJhZCBwZmllbGRfYnVmZmVyLT5wdG9cbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChQQUdFX1NJWkUgPT0gKHBmaWVsZF9idWZmZXItPnB0byAtIFwKQEAgLTI4MzcsNyArMzI4OSw3IEBACiAJCQkJCShwZWFzeWNhcC0+ZmllbGRfcGFnZSkrKzsKIAkJCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKLQkJCQkJCUpPVCgxNiwgIndyYXBwaW5nIHBlYXN5Y2FwLT4iIFwKKwkJCQkJCUpPTSgxNiwgIndyYXBwaW5nIHBlYXN5Y2FwLT4iIFwKIAkJCQkJCQkiZmllbGRfcGFnZVxuIik7CiAJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSA9IDA7CiAJCQkJCX0KQEAgLTI4NDcsNiArMzI5OSwxNSBAQAogCQkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CiAJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKIAkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287CisJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0ID0gMHgwOCB8IFwKKwkJCQkJCSgweDA3ICYgcGVhc3ljYXAtPmlucHV0KTsKKwkJCQkJaWYgKChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfZmlsbF1bMF0pLlwKKwkJCQkJCQkJaW5wdXQgIT0gXAorCQkJCQkJCXBmaWVsZF9idWZmZXItPmlucHV0KQorCQkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKKwkJCQkJCQlbMF0pLmtvdW50IHw9IDB4MTAwMDsKIAkJCQl9CiAKIAkJCQltdWNoID0gUEFHRV9TSVpFIC0gKGludCkocGZpZWxkX2J1ZmZlci0+cHRvIC0gXApAQCAtMjg2NSw1NSArMzMyNiw2IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICoKLSAqCi0gKiAgICAgICAgICAgICAqKiogVU5ERVIgREVWRUxPUE1FTlQvVEVTVElORyAtIE5PVCBSRUFEWSBZRVQhICoqKgotICoKLSAqCi0gKgotICogIFZJREVPVEFQRVMgTUFZIEhBVkUgQkVFTiBNQU5VQUxMWSBQQVVTRUQgQU5EIFJFU1RBUlRFRCBEVVJJTkcgUkVDT1JESU5HLgotICogIFRISVMgQ0FVU0VTIExPU1MgT0YgU1lOQywgQ09ORlVTSU5HIERPV05TVFJFQU0gVVNFUlNQQUNFIFBST0dSQU1TIFdISUNICi0gKiAgTUFZIElOVEVSUFJFVCBUSEUgSU5URVJSVVBUSU9OIEFTIEEgU1lNUFRPTSBPRiBMQVRFTkNZLiAgVE8gT1ZFUkNPTUUgVEhJUwotICogIFRIRSBEUklWRVIgQlJJREdFUyBUSEUgSElBVFVTIEJZIFNFTkRJTkcgRFVNTVkgVklERU8gRlJBTUVTIEFUIFJPVUdITFkKLSAqICBUSEUgUklHSFQgVElNRSBJTlRFUlZBTFMgSU4gVEhFIEhPUEUgT0YgUEVSU1VBRElORyBUSEUgRE9XTlNUUkVBTSBVU0VSU1BBQ0UKLSAqICBQUk9HUkFNIFRPIFJFU1VNRSBOT1JNQUwgU0VSVklDRSBXSEVOIFRIRSBJTlRFUlJVUFRJT04gSVMgT1ZFUi4KLSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGRlZmluZWQoQlJJREdFUikKLWRvX2dldHRpbWVvZmRheSgmdGltZXZhbCk7Ci1pZiAocGVhc3ljYXAtPnRpbWV2YWw3LnR2X3NlYykgewotCXVzZWMgPSAxMDAwMDAwKih0aW1ldmFsLnR2X3NlYyAgLSBwZWFzeWNhcC0+dGltZXZhbDcudHZfc2VjKSArIFwKLQkJCSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDcudHZfdXNlYyk7Ci0JaWYgKHVzZWMgPiAocGVhc3ljYXAtPnVzZWMgKyBwZWFzeWNhcC0+dG9sZXJhdGUpKSB7Ci0JCUpPVCg4LCAiYnJpZGdpbmcgaGlhdHVzXG4iKTsKLQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOwotCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudCB8PSAweDA0MDA7Ci0KLQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSAocGVhc3ljYXAtPmZpZWxkX2ZpbGwpKys7Ci0KLQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7Ci0JCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKLQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAotCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1bcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOwotCQlwZmllbGRfYnVmZmVyLT5wdG8gPSBwZmllbGRfYnVmZmVyLT5wZ287Ci0KLQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT5maWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKLQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCAweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7Ci0JCUpPVCg4LCAiZmllbGQgYnVmZmVyICVpIGhhcyAlaSBieXRlcyB0byBiZSBvdmVyd3JpdHRlblxuIiwgXAotCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIHZpZGVvZmllbGRhbW91bnQpOwotCQlKT1QoOCwgIndha2V1cCBjYWxsIHRvIHdxX3ZpZGVvLCAiIFwKLQkJCSIlaT1maWVsZF9yZWFkICVpPWZpZWxkX2ZpbGwgJWk9cGFyaXR5XG4iLCBcCi0JCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKLQkJCTB4MDBGRiAmIFwKLQkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7Ci0JCWRvX2dldHRpbWVvZmRheSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKLQl9Ci19Ci0jZW5kaWYgLypCUklER0VSKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCiAgKiAgUkVTVUJNSVQgVEhJUyBVUkIsIFVOTEVTUyBBIFNFVkVSRSBQRVJTSVNURU5UIEVSUk9SIENPTkRJVElPTiBFWElTVFMuCiAgKgogICogIElGIFRIRSBXQUlUIFFVRVVFUyBBUkUgTk9UIENMRUFSRUQgSU4gUkVTUE9OU0UgVE8gQU4gRVJST1IgQ09ORElUSU9OCkBAIC0yOTIxLDUxICszMzMzLDU3IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmIChWSURFT19JU09DX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT52aWRlb19qdW5rKSB7Ci0JU0FZKCJlYXN5Y2FwIGRyaXZlciBzaHV0dGluZyBkb3duIG9uIGNvbmRpdGlvbiBncmVlblxuIik7CisJU0FNKCJlYXN5Y2FwIGRyaXZlciBzaHV0dGluZyBkb3duIG9uIGNvbmRpdGlvbiBncmVlblxuIik7CisJcGVhc3ljYXAtPnN0YXR1cyA9IDE7CiAJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGVhc3ljYXAtPndxX3ZpZGVvKTsKKyNpZiAhZGVmaW5lZChQRVJTRVZFUkUpCiAJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7Ci0JcGVhc3ljYXAtPnZpZGVvX2p1bmsgPSAtVklERU9fSVNPQ19CVUZGRVJfTUFOWTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfYXVkaW8pKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBlYXN5Y2FwLT53cV9hdWRpbyk7CisjZW5kaWYgLypQRVJTRVZFUkUqLwogCXJldHVybjsKIH0KIGlmIChwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiRVJST1I6IHdoaWxlICVpPXZpZGVvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAotCQkJCQkid2l0aCByYzpcbiIsIHBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAkJc3dpdGNoIChyYykgewogCQljYXNlIC1FTk9NRU06IHsKLQkJCVNBWSgiRU5PTUVNXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVOT01FTVxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVOT0RFVjogewotCQkJU0FZKCJFTk9ERVZcbiIpOyBicmVhazsKKwkJCVNBTSgiRU5PREVWXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5YSU86IHsKLQkJCVNBWSgiRU5YSU9cbiIpOyBicmVhazsKKwkJCVNBTSgiRU5YSU9cbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FSU5WQUw6IHsKLQkJCVNBWSgiRUlOVkFMXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVJTlZBTFxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVBR0FJTjogewotCQkJU0FZKCJFQUdBSU5cbiIpOyBicmVhazsKKwkJCVNBTSgiRUFHQUlOXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUZCSUc6IHsKLQkJCVNBWSgiRUZCSUdcbiIpOyBicmVhazsKKwkJCVNBTSgiRUZCSUdcbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FUElQRTogewotCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQkJU0FNKCJFUElQRVxuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQkJU0FNKCJFTVNHU0laRVxuIik7ICBicmVhazsKIAkJfQogCQljYXNlIC1FTk9TUEM6IHsKLQkJCVNBWSgiRU5PU1BDXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVOT1NQQ1xuIik7IGJyZWFrOwogCQl9CiAJCWRlZmF1bHQ6IHsKLQkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CiAJCX0KIAkJfQorCQlpZiAoLUVOT0RFViAhPSByYykgXAorCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9dmlkZW9faWRsZSwgIiBcCisJCQkJCQkidXNiX3N1Ym1pdF91cmIoKSAiIFwKKwkJCQkJCSJmYWlsZWQgd2l0aCByYzpcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlKTsKIAl9CiB9CiByZXR1cm47CkBAIC0yOTc3LDggKzMzOTUsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUKICAqCiAgKgotICogIFRISVMgRlVOQ1RJT04gQVNTVU1FUyBUSEFULCBPTiBFQUNIIEFORCBFVkVSWSBPQ0NBU0lPTiBUSEFUIFRIRSBERVZJQ0UgSVMKLSAqICBQSFlTSUNBTExZIFBMVUdHRUQgSU4sIElOVEVSRkFDRSAwIElTIFBST0JFRCBGSVJTVC4KKyAqICBUSElTIEZVTkNUSU9OIEFTU1VNRVMgVEhBVCwgT04gRUFDSCBBTkQgRVZFUlkgT0NDQVNJT04gVEhBVCBUSEUgRWFzeUNBUAorICogIElTIFBIWVNJQ0FMTFkgUExVR0dFRCBJTiwgSU5URVJGQUNFIDAgSVMgUFJPQkVEIEZJUlNULgogICogIElGIFRISVMgSVMgTk9UIFRSVUUsIFRIRVJFIElTIFRIRSBQT1NTSUJJTElUWSBPRiBBTiBPb3BzLgogICoKICAqICBUSElTIEhBUyBORVZFUiBCRUVOIEEgUFJPQkxFTSBJTiBQUkFDVElDRSwgQlVUIFNPTUVUSElORyBTRUVNUyBXUk9ORyBIRVJFLgpAQCAtMjk5NCw3ICszNDEyLDcgQEAKIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3I7CiBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yICpwdXNiX2ludGVyZmFjZV9hc3NvY19kZXNjcmlwdG9yOwogc3RydWN0IHVyYiAqcHVyYjsKLXN0YXRpYyBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAgLyo9TlVMTCovOworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiBzaXplX3Qgd01heFBhY2tldFNpemU7CiBpbnQgSVNPQ3dNYXhQYWNrZXRTaXplOwpAQCAtMzAwNCwxOSArMzQyMiwzMiBAQAogX191OCBiRW5kcG9pbnRBZGRyZXNzOwogX191OCBJU09DYkVuZHBvaW50QWRkcmVzczsKIF9fdTggSU5UYkVuZHBvaW50QWRkcmVzczsKLWludCBpc2luLCBpLCBqLCBrLCBtOworaW50IGlzaW4sIGksIGosIGssIG0sIHJjOwogX191OCBiSW50ZXJmYWNlTnVtYmVyOwogX191OCBiSW50ZXJmYWNlQ2xhc3M7CiBfX3U4IGJJbnRlcmZhY2VTdWJDbGFzczsKIHZvaWQgKnBidWY7CiBpbnQgb2thbHRbOF0sIGlzb2thbHQ7Ci1pbnQgb2tlcG5bOF0sIGlzb2tlcG47Ci1pbnQgb2ttcHNbOF0sIGlzb2ttcHM7CitpbnQgb2tlcG5bOF07CitpbnQgb2ttcHNbOF07CiBpbnQgbWF4cGFja2V0c2l6ZTsKLWludCByYzsKK19fdTE2IG1hc2s7CitfX3MzMiB2YWx1ZTsKK3N0cnVjdCBlYXN5Y2FwX2Zvcm1hdCAqcGVhc3ljYXBfZm9ybWF0OwogCiBKT1QoNCwgIlxuIik7CiAKK2lmICghZG9uZ2xlX2RvbmUpIHsKKwlkb25nbGVfZG9uZSA9IDE7CisJZm9yIChrID0gMDsgayA8IERPTkdMRV9NQU5ZOyBrKyspIHsKKwkJZWFzeWNhcF9kb25nbGVba10ucGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworCQltdXRleF9pbml0KCZlYXN5Y2FwX2RvbmdsZVtrXS5tdXRleF92aWRlbyk7CisJCW11dGV4X2luaXQoJmVhc3ljYXBfZG9uZ2xlW2tdLm11dGV4X2F1ZGlvKTsKKwl9Cit9CisKK3BlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopTlVMTDsKKwogaWYgKChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKU5VTEwgPT0gcHVzYl9pbnRlcmZhY2UpIHsKIAlTQVkoIkVSUk9SOiBwdXNiX2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKQEAgLTMxMTcsNDYgKzM1NDgsODMgQEAKIC8qCiAgKiAgQSBORVcgc3RydWN0IGVhc3ljYXAgSVMgQUxXQVlTIEFMTE9DQVRFRCBXSEVOIElOVEVSRkFDRSAwIElTIFBST0JFRC4KICAqICBJVCBJUyBOT1QgUE9TU0lCTEUgSEVSRSBUTyBGUkVFIEFOWSBFWElTVElORyBzdHJ1Y3QgZWFzeWNhcC4gIFRISVMKLSAqICBTSE9VTEQgSEFWRSBCRUVOIERPTkUgQlkgZWFzeWNhcF9kZWxldGUoKSBXSEVOIFRIRSBERVZJQ0UgV0FTIFBIWVNJQ0FMTFkKLSAqICBVTlBMVUdHRUQuCi0gKi8KKyAqICBTSE9VTEQgSEFWRSBCRUVOIERPTkUgQlkgZWFzeWNhcF9kZWxldGUoKSBXSEVOIFRIRSBFYXN5Q0FQIFdBUworICogIFBIWVNJQ0FMTFkgVU5QTFVHR0VELgorICoKKyAqICBUSEUgUE9JTlRFUiBwZWFzeWNhcCBUTyBUSEUgc3RydWN0IGVhc3ljYXAgSVMgUkVNRU1CRVJFRCBXSEVOCisgKiAgSU5URVJGQUNFUyAxIEFORCAyIEFSRSBQUk9CRUQuCisgKgorICogIElGIFRXTyBFYXN5Q0FQcyBBUkUgUExVR0dFRCBJTiBORUFSTFkgU0lNVUxUQU5FT1VTTFkgVEhFUkUgV0lMTAorICogIEJFIFRST1VCTEUuICBCRVdBUkUuCisqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKDAgPT0gYkludGVyZmFjZU51bWJlcikgewogCXBlYXN5Y2FwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVhc3ljYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgcGVhc3ljYXBcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QgPSBzaXplb2Yoc3RydWN0IGVhc3ljYXApOwotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fdXJiID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0ID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fcGFnZSA9IDA7Ci0JCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYiA9IDA7CiAJfQorCVNBTSgiYWxsb2NhdGVkIDB4JTA4bFg9cGVhc3ljYXBcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCisJU0FNKCJ3aGVyZSAgICAgMHglMDhsWD0mcGVhc3ljYXAtPnZpZGVvX2RldmljZVxuIiwgXAorCQkJCSh1bnNpZ25lZCBsb25nIGludCkgJnBlYXN5Y2FwLT52aWRlb19kZXZpY2UpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorCVNBTSgiYW5kICAgICAgIDB4JTA4bFg9JnBlYXN5Y2FwLT52NGwyX2RldmljZVxuIiwgXAorCQkJCSh1bnNpZ25lZCBsb25nIGludCkgJnBlYXN5Y2FwLT52NGwyX2RldmljZSk7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBJTklUSUFMSVpFIFRIRSBORVcgZWFzeWNhcCBTVFJVQ1RVUkUuCi0gKiAgTk8gUEFSQU1FVEVSUyBBUkUgU1BFQ0lGSUVEIEhFUkUgUkVRVUlSSU5HIFRIRSBTRVRUSU5HIE9GIFJFR0lTVEVSUy4KLSAqICBUSEFUIElTIERPTkUgRklSU1QgQlkgZWFzeWNhcF9vcGVuKCkgQU5EIExBVEVSIEJZIGVhc3ljYXBfaW9jdGwoKS4KLSAqLworICogIFBFUkZPUk0gVVJHRU5UIElOVElBTElaQVRJT05TIC4uLgorKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSBwdXNiX2RldmljZTsKLQlwZWFzeWNhcC0+cHVzYl9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZTsKLQorCXN0cmNweSgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSk7CiAJa3JlZl9pbml0KCZwZWFzeWNhcC0+a3JlZik7Ci0JSk9UKDgsICJpbnRmWyVpXTogYWZ0ZXIga3JlZl9pbml0KC4uLl92aWRlbykgIiBcCisJSk9NKDgsICJpbnRmWyVpXTogYWZ0ZXIga3JlZl9pbml0KC4uLl92aWRlbykgIiBcCiAJCQkiJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIiwgXAogCQkJYkludGVyZmFjZU51bWJlciwgcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcik7CiAKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHBlYXN5Y2FwLT53cV9hdWRpbykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBlYXN5Y2FwLT53cV92aWRlbyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGVhc3ljYXAtPndxX2F1ZGlvKTsKIAotCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDApKTsKLQltdXRleF9pbml0KCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CisJZm9yIChkb25nbGVfdGhpcyA9IDA7IGRvbmdsZV90aGlzIDwgRE9OR0xFX01BTlk7IGRvbmdsZV90aGlzKyspIHsKKwkJaWYgKE5VTEwgPT0gZWFzeWNhcF9kb25nbGVbZG9uZ2xlX3RoaXNdLnBlYXN5Y2FwKSB7CisJCQlpZiAoMCA9PSBtdXRleF9pc19sb2NrZWQoJmVhc3ljYXBfZG9uZ2xlXAorCQkJCQkJW2RvbmdsZV90aGlzXS5tdXRleF92aWRlbykpIHsKKwkJCQlpZiAoMCA9PSBtdXRleF9pc19sb2NrZWQoJmVhc3ljYXBfZG9uZ2xlXAorCQkJCQkJW2RvbmdsZV90aGlzXS5tdXRleF9hdWRpbykpIHsKKwkJCQkJZWFzeWNhcF9kb25nbGVcCisJCQkJCQlbZG9uZ2xlX3RoaXNdLnBlYXN5Y2FwID0gXAorCQkJCQkJCQlwZWFzeWNhcDsKKwkJCQkJSk9NKDgsICJpbnRmWyVpXTogcGVhc3ljYXAtLT5lYXN5Y2FwIiBcCisJCQkJCQkiX2RvbmdsZVslaV0ucGVhc3ljYXBcbiIsIFwKKwkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGRvbmdsZV90aGlzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChET05HTEVfTUFOWSA8PSBkb25nbGVfdGhpcykgeworCQlTQU0oIkVSUk9SOiB0b28gbWFueSBkb25nbGVzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JZm9yIChrID0gMDsgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyBrKyspCi0JCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1trXSkpOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fcGFnZSA9IDA7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fdXJiID0gMDsKKwlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSAwOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3BhZ2UgPSAwOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3VyYiA9IDA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgLi4uIEFORCBGVVJUSEVSIElOSVRJQUxJWkUgVEhFIFNUUlVDVFVSRQorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSBwdXNiX2RldmljZTsKKwlwZWFzeWNhcC0+cHVzYl9pbnRlcmZhY2UgPSBwdXNiX2ludGVyZmFjZTsKIAogCXBlYXN5Y2FwLT5pbGsgPSAwOwogCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gZmFsc2U7CkBAIC0zMTc3LDQ2ICszNjQ1LDE3MiBAQAogCiAJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55ID0gRlJBTUVfQlVGRkVSX01BTlk7CiAKLQlpZiAoKHN0cnVjdCBtdXRleCAqKU5VTEwgPT0gJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpIHsKLQkJU0FZKCJFUlJPUjogJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1slaV0pIGlzIE5VTExcbiIsIDApOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJcGVhc3ljYXAtPmxvc3Rba10gPSAwOworCXBlYXN5Y2FwLT5za2lwID0gMDsKKwlwZWFzeWNhcC0+c2tpcHBlZCA9IDA7CisJcGVhc3ljYXAtPm9mZmVyZmllbGRzID0gMDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgRFlOQU1JQ0FMTFkgRklMTCBJTiBUSEUgQVZBSUxBQkxFIEZPUk1BVFMuCisgKiAgRFlOQU1JQ0FMTFkgRklMTCBJTiBUSEUgQVZBSUxBQkxFIEZPUk1BVFMgLi4uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlyYyA9IGZpbGxpbl9mb3JtYXRzKCk7CiAJaWYgKDAgPiByYykgewotCQlTQVkoIkVSUk9SOiBmaWxsaW5fZm9ybWF0cygpIHJldHVybmVkICVpXG4iLCByYyk7CisJCVNBTSgiRVJST1I6IGZpbGxpbl9mb3JtYXRzKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCUpPVCg0LCAiJWkgZm9ybWF0cyBhdmFpbGFibGVcbiIsIHJjKTsKLQl9IGVsc2UgeworCUpPTSg0LCAiJWkgZm9ybWF0cyBhdmFpbGFibGVcbiIsIHJjKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKLQkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTEwgIiBcCi0JCQkJCSJ3aGVuIHByb2JpbmcgaW50ZXJmYWNlICVpXG4iLCBcCi0JCQkJCQkJYkludGVyZmFjZU51bWJlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKKy8qCisgKiAgLi4uIEFORCBQT1BVTEFURSBlYXN5Y2FwLmlucHV0c2V0W10KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uaW5wdXRfb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc3RhbmRhcmRfb2Zmc2V0X29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmZvcm1hdF9vZmZzZXRfb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uYnJpZ2h0bmVzc19vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5jb250cmFzdF9vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zYXR1cmF0aW9uX29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmh1ZV9vayA9IDA7CisJfQorCWlmICh0cnVlID09IHBlYXN5Y2FwLT5udHNjKSB7CisJCWkgPSAwOworCQltID0gMDsKKwkJbWFzayA9IDA7CisJCXdoaWxlICgweEZGRkYgIT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrKSB7CisJCQlpZiAoTlRTQ19NID09IGVhc3ljYXBfc3RhbmRhcmRbaV0uXAorCQkJCQkJCXY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQltKys7CisJCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uXAorCQkJCQkJCXN0YW5kYXJkX29mZnNldCA9IGk7CisJCQkJfQorCQkJbWFzayA9IGVhc3ljYXBfc3RhbmRhcmRbaV0ubWFzazsKKwkJCX0KKwkJCWkrKzsKIAkJfQorCX0gZWxzZSB7CisJCWkgPSAwOworCQltID0gMDsKKwkJbWFzayA9IDA7CisJCXdoaWxlICgweEZGRkYgIT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrKSB7CisJCQlpZiAoUEFMX0JHSElOID09IGVhc3ljYXBfc3RhbmRhcmRbaV0uXAorCQkJCQkJCXY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQltKys7CisJCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uXAorCQkJCQkJCXN0YW5kYXJkX29mZnNldCA9IGk7CisJCQkJfQorCQkJbWFzayA9IGVhc3ljYXBfc3RhbmRhcmRbaV0ubWFzazsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCX0KIAotCUpPVCg4LCAia3JlZl9nZXQoKSB3aXRoICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKLQkJCQkJKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKLQlrcmVmX2dldCgmcGVhc3ljYXAtPmtyZWYpOworCWlmICgxICE9IG0pIHsKKwkJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0W10uc3RhbmRhcmRfb2Zmc2V0ICIgXAorCQkJCQkJInVucG9wdWxhdGVkLCAlaT1tXG4iLCBtKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcGVhc3ljYXBfZm9ybWF0ID0gJmVhc3ljYXBfZm9ybWF0WzBdOworCWkgPSAwOworCW0gPSAwOworCXdoaWxlICgwICE9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgeworCQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDBGKSA9PSAobWFzayAmIDB4MEYpKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmZpZWxkID09IFwKKwkJCQkJCQlWNEwyX0ZJRUxEX05PTkUpICYmIFwKKwkJCQkocGVhc3ljYXBfZm9ybWF0LT5cCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gXAorCQkJCQkJCVY0TDJfUElYX0ZNVF9VWVZZKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoICA9PSBcCisJCQkJCQkJNjQwKSAmJiBcCisJCQkJKHBlYXN5Y2FwX2Zvcm1hdC0+XAorCQkJCQl2NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCA9PSA0ODApKSB7CisJCQltKys7CisJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5mb3JtYXRfb2Zmc2V0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJcGVhc3ljYXBfZm9ybWF0Kys7CisJaSsrOworCX0KKwlpZiAoMSAhPSBtKSB7CisJCVNBTSgiTUlTVEFLRTogZWFzeWNhcC5pbnB1dHNldFtdLmZvcm1hdF9vZmZzZXQgdW5wb3B1bGF0ZWRcbiIpOworCXJldHVybiAtRU5PRU5UOworCX0KKworCWkgPSAwOworCW0gPSAwOworCXdoaWxlICgweEZGRkZGRkZGICE9IGVhc3ljYXBfY29udHJvbFtpXS5pZCkgeworCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpXS5kZWZhdWx0X3ZhbHVlOworCQlpZiAoVjRMMl9DSURfQlJJR0hUTkVTUyA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmJyaWdodG5lc3MgPSB2YWx1ZTsKKwkJfSBlbHNlIGlmIChWNEwyX0NJRF9DT05UUkFTVCA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmNvbnRyYXN0ID0gdmFsdWU7CisJCX0gZWxzZSBpZiAoVjRMMl9DSURfU0FUVVJBVElPTiA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLnNhdHVyYXRpb24gPSB2YWx1ZTsKKwkJfSBlbHNlIGlmIChWNEwyX0NJRF9IVUUgPT0gZWFzeWNhcF9jb250cm9sW2ldLmlkKSB7CisJCQltKys7CisJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5odWUgPSB2YWx1ZTsKKwkJfQorCQlpKys7CisJfQorCWlmICg0ICE9IG0pIHsKKwkJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0W10uYnJpZ2h0bmVzcywuLi4gIiBcCisJCQkJCQkidW5kZXJwb3B1bGF0ZWRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmlucHV0ID0gazsKKwlKT00oNCwgInBvcHVsYXRlZCBlYXN5Y2FwLmlucHV0c2V0W11cbiIpOworCUpPTSg0LCAiZmluaXNoZWQgaW5pdGlhbGl6YXRpb25cbiIpOworfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKgorCSAqICBGT1IgSU5URVJGQUNFUyAxIEFORCAyIFRIRSBQT0lOVEVSIHBlYXN5Y2FwIElTIE9CVEFJTkVEIEJZIEFTU1VNSU5HCisJICogIFRIQVQgZG9uZ2xlX3RoaXMgSEFTIE5PVCBDSEFOR0VEIFNJTkNFIElOVEVSRkFDRSAwIFdBUyBQUk9CRUQuICBJRgorCSAqICBUSElTIElTIE5PVCBUSEUgQ0FTRSwgRk9SIEVYQU1QTEUgV0hFTiBUV08gRUFTWUNBUHMgQVJFIFBMVUdHRUQgSU4KKwkgKiAgU0lNVUxUQU5FT1VTTFksIFRIRVJFIFdJTEwgQkUgU0VSSU9VUyBUUk9VQkxFLgorCSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKCgwID4gZG9uZ2xlX3RoaXMpIHx8IChET05HTEVfTUFOWSA8PSBkb25nbGVfdGhpcykpIHsKKwkJU0FZKCJFUlJPUjogYmFkIGRvbmdsZSBjb3VudFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlwZWFzeWNhcCA9IGVhc3ljYXBfZG9uZ2xlW2RvbmdsZV90aGlzXS5wZWFzeWNhcDsKKwlKT1QoOCwgImludGZbJWldOiBlYXN5Y2FwX2RvbmdsZVslaV0ucGVhc3ljYXAtLT5wZWFzeWNhcFxuIiwgXAorCQkJCQkJYkludGVyZmFjZU51bWJlciwgZG9uZ2xlX3RoaXMpOworCisJaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKKwkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTCB3aGVuIHByb2JpbmcgaW50ZXJmYWNlICVpXG4iLCBcCisJCQkJCQkJYkludGVyZmFjZU51bWJlcik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICgoVVNCX0NMQVNTX1ZJREVPID09IGJJbnRlcmZhY2VDbGFzcykgfHwgXAotCShVU0JfQ0xBU1NfVkVORE9SX1NQRUMgPT0gYkludGVyZmFjZUNsYXNzKSkgeworCQkoVVNCX0NMQVNTX1ZFTkRPUl9TUEVDID09IGJJbnRlcmZhY2VDbGFzcykpIHsKIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSkgewogCQlwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlID0gYkludGVyZmFjZU51bWJlcjsKLQkJSk9UKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2U9JWlcbiIsIFwKKwkJSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2U9JWlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpOwogCX0gZWxzZSB7CiAJCWlmIChwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlICE9IGJJbnRlcmZhY2VOdW1iZXIpIHsKLQkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCisJCQlTQU0oIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlc2V0ICIgXAogCQkJCQkicGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZVxuIik7Ci0JCQlTQVkoIi4uLi4uLiBjb250aW51aW5nIHdpdGggIiBcCisJCQlTQU0oIi4uLi4uLiBjb250aW51aW5nIHdpdGggIiBcCiAJCQkJCSIlaT1wZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpOwogCQl9CkBAIC0zMjI1LDEzICszODE5LDEzIEBACiAJCQkJCQkoMHgwMiA9PSBiSW50ZXJmYWNlU3ViQ2xhc3MpKSB7CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UpIHsKIAkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSA9IGJJbnRlcmZhY2VOdW1iZXI7Ci0JCUpPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlPSVpXG4iLCBcCisJCUpPTSg0LCAic2V0dGluZyBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlPSVpXG4iLCBcCiAJCQkJCQkgcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSk7CiAJfSBlbHNlIHsKIAkJaWYgKHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UgIT0gYkludGVyZmFjZU51bWJlcikgewotCQkJU0FZKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZXNldCAiIFwKKwkJCVNBTSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCiAJCQkJCSJwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlXG4iKTsKLQkJCVNBWSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCVNBTSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKIAkJCQkJIiVpPXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2VcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSk7CiAJCX0KQEAgLTMyNDQsMzcgKzM4MzgsMzUgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaXNva2FsdCA9IDA7Ci1pc29rZXBuID0gMDsKLWlzb2ttcHMgPSAwOwogCiBmb3IgKGkgPSAwOyBpIDwgcHVzYl9pbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKIAlwdXNiX2hvc3RfaW50ZXJmYWNlID0gJihwdXNiX2ludGVyZmFjZS0+YWx0c2V0dGluZ1tpXSk7CiAJaWYgKChzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICopTlVMTCA9PSBwdXNiX2hvc3RfaW50ZXJmYWNlKSB7Ci0JCVNBWSgiRVJST1I6IHB1c2JfaG9zdF9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHB1c2JfaG9zdF9pbnRlcmZhY2UgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yID0gJihwdXNiX2hvc3RfaW50ZXJmYWNlLT5kZXNjKTsKIAlpZiAoKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKilOVUxMID09IFwKIAkJCQkJCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpIHsKLQkJU0FZKCJFUlJPUjogcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkRlc2NyaXB0b3JUeXBlPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJEZXNjcmlwdG9yVHlwZT0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iRGVzY3JpcHRvclR5cGUpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VOdW1iZXI9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZU51bWJlcj0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iQWx0ZXJuYXRlU2V0dGluZz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iQWx0ZXJuYXRlU2V0dGluZz0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iQWx0ZXJuYXRlU2V0dGluZyk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYk51bUVuZHBvaW50cz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iTnVtRW5kcG9pbnRzPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJOdW1FbmRwb2ludHMpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VDbGFzcz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlQ2xhc3M9MHglMDJYXG4iLCBcCiAJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZUNsYXNzKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3M9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZVN1YkNsYXNzPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VTdWJDbGFzcyk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZVByb3RvY29sPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VQcm90b2NvbD0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlUHJvdG9jb2wpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmlJbnRlcmZhY2U9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuaUludGVyZmFjZT0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5pSW50ZXJmYWNlKTsKIAogCUlTT0N3TWF4UGFja2V0U2l6ZSA9IC0xOwpAQCAtMzI4NSw4NiArMzg3Nyw4MCBAQAogCUlOVGJFbmRwb2ludEFkZHJlc3MgPSAwOwogCiAJaWYgKDAgPT0gcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+Yk51bUVuZHBvaW50cykKLQkJCQlKT1QoNCwgImludGZbJWldYWx0WyVpXSBoYXMgbm8gZW5kcG9pbnRzXG4iLCBcCisJCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV0gaGFzIG5vIGVuZHBvaW50c1xuIiwgXAogCQkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGkpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCWZvciAoaiA9IDA7IGogPCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iTnVtRW5kcG9pbnRzOyBqKyspIHsKIAkJcGVwZCA9ICYocHVzYl9ob3N0X2ludGVyZmFjZS0+ZW5kcG9pbnRbal0uZGVzYyk7CiAJCWlmICgoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopTlVMTCA9PSBwZXBkKSB7Ci0JCQlTQVkoIkVSUk9SOiAgcGVwZCBpcyBOVUxMLlxuIik7Ci0JCQlTQVkoIi4uLi4uLiBza2lwcGluZ1xuIik7CisJCQlTQU0oIkVSUk9SOiAgcGVwZCBpcyBOVUxMLlxuIik7CisJCQlTQU0oIi4uLi4uLiBza2lwcGluZ1xuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQl3TWF4UGFja2V0U2l6ZSA9IGxlMTZfdG9fY3B1KHBlcGQtPndNYXhQYWNrZXRTaXplKTsKIAkJYkVuZHBvaW50QWRkcmVzcyA9IHBlcGQtPmJFbmRwb2ludEFkZHJlc3M7CiAKLQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiRW5kcG9pbnRBZGRyZXNzPTB4JVhcbiIsIFwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiRW5kcG9pbnRBZGRyZXNzPTB4JVhcbiIsIFwKIAkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCiAJCQkJcGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogYm1BdHRyaWJ1dGVzPTB4JVhcbiIsIFwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBibUF0dHJpYnV0ZXM9MHglWFxuIiwgXAogCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKIAkJCQlwZXBkLT5ibUF0dHJpYnV0ZXMpOwotCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IHdNYXhQYWNrZXRTaXplPSVpXG4iLCBcCisJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogd01heFBhY2tldFNpemU9JWlcbiIsIFwKIAkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCiAJCQkJcGVwZC0+d01heFBhY2tldFNpemUpOwotCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJJbnRlcnZhbD0laVxuIiwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBiSW50ZXJ2YWw9JWlcbiIsCiAJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaiwgXAogCQkJCXBlcGQtPmJJbnRlcnZhbCk7CiAKIAkJaWYgKHBlcGQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIElOICBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIElOICBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJCWlzaW4gPSAxOwogCQl9IGVsc2UgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBPVVQgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBPVVQgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7Ci0JCQlTQVkoIkVSUk9SOiBPVVQgZW5kcG9pbnQgdW5leHBlY3RlZFxuIik7Ci0JCQlTQVkoIi4uLi4uLiBjb250aW51aW5nXG4iKTsKKwkJCVNBTSgiRVJST1I6IE9VVCBlbmRwb2ludCB1bmV4cGVjdGVkXG4iKTsKKwkJCVNBTSgiLi4uLi4uIGNvbnRpbnVpbmdcbiIpOwogCQkJaXNpbiA9IDA7CiAJCX0KIAkJaWYgKChwZXBkLT5ibUF0dHJpYnV0ZXMgJiBcCiAJCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFwKIAkJCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gSVNPQyBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gSVNPQyBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJCWlmIChpc2luKSB7CiAJCQkJc3dpdGNoIChiSW50ZXJmYWNlQ2xhc3MpIHsKIAkJCQljYXNlIFVTQl9DTEFTU19WSURFTzoKIAkJCQljYXNlIFVTQl9DTEFTU19WRU5ET1JfU1BFQzogewogCQkJCQlpZiAoIXBlYXN5Y2FwKSB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCQkicGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQogCQkJCQlpZiAocGVwZC0+d01heFBhY2tldFNpemUpIHsKIAkJCQkJCWlmICg4ID4gaXNva2FsdCkgewogCQkJCQkJCW9rYWx0W2lzb2thbHRdID0gaTsKLQkJCQkJCQlKT1QoNCxcCisJCQkJCQkJSk9NKDQsXAogCQkJCQkJCSIlaT1va2FsdFslaV1cbiIsIFwKIAkJCQkJCQlva2FsdFtpc29rYWx0XSwgXAogCQkJCQkJCWlzb2thbHQpOwotCQkJCQkJCWlzb2thbHQrKzsKLQkJCQkJCX0KLQkJCQkJCWlmICg4ID4gaXNva2VwbikgewotCQkJCQkJCW9rZXBuW2lzb2tlcG5dID0gXAorCQkJCQkJCW9rZXBuW2lzb2thbHRdID0gXAogCQkJCQkJCXBlcGQtPlwKIAkJCQkJCQliRW5kcG9pbnRBZGRyZXNzICYgXAogCQkJCQkJCTB4MEY7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2tlcG5bJWldXG4iLCBcCi0JCQkJCQkJb2tlcG5baXNva2Vwbl0sIFwKLQkJCQkJCQlpc29rZXBuKTsKLQkJCQkJCQlpc29rZXBuKys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoOCA+IGlzb2ttcHMpIHsKLQkJCQkJCQlva21wc1tpc29rbXBzXSA9IFwKKwkJCQkJCQlva2Vwbltpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCW9rbXBzW2lzb2thbHRdID0gXAogCQkJCQkJCWxlMTZfdG9fY3B1KHBlcGQtPlwKIAkJCQkJCQl3TWF4UGFja2V0U2l6ZSk7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2ttcHNbJWldXG4iLCBcCi0JCQkJCQkJb2ttcHNbaXNva21wc10sIFwKLQkJCQkJCQlpc29rbXBzKTsKLQkJCQkJCQlpc29rbXBzKys7CisJCQkJCQkJb2ttcHNbaXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlpc29rYWx0Kys7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoLTEgPT0gcGVhc3ljYXAtPlwKQEAgLTMzNzIsMTYgKzM5NTgsMTYgQEAKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCXZpZGVvX2FsdHNldHRpbmdfb2ZmID1cCiAJCQkJCQkJCQkgaTsKLQkJCQkJCQlKT1QoNCwgIiVpPXZpZGVvXyIgXAorCQkJCQkJCUpPTSg0LCAiJWk9dmlkZW9fIiBcCiAJCQkJCQkJImFsdHNldHRpbmdfb2ZmICIgXAogCQkJCQkJCQkiPD09PT1cbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCXZpZGVvX2FsdHNldHRpbmdfb2ZmKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU0FZKCJFUlJPUjogcGVhc3ljYXAiIFwKKwkJCQkJCQlTQU0oIkVSUk9SOiBwZWFzeWNhcCIgXAogCQkJCQkJCSItPnZpZGVvX2FsdHNldHRpbmdfIiBcCiAJCQkJCQkJIm9mZiBhbHJlYWR5IHNldFxuIik7Ci0JCQkJCQkJU0FZKCIuLi4uLi4gIiBcCisJCQkJCQkJU0FNKCIuLi4uLi4gIiBcCiAJCQkJCQkJImNvbnRpbnVpbmcgd2l0aCAiIFwKIAkJCQkJCQkiJWk9cGVhc3ljYXAtPnZpZGVvXyIgXAogCQkJCQkJCSJhbHRzZXR0aW5nX29mZlxuIiwgXApAQCAtMzM5NSwzOSArMzk4MSwzMyBAQAogCQkJCQlpZiAoMHgwMiAhPSBiSW50ZXJmYWNlU3ViQ2xhc3MpCiAJCQkJCQlicmVhazsKIAkJCQkJaWYgKCFwZWFzeWNhcCkgewotCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCVNBTSgiTUlTVEFLRTogIiBcCiAJCQkJCQkicGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQogCQkJCQlpZiAocGVwZC0+d01heFBhY2tldFNpemUpIHsKIAkJCQkJCWlmICg4ID4gaXNva2FsdCkgewogCQkJCQkJCW9rYWx0W2lzb2thbHRdID0gaSA7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2thbHRbJWldXG4iLCBcCiAJCQkJCQkJb2thbHRbaXNva2FsdF0sIFwKIAkJCQkJCQlpc29rYWx0KTsKLQkJCQkJCQlpc29rYWx0Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoOCA+IGlzb2tlcG4pIHsKLQkJCQkJCQlva2Vwbltpc29rZXBuXSA9IFwKKwkJCQkJCQlva2Vwbltpc29rYWx0XSA9IFwKIAkJCQkJCQlwZXBkLT5cCiAJCQkJCQkJYkVuZHBvaW50QWRkcmVzcyAmIFwKIAkJCQkJCQkweDBGOwotCQkJCQkJCUpPVCg0LFwKKwkJCQkJCQlKT00oNCxcCiAJCQkJCQkJIiVpPW9rZXBuWyVpXVxuIiwgXAotCQkJCQkJCW9rZXBuW2lzb2tlcG5dLCBcCi0JCQkJCQkJaXNva2Vwbik7Ci0JCQkJCQkJaXNva2VwbisrOwotCQkJCQkJfQotCQkJCQkJaWYgKDggPiBpc29rbXBzKSB7Ci0JCQkJCQkJb2ttcHNbaXNva21wc10gPSBcCisJCQkJCQkJb2tlcG5baXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlva21wc1tpc29rYWx0XSA9IFwKIAkJCQkJCQlsZTE2X3RvX2NwdShwZXBkLT5cCiAJCQkJCQkJd01heFBhY2tldFNpemUpOwotCQkJCQkJCUpPVCg0LFwKKwkJCQkJCQlKT00oNCxcCiAJCQkJCQkJIiVpPW9rbXBzWyVpXVxuIixcCi0JCQkJCQkJb2ttcHNbaXNva21wc10sIFwKLQkJCQkJCQlpc29rbXBzKTsKLQkJCQkJCQlpc29rbXBzKys7CisJCQkJCQkJb2ttcHNbaXNva2FsdF0sIFwKKwkJCQkJCQlpc29rYWx0KTsKKwkJCQkJCQlpc29rYWx0Kys7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlpZiAoLTEgPT0gcGVhc3ljYXAtPlwKQEAgLTM0MzUsMTYgKzQwMTUsMTYgQEAKIAkJCQkJCQlwZWFzeWNhcC0+XAogCQkJCQkJCWF1ZGlvX2FsdHNldHRpbmdfb2ZmID1cCiAJCQkJCQkJCQkgaTsKLQkJCQkJCQlKT1QoNCwgIiVpPWF1ZGlvXyIgXAorCQkJCQkJCUpPTSg0LCAiJWk9YXVkaW9fIiBcCiAJCQkJCQkJImFsdHNldHRpbmdfb2ZmICIgXAogCQkJCQkJCSI8PT09PVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ19vZmYpOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCIgXAorCQkJCQkJCVNBTSgiRVJST1I6IHBlYXN5Y2FwIiBcCiAJCQkJCQkJIi0+YXVkaW9fYWx0c2V0dGluZ18iIFwKIAkJCQkJCQkib2ZmIGFscmVhZHkgc2V0XG4iKTsKLQkJCQkJCQlTQVkoIi4uLi4uLiAiIFwKKwkJCQkJCQlTQU0oIi4uLi4uLiAiIFwKIAkJCQkJCQkiY29udGludWluZyB3aXRoICIgXAogCQkJCQkJCSIlaT1wZWFzeWNhcC0+XAogCQkJCQkJCWF1ZGlvX2FsdHNldHRpbmdfIiBcCkBAIC0zNDYyLDE5ICs0MDQyLDE5IEBACiAJCX0gZWxzZSBpZiAoKHBlcGQtPmJtQXR0cmlidXRlcyAmIFwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PVwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEspIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhICBCVUxLIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhICBCVUxLIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQl9IGVsc2UgaWYgKChwZXBkLT5ibUF0dHJpYnV0ZXMgJiBcCiAJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT1cCiAJCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU5UIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU5UIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQl9IGVsc2UgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIENUUkwgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIENUUkwgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0KIAkJaWYgKDAgPT0gcGVwZC0+d01heFBhY2tldFNpemUpIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSAiIFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSAiIFwKIAkJCQkJCSJoYXMgemVybyBwYWNrZXQgc2l6ZVxuIiwgXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0KQEAgLTM0ODUsNyArNDA2NSw3IEBACiAgKiAgUEVSRk9STSBJTklUSUFMSVpBVElPTiBPRiBUSEUgUFJPQkVEIElOVEVSRkFDRQogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImluaXRpYWxpemF0aW9uIGJlZ2lucyBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCitKT00oNCwgImluaXRpYWxpemF0aW9uIGJlZ2lucyBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCiAJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcik7CiBzd2l0Y2ggKGJJbnRlcmZhY2VOdW1iZXIpIHsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM0OTUsODkgKzQwNzUsNzggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgMDogewogCWlmICghcGVhc3ljYXApIHsKLQkJU0FZKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICghaXNva2FsdCkgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2FsdHNldHRpbmdfb25cbiIpOworCQlTQU0oIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2FsdHNldHRpbmdfb25cbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9IGVsc2UgewogCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbiA9IG9rYWx0W2lzb2thbHQgLSAxXTsKLQkJSk9UKDQsICIlaT12aWRlb19hbHRzZXR0aW5nX29uIDw9PT09XG4iLCBcCisJCUpPTSg0LCAiJWk9dmlkZW9fYWx0c2V0dGluZ19vbiA8PT09PVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbik7CiAJfQotCWlmICghaXNva2VwbikgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX2VuZHBvaW50bnVtYmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfSBlbHNlIHsKLQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyID0gb2tlcG5baXNva2VwbiAtIDFdOwotCQlKT1QoNCwgIiVpPXZpZGVvX2VuZHBvaW50bnVtYmVyXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlcik7Ci0JCX0KLQlpZiAoIWlzb2ttcHMpIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSB2aWRlb19tYXhwYWNrZXRzaXplXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIERFQ0lERSBUSEUgVklERU8gU1RSRUFNSU5HIFBBUkFNRVRFUlMKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlciA9IG9rZXBuW2lzb2thbHQgLSAxXTsKKwlKT00oNCwgIiVpPXZpZGVvX2VuZHBvaW50bnVtYmVyXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpOworCW1heHBhY2tldHNpemUgPSBva21wc1tpc29rYWx0IC0gMV07CisJaWYgKFVTQl8yXzBfTUFYUEFDS0VUU0laRSA+IG1heHBhY2tldHNpemUpIHsKKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gbWF4cGFja2V0c2l6ZTsKIAl9IGVsc2UgewotCQltYXhwYWNrZXRzaXplID0gb2ttcHNbaXNva21wcyAtIDFdIC0gMTAyNDsKLQkJaWYgKFVTQl8yXzBfTUFYUEFDS0VUU0laRSA+IG1heHBhY2tldHNpemUpIHsKLQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSA9IG1heHBhY2tldHNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgPSBcCi0JCQkJCQkJVVNCXzJfMF9NQVhQQUNLRVRTSVpFOwotCQl9Ci0JCUpPVCg0LCAiJWk9dmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJaWYgKDAgPj0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlTQVkoIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iKTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9Ci0JCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MgPSBWSURFT19JU09DX0ZSQU1FU1BFUkRFU0M7Ci0JCUpPVCg0LCAiJWk9dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKSB7Ci0JCQlTQVkoIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSA9IFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplICogXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjOwotCQlKT1QoNCwgIiVpPXZpZGVvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpOwotCQlpZiAoKFBBR0VfU0laRSA8PCBWSURFT19JU09DX09SREVSKSA8IFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpIHsKLQkJCVNBWSgiTUlTVEFLRTogIiBcCi0JCQkJInBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplIHRvbyBiaWdcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KKwkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gXAorCQkJCQkJVVNCXzJfMF9NQVhQQUNLRVRTSVpFOworCX0KKwlKT00oNCwgIiVpPXZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJU0FNKCJFUlJPUjogIGJhZCB2aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIik7CisJCVNBTSgiICAgICAgICBwb3NzaWJseSBiZWNhdXNlIHBvcnQgaXMgVVNCIDEuMVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjID0gVklERU9fSVNPQ19GUkFNRVNQRVJERVNDOworCUpPTSg0LCAiJWk9dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7CisJaWYgKDAgPj0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYykgeworCQlTQU0oIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSA9IFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgKiBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwlKT00oNCwgIiVpPXZpZGVvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CisJaWYgKChQQUdFX1NJWkUgPDwgVklERU9fSVNPQ19PUkRFUikgPCBcCisJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpIHsKKwkJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSB0b28gYmlnXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb24pIHsKLQkJU0FZKCJNSVNUQUtFOiAgdmlkZW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2FsdHNldHRpbmdfb24gaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29mZikgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faW50ZXJmYWNlX29mZiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2VuZHBvaW50bnVtYmVyIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pc29jX21heGZyYW1lc2l6ZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faXNvY19idWZmZXJfc2l6ZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM1ODgsMjAgKzQxNTcsMjAgQEAKIAlJTklUX0xJU1RfSEVBRCgmKHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCkpOwogCXBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgPSAmKHBlYXN5Y2FwLT51cmJfdmlkZW9faGVhZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGZyYW1lIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGZyYW1lIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCiAJCQlGUkFNRV9CVUZGRVJfTUFOWSwgKGxvbmcgaW50KUZSQU1FX0JVRkZFUl9TSVpFKTsKLQlKT1QoNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKKwlKT00oNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKIAkJCQkJCUZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJCWZvciAobSA9IDA7ICBtIDwgRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyAgbSsrKSB7CiAJCQlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvKQotCQkJCVNBWSgiYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlIGZyYW1lICIgXAorCQkJCVNBTSgiYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlIGZyYW1lICIgXAogCQkJCQkJCQkiIGJ1ZmZlcnNcbiIpOwogCQkJZWxzZSB7CiAJCQkJcGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQkJCWlmICgodm9pZCAqKU5VTEwgPT0gcGJ1ZikgewotCQkJCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUgIlwKKwkJCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lICJcCiAJCQkJCQkiYnVmZmVyICVpIHBhZ2UgJWlcbiIsIGssIG0pOwogCQkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCQl9IGVsc2UKQEAgLTM2MTUsMjMgKzQxODQsMjMgQEAKIAogCXBlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKIAlwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IDA7Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGZyYW1lIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBmcmFtZSBidWZmZXJzIGRvbmU6ICAlaSBwYWdlc1xuIiwgayAqIFwKIAkJCQkJCQkJbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGZpZWxkIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGZpZWxkIGJ1ZmZlcnMgb2Ygc2l6ZSAlbGlcbiIsICBcCiAJCQlGSUVMRF9CVUZGRVJfTUFOWSwgKGxvbmcgaW50KUZJRUxEX0JVRkZFUl9TSVpFKTsKLQlKT1QoNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKKwlKT00oNCwgIi4uLi4gZWFjaCBzY2F0dGVyZWQgb3ZlciAlbGkgcGFnZXNcbiIsIFwKIAkJCQkJRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFKTsKIAogCWZvciAoayA9IDA7ICBrIDwgRklFTERfQlVGRkVSX01BTlk7ICBrKyspIHsKIAkJZm9yIChtID0gMDsgIG0gPCBGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKIAkJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltrXVttXS5wZ28pIHsKLQkJCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgIiBcCisJCQkJU0FNKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZWFsbG9jYXRlICIgXAogCQkJCQkJCSJmaWVsZCBidWZmZXJzXG4iKTsKIAkJCX0gZWxzZSB7CiAJCQkJcGJ1ZiA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAkJCQlpZiAoKHZvaWQgKilOVUxMID09IHBidWYpIHsKLQkJCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZpZWxkIiBcCisJCQkJCVNBTSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBmaWVsZCIgXAogCQkJCQkJIiBidWZmZXIgJWkgcGFnZSAlaVxuIiwgaywgbSk7CiAJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCQl9CkBAIC0zNjQ3LDE4ICs0MjE2LDE4IEBACiAJcGVhc3ljYXAtPmZpZWxkX2ZpbGwgPSAwOwogCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKIAlwZWFzeWNhcC0+ZmllbGRfcmVhZCA9IDA7Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGZpZWxkIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBmaWVsZCBidWZmZXJzIGRvbmU6ICAlaSBwYWdlc1xuIiwgayAqIFwKIAkJCQkJCQkJbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgdmlkZW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAorCUpPTSg0LCAiYWxsb2NhdGluZyAlaSBpc29jIHZpZGVvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKIAkJCQkJVklERU9fSVNPQ19CVUZGRVJfTUFOWSwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JSk9UKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKKwlKT00oNCwgIi4uLi4gZWFjaCBvY2N1cHlpbmcgY29udGlndW91cyBtZW1vcnkgcGFnZXNcbiIpOwogCiAJZm9yIChrID0gMDsgIGsgPCBWSURFT19JU09DX0JVRkZFUl9NQU5ZOyBrKyspIHsKIAkJcGJ1ZiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBWSURFT19JU09DX09SREVSKTsKIAkJaWYgKE5VTEwgPT0gcGJ1ZikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGlzb2MgdmlkZW8gYnVmZmVyICIgXAorCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGlzb2MgdmlkZW8gYnVmZmVyICIgXAogCQkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtMzY3MCwyNiArNDIzOSwyNiBAQAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZTsKIAkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyW2tdLmtvdW50ID0gazsKIAl9Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgdmlkZW8gYnVmZmVycyBkb25lOiAlaSBwYWdlc1xuIiwgXAorCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIHZpZGVvIGJ1ZmZlcnMgZG9uZTogJWkgcGFnZXNcbiIsIFwKIAkJCQkJayAqICgweDAxIDw8IFZJREVPX0lTT0NfT1JERVIpKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgQUxMT0NBVEUgQU5EIElOSVRJQUxJWkUgTVVMVElQTEUgc3RydWN0IHVyYiAuLi4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCUpPVCg0LCAiYWxsb2NhdGluZyAlaSBzdHJ1Y3QgdXJiLlxuIiwgVklERU9fSVNPQ19CVUZGRVJfTUFOWSk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIHN0cnVjdCB1cmIuXG4iLCBWSURFT19JU09DX0JVRkZFUl9NQU5ZKTsKKwlKT00oNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwlKT00oNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOwotCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemVuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemVuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7IGsrKykgewogCQlwdXJiID0gdXNiX2FsbG9jX3VyYihwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjLCBcCiAJCQkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoTlVMTCA9PSBwdXJiKSB7Ci0JCQlTQVkoIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKKwkJCVNBTSgiRVJST1I6IHVzYl9hbGxvY191cmIgcmV0dXJuZWQgTlVMTCBmb3IgYnVmZmVyICIgXAogCQkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtMzY5Nyw3ICs0MjY2LDcgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJcGRhdGFfdXJiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhdGFfdXJiKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOworCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQogCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fc3RydWN0ICs9IFwKQEAgLTM3MTQsMzAgKzQyODMsMzAgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCQlpZiAoIWspIHsKLQkJCUpPVCg0LCAiaW5pdGlhbGl6aW5nIHZpZGVvIHVyYnMgdGh1czpcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUiIFwKKwkJCUpPTSg0LCAiaW5pdGlhbGl6aW5nIHZpZGVvIHVyYnMgdGh1czpcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUiIFwKIAkJCQkJIihwZWFzeWNhcC0+cHVzYl9kZXZpY2UsJWkpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpOwotCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGVhc3ljYXAtPiIgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGVhc3ljYXAtPiIgXAogCQkJCQkidmlkZW9faXNvY19idWZmZXJbLl0ucGdvO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeWNhcF9jb21wbGV0ZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5Y2FwX2NvbXBsZXRlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCisJCQlKT00oNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQkJSk9UKDQsICIgICAge1xuIik7Ci0JCQlKT1QoNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqKiVpO1xuIixcCisJCQlKT00oNCwgIiAgICB7XG4iKTsKKwkJCUpPTSg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJCUpPTSg0LCAiICAgIH1cbiIpOwogCQl9CiAKIAkJcHVyYi0+aW50ZXJ2YWwgPSAxOwpAQCAtMzc1OSwxMyArNDMyOCwzMyBAQAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemU7CiAJCX0KIAl9Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mICVpIHN0cnVjdCB1cmIgZG9uZS5cbiIsIGspOworCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiAlaSBzdHJ1Y3QgdXJiIGRvbmUuXG4iLCBrKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gVEhJUyBJTlRFUkZBQ0UuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIHBlYXN5Y2FwKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSVQgSVMgRVNTRU5USUFMIFRPIElOSVRJQUxJWkUgVEhFIEhBUkRXQVJFIEJFRk9SRSwgUkFUSEVSIFRIQU4gQUZURVIsCisgKiAgVEhFIERFVklDRSBJUyBSRUdJU1RFUkVELCBCRUNBVVNFIFNPTUUgVkVSU0lPTlMgT0YgVEhFIHZpZGVvZGV2IE1PRFVMRQorICogIENBTEwgZWFzeWNhcF9vcGVuKCkgSU1NRURJQVRFTFkgQUZURVIgUkVHSVNUUkFUSU9OLCBDQVVTSU5HIEEgQ0xBU0guCisgKiAgQkVXQVJFLgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFBSRUZFUl9OVFNDKQorCXBlYXN5Y2FwLT5udHNjID0gdHJ1ZTsKKwlKT00oOCwgImRlZmF1bHRpbmcgaW5pdGlhbGx5IHRvIE5UU0NcbiIpOworI2Vsc2UKKwlwZWFzeWNhcC0+bnRzYyA9IGZhbHNlOworCUpPTSg4LCAiZGVmYXVsdGluZyBpbml0aWFsbHkgdG8gUEFMXG4iKTsKKyNlbmRpZiAvKlBSRUZFUl9OVFNDKi8KKwlyYyA9IHJlc2V0KHBlYXN5Y2FwKTsKKwlpZiAoMCAhPSByYykgeworCQlTQU0oIkVSUk9SOiByZXNldCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBUSEUgVklERU8gREVWSUNFIENBTiBCRSBSRUdJU1RFUkVEIE5PVywgQVMgSVQgSVMgUkVBRFkuCkBAIC0zNzc2LDQ4ICs0MzY1LDU4IEBACiAJCWVycigiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlIik7CiAJCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIE5VTEwpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pKys7Ci0JU0FZKCJlYXN5Y2FwIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKLQlicmVhazsKLS8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwotI2Vsc2UKLQlwdmlkZW9fZGV2aWNlID0gKHN0cnVjdCB2aWRlb19kZXZpY2UgKilcCi0JCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlkZW9fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopTlVMTCA9PSBwdmlkZW9fZGV2aWNlKSB7Ci0JCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBzdHJ1Y3R1cmUgdmlkZW9fZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCVNBTSgiZWFzeWNhcCBhdHRhY2hlZCB0byBtaW5vciAjJWRcbiIsIHB1c2JfaW50ZXJmYWNlLT5taW5vcik7CisJCWJyZWFrOwogCX0KLQlpZiAoVklERU9fREVWSUNFX01BTlkgPD0gdmlkZW9fZGV2aWNlX21hbnkpIHsKLQkJU0FZKCJFUlJPUjogVG9vIG1hbnkgL2Rldi92aWRlb3NcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcHZpZGVvX2FycmF5W3ZpZGVvX2RldmljZV9tYW55XSA9IHB2aWRlb19kZXZpY2U7ICB2aWRlb19kZXZpY2VfbWFueSsrOwotCi0Jc3RyY3B5KCZwdmlkZW9fZGV2aWNlLT5uYW1lWzBdLCAiZWFzeWNhcGRjNjAiKTsKLSNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKQotCXB2aWRlb19kZXZpY2UtPmZvcHMgPSAmdjRsMl9mb3BzOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKLQlwdmlkZW9fZGV2aWNlLT5mb3BzID0gJmVhc3ljYXBfZm9wczsKLSNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKi8KLQlwdmlkZW9fZGV2aWNlLT5taW5vciA9IC0xOwotCXB2aWRlb19kZXZpY2UtPnJlbGVhc2UgPSAodm9pZCAqKSgmdmlkZW9kZXZfcmVsZWFzZSk7Ci0KLQl2aWRlb19zZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlLCAodm9pZCAqKXBlYXN5Y2FwKTsKLQotCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHB2aWRlb19kZXZpY2UsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKLQlpZiAoMCAhPSByYykgewotCQllcnIoIk5vdCBhYmxlIHRvIHJlZ2lzdGVyIHdpdGggdmlkZW9kZXYiKTsKLQkJdmlkZW9kZXZfcmVsZWFzZShwdmlkZW9fZGV2aWNlKTsKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKwlpZiAoMCAhPSAodjRsMl9kZXZpY2VfcmVnaXN0ZXIoJihwdXNiX2ludGVyZmFjZS0+ZGV2KSwgXAorCQkJCQkJJihwZWFzeWNhcC0+djRsMl9kZXZpY2UpKSkpIHsKKwkJU0FNKCJ2NGwyX2RldmljZV9yZWdpc3RlcigpIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5wdmlkZW9fZGV2aWNlID0gcHZpZGVvX2RldmljZTsKLQkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX3ZpZGVvKSsrOwotCQlKT1QoNCwgInJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKLQkJCQkJCQlwdmlkZW9fZGV2aWNlLT5taW5vcik7CisJCUpPTSg0LCAicmVnaXN0ZXJlZCBkZXZpY2UgaW5zdGFuY2U6ICVzXG4iLCBcCisJCQkJCSYocGVhc3ljYXAtPnY0bDJfZGV2aWNlLm5hbWVbMF0pKTsKIAl9Ci0vKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYTUUKKyAqCisgKgorICogIFRISVMgSVMgQkVMSUVWRUQgVE8gQkUgSEFSTUxFU1MsIEJVVCBNQVkgV0VMTCBCRSBVTk5FQ0VTU0FSWSBPUiBXUk9ORzoKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS52NGwyX2RldiA9IChzdHJ1Y3QgdjRsMl9kZXZpY2UgKilOVUxMOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworCisJc3RyY3B5KCZwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm5hbWVbMF0sICJlYXN5Y2FwZGM2MCIpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMpCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5mb3BzID0gJnY0bDJfZm9wczsKKyNlbHNlCisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5mb3BzID0gJmVhc3ljYXBfZm9wczsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKi8KKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm1pbm9yID0gLTE7CisJcGVhc3ljYXAtPnZpZGVvX2RldmljZS5yZWxlYXNlID0gKHZvaWQgKikoJnZpZGVvZGV2X3JlbGVhc2UpOworCisJdmlkZW9fc2V0X2RydmRhdGEoJihwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKSwgKHZvaWQgKilwZWFzeWNhcCk7CisKKwlpZiAoMCAhPSAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCYocGVhc3ljYXAtPnZpZGVvX2RldmljZSksIFwKKwkJCQkJCVZGTF9UWVBFX0dSQUJCRVIsIC0xKSkpIHsKKwkJZXJyKCJOb3QgYWJsZSB0byByZWdpc3RlciB3aXRoIHZpZGVvZGV2Iik7CisJCXZpZGVvZGV2X3JlbGVhc2UoJihwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKSk7CisJCXJldHVybiAtRU5PREVWOworCX0gZWxzZSB7CisJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbykrKzsKKwkJU0FNKCJyZWdpc3RlcmVkIHdpdGggdmlkZW9kZXY6ICVpPW1pbm9yXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLm1pbm9yKTsKKwl9CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCiAJYnJlYWs7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM4MjcsMTI1ICs0NDI2LDExOCBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgMTogeworCWlmICghcGVhc3ljYXApIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gSU5URVJGQUNFIDEKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSwgcGVhc3ljYXApOwotCUpPVCg0LCAibm8gaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgZm9yIGludGVyZmFjZSAlaVxuIiwgXAorCUpPTSg0LCAibm8gaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgZm9yIGludGVyZmFjZSAlaVxuIiwgXAogCQkJCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VOdW1iZXIpOwogCWJyZWFrOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjYXNlIDI6IHsKIAlpZiAoIXBlYXN5Y2FwKSB7Ci0JCVNBWSgiTUlTVEFLRTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCVNBTSgiTUlTVEFLRTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoIWlzb2thbHQpIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19hbHRzZXR0aW5nX29uXG4iKTsKKwkJU0FNKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19hbHRzZXR0aW5nX29uXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfSBlbHNlIHsKIAkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24gPSBva2FsdFtpc29rYWx0IC0gMV07Ci0JCUpPVCg0LCAiJWk9YXVkaW9fYWx0c2V0dGluZ19vbiA8PT09PVxuIiwgXAorCQlKT00oNCwgIiVpPWF1ZGlvX2FsdHNldHRpbmdfb24gPD09PT1cbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKIAl9Ci0JaWYgKCFpc29rZXBuKSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fZW5kcG9pbnRudW1iZXJcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rZXBuIC0gMV07Ci0JCUpPVCg0LCAiJWk9YXVkaW9fZW5kcG9pbnRudW1iZXJcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKLQl9Ci0JaWYgKCFpc29rbXBzKSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgYXVkaW9fbWF4cGFja2V0c2l6ZVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSA9IG9rbXBzW2lzb2ttcHMgLSAxXTsKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAotCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgYXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQkJaWYgKDkgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlwZWFzeWNhcC0+aWxrIHw9IDB4MDI7Ci0JCQlTQVkoImhhcmR3YXJlIGlzIEZPVVItQ1ZCU1xuIik7Ci0JCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IHRydWU7Ci0JCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50ID0gNDsKLQkJfSBlbHNlIGlmICgyNTYgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCQlwZWFzeWNhcC0+aWxrICY9IH4weDAyOwotCQkJU0FZKCJoYXJkd2FyZSBpcyBDVkJTK1MtVklERU9cbiIpOwotCQkJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKLQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OwotCQl9IGVsc2UgewotCQkJU0FZKCJoYXJkd2FyZSBpcyB1bmlkZW50aWZpZWQ6XG4iKTsKLQkJCVNBWSgiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9CiAKLQkJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCA9IFwKKwlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rYWx0IC0gMV07CisJSk9NKDQsICIlaT1hdWRpb19lbmRwb2ludG51bWJlclxuIiwgcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKKworCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSA9IG9rbXBzW2lzb2thbHQgLSAxXTsKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7CisJaWYgKDAgPj0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCVNBTSgiRVJST1I6ICBiYWQgYXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYgKDkgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCXBlYXN5Y2FwLT5pbGsgfD0gMHgwMjsKKwkJU0FNKCJoYXJkd2FyZSBpcyBGT1VSLUNWQlNcbiIpOworCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IHRydWU7CisJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OworCX0gZWxzZSBpZiAoMjU2ID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSkgeworCQlwZWFzeWNhcC0+aWxrICY9IH4weDAyOworCQlTQU0oImhhcmR3YXJlIGlzIENWQlMrUy1WSURFT1xuIik7CisJCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gZmFsc2U7CisJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OworCX0gZWxzZSB7CisJCVNBTSgiaGFyZHdhcmUgaXMgdW5pZGVudGlmaWVkOlxuIik7CisJCVNBTSgiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCA9IFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCAqIFwKIAkJCQkJCQkJUEFHRV9TSVpFIDsKLQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPSAoQVVESU9fRlJBR01FTlRfTUFOWSAqIFwKKwlwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA9IChBVURJT19GUkFHTUVOVF9NQU5ZICogXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KTsKIAotCQlKT1QoNCwgIiU2aT1BVURJT19GUkFHTUVOVF9NQU5ZXG4iLCBBVURJT19GUkFHTUVOVF9NQU5ZKTsKLQkJSk9UKDQsICIlNmk9YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50XG4iLCBcCisJSk9NKDQsICIlNmk9QVVESU9fRlJBR01FTlRfTUFOWVxuIiwgQVVESU9fRlJBR01FTlRfTUFOWSk7CisJSk9NKDQsICIlNmk9YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpOwotCQlKT1QoNCwgIiU2aT1hdWRpb19ieXRlc19wZXJfZnJhZ21lbnRcbiIsIFwKKwlKT00oNCwgIiU2aT1hdWRpb19ieXRlc19wZXJfZnJhZ21lbnRcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudCk7Ci0JCUpPVCg0LCAiJTZpPWF1ZGlvX2J1ZmZlcl9wYWdlX21hbnlcbiIsIFwKKwlKT00oNCwgIiU2aT1hdWRpb19idWZmZXJfcGFnZV9tYW55XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55KTsKIAotCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjID0gMTI4OworCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MgPSAxMjg7CiAKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQkJaWYgKDAgPj0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYykgewotCQkJU0FZKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQotCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSA9IFwKLQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUgKiBcCi0JCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKLQkJSk9UKDQsICIlaT1hdWRpb19pc29jX2J1ZmZlcl9zaXplXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKTsKLQkJaWYgKEFVRElPX0lTT0NfQlVGRkVSX1NJWkUgPCBcCi0JCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKSB7Ci0JCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX2J1ZmZlcl9zaXplIGJpZ2dlciAiCi0JCQkidGhhbiAlbGk9QVVESU9fSVNPQ19CVUZGRVJfU0laRVxuIiwgXAotCQkJCQkJQVVESU9fSVNPQ19CVUZGRVJfU0laRSk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCWlmICgwID49IHBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpIHsKKwkJU0FNKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKKwlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSA9IFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUgKiBcCisJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYzsKKwlKT00oNCwgIiVpPWF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOworCWlmIChBVURJT19JU09DX0JVRkZFUl9TSVpFIDwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpIHsKKwkJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgYmlnZ2VyICIKKwkJCSJ0aGFuICVsaT1BVURJT19JU09DX0JVRkZFUl9TSVpFXG4iLCBcCisJCQkJCQlBVURJT19JU09DX0JVRkZFUl9TSVpFKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2ludGVyZmFjZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24pIHsKLQkJU0FZKCJNSVNUQUtFOiAgYXVkaW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2FsdHNldHRpbmdfb24gaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29mZikgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlX29mZiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2VuZHBvaW50bnVtYmVyIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX21heGZyYW1lc2l6ZSBpcyB1bnNldFxuIik7CisJCVNBTSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSkgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faXNvY19idWZmZXJfc2l6ZSBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM5NTYsMTcgKzQ1NDgsMTcgQEAKIAlJTklUX0xJU1RfSEVBRCgmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCkpOwogCXBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgPSAmKHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCk7CiAKLQlKT1QoNCwgImFsbG9jYXRpbmcgYW4gYXVkaW8gYnVmZmVyXG4iKTsKLQlKT1QoNCwgIi4uLi4gc2NhdHRlcmVkIG92ZXIgJWkgcGFnZXNcbiIsIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgYW4gYXVkaW8gYnVmZmVyXG4iKTsKKwlKT00oNCwgIi4uLi4gc2NhdHRlcmVkIG92ZXIgJWkgcGFnZXNcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkpOwogCiAJZm9yIChrID0gMDsgIGsgPCBwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueTsgIGsrKykgewogCQlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSB7Ci0JCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgYXVkaW8gYnVmZmVyc1xuIik7CisJCQlTQU0oIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgYXVkaW8gYnVmZmVyc1xuIik7CiAJCX0gZWxzZSB7CiAJCQlwYnVmID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQkJaWYgKCh2b2lkICopTlVMTCA9PSBwYnVmKSB7Ci0JCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvICIgXAorCQkJCVNBTSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBhdWRpbyAiIFwKIAkJCQkJCQkiYnVmZmVyIHBhZ2UgJWlcbiIsIGspOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfSBlbHNlCkBAIC0zOTc5LDE2ICs0NTcxLDE2IEBACiAKIAlwZWFzeWNhcC0+YXVkaW9fZmlsbCA9IDA7CiAJcGVhc3ljYXAtPmF1ZGlvX3JlYWQgPSAwOwotCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiBhdWRpbyBidWZmZXIgZG9uZTogICVpIHBhZ2VzXG4iLCBrKTsKKwlKT00oNCwgImFsbG9jYXRpb24gb2YgYXVkaW8gYnVmZmVyIGRvbmU6ICAlaSBwYWdlc1xuIiwgayk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgYXVkaW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAorCUpPTSg0LCAiYWxsb2NhdGluZyAlaSBpc29jIGF1ZGlvIGJ1ZmZlcnMgb2Ygc2l6ZSAlaVxuIiwgIFwKIAkJQVVESU9fSVNPQ19CVUZGRVJfTUFOWSwgcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwotCUpPVCg0LCAiLi4uLiBlYWNoIG9jY3VweWluZyBjb250aWd1b3VzIG1lbW9yeSBwYWdlc1xuIik7CisJSk9NKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKIAogCWZvciAoayA9IDA7ICBrIDwgQVVESU9fSVNPQ19CVUZGRVJfTUFOWTsgIGsrKykgewogCQlwYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIEFVRElPX0lTT0NfT1JERVIpOwogCQlpZiAoTlVMTCA9PSBwYnVmKSB7Ci0JCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyBhdWRpbyBidWZmZXIgIiBcCisJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyBhdWRpbyBidWZmZXIgIiBcCiAJCQkJCQkJIiVpXG4iLCBrKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9IGVsc2UKQEAgLTQwMDAsMjUgKzQ1OTIsMjUgQEAKIAkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemU7CiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcltrXS5rb3VudCA9IGs7CiAJfQotCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZG9uZS5cbiIpOworCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZG9uZS5cbiIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBBTExPQ0FURSBBTkQgSU5JVElBTElaRSBNVUxUSVBMRSBzdHJ1Y3QgdXJiIC4uLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIHN0cnVjdCB1cmIuXG4iLCBBVURJT19JU09DX0JVRkZFUl9NQU5ZKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIEFVRElPX0lTT0NfQlVGRkVSX01BTlkpOworCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwogCiAJZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyBrKyspIHsKIAkJcHVyYiA9IHVzYl9hbGxvY191cmIocGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYywgXAogCQkJCQkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKE5VTEwgPT0gcHVyYikgewotCQkJU0FZKCJFUlJPUjogdXNiX2FsbG9jX3VyYiByZXR1cm5lZCBOVUxMIGZvciBidWZmZXIgIiBcCisJCQlTQU0oIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKIAkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtNDAyNiw3ICs0NjE4LDcgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIAkJcGRhdGFfdXJiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRhdGFfdXJiKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikgewotCQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOworCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdCBkYXRhX3VyYi5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQogCQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fc3RydWN0ICs9IFwKQEAgLTQwNDMsMzAgKzQ2MzUsMzAgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCQlpZiAoIWspIHsKLQkJCUpPVCg0LCAiaW5pdGlhbGl6aW5nIGF1ZGlvIHVyYnMgdGh1czpcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmludGVydmFsID0gMTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmRldiA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUocGVhc3ljYXAtPiIgXAorCQkJSk9NKDQsICJpbml0aWFsaXppbmcgYXVkaW8gdXJicyB0aHVzOlxuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShwZWFzeWNhcC0+IiBcCiAJCQkJCSJwdXNiX2RldmljZSwlaSk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlcik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7XG4iKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSAiIFwKKwkJCUpPTSg0LCAiICBwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDtcbiIpOworCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9ICIgXAogCQkJCSJwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJbLl0ucGdvO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbXBsZXRlID0gZWFzeXNuZF9jb21wbGV0ZTtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPmNvbnRleHQgPSBwZWFzeWNhcDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnN0YXJ0X2ZyYW1lID0gMDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5c25kX2NvbXBsZXRlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCisJCQlKT00oNCwgIiAgZm9yIChqID0gMDsgaiA8ICVpOyBqKyspXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQkJSk9UKDQsICIgICAge1xuIik7Ci0JCQlKT1QoNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBqKiVpO1xuIixcCisJCQlKT00oNCwgIiAgICB7XG4iKTsKKwkJCUpPTSg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLmxlbmd0aCA9ICVpO1xuIiwgXAorCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgICB9XG4iKTsKKwkJCUpPTSg0LCAiICAgIH1cbiIpOwogCQkJfQogCiAJCXB1cmItPmludGVydmFsID0gMTsKQEAgLTQwODgsNyArNDY4MCw3IEBACiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZTsKIAkJfQogCX0KLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgJWkgc3RydWN0IHVyYiBkb25lLlxuIiwgayk7CisJSk9NKDQsICJhbGxvY2F0aW9uIG9mICVpIHN0cnVjdCB1cmIgZG9uZS5cbiIsIGspOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBTQVZFIFBPSU5URVIgcGVhc3ljYXAgSU4gVEhJUyBJTlRFUkZBQ0UuCkBAIC00MTA1LDE0ICs0Njk3LDE4IEBACiAJCWVycigiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZXJmYWNlLCBOVUxMKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJSk9NKDgsICJrcmVmX2dldCgpIHdpdGggJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIixcCisJCQkJCShpbnQpcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcik7CisJCWtyZWZfZ2V0KCZwZWFzeWNhcC0+a3JlZik7CiAJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbykrKzsKKwl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIExFVCBUSEUgVVNFUiBLTk9XIFdIQVQgTk9ERSBUSEUgQVVESU8gREVWSUNFIElTIEFUVEFDSEVEIFRPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JU0FZKCJlYXN5c25kIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKKwlTQU0oImVhc3lzbmQgYXR0YWNoZWQgdG8gbWlub3IgIyVkXG4iLCBwdXNiX2ludGVyZmFjZS0+bWlub3IpOwogCWJyZWFrOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDEyMSwyMCArNDcxNywxOSBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBkZWZhdWx0OiB7Ci0JSk9UKDQsICJFUlJPUjogdW5leHBlY3RlZCBpbnRlcmZhY2UgJWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOworCUpPTSg0LCAiRVJST1I6IHVuZXhwZWN0ZWQgaW50ZXJmYWNlICVpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIH0KLUpPVCg0LCAiZW5kcyBzdWNjZXNzZnVsbHkgZm9yIGludGVyZmFjZSAlaVxuIiwgXAorSk9NKDQsICJlbmRzIHN1Y2Nlc3NmdWxseSBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCiAJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcik7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgV0hFTiBUSElTIEZVTkNUSU9OIElTIENBTExFRCBUSEUgREVWSUNFIEhBUyBBTFJFQURZIEJFRU4gUEhZU0lDQUxMWQotICogIFVOUExVR0dFRC4KLSAqICBIRU5DRSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgSVMgTk8gTE9OR0VSIFZBTElEIEFORCBNVVNUIEJFIFNFVCBUTyBOVUxMLgorICogIFdIRU4gVEhJUyBGVU5DVElPTiBJUyBDQUxMRUQgVEhFIEVhc3lDQVAgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZCisgKiAgVU5QTFVHR0VELiAgSEVOQ0UgcGVhc3ljYXAtPnB1c2JfZGV2aWNlIElTIE5PIExPTkdFUiBWQUxJRC4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZApAQCAtNDE0Nyw3ICs0NzQyLDE0IEBACiAKIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CiBzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKLWludCBtaW5vciwgbTsKK2ludCBtaW5vciwgbSwga2Q7CisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKK3N0cnVjdCB2NGwyX2RldmljZSAqcHY0bDJfZGV2aWNlOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KIAogSk9UKDQsICJcbiIpOwogCkBAIC00MTY5LDEwNyArNDc3MSwxODggQEAKIG1pbm9yID0gcHVzYl9pbnRlcmZhY2UtPm1pbm9yOwogSk9UKDQsICJpbnRmWyVpXTogbWlub3I9JWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIsIG1pbm9yKTsKIAoraWYgKDEgPT0gYkludGVyZmFjZU51bWJlcikKKwlyZXR1cm47CisKIHBlYXN5Y2FwID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7Ci1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7Ci1lbHNlIHsKLQlwZWFzeWNhcC0+cHVzYl9kZXZpY2UgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMOwotCXN3aXRjaCAoYkludGVyZmFjZU51bWJlcikgeworCXJldHVybjsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQljYXNlIDA6IHsKLQkJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7Ci0JCQlKT1QoNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7Ci0JCQltID0gMDsKLQkJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKQotCQkJCXsKLQkJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIFwKLQkJCQkJCXN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKLQkJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7Ci0JCQkJCWlmICgoc3RydWN0IHVyYiAqKU5VTEwgIT0gXAotCQkJCQkJCXBkYXRhX3VyYi0+cHVyYikgewotCQkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7Ci0JCQkJCQltKys7Ci0JCQkJCX0KKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQorIworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU09NRSBWRVJTSU9OUyBPRiBUSEUgdmlkZW9kZXYgTU9EVUxFIE9WRVJXUklURSBUSEUgREFUQSBXSElDSCBIQVMKKyAqICBCRUVOIFdSSVRURU4gQlkgVEhFIENBTEwgVE8gdXNiX3NldF9pbnRmZGF0YSgpIElOIGVhc3ljYXBfdXNiX3Byb2JlKCksCisgKiAgUkVQTEFDSU5HIElUIFdJVEggQSBQT0lOVEVSIFRPIFRIRSBFTUJFRERFRCB2NGwyX2RldmljZSBTVFJVQ1RVUkUuCisgKiAgVE8gREVURUNUIFRISVMsIFRIRSBTVFJJTkcgSU4gVEhFIGVhc3ljYXAudGVsbHRhbGVbXSBCVUZGRVIgSVMgQ0hFQ0tFRC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCXB2NGwyX2RldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOworCWlmICgoc3RydWN0IHY0bDJfZGV2aWNlICopTlVMTCA9PSBwdjRsMl9kZXZpY2UpIHsKKwkJU0FZKCJFUlJPUjogcHY0bDJfZGV2aWNlIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopIFwKKwkJY29udGFpbmVyX29mKHB2NGwyX2RldmljZSwgc3RydWN0IGVhc3ljYXAsIHY0bDJfZGV2aWNlKTsKK30KKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisjCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBUSEUgV0FJVCBRVUVVRVMgQVJFIE5PVCBDTEVBUkVEIEEgREVBRExPQ0sgSVMgUE9TU0lCTEUuICBCRVdBUkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CitwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKK3dha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV92aWRlbykpOword2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzd2l0Y2ggKGJJbnRlcmZhY2VOdW1iZXIpIHsKK2Nhc2UgMDogeworCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgeworCQlKT00oNCwgImtpbGxpbmcgdmlkZW8gdXJic1xuIik7CisJCW0gPSAwOworCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSkKKwkJCXsKKwkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAorCQkJCQlzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCisJCQkJCQlwZGF0YV91cmItPnB1cmIpIHsKKwkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCW0rKzsKIAkJCQl9CiAJCQl9Ci0JCQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKLQkJfSBlbHNlCi0JCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkIGlzIE5VTExcbiIpOwotCQlicmVhazsKKwkJfQorCQlKT00oNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKIAl9CisJYnJlYWs7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JY2FzZSAyOiB7Ci0JCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewotCQkJSk9UKDQsICJraWxsaW5nIGF1ZGlvIHVyYnNcbiIpOwotCQkJbSA9IDA7Ci0JCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIFwKLQkJCQkJCShwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewotCQkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAotCQkJCQkJc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwotCQkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKLQkJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCi0JCQkJCQkJcGRhdGFfdXJiLT5wdXJiKSB7Ci0JCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKLQkJCQkJCW0rKzsKLQkJCQkJfQorY2FzZSAyOiB7CisJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CisJCUpPTSg0LCAia2lsbGluZyBhdWRpbyB1cmJzXG4iKTsKKwkJbSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgXAorCQkJCQkocGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkpIHsKKwkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAorCQkJCQlzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CisJCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7CisJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCisJCQkJCQlwZGF0YV91cmItPnB1cmIpIHsKKwkJCQkJdXNiX2tpbGxfdXJiKHBkYXRhX3VyYi0+cHVyYik7CisJCQkJCW0rKzsKIAkJCQl9CiAJCQl9Ci0JCQlKT1QoNCwgIiVpIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBtKTsKLQkJfSBlbHNlCi0JCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkIGlzIE5VTExcbiIpOwotCQlicmVhazsKKwkJfQorCQlKT00oNCwgIiVpIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBtKTsKIAl9CisJYnJlYWs7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorZGVmYXVsdDoKKwlicmVhazsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBERVJFR0lTVEVSCisgKgorICogIFRISVMgUFJPQ0VEVVJFIFdJTEwgQkxPQ0sgVU5USUwgZWFzeWNhcF9wb2xsKCksIFZJREVPIElPQ1RMIEFORCBBVURJTworICogIElPQ1RMIEFSRSBBTEwgVU5MT0NLRUQuICBJRiBUSElTIElTIE5PVCBET05FIEFOIE9vcHMgQ0FOIE9DQ1VSIFdIRU4KKyAqICBBTiBFYXN5Q0FQIElTIFVOUExVR0dFRCBXSElMRSBUSEUgVVJCUyBBUkUgUlVOTklORy4gIEJFV0FSRS4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitrZCA9IGlzZG9uZ2xlKHBlYXN5Y2FwKTsKIHN3aXRjaCAoYkludGVyZmFjZU51bWJlcikgewogY2FzZSAwOiB7CisJaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBlYXN5Y2FwLT53cV92aWRlbyk7CisJCUpPTSg0LCAiYWJvdXQgdG8gbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLlwKKwkJCQkJCQkJbXV0ZXhfdmlkZW8pKSB7CisJCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0uIiBcCisJCQkJCQkJIm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCQlyZXR1cm47CisJCX0KKwkJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJfSBlbHNlCisJCVNBWSgiRVJST1I6ICVpPWtkIGlzIGJhZDogY2Fubm90IGxvY2sgZG9uZ2xlXG4iLCBrZCk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKIAlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOwogCX0gZWxzZSB7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCXVzYl9kZXJlZ2lzdGVyX2RldihwdXNiX2ludGVyZmFjZSwgJmVhc3ljYXBfY2xhc3MpOwogCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07Ci0KLQkJSk9UKDQsICJpbnRmWyVpXTogdXNiX2RlcmVnaXN0ZXJfZGV2KClcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOwotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCVNBWSgiZWFzeWNhcCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOworCQlKT00oNCwgImludGZbJWldOiB1c2JfZGVyZWdpc3Rlcl9kZXYoKVxuIiwgYkludGVyZmFjZU51bWJlcik7CisJCVNBTSgiZWFzeWNhcCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOwogCX0KLS8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2Vsc2UKLQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQllbHNlIHsKLQkJbG9ja19rZXJuZWwoKTsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UocGVhc3ljYXAtPnB2aWRlb19kZXZpY2UpOwotCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJSk9UKDQsICJ1bnJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKLQkJCQkJCQlwdmlkZW9fZGV2aWNlLT5taW5vcik7CisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCisJaWYgKCFwZWFzeWNhcC0+djRsMl9kZXZpY2UubmFtZVswXSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+djRsMl9kZXZpY2UubmFtZSBpcyBlbXB0eVxuIik7CisJCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpCisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybjsKIAl9Ci0vKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKwl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZwZWFzeWNhcC0+djRsMl9kZXZpY2UpOworCUpPTSg0LCAidjRsMl9kZXZpY2VfZGlzY29ubmVjdCgpIE9LXG4iKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZwZWFzeWNhcC0+djRsMl9kZXZpY2UpOworCUpPTSg0LCAidjRsMl9kZXZpY2VfdW5yZWdpc3RlcigpIE9LXG4iKTsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGVhc3ljYXAtPnZpZGVvX2RldmljZSk7CisJSk9NKDQsICJpbnRmWyVpXTogdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoKSBPS1xuIiwgYkludGVyZmFjZU51bWJlcik7CisJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX3ZpZGVvKS0tOworCUpPTSg0LCAidW5yZWdpc3RlcmVkIHdpdGggdmlkZW9kZXY6ICVpPW1pbm9yXG4iLCBtaW5vcik7CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisKKwlpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJSk9NKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIDI6IHsKLQlsb2NrX2tlcm5lbCgpOworCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZWFzeWNhcC0+d3FfYXVkaW8pOworCQlKT00oNCwgImFib3V0IHRvIGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5cCisJCQkJCQkJCW11dGV4X2F1ZGlvKSkgeworCQkJU0FZKCJFUlJPUjogY2Fubm90IGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLiIgXAorCQkJCQkJCSJtdXRleF9hdWRpb1xuIiwga2QpOworCQkJcmV0dXJuOworCQl9CisJCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCX0gZWxzZQorCQlTQVkoIkVSUk9SOiAlaT1rZCBpcyBiYWQ6IGNhbm5vdCBsb2NrIGRvbmdsZVxuIiwga2QpOwogCiAJdXNiX2RlcmVnaXN0ZXJfZGV2KHB1c2JfaW50ZXJmYWNlLCAmZWFzeXNuZF9jbGFzcyk7Ci0JaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgIT0gcGVhc3ljYXApCi0JCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbyktLTsKKwkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfYXVkaW8pLS07CiAKLQlKT1QoNCwgImludGZbJWldOiB1c2JfZGVyZWdpc3Rlcl9kZXYoKVxuIiwgYkludGVyZmFjZU51bWJlcik7Ci0JdW5sb2NrX2tlcm5lbCgpOworCUpPTSg0LCAiaW50ZlslaV06IHVzYl9kZXJlZ2lzdGVyX2RldigpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKKwlTQU0oImVhc3lzbmQgZGV0YWNoZWQgZnJvbSBtaW5vciAjJWRcbiIsIG1pbm9yKTsKIAotCVNBWSgiZWFzeXNuZCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOworCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCX0KIAlicmVhazsKIH0KIGRlZmF1bHQ6CkBAIC00MjgwLDI1ICs0OTYzLDQyIEBACiAgKiAgQ0FMTCBlYXN5Y2FwX2RlbGV0ZSgpIElGIE5PIFJFTUFJTklORyBSRUZFUkVOQ0VTIFRPIHBlYXN5Y2FwCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlTQVkoImNhbm5vdCBjYWxsIGtyZWZfcHV0KClcbiIpOwotCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOwotCXJldHVybjsKLX0KIGlmICghcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlcikgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIgaXMgemVybyAiIFwKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyIGlzIHplcm8gIgogCQkJCQkJInNvIGNhbm5vdCBjYWxsIGtyZWZfcHV0KClcbiIpOwotCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworCVNBTSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOwogCXJldHVybjsKIH0KLUpPVCg0LCAiaW50ZlslaV06IGtyZWZfcHV0KCkgd2l0aCAlaT1wZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyXG4iLCBcCitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJSk9NKDQsICJhYm91dCB0byBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGRvd24gZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCVNBTSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworCXJldHVybjsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJSk9NKDQsICJhYm91dCB0byBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGRvd24gZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJCW11dGV4X3VubG9jaygmKGVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpOworCQlKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCQlTQU0oImVuZGluZyB1bnN1Y2Nlc3NmdWxseTogbWF5IGNhdXNlIG1lbW9yeSBsZWFrXG4iKTsKKwkJcmV0dXJuOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKK30KK0pPTSg0LCAiaW50ZlslaV06ICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKIAkJYkludGVyZmFjZU51bWJlciwgKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKIGtyZWZfcHV0KCZwZWFzeWNhcC0+a3JlZiwgZWFzeWNhcF9kZWxldGUpOwogSk9UKDQsICJpbnRmWyVpXToga3JlZl9wdXQoKSBkb25lLlxuIiwgYkludGVyZmFjZU51bWJlcik7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJbXV0ZXhfdW5sb2NrKCYoZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKSk7CisJSk9UKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJSk9UKDQsICJ1bmxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotSk9UKDQsICJlbmRzXG4iKTsKK0pPTSg0LCAiZW5kc1xuIik7CiByZXR1cm47CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MzA4LDcgKzUwMDgsOCBAQAogaW50IHJlc3VsdDsKIAogU0FZKCI9PT09PT09PWVhc3ljYXA9PT09PT09XG4iKTsKLUpPVCg0LCAiYmVnaW5zLiAgJWk9ZGVidWdcbiIsIGVhc3ljYXBfZGVidWcpOworSk9UKDQsICJiZWdpbnMuICAlaT1kZWJ1ZyAlaT1iYXJzICVpPWdhaW5cbiIsIGVhc3ljYXBfZGVidWcsIGVhc3ljYXBfYmFycywgXAorCQkJCQkJZWFzeWNhcF9nYWluKTsKIFNBWSgidmVyc2lvbjogIiBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OICJcbiIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTQzNDksNiArNTA1MCw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oRUFTWUNBUF9EUklWRVJfREVTQ1JJUFRJT04pOwogTU9EVUxFX1ZFUlNJT04oRUFTWUNBUF9EUklWRVJfVkVSU0lPTik7CiAjaWYgZGVmaW5lZChFQVNZQ0FQX0RFQlVHKQotTU9EVUxFX1BBUk1fREVTQyhlYXN5Y2FwX2RlYnVnLCAiZGVidWc6IDAgKGRlZmF1bHQpLCAxLCAyLC4uLiIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsOiAwKGRlZmF1bHQpLDEsMiwuLi4sOSIpOwogI2VuZGlmIC8qRUFTWUNBUF9ERUJVRyovCitNT0RVTEVfUEFSTV9ERVNDKGJhcnMsIFwKKwkiVGVzdGNhcmQgYmFycyBvbiBpbnB1dCBzaWduYWwgZmFpbHVyZTogMD0+bm8sIDE9PnllcyhkZWZhdWx0KSIpOworTU9EVUxFX1BBUk1fREVTQyhnYWluLCAiQXVkaW8gZ2FpbjogMCwuLi4sMTYoZGVmYXVsdCksLi4uMzEiKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYwppbmRleCAzOGQ5NDA1Li5kZjNmMTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NldHRpbmdzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCkBAIC0zMywxMSArMzMsMTUgQEAKICAqICBUSEUgTEVBU1QgU0lHTklGSUNBTlQgQklUIE9GIGVhc3ljYXBfc3RhbmRhcmQubWFzayBIQVMgTUVBTklORzoKICAqICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gMjUgZnBzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAxID0+IDMwIGZwcworICoKKyAqICBUSEUgTU9TVCAgU0lHTklGSUNBTlQgQklUIE9GIGVhc3ljYXBfc3RhbmRhcmQubWFzayBIQVMgTUVBTklORzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gZnVsbCBmcmFtZXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gMjAlICBmcmFtZXJhdGUKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogY29uc3Qgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgZWFzeWNhcF9zdGFuZGFyZFtdID0gewogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfQkdISU4gLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfQkdISU4gLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMX0JHSElOLAogCS5pZCA9IChWNEwyX1NURF9QQUxfQiB8IFY0TDJfU1REX1BBTF9HIHwgVjRMMl9TVERfUEFMX0ggfCBcCkBAIC01MCw3ICs1NCw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBOVFNDX05fNDQzICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19OXzQ0MyAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX05fNDQzLAogCS5pZCA9IFY0TDJfU1REX1VOS05PV04sCkBAIC02Miw3ICs2Niw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfTmMgLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfTmMgLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMX05jLAogCS5pZCA9IFY0TDJfU1REX1BBTF9OYywKQEAgLTc0LDcgKzc4LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIE5UU0NfTiAsCisubWFzayA9IDB4MDBGRiAmIE5UU0NfTiAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX04sCiAJLmlkID0gVjRMMl9TVERfVU5LTk9XTiwKQEAgLTg2LDcgKzkwLDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIFNFQ0FNICwKKy5tYXNrID0gMHgwMEZGICYgU0VDQU0gLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gU0VDQU0sCiAJLmlkID0gVjRMMl9TVERfU0VDQU0sCkBAIC05OCw3ICsxMDIsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ19NICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19NICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfTSwKIAkuaWQgPSBWNEwyX1NURF9OVFNDX00sCkBAIC0xMTAsNyArMTE0LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIE5UU0NfTV9KUCAsCisubWFzayA9IDB4MDBGRiAmIE5UU0NfTV9KUCAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDX01fSlAsCiAJLmlkID0gVjRMMl9TVERfTlRTQ19NX0pQLApAQCAtMTIyLDcgKzEyNiw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfNjAgLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfNjAgLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gUEFMXzYwLAogCS5pZCA9IFY0TDJfU1REX1BBTF82MCwKQEAgLTEzNCw3ICsxMzgsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ180NDMgLAorLm1hc2sgPSAweDAwRkYgJiBOVFNDXzQ0MyAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBOVFNDXzQ0MywKIAkuaWQgPSBWNEwyX1NURF9OVFNDXzQ0MywKQEAgLTE0Niw3ICsxNTAsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgUEFMX00gLAorLm1hc2sgPSAweDAwRkYgJiBQQUxfTSAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBQQUxfTSwKIAkuaWQgPSBWNEwyX1NURF9QQUxfTSwKQEAgLTE1OCw2ICsxNjIsMTI4IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMX0JHSElOX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX0JHSElOX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKKwkJCQlWNEwyX1NURF9QQUxfSSB8IFY0TDJfU1REX1BBTF9OIHwgXAorCQkJCQkoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF9CR0hJTl9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ19OXzQ0M19TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IE5UU0NfTl80NDNfU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfVU5LTk9XTiB8ICgoKHY0bDJfc3RkX2lkKTB4MTEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19OXzQ0M19TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA0ODAsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMX05jX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX05jX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1BBTF9OYyB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiUEFMX05jX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDYyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX05fU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDX05fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfVU5LTk9XTiB8ICgoKHY0bDJfc3RkX2lkKTB4MjEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19OX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBTRUNBTV9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IFNFQ0FNX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1NFQ0FNIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJTRUNBTV9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNX0sCisJLmZyYW1lbGluZXMgPSA2MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ19NX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19NX1NMT1csCisJLmlkID0gKFY0TDJfU1REX05UU0NfTSB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ19NX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA2fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX01fSlBfU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDX01fSlBfU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfTlRTQ19NX0pQIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDX01fSlBfU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIFBBTF82MF9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IFBBTF82MF9TTE9XLAorCS5pZCA9IChWNEwyX1NURF9QQUxfNjAgfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF82MF9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNn0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgTlRTQ180NDNfU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDXzQ0M19TTE9XLAorCS5pZCA9IChWNEwyX1NURF9OVFNDXzQ0MyB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiTlRTQ180NDNfU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIFBBTF9NX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMX01fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfUEFMX00gfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlBBTF9NX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA2fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CiAubWFzayA9IDB4RkZGRgogfQogfTsKQEAgLTE2NSwxNSArMjkxLDE2IEBACiAvKgogICogIFRIRSAxNi1CSVQgZWFzeWNhcF9mb3JtYXQubWFzayBIQVMgTUVBTklORzoKICAqICAgIChsZWFzdCBzaWduaWZpY2FudCkgQklUICAwOiAgICAgMCA9PiBQQUwsIDI1IEZQUzsgICAxID0+IE5UU0MsIDMwIEZQUwotICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDEtMzogICBSRVNFUlZFRCBGT1IgRElGRkVSRU5USUFUSU5HIFNUQU5EQVJEUwotICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDQtNzogICBOVU1CRVIgT0YgQllURVMgUEVSIFBJWEVMCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgMi00OiAgIFJFU0VSVkVEIEZPUiBESUZGRVJFTlRJQVRJTkcgU1RBTkRBUkRTCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgNS03OiAgIE5VTUJFUiBPRiBCWVRFUyBQRVIgUElYRUwKICAqICAgICAgICAgICAgICAgICAgICAgICAgQklUICA4OiAgICAgMCA9PiBOQVRJVkUgQllURSBPUkRFUjsgIDEgPT4gU1dBUFBFRAogICogICAgICAgICAgICAgICAgICAgICAgICBCSVRTIDktMTA6ICBSRVNFUlZFRCBGT1IgT1RIRVIgQllURSBQRVJNVVRBVElPTlMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgQklUIDExOiAgICAgMCA9PiBVTkRFQ0lNQVRFRDsgIDEgPT4gREVDSU1BVEVECi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVCAxMjogICAgIDAgPT4gT0ZGRVIgRlJBTUVTOyAxID0+IE9GRkVSIEZJRUxEUwotICogICAgIChtb3N0IHNpZ25pZmljYW50KSBCSVRTIDEzLTE1OiBSRVNFUlZFRCBGT1IgT1RIRVIgRklFTEQgT1JERVIgT1BUSU9OUworICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTE6ICAgICAwID0+IFVOREVDSU1BVEVEOyAgICAxID0+IERFQ0lNQVRFRAorICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTI6ICAgICAwID0+IE9GRkVSIEZSQU1FUzsgICAxID0+IE9GRkVSIEZJRUxEUworICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTM6ICAgICAwID0+IEZVTEwgRlJBTUVSQVRFOyAxID0+IFJFRFVDRUQKKyAqICAgICAobW9zdCBzaWduaWZpY2FudCkgQklUUyAxNC0xNTogUkVTRVJWRUQgRk9SIE9USEVSIEZJRUxEL0ZSQU1FIE9QVElPTlMKICAqICBJVCBGT0xMT1dTIFRIQVQ6Ci0gKiAgICAgYnl0ZXNwZXJwaXhlbCBJUyAgICAgICAgICgoMHgwMEYwICYgZWFzeWNhcF9mb3JtYXQubWFzaykgPj4gNCkKKyAqICAgICBieXRlc3BlcnBpeGVsIElTICAgICAgICAgKCgweDAwRTAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSA+PiA1KQogICogICAgIGJ5dGVzd2Fwb3JkZXIgSVMgdHJ1ZSBJRiAoMCAhPSAoMHgwMTAwICYgZWFzeWNhcF9mb3JtYXQubWFzaykpCiAgKgogICogICAgIGRlY2ltYXRlcGl4ZWwgSVMgdHJ1ZSBJRiAoMCAhPSAoMHgwODAwICYgZWFzeWNhcF9mb3JtYXQubWFzaykpCkBAIC0xOTcsNjUgKzMyNCwxMzUgQEAKIAltYXNrMSA9IDB4MDAwMDsKIAlzd2l0Y2ggKGkpIHsKIAljYXNlIFBBTF9CR0hJTjogewotCQltYXNrMSA9IFBBTF9CR0hJTjsKKwkJbWFzazEgPSAweDFGICYgUEFMX0JHSElOOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX0JHSElOIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgU0VDQU06IHsKLQkJbWFzazEgPSBTRUNBTTsKKwkJbWFzazEgPSAweDFGICYgU0VDQU07CiAJCXN0cmNweSgmbmFtZTFbMF0sICJTRUNBTSIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CiAJCWJyZWFrOwogCX0KIAljYXNlIFBBTF9OYzogewotCQltYXNrMSA9IFBBTF9OYzsKKwkJbWFzazEgPSAweDFGICYgUEFMX05jOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX05jIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgUEFMXzYwOiB7Ci0JCW1hc2sxID0gUEFMXzYwOworCQltYXNrMSA9IDB4MUYgJiBQQUxfNjA7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfNjAiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwogCQlicmVhazsKIAl9CiAJY2FzZSBQQUxfTTogewotCQltYXNrMSA9IFBBTF9NOworCQltYXNrMSA9IDB4MUYgJiBQQUxfTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9NIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ19NOiB7Ci0JCW1hc2sxID0gTlRTQ19NOworCQltYXNrMSA9IDB4MUYgJiBOVFNDX007CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX00iKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KIAljYXNlIE5UU0NfNDQzOiB7Ci0JCW1hc2sxID0gTlRTQ180NDM7CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfNDQzOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ180NDMiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KIAljYXNlIE5UU0NfTV9KUDogewotCQltYXNrMSA9IE5UU0NfTV9KUDsKKwkJbWFzazEgPSAweDFGICYgTlRTQ19NX0pQOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19NX0pQIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOwogCQlicmVhazsKIAl9CiAJY2FzZSBOVFNDX046IHsKLQkJbWFzazEgPSBOVFNDX007CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTiIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ19OXzQ0MzogewotCQltYXNrMSA9IE5UU0NfTl80NDM7CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfTl80NDM7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX05fNDQzIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOwogCQlicmVhazsKIAl9CisJY2FzZSBQQUxfQkdISU5fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF9CR0hJTl9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfQkdISU5fU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFNFQ0FNX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBTRUNBTV9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJTRUNBTV9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgUEFMX05jX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBQQUxfTmNfU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX05jX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOworCQlicmVhazsKKwl9CisJY2FzZSBQQUxfNjBfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF82MF9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfNjBfU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF9NX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBQQUxfTV9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfTV9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19NX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDX01fU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19NX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfNDQzX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDXzQ0M19TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDXzQ0M19TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CisJY2FzZSBOVFNDX01fSlBfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTV9KUF9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX01fSlBfU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19OX1NMT1c6IHsKKwkJbWFzazEgPSAweDAwMUYgJiBOVFNDX05fU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19OX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfTl80NDNfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTl80NDNfU0xPVzsKKwkJbWFzazEgfD0gMHgwMjAwOworCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19OXzQ0M19TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTMxMSwzOSArNTA4LDM5IEBACiAJCQljYXNlIEZNVF9VWVZZOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfVVlWWSkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlk7Ci0JCQkJbWFzazMgfD0gKDB4MDIgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDIgPDwgNSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIEZNVF9ZVVkyOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfWVVZMikpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7Ci0JCQkJbWFzazMgfD0gKDB4MDIgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDIgPDwgNSk7CiAJCQkJbWFzazMgfD0gMHgwMTAwOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfUkdCMjQ6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9SR0IyNCkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjI0OwotCQkJCW1hc2szIHw9ICgweDAzIDw8IDQpOworCQkJCW1hc2szIHw9ICgweDAzIDw8IDUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfUkdCMzI6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9SR0IzMikpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjMyOwotCQkJCW1hc2szIHw9ICgweDA0IDw8IDQpOworCQkJCW1hc2szIHw9ICgweDA0IDw8IDUpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfQkdSMjQ6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9CR1IyNCkpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjI0OwotCQkJCW1hc2szIHw9ICgweDAzIDw8IDQpOworCQkJCW1hc2szIHw9ICgweDAzIDw8IDUpOwogCQkJCW1hc2szIHw9IDB4MDEwMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgRk1UX0JHUjMyOiB7CiAJCQkJc3RyY3B5KCZuYW1lM1swXSwgIl8iIFNUUklOR0laRShGTVRfQkdSMzIpKTsKIAkJCQlwaXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9CR1IzMjsKLQkJCQltYXNrMyB8PSAoMHgwNCA8PCA0KTsKKwkJCQltYXNrMyB8PSAoMHgwNCA8PCA1KTsKIAkJCQltYXNrMyB8PSAweDAxMDA7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zNjMsMTMgKzU2MCw4IEBACiAJCQkJfQogCQkJCWNhc2UgRklFTERfSU5URVJMQUNFRDogewogCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWkiKTsKLQkJCQkJZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIEZJRUxEX0FMVEVSTkFURTogewotCQkJCQlzdHJjcHkoJm5hbWU0WzBdLCAiLWEiKTsKIAkJCQkJbWFzazQgfD0gMHgxMDAwOwotCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfQUxURVJOQVRFOworCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWRlZmF1bHQ6CkBAIC00MTMsNyArNjA1LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBlYXN5Y2FwX2NvbnRyb2xbXSA9IFwKLSB7ewore3sKIC5pZCAgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCiAudHlwZSAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogLm5hbWUgICAgID0gIkJyaWdodG5lc3MiLApAQCAtNDg1LDUgKzY3Nyw1IEBACiB7CiAuaWQgPSAweEZGRkZGRkZGCiB9Ci0gfTsKK307CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKaW5kZXggNjM1NjJiZC4uMjRkOGJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwpAQCAtMzYsMTcgKzM2LDE1IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIE9OIENPTVBMRVRJT04gT0YgQU4gQVVESU8gVVJCIElUUyBEQVRBIElTIENPUElFRCBUTyBUSEUgQVVESU8gQlVGRkVSUwotICogIFBST1ZJREVEIHBlYXN5Y2FwLT5hdWRpb19pZGxlIElTIFpFUjAuICBSRUdBUkRMRVNTIE9GIFRISVMgQkVJTkcgVFJVRSwKKyAqICBQUk9WSURFRCBwZWFzeWNhcC0+YXVkaW9faWRsZSBJUyBaRVJPLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCiAgKiAgSVQgSVMgUkVTVUJNSVRURUQgUFJPVklERUQgcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nIElTIE5PVCBaRVJPLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCiBlYXN5c25kX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCiB7Ci1zdGF0aWMgaW50IG10Owogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfYnVmZmVyICpwYXVkaW9fYnVmZmVyOwotY2hhciBlcnJidWZbMTZdOwogX191OCAqcDEsICpwMjsKIF9fczE2IHMxNjsKIGludCBpLCBqLCBtb3JlLCBtdWNoLCBsZWFwLCByYzsKQEAgLTY2LDQ4ICs2NCw2MiBAQAogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybjsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwlyZXR1cm47Cit9CisKIG11Y2ggPSAwOwogCi0KIGlmIChwZWFzeWNhcC0+YXVkaW9faWRsZSkgewotCUpPVCgxNiwgIiVpPWF1ZGlvX2lkbGUgICVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCisJSk9NKDE2LCAiJWk9YXVkaW9faWRsZSAgJWk9YXVkaW9faXNvY19zdHJlYW1pbmdcbiIsIFwKIAkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlLCBwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpOwogCWlmIChwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKIAkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKDAgIT0gcmMpIHsKLQkJCVNBWSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsICIgXAorCQkJaWYgKC1FTk9ERVYgIT0gcmMpCisJCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgIiBcCiAJCQkJCSJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCB3aXRoIHJjOlxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKIAkJCXN3aXRjaCAocmMpIHsKIAkJCWNhc2UgLUVOT01FTTogewotCQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PTUVNXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTlhJTzogewotCQkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRU5YSU9cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUlOVkFMOiB7Ci0JCQkJU0FZKCJFSU5WQUxcbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUFHQUlOOiB7Ci0JCQkJU0FZKCJFQUdBSU5cbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FQUdBSU5cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUZCSUc6IHsKLQkJCQlTQVkoIkVGQklHXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVGQklHXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVQSVBFOiB7Ci0JCQkJU0FZKCJFUElQRVxuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FUElQRVxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTVNHU0laRTogewotCQkJCVNBWSgiRU1TR1NJWkVcbiIpOyAgYnJlYWs7CisJCQkJU0FNKCItRU1TR1NJWkVcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PU1BDOiB7Ci0JCQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCQkJU0FNKCItRU5PU1BDXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWRlZmF1bHQ6IHsKLQkJCQlTQVkoIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKKwkJCQlTQU0oInVua25vd24gZXJyb3I6IDB4JTA4WFxuIiwgcmMpOworCQkJCWJyZWFrOwogCQkJfQogCQkJfQogCQl9CkBAIC0xMTYsNzQgKzEyOCw5NSBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKHB1cmItPnN0YXR1cykgewotCWlmICgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgewotCQlKT1QoMTYsICJpbW1lZGlhdGUgcmV0dXJuIGJlY2F1c2UgLUVTSFVURE9XTj1wdXJiLT5zdGF0dXNcbiIpOworCWlmICgoLUVTSFVURE9XTiA9PSBwdXJiLT5zdGF0dXMpIHx8ICgtRU5PRU5UID09IHB1cmItPnN0YXR1cykpIHsKKwkJSk9NKDE2LCAidXJiIHN0YXR1cyAtRVNIVVRET1dOIG9yIC1FTk9FTlRcbiIpOwogCQlyZXR1cm47CiAJfQotCVNBWSgiRVJST1I6IG5vbi16ZXJvIHVyYiBzdGF0dXM6XG4iKTsKKwlTQU0oIkVSUk9SOiBub24temVybyB1cmIgc3RhdHVzOlxuIik7CiAJc3dpdGNoIChwdXJiLT5zdGF0dXMpIHsKIAljYXNlIC1FSU5QUk9HUkVTUzogewotCQlTQVkoIi1FSU5QUk9HUkVTU1xuIik7IGJyZWFrOworCQlTQU0oIi1FSU5QUk9HUkVTU1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9TUjogewotCQlTQVkoIi1FTk9TUlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9TUlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUElQRTogewotCQlTQVkoIi1FUElQRVxuIik7IGJyZWFrOworCQlTQU0oIi1FUElQRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FT1ZFUkZMT1c6IHsKLQkJU0FZKCItRU9WRVJGTE9XXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVPVkVSRkxPV1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUFJPVE86IHsKLQkJU0FZKCItRVBST1RPXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQUk9UT1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSUxTRVE6IHsKLQkJU0FZKCItRUlMU0VRXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJTFNFUVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FVElNRURPVVQ6IHsKLQkJU0FZKCItRVRJTUVET1VUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVUSU1FRE9VVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTVNHU0laRTogewotCQlTQVkoIi1FTVNHU0laRVxuIik7IGJyZWFrOworCQlTQU0oIi1FTVNHU0laRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FT1BOT1RTVVBQOiB7Ci0JCVNBWSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKKwkJU0FNKCItRU9QTk9UU1VQUFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUEZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRVBGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQRk5PU1VQUE9SVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRUFGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRk5PU1VQUE9SVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUREUklOVVNFOiB7Ci0JCVNBWSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJJTlVTRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQUREUk5PVEFWQUlMOiB7Ci0JCVNBWSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJOT1RBVkFJTFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9CVUZTOiB7Ci0JCVNBWSgiLUVOT0JVRlNcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PQlVGU1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSVNDT05OOiB7Ci0JCVNBWSgiLUVJU0NPTk5cbiIpOyBicmVhazsKKwkJU0FNKCItRUlTQ09OTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9UQ09OTjogewotCQlTQVkoIi1FTk9UQ09OTlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9UQ09OTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FU0hVVERPV046IHsKLQkJU0FZKCItRVNIVVRET1dOXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVTSFVURE9XTlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9FTlQ6IHsKLQkJU0FZKCItRU5PRU5UXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT0VOVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQ09OTlJFU0VUOiB7Ci0JCVNBWSgiLUVDT05OUkVTRVRcbiIpOyBicmVhazsKKwkJU0FNKCItRUNPTk5SRVNFVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9TUEM6IHsKLQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCVNBTSgiRU5PU1BDXG4iKTsKKwkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOyBicmVhazsKKwkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgMHglMDhYXG4iLCBwdXJiLT5zdGF0dXMpOworCQlicmVhazsKIAl9CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk2LDM1ICsyMjksNDMgQEAKIAlpZiAocGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CiAJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICgwICE9IHJjKSB7Ci0JCQlTQVkoIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCB1c2Jfc3VibWl0X3VyYigpICIKKwkJCVNBTSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgIgogCQkJCSJmYWlsZWQgd2l0aCByYzpcbiIsIHBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKIAkJCXN3aXRjaCAocmMpIHsKIAkJCWNhc2UgLUVOT01FTTogewotCQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PTUVNXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT0RFVjogewotCQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRU5PREVWXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJU0FZKCJFTlhJT1xuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FTlhJT1xuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQlTQVkoIkVJTlZBTFxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVJTlZBTFxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FQUdBSU46IHsKLQkJCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVBR0FJTlxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FRkJJRzogewotCQkJCVNBWSgiRUZCSUdcbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRUZCSUdcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQlTQVkoIkVQSVBFXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVQSVBFXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCQlTQU0oIi1FTVNHU0laRVxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7Ci0JCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CisJCQkJU0FNKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CiAJCQl9CiAJCQl9CiAJCX0KQEAgLTI0Myw3MyArMjg0LDgxIEBACiBmb3IgKGkgPSAwOyAgaSA8IHB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKIAlzd2l0Y2ggKHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgewogCWNhc2UgIDA6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICJPSyIpOyBicmVhazsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT0VOVDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9FTlQiKTsgYnJlYWs7CisJCVNBTSgiLUVOT0VOVFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSU5QUk9HUkVTUzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSU5QUk9HUkVTUyIpOyBicmVhazsKKwkJU0FNKCItRUlOUFJPR1JFU1NcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVBST1RPOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVQUk9UTyIpOyBicmVhazsKKwkJU0FNKCItRVBST1RPXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJTFNFUTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSUxTRVEiKTsgYnJlYWs7CisJCVNBTSgiLUVJTFNFUVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FVElNRTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FVElNRSIpOyBicmVhazsKKwkJU0FNKCItRVRJTUVcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVRJTUVET1VUOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVUSU1FRE9VVCIpOyBicmVhazsKKwkJU0FNKCItRVRJTUVET1VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVQSVBFOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVQSVBFIik7IGJyZWFrOworCQlTQU0oIi1FUElQRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQ09NTTogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09NTSIpOyBicmVhazsKKwkJU0FNKCItRUNPTU1cbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PU1I6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRU5PU1IiKTsgYnJlYWs7CisJCVNBTSgiLUVOT1NSXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVPVkVSRkxPVzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FT1ZFUkZMT1ciKTsgYnJlYWs7CisJCVNBTSgiLUVPVkVSRkxPV1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUkVNT1RFSU86IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVJFTU9URUlPIik7IGJyZWFrOworCQlTQU0oIi1FUkVNT1RFSU9cbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PREVWOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT0RFViIpOyBicmVhazsKKwkJU0FNKCItRU5PREVWXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVYREVWOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVYREVWIik7IGJyZWFrOworCQlTQU0oIi1FWERFVlxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FSU5WQUw6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRUlOVkFMIik7IGJyZWFrOworCQlTQU0oIi1FSU5WQUxcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRUNPTk5SRVNFVDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FQ09OTlJFU0VUIik7IGJyZWFrOworCQlTQU0oIi1FQ09OTlJFU0VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT1NQQzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9TUEMiKTsgYnJlYWs7CisJCVNBTSgiLUVOT1NQQ1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FU0hVVERPV046IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVNIVVRET1dOIik7IGJyZWFrOworCQlTQU0oIi1FU0hVVERPV05cbiIpOworCQlicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIlVOS05PV04iKTsgYnJlYWs7CisJCVNBTSgidW5rbm93biBlcnJvcjoweCUwOFhcbiIsIHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CisJCWJyZWFrOwogCX0KIAl9Ci0JaWYgKCghcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSAmJiAwKSB7Ci0JCUpPVCgxNiwgImZyYW1lWyUyaV06ICVpPXN0YXR1c3s9JTE2c30gICIgIFwKLQkJCQkJCSIlNWk9YWN0dWFsICAiICBcCi0JCQkJCQkiJTVpPWxlbmd0aCAgIiAgXAotCQkJCQkJIiUzaT1vZmZzZXRcbiIsIFwKLQkJCQlpLCBwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMsICZlcnJidWZbMF0sCi0JCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCwKLQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgsCi0JCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0KTsKLQl9CiAJaWYgKCFwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpIHsKIAkJbW9yZSA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CiAKQEAgLTMxOSwxMSArMzY4LDEyIEBACiAjZW5kaWYKIAogCQlpZiAoIW1vcmUpCi0JCQltdCsrOworCQkJcGVhc3ljYXAtPmF1ZGlvX210Kys7CiAJCWVsc2UgewotCQkJaWYgKG10KSB7Ci0JCQkJSk9UKDE2LCAiJTRpIGVtcHR5IGF1ZGlvIHVyYiBmcmFtZXNcbiIsIG10KTsKLQkJCQltdCA9IDA7CisJCQlpZiAocGVhc3ljYXAtPmF1ZGlvX210KSB7CisJCQkJSk9NKDE2LCAiJTRpIGVtcHR5IGF1ZGlvIHVyYiBmcmFtZXNcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fbXQpOworCQkJCXBlYXN5Y2FwLT5hdWRpb19tdCA9IDA7CiAJCQl9CiAKIAkJCXAxID0gKF9fdTggKikocHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgXApAQCAtMzQwLDEzICszOTAsMTMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAkJCXdoaWxlIChtb3JlKSB7CiAJCQkJaWYgKDAgPiBtb3JlKSB7Ci0JCQkJCVNBWSgiZWFzeXNuZF9jb21wbGV0ZTogTUlTVEFLRTogIiBcCisJCQkJCVNBTSgiZWFzeXNuZF9jb21wbGV0ZTogTUlTVEFLRTogIiBcCiAJCQkJCQkJIm1vcmUgaXMgbmVnYXRpdmVcbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkICIgXAorCQkJCQlTQU0oIkVSUk9SOiBiYWQgIiBcCiAJCQkJCQkicGVhc3ljYXAtPmF1ZGlvX2ZpbGxcbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtMzU1LDcgKzQwNSw3IEBACiAJCQkJCQkJW3BlYXN5Y2FwLT5hdWRpb19maWxsXTsKIAkJCQlpZiAoUEFHRV9TSVpFIDwgKHBhdWRpb19idWZmZXItPnB0byAtIFwKIAkJCQkJCXBhdWRpb19idWZmZXItPnBnbykpIHsKLQkJCQkJU0FZKCJFUlJPUjogYmFkIHBhdWRpb19idWZmZXItPnB0b1xuIik7CisJCQkJCVNBTSgiRVJST1I6IGJhZCBwYXVkaW9fYnVmZmVyLT5wdG9cbiIpOwogCQkJCQlyZXR1cm47CiAJCQkJfQogCQkJCWlmIChQQUdFX1NJWkUgPT0gKHBhdWRpb19idWZmZXItPnB0byAtIFwKQEAgLTM3NCw3ICs0MjQsNyBAQAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19maWxsKQogCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwgPSAwOwogCi0JCQkJCUpPVCgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+IiBcCisJCQkJCUpPTSgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+IiBcCiAJCQkJCQkJImF1ZGlvX2ZpbGwgdG8gJWlcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCk7CiAKQEAgLTM4Nyw3ICs0MzcsNyBAQAogCQkJCQlpZiAoIShwZWFzeWNhcC0+YXVkaW9fZmlsbCAlIFwKIAkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQlhdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSB7Ci0JCQkJCQlKT1QoMTIsICJ3YWtldXAgY2FsbCBvbiB3cV8iIFwKKwkJCQkJCUpPTSgxMiwgIndha2V1cCBjYWxsIG9uIHdxXyIgXAogCQkJCQkJImF1ZGlvLCAlaT1mcmFnIHJlYWRpbmcgICVpIiBcCiAJCQkJCQkiPWZyYWdtZW50IGZpbGxcbiIsIFwKIAkJCQkJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIFwKQEAgLTQxNCw3ICs0NjQsNyBAQAogCQkJCX0gZWxzZSB7CiAjaWYgZGVmaW5lZChVUFNBTVBMRSkKIAkJCQkJaWYgKG11Y2ggJSAxNikKLQkJCQkJCUpPVCg4LCAiTUlTVEFLRT8gbXVjaCIgXAorCQkJCQkJSk9NKDgsICJNSVNUQUtFPyBtdWNoIiBcCiAJCQkJCQkiIGlzIG5vdCBkaXZpc2libGUgYnkgMTZcbiIpOwogCQkJCQlpZiAobXVjaCA+ICgxNiAqIFwKIAkJCQkJCQltb3JlKSkKQEAgLTQ2OCw3ICs1MTgsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJSk9UKDEyLCAiZGlzY2FyZGluZyBhdWRpbyBzYW1wbGVzIGJlY2F1c2UgIiBcCisJCUpPTSgxMiwgImRpc2NhcmRpbmcgYXVkaW8gc2FtcGxlcyBiZWNhdXNlICIgXAogCQkJIiVpPXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1c1xuIiwgXAogCQkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cyk7CiAJfQpAQCAtNDg2LDM4ICs1MzYsNTAgQEAKIGlmIChwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAorCQlpZiAoLUVOT0RFViAhPSByYykgeworCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgIiBcCisJCQkJCSJ1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKIAkJCQkJIndpdGggcmM6XG4iLCBwZWFzeWNhcC0+YXVkaW9faWRsZSk7CisJCX0KIAkJc3dpdGNoIChyYykgewogCQljYXNlIC1FTk9NRU06IHsKLQkJCVNBWSgiRU5PTUVNXG4iKTsgICAgYnJlYWs7CisJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5PREVWOiB7Ci0JCQlTQVkoIkVOT0RFVlxuIik7ICAgIGJyZWFrOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5YSU86IHsKLQkJCVNBWSgiRU5YSU9cbiIpOyAgICAgYnJlYWs7CisJCQlTQU0oIi1FTlhJT1xuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FSU5WQUw6IHsKLQkJCVNBWSgiRUlOVkFMXG4iKTsgICAgYnJlYWs7CisJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUFHQUlOOiB7Ci0JCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJU0FNKCItRUFHQUlOXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVGQklHOiB7Ci0JCQlTQVkoIkVGQklHXG4iKTsgICAgIGJyZWFrOworCQkJU0FNKCItRUZCSUdcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRVBJUEU6IHsKLQkJCVNBWSgiRVBJUEVcbiIpOyAgICAgYnJlYWs7CisJCQlTQU0oIi1FUElQRVxuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FTVNHU0laRTogewotCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVOT1NQQzogewotCQkJU0FZKCJFTk9TUENcbiIpOyAgYnJlYWs7CisJCQlTQU0oIi1FTk9TUENcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJZGVmYXVsdDogewotCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CisJCQlTQU0oInVua25vd24gZXJyb3I6IDB4JTA4WFxuIiwgcmMpOworCQkJYnJlYWs7CiAJCX0KIAkJfQogCX0KQEAgLTUyOSw4ICs1OTEsNyBAQAogLyoKICAqICBUSEUgQVVESU8gVVJCUyBBUkUgU1VCTUlUVEVEIEFUIFRISVMgRUFSTFkgU1RBR0UgU08gVEhBVCBJVCBJUyBQT1NTSUJMRSBUTwogICogIFNUUkVBTSBGUk9NIC9kZXYvZWFzeXNuZDEgV0lUSCBTSU1QTEUgUFJPR1JBTVMgU1VDSCBBUyBjYXQgV0hJQ0ggRE8gTk9UCi0gKiAgSEFWRSBBTiBJT0NUTCBJTlRFUkZBQ0UuICBUSEUgVklERU8gVVJCUywgQlkgQ09OVFJBU1QsIE1VU1QgQkUgU1VCTUlUVEVECi0gKiAgTVVDSCBMQVRFUjogU0VFIENPTU1FTlRTIElOIEZJTEUgZWFzeWNhcF9tYWluLmMuCisgKiAgSEFWRSBBTiBJT0NUTCBJTlRFUkZBQ0UuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludApAQCAtNTM5LDggKzYwMCwxNSBAQAogc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZXJmYWNlOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogaW50IHN1Ym1pbm9yLCByYzsKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorc3RydWN0IHY0bDJfZGV2aWNlICpwdjRsMl9kZXZpY2U7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwogCi1KT1QoNCwgImJlZ2lucy5cbiIpOworSk9UKDQsICJiZWdpbnNcbiIpOwogCiBzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CiAKQEAgLTU1Niw3MCArNjI0LDkwIEBACiAJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOwogCXJldHVybiAtMTsKIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQorIworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2Vsc2UKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgU09NRSBWRVJTSU9OUyBPRiBUSEUgdmlkZW9kZXYgTU9EVUxFIE9WRVJXUklURSBUSEUgREFUQSBXSElDSCBIQVMKKyAqICBCRUVOIFdSSVRURU4gQlkgVEhFIENBTEwgVE8gdXNiX3NldF9pbnRmZGF0YSgpIElOIGVhc3ljYXBfdXNiX3Byb2JlKCksCisgKiAgUkVQTEFDSU5HIElUIFdJVEggQSBQT0lOVEVSIFRPIFRIRSBFTUJFRERFRCB2NGwyX2RldmljZSBTVFJVQ1RVUkUuCisgKiAgVE8gREVURUNUIFRISVMsIFRIRSBTVFJJTkcgSU4gVEhFIGVhc3ljYXAudGVsbHRhbGVbXSBCVUZGRVIgSVMgQ0hFQ0tFRC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCXB2NGwyX2RldmljZSA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UpOworCWlmICgoc3RydWN0IHY0bDJfZGV2aWNlICopTlVMTCA9PSBwdjRsMl9kZXZpY2UpIHsKKwkJU0FZKCJFUlJPUjogcHY0bDJfZGV2aWNlIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKikgXAorCQljb250YWluZXJfb2YocHY0bDJfZGV2aWNlLCBzdHJ1Y3QgZWFzeWNhcCwgdjRsMl9kZXZpY2UpOworfQorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyMKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGVhc3ljYXA7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgSU5JVElBTElaQVRJT04uCisgKiAgSU5JVElBTElaQVRJT04KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJzdGFydGluZyBpbml0aWFsaXphdGlvblxuIik7CitKT00oNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKIAogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOwotfSBlbHNlIHsKLQlKT1QoMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgXAotCQkJCQkobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7CiB9CitKT00oMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgKGxvbmcgaW50KXBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CiAKIHJjID0gYXVkaW9fc2V0dXAocGVhc3ljYXApOwogaWYgKDAgPD0gcmMpCi0JSk9UKDgsICJhdWRpb19zZXR1cCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJhdWRpb19zZXR1cCgpIHJldHVybmVkICVpXG4iLCByYyk7CiBlbHNlCi0JSk9UKDgsICJlYXN5c25kIG9wZW4oKTogRVJST1I6IGF1ZGlvX3NldHVwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlKT00oOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogYXVkaW9fc2V0dXAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X3ZvbHVtZShwZWFzeWNhcCwgLTgxOTIpOwotaWYgKDAgIT0gcmMpIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3Rfdm9sdW1lKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIHJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKLUpPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKK0pPTSg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24sIHJjKTsKIAotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19CiByYyA9IHdha2V1cF9kZXZpY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKIGlmICgwID09IHJjKQotCUpPVCg4LCAid2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJ3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIGVsc2UKLQlKT1QoOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJSk9NKDgsICJFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CiAKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBoYXMgYmVjb21lIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOwotfQotc3VibWl0X2F1ZGlvX3VyYnMocGVhc3ljYXApOworcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDA7CiBwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDA7CiAKIHBlYXN5Y2FwLT50aW1ldmFsMS50dl9zZWMgID0gMDsKIHBlYXN5Y2FwLT50aW1ldmFsMS50dl91c2VjID0gMDsKIAotSk9UKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CitzdWJtaXRfYXVkaW9fdXJicyhwZWFzeWNhcCk7CisKK0pPTSg0LCAiZmluaXNoZWQgaW5pdGlhbGl6YXRpb25cbiIpOwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02MzUsMTEgKzcyMywxNSBAQAogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMLlxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1pZiAoMCAhPSBraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApKSB7Ci0JU0FZKCJFUlJPUjoga2lsbF9hdWRpb191cmJzKCkgZmFpbGVkXG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLUpPVCg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CitpZiAoMCAhPSBraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApKSB7CisJU0FNKCJFUlJPUjoga2lsbF9hdWRpb191cmJzKCkgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK0pPTSg0LCAiZW5kaW5nIHN1Y2Nlc3NmdWxseVxuIik7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY0OCwxMiArNzQwLDExIEBACiAJCQkJCQlzaXplX3Qga291bnQsIGxvZmZfdCAqcG9mZikKIHsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWw7Ci1zdGF0aWMgc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7Ci1zdGF0aWMgbG9uZyBsb25nIGludCBhdWRpb19ieXRlcywgYWJvdmUsIGJlbG93LCBtZWFuOworbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3csIG1lYW47CiBzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOwogdW5zaWduZWQgY2hhciAqcDA7CiBsb25nIGludCBrb3VudDEsIG1vcmUsIHJjLCBsMCwgbG07Ci1pbnQgZnJhZ21lbnQ7CitpbnQgZnJhZ21lbnQsIGtkOwogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IGRhdGFfYnVmZmVyICpwZGF0YV9idWZmZXI7CiBzaXplX3Qgc3pyZXQ7CkBAIC02NzEsMjMgKzc2Miw4OSBAQAogCiBKT1QoOCwgIj09PT09IGVhc3lzbmRfcmVhZCgpOiBrb3VudD0laSwgKnBvZmY9JWlcbiIsIChpbnQpa291bnQsIChpbnQpKCpwb2ZmKSk7CiAKLXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopKGZpbGUtPnByaXZhdGVfZGF0YSk7CitpZiAoTlVMTCA9PSBmaWxlKSB7CisJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KK3BlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SIGluIGVhc3lzbmRfcmVhZCgpOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBWSgiRVJST1IgaW4gZWFzeXNuZF9yZWFkKCk6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOworaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAsCisgKiAgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorICogIElGIE5FQ0VTU0FSWSwgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChrZCAhPSBpc2RvbmdsZShwZWFzeWNhcCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaWYgKE5VTEwgPT0gZmlsZSkgeworCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCBcCisJCQkJCQkodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAgQkVGT1JFIFRIRQorICogIEFUVEVNUFQgVE8gQUNRVUlSRSBUSEUgU0VNQVBIT1JFLCBpc2RvbmdsZSgpIFdJTEwgSEFWRSBGQUlMRUQuICBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwlKT1QoMTYsICJOT05CTE9DSyAga291bnQ9JWksICpwb2ZmPSVpXG4iLCAoaW50KWtvdW50LCAoaW50KSgqcG9mZikpOworZWxzZQorCUpPVCg4LCAiQkxPQ0tJTkcgIGtvdW50PSVpLCAqcG9mZj0laVxuIiwgKGludClrb3VudCwgKGludCkoKnBvZmYpKTsKKwogaWYgKCgwID4gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpIHx8IFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IHBlYXN5Y2FwLT5hdWRpb19yZWFkKSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CiBpZiAoKHN0cnVjdCBkYXRhX2J1ZmZlciAqKU5VTEwgPT0gcGRhdGFfYnVmZmVyKSB7Ci0JU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1KT1QoMTIsICJiZWZvcmUgd2FpdCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKK0pPTSgxMiwgImJlZm9yZSB3YWl0LCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CiBmcmFnbWVudCA9IChwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpOwpAQCAtNjk1LDcgKzg1Miw4IEBACiAJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpIHx8IFwKIAkJKDAgPT0gKFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKSkpKSB7CiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAtRUFHQUlOIGFzIGluc3RydWN0ZWRcbiIpOworCQlKT00oMTYsICJyZXR1cm5pbmcgLUVBR0FJTiBhcyBpbnN0cnVjdGVkXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocGVhc3ljYXAtPndxX2F1ZGlvLCBcCkBAIC03MDQsNTAgKzg2Miw1NiBAQAogCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSAmJiBcCiAJCSgwIDwgKFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKSkpKSkpOwogCWlmICgwICE9IHJjKSB7Ci0JCVNBWSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOworCQlTQU0oImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAlpZiAocGVhc3ljYXAtPmF1ZGlvX2VvZikgewotCQlKT1QoOCwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2VvZlxuIiwgXAorCQlKT00oOCwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2VvZlxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19lb2YpOwogCQlraWxsX2F1ZGlvX3VyYnMocGVhc3ljYXApOwotCQltc2xlZXAoNTAwKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBlYXN5Y2FwLT5hdWRpb19pZGxlKSB7Ci0JCUpPVCgxNiwgInJldHVybmluZyAwIGJlY2F1c2UgICVpPWF1ZGlvX2lkbGVcbiIsIFwKKwkJSk9NKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9faWRsZVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKLQkJSk9UKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSBhdWRpbyB1cmJzIG5vdCBzdHJlYW1pbmdcbiIpOworCQlKT00oMTYsICJyZXR1cm5pbmcgMCBiZWNhdXNlIGF1ZGlvIHVyYnMgbm90IHN0cmVhbWluZ1xuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIDA7CiAJfQogfQotSk9UKDEyLCAiYWZ0ZXIgIHdhaXQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCitKT00oMTIsICJhZnRlciAgd2FpdCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCksIFwKIAkJKHBlYXN5Y2FwLT5hdWRpb19maWxsIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpOwogc3pyZXQgPSAoc2l6ZV90KTA7CiB3aGlsZSAoZnJhZ21lbnQgPT0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXAogCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKSB7CiAJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wZ28pIHsKLQkJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wZ28gaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoTlVMTCA9PSBwZGF0YV9idWZmZXItPnB0bykgewotCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnB0byBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWtvdW50MSA9IFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKTsKIAlpZiAoMCA+IGtvdW50MSkgewotCQlTQVkoImVhc3lzbmRfcmVhZDogTUlTVEFLRToga291bnQxIGlzIG5lZ2F0aXZlXG4iKTsKKwkJU0FNKCJlYXN5c25kX3JlYWQ6IE1JU1RBS0U6IGtvdW50MSBpcyBuZWdhdGl2ZVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJaWYgKCFrb3VudDEpIHsKIAkJKHBlYXN5Y2FwLT5hdWRpb19yZWFkKSsrOwogCQlpZiAocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpCiAJCQlwZWFzeWNhcC0+YXVkaW9fcmVhZCA9IDA7Ci0JCUpPVCgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+YXVkaW9fcmVhZCB0byAlaVxuIiwgXAorCQlKT00oMTIsICJidW1wZWQgcGVhc3ljYXAtPmF1ZGlvX3JlYWQgdG8gJWlcbiIsIFwKIAkJCQkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkKTsKIAogCQlpZiAoZnJhZ21lbnQgIT0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXApAQCAtNzU3LDMwICs5MjEsMzQgQEAKIAkJaWYgKCgwID4gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpIHx8IFwKIAkJCShwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA8PSBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkKSkgewotCQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5hdWRpb19yZWFkIG91dCBvZiByYW5nZVxuIik7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlwZGF0YV9idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltwZWFzeWNhcC0+YXVkaW9fcmVhZF07CiAJCWlmICgoc3RydWN0IGRhdGFfYnVmZmVyICopTlVMTCA9PSBwZGF0YV9idWZmZXIpIHsKLQkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlciBpcyBOVUxMXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cGdvKSB7Ci0JCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnBnbyBpcyBOVUxMXG4iKTsKKwkJCVNBTSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wdG8pIHsKLQkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cHRvIGlzIE5VTExcbiIpOworCQkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlrb3VudDEgPSBQQUdFX1NJWkUgLSAocGRhdGFfYnVmZmVyLT5wdG8gLSBwZGF0YV9idWZmZXItPnBnbyk7CiAJfQotCUpPVCgxMiwgInJlYWR5ICB0byBzZW5kICVsaSBieXRlc1xuIiwgKGxvbmcgaW50KSBrb3VudDEpOwotCUpPVCgxMiwgInN0aWxsICB0byBzZW5kICVsaSBieXRlc1xuIiwgKGxvbmcgaW50KSBrb3VudCk7CisJSk9NKDEyLCAicmVhZHkgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50MSk7CisJSk9NKDEyLCAic3RpbGwgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50KTsKIAltb3JlID0ga291bnQxOwogCWlmIChtb3JlID4ga291bnQpCiAJCW1vcmUgPSBrb3VudDsKLQlKT1QoMTIsICJhZ3JlZWQgdG8gc2VuZCAlbGkgYnl0ZXMgZnJvbSBwYWdlICVpXG4iLCBcCisJSk9NKDEyLCAiYWdyZWVkIHRvIHNlbmQgJWxpIGJ5dGVzIGZyb20gcGFnZSAlaVxuIiwgXAogCQkJCQkJbW9yZSwgcGVhc3ljYXAtPmF1ZGlvX3JlYWQpOwogCWlmICghbW9yZSkKIAkJYnJlYWs7CkBAIC03OTgsNyArOTY2LDggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlyYyA9IGNvcHlfdG9fdXNlcihwdXNlcnNwYWNlYnVmZmVyLCBwZGF0YV9idWZmZXItPnB0bywgbW9yZSk7CiAJaWYgKDAgIT0gcmMpIHsKLQkJU0FZKCJFUlJPUjogY29weV90b191c2VyKCkgcmV0dXJuZWQgJWxpXG4iLCByYyk7CisJCVNBTSgiRVJST1I6IGNvcHlfdG9fdXNlcigpIHJldHVybmVkICVsaVxuIiwgcmMpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAkqcG9mZiArPSAobG9mZl90KW1vcmU7CkBAIC04MDcsMTEgKzk3NiwxMSBAQAogCXB1c2Vyc3BhY2VidWZmZXIgKz0gbW9yZTsKIAlrb3VudCAtPSAoc2l6ZV90KW1vcmU7CiB9Ci1KT1QoMTIsICJhZnRlciAgcmVhZCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKK0pPTSgxMiwgImFmdGVyICByZWFkLCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CiBpZiAoa291bnQgPCAwKSB7Ci0JU0FZKCJNSVNUQUtFOiAgJWxpPWtvdW50ICAlbGk9c3pyZXRcbiIsIFwKKwlTQU0oIk1JU1RBS0U6ICAlbGk9a291bnQgICVsaT1zenJldFxuIiwgXAogCQkJCQkobG9uZyBpbnQpa291bnQsIChsb25nIGludClzenJldCk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC04MjcsMTEgKzk5NiwxMSBAQAogCW1lYW4gPSBwZWFzeWNhcC0+YXVkaW9fbml2ZWF1OwogCXNkciA9IHNpZ25lZF9kaXYobWVhbiwgcGVhc3ljYXAtPmF1ZGlvX3NhbXBsZSk7CiAKLQlKT1QoOCwgIiU4bGxpPW1lYW4gICU4bGxpPW1lYW5zcXVhcmUgYWZ0ZXIgJWxsaSBzYW1wbGVzLCA9PlxuIiwgXAorCUpPTSg4LCAiJThsbGk9bWVhbiAgJThsbGk9bWVhbnNxdWFyZSBhZnRlciAlbGxpIHNhbXBsZXMsID0+XG4iLCBcCiAJCQkJc2RyLnF1b3RpZW50LCBhYm92ZSwgcGVhc3ljYXAtPmF1ZGlvX3NhbXBsZSk7CiAKIAlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCAzMjc2OCk7Ci0JSk9UKDgsICJhdWRpbyBkeW5hbWljIHJhbmdlIGlzIHJvdWdobHkgJWxsaVxuIiwgc2RyLnF1b3RpZW50KTsKKwlKT00oOCwgImF1ZGlvIGR5bmFtaWMgcmFuZ2UgaXMgcm91Z2hseSAlbGxpXG4iLCBzZHIucXVvdGllbnQpOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTg0MCwzMyArMTAwOSwyOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKIGlmICghcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3NlYykgewotCWF1ZGlvX2J5dGVzID0gMDsKLQl0aW1ldmFsMSA9IHRpbWV2YWw7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JcGVhc3ljYXAtPnRpbWV2YWwxID0gdGltZXZhbDE7Ci0JbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CisJcGVhc3ljYXAtPmF1ZGlvX2J5dGVzID0gMDsKKwlwZWFzeWNhcC0+dGltZXZhbDMgPSB0aW1ldmFsOworCXBlYXN5Y2FwLT50aW1ldmFsMSA9IHBlYXN5Y2FwLT50aW1ldmFsMzsKIAlzZHIucXVvdGllbnQgPSAxOTIwMDA7CiB9IGVsc2UgewotCWF1ZGlvX2J5dGVzICs9IChsb25nIGxvbmcgaW50KSBzenJldDsKKwlwZWFzeWNhcC0+YXVkaW9fYnl0ZXMgKz0gKGxvbmcgbG9uZyBpbnQpIHN6cmV0OwogCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKiBcCi0JCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgIC0gdGltZXZhbDEudHZfc2VjKSkgKyBcCi0JCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSB0aW1ldmFsMS50dl91c2VjKTsKLQlhYm92ZSA9IDEwMDAwMDAgKiAoKGxvbmcgbG9uZyBpbnQpIGF1ZGlvX2J5dGVzKTsKKwkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAgLSBcCisJCQkJCQlwZWFzeWNhcC0+dGltZXZhbDMudHZfc2VjKSkgKyBcCisJCShsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDMudHZfdXNlYyk7CisJYWJvdmUgPSAxMDAwMDAwICogKChsb25nIGxvbmcgaW50KSBwZWFzeWNhcC0+YXVkaW9fYnl0ZXMpOwogCiAJaWYgKGJlbG93KQogCQlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCBiZWxvdyk7CiAJZWxzZQogCQlzZHIucXVvdGllbnQgPSAxOTIwMDA7CiB9Ci1KT1QoOCwgImF1ZGlvIHN0cmVhbWluZyBhdCAlbGxpIGJ5dGVzL3NlY29uZFxuIiwgc2RyLnF1b3RpZW50KTsKLWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOworSk9NKDgsICJhdWRpbyBzdHJlYW1pbmcgYXQgJWxsaSBieXRlcy9zZWNvbmRcbiIsIHNkci5xdW90aWVudCk7CiBwZWFzeWNhcC0+ZG5ieWR0ID0gc2RyLnF1b3RpZW50OwotbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwxKSk7CiAKLUpPVCg4LCAicmV0dXJuaW5nICVsaVxuIiwgKGxvbmcgaW50KXN6cmV0KTsKK0pPTSg4LCAicmV0dXJuaW5nICVsaVxuIiwgKGxvbmcgaW50KXN6cmV0KTsKK211dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIHJldHVybiBzenJldDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg4MSwyNyArMTA0NSwzMSBAQAogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiBzdHJ1Y3QgdXJiICpwdXJiOwogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKLWludCBqLCBpc2JhZCwgbSwgcmM7CitpbnQgaiwgaXNiYWQsIG5vc3BjLCBtLCByYzsKIGludCBpc2J1ZjsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+dXJiX2F1ZGlvX2hlYWQgdW5pbml0aWFsaXplZFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogaWYgKCFwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKLQlKT1QoNCwgImluaXRpYWwgc3VibWlzc2lvbiBvZiBhbGwgYXVkaW8gdXJic1xuIik7CisJSk9NKDQsICJpbml0aWFsIHN1Ym1pc3Npb24gb2YgYWxsIGF1ZGlvIHVyYnNcbiIpOwogCXJjID0gdXNiX3NldF9pbnRlcmZhY2UocGVhc3ljYXAtPnB1c2JfZGV2aWNlLAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uKTsKLQlKT1QoOCwgInVzYl9zZXRfaW50ZXJmYWNlKC4sJWksJWkpIHJldHVybmVkICVpXG4iLCBcCisJSk9NKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSByZXR1cm5lZCAlaVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19hbHRzZXR0aW5nX29uLCByYyk7CiAKLQlpc2JhZCA9IDA7ICBtID0gMDsKKwlpc2JhZCA9IDA7ICBub3NwYyA9IDA7ICBtID0gMDsKIAlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewogCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKIAkJaWYgKE5VTEwgIT0gcGRhdGFfdXJiKSB7CkBAIC05MzgsMzkgKzExMDYsNDkgQEAKIAkJCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9LRVJORUwpOwogCQkJCWlmICgwICE9IHJjKSB7CiAJCQkJCWlzYmFkKys7Ci0JCQkJCVNBWSgiRVJST1I6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIiBcCisJCQkJCVNBTSgiRVJST1I6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIiBcCiAJCQkJCQkJIiBmb3IgdXJiIHdpdGggcmM6XG4iKTsKIAkJCQkJc3dpdGNoIChyYykgewogCQkJCQljYXNlIC1FTk9NRU06IHsKLQkJCQkJCVNBWSgiRU5PTUVNXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5PREVWOiB7Ci0JCQkJCQlTQVkoIkVOT0RFVlxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRU5PREVWXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJCQlTQVkoIkVOWElPXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FTlhJT1xuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQkJCVNBWSgiRUlOVkFMXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FSU5WQUxcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUFHQUlOOiB7Ci0JCQkJCQlTQVkoIkVBR0FJTlxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRUFHQUlOXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVGQklHOiB7Ci0JCQkJCQlTQVkoIkVGQklHXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FRkJJR1xuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FUElQRTogewotCQkJCQkJU0FZKCJFUElQRVxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRVBJUEVcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU1TR1NJWkU6IHsKLQkJCQkJCVNBWSgiRU1TR1NJWkVcbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVOT1NQQzogewotCQkJCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCQkJCW5vc3BjKys7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAlaVxuIixcCi0JCQkJCQkJCSByYyk7IGJyZWFrOworCQkJCQkJU0FNKCJ1bmtub3duIGVycm9yIGNvZGUgJWlcbiIsXAorCQkJCQkJCQkgcmMpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJfQogCQkJCX0gZWxzZSB7CkBAIC05ODMsOCArMTE2MSwxMyBAQAogCQkJaXNiYWQrKzsKIAkJfQogCX0KKwlpZiAobm9zcGMpIHsKKwkJU0FNKCItRU5PU1BDPXVzYl9zdWJtaXRfdXJiKCkgZm9yICVpIHVyYnNcbiIsIG5vc3BjKTsKKwkJU0FNKCIuLi4uLiAgcG9zc2libHkgaW5hZGVxdWF0ZSBVU0IgYmFuZHdpZHRoXG4iKTsKKwkJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7CisJfQogCWlmIChpc2JhZCkgewotCQlKT1QoNCwgImF0dGVtcHRpbmcgY2xlYW51cCBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmdcbiIpOworCQlKT00oNCwgImF0dGVtcHRpbmcgY2xlYW51cCBpbnN0ZWFkIG9mIHN1Ym1pdHRpbmdcbiIpOwogCQlsaXN0X2Zvcl9lYWNoKHBsaXN0X2hlYWQsIChwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgewogCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIFwKIAkJCQkJCQkJbGlzdF9oZWFkKTsKQEAgLTk5NywxMCArMTE4MCwxMCBAQAogCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOwogCX0gZWxzZSB7CiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyA9IDE7Ci0JCUpPVCg0LCAic3VibWl0dGVkICVpIGF1ZGlvIHVyYnNcbiIsIG0pOworCQlKT00oNCwgInN1Ym1pdHRlZCAlaSBhdWRpbyB1cmJzXG4iLCBtKTsKIAl9CiB9IGVsc2UKLQlKT1QoNCwgImFscmVhZHkgc3RyZWFtaW5nIGF1ZGlvIHVyYnNcbiIpOworCUpPTSg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgYXVkaW8gdXJic1xuIik7CiAKIHJldHVybiAwOwogfQpAQCAtMTAxNywxMCArMTIwMCwxNCBAQAogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKIHN0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewogCWlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewogCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgPSAwOwotCQlKT1QoNCwgImtpbGxpbmcgYXVkaW8gdXJic1xuIik7CisJCUpPTSg0LCAia2lsbGluZyBhdWRpbyB1cmJzXG4iKTsKIAkJbSA9IDA7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwKQEAgLTEwMzIsMTMgKzEyMTksMTMgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJSk9UKDQsICIlaSBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgbSk7CisJCUpPTSg0LCAiJWkgYXVkaW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0gZWxzZSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIH0gZWxzZSB7Ci0JSk9UKDgsICIlaT1hdWRpb19pc29jX3N0cmVhbWluZywgbm8gYXVkaW8gdXJicyBraWxsZWRcbiIsIFwKKwlKT00oOCwgIiVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nLCBubyBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpOwogfQogcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKaW5kZXggM2MyY2UyOC4uZTI3ZGZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYwpAQCAtMjksMzcgKzI5LDY5IEBACiAjaW5jbHVkZSAiZWFzeWNhcF9kZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFRFU1RDQVJEX0JZVEVTUEVSTElORSAoMiAqIDE0NDApCisjZGVmaW5lIFRFU1RDQVJEX0JZVEVTUEVSTElORSAoMiAqIDcyMCkKIHZvaWQKLWVhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgZmllbGRfZmlsbCkKK2Vhc3ljYXBfdGVzdGNhcmQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwLCBpbnQgZmllbGQpCiB7CiBpbnQgdG90YWw7CiBpbnQgeSwgdSwgdiwgciwgZywgYjsKIHVuc2lnbmVkIGNoYXIgdXl2eVs0XTsKLQotaW50IGkxLCBsaW5lLCBrLCBtLCBuLCBtb3JlLCBtdWNoLCBiYXJ3aWR0aDsKK2ludCBpMSwgbGluZSwgaywgbSwgbiwgbW9yZSwgbXVjaCwgYmFyd2lkdGgsIGJhcmhlaWdodDsKIHVuc2lnbmVkIGNoYXIgYmZiYXJbVEVTVENBUkRfQllURVNQRVJMSU5FIC8gOF0sICpwMSwgKnAyOwogc3RydWN0IGRhdGFfYnVmZmVyICpwZmllbGRfYnVmZmVyOwogCi1KT1QoOCwgIiVpPWZpZWxkX2ZpbGxcbiIsIGZpZWxkX2ZpbGwpOwotCi1pZiAoKFRFU1RDQVJEX0JZVEVTUEVSTElORSAvIDIpIDwgcGVhc3ljYXAtPndpZHRoKSB7Ci0JU0FZKCJFUlJPUjogaW1hZ2UgaXMgdG9vIHdpZGVcbiIpOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm47CiB9Ci1pZiAocGVhc3ljYXAtPndpZHRoICUgMTYpIHsKLQlTQVkoIkVSUk9SOiBpbmRpdmlzaWJsZSBpbWFnZSB3aWR0aFxuIik7CitKT00oOCwgIiVpPWZpZWxkXG4iLCBmaWVsZCk7Citzd2l0Y2ggKHBlYXN5Y2FwLT53aWR0aCkgeworY2FzZSA3MjA6CitjYXNlIDM2MDogeworCWJhcndpZHRoID0gKDIgKiA3MjApIC8gODsKKwlicmVhazsKK30KK2Nhc2UgNzA0OgorY2FzZSAzNTI6IHsKKwliYXJ3aWR0aCA9ICgyICogNzA0KSAvIDg7CisJYnJlYWs7Cit9CitjYXNlIDY0MDoKK2Nhc2UgMzIwOiB7CisJYmFyd2lkdGggPSAoMiAqIDY0MCkgLyA4OworCWJyZWFrOworfQorZGVmYXVsdDogeworCVNBTSgiRVJST1I6ICBjYW5ub3Qgc2V0IGJhcndpZHRoXG4iKTsKIAlyZXR1cm47CiB9Ci0KK30KK2lmIChURVNUQ0FSRF9CWVRFU1BFUkxJTkUgPCBiYXJ3aWR0aCkgeworCVNBTSgiRVJST1I6IGJhcndpZHRoIGlzIHRvbyBsYXJnZVxuIik7CisJcmV0dXJuOworfQorc3dpdGNoIChwZWFzeWNhcC0+aGVpZ2h0KSB7CitjYXNlIDU3NjoKK2Nhc2UgMjg4OiB7CisJYmFyaGVpZ2h0ID0gNTc2OworCWJyZWFrOworfQorY2FzZSA0ODA6CitjYXNlIDI0MDogeworCWJhcmhlaWdodCA9IDQ4MDsKKwlicmVhazsKK30KK2RlZmF1bHQ6IHsKKwlTQU0oIkVSUk9SOiBjYW5ub3Qgc2V0IGJhcmhlaWdodFxuIik7CisJcmV0dXJuOworfQorfQogdG90YWwgPSAwOwotYmFyd2lkdGggPSAoMiAqIHBlYXN5Y2FwLT53aWR0aCkgLyA4OwotCi1rID0gZmllbGRfZmlsbDsKK2sgPSBmaWVsZDsKIG0gPSAwOwogbiA9IDA7CiAKLWZvciAobGluZSA9IDA7ICBsaW5lIDwgKHBlYXN5Y2FwLT5oZWlnaHQgLyAyKTsgIGxpbmUrKykgeworZm9yIChsaW5lID0gMDsgIGxpbmUgPCAoYmFyaGVpZ2h0IC8gMik7ICBsaW5lKyspIHsKIAlmb3IgKGkxID0gMDsgIGkxIDwgODsgIGkxKyspIHsKIAkJciA9IChpMSAqIDI1NikvODsKIAkJZyA9IChpMSAqIDI1NikvODsKQEAgLTg4LDE1ICsxMjAsMTUgQEAKIAogCQl3aGlsZSAobW9yZSkgewogCQkJaWYgKChGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpIDw9IG0pIHsKLQkJCQlTQVkoIkVSUk9SOiAgYmFkIG0gcmVhY2hlZFxuIik7CisJCQkJU0FNKCJFUlJPUjogIGJhZCBtIHJlYWNoZWRcbiIpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJaWYgKFBBR0VfU0laRSA8IG4pIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgbiByZWFjaGVkXG4iKTsgcmV0dXJuOworCQkJU0FNKCJFUlJPUjogIGJhZCBuIHJlYWNoZWRcbiIpOyByZXR1cm47CiAJCX0KIAogCQlpZiAoMCA+IG1vcmUpIHsKLQkJCVNBWSgiRVJST1I6ICBpbnRlcm5hbCBmYXVsdFxuIik7CisJCQlTQU0oIkVSUk9SOiAgaW50ZXJuYWwgZmF1bHRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTExNywxMCArMTQ5LDYgQEAKIAkJfQogCX0KIH0KLQotSk9UKDgsICIlaT10b3RhbFxuIiwgdG90YWwpOwotaWYgKHRvdGFsICE9IHBlYXN5Y2FwLT53aWR0aCAqIHBlYXN5Y2FwLT5oZWlnaHQpCi0JU0FZKCJFUlJPUjogd3JvbmcgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW46ICAlaVxuIiwgdG90YWwpOwogcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTU3LDM1ICsxODUsMzUgQEAKIAkJcHJpbnRmKCIlNmksICIsIGkyKTsgIHByaW50ZigiJTZpXG59O1xuIiwgaTIpOwogCQl9CiAJfQotcmV0dXJuKDApOworcmV0dXJuIDA7CiB9CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQgdG9uZXNbMjA0OF0gPSB7Ci0gICAgIDAsICAgICAwLCAgIDUwMiwgICA1MDIsICAxMDA0LCAgMTAwNCwgIDE1MDUsICAxNTA1LCAgMjAwNSwgIDIwMDUsCi0gIDI1MDMsICAyNTAzLCAgMjk5OCwgIDI5OTgsICAzNDkxLCAgMzQ5MSwgIDM5ODAsICAzOTgwLCAgNDQ2NiwgIDQ0NjYsCi0gIDQ5NDgsICA0OTQ4LCAgNTQyNCwgIDU0MjQsICA1ODk2LCAgNTg5NiwgIDYzNjIsICA2MzYyLCAgNjgyMiwgIDY4MjIsCi0gIDcyNzYsICA3Mjc2LCAgNzcyMywgIDc3MjMsICA4MTYyLCAgODE2MiwgIDg1OTQsICA4NTk0LCAgOTAxOCwgIDkwMTgsCi0gIDk0MzQsICA5NDM0LCAgOTg0MCwgIDk4NDAsIDEwMjM3LCAxMDIzNywgMTA2MjUsIDEwNjI1LCAxMTAwMiwgMTEwMDIsCi0gMTEzNzAsIDExMzcwLCAxMTcyNiwgMTE3MjYsIDEyMDcyLCAxMjA3MiwgMTI0MDYsIDEyNDA2LCAxMjcyOCwgMTI3MjgsCi0gMTMwMzgsIDEzMDM4LCAxMzMzNywgMTMzMzcsIDEzNjIyLCAxMzYyMiwgMTM4OTUsIDEzODk1LCAxNDE1NSwgMTQxNTUsCi0gMTQ0MDEsIDE0NDAxLCAxNDYzNCwgMTQ2MzQsIDE0ODUzLCAxNDg1MywgMTUwNTgsIDE1MDU4LCAxNTI0OSwgMTUyNDksCi0gMTU0MjYsIDE1NDI2LCAxNTU4OCwgMTU1ODgsIDE1NzM1LCAxNTczNSwgMTU4NjgsIDE1ODY4LCAxNTk4NSwgMTU5ODUsCi0gMTYwODgsIDE2MDg4LCAxNjE3NSwgMTYxNzUsIDE2MjQ4LCAxNjI0OCwgMTYzMDUsIDE2MzA1LCAxNjM0NiwgMTYzNDYsCi0gMTYzNzIsIDE2MzcyLCAxNjM4MywgMTYzODMsIDE2Mzc5LCAxNjM3OSwgMTYzNTksIDE2MzU5LCAxNjMyMywgMTYzMjMsCi0gMTYyNzIsIDE2MjcyLCAxNjIwNiwgMTYyMDYsIDE2MTI1LCAxNjEyNSwgMTYwMjgsIDE2MDI4LCAxNTkxNywgMTU5MTcsCi0gMTU3OTAsIDE1NzkwLCAxNTY0OSwgMTU2NDksIDE1NDkyLCAxNTQ5MiwgMTUzMjIsIDE1MzIyLCAxNTEzNiwgMTUxMzYsCi0gMTQ5MzcsIDE0OTM3LCAxNDcyMywgMTQ3MjMsIDE0NDk2LCAxNDQ5NiwgMTQyNTUsIDE0MjU1LCAxNDAwMSwgMTQwMDEsCi0gMTM3MzMsIDEzNzMzLCAxMzQ1MiwgMTM0NTIsIDEzMTU5LCAxMzE1OSwgMTI4NTQsIDEyODU0LCAxMjUzNiwgMTI1MzYsCi0gMTIyMDcsIDEyMjA3LCAxMTg2NiwgMTE4NjYsIDExNTEzLCAxMTUxMywgMTExNTAsIDExMTUwLCAxMDc3NywgMTA3NzcsCi0gMTAzOTMsIDEwMzkzLCAxMDAwMCwgMTAwMDAsICA5NTk3LCAgOTU5NywgIDkxODUsICA5MTg1LCAgODc2NSwgIDg3NjUsCi0gIDgzMzYsICA4MzM2LCAgNzkwMCwgIDc5MDAsICA3NDU2LCAgNzQ1NiwgIDcwMDUsICA3MDA1LCAgNjU0NywgIDY1NDcsCi0gIDYwODMsICA2MDgzLCAgNTYxNCwgIDU2MTQsICA1MTM5LCAgNTEzOSwgIDQ2NTksICA0NjU5LCAgNDE3NSwgIDQxNzUsCi0gIDM2ODcsICAzNjg3LCAgMzE5NiwgIDMxOTYsICAyNzAxLCAgMjcwMSwgIDIyMDQsICAyMjA0LCAgMTcwNSwgIDE3MDUsCi0gIDEyMDUsICAxMjA1LCAgIDcwMywgICA3MDMsICAgMjAxLCAgIDIwMSwgIC0zMDEsICAtMzAxLCAgLTgwMywgIC04MDMsCi0gLTEzMDUsIC0xMzA1LCAtMTgwNSwgLTE4MDUsIC0yMzA0LCAtMjMwNCwgLTI4MDEsIC0yODAxLCAtMzI5NCwgLTMyOTQsCi0gLTM3ODUsIC0zNzg1LCAtNDI3MiwgLTQyNzIsIC00NzU2LCAtNDc1NiwgLTUyMzQsIC01MjM0LCAtNTcwOCwgLTU3MDgsCi0gLTYxNzYsIC02MTc2LCAtNjYzOSwgLTY2MzksIC03MDk1LCAtNzA5NSwgLTc1NDUsIC03NTQ1LCAtNzk4OCwgLTc5ODgsCi0gLTg0MjMsIC04NDIzLCAtODg1MCwgLTg4NTAsIC05MjY4LCAtOTI2OCwgLTk2NzksIC05Njc5LCAtMTAwNzksIC0xMDA3OSwKKzAsICAgICAwLCAgIDUwMiwgICA1MDIsICAxMDA0LCAgMTAwNCwgIDE1MDUsICAxNTA1LCAgMjAwNSwgIDIwMDUsCisyNTAzLCAgMjUwMywgIDI5OTgsICAyOTk4LCAgMzQ5MSwgIDM0OTEsICAzOTgwLCAgMzk4MCwgIDQ0NjYsICA0NDY2LAorNDk0OCwgIDQ5NDgsICA1NDI0LCAgNTQyNCwgIDU4OTYsICA1ODk2LCAgNjM2MiwgIDYzNjIsICA2ODIyLCAgNjgyMiwKKzcyNzYsICA3Mjc2LCAgNzcyMywgIDc3MjMsICA4MTYyLCAgODE2MiwgIDg1OTQsICA4NTk0LCAgOTAxOCwgIDkwMTgsCis5NDM0LCAgOTQzNCwgIDk4NDAsICA5ODQwLCAxMDIzNywgMTAyMzcsIDEwNjI1LCAxMDYyNSwgMTEwMDIsIDExMDAyLAorMTEzNzAsIDExMzcwLCAxMTcyNiwgMTE3MjYsIDEyMDcyLCAxMjA3MiwgMTI0MDYsIDEyNDA2LCAxMjcyOCwgMTI3MjgsCisxMzAzOCwgMTMwMzgsIDEzMzM3LCAxMzMzNywgMTM2MjIsIDEzNjIyLCAxMzg5NSwgMTM4OTUsIDE0MTU1LCAxNDE1NSwKKzE0NDAxLCAxNDQwMSwgMTQ2MzQsIDE0NjM0LCAxNDg1MywgMTQ4NTMsIDE1MDU4LCAxNTA1OCwgMTUyNDksIDE1MjQ5LAorMTU0MjYsIDE1NDI2LCAxNTU4OCwgMTU1ODgsIDE1NzM1LCAxNTczNSwgMTU4NjgsIDE1ODY4LCAxNTk4NSwgMTU5ODUsCisxNjA4OCwgMTYwODgsIDE2MTc1LCAxNjE3NSwgMTYyNDgsIDE2MjQ4LCAxNjMwNSwgMTYzMDUsIDE2MzQ2LCAxNjM0NiwKKzE2MzcyLCAxNjM3MiwgMTYzODMsIDE2MzgzLCAxNjM3OSwgMTYzNzksIDE2MzU5LCAxNjM1OSwgMTYzMjMsIDE2MzIzLAorMTYyNzIsIDE2MjcyLCAxNjIwNiwgMTYyMDYsIDE2MTI1LCAxNjEyNSwgMTYwMjgsIDE2MDI4LCAxNTkxNywgMTU5MTcsCisxNTc5MCwgMTU3OTAsIDE1NjQ5LCAxNTY0OSwgMTU0OTIsIDE1NDkyLCAxNTMyMiwgMTUzMjIsIDE1MTM2LCAxNTEzNiwKKzE0OTM3LCAxNDkzNywgMTQ3MjMsIDE0NzIzLCAxNDQ5NiwgMTQ0OTYsIDE0MjU1LCAxNDI1NSwgMTQwMDEsIDE0MDAxLAorMTM3MzMsIDEzNzMzLCAxMzQ1MiwgMTM0NTIsIDEzMTU5LCAxMzE1OSwgMTI4NTQsIDEyODU0LCAxMjUzNiwgMTI1MzYsCisxMjIwNywgMTIyMDcsIDExODY2LCAxMTg2NiwgMTE1MTMsIDExNTEzLCAxMTE1MCwgMTExNTAsIDEwNzc3LCAxMDc3NywKKzEwMzkzLCAxMDM5MywgMTAwMDAsIDEwMDAwLCAgOTU5NywgIDk1OTcsICA5MTg1LCAgOTE4NSwgIDg3NjUsICA4NzY1LAorODMzNiwgIDgzMzYsICA3OTAwLCAgNzkwMCwgIDc0NTYsICA3NDU2LCAgNzAwNSwgIDcwMDUsICA2NTQ3LCAgNjU0NywKKzYwODMsICA2MDgzLCAgNTYxNCwgIDU2MTQsICA1MTM5LCAgNTEzOSwgIDQ2NTksICA0NjU5LCAgNDE3NSwgIDQxNzUsCiszNjg3LCAgMzY4NywgIDMxOTYsICAzMTk2LCAgMjcwMSwgIDI3MDEsICAyMjA0LCAgMjIwNCwgIDE3MDUsICAxNzA1LAorMTIwNSwgIDEyMDUsICAgNzAzLCAgIDcwMywgICAyMDEsICAgMjAxLCAgLTMwMSwgIC0zMDEsICAtODAzLCAgLTgwMywKKy0xMzA1LCAtMTMwNSwgLTE4MDUsIC0xODA1LCAtMjMwNCwgLTIzMDQsIC0yODAxLCAtMjgwMSwgLTMyOTQsIC0zMjk0LAorLTM3ODUsIC0zNzg1LCAtNDI3MiwgLTQyNzIsIC00NzU2LCAtNDc1NiwgLTUyMzQsIC01MjM0LCAtNTcwOCwgLTU3MDgsCistNjE3NiwgLTYxNzYsIC02NjM5LCAtNjYzOSwgLTcwOTUsIC03MDk1LCAtNzU0NSwgLTc1NDUsIC03OTg4LCAtNzk4OCwKKy04NDIzLCAtODQyMywgLTg4NTAsIC04ODUwLCAtOTI2OCwgLTkyNjgsIC05Njc5LCAtOTY3OSwgLTEwMDc5LCAtMTAwNzksCiAtMTA0NzEsIC0xMDQ3MSwgLTEwODUzLCAtMTA4NTMsIC0xMTIyNCwgLTExMjI0LCAtMTE1ODUsIC0xMTU4NSwgLTExOTM1LCAtMTE5MzUsCiAtMTIyNzMsIC0xMjI3MywgLTEyNjAwLCAtMTI2MDAsIC0xMjkxNiwgLTEyOTE2LCAtMTMyMTksIC0xMzIxOSwgLTEzNTEwLCAtMTM1MTAsCiAtMTM3ODgsIC0xMzc4OCwgLTE0MDUzLCAtMTQwNTMsIC0xNDMwNCwgLTE0MzA0LCAtMTQ1NDMsIC0xNDU0MywgLTE0NzY3LCAtMTQ3NjcsCkBAIC0xOTgsMzUgKzIyNiwzNSBAQAogLTE0MzUzLCAtMTQzNTMsIC0xNDEwNCwgLTE0MTA0LCAtMTM4NDIsIC0xMzg0MiwgLTEzNTY2LCAtMTM1NjYsIC0xMzI3OCwgLTEzMjc4LAogLTEyOTc3LCAtMTI5NzcsIC0xMjY2NSwgLTEyNjY1LCAtMTIzNDAsIC0xMjM0MCwgLTEyMDAzLCAtMTIwMDMsIC0xMTY1NiwgLTExNjU2LAogLTExMjk3LCAtMTEyOTcsIC0xMDkyOCwgLTEwOTI4LCAtMTA1NDgsIC0xMDU0OCwgLTEwMTU5LCAtMTAxNTksIC05NzU5LCAtOTc1OSwKLSAtOTM1MSwgLTkzNTEsIC04OTM0LCAtODkzNCwgLTg1MDksIC04NTA5LCAtODA3NSwgLTgwNzUsIC03NjM0LCAtNzYzNCwKLSAtNzE4NiwgLTcxODYsIC02NzMxLCAtNjczMSwgLTYyNjksIC02MjY5LCAtNTgwMiwgLTU4MDIsIC01MzI5LCAtNTMyOSwKLSAtNDg1MiwgLTQ4NTIsIC00MzY5LCAtNDM2OSwgLTM4ODMsIC0zODgzLCAtMzM5MywgLTMzOTMsIC0yOTAwLCAtMjkwMCwKLSAtMjQwNCwgLTI0MDQsIC0xOTA1LCAtMTkwNSwgLTE0MDUsIC0xNDA1LCAgLTkwNCwgIC05MDQsICAtNDAyLCAgLTQwMiwKLSAgIDEwMCwgICAxMDAsICAgNjAzLCAgIDYwMywgIDExMDUsICAxMTA1LCAgMTYwNSwgIDE2MDUsICAyMTA1LCAgMjEwNSwKLSAgMjYwMiwgIDI2MDIsICAzMDk3LCAgMzA5NywgIDM1ODksICAzNTg5LCAgNDA3OCwgIDQwNzgsICA0NTYzLCAgNDU2MywKLSAgNTA0MywgIDUwNDMsICA1NTE5LCAgNTUxOSwgIDU5OTAsICA1OTkwLCAgNjQ1NSwgIDY0NTUsICA2OTE0LCAgNjkxNCwKLSAgNzM2NiwgIDczNjYsICA3ODExLCAgNzgxMSwgIDgyNDksICA4MjQ5LCAgODY4MCwgIDg2ODAsICA5MTAyLCAgOTEwMiwKLSAgOTUxNiwgIDk1MTYsICA5OTIwLCAgOTkyMCwgMTAzMTUsIDEwMzE1LCAxMDcwMSwgMTA3MDEsIDExMDc3LCAxMTA3NywKLSAxMTQ0MiwgMTE0NDIsIDExNzk2LCAxMTc5NiwgMTIxMzksIDEyMTM5LCAxMjQ3MSwgMTI0NzEsIDEyNzkxLCAxMjc5MSwKLSAxMzA5OSwgMTMwOTksIDEzMzk1LCAxMzM5NSwgMTM2NzgsIDEzNjc4LCAxMzk0OCwgMTM5NDgsIDE0MjA1LCAxNDIwNSwKLSAxNDQ0OSwgMTQ0NDksIDE0Njc5LCAxNDY3OSwgMTQ4OTUsIDE0ODk1LCAxNTA5OCwgMTUwOTgsIDE1Mjg2LCAxNTI4NiwKLSAxNTQ1OSwgMTU0NTksIDE1NjE4LCAxNTYxOCwgMTU3NjMsIDE1NzYzLCAxNTg5MiwgMTU4OTIsIDE2MDA3LCAxNjAwNywKLSAxNjEwNywgMTYxMDcsIDE2MTkxLCAxNjE5MSwgMTYyNjAsIDE2MjYwLCAxNjMxNCwgMTYzMTQsIDE2MzUzLCAxNjM1MywKLSAxNjM3NiwgMTYzNzYsIDE2Mzg0LCAxNjM4NCwgMTYzNzYsIDE2Mzc2LCAxNjM1MywgMTYzNTMsIDE2MzE0LCAxNjMxNCwKLSAxNjI2MCwgMTYyNjAsIDE2MTkxLCAxNjE5MSwgMTYxMDcsIDE2MTA3LCAxNjAwNywgMTYwMDcsIDE1ODkyLCAxNTg5MiwKLSAxNTc2MywgMTU3NjMsIDE1NjE4LCAxNTYxOCwgMTU0NTksIDE1NDU5LCAxNTI4NiwgMTUyODYsIDE1MDk4LCAxNTA5OCwKLSAxNDg5NSwgMTQ4OTUsIDE0Njc5LCAxNDY3OSwgMTQ0NDksIDE0NDQ5LCAxNDIwNSwgMTQyMDUsIDEzOTQ4LCAxMzk0OCwKLSAxMzY3OCwgMTM2NzgsIDEzMzk1LCAxMzM5NSwgMTMwOTksIDEzMDk5LCAxMjc5MSwgMTI3OTEsIDEyNDcxLCAxMjQ3MSwKLSAxMjEzOSwgMTIxMzksIDExNzk2LCAxMTc5NiwgMTE0NDIsIDExNDQyLCAxMTA3NywgMTEwNzcsIDEwNzAxLCAxMDcwMSwKLSAxMDMxNSwgMTAzMTUsICA5OTIwLCAgOTkyMCwgIDk1MTYsICA5NTE2LCAgOTEwMiwgIDkxMDIsICA4NjgwLCAgODY4MCwKLSAgODI0OSwgIDgyNDksICA3ODExLCAgNzgxMSwgIDczNjYsICA3MzY2LCAgNjkxNCwgIDY5MTQsICA2NDU1LCAgNjQ1NSwKLSAgNTk5MCwgIDU5OTAsICA1NTE5LCAgNTUxOSwgIDUwNDMsICA1MDQzLCAgNDU2MywgIDQ1NjMsICA0MDc4LCAgNDA3OCwKLSAgMzU4OSwgIDM1ODksICAzMDk3LCAgMzA5NywgIDI2MDIsICAyNjAyLCAgMjEwNSwgIDIxMDUsICAxNjA1LCAgMTYwNSwKLSAgMTEwNSwgIDExMDUsICAgNjAzLCAgIDYwMywgICAxMDAsICAgMTAwLCAgLTQwMiwgIC00MDIsICAtOTA0LCAgLTkwNCwKLSAtMTQwNSwgLTE0MDUsIC0xOTA1LCAtMTkwNSwgLTI0MDQsIC0yNDA0LCAtMjkwMCwgLTI5MDAsIC0zMzkzLCAtMzM5MywKLSAtMzg4MywgLTM4ODMsIC00MzY5LCAtNDM2OSwgLTQ4NTIsIC00ODUyLCAtNTMyOSwgLTUzMjksIC01ODAyLCAtNTgwMiwKLSAtNjI2OSwgLTYyNjksIC02NzMxLCAtNjczMSwgLTcxODYsIC03MTg2LCAtNzYzNCwgLTc2MzQsIC04MDc1LCAtODA3NSwKLSAtODUwOSwgLTg1MDksIC04OTM0LCAtODkzNCwgLTkzNTEsIC05MzUxLCAtOTc1OSwgLTk3NTksIC0xMDE1OSwgLTEwMTU5LAorLTkzNTEsIC05MzUxLCAtODkzNCwgLTg5MzQsIC04NTA5LCAtODUwOSwgLTgwNzUsIC04MDc1LCAtNzYzNCwgLTc2MzQsCistNzE4NiwgLTcxODYsIC02NzMxLCAtNjczMSwgLTYyNjksIC02MjY5LCAtNTgwMiwgLTU4MDIsIC01MzI5LCAtNTMyOSwKKy00ODUyLCAtNDg1MiwgLTQzNjksIC00MzY5LCAtMzg4MywgLTM4ODMsIC0zMzkzLCAtMzM5MywgLTI5MDAsIC0yOTAwLAorLTI0MDQsIC0yNDA0LCAtMTkwNSwgLTE5MDUsIC0xNDA1LCAtMTQwNSwgIC05MDQsICAtOTA0LCAgLTQwMiwgIC00MDIsCisxMDAsICAgMTAwLCAgIDYwMywgICA2MDMsICAxMTA1LCAgMTEwNSwgIDE2MDUsICAxNjA1LCAgMjEwNSwgIDIxMDUsCisyNjAyLCAgMjYwMiwgIDMwOTcsICAzMDk3LCAgMzU4OSwgIDM1ODksICA0MDc4LCAgNDA3OCwgIDQ1NjMsICA0NTYzLAorNTA0MywgIDUwNDMsICA1NTE5LCAgNTUxOSwgIDU5OTAsICA1OTkwLCAgNjQ1NSwgIDY0NTUsICA2OTE0LCAgNjkxNCwKKzczNjYsICA3MzY2LCAgNzgxMSwgIDc4MTEsICA4MjQ5LCAgODI0OSwgIDg2ODAsICA4NjgwLCAgOTEwMiwgIDkxMDIsCis5NTE2LCAgOTUxNiwgIDk5MjAsICA5OTIwLCAxMDMxNSwgMTAzMTUsIDEwNzAxLCAxMDcwMSwgMTEwNzcsIDExMDc3LAorMTE0NDIsIDExNDQyLCAxMTc5NiwgMTE3OTYsIDEyMTM5LCAxMjEzOSwgMTI0NzEsIDEyNDcxLCAxMjc5MSwgMTI3OTEsCisxMzA5OSwgMTMwOTksIDEzMzk1LCAxMzM5NSwgMTM2NzgsIDEzNjc4LCAxMzk0OCwgMTM5NDgsIDE0MjA1LCAxNDIwNSwKKzE0NDQ5LCAxNDQ0OSwgMTQ2NzksIDE0Njc5LCAxNDg5NSwgMTQ4OTUsIDE1MDk4LCAxNTA5OCwgMTUyODYsIDE1Mjg2LAorMTU0NTksIDE1NDU5LCAxNTYxOCwgMTU2MTgsIDE1NzYzLCAxNTc2MywgMTU4OTIsIDE1ODkyLCAxNjAwNywgMTYwMDcsCisxNjEwNywgMTYxMDcsIDE2MTkxLCAxNjE5MSwgMTYyNjAsIDE2MjYwLCAxNjMxNCwgMTYzMTQsIDE2MzUzLCAxNjM1MywKKzE2Mzc2LCAxNjM3NiwgMTYzODQsIDE2Mzg0LCAxNjM3NiwgMTYzNzYsIDE2MzUzLCAxNjM1MywgMTYzMTQsIDE2MzE0LAorMTYyNjAsIDE2MjYwLCAxNjE5MSwgMTYxOTEsIDE2MTA3LCAxNjEwNywgMTYwMDcsIDE2MDA3LCAxNTg5MiwgMTU4OTIsCisxNTc2MywgMTU3NjMsIDE1NjE4LCAxNTYxOCwgMTU0NTksIDE1NDU5LCAxNTI4NiwgMTUyODYsIDE1MDk4LCAxNTA5OCwKKzE0ODk1LCAxNDg5NSwgMTQ2NzksIDE0Njc5LCAxNDQ0OSwgMTQ0NDksIDE0MjA1LCAxNDIwNSwgMTM5NDgsIDEzOTQ4LAorMTM2NzgsIDEzNjc4LCAxMzM5NSwgMTMzOTUsIDEzMDk5LCAxMzA5OSwgMTI3OTEsIDEyNzkxLCAxMjQ3MSwgMTI0NzEsCisxMjEzOSwgMTIxMzksIDExNzk2LCAxMTc5NiwgMTE0NDIsIDExNDQyLCAxMTA3NywgMTEwNzcsIDEwNzAxLCAxMDcwMSwKKzEwMzE1LCAxMDMxNSwgIDk5MjAsICA5OTIwLCAgOTUxNiwgIDk1MTYsICA5MTAyLCAgOTEwMiwgIDg2ODAsICA4NjgwLAorODI0OSwgIDgyNDksICA3ODExLCAgNzgxMSwgIDczNjYsICA3MzY2LCAgNjkxNCwgIDY5MTQsICA2NDU1LCAgNjQ1NSwKKzU5OTAsICA1OTkwLCAgNTUxOSwgIDU1MTksICA1MDQzLCAgNTA0MywgIDQ1NjMsICA0NTYzLCAgNDA3OCwgIDQwNzgsCiszNTg5LCAgMzU4OSwgIDMwOTcsICAzMDk3LCAgMjYwMiwgIDI2MDIsICAyMTA1LCAgMjEwNSwgIDE2MDUsICAxNjA1LAorMTEwNSwgIDExMDUsICAgNjAzLCAgIDYwMywgICAxMDAsICAgMTAwLCAgLTQwMiwgIC00MDIsICAtOTA0LCAgLTkwNCwKKy0xNDA1LCAtMTQwNSwgLTE5MDUsIC0xOTA1LCAtMjQwNCwgLTI0MDQsIC0yOTAwLCAtMjkwMCwgLTMzOTMsIC0zMzkzLAorLTM4ODMsIC0zODgzLCAtNDM2OSwgLTQzNjksIC00ODUyLCAtNDg1MiwgLTUzMjksIC01MzI5LCAtNTgwMiwgLTU4MDIsCistNjI2OSwgLTYyNjksIC02NzMxLCAtNjczMSwgLTcxODYsIC03MTg2LCAtNzYzNCwgLTc2MzQsIC04MDc1LCAtODA3NSwKKy04NTA5LCAtODUwOSwgLTg5MzQsIC04OTM0LCAtOTM1MSwgLTkzNTEsIC05NzU5LCAtOTc1OSwgLTEwMTU5LCAtMTAxNTksCiAtMTA1NDgsIC0xMDU0OCwgLTEwOTI4LCAtMTA5MjgsIC0xMTI5NywgLTExMjk3LCAtMTE2NTYsIC0xMTY1NiwgLTEyMDAzLCAtMTIwMDMsCiAtMTIzNDAsIC0xMjM0MCwgLTEyNjY1LCAtMTI2NjUsIC0xMjk3NywgLTEyOTc3LCAtMTMyNzgsIC0xMzI3OCwgLTEzNTY2LCAtMTM1NjYsCiAtMTM4NDIsIC0xMzg0MiwgLTE0MTA0LCAtMTQxMDQsIC0xNDM1MywgLTE0MzUzLCAtMTQ1ODksIC0xNDU4OSwgLTE0ODEwLCAtMTQ4MTAsCkBAIC0yMzksMzUgKzI2NywzNSBAQAogLTE0MzA0LCAtMTQzMDQsIC0xNDA1MywgLTE0MDUzLCAtMTM3ODgsIC0xMzc4OCwgLTEzNTEwLCAtMTM1MTAsIC0xMzIxOSwgLTEzMjE5LAogLTEyOTE2LCAtMTI5MTYsIC0xMjYwMCwgLTEyNjAwLCAtMTIyNzMsIC0xMjI3MywgLTExOTM1LCAtMTE5MzUsIC0xMTU4NSwgLTExNTg1LAogLTExMjI0LCAtMTEyMjQsIC0xMDg1MywgLTEwODUzLCAtMTA0NzEsIC0xMDQ3MSwgLTEwMDc5LCAtMTAwNzksIC05Njc5LCAtOTY3OSwKLSAtOTI2OCwgLTkyNjgsIC04ODUwLCAtODg1MCwgLTg0MjMsIC04NDIzLCAtNzk4OCwgLTc5ODgsIC03NTQ1LCAtNzU0NSwKLSAtNzA5NSwgLTcwOTUsIC02NjM5LCAtNjYzOSwgLTYxNzYsIC02MTc2LCAtNTcwOCwgLTU3MDgsIC01MjM0LCAtNTIzNCwKLSAtNDc1NiwgLTQ3NTYsIC00MjcyLCAtNDI3MiwgLTM3ODUsIC0zNzg1LCAtMzI5NCwgLTMyOTQsIC0yODAxLCAtMjgwMSwKLSAtMjMwNCwgLTIzMDQsIC0xODA1LCAtMTgwNSwgLTEzMDUsIC0xMzA1LCAgLTgwMywgIC04MDMsICAtMzAxLCAgLTMwMSwKLSAgIDIwMSwgICAyMDEsICAgNzAzLCAgIDcwMywgIDEyMDUsICAxMjA1LCAgMTcwNSwgIDE3MDUsICAyMjA0LCAgMjIwNCwKLSAgMjcwMSwgIDI3MDEsICAzMTk2LCAgMzE5NiwgIDM2ODcsICAzNjg3LCAgNDE3NSwgIDQxNzUsICA0NjU5LCAgNDY1OSwKLSAgNTEzOSwgIDUxMzksICA1NjE0LCAgNTYxNCwgIDYwODMsICA2MDgzLCAgNjU0NywgIDY1NDcsICA3MDA1LCAgNzAwNSwKLSAgNzQ1NiwgIDc0NTYsICA3OTAwLCAgNzkwMCwgIDgzMzYsICA4MzM2LCAgODc2NSwgIDg3NjUsICA5MTg1LCAgOTE4NSwKLSAgOTU5NywgIDk1OTcsIDEwMDAwLCAxMDAwMCwgMTAzOTMsIDEwMzkzLCAxMDc3NywgMTA3NzcsIDExMTUwLCAxMTE1MCwKLSAxMTUxMywgMTE1MTMsIDExODY2LCAxMTg2NiwgMTIyMDcsIDEyMjA3LCAxMjUzNiwgMTI1MzYsIDEyODU0LCAxMjg1NCwKLSAxMzE1OSwgMTMxNTksIDEzNDUyLCAxMzQ1MiwgMTM3MzMsIDEzNzMzLCAxNDAwMSwgMTQwMDEsIDE0MjU1LCAxNDI1NSwKLSAxNDQ5NiwgMTQ0OTYsIDE0NzIzLCAxNDcyMywgMTQ5MzcsIDE0OTM3LCAxNTEzNiwgMTUxMzYsIDE1MzIyLCAxNTMyMiwKLSAxNTQ5MiwgMTU0OTIsIDE1NjQ5LCAxNTY0OSwgMTU3OTAsIDE1NzkwLCAxNTkxNywgMTU5MTcsIDE2MDI4LCAxNjAyOCwKLSAxNjEyNSwgMTYxMjUsIDE2MjA2LCAxNjIwNiwgMTYyNzIsIDE2MjcyLCAxNjMyMywgMTYzMjMsIDE2MzU5LCAxNjM1OSwKLSAxNjM3OSwgMTYzNzksIDE2MzgzLCAxNjM4MywgMTYzNzIsIDE2MzcyLCAxNjM0NiwgMTYzNDYsIDE2MzA1LCAxNjMwNSwKLSAxNjI0OCwgMTYyNDgsIDE2MTc1LCAxNjE3NSwgMTYwODgsIDE2MDg4LCAxNTk4NSwgMTU5ODUsIDE1ODY4LCAxNTg2OCwKLSAxNTczNSwgMTU3MzUsIDE1NTg4LCAxNTU4OCwgMTU0MjYsIDE1NDI2LCAxNTI0OSwgMTUyNDksIDE1MDU4LCAxNTA1OCwKLSAxNDg1MywgMTQ4NTMsIDE0NjM0LCAxNDYzNCwgMTQ0MDEsIDE0NDAxLCAxNDE1NSwgMTQxNTUsIDEzODk1LCAxMzg5NSwKLSAxMzYyMiwgMTM2MjIsIDEzMzM3LCAxMzMzNywgMTMwMzgsIDEzMDM4LCAxMjcyOCwgMTI3MjgsIDEyNDA2LCAxMjQwNiwKLSAxMjA3MiwgMTIwNzIsIDExNzI2LCAxMTcyNiwgMTEzNzAsIDExMzcwLCAxMTAwMiwgMTEwMDIsIDEwNjI1LCAxMDYyNSwKLSAxMDIzNywgMTAyMzcsICA5ODQwLCAgOTg0MCwgIDk0MzQsICA5NDM0LCAgOTAxOCwgIDkwMTgsICA4NTk0LCAgODU5NCwKLSAgODE2MiwgIDgxNjIsICA3NzIzLCAgNzcyMywgIDcyNzYsICA3Mjc2LCAgNjgyMiwgIDY4MjIsICA2MzYyLCAgNjM2MiwKLSAgNTg5NiwgIDU4OTYsICA1NDI0LCAgNTQyNCwgIDQ5NDgsICA0OTQ4LCAgNDQ2NiwgIDQ0NjYsICAzOTgwLCAgMzk4MCwKLSAgMzQ5MSwgIDM0OTEsICAyOTk4LCAgMjk5OCwgIDI1MDMsICAyNTAzLCAgMjAwNSwgIDIwMDUsICAxNTA1LCAgMTUwNSwKLSAgMTAwNCwgIDEwMDQsICAgNTAyLCAgIDUwMiwgICAgIDAsICAgICAwLCAgLTUwMiwgIC01MDIsIC0xMDA0LCAtMTAwNCwKLSAtMTUwNSwgLTE1MDUsIC0yMDA1LCAtMjAwNSwgLTI1MDMsIC0yNTAzLCAtMjk5OCwgLTI5OTgsIC0zNDkxLCAtMzQ5MSwKLSAtMzk4MCwgLTM5ODAsIC00NDY2LCAtNDQ2NiwgLTQ5NDgsIC00OTQ4LCAtNTQyNCwgLTU0MjQsIC01ODk2LCAtNTg5NiwKLSAtNjM2MiwgLTYzNjIsIC02ODIyLCAtNjgyMiwgLTcyNzYsIC03Mjc2LCAtNzcyMywgLTc3MjMsIC04MTYyLCAtODE2MiwKLSAtODU5NCwgLTg1OTQsIC05MDE4LCAtOTAxOCwgLTk0MzQsIC05NDM0LCAtOTg0MCwgLTk4NDAsIC0xMDIzNywgLTEwMjM3LAorLTkyNjgsIC05MjY4LCAtODg1MCwgLTg4NTAsIC04NDIzLCAtODQyMywgLTc5ODgsIC03OTg4LCAtNzU0NSwgLTc1NDUsCistNzA5NSwgLTcwOTUsIC02NjM5LCAtNjYzOSwgLTYxNzYsIC02MTc2LCAtNTcwOCwgLTU3MDgsIC01MjM0LCAtNTIzNCwKKy00NzU2LCAtNDc1NiwgLTQyNzIsIC00MjcyLCAtMzc4NSwgLTM3ODUsIC0zMjk0LCAtMzI5NCwgLTI4MDEsIC0yODAxLAorLTIzMDQsIC0yMzA0LCAtMTgwNSwgLTE4MDUsIC0xMzA1LCAtMTMwNSwgIC04MDMsICAtODAzLCAgLTMwMSwgIC0zMDEsCisyMDEsICAgMjAxLCAgIDcwMywgICA3MDMsICAxMjA1LCAgMTIwNSwgIDE3MDUsICAxNzA1LCAgMjIwNCwgIDIyMDQsCisyNzAxLCAgMjcwMSwgIDMxOTYsICAzMTk2LCAgMzY4NywgIDM2ODcsICA0MTc1LCAgNDE3NSwgIDQ2NTksICA0NjU5LAorNTEzOSwgIDUxMzksICA1NjE0LCAgNTYxNCwgIDYwODMsICA2MDgzLCAgNjU0NywgIDY1NDcsICA3MDA1LCAgNzAwNSwKKzc0NTYsICA3NDU2LCAgNzkwMCwgIDc5MDAsICA4MzM2LCAgODMzNiwgIDg3NjUsICA4NzY1LCAgOTE4NSwgIDkxODUsCis5NTk3LCAgOTU5NywgMTAwMDAsIDEwMDAwLCAxMDM5MywgMTAzOTMsIDEwNzc3LCAxMDc3NywgMTExNTAsIDExMTUwLAorMTE1MTMsIDExNTEzLCAxMTg2NiwgMTE4NjYsIDEyMjA3LCAxMjIwNywgMTI1MzYsIDEyNTM2LCAxMjg1NCwgMTI4NTQsCisxMzE1OSwgMTMxNTksIDEzNDUyLCAxMzQ1MiwgMTM3MzMsIDEzNzMzLCAxNDAwMSwgMTQwMDEsIDE0MjU1LCAxNDI1NSwKKzE0NDk2LCAxNDQ5NiwgMTQ3MjMsIDE0NzIzLCAxNDkzNywgMTQ5MzcsIDE1MTM2LCAxNTEzNiwgMTUzMjIsIDE1MzIyLAorMTU0OTIsIDE1NDkyLCAxNTY0OSwgMTU2NDksIDE1NzkwLCAxNTc5MCwgMTU5MTcsIDE1OTE3LCAxNjAyOCwgMTYwMjgsCisxNjEyNSwgMTYxMjUsIDE2MjA2LCAxNjIwNiwgMTYyNzIsIDE2MjcyLCAxNjMyMywgMTYzMjMsIDE2MzU5LCAxNjM1OSwKKzE2Mzc5LCAxNjM3OSwgMTYzODMsIDE2MzgzLCAxNjM3MiwgMTYzNzIsIDE2MzQ2LCAxNjM0NiwgMTYzMDUsIDE2MzA1LAorMTYyNDgsIDE2MjQ4LCAxNjE3NSwgMTYxNzUsIDE2MDg4LCAxNjA4OCwgMTU5ODUsIDE1OTg1LCAxNTg2OCwgMTU4NjgsCisxNTczNSwgMTU3MzUsIDE1NTg4LCAxNTU4OCwgMTU0MjYsIDE1NDI2LCAxNTI0OSwgMTUyNDksIDE1MDU4LCAxNTA1OCwKKzE0ODUzLCAxNDg1MywgMTQ2MzQsIDE0NjM0LCAxNDQwMSwgMTQ0MDEsIDE0MTU1LCAxNDE1NSwgMTM4OTUsIDEzODk1LAorMTM2MjIsIDEzNjIyLCAxMzMzNywgMTMzMzcsIDEzMDM4LCAxMzAzOCwgMTI3MjgsIDEyNzI4LCAxMjQwNiwgMTI0MDYsCisxMjA3MiwgMTIwNzIsIDExNzI2LCAxMTcyNiwgMTEzNzAsIDExMzcwLCAxMTAwMiwgMTEwMDIsIDEwNjI1LCAxMDYyNSwKKzEwMjM3LCAxMDIzNywgIDk4NDAsICA5ODQwLCAgOTQzNCwgIDk0MzQsICA5MDE4LCAgOTAxOCwgIDg1OTQsICA4NTk0LAorODE2MiwgIDgxNjIsICA3NzIzLCAgNzcyMywgIDcyNzYsICA3Mjc2LCAgNjgyMiwgIDY4MjIsICA2MzYyLCAgNjM2MiwKKzU4OTYsICA1ODk2LCAgNTQyNCwgIDU0MjQsICA0OTQ4LCAgNDk0OCwgIDQ0NjYsICA0NDY2LCAgMzk4MCwgIDM5ODAsCiszNDkxLCAgMzQ5MSwgIDI5OTgsICAyOTk4LCAgMjUwMywgIDI1MDMsICAyMDA1LCAgMjAwNSwgIDE1MDUsICAxNTA1LAorMTAwNCwgIDEwMDQsICAgNTAyLCAgIDUwMiwgICAgIDAsICAgICAwLCAgLTUwMiwgIC01MDIsIC0xMDA0LCAtMTAwNCwKKy0xNTA1LCAtMTUwNSwgLTIwMDUsIC0yMDA1LCAtMjUwMywgLTI1MDMsIC0yOTk4LCAtMjk5OCwgLTM0OTEsIC0zNDkxLAorLTM5ODAsIC0zOTgwLCAtNDQ2NiwgLTQ0NjYsIC00OTQ4LCAtNDk0OCwgLTU0MjQsIC01NDI0LCAtNTg5NiwgLTU4OTYsCistNjM2MiwgLTYzNjIsIC02ODIyLCAtNjgyMiwgLTcyNzYsIC03Mjc2LCAtNzcyMywgLTc3MjMsIC04MTYyLCAtODE2MiwKKy04NTk0LCAtODU5NCwgLTkwMTgsIC05MDE4LCAtOTQzNCwgLTk0MzQsIC05ODQwLCAtOTg0MCwgLTEwMjM3LCAtMTAyMzcsCiAtMTA2MjUsIC0xMDYyNSwgLTExMDAyLCAtMTEwMDIsIC0xMTM3MCwgLTExMzcwLCAtMTE3MjYsIC0xMTcyNiwgLTEyMDcyLCAtMTIwNzIsCiAtMTI0MDYsIC0xMjQwNiwgLTEyNzI4LCAtMTI3MjgsIC0xMzAzOCwgLTEzMDM4LCAtMTMzMzcsIC0xMzMzNywgLTEzNjIyLCAtMTM2MjIsCiAtMTM4OTUsIC0xMzg5NSwgLTE0MTU1LCAtMTQxNTUsIC0xNDQwMSwgLTE0NDAxLCAtMTQ2MzQsIC0xNDYzNCwgLTE0ODUzLCAtMTQ4NTMsCkBAIC0yODAsMzUgKzMwOCwzNSBAQAogLTE0MjU1LCAtMTQyNTUsIC0xNDAwMSwgLTE0MDAxLCAtMTM3MzMsIC0xMzczMywgLTEzNDUyLCAtMTM0NTIsIC0xMzE1OSwgLTEzMTU5LAogLTEyODU0LCAtMTI4NTQsIC0xMjUzNiwgLTEyNTM2LCAtMTIyMDcsIC0xMjIwNywgLTExODY2LCAtMTE4NjYsIC0xMTUxMywgLTExNTEzLAogLTExMTUwLCAtMTExNTAsIC0xMDc3NywgLTEwNzc3LCAtMTAzOTMsIC0xMDM5MywgLTEwMDAwLCAtMTAwMDAsIC05NTk3LCAtOTU5NywKLSAtOTE4NSwgLTkxODUsIC04NzY1LCAtODc2NSwgLTgzMzYsIC04MzM2LCAtNzkwMCwgLTc5MDAsIC03NDU2LCAtNzQ1NiwKLSAtNzAwNSwgLTcwMDUsIC02NTQ3LCAtNjU0NywgLTYwODMsIC02MDgzLCAtNTYxNCwgLTU2MTQsIC01MTM5LCAtNTEzOSwKLSAtNDY1OSwgLTQ2NTksIC00MTc1LCAtNDE3NSwgLTM2ODcsIC0zNjg3LCAtMzE5NiwgLTMxOTYsIC0yNzAxLCAtMjcwMSwKLSAtMjIwNCwgLTIyMDQsIC0xNzA1LCAtMTcwNSwgLTEyMDUsIC0xMjA1LCAgLTcwMywgIC03MDMsICAtMjAxLCAgLTIwMSwKLSAgIDMwMSwgICAzMDEsICAgODAzLCAgIDgwMywgIDEzMDUsICAxMzA1LCAgMTgwNSwgIDE4MDUsICAyMzA0LCAgMjMwNCwKLSAgMjgwMSwgIDI4MDEsICAzMjk0LCAgMzI5NCwgIDM3ODUsICAzNzg1LCAgNDI3MiwgIDQyNzIsICA0NzU2LCAgNDc1NiwKLSAgNTIzNCwgIDUyMzQsICA1NzA4LCAgNTcwOCwgIDYxNzYsICA2MTc2LCAgNjYzOSwgIDY2MzksICA3MDk1LCAgNzA5NSwKLSAgNzU0NSwgIDc1NDUsICA3OTg4LCAgNzk4OCwgIDg0MjMsICA4NDIzLCAgODg1MCwgIDg4NTAsICA5MjY4LCAgOTI2OCwKLSAgOTY3OSwgIDk2NzksIDEwMDc5LCAxMDA3OSwgMTA0NzEsIDEwNDcxLCAxMDg1MywgMTA4NTMsIDExMjI0LCAxMTIyNCwKLSAxMTU4NSwgMTE1ODUsIDExOTM1LCAxMTkzNSwgMTIyNzMsIDEyMjczLCAxMjYwMCwgMTI2MDAsIDEyOTE2LCAxMjkxNiwKLSAxMzIxOSwgMTMyMTksIDEzNTEwLCAxMzUxMCwgMTM3ODgsIDEzNzg4LCAxNDA1MywgMTQwNTMsIDE0MzA0LCAxNDMwNCwKLSAxNDU0MywgMTQ1NDMsIDE0NzY3LCAxNDc2NywgMTQ5NzgsIDE0OTc4LCAxNTE3NSwgMTUxNzUsIDE1MzU3LCAxNTM1NywKLSAxNTUyNSwgMTU1MjUsIDE1Njc4LCAxNTY3OCwgMTU4MTcsIDE1ODE3LCAxNTk0MCwgMTU5NDAsIDE2MDQ5LCAxNjA0OSwKLSAxNjE0MiwgMTYxNDIsIDE2MjIxLCAxNjIyMSwgMTYyODQsIDE2Mjg0LCAxNjMzMSwgMTYzMzEsIDE2MzY0LCAxNjM2NCwKLSAxNjM4MSwgMTYzODEsIDE2MzgyLCAxNjM4MiwgMTYzNjgsIDE2MzY4LCAxNjMzOSwgMTYzMzksIDE2Mjk0LCAxNjI5NCwKLSAxNjIzNCwgMTYyMzQsIDE2MTU5LCAxNjE1OSwgMTYwNjksIDE2MDY5LCAxNTk2MywgMTU5NjMsIDE1ODQyLCAxNTg0MiwKLSAxNTcwNywgMTU3MDcsIDE1NTU3LCAxNTU1NywgMTUzOTIsIDE1MzkyLCAxNTIxMiwgMTUyMTIsIDE1MDE4LCAxNTAxOCwKLSAxNDgxMCwgMTQ4MTAsIDE0NTg5LCAxNDU4OSwgMTQzNTMsIDE0MzUzLCAxNDEwNCwgMTQxMDQsIDEzODQyLCAxMzg0MiwKLSAxMzU2NiwgMTM1NjYsIDEzMjc4LCAxMzI3OCwgMTI5NzcsIDEyOTc3LCAxMjY2NSwgMTI2NjUsIDEyMzQwLCAxMjM0MCwKLSAxMjAwMywgMTIwMDMsIDExNjU2LCAxMTY1NiwgMTEyOTcsIDExMjk3LCAxMDkyOCwgMTA5MjgsIDEwNTQ4LCAxMDU0OCwKLSAxMDE1OSwgMTAxNTksICA5NzU5LCAgOTc1OSwgIDkzNTEsICA5MzUxLCAgODkzNCwgIDg5MzQsICA4NTA5LCAgODUwOSwKLSAgODA3NSwgIDgwNzUsICA3NjM0LCAgNzYzNCwgIDcxODYsICA3MTg2LCAgNjczMSwgIDY3MzEsICA2MjY5LCAgNjI2OSwKLSAgNTgwMiwgIDU4MDIsICA1MzI5LCAgNTMyOSwgIDQ4NTIsICA0ODUyLCAgNDM2OSwgIDQzNjksICAzODgzLCAgMzg4MywKLSAgMzM5MywgIDMzOTMsICAyOTAwLCAgMjkwMCwgIDI0MDQsICAyNDA0LCAgMTkwNSwgIDE5MDUsICAxNDA1LCAgMTQwNSwKLSAgIDkwNCwgICA5MDQsICAgNDAyLCAgIDQwMiwgIC0xMDAsICAtMTAwLCAgLTYwMywgIC02MDMsIC0xMTA1LCAtMTEwNSwKLSAtMTYwNSwgLTE2MDUsIC0yMTA1LCAtMjEwNSwgLTI2MDIsIC0yNjAyLCAtMzA5NywgLTMwOTcsIC0zNTg5LCAtMzU4OSwKLSAtNDA3OCwgLTQwNzgsIC00NTYzLCAtNDU2MywgLTUwNDMsIC01MDQzLCAtNTUxOSwgLTU1MTksIC01OTkwLCAtNTk5MCwKLSAtNjQ1NSwgLTY0NTUsIC02OTE0LCAtNjkxNCwgLTczNjYsIC03MzY2LCAtNzgxMSwgLTc4MTEsIC04MjQ5LCAtODI0OSwKLSAtODY4MCwgLTg2ODAsIC05MTAyLCAtOTEwMiwgLTk1MTYsIC05NTE2LCAtOTkyMCwgLTk5MjAsIC0xMDMxNSwgLTEwMzE1LAorLTkxODUsIC05MTg1LCAtODc2NSwgLTg3NjUsIC04MzM2LCAtODMzNiwgLTc5MDAsIC03OTAwLCAtNzQ1NiwgLTc0NTYsCistNzAwNSwgLTcwMDUsIC02NTQ3LCAtNjU0NywgLTYwODMsIC02MDgzLCAtNTYxNCwgLTU2MTQsIC01MTM5LCAtNTEzOSwKKy00NjU5LCAtNDY1OSwgLTQxNzUsIC00MTc1LCAtMzY4NywgLTM2ODcsIC0zMTk2LCAtMzE5NiwgLTI3MDEsIC0yNzAxLAorLTIyMDQsIC0yMjA0LCAtMTcwNSwgLTE3MDUsIC0xMjA1LCAtMTIwNSwgIC03MDMsICAtNzAzLCAgLTIwMSwgIC0yMDEsCiszMDEsICAgMzAxLCAgIDgwMywgICA4MDMsICAxMzA1LCAgMTMwNSwgIDE4MDUsICAxODA1LCAgMjMwNCwgIDIzMDQsCisyODAxLCAgMjgwMSwgIDMyOTQsICAzMjk0LCAgMzc4NSwgIDM3ODUsICA0MjcyLCAgNDI3MiwgIDQ3NTYsICA0NzU2LAorNTIzNCwgIDUyMzQsICA1NzA4LCAgNTcwOCwgIDYxNzYsICA2MTc2LCAgNjYzOSwgIDY2MzksICA3MDk1LCAgNzA5NSwKKzc1NDUsICA3NTQ1LCAgNzk4OCwgIDc5ODgsICA4NDIzLCAgODQyMywgIDg4NTAsICA4ODUwLCAgOTI2OCwgIDkyNjgsCis5Njc5LCAgOTY3OSwgMTAwNzksIDEwMDc5LCAxMDQ3MSwgMTA0NzEsIDEwODUzLCAxMDg1MywgMTEyMjQsIDExMjI0LAorMTE1ODUsIDExNTg1LCAxMTkzNSwgMTE5MzUsIDEyMjczLCAxMjI3MywgMTI2MDAsIDEyNjAwLCAxMjkxNiwgMTI5MTYsCisxMzIxOSwgMTMyMTksIDEzNTEwLCAxMzUxMCwgMTM3ODgsIDEzNzg4LCAxNDA1MywgMTQwNTMsIDE0MzA0LCAxNDMwNCwKKzE0NTQzLCAxNDU0MywgMTQ3NjcsIDE0NzY3LCAxNDk3OCwgMTQ5NzgsIDE1MTc1LCAxNTE3NSwgMTUzNTcsIDE1MzU3LAorMTU1MjUsIDE1NTI1LCAxNTY3OCwgMTU2NzgsIDE1ODE3LCAxNTgxNywgMTU5NDAsIDE1OTQwLCAxNjA0OSwgMTYwNDksCisxNjE0MiwgMTYxNDIsIDE2MjIxLCAxNjIyMSwgMTYyODQsIDE2Mjg0LCAxNjMzMSwgMTYzMzEsIDE2MzY0LCAxNjM2NCwKKzE2MzgxLCAxNjM4MSwgMTYzODIsIDE2MzgyLCAxNjM2OCwgMTYzNjgsIDE2MzM5LCAxNjMzOSwgMTYyOTQsIDE2Mjk0LAorMTYyMzQsIDE2MjM0LCAxNjE1OSwgMTYxNTksIDE2MDY5LCAxNjA2OSwgMTU5NjMsIDE1OTYzLCAxNTg0MiwgMTU4NDIsCisxNTcwNywgMTU3MDcsIDE1NTU3LCAxNTU1NywgMTUzOTIsIDE1MzkyLCAxNTIxMiwgMTUyMTIsIDE1MDE4LCAxNTAxOCwKKzE0ODEwLCAxNDgxMCwgMTQ1ODksIDE0NTg5LCAxNDM1MywgMTQzNTMsIDE0MTA0LCAxNDEwNCwgMTM4NDIsIDEzODQyLAorMTM1NjYsIDEzNTY2LCAxMzI3OCwgMTMyNzgsIDEyOTc3LCAxMjk3NywgMTI2NjUsIDEyNjY1LCAxMjM0MCwgMTIzNDAsCisxMjAwMywgMTIwMDMsIDExNjU2LCAxMTY1NiwgMTEyOTcsIDExMjk3LCAxMDkyOCwgMTA5MjgsIDEwNTQ4LCAxMDU0OCwKKzEwMTU5LCAxMDE1OSwgIDk3NTksICA5NzU5LCAgOTM1MSwgIDkzNTEsICA4OTM0LCAgODkzNCwgIDg1MDksICA4NTA5LAorODA3NSwgIDgwNzUsICA3NjM0LCAgNzYzNCwgIDcxODYsICA3MTg2LCAgNjczMSwgIDY3MzEsICA2MjY5LCAgNjI2OSwKKzU4MDIsICA1ODAyLCAgNTMyOSwgIDUzMjksICA0ODUyLCAgNDg1MiwgIDQzNjksICA0MzY5LCAgMzg4MywgIDM4ODMsCiszMzkzLCAgMzM5MywgIDI5MDAsICAyOTAwLCAgMjQwNCwgIDI0MDQsICAxOTA1LCAgMTkwNSwgIDE0MDUsICAxNDA1LAorOTA0LCAgIDkwNCwgICA0MDIsICAgNDAyLCAgLTEwMCwgIC0xMDAsICAtNjAzLCAgLTYwMywgLTExMDUsIC0xMTA1LAorLTE2MDUsIC0xNjA1LCAtMjEwNSwgLTIxMDUsIC0yNjAyLCAtMjYwMiwgLTMwOTcsIC0zMDk3LCAtMzU4OSwgLTM1ODksCistNDA3OCwgLTQwNzgsIC00NTYzLCAtNDU2MywgLTUwNDMsIC01MDQzLCAtNTUxOSwgLTU1MTksIC01OTkwLCAtNTk5MCwKKy02NDU1LCAtNjQ1NSwgLTY5MTQsIC02OTE0LCAtNzM2NiwgLTczNjYsIC03ODExLCAtNzgxMSwgLTgyNDksIC04MjQ5LAorLTg2ODAsIC04NjgwLCAtOTEwMiwgLTkxMDIsIC05NTE2LCAtOTUxNiwgLTk5MjAsIC05OTIwLCAtMTAzMTUsIC0xMDMxNSwKIC0xMDcwMSwgLTEwNzAxLCAtMTEwNzcsIC0xMTA3NywgLTExNDQyLCAtMTE0NDIsIC0xMTc5NiwgLTExNzk2LCAtMTIxMzksIC0xMjEzOSwKIC0xMjQ3MSwgLTEyNDcxLCAtMTI3OTEsIC0xMjc5MSwgLTEzMDk5LCAtMTMwOTksIC0xMzM5NSwgLTEzMzk1LCAtMTM2NzgsIC0xMzY3OCwKIC0xMzk0OCwgLTEzOTQ4LCAtMTQyMDUsIC0xNDIwNSwgLTE0NDQ5LCAtMTQ0NDksIC0xNDY3OSwgLTE0Njc5LCAtMTQ4OTUsIC0xNDg5NSwKQEAgLTMyMSwzNSArMzQ5LDM1IEBACiAtMTQyMDUsIC0xNDIwNSwgLTEzOTQ4LCAtMTM5NDgsIC0xMzY3OCwgLTEzNjc4LCAtMTMzOTUsIC0xMzM5NSwgLTEzMDk5LCAtMTMwOTksCiAtMTI3OTEsIC0xMjc5MSwgLTEyNDcxLCAtMTI0NzEsIC0xMjEzOSwgLTEyMTM5LCAtMTE3OTYsIC0xMTc5NiwgLTExNDQyLCAtMTE0NDIsCiAtMTEwNzcsIC0xMTA3NywgLTEwNzAxLCAtMTA3MDEsIC0xMDMxNSwgLTEwMzE1LCAtOTkyMCwgLTk5MjAsIC05NTE2LCAtOTUxNiwKLSAtOTEwMiwgLTkxMDIsIC04NjgwLCAtODY4MCwgLTgyNDksIC04MjQ5LCAtNzgxMSwgLTc4MTEsIC03MzY2LCAtNzM2NiwKLSAtNjkxNCwgLTY5MTQsIC02NDU1LCAtNjQ1NSwgLTU5OTAsIC01OTkwLCAtNTUxOSwgLTU1MTksIC01MDQzLCAtNTA0MywKLSAtNDU2MywgLTQ1NjMsIC00MDc4LCAtNDA3OCwgLTM1ODksIC0zNTg5LCAtMzA5NywgLTMwOTcsIC0yNjAyLCAtMjYwMiwKLSAtMjEwNSwgLTIxMDUsIC0xNjA1LCAtMTYwNSwgLTExMDUsIC0xMTA1LCAgLTYwMywgIC02MDMsICAtMTAwLCAgLTEwMCwKLSAgIDQwMiwgICA0MDIsICAgOTA0LCAgIDkwNCwgIDE0MDUsICAxNDA1LCAgMTkwNSwgIDE5MDUsICAyNDA0LCAgMjQwNCwKLSAgMjkwMCwgIDI5MDAsICAzMzkzLCAgMzM5MywgIDM4ODMsICAzODgzLCAgNDM2OSwgIDQzNjksICA0ODUyLCAgNDg1MiwKLSAgNTMyOSwgIDUzMjksICA1ODAyLCAgNTgwMiwgIDYyNjksICA2MjY5LCAgNjczMSwgIDY3MzEsICA3MTg2LCAgNzE4NiwKLSAgNzYzNCwgIDc2MzQsICA4MDc1LCAgODA3NSwgIDg1MDksICA4NTA5LCAgODkzNCwgIDg5MzQsICA5MzUxLCAgOTM1MSwKLSAgOTc1OSwgIDk3NTksIDEwMTU5LCAxMDE1OSwgMTA1NDgsIDEwNTQ4LCAxMDkyOCwgMTA5MjgsIDExMjk3LCAxMTI5NywKLSAxMTY1NiwgMTE2NTYsIDEyMDAzLCAxMjAwMywgMTIzNDAsIDEyMzQwLCAxMjY2NSwgMTI2NjUsIDEyOTc3LCAxMjk3NywKLSAxMzI3OCwgMTMyNzgsIDEzNTY2LCAxMzU2NiwgMTM4NDIsIDEzODQyLCAxNDEwNCwgMTQxMDQsIDE0MzUzLCAxNDM1MywKLSAxNDU4OSwgMTQ1ODksIDE0ODEwLCAxNDgxMCwgMTUwMTgsIDE1MDE4LCAxNTIxMiwgMTUyMTIsIDE1MzkyLCAxNTM5MiwKLSAxNTU1NywgMTU1NTcsIDE1NzA3LCAxNTcwNywgMTU4NDIsIDE1ODQyLCAxNTk2MywgMTU5NjMsIDE2MDY5LCAxNjA2OSwKLSAxNjE1OSwgMTYxNTksIDE2MjM0LCAxNjIzNCwgMTYyOTQsIDE2Mjk0LCAxNjMzOSwgMTYzMzksIDE2MzY4LCAxNjM2OCwKLSAxNjM4MiwgMTYzODIsIDE2MzgxLCAxNjM4MSwgMTYzNjQsIDE2MzY0LCAxNjMzMSwgMTYzMzEsIDE2Mjg0LCAxNjI4NCwKLSAxNjIyMSwgMTYyMjEsIDE2MTQyLCAxNjE0MiwgMTYwNDksIDE2MDQ5LCAxNTk0MCwgMTU5NDAsIDE1ODE3LCAxNTgxNywKLSAxNTY3OCwgMTU2NzgsIDE1NTI1LCAxNTUyNSwgMTUzNTcsIDE1MzU3LCAxNTE3NSwgMTUxNzUsIDE0OTc4LCAxNDk3OCwKLSAxNDc2NywgMTQ3NjcsIDE0NTQzLCAxNDU0MywgMTQzMDQsIDE0MzA0LCAxNDA1MywgMTQwNTMsIDEzNzg4LCAxMzc4OCwKLSAxMzUxMCwgMTM1MTAsIDEzMjE5LCAxMzIxOSwgMTI5MTYsIDEyOTE2LCAxMjYwMCwgMTI2MDAsIDEyMjczLCAxMjI3MywKLSAxMTkzNSwgMTE5MzUsIDExNTg1LCAxMTU4NSwgMTEyMjQsIDExMjI0LCAxMDg1MywgMTA4NTMsIDEwNDcxLCAxMDQ3MSwKLSAxMDA3OSwgMTAwNzksICA5Njc5LCAgOTY3OSwgIDkyNjgsICA5MjY4LCAgODg1MCwgIDg4NTAsICA4NDIzLCAgODQyMywKLSAgNzk4OCwgIDc5ODgsICA3NTQ1LCAgNzU0NSwgIDcwOTUsICA3MDk1LCAgNjYzOSwgIDY2MzksICA2MTc2LCAgNjE3NiwKLSAgNTcwOCwgIDU3MDgsICA1MjM0LCAgNTIzNCwgIDQ3NTYsICA0NzU2LCAgNDI3MiwgIDQyNzIsICAzNzg1LCAgMzc4NSwKLSAgMzI5NCwgIDMyOTQsICAyODAxLCAgMjgwMSwgIDIzMDQsICAyMzA0LCAgMTgwNSwgIDE4MDUsICAxMzA1LCAgMTMwNSwKLSAgIDgwMywgICA4MDMsICAgMzAxLCAgIDMwMSwgIC0yMDEsICAtMjAxLCAgLTcwMywgIC03MDMsIC0xMjA1LCAtMTIwNSwKLSAtMTcwNSwgLTE3MDUsIC0yMjA0LCAtMjIwNCwgLTI3MDEsIC0yNzAxLCAtMzE5NiwgLTMxOTYsIC0zNjg3LCAtMzY4NywKLSAtNDE3NSwgLTQxNzUsIC00NjU5LCAtNDY1OSwgLTUxMzksIC01MTM5LCAtNTYxNCwgLTU2MTQsIC02MDgzLCAtNjA4MywKLSAtNjU0NywgLTY1NDcsIC03MDA1LCAtNzAwNSwgLTc0NTYsIC03NDU2LCAtNzkwMCwgLTc5MDAsIC04MzM2LCAtODMzNiwKLSAtODc2NSwgLTg3NjUsIC05MTg1LCAtOTE4NSwgLTk1OTcsIC05NTk3LCAtMTAwMDAsIC0xMDAwMCwgLTEwMzkzLCAtMTAzOTMsCistOTEwMiwgLTkxMDIsIC04NjgwLCAtODY4MCwgLTgyNDksIC04MjQ5LCAtNzgxMSwgLTc4MTEsIC03MzY2LCAtNzM2NiwKKy02OTE0LCAtNjkxNCwgLTY0NTUsIC02NDU1LCAtNTk5MCwgLTU5OTAsIC01NTE5LCAtNTUxOSwgLTUwNDMsIC01MDQzLAorLTQ1NjMsIC00NTYzLCAtNDA3OCwgLTQwNzgsIC0zNTg5LCAtMzU4OSwgLTMwOTcsIC0zMDk3LCAtMjYwMiwgLTI2MDIsCistMjEwNSwgLTIxMDUsIC0xNjA1LCAtMTYwNSwgLTExMDUsIC0xMTA1LCAgLTYwMywgIC02MDMsICAtMTAwLCAgLTEwMCwKKzQwMiwgICA0MDIsICAgOTA0LCAgIDkwNCwgIDE0MDUsICAxNDA1LCAgMTkwNSwgIDE5MDUsICAyNDA0LCAgMjQwNCwKKzI5MDAsICAyOTAwLCAgMzM5MywgIDMzOTMsICAzODgzLCAgMzg4MywgIDQzNjksICA0MzY5LCAgNDg1MiwgIDQ4NTIsCis1MzI5LCAgNTMyOSwgIDU4MDIsICA1ODAyLCAgNjI2OSwgIDYyNjksICA2NzMxLCAgNjczMSwgIDcxODYsICA3MTg2LAorNzYzNCwgIDc2MzQsICA4MDc1LCAgODA3NSwgIDg1MDksICA4NTA5LCAgODkzNCwgIDg5MzQsICA5MzUxLCAgOTM1MSwKKzk3NTksICA5NzU5LCAxMDE1OSwgMTAxNTksIDEwNTQ4LCAxMDU0OCwgMTA5MjgsIDEwOTI4LCAxMTI5NywgMTEyOTcsCisxMTY1NiwgMTE2NTYsIDEyMDAzLCAxMjAwMywgMTIzNDAsIDEyMzQwLCAxMjY2NSwgMTI2NjUsIDEyOTc3LCAxMjk3NywKKzEzMjc4LCAxMzI3OCwgMTM1NjYsIDEzNTY2LCAxMzg0MiwgMTM4NDIsIDE0MTA0LCAxNDEwNCwgMTQzNTMsIDE0MzUzLAorMTQ1ODksIDE0NTg5LCAxNDgxMCwgMTQ4MTAsIDE1MDE4LCAxNTAxOCwgMTUyMTIsIDE1MjEyLCAxNTM5MiwgMTUzOTIsCisxNTU1NywgMTU1NTcsIDE1NzA3LCAxNTcwNywgMTU4NDIsIDE1ODQyLCAxNTk2MywgMTU5NjMsIDE2MDY5LCAxNjA2OSwKKzE2MTU5LCAxNjE1OSwgMTYyMzQsIDE2MjM0LCAxNjI5NCwgMTYyOTQsIDE2MzM5LCAxNjMzOSwgMTYzNjgsIDE2MzY4LAorMTYzODIsIDE2MzgyLCAxNjM4MSwgMTYzODEsIDE2MzY0LCAxNjM2NCwgMTYzMzEsIDE2MzMxLCAxNjI4NCwgMTYyODQsCisxNjIyMSwgMTYyMjEsIDE2MTQyLCAxNjE0MiwgMTYwNDksIDE2MDQ5LCAxNTk0MCwgMTU5NDAsIDE1ODE3LCAxNTgxNywKKzE1Njc4LCAxNTY3OCwgMTU1MjUsIDE1NTI1LCAxNTM1NywgMTUzNTcsIDE1MTc1LCAxNTE3NSwgMTQ5NzgsIDE0OTc4LAorMTQ3NjcsIDE0NzY3LCAxNDU0MywgMTQ1NDMsIDE0MzA0LCAxNDMwNCwgMTQwNTMsIDE0MDUzLCAxMzc4OCwgMTM3ODgsCisxMzUxMCwgMTM1MTAsIDEzMjE5LCAxMzIxOSwgMTI5MTYsIDEyOTE2LCAxMjYwMCwgMTI2MDAsIDEyMjczLCAxMjI3MywKKzExOTM1LCAxMTkzNSwgMTE1ODUsIDExNTg1LCAxMTIyNCwgMTEyMjQsIDEwODUzLCAxMDg1MywgMTA0NzEsIDEwNDcxLAorMTAwNzksIDEwMDc5LCAgOTY3OSwgIDk2NzksICA5MjY4LCAgOTI2OCwgIDg4NTAsICA4ODUwLCAgODQyMywgIDg0MjMsCis3OTg4LCAgNzk4OCwgIDc1NDUsICA3NTQ1LCAgNzA5NSwgIDcwOTUsICA2NjM5LCAgNjYzOSwgIDYxNzYsICA2MTc2LAorNTcwOCwgIDU3MDgsICA1MjM0LCAgNTIzNCwgIDQ3NTYsICA0NzU2LCAgNDI3MiwgIDQyNzIsICAzNzg1LCAgMzc4NSwKKzMyOTQsICAzMjk0LCAgMjgwMSwgIDI4MDEsICAyMzA0LCAgMjMwNCwgIDE4MDUsICAxODA1LCAgMTMwNSwgIDEzMDUsCis4MDMsICAgODAzLCAgIDMwMSwgICAzMDEsICAtMjAxLCAgLTIwMSwgIC03MDMsICAtNzAzLCAtMTIwNSwgLTEyMDUsCistMTcwNSwgLTE3MDUsIC0yMjA0LCAtMjIwNCwgLTI3MDEsIC0yNzAxLCAtMzE5NiwgLTMxOTYsIC0zNjg3LCAtMzY4NywKKy00MTc1LCAtNDE3NSwgLTQ2NTksIC00NjU5LCAtNTEzOSwgLTUxMzksIC01NjE0LCAtNTYxNCwgLTYwODMsIC02MDgzLAorLTY1NDcsIC02NTQ3LCAtNzAwNSwgLTcwMDUsIC03NDU2LCAtNzQ1NiwgLTc5MDAsIC03OTAwLCAtODMzNiwgLTgzMzYsCistODc2NSwgLTg3NjUsIC05MTg1LCAtOTE4NSwgLTk1OTcsIC05NTk3LCAtMTAwMDAsIC0xMDAwMCwgLTEwMzkzLCAtMTAzOTMsCiAtMTA3NzcsIC0xMDc3NywgLTExMTUwLCAtMTExNTAsIC0xMTUxMywgLTExNTEzLCAtMTE4NjYsIC0xMTg2NiwgLTEyMjA3LCAtMTIyMDcsCiAtMTI1MzYsIC0xMjUzNiwgLTEyODU0LCAtMTI4NTQsIC0xMzE1OSwgLTEzMTU5LCAtMTM0NTIsIC0xMzQ1MiwgLTEzNzMzLCAtMTM3MzMsCiAtMTQwMDEsIC0xNDAwMSwgLTE0MjU1LCAtMTQyNTUsIC0xNDQ5NiwgLTE0NDk2LCAtMTQ3MjMsIC0xNDcyMywgLTE0OTM3LCAtMTQ5MzcsCkBAIC0zNjIsMTAgKzM5MCwxMCBAQAogLTE0MTU1LCAtMTQxNTUsIC0xMzg5NSwgLTEzODk1LCAtMTM2MjIsIC0xMzYyMiwgLTEzMzM3LCAtMTMzMzcsIC0xMzAzOCwgLTEzMDM4LAogLTEyNzI4LCAtMTI3MjgsIC0xMjQwNiwgLTEyNDA2LCAtMTIwNzIsIC0xMjA3MiwgLTExNzI2LCAtMTE3MjYsIC0xMTM3MCwgLTExMzcwLAogLTExMDAyLCAtMTEwMDIsIC0xMDYyNSwgLTEwNjI1LCAtMTAyMzcsIC0xMDIzNywgLTk4NDAsIC05ODQwLCAtOTQzNCwgLTk0MzQsCi0gLTkwMTgsIC05MDE4LCAtODU5NCwgLTg1OTQsIC04MTYyLCAtODE2MiwgLTc3MjMsIC03NzIzLCAtNzI3NiwgLTcyNzYsCi0gLTY4MjIsIC02ODIyLCAtNjM2MiwgLTYzNjIsIC01ODk2LCAtNTg5NiwgLTU0MjQsIC01NDI0LCAtNDk0OCwgLTQ5NDgsCi0gLTQ0NjYsIC00NDY2LCAtMzk4MCwgLTM5ODAsIC0zNDkxLCAtMzQ5MSwgLTI5OTgsIC0yOTk4LCAtMjUwMywgLTI1MDMsCi0gLTIwMDUsIC0yMDA1LCAtMTUwNSwgLTE1MDUsIC0xMDA0LCAtMTAwNCwgIC01MDIsICAtNTAyCistOTAxOCwgLTkwMTgsIC04NTk0LCAtODU5NCwgLTgxNjIsIC04MTYyLCAtNzcyMywgLTc3MjMsIC03Mjc2LCAtNzI3NiwKKy02ODIyLCAtNjgyMiwgLTYzNjIsIC02MzYyLCAtNTg5NiwgLTU4OTYsIC01NDI0LCAtNTQyNCwgLTQ5NDgsIC00OTQ4LAorLTQ0NjYsIC00NDY2LCAtMzk4MCwgLTM5ODAsIC0zNDkxLCAtMzQ5MSwgLTI5OTgsIC0yOTk4LCAtMjUwMywgLTI1MDMsCistMjAwNSwgLTIwMDUsIC0xNTA1LCAtMTUwNSwgLTEwMDQsIC0xMDA0LCAgLTUwMiwgIC01MDIKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkCkBAIC0zNzUsMTAgKzQwMywxMiBAQAogdW5zaWduZWQgY2hhciAqcDI7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBhdWRpb19idWZmZXI7CiAKLUpPVCg4LCAiJWk9YXVkaW9fZmlsbFxuIiwgYXVkaW9fZmlsbCk7Ci0KK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuOworfQorSk9NKDgsICIlaT1hdWRpb19maWxsXG4iLCBhdWRpb19maWxsKTsKIHBhdWRpb19idWZmZXIgPSAmcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlclthdWRpb19maWxsXTsKLQogcDIgPSAodW5zaWduZWQgY2hhciAqKShwYXVkaW9fYnVmZmVyLT5wZ28pOwogZm9yIChpMSA9IDA7ICBpMSA8IFBBR0VfU0laRTsgIGkxICs9IDQsIHAyICs9IDQpIHsKIAkqcDIgICAgICAgPSAodW5zaWduZWQgY2hhcikgKDB4MDBGRiAmIHRvbmVzW2kxLzJdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYwppbmRleCAxMGJjYjQ1Li5mNjJiYTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCkBAIC03ODMsNyArNzgzLDcgQEAKIAkvKiBSZXRyaWV2ZSB0aGUgbmV0X2RldmljZSBwb2ludGVyIGZyb20gdGhlIHBjaV9kZXYgc3RydWN0LCBhcyB3ZWxsCiAJICogYXMgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QKIAkgKi8KLQluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCS8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCmluZGV4IGVmN2ZiZjguLjJiYWJiMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYwpAQCAtODksNyArODksNyBAQAogCiAvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KICNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8gXAotICAgIHsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQorCXsgaWYgKGRlYnVnKSBkZXZfaW5mbyhkZXYgLCBmb3JtYXQgLCAjIyBhcmcpOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGFscGhhdHJhY2tfb2NtZF9pbmZvKGRldiwgY21kLCBmb3JtYXQsIGFyZy4uLikKIApAQCAtNzY5LDcgKzc2OSw3IEBACiAJfQogCiAJZGV2LT53cml0ZV9idWZmZXIgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxwaGF0cmFja19vY21kKSAqIHRydWVfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJICAgIGttYWxsb2ModHJ1ZV9zaXplICogc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX29jbWQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghZGV2LT53cml0ZV9idWZmZXIpIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgd3JpdGVfYnVmZmVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYwppbmRleCBlZWQ3ZTk0Li41ODhhZmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW5saW5lIHUxNiBmdDEwMDBfcmVhZF9maWZvX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewogCQlyZXR1cm4gKGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfVUZJRk9fU1RBVCkgLSAxNik7CkBAIC0xNTUsNyArMTU1LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1MTYgZnQxMDAwX3JlYWRfZHByYW0oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBvZmZzZXQpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgZGF0YTsKIApAQCAtMTg0LDcgKzE4NCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnQxMDAwX3dyaXRlX2RwcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgaW50IG9mZnNldCwgdTE2IHZhbHVlKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvLyBQcm92aWRlIG11dHVhbCBleGNsdXNpdmUgYWNjZXNzIHdoaWxlIHJlYWRpbmcgQVNJQyByZWdpc3RlcnMuCkBAIC0yMDgsNyArMjA4LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1MTYgZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmZzZXQsIGludCBJbmRleCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBkYXRhOwogCkBAIC0yNDIsNyArMjQyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdDEwMDBfd3JpdGVfZHByYW1fbWFnXzE2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgaW50IG9mZnNldCwgdTE2IHZhbHVlLCBpbnQgSW5kZXgpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8vIFByb3ZpZGUgbXV0dWFsIGV4Y2x1c2l2ZSBhY2Nlc3Mgd2hpbGUgcmVhZGluZyBBU0lDIHJlZ2lzdGVycy4KQEAgLTI3MCw3ICsyNzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHUzMiBmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBkYXRhOwogCkBAIC0yOTgsNyArMjk4LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF93cml0ZV9kcHJhbV9tYWdfMzIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCwgdTMyIHZhbHVlKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvLyBQcm92aWRlIG11dHVhbCBleGNsdXNpdmUgYWNjZXNzIHdoaWxlIHJlYWRpbmcgQVNJQyByZWdpc3RlcnMuCkBAIC0zMjAsNyArMzIwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBmdDEwMDBfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OmZ0MTAwMF9lbmFibGVfaW50ZXJydXB0cygpXG4iKTsKQEAgLTM0NSw3ICszNDUsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIGZ0MTAwMF9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OiBmdDEwMDBfZGlzYWJsZV9pbnRlcnJ1cHRzKClcbiIpOwpAQCAtMzcwLDcgKzM3MCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgZnQxMDAwX3Jlc2V0X2FzaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OmZ0MTAwMF9yZXNldF9hc2ljIGNhbGxlZFxuIik7CkBAIC00MTQsNyArNDE0LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW50IGZ0MTAwMF9yZXNldF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHRlbXB3b3JkOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02MTgsNyArNjE4LDcgQEAKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAlVU0hPUlQgdGVtcHdvcmQ7CiAKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoaW5mby0+Q2FyZFJlYWR5ID09IDEpIHsKIAkJLy8gUGVyZm9ybSBkc3AgaGVhcnRiZWF0IGNoZWNrCkBAIC04MzEsNyArODMxLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF9zZW5kX2NtZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwdGVtcGJ1ZmZlciwgaW50IHNpemUsIHUxNiBxdHlwZSkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKIAl1MTYgdGVtcHdvcmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkxNiw3ICs5MTYsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEJPT0xFQU4gZnQxMDAwX3JlY2VpdmVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqIHBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHNpemU7CiAJdTE2ICpwcHNldWRvaGRyOwogCWludCBpOwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkIGZ0MTAwMF9wcm9jX2Rydm1zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBtc2d0eXBlOwogCXUxNiB0ZW1wd29yZDsKIAlQTUVESUFNU0cgcG1lZGlhbXNnOwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZnQxMDAwX3BhcnNlX2RwcmFtX21zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBkb29yYmVsbDsKIAl1MTYgcG9ydGlkOwogCXUxNiBueHRwaDsKQEAgLTE0NDksNyArMTQ0OSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgZnQxMDAwX2ZsdXNoX2ZpZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IERydkVyck51bSkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgaTsKIAl1MzIgdGVtcGxvbmc7CiAJdTE2IHRlbXB3b3JkOwpAQCAtMTU5Niw3ICsxNTk2LDcgQEAKIGludCBmdDEwMDBfY29weV91cF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1MTYgdGVtcHdvcmQ7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXUxNiBpOwpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZnQxMDAwX2NvcHlfZG93bl9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICogcGFja2V0LCB1MTYgbGVuKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuaW9uIHsKIAkJUFNFVURPX0hEUiBibGs7CiAJCXUxNiBidWZmW3NpemVvZihQU0VVRE9fSERSKSA+PiAxXTsKQEAgLTE5NDMsNyArMTk0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZnQxMDAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJcmV0dXJuICgmaW5mby0+c3RhdHMpOwogfQogCkBAIC0xOTY3LDcgKzE5NjcsNyBAQAogCiBzdGF0aWMgaW50IGZ0MTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJREVCVUcoMCwgImZ0MTAwMF9odzogZnQxMDAwX2Nsb3NlKClcbiIpOwogCkBAIC0xOTg5LDcgKzE5ODksNyBAQAogCiBzdGF0aWMgaW50IGZ0MTAwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTggKnBkYXRhOwogCiAJREVCVUcoMSwgImZ0MTAwMF9odzogZnQxMDAwX3N0YXJ0X3htaXQoKVxuIik7CkBAIC0yMDI2LDcgKzIwMjYsNyBAQAogc3RhdGljIGlycXJldHVybl90IGZ0MTAwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHRlbXB3b3JkOwogCXUxNiBpbnR0eXBlOwogCWludCBjbnQ7CkBAIC0yMDkxLDcgKzIwOTEsNyBAQAogCiB2b2lkIHN0b3BfZnQxMDAwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlQUFJPVl9SRUNPUkQgcHRyOwogLy8JaW50IGNudDsKIApAQCAtMjEyNyw3ICsyMTI3LDcgQEAKIAkJCQkgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCUZUMTAwMF9JTkZPICpmdF9pbmZvOwotCWZ0X2luZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlmdF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXNucHJpbnRmKGluZm8tPmRyaXZlciwgMzIsICJmdDEwMDAiKTsKIAlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgRVRIVE9PTF9CVVNJTkZPX0xFTiwgIlBDTUNJQSAweCVseCIsCkBAIC0yMTM5LDcgKzIxMzksNyBAQAogc3RhdGljIHUzMiBmdDEwMDBfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJcmV0dXJuIGluZm8tPm1lZGlhc3RhdGU7CiB9CiAKQEAgLTIxODUsNyArMjE4NSw3IEBACiAJfQogCiAJU0VUX05FVERFVl9ERVYoZGV2LCBmZGV2KTsKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKEZUMTAwMF9JTkZPKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKaW5kZXggYjQ1ZGU5Yi4uOTM1NjA4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMKQEAgLTY1LDcgKzY1LDcgQEAKIAl0aW1lX3QgZGVsdGE7CiAKIAlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChvZmYgPiAwKSB7CiAJCSplb2YgPSAxOwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgpAQCAtMTk1LDcgKzE5NSw3IEBACiB7CiAJRlQxMDAwX0lORk8gKmluZm87CiAKLQlpbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpbmZvLT5wcm9jX2Z0MTAwMCA9IHByb2NfbWtkaXIoRlQxMDAwX1BST0MsIGluaXRfbmV0LnByb2NfbmV0KTsKIAljcmVhdGVfcHJvY19yZWFkX2VudHJ5KGRldi0+bmFtZSwgMDY0NCwgaW5mby0+cHJvY19mdDEwMDAsCkBAIC0yMDgsNyArMjA4LDcgQEAKIHsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgaW5mby0+cHJvY19mdDEwMDApOwogCXJlbW92ZV9wcm9jX2VudHJ5KEZUMTAwMF9QUk9DLCBpbml0X25ldC5wcm9jX25ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvTWFrZWZpbGUKaW5kZXggZGQ4N2VjZC4uZjBmNTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9NYWtlZmlsZQpAQCAtMSwzICsxLDMgQEAKIG9iai0kKENPTkZJR19GVDEwMDBfVVNCKSArPSBmdDEwMDAubwogCi1mdDEwMDAteSA6PSBmdDEwMDBfY2hkZXYubyBmdDEwMDBfZG93bmxvYWQubyBmdDEwMDBfaHcubyBmdDEwMDBfcHJvYy5vIGZ0MTAwMF91c2IubworZnQxMDAwLXkgOj0gZnQxMDAwX2RlYnVnLm8gZnQxMDAwX2Rvd25sb2FkLm8gZnQxMDAwX2h3Lm8gZnQxMDAwX3Byb2MubyBmdDEwMDBfdXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfY2hkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2NoZGV2LmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwppbmRleCAyMGQ1MDk4Li4xNDliYTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2NoZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCkBAIC0yNywzMyArMjcsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgImZ0MTAwMF91c2IuaCIKLS8vI2luY2x1ZGUgImZ0MTAwMF9pb2N0bC5oIgogCiBzdGF0aWMgaW50IGZ0MTAwMF9mbGFyaW9uX2NudCA9IDA7CiAKLS8vbmVlZCB0byBsb29raW5nIHVzYWdlIG9mIGZ0MTAwMEhhbmRsZQotCi1zdGF0aWMgaW50IGZ0MTAwMF9DaE9wZW4gKHN0cnVjdCBpbm9kZSAqSW5vZGUsIHN0cnVjdCBmaWxlICpGaWxlKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX0NoUG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7Ci1zdGF0aWMgbG9uZyBmdDEwMDBfQ2hJb2N0bChzdHJ1Y3QgZmlsZSAqRmlsZSwgdW5zaWduZWQgaW50IENvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIEFyZ3VtZW50KTsKLXN0YXRpYyBpbnQgZnQxMDAwX0NoUmVsZWFzZSAoc3RydWN0IGlub2RlICpJbm9kZSwgc3RydWN0IGZpbGUgKkZpbGUpOwotCi0vLyBHbG9iYWwgcG9pbnRlciB0byBkZXZpY2Ugb2JqZWN0Ci1zdGF0aWMgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKnBkZXZvYmpbTUFYX05VTV9DQVJEUyArIDJdOwotLy9zdGF0aWMgZGV2ZnNfaGFuZGxlX3QgZnQxMDAwSGFuZGxlW01BWF9OVU1fQ0FSRFNdOworc3RhdGljIGludCBmdDEwMDBfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHVuc2lnbmVkIGludCBmdDEwMDBfcG9sbF9kZXYoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworc3RhdGljIGxvbmcgZnQxMDAwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpOworc3RhdGljIGludCBmdDEwMDBfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiAvLyBMaXN0IHRvIGZyZWUgcmVjZWl2ZSBjb21tYW5kIGJ1ZmZlciBwb29sCiBzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVyY3Zwb29sOwpAQCAtNjMsMTAzICs1MiwxOCBAQAogCiBpbnQgbnVtb2Ztc2didWYgPSAwOwogCi0vLyBHbG9iYWwgdmFyaWFibGUgdG8gaW5kaWNhdGUgdGhhdCBhbGwgcHJvdmlzaW9uaW5nIGRhdGEgaXMgc2VudCB0byBEU1AKLS8vQk9PTEVBTiBmUHJvdkNvbXBsZXRlOwotCiAvLwogLy8gVGFibGUgb2YgZW50cnktcG9pbnQgcm91dGluZXMgZm9yIGNoYXIgZGV2aWNlCiAvLwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnQxMDAwZm9wcyA9CiB7Ci0JLnVubG9ja2VkX2lvY3RsCT0gZnQxMDAwX0NoSW9jdGwsCi0JLnBvbGwJCT0gZnQxMDAwX0NoUG9sbCwKLQkub3BlbgkJPSBmdDEwMDBfQ2hPcGVuLAotCS5yZWxlYXNlCT0gZnQxMDAwX0NoUmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBmdDEwMDBfaW9jdGwsCisJLnBvbGwJCT0gZnQxMDAwX3BvbGxfZGV2LAorCS5vcGVuCQk9IGZ0MTAwMF9vcGVuLAorCS5yZWxlYXNlCT0gZnQxMDAwX3JlbGVhc2UsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiB9OwogCi0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnVuY3Rpb246ICAgIGV4ZWNfbWtub2QKLS8vCi0vLyBQYXJhbWV0ZXJzOgotLy8KLS8vIFJldHVybnM6Ci0vLwotLy8gRGVzY3JpcHRpb246Ci0vLwotLy8gTm90ZXM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgZXhlY19ta25vZCAodm9pZCAqcGRhdGEpCi17Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwotICAgIGNoYXIgbWpudW1bNF07Ci0gICAgY2hhciBtaW5vcm51bVs0XTsKLSAgICBjaGFyIHRlbXBbMzJdOwotICAgIGludCByZXRjb2RlOwotLy8gICAgaW50IGk7CQkJCQkvL2FlbGlhcyBbLV0gcmVhc29uIDogdW51c2VkIHZhcmlhYmxlCi0gICAgY2hhciAqZW52cFtdID0geyAiSE9NRT0vIiwgIlBBVEg9L3Vzci9iaW46L2JpbiIsIE5VTEwgfTsKLSAgICBjaGFyICphcmd2W109eyItbSA2NjYiLHRlbXAsImMiLG1qbnVtLG1pbm9ybnVtLE5VTEx9OwotCi0gICAgaW5mbyA9IHBkYXRhOwotICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6ZXhlY19ta25vZCBpcyBjYWxsZWQgd2l0aCBtYWpvciBudW1iZXIgPSAlZFxuIiwgaW5mby0+RGV2aWNlTWFqb3IpOwotICAgIHNwcmludGYodGVtcCwgIiVzJXMiLCAiL2Rldi8iLCBpbmZvLT5EZXZpY2VOYW1lKSA7Ci0gICAgc3ByaW50Zihtam51bSwgIiVkIiwgaW5mby0+RGV2aWNlTWFqb3IpOwotICAgIHNwcmludGYobWlub3JudW0sICIlZCIsIGluZm8tPkNhcmROdW1iZXIpOwotCi0gICAgLy9jaGFyICphcmd2W109eyJta25vZCIsIi1tIDY2NiIsdGVtcCwiYyIsbWpudW0sbWlub3JudW0sTlVMTH07Ci0vLyAgICBjaGFyICphcmd2W109eyItbSA2NjYiLHRlbXAsImMiLG1qbnVtLG1pbm9ybnVtLE5VTEx9OwotCi0gICAgLy9mb3IgKGk9MDsgaTw3O2krKykKLSAgICAvLyAgICBERUJVRygiYXJndlslZF09JXNcbiIsIGksIGFyZ3ZbaV0pOwotCi0KLSAgICByZXRjb2RlID0gY2FsbF91c2VybW9kZWhlbHBlciAoIi9iaW4vbWtub2QiLCBhcmd2LCBlbnZwLCAxKTsKLSAgICBpZiAocmV0Y29kZSkgewotICAgICAgICBERUJVRygiZnQxMDAwX2NoZGV2OmV4ZWNfbWtub2QgZmFpbGVkIHRvIG1ha2UgdGhlIG5vZGU6IHJldGNvZGUgPSAlZFxuIiwgcmV0Y29kZSk7Ci0gICAgfQotCi0KLQotICAgIHJldHVybiByZXRjb2RlOwotCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgcm1fbWtub2QKLS8vCi0vLyBEZXNjcmlwdGlvbjogVGhpcyBtb2R1bGUgcmVtb3ZlcyB0aGUgRlQxMDAwIGRldmljZSBmaWxlCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgcm1fbWtub2QgKHZvaWQgKnBkYXRhKQotewotCi0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwotICAgIC8vY2hhciAqYXJndls0XT17InJtIiwgIi1mIiwgIi9kZXYvRlQxMDAwIiwgTlVMTH07Ci0gICAgaW50IHJldGNvZGU7Ci0gICAgY2hhciB0ZW1wWzMyXTsKLSAgICBjaGFyICphcmd2W109eyJybSIsICItZiIsIHRlbXAsIE5VTEx9OwotCi0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKilwZGF0YTsKLSAgICBERUJVRygiZnQxMDAwX2NoZGV2OnJtX21rbm9kIGlzIGNhbGxlZCBmb3IgZGV2aWNlICVzXG4iLCBpbmZvLT5EZXZpY2VOYW1lKTsKLSAgICBzcHJpbnRmKHRlbXAsICIlcyVzIiwgIi9kZXYvIiwgaW5mby0+RGV2aWNlTmFtZSkgOwotCi0vLyAgICBjaGFyICphcmd2W109eyJybSIsICItZiIsIHRlbXAsIE5VTEx9OwotCi0gICAgcmV0Y29kZSA9IGNhbGxfdXNlcm1vZGVoZWxwZXIgKCIvYmluL3JtIiwgYXJndiwgTlVMTCwgMSk7Ci0gICAgaWYgKHJldGNvZGUpIHsKLSAgICAgICAgREVCVUcoImZ0MTAwMF9jaGRldjpybV9ta25vZCBmYWlsZWQgdG8gcmVtb3ZlIHRoZSBub2RlOiByZXRjb2RlID0gJWRcbiIsIHJldGNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6cm1fbWtub2QgZG9uZSFcbiIpOwotCi0KLSAgICByZXR1cm4gcmV0Y29kZTsKLQotfQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfZ2V0X2J1ZmZlcgogLy8KQEAgLTIzMyw4MCArMTM3LDU1IEBACiAvLyBOb3RlczogICAgICAgT25seSBjYWxsZWQgYnkgaW5pdF9tb2R1bGUoKS4KIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IGZ0MTAwMF9DcmVhdGVEZXZpY2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldikKK2ludCBmdDEwMDBfY3JlYXRlX2RldihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKICAgICBpbnQgcmVzdWx0OwogICAgIGludCBpOwotICAgIHBpZF90IHBpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIsICpmaWxlOworCXN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyAqdG1wOwogCiAgICAgLy8gbWFrZSBhIG5ldyBkZXZpY2UgbmFtZQotICAgIHNwcmludGYoaW5mby0+RGV2aWNlTmFtZSwgIiVzJWQiLCAiRlQxMDAiLCBpbmZvLT5DYXJkTnVtYmVyKTsKKyAgICBzcHJpbnRmKGluZm8tPkRldmljZU5hbWUsICIlcyVkIiwgIkZUMTAwMF8iLCBpbmZvLT5DYXJkTnVtYmVyKTsKIAotICAgIC8vIERlbGV0ZSBhbnkgZXhpc3RpbmcgRlQxMDAwIG5vZGUKLSAgICBwaWQgPSBrZXJuZWxfdGhyZWFkIChybV9ta25vZCwodm9pZCAqKWluZm8sIDApOwotICAgIG1zbGVlcCgxMDAwKTsKLQotICAgIERFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiBudW1iZXIgb2YgaW5zdGFuY2UgPSAlZFxuIiwgZnQxMDAwX2ZsYXJpb25fY250KTsKKyAgICBERUJVRygiJXM6IG51bWJlciBvZiBpbnN0YW5jZSA9ICVkXG4iLCBfX2Z1bmNfXywgZnQxMDAwX2ZsYXJpb25fY250KTsKICAgICBERUJVRygiRGV2aWNlQ3JlYXRlZCA9ICV4XG4iLCBpbmZvLT5EZXZpY2VDcmVhdGVkKTsKIAotICAgIC8vc2F2ZSB0aGUgZGV2aWNlIGluZm8gdG8gZ2xvYmFsIGFycmF5Ci0gICAgcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSA9IGRldjsKLQotICAgIERFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiAqKioqKipTQVZFRCBwZGV2b2JqWyVkXT0lcFxuIiwgaW5mby0+Q2FyZE51bWJlciwgcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSk7CS8vYWVsaWFzIFsrXSByZWFzb246dXAKLQogICAgIGlmIChpbmZvLT5EZXZpY2VDcmVhdGVkKQogICAgIHsKLQlERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogXCIlc1wiIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgaW5mby0+RGV2aWNlTmFtZSk7CisJREVCVUcoIiVzOiBcIiVzXCIgYWxyZWFkeSByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXywgaW5mby0+RGV2aWNlTmFtZSk7CiAJcmV0dXJuIC1FSU87CiAgICAgfQogCiAKICAgICAvLyByZWdpc3RlciB0aGUgZGV2aWNlCi0gICAgREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6IFwiJXNcIiBkZXZpY2UgcmVnaXN0cmF0aW9uXG4iLCBpbmZvLT5EZXZpY2VOYW1lKTsKLSAgICBpbmZvLT5EZXZpY2VNYWpvciA9IDA7CisgICAgREVCVUcoIiVzOiBcIiVzXCIgZGVidWdmcyBkZXZpY2UgcmVnaXN0cmF0aW9uXG4iLCBfX2Z1bmNfXywgaW5mby0+RGV2aWNlTmFtZSk7CiAKLSAgICByZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXYoaW5mby0+RGV2aWNlTWFqb3IsIGluZm8tPkRldmljZU5hbWUsICZmdDEwMDBmb3BzKTsKLSAgICBpZiAocmVzdWx0IDwgMCkKLSAgICB7Ci0JREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsIGluZm8tPkRldmljZU1ham9yKTsKLQlyZXR1cm4gcmVzdWx0OwotICAgIH0KKwl0bXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gLTE7CisJCWdvdG8gZmFpbDsKKwl9CiAKLSAgICBERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogcmVnaXN0ZXJlZCBjaGFyIGRldmljZSBcIiVzXCJcbiIsIGluZm8tPkRldmljZU5hbWUpOworCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihpbmZvLT5EZXZpY2VOYW1lLCAwKTsKKwlpZiAoSVNfRVJSKGRpcikpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihkaXIpOworCQlnb3RvIGRlYnVnX2Rpcl9mYWlsOworCX0KIAotICAgIC8vIHNhdmUgYSBkeW5hbWljIGRldmljZSBtYWpvciBudW1iZXIKLSAgICBpZiAoaW5mby0+RGV2aWNlTWFqb3IgPT0gMCkKLSAgICB7Ci0JaW5mby0+RGV2aWNlTWFqb3IgPSByZXN1bHQ7Ci0JREVCVUcoImZ0MTAwMF9QY2RDcmVhdGVEZXZpY2U6IGRldmljZSBtYWpvciA9ICVkXG4iLCBpbmZvLT5EZXZpY2VNYWpvcik7Ci0gICAgfQorCWZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkZXZpY2UiLCBTX0lSVUdPIHwgU19JV1VTUiwgZGlyLAorCQkJCQlkZXYsICZmdDEwMDBmb3BzKTsKKwlpZiAoSVNfRVJSKGZpbGUpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoZmlsZSk7CisJCWdvdG8gZGVidWdfZmlsZV9mYWlsOworCX0KIAotICAgIC8vIENyZWF0ZSBhIHRocmVhZCB0byBjYWxsIHVzZXIgbW9kZSBhcHAgdG8gbWtub2QKLSAgICBwaWQgPSBrZXJuZWxfdGhyZWFkIChleGVjX21rbm9kLCAodm9pZCAqKWluZm8sIDApOworCXRtcC0+ZGVudCA9IGRpcjsKKwl0bXAtPmZpbGUgPSBmaWxlOworCXRtcC0+aW50X251bWJlciA9IGluZm8tPkNhcmROdW1iZXI7CisJbGlzdF9hZGQoJih0bXAtPmxpc3QpLCAmKGluZm8tPm5vZGVzLmxpc3QpKTsKIAotICAgIC8vIGluaXRpYWxpemUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24KLQotLy8gICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7Ci0vLwotLy8gICAgCSAgREVCVUcoIkluaXRpYWxpemUgZnJlZV9idWZmX2xvY2sgYW5kIGZyZWVyY3Zwb29sXG4iKTsKLS8vICAgICAgICBzcGluX2xvY2tfaW5pdCgmZnJlZV9idWZmX2xvY2spOwotLy8KLS8vICAgICAgICAvLyBpbml0aWFsaXplIGEgbGlzdCBvZiBidWZmZXJzIHRvIGJlIHVzZSBmb3IgcXVldWluZyB1cCByZWNlaXZlIGNvbW1hbmQgZGF0YQotLy8gICAgICAgIElOSVRfTElTVF9IRUFEICgmZnJlZXJjdnBvb2wpOwotLy8KLS8vICAgICAgICAvLyBjcmVhdGUgbGlzdCBvZiBmcmVlIGJ1ZmZlcnMKLS8vICAgICAgICBmb3IgKGk9MDsgaTxOVU1fT0ZfRlJFRV9CVUZGRVJTOyBpKyspIHsKLS8vICAgICAgICAgICAgLy8gR2V0IG1lbW9yeSBmb3IgRFBSQU1fREFUQSBsaW5rIGxpc3QKLS8vICAgICAgICAgICAgcGRwcmFtX2JsayA9IGttYWxsb2MgKCBzaXplb2Yoc3RydWN0IGRwcmFtX2JsayksIEdGUF9LRVJORUwgKTsKLS8vICAgICAgICAgICAgLy8gR2V0IGEgYmxvY2sgb2YgbWVtb3J5IHRvIHN0b3JlIGNvbW1hbmQgZGF0YQotLy8gICAgICAgICAgICBwZHByYW1fYmxrLT5wYnVmZmVyID0ga21hbGxvYyAoIE1BWF9DTURfU1FTSVpFLCBHRlBfS0VSTkVMICk7Ci0vLyAgICAgICAgICAgIC8vIGxpbmsgcHJvdmlzaW9uaW5nIGRhdGEKLS8vICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCAoJnBkcHJhbV9ibGstPmxpc3QsICZmcmVlcmN2cG9vbCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIG51bW9mbXNnYnVmID0gTlVNX09GX0ZSRUVfQlVGRkVSUzsKLS8vICAgIH0KLQorICAgIERFQlVHKCIlczogcmVnaXN0ZXJlZCBkZWJ1Z2ZzIGRpcmVjdG9yeSBcIiVzXCJcbiIsIF9fZnVuY19fLCBpbmZvLT5EZXZpY2VOYW1lKTsKIAogICAgIC8vIGluaXRpYWxpemUgYXBwbGljYXRpb24gaW5mb3JtYXRpb24KICAgICBpbmZvLT5hcHBjbnQgPSAwOwpAQCAtMzIzLDE3ICsyMDIsMTcgQEAKICAgICAgICAgSU5JVF9MSVNUX0hFQUQgKCZpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0KTsKICAgICB9CiAKLQotCi0KLS8vICAgIGZ0MTAwMEhhbmRsZVtpbmZvLT5DYXJkTnVtYmVyXSA9IGRldmZzX3JlZ2lzdGVyKE5VTEwsIGluZm8tPkRldmljZU5hbWUsIERFVkZTX0ZMX0FVVE9fREVWTlVNLCAwLCAwLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19JRkNIUiB8IFNfSVJVR08gfCBTX0lXVUdPLCAmZnQxMDAwZm9wcywgTlVMTCk7Ci0KLQogICAgIGluZm8tPkRldmljZUNyZWF0ZWQgPSBUUlVFOwogICAgIGZ0MTAwMF9mbGFyaW9uX2NudCsrOwogCi0gICAgcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKKworZGVidWdfZmlsZV9mYWlsOgorCWRlYnVnZnNfcmVtb3ZlKGRpcik7CitkZWJ1Z19kaXJfZmFpbDoKKwlrZnJlZSh0bXApOworZmFpbDoKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzQ2LDI3ICsyMjUsMzMgQEAKIC8vIE5vdGVzOiAgICAgICBPbmx5IGNhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpLgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGZ0MTAwMF9EZXN0cm95RGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit2b2lkIGZ0MTAwMF9kZXN0cm95X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgcGlkX3QgcGlkOwogCQlpbnQgaTsKIAlzdHJ1Y3QgZHByYW1fYmxrICpwZHByYW1fYmxrOwogCXN0cnVjdCBkcHJhbV9ibGsgKnB0cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpxOworCXN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyAqZGlyOwogCi0gICAgREVCVUcoImZ0MTAwMF9jaGRldjpmdDEwMDBfRGVzdHJveURldmljZSBjYWxsZWRcbiIpOworICAgIERFQlVHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKIAogCiAKICAgICBpZiAoaW5mby0+RGV2aWNlQ3JlYXRlZCkKIAl7CiAgICAgICAgIGZ0MTAwMF9mbGFyaW9uX2NudC0tOwotCQl1bnJlZ2lzdGVyX2NocmRldihpbmZvLT5EZXZpY2VNYWpvciwgaW5mby0+RGV2aWNlTmFtZSk7Ci0JCURFQlVHKCJmdDEwMDBfRGVzdHJveURldmljZTogdW5yZWdpc3RlcmVkIGRldmljZSBcIiVzXCIsIHJlc3VsdCA9ICVkXG4iLAotCQkJCQkgICBpbmZvLT5EZXZpY2VOYW1lLCByZXN1bHQpOwotCi0gICAgICAgcGlkID0ga2VybmVsX3RocmVhZCAocm1fbWtub2QsICh2b2lkICopaW5mbywgMCk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZpbmZvLT5ub2Rlcy5saXN0KSB7CisJCQlkaXIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzLCBsaXN0KTsKKwkJCWlmIChkaXItPmludF9udW1iZXIgPT0gaW5mby0+Q2FyZE51bWJlcikgeworCQkJCWRlYnVnZnNfcmVtb3ZlKGRpci0+ZmlsZSk7CisJCQkJZGVidWdmc19yZW1vdmUoZGlyLT5kZW50KTsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCWtmcmVlKGRpcik7CisJCQl9CisJCX0KKwkJREVCVUcoIiVzOiB1bnJlZ2lzdGVyZWQgZGV2aWNlIFwiJXNcIlxuIiwgX19mdW5jX18sCisJCQkJCSAgIGluZm8tPkRldmljZU5hbWUpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBmcmVlIGFueSBtZW1vcnkgcmVzZXJ2ZSBmb3Igc2xvdyBRdWV1ZQogICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7CkBAIC0zODgsMTkgKzI3MywxNCBAQAogICAgICAgICAgICAgICAgIGtmcmVlKHB0cik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotLy8gICAgICAgIGRldmZzX3VucmVnaXN0ZXIoZnQxMDAwSGFuZGxlW2luZm8tPkNhcmROdW1iZXJdKTsKLQogCQlpbmZvLT5EZXZpY2VDcmVhdGVkID0gRkFMU0U7Ci0KLQkJcGRldm9ialtpbmZvLT5DYXJkTnVtYmVyXSA9IE5VTEw7CiAJfQogCiAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hPcGVuCisvLyBGdW5jdGlvbjogICAgZnQxMDAwX29wZW4KIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTQwOSwyOCArMjg5LDE5IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGludCBmdDEwMDBfQ2hPcGVuIChzdHJ1Y3QgaW5vZGUgKklub2RlLCBzdHJ1Y3QgZmlsZSAqRmlsZSkKK3N0YXRpYyBpbnQgZnQxMDAwX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKICAgICBpbnQgaSxudW07CiAKLSAgICBERUJVRygiZnQxMDAwX0NoT3BlbiBjYWxsZWRcbiIpOwotICAgIG51bSA9IChNSU5PUihJbm9kZS0+aV9yZGV2KSAmIDB4Zik7Ci0gICAgREVCVUcoImZ0MTAwMF9DaE9wZW46IG1pbm9yIG51bWJlcj0lZFxuIiwgbnVtKTsKKyAgICBERUJVRygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisgICAgbnVtID0gKE1JTk9SKGlub2RlLT5pX3JkZXYpICYgMHhmKTsKKyAgICBERUJVRygiZnQxMDAwX29wZW46IG1pbm9yIG51bWJlcj0lZFxuIiwgbnVtKTsKIAotICAgIGZvciAoaT0wOyBpPDU7IGkrKykKLSAgICAgICAgREVCVUcoInBkZXZvYmpbJWRdPSVwXG4iLCBpLCBwZGV2b2JqW2ldKTsgLy9hZWxpYXMgWytdIHJlYXNvbjogZG93bgorCWluZm8gPSBmaWxlLT5wcml2YXRlX2RhdGEgPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CiAKLSAgICBpZiAoIHBkZXZvYmpbbnVtXSAhPSBOVUxMICkKLSAgICAgICAgLy9pbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKShwZGV2b2JqW251bV0tPm5ldC0+cHJpdik7Ci0JCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYocGRldm9ialtudW1dLT5uZXQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERFQlVHKCJmdDEwMDBfQ2hPcGVuOiBjYW4gbm90IGZpbmQgZGV2aWNlIG9iamVjdCAlZFxuIiwgbnVtKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIERFQlVHKCJmX293bmVyID0gJXAgbnVtYmVyIG9mIGFwcGxpY2F0aW9uID0gJWRcbiIsICgmRmlsZS0+Zl9vd25lciksIGluZm8tPmFwcGNudCApOworICAgIERFQlVHKCJmX293bmVyID0gJXAgbnVtYmVyIG9mIGFwcGxpY2F0aW9uID0gJWRcbiIsICgmZmlsZS0+Zl9vd25lciksIGluZm8tPmFwcGNudCApOwogCiAgICAgLy8gQ2hlY2sgaWYgbWF4aW11bSBudW1iZXIgb2YgYXBwbGljYXRpb24gZXhjZWVkZWQKICAgICBpZiAoaW5mby0+YXBwY250ID4gTUFYX05VTV9BUFApIHsKQEAgLTQ1MiwyMSArMzIzLDE5IEBACiAgICAgfQogCiAgICAgaW5mby0+YXBwY250Kys7Ci0gICAgaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9ICZGaWxlLT5mX293bmVyOworICAgIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPSAmZmlsZS0+Zl9vd25lcjsKICAgICBpbmZvLT5hcHBfaW5mb1tpXS5uVHhNc2cgPSAwOwogICAgIGluZm8tPmFwcF9pbmZvW2ldLm5SeE1zZyA9IDA7CiAgICAgaW5mby0+YXBwX2luZm9baV0ublR4TXNnUmVqZWN0ID0gMDsKICAgICBpbmZvLT5hcHBfaW5mb1tpXS5uUnhNc2dNaXNzID0gMDsKIAotICAgIEZpbGUtPnByaXZhdGVfZGF0YSA9IHBkZXZvYmpbbnVtXS0+bmV0OwotCi0Jbm9uc2Vla2FibGVfb3BlbihJbm9kZSwgRmlsZSk7CisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hQb2xsCisvLyBGdW5jdGlvbjogICAgZnQxMDAwX3BvbGxfZGV2CiAvLwogLy8gUGFyYW1ldGVyczoKIC8vCkBAIC00NzYsNDcgKzM0NSw0NyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX0NoUG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnQxMDAwX3BvbGxfZGV2KHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogICAgIGludCBpOwogCi0gICAgLy9ERUJVRygiZnQxMDAwX0NoUG9sbCBjYWxsZWRcbiIpOworICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsX2RldiBjYWxsZWRcbiIpOwogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGwgY2FsbGVkIHdoZW4gZnQxMDAwX2ZsYXJpb25fY250IGlzIHplcm9cbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9wb2xsX2RldiBjYWxsZWQgd2hlbiBmdDEwMDBfZmxhcmlvbl9jbnQgaXMgemVyb1xuIik7CiAgICAgICAgIHJldHVybiAoLUVCQURGKTsKICAgICB9CiAKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKICAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7Ci0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrCiAgICAgaWYgKGkgPT0gTUFYX05VTV9BUFApIHsKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6Q291bGQgbm90IGZpbmQgYXBwbGljYXRpb24gaW5mbyBibG9ja1xuIik7CiAgICAgICAgIHJldHVybiAoIC1FQUNDRVMgKTsKICAgICB9CiAKICAgICBpZiAobGlzdF9lbXB0eSgmaW5mby0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCkgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGw6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfcG9sbF9kZXY6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKICAgICAgICAgcmV0dXJuKFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJKTsKICAgICB9CiAKICAgICBwb2xsX3dhaXQgKGZpbGUsICZpbmZvLT5hcHBfaW5mb1tpXS53YWl0X2RwcmFtX21zZywgd2FpdCk7Ci0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaFBvbGw6UG9sbGluZyBmb3IgZGF0YSBmcm9tIERTUFxuIik7CisgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9wb2xsX2RldjpQb2xsaW5nIGZvciBkYXRhIGZyb20gRFNQXG4iKTsKIAogICAgIHJldHVybiAoMCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgZnQxMDAwX0NoSW9jdGwKKy8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfaW9jdGwKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTUyNSwxMSArMzk0LDEwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGxvbmcgZnQxMDAwX0NoSW9jdGwgKHN0cnVjdCBmaWxlICpGaWxlLCB1bnNpZ25lZCBpbnQgQ29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgQXJndW1lbnQpCitzdGF0aWMgbG9uZyBmdDEwMDBfaW9jdGwgKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJndW1lbnQpCiB7Ci0gICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilBcmd1bWVudDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJndW1lbnQ7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXY7CiAgICAgaW50IHJlc3VsdD0wOwpAQCAtNTUwLDI1ICs0MTgsMjQgQEAKICAgICB1bnNpZ25lZCBzaG9ydCBsZWRTdGF0PTA7CiAgICAgdW5zaWduZWQgc2hvcnQgY29uU3RhdD0wOwogCi0gICAgLy9ERUJVRygiZnQxMDAwX0NoSW9jdGwgY2FsbGVkXG4iKTsKKyAgICAvL0RFQlVHKCJmdDEwMDBfaW9jdGwgY2FsbGVkXG4iKTsKIAogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsIGNhbGxlZCB3aGVuIGZ0MTAwMF9mbGFyaW9uX2NudCBpcyB6ZXJvXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGwgY2FsbGVkIHdoZW4gZnQxMDAwX2ZsYXJpb25fY250IGlzIHplcm9cbiIpOwogICAgICAgICByZXR1cm4gKC1FQkFERik7CiAgICAgfQogCi0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOkNvbW1hbmQgPSAweCV4IEFyZ3VtZW50ID0gMHglOHhcbiIsIENvbW1hbmQsICh1MzIpQXJndW1lbnQpOworICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6Y29tbWFuZCA9IDB4JXggYXJndW1lbnQgPSAweCU4eFxuIiwgY29tbWFuZCwgKHUzMilhcmd1bWVudCk7CiAKLSAgICBkZXYgPSBGaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBmdDEwMDBkZXYgPSBpbmZvLT5wRnQxMDAwRGV2OwotICAgIGNtZCA9IF9JT0NfTlIoQ29tbWFuZCk7Ci0gICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOmNtZCA9IDB4JXhcbiIsIGNtZCk7CisJaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlmdDEwMDBkZXYgPSBpbmZvLT5wRnQxMDAwRGV2OworICAgIGNtZCA9IF9JT0NfTlIoY29tbWFuZCk7CisgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpjbWQgPSAweCV4XG4iLCBjbWQpOwogCiAgICAgLy8gcHJvY2VzcyB0aGUgY29tbWFuZAogICAgIHN3aXRjaCAoY21kKSB7CiAgICAgY2FzZSBJT0NUTF9SRUdJU1RFUl9DTUQ6Ci0gICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfUkVHSVNURVIgY2FsbGVkXG4iKTsKKyAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfUkVHSVNURVIgY2FsbGVkXG4iKTsKICAgICAgICAgICAgIHJlc3VsdCA9IGdldF91c2VyKHRlbXB3b3JkLCAoX191MTYgX191c2VyKilhcmdwKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICBERUJVRygicmVzdWx0ID0gJWQgZmFpbGVkIHRvIGdldF91c2VyXG4iLCByZXN1bHQpOwpAQCAtNTc3LDkgKzQ0NCw5IEBACiAgICAgICAgICAgICBpZiAodGVtcHdvcmQgPT0gRFNQQkNNU0dJRCkgewogICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgZmlsZSBvYmplY3QKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmRmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJmZpbGUtPmZfb3duZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFwcF9pbmZvW2ldLkRzcEJDTXNnRmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOlJlZ2lzdGVyZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpSZWdpc3RlcmVkIGZvciBicm9hZGNhc3QgbWVzc2FnZXNcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC01ODcsMzQgKzQ1NCwzNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIElPQ1RMX0dFVF9WRVJfQ01EOgotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX1ZFUiBjYWxsZWRcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9WRVIgY2FsbGVkXG4iKTsKIAogICAgICAgICBnZXRfdmVyX2RhdGEuZHJ2X3ZlciA9IEZUMTAwMF9EUlZfVkVSOwogCiAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmdldF92ZXJfZGF0YSwgc2l6ZW9mKGdldF92ZXJfZGF0YSkpICkgewotICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CisgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOmRyaXZlciB2ZXJzaW9uID0gMHgleFxuIiwodW5zaWduZWQgaW50KWdldF92ZXJfZGF0YS5kcnZfdmVyKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6ZHJpdmVyIHZlcnNpb24gPSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpZ2V0X3Zlcl9kYXRhLmRydl92ZXIpOwogCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSU9DVExfQ09OTkVDVDoKICAgICAgICAgLy8gQ29ubmVjdCBNZXNzYWdlCi0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9DT05ORUNUXG4iKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IElPQ1RMX0ZUMTAwMF9DT05ORUNUXG4iKTsKICAgICAgICAgQ29ubmVjdGlvbk1zZ1s3OV0gPSAweGZjOwogCQkJICAgQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwgKHVuc2lnbmVkIHNob3J0ICopQ29ubmVjdGlvbk1zZywgMHg0Yyk7CiAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9ESVNDT05ORUNUOgogICAgICAgICAvLyBEaXNjb25uZWN0IE1lc3NhZ2UKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX0RJU0NPTk5FQ1RcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0RJU0NPTk5FQ1RcbiIpOwogICAgICAgICBDb25uZWN0aW9uTXNnWzc5XSA9IDB4ZmQ7CiAJCQkgICBDYXJkU2VuZENvbW1hbmQoZnQxMDAwZGV2LCAodW5zaWduZWQgc2hvcnQgKilDb25uZWN0aW9uTXNnLCAweDRjKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9HRVRfRFNQX1NUQVRfQ01EOgotICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfRFNQX1NUQVQgY2FsbGVkXG4iKTsKKyAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9EU1BfU1RBVCBjYWxsZWRcbiIpOwogCW1lbXNldCgmZ2V0X3N0YXRfZGF0YSwgMCwgc2l6ZW9mKGdldF9zdGF0X2RhdGEpKTsKICAgICAgICAgbWVtY3B5KGdldF9zdGF0X2RhdGEuRHNwVmVyLCBpbmZvLT5Ec3BWZXIsIERTUFZFUlNaKTsKICAgICAgICAgbWVtY3B5KGdldF9zdGF0X2RhdGEuSHdTZXJOdW0sIGluZm8tPkh3U2VyTnVtLCBIV1NFUk5VTVNaKTsKQEAgLTYyMiwxMiArNDg5LDEyIEBACiAgICAgICAgIG1lbWNweShnZXRfc3RhdF9kYXRhLmV1aTY0LCBpbmZvLT5ldWk2NCwgRVVJU1opOwogCiAgICAgICAgICAgICBpZiAoaW5mby0+UHJvZ0NvblN0YXQgIT0gMHhGRikgewotICAgICAgICAgICAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RTUF9MRUQsIChQVUNIQVIpJmxlZFN0YXQsIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYKTsKKyAgICAgICAgICAgICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRlQxMDAwX01BR19EU1BfTEVELCAodTggKikmbGVkU3RhdCwgRlQxMDAwX01BR19EU1BfTEVEX0lORFgpOwogICAgICAgICAgICAgICAgIGdldF9zdGF0X2RhdGEuTGVkU3RhdCA9IG50b2hzKGxlZFN0YXQpOwotICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IExlZFN0YXQgPSAweCV4XG4iLCBnZXRfc3RhdF9kYXRhLkxlZFN0YXQpOwotICAgICAgICAgICAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEUsIChQVUNIQVIpJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogTGVkU3RhdCA9IDB4JXhcbiIsIGdldF9zdGF0X2RhdGEuTGVkU3RhdCk7CisgICAgICAgICAgICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURSwgKHU4ICopJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKICAgICAgICAgICAgICAgICBnZXRfc3RhdF9kYXRhLkNvblN0YXQgPSBudG9ocyhjb25TdGF0KTsKLSAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBDb25TdGF0ID0gMHgleFxuIiwgZ2V0X3N0YXRfZGF0YS5Db25TdGF0KTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogQ29uU3RhdCA9IDB4JXhcbiIsIGdldF9zdGF0X2RhdGEuQ29uU3RhdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBnZXRfc3RhdF9kYXRhLkNvblN0YXQgPSAweDBmOwpAQCAtNjQyLDcgKzUwOSw3IEBACiAgICAgICAgIGdldF9zdGF0X2RhdGEuQ29uVG0gPSAodTMyKSh0di50dl9zZWMgLSBpbmZvLT5Db25UbSk7CiAgICAgICAgIERFQlVHKCJDb25uZWN0aW9uIFRpbWUgPSAlZFxuIiwgKGludClnZXRfc3RhdF9kYXRhLkNvblRtKTsKICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZ2V0X3N0YXRfZGF0YSwgc2l6ZW9mKGdldF9zdGF0X2RhdGEpKSApIHsKLSAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOworICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02NTAsMTcgKzUxNywxNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIElPQ1RMX1NFVF9EUFJBTV9DTUQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIElPQ1RMX0RQUkFNX0JMSyAqZHByYW1fZGF0YTsKKyAgICAgICAgICAgIElPQ1RMX0RQUkFNX0JMSyAqZHByYW1fZGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAvL0lPQ1RMX0RQUkFNX0NPTU1BTkQgZHByYW1fY29tbWFuZDsKLSAgICAgICAgICAgIFVTSE9SVCBxdHlwZTsKLSAgICAgICAgICAgIFVTSE9SVCBtc2dzejsKKyAgICAgICAgICAgIHUxNiBxdHlwZTsKKyAgICAgICAgICAgIHUxNiBtc2dzejsKIAkJc3RydWN0IHBzZXVkb19oZHIgKnBwc2V1ZG9faGRyOwotICAgICAgICAgICAgUFVTSE9SVCBwbXNnOwotICAgICAgICAgICAgVVNIT1JUIHRvdGFsX2xlbjsKLSAgICAgICAgICAgIFVTSE9SVCBhcHBfaW5kZXg7CisgICAgICAgICAgICB1MTYgKnBtc2c7CisgICAgICAgICAgICB1MTYgdG90YWxfbGVuOworICAgICAgICAgICAgdTE2IGFwcF9pbmRleDsKICAgICAgICAgICAgIHUxNiBzdGF0dXM7CiAKLSAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX1NFVF9EUFJBTSBjYWxsZWRcbiIpOworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX1NFVF9EUFJBTSBjYWxsZWRcbiIpOwogCiAKICAgICAgICAgICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewpAQCAtNjc5LDE1ICs1NDYsMTUgQEAKIAogICAgICAgICAgICAgaWYgKGluZm8tPkNhcmRSZWFkeSkgewogCi0gICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IHRyeSB0byBTRVRfRFBSQU0gXG4iKTsKKyAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IHRyeSB0byBTRVRfRFBSQU0gXG4iKTsKIAogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGVuZ3RoIGZpZWxkIHRvIHNlZSBob3cgbWFueSBieXRlcyB0byBjb3B5CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0X3VzZXIobXNnc3osIChfX3UxNiBfX3VzZXIgKilhcmdwKTsKICAgICAgICAgICAgICAgICBtc2dzeiA9IG50b2hzIChtc2dzeik7Ci0gICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBsZW5ndGggb2YgbWVzc2FnZSA9ICVkXG4iLCBtc2dzeik7CisgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogbGVuZ3RoIG9mIG1lc3NhZ2UgPSAlZFxuIiwgbXNnc3opOwogCiAgICAgICAgICAgICAgICAgaWYgKG1zZ3N6ID4gTUFYX0NNRF9TUVNJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogYmFkIG1lc3NhZ2UgbGVuZ3RoID0gJWRcbiIsIG1zZ3N6KTsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGJhZCBtZXNzYWdlIGxlbmd0aCA9ICVkXG4iLCBtc2dzeik7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTY5NywyMiArNTY0LDE0IEBACiAJCWlmICghZHByYW1fZGF0YSkKIAkJCWJyZWFrOwogCi0gICAgICAgICAgICAgICAgLy9pZiAoIGNvcHlfZnJvbV91c2VyKCYoZHByYW1fY29tbWFuZC5kcHJhbV9ibGspLCAoUElPQ1RMX0RQUkFNX0JMSylBcmd1bWVudCwgbXNnc3orMikgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcigmZHByYW1fZGF0YSwgYXJncCwgbXNnc3orMikgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcihkcHJhbV9kYXRhLCBhcmdwLCBtc2dzeisyKSApIHsKICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FRkFVTFQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hjIC0gZm9yIGRlYnVnZ2luZyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9IChjaGFyICopJmRwcmFtX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG1zZ3N6OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKDEsIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogZGF0YSAlZCA9IDB4JXhcbiIsIGksICpwdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG1lc3NhZ2UgY2FtZSBmcm9tIGEgcmVnaXN0ZXJlZCBhcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxNQVhfTlVNX0FQUDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJkZpbGUtPmZfb3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC03MjUsMTYgKzU4NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBhcHBfaW5kZXggPSBpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG1lc3NhZ2UgcXR5cGUgdHlwZSB3aGljaCBpcyB0aGUgbG93ZXIgYnl0ZSB3aXRoaW4gcW9zX2NsYXNzCi0gICAgICAgICAgICAgICAgICAgIC8vcXR5cGUgPSBudG9ocyhkcHJhbV9jb21tYW5kLmRwcmFtX2Jsay5wc2V1ZG9oZHIucW9zX2NsYXNzKSAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgICAgIHF0eXBlID0gbnRvaHMoZHByYW1fZGF0YS0+cHNldWRvaGRyLnFvc19jbGFzcykgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDBfZnQxMDAwX0NoSW9jdGw6IHF0eXBlID0gJWRcbiIsIHF0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9pb2N0bDogcXR5cGUgPSAlZFxuIiwgcXR5cGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocXR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1dCBtZXNzYWdlIGludG8gU2xvdyBRdWV1ZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwdXQgYSBtZXNzYWdlIGludG8gdGhlIERQUkFNIGlmIG1zZyBkb29yYmVsbCBpcyBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMF9mdDEwMDBfQ2hJb2N0bDogUkVBRCBSRUdJU1RFUiB0ZW1wd29yZD0leFxuIiwgdGVtcHdvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9pb2N0bDogUkVBRCBSRUdJU1RFUiB0ZW1wd29yZD0leFxuIiwgdGVtcHdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXB3b3JkICYgRlQxMDAwX0RCX0RQUkFNX1RYKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuZCBmb3IgMm1zIGFuZCB0cnkgYWdhaW4gZHVlIHRvIERTUCBkb29yYmVsbCBidXN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDIpOwpAQCAtNzUwLDcgKzYwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpEb29yYmVsbCBub3QgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6RG9vcmJlbGwgbm90IGF2YWlsYWJsZVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9UVFk7CiAJCQkJCQlrZnJlZShkcHJhbV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NjAsMTMgKzYxOCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9DaElvY3RsOiBmaW5pc2hlZCByZWFkaW5nIHJlZ2lzdGVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMF9mdDEwMDBfaW9jdGw6IGZpbmlzaGVkIHJlYWRpbmcgcmVnaXN0ZXJcbiIpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSBzbG93IHF1ZXVlIG1lbW9yeSBsaW1pdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtc2dzeiA8IE1BWF9DTURfU1FTSVpFKSAmJiAobXNnc3ogPiBQU0VVRE9TWikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBwdXQgc2VxdWVuY2UgbnVtYmVyIHBsdXMgbmV3IGNoZWNrc3VtIGZvciBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbXNnID0gKFBVU0hPUlQpJmRwcmFtX2NvbW1hbmQuZHByYW1fYmxrLnBzZXVkb2hkcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnID0gKFBVU0hPUlQpJmRwcmFtX2RhdGEtPnBzZXVkb2hkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnID0gKHUxNiAqKSZkcHJhbV9kYXRhLT5wc2V1ZG9oZHI7CiAJCQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2xlbiA9IG1zZ3N6KzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsX2xlbiAmIDB4MSkgewpAQCAtNzg1LDE3ICs2NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbXNnKys7CiAJCQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBkcHJhbV9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IENvbW1hbmQgU2VuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dG90YWxfbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogZGF0YSAlZCA9IDB4JXhcbiIsIGksICpwdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kcHJhbV9jb21tYW5kLmV4dHJhID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwodW5zaWduZWQgY2hhciopJmRwcmFtX2NvbW1hbmQsdG90YWxfbGVuKzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRTZW5kQ29tbWFuZChmdDEwMDBkZXYsKHVuc2lnbmVkIHNob3J0KilkcHJhbV9kYXRhLHRvdGFsX2xlbisyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRTZW5kQ29tbWFuZChmdDEwMDBkZXYsKHVuc2lnbmVkIHNob3J0KilkcHJhbV9kYXRhLHRvdGFsX2xlbisyKTsKIAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YXBwX2luZm9bYXBwX2luZGV4XS5uVHhNc2crKzsKQEAgLTgwNyw3ICs2NTQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IENhcmQgbm90IHJlYWR5IHRha2UgbWVzc2FnZXNcbiIpOworICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBDYXJkIG5vdCByZWFkeSB0YWtlIG1lc3NhZ2VzXG4iKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUFDQ0VTOwogICAgICAgICAgICAgfQogCSAgICBrZnJlZShkcHJhbV9kYXRhKTsKQEAgLTgyMCw3ICs2NjcsNyBAQAogICAgICAgICAgICAgSU9DVExfRFBSQU1fQkxLIF9fdXNlciAqcGlvY3RsX2RwcmFtOwogICAgICAgICAgICAgaW50IG1zZ2xlbjsKIAotICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIGNhbGxlZFxuIik7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIGNhbGxlZFxuIik7CiAKICAgICAgICAgICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiAoLUVCQURGKTsKQEAgLTgyOCwxNSArNjc1LDE1IEBACiAKICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgZmlsZSBvYmplY3QKICAgICAgICAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJkZpbGUtPmZfb3duZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOworICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2sKICAgICAgICAgICAgIGlmIChpID09IE1BWF9OVU1fQVBQKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUJBREY7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NDQsMjIgKzY5MSwyMiBAQAogICAgICAgICAgICAgcmVzdWx0ID0gMDsKICAgICAgICAgICAgIHBpb2N0bF9kcHJhbSA9IGFyZ3A7CiAgICAgICAgICAgICBpZiAobGlzdF9lbXB0eSgmaW5mby0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpNZXNzYWdlIGRldGVjdGVkIGluIHNsb3cgcXVldWVcbiIpOworICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6TWVzc2FnZSBkZXRlY3RlZCBpbiBzbG93IHF1ZXVlXG4iKTsKICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9idWZmX2xvY2ssIGZsYWdzKTsKICAgICAgICAgICAgICAgICBwZHByYW1fYmxrID0gbGlzdF9lbnRyeShpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0Lm5leHQsIHN0cnVjdCBkcHJhbV9ibGssIGxpc3QpOwogICAgICAgICAgICAgICAgIGxpc3RfZGVsKCZwZHByYW1fYmxrLT5saXN0KTsKICAgICAgICAgICAgICAgICBpbmZvLT5hcHBfaW5mb1tpXS5OdW1PZk1zZy0tOwotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDpOdW1PZk1zZyBmb3IgYXBwICVkID0gJWRcbiIsIGksIGluZm8tPmFwcF9pbmZvW2ldLk51bU9mTXNnKTsKKyAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOk51bU9mTXNnIGZvciBhcHAgJWQgPSAlZFxuIiwgaSwgaW5mby0+YXBwX2luZm9baV0uTnVtT2ZNc2cpOwogICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfYnVmZl9sb2NrLCBmbGFncyk7CiAgICAgICAgICAgICAgICAgbXNnbGVuID0gbnRvaHMoKih1MTYgKilwZHByYW1fYmxrLT5wYnVmZmVyKSArIFBTRVVET1NaOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldF91c2VyKG1zZ2xlbiwgJnBpb2N0bF9kcHJhbS0+dG90YWxfbGVuKTsKIAkJaWYgKHJlc3VsdCkKIAkJCWJyZWFrOwogCQltc2dsZW4gPSBodG9ucyhtc2dsZW4pOwotICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDptc2cgbGVuZ3RoID0gJXhcbiIsIG1zZ2xlbik7CisgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDptc2cgbGVuZ3RoID0gJXhcbiIsIG1zZ2xlbik7CiAgICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyICgmcGlvY3RsX2RwcmFtLT5wc2V1ZG9oZHIsIHBkcHJhbV9ibGstPnBidWZmZXIsIG1zZ2xlbikpCiAJCQkJewotCQkJCQlERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBjb3B5IGZhdWx0IG9jY3VycmVkXG4iKTsKKwkJCQkJREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOwogCSAgICAgICAgICAgICAJcmVzdWx0ID0gLUVGQVVMVDsKIAkgICAgICAgICAgICAgCWJyZWFrOwogCQkJCX0KQEAgLTg2NywxMiArNzE0LDEyIEBACiAgICAgICAgICAgICAgICAgZnQxMDAwX2ZyZWVfYnVmZmVyKHBkcHJhbV9ibGssICZmcmVlcmN2cG9vbCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbXNnbGVuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIG5vIG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0dFVF9EUFJBTSBubyBtZXNzYWdlXG4iKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6dW5rbm93biBjb21tYW5kOiAweCV4XG4iLCBDb21tYW5kKTsKKyAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6dW5rbm93biBjb21tYW5kOiAweCV4XG4iLCBjb21tYW5kKTsKICAgICAgICAgcmVzdWx0ID0gLUVOT1RUWTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtODgxLDcgKzcyOCw3IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgZnQxMDAwX0NoUmVsZWFzZQorLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9yZWxlYXNlCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vCkBAIC04OTAsMTcgKzczNywxNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBpbnQgZnQxMDAwX0NoUmVsZWFzZSAoc3RydWN0IGlub2RlICpJbm9kZSwgc3RydWN0IGZpbGUgKkZpbGUpCitzdGF0aWMgaW50IGZ0MTAwMF9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKICAgICBpbnQgaTsKIAlzdHJ1Y3QgZHByYW1fYmxrICpwZHByYW1fYmxrOwogCi0gICAgREVCVUcoImZ0MTAwMF9DaFJlbGVhc2UgY2FsbGVkXG4iKTsKKyAgICBERUJVRygiZnQxMDAwX3JlbGVhc2UgY2FsbGVkXG4iKTsKIAotICAgIGRldiA9IEZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogICAgIGlmIChmdDEwMDBfZmxhcmlvbl9jbnQgPT0gMCkgewogICAgICAgICBpbmZvLT5hcHBjbnQtLTsKQEAgLTkwOSw4ICs3NTYsOCBAQAogCiAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZGaWxlLT5mX293bmVyKSB7Ci0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CisgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogTWVzc2FnZSBpcyBmb3IgQXBwSWQgPSAlZFxuIiwgaW5mby0+YXBwX2luZm9baV0uYXBwX2lkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jCmluZGV4IDRkZDQ1NmYuLjE3NTQ2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMKQEAgLTEyMywxMSArMTIzLDExIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIFVMT05HIGNoZWNrX3VzYl9kYiAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKK3N0YXRpYyB1MzIgY2hlY2tfdXNiX2RiIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewogICAgaW50ICAgICAgICAgICAgICAgbG9vcGNudDsKLSAgIFVTSE9SVCAgICAgICAgICAgIHRlbXA7Ci0gICBVTE9ORyAgICAgICAgICAgICBzdGF0dXM7CisgICB1MTYgICAgICAgICAgICB0ZW1wOworICAgdTMyICAgICAgICAgICAgIHN0YXR1czsKIAogICAgbG9vcGNudCA9IDA7CiAgICB3aGlsZSAobG9vcGNudCA8IDEwKQpAQCAtMTkwLDcgKzE5MCw3IEBACiAvLyBGdW5jdGlvbjogICAgZ2V0X2hhbmRzaGFrZQogLy8KIC8vIFBhcmFtZXRlcnM6ICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLyAgICAgICAgICAgICAgVVNIT1JUIGV4cGVjdGVkX3ZhbHVlIC0gdGhlIGhhbmRzaGFrZSB2YWx1ZSBleHBlY3RlZAorLy8gICAgICAgICAgICAgIHUxNiBleHBlY3RlZF92YWx1ZSAtIHRoZSBoYW5kc2hha2UgdmFsdWUgZXhwZWN0ZWQKIC8vCiAvLyBSZXR1cm5zOiAgICAgaGFuZHNoYWtldmFsdWUgLSBzdWNjZXNzCiAvLyAgICAgICAgICAgICAgSEFORFNIQUtFX1RJTUVPVVRfVkFMVUUgLSBmYWlsdXJlCkBAIC0yMDAsMTEgKzIwMCwxMSBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBVU0hPUlQgZ2V0X2hhbmRzaGFrZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgZXhwZWN0ZWRfdmFsdWUpCitzdGF0aWMgdTE2IGdldF9oYW5kc2hha2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGV4cGVjdGVkX3ZhbHVlKQogewotICAgVVNIT1JUICAgICAgICAgICAgaGFuZHNoYWtlOworICAgdTE2ICAgICAgICAgICAgaGFuZHNoYWtlOwogICAgaW50ICAgICAgICAgICAgICAgbG9vcGNudDsKLSAgIFVMT05HICAgICAgICAgICAgIHN0YXR1cz0wOworICAgdTMyICAgICAgICAgICAgIHN0YXR1cz0wOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgIGxvb3BjbnQgPSAwOwpAQCAtMjI4LDcgKzIyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsICBGVDEwMDBfREJfRE5MRF9SWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKFBVQ0hBUikmaGFuZHNoYWtlLCAxKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKHU4ICopJmhhbmRzaGFrZSwgMSk7CiAgICAgICAgICAgICAgICAgLy9ERUJVRygiZ2V0X2hhbmRzaGFrZTogaGFuZHNoYWtlIGlzICV4XG4iLCB0ZW1weCk7CiAgICAgICAgICAgICAgICAgaGFuZHNoYWtlID0gbnRvaHMoaGFuZHNoYWtlKTsKICAgICAgICAgICAgICAgICAvL0RFQlVHKCJnZXRfaGFuZHNoYWtlOiBhZnRlciBzd2FwLCBoYW5kc2hha2UgaXMgJXhcbiIsIGhhbmRzaGFrZSk7CkBAIC0yNTksNyArMjU5LDcgQEAKIC8vIEZ1bmN0aW9uOiAgICBwdXRfaGFuZHNoYWtlCiAvLwogLy8gUGFyYW1ldGVyczogIHN0cnVjdCBmdDEwMDBfZGV2aWNlICAtIGRldmljZSBzdHJ1Y3R1cmUKLS8vICAgICAgICAgICAgICBVU0hPUlQgaGFuZHNoYWtlX3ZhbHVlIC0gaGFuZHNoYWtlIHRvIGJlIHdyaXR0ZW4KKy8vICAgICAgICAgICAgICB1MTYgaGFuZHNoYWtlX3ZhbHVlIC0gaGFuZHNoYWtlIHRvIGJlIHdyaXR0ZW4KIC8vCiAvLyBSZXR1cm5zOiAgICAgbm9uZQogLy8KQEAgLTI2OSwzMCArMjY5LDMwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIHZvaWQgcHV0X2hhbmRzaGFrZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LFVTSE9SVCBoYW5kc2hha2VfdmFsdWUpCitzdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsdTE2IGhhbmRzaGFrZV92YWx1ZSkKIHsKLSAgICBVTE9ORyB0ZW1weDsKLSAgICBVU0hPUlQgdGVtcHdvcmQ7Ci0gICAgVUxPTkcgc3RhdHVzOworICAgIHUzMiB0ZW1weDsKKyAgICB1MTYgdGVtcHdvcmQ7CisgICAgdTMyIHN0YXR1czsKIAogCiAKLSAgICAgICAgdGVtcHggPSAoVUxPTkcpaGFuZHNoYWtlX3ZhbHVlOworICAgICAgICB0ZW1weCA9ICh1MzIpaGFuZHNoYWtlX3ZhbHVlOwogICAgICAgICB0ZW1weCA9IG50b2hsKHRlbXB4KTsKIAotICAgICAgICB0ZW1wd29yZCA9IChVU0hPUlQpKHRlbXB4ICYgMHhmZmZmKTsKKyAgICAgICAgdGVtcHdvcmQgPSAodTE2KSh0ZW1weCAmIDB4ZmZmZik7CiAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgdGVtcHdvcmQsIDApOwotICAgICAgICB0ZW1wd29yZCA9IChVU0hPUlQpKHRlbXB4ID4+IDE2KTsKKyAgICAgICAgdGVtcHdvcmQgPSAodTE2KSh0ZW1weCA+PiAxNik7CiAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgdGVtcHdvcmQsIDEpOwogICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCBGVDEwMDBfREJfRE5MRF9UWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiB9CiAKLXN0YXRpYyBVU0hPUlQgZ2V0X2hhbmRzaGFrZV91c2Ioc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGV4cGVjdGVkX3ZhbHVlKQorc3RhdGljIHUxNiBnZXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgZXhwZWN0ZWRfdmFsdWUpCiB7Ci0gICBVU0hPUlQgICAgICAgICAgICBoYW5kc2hha2U7CisgICB1MTYgICAgICAgICAgICBoYW5kc2hha2U7CiAgICBpbnQgICAgICAgICAgICAgICBsb29wY250OwotICAgVVNIT1JUICAgICAgICAgICAgdGVtcDsKLSAgIFVMT05HICAgICAgICAgICAgIHN0YXR1cz0wOworICAgdTE2ICAgICAgICAgICAgdGVtcDsKKyAgIHUzMiAgICAgICAgICAgICBzdGF0dXM9MDsKIAogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAgICBsb29wY250ID0gMDsKQEAgLTMwMCwxMCArMzAwLDEwIEBACiAgICB3aGlsZSAobG9vcGNudCA8IDEwMCkKICAgIHsKICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QgPT0gMikgewotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIDAsIChQVUNIQVIpJihwZnQxMDAwaW5mby0+dGVtcGJ1ZlswXSksIDY0KTsKKyAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCAwLCAodTggKikmKHBmdDEwMDBpbmZvLT50ZW1wYnVmWzBdKSwgNjQpOwogICAgICAgICAgICBmb3IgKHRlbXA9MDsgdGVtcDwxNjsgdGVtcCsrKQogICAgICAgICAgICAgICAgREVCVUcoInRlbXBidWYgJWQgPSAweCV4XG4iLCB0ZW1wLCBwZnQxMDAwaW5mby0+dGVtcGJ1Zlt0ZW1wXSk7Ci0gICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAoUFVDSEFSKSZoYW5kc2hha2UsIDEpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKHU4ICopJmhhbmRzaGFrZSwgMSk7CiAgICAgICAgICAgIERFQlVHKCJoYW5kc2hha2UgZnJvbSByZWFkX2RwcmFtMTYgPSAweCV4XG4iLCBoYW5kc2hha2UpOwogICAgICAgICAgICBpZiAocGZ0MTAwMGluZm8tPmRzcGFsaXZlID09IHBmdDEwMDBpbmZvLT50ZW1wYnVmWzZdKQogICAgICAgICAgICAgICAgaGFuZHNoYWtlID0gMDsKQEAgLTMxMyw3ICszMTMsNyBAQAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKFBVQ0hBUikmaGFuZHNoYWtlLCAxKTsKKyAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX0hBTkRTSEFLRV9MT0MsICh1OCAqKSZoYW5kc2hha2UsIDEpOwogICAgICAgIH0KICAgICAgICBsb29wY250Kys7CiAgICAgICAgbXNsZWVwKDEwKTsKQEAgLTMyNyw3ICszMjcsNyBAQAogICAgcmV0dXJuIEhBTkRTSEFLRV9USU1FT1VUX1ZBTFVFOwogfQogCi1zdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LFVTSE9SVCBoYW5kc2hha2VfdmFsdWUpCitzdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LHUxNiBoYW5kc2hha2VfdmFsdWUpCiB7CiAgICBpbnQgaTsKIApAQCAtMzQ2LDQ0ICszNDYsNDQgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVVNIT1JUIGdldF9yZXF1ZXN0X3R5cGUoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKK3N0YXRpYyB1MTYgZ2V0X3JlcXVlc3RfdHlwZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVVNIT1JUICAgcmVxdWVzdF90eXBlOwotICAgVUxPTkcgICAgc3RhdHVzOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICB0ZW1weDsKKyAgIHUxNiAgIHJlcXVlc3RfdHlwZTsKKyAgIHUzMiAgICBzdGF0dXM7CisgICB1MTYgICB0ZW1wd29yZDsKKyAgIHUzMiAgICB0ZW1weDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAgICBpZiAoIHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAxKQogICAgewotICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsIChQVUNIQVIpJnRlbXB4KTsKKyAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAodTggKikmdGVtcHgpOwogICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRlbXB4ID0gMDsKIAotICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAxKTsKICAgICAgICB0ZW1weCB8PSAodGVtcHdvcmQgPDwgMTYpOwogICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogICAgfQotICAgcmVxdWVzdF90eXBlID0gKFVTSE9SVCl0ZW1weDsKKyAgIHJlcXVlc3RfdHlwZSA9ICh1MTYpdGVtcHg7CiAKICAgIC8vREVCVUcoImdldF9yZXF1ZXN0X3R5cGU6IHJlcXVlc3RfdHlwZSBpcyAleFxuIiwgcmVxdWVzdF90eXBlKTsKICAgIHJldHVybiByZXF1ZXN0X3R5cGU7CiAKIH0KIAotc3RhdGljIFVTSE9SVCBnZXRfcmVxdWVzdF90eXBlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQorc3RhdGljIHUxNiBnZXRfcmVxdWVzdF90eXBlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVVNIT1JUICAgcmVxdWVzdF90eXBlOwotICAgVUxPTkcgICAgc3RhdHVzOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICB0ZW1weDsKKyAgIHUxNiAgIHJlcXVlc3RfdHlwZTsKKyAgIHUzMiAgICBzdGF0dXM7CisgICB1MTYgICB0ZW1wd29yZDsKKyAgIHUzMiAgICB0ZW1weDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogICAgaWYgKCBwZnQxMDAwaW5mby0+Ym9vdG1vZGUgPT0gMSkKICAgIHsKLSAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAoUFVDSEFSKSZ0ZW1weCk7CisgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKHU4ICopJnRlbXB4KTsKICAgICAgICB0ZW1weCA9IG50b2hsKHRlbXB4KTsKICAgIH0KICAgIGVsc2UKQEAgLTM5NCwxMiArMzk0LDEyIEBACiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgIHRlbXB4ID0gMDsKLSAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsIChQVUNIQVIpJnRlbXB3b3JkLCAxKTsKKyAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsICh1OCAqKSZ0ZW1wd29yZCwgMSk7CiAgICAgICAgfQogICAgICAgIHRlbXB4IHw9ICh0ZW1wd29yZCA8PCAxNik7CiAgICAgICAgdGVtcHggPSBudG9obCh0ZW1weCk7CiAgICB9Ci0gICByZXF1ZXN0X3R5cGUgPSAoVVNIT1JUKXRlbXB4OworICAgcmVxdWVzdF90eXBlID0gKHUxNil0ZW1weDsKIAogICAgLy9ERUJVRygiZ2V0X3JlcXVlc3RfdHlwZTogcmVxdWVzdF90eXBlIGlzICV4XG4iLCByZXF1ZXN0X3R5cGUpOwogICAgcmV0dXJuIHJlcXVlc3RfdHlwZTsKQEAgLTQyMCwyMiArNDIwLDIyIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIGxvbmcgZ2V0X3JlcXVlc3RfdmFsdWUoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKIHsKLSAgIFVMT05HICAgICB2YWx1ZTsKLSAgIFVTSE9SVCAgIHRlbXB3b3JkOwotICAgVUxPTkcgICAgc3RhdHVzOworICAgdTMyICAgICB2YWx1ZTsKKyAgIHUxNiAgIHRlbXB3b3JkOworICAgdTMyICAgIHN0YXR1czsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAKICAgICAgICBpZiAoIHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAxKQogICAgICAgIHsKLQkgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnZhbHVlKTsKKwkgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsICh1OCAqKSZ2YWx1ZSk7CiAJICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7Ci0JICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnRlbXB3b3JkLCAwKTsKKwkgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAwKTsKIAkgICB2YWx1ZSA9IHRlbXB3b3JkOwotICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAxKTsKIAkgICB2YWx1ZSB8PSAodGVtcHdvcmQgPDwgMTYpOwogCSAgIHZhbHVlID0gbnRvaGwodmFsdWUpOwogICAgICAgIH0KQEAgLTQ0OSw5ICs0NDksOSBAQAogI2lmIDAKIHN0YXRpYyBsb25nIGdldF9yZXF1ZXN0X3ZhbHVlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVUxPTkcgICAgIHZhbHVlOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICBzdGF0dXM7CisgICB1MzIgICAgIHZhbHVlOworICAgdTE2ICAgdGVtcHdvcmQ7CisgICB1MzIgICAgc3RhdHVzOwogICAgc3RydWN0IGZ0MTAwMF9pbmZvICogcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QgPT0gMikgewpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHdvcmQsIDEpOwogICAgICAgIH0KIAogICAgICAgIHZhbHVlIHw9ICh0ZW1wd29yZCA8PCAxNik7CkBAIC00OTAsMTEgKzQ5MCwxMSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIHB1dF9yZXF1ZXN0X3ZhbHVlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIGxvbmcgbHZhbHVlKQogewotICAgVUxPTkcgICAgdGVtcHg7Ci0gICBVTE9ORyAgICBzdGF0dXM7CisgICB1MzIgICAgdGVtcHg7CisgICB1MzIgICAgc3RhdHVzOwogCiAgICAgICAgdGVtcHggPSBudG9obChsdmFsdWUpOwotICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsIChQVUNIQVIpJnRlbXB4KTsKKyAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHgpOwogCiAKIApAQCAtNTE2LDEwICs1MTYsMTAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVVNIT1JUIGhkcl9jaGVja3N1bShzdHJ1Y3QgcHNldWRvX2hkciAqcEhkcikKK3N0YXRpYyB1MTYgaGRyX2NoZWNrc3VtKHN0cnVjdCBwc2V1ZG9faGRyICpwSGRyKQogewotICAgVVNIT1JUICAgKnVzUHRyID0gKFVTSE9SVCAqKXBIZHI7Ci0gICBVU0hPUlQgICBjaGtzdW07CisgICB1MTYgICAqdXNQdHIgPSAodTE2ICopcEhkcjsKKyAgIHUxNiAgIGNoa3N1bTsKIAogCiAgIGNoa3N1bSA9ICgoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KQEAgLTUzMyw4ICs1MzMsOCBAQAogLy8gRnVuY3Rpb246ICAgIHdyaXRlX2JsawogLy8KIC8vIFBhcmFtZXRlcnM6ICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLyAgICAgICAgICAgICAgVVNIT1JUICoqcFVzRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVVNIT1JUCi0vLyAgICAgICAgICAgICAgVUNIQVIgICoqcFVjRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVUNIQVIKKy8vICAgICAgICAgICAgICB1MTYgKipwVXNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1MTYKKy8vICAgICAgICAgICAgICB1OCAgKipwVWNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1OAogLy8gICAgICAgICAgICAgIGxvbmcgICB3b3JkX2xlbmd0aCAtIGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBEUFJBTQogLy8KQEAgLTU0NiwyMCArNTQ2LDIwIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIFVMT05HIHdyaXRlX2JsayAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUICoqcFVzRmlsZSwgVUNIQVIgKipwVWNGaWxlLCBsb25nIHdvcmRfbGVuZ3RoKQorc3RhdGljIHUzMiB3cml0ZV9ibGsgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiAqKnBVc0ZpbGUsIHU4ICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKIHsKLSAgIFVMT05HIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotICAgVVNIT1JUIGRwcmFtOworICAgdTMyIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworICAgdTE2IGRwcmFtOwogICAgbG9uZyB0ZW1wX3dvcmRfbGVuZ3RoOwogICAgaW50IGxvb3BjbnQsIGksIGo7Ci0gICBVU0hPUlQgKnBUZW1wRmlsZTsKLSAgIFVTSE9SVCB0ZW1wd29yZDsKLSAgIFVTSE9SVCB0ZW1wYnVmZmVyWzY0XTsKLSAgIFVTSE9SVCByZXN1bHRidWZmZXJbNjRdOworICAgdTE2ICpwVGVtcEZpbGU7CisgICB1MTYgdGVtcHdvcmQ7CisgICB1MTYgdGVtcGJ1ZmZlcls2NF07CisgICB1MTYgcmVzdWx0YnVmZmVyWzY0XTsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCiAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6c3RhcnQgd29yZF9sZW5ndGggPSAlZFxuIiwoaW50KXdvcmRfbGVuZ3RoKTsKLSAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICBkcHJhbSA9ICh1MTYpRFdOTERfTUFHMV9QU19IRFJfTE9DOwogICAgdGVtcHdvcmQgPSAqKCpwVXNGaWxlKTsKICAgICgqcFVzRmlsZSkrKzsKICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTE2KGZ0MTAwMGRldiwgZHByYW0sIHRlbXB3b3JkLCAwKTsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAgICAqcFVjRmlsZSA9ICpwVWNGaWxlICsgNDsKICAgIHdvcmRfbGVuZ3RoLS07Ci0gICB0ZW1wd29yZCA9IChVU0hPUlQpd29yZF9sZW5ndGg7CisgICB0ZW1wd29yZCA9ICh1MTYpd29yZF9sZW5ndGg7CiAgICB3b3JkX2xlbmd0aCA9ICh3b3JkX2xlbmd0aCAvIDE2KSArIDE7CiAgICBwVGVtcEZpbGUgPSAqcFVzRmlsZTsKICAgIHRlbXBfd29yZF9sZW5ndGggPSB3b3JkX2xlbmd0aDsKQEAgLTYwMiwyNCArNjAyLDI0IEBACiAJICAgICAgaWYgKHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAwKQogCSAgICAgIHsKIAkJIGlmIChkcHJhbSA+PSAweDNGNCkKLSAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzBdLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAodTggKikmdGVtcGJ1ZmZlclswXSwgOCk7CiAJICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSwgKFBVQ0hBUikmdGVtcGJ1ZmZlclswXSwgNjQpOworICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSwgKHU4ICopJnRlbXBidWZmZXJbMF0sIDY0KTsKIAkgICAgICB9CiAJICAgICAgZWxzZQogCSAgICAgIHsKICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8MTA7IGorKykKICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzBdLCA2NCk7CisgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sICh1OCAqKSZ0ZW1wYnVmZmVyWzBdLCA2NCk7CiAJCSAgIGlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCSAgIHsKIAkJICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBBU0lDIGJpdCBzdHVmZmluZyBwcm9ibGVtLgogCQkgICAgICAgaWYgKCAodGVtcGJ1ZmZlclszMV0gJiAweGZlMDApID09IDB4ZmUwMCkKIAkJICAgICAgIHsKLSAgICAgIAkJICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIGRwcmFtKzEyLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzI0XSwgNjQpOworICAgICAgCQkgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgZHByYW0rMTIsICh1OCAqKSZ0ZW1wYnVmZmVyWzI0XSwgNjQpOwogCQkgICAgICAgfQogICAgIAkJICAgICAgIC8vIExldCdzIGNoZWNrIHRoZSBkYXRhIHdyaXR0ZW4KLQkgICAgCSAgICAgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKKwkgICAgCSAgICAgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAodTggKikmcmVzdWx0YnVmZmVyWzBdLCA2NCk7CiAJCSAgICAgICBpZiAoICh0ZW1wYnVmZmVyWzMxXSAmIDB4ZmUwMCkgPT0gMHhmZTAwKQogCQkgICAgICAgewogCQkgICAgICAgICAgIGZvciAoaT0wOyBpPDI4OyBpKyspCkBAIC02MzMsNyArNjMzLDcgQEAKIAkJCQkgICBicmVhazsKIAkJCQl9CiAJCQkgICB9Ci0gICAJCQkgICBTdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKzEyLCAoUFVDSEFSKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKKyAgIAkJCSAgIFN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rMTIsICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKIAkJICAgICAgICAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQogCQkgICAgICAgICAgIHsKICAgICAJCQkgICAgICAgaWYgKHJlc3VsdGJ1ZmZlcltpXSAhPSB0ZW1wYnVmZmVyW2krMjRdKQpAQCAtNjg5LDggKzY4OSw4IEBACiAvLyBGdW5jdGlvbjogICAgd3JpdGVfYmxrX2ZpZm8KIC8vCiAvLyBQYXJhbWV0ZXJzOiAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgIC0gZGV2aWNlIHN0cnVjdHVyZQotLy8gICAgICAgICAgICAgIFVTSE9SVCAqKnBVc0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIFVTSE9SVAotLy8gICAgICAgICAgICAgIFVDSEFSICAqKnBVY0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIFVDSEFSCisvLyAgICAgICAgICAgICAgdTE2ICoqcFVzRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gdTE2CisvLyAgICAgICAgICAgICAgdTggICoqcFVjRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gdTgKIC8vICAgICAgICAgICAgICBsb25nICAgd29yZF9sZW5ndGggLSBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gRFBSQU0KIC8vCkBAIC03MDIsOSArNzAyLDkgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVUxPTkcgd3JpdGVfYmxrX2ZpZm8gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCAqKnBVc0ZpbGUsIFVDSEFSICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKK3N0YXRpYyB1MzIgd3JpdGVfYmxrX2ZpZm8gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiAqKnBVc0ZpbGUsIHU4ICoqcFVjRmlsZSwgbG9uZyB3b3JkX2xlbmd0aCkKIHsKLSAgIFVMT05HIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworICAgdTMyIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogICAgaW50IGJ5dGVfbGVuZ3RoOwogICAgbG9uZyBhbGlnbmNudDsKIApAQCAtNzcwLDM2ICs3NzAsMzYgQEAKIC8vICBSZXR1cm5zOiAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAtIHJldHVybiBjb2RlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi11MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgVUxPTkcgIEZpbGVMZW5ndGgpCit1MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgdTMyICBGaWxlTGVuZ3RoKQogewotICAgdTE2ICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICBVSU5UICAgICAgICAgICAgICAgICAgICB1aVN0YXRlOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlOwotCXN0cnVjdCBwc2V1ZG9faGRyICpwSGRyOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIZHJMZW5ndGg7CisgICB1MTYgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICAgc3RhdGU7CisgICB1MTYgICAgICAgICAgICAgICAgICBoYW5kc2hha2U7CisJc3RydWN0IHBzZXVkb19oZHIgKnBzZXVkb19oZWFkZXI7CisgICB1MTYgICAgICAgICAgICAgICAgICBwc2V1ZG9faGVhZGVyX2xlbjsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuZ3RoOwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgcmVxdWVzdDsKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHRlbXA7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICB0ZW1wd29yZDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q7CisgICB1MTYgICAgICAgICAgICAgICAgICB0ZW1wOworICAgdTE2ICAgICAgICAgICAgICAgICAgdGVtcHdvcmQ7CiAKLQlzdHJ1Y3QgZHNwX2ZpbGVfaGRyICpwRmlsZUhkcjU7Ci0Jc3RydWN0IGRzcF9pbWFnZV9pbmZvICpwRHNwSW1hZ2VJbmZvVjYgPSBOVUxMOworCXN0cnVjdCBkc3BfZmlsZV9oZHIgKmZpbGVfaGRyOworCXN0cnVjdCBkc3BfaW1hZ2VfaW5mbyAqZHNwX2ltZ19pbmZvID0gTlVMTDsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uOwotICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uOwotCXN0cnVjdCBkcnZfbXNnICpwTWFpbEJveERhdGE7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICAqcFVzRGF0YSA9IE5VTEw7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICAqcFVzRmlsZSA9IE5VTEw7Ci0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAqcFVjRmlsZSA9IE5VTEw7Ci0gICBVQ0hBUiAgICAgICAgICAgICAgICAgICAqcEJvb3RFbmQgPSBOVUxMLCAqcENvZGVFbmQ9IE5VTEw7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWFnZU47CisgICBib29sICAgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb247CisJc3RydWN0IGRydl9tc2cgKm1haWxib3hfZGF0YTsKKyAgIHUxNiAgICAgICAgICAgICAgICAgICpkYXRhID0gTlVMTDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgICpzX2ZpbGUgPSBOVUxMOworICAgdTggICAgICAgICAgICAgICAgICAgKmNfZmlsZSA9IE5VTEw7CisgICB1OCAgICAgICAgICAgICAgICAgICAqYm9vdF9lbmQgPSBOVUxMLCAqY29kZV9lbmQ9IE5VTEw7CisgICBpbnQgICAgICAgICAgICAgICAgICAgICBpbWFnZTsKICAgIGxvbmcgICAgICAgICAgICAgICAgICAgIGxvYWRlcl9jb2RlX2FkZHJlc3MsIGxvYWRlcl9jb2RlX3NpemUgPSAwOwogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgcnVuX2FkZHJlc3MgPSAwLCBydW5fc2l6ZSA9IDA7CiAKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgIHRlbXBsb25nOwotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gMDsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZzsKKyAgIHUzMiAgICAgICAgICAgICAgICAgICBpbWFnZV9jaGtzdW0gPSAwOwogCi0gICBVU0hPUlQgICAgICAgICAgICAgICAgICBkcHJhbSA9IDA7Ci0gICBQVUNIQVIgICAgICAgICAgICAgICAgICBwYnVmZmVyOworICAgdTE2ICAgICAgICAgICAgICAgICAgZHByYW0gPSAwOworICAgdTggKnBidWZmZXI7CiAJc3RydWN0IHByb3ZfcmVjb3JkICpwcHJvdl9yZWNvcmQ7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKIApAQCAtODE0LDI0ICs4MTQsMjQgQEAKICAgIC8vIEdldCB2ZXJzaW9uIGlkIG9mIGZpbGUsIGF0IGZpcnN0IDQgYnl0ZXMgb2YgZmlsZSwgZm9yIG5ld2VyIGZpbGVzLgogICAgLy8KIAotICAgdWlTdGF0ZSA9IFNUQVRFX1NUQVJUX0RXTkxEOworICAgc3RhdGUgPSBTVEFURV9TVEFSVF9EV05MRDsKIAotICAgcEZpbGVIZHI1ID0gKHN0cnVjdCBkc3BfZmlsZV9oZHIgKilwRmlsZVN0YXJ0OworICAgZmlsZV9oZHIgPSAoc3RydWN0IGRzcF9maWxlX2hkciAqKXBGaWxlU3RhcnQ7CiAKICAgIGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZnQxMDAwZGV2LCAweDgwMCwgRlQxMDAwX1JFR19NQUdfV0FURVJNQVJLKTsKIAotICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+bG9hZGVyX29mZnNldCk7Ci0gICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRmlsZUhkcjUtPmxvYWRlcl9vZmZzZXQpOworICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmxvYWRlcl9vZmZzZXQpOworICAgICAgY19maWxlID0gKHU4ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+bG9hZGVyX29mZnNldCk7CiAKLSAgICAgIHBCb290RW5kID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRmlsZUhkcjUtPmxvYWRlcl9jb2RlX2VuZCk7CisgICAgICBib290X2VuZCA9ICh1OCAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmxvYWRlcl9jb2RlX2VuZCk7CiAKLSAgICAgIGxvYWRlcl9jb2RlX2FkZHJlc3MgPSBwRmlsZUhkcjUtPmxvYWRlcl9jb2RlX2FkZHJlc3M7Ci0gICAgICBsb2FkZXJfY29kZV9zaXplID0gcEZpbGVIZHI1LT5sb2FkZXJfY29kZV9zaXplOwotICAgICAgYkdvb2RWZXJzaW9uID0gRkFMU0U7CisgICAgICBsb2FkZXJfY29kZV9hZGRyZXNzID0gZmlsZV9oZHItPmxvYWRlcl9jb2RlX2FkZHJlc3M7CisgICAgICBsb2FkZXJfY29kZV9zaXplID0gZmlsZV9oZHItPmxvYWRlcl9jb2RlX3NpemU7CisgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBGQUxTRTsKIAotICAgd2hpbGUgKChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpICYmICh1aVN0YXRlICE9IFNUQVRFX0RPTkVfRklMRSkpCisgICB3aGlsZSAoKHN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgJiYgKHN0YXRlICE9IFNUQVRFX0RPTkVfRklMRSkpCiAgICB7Ci0gICAgICBzd2l0Y2ggKHVpU3RhdGUpCisgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgewogICAgICAgY2FzZSAgU1RBVEVfU1RBUlRfRFdOTEQ6CiAgICAgICAgICBERUJVRygiRlQxMDAwOlNUQVRFX1NUQVJUX0RXTkxEXG4iKTsKQEAgLTg0OCwxMCArODQ4LDEwIEBACiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBIYW5kc2hha2UgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICB9CiAKLSAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9CT09UX0RXTkxEOworICAgICAgICAgc3RhdGUgPSBTVEFURV9CT09UX0RXTkxEOwogCiAgICAgICAgICBicmVhazsKIApAQCAtODc4LDExICs4NzgsMTEgQEAKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfRE9ORV9CTDoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6UkVRVUVTVF9ET05FX0JMXG4iKTsKICAgICAgICAgICAgICAgIC8qIFJlcG9zaXRpb24gcHRycyB0byBiZWdpbm5pbmcgb2YgY29kZSBzZWN0aW9uICovCi0gICAgICAgICAgICAgICBwVXNGaWxlID0gKFVTSE9SVCAqKShwQm9vdEVuZCk7Ci0gICAgICAgICAgICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBCb290RW5kKTsKLSAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpwVXNGaWxlID0gMHglOHhcbiIsIChpbnQpcFVzRmlsZSk7Ci0gICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6cFVjRmlsZSA9IDB4JTh4XG4iLCAoaW50KXBVY0ZpbGUpOwotICAgICAgICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0NPREVfRFdOTEQ7CisgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKGJvb3RfZW5kKTsKKyAgICAgICAgICAgICAgIGNfZmlsZSA9ICh1OCAqKShib290X2VuZCk7CisgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6c19maWxlID0gMHglOHhcbiIsIChpbnQpc19maWxlKTsKKyAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpjX2ZpbGUgPSAweCU4eFxuIiwgKGludCljX2ZpbGUpOworICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT0RFX0RXTkxEOwogICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPmZjb2RlbGRyID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9DT0RFX1NFR01FTlQ6CkBAIC04OTMsMzMgKzg5MywzMyBAQAogICAgICAgICAgICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gTUFYX0xFTkdUSCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IE1heCBsZW5ndGggZXhjZWVkZWRcbiIpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgaWYgKCAod29yZF9sZW5ndGgqMiArIHBVY0ZpbGUpID4gcEJvb3RFbmQpCisgICAgICAgICAgICAgICBpZiAoICh3b3JkX2xlbmd0aCoyICsgY19maWxlKSA+IGJvb3RfZW5kKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIEVycm9yLCBiZXlvbmQgYm9vdCBjb2RlIHJhbmdlLgogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBSZXF1ZXN0ZWQgbGVuPSVkIGV4Y2VlZHMgQk9PVCBjb2RlIGJvdW5kcnkuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl3b3JkX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogUG9zaXRpb24gQVNJQyBEUFJBTSBhdXRvLWluY3JlbWVudCBwb2ludGVyLgogICAgICAgICAgICAgICAgICovCi0JCQkJICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisJCQkJICAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAJCQkJCWlmICh3b3JkX2xlbmd0aCAmIDB4MSkKIAkJCQkJCXdvcmRfbGVuZ3RoKys7CiAJCQkJCXdvcmRfbGVuZ3RoID0gd29yZF9sZW5ndGggLyAyOwogCi0JCQlTdGF0dXMgPSAgIHdyaXRlX2JsayhmdDEwMDBkZXYsICZwVXNGaWxlLCAmcFVjRmlsZSwgd29yZF9sZW5ndGgpOwotCQkJLy9ERUJVRygid3JpdGVfYmxrIHJldHVybmVkICVkXG4iLCBTdGF0dXMpOworCQkJc3RhdHVzID0gICB3cml0ZV9ibGsoZnQxMDAwZGV2LCAmc19maWxlLCAmY19maWxlLCB3b3JkX2xlbmd0aCk7CisJCQkvL0RFQlVHKCJ3cml0ZV9ibGsgcmV0dXJuZWQgJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBCYWQgcmVxdWVzdCB0eXBlPSVkIGluIEJPT1QgZG93bmxvYWQgc3RhdGUuXG4iLHJlcXVlc3QpOwotICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290KQpAQCAtOTMwLDcgKzkzMCw3IEBACiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBIYW5kc2hha2UgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICB9CiAKICAgICAgICAgIGJyZWFrOwpAQCAtOTU5LDcgKzk1OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX1JVTl9BRERSRVNTOgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDogIFJFUVVFU1RfUlVOX0FERFJFU1NcbiIpOwotICAgICAgICAgICAgICAgaWYgKGJHb29kVmVyc2lvbikKKyAgICAgICAgICAgICAgIGlmIChjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOnJ1bl9hZGRyZXNzID0gMHglOHhcbiIsIChpbnQpcnVuX2FkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCBydW5fYWRkcmVzcyk7CkBAIC05NjcsMTMgKzk2NywxMyBAQAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogR290IFJ1biBhZGRyZXNzIHJlcXVlc3QgYmVmb3JlIGltYWdlIG9mZnNldCByZXF1ZXN0LlxuIik7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfQ09ERV9MRU5HVEg6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOlJFUVVFU1RfQ09ERV9MRU5HVEhcbiIpOwotICAgICAgICAgICAgICAgaWYgKGJHb29kVmVyc2lvbikKKyAgICAgICAgICAgICAgIGlmIChjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOnJ1bl9zaXplID0gMHglOHhcbiIsIChpbnQpcnVuX3NpemUpOwogICAgICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCBydW5fc2l6ZSk7CkBAIC05ODEsMjMgKzk4MSwyMyBAQAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogR290IFNpemUgcmVxdWVzdCBiZWZvcmUgaW1hZ2Ugb2Zmc2V0IHJlcXVlc3QuXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9ET05FX0NMOgogICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPnVzYmJvb3QgPSAzOwogICAgICAgICAgICAgICAgLyogUmVwb3NpdGlvbiBwdHJzIHRvIGJlZ2lubmluZyBvZiBwcm92aXNpb25pbmcgc2VjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+Y29tbWFuZHNfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgIHBVY0ZpbGUgPSAoVUNIQVIgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+Y29tbWFuZHNfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX0RXTkxEOworICAgICAgICAgICAgICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmNvbW1hbmRzX29mZnNldCk7CisgICAgICAgICAgICAgICAgICBjX2ZpbGUgPSAodTggKikocEZpbGVTdGFydCArIGZpbGVfaGRyLT5jb21tYW5kc19vZmZzZXQpOworICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9ET05FX0RXTkxEOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0NPREVfU0VHTUVOVDoKICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDogUkVRVUVTVF9DT0RFX1NFR01FTlQgLSBDT0RFTE9BREVSXG4iKTsKLSAgICAgICAgICAgICAgIGlmICghYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKCFjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBHb3QgQ29kZSBTZWdtZW50IHJlcXVlc3QgYmVmb3JlIGltYWdlIG9mZnNldCByZXF1ZXN0LlxuIik7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAjaWYgMApAQCAtMTAxMSwyOCArMTAxMSwyOCBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBNYXggbGVuZ3RoIGV4Y2VlZGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGlmICggKHdvcmRfbGVuZ3RoKjIgKyBwVWNGaWxlKSA+IHBDb2RlRW5kKQorICAgICAgICAgICAgICAgaWYgKCAod29yZF9sZW5ndGgqMiArIGNfZmlsZSkgPiBjb2RlX2VuZCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgKiBFcnJvciwgYmV5b25kIGJvb3QgY29kZSByYW5nZS4KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogUmVxdWVzdGVkIGxlbj0lZCBleGNlZWRzIERTUCBjb2RlIGJvdW5kcnkuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpd29yZF9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvc2l0aW9uIEFTSUMgRFBSQU0gYXV0by1pbmNyZW1lbnQgcG9pbnRlci4KICAgICAgICAgICAgICAgICAqLwotCQkgICBkcHJhbSA9IChVU0hPUlQpRFdOTERfTUFHMV9QU19IRFJfTE9DOworCQkgICBkcHJhbSA9ICh1MTYpRFdOTERfTUFHMV9QU19IRFJfTE9DOwogCQkgICBpZiAod29yZF9sZW5ndGggJiAweDEpCiAJCQl3b3JkX2xlbmd0aCsrOwogCQkgICB3b3JkX2xlbmd0aCA9IHdvcmRfbGVuZ3RoIC8gMjsKIAotICAgCSAgICAgICB3cml0ZV9ibGtfZmlmbyAoZnQxMDAwZGV2LCAmcFVzRmlsZSwgJnBVY0ZpbGUsIHdvcmRfbGVuZ3RoKTsKKyAgIAkgICAgICAgd3JpdGVfYmxrX2ZpZm8gKGZ0MTAwMGRldiwgJnNfZmlsZSwgJmNfZmlsZSwgd29yZF9sZW5ndGgpOwogICAgICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290ID09IDApCiAgICAgICAgICAgICAgICAgICAgcGZ0MTAwMGluZm8tPnVzYmJvb3QrKzsKICAgICAgICAgICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCA9PSAxKSB7CkBAIC0xMDQ3LDE0ICsxMDQ3LDE0IEBACiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGxlbmd0aCBmcm9tIGJ5dGUgY291bnQgdG8gd29yZCBjb3VudC4gTWFrZSBzdXJlIHdlIHJvdW5kIHVwLgogICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSAobG9uZykocGZ0MTAwMGluZm8tPkRTUEluZm9CbGtsZW4gKyAxKS8yOwogICAgICAgICAgICAgICAgcHV0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2LCB3b3JkX2xlbmd0aCk7Ci0JCXBNYWlsQm94RGF0YSA9IChzdHJ1Y3QgZHJ2X21zZyAqKSYocGZ0MTAwMGluZm8tPkRTUEluZm9CbGtbMF0pOworCQltYWlsYm94X2RhdGEgPSAoc3RydWN0IGRydl9tc2cgKikmKHBmdDEwMDBpbmZvLT5EU1BJbmZvQmxrWzBdKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiBBU0lDIERQUkFNIGF1dG8taW5jcmVtZW50IHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgKi8KIAogCi0gICAgICAgICAgICAgICAgICAgcFVzRGF0YSA9IChVU0hPUlQgKikmcE1haWxCb3hEYXRhLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICAgICAgICAgICAgICAgICAgZGF0YSA9ICh1MTYgKikmbWFpbGJveF9kYXRhLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRfbGVuZ3RoICYgMHgxKQogICAgICAgICAgICAgICAgICAgICAgICB3b3JkX2xlbmd0aCsrOwogCkBAIC0xMDY0LDI1ICsxMDY0LDI1IEBACiAgICAgICAgICAgICAgICBmb3IgKDsgd29yZF9sZW5ndGggPiAwOyB3b3JkX2xlbmd0aC0tKSAvKiBJbiB3b3JkcyAqLwogICAgICAgICAgICAgICAgewogCi0gICAgICAgICAgICAgICAgICAgICAgdGVtcGxvbmcgPSAqcFVzRGF0YSsrOwotCQkJCQkgIHRlbXBsb25nIHw9ICgqcFVzRGF0YSsrIDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rKywgKFBVQ0hBUikmdGVtcGxvbmcpOworICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gKmRhdGErKzsKKwkJCQkJICB0ZW1wbG9uZyB8PSAoKmRhdGErKyA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKyssICh1OCAqKSZ0ZW1wbG9uZyk7CiAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX1ZFUlNJT05fSU5GTzoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6UkVRVUVTVF9WRVJTSU9OX0lORk9cbiIpOwotICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSBwRmlsZUhkcjUtPnZlcnNpb25fZGF0YV9zaXplOworICAgICAgICAgICAgICAgd29yZF9sZW5ndGggPSBmaWxlX2hkci0+dmVyc2lvbl9kYXRhX3NpemU7CiAgICAgICAgICAgICAgICBwdXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYsIHdvcmRfbGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiBBU0lDIERQUkFNIGF1dG8taW5jcmVtZW50IHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+dmVyc2lvbl9kYXRhX29mZnNldCk7CisgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+dmVyc2lvbl9kYXRhX29mZnNldCk7CiAKIAotICAgICAgICAgICAgICAgICAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisgICAgICAgICAgICAgICAgICAgZHByYW0gPSAodTE2KURXTkxEX01BRzFfUFNfSERSX0xPQzsKICAgICAgICAgICAgICAgICAgICBpZiAod29yZF9sZW5ndGggJiAweDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuZ3RoKys7CiAKQEAgLTEwOTIsNTkgKzEwOTIsNTkgQEAKICAgICAgICAgICAgICAgIGZvciAoOyB3b3JkX2xlbmd0aCA+IDA7IHdvcmRfbGVuZ3RoLS0pIC8qIEluIHdvcmRzICovCiAgICAgICAgICAgICAgICB7CiAKLSAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyA9IG50b2hzKCpwVXNGaWxlKyspOwotCQkJCQkgIHRlbXAgPSBudG9ocygqcFVzRmlsZSsrKTsKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyA9IG50b2hzKCpzX2ZpbGUrKyk7CisJCQkJCSAgdGVtcCA9IG50b2hzKCpzX2ZpbGUrKyk7CiAJCQkJCSAgdGVtcGxvbmcgfD0gKHRlbXAgPDwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSsrLCAoUFVDSEFSKSZ0ZW1wbG9uZyk7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKyssICh1OCAqKSZ0ZW1wbG9uZyk7CiAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0NPREVfQllfVkVSU0lPTjoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6UkVRVUVTVF9DT0RFX0JZX1ZFUlNJT05cbiIpOwotICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uID0gRkFMU0U7CisgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBGQUxTRTsKICAgICAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZ2V0X3JlcXVlc3RfdmFsdWUoZnQxMDAwZGV2KTsKIAotICAgICAgICAgICAgICAgICAgIHBEc3BJbWFnZUluZm9WNiA9IChzdHJ1Y3QgZHNwX2ltYWdlX2luZm8gKikocEZpbGVTdGFydCArIHNpemVvZihzdHJ1Y3QgZHNwX2ZpbGVfaGRyICkpOworICAgICAgICAgICAgICAgICAgIGRzcF9pbWdfaW5mbyA9IChzdHJ1Y3QgZHNwX2ltYWdlX2luZm8gKikocEZpbGVTdGFydCArIHNpemVvZihzdHJ1Y3QgZHNwX2ZpbGVfaGRyICkpOwogCi0gICAgICAgICAgICAgICBmb3IgKGltYWdlTiA9IDA7IGltYWdlTiA8IHBGaWxlSGRyNS0+bkRzcEltYWdlczsgaW1hZ2VOKyspCisgICAgICAgICAgICAgICBmb3IgKGltYWdlID0gMDsgaW1hZ2UgPCBmaWxlX2hkci0+bkRzcEltYWdlczsgaW1hZ2UrKykKICAgICAgICAgICAgICAgIHsKIAotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKFVTSE9SVCkocERzcEltYWdlSW5mb1Y2LT52ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICh1MTYpKGRzcF9pbWdfaW5mby0+dmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChVU0hPUlQpKHBEc3BJbWFnZUluZm9WNi0+dmVyc2lvbiA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAodTE2KShkc3BfaW1nX2luZm8tPnZlcnNpb24gPj4gMTYpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyB8PSAodGVtcCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsb25nID09IChVTE9ORylyZXF1ZXN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxvbmcgPT0gKHUzMilyZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdvb2RWZXJzaW9uID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6IGJHb29kVmVyc2lvbiBpcyBUUlVFXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc0ZpbGUgPSAoVVNIT1JUICopKHBGaWxlU3RhcnQgKyBwRHNwSW1hZ2VJbmZvVjYtPmJlZ2luX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVWNGaWxlID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRHNwSW1hZ2VJbmZvVjYtPmJlZ2luX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZUVuZCA9IChVQ0hBUiAqKShwRmlsZVN0YXJ0ICsgcERzcEltYWdlSW5mb1Y2LT5lbmRfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hZGRyZXNzID0gcERzcEltYWdlSW5mb1Y2LT5ydW5fYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zaXplID0gcERzcEltYWdlSW5mb1Y2LT5pbWFnZV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gKFVMT05HKXBEc3BJbWFnZUluZm9WNi0+Y2hlY2tzdW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0X3ZlcnNpb24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDogY29ycmVjdF92ZXJzaW9uIGlzIFRSVUVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc19maWxlID0gKHUxNiAqKShwRmlsZVN0YXJ0ICsgZHNwX2ltZ19pbmZvLT5iZWdpbl9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY19maWxlID0gKHU4ICopKHBGaWxlU3RhcnQgKyBkc3BfaW1nX2luZm8tPmJlZ2luX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2VuZCA9ICh1OCAqKShwRmlsZVN0YXJ0ICsgZHNwX2ltZ19pbmZvLT5lbmRfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9hZGRyZXNzID0gZHNwX2ltZ19pbmZvLT5ydW5fYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9zaXplID0gZHNwX2ltZ19pbmZvLT5pbWFnZV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY2hrc3VtID0gKHUzMilkc3BfaW1nX2luZm8tPmNoZWNrc3VtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRHNwSW1hZ2VJbmZvVjYrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzcF9pbWdfaW5mbysrOwogCiAKICAgICAgICAgICAgICAgIH0gLy9lbmQgb2YgZm9yCiAKLSAgICAgICAgICAgICAgIGlmICghYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKCFjb3JyZWN0X3ZlcnNpb24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogRXJyb3IsIGJleW9uZCBib290IGNvZGUgcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEJhZCBWZXJzaW9uIFJlcXVlc3QgPSAweCV4LlxuIiwoaW50KXJlcXVlc3RlZF92ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogQmFkIHJlcXVlc3QgdHlwZT0lZCBpbiBDT0RFIGRvd25sb2FkIHN0YXRlLlxuIixyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCkKQEAgLTExNTUsOTQgKzExNTUsOTQgQEAKICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEhhbmRzaGFrZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgIH0KIAogICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgU1RBVEVfRE9ORV9EV05MRDoKICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6Q29kZSBsb2FkZXIgaXMgZG9uZS4uLlxuIik7Ci0gICAgICAgICB1aVN0YXRlID0gU1RBVEVfU0VDVElPTl9QUk9WOworICAgICAgICAgc3RhdGUgPSBTVEFURV9TRUNUSU9OX1BST1Y7CiAgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSAgU1RBVEVfU0VDVElPTl9QUk9WOgogICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpTVEFURV9TRUNUSU9OX1BST1ZcbiIpOwotCQlwSGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopcFVjRmlsZTsKKwkJcHNldWRvX2hlYWRlciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKWNfZmlsZTsKIAotICAgICAgICAgaWYgKHBIZHItPmNoZWNrc3VtID09IGhkcl9jaGVja3N1bShwSGRyKSkKKyAgICAgICAgIGlmIChwc2V1ZG9faGVhZGVyLT5jaGVja3N1bSA9PSBoZHJfY2hlY2tzdW0ocHNldWRvX2hlYWRlcikpCiAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEhkci0+cG9ydGRlc3QgIT0gMHg4MCAvKiBEc3AgT0FNICovKQorICAgICAgICAgICAgaWYgKHBzZXVkb19oZWFkZXItPnBvcnRkZXN0ICE9IDB4ODAgLyogRHNwIE9BTSAqLykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX1BST1Y7CisgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkVfUFJPVjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdXNIZHJMZW5ndGggPSBudG9ocyhwSGRyLT5sZW5ndGgpOyAgICAvKiBCeXRlIGxlbmd0aCBmb3IgUFJPViByZWNvcmRzICovCisgICAgICAgICAgICBwc2V1ZG9faGVhZGVyX2xlbiA9IG50b2hzKHBzZXVkb19oZWFkZXItPmxlbmd0aCk7ICAgIC8qIEJ5dGUgbGVuZ3RoIGZvciBQUk9WIHJlY29yZHMgKi8KIAogICAgICAgICAgICAgLy8gR2V0IGJ1ZmZlciBmb3IgcHJvdmlzaW9uaW5nIGRhdGEKLQkJcGJ1ZmZlciA9IGttYWxsb2MoKHVzSGRyTGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSksIEdGUF9BVE9NSUMpOworCQlwYnVmZmVyID0ga21hbGxvYygocHNldWRvX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSwgR0ZQX0FUT01JQyk7CiAgICAgICAgICAgICBpZiAocGJ1ZmZlcikgewotCQltZW1jcHkocGJ1ZmZlciwgKHZvaWQgKilwVWNGaWxlLCAoVUlOVCkodXNIZHJMZW5ndGggKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSk7CisJCW1lbWNweShwYnVmZmVyLCAodm9pZCAqKWNfZmlsZSwgKHUzMikocHNldWRvX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSk7CiAgICAgICAgICAgICAgICAgLy8gbGluayBwcm92aXNpb25pbmcgZGF0YQogCQlwcHJvdl9yZWNvcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvdl9yZWNvcmQpLCBHRlBfQVRPTUlDKTsKICAgICAgICAgICAgICAgICBpZiAocHByb3ZfcmVjb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgIHBwcm92X3JlY29yZC0+cHByb3ZfZGF0YSA9IHBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwgKCZwcHJvdl9yZWNvcmQtPmxpc3QsICZwZnQxMDAwaW5mby0+cHJvdl9saXN0KTsKICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBuZXh0IGVudHJ5IGlmIGF2YWlsYWJsZQotCQkJcFVjRmlsZSA9IChVQ0hBUiAqKSgodW5zaWduZWQgbG9uZylwVWNGaWxlICsgKFVJTlQpKCh1c0hkckxlbmd0aCArIDEpICYgMHhGRkZGRkZGRSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgbG9uZykocFVjRmlsZSkgLSAodW5zaWduZWQgbG9uZykocEZpbGVTdGFydCkgPj0gKHVuc2lnbmVkIGxvbmcpRmlsZUxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICB1aVN0YXRlID0gU1RBVEVfRE9ORV9GSUxFOworCQkJY19maWxlID0gKHU4ICopKCh1bnNpZ25lZCBsb25nKWNfZmlsZSArICh1MzIpKChwc2V1ZG9faGVhZGVyX2xlbiArIDEpICYgMHhGRkZGRkZGRSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQgbG9uZykoY19maWxlKSAtICh1bnNpZ25lZCBsb25nKShwRmlsZVN0YXJ0KSA+PSAodW5zaWduZWQgbG9uZylGaWxlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORV9GSUxFOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBrZnJlZShwYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAgLyogQ2hlY2tzdW0gZGlkIG5vdCBjb21wdXRlICovCi0gICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgfQotICAgICAgICAgREVCVUcoImZ0MTAwMDpkb3dubG9hZDogYWZ0ZXIgU1RBVEVfU0VDVElPTl9QUk9WLCB1aVN0YXRlID0gJWQsIFN0YXR1cz0gJWRcbiIsIHVpU3RhdGUsIFN0YXR1cyk7CisgICAgICAgICBERUJVRygiZnQxMDAwOmRvd25sb2FkOiBhZnRlciBTVEFURV9TRUNUSU9OX1BST1YsIHN0YXRlID0gJWQsIHN0YXR1cz0gJWRcbiIsIHN0YXRlLCBzdGF0dXMpOwogICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgIFNUQVRFX0RPTkVfUFJPVjoKICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6U1RBVEVfRE9ORV9QUk9WXG4iKTsKLSAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX0ZJTEU7CisgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkVfRklMRTsKICAgICAgICAgIGJyZWFrOwogCiAKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgYnJlYWs7CiAgICAgICB9IC8qIEVuZCBTd2l0Y2ggKi8KIAotICAgICAgaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworICAgICAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogCiAvKioqKgogICAgICAgLy8gQ2hlY2sgaWYgQ2FyZCBpcyBwcmVzZW50Ci0gICAgICBTdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19TVVBfSU1BU0spOwotICAgICAgaWYgKCAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4MDAwMCkgKSB7CisgICAgICBzdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19TVVBfSU1BU0spOworICAgICAgaWYgKCAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4MDAwMCkgKSB7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIFN0YXR1cyA9IEhhcmxleV9SZWFkX1JlZ2lzdGVyKCZ0ZW1wLCBGVDEwMDBfUkVHX0FTSUNfSUQpOwotICAgICAgaWYgKCAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4ZmZmZikgKSB7CisgICAgICBzdGF0dXMgPSBIYXJsZXlfUmVhZF9SZWdpc3RlcigmdGVtcCwgRlQxMDAwX1JFR19BU0lDX0lEKTsKKyAgICAgIGlmICggKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAodGVtcCA9PSAweGZmZmYpICkgewogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogKioqKi8KIAogICAgfSAvKiBFbmQgd2hpbGUgKi8KIAotICAgREVCVUcoIkRvd25sb2FkIGV4aXRpbmcgd2l0aCBzdGF0dXMgPSAweCU4eFxuIiwgU3RhdHVzKTsKKyAgIERFQlVHKCJEb3dubG9hZCBleGl0aW5nIHdpdGggc3RhdHVzID0gMHglOHhcbiIsIHN0YXR1cyk7CiAgICBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCBGVDEwMDBfREJfRE5MRF9UWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAKLSAgIHJldHVybiBTdGF0dXM7CisgICByZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKaW5kZXggNWI4OWVlMi4uNjQzYTYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwpAQCAtNDEsMzcgKzQxLDkgQEAKIC8vSmltCiAKIHN0YXRpYyB1OCB0ZW1wYnVmZmVyWzE2MDBdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ0NhcmRJbmRleDsKIAogI2RlZmluZSBNQVhfUkNWX0xPT1AgICAxMDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBmdDEwMDBfY29udHJvbF9jb21wbGV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBmdDEwMDBfY29udHJvbF9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCi17Ci0gICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiA9IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqKXVyYi0+Y29udGV4dDsKLQotICAgIC8vREVCVUcoIkZUMTAwMF9DT05UUk9MX0NPTVBMRVRFIEVOVEVSRURcbiIpOwotICAgIGlmIChmdDEwMDBkZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYsIGZhaWx1cmVcbiIpOwotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBlbHNlIGlmICggZnQxMDAwZGV2LT5kZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYtPmRldiwgZmFpbHVyZVxuIik7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotCi0gICAgaWYod2FpdHF1ZXVlX2FjdGl2ZSgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpKQotICAgIHsKLSAgICAgICAgd2FrZV91cCgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpOwotICAgIH0KLQotICAgIC8vREVCVUcoIkZUMTAwMF9DT05UUk9MX0NPTVBMRVRFIFJFVFVSTkVEXG4iKTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfY29udHJvbAogLy8KQEAgLTE4Nyw3ICsxNTksNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIHZhbHVlLCB1MTYgblJlZ0luZHgpCit1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiB2YWx1ZSwgdTE2IG5SZWdJbmR4KQogewogICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTIyMyw3ICsxOTUsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCBVU0hPUlQgY250KQordTE2IGZ0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIsIHUxNiBjbnQpCiB7CiAgICAgdTE2IHJldCA9IFNUQVRVU19TVUNDRVNTOwogCkBAIC0yNjIsNyArMjM0LDcgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11MTYgZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIFVTSE9SVCBjbnQpCit1MTYgZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIsIHUxNiBjbnQpCiB7CiAgICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMjk5LDcgKzI3MSw3IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTE2IGZ0MTAwMF9yZWFkX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIHU4IGhpZ2hsb3cpCit1MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTggaGlnaGxvdykKIHsKICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTM0Nyw3ICszMTksNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgVVNIT1JUIHZhbHVlLCB1OCBoaWdobG93KQordTE2IGZ0MTAwMF93cml0ZV9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1MTYgdmFsdWUsIHU4IGhpZ2hsb3cpCiB7CiAgICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMzkyLDEwICszNjQsMTAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpCit1MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIpCiB7Ci0gICAgVUNIQVIgYnVmWzE2XTsKLSAgICBVU0hPUlQgcG9zOworICAgIHU4IGJ1ZlsxNl07CisgICAgdTE2IHBvczsKICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKICAgICAvL0RFQlVHKCJmaXhfZnQxMDAwX3JlYWRfZHByYW0zMjogaW5keDogJWQgIFxuIiwgaW5keCk7CkBAIC00NDEsMTQgKzQxMywxNCBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpCit1MTYgZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyKQogewotICAgIFVTSE9SVCBwb3MxOwotICAgIFVTSE9SVCBwb3MyOwotICAgIFVTSE9SVCBpOwotICAgIFVDSEFSIGJ1ZlszMl07Ci0gICAgVUNIQVIgcmVzdWx0YnVmZmVyWzMyXTsKLSAgICBQVUNIQVIgcGRhdGE7CisgICAgdTE2IHBvczE7CisgICAgdTE2IHBvczI7CisgICAgdTE2IGk7CisgICAgdTggYnVmWzMyXTsKKyAgICB1OCByZXN1bHRidWZmZXJbMzJdOworICAgIHU4ICpwZGF0YTsKICAgICB1MTYgcmV0ICA9IFNUQVRVU19TVUNDRVNTOwogCiAgICAgLy9ERUJVRygiZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyOiBFbnRlcmVkOlxuIik7CkBAIC00NzIsNyArNDQ0LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKFBVQ0hBUikmcmVzdWx0YnVmZmVyWzBdLCAxNik7CisgICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDE2KTsKICAgICBpZiAocmV0ID09IFNUQVRVU19TVUNDRVNTKQogICAgIHsKICAgICAgICAgYnVmZmVyID0gcGRhdGE7CkBAIC00ODcsOCArNDU5LDggQEAKIAogICAgIGlmIChyZXQgPT0gU1RBVFVTX0ZBSUxVUkUpCiAgICAgewotICAgICAgICByZXQgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsIChQVUNIQVIpJnRlbXBidWZmZXJbMF0sIDE2KTsKLSAgICAgICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsIChQVUNIQVIpJnJlc3VsdGJ1ZmZlclswXSwgMTYpOworICAgICAgICByZXQgPSBmdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsICh1OCAqKSZ0ZW1wYnVmZmVyWzBdLCAxNik7CisgICAgICAgIHJldCA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIoZnQxMDAwZGV2LCBwb3MxLCAodTggKikmcmVzdWx0YnVmZmVyWzBdLCAxNik7CiAgICAgICAgIGlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZmZlciA9IHBkYXRhOwpAQCAtNTE4LDEwICs0OTAsMTAgQEAKIC8vCiAvLyAgUmV0dXJuczogICAgTm9uZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIHZvaWQgY2FyZF9yZXNldF9kc3AgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIEJPT0xFQU4gdmFsdWUpCitzdGF0aWMgdm9pZCBjYXJkX3Jlc2V0X2RzcCAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgYm9vbCB2YWx1ZSkKIHsKICAgICB1MTYgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICAgVVNIT1JUIHRlbXB3b3JkOworICAgIHUxNiB0ZW1wd29yZDsKIAogICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZnQxMDAwZGV2LCBIT1NUX0lOVEZfQkUsIEZUMTAwMF9SRUdfU1VQX0NUUkwpOwogICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKGZ0MTAwMGRldiwgJnRlbXB3b3JkLCBGVDEwMDBfUkVHX1NVUF9DVFJMKTsKQEAgLTYyMCw4ICs1OTIsOCBAQAogaW50IGRzcF9yZWxvYWQoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldikKIHsKICAgICB1MTYgc3RhdHVzOwotICAgIFVTSE9SVCB0ZW1wd29yZDsKLSAgICBVTE9ORyB0ZW1wbG9uZzsKKyAgICB1MTYgdGVtcHdvcmQ7CisgICAgdTMyIHRlbXBsb25nOwogCiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbzsKIApAQCAtNjQ4LDcgKzYyMCw3IEBACiAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsIEhPU1RfSU5URl9CRSwgRlQxMDAwX1JFR19TVVBfQ1RSTCk7CiAKICAgICAvLyBMZXQncyBjaGVjayBmb3IgRkVGRQotICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRlQxMDAwX01BR19EUFJBTV9GRUZFX0lORFgsIChQVUNIQVIpJnRlbXBsb25nLCA0KTsKKyAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFBSQU1fRkVGRV9JTkRYLCAodTggKikmdGVtcGxvbmcsIDQpOwogICAgIERFQlVHKCJ0ZW1wbG9uZyAoZmVmZSkgPSAweCU4eFxuIiwgdGVtcGxvbmcpOwogCiAgICAgLy8gY2FsbCBjb2RlbG9hZGVyCkBAIC03NTMsNyArNzI1LDcgQEAKIAogICAgIC8vIEluaXRpYWxpemUgRFNQIGhlYXJ0YmVhdCBhcmVhIHRvIGhvCiAgICAgZnQxMDAwX3dyaXRlX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0hJX0hPLCBob19tYWcsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7Ci0gICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfSElfSE8sIChQQ0hBUikmdGVtcHdvcmQsIEZUMTAwMF9NQUdfSElfSE9fSU5EWCk7CisgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfSElfSE8sICh1OCAqKSZ0ZW1wd29yZCwgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKICAgICBERUJVRygiZnQxMDAwX2h3OmZ0MTAwMF9yZXNldF9jYXJkOmhpX2hvIHZhbHVlID0gMHgleFxuIiwgdGVtcHdvcmQpOwogCiAKQEAgLTgwMCw4ICs3NzIsNyBAQAogCWludCBpLCByZXRfdmFsOwogCXN0cnVjdCBsaXN0X2hlYWQgKmN1ciwgKnRtcDsKIAljaGFyIGNhcmRfbnJbMl07Ci0KLQlnQ2FyZEluZGV4PTA7IC8vbWJlbGlhbgorCXVuc2lnbmVkIGxvbmcgZ0NhcmRJbmRleCA9IDA7CiAKICAgICBERUJVRygiRW50ZXIgaW5pdF9mdDEwMDBfbmV0ZGV2Li4uXG4iKTsKIApAQCAtODEzLDcgKzc4NCw3IEBACiAJcmV0dXJuIC1FTk9NRU07CiAgICAgfQogCi0JcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KG5ldGRldik7CisJcEluZm8gPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAgICAgLy9ERUJVRygiaW5pdF9mdDEwMDBfbmV0ZGV2OiBnRnQxMDAwSW5mbz0leCwgbmV0ZGV2PSV4LCBmdDEwMDBkZXY9JXhcbiIsIGdGdDEwMDBJbmZvLCBuZXRkZXYsIGZ0MTAwMGRldik7CiAKQEAgLTgyMSw5ICs3OTIsNiBAQAogCiAgICAgZGV2X2FsbG9jX25hbWUobmV0ZGV2LCBuZXRkZXYtPm5hbWUpOwogCi0gICAgLy9mb3IgdGhlIGZpcnN0IGluc2VydGVkIGNhcmQsIGRlY2lkZSB0aGUgY2FyZCBpbmRleCBiZWdpbm5pbmcgbnVtYmVyLCBpbiBjYXNlIHRoZXJlIGFyZSBleGlzdGluZyBuZXR3b3JrIGludGVyZmFjZXMKLSAgICBpZiAoIGdDYXJkSW5kZXggPT0gMCApCi0gICAgewogICAgICAgICBERUJVRygiaW5pdF9mdDEwMDBfbmV0ZGV2OiBuZXR3b3JrIGRldmljZSBuYW1lIGlzICVzXG4iLCBuZXRkZXYtPm5hbWUpOwogCiAJaWYgKCBzdHJuY21wKG5ldGRldi0+bmFtZSwiZXRoIiwgMykgPT0gMCkgewpAQCAtODQzLDEzICs4MTEsNiBAQAogCQlyZXRfdmFsID0gLUVOWElPOwogCQlnb3RvIGVycl9uZXQ7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy9ub3QgdGhlIGZpcnN0IGluc2VydGVkIGNhcmQsIGluY3JlYXNlIGNhcmQgbnVtYmVyIGJ5IDEKLSAgICAgICAgcEluZm8tPkNhcmROdW1iZXIgPSBnQ2FyZEluZGV4OwotICAgICAgICAvKkRFQlVHKCJjYXJkIG51bWJlciA9ICVkXG4iLCBwSW5mby0+Q2FyZE51bWJlcik7Ki8gLy9tYmVsaWFuCi0gICAgfQogCiAgICAgbWVtc2V0KCZwSW5mby0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgKTsKIApAQCAtODYyLDcgKzgyMyw2IEBACiAgICAgcEluZm8tPm1lZGlhc3RhdGUgPSAwOwogICAgIHBJbmZvLT5maWZvX2NudCA9IDA7CiAgICAgcEluZm8tPkRldmljZUNyZWF0ZWQgPSBGQUxTRTsKLSAgICBwSW5mby0+RGV2aWNlTWFqb3IgPSAwOwogICAgIHBJbmZvLT5DdXJyZW50SW50ZXJydXB0RW5hYmxlTWFzayA9IElTUl9ERUZBVUxUX01BU0s7CiAgICAgcEluZm8tPkludGVycnVwdHNFbmFibGVkID0gRkFMU0U7CiAgICAgcEluZm8tPkNhcmRSZWFkeSA9IDA7CkBAIC04NzQsMTMgKzgzNCwxMSBAQAogICAgIHBJbmZvLT5mQ29uZFJlc2V0UGVuZCA9IDA7CiAJcEluZm8tPnVzYmJvb3QgPSAwOwogCXBJbmZvLT5kc3BhbGl2ZSA9IDA7Ci0JZm9yIChpPTA7aTwzMiA7aSsrICkKLQl7Ci0JCXBJbmZvLT50ZW1wYnVmW2ldID0gMDsKLQl9CisJbWVtc2V0KCZwSW5mby0+dGVtcGJ1ZlswXSwgMCwgc2l6ZW9mKHBJbmZvLT50ZW1wYnVmKSk7CiAKICAgICBJTklUX0xJU1RfSEVBRCgmcEluZm8tPnByb3ZfbGlzdCk7CiAKKwlJTklUX0xJU1RfSEVBRCgmcEluZm8tPm5vZGVzLmxpc3QpOwogLy9tYmVsaWFuCiAjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZmdG5ldF9vcHM7CkBAIC05ODIsNyArOTQwLDcgQEAKIAogCiAgICAgLy9DcmVhdGUgY2hhcmFjdGVyIGRldmljZSwgaW1wbGVtZW50ZWQgYnkgSmltCi0gICAgZnQxMDAwX0NyZWF0ZURldmljZShmdDEwMDBkZXYpOworICAgIGZ0MTAwMF9jcmVhdGVfZGV2KGZ0MTAwMGRldik7CiAKICAgICBERUJVRyAoInJlZ19mdDEwMDBfbmV0ZGV2IHJldHVybmVkXG4iKTsKIApAQCAtMTAyNiwxNzggKzk4NCw2IEBACiAgICAgLy9ERUJVRygiUmV0dXJuIGZyb20gZnQxMDAwX3VzYl90cmFuc21pdF9jb21wbGV0ZVxuIik7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBmdDEwMDBfY29udHJvbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGZ0MTAwMF9yZWFkX2ZpZm9fcmVnKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsdW5zaWduZWQgaW50IHBpcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHJlcXVlc3R0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0KQotewotICAgIHUxNiByZXQ7Ci0KLSAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLSAgICBzdHJ1Y3QgdXJiICp1cmI7Ci0gICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmIChmdDEwMDBkZXYgPT0gTlVMTCApCi0gICAgewotICAgICAgICBERUJVRygiTlVMTCBmdDEwMDBkZXYsIGZhaWx1cmVcbiIpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBmdDEwMDBkZXYtPmRldiA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCJOVUxMIGZ0MTAwMGRldi0+ZGV2LCBmYWlsdXJlXG4iKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotICAgIH0KLQotICAgIHNwaW5fbG9jaygmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7Ci0KLSAgICBpZihpbl9pbnRlcnJ1cHQoKSkKLSAgICB7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLSAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotICAgIGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOwotCi0gICAgaWYoIXVyYiB8fCAhZHIpCi0gICAgewotCWtmcmVlKGRyKTsKLQl1c2JfZnJlZV91cmIodXJiKTsKLSAgICAgICAgc3Bpbl91bmxvY2soJmZ0MTAwMGRldi0+ZGV2aWNlX2xvY2spOwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLQotCi0gICAgZHItPmJSZXF1ZXN0VHlwZSA9IHJlcXVlc3R0eXBlOwotICAgIGRyLT5iUmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgZHItPndWYWx1ZSA9IHZhbHVlOwotICAgIGRyLT53SW5kZXggPSBpbmRleDsKLSAgICBkci0+d0xlbmd0aCA9IHNpemU7Ci0KLSAgICB1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGZ0MTAwMGRldi0+ZGV2LCBwaXBlLCAoY2hhciopZHIsICh2b2lkKilkYXRhLCBzaXplLCAodm9pZCAqKWZ0MTAwMF9jb250cm9sX2NvbXBsZXRlLCAodm9pZCopZnQxMDAwZGV2KTsKLQotCi0gICAgaW5pdF93YWl0cXVldWVfaGVhZCgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQpOwotCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotICAgIGFkZF93YWl0X3F1ZXVlKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCwgJndhaXQpOwotCi0KLQotCi0gICAgc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKLQotICAgIGlmKHN0YXR1cykKLSAgICB7Ci0gICAgICAgIHVzYl9mcmVlX3VyYih1cmIpOwotICAgICAgICBrZnJlZShkcik7Ci0gICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCwgJndhaXQpOwotICAgICAgICBzcGluX3VubG9jaygmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgaWYodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotICAgIHsKLSAgICAgICAgd2hpbGUodGltZW91dCAmJiB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IDE7Ci0gICAgfQotCi0gICAgcmVtb3ZlX3dhaXRfcXVldWUoJmZ0MTAwMGRldi0+Y29udHJvbF93YWl0LCAmd2FpdCk7Ci0KLSAgICBpZighc3RhdHVzKQotICAgIHsKLSAgICAgICAgdXNiX3VubGlua191cmIodXJiKTsKLSAgICAgICAgcHJpbnRrKCJmdDEwMDAgdGltZW91dFxuIik7Ci0gICAgICAgIHN0YXR1cyA9IC1FVElNRURPVVQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IHVyYi0+c3RhdHVzOwotCi0gICAgICAgIGlmKHVyYi0+c3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoImZ0MTAwMCBjb250cm9sIG1lc3NhZ2UgZmFpbGVkICh1cmIgYWRkcjogJXApIHdpdGggZXJyb3IgbnVtYmVyOiAlaVxuIiwgdXJiLCAoaW50KXN0YXR1cyk7Ci0KLSAgICAgICAgICAgIHVzYl9jbGVhcl9oYWx0KGZ0MTAwMGRldi0+ZGV2LCB1c2JfcmN2Y3RybHBpcGUoZnQxMDAwZGV2LT5kZXYsIDApKTsKLSAgICAgICAgICAgIHVzYl9jbGVhcl9oYWx0KGZ0MTAwMGRldi0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoZnQxMDAwZGV2LT5kZXYsIDApKTsKLSAgICAgICAgICAgIHVzYl91bmxpbmtfdXJiKHVyYik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgdXNiX2ZyZWVfdXJiKHVyYik7Ci0gICAga2ZyZWUoZHIpOwotICAgIHNwaW5fdW5sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLSAgICByZXR1cm4gcmV0OwotCi0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfcmVhZF9maWZvX2xlbgotLy8KLS8vIFBhcmFtZXRlcnM6ICBmdDEwMDBkZXYgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLwotLy8KLS8vIFJldHVybnM6ICAgICBub25lCi0vLwotLy8gRGVzY3JpcHRpb246IHJlYWQgdGhlIGZpZm8gbGVuZ3RoIHJlZ2lzdGVyIGNvbnRlbnQKLS8vCi0vLyBOb3RlczoKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGlubGluZSB1MTYgZnQxMDAwX3JlYWRfZmlmb19sZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgdTE2IHRlbXA7Ci0gICAgdTE2IHJldDsKLQotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2ID0gaW5mby0+cEZ0MTAwMERldjsKLS8vICAgIERFQlVHKCJmdDEwMDBfcmVhZF9maWZvX2xlbjogZW50ZXIgZnQxMDAwZGV2ICV4XG4iLCBmdDEwMDBkZXYpOwkJCS8vYWVsaWFzIFstXSByZWFzb246IHdhcm5pbmc6IGZvcm1hdCA/Pz8leD8/PyBleHBlY3RzIHR5cGUgPz8/dW5zaWduZWQgaW50Pz8/LCBidXQgYXJndW1lbnQgMiBoYXMgdHlwZSA/Pz9zdHJ1Y3QgZnQxMDAwX2RldmljZSAqPz8/Ci0gICAgREVCVUcoImZ0MTAwMF9yZWFkX2ZpZm9fbGVuOiBlbnRlciBmdDEwMDBkZXYgJXBcbiIsIGZ0MTAwMGRldik7CS8vYWVsaWFzIFsrXSByZWFzb246IHVwCi0KLSAgICByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKLQotICAgIHJldCA9IGZ0MTAwMF9yZWFkX2ZpZm9fcmVnKGZ0MTAwMGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmN0cmxwaXBlKGZ0MTAwMGRldi0+ZGV2LDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQVJMRVlfUkVBRF9SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSEFSTEVZX1JFQURfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVDEwMDBfUkVHX01BR19VRlNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR0VfVElNRU9VVCk7Ci0KLSAgICBpZiAocmV0PjApCi0gICAgICAgIHJldCA9IFNUQVRVU19TVUNDRVNTOwotICAgIGVsc2UKLSAgICAgICAgcmV0ID0gU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgICBERUJVRygiZnQxMDAwX3JlYWRfZmlmb19sZW46IHJldHVybmVkICVkXG4iLCB0ZW1wKTsKLQotICAgIHJldHVybiAodGVtcC0gMTYpOwotCi19Ci0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyBGdW5jdGlvbjogICBmdDEwMDBfY29weV9kb3duX3BrdApAQCAtMTIxOSwxNiArMTAwNSwxNSBAQAogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpwRnQxMDAwRGV2ID0gcEluZm8tPnBGdDEwMDBEZXY7CiAKIAotICAgIGludCBpLCBjb3VudCwgcmV0OwotICAgIFVTSE9SVCAqcFRlbXA7Ci0gICAgVVNIT1JUIGNoZWNrc3VtOworCWludCBjb3VudCwgcmV0OwogICAgIHU4ICp0OworCXN0cnVjdCBwc2V1ZG9faGRyIGhkcjsKIAogICAgIGlmICghcEluZm8tPkNhcmRSZWFkeSkKICAgICB7CiAKICAgICAgICAgREVCVUcoImZ0MTAwMF9jb3B5X2Rvd25fcGt0OjpDYXJkIE5vdCBSZWFkeVxuIik7Ci0gICAgCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwlyZXR1cm4gLUVOT0RFVjsKIAogICAgIH0KIApAQCAtMTI0MCwyNyArMTAyNSwyNyBAQAogICAgIHsKICAgICAgICAgREVCVUcoIkVycm9yOmZ0MTAwMF9jb3B5X2Rvd25fcGt0Ok1lc3NhZ2UgU2l6ZSBPdmVyZmxvdyFcbiIpOwogICAgIAlERUJVRygic2l6ZSA9ICVkXG4iLCBjb3VudCk7Ci0gICAgCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwlyZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKICAgICBpZiAoIGNvdW50ICUgNCkKICAgICAgICAgY291bnQgPSBjb3VudCArICg0LSAoY291bnQgJTQpICk7CiAKLSAgICBwVGVtcCA9IChQVVNIT1JUKSYocEZ0MTAwMERldi0+dHhfYnVmWzBdKTsKLSAgICAqcFRlbXAgKysgPSBudG9ocyhjb3VudCk7Ci0gICAgKnBUZW1wICsrID0gMHgxMDIwOwotICAgICpwVGVtcCArKyA9IDB4MjAxMDsKLSAgICAqcFRlbXAgKysgPSAweDkxMDA7Ci0gICAgKnBUZW1wICsrID0gMDsKLSAgICAqcFRlbXAgKysgPSAwOwotICAgICpwVGVtcCArKyA9IDA7Ci0gICAgcFRlbXAgPSAoUFVTSE9SVCkmKHBGdDEwMDBEZXYtPnR4X2J1ZlswXSk7Ci0gICAgY2hlY2tzdW0gPSAqcFRlbXAgKys7Ci0gICAgZm9yIChpPTE7IGk8NzsgaSsrKQotICAgIHsKLSAgICAgICAgY2hlY2tzdW0gXj0gKnBUZW1wICsrOwotICAgIH0KLSAgICAqcFRlbXArKyA9IGNoZWNrc3VtOworCW1lbXNldCgmaGRyLCAwLCBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKTsKKworCWhkci5sZW5ndGggPSBudG9ocyhjb3VudCk7CisJaGRyLnNvdXJjZSA9IDB4MTA7CisJaGRyLmRlc3RpbmF0aW9uID0gMHgyMDsKKwloZHIucG9ydGRlc3QgPSAweDIwOworCWhkci5wb3J0c3JjID0gMHgxMDsKKwloZHIuc2hfc3RyX2lkID0gMHg5MTsKKwloZHIuY29udHJvbCA9IDB4MDA7CisKKwloZHIuY2hlY2tzdW0gPSBoZHIubGVuZ3RoIF4gaGRyLnNvdXJjZSBeIGhkci5kZXN0aW5hdGlvbiBeCisJCQloZHIucG9ydGRlc3QgXiBoZHIucG9ydHNyYyBeIGhkci5zaF9zdHJfaWQgXgorCQkJaGRyLmNvbnRyb2w7CisKKwltZW1jcHkoJnBGdDEwMDBEZXYtPnR4X2J1ZlswXSwgJmhkciwgc2l6ZW9mKGhkcikpOwogCW1lbWNweSgmKHBGdDEwMDBEZXYtPnR4X2J1ZltzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpXSksIHBhY2tldCwgbGVuKTsKIAogICAgIG5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKQEAgLTEyODMsMjUgKzEwNjgsMTggQEAKICAgICB9Ki8KIAogCi0gICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIocEZ0MTAwMERldi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKLSAgICBpZihyZXQpCi0gICAgeworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBGdDEwMDBEZXYtPnR4X3VyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkgewogCQlERUJVRygiZnQxMDAwIGZhaWxlZCB0eF91cmIgJWRcbiIsIHJldCk7Ci0KLQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vREVCVUcoImZ0MTAwMCBzdWNlc3MgdHhfdXJiICVkXG4iLCByZXQpOwotCi0gICAgICAgIHBJbmZvLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgIHBJbmZvLT5zdGF0cy50eF9ieXRlcyArPSAobGVuKzE0KTsKLSAgICB9CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcEluZm8tPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcEluZm8tPnN0YXRzLnR4X2J5dGVzICs9IChsZW4rMTQpOworCX0KIAogICAgIC8vREVCVUcoImZ0MTAwMF9jb3B5X2Rvd25fcGt0KCkgZXhpdFxuIik7CiAKLSAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzMxLDE0ICsxMTA5LDEzIEBACiAgICAgaWYgKCBza2IgPT0gTlVMTCApCiAgICAgewogICAgICAgICBERUJVRyAoImZ0MTAwMF9odzogZnQxMDAwX3N0YXJ0X3htaXQ6c2tiID09IE5VTEwhISFcbiIgKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiBORVRERVZfVFhfT0s7CiAgICAgfQogCiAgICAgaWYgKCBwRnQxMDAwRGV2LT5zdGF0dXMgJiBGVDEwMDBfU1RBVFVTX0NMT1NJTkcpCiAgICAgewogICAgICAgICBERUJVRygibmV0d29yayBkcml2ZXIgaXMgY2xvc2VkLCByZXR1cm5cbiIpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlnb3RvIGVycjsKICAgICB9CiAKICAgICAvL0RFQlVHKCJmdDEwMDBfc3RhcnRfeG1pdCAxOmxlbmd0aCBvZiBwYWNrZXQgPSAlZFxuIiwgc2tiLT5sZW4pOwpAQCAtMTM1NywyOCArMTEzNCwyNCBAQAogICAgIHsKICAgICAgICAgLyogRHJvcCBwYWNrZXQgaXMgbWVkaWFzdGF0ZSBpcyBkb3duICovCiAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6ZnQxMDAwX3N0YXJ0X3htaXQ6bWVkaWFzdGF0ZSBpcyBkb3duXG4iKTsKLSAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOwotICAgICAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJZ290byBlcnI7CiAgICAgfQogCiAgICAgaWYgKCAoc2tiLT5sZW4gPCBFTkVUX0hFQURFUl9TSVpFKSB8fCAoc2tiLT5sZW4gPiBFTkVUX01BWF9TSVpFKSApCiAgICAgewogICAgICAgICAvKiBEcm9wIHBhY2tldCB3aGljaCBoYXMgaW52YWxpZCBzaXplICovCiAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6ZnQxMDAwX3N0YXJ0X3htaXQ6aW52YWxpZCBldGhlcm5ldCBsZW5ndGhcbiIpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlnb3RvIGVycjsKICAgICB9CiAvL21iZWxpYW4KLSAgICBpZihmdDEwMDBfY29weV9kb3duX3BrdCAoZGV2LCAocGRhdGErRU5FVF9IRUFERVJfU0laRS0yKSwgc2tiLT5sZW4gLSBFTkVUX0hFQURFUl9TSVpFICsgMikgPT0gU1RBVFVTX0ZBSUxVUkUpCi0JewotICAgIAlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLQl9CisJZnQxMDAwX2NvcHlfZG93bl9wa3QoZGV2LCAocGRhdGErRU5FVF9IRUFERVJfU0laRS0yKSwKKwkJCQlza2ItPmxlbiAtIEVORVRfSEVBREVSX1NJWkUgKyAyKTsKIAotICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKK2VycjoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAgICAgLy9ERUJVRygiIGZ0MTAwMF9zdGFydF94bWl0KCkgZXhpdFxuIik7CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQyNCw3ICsxMTk3LDcgQEAKICAgICAvL0RFQlVHKCJmdDEwMDBfY29weV91cF9wa3Q6IHRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg9JWQsIGFjdHVhbF9idWZmZXJfbGVuPSVkXG4iLAogICAgICAgLy8gICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCi0gICAgY2hrc3VtID0gKFBVU0hPUlQpZnQxMDAwZGV2LT5yeF9idWY7CisgICAgY2hrc3VtID0gKHUxNiAqKWZ0MTAwMGRldi0+cnhfYnVmOwogCiAgICAgdGVtcHdvcmQgPSAqY2hrc3VtKys7CiAgICAgZm9yIChpPTE7IGk8NzsgaSsrKQpAQCAtMTUyMSw3ICsxMjk0LDcgQEAKICAgICB7CiAgICAgICAgIERFQlVHKCJuZXR3b3JrIGRyaXZlciBpcyBjbG9zZWQsIHJldHVyblxuIik7CiAgICAgICAgIC8vdXNiX2tpbGxfdXJiKHBGdDEwMDBEZXYtPnJ4X3VyYik7IC8vbWJlbGlhbgotICAgICAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCiAgICAgdXNiX2ZpbGxfYnVsa191cmIocEZ0MTAwMERldi0+cnhfdXJiLApAQCAtMTUzNiwxMiArMTMwOSwxMiBAQAogICAgIGlmKChyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwRnQxMDAwRGV2LT5yeF91cmIsIEdGUF9BVE9NSUMpKSkKICAgICB7CiAgICAgICAgIHByaW50aygiZnQxMDAwX3N1Ym1pdF9yeF91cmI6IHN1Ym1pdHRpbmcgcnhfdXJiICVkIGZhaWxlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLy9ERUJVRygiZnQxMDAwX3N1Ym1pdF9yeF91cmIgZXhpdDogcmVzdWx0PSVkXG4iLCByZXN1bHQpOwogCi0gICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCXJldHVybiAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU2MCw4ICsxMzMzLDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgaW50IGZ0MTAwMF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBJbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsgLy9tYmVsaWFuCisJaW50IHJldDsKIAogICAgIERFQlVHKCJmdDEwMDBfb3BlbiBpcyBjYWxsZWQgZm9yIGNhcmQgJWRcbiIsIHBJbmZvLT5DYXJkTnVtYmVyKTsKICAgICAvL0RFQlVHKCJmdDEwMDBfb3BlbjogZGV2LT5hZGRyPSV4LCBkZXYtPmFkZHJfbGVuPSVkXG4iLCBkZXYtPmFkZHIsIGRldi0+YWRkcl9sZW4pOwpAQCAtMTU3OSw4ICsxMzUzLDkgQEAKIAogICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsgLy9tYmVsaWFuCiAKLSAgICBmdDEwMDBfc3VibWl0X3J4X3VyYihwSW5mbyk7Ci0gICAgcmV0dXJuIDA7CisJcmV0ID0gZnQxMDAwX3N1Ym1pdF9yeF91cmIocEluZm8pOworCisJcmV0dXJuIHJldDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1OTksNyArMTM3NCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW50IGZ0MTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqcEluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICpwSW5mbyA9IG5ldGRldl9wcml2KG5ldCk7CiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiA9IHBJbmZvLT5wRnQxMDAwRGV2OwogCiAgICAgLy9ERUJVRyAoImZ0MTAwMF9jbG9zZTogbmV0ZGV2LT5yZWZjbnQ9JWRcbiIsIG5ldC0+cmVmY250KTsKQEAgLTE2MjIsNyArMTM5Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZnQxMDAwX25ldGRldl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcmV0dXJuICYoaW5mby0+c3RhdHMpOyAvL21iZWxpYW4KIH0KQEAgLTE2NDgsNyArMTQyMyw3IEBACiBzdGF0aWMgaW50IGZ0MTAwMF9jaGtjYXJkIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KSB7CiAgICAgdTE2IHRlbXB3b3JkOwogICAgIHUxNiBzdGF0dXM7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOwogCiAgICAgaWYgKGluZm8tPmZDb25kUmVzZXRQZW5kKQogICAgIHsKQEAgLTE2OTIsMTMgKzE0NjcsMTMgQEAKIC8vICAgICAgICAgID0gMSAoc3VjY2Vzc2Z1bCkKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIEJPT0xFQU4gZnQxMDAwX3JlY2VpdmVfY21kIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2LCB1MTYgKnBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpIHsKK3N0YXRpYyBib29sIGZ0MTAwMF9yZWNlaXZlX2NtZCAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldiwgdTE2ICpwYnVmZmVyLCBpbnQgbWF4c3osIHUxNiAqcG54dHBoKSB7CiAgICAgdTE2IHNpemUsIHJldDsKICAgICB1MTYgKnBwc2V1ZG9oZHI7CiAgICAgaW50IGk7CiAgICAgdTE2IHRlbXB3b3JkOwogCi0gICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfUEhfTEVOLCAoUFVDSEFSKSZzaXplLCBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKTsKKyAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19QSF9MRU4sICh1OCAqKSZzaXplLCBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKTsKICAgICBzaXplID0gbnRvaHMoc2l6ZSkgKyBQU0VVRE9TWjsKICAgICBpZiAoc2l6ZSA+IG1heHN6KSB7CiAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX3JlY2VpdmVfY21kOkludmFsaWQgY29tbWFuZCBsZW5ndGggPSAlZFxuIiwgc2l6ZSk7CkBAIC0xNzQ4LDE1ICsxNTIzLDE1IEBACiBzdGF0aWMgaW50IGZ0MTAwMF9kc3BfcHJvdih2b2lkICphcmcpCiB7CiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqKWFyZzsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldi0+bmV0KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CiAgICAgdTE2IHRlbXB3b3JkOwogICAgIHUxNiBsZW47CiAgICAgdTE2IGk9MDsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnB0cjsKIAlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7Ci0gICAgUFVTSE9SVCBwbXNnOworICAgIHUxNiAqcG1zZzsKICAgICB1MTYgc3RhdHVzOwotICAgIFVTSE9SVCBUZW1wU2hvcnRCdWYgWzI1Nl07CisgICAgdTE2IFRlbXBTaG9ydEJ1ZiBbMjU2XTsKIAogICAgIERFQlVHKCIqKiogRHNwUHJvdiBFbnRlcmVkXG4iKTsKIApAQCAtMTc5Miw3ICsxNTY3LDcgQEAKICAgICAgICAgICAgIGxlbiA9IGh0b25zKGxlbik7CiAgICAgICAgICAgICBsZW4gKz0gUFNFVURPU1o7CiAKLSAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVClwdHItPnBwcm92X2RhdGE7CisgICAgICAgICAgICBwbXNnID0gKHUxNiAqKXB0ci0+cHByb3ZfZGF0YTsKIAkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwbXNnOwogICAgICAgICAgICAgLy8gSW5zZXJ0IHNsb3cgcXVldWUgc2VxdWVuY2UgbnVtYmVyCiAgICAgICAgICAgICBwcHNldWRvX2hkci0+c2VxX251bSA9IGluZm8tPnNxdWVzZXFudW0rKzsKQEAgLTE4MDksNyArMTU4NCw3IEBACiAgICAgICAgICAgICBUZW1wU2hvcnRCdWZbMV0gPSBodG9ucyAobGVuKTsKICAgICAgICAgICAgIG1lbWNweSgmVGVtcFNob3J0QnVmWzJdLCBwcHNldWRvX2hkciwgbGVuKTsKIAotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKFBVQ0hBUikmVGVtcFNob3J0QnVmWzBdLCAodW5zaWduZWQgc2hvcnQpKGxlbisyKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZGV2LCAwLCAodTggKikmVGVtcFNob3J0QnVmWzBdLCAodW5zaWduZWQgc2hvcnQpKGxlbisyKSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGRldiwgRlQxMDAwX0RCX0RQUkFNX1RYLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAogICAgICAgICAgICAgbGlzdF9kZWwoJnB0ci0+bGlzdCk7CkBAIC0xODMxLDcgKzE2MDYsNyBAQAogCiAKIHN0YXRpYyBpbnQgZnQxMDAwX3Byb2NfZHJ2bXNnIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2LCB1MTYgc2l6ZSkgewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKICAgICB1MTYgbXNndHlwZTsKICAgICB1MTYgdGVtcHdvcmQ7CiAJc3RydWN0IG1lZGlhX21zZyAqcG1lZGlhbXNnOwpAQCAtMTgzOSw3ICsxNjE0LDcgQEAKIAlzdHJ1Y3QgZHJ2X21zZyAqcGRydm1zZzsKICAgICB1MTYgaTsKIAlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7Ci0gICAgUFVTSE9SVCBwbXNnOworICAgIHUxNiAqcG1zZzsKICAgICB1MTYgc3RhdHVzOwogICAgIHVuaW9uIHsKICAgICAgICAgdTggIGJ5dGVbMl07CkBAIC0xOTcxLDcgKzE3NDYsNyBAQAogICAgICAgICAgICAgICAgIHRlbXB3b3JkID0gbnRvaHMocGRydm1zZy0+bGVuZ3RoKTsKICAgICAgICAgICAgICAgICBpbmZvLT5EU1BJbmZvQmxrbGVuID0gdGVtcHdvcmQ7CiAgICAgICAgICAgICAgICAgaWYgKHRlbXB3b3JkIDwgKE1BWF9EU1BfU0VTU19SRUMtNCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVCkmcGRydm1zZy0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgcG1zZyA9ICh1MTYgKikmcGRydm1zZy0+ZGF0YVswXTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8KCh0ZW1wd29yZCsxKS8yKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRyaXZlcm1zZzpkc3AgaW5mbyBkYXRhID0gMHgleFxuIiwgKnBtc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+RFNQSW5mb0Jsa1tpKzEwXSA9ICpwbXNnKys7CkBAIC0yMDAzLDEwICsxNzc4LDEwIEBACiAKICAgICAgICAgICAgICAgICAvLyBQdXQgbWVzc2FnZSBpbnRvIFNsb3cgUXVldWUKICAgICAgICAgICAgICAgICAvLyBGb3JtIFBzZXVkbyBoZWFkZXIKLSAgICAgICAgICAgICAgICBwbXNnID0gKFBVU0hPUlQpaW5mby0+RFNQSW5mb0JsazsKKyAgICAgICAgICAgICAgICBwbXNnID0gKHUxNiAqKWluZm8tPkRTUEluZm9CbGs7CiAgICAgICAgICAgICAgICAgKnBtc2crKyA9IDA7CiAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKGluZm8tPkRTUEluZm9CbGtsZW4rMjAraW5mby0+RFNQSW5mb0Jsa2xlbik7Ci0JCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopKFBVU0hPUlQpJmluZm8tPkRTUEluZm9CbGtbMl07CisJCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopKHUxNiAqKSZpbmZvLT5EU1BJbmZvQmxrWzJdOwogICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5sZW5ndGggPSBodG9ucyhpbmZvLT5EU1BJbmZvQmxrbGVuKzQraW5mby0+RFNQSW5mb0Jsa2xlbik7CiAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPnNvdXJjZSA9IDB4MTA7CiAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPmRlc3RpbmF0aW9uID0gMHgyMDsKQEAgLTIwMjgsNyArMTgwMyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPkRTUEluZm9CbGtbMTBdID0gMHg3MjAwOwogICAgICAgICAgICAgICAgIGluZm8tPkRTUEluZm9CbGtbMTFdID0gaHRvbnMoaW5mby0+RFNQSW5mb0Jsa2xlbik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKFBVQ0hBUikmaW5mby0+RFNQSW5mb0Jsa1swXSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5EU1BJbmZvQmxrbGVuKzIyKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKHU4ICopJmluZm8tPkRTUEluZm9CbGtbMF0sICh1bnNpZ25lZCBzaG9ydCkoaW5mby0+RFNQSW5mb0Jsa2xlbisyMikpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCBGVDEwMDBfREJfRFBSQU1fVFgsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogICAgICAgICAgICAgICAgIGluZm8tPkRydk1zZ1BlbmQgPSAwOwogCkBAIC0yMDUzLDcgKzE4MjgsNyBAQAogICAgICAgICAgICAgICBpZiAoICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgLy8gUHV0IG1lc3NhZ2UgaW50byBTbG93IFF1ZXVlCiAgICAgICAgICAgICAgICAgICAvLyBGb3JtIFBzZXVkbyBoZWFkZXIKLSAgICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVCkmdGVtcGJ1ZmZlclswXTsKKyAgICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopJnRlbXBidWZmZXJbMF07CiAJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7CiAgICAgICAgICAgICAgICAgICBwcHNldWRvX2hkci0+bGVuZ3RoID0gaHRvbnMoMHgwMDEyKTsKICAgICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5zb3VyY2UgPSAweDEwOwpAQCAtMjA3NCw3ICsxODQ5LDcgQEAKICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPDc7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5jaGVja3N1bSBePSAqcG1zZysrOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgcG1zZyA9IChQVVNIT1JUKSZ0ZW1wYnVmZmVyWzE2XTsKKyAgICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopJnRlbXBidWZmZXJbMTZdOwogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKFJTUF9EUlZfRVJSX1JQVF9NU0cpOwogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKDB4MDAwZSk7CiAgICAgICAgICAgICAgICAgICAqcG1zZysrID0gaHRvbnMoaW5mby0+RFNQX1RJTUVbMF0pOwpAQCAtMjA4OSw3ICsxODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICpwbXNnKysgPSBjb252ZXJ0LndyZDsKICAgICAgICAgICAgICAgICAgICpwbXNnKysgPSBodG9ucyhpbmZvLT5EcnZFcnJOdW0pOwogCi0gICAgICAgICAgICAgICAgICBDYXJkU2VuZENvbW1hbmQgKGRldiwgKHVuc2lnbmVkIGNoYXIqKSZ0ZW1wYnVmZmVyWzBdLCAoVVNIT1JUKSgweDAwMTIgKyBQU0VVRE9TWikpOworICAgICAgICAgICAgICAgICAgQ2FyZFNlbmRDb21tYW5kIChkZXYsICh1bnNpZ25lZCBjaGFyKikmdGVtcGJ1ZmZlclswXSwgKHUxNikoMHgwMDEyICsgUFNFVURPU1opKTsKICAgICAgICAgICAgICAgICAgIGluZm8tPkRydkVyck51bSA9IDA7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaW5mby0+RHJ2TXNnUGVuZCA9IDA7CkBAIC0yMTE0LDE1ICsxODg5LDE1IEBACiBpbnQgZnQxMDAwX3BvbGwodm9pZCogZGV2X2lkKSB7CiAKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopZGV2X2lkOwotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKIAogICAgIHUxNiB0ZW1wd29yZDsKICAgICB1MTYgc3RhdHVzOwogICAgIHUxNiBzaXplOwogICAgIGludCBpOwotICAgIFVTSE9SVCBkYXRhOwotICAgIFVTSE9SVCBtb2R1bG87Ci0gICAgVVNIT1JUIHBvcnRpZDsKKyAgICB1MTYgZGF0YTsKKyAgICB1MTYgbW9kdWxvOworICAgIHUxNiBwb3J0aWQ7CiAgICAgdTE2IG54dHBoOwogCXN0cnVjdCBkcHJhbV9ibGsgKnBkcHJhbV9ibGs7CiAJc3RydWN0IHBzZXVkb19oZHIgKnBwc2V1ZG9faGRyOwpAQCAtMjE0MywxNCArMTkxOCwxNCBAQAogICAgICAgICBpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fUlgpIHsKICAgICAgICAgICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsOiBGVDEwMDBfUkVHX0RPT1JCRUxMIG1lc3NhZ2UgdHlwZTogIEZUMTAwMF9EQl9EUFJBTV9SWFxuIik7CiAKLSAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCAweDIwMCwgKFBVQ0hBUikmZGF0YSwgMCk7CisgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgMHgyMDAsICh1OCAqKSZkYXRhLCAwKTsKICAgICAgICAgICAgIC8vREVCVUcoImZ0MTAwMF9wb2xsOkZUMTAwMF9EQl9EUFJBTV9SWDpmdDEwMDBfcmVhZF9kcHJhbTE2OnNpemUgPSAweCV4XG4iLCBkYXRhKTsKICAgICAgICAgICAgIHNpemUgPSBudG9ocyhkYXRhKSArIDE2ICsgMjsgLy93YWkKICAgICAgICAgICAgIGlmIChzaXplICUgNCkgewogICAgICAgICAgICAgICAgIG1vZHVsbyA9IDQgLSAoc2l6ZSAlIDQpOwogICAgICAgICAgICAgICAgIHNpemUgPSBzaXplICsgbW9kdWxvOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIDB4MjAxLCAoUFVDSEFSKSZwb3J0aWQsIDEpOworICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIDB4MjAxLCAodTggKikmcG9ydGlkLCAxKTsKICAgICAgICAgICAgIHBvcnRpZCAmPSAweGZmOwogICAgICAgICAgICAgLy9ERUJVRygiZnQxMDAwX3BvbGw6IEZUMTAwMF9SRUdfRE9PUkJFTEwgbWVzc2FnZSB0eXBlOiBGVDEwMDBfREJfRFBSQU1fUlggOiBwb3J0aWQgMHgleFxuIiwgcG9ydGlkKTsKIApAQCAtMjI4NSw3ICsyMDYwLDcgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCBGVDEwMDBfQVNJQ19SRVNFVF9SRVEsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChkZXYsIEhPU1RfSU5URl9CRSwgRlQxMDAwX1JFR19TVVBfQ1RSTCk7CiAgICAgICAgICAgICAvLyBjb3B5IGRzcCBzZXNzaW9uIHJlY29yZCBmcm9tIEFkYXB0ZXIgYmxvY2sKLSAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChkZXYsIDAsIChQVUNIQVIpJmluZm8tPkRTUFNlc3MuUmVjWzBdLCAxMDI0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChkZXYsIDAsICh1OCAqKSZpbmZvLT5EU1BTZXNzLlJlY1swXSwgMTAyNCk7CiAgICAgICAgICAgICAvLyBQcm9ncmFtIFdNQVJLIHJlZ2lzdGVyCiAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGRldiwgMHg2MDAsIEZUMTAwMF9SRUdfTUFHX1dBVEVSTUFSSyk7CiAgICAgICAgICAgICAvLyByaW5nIGRvb3JiZWxsIHRvIHRlbGwgRFNQIHRoYXQgQVNJQyBpcyBvdXQgb2YgcmVzZXQKQEAgLTIyOTksMTAgKzIwNzQsMTAgQEAKICAgICAgICAgICAgIGlmIChpbmZvLT5mQXBwTXNnUGVuZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBBU0lDIGFuZCBEU1AKIAotICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjAsIChQVUNIQVIpJihpbmZvLT5EU1BfVElNRVswXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIxLCAoUFVDSEFSKSYoaW5mby0+RFNQX1RJTUVbMV0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwgKFBVQ0hBUikmKGluZm8tPkRTUF9USU1FWzJdKSwgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjMsIChQVUNIQVIpJihpbmZvLT5EU1BfVElNRVszXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIwLCAodTggKikmKGluZm8tPkRTUF9USU1FWzBdKSwgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOworICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjEsICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbMV0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7CisgICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwgKHU4ICopJihpbmZvLT5EU1BfVElNRVsyXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIzLCAodTggKikmKGluZm8tPkRTUF9USU1FWzNdKSwgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwogICAgICAgICAgICAgICAgIGluZm8tPkNhcmRSZWFkeSA9IDA7CiAgICAgICAgICAgICAgICAgaW5mby0+RHJ2RXJyTnVtID0gRFNQX0NPTkRSRVNFVF9JTkZPOwogICAgICAgICAgICAgICAgIERFQlVHKCJmdDEwMDBfaHc6RFNQIGNvbmRpdGlvbmFsIHJlc2V0IHJlcXVlc3RlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmgKaW5kZXggYzU4MDc0MS4uYWI5MzEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuaApAQCAtNCw3ICs0LDcgQEAKIAogI2luY2x1ZGUgImZ0MTAwMF91c2IuaCIKIAotZXh0ZXJuIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBQVVNIT1JUIERhdGEsIHU4IG5SZWdJbmR4KTsKLWV4dGVybiB1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFVTSE9SVCB2YWx1ZSwgdTggblJlZ0luZHgpOworZXh0ZXJuIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1MTYgKkRhdGEsIHU4IG5SZWdJbmR4KTsKK2V4dGVybiB1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTggblJlZ0luZHgpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKaW5kZXggMzZjZGQ1OC4uYjg3NTQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMKQEAgLTEsMyArMSwyNCBAQAorLyoKKyAqIGZ0MTAwMF9wcm9jLmMgLSBmdDEwMDAgcHJvYyBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQJKEMpIDIwMDktMjAxMCBRdWludGVjCisgKgkJKEMpIDIwMTAgT3Blbi1uYW5kcmEKKyAqICAgICAgPG1hcmVrLmJlbGlza29Ab3Blbi1uYW5kcmEuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtMTQsMjE5ICszNSwyMTcgQEAKIAogI2RlZmluZSBQVVRYX1RPX1BBR0UobGVuLHBhZ2UsbWVzc2FnZSxzaXplLHZhcikgXAogCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCBtZXNzYWdlKTsgXAotCWZvcihpID0gMDsgaSA8IChzaXplIC0gMSk7IGkrKykgXAotCXsgXAorCWZvciAoaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspIHtcCiAJCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJTAyeDoiLCB2YXJbaV0pOyBcCiAJfSBcCiAJbGVuICs9IHNucHJpbnRmKHBhZ2UrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlMDJ4XG4iLCB2YXJbaV0pCiAKICNkZWZpbmUgUFVURF9UT19QQUdFKGxlbixwYWdlLG1lc3NhZ2Usc2l6ZSx2YXIpIFwKIAlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgbWVzc2FnZSk7IFwKLQlmb3IoaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspIFwKLQl7IFwKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKSB7XAogCQlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiVkLiIsIHZhcltpXSk7IFwKIAl9IFwKIAlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiVkXG4iLCB2YXJbaV0pCiAKIAotCi0KLS8vI2lmZGVmIElOSVRfTkVUX05TCiAjZGVmaW5lIEZUTkVUX1BST0MgaW5pdF9uZXQucHJvY19uZXQKLS8vI2Vsc2UKLS8vI2RlZmluZSBGVE5FVF9QUk9DIHByb2NfbmV0Ci0vLyNlbmRpZgogCiAKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTE2IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwKLQkJCSBQVUNIQVIgYnVmZmVyLCB1OCBoaWdobG93KTsKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTE2IChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwKKwkJCSB1OCAqYnVmZmVyLCB1OCBoaWdobG93KTsKIAogCiBzdGF0aWMgaW50Ci1mdDEwMDBSZWFkUHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsCitmdDEwMDBSZWFkUHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKIAkJdm9pZCAqZGF0YSkKIHsKLSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgaW50IGxlbjsKLSAgaW50IGk7Ci0gIHVuc2lnbmVkIHNob3J0IGxlZFN0YXQ7Ci0gIHVuc2lnbmVkIHNob3J0IGNvblN0YXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgbGVuOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IGxlZFN0YXQ7CisJdW5zaWduZWQgc2hvcnQgY29uU3RhdDsKIAogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKIAotICBjaGFyICpzdGF0dXNbXSA9IHsgIklkbGUgKERpc2Nvbm5lY3QpIiwgIlNlYXJjaGluZyIsICJBY3RpdmUgKENvbm5lY3RlZCkiLAotICAgICJXYWl0aW5nIGZvciBMMiIsICJTbGVlcCIsICJObyBDb3ZlcmFnZSIsICIiLCAiIgotICB9OworCWNoYXIgKnN0YXR1c1tdID0geyAKKwkJIklkbGUgKERpc2Nvbm5lY3QpIiwgCisJCSJTZWFyY2hpbmciLAorCQkiQWN0aXZlIChDb25uZWN0ZWQpIiwKKwkJIldhaXRpbmcgZm9yIEwyIiwKKwkJIlNsZWVwIiwKKwkJIk5vIENvdmVyYWdlIiwKKwkJIiIsCisJCSIiLAorCX07CiAKLSAgY2hhciAqc2lnbmFsW10gPSB7ICIiLCAiKiIsICIqKiIsICIqKioiLCAiKioqKiIgfTsKLSAgaW50IHN0cmVuZ3RoOwotICBpbnQgcXVhbGl0eTsKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gIHRpbWVfdCBkZWx0YTsKKwljaGFyICpzaWduYWxbXSA9IHsgIiIsICIqIiwgIioqIiwgIioqKiIsICIqKioqIiB9OworCWludCBzdHJlbmd0aDsKKwlpbnQgcXVhbGl0eTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl0aW1lX3QgZGVsdGE7CiAKLSAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7Ci0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotICBpZiAob2ZmID4gMCkKLSAgICB7Ci0gICAgICAqZW9mID0gMTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKwlpZiAob2ZmID4gMCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQogCiAKLSAgaWYgKGluZm8tPlByb2dDb25TdGF0ICE9IDB4RkYpCi0gICAgewotICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNiAoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfTEVELAotCQkJICAgKFBVQ0hBUikgJiBsZWRTdGF0LCBGVDEwMDBfTUFHX0RTUF9MRURfSU5EWCk7Ci0gICAgICBpbmZvLT5MZWRTdGF0ID0gbnRvaHMgKGxlZFN0YXQpOworCWlmIChpbmZvLT5Qcm9nQ29uU3RhdCAhPSAweEZGKSB7CisJCWZ0MTAwMF9yZWFkX2RwcmFtMTYoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfTEVELAorCQkJICAgKHU4ICopJmxlZFN0YXQsIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYKTsKKwkJaW5mby0+TGVkU3RhdCA9IG50b2hzKGxlZFN0YXQpOwogCi0gICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2IChpbmZvLT5wRnQxMDAwRGV2LCBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEUsCi0JCQkgICAoUFVDSEFSKSAmIGNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKLSAgICAgIGluZm8tPkNvblN0YXQgPSBudG9ocyAoY29uU3RhdCk7Ci0gICAgICBkb19nZXR0aW1lb2ZkYXkgKCZ0dik7Ci0gICAgICBkZWx0YSA9ICh0di50dl9zZWMgLSBpbmZvLT5Db25UbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5mby0+Q29uU3RhdCA9IDB4ZjsKLSAgICAgIGRlbHRhID0gMDsKLSAgICB9CisJCWZ0MTAwMF9yZWFkX2RwcmFtMTYoaW5mby0+cEZ0MTAwMERldiwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFLAorCQkJKHU4ICopJmNvblN0YXQsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURV9JTkRYKTsKKwkJaW5mby0+Q29uU3RhdCA9IG50b2hzKGNvblN0YXQpOworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJZGVsdGEgPSAodHYudHZfc2VjIC0gaW5mby0+Q29uVG0pOworCX0gZWxzZSB7CisJCWluZm8tPkNvblN0YXQgPSAweGY7CisJCWRlbHRhID0gMDsKKwl9CiAKKwlpID0gKGluZm8tPkxlZFN0YXQpICYgMHhmOworCXN3aXRjaCAoaSkgeworCWNhc2UgMHgxOgorCQlzdHJlbmd0aCA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgzOgorCQlzdHJlbmd0aCA9IDI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlzdHJlbmd0aCA9IDM7CisJCWJyZWFrOworCWNhc2UgMHhmOgorCQlzdHJlbmd0aCA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0cmVuZ3RoID0gMDsKKwl9CiAKKwlpID0gKGluZm8tPkxlZFN0YXQgPj4gOCkgJiAweGY7CisJc3dpdGNoIChpKSB7CisJY2FzZSAweDE6CisJCXF1YWxpdHkgPSAxOworCQlicmVhazsKKwljYXNlIDB4MzoKKwkJcXVhbGl0eSA9IDI7CisJCWJyZWFrOworCWNhc2UgMHg3OgorCQlxdWFsaXR5ID0gMzsKKwkJYnJlYWs7CisJY2FzZSAweGY6CisJCXF1YWxpdHkgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlxdWFsaXR5ID0gMDsKKwl9CiAKLSAgaSA9IChpbmZvLT5MZWRTdGF0KSAmIDB4ZjsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDB4MToKLSAgICAgIHN0cmVuZ3RoID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgzOgotICAgICAgc3RyZW5ndGggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDc6Ci0gICAgICBzdHJlbmd0aCA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZjoKLSAgICAgIHN0cmVuZ3RoID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzdHJlbmd0aCA9IDA7Ci0gICAgfQorCWxlbiA9IDA7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gVGltZTogJTAybGQ6JTAybGQ6JTAybGRcbiIsCisgICAgICAJCSgoZGVsdGEgLyAzNjAwKSAlIDI0KSwgKChkZWx0YSAvIDYwKSAlIDYwKSwgKGRlbHRhICUgNjApKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBUaW1lW3NdOiAlbGRcbiIsIGRlbHRhKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiQXNpYyBJRDogJXNcbiIsCisgICAgICAJKGluZm8tPkFzaWNJRCkgPT0KKyAgICAgIAlFTEVDVFJBQlVaWl9JRCA/ICJFTEVDVFJBQlVaWiBBU0lDIiA6ICJNQUdORU1JVEUgQVNJQyIpOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJTS1U6ICIsIFNLVVNaLCBpbmZvLT5Ta3UpOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJFVUk2NDogIiwgRVVJU1osIGluZm8tPmV1aTY0KTsKKwlQVVREX1RPX1BBR0UobGVuLCBwYWdlLCAiRFNQIHZlcnNpb24gbnVtYmVyOiAiLCBEU1BWRVJTWiwgaW5mby0+RHNwVmVyKTsKKwlQVVRYX1RPX1BBR0UobGVuLCBwYWdlLCAiSGFyZHdhcmUgU2VyaWFsIE51bWJlcjogIiwgSFdTRVJOVU1TWiwKKyAgICAgIAkJaW5mby0+SHdTZXJOdW0pOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJDYWxpYmVyYXRpb24gVmVyc2lvbjogIiwgQ0FMVkVSU1osCisgICAgICAJCWluZm8tPlJmQ2FsVmVyKTsKKwlQVVREX1RPX1BBR0UobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIERhdGU6ICIsIENBTERBVEVTWiwKKwkJaW5mby0+UmZDYWxEYXRlKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiTWVkaWEgU3RhdGU6ICVzXG4iLAorICAgICAgCQkoaW5mby0+bWVkaWFzdGF0ZSkgPyAibGluayIgOiAibm8gbGluayIpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFN0YXR1czogJXNcbiIsCisgICAgICAJCXN0YXR1c1soKGluZm8tPkNvblN0YXQpICYgMHg3KV0pOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJSWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnJ4X3BhY2tldHMpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJUWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X3BhY2tldHMpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJSWCBieXRlczogJWxkXG4iLCBpbmZvLT5zdGF0cy5yeF9ieXRlcyk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlRYIGJ5dGVzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X2J5dGVzKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiU2lnbmFsIFN0cmVuZ3RoOiAlc1xuIiwgc2lnbmFsW3N0cmVuZ3RoXSk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlNpZ25hbCBRdWFsaXR5OiAlc1xuIiwgc2lnbmFsW3F1YWxpdHldKTsKIAotICBpID0gKGluZm8tPkxlZFN0YXQgPj4gOCkgJiAweGY7Ci0gIHN3aXRjaCAoaSkKLSAgICB7Ci0gICAgY2FzZSAweDE6Ci0gICAgICBxdWFsaXR5ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgzOgotICAgICAgcXVhbGl0eSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzoKLSAgICAgIHF1YWxpdHkgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGY6Ci0gICAgICBxdWFsaXR5ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBxdWFsaXR5ID0gMDsKLSAgICB9Ci0KLQotICBsZW4gPSAwOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gVGltZTogJTAybGQ6JTAybGQ6JTAybGRcbiIsCi0JCSgoZGVsdGEgLyAzNjAwKSAlIDI0KSwgKChkZWx0YSAvIDYwKSAlIDYwKSwgKGRlbHRhICUgNjApKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFRpbWVbc106ICVsZFxuIiwgZGVsdGEpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkFzaWMgSUQ6ICVzXG4iLAotCQkoaW5mby0+QXNpY0lEKSA9PQotCQlFTEVDVFJBQlVaWl9JRCA/ICJFTEVDVFJBQlVaWiBBU0lDIiA6ICJNQUdORU1JVEUgQVNJQyIpOwotICBQVVRYX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlNLVTogIiwgU0tVU1osIGluZm8tPlNrdSk7Ci0gIFBVVFhfVE9fUEFHRSAobGVuLCBwYWdlLCAiRVVJNjQ6ICIsIEVVSVNaLCBpbmZvLT5ldWk2NCk7Ci0gIFBVVERfVE9fUEFHRSAobGVuLCBwYWdlLCAiRFNQIHZlcnNpb24gbnVtYmVyOiAiLCBEU1BWRVJTWiwgaW5mby0+RHNwVmVyKTsKLSAgUFVUWF9UT19QQUdFIChsZW4sIHBhZ2UsICJIYXJkd2FyZSBTZXJpYWwgTnVtYmVyOiAiLCBIV1NFUk5VTVNaLAotCQlpbmZvLT5Id1Nlck51bSk7Ci0gIFBVVFhfVE9fUEFHRSAobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIFZlcnNpb246ICIsIENBTFZFUlNaLAotCQlpbmZvLT5SZkNhbFZlcik7Ci0gIFBVVERfVE9fUEFHRSAobGVuLCBwYWdlLCAiQ2FsaWJlcmF0aW9uIERhdGU6ICIsIENBTERBVEVTWiwgaW5mby0+UmZDYWxEYXRlKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJNZWRpYSBTdGF0ZTogJXNcbiIsCi0JCShpbmZvLT5tZWRpYXN0YXRlKSA/ICJsaW5rIiA6ICJubyBsaW5rIik7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBTdGF0dXM6ICVzXG4iLAotCQlzdGF0dXNbKChpbmZvLT5Db25TdGF0KSAmIDB4NyldKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJSWCBwYWNrZXRzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnJ4X3BhY2tldHMpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlRYIHBhY2tldHM6ICVsZFxuIiwgaW5mby0+c3RhdHMudHhfcGFja2V0cyk7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiUlggYnl0ZXM6ICVsZFxuIiwgaW5mby0+c3RhdHMucnhfYnl0ZXMpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlRYIGJ5dGVzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnR4X2J5dGVzKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJTaWduYWwgU3RyZW5ndGg6ICVzXG4iLCBzaWduYWxbc3RyZW5ndGhdKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJTaWduYWwgUXVhbGl0eTogJXNcbiIsIHNpZ25hbFtxdWFsaXR5XSk7Ci0KLQotCi0KLSAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgaW50Ci1mdDEwMDBOb3RpZnlQcm9jIChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK2Z0MTAwME5vdGlmeVByb2Moc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7Ci0gIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87Ci0gIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZnQxMDAwX3Byb2NfZmlsZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmZ0MTAwMF9wcm9jX2ZpbGU7CiAKLWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJcmVtb3ZlX3Byb2NfZW50cnkoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKKwkJZnQxMDAwX3Byb2NfZmlsZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoZGV2LT5uYW1lLCAwNjQ0LAorCQkJCQlpbmZvLT5mdDEwMDBfcHJvY19kaXIsCisJCQkJCWZ0MTAwMFJlYWRQcm9jLCBkZXYpOworCQlzbnByaW50ZihpbmZvLT5uZXRkZXZuYW1lLCBJRk5BTVNJWiwgIiVzIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJfQogCi0gIHN3aXRjaCAoZXZlbnQpCi0gICAgewotICAgIGNhc2UgTkVUREVWX0NIQU5HRU5BTUU6Ci0gICAgICByZW1vdmVfcHJvY19lbnRyeSAoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKLSAgICAgIGZ0MTAwMF9wcm9jX2ZpbGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChkZXYtPm5hbWUsIDA2NDQsCi0JCQkJCQkgaW5mby0+ZnQxMDAwX3Byb2NfZGlyLAotCQkJCQkJIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwotICAgICAgc25wcmludGYgKGluZm8tPm5ldGRldm5hbWUsIElGTkFNU0laLCAiJXMiLCBkZXYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gTk9USUZZX0RPTkU7CisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZ0MTAwMF9uZXRkZXZfbm90aWZpZXIgPSB7Ci0gIC5ub3RpZmllcl9jYWxsID0gZnQxMDAwTm90aWZ5UHJvYworCS5ub3RpZmllcl9jYWxsID0gZnQxMDAwTm90aWZ5UHJvYywKIH07CiAKIAotdm9pZAotZnQxMDAwSW5pdFByb2MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitpbnQgZnQxMDAwX2luaXRfcHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKLSAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmdDEwMDBfcHJvY19maWxlOwotCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmdDEwMDBfcHJvY19maWxlOworCWludCByZXQgPSAwOwogCisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKLSAgaW5mby0+ZnQxMDAwX3Byb2NfZGlyID0gcHJvY19ta2RpciAoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKLSAgaWYgKGluZm8tPmZ0MTAwMF9wcm9jX2RpciA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlbW92ZV9wcm9jX2VudHJ5IChGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOwotICAgIH0KKwlpbmZvLT5mdDEwMDBfcHJvY19kaXIgPSBwcm9jX21rZGlyKEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7CisJaWYgKGluZm8tPmZ0MTAwMF9wcm9jX2RpciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgJXMgZGlyLlxuIiwKKwkJCUZUMTAwMF9QUk9DX0RJUik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CiAKKwlmdDEwMDBfcHJvY19maWxlID0KKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShkZXYtPm5hbWUsIDA2NDQsCisJCQlpbmZvLT5mdDEwMDBfcHJvY19kaXIsIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwogCi0gIGZ0MTAwMF9wcm9jX2ZpbGUgPQotICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKGRldi0+bmFtZSwgMDY0NCwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyLAotCQkJICAgIGZ0MTAwMFJlYWRQcm9jLCBkZXYpOwotICBpZiAoZnQxMDAwX3Byb2NfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHJlbW92ZV9wcm9jX2VudHJ5IChpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOwotICAgIH0KKwlpZiAoZnQxMDAwX3Byb2NfZmlsZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBjcmVhdGUgL3Byb2MgZW50cnkuXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsX2VudHJ5OworCX0KIAotICBzbnByaW50ZiAoaW5mby0+bmV0ZGV2bmFtZSwgSUZOQU1TSVosICIlcyIsIGRldi0+bmFtZSk7Ci0gIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllciAoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOwotICByZXR1cm47CisJc25wcmludGYoaW5mby0+bmV0ZGV2bmFtZSwgSUZOQU1TSVosICIlcyIsIGRldi0+bmFtZSk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9ub3RpZjsKKworCXJldHVybiAwOworCitmYWlsX25vdGlmOgorCXJlbW92ZV9wcm9jX2VudHJ5KGluZm8tPm5ldGRldm5hbWUsIGluZm8tPmZ0MTAwMF9wcm9jX2Rpcik7CitmYWlsX2VudHJ5OgorCXJlbW92ZV9wcm9jX2VudHJ5KEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7CitmYWlsOgorCXJldHVybiByZXQ7CiB9CiAKLXZvaWQKLWZ0MTAwMENsZWFudXBQcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbykKK3ZvaWQgZnQxMDAwX2NsZWFudXBfcHJvYyhzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8pCiB7Ci0gIHJlbW92ZV9wcm9jX2VudHJ5IChpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOwotICByZW1vdmVfcHJvY19lbnRyeSAoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKLSAgdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIgKCZmdDEwMDBfbmV0ZGV2X25vdGlmaWVyKTsKLQotICByZXR1cm47CisJcmVtb3ZlX3Byb2NfZW50cnkoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmdDEwMDBfbmV0ZGV2X25vdGlmaWVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jCmluZGV4IDI4ZjU1YjIuLjc5NDgyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYwpAQCAtMzYsNyArMzYsNyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwogCi1zdGF0aWMgQk9PTEVBTiBnUG9sbGluZ2ZhaWxlZCA9IEZBTFNFOworc3RhdGljIGJvb2wgZ1BvbGxpbmdmYWlsZWQgPSBGQUxTRTsKIGludCBmdDEwMDBfcG9sbF90aHJlYWQodm9pZCAqYXJnKQogewogCWludCByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKQEAgLTY0LDcgKzY0LDcgQEAKIAlpbnQgaSwgcmV0ID0gMCwgc2l6ZTsKIAogCXN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXY7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbzsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmRzcF9mdzsKIAogCWZ0MTAwMGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdDEwMDBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CkBAIC04NCw3ICs4NCw2IEBACiAJZnQxMDAwZGV2LT5kZXYgPSBkZXY7CiAJZnQxMDAwZGV2LT5zdGF0dXMgPSAwOwogCWZ0MTAwMGRldi0+bmV0ID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7CiAJZnQxMDAwZGV2LT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCWZ0MTAwMGRldi0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIApAQCAtMTY0LDcgKzE2Myw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfbG9hZDsKIAotCXBmdDEwMDBpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CisJcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKIAlERUJVRygiSW4gcHJvYmU6IHBmdDEwMDBpbmZvPSVwXG4iLCBwZnQxMDAwaW5mbyk7CiAJcmV0ID0gZHNwX3JlbG9hZChmdDEwMDBkZXYpOwpAQCAtMTc2LDE0ICsxNzUsMTggQEAKIAlnUG9sbGluZ2ZhaWxlZCA9IEZBTFNFOwogCXBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCA9CiAJICAgIGt0aHJlYWRfcnVuKGZ0MTAwMF9wb2xsX3RocmVhZCwgZnQxMDAwZGV2LCAiZnQxMDAwX3BvbGwiKTsKKworCWlmIChJU19FUlIocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKHBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCk7CisJCWdvdG8gZXJyX2xvYWQ7CisJfQorCiAJbXNsZWVwKDUwMCk7CiAKIAl3aGlsZSAoIXBmdDEwMDBpbmZvLT5DYXJkUmVhZHkpIHsKIAkJaWYgKGdQb2xsaW5nZmFpbGVkKSB7Ci0JCQlpZiAocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKQotCQkJCWt0aHJlYWRfc3RvcChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpOwogCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyX2xvYWQ7CisJCQlnb3RvIGVycl90aHJlYWQ7CiAJCX0KIAkJbXNsZWVwKDEwMCk7CiAJCURFQlVHKCJmdDEwMDBfcHJvYmU6OldhaXRpbmcgZm9yIENhcmQgUmVhZHlcbiIpOwpAQCAtMTkzLDE0ICsxOTYsMjEgQEAKIAogCXJldCA9IHJlZ19mdDEwMDBfbmV0ZGV2KGZ0MTAwMGRldiwgaW50ZXJmYWNlKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9sb2FkOworCQlnb3RvIGVycl90aHJlYWQ7CisKKwlyZXQgPSBmdDEwMDBfaW5pdF9wcm9jKGZ0MTAwMGRldi0+bmV0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wcm9jOwogCiAJcGZ0MTAwMGluZm8tPk5ldERldlJlZ0RvbmUgPSAxOwogCi0JZnQxMDAwSW5pdFByb2MoZnQxMDAwZGV2LT5uZXQpOwotCiAJcmV0dXJuIDA7CiAKK2Vycl9wcm9jOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGZ0MTAwMGRldi0+bmV0KTsKKwlmcmVlX25ldGRldihmdDEwMDBkZXYtPm5ldCk7CitlcnJfdGhyZWFkOgorCWt0aHJlYWRfc3RvcChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpOwogZXJyX2xvYWQ6CiAJa2ZyZWUocEZpbGVTdGFydCk7CiBlcnJfZnc6CkBAIC0yMTgsNyArMjI4LDcgQEAKIAlERUJVRygiSW4gZGlzY29ubmVjdCBwZnQxMDAwaW5mbz0lcFxuIiwgcGZ0MTAwMGluZm8pOwogCiAJaWYgKHBmdDEwMDBpbmZvKSB7Ci0JCWZ0MTAwMENsZWFudXBQcm9jKHBmdDEwMDBpbmZvKTsKKwkJZnQxMDAwX2NsZWFudXBfcHJvYyhwZnQxMDAwaW5mbyk7CiAJCWlmIChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpCiAJCQlrdGhyZWFkX3N0b3AocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKTsKIApAQCAtMjI2LDcgKzIzNiw3IEBACiAKIAkJaWYgKHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpIHsKIAkJCURFQlVHKCJmdDEwMDBfZGlzY29ubmVjdDogZGVzdHJveSBjaGFyIGRyaXZlclxuIik7Ci0JCQlmdDEwMDBfRGVzdHJveURldmljZShwZnQxMDAwaW5mby0+cEZ0MTAwMERldi0+bmV0KTsKKwkJCWZ0MTAwMF9kZXN0cm95X2RldihwZnQxMDAwaW5mby0+cEZ0MTAwMERldi0+bmV0KTsKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2KHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpOwogCQkJREVCVUcKIAkJCSAgICAoImZ0MTAwMF9kaXNjb25uZWN0OiBuZXR3b3JrIGRldmljZSB1bnJlZ2lzdGVyZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuaAppbmRleCBhOWQ0MTlhLi5hMTQzZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmgKQEAgLTk4LDE2ICs5OCw2IEBACiAvKmVuZCBvZiBKaW0qLwogI2RlZmluZSBERUJVRyhhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIGFyZ3MpCiAKLSNkZWZpbmUgVUNIQVIgICAgICAgICAgICAgICB1OAotI2RlZmluZSBVU0hPUlQgICAgICAgICAgICAgIHUxNgotI2RlZmluZSBVTE9ORyAgICAgICAgICAgICAgIHUzMiAvKiBXVEYgPz8/ICovCi0jZGVmaW5lIEJPT0xFQU4gICAgICAgICAgICAgdTgKLSNkZWZpbmUgUFVMT05HICAgICAgICAgICAgICB1MzIgKgotI2RlZmluZSBQVVNIT1JUICAgICAgICAgICAgIHUxNiAqCi0jZGVmaW5lIFBVQ0hBUiAgICAgICAgICAgICAgdTggKgotI2RlZmluZSBQQ0hBUiAgICAgICAgICAgICAgIHU4ICoKLSNkZWZpbmUgVUlOVCAgICAgICAgICAgICAgICB1MzIKLQogI2RlZmluZSBGQUxTRSAgICAgICAgICAgMAogI2RlZmluZSBUUlVFICAgICAgICAgICAgMQogCkBAIC0zNzIsMTUgKzM2MiwxNSBAQAogCiAKIAotI2RlZmluZSBJU1JfRU1QVFkJCQkoVUNIQVIpMHgwMCAJIC8vIG5vIGJpdHMgc2V0IGluIElTUgorI2RlZmluZSBJU1JfRU1QVFkJCQkodTgpMHgwMCAJIC8vIG5vIGJpdHMgc2V0IGluIElTUgogCi0jZGVmaW5lIElTUl9ET09SQkVMTF9BQ0sJKFVDSEFSKTB4MDEJCSAvLyAgdGhlIGRvb3JiZWxsIGkgc2VudCBoYXMgYmVlbiByZWNpZXZlZC4KKyNkZWZpbmUgSVNSX0RPT1JCRUxMX0FDSwkodTgpMHgwMQkJIC8vICB0aGUgZG9vcmJlbGwgaSBzZW50IGhhcyBiZWVuIHJlY2lldmVkLgogCi0jZGVmaW5lIElTUl9ET09SQkVMTF9QRU5ECShVQ0hBUikweDAyIAkgLy8gIGRvb3JiZWxsIGZvciBtZQorI2RlZmluZSBJU1JfRE9PUkJFTExfUEVORAkodTgpMHgwMiAJIC8vICBkb29yYmVsbCBmb3IgbWUKIAotI2RlZmluZSBJU1JfUkNWCQkJCShVQ0hBUikweDA0IAkgLy8gcGFja2V0IHJlY2VpdmVkIHdpdGggbm8gZXJyb3JzCisjZGVmaW5lIElTUl9SQ1YJCQkJKHU4KTB4MDQgCSAvLyBwYWNrZXQgcmVjZWl2ZWQgd2l0aCBubyBlcnJvcnMKIAotI2RlZmluZSBJU1JfV0FURVJNQVJLCQkoVUNIQVIpMHgwOCAJIC8vCisjZGVmaW5lIElTUl9XQVRFUk1BUksJCSh1OCkweDA4IAkgLy8KIAogCiAKQEAgLTQ2NiwxMiArNDU2LDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7Ci0Jc3BpbmxvY2tfdCBkZXZpY2VfbG9jazsKIAogCXUzMiBzdGF0dXM7CiAKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjb250cm9sX3dhaXQ7Ci0KIAlzdHJ1Y3QgdXJiICpyeF91cmI7CiAJc3RydWN0IHVyYiAqdHhfdXJiOwogCkBAIC00ODYsNiArNDczLDEzIEBACiAvLwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsgLy9tYmVsaWFuCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGRlbnRyeSAqZGVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpmaWxlOworCWludCBpbnRfbnVtYmVyOworfTsKKwogc3RydWN0IGZ0MTAwMF9pbmZvIHsKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqcEZ0MTAwMERldjsKICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKQEAgLTQ5Nyw5ICs0OTEsOSBAQAogCXVuc2lnbmVkIGNoYXIgdXNiYm9vdDsKICAgICB1bnNpZ25lZCBzaG9ydCBkc3BhbGl2ZTsKICAgICB1MTYgQVNJQ19JRDsKLSAgICBCT09MRUFOIGZQcm92Q29tcGxldGU7Ci0gICAgQk9PTEVBTiBmQ29uZFJlc2V0UGVuZDsKLSAgICBCT09MRUFOIGZBcHBNc2dQZW5kOworICAgIGJvb2wgZlByb3ZDb21wbGV0ZTsKKyAgICBib29sIGZDb25kUmVzZXRQZW5kOworICAgIGJvb2wgZkFwcE1zZ1BlbmQ7CiAgICAgY2hhciAqcGZ3aW1nOwogICAgIGludCBmd2ltZ3N6OwogICAgIHUxNiBEcnZFcnJOdW07CkBAIC01MjAsNyArNTE0LDcgQEAKICAgICBpbnQgTmV0RGV2UmVnRG9uZTsKICAgICB1OCBDYXJkTnVtYmVyOwogICAgIHU4IERldmljZU5hbWVbMTVdOwotICAgIGludCBEZXZpY2VNYWpvcjsKKyAgICBzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMgbm9kZXM7CiAgICAgaW50IHJlZ2lzdGVyZWQ7CiAgICAgaW50IG1lZGlhc3RhdGU7CiAgICAgaW50IGRoY3BmbGc7CkBAIC01NjcsMjYgKzU2MSwyNiBAQAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIHUxNiBmdDEwMDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYqIERhdGEsIHUxNiBuUmVnSW5keCk7Ci11MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCB2YWx1ZSwgdTE2IG5SZWdJbmR4KTsKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCBVU0hPUlQgY250KTsKLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgVVNIT1JUIGNudCk7Ci11MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgdTggaGlnaGxvdyk7Ci11MTYgZnQxMDAwX3dyaXRlX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFVTSE9SVCB2YWx1ZSwgdTggaGlnaGxvdyk7Ci11MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIpOwotdTE2IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlcik7Cit1MTYgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiB2YWx1ZSwgdTE2IG5SZWdJbmR4KTsKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyLCB1MTYgY250KTsKK3UxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTE2IGNudCk7Cit1MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTggaGlnaGxvdyk7Cit1MTYgZnQxMDAwX3dyaXRlX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHUxNiB2YWx1ZSwgdTggaGlnaGxvdyk7Cit1MTYgZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIpOwordTE2IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlcik7CiAKIGV4dGVybiB2b2lkICpwRmlsZVN0YXJ0OwogZXh0ZXJuIHNpemVfdCBGaWxlTGVuZ3RoOwogZXh0ZXJuIGludCBudW1vZm1zZ2J1ZjsKIAogaW50IGZ0MTAwMF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci11MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgVUxPTkcgIEZpbGVMZW5ndGgpOwordTE2IHNjcmFtX2RubGRyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHZvaWQgKnBGaWxlU3RhcnQsIHUzMiAgRmlsZUxlbmd0aCk7CiAKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVyY3Zwb29sOwogZXh0ZXJuIHNwaW5sb2NrX3QgZnJlZV9idWZmX2xvY2s7ICAgLy8gbG9jayB0byBhcmJpdHJhdGUgZnJlZSBidWZmZXIgbGlzdCBmb3IgcmVjZWl2ZSBjb21tYW5kIGRhdGEKIAotaW50IGZ0MTAwMF9DcmVhdGVEZXZpY2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldik7Ci12b2lkIGZ0MTAwMF9EZXN0cm95RGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGZ0MTAwMF9jcmVhdGVfZGV2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYpOwordm9pZCBmdDEwMDBfZGVzdHJveV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBDYXJkU2VuZENvbW1hbmQoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcHRlbXBidWZmZXIsIGludCBzaXplKTsKIAogc3RydWN0IGRwcmFtX2JsayAqZnQxMDAwX2dldF9idWZmZXIoc3RydWN0IGxpc3RfaGVhZCAqYnVmZmxpc3QpOwpAQCAtNjAwLDggKzU5NCw4IEBACiBpbnQgcmVnX2Z0MTAwMF9uZXRkZXYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogaW50IGZ0MTAwMF9wb2xsKHZvaWQqIGRldl9pZCk7CiAKLXZvaWQgZnQxMDAwSW5pdFByb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGZ0MTAwMENsZWFudXBQcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyk7CitpbnQgZnQxMDAwX2luaXRfcHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZnQxMDAwX2NsZWFudXBfcHJvYyhzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8pOwogCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwppbmRleCA0OGQ0ZTQ4Li42YzkyNzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYwpAQCAtNjI0LDcgKzYyNCw3IEBACiAJZ28tPmR2ZF9tb2RlID0gMDsKIAlnby0+aW50ZXJsYWNlX2NvZGluZyA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKLQkJZ28tPm1vZGV0W2ldLmVuYWJsZSA9IDA7OworCQlnby0+bW9kZXRbaV0uZW5hYmxlID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMTYyNDsgKytpKQogCQlnby0+bW9kZXRfbWFwW2ldID0gMDsKIAlnby0+YXVkaW9fZGVsaXZlciA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKaW5kZXggYjQ2MzQ5Yi4uYWNkMzliZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIG9iai0kKENPTkZJR19IWVBFUlZfVVRJTFMpCSs9IGh2X3V0aWxzLm8KIAogaHZfdm1idXMteSA6PSB2bWJ1c19kcnYubyBvc2QubyBcCi0JCSB2bWJ1cy5vIGh2Lm8gY29ubmVjdGlvbi5vIGNoYW5uZWwubyBcCisJCSBodi5vIGNvbm5lY3Rpb24ubyBjaGFubmVsLm8gXAogCQkgY2hhbm5lbF9tZ210Lm8gcmluZ19idWZmZXIubwogaHZfc3RvcnZzYy15IDo9IHN0b3J2c2NfZHJ2Lm8gc3RvcnZzYy5vCiBodl9ibGt2c2MteSA6PSBibGt2c2NfZHJ2Lm8gYmxrdnNjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYwppbmRleCBkNWIwYWJkLi5iYzE2ZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzYy5jCkBAIC0yNSwyNCArMjUsMjQgQEAKICNpbmNsdWRlICJvc2QuaCIKICNpbmNsdWRlICJzdG9ydnNjLmMiCiAKLXN0YXRpYyBjb25zdCBjaGFyICpnQmxrRHJpdmVyTmFtZSA9ICJibGt2c2MiOworc3RhdGljIGNvbnN0IGNoYXIgKmdfYmxrX2RyaXZlcl9uYW1lID0gImJsa3ZzYyI7CiAKIC8qIHszMjQxMjYzMi04NmNiLTQ0YTItOWI1Yy01MGQxNDE3MzU0ZjV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ0Jsa1ZzY0RldmljZVR5cGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ19ibGtfZGV2aWNlX3R5cGUgPSB7CiAJLmRhdGEgPSB7CiAJCTB4MzIsIDB4MjYsIDB4NDEsIDB4MzIsIDB4Y2IsIDB4ODYsIDB4YTIsIDB4NDQsCiAJCTB4OWIsIDB4NWMsIDB4NTAsIDB4ZDEsIDB4NDEsIDB4NzMsIDB4NTQsIDB4ZjUKIAl9CiB9OwogCi1zdGF0aWMgaW50IEJsa1ZzY09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwgdm9pZCAqQWRkaXRpb25hbEluZm8pCitzdGF0aWMgaW50IGJsa192c2Nfb25fZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqZGV2aWNlSW5mbzsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CiAJaW50IHJldCA9IDA7CiAKLQlkZXZpY2VJbmZvID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICopQWRkaXRpb25hbEluZm87CisJZGV2aWNlX2luZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm87CiAKLQlyZXQgPSBTdG9yVnNjT25EZXZpY2VBZGQoRGV2aWNlLCBBZGRpdGlvbmFsSW5mbyk7CisJcmV0ID0gc3Rvcl92c2Nfb25fZGV2aWNlX2FkZChkZXZpY2UsIGFkZGl0aW9uYWxfaW5mbyk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01MSwzMSArNTEsMzEgQEAKIAkgKiBpZC4gRm9yIElERSBkZXZpY2VzLCB0aGUgZGV2aWNlIGluc3RhbmNlIGlkIGlzIGZvcm1hdHRlZCBhcwogCSAqIDxidXMgaWQ+ICogLSA8ZGV2aWNlIGlkPiAtIDg4OTkgLSAwMDAwMDAwMDAwMDAuCiAJICovCi0JZGV2aWNlSW5mby0+UGF0aElkID0gRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzNdIDw8IDI0IHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzJdIDw8IDE2IHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzFdIDw8IDggIHwKLQkJCSAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzBdOworCWRldmljZV9pbmZvLT5wYXRoX2lkID0gZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzNdIDw8IDI0IHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzJdIDw8IDE2IHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzFdIDw8IDggIHwKKwkJCSAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzBdOwogCi0JZGV2aWNlSW5mby0+VGFyZ2V0SWQgPSBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNV0gPDwgOCB8Ci0JCQkgICAgICAgRGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzRdOworCWRldmljZV9pbmZvLT50YXJnZXRfaWQgPSBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNV0gPDwgOCB8CisJCQkgICAgICAgZGV2aWNlLT5kZXZpY2VJbnN0YW5jZS5kYXRhWzRdOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IEJsa1ZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKQoraW50IGJsa192c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqc3RvckRyaXZlcjsKKwlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yX2RyaXZlcjsKIAlpbnQgcmV0ID0gMDsKIAotCXN0b3JEcml2ZXIgPSAoc3RydWN0IHN0b3J2c2NfZHJpdmVyX29iamVjdCAqKURyaXZlcjsKKwlzdG9yX2RyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopZHJpdmVyOwogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCi0JLyogQVNTRVJUKHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplID49IChQQUdFX1NJWkUgPDwgMSkpOyAqLworCS8qIEFTU0VSVChzdG9yX2RyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCiAKLQlEcml2ZXItPm5hbWUgPSBnQmxrRHJpdmVyTmFtZTsKLQltZW1jcHkoJkRyaXZlci0+ZGV2aWNlVHlwZSwgJmdCbGtWc2NEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwlkcml2ZXItPm5hbWUgPSBnX2Jsa19kcml2ZXJfbmFtZTsKKwltZW1jcHkoJmRyaXZlci0+ZGV2aWNlVHlwZSwgJmdfYmxrX2RldmljZV90eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAotCXN0b3JEcml2ZXItPlJlcXVlc3RFeHRTaXplID0gc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKKwlzdG9yX2RyaXZlci0+cmVxdWVzdF9leHRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbik7CiAKIAkvKgogCSAqIERpdmlkZSB0aGUgcmluZyBidWZmZXIgZGF0YSBzaXplICh3aGljaCBpcyAxIHBhZ2UgbGVzcyB0aGFuIHRoZSByaW5nCkBAIC04MywyMCArODMsMjAgQEAKIAkgKiBieSB0aGUgbWF4IHJlcXVlc3Qgc2l6ZSAod2hpY2ggaXMKIAkgKiB2bWJ1c19jaGFubmVsX3BhY2tldF9tdWx0aXBhZ2VfYnVmZmVyICsgc3RydWN0IHZzdG9yX3BhY2tldCArIHU2NCkKIAkgKi8KLQlzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCA9Ci0JCSgoc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUgLSBQQUdFX1NJWkUpIC8KKwlzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA9CisJCSgoc3Rvcl9kcml2ZXItPnJpbmdfYnVmZmVyX3NpemUgLSBQQUdFX1NJWkUpIC8KIAkJICBBTElHTl9VUChNQVhfTVVMVElQQUdFX0JVRkZFUl9QQUNLRVQgKwogCQkJICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsgc2l6ZW9mKHU2NCksCiAJCQkgICBzaXplb2YodTY0KSkpOwogCiAJRFBSSU5UX0lORk8oQkxLVlNDLCAibWF4IGlvIG91dHN0ZCAldSIsCi0JCSAgICBzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCk7CisJCSAgICBzdG9yX2RyaXZlci0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCk7CiAKIAkvKiBTZXR1cCB0aGUgZGlzcGF0Y2ggdGFibGUgKi8KLQlzdG9yRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkID0gQmxrVnNjT25EZXZpY2VBZGQ7Ci0Jc3RvckRyaXZlci0+QmFzZS5PbkRldmljZVJlbW92ZSA9IFN0b3JWc2NPbkRldmljZVJlbW92ZTsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uQ2xlYW51cCA9IFN0b3JWc2NPbkNsZWFudXA7Ci0Jc3RvckRyaXZlci0+T25JT1JlcXVlc3QJPSBTdG9yVnNjT25JT1JlcXVlc3Q7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VBZGQgPSBibGtfdnNjX29uX2RldmljZV9hZGQ7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VSZW1vdmUgPSBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlOworCXN0b3JfZHJpdmVyLT5iYXNlLk9uQ2xlYW51cCA9IHN0b3JfdnNjX29uX2NsZWFudXA7CisJc3Rvcl9kcml2ZXItPm9uX2lvX3JlcXVlc3QgPSBzdG9yX3ZzY19vbl9pb19yZXF1ZXN0OwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjX2Rydi5jCmluZGV4IDNmODFjYTUuLmIzZDA1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYwpAQCAtMTc3LDEzICsxNzcsMTMgQEAKIAlzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRydl9jdHggPSAmZ19ibGt2c2NfZHJ2LmRydl9jdHg7CiAJaW50IHJldDsKIAotCXN0b3J2c2NfZHJ2X29iai0+UmluZ0J1ZmZlclNpemUgPSBibGt2c2NfcmluZ2J1ZmZlcl9zaXplOworCXN0b3J2c2NfZHJ2X29iai0+cmluZ19idWZmZXJfc2l6ZSA9IGJsa3ZzY19yaW5nYnVmZmVyX3NpemU7CiAKIAkvKiBDYWxsYmFjayB0byBjbGllbnQgZHJpdmVyIHRvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiAqLwotCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCi0JZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UubmFtZTsKLQltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmc3RvcnZzY19kcnZfb2JqLT5CYXNlLmRldmljZVR5cGUsCisJZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UubmFtZTsKKwltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmc3RvcnZzY19kcnZfb2JqLT5iYXNlLmRldmljZVR5cGUsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCiAJZHJ2X2N0eC0+cHJvYmUgPSBibGt2c2NfcHJvYmU7CkBAIC0yMzAsOCArMjMwLDggQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoY3VycmVudF9kZXYpOwogCX0KIAotCWlmIChzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQlzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWlmIChzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKQorCQlzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAKQEAgLTI2Miw3ICsyNjIsNyBAQAogCiAJRFBSSU5UX0RCRyhCTEtWU0NfRFJWLCAiYmxrdnNjX3Byb2JlIC0gZW50ZXIiKTsKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKSB7CisJaWYgKCFzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VBZGQpIHsKIAkJRFBSSU5UX0VSUihCTEtWU0NfRFJWLCAiT25EZXZpY2VBZGQoKSBub3Qgc2V0Iik7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CkBAIC0yODQsNyArMjg0LDcgQEAKIAogCWJsa2Rldi0+cmVxdWVzdF9wb29sID0ga21lbV9jYWNoZV9jcmVhdGUoZGV2X25hbWUoJmRldmljZV9jdHgtPmRldmljZSksCiAJCQkJCXNpemVvZihzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QpICsKLQkJCQkJc3RvcnZzY19kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSwgMCwKKwkJCQkJc3RvcnZzY19kcnZfb2JqLT5yZXF1ZXN0X2V4dF9zaXplLCAwLAogCQkJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwogCWlmICghYmxrZGV2LT5yZXF1ZXN0X3Bvb2wpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCiAKIAkvKiBDYWxsIHRvIHRoZSB2c2MgZHJpdmVyIHRvIGFkZCB0aGUgZGV2aWNlICovCi0JcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKGRldmljZV9vYmosICZkZXZpY2VfaW5mbyk7CisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKGRldmljZV9vYmosICZkZXZpY2VfaW5mbyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoQkxLVlNDX0RSViwgInVuYWJsZSB0byBhZGQgYmxrdnNjIGRldmljZSIpOwogCQlnb3RvIENsZWFudXA7CkBAIC0zMDEsOSArMzAxLDkgQEAKIAogCWJsa2Rldi0+ZGV2aWNlX2N0eCA9IGRldmljZV9jdHg7CiAJLyogdGhpcyBpZGVudGlmaWVkIHRoZSBkZXZpY2UgMCBvciAxICovCi0JYmxrZGV2LT50YXJnZXQgPSBkZXZpY2VfaW5mby5UYXJnZXRJZDsKKwlibGtkZXYtPnRhcmdldCA9IGRldmljZV9pbmZvLnRhcmdldF9pZDsKIAkvKiB0aGlzIGlkZW50aWZpZWQgdGhlIGlkZSBjdHJsIDAgb3IgMSAqLwotCWJsa2Rldi0+cGF0aCA9IGRldmljZV9pbmZvLlBhdGhJZDsKKwlibGtkZXYtPnBhdGggPSBkZXZpY2VfaW5mby5wYXRoX2lkOwogCiAJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgYmxrZGV2KTsKIApAQCAtMzkxLDcgKzM5MSw3IEBACiAJcmV0dXJuIHJldDsKIAogUmVtb3ZlOgotCXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwlzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAKIENsZWFudXA6CiAJaWYgKGJsa2RldikgewpAQCAtNDU5LDkgKzQ1OSw5IEBACiAJYmxrdnNjX3JlcS0+cmVxID0gTlVMTDsKIAlibGt2c2NfcmVxLT53cml0ZSA9IDA7CiAKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbMF0gPSAwOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQgPSAwOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuUGZuQXJyYXlbMF0gPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0ID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCA9IDA7CiAKIAlibGt2c2NfcmVxLT5jbW5kWzBdID0gU1lOQ0hST05JWkVfQ0FDSEU7CiAJYmxrdnNjX3JlcS0+Y21kX2xlbiA9IDEwOwpAQCAtNTA2LDkgKzUwNiw5IEBACiAJYmxrdnNjX3JlcS0+cmVxID0gTlVMTDsKIAlibGt2c2NfcmVxLT53cml0ZSA9IDA7CiAKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCA9IDA7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA9IDY0OworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQgPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoID0gNjQ7CiAKIAlibGt2c2NfcmVxLT5jbW5kWzBdID0gSU5RVUlSWTsKIAlibGt2c2NfcmVxLT5jbW5kWzFdID0gMHgxOwkJLyogR2V0IHByb2R1Y3QgZGF0YSAqLwpAQCAtNTkzLDkgKzU5Myw5IEBACiAJYmxrdnNjX3JlcS0+cmVxID0gTlVMTDsKIAlibGt2c2NfcmVxLT53cml0ZSA9IDA7CiAKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbMF0gPSBwYWdlX3RvX3BmbihwYWdlX2J1Zik7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCA9IDA7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA9IDg7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldCA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGggPSA4OwogCiAJYmxrdnNjX3JlcS0+Y21uZFswXSA9IFJFQURfQ0FQQUNJVFk7CiAJYmxrdnNjX3JlcS0+Y21kX2xlbiA9IDE2OwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJsa3ZzY19yZXEtPndldmVudCwgYmxrdnNjX3JlcS0+Y29uZCk7CiAKIAkvKiBjaGVjayBlcnJvciAqLwotCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LlN0YXR1cykgeworCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LnN0YXR1cykgewogCQlzY3NpX25vcm1hbGl6ZV9zZW5zZShibGt2c2NfcmVxLT5zZW5zZV9idWZmZXIsCiAJCQkJICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsICZzZW5zZV9oZHIpOwogCkBAIC02NzAsOSArNjcwLDkgQEAKIAlibGt2c2NfcmVxLT5yZXEgPSBOVUxMOwogCWJsa3ZzY19yZXEtPndyaXRlID0gMDsKIAotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0ID0gMDsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID0gMTI7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldCA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGggPSAxMjsKIAogCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSAweDlFOyAvKiBSRUFEX0NBUEFDSVRZMTY7ICovCiAJYmxrdnNjX3JlcS0+Y21kX2xlbiA9IDE2OwpAQCAtNjkxLDcgKzY5MSw3IEBACiAJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJsa3ZzY19yZXEtPndldmVudCwgYmxrdnNjX3JlcS0+Y29uZCk7CiAKIAkvKiBjaGVjayBlcnJvciAqLwotCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LlN0YXR1cykgeworCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LnN0YXR1cykgewogCQlzY3NpX25vcm1hbGl6ZV9zZW5zZShibGt2c2NfcmVxLT5zZW5zZV9idWZmZXIsCiAJCQkJICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsICZzZW5zZV9oZHIpOwogCQlpZiAoc2Vuc2VfaGRyLmFzYyA9PSAweDNBKSB7CkBAIC03NDEsMTQgKzc0MSwxNCBAQAogCiAJRFBSSU5UX0RCRyhCTEtWU0NfRFJWLCAiYmxrdnNjX3JlbW92ZSgpXG4iKTsKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKQorCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7CiAKIAkvKgogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCiAJICogcmVtb3ZlZAogCSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qIFRPRE86ICovCiAJCURQUklOVF9FUlIoQkxLVlNDX0RSViwKQEAgLTg2NSwzOCArODY1LDM4IEBACiAJCSAgIChibGt2c2NfcmVxLT53cml0ZSkgPyAiV1JJVEUiIDogIlJFQUQiLAogCQkgICAodW5zaWduZWQgbG9uZykgYmxrdnNjX3JlcS0+c2VjdG9yX3N0YXJ0LAogCQkgICBibGt2c2NfcmVxLT5zZWN0b3JfY291bnQsCi0JCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQsCi0JCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGgpOworCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldCwKKwkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGgpOwogI2lmIDAKLQlmb3IgKGkgPSAwOyBpIDwgKGJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPj4gMTIpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgKGJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoID4+IDEyKTsgaSsrKSB7CiAJCURQUklOVF9EQkcoQkxLVlNDX0RSViwgImJsa3ZzY19zdWJtaXRfcmVxdWVzdCgpIC0gIgogCQkJICAgInJlcSAlcCBwZm5bJWRdICVsbHhcbiIsCiAJCQkgICBibGt2c2NfcmVxLCBpLAotCQkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5W2ldKTsKKwkJCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuUGZuQXJyYXlbaV0pOwogCX0KICNlbmRpZgogCiAJc3RvcnZzY19yZXEgPSAmYmxrdnNjX3JlcS0+cmVxdWVzdDsKLQlzdG9ydnNjX3JlcS0+RXh0ZW5zaW9uID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYmxrdnNjX3JlcSArCisJc3RvcnZzY19yZXEtPmV4dGVuc2lvbiA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWJsa3ZzY19yZXEgKwogCQkJCQkgIHNpemVvZihzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QpKTsKIAotCXN0b3J2c2NfcmVxLT5UeXBlID0gYmxrdnNjX3JlcS0+d3JpdGUgPyBXUklURV9UWVBFIDogUkVBRF9UWVBFOworCXN0b3J2c2NfcmVxLT50eXBlID0gYmxrdnNjX3JlcS0+d3JpdGUgPyBXUklURV9UWVBFIDogUkVBRF9UWVBFOwogCi0Jc3RvcnZzY19yZXEtPk9uSU9Db21wbGV0aW9uID0gcmVxdWVzdF9jb21wbGV0aW9uOwotCXN0b3J2c2NfcmVxLT5Db250ZXh0ID0gYmxrdnNjX3JlcTsKKwlzdG9ydnNjX3JlcS0+b25faW9fY29tcGxldGlvbiA9IHJlcXVlc3RfY29tcGxldGlvbjsKKwlzdG9ydnNjX3JlcS0+Y29udGV4dCA9IGJsa3ZzY19yZXE7CiAKLQlzdG9ydnNjX3JlcS0+SG9zdCA9IGJsa2Rldi0+cG9ydDsKLQlzdG9ydnNjX3JlcS0+QnVzID0gYmxrZGV2LT5wYXRoOwotCXN0b3J2c2NfcmVxLT5UYXJnZXRJZCA9IGJsa2Rldi0+dGFyZ2V0OwotCXN0b3J2c2NfcmVxLT5MdW5JZCA9IDA7CSAvKiB0aGlzIGlzIG5vdCByZWFsbHkgdXNlZCBhdCBhbGwgKi8KKwlzdG9ydnNjX3JlcS0+aG9zdCA9IGJsa2Rldi0+cG9ydDsKKwlzdG9ydnNjX3JlcS0+YnVzID0gYmxrZGV2LT5wYXRoOworCXN0b3J2c2NfcmVxLT50YXJnZXRfaWQgPSBibGtkZXYtPnRhcmdldDsKKwlzdG9ydnNjX3JlcS0+bHVuX2lkID0gMDsJIC8qIHRoaXMgaXMgbm90IHJlYWxseSB1c2VkIGF0IGFsbCAqLwogCi0Jc3RvcnZzY19yZXEtPkNkYkxlbiA9IGJsa3ZzY19yZXEtPmNtZF9sZW47Ci0Jc3RvcnZzY19yZXEtPkNkYiA9IGJsa3ZzY19yZXEtPmNtbmQ7CisJc3RvcnZzY19yZXEtPmNkYl9sZW4gPSBibGt2c2NfcmVxLT5jbWRfbGVuOworCXN0b3J2c2NfcmVxLT5jZGIgPSBibGt2c2NfcmVxLT5jbW5kOwogCi0Jc3RvcnZzY19yZXEtPlNlbnNlQnVmZmVyID0gYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyOwotCXN0b3J2c2NfcmVxLT5TZW5zZUJ1ZmZlclNpemUgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJc3RvcnZzY19yZXEtPnNlbnNlX2J1ZmZlciA9IGJsa3ZzY19yZXEtPnNlbnNlX2J1ZmZlcjsKKwlzdG9ydnNjX3JlcS0+c2Vuc2VfYnVmZmVyX3NpemUgPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CiAKLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPk9uSU9SZXF1ZXN0KCZibGtkZXYtPmRldmljZV9jdHgtPmRldmljZV9vYmosCisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5vbl9pb19yZXF1ZXN0KCZibGtkZXYtPmRldmljZV9jdHgtPmRldmljZV9vYmosCiAJCQkJCSAgICZibGt2c2NfcmVxLT5yZXF1ZXN0KTsKIAlpZiAocmV0ID09IDApCiAJCWJsa2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcXMrKzsKQEAgLTk5Miw4ICs5OTIsMTAgQEAKIAogCQkJCQlibGt2c2NfcmVxLT5kZXYgPSBibGtkZXY7CiAJCQkJCWJsa3ZzY19yZXEtPnJlcSA9IHJlcTsKLQkJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCA9IGJ2ZWMtPmJ2X29mZnNldDsKLQkJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA9IDA7CisJCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0CisJCQkJCQk9IGJ2ZWMtPmJ2X29mZnNldDsKKwkJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGgKKwkJCQkJCT0gMDsKIAogCQkJCQkvKiBBZGQgdG8gdGhlIGdyb3VwICovCiAJCQkJCWJsa3ZzY19yZXEtPmdyb3VwID0gZ3JvdXA7CkBAIC0xMDA3LDggKzEwMDksMTEgQEAKIAkJCQl9CiAKIAkJCQkvKiBBZGQgdGhlIGN1cnIgYnZlYy9zZWdtZW50IHRvIHRoZSBjdXJyIGJsa3ZzY19yZXEgKi8KLQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbZGF0YWJ1Zl9pZHhdID0gcGFnZV90b19wZm4oYnZlYy0+YnZfcGFnZSk7Ci0JCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCArPSBidmVjLT5idl9sZW47CisJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci4KKwkJCQkJUGZuQXJyYXlbZGF0YWJ1Zl9pZHhdCisJCQkJCQk9IHBhZ2VfdG9fcGZuKGJ2ZWMtPmJ2X3BhZ2UpOworCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoCisJCQkJCSs9IGJ2ZWMtPmJ2X2xlbjsKIAogCQkJCXByZXZfYnZlYyA9IGJ2ZWM7CiAKQEAgLTEwNzMsNyArMTA3OCw3IEBACiBzdGF0aWMgdm9pZCBibGt2c2NfY21kX2NvbXBsZXRpb24oc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmJsa3ZzY19yZXEgPQotCQkJKHN0cnVjdCBibGt2c2NfcmVxdWVzdCAqKXJlcXVlc3QtPkNvbnRleHQ7CisJCQkoc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICopcmVxdWVzdC0+Y29udGV4dDsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKmJsa2RldiA9CiAJCQkoc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICopYmxrdnNjX3JlcS0+ZGV2OwogCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7CkBAIC0xMDgzLDcgKzEwODgsNyBAQAogCiAJYmxrZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVxcy0tOwogCi0JaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3QuU3RhdHVzKQorCWlmIChibGt2c2NfcmVxLT5yZXF1ZXN0LnN0YXR1cykKIAkJaWYgKHNjc2lfbm9ybWFsaXplX3NlbnNlKGJsa3ZzY19yZXEtPnNlbnNlX2J1ZmZlciwKIAkJCQkJIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgJnNlbnNlX2hkcikpCiAJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigiYmxrdnNjIiwgJnNlbnNlX2hkcik7CkBAIC0xMDk1LDcgKzExMDAsNyBAQAogc3RhdGljIHZvaWQgYmxrdnNjX3JlcXVlc3RfY29tcGxldGlvbihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBibGt2c2NfcmVxdWVzdCAqYmxrdnNjX3JlcSA9Ci0JCQkoc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICopcmVxdWVzdC0+Q29udGV4dDsKKwkJCShzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKilyZXF1ZXN0LT5jb250ZXh0OwogCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0KIAkJCShzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKilibGt2c2NfcmVxLT5kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTExMTAsNyArMTExNSw3IEBACiAJCSAgIChibGt2c2NfcmVxLT53cml0ZSkgPyAiV1JJVEUiIDogIlJFQUQiLAogCQkgICAodW5zaWduZWQgbG9uZylibGt2c2NfcmVxLT5zZWN0b3Jfc3RhcnQsCiAJCSAgIGJsa3ZzY19yZXEtPnNlY3Rvcl9jb3VudCwKLQkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCwKKwkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGgsCiAJCSAgIGJsa3ZzY19yZXEtPmdyb3VwLT5vdXRzdGFuZGluZywKIAkJICAgYmxrZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVxcyk7CiAKQEAgLTExMzcsNyArMTE0Miw3IEBACiAJCQlsaXN0X2RlbCgmY29tcF9yZXEtPnJlcV9lbnRyeSk7CiAKIAkJCWlmICghX19ibGtfZW5kX3JlcXVlc3QoY29tcF9yZXEtPnJlcSwKLQkJCQkoIWNvbXBfcmVxLT5yZXF1ZXN0LlN0YXR1cyA/IDAgOiAtRUlPKSwKKwkJCQkoIWNvbXBfcmVxLT5yZXF1ZXN0LnN0YXR1cyA/IDAgOiAtRUlPKSwKIAkJCQljb21wX3JlcS0+c2VjdG9yX2NvdW50ICogYmxrZGV2LT5zZWN0b3Jfc2l6ZSkpIHsKIAkJCQkvKgogCQkJCSAqIEFsbCB0aGUgc2VjdG9ycyBoYXZlIGJlZW4geGZlcnJlZCBpZSB0aGUKQEAgLTExOTUsNyArMTIwMCw3IEBACiAKIAkJCWlmIChjb21wX3JlcS0+cmVxKSB7CiAJCQkJcmV0ID0gX19ibGtfZW5kX3JlcXVlc3QoY29tcF9yZXEtPnJlcSwKLQkJCQkJKCFjb21wX3JlcS0+cmVxdWVzdC5TdGF0dXMgPyAwIDogLUVJTyksCisJCQkJCSghY29tcF9yZXEtPnJlcXVlc3Quc3RhdHVzID8gMCA6IC1FSU8pLAogCQkJCQljb21wX3JlcS0+c2VjdG9yX2NvdW50ICoKIAkJCQkJYmxrZGV2LT5zZWN0b3Jfc2l6ZSk7CiAKQEAgLTE0ODIsNyArMTQ4Nyw3IEBACiAKIAlEUFJJTlRfSU5GTyhCTEtWU0NfRFJWLCAiQmxrdnNjIGluaXRpYWxpemluZy4uLi4iKTsKIAotCXJldCA9IGJsa3ZzY19kcnZfaW5pdChCbGtWc2NJbml0aWFsaXplKTsKKwlyZXQgPSBibGt2c2NfZHJ2X2luaXQoYmxrX3ZzY19pbml0aWFsaXplKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWwuYwppbmRleCAyNmViYzc3Li40NWE2MjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMKQEAgLTQzLDI0ICs0MywyNCBAQAogCWludCBqID0gMDsKIAogCURQUklOVF9EQkcoVk1CVVMsICJtb25pdG9yUGFnZSAtICVwLCB0cmlnZ2VyIHN0YXRlIC0gJWQiLAotCQkgICBNb25pdG9yUGFnZSwgTW9uaXRvclBhZ2UtPlRyaWdnZXJTdGF0ZSk7CisJCSAgIE1vbml0b3JQYWdlLCBNb25pdG9yUGFnZS0+dHJpZ2dlcl9zdGF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlEUFJJTlRfREJHKFZNQlVTLCAidHJpZ2dlciBncm91cCAoJWQpIC0gJWxseCIsIGksCi0JCQkgICBNb25pdG9yUGFnZS0+VHJpZ2dlckdyb3VwW2ldLkFzVUlOVDY0KTsKKwkJCSAgIE1vbml0b3JQYWdlLT50cmlnZ2VyX2dyb3VwW2ldLmFzX3VpbnQ2NCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CiAJCQlEUFJJTlRfREJHKFZNQlVTLCAibGF0ZW5jeSAoJWQpKCVkKSAtICVsbHgiLCBpLCBqLAotCQkJCSAgIE1vbml0b3JQYWdlLT5MYXRlbmN5W2ldW2pdKTsKKwkJCQkgICBNb25pdG9yUGFnZS0+bGF0ZW5jeVtpXVtqXSk7CiAJCX0KIAl9CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgewogCQkJRFBSSU5UX0RCRyhWTUJVUywgInBhcmFtLWNvbm4gaWQgKCVkKSglZCkgLSAlZCIsIGksIGosCi0JCQkgICAgICAgTW9uaXRvclBhZ2UtPlBhcmFtZXRlcltpXVtqXS5Db25uZWN0aW9uSWQuQXN1MzIpOworCQkJICAgICAgIE1vbml0b3JQYWdlLT5wYXJhbWV0ZXJbaV1bal0uY29ubmVjdGlvbmlkLmFzdTMyKTsKIAkJCURQUklOVF9EQkcoVk1CVVMsICJwYXJhbS1mbGFnICglZCkoJWQpIC0gJWQiLCBpLCBqLAotCQkJCU1vbml0b3JQYWdlLT5QYXJhbWV0ZXJbaV1bal0uRmxhZ051bWJlcik7CisJCQkJTW9uaXRvclBhZ2UtPnBhcmFtZXRlcltpXVtqXS5mbGFnX251bWJlcik7CiAJCX0KIAl9CiB9CkBAIC03NCwyMSArNzQsMjEgQEAKIHsKIAlzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICptb25pdG9ycGFnZTsKIAotCWlmIChjaGFubmVsLT5PZmZlck1zZy5Nb25pdG9yQWxsb2NhdGVkKSB7CisJaWYgKGNoYW5uZWwtPm9mZmVybXNnLm1vbml0b3JfYWxsb2NhdGVkKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KLQkJc2V0X2JpdChjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkICYgMzEsCisJCXNldF9iaXQoY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgJiAzMSwKIAkJCSh1bnNpZ25lZCBsb25nICopIGdWbWJ1c0Nvbm5lY3Rpb24uU2VuZEludGVycnVwdFBhZ2UgKwotCQkJKGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQgPj4gNSkpOworCQkJKGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkID4+IDUpKTsKIAogCQltb25pdG9ycGFnZSA9IGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzOwogCQltb25pdG9ycGFnZSsrOyAvKiBHZXQgdGhlIGNoaWxkIHRvIHBhcmVudCBtb25pdG9yIHBhZ2UgKi8KIAotCQlzZXRfYml0KGNoYW5uZWwtPk1vbml0b3JCaXQsCi0JCQkodW5zaWduZWQgbG9uZyAqKSZtb25pdG9ycGFnZS0+VHJpZ2dlckdyb3VwCi0JCQkJCVtjaGFubmVsLT5Nb25pdG9yR3JvdXBdLlBlbmRpbmcpOworCQlzZXRfYml0KGNoYW5uZWwtPm1vbml0b3JfYml0LAorCQkJKHVuc2lnbmVkIGxvbmcgKikmbW9uaXRvcnBhZ2UtPnRyaWdnZXJfZ3JvdXAKKwkJCQkJW2NoYW5uZWwtPm1vbml0b3JfZ3JwXS5wZW5kaW5nKTsKIAogCX0gZWxzZSB7Ci0JCVZtYnVzU2V0RXZlbnQoY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCk7CisJCVZtYnVzU2V0RXZlbnQoY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQpOwogCX0KIH0KIApAQCAtOTcsMTkgKzk3LDE5IEBACiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvclBhZ2U7CiAKLQlpZiAoQ2hhbm5lbC0+T2ZmZXJNc2cuTW9uaXRvckFsbG9jYXRlZCkgeworCWlmIChDaGFubmVsLT5vZmZlcm1zZy5tb25pdG9yX2FsbG9jYXRlZCkgewogCQkvKiBFYWNoIHUzMiByZXByZXNlbnRzIDMyIGNoYW5uZWxzICovCi0JCWNsZWFyX2JpdChDaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkICYgMzEsCisJCWNsZWFyX2JpdChDaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCAmIDMxLAogCQkJICAodW5zaWduZWQgbG9uZyAqKWdWbWJ1c0Nvbm5lY3Rpb24uU2VuZEludGVycnVwdFBhZ2UgKwotCQkJICAoQ2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCA+PiA1KSk7CisJCQkgIChDaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCA+PiA1KSk7CiAKIAkJbW9uaXRvclBhZ2UgPQogCQkJKHN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKilnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlczsKIAkJbW9uaXRvclBhZ2UrKzsgLyogR2V0IHRoZSBjaGlsZCB0byBwYXJlbnQgbW9uaXRvciBwYWdlICovCiAKLQkJY2xlYXJfYml0KENoYW5uZWwtPk1vbml0b3JCaXQsCi0JCQkgICh1bnNpZ25lZCBsb25nICopJm1vbml0b3JQYWdlLT5UcmlnZ2VyR3JvdXAKLQkJCQkJW0NoYW5uZWwtPk1vbml0b3JHcm91cF0uUGVuZGluZyk7CisJCWNsZWFyX2JpdChDaGFubmVsLT5tb25pdG9yX2JpdCwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgKikmbW9uaXRvclBhZ2UtPnRyaWdnZXJfZ3JvdXAKKwkJCQkJW0NoYW5uZWwtPm1vbml0b3JfZ3JwXS5QZW5kaW5nKTsKIAl9CiB9CiAKQEAgLTEyMSw0MiArMTIxLDQyIEBACiAJCQkgICAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9kZWJ1Z19pbmZvICpkZWJ1Z2luZm8pCiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvcnBhZ2U7Ci0JdTggbW9uaXRvcl9ncm91cCA9ICh1OCljaGFubmVsLT5PZmZlck1zZy5Nb25pdG9ySWQgLyAzMjsKLQl1OCBtb25pdG9yX29mZnNldCA9ICh1OCljaGFubmVsLT5PZmZlck1zZy5Nb25pdG9ySWQgJSAzMjsKKwl1OCBtb25pdG9yX2dyb3VwID0gKHU4KWNoYW5uZWwtPm9mZmVybXNnLm1vbml0b3JpZCAvIDMyOworCXU4IG1vbml0b3Jfb2Zmc2V0ID0gKHU4KWNoYW5uZWwtPm9mZmVybXNnLm1vbml0b3JpZCAlIDMyOwogCS8qIHUzMiBtb25pdG9yQml0CT0gMSA8PCBtb25pdG9yT2Zmc2V0OyAqLwogCi0JZGVidWdpbmZvLT5SZWxJZCA9IGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7Ci0JZGVidWdpbmZvLT5TdGF0ZSA9IGNoYW5uZWwtPlN0YXRlOwotCW1lbWNweSgmZGVidWdpbmZvLT5JbnRlcmZhY2VUeXBlLAotCSAgICAgICAmY2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0JbWVtY3B5KCZkZWJ1Z2luZm8tPkludGVyZmFjZUluc3RhbmNlLAotCSAgICAgICAmY2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCisJZGVidWdpbmZvLT5yZWxpZCA9IGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOworCWRlYnVnaW5mby0+c3RhdGUgPSBjaGFubmVsLT5zdGF0ZTsKKwltZW1jcHkoJmRlYnVnaW5mby0+aW50ZXJmYWNldHlwZSwKKwkgICAgICAgJmNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCW1lbWNweSgmZGVidWdpbmZvLT5pbnRlcmZhY2VfaW5zdGFuY2UsCisJICAgICAgICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAltb25pdG9ycGFnZSA9IChzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICopZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXM7CiAKLQlkZWJ1Z2luZm8tPk1vbml0b3JJZCA9IGNoYW5uZWwtPk9mZmVyTXNnLk1vbml0b3JJZDsKKwlkZWJ1Z2luZm8tPm1vbml0b3JpZCA9IGNoYW5uZWwtPm9mZmVybXNnLm1vbml0b3JpZDsKIAotCWRlYnVnaW5mby0+U2VydmVyTW9uaXRvclBlbmRpbmcgPQotCQkJbW9uaXRvcnBhZ2UtPlRyaWdnZXJHcm91cFttb25pdG9yX2dyb3VwXS5QZW5kaW5nOwotCWRlYnVnaW5mby0+U2VydmVyTW9uaXRvckxhdGVuY3kgPQotCQkJbW9uaXRvcnBhZ2UtPkxhdGVuY3lbbW9uaXRvcl9ncm91cF1bbW9uaXRvcl9vZmZzZXRdOwotCWRlYnVnaW5mby0+U2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZCA9Ci0JCQltb25pdG9ycGFnZS0+UGFyYW1ldGVyW21vbml0b3JfZ3JvdXBdCi0JCQkJCVttb25pdG9yX29mZnNldF0uQ29ubmVjdGlvbklkLnUuSWQ7CisJZGVidWdpbmZvLT5zZXJ2ZXJtb25pdG9yX3BlbmRpbmcgPQorCQkJbW9uaXRvcnBhZ2UtPnRyaWdnZXJfZ3JvdXBbbW9uaXRvcl9ncm91cF0ucGVuZGluZzsKKwlkZWJ1Z2luZm8tPnNlcnZlcm1vbml0b3JfbGF0ZW5jeSA9CisJCQltb25pdG9ycGFnZS0+bGF0ZW5jeVttb25pdG9yX2dyb3VwXVttb25pdG9yX29mZnNldF07CisJZGVidWdpbmZvLT5zZXJ2ZXJtb25pdG9yX2Nvbm5lY3Rpb25pZCA9CisJCQltb25pdG9ycGFnZS0+cGFyYW1ldGVyW21vbml0b3JfZ3JvdXBdCisJCQkJCVttb25pdG9yX29mZnNldF0uY29ubmVjdGlvbmlkLnUuaWQ7CiAKIAltb25pdG9ycGFnZSsrOwogCi0JZGVidWdpbmZvLT5DbGllbnRNb25pdG9yUGVuZGluZyA9Ci0JCQltb25pdG9ycGFnZS0+VHJpZ2dlckdyb3VwW21vbml0b3JfZ3JvdXBdLlBlbmRpbmc7Ci0JZGVidWdpbmZvLT5DbGllbnRNb25pdG9yTGF0ZW5jeSA9Ci0JCQltb25pdG9ycGFnZS0+TGF0ZW5jeVttb25pdG9yX2dyb3VwXVttb25pdG9yX29mZnNldF07Ci0JZGVidWdpbmZvLT5DbGllbnRNb25pdG9yQ29ubmVjdGlvbklkID0KLQkJCW1vbml0b3JwYWdlLT5QYXJhbWV0ZXJbbW9uaXRvcl9ncm91cF0KLQkJCQkJW21vbml0b3Jfb2Zmc2V0XS5Db25uZWN0aW9uSWQudS5JZDsKKwlkZWJ1Z2luZm8tPmNsaWVudG1vbml0b3JfcGVuZGluZyA9CisJCQltb25pdG9ycGFnZS0+dHJpZ2dlcl9ncm91cFttb25pdG9yX2dyb3VwXS5wZW5kaW5nOworCWRlYnVnaW5mby0+Y2xpZW50bW9uaXRvcl9sYXRlbmN5ID0KKwkJCW1vbml0b3JwYWdlLT5sYXRlbmN5W21vbml0b3JfZ3JvdXBdW21vbml0b3Jfb2Zmc2V0XTsKKwlkZWJ1Z2luZm8tPmNsaWVudG1vbml0b3JfY29ubmVjdGlvbmlkID0KKwkJCW1vbml0b3JwYWdlLT5wYXJhbWV0ZXJbbW9uaXRvcl9ncm91cF0KKwkJCQkJW21vbml0b3Jfb2Zmc2V0XS5jb25uZWN0aW9uaWQudS5pZDsKIAotCVJpbmdCdWZmZXJHZXREZWJ1Z0luZm8oJmNoYW5uZWwtPkluYm91bmQsICZkZWJ1Z2luZm8tPkluYm91bmQpOwotCVJpbmdCdWZmZXJHZXREZWJ1Z0luZm8oJmNoYW5uZWwtPk91dGJvdW5kLCAmZGVidWdpbmZvLT5PdXRib3VuZCk7CisJcmluZ2J1ZmZlcl9nZXRfZGVidWdpbmZvKCZjaGFubmVsLT5pbmJvdW5kLCAmZGVidWdpbmZvLT5pbmJvdW5kKTsKKwlyaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oJmNoYW5uZWwtPm91dGJvdW5kLCAmZGVidWdpbmZvLT5vdXRib3VuZCk7CiB9CiAKIC8qCkBAIC0xNzYsMTEgKzE3NiwxMSBAQAogCS8qIEFTU0VSVCghKFNlbmRSaW5nQnVmZmVyU2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpOyAqLwogCS8qIEFTU0VSVCghKFJlY3ZSaW5nQnVmZmVyU2l6ZSAmIChQQUdFX1NJWkUgLSAxKSkpOyAqLwogCi0JbmV3Y2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPSBvbmNoYW5uZWxjYWxsYmFjazsKLQluZXdjaGFubmVsLT5DaGFubmVsQ2FsbGJhY2tDb250ZXh0ID0gY29udGV4dDsKKwluZXdjaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPSBvbmNoYW5uZWxjYWxsYmFjazsKKwluZXdjaGFubmVsLT5jaGFubmVsX2NhbGxiYWNrX2NvbnRleHQgPSBjb250ZXh0OwogCiAJLyogQWxsb2NhdGUgdGhlIHJpbmcgYnVmZmVyICovCi0Jb3V0ID0gb3NkX1BhZ2VBbGxvYygoc2VuZF9yaW5nYnVmZmVyX3NpemUgKyByZWN2X3JpbmdidWZmZXJfc2l6ZSkKKwlvdXQgPSBvc2RfcGFnZV9hbGxvYygoc2VuZF9yaW5nYnVmZmVyX3NpemUgKyByZWN2X3JpbmdidWZmZXJfc2l6ZSkKIAkJCSAgICAgPj4gUEFHRV9TSElGVCk7CiAJaWYgKCFvdXQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTg5LDE3ICsxODksMTcgQEAKIAogCWluID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpb3V0ICsgc2VuZF9yaW5nYnVmZmVyX3NpemUpOwogCi0JbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlclBhZ2VzID0gb3V0OwotCW5ld2NoYW5uZWwtPlJpbmdCdWZmZXJQYWdlQ291bnQgPSAoc2VuZF9yaW5nYnVmZmVyX3NpemUgKworCW5ld2NoYW5uZWwtPnJpbmdidWZmZXJfcGFnZXMgPSBvdXQ7CisJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlY291bnQgPSAoc2VuZF9yaW5nYnVmZmVyX3NpemUgKwogCQkJCQkgICByZWN2X3JpbmdidWZmZXJfc2l6ZSkgPj4gUEFHRV9TSElGVDsKIAotCXJldCA9IFJpbmdCdWZmZXJJbml0KCZuZXdjaGFubmVsLT5PdXRib3VuZCwgb3V0LCBzZW5kX3JpbmdidWZmZXJfc2l6ZSk7CisJcmV0ID0gcmluZ2J1ZmZlcl9pbml0KCZuZXdjaGFubmVsLT5vdXRib3VuZCwgb3V0LCBzZW5kX3JpbmdidWZmZXJfc2l6ZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKIAkJZ290byBlcnJvcm91dDsKIAl9CiAKLQlyZXQgPSBSaW5nQnVmZmVySW5pdCgmbmV3Y2hhbm5lbC0+SW5ib3VuZCwgaW4sIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKTsKKwlyZXQgPSByaW5nYnVmZmVyX2luaXQoJm5ld2NoYW5uZWwtPmluYm91bmQsIGluLCByZWN2X3JpbmdidWZmZXJfc2l6ZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKIAkJZ290byBlcnJvcm91dDsKQEAgLTIxMCwxMyArMjEwLDEzIEBACiAJRFBSSU5UX0RCRyhWTUJVUywgIkVzdGFibGlzaGluZyByaW5nIGJ1ZmZlcidzIGdwYWRsIGZvciBjaGFubmVsICVwLi4uIiwKIAkJICAgbmV3Y2hhbm5lbCk7CiAKLQluZXdjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUgPSAwOworCW5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUgPSAwOwogCiAJcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKG5ld2NoYW5uZWwsCi0JCQkJCSBuZXdjaGFubmVsLT5PdXRib3VuZC5SaW5nQnVmZmVyLAorCQkJCQkgbmV3Y2hhbm5lbC0+b3V0Ym91bmQucmluZ19idWZmZXIsCiAJCQkJCSBzZW5kX3JpbmdidWZmZXJfc2l6ZSArCiAJCQkJCSByZWN2X3JpbmdidWZmZXJfc2l6ZSwKLQkJCQkJICZuZXdjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUpOworCQkJCQkgJm5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKQEAgLTIyNSwxMiArMjI1LDEyIEBACiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiY2hhbm5lbCAlcCA8cmVsaWQgJWQgZ3BhZGwgMHgleCBzZW5kIHJpbmcgJXAgIgogCQkgICAic2l6ZSAlZCByZWN2IHJpbmcgJXAgc2l6ZSAlZCwgZG93bnN0cmVhbW9mZnNldCAlZD4iLAotCQkgICBuZXdjaGFubmVsLCBuZXdjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkLAotCQkgICBuZXdjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUsCi0JCSAgIG5ld2NoYW5uZWwtPk91dGJvdW5kLlJpbmdCdWZmZXIsCi0JCSAgIG5ld2NoYW5uZWwtPk91dGJvdW5kLlJpbmdTaXplLAotCQkgICBuZXdjaGFubmVsLT5JbmJvdW5kLlJpbmdCdWZmZXIsCi0JCSAgIG5ld2NoYW5uZWwtPkluYm91bmQuUmluZ1NpemUsCisJCSAgIG5ld2NoYW5uZWwsIG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkLAorCQkgICBuZXdjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlLAorCQkgICBuZXdjaGFubmVsLT5vdXRib3VuZC5yaW5nX2J1ZmZlciwKKwkJICAgbmV3Y2hhbm5lbC0+b3V0Ym91bmQucmluZ19zaXplLAorCQkgICBuZXdjaGFubmVsLT5pbmJvdW5kLnJpbmdfYnVmZmVyLAorCQkgICBuZXdjaGFubmVsLT5pbmJvdW5kLnJpbmdfc2l6ZSwKIAkJICAgc2VuZF9yaW5nYnVmZmVyX3NpemUpOwogCiAJLyogQ3JlYXRlIGFuZCBpbml0IHRoZSBjaGFubmVsIG9wZW4gbWVzc2FnZSAqLwpAQCAtMjQyLDIwICsyNDIsMjAgQEAKIAkJZ290byBlcnJvcm91dDsKIAl9CiAKLQlvcGVuSW5mby0+V2FpdEV2ZW50ID0gb3NkX1dhaXRFdmVudENyZWF0ZSgpOwotCWlmICghb3BlbkluZm8tPldhaXRFdmVudCkgeworCW9wZW5JbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghb3BlbkluZm8tPndhaXRldmVudCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yb3V0OwogCX0KIAotCW9wZW5Nc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopb3BlbkluZm8tPk1zZzsKLQlvcGVuTXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsOwotCW9wZW5Nc2ctPk9wZW5JZCA9IG5ld2NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7IC8qIEZJWE1FICovCi0Jb3Blbk1zZy0+Q2hpbGRSZWxJZCA9IG5ld2NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7Ci0Jb3Blbk1zZy0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlID0gbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlOwotCW9wZW5Nc2ctPkRvd25zdHJlYW1SaW5nQnVmZmVyUGFnZU9mZnNldCA9IHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+CisJb3Blbk1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwgKilvcGVuSW5mby0+bXNnOworCW9wZW5Nc2ctPmhlYWRlci5tc2d0eXBlID0gQ0hBTk5FTE1TR19PUEVOQ0hBTk5FTDsKKwlvcGVuTXNnLT5vcGVuaWQgPSBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsgLyogRklYTUUgKi8KKwlvcGVuTXNnLT5jaGlsZF9yZWxpZCA9IG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOworCW9wZW5Nc2ctPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUgPSBuZXdjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlOworCW9wZW5Nc2ctPmRvd25zdHJlYW1fcmluZ2J1ZmZlcl9wYWdlb2Zmc2V0ID0gc2VuZF9yaW5nYnVmZmVyX3NpemUgPj4KIAkJCQkJCSAgUEFHRV9TSElGVDsKLQlvcGVuTXNnLT5TZXJ2ZXJDb250ZXh0QXJlYUdwYWRsSGFuZGxlID0gMDsgLyogVE9ETyAqLworCW9wZW5Nc2ctPnNlcnZlcl9jb250ZXh0YXJlYV9ncGFkbGhhbmRsZSA9IDA7IC8qIFRPRE8gKi8KIAogCWlmICh1c2VyZGF0YWxlbiA+IE1BWF9VU0VSX0RFRklORURfQllURVMpIHsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTI2MywxMCArMjYzLDEwIEBACiAJfQogCiAJaWYgKHVzZXJkYXRhbGVuKQotCQltZW1jcHkob3Blbk1zZy0+VXNlckRhdGEsIHVzZXJkYXRhLCB1c2VyZGF0YWxlbik7CisJCW1lbWNweShvcGVuTXNnLT51c2VyZGF0YSwgdXNlcmRhdGEsIHVzZXJkYXRhbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm9wZW5JbmZvLT5Nc2dMaXN0RW50cnksCisJbGlzdF9hZGRfdGFpbCgmb3BlbkluZm8tPm1zZ2xpc3RlbnRyeSwKIAkJICAgICAgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbE1zZ0xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKQEAgLTI4MCwyNyArMjgwLDI3IEBACiAJfQogCiAJLyogRklYTUU6IE5lZWQgdG8gdGltZS1vdXQgaGVyZSAqLwotCW9zZF9XYWl0RXZlbnRXYWl0KG9wZW5JbmZvLT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChvcGVuSW5mby0+d2FpdGV2ZW50KTsKIAotCWlmIChvcGVuSW5mby0+UmVzcG9uc2UuT3BlblJlc3VsdC5TdGF0dXMgPT0gMCkKKwlpZiAob3BlbkluZm8tPnJlc3BvbnNlLm9wZW5fcmVzdWx0LnN0YXR1cyA9PSAwKQogCQlEUFJJTlRfSU5GTyhWTUJVUywgImNoYW5uZWwgPCVwPiBvcGVuIHN1Y2Nlc3MhISIsIG5ld2NoYW5uZWwpOwogCWVsc2UKIAkJRFBSSU5UX0lORk8oVk1CVVMsICJjaGFubmVsIDwlcD4gb3BlbiBmYWlsZWQgLSAlZCEhIiwKLQkJCSAgICBuZXdjaGFubmVsLCBvcGVuSW5mby0+UmVzcG9uc2UuT3BlblJlc3VsdC5TdGF0dXMpOworCQkJICAgIG5ld2NoYW5uZWwsIG9wZW5JbmZvLT5yZXNwb25zZS5vcGVuX3Jlc3VsdC5zdGF0dXMpOwogCiBDbGVhbnVwOgogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZvcGVuSW5mby0+TXNnTGlzdEVudHJ5KTsKKwlsaXN0X2RlbCgmb3BlbkluZm8tPm1zZ2xpc3RlbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKG9wZW5JbmZvLT5XYWl0RXZlbnQpOworCWtmcmVlKG9wZW5JbmZvLT53YWl0ZXZlbnQpOwogCWtmcmVlKG9wZW5JbmZvKTsKIAlyZXR1cm4gMDsKIAogZXJyb3JvdXQ6Ci0JUmluZ0J1ZmZlckNsZWFudXAoJm5ld2NoYW5uZWwtPk91dGJvdW5kKTsKLQlSaW5nQnVmZmVyQ2xlYW51cCgmbmV3Y2hhbm5lbC0+SW5ib3VuZCk7Ci0Jb3NkX1BhZ2VGcmVlKG91dCwgKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpCisJcmluZ2J1ZmZlcl9jbGVhbnVwKCZuZXdjaGFubmVsLT5vdXRib3VuZCk7CisJcmluZ2J1ZmZlcl9jbGVhbnVwKCZuZXdjaGFubmVsLT5pbmJvdW5kKTsKKwlvc2RfcGFnZV9mcmVlKG91dCwgKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpCiAJCSAgICAgPj4gUEFHRV9TSElGVCk7CiAJa2ZyZWUob3BlbkluZm8pOwogCXJldHVybiBlcnI7CkBAIC0zMjIsNyArMzIyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBwZm5jb3VudDsgaSsrKQogCQlEUFJJTlRfREJHKFZNQlVTLCAiZ3BhZGwgYm9keSAgLSAlZCkgcGZuICVsbHUiLAotCQkJICAgaSwgZ3BhZGwtPlBmbltpXSk7CisJCQkgICBpLCBncGFkbC0+cGZuW2ldKTsKIH0KIAogLyoKQEAgLTMzNiwxOCArMzM2LDE4IEBACiAKIAlEUFJJTlRfREJHKFZNQlVTLAogCQkgICAiZ3BhZGwgaGVhZGVyIC0gcmVsaWQgJWQsIHJhbmdlIGNvdW50ICVkLCByYW5nZSBidWZsZW4gJWQiLAotCQkgICBncGFkbC0+Q2hpbGRSZWxJZCwgZ3BhZGwtPlJhbmdlQ291bnQsIGdwYWRsLT5SYW5nZUJ1Zkxlbik7Ci0JZm9yIChpID0gMDsgaSA8IGdwYWRsLT5SYW5nZUNvdW50OyBpKyspIHsKLQkJcGFnZWNvdW50ID0gZ3BhZGwtPlJhbmdlW2ldLkJ5dGVDb3VudCA+PiBQQUdFX1NISUZUOworCQkgICBncGFkbC0+Y2hpbGRfcmVsaWQsIGdwYWRsLT5yYW5nZWNvdW50LCBncGFkbC0+cmFuZ2VfYnVmbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ3BhZGwtPnJhbmdlY291bnQ7IGkrKykgeworCQlwYWdlY291bnQgPSBncGFkbC0+cmFuZ2VbaV0uQnl0ZUNvdW50ID4+IFBBR0VfU0hJRlQ7CiAJCXBhZ2Vjb3VudCA9IChwYWdlY291bnQgPiAyNikgPyAyNiA6IHBhZ2Vjb3VudDsKIAogCQlEUFJJTlRfREJHKFZNQlVTLCAiZ3BhZGwgcmFuZ2UgJWQgLSBsZW4gJWQgb2Zmc2V0ICVkICIKLQkJCSAgICJwYWdlIGNvdW50ICVkIiwgaSwgZ3BhZGwtPlJhbmdlW2ldLkJ5dGVDb3VudCwKLQkJCSAgIGdwYWRsLT5SYW5nZVtpXS5CeXRlT2Zmc2V0LCBwYWdlY291bnQpOworCQkJICAgInBhZ2UgY291bnQgJWQiLCBpLCBncGFkbC0+cmFuZ2VbaV0uQnl0ZUNvdW50LAorCQkJICAgZ3BhZGwtPnJhbmdlW2ldLkJ5dGVPZmZzZXQsIHBhZ2Vjb3VudCk7CiAKIAkJZm9yIChqID0gMDsgaiA8IHBhZ2Vjb3VudDsgaisrKQogCQkJRFBSSU5UX0RCRyhWTUJVUywgIiVkKSBwZm4gJWxsdSIsIGosCi0JCQkJICAgZ3BhZGwtPlJhbmdlW2ldLlBmbkFycmF5W2pdKTsKKwkJCQkgICBncGFkbC0+cmFuZ2VbaV0uUGZuQXJyYXlbal0pOwogCX0KIH0KIApAQCAtMzkxLDE4ICszOTEsMTggQEAKIAkJaWYgKCFtc2doZWFkZXIpCiAJCQlnb3RvIG5vbWVtOwogCi0JCUlOSVRfTElTVF9IRUFEKCZtc2doZWFkZXItPlN1Yk1zZ0xpc3QpOwotCQltc2doZWFkZXItPk1lc3NhZ2VTaXplID0gbXNnc2l6ZTsKKwkJSU5JVF9MSVNUX0hFQUQoJm1zZ2hlYWRlci0+c3VibXNnbGlzdCk7CisJCW1zZ2hlYWRlci0+bXNnc2l6ZSA9IG1zZ3NpemU7CiAKIAkJZ3BhZGxfaGVhZGVyID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqKQotCQkJbXNnaGVhZGVyLT5Nc2c7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VDb3VudCA9IDE7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VCdWZMZW4gPSBzaXplb2Yoc3RydWN0IGdwYV9yYW5nZSkgKworCQkJbXNnaGVhZGVyLT5tc2c7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2Vjb3VudCA9IDE7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VfYnVmbGVuID0gc2l6ZW9mKHN0cnVjdCBncGFfcmFuZ2UpICsKIAkJCQkJIHBhZ2Vjb3VudCAqIHNpemVvZih1NjQpOwotCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLkJ5dGVPZmZzZXQgPSAwOwotCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLkJ5dGVDb3VudCA9IHNpemU7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uQnl0ZU9mZnNldCA9IDA7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uQnl0ZUNvdW50ID0gc2l6ZTsKIAkJZm9yIChpID0gMDsgaSA8IHBmbmNvdW50OyBpKyspCi0JCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLlBmbkFycmF5W2ldID0gcGZuK2k7CisJCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLlBmbkFycmF5W2ldID0gcGZuK2k7CiAJCSptc2dpbmZvID0gbXNnaGVhZGVyOwogCQkqbWVzc2FnZWNvdW50ID0gMTsKIApAQCAtNDI4LDEwICs0MjgsMTAgQEAKIAkJCS8qIEZJWE1FOiB3ZSBwcm9iYWJseSBuZWVkIHRvIG1vcmUgaWYgdGhpcyBmYWlscyAqLwogCQkJaWYgKCFtc2dib2R5KQogCQkJCWdvdG8gbm9tZW07Ci0JCQltc2dib2R5LT5NZXNzYWdlU2l6ZSA9IG1zZ3NpemU7CisJCQltc2dib2R5LT5tc2dzaXplID0gbXNnc2l6ZTsKIAkJCSgqbWVzc2FnZWNvdW50KSsrOwogCQkJZ3BhZGxfYm9keSA9Ci0JCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKiltc2dib2R5LT5Nc2c7CisJCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKiltc2dib2R5LT5tc2c7CiAKIAkJCS8qCiAJCQkgKiBGSVhNRToKQEAgLTQ0MCwxMSArNDQwLDExIEBACiAJCQkgKi8KIAkJCS8qIGdwYWRsX2JvZHktPkdwYWRsID0ga2J1ZmZlcjsgKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBwZm5jdXJyOyBpKyspCi0JCQkJZ3BhZGxfYm9keS0+UGZuW2ldID0gcGZuICsgcGZuc3VtICsgaTsKKwkJCQlncGFkbF9ib2R5LT5wZm5baV0gPSBwZm4gKyBwZm5zdW0gKyBpOwogCiAJCQkvKiBhZGQgdG8gbXNnIGhlYWRlciAqLwotCQkJbGlzdF9hZGRfdGFpbCgmbXNnYm9keS0+TXNnTGlzdEVudHJ5LAotCQkJCSAgICAgICZtc2doZWFkZXItPlN1Yk1zZ0xpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmbXNnYm9keS0+bXNnbGlzdGVudHJ5LAorCQkJCSAgICAgICZtc2doZWFkZXItPnN1Ym1zZ2xpc3QpOwogCQkJcGZuc3VtICs9IHBmbmN1cnI7CiAJCQlwZm5sZWZ0IC09IHBmbmN1cnI7CiAJCX0KQEAgLTQ1NiwxNyArNDU2LDE3IEBACiAJCW1zZ2hlYWRlciA9IGt6YWxsb2MobXNnc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChtc2doZWFkZXIgPT0gTlVMTCkKIAkJCWdvdG8gbm9tZW07Ci0JCW1zZ2hlYWRlci0+TWVzc2FnZVNpemUgPSBtc2dzaXplOworCQltc2doZWFkZXItPm1zZ3NpemUgPSBtc2dzaXplOwogCiAJCWdwYWRsX2hlYWRlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKikKLQkJCW1zZ2hlYWRlci0+TXNnOwotCQlncGFkbF9oZWFkZXItPlJhbmdlQ291bnQgPSAxOwotCQlncGFkbF9oZWFkZXItPlJhbmdlQnVmTGVuID0gc2l6ZW9mKHN0cnVjdCBncGFfcmFuZ2UpICsKKwkJCW1zZ2hlYWRlci0+bXNnOworCQlncGFkbF9oZWFkZXItPnJhbmdlY291bnQgPSAxOworCQlncGFkbF9oZWFkZXItPnJhbmdlX2J1ZmxlbiA9IHNpemVvZihzdHJ1Y3QgZ3BhX3JhbmdlKSArCiAJCQkJCSBwYWdlY291bnQgKiBzaXplb2YodTY0KTsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5CeXRlT2Zmc2V0ID0gMDsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5CeXRlQ291bnQgPSBzaXplOworCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLkJ5dGVPZmZzZXQgPSAwOworCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLkJ5dGVDb3VudCA9IHNpemU7CiAJCWZvciAoaSA9IDA7IGkgPCBwYWdlY291bnQ7IGkrKykKLQkJCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uUGZuQXJyYXlbaV0gPSBwZm4raTsKKwkJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uUGZuQXJyYXlbaV0gPSBwZm4raTsKIAogCQkqbXNnaW5mbyA9IG1zZ2hlYWRlcjsKIAkJKm1lc3NhZ2Vjb3VudCA9IDE7CkBAIC01MDgsMjEgKzUwOCwyMSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQltc2dpbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFtc2dpbmZvLT5XYWl0RXZlbnQpIHsKKwltc2dpbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghbXNnaW5mby0+d2FpdGV2ZW50KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlncGFkbG1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7Ci0JZ3BhZGxtc2ctPkhlYWRlci5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlR3BhZGxIZWFkZXI7Ci0JZ3BhZGxtc2ctPkNoaWxkUmVsSWQgPSBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkOwotCWdwYWRsbXNnLT5HcGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOworCWdwYWRsbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKKwlncGFkbG1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX0dQQURMX0hFQURFUjsKKwlncGFkbG1zZy0+Y2hpbGRfcmVsaWQgPSBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKKwlncGFkbG1zZy0+Z3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKIAogCWR1bXBfZ3BhZGxfaGVhZGVyKGdwYWRsbXNnKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm1zZ2luZm8tPk1zZ0xpc3RFbnRyeSwKKwlsaXN0X2FkZF90YWlsKCZtc2dpbmZvLT5tc2dsaXN0ZW50cnksCiAJCSAgICAgICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxNc2dMaXN0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CkBAIC01MzAsOSArNTMwLDkgQEAKIAkJICAga2J1ZmZlciwgc2l6ZSwgbXNnY291bnQpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIlNlbmRpbmcgR1BBREwgSGVhZGVyIC0gbGVuICV6ZCIsCi0JCSAgIG1zZ2luZm8tPk1lc3NhZ2VTaXplIC0gc2l6ZW9mKCptc2dpbmZvKSk7CisJCSAgIG1zZ2luZm8tPm1zZ3NpemUgLSBzaXplb2YoKm1zZ2luZm8pKTsKIAotCXJldCA9IFZtYnVzUG9zdE1lc3NhZ2UoZ3BhZGxtc2csIG1zZ2luZm8tPk1lc3NhZ2VTaXplIC0KKwlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKGdwYWRsbXNnLCBtc2dpbmZvLT5tc2dzaXplIC0KIAkJCSAgICAgICBzaXplb2YoKm1zZ2luZm8pKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVUywgIlVuYWJsZSB0byBvcGVuIGNoYW5uZWwgLSAlZCIsIHJldCk7CkBAIC01NDAsNDggKzU0MCw0OCBAQAogCX0KIAogCWlmIChtc2djb3VudCA+IDEpIHsKLQkJbGlzdF9mb3JfZWFjaChjdXJyLCAmbXNnaW5mby0+U3ViTXNnTGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoKGN1cnIsICZtc2dpbmZvLT5zdWJtc2dsaXN0KSB7CiAKIAkJCS8qIEZJWE1FOiBzaG91bGQgdGhpcyB1c2UgbGlzdF9lbnRyeSgpIGluc3RlYWQgPyAqLwogCQkJc3VibXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKIAkJCWdwYWRsX2JvZHkgPQotCQkJICAgICAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPk1zZzsKKwkJCSAgICAgKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKilzdWJtc2dpbmZvLT5tc2c7CiAKLQkJCWdwYWRsX2JvZHktPkhlYWRlci5NZXNzYWdlVHlwZSA9Ci0JCQkJQ2hhbm5lbE1lc3NhZ2VHcGFkbEJvZHk7Ci0JCQlncGFkbF9ib2R5LT5HcGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOworCQkJZ3BhZGxfYm9keS0+aGVhZGVyLm1zZ3R5cGUgPQorCQkJCUNIQU5ORUxNU0dfR1BBRExfQk9EWTsKKwkJCWdwYWRsX2JvZHktPmdwYWRsID0gbmV4dF9ncGFkbF9oYW5kbGU7CiAKIAkJCURQUklOVF9EQkcoVk1CVVMsICJTZW5kaW5nIEdQQURMIEJvZHkgLSBsZW4gJXpkIiwKLQkJCQkgICBzdWJtc2dpbmZvLT5NZXNzYWdlU2l6ZSAtCisJCQkJICAgc3VibXNnaW5mby0+bXNnc2l6ZSAtCiAJCQkJICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CiAKLQkJCWR1bXBfZ3BhZGxfYm9keShncGFkbF9ib2R5LCBzdWJtc2dpbmZvLT5NZXNzYWdlU2l6ZSAtCisJCQlkdW1wX2dwYWRsX2JvZHkoZ3BhZGxfYm9keSwgc3VibXNnaW5mby0+bXNnc2l6ZSAtCiAJCQkJICAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CiAJCQlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKGdwYWRsX2JvZHksCi0JCQkJCSAgICAgICBzdWJtc2dpbmZvLT5NZXNzYWdlU2l6ZSAtCisJCQkJCSAgICAgICBzdWJtc2dpbmZvLT5tc2dzaXplIC0KIAkJCQkJICAgICAgIHNpemVvZigqc3VibXNnaW5mbykpOwogCQkJaWYgKHJldCAhPSAwKQogCQkJCWdvdG8gQ2xlYW51cDsKIAogCQl9CiAJfQotCW9zZF9XYWl0RXZlbnRXYWl0KG1zZ2luZm8tPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KG1zZ2luZm8tPndhaXRldmVudCk7CiAKIAkvKiBBdCB0aGlzIHBvaW50LCB3ZSByZWNlaXZlZCB0aGUgZ3BhZGwgY3JlYXRlZCBtc2cgKi8KIAlEUFJJTlRfREJHKFZNQlVTLCAiUmVjZWl2ZWQgR1BBREwgY3JlYXRlZCAiCiAJCSAgICIocmVsaWQgJWQsIHN0YXR1cyAlZCBoYW5kbGUgJXgpIiwKLQkJICAgY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCwKLQkJICAgbXNnaW5mby0+UmVzcG9uc2UuR3BhZGxDcmVhdGVkLkNyZWF0aW9uU3RhdHVzLAotCQkgICBncGFkbG1zZy0+R3BhZGwpOworCQkgICBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCwKKwkJICAgbXNnaW5mby0+cmVzcG9uc2UuZ3BhZGxfY3JlYXRlZC5jcmVhdGlvbl9zdGF0dXMsCisJCSAgIGdwYWRsbXNnLT5ncGFkbCk7CiAKLQkqZ3BhZGxfaGFuZGxlID0gZ3BhZGxtc2ctPkdwYWRsOworCSpncGFkbF9oYW5kbGUgPSBncGFkbG1zZy0+Z3BhZGw7CiAKIENsZWFudXA6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJm1zZ2luZm8tPk1zZ0xpc3RFbnRyeSk7CisJbGlzdF9kZWwoJm1zZ2luZm8tPm1zZ2xpc3RlbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKG1zZ2luZm8tPldhaXRFdmVudCk7CisJa2ZyZWUobXNnaW5mby0+d2FpdGV2ZW50KTsKIAlrZnJlZShtc2dpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjA0LDIwICs2MDQsMjAgQEAKIAlpZiAoIWluZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5mby0+V2FpdEV2ZW50ID0gb3NkX1dhaXRFdmVudENyZWF0ZSgpOwotCWlmICghaW5mby0+V2FpdEV2ZW50KSB7CisJaW5mby0+d2FpdGV2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIWluZm8tPndhaXRldmVudCkgewogCQlrZnJlZShpbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3RlYXJkb3duICopaW5mby0+TXNnOworCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90ZWFyZG93biAqKWluZm8tPm1zZzsKIAotCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VHcGFkbFRlYXJkb3duOwotCW1zZy0+Q2hpbGRSZWxJZCA9IGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7Ci0JbXNnLT5HcGFkbCA9IGdwYWRsX2hhbmRsZTsKKwltc2ctPmhlYWRlci5tc2d0eXBlID0gQ0hBTk5FTE1TR19HUEFETF9URUFSRE9XTjsKKwltc2ctPmNoaWxkX3JlbGlkID0gY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJbXNnLT5ncGFkbCA9IGdwYWRsX2hhbmRsZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmluZm8tPk1zZ0xpc3RFbnRyeSwKKwlsaXN0X2FkZF90YWlsKCZpbmZvLT5tc2dsaXN0ZW50cnksCiAJCSAgICAgICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxNc2dMaXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCkBAIC02MjgsMTQgKzYyOCwxNCBAQAogCQkvKiBzb21ldGhpbmcuLi4gKi8KIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChpbmZvLT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChpbmZvLT53YWl0ZXZlbnQpOwogCiAJLyogUmVjZWl2ZWQgYSB0b3JuZG93biByZXNwb25zZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZpbmZvLT5Nc2dMaXN0RW50cnkpOworCWxpc3RfZGVsKCZpbmZvLT5tc2dsaXN0ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKLQlrZnJlZShpbmZvLT5XYWl0RXZlbnQpOworCWtmcmVlKGluZm8tPndhaXRldmVudCk7CiAJa2ZyZWUoaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY1Miw3ICs2NTIsNyBAQAogCWludCByZXQ7CiAKIAkvKiBTdG9wIGNhbGxiYWNrIGFuZCBjYW5jZWwgdGhlIHRpbWVyIGFzYXAgKi8KLQljaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9IE5VTEw7CisJY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0gTlVMTDsKIAlkZWxfdGltZXJfc3luYygmY2hhbm5lbC0+cG9sbF90aW1lcik7CiAKIAkvKiBTZW5kIGEgY2xvc2luZyBtZXNzYWdlICovCkBAIC02NjMsMTEgKzY2MywxMSBAQAogCWlmICghaW5mbykKIAkJcmV0dXJuOwogCi0JLyogaW5mby0+d2FpdEV2ZW50ID0gb3NkX1dhaXRFdmVudENyZWF0ZSgpOyAqLworCS8qIGluZm8tPndhaXRFdmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7ICovCiAKLQltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfY2xvc2VfY2hhbm5lbCAqKWluZm8tPk1zZzsKLQltc2ctPkhlYWRlci5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlQ2xvc2VDaGFubmVsOwotCW1zZy0+Q2hpbGRSZWxJZCA9IGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7CisJbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgKilpbmZvLT5tc2c7CisJbXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfQ0xPU0VDSEFOTkVMOworCW1zZy0+Y2hpbGRfcmVsaWQgPSBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKIAogCXJldCA9IFZtYnVzUG9zdE1lc3NhZ2UobXNnLCBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfY2xvc2VfY2hhbm5lbCkpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNjc2LDE3ICs2NzYsMTcgQEAKIAl9CiAKIAkvKiBUZWFyIGRvd24gdGhlIGdwYWRsIGZvciB0aGUgY2hhbm5lbCdzIHJpbmcgYnVmZmVyICovCi0JaWYgKGNoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSkKKwlpZiAoY2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSkKIAkJdm1idXNfdGVhcmRvd25fZ3BhZGwoY2hhbm5lbCwKLQkJCQkJICBjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUpOworCQkJCQkgIGNoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUpOwogCiAJLyogVE9ETzogU2VuZCBhIG1zZyB0byByZWxlYXNlIHRoZSBjaGlsZFJlbElkICovCiAKIAkvKiBDbGVhbnVwIHRoZSByaW5nIGJ1ZmZlcnMgZm9yIHRoaXMgY2hhbm5lbCAqLwotCVJpbmdCdWZmZXJDbGVhbnVwKCZjaGFubmVsLT5PdXRib3VuZCk7Ci0JUmluZ0J1ZmZlckNsZWFudXAoJmNoYW5uZWwtPkluYm91bmQpOworCXJpbmdidWZmZXJfY2xlYW51cCgmY2hhbm5lbC0+b3V0Ym91bmQpOworCXJpbmdidWZmZXJfY2xlYW51cCgmY2hhbm5lbC0+aW5ib3VuZCk7CiAKLQlvc2RfUGFnZUZyZWUoY2hhbm5lbC0+UmluZ0J1ZmZlclBhZ2VzLCBjaGFubmVsLT5SaW5nQnVmZmVyUGFnZUNvdW50KTsKKwlvc2RfcGFnZV9mcmVlKGNoYW5uZWwtPnJpbmdidWZmZXJfcGFnZXMsIGNoYW5uZWwtPnJpbmdidWZmZXJfcGFnZWNvdW50KTsKIAogCWtmcmVlKGluZm8pOwogCkBAIC02OTYsOSArNjk2LDkgQEAKIAkgKiBjYWxsZXIgd2lsbCBmcmVlIHRoZSBjaGFubmVsCiAJICovCiAKLQlpZiAoY2hhbm5lbC0+U3RhdGUgPT0gQ0hBTk5FTF9PUEVOX1NUQVRFKSB7CisJaWYgKGNoYW5uZWwtPnN0YXRlID09IENIQU5ORUxfT1BFTl9TVEFURSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9kZWwoJmNoYW5uZWwtPkxpc3RFbnRyeSk7CisJCWxpc3RfZGVsKCZjaGFubmVsLT5saXN0ZW50cnkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJCWZyZWVfY2hhbm5lbChjaGFubmVsKTsKQEAgLTc1MiwxMCArNzUyLDEwIEBACiAJc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKIAkJICAgcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCi0JcmV0ID0gUmluZ0J1ZmZlcldyaXRlKCZjaGFubmVsLT5PdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CisJcmV0ID0gcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOwogCiAJLyogVE9ETzogV2Ugc2hvdWxkIGRldGVybWluZSBpZiB0aGlzIGlzIG9wdGlvbmFsICovCi0JaWYgKHJldCA9PSAwICYmICFHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzaygmY2hhbm5lbC0+T3V0Ym91bmQpKQorCWlmIChyZXQgPT0gMCAmJiAhZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soJmNoYW5uZWwtPm91dGJvdW5kKSkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtODE3LDEwICs4MTcsMTAgQEAKIAlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAogCQlwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKLQlyZXQgPSBSaW5nQnVmZmVyV3JpdGUoJmNoYW5uZWwtPk91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKKwlyZXQgPSByaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CiAKIAkvKiBUT0RPOiBXZSBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgb3B0aW9uYWwgKi8KLQlpZiAocmV0ID09IDAgJiYgIUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCZjaGFubmVsLT5PdXRib3VuZCkpCisJaWYgKHJldCA9PSAwICYmICFnZXRfcmluZ2J1ZmZlcl9pbnRlcnJ1cHRfbWFzaygmY2hhbm5lbC0+b3V0Ym91bmQpKQogCQl2bWJ1c19zZXRldmVudChjaGFubmVsKTsKIAogCXJldHVybiByZXQ7CkBAIC04ODYsMTAgKzg4NiwxMCBAQAogCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCiAJCXBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAotCXJldCA9IFJpbmdCdWZmZXJXcml0ZSgmY2hhbm5lbC0+T3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOworCXJldCA9IHJpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKIAogCS8qIFRPRE86IFdlIHNob3VsZCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBvcHRpb25hbCAqLwotCWlmIChyZXQgPT0gMCAmJiAhR2V0UmluZ0J1ZmZlckludGVycnVwdE1hc2soJmNoYW5uZWwtPk91dGJvdW5kKSkKKwlpZiAocmV0ID09IDAgJiYgIWdldF9yaW5nYnVmZmVyX2ludGVycnVwdF9tYXNrKCZjaGFubmVsLT5vdXRib3VuZCkpCiAJCXZtYnVzX3NldGV2ZW50KGNoYW5uZWwpOwogCiAJcmV0dXJuIHJldDsKQEAgLTkyMyw3ICs5MjMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCi0JcmV0ID0gUmluZ0J1ZmZlclBlZWsoJmNoYW5uZWwtPkluYm91bmQsICZkZXNjLAorCXJldCA9IHJpbmdidWZmZXJfcGVlaygmY2hhbm5lbC0+aW5ib3VuZCwgJmRlc2MsCiAJCQkgICAgIHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcikpOwogCWlmIChyZXQgIT0gMCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKQEAgLTk0MCw3ICs5NDAsNyBAQAogCiAJRFBSSU5UX0RCRyhWTUJVUywgInBhY2tldCByZWNlaXZlZCBvbiBjaGFubmVsICVwIHJlbGlkICVkIDx0eXBlICVkICIKIAkJICAgImZsYWcgJWQgdGlkICVsbHggcGt0bGVuICVkIGRhdGFsZW4gJWQ+ICIsCi0JCSAgIGNoYW5uZWwsIGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQsIGRlc2MuVHlwZSwKKwkJICAgY2hhbm5lbCwgY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQsIGRlc2MuVHlwZSwKIAkJICAgZGVzYy5GbGFncywgZGVzYy5UcmFuc2FjdGlvbklkLCBwYWNrZXRsZW4sIHVzZXJsZW4pOwogCiAJKmJ1ZmZlcl9hY3R1YWxfbGVuID0gdXNlcmxlbjsKQEAgLTk1Niw3ICs5NTYsNyBAQAogCSpyZXF1ZXN0aWQgPSBkZXNjLlRyYW5zYWN0aW9uSWQ7CiAKIAkvKiBDb3B5IG92ZXIgdGhlIHBhY2tldCB0byB0aGUgdXNlciBidWZmZXIgKi8KLQlyZXQgPSBSaW5nQnVmZmVyUmVhZCgmY2hhbm5lbC0+SW5ib3VuZCwgYnVmZmVyLCB1c2VybGVuLAorCXJldCA9IHJpbmdidWZmZXJfcmVhZCgmY2hhbm5lbC0+aW5ib3VuZCwgYnVmZmVyLCB1c2VybGVuLAogCQkJICAgICAoZGVzYy5EYXRhT2Zmc2V0OCA8PCAzKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKQEAgLTk4Myw3ICs5ODMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCi0JcmV0ID0gUmluZ0J1ZmZlclBlZWsoJmNoYW5uZWwtPkluYm91bmQsICZkZXNjLAorCXJldCA9IHJpbmdidWZmZXJfcGVlaygmY2hhbm5lbC0+aW5ib3VuZCwgJmRlc2MsCiAJCQkgICAgIHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcikpOwogCWlmIChyZXQgIT0gMCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKQEAgLTk5OSw3ICs5OTksNyBAQAogCiAJRFBSSU5UX0RCRyhWTUJVUywgInBhY2tldCByZWNlaXZlZCBvbiBjaGFubmVsICVwIHJlbGlkICVkIDx0eXBlICVkICIKIAkJICAgImZsYWcgJWQgdGlkICVsbHggcGt0bGVuICVkIGRhdGFsZW4gJWQ+ICIsCi0JCSAgIGNoYW5uZWwsIGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQsIGRlc2MuVHlwZSwKKwkJICAgY2hhbm5lbCwgY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQsIGRlc2MuVHlwZSwKIAkJICAgZGVzYy5GbGFncywgZGVzYy5UcmFuc2FjdGlvbklkLCBwYWNrZXRsZW4sIHVzZXJsZW4pOwogCiAJKmJ1ZmZlcl9hY3R1YWxfbGVuID0gcGFja2V0bGVuOwpAQCAtMTAxNSw3ICsxMDE1LDcgQEAKIAkqcmVxdWVzdGlkID0gZGVzYy5UcmFuc2FjdGlvbklkOwogCiAJLyogQ29weSBvdmVyIHRoZSBlbnRpcmUgcGFja2V0IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCXJldCA9IFJpbmdCdWZmZXJSZWFkKCZjaGFubmVsLT5JbmJvdW5kLCBidWZmZXIsIHBhY2tldGxlbiwgMCk7CisJcmV0ID0gcmluZ2J1ZmZlcl9yZWFkKCZjaGFubmVsLT5pbmJvdW5kLCBidWZmZXIsIHBhY2tldGxlbiwgMCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKQEAgLTEwMzAsNyArMTAzMCw3IEBACiAJZHVtcF92bWJ1c19jaGFubmVsKGNoYW5uZWwpOwogCS8qIEFTU0VSVChDaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayk7ICovCiAKLQljaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayhjaGFubmVsLT5DaGFubmVsQ2FsbGJhY2tDb250ZXh0KTsKKwljaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2soY2hhbm5lbC0+Y2hhbm5lbF9jYWxsYmFja19jb250ZXh0KTsKIAogCW1vZF90aW1lcigmY2hhbm5lbC0+cG9sbF90aW1lciwgamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMoMTAwKSk7CiB9CkBAIC0xMDQyLDggKzEwNDIsOCBAQAogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsICopZGF0YTsKIAotCWlmIChjaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjaykKLQkJY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2soY2hhbm5lbC0+Q2hhbm5lbENhbGxiYWNrQ29udGV4dCk7CisJaWYgKGNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjaykKKwkJY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrKGNoYW5uZWwtPmNoYW5uZWxfY2FsbGJhY2tfY29udGV4dCk7CiB9CiAKIC8qCkBAIC0xMDUxLDcgKzEwNTEsNyBAQAogICovCiBzdGF0aWMgdm9pZCBkdW1wX3ZtYnVzX2NoYW5uZWwoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCiB7Ci0JRFBSSU5UX0RCRyhWTUJVUywgIkNoYW5uZWwgKCVkKSIsIGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQpOwotCUR1bXBSaW5nSW5mbygmY2hhbm5lbC0+T3V0Ym91bmQsICJPdXRib3VuZCAiKTsKLQlEdW1wUmluZ0luZm8oJmNoYW5uZWwtPkluYm91bmQsICJJbmJvdW5kICIpOworCURQUklOVF9EQkcoVk1CVVMsICJDaGFubmVsICglZCkiLCBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7CisJZHVtcF9yaW5nX2luZm8oJmNoYW5uZWwtPm91dGJvdW5kLCAiT3V0Ym91bmQgIik7CisJZHVtcF9yaW5nX2luZm8oJmNoYW5uZWwtPmluYm91bmQsICJJbmJvdW5kICIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jCmluZGV4IDQ1ZGJlMzAuLmQ0NGQ1YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMKQEAgLTI1MSw4ICsyNTEsOCBAQAogCWNoYW5uZWwtPnBvbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNoYW5uZWw7CiAJY2hhbm5lbC0+cG9sbF90aW1lci5mdW5jdGlvbiA9IHZtYnVzX29udGltZXI7CiAKLQljaGFubmVsLT5Db250cm9sV1EgPSBjcmVhdGVfd29ya3F1ZXVlKCJodl92bWJ1c19jdGwiKTsKLQlpZiAoIWNoYW5uZWwtPkNvbnRyb2xXUSkgeworCWNoYW5uZWwtPmNvbnRyb2x3cSA9IGNyZWF0ZV93b3JrcXVldWUoImh2X3ZtYnVzX2N0bCIpOworCWlmICghY2hhbm5lbC0+Y29udHJvbHdxKSB7CiAJCWtmcmVlKGNoYW5uZWwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yNjMsMTIgKzI2MywxNCBAQAogLyoKICAqIHJlbGVhc2VfaGFubmVsIC0gUmVsZWFzZSB0aGUgdm1idXMgY2hhbm5lbCBvYmplY3QgaXRzZWxmCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX2NoYW5uZWwodm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY2hhbm5lbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsLAorCQkJCQkJICAgICB3b3JrKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJyZWxlYXNpbmcgY2hhbm5lbCAoJXApIiwgY2hhbm5lbCk7Ci0JZGVzdHJveV93b3JrcXVldWUoY2hhbm5lbC0+Q29udHJvbFdRKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjaGFubmVsLT5jb250cm9sd3EpOwogCURQUklOVF9EQkcoVk1CVVMsICJjaGFubmVsIHJlbGVhc2VkICglcCkiLCBjaGFubmVsKTsKIAogCWtmcmVlKGNoYW5uZWwpOwpAQCAtMjg2LDggKzI4OCw4IEBACiAJICogd29ya3F1ZXVlL3RocmVhZCBjb250ZXh0CiAJICogaWUgd2UgY2FuJ3QgZGVzdHJveSBvdXJzZWx2ZXMuCiAJICovCi0Jb3NkX3NjaGVkdWxlX2NhbGxiYWNrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLCByZWxlYXNlX2NoYW5uZWwsCi0JCQkgICAgICBjaGFubmVsKTsKKwlJTklUX1dPUksoJmNoYW5uZWwtPndvcmssIHJlbGVhc2VfY2hhbm5lbCk7CisJcXVldWVfd29yayhnVm1idXNDb25uZWN0aW9uLldvcmtRdWV1ZSwgJmNoYW5uZWwtPndvcmspOwogfQogCiAKQEAgLTMwOCwyOSArMzEwLDQ2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIH0KIAorLyoKKyAqIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlciAtCisgKiBSZXNjaW5kIHRoZSBvZmZlciBieSBpbml0aWF0aW5nIGEgZGV2aWNlIHJlbW92YWwKKyAqLworc3RhdGljIHZvaWQgdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCwKKwkJCQkJCSAgICAgd29yayk7CisKKwl2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlcihjaGFubmVsLT5kZXZpY2Vfb2JqKTsKK30KIAogLyoKICAqIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIgLSBQcm9jZXNzIHRoZSBvZmZlciBieSBjcmVhdGluZyBhIGNoYW5uZWwvZGV2aWNlCiAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvZmZlcgogICovCi1zdGF0aWMgdm9pZCB2bWJ1c19wcm9jZXNzX29mZmVyKHZvaWQgKmNvbnRleHQpCitzdGF0aWMgdm9pZCB2bWJ1c19wcm9jZXNzX29mZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqbmV3Y2hhbm5lbCA9IGNvbnRleHQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKm5ld2NoYW5uZWwgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCwKKwkJCQkJCQl3b3JrKTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAlib29sIGZuZXcgPSB0cnVlOwogCWludCByZXQ7CiAJaW50IGNudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyogVGhlIG5leHQgcG9zc2libGUgd29yayBpcyByZXNjaW5kIGhhbmRsaW5nICovCisJSU5JVF9XT1JLKCZuZXdjaGFubmVsLT53b3JrLCB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIpOworCiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSBuZXcgb2ZmZXIgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIExpc3RFbnRyeSkgewotCQlpZiAoIW1lbWNtcCgmY2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlVHlwZSwKLQkJCSAgICAmbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlVHlwZSwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxMaXN0LCBsaXN0ZW50cnkpIHsKKwkJaWYgKCFtZW1jbXAoJmNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZVR5cGUsCisJCQkgICAgJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZVR5cGUsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSkgJiYKLQkJICAgICFtZW1jbXAoJmNoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZUluc3RhbmNlLAotCQkJICAgICZuZXdjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKKwkJICAgICFtZW1jbXAoJmNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZUluc3RhbmNlLAorCQkJICAgICZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSkgewogCQkJZm5ldyA9IGZhbHNlOwogCQkJYnJlYWs7CkBAIC0zMzgsMTQgKzM1NywxNCBAQAogCX0KIAogCWlmIChmbmV3KQotCQlsaXN0X2FkZF90YWlsKCZuZXdjaGFubmVsLT5MaXN0RW50cnksCisJCWxpc3RfYWRkX3RhaWwoJm5ld2NoYW5uZWwtPmxpc3RlbnRyeSwKIAkJCSAgICAgICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxMaXN0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWZuZXcpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgIklnbm9yaW5nIGR1cGxpY2F0ZSBvZmZlciBmb3IgcmVsaWQgKCVkKSIsCi0JCQkgICBuZXdjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkKTsKKwkJCSAgIG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKIAkJZnJlZV9jaGFubmVsKG5ld2NoYW5uZWwpOwogCQlyZXR1cm47CiAJfQpAQCAtMzU1LDI3ICszNzQsMjcgQEAKIAkgKiBXZSBuZWVkIHRvIHNldCB0aGUgRGV2aWNlT2JqZWN0IGZpZWxkIGJlZm9yZSBjYWxsaW5nCiAJICogVm1idXNDaGlsZERldmljZUFkZCgpCiAJICovCi0JbmV3Y2hhbm5lbC0+RGV2aWNlT2JqZWN0ID0gVm1idXNDaGlsZERldmljZUNyZWF0ZSgKLQkJJm5ld2NoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZVR5cGUsCi0JCSZuZXdjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKKwluZXdjaGFubmVsLT5kZXZpY2Vfb2JqID0gdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZSgKKwkJJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZVR5cGUsCisJCSZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKIAkJbmV3Y2hhbm5lbCk7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiY2hpbGQgZGV2aWNlIG9iamVjdCBhbGxvY2F0ZWQgLSAlcCIsCi0JCSAgIG5ld2NoYW5uZWwtPkRldmljZU9iamVjdCk7CisJCSAgIG5ld2NoYW5uZWwtPmRldmljZV9vYmopOwogCiAJLyoKIAkgKiBBZGQgdGhlIG5ldyBkZXZpY2UgdG8gdGhlIGJ1cy4gVGhpcyB3aWxsIGtpY2sgb2ZmIGRldmljZS1kcml2ZXIKIAkgKiBiaW5kaW5nIHdoaWNoIGV2ZW50dWFsbHkgaW52b2tlcyB0aGUgZGV2aWNlIGRyaXZlcidzIEFkZERldmljZSgpCiAJICogbWV0aG9kLgogCSAqLwotCXJldCA9IFZtYnVzQ2hpbGREZXZpY2VBZGQobmV3Y2hhbm5lbC0+RGV2aWNlT2JqZWN0KTsKKwlyZXQgPSBWbWJ1c0NoaWxkRGV2aWNlQWRkKG5ld2NoYW5uZWwtPmRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFZNQlVTLAogCQkJICAgInVuYWJsZSB0byBhZGQgY2hpbGQgZGV2aWNlIG9iamVjdCAocmVsaWQgJWQpIiwKLQkJCSAgIG5ld2NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQpOworCQkJICAgbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2RlbCgmbmV3Y2hhbm5lbC0+TGlzdEVudHJ5KTsKKwkJbGlzdF9kZWwoJm5ld2NoYW5uZWwtPmxpc3RlbnRyeSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKIAkJZnJlZV9jaGFubmVsKG5ld2NoYW5uZWwpOwpAQCAtMzg1LDExICs0MDQsMTEgQEAKIAkJICogc28gdGhhdCB3aGVuIHdlIGRvIGNsb3NlIHRoZSBjaGFubmVsIG5vcm1hbGx5LCB3ZQogCQkgKiBjYW4gY2xlYW51cCBwcm9wZXJseQogCQkgKi8KLQkJbmV3Y2hhbm5lbC0+U3RhdGUgPSBDSEFOTkVMX09QRU5fU1RBVEU7CisJCW5ld2NoYW5uZWwtPnN0YXRlID0gQ0hBTk5FTF9PUEVOX1NUQVRFOwogCiAJCS8qIE9wZW4gSUMgY2hhbm5lbHMgKi8KIAkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfTVNHX1RZUEVTOyBjbnQrKykgewotCQkJaWYgKG1lbWNtcCgmbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlVHlwZSwKKwkJCWlmIChtZW1jbXAoJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZVR5cGUsCiAJCQkJICAgJmh2X2NiX3V0aWxzW2NudF0uZGF0YSwKIAkJCQkgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSA9PSAwICYmCiAJCQkJdm1idXNfb3BlbihuZXdjaGFubmVsLCAyICogUEFHRV9TSVpFLApAQCAtNDA2LDE3ICs0MjUsNiBAQAogfQogCiAvKgotICogdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyIC0KLSAqIFJlc2NpbmQgdGhlIG9mZmVyIGJ5IGluaXRpYXRpbmcgYSBkZXZpY2UgcmVtb3ZhbAotICovCi1zdGF0aWMgdm9pZCB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIodm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7Ci0KLQlWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlKGNoYW5uZWwtPkRldmljZU9iamVjdCk7Ci19Ci0KLS8qCiAgKiB2bWJ1c19vbm9mZmVyIC0gSGFuZGxlciBmb3IgY2hhbm5lbCBvZmZlcnMgZnJvbSB2bWJ1cyBpbiBwYXJlbnQgcGFydGl0aW9uLgogICoKICAqIFdlIGlnbm9yZSBhbGwgb2ZmZXJzIGV4Y2VwdCBuZXR3b3JrIGFuZCBzdG9yYWdlIG9mZmVycy4gRm9yIGVhY2ggbmV0d29yayBhbmQKQEAgLTQzNCw3ICs0NDIsNyBAQAogCiAJb2ZmZXIgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCAqKWhkcjsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9ERVZJQ0VfQ0xBU1NFU19TVVBQT1JURUQ7IGkrKykgewotCQlpZiAobWVtY21wKCZvZmZlci0+T2ZmZXIuSW50ZXJmYWNlVHlwZSwKKwkJaWYgKG1lbWNtcCgmb2ZmZXItPm9mZmVyLkludGVyZmFjZVR5cGUsCiAJCSAgICAmZ1N1cHBvcnRlZERldmljZUNsYXNzZXNbaV0sIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpID09IDApIHsKIAkJCWZzdXBwb3J0ZWQgPSAxOwogCQkJYnJlYWs7CkBAIC00NDMsMTIgKzQ1MSwxMiBAQAogCiAJaWYgKCFmc3VwcG9ydGVkKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJJZ25vcmluZyBjaGFubmVsIG9mZmVyIG5vdGlmaWNhdGlvbiBmb3IgIgotCQkJICAgImNoaWxkIHJlbGlkICVkIiwgb2ZmZXItPkNoaWxkUmVsSWQpOworCQkJICAgImNoaWxkIHJlbGlkICVkIiwgb2ZmZXItPmNoaWxkX3JlbGlkKTsKIAkJcmV0dXJuOwogCX0KIAotCWd1aWR0eXBlID0gJm9mZmVyLT5PZmZlci5JbnRlcmZhY2VUeXBlOwotCWd1aWRpbnN0YW5jZSA9ICZvZmZlci0+T2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2U7CisJZ3VpZHR5cGUgPSAmb2ZmZXItPm9mZmVyLkludGVyZmFjZVR5cGU7CisJZ3VpZGluc3RhbmNlID0gJm9mZmVyLT5vZmZlci5JbnRlcmZhY2VJbnN0YW5jZTsKIAogCURQUklOVF9JTkZPKFZNQlVTLCAiQ2hhbm5lbCBvZmZlciBub3RpZmljYXRpb24gLSAiCiAJCSAgICAiY2hpbGQgcmVsaWQgJWQgbW9uaXRvciBpZCAlZCBhbGxvY2F0ZWQgJWQsICIKQEAgLTQ1Niw4ICs0NjQsOCBAQAogCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSAiCiAJCSAgICAiaW5zdGFuY2UgeyUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgogCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCi0JCSAgICBvZmZlci0+Q2hpbGRSZWxJZCwgb2ZmZXItPk1vbml0b3JJZCwKLQkJICAgIG9mZmVyLT5Nb25pdG9yQWxsb2NhdGVkLAorCQkgICAgb2ZmZXItPmNoaWxkX3JlbGlkLCBvZmZlci0+bW9uaXRvcmlkLAorCQkgICAgb2ZmZXItPm1vbml0b3JfYWxsb2NhdGVkLAogCQkgICAgZ3VpZHR5cGUtPmRhdGFbM10sIGd1aWR0eXBlLT5kYXRhWzJdLAogCQkgICAgZ3VpZHR5cGUtPmRhdGFbMV0sIGd1aWR0eXBlLT5kYXRhWzBdLAogCQkgICAgZ3VpZHR5cGUtPmRhdGFbNV0sIGd1aWR0eXBlLT5kYXRhWzRdLApAQCAtNDg0LDE0ICs0OTIsMTQgQEAKIAogCURQUklOVF9EQkcoVk1CVVMsICJjaGFubmVsIG9iamVjdCBhbGxvY2F0ZWQgLSAlcCIsIG5ld2NoYW5uZWwpOwogCi0JbWVtY3B5KCZuZXdjaGFubmVsLT5PZmZlck1zZywgb2ZmZXIsCisJbWVtY3B5KCZuZXdjaGFubmVsLT5vZmZlcm1zZywgb2ZmZXIsCiAJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsKSk7Ci0JbmV3Y2hhbm5lbC0+TW9uaXRvckdyb3VwID0gKHU4KW9mZmVyLT5Nb25pdG9ySWQgLyAzMjsKLQluZXdjaGFubmVsLT5Nb25pdG9yQml0ID0gKHU4KW9mZmVyLT5Nb25pdG9ySWQgJSAzMjsKKwluZXdjaGFubmVsLT5tb25pdG9yX2dycCA9ICh1OClvZmZlci0+bW9uaXRvcmlkIC8gMzI7CisJbmV3Y2hhbm5lbC0+bW9uaXRvcl9iaXQgPSAodTgpb2ZmZXItPm1vbml0b3JpZCAlIDMyOwogCiAJLyogVE9ETzogTWFrZSBzdXJlIHRoZSBvZmZlciBjb21lcyBmcm9tIG91ciBwYXJlbnQgcGFydGl0aW9uICovCi0Jb3NkX3NjaGVkdWxlX2NhbGxiYWNrKG5ld2NoYW5uZWwtPkNvbnRyb2xXUSwgdm1idXNfcHJvY2Vzc19vZmZlciwKLQkJCSAgICAgIG5ld2NoYW5uZWwpOworCUlOSVRfV09SSygmbmV3Y2hhbm5lbC0+d29yaywgdm1idXNfcHJvY2Vzc19vZmZlcik7CisJcXVldWVfd29yayhuZXdjaGFubmVsLT5jb250cm9sd3EsICZuZXdjaGFubmVsLT53b3JrKTsKIH0KIAogLyoKQEAgLTUwNSwxNiArNTEzLDE2IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7CiAKIAlyZXNjaW5kID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX3Jlc2NpbmRfb2ZmZXIgKiloZHI7Ci0JY2hhbm5lbCA9IEdldENoYW5uZWxGcm9tUmVsSWQocmVzY2luZC0+Q2hpbGRSZWxJZCk7CisJY2hhbm5lbCA9IEdldENoYW5uZWxGcm9tUmVsSWQocmVzY2luZC0+Y2hpbGRfcmVsaWQpOwogCWlmIChjaGFubmVsID09IE5VTEwpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgImNoYW5uZWwgbm90IGZvdW5kIGZvciByZWxJZCAlZCIsCi0JCQkgICByZXNjaW5kLT5DaGlsZFJlbElkKTsKKwkJCSAgIHJlc2NpbmQtPmNoaWxkX3JlbGlkKTsKIAkJcmV0dXJuOwogCX0KIAotCW9zZF9zY2hlZHVsZV9jYWxsYmFjayhjaGFubmVsLT5Db250cm9sV1EsCi0JCQkgICAgICB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIsCi0JCQkgICAgICBjaGFubmVsKTsKKwkvKiB3b3JrIGlzIGluaXRpYWxpemVkIGZvciB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIoKSBmcm9tCisJICogdm1idXNfcHJvY2Vzc19vZmZlcigpIHdoZXJlIHRoZSBjaGFubmVsIGdvdCBjcmVhdGVkICovCisJcXVldWVfd29yayhjaGFubmVsLT5jb250cm9sd3EsICZjaGFubmVsLT53b3JrKTsKIH0KIAogLyoKQEAgLTU0NSw3ICs1NTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyZXN1bHQgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9yZXN1bHQgKiloZHI7Ci0JRFBSSU5UX0RCRyhWTUJVUywgInZtYnVzIG9wZW4gcmVzdWx0IC0gJWQiLCByZXN1bHQtPlN0YXR1cyk7CisJRFBSSU5UX0RCRyhWTUJVUywgInZtYnVzIG9wZW4gcmVzdWx0IC0gJWQiLCByZXN1bHQtPnN0YXR1cyk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIG9wZW4gbXNnLCBjb3B5IHRoZSByZXN1bHQgYW5kIHNpZ25hbC91bmJsb2NrIHRoZSB3YWl0IGV2ZW50CkBAIC01NTYsMTcgKzU2NCwxNyBAQAogLyogRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBsaXN0X2VudHJ5KCkgaW5zdGVhZCAqLwogCQltc2dpbmZvID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21zZ2luZm8gKiljdXJyOwogCQlyZXF1ZXN0aGVhZGVyID0KLQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKKwkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKIAotCQlpZiAocmVxdWVzdGhlYWRlci0+TWVzc2FnZVR5cGUgPT0gQ2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbCkgeworCQlpZiAocmVxdWVzdGhlYWRlci0+bXNndHlwZSA9PSBDSEFOTkVMTVNHX09QRU5DSEFOTkVMKSB7CiAJCQlvcGVubXNnID0KLQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwgKiltc2dpbmZvLT5Nc2c7Ci0JCQlpZiAob3Blbm1zZy0+Q2hpbGRSZWxJZCA9PSByZXN1bHQtPkNoaWxkUmVsSWQgJiYKLQkJCSAgICBvcGVubXNnLT5PcGVuSWQgPT0gcmVzdWx0LT5PcGVuSWQpIHsKLQkJCQltZW1jcHkoJm1zZ2luZm8tPlJlc3BvbnNlLk9wZW5SZXN1bHQsCisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopbXNnaW5mby0+bXNnOworCQkJaWYgKG9wZW5tc2ctPmNoaWxkX3JlbGlkID09IHJlc3VsdC0+Y2hpbGRfcmVsaWQgJiYKKwkJCSAgICBvcGVubXNnLT5vcGVuaWQgPT0gcmVzdWx0LT5vcGVuaWQpIHsKKwkJCQltZW1jcHkoJm1zZ2luZm8tPnJlc3BvbnNlLm9wZW5fcmVzdWx0LAogCQkJCSAgICAgICByZXN1bHQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX3Jlc3VsdCkpOwotCQkJCW9zZF9XYWl0RXZlbnRTZXQobXNnaW5mby0+V2FpdEV2ZW50KTsKKwkJCQlvc2Rfd2FpdGV2ZW50X3NldChtc2dpbmZvLT53YWl0ZXZlbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC01OTIsNyArNjAwLDcgQEAKIAogCWdwYWRsY3JlYXRlZCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkICopaGRyOwogCURQUklOVF9EQkcoVk1CVVMsICJ2bWJ1cyBncGFkbCBjcmVhdGVkIHJlc3VsdCAtICVkIiwKLQkJICAgZ3BhZGxjcmVhdGVkLT5DcmVhdGlvblN0YXR1cyk7CisJCSAgIGdwYWRsY3JlYXRlZC0+Y3JlYXRpb25fc3RhdHVzKTsKIAogCS8qCiAJICogRmluZCB0aGUgZXN0YWJsaXNoIG1zZywgY29weSB0aGUgcmVzdWx0IGFuZCBzaWduYWwvdW5ibG9jayB0aGUgd2FpdApAQCAtNjA0LDE5ICs2MTIsMTkgQEAKIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSB1c2UgbGlzdF9lbnRyeSgpIGluc3RlYWQgKi8KIAkJbXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKIAkJcmVxdWVzdGhlYWRlciA9Ci0JCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CiAKLQkJaWYgKHJlcXVlc3RoZWFkZXItPk1lc3NhZ2VUeXBlID09IENoYW5uZWxNZXNzYWdlR3BhZGxIZWFkZXIpIHsKKwkJaWYgKHJlcXVlc3RoZWFkZXItPm1zZ3R5cGUgPT0gQ0hBTk5FTE1TR19HUEFETF9IRUFERVIpIHsKIAkJCWdwYWRsaGVhZGVyID0KIAkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKilyZXF1ZXN0aGVhZGVyOwogCi0JCQlpZiAoKGdwYWRsY3JlYXRlZC0+Q2hpbGRSZWxJZCA9PQotCQkJICAgICBncGFkbGhlYWRlci0+Q2hpbGRSZWxJZCkgJiYKLQkJCSAgICAoZ3BhZGxjcmVhdGVkLT5HcGFkbCA9PSBncGFkbGhlYWRlci0+R3BhZGwpKSB7Ci0JCQkJbWVtY3B5KCZtc2dpbmZvLT5SZXNwb25zZS5HcGFkbENyZWF0ZWQsCisJCQlpZiAoKGdwYWRsY3JlYXRlZC0+Y2hpbGRfcmVsaWQgPT0KKwkJCSAgICAgZ3BhZGxoZWFkZXItPmNoaWxkX3JlbGlkKSAmJgorCQkJICAgIChncGFkbGNyZWF0ZWQtPmdwYWRsID09IGdwYWRsaGVhZGVyLT5ncGFkbCkpIHsKKwkJCQltZW1jcHkoJm1zZ2luZm8tPnJlc3BvbnNlLmdwYWRsX2NyZWF0ZWQsCiAJCQkJICAgICAgIGdwYWRsY3JlYXRlZCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQpKTsKLQkJCQlvc2RfV2FpdEV2ZW50U2V0KG1zZ2luZm8tPldhaXRFdmVudCk7CisJCQkJb3NkX3dhaXRldmVudF9zZXQobXNnaW5mby0+d2FpdGV2ZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjUyLDE3ICs2NjAsMTcgQEAKIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBwcm9iYWJseSB1c2UgbGlzdF9lbnRyeSgpIGluc3RlYWQgKi8KIAkJbXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKIAkJcmVxdWVzdGhlYWRlciA9Ci0JCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5tc2c7CiAKLQkJaWYgKHJlcXVlc3RoZWFkZXItPk1lc3NhZ2VUeXBlID09IENoYW5uZWxNZXNzYWdlR3BhZGxUZWFyZG93bikgeworCQlpZiAocmVxdWVzdGhlYWRlci0+bXNndHlwZSA9PSBDSEFOTkVMTVNHX0dQQURMX1RFQVJET1dOKSB7CiAJCQlncGFkbF90ZWFyZG93biA9CiAJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gKilyZXF1ZXN0aGVhZGVyOwogCi0JCQlpZiAoZ3BhZGxfdG9ybmRvd24tPkdwYWRsID09IGdwYWRsX3RlYXJkb3duLT5HcGFkbCkgewotCQkJCW1lbWNweSgmbXNnaW5mby0+UmVzcG9uc2UuR3BhZGxUb3JuZG93biwKKwkJCWlmIChncGFkbF90b3JuZG93bi0+Z3BhZGwgPT0gZ3BhZGxfdGVhcmRvd24tPmdwYWRsKSB7CisJCQkJbWVtY3B5KCZtc2dpbmZvLT5yZXNwb25zZS5ncGFkbF90b3JuZG93biwKIAkJCQkgICAgICAgZ3BhZGxfdG9ybmRvd24sCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90b3JuZG93bikpOwotCQkJCW9zZF9XYWl0RXZlbnRTZXQobXNnaW5mby0+V2FpdEV2ZW50KTsKKwkJCQlvc2Rfd2FpdGV2ZW50X3NldChtc2dpbmZvLT53YWl0ZXZlbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC02OTQsMTYgKzcwMiwxNiBAQAogLyogRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBsaXN0X2VudHJ5KCkgaW5zdGVhZCAqLwogCQltc2dpbmZvID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21zZ2luZm8gKiljdXJyOwogCQlyZXF1ZXN0aGVhZGVyID0KLQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKKwkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKIAotCQlpZiAocmVxdWVzdGhlYWRlci0+TWVzc2FnZVR5cGUgPT0KLQkJICAgIENoYW5uZWxNZXNzYWdlSW5pdGlhdGVDb250YWN0KSB7CisJCWlmIChyZXF1ZXN0aGVhZGVyLT5tc2d0eXBlID09CisJCSAgICBDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1QpIHsKIAkJCWluaXRpYXRlID0KIAkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0ICopcmVxdWVzdGhlYWRlcjsKLQkJCW1lbWNweSgmbXNnaW5mby0+UmVzcG9uc2UuVmVyc2lvblJlc3BvbnNlLAorCQkJbWVtY3B5KCZtc2dpbmZvLT5yZXNwb25zZS52ZXJzaW9uX3Jlc3BvbnNlLAogCQkJICAgICAgdmVyc2lvbl9yZXNwb25zZSwKIAkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3Jlc3BvbnNlKSk7Ci0JCQlvc2RfV2FpdEV2ZW50U2V0KG1zZ2luZm8tPldhaXRFdmVudCk7CisJCQlvc2Rfd2FpdGV2ZW50X3NldChtc2dpbmZvLT53YWl0ZXZlbnQpOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CkBAIC03MTEsMjQgKzcxOSwyNCBAQAogCiAvKiBDaGFubmVsIG1lc3NhZ2UgZGlzcGF0Y2ggdGFibGUgKi8KIHN0YXRpYyBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX3RhYmxlX2VudHJ5Ci0JZ0NoYW5uZWxNZXNzYWdlVGFibGVbQ2hhbm5lbE1lc3NhZ2VDb3VudF0gPSB7Ci0Je0NoYW5uZWxNZXNzYWdlSW52YWxpZCwJCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VPZmZlckNoYW5uZWwsCQl2bWJ1c19vbm9mZmVyfSwKLQl7Q2hhbm5lbE1lc3NhZ2VSZXNjaW5kQ2hhbm5lbE9mZmVyLAl2bWJ1c19vbm9mZmVyX3Jlc2NpbmR9LAotCXtDaGFubmVsTWVzc2FnZVJlcXVlc3RPZmZlcnMsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VBbGxPZmZlcnNEZWxpdmVyZWQsCXZtYnVzX29ub2ZmZXJzX2RlbGl2ZXJlZH0sCi0Je0NoYW5uZWxNZXNzYWdlT3BlbkNoYW5uZWwsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbFJlc3VsdCwJdm1idXNfb25vcGVuX3Jlc3VsdH0sCi0Je0NoYW5uZWxNZXNzYWdlQ2xvc2VDaGFubmVsLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlR3BhZGxIZWFkZXIsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VHcGFkbEJvZHksCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VHcGFkbENyZWF0ZWQsCQl2bWJ1c19vbmdwYWRsX2NyZWF0ZWR9LAotCXtDaGFubmVsTWVzc2FnZUdwYWRsVGVhcmRvd24sCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VHcGFkbFRvcm5kb3duLAkJdm1idXNfb25ncGFkbF90b3JuZG93bn0sCi0Je0NoYW5uZWxNZXNzYWdlUmVsSWRSZWxlYXNlZCwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUluaXRpYXRlQ29udGFjdCwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZVZlcnNpb25SZXNwb25zZSwJCXZtYnVzX29udmVyc2lvbl9yZXNwb25zZX0sCi0Je0NoYW5uZWxNZXNzYWdlVW5sb2FkLAkJCU5VTEx9LAorCWdDaGFubmVsTWVzc2FnZVRhYmxlW0NIQU5ORUxNU0dfQ09VTlRdID0geworCXtDSEFOTkVMTVNHX0lOVkFMSUQsCQkJTlVMTH0sCisJe0NIQU5ORUxNU0dfT0ZGRVJDSEFOTkVMLAkJdm1idXNfb25vZmZlcn0sCisJe0NIQU5ORUxNU0dfUkVTQ0lORF9DSEFOTkVMT0ZGRVIsCXZtYnVzX29ub2ZmZXJfcmVzY2luZH0sCisJe0NIQU5ORUxNU0dfUkVRVUVTVE9GRkVSUywJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0FMTE9GRkVSU19ERUxJVkVSRUQsCXZtYnVzX29ub2ZmZXJzX2RlbGl2ZXJlZH0sCisJe0NIQU5ORUxNU0dfT1BFTkNIQU5ORUwsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19PUEVOQ0hBTk5FTF9SRVNVTFQsCXZtYnVzX29ub3Blbl9yZXN1bHR9LAorCXtDSEFOTkVMTVNHX0NMT1NFQ0hBTk5FTCwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0dQQURMX0hFQURFUiwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0dQQURMX0JPRFksCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19HUEFETF9DUkVBVEVELAkJdm1idXNfb25ncGFkbF9jcmVhdGVkfSwKKwl7Q0hBTk5FTE1TR19HUEFETF9URUFSRE9XTiwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0dQQURMX1RPUk5ET1dOLAkJdm1idXNfb25ncGFkbF90b3JuZG93bn0sCisJe0NIQU5ORUxNU0dfUkVMSURfUkVMRUFTRUQsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19JTklUSUFURV9DT05UQUNULAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfVkVSU0lPTl9SRVNQT05TRSwJCXZtYnVzX29udmVyc2lvbl9yZXNwb25zZX0sCisJe0NIQU5ORUxNU0dfVU5MT0FELAkJCU5VTEx9LAogfTsKIAogLyoKQEAgLTc0MiwyOSArNzUwLDI1IEBACiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKmhkcjsKIAlpbnQgc2l6ZTsKIAotCWhkciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZy0+dS5QYXlsb2FkOwotCXNpemUgPSBtc2ctPkhlYWRlci5QYXlsb2FkU2l6ZTsKKwloZHIgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2ctPnUucGF5bG9hZDsKKwlzaXplID0gbXNnLT5oZWFkZXIucGF5bG9hZF9zaXplOwogCi0JRFBSSU5UX0RCRyhWTUJVUywgIm1lc3NhZ2UgdHlwZSAlZCBzaXplICVkIiwgaGRyLT5NZXNzYWdlVHlwZSwgc2l6ZSk7CisJRFBSSU5UX0RCRyhWTUJVUywgIm1lc3NhZ2UgdHlwZSAlZCBzaXplICVkIiwgaGRyLT5tc2d0eXBlLCBzaXplKTsKIAotCWlmIChoZHItPk1lc3NhZ2VUeXBlID49IENoYW5uZWxNZXNzYWdlQ291bnQpIHsKKwlpZiAoaGRyLT5tc2d0eXBlID49IENIQU5ORUxNU0dfQ09VTlQpIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJSZWNlaXZlZCBpbnZhbGlkIGNoYW5uZWwgbWVzc2FnZSB0eXBlICVkIHNpemUgJWQiLAotCQkJICAgaGRyLT5NZXNzYWdlVHlwZSwgc2l6ZSk7CisJCQkgICBoZHItPm1zZ3R5cGUsIHNpemUpOwogCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfTk9ORSwKLQkJCQkgICAgICh1bnNpZ25lZCBjaGFyICopbXNnLT51LlBheWxvYWQsIHNpemUpOwotCQlrZnJlZShtc2cpOworCQkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKiltc2ctPnUucGF5bG9hZCwgc2l6ZSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZ0NoYW5uZWxNZXNzYWdlVGFibGVbaGRyLT5NZXNzYWdlVHlwZV0ubWVzc2FnZUhhbmRsZXIpCi0JCWdDaGFubmVsTWVzc2FnZVRhYmxlW2hkci0+TWVzc2FnZVR5cGVdLm1lc3NhZ2VIYW5kbGVyKGhkcik7CisJaWYgKGdDaGFubmVsTWVzc2FnZVRhYmxlW2hkci0+bXNndHlwZV0ubWVzc2FnZUhhbmRsZXIpCisJCWdDaGFubmVsTWVzc2FnZVRhYmxlW2hkci0+bXNndHlwZV0ubWVzc2FnZUhhbmRsZXIoaGRyKTsKIAllbHNlCiAJCURQUklOVF9FUlIoVk1CVVMsICJVbmhhbmRsZWQgY2hhbm5lbCBtZXNzYWdlIHR5cGUgJWQiLAotCQkJICAgaGRyLT5NZXNzYWdlVHlwZSk7Ci0KLQkvKiBGcmVlIHRoZSBtc2cgdGhhdCB3YXMgYWxsb2NhdGVkIGluIFZtYnVzT25Nc2dEUEMoKSAqLwotCWtmcmVlKG1zZyk7CisJCQkgICBoZHItPm1zZ3R5cGUpOwogfQogCiAvKgpAQCAtNzgyLDE1ICs3ODYsMTUgQEAKIAlpZiAoIW1zZ2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXNnaW5mby0+V2FpdEV2ZW50ID0gb3NkX1dhaXRFdmVudENyZWF0ZSgpOwotCWlmICghbXNnaW5mby0+V2FpdEV2ZW50KSB7CisJbXNnaW5mby0+d2FpdGV2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsKKwlpZiAoIW1zZ2luZm8tPndhaXRldmVudCkgewogCQlrZnJlZShtc2dpbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+TXNnOworCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKIAotCW1zZy0+TWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZVJlcXVlc3RPZmZlcnM7CisJbXNnLT5tc2d0eXBlID0gQ0hBTk5FTE1TR19SRVFVRVNUT0ZGRVJTOwogCiAJLypTcGlubG9ja0FjcXVpcmUoZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsTXNnTG9jayk7CiAJSU5TRVJUX1RBSUxfTElTVCgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsTXNnTGlzdCwKQEAgLTgwOCw3ICs4MTIsNyBAQAogCiAJCWdvdG8gQ2xlYW51cDsKIAl9Ci0JLyogb3NkX1dhaXRFdmVudFdhaXQobXNnSW5mby0+d2FpdEV2ZW50KTsgKi8KKwkvKiBvc2Rfd2FpdGV2ZW50X3dhaXQobXNnSW5mby0+d2FpdEV2ZW50KTsgKi8KIAogCS8qU3BpbmxvY2tBY3F1aXJlKGdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbE1zZ0xvY2spOwogCVJFTU9WRV9FTlRSWV9MSVNUKCZtc2dJbmZvLT5tc2dMaXN0RW50cnkpOwpAQCAtODE3LDcgKzgyMSw3IEBACiAKIENsZWFudXA6CiAJaWYgKG1zZ2luZm8pIHsKLQkJa2ZyZWUobXNnaW5mby0+V2FpdEV2ZW50KTsKKwkJa2ZyZWUobXNnaW5mby0+d2FpdGV2ZW50KTsKIAkJa2ZyZWUobXNnaW5mbyk7CiAJfQogCkBAIC04MzcsMTcgKzg0MSwxNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW5uZWwsIHBvcywgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsCi0JCQkJIExpc3RFbnRyeSkgeworCQkJCSBsaXN0ZW50cnkpIHsKIAkJaWYgKGNoYW5uZWwgPT0gc3RhcnQpCiAJCQlicmVhazsKIAotCQlpZiAoIWNoYW5uZWwtPkRldmljZU9iamVjdC0+RHJpdmVyKSB7Ci0JCQlsaXN0X2RlbCgmY2hhbm5lbC0+TGlzdEVudHJ5KTsKKwkJaWYgKCFjaGFubmVsLT5kZXZpY2Vfb2JqLT5Ecml2ZXIpIHsKKwkJCWxpc3RfZGVsKCZjaGFubmVsLT5saXN0ZW50cnkpOwogCQkJRFBSSU5UX0lORk8oVk1CVVMsCiAJCQkJICAgICJSZWxlYXNpbmcgdW5hdHRhY2hlZCBkZXZpY2Ugb2JqZWN0ICVwIiwKLQkJCQkgICAgY2hhbm5lbC0+RGV2aWNlT2JqZWN0KTsKKwkJCQkgICAgY2hhbm5lbC0+ZGV2aWNlX29iaik7CiAKLQkJCVZtYnVzQ2hpbGREZXZpY2VSZW1vdmUoY2hhbm5lbC0+RGV2aWNlT2JqZWN0KTsKKwkJCXZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyKGNoYW5uZWwtPmRldmljZV9vYmopOwogCQkJZnJlZV9jaGFubmVsKGNoYW5uZWwpOwogCQl9IGVsc2UgewogCQkJaWYgKCFzdGFydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaAppbmRleCBkMTZjYzA4MS4uZGU2YjJhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaApAQCAtMzMsNjAgKzMzLDYwIEBACiAKIC8qIFZlcnNpb24gMSBtZXNzYWdlcyAqLwogZW51bSB2bWJ1c19jaGFubmVsX21lc3NhZ2VfdHlwZSB7Ci0JQ2hhbm5lbE1lc3NhZ2VJbnZhbGlkCQkJPSAgMCwKLQlDaGFubmVsTWVzc2FnZU9mZmVyQ2hhbm5lbAkJPSAgMSwKLQlDaGFubmVsTWVzc2FnZVJlc2NpbmRDaGFubmVsT2ZmZXIJPSAgMiwKLQlDaGFubmVsTWVzc2FnZVJlcXVlc3RPZmZlcnMJCT0gIDMsCi0JQ2hhbm5lbE1lc3NhZ2VBbGxPZmZlcnNEZWxpdmVyZWQJPSAgNCwKLQlDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsCQk9ICA1LAotCUNoYW5uZWxNZXNzYWdlT3BlbkNoYW5uZWxSZXN1bHQJCT0gIDYsCi0JQ2hhbm5lbE1lc3NhZ2VDbG9zZUNoYW5uZWwJCT0gIDcsCi0JQ2hhbm5lbE1lc3NhZ2VHcGFkbEhlYWRlcgkJPSAgOCwKLQlDaGFubmVsTWVzc2FnZUdwYWRsQm9keQkJCT0gIDksCi0JQ2hhbm5lbE1lc3NhZ2VHcGFkbENyZWF0ZWQJCT0gMTAsCi0JQ2hhbm5lbE1lc3NhZ2VHcGFkbFRlYXJkb3duCQk9IDExLAotCUNoYW5uZWxNZXNzYWdlR3BhZGxUb3JuZG93bgkJPSAxMiwKLQlDaGFubmVsTWVzc2FnZVJlbElkUmVsZWFzZWQJCT0gMTMsCi0JQ2hhbm5lbE1lc3NhZ2VJbml0aWF0ZUNvbnRhY3QJCT0gMTQsCi0JQ2hhbm5lbE1lc3NhZ2VWZXJzaW9uUmVzcG9uc2UJCT0gMTUsCi0JQ2hhbm5lbE1lc3NhZ2VVbmxvYWQJCQk9IDE2LAorCUNIQU5ORUxNU0dfSU5WQUxJRAkJCT0gIDAsCisJQ0hBTk5FTE1TR19PRkZFUkNIQU5ORUwJCT0gIDEsCisJQ0hBTk5FTE1TR19SRVNDSU5EX0NIQU5ORUxPRkZFUgk9ICAyLAorCUNIQU5ORUxNU0dfUkVRVUVTVE9GRkVSUwkJPSAgMywKKwlDSEFOTkVMTVNHX0FMTE9GRkVSU19ERUxJVkVSRUQJPSAgNCwKKwlDSEFOTkVMTVNHX09QRU5DSEFOTkVMCQk9ICA1LAorCUNIQU5ORUxNU0dfT1BFTkNIQU5ORUxfUkVTVUxUCQk9ICA2LAorCUNIQU5ORUxNU0dfQ0xPU0VDSEFOTkVMCQk9ICA3LAorCUNIQU5ORUxNU0dfR1BBRExfSEVBREVSCQk9ICA4LAorCUNIQU5ORUxNU0dfR1BBRExfQk9EWQkJCT0gIDksCisJQ0hBTk5FTE1TR19HUEFETF9DUkVBVEVECQk9IDEwLAorCUNIQU5ORUxNU0dfR1BBRExfVEVBUkRPV04JCT0gMTEsCisJQ0hBTk5FTE1TR19HUEFETF9UT1JORE9XTgkJPSAxMiwKKwlDSEFOTkVMTVNHX1JFTElEX1JFTEVBU0VECQk9IDEzLAorCUNIQU5ORUxNU0dfSU5JVElBVEVfQ09OVEFDVAkJPSAxNCwKKwlDSEFOTkVMTVNHX1ZFUlNJT05fUkVTUE9OU0UJCT0gMTUsCisJQ0hBTk5FTE1TR19VTkxPQUQJCQk9IDE2LAogI2lmZGVmIFZNQlVTX0ZFQVRVUkVfUEFSRU5UX09SX1BFRVJfTUVNT1JZX01BUFBFRF9JTlRPX0FfQ0hJTEQKLQlDaGFubmVsTWVzc2FnZVZpZXdSYW5nZUFkZAkJPSAxNywKLQlDaGFubmVsTWVzc2FnZVZpZXdSYW5nZVJlbW92ZQkJPSAxOCwKKwlDSEFOTkVMTVNHX1ZJRVdSQU5HRV9BREQJCT0gMTcsCisJQ0hBTk5FTE1TR19WSUVXUkFOR0VfUkVNT1ZFCQk9IDE4LAogI2VuZGlmCi0JQ2hhbm5lbE1lc3NhZ2VDb3VudAorCUNIQU5ORUxNU0dfQ09VTlQKIH07CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIHsKLQllbnVtIHZtYnVzX2NoYW5uZWxfbWVzc2FnZV90eXBlIE1lc3NhZ2VUeXBlOwotCXUzMiBQYWRkaW5nOworCWVudW0gdm1idXNfY2hhbm5lbF9tZXNzYWdlX3R5cGUgbXNndHlwZTsKKwl1MzIgcGFkZGluZzsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFF1ZXJ5IFZNQnVzIFZlcnNpb24gcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfcXVlcnlfdm1idXNfdmVyc2lvbiB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBWZXJzaW9uOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgdmVyc2lvbjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFZNQnVzIFZlcnNpb24gU3VwcG9ydGVkIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fc3VwcG9ydGVkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JYm9vbCBWZXJzaW9uU3VwcG9ydGVkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwlib29sIHZlcnNpb25fc3VwcG9ydGVkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogT2ZmZXIgQ2hhbm5lbCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXIgT2ZmZXI7Ci0JdTMyIENoaWxkUmVsSWQ7Ci0JdTggTW9uaXRvcklkOwotCWJvb2wgTW9uaXRvckFsbG9jYXRlZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXIgb2ZmZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXU4IG1vbml0b3JpZDsKKwlib29sIG1vbml0b3JfYWxsb2NhdGVkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogUmVzY2luZCBPZmZlciBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9yZXNjaW5kX29mZmVyIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBjaGlsZF9yZWxpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xMDAsNDMgKzEwMCw0MyBAQAogCiAvKiBPcGVuIENoYW5uZWwgcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOwogCiAJLyogSWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgVk1CdXMgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIG9wZW5lZC4gKi8KLQl1MzIgQ2hpbGRSZWxJZDsKKwl1MzIgY2hpbGRfcmVsaWQ7CiAKIAkvKiBJRCBtYWtpbmcgYSBwYXJ0aWN1bGFyIG9wZW4gcmVxdWVzdCBhdCBhIGNoYW5uZWwgb2ZmZXIgdW5pcXVlLiAqLwotCXUzMiBPcGVuSWQ7CisJdTMyIG9wZW5pZDsKIAogCS8qIEdQQURMIGZvciB0aGUgY2hhbm5lbCdzIHJpbmcgYnVmZmVyLiAqLwotCXUzMiBSaW5nQnVmZmVyR3BhZGxIYW5kbGU7CisJdTMyIHJpbmdidWZmZXJfZ3BhZGxoYW5kbGU7CiAKIAkvKiBHUEFETCBmb3IgdGhlIGNoYW5uZWwncyBzZXJ2ZXIgY29udGV4dCBzYXZlIGFyZWEuICovCi0JdTMyIFNlcnZlckNvbnRleHRBcmVhR3BhZGxIYW5kbGU7CisJdTMyIHNlcnZlcl9jb250ZXh0YXJlYV9ncGFkbGhhbmRsZTsKIAogCS8qCiAJKiBUaGUgdXBzdHJlYW0gcmluZyBidWZmZXIgYmVnaW5zIGF0IG9mZnNldCB6ZXJvIGluIHRoZSBtZW1vcnkKIAkqIGRlc2NyaWJlZCBieSBSaW5nQnVmZmVyR3BhZGxIYW5kbGUuIFRoZSBkb3duc3RyZWFtIHJpbmcgYnVmZmVyCiAJKiBmb2xsb3dzIGl0IGF0IHRoaXMgb2Zmc2V0IChpbiBwYWdlcykuCiAJKi8KLQl1MzIgRG93bnN0cmVhbVJpbmdCdWZmZXJQYWdlT2Zmc2V0OworCXUzMiBkb3duc3RyZWFtX3JpbmdidWZmZXJfcGFnZW9mZnNldDsKIAogCS8qIFVzZXItc3BlY2lmaWMgZGF0YSB0byBiZSBwYXNzZWQgYWxvbmcgdG8gdGhlIHNlcnZlciBlbmRwb2ludC4gKi8KLQl1bnNpZ25lZCBjaGFyIFVzZXJEYXRhW01BWF9VU0VSX0RFRklORURfQllURVNdOworCXVuc2lnbmVkIGNoYXIgdXNlcmRhdGFbTUFYX1VTRVJfREVGSU5FRF9CWVRFU107CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBPcGVuIENoYW5uZWwgUmVzdWx0IHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0IHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7Ci0JdTMyIE9wZW5JZDsKLQl1MzIgU3RhdHVzOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CisJdTMyIG9wZW5pZDsKKwl1MzIgc3RhdHVzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQ2xvc2UgY2hhbm5lbCBwYXJhbWV0ZXJzOyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfY2xvc2VfY2hhbm5lbCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBDaGFubmVsIE1lc3NhZ2UgR1BBREwgKi8KQEAgLTE1MSw3MiArMTUxLDcyIEBACiAgKiBmb2xsb3ctdXAgcGFja2V0IHRoYXQgY29udGFpbnMgbW9yZS4KICAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7Ci0JdTMyIEdwYWRsOwotCXUxNiBSYW5nZUJ1ZkxlbjsKLQl1MTYgUmFuZ2VDb3VudDsKLQlzdHJ1Y3QgZ3BhX3JhbmdlIFJhbmdlWzBdOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CisJdTMyIGdwYWRsOworCXUxNiByYW5nZV9idWZsZW47CisJdTE2IHJhbmdlY291bnQ7CisJc3RydWN0IGdwYV9yYW5nZSByYW5nZVswXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFRoaXMgaXMgdGhlIGZvbGxvd3VwIHBhY2tldCB0aGF0IGNvbnRhaW5zIG1vcmUgUEZOcy4gKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgTWVzc2FnZU51bWJlcjsKLQl1MzIgR3BhZGw7Ci0JdTY0IFBmblswXTsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIG1zZ251bWJlcjsKKwl1MzIgZ3BhZGw7CisJdTY0IHBmblswXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgQ2hpbGRSZWxJZDsKLQl1MzIgR3BhZGw7Ci0JdTMyIENyZWF0aW9uU3RhdHVzOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CisJdTMyIGdwYWRsOworCXUzMiBjcmVhdGlvbl9zdGF0dXM7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90ZWFyZG93biB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOwotCXUzMiBHcGFkbDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBncGFkbDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIEdwYWRsOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgZ3BhZGw7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAjaWZkZWYgVk1CVVNfRkVBVFVSRV9QQVJFTlRfT1JfUEVFUl9NRU1PUllfTUFQUEVEX0lOVE9fQV9DSElMRAogc3RydWN0IHZtYnVzX2NoYW5uZWxfdmlld19yYW5nZV9hZGQgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQlQSFlTSUNBTF9BRERSRVNTIFZpZXdSYW5nZUJhc2U7Ci0JdTY0IFZpZXdSYW5nZUxlbmd0aDsKLQl1MzIgQ2hpbGRSZWxJZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJUEhZU0lDQUxfQUREUkVTUyB2aWV3cmFuZ2VfYmFzZTsKKwl1NjQgdmlld3JhbmdlX2xlbmd0aDsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92aWV3X3JhbmdlX3JlbW92ZSB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCVBIWVNJQ0FMX0FERFJFU1MgVmlld1JhbmdlQmFzZTsKLQl1MzIgQ2hpbGRSZWxJZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJUEhZU0lDQUxfQUREUkVTUyB2aWV3cmFuZ2VfYmFzZTsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2VuZGlmCiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX3JlbGlkX3JlbGVhc2VkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBjaGlsZF9yZWxpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX2luaXRpYXRlX2NvbnRhY3QgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgVk1CdXNWZXJzaW9uUmVxdWVzdGVkOwotCXUzMiBQYWRkaW5nMjsKLQl1NjQgSW50ZXJydXB0UGFnZTsKLQl1NjQgTW9uaXRvclBhZ2UxOwotCXU2NCBNb25pdG9yUGFnZTI7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiB2bWJ1c192ZXJzaW9uX3JlcXVlc3RlZDsKKwl1MzIgcGFkZGluZzI7CisJdTY0IGludGVycnVwdF9wYWdlOworCXU2NCBtb25pdG9yX3BhZ2UxOworCXU2NCBtb25pdG9yX3BhZ2UyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfdmVyc2lvbl9yZXNwb25zZSB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCWJvb2wgVmVyc2lvblN1cHBvcnRlZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJYm9vbCB2ZXJzaW9uX3N1cHBvcnRlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIGVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSB7CkBAIC0yMjYsNTQgKzIyNiw1NSBAQAogfTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWwgewotCXN0cnVjdCBsaXN0X2hlYWQgTGlzdEVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdGVudHJ5OwogCi0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlT2JqZWN0OworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZV9vYmo7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX3RpbWVyOyAvKiBTQS0xMTEgd29ya2Fyb3VuZCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCi0JZW51bSB2bWJ1c19jaGFubmVsX3N0YXRlIFN0YXRlOworCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKIAotCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwgT2ZmZXJNc2c7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCBvZmZlcm1zZzsKIAkvKgogCSAqIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgT2ZmZXJNc2cuTW9uaXRvcklkLgogCSAqIFNhdmUgaXQgaGVyZSBmb3IgZWFzeSBhY2Nlc3MuCiAJICovCi0JdTggTW9uaXRvckdyb3VwOwotCXU4IE1vbml0b3JCaXQ7CisJdTggbW9uaXRvcl9ncnA7CisJdTggbW9uaXRvcl9iaXQ7CiAKLQl1MzIgUmluZ0J1ZmZlckdwYWRsSGFuZGxlOworCXUzMiByaW5nYnVmZmVyX2dwYWRsaGFuZGxlOwogCiAJLyogQWxsb2NhdGVkIG1lbW9yeSBmb3IgcmluZyBidWZmZXIgKi8KLQl2b2lkICpSaW5nQnVmZmVyUGFnZXM7Ci0JdTMyIFJpbmdCdWZmZXJQYWdlQ291bnQ7Ci0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gT3V0Ym91bmQ7CS8qIHNlbmQgdG8gcGFyZW50ICovCi0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gSW5ib3VuZDsJLyogcmVjZWl2ZSBmcm9tIHBhcmVudCAqLworCXZvaWQgKnJpbmdidWZmZXJfcGFnZXM7CisJdTMyIHJpbmdidWZmZXJfcGFnZWNvdW50OworCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIG91dGJvdW5kOwkvKiBzZW5kIHRvIHBhcmVudCAqLworCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIGluYm91bmQ7CS8qIHJlY2VpdmUgZnJvbSBwYXJlbnQgKi8KIAlzcGlubG9ja190IGluYm91bmRfbG9jazsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqQ29udHJvbFdROworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjb250cm9sd3E7CiAKIAkvKiBDaGFubmVsIGNhbGxiYWNrIGFyZSBpbnZva2VkIGluIHRoaXMgd29ya3F1ZXVlIGNvbnRleHQgKi8KIAkvKiBIQU5ETEUgZGF0YVdvcmtRdWV1ZTsgKi8KIAotCXZvaWQgKCpPbkNoYW5uZWxDYWxsYmFjaykodm9pZCAqY29udGV4dCk7Ci0Jdm9pZCAqQ2hhbm5lbENhbGxiYWNrQ29udGV4dDsKKwl2b2lkICgqb25jaGFubmVsX2NhbGxiYWNrKSh2b2lkICpjb250ZXh0KTsKKwl2b2lkICpjaGFubmVsX2NhbGxiYWNrX2NvbnRleHQ7CiB9OwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9kZWJ1Z19pbmZvIHsKLQl1MzIgUmVsSWQ7Ci0JZW51bSB2bWJ1c19jaGFubmVsX3N0YXRlIFN0YXRlOwotCXN0cnVjdCBodl9ndWlkIEludGVyZmFjZVR5cGU7Ci0Jc3RydWN0IGh2X2d1aWQgSW50ZXJmYWNlSW5zdGFuY2U7Ci0JdTMyIE1vbml0b3JJZDsKLQl1MzIgU2VydmVyTW9uaXRvclBlbmRpbmc7Ci0JdTMyIFNlcnZlck1vbml0b3JMYXRlbmN5OwotCXUzMiBTZXJ2ZXJNb25pdG9yQ29ubmVjdGlvbklkOwotCXUzMiBDbGllbnRNb25pdG9yUGVuZGluZzsKLQl1MzIgQ2xpZW50TW9uaXRvckxhdGVuY3k7Ci0JdTMyIENsaWVudE1vbml0b3JDb25uZWN0aW9uSWQ7CisJdTMyIHJlbGlkOworCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgaHZfZ3VpZCBpbnRlcmZhY2V0eXBlOworCXN0cnVjdCBodl9ndWlkIGludGVyZmFjZV9pbnN0YW5jZTsKKwl1MzIgbW9uaXRvcmlkOworCXUzMiBzZXJ2ZXJtb25pdG9yX3BlbmRpbmc7CisJdTMyIHNlcnZlcm1vbml0b3JfbGF0ZW5jeTsKKwl1MzIgc2VydmVybW9uaXRvcl9jb25uZWN0aW9uaWQ7CisJdTMyIGNsaWVudG1vbml0b3JfcGVuZGluZzsKKwl1MzIgY2xpZW50bW9uaXRvcl9sYXRlbmN5OworCXUzMiBjbGllbnRtb25pdG9yX2Nvbm5lY3Rpb25pZDsKIAotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIEluYm91bmQ7Ci0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gT3V0Ym91bmQ7CisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gaW5ib3VuZDsKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyBvdXRib3VuZDsKIH07CiAKIC8qCkBAIC0yODIsMjggKzI4MywyOCBAQAogICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvIHsKIAkvKiBCb29ra2VlcGluZyBzdHVmZiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgTXNnTGlzdEVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbXNnbGlzdGVudHJ5OwogCiAJLyogU28gZmFyLCB0aGlzIGlzIG9ubHkgdXNlZCB0byBoYW5kbGUgZ3BhZGwgYm9keSBtZXNzYWdlICovCi0Jc3RydWN0IGxpc3RfaGVhZCBTdWJNc2dMaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgc3VibXNnbGlzdDsKIAogCS8qIFN5bmNocm9uaXplIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIGlmIG5lZWRlZCAqLwotCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpXYWl0RXZlbnQ7CisJc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRldmVudDsKIAogCXVuaW9uIHsKLQkJc3RydWN0IHZtYnVzX2NoYW5uZWxfdmVyc2lvbl9zdXBwb3J0ZWQgVmVyc2lvblN1cHBvcnRlZDsKLQkJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9yZXN1bHQgT3BlblJlc3VsdDsKLQkJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdG9ybmRvd24gR3BhZGxUb3JuZG93bjsKLQkJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfY3JlYXRlZCBHcGFkbENyZWF0ZWQ7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UgVmVyc2lvblJlc3BvbnNlOwotCX0gUmVzcG9uc2U7CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fc3VwcG9ydGVkIHZlcnNpb25fc3VwcG9ydGVkOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX3Jlc3VsdCBvcGVuX3Jlc3VsdDsKKwkJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdG9ybmRvd24gZ3BhZGxfdG9ybmRvd247CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgZ3BhZGxfY3JlYXRlZDsKKwkJc3RydWN0IHZtYnVzX2NoYW5uZWxfdmVyc2lvbl9yZXNwb25zZSB2ZXJzaW9uX3Jlc3BvbnNlOworCX0gcmVzcG9uc2U7CiAKLQl1MzIgTWVzc2FnZVNpemU7CisJdTMyIG1zZ3NpemU7CiAJLyoKIAkgKiBUaGUgY2hhbm5lbCBtZXNzYWdlIHRoYXQgZ29lcyBvdXQgb24gdGhlICJ3aXJlIi4KIAkgKiBJdCB3aWxsIGNvbnRhaW4gYXQgbWluaW11bSB0aGUgVk1CVVNfQ0hBTk5FTF9NRVNTQUdFX0hFQURFUiBoZWFkZXIKIAkgKi8KLQl1bnNpZ25lZCBjaGFyIE1zZ1swXTsKKwl1bnNpZ25lZCBjaGFyIG1zZ1swXTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMKaW5kZXggZjg0NzcwNy4uYzJlMjk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY29ubmVjdGlvbi5jCkBAIC02Niw3ICs2Niw3IEBACiAJICogU2V0dXAgdGhlIHZtYnVzIGV2ZW50IGNvbm5lY3Rpb24gZm9yIGNoYW5uZWwgaW50ZXJydXB0CiAJICogYWJzdHJhY3Rpb24gc3R1ZmYKIAkgKi8KLQlnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UgPSBvc2RfUGFnZUFsbG9jKDEpOworCWdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSA9IG9zZF9wYWdlX2FsbG9jKDEpOwogCWlmIChnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UgPT0gTlVMTCkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwpAQCAtODEsNyArODEsNyBAQAogCSAqIFNldHVwIHRoZSBtb25pdG9yIG5vdGlmaWNhdGlvbiBmYWNpbGl0eS4gVGhlIDFzdCBwYWdlIGZvcgogCSAqIHBhcmVudC0+Y2hpbGQgYW5kIHRoZSAybmQgcGFnZSBmb3IgY2hpbGQtPnBhcmVudAogCSAqLwotCWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzID0gb3NkX1BhZ2VBbGxvYygyKTsKKwlnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyA9IG9zZF9wYWdlX2FsbG9jKDIpOwogCWlmIChnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyA9PSBOVUxMKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CkBAIC05NSwxOSArOTUsMTkgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW1zZ0luZm8tPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW1zZ0luZm8tPldhaXRFdmVudCkgeworCW1zZ0luZm8tPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFtc2dJbmZvLT53YWl0ZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0ICopbXNnSW5mby0+TXNnOworCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0ICopbXNnSW5mby0+bXNnOwogCi0JbXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZUluaXRpYXRlQ29udGFjdDsKLQltc2ctPlZNQnVzVmVyc2lvblJlcXVlc3RlZCA9IFZNQlVTX1JFVklTSU9OX05VTUJFUjsKLQltc2ctPkludGVycnVwdFBhZ2UgPSB2aXJ0X3RvX3BoeXMoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlKTsKLQltc2ctPk1vbml0b3JQYWdlMSA9IHZpcnRfdG9fcGh5cyhnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyk7Ci0JbXNnLT5Nb25pdG9yUGFnZTIgPSB2aXJ0X3RvX3BoeXMoCisJbXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfSU5JVElBVEVfQ09OVEFDVDsKKwltc2ctPnZtYnVzX3ZlcnNpb25fcmVxdWVzdGVkID0gVk1CVVNfUkVWSVNJT05fTlVNQkVSOworCW1zZy0+aW50ZXJydXB0X3BhZ2UgPSB2aXJ0X3RvX3BoeXMoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlKTsKKwltc2ctPm1vbml0b3JfcGFnZTEgPSB2aXJ0X3RvX3BoeXMoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMpOworCW1zZy0+bW9uaXRvcl9wYWdlMiA9IHZpcnRfdG9fcGh5cygKIAkJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzICsKIAkJCQkgUEFHRV9TSVpFKSk7CiAKQEAgLTExNiwzMCArMTE2LDMwIEBACiAJICogcmVjZWl2ZSB0aGUgcmVzcG9uc2UgYmVmb3JlIHJldHVybmluZyBmcm9tIHRoaXMgcm91dGluZQogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm1zZ0luZm8tPk1zZ0xpc3RFbnRyeSwKKwlsaXN0X2FkZF90YWlsKCZtc2dJbmZvLT5tc2dsaXN0ZW50cnksCiAJCSAgICAgICZnVm1idXNDb25uZWN0aW9uLkNoYW5uZWxNc2dMaXN0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiVm1idXMgY29ubmVjdGlvbiAtIGludGVycnVwdCBwZm4gJWxseCwgIgogCQkgICAibW9uaXRvcjEgcGZuICVsbHgsLCBtb25pdG9yMiBwZm4gJWxseCIsCi0JCSAgIG1zZy0+SW50ZXJydXB0UGFnZSwgbXNnLT5Nb25pdG9yUGFnZTEsIG1zZy0+TW9uaXRvclBhZ2UyKTsKKwkJICAgbXNnLT5pbnRlcnJ1cHRfcGFnZSwgbXNnLT5tb25pdG9yX3BhZ2UxLCBtc2ctPm1vbml0b3JfcGFnZTIpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIlNlbmRpbmcgY2hhbm5lbCBpbml0aWF0ZSBtc2cuLi4iKTsKIAlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKG1zZywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCkpOwogCWlmIChyZXQgIT0gMCkgewotCQlsaXN0X2RlbCgmbXNnSW5mby0+TXNnTGlzdEVudHJ5KTsKKwkJbGlzdF9kZWwoJm1zZ0luZm8tPm1zZ2xpc3RlbnRyeSk7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAkvKiBXYWl0IGZvciB0aGUgY29ubmVjdGlvbiByZXNwb25zZSAqLwotCW9zZF9XYWl0RXZlbnRXYWl0KG1zZ0luZm8tPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KG1zZ0luZm8tPndhaXRldmVudCk7CiAKLQlsaXN0X2RlbCgmbXNnSW5mby0+TXNnTGlzdEVudHJ5KTsKKwlsaXN0X2RlbCgmbXNnSW5mby0+bXNnbGlzdGVudHJ5KTsKIAogCS8qIENoZWNrIGlmIHN1Y2Nlc3NmdWwgKi8KLQlpZiAobXNnSW5mby0+UmVzcG9uc2UuVmVyc2lvblJlc3BvbnNlLlZlcnNpb25TdXBwb3J0ZWQpIHsKKwlpZiAobXNnSW5mby0+cmVzcG9uc2UudmVyc2lvbl9yZXNwb25zZS52ZXJzaW9uX3N1cHBvcnRlZCkgewogCQlEUFJJTlRfSU5GTyhWTUJVUywgIlZtYnVzIGNvbm5lY3RlZCEhIik7CiAJCWdWbWJ1c0Nvbm5lY3Rpb24uQ29ubmVjdFN0YXRlID0gQ29ubmVjdGVkOwogCkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWtmcmVlKG1zZ0luZm8tPldhaXRFdmVudCk7CisJa2ZyZWUobXNnSW5mby0+d2FpdGV2ZW50KTsKIAlrZnJlZShtc2dJbmZvKTsKIAlyZXR1cm4gMDsKIApAQCAtMTYyLDE3ICsxNjIsMTcgQEAKIAkJZGVzdHJveV93b3JrcXVldWUoZ1ZtYnVzQ29ubmVjdGlvbi5Xb3JrUXVldWUpOwogCiAJaWYgKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSkgewotCQlvc2RfUGFnZUZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKKwkJb3NkX3BhZ2VfZnJlZShnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UsIDEpOwogCQlnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UgPSBOVUxMOwogCX0KIAogCWlmIChnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcykgewotCQlvc2RfUGFnZUZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMsIDIpOworCQlvc2RfcGFnZV9mcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzLCAyKTsKIAkJZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMgPSBOVUxMOwogCX0KIAogCWlmIChtc2dJbmZvKSB7Ci0JCWtmcmVlKG1zZ0luZm8tPldhaXRFdmVudCk7CisJCWtmcmVlKG1zZ0luZm8tPndhaXRldmVudCk7CiAJCWtmcmVlKG1zZ0luZm8pOwogCX0KIApAQCAtMTk1LDE0ICsxOTUsMTQgQEAKIAlpZiAoIW1zZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltc2ctPk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VVbmxvYWQ7CisJbXNnLT5tc2d0eXBlID0gQ0hBTk5FTE1TR19VTkxPQUQ7CiAKIAlyZXQgPSBWbWJ1c1Bvc3RNZXNzYWdlKG1zZywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIpKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gQ2xlYW51cDsKIAotCW9zZF9QYWdlRnJlZShnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UsIDEpOworCW9zZF9wYWdlX2ZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKIAogCS8qIFRPRE86IGl0ZXJhdGUgdGhydSB0aGUgbXNnIGxpc3QgYW5kIGZyZWUgdXAgKi8KIAlkZXN0cm95X3dvcmtxdWV1ZShnVm1idXNDb25uZWN0aW9uLldvcmtRdWV1ZSk7CkBAIC0yMjYsOCArMjI2LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCwgTGlzdEVudHJ5KSB7Ci0JCWlmIChjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkID09IHJlbElkKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCwgbGlzdGVudHJ5KSB7CisJCWlmIChjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCA9PSByZWxJZCkgewogCQkJZm91bmRDaGFubmVsID0gY2hhbm5lbDsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMDksOSArMzA5LDkgQEAKIHsKIAl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5JZDsKIAotCWNvbm5JZC5Bc3UzMiA9IDA7Ci0JY29ubklkLnUuSWQgPSBWTUJVU19NRVNTQUdFX0NPTk5FQ1RJT05fSUQ7Ci0JcmV0dXJuIEh2UG9zdE1lc3NhZ2UoY29ubklkLCAxLCBidWZmZXIsIGJ1ZmZlckxlbik7CisJY29ubklkLmFzdTMyID0gMDsKKwljb25uSWQudS5pZCA9IFZNQlVTX01FU1NBR0VfQ09OTkVDVElPTl9JRDsKKwlyZXR1cm4gaHZfcG9zdF9tZXNzYWdlKGNvbm5JZCwgMSwgYnVmZmVyLCBidWZmZXJMZW4pOwogfQogCiAvKgpAQCAtMzI0LDUgKzMyNCw1IEBACiAJCSh1bnNpZ25lZCBsb25nICopZ1ZtYnVzQ29ubmVjdGlvbi5TZW5kSW50ZXJydXB0UGFnZSArCiAJCShjaGlsZFJlbElkID4+IDUpKTsKIAotCXJldHVybiBIdlNpZ25hbEV2ZW50KCk7CisJcmV0dXJuIGh2X3NpZ25hbF9ldmVudCgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYwppbmRleCA4NmIxZGRkLi5hMzRkNzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYwpAQCAtMjgsMTcgKzI4LDE4IEBACiAjaW5jbHVkZSAidm1idXNfcHJpdmF0ZS5oIgogCiAvKiBUaGUgb25lIGFuZCBvbmx5ICovCi1zdHJ1Y3QgaHZfY29udGV4dCBnSHZDb250ZXh0ID0gewotCS5TeW5JQ0luaXRpYWxpemVkCT0gZmFsc2UsCi0JLkh5cGVyY2FsbFBhZ2UJCT0gTlVMTCwKLQkuU2lnbmFsRXZlbnRQYXJhbQk9IE5VTEwsCi0JLlNpZ25hbEV2ZW50QnVmZmVyCT0gTlVMTCwKK3N0cnVjdCBodl9jb250ZXh0IGh2X2NvbnRleHQgPSB7CisJLnN5bmljX2luaXRpYWxpemVkCT0gZmFsc2UsCisJLmh5cGVyY2FsbF9wYWdlCQk9IE5VTEwsCisJLnNpZ25hbF9ldmVudF9wYXJhbQk9IE5VTEwsCisJLnNpZ25hbF9ldmVudF9idWZmZXIJPSBOVUxMLAogfTsKIAogLyoKLSAqIEh2UXVlcnlIeXBlcnZpc29yUHJlc2VuY2UgLSBRdWVyeSB0aGUgY3B1aWQgZm9yIHByZXNlbnNlIG9mIHdpbmRvd3MgaHlwZXJ2aXNvcgorICogcXVlcnlfaHlwZXJ2aXNvcl9wcmVzZW5jZQorICogLSBRdWVyeSB0aGUgY3B1aWQgZm9yIHByZXNlbnNlIG9mIHdpbmRvd3MgaHlwZXJ2aXNvcgogICovCi1zdGF0aWMgaW50IEh2UXVlcnlIeXBlcnZpc29yUHJlc2VuY2Uodm9pZCkKK3N0YXRpYyBpbnQgcXVlcnlfaHlwZXJ2aXNvcl9wcmVzZW5jZSh2b2lkKQogewogCXVuc2lnbmVkIGludCBlYXg7CiAJdW5zaWduZWQgaW50IGVieDsKQEAgLTUwLDIyICs1MSwyMiBAQAogCWVieCA9IDA7CiAJZWN4ID0gMDsKIAllZHggPSAwOwotCW9wID0gSHZDcHVJZEZ1bmN0aW9uVmVyc2lvbkFuZEZlYXR1cmVzOworCW9wID0gSFZDUFVJRF9WRVJTSU9OX0ZFQVRVUkVTOwogCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAogCXJldHVybiBlY3ggJiBIVl9QUkVTRU5UX0JJVDsKIH0KIAogLyoKLSAqIEh2UXVlcnlIeXBlcnZpc29ySW5mbyAtIEdldCB2ZXJzaW9uIGluZm8gb2YgdGhlIHdpbmRvd3MgaHlwZXJ2aXNvcgorICogcXVlcnlfaHlwZXJ2aXNvcl9pbmZvIC0gR2V0IHZlcnNpb24gaW5mbyBvZiB0aGUgd2luZG93cyBoeXBlcnZpc29yCiAgKi8KLXN0YXRpYyBpbnQgSHZRdWVyeUh5cGVydmlzb3JJbmZvKHZvaWQpCitzdGF0aWMgaW50IHF1ZXJ5X2h5cGVydmlzb3JfaW5mbyh2b2lkKQogewogCXVuc2lnbmVkIGludCBlYXg7CiAJdW5zaWduZWQgaW50IGVieDsKIAl1bnNpZ25lZCBpbnQgZWN4OwogCXVuc2lnbmVkIGludCBlZHg7Ci0JdW5zaWduZWQgaW50IG1heExlYWY7CisJdW5zaWduZWQgaW50IG1heF9sZWFmOwogCXVuc2lnbmVkIGludCBvcDsKIAogCS8qCkBAIC03Niw3ICs3Nyw3IEBACiAJZWJ4ID0gMDsKIAllY3ggPSAwOwogCWVkeCA9IDA7Ci0Jb3AgPSBIdkNwdUlkRnVuY3Rpb25IdlZlbmRvckFuZE1heEZ1bmN0aW9uOworCW9wID0gSFZDUFVJRF9WRU5ET1JfTUFYRlVOQ1RJT047CiAJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCiAJRFBSSU5UX0lORk8oVk1CVVMsICJWZW5kb3IgSUQ6ICVjJWMlYyVjJWMlYyVjJWMlYyVjJWMlYyIsCkBAIC05MywxMiArOTQsMTIgQEAKIAkJICAgICgoZWR4ID4+IDE2KSAmIDB4RkYpLAogCQkgICAgKChlZHggPj4gMjQpICYgMHhGRikpOwogCi0JbWF4TGVhZiA9IGVheDsKKwltYXhfbGVhZiA9IGVheDsKIAllYXggPSAwOwogCWVieCA9IDA7CiAJZWN4ID0gMDsKIAllZHggPSAwOwotCW9wID0gSHZDcHVJZEZ1bmN0aW9uSHZJbnRlcmZhY2U7CisJb3AgPSBIVkNQVUlEX0lOVEVSRkFDRTsKIAljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIkludGVyZmFjZSBJRDogJWMlYyVjJWMiLApAQCAtMTA3LDEyICsxMDgsMTIgQEAKIAkJICAgICgoZWF4ID4+IDE2KSAmIDB4RkYpLAogCQkgICAgKChlYXggPj4gMjQpICYgMHhGRikpOwogCi0JaWYgKG1heExlYWYgPj0gSHZDcHVJZEZ1bmN0aW9uTXNIdlZlcnNpb24pIHsKKwlpZiAobWF4X2xlYWYgPj0gSFZDUFVJRF9WRVJTSU9OKSB7CiAJCWVheCA9IDA7CiAJCWVieCA9IDA7CiAJCWVjeCA9IDA7CiAJCWVkeCA9IDA7Ci0JCW9wID0gSHZDcHVJZEZ1bmN0aW9uTXNIdlZlcnNpb247CisJCW9wID0gSFZDUFVJRF9WRVJTSU9OOwogCQljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAJCURQUklOVF9JTkZPKFZNQlVTLCAiT1MgQnVpbGQ6JWQtJWQuJWQtJWQtJWQuJWQiLFwKIAkJCSAgICBlYXgsCkBAIC0xMjIsODAgKzEyMyw4MSBAQAogCQkJICAgIGVkeCA+PiAyNCwKIAkJCSAgICBlZHggJiAweEZGRkZGRik7CiAJfQotCXJldHVybiBtYXhMZWFmOworCXJldHVybiBtYXhfbGVhZjsKIH0KIAogLyoKLSAqIEh2RG9IeXBlcmNhbGwgLSBJbnZva2UgdGhlIHNwZWNpZmllZCBoeXBlcmNhbGwKKyAqIGRvX2h5cGVyY2FsbC0gSW52b2tlIHRoZSBzcGVjaWZpZWQgaHlwZXJjYWxsCiAgKi8KLXN0YXRpYyB1NjQgSHZEb0h5cGVyY2FsbCh1NjQgQ29udHJvbCwgdm9pZCAqSW5wdXQsIHZvaWQgKk91dHB1dCkKK3N0YXRpYyB1NjQgZG9faHlwZXJjYWxsKHU2NCBjb250cm9sLCB2b2lkICppbnB1dCwgdm9pZCAqb3V0cHV0KQogewogI2lmZGVmIENPTkZJR19YODZfNjQKLQl1NjQgaHZTdGF0dXMgPSAwOwotCXU2NCBpbnB1dEFkZHJlc3MgPSAoSW5wdXQpID8gdmlydF90b19waHlzKElucHV0KSA6IDA7Ci0JdTY0IG91dHB1dEFkZHJlc3MgPSAoT3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhPdXRwdXQpIDogMDsKLQl2b2xhdGlsZSB2b2lkICpoeXBlcmNhbGxQYWdlID0gZ0h2Q29udGV4dC5IeXBlcmNhbGxQYWdlOworCXU2NCBodl9zdGF0dXMgPSAwOworCXU2NCBpbnB1dF9hZGRyZXNzID0gKGlucHV0KSA/IHZpcnRfdG9fcGh5cyhpbnB1dCkgOiAwOworCXU2NCBvdXRwdXRfYWRkcmVzcyA9IChvdXRwdXQpID8gdmlydF90b19waHlzKG91dHB1dCkgOiAwOworCXZvbGF0aWxlIHZvaWQgKmh5cGVyY2FsbF9wYWdlID0gaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJIeXBlcmNhbGwgPGNvbnRyb2wgJWxseCBpbnB1dCBwaHlzICVsbHggdmlydCAlcCAiCiAJCSAgICJvdXRwdXQgcGh5cyAlbGx4IHZpcnQgJXAgaHlwZXJjYWxsICVwPiIsCi0JCSAgIENvbnRyb2wsIGlucHV0QWRkcmVzcywgSW5wdXQsCi0JCSAgIG91dHB1dEFkZHJlc3MsIE91dHB1dCwgaHlwZXJjYWxsUGFnZSk7CisJCSAgIGNvbnRyb2wsIGlucHV0X2FkZHJlc3MsIGlucHV0LAorCQkgICBvdXRwdXRfYWRkcmVzcywgb3V0cHV0LCBoeXBlcmNhbGxfcGFnZSk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwLCAlJXI4IiA6IDogInIiIChvdXRwdXRBZGRyZXNzKSA6ICJyOCIpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJjYWxsIColMyIgOiAiPWEiIChodlN0YXR1cykgOgotCQkJICAgICAiYyIgKENvbnRyb2wpLCAiZCIgKGlucHV0QWRkcmVzcyksCi0JCQkgICAgICJtIiAoaHlwZXJjYWxsUGFnZSkpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YgJTAsICUlcjgiIDogOiAiciIgKG91dHB1dF9hZGRyZXNzKSA6ICJyOCIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJjYWxsIColMyIgOiAiPWEiIChodl9zdGF0dXMpIDoKKwkJCSAgICAgImMiIChjb250cm9sKSwgImQiIChpbnB1dF9hZGRyZXNzKSwKKwkJCSAgICAgIm0iIChoeXBlcmNhbGxfcGFnZSkpOwogCi0JRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8cmV0dXJuICVsbHg+IiwgIGh2U3RhdHVzKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiSHlwZXJjYWxsIDxyZXR1cm4gJWxseD4iLCAgaHZfc3RhdHVzKTsKIAotCXJldHVybiBodlN0YXR1czsKKwlyZXR1cm4gaHZfc3RhdHVzOwogCiAjZWxzZQogCi0JdTMyIGNvbnRyb2xIaSA9IENvbnRyb2wgPj4gMzI7Ci0JdTMyIGNvbnRyb2xMbyA9IENvbnRyb2wgJiAweEZGRkZGRkZGOwotCXUzMiBodlN0YXR1c0hpID0gMTsKLQl1MzIgaHZTdGF0dXNMbyA9IDE7Ci0JdTY0IGlucHV0QWRkcmVzcyA9IChJbnB1dCkgPyB2aXJ0X3RvX3BoeXMoSW5wdXQpIDogMDsKLQl1MzIgaW5wdXRBZGRyZXNzSGkgPSBpbnB1dEFkZHJlc3MgPj4gMzI7Ci0JdTMyIGlucHV0QWRkcmVzc0xvID0gaW5wdXRBZGRyZXNzICYgMHhGRkZGRkZGRjsKLQl1NjQgb3V0cHV0QWRkcmVzcyA9IChPdXRwdXQpID8gdmlydF90b19waHlzKE91dHB1dCkgOiAwOwotCXUzMiBvdXRwdXRBZGRyZXNzSGkgPSBvdXRwdXRBZGRyZXNzID4+IDMyOwotCXUzMiBvdXRwdXRBZGRyZXNzTG8gPSBvdXRwdXRBZGRyZXNzICYgMHhGRkZGRkZGRjsKLQl2b2xhdGlsZSB2b2lkICpoeXBlcmNhbGxQYWdlID0gZ0h2Q29udGV4dC5IeXBlcmNhbGxQYWdlOworCXUzMiBjb250cm9sX2hpID0gY29udHJvbCA+PiAzMjsKKwl1MzIgY29udHJvbF9sbyA9IGNvbnRyb2wgJiAweEZGRkZGRkZGOworCXUzMiBodl9zdGF0dXNfaGkgPSAxOworCXUzMiBodl9zdGF0dXNfbG8gPSAxOworCXU2NCBpbnB1dF9hZGRyZXNzID0gKGlucHV0KSA/IHZpcnRfdG9fcGh5cyhpbnB1dCkgOiAwOworCXUzMiBpbnB1dF9hZGRyZXNzX2hpID0gaW5wdXRfYWRkcmVzcyA+PiAzMjsKKwl1MzIgaW5wdXRfYWRkcmVzc19sbyA9IGlucHV0X2FkZHJlc3MgJiAweEZGRkZGRkZGOworCXU2NCBvdXRwdXRfYWRkcmVzcyA9IChvdXRwdXQpID8gdmlydF90b19waHlzKG91dHB1dCkgOiAwOworCXUzMiBvdXRwdXRfYWRkcmVzc19oaSA9IG91dHB1dF9hZGRyZXNzID4+IDMyOworCXUzMiBvdXRwdXRfYWRkcmVzc19sbyA9IG91dHB1dF9hZGRyZXNzICYgMHhGRkZGRkZGRjsKKwl2b2xhdGlsZSB2b2lkICpoeXBlcmNhbGxfcGFnZSA9IGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2U7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiSHlwZXJjYWxsIDxjb250cm9sICVsbHggaW5wdXQgJXAgb3V0cHV0ICVwPiIsCi0JCSAgIENvbnRyb2wsIElucHV0LCBPdXRwdXQpOworCQkgICBjb250cm9sLCBpbnB1dCwgb3V0cHV0KTsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2FsbCAqJTgiIDogIj1kIihodlN0YXR1c0hpKSwKLQkJCSAgICAgICI9YSIoaHZTdGF0dXNMbykgOiAiZCIgKGNvbnRyb2xIaSksCi0JCQkgICAgICAiYSIgKGNvbnRyb2xMbyksICJiIiAoaW5wdXRBZGRyZXNzSGkpLAotCQkJICAgICAgImMiIChpbnB1dEFkZHJlc3NMbyksICJEIihvdXRwdXRBZGRyZXNzSGkpLAotCQkJICAgICAgIlMiKG91dHB1dEFkZHJlc3NMbyksICJtIiAoaHlwZXJjYWxsUGFnZSkpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2FsbCAqJTgiIDogIj1kIihodl9zdGF0dXNfaGkpLAorCQkJICAgICAgIj1hIihodl9zdGF0dXNfbG8pIDogImQiIChjb250cm9sX2hpKSwKKwkJCSAgICAgICJhIiAoY29udHJvbF9sbyksICJiIiAoaW5wdXRfYWRkcmVzc19oaSksCisJCQkgICAgICAiYyIgKGlucHV0X2FkZHJlc3NfbG8pLCAiRCIob3V0cHV0X2FkZHJlc3NfaGkpLAorCQkJICAgICAgIlMiKG91dHB1dF9hZGRyZXNzX2xvKSwgIm0iIChoeXBlcmNhbGxfcGFnZSkpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8cmV0dXJuICVsbHg+IiwKLQkJICAgaHZTdGF0dXNMbyB8ICgodTY0KWh2U3RhdHVzSGkgPDwgMzIpKTsKKwkJICAgaHZfc3RhdHVzX2xvIHwgKCh1NjQpaHZfc3RhdHVzX2hpIDw8IDMyKSk7CiAKLQlyZXR1cm4gaHZTdGF0dXNMbyB8ICgodTY0KWh2U3RhdHVzSGkgPDwgMzIpOworCXJldHVybiBodl9zdGF0dXNfbG8gfCAoKHU2NClodl9zdGF0dXNfaGkgPDwgMzIpOwogI2VuZGlmIC8qICF4ODZfNjQgKi8KIH0KIAogLyoKLSAqIEh2SW5pdCAtIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqIGh2X2luaXQgLSBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCiAgKgogICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgcm91dGluZXMgaW4gaGVyZSBhcmUgY2FsbGVkCiAgKi8KLWludCBIdkluaXQodm9pZCkKK2ludCBodl9pbml0KHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0JaW50IG1heExlYWY7Ci0JdW5pb24gaHZfeDY0X21zcl9oeXBlcmNhbGxfY29udGVudHMgaHlwZXJjYWxsTXNyOwotCXZvaWQgKnZpcnRBZGRyID0gTlVMTDsKKwlpbnQgbWF4X2xlYWY7CisJdW5pb24gaHZfeDY0X21zcl9oeXBlcmNhbGxfY29udGVudHMgaHlwZXJjYWxsX21zcjsKKwl2b2lkICp2aXJ0YWRkciA9IE5VTEw7CiAKLQltZW1zZXQoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZSwgMCwgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOwotCW1lbXNldChnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2UsIDAsIHNpemVvZih2b2lkICopICogTUFYX05VTV9DUFVTKTsKKwltZW1zZXQoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlLCAwLCBzaXplb2Yodm9pZCAqKSAqIE1BWF9OVU1fQ1BVUyk7CisJbWVtc2V0KGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlLCAwLAorCSAgICAgICBzaXplb2Yodm9pZCAqKSAqIE1BWF9OVU1fQ1BVUyk7CiAKLQlpZiAoIUh2UXVlcnlIeXBlcnZpc29yUHJlc2VuY2UoKSkgeworCWlmICghcXVlcnlfaHlwZXJ2aXNvcl9wcmVzZW5jZSgpKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsICJObyBXaW5kb3dzIGh5cGVydmlzb3IgZGV0ZWN0ZWQhISIpOwogCQlnb3RvIENsZWFudXA7CiAJfQpAQCAtMjAzLDE0NiArMjA1LDE0OCBAQAogCURQUklOVF9JTkZPKFZNQlVTLAogCQkgICAgIldpbmRvd3MgaHlwZXJ2aXNvciBkZXRlY3RlZCEgUmV0cmlldmluZyBtb3JlIGluZm8uLi4iKTsKIAotCW1heExlYWYgPSBIdlF1ZXJ5SHlwZXJ2aXNvckluZm8oKTsKKwltYXhfbGVhZiA9IHF1ZXJ5X2h5cGVydmlzb3JfaW5mbygpOwogCS8qIEh2UXVlcnlIeXBlcnZpc29yRmVhdHVyZXMobWF4TGVhZik7ICovCiAKIAkvKgogCSAqIFdlIG9ubHkgc3VwcG9ydCBydW5uaW5nIG9uIHRvcCBvZiBIeXBlci1WCiAJICovCi0JcmRtc3JsKEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQsIGdIdkNvbnRleHQuR3Vlc3RJZCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQsIGh2X2NvbnRleHQuZ3Vlc3RpZCk7CiAKLQlpZiAoZ0h2Q29udGV4dC5HdWVzdElkICE9IDApIHsKKwlpZiAoaHZfY29udGV4dC5ndWVzdGlkICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVUywgIlVua25vd24gZ3Vlc3QgaWQgKDB4JWxseCkhISIsCi0JCQkJZ0h2Q29udGV4dC5HdWVzdElkKTsKKwkJCQlodl9jb250ZXh0Lmd1ZXN0aWQpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJLyogV3JpdGUgb3VyIE9TIGluZm8gKi8KIAl3cm1zcmwoSFZfWDY0X01TUl9HVUVTVF9PU19JRCwgSFZfTElOVVhfR1VFU1RfSUQpOwotCWdIdkNvbnRleHQuR3Vlc3RJZCA9IEhWX0xJTlVYX0dVRVNUX0lEOworCWh2X2NvbnRleHQuZ3Vlc3RpZCA9IEhWX0xJTlVYX0dVRVNUX0lEOwogCiAJLyogU2VlIGlmIHRoZSBoeXBlcmNhbGwgcGFnZSBpcyBhbHJlYWR5IHNldCAqLwotCXJkbXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsTXNyLkFzVUlOVDY0KTsKKwlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbF9tc3IuYXNfdWludDY0KTsKIAogCS8qCiAJKiBBbGxvY2F0ZSB0aGUgaHlwZXJjYWxsIHBhZ2UgbWVtb3J5Ci0JKiB2aXJ0QWRkciA9IG9zZF9QYWdlQWxsb2MoMSk7CisJKiB2aXJ0YWRkciA9IG9zZF9wYWdlX2FsbG9jKDEpOwogCSovCi0JdmlydEFkZHIgPSBvc2RfVmlydHVhbEFsbG9jRXhlYyhQQUdFX1NJWkUpOworCXZpcnRhZGRyID0gb3NkX3ZpcnR1YWxfYWxsb2NfZXhlYyhQQUdFX1NJWkUpOwogCi0JaWYgKCF2aXJ0QWRkcikgeworCWlmICghdmlydGFkZHIpIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgaHlwZXJjYWxsIHBhZ2UhISIpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JaHlwZXJjYWxsTXNyLkVuYWJsZSA9IDE7CisJaHlwZXJjYWxsX21zci5lbmFibGUgPSAxOwogCi0JaHlwZXJjYWxsTXNyLkd1ZXN0UGh5c2ljYWxBZGRyZXNzID0gdm1hbGxvY190b19wZm4odmlydEFkZHIpOwotCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsTXNyLkFzVUlOVDY0KTsKKwloeXBlcmNhbGxfbXNyLmd1ZXN0X3BoeXNpY2FsX2FkZHJlc3MgPSB2bWFsbG9jX3RvX3Bmbih2aXJ0YWRkcik7CisJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CiAKIAkvKiBDb25maXJtIHRoYXQgaHlwZXJjYWxsIHBhZ2UgZGlkIGdldCBzZXR1cC4gKi8KLQloeXBlcmNhbGxNc3IuQXNVSU5UNjQgPSAwOwotCXJkbXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsTXNyLkFzVUlOVDY0KTsKKwloeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCA9IDA7CisJcmRtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CiAKLQlpZiAoIWh5cGVyY2FsbE1zci5FbmFibGUpIHsKKwlpZiAoIWh5cGVyY2FsbF9tc3IuZW5hYmxlKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsICJ1bmFibGUgdG8gc2V0IGh5cGVyY2FsbCBwYWdlISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSA9IHZpcnRBZGRyOworCWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UgPSB2aXJ0YWRkcjsKIAogCURQUklOVF9JTkZPKFZNQlVTLCAiSHlwZXJjYWxsIHBhZ2UgVkE9JXAsIFBBPTB4JTBsbHgiLAotCQkgICAgZ0h2Q29udGV4dC5IeXBlcmNhbGxQYWdlLAotCQkgICAgKHU2NCloeXBlcmNhbGxNc3IuR3Vlc3RQaHlzaWNhbEFkZHJlc3MgPDwgUEFHRV9TSElGVCk7CisJCSAgICBodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlLAorCQkgICAgKHU2NCloeXBlcmNhbGxfbXNyLmd1ZXN0X3BoeXNpY2FsX2FkZHJlc3MgPDwgUEFHRV9TSElGVCk7CiAKIAkvKiBTZXR1cCB0aGUgZ2xvYmFsIHNpZ25hbCBldmVudCBwYXJhbSBmb3IgdGhlIHNpZ25hbCBldmVudCBoeXBlcmNhbGwgKi8KLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50QnVmZmVyID0KKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIgPQogCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudF9idWZmZXIpLAogCQkJCUdGUF9LRVJORUwpOwotCWlmICghZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlcikKKwlpZiAoIWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X2J1ZmZlcikKIAkJZ290byBDbGVhbnVwOwogCi0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtID0KKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbSA9CiAJCShzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50ICopCi0JCQkoQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlciwKKwkJCShBTElHTl9VUCgodW5zaWduZWQgbG9uZykKKwkJCQkgIGh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X2J1ZmZlciwKIAkJCQkgIEhWX0hZUEVSQ0FMTF9QQVJBTV9BTElHTikpOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbS0+Q29ubmVjdGlvbklkLkFzdTMyID0gMDsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPkNvbm5lY3Rpb25JZC51LklkID0KKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbS0+Y29ubmVjdGlvbmlkLmFzdTMyID0gMDsKKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbS0+Y29ubmVjdGlvbmlkLnUuaWQgPQogCQkJCQkJVk1CVVNfRVZFTlRfQ09OTkVDVElPTl9JRDsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPkZsYWdOdW1iZXIgPSAwOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbS0+UnN2ZFogPSAwOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLT5mbGFnX251bWJlciA9IDA7CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0tPnJzdmR6ID0gMDsKIAogCXJldHVybiByZXQ7CiAKIENsZWFudXA6Ci0JaWYgKHZpcnRBZGRyKSB7Ci0JCWlmIChoeXBlcmNhbGxNc3IuRW5hYmxlKSB7Ci0JCQloeXBlcmNhbGxNc3IuQXNVSU5UNjQgPSAwOwotCQkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxNc3IuQXNVSU5UNjQpOworCWlmICh2aXJ0YWRkcikgeworCQlpZiAoaHlwZXJjYWxsX21zci5lbmFibGUpIHsKKwkJCWh5cGVyY2FsbF9tc3IuYXNfdWludDY0ID0gMDsKKwkJCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsX21zci5hc191aW50NjQpOwogCQl9CiAKLQkJdmZyZWUodmlydEFkZHIpOworCQl2ZnJlZSh2aXJ0YWRkcik7CiAJfQogCXJldCA9IC0xOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBIdkNsZWFudXAgLSBDbGVhbnVwIHJvdXRpbmUuCisgKiBodl9jbGVhbnVwIC0gQ2xlYW51cCByb3V0aW5lLgogICoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgbm9ybWFsbHkgZHVyaW5nIGRyaXZlciB1bmxvYWRpbmcgb3IgZXhpdGluZy4KICAqLwotdm9pZCBIdkNsZWFudXAodm9pZCkKK3ZvaWQgaHZfY2xlYW51cCh2b2lkKQogewotCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbE1zcjsKKwl1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyBoeXBlcmNhbGxfbXNyOwogCi0Ja2ZyZWUoZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlcik7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlciA9IE5VTEw7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtID0gTlVMTDsKKwlrZnJlZShodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIpOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X2J1ZmZlciA9IE5VTEw7CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0gPSBOVUxMOwogCi0JaWYgKGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSkgewotCQloeXBlcmNhbGxNc3IuQXNVSU5UNjQgPSAwOwotCQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7Ci0JCXZmcmVlKGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSk7Ci0JCWdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSA9IE5VTEw7CisJaWYgKGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpIHsKKwkJaHlwZXJjYWxsX21zci5hc191aW50NjQgPSAwOworCQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbF9tc3IuYXNfdWludDY0KTsKKwkJdmZyZWUoaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSk7CisJCWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UgPSBOVUxMOwogCX0KIH0KIAogLyoKLSAqIEh2UG9zdE1lc3NhZ2UgLSBQb3N0IGEgbWVzc2FnZSB1c2luZyB0aGUgaHlwZXJ2aXNvciBtZXNzYWdlIElQQy4KKyAqIGh2X3Bvc3RfbWVzc2FnZSAtIFBvc3QgYSBtZXNzYWdlIHVzaW5nIHRoZSBoeXBlcnZpc29yIG1lc3NhZ2UgSVBDLgogICoKICAqIFRoaXMgaW52b2x2ZXMgYSBoeXBlcmNhbGwuCiAgKi8KLXUxNiBIdlBvc3RNZXNzYWdlKHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbklkLAotCQkgIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VUeXBlLAotCQkgIHZvaWQgKnBheWxvYWQsIHNpemVfdCBwYXlsb2FkU2l6ZSkKK3UxNiBodl9wb3N0X21lc3NhZ2UodW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uX2lkLAorCQkgIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VfdHlwZSwKKwkJICB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZF9zaXplKQogewotCXN0cnVjdCBhbGlnbmVkSW5wdXQgeworCXN0cnVjdCBhbGlnbmVkX2lucHV0IHsKIAkJdTY0IGFsaWdubWVudDg7CiAJCXN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgbXNnOwogCX07CiAKLQlzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlICphbGlnbmVkTXNnOworCXN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgKmFsaWduZWRfbXNnOwogCXUxNiBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCi0JaWYgKHBheWxvYWRTaXplID4gSFZfTUVTU0FHRV9QQVlMT0FEX0JZVEVfQ09VTlQpCisJaWYgKHBheWxvYWRfc2l6ZSA+IEhWX01FU1NBR0VfUEFZTE9BRF9CWVRFX0NPVU5UKQogCQlyZXR1cm4gLTE7CiAKLQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpa21hbGxvYyhzaXplb2Yoc3RydWN0IGFsaWduZWRJbnB1dCksIEdGUF9BVE9NSUMpOworCWFkZHIgPSAodW5zaWduZWQgbG9uZylrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxpZ25lZF9pbnB1dCksIEdGUF9BVE9NSUMpOwogCWlmICghYWRkcikKIAkJcmV0dXJuIC0xOwogCi0JYWxpZ25lZE1zZyA9IChzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlICopCisJYWxpZ25lZF9tc2cgPSAoc3RydWN0IGh2X2lucHV0X3Bvc3RfbWVzc2FnZSAqKQogCQkJKEFMSUdOX1VQKGFkZHIsIEhWX0hZUEVSQ0FMTF9QQVJBTV9BTElHTikpOwogCi0JYWxpZ25lZE1zZy0+Q29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOwotCWFsaWduZWRNc2ctPk1lc3NhZ2VUeXBlID0gbWVzc2FnZVR5cGU7Ci0JYWxpZ25lZE1zZy0+UGF5bG9hZFNpemUgPSBwYXlsb2FkU2l6ZTsKLQltZW1jcHkoKHZvaWQgKilhbGlnbmVkTXNnLT5QYXlsb2FkLCBwYXlsb2FkLCBwYXlsb2FkU2l6ZSk7CisJYWxpZ25lZF9tc2ctPmNvbm5lY3Rpb25pZCA9IGNvbm5lY3Rpb25faWQ7CisJYWxpZ25lZF9tc2ctPm1lc3NhZ2VfdHlwZSA9IG1lc3NhZ2VfdHlwZTsKKwlhbGlnbmVkX21zZy0+cGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplOworCW1lbWNweSgodm9pZCAqKWFsaWduZWRfbXNnLT5wYXlsb2FkLCBwYXlsb2FkLCBwYXlsb2FkX3NpemUpOwogCi0Jc3RhdHVzID0gSHZEb0h5cGVyY2FsbChIdkNhbGxQb3N0TWVzc2FnZSwgYWxpZ25lZE1zZywgTlVMTCkgJiAweEZGRkY7CisJc3RhdHVzID0gZG9faHlwZXJjYWxsKEhWQ0FMTF9QT1NUX01FU1NBR0UsIGFsaWduZWRfbXNnLCBOVUxMKQorCQkmIDB4RkZGRjsKIAogCWtmcmVlKCh2b2lkICopYWRkcik7CiAKQEAgLTM1MSwzOCArMzU1LDQwIEBACiAKIAogLyoKLSAqIEh2U2lnbmFsRXZlbnQgLSBTaWduYWwgYW4gZXZlbnQgb24gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHVzaW5nIHRoZSBoeXBlcnZpc29yIGV2ZW50IElQQy4KKyAqIGh2X3NpZ25hbF9ldmVudCAtCisgKiBTaWduYWwgYW4gZXZlbnQgb24gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHVzaW5nIHRoZSBoeXBlcnZpc29yIGV2ZW50IElQQy4KICAqCiAgKiBUaGlzIGludm9sdmVzIGEgaHlwZXJjYWxsLgogICovCi11MTYgSHZTaWduYWxFdmVudCh2b2lkKQordTE2IGh2X3NpZ25hbF9ldmVudCh2b2lkKQogewogCXUxNiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBIdkRvSHlwZXJjYWxsKEh2Q2FsbFNpZ25hbEV2ZW50LCBnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0sCisJc3RhdHVzID0gZG9faHlwZXJjYWxsKEhWQ0FMTF9TSUdOQUxfRVZFTlQsCisJCQkgICAgICAgaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0sCiAJCQkgICAgICAgTlVMTCkgJiAweEZGRkY7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKLSAqIEh2U3luaWNJbml0IC0gSW5pdGlhbGl6ZSB0aGUgU3ludGhldGhpYyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KKyAqIGh2X3N5bmljX2luaXQgLSBJbml0aWFsaXplIHRoZSBTeW50aGV0aGljIEludGVycnVwdCBDb250cm9sbGVyLgogICoKICAqIElmIGl0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgYnkgYW5vdGhlciBlbnRpdHkgKGllIHgydiBzaGltKSwgd2UgbmVlZCB0bwogICogcmV0cmlldmUgdGhlIGluaXRpYWxpemVkIG1lc3NhZ2UgYW5kIGV2ZW50IHBhZ2VzLiAgT3RoZXJ3aXNlLCB3ZSBjcmVhdGUgYW5kCiAgKiBpbml0aWFsaXplIHRoZSBtZXNzYWdlIGFuZCBldmVudCBwYWdlcy4KICAqLwotdm9pZCBIdlN5bmljSW5pdCh2b2lkICppcnFhcmcpCit2b2lkIGh2X3N5bmljX2luaXQodm9pZCAqaXJxYXJnKQogewogCXU2NCB2ZXJzaW9uOwogCXVuaW9uIGh2X3N5bmljX3NpbXAgc2ltcDsKIAl1bmlvbiBodl9zeW5pY19zaWVmcCBzaWVmcDsKLQl1bmlvbiBodl9zeW5pY19zaW50IHNoYXJlZFNpbnQ7CisJdW5pb24gaHZfc3luaWNfc2ludCBzaGFyZWRfc2ludDsKIAl1bmlvbiBodl9zeW5pY19zY29udHJvbCBzY3RybDsKIAotCXUzMiBpcnFWZWN0b3IgPSAqKCh1MzIgKikoaXJxYXJnKSk7CisJdTMyIGlycV92ZWN0b3IgPSAqKCh1MzIgKikoaXJxYXJnKSk7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmICghZ0h2Q29udGV4dC5IeXBlcmNhbGxQYWdlKQorCWlmICghaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSkKIAkJcmV0dXJuOwogCiAJLyogQ2hlY2sgdGhlIHZlcnNpb24gKi8KQEAgLTM5MCwxMTAgKzM5NiwxMTIgQEAKIAogCURQUklOVF9JTkZPKFZNQlVTLCAiU3luSUMgdmVyc2lvbjogJWxseCIsIHZlcnNpb24pOwogCi0JZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwlodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdID0KKwkJKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CiAKLQlpZiAoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV0gPT0gTlVMTCkgeworCWlmIChodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdID09IE5VTEwpIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgU1lOSUMgbWVzc2FnZSBwYWdlISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCWh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdID0KKwkJKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CiAKLQlpZiAoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdID09IE5VTEwpIHsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0gPT0gTlVMTCkgewogCQlEUFJJTlRfRVJSKFZNQlVTLAogCQkJICAgInVuYWJsZSB0byBhbGxvY2F0ZSBTWU5JQyBldmVudCBwYWdlISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIFNldHVwIHRoZSBTeW5pYydzIG1lc3NhZ2UgcGFnZSAqLwotCXJkbXNybChIVl9YNjRfTVNSX1NJTVAsIHNpbXAuQXNVSU5UNjQpOwotCXNpbXAuU2ltcEVuYWJsZWQgPSAxOwotCXNpbXAuQmFzZVNpbXBHcGEgPSB2aXJ0X3RvX3BoeXMoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV0pCisJcmRtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5hc191aW50NjQpOworCXNpbXAuc2ltcF9lbmFibGVkID0gMTsKKwlzaW1wLmJhc2Vfc2ltcF9ncGEgPSB2aXJ0X3RvX3BoeXMoaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSkKIAkJPj4gUEFHRV9TSElGVDsKIAotCURQUklOVF9EQkcoVk1CVVMsICJIVl9YNjRfTVNSX1NJTVAgbXNyIHNldCB0bzogJWxseCIsIHNpbXAuQXNVSU5UNjQpOworCURQUklOVF9EQkcoVk1CVVMsICJIVl9YNjRfTVNSX1NJTVAgbXNyIHNldCB0bzogJWxseCIsIHNpbXAuYXNfdWludDY0KTsKIAotCXdybXNybChIVl9YNjRfTVNSX1NJTVAsIHNpbXAuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJTVAsIHNpbXAuYXNfdWludDY0KTsKIAogCS8qIFNldHVwIHRoZSBTeW5pYydzIGV2ZW50IHBhZ2UgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuQXNVSU5UNjQpOwotCXNpZWZwLlNpZWZwRW5hYmxlZCA9IDE7Ci0Jc2llZnAuQmFzZVNpZWZwR3BhID0gdmlydF90b19waHlzKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSkKKwlyZG1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKKwlzaWVmcC5zaWVmcF9lbmFibGVkID0gMTsKKwlzaWVmcC5iYXNlX3NpZWZwX2dwYSA9IHZpcnRfdG9fcGh5cyhodl9jb250ZXh0LnN5bmljX2V2ZW50X3BhZ2VbY3B1XSkKIAkJPj4gUEFHRV9TSElGVDsKIAotCURQUklOVF9EQkcoVk1CVVMsICJIVl9YNjRfTVNSX1NJRUZQIG1zciBzZXQgdG86ICVsbHgiLCBzaWVmcC5Bc1VJTlQ2NCk7CisJRFBSSU5UX0RCRyhWTUJVUywgIkhWX1g2NF9NU1JfU0lFRlAgbXNyIHNldCB0bzogJWxseCIsIHNpZWZwLmFzX3VpbnQ2NCk7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJRUZQLCBzaWVmcC5hc191aW50NjQpOwogCiAJLyogU2V0dXAgdGhlIGludGVyY2VwdGlvbiBTSU5ULiAqLwogCS8qIHdybXNybCgoSFZfWDY0X01TUl9TSU5UMCArIEhWX1NZTklDX0lOVEVSQ0VQVElPTl9TSU5UX0lOREVYKSwgKi8KLQkvKgkgIGludGVyY2VwdGlvblNpbnQuQXNVSU5UNjQpOyAqLworCS8qCSAgaW50ZXJjZXB0aW9uU2ludC5hc191aW50NjQpOyAqLwogCiAJLyogU2V0dXAgdGhlIHNoYXJlZCBTSU5ULiAqLwotCXJkbXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRTaW50LkFzVUlOVDY0KTsKKwlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkX3NpbnQuYXNfdWludDY0KTsKIAotCXNoYXJlZFNpbnQuQXNVSU5UNjQgPSAwOwotCXNoYXJlZFNpbnQuVmVjdG9yID0gaXJxVmVjdG9yOyAvKiBIVl9TSEFSRURfU0lOVF9JRFRfVkVDVE9SICsgMHgyMDsgKi8KLQlzaGFyZWRTaW50Lk1hc2tlZCA9IGZhbHNlOwotCXNoYXJlZFNpbnQuQXV0b0VvaSA9IHRydWU7CisJc2hhcmVkX3NpbnQuYXNfdWludDY0ID0gMDsKKwlzaGFyZWRfc2ludC52ZWN0b3IgPSBpcnFfdmVjdG9yOyAvKiBIVl9TSEFSRURfU0lOVF9JRFRfVkVDVE9SICsgMHgyMDsgKi8KKwlzaGFyZWRfc2ludC5tYXNrZWQgPSBmYWxzZTsKKwlzaGFyZWRfc2ludC5hdXRvX2VvaSA9IHRydWU7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSU5UMSBtc3Igc2V0IHRvOiAlbGx4IiwKLQkJICAgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJCSAgIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKIAkvKiBFbmFibGUgdGhlIGdsb2JhbCBzeW5pYyBiaXQgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TQ09OVFJPTCwgc2N0cmwuQXNVSU5UNjQpOwotCXNjdHJsLkVuYWJsZSA9IDE7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0NPTlRST0wsIHNjdHJsLmFzX3VpbnQ2NCk7CisJc2N0cmwuZW5hYmxlID0gMTsKIAotCXdybXNybChIVl9YNjRfTVNSX1NDT05UUk9MLCBzY3RybC5Bc1VJTlQ2NCk7CisJd3Jtc3JsKEhWX1g2NF9NU1JfU0NPTlRST0wsIHNjdHJsLmFzX3VpbnQ2NCk7CiAKLQlnSHZDb250ZXh0LlN5bklDSW5pdGlhbGl6ZWQgPSB0cnVlOworCWh2X2NvbnRleHQuc3luaWNfaW5pdGlhbGl6ZWQgPSB0cnVlOwogCXJldHVybjsKIAogQ2xlYW51cDoKLQlpZiAoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdKQotCQlvc2RfUGFnZUZyZWUoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdLCAxKTsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0pCisJCW9zZF9wYWdlX2ZyZWUoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0sIDEpOwogCi0JaWYgKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdKQotCQlvc2RfUGFnZUZyZWUoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlW2NwdV0sIDEpOworCWlmIChodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdKQorCQlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV0sIDEpOwogCXJldHVybjsKIH0KIAogLyoKLSAqIEh2U3luaWNDbGVhbnVwIC0gQ2xlYW51cCByb3V0aW5lIGZvciBIdlN5bmljSW5pdCgpLgorICogaHZfc3luaWNfY2xlYW51cCAtIENsZWFudXAgcm91dGluZSBmb3IgaHZfc3luaWNfaW5pdCgpLgogICovCi12b2lkIEh2U3luaWNDbGVhbnVwKHZvaWQgKmFyZykKK3ZvaWQgaHZfc3luaWNfY2xlYW51cCh2b2lkICphcmcpCiB7Ci0JdW5pb24gaHZfc3luaWNfc2ludCBzaGFyZWRTaW50OworCXVuaW9uIGh2X3N5bmljX3NpbnQgc2hhcmVkX3NpbnQ7CiAJdW5pb24gaHZfc3luaWNfc2ltcCBzaW1wOwogCXVuaW9uIGh2X3N5bmljX3NpZWZwIHNpZWZwOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoIWdIdkNvbnRleHQuU3luSUNJbml0aWFsaXplZCkKKwlpZiAoIWh2X2NvbnRleHQuc3luaWNfaW5pdGlhbGl6ZWQpCiAJCXJldHVybjsKIAotCXJkbXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRTaW50LkFzVUlOVDY0KTsKKwlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkX3NpbnQuYXNfdWludDY0KTsKIAotCXNoYXJlZFNpbnQuTWFza2VkID0gMTsKKwlzaGFyZWRfc2ludC5tYXNrZWQgPSAxOwogCiAJLyogTmVlZCB0byBjb3JyZWN0bHkgY2xlYW51cCBpbiB0aGUgY2FzZSBvZiBTTVAhISEgKi8KIAkvKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQl3cm1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQlyZG1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKLQlzaW1wLlNpbXBFbmFibGVkID0gMDsKLQlzaW1wLkJhc2VTaW1wR3BhID0gMDsKKwlyZG1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLmFzX3VpbnQ2NCk7CisJc2ltcC5zaW1wX2VuYWJsZWQgPSAwOworCXNpbXAuYmFzZV9zaW1wX2dwYSA9IDA7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLmFzX3VpbnQ2NCk7CiAKLQlyZG1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuQXNVSU5UNjQpOwotCXNpZWZwLlNpZWZwRW5hYmxlZCA9IDA7Ci0Jc2llZnAuQmFzZVNpZWZwR3BhID0gMDsKKwlyZG1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKKwlzaWVmcC5zaWVmcF9lbmFibGVkID0gMDsKKwlzaWVmcC5iYXNlX3NpZWZwX2dwYSA9IDA7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJRUZQLCBzaWVmcC5hc191aW50NjQpOwogCi0Jb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdLCAxKTsKLQlvc2RfUGFnZUZyZWUoZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdLCAxKTsKKwlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV0sIDEpOworCW9zZF9wYWdlX2ZyZWUoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0sIDEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuaAppbmRleCA0MWY1ZWJiLi44MjlhZmY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKQEAgLTkyLDQ5ICs5Miw0OSBAQAogCiAKIHN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyIHsKLQl1NjQgQWxpZ244OwotCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnQgRXZlbnQ7CisJdTY0IGFsaWduODsKKwlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50IGV2ZW50OwogfTsKIAogc3RydWN0IGh2X2NvbnRleHQgewogCS8qIFdlIG9ubHkgc3VwcG9ydCBydW5uaW5nIG9uIHRvcCBvZiBIeXBlci1WCiAJKiBTbyBhdCB0aGlzIHBvaW50IHRoaXMgcmVhbGx5IGNhbiBvbmx5IGNvbnRhaW4gdGhlIEh5cGVyLVYgSUQKIAkqLwotCXU2NCBHdWVzdElkOworCXU2NCBndWVzdGlkOwogCi0Jdm9pZCAqSHlwZXJjYWxsUGFnZTsKKwl2b2lkICpoeXBlcmNhbGxfcGFnZTsKIAotCWJvb2wgU3luSUNJbml0aWFsaXplZDsKKwlib29sIHN5bmljX2luaXRpYWxpemVkOwogCiAJLyoKIAkgKiBUaGlzIGlzIHVzZWQgYXMgYW4gaW5wdXQgcGFyYW0gdG8gSHZDYWxsU2lnbmFsRXZlbnQgaHlwZXJjYWxsLiBUaGUKIAkgKiBpbnB1dCBwYXJhbSBpcyBpbW11dGFibGUgaW4gb3VyIHVzYWdlIGFuZCBtdXN0IGJlIGR5bmFtaWMgbWVtICh2cwogCSAqIHN0YWNrIG9yIGdsb2JhbCkuICovCi0Jc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudF9idWZmZXIgKlNpZ25hbEV2ZW50QnVmZmVyOworCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyICpzaWduYWxfZXZlbnRfYnVmZmVyOwogCS8qIDgtYnl0ZXMgYWxpZ25lZCBvZiB0aGUgYnVmZmVyIGFib3ZlICovCi0Jc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCAqU2lnbmFsRXZlbnRQYXJhbTsKKwlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50ICpzaWduYWxfZXZlbnRfcGFyYW07CiAKLQl2b2lkICpzeW5JQ01lc3NhZ2VQYWdlW01BWF9OVU1fQ1BVU107Ci0Jdm9pZCAqc3luSUNFdmVudFBhZ2VbTUFYX05VTV9DUFVTXTsKKwl2b2lkICpzeW5pY19tZXNzYWdlX3BhZ2VbTUFYX05VTV9DUFVTXTsKKwl2b2lkICpzeW5pY19ldmVudF9wYWdlW01BWF9OVU1fQ1BVU107CiB9OwogCi1leHRlcm4gc3RydWN0IGh2X2NvbnRleHQgZ0h2Q29udGV4dDsKK2V4dGVybiBzdHJ1Y3QgaHZfY29udGV4dCBodl9jb250ZXh0OwogCiAKIC8qIEh2IEludGVyZmFjZSAqLwogCi1leHRlcm4gaW50IEh2SW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgaHZfaW5pdCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgSHZDbGVhbnVwKHZvaWQpOworZXh0ZXJuIHZvaWQgaHZfY2xlYW51cCh2b2lkKTsKIAotZXh0ZXJuIHUxNiBIdlBvc3RNZXNzYWdlKHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbklkLAotCQkJIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VUeXBlLAotCQkJIHZvaWQgKnBheWxvYWQsIHNpemVfdCBwYXlsb2FkU2l6ZSk7CitleHRlcm4gdTE2IGh2X3Bvc3RfbWVzc2FnZSh1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25faWQsCisJCQkgZW51bSBodl9tZXNzYWdlX3R5cGUgbWVzc2FnZV90eXBlLAorCQkJIHZvaWQgKnBheWxvYWQsIHNpemVfdCBwYXlsb2FkX3NpemUpOwogCi1leHRlcm4gdTE2IEh2U2lnbmFsRXZlbnQodm9pZCk7CitleHRlcm4gdTE2IGh2X3NpZ25hbF9ldmVudCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgSHZTeW5pY0luaXQodm9pZCAqaXJxYXJnKTsKK2V4dGVybiB2b2lkIGh2X3N5bmljX2luaXQodm9pZCAqaXJxYXJnKTsKIAotZXh0ZXJuIHZvaWQgSHZTeW5pY0NsZWFudXAodm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIGh2X3N5bmljX2NsZWFudXAodm9pZCAqYXJnKTsKIAogI2VuZGlmIC8qIF9fSFZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKaW5kZXggOWViODE4ZS4uNzBlODYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaApAQCAtNTEwLDIxICs1MTAsMjEgQEAKIAogLyoKICAqIFRoZSBiZWxvdyBDUFVJRCBsZWF2ZXMgYXJlIHByZXNlbnQgaWYgVmVyc2lvbkFuZEZlYXR1cmVzLkh5cGVydmlzb3JQcmVzZW50Ci0gKiBpcyBzZXQgYnkgQ1BVSUQoSHZDcHVJZEZ1bmN0aW9uVmVyc2lvbkFuZEZlYXR1cmVzKS4KKyAqIGlzIHNldCBieSBDUFVJRChIVkNQVUlEX1ZFUlNJT05fRkVBVFVSRVMpLgogICovCiBlbnVtIGh2X2NwdWlkX2Z1bmN0aW9uIHsKLQlIdkNwdUlkRnVuY3Rpb25WZXJzaW9uQW5kRmVhdHVyZXMJCT0gMHgwMDAwMDAwMSwKLQlIdkNwdUlkRnVuY3Rpb25IdlZlbmRvckFuZE1heEZ1bmN0aW9uCQk9IDB4NDAwMDAwMDAsCi0JSHZDcHVJZEZ1bmN0aW9uSHZJbnRlcmZhY2UJCQk9IDB4NDAwMDAwMDEsCisJSFZDUFVJRF9WRVJTSU9OX0ZFQVRVUkVTCQk9IDB4MDAwMDAwMDEsCisJSFZDUFVJRF9WRU5ET1JfTUFYRlVOQ1RJT04JCT0gMHg0MDAwMDAwMCwKKwlIVkNQVUlEX0lOVEVSRkFDRQkJCT0gMHg0MDAwMDAwMSwKIAogCS8qCiAJICogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZgotCSAqIEh2Q3B1SWRGdW5jdGlvbkludGVyZmFjZQorCSAqIEhWQ1BVSURfSU5URVJGQUNFCiAJICovCi0JSHZDcHVJZEZ1bmN0aW9uTXNIdlZlcnNpb24JCQk9IDB4NDAwMDAwMDIsCi0JSHZDcHVJZEZ1bmN0aW9uTXNIdkZlYXR1cmVzCQkJPSAweDQwMDAwMDAzLAotCUh2Q3B1SWRGdW5jdGlvbk1zSHZFbmxpZ2h0ZW5tZW50SW5mb3JtYXRpb24JPSAweDQwMDAwMDA0LAotCUh2Q3B1SWRGdW5jdGlvbk1zSHZJbXBsZW1lbnRhdGlvbkxpbWl0cwkJPSAweDQwMDAwMDA1LAorCUhWQ1BVSURfVkVSU0lPTgkJCT0gMHg0MDAwMDAwMiwKKwlIVkNQVUlEX0ZFQVRVUkVTCQkJPSAweDQwMDAwMDAzLAorCUhWQ1BVSURfRU5MSUdIVEVOTUVOVF9JTkZPCT0gMHg0MDAwMDAwNCwKKwlIVkNQVUlEX0lNUExFTUVOVEFUSU9OX0xJTUlUUwkJPSAweDQwMDAwMDA1LAogfTsKIAogLyogRGVmaW5lIHRoZSB2aXJ0dWFsIEFQSUMgcmVnaXN0ZXJzICovCkBAIC01NzUsMzAgKzU3NSwzMCBAQAogCiAvKiBEZWZpbmUgaHlwZXJ2aXNvciBtZXNzYWdlIHR5cGVzLiAqLwogZW51bSBodl9tZXNzYWdlX3R5cGUgewotCUh2TWVzc2FnZVR5cGVOb25lCQkJPSAweDAwMDAwMDAwLAorCUhWTVNHX05PTkUJCQk9IDB4MDAwMDAwMDAsCiAKIAkvKiBNZW1vcnkgYWNjZXNzIG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVVbm1hcHBlZEdwYQkJPSAweDgwMDAwMDAwLAotCUh2TWVzc2FnZVR5cGVHcGFJbnRlcmNlcHQJCT0gMHg4MDAwMDAwMSwKKwlIVk1TR19VTk1BUFBFRF9HUEEJCT0gMHg4MDAwMDAwMCwKKwlIVk1TR19HUEFfSU5URVJDRVBUCQk9IDB4ODAwMDAwMDEsCiAKIAkvKiBUaW1lciBub3RpZmljYXRpb24gbWVzc2FnZXMuICovCi0JSHZNZXNzYWdlVGltZXJFeHBpcmVkCQkJPSAweDgwMDAwMDEwLAorCUhWTVNHX1RJTUVSX0VYUElSRUQJCQk9IDB4ODAwMDAwMTAsCiAKIAkvKiBFcnJvciBtZXNzYWdlcy4gKi8KLQlIdk1lc3NhZ2VUeXBlSW52YWxpZFZwUmVnaXN0ZXJWYWx1ZQk9IDB4ODAwMDAwMjAsCi0JSHZNZXNzYWdlVHlwZVVucmVjb3ZlcmFibGVFeGNlcHRpb24JPSAweDgwMDAwMDIxLAotCUh2TWVzc2FnZVR5cGVVbnN1cHBvcnRlZEZlYXR1cmUJCT0gMHg4MDAwMDAyMiwKKwlIVk1TR19JTlZBTElEX1ZQX1JFR0lTVEVSX1ZBTFVFCT0gMHg4MDAwMDAyMCwKKwlIVk1TR19VTlJFQ09WRVJBQkxFX0VYQ0VQVElPTgk9IDB4ODAwMDAwMjEsCisJSFZNU0dfVU5TVVBQT1JURURfRkVBVFVSRQkJPSAweDgwMDAwMDIyLAogCiAJLyogVHJhY2UgYnVmZmVyIGNvbXBsZXRlIG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVFdmVudExvZ0J1ZmZlckNvbXBsZXRlCT0gMHg4MDAwMDA0MCwKKwlIVk1TR19FVkVOVExPR19CVUZGRVJDT01QTEVURQk9IDB4ODAwMDAwNDAsCiAKIAkvKiBQbGF0Zm9ybS1zcGVjaWZpYyBwcm9jZXNzb3IgaW50ZXJjZXB0IG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVYNjRJb1BvcnRJbnRlcmNlcHQJCT0gMHg4MDAxMDAwMCwKLQlIdk1lc3NhZ2VUeXBlWDY0TXNySW50ZXJjZXB0CQk9IDB4ODAwMTAwMDEsCi0JSHZNZXNzYWdlVHlwZVg2NENwdWlkSW50ZXJjZXB0CQk9IDB4ODAwMTAwMDIsCi0JSHZNZXNzYWdlVHlwZVg2NEV4Y2VwdGlvbkludGVyY2VwdAk9IDB4ODAwMTAwMDMsCi0JSHZNZXNzYWdlVHlwZVg2NEFwaWNFb2kJCQk9IDB4ODAwMTAwMDQsCi0JSHZNZXNzYWdlVHlwZVg2NExlZ2FjeUZwRXJyb3IJCT0gMHg4MDAxMDAwNQorCUhWTVNHX1g2NF9JT1BPUlRfSU5URVJDRVBUCQk9IDB4ODAwMTAwMDAsCisJSFZNU0dfWDY0X01TUl9JTlRFUkNFUFQJCT0gMHg4MDAxMDAwMSwKKwlIVk1TR19YNjRfQ1BVSURfSU5URVJDRVBUCQk9IDB4ODAwMTAwMDIsCisJSFZNU0dfWDY0X0VYQ0VQVElPTl9JTlRFUkNFUFQJPSAweDgwMDEwMDAzLAorCUhWTVNHX1g2NF9BUElDX0VPSQkJCT0gMHg4MDAxMDAwNCwKKwlIVk1TR19YNjRfTEVHQUNZX0ZQX0VSUk9SCQk9IDB4ODAwMTAwMDUKIH07CiAKIC8qIERlZmluZSB0aGUgbnVtYmVyIG9mIHN5bnRoZXRpYyBpbnRlcnJ1cHQgc291cmNlcy4gKi8KQEAgLTYxMCwxMDMgKzYxMCwxMDMgQEAKIAogLyogRGVmaW5lIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0eXBlLiAqLwogdW5pb24gaHZfY29ubmVjdGlvbl9pZCB7Ci0JdTMyIEFzdTMyOworCXUzMiBhc3UzMjsKIAlzdHJ1Y3QgewotCQl1MzIgSWQ6MjQ7Ci0JCXUzMiBSZXNlcnZlZDo4OworCQl1MzIgaWQ6MjQ7CisJCXUzMiByZXNlcnZlZDo4OwogCX0gdTsKIH07CiAKIC8qIERlZmluZSBwb3J0IGlkZW50aWZpZXIgdHlwZS4gKi8KIHVuaW9uIGh2X3BvcnRfaWQgewotCXUzMiBBc3UzMjsKKwl1MzIgYXN1MzI7CiAJc3RydWN0IHsKLQkJdTMyIElkOjI0OwotCQl1MzIgUmVzZXJ2ZWQ6ODsKKwkJdTMyIGlkOjI0OworCQl1MzIgcmVzZXJ2ZWQ6ODsKIAl9IHUgOwogfTsKIAogLyogRGVmaW5lIHBvcnQgdHlwZS4gKi8KIGVudW0gaHZfcG9ydF90eXBlIHsKLQlIdlBvcnRUeXBlTWVzc2FnZQk9IDEsCi0JSHZQb3J0VHlwZUV2ZW50CQk9IDIsCi0JSHZQb3J0VHlwZU1vbml0b3IJPSAzCisJSFZQT1JUX01TRwk9IDEsCisJSFZQT1JUX0VWRU5UCQk9IDIsCisJSFZQT1JUX01PTklUT1IJPSAzCiB9OwogCiAvKiBEZWZpbmUgcG9ydCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgaHZfcG9ydF9pbmZvIHsKLQllbnVtIGh2X3BvcnRfdHlwZSBQb3J0VHlwZTsKLQl1MzIgUGFkZGluZzsKKwllbnVtIGh2X3BvcnRfdHlwZSBwb3J0X3R5cGU7CisJdTMyIHBhZGRpbmc7CiAJdW5pb24gewogCQlzdHJ1Y3QgewotCQkJdTMyIFRhcmdldFNpbnQ7Ci0JCQl1MzIgVGFyZ2V0VnA7Ci0JCQl1NjQgUnN2ZFo7Ci0JCX0gTWVzc2FnZVBvcnRJbmZvOworCQkJdTMyIHRhcmdldF9zaW50OworCQkJdTMyIHRhcmdldF92cDsKKwkJCXU2NCByc3ZkejsKKwkJfSBtZXNzYWdlX3BvcnRfaW5mbzsKIAkJc3RydWN0IHsKLQkJCXUzMiBUYXJnZXRTaW50OwotCQkJdTMyIFRhcmdldFZwOwotCQkJdTE2IEJhc2VGbGFnTnVtYmVyOwotCQkJdTE2IEZsYWdDb3VudDsKLQkJCXUzMiBSc3ZkWjsKLQkJfSBFdmVudFBvcnRJbmZvOworCQkJdTMyIHRhcmdldF9zaW50OworCQkJdTMyIHRhcmdldF92cDsKKwkJCXUxNiBiYXNlX2ZsYWdfYnVtYmVyOworCQkJdTE2IGZsYWdfY291bnQ7CisJCQl1MzIgcnN2ZHo7CisJCX0gZXZlbnRfcG9ydF9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IE1vbml0b3JBZGRyZXNzOwotCQkJdTY0IFJzdmRaOwotCQl9IE1vbml0b3JQb3J0SW5mbzsKKwkJCXU2NCBtb25pdG9yX2FkZHJlc3M7CisJCQl1NjQgcnN2ZHo7CisJCX0gbW9uaXRvcl9wb3J0X2luZm87CiAJfTsKIH07CiAKIHN0cnVjdCBodl9jb25uZWN0aW9uX2luZm8gewotCWVudW0gaHZfcG9ydF90eXBlIFBvcnRUeXBlOwotCXUzMiBQYWRkaW5nOworCWVudW0gaHZfcG9ydF90eXBlIHBvcnRfdHlwZTsKKwl1MzIgcGFkZGluZzsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQl1NjQgUnN2ZFo7Ci0JCX0gTWVzc2FnZUNvbm5lY3Rpb25JbmZvOworCQkJdTY0IHJzdmR6OworCQl9IG1lc3NhZ2VfY29ubmVjdGlvbl9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IFJzdmRaOwotCQl9IEV2ZW50Q29ubmVjdGlvbkluZm87CisJCQl1NjQgcnN2ZHo7CisJCX0gZXZlbnRfY29ubmVjdGlvbl9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IE1vbml0b3JBZGRyZXNzOwotCQl9IE1vbml0b3JDb25uZWN0aW9uSW5mbzsKKwkJCXU2NCBtb25pdG9yX2FkZHJlc3M7CisJCX0gbW9uaXRvcl9jb25uZWN0aW9uX2luZm87CiAJfTsKIH07CiAKIC8qIERlZmluZSBzeW50aGV0aWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgbWVzc2FnZSBmbGFncy4gKi8KIHVuaW9uIGh2X21lc3NhZ2VfZmxhZ3MgewotCXU4IEFzdTg7CisJdTggYXN1ODsKIAlzdHJ1Y3QgewotCQl1OCBNZXNzYWdlUGVuZGluZzoxOwotCQl1OCBSZXNlcnZlZDo3OworCQl1OCBtc2dfcGVuZGluZzoxOworCQl1OCByZXNlcnZlZDo3OwogCX07CiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1lc3NhZ2UgaGVhZGVyLiAqLwogc3RydWN0IGh2X21lc3NhZ2VfaGVhZGVyIHsKLQllbnVtIGh2X21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1OCBQYXlsb2FkU2l6ZTsKLQl1bmlvbiBodl9tZXNzYWdlX2ZsYWdzIE1lc3NhZ2VGbGFnczsKLQl1OCBSZXNlcnZlZFsyXTsKKwllbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlX3R5cGU7CisJdTggcGF5bG9hZF9zaXplOworCXVuaW9uIGh2X21lc3NhZ2VfZmxhZ3MgbWVzc2FnZV9mbGFnczsKKwl1OCByZXNlcnZlZFsyXTsKIAl1bmlvbiB7Ci0JCXU2NCBTZW5kZXI7Ci0JCXVuaW9uIGh2X3BvcnRfaWQgUG9ydDsKKwkJdTY0IHNlbmRlcjsKKwkJdW5pb24gaHZfcG9ydF9pZCBwb3J0OwogCX07CiB9OwogCiAvKiBEZWZpbmUgdGltZXIgbWVzc2FnZSBwYXlsb2FkIHN0cnVjdHVyZS4gKi8KIHN0cnVjdCBodl90aW1lcl9tZXNzYWdlX3BheWxvYWQgewotCXUzMiBUaW1lckluZGV4OwotCXUzMiBSZXNlcnZlZDsKLQl1NjQgRXhwaXJhdGlvblRpbWU7CS8qIFdoZW4gdGhlIHRpbWVyIGV4cGlyZWQgKi8KLQl1NjQgRGVsaXZlcnlUaW1lOwkvKiBXaGVuIHRoZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgKi8KKwl1MzIgdGltZXJfaW5kZXg7CisJdTMyIHJlc2VydmVkOworCXU2NCBleHBpcmF0aW9uX3RpbWU7CS8qIFdoZW4gdGhlIHRpbWVyIGV4cGlyZWQgKi8KKwl1NjQgZGVsaXZlcnlfdGltZTsJLyogV2hlbiB0aGUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkICovCiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1lc3NhZ2UgZm9ybWF0LiAqLwogc3RydWN0IGh2X21lc3NhZ2UgewotCXN0cnVjdCBodl9tZXNzYWdlX2hlYWRlciBIZWFkZXI7CisJc3RydWN0IGh2X21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKIAl1bmlvbiB7Ci0JCXU2NCBQYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CisJCXU2NCBwYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CiAJfSB1IDsKIH07CiAKQEAgLTcxNSw4MiArNzE1LDgyIEBACiAKIC8qIERlZmluZSB0aGUgc3ludGhldGljIGludGVycnVwdCBtZXNzYWdlIHBhZ2UgbGF5b3V0LiAqLwogc3RydWN0IGh2X21lc3NhZ2VfcGFnZSB7Ci0Jc3RydWN0IGh2X21lc3NhZ2UgU2ludE1lc3NhZ2VbSFZfU1lOSUNfU0lOVF9DT1VOVF07CisJc3RydWN0IGh2X21lc3NhZ2Ugc2ludF9tZXNzYWdlW0hWX1NZTklDX1NJTlRfQ09VTlRdOwogfTsKIAogLyogRGVmaW5lIHRoZSBzeW50aGV0aWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgZXZlbnQgZmxhZ3MgZm9ybWF0LiAqLwogdW5pb24gaHZfc3luaWNfZXZlbnRfZmxhZ3MgewotCXU4IEZsYWdzOFtIVl9FVkVOVF9GTEFHU19CWVRFX0NPVU5UXTsKLQl1MzIgRmxhZ3MzMltIVl9FVkVOVF9GTEFHU19EV09SRF9DT1VOVF07CisJdTggZmxhZ3M4W0hWX0VWRU5UX0ZMQUdTX0JZVEVfQ09VTlRdOworCXUzMiBmbGFnczMyW0hWX0VWRU5UX0ZMQUdTX0RXT1JEX0NPVU5UXTsKIH07CiAKIC8qIERlZmluZSB0aGUgc3ludGhldGljIGludGVycnVwdCBmbGFncyBwYWdlIGxheW91dC4gKi8KIHN0cnVjdCBodl9zeW5pY19ldmVudF9mbGFnc19wYWdlIHsKLQl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyBTaW50RXZlbnRGbGFnc1tIVl9TWU5JQ19TSU5UX0NPVU5UXTsKKwl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyBzaW50ZXZlbnRfZmxhZ3NbSFZfU1lOSUNfU0lOVF9DT1VOVF07CiB9OwogCiAvKiBEZWZpbmUgU3luSUMgY29udHJvbCByZWdpc3Rlci4gKi8KIHVuaW9uIGh2X3N5bmljX3Njb250cm9sIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgRW5hYmxlOjE7Ci0JCXU2NCBSZXNlcnZlZDo2MzsKKwkJdTY0IGVuYWJsZToxOworCQl1NjQgcmVzZXJ2ZWQ6NjM7CiAJfTsKIH07CiAKIC8qIERlZmluZSBzeW50aGV0aWMgaW50ZXJydXB0IHNvdXJjZS4gKi8KIHVuaW9uIGh2X3N5bmljX3NpbnQgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBWZWN0b3I6ODsKLQkJdTY0IFJlc2VydmVkMTo4OwotCQl1NjQgTWFza2VkOjE7Ci0JCXU2NCBBdXRvRW9pOjE7Ci0JCXU2NCBSZXNlcnZlZDI6NDY7CisJCXU2NCB2ZWN0b3I6ODsKKwkJdTY0IHJlc2VydmVkMTo4OworCQl1NjQgbWFza2VkOjE7CisJCXU2NCBhdXRvX2VvaToxOworCQl1NjQgcmVzZXJ2ZWQyOjQ2OwogCX07CiB9OwogCiAvKiBEZWZpbmUgdGhlIGZvcm1hdCBvZiB0aGUgU0lNUCByZWdpc3RlciAqLwogdW5pb24gaHZfc3luaWNfc2ltcCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IFNpbXBFbmFibGVkOjE7Ci0JCXU2NCBQcmVzZXJ2ZWQ6MTE7Ci0JCXU2NCBCYXNlU2ltcEdwYTo1MjsKKwkJdTY0IHNpbXBfZW5hYmxlZDoxOworCQl1NjQgcHJlc2VydmVkOjExOworCQl1NjQgYmFzZV9zaW1wX2dwYTo1MjsKIAl9OwogfTsKIAogLyogRGVmaW5lIHRoZSBmb3JtYXQgb2YgdGhlIFNJRUZQIHJlZ2lzdGVyICovCiB1bmlvbiBodl9zeW5pY19zaWVmcCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IFNpZWZwRW5hYmxlZDoxOwotCQl1NjQgUHJlc2VydmVkOjExOwotCQl1NjQgQmFzZVNpZWZwR3BhOjUyOworCQl1NjQgc2llZnBfZW5hYmxlZDoxOworCQl1NjQgcHJlc2VydmVkOjExOworCQl1NjQgYmFzZV9zaWVmcF9ncGE6NTI7CiAJfTsKIH07CiAKIC8qIERlZmluaXRpb25zIGZvciB0aGUgbW9uaXRvcmVkIG5vdGlmaWNhdGlvbiBmYWNpbGl0eSAqLwogdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX2dyb3VwIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1MzIgUGVuZGluZzsKLQkJdTMyIEFybWVkOworCQl1MzIgcGVuZGluZzsKKwkJdTMyIGFybWVkOwogCX07CiB9OwogCiBzdHJ1Y3QgaHZfbW9uaXRvcl9wYXJhbWV0ZXIgewotCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgQ29ubmVjdGlvbklkOwotCXUxNiBGbGFnTnVtYmVyOwotCXUxNiBSc3ZkWjsKKwl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25pZDsKKwl1MTYgZmxhZ251bWJlcjsKKwl1MTYgcnN2ZHo7CiB9OwogCiB1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfc3RhdGUgewotCXUzMiBBc3UzMjsKKwl1MzIgYXN1MzI7CiAKIAlzdHJ1Y3QgewotCQl1MzIgR3JvdXBFbmFibGU6NDsKLQkJdTMyIFJzdmRaOjI4OworCQl1MzIgZ3JvdXBfZW5hYmxlOjQ7CisJCXUzMiByc3ZkejoyODsKIAl9OwogfTsKIApAQCAtODE0LDQyICs4MTQsNDIgQEAKIC8qIHwgODQwIHwgUnN2ZDRbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlIHsKLQl1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfc3RhdGUgVHJpZ2dlclN0YXRlOwotCXUzMiBSc3ZkWjE7CisJdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX3N0YXRlIHRyaWdnZXJfc3RhdGU7CisJdTMyIHJzdmR6MTsKIAotCXVuaW9uIGh2X21vbml0b3JfdHJpZ2dlcl9ncm91cCBUcmlnZ2VyR3JvdXBbNF07Ci0JdTY0IFJzdmRaMlszXTsKKwl1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfZ3JvdXAgdHJpZ2dlcl9ncm91cFs0XTsKKwl1NjQgcnN2ZHoyWzNdOwogCi0JczMyIE5leHRDaGVja1RpbWVbNF1bMzJdOworCXMzMiBuZXh0X2NoZWNrdGltZVs0XVszMl07CiAKLQl1MTYgTGF0ZW5jeVs0XVszMl07Ci0JdTY0IFJzdmRaM1szMl07CisJdTE2IGxhdGVuY3lbNF1bMzJdOworCXU2NCByc3ZkejNbMzJdOwogCi0Jc3RydWN0IGh2X21vbml0b3JfcGFyYW1ldGVyIFBhcmFtZXRlcls0XVszMl07CisJc3RydWN0IGh2X21vbml0b3JfcGFyYW1ldGVyIHBhcmFtZXRlcls0XVszMl07CiAKLQl1OCBSc3ZkWjRbMTk4NF07CisJdTggcnN2ZHo0WzE5ODRdOwogfTsKIAogLyogRGVjbGFyZSB0aGUgdmFyaW91cyBoeXBlcmNhbGwgb3BlcmF0aW9ucy4gKi8KIGVudW0gaHZfY2FsbF9jb2RlIHsKLQlIdkNhbGxQb3N0TWVzc2FnZQk9IDB4MDA1YywKLQlIdkNhbGxTaWduYWxFdmVudAk9IDB4MDA1ZCwKKwlIVkNBTExfUE9TVF9NRVNTQUdFCT0gMHgwMDVjLAorCUhWQ0FMTF9TSUdOQUxfRVZFTlQJPSAweDAwNWQsCiB9OwogCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBIdlBvc3RNZXNzYWdlIGh5cGVyY2FsbCBpbnB1dCBzdHJ1Y3R1cmUuICovCisvKiBEZWZpbml0aW9uIG9mIHRoZSBodl9wb3N0X21lc3NhZ2UgaHlwZXJjYWxsIGlucHV0IHN0cnVjdHVyZS4gKi8KIHN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgewotCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgQ29ubmVjdGlvbklkOwotCXUzMiBSZXNlcnZlZDsKLQllbnVtIGh2X21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1MzIgUGF5bG9hZFNpemU7Ci0JdTY0IFBheWxvYWRbSFZfTUVTU0FHRV9QQVlMT0FEX1FXT1JEX0NPVU5UXTsKKwl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25pZDsKKwl1MzIgcmVzZXJ2ZWQ7CisJZW51bSBodl9tZXNzYWdlX3R5cGUgbWVzc2FnZV90eXBlOworCXUzMiBwYXlsb2FkX3NpemU7CisJdTY0IHBheWxvYWRbSFZfTUVTU0FHRV9QQVlMT0FEX1FXT1JEX0NPVU5UXTsKIH07CiAKLS8qIERlZmluaXRpb24gb2YgdGhlIEh2U2lnbmFsRXZlbnQgaHlwZXJjYWxsIGlucHV0IHN0cnVjdHVyZS4gKi8KKy8qIERlZmluaXRpb24gb2YgdGhlIGh2X3NpZ25hbF9ldmVudCBoeXBlcmNhbGwgaW5wdXQgc3RydWN0dXJlLiAqLwogc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCB7Ci0JdW5pb24gaHZfY29ubmVjdGlvbl9pZCBDb25uZWN0aW9uSWQ7Ci0JdTE2IEZsYWdOdW1iZXI7Ci0JdTE2IFJzdmRaOworCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbmlkOworCXUxNiBmbGFnX251bWJlcjsKKwl1MTYgcnN2ZHo7CiB9OwogCiAvKgpAQCAtODU5LDE2ICs4NTksMTYgQEAKIAogLyogVmVyc2lvbiBpbmZvIHJlcG9ydGVkIGJ5IGd1ZXN0IE9TJ3MgKi8KIGVudW0gaHZfZ3Vlc3Rfb3NfdmVuZG9yIHsKLQlIdkd1ZXN0T3NWZW5kb3JNaWNyb3NvZnQJPSAweDAwMDEKKwlIVkdVRVNUT1NfVkVORE9SX01JQ1JPU09GVAk9IDB4MDAwMQogfTsKIAogZW51bSBodl9ndWVzdF9vc19taWNyb3NvZnRfaWRzIHsKLQlIdkd1ZXN0T3NNaWNyb3NvZnRVbmRlZmluZWQJPSAweDAwLAotCUh2R3Vlc3RPc01pY3Jvc29mdE1TRE9TCQk9IDB4MDEsCi0JSHZHdWVzdE9zTWljcm9zb2Z0V2luZG93czN4CT0gMHgwMiwKLQlIdkd1ZXN0T3NNaWNyb3NvZnRXaW5kb3dzOXgJPSAweDAzLAotCUh2R3Vlc3RPc01pY3Jvc29mdFdpbmRvd3NOVAk9IDB4MDQsCi0JSHZHdWVzdE9zTWljcm9zb2Z0V2luZG93c0NFCT0gMHgwNQorCUhWR1VFU1RPU19NSUNST1NPRlRfVU5ERUZJTkVECT0gMHgwMCwKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX01TRE9TCQk9IDB4MDEsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9XSU5ET1dTM1gJPSAweDAyLAorCUhWR1VFU1RPU19NSUNST1NPRlRfV0lORE9XUzlYCT0gMHgwMywKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX1dJTkRPV1NOVAk9IDB4MDQsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9XSU5ET1dTQ0UJPSAweDA1CiB9OwogCiAvKgpAQCAtODc3LDE0ICs4NzcsMTQgQEAKICNkZWZpbmUgSFZfWDY0X01TUl9HVUVTVF9PU19JRAkweDQwMDAwMDAwCiAKIHVuaW9uIGh2X3g2NF9tc3JfZ3Vlc3Rfb3NfaWRfY29udGVudHMgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBCdWlsZE51bWJlcjoxNjsKLQkJdTY0IFNlcnZpY2VWZXJzaW9uOjg7IC8qIFNlcnZpY2UgUGFjaywgZXRjLiAqLwotCQl1NjQgTWlub3JWZXJzaW9uOjg7Ci0JCXU2NCBNYWpvclZlcnNpb246ODsKLQkJdTY0IE9zSWQ6ODsgLyogZW51bSBodl9ndWVzdF9vc19taWNyb3NvZnRfaWRzIChpZiBWZW5kb3I9TVMpICovCi0JCXU2NCBWZW5kb3JJZDoxNjsgLyogZW51bSBodl9ndWVzdF9vc192ZW5kb3IgKi8KKwkJdTY0IGJ1aWxkX251bWJlcjoxNjsKKwkJdTY0IHNlcnZpY2VfdmVyc2lvbjo4OyAvKiBTZXJ2aWNlIFBhY2ssIGV0Yy4gKi8KKwkJdTY0IG1pbm9yX3ZlcnNpb246ODsKKwkJdTY0IG1ham9yX3ZlcnNpb246ODsKKwkJdTY0IG9zX2lkOjg7IC8qIGVudW0gaHZfZ3Vlc3Rfb3NfbWljcm9zb2Z0X2lkcyAoaWYgVmVuZG9yPU1TKSAqLworCQl1NjQgdmVuZG9yX2lkOjE2OyAvKiBlbnVtIGh2X2d1ZXN0X29zX3ZlbmRvciAqLwogCX07CiB9OwogCkBAIC04OTQsMTEgKzg5NCwxMSBAQAogI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTAkweDQwMDAwMDAxCiAKIHVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgRW5hYmxlOjE7Ci0JCXU2NCBSZXNlcnZlZDoxMTsKLQkJdTY0IEd1ZXN0UGh5c2ljYWxBZGRyZXNzOjUyOworCQl1NjQgZW5hYmxlOjE7CisJCXU2NCByZXNlcnZlZDoxMTsKKwkJdTY0IGd1ZXN0X3BoeXNpY2FsX2FkZHJlc3M6NTI7CiAJfTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKaW5kZXggYTk5ZTkwMC4uMDA3NDU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKQEAgLTM4LDEyICszOCwxNCBAQAogI2luY2x1ZGUgInZtYnVzX2FwaS5oIgogI2luY2x1ZGUgInV0aWxzLmgiCiAKK3N0YXRpYyB1OCAqc2h1dF90eGZfYnVmOworc3RhdGljIHU4ICp0aW1lX3R4Zl9idWY7CitzdGF0aWMgdTggKmhiZWF0X3R4Zl9idWY7CiAKIHN0YXRpYyB2b2lkIHNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OwotCXU4ICpidWY7Ci0JdTMyIGJ1ZmxlbiwgcmVjdmxlbjsKKwl1MzIgcmVjdmxlbjsKIAl1NjQgcmVxdWVzdGlkOwogCXU4ICBleGVjdXRlX3NodXRkb3duID0gZmFsc2U7CiAKQEAgLTUyLDI0ICs1NCwyMyBAQAogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaWNtc2dfbmVnb3RpYXRlICpuZWdvcCA9IE5VTEw7CiAKLQlidWZsZW4gPSBQQUdFX1NJWkU7Ci0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwotCi0Jdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCBidWYsIGJ1ZmxlbiwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOworCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgc2h1dF90eGZfYnVmLAorCQkJIFBBR0VfU0laRSwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOwogCiAJaWYgKHJlY3ZsZW4gPiAwKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJzaHV0ZG93biBwYWNrZXQ6IGxlbj0lZCwgcmVxdWVzdGlkPSVsbGQiLAogCQkJICAgcmVjdmxlbiwgcmVxdWVzdGlkKTsKIAotCQlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKSZidWZbCisJCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJnNodXRfdHhmX2J1ZlsKIAkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOwogCiAJCWlmIChpY21zZ2hkcnAtPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7Ci0JCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgbmVnb3AsIGJ1Zik7CisJCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgbmVnb3AsIHNodXRfdHhmX2J1Zik7CiAJCX0gZWxzZSB7Ci0JCQlzaHV0ZG93bl9tc2cgPSAoc3RydWN0IHNodXRkb3duX21zZ19kYXRhICopJmJ1ZlsKLQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOworCQkJc2h1dGRvd25fbXNnID0KKwkJCQkoc3RydWN0IHNodXRkb3duX21zZ19kYXRhICopJnNodXRfdHhmX2J1ZlsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CiAKIAkJCXN3aXRjaCAoc2h1dGRvd25fbXNnLT5mbGFncykgewogCQkJY2FzZSAwOgpAQCAtOTMsMTMgKzk0LDExIEBACiAJCWljbXNnaGRycC0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTgogCQkJfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CiAKLQkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCBidWYsCisJCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgc2h1dF90eGZfYnVmLAogCQkJCSAgICAgICByZWN2bGVuLCByZXF1ZXN0aWQsCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCX0KIAotCWtmcmVlKGJ1Zik7Ci0KIAlpZiAoZXhlY3V0ZV9zaHV0ZG93biA9PSB0cnVlKQogCQlvcmRlcmx5X3Bvd2Vyb2ZmKGZhbHNlKTsKIH0KQEAgLTE1MCwyOCArMTQ5LDI1IEBACiBzdGF0aWMgdm9pZCB0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKLQl1OCAqYnVmOwotCXUzMiBidWZsZW4sIHJlY3ZsZW47CisJdTMyIHJlY3ZsZW47CiAJdTY0IHJlcXVlc3RpZDsKIAlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcnA7CiAJc3RydWN0IGljdGltZXN5bmNfZGF0YSAqdGltZWRhdGFwOwogCi0JYnVmbGVuID0gUEFHRV9TSVpFOwotCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQotCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgYnVmLCBidWZsZW4sICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKKwl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIHRpbWVfdHhmX2J1ZiwKKwkJCSBQQUdFX1NJWkUsICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKIAogCWlmIChyZWN2bGVuID4gMCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAidGltZXN5bmMgcGFja2V0OiByZWN2bGVuPSVkLCByZXF1ZXN0aWQ9JWxsZCIsCiAJCQlyZWN2bGVuLCByZXF1ZXN0aWQpOwogCi0JCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJmJ1ZlsKKwkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmdGltZV90eGZfYnVmWwogCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOwogCiAJCWlmIChpY21zZ2hkcnAtPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7Ci0JCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgTlVMTCwgYnVmKTsKKwkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBOVUxMLCB0aW1lX3R4Zl9idWYpOwogCQl9IGVsc2UgewotCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikmYnVmWworCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikmdGltZV90eGZfYnVmWwogCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKwogCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CiAJCQlhZGpfZ3Vlc3R0aW1lKHRpbWVkYXRhcC0+cGFyZW50dGltZSwgdGltZWRhdGFwLT5mbGFncyk7CkBAIC0xODAsMTIgKzE3NiwxMCBAQAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KIAkJCXwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOwogCi0JCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgYnVmLAorCQl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIHRpbWVfdHhmX2J1ZiwKIAkJCQlyZWN2bGVuLCByZXF1ZXN0aWQsCiAJCQkJVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwgMCk7CiAJfQotCi0Ja2ZyZWUoYnVmKTsKIH0KIAogLyoKQEAgLTE5NiwzMCArMTkwLDI4IEBACiBzdGF0aWMgdm9pZCBoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7Ci0JdTggKmJ1ZjsKLQl1MzIgYnVmbGVuLCByZWN2bGVuOworCXUzMiByZWN2bGVuOwogCXU2NCByZXF1ZXN0aWQ7CiAJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwOwogCXN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKmhlYXJ0YmVhdF9tc2c7CiAKLQlidWZsZW4gPSBQQUdFX1NJWkU7Ci0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwotCi0Jdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCBidWYsIGJ1ZmxlbiwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOworCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgaGJlYXRfdHhmX2J1ZiwKKwkJCSBQQUdFX1NJWkUsICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKIAogCWlmIChyZWN2bGVuID4gMCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAiaGVhcnRiZWF0IHBhY2tldDogbGVuPSVkLCByZXF1ZXN0aWQ9JWxsZCIsCiAJCQkgICByZWN2bGVuLCByZXF1ZXN0aWQpOwogCi0JCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJmJ1ZlsKKwkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmaGJlYXRfdHhmX2J1ZlsKIAkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKIAogCQlpZiAoaWNtc2doZHJwLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgewotCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGJ1Zik7CisJCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgTlVMTCwgaGJlYXRfdHhmX2J1Zik7CiAJCX0gZWxzZSB7Ci0JCQloZWFydGJlYXRfbXNnID0gKHN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKikmYnVmWwotCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CisJCQloZWFydGJlYXRfbXNnID0KKwkJCQkoc3RydWN0IGhlYXJ0YmVhdF9tc2dfZGF0YSAqKSZoYmVhdF90eGZfYnVmWworCQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKIAogCQkJRFBSSU5UX0RCRyhWTUJVUywgImhlYXJ0YmVhdCBzZXEgPSAlbGxkIiwKIAkJCQkgICBoZWFydGJlYXRfbXNnLT5zZXFfbnVtKTsKQEAgLTIzMCwxMiArMjIyLDEwIEBACiAJCWljbXNnaGRycC0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTgogCQkJfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CiAKLQkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCBidWYsCisJCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgaGJlYXRfdHhmX2J1ZiwKIAkJCQkgICAgICAgcmVjdmxlbiwgcmVxdWVzdGlkLAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAl9Ci0KLQlrZnJlZShidWYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0Y29uc3QKQEAgLTI2OCwxNSArMjU4LDI4IEBACiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X3V0aWxzX2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJc2h1dF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCXRpbWVfdHhmX2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwloYmVhdF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCisJaWYgKCFzaHV0X3R4Zl9idWYgfHwgIXRpbWVfdHhmX2J1ZiB8fCAhaGJlYXRfdHhmX2J1ZikgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZSBidWZmZXJcbiIpOworCQlrZnJlZShzaHV0X3R4Zl9idWYpOworCQlrZnJlZSh0aW1lX3R4Zl9idWYpOworCQlrZnJlZShoYmVhdF90eGZfYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmc2h1dGRvd25fb25jaGFubmVsY2FsbGJhY2s7CiAJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jYWxsYmFjayA9ICZzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjazsKIAotCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPQorCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJnRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrOwogCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2FsbGJhY2sgPSAmdGltZXN5bmNfb25jaGFubmVsY2FsbGJhY2s7CiAKLQlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJmhlYXJ0YmVhdF9vbmNoYW5uZWxjYWxsYmFjazsKIAlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jYWxsYmFjayA9ICZoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2s7CiAKQEAgLTI4NywxNyArMjkwLDIxIEBACiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiRGUtUmVnaXN0ZXJlZCBIeXBlclYgVXRpbGl0eSBEcml2ZXJcbiIpOwogCi0JaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmY2huX2NiX25lZ290aWF0ZTsKIAlodl9jYl91dGlsc1tIVl9TSFVURE9XTl9NU0ddLmNhbGxiYWNrID0gJmNobl9jYl9uZWdvdGlhdGU7CiAKLQlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0KKwlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9CiAJCSZjaG5fY2JfbmVnb3RpYXRlOwogCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2FsbGJhY2sgPSAmY2huX2NiX25lZ290aWF0ZTsKIAotCWh2X2NiX3V0aWxzW0hWX0hFQVJUQkVBVF9NU0ddLmNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0KKwlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmY2huX2NiX25lZ290aWF0ZTsKIAlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jYWxsYmFjayA9ICZjaG5fY2JfbmVnb3RpYXRlOworCisJa2ZyZWUoc2h1dF90eGZfYnVmKTsKKwlrZnJlZSh0aW1lX3R4Zl9idWYpOworCWtmcmVlKGhiZWF0X3R4Zl9idWYpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X2h5cGVydl91dGlscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMKaW5kZXggNGMyNjMyYy4uZGY5Y2QxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYwpAQCAtMzEsMTQ3ICszMSwxNDkgQEAKIAogCiAvKiBHbG9iYWxzICovCi1zdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAibmV0dnNjIjsKK3N0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJuZXR2c2MiOwogCiAvKiB7Rjg2MTUxNjMtREYzRS00NmM1LTkxM0YtRjJEMkY5NjVFRDBFfSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdOZXRWc2NEZXZpY2VUeXBlID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIG5ldHZzY19kZXZpY2VfdHlwZSA9IHsKIAkuZGF0YSA9IHsKIAkJMHg2MywgMHg1MSwgMHg2MSwgMHhGOCwgMHgzRSwgMHhERiwgMHhjNSwgMHg0NiwKIAkJMHg5MSwgMHgzRiwgMHhGMiwgMHhEMiwgMHhGOSwgMHg2NSwgMHhFRCwgMHgwRQogCX0KIH07CiAKLXN0YXRpYyBpbnQgTmV0VnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbyk7CitzdGF0aWMgaW50IG5ldHZzY19kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdm9pZCAqYWRkaXRpb25hbF9pbmZvKTsKIAotc3RhdGljIGludCBOZXRWc2NPbkRldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKTsKK3N0YXRpYyB2b2lkIG5ldHZzY19jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7CiAKLXN0YXRpYyB2b2lkIE5ldFZzY09uQ2hhbm5lbENhbGxiYWNrKHZvaWQgKmNvbnRleHQpOworc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVNlbmRCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19pbml0X3NlbmRfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVJlY2VpdmVCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19pbml0X3JlY3ZfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjRGVzdHJveVNlbmRCdWZmZXIoc3RydWN0IG5ldHZzY19kZXZpY2UgKk5ldERldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3NlbmRfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKTsKIAotc3RhdGljIGludCBOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKTsKK3N0YXRpYyBpbnQgbmV0dnNjX2Rlc3Ryb3lfcmVjdl9idWYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpOwogCi1zdGF0aWMgaW50IE5ldFZzY0Nvbm5lY3RUb1ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfY29ubmVjdF92c3Aoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIHZvaWQgTmV0VnNjT25TZW5kQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKlBhY2tldCk7CitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KTsKIAotc3RhdGljIGludCBOZXRWc2NPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCk7CitzdGF0aWMgaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpOworc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmVfY29tcGxldGlvbih2b2lkICpjb250ZXh0KTsKIAotc3RhdGljIHZvaWQgTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkJdTY0IFRyYW5zYWN0aW9uSWQpOworc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkKTsKIAogCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKkFsbG9jTmV0RGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqYWxsb2NfbmV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAotCW5ldERldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXREZXZpY2UpCisJbmV0X2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXRfZGV2aWNlKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIFNldCB0byAyIHRvIGFsbG93IGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyAqLwotCWF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAwLCAyKTsKKwlhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAwLCAyKTsKIAotCW5ldERldmljZS0+RGV2aWNlID0gRGV2aWNlOwotCURldmljZS0+RXh0ZW5zaW9uID0gbmV0RGV2aWNlOworCW5ldF9kZXZpY2UtPmRldiA9IGRldmljZTsKKwlkZXZpY2UtPkV4dGVuc2lvbiA9IG5ldF9kZXZpY2U7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgdm9pZCBGcmVlTmV0RGV2aWNlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgdm9pZCBmcmVlX25ldF9kZXZpY2Uoc3RydWN0IG5ldHZzY19kZXZpY2UgKmRldmljZSkKIHsKLQlXQVJOX09OKGF0b21pY19yZWFkKCZEZXZpY2UtPlJlZkNvdW50KSA9PSAwKTsKLQlEZXZpY2UtPkRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKLQlrZnJlZShEZXZpY2UpOworCVdBUk5fT04oYXRvbWljX3JlYWQoJmRldmljZS0+cmVmY250KSA9PSAwKTsKKwlkZXZpY2UtPmRldi0+RXh0ZW5zaW9uID0gTlVMTDsKKwlrZnJlZShkZXZpY2UpOwogfQogCiAKIC8qIEdldCB0aGUgbmV0IGRldmljZSBvYmplY3QgaWZmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMSAqLwotc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpHZXRPdXRib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmdldF9vdXRib3VuZF9uZXRfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKG5ldERldmljZSAmJiBhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5SZWZDb3VudCkgPiAxKQotCQlhdG9taWNfaW5jKCZuZXREZXZpY2UtPlJlZkNvdW50KTsKKwluZXRfZGV2aWNlID0gZGV2aWNlLT5FeHRlbnNpb247CisJaWYgKG5ldF9kZXZpY2UgJiYgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPnJlZmNudCkgPiAxKQorCQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogCWVsc2UKLQkJbmV0RGV2aWNlID0gTlVMTDsKKwkJbmV0X2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCiAvKiBHZXQgdGhlIG5ldCBkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqR2V0SW5ib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmdldF9pbmJvdW5kX25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXREZXZpY2UtPlJlZkNvdW50KSkKLQkJYXRvbWljX2luYygmbmV0RGV2aWNlLT5SZWZDb3VudCk7CisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5yZWZjbnQpKQorCQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogCWVsc2UKLQkJbmV0RGV2aWNlID0gTlVMTDsKKwkJbmV0X2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgdm9pZCBQdXROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHZvaWQgcHV0X25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKKwluZXRfZGV2aWNlID0gZGV2aWNlLT5FeHRlbnNpb247CiAJLyogQVNTRVJUKG5ldERldmljZSk7ICovCiAKLQlhdG9taWNfZGVjKCZuZXREZXZpY2UtPlJlZkNvdW50KTsKKwlhdG9taWNfZGVjKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKlJlbGVhc2VPdXRib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKnJlbGVhc2Vfb3V0Ym91bmRfbmV0X2RldmljZSgKKwkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlID09IE5VTEwpCisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAyLCB0aGVuIHNldCBpdCB0byAxICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAyLCAxKSAhPSAyKQorCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAyLCAxKSAhPSAyKQogCQl1ZGVsYXkoMTAwKTsKIAotCXJldHVybiBuZXREZXZpY2U7CisJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqUmVsZWFzZUluYm91bmROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpyZWxlYXNlX2luYm91bmRfbmV0X2RldmljZSgKKwkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlID09IE5VTEwpCisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAxLCB0aGVuIHNldCBpdCB0byAwICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAxLCAwKSAhPSAxKQorCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAxLCAwKSAhPSAxKQogCQl1ZGVsYXkoMTAwKTsKIAotCURldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKLQlyZXR1cm4gbmV0RGV2aWNlOworCWRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAogLyoKLSAqIE5ldFZzY0luaXRpYWxpemUgLSBNYWluIGVudHJ5IHBvaW50CisgKiBuZXR2c2NfaW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKICAqLwotaW50IE5ldFZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQoraW50IG5ldHZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZHJ2OwogCkBAIC0xODUsOCArMTg3LDggQEAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIGF0IGxlYXN0IDIgcGFnZXMgc2luY2UgMSBwYWdlIGlzIHVzZWQgZm9yIGNvbnRyb2wgKi8KIAkvKiBBU1NFUlQoZHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSA+PSAoUEFHRV9TSVpFIDw8IDEpKTsgKi8KIAotCWRydi0+bmFtZSA9IGdEcml2ZXJOYW1lOwotCW1lbWNweSgmZHJ2LT5kZXZpY2VUeXBlLCAmZ05ldFZzY0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCWRydi0+bmFtZSA9IGRyaXZlcl9uYW1lOworCW1lbWNweSgmZHJ2LT5kZXZpY2VUeXBlLCAmbmV0dnNjX2RldmljZV90eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAogCS8qIE1ha2Ugc3VyZSBpdCBpcyBzZXQgYnkgdGhlIGNhbGxlciAqLwogCS8qIEZJWE1FOiBUaGVzZSBwcm9iYWJseSBzaG91bGQgc3RpbGwgYmUgdGVzdGVkIGluIHNvbWUgd2F5ICovCkBAIC0xOTQsMjQgKzE5NiwyNCBAQAogCS8qIEFTU0VSVChkcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQpOyAqLwogCiAJLyogU2V0dXAgdGhlIGRpc3BhdGNoIHRhYmxlICovCi0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkCT0gTmV0VnNjT25EZXZpY2VBZGQ7Ci0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlCT0gTmV0VnNjT25EZXZpY2VSZW1vdmU7Ci0JZHJpdmVyLT5CYXNlLk9uQ2xlYW51cAkJPSBOZXRWc2NPbkNsZWFudXA7CisJZHJpdmVyLT5iYXNlLk9uRGV2aWNlQWRkCT0gbmV0dnNjX2RldmljZV9hZGQ7CisJZHJpdmVyLT5iYXNlLk9uRGV2aWNlUmVtb3ZlCT0gbmV0dnNjX2RldmljZV9yZW1vdmU7CisJZHJpdmVyLT5iYXNlLk9uQ2xlYW51cAkJPSBuZXR2c2NfY2xlYW51cDsKIAotCWRyaXZlci0+T25TZW5kCQkJPSBOZXRWc2NPblNlbmQ7CisJZHJpdmVyLT5zZW5kCQkJPSBuZXR2c2Nfc2VuZDsKIAotCVJuZGlzRmlsdGVySW5pdChkcml2ZXIpOworCXJuZGlzX2ZpbHRlcl9pbml0KGRyaXZlcik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVJlY2VpdmVCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2luaXRfcmVjdl9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0X3BhY2tldDsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjIwLDEyICsyMjIsMTIgQEAKIAkvKiBwYWdlLXNpemUgZ3JhbmR1bGFyaXR5ICovCiAJLyogQVNTRVJUKChuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplICYgKFBBR0VfU0laRSAtIDEpKSA9PSAwKTsgKi8KIAotCW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciA9Ci0JCW9zZF9QYWdlQWxsb2MobmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSA+PiBQQUdFX1NISUZUKTsKLQlpZiAoIW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlcikgeworCW5ldF9kZXZpY2UtPnJlY3ZfYnVmID0KKwkJb3NkX3BhZ2VfYWxsb2MobmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoIW5ldF9kZXZpY2UtPnJlY3ZfYnVmKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLAogCQkJICAgInVuYWJsZSB0byBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlciBvZiBzaXplICVkIiwKLQkJCSAgIG5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUpOworCQkJICAgbmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSk7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQpAQCAtMjQwLDMyICsyNDIsMzQgQEAKIAkgKiBjaGFubmVsLiAgTm90ZTogVGhpcyBjYWxsIHVzZXMgdGhlIHZtYnVzIGNvbm5lY3Rpb24gcmF0aGVyCiAJICogdGhhbiB0aGUgY2hhbm5lbCB0byBlc3RhYmxpc2ggdGhlIGdwYWRsIGhhbmRsZS4KIAkgKi8KLQlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwoRGV2aWNlLT5jaGFubmVsLCBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIsCi0JCQkJICAgIG5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUsCi0JCQkJICAgICZuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZSk7CisJcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKGRldmljZS0+Y2hhbm5lbCwgbmV0X2RldmljZS0+cmVjdl9idWYsCisJCQkJICAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUsCisJCQkJICAgICZuZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKIAkJCSAgICJ1bmFibGUgdG8gZXN0YWJsaXNoIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGwiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCS8qIG9zZF9XYWl0RXZlbnRXYWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJLyogb3NkX3dhaXRldmVudF93YWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCiAKIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXIuLi4iKTsKIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJlY2VpdmVCdWZmZXIuR3BhZGxIYW5kbGUgPSBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZTsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLklkID0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGOworCWluaXRfcGFja2V0LT5tc2cudjFfbXNnLnNlbmRfcmVjdl9idWYuCisJCWdwYWRsX2hhbmRsZSA9IG5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZTsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkJc2VuZF9yZWN2X2J1Zi5pZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKIAogCS8qIFNlbmQgdGhlIGdwYWRsIG5vdGlmaWNhdGlvbiByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC0yNzQsMTMgKzI3OCwxNSBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKIAogCS8qIENoZWNrIHRoZSByZXNwb25zZSAqLwotCWlmIChpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU3RhdHVzICE9IE52c3BTdGF0dXNTdWNjZXNzKSB7CisJaWYgKGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCSAgICBzZW5kX3JlY3ZfYnVmX2NvbXBsZXRlLnN0YXR1cyAhPSBOVlNQX1NUQVRfU1VDQ0VTUykgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVuYWJsZSB0byBjb21wbGV0ZSByZWNlaXZlIGJ1ZmZlciAiCiAJCQkgICAiaW5pdGlhbHphdGlvbiB3aXRoIE5ldFZzcCAtIHN0YXR1cyAlZCIsCi0JCQkgICBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU3RhdHVzKTsKKwkJCSAgIGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCQkJICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zdGF0dXMpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTI4OSwzMiArMjk1LDM2IEBACiAJLyogQVNTRVJUKG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCA9PSAwKTsgKi8KIAkvKiBBU1NFUlQobmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMgPT0gTlVMTCk7ICovCiAKLQluZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgPSBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuTnVtU2VjdGlvbnM7CisJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCA9IGluaXRfcGFja2V0LT5tc2cuCisJCXYxX21zZy5zZW5kX3JlY3ZfYnVmX2NvbXBsZXRlLm51bV9zZWN0aW9uczsKIAotCW5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zID0ga21hbGxvYyhuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgKiBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zID09IE5VTEwpIHsKKwluZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24gPSBrbWFsbG9jKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQKKwkJKiBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbiA9PSBOVUxMKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbWVtY3B5KG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zLAotCQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU2VjdGlvbnMsCi0JCW5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCAqIHNpemVvZihzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24pKTsKKwltZW1jcHkobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uLAorCQlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkgICAgICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zZWN0aW9ucywKKwkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCAqCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24pKTsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIlJlY2VpdmUgc2VjdGlvbnMgaW5mbyAoY291bnQgJWQsIG9mZnNldCAlZCwgIgogCQkgICAgImVuZG9mZnNldCAlZCwgc3ViYWxsb2Mgc2l6ZSAlZCwgbnVtIHN1YmFsbG9jcyAlZCkiLAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uT2Zmc2V0LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uRW5kT2Zmc2V0LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uU3ViQWxsb2NhdGlvblNpemUsCi0JCSAgICBuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uc1swXS5OdW1TdWJBbGxvY2F0aW9ucyk7CisJCSAgICBuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250LAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLm9mZnNldCwKKwkJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvblswXS5lbmRfb2Zmc2V0LAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLnN1Yl9hbGxvY19zaXplLAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLm51bV9zdWJfYWxsb2NzKTsKIAogCS8qCiAJICogRm9yIDFzdCByZWxlYXNlLCB0aGVyZSBzaG91bGQgb25seSBiZSAxIHNlY3Rpb24gdGhhdCByZXByZXNlbnRzIHRoZQogCSAqIGVudGlyZSByZWNlaXZlIGJ1ZmZlcgogCSAqLwotCWlmIChuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgIT0gMSB8fAotCSAgICBuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucy0+T2Zmc2V0ICE9IDApIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCAhPSAxIHx8CisJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbi0+b2Zmc2V0ICE9IDApIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0zMjIsMjYgKzMzMiwyNiBAQAogCWdvdG8gRXhpdDsKIAogQ2xlYW51cDoKLQlOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihuZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKG5ldF9kZXZpY2UpOwogCiBFeGl0OgotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBOZXRWc2NJbml0aWFsaXplU2VuZEJ1ZmZlcldpdGhOZXRWc3Aoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfaW5pdF9zZW5kX2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0UGFja2V0OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRfcGFja2V0OwogCi0JbmV0RGV2aWNlID0gR2V0T3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBnZXQgbmV0IGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplIDw9IDApIHsKKwlpZiAobmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSA8PSAwKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0zNDksMTEgKzM1OSwxMSBAQAogCS8qIHBhZ2Utc2l6ZSBncmFuZHVsYXJpdHkgKi8KIAkvKiBBU1NFUlQoKG5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpID09IDApOyAqLwogCi0JbmV0RGV2aWNlLT5TZW5kQnVmZmVyID0KLQkJb3NkX1BhZ2VBbGxvYyhuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplID4+IFBBR0VfU0hJRlQpOwotCWlmICghbmV0RGV2aWNlLT5TZW5kQnVmZmVyKSB7CisJbmV0X2RldmljZS0+c2VuZF9idWYgPQorCQlvc2RfcGFnZV9hbGxvYyhuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplID4+IFBBR0VfU0hJRlQpOworCWlmICghbmV0X2RldmljZS0+c2VuZF9idWYpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gYWxsb2NhdGUgc2VuZCBidWZmZXIgb2Ygc2l6ZSAlZCIsCi0JCQkgICBuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplKTsKKwkJCSAgIG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTM2NywzMSArMzc3LDMzIEBACiAJICogY2hhbm5lbC4gIE5vdGU6IFRoaXMgY2FsbCB1c2VzIHRoZSB2bWJ1cyBjb25uZWN0aW9uIHJhdGhlcgogCSAqIHRoYW4gdGhlIGNoYW5uZWwgdG8gZXN0YWJsaXNoIHRoZSBncGFkbCBoYW5kbGUuCiAJICovCi0JcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKERldmljZS0+Y2hhbm5lbCwgbmV0RGV2aWNlLT5TZW5kQnVmZmVyLAotCQkJCSAgICBuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplLAotCQkJCSAgICAmbmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUpOworCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPnNlbmRfYnVmLAorCQkJCSAgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplLAorCQkJCSAgICAmbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZXN0YWJsaXNoIHNlbmQgYnVmZmVyJ3MgZ3BhZGwiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCS8qIG9zZF9XYWl0RXZlbnRXYWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJLyogb3NkX3dhaXRldmVudF93YWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCiAKIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZFNlbmRCdWZmZXIuLi4iKTsKIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRTZW5kQnVmZmVyOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJlY2VpdmVCdWZmZXIuR3BhZGxIYW5kbGUgPSBuZXREZXZpY2UtPlNlbmRCdWZmZXJHcGFkbEhhbmRsZTsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLklkID0gTkVUVlNDX1NFTkRfQlVGRkVSX0lEOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1NFTkRfQlVGOworCWluaXRfcGFja2V0LT5tc2cudjFfbXNnLnNlbmRfcmVjdl9idWYuCisJCWdwYWRsX2hhbmRsZSA9IG5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZTsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy5zZW5kX3JlY3ZfYnVmLmlkID0KKwkJTkVUVlNDX1NFTkRfQlVGRkVSX0lEOwogCiAJLyogU2VuZCB0aGUgZ3BhZGwgbm90aWZpY2F0aW9uIHJlcXVlc3QgKi8KLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgaW5pdFBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgaW5pdF9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRQYWNrZXQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdF9wYWNrZXQsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTQwMCwzMiArNDEyLDM1IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJLyogQ2hlY2sgdGhlIHJlc3BvbnNlICovCi0JaWYgKGluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFNlbmRCdWZmZXJDb21wbGV0ZS5TdGF0dXMgIT0gTnZzcFN0YXR1c1N1Y2Nlc3MpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJICAgIHNlbmRfc2VuZF9idWZfY29tcGxldGUuc3RhdHVzICE9IE5WU1BfU1RBVF9TVUNDRVNTKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5hYmxlIHRvIGNvbXBsZXRlIHNlbmQgYnVmZmVyICIKIAkJCSAgICJpbml0aWFsemF0aW9uIHdpdGggTmV0VnNwIC0gc3RhdHVzICVkIiwKLQkJCSAgIGluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFNlbmRCdWZmZXJDb21wbGV0ZS5TdGF0dXMpOworCQkJICAgaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCQkgICBzZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnN0YXR1cyk7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbmV0RGV2aWNlLT5TZW5kU2VjdGlvblNpemUgPSBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRTZW5kQnVmZmVyQ29tcGxldGUuU2VjdGlvblNpemU7CisJbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUgPSBpbml0X3BhY2tldC0+CisJbXNnLnYxX21zZy5zZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnNlY3Rpb25fc2l6ZTsKIAogCWdvdG8gRXhpdDsKIAogQ2xlYW51cDoKLQlOZXRWc2NEZXN0cm95U2VuZEJ1ZmZlcihuZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3NlbmRfYnVmKG5ldF9kZXZpY2UpOwogCiBFeGl0OgotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKIHsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VQYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqcmV2b2tlX3BhY2tldDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qCkBAIC00MzQsMjAgKzQ0OSwyMyBAQAogCSAqIE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciBtc2cpIHRoZXJlZm9yZSwgd2UgbmVlZAogCSAqIHRvIHNlbmQgYSByZXZva2UgbXNnIGhlcmUKIAkgKi8KLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50KSB7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLAogCQkJICAgICJTZW5kaW5nIE52c3BNZXNzYWdlMVR5cGVSZXZva2VSZWNlaXZlQnVmZmVyLi4uIik7CiAKIAkJLyogU2VuZCB0aGUgcmV2b2tlIHJlY2VpdmUgYnVmZmVyICovCi0JCXJldm9rZVBhY2tldCA9ICZOZXREZXZpY2UtPlJldm9rZVBhY2tldDsKLQkJbWVtc2V0KHJldm9rZVBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwkJcmV2b2tlX3BhY2tldCA9ICZuZXRfZGV2aWNlLT5yZXZva2VfcGFja2V0OworCQltZW1zZXQocmV2b2tlX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKIAotCQlyZXZva2VQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVSZXZva2VSZWNlaXZlQnVmZmVyOwotCQlyZXZva2VQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuUmV2b2tlUmVjZWl2ZUJ1ZmZlci5JZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKKwkJcmV2b2tlX3BhY2tldC0+aGRyLm1zZ190eXBlID0KKwkJCU5WU1BfTVNHMV9UWVBFX1JFVk9LRV9SRUNWX0JVRjsKKwkJcmV2b2tlX3BhY2tldC0+bXNnLnYxX21zZy4KKwkJcmV2b2tlX3JlY3ZfYnVmLmlkID0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEOwogCi0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsIHJldm9rZVBhY2tldCwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChuZXRfZGV2aWNlLT5kZXYtPmNoYW5uZWwsCisJCQkJICAgICAgIHJldm9rZV9wYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmV2b2tlUGFja2V0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXZva2VfcGFja2V0LAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAkJLyoKIAkJICogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZApAQCAtNDYxLDExICs0NzksMTEgQEAKIAl9CiAKIAkvKiBUZWFyZG93biB0aGUgZ3BhZGwgb24gdGhlIHZzcCBlbmQgKi8KLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGUpIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIlRlYXJpbmcgZG93biByZWNlaXZlIGJ1ZmZlcidzIEdQQURMLi4uIik7CiAKLQkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsCi0JCQkJCSAgIE5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlckdwYWRsSGFuZGxlKTsKKwkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwobmV0X2RldmljZS0+ZGV2LT5jaGFubmVsLAorCQkJICAgbmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlKTsKIAogCQkvKiBJZiB3ZSBmYWlsZWQgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCByZXR1cm4gYW5kIGhhdmUgYSBsZWFrIHJhdGhlciB0aGFuIGNvbnRpbnVlIGFuZCBhIGJ1Z2NoayAqLwogCQlpZiAocmV0ICE9IDApIHsKQEAgLTQ3MywzMCArNDkxLDMwIEBACiAJCQkJICAgInVuYWJsZSB0byB0ZWFyZG93biByZWNlaXZlIGJ1ZmZlcidzIGdwYWRsIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGUgPSAwOworCQluZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KIAotCWlmIChOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIpIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9idWYpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiRnJlZWluZyB1cCByZWNlaXZlIGJ1ZmZlci4uLiIpOwogCiAJCS8qIEZyZWUgdXAgdGhlIHJlY2VpdmUgYnVmZmVyICovCi0JCW9zZF9QYWdlRnJlZShOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIsCi0JCQkgICAgIE5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUgPj4gUEFHRV9TSElGVCk7Ci0JCU5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciA9IE5VTEw7CisJCW9zZF9wYWdlX2ZyZWUobmV0X2RldmljZS0+cmVjdl9idWYsCisJCQkgICAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUgPj4gUEFHRV9TSElGVCk7CisJCW5ldF9kZXZpY2UtPnJlY3ZfYnVmID0gTlVMTDsKIAl9CiAKLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMpIHsKLQkJTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50ID0gMDsKLQkJa2ZyZWUoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMpOwotCQlOZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucyA9IE5VTEw7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbikgeworCQluZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250ID0gMDsKKwkJa2ZyZWUobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uKTsKKwkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IE5ldFZzY0Rlc3Ryb3lTZW5kQnVmZmVyKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3NlbmRfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQogewotCXN0cnVjdCBudnNwX21lc3NhZ2UgKnJldm9rZVBhY2tldDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VfcGFja2V0OwogCWludCByZXQgPSAwOwogCiAJLyoKQEAgLTUwNSwyMCArNTIzLDIzIEBACiAJICogIE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciBtc2cpIHRoZXJlZm9yZSwgd2UgbmVlZAogCSAqICB0byBzZW5kIGEgcmV2b2tlIG1zZyBoZXJlCiAJICovCi0JaWYgKE5ldERldmljZS0+U2VuZFNlY3Rpb25TaXplKSB7CisJaWYgKG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywKIAkJCSAgICAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlU2VuZEJ1ZmZlci4uLiIpOwogCiAJCS8qIFNlbmQgdGhlIHJldm9rZSBzZW5kIGJ1ZmZlciAqLwotCQlyZXZva2VQYWNrZXQgPSAmTmV0RGV2aWNlLT5SZXZva2VQYWNrZXQ7Ci0JCW1lbXNldChyZXZva2VQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJCXJldm9rZV9wYWNrZXQgPSAmbmV0X2RldmljZS0+cmV2b2tlX3BhY2tldDsKKwkJbWVtc2V0KHJldm9rZV9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAKLQkJcmV2b2tlUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlU2VuZEJ1ZmZlcjsKLQkJcmV2b2tlUGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlJldm9rZVNlbmRCdWZmZXIuSWQgPSBORVRWU0NfU0VORF9CVUZGRVJfSUQ7CisJCXJldm9rZV9wYWNrZXQtPmhkci5tc2dfdHlwZSA9CisJCQlOVlNQX01TRzFfVFlQRV9SRVZPS0VfU0VORF9CVUY7CisJCXJldm9rZV9wYWNrZXQtPm1zZy52MV9tc2cuCisJCQlyZXZva2Vfc2VuZF9idWYuaWQgPSBORVRWU0NfU0VORF9CVUZGRVJfSUQ7CiAKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChOZXREZXZpY2UtPkRldmljZS0+Y2hhbm5lbCwgcmV2b2tlUGFja2V0LAorCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KG5ldF9kZXZpY2UtPmRldi0+Y2hhbm5lbCwKKwkJCQkgICAgICAgcmV2b2tlX3BhY2tldCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXZva2VQYWNrZXQsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJldm9rZV9wYWNrZXQsCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCQkvKgogCQkgKiBJZiB3ZSBmYWlsZWQgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCByZXR1cm4gYW5kIGhhdmUgYSBsZWFrCkBAIC01MzIsMTAgKzU1MywxMCBAQAogCX0KIAogCS8qIFRlYXJkb3duIHRoZSBncGFkbCBvbiB0aGUgdnNwIGVuZCAqLwotCWlmIChOZXREZXZpY2UtPlNlbmRCdWZmZXJHcGFkbEhhbmRsZSkgeworCWlmIChuZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiVGVhcmluZyBkb3duIHNlbmQgYnVmZmVyJ3MgR1BBREwuLi4iKTsKLQkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsCi0JCQkJCSAgIE5ldERldmljZS0+U2VuZEJ1ZmZlckdwYWRsSGFuZGxlKTsKKwkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwobmV0X2RldmljZS0+ZGV2LT5jaGFubmVsLAorCQkJCQkgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUpOwogCiAJCS8qCiAJCSAqIElmIHdlIGZhaWxlZCBoZXJlLCB3ZSBtaWdodCBhcyB3ZWxsIHJldHVybiBhbmQgaGF2ZSBhIGxlYWsKQEAgLTU0Niw0OSArNTY3LDUxIEBACiAJCQkJICAgImdwYWRsIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJTmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUgPSAwOworCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KIAotCWlmIChOZXREZXZpY2UtPlNlbmRCdWZmZXIpIHsKKwlpZiAobmV0X2RldmljZS0+c2VuZF9idWYpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiRnJlZWluZyB1cCBzZW5kIGJ1ZmZlci4uLiIpOwogCiAJCS8qIEZyZWUgdXAgdGhlIHJlY2VpdmUgYnVmZmVyICovCi0JCW9zZF9QYWdlRnJlZShOZXREZXZpY2UtPlNlbmRCdWZmZXIsCi0JCQkgICAgIE5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgPj4gUEFHRV9TSElGVCk7Ci0JCU5ldERldmljZS0+U2VuZEJ1ZmZlciA9IE5VTEw7CisJCW9zZF9wYWdlX2ZyZWUobmV0X2RldmljZS0+c2VuZF9idWYsCisJCQkgICAgIG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPj4gUEFHRV9TSElGVCk7CisJCW5ldF9kZXZpY2UtPnNlbmRfYnVmID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyBpbnQgTmV0VnNjQ29ubmVjdFRvVnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2Nvbm5lY3RfdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKLQlpbnQgbmRpc1ZlcnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CisJaW50IG5kaXNfdmVyc2lvbjsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7Ci0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2VUeXBlSW5pdDsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdC5NaW5Qcm90b2NvbFZlcnNpb24gPSBOVlNQX01JTl9QUk9UT0NPTF9WRVJTSU9OOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Lk1heFByb3RvY29sVmVyc2lvbiA9IE5WU1BfTUFYX1BST1RPQ09MX1ZFUlNJT047CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TR19UWVBFX0lOSVQ7CisJaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0Lm1pbl9wcm90b2NvbF92ZXIgPQorCQlOVlNQX01JTl9QUk9UT0NPTF9WRVJTSU9OOworCWluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdC5tYXhfcHJvdG9jb2xfdmVyID0KKwkJTlZTUF9NQVhfUFJPVE9DT0xfVkVSU0lPTjsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIlNlbmRpbmcgTnZzcE1lc3NhZ2VUeXBlSW5pdC4uLiIpOwogCiAJLyogU2VuZCB0aGUgaW5pdCByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAKQEAgLTU5Nyw0NyArNjIwLDUyIEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJLyogTm93LCBjaGVjayB0aGUgcmVzcG9uc2UgKi8KIAkvKiBBU1NFUlQoaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5NYXhpbXVtTWRsQ2hhaW5MZW5ndGggPD0gTUFYX01VTFRJUEFHRV9CVUZGRVJfQ09VTlQpOyAqLwogCURQUklOVF9JTkZPKE5FVFZTQywgIk52c3BNZXNzYWdlVHlwZUluaXQgc3RhdHVzKCVkKSBtYXggbWRsIGNoYWluICglZCkiLAotCQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdENvbXBsZXRlLlN0YXR1cywKLQkJaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5NYXhpbXVtTWRsQ2hhaW5MZW5ndGgpOworCQlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLmluaXRfY29tcGxldGUuc3RhdHVzLAorCQlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLgorCQkgICAgaW5pdF9jb21wbGV0ZS5tYXhfbWRsX2NoYWluX2xlbik7CiAKLQlpZiAoaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5TdGF0dXMgIT0KLQkgICAgTnZzcFN0YXR1c1N1Y2Nlc3MpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLnN0YXR1cyAhPQorCSAgICBOVlNQX1NUQVRfU1VDQ0VTUykgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKIAkJCSJ1bmFibGUgdG8gaW5pdGlhbGl6ZSB3aXRoIG5ldHZzcCAoc3RhdHVzIDB4JXgpIiwKLQkJCWluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuU3RhdHVzKTsKKwkJCWluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdF9jb21wbGV0ZS5zdGF0dXMpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWlmIChpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdENvbXBsZXRlLk5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24gIT0gTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzEpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLgorCSAgICBuZWdvdGlhdGVkX3Byb3RvY29sX3ZlciAhPSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggbmV0dnNwICIKIAkJCSAgICIodmVyc2lvbiBleHBlY3RlZCAxIGdvdCAlZCkiLAotCQkJICAgaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5OZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uKTsKKwkJCSAgIGluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuCisJCQkgICBpbml0X2NvbXBsZXRlLm5lZ290aWF0ZWRfcHJvdG9jb2xfdmVyKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZE5kaXNWZXJzaW9uLi4uIik7CiAKIAkvKiBTZW5kIHRoZSBuZGlzIHZlcnNpb24gKi8KLQltZW1zZXQoaW5pdFBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwltZW1zZXQoaW5pdF9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAKLQluZGlzVmVyc2lvbiA9IDB4MDAwNTAwMDA7CisJbmRpc192ZXJzaW9uID0gMHgwMDA1MDAwMDsKIAotCWluaXRQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kTmRpc1ZlcnNpb247Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kTmRpc1ZlcnNpb24uTmRpc01ham9yVmVyc2lvbiA9Ci0JCQkJKG5kaXNWZXJzaW9uICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kTmRpc1ZlcnNpb24uTmRpc01pbm9yVmVyc2lvbiA9Ci0JCQkJbmRpc1ZlcnNpb24gJiAweEZGRkY7CisJaW5pdF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9IE5WU1BfTVNHMV9UWVBFX1NFTkRfTkRJU19WRVI7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCXNlbmRfbmRpc192ZXIubmRpc19tYWpvcl92ZXIgPQorCQkJCShuZGlzX3ZlcnNpb24gJiAweEZGRkYwMDAwKSA+PiAxNjsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkJc2VuZF9uZGlzX3Zlci5uZGlzX21pbm9yX3ZlciA9CisJCQkJbmRpc192ZXJzaW9uICYgMHhGRkZGOwogCiAJLyogU2VuZCB0aGUgaW5pdCByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKQEAgLTY1MSw1MSArNjc5LDUyIEBACiAJICogcGFja2V0KSBzaW5jZSBvdXIgVm1idXMgYWx3YXlzIHNldCB0aGUKIAkgKiBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEIGZsYWcKIAkgKi8KLQkgLyogb3NkX1dhaXRFdmVudFdhaXQoTmV0VnNjQ2hhbm5lbC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJIC8qIG9zZF93YWl0ZXZlbnRfd2FpdChOZXRWc2NDaGFubmVsLT5DaGFubmVsSW5pdEV2ZW50KTsgKi8KIAogCS8qIFBvc3QgdGhlIGJpZyByZWNlaXZlIGJ1ZmZlciB0byBOZXRWU1AgKi8KLQlyZXQgPSBOZXRWc2NJbml0aWFsaXplUmVjZWl2ZUJ1ZmZlcldpdGhOZXRWc3AoRGV2aWNlKTsKKwlyZXQgPSBuZXR2c2NfaW5pdF9yZWN2X2J1ZihkZXZpY2UpOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gTmV0VnNjSW5pdGlhbGl6ZVNlbmRCdWZmZXJXaXRoTmV0VnNwKERldmljZSk7CisJCXJldCA9IG5ldHZzY19pbml0X3NlbmRfYnVmKGRldmljZSk7CiAKIENsZWFudXA6Ci0JUHV0TmV0RGV2aWNlKERldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NEaXNjb25uZWN0RnJvbVZzcChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKQorc3RhdGljIHZvaWQgTmV0VnNjRGlzY29ubmVjdEZyb21Wc3Aoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpCiB7Ci0JTmV0VnNjRGVzdHJveVJlY2VpdmVCdWZmZXIoTmV0RGV2aWNlKTsKLQlOZXRWc2NEZXN0cm95U2VuZEJ1ZmZlcihOZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKG5ldF9kZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3NlbmRfYnVmKG5ldF9kZXZpY2UpOwogfQogCiAvKgotICogTmV0VnNjT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMgZHJpdmVyIGlzIGFkZGVkCisgKiBuZXR2c2NfZGV2aWNlX2FkZCAtIENhbGxiYWNrIHdoZW4gdGhlIGRldmljZSBiZWxvbmdpbmcgdG8gdGhpcworICogZHJpdmVyIGlzIGFkZGVkCiAgKi8KLXN0YXRpYyBpbnQgTmV0VnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgbmV0dnNjX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLCB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldCA9IDA7CiAJaW50IGk7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0LCAqcG9zOwotCXN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXREcml2ZXIgPQotCQkJCShzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKURldmljZS0+RHJpdmVyOworCXN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXRfZHJpdmVyID0KKwkJCQkoc3RydWN0IG5ldHZzY19kcml2ZXIgKilkZXZpY2UtPkRyaXZlcjsKIAotCW5ldERldmljZSA9IEFsbG9jTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gYWxsb2NfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCURQUklOVF9EQkcoTkVUVlNDLCAibmV0dnNjIGNoYW5uZWwgb2JqZWN0IGFsbG9jYXRlZCAtICVwIiwgbmV0RGV2aWNlKTsKKwlEUFJJTlRfREJHKE5FVFZTQywgIm5ldHZzYyBjaGFubmVsIG9iamVjdCBhbGxvY2F0ZWQgLSAlcCIsIG5ldF9kZXZpY2UpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTmV0VlNDIGNoYW5uZWwgZXh0ZW5zaW9uICovCi0JbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFOwotCXNwaW5fbG9ja19pbml0KCZuZXREZXZpY2UtPnJlY2VpdmVfcGFja2V0X2xpc3RfbG9jayk7CisJbmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFOworCXNwaW5fbG9ja19pbml0KCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2spOwogCi0JbmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSA9IE5FVFZTQ19TRU5EX0JVRkZFUl9TSVpFOworCW5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPSBORVRWU0NfU0VORF9CVUZGRVJfU0laRTsKIAotCUlOSVRfTElTVF9IRUFEKCZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTkVUVlNDX1JFQ0VJVkVfUEFDS0VUTElTVF9DT1VOVDsgaSsrKSB7CiAJCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCkBAIC03MDcsMTkgKzczNiwxOSBAQAogCQkJCSAgIE5FVFZTQ19SRUNFSVZFX1BBQ0tFVExJU1RfQ09VTlQsIGkpOwogCQkJYnJlYWs7CiAJCX0KLQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5MaXN0RW50cnksCi0JCQkgICAgICAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdF9lbnQsCisJCQkgICAgICAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CiAJfQotCW5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCkgeworCW5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIE9wZW4gdGhlIGNoYW5uZWwgKi8KLQlyZXQgPSB2bWJ1c19vcGVuKERldmljZS0+Y2hhbm5lbCwgbmV0RHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSwKLQkJCSBuZXREcml2ZXItPlJpbmdCdWZmZXJTaXplLCBOVUxMLCAwLAotCQkJIE5ldFZzY09uQ2hhbm5lbENhbGxiYWNrLCBEZXZpY2UpOworCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLCBuZXRfZHJpdmVyLT5yaW5nX2J1Zl9zaXplLAorCQkJIG5ldF9kcml2ZXItPnJpbmdfYnVmX3NpemUsIE5VTEwsIDAsCisJCQkgbmV0dnNjX2NoYW5uZWxfY2IsIGRldmljZSk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZCIsIHJldCk7CkBAIC03MzEsNyArNzYwLDcgQEAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICIqKiogTmV0VlNDIGNoYW5uZWwgb3BlbmVkIHN1Y2Nlc3NmdWxseSEgKioqIik7CiAKIAkvKiBDb25uZWN0IHdpdGggdGhlIE5ldFZzcCAqLwotCXJldCA9IE5ldFZzY0Nvbm5lY3RUb1ZzcChEZXZpY2UpOworCXJldCA9IG5ldHZzY19jb25uZWN0X3ZzcChkZXZpY2UpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBjb25uZWN0IHRvIE5ldFZTUCAtICVkIiwgcmV0KTsKIAkJcmV0ID0gLTE7CkBAIC03NDUsMTc0ICs3NzQsMTc4IEBACiAKIGNsb3NlOgogCS8qIE5vdywgd2UgY2FuIGNsb3NlIHRoZSBjaGFubmVsIHNhZmVseSAqLwotCXZtYnVzX2Nsb3NlKERldmljZS0+Y2hhbm5lbCk7CisJdm1idXNfY2xvc2UoZGV2aWNlLT5jaGFubmVsKTsKIAogQ2xlYW51cDoKIAotCWlmIChuZXREZXZpY2UpIHsKLQkJa2ZyZWUobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlpZiAobmV0X2RldmljZSkgeworCQlrZnJlZShuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHBvcywKLQkJCQkJICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0LAotCQkJCQkgTGlzdEVudHJ5KSB7Ci0JCQlsaXN0X2RlbCgmcGFja2V0LT5MaXN0RW50cnkpOworCQkJCQkgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QsCisJCQkJCSBsaXN0X2VudCkgeworCQkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdF9lbnQpOwogCQkJa2ZyZWUocGFja2V0KTsKIAkJfQogCi0JCVJlbGVhc2VPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwotCQlSZWxlYXNlSW5ib3VuZE5ldERldmljZShEZXZpY2UpOworCQlyZWxlYXNlX291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwkJcmVsZWFzZV9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAotCQlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7CisJCWZyZWVfbmV0X2RldmljZShuZXRfZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogTmV0VnNjT25EZXZpY2VSZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgcmVtb3ZlZAorICogbmV0dnNjX2RldmljZV9yZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgcmVtb3ZlZAogICovCi1zdGF0aWMgaW50IE5ldFZzY09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm5ldHZzY1BhY2tldCwgKnBvczsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjX3BhY2tldCwgKnBvczsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIkRpc2FibGluZyBvdXRib3VuZCB0cmFmZmljIG9uIG5ldCBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKIAkvKiBTdG9wIG91dGJvdW5kIHRyYWZmaWMgaWUgc2VuZHMgYW5kIHJlY2VpdmVzIGNvbXBsZXRpb25zICovCi0JbmV0RGV2aWNlID0gUmVsZWFzZU91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gcmVsZWFzZV9vdXRib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiTm8gbmV0IGRldmljZSBwcmVzZW50ISEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIFdhaXQgZm9yIGFsbCBzZW5kIGNvbXBsZXRpb25zICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZuZXREZXZpY2UtPk51bU91dHN0YW5kaW5nU2VuZHMpKSB7CisJd2hpbGUgKGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIndhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGNvbXBsZXRlLi4uIiwKLQkJCSAgICBhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKSk7CisJCQkgICAgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcykpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEaXNjb25uZWN0aW5nIGZyb20gbmV0dnNwLi4uIik7CiAKLQlOZXRWc2NEaXNjb25uZWN0RnJvbVZzcChuZXREZXZpY2UpOworCU5ldFZzY0Rpc2Nvbm5lY3RGcm9tVnNwKG5ldF9kZXZpY2UpOwogCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiRGlzYWJsaW5nIGluYm91bmQgdHJhZmZpYyBvbiBuZXQgZGV2aWNlICglcCkuLi4iLAotCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOworCQkgICAgZGV2aWNlLT5FeHRlbnNpb24pOwogCiAJLyogU3RvcCBpbmJvdW5kIHRyYWZmaWMgaWUgcmVjZWl2ZXMgYW5kIHNlbmRzIGNvbXBsZXRpb25zICovCi0JbmV0RGV2aWNlID0gUmVsZWFzZUluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKKwluZXRfZGV2aWNlID0gcmVsZWFzZV9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAogCS8qIEF0IHRoaXMgcG9pbnQsIG5vIG9uZSBzaG91bGQgYmUgYWNjZXNzaW5nIG5ldERldmljZSBleGNlcHQgaW4gaGVyZSAqLwotCURQUklOVF9JTkZPKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzYWZlIHRvIHJlbW92ZSIsIG5ldERldmljZSk7CisJRFBSSU5UX0lORk8oTkVUVlNDLCAibmV0IGRldmljZSAoJXApIHNhZmUgdG8gcmVtb3ZlIiwgbmV0X2RldmljZSk7CiAKIAkvKiBOb3csIHdlIGNhbiBjbG9zZSB0aGUgY2hhbm5lbCBzYWZlbHkgKi8KLQl2bWJ1c19jbG9zZShEZXZpY2UtPmNoYW5uZWwpOworCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CiAKIAkvKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmV0dnNjUGFja2V0LCBwb3MsCi0JCQkJICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0LCBMaXN0RW50cnkpIHsKLQkJbGlzdF9kZWwoJm5ldHZzY1BhY2tldC0+TGlzdEVudHJ5KTsKLQkJa2ZyZWUobmV0dnNjUGFja2V0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmV0dnNjX3BhY2tldCwgcG9zLAorCQkJCSAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCwgbGlzdF9lbnQpIHsKKwkJbGlzdF9kZWwoJm5ldHZzY19wYWNrZXQtPmxpc3RfZW50KTsKKwkJa2ZyZWUobmV0dnNjX3BhY2tldCk7CiAJfQogCi0Ja2ZyZWUobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKLQlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7CisJa2ZyZWUobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKKwlmcmVlX25ldF9kZXZpY2UobmV0X2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBOZXRWc2NPbkNsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCisgKiBuZXR2c2NfY2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKICAqLwotc3RhdGljIHZvaWQgTmV0VnNjT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3N0YXRpYyB2b2lkIG5ldHZzY19jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKIHsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjT25TZW5kQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKlBhY2tldCkKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwUGFja2V0OwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjUGFja2V0OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKm52c3BfcGFja2V0OworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldDsKIAotCW5ldERldmljZSA9IEdldEluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKIAl9CiAKLQludnNwUGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpUGFja2V0ICsgKFBhY2tldC0+RGF0YU9mZnNldDggPDwgMykpOworCW52c3BfcGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKKwkJCShwYWNrZXQtPkRhdGFPZmZzZXQ4IDw8IDMpKTsKIAogCURQUklOVF9EQkcoTkVUVlNDLCAic2VuZCBjb21wbGV0aW9uIHBhY2tldCAtIHR5cGUgJWQiLAotCQkgICBudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUpOworCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAotCWlmICgobnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID09IE52c3BNZXNzYWdlVHlwZUluaXRDb21wbGV0ZSkgfHwKLQkgICAgKG52c3BQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9PQotCSAgICAgTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUpIHx8Ci0JICAgIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0KLQkgICAgIE52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlKSkgeworCWlmICgobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEUpIHx8CisJICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09CisJICAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFKSB8fAorCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQorCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSkpIHsKIAkJLyogQ29weSB0aGUgcmVzcG9uc2UgYmFjayAqLwotCQltZW1jcHkoJm5ldERldmljZS0+Q2hhbm5lbEluaXRQYWNrZXQsIG52c3BQYWNrZXQsCisJCW1lbWNweSgmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdCwgbnZzcF9wYWNrZXQsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwotCQlvc2RfV2FpdEV2ZW50U2V0KG5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCk7Ci0JfSBlbHNlIGlmIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0KLQkJICAgTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldENvbXBsZXRlKSB7CisJCW9zZF93YWl0ZXZlbnRfc2V0KG5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCk7CisJfSBlbHNlIGlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09CisJCSAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFKSB7CiAJCS8qIEdldCB0aGUgc2VuZCBjb250ZXh0ICovCi0JCW52c2NQYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKikodW5zaWduZWQgbG9uZylQYWNrZXQtPlRyYW5zYWN0aW9uSWQ7CisJCW52c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopKHVuc2lnbmVkIGxvbmcpCisJCQlwYWNrZXQtPlRyYW5zYWN0aW9uSWQ7CiAJCS8qIEFTU0VSVChudnNjUGFja2V0KTsgKi8KIAogCQkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCi0JCW52c2NQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5PblNlbmRDb21wbGV0aW9uKG52c2NQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQpOworCQludnNjX3BhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbigKKwkJCW52c2NfcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCk7CiAKLQkJYXRvbWljX2RlYygmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKTsKKwkJYXRvbWljX2RlYygmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKTsKIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVua25vd24gc2VuZCBjb21wbGV0aW9uIHBhY2tldCB0eXBlIC0gIgotCQkJICAgIiVkIHJlY2VpdmVkISEiLCBudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUpOworCQkJICAgIiVkIHJlY2VpdmVkISEiLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAl9CiAKLQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogfQogCi1zdGF0aWMgaW50IE5ldFZzY09uU2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqUGFja2V0KQorc3RhdGljIGludCBuZXR2c2Nfc2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJaW50IHJldCA9IDA7CiAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHNlbmRNZXNzYWdlOwogCi0JbmV0RGV2aWNlID0gR2V0T3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzaHV0dGluZyBkb3duLi4uIgotCQkJICAgImlnbm9yaW5nIG91dGJvdW5kIHBhY2tldHMiLCBuZXREZXZpY2UpOworCQkJICAgImlnbm9yaW5nIG91dGJvdW5kIHBhY2tldHMiLCBuZXRfZGV2aWNlKTsKIAkJcmV0dXJuIC0yOwogCX0KIAotCXNlbmRNZXNzYWdlLkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXQ7Ci0JaWYgKFBhY2tldC0+SXNEYXRhUGFja2V0KSB7CisJc2VuZE1lc3NhZ2UuaGRyLm1zZ190eXBlID0gTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1Q7CisJaWYgKHBhY2tldC0+aXNfZGF0YV9wa3QpIHsKIAkJLyogMCBpcyBSTUNfREFUQTsgKi8KLQkJc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuQ2hhbm5lbFR5cGUgPSAwOworCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDA7CiAJfSBlbHNlIHsKIAkJLyogMSBpcyBSTUNfQ09OVFJPTDsgKi8KLQkJc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuQ2hhbm5lbFR5cGUgPSAxOworCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDE7CiAJfQogCiAJLyogTm90IHVzaW5nIHNlbmQgYnVmZmVyIHNlY3Rpb24gKi8KLQlzZW5kTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldC5TZW5kQnVmZmVyU2VjdGlvbkluZGV4ID0gMHhGRkZGRkZGRjsKLQlzZW5kTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldC5TZW5kQnVmZmVyU2VjdGlvblNpemUgPSAwOworCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3Quc2VuZF9idWZfc2VjdGlvbl9pbmRleCA9CisJCTB4RkZGRkZGRkY7CisJc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX3NpemUgPSAwOwogCi0JaWYgKFBhY2tldC0+UGFnZUJ1ZmZlckNvdW50KSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXRfcGFnZWJ1ZmZlcihEZXZpY2UtPmNoYW5uZWwsCi0JCQkJCQkgIFBhY2tldC0+UGFnZUJ1ZmZlcnMsCi0JCQkJCQkgIFBhY2tldC0+UGFnZUJ1ZmZlckNvdW50LAorCWlmIChwYWNrZXQtPnBhZ2VfYnVmX2NudCkgeworCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIoZGV2aWNlLT5jaGFubmVsLAorCQkJCQkJICBwYWNrZXQtPnBhZ2VfYnVmLAorCQkJCQkJICBwYWNrZXQtPnBhZ2VfYnVmX2NudCwKIAkJCQkJCSAgJnNlbmRNZXNzYWdlLAogCQkJCQkJICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkJCQkgICh1bnNpZ25lZCBsb25nKVBhY2tldCk7CisJCQkJCQkgICh1bnNpZ25lZCBsb25nKXBhY2tldCk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsICZzZW5kTWVzc2FnZSwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsICZzZW5kTWVzc2FnZSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQYWNrZXQsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXBhY2tldCwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAKQEAgLTkyMCwzMSArOTUzLDMxIEBACiAKIAlpZiAocmV0ICE9IDApCiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5hYmxlIHRvIHNlbmQgcGFja2V0ICVwIHJldCAlZCIsCi0JCQkgICBQYWNrZXQsIHJldCk7CisJCQkgICBwYWNrZXQsIHJldCk7CiAKLQlhdG9taWNfaW5jKCZuZXREZXZpY2UtPk51bU91dHN0YW5kaW5nU2VuZHMpOwotCVB1dE5ldERldmljZShEZXZpY2UpOworCWF0b21pY19pbmMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpCitzdGF0aWMgdm9pZCBuZXR2c2NfcmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqdm14ZmVycGFnZVBhY2tldDsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwUGFja2V0OwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NQYWNrZXQgPSBOVUxMOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqdm14ZmVycGFnZV9wYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcF9wYWNrZXQ7CisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm5ldHZzY19wYWNrZXQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQsIGVuZFZpcnR1YWw7CisJdW5zaWduZWQgbG9uZyBlbmQsIGVuZF92aXJ0dWFsOwogCS8qIHN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXR2c2NEcml2ZXI7ICovCi0Jc3RydWN0IHhmZXJwYWdlX3BhY2tldCAqeGZlcnBhZ2VQYWNrZXQgPSBOVUxMOworCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKnhmZXJwYWdlX3BhY2tldCA9IE5VTEw7CiAJaW50IGksIGo7Ci0JaW50IGNvdW50ID0gMCwgYnl0ZXNSZW1haW4gPSAwOworCWludCBjb3VudCA9IDAsIGJ5dGVzX3JlbWFpbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlMSVNUX0hFQUQobGlzdEhlYWQpOwogCi0JbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwpAQCAtOTU0LDM5ICs5ODcsNDAgQEAKIAkgKiBBbGwgaW5ib3VuZCBwYWNrZXRzIG90aGVyIHRoYW4gc2VuZCBjb21wbGV0aW9uIHNob3VsZCBiZSB4ZmVyIHBhZ2UKIAkgKiBwYWNrZXQKIAkgKi8KLQlpZiAoUGFja2V0LT5UeXBlICE9IFZtYnVzUGFja2V0VHlwZURhdGFVc2luZ1RyYW5zZmVyUGFnZXMpIHsKKwlpZiAocGFja2V0LT5UeXBlICE9IFZtYnVzUGFja2V0VHlwZURhdGFVc2luZ1RyYW5zZmVyUGFnZXMpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJVbmtub3duIHBhY2tldCB0eXBlIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgUGFja2V0LT5UeXBlKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICBwYWNrZXQtPlR5cGUpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCi0JbnZzcFBhY2tldCA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKVBhY2tldCArCi0JCQkoUGFja2V0LT5EYXRhT2Zmc2V0OCA8PCAzKSk7CisJbnZzcF9wYWNrZXQgPSAoc3RydWN0IG52c3BfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZylwYWNrZXQgKworCQkJKHBhY2tldC0+RGF0YU9mZnNldDggPDwgMykpOwogCiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBudnNwIHBhY2tldCAqLwotCWlmIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgIT0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldCkgeworCWlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlICE9CisJICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5rbm93biBudnNwIHBhY2tldCB0eXBlIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKKwkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAogCURQUklOVF9EQkcoTkVUVlNDLCAiTlZTUCBwYWNrZXQgcmVjZWl2ZWQgLSB0eXBlICVkIiwKLQkJICAgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKKwkJICAgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CiAKLQl2bXhmZXJwYWdlUGFja2V0ID0gKHN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqKVBhY2tldDsKKwl2bXhmZXJwYWdlX3BhY2tldCA9IChzdHJ1Y3Qgdm10cmFuc2Zlcl9wYWdlX3BhY2tldF9oZWFkZXIgKilwYWNrZXQ7CiAKLQlpZiAodm14ZmVycGFnZVBhY2tldC0+VHJhbnNmZXJQYWdlU2V0SWQgIT0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEKSB7CisJaWYgKHZteGZlcnBhZ2VfcGFja2V0LT5UcmFuc2ZlclBhZ2VTZXRJZCAhPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJJbnZhbGlkIHhmZXIgcGFnZSBzZXQgaWQgLSAiCiAJCQkgICAiZXhwZWN0aW5nICV4IGdvdCAleCIsIE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRCwKLQkJCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlRyYW5zZmVyUGFnZVNldElkKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+VHJhbnNmZXJQYWdlU2V0SWQpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCiAJRFBSSU5UX0RCRyhORVRWU0MsICJ4ZmVyIHBhZ2UgLSByYW5nZSBjb3VudCAlZCIsCi0JCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQpOworCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCk7CiAKIAkvKgogCSAqIEdyYWIgZnJlZSBwYWNrZXRzIChyYW5nZSBjb3VudCArIDEpIHRvIHJlcHJlc2VudCB0aGlzIHhmZXIKQEAgLTk5NCwxMyArMTAyOCwxMyBAQAogCSAqIFdlIGdyYWIgaXQgaGVyZSBzbyB0aGF0IHdlIGtub3cgZXhhY3RseSBob3cgbWFueSB3ZSBjYW4KIAkgKiBmdWxmaWwKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpKSB7Ci0JCWxpc3RfbW92ZV90YWlsKG5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QubmV4dCwgJmxpc3RIZWFkKTsKLQkJaWYgKCsrY291bnQgPT0gdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCArIDEpCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCkpIHsKKwkJbGlzdF9tb3ZlX3RhaWwobmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdC5uZXh0LCAmbGlzdEhlYWQpOworCQlpZiAoKytjb3VudCA9PSB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCArIDEpCiAJCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogV2UgbmVlZCBhdCBsZWFzdCAyIG5ldHZzYyBwa3RzICgxIHRvIHJlcHJlc2VudCB0aGUgeGZlcgpAQCAtMTAxMCwxNDAgKzEwNDQsMTQ5IEBACiAJaWYgKGNvdW50IDwgMikgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIkdvdCBvbmx5ICVkIG5ldHZzYyBwa3QuLi5uZWVkZWQgJWQgcGt0cy4gIgogCQkJICAgIkRyb3BwaW5nIHRoaXMgeGZlciBwYWdlIHBhY2tldCBjb21wbGV0ZWx5ISIsCi0JCQkgICBjb3VudCwgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCArIDEpOworCQkJICAgY291bnQsIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZUNvdW50ICsgMSk7CiAKIAkJLyogUmV0dXJuIGl0IHRvIHRoZSBmcmVlbGlzdCAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGkgPSBjb3VudDsgaSAhPSAwOyBpLS0pIHsKIAkJCWxpc3RfbW92ZV90YWlsKGxpc3RIZWFkLm5leHQsCi0JCQkJICAgICAgICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KTsKKwkJCQkgICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssCiAJCQkJICAgICAgIGZsYWdzKTsKIAotCQlOZXRWc2NTZW5kUmVjZWl2ZUNvbXBsZXRpb24oRGV2aWNlLAotCQkJCQkgICAgdm14ZmVycGFnZVBhY2tldC0+ZC5UcmFuc2FjdGlvbklkKTsKKwkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwKKwkJCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLlRyYW5zYWN0aW9uSWQpOwogCi0JCVB1dE5ldERldmljZShEZXZpY2UpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCiAJLyogUmVtb3ZlIHRoZSAxc3QgcGFja2V0IHRvIHJlcHJlc2VudCB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYgKi8KLQl4ZmVycGFnZVBhY2tldCA9IChzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQlsaXN0X2RlbCgmeGZlcnBhZ2VQYWNrZXQtPkxpc3RFbnRyeSk7CisJeGZlcnBhZ2VfcGFja2V0ID0gKHN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKilsaXN0SGVhZC5uZXh0OworCWxpc3RfZGVsKCZ4ZmVycGFnZV9wYWNrZXQtPmxpc3RfZW50KTsKIAogCS8qIFRoaXMgaXMgaG93IG11Y2ggd2UgY2FuIHNhdGlzZnkgKi8KLQl4ZmVycGFnZVBhY2tldC0+Q291bnQgPSBjb3VudCAtIDE7CisJeGZlcnBhZ2VfcGFja2V0LT5jb3VudCA9IGNvdW50IC0gMTsKIAkvKiBBU1NFUlQoeGZlcnBhZ2VQYWNrZXQtPkNvdW50ID4gMCAmJiB4ZmVycGFnZVBhY2tldC0+Q291bnQgPD0gKi8KIAkvKiAJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCk7ICovCiAKLQlpZiAoeGZlcnBhZ2VQYWNrZXQtPkNvdW50ICE9IHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQpIHsKKwlpZiAoeGZlcnBhZ2VfcGFja2V0LT5jb3VudCAhPSB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsICJOZWVkZWQgJWQgbmV0dnNjIHBrdHMgdG8gc2F0aXN5IHRoaXMgeGZlciAiCi0JCQkgICAgInBhZ2UuLi5nb3QgJWQiLCB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZUNvdW50LAotCQkJICAgIHhmZXJwYWdlUGFja2V0LT5Db3VudCk7CisJCQkgICAgInBhZ2UuLi5nb3QgJWQiLCB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCwKKwkJCSAgICB4ZmVycGFnZV9wYWNrZXQtPmNvdW50KTsKIAl9CiAKIAkvKiBFYWNoIHJhbmdlIHJlcHJlc2VudHMgMSBSTkRJUyBwa3QgdGhhdCBjb250YWlucyAxIGV0aGVybmV0IGZyYW1lICovCiAJZm9yIChpID0gMDsgaSA8IChjb3VudCAtIDEpOyBpKyspIHsKLQkJbmV0dnNjUGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQkJbGlzdF9kZWwoJm5ldHZzY1BhY2tldC0+TGlzdEVudHJ5KTsKKwkJbmV0dnNjX3BhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWxpc3RIZWFkLm5leHQ7CisJCWxpc3RfZGVsKCZuZXR2c2NfcGFja2V0LT5saXN0X2VudCk7CiAKIAkJLyogSW5pdGlhbGl6ZSB0aGUgbmV0dnNjIHBhY2tldCAqLwotCQluZXR2c2NQYWNrZXQtPlhmZXJQYWdlUGFja2V0ID0geGZlcnBhZ2VQYWNrZXQ7Ci0JCW5ldHZzY1BhY2tldC0+Q29tcGxldGlvbi5SZWN2Lk9uUmVjZWl2ZUNvbXBsZXRpb24gPQotCQkJCQlOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uOwotCQluZXR2c2NQYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5SZWNlaXZlQ29tcGxldGlvbkNvbnRleHQgPQotCQkJCQluZXR2c2NQYWNrZXQ7Ci0JCW5ldHZzY1BhY2tldC0+RGV2aWNlID0gRGV2aWNlOworCQluZXR2c2NfcGFja2V0LT54ZmVyX3BhZ2VfcGt0ID0geGZlcnBhZ2VfcGFja2V0OworCQluZXR2c2NfcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uID0KKwkJCQkJbmV0dnNjX3JlY2VpdmVfY29tcGxldGlvbjsKKwkJbmV0dnNjX3BhY2tldC0+Y29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbl9jdHggPQorCQkJCQluZXR2c2NfcGFja2V0OworCQluZXR2c2NfcGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CiAJCS8qIFNhdmUgdGhpcyBzbyB0aGF0IHdlIGNhbiBzZW5kIGl0IGJhY2sgKi8KLQkJbmV0dnNjUGFja2V0LT5Db21wbGV0aW9uLlJlY3YuUmVjZWl2ZUNvbXBsZXRpb25UaWQgPQotCQkJCQl2bXhmZXJwYWdlUGFja2V0LT5kLlRyYW5zYWN0aW9uSWQ7CisJCW5ldHZzY19wYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fdGlkID0KKwkJCQkJdm14ZmVycGFnZV9wYWNrZXQtPmQuVHJhbnNhY3Rpb25JZDsKIAotCQluZXR2c2NQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCA9Ci0JCQkJCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQ7Ci0JCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlckNvdW50ID0gMTsKKwkJbmV0dnNjX3BhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gPQorCQkJCQl2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudDsKKwkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZfY250ID0gMTsKIAogCQkvKiBBU1NFUlQodm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgKyAqLwogCQkvKiAJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCA8ICovCiAJCS8qIAluZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplKTsgKi8KIAotCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9Ci0JCQkJCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQ7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLkxlbmd0aCA9CisJCQkJCXZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50OwogCi0JCXN0YXJ0ID0gdmlydF90b19waHlzKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciArIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0KSk7CisJCXN0YXJ0ID0gdmlydF90b19waHlzKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5ldF9kZXZpY2UtPgorCQlyZWN2X2J1ZiArIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldCkpOwogCi0JCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJZW5kVmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlcgotCQkgICAgKyB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldAotCQkgICAgKyB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50IC0gMTsKLQkJZW5kID0gdmlydF90b19waHlzKCh2b2lkICopZW5kVmlydHVhbCk7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCWVuZF92aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpbmV0X2RldmljZS0+cmVjdl9idWYKKwkJICAgICsgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0CisJCSAgICArIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50IC0gMTsKKwkJZW5kID0gdmlydF90b19waHlzKCh2b2lkICopZW5kX3ZpcnR1YWwpOwogCiAJCS8qIENhbGN1bGF0ZSB0aGUgcGFnZSByZWxhdGl2ZSBvZmZzZXQgKi8KLQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQotCQkJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSk7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLk9mZnNldCA9CisJCQl2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgJgorCQkJKFBBR0VfU0laRSAtIDEpOwogCQlpZiAoKGVuZCA+PiBQQUdFX1NISUZUKSAhPSAoc3RhcnQgPj4gUEFHRV9TSElGVCkpIHsKIAkJCS8qIEhhbmRsZSBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcGFnZXM6ICovCi0JCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9Ci0JCQkJKG5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuIDw8IFBBR0VfU0hJRlQpCisJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGggPQorCQkJCShuZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5QZm4gPDwKKwkJCQkgUEFHRV9TSElGVCkKIAkJCQkrIFBBR0VfU0laRSAtIHN0YXJ0OwotCQkJYnl0ZXNSZW1haW4gPSBuZXR2c2NQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCAtCi0JCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoOworCQkJYnl0ZXNfcmVtYWluID0gbmV0dnNjX3BhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gLQorCQkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGg7CiAJCQlmb3IgKGogPSAxOyBqIDwgTkVUVlNDX1BBQ0tFVF9NQVhQQUdFOyBqKyspIHsKLQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLk9mZnNldCA9IDA7Ci0JCQkJaWYgKGJ5dGVzUmVtYWluIDw9IFBBR0VfU0laRSkgewotCQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLkxlbmd0aCA9IGJ5dGVzUmVtYWluOwotCQkJCQlieXRlc1JlbWFpbiA9IDA7CisJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbal0uT2Zmc2V0ID0gMDsKKwkJCQlpZiAoYnl0ZXNfcmVtYWluIDw9IFBBR0VfU0laRSkgeworCQkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZltqXS5MZW5ndGggPQorCQkJCQkJYnl0ZXNfcmVtYWluOworCQkJCQlieXRlc19yZW1haW4gPSAwOwogCQkJCX0gZWxzZSB7Ci0JCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbal0uTGVuZ3RoID0gUEFHRV9TSVpFOwotCQkJCQlieXRlc1JlbWFpbiAtPSBQQUdFX1NJWkU7CisJCQkJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmW2pdLkxlbmd0aCA9CisJCQkJCQlQQUdFX1NJWkU7CisJCQkJCWJ5dGVzX3JlbWFpbiAtPSBQQUdFX1NJWkU7CiAJCQkJfQotCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbal0uUGZuID0KLQkJCQkgICAgdmlydF90b19waHlzKCh2b2lkICopKGVuZFZpcnR1YWwgLSBieXRlc1JlbWFpbikpID4+IFBBR0VfU0hJRlQ7Ci0JCQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyQ291bnQrKzsKLQkJCQlpZiAoYnl0ZXNSZW1haW4gPT0gMCkKKwkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZltqXS5QZm4gPQorCQkJCSAgICB2aXJ0X3RvX3BoeXMoKHZvaWQgKikoZW5kX3ZpcnR1YWwgLQorCQkJCQkJYnl0ZXNfcmVtYWluKSkgPj4gUEFHRV9TSElGVDsKKwkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1Zl9jbnQrKzsKKwkJCQlpZiAoYnl0ZXNfcmVtYWluID09IDApCiAJCQkJCWJyZWFrOwogCQkJfQogCQkJLyogQVNTRVJUKGJ5dGVzUmVtYWluID09IDApOyAqLwogCQl9CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiWyVkXSAtIChhYnMgb2Zmc2V0ICV1IGxlbiAldSkgPT4gIgogCQkJICAgIihwZm4gJWxseCwgb2Zmc2V0ICV1LCBsZW4gJXUpIiwgaSwKLQkJCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0LAotCQkJICAgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCwKLQkJCSAgIG5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuLAotCQkJICAgbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQsCi0JCQkgICBuZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCk7CisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQsCisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLk9mZnNldCwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLkxlbmd0aCk7CiAKIAkJLyogUGFzcyBpdCB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KLQkJKChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKURldmljZS0+RHJpdmVyKS0+T25SZWNlaXZlQ2FsbGJhY2soRGV2aWNlLCBuZXR2c2NQYWNrZXQpOworCQkoKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZGV2aWNlLT5Ecml2ZXIpLT4KKwkJCXJlY3ZfY2IoZGV2aWNlLCBuZXR2c2NfcGFja2V0KTsKIAotCQlOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uKG5ldHZzY1BhY2tldC0+Q29tcGxldGlvbi5SZWN2LlJlY2VpdmVDb21wbGV0aW9uQ29udGV4dCk7CisJCW5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24obmV0dnNjX3BhY2tldC0+CisJCQkJY29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbl9jdHgpOwogCX0KIAogCS8qIEFTU0VSVChsaXN0X2VtcHR5KCZsaXN0SGVhZCkpOyAqLwogCi0JUHV0TmV0RGV2aWNlKERldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkJdTY0IFRyYW5zYWN0aW9uSWQpCitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCQl1NjQgdHJhbnNhY3Rpb25faWQpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSByZWN2Y29tcE1lc3NhZ2U7CiAJaW50IHJldHJpZXMgPSAwOwogCWludCByZXQ7CiAKIAlEUFJJTlRfREJHKE5FVFZTQywgIlNlbmRpbmcgcmVjZWl2ZSBjb21wbGV0aW9uIHBrdCAtICVsbHgiLAotCQkgICBUcmFuc2FjdGlvbklkKTsKKwkJICAgdHJhbnNhY3Rpb25faWQpOwogCi0JcmVjdmNvbXBNZXNzYWdlLkhlYWRlci5NZXNzYWdlVHlwZSA9Ci0JCQkJTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldENvbXBsZXRlOworCXJlY3Zjb21wTWVzc2FnZS5oZHIubXNnX3R5cGUgPQorCQkJCU5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFOwogCiAJLyogRklYTUU6IFBhc3MgaW4gdGhlIHN0YXR1cyAqLwotCXJlY3Zjb21wTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldENvbXBsZXRlLlN0YXR1cyA9IE52c3BTdGF0dXNTdWNjZXNzOworCXJlY3Zjb21wTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0X2NvbXBsZXRlLnN0YXR1cyA9CisJCU5WU1BfU1RBVF9TVUNDRVNTOwogCiByZXRyeV9zZW5kX2NtcGx0OgogCS8qIFNlbmQgdGhlIGNvbXBsZXRpb24gKi8KLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgJnJlY3Zjb21wTWVzc2FnZSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksIFRyYW5zYWN0aW9uSWQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsICZyZWN2Y29tcE1lc3NhZ2UsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLCB0cmFuc2FjdGlvbl9pZCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVDb21wbGV0aW9uLCAwKTsKIAlpZiAocmV0ID09IDApIHsKIAkJLyogc3VjY2VzcyAqLwpAQCAtMTE1Miw3ICsxMTk1LDcgQEAKIAkJLyogbm8gbW9yZSByb29tLi4ud2FpdCBhIGJpdCBhbmQgYXR0ZW1wdCB0byByZXRyeSAzIHRpbWVzICovCiAJCXJldHJpZXMrKzsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0ICIKLQkJCSAgICIodGlkICVsbHgpLi4ucmV0cnlpbmcgJWQiLCBUcmFuc2FjdGlvbklkLCByZXRyaWVzKTsKKwkJCSAgICIodGlkICVsbHgpLi4ucmV0cnlpbmcgJWQiLCB0cmFuc2FjdGlvbl9pZCwgcmV0cmllcyk7CiAKIAkJaWYgKHJldHJpZXMgPCA0KSB7CiAJCQl1ZGVsYXkoMTAwKTsKQEAgLTExNjAsMjIgKzEyMDMsMjIgQEAKIAkJfSBlbHNlIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBjb21wbGV0aW9uICIKIAkJCQkgICJwa3QgKHRpZCAlbGx4KS4uLmdpdmUgdXAgcmV0cnlpbmciLAotCQkJCSAgVHJhbnNhY3Rpb25JZCk7CisJCQkJICB0cmFuc2FjdGlvbl9pZCk7CiAJCX0KIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgY29tcGxldGlvbiBwa3QgLSAiCi0JCQkgICAiJWxseCIsIFRyYW5zYWN0aW9uSWQpOworCQkJICAgIiVsbHgiLCB0cmFuc2FjdGlvbl9pZCk7CiAJfQogfQogCiAvKiBTZW5kIGEgcmVjZWl2ZSBjb21wbGV0aW9uIHBhY2tldCB0byBSTkRJUyBkZXZpY2UgKGllIE5ldFZzcCkgKi8KLXN0YXRpYyB2b2lkIE5ldFZzY09uUmVjZWl2ZUNvbXBsZXRpb24odm9pZCAqQ29udGV4dCkKK3N0YXRpYyB2b2lkIG5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24odm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0ID0gQ29udGV4dDsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKXBhY2tldC0+RGV2aWNlOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0JdTY0IHRyYW5zYWN0aW9uSWQgPSAwOwotCWJvb2wgZlNlbmRSZWNlaXZlQ29tcCA9IGZhbHNlOworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQgPSBjb250ZXh0OworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgaHZfZGV2aWNlICopcGFja2V0LT5kZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJdTY0IHRyYW5zYWN0aW9uX2lkID0gMDsKKwlib29sIGZzZW5kX3JlY2VpdmVfY29tcCA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBBU1NFUlQocGFja2V0LT5YZmVyUGFnZVBhY2tldCk7ICovCkBAIC0xMTg1LDQ5ICsxMjI4LDQ5IEBACiAJICogc2VuZCBvdXQgcmVjZWl2ZSBjb21wbGV0aW9uLCB3ZSBhcmUgdXNpbmcgR2V0SW5ib3VuZE5ldERldmljZSgpCiAJICogc2luY2Ugd2UgbWF5IGhhdmUgZGlzYWJsZSBvdXRib3VuZCB0cmFmZmljIGFscmVhZHkuCiAJICovCi0JbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShkZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIE92ZXJsb2FkaW5nIHVzZSBvZiB0aGUgbG9jay4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkvKiBBU1NFUlQocGFja2V0LT5YZmVyUGFnZVBhY2tldC0+Q291bnQgPiAwKTsgKi8KLQlwYWNrZXQtPlhmZXJQYWdlUGFja2V0LT5Db3VudC0tOworCXBhY2tldC0+eGZlcl9wYWdlX3BrdC0+Y291bnQtLTsKIAogCS8qCiAJICogTGFzdCBvbmUgaW4gdGhlIGxpbmUgdGhhdCByZXByZXNlbnQgMSB4ZmVyIHBhZ2UgcGFja2V0LgogCSAqIFJldHVybiB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYgdG8gdGhlIGZyZWVsaXN0CiAJICovCi0JaWYgKHBhY2tldC0+WGZlclBhZ2VQYWNrZXQtPkNvdW50ID09IDApIHsKLQkJZlNlbmRSZWNlaXZlQ29tcCA9IHRydWU7Ci0JCXRyYW5zYWN0aW9uSWQgPSBwYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5SZWNlaXZlQ29tcGxldGlvblRpZDsKLQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5YZmVyUGFnZVBhY2tldC0+TGlzdEVudHJ5LAotCQkJICAgICAgJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpOworCWlmIChwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmNvdW50ID09IDApIHsKKwkJZnNlbmRfcmVjZWl2ZV9jb21wID0gdHJ1ZTsKKwkJdHJhbnNhY3Rpb25faWQgPSBwYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fdGlkOworCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmxpc3RfZW50LAorCQkJICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCiAJfQogCiAJLyogUHV0IHRoZSBwYWNrZXQgYmFjayAqLwotCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+TGlzdEVudHJ5LCAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3RfZW50LCAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkvKiBTZW5kIGEgcmVjZWl2ZSBjb21wbGV0aW9uIGZvciB0aGUgeGZlciBwYWdlIHBhY2tldCAqLwotCWlmIChmU2VuZFJlY2VpdmVDb21wKQotCQlOZXRWc2NTZW5kUmVjZWl2ZUNvbXBsZXRpb24oZGV2aWNlLCB0cmFuc2FjdGlvbklkKTsKKwlpZiAoZnNlbmRfcmVjZWl2ZV9jb21wKQorCQluZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oZGV2aWNlLCB0cmFuc2FjdGlvbl9pZCk7CiAKLQlQdXROZXREZXZpY2UoZGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NPbkNoYW5uZWxDYWxsYmFjayh2b2lkICpDb250ZXh0KQorc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IENvbnRleHQ7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQl1MzIgYnl0ZXNSZWN2ZDsKLQl1NjQgcmVxdWVzdElkOworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IGNvbnRleHQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJdTMyIGJ5dGVzX3JlY3ZkOworCXU2NCByZXF1ZXN0X2lkOwogCXVuc2lnbmVkIGNoYXIgKnBhY2tldDsKIAlzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqZGVzYzsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CkBAIC0xMjQxLDM3ICsxMjg0LDM3IEBACiAJCXJldHVybjsKIAlidWZmZXIgPSBwYWNrZXQ7CiAKLQluZXREZXZpY2UgPSBHZXRJbmJvdW5kTmV0RGV2aWNlKGRldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X2luYm91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzaHV0dGluZyBkb3duLi4uIgotCQkJICAgImlnbm9yaW5nIGluYm91bmQgcGFja2V0cyIsIG5ldERldmljZSk7CisJCQkgICAiaWdub3JpbmcgaW5ib3VuZCBwYWNrZXRzIiwgbmV0X2RldmljZSk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWRvIHsKIAkJcmV0ID0gdm1idXNfcmVjdnBhY2tldF9yYXcoZGV2aWNlLT5jaGFubmVsLCBidWZmZXIsIGJ1ZmZlcmxlbiwKLQkJCQkJICAgJmJ5dGVzUmVjdmQsICZyZXF1ZXN0SWQpOworCQkJCQkgICAmYnl0ZXNfcmVjdmQsICZyZXF1ZXN0X2lkKTsKIAkJaWYgKHJldCA9PSAwKSB7Ci0JCQlpZiAoYnl0ZXNSZWN2ZCA+IDApIHsKKwkJCWlmIChieXRlc19yZWN2ZCA+IDApIHsKIAkJCQlEUFJJTlRfREJHKE5FVFZTQywgInJlY2VpdmUgJWQgYnl0ZXMsIHRpZCAlbGx4IiwKLQkJCQkJICAgYnl0ZXNSZWN2ZCwgcmVxdWVzdElkKTsKKwkJCQkJICAgYnl0ZXNfcmVjdmQsIHJlcXVlc3RfaWQpOwogCiAJCQkJZGVzYyA9IChzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqKWJ1ZmZlcjsKIAkJCQlzd2l0Y2ggKGRlc2MtPlR5cGUpIHsKIAkJCQljYXNlIFZtYnVzUGFja2V0VHlwZUNvbXBsZXRpb246Ci0JCQkJCU5ldFZzY09uU2VuZENvbXBsZXRpb24oZGV2aWNlLCBkZXNjKTsKKwkJCQkJbmV0dnNjX3NlbmRfY29tcGxldGlvbihkZXZpY2UsIGRlc2MpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgVm1idXNQYWNrZXRUeXBlRGF0YVVzaW5nVHJhbnNmZXJQYWdlczoKLQkJCQkJTmV0VnNjT25SZWNlaXZlKGRldmljZSwgZGVzYyk7CisJCQkJCW5ldHZzY19yZWNlaXZlKGRldmljZSwgZGVzYyk7CiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKIAkJCQkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkJCQkgICAidW5oYW5kbGVkIHBhY2tldCB0eXBlICVkLCAiCiAJCQkJCQkgICAidGlkICVsbHggbGVuICVkXG4iLAotCQkJCQkJICAgZGVzYy0+VHlwZSwgcmVxdWVzdElkLAotCQkJCQkJICAgYnl0ZXNSZWN2ZCk7CisJCQkJCQkgICBkZXNjLT5UeXBlLCByZXF1ZXN0X2lkLAorCQkJCQkJICAgYnl0ZXNfcmVjdmQpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTEyOTMsMjAgKzEzMzYsMjAgQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChyZXQgPT0gLTIpIHsKIAkJCS8qIEhhbmRsZSBsYXJnZSBwYWNrZXQgKi8KLQkJCWJ1ZmZlciA9IGttYWxsb2MoYnl0ZXNSZWN2ZCwgR0ZQX0FUT01JQyk7CisJCQlidWZmZXIgPSBrbWFsbG9jKGJ5dGVzX3JlY3ZkLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChidWZmZXIgPT0gTlVMTCkgewogCQkJCS8qIFRyeSBhZ2FpbiBuZXh0IHRpbWUgYXJvdW5kICovCiAJCQkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgIgotCQkJCQkgICAiKCVkKSEhIiwgYnl0ZXNSZWN2ZCk7CisJCQkJCSAgICIoJWQpISEiLCBieXRlc19yZWN2ZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWJ1ZmZlcmxlbiA9IGJ5dGVzUmVjdmQ7CisJCQlidWZmZXJsZW4gPSBieXRlc19yZWN2ZDsKIAkJfQogCX0gd2hpbGUgKDEpOwogCi0JUHV0TmV0RGV2aWNlKGRldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIG91dDoKIAlrZnJlZShidWZmZXIpOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuaAppbmRleCBjNzFkY2U1Li45MzJhNzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5oCkBAIC0zOCw0OCArMzgsNDggQEAKICNkZWZpbmUgTlZTUF9NQVhfUFJPVE9DT0xfVkVSU0lPTglOVlNQX1BST1RPQ09MX1ZFUlNJT05fMQogCiBlbnVtIHsKLQlOdnNwTWVzc2FnZVR5cGVOb25lID0gMCwKKwlOVlNQX01TR19UWVBFX05PTkUgPSAwLAogCiAJLyogSW5pdCBNZXNzYWdlcyAqLwotCU52c3BNZXNzYWdlVHlwZUluaXQJCQk9IDEsCi0JTnZzcE1lc3NhZ2VUeXBlSW5pdENvbXBsZXRlCQk9IDIsCisJTlZTUF9NU0dfVFlQRV9JTklUCQkJPSAxLAorCU5WU1BfTVNHX1RZUEVfSU5JVF9DT01QTEVURQkJPSAyLAogCi0JTnZzcFZlcnNpb25NZXNzYWdlU3RhcnQJCQk9IDEwMCwKKwlOVlNQX1ZFUlNJT05fTVNHX1NUQVJUCQkJPSAxMDAsCiAKIAkvKiBWZXJzaW9uIDEgTWVzc2FnZXMgKi8KLQlOdnNwTWVzc2FnZTFUeXBlU2VuZE5kaXNWZXJzaW9uCQk9IE52c3BWZXJzaW9uTWVzc2FnZVN0YXJ0LAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfTkRJU19WRVIJCT0gTlZTUF9WRVJTSU9OX01TR19TVEFSVCwKIAotCU52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciwKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXJDb21wbGV0ZSwKLQlOdnNwTWVzc2FnZTFUeXBlUmV2b2tlUmVjZWl2ZUJ1ZmZlciwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGLAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfUkVDVl9CVUZfQ09NUExFVEUsCisJTlZTUF9NU0cxX1RZUEVfUkVWT0tFX1JFQ1ZfQlVGLAogCi0JTnZzcE1lc3NhZ2UxVHlwZVNlbmRTZW5kQnVmZmVyLAotCU52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlLAotCU52c3BNZXNzYWdlMVR5cGVSZXZva2VTZW5kQnVmZmVyLAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUYsCisJTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSwKKwlOVlNQX01TRzFfVFlQRV9SRVZPS0VfU0VORF9CVUYsCiAKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJORElTUGFja2V0LAotCU52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXRDb21wbGV0ZSwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVCwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURSwKIAogCS8qCiAJICogVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSB2ZXJzaW9uIHdpdGgKIAkgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMuCiAJICovCi0JTnZzcE51bU1lc3NhZ2VQZXJWZXJzaW9uCQk9IDksCisJTlZTUF9OVU1fTVNHX1BFUl9WRVJTSU9OCQk9IDksCiB9OwogCiBlbnVtIHsKLQlOdnNwU3RhdHVzTm9uZSA9IDAsCi0JTnZzcFN0YXR1c1N1Y2Nlc3MsCi0JTnZzcFN0YXR1c0ZhaWx1cmUsCi0JTnZzcFN0YXR1c1Byb3RvY29sVmVyc2lvblJhbmdlVG9vTmV3LAotCU52c3BTdGF0dXNQcm90b2NvbFZlcnNpb25SYW5nZVRvb09sZCwKLQlOdnNwU3RhdHVzSW52YWxpZFJuZGlzUGFja2V0LAotCU52c3BTdGF0dXNCdXN5LAotCU52c3BTdGF0dXNNYXgsCisJTlZTUF9TVEFUX05PTkUgPSAwLAorCU5WU1BfU1RBVF9TVUNDRVNTLAorCU5WU1BfU1RBVF9GQUlMLAorCU5WU1BfU1RBVF9QUk9UT0NPTF9UT09fTkVXLAorCU5WU1BfU1RBVF9QUk9UT0NPTF9UT09fT0xELAorCU5WU1BfU1RBVF9JTlZBTElEX1JORElTX1BLVCwKKwlOVlNQX1NUQVRfQlVTWSwKKwlOVlNQX1NUQVRfTUFYLAogfTsKIAogc3RydWN0IG52c3BfbWVzc2FnZV9oZWFkZXIgewotCXUzMiBNZXNzYWdlVHlwZTsKKwl1MzIgbXNnX3R5cGU7CiB9OwogCiAvKiBJbml0IE1lc3NhZ2VzICovCkBAIC05MCw4ICs5MCw4IEBACiAgKiB2ZXJzaW9uaW5nIChpLmUuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHRoZSBzYW1lIGZvciBldmVyKS4KICAqLwogc3RydWN0IG52c3BfbWVzc2FnZV9pbml0IHsKLQl1MzIgTWluUHJvdG9jb2xWZXJzaW9uOwotCXUzMiBNYXhQcm90b2NvbFZlcnNpb247CisJdTMyIG1pbl9wcm90b2NvbF92ZXI7CisJdTMyIG1heF9wcm90b2NvbF92ZXI7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKICAqIChpLmUuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHRoZSBzYW1lIGZvciBldmVyKS4KICAqLwogc3RydWN0IG52c3BfbWVzc2FnZV9pbml0X2NvbXBsZXRlIHsKLQl1MzIgTmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbjsKLQl1MzIgTWF4aW11bU1kbENoYWluTGVuZ3RoOwotCXUzMiBTdGF0dXM7CisJdTMyIG5lZ290aWF0ZWRfcHJvdG9jb2xfdmVyOworCXUzMiBtYXhfbWRsX2NoYWluX2xlbjsKKwl1MzIgc3RhdHVzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gbnZzcF9tZXNzYWdlX2luaXRfdWJlciB7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZV9pbml0IEluaXQ7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZV9pbml0X2NvbXBsZXRlIEluaXRDb21wbGV0ZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2luaXQgaW5pdDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2luaXRfY29tcGxldGUgaW5pdF9jb21wbGV0ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFZlcnNpb24gMSBNZXNzYWdlcyAqLwpAQCAtMTE3LDggKzExNyw4IEBACiAgKiBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBoYW5kbGluZyBPSURzIHNlbnQgYnkgdGhlIFZTQy4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfbmRpc192ZXJzaW9uIHsKLQl1MzIgTmRpc01ham9yVmVyc2lvbjsKLQl1MzIgTmRpc01pbm9yVmVyc2lvbjsKKwl1MzIgbmRpc19tYWpvcl92ZXI7CisJdTMyIG5kaXNfbWlub3JfdmVyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTEyNiwxNSArMTI2LDE1IEBACiAgKiBjYW4gdGhlbiB1c2UgdGhlIHJlY2VpdmUgYnVmZmVyIHRvIHNlbmQgZGF0YSB0byB0aGUgVlNDLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciB7Ci0JdTMyIEdwYWRsSGFuZGxlOwotCXUxNiBJZDsKKwl1MzIgZ3BhZGxfaGFuZGxlOworCXUxNiBpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiB7Ci0JdTMyIE9mZnNldDsKLQl1MzIgU3ViQWxsb2NhdGlvblNpemU7Ci0JdTMyIE51bVN1YkFsbG9jYXRpb25zOwotCXUzMiBFbmRPZmZzZXQ7CisJdTMyIG9mZnNldDsKKwl1MzIgc3ViX2FsbG9jX3NpemU7CisJdTMyIG51bV9zdWJfYWxsb2NzOworCXUzMiBlbmRfb2Zmc2V0OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTE0Myw4ICsxNDMsOCBAQAogICogYnVmZmVyLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlcl9jb21wbGV0ZSB7Ci0JdTMyIFN0YXR1czsKLQl1MzIgTnVtU2VjdGlvbnM7CisJdTMyIHN0YXR1czsKKwl1MzIgbnVtX3NlY3Rpb25zOwogCiAJLyoKIAkgKiBUaGUgcmVjZWl2ZSBidWZmZXIgaXMgc3BsaXQgaW50byB0d28gcGFydHMsIGEgbGFyZ2Ugc3ViYWxsb2NhdGlvbgpAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogIExhcmdlT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsT2Zmc2V0CiAJICovCiAKLQlzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24gU2VjdGlvbnNbMV07CisJc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uIHNlY3Rpb25zWzFdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTE3NCw3ICsxNzQsNyBAQAogICogYWdhaW4uCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2VfcmVjZWl2ZV9idWZmZXIgewotCXUxNiBJZDsKKwl1MTYgaWQ7CiB9OwogCiAvKgpAQCAtMTgyLDggKzE4Miw4IEBACiAgKiBjYW4gdGhlbiB1c2UgdGhlIHNlbmQgYnVmZmVyIHRvIHNlbmQgZGF0YSB0byB0aGUgVlNQLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciB7Ci0JdTMyIEdwYWRsSGFuZGxlOwotCXUxNiBJZDsKKwl1MzIgZ3BhZGxfaGFuZGxlOworCXUxNiBpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xOTIsNyArMTkyLDcgQEAKICAqIGJ1ZmZlci4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXJfY29tcGxldGUgewotCXUzMiBTdGF0dXM7CisJdTMyIHN0YXR1czsKIAogCS8qCiAJICogVGhlIFZTQyBnZXRzIHRvIGNob29zZSB0aGUgc2l6ZSBvZiB0aGUgc2VuZCBidWZmZXIgYW5kIHRoZSBWU1AgZ2V0cwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICogZHluYW1pYyByZWNvbmZpZ3VyYXRpb25zIHdoZW4gdGhlIGNvc3Qgb2YgR1BBLWRpcmVjdCBidWZmZXJzCiAJICogZGVjcmVhc2VzLgogCSAqLwotCXUzMiBTZWN0aW9uU2l6ZTsKKwl1MzIgc2VjdGlvbl9zaXplOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTIwOCw3ICsyMDgsNyBAQAogICogY29tcGxldGVzIHRoaXMgdHJhbnNhY3Rpb24sIHRoZSB2c3Agc2hvdWxkIG5ldmVyIHVzZSB0aGUgc2VuZCBidWZmZXIgYWdhaW4uCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2Vfc2VuZF9idWZmZXIgewotCXUxNiBJZDsKKwl1MTYgaWQ7CiB9OwogCiAvKgpAQCAtMjIxLDcgKzIyMSw3IEBACiAJICogY2hhbm5lbHMgb2YgY29tbXVuaWNhdGlvbi4gSG93ZXZlciwgdGhlIE5ldHdvcmsgVlNQIG9ubHkgaGFzIG9uZS4KIAkgKiBUaGVyZWZvcmUsIHRoZSBjaGFubmVsIHRyYXZlbHMgd2l0aCB0aGUgUk5ESVMgcGFja2V0LgogCSAqLwotCXUzMiBDaGFubmVsVHlwZTsKKwl1MzIgY2hhbm5lbF90eXBlOwogCiAJLyoKIAkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gc2VuZCBwYXJ0IG9yIGFsbCBvZiB0aGUgZGF0YSB0aHJvdWdoIGEgc2VuZApAQCAtMjI5LDggKzIyOSw4IEBACiAJICogaW5kZXggaXMgMHhGRkZGRkZGRiwgdGhlbiB0aGUgc2VuZCBidWZmZXIgaXMgbm90IGJlaW5nIHVzZWQgYW5kIGFsbAogCSAqIG9mIHRoZSBkYXRhIHdhcyBzZW50IHRocm91Z2ggb3RoZXIgVk1CdXMgbWVjaGFuaXNtcy4KIAkgKi8KLQl1MzIgU2VuZEJ1ZmZlclNlY3Rpb25JbmRleDsKLQl1MzIgU2VuZEJ1ZmZlclNlY3Rpb25TaXplOworCXUzMiBzZW5kX2J1Zl9zZWN0aW9uX2luZGV4OworCXUzMiBzZW5kX2J1Zl9zZWN0aW9uX3NpemU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjM5LDM1ICsyMzksMzUgQEAKICAqIG1lc3NhZ2UgY2Fubm90IHVzZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgUk5ESVMgcGFja2V0LgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXRfY29tcGxldGUgewotCXUzMiBTdGF0dXM7CisJdTMyIHN0YXR1czsKIH07CiAKIHVuaW9uIG52c3BfMV9tZXNzYWdlX3ViZXIgewotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX25kaXNfdmVyc2lvbiBTZW5kTmRpc1ZlcnNpb247CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfbmRpc192ZXJzaW9uIHNlbmRfbmRpc192ZXI7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciBTZW5kUmVjZWl2ZUJ1ZmZlcjsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciBzZW5kX3JlY3ZfYnVmOwogCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3JlY2VpdmVfYnVmZmVyX2NvbXBsZXRlCi0JCQkJCQlTZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlOwotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2VfcmVjZWl2ZV9idWZmZXIgUmV2b2tlUmVjZWl2ZUJ1ZmZlcjsKKwkJCQkJCXNlbmRfcmVjdl9idWZfY29tcGxldGU7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3Jldm9rZV9yZWNlaXZlX2J1ZmZlciByZXZva2VfcmVjdl9idWY7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciBTZW5kU2VuZEJ1ZmZlcjsKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlcl9jb21wbGV0ZSBTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlOwotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2Vfc2VuZF9idWZmZXIgUmV2b2tlU2VuZEJ1ZmZlcjsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciBzZW5kX3NlbmRfYnVmOworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3NlbmRfYnVmZmVyX2NvbXBsZXRlIHNlbmRfc2VuZF9idWZfY29tcGxldGU7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3Jldm9rZV9zZW5kX2J1ZmZlciByZXZva2Vfc2VuZF9idWY7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXQgU2VuZFJORElTUGFja2V0OworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3JuZGlzX3BhY2tldCBzZW5kX3JuZGlzX3BrdDsKIAlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXRfY29tcGxldGUKLQkJCQkJCVNlbmRSTkRJU1BhY2tldENvbXBsZXRlOworCQkJCQkJc2VuZF9ybmRpc19wa3RfY29tcGxldGU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBudnNwX2FsbF9tZXNzYWdlcyB7Ci0JdW5pb24gbnZzcF9tZXNzYWdlX2luaXRfdWJlciBJbml0TWVzc2FnZXM7Ci0JdW5pb24gbnZzcF8xX21lc3NhZ2VfdWJlciBWZXJzaW9uMU1lc3NhZ2VzOworCXVuaW9uIG52c3BfbWVzc2FnZV9pbml0X3ViZXIgaW5pdF9tc2c7CisJdW5pb24gbnZzcF8xX21lc3NhZ2VfdWJlciB2MV9tc2c7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBBTEwgTWVzc2FnZXMgKi8KIHN0cnVjdCBudnNwX21lc3NhZ2UgewotCXN0cnVjdCBudnNwX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1bmlvbiBudnNwX2FsbF9tZXNzYWdlcyBNZXNzYWdlczsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2hlYWRlciBoZHI7CisJdW5pb24gbnZzcF9hbGxfbWVzc2FnZXMgbXNnOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogCkBAIC0yOTMsMzkgKzI5MywzOSBAQAogCiAvKiBQZXIgbmV0dnNjIGNoYW5uZWwtc3BlY2lmaWMgKi8KIHN0cnVjdCBuZXR2c2NfZGV2aWNlIHsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7CisJc3RydWN0IGh2X2RldmljZSAqZGV2OwogCi0JYXRvbWljX3QgUmVmQ291bnQ7Ci0JYXRvbWljX3QgTnVtT3V0c3RhbmRpbmdTZW5kczsKKwlhdG9taWNfdCByZWZjbnQ7CisJYXRvbWljX3QgbnVtX291dHN0YW5kaW5nX3NlbmRzOwogCS8qCiAJICogTGlzdCBvZiBmcmVlIHByZWFsbG9jYXRlZCBodl9uZXR2c2NfcGFja2V0IHRvIHJlcHJlc2VudCByZWNlaXZlCiAJICogcGFja2V0CiAJICovCi0Jc3RydWN0IGxpc3RfaGVhZCBSZWNlaXZlUGFja2V0TGlzdDsKLQlzcGlubG9ja190IHJlY2VpdmVfcGFja2V0X2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlY3ZfcGt0X2xpc3Q7CisJc3BpbmxvY2tfdCByZWN2X3BrdF9saXN0X2xvY2s7CiAKIAkvKiBTZW5kIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdXMgYnV0IG1hbmFnZXMgYnkgTmV0VlNQICovCi0Jdm9pZCAqU2VuZEJ1ZmZlcjsKLQl1MzIgU2VuZEJ1ZmZlclNpemU7Ci0JdTMyIFNlbmRCdWZmZXJHcGFkbEhhbmRsZTsKLQl1MzIgU2VuZFNlY3Rpb25TaXplOworCXZvaWQgKnNlbmRfYnVmOworCXUzMiBzZW5kX2J1Zl9zaXplOworCXUzMiBzZW5kX2J1Zl9ncGFkbF9oYW5kbGU7CisJdTMyIHNlbmRfc2VjdGlvbl9zaXplOwogCiAJLyogUmVjZWl2ZSBidWZmZXIgYWxsb2NhdGVkIGJ5IHVzIGJ1dCBtYW5hZ2VzIGJ5IE5ldFZTUCAqLwotCXZvaWQgKlJlY2VpdmVCdWZmZXI7Ci0JdTMyIFJlY2VpdmVCdWZmZXJTaXplOwotCXUzMiBSZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGU7Ci0JdTMyIFJlY2VpdmVTZWN0aW9uQ291bnQ7Ci0Jc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uICpSZWNlaXZlU2VjdGlvbnM7CisJdm9pZCAqcmVjdl9idWY7CisJdTMyIHJlY3ZfYnVmX3NpemU7CisJdTMyIHJlY3ZfYnVmX2dwYWRsX2hhbmRsZTsKKwl1MzIgcmVjdl9zZWN0aW9uX2NudDsKKwlzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24gKnJlY3Zfc2VjdGlvbjsKIAogCS8qIFVzZWQgZm9yIE5ldFZTUCBpbml0aWFsaXphdGlvbiBwcm90b2NvbCAqLwotCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpDaGFubmVsSW5pdEV2ZW50OwotCXN0cnVjdCBudnNwX21lc3NhZ2UgQ2hhbm5lbEluaXRQYWNrZXQ7CisJc3RydWN0IG9zZF93YWl0ZXZlbnQgKmNoYW5uZWxfaW5pdF9ldmVudDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlIGNoYW5uZWxfaW5pdF9wa3Q7CiAKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlIFJldm9rZVBhY2tldDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHJldm9rZV9wYWNrZXQ7CiAJLyogdW5zaWduZWQgY2hhciBId01hY0FkZHJbSFdfTUFDQUREUl9MRU5dOyAqLwogCiAJLyogSG9sZHMgcm5kaXMgZGV2aWNlIGluZm8gKi8KLQl2b2lkICpFeHRlbnNpb247CisJdm9pZCAqZXh0ZW5zaW9uOwogfTsKIAogI2VuZGlmIC8qIF9ORVRWU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2FwaS5oCmluZGV4IDRiNWIzYWMuLmI0YmVkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19hcGkuaApAQCAtMzIsMTAgKzMyLDEwIEBACiAKIC8qIFJlcHJlc2VudCB0aGUgeGZlciBwYWdlIHBhY2tldCB3aGljaCBjb250YWlucyAxIG9yIG1vcmUgbmV0dnNjIHBhY2tldCAqLwogc3RydWN0IHhmZXJwYWdlX3BhY2tldCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBMaXN0RW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudDsKIAogCS8qICMgb2YgbmV0dnNjIHBhY2tldHMgdGhpcyB4ZmVyIHBhY2tldCBjb250YWlucyAqLwotCXUzMiBDb3VudDsKKwl1MzIgY291bnQ7CiB9OwogCiAvKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIGFyZSBlbm91Z2ggdG8gY292ZXIganVtYm8gZnJhbWUgYnVmZmVyLiAqLwpAQCAtNDcsNzAgKzQ3LDcwIEBACiAgKi8KIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0IHsKIAkvKiBCb29ra2VlcGluZyBzdHVmZiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgTGlzdEVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnQ7CiAKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7Ci0JYm9vbCBJc0RhdGFQYWNrZXQ7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOworCWJvb2wgaXNfZGF0YV9wa3Q7CiAKIAkvKgogCSAqIFZhbGlkIG9ubHkgZm9yIHJlY2VpdmVzIHdoZW4gd2UgYnJlYWsgYSB4ZmVyIHBhZ2UgcGFja2V0CiAJICogaW50byBtdWx0aXBsZSBuZXR2c2MgcGFja2V0cwogCSAqLwotCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKlhmZXJQYWdlUGFja2V0OworCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKnhmZXJfcGFnZV9wa3Q7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdHsKLQkJCXU2NCBSZWNlaXZlQ29tcGxldGlvblRpZDsKLQkJCXZvaWQgKlJlY2VpdmVDb21wbGV0aW9uQ29udGV4dDsKLQkJCXZvaWQgKCpPblJlY2VpdmVDb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKLQkJfSBSZWN2OworCQkJdTY0IHJlY3ZfY29tcGxldGlvbl90aWQ7CisJCQl2b2lkICpyZWN2X2NvbXBsZXRpb25fY3R4OworCQkJdm9pZCAoKnJlY3ZfY29tcGxldGlvbikodm9pZCAqY29udGV4dCk7CisJCX0gcmVjdjsKIAkJc3RydWN0ewotCQkJdTY0IFNlbmRDb21wbGV0aW9uVGlkOwotCQkJdm9pZCAqU2VuZENvbXBsZXRpb25Db250ZXh0OwotCQkJdm9pZCAoKk9uU2VuZENvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOwotCQl9IFNlbmQ7Ci0JfSBDb21wbGV0aW9uOworCQkJdTY0IHNlbmRfY29tcGxldGlvbl90aWQ7CisJCQl2b2lkICpzZW5kX2NvbXBsZXRpb25fY3R4OworCQkJdm9pZCAoKnNlbmRfY29tcGxldGlvbikodm9pZCAqY29udGV4dCk7CisJCX0gc2VuZDsKKwl9IGNvbXBsZXRpb247CiAKLQkvKiBUaGlzIHBvaW50cyB0byB0aGUgbWVtb3J5IGFmdGVyIFBhZ2VCdWZmZXJzICovCi0Jdm9pZCAqRXh0ZW5zaW9uOworCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBtZW1vcnkgYWZ0ZXIgcGFnZV9idWYgKi8KKwl2b2lkICpleHRlbnNpb247CiAKLQl1MzIgVG90YWxEYXRhQnVmZmVyTGVuZ3RoOworCXUzMiB0b3RhbF9kYXRhX2J1ZmxlbjsKIAkvKiBQb2ludHMgdG8gdGhlIHNlbmQvcmVjZWl2ZSBidWZmZXIgd2hlcmUgdGhlIGV0aGVybmV0IGZyYW1lIGlzICovCi0JdTMyIFBhZ2VCdWZmZXJDb3VudDsKLQlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgUGFnZUJ1ZmZlcnNbTkVUVlNDX1BBQ0tFVF9NQVhQQUdFXTsKKwl1MzIgcGFnZV9idWZfY250OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBwYWdlX2J1ZltORVRWU0NfUEFDS0VUX01BWFBBR0VdOwogfTsKIAogLyogUmVwcmVzZW50cyB0aGUgbmV0IHZzYyBkcml2ZXIgKi8KIHN0cnVjdCBuZXR2c2NfZHJpdmVyIHsKIAkvKiBNdXN0IGJlIHRoZSBmaXJzdCBmaWVsZCAqLwogCS8qIFdoaWNoIGlzIGEgYnVnIEZJWE1FISAqLwotCXN0cnVjdCBodl9kcml2ZXIgQmFzZTsKKwlzdHJ1Y3QgaHZfZHJpdmVyIGJhc2U7CiAKLQl1MzIgUmluZ0J1ZmZlclNpemU7Ci0JdTMyIFJlcXVlc3RFeHRTaXplOworCXUzMiByaW5nX2J1Zl9zaXplOworCXUzMiByZXFfZXh0X3NpemU7CiAKIAkvKgogCSAqIFRoaXMgaXMgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gYWxsb3cgdXMgdG8gY2FsbGJhY2sgd2hlbiB3ZQogCSAqIHJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgIndpcmUiCiAJICovCi0JaW50ICgqT25SZWNlaXZlQ2FsbGJhY2spKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwlpbnQgKCpyZWN2X2NiKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwotCXZvaWQgKCpPbkxpbmtTdGF0dXNDaGFuZ2VkKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHUzMiBTdGF0dXMpOworCXZvaWQgKCpsaW5rX3N0YXR1c19jaGFuZ2UpKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgdTMyIHN0YXR1cyk7CiAKIAkvKiBTcGVjaWZpYyB0byB0aGlzIGRyaXZlciAqLwotCWludCAoKk9uU2VuZCkoc3RydWN0IGh2X2RldmljZSAqZGV2LCBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KTsKKwlpbnQgKCpzZW5kKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwogCi0Jdm9pZCAqQ29udGV4dDsKKwl2b2lkICpjdHg7CiB9OwogCiBzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvIHsKLSAgICB1bnNpZ25lZCBjaGFyIE1hY0FkZHJbNl07Ci0gICAgYm9vbCBMaW5rU3RhdGU7CS8qIDAgLSBsaW5rIHVwLCAxIC0gbGluayBkb3duICovCisJdW5zaWduZWQgY2hhciBtYWNfYWRyWzZdOworCWJvb2wgbGlua19zdGF0ZTsJLyogMCAtIGxpbmsgdXAsIDEgLSBsaW5rIGRvd24gKi8KIH07CiAKIC8qIEludGVyZmFjZSAqLwotaW50IE5ldFZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KTsKLWludCBSbmRpc0ZpbHRlck9uT3BlbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOwotaW50IFJuZGlzRmlsdGVyT25DbG9zZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworaW50IG5ldHZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydik7CitpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KTsKK2ludCBybmRpc19maWx0ZXJfY2xvc2Uoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIAogI2VuZGlmIC8qIF9ORVRWU0NfQVBJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYwppbmRleCAxNDE1MzUyLi4wMTQ3YjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKQEAgLTY2LDYgKzY2LDkgQEAKIC8qIFRoZSBvbmUgYW5kIG9ubHkgb25lICovCiBzdGF0aWMgc3RydWN0IG5ldHZzY19kcml2ZXJfY29udGV4dCBnX25ldHZzY19kcnY7CiAKKy8qIG5vLW9wIHNvIHRoZSBuZXRkZXYgY29yZSBkb2Vzbid0IHJldHVybiAtRUlOVkFMIHdoZW4gbW9kaWZ5aW5nIHRoZSB0aGUKKyAqIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgaW4gU0lPQ0FERE1VTFRJLiBodiBpcyBzZXR1cCB0byBnZXQgYWxsIG11bHRpY2FzdAorICogd2hlbiBpdCBjYWxscyBSbmRpc0ZpbHRlck9uT3BlbigpICovCiBzdGF0aWMgdm9pZCBuZXR2c2Nfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiB9CkBAIC03OCw3ICs4MSw3IEBACiAKIAlpZiAobmV0aWZfY2Fycmllcl9vayhuZXQpKSB7CiAJCS8qIE9wZW4gdXAgdGhlIGRldmljZSAqLwotCQlyZXQgPSBSbmRpc0ZpbHRlck9uT3BlbihkZXZpY2Vfb2JqKTsKKwkJcmV0ID0gcm5kaXNfZmlsdGVyX29wZW4oZGV2aWNlX29iaik7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJRFBSSU5UX0VSUihORVRWU0NfRFJWLAogCQkJCSAgICJ1bmFibGUgdG8gb3BlbiBkZXZpY2UgKHJldCAlZCkuIiwgcmV0KTsKQEAgLTEwMSw3ICsxMDQsNyBAQAogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCi0JcmV0ID0gUm5kaXNGaWx0ZXJPbkNsb3NlKGRldmljZV9vYmopOworCXJldCA9IHJuZGlzX2ZpbHRlcl9jbG9zZShkZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApCiAJCURQUklOVF9FUlIoTkVUVlNDX0RSViwgInVuYWJsZSB0byBjbG9zZSBkZXZpY2UgKHJldCAlZCkuIiwgcmV0KTsKIApAQCAtMTEyLDcgKzExNSw3IEBACiB7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWNvbnRleHQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQotCQkodW5zaWduZWQgbG9uZylwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvblRpZDsKKwkJKHVuc2lnbmVkIGxvbmcpcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX3RpZDsKIAogCWtmcmVlKHBhY2tldCk7CiAKQEAgLTE1MSw3ICsxNTQsNyBAQAogCS8qIEFsbG9jYXRlIGEgbmV0dnNjIHBhY2tldCBiYXNlZCBvbiAjIG9mIGZyYWdzLiAqLwogCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCiAJCQkgKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKSArCi0JCQkgbmV0X2Rydl9vYmotPlJlcXVlc3RFeHRTaXplLCBHRlBfQVRPTUlDKTsKKwkJCSBuZXRfZHJ2X29iai0+cmVxX2V4dF9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBhY2tldCkgewogCQkvKiBvdXQgb2YgbWVtb3J5LCBzaWxlbnRseSBkcm9wIHBhY2tldCAqLwogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJ1bmFibGUgdG8gYWxsb2NhdGUgaHZfbmV0dnNjX3BhY2tldCIpOwpAQCAtMTYxLDQwICsxNjQsNDAgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKLQlwYWNrZXQtPkV4dGVuc2lvbiA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKKwlwYWNrZXQtPmV4dGVuc2lvbiA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKIAkJCQlzaXplb2Yoc3RydWN0IGh2X25ldHZzY19wYWNrZXQpICsKIAkJCQkgICAgKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKTsKIAogCS8qIFNldHVwIHRoZSBybmRpcyBoZWFkZXIgKi8KLQlwYWNrZXQtPlBhZ2VCdWZmZXJDb3VudCA9IG51bV9wYWdlczsKKwlwYWNrZXQtPnBhZ2VfYnVmX2NudCA9IG51bV9wYWdlczsKIAogCS8qIFRPRE86IEZsdXNoIGFsbCB3cml0ZSBidWZmZXJzLyBtZW1vcnkgZmVuY2UgPz8/ICovCiAJLyogd21iKCk7ICovCiAKIAkvKiBJbml0aWFsaXplIGl0IGZyb20gdGhlIHNrYiAqLwotCXBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoCT0gc2tiLT5sZW47CisJcGFja2V0LT50b3RhbF9kYXRhX2J1Zmxlbgk9IHNrYi0+bGVuOwogCiAJLyogU3RhcnQgZmlsbGluZyBpbiB0aGUgcGFnZSBidWZmZXJzIHN0YXJ0aW5nIGFmdGVyIFJORElTIGJ1ZmZlci4gKi8KLQlwYWNrZXQtPlBhZ2VCdWZmZXJzWzFdLlBmbiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpID4+IFBBR0VfU0hJRlQ7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1sxXS5PZmZzZXQKKwlwYWNrZXQtPnBhZ2VfYnVmWzFdLlBmbiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpID4+IFBBR0VfU0hJRlQ7CisJcGFja2V0LT5wYWdlX2J1ZlsxXS5PZmZzZXQKIAkJPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiAoUEFHRV9TSVpFIC0gMSk7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1sxXS5MZW5ndGggPSBza2JfaGVhZGxlbihza2IpOworCXBhY2tldC0+cGFnZV9idWZbMV0uTGVuZ3RoID0gc2tiX2hlYWRsZW4oc2tiKTsKIAogCS8qIEFkZGl0aW9uYWwgZnJhZ21lbnRzIGFyZSBhZnRlciBTS0IgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKIAkJc2tiX2ZyYWdfdCAqZiA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCi0JCXBhY2tldC0+UGFnZUJ1ZmZlcnNbaSsyXS5QZm4gPSBwYWdlX3RvX3BmbihmLT5wYWdlKTsKLQkJcGFja2V0LT5QYWdlQnVmZmVyc1tpKzJdLk9mZnNldCA9IGYtPnBhZ2Vfb2Zmc2V0OwotCQlwYWNrZXQtPlBhZ2VCdWZmZXJzW2krMl0uTGVuZ3RoID0gZi0+c2l6ZTsKKwkJcGFja2V0LT5wYWdlX2J1ZltpKzJdLlBmbiA9IHBhZ2VfdG9fcGZuKGYtPnBhZ2UpOworCQlwYWNrZXQtPnBhZ2VfYnVmW2krMl0uT2Zmc2V0ID0gZi0+cGFnZV9vZmZzZXQ7CisJCXBhY2tldC0+cGFnZV9idWZbaSsyXS5MZW5ndGggPSBmLT5zaXplOwogCX0KIAogCS8qIFNldCB0aGUgY29tcGxldGlvbiByb3V0aW5lICovCi0JcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247Ci0JcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25Db250ZXh0ID0gcGFja2V0OwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uVGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247CisJcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCA9IHBhY2tldDsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOwogCi0JcmV0ID0gbmV0X2Rydl9vYmotPk9uU2VuZCgmbmV0X2RldmljZV9jdHgtPmRldmljZV9jdHgtPmRldmljZV9vYmosCisJcmV0ID0gbmV0X2Rydl9vYmotPnNlbmQoJm5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAogCQkJCSAgcGFja2V0KTsKIAlpZiAocmV0ID09IDApIHsKIAkJbmV0LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKQEAgLTI2MCw3ICsyNjMsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIGEgc2tiIC0gVE9ETyBkaXJlY3QgSS9PIHRvIHBhZ2VzPyAqLwotCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0LCBwYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCk7CisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXQsIHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4pOwogCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkrK25ldC0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuIDA7CkBAIC0yNzMsMTcgKzI3NiwxNyBAQAogCSAqIENvcHkgdG8gc2tiLiBUaGlzIGNvcHkgaXMgbmVlZGVkIGhlcmUgc2luY2UgdGhlIG1lbW9yeSBwb2ludGVkIGJ5CiAJICogaHZfbmV0dnNjX3BhY2tldCBjYW5ub3QgYmUgZGVhbGxvY2F0ZWQKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5QYWdlQnVmZmVyQ291bnQ7IGkrKykgewotCQlkYXRhID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UocGFja2V0LT5QYWdlQnVmZmVyc1tpXS5QZm4pLAorCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPnBhZ2VfYnVmX2NudDsgaSsrKSB7CisJCWRhdGEgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShwYWNrZXQtPnBhZ2VfYnVmW2ldLlBmbiksCiAJCQkJCSAgICAgICBLTV9JUlExKTsKIAkJZGF0YSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZGF0YSArCi0JCQkJcGFja2V0LT5QYWdlQnVmZmVyc1tpXS5PZmZzZXQ7CisJCQkJcGFja2V0LT5wYWdlX2J1ZltpXS5PZmZzZXQ7CiAKLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwYWNrZXQtPlBhZ2VCdWZmZXJzW2ldLkxlbmd0aCksIGRhdGEsCi0JCSAgICAgICBwYWNrZXQtPlBhZ2VCdWZmZXJzW2ldLkxlbmd0aCk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0LT5wYWdlX2J1ZltpXS5MZW5ndGgpLCBkYXRhLAorCQkgICAgICAgcGFja2V0LT5wYWdlX2J1ZltpXS5MZW5ndGgpOwogCiAJCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZGF0YSAtCi0JCQkJICAgICAgIHBhY2tldC0+UGFnZUJ1ZmZlcnNbaV0uT2Zmc2V0KSwgS01fSVJRMSk7CisJCQkJICAgICAgIHBhY2tldC0+cGFnZV9idWZbaV0uT2Zmc2V0KSwgS01fSVJRMSk7CiAJfQogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMzQ2LDcgKzM0OSw3IEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAlpbnQgcmV0OwogCi0JaWYgKCFuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkKKwlpZiAoIW5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKQogCQlyZXR1cm4gLTE7CiAKIAluZXQgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCkpOwpAQCAtMzYzLDcgKzM2Niw3IEBACiAJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgbmV0KTsKIAogCS8qIE5vdGlmeSB0aGUgbmV0dnNjIGRyaXZlciBvZiB0aGUgbmV3IGRldmljZSAqLwotCXJldCA9IG5ldF9kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKGRldmljZV9vYmosICZkZXZpY2VfaW5mbyk7CisJcmV0ID0gbmV0X2Rydl9vYmotPmJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwgJmRldmljZV9pbmZvKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZnJlZV9uZXRkZXYobmV0KTsKIAkJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CkBAIC0zODIsMTAgKzM4NSwxMCBAQAogCSAqIG91dCBvZiBzeW5jIHdpdGggdGhlIGRldmljZSdzIGxpbmsgc3RhdHVzCiAJICovCiAJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldCkpCi0JCWlmICghZGV2aWNlX2luZm8uTGlua1N0YXRlKQorCQlpZiAoIWRldmljZV9pbmZvLmxpbmtfc3RhdGUpCiAJCQluZXRpZl9jYXJyaWVyX29uKG5ldCk7CiAKLQltZW1jcHkobmV0LT5kZXZfYWRkciwgZGV2aWNlX2luZm8uTWFjQWRkciwgRVRIX0FMRU4pOworCW1lbWNweShuZXQtPmRldl9hZGRyLCBkZXZpY2VfaW5mby5tYWNfYWRyLCBFVEhfQUxFTik7CiAKIAluZXQtPm5ldGRldl9vcHMgPSAmZGV2aWNlX29wczsKIApAQCAtMzk4LDcgKzQwMSw3IEBACiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qIFJlbW92ZSB0aGUgZGV2aWNlIGFuZCByZWxlYXNlIHRoZSByZXNvdXJjZSAqLwotCQluZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwkJbmV0X2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAJCWZyZWVfbmV0ZGV2KG5ldCk7CiAJfQogCkBAIC00MjIsNyArNDI1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKKwlpZiAoIW5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBTdG9wIG91dGJvdW5kIGFzYXAgKi8KQEAgLTQzNSw3ICs0MzgsNyBAQAogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCiAJICogcmVtb3ZlZAogCSAqLwotCXJldCA9IG5ldF9kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOworCXJldCA9IG5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQkvKiBUT0RPOiAqLwogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byByZW1vdmUgdnNjIGRldmljZSAocmV0ICVkKSIsIHJldCk7CkBAIC00ODEsOCArNDg0LDggQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoY3VycmVudF9kZXYpOwogCX0KIAotCWlmIChuZXR2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXApCi0JCW5ldHZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmbmV0dnNjX2Rydl9vYmotPkJhc2UpOworCWlmIChuZXR2c2NfZHJ2X29iai0+YmFzZS5PbkNsZWFudXApCisJCW5ldHZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCgmbmV0dnNjX2Rydl9vYmotPmJhc2UpOwogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAKQEAgLTQ5NSwxNSArNDk4LDE1IEBACiAJc3RydWN0IGRyaXZlcl9jb250ZXh0ICpkcnZfY3R4ID0gJmdfbmV0dnNjX2Rydi5kcnZfY3R4OwogCWludCByZXQ7CiAKLQluZXRfZHJ2X29iai0+UmluZ0J1ZmZlclNpemUgPSByaW5nX3NpemUgKiBQQUdFX1NJWkU7Ci0JbmV0X2Rydl9vYmotPk9uUmVjZWl2ZUNhbGxiYWNrID0gbmV0dnNjX3JlY3ZfY2FsbGJhY2s7Ci0JbmV0X2Rydl9vYmotPk9uTGlua1N0YXR1c0NoYW5nZWQgPSBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjazsKKwluZXRfZHJ2X29iai0+cmluZ19idWZfc2l6ZSA9IHJpbmdfc2l6ZSAqIFBBR0VfU0laRTsKKwluZXRfZHJ2X29iai0+cmVjdl9jYiA9IG5ldHZzY19yZWN2X2NhbGxiYWNrOworCW5ldF9kcnZfb2JqLT5saW5rX3N0YXR1c19jaGFuZ2UgPSBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjazsKIAogCS8qIENhbGxiYWNrIHRvIGNsaWVudCBkcml2ZXIgdG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uICovCi0JZHJ2X2luaXQoJm5ldF9kcnZfb2JqLT5CYXNlKTsKKwlkcnZfaW5pdCgmbmV0X2Rydl9vYmotPmJhc2UpOwogCi0JZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBuZXRfZHJ2X29iai0+QmFzZS5uYW1lOwotCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZuZXRfZHJ2X29iai0+QmFzZS5kZXZpY2VUeXBlLAorCWRydl9jdHgtPmRyaXZlci5uYW1lID0gbmV0X2Rydl9vYmotPmJhc2UubmFtZTsKKwltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmbmV0X2Rydl9vYmotPmJhc2UuZGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAlkcnZfY3R4LT5wcm9iZSA9IG5ldHZzY19wcm9iZTsKQEAgLTUzNiw3ICs1MzksNyBAQAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShodl9uZXR2c2NfZG1pX3RhYmxlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gbmV0dnNjX2Rydl9pbml0KE5ldFZzY0luaXRpYWxpemUpOworCXJldHVybiBuZXR2c2NfZHJ2X2luaXQobmV0dnNjX2luaXRpYWxpemUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmV0dnNjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYwppbmRleCA4YzNlYjI3Li5iNWEzOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5jCkBAIC00MywxMyArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJvc2QuaCIKIAotc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKTsKLQl2b2lkICpkYXRhOwotfTsKLQotdm9pZCAqb3NkX1ZpcnR1YWxBbGxvY0V4ZWModW5zaWduZWQgaW50IHNpemUpCit2b2lkICpvc2RfdmlydHVhbF9hbGxvY19leGVjKHVuc2lnbmVkIGludCBzaXplKQogewogI2lmZGVmIF9feDg2XzY0X18KIAlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMX0VYRUMpOwpAQCAtNjAsNyArNTQsNyBAQAogfQogCiAvKioKLSAqIG9zZF9QYWdlQWxsb2MoKSAtIEFsbG9jYXRlIHBhZ2VzCisgKiBvc2RfcGFnZV9hbGxvYygpIC0gQWxsb2NhdGUgcGFnZXMKICAqIEBjb3VudDogICAgICBUb3RhbCBudW1iZXIgb2YgS2VybmVsIHBhZ2VzIHlvdSB3YW50IHRvIGFsbG9jYXRlCiAgKgogICogVHJpZXMgdG8gYWxsb2NhdGUgQGNvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSBmcmVlIGtlcm5lbCBwYWdlcy4KQEAgLTY4LDcgKzYyLDcgQEAKICAqIElmIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgcmV0dXJuIHBvaW50ZXIgdG8gdGhlIEBjb3VudCBwYWdlcy4KICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotdm9pZCAqb3NkX1BhZ2VBbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpCit2b2lkICpvc2RfcGFnZV9hbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdm9pZCAqcDsKIApAQCAtODUsMjYgKzc5LDI2IEBACiAJLyogaWYgKHApIG1lbXNldChwLCAwLCBQQUdFX1NJWkUpOyAqLwogCS8qIHJldHVybiBwOyAqLwogfQotRVhQT1JUX1NZTUJPTF9HUEwob3NkX1BhZ2VBbGxvYyk7CitFWFBPUlRfU1lNQk9MX0dQTChvc2RfcGFnZV9hbGxvYyk7CiAKIC8qKgotICogb3NkX1BhZ2VGcmVlKCkgLSBGcmVlIHBhZ2VzCisgKiBvc2RfcGFnZV9mcmVlKCkgLSBGcmVlIHBhZ2VzCiAgKiBAcGFnZTogICAgICAgUG9pbnRlciB0byB0aGUgZmlyc3QgcGFnZSB0byBiZSBmcmVlZAogICogQGNvdW50OiAgICAgIFRvdGFsIG51bWJlciBvZiBLZXJuZWwgcGFnZXMgeW91IGZyZWUKICAqCi0gKiBGcmVlcyB0aGUgcGFnZXMgYWxsb2NhdGVkIGJ5IG9zZF9QYWdlQWxsb2MoKQorICogRnJlZXMgdGhlIHBhZ2VzIGFsbG9jYXRlZCBieSBvc2RfcGFnZV9hbGxvYygpCiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLXZvaWQgb3NkX1BhZ2VGcmVlKHZvaWQgKnBhZ2UsIHVuc2lnbmVkIGludCBjb3VudCkKK3ZvaWQgb3NkX3BhZ2VfZnJlZSh2b2lkICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwYWdlLCBnZXRfb3JkZXIoY291bnQgKiBQQUdFX1NJWkUpKTsKIAkvKnN0cnVjdCBwYWdlKiBwID0gdmlydF90b19wYWdlKHBhZ2UpOwogCV9fZnJlZV9wYWdlKHApOyovCiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfUGFnZUZyZWUpOworRVhQT1JUX1NZTUJPTF9HUEwob3NkX3BhZ2VfZnJlZSk7CiAKIC8qKgotICogb3NkX1dhaXRFdmVudENyZWF0ZSgpIC0gQ3JlYXRlIHRoZSBldmVudCBxdWV1ZQorICogb3NkX3dhaXRldmVudF9jcmVhdGUoKSAtIENyZWF0ZSB0aGUgZXZlbnQgcXVldWUKICAqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhICZzdHJ1Y3Qgb3NkX3dhaXRldmVudC4gQW5kIHRoZW4gY2FsbHMKICAqIGluaXRfd2FpdHF1ZXVlX2hlYWQgdG8gc2V0IHVwIHRoZSB3YWl0IHF1ZXVlIGZvciB0aGUgZXZlbnQuCkBAIC0xMTQsNyArMTA4LDcgQEAKICAqIFJldHVybnMgcG9pbnRlciB0byAmc3RydWN0IG9zZF93YWl0ZXZlbnQKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotc3RydWN0IG9zZF93YWl0ZXZlbnQgKm9zZF9XYWl0RXZlbnRDcmVhdGUodm9pZCkKK3N0cnVjdCBvc2Rfd2FpdGV2ZW50ICpvc2Rfd2FpdGV2ZW50X2NyZWF0ZSh2b2lkKQogewogCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zZF93YWl0ZXZlbnQpLAogCQkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtMTI1LDE0ICsxMTksMTQgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3YWl0LT5ldmVudCk7CiAJcmV0dXJuIHdhaXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfV2FpdEV2ZW50Q3JlYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfY3JlYXRlKTsKIAogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRTZXQoKSAtIFdha2UgdXAgdGhlIHByb2Nlc3MKLSAqIEB3YWl0RXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSB3b2tlbiB1cAorICogb3NkX3dhaXRldmVudF9zZXQoKSAtIFdha2UgdXAgdGhlIHByb2Nlc3MKKyAqIEB3YWl0X2V2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgd29rZW4gdXAKICAqCi0gKiBAd2FpdGV2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CisgKiBAd2FpdF9ldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAogICoKICAqIFdha2UgdXAgdGhlIHNsZWVwaW5nIHByb2Nlc3Mgc28gaXQgY2FuIGRvIHNvbWUgd29yay4KICAqIEFuZCBzZXQgY29uZGl0aW9uIGluZGljYXRvciBpbiAmc3RydWN0IG9zZF93YWl0ZXZlbnQgdG8gaW5kaWNhdGUKQEAgLTE0MCwxOCArMTM0LDE4IEBACiAgKgogICogT25seSB1c2VkIGJ5IE5ldHdvcmsgYW5kIFN0b3JhZ2UgSHlwZXItViBkcml2ZXJzLgogICovCi12b2lkIG9zZF9XYWl0RXZlbnRTZXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRFdmVudCkKK3ZvaWQgb3NkX3dhaXRldmVudF9zZXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQpCiB7Ci0Jd2FpdEV2ZW50LT5jb25kaXRpb24gPSAxOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd2FpdEV2ZW50LT5ldmVudCk7CisJd2FpdF9ldmVudC0+Y29uZGl0aW9uID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJndhaXRfZXZlbnQtPmV2ZW50KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRTZXQpOworRVhQT1JUX1NZTUJPTF9HUEwob3NkX3dhaXRldmVudF9zZXQpOwogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRXYWl0KCkgLSBXYWl0IGZvciBldmVudCB0aWxsIGNvbmRpdGlvbiBpcyB0cnVlCi0gKiBAd2FpdEV2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCisgKiBvc2Rfd2FpdGV2ZW50X3dhaXQoKSAtIFdhaXQgZm9yIGV2ZW50IHRpbGwgY29uZGl0aW9uIGlzIHRydWUKKyAqIEB3YWl0X2V2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCiAgKgotICogQHdhaXRldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAorICogQHdhaXRfZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKICAqCiAgKiBTZXQgdXAgdGhlIHByb2Nlc3MgdG8gc2xlZXAgdW50aWwgd2FpdEV2ZW50LT5jb25kaXRpb24gZ2V0IHRydWUuCiAgKiBBbmQgc2V0IGNvbmRpdGlvbiBpbmRpY2F0b3IgaW4gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50IHRvIGluZGljYXRlCkBAIC0xNjEsMjUgKzE1NSwyNSBAQAogICoKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotaW50IG9zZF9XYWl0RXZlbnRXYWl0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0RXZlbnQpCitpbnQgb3NkX3dhaXRldmVudF93YWl0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0X2V2ZW50KQogewogCWludCByZXQgPSAwOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdhaXRFdmVudC0+ZXZlbnQsCi0JCQkJICAgICAgIHdhaXRFdmVudC0+Y29uZGl0aW9uKTsKLQl3YWl0RXZlbnQtPmNvbmRpdGlvbiA9IDA7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdhaXRfZXZlbnQtPmV2ZW50LAorCQkJCSAgICAgICB3YWl0X2V2ZW50LT5jb25kaXRpb24pOworCXdhaXRfZXZlbnQtPmNvbmRpdGlvbiA9IDA7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRXYWl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfd2FpdCk7CiAKIC8qKgotICogb3NkX1dhaXRFdmVudFdhaXRFeCgpIC0gV2FpdCBmb3IgZXZlbnQgb3IgdGltZW91dCBmb3IgcHJvY2VzcyB3YWtldXAKLSAqIEB3YWl0RXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSBwdXQgdG8gc2xlZXAKLSAqIEBUaW1lb3V0SW5NczogICAgICAgVG90YWwgbnVtYmVyIG9mIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSB3YWtpbmcgdXAKKyAqIG9zZF93YWl0ZXZlbnRfd2FpdGV4KCkgLSBXYWl0IGZvciBldmVudCBvciB0aW1lb3V0IGZvciBwcm9jZXNzIHdha2V1cAorICogQHdhaXRfZXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSBwdXQgdG8gc2xlZXAKKyAqIEB0aW1lb3V0X2luX21zOiAgICAgICBUb3RhbCBudW1iZXIgb2YgTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHdha2luZyB1cAogICoKLSAqIEB3YWl0ZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKKyAqIEB3YWl0X2V2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CiAgKiBTZXQgdXAgdGhlIHByb2Nlc3MgdG8gc2xlZXAgdW50aWwgQHdhaXRFdmVudC0+Y29uZGl0aW9uIGdldCB0cnVlIG9yCi0gKiBAVGltZW91dEluTXMgKFRpbWUgb3V0IGluIE1pbGxpc2Vjb25kcykgaGFzIGJlZW4gcmVhY2hlZC4KKyAqIEB0aW1lb3V0X2luX21zIChUaW1lIG91dCBpbiBNaWxsaXNlY29uZHMpIGhhcyBiZWVuIHJlYWNoZWQuCiAgKiBBbmQgc2V0IGNvbmRpdGlvbiBpbmRpY2F0b3IgaW4gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50IHRvIGluZGljYXRlCiAgKiB0aGUgcHJvY2VzcyBpcyBpbiBhIHNsZWVwaW5nIHN0YXRlLgogICoKQEAgLTE4Nyw0MiArMTgxLDE0IEBACiAgKgogICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgogICovCi1pbnQgb3NkX1dhaXRFdmVudFdhaXRFeChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50LCB1MzIgVGltZW91dEluTXMpCitpbnQgb3NkX3dhaXRldmVudF93YWl0ZXgoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQsIHUzMiB0aW1lb3V0X2luX21zKQogewogCWludCByZXQgPSAwOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod2FpdEV2ZW50LT5ldmVudCwKLQkJCQkJICAgICAgIHdhaXRFdmVudC0+Y29uZGl0aW9uLAotCQkJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyhUaW1lb3V0SW5NcykpOwotCXdhaXRFdmVudC0+Y29uZGl0aW9uID0gMDsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3YWl0X2V2ZW50LT5ldmVudCwKKwkJCQkJICAgICAgIHdhaXRfZXZlbnQtPmNvbmRpdGlvbiwKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9pbl9tcykpOworCXdhaXRfZXZlbnQtPmNvbmRpdGlvbiA9IDA7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRXYWl0RXgpOwotCi1zdGF0aWMgdm9pZCBvc2RfY2FsbGJhY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QgKmNiID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCQlzdHJ1Y3Qgb3NkX2NhbGxiYWNrX3N0cnVjdCwKLQkJCQkJCXdvcmspOwotCShjYi0+Y2FsbGJhY2spKGNiLT5kYXRhKTsKLQlrZnJlZShjYik7Ci19Ci0KLWludCBvc2Rfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAotCQkJICB2b2lkICgqZnVuYykodm9pZCAqKSwKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgb3NkX2NhbGxiYWNrX3N0cnVjdCAqY2I7Ci0KLQljYiA9IGttYWxsb2Moc2l6ZW9mKCpjYiksIEdGUF9LRVJORUwpOwotCWlmICghY2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluIG9zZF9zY2hlZHVsZV9jYWxsYmFja1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljYi0+Y2FsbGJhY2sgPSBmdW5jOwotCWNiLT5kYXRhID0gZGF0YTsKLQlJTklUX1dPUksoJmNiLT53b3JrLCBvc2RfY2FsbGJhY2tfd29yayk7Ci0JcmV0dXJuIHF1ZXVlX3dvcmsod3EsICZjYi0+d29yayk7Ci19Ci0KK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfd2FpdGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaAppbmRleCBjZTA2NGU4Li44NzBlZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5oCkBAIC01MCwyMSArNTAsMTcgQEAKIAogLyogT3NkIHJvdXRpbmVzICovCiAKLWV4dGVybiB2b2lkICpvc2RfVmlydHVhbEFsbG9jRXhlYyh1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqb3NkX3ZpcnR1YWxfYWxsb2NfZXhlYyh1bnNpZ25lZCBpbnQgc2l6ZSk7CiAKLWV4dGVybiB2b2lkICpvc2RfUGFnZUFsbG9jKHVuc2lnbmVkIGludCBjb3VudCk7Ci1leHRlcm4gdm9pZCBvc2RfUGFnZUZyZWUodm9pZCAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50KTsKK2V4dGVybiB2b2lkICpvc2RfcGFnZV9hbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIHZvaWQgb3NkX3BhZ2VfZnJlZSh2b2lkICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQpOwogCi1leHRlcm4gc3RydWN0IG9zZF93YWl0ZXZlbnQgKm9zZF9XYWl0RXZlbnRDcmVhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCBvc2RfV2FpdEV2ZW50U2V0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0RXZlbnQpOwotZXh0ZXJuIGludCBvc2RfV2FpdEV2ZW50V2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50KTsKK2V4dGVybiBzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqb3NkX3dhaXRldmVudF9jcmVhdGUodm9pZCk7CitleHRlcm4gdm9pZCBvc2Rfd2FpdGV2ZW50X3NldChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCk7CitleHRlcm4gaW50IG9zZF93YWl0ZXZlbnRfd2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCk7CiAKLS8qIElmID4wLCB3YWl0RXZlbnQgZ290IHNpZ25hbGVkLiBJZiA9PTAsIHRpbWVvdXQuIElmIDwgMCwgZXJyb3IgKi8KLWV4dGVybiBpbnQgb3NkX1dhaXRFdmVudFdhaXRFeChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50LAotCQkJICAgICAgIHUzMiBUaW1lb3V0SW5Ncyk7Ci0KLWludCBvc2Rfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAotCQkJICB2b2lkICgqZnVuYykodm9pZCAqKSwKLQkJCSAgdm9pZCAqZGF0YSk7CisvKiBJZiA+MCwgd2FpdF9ldmVudCBnb3Qgc2lnbmFsZWQuIElmID09MCwgdGltZW91dC4gSWYgPCAwLCBlcnJvciAqLworZXh0ZXJuIGludCBvc2Rfd2FpdGV2ZW50X3dhaXRleChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCwKKwkJCSAgICAgICB1MzIgdGltZW91dF9pbl9tcyk7CiAKICNlbmRpZiAvKiBfT1NEX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCmluZGV4IGQ3OGM1NjkuLjRkNTMzOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCkBAIC0zOCw3ICszOCw3IEBACiAvKisrCiAKIE5hbWU6Ci0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoKQorCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byByZWFkIGFuZCB0byB3cml0ZSB0bwpAQCAtNDYsMzMgKzQ2LDM0IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwgdTMyICpyZWFkLCB1MzIgKndyaXRlKQorZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpLAorCQkJICB1MzIgKnJlYWQsIHUzMiAqd3JpdGUpCiB7CiAJdTMyIHJlYWRfbG9jLCB3cml0ZV9sb2M7CiAKIAkvKiBDYXB0dXJlIHRoZSByZWFkL3dyaXRlIGluZGljZXMgYmVmb3JlIHRoZXkgY2hhbmdlZCAqLwotCXJlYWRfbG9jID0gcmJpLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7Ci0Jd3JpdGVfbG9jID0gcmJpLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4OworCXJlYWRfbG9jID0gcmJpLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleDsKKwl3cml0ZV9sb2MgPSByYmktPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleDsKIAotCSp3cml0ZSA9IEJZVEVTX0FWQUlMX1RPX1dSSVRFKHJlYWRfbG9jLCB3cml0ZV9sb2MsIHJiaS0+UmluZ0RhdGFTaXplKTsKLQkqcmVhZCA9IHJiaS0+UmluZ0RhdGFTaXplIC0gKndyaXRlOworCSp3cml0ZSA9IEJZVEVTX0FWQUlMX1RPX1dSSVRFKHJlYWRfbG9jLCB3cml0ZV9sb2MsIHJiaS0+cmluZ19kYXRhc2l6ZSk7CisJKnJlYWQgPSByYmktPnJpbmdfZGF0YXNpemUgLSAqd3JpdGU7CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0V3JpdGVMb2NhdGlvbigpCisJZ2V0X25leHRfd3JpdGVfbG9jYXRpb24oKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIG5leHQgd3JpdGUgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1MzIKLUdldE5leHRXcml0ZUxvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9uZXh0X3dyaXRlX2xvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7Ci0JdTMyIG5leHQgPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4OwogCi0JLyogQVNTRVJUKG5leHQgPCBSaW5nSW5mby0+UmluZ0RhdGFTaXplKTsgKi8KKwkvKiBBU1NFUlQobmV4dCA8IHJpbmdfaW5mby0+UmluZ0RhdGFTaXplKTsgKi8KIAogCXJldHVybiBuZXh0OwogfQpAQCAtODAsMzQgKzgxLDM0IEBACiAvKisrCiAKIE5hbWU6Ci0JU2V0TmV4dFdyaXRlTG9jYXRpb24oKQorCXNldF9uZXh0X3dyaXRlX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJU2V0IHRoZSBuZXh0IHdyaXRlIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotU2V0TmV4dFdyaXRlTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLAotCQkgICAgIHUzMiBOZXh0V3JpdGVMb2NhdGlvbikKK3NldF9uZXh0X3dyaXRlX2xvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgICAgdTMyIG5leHRfd3JpdGVfbG9jYXRpb24pCiB7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPldyaXRlSW5kZXggPSBOZXh0V3JpdGVMb2NhdGlvbjsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCA9IG5leHRfd3JpdGVfbG9jYXRpb247CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0UmVhZExvY2F0aW9uKCkKKwlnZXRfbmV4dF9yZWFkX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBuZXh0IHJlYWQgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1MzIKLUdldE5leHRSZWFkTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X25leHRfcmVhZF9sb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CiAKLQkvKiBBU1NFUlQobmV4dCA8IFJpbmdJbmZvLT5SaW5nRGF0YVNpemUpOyAqLworCS8qIEFTU0VSVChuZXh0IDwgcmluZ19pbmZvLT5SaW5nRGF0YVNpemUpOyAqLwogCiAJcmV0dXJuIG5leHQ7CiB9CkBAIC0xMTUsNyArMTE2LDcgQEAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldCgpCisJZ2V0X25leHRfcmVhZGxvY2F0aW9uX3dpdGhvZmZzZXQoKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIG5leHQgcmVhZCBsb2NhdGlvbiArIG9mZnNldCBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlci4KQEAgLTEyMywxMyArMTI0LDE0IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHUzMiBPZmZzZXQpCitnZXRfbmV4dF9yZWFkbG9jYXRpb25fd2l0aG9mZnNldChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAorCQkJCSB1MzIgb2Zmc2V0KQogewotCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CiAKLQkvKiBBU1NFUlQobmV4dCA8IFJpbmdJbmZvLT5SaW5nRGF0YVNpemUpOyAqLwotCW5leHQgKz0gT2Zmc2V0OwotCW5leHQgJT0gUmluZ0luZm8tPlJpbmdEYXRhU2l6ZTsKKwkvKiBBU1NFUlQobmV4dCA8IHJpbmdfaW5mby0+UmluZ0RhdGFTaXplKTsgKi8KKwluZXh0ICs9IG9mZnNldDsKKwluZXh0ICU9IHJpbmdfaW5mby0+cmluZ19kYXRhc2l6ZTsKIAogCXJldHVybiBuZXh0OwogfQpAQCAtMTM3LDE0MSArMTM5LDE0NSBAQAogLyorKwogCiBOYW1lOgotCVNldE5leHRSZWFkTG9jYXRpb24oKQorCXNldF9uZXh0X3JlYWRfbG9jYXRpb24oKQogCiBEZXNjcmlwdGlvbjoKIAlTZXQgdGhlIG5leHQgcmVhZCBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLVNldE5leHRSZWFkTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB1MzIgTmV4dFJlYWRMb2NhdGlvbikKK3NldF9uZXh0X3JlYWRfbG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKKwkJICAgIHUzMiBuZXh0X3JlYWRfbG9jYXRpb24pCiB7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleCA9IE5leHRSZWFkTG9jYXRpb247CisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCA9IG5leHRfcmVhZF9sb2NhdGlvbjsKIH0KIAogCiAvKisrCiAKIE5hbWU6Ci0JR2V0UmluZ0J1ZmZlcigpCisJZ2V0X3JpbmdfYnVmZmVyKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBzdGFydCBvZiB0aGUgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB2b2lkICoKLUdldFJpbmdCdWZmZXIoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7Ci0JcmV0dXJuICh2b2lkICopUmluZ0luZm8tPlJpbmdCdWZmZXItPkJ1ZmZlcjsKKwlyZXR1cm4gKHZvaWQgKilyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5idWZmZXI7CiB9CiAKIAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXJTaXplKCkKKwlnZXRfcmluZ19idWZmZXJzaXplKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBzaXplIG9mIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHUzMgotR2V0UmluZ0J1ZmZlclNpemUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyc2l6ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXJldHVybiBSaW5nSW5mby0+UmluZ0RhdGFTaXplOworCXJldHVybiByaW5nX2luZm8tPnJpbmdfZGF0YXNpemU7CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXRSaW5nQnVmZmVySW5kaWNlcygpCisJZ2V0X3JpbmdfYnVmZmVyaW5kaWNlcygpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgcmVhZCBhbmQgd3JpdGUgaW5kaWNlcyBhcyB1NjQgb2YgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHU2NAotR2V0UmluZ0J1ZmZlckluZGljZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyaW5kaWNlcyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXJldHVybiAodTY0KVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4IDw8IDMyOworCXJldHVybiAodTY0KXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4IDw8IDMyOwogfQogCiAKIC8qKysKIAogTmFtZToKLQlEdW1wUmluZ0luZm8oKQorCWR1bXBfcmluZ19pbmZvKCkKIAogRGVzY3JpcHRpb246CiAJRHVtcCBvdXQgdG8gY29uc29sZSB0aGUgcmluZyBidWZmZXIgaW5mbwogCiAtLSovCi12b2lkIER1bXBSaW5nSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIGNoYXIgKlByZWZpeCkKK3ZvaWQgZHVtcF9yaW5nX2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgY2hhciAqcHJlZml4KQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoUmluZ0luZm8sCi0JJmJ5dGVzQXZhaWxUb1JlYWQsCi0JJmJ5dGVzQXZhaWxUb1dyaXRlKTsKKwlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKHJpbmdfaW5mbywKKwkmYnl0ZXNfYXZhaWxfdG9yZWFkLAorCSZieXRlc19hdmFpbF90b3dyaXRlKTsKIAogCURQUklOVChWTUJVUywKIAkJREVCVUdfUklOR19MVkwsCiAJCSIlcyA8PHJpbmdpbmZvICVwIGJ1ZmZlciAlcCBhdmFpbCB3cml0ZSAldSAiCiAJCSJhdmFpbCByZWFkICV1IHJlYWQgaWR4ICV1IHdyaXRlIGlkeCAldT4+IiwKLQkJUHJlZml4LAotCQlSaW5nSW5mbywKLQkJUmluZ0luZm8tPlJpbmdCdWZmZXItPkJ1ZmZlciwKLQkJYnl0ZXNBdmFpbFRvV3JpdGUsCi0JCWJ5dGVzQXZhaWxUb1JlYWQsCi0JCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXgsCi0JCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4KTsKKwkJcHJlZml4LAorCQlyaW5nX2luZm8sCisJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPmJ1ZmZlciwKKwkJYnl0ZXNfYXZhaWxfdG93cml0ZSwKKwkJYnl0ZXNfYXZhaWxfdG9yZWFkLAorCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4LAorCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCk7CiB9CiAKIAogLyogSW50ZXJuYWwgcm91dGluZXMgKi8KIAogc3RhdGljIHUzMgotQ29weVRvUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0JdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCi0Jdm9pZAkJCQkqU3JjLAotCXUzMgkJCQlTcmNMZW4pOworY29weXRvX3JpbmdidWZmZXIoCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKnJpbmdfaW5mbywKKwl1MzIJCQkJc3RhcnRfd3JpdGVfb2Zmc2V0LAorCXZvaWQJCQkJKnNyYywKKwl1MzIJCQkJc3JjbGVuKTsKIAogc3RhdGljIHUzMgotQ29weUZyb21SaW5nQnVmZmVyKAotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpSaW5nSW5mbywKLQl2b2lkCQkJCSpEZXN0LAotCXUzMgkJCQlEZXN0TGVuLAotCXUzMgkJCQlTdGFydFJlYWRPZmZzZXQpOworY29weWZyb21fcmluZ2J1ZmZlcigKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqcmluZ19pbmZvLAorCXZvaWQJCQkJKmRlc3QsCisJdTMyCQkJCWRlc3RsZW4sCisJdTMyCQkJCXN0YXJ0X3JlYWRfb2Zmc2V0KTsKIAogCiAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVyR2V0RGVidWdJbmZvKCkKKwlyaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdmFyaW91cyBkZWJ1ZyBtZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KLXZvaWQgUmluZ0J1ZmZlckdldERlYnVnSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCit2b2lkIHJpbmdidWZmZXJfZ2V0X2RlYnVnaW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAogCQkJICAgIHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvKQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwogCi0JaWYgKFJpbmdJbmZvLT5SaW5nQnVmZmVyKSB7Ci0JCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKFJpbmdJbmZvLAotCQkJCQkmYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCQkJJmJ5dGVzQXZhaWxUb1dyaXRlKTsKKwlpZiAocmluZ19pbmZvLT5yaW5nX2J1ZmZlcikgeworCQlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKHJpbmdfaW5mbywKKwkJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkJJmJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCi0JCWRlYnVnX2luZm8tPkJ5dGVzQXZhaWxUb1JlYWQgPSBieXRlc0F2YWlsVG9SZWFkOwotCQlkZWJ1Z19pbmZvLT5CeXRlc0F2YWlsVG9Xcml0ZSA9IGJ5dGVzQXZhaWxUb1dyaXRlOwotCQlkZWJ1Z19pbmZvLT5DdXJyZW50UmVhZEluZGV4ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKLQkJZGVidWdfaW5mby0+Q3VycmVudFdyaXRlSW5kZXggPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKLQkJZGVidWdfaW5mby0+Q3VycmVudEludGVycnVwdE1hc2sgPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+SW50ZXJydXB0TWFzazsKKwkJZGVidWdfaW5mby0+Ynl0ZXNfYXZhaWxfdG9yZWFkID0gYnl0ZXNfYXZhaWxfdG9yZWFkOworCQlkZWJ1Z19pbmZvLT5ieXRlc19hdmFpbF90b3dyaXRlID0gYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwkJZGVidWdfaW5mby0+Y3VycmVudF9yZWFkX2luZGV4ID0KKwkJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CisJCWRlYnVnX2luZm8tPmN1cnJlbnRfd3JpdGVfaW5kZXggPQorCQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXg7CisJCWRlYnVnX2luZm8tPmN1cnJlbnRfaW50ZXJydXB0X21hc2sgPQorCQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+aW50ZXJydXB0X21hc2s7CiAJfQogfQogCkBAIC0yNzksNDAgKzI4NSw0MiBAQAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCkKKwlnZXRfcmluZ2J1ZmZlcl9pbnRlcnJ1cHRfbWFzaygpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgaW50ZXJydXB0IG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyYmkpCit1MzIgZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSkKIHsKLQlyZXR1cm4gcmJpLT5SaW5nQnVmZmVyLT5JbnRlcnJ1cHRNYXNrOworCXJldHVybiByYmktPnJpbmdfYnVmZmVyLT5pbnRlcnJ1cHRfbWFzazsKIH0KIAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJJbml0KCkKKwlyaW5nYnVmZmVyX2luaXQoKQogCiBEZXNjcmlwdGlvbjoKIAlJbml0aWFsaXplIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi1pbnQgUmluZ0J1ZmZlckluaXQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB2b2lkICpCdWZmZXIsIHUzMiBCdWZmZXJMZW4pCitpbnQgcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbikKIHsKIAlpZiAoc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcikgIT0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXNldChSaW5nSW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvKSk7CisJbWVtc2V0KHJpbmdfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvKSk7CiAKLQlSaW5nSW5mby0+UmluZ0J1ZmZlciA9IChzdHJ1Y3QgaHZfcmluZ19idWZmZXIgKilCdWZmZXI7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4ID0gMDsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyID0gKHN0cnVjdCBodl9yaW5nX2J1ZmZlciAqKWJ1ZmZlcjsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4ID0KKwkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXggPSAwOwogCi0JUmluZ0luZm8tPlJpbmdTaXplID0gQnVmZmVyTGVuOwotCVJpbmdJbmZvLT5SaW5nRGF0YVNpemUgPSBCdWZmZXJMZW4gLSBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKTsKKwlyaW5nX2luZm8tPnJpbmdfc2l6ZSA9IGJ1ZmxlbjsKKwlyaW5nX2luZm8tPnJpbmdfZGF0YXNpemUgPSBidWZsZW4gLSBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKTsKIAotCXNwaW5fbG9ja19pbml0KCZSaW5nSW5mby0+cmluZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcmluZ19pbmZvLT5yaW5nX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjAsOTcgKzMyOCw5NyBAQAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJDbGVhbnVwKCkKKwlyaW5nYnVmZmVyX2NsZWFudXAoKQogCiBEZXNjcmlwdGlvbjoKIAlDbGVhbnVwIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi12b2lkIFJpbmdCdWZmZXJDbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK3ZvaWQgcmluZ2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7CiB9CiAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVyV3JpdGUoKQorCXJpbmdidWZmZXJfd3JpdGUoKQogCiBEZXNjcmlwdGlvbjoKIAlXcml0ZSB0byB0aGUgcmluZyBidWZmZXIKIAogLS0qLwotaW50IFJpbmdCdWZmZXJXcml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqT3V0UmluZ0luZm8sCitpbnQgcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqb3V0cmluZ19pbmZvLAogCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHUzMiBzZ2NvdW50KQogewogCWludCBpID0gMDsKLQl1MzIgYnl0ZUF2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZUF2YWlsVG9SZWFkOwotCXUzMiB0b3RhbEJ5dGVzVG9Xcml0ZSA9IDA7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgdG90YWxieXRlc190b3dyaXRlID0gMDsKIAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jdm9sYXRpbGUgdTMyIG5leHRXcml0ZUxvY2F0aW9uOwotCXU2NCBwcmV2SW5kaWNlcyA9IDA7CisJdm9sYXRpbGUgdTMyIG5leHRfd3JpdGVfbG9jYXRpb247CisJdTY0IHByZXZfaW5kaWNlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIHNnY291bnQsIGkpCiAJewotCQl0b3RhbEJ5dGVzVG9Xcml0ZSArPSBzZy0+bGVuZ3RoOworCQl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2ctPmxlbmd0aDsKIAl9CiAKLQl0b3RhbEJ5dGVzVG9Xcml0ZSArPSBzaXplb2YodTY0KTsKKwl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2l6ZW9mKHU2NCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoT3V0UmluZ0luZm8sCi0JCQkJJmJ5dGVBdmFpbFRvUmVhZCwKLQkJCQkmYnl0ZUF2YWlsVG9Xcml0ZSk7CisJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhvdXRyaW5nX2luZm8sCisJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiV3JpdGluZyAldSBieXRlcy4uLiIsIHRvdGFsQnl0ZXNUb1dyaXRlKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiV3JpdGluZyAldSBieXRlcy4uLiIsIHRvdGFsYnl0ZXNfdG93cml0ZSk7CiAKLQkvKiBEdW1wUmluZ0luZm8oT3V0UmluZ0luZm8sICJCRUZPUkUgIik7ICovCisJLyogRHVtcHJpbmdfaW5mbyhPdXRyaW5nX2luZm8sICJCRUZPUkUgIik7ICovCiAKIAkvKiBJZiB0aGVyZSBpcyBvbmx5IHJvb20gZm9yIHRoZSBwYWNrZXQsIGFzc3VtZSBpdCBpcyBmdWxsLiAqLwogCS8qIE90aGVyd2lzZSwgdGhlIG5leHQgdGltZSBhcm91bmQsIHdlIHRoaW5rIHRoZSByaW5nIGJ1ZmZlciAqLwogCS8qIGlzIGVtcHR5IHNpbmNlIHRoZSByZWFkIGluZGV4ID09IHdyaXRlIGluZGV4ICovCi0JaWYgKGJ5dGVBdmFpbFRvV3JpdGUgPD0gdG90YWxCeXRlc1RvV3JpdGUpIHsKKwlpZiAoYnl0ZXNfYXZhaWxfdG93cml0ZSA8PSB0b3RhbGJ5dGVzX3Rvd3JpdGUpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywKIAkJCSJObyBtb3JlIHNwYWNlIGxlZnQgb24gb3V0Ym91bmQgcmluZyBidWZmZXIgIgogCQkJIihuZWVkZWQgJXUsIGF2YWlsICV1KSIsCi0JCQl0b3RhbEJ5dGVzVG9Xcml0ZSwKLQkJCWJ5dGVBdmFpbFRvV3JpdGUpOworCQkJdG90YWxieXRlc190b3dyaXRlLAorCQkJYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogV3JpdGUgdG8gdGhlIHJpbmcgYnVmZmVyICovCi0JbmV4dFdyaXRlTG9jYXRpb24gPSBHZXROZXh0V3JpdGVMb2NhdGlvbihPdXRSaW5nSW5mbyk7CisJbmV4dF93cml0ZV9sb2NhdGlvbiA9IGdldF9uZXh0X3dyaXRlX2xvY2F0aW9uKG91dHJpbmdfaW5mbyk7CiAKIAlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2NvdW50LCBpKQogCXsKLQkJbmV4dFdyaXRlTG9jYXRpb24gPSBDb3B5VG9SaW5nQnVmZmVyKE91dFJpbmdJbmZvLAotCQkJCQkJICAgICBuZXh0V3JpdGVMb2NhdGlvbiwKKwkJbmV4dF93cml0ZV9sb2NhdGlvbiA9IGNvcHl0b19yaW5nYnVmZmVyKG91dHJpbmdfaW5mbywKKwkJCQkJCSAgICAgbmV4dF93cml0ZV9sb2NhdGlvbiwKIAkJCQkJCSAgICAgc2dfdmlydChzZyksCiAJCQkJCQkgICAgIHNnLT5sZW5ndGgpOwogCX0KIAogCS8qIFNldCBwcmV2aW91cyBwYWNrZXQgc3RhcnQgKi8KLQlwcmV2SW5kaWNlcyA9IEdldFJpbmdCdWZmZXJJbmRpY2VzKE91dFJpbmdJbmZvKTsKKwlwcmV2X2luZGljZXMgPSBnZXRfcmluZ19idWZmZXJpbmRpY2VzKG91dHJpbmdfaW5mbyk7CiAKLQluZXh0V3JpdGVMb2NhdGlvbiA9IENvcHlUb1JpbmdCdWZmZXIoT3V0UmluZ0luZm8sCi0JCQkJCSAgICAgbmV4dFdyaXRlTG9jYXRpb24sCi0JCQkJCSAgICAgJnByZXZJbmRpY2VzLAorCW5leHRfd3JpdGVfbG9jYXRpb24gPSBjb3B5dG9fcmluZ2J1ZmZlcihvdXRyaW5nX2luZm8sCisJCQkJCSAgICAgbmV4dF93cml0ZV9sb2NhdGlvbiwKKwkJCQkJICAgICAmcHJldl9pbmRpY2VzLAogCQkJCQkgICAgIHNpemVvZih1NjQpKTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCBhbGwgd3JpdGVzIGJlZm9yZSB1cGRhdGluZyB0aGUgd3JpdGVJbmRleCAqLwogCW1iKCk7CiAKIAkvKiBOb3csIHVwZGF0ZSB0aGUgd3JpdGUgbG9jYXRpb24gKi8KLQlTZXROZXh0V3JpdGVMb2NhdGlvbihPdXRSaW5nSW5mbywgbmV4dFdyaXRlTG9jYXRpb24pOworCXNldF9uZXh0X3dyaXRlX2xvY2F0aW9uKG91dHJpbmdfaW5mbywgbmV4dF93cml0ZV9sb2NhdGlvbik7CiAKLQkvKiBEdW1wUmluZ0luZm8oT3V0UmluZ0luZm8sICJBRlRFUiAiKTsgKi8KKwkvKiBEdW1wcmluZ19pbmZvKE91dHJpbmdfaW5mbywgIkFGVEVSICIpOyAqLwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm91dHJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxOCw0NyArNDI2LDQ4IEBACiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlclBlZWsoKQorCXJpbmdidWZmZXJfcGVlaygpCiAKIERlc2NyaXB0aW9uOgogCVJlYWQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJQZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJblJpbmdJbmZvLCB2b2lkICpCdWZmZXIsIHUzMiBCdWZmZXJMZW4pCitpbnQgcmluZ2J1ZmZlcl9wZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJbnJpbmdfaW5mbywKKwkJICAgdm9pZCAqQnVmZmVyLCB1MzIgYnVmbGVuKQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgbmV4dFJlYWRMb2NhdGlvbiA9IDA7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgbmV4dF9yZWFkX2xvY2F0aW9uID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZJbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKLQlHZXRSaW5nQnVmZmVyQXZhaWxCeXRlcyhJblJpbmdJbmZvLAotCQkJCSZieXRlc0F2YWlsVG9SZWFkLAotCQkJCSZieXRlc0F2YWlsVG9Xcml0ZSk7CisJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhJbnJpbmdfaW5mbywKKwkJCQkmYnl0ZXNfYXZhaWxfdG9yZWFkLAorCQkJCSZieXRlc19hdmFpbF90b3dyaXRlKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVhZCAqLwotCWlmIChieXRlc0F2YWlsVG9SZWFkIDwgQnVmZmVyTGVuKSB7CisJaWYgKGJ5dGVzX2F2YWlsX3RvcmVhZCA8IGJ1ZmxlbikgewogCQkvKiBEUFJJTlRfREJHKFZNQlVTLAogCQkJImdvdCBjYWxsYmFjayBidXQgbm90IGVub3VnaCB0byByZWFkICIKIAkJCSI8YXZhaWwgdG8gcmVhZCAlZCByZWFkIHNpemUgJWQ+ISEiLAotCQkJYnl0ZXNBdmFpbFRvUmVhZCwKKwkJCWJ5dGVzX2F2YWlsX3RvcmVhZCwKIAkJCUJ1ZmZlckxlbik7ICovCiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSW5SaW5nSW5mby0+cmluZ19sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJklucmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogQ29udmVydCB0byBieXRlIG9mZnNldCAqLwotCW5leHRSZWFkTG9jYXRpb24gPSBHZXROZXh0UmVhZExvY2F0aW9uKEluUmluZ0luZm8pOworCW5leHRfcmVhZF9sb2NhdGlvbiA9IGdldF9uZXh0X3JlYWRfbG9jYXRpb24oSW5yaW5nX2luZm8pOwogCi0JbmV4dFJlYWRMb2NhdGlvbiA9IENvcHlGcm9tUmluZ0J1ZmZlcihJblJpbmdJbmZvLAorCW5leHRfcmVhZF9sb2NhdGlvbiA9IGNvcHlmcm9tX3JpbmdidWZmZXIoSW5yaW5nX2luZm8sCiAJCQkJCQlCdWZmZXIsCi0JCQkJCQlCdWZmZXJMZW4sCi0JCQkJCQluZXh0UmVhZExvY2F0aW9uKTsKKwkJCQkJCWJ1ZmxlbiwKKwkJCQkJCW5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ2Nyw1OCArNDc2LDU5IEBACiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlclJlYWQoKQorCXJpbmdidWZmZXJfcmVhZCgpCiAKIERlc2NyaXB0aW9uOgogCVJlYWQgYW5kIGFkdmFuY2UgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJSZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJblJpbmdJbmZvLCB2b2lkICpCdWZmZXIsCi0JCSAgIHUzMiBCdWZmZXJMZW4sIHUzMiBPZmZzZXQpCitpbnQgcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICppbnJpbmdfaW5mbywgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuLCB1MzIgb2Zmc2V0KQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgbmV4dFJlYWRMb2NhdGlvbiA9IDA7Ci0JdTY0IHByZXZJbmRpY2VzID0gMDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOworCXUzMiBuZXh0X3JlYWRfbG9jYXRpb24gPSAwOworCXU2NCBwcmV2X2luZGljZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoQnVmZmVyTGVuIDw9IDApCisJaWYgKGJ1ZmxlbiA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoSW5SaW5nSW5mbywKLQkJCQkmYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCQkmYnl0ZXNBdmFpbFRvV3JpdGUpOworCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoaW5yaW5nX2luZm8sCisJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiUmVhZGluZyAldSBieXRlcy4uLiIsIEJ1ZmZlckxlbik7CisJRFBSSU5UX0RCRyhWTUJVUywgIlJlYWRpbmcgJXUgYnl0ZXMuLi4iLCBidWZsZW4pOwogCi0JLyogRHVtcFJpbmdJbmZvKEluUmluZ0luZm8sICJCRUZPUkUgIik7ICovCisJLyogRHVtcHJpbmdfaW5mbyhJbnJpbmdfaW5mbywgIkJFRk9SRSAiKTsgKi8KIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVhZCAqLwotCWlmIChieXRlc0F2YWlsVG9SZWFkIDwgQnVmZmVyTGVuKSB7CisJaWYgKGJ5dGVzX2F2YWlsX3RvcmVhZCA8IGJ1ZmxlbikgewogCQlEUFJJTlRfREJHKFZNQlVTLAogCQkJImdvdCBjYWxsYmFjayBidXQgbm90IGVub3VnaCB0byByZWFkICIKIAkJCSI8YXZhaWwgdG8gcmVhZCAlZCByZWFkIHNpemUgJWQ+ISEiLAotCQkJYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCUJ1ZmZlckxlbik7CisJCQlieXRlc19hdmFpbF90b3JlYWQsCisJCQlidWZsZW4pOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAkJcmV0dXJuIC0xOwogCX0KIAotCW5leHRSZWFkTG9jYXRpb24gPSBHZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldChJblJpbmdJbmZvLCBPZmZzZXQpOworCW5leHRfcmVhZF9sb2NhdGlvbiA9CisJCWdldF9uZXh0X3JlYWRsb2NhdGlvbl93aXRob2Zmc2V0KGlucmluZ19pbmZvLCBvZmZzZXQpOwogCi0JbmV4dFJlYWRMb2NhdGlvbiA9IENvcHlGcm9tUmluZ0J1ZmZlcihJblJpbmdJbmZvLAotCQkJCQkJQnVmZmVyLAotCQkJCQkJQnVmZmVyTGVuLAotCQkJCQkJbmV4dFJlYWRMb2NhdGlvbik7CisJbmV4dF9yZWFkX2xvY2F0aW9uID0gY29weWZyb21fcmluZ2J1ZmZlcihpbnJpbmdfaW5mbywKKwkJCQkJCWJ1ZmZlciwKKwkJCQkJCWJ1ZmxlbiwKKwkJCQkJCW5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQluZXh0UmVhZExvY2F0aW9uID0gQ29weUZyb21SaW5nQnVmZmVyKEluUmluZ0luZm8sCi0JCQkJCQkmcHJldkluZGljZXMsCisJbmV4dF9yZWFkX2xvY2F0aW9uID0gY29weWZyb21fcmluZ2J1ZmZlcihpbnJpbmdfaW5mbywKKwkJCQkJCSZwcmV2X2luZGljZXMsCiAJCQkJCQlzaXplb2YodTY0KSwKLQkJCQkJCW5leHRSZWFkTG9jYXRpb24pOworCQkJCQkJbmV4dF9yZWFkX2xvY2F0aW9uKTsKIAogCS8qIE1ha2Ugc3VyZSBhbGwgcmVhZHMgYXJlIGRvbmUgYmVmb3JlIHdlIHVwZGF0ZSB0aGUgcmVhZCBpbmRleCBzaW5jZSAqLwogCS8qIHRoZSB3cml0ZXIgbWF5IHN0YXJ0IHdyaXRpbmcgdG8gdGhlIHJlYWQgYXJlYSBvbmNlIHRoZSByZWFkIGluZGV4ICovCkBAIC01MjYsMTEgKzUzNiwxMSBAQAogCW1iKCk7CiAKIAkvKiBVcGRhdGUgdGhlIHJlYWQgaW5kZXggKi8KLQlTZXROZXh0UmVhZExvY2F0aW9uKEluUmluZ0luZm8sIG5leHRSZWFkTG9jYXRpb24pOworCXNldF9uZXh0X3JlYWRfbG9jYXRpb24oaW5yaW5nX2luZm8sIG5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQkvKiBEdW1wUmluZ0luZm8oSW5SaW5nSW5mbywgIkFGVEVSICIpOyAqLworCS8qIER1bXByaW5nX2luZm8oSW5yaW5nX2luZm8sICJBRlRFUiAiKTsgKi8KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlucmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTM5LDcgKzU0OSw3IEBACiAvKisrCiAKIE5hbWU6Ci0JQ29weVRvUmluZ0J1ZmZlcigpCisJY29weXRvX3JpbmdidWZmZXIoKQogCiBEZXNjcmlwdGlvbjoKIAlIZWxwZXIgcm91dGluZSB0byBjb3B5IGZyb20gc291cmNlIHRvIHJpbmcgYnVmZmVyLgpAQCAtNTQ3LDM3ICs1NTcsMzcgQEAKIAogLS0qLwogc3RhdGljIHUzMgotQ29weVRvUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0JdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCi0Jdm9pZAkJCQkqU3JjLAotCXUzMgkJCQlTcmNMZW4pCitjb3B5dG9fcmluZ2J1ZmZlcigKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqcmluZ19pbmZvLAorCXUzMgkJCQlzdGFydF93cml0ZV9vZmZzZXQsCisJdm9pZAkJCQkqc3JjLAorCXUzMgkJCQlzcmNsZW4pCiB7Ci0Jdm9pZCAqcmluZ0J1ZmZlciA9IEdldFJpbmdCdWZmZXIoUmluZ0luZm8pOwotCXUzMiByaW5nQnVmZmVyU2l6ZSA9IEdldFJpbmdCdWZmZXJTaXplKFJpbmdJbmZvKTsKLQl1MzIgZnJhZ0xlbjsKKwl2b2lkICpyaW5nX2J1ZmZlciA9IGdldF9yaW5nX2J1ZmZlcihyaW5nX2luZm8pOworCXUzMiByaW5nX2J1ZmZlcl9zaXplID0gZ2V0X3JpbmdfYnVmZmVyc2l6ZShyaW5nX2luZm8pOworCXUzMiBmcmFnX2xlbjsKIAogCS8qIHdyYXAtYXJvdW5kIGRldGVjdGVkISAqLwotCWlmIChTcmNMZW4gPiByaW5nQnVmZmVyU2l6ZSAtIFN0YXJ0V3JpdGVPZmZzZXQpIHsKKwlpZiAoc3JjbGVuID4gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAid3JhcC1hcm91bmQgZGV0ZWN0ZWQhIik7CiAKLQkJZnJhZ0xlbiA9IHJpbmdCdWZmZXJTaXplIC0gU3RhcnRXcml0ZU9mZnNldDsKLQkJbWVtY3B5KHJpbmdCdWZmZXIgKyBTdGFydFdyaXRlT2Zmc2V0LCBTcmMsIGZyYWdMZW4pOwotCQltZW1jcHkocmluZ0J1ZmZlciwgU3JjICsgZnJhZ0xlbiwgU3JjTGVuIC0gZnJhZ0xlbik7CisJCWZyYWdfbGVuID0gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldDsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIGZyYWdfbGVuKTsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyLCBzcmMgKyBmcmFnX2xlbiwgc3JjbGVuIC0gZnJhZ19sZW4pOwogCX0gZWxzZQotCQltZW1jcHkocmluZ0J1ZmZlciArIFN0YXJ0V3JpdGVPZmZzZXQsIFNyYywgU3JjTGVuKTsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CiAKLQlTdGFydFdyaXRlT2Zmc2V0ICs9IFNyY0xlbjsKLQlTdGFydFdyaXRlT2Zmc2V0ICU9IHJpbmdCdWZmZXJTaXplOworCXN0YXJ0X3dyaXRlX29mZnNldCArPSBzcmNsZW47CisJc3RhcnRfd3JpdGVfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CiAKLQlyZXR1cm4gU3RhcnRXcml0ZU9mZnNldDsKKwlyZXR1cm4gc3RhcnRfd3JpdGVfb2Zmc2V0OwogfQogCiAKIC8qKysKIAogTmFtZToKLQlDb3B5RnJvbVJpbmdCdWZmZXIoKQorCWNvcHlmcm9tX3JpbmdidWZmZXIoKQogCiBEZXNjcmlwdGlvbjoKIAlIZWxwZXIgcm91dGluZSB0byBjb3B5IHRvIHNvdXJjZSBmcm9tIHJpbmcgYnVmZmVyLgpAQCAtNTg1LDM0ICs1OTUsMzQgQEAKIAogLS0qLwogc3RhdGljIHUzMgotQ29weUZyb21SaW5nQnVmZmVyKAotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpSaW5nSW5mbywKLQl2b2lkCQkJCSpEZXN0LAotCXUzMgkJCQlEZXN0TGVuLAotCXUzMgkJCQlTdGFydFJlYWRPZmZzZXQpCitjb3B5ZnJvbV9yaW5nYnVmZmVyKAorCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpyaW5nX2luZm8sCisJdm9pZAkJCQkqZGVzdCwKKwl1MzIJCQkJZGVzdGxlbiwKKwl1MzIJCQkJc3RhcnRfcmVhZF9vZmZzZXQpCiB7Ci0Jdm9pZCAqcmluZ0J1ZmZlciA9IEdldFJpbmdCdWZmZXIoUmluZ0luZm8pOwotCXUzMiByaW5nQnVmZmVyU2l6ZSA9IEdldFJpbmdCdWZmZXJTaXplKFJpbmdJbmZvKTsKKwl2b2lkICpyaW5nX2J1ZmZlciA9IGdldF9yaW5nX2J1ZmZlcihyaW5nX2luZm8pOworCXUzMiByaW5nX2J1ZmZlcl9zaXplID0gZ2V0X3JpbmdfYnVmZmVyc2l6ZShyaW5nX2luZm8pOwogCi0JdTMyIGZyYWdMZW47CisJdTMyIGZyYWdfbGVuOwogCiAJLyogd3JhcC1hcm91bmQgZGV0ZWN0ZWQgYXQgdGhlIHNyYyAqLwotCWlmIChEZXN0TGVuID4gcmluZ0J1ZmZlclNpemUgLSBTdGFydFJlYWRPZmZzZXQpIHsKKwlpZiAoZGVzdGxlbiA+IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAic3JjIHdyYXAtYXJvdW5kIGRldGVjdGVkISIpOwogCi0JCWZyYWdMZW4gPSByaW5nQnVmZmVyU2l6ZSAtIFN0YXJ0UmVhZE9mZnNldDsKKwkJZnJhZ19sZW4gPSByaW5nX2J1ZmZlcl9zaXplIC0gc3RhcnRfcmVhZF9vZmZzZXQ7CiAKLQkJbWVtY3B5KERlc3QsIHJpbmdCdWZmZXIgKyBTdGFydFJlYWRPZmZzZXQsIGZyYWdMZW4pOwotCQltZW1jcHkoRGVzdCArIGZyYWdMZW4sIHJpbmdCdWZmZXIsIERlc3RMZW4gLSBmcmFnTGVuKTsKKwkJbWVtY3B5KGRlc3QsIHJpbmdfYnVmZmVyICsgc3RhcnRfcmVhZF9vZmZzZXQsIGZyYWdfbGVuKTsKKwkJbWVtY3B5KGRlc3QgKyBmcmFnX2xlbiwgcmluZ19idWZmZXIsIGRlc3RsZW4gLSBmcmFnX2xlbik7CiAJfSBlbHNlCiAKLQkJbWVtY3B5KERlc3QsIHJpbmdCdWZmZXIgKyBTdGFydFJlYWRPZmZzZXQsIERlc3RMZW4pOworCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7CiAKIAotCVN0YXJ0UmVhZE9mZnNldCArPSBEZXN0TGVuOwotCVN0YXJ0UmVhZE9mZnNldCAlPSByaW5nQnVmZmVyU2l6ZTsKKwlzdGFydF9yZWFkX29mZnNldCArPSBkZXN0bGVuOworCXN0YXJ0X3JlYWRfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CiAKLQlyZXR1cm4gU3RhcnRSZWFkT2Zmc2V0OworCXJldHVybiBzdGFydF9yZWFkX29mZnNldDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCmluZGV4IGE3ZjE3MTcuLjdiZDZlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCkBAIC0yOSwxOCArMjksMTggQEAKIAogc3RydWN0IGh2X3JpbmdfYnVmZmVyIHsKIAkvKiBPZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgcmluZyBkYXRhIGJlbG93ICovCi0Jdm9sYXRpbGUgdTMyIFdyaXRlSW5kZXg7CisJdm9sYXRpbGUgdTMyIHdyaXRlX2luZGV4OwogCiAJLyogT2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHJpbmcgZGF0YSBiZWxvdyAqLwotCXZvbGF0aWxlIHUzMiBSZWFkSW5kZXg7CisJdm9sYXRpbGUgdTMyIHJlYWRfaW5kZXg7CiAKLQl2b2xhdGlsZSB1MzIgSW50ZXJydXB0TWFzazsKKwl2b2xhdGlsZSB1MzIgaW50ZXJydXB0X21hc2s7CiAKIAkvKiBQYWQgaXQgdG8gUEFHRV9TSVpFIHNvIHRoYXQgZGF0YSBzdGFydHMgb24gcGFnZSBib3VuZGFyeSAqLwotCXU4CVJlc2VydmVkWzQwODRdOworCXU4CXJlc2VydmVkWzQwODRdOwogCiAJLyogTk9URToKLQkgKiBUaGUgSW50ZXJydXB0TWFzayBmaWVsZCBpcyB1c2VkIG9ubHkgZm9yIGNoYW5uZWxzIGJ1dCBzaW5jZSBvdXIKKwkgKiBUaGUgaW50ZXJydXB0X21hc2sgZmllbGQgaXMgdXNlZCBvbmx5IGZvciBjaGFubmVscyBidXQgc2luY2Ugb3VyCiAJICogdm1idXMgY29ubmVjdGlvbiBhbHNvIHVzZXMgdGhpcyBkYXRhIHN0cnVjdHVyZSBhbmQgaXRzIGRhdGEgc3RhcnRzCiAJICogaGVyZSwgd2UgY29tbWVudGVkIG91dCB0aGlzIGZpZWxkLgogCSAqLwpAQCAtNTAsMjQgKzUwLDI0IEBACiAJICogUmluZyBkYXRhIHN0YXJ0cyBoZXJlICsgUmluZ0RhdGFTdGFydE9mZnNldAogCSAqICEhISBETyBOT1QgcGxhY2UgYW55IGZpZWxkcyBiZWxvdyB0aGlzICEhIQogCSAqLwotCXU4IEJ1ZmZlclswXTsKKwl1OCBidWZmZXJbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyB7Ci0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyICpSaW5nQnVmZmVyOwotCXUzMiBSaW5nU2l6ZTsJCQkvKiBJbmNsdWRlIHRoZSBzaGFyZWQgaGVhZGVyICovCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyICpyaW5nX2J1ZmZlcjsKKwl1MzIgcmluZ19zaXplOwkJCS8qIEluY2x1ZGUgdGhlIHNoYXJlZCBoZWFkZXIgKi8KIAlzcGlubG9ja190IHJpbmdfbG9jazsKIAotCXUzMiBSaW5nRGF0YVNpemU7CQkvKiA8IHJpbmdTaXplICovCi0JdTMyIFJpbmdEYXRhU3RhcnRPZmZzZXQ7CisJdTMyIHJpbmdfZGF0YXNpemU7CQkvKiA8IHJpbmdfc2l6ZSAqLworCXUzMiByaW5nX2RhdGFfc3RhcnRvZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyB7Ci0JdTMyIEN1cnJlbnRJbnRlcnJ1cHRNYXNrOwotCXUzMiBDdXJyZW50UmVhZEluZGV4OwotCXUzMiBDdXJyZW50V3JpdGVJbmRleDsKLQl1MzIgQnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgQnl0ZXNBdmFpbFRvV3JpdGU7CisJdTMyIGN1cnJlbnRfaW50ZXJydXB0X21hc2s7CisJdTMyIGN1cnJlbnRfcmVhZF9pbmRleDsKKwl1MzIgY3VycmVudF93cml0ZV9pbmRleDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOworCXUzMiBieXRlc19hdmFpbF90b3dyaXRlOwogfTsKIAogCkBAIC03NSwyOCArNzUsMjggQEAKIC8qIEludGVyZmFjZSAqLwogCiAKLWludCBSaW5nQnVmZmVySW5pdChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwKLQkJICAgdTMyIEJ1ZmZlckxlbik7CitpbnQgcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKKwkJICAgdTMyIGJ1Zmxlbik7CiAKLXZvaWQgUmluZ0J1ZmZlckNsZWFudXAoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKTsKK3ZvaWQgcmluZ2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pOwogCi1pbnQgUmluZ0J1ZmZlcldyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKK2ludCByaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKIAkJICAgIHUzMiBzZ2NvdW50KTsKIAotaW50IFJpbmdCdWZmZXJQZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLAotCQkgICB1MzIgQnVmZmVyTGVuKTsKK2ludCByaW5nYnVmZmVyX3BlZWsoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuKTsKIAotaW50IFJpbmdCdWZmZXJSZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKLQkJICAgdm9pZCAqQnVmZmVyLAotCQkgICB1MzIgQnVmZmVyTGVuLAotCQkgICB1MzIgT2Zmc2V0KTsKK2ludCByaW5nYnVmZmVyX3JlYWQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKKwkJICAgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuLAorCQkgICB1MzIgb2Zmc2V0KTsKIAotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbyk7Cit1MzIgZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKLXZvaWQgRHVtcFJpbmdJbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgY2hhciAqUHJlZml4KTsKK3ZvaWQgZHVtcF9yaW5nX2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgY2hhciAqcHJlZml4KTsKIAotdm9pZCBSaW5nQnVmZmVyR2V0RGVidWdJbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKK3ZvaWQgcmluZ2J1ZmZlcl9nZXRfZGVidWdpbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCQkgICAgc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gKmRlYnVnX2luZm8pOwogCiAjZW5kaWYgLyogX1JJTkdfQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCmluZGV4IDcyM2UxZjEuLjAxNGRlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCkBAIC0yODgsMjQgKzI4OCwyNCBAQAogI2RlZmluZSBSTkRJU19ERl9SQVdfREFUQQkJCTB4MDAwMDAwMDQKIAogLyogIFJlbW90ZSBORElTIG1lZGl1bSB0eXBlcy4gKi8KLSNkZWZpbmUgUk5kaXNNZWRpdW04MDJfMwkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgUk5kaXNNZWRpdW04MDJfNQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgUk5kaXNNZWRpdW1GZGRpCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUk5kaXNNZWRpdW1XYW4JCQkJMHgwMDAwMDAwMwotI2RlZmluZSBSTmRpc01lZGl1bUxvY2FsVGFsawkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgUk5kaXNNZWRpdW1BcmNuZXRSYXcJCQkweDAwMDAwMDA2Ci0jZGVmaW5lIFJOZGlzTWVkaXVtQXJjbmV0ODc4XzIJCQkweDAwMDAwMDA3Ci0jZGVmaW5lIFJOZGlzTWVkaXVtQXRtCQkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgUk5kaXNNZWRpdW1XaXJlbGVzc1dhbgkJCTB4MDAwMDAwMDkKLSNkZWZpbmUgUk5kaXNNZWRpdW1JcmRhCQkJCTB4MDAwMDAwMGEKLSNkZWZpbmUgUk5kaXNNZWRpdW1Db1dhbgkJCTB4MDAwMDAwMGIKKyNkZWZpbmUgUk5ESVNfTUVESVVNXzgwMl8zCQkJMHgwMDAwMDAwMAorI2RlZmluZSBSTkRJU19NRURJVU1fODAyXzUJCQkweDAwMDAwMDAxCisjZGVmaW5lIFJORElTX01FRElVTV9GRERJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUk5ESVNfTUVESVVNX1dBTgkJCQkweDAwMDAwMDAzCisjZGVmaW5lIFJORElTX01FRElVTV9MT0NBTF9UQUxLCQkJMHgwMDAwMDAwNAorI2RlZmluZSBSTkRJU19NRURJVU1fQVJDTkVUX1JBVwkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0FSQ05FVF84NzhfMgkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0FUTQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFJORElTX01FRElVTV9XSVJFTEVTU19XQU4JCQkweDAwMDAwMDA5CisjZGVmaW5lIFJORElTX01FRElVTV9JUkRBCQkJCTB4MDAwMDAwMGEKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0NPX1dBTgkJCTB4MDAwMDAwMGIKIC8qIE5vdCBhIHJlYWwgbWVkaXVtLCBkZWZpbmVkIGFzIGFuIHVwcGVyLWJvdW5kICovCi0jZGVmaW5lIFJOZGlzTWVkaXVtTWF4CQkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgUk5ESVNfTUVESVVNX01BWAkJCQkweDAwMDAwMDBkCiAKIAogLyogUmVtb3RlIE5ESVMgbWVkaXVtIGNvbm5lY3Rpb24gc3RhdGVzLiAqLwotI2RlZmluZSBSTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCTB4MDAwMDAwMDAKLSNkZWZpbmUgUk5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkweDAwMDAwMDAxCisjZGVmaW5lIFJORElTX01FRElBX1NUQVRFX0NPTk5FQ1RFRAkJMHgwMDAwMDAwMAorI2RlZmluZSBSTkRJU19NRURJQV9TVEFURV9ESVNDT05ORUNURUQJCTB4MDAwMDAwMDEKIAogLyogIFJlbW90ZSBORElTIHZlcnNpb24gbnVtYmVycyAqLwogI2RlZmluZSBSTkRJU19NQUpPUl9WRVJTSU9OCQkJMHgwMDAwMDAwMQpAQCAtMzE0LDEwNiArMzE0LDEwNiBAQAogCiAvKiBOZGlzSW5pdGlhbGl6ZSBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBNYWpvclZlcnNpb247Ci0JdTMyIE1pbm9yVmVyc2lvbjsKLQl1MzIgTWF4VHJhbnNmZXJTaXplOworCXUzMiByZXFfaWQ7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOworCXUzMiBtYXhfeGZlcl9zaXplOwogfTsKIAogLyogUmVzcG9uc2UgdG8gTmRpc0luaXRpYWxpemUgKi8KIHN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7Ci0JdTMyIE1ham9yVmVyc2lvbjsKLQl1MzIgTWlub3JWZXJzaW9uOwotCXUzMiBEZXZpY2VGbGFnczsKLQl1MzIgTWVkaXVtOwotCXUzMiBNYXhQYWNrZXRzUGVyTWVzc2FnZTsKLQl1MzIgTWF4VHJhbnNmZXJTaXplOwotCXUzMiBQYWNrZXRBbGlnbm1lbnRGYWN0b3I7Ci0JdTMyIEFGTGlzdE9mZnNldDsKLQl1MzIgQUZMaXN0U2l6ZTsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOworCXUzMiBkZXZfZmxhZ3M7CisJdTMyIG1lZGl1bTsKKwl1MzIgbWF4X3BrdF9wZXJfbXNnOworCXUzMiBtYXhfeGZlcl9zaXplOworCXUzMiBwa3RfYWxpZ25tZW50X2ZhY3RvcjsKKwl1MzIgYWZfbGlzdF9vZmZzZXQ7CisJdTMyIGFmX2xpc3Rfc2l6ZTsKIH07CiAKIC8qIENhbGwgbWFuYWdlciBkZXZpY2VzIG9ubHk6IEluZm9ybWF0aW9uIGFib3V0IGFuIGFkZHJlc3MgZmFtaWx5ICovCiAvKiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBpcyBhcHBlbmRlZCB0byB0aGUgcmVzcG9uc2UgdG8gTmRpc0luaXRpYWxpemUuICovCiBzdHJ1Y3Qgcm5kaXNfY29fYWRkcmVzc19mYW1pbHkgewotCXUzMiBBZGRyZXNzRmFtaWx5OwotCXUzMiBNYWpvclZlcnNpb247Ci0JdTMyIE1pbm9yVmVyc2lvbjsKKwl1MzIgYWRkcmVzc19mYW1pbHk7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOwogfTsKIAogLyogTmRpc0hhbHQgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX2hhbHRfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKKwl1MzIgcmVxX2lkOwogfTsKIAogLyogTmRpc1F1ZXJ5UmVxdWVzdCBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgT2lkOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7Ci0JdTMyIERldmljZVZjSGFuZGxlOworCXUzMiByZXFfaWQ7CisJdTMyIG9pZDsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNRdWVyeVJlcXVlc3QgKi8KIHN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgU3RhdHVzOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOworCXUzMiBpbmZvX2J1ZmxlbjsKKwl1MzIgaW5mb19idWZfb2Zmc2V0OwogfTsKIAogLyogTmRpc1NldFJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBPaWQ7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7CisJdTMyIHJlcV9pZDsKKwl1MzIgb2lkOworCXUzMiBpbmZvX2J1ZmxlbjsKKwl1MzIgaW5mb19idWZfb2Zmc2V0OworCXUzMiBkZXZfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gTmRpc1NldFJlcXVlc3QgKi8KIHN0cnVjdCBybmRpc19zZXRfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKiBOZGlzUmVzZXQgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX3Jlc2V0X3JlcXVlc3QgewotCXUzMiBSZXNlcnZlZDsKKwl1MzIgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBSZXNwb25zZSB0byBOZGlzUmVzZXQgKi8KIHN0cnVjdCBybmRpc19yZXNldF9jb21wbGV0ZSB7Ci0JdTMyIFN0YXR1czsKLQl1MzIgQWRkcmVzc2luZ1Jlc2V0OworCXUzMiBzdGF0dXM7CisJdTMyIGFkZHJlc3NpbmdfcmVzZXQ7CiB9OwogCiAvKiBOZGlzTUluZGljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KIHN0cnVjdCBybmRpc19pbmRpY2F0ZV9zdGF0dXMgewotCXUzMiBTdGF0dXM7Ci0JdTMyIFN0YXR1c0J1ZmZlckxlbmd0aDsKLQl1MzIgU3RhdHVzQnVmZmVyT2Zmc2V0OworCXUzMiBzdGF0dXM7CisJdTMyIHN0YXR1c19idWZsZW47CisJdTMyIHN0YXR1c19idWZfb2Zmc2V0OwogfTsKIAogLyogRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBwYXNzZWQgYXMgdGhlIHN0YXR1cyBidWZmZXIgaW4gKi8KIC8qIHN0cnVjdCBybmRpc19pbmRpY2F0ZV9zdGF0dXMgbWVzc2FnZXMgc2lnbmlmeWluZyBlcnJvciBjb25kaXRpb25zLiAqLwogc3RydWN0IHJuZGlzX2RpYWdub3N0aWNfaW5mbyB7Ci0JdTMyIERpYWdTdGF0dXM7Ci0JdTMyIEVycm9yT2Zmc2V0OworCXUzMiBkaWFnX3N0YXR1czsKKwl1MzIgZXJyb3Jfb2Zmc2V0OwogfTsKIAogLyogTmRpc0tlZXBBbGl2ZSBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7CisJdTMyIHJlcV9pZDsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNLZWVwQWxpdmUgKi8KIHN0cnVjdCBybmRpc19rZWVwYWxpdmVfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKgpAQCAtNDIyLDM5ICs0MjIsMzkgQEAKICAqIHRvIDAgZm9yIGNvbm5lY3Rpb25sZXNzIGRhdGEsIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgVkMgaGFuZGxlLgogICovCiBzdHJ1Y3Qgcm5kaXNfcGFja2V0IHsKLQl1MzIgRGF0YU9mZnNldDsKLQl1MzIgRGF0YUxlbmd0aDsKLQl1MzIgT09CRGF0YU9mZnNldDsKLQl1MzIgT09CRGF0YUxlbmd0aDsKLQl1MzIgTnVtT09CRGF0YUVsZW1lbnRzOwotCXUzMiBQZXJQYWNrZXRJbmZvT2Zmc2V0OwotCXUzMiBQZXJQYWNrZXRJbmZvTGVuZ3RoOwotCXUzMiBWY0hhbmRsZTsKLQl1MzIgUmVzZXJ2ZWQ7CisJdTMyIGRhdGFfb2Zmc2V0OworCXUzMiBkYXRhX2xlbjsKKwl1MzIgb29iX2RhdGFfb2Zmc2V0OworCXUzMiBvb2JfZGF0YV9sZW47CisJdTMyIG51bV9vb2JfZGF0YV9lbGVtZW50czsKKwl1MzIgcGVyX3BrdF9pbmZvX29mZnNldDsKKwl1MzIgcGVyX3BrdF9pbmZvX2xlbjsKKwl1MzIgdmNfaGFuZGxlOworCXUzMiByZXNlcnZlZDsKIH07CiAKIC8qIE9wdGlvbmFsIE91dCBvZiBCYW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgRGF0YSBtZXNzYWdlLiAqLwogc3RydWN0IHJuZGlzX29vYmQgewotCXUzMiBTaXplOwotCXUzMiBUeXBlOwotCXUzMiBDbGFzc0luZm9ybWF0aW9uT2Zmc2V0OworCXUzMiBzaXplOworCXUzMiB0eXBlOworCXUzMiBjbGFzc19pbmZvX29mZnNldDsKIH07CiAKIC8qIFBhY2tldCBleHRlbnNpb24gZmllbGQgY29udGVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRGF0YSBtZXNzYWdlLiAqLwogc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbyB7Ci0JdTMyIFNpemU7Ci0JdTMyIFR5cGU7Ci0JdTMyIFBlclBhY2tldEluZm9ybWF0aW9uT2Zmc2V0OworCXUzMiBzaXplOworCXUzMiB0eXBlOworCXUzMiBwZXJfcGt0X2luZm9fb2Zmc2V0OwogfTsKIAogLyogRm9ybWF0IG9mIEluZm9ybWF0aW9uIGJ1ZmZlciBwYXNzZWQgaW4gYSBTZXRSZXF1ZXN0IGZvciB0aGUgT0lEICovCiAvKiBPSURfR0VOX1JORElTX0NPTkZJR19QQVJBTUVURVIuICovCiBzdHJ1Y3Qgcm5kaXNfY29uZmlnX3BhcmFtZXRlcl9pbmZvIHsKLQl1MzIgUGFyYW1ldGVyTmFtZU9mZnNldDsKLQl1MzIgUGFyYW1ldGVyTmFtZUxlbmd0aDsKLQl1MzIgUGFyYW1ldGVyVHlwZTsKLQl1MzIgUGFyYW1ldGVyVmFsdWVPZmZzZXQ7Ci0JdTMyIFBhcmFtZXRlclZhbHVlTGVuZ3RoOworCXUzMiBwYXJhbWV0ZXJfbmFtZV9vZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl9uYW1lX2xlbmd0aDsKKwl1MzIgcGFyYW1ldGVyX3R5cGU7CisJdTMyIHBhcmFtZXRlcl92YWx1ZV9vZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl92YWx1ZV9sZW5ndGg7CiB9OwogCiAvKiBWYWx1ZXMgZm9yIFBhcmFtZXRlclR5cGUgaW4gc3RydWN0IHJuZGlzX2NvbmZpZ19wYXJhbWV0ZXJfaW5mbyAqLwpAQCAtNDY2LDE4NyArNDY2LDE4OCBAQAogCiAvKiBDb05kaXNNaW5pcG9ydENyZWF0ZVZjIG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92YyB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgTmRpc1ZjSGFuZGxlOworCXUzMiByZXFfaWQ7CisJdTMyIG5kaXNfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gQ29OZGlzTWluaXBvcnRDcmVhdGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKLQl1MzIgU3RhdHVzOworCXUzMiByZXFfaWQ7CisJdTMyIGRldl92Y19oYW5kbGU7CisJdTMyIHN0YXR1czsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0RGVsZXRlVmMgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBkZXZfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gQ29OZGlzTWluaXBvcnREZWxldGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogLyogQ29OZGlzTWluaXBvcnRRdWVyeVJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfcXVlcnlfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgUmVxdWVzdFR5cGU7Ci0JdTMyIE9pZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKKwl1MzIgcmVxX2lkOworCXUzMiByZXF1ZXN0X3R5cGU7CisJdTMyIG9pZDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0U2V0UmVxdWVzdCBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9zZXRfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgUmVxdWVzdFR5cGU7Ci0JdTMyIE9pZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKKwl1MzIgcmVxX2lkOworCXUzMiByZXF1ZXN0X3R5cGU7CisJdTMyIG9pZDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKIH07CiAKIC8qIENvTmRpc0luZGljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX2luZGljYXRlX3N0YXR1cyB7Ci0JdTMyIE5kaXNWY0hhbmRsZTsKLQl1MzIgU3RhdHVzOwotCXUzMiBTdGF0dXNCdWZmZXJMZW5ndGg7Ci0JdTMyIFN0YXR1c0J1ZmZlck9mZnNldDsKKwl1MzIgbmRpc192Y19oYW5kbGU7CisJdTMyIHN0YXR1czsKKwl1MzIgc3RhdHVzX2J1ZmxlbjsKKwl1MzIgc3RhdHVzX2J1Zl9vZmZzZXQ7CiB9OwogCiAvKiBDT05ESVMgQ2FsbC9WQyBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIHsKLQl1MzIgUGFyYW1ldGVyVHlwZTsKLQl1MzIgUGFyYW1ldGVyTGVuZ3RoOwotCXUzMiBQYXJhbWV0ZXJPZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl90eXBlOworCXUzMiBwYXJhbWV0ZXJfbGVuZ3RoOworCXUzMiBwYXJhbWV0ZXJfbGZmc2V0OwogfTsKIAogc3RydWN0IHJjb25kaXNfbWVkaWFfcGFyYW1ldGVycyB7Ci0JdTMyIEZsYWdzOwotCXUzMiBSZXNlcnZlZDE7Ci0JdTMyIFJlc2VydmVkMjsKLQlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIE1lZGlhU3BlY2lmaWM7CisJdTMyIGZsYWdzOworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKKwlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIG1lZGlhX3NwZWNpZmljOwogfTsKIAogc3RydWN0IHJuZGlzX2Zsb3dzcGVjIHsKLQl1MzIgVG9rZW5SYXRlOwotCXUzMiBUb2tlbkJ1Y2tldFNpemU7Ci0JdTMyIFBlYWtCYW5kd2lkdGg7Ci0JdTMyIExhdGVuY3k7Ci0JdTMyIERlbGF5VmFyaWF0aW9uOwotCXUzMiBTZXJ2aWNlVHlwZTsKLQl1MzIgTWF4U2R1U2l6ZTsKLQl1MzIgTWluaW11bVBvbGljZWRTaXplOworCXUzMiB0b2tlbl9yYXRlOworCXUzMiB0b2tlbl9idWNrZXRfc2l6ZTsKKwl1MzIgcGVha19iYW5kd2lkdGg7CisJdTMyIGxhdGVuY3k7CisJdTMyIGRlbGF5X3ZhcmlhdGlvbjsKKwl1MzIgc2VydmljZV90eXBlOworCXUzMiBtYXhfc2R1X3NpemU7CisJdTMyIG1pbmltdW1fcG9saWNlZF9zaXplOwogfTsKIAogc3RydWN0IHJjb25kaXNfY2FsbF9tYW5hZ2VyX3BhcmFtZXRlcnMgewotCXN0cnVjdCBybmRpc19mbG93c3BlYyBUcmFuc21pdDsKLQlzdHJ1Y3Qgcm5kaXNfZmxvd3NwZWMgUmVjZWl2ZTsKLQlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIENhbGxNZ3JTcGVjaWZpYzsKKwlzdHJ1Y3Qgcm5kaXNfZmxvd3NwZWMgdHJhbnNtaXQ7CisJc3RydWN0IHJuZGlzX2Zsb3dzcGVjIHJlY2VpdmU7CisJc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyBjYWxsX21ncl9zcGVjaWZpYzsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0QWN0aXZhdGVWYyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBGbGFnczsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIE1lZGlhUGFyYW1zT2Zmc2V0OwotCXUzMiBNZWRpYVBhcmFtc0xlbmd0aDsKLQl1MzIgQ2FsbE1nclBhcmFtc09mZnNldDsKLQl1MzIgQ2FsbE1nclBhcmFtc0xlbmd0aDsKKwl1MzIgcmVxX2lkOworCXUzMiBmbGFnczsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgbWVkaWFfcGFyYW1zX29mZnNldDsKKwl1MzIgbWVkaWFfcGFyYW1zX2xlbmd0aDsKKwl1MzIgY2FsbF9tZ3JfcGFyYW1zX29mZnNldDsKKwl1MzIgY2FsbF9tZ3JfcGFyYW1zX2xlbmd0aDsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0QWN0aXZhdGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfYWN0aXZhdGVfdmNfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKiBDb05kaXNNaW5pcG9ydERlYWN0aXZhdGVWYyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIEZsYWdzOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBmbGFnczsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0RGVhY3RpdmF0ZVZjICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogCiAvKiB1bmlvbiB3aXRoIGFsbCBvZiB0aGUgUk5ESVMgbWVzc2FnZXMgKi8KIHVuaW9uIHJuZGlzX21lc3NhZ2VfY29udGFpbmVyIHsKLQlzdHJ1Y3Qgcm5kaXNfcGFja2V0IFBhY2tldDsKLQlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0IEluaXRpYWxpemVSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgSGFsdFJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QgUXVlcnlSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCBTZXRSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19yZXNldF9yZXF1ZXN0IFJlc2V0UmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX3JlcXVlc3QgS2VlcGFsaXZlUmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIEluZGljYXRlU3RhdHVzOwotCXN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlIEluaXRpYWxpemVDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgUXVlcnlDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlIFNldENvbXBsZXRlOwotCXN0cnVjdCBybmRpc19yZXNldF9jb21wbGV0ZSBSZXNldENvbXBsZXRlOwotCXN0cnVjdCBybmRpc19rZWVwYWxpdmVfY29tcGxldGUgS2VlcGFsaXZlQ29tcGxldGU7Ci0Jc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjIENvTWluaXBvcnRDcmVhdGVWYzsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9kZWxldGVfdmMgQ29NaW5pcG9ydERlbGV0ZVZjOwotCXN0cnVjdCByY29uZGlzX2luZGljYXRlX3N0YXR1cyBDb0luZGljYXRlU3RhdHVzOwotCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX3JlcXVlc3QgQ29NaW5pcG9ydEFjdGl2YXRlVmM7Ci0Jc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19yZXF1ZXN0IENvTWluaXBvcnREZWFjdGl2YXRlVmM7Ci0Jc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIENvTWluaXBvcnRDcmVhdGVWY0NvbXBsZXRlOwotCXN0cnVjdCByY29uZGlzX21wX2RlbGV0ZV92Y19jb21wbGV0ZSBDb01pbmlwb3J0RGVsZXRlVmNDb21wbGV0ZTsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19jb21wbGV0ZSBDb01pbmlwb3J0QWN0aXZhdGVWY0NvbXBsZXRlOwotCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfY29tcGxldGUgQ29NaW5pcG9ydERlYWN0aXZhdGVWY0NvbXBsZXRlOworCXN0cnVjdCBybmRpc19wYWNrZXQgcGt0OworCXN0cnVjdCBybmRpc19pbml0aWFsaXplX3JlcXVlc3QgaW5pdF9yZXE7CisJc3RydWN0IHJuZGlzX2hhbHRfcmVxdWVzdCBoYWx0X3JlcTsKKwlzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCBxdWVyeV9yZXE7CisJc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0IHNldF9yZXE7CisJc3RydWN0IHJuZGlzX3Jlc2V0X3JlcXVlc3QgcmVzZXRfcmVxOworCXN0cnVjdCBybmRpc19rZWVwYWxpdmVfcmVxdWVzdCBrZWVwX2FsaXZlX3JlcTsKKwlzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIGluZGljYXRlX3N0YXR1czsKKwlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9jb21wbGV0ZSBpbml0X2NvbXBsZXRlOworCXN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSBxdWVyeV9jb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlIHNldF9jb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfcmVzZXRfY29tcGxldGUgcmVzZXRfY29tcGxldGU7CisJc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jb21wbGV0ZSBrZWVwX2FsaXZlX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92YyBjb19taW5pcG9ydF9jcmVhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjIGNvX21pbmlwb3J0X2RlbGV0ZV92YzsKKwlzdHJ1Y3QgcmNvbmRpc19pbmRpY2F0ZV9zdGF0dXMgY29faW5kaWNhdGVfc3RhdHVzOworCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX3JlcXVlc3QgY29fbWluaXBvcnRfYWN0aXZhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19yZXF1ZXN0IGNvX21pbmlwb3J0X2RlYWN0aXZhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIGNvX21pbmlwb3J0X2NyZWF0ZV92Y19jb21wbGV0ZTsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9kZWxldGVfdmNfY29tcGxldGUgY29fbWluaXBvcnRfZGVsZXRlX3ZjX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX2NvbXBsZXRlIGNvX21pbmlwb3J0X2FjdGl2YXRlX3ZjX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfY29tcGxldGUKKwkJY29fbWluaXBvcnRfZGVhY3RpdmF0ZV92Y19jb21wbGV0ZTsKIH07CiAKIC8qIFJlbW90ZSBORElTIG1lc3NhZ2UgZm9ybWF0ICovCiBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSB7Ci0JdTMyIE5kaXNNZXNzYWdlVHlwZTsKKwl1MzIgbmRpc19tc2dfdHlwZTsKIAogCS8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIG1lc3NhZ2UsIGZyb20gdGhlIGJlZ2lubmluZyAqLwogCS8qIG9mIHRoZSBzcnVjdCBybmRpc19tZXNzYWdlLCBpbiBieXRlcy4gKi8KLQl1MzIgTWVzc2FnZUxlbmd0aDsKKwl1MzIgbXNnX2xlbjsKIAogCS8qIEFjdHVhbCBtZXNzYWdlICovCi0JdW5pb24gcm5kaXNfbWVzc2FnZV9jb250YWluZXIgTWVzc2FnZTsKKwl1bmlvbiBybmRpc19tZXNzYWdlX2NvbnRhaW5lciBtc2c7CiB9OwogCiAvKiBIYW5keSBtYWNyb3MgKi8KIAogLyogZ2V0IHRoZSBzaXplIG9mIGFuIFJORElTIG1lc3NhZ2UuIFBhc3MgaW4gdGhlIG1lc3NhZ2UgdHlwZSwgKi8KIC8qIHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCwgc3RydWN0IHJuZGlzX3BhY2tldCBmb3IgZXhhbXBsZSAqLwotI2RlZmluZSBSTkRJU19NRVNTQUdFX1NJWkUoTWVzc2FnZSkJCQkJXAotCShzaXplb2YoTWVzc2FnZSkgKyAoc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSAtCVwKKyNkZWZpbmUgUk5ESVNfTUVTU0FHRV9TSVpFKG1zZykJCQkJXAorCShzaXplb2YobXNnKSArIChzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpIC0JXAogCSBzaXplb2YodW5pb24gcm5kaXNfbWVzc2FnZV9jb250YWluZXIpKSkKIAogLyogZ2V0IHBvaW50ZXIgdG8gaW5mbyBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19JTkZPX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCkKKyNkZWZpbmUgTUVTU0FHRV9UT19JTkZPX0JVRkZFUihtc2cpCQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5pbmZvX2J1Zl9vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIHN0YXR1cyBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19TVEFUVVNfQlVGRkVSKE1lc3NhZ2UpCQkJXAotCSgoKHVuc2lnbmVkIGNoYXIgKikoTWVzc2FnZSkpICsgTWVzc2FnZS0+U3RhdHVzQnVmZmVyT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX1NUQVRVU19CVUZGRVIobXNnKQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5zdGF0dXNfYnVmX29mZnNldCkKIAogLyogZ2V0IHBvaW50ZXIgdG8gT09CRCBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19PT0JEX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5PT0JEYXRhT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX09PQkRfQlVGRkVSKG1zZykJCQkJXAorCSgoKHVuc2lnbmVkIGNoYXIgKikobXNnKSkgKyBtc2ctPm9vYl9kYXRhX29mZnNldCkKIAogLyogZ2V0IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19EQVRBX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5QZXJQYWNrZXRJbmZvT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX0RBVEFfQlVGRkVSKG1zZykJCQkJXAorCSgoKHVuc2lnbmVkIGNoYXIgKikobXNnKSkgKyBtc2ctPnBlcl9wa3RfaW5mb19vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIGNvbnRhaW5lZCBtZXNzYWdlIGZyb20gTkRJU19NRVNTQUdFIHBvaW50ZXIgKi8KLSNkZWZpbmUgUk5ESVNfTUVTU0FHRV9QVFJfVE9fTUVTU0FHRV9QVFIoUm5kaXNNZXNzYWdlKQkJXAotCSgodm9pZCAqKSAmUm5kaXNNZXNzYWdlLT5NZXNzYWdlKQorI2RlZmluZSBSTkRJU19NRVNTQUdFX1BUUl9UT19NRVNTQUdFX1BUUihybmRpc19tc2cpCQlcCisJKCh2b2lkICopICZybmRpc19tc2ctPm1zZykKIAogLyogZ2V0IHBvaW50ZXIgdG8gY29udGFpbmVkIG1lc3NhZ2UgZnJvbSBORElTX01FU1NBR0UgcG9pbnRlciAqLwotI2RlZmluZSBSTkRJU19NRVNTQUdFX1JBV19QVFJfVE9fTUVTU0FHRV9QVFIoUm5kaXNNZXNzYWdlKQlcCi0JKCh2b2lkICopIFJuZGlzTWVzc2FnZSkKKyNkZWZpbmUgUk5ESVNfTUVTU0FHRV9SQVdfUFRSX1RPX01FU1NBR0VfUFRSKHJuZGlzX21zZykJXAorCSgodm9pZCAqKSBybmRpc19tc2cpCiAKICNlbmRpZiAvKiBfUk5ESVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYwppbmRleCBmYTIxNDFmLi41MzY3NmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCkBAIC0zMiw3ICszMiw3IEBACiAvKiBEYXRhIHR5cGVzICovCiBzdHJ1Y3Qgcm5kaXNfZmlsdGVyX2RyaXZlcl9vYmplY3QgewogCS8qIFRoZSBvcmlnaW5hbCBkcml2ZXIgKi8KLQlzdHJ1Y3QgbmV0dnNjX2RyaXZlciBJbm5lckRyaXZlcjsKKwlzdHJ1Y3QgbmV0dnNjX2RyaXZlciBpbm5lcl9kcnY7CiB9OwogCiBlbnVtIHJuZGlzX2RldmljZV9zdGF0ZSB7CkBAIC00Myw2MyArNDMsNjMgQEAKIH07CiAKIHN0cnVjdCBybmRpc19kZXZpY2UgewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXY7CiAKLQllbnVtIHJuZGlzX2RldmljZV9zdGF0ZSBTdGF0ZTsKLQl1MzIgTGlua1N0YXR1czsKLQlhdG9taWNfdCBOZXdSZXF1ZXN0SWQ7CisJZW51bSBybmRpc19kZXZpY2Vfc3RhdGUgc3RhdGU7CisJdTMyIGxpbmtfc3RhdDsKKwlhdG9taWNfdCBuZXdfcmVxX2lkOwogCiAJc3BpbmxvY2tfdCByZXF1ZXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBSZXF1ZXN0TGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcV9saXN0OwogCi0JdW5zaWduZWQgY2hhciBId01hY0FkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgaHdfbWFjX2FkcltFVEhfQUxFTl07CiB9OwogCiBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBMaXN0RW50cnk7Ci0Jc3RydWN0IG9zZF93YWl0ZXZlbnQgKldhaXRFdmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50OworCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ZXZlbnQ7CiAKIAkvKgogCSAqIEZJWE1FOiBXZSBhc3N1bWVkIGEgZml4ZWQgc2l6ZSByZXNwb25zZSBoZXJlLiBJZiB3ZSBkbyBldmVyIG5lZWQgdG8KIAkgKiBoYW5kbGUgYSBiaWdnZXIgcmVzcG9uc2UsIHdlIGNhbiBlaXRoZXIgZGVmaW5lIGEgbWF4IHJlc3BvbnNlCiAJICogbWVzc2FnZSBvciBhZGQgYSByZXNwb25zZSBidWZmZXIgdmFyaWFibGUgYWJvdmUgdGhpcyBmaWVsZAogCSAqLwotCXN0cnVjdCBybmRpc19tZXNzYWdlIFJlc3BvbnNlTWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSByZXNwb25zZV9tc2c7CiAKIAkvKiBTaW1wbGlmeSBhbGxvY2F0aW9uIGJ5IGhhdmluZyBhIG5ldHZzYyBwYWNrZXQgaW5saW5lICovCi0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQJUGFja2V0OwotCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBCdWZmZXI7CisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQJcGt0OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBidWY7CiAJLyogRklYTUU6IFdlIGFzc3VtZWQgYSBmaXhlZCBzaXplIHJlcXVlc3QgaGVyZS4gKi8KLQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBSZXF1ZXN0TWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSByZXF1ZXN0X21zZzsKIH07CiAKIAogc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgewotCXZvaWQgKkNvbXBsZXRpb25Db250ZXh0OwotCXZvaWQgKCpPbkNvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOwotCXN0cnVjdCBybmRpc19tZXNzYWdlIE1lc3NhZ2U7CisJdm9pZCAqY29tcGxldGlvbl9jdHg7CisJdm9pZCAoKmNvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOworCXN0cnVjdCBybmRpc19tZXNzYWdlIG1zZzsKIH07CiAKIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkgIHZvaWQgKkFkZGl0aW9uYWxJbmZvKTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJICB2b2lkICphZGRpdGlvbmFsX2luZm8pOwogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKTsKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydik7CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqUGFja2V0KTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3NlbmQoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGt0KTsKIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPblNlbmRDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX3NlbmRfY29tcGxldGlvbih2b2lkICpjdHgpOwogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdF9jb21wbGV0aW9uKHZvaWQgKmN0eCk7CiAKIAogLyogVGhlIG9uZSBhbmQgb25seSAqLwotc3RhdGljIHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCBnUm5kaXNGaWx0ZXI7CitzdGF0aWMgc3RydWN0IHJuZGlzX2ZpbHRlcl9kcml2ZXJfb2JqZWN0IHJuZGlzX2ZpbHRlcjsKIAotc3RhdGljIHN0cnVjdCBybmRpc19kZXZpY2UgKkdldFJuZGlzRGV2aWNlKHZvaWQpCitzdGF0aWMgc3RydWN0IHJuZGlzX2RldmljZSAqZ2V0X3JuZGlzX2RldmljZSh2b2lkKQogewogCXN0cnVjdCBybmRpc19kZXZpY2UgKmRldmljZTsKIApAQCAtMTA5LDE5ICsxMDksMTkgQEAKIAogCXNwaW5fbG9ja19pbml0KCZkZXZpY2UtPnJlcXVlc3RfbG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5SZXF1ZXN0TGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVxX2xpc3QpOwogCi0JZGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOworCWRldmljZS0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKIAogCXJldHVybiBkZXZpY2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqR2V0Um5kaXNSZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwKLQkJCQkJICAgICB1MzIgTWVzc2FnZVR5cGUsCi0JCQkJCSAgICAgdTMyIE1lc3NhZ2VMZW5ndGgpCitzdGF0aWMgc3RydWN0IHJuZGlzX3JlcXVlc3QgKmdldF9ybmRpc19yZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCQkJICAgICB1MzIgbXNnX3R5cGUsCisJCQkJCSAgICAgdTMyIG1zZ19sZW4pCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzTWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwogCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCAqc2V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyOSw2MSArMTI5LDYxIEBACiAJaWYgKCFyZXF1ZXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFyZXF1ZXN0LT53YWl0ZXZlbnQpIHsKIAkJa2ZyZWUocmVxdWVzdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXJuZGlzTWVzc2FnZSA9ICZyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZTsKLQlybmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSA9IE1lc3NhZ2VUeXBlOwotCXJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCA9IE1lc3NhZ2VMZW5ndGg7CisJcm5kaXNfbXNnID0gJnJlcXVlc3QtPnJlcXVlc3RfbXNnOworCXJuZGlzX21zZy0+bmRpc19tc2dfdHlwZSA9IG1zZ190eXBlOworCXJuZGlzX21zZy0+bXNnX2xlbiA9IG1zZ19sZW47CiAKIAkvKgogCSAqIFNldCB0aGUgcmVxdWVzdCBpZC4gVGhpcyBmaWVsZCBpcyBhbHdheXMgYWZ0ZXIgdGhlIHJuZGlzIGhlYWRlciBmb3IKIAkgKiByZXF1ZXN0L3Jlc3BvbnNlIHBhY2tldCB0eXBlcyBzbyB3ZSBqdXN0IHVzZWQgdGhlIFNldFJlcXVlc3QgYXMgYQogCSAqIHRlbXBsYXRlCiAJICovCi0Jc2V0ID0gJnJuZGlzTWVzc2FnZS0+TWVzc2FnZS5TZXRSZXF1ZXN0OwotCXNldC0+UmVxdWVzdElkID0gYXRvbWljX2luY19yZXR1cm4oJkRldmljZS0+TmV3UmVxdWVzdElkKTsKKwlzZXQgPSAmcm5kaXNfbXNnLT5tc2cuc2V0X3JlcTsKKwlzZXQtPnJlcV9pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZkZXYtPm5ld19yZXFfaWQpOwogCiAJLyogQWRkIHRvIHRoZSByZXF1ZXN0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5MaXN0RW50cnksICZEZXZpY2UtPlJlcXVlc3RMaXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnJlcXVlc3QtPmxpc3RfZW50LCAmZGV2LT5yZXFfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXF1ZXN0OwogfQogCi1zdGF0aWMgdm9pZCBQdXRSbmRpc1JlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCBybmRpc19yZXF1ZXN0ICpSZXF1ZXN0KQorc3RhdGljIHZvaWQgcHV0X3JuZGlzX3JlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZSZXF1ZXN0LT5MaXN0RW50cnkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnJlcS0+bGlzdF9lbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CiAKLQlrZnJlZShSZXF1ZXN0LT5XYWl0RXZlbnQpOwotCWtmcmVlKFJlcXVlc3QpOworCWtmcmVlKHJlcS0+d2FpdGV2ZW50KTsKKwlrZnJlZShyZXEpOwogfQogCi1zdGF0aWMgdm9pZCBEdW1wUm5kaXNNZXNzYWdlKHN0cnVjdCBybmRpc19tZXNzYWdlICpSbmRpc01lc3NhZ2UpCitzdGF0aWMgdm9pZCBkdW1wX3JuZGlzX21lc3NhZ2Uoc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZykKIHsKLQlzd2l0Y2ggKFJuZGlzTWVzc2FnZS0+TmRpc01lc3NhZ2VUeXBlKSB7CisJc3dpdGNoIChybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUpIHsKIAljYXNlIFJFTU9URV9ORElTX1BBQ0tFVF9NU0c6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfUEFDS0VUX01TRyAobGVuICV1LCAiCiAJCQkgICAiZGF0YSBvZmZzZXQgJXUgZGF0YSBsZW4gJXUsICMgb29iICV1LCAiCiAJCQkgICAib29iIG9mZnNldCAldSwgb29iIGxlbiAldSwgcGt0IG9mZnNldCAldSwgIgogCQkJICAgInBrdCBsZW4gJXUiLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5EYXRhT2Zmc2V0LAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5EYXRhTGVuZ3RoLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5OdW1PT0JEYXRhRWxlbWVudHMsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0Lk9PQkRhdGFPZmZzZXQsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0Lk9PQkRhdGFMZW5ndGgsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0LlBlclBhY2tldEluZm9PZmZzZXQsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0LlBlclBhY2tldEluZm9MZW5ndGgpOworCQkJICAgcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LmRhdGFfb2Zmc2V0LAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LmRhdGFfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0Lm51bV9vb2JfZGF0YV9lbGVtZW50cywKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5vb2JfZGF0YV9vZmZzZXQsCisJCQkgICBybmRpc19tc2ctPm1zZy5wa3Qub29iX2RhdGFfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LnBlcl9wa3RfaW5mb19vZmZzZXQsCisJCQkgICBybmRpc19tc2ctPm1zZy5wa3QucGVyX3BrdF9pbmZvX2xlbik7CiAJCWJyZWFrOwogCiAJY2FzZSBSRU1PVEVfTkRJU19JTklUSUFMSVpFX0NNUExUOgpAQCAtMTkxLDE0NyArMTkxLDE1NyBAQAogCQkJIihsZW4gJXUsIGlkIDB4JXgsIHN0YXR1cyAweCV4LCBtYWpvciAlZCwgbWlub3IgJWQsICIKIAkJCSJkZXZpY2UgZmxhZ3MgJWQsIG1heCB4ZmVyIHNpemUgMHgleCwgbWF4IHBrdHMgJXUsICIKIAkJCSJwa3QgYWxpZ25lZCAldSkiLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLlN0YXR1cywKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuTWFqb3JWZXJzaW9uLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5NaW5vclZlcnNpb24sCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLkRldmljZUZsYWdzLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5NYXhUcmFuc2ZlclNpemUsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLk1heFBhY2tldHNQZXJNZXNzYWdlLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5QYWNrZXRBbGlnbm1lbnRGYWN0b3IpOworCQkJcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLnN0YXR1cywKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUubWFqb3JfdmVyLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5taW5vcl92ZXIsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLmRldl9mbGFncywKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUubWF4X3hmZXJfc2l6ZSwKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUuCisJCQkgICBtYXhfcGt0X3Blcl9tc2csCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLgorCQkJICAgcGt0X2FsaWdubWVudF9mYWN0b3IpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfUVVFUllfQ01QTFQ6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfUVVFUllfQ01QTFQgIgogCQkJIihsZW4gJXUsIGlkIDB4JXgsIHN0YXR1cyAweCV4LCBidWYgbGVuICV1LCAiCiAJCQkiYnVmIG9mZnNldCAldSkiLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuUmVxdWVzdElkLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuU3RhdHVzLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUXVlcnlDb21wbGV0ZS5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCk7CisJCQlybmRpc19tc2ctPm1zZ19sZW4sCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS5zdGF0dXMsCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS4KKwkJCSAgIGluZm9fYnVmbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cucXVlcnlfY29tcGxldGUuCisJCQkgICBpbmZvX2J1Zl9vZmZzZXQpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfU0VUX0NNUExUOgogCQlEUFJJTlRfREJHKE5FVFZTQywKIAkJCSJSRU1PVEVfTkRJU19TRVRfQ01QTFQgKGxlbiAldSwgaWQgMHgleCwgc3RhdHVzIDB4JXgpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5TZXRDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuU2V0Q29tcGxldGUuU3RhdHVzKTsKKwkJCXJuZGlzX21zZy0+bXNnX2xlbiwKKwkJCXJuZGlzX21zZy0+bXNnLnNldF9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5zZXRfY29tcGxldGUuc3RhdHVzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX0lORElDQVRFX1NUQVRVU19NU0c6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfSU5ESUNBVEVfU1RBVFVTX01TRyAiCiAJCQkiKGxlbiAldSwgc3RhdHVzIDB4JXgsIGJ1ZiBsZW4gJXUsIGJ1ZiBvZmZzZXQgJXUpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5JbmRpY2F0ZVN0YXR1cy5TdGF0dXMsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5kaWNhdGVTdGF0dXMuU3RhdHVzQnVmZmVyTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluZGljYXRlU3RhdHVzLlN0YXR1c0J1ZmZlck9mZnNldCk7CisJCQlybmRpc19tc2ctPm1zZ19sZW4sCisJCQlybmRpc19tc2ctPm1zZy5pbmRpY2F0ZV9zdGF0dXMuc3RhdHVzLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5kaWNhdGVfc3RhdHVzLnN0YXR1c19idWZsZW4sCisJCQlybmRpc19tc2ctPm1zZy5pbmRpY2F0ZV9zdGF0dXMuc3RhdHVzX2J1Zl9vZmZzZXQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiMHgleCAobGVuICV1KSIsCi0JCQlSbmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCk7CisJCQlybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUsCisJCQlybmRpc19tc2ctPm1zZ19sZW4pOwogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJTZW5kUmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqUmVxdWVzdCkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxKQogewogCWludCByZXQ7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldDsKIAogCS8qIFNldHVwIHRoZSBwYWNrZXQgdG8gc2VuZCBpdCAqLwotCXBhY2tldCA9ICZSZXF1ZXN0LT5QYWNrZXQ7CisJcGFja2V0ID0gJnJlcS0+cGt0OwogCi0JcGFja2V0LT5Jc0RhdGFQYWNrZXQgPSBmYWxzZTsKLQlwYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCA9IFJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2VMZW5ndGg7Ci0JcGFja2V0LT5QYWdlQnVmZmVyQ291bnQgPSAxOworCXBhY2tldC0+aXNfZGF0YV9wa3QgPSBmYWxzZTsKKwlwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0gcmVxLT5yZXF1ZXN0X21zZy5tc2dfbGVuOworCXBhY2tldC0+cGFnZV9idWZfY250ID0gMTsKIAotCXBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuID0gdmlydF90b19waHlzKCZSZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZSkgPj4KKwlwYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiA9IHZpcnRfdG9fcGh5cygmcmVxLT5yZXF1ZXN0X21zZykgPj4KIAkJCQkJUEFHRV9TSElGVDsKLQlwYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9IFJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2VMZW5ndGg7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQotCQkodW5zaWduZWQgbG9uZykmUmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UgJiAoUEFHRV9TSVpFIC0gMSk7CisJcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGggPSByZXEtPnJlcXVlc3RfbXNnLm1zZ19sZW47CisJcGFja2V0LT5wYWdlX2J1ZlswXS5PZmZzZXQgPQorCQkodW5zaWduZWQgbG9uZykmcmVxLT5yZXF1ZXN0X21zZyAmIChQQUdFX1NJWkUgLSAxKTsKIAotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dCA9IFJlcXVlc3Q7LyogcGFja2V0OyAqLwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLk9uU2VuZENvbXBsZXRpb24gPQotCQlSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uOwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uVGlkID0gKHVuc2lnbmVkIGxvbmcpRGV2aWNlOworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHggPSByZXE7LyogcGFja2V0OyAqLworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9CisJCXJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3RfY29tcGxldGlvbjsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpZGV2OwogCi0JcmV0ID0gZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uU2VuZChEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLCBwYWNrZXQpOworCXJldCA9IHJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuc2VuZChkZXYtPm5ldF9kZXYtPmRldiwgcGFja2V0KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlclJlY2VpdmVSZXNwb25zZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpSZXNwb25zZSkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX3Jlc3BvbnNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJlc3ApCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZXF1ZXN0LCAmRGV2aWNlLT5SZXF1ZXN0TGlzdCwgTGlzdEVudHJ5KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXF1ZXN0LCAmZGV2LT5yZXFfbGlzdCwgbGlzdF9lbnQpIHsKIAkJLyoKIAkJICogQWxsIHJlcXVlc3QvcmVzcG9uc2UgbWVzc2FnZSBjb250YWlucyBSZXF1ZXN0SWQgYXMgdGhlIDFzdAogCQkgKiBmaWVsZAogCQkgKi8KLQkJaWYgKHJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZVJlcXVlc3QuUmVxdWVzdElkCi0JCSAgICA9PSBSZXNwb25zZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUmVxdWVzdElkKSB7CisJCWlmIChyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuaW5pdF9yZXEucmVxX2lkCisJCSAgICA9PSByZXNwLT5tc2cuaW5pdF9jb21wbGV0ZS5yZXFfaWQpIHsKIAkJCURQUklOVF9EQkcoTkVUVlNDLCAiZm91bmQgcm5kaXMgcmVxdWVzdCBmb3IgIgogCQkJCSJ0aGlzIHJlc3BvbnNlIChpZCAweCV4IHJlcSB0eXBlIDB4JXggcmVzICIKIAkJCQkidHlwZSAweCV4KSIsCi0JCQkJcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplUmVxdWVzdC5SZXF1ZXN0SWQsCi0JCQkJcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTmRpc01lc3NhZ2VUeXBlLAotCQkJCVJlc3BvbnNlLT5OZGlzTWVzc2FnZVR5cGUpOworCQkJCXJlcXVlc3QtPnJlcXVlc3RfbXNnLm1zZy4KKwkJCQkgICBpbml0X3JlcS5yZXFfaWQsCisJCQkJcmVxdWVzdC0+cmVxdWVzdF9tc2cubmRpc19tc2dfdHlwZSwKKwkJCQlyZXNwLT5uZGlzX21zZ190eXBlKTsKIAogCQkJZm91bmQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGZvdW5kKSB7Ci0JCWlmIChSZXNwb25zZS0+TWVzc2FnZUxlbmd0aCA8PSBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSB7Ci0JCQltZW1jcHkoJnJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZSwgUmVzcG9uc2UsCi0JCQkgICAgICAgUmVzcG9uc2UtPk1lc3NhZ2VMZW5ndGgpOworCQlpZiAocmVzcC0+bXNnX2xlbiA8PSBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSB7CisJCQltZW1jcHkoJnJlcXVlc3QtPnJlc3BvbnNlX21zZywgcmVzcCwKKwkJCSAgICAgICByZXNwLT5tc2dfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDLCAicm5kaXMgcmVzcG9uc2UgYnVmZmVyIG92ZXJmbG93ICIKIAkJCQkgICJkZXRlY3RlZCAoc2l6ZSAldSBtYXggJXp1KSIsCi0JCQkJICBSZXNwb25zZS0+TWVzc2FnZUxlbmd0aCwKKwkJCQkgIHJlc3AtPm1zZ19sZW4sCiAJCQkJICBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpKTsKIAotCQkJaWYgKFJlc3BvbnNlLT5OZGlzTWVzc2FnZVR5cGUgPT0KKwkJCWlmIChyZXNwLT5uZGlzX21zZ190eXBlID09CiAJCQkgICAgUkVNT1RFX05ESVNfUkVTRVRfQ01QTFQpIHsKIAkJCQkvKiBkb2VzIG5vdCBoYXZlIGEgcmVxdWVzdCBpZCBmaWVsZCAqLwotCQkJCXJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZS5NZXNzYWdlLlJlc2V0Q29tcGxldGUuU3RhdHVzID0gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLnJlc2V0X2NvbXBsZXRlLgorCQkJCQlzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX09WRVJGTE9XOwogCQkJfSBlbHNlIHsKLQkJCQlyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuU3RhdHVzID0gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLgorCQkJCWluaXRfY29tcGxldGUuc3RhdHVzID0KKwkJCQkJU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKIAkJCX0KIAkJfQogCi0JCW9zZF9XYWl0RXZlbnRTZXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwkJb3NkX3dhaXRldmVudF9zZXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5vIHJuZGlzIHJlcXVlc3QgZm91bmQgZm9yIHRoaXMgcmVzcG9uc2UgIgogCQkJICAgIihpZCAweCV4IHJlcyB0eXBlIDB4JXgpIiwKLQkJCSAgIFJlc3BvbnNlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQkgICBSZXNwb25zZS0+TmRpc01lc3NhZ2VUeXBlKTsKKwkJCSAgIHJlc3AtPm1zZy5pbml0X2NvbXBsZXRlLnJlcV9pZCwKKwkJCSAgIHJlc3AtPm5kaXNfbXNnX3R5cGUpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlSW5kaWNhdGVTdGF0dXMoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCQkgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpSZXNwb25zZSkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX2luZGljYXRlX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJlc3ApCiB7CiAJc3RydWN0IHJuZGlzX2luZGljYXRlX3N0YXR1cyAqaW5kaWNhdGUgPQotCQkJJlJlc3BvbnNlLT5NZXNzYWdlLkluZGljYXRlU3RhdHVzOworCQkJJnJlc3AtPm1zZy5pbmRpY2F0ZV9zdGF0dXM7CiAKLQlpZiAoaW5kaWNhdGUtPlN0YXR1cyA9PSBSTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCkgewotCQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25MaW5rU3RhdHVzQ2hhbmdlZChEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLCAxKTsKLQl9IGVsc2UgaWYgKGluZGljYXRlLT5TdGF0dXMgPT0gUk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpIHsKLQkJZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uTGlua1N0YXR1c0NoYW5nZWQoRGV2aWNlLT5OZXREZXZpY2UtPkRldmljZSwgMCk7CisJaWYgKGluZGljYXRlLT5zdGF0dXMgPT0gUk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QpIHsKKwkJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5saW5rX3N0YXR1c19jaGFuZ2UoCisJCQlkZXYtPm5ldF9kZXYtPmRldiwgMSk7CisJfSBlbHNlIGlmIChpbmRpY2F0ZS0+c3RhdHVzID09IFJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB7CisJCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYubGlua19zdGF0dXNfY2hhbmdlKAorCQkJZGV2LT5uZXRfZGV2LT5kZXYsIDApOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFRPRE86CkBAIC0zMzksMTggKzM0OSwxOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlRGF0YShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKk1lc3NhZ2UsCi0JCQkJICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX2RhdGEoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBybmRpc19tZXNzYWdlICptc2csCisJCQkJICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBrdCkKIHsKLQlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc1BhY2tldDsKLQl1MzIgZGF0YU9mZnNldDsKKwlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc19wa3Q7CisJdTMyIGRhdGFfb2Zmc2V0OwogCiAJLyogZW1wdHkgZXRoZXJuZXQgZnJhbWUgPz8gKi8KIAkvKiBBU1NFUlQoUGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGggPiAqLwogCS8qIAlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3BhY2tldCkpOyAqLwogCi0Jcm5kaXNQYWNrZXQgPSAmTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQ7CisJcm5kaXNfcGt0ID0gJm1zZy0+bXNnLnBrdDsKIAogCS8qCiAJICogRklYTUU6IEhhbmRsZSBtdWx0aXBsZSBybmRpcyBwa3QgbXNncyB0aGF0IG1heWJlIGVuY2xvc2VkIGluIHRoaXMKQEAgLTM1OCw0OCArMzY4LDQ4IEBACiAJICovCiAKIAkvKiBSZW1vdmUgdGhlIHJuZGlzIGhlYWRlciBhbmQgcGFzcyBpdCBiYWNrIHVwIHRoZSBzdGFjayAqLwotCWRhdGFPZmZzZXQgPSBSTkRJU19IRUFERVJfU0laRSArIHJuZGlzUGFja2V0LT5EYXRhT2Zmc2V0OworCWRhdGFfb2Zmc2V0ID0gUk5ESVNfSEVBREVSX1NJWkUgKyBybmRpc19wa3QtPmRhdGFfb2Zmc2V0OwogCi0JUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggLT0gZGF0YU9mZnNldDsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCArPSBkYXRhT2Zmc2V0OwotCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoIC09IGRhdGFPZmZzZXQ7CisJcGt0LT50b3RhbF9kYXRhX2J1ZmxlbiAtPSBkYXRhX29mZnNldDsKKwlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCArPSBkYXRhX29mZnNldDsKKwlwa3QtPnBhZ2VfYnVmWzBdLkxlbmd0aCAtPSBkYXRhX29mZnNldDsKIAotCVBhY2tldC0+SXNEYXRhUGFja2V0ID0gdHJ1ZTsKKwlwa3QtPmlzX2RhdGFfcGt0ID0gdHJ1ZTsKIAotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblJlY2VpdmVDYWxsYmFjayhEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLAotCQkJCQkJICAgUGFja2V0KTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnJlY3ZfY2IoZGV2LT5uZXRfZGV2LT5kZXYsCisJCQkJCQkgICBwa3QpOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25SZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldAkqUGFja2V0KQorc3RhdGljIGludCBybmRpc19maWx0ZXJfcmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQJKnBrdCkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0Jc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNEZXZpY2U7Ci0Jc3RydWN0IHJuZGlzX21lc3NhZ2Ugcm5kaXNNZXNzYWdlOwotCXN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc0hlYWRlcjsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldiA9IGRldi0+RXh0ZW5zaW9uOworCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzX2RldjsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBybmRpc19tc2c7CisJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX2hkcjsKIAotCWlmICghbmV0RGV2aWNlKQorCWlmICghbmV0X2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHJuZGlzIGRldmljZSBzdGF0ZSBpcyBpbml0aWFsaXplZCAqLwotCWlmICghbmV0RGV2aWNlLT5FeHRlbnNpb24pIHsKKwlpZiAoIW5ldF9kZXYtPmV4dGVuc2lvbikgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgImdvdCBybmRpcyBtZXNzYWdlIGJ1dCBubyBybmRpcyBkZXZpY2UuLi4iCiAJCQkgICJkcm9wcGluZyB0aGlzIG1lc3NhZ2UhIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlybmRpc0RldmljZSA9IChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICopbmV0RGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKHJuZGlzRGV2aWNlLT5TdGF0ZSA9PSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRCkgeworCXJuZGlzX2RldiA9IChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICopbmV0X2Rldi0+ZXh0ZW5zaW9uOworCWlmIChybmRpc19kZXYtPnN0YXRlID09IFJORElTX0RFVl9VTklOSVRJQUxJWkVEKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiZ290IHJuZGlzIG1lc3NhZ2UgYnV0IHJuZGlzIGRldmljZSAiCiAJCQkgICAidW5pbml0aWFsaXplZC4uLmRyb3BwaW5nIHRoaXMgbWVzc2FnZSEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJuZGlzSGVhZGVyID0gKHN0cnVjdCBybmRpc19tZXNzYWdlICopa21hcF9hdG9taWMoCi0JCQlwZm5fdG9fcGFnZShQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiksIEtNX0lSUTApOworCXJuZGlzX2hkciA9IChzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqKWttYXBfYXRvbWljKAorCQkJcGZuX3RvX3BhZ2UocGt0LT5wYWdlX2J1ZlswXS5QZm4pLCBLTV9JUlEwKTsKIAotCXJuZGlzSGVhZGVyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcm5kaXNIZWFkZXIgKwotCQkJUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQpOworCXJuZGlzX2hkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJuZGlzX2hkciArCisJCQlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCk7CiAKIAkvKiBNYWtlIHN1cmUgd2UgZ290IGEgdmFsaWQgcm5kaXMgbWVzc2FnZSAqLwogCS8qCkBAIC00MDgsMzkgKzQxOCwzOSBAQAogCSAqIHJhbmdlIHNob3dzIDUyIGJ5dGVzCiAJICogKi8KICNpZiAwCi0JaWYgKFBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoICE9IHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoKSB7Ci0JCWt1bm1hcF9hdG9taWMocm5kaXNIZWFkZXIgLSBQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCwKKwlpZiAocGt0LT50b3RhbF9kYXRhX2J1ZmxlbiAhPSBybmRpc19oZHItPm1zZ19sZW4pIHsKKwkJa3VubWFwX2F0b21pYyhybmRpc19oZHIgLSBwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCwKIAkJCSAgICAgIEtNX0lSUTApOwogCiAJCURQUklOVF9FUlIoTkVUVlNDLCAiaW52YWxpZCBybmRpcyBtZXNzYWdlPyAoZXhwZWN0ZWQgJXUgIgogCQkJICAgImJ5dGVzIGdvdCAldSkuLi5kcm9wcGluZyB0aGlzIG1lc3NhZ2UhIiwKLQkJCSAgIHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoLAotCQkJICAgUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGgpOworCQkJICAgcm5kaXNfaGRyLT5tc2dfbGVuLAorCQkJICAgcGt0LT50b3RhbF9kYXRhX2J1Zmxlbik7CiAJCXJldHVybiAtMTsKIAl9CiAjZW5kaWYKIAotCWlmICgocm5kaXNIZWFkZXItPk5kaXNNZXNzYWdlVHlwZSAhPSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHKSAmJgotCSAgICAocm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGggPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSkgeworCWlmICgocm5kaXNfaGRyLT5uZGlzX21zZ190eXBlICE9IFJFTU9URV9ORElTX1BBQ0tFVF9NU0cpICYmCisJICAgIChybmRpc19oZHItPm1zZ19sZW4gPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgImluY29taW5nIHJuZGlzIG1lc3NhZ2UgYnVmZmVyIG92ZXJmbG93ICIKIAkJCSAgICJkZXRlY3RlZCAoZ290ICV1LCBtYXggJXp1KS4uLm1hcmtpbmcgaXQgYW4gZXJyb3IhIiwKLQkJCSAgIHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoLAorCQkJICAgcm5kaXNfaGRyLT5tc2dfbGVuLAogCQkJICAgc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSk7CiAJfQogCi0JbWVtY3B5KCZybmRpc01lc3NhZ2UsIHJuZGlzSGVhZGVyLAotCQkocm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGggPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSA/CisJbWVtY3B5KCZybmRpc19tc2csIHJuZGlzX2hkciwKKwkJKHJuZGlzX2hkci0+bXNnX2xlbiA+IHNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkpID8KIAkJCXNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkgOgotCQkJcm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGgpOworCQkJcm5kaXNfaGRyLT5tc2dfbGVuKTsKIAotCWt1bm1hcF9hdG9taWMocm5kaXNIZWFkZXIgLSBQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCwgS01fSVJRMCk7CisJa3VubWFwX2F0b21pYyhybmRpc19oZHIgLSBwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCwgS01fSVJRMCk7CiAKLQlEdW1wUm5kaXNNZXNzYWdlKCZybmRpc01lc3NhZ2UpOworCWR1bXBfcm5kaXNfbWVzc2FnZSgmcm5kaXNfbXNnKTsKIAotCXN3aXRjaCAocm5kaXNNZXNzYWdlLk5kaXNNZXNzYWdlVHlwZSkgeworCXN3aXRjaCAocm5kaXNfbXNnLm5kaXNfbXNnX3R5cGUpIHsKIAljYXNlIFJFTU9URV9ORElTX1BBQ0tFVF9NU0c6CiAJCS8qIGRhdGEgbXNnICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZURhdGEocm5kaXNEZXZpY2UsICZybmRpc01lc3NhZ2UsIFBhY2tldCk7CisJCXJuZGlzX2ZpbHRlcl9yZWNlaXZlX2RhdGEocm5kaXNfZGV2LCAmcm5kaXNfbXNnLCBwa3QpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfSU5JVElBTElaRV9DTVBMVDoKQEAgLTQ0OSwzNyArNDU5LDM3IEBACiAJLyogY2FzZSBSRU1PVEVfTkRJU19SRVNFVF9DTVBMVDogKi8KIAkvKiBjYXNlIFJFTU9URV9ORElTX0tFRVBBTElWRV9DTVBMVDogKi8KIAkJLyogY29tcGxldGlvbiBtc2dzICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZVJlc3BvbnNlKHJuZGlzRGV2aWNlLCAmcm5kaXNNZXNzYWdlKTsKKwkJcm5kaXNfZmlsdGVyX3JlY2VpdmVfcmVzcG9uc2Uocm5kaXNfZGV2LCAmcm5kaXNfbXNnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX0lORElDQVRFX1NUQVRVU19NU0c6CiAJCS8qIG5vdGlmaWNhdGlvbiBtc2dzICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZUluZGljYXRlU3RhdHVzKHJuZGlzRGV2aWNlLCAmcm5kaXNNZXNzYWdlKTsKKwkJcm5kaXNfZmlsdGVyX3JlY2VpdmVfaW5kaWNhdGVfc3RhdHVzKHJuZGlzX2RldiwgJnJuZGlzX21zZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5oYW5kbGVkIHJuZGlzIG1lc3NhZ2UgKHR5cGUgJXUgbGVuICV1KSIsCi0JCQkgICBybmRpc01lc3NhZ2UuTmRpc01lc3NhZ2VUeXBlLAotCQkJICAgcm5kaXNNZXNzYWdlLk1lc3NhZ2VMZW5ndGgpOworCQkJICAgcm5kaXNfbXNnLm5kaXNfbXNnX3R5cGUsCisJCQkgICBybmRpc19tc2cubXNnX2xlbik7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLCB1MzIgT2lkLAotCQkJCSAgdm9pZCAqUmVzdWx0LCB1MzIgKlJlc3VsdFNpemUpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LCB1MzIgb2lkLAorCQkJCSAgdm9pZCAqcmVzdWx0LCB1MzIgKnJlc3VsdF9zaXplKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwotCXUzMiBpbnJlc3VsdFNpemUgPSAqUmVzdWx0U2l6ZTsKKwl1MzIgaW5yZXN1bHRfc2l6ZSA9ICpyZXN1bHRfc2l6ZTsKIAlzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCAqcXVlcnk7Ci0Jc3RydWN0IHJuZGlzX3F1ZXJ5X2NvbXBsZXRlICpxdWVyeUNvbXBsZXRlOworCXN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSAqcXVlcnlfY29tcGxldGU7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIVJlc3VsdCkKKwlpZiAoIXJlc3VsdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqUmVzdWx0U2l6ZSA9IDA7Ci0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX1FVRVJZX01TRywKKwkqcmVzdWx0X3NpemUgPSAwOworCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX1FVRVJZX01TRywKIAkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCkpOwogCWlmICghcmVxdWVzdCkgewogCQlyZXQgPSAtMTsKQEAgLTQ4Nyw3MSArNDk3LDcxIEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHF1ZXJ5ICovCi0JcXVlcnkgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5RdWVyeVJlcXVlc3Q7Ci0JcXVlcnktPk9pZCA9IE9pZDsKLQlxdWVyeS0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QpOwotCXF1ZXJ5LT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA9IDA7Ci0JcXVlcnktPkRldmljZVZjSGFuZGxlID0gMDsKKwlxdWVyeSA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cucXVlcnlfcmVxOworCXF1ZXJ5LT5vaWQgPSBvaWQ7CisJcXVlcnktPmluZm9fYnVmX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCk7CisJcXVlcnktPmluZm9fYnVmbGVuID0gMDsKKwlxdWVyeS0+ZGV2X3ZjX2hhbmRsZSA9IDA7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNlbmRSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBDbGVhbnVwOwogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAogCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KLQlxdWVyeUNvbXBsZXRlID0gJnJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZS5NZXNzYWdlLlF1ZXJ5Q29tcGxldGU7CisJcXVlcnlfY29tcGxldGUgPSAmcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5xdWVyeV9jb21wbGV0ZTsKIAotCWlmIChxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IGlucmVzdWx0U2l6ZSkgeworCWlmIChxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW4gPiBpbnJlc3VsdF9zaXplKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbWVtY3B5KFJlc3VsdCwKLQkgICAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcXVlcnlDb21wbGV0ZSArCi0JCQkgcXVlcnlDb21wbGV0ZS0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpLAotCSAgICAgICBxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJbWVtY3B5KHJlc3VsdCwKKwkgICAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcXVlcnlfY29tcGxldGUgKworCQkJIHF1ZXJ5X2NvbXBsZXRlLT5pbmZvX2J1Zl9vZmZzZXQpLAorCSAgICAgICBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW4pOwogCi0JKlJlc3VsdFNpemUgPSBxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkqcmVzdWx0X3NpemUgPSBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW47CiAKIENsZWFudXA6CiAJaWYgKHJlcXVlc3QpCi0JCVB1dFJuZGlzUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTWFjKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9tYWMoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCXUzMiBzaXplID0gRVRIX0FMRU47CiAKLQlyZXR1cm4gUm5kaXNGaWx0ZXJRdWVyeURldmljZShEZXZpY2UsCisJcmV0dXJuIHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2UoZGV2LAogCQkJCSAgICAgIFJORElTX09JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUywKLQkJCQkgICAgICBEZXZpY2UtPkh3TWFjQWRkciwgJnNpemUpOworCQkJCSAgICAgIGRldi0+aHdfbWFjX2FkciwgJnNpemUpOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VMaW5rU3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHNpemUgPSBzaXplb2YodTMyKTsKIAotCXJldHVybiBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlKERldmljZSwKKwlyZXR1cm4gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZShkZXYsCiAJCQkJICAgICAgUk5ESVNfT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUywKLQkJCQkgICAgICAmRGV2aWNlLT5MaW5rU3RhdHVzLCAmc2l6ZSk7CisJCQkJICAgICAgJmRldi0+bGlua19zdGF0LCAmc2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJTZXRQYWNrZXRGaWx0ZXIoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCSAgICAgIHUzMiBOZXdGaWx0ZXIpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZXRfcGFja2V0X2ZpbHRlcihzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJICAgICAgdTMyIG5ld19maWx0ZXIpCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7CiAJc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0ICpzZXQ7Ci0Jc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSAqc2V0Q29tcGxldGU7CisJc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSAqc2V0X2NvbXBsZXRlOwogCXUzMiBzdGF0dXM7CiAJaW50IHJldDsKIAogCS8qIEFTU0VSVChSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KSArIHNpemVvZih1MzIpIDw9ICovCiAJLyogCXNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkpOyAqLwogCi0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX1NFVF9NU0csCisJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfU0VUX01TRywKIAkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpICsKIAkJCXNpemVvZih1MzIpKTsKIAlpZiAoIXJlcXVlc3QpIHsKQEAgLTU2MCwxOSArNTcwLDE5IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwotCXNldCA9ICZyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlLlNldFJlcXVlc3Q7Ci0Jc2V0LT5PaWQgPSBSTkRJU19PSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUjsKLQlzZXQtPkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoID0gc2l6ZW9mKHUzMik7Ci0Jc2V0LT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpOworCXNldCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuc2V0X3JlcTsKKwlzZXQtPm9pZCA9IFJORElTX09JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOworCXNldC0+aW5mb19idWZsZW4gPSBzaXplb2YodTMyKTsKKwlzZXQtPmluZm9fYnVmX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpOwogCiAJbWVtY3B5KCh2b2lkICopKHVuc2lnbmVkIGxvbmcpc2V0ICsgc2l6ZW9mKHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCksCi0JICAgICAgICZOZXdGaWx0ZXIsIHNpemVvZih1MzIpKTsKKwkgICAgICAgJm5ld19maWx0ZXIsIHNpemVvZih1MzIpKTsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2VuZFJlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwlyZXQgPSBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIENsZWFudXA7CiAKLQlyZXQgPSBvc2RfV2FpdEV2ZW50V2FpdEV4KHJlcXVlc3QtPldhaXRFdmVudCwgMjAwMC8qMnNlYyovKTsKKwlyZXQgPSBvc2Rfd2FpdGV2ZW50X3dhaXRleChyZXF1ZXN0LT53YWl0ZXZlbnQsIDIwMDAvKjJzZWMqLyk7CiAJaWYgKCFyZXQpIHsKIAkJcmV0ID0gLTE7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidGltZW91dCBiZWZvcmUgd2UgZ290IGEgc2V0IHJlc3BvbnNlLi4uIik7CkBAIC01ODQsMjcgKzU5NCwyNyBAQAogCX0gZWxzZSB7CiAJCWlmIChyZXQgPiAwKQogCQkJcmV0ID0gMDsKLQkJc2V0Q29tcGxldGUgPSAmcmVxdWVzdC0+UmVzcG9uc2VNZXNzYWdlLk1lc3NhZ2UuU2V0Q29tcGxldGU7Ci0JCXN0YXR1cyA9IHNldENvbXBsZXRlLT5TdGF0dXM7CisJCXNldF9jb21wbGV0ZSA9ICZyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLnNldF9jb21wbGV0ZTsKKwkJc3RhdHVzID0gc2V0X2NvbXBsZXRlLT5zdGF0dXM7CiAJfQogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIEV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IFJuZGlzRmlsdGVySW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqRHJpdmVyKQoraW50IHJuZGlzX2ZpbHRlcl9pbml0KHN0cnVjdCBuZXR2c2NfZHJpdmVyICpkcnYpCiB7CiAJRFBSSU5UX0RCRyhORVRWU0MsICJzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpID09ICV6ZCIsCiAJCSAgIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCkpOwogCi0JRHJpdmVyLT5SZXF1ZXN0RXh0U2l6ZSA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCk7CisJZHJ2LT5yZXFfZXh0X3NpemUgPSBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpOwogCiAJLyogRHJpdmVyLT5Db250ZXh0ID0gcm5kaXNEcml2ZXI7ICovCiAKLQltZW1zZXQoJmdSbmRpc0ZpbHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCkpOworCW1lbXNldCgmcm5kaXNfZmlsdGVyLCAwLCBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9kcml2ZXJfb2JqZWN0KSk7CiAKIAkvKnJuZGlzRHJpdmVyLT5Ecml2ZXIgPSBEcml2ZXI7CiAKQEAgLTYxMiwzOCArNjIyLDM4IEBACiAJcm5kaXNEcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQgPSBEcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQ7Ki8KIAogCS8qIFNhdmUgdGhlIG9yaWdpbmFsIGRpc3BhdGNoIGhhbmRsZXJzIGJlZm9yZSB3ZSBvdmVycmlkZSBpdCAqLwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlQWRkID0gRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlUmVtb3ZlID0KLQkJCQkJRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uQ2xlYW51cCA9IERyaXZlci0+QmFzZS5PbkNsZWFudXA7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5iYXNlLk9uRGV2aWNlQWRkID0gZHJ2LT5iYXNlLk9uRGV2aWNlQWRkOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuYmFzZS5PbkRldmljZVJlbW92ZSA9CisJCQkJCWRydi0+YmFzZS5PbkRldmljZVJlbW92ZTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25DbGVhbnVwID0gZHJ2LT5iYXNlLk9uQ2xlYW51cDsKIAogCS8qIEFTU0VSVChEcml2ZXItPk9uU2VuZCk7ICovCiAJLyogQVNTRVJUKERyaXZlci0+T25SZWNlaXZlQ2FsbGJhY2spOyAqLwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblNlbmQgPSBEcml2ZXItPk9uU2VuZDsKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25SZWNlaXZlQ2FsbGJhY2sgPSBEcml2ZXItPk9uUmVjZWl2ZUNhbGxiYWNrOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PbkxpbmtTdGF0dXNDaGFuZ2VkID0KLQkJCQkJRHJpdmVyLT5PbkxpbmtTdGF0dXNDaGFuZ2VkOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuc2VuZCA9IGRydi0+c2VuZDsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnJlY3ZfY2IgPSBkcnYtPnJlY3ZfY2I7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5saW5rX3N0YXR1c19jaGFuZ2UgPQorCQkJCQlkcnYtPmxpbmtfc3RhdHVzX2NoYW5nZTsKIAogCS8qIE92ZXJyaWRlICovCi0JRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkID0gUm5kaXNGaWx0ZXJPbkRldmljZUFkZDsKLQlEcml2ZXItPkJhc2UuT25EZXZpY2VSZW1vdmUgPSBSbmRpc0ZpbHRlck9uRGV2aWNlUmVtb3ZlOwotCURyaXZlci0+QmFzZS5PbkNsZWFudXAgPSBSbmRpc0ZpbHRlck9uQ2xlYW51cDsKLQlEcml2ZXItPk9uU2VuZCA9IFJuZGlzRmlsdGVyT25TZW5kOworCWRydi0+YmFzZS5PbkRldmljZUFkZCA9IHJuZGlzX2ZpbHRlX2RldmljZV9hZGQ7CisJZHJ2LT5iYXNlLk9uRGV2aWNlUmVtb3ZlID0gcm5kaXNfZmlsdGVyX2RldmljZV9yZW1vdmU7CisJZHJ2LT5iYXNlLk9uQ2xlYW51cCA9IHJuZGlzX2ZpbHRlcl9jbGVhbnVwOworCWRydi0+c2VuZCA9IHJuZGlzX2ZpbHRlcl9zZW5kOwogCS8qIERyaXZlci0+UXVlcnlMaW5rU3RhdHVzID0gUm5kaXNGaWx0ZXJRdWVyeURldmljZUxpbmtTdGF0dXM7ICovCi0JRHJpdmVyLT5PblJlY2VpdmVDYWxsYmFjayA9IFJuZGlzRmlsdGVyT25SZWNlaXZlOworCWRydi0+cmVjdl9jYiA9IHJuZGlzX2ZpbHRlcl9yZWNlaXZlOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJJbml0RGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2luaXRfZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxdWVzdDsKIAlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0ICppbml0OwotCXN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlICppbml0Q29tcGxldGU7CisJc3RydWN0IHJuZGlzX2luaXRpYWxpemVfY29tcGxldGUgKmluaXRfY29tcGxldGU7CiAJdTMyIHN0YXR1czsKIAlpbnQgcmV0OwogCi0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHLAorCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHLAogCQkJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19pbml0aWFsaXplX3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpIHsKIAkJcmV0ID0gLTE7CkBAIC02NTEsMTA1ICs2NjEsMTA1IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwotCWluaXQgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplUmVxdWVzdDsKLQlpbml0LT5NYWpvclZlcnNpb24gPSBSTkRJU19NQUpPUl9WRVJTSU9OOwotCWluaXQtPk1pbm9yVmVyc2lvbiA9IFJORElTX01JTk9SX1ZFUlNJT047CisJaW5pdCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuaW5pdF9yZXE7CisJaW5pdC0+bWFqb3JfdmVyID0gUk5ESVNfTUFKT1JfVkVSU0lPTjsKKwlpbml0LT5taW5vcl92ZXIgPSBSTkRJU19NSU5PUl9WRVJTSU9OOwogCS8qIEZJWE1FOiBVc2UgMTUzNiAtIHJvdW5kZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAqLwotCWluaXQtPk1heFRyYW5zZmVyU2l6ZSA9IDIwNDg7CisJaW5pdC0+bWF4X3hmZXJfc2l6ZSA9IDIwNDg7CiAKLQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX0lOSVRJQUxJWklORzsKKwlkZXYtPnN0YXRlID0gUk5ESVNfREVWX0lOSVRJQUxJWklORzsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2VuZFJlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwlyZXQgPSBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAotCWluaXRDb21wbGV0ZSA9ICZyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGU7Ci0Jc3RhdHVzID0gaW5pdENvbXBsZXRlLT5TdGF0dXM7CisJaW5pdF9jb21wbGV0ZSA9ICZyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLmluaXRfY29tcGxldGU7CisJc3RhdHVzID0gaW5pdF9jb21wbGV0ZS0+c3RhdHVzOwogCWlmIChzdGF0dXMgPT0gUk5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewotCQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKIAkJcmV0ID0gLTE7CiAJfQogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVySGFsdERldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfaGFsdF9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwogCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgKmhhbHQ7CiAKIAkvKiBBdHRlbXB0IHRvIGRvIGEgcm5kaXMgZGV2aWNlIGhhbHQgKi8KLQlyZXF1ZXN0ID0gR2V0Um5kaXNSZXF1ZXN0KERldmljZSwgUkVNT1RFX05ESVNfSEFMVF9NU0csCisJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfSEFMVF9NU0csCiAJCQkJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpCiAJCWdvdG8gQ2xlYW51cDsKIAogCS8qIFNldHVwIHRoZSBybmRpcyBzZXQgKi8KLQloYWx0ID0gJnJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSGFsdFJlcXVlc3Q7Ci0JaGFsdC0+UmVxdWVzdElkID0gYXRvbWljX2luY19yZXR1cm4oJkRldmljZS0+TmV3UmVxdWVzdElkKTsKKwloYWx0ID0gJnJlcXVlc3QtPnJlcXVlc3RfbXNnLm1zZy5oYWx0X3JlcTsKKwloYWx0LT5yZXFfaWQgPSBhdG9taWNfaW5jX3JldHVybigmZGV2LT5uZXdfcmVxX2lkKTsKIAogCS8qIElnbm9yZSByZXR1cm4gc2luY2UgdGhpcyBtc2cgaXMgb3B0aW9uYWwuICovCi0JUm5kaXNGaWx0ZXJTZW5kUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCXJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAotCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKKwlkZXYtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CiAKIENsZWFudXA6CiAJaWYgKHJlcXVlc3QpCi0JCVB1dFJuZGlzUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9wZW5EZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfb3Blbl9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAKLQlpZiAoRGV2aWNlLT5TdGF0ZSAhPSBSTkRJU19ERVZfSU5JVElBTElaRUQpCisJaWYgKGRldi0+c3RhdGUgIT0gUk5ESVNfREVWX0lOSVRJQUxJWkVEKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2V0UGFja2V0RmlsdGVyKERldmljZSwKKwlyZXQgPSBybmRpc19maWx0ZXJfc2V0X3BhY2tldF9maWx0ZXIoZGV2LAogCQkJCQkgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QgfAogCQkJCQkgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUIHwKIAkJCQkJIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQpOwogCWlmIChyZXQgPT0gMCkKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9EQVRBSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfREFUQUlOSVRJQUxJWkVEOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlckNsb3NlRGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlX2RldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIAotCWlmIChEZXZpY2UtPlN0YXRlICE9IFJORElTX0RFVl9EQVRBSU5JVElBTElaRUQpCisJaWYgKGRldi0+c3RhdGUgIT0gUk5ESVNfREVWX0RBVEFJTklUSUFMSVpFRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNldFBhY2tldEZpbHRlcihEZXZpY2UsIDApOworCXJldCA9IHJuZGlzX2ZpbHRlcl9zZXRfcGFja2V0X2ZpbHRlcihkZXYsIDApOwogCWlmIChyZXQgPT0gMCkKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPbkRldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJICB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwogCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKmRldmljZUluZm8gPSBBZGRpdGlvbmFsSW5mbzsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvID0gYWRkaXRpb25hbF9pbmZvOwogCi0Jcm5kaXNEZXZpY2UgPSBHZXRSbmRpc0RldmljZSgpOworCXJuZGlzRGV2aWNlID0gZ2V0X3JuZGlzX2RldmljZSgpOwogCWlmICghcm5kaXNEZXZpY2UpCiAJCXJldHVybiAtMTsKIApAQCAtNzYwLDcgKzc3MCw3IEBACiAJICogTk9URSEgT25jZSB0aGUgY2hhbm5lbCBpcyBjcmVhdGVkLCB3ZSBtYXkgZ2V0IGEgcmVjZWl2ZSBjYWxsYmFjawogCSAqIChSbmRpc0ZpbHRlck9uUmVjZWl2ZSgpKSBiZWZvcmUgdGhpcyBjYWxsIGlzIGNvbXBsZXRlZAogCSAqLwotCXJldCA9IGdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlQWRkKERldmljZSwgQWRkaXRpb25hbEluZm8pOworCXJldCA9IHJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuYmFzZS5PbkRldmljZUFkZChkZXYsIGFkZGl0aW9uYWxfaW5mbyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWtmcmVlKHJuZGlzRGV2aWNlKTsKIAkJcmV0dXJuIHJldDsKQEAgLTc2OCwxNSArNzc4LDE1IEBACiAKIAogCS8qIEluaXRpYWxpemUgdGhlIHJuZGlzIGRldmljZSAqLwotCW5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOworCW5ldERldmljZSA9IGRldi0+RXh0ZW5zaW9uOwogCS8qIEFTU0VSVChuZXREZXZpY2UpOyAqLwogCS8qIEFTU0VSVChuZXREZXZpY2UtPkRldmljZSk7ICovCiAKLQluZXREZXZpY2UtPkV4dGVuc2lvbiA9IHJuZGlzRGV2aWNlOwotCXJuZGlzRGV2aWNlLT5OZXREZXZpY2UgPSBuZXREZXZpY2U7CisJbmV0RGV2aWNlLT5leHRlbnNpb24gPSBybmRpc0RldmljZTsKKwlybmRpc0RldmljZS0+bmV0X2RldiA9IG5ldERldmljZTsKIAogCS8qIFNlbmQgdGhlIHJuZGlzIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KLQlyZXQgPSBSbmRpc0ZpbHRlckluaXREZXZpY2Uocm5kaXNEZXZpY2UpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9pbml0X2RldmljZShybmRpc0RldmljZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qCiAJCSAqIFRPRE86IElmIHJuZGlzIGluaXQgZmFpbGVkLCB3ZSB3aWxsIG5lZWQgdG8gc2h1dCBkb3duIHRoZQpAQCAtNzg1LDcgKzc5NSw3IEBACiAJfQogCiAJLyogR2V0IHRoZSBtYWMgYWRkcmVzcyAqLwotCXJldCA9IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VNYWMocm5kaXNEZXZpY2UpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2VfbWFjKHJuZGlzRGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogVE9ETzogc2h1dGRvd24gcm5kaXMgZGV2aWNlIGFuZCB0aGUgY2hhbm5lbApAQCAtNzkzLDYyICs4MDMsNjIgQEAKIAl9CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEZXZpY2UgMHglcCBtYWMgYWRkciAlcE0iLAotCQkgICAgcm5kaXNEZXZpY2UsIHJuZGlzRGV2aWNlLT5Id01hY0FkZHIpOworCQkgICAgcm5kaXNEZXZpY2UsIHJuZGlzRGV2aWNlLT5od19tYWNfYWRyKTsKIAotCW1lbWNweShkZXZpY2VJbmZvLT5NYWNBZGRyLCBybmRpc0RldmljZS0+SHdNYWNBZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRldmljZUluZm8tPm1hY19hZHIsIHJuZGlzRGV2aWNlLT5od19tYWNfYWRyLCBFVEhfQUxFTik7CiAKLQlSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTGlua1N0YXR1cyhybmRpc0RldmljZSk7CisJcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhybmRpc0RldmljZSk7CiAKLQlkZXZpY2VJbmZvLT5MaW5rU3RhdGUgPSBybmRpc0RldmljZS0+TGlua1N0YXR1czsKKwlkZXZpY2VJbmZvLT5saW5rX3N0YXRlID0gcm5kaXNEZXZpY2UtPmxpbmtfc3RhdDsKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEZXZpY2UgMHglcCBsaW5rIHN0YXRlICVzIiwgcm5kaXNEZXZpY2UsCi0JCSAgICAoKGRldmljZUluZm8tPkxpbmtTdGF0ZSkgPyAoImRvd24iKSA6ICgidXAiKSkpOworCQkgICAgKChkZXZpY2VJbmZvLT5saW5rX3N0YXRlKSA/ICgiZG93biIpIDogKCJ1cCIpKSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwotCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlID0gbmV0RGV2aWNlLT5FeHRlbnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXYgPSBkZXYtPkV4dGVuc2lvbjsKKwlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc19kZXYgPSBuZXRfZGV2LT5leHRlbnNpb247CiAKIAkvKiBIYWx0IGFuZCByZWxlYXNlIHRoZSBybmRpcyBkZXZpY2UgKi8KLQlSbmRpc0ZpbHRlckhhbHREZXZpY2Uocm5kaXNEZXZpY2UpOworCXJuZGlzX2ZpbHRlcl9oYWx0X2RldmljZShybmRpc19kZXYpOwogCi0Ja2ZyZWUocm5kaXNEZXZpY2UpOwotCW5ldERldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlrZnJlZShybmRpc19kZXYpOworCW5ldF9kZXYtPmV4dGVuc2lvbiA9IE5VTEw7CiAKIAkvKiBQYXNzIGNvbnRyb2wgdG8gaW5uZXIgZHJpdmVyIHRvIHJlbW92ZSB0aGUgZGV2aWNlICovCi0JZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLkJhc2UuT25EZXZpY2VSZW1vdmUoRGV2aWNlKTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCiB7CiB9CiAKLWludCBSbmRpc0ZpbHRlck9uT3BlbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gZGV2LT5FeHRlbnNpb247CiAKIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gUm5kaXNGaWx0ZXJPcGVuRGV2aWNlKG5ldERldmljZS0+RXh0ZW5zaW9uKTsKKwlyZXR1cm4gcm5kaXNfZmlsdGVyX29wZW5fZGV2aWNlKG5ldERldmljZS0+ZXh0ZW5zaW9uKTsKIH0KIAotaW50IFJuZGlzRmlsdGVyT25DbG9zZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IGRldi0+RXh0ZW5zaW9uOwogCiAJaWYgKCFuZXREZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIFJuZGlzRmlsdGVyQ2xvc2VEZXZpY2UobmV0RGV2aWNlLT5FeHRlbnNpb24pOworCXJldHVybiBybmRpc19maWx0ZXJfY2xvc2VfZGV2aWNlKG5ldERldmljZS0+ZXh0ZW5zaW9uKTsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uU2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkgICAgIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpQYWNrZXQpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBrdCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0ICpmaWx0ZXJQYWNrZXQ7CkBAIC04NTcsNjIgKzg2Nyw2MiBAQAogCXUzMiBybmRpc01lc3NhZ2VTaXplOwogCiAJLyogQWRkIHRoZSBybmRpcyBoZWFkZXIgKi8KLQlmaWx0ZXJQYWNrZXQgPSAoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKilQYWNrZXQtPkV4dGVuc2lvbjsKKwlmaWx0ZXJQYWNrZXQgPSAoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKilwa3QtPmV4dGVuc2lvbjsKIAkvKiBBU1NFUlQoZmlsdGVyUGFja2V0KTsgKi8KIAogCW1lbXNldChmaWx0ZXJQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCkpOwogCi0Jcm5kaXNNZXNzYWdlID0gJmZpbHRlclBhY2tldC0+TWVzc2FnZTsKKwlybmRpc01lc3NhZ2UgPSAmZmlsdGVyUGFja2V0LT5tc2c7CiAJcm5kaXNNZXNzYWdlU2l6ZSA9IFJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfcGFja2V0KTsKIAotCXJuZGlzTWVzc2FnZS0+TmRpc01lc3NhZ2VUeXBlID0gUkVNT1RFX05ESVNfUEFDS0VUX01TRzsKLQlybmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGggPSBQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCArCisJcm5kaXNNZXNzYWdlLT5uZGlzX21zZ190eXBlID0gUkVNT1RFX05ESVNfUEFDS0VUX01TRzsKKwlybmRpc01lc3NhZ2UtPm1zZ19sZW4gPSBwa3QtPnRvdGFsX2RhdGFfYnVmbGVuICsKIAkJCQkgICAgICBybmRpc01lc3NhZ2VTaXplOwogCi0Jcm5kaXNQYWNrZXQgPSAmcm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldDsKLQlybmRpc1BhY2tldC0+RGF0YU9mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfcGFja2V0KTsKLQlybmRpc1BhY2tldC0+RGF0YUxlbmd0aCA9IFBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoOworCXJuZGlzUGFja2V0ID0gJnJuZGlzTWVzc2FnZS0+bXNnLnBrdDsKKwlybmRpc1BhY2tldC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3BhY2tldCk7CisJcm5kaXNQYWNrZXQtPmRhdGFfbGVuID0gcGt0LT50b3RhbF9kYXRhX2J1ZmxlbjsKIAotCVBhY2tldC0+SXNEYXRhUGFja2V0ID0gdHJ1ZTsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiA9IHZpcnRfdG9fcGh5cyhybmRpc01lc3NhZ2UpID4+IFBBR0VfU0hJRlQ7Ci0JUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQorCXBrdC0+aXNfZGF0YV9wa3QgPSB0cnVlOworCXBrdC0+cGFnZV9idWZbMF0uUGZuID0gdmlydF90b19waHlzKHJuZGlzTWVzc2FnZSkgPj4gUEFHRV9TSElGVDsKKwlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCA9CiAJCQkodW5zaWduZWQgbG9uZylybmRpc01lc3NhZ2UgJiAoUEFHRV9TSVpFLTEpOwotCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoID0gcm5kaXNNZXNzYWdlU2l6ZTsKKwlwa3QtPnBhZ2VfYnVmWzBdLkxlbmd0aCA9IHJuZGlzTWVzc2FnZVNpemU7CiAKIAkvKiBTYXZlIHRoZSBwYWNrZXQgc2VuZCBjb21wbGV0aW9uIGFuZCBjb250ZXh0ICovCi0JZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb24gPSBQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5PblNlbmRDb21wbGV0aW9uOwotCWZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQgPQotCQkJCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dDsKKwlmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb24gPSBwa3QtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb247CisJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uX2N0eCA9CisJCQkJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eDsKIAogCS8qIFVzZSBvdXJzICovCi0JUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9IFJuZGlzRmlsdGVyT25TZW5kQ29tcGxldGlvbjsKLQlQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQgPSBmaWx0ZXJQYWNrZXQ7CisJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uID0gcm5kaXNfZmlsdGVyX3NlbmRfY29tcGxldGlvbjsKKwlwa3QtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fY3R4ID0gZmlsdGVyUGFja2V0OwogCi0JcmV0ID0gZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uU2VuZChEZXZpY2UsIFBhY2tldCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5zZW5kKGRldiwgcGt0KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogUmVzZXQgdGhlIGNvbXBsZXRpb24gdG8gb3JpZ2luYWxzIHRvIGFsbG93IHJldHJpZXMgZnJvbQogCQkgKiBhYm92ZQogCQkgKi8KLQkJUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9Ci0JCQkJZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb247Ci0JCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dCA9Ci0JCQkJZmlsdGVyUGFja2V0LT5Db21wbGV0aW9uQ29udGV4dDsKKwkJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uID0KKwkJCQlmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb247CisJCXBrdC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHggPQorCQkJCWZpbHRlclBhY2tldC0+Y29tcGxldGlvbl9jdHg7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPblNlbmRDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfc2VuZF9jb21wbGV0aW9uKHZvaWQgKmN0eCkKIHsKLQlzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCAqZmlsdGVyUGFja2V0ID0gQ29udGV4dDsKKwlzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCAqZmlsdGVyUGFja2V0ID0gY3R4OwogCiAJLyogUGFzcyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGVyICovCi0JZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb24oZmlsdGVyUGFja2V0LT5Db21wbGV0aW9uQ29udGV4dCk7CisJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uKGZpbHRlclBhY2tldC0+Y29tcGxldGlvbl9jdHgpOwogfQogCiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyT25TZW5kUmVxdWVzdENvbXBsZXRpb24odm9pZCAqQ29udGV4dCkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3RfY29tcGxldGlvbih2b2lkICpjdHgpCiB7CiAJLyogTm9vcCAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5oCmluZGV4IDc2NGI5YmYuLjRkYTE4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmgKQEAgLTUwLDYgKzUwLDYgQEAKIAogLyogSW50ZXJmYWNlICovCiAKLWV4dGVybiBpbnQgUm5kaXNGaWx0ZXJJbml0KHN0cnVjdCBuZXR2c2NfZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGludCBybmRpc19maWx0ZXJfaW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyKTsKIAogI2VuZGlmIC8qIF9STkRJU0ZJTFRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMKaW5kZXggMTllODdmNi4uOTI5NTExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jCkBAIC0zNCw0MyArMzQsNDMgQEAKIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIHsKIAkvKiBMSVNUX0VOVFJZIExpc3RFbnRyeTsgKi8KIAotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKlJlcXVlc3Q7Ci0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlOworCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwogCiAJLyogU3luY2hyb25pemUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkICovCi0Jc3RydWN0IG9zZF93YWl0ZXZlbnQgKldhaXRFdmVudDsKKwlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudDsKIAotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgVlN0b3JQYWNrZXQ7CisJc3RydWN0IHZzdG9yX3BhY2tldCB2c3Rvcl9wYWNrZXQ7CiB9OwogCiAvKiBBIHN0b3J2c2MgZGV2aWNlIGlzIGEgZGV2aWNlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgdm1idXMgY2hhbm5lbCAqLwogc3RydWN0IHN0b3J2c2NfZGV2aWNlIHsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwogCiAJLyogMCBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyBiZWluZyBkZXN0cm95ZWQgKi8KLQlhdG9taWNfdCBSZWZDb3VudDsKKwlhdG9taWNfdCByZWZfY291bnQ7CiAKLQlhdG9taWNfdCBOdW1PdXRzdGFuZGluZ1JlcXVlc3RzOworCWF0b21pY190IG51bV9vdXRzdGFuZGluZ19yZXE7CiAKIAkvKgogCSAqIEVhY2ggdW5pcXVlIFBvcnQvUGF0aC9UYXJnZXQgcmVwcmVzZW50cyAxIGNoYW5uZWwgaWUgc2NzaQogCSAqIGNvbnRyb2xsZXIuIEluIHJlYWxpdHksIHRoZSBwYXRoaWQsIHRhcmdldGlkIGlzIGFsd2F5cyAwCiAJICogYW5kIHRoZSBwb3J0IGlzIHNldCBieSB1cwogCSAqLwotCXVuc2lnbmVkIGludCBQb3J0TnVtYmVyOwotCXVuc2lnbmVkIGNoYXIgUGF0aElkOwotCXVuc2lnbmVkIGNoYXIgVGFyZ2V0SWQ7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKIAogCS8qIExJU1RfRU5UUlkgT3V0c3RhbmRpbmdSZXF1ZXN0TGlzdDsgKi8KIAkvKiBIQU5ETEUgT3V0c3RhbmRpbmdSZXF1ZXN0TG9jazsgKi8KIAogCS8qIFVzZWQgZm9yIHZzYy92c3AgY2hhbm5lbCByZXNldCBwcm9jZXNzICovCi0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gSW5pdFJlcXVlc3Q7Ci0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gUmVzZXRSZXF1ZXN0OworCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIGluaXRfcmVxdWVzdDsKKwlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiByZXNldF9yZXF1ZXN0OwogfTsKIAogCi1zdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAic3RvcnZzYyI7CitzdGF0aWMgY29uc3QgY2hhciAqZ19kcml2ZXJfbmFtZSA9ICJzdG9ydnNjIjsKIAogLyoge2JhNjE2M2Q5LTA0YTEtNGQyOS1iNjA1LTcyZTJmZmIxZGM3Zn0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBnU3RvclZzY0RldmljZVR5cGUgPSB7CkBAIC04MSwxMzEgKzgxLDEzMyBAQAogfTsKIAogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqQWxsb2NTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICphbGxvY19zdG9yX2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0b3J2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdG9yRGV2aWNlKQorCXN0b3JfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0b3J2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdG9yX2RldmljZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBTZXQgdG8gMiB0byBhbGxvdyBib3RoIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWNzICovCi0JLyogKGllIEdldFN0b3JEZXZpY2UoKSBhbmQgTXVzdEdldFN0b3JEZXZpY2UoKSkgdG8gcHJvY2VlZC4gKi8KLQlhdG9taWNfY21weGNoZygmc3RvckRldmljZS0+UmVmQ291bnQsIDAsIDIpOworCS8qIChpZSBnZXRfc3Rvcl9kZXZpY2UoKSBhbmQgbXVzdF9nZXRfc3Rvcl9kZXZpY2UoKSkgdG8gcHJvY2VlZC4gKi8KKwlhdG9taWNfY21weGNoZygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCwgMCwgMik7CiAKLQlzdG9yRGV2aWNlLT5EZXZpY2UgPSBEZXZpY2U7Ci0JRGV2aWNlLT5FeHRlbnNpb24gPSBzdG9yRGV2aWNlOworCXN0b3JfZGV2aWNlLT5kZXZpY2UgPSBkZXZpY2U7CisJZGV2aWNlLT5FeHRlbnNpb24gPSBzdG9yX2RldmljZTsKIAotCXJldHVybiBzdG9yRGV2aWNlOworCXJldHVybiBzdG9yX2RldmljZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEZyZWVTdG9yRGV2aWNlKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc3Rvcl9kZXZpY2Uoc3RydWN0IHN0b3J2c2NfZGV2aWNlICpkZXZpY2UpCiB7Ci0JLyogQVNTRVJUKGF0b21pY19yZWFkKCZEZXZpY2UtPlJlZkNvdW50KSA9PSAwKTsgKi8KLQlrZnJlZShEZXZpY2UpOworCS8qIEFTU0VSVChhdG9taWNfcmVhZCgmZGV2aWNlLT5yZWZfY291bnQpID09IDApOyAqLworCWtmcmVlKGRldmljZSk7CiB9CiAKIC8qIEdldCB0aGUgc3RvcmRldmljZSBvYmplY3QgaWZmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKkdldFN0b3JEZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKmdldF9zdG9yX2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCWlmIChzdG9yRGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5SZWZDb3VudCkgPiAxKQotCQlhdG9taWNfaW5jKCZzdG9yRGV2aWNlLT5SZWZDb3VudCk7CisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJaWYgKHN0b3JfZGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSA+IDEpCisJCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpOwogCWVsc2UKLQkJc3RvckRldmljZSA9IE5VTEw7CisJCXN0b3JfZGV2aWNlID0gTlVMTDsKIAotCXJldHVybiBzdG9yRGV2aWNlOworCXJldHVybiBzdG9yX2RldmljZTsKIH0KIAogLyogR2V0IHRoZSBzdG9yZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAwICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqTXVzdEdldFN0b3JEZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKm11c3RfZ2V0X3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCWlmIChzdG9yRGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5SZWZDb3VudCkpCi0JCWF0b21pY19pbmMoJnN0b3JEZXZpY2UtPlJlZkNvdW50KTsKKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwlpZiAoc3Rvcl9kZXZpY2UgJiYgYXRvbWljX3JlYWQoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpKQorCQlhdG9taWNfaW5jKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KTsKIAllbHNlCi0JCXN0b3JEZXZpY2UgPSBOVUxMOworCQlzdG9yX2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gc3RvckRldmljZTsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBQdXRTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc3Rvcl9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQkvKiBBU1NFUlQoc3RvckRldmljZSk7ICovCisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJLyogQVNTRVJUKHN0b3JfZGV2aWNlKTsgKi8KIAotCWF0b21pY19kZWMoJnN0b3JEZXZpY2UtPlJlZkNvdW50KTsKLQkvKiBBU1NFUlQoYXRvbWljX3JlYWQoJnN0b3JEZXZpY2UtPlJlZkNvdW50KSk7ICovCisJYXRvbWljX2RlYygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCk7CisJLyogQVNTRVJUKGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSk7ICovCiB9CiAKLS8qIERyb3AgcmVmIGNvdW50IHRvIDEgdG8gZWZmZWN0aXZlbHkgZGlzYWJsZSBHZXRTdG9yRGV2aWNlKCkgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpSZWxlYXNlU3RvckRldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCisvKiBEcm9wIHJlZiBjb3VudCB0byAxIHRvIGVmZmVjdGl2ZWx5IGRpc2FibGUgZ2V0X3N0b3JfZGV2aWNlKCkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpyZWxlYXNlX3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCS8qIEFTU0VSVChzdG9yRGV2aWNlKTsgKi8KKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwkvKiBBU1NFUlQoc3Rvcl9kZXZpY2UpOyAqLwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAyLCB0aGVuIHNldCBpdCB0byAxICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yRGV2aWNlLT5SZWZDb3VudCwgMiwgMSkgIT0gMikKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDIsIDEpICE9IDIpCiAJCXVkZWxheSgxMDApOwogCi0JcmV0dXJuIHN0b3JEZXZpY2U7CisJcmV0dXJuIHN0b3JfZGV2aWNlOwogfQogCi0vKiBEcm9wIHJlZiBjb3VudCB0byAwLiBObyBvbmUgY2FuIHVzZSBTdG9yRGV2aWNlIG9iamVjdC4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpGaW5hbFJlbGVhc2VTdG9yRGV2aWNlKAotCQkJc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorLyogRHJvcCByZWYgY291bnQgdG8gMC4gTm8gb25lIGNhbiB1c2Ugc3Rvcl9kZXZpY2Ugb2JqZWN0LiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKmZpbmFsX3JlbGVhc2Vfc3Rvcl9kZXZpY2UoCisJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCS8qIEFTU0VSVChzdG9yRGV2aWNlKTsgKi8KKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwkvKiBBU1NFUlQoc3Rvcl9kZXZpY2UpOyAqLwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAxLCB0aGVuIHNldCBpdCB0byAwICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yRGV2aWNlLT5SZWZDb3VudCwgMSwgMCkgIT0gMSkKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDEsIDApICE9IDEpCiAJCXVkZWxheSgxMDApOwogCi0JRGV2aWNlLT5FeHRlbnNpb24gPSBOVUxMOwotCXJldHVybiBzdG9yRGV2aWNlOworCWRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKLXN0YXRpYyBpbnQgU3RvclZzY0NoYW5uZWxJbml0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgc3Rvcl92c2NfY2hhbm5lbF9pbml0KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKLQlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3RvclBhY2tldDsKKwlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQ7CiAJaW50IHJldDsKIAotCXN0b3JEZXZpY2UgPSBHZXRTdG9yRGV2aWNlKERldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJlcXVlc3QgPSAmc3RvckRldmljZS0+SW5pdFJlcXVlc3Q7Ci0JdnN0b3JQYWNrZXQgPSAmcmVxdWVzdC0+VlN0b3JQYWNrZXQ7CisJcmVxdWVzdCA9ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0OworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQ7CiAKIAkvKgogCSAqIE5vdywgaW5pdGlhdGUgdGhlIHZzYy92c3AgaW5pdGlhbGl6YXRpb24gcHJvdG9jb2wgb24gdGhlIG9wZW4KIAkgKiBjaGFubmVsCiAJICovCiAJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbikpOwotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghcmVxdWVzdC0+d2FpdF9ldmVudCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG5vbWVtOwogCX0KIAotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvbkJlZ2luSW5pdGlhbGl6YXRpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fQkVHSU5fSU5JVElBTElaQVRJT047CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwogCiAJLypTcGlubG9ja0FjcXVpcmUoZ0RyaXZlckV4dC5wYWNrZXRMaXN0TG9jayk7CiAJSU5TRVJUX1RBSUxfTElTVCgmZ0RyaXZlckV4dC5wYWNrZXRMaXN0LCAmcGFja2V0LT5saXN0RW50cnkuZW50cnkpOwpAQCAtMjEzLDcgKzIxNSw3IEBACiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiQkVHSU5fSU5JVElBTElaQVRJT05fT1BFUkFUSU9OLi4uIik7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLApAQCAtMjI0LDI3ICsyMjYsMjcgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJCRUdJTl9JTklUSUFMSVpBVElPTl9PUEVSQVRJT04gZmFpbGVkICIKIAkJCSAgICIob3AgJWQgc3RhdHVzIDB4JXgpIiwKLQkJCSAgIHZzdG9yUGFja2V0LT5PcGVyYXRpb24sIHZzdG9yUGFja2V0LT5TdGF0dXMpOworCQkJICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24sIHZzdG9yX3BhY2tldC0+c3RhdHVzKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJRVUVSWV9QUk9UT0NPTF9WRVJTSU9OX09QRVJBVElPTi4uLiIpOwogCiAJLyogcmV1c2UgdGhlIHBhY2tldCBmb3IgdmVyc2lvbiByYW5nZSBzdXBwb3J0ZWQgKi8KLQltZW1zZXQodnN0b3JQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uUXVlcnlQcm90b2NvbFZlcnNpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9UT0NPTF9WRVJTSU9OOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAotCXZzdG9yUGFja2V0LT5WZXJzaW9uLk1ham9yTWlub3IgPSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOwotCUZJTExfVk1TVE9SX1JFVklTSU9OKHZzdG9yUGFja2V0LT5WZXJzaW9uLlJldmlzaW9uKTsKKwl2c3Rvcl9wYWNrZXQtPnZlcnNpb24ubWFqb3JfbWlub3IgPSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOworCUZJTExfVk1TVE9SX1JFVklTSU9OKHZzdG9yX3BhY2tldC0+dmVyc2lvbi5yZXZpc2lvbik7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLApAQCAtMjU1LDI3ICsyNTcsMjcgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCiAJLyogVE9ETzogQ2hlY2sgcmV0dXJuZWQgdmVyc2lvbiAqLwotCWlmICh2c3RvclBhY2tldC0+T3BlcmF0aW9uICE9IFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbyB8fAotCSAgICB2c3RvclBhY2tldC0+U3RhdHVzICE9IDApIHsKKwlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8CisJICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiUVVFUllfUFJPVE9DT0xfVkVSU0lPTl9PUEVSQVRJT04gZmFpbGVkICIKIAkJCSAgICIob3AgJWQgc3RhdHVzIDB4JXgpIiwKLQkJCSAgIHZzdG9yUGFja2V0LT5PcGVyYXRpb24sIHZzdG9yUGFja2V0LT5TdGF0dXMpOworCQkJICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24sIHZzdG9yX3BhY2tldC0+c3RhdHVzKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIFF1ZXJ5IGNoYW5uZWwgcHJvcGVydGllcyAqLwogCURQUklOVF9JTkZPKFNUT1JWU0MsICJRVUVSWV9QUk9QRVJUSUVTX09QRVJBVElPTi4uLiIpOwogCi0JbWVtc2V0KHZzdG9yUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvcGVydGllczsKLQl2c3RvclBhY2tldC0+RmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKLQl2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLlBvcnROdW1iZXIgPQotCQkJCQlzdG9yRGV2aWNlLT5Qb3J0TnVtYmVyOworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPUEVSVElFUzsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy5wb3J0X251bWJlciA9CisJCQkJCXN0b3JfZGV2aWNlLT5wb3J0X251bWJlcjsKIAotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCkBAIC0yODcsMzEgKzI4OSwzMiBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAKIAkvKiBUT0RPOiBDaGVjayByZXR1cm5lZCB2ZXJzaW9uICovCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJRVUVSWV9QUk9QRVJUSUVTX09QRVJBVElPTiBmYWlsZWQgIgogCQkJICAgIihvcCAlZCBzdGF0dXMgMHgleCkiLAotCQkJICAgdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiwgdnN0b3JQYWNrZXQtPlN0YXR1cyk7CisJCQkgICB2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiwgdnN0b3JfcGFja2V0LT5zdGF0dXMpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jc3RvckRldmljZS0+UGF0aElkID0gdnN0b3JQYWNrZXQtPlN0b3JhZ2VDaGFubmVsUHJvcGVydGllcy5QYXRoSWQ7Ci0Jc3RvckRldmljZS0+VGFyZ2V0SWQgPSB2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLlRhcmdldElkOworCXN0b3JfZGV2aWNlLT5wYXRoX2lkID0gdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy5wYXRoX2lkOworCXN0b3JfZGV2aWNlLT50YXJnZXRfaWQKKwkJPSB2c3Rvcl9wYWNrZXQtPnN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzLnRhcmdldF9pZDsKIAogCURQUklOVF9EQkcoU1RPUlZTQywgImNoYW5uZWwgZmxhZyAweCV4LCBtYXggeGZlciBsZW4gMHgleCIsCi0JCSAgIHZzdG9yUGFja2V0LT5TdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXMuRmxhZ3MsCi0JCSAgIHZzdG9yUGFja2V0LT5TdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXMuTWF4VHJhbnNmZXJCeXRlcyk7CisJCSAgIHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMuZmxhZ3MsCisJCSAgIHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMubWF4X3RyYW5zZmVyX2J5dGVzKTsKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJFTkRfSU5JVElBTElaQVRJT05fT1BFUkFUSU9OLi4uIik7CiAKLQltZW1zZXQodnN0b3JQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uRW5kSW5pdGlhbGl6YXRpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9FTkRfSU5JVElBTElaQVRJT047CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwogCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIHZzdG9yUGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKQEAgLTMyMywxMjUgKzMyNiwxMjUgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJFTkRfSU5JVElBTElaQVRJT05fT1BFUkFUSU9OIGZhaWxlZCAiCiAJCQkgICAiKG9wICVkIHN0YXR1cyAweCV4KSIsCi0JCQkgICB2c3RvclBhY2tldC0+T3BlcmF0aW9uLCB2c3RvclBhY2tldC0+U3RhdHVzKTsKKwkJCSAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uLCB2c3Rvcl9wYWNrZXQtPnN0YXR1cyk7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiKioqKiBzdG9yYWdlIGNoYW5uZWwgdXAgYW5kIHJ1bm5pbmchISAqKioqIik7CiAKIENsZWFudXA6Ci0Ja2ZyZWUocmVxdWVzdC0+V2FpdEV2ZW50KTsKLQlyZXF1ZXN0LT5XYWl0RXZlbnQgPSBOVUxMOworCWtmcmVlKHJlcXVlc3QtPndhaXRfZXZlbnQpOworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBOVUxMOwogbm9tZW06Ci0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIFN0b3JWc2NPbklPQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICpWU3RvclBhY2tldCwKLQkJCQkgIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpSZXF1ZXN0RXh0KQorc3RhdGljIHZvaWQgc3Rvcl92c2Nfb25faW9fY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQsCisJCQkJICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdF9leHQpCiB7CiAJc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdDsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAotCXN0b3JEZXZpY2UgPSBNdXN0R2V0U3RvckRldmljZShEZXZpY2UpOwotCWlmICghc3RvckRldmljZSkgeworCXN0b3JfZGV2aWNlID0gbXVzdF9nZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwogCX0KIAogCURQUklOVF9EQkcoU1RPUlZTQywgIklPX0NPTVBMRVRFX09QRVJBVElPTiAtIHJlcXVlc3QgZXh0ZW5zaW9uICVwICIKLQkJICAgImNvbXBsZXRlZCBieXRlcyB4ZmVyICV1IiwgUmVxdWVzdEV4dCwKLQkJICAgVlN0b3JQYWNrZXQtPlZtU3JiLkRhdGFUcmFuc2Zlckxlbmd0aCk7CisJCSAgICJjb21wbGV0ZWQgYnl0ZXMgeGZlciAldSIsIHJlcXVlc3RfZXh0LAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aCk7CiAKLQkvKiBBU1NFUlQoUmVxdWVzdEV4dCAhPSBOVUxMKTsgKi8KLQkvKiBBU1NFUlQoUmVxdWVzdEV4dC0+UmVxdWVzdCAhPSBOVUxMKTsgKi8KKwkvKiBBU1NFUlQocmVxdWVzdF9leHQgIT0gTlVMTCk7ICovCisJLyogQVNTRVJUKHJlcXVlc3RfZXh0LT5yZXF1ZXN0ICE9IE5VTEwpOyAqLwogCi0JcmVxdWVzdCA9IFJlcXVlc3RFeHQtPlJlcXVlc3Q7CisJcmVxdWVzdCA9IHJlcXVlc3RfZXh0LT5yZXF1ZXN0OwogCiAJLyogQVNTRVJUKHJlcXVlc3QtPk9uSU9Db21wbGV0aW9uICE9IE5VTEwpOyAqLwogCiAJLyogQ29weSBvdmVyIHRoZSBzdGF0dXMuLi5ldGMgKi8KLQlyZXF1ZXN0LT5TdGF0dXMgPSBWU3RvclBhY2tldC0+Vm1TcmIuU2NzaVN0YXR1czsKKwlyZXF1ZXN0LT5zdGF0dXMgPSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1czsKIAotCWlmIChyZXF1ZXN0LT5TdGF0dXMgIT0gMCB8fCBWU3RvclBhY2tldC0+Vm1TcmIuU3JiU3RhdHVzICE9IDEpIHsKKwlpZiAocmVxdWVzdC0+c3RhdHVzICE9IDAgfHwgdnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAhPSAxKSB7CiAJCURQUklOVF9XQVJOKFNUT1JWU0MsCiAJCQkgICAgImNtZCAweCV4IHNjc2kgc3RhdHVzIDB4JXggc3JiIHN0YXR1cyAweCV4XG4iLAotCQkJICAgIHJlcXVlc3QtPkNkYlswXSwgVlN0b3JQYWNrZXQtPlZtU3JiLlNjc2lTdGF0dXMsCi0JCQkgICAgVlN0b3JQYWNrZXQtPlZtU3JiLlNyYlN0YXR1cyk7CisJCQkgICAgcmVxdWVzdC0+Y2RiWzBdLCB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1cywKKwkJCSAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zcmJfc3RhdHVzKTsKIAl9CiAKLQlpZiAoKHJlcXVlc3QtPlN0YXR1cyAmIDB4RkYpID09IDB4MDIpIHsKKwlpZiAoKHJlcXVlc3QtPnN0YXR1cyAmIDB4RkYpID09IDB4MDIpIHsKIAkJLyogQ0hFQ0tfQ09ORElUSU9OICovCi0JCWlmIChWU3RvclBhY2tldC0+Vm1TcmIuU3JiU3RhdHVzICYgMHg4MCkgeworCQlpZiAodnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAmIDB4ODApIHsKIAkJCS8qIGF1dG9zZW5zZSBkYXRhIGF2YWlsYWJsZSAqLwogCQkJRFBSSU5UX1dBUk4oU1RPUlZTQywgInN0b3J2c2MgcGt0ICVwIGF1dG9zZW5zZSBkYXRhICIKLQkJCQkgICAgInZhbGlkIC0gbGVuICVkXG4iLCBSZXF1ZXN0RXh0LAotCQkJCSAgICBWU3RvclBhY2tldC0+Vm1TcmIuU2Vuc2VJbmZvTGVuZ3RoKTsKKwkJCQkgICAgInZhbGlkIC0gbGVuICVkXG4iLCByZXF1ZXN0X2V4dCwKKwkJCQkgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGgpOwogCi0JCQkvKiBBU1NFUlQoVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCA8PSAqLworCQkJLyogQVNTRVJUKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoIDw9ICovCiAJCQkvKiAJcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplKTsgKi8KLQkJCW1lbWNweShyZXF1ZXN0LT5TZW5zZUJ1ZmZlciwKLQkJCSAgICAgICBWU3RvclBhY2tldC0+Vm1TcmIuU2Vuc2VEYXRhLAotCQkJICAgICAgIFZTdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGgpOworCQkJbWVtY3B5KHJlcXVlc3QtPnNlbnNlX2J1ZmZlciwKKwkJCSAgICAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9kYXRhLAorCQkJICAgICAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoKTsKIAotCQkJcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplID0KLQkJCQkJVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aDsKKwkJCXJlcXVlc3QtPnNlbnNlX2J1ZmZlcl9zaXplID0KKwkJCQkJdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGg7CiAJCX0KIAl9CiAKIAkvKiBUT0RPOiAqLwotCXJlcXVlc3QtPkJ5dGVzWGZlciA9IFZTdG9yUGFja2V0LT5WbVNyYi5EYXRhVHJhbnNmZXJMZW5ndGg7CisJcmVxdWVzdC0+Ynl0ZXNfeGZlciA9IHZzdG9yX3BhY2tldC0+dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoOwogCi0JcmVxdWVzdC0+T25JT0NvbXBsZXRpb24ocmVxdWVzdCk7CisJcmVxdWVzdC0+b25faW9fY29tcGxldGlvbihyZXF1ZXN0KTsKIAotCWF0b21pY19kZWMoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpOworCWF0b21pY19kZWMoJnN0b3JfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVxKTsKIAotCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIHZvaWQgU3RvclZzY09uUmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkgICAgIHN0cnVjdCB2c3Rvcl9wYWNrZXQgKlZTdG9yUGFja2V0LAotCQkJICAgICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqUmVxdWVzdEV4dCkKK3N0YXRpYyB2b2lkIHN0b3JfdnNjX29uX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQsCisJCQkgICAgIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpyZXF1ZXN0X2V4dCkKIHsKLQlzd2l0Y2ggKFZTdG9yUGFja2V0LT5PcGVyYXRpb24pIHsKLQljYXNlIFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbzoKKwlzd2l0Y2ggKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uKSB7CisJY2FzZSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU86CiAJCURQUklOVF9EQkcoU1RPUlZTQywgIklPX0NPTVBMRVRFX09QRVJBVElPTiIpOwotCQlTdG9yVnNjT25JT0NvbXBsZXRpb24oRGV2aWNlLCBWU3RvclBhY2tldCwgUmVxdWVzdEV4dCk7CisJCXN0b3JfdnNjX29uX2lvX2NvbXBsZXRpb24oZGV2aWNlLCB2c3Rvcl9wYWNrZXQsIHJlcXVlc3RfZXh0KTsKIAkJYnJlYWs7Ci0JY2FzZSBWU3Rvck9wZXJhdGlvblJlbW92ZURldmljZToKKwljYXNlIFZTVE9SX09QRVJBVElPTl9SRU1PVkVfREVWSUNFOgogCQlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiUkVNT1ZFX0RFVklDRV9PUEVSQVRJT04iKTsKIAkJLyogVE9ETzogKi8KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiVW5rbm93biBvcGVyYXRpb24gcmVjZWl2ZWQgLSAlZCIsCi0JCQkgICAgVlN0b3JQYWNrZXQtPk9wZXJhdGlvbik7CisJCQkgICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24pOwogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFN0b3JWc2NPbkNoYW5uZWxDYWxsYmFjayh2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgc3Rvcl92c2Nfb25fY2hhbm5lbF9jYWxsYmFjayh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgaHZfZGV2aWNlICopY29udGV4dDsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7Ci0JdTMyIGJ5dGVzUmVjdmQ7Ci0JdTY0IHJlcXVlc3RJZDsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOworCXUzMiBieXRlc19yZWN2ZDsKKwl1NjQgcmVxdWVzdF9pZDsKIAl1bnNpZ25lZCBjaGFyIHBhY2tldFtBTElHTl9VUChzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksIDgpXTsKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKIAlpbnQgcmV0OwogCiAJLyogQVNTRVJUKGRldmljZSk7ICovCiAKLQlzdG9yRGV2aWNlID0gTXVzdEdldFN0b3JEZXZpY2UoZGV2aWNlKTsKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlzdG9yX2RldmljZSA9IG11c3RfZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKQEAgLTQ1MCwzMiArNDUzLDMzIEBACiAJZG8gewogCQlyZXQgPSB2bWJ1c19yZWN2cGFja2V0KGRldmljZS0+Y2hhbm5lbCwgcGFja2V0LAogCQkJCSAgICAgICBBTElHTl9VUChzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksIDgpLAotCQkJCSAgICAgICAmYnl0ZXNSZWN2ZCwgJnJlcXVlc3RJZCk7Ci0JCWlmIChyZXQgPT0gMCAmJiBieXRlc1JlY3ZkID4gMCkgeworCQkJCSAgICAgICAmYnl0ZXNfcmVjdmQsICZyZXF1ZXN0X2lkKTsKKwkJaWYgKHJldCA9PSAwICYmIGJ5dGVzX3JlY3ZkID4gMCkgewogCQkJRFBSSU5UX0RCRyhTVE9SVlNDLCAicmVjZWl2ZSAlZCBieXRlcyAtIHRpZCAlbGx4IiwKLQkJCQkgICBieXRlc1JlY3ZkLCByZXF1ZXN0SWQpOworCQkJCSAgIGJ5dGVzX3JlY3ZkLCByZXF1ZXN0X2lkKTsKIAotCQkJLyogQVNTRVJUKGJ5dGVzUmVjdmQgPT0gc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsgKi8KKwkJCS8qIEFTU0VSVChieXRlc19yZWN2ZCA9PQorCQkJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOyAqLwogCiAJCQlyZXF1ZXN0ID0gKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICopCi0JCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3RJZDsKKwkJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9pZDsKIAkJCS8qIEFTU0VSVChyZXF1ZXN0KTtjICovCiAKLQkJCS8qIGlmICh2c3RvclBhY2tldC5GbGFncyAmIFNZTlRIRVRJQ19GTEFHKSAqLwotCQkJaWYgKChyZXF1ZXN0ID09ICZzdG9yRGV2aWNlLT5Jbml0UmVxdWVzdCkgfHwKLQkJCSAgICAocmVxdWVzdCA9PSAmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0KSkgeworCQkJLyogaWYgKHZzdG9yX3BhY2tldC5GbGFncyAmIFNZTlRIRVRJQ19GTEFHKSAqLworCQkJaWYgKChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0KSB8fAorCQkJICAgIChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdCkpIHsKIAkJCQkvKiBEUFJJTlRfSU5GTyhTVE9SVlNDLAogCQkJCSAqICAgICAgICAgICAgICJyZXNldCBjb21wbGV0aW9uIC0gb3BlcmF0aW9uICIKIAkJCQkgKiAgICAgICAgICAgICAiJXUgc3RhdHVzICV1IiwKLQkJCQkgKiAgICAgICAgICAgICB2c3RvclBhY2tldC5PcGVyYXRpb24sCi0JCQkJICogICAgICAgICAgICAgdnN0b3JQYWNrZXQuU3RhdHVzKTsgKi8KKwkJCQkgKiAgICAgICAgICAgICB2c3Rvcl9wYWNrZXQuT3BlcmF0aW9uLAorCQkJCSAqICAgICAgICAgICAgIHZzdG9yX3BhY2tldC5TdGF0dXMpOyAqLwogCi0JCQkJbWVtY3B5KCZyZXF1ZXN0LT5WU3RvclBhY2tldCwgcGFja2V0LAorCQkJCW1lbWNweSgmcmVxdWVzdC0+dnN0b3JfcGFja2V0LCBwYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CiAKLQkJCQlvc2RfV2FpdEV2ZW50U2V0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJCQkJb3NkX3dhaXRldmVudF9zZXQocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAJCQl9IGVsc2UgewotCQkJCVN0b3JWc2NPblJlY2VpdmUoZGV2aWNlLAorCQkJCXN0b3JfdnNjX29uX3JlY2VpdmUoZGV2aWNlLAogCQkJCQkJKHN0cnVjdCB2c3Rvcl9wYWNrZXQgKilwYWNrZXQsCiAJCQkJCQlyZXF1ZXN0KTsKIAkJCX0KQEAgLTQ4NSw1MiArNDg5LDU1IEBACiAJCX0KIAl9IHdoaWxlICgxKTsKIAotCVB1dFN0b3JEZXZpY2UoZGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgU3RvclZzY0Nvbm5lY3RUb1ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHN0b3JfdnNjX2Nvbm5lY3RfdG9fdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBwcm9wczsKLQlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOworCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3JfZHJpdmVyOwogCWludCByZXQ7CiAKLQlzdG9yRHJpdmVyID0gKHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKilEZXZpY2UtPkRyaXZlcjsKKwlzdG9yX2RyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopZGV2aWNlLT5Ecml2ZXI7CiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CiAKIAkvKiBPcGVuIHRoZSBjaGFubmVsICovCi0JcmV0ID0gdm1idXNfb3BlbihEZXZpY2UtPmNoYW5uZWwsCi0JCQkgc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUsIHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplLAorCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLAorCQkJIHN0b3JfZHJpdmVyLT5yaW5nX2J1ZmZlcl9zaXplLAorCQkJIHN0b3JfZHJpdmVyLT5yaW5nX2J1ZmZlcl9zaXplLAogCQkJICh2b2lkICopJnByb3BzLAogCQkJIHNpemVvZihzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyksCi0JCQkgU3RvclZzY09uQ2hhbm5lbENhbGxiYWNrLCBEZXZpY2UpOworCQkJIHN0b3JfdnNjX29uX2NoYW5uZWxfY2FsbGJhY2ssIGRldmljZSk7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzdG9yYWdlIHByb3BzOiBwYXRoIGlkICVkLCB0Z3QgaWQgJWQsIG1heCB4ZmVyICVkIiwKLQkJICAgcHJvcHMuUGF0aElkLCBwcm9wcy5UYXJnZXRJZCwgcHJvcHMuTWF4VHJhbnNmZXJCeXRlcyk7CisJCSAgIHByb3BzLnBhdGhfaWQsIHByb3BzLnRhcmdldF9pZCwgcHJvcHMubWF4X3RyYW5zZmVyX2J5dGVzKTsKIAogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZCIsIHJldCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXQgPSBTdG9yVnNjQ2hhbm5lbEluaXQoRGV2aWNlKTsKKwlyZXQgPSBzdG9yX3ZzY19jaGFubmVsX2luaXQoZGV2aWNlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMgZHJpdmVyIGlzIGFkZGVkCisgKiBzdG9yX3ZzY19vbl9kZXZpY2VfYWRkIC0gQ2FsbGJhY2sgd2hlbiB0aGUgZGV2aWNlIGJlbG9uZ2luZyB0byB0aGlzIGRyaXZlcgorICogaXMgYWRkZWQKICAqLwotc3RhdGljIGludCBTdG9yVnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgc3Rvcl92c2Nfb25fZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJCXZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAkvKiBzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyAqcHJvcHM7ICovCi0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZUluZm87CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOwogCWludCByZXQgPSAwOwogCi0JZGV2aWNlSW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKUFkZGl0aW9uYWxJbmZvOwotCXN0b3JEZXZpY2UgPSBBbGxvY1N0b3JEZXZpY2UoRGV2aWNlKTsKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlkZXZpY2VfaW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKWFkZGl0aW9uYWxfaW5mbzsKKwlzdG9yX2RldmljZSA9IGFsbG9jX3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTU1MCwxMDMgKzU1NywxMDMgQEAKIAlzdG9yQ2hhbm5lbC0+UGF0aElkID0gcHJvcHMtPlBhdGhJZDsKIAlzdG9yQ2hhbm5lbC0+VGFyZ2V0SWQgPSBwcm9wcy0+VGFyZ2V0SWQ7ICovCiAKLQlzdG9yRGV2aWNlLT5Qb3J0TnVtYmVyID0gZGV2aWNlSW5mby0+UG9ydE51bWJlcjsKKwlzdG9yX2RldmljZS0+cG9ydF9udW1iZXIgPSBkZXZpY2VfaW5mby0+cG9ydF9udW1iZXI7CiAJLyogU2VuZCBpdCBiYWNrIHVwICovCi0JcmV0ID0gU3RvclZzY0Nvbm5lY3RUb1ZzcChEZXZpY2UpOworCXJldCA9IHN0b3JfdnNjX2Nvbm5lY3RfdG9fdnNwKGRldmljZSk7CiAKLQkvKiBkZXZpY2VJbmZvLT5Qb3J0TnVtYmVyID0gc3RvckRldmljZS0+UG9ydE51bWJlcjsgKi8KLQlkZXZpY2VJbmZvLT5QYXRoSWQgPSBzdG9yRGV2aWNlLT5QYXRoSWQ7Ci0JZGV2aWNlSW5mby0+VGFyZ2V0SWQgPSBzdG9yRGV2aWNlLT5UYXJnZXRJZDsKKwkvKiBkZXZpY2VfaW5mby0+UG9ydE51bWJlciA9IHN0b3JfZGV2aWNlLT5Qb3J0TnVtYmVyOyAqLworCWRldmljZV9pbmZvLT5wYXRoX2lkID0gc3Rvcl9kZXZpY2UtPnBhdGhfaWQ7CisJZGV2aWNlX2luZm8tPnRhcmdldF9pZCA9IHN0b3JfZGV2aWNlLT50YXJnZXRfaWQ7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJhc3NpZ25lZCBwb3J0ICV1LCBwYXRoICV1IHRhcmdldCAldVxuIiwKLQkJICAgc3RvckRldmljZS0+UG9ydE51bWJlciwgc3RvckRldmljZS0+UGF0aElkLAotCQkgICBzdG9yRGV2aWNlLT5UYXJnZXRJZCk7CisJCSAgIHN0b3JfZGV2aWNlLT5wb3J0X251bWJlciwgc3Rvcl9kZXZpY2UtPnBhdGhfaWQsCisJCSAgIHN0b3JfZGV2aWNlLT50YXJnZXRfaWQpOwogCiBDbGVhbnVwOgogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25EZXZpY2VSZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSBvdXIgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQKKyAqIHN0b3JfdnNjX29uX2RldmljZV9yZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSBvdXIgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQKICAqLwotc3RhdGljIGludCBTdG9yVnNjT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJkaXNhYmxpbmcgc3RvcmFnZSBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKLQlzdG9yRGV2aWNlID0gUmVsZWFzZVN0b3JEZXZpY2UoRGV2aWNlKTsKKwlzdG9yX2RldmljZSA9IHJlbGVhc2Vfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAogCS8qCiAJICogQXQgdGhpcyBwb2ludCwgYWxsIG91dGJvdW5kIHRyYWZmaWMgc2hvdWxkIGJlIGRpc2FibGUuIFdlCiAJICogb25seSBhbGxvdyBpbmJvdW5kIHRyYWZmaWMgKHJlc3BvbnNlcykgdG8gcHJvY2VlZCBzbyB0aGF0CiAJICogb3V0c3RhbmRpbmcgcmVxdWVzdHMgY2FuIGJlIGNvbXBsZXRlZC4KIAkgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpKSB7CisJd2hpbGUgKGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkpIHsKIAkJRFBSSU5UX0lORk8oU1RPUlZTQywgIndhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGNvbXBsZXRlLi4uIiwKLQkJCSAgICBhdG9taWNfcmVhZCgmc3RvckRldmljZS0+TnVtT3V0c3RhbmRpbmdSZXF1ZXN0cykpOworCQkJICAgIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAicmVtb3Zpbmcgc3RvcmFnZSBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKLQlzdG9yRGV2aWNlID0gRmluYWxSZWxlYXNlU3RvckRldmljZShEZXZpY2UpOworCXN0b3JfZGV2aWNlID0gZmluYWxfcmVsZWFzZV9zdG9yX2RldmljZShkZXZpY2UpOwogCi0JRFBSSU5UX0lORk8oU1RPUlZTQywgInN0b3JhZ2UgZGV2aWNlICglcCkgc2FmZSB0byByZW1vdmUiLCBzdG9yRGV2aWNlKTsKKwlEUFJJTlRfSU5GTyhTVE9SVlNDLCAic3RvcmFnZSBkZXZpY2UgKCVwKSBzYWZlIHRvIHJlbW92ZSIsIHN0b3JfZGV2aWNlKTsKIAogCS8qIENsb3NlIHRoZSBjaGFubmVsICovCi0Jdm1idXNfY2xvc2UoRGV2aWNlLT5jaGFubmVsKTsKKwl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwogCi0JRnJlZVN0b3JEZXZpY2Uoc3RvckRldmljZSk7CisJZnJlZV9zdG9yX2RldmljZShzdG9yX2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBTdG9yVnNjT25Ib3N0UmVzZXQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQoraW50IHN0b3JfdnNjX29uX2hvc3RfcmVzZXQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpyZXF1ZXN0OwotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yUGFja2V0OworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yX3BhY2tldDsKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgInJlc2V0dGluZyBob3N0IGFkYXB0ZXIuLi4iKTsKIAotCXN0b3JEZXZpY2UgPSBHZXRTdG9yRGV2aWNlKERldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJlcXVlc3QgPSAmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0OwotCXZzdG9yUGFja2V0ID0gJnJlcXVlc3QtPlZTdG9yUGFja2V0OworCXJlcXVlc3QgPSAmc3Rvcl9kZXZpY2UtPnJlc2V0X3JlcXVlc3Q7CisJdnN0b3JfcGFja2V0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKIAotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghcmVxdWVzdC0+d2FpdF9ldmVudCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uUmVzZXRCdXM7Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7Ci0JdnN0b3JQYWNrZXQtPlZtU3JiLlBhdGhJZCA9IHN0b3JEZXZpY2UtPlBhdGhJZDsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9SRVNFVF9CVVM7CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnBhdGhfaWQgPSBzdG9yX2RldmljZS0+cGF0aF9pZDsKIAotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLAogCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJVbmFibGUgdG8gc2VuZCByZXNldCBwYWNrZXQgJXAgcmV0ICVkIiwKLQkJCSAgIHZzdG9yUGFja2V0LCByZXQpOworCQkJICAgdnN0b3JfcGFja2V0LCByZXQpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJLyogRklYTUU6IEFkZCBhIHRpbWVvdXQgKi8KLQlvc2RfV2FpdEV2ZW50V2FpdChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChyZXF1ZXN0LT53YWl0X2V2ZW50KTsKIAotCWtmcmVlKHJlcXVlc3QtPldhaXRFdmVudCk7CisJa2ZyZWUocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAJRFBSSU5UX0lORk8oU1RPUlZTQywgImhvc3QgYWRhcHRlciByZXNldCBjb21wbGV0ZWQiKTsKIAogCS8qCkBAIC02NTUsMTE4ICs2NjIsMTE4IEBACiAJICovCiAKIENsZWFudXA6Ci0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25JT1JlcXVlc3QgLSBDYWxsYmFjayB0byBpbml0aWF0ZSBhbiBJL08gcmVxdWVzdAorICogc3Rvcl92c2Nfb25faW9fcmVxdWVzdCAtIENhbGxiYWNrIHRvIGluaXRpYXRlIGFuIEkvTyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgU3RvclZzY09uSU9SZXF1ZXN0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgICAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKlJlcXVlc3QpCitzdGF0aWMgaW50IHN0b3JfdnNjX29uX2lvX3JlcXVlc3Qoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7Ci0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3RFeHRlbnNpb247Ci0Jc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JQYWNrZXQ7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdF9leHRlbnNpb247CisJc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0OwogCWludCByZXQgPSAwOwogCi0JcmVxdWVzdEV4dGVuc2lvbiA9Ci0JCShzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqKVJlcXVlc3QtPkV4dGVuc2lvbjsKLQl2c3RvclBhY2tldCA9ICZyZXF1ZXN0RXh0ZW5zaW9uLT5WU3RvclBhY2tldDsKLQlzdG9yRGV2aWNlID0gR2V0U3RvckRldmljZShEZXZpY2UpOworCXJlcXVlc3RfZXh0ZW5zaW9uID0KKwkJKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICopcmVxdWVzdC0+ZXh0ZW5zaW9uOworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0X2V4dGVuc2lvbi0+dnN0b3JfcGFja2V0OworCXN0b3JfZGV2aWNlID0gZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJlbnRlciAtIERldmljZSAlcCwgRGV2aWNlRXh0ICVwLCBSZXF1ZXN0ICVwLCAiCi0JCSAgICJFeHRlbnNpb24gJXAiLCBEZXZpY2UsIHN0b3JEZXZpY2UsIFJlcXVlc3QsCi0JCSAgIHJlcXVlc3RFeHRlbnNpb24pOworCQkgICAiRXh0ZW5zaW9uICVwIiwgZGV2aWNlLCBzdG9yX2RldmljZSwgcmVxdWVzdCwKKwkJICAgcmVxdWVzdF9leHRlbnNpb24pOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAicmVxICVwIGxlbiAlZCBidXMgJWQsIHRhcmdldCAlZCwgbHVuICVkIGNkYmxlbiAlZCIsCi0JCSAgIFJlcXVlc3QsIFJlcXVlc3QtPkRhdGFCdWZmZXIuTGVuZ3RoLCBSZXF1ZXN0LT5CdXMsCi0JCSAgIFJlcXVlc3QtPlRhcmdldElkLCBSZXF1ZXN0LT5MdW5JZCwgUmVxdWVzdC0+Q2RiTGVuKTsKKwkJICAgcmVxdWVzdCwgcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoLCByZXF1ZXN0LT5idXMsCisJCSAgIHJlcXVlc3QtPnRhcmdldF9pZCwgcmVxdWVzdC0+bHVuX2lkLCByZXF1ZXN0LT5jZGJfbGVuKTsKIAotCWlmICghc3RvckRldmljZSkgeworCWlmICghc3Rvcl9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIGdldCBzdG9yIGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm4gLTI7CiAJfQogCi0JLyogcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsIFJlcXVlc3QtPkNkYiwKLQkgKgkJCVJlcXVlc3QtPkNkYkxlbik7ICovCisJLyogcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsIHJlcXVlc3QtPkNkYiwKKwkgKgkJCXJlcXVlc3QtPkNkYkxlbik7ICovCiAKLQlyZXF1ZXN0RXh0ZW5zaW9uLT5SZXF1ZXN0ID0gUmVxdWVzdDsKLQlyZXF1ZXN0RXh0ZW5zaW9uLT5EZXZpY2UgID0gRGV2aWNlOworCXJlcXVlc3RfZXh0ZW5zaW9uLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKwlyZXF1ZXN0X2V4dGVuc2lvbi0+ZGV2aWNlICA9IGRldmljZTsKIAotCW1lbXNldCh2c3RvclBhY2tldCwgMCAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CiAKLQl2c3RvclBhY2tldC0+RmxhZ3MgfD0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5mbGFncyB8PSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5MZW5ndGggPSBzaXplb2Yoc3RydWN0IHZtc2NzaV9yZXF1ZXN0KTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZtc2NzaV9yZXF1ZXN0KTsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5Qb3J0TnVtYmVyID0gUmVxdWVzdC0+SG9zdDsKLQl2c3RvclBhY2tldC0+Vm1TcmIuUGF0aElkID0gUmVxdWVzdC0+QnVzOwotCXZzdG9yUGFja2V0LT5WbVNyYi5UYXJnZXRJZCA9IFJlcXVlc3QtPlRhcmdldElkOwotCXZzdG9yUGFja2V0LT5WbVNyYi5MdW4gPSBSZXF1ZXN0LT5MdW5JZDsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5wb3J0X251bWJlciA9IHJlcXVlc3QtPmhvc3Q7CisJdnN0b3JfcGFja2V0LT52bV9zcmIucGF0aF9pZCA9IHJlcXVlc3QtPmJ1czsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi50YXJnZXRfaWQgPSByZXF1ZXN0LT50YXJnZXRfaWQ7CisJdnN0b3JfcGFja2V0LT52bV9zcmIubHVuID0gcmVxdWVzdC0+bHVuX2lkOwogCi0JdnN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCA9IFNFTlNFX0JVRkZFUl9TSVpFOworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoID0gU0VOU0VfQlVGRkVSX1NJWkU7CiAKIAkvKiBDb3B5IG92ZXIgdGhlIHNjc2kgY29tbWFuZCBkZXNjcmlwdG9yIGJsb2NrICovCi0JdnN0b3JQYWNrZXQtPlZtU3JiLkNkYkxlbmd0aCA9IFJlcXVlc3QtPkNkYkxlbjsKLQltZW1jcHkoJnZzdG9yUGFja2V0LT5WbVNyYi5DZGIsIFJlcXVlc3QtPkNkYiwgUmVxdWVzdC0+Q2RiTGVuKTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5jZGJfbGVuZ3RoID0gcmVxdWVzdC0+Y2RiX2xlbjsKKwltZW1jcHkoJnZzdG9yX3BhY2tldC0+dm1fc3JiLmNkYiwgcmVxdWVzdC0+Y2RiLCByZXF1ZXN0LT5jZGJfbGVuKTsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5EYXRhSW4gPSBSZXF1ZXN0LT5UeXBlOwotCXZzdG9yUGFja2V0LT5WbVNyYi5EYXRhVHJhbnNmZXJMZW5ndGggPSBSZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aDsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX2luID0gcmVxdWVzdC0+dHlwZTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IHJlcXVlc3QtPmRhdGFfYnVmZmVyLkxlbmd0aDsKIAotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvbkV4ZWN1dGVTUkI7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fRVhFQ1VURV9TUkI7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzcmIgLSBsZW4gJWQgcG9ydCAlZCwgcGF0aCAlZCwgdGFyZ2V0ICVkLCAiCiAJCSAgICJsdW4gJWQgc2Vuc2VsZW4gJWQgY2RibGVuICVkIiwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkxlbmd0aCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLlBvcnROdW1iZXIsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5QYXRoSWQsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5UYXJnZXRJZCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkx1biwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkNkYkxlbmd0aCk7CisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLmxlbmd0aCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIucG9ydF9udW1iZXIsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnBhdGhfaWQsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnRhcmdldF9pZCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIubHVuLAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIuY2RiX2xlbmd0aCk7CiAKLQlpZiAocmVxdWVzdEV4dGVuc2lvbi0+UmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGgpIHsKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldF9tdWx0aXBhZ2VidWZmZXIoRGV2aWNlLT5jaGFubmVsLAotCQkJCSZyZXF1ZXN0RXh0ZW5zaW9uLT5SZXF1ZXN0LT5EYXRhQnVmZmVyLAotCQkJCXZzdG9yUGFja2V0LAorCWlmIChyZXF1ZXN0X2V4dGVuc2lvbi0+cmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoKSB7CisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXRfbXVsdGlwYWdlYnVmZmVyKGRldmljZS0+Y2hhbm5lbCwKKwkJCQkmcmVxdWVzdF9leHRlbnNpb24tPnJlcXVlc3QtPmRhdGFfYnVmZmVyLAorCQkJCXZzdG9yX3BhY2tldCwKIAkJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCi0JCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdEV4dGVuc2lvbik7CisJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9leHRlbnNpb24pOwogCX0gZWxzZSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0RXh0ZW5zaW9uLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0X2V4dGVuc2lvbiwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAJfQogCiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9EQkcoU1RPUlZTQywgIlVuYWJsZSB0byBzZW5kIHBhY2tldCAlcCByZXQgJWQiLAotCQkJICAgdnN0b3JQYWNrZXQsIHJldCk7CisJCQkgICB2c3Rvcl9wYWNrZXQsIHJldCk7CiAJfQogCi0JYXRvbWljX2luYygmc3RvckRldmljZS0+TnVtT3V0c3RhbmRpbmdSZXF1ZXN0cyk7CisJYXRvbWljX2luYygmc3Rvcl9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZXEpOwogCi0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25DbGVhbnVwIC0gUGVyZm9ybSBhbnkgY2xlYW51cCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAorICogc3Rvcl92c2Nfb25fY2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKICAqLwotc3RhdGljIHZvaWQgU3RvclZzY09uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitzdGF0aWMgdm9pZCBzdG9yX3ZzY19vbl9jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcikKIHsKIH0KIAogLyoKLSAqIFN0b3JWc2NJbml0aWFsaXplIC0gTWFpbiBlbnRyeSBwb2ludAorICogc3Rvcl92c2NfaW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKICAqLwotaW50IFN0b3JWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKkRyaXZlcikKK2ludCBzdG9yX3ZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOworCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3JfZHJpdmVyOwogCi0Jc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRHJpdmVyOworCXN0b3JfZHJpdmVyID0gKHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKilkcml2ZXI7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzaXplb2YoU1RPUlZTQ19SRVFVRVNUKT0lemQgIgogCQkgICAic2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKT0lemQgIgpAQCAtNzc4LDEzICs3ODUsMTQgQEAKIAkJICAgc2l6ZW9mKHN0cnVjdCB2bXNjc2lfcmVxdWVzdCkpOwogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCi0JLyogQVNTRVJUKHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplID49IChQQUdFX1NJWkUgPDwgMSkpOyAqLworCS8qIEFTU0VSVChzdG9yX2RyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCiAKLQlEcml2ZXItPm5hbWUgPSBnRHJpdmVyTmFtZTsKLQltZW1jcHkoJkRyaXZlci0+ZGV2aWNlVHlwZSwgJmdTdG9yVnNjRGV2aWNlVHlwZSwKKwlkcml2ZXItPm5hbWUgPSBnX2RyaXZlcl9uYW1lOworCW1lbWNweSgmZHJpdmVyLT5kZXZpY2VUeXBlLCAmZ1N0b3JWc2NEZXZpY2VUeXBlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAotCXN0b3JEcml2ZXItPlJlcXVlc3RFeHRTaXplID0gc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKKwlzdG9yX2RyaXZlci0+cmVxdWVzdF9leHRfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24pOwogCiAJLyoKIAkgKiBEaXZpZGUgdGhlIHJpbmcgYnVmZmVyIGRhdGEgc2l6ZSAod2hpY2ggaXMgMSBwYWdlIGxlc3MKQEAgLTc5MiwyMiArODAwLDIyIEBACiAJICogdGhlIHJpbmcgYnVmZmVyIGluZGljZXMpIGJ5IHRoZSBtYXggcmVxdWVzdCBzaXplICh3aGljaCBpcwogCSAqIHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIgKyBzdHJ1Y3QgdnN0b3JfcGFja2V0ICsgdTY0KQogCSAqLwotCXN0b3JEcml2ZXItPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsID0KLQkJKChzdG9yRHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSAtIFBBR0VfU0laRSkgLworCXN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsID0KKwkJKChzdG9yX2RyaXZlci0+cmluZ19idWZmZXJfc2l6ZSAtIFBBR0VfU0laRSkgLwogCQkgIEFMSUdOX1VQKE1BWF9NVUxUSVBBR0VfQlVGRkVSX1BBQ0tFVCArCiAJCQkgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkgKyBzaXplb2YodTY0KSwKIAkJCSAgIHNpemVvZih1NjQpKSk7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAibWF4IGlvICV1LCBjdXJyZW50bHkgJXVcbiIsCi0JCSAgICBzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCwKKwkJICAgIHN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsLAogCQkgICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMpOwogCiAJLyogU2V0dXAgdGhlIGRpc3BhdGNoIHRhYmxlICovCi0Jc3RvckRyaXZlci0+QmFzZS5PbkRldmljZUFkZAk9IFN0b3JWc2NPbkRldmljZUFkZDsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlCT0gU3RvclZzY09uRGV2aWNlUmVtb3ZlOwotCXN0b3JEcml2ZXItPkJhc2UuT25DbGVhbnVwCT0gU3RvclZzY09uQ2xlYW51cDsKKwlzdG9yX2RyaXZlci0+YmFzZS5PbkRldmljZUFkZAk9IHN0b3JfdnNjX29uX2RldmljZV9hZGQ7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VSZW1vdmUJPSBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlOworCXN0b3JfZHJpdmVyLT5iYXNlLk9uQ2xlYW51cAk9IHN0b3JfdnNjX29uX2NsZWFudXA7CiAKLQlzdG9yRHJpdmVyLT5PbklPUmVxdWVzdAkJPSBTdG9yVnNjT25JT1JlcXVlc3Q7CisJc3Rvcl9kcml2ZXItPm9uX2lvX3JlcXVlc3QJPSBzdG9yX3ZzY19vbl9pb19yZXF1ZXN0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCmluZGV4IDg1MDVhMWMuLmZiZjU3NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCkBAIC01Myw1OCArNTMsNTggQEAKIH07CiAKIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgewotCWVudW0gc3RvcnZzY19yZXF1ZXN0X3R5cGUgVHlwZTsKLQl1MzIgSG9zdDsKLQl1MzIgQnVzOwotCXUzMiBUYXJnZXRJZDsKLQl1MzIgTHVuSWQ7Ci0JdTggKkNkYjsKLQl1MzIgQ2RiTGVuOwotCXUzMiBTdGF0dXM7Ci0JdTMyIEJ5dGVzWGZlcjsKKwllbnVtIHN0b3J2c2NfcmVxdWVzdF90eXBlIHR5cGU7CisJdTMyIGhvc3Q7CisJdTMyIGJ1czsKKwl1MzIgdGFyZ2V0X2lkOworCXUzMiBsdW5faWQ7CisJdTggKmNkYjsKKwl1MzIgY2RiX2xlbjsKKwl1MzIgc3RhdHVzOworCXUzMiBieXRlc194ZmVyOwogCi0JdW5zaWduZWQgY2hhciAqU2Vuc2VCdWZmZXI7Ci0JdTMyIFNlbnNlQnVmZmVyU2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpzZW5zZV9idWZmZXI7CisJdTMyIHNlbnNlX2J1ZmZlcl9zaXplOwogCi0Jdm9pZCAqQ29udGV4dDsKKwl2b2lkICpjb250ZXh0OwogCi0Jdm9pZCAoKk9uSU9Db21wbGV0aW9uKShzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpSZXF1ZXN0KTsKKwl2b2lkICgqb25faW9fY29tcGxldGlvbikoc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCk7CiAKIAkvKiBUaGlzIHBvaW50cyB0byB0aGUgbWVtb3J5IGFmdGVyIERhdGFCdWZmZXIgKi8KLQl2b2lkICpFeHRlbnNpb247CisJdm9pZCAqZXh0ZW5zaW9uOwogCi0Jc3RydWN0IGh2X211bHRpcGFnZV9idWZmZXIgRGF0YUJ1ZmZlcjsKKwlzdHJ1Y3QgaHZfbXVsdGlwYWdlX2J1ZmZlciBkYXRhX2J1ZmZlcjsKIH07CiAKIC8qIFJlcHJlc2VudHMgdGhlIGJsb2NrIHZzYyBkcml2ZXIgKi8KIHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgewogCS8qIE11c3QgYmUgdGhlIGZpcnN0IGZpZWxkICovCiAJLyogV2hpY2ggaXMgYSBidWcgRklYTUUhICovCi0Jc3RydWN0IGh2X2RyaXZlciBCYXNlOworCXN0cnVjdCBodl9kcml2ZXIgYmFzZTsKIAogCS8qIFNldCBieSBjYWxsZXIgKGluIGJ5dGVzKSAqLwotCXUzMiBSaW5nQnVmZmVyU2l6ZTsKKwl1MzIgcmluZ19idWZmZXJfc2l6ZTsKIAogCS8qIEFsbG9jYXRlIHRoaXMgbXVjaCBwcml2YXRlIGV4dGVuc2lvbiBmb3IgZWFjaCBJL08gcmVxdWVzdCAqLwotCXUzMiBSZXF1ZXN0RXh0U2l6ZTsKKwl1MzIgcmVxdWVzdF9leHRfc2l6ZTsKIAogCS8qIE1heGltdW0gIyBvZiByZXF1ZXN0cyBpbiBmbGlnaHQgcGVyIGNoYW5uZWwvZGV2aWNlICovCi0JdTMyIE1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsOworCXUzMiBtYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsOwogCiAJLyogU3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIgKi8KLQlpbnQgKCpPbklPUmVxdWVzdCkoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqUmVxdWVzdCk7CisJaW50ICgqb25faW9fcmVxdWVzdCkoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCk7CiB9OwogCiBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyB7Ci0JdW5zaWduZWQgaW50IFBvcnROdW1iZXI7Ci0JdW5zaWduZWQgY2hhciBQYXRoSWQ7Ci0JdW5zaWduZWQgY2hhciBUYXJnZXRJZDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOwogfTsKIAogLyogSW50ZXJmYWNlICovCi1pbnQgU3RvclZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKLWludCBTdG9yVnNjT25Ib3N0UmVzZXQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKLWludCBCbGtWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7CitpbnQgc3Rvcl92c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOworaW50IHN0b3JfdnNjX29uX2hvc3RfcmVzZXQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKK2ludCBibGtfdnNjX2luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKIAogI2VuZGlmIC8qIF9TVE9SVlNDX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYwppbmRleCA2ZjhkNjdkLi4xN2YxYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYwpAQCAtMTQwLDI4ICsxNDAsMjggQEAKIAlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9ydnNjX2Rydl9vYmogPSAmZ19zdG9ydnNjX2Rydi5kcnZfb2JqOwogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJ2X2N0eCA9ICZnX3N0b3J2c2NfZHJ2LmRydl9jdHg7CiAKLQlzdG9ydnNjX2Rydl9vYmotPlJpbmdCdWZmZXJTaXplID0gc3RvcnZzY19yaW5nYnVmZmVyX3NpemU7CisJc3RvcnZzY19kcnZfb2JqLT5yaW5nX2J1ZmZlcl9zaXplID0gc3RvcnZzY19yaW5nYnVmZmVyX3NpemU7CiAKIAkvKiBDYWxsYmFjayB0byBjbGllbnQgZHJpdmVyIHRvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiAqLwotCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQ19EUlYsCiAJCSAgICAicmVxdWVzdCBleHRlbnNpb24gc2l6ZSAldSwgbWF4IG91dHN0YW5kaW5nIHJlcXMgJXUiLAotCQkgICAgc3RvcnZzY19kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSwKLQkJICAgIHN0b3J2c2NfZHJ2X29iai0+TWF4T3V0c3RhbmRpbmdSZXF1ZXN0c1BlckNoYW5uZWwpOworCQkgICAgc3RvcnZzY19kcnZfb2JqLT5yZXF1ZXN0X2V4dF9zaXplLAorCQkgICAgc3RvcnZzY19kcnZfb2JqLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsKTsKIAotCWlmIChzdG9ydnNjX2Rydl9vYmotPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsIDwKKwlpZiAoc3RvcnZzY19kcnZfb2JqLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsIDwKIAkgICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDX0RSViwKIAkJCSAgICJUaGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvIHJlcXVlc3RzICglZCkgIgogCQkJICAgImlzIGxhcmdlciB0aGFuIHRoYXQgc3VwcG9ydGVkICglZCkgaW50ZXJuYWxseS4iLAogCQkJICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMsCi0JCQkgICBzdG9ydnNjX2Rydl9vYmotPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsKTsKKwkJCSAgIHN0b3J2c2NfZHJ2X29iai0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5uYW1lOwotCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPkJhc2UuZGV2aWNlVHlwZSwKKwlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5uYW1lOworCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPmJhc2UuZGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAlkcnZfY3R4LT5wcm9iZSA9IHN0b3J2c2NfcHJvYmU7CkBAIC0yMDYsOCArMjA2LDggQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoY3VycmVudF9kZXYpOwogCX0KIAotCWlmIChzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQlzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWlmIChzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKQorCQlzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAJcmV0dXJuOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJc3RydWN0IGhvc3RfZGV2aWNlX2NvbnRleHQgKmhvc3RfZGV2aWNlX2N0eDsKIAlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKQorCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKQogCQlyZXR1cm4gLTE7CiAKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZzY3NpX2RyaXZlciwKQEAgLTI1Miw3ICsyNTIsNyBAQAogCWhvc3RfZGV2aWNlX2N0eC0+cmVxdWVzdF9wb29sID0KIAkJCQlrbWVtX2NhY2hlX2NyZWF0ZShkZXZfbmFtZSgmZGV2aWNlX2N0eC0+ZGV2aWNlKSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0KSArCi0JCQkJCXN0b3J2c2NfZHJ2X29iai0+UmVxdWVzdEV4dFNpemUsIDAsCisJCQkJCXN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSwgMCwKIAkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAogCWlmICghaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpIHsKQEAgLTI2MCw5ICsyNjAsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXZpY2VfaW5mby5Qb3J0TnVtYmVyID0gaG9zdC0+aG9zdF9ubzsKKwlkZXZpY2VfaW5mby5wb3J0X251bWJlciA9IGhvc3QtPmhvc3Rfbm87CiAJLyogQ2FsbCB0byB0aGUgdnNjIGRyaXZlciB0byBhZGQgdGhlIGRldmljZSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLAorCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLAogCQkJCQkJKHZvaWQgKikmZGV2aWNlX2luZm8pOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0NfRFJWLCAidW5hYmxlIHRvIGFkZCBzY3NpIHZzYyBkZXZpY2UiKTsKQEAgLTI3Miw4ICsyNzIsOCBAQAogCX0KIAogCS8qIGhvc3RfZGV2aWNlX2N0eC0+cG9ydCA9IGRldmljZV9pbmZvLlBvcnROdW1iZXI7ICovCi0JaG9zdF9kZXZpY2VfY3R4LT5wYXRoID0gZGV2aWNlX2luZm8uUGF0aElkOwotCWhvc3RfZGV2aWNlX2N0eC0+dGFyZ2V0ID0gZGV2aWNlX2luZm8uVGFyZ2V0SWQ7CisJaG9zdF9kZXZpY2VfY3R4LT5wYXRoID0gZGV2aWNlX2luZm8ucGF0aF9pZDsKKwlob3N0X2RldmljZV9jdHgtPnRhcmdldCA9IGRldmljZV9pbmZvLnRhcmdldF9pZDsKIAogCS8qIG1heCAjIG9mIGRldmljZXMgcGVyIHRhcmdldCAqLwogCWhvc3QtPm1heF9sdW4gPSBTVE9SVlNDX01BWF9MVU5TX1BFUl9UQVJHRVQ7CkBAIC0yODcsNyArMjg3LDcgQEAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDX0RSViwgInVuYWJsZSB0byBhZGQgc2NzaSBob3N0IGRldmljZSIpOwogCi0JCXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwkJc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCiAJCWttZW1fY2FjaGVfZGVzdHJveShob3N0X2RldmljZV9jdHgtPnJlcXVlc3RfcG9vbCk7CiAJCXNjc2lfaG9zdF9wdXQoaG9zdCk7CkBAIC0zMTcsMTQgKzMxNywxNCBAQAogCQkJKHN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICopaG9zdC0+aG9zdGRhdGE7CiAKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKQorCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7CiAKIAkvKgogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCiAJICogcmVtb3ZlZAogCSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qIFRPRE86ICovCiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byByZW1vdmUgdnNjIGRldmljZSAocmV0ICVkKSIsCkBAIC0zNTAsNyArMzUwLDcgQEAKIHN0YXRpYyB2b2lkIHN0b3J2c2NfY29tbW1hbmRfY29tcGxldGlvbihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0ICpjbWRfcmVxdWVzdCA9Ci0JCShzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqKXJlcXVlc3QtPkNvbnRleHQ7CisJCShzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NtbmQgPSBjbWRfcmVxdWVzdC0+Y21kOwogCXN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICpob3N0X2RldmljZV9jdHggPQogCQkoc3RydWN0IGhvc3RfZGV2aWNlX2NvbnRleHQgKilzY21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKQEAgLTM3NSwxNiArMzc1LDE3IEBACiAJCQkJICAgICAgY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2xfY291bnQpOwogCX0KIAotCXNjbW5kLT5yZXN1bHQgPSByZXF1ZXN0LT5TdGF0dXM7CisJc2NtbmQtPnJlc3VsdCA9IHJlcXVlc3QtPnN0YXR1czsKIAogCWlmIChzY21uZC0+cmVzdWx0KSB7CiAJCWlmIChzY3NpX25vcm1hbGl6ZV9zZW5zZShzY21uZC0+c2Vuc2VfYnVmZmVyLAotCQkJCQkgcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplLCAmc2Vuc2VfaGRyKSkKKwkJCQlyZXF1ZXN0LT5zZW5zZV9idWZmZXJfc2l6ZSwgJnNlbnNlX2hkcikpCiAJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigic3RvcnZzYyIsICZzZW5zZV9oZHIpOwogCX0KIAotCS8qIEFTU0VSVChyZXF1ZXN0LT5CeXRlc1hmZXIgPD0gcmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGgpOyAqLwotCXNjc2lfc2V0X3Jlc2lkKHNjbW5kLCByZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aCAtIHJlcXVlc3QtPkJ5dGVzWGZlcik7CisJLyogQVNTRVJUKHJlcXVlc3QtPkJ5dGVzWGZlciA8PSByZXF1ZXN0LT5kYXRhX2J1ZmZlci5MZW5ndGgpOyAqLworCXNjc2lfc2V0X3Jlc2lkKHNjbW5kLAorCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5MZW5ndGggLSByZXF1ZXN0LT5ieXRlc194ZmVyKTsKIAogCXNjc2lfZG9uZV9mbiA9IHNjbW5kLT5zY3NpX2RvbmU7CiAKQEAgLTY1Nyw0MiArNjU4LDQyIEBACiAKIAlyZXF1ZXN0ID0gJmNtZF9yZXF1ZXN0LT5yZXF1ZXN0OwogCi0JcmVxdWVzdC0+RXh0ZW5zaW9uID0KKwlyZXF1ZXN0LT5leHRlbnNpb24gPQogCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyljbWRfcmVxdWVzdCArIHJlcXVlc3Rfc2l6ZSk7CiAJRFBSSU5UX0RCRyhTVE9SVlNDX0RSViwgInJlcSAlcCBzaXplICVkIGV4dCAlZCIsIHJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSwKLQkJICAgc3RvcnZzY19kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSk7CisJCSAgIHN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSk7CiAKIAkvKiBCdWlsZCB0aGUgU1JCICovCiAJc3dpdGNoIChzY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKIAljYXNlIERNQV9UT19ERVZJQ0U6Ci0JCXJlcXVlc3QtPlR5cGUgPSBXUklURV9UWVBFOworCQlyZXF1ZXN0LT50eXBlID0gV1JJVEVfVFlQRTsKIAkJYnJlYWs7CiAJY2FzZSBETUFfRlJPTV9ERVZJQ0U6Ci0JCXJlcXVlc3QtPlR5cGUgPSBSRUFEX1RZUEU7CisJCXJlcXVlc3QtPnR5cGUgPSBSRUFEX1RZUEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJlcXVlc3QtPlR5cGUgPSBVTktOT1dOX1RZUEU7CisJCXJlcXVlc3QtPnR5cGUgPSBVTktOT1dOX1RZUEU7CiAJCWJyZWFrOwogCX0KIAotCXJlcXVlc3QtPk9uSU9Db21wbGV0aW9uID0gc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uOwotCXJlcXVlc3QtPkNvbnRleHQgPSBjbWRfcmVxdWVzdDsvKiBzY21uZDsgKi8KKwlyZXF1ZXN0LT5vbl9pb19jb21wbGV0aW9uID0gc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uOworCXJlcXVlc3QtPmNvbnRleHQgPSBjbWRfcmVxdWVzdDsvKiBzY21uZDsgKi8KIAogCS8qIHJlcXVlc3QtPlBvcnRJZCA9IHNjbW5kLT5kZXZpY2UtPmNoYW5uZWw7ICovCi0JcmVxdWVzdC0+SG9zdCA9IGhvc3RfZGV2aWNlX2N0eC0+cG9ydDsKLQlyZXF1ZXN0LT5CdXMgPSBzY21uZC0+ZGV2aWNlLT5jaGFubmVsOwotCXJlcXVlc3QtPlRhcmdldElkID0gc2NtbmQtPmRldmljZS0+aWQ7Ci0JcmVxdWVzdC0+THVuSWQgPSBzY21uZC0+ZGV2aWNlLT5sdW47CisJcmVxdWVzdC0+aG9zdCA9IGhvc3RfZGV2aWNlX2N0eC0+cG9ydDsKKwlyZXF1ZXN0LT5idXMgPSBzY21uZC0+ZGV2aWNlLT5jaGFubmVsOworCXJlcXVlc3QtPnRhcmdldF9pZCA9IHNjbW5kLT5kZXZpY2UtPmlkOworCXJlcXVlc3QtPmx1bl9pZCA9IHNjbW5kLT5kZXZpY2UtPmx1bjsKIAogCS8qIEFTU0VSVChzY21uZC0+Y21kX2xlbiA8PSAxNik7ICovCi0JcmVxdWVzdC0+Q2RiTGVuID0gc2NtbmQtPmNtZF9sZW47Ci0JcmVxdWVzdC0+Q2RiID0gc2NtbmQtPmNtbmQ7CisJcmVxdWVzdC0+Y2RiX2xlbiA9IHNjbW5kLT5jbWRfbGVuOworCXJlcXVlc3QtPmNkYiA9IHNjbW5kLT5jbW5kOwogCi0JcmVxdWVzdC0+U2Vuc2VCdWZmZXIgPSBzY21uZC0+c2Vuc2VfYnVmZmVyOwotCXJlcXVlc3QtPlNlbnNlQnVmZmVyU2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwlyZXF1ZXN0LT5zZW5zZV9idWZmZXIgPSBzY21uZC0+c2Vuc2VfYnVmZmVyOworCXJlcXVlc3QtPnNlbnNlX2J1ZmZlcl9zaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOwogCiAKLQlyZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aCA9IHNjc2lfYnVmZmxlbihzY21uZCk7CisJcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoID0gc2NzaV9idWZmbGVuKHNjbW5kKTsKIAlpZiAoc2NzaV9zZ19jb3VudChzY21uZCkpIHsKIAkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjc2lfc2dsaXN0KHNjbW5kKTsKIAkJc2dfY291bnQgPSBzY3NpX3NnX2NvdW50KHNjbW5kKTsKQEAgLTczMywyNSArNzM0LDI1IEBACiAJCQlzZ19jb3VudCA9IGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50OwogCQl9CiAKLQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5PZmZzZXQgPSBzZ2xbMF0ub2Zmc2V0OworCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5PZmZzZXQgPSBzZ2xbMF0ub2Zmc2V0OwogCiAJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CiAJCQlEUFJJTlRfREJHKFNUT1JWU0NfRFJWLCAic2dsWyVkXSBsZW4gJWQgb2Zmc2V0ICVkXG4iLAogCQkJCSAgIGksIHNnbFtpXS5sZW5ndGgsIHNnbFtpXS5vZmZzZXQpOwotCQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5QZm5BcnJheVtpXSA9CisJCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5QZm5BcnJheVtpXSA9CiAJCQkJcGFnZV90b19wZm4oc2dfcGFnZSgoJnNnbFtpXSkpKTsKIAkJfQogCX0gZWxzZSBpZiAoc2NzaV9zZ2xpc3Qoc2NtbmQpKSB7CiAJCS8qIEFTU0VSVChzY3NpX2J1ZmZsZW4oc2NtbmQpIDw9IFBBR0VfU0laRSk7ICovCi0JCXJlcXVlc3QtPkRhdGFCdWZmZXIuT2Zmc2V0ID0KKwkJcmVxdWVzdC0+ZGF0YV9idWZmZXIuT2Zmc2V0ID0KIAkJCXZpcnRfdG9fcGh5cyhzY3NpX3NnbGlzdChzY21uZCkpICYgKFBBR0VfU0laRS0xKTsKLQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9CisJCXJlcXVlc3QtPmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0KIAkJCXZpcnRfdG9fcGh5cyhzY3NpX3NnbGlzdChzY21uZCkpID4+IFBBR0VfU0hJRlQ7CiAJfQogCiByZXRyeV9yZXF1ZXN0OgogCS8qIEludm9rZXMgdGhlIHZzYyB0byBzdGFydCBhbiBJTyAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+T25JT1JlcXVlc3QoJmRldmljZV9jdHgtPmRldmljZV9vYmosCisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5vbl9pb19yZXF1ZXN0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAogCQkJCQkgICAmY21kX3JlcXVlc3QtPnJlcXVlc3QpOwogCWlmIChyZXQgPT0gLTEpIHsKIAkJLyogbm8gbW9yZSBzcGFjZSAqLwpAQCAtODQ0LDcgKzg0NSw3IEBACiAJCSAgICBzY21uZC0+ZGV2aWNlLCAmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaik7CiAKIAkvKiBJbnZva2VzIHRoZSB2c2MgdG8gcmVzZXQgdGhlIGhvc3QvYnVzICovCi0JcmV0ID0gU3RvclZzY09uSG9zdFJlc2V0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsKKwlyZXQgPSBzdG9yX3ZzY19vbl9ob3N0X3Jlc2V0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTkzOSw3ICs5NDAsNyBAQAogCWludCByZXQ7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDX0RSViwgIlN0b3J2c2MgaW5pdGlhbGl6aW5nLi4uLiIpOwotCXJldCA9IHN0b3J2c2NfZHJ2X2luaXQoU3RvclZzY0luaXRpYWxpemUpOworCXJldCA9IHN0b3J2c2NfZHJ2X2luaXQoc3Rvcl92c2NfaW5pdGlhbGl6ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0OWRhZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKLSAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgIEhhaXlhbmcgWmhhbmcgPGhhaXlhbmd6QG1pY3Jvc29mdC5jb20+Ci0gKiAgIEhhbmsgSmFuc3NlbiAgPGhqYW5zc2VuQG1pY3Jvc29mdC5jb20+Ci0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAib3NkLmgiCi0jaW5jbHVkZSAibG9nZ2luZy5oIgotI2luY2x1ZGUgInZlcnNpb25faW5mby5oIgotI2luY2x1ZGUgInZtYnVzX3ByaXZhdGUuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdEcml2ZXJOYW1lID0gInZtYnVzIjsKLQotLyoKLSAqIFdpbmRvd3Mgdm1idXMgZG9lcyBub3QgZGVmaW5lZCB0aGlzLgotICogV2UgZGVmaW5lZCB0aGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBkZXZpY2VzCi0gKi8KLS8qIHtjNTI5NTgxNi1mNjNhLTRkNWYtOGQxYS00ZGFmOTk5Y2ExODV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlVHlwZSA9IHsKLQkuZGF0YSA9IHsKLQkJMHgxNiwgMHg1OCwgMHgyOSwgMHhjNSwgMHgzYSwgMHhmNiwgMHg1ZiwgMHg0ZCwKLQkJMHg4ZCwgMHgxYSwgMHg0ZCwgMHhhZiwgMHg5OSwgMHg5YywgMHhhMSwgMHg4NQotCX0KLX07Ci0KLS8qIHthYzM3NjBmYy05YWRmLTQwYWEtOTQyNy1hNzBlZDZkZTk1YzV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlSWQgPSB7Ci0JLmRhdGEgPSB7Ci0JCTB4ZmMsIDB4NjAsIDB4MzcsIDB4YWMsIDB4ZGYsIDB4OWEsIDB4YWEsIDB4NDAsCi0JCTB4OTQsIDB4MjcsIDB4YTcsIDB4MGUsIDB4ZDYsIDB4ZGUsIDB4OTUsIDB4YzUKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGh2X2RyaXZlciAqZ0RyaXZlcjsgLyogdm1idXMgZHJpdmVyIG9iamVjdCAqLwotc3RhdGljIHN0cnVjdCBodl9kZXZpY2UgKmdEZXZpY2U7IC8qIHZtYnVzIHJvb3QgZGV2aWNlICovCi0KLS8qCi0gKiBWbWJ1c0dldENoYW5uZWxPZmZlcnMgLSBSZXRyaWV2ZSB0aGUgY2hhbm5lbCBvZmZlcnMgZnJvbSB0aGUgcGFyZW50IHBhcnRpdGlvbgotICovCi1zdGF0aWMgdm9pZCBWbWJ1c0dldENoYW5uZWxPZmZlcnModm9pZCkKLXsKLQl2bWJ1c19yZXF1ZXN0X29mZmVycygpOwotfQotCi0vKgotICogVm1idXNDcmVhdGVDaGlsZERldmljZSAtIENyZWF0ZXMgdGhlIGNoaWxkIGRldmljZSBvbiB0aGUgYnVzIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhbm5lbCBvZmZlcgotICovCi1zdHJ1Y3QgaHZfZGV2aWNlICpWbWJ1c0NoaWxkRGV2aWNlQ3JlYXRlKHN0cnVjdCBodl9ndWlkICpEZXZpY2VUeXBlLAotCQkJCQkgc3RydWN0IGh2X2d1aWQgKkRldmljZUluc3RhbmNlLAotCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCi17Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNEcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWdEcml2ZXI7Ci0KLQlyZXR1cm4gdm1idXNEcml2ZXItPk9uQ2hpbGREZXZpY2VDcmVhdGUoRGV2aWNlVHlwZSwgRGV2aWNlSW5zdGFuY2UsCi0JCQkJCQljaGFubmVsKTsKLX0KLQotLyoKLSAqIFZtYnVzQ2hpbGREZXZpY2VBZGQgLSBSZWdpc3RlcnMgdGhlIGNoaWxkIGRldmljZSB3aXRoIHRoZSB2bWJ1cwotICovCi1pbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpDaGlsZERldmljZSkKLXsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c0RyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZ0RyaXZlcjsKLQotCXJldHVybiB2bWJ1c0RyaXZlci0+T25DaGlsZERldmljZUFkZChnRGV2aWNlLCBDaGlsZERldmljZSk7Ci19Ci0KLS8qCi0gKiBWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlIFVucmVnaXN0ZXJzIHRoZSBjaGlsZCBkZXZpY2UgZnJvbSB0aGUgdm1idXMKLSAqLwotdm9pZCBWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkNoaWxkRGV2aWNlKQotewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzRHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilnRHJpdmVyOwotCi0Jdm1idXNEcml2ZXItPk9uQ2hpbGREZXZpY2VSZW1vdmUoQ2hpbGREZXZpY2UpOwotfQotCi0vKgotICogVm1idXNPbkRldmljZUFkZCAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyBhZGRlZAotICovCi1zdGF0aWMgaW50IFZtYnVzT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpBZGRpdGlvbmFsSW5mbykKLXsKLQl1MzIgKmlycXZlY3RvciA9IEFkZGl0aW9uYWxJbmZvOwotCWludCByZXQ7Ci0KLQlnRGV2aWNlID0gZGV2OwotCi0JbWVtY3B5KCZnRGV2aWNlLT5kZXZpY2VUeXBlLCAmZ1ZtYnVzRGV2aWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0JbWVtY3B5KCZnRGV2aWNlLT5kZXZpY2VJbnN0YW5jZSwgJmdWbWJ1c0RldmljZUlkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQotCS8qIHN0cmNweShkZXYtPm5hbWUsICJ2bWJ1cyIpOyAqLwotCS8qIFN5bklDIHNldHVwLi4uICovCi0Jb25fZWFjaF9jcHUoSHZTeW5pY0luaXQsICh2b2lkICopaXJxdmVjdG9yLCAxKTsKLQotCS8qIENvbm5lY3QgdG8gVk1CdXMgaW4gdGhlIHJvb3QgcGFydGl0aW9uICovCi0JcmV0ID0gVm1idXNDb25uZWN0KCk7Ci0KLQkvKiBWbWJ1c1NlbmRFdmVudChkZXZpY2UtPmxvY2FsUG9ydElkKzEpOyAqLwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBWbWJ1c09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKLSAqLwotc3RhdGljIGludCBWbWJ1c09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXZtYnVzX3JlbGVhc2VfdW5hdHRhY2hlZF9jaGFubmVscygpOwotCVZtYnVzRGlzY29ubmVjdCgpOwotCW9uX2VhY2hfY3B1KEh2U3luaWNDbGVhbnVwLCBOVUxMLCAxKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVm1idXNPbkNsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCi0gKi8KLXN0YXRpYyB2b2lkIFZtYnVzT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQkvKiBzdHJ1Y3Qgdm1idXNfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRydjsgKi8KLQotCUh2Q2xlYW51cCgpOwotfQotCi0vKgotICogVm1idXNPbk1zZ0RQQyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBoeXBlcnZpc2lvcgotICovCi1zdGF0aWMgdm9pZCBWbWJ1c09uTXNnRFBDKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXZvaWQgKnBhZ2VfYWRkciA9IGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdOwotCXN0cnVjdCBodl9tZXNzYWdlICptc2cgPSAoc3RydWN0IGh2X21lc3NhZ2UgKilwYWdlX2FkZHIgKwotCQkJCSAgVk1CVVNfTUVTU0FHRV9TSU5UOwotCXN0cnVjdCBodl9tZXNzYWdlICpjb3BpZWQ7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAobXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0gSHZNZXNzYWdlVHlwZU5vbmUpIHsKLQkJCS8qIG5vIG1zZyAqLwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQljb3BpZWQgPSBrbWVtZHVwKG1zZywgc2l6ZW9mKCpjb3BpZWQpLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChjb3BpZWQgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJb3NkX3NjaGVkdWxlX2NhbGxiYWNrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLAotCQkJCQkgICAgICB2bWJ1c19vbm1lc3NhZ2UsCi0JCQkJCSAgICAgICh2b2lkICopY29waWVkKTsKLQkJfQotCi0JCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gSHZNZXNzYWdlVHlwZU5vbmU7Ci0KLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSB3cml0ZSB0byBNZXNzYWdlVHlwZSAoaWUgc2V0IHRvCi0JCSAqIEh2TWVzc2FnZVR5cGVOb25lKSBoYXBwZW5zIGJlZm9yZSB3ZSByZWFkIHRoZQotCQkgKiBNZXNzYWdlUGVuZGluZyBhbmQgRU9NaW5nLiBPdGhlcndpc2UsIHRoZSBFT01pbmcKLQkJICogd2lsbCBub3QgZGVsaXZlciBhbnkgbW9yZSBtZXNzYWdlcyBzaW5jZSB0aGVyZSBpcwotCQkgKiBubyBlbXB0eSBzbG90Ci0JCSAqLwotCQltYigpOwotCi0JCWlmIChtc2ctPkhlYWRlci5NZXNzYWdlRmxhZ3MuTWVzc2FnZVBlbmRpbmcpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIHdpbGwgY2F1c2UgbWVzc2FnZSBxdWV1ZSByZXNjYW4gdG8KLQkJCSAqIHBvc3NpYmx5IGRlbGl2ZXIgYW5vdGhlciBtc2cgZnJvbSB0aGUKLQkJCSAqIGh5cGVydmlzb3IKLQkJCSAqLwotCQkJd3Jtc3JsKEhWX1g2NF9NU1JfRU9NLCAwKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFZtYnVzT25FdmVudERQQyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgaHlwZXJ2aXNpb3IKLSAqLwotc3RhdGljIHZvaWQgVm1idXNPbkV2ZW50RFBDKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQkvKiBUT0RPOiBQcm9jZXNzIGFueSBldmVudHMgKi8KLQlWbWJ1c09uRXZlbnRzKCk7Ci19Ci0KLS8qCi0gKiBWbWJ1c09uSVNSIC0gSVNSIHJvdXRpbmUKLSAqLwotc3RhdGljIGludCBWbWJ1c09uSVNSKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXZvaWQgKnBhZ2VfYWRkcjsKLQlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnOwotCXVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICpldmVudDsKLQotCXBhZ2VfYWRkciA9IGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdOwotCW1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzICovCi0JaWYgKG1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlICE9IEh2TWVzc2FnZVR5cGVOb25lKSB7Ci0JCURQUklOVF9EQkcoVk1CVVMsICJyZWNlaXZlZCBtc2cgdHlwZSAlZCBzaXplICVkIiwKLQkJCQltc2ctPkhlYWRlci5NZXNzYWdlVHlwZSwKLQkJCQltc2ctPkhlYWRlci5QYXlsb2FkU2l6ZSk7Ci0JCXJldCB8PSAweDE7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgaWYgdGhlcmUgYXJlIGV2ZW50cyB0byBiZSBwcm9jZXNzICovCi0JcGFnZV9hZGRyID0gZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdOwotCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwotCi0JLyogU2luY2Ugd2UgYXJlIGEgY2hpbGQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBiaXQgMCAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgJmV2ZW50LT5GbGFnczMyWzBdKSkgewotCQlEUFJJTlRfREJHKFZNQlVTLCAicmVjZWl2ZWQgZXZlbnQgJWQiLCBldmVudC0+RmxhZ3MzMlswXSk7Ci0JCXJldCB8PSAweDI7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFZtYnVzSW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKLSAqLwotaW50IFZtYnVzSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkcnY7Ci0JaW50IHJldDsKLQotCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBIViBEcml2ZXIgdmVyc2lvbiA9ICVzICsrKysrKysiLAotCQkgICAgSFZfRFJWX1ZFUlNJT04pOwotCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBWbWJ1cyBzdXBwb3J0ZWQgdmVyc2lvbiA9ICVkICsrKysrKysiLAotCQkJVk1CVVNfUkVWSVNJT05fTlVNQkVSKTsKLQlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgdXNpbmcgU0lOVCAlZCArKysrKysrIiwKLQkJCVZNQlVTX01FU1NBR0VfU0lOVCk7Ci0JRFBSSU5UX0RCRyhWTUJVUywgInNpemVvZih2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlcik9JXpkLCAiCi0JCQkic2l6ZW9mKFZNQlVTX0NIQU5ORUxfUEFDS0VUX01VTElUUEFHRV9CVUZGRVIpPSV6ZCIsCi0JCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X3BhZ2VfYnVmZmVyKSwKLQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9wYWNrZXRfbXVsdGlwYWdlX2J1ZmZlcikpOwotCi0JZHJ2LT5uYW1lID0gZ0RyaXZlck5hbWU7Ci0JbWVtY3B5KCZkcnYtPmRldmljZVR5cGUsICZnVm1idXNEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQotCS8qIFNldHVwIGRpc3BhdGNoIHRhYmxlICovCi0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkCT0gVm1idXNPbkRldmljZUFkZDsKLQlkcml2ZXItPkJhc2UuT25EZXZpY2VSZW1vdmUJPSBWbWJ1c09uRGV2aWNlUmVtb3ZlOwotCWRyaXZlci0+QmFzZS5PbkNsZWFudXAJCT0gVm1idXNPbkNsZWFudXA7Ci0JZHJpdmVyLT5PbklzcgkJCT0gVm1idXNPbklTUjsKLQlkcml2ZXItPk9uTXNnRHBjCQk9IFZtYnVzT25Nc2dEUEM7Ci0JZHJpdmVyLT5PbkV2ZW50RHBjCQk9IFZtYnVzT25FdmVudERQQzsKLQlkcml2ZXItPkdldENoYW5uZWxPZmZlcnMJPSBWbWJ1c0dldENoYW5uZWxPZmZlcnM7Ci0KLQkvKiBIeXBlcnZpc29yIGluaXRpYWxpemF0aW9uLi4uc2V0dXAgaHlwZXJjYWxsIHBhZ2UuLmV0YyAqLwotCXJldCA9IEh2SW5pdCgpOwotCWlmIChyZXQgIT0gMCkKLQkJRFBSSU5UX0VSUihWTUJVUywgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBoeXBlcnZpc29yIC0gMHgleCIsCi0JCQkJcmV0KTsKLQlnRHJpdmVyID0gZHJ2OwotCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19hcGkuaAppbmRleCAyYWY0MmU1Li4yZGEzZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2FwaS5oCkBAIC0xMTUsMjggKzExNSw0IEBACiAJdm9pZCAqRXh0ZW5zaW9uOwogfTsKIAotLyogVm1idXMgZHJpdmVyIG9iamVjdCAqLwotc3RydWN0IHZtYnVzX2RyaXZlciB7Ci0JLyogISEgTXVzdCBiZSB0aGUgMXN0IGZpZWxkICEhICovCi0JLyogRklYTUUgaWYgXiwgdGhlbiBzb21lb25lIGlzIGRvaW5nIHNvbXRoaW5nIHN0dXBpZCAqLwotCXN0cnVjdCBodl9kcml2ZXIgQmFzZTsKLQotCS8qIFNldCBieSB0aGUgY2FsbGVyICovCi0Jc3RydWN0IGh2X2RldmljZSAqICgqT25DaGlsZERldmljZUNyZWF0ZSkoc3RydWN0IGh2X2d1aWQgKkRldmljZVR5cGUsCi0JCQkJCQlzdHJ1Y3QgaHZfZ3VpZCAqRGV2aWNlSW5zdGFuY2UsCi0JCQkJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7Ci0Jdm9pZCAoKk9uQ2hpbGREZXZpY2VEZXN0cm95KShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwotCWludCAoKk9uQ2hpbGREZXZpY2VBZGQpKHN0cnVjdCBodl9kZXZpY2UgKlJvb3REZXZpY2UsCi0JCQkJc3RydWN0IGh2X2RldmljZSAqQ2hpbGREZXZpY2UpOwotCXZvaWQgKCpPbkNoaWxkRGV2aWNlUmVtb3ZlKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwotCi0JLyogU2V0IGJ5IHRoZSBjYWxsZWUgKi8KLQlpbnQgKCpPbklzcikoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKLQl2b2lkICgqT25Nc2dEcGMpKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci0Jdm9pZCAoKk9uRXZlbnREcGMpKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci0Jdm9pZCAoKkdldENoYW5uZWxPZmZlcnMpKHZvaWQpOwotfTsKLQotaW50IFZtYnVzSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpOwotCiAjZW5kaWYgLyogX1ZNQlVTX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCmluZGV4IDBkOWYzYTQuLjg0ZmRiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAjaW5jbHVkZSAidm1idXMuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAidm1idXNfcHJpdmF0ZS5oIgogCiAKIC8qIEZJWE1FISBXZSBuZWVkIHRvIGRvIHRoaXMgZHluYW1pY2FsbHkgZm9yIFBJQyBhbmQgQVBJQyBzeXN0ZW0gKi8KQEAgLTQ2LDcgKzQ3LDcgQEAKIAkvKiBUaGUgZHJpdmVyIGZpZWxkIGlzIG5vdCB1c2VkIGluIGhlcmUuIEluc3RlYWQsIHRoZSBidXMgZmllbGQgaXMgKi8KIAkvKiB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZHJpdmVyICovCiAJc3RydWN0IGRyaXZlcl9jb250ZXh0IGRydl9jdHg7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciBkcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgZHJ2X29iajsKIAogCXN0cnVjdCBidXNfdHlwZSBidXM7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IG1zZ19kcGM7CkBAIC02OSwxMyArNzAsNiBAQAogc3RhdGljIHZvaWQgdm1idXNfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKIHN0YXRpYyB2b2lkIHZtYnVzX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAotCQkJCQkJICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAotCQkJCQkJICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaik7Ci1zdGF0aWMgaW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpyb290X2RldmljZV9vYmosCi0JCQkJICAgICAgIHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iaik7CiBzdGF0aWMgc3NpemVfdCB2bWJ1c19zaG93X2RldmljZV9hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkJICAgICAgY2hhciAqYnVmKTsKQEAgLTEyOSw2ICsxMjMsMTgyIEBACiAJLmJ1cy5kZXZfYXR0cnMgPQl2bWJ1c19kZXZpY2VfYXR0cnMsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAiaHlwZXJ2IjsKKworLyoKKyAqIFdpbmRvd3Mgdm1idXMgZG9lcyBub3QgZGVmaW5lZCB0aGlzLgorICogV2UgZGVmaW5lZCB0aGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBkZXZpY2VzCisgKi8KKy8qIHtjNTI5NTgxNi1mNjNhLTRkNWYtOGQxYS00ZGFmOTk5Y2ExODV9ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlVHlwZSA9IHsKKwkuZGF0YSA9IHsKKwkJMHgxNiwgMHg1OCwgMHgyOSwgMHhjNSwgMHgzYSwgMHhmNiwgMHg1ZiwgMHg0ZCwKKwkJMHg4ZCwgMHgxYSwgMHg0ZCwgMHhhZiwgMHg5OSwgMHg5YywgMHhhMSwgMHg4NQorCX0KK307CisKKy8qIHthYzM3NjBmYy05YWRmLTQwYWEtOTQyNy1hNzBlZDZkZTk1YzV9ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlSWQgPSB7CisJLmRhdGEgPSB7CisJCTB4ZmMsIDB4NjAsIDB4MzcsIDB4YWMsIDB4ZGYsIDB4OWEsIDB4YWEsIDB4NDAsCisJCTB4OTQsIDB4MjcsIDB4YTcsIDB4MGUsIDB4ZDYsIDB4ZGUsIDB4OTUsIDB4YzUKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGh2X2RldmljZSAqZ0RldmljZTsgLyogdm1idXMgcm9vdCBkZXZpY2UgKi8KKworLyoKKyAqIFZtYnVzQ2hpbGREZXZpY2VBZGQgLSBSZWdpc3RlcnMgdGhlIGNoaWxkIGRldmljZSB3aXRoIHRoZSB2bWJ1cworICovCitpbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpDaGlsZERldmljZSkKK3sKKwlyZXR1cm4gdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyKGdEZXZpY2UsIENoaWxkRGV2aWNlKTsKK30KKworLyoKKyAqIFZtYnVzT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgYWRkZWQKKyAqLworc3RhdGljIGludCBWbWJ1c09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgdm9pZCAqQWRkaXRpb25hbEluZm8pCit7CisJdTMyICppcnF2ZWN0b3IgPSBBZGRpdGlvbmFsSW5mbzsKKwlpbnQgcmV0OworCisJZ0RldmljZSA9IGRldjsKKworCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlVHlwZSwgJmdWbWJ1c0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlSW5zdGFuY2UsICZnVm1idXNEZXZpY2VJZCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisKKwkvKiBzdHJjcHkoZGV2LT5uYW1lLCAidm1idXMiKTsgKi8KKwkvKiBTeW5JQyBzZXR1cC4uLiAqLworCW9uX2VhY2hfY3B1KGh2X3N5bmljX2luaXQsICh2b2lkICopaXJxdmVjdG9yLCAxKTsKKworCS8qIENvbm5lY3QgdG8gVk1CdXMgaW4gdGhlIHJvb3QgcGFydGl0aW9uICovCisJcmV0ID0gVm1idXNDb25uZWN0KCk7CisKKwkvKiBWbWJ1c1NlbmRFdmVudChkZXZpY2UtPmxvY2FsUG9ydElkKzEpOyAqLworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWbWJ1c09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKKyAqLworc3RhdGljIGludCBWbWJ1c09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXZtYnVzX3JlbGVhc2VfdW5hdHRhY2hlZF9jaGFubmVscygpOworCVZtYnVzRGlzY29ubmVjdCgpOworCW9uX2VhY2hfY3B1KGh2X3N5bmljX2NsZWFudXAsIE5VTEwsIDEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWbWJ1c09uQ2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqLworc3RhdGljIHZvaWQgVm1idXNPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQoreworCS8qIHN0cnVjdCB2bWJ1c19kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZHJ2OyAqLworCisJaHZfY2xlYW51cCgpOworfQorCitzdHJ1Y3Qgb25tZXNzYWdlX3dvcmtfY29udGV4dCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGh2X21lc3NhZ2UgbXNnOworfTsKKworc3RhdGljIHZvaWQgdm1idXNfb25tZXNzYWdlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbm1lc3NhZ2Vfd29ya19jb250ZXh0ICpjdHg7CisKKwljdHggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQsCisJCQkgICB3b3JrKTsKKwl2bWJ1c19vbm1lc3NhZ2UoJmN0eC0+bXNnKTsKKwlrZnJlZShjdHgpOworfQorCisvKgorICogdm1idXNfb25fbXNnX2RwYyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBoeXBlcnZpc2lvcgorICovCitzdGF0aWMgdm9pZCB2bWJ1c19vbl9tc2dfZHBjKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZvaWQgKnBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV07CisJc3RydWN0IGh2X21lc3NhZ2UgKm1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArCisJCQkJICBWTUJVU19NRVNTQUdFX1NJTlQ7CisJc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQgKmN0eDsKKworCXdoaWxlICgxKSB7CisJCWlmIChtc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUgPT0gSFZNU0dfTk9ORSkgeworCQkJLyogbm8gbXNnICovCisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChjdHggPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCUlOSVRfV09SSygmY3R4LT53b3JrLCB2bWJ1c19vbm1lc3NhZ2Vfd29yayk7CisJCQltZW1jcHkoJmN0eC0+bXNnLCBtc2csIHNpemVvZigqbXNnKSk7CisJCQlxdWV1ZV93b3JrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLCAmY3R4LT53b3JrKTsKKwkJfQorCisJCW1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSA9IEhWTVNHX05PTkU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSB3cml0ZSB0byBNZXNzYWdlVHlwZSAoaWUgc2V0IHRvCisJCSAqIEhWTVNHX05PTkUpIGhhcHBlbnMgYmVmb3JlIHdlIHJlYWQgdGhlCisJCSAqIE1lc3NhZ2VQZW5kaW5nIGFuZCBFT01pbmcuIE90aGVyd2lzZSwgdGhlIEVPTWluZworCQkgKiB3aWxsIG5vdCBkZWxpdmVyIGFueSBtb3JlIG1lc3NhZ2VzIHNpbmNlIHRoZXJlIGlzCisJCSAqIG5vIGVtcHR5IHNsb3QKKwkJICovCisJCW1iKCk7CisKKwkJaWYgKG1zZy0+aGVhZGVyLm1lc3NhZ2VfZmxhZ3MubXNnX3BlbmRpbmcpIHsKKwkJCS8qCisJCQkgKiBUaGlzIHdpbGwgY2F1c2UgbWVzc2FnZSBxdWV1ZSByZXNjYW4gdG8KKwkJCSAqIHBvc3NpYmx5IGRlbGl2ZXIgYW5vdGhlciBtc2cgZnJvbSB0aGUKKwkJCSAqIGh5cGVydmlzb3IKKwkJCSAqLworCQkJd3Jtc3JsKEhWX1g2NF9NU1JfRU9NLCAwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIHZtYnVzX29uX2lzciAtIElTUiByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgdm1idXNfb25faXNyKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZvaWQgKnBhZ2VfYWRkcjsKKwlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnOworCXVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICpldmVudDsKKworCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV07CisJbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOworCisJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFjdHVhbCBtc2dzIHRvIGJlIHByb2Nlc3MgKi8KKwlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpIHsKKwkJRFBSSU5UX0RCRyhWTUJVUywgInJlY2VpdmVkIG1zZyB0eXBlICVkIHNpemUgJWQiLAorCQkJCW1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSwKKwkJCQltc2ctPmhlYWRlci5wYXlsb2FkX3NpemUpOworCQlyZXQgfD0gMHgxOworCX0KKworCS8qIFRPRE86IENoZWNrIGlmIHRoZXJlIGFyZSBldmVudHMgdG8gYmUgcHJvY2VzcyAqLworCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdOworCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOworCisJLyogU2luY2Ugd2UgYXJlIGEgY2hpbGQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBiaXQgMCAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgJmV2ZW50LT5mbGFnczMyWzBdKSkgeworCQlEUFJJTlRfREJHKFZNQlVTLCAicmVjZWl2ZWQgZXZlbnQgJWQiLCBldmVudC0+ZmxhZ3MzMlswXSk7CisJCXJldCB8PSAweDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgZ2V0X2NoYW5uZWxfaW5mbyhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCBodl9kZXZpY2VfaW5mbyAqaW5mbykKIHsKQEAgLTEzOSwzNSArMzA5LDM4IEBACiAKIAl2bWJ1c19nZXRfZGVidWdfaW5mbyhkZXZpY2UtPmNoYW5uZWwsICZkZWJ1Z19pbmZvKTsKIAotCWluZm8tPkNoYW5uZWxJZCA9IGRlYnVnX2luZm8uUmVsSWQ7Ci0JaW5mby0+Q2hhbm5lbFN0YXRlID0gZGVidWdfaW5mby5TdGF0ZTsKLQltZW1jcHkoJmluZm8tPkNoYW5uZWxUeXBlLCAmZGVidWdfaW5mby5JbnRlcmZhY2VUeXBlLAorCWluZm8tPkNoYW5uZWxJZCA9IGRlYnVnX2luZm8ucmVsaWQ7CisJaW5mby0+Q2hhbm5lbFN0YXRlID0gZGVidWdfaW5mby5zdGF0ZTsKKwltZW1jcHkoJmluZm8tPkNoYW5uZWxUeXBlLCAmZGVidWdfaW5mby5pbnRlcmZhY2V0eXBlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQltZW1jcHkoJmluZm8tPkNoYW5uZWxJbnN0YW5jZSwgJmRlYnVnX2luZm8uSW50ZXJmYWNlSW5zdGFuY2UsCisJbWVtY3B5KCZpbmZvLT5DaGFubmVsSW5zdGFuY2UsICZkZWJ1Z19pbmZvLmludGVyZmFjZV9pbnN0YW5jZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKLQlpbmZvLT5Nb25pdG9ySWQgPSBkZWJ1Z19pbmZvLk1vbml0b3JJZDsKKwlpbmZvLT5Nb25pdG9ySWQgPSBkZWJ1Z19pbmZvLm1vbml0b3JpZDsKIAotCWluZm8tPlNlcnZlck1vbml0b3JQZW5kaW5nID0gZGVidWdfaW5mby5TZXJ2ZXJNb25pdG9yUGVuZGluZzsKLQlpbmZvLT5TZXJ2ZXJNb25pdG9yTGF0ZW5jeSA9IGRlYnVnX2luZm8uU2VydmVyTW9uaXRvckxhdGVuY3k7Ci0JaW5mby0+U2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZCA9IGRlYnVnX2luZm8uU2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZDsKKwlpbmZvLT5TZXJ2ZXJNb25pdG9yUGVuZGluZyA9IGRlYnVnX2luZm8uc2VydmVybW9uaXRvcl9wZW5kaW5nOworCWluZm8tPlNlcnZlck1vbml0b3JMYXRlbmN5ID0gZGVidWdfaW5mby5zZXJ2ZXJtb25pdG9yX2xhdGVuY3k7CisJaW5mby0+U2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZCA9IGRlYnVnX2luZm8uc2VydmVybW9uaXRvcl9jb25uZWN0aW9uaWQ7CiAKLQlpbmZvLT5DbGllbnRNb25pdG9yUGVuZGluZyA9IGRlYnVnX2luZm8uQ2xpZW50TW9uaXRvclBlbmRpbmc7Ci0JaW5mby0+Q2xpZW50TW9uaXRvckxhdGVuY3kgPSBkZWJ1Z19pbmZvLkNsaWVudE1vbml0b3JMYXRlbmN5OwotCWluZm8tPkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQ7CisJaW5mby0+Q2xpZW50TW9uaXRvclBlbmRpbmcgPSBkZWJ1Z19pbmZvLmNsaWVudG1vbml0b3JfcGVuZGluZzsKKwlpbmZvLT5DbGllbnRNb25pdG9yTGF0ZW5jeSA9IGRlYnVnX2luZm8uY2xpZW50bW9uaXRvcl9sYXRlbmN5OworCWluZm8tPkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLmNsaWVudG1vbml0b3JfY29ubmVjdGlvbmlkOwogCi0JaW5mby0+SW5ib3VuZC5JbnRlcnJ1cHRNYXNrID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRJbnRlcnJ1cHRNYXNrOwotCWluZm8tPkluYm91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRSZWFkSW5kZXg7Ci0JaW5mby0+SW5ib3VuZC5Xcml0ZUluZGV4ID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRXcml0ZUluZGV4OwotCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvUmVhZCA9IGRlYnVnX2luZm8uSW5ib3VuZC5CeXRlc0F2YWlsVG9SZWFkOwotCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvV3JpdGUgPSBkZWJ1Z19pbmZvLkluYm91bmQuQnl0ZXNBdmFpbFRvV3JpdGU7CisJaW5mby0+SW5ib3VuZC5JbnRlcnJ1cHRNYXNrID0gZGVidWdfaW5mby5pbmJvdW5kLmN1cnJlbnRfaW50ZXJydXB0X21hc2s7CisJaW5mby0+SW5ib3VuZC5SZWFkSW5kZXggPSBkZWJ1Z19pbmZvLmluYm91bmQuY3VycmVudF9yZWFkX2luZGV4OworCWluZm8tPkluYm91bmQuV3JpdGVJbmRleCA9IGRlYnVnX2luZm8uaW5ib3VuZC5jdXJyZW50X3dyaXRlX2luZGV4OworCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvUmVhZCA9IGRlYnVnX2luZm8uaW5ib3VuZC5ieXRlc19hdmFpbF90b3JlYWQ7CisJaW5mby0+SW5ib3VuZC5CeXRlc0F2YWlsVG9Xcml0ZSA9CisJCWRlYnVnX2luZm8uaW5ib3VuZC5ieXRlc19hdmFpbF90b3dyaXRlOwogCi0JaW5mby0+T3V0Ym91bmQuSW50ZXJydXB0TWFzayA9IGRlYnVnX2luZm8uT3V0Ym91bmQuQ3VycmVudEludGVycnVwdE1hc2s7Ci0JaW5mby0+T3V0Ym91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5PdXRib3VuZC5DdXJyZW50UmVhZEluZGV4OwotCWluZm8tPk91dGJvdW5kLldyaXRlSW5kZXggPSBkZWJ1Z19pbmZvLk91dGJvdW5kLkN1cnJlbnRXcml0ZUluZGV4OwotCWluZm8tPk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPSBkZWJ1Z19pbmZvLk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQ7CisJaW5mby0+T3V0Ym91bmQuSW50ZXJydXB0TWFzayA9CisJCWRlYnVnX2luZm8ub3V0Ym91bmQuY3VycmVudF9pbnRlcnJ1cHRfbWFzazsKKwlpbmZvLT5PdXRib3VuZC5SZWFkSW5kZXggPSBkZWJ1Z19pbmZvLm91dGJvdW5kLmN1cnJlbnRfcmVhZF9pbmRleDsKKwlpbmZvLT5PdXRib3VuZC5Xcml0ZUluZGV4ID0gZGVidWdfaW5mby5vdXRib3VuZC5jdXJyZW50X3dyaXRlX2luZGV4OworCWluZm8tPk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPQorCQlkZWJ1Z19pbmZvLm91dGJvdW5kLmJ5dGVzX2F2YWlsX3RvcmVhZDsKIAlpbmZvLT5PdXRib3VuZC5CeXRlc0F2YWlsVG9Xcml0ZSA9Ci0JCWRlYnVnX2luZm8uT3V0Ym91bmQuQnl0ZXNBdmFpbFRvV3JpdGU7CisJCWRlYnVnX2luZm8ub3V0Ym91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZTsKIH0KIAogLyoKQEAgLTI4Niw0NCArNDU5LDU1IEBACiAgKgktIHNldHVwIHRoZSB2bWJ1cyByb290IGRldmljZQogICoJLSByZXRyaWV2ZSB0aGUgY2hhbm5lbCBvZmZlcnMKICAqLwotc3RhdGljIGludCB2bWJ1c19idXNfaW5pdChpbnQgKCpkcnZfaW5pdCkoc3RydWN0IGh2X2RyaXZlciAqZHJ2KSkKK3N0YXRpYyBpbnQgdm1idXNfYnVzX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKnZtYnVzX2Rydl9jdHggPSAmZ192bWJ1c19kcnY7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCXN0cnVjdCB2bV9kZXZpY2UgKmRldl9jdHggPSAmZ192bWJ1c19kcnYuZGV2aWNlX2N0eDsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCB2ZWN0b3I7CiAKLQkvKgotCSAqIFNldCB0aGlzIHVwIHRvIGFsbG93IGxvd2VyIGxheWVyIHRvIGNhbGxiYWNrIHRvIGFkZC9yZW1vdmUgY2hpbGQKLQkgKiBkZXZpY2VzIG9uIHRoZSBidXMKLQkgKi8KLQl2bWJ1c19kcnZfb2JqLT5PbkNoaWxkRGV2aWNlQ3JlYXRlID0gdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZTsKLQl2bWJ1c19kcnZfb2JqLT5PbkNoaWxkRGV2aWNlRGVzdHJveSA9IHZtYnVzX2NoaWxkX2RldmljZV9kZXN0cm95OwotCXZtYnVzX2Rydl9vYmotPk9uQ2hpbGREZXZpY2VBZGQgPSB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXI7Ci0Jdm1idXNfZHJ2X29iai0+T25DaGlsZERldmljZVJlbW92ZSA9IHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyOworCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBIViBEcml2ZXIgdmVyc2lvbiA9ICVzICsrKysrKysiLAorCQkgICAgSFZfRFJWX1ZFUlNJT04pOworCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBWbWJ1cyBzdXBwb3J0ZWQgdmVyc2lvbiA9ICVkICsrKysrKysiLAorCQkJVk1CVVNfUkVWSVNJT05fTlVNQkVSKTsKKwlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgdXNpbmcgU0lOVCAlZCArKysrKysrIiwKKwkJCVZNQlVTX01FU1NBR0VfU0lOVCk7CisJRFBSSU5UX0RCRyhWTUJVUywgInNpemVvZih2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlcik9JXpkLCAiCisJCQkic2l6ZW9mKFZNQlVTX0NIQU5ORUxfUEFDS0VUX01VTElUUEFHRV9CVUZGRVIpPSV6ZCIsCisJCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X3BhZ2VfYnVmZmVyKSwKKwkJCXNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9wYWNrZXRfbXVsdGlwYWdlX2J1ZmZlcikpOwogCi0JLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGluaXRpYWxpemUgKi8KLQlyZXQgPSBkcnZfaW5pdCgmdm1idXNfZHJ2X29iai0+QmFzZSk7CisJZHJpdmVyLT5uYW1lID0gZ0RyaXZlck5hbWU7CisJbWVtY3B5KCZkcml2ZXItPmRldmljZVR5cGUsICZnVm1idXNEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKworCS8qIFNldHVwIGRpc3BhdGNoIHRhYmxlICovCisJZHJpdmVyLT5PbkRldmljZUFkZAk9IFZtYnVzT25EZXZpY2VBZGQ7CisJZHJpdmVyLT5PbkRldmljZVJlbW92ZQk9IFZtYnVzT25EZXZpY2VSZW1vdmU7CisJZHJpdmVyLT5PbkNsZWFudXAJPSBWbWJ1c09uQ2xlYW51cDsKKworCS8qIEh5cGVydmlzb3IgaW5pdGlhbGl6YXRpb24uLi5zZXR1cCBoeXBlcmNhbGwgcGFnZS4uZXRjICovCisJcmV0ID0gaHZfaW5pdCgpOwogCWlmIChyZXQgIT0gMCkgewotCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIlVuYWJsZSB0byBpbml0aWFsaXplIHZtYnVzICglZCkiLCByZXQpOworCQlEUFJJTlRfRVJSKFZNQlVTLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIGh5cGVydmlzb3IgLSAweCV4IiwKKwkJCQlyZXQpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwotCWlmICghdm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkgeworCWlmICghZHJpdmVyLT5PbkRldmljZUFkZCkgewogCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIk9uRGV2aWNlQWRkKCkgcm91dGluZSBub3Qgc2V0Iik7CiAJCXJldCA9IC0xOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jdm1idXNfZHJ2X2N0eC0+YnVzLm5hbWUgPSB2bWJ1c19kcnZfb2JqLT5CYXNlLm5hbWU7CisJdm1idXNfZHJ2X2N0eC0+YnVzLm5hbWUgPSBkcml2ZXItPm5hbWU7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBidXMgY29udGV4dCAqLwogCXRhc2tsZXRfaW5pdCgmdm1idXNfZHJ2X2N0eC0+bXNnX2RwYywgdm1idXNfbXNnX2RwYywKLQkJICAgICAodW5zaWduZWQgbG9uZyl2bWJ1c19kcnZfb2JqKTsKKwkJICAgICAodW5zaWduZWQgbG9uZylkcml2ZXIpOwogCXRhc2tsZXRfaW5pdCgmdm1idXNfZHJ2X2N0eC0+ZXZlbnRfZHBjLCB2bWJ1c19ldmVudF9kcGMsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpdm1idXNfZHJ2X29iaik7CisJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHJpdmVyKTsKIAogCS8qIE5vdywgcmVnaXN0ZXIgdGhlIGJ1cyBkcml2ZXIgd2l0aCBMRE0gKi8KIAlyZXQgPSBidXNfcmVnaXN0ZXIoJnZtYnVzX2Rydl9jdHgtPmJ1cyk7CkBAIC0zMzQsNyArNTE4LDcgQEAKIAogCS8qIEdldCB0aGUgaW50ZXJydXB0IHJlc291cmNlICovCiAJcmV0ID0gcmVxdWVzdF9pcnEodm1idXNfaXJxLCB2bWJ1c19pc3IsIElSUUZfU0FNUExFX1JBTkRPTSwKLQkJCSAgdm1idXNfZHJ2X29iai0+QmFzZS5uYW1lLCBOVUxMKTsKKwkJCSAgZHJpdmVyLT5uYW1lLCBOVUxMKTsKIAogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIkVSUk9SIC0gVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkIiwKQEAgLTM1Miw3ICs1MzYsNyBAQAogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBhZGQgdGhlIHJvb3QgZGV2aWNlICovCiAJbWVtc2V0KGRldl9jdHgsIDAsIHNpemVvZihzdHJ1Y3Qgdm1fZGV2aWNlKSk7CiAKLQlyZXQgPSB2bWJ1c19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKCZkZXZfY3R4LT5kZXZpY2Vfb2JqLCAmdmVjdG9yKTsKKwlyZXQgPSBkcml2ZXItPk9uRGV2aWNlQWRkKCZkZXZfY3R4LT5kZXZpY2Vfb2JqLCAmdmVjdG9yKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVU19EUlYsCiAJCQkgICAiRVJST1IgLSBVbmFibGUgdG8gYWRkIHZtYnVzIHJvb3QgZGV2aWNlIik7CkBAIC0zOTIsOSArNTc2LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCi0Jdm1idXNfZHJ2X29iai0+R2V0Q2hhbm5lbE9mZmVycygpOwotCisJdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZodl9jaGFubmVsX3JlYWR5KTsKIAogY2xlYW51cDoKQEAgLTQwOCwxNyArNTkwLDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHZtYnVzX2J1c19leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCXN0cnVjdCB2bWJ1c19kcml2ZXJfY29udGV4dCAqdm1idXNfZHJ2X2N0eCA9ICZnX3ZtYnVzX2RydjsKIAogCXN0cnVjdCB2bV9kZXZpY2UgKmRldl9jdHggPSAmZ192bWJ1c19kcnYuZGV2aWNlX2N0eDsKIAogCS8qIFJlbW92ZSB0aGUgcm9vdCBkZXZpY2UgKi8KLQlpZiAodm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKLQkJdm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSgmZGV2X2N0eC0+ZGV2aWNlX29iaik7CisJaWYgKGRyaXZlci0+T25EZXZpY2VSZW1vdmUpCisJCWRyaXZlci0+T25EZXZpY2VSZW1vdmUoJmRldl9jdHgtPmRldmljZV9vYmopOwogCi0JaWYgKHZtYnVzX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQl2bWJ1c19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmdm1idXNfZHJ2X29iai0+QmFzZSk7CisJaWYgKGRyaXZlci0+T25DbGVhbnVwKQorCQlkcml2ZXItPk9uQ2xlYW51cChkcml2ZXIpOwogCiAJLyogVW5yZWdpc3RlciB0aGUgcm9vdCBidXMgZGV2aWNlICovCiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldl9jdHgtPmRldmljZSk7CkBAIC00NDYsNyArNjI4LDYgQEAKICAqLwogaW50IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRyaXZlcl9jdHgpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCWludCByZXQ7CiAKIAlEUFJJTlRfSU5GTyhWTUJVU19EUlYsICJjaGlsZCBkcml2ZXIgKCVwKSByZWdpc3RlcmluZyAtIG5hbWUgJXMiLApAQCAtNDU3LDcgKzYzOCw3IEBACiAKIAlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9jdHgtPmRyaXZlcik7CiAKLQl2bWJ1c19kcnZfb2JqLT5HZXRDaGFubmVsT2ZmZXJzKCk7CisJdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00ODksOSArNjcwLDkgQEAKICAqIHZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUgLSBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBuZXcgY2hpbGQgZGV2aWNlCiAgKiBvbiB0aGUgdm1idXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAotCQkJCQkJICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAotCQkJCQkJICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAorCQkJCQkgICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAorCQkJCQkgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IHZtX2RldmljZSAqY2hpbGRfZGV2aWNlX2N0eDsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqOwpAQCAtNTM4LDggKzcxOSw4IEBACiAvKgogICogdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdGhlIGNoaWxkIGRldmljZSBvbiB0aGUgc3BlY2lmaWVkIGJ1cwogICovCi1zdGF0aWMgaW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpyb290X2RldmljZV9vYmosCi0JCQkJICAgICAgIHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopCitpbnQgdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKnJvb3RfZGV2aWNlX29iaiwKKwkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCB2bV9kZXZpY2UgKnJvb3RfZGV2aWNlX2N0eCA9CkBAIC01ODMsNyArNzY0LDcgQEAKICAqIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY2hpbGQgZGV2aWNlCiAgKiBmcm9tIHRoZSB2bWJ1cy4KICAqLwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKK3ZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKIHsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gdG9fdm1fZGV2aWNlKGRldmljZV9vYmopOwogCkBAIC02MDEsMTMgKzc4Miw2IEBACiB9CiAKIC8qCi0gKiB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveSAtIERlc3Ryb3kgdGhlIHNwZWNpZmllZCBjaGlsZCBkZXZpY2Ugb24gdGhlIHZtYnVzLgotICovCi1zdGF0aWMgdm9pZCB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKQotewotfQotCi0vKgogICogdm1idXNfdWV2ZW50IC0gYWRkIHVldmVudCBmb3Igb3VyIGRldmljZQogICoKICAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgdm1idXMgdG8KQEAgLTcwMSw3ICs4NzUsNyBAQAogCQlzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKnZtYnVzX2Rydl9jdHggPQogCQkJKHN0cnVjdCB2bWJ1c19kcml2ZXJfY29udGV4dCAqKWRyaXZlcl9jdHg7CiAKLQkJZGV2aWNlX2N0eC0+ZGV2aWNlX29iai5Ecml2ZXIgPSAmdm1idXNfZHJ2X2N0eC0+ZHJ2X29iai5CYXNlOworCQlkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLkRyaXZlciA9ICZ2bWJ1c19kcnZfY3R4LT5kcnZfb2JqOwogCQlEUFJJTlRfSU5GTyhWTUJVU19EUlYsCiAJCQkgICAgImRldmljZSBvYmplY3QgKCVwKSBzZXQgdG8gZHJpdmVyIG9iamVjdCAoJXApIiwKIAkJCSAgICAmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKQEAgLTg0OSw3ICsxMDIzLDYgQEAKIHsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gZGV2aWNlX3RvX3ZtX2RldmljZShkZXZpY2UpOwogCi0JLyogdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3koJmRldmljZV9jdHgtPmRldmljZV9vYmopOyAqLwogCWtmcmVlKGRldmljZV9jdHgpOwogCiAJLyogISFETyBOT1QgUkVGRVJFTkNFIGRldmljZV9jdHggYW55bW9yZSBhdCB0aGlzIHBvaW50ISEgKi8KQEAgLTg2MCwzNiArMTAzMywyOCBAQAogICovCiBzdGF0aWMgdm9pZCB2bWJ1c19tc2dfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c19kcnZfb2JqID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkYXRhOwotCi0JLyogQVNTRVJUKHZtYnVzX2Rydl9vYmotPk9uTXNnRHBjICE9IE5VTEwpOyAqLworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3QgaHZfZHJpdmVyICopZGF0YTsKIAogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBoYW5kbGUgaW50ZXJydXB0ICovCi0Jdm1idXNfZHJ2X29iai0+T25Nc2dEcGMoJnZtYnVzX2Rydl9vYmotPkJhc2UpOworCXZtYnVzX29uX21zZ19kcGMoZHJpdmVyKTsKIH0KIAogLyoKLSAqIHZtYnVzX21zZ19kcGMgLSBUYXNrbGV0IHJvdXRpbmUgdG8gaGFuZGxlIGh5cGVydmlzb3IgZXZlbnRzCisgKiB2bWJ1c19ldmVudF9kcGMgLSBUYXNrbGV0IHJvdXRpbmUgdG8gaGFuZGxlIGh5cGVydmlzb3IgZXZlbnRzCiAgKi8KIHN0YXRpYyB2b2lkIHZtYnVzX2V2ZW50X2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZGF0YTsKLQotCS8qIEFTU0VSVCh2bWJ1c19kcnZfb2JqLT5PbkV2ZW50RHBjICE9IE5VTEwpOyAqLwotCiAJLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGhhbmRsZSBpbnRlcnJ1cHQgKi8KLQl2bWJ1c19kcnZfb2JqLT5PbkV2ZW50RHBjKCZ2bWJ1c19kcnZfb2JqLT5CYXNlKTsKKwlWbWJ1c09uRXZlbnRzKCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB2bWJ1c19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2RyaXZlcl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKKwlzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIgPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlpbnQgcmV0OwogCi0JLyogQVNTRVJUKHZtYnVzX2RyaXZlcl9vYmotPk9uSXNyICE9IE5VTEwpOyAqLwotCiAJLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGhhbmRsZSBpbnRlcnJ1cHQgKi8KLQlyZXQgPSB2bWJ1c19kcml2ZXJfb2JqLT5Pbklzcigmdm1idXNfZHJpdmVyX29iai0+QmFzZSk7CisJcmV0ID0gdm1idXNfb25faXNyKGRyaXZlcik7CiAKIAkvKiBTY2hlZHVsZXMgYSBkcGMgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHJldCA+IDApIHsKQEAgLTkyOCw3ICsxMDkzLDcgQEAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0obWljcm9zb2Z0X2h2X2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHZtYnVzX2J1c19pbml0KFZtYnVzSW5pdGlhbGl6ZSk7CisJcmV0dXJuIHZtYnVzX2J1c19pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2bWJ1c19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX3ByaXZhdGUuaAppbmRleCAwOWVhZWM5Li4wN2Y2ZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19wcml2YXRlLmgKQEAgLTEwMiwxMyArMTAyLDE0IEBACiAKIC8qIEdlbmVyYWwgdm1idXMgaW50ZXJmYWNlICovCiAKLXN0cnVjdCBodl9kZXZpY2UgKlZtYnVzQ2hpbGREZXZpY2VDcmVhdGUoc3RydWN0IGh2X2d1aWQgKmRldmljZVR5cGUsCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICpkZXZpY2VUeXBlLAogCQkJCQkgc3RydWN0IGh2X2d1aWQgKmRldmljZUluc3RhbmNlLAogCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwogCiBpbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOwotCi12b2lkIFZtYnVzQ2hpbGREZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK2ludCB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqcm9vdF9kZXZpY2Vfb2JqLAorCQkJCXN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwordm9pZCB2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKTsKIAogLyogc3RhdGljIHZvaWQgKi8KIC8qIFZtYnVzQ2hpbGREZXZpY2VEZXN0cm95KCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZzdG9yYWdlLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaAppbmRleCA0ZWE1OTdkLi5hZThiZTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaApAQCAtMjcsMTUgKzI3LDE3IEBACiAKICNkZWZpbmUgUkVWSVNJT05fU1RSSU5HKFJFVklTSU9OXykgI1JFVklTSU9OXwogI2RlZmluZSBGSUxMX1ZNU1RPUl9SRVZJU0lPTihSRVNVTFRfTFZBTFVFXykJCQkJXAotewkJCQkJCQkJCVwKLQljaGFyICpyZXZpc2lvblN0cmluZyA9IFJFVklTSU9OX1NUUklORygkUmV2aXNpb24gOiA2ICQpICsgMTE7CVwKLQlSRVNVTFRfTFZBTFVFXyA9IDA7CQkJCQkJXAotCXdoaWxlICgqcmV2aXNpb25TdHJpbmcgPj0gJzAnICYmICpyZXZpc2lvblN0cmluZyA8PSAnOScpIHsJXAotCQlSRVNVTFRfTFZBTFVFXyAqPSAxMDsJCQkJCVwKLQkJUkVTVUxUX0xWQUxVRV8gKz0gKnJldmlzaW9uU3RyaW5nIC0gJzAnOwkJXAotCQlyZXZpc2lvblN0cmluZysrOwkJCQkJXAotCX0JCQkJCQkJCVwKLX0KKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKnJldmlzaW9uX3N0cmluZwkJCQkJXAorCQkJPSBSRVZJU0lPTl9TVFJJTkcoJFJldiA6IDYgJCkgKyA2OwkJXAorCQlSRVNVTFRfTFZBTFVFXyA9IDA7CQkJCQlcCisJCXdoaWxlICgqcmV2aXNpb25fc3RyaW5nID49ICcwJwkJCQlcCisJCQkmJiAqcmV2aXNpb25fc3RyaW5nIDw9ICc5JykgewkJCVwKKwkJCVJFU1VMVF9MVkFMVUVfICo9IDEwOwkJCQlcCisJCQlSRVNVTFRfTFZBTFVFXyArPSAqcmV2aXNpb25fc3RyaW5nIC0gJzAnOwlcCisJCQlyZXZpc2lvbl9zdHJpbmcrKzsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQogCiAvKiBNYWpvci9taW5vciBtYWNyb3MuICBNaW5vciB2ZXJzaW9uIGlzIGluIExTQiwgbWVhbmluZyB0aGF0IGVhcmxpZXIgZmxhdCAqLwogLyogdmVyc2lvbiBudW1iZXJzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgIjAueCIgKGkuZS4sIDEgYmVjb21lcyAwLjEpLiAqLwpAQCAtNjUsMTcgKzY3LDE3IEBACiAKIC8qICBQYWNrZXQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdmlydHVhbCBzdG9yYWdlIHJlcXVlc3RzLiAqLwogZW51bSB2c3Rvcl9wYWNrZXRfb3BlcmF0aW9uIHsKLQlWU3Rvck9wZXJhdGlvbkNvbXBsZXRlSW8gICAgICAgICAgICA9IDEsCi0JVlN0b3JPcGVyYXRpb25SZW1vdmVEZXZpY2UgICAgICAgICAgPSAyLAotCVZTdG9yT3BlcmF0aW9uRXhlY3V0ZVNSQiAgICAgICAgICAgID0gMywKLQlWU3Rvck9wZXJhdGlvblJlc2V0THVuICAgICAgICAgICAgICA9IDQsCi0JVlN0b3JPcGVyYXRpb25SZXNldEFkYXB0ZXIgICAgICAgICAgPSA1LAotCVZTdG9yT3BlcmF0aW9uUmVzZXRCdXMgICAgICAgICAgICAgID0gNiwKLQlWU3Rvck9wZXJhdGlvbkJlZ2luSW5pdGlhbGl6YXRpb24gICA9IDcsCi0JVlN0b3JPcGVyYXRpb25FbmRJbml0aWFsaXphdGlvbiAgICAgPSA4LAotCVZTdG9yT3BlcmF0aW9uUXVlcnlQcm90b2NvbFZlcnNpb24gID0gOSwKLQlWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvcGVydGllcyAgICAgICA9IDEwLAotCVZTdG9yT3BlcmF0aW9uTWF4aW11bSAgICAgICAgICAgICAgID0gMTAKKwlWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8JCT0gMSwKKwlWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RFVklDRQkJPSAyLAorCVZTVE9SX09QRVJBVElPTl9FWEVDVVRFX1NSQgkJPSAzLAorCVZTVE9SX09QRVJBVElPTl9SRVNFVF9MVU4JCT0gNCwKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfQURBUFRFUgkJPSA1LAorCVZTVE9SX09QRVJBVElPTl9SRVNFVF9CVVMJCT0gNiwKKwlWU1RPUl9PUEVSQVRJT05fQkVHSU5fSU5JVElBTElaQVRJT04JPSA3LAorCVZTVE9SX09QRVJBVElPTl9FTkRfSU5JVElBTElaQVRJT04JPSA4LAorCVZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9UT0NPTF9WRVJTSU9OCT0gOSwKKwlWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPUEVSVElFUwk9IDEwLAorCVZTVE9SX09QRVJBVElPTl9NQVhJTVVNCQkJPSAxMAogfTsKIAogLyoKQEAgLTg5LDMxICs5MSwyOSBAQAogI2RlZmluZSBTRU5TRV9CVUZGRVJfU0laRQkJCTB4MTIKICNlbmRpZgogCi0jZGVmaW5lIE1BWF9EQVRBX0JVRkZFUl9MRU5HVEhfV0lUSF9QQURESU5HCTB4MTQKKyNkZWZpbmUgTUFYX0RBVEFfQlVGX0xFTl9XSVRIX1BBRERJTkcJCTB4MTQKIAogc3RydWN0IHZtc2NzaV9yZXF1ZXN0IHsKLQl1bnNpZ25lZCBzaG9ydCBMZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBTcmJTdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBTY3NpU3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNyYl9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBzY3NpX3N0YXR1czsKIAotCXVuc2lnbmVkIGNoYXIgUG9ydE51bWJlcjsKLQl1bnNpZ25lZCBjaGFyIFBhdGhJZDsKLQl1bnNpZ25lZCBjaGFyIFRhcmdldElkOwotCXVuc2lnbmVkIGNoYXIgTHVuOworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOworCXVuc2lnbmVkIGNoYXIgbHVuOwogCi0JdW5zaWduZWQgY2hhciBDZGJMZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBTZW5zZUluZm9MZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBEYXRhSW47Ci0JdW5zaWduZWQgY2hhciBSZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIGNkYl9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBzZW5zZV9pbmZvX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFfaW47CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDsKIAotCXVuc2lnbmVkIGludCBEYXRhVHJhbnNmZXJMZW5ndGg7CisJdW5zaWduZWQgaW50IGRhdGFfdHJhbnNmZXJfbGVuZ3RoOwogCiAJdW5pb24gewotCXVuc2lnbmVkIGNoYXIgQ2RiW0NEQjE2R0VORVJJQ19MRU5HVEhdOwotCi0JdW5zaWduZWQgY2hhciBTZW5zZURhdGFbU0VOU0VfQlVGRkVSX1NJWkVdOwotCi0JdW5zaWduZWQgY2hhciBSZXNlcnZlZEFycmF5W01BWF9EQVRBX0JVRkZFUl9MRU5HVEhfV0lUSF9QQURESU5HXTsKKwkJdW5zaWduZWQgY2hhciBjZGJbQ0RCMTZHRU5FUklDX0xFTkdUSF07CisJCXVuc2lnbmVkIGNoYXIgc2Vuc2VfZGF0YVtTRU5TRV9CVUZGRVJfU0laRV07CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfYXJyYXlbTUFYX0RBVEFfQlVGX0xFTl9XSVRIX1BBRERJTkddOwogCX07CiB9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIApAQCAtMTIzLDI0ICsxMjMsMjQgQEAKICAqIHByb3BlcnRpZXMgb2YgdGhlIGNoYW5uZWwuCiAgKi8KIHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzIHsKLQl1bnNpZ25lZCBzaG9ydCBQcm90b2NvbFZlcnNpb247Ci0JdW5zaWduZWQgY2hhciAgUGF0aElkOwotCXVuc2lnbmVkIGNoYXIgIFRhcmdldElkOworCXVuc2lnbmVkIHNob3J0IHByb3RvY29sX3ZlcnNpb247CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOwogCiAJLyogTm90ZTogcG9ydCBudW1iZXIgaXMgb25seSByZWFsbHkga25vd24gb24gdGhlIGNsaWVudCBzaWRlICovCi0JdW5zaWduZWQgaW50ICBQb3J0TnVtYmVyOwotCXVuc2lnbmVkIGludCAgRmxhZ3M7Ci0JdW5zaWduZWQgaW50ICBNYXhUcmFuc2ZlckJ5dGVzOworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1heF90cmFuc2Zlcl9ieXRlczsKIAogCS8qICBUaGlzIGlkIGlzIHVuaXF1ZSBmb3IgZWFjaCBjaGFubmVsIGFuZCB3aWxsIGNvcnJlc3BvbmQgd2l0aCAqLwogCS8qICB2ZW5kb3Igc3BlY2lmaWMgZGF0YSBpbiB0aGUgaW5xdWlyeWRhdGEgKi8KLQl1bnNpZ25lZCBsb25nIGxvbmcgVW5pcXVlSWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHVuaXF1ZV9pZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qICBUaGlzIHN0cnVjdHVyZSBpcyBzZW50IGR1cmluZyB0aGUgc3RvcmFnZSBwcm90b2NvbCBuZWdvdGlhdGlvbnMuICovCiBzdHJ1Y3Qgdm1zdG9yYWdlX3Byb3RvY29sX3ZlcnNpb24gewogCS8qIE1ham9yIChNU1cpIGFuZCBtaW5vciAoTFNXKSB2ZXJzaW9uIG51bWJlcnMuICovCi0JdW5zaWduZWQgc2hvcnQgTWFqb3JNaW5vcjsKKwl1bnNpZ25lZCBzaG9ydCBtYWpvcl9taW5vcjsKIAogCS8qCiAJICogUmV2aXNpb24gbnVtYmVyIGlzIGF1dG8taW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhpcyBmaWxlIGlzIGNoYW5nZWQKQEAgLTE0OCw3ICsxNDgsNyBAQAogCSAqIGRlZmluaXRlbHkgaW5kaWNhdGUgaW5jb21wYXRpYmlsaXR5LS1idXQgaXQgZG9lcyBpbmRpY2F0ZSBtaXNtYXRjaGVkCiAJICogYnVpbGRzLgogCSAqLwotCXVuc2lnbmVkIHNob3J0IFJldmlzaW9uOworCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQ2hhbm5lbCBQcm9wZXJ0eSBGbGFncyAqLwpAQCAtMTU3LDEzICsxNTcsMTMgQEAKIAogc3RydWN0IHZzdG9yX3BhY2tldCB7CiAJLyogUmVxdWVzdGVkIG9wZXJhdGlvbiB0eXBlICovCi0JZW51bSB2c3Rvcl9wYWNrZXRfb3BlcmF0aW9uIE9wZXJhdGlvbjsKKwllbnVtIHZzdG9yX3BhY2tldF9vcGVyYXRpb24gb3BlcmF0aW9uOwogCiAJLyogIEZsYWdzIC0gc2VlIGJlbG93IGZvciB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBpbnQgICAgIEZsYWdzOworCXVuc2lnbmVkIGludCBmbGFnczsKIAogCS8qIFN0YXR1cyBvZiB0aGUgcmVxdWVzdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gKi8KLQl1bnNpZ25lZCBpbnQgICAgIFN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCiAJLyogRGF0YSBwYXlsb2FkIGFyZWEgKi8KIAl1bmlvbiB7CkBAIC0xNzEsMTMgKzE3MSwxMyBAQAogCQkgKiBTdHJ1Y3R1cmUgdXNlZCB0byBmb3J3YXJkIFNDU0kgY29tbWFuZHMgZnJvbSB0aGUKIAkJICogY2xpZW50IHRvIHRoZSBzZXJ2ZXIuCiAJCSAqLwotCQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgVm1TcmI7CisJCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCB2bV9zcmI7CiAKIAkJLyogU3RydWN0dXJlIHVzZWQgdG8gcXVlcnkgY2hhbm5lbCBwcm9wZXJ0aWVzLiAqLwotCQlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBTdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXM7CisJCXN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzIHN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzOwogCiAJCS8qIFVzZWQgZHVyaW5nIHZlcnNpb24gbmVnb3RpYXRpb25zLiAqLwotCQlzdHJ1Y3Qgdm1zdG9yYWdlX3Byb3RvY29sX3ZlcnNpb24gVmVyc2lvbjsKKwkJc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIHZlcnNpb247CiAJfTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KaW5kZXggZmRiMDE3YS4uMmRkZTk3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KQEAgLTEsMTEgKzEsMTIgQEAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2Vbbl0KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlIYXJkd2FyZSBjaGlwIG9yIGRldmljZSBhY2Nlc3NlZCBieSBvbiBjb21tdW5pY2F0aW9uIHBvcnQuCi0JCUNvcnJlc3BvbmRzIHRvIGEgZ3JvdXBpbmcgb2Ygc2Vuc29yIGNoYW5uZWxzLgorCQlDb3JyZXNwb25kcyB0byBhIGdyb3VwaW5nIG9mIHNlbnNvciBjaGFubmVscy4gWCBpcyB0aGUgSUlPCisJCWluZGV4IG9mIHRoZSBkZXZpY2UuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy90cmlnZ2VyW25dCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvdHJpZ2dlclgKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMywyNSArMTQsMjYgQEAKIAkJTWF5IGJlIHByb3ZpZGVkIGJ5IGEgZGV2aWNlIGRyaXZlciB0aGF0IGFsc28gaGFzIGFuIElJTyBkZXZpY2UKIAkJYmFzZWQgb24gaGFyZHdhcmUgZ2VuZXJhdGVkIGV2ZW50cyAoZS5nLiBkYXRhIHJlYWR5KSBvcgogCQlwcm92aWRlZCBieSBhIHNlcGFyYXRlIGRyaXZlciBmb3Igb3RoZXIgaGFyZHdhcmUgKGUuZy4KLQkJcGVyaW9kaWMgdGltZXIsIGdwaW8gb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVyKS4KKwkJcGVyaW9kaWMgdGltZXIsIEdQSU8gb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVyKS4KIAkJQ29udGFpbnMgdHJpZ2dlciB0eXBlIHNwZWNpZmljIGVsZW1lbnRzLiBUaGVzZSBkbyBub3QKIAkJZ2VuZXJhbGl6ZSB3ZWxsIGFuZCBoZW5jZSBhcmUgbm90IGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLgorCQlYIGlzIHRoZSBJSU8gaW5kZXggb2YgdGhlIHRyaWdnZXIuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2Vbbl06YnVmZmVyCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUxpbmsgdG8gL3N5cy9jbGFzcy9paW8vZGV2aWNlW25dL2RldmljZVtuXTpidWZmZXIuIG4gaW5kaWNhdGVzCisJCUxpbmsgdG8gL3N5cy9jbGFzcy9paW8vZGV2aWNlWC9kZXZpY2VYOmJ1ZmZlci4gWCBpbmRpY2F0ZXMKIAkJdGhlIGRldmljZSB3aXRoIHdoaWNoIHRoaXMgYnVmZmVyIGJ1ZmZlciBpcyBhc3NvY2lhdGVkLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL25hbWUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL25hbWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCURlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBjaGlwIC8gZGV2aWNlLiBUeXBpY2FsbHkgYSBwYXJ0Ci0JCW51bWJlci4KKwkJRGVzY3JpcHRpb24gb2YgdGhlIHBoeXNpY2FsIGNoaXAgLyBkZXZpY2UgZm9yIGRldmljZSBYLgorCQlUeXBpY2FsbHkgYSBwYXJ0IG51bWJlci4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9zYW1wbGluZ19mcmVxdWVuY3kKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3NhbXBsaW5nX2ZyZXF1ZW5jeQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTQ0LDkwICs0Niw0OSBAQAogCQlyZWxldmFudCBkaXJlY3Rvcmllcy4gIElmIGl0IGVmZmVjdHMgYWxsIG9mIHRoZSBhYm92ZQogCQl0aGVuIGl0IGlzIHRvIGJlIGZvdW5kIGluIHRoZSBiYXNlIGRldmljZSBkaXJlY3RvcnkgYXMgaGVyZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlXaGVuIHRoZSBpbnRlcm5hbCBzYW1wbGluZyBjbG9jayBjYW4gb25seSB0YWtlIGEgc21hbGwKLQkJZGlzY3JldGUgc2V0IG9mIHZhbHVlcywgdGhpcyBmaWxlIGxpc3RzIHRob3NlIGF2YWlsYWxlLgorCQlkaXNjcmV0ZSBzZXQgb2YgdmFsdWVzLCB0aGlzIGZpbGUgbGlzdHMgdGhvc2UgYXZhaWxhYmxlLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9zdXBwbHlfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlSYXcgKHVuc2NhbGVkIG5vIGJpYXMgcmVtb3ZhbCBldGMpIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZnJvbQotCQljaGFubmVsIG0uIG5hbWUgaXMgdXNlZCBpbiBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoaXMgZG9lcwotCQlub3QgY29ycmVzcG9uZCB0byBleHRlcm5hbGx5IGF2YWlsYWJsZSBpbnB1dCAoZS5nLiBzdXBwbHkKLQkJdm9sdGFnZSBtb25pdG9yaW5nIGluIHdoaWNoIGNhc2UgdGhlIGZpbGUgaXMgaW5fc3VwcGx5X3JhdykuCi0JCUlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZXZlbnRzIG9uIHRoaXMgY2hhbm5lbCB0aGVuIG0gbXVzdCBiZQotCQlzcGVjaWZpZWQgKGV2ZW4gb24gbmFtZWQgY2hhbm5lbHMpIHNvIGFzIHRvIGFsbG93IHRoZSBzb3VyY2UKLQkJb2YgZXZlbnQgY29kZXMgdG8gYmUgaWRlbnRpZmllZC4KKwkJY2hhbm5lbCBZLiBJbiBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoZSBjaGFubmVsIGRvZXMgbm90CisJCWNvcnJlc3BvbmQgdG8gZXh0ZXJuYWxseSBhdmFpbGFibGUgaW5wdXQgb25lIG9mIHRoZSBuYW1lZAorCQl2ZXJzaW9ucyBtYXkgYmUgdXNlZC4gVGhlIG51bWJlciBtdXN0IGFsd2F5cyBiZSBzcGVjaWZpZWQgYW5kCisJCXVuaXF1ZSB0byBhbGxvdyBhc3NvY2lhdGlvbiB3aXRoIGV2ZW50IGNvZGVzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXQKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUlmIGtub3duIGZvciBhIGRldmljZSwgb2Zmc2V0IHRvIGJlIGFkZGVkIHRvIGluW21dX3JhdyBwcmlvcgotCQl0byBzY2FsaW5nIGJ5IGluW19uYW1lXVttXV9zY2FsZSBpbiBvcmRlciB0byBvYnRhaW4gdm9sdGFnZSBpbgotCQltaWxsaXZvbHRzLiAgTm90IHByZXNlbnQgaWYgdGhlIG9mZnNldCBpcyBhbHdheXMgMCBvciB1bmtub3duLgotCQlJZiBtIGlzIG5vdCBwcmVzZW50LCB0aGVuIHZvbHRhZ2Ugb2Zmc2V0IGFwcGxpZXMgdG8gYWxsIGluCi0JCWNoYW5uZWxzLiBNYXkgYmUgd3JpdGFibGUgaWYgYSB2YXJpYWJsZSBvZmZzZXQgaXMgY29udHJvbGxlZAotCQlieSB0aGUgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gY2FsaWJiaWFzIHdoaWNoCi0JCWlzIGZvciBkZXZpY2VzIHRoYXQgYXBwbHkgb2Zmc2V0cyB0byBjb21wZW5zYXRlIGZvciB2YXJpYXRpb24KLQkJYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXJ0LCB0eXBpY2FsbHkgYWRqdXN0ZWQgYnkKLQkJdXNpbmcgc29tZSBoYXJkd2FyZSBzdXBwb3J0ZWQgY2FsaWJyYXRpb24gcHJvY2VkdXJlLgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXRfYXZhaWxhYmxlCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBhIHNtYWxsIG51bWJlciBvZiBkaXNjcmV0ZSBvZmZzZXQgdmFsdWVzIGFyZSBhdmFpbGFibGUsIHRoaXMKLQkJd2lsbCBiZSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0LiAgSWYgdGhlc2UgYXJlIGluZGVwZW5kYW50IChidXQKLQkJb3B0aW9ucyB0aGUgc2FtZSkgZm9yIGluZGl2aWR1YWwgb2Zmc2V0cyB0aGVuIG0gc2hvdWxkIG5vdCBiZQotCQlwcmVzZW50LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXRfW21pbnxtYXhdCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBhIG1vcmUgb3IgbGVzcyBjb250aW51b3VzIHJhbmdlIG9mIHZvbHRhZ2Ugb2Zmc2V0cyBhcmUKLQkJc3VwcG9ydGVkIHRoZW4gdGhlc2Ugc3BlY2lmeSB0aGUgbWluaW11bSBhbmQgbWF4aW11bS4gIElmIHNoYXJlZAotCQlieSBhbGwgaW4gY2hhbm5lbHMgdGhlbiBtIGlzIG5vdCBwcmVzZW50LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9jYWxpYmJpYXMKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gb2Zmc2V0LiAoYXNzdW1lZCB0byBmaXggcHJvZHVjdGlvbgotCQlpbmFjY3VyYWNpZXMpCi0KLVdoYXQJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fY2FsaWJzY2FsZQotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJSGFyZHdhcmUgYXBwbGllZCBjYWxpYnJhdGlvbiBzY2FsZSBmYWN0b3IuIChhc3N1bWVkIHRvIGZpeAotCQlwcm9kdWN0aW9uIGluYWNjdXJhY2llcykKLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fc2NhbGUKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUlmIGtub3duIGZvciBhIGRldmljZSwgc2NhbGUgdG8gYmUgYXBwbGllZCB0byB2b2x0W21dX3JhdyBwb3N0Ci0JCWFkZGl0aW9uIG9mIGluW19uYW1lXVttXV9vZmZzZXQgaW4gb3JkZXIgdG8gb2J0YWluIHRoZSBtZWFzdXJlZAotCQl2b2x0YWdlIGluIG1pbGxpdm9sdHMuICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBpbiBjaGFubmVscyB0aGVuCi0JCW0gaXMgbm90IHByZXNlbnQuCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5bbV0taW5bb11fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pblktaW5aX3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJUmF3ICh1bnNjYWxlZCkgZGlmZmVyZW50aWFsIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZXF1aXZhbGVudCB0bwotCQljaGFubmVsIG0gLSBjaGFubmVsIG8gd2hlcmUgdGhlc2UgY2hhbm5lbCBudW1iZXJzIGFwcGx5IHRvIHRoZQorCQljaGFubmVsIFkgLSBjaGFubmVsIFogd2hlcmUgdGhlc2UgY2hhbm5lbCBudW1iZXJzIGFwcGx5IHRvIHRoZQogCQlwaHlzaWNhbGx5IGVxdWl2YWxlbnQgaW5wdXRzIHdoZW4gbm9uIGRpZmZlcmVudGlhbCByZWFkaW5ncyBhcmUKIAkJc2VwYXJhdGVseSBhdmFpbGFibGUuIEluIGRpZmZlcmVudGlhbCBvbmx5IHBhcnRzLCB0aGVuIGFsbCB0aGF0Ci0JCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGxpbmcuCisJCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGluZy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9hY2NlbFtfeHxfeXxfel1bbV1fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF96X3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmF3ICh1bnNjYWxlZCBubyBiaWFzIHJlbW92YWwgZXRjKSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudC4KKwkJSXQgYW4gYXhpcyBpcyBzcGVjaWZpZWQgaXQgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhlIHRlbXBlcmF0dXJlCisJCXNlbnNvciBpcyBhc3NvY2lhdGVkIHdpdGggb25lIHBhcnQgb2YgYSBjb21wb3VuZCBkZXZpY2UgKGUuZy4KKwkJYSBneXJvc2NvcGUgYXhpcykuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMzUsMjkgKzk2LDMyIEBACiAJCWJ1dCBzaG91bGQgbWF0Y2ggb3RoZXIgc3VjaCBhc3NpZ25tZW50cyBvbiBkZXZpY2UpCiAJCWNoYW5uZWwgbSAobm90IHByZXNlbnQgaWYgb25seSBvbmUgYWNjZWxlcm9tZXRlciBjaGFubmVsIGF0CiAJCXRoaXMgb3JpZW50YXRpb24pLiBIYXMgYWxsIG9mIHRoZSBlcXVpdmFsZW50IHBhcmFtZXRlcnMgYXMgcGVyCi0JCWluW21dLiBVbml0cyBhZnRlciBhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtL3NeMi4KKwkJaW5ZLiBVbml0cyBhZnRlciBhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtL3NeMi4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9neXJvW194fF95fF96XVttXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUFuZ3VsYXIgdmVsb2NpdHkgYWJvdXQgYXhpcyB4LCB5IG9yIHogKG1heSBiZSBhcmJpdHJhcmlseQotCQlhc3NpZ25lZCkgY2hhbm5lbCBtIChub3QgcHJlc2VudCBpZiBvbmx5IG9uZSBneXJvc2NvcGUgYXQKLQkJdGhpcyBvcmllbnRhdGlvbikuCi0JCURhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mIG9mZnNldCB0aGVuIHNjYWxlIHRvCisJCWFzc2lnbmVkKSBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQgdGhlbiBzY2FsZSB0bwogCQlyYWRpYW5zIHBlciBzZWNvbmQuIEhhcyBhbGwgdGhlIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBhcwotCQlwZXIgaW5bbV0uCisJCXBlciBpblkuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5jbGlbX3h8X3l8X3pdW21dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5jbGlfeF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luY2xpX3lfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbmNsaV96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJSW5jbGluYXRpb24gcmF3IHJlYWRpbmcgYWJvdXQgYXhpcyB4LCB5IG9yIHogKG1heSBiZSBhcmJpdGFyaWx5Ci0JCWFzc2lnbmVkKSBjaGFubmVsIG0gKG5vdCBwcmVzZW50IGlmIG9ubHkgb25lIGluY2xpbm9tZXRlciBhdAotCQl0aGlzIG9yaWVudGF0aW9uKS4gIERhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mIG9mZnNldAorCQlJbmNsaW5hdGlvbiByYXcgcmVhZGluZyBhYm91dCBheGlzIHgsIHkgb3IgeiAobWF5IGJlCisJCWFyYml0cmFyaWx5IGFzc2lnbmVkKS4gRGF0YSBjb252ZXJ0ZWQgYnkgYXBwbGljYXRpb24gb2Ygb2Zmc2V0CiAJCWFuZCBzY2FsZSB0byBEZWdyZWVzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL21hZ25bX3h8X3l8X3pdW21dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTE2NSwzNyArMTI5LDE1MCBAQAogCQlhc3NpZ25lZCkgY2hhbm5lbCBtIChub3QgcHJlc2VudCBpZiBvbmx5IG9uZSBtYWduZXRvbWV0ZXIKIAkJYXQgdGhpcyBvcmllbnRhdGlvbikuICBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZgogCQlvZmZzZXQgdGhlbiBzY2FsZSB0byBHYXVzcy4gSGFzIGFsbCB0aGUgZXF1aXZhbGVudCBtb2RpZmllcnMKLQkJYXMgcGVyIGluW21dLgorCQlhcyBwZXIgaW5ZLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2RldmljZVtuXTpldmVudFttXQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeF9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9wZWFrX3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM2CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU29tZSBkZXZpY2VzIHByb3ZpZGUgYSBzdG9yZSBvZiB0aGUgaGlnaGVzdCB2YWx1ZSBzZWVuIHNpbmNlCisJCXNvbWUgcmVzZXQgY29uZGl0aW9uLiAgVGhlc2UgYXR0cmlidXRlcyBhbGxvdyBhY2Nlc3MgdG8gdGhpcworCQlhbmQgYXJlIG90aGVyd2lzZSB0aGUgZGlyZWN0IGVxdWl2YWxlbnQgb2YgdGhlCisJCTx0eXBlPllbX25hbWVdX3JhdyBhdHRyaWJ1dGVzLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94eXpfc3F1YXJlZF9wZWFrX3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM2CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBjb21wdXRlZCBwZWFrIHZhbHVlIGJhc2VkIG9uIHRoZSBzdW0gc3F1YXJlZCBtYWduaXR1ZGUgb2YKKwkJdGhlIHVuZGVybHlpbmcgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb25zLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfb2Zmc2V0CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlDb25maWd1cmF0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIGdlbmVyYXRlZCBldmVudHMgYXJlIHBhc3NlZCB1cCB0bwotCQl1c2Vyc3BhY2UuIFNvbWUgb2YgdGhlc2UgYXJlIGEgYml0IGNvbXBsZXggdG8gZ2VuZXJhbGl6ZSBzbyB0aGlzCi0JCXNlY3Rpb24gaXMgYSB3b3JrIGluIHByb2dyZXNzLgorCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIG9mZnNldCB0byBiZSBhZGRlZCB0byA8dHlwZT5bWV1fcmF3IHByaW9yCisJCXRvIHNjYWxpbmcgYnkgPHR5cGU+W1ldX3NjYWxlIGluIG9yZGVyIHRvIG9idGFpbiB2YWx1ZSBpbiB0aGUKKwkJPHR5cGU+IHVuaXRzIGFzIHNwZWNpZmllZCBpbiA8dHlwZT5beV1fcmF3IGRvY3VtZW50YXRpb24uCisJCU5vdCBwcmVzZW50IGlmIHRoZSBvZmZzZXQgaXMgYWx3YXlzIDAgb3IgdW5rbm93bi4gSWYgWSBpcyBub3QKKwkJcHJlc2VudCwgdGhlbiB0aGUgb2Zmc2V0IGFwcGxpZXMgdG8gYWxsIGluIGNoYW5uZWxzIG9mIDx0eXBlPi4KKwkJTWF5IGJlIHdyaXRhYmxlIGlmIGEgdmFyaWFibGUgb2Zmc2V0IGNhbiBiZSBhcHBsaWVkIG9uIHRoZQorCQlkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byBjYWxpYmJpYXMgd2hpY2gKKwkJaXMgZm9yIGRldmljZXMgKG9yIGRyaXZlcnMpIHRoYXQgYXBwbHkgb2Zmc2V0cyB0byBjb21wZW5zYXRlCisJCWZvciB2YXJpYXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXJ0LCB0eXBpY2FsbHkKKwkJYWRqdXN0ZWQgYnkgdXNpbmcgc29tZSBoYXJkd2FyZSBzdXBwb3J0ZWQgY2FsaWJyYXRpb24gcHJvY2VkdXJlLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbl9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3BlYWtfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25fc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25feF9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl95X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3pfc2NhbGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCW1ham9yOm1pbm9yIGNoYXJhY3RlciBkZXZpY2UgbnVtYmVycyBmb3IgdGhlIGV2ZW50IGxpbmUuCisJCUlmIGtub3duIGZvciBhIGRldmljZSwgc2NhbGUgdG8gYmUgYXBwbGllZCB0byA8dHlwZT5ZW19uYW1lXV9yYXcKKwkJcG9zdCBhZGRpdGlvbiBvZiA8dHlwZT5bWV1bX25hbWVdX29mZnNldCBpbiBvcmRlciB0byBvYnRhaW4gdGhlCisJCW1lYXN1cmVkIHZhbHVlIGluIDx0eXBlPiB1bml0cyBhcyBzcGVjaWZpZWQgaW4KKwkJPHR5cGU+W1ldW19uYW1lXV9yYXcgZG9jdW1lbnRhdGlvbi4uICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBpbgorCQljaGFubmVscyB0aGVuIFkgaXMgbm90IHByZXNlbnQgYW5kIHRoZSB2YWx1ZSBpcyBjYWxsZWQKKwkJPHR5cGU+W1ldW19uYW1lXV9zY2FsZS4gVGhlIHBlYWsgbW9kaWZpZXIgbWVhbnMgdGhpcyB2YWx1ZQorCQlpcyBhcHBsaWVkIHRvIDx0eXBlPllbX25hbWVdX3BlYWtfcmF3IHZhbHVlcy4KIAotVGFraW5nIGFjY2VsX3gwIGFzIGFuIGV4YW1wbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3hfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF95X2NhbGliYmlhcworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feF9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feV9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fel9jYWxpYmJpYXMKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gb2Zmc2V0LiAoYXNzdW1lZCB0byBmaXggcHJvZHVjdGlvbgorCQlpbmFjY3VyYWNpZXMpLiBJZiBzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscywgPHR5cGU+X2NhbGliYmlhcworCQlpcyB1c2VkLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2FjY2VsX3gwX3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV9lbgorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5fY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfY2FsaWJzY2FsZQorS2VybmVsVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSGFyZHdhcmUgYXBwbGllZCBjYWxpYnJhdGlvbiBzY2FsZSBmYWN0b3IuIChhc3N1bWVkIHRvIGZpeAorCQlwcm9kdWN0aW9uIGluYWNjdXJhY2llcykuICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscywKKwkJPHR5cGU+X2NhbGlic2NhbGUgaXMgdXNlZC4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfc2NhbGVfYXZhaWxhYmxlCitLZXJuZWxWZXJzaW9uOgkyLjYzNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUlmIGEgZGlzY3JldGUgc2V0IG9mIHNjYWxlIHZhbHVlcyBhcmUgYXZhaWxhYmxlLCB0aGV5CisJCWFyZSBsaXN0ZWQgaW4gdGhpcyBhdHRyaWJ1dGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2RldmljZVg6ZXZlbnRZCitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlDb25maWd1cmF0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIGdlbmVyYXRlZCBldmVudHMgYXJlIHBhc3NlZCB1cAorCQl0byB1c2VyLXNwYWNlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpldmVudC9kZXYKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmV2ZW50WS9kZXYKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCW1ham9yOm1pbm9yIGNoYXJhY3RlciBkZXZpY2UgbnVtYmVycyBmb3IgdGhlIGV2ZW50IGxpbmUgWSBvZgorCQlkZXZpY2UgWC4KKworV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX2ZhbGxpbmdfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUV2ZW50IGdlbmVyYXRlZCB3aGVuIGFjY2VsX3gwIHBhc3NlcyBhIHRocmVzaG9sZCBpbiB0aGUgc3BlY2ZpZWQKKwkJRXZlbnQgZ2VuZXJhdGVkIHdoZW4gY2hhbm5lbCBwYXNzZXMgYSB0aHJlc2hvbGQgaW4gdGhlIHNwZWNpZmllZAogCQkoX3Jpc2luZ3xfZmFsbGluZykgZGlyZWN0aW9uLiBJZiB0aGUgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAJCXRoZW4gZWl0aGVyIHRoZSBkZXZpY2Ugd2lsbCByZXBvcnQgYW4gZXZlbnQgd2hpY2ggZXZlciBkaXJlY3Rpb24KIAkJYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlIGlzIGNhbGxlZCBpbiAoZS5nLgotCQlhY2NlbF94MF88cmF3fGlucHV0Pl90aHJlc2hfdmFsdWUpIG9yCi0JCWFjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaF9yaXNpbmdfdmFsdWUgYW5kCi0JCWFjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaF9mYWxsaW5nX3ZhbHVlIG1heSB0YWtlIGRpZmZlcmVudAotCQl2YWx1ZXMsIGJ1dCB0aGUgZGV2aWNlIGNhbiBvbmx5IGVuYWJsZSBib3RoIHRocmVzaG9sZHMgb3IKLQkJbmVpdGhlci4KKwkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl90aHJlc2hfdmFsdWUpIG9yCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX3Jpc2luZ192YWx1ZSBhbmQKKwkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl90aHJlc2hfZmFsbGluZ192YWx1ZSBtYXkgdGFrZQorCQlkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhlIGRldmljZSBjYW4gb25seSBlbmFibGUgYm90aCB0aHJlc2hvbGRzCisJCW9yIG5laXRoZXIuCiAJCU5vdGUgdGhlIGRyaXZlciB3aWxsIGFzc3VtZSB0aGUgbGFzdCBwIGV2ZW50cyByZXF1ZXN0ZWQgYXJlCiAJCXRvIGJlIGVuYWJsZWQgd2hlcmUgcCBpcyBob3dldmVyIG1hbnkgaXQgc3VwcG9ydHMgKHdoaWNoIG1heQogCQl2YXJ5IGRlcGVuZGluZyBvbiB0aGUgZXhhY3Qgc2V0IHJlcXVlc3RlZC4gU28gaWYgeW91IHdhbnQgdG8gYmUKQEAgLTIwNSwxODYgKzI4MiwzMzggQEAKIAkJYSBnaXZlbiBldmVudCB0eXBlIGlzIGVuYWJsZWQgYSBmdXR1cmUgcG9pbnQgKGFuZCBub3QgdGhvc2UgZm9yCiAJCXdoYXRldmVyIGV2ZW50IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQpLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfPHJhd3xpbnB1dD5fdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfZmFsbGluZ19lbgorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJRXZlbnQgZ2VuZXJhdGVkIHdoZW4gY2hhbm5lbCBwYXNzZXMgYSB0aHJlc2hvbGQgb24gdGhlIHJhdGUgb2YKKwkJY2hhbmdlICgxc3QgZGlmZmVyZW50aWFsKSBpbiB0aGUgc3BlY2lmaWVkIChfcmlzaW5nfF9mYWxsaW5nKQorCQlkaXJlY3Rpb24uIElmIHRoZSBkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlbiBlaXRoZXIgdGhlCisJCWRldmljZSB3aWxsIHJlcG9ydCBhbiBldmVudCB3aGljaCBldmVyIGRpcmVjdGlvbiBhIHNpbmdsZQorCQl0aHJlc2hvbGQgdmFsdWUgaXMgY2FsbGVkIGluIChlLmcuCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fcm9jX3ZhbHVlKSBvcgorCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY19yaXNpbmdfdmFsdWUgYW5kCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fcm9jX2ZhbGxpbmdfdmFsdWUgbWF5IHRha2UKKwkJZGlmZmVyZW50IHZhbHVlcywgYnV0IHRoZSBkZXZpY2UgY2FuIG9ubHkgZW5hYmxlIGJvdGggcmF0ZSBvZgorCQljaGFuZ2UgdGhyZXNob2xkcyBvciBuZWl0aGVyLgorCQlOb3RlIHRoZSBkcml2ZXIgd2lsbCBhc3N1bWUgdGhlIGxhc3QgcCBldmVudHMgcmVxdWVzdGVkIGFyZQorCQl0byBiZSBlbmFibGVkIHdoZXJlIHAgaXMgaG93ZXZlciBtYW55IGl0IHN1cHBvcnRzICh3aGljaCBtYXkKKwkJdmFyeSBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IHNldCByZXF1ZXN0ZWQuIFNvIGlmIHlvdSB3YW50IHRvIGJlCisJCXN1cmUgeW91IGhhdmUgc2V0IHdoYXQgeW91IHRoaW5rIHlvdSBoYXZlLCBjaGVjayB0aGUgY29udGVudHMgb2YKKwkJdGhlc2UgYXR0cmlidXRlcyBhZnRlciBldmVyeXRoaW5nIGlzIGNvbmZpZ3VyZWQuIERyaXZlcnMgbWF5CisJCWhhdmUgdG8gYnVmZmVyIGFueSBwYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgY29uc2lzdGVudCB3aGVuCisJCWEgZ2l2ZW4gZXZlbnQgdHlwZSBpcyBlbmFibGVkIGEgZnV0dXJlIHBvaW50IChhbmQgbm90IHRob3NlIGZvcgorCQl3aGF0ZXZlciBldmVudCB3YXMgcHJldmlvdXNseSBlbmFibGVkKS4KKworV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aHJlc2hvbGQgdGhhdCB0aGUgZGV2aWNlIGlzIGNvbXBhcmluZwogCQlhZ2FpbnN0IGZvciB0aGUgZXZlbnRzIGVuYWJsZWQgYnkKLQkJYWNjZWxfeDBfPHJhd3xpbnB1dD5fdGhyZXNoW19yaXNpbmd8ZmFsbGluZ11fZW4uCi0JCUlmIHNlcGVyYXRlIGV4aXN0IGZvciB0aGUgdHdvIGRpcmVjdGlvbnMsIGJ1dCBkaXJlY3Rpb24gaXMKLQkJbm90IHNwZWNpZmllZCBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRoZW4gYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlCi0JCWFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgorCQk8dHlwZT5aW19uYW1lXV90aHJlc2hbX3Jpc2luZ3xmYWxsaW5nXV9lbi4KKwkJSWYgc2VwYXJhdGUgYXR0cmlidXRlcyAgZXhpc3QgZm9yIHRoZSB0d28gZGlyZWN0aW9ucywgYnV0CisJCWRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGZvciB0aGlzIGF0dHJpYnV0ZSwgdGhlbiBhIHNpbmdsZQorCQl0aHJlc2hvbGQgdmFsdWUgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCiAJCVRoZSByYXcgb3IgaW5wdXQgZWxlbWVudCBvZiB0aGUgbmFtZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUKIAkJdmFsdWUgaXMgaW4gcmF3IGRldmljZSB1bml0cyBvciBpbiBwcm9jZXNzZWQgdW5pdHMgKGFzIF9yYXcKIAkJYW5kIF9pbnB1dCBkbyBvbiBzeXNmcyBkaXJlY3QgY2hhbm5lbCByZWFkIGF0dHJpYnV0ZXMpLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX21lYW5wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBvdmVyIHdoaWNoIHRoZSByYXcgY2hhbm5lbCB2YWx1ZQotCQlpcyBhdmVyYWdlZCBiZWZvcmUgYmVpbmcgY29tcGFyZWQgd2l0aCB0aGUgdGhyZXNob2xkIHNldCBpbgotCQlhY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fbWVhbnBlcmlvZC4gIElmIGRpcmVjdGlvbiBpcwotCQlub3Qgc3BlY2lmaWVkIHRoZW4gdGhpcyBtZWFuIHBlcmlvZCBhcHBsaWVzIHRvIGJvdGggZGlyZWN0aW9ucy4KKwkJU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiByYXRlIG9mIGNoYW5nZSB0aHJlc2hvbGQgdGhhdCB0aGUKKwkJZGV2aWNlIGlzIGNvbXBhcmluZyBhZ2FpbnN0IGZvciB0aGUgZXZlbnRzIGVuYWJsZWQgYnkKKwkJPHR5cGU+W1pdW19uYW1lXV9yb2NbX3Jpc2luZ3xmYWxsaW5nXV9lbi4KKwkJSWYgc2VwYXJhdGUgYXR0cmlidXRlcyBleGlzdCBmb3IgdGhlIHR3byBkaXJlY3Rpb25zLAorCQlidXQgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgYXR0cmlidXRlLAorCQl0aGVuIGEgc2luZ2xlIHRocmVzaG9sZCB2YWx1ZSBhcHBsaWVzIHRvIGJvdGggZGlyZWN0aW9ucy4KKwkJVGhlIHJhdyBvciBpbnB1dCBlbGVtZW50IG9mIHRoZSBuYW1lIGluZGljYXRlcyB3aGV0aGVyIHRoZQorCQl2YWx1ZSBpcyBpbiByYXcgZGV2aWNlIHVuaXRzIG9yIGluIHByb2Nlc3NlZCB1bml0cyAoYXMgX3JhdworCQlhbmQgX2lucHV0IGRvIG9uIHN5c2ZzIGRpcmVjdCBjaGFubmVsIHJlYWQgYXR0cmlidXRlcykuCiAKLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pbnpfc3VwcGx5X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX3BlcmlvZAogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgdGhyZXNob2xkIG11c3QgYmUKLQkJcGFzc2VkIGJlZm9yZSBhbiBldmVudCBpcyBnZW5lcmF0ZWQuIElmIGRpcmVjdGlvbiBpcyBub3QKKwkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgY29uZGl0aW9uIG11c3QgYmUKKwkJbWV0IGJlZm9yZSBhbiBldmVudCBpcyBnZW5lcmF0ZWQuIElmIGRpcmVjdGlvbiBpcyBub3QKIAkJc3BlY2lmaWVkIHRoZW4gdGhpcyBwZXJpb2QgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06ZXZlbnRbbV0vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeCZ5JnpfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX2VuCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlTaW1pbGFyIHRvIGFjY2VsX3gwX3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV9lbiwgYnV0IGhlcmUgdGhlCisJCVNpbWlsYXIgdG8gYWNjZWxfeF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQogCQltYWduaXR1ZGUgb2YgdGhlIGNoYW5uZWwgaXMgY29tcGFyZWQgdG8gdGhlIHRocmVzaG9sZCwgbm90IGl0cwogCQlzaWduZWQgdmFsdWUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF88cmF3fGlucHV0Pl9tYWdbX3Jpc2luZ3xfZmFsbGluZ11fdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9hY2NlbF9yYXdfbWFnX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vYWNjZWxfeF9yYXdfbWFnX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3lfcmF3X21hZ19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9hY2NlbF96X3Jhd19tYWdfcmlzaW5nX3ZhbHVlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbm5lbCBpcyBjb21wYXJlZC4KKwkJVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5uZWwgaXMgY29tcGFyZWQuIElmCisJCW51bWJlciBvciBkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwgYXBwbGllcyB0byBhbGwgY2hhbm5lbHMgb2YKKwkJdGhpcyB0eXBlLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX21lYW5wZXJpb2QKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBvdmVyIHdoaWNoIHRoZSB2YWx1ZSBvZiB0aGUgY2hhbm5lbAotCQlpcyBhdmVyYWdlZCBiZWZvcmUgYmVpbmcgY29tcGFyZWQgdG8gdGhlIHRocmVzaG9sZAotCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX3BlcmlvZAotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgY29uZGl0aW9uIG11c3QgYmUgdHJ1ZQotCQliZWZvcmUgYW4gZXZlbnQgb2NjdXJzLgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9lbgotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJU2ltaWxhciB0byBhY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQotCQlmaXJzdCBkaWZmZXJlbnRpYWwgaXMgY29tcGFyZWQgd2l0aCB0aGUgdGhyZXNob2xkLgotCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfPHJhd3xpbnB1dD5fcm9jW19yaXNpbmd8X2ZhbGxpbmddX3ZhbHVlCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGZpcnN0IGRpZmZlcmVudGlhbCBvZiB0aGUgY2hhbm5lbCBpcwotCQljb21wYXJlZC4KLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9tZWFucGVyaW9kCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgdmFsdWUgb2YgdGhlIGNoYW5uZWwKLQkJaXMgYXZlcmFnZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIHRvIHRoZSB0aHJlc2hvbGQKLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9wZXJpb2QKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBmb3Igd2hpY2ggdGhlIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUKLQkJYmVmb3JlIGFuIGV2ZW50IG9jY3Vycy4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9kZXZpY2Vbbl06YnVmZmVyOmV2ZW50L2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyOmV2ZW50L2RldgogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJQnVmZmVyIGZvciBkZXZpY2UgbiBldmVudCBjaGFyYWN0ZXIgZGV2aWNlIG1ham9yOm1pbm9yIG51bWJlcnMuCisJCUJ1ZmZlciBmb3IgZGV2aWNlIFggZXZlbnQgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2RldmljZVtuXTpidWZmZXI6YWNjZXNzL2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyOmFjY2Vzcy9kZXYKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUJ1ZmZlciBmb3IgZGV2aWNlIG4gYWNjZXNzIGNoYXJhY3RlciBkZXZpY2UgbyBtYWpvcjptaW5vciBudW1iZXJzLgorCQlCdWZmZXIgZm9yIGRldmljZSBYIGFjY2VzcyBjaGFyYWN0ZXIgZGV2aWNlIG1ham9yOm1pbm9yIG51bWJlcnMuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL3RyaWdnZXIKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci90cmlnZ2VyCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlUaGUgbmFtZSBvZiB0aGUgdHJpZ2dlciBzb3VyY2UgYmVpbmcgdXNlZCwgYXMgcGVyIHN0cmluZyBnaXZlbgotCQlpbiAvc3lzL2NsYXNzL2lpby90cmlnZ2VyW25dL25hbWUuCisJCWluIC9zeXMvY2xhc3MvaWlvL3RyaWdnZXJZL25hbWUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL2xlbmd0aAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL2xlbmd0aAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJTnVtYmVyIG9mIHNjYW5zIGNvbnRhaW5lZCBieSB0aGUgYnVmZmVyLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmJ1ZmZlci9ieXRlc19wZXJfZGF0dW0KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9ieXRlc19wZXJfZGF0dW0KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUJ5dGVzIHBlciBzY2FuLiAgRHVlIHRvIGFsaWdubWVudCBmdW4sIHRoZSBzY2FuIG1heSBiZSBsYXJnZXIKIAkJdGhhbiBpbXBsaWVkIGRpcmVjdGx5IGJ5IHRoZSBzY2FuX2VsZW1lbnQgcGFyYW1ldGVycy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpidWZmZXIvZW5hYmxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvZW5hYmxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBY3R1YWxseSBzdGFydCB0aGUgYnVmZmVyIGNhcHR1cmUgdXAuICBXaWxsIHN0YXJ0IHRyaWdnZXIKIAkJaWYgZmlyc3QgZGV2aWNlIGFuZCBhcHByb3ByaWF0ZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpidWZmZXIvYWxpZ25tZW50Ci1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlNaW5pbXVtIGRhdGEgYWxpZ25tZW50LiAgU2NhbiBlbGVtZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFyZQotCQlhbGlnbmVkIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgdGltZXMgdGhpcy4gIChtYXkgbm90IGJlCi0JCXRydWUgaW4gd2VpcmQgaGFyZHdhcmUgYnVmZmVycyB0aGF0IHBhY2sgZGF0YSB3ZWxsKQotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cwogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJRGlyZWN0b3J5IGNvbnRhaW5pbmcgaW50ZXJmYWNlcyBmb3IgZWxlbWVudHMgdGhhdCB3aWxsIGJlCiAJCWNhcHR1cmVkIGZvciBhIHNpbmdsZSB0cmlnZ2VyZWQgc2FtcGxlIHNldCBpbiB0aGUgYnVmZmVyLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsX3gwX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF94X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF95X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF96X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3hfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9feV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb196X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3hfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25feV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl96X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy90aW1lc3RhbXBfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZLWluWl9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeF9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeV9lbgogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU2NhbiBlbGVtZW50IGNvbnRyb2wgZm9yIHRyaWdnZXJlZCBkYXRhIGNhcHR1cmUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxbX3gwXV90eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luLWluX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfdHlwZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX3R5cGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCURlc2NyaXB0aW9uIG9mIHRoZSBzY2FuIGVsZW1lbnQgZGF0YSBzdG9yYWdlIHdpdGhpbiB0aGUgYnVmZmVyCi0JCWFuZCBoZW5jZSB0aGUgZm9ybSBpbiB3aGljaCBpdCBpcyByZWFkIGZyb20gdXNlcnNwYWNlLgotCQlGb3JtIGlzIFtzfHVdYml0cy9zdG9yYWdlYml0cy4gIHMgb3IgdSBzcGVjaWZpZXMgaWYgc2lnbmVkCi0JCSgyJ3MgY29tcGxlbWVudCkgb3IgdW5zaWduZWQuIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mCi0JCWRhdGEgYW5kIHN0b3JhZ2ViaXRzIGlzIHRoZSBzcGFjZSAoYWZ0ZXIgcGFkZGluZykgdGhhdCBpdAotCQlvY2N1cGllcyBpbiB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHNvbWUgZGV2aWNlcyB3aWxsIGhhdmUKLQkJYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgdW51c2VkIGJpdHMgc28gdG8gZ2V0IGEgY2xlYW4KLQkJdmFsdWUsIHRoZSBiaXRzIHZhbHVlIG11c3QgYmUgdXNlZCB0byBtYXNrIHRoZSBidWZmZXIgb3V0cHV0Ci0JCXZhbHVlIGFwcHJvcHJpYXRlbHkuICBUaGUgc3RvcmFnZWJpdHMgdmFsdWUgYWxzbyBzcGVjaWZpZXMgdGhlCi0JCWRhdGEgYWxpZ25tZW50LiAgU28gczQ4LzY0IHdpbGwgYmUgYSBzaWduZWQgNDggYml0IGludGVnZXIKLQkJc3RvcmVkIGluIGEgNjQgYml0IGxvY2F0aW9uIGFsaWduZWQgdG8gYSBhNjQgYml0IGJvdW5kYXJ5LgorCQlhbmQgaGVuY2UgdGhlIGZvcm0gaW4gd2hpY2ggaXQgaXMgcmVhZCBmcm9tIHVzZXItc3BhY2UuCisJCUZvcm0gaXMgW3N8dV1iaXRzL3N0b3JhZ2ViaXRzWz4+c2hpZnRdLiAgcyBvciB1IHNwZWNpZmllcyBpZgorCQlzaWduZWQgKDIncyBjb21wbGVtZW50KSBvciB1bnNpZ25lZC4gYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMKKwkJb2YgZGF0YSBhbmQgc3RvcmFnZWJpdHMgaXMgdGhlIHNwYWNlIChhZnRlciBwYWRkaW5nKSB0aGF0IGl0CisJCW9jY3VwaWVzIGluIHRoZSBidWZmZXIuIHNoaWZ0IGlmIHNwZWNpZmllZCwgaXMgdGhlIHNoaWZ0IHRoYXQKKwkJbmVlZHMgdG8gYmUgYXBwbGllZCBwcmlvciB0byBtYXNraW5nIG91dCB1bnVzZWQgYml0cy4gU29tZQorCQlkZXZpY2VzIHB1dCB0aGVpciBkYXRhIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRyYW5zZmVycmVkIGVsZW1lbnRzCisJCXdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBib3RoIHNpZGVzLiAgTm90ZSB0aGF0IHNvbWUKKwkJZGV2aWNlcyB3aWxsIGhhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgdW51c2VkIGJpdHMKKwkJc28gdG8gZ2V0IGEgY2xlYW4gdmFsdWUsIHRoZSBiaXRzIHZhbHVlIG11c3QgYmUgdXNlZCB0byBtYXNrCisJCXRoZSBidWZmZXIgb3V0cHV0IHZhbHVlIGFwcHJvcHJpYXRlbHkuICBUaGUgc3RvcmFnZWJpdHMgdmFsdWUKKwkJYWxzbyBzcGVjaWZpZXMgdGhlIGRhdGEgYWxpZ25tZW50LiAgU28gczQ4LzY0Pj4yIHdpbGwgYmUgYQorCQlzaWduZWQgNDggYml0IGludGVnZXIgc3RvcmVkIGluIGEgNjQgYml0IGxvY2F0aW9uIGFsaWduZWQgdG8KKwkJYSBhNjQgYml0IGJvdW5kYXJ5LiBUbyBvYnRhaW4gdGhlIGNsZWFuIHZhbHVlLCBzaGlmdCByaWdodCAyCisJCWFuZCBhcHBseSBhIG1hc2sgdG8gemVybyB0aGUgdG9wIDE2IGJpdHMgb2YgdGhlIHJlc3VsdC4KIAkJRm9yIG90aGVyIHN0b3JhZ2UgY29tYmluYXRpb25zIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgZXh0ZW5kZWQKIAkJYXBwcm9wcmlhdGVseS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9idWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbFtfeDBdX2luZGV4CitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlX2F2YWlsYWJsZQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSWYgdGhlIHR5cGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiBhIHNtYWxsIHNldCBvZiB2YWx1ZXMsCisJCXRoaXMgYXR0cmlidXRlIGxpc3RzIHRoZW0uCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX3N1cHBseV9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeV9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb194X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3lfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9fel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl94X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3lfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX2luZGV4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHBvc2l0aW9uIG9mIHRoaXMKLQkJc2NhbiBlbGVtZW50IGluIHRoZSBidWZmZXIuIE5vdGUgdGhlc2UgYXJlIG5vdCBkZXBlbmRhbnQgb24KLQkJd2hhdCBpcyBlbmFibGVkIGFuZCBtYXkgbm90IGJlIGNvbnRpZ3VvdXMuIFRodXMgZm9yIHVzZXJzcGFjZQorCQlzY2FuIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci4gTm90ZSB0aGVzZSBhcmUgbm90IGRlcGVuZGVudCBvbgorCQl3aGF0IGlzIGVuYWJsZWQgYW5kIG1heSBub3QgYmUgY29udGlndW91cy4gVGh1cyBmb3IgdXNlci1zcGFjZQogCQl0byBlc3RhYmxpc2ggdGhlIGZ1bGwgbGF5b3V0IHRoZXNlIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbgogCQl3aXRoIGFsbCBfZW4gYXR0cmlidXRlcyB0byBlc3RhYmxpc2ggd2hpY2ggY2hhbm5lbHMgYXJlIHByZXNlbnQsCiAJCWFuZCB0aGUgcmVsZXZhbnQgX3R5cGUgYXR0cmlidXRlcyB0byBlc3RhYmxpc2ggdGhlIGRhdGEgc3RvcmFnZQogCQlmb3JtYXQuCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxbX3gwXV9zaGlmdAotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJQSBiaXQgc2hpZnQgKHRvIHJpZ2h0KSB0aGF0IG11c3QgYmUgYXBwbGllZCBwcmlvciB0bwotCQlleHRyYWN0aW5nIHRoZSBiaXRzIHNwZWNpZmllZCBieSBhY2NlbFtfeDBdX3ByZWNpc2lvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWRkcyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWRkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRkNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8tZGRzCkBAIC0wLDAgKzEsOTMgQEAKKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTdG9yZXMgZnJlcXVlbmN5IGludG8gdHVuaW5nIHdvcmQgWS4KKwkJVGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIGRkc1hfZnJlcVkgZmlsZSwgd2hpY2ggYWxsb3dzIGZvcgorCQlwaW4gY29udHJvbGxlZCBGU0sgRnJlcXVlbmN5IFNoaWZ0IEtleWluZworCQkoZGRzWF9waW5jb250cm9sX2ZyZXFfZW4gaXMgYWN0aXZlKSBvciB0aGUgdXNlciBjYW4gY29udHJvbAorCQl0aGUgZGVzaXJlZCBhY3RpdmUgdHVuaW5nIHdvcmQgYnkgd3JpdGluZyBZIHRvIHRoZQorCQlkZHNYX2ZyZXFzeW1ib2wgZmlsZS4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZX3NjYWxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTY2FsZSB0byBiZSBhcHBsaWVkIHRvIGRkc1hfZnJlcVkgaW4gb3JkZXIgdG8gb2J0YWluIHRoZQorCQlkZXNpcmVkIHZhbHVlIGluIEh6LiBJZiBzaGFyZWQgYWNyb3NzIGFsbCBmcmVxdWVuY3kgcmVnaXN0ZXJzCisJCVkgaXMgbm90IHByZXNlbnQuIEl0IGlzIGFsc28gcG9zc2libGUgWCBpcyBub3QgcHJlc2VudCBpZgorCQlzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFzeW1ib2wKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNwZWNpZmllcyB0aGUgYWN0aXZlIG91dHB1dCBmcmVxdWVuY3kgdHVuaW5nIHdvcmQuIFRoZSB2YWx1ZQorCQljb3JyZXNwb25kcyB0byB0aGUgWSBpbiBkZHNYX2ZyZXFZLiBUbyBleGl0IHRoaXMgbW9kZSB0aGUgdXNlcgorCQljYW4gd3JpdGUgZGRzWF9waW5jb250cm9sX2ZyZXFfZW4gb3IgZGRzWF9vdXRfZW5hYmxlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZVkKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVN0b3JlcyBwaGFzZSBpbnRvIFkuCisJCVRoZXJlIHdpbGwgYmUgbW9yZSB0aGFuIG9uZSBkZHNYX3BoYXNlWSBmaWxlLCB3aGljaCBhbGxvd3MgZm9yCisJCXBpbiBjb250cm9sbGVkIFBTSyBQaGFzZSBTaGlmdCBLZXlpbmcKKwkJKGRkc1hfcGluY29udHJvbF9waGFzZV9lbiBpcyBhY3RpdmUpIG9yIHRoZSB1c2VyIGNhbgorCQljb250cm9sIHRoZSBkZXNpcmVkIHBoYXNlIFkgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHBoYXNlCisJCWFjY3VtdWxhdG9yIG91dHB1dCBieSB3cml0aW5nIFkgdG8gdGhlIGVuX3BoYXNlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZVlfc2NhbGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNjYWxlIHRvIGJlIGFwcGxpZWQgdG8gZGRzWF9waGFzZVkgaW4gb3JkZXIgdG8gb2J0YWluIHRoZQorCQlkZXNpcmVkIHZhbHVlIGluIHJhZC4gSWYgc2hhcmVkIGFjcm9zcyBhbGwgcGhhc2UgcmVnaXN0ZXJzCisJCVkgaXMgbm90IHByZXNlbnQuIEl0IGlzIGFsc28gcG9zc2libGUgWCBpcyBub3QgcHJlc2VudCBpZgorCQlzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BoYXNlc3ltYm9sCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgdGhlIGFjdGl2ZSBwaGFzZSBZIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBwaGFzZQorCQlhY2N1bXVsYXRvciBvdXRwdXQuIFRoZSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgWSBpbgorCQlkZHNYX3BoYXNlWS4gVG8gZXhpdCB0aGlzIG1vZGUgdGhlIHVzZXIgY2FuIHdyaXRlCisJCWRkc1hfcGluY29udHJvbF9waGFzZV9lbiBvciBkaXNhYmxlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waW5jb250cm9sX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9mcmVxX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9waGFzZV9lbgorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJZGRzWF9waW5jb250cm9sX2VuOiBCb3RoLCB0aGUgYWN0aXZlIGZyZXF1ZW5jeSBhbmQgcGhhc2UgaXMKKwkJY29udHJvbGxlZCBieSB0aGUgcmVzcGVjdGl2ZSBwaGFzZSBhbmQgZnJlcXVlbmN5IGNvbnRyb2wgaW5wdXRzLgorCQlJbiBjYXNlIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24gYWxsb3dzIHRvIGluZGVwZW5kZW50IGNvbnRyb2xzLAorCQl0aGVuIHRoZXJlIGFyZSBkZWRpY2F0ZWQgZmlsZXMgKGRkc1hfcGluY29udHJvbF9mcmVxX2VuLAorCQlkZHNYX3BpbmNvbnRyb2xfcGhhc2VfZW4pLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0X2VuYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dFlfZW5hYmxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlkZHNYX291dFlfZW5hYmxlIGNvbnRyb2xzIHNpZ25hbCBnZW5lcmF0aW9uIG9uIG91dHB1dCBZIG9mCisJCWNoYW5uZWwgWC4gWSBtYXkgYmUgc3VwcHJlc3NlZCBpZiBhbGwgY2hhbm5lbHMgYXJlCisJCWNvbnRyb2xsZWQgdG9nZXRoZXIuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX3dhdmV0eXBlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgdGhlIG91dHB1dCB3YXZlZm9ybS4KKwkJKHNpbmUsIHRyaWFuZ2xlLCByYW1wLCBzcXVhcmUsIC4uLikKKwkJRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgb3V0cHV0IHdhdmVmb3JtIG9wdGlvbnMgcmVhZAorCQlhdmFpbGFibGVfb3V0cHV0X21vZGVzLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0WV93YXZldHlwZV9hdmFpbGFibGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUxpc3RzIGFsbCBhdmFpbGFibGUgb3V0cHV0IHdhdmVmb3JtIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggZWQ0ODgxNS4uZTJhYzA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtNDIsMTEgKzQyLDE1IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWciCi0KK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9LY29uZmlnIgogCiBlbmRpZiAjIElJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUKaW5kZXggZTkwOTY3NC4uZjliNWZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL01ha2VmaWxlCkBAIC0xMSw4ICsxMSwxMyBAQAogCiBvYmoteSArPSBhY2NlbC8KIG9iai15ICs9IGFkYy8KK29iai15ICs9IGFkZGFjLworb2JqLXkgKz0gZGFjLworb2JqLXkgKz0gZGRzLwogb2JqLXkgKz0gZ3lyby8KIG9iai15ICs9IGltdS8KIG9iai15ICs9IGxpZ2h0Lwotb2JqLXkgKz0gdHJpZ2dlci8KIG9iai15ICs9IG1hZ25ldG9tZXRlci8KK29iai15ICs9IG1ldGVyLworb2JqLXkgKz0gcmVzb2x2ZXIvCitvYmoteSArPSB0cmlnZ2VyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPCmluZGV4IDg5OGNiYTEuLmQxYWQzNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL1RPRE8KQEAgLTYxLDYgKzYxLDEwIEBACiBmaWxlcy4gKGF2b2lkZWQgYXQgdGhlIG1vbWVudCB0byBrZWVwIHRoZSBkcml2ZXIgc2V0CiBjb250YWluZWQgaW4gc3RhZ2luZykuCiAKK0FESSBEcml2ZXJzOgorQ0MgdGhlIGRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnIG1haWxpbmcgbGlzdCB3aGVuCitlLW1haWxpbmcgdGhlIG5vcm1hbCBJSU8gbGlzdCAoc2VlIGJlbG93KS4KKwogRG9jdW1lbnRhdGlvbgogMSkgTG90cyBvZiBjbGVhbnVwIGFuZCBleHBhbnNpb24uCiAyKSBTb21lIGRldmljZSByZXF1aXJlIGluZHZpZHVhbCBkb2NzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCmluZGV4IDU5MjZjMDMuLmEzNGYxZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKQEAgLTMsNiArMywzMyBAQAogIwogY29tbWVudCAiQWNjZWxlcm9tZXRlcnMiCiAKK2NvbmZpZyBBRElTMTYyMDEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjAxIER1YWwtQXhpcyBEaWdpdGFsIEluY2xpbm9tZXRlciBhbmQgQWNjZWxlcm9tZXRlciIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjIwMSBkdWFsLWF4aXMKKwkgIGRpZ2l0YWwgaW5jbGlub21ldGVyIGFuZCBhY2NlbGVyb21ldGVyLgorCitjb25maWcgQURJUzE2MjAzCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwMyBQcm9ncmFtbWFibGUgMzYwIERlZ3JlZXMgSW5jbGlub21ldGVyIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjAzIFByb2dyYW1tYWJsZQorCSAgMzYwIERlZ3JlZXMgSW5jbGlub21ldGVyLgorCitjb25maWcgQURJUzE2MjA0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMDQgUHJvZ3JhbW1hYmxlCisJICBIaWdoLWcgRGlnaXRhbCBJbXBhY3QgU2Vuc29yIGFuZCBSZWNvcmRlci4KKwogY29uZmlnIEFESVMxNjIwOQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDkgRHVhbC1BeGlzIERpZ2l0YWwgSW5jbGlub21ldGVyIGFuZCBBY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCBmZjg0NzAzLi4xYjJhNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvTWFrZWZpbGUKQEAgLTIsNiArMiwxOCBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gYWNjZWxlcm9tZXRlciBkcml2ZXJzCiAjCiAKK2FkaXMxNjIwMS15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwMV9jb3JlLm8KK2FkaXMxNjIwMS0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwMV9yaW5nLm8gYWRpczE2MjAxX3RyaWdnZXIubworb2JqLSQoQ09ORklHX0FESVMxNjIwMSkgKz0gYWRpczE2MjAxLm8KKworYWRpczE2MjAzLXkgICAgICAgICAgICAgOj0gYWRpczE2MjAzX2NvcmUubworYWRpczE2MjAzLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjAzX3JpbmcubyBhZGlzMTYyMDNfdHJpZ2dlci5vCitvYmotJChDT05GSUdfQURJUzE2MjAzKSArPSBhZGlzMTYyMDMubworCithZGlzMTYyMDQteSAgICAgICAgICAgICA6PSBhZGlzMTYyMDRfY29yZS5vCithZGlzMTYyMDQtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyMDRfcmluZy5vIGFkaXMxNjIwNF90cmlnZ2VyLm8KK29iai0kKENPTkZJR19BRElTMTYyMDQpICs9IGFkaXMxNjIwNC5vCisKIGFkaXMxNjIwOS15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwOV9jb3JlLm8KIGFkaXMxNjIwOS0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwOV9yaW5nLm8gYWRpczE2MjA5X3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjIwOSkgKz0gYWRpczE2MjA5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaAppbmRleCBmNWY2MWIyLi41MDY1MWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCkBAIC02NSwzICs2NSwyMyBAQAogI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWihfc2hvdywgX2FkZHIpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihhY2NlbF96X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQogCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YWShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94eSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9QRUFLKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3BlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWVBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeXBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWlBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfenBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFlQRUFLKF9zaG93LCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHlwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZWlBFQUsoX3Nob3csIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94eXpwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmMjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaApAQCAtMCwwICsxLDE1MCBAQAorI2lmbmRlZiBTUElfQURJUzE2MjAxX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDFfSF8KKworI2RlZmluZSBBRElTMTYyMDFfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDFfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDFfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwMV9GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDFfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDFfWEFDQ0xfT1VUICAgICAgMHgwNCAvKiBPdXRwdXQsIHgtYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwMV9ZQUNDTF9PVVQgICAgICAweDA2IC8qIE91dHB1dCwgeS1heGlzIGFjY2VsZXJvbWV0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FVWF9BREMgICAgICAgIDB4MDggLyogT3V0cHV0LCBhdXhpbGlhcnkgQURDIGlucHV0ICovCisjZGVmaW5lIEFESVMxNjIwMV9URU1QX09VVCAgICAgICAweDBBIC8qIE91dHB1dCwgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hJTkNMX09VVCAgICAgIDB4MEMgLyogT3V0cHV0LCB4LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAxX1lJTkNMX09VVCAgICAgIDB4MEUgLyogT3V0cHV0LCB5LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hBQ0NMX09GRlMgICAgIDB4MTAgLyogQ2FsaWJyYXRpb24sIHgtYXhpcyBhY2NlbGVyYXRpb24gb2Zmc2V0ICovCisjZGVmaW5lIEFESVMxNjIwMV9ZQUNDTF9PRkZTICAgICAweDEyIC8qIENhbGlicmF0aW9uLCB5LWF4aXMgYWNjZWxlcmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWEFDQ0xfU0NBTEUgICAgMHgxNCAvKiB4LWF4aXMgYWNjZWxlcmF0aW9uIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBBRElTMTYyMDFfWUFDQ0xfU0NBTEUgICAgMHgxNiAvKiB5LWF4aXMgYWNjZWxlcmF0aW9uIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBBRElTMTYyMDFfWElOQ0xfT0ZGUyAgICAgMHgxOCAvKiBDYWxpYnJhdGlvbiwgeC1heGlzIGluY2xpbmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWUlOQ0xfT0ZGUyAgICAgMHgxQSAvKiBDYWxpYnJhdGlvbiwgeS1heGlzIGluY2xpbmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWElOQ0xfU0NBTEUgICAgMHgxQyAvKiB4LWF4aXMgaW5jbGluYXRpb24gc2NhbGUgZmFjdG9yICovCisjZGVmaW5lIEFESVMxNjIwMV9ZSU5DTF9TQ0FMRSAgICAweDFFIC8qIHktYXhpcyBpbmNsaW5hdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FMTV9NQUcxICAgICAgIDB4MjAgLyogQWxhcm0gMSBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fTUFHMiAgICAgICAweDIyIC8qIEFsYXJtIDIgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDFfQUxNX1NNUEwxICAgICAgMHgyNCAvKiBBbGFybSAxLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fU01QTDIgICAgICAweDI2IC8qIEFsYXJtIDIsIHNhbXBsZSBwZXJpb2QgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FMTV9DVFJMICAgICAgIDB4MjggLyogQWxhcm0gY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDFfQVVYX0RBQyAgICAgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0dQSU9fQ1RSTCAgICAgIDB4MzIgLyogR2VuZXJhbC1wdXJwb3NlIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMICAgICAgIDB4MzQgLyogTWlzY2VsbGFuZW91cyBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwMV9TTVBMX1BSRCAgICAgICAweDM2IC8qIEludGVybmFsIHNhbXBsZSBwZXJpb2QgKHJhdGUpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FWR19DTlQgICAgICAgIDB4MzggLyogT3BlcmF0aW9uLCBmaWx0ZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDFfU0xQX0NOVCAgICAgICAgMHgzQSAvKiBPcGVyYXRpb24sIHNsZWVwIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUICAgICAgMHgzQyAvKiBEaWFnbm9zdGljcywgc3lzdGVtIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQURJUzE2MjAxX09VVFBVVFMgICAgICAgIDcKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKSAgLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRElPMQkoMSA8PCAwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCisKKy8qIERJQUdfU1RBVCAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMiAgICAgICAgKDE8PDkpIC8qIEFsYXJtIDIgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9BTEFSTTEgICAgICAgICgxPDw4KSAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfU1BJX0ZBSUwJICAoMTw8MykgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9GTEFTSF9VUFQJICAoMTw8MikgLyogRmxhc2ggdXBkYXRlIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9QT1dFUl9ISUdICSAgKDE8PDEpIC8qIFBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNSBWICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfUE9XRVJfTE9XCSAgKDE8PDApIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisKKyNkZWZpbmUgQURJUzE2MjAxX01BWF9UWCAxNAorI2RlZmluZSBBRElTMTYyMDFfTUFYX1JYIDE0CisKKyNkZWZpbmUgQURJUzE2MjAxX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisKKy8qKgorICogc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorZW51bSBhZGlzMTYyMDFfc2NhbiB7CisJQURJUzE2MjAxX1NDQU5fU1VQUExZLAorCUFESVMxNjIwMV9TQ0FOX0FDQ19YLAorCUFESVMxNjIwMV9TQ0FOX0FDQ19ZLAorCUFESVMxNjIwMV9TQ0FOX0FVWF9BREMsCisJQURJUzE2MjAxX1NDQU5fVEVNUCwKKwlBRElTMTYyMDFfU0NBTl9JTkNMSV9YLAorCUFESVMxNjIwMV9TQ0FOX0lOQ0xJX1ksCit9OworCit2b2lkIGFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwMV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjAxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwMV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWI3ODVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfY29yZS5jCkBAIC0wLDAgKzEsNjU5IEBACisvKgorICogQURJUzE2MjAxIFByb2dyYW1tYWJsZSBEaWdpdGFsIFZpYnJhdGlvbiBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgImluY2xpbm9tZXRlci5oIgorI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjIwMS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MjAxIgorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoqCisgKiBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ184KCkgLSB3cml0ZSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAdmFsOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwMV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjAxX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjIwMV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LCB7CisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwMV9SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV9yZWFkXzEyYml0X3Vuc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjAxX0VSUk9SX0FDVElWRSkgeworCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisJdTE2IHZhbDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDFfVEVNUF9PVVQsICh1MTYgKikmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCXJldCA9IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXZhbCAmPSAweEZGRjsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJCXZhbCA9ICgoczE2KSh2YWwgPDwgNykgPj4gNyk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJfQorCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV9yZWFkXzEyYml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCA0KSA+PiA0KTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUpIHsKKwkJCXJldCA9IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl9yZXQ7CisJCX0KKworCQl2YWwgPSAoKHMxNikodmFsIDw8IDIpID4+IDIpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCX0KKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAxX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjAxX0dMT0JfQ01ELAorCQkJQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkaXMxNjIwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJdTE2IG1zYzsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDFfTVNDX0NUUkwsICZtc2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXNjIHw9IEFESVMxNjIwMV9NU0NfQ1RSTF9BQ1RJVkVfSElHSDsKKwltc2MgJj0gfkFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xOworCWlmIChlbmFibGUpCisJCW1zYyB8PSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU47CisJZWxzZQorCQltc2MgJj0gfkFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURJUzE2MjAxX01TQ19DVFJMLCBtc2MpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAxX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gc3RhdHVzICYgMHhGOworCWlmIChyZXQpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAxX0RJQUdfU1RBVF9TUElfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwMV9ESUFHX1NUQVRfRkxBU0hfVVBUKQorCQlkZXZfZXJyKGRldiwgIkZsYXNoIHVwZGF0ZSBmYWlsZWRcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwMV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAzLjE1VlxuIik7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9zZWxmX3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjAxX01TQ19DVFJMLAorCQkJQURJUzE2MjAxX01TQ19DVFJMX1NFTEZfVEVTVF9FTik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgc2VsZiB0ZXN0Iik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkaXMxNjIwMV9zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIERvIHNlbGYgdGVzdCAqLworCXJldCA9IGFkaXMxNjIwMV9zZWxmX3Rlc3QoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSByZXN1bHQgKi8KKwlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJaWYgKHJldCkgeworCQlhZGlzMTYyMDFfcmVzZXQoZGV2KTsKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm90IHBsYXlpbmcgYmFsbCAtPiByZXNldCIpOworCQltc2xlZXAoQURJUzE2MjAxX1NUQVJUVVBfREVMQVkpOworCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiZ2l2aW5nIHVwIik7CisJCQlnb3RvIGVycl9yZXQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGF0IENTJWQgKGlycSAlZClcbiIsCisJCQlzdC0+dXMtPmNoaXBfc2VsZWN0LCBzdC0+dXMtPmlycSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9JTl9OQU1FRF9SQVcoMCwgc3VwcGx5LCBhZGlzMTYyMDFfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAxX1NVUFBMWV9PVVQpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMF9zdXBwbHlfc2NhbGUsICIwLjAwMTIyIik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX1JBVygxLCBhZGlzMTYyMDFfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAxX0FVWF9BREMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMV9zY2FsZSwgIjAuMDAwNjEiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YKGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAxX1hBQ0NMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1koYWRpczE2MjAxX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDFfWUFDQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWF9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjIwMV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWEFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1lfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjIwMV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjAxX1lBQ0NMX09GRlMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGFjY2VsX3NjYWxlLCAiMC40NjI1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWChhZGlzMTYyMDFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwMV9YSU5DTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9ZKGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAxX1lJTkNMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1hfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWEFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1lfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWUFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5jbGlfc2NhbGUsICIwLjEiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyMDFfcmVhZF90ZW1wKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIi0wLjQ3Iik7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjIwMV93cml0ZV9yZXNldCwgMCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MjAxIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDFfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwMV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAxX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV94X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwMV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MjAxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MjAxX01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MjAxX01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjIwMV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjAxX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjIwMV9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYyMDEiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRpczE2MjAxX2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MjAxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjAxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyMDEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjIwMV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjAxX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyMDFfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjIwMV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjIwMV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjIwMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwMSBQcm9ncmFtbWFibGUgRGlnaXRhbCBWaWJyYXRpb24gU2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9yaW5nLmMKQEAgLTAsMCArMSwyMTggQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRpczE2MjAxLmgiCisKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluX3N1cHBseSwgQURJUzE2MjAxX1NDQU5fU1VQUExZLCBBRElTMTYyMDFfU1VQUExZX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGluX3N1cHBseSwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3gsIEFESVMxNjIwMV9TQ0FOX0FDQ19YLCBBRElTMTYyMDFfWEFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3ksIEFESVMxNjIwMV9TQ0FOX0FDQ19ZLCBBRElTMTYyMDFfWUFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoYWNjZWwsIHMsIDE0LCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjAsIEFESVMxNjIwMV9TQ0FOX0FVWF9BREMsIEFESVMxNjIwMV9BVVhfQURDLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW4wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MjAxX1NDQU5fVEVNUCwgQURJUzE2MjAxX1RFTVBfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGVtcCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluY2xpX3gsIEFESVMxNjIwMV9TQ0FOX0lOQ0xJX1gsCisJCSAgICAgQURJUzE2MjAxX1hJTkNMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV95LCBBRElTMTYyMDFfU0NBTl9JTkNMSV9ZLAorCQkgICAgIEFESVMxNjIwMV9ZSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbmNsaSwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9USU1FU1RBTVAoNyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRpbWVzdGFtcCwgcywgNjQsIDY0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwMV9zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luX3N1cHBseS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfYWNjZWxfeC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2FjY2VsX3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbmNsaV94LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3hfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW5jbGlfeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV95X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGltZXN0YW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfc2Nhbl9lbF9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDFfc2Nhbl9lbF9hdHRycywKKwkubmFtZSA9ICJzY2FuX2VsZW1lbnRzIiwKK307CisKKy8qKgorICogYWRpczE2MjAxX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCisgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CisgKiovCitzdGF0aWMgdm9pZCBhZGlzMTYyMDFfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQoreworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfcmVhZF9yaW5nX2RhdGEoKSByZWFkIGRhdGEgcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gcmluZworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9yZWFkX3JpbmdfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW0FESVMxNjIwMV9PVVRQVVRTICsgMV07CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJbWVtc2V0KHhmZXJzLCAwLCBzaXplb2YoeGZlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFESVMxNjIwMV9PVVRQVVRTOyBpKyspIHsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQlzdC0+dHhbMiAqIGldID0gQURJUzE2MjAxX1JFQURfUkVHKEFESVMxNjIwMV9TVVBQTFlfT1VUICsgMiAqIGkpOworCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpID49IDEpCisJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOworCX0KKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRpczE2MjAxX3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZGlzMTYyMDFfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMxNiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkaXMxNjIwMV9yZWFkX3JpbmdfZGF0YSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CisKK2ludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRpczE2MjAxX3RyaWdnZXJfYmhfdG9fcmluZyk7CisKKwlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZGlzMTYyMDFfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luX3N1cHBseS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2FjY2VsX3gubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9hY2NlbF95Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfdGVtcC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luMC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luY2xpX3gubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbmNsaV95Lm51bWJlcik7CisKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRpczE2MjAxX3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjIwMV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOworfQorCit2b2lkIGFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWNlYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCkBAIC0wLDAgKzEsMTIyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDEuaCIKKworLyoqCisgKiBhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQkJCSAgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgIHM2NCB0aW1lc3RhbXAsCisJCQkJICAgICAgIGludCBub190ZXN0KQoreworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAxX3RyaWdnZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwMV90cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoKSBzZXQgZGF0YXJkeSBpbnRlcnJ1cHQgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRpczE2MjAxX3NldF9pcnEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCQlpaW9fcmVtb3ZlX2V2ZW50X2Zyb21fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJCSAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0KKwkJCQkJICAgLT5ldl9saXN0KTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwMV90cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV90cmlnX3RyeV9yZWVuKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRpczE2MjAxLWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwMV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmFkaXMxNjIwMV90cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkaXMxNjIwMV90cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkzMjNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaApAQCAtMCwwICsxLDE0MyBAQAorI2lmbmRlZiBTUElfQURJUzE2MjAzX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDNfSF8KKworI2RlZmluZSBBRElTMTYyMDNfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDNfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDNfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwM19GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDNfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDNfQVVYX0FEQyAgICAgICAgMHgwOCAvKiBPdXRwdXQsIGF1eGlsaWFyeSBBREMgaW5wdXQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX1RFTVBfT1VUICAgICAgIDB4MEEgLyogT3V0cHV0LCB0ZW1wZXJhdHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfWElOQ0xfT1VUICAgICAgMHgwQyAvKiBPdXRwdXQsIHgtYXhpcyBpbmNsaW5hdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfWUlOQ0xfT1VUICAgICAgMHgwRSAvKiBPdXRwdXQsIHktYXhpcyBpbmNsaW5hdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfSU5DTF9OVUxMICAgICAgMHgxOCAvKiBJbmNsaW5lIG51bGwgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FMTV9NQUcxICAgICAgIDB4MjAgLyogQWxhcm0gMSBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fTUFHMiAgICAgICAweDIyIC8qIEFsYXJtIDIgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDNfQUxNX1NNUEwxICAgICAgMHgyNCAvKiBBbGFybSAxLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fU01QTDIgICAgICAweDI2IC8qIEFsYXJtIDIsIHNhbXBsZSBwZXJpb2QgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FMTV9DVFJMICAgICAgIDB4MjggLyogQWxhcm0gY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDNfQVVYX0RBQyAgICAgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0dQSU9fQ1RSTCAgICAgIDB4MzIgLyogR2VuZXJhbC1wdXJwb3NlIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMICAgICAgIDB4MzQgLyogTWlzY2VsbGFuZW91cyBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwM19TTVBMX1BSRCAgICAgICAweDM2IC8qIEludGVybmFsIHNhbXBsZSBwZXJpb2QgKHJhdGUpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FWR19DTlQgICAgICAgIDB4MzggLyogT3BlcmF0aW9uLCBmaWx0ZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfU0xQX0NOVCAgICAgICAgMHgzQSAvKiBPcGVyYXRpb24sIHNsZWVwIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUICAgICAgMHgzQyAvKiBEaWFnbm9zdGljcywgc3lzdGVtIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQURJUzE2MjAzX09VVFBVVFMgICAgICAgIDUKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1BXUlVQX1NFTEZfVEVTVAkoMSA8PCAxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9SRVZFUlNFX1JPVF9FTgkoMSA8PCA5KSAgLyogUmV2ZXJzZXMgcm90YXRpb24gb2YgYm90aCBpbmNsaW5hdGlvbiBvdXRwdXRzICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8xLCAwID0gRElPMCAqLworCisvKiBESUFHX1NUQVQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9BTEFSTTIgICAgICAgICgxPDw5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0xICAgICAgICAoMTw8OCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUwgKDE8PDUpIC8qIFNlbGYtdGVzdCBkaWFnbm9zdGljIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9TUElfRkFJTAkgICgxPDwzKSAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX0ZMQVNIX1VQVAkgICgxPDwyKSAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1BPV0VSX0hJR0gJICAoMTw8MSkgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1cJICAoMTw8MCkgLyogUG93ZXIgc3VwcGx5IGJlbG93IDMuMTUgViAqLworCisvKiBHTE9CX0NNRCAqLworI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCisjZGVmaW5lIEFESVMxNjIwM19HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisKKyNkZWZpbmUgQURJUzE2MjAzX01BWF9UWCAxMgorI2RlZmluZSBBRElTMTYyMDNfTUFYX1JYIDEwCisKKyNkZWZpbmUgQURJUzE2MjAzX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisKKy8qKgorICogc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjIwM19zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorZW51bSBhZGlzMTYyMDNfc2NhbiB7CisJQURJUzE2MjAzX1NDQU5fU1VQUExZLAorCUFESVMxNjIwM19TQ0FOX0FVWF9BREMsCisJQURJUzE2MjAzX1NDQU5fVEVNUCwKKwlBRElTMTYyMDNfU0NBTl9JTkNMSV9YLAorCUFESVMxNjIwM19TQ0FOX0lOQ0xJX1ksCit9OworCit2b2lkIGFkaXMxNjIwM19yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDNfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwM19jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjAzX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDNfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwM19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwM191bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQURJUzE2MjAzIFByb2dyYW1tYWJsZSBEaWdpdGFsIFZpYnJhdGlvbiBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgImluY2xpbm9tZXRlci5oIgorI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjIwMy5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MjAzIgorCitzdGF0aWMgaW50IGFkaXMxNjIwM19jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoqCisgKiBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ184KCkgLSB3cml0ZSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAdmFsOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwM19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjAzX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjIwM19XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LCB7CisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwM19SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjAzX0VSUk9SX0FDVElWRSkKKwkJYWRpczE2MjAzX2NoZWNrX3N0YXR1cyhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4MEZGRik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwM19yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKwl1MTYgdmFsOworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAzX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwM19URU1QX09VVCwgKHUxNiAqKSZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworCXZhbCAmPSAweEZGRjsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfcmVhZF8xNGJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJczE2IHZhbCA9IDA7CisJc3NpemVfdCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICh1MTYgKikmdmFsKTsKKwlpZiAoIXJldCkgeworCQlpZiAodmFsICYgQURJUzE2MjAzX0VSUk9SX0FDVElWRSkKKwkJCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworCQl2YWwgPSAoKHMxNikodmFsIDw8IDIpID4+IDIpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCX0KKworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwM19zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjAzX0dMT0JfQ01ELAorCQkJQURJUzE2MjAzX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAzX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkaXMxNjIwM19yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJdTE2IG1zYzsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDNfTVNDX0NUUkwsICZtc2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXNjIHw9IEFESVMxNjIwM19NU0NfQ1RSTF9BQ1RJVkVfSElHSDsKKwltc2MgJj0gfkFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xOworCWlmIChlbmFibGUpCisJCW1zYyB8PSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRU47CisJZWxzZQorCQltc2MgJj0gfkFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURJUzE2MjAzX01TQ19DVFJMLCBtc2MpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAzX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gc3RhdHVzICYgMHgxRjsKKworCWlmIChzdGF0dXMgJiBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU2VsZiB0ZXN0IGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDNfRElBR19TVEFUX1NQSV9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNQSSBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9GTEFTSF9VUFQpCisJCWRldl9lcnIoZGV2LCAiRmxhc2ggdXBkYXRlIGZhaWxlZFxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwM19ESUFHX1NUQVRfUE9XRVJfSElHSCkKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYWJvdmUgMy42MjVWXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1cpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGJlbG93IDMuMTVWXG4iKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NlbGZfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBRElTMTYyMDNfTVNDX0NUUkwsCisJCQlBRElTMTYyMDNfTVNDX0NUUkxfU0VMRl9URVNUX0VOKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwM19pbml0aWFsX3NldHVwKHN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRpczE2MjAzX3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogRG8gc2VsZiB0ZXN0ICovCisJcmV0ID0gYWRpczE2MjAzX3NlbGZfdGVzdChkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJzZWxmIHRlc3QgZmFpbHVyZSIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHJlc3VsdCAqLworCXJldCA9IGFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKwlpZiAocmV0KSB7CisJCWFkaXMxNjIwM19yZXNldChkZXYpOworCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCW1zbGVlcChBRElTMTYyMDNfU1RBUlRVUF9ERUxBWSk7CisJCXJldCA9IGFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJnaXZpbmcgdXAiKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogYXQgQ1MlZCAoaXJxICVkKVxuIiwKKwkJCXN0LT51cy0+Y2hpcF9zZWxlY3QsIHN0LT51cy0+aXJxKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygwLCBzdXBwbHksIGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDNfU1VQUExZX09VVCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4wX3N1cHBseV9zY2FsZSwgIjAuMDAxMjIiKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDEsIGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDNfQVVYX0FEQyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4xX3NjYWxlLCAiMC4wMDA2MSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1goYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDNfWElOQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWShhZGlzMTYyMDNfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwM19ZSU5DTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9YX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDNfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwM19JTkNMX05VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluY2xpX3NjYWxlLCAiMC4wMjUiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyMDNfcmVhZF90ZW1wKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIi0wLjQ3Iik7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjIwM193cml0ZV9yZXNldCwgMCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MjAzIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwM19ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAzX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV94X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAzX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwM19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjIwM19NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjIwM19NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYyMDNfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjIwM19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MjAzX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjAzIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjIwM19wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjIwM19pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjIwM191bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjAzX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyMDNfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZGlzMTYyMDNfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjIwM19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MjAzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYyMDNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjIwM19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjAzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYyMDNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYyMDNfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYyMDNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDMgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgVmlicmF0aW9uIFNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc3NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfcmluZy5jCkBAIC0wLDAgKzEsMjExIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgImFjY2VsLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkaXMxNjIwMy5oIgorCitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbl9zdXBwbHksIEFESVMxNjIwM19TQ0FOX1NVUFBMWSwgQURJUzE2MjAzX1NVUFBMWV9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbl9zdXBwbHksIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjAsIEFESVMxNjIwM19TQ0FOX0FVWF9BREMsIEFESVMxNjIwM19BVVhfQURDLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW4wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MjAzX1NDQU5fVEVNUCwgQURJUzE2MjAzX1RFTVBfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGVtcCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluY2xpX3gsIEFESVMxNjIwM19TQ0FOX0lOQ0xJX1gsCisJCSAgICAgQURJUzE2MjAzX1hJTkNMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV95LCBBRElTMTYyMDNfU0NBTl9JTkNMSV9ZLAorCQkgICAgIEFESVMxNjIwM19ZSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbmNsaSwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9USU1FU1RBTVAoNSk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRpbWVzdGFtcCwgcywgNjQsIDY0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwM19zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luX3N1cHBseS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luY2xpX3guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfeF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbmNsaV95LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3lfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90aW1lc3RhbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwM19zY2FuX2VsX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwM19zY2FuX2VsX2F0dHJzLAorCS5uYW1lID0gInNjYW5fZWxlbWVudHMiLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDNfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKKyAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKKyAqKi8KK3N0YXRpYyB2b2lkIGFkaXMxNjIwM19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfcmVhZF9yaW5nX2RhdGEoKSByZWFkIGRhdGEgcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gcmluZworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19yZWFkX3JpbmdfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW0FESVMxNjIwM19PVVRQVVRTICsgMV07CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJbWVtc2V0KHhmZXJzLCAwLCBzaXplb2YoeGZlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFESVMxNjIwM19PVVRQVVRTOyBpKyspIHsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQlpZiAoaSA8IDEpIC8qIFNVUFBMWV9PVVQ6IDB4MDIsIEFVWF9BREM6IDB4MDggKi8KKwkJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDNfUkVBRF9SRUcoQURJUzE2MjAzX1NVUFBMWV9PVVQgKyAyICogaSk7CisJCWVsc2UKKwkJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDNfUkVBRF9SRUcoQURJUzE2MjAzX1NVUFBMWV9PVVQgKyAyICogaSArIDYpOworCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpID49IDEpCisJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOworCX0KKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRpczE2MjAzX3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZGlzMTYyMDNfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMxNiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkaXMxNjIwM19yZWFkX3JpbmdfZGF0YSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGlzMTYyMDNfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CisKK2ludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRpczE2MjAzX3RyaWdnZXJfYmhfdG9fcmluZyk7CisKKwlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZGlzMTYyMDNfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luX3N1cHBseS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX3RlbXAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbjAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbmNsaV94Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5jbGlfeS5udW1iZXIpOworCisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjIwM19wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9paW9fc3dfcmJfZnJlZToKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyMDNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJlNTFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfdHJpZ2dlci5jCkBAIC0wLDAgKzEsMTIyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDMuaCIKKworLyoqCisgKiBhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQkJCSAgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgIHM2NCB0aW1lc3RhbXAsCisJCQkJICAgICAgIGludCBub190ZXN0KQoreworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAzX3RyaWdnZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDNfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwM190cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoKSBzZXQgZGF0YXJkeSBpbnRlcnJ1cHQgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRpczE2MjAzX3NldF9pcnEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCQlpaW9fcmVtb3ZlX2V2ZW50X2Zyb21fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJCSAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0KKwkJCQkJICAgLT5ldl9saXN0KTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwM190cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM190cmlnX3RyeV9yZWVuKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkaXMxNjIwM19wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRpczE2MjAzLWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwM19kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmFkaXMxNjIwM190cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkaXMxNjIwM190cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVkN2NiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBTUElfQURJUzE2MjA0X0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDRfSF8KKworI2RlZmluZSBBRElTMTYyMDRfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDRfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDRfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwNF9GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDRfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfT1VUICAgICAgMHgwNCAvKiBPdXRwdXQsIHgtYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9ZQUNDTF9PVVQgICAgICAweDA2IC8qIE91dHB1dCwgeS1heGlzIGFjY2VsZXJvbWV0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FVWF9BREMgICAgICAgIDB4MDggLyogT3V0cHV0LCBhdXhpbGlhcnkgQURDIGlucHV0ICovCisjZGVmaW5lIEFESVMxNjIwNF9URU1QX09VVCAgICAgICAweDBBIC8qIE91dHB1dCwgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hfUEVBS19PVVQgICAgIDB4MEMgLyogVHdvcyBjb21wbGVtZW50ICovCisjZGVmaW5lIEFESVMxNjIwNF9ZX1BFQUtfT1VUICAgICAweDBFIC8qIFR3b3MgY29tcGxlbWVudCAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfTlVMTCAgICAgMHgxMCAvKiBDYWxpYnJhdGlvbiwgeC1heGlzIGFjY2VsZXJhdGlvbiBvZmZzZXQgbnVsbCAqLworI2RlZmluZSBBRElTMTYyMDRfWUFDQ0xfTlVMTCAgICAgMHgxMiAvKiBDYWxpYnJhdGlvbiwgeS1heGlzIGFjY2VsZXJhdGlvbiBvZmZzZXQgbnVsbCAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfU0NBTEUgICAgMHgxNCAvKiBYLWF4aXMgc2NhbGUgZmFjdG9yIGNhbGlicmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9ZQUNDTF9TQ0FMRSAgICAweDE2IC8qIFktYXhpcyBzY2FsZSBmYWN0b3IgY2FsaWJyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hZX1JTU19PVVQgICAgIDB4MTggLyogWFkgY29tYmluZWQgYWNjZWxlcmF0aW9uIChSU1MpICovCisjZGVmaW5lIEFESVMxNjIwNF9YWV9QRUFLX09VVCAgICAweDFBIC8qIFBlYWssIFhZIGNvbWJpbmVkIG91dHB1dCAoUlNTKSAqLworI2RlZmluZSBBRElTMTYyMDRfQ0FQX0JVRl8xICAgICAgMHgxQyAvKiBDYXB0dXJlIGJ1ZmZlciBvdXRwdXQgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBBRElTMTYyMDRfQ0FQX0JVRl8yICAgICAgMHgxRSAvKiBDYXB0dXJlIGJ1ZmZlciBvdXRwdXQgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBBRElTMTYyMDRfQUxNX01BRzEgICAgICAgMHgyMCAvKiBBbGFybSAxIGFtcGxpdHVkZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FMTV9NQUcyICAgICAgIDB4MjIgLyogQWxhcm0gMiBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwNF9BTE1fQ1RSTCAgICAgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0NBUFRfUE5UUiAgICAgIDB4MkEgLyogQ2FwdHVyZSByZWdpc3RlciBhZGRyZXNzIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FVWF9EQUMgICAgICAgIDB4MzAgLyogQXV4aWxpYXJ5IERBQyBkYXRhICovCisjZGVmaW5lIEFESVMxNjIwNF9HUElPX0NUUkwgICAgICAweDMyIC8qIEdlbmVyYWwtcHVycG9zZSBkaWdpdGFsIGlucHV0L291dHB1dCBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTCAgICAgICAweDM0IC8qIE1pc2NlbGxhbmVvdXMgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDRfU01QTF9QUkQgICAgICAgMHgzNiAvKiBJbnRlcm5hbCBzYW1wbGUgcGVyaW9kIChyYXRlKSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9BVkdfQ05UICAgICAgICAweDM4IC8qIE9wZXJhdGlvbiwgZmlsdGVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjA0X1NMUF9DTlQgICAgICAgIDB4M0EgLyogT3BlcmF0aW9uLCBzbGVlcCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVCAgICAgIDB4M0MgLyogRGlhZ25vc3RpY3MsIHN5c3RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLworCisjZGVmaW5lIEFESVMxNjIwNF9PVVRQVVRTICAgICAgICA1CisKKy8qIE1TQ19DVFJMICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9QV1JVUF9TRUxGX1RFU1QJKDEgPDwgMTApIC8qIFNlbGYtdGVzdCBhdCBwb3dlci1vbjogMSA9IGRpc2FibGVkLCAwID0gZW5hYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgKDEgPDwgOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgKDEgPDwgMikgIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9BQ1RJVkVfSElHSAkgICAgICAgICgxIDw8IDEpICAvKiBEYXRhLXJlYWR5IHBvbGFyaXR5OiAxID0gYWN0aXZlIGhpZ2gsIDAgPSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8yCSgxIDw8IDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMiwgMCA9IERJTzEgKi8KKworLyogRElBR19TVEFUICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMICgxPDw1KSAvKiBTZWxmLXRlc3QgZGlhZ25vc3RpYyBlcnJvciBmbGFnOiAxID0gZXJyb3IgY29uZGl0aW9uLAorCQkJCQkJMCA9IG5vcm1hbCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9TUElfRkFJTAkgICgxPDwzKSAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0ZMQVNIX1VQVAkgICgxPDwyKSAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX1BPV0VSX0hJR0gJICAoMTw8MSkgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9QT1dFUl9MT1cJICAoMTw8MCkgLyogUG93ZXIgc3VwcGx5IGJlbG93IDIuOTc1IFYgKi8KKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfQ0xFQVJfU1RBVAkoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorCisjZGVmaW5lIEFESVMxNjIwNF9NQVhfVFggMjQKKyNkZWZpbmUgQURJUzE2MjA0X01BWF9SWCAyNAorCisjZGVmaW5lIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorCisvKioKKyAqIHN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYyMDRfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKK2ludCBhZGlzMTYyMDRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2VudW0gYWRpczE2MjA0X3NjYW4geworCUFESVMxNjIwNF9TQ0FOX1NVUFBMWSwKKwlBRElTMTYyMDRfU0NBTl9BQ0NfWCwKKwlBRElTMTYyMDRfU0NBTl9BQ0NfWSwKKwlBRElTMTYyMDRfU0NBTl9BVVhfQURDLAorCUFESVMxNjIwNF9TQ0FOX1RFTVAsCit9OworCit2b2lkIGFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjA0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwNF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzE1ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogQURJUzE2MjA0IFByb2dyYW1tYWJsZSBIaWdoLWcgRGlnaXRhbCBJbXBhY3QgU2Vuc29yIGFuZCBSZWNvcmRlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYyMDQuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjIwNCIKKworc3RhdGljIGludCBhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qKgorICogYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDRfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoKSAtIHdyaXRlIDIgYnl0ZXMgdG8gYSBwYWlyIG9mIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwNF9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbHVlICYgMHhGRjsKKwlzdC0+dHhbMl0gPSBBRElTMTYyMDRfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzICsgMSk7CisJc3QtPnR4WzNdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KCkgLSByZWFkIDIgYnl0ZXMgZnJvbSBhIDE2LWJpdCByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDRfUkVBRF9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlsb3dlcl9yZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDRfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjIwNF9jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDRfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisJdTE2IHZhbDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwNF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDRfVEVNUF9PVVQsICh1MTYgKikmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDRfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwl2YWwgJj0gMHhGRkY7CisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfMTJiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCA0KSA+PiA0KTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCAyKSA+PiAyKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjIwNF9HTE9CX0NNRCwKKwkJCUFESVMxNjIwNF9HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwNF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGlzMTYyMDRfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhZGlzMTYyMDRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXUxNiBtc2M7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjA0X01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyMDRfTVNDX0NUUkxfQUNUSVZFX0hJR0g7CisJbXNjICY9IH5BRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRElPMjsKKwlpZiAoZW5hYmxlKQorCQltc2MgfD0gQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOOworCWVsc2UKKwkJbXNjICY9IH5BRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRU47CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjIwNF9NU0NfQ1RSTCwgbXNjKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwNF9ESUFHX1NUQVQsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IHN0YXR1cyAmIDB4MUY7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjA0X0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNlbGYgdGVzdCBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjA0X0RJQUdfU1RBVF9TUElfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfRkxBU0hfVVBUKQorCQlkZXZfZXJyKGRldiwgIkZsYXNoIHVwZGF0ZSBmYWlsZWRcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDRfRElBR19TVEFUX1BPV0VSX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAyLjk3NVZcbiIpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfc2VsZl90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFESVMxNjIwNF9NU0NfQ1RSTCwKKwkJCUFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2luaXRpYWxfc2V0dXAoc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGlzMTYyMDRfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBEbyBzZWxmIHRlc3QgKi8KKwlyZXQgPSBhZGlzMTYyMDRfc2VsZl90ZXN0KGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInNlbGYgdGVzdCBmYWlsdXJlIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCisJcmV0ID0gYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCWlmIChyZXQpIHsKKwkJYWRpczE2MjA0X3Jlc2V0KGRldik7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKKwkJbXNsZWVwKEFESVMxNjIwNF9TVEFSVFVQX0RFTEFZKTsKKwkJcmV0ID0gYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBhdCBDUyVkIChpcnEgJWQpXG4iLAorCQkJc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDAsIHN1cHBseSwgYWRpczE2MjA0X3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwNF9TVVBQTFlfT1VUKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjBfc3VwcGx5X3NjYWxlLCAiMC4wMDEyMiIpOworc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWRpczE2MjA0X3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwNF9BVVhfQURDKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjFfc2NhbGUsICIwLjAwMDYxIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWChhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YQUNDTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjA0X1lBQ0NMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjA0X1hZX1JTU19PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YUEVBSyhhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YX1BFQUtfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWVBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDRfWV9QRUFLX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZUEVBSyhhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YWV9QRUFLX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDRfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjIwNF93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjA0X1hBQ0NMX05VTEwpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjA0X3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDRfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwNF9ZQUNDTF9OVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF94X3NjYWxlLCAiMC4wMTcxMjUiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF95X3NjYWxlLCAiMC4wMDg0MDciKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF94eV9zY2FsZSwgIjAuMDE3MTI1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjA0X3JlYWRfdGVtcCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICItMC40NyIpOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBhZGlzMTYyMDRfd3JpdGVfcmVzZXQsIDApOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjIwNCIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjA0X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDRfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwNF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94eS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeHBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3lwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94eXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3lfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MjA0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MjA0X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MjA0X01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjIwNF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjA0X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYyMDQiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRpczE2MjA0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MjA0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYyMDRfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjA0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyMDQiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjIwNF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjA0X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyMDRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjIwNF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjIwNF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjIwNF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBiMTYwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpAQCAtMCwwICsxLDIwNiBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDQuaCIKKworc3RhdGljIElJT19TQ0FOX0VMX0MoaW5fc3VwcGx5LCBBRElTMTYyMDRfU0NBTl9TVVBQTFksIEFESVMxNjIwNF9TVVBQTFlfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW5fc3VwcGx5LCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0MoYWNjZWxfeCwgQURJUzE2MjA0X1NDQU5fQUNDX1gsIEFESVMxNjIwNF9YQUNDTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19TQ0FOX0VMX0MoYWNjZWxfeSwgQURJUzE2MjA0X1NDQU5fQUNDX1ksIEFESVMxNjIwNF9ZQUNDTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShhY2NlbCwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluMCwgQURJUzE2MjA0X1NDQU5fQVVYX0FEQywgQURJUzE2MjA0X0FVWF9BREMsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbjAsIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyh0ZW1wLCBBRElTMTYyMDRfU0NBTl9URU1QLCBBRElTMTYyMDRfVEVNUF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0ZW1wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX1RJTUVTVEFNUCg1KTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGltZXN0YW1wLCBzLCA2NCwgNjQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjA0X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfaW5fc3VwcGx5LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3N1cHBseV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9hY2NlbF94LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3hfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfYWNjZWxfeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF95X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX3RpbWVzdGFtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjA0X3NjYW5fZWxfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjA0X3NjYW5fZWxfYXR0cnMsCisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCit9OworCisvKioKKyAqIGFkaXMxNjIwNF9wb2xsX2Z1bmNfdGgoKSB0b3AgaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgYnkgdHJpZ2dlcgorICogQHByaXZhdGVfZGF0YToJaWlvX2RldgorICoqLworc3RhdGljIHZvaWQgYWRpczE2MjA0X3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZXN0YW1wKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcpOworfQorCisvKioKKyAqIGFkaXMxNjIwNF9yZWFkX3JpbmdfZGF0YSgpIHJlYWQgZGF0YSByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW50byByaW5nCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcng6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3JlYWRfcmluZ19kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbQURJUzE2MjA0X09VVFBVVFMgKyAxXTsKKwlpbnQgcmV0OworCWludCBpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwltZW1zZXQoeGZlcnMsIDAsIHNpemVvZih4ZmVycykpOworCWZvciAoaSA9IDA7IGkgPD0gQURJUzE2MjA0X09VVFBVVFM7IGkrKykgeworCQl4ZmVyc1tpXS5iaXRzX3Blcl93b3JkID0gODsKKwkJeGZlcnNbaV0uY3NfY2hhbmdlID0gMTsKKwkJeGZlcnNbaV0ubGVuID0gMjsKKwkJeGZlcnNbaV0uZGVsYXlfdXNlY3MgPSAyMDsKKwkJeGZlcnNbaV0udHhfYnVmID0gc3QtPnR4ICsgMiAqIGk7CisJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDRfUkVBRF9SRUcoQURJUzE2MjA0X1NVUFBMWV9PVVQgKyAyICogaSk7CisJCXN0LT50eFsyICogaSArIDFdID0gMDsKKwkJaWYgKGkgPj0gMSkKKwkJCXhmZXJzW2ldLnJ4X2J1ZiA9IHJ4ICsgMiAqIChpIC0gMSk7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1tpXSwgJm1zZyk7CisJfQorCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiBidXJzdCByZWFkaW5nIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBXaGlsc3QgdGhpcyBtYWtlcyBhIGxvdCBvZiBjYWxscyB0byBpaW9fc3dfcmluZyBmdW5jdGlvbnMgLSBpdCBpcyB0byBkZXZpY2UKKyAqIHNwZWNpZmljIHRvIGJlIHJvbGxlZCBpbnRvIHRoZSBjb3JlLgorICovCitzdGF0aWMgdm9pZCBhZGlzMTYyMDRfdHJpZ2dlcl9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0CisJCT0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSwKKwkJCSAgICAgICB3b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IHN0LT5pbmRpb19kZXYtPnJpbmc7CisKKwlpbnQgaSA9IDA7CisJczE2ICpkYXRhOworCXNpemVfdCBkYXRhc2l6ZSA9IHJpbmctPmFjY2Vzcy5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOworCisJZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyaW5nLT5zY2FuX2NvdW50KQorCQlpZiAoYWRpczE2MjA0X3JlYWRfcmluZ19kYXRhKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0LT5yeCkgPj0gMCkKKwkJCWZvciAoOyBpIDwgcmluZy0+c2Nhbl9jb3VudDsgaSsrKQorCQkJCWRhdGFbaV0gPSBiZTE2X3RvX2NwdXAoCisJCQkJCShfX2JlMTYgKikmKHN0LT5yeFtpKjJdKSk7CisKKwkvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KKwlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCisJCSooKHM2NCAqKShkYXRhICsgKChpICsgMykvNCkqNCkpID0gc3QtPmxhc3RfdGltZXN0YW1wOworCisJcmluZy0+YWNjZXNzLnN0b3JlX3RvKHJpbmcsCisJCQkgICAgICAodTggKilkYXRhLAorCQkJICAgICAgc3QtPmxhc3RfdGltZXN0YW1wKTsKKworCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0LT5pbmRpb19kZXYtPnRyaWcpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuOworfQorCit2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJa2ZyZWUoaW5kaW9fZGV2LT5wb2xsZnVuYyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKK30KKworaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCUlOSVRfV09SSygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nLCBhZGlzMTYyMDRfdHJpZ2dlcl9iaF90b19yaW5nKTsKKworCXJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIXJpbmcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJnJpbmctPmFjY2Vzcyk7CisJcmluZy0+YnBlID0gMjsKKwlyaW5nLT5zY2FuX2VsX2F0dHJzID0gJmFkaXMxNjIwNF9zY2FuX2VsX2dyb3VwOworCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKKwlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5fc3VwcGx5Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfYWNjZWxfeC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2FjY2VsX3kubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF90ZW1wLm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW4wLm51bWJlcik7CisKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRpczE2MjA0X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjIwNF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOworfQorCit2b2lkIGFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWRiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF90cmlnZ2VyLmMKQEAgLTAsMCArMSwxMjIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkaXMxNjIwNC5oIgorCisvKioKKyAqIGFkaXMxNjIwNF9kYXRhX3JkeV90cmlnX3BvbGwoKSB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGRhdGEgcmR5IHRyaWcKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdfcG9sbChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCQkJICAgICAgIGludCBpbmRleCwKKwkJCQkgICAgICAgczY0IHRpbWVzdGFtcCwKKwkJCQkgICAgICAgaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSBzdC0+dHJpZzsKKworCWlpb190cmlnZ2VyX3BvbGwodHJpZywgdGltZXN0YW1wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworSUlPX0VWRU5UX1NIKGRhdGFfcmR5X3RyaWcsICZhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ19wb2xsKTsKKworc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGlpb190cmlnZ2VyX3JlYWRfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDRfdHJpZ2dlcl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9uYW1lLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwNF90cmlnZ2VyX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjA0X3RyaWdnZXJfYXR0cnMsCit9OworCisvKioKKyAqIGFkaXMxNjIwNF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSgpIHNldCBkYXRhcmR5IGludGVycnVwdCBzdGF0ZQorICoqLworc3RhdGljIGludCBhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorCQkJCQkJYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXMgKCVkKVxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwlyZXQgPSBhZGlzMTYyMDRfc2V0X2lycSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdGF0ZSk7CisJaWYgKHN0YXRlID09IGZhbHNlKSB7CisJCWlpb19yZW1vdmVfZXZlbnRfZnJvbV9saXN0KCZpaW9fZXZlbnRfZGF0YV9yZHlfdHJpZywKKwkJCQkJICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXQorCQkJCQkgICAtPmV2X2xpc3QpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCX0gZWxzZSB7CisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJICAgICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW4oKSB0cnkgcmVuYWJsaW5nIGlycSBmb3IgZGF0YSByZHkgdHJpZ2dlcgorICogQHRyaWc6CXRoZSBkYXRhcmR5IHRyaWdnZXIKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW4oc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCWVuYWJsZV9pcnEoc3QtPnVzLT5pcnEpOworCXJldHVybiAwOworfQorCitpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSJhZGlzMTYyMDQtZGV2JWQiLAorCQkJCWluZGlvX2Rldi0+aWQpOworCWlmICghc3QtPnRyaWctPm5hbWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3RyaWc7CisJfQorCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OworCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBzdDsKKwlzdC0+dHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOworCXN0LT50cmlnLT50cnlfcmVlbmFibGUgPSAmYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW47CisJc3QtPnRyaWctPmNvbnRyb2xfYXR0cnMgPSAmYWRpczE2MjA0X3RyaWdnZXJfYXR0cl9ncm91cDsKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CisKKwkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCisJaW5kaW9fZGV2LT50cmlnID0gc3QtPnRyaWc7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX3RyaWdfbmFtZTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX3RyaWdfbmFtZToKKwlrZnJlZShzdC0+dHJpZy0+bmFtZSk7CitlcnJvcl9mcmVlX3RyaWc6CisJaWlvX2ZyZWVfdHJpZ2dlcihzdC0+dHJpZyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0YXRlID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RhdGUtPnRyaWcpOworCWtmcmVlKHN0YXRlLT50cmlnLT5uYW1lKTsKKwlpaW9fZnJlZV90cmlnZ2VyKHN0YXRlLT50cmlnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYwppbmRleCAwMzMxMzVjLi44ZWJhMGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CiAJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CiAJCXhmZXJzW2ldLmxlbiA9IDI7Ci0JCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMzA7CiAJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOwogCQlzdC0+dHhbMiAqIGldCiAJCQk9IEFESVMxNjIwOV9SRUFEX1JFRyhBRElTMTYyMDlfU1VQUExZX09VVCArIDIgKiBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwppbmRleCAzMzBkNWQ2Li4xZmQwODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAogCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZsaXMzbDAyZHFfcG9sbF9mdW5jX3RoKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwppbmRleCBhY2I2NzY3Li44Njg2OWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKQEAgLTI3LDYgKzI3LDQxIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gaW5jbHVkZSByaW5nIGJ1ZmZlciBzdXBwb3J0IGluIHRoZSBNQVgxMzYzCiAJICBBREMgZHJpdmVyLgogCitjb25maWcgQUQ3MTUwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkNzE1MC8xLzYgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChhZDcxNTAsIGFkNzE1MSwgYWQ3MTU2KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFENzE1MgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDcxNTIvMyBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgY2FwYWNpdGl2ZSBzZW5zb3JzLgorCSAgKGFkNzE1MiwgYWQ3MTUzKSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFENzI5MQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDcyOTEgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyOTEKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK2NvbmZpZyBBRDcyOTgKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3Mjk4IHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyOTgKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMgYW5kIEFEQy4KKworY29uZmlnIEFENzMxNAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDczMTQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDczMTQKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKIGNvbmZpZyBBRDc5OVgKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3OTl4IEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTUwLDkgKzg1LDkgQEAKIGNvbmZpZyBBRDc0NzYKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3NDc1LzYvNy84IEFENzQ2Ni83LzggYW5kIEFENzQ5NSBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCi0Jc2VsZWN0IElJT19SSU5HX0JVRkZFUgkKKwlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCiAJc2VsZWN0IElJT19TV19SSU5HCi0Jc2VsZWN0IElJT19UUklHR0VSIAkKKwlzZWxlY3QgSUlPX1RSSUdHRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMKIAkgIEFENzQ3NSwgQUQ3NDc2LCBBRDc0NzcsIEFENzQ3OCwgQUQ3NDY2LCBBRDc0NjcsIEFENzQ2OCwgQUQ3NDk1CkBAIC02MSwzICs5Niw1NSBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc0NzYuCisKK2NvbmZpZyBBRDc4ODcKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3ODg3IEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HCisJc2VsZWN0IElJT19UUklHR0VSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzCisJICBBRDc4ODcgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRvciAoQURDKS4KKwkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzg4Ny4KKworY29uZmlnIEFENzc0NQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc3NDUsIEFENzc0NiBBRDc3NDcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChBRDc3NDUsIEFENzc0NiwgQUQ3NzQ3KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3NzQ1LgorCitjb25maWcgQUQ3ODE2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzggdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzgKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMgYW5kIEFEQy4KKworY29uZmlnIEFEVDc1CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc1IHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzUKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK2NvbmZpZyBBRFQ3MzEwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDczMTAgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzEwCisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCitjb25maWcgQURUNzQxMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3NDEwIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzQxMAorCSAgdGVtcGVyYXR1cmUgc2Vuc29ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggYjYyYzMxOWIuLjZmMjMxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCkBAIC0xNCwzICsxNCwxOCBAQAogYWQ3NDc2LXkgOj0gYWQ3NDc2X2NvcmUubwogYWQ3NDc2LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3NDc2X3Jpbmcubwogb2JqLSQoQ09ORklHX0FENzQ3NikgKz0gYWQ3NDc2Lm8KKworYWQ3ODg3LXkgOj0gYWQ3ODg3X2NvcmUubworYWQ3ODg3LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3ODg3X3Jpbmcubworb2JqLSQoQ09ORklHX0FENzg4NykgKz0gYWQ3ODg3Lm8KKworb2JqLSQoQ09ORklHX0FENzE1MCkgKz0gYWQ3MTUwLm8KK29iai0kKENPTkZJR19BRDcxNTIpICs9IGFkNzE1Mi5vCitvYmotJChDT05GSUdfQUQ3MjkxKSArPSBhZDcyOTEubworb2JqLSQoQ09ORklHX0FENzI5OCkgKz0gYWQ3Mjk4Lm8KK29iai0kKENPTkZJR19BRDczMTQpICs9IGFkNzMxNC5vCitvYmotJChDT05GSUdfQUQ3NzQ1KSArPSBhZDc3NDUubworb2JqLSQoQ09ORklHX0FENzgxNikgKz0gYWQ3ODE2Lm8KK29iai0kKENPTkZJR19BRFQ3NSkgKz0gYWR0NzUubworb2JqLSQoQ09ORklHX0FEVDczMTApICs9IGFkdDczMTAubworb2JqLSQoQ09ORklHX0FEVDc0MTApICs9IGFkdDc0MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTU1NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBBRDcxNTAgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MTUwLzEvNgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MTUwIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDcxNTBfU1RBVFVTICAgICAgICAgICAgICAwCisjZGVmaW5lIEFENzE1MF9TVEFUVVNfT1VUMSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFENzE1MF9TVEFUVVNfT1VUMiAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIEFENzE1MF9DSDFfREFUQV9ISUdIICAgICAgIDEKKyNkZWZpbmUgQUQ3MTUwX0NIMV9EQVRBX0xPVyAgICAgICAgMgorI2RlZmluZSBBRDcxNTBfQ0gyX0RBVEFfSElHSCAgICAgICAzCisjZGVmaW5lIEFENzE1MF9DSDJfREFUQV9MT1cgICAgICAgIDQKKyNkZWZpbmUgQUQ3MTUwX0NIMV9BVkdfSElHSCAgICAgICAgNQorI2RlZmluZSBBRDcxNTBfQ0gxX0FWR19MT1cgICAgICAgICA2CisjZGVmaW5lIEFENzE1MF9DSDJfQVZHX0hJR0ggICAgICAgIDcKKyNkZWZpbmUgQUQ3MTUwX0NIMl9BVkdfTE9XICAgICAgICAgOAorI2RlZmluZSBBRDcxNTBfQ0gxX1NFTlNJVElWSVRZICAgICA5CisjZGVmaW5lIEFENzE1MF9DSDFfVEhSX0hPTERfSCAgICAgIDkKKyNkZWZpbmUgQUQ3MTUwX0NIMV9USU1FT1VUICAgICAgICAgMTAKKyNkZWZpbmUgQUQ3MTUwX0NIMV9USFJfSE9MRF9MICAgICAgMTAKKyNkZWZpbmUgQUQ3MTUwX0NIMV9TRVRVUCAgICAgICAgICAgMTEKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRU5TSVRJVklUWSAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USFJfSE9MRF9IICAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USU1FT1VUICAgICAgICAgMTMKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USFJfSE9MRF9MICAgICAgMTMKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRVRVUCAgICAgICAgICAgMTQKKyNkZWZpbmUgQUQ3MTUwX0NGRyAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQUQ3MTUwX0NGR19GSVggICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgQUQ3MTUwX1BEX1RJTUVSICAgICAgICAgICAgMTYKKyNkZWZpbmUgQUQ3MTUwX0NIMV9DQVBEQUMgICAgICAgICAgMTcKKyNkZWZpbmUgQUQ3MTUwX0NIMl9DQVBEQUMgICAgICAgICAgMTgKKyNkZWZpbmUgQUQ3MTUwX1NOMyAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQUQ3MTUwX1NOMiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQUQ3MTUwX1NOMSAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgQUQ3MTUwX1NOMCAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQUQ3MTUwX0lEICAgICAgICAgICAgICAgICAgMjMKKworI2RlZmluZSBBRDcxNTBfTUFYX0NPTlZfTU9ERSAgICAgICA0CisKKy8qCisgKiBzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcxNTBfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJYm9vbCBpbnRlcjsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNoMV90aHJlc2hvbGQ7ICAgICAvKiBDaDEgVGhyZXNob2xkIChpbiBmaXhlZCB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gxX3NlbnNpdGl2aXR5OyAgIC8qIENoMSBTZW5zaXRpdml0eSAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMV90aW1lb3V0OyAgICAgICAvKiBDaDEgVGltZW91dCAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMV9zZXR1cDsKKwl1MTYgY2gyX3RocmVzaG9sZDsgICAgIC8qIENoMiBUaHJlc2hvbGQgKGluIGZpeGVkIHRocmVzaG9sZCBtb2RlKSAqLworCXU4ICBjaDJfc2Vuc2l0aXZpdHk7ICAgLyogQ2gxIFNlbnNpdGl2aXR5IChpbiBhZGFwdGl2ZSB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gyX3RpbWVvdXQ7ICAgICAgIC8qIENoMSBUaW1lb3V0IChpbiBhZGFwdGl2ZSB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gyX3NldHVwOworCXU4ICBwb3dlcmRvd25fdGltZXI7CisJY2hhciB0aHJlc2hvbGRfbW9kZVsxMF07IC8qIGFkYXB0aXZlL2ZpeGVkIHRocmVzaG9sZCBtb2RlICovCisJaW50IG9sZF9zdGF0ZTsKKwljaGFyICpjb252ZXJzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYWQ3MTUwX2NvbnZlcnNpb25fbW9kZSB7CisJY2hhciAqbmFtZTsKKwl1OCByZWdfY2ZnOworfTsKKworc3RydWN0IGFkNzE1MF9jb252ZXJzaW9uX21vZGUgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtBRDcxNTBfTUFYX0NPTlZfTU9ERV0gPSB7CisJeyAiaWRsZSIsIDAgfSwKKwl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCisJeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCisJeyAicG93ZXItZG93biIsIDMgfSwKK307CisKKy8qCisgKiBhZDcxNTAgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWQ3MTUwX2kyY19yZWFkKHN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAmcmVnLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzE1MF9pMmNfd3JpdGUoc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1RIUkVTSE9MRF9NT0RFUyhfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfdGhyZXNob2xkX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1RIUkVTSE9MRF9NT0RFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUih0aHJlc2hvbGRfbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVEhSRVNIT0xEKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfdGhyZXNob2xkLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USFJFU0hPTEQoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNoMl90aHJlc2hvbGQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV90aW1lb3V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USU1FT1VUKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfdGltZW91dCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9QT1dFUkRPV05fVElNRVIoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHBvd2VyZG93bl90aW1lciwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBpOworCWludCBsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFENzE1MF9NQVhfQ09OVl9NT0RFOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPmNvbnZlcnNpb25fbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNmZzsKKwlpbnQgaTsKKworCWFkNzE1MF9pMmNfcmVhZChjaGlwLCBBRDcxNTBfQ0ZHLCAmY2ZnLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcxNTBfTUFYX0NPTlZfTU9ERTsgaSsrKSB7CisJCWlmIChzdHJuY21wKGJ1ZiwgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lLAorCQkJCXN0cmxlbihhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpIC0gMSkgPT0gMCkgeworCQkJY2hpcC0+Y29udmVyc2lvbl9tb2RlID0gYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lOworCQkJY2ZnIHw9IDB4MTggfCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLnJlZ19jZmc7CisJCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7CisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJZGV2X2VycihkZXYsICJub3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gbW9kZVxuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZSwKKwkJYWQ3MTUwX3N0b3JlX2NvbnZlcnNpb25fbW9kZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiYWRhcHRpdmVcbmZpeGVkXG4iKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9USFJFU0hPTERfTU9ERVMoYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYXRhWzJdOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDFfREFUQV9ISUdILCBkYXRhLCAyKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYXRhWzJdOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDJfREFUQV9ISUdILCBkYXRhLCAyKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPnRocmVzaG9sZF9tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3RocmVzaG9sZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisKKwlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX0NGRywgJmNmZywgMSk7CisKKwlpZiAoc3RybmNtcChidWYsICJmaXhlZCIsIDUpID09IDApIHsKKwkJc3RyY3B5KGNoaXAtPnRocmVzaG9sZF9tb2RlLCAiZml4ZWQiKTsKKwkJY2ZnIHw9IEFENzE1MF9DRkdfRklYOworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7CisKKwkJcmV0dXJuIGxlbjsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiYWRhcHRpdmUiLCA4KSA9PSAwKSB7CisJCXN0cmNweShjaGlwLT50aHJlc2hvbGRfbW9kZSwgImFkYXB0aXZlIik7CisJCWNmZyAmPSB+QUQ3MTUwX0NGR19GSVg7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NGRywgY2ZnKTsKKworCQlyZXR1cm4gbGVuOworCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCB0aHJlc2hvbGQgbW9kZVxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEhSRVNIT0xEX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlLAorCQlhZDcxNTBfc3RvcmVfdGhyZXNob2xkX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDFfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfdGhyZXNob2xkKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aHJlc2hvbGQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9USFJfSE9MRF9ILCBkYXRhID4+IDgpOworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfVEhSX0hPTERfTCwgZGF0YSk7CisJCWNoaXAtPmNoMV90aHJlc2hvbGQgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9USFJFU0hPTEQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMV90aHJlc2hvbGQsCisJCWFkNzE1MF9zdG9yZV9jaDFfdGhyZXNob2xkKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3RocmVzaG9sZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVEhSX0hPTERfSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1RIUl9IT0xEX0wsIGRhdGEpOworCQljaGlwLT5jaDJfdGhyZXNob2xkID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVEhSRVNIT0xEKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDJfdGhyZXNob2xkLAorCQlhZDcxNTBfc3RvcmVfY2gyX3RocmVzaG9sZCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX3NlbnNpdGl2aXR5KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9TRU5TSVRJVklUWSwgZGF0YSk7CisJCWNoaXAtPmNoMV9zZW5zaXRpdml0eSA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfc2Vuc2l0aXZpdHksCisJCWFkNzE1MF9zdG9yZV9jaDFfc2Vuc2l0aXZpdHkpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9zZW5zaXRpdml0eSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfU0VOU0lUSVZJVFksIGRhdGEpOworCQljaGlwLT5jaDJfc2Vuc2l0aXZpdHkgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRU5TSVRJVklUWShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gyX3NlbnNpdGl2aXR5LAorCQlhZDcxNTBfc3RvcmVfY2gyX3NlbnNpdGl2aXR5KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMV90aW1lb3V0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gxX1RJTUVPVVQsIGRhdGEpOworCQljaGlwLT5jaDFfdGltZW91dCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMV90aW1lb3V0LAorCQlhZDcxNTBfc3RvcmVfY2gxX3RpbWVvdXQpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RpbWVvdXQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVElNRU9VVCwgZGF0YSk7CisJCWNoaXAtPmNoMl90aW1lb3V0ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVElNRU9VVChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gyX3RpbWVvdXQsCisJCWFkNzE1MF9zdG9yZV9jaDJfdGltZW91dCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMV9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfU0VUVVAsIGRhdGEpOworCQljaGlwLT5jaDFfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfc2V0dXAsCisJCWFkNzE1MF9zdG9yZV9jaDFfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDJfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMl9zZXR1cCwKKwkJYWQ3MTUwX3N0b3JlX2NoMl9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDcxNTBfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfcG93ZXJkb3duX3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+cG93ZXJkb3duX3RpbWVyKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3Bvd2VyZG93bl90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHg0MCkpIHsKKwkJY2hpcC0+cG93ZXJkb3duX3RpbWVyID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9QT1dFUkRPV05fVElNRVIoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X3Bvd2VyZG93bl90aW1lciwKKwkJYWQ3MTUwX3N0b3JlX3Bvd2VyZG93bl90aW1lcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcxNTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX3RocmVzaG9sZF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdGhyZXNob2xkX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV90aHJlc2hvbGQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl90aHJlc2hvbGQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV90aW1lb3V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV9zZW5zaXRpdml0eS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3NlbnNpdGl2aXR5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3dlcmRvd25fdGltZXIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzE1MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MTUwX2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGhyZXNob2xkIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0gxX0hJR0ggICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0NIMV9MT1cgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9DSDJfSElHSCAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0gyX0xPVyAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gxX0hJR0hfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDFfaGlnaCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gyX0hJR0hfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDJfaGlnaCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gxX0xPV19TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKGNoMV9sb3csIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NIMl9MT1dfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDJfbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworc3RhdGljIHZvaWQgYWQ3MTUwX2ludGVycnVwdF9oYW5kbGVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzE1MF9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1OCBpbnRfc3RhdHVzOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX1NUQVRVUywgJmludF9zdGF0dXMsIDEpOworCisJaWYgKChpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQxKSAmJiAhKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMSkpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DSDFfSElHSCwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJZWxzZSBpZiAoKCEoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMSkpICYmIChjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDEpKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJSUlPX0VWRU5UX0NPREVfQ0gxX0xPVywKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpZiAoKGludF9zdGF0dXMgJiBBRDcxNTBfU1RBVFVTX09VVDIpICYmICEoY2hpcC0+b2xkX3N0YXRlICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0NIMl9ISUdILAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwllbHNlIGlmICgoIShpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkgJiYgKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMikpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DSDJfTE9XLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKK30KKworc3RhdGljIGludCBhZDcxNTBfaW50ZXJydXB0X2hhbmRsZXJfdGgoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSCh0aHJlc2hvbGQsICZhZDcxNTBfaW50ZXJydXB0X2hhbmRsZXJfdGgpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfcXVlcnlfb3V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCS8qCisJICogQUQ3MTUwIHByb3ZpZGVzIHR3byBsb2dpYyBvdXRwdXQgY2hhbm5lbHMsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGludGVycnVwdAorCSAqIGJ1dCB0aGUgcGlucyBhcmUgbm90IGNvbmZpZ3VyYWJsZQorCSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2V0X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbGVuOworfQorCitJSU9fRVZFTlRfQVRUUl9DSDFfSElHSF9TSChpaW9fZXZlbnRfdGhyZXNob2xkLCBhZDcxNTBfcXVlcnlfb3V0X21vZGUsIGFkNzE1MF9zZXRfb3V0X21vZGUsIDApOworSUlPX0VWRU5UX0FUVFJfQ0gyX0hJR0hfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX0NIMV9MT1dfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX0NIMl9MT1dfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2NoMV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2NoMl9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2NoMV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfY2gyX2xvdy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MTUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwkvKiBFY2hpcGFiaWxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3MTUwX2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkNzE1MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJcmVnZG9uZSA9IDE7CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhjbGllbnQtPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2xpZW50LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZDcxNTAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KGlpb19ldmVudF9hdHRyX2NoMl9sb3cubGlzdGVsLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzE1MF9pbnRlcnJ1cHRfaGFuZGxlcl9iaCk7CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkLCBpcnE6ICVkXG4iLCBpZC0+bmFtZSwgY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzE1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhjbGllbnQtPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQ3MTUwX2lkW10gPSB7CisJeyAiYWQ3MTUwIiwgMCB9LAorCXsgImFkNzE1MSIsIDAgfSwKKwl7ICJhZDcxNTYiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcxNTBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MTUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcxNTAiLAorCX0sCisJLnByb2JlID0gYWQ3MTUwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcxNTBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcxNTBfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcxNTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTUwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDcxNTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDcxNTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkNzE1MC8xLzYgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzE1MF9pbml0KTsKK21vZHVsZV9leGl0KGFkNzE1MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1Mi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3Zjg0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTIuYwpAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIEFENzE1MiBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDcxNTIvMworICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MTUyIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDcxNTJfU1RBVFVTICAgICAgICAgICAgICAwCisjZGVmaW5lIEFENzE1Ml9TVEFUVVNfUkRZMSAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEFENzE1Ml9TVEFUVVNfUkRZMiAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEFENzE1Ml9DSDFfREFUQV9ISUdIICAgICAgIDEKKyNkZWZpbmUgQUQ3MTUyX0NIMV9EQVRBX0xPVyAgICAgICAgMgorI2RlZmluZSBBRDcxNTJfQ0gyX0RBVEFfSElHSCAgICAgICAzCisjZGVmaW5lIEFENzE1Ml9DSDJfREFUQV9MT1cgICAgICAgIDQKKyNkZWZpbmUgQUQ3MTUyX0NIMV9PRkZTX0hJR0ggICAgICAgNQorI2RlZmluZSBBRDcxNTJfQ0gxX09GRlNfTE9XICAgICAgICA2CisjZGVmaW5lIEFENzE1Ml9DSDJfT0ZGU19ISUdIICAgICAgIDcKKyNkZWZpbmUgQUQ3MTUyX0NIMl9PRkZTX0xPVyAgICAgICAgOAorI2RlZmluZSBBRDcxNTJfQ0gxX0dBSU5fSElHSCAgICAgICA5CisjZGVmaW5lIEFENzE1Ml9DSDFfR0FJTl9MT1cgICAgICAgIDEwCisjZGVmaW5lIEFENzE1Ml9DSDFfU0VUVVAgICAgICAgICAgIDExCisjZGVmaW5lIEFENzE1Ml9DSDJfR0FJTl9ISUdIICAgICAgIDEyCisjZGVmaW5lIEFENzE1Ml9DSDJfR0FJTl9MT1cgICAgICAgIDEzCisjZGVmaW5lIEFENzE1Ml9DSDJfU0VUVVAgICAgICAgICAgIDE0CisjZGVmaW5lIEFENzE1Ml9DRkcgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFENzE1Ml9SRVNFVkVSRCAgICAgICAgICAgIDE2CisjZGVmaW5lIEFENzE1Ml9DQVBEQUNfUE9TICAgICAgICAgIDE3CisjZGVmaW5lIEFENzE1Ml9DQVBEQUNfTkVHICAgICAgICAgIDE4CisjZGVmaW5lIEFENzE1Ml9DRkcyICAgICAgICAgICAgICAgIDI2CisKKyNkZWZpbmUgQUQ3MTUyX01BWF9DT05WX01PREUgICAgICAgNgorCisvKgorICogc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdTE2IGNoMV9vZmZzZXQ7ICAgICAvKiBDaGFubmVsIDEgb2Zmc2V0IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50ICovCisJdTE2IGNoMV9nYWluOyAgICAgICAvKiBDaGFubmVsIDEgZ2FpbiBjb2VmZmljaWVudCAqLworCXU4ICBjaDFfc2V0dXA7CisJdTE2IGNoMl9vZmZzZXQ7ICAgICAvKiBDaGFubmVsIDIgb2Zmc2V0IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50ICovCisJdTE2IGNoMl9nYWluOyAgICAgICAvKiBDaGFubmVsIDEgZ2FpbiBjb2VmZmljaWVudCAqLworCXU4ICBjaDJfc2V0dXA7CisJdTggIGZpbHRlcl9yYXRlX3NldHVwOyAvKiBDYXBhY2l0aXZlIGNoYW5uZWwgZGlnaXRhbCBmaWx0ZXIgc2V0dXA7IGNvbnZlcnNpb24gdGltZS91cGRhdGUgcmF0ZSBzZXR1cCBwZXIgY2hhbm5lbCAqLworCWNoYXIgKmNvbnZlcnNpb25fbW9kZTsKK307CisKK3N0cnVjdCBhZDcxNTJfY29udmVyc2lvbl9tb2RlIHsKKwljaGFyICpuYW1lOworCXU4IHJlZ19jZmc7Cit9OworCitzdHJ1Y3QgYWQ3MTUyX2NvbnZlcnNpb25fbW9kZSBhZDcxNTJfY29udl9tb2RlX3RhYmxlW0FENzE1Ml9NQVhfQ09OVl9NT0RFXSA9IHsKKwl7ICJpZGxlIiwgMCB9LAorCXsgImNvbnRpbnVvdXMtY29udmVyc2lvbiIsIDEgfSwKKwl7ICJzaW5nbGUtY29udmVyc2lvbiIsIDIgfSwKKwl7ICJwb3dlci1kb3duIiwgMyB9LAorCXsgIm9mZnNldC1jYWxpYnJhdGlvbiIsIDUgfSwKKwl7ICJnYWluLWNhbGlicmF0aW9uIiwgNiB9LAorfTsKKworLyoKKyAqIGFkNzE1MiByZWdpc3RlciBhY2Nlc3MgYnkgSTJDCisgKi8KKworc3RhdGljIGludCBhZDcxNTJfaTJjX3JlYWQoc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcxNTJfaTJjX3dyaXRlKHN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9WQUxVRShfc2hvdykJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9WQUxVRShfc2hvdykJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0ZJTFRFUl9SQVRFX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihmaWx0ZXJfcmF0ZV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBpOworCWludCBsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFENzE1Ml9NQVhfQ09OVl9NT0RFOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzICIsIGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSk7CisKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGRhdGFbMl07CisKKwlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NIMV9EQVRBX0hJR0gsIGRhdGEsIDIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGludClkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1ZBTFVFKGFkNzE1Ml9zaG93X2NoMV92YWx1ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGF0YVsyXTsKKworCWFkNzE1Ml9pMmNfcmVhZChjaGlwLCBBRDcxNTJfQ0gyX0RBVEFfSElHSCwgZGF0YSwgMik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoaW50KWRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUyX3Nob3dfY2gyX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisJaW50IGk7CisKKwlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NGRywgJmNmZywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MTUyX01BWF9DT05WX01PREU7IGkrKykKKwkJaWYgKHN0cm5jbXAoYnVmLCBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUsCisJCQkJc3RybGVuKGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSkgLSAxKSA9PSAwKSB7CisJCQljaGlwLT5jb252ZXJzaW9uX21vZGUgPSBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWU7CisJCQljZmcgfD0gMHgxOCB8IGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ucmVnX2NmZzsKKwkJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRywgY2ZnKTsKKwkJCXJldHVybiBsZW47CisJCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jb252ZXJzaW9uX21vZGUsCisJCWFkNzE1Ml9zdG9yZV9jb252ZXJzaW9uX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfb2Zmc2V0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMV9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0hJR0gsIGRhdGEgPj4gOCk7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0xPVywgZGF0YSk7CisJCWNoaXAtPmNoMV9vZmZzZXQgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMV9vZmZzZXQsCisJCWFkNzE1Ml9zdG9yZV9jaDFfb2Zmc2V0KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX29mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19ISUdILCBkYXRhID4+IDgpOworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19MT1csIGRhdGEpOworCQljaGlwLT5jaDJfb2Zmc2V0ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfT0ZGU0VUKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDJfb2Zmc2V0LAorCQlhZDcxNTJfc3RvcmVfY2gyX29mZnNldCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMV9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDFfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fSElHSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fTE9XLCBkYXRhKTsKKwkJY2hpcC0+Y2gxX2dhaW4gPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9HQUlOKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDFfZ2FpbiwKKwkJYWQ3MTUyX3N0b3JlX2NoMV9nYWluKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9nYWluKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMl9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9ISUdILCBkYXRhID4+IDgpOworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9MT1csIGRhdGEpOworCQljaGlwLT5jaDJfZ2FpbiA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMl9nYWluLAorCQlhZDcxNTJfc3RvcmVfY2gyX2dhaW4pOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDFfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gxX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gxX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMV9zZXR1cCwKKwkJYWQ3MTUyX3N0b3JlX2NoMV9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMl9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfU0VUVVAsIGRhdGEpOworCQljaGlwLT5jaDJfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfY2gyX3NldHVwLAorCQlhZDcxNTJfc3RvcmVfY2gyX3NldHVwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9maWx0ZXJfcmF0ZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRzIsIGRhdGEpOworCQljaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfRklMVEVSX1JBVEVfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2ZpbHRlcl9yYXRlX3NldHVwLAorCQlhZDcxNTJfc3RvcmVfZmlsdGVyX3JhdGVfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3MTUyX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcxNTJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX2NvbnZlcnNpb25fbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NvbnZlcnNpb25fbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ZpbHRlcl9yYXRlX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzE1Ml9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MTUyX2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDcxNTJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJLyogRWNoaXBhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzE1Ml9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkXG4iLCBpZC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ3MTUyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWlmIChjbGllbnQtPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKGNsaWVudC0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDcxNTJfaWRbXSA9IHsKKwl7ICJhZDcxNTIiLCAwIH0sCisJeyAiYWQ3MTUzIiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3MTUyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzE1Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3MTUyIiwKKwl9LAorCS5wcm9iZSA9IGFkNzE1Ml9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MTUyX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3MTUyX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3MTUyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzE1Ml9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MTUyX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3MTUyX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDcxNTIvMyBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3MTUyX2luaXQpOworbW9kdWxlX2V4aXQoYWQ3MTUyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA0MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMKQEAgLTAsMCArMSwxMDM5IEBACisvKgorICogQUQ3MjkxIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzI5MQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MjkxIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQUQ3MjkxX0NPTU1BTkQJCQkwCisjZGVmaW5lIEFENzI5MV9WT0xUQUdFCQkJMQorI2RlZmluZSBBRDcyOTFfVF9TRU5TRQkJCTIKKyNkZWZpbmUgQUQ3MjkxX1RfQVZFUkFHRQkJMworI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9MSU1JVF9CQVNFCTQKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQJOAorI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9ISUdICQkweDFjCisjZGVmaW5lIEFENzI5MV9UX1NFTlNFX0xPVwkJMHgxZAorI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9IWVNUCQkweDFlCisjZGVmaW5lIEFENzI5MV9WT0xUQUdFX0FMRVJUX1NUQVRVUwkweDFmCisjZGVmaW5lIEFENzI5MV9UX0FMRVJUX1NUQVRVUwkJMHgyMAorCisvKgorICogQUQ3MjkxIGNvbW1hbmQKKyAqLworI2RlZmluZSBBRDcyOTFfQVVUT0NZQ0xFCQkweDEKKyNkZWZpbmUgQUQ3MjkxX1JFU0VUCQkJMHgyCisjZGVmaW5lIEFENzI5MV9BTEFSVF9DTEVBUgkJMHg0CisjZGVmaW5lIEFENzI5MV9BTEFSVF9QT0xBUklUWQkJMHg4CisjZGVmaW5lIEFENzI5MV9FWFRfUkVGCQkJMHgxMAorI2RlZmluZSBBRDcyOTFfTk9JU0VfREVMQVkJCTB4MjAKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfTUFTSwkJMHg0MAorI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9NQVNLCQkweGZmMDAKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfT0ZGU0VUCQkweDgKKworLyoKKyAqIEFENzI5MSB2YWx1ZSBtYXNrcworICovCisjZGVmaW5lIEFENzI5MV9DSEFOTkVMX01BU0sJCTB4ZjAwMAorI2RlZmluZSBBRDcyOTFfVkFMVUVfTUFTSwkJMHhmZmYKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfU0lHTgkJMHg0MDAKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSwkweDIKKworLyoKKyAqIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzI5MV9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNvbW1hbmQ7CisJdTggIGNoYW5uZWxzOwkvKiBBY3RpdmUgdm9sdGFnZSBjaGFubmVscyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzI5MV9saW1pdF9yZWdzIHsKKwl1MTYJZGF0YV9oaWdoOworCXUxNglkYXRhX2xvdzsKKwl1MTYJaHlzdGVyZXNpczsKK307CisKKy8qCisgKiBhZDcyOTEgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCitzdGF0aWMgaW50IGFkNzI5MV9pMmNfcmVhZChzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBzd2FiMTYoKHUxNilyZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2kyY193cml0ZShzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KGRhdGEpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJucyBuZWdhdGl2ZSBlcnJubywgb3IgZWxzZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlYWQuICovCitzdGF0aWMgaW50IGFkNzI5MV9pMmNfcmVhZF9kYXRhKHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGNvbW1hbmRzWzRdOworCWludCByZXQgPSAwOworCWludCBpLCBjb3VudDsKKworCWlmIChyZWcgPT0gQUQ3MjkxX1RfU0VOU0UgfHwgcmVnID09IEFENzI5MV9UX0FWRVJBR0UpCisJCWNvdW50ID0gMjsKKwllbHNlIGlmIChyZWcgPT0gQUQ3MjkxX1ZPTFRBR0UpIHsKKwkJaWYgKCFjaGlwLT5jaGFubmVscykgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyB2b2x0YWdlIGNoYW5uZWwgaXMgc2VsZWN0ZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNvdW50ID0gMiArIGNoaXAtPmNoYW5uZWxzICogMjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cm9uZyBkYXRhIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29tbWFuZHNbMF0gPSAwOworCWNvbW1hbmRzWzFdID0gKGNoaXAtPmNvbW1hbmQgPj4gOCkgJiAweGZmOworCWNvbW1hbmRzWzJdID0gY2hpcC0+Y29tbWFuZCAmIDB4ZmY7CisJY29tbWFuZHNbM10gPSByZWc7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBjb21tYW5kcywgNCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgbWFzdGVyIHNlbmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICh1OCAqKWRhdGEsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyBtYXN0ZXIgcmVjZWl2ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA+Pj0gMjsKKworCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKykKKwkJZGF0YVtpXSA9IHN3YWIxNihkYXRhW2ldKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfQVVUT0NZQ0xFKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJhdXRvY3ljbGVcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tbWFuZFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9BVVRPQ1lDTEUpOworCWlmIChzdHJjbXAoYnVmLCAiYXV0b2N5Y2xlIikpCisJCWNvbW1hbmQgfD0gQUQ3MjkxX0FVVE9DWUNMRTsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOTFfc2hvd19tb2RlLAorCQlhZDcyOTFfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tbWFuZFxuYXV0b2N5Y2xlXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzI5MV9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJaW50IHJldDsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3MjkxX1JFU0VUOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLAorCQlOVUxMLAorCQlhZDcyOTFfc3RvcmVfcmVzZXQsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb21tYW5kICYgQUQ3MjkxX0VYVF9SRUYpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2V4dF9yZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCWludCByZXQ7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX0VYVF9SRUYpOworCWlmIChzdHJjbXAoYnVmLCAiMSIpKQorCQljb21tYW5kIHw9IEFENzI5MV9FWFRfUkVGOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXh0X3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5MV9zaG93X2V4dF9yZWYsCisJCWFkNzI5MV9zdG9yZV9leHRfcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfbm9pc2VfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfTk9JU0VfREVMQVkpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9OT0lTRV9ERUxBWSk7CisJaWYgKHN0cmNtcChidWYsICIxIikpCisJCWNvbW1hbmQgfD0gQUQ3MjkxX05PSVNFX0RFTEFZOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobm9pc2VfZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOTFfc2hvd19ub2lzZV9kZWxheSwKKwkJYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWRfZGF0YShjaGlwLCBBRDcyOTFfVF9TRU5TRSwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X3NlbnNlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9hdmVyYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9UX0FWRVJBR0UsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChkYXRhICYgQUQ3MjkxX1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRDcyOTFfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9hdmVyYWdlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X2F2ZXJhZ2UsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YVtBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVF07CisJaW50IGksIHNpemUsIHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9WT0xUQUdFLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpIHsKKwkJCXJldCA9IHNwcmludGYoYnVmLCAiY2hhbm5lbFslZF09JWRcbiIsIGksCisJCQkJCWRhdGFbaV0gJiBBRDcyOTFfVkFMVUVfTUFTSyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJCWJ1ZiArPSByZXQ7CisJCQlzaXplICs9IHJldDsKKwkJfQorCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZvbHRhZ2UsIFNfSVJVR08sIGFkNzI5MV9zaG93X3ZvbHRhZ2UsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfVk9MVEFHRV9NQVNLKSA+PgorCQkJQUQ3MjkxX1ZPTFRBR0VfT0ZGU0VUKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2NoYW5uZWxfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX1ZPTFRBR0VfTUFTSyk7CisJY29tbWFuZCB8PSBkYXRhIDw8IEFENzI5MV9WT0xUQUdFX09GRlNFVDsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlmb3IgKGkgPSAwLCBjaGlwLT5jaGFubmVscyA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpCisJCQljaGlwLT5jaGFubmVscysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjkxX3Nob3dfY2hhbm5lbF9tYXNrLAorCQlhZDcyOTFfc3RvcmVfY2hhbm5lbF9tYXNrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzI5MV9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjkxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4dF9yZWYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25vaXNlX2RlbGF5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X3NlbnNlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X2F2ZXJhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoYW5uZWxfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyOTFfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI5MV9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3MjkxX1RfU0VOU0VfSElHSCAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9UX1NFTlNFX0xPVyAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVF9BVkdfSElHSCAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3MjkxX1RfQVZHX0xPVyAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9WT0xUQUdFX0JBU0UgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg0KQorCitzdGF0aWMgdm9pZCBhZDcyOTFfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzI5MV9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1MTYgdF9zdGF0dXMsIHZfc3RhdHVzOworCXUxNiBjb21tYW5kOworCWludCBpOworCisJaWYgKGFkNzI5MV9pMmNfcmVhZChjaGlwLCBBRDcyOTFfVF9BTEVSVF9TVEFUVVMsICZ0X3N0YXR1cykpCisJCXJldHVybjsKKworCWlmIChhZDcyOTFfaTJjX3JlYWQoY2hpcCwgQUQ3MjkxX1ZPTFRBR0VfQUxFUlRfU1RBVFVTLCAmdl9zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoISh0X3N0YXR1cyB8fCB2X3N0YXR1cykpCisJCXJldHVybjsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3MjkxX0FMQVJUX0NMRUFSOworCWFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+QUQ3MjkxX0FMQVJUX0NMRUFSOworCWFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICh0X3N0YXR1cyAmICgxIDw8IGkpKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FENzI5MV9UX1NFTlNFX0hJR0ggKyBpLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQqMjsgaSsrKSB7CisJCWlmICh2X3N0YXR1cyAmICgxIDw8IGkpKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FENzI5MV9WT0xUQUdFX0JBU0UgKyBpLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2ludGVycnVwdChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkNzI5MSwgJmFkNzI5MV9pbnRlcnJ1cHQpOworCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgJj0gQUQ3MjkxX1ZBTFVFX01BU0s7CisJaWYgKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJCWRhdGEgPj4gQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VULAorCQkJKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlsb25nIHRtcDEsIHRtcDI7CisJdTE2IGRhdGE7CisJY2hhciAqcG9zOworCWludCByZXQ7CisKKwlwb3MgPSBzdHJjaHIoYnVmLCAnLicpOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdG1wMSk7CisKKwlpZiAocmV0IHx8IHRtcDEgPiAxMjcgfHwgdG1wMSA8IC0xMjgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcykgeworCQlsZW4gPSBzdHJsZW4ocG9zKTsKKwkJaWYgKGxlbiA+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCWxlbiA9IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJcG9zW2xlbl0gPSAwOworCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQlpZiAoIXJldCkKKwkJCXRtcDIgPSAodG1wMiAvIDI1KSAqIDI1OworCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisJZGF0YSA9IChkYXRhIDw8IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkodG1wMiAmIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0spOworCWlmICh0bXAxIDwgMCkKKwkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCWRhdGEgPSAoQUQ3MjkxX1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd190X3NlbnNlX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3Rfc2Vuc2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd190X3NlbnNlX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0hZU1QsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9IWVNULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2hvd192X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWludCByZXQ7CisKKwlpZiAoYm91bmRfcmVnIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSB8fAorCQlib3VuZF9yZWcgPj0gQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSArCisJCUFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgJj0gQUQ3MjkxX1ZBTFVFX01BU0s7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3ZfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGJvdW5kX3JlZyA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgfHwKKwkJYm91bmRfcmVnID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgKworCQlBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCisJaWYgKHJldCB8fCB2YWx1ZSA+PSA0MDk2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAodTE2KXZhbHVlOworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgYm91bmRfcmVnLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoY29uc3QgY2hhciAqY2hhbm5lbCkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoc3RybGVuKGNoYW5uZWwpIDwgMyAmJiBjaGFubmVsWzBdICE9ICd2JykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmRleCA9IGNoYW5uZWxbMV0gLSAnMCc7CisJaWYgKGluZGV4ID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwgcmVncywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLCByZWdzLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwgcmVncysxLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF92b2x0YWdlX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwgcmVncysxLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsIHJlZ3MrMiwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdm9sdGFnZV9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLCByZWdzKzIsIGJ1ZiwgbGVuKTsKK30KKworSUlPX0VWRU5UX0FUVFJfU0godF9zZW5zZV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd190X3NlbnNlX2hpZ2gsIGFkNzI5MV9zZXRfdF9zZW5zZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfc2Vuc2VfbG93LCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd190X3NlbnNlX2xvdywgYWQ3MjkxX3NldF90X3NlbnNlX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X3NlbnNlX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3Rfc2Vuc2VfaHlzdCwgYWQ3MjkxX3NldF90X3NlbnNlX2h5c3QsIDApOworCitJSU9fRVZFTlRfQVRUUl9TSCh2MF9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYwX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjBfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2MV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYxX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjFfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Ml9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYyX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjJfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2M19oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYzX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjNfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NF9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY0X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjRfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY1X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjVfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Nl9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY2X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjZfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2N19oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY3X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjdfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcyOTFfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl90X3NlbnNlX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9zZW5zZV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9zZW5zZV9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YwX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YwX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjFfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92MV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjFfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Ml9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YyX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Ml9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YzX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjNfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YzX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjRfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjRfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y1X2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NV9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y2X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjZfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y2X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjdfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92N19sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjdfaHlzdC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyOTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI5MV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MjkxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcDsKKwlpbnQgcmV0ID0gMDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisJY2hpcC0+Y29tbWFuZCA9IEFENzI5MV9OT0lTRV9ERUxBWSB8IEFENzI5MV9UX1NFTlNFX01BU0s7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzI5MV9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZDcyOTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9MT1csCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2RldjsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkNzI5MS4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBTbywgb25seSByZWdpc3RlciBldmVudCBoYW5kbGVyIG9uY2UuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZDcyOTEsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWQ3MjkxX2ludGVycnVwdF9iaCk7CisKKwkJLyogc2V0IGlycSBwb2xhcml0eSBsb3cgbGV2ZWwgKi8KKwkJY2hpcC0+Y29tbWFuZCB8PSBBRDcyOTFfQUxBUlRfUE9MQVJJVFk7CisJfQorCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY2hpcC0+Y29tbWFuZCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVnaXN0ZXJlZC5cbiIsCisJCQkgaWQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcyOTFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDcyOTFfaWRbXSA9IHsKKwl7ICJhZDcyOTEiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcyOTFfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MjkxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcyOTEiLAorCX0sCisJLnByb2JlID0gYWQ3MjkxX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcyOTFfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcyOTFfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcyOTFfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MjkxX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDcyOTFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDcyOTFfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzI5MSBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzI5MV9pbml0KTsKK21vZHVsZV9leGl0KGFkNzI5MV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwODBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQUQ3Mjk4IGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzI5OAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzI5OCBjb21tYW5kCisgKi8KKyNkZWZpbmUgQUQ3Mjk4X1BECQkJMHgxCisjZGVmaW5lIEFENzI5OF9UX0FWR19NQVNLCQkweDIKKyNkZWZpbmUgQUQ3Mjk4X0VYVF9SRUYJCQkweDQKKyNkZWZpbmUgQUQ3Mjk4X1RfU0VOU0VfTUFTSwkJMHgyMAorI2RlZmluZSBBRDcyOThfVk9MVEFHRV9NQVNLCQkweDNmYzAKKyNkZWZpbmUgQUQ3Mjk4X1ZPTFRBR0VfT0ZGU0VUCQkweDYKKyNkZWZpbmUgQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlQJOAorI2RlZmluZSBBRDcyOThfUkVQRUFUCQkJMHg0MAorI2RlZmluZSBBRDcyOThfV1JJVEUJCQkweDgwCisKKy8qCisgKiBBRDcyOTggdmFsdWUgbWFza3MKKyAqLworI2RlZmluZSBBRDcyOThfQ0hBTk5FTF9NQVNLCQkweGYwMDAKKyNkZWZpbmUgQUQ3Mjk4X1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX1NJR04JCTB4NDAwCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX09GRlNFVAkyCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX01BU0sJMHgyCisKKy8qCisgKiBzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcyOThfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdTE2IGNvbW1hbmQ7CisJdTE2IGJ1c3lfcGluOworCXU4ICBjaGFubmVsczsJLyogQWN0aXZlIHZvbHRhZ2UgY2hhbm5lbHMgKi8KK307CisKKy8qCisgKiBhZDcyOTggcmVnaXN0ZXIgYWNjZXNzIGJ5IFNQSQorICovCitzdGF0aWMgaW50IGFkNzI5OF9zcGlfd3JpdGUoc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAsIHUxNiBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEgfD0gQUQ3Mjk4X1dSSVRFOworCWRhdGEgPSBjcHVfdG9fYmUxNihkYXRhKTsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgKHU4ICopJmRhdGEsIHNpemVvZihkYXRhKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzI5OF9zcGlfcmVhZChzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCwgdTE2IG1hc2ssIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisJdTggY291bnQgPSBjaGlwLT5jaGFubmVsczsKKwl1MTYgY29tbWFuZDsKKwlpbnQgaTsKKworCWlmIChtYXNrICYgQUQ3Mjk4X1RfU0VOU0VfTUFTSykgeworCQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH4oQUQ3Mjk4X1RfQVZHX01BU0sgfCBBRDcyOThfVk9MVEFHRV9NQVNLKTsKKwkJY29tbWFuZCB8PSBBRDcyOThfVF9TRU5TRV9NQVNLOworCQljb3VudCA9IDE7CisJfSBlbHNlIGlmIChtYXNrICYgQUQ3Mjk4X1RfQVZHX01BU0spIHsKKwkJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+QUQ3Mjk4X1ZPTFRBR0VfTUFTSzsKKwkJY29tbWFuZCB8PSBBRDcyOThfVF9TRU5TRV9NQVNLIHwgQUQ3Mjk4X1RfQVZHX01BU0s7CisJCWNvdW50ID0gMjsKKwl9IGVsc2UgaWYgKG1hc2sgJiBBRDcyOThfVk9MVEFHRV9NQVNLKSB7CisJCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgfihBRDcyOThfVF9BVkdfTUFTSyB8IEFENzI5OF9UX1NFTlNFX01BU0spOworCQljb3VudCA9IGNoaXAtPmNoYW5uZWxzOworCX0KKworCXJldCA9IGFkNzI5OF9zcGlfd3JpdGUoY2hpcCwgY2hpcC0+Y29tbWFuZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHdyaXRlIGNvbW1hbmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKSZjb21tYW5kLCBzaXplb2YoY29tbWFuZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpID0gMTAwMDA7CisJd2hpbGUgKGkgJiYgZ3Bpb19nZXRfdmFsdWUoY2hpcC0+YnVzeV9waW4pKSB7CisJCWNwdV9yZWxheCgpOworCQlpLS07CisJfQorCWlmICghaSkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJBbHdheXMgaW4gYnVzeSBjb252ZXJ0aW9uLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gc3BpX3JlYWQoc3BpX2RldiwgKHU4ICopJmRhdGFbaV0sIHNpemVvZihkYXRhW2ldKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgcmVhZCBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSpkYXRhID0gYmUxNl90b19jcHUoZGF0YVtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOThfUkVQRUFUKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJyZXBlYXRcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAibm9ybWFsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKHN0cmNtcChidWYsICJyZXBlYXQiKSkKKwkJY2hpcC0+Y29tbWFuZCB8PSBBRDcyOThfUkVQRUFUOworCWVsc2UKKwkJY2hpcC0+Y29tbWFuZCAmPSAofkFENzI5OF9SRVBFQVQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5OF9zaG93X21vZGUsCisJCWFkNzI5OF9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJub3JtYWxcbnJlcGVhdFxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZDcyOThfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOThfc3RvcmVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCWludCByZXQ7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH5BRDcyOThfUEQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgfCBBRDcyOThfUEQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWQ3Mjk4X3N0b3JlX3Jlc2V0LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfZXh0X3JlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29tbWFuZCAmIEFENzI5OF9FWFRfUkVGKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zdG9yZV9leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5OF9FWFRfUkVGKTsKKwlpZiAoc3RyY21wKGJ1ZiwgIjEiKSkKKwkJY29tbWFuZCB8PSBBRDcyOThfRVhUX1JFRjsKKworCXJldCA9IGFkNzI5OF9zcGlfd3JpdGUoY2hpcCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXh0X3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5OF9zaG93X2V4dF9yZWYsCisJCWFkNzI5OF9zdG9yZV9leHRfcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3JlYWQoY2hpcCwgQUQ3Mjk4X1RfU0VOU0VfTUFTSywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRhdGEgJiBBRDcyOThfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5OF9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQUQ3Mjk4X1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRDcyOThfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlLCBTX0lSVUdPLCBhZDcyOThfc2hvd190X3NlbnNlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdF9hdmVyYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YVsyXTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5OF9zcGlfcmVhZChjaGlwLCBBRDcyOThfVF9BVkdfTUFTSywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZGF0YVsxXSAmIEFENzI5OF9UX1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGFbMV0gPSAoQUQ3Mjk4X1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGFbMV07CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkoZGF0YVsxXSA+PiBBRDcyOThfVF9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YVsxXSAmIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX01BU0spICogMjUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRfYXZlcmFnZSwgU19JUlVHTywgYWQ3Mjk4X3Nob3dfdF9hdmVyYWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGFbQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlRdOworCWludCBpLCBzaXplLCByZXQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3JlYWQoY2hpcCwgQUQ3Mjk4X1ZPTFRBR0VfTUFTSywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlQ7IGkrKykgeworCQlpZiAoY2hpcC0+Y29tbWFuZCAmIChBRDcyOThfVF9TRU5TRV9NQVNLIDw8IGkpKSB7CisJCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgImNoYW5uZWxbJWRdPSVkXG4iLCBpLAorCQkJCQlkYXRhW2ldICYgQUQ3Mjk4X1ZBTFVFX01BU0spOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQlidWYgKz0gcmV0OworCQkJc2l6ZSArPSByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2b2x0YWdlLCBTX0lSVUdPLCBhZDcyOThfc2hvd192b2x0YWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfY2hhbm5lbF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIChjaGlwLT5jb21tYW5kICYgQUQ3Mjk4X1ZPTFRBR0VfTUFTSykgPj4KKwkJCUFENzI5OF9WT0xUQUdFX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zdG9yZV9jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hpcC0+Y29tbWFuZCAmPSAofkFENzI5OF9WT0xUQUdFX01BU0spOworCWNoaXAtPmNvbW1hbmQgfD0gZGF0YSA8PCBBRDcyOThfVk9MVEFHRV9PRkZTRVQ7CisKKwlmb3IgKGkgPSAwLCBjaGlwLT5jaGFubmVscyA9IDA7IGkgPCBBRDcyOThfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5OF9UX1NFTlNFX01BU0sgPDwgaSkpCisJCQljaGlwLT5jaGFubmVscysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3Mjk4X3Nob3dfY2hhbm5lbF9tYXNrLAorCQlhZDcyOThfc3RvcmVfY2hhbm5lbF9tYXNrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzI5OF9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3Mjk4X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4dF9yZWYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Rfc2Vuc2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RfYXZlcmFnZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdm9sdGFnZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hhbm5lbF9tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzI5OF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3Mjk4X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgYWQ3Mjk4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwOworCXVuc2lnbmVkIHNob3J0ICpwaW5zID0gc3BpX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkNzI5OF9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIGNoaXApOworCisJY2hpcC0+c3BpX2RldiA9IHNwaV9kZXY7CisJY2hpcC0+bmFtZSA9IHNwaV9kZXYtPm1vZGFsaWFzOworCWNoaXAtPmJ1c3lfcGluID0gcGluc1swXTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChjaGlwLT5idXN5X3BpbiwgY2hpcC0+bmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJGYWlsIHRvIHJlcXVlc3QgYnVzeSBncGlvIFBJTiAlZC5cbiIsCisJCQljaGlwLT5idXN5X3Bpbik7CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChjaGlwLT5idXN5X3Bpbik7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGlfZGV2LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDcyOThfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgcmVnaXN0ZXJlZC5cbiIsCisJCQkgY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2dwaW86CisJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzI5OF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDcyOThfaWRbXSA9IHsKKwl7ICJhZDcyOTgiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZDcyOThfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3Mjk4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcyOTgiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDcyOThfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzI5OF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzI5OF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzI5OF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzI5OF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3Mjk4X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzI5OF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3Mjk4IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDcyOThfaW5pdCk7Cittb2R1bGVfZXhpdChhZDcyOThfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzMxNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTdiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIEFENzMxNCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgZm9yIEFENzMxNCwgQURUNzMwMSBhbmQgQURUNzMwMgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzMxNCBwb3dlciBtb2RlCisgKi8KKyNkZWZpbmUgQUQ3MzE0X1BECQkweDIwMDAKKworLyoKKyAqIEFENzMxNCB0ZW1wZXJhdHVyZSBtYXNrcworICovCisjZGVmaW5lIEFENzMxNF9URU1QX1NJR04JCTB4MjAwCisjZGVmaW5lIEFENzMxNF9URU1QX01BU0sJCTB4N0ZFMAorI2RlZmluZSBBRDczMTRfVEVNUF9PRkZTRVQJCTUKKyNkZWZpbmUgQUQ3MzE0X1RFTVBfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQUQ3MzE0X1RFTVBfRkxPQVRfTUFTSwkJMHgzCisKKy8qCisgKiBBRFQ3MzAxIGFuZCBBRFQ3MzAyIHRlbXBlcmF0dXJlIG1hc2tzCisgKi8KKyNkZWZpbmUgQURUNzMwMV9URU1QX1NJR04JCTB4MjAwMAorI2RlZmluZSBBRFQ3MzAxX1RFTVBfTUFTSwkJMHgyRkZGCisjZGVmaW5lIEFEVDczMDFfVEVNUF9GTE9BVF9PRkZTRVQJNQorI2RlZmluZSBBRFQ3MzAxX1RFTVBfRkxPQVRfTUFTSwkJMHgxRgorCisvKgorICogc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXM2NCBsYXN0X3RpbWVzdGFtcDsKKwl1OCAgbW9kZTsKK307CisKKy8qCisgKiBhZDczMTQgcmVnaXN0ZXIgYWNjZXNzIGJ5IFNQSQorICovCisKK3N0YXRpYyBpbnQgYWQ3MzE0X3NwaV9yZWFkKHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCWludCByZXQgPSAwOworCXUxNiB2YWx1ZTsKKworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKSZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gYmUxNl90b19jcHUoKHUxNil2YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzMxNF9zcGlfd3JpdGUoc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAsIHUxNiBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsdWUgPSBjcHVfdG9fYmUxNihkYXRhKTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAodTggKikmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItc2F2ZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBtb2RlID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCFzdHJjbXAoYnVmLCAiZnVsbCIpKQorCQltb2RlID0gQUQ3MzE0X1BEOworCisJcmV0ID0gYWQ3MzE0X3NwaV93cml0ZShjaGlwLCBtb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPm1vZGUgPSBtb2RlOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MzE0X3Nob3dfbW9kZSwKKwkJYWQ3MzE0X3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZDczMTRfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbnBvd2VyLXNhdmVcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWQ3MzE0X3Nob3dfYXZhaWxhYmxlX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPm1vZGUpIHsKKwkJcmV0ID0gYWQ3MzE0X3NwaV93cml0ZShjaGlwLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGFkNzMxNF9zcGlfcmVhZChjaGlwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJYWQ3MzE0X3NwaV93cml0ZShjaGlwLCBjaGlwLT5tb2RlKTsKKworCWlmIChzdHJjbXAoY2hpcC0+bmFtZSwgImFkNzMxNCIpKSB7CisJCWRhdGEgPSAoZGF0YSAmIEFENzMxNF9URU1QX01BU0spID4+CisJCQlBRDczMTRfVEVNUF9PRkZTRVQ7CisJCWlmIChkYXRhICYgQUQ3MzE0X1RFTVBfU0lHTikgeworCQkJZGF0YSA9IChBRDczMTRfVEVNUF9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCQkJZGF0YSA+PiBBRDczMTRfVEVNUF9GTE9BVF9PRkZTRVQsCisJCQkJKGRhdGEgJiBBRDczMTRfVEVNUF9GTE9BVF9NQVNLKSAqIDI1KTsKKwl9IGVsc2UgeworCQlkYXRhICY9IEFEVDczMDFfVEVNUF9NQVNLOworCQlpZiAoZGF0YSAmIEFEVDczMDFfVEVNUF9TSUdOKSB7CisJCQlkYXRhID0gKEFEVDczMDFfVEVNUF9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuNWRcbiIsIHNpZ24sCisJCQkJZGF0YSA+PiBBRFQ3MzAxX1RFTVBfRkxPQVRfT0ZGU0VULAorCQkJCShkYXRhICYgQURUNzMwMV9URU1QX0ZMT0FUX01BU0spICogMzEyNSk7CisJfQorfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBhZDczMTRfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDczMTRfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzMxNF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBlcmF0dXJlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzMxNF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MzE0X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDczMTRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkNzMxNF9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIGNoaXApOworCisJY2hpcC0+c3BpX2RldiA9IHNwaV9kZXY7CisJY2hpcC0+bmFtZSA9IHNwaV9kZXYtPm1vZGFsaWFzOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpX2Rldi0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3MzE0X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGNoaXAtPm5hbWUpOworCisJcmV0dXJuIDA7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzMxNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKKwlpZiAoc3BpX2Rldi0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDczMTRfaWRbXSA9IHsKKwl7ICJhZHQ3MzAxIiwgMCB9LAorCXsgImFkdDczMDIiLCAwIH0sCisJeyAiYWQ3MzE0IiwgMCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3MzE0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDczMTQiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDczMTRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzMxNF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzMxNF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzMxNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzMxNF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MzE0X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzMxNF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MzE0LCBBRFQ3MzAxIGFuZCBBRFQ3MzAyIGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3MzE0X2luaXQpOworbW9kdWxlX2V4aXQoYWQ3MzE0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjdlZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMKQEAgLTAsMCArMSw3MzQgQEAKKy8qCisgKiBBRDc3NFggY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3NzQ1LzYvNworICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3NzRYIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDc3NFhfU1RBVFVTCQkwCisjZGVmaW5lIEFENzc0WF9TVEFUVVNfUkRZCSgxIDw8IDIpCisjZGVmaW5lIEFENzc0WF9TVEFUVVNfUkRZVlQJKDEgPDwgMSkKKyNkZWZpbmUgQUQ3NzRYX1NUQVRVU19SRFlDQVAJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3NzRYX0NBUF9EQVRBX0hJR0gJMQorI2RlZmluZSBBRDc3NFhfQ0FQX0RBVEFfTUlECTIKKyNkZWZpbmUgQUQ3NzRYX0NBUF9EQVRBX0xPVwkzCisjZGVmaW5lIEFENzc0WF9WVF9EQVRBX0hJR0gJNAorI2RlZmluZSBBRDc3NFhfVlRfREFUQV9NSUQJNQorI2RlZmluZSBBRDc3NFhfVlRfREFUQV9MT1cJNgorI2RlZmluZSBBRDc3NFhfQ0FQX1NFVFVQCTcKKyNkZWZpbmUgQUQ3NzRYX1ZUX1NFVFVQCQk4CisjZGVmaW5lIEFENzc0WF9FWEVDX1NFVFVQCTkKKyNkZWZpbmUgQUQ3NzRYX0NGRwkJMTAKKyNkZWZpbmUgQUQ3NzRYX0NBUERBQ0EJCTExCisjZGVmaW5lIEFENzc0WF9DQVBEQUNCCQkxMgorI2RlZmluZSBBRDc3NFhfQ0FQREFDX0VOCSgxIDw8IDcpCisjZGVmaW5lIEFENzc0WF9DQVBfT0ZGSAkJMTMKKyNkZWZpbmUgQUQ3NzRYX0NBUF9PRkZMCQkxNAorI2RlZmluZSBBRDc3NFhfQ0FQX0dBSU5ICTE1CisjZGVmaW5lIEFENzc0WF9DQVBfR0FJTkwJMTYKKyNkZWZpbmUgQUQ3NzRYX1ZPTFRfR0FJTkgJMTcKKyNkZWZpbmUgQUQ3NzRYX1ZPTFRfR0FJTkwJMTgKKworI2RlZmluZSBBRDc3NFhfTUFYX0NPTlZfTU9ERQk2CisKKy8qCisgKiBzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDc3NHhfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJYm9vbCBpbnRlcjsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNhcF9vZmZzOyAgICAgICAgICAgICAgICAgICAvKiBDYXBhY2l0aXZlIG9mZnNldCAqLworCXUxNiBjYXBfZ2FpbjsgICAgICAgICAgICAgICAgICAgLyogQ2FwYWNpdGl2ZSBnYWluIGNhbGlicmF0aW9uICovCisJdTE2IHZvbHRfZ2FpbjsgICAgICAgICAgICAgICAgICAvKiBWb2x0YWdlIGdhaW4gY2FsaWJyYXRpb24gKi8KKwl1OCAgY2FwX3NldHVwOworCXU4ICB2dF9zZXR1cDsKKwl1OCAgZXhlY19zZXR1cDsKKworCWNoYXIgKmNvbnZlcnNpb25fbW9kZTsKK307CisKK3N0cnVjdCBhZDc3NHhfY29udmVyc2lvbl9tb2RlIHsKKwljaGFyICpuYW1lOworCXU4IHJlZ19jZmc7Cit9OworCitzdHJ1Y3QgYWQ3NzR4X2NvbnZlcnNpb25fbW9kZSBhZDc3NHhfY29udl9tb2RlX3RhYmxlW0FENzc0WF9NQVhfQ09OVl9NT0RFXSA9IHsKKwl7ICJpZGxlIiwgMCB9LAorCXsgImNvbnRpbnVvdXMtY29udmVyc2lvbiIsIDEgfSwKKwl7ICJzaW5nbGUtY29udmVyc2lvbiIsIDIgfSwKKwl7ICJwb3dlci1kb3duIiwgMyB9LAorCXsgIm9mZnNldC1jYWxpYnJhdGlvbiIsIDUgfSwKKwl7ICJnYWluLWNhbGlicmF0aW9uIiwgNiB9LAorfTsKKworLyoKKyAqIGFkNzc0eCByZWdpc3RlciBhY2Nlc3MgYnkgSTJDCisgKi8KKworc3RhdGljIGludCBhZDc3NHhfaTJjX3JlYWQoc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc3NHhfaTJjX3dyaXRlKHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2FwX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZUX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpbjBfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfRVhFQ19TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoZXhlY19zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGluMF9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9PRkZTKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjYXBfb2ZmcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2FwX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0FQX0RBVEEoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNhcDBfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZUX0RBVEEoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGluMF9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRDc3NFhfTUFYX0NPTlZfTU9ERTsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlcyAiLCBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisJaW50IGk7CisKKwlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX0NGRywgJmNmZywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3NzRYX01BWF9DT05WX01PREU7IGkrKykgeworCQlpZiAoc3RybmNtcChidWYsIGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZSwKKwkJCQlzdHJsZW4oYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKSAtIDEpID09IDApIHsKKwkJCWNoaXAtPmNvbnZlcnNpb25fbW9kZSA9IGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZTsKKwkJCWNmZyB8PSAweDE4IHwgYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5yZWdfY2ZnOworCQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0ZHLCBjZmcpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGUsCisJCWFkNzc0eF9zdG9yZV9jb252ZXJzaW9uX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19kYWNfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwl1OCBkYXRhOworCisJYWQ3NzR4X2kyY19yZWFkKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywgJmRhdGEsIDEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAyeFxuIiwgZGF0YSAmIDB4N0YpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfZGFjX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoIXJldCkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywKKwkJCShkYXRhID8gQUQ3NzRYX0NBUERBQ19FTiA6IDApIHwgKGRhdGEgJiAweDdGKSk7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2FwZGFjMF9yYXcsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlLAorCQkJYWQ3NzR4X3N0b3JlX2RhY192YWx1ZSwKKwkJCUFENzc0WF9DQVBEQUNBKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjYXBkYWMxX3JhdywgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlhZDc3NHhfc2hvd19kYWNfdmFsdWUsCisJCQlhZDc3NHhfc3RvcmVfZGFjX3ZhbHVlLAorCQkJQUQ3NzRYX0NBUERBQ0IpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jYXBfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jYXBfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY2FwX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2FwX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X2NhcF9zZXR1cCwKKwkJYWQ3NzR4X3N0b3JlX2NhcF9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X3Z0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+dnRfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfdnRfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WVF9TRVRVUCwgZGF0YSk7CisJCWNoaXAtPnZ0X3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9WVF9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfdnRfc2V0dXAsCisJCWFkNzc0eF9zdG9yZV92dF9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2V4ZWNfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5leGVjX3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2V4ZWNfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9FWEVDX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+ZXhlY19zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfRVhFQ19TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfZXhlY19zZXR1cCwKKwkJYWQ3NzR4X3N0b3JlX2V4ZWNfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192b2x0X2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPnZvbHRfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV92b2x0X2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX1ZPTFRfR0FJTkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX1ZPTFRfR0FJTkwsIGRhdGEpOworCQljaGlwLT52b2x0X2dhaW4gPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZPTFRfR0FJTihTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfdm9sdF9nYWluLAorCQlhZDc3NHhfc3RvcmVfdm9sdF9nYWluKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyIHRtcFszXTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfQ0FQX0RBVEFfSElHSCwgdG1wLCAzKTsKKwlkYXRhID0gKChpbnQpdG1wWzBdIDw8IDE2KSB8ICgoaW50KXRtcFsxXSA8PCA4KSB8IChpbnQpdG1wWzJdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfREFUQShhZDc3NHhfc2hvd19jYXBfZGF0YSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X3Z0X2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyIHRtcFszXTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfVlRfREFUQV9ISUdILCB0bXAsIDMpOworCWRhdGEgPSAoKGludCl0bXBbMF0gPDwgMTYpIHwgKChpbnQpdG1wWzFdIDw8IDgpIHwgKGludCl0bXBbMl07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGRhdGEpOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZUX0RBVEEoYWQ3NzR4X3Nob3dfdnRfZGF0YSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9vZmZzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jYXBfb2Zmcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9jYXBfb2ZmcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX09GRkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9PRkZMLCBkYXRhKTsKKwkJY2hpcC0+Y2FwX29mZnMgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NBUF9PRkZTKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc3NHhfc2hvd19jYXBfb2ZmcywKKwkJYWQ3NzR4X3N0b3JlX2NhcF9vZmZzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNhcF9nYWluKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NhcF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfR0FJTkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9HQUlOTCwgZGF0YSk7CisJCWNoaXAtPmNhcF9nYWluID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfR0FJTihTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfY2FwX2dhaW4sCisJCWFkNzc0eF9zdG9yZV9jYXBfZ2Fpbik7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDc3NHhfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzc0eF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfY29udmVyc2lvbl9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY29udmVyc2lvbl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMF9zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZXhlY19zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwX29mZnMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcF9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjBfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcGRhYzBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBkYWMxX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NHhfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzc0eF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRhdGEgcmVhZHkgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9DQVBfUkRZICAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfVlRfUkRZICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0FQX1JEWV9TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKGNhcF9yZHksIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1ZUX1JEWV9TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKHZ0X3JkeSwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKK3N0YXRpYyB2b2lkIGFkNzc0eF9pbnRlcnJ1cHRfaGFuZGxlcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTggaW50X3N0YXR1czsKKworCWVuYWJsZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEpOworCisJYWQ3NzR4X2kyY19yZWFkKGNoaXAsIEFENzc0WF9TVEFUVVMsICZpbnRfc3RhdHVzLCAxKTsKKworCWlmIChpbnRfc3RhdHVzICYgQUQ3NzRYX1NUQVRVU19SRFlDQVApCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DQVBfUkRZLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKworCWlmIChpbnRfc3RhdHVzICYgQUQ3NzRYX1NUQVRVU19SRFlWVCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX1ZUX1JEWSwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3NzR4X2ludGVycnVwdF9oYW5kbGVyX3RoKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goZGF0YV9yZHksICZhZDc3NHhfaW50ZXJydXB0X2hhbmRsZXJfdGgpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfcXVlcnlfb3V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCS8qCisJICogQUQ3NzRYIHByb3ZpZGVzIG9uZSAvUkRZIHBpbiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgaW50ZXJydXB0CisJICogYnV0IHRoZSBwaW4gaXMgbm90IGNvbmZpZ3VyYWJsZQorCSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2V0X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbGVuOworfQorCitJSU9fRVZFTlRfQVRUUl9DQVBfUkRZX1NIKGlpb19ldmVudF9kYXRhX3JkeSwgYWQ3NzR4X3F1ZXJ5X291dF9tb2RlLCBhZDc3NHhfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1ZUX1JEWV9TSChpaW9fZXZlbnRfZGF0YV9yZHksIGFkNzc0eF9xdWVyeV9vdXRfbW9kZSwgYWQ3NzR4X3NldF9vdXRfbW9kZSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc3NHhfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9jYXBfcmR5LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Z0X3JkeS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NHhfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzc0eF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3NzR4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwkvKiBFc3RhYmxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3NzR4X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkNzc0eF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJcmVnZG9uZSA9IDE7CisKKwlpZiAoY2xpZW50LT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZDc3NHgiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KGlpb19ldmVudF9hdHRyX2NhcF9yZHkubGlzdGVsLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzc0eF9pbnRlcnJ1cHRfaGFuZGxlcl9iaCk7CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkLCBpcnE6ICVkXG4iLCBpZC0+bmFtZSwgY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzc0eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzc0eF9pZFtdID0geworCXsgImFkNzc0NSIsIDAgfSwKKwl7ICJhZDc3NDYiLCAwIH0sCisJeyAiYWQ3NzQ3IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3NzR4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzc0eF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3NzR4IiwKKwl9LAorCS5wcm9iZSA9IGFkNzc0eF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3NzR4X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3NzR4X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3NzR4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzc0eF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3NzR4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3NzR4X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDc3NDUvNi83IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDc3NHhfaW5pdCk7Cittb2R1bGVfZXhpdChhZDc3NHhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzgxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4MTYuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIEFENzgxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDc4MTYvNy84CisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3ODE2IGNvbmZpZyBtYXNrcworICovCisjZGVmaW5lIEFENzgxNl9GVUxMCQkJMHgxCisjZGVmaW5lIEFENzgxNl9QRAkJCTB4MgorI2RlZmluZSBBRDc4MTZfQ1NfTUFTSwkJCTB4NworI2RlZmluZSBBRDc4MTZfQ1NfTUFYCQkJMHg0CisKKy8qCisgKiBBRDc4MTYgdGVtcGVyYXR1cmUgbWFza3MKKyAqLworI2RlZmluZSBBRDc4MTZfVkFMVUVfT0ZGU0VUCQk2CisjZGVmaW5lIEFENzgxNl9CT1VORF9WQUxVRV9CQVNFCQkweDgKKyNkZWZpbmUgQUQ3ODE2X0JPVU5EX1ZBTFVFX01JTgkJLTk1CisjZGVmaW5lIEFENzgxNl9CT1VORF9WQUxVRV9NQVgJCTE1MgorI2RlZmluZSBBRDc4MTZfVEVNUF9GTE9BVF9PRkZTRVQJMgorI2RlZmluZSBBRDc4MTZfVEVNUF9GTE9BVF9NQVNLCQkweDMKKworCisvKgorICogc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IHJkd3JfcGluOworCXUxNiBjb252ZXJ0X3BpbjsKKwl1MTYgYnVzeV9waW47CisJdTggIG90aV9kYXRhW0FENzgxNl9DU19NQVgrMV07CisJdTggIGNoYW5uZWxfaWQ7CS8qIDAgYWx3YXlzIGJlIHRlbXBlcmF0dXJlICovCisJdTggIG1vZGU7Cit9OworCisvKgorICogYWQ3ODE2IGRhdGEgYWNjZXNzIGJ5IFNQSQorICovCitzdGF0aWMgaW50IGFkNzgxNl9zcGlfcmVhZChzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCwgdTE2ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZjaGlwLT5jaGFubmVsX2lkLCBzaXplb2YoY2hpcC0+Y2hhbm5lbF9pZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBjaGFubmVsIHNldHRpbmcgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMSk7CisKKworCWlmIChjaGlwLT5tb2RlID09IEFENzgxNl9QRCkgeyAvKiBvcGVyYXRpbmcgbW9kZSAyICovCisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmNvbnZlcnRfcGluLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y29udmVydF9waW4sIDApOworCX0gZWxzZSB7IC8qIG9wZXJhdGluZyBtb2RlIDEgKi8KKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y29udmVydF9waW4sIDApOworCQlncGlvX3NldF92YWx1ZShjaGlwLT5jb252ZXJ0X3BpbiwgMSk7CisJfQorCisJd2hpbGUgKGdwaW9fZ2V0X3ZhbHVlKGNoaXAtPmJ1c3lfcGluKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDEpOworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKWRhdGEsIHNpemVvZigqZGF0YSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBkYXRhIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gYmUxNl90b19jcHUoKmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc4MTZfc3BpX3dyaXRlKHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwLCB1OCBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgb3RpIGRhdGEgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItc2F2ZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKHN0cmNtcChidWYsICJmdWxsIikpIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDEpOworCQljaGlwLT5tb2RlID0gQUQ3ODE2X0ZVTEw7CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDApOworCQljaGlwLT5tb2RlID0gQUQ3ODE2X1BEOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzgxNl9zaG93X21vZGUsCisJCWFkNzgxNl9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5wb3dlci1zYXZlXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzgxNl9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoYW5uZWxfaWQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc3RvcmVfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSA+IEFENzgxNl9DU19NQVggJiYgZGF0YSAhPSBBRDc4MTZfQ1NfTUFTSykgeworCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsICJJbnZhbGlkIGNoYW5uZWwgaWQgJWx1IGZvciAlcy5cbiIsCisJCQlkYXRhLCBjaGlwLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzdHJjbXAoY2hpcC0+bmFtZSwgImFkNzgxOCIpID09IDAgJiYgZGF0YSA+IDEpIHsKKwkJZGV2X2VycigmY2hpcC0+c3BpX2Rldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpZCAlbHUgZm9yIGFkNzgxOC5cbiIsIGRhdGEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHN0cmNtcChjaGlwLT5uYW1lLCAiYWQ3ODE2IikgPT0gMCAmJiBkYXRhID4gMCkgeworCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGlkICVsdSBmb3IgYWQ3ODE2LlxuIiwgZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoaXAtPmNoYW5uZWxfaWQgPSBkYXRhOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3ODE2X3Nob3dfY2hhbm5lbCwKKwkJYWQ3ODE2X3N0b3JlX2NoYW5uZWwsCisJCTApOworCisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlzOCB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWQ3ODE2X3NwaV9yZWFkKGNoaXAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPj49IEFENzgxNl9WQUxVRV9PRkZTRVQ7CisKKwlpZiAoY2hpcC0+Y2hhbm5lbF9pZCA9PSAwKSB7CisJCXZhbHVlID0gKHM4KSgoZGF0YSA+PiBBRDc4MTZfVEVNUF9GTE9BVF9PRkZTRVQpIC0gMTAzKTsKKwkJZGF0YSAmPSBBRDc4MTZfVEVNUF9GTE9BVF9NQVNLOworCQlpZiAodmFsdWUgPCAwKQorCQkJZGF0YSA9ICgxIDw8IEFENzgxNl9URU1QX0ZMT0FUX09GRlNFVCkgLSBkYXRhOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lLjJkXG4iLCB2YWx1ZSwgZGF0YSAqIDI1KTsKKwl9IGVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZDc4MTZfc2hvd192YWx1ZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDc4MTZfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzgxNl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoYW5uZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzgxNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3ODE2X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGVtcGVyYXR1cmUgYm91bmQgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDc4MTZfT1RJICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorCitzdGF0aWMgdm9pZCBhZDc4MTZfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzgxNl9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKworCWVuYWJsZV9pcnEoY2hpcC0+c3BpX2Rldi0+aXJxKTsKKworCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FENzgxNl9PVEksCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3ODE2X2ludGVycnVwdChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkNzgxNiwgJmFkNzgxNl9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc2hvd19vdGkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCB2YWx1ZTsKKworCWlmIChjaGlwLT5jaGFubmVsX2lkID4gQUQ3ODE2X0NTX01BWCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgb3RpIGNoYW5uZWwgaWQgJWQuXG4iLCBjaGlwLT5jaGFubmVsX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChjaGlwLT5jaGFubmVsX2lkID09IDApIHsKKwkJdmFsdWUgPSBBRDc4MTZfQk9VTkRfVkFMVUVfTUlOICsKKwkJCShjaGlwLT5vdGlfZGF0YVtjaGlwLT5jaGFubmVsX2lkXSAtCisJCQlBRDc4MTZfQk9VTkRfVkFMVUVfQkFTRSk7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7CisJfSBlbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjaGlwLT5vdGlfZGF0YVtjaGlwLT5jaGFubmVsX2lkXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDc4MTZfc2V0X290aShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB2YWx1ZTsKKwl1OCBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWx1ZSk7CisKKwlpZiAoY2hpcC0+Y2hhbm5lbF9pZCA+IEFENzgxNl9DU19NQVgpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG90aSBjaGFubmVsIGlkICVkLlxuIiwgY2hpcC0+Y2hhbm5lbF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoY2hpcC0+Y2hhbm5lbF9pZCA9PSAwKSB7CisJCWlmIChyZXQgfHwgdmFsdWUgPCBBRDc4MTZfQk9VTkRfVkFMVUVfTUlOIHx8CisJCQl2YWx1ZSA+IEFENzgxNl9CT1VORF9WQUxVRV9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkYXRhID0gKHU4KSh2YWx1ZSAtIEFENzgxNl9CT1VORF9WQUxVRV9NSU4gKworCQkJQUQ3ODE2X0JPVU5EX1ZBTFVFX0JBU0UpOworCX0gZWxzZSB7CisJCWlmIChyZXQgfHwgdmFsdWUgPCBBRDc4MTZfQk9VTkRfVkFMVUVfQkFTRSB8fCB2YWx1ZSA+IDI1NSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRhdGEgPSAodTgpdmFsdWU7CisJfQorCisJcmV0ID0gYWQ3ODE2X3NwaV93cml0ZShjaGlwLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPm90aV9kYXRhW2NoaXAtPmNoYW5uZWxfaWRdID0gZGF0YTsKKworCXJldHVybiBsZW47Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKG90aSwgaWlvX2V2ZW50X2FkNzgxNiwKKwkJYWQ3ODE2X3Nob3dfb3RpLCBhZDc4MTZfc2V0X290aSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc4MTZfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9vdGkuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDc4MTZfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzgxNl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcDsKKwl1bnNpZ25lZCBzaG9ydCAqcGlucyA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKCFwaW5zKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIk5vIG5lY2Vzc2FyeSBHUElPIHBsYXRmb3JtIGRhdGEuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKwlmb3IgKGkgPSAwOyBpIDw9IEFENzgxNl9DU19NQVg7IGkrKykKKwkJY2hpcC0+b3RpX2RhdGFbaV0gPSAyMDM7CisJY2hpcC0+cmR3cl9waW4gPSBwaW5zWzBdOworCWNoaXAtPmNvbnZlcnRfcGluID0gcGluc1sxXTsKKwljaGlwLT5idXN5X3BpbiA9IHBpbnNbMl07CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+cmR3cl9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IHJkd3IgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+cmR3cl9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+cmR3cl9waW4pOworCXJldCA9IGdwaW9fcmVxdWVzdChjaGlwLT5jb252ZXJ0X3BpbiwgY2hpcC0+bmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJGYWlsIHRvIHJlcXVlc3QgY29udmVydCBncGlvIFBJTiAlZC5cbiIsCisJCQljaGlwLT5jb252ZXJ0X3Bpbik7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Jkd3I7CisJfQorCWdwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPmNvbnZlcnRfcGluKTsKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+YnVzeV9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IGJ1c3kgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+YnVzeV9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19jb252ZXJ0OworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChjaGlwLT5idXN5X3Bpbik7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGlfZGV2LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDc4MTZfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoc3BpX2Rldi0+aXJxKSB7CisJCS8qIE9ubHkgbG93IHRyaWdnZXIgaXMgc3VwcG9ydGVkIGluIGFkNzgxNi83LzggKi8KKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaV9kZXYtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZDc4MTYuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogU28sIG9ubHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlciBvbmNlLgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWQ3ODE2LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzgxNl9pbnRlcnJ1cHRfYmgpOworCX0KKworCWRldl9pbmZvKCZzcGlfZGV2LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIEFEQyByZWdpc3RlcmVkLlxuIiwKKwkJCSBjaGlwLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZ3BpbzoKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworZXJyb3JfZnJlZV9ncGlvX2NvbnZlcnQ6CisJZ3Bpb19mcmVlKGNoaXAtPmNvbnZlcnRfcGluKTsKK2Vycm9yX2ZyZWVfZ3Bpb19yZHdyOgorCWdwaW9fZnJlZShjaGlwLT5yZHdyX3Bpbik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc4MTZfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgTlVMTCk7CisJaWYgKHNwaV9kZXYtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworCWdwaW9fZnJlZShjaGlwLT5jb252ZXJ0X3Bpbik7CisJZ3Bpb19mcmVlKGNoaXAtPnJkd3JfcGluKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ3ODE2X2lkW10gPSB7CisJeyAiYWQ3ODE2IiwgMCB9LAorCXsgImFkNzgxNyIsIDAgfSwKKwl7ICJhZDc4MTgiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZDc4MTZfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3ODE2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDc4MTYiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDc4MTZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzgxNl9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzgxNl9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzgxNl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzgxNl9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3ODE2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzgxNl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3ODE2LzcvOCBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzgxNl9pbml0KTsKK21vZHVsZV9leGl0KGFkNzgxNl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQUQ3ODg3IFNQSSBBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fQURDX0FENzg4N19IXworI2RlZmluZSBJSU9fQURDX0FENzg4N19IXworCisjZGVmaW5lIEFENzg4N19SRUZfRElTCQkoMSA8PCA1KSAvKiBvbi1jaGlwIHJlZmVyZW5jZSBkaXNhYmxlICovCisjZGVmaW5lIEFENzg4N19EVUFMCQkoMSA8PCA0KSAvKiBkdWFsLWNoYW5uZWwgbW9kZSAqLworI2RlZmluZSBBRDc4ODdfQ0hfQUlOMQkJKDEgPDwgMykgLyogY29udmVydCBvbiBjaGFubmVsIDEsIERVQUw9MSAqLworI2RlZmluZSBBRDc4ODdfQ0hfQUlOMAkJKDAgPDwgMykgLyogY29udmVydCBvbiBjaGFubmVsIDAsIERVQUw9MCwxICovCisjZGVmaW5lIEFENzg4N19QTV9NT0RFMQkJKDApCSAvKiBDUyBiYXNlZCBzaHV0ZG93biAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTIJCSgxKQkgLyogZnVsbCBvbiAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTMJCSgyKQkgLyogYXV0byBzaHV0ZG93biBhZnRlciBjb252ZXJzaW9uICovCisjZGVmaW5lIEFENzg4N19QTV9NT0RFNAkJKDMpCSAvKiBzdGFuZGJ5IG1vZGUgKi8KKworZW51bSBhZDc4ODdfY2hhbm5lbHMgeworCUFENzg4N19DSDAsCisJQUQ3ODg3X0NIMF9DSDEsCisJQUQ3ODg3X0NIMSwKK307CisKKyNkZWZpbmUgUkVTX01BU0soYml0cykJKCgxIDw8IChiaXRzKSkgLSAxKSAvKiBUT0RPOiBtb3ZlIHRoaXMgaW50byBhIGNvbW1vbiBoZWFkZXIgKi8KKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworc3RydWN0IGFkNzg4N19wbGF0Zm9ybV9kYXRhIHsKKwkvKiBFeHRlcm5hbCBWcmVmIHZvbHRhZ2UgYXBwbGllZCAqLworCXUxNgkJCQl2cmVmX212OworCS8qCisJICogQUQ3ODg3OgorCSAqIEluIHNpbmdsZSBjaGFubmVsIG1vZGUgZW5fZHVhbCA9IGZsYXNlLCBBSU4xL1ZyZWYgcGlucyBhc3N1bWVzIGl0cworCSAqIFZyZWYgZnVuY3Rpb24uIEluIGR1YWwgY2hhbm5lbCBtb2RlIGVuX2R1YWwgPSB0cnVlLCBBSU4xIGJlY29tZXMgdGhlCisJICogc2Vjb25kIGlucHV0IGNoYW5uZWwsIGFuZCBWcmVmIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIFZkZC4KKwkgKi8KKwlib29sCQkJCWVuX2R1YWw7CisJLyoKKwkgKiBBRDc4ODc6CisJICogdXNlX29uY2hpcF9yZWYgPSB0cnVlLCB0aGUgVnJlZiBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgMi41MDBWCisJICogVm9sdGFnZSByZWZlcmVuY2UuIElmIHVzZV9vbmNoaXBfcmVmID0gZmFsc2UsIHRoZSByZWZlcmVuY2Ugdm9sdGFnZQorCSAqIGlzIHN1cHBsaWVkIGJ5IEFJTjEvVnJlZgorCSAqLworCWJvb2wJCQkJdXNlX29uY2hpcF9yZWY7Cit9OworCitzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbyB7CisJdTgJCQkJYml0czsJCS8qIG51bWJlciBvZiBBREMgYml0cyAqLworCXU4CQkJCXN0b3JhZ2ViaXRzOwkvKiBudW1iZXIgb2YgYml0cyByZWFkIGZyb20gdGhlIEFEQyAqLworCXU4CQkJCWxlZnRfc2hpZnQ7CS8qIG51bWJlciBvZiBiaXRzIHRoZSBzYW1wbGUgbXVzdCBiZSBzaGlmdGVkICovCisJY2hhcgkJCQlzaWduOwkJLyogW3NdaWduZWQgb3IgW3VdbnNpZ25lZCAqLworCXUxNgkJCQlpbnRfdnJlZl9tdjsJLyogaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KK307CisKK3N0cnVjdCBhZDc4ODdfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwljb25zdCBzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbwkqY2hpcF9pbmZvOworCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CisJc3RydWN0IHdvcmtfc3RydWN0CQlwb2xsX3dvcms7CisJYXRvbWljX3QJCQlwcm90ZWN0X3Jpbmc7CisJdTE2CQkJCWludF92cmVmX212OworCWJvb2wJCQkJZW5fZHVhbDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQl4ZmVyWzRdOworCXN0cnVjdCBzcGlfbWVzc2FnZQkJbXNnWzNdOworCXN0cnVjdCBzcGlfbWVzc2FnZQkJKnJpbmdfbXNnOworCXVuc2lnbmVkIGNoYXIJCQl0eF9jbWRfYnVmWzhdOworCisJLyoKKwkgKiBETUEgKHRodXMgY2FjaGUgY29oZXJlbmN5IG1haW50ZW5hbmNlKSByZXF1aXJlcyB0aGUKKwkgKiB0cmFuc2ZlciBidWZmZXJzIHRvIGxpdmUgaW4gdGhlaXIgb3duIGNhY2hlIGxpbmVzLgorCSAqLworCisJdW5zaWduZWQgY2hhcgkJCWRhdGFbNF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworfTsKKworZW51bSBhZDc4ODdfc3VwcG9ydGVkX2RldmljZV9pZHMgeworCUlEX0FENzg4NworfTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzayk7CitpbnQgYWQ3ODg3X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkNzg4N19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCitzdGF0aWMgaW5saW5lIGludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkNzg4N19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDc4ODdfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIElJT19BRENfQUQ3ODg3X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU5MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIEFENzg4NyBTUEkgQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgImFkYy5oIgorCisjaW5jbHVkZSAiYWQ3ODg3LmgiCisKK3N0YXRpYyBpbnQgYWQ3ODg3X3NjYW5fZGlyZWN0KHN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0LCB1bnNpZ25lZCBjaCkKK3sKKwlpbnQgcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2dbY2hdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChzdC0+ZGF0YVsoY2ggKiAyKV0gPDwgOCkgfCBzdC0+ZGF0YVsoY2ggKiAyKSArIDFdOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc4ODdfc2NhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwlpZiAoaWlvX3JpbmdfZW5hYmxlZChkZXZfaW5mbykpCisJCXJldCA9IGFkNzg4N19zY2FuX2Zyb21fcmluZyhzdCwgMSA8PCB0aGlzX2F0dHItPmFkZHJlc3MpOworCWVsc2UKKwkJcmV0ID0gYWQ3ODg3X3NjYW5fZGlyZWN0KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MpOworCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChyZXQgPj4gc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCkgJgorCQkgICAgICAgUkVTX01BU0soc3QtPmNoaXBfaW5mby0+Yml0cykpOworfQorc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMCwgYWQ3ODg3X3NjYW4sIDApOworc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWQ3ODg3X3NjYW4sIDEpOworCitzdGF0aWMgc3NpemVfdCBhZDc4ODdfc2hvd19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCS8qIERyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0IGludGVybmFsIHZyZWYgKi8KKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCS8qIENvcnJlc3BvbmRzIHRvIFZyZWYgLyAyXihiaXRzKSAqLworCXVuc2lnbmVkIGludCBzY2FsZV91diA9IChzdC0+aW50X3ZyZWZfbXYgKiAxMDAwKSA+PiBzdC0+Y2hpcF9pbmZvLT5iaXRzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQuJWRcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fc2NhbGUsIFNfSVJVR08sIGFkNzg4N19zaG93X3NjYWxlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODg3X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzg4N19zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3ODg3X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBtb2RlX3QgYWQ3ODg3X2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCisJbW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOworCisJaWYgKChhdHRyID09ICZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyKSAmJiAhc3QtPmVuX2R1YWwpCisJCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4ODdfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzg4N19hdHRyaWJ1dGVzLAorCS5pc192aXNpYmxlID0gYWQ3ODg3X2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbyBhZDc4ODdfY2hpcF9pbmZvX3RibFtdID0geworCS8qCisJICogTW9yZSBkZXZpY2VzIGFkZGVkIGluIGZ1dHVyZQorCSAqLworCVtJRF9BRDc4ODddID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuc2lnbiA9IElJT19TQ0FOX0VMX1RZUEVfVU5TSUdORUQsCisJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzg4N19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0OworCWludCByZXQsIHZvbHRhZ2VfdXYgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlzdC0+cmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2Y2MiKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0LT5yZWcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9wdXRfcmVnOworCisJCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnJlZyk7CisJfQorCisJc3QtPmNoaXBfaW5mbyA9CisJCSZhZDc4ODdfY2hpcF9pbmZvX3RibFtzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YV07CisKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwlhdG9taWNfc2V0KCZzdC0+cHJvdGVjdF9yaW5nLCAwKTsKKwlzdC0+c3BpID0gc3BpOworCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisJfQorCisJLyogRXN0YWJpbGlzaCB0aGF0IHRoZSBpaW9fZGV2IGlzIGEgY2hpbGQgb2YgdGhlIHNwaSBkZXZpY2UgKi8KKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzg4N19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwkvKiBTZXR1cCBkZWZhdWx0IG1lc3NhZ2UgKi8KKworCXN0LT50eF9jbWRfYnVmWzBdID0gQUQ3ODg3X0NIX0FJTjAgfCBBRDc4ODdfUE1fTU9ERTQgfAorCQkJICAgICgocGRhdGEgJiYgcGRhdGEtPnVzZV9vbmNoaXBfcmVmKSA/CisJCQkgICAgMCA6IEFENzg4N19SRUZfRElTKTsKKworCXN0LT54ZmVyWzBdLnJ4X2J1ZiA9ICZzdC0+ZGF0YVswXTsKKwlzdC0+eGZlclswXS50eF9idWYgPSAmc3QtPnR4X2NtZF9idWZbMF07CisJc3QtPnhmZXJbMF0ubGVuID0gMjsKKworCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlclswXSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5lbl9kdWFsKSB7CisJCXN0LT50eF9jbWRfYnVmWzBdIHw9IEFENzg4N19EVUFMIHwgQUQ3ODg3X1JFRl9ESVM7CisKKwkJc3QtPnR4X2NtZF9idWZbMl0gPSBBRDc4ODdfQ0hfQUlOMSB8IEFENzg4N19EVUFMIHwKKwkJCQkgICAgQUQ3ODg3X1JFRl9ESVMgfCBBRDc4ODdfUE1fTU9ERTQ7CisJCXN0LT50eF9jbWRfYnVmWzRdID0gQUQ3ODg3X0NIX0FJTjAgfCBBRDc4ODdfRFVBTCB8CisJCQkJICAgIEFENzg4N19SRUZfRElTIHwgQUQ3ODg3X1BNX01PREU0OworCQlzdC0+dHhfY21kX2J1Zls2XSA9IEFENzg4N19DSF9BSU4xIHwgQUQ3ODg3X0RVQUwgfAorCQkJCSAgICBBRDc4ODdfUkVGX0RJUyB8IEFENzg4N19QTV9NT0RFNDsKKworCQlzdC0+eGZlclsxXS5yeF9idWYgPSAmc3QtPmRhdGFbMF07CisJCXN0LT54ZmVyWzFdLnR4X2J1ZiA9ICZzdC0+dHhfY21kX2J1ZlsyXTsKKwkJc3QtPnhmZXJbMV0ubGVuID0gMjsKKworCQlzdC0+eGZlclsyXS5yeF9idWYgPSAmc3QtPmRhdGFbMl07CisJCXN0LT54ZmVyWzJdLnR4X2J1ZiA9ICZzdC0+dHhfY21kX2J1Zls0XTsKKwkJc3QtPnhmZXJbMl0ubGVuID0gMjsKKworCQlzcGlfbWVzc2FnZV9pbml0KCZzdC0+bXNnW0FENzg4N19DSDBfQ0gxXSk7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlclsxXSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF9DSDFdKTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyWzJdLCAmc3QtPm1zZ1tBRDc4ODdfQ0gwX0NIMV0pOworCisJCXN0LT54ZmVyWzNdLnJ4X2J1ZiA9ICZzdC0+ZGF0YVswXTsKKwkJc3QtPnhmZXJbM10udHhfYnVmID0gJnN0LT50eF9jbWRfYnVmWzZdOworCQlzdC0+eGZlclszXS5sZW4gPSAyOworCisJCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2dbQUQ3ODg3X0NIMV0pOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXJbM10sICZzdC0+bXNnW0FENzg4N19DSDFdKTsKKworCQlzdC0+ZW5fZHVhbCA9IHRydWU7CisKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT52cmVmX212KQorCQkJc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CisJCWVsc2UgaWYgKHZvbHRhZ2VfdXYpCisJCQlzdC0+aW50X3ZyZWZfbXYgPSB2b2x0YWdlX3V2IC8gMTAwMDsKKwkJZWxzZQorCQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAicmVmZXJlbmNlIHZvbHRhZ2UgdW5zcGVjaWZpZWRcbiIpOworCisJfSBlbHNlIHsKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT52cmVmX212KQorCQkJc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CisJCWVsc2UgaWYgKHBkYXRhICYmIHBkYXRhLT51c2Vfb25jaGlwX3JlZikKKwkJCXN0LT5pbnRfdnJlZl9tdiA9IHN0LT5jaGlwX2luZm8tPmludF92cmVmX212OworCQllbHNlCisJCQlkZXZfd2Fybigmc3BpLT5kZXYsICJyZWZlcmVuY2Ugdm9sdGFnZSB1bnNwZWNpZmllZFxuIik7CisJfQorCisKKwlyZXQgPSBhZDc4ODdfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX3Jpbmc6CisJYWQ3ODg3X3JpbmdfY2xlYW51cChzdC0+aW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldmljZToKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CitlcnJvcl9wdXRfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzg4N19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CisJYWQ3ODg3X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCX0KKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDc4ODdfaWRbXSA9IHsKKwl7ImFkNzg4NyIsIElEX0FENzg4N30sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDc4ODdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkNzg4NyIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZDc4ODdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDc4ODdfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZDc4ODdfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDc4ODdfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDc4ODdfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkNzg4N19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkNzg4N19leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDc4ODdfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNzg4N19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3ODg3IEFEQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJzcGk6YWQ3ODg3Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjljYjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICoKKyAqIGFkNzg4N19yaW5nLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNpbmNsdWRlICJhZDc4ODcuaCIKKworc3RhdGljIElJT19TQ0FOX0VMX0MoaW4wLCAwLCAwLCBOVUxMKTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluMSwgMSwgMCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzg4N19zaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHJpbmctPmluZGlvX2RldjsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLyVkPj4lZFxuIiwgc3QtPmNoaXBfaW5mby0+c2lnbiwKKwkJICAgICAgIHN0LT5jaGlwX2luZm8tPmJpdHMsIHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzLAorCQkgICAgICAgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3R5cGUsIFNfSVJVR08sIGFkNzg4N19zaG93X3R5cGUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3ODg3X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbjEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBtb2RlX3QgYWQ3ODg3X3NjYW5fZWxfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcmluZy0+aW5kaW9fZGV2OworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmICgoYXR0ciA9PSAmaWlvX3NjYW5fZWxfaW4xLmRldl9hdHRyLmF0dHIpIHx8CisJCShhdHRyID09ICZpaW9fY29uc3RfYXR0cl9pbjFfaW5kZXguZGV2X2F0dHIuYXR0cikpCisJCWlmICghc3QtPmVuX2R1YWwpCisJCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4ODdfc2Nhbl9lbF9ncm91cCA9IHsKKwkubmFtZSA9ICJzY2FuX2VsZW1lbnRzIiwKKwkuYXR0cnMgPSBhZDc4ODdfc2Nhbl9lbF9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGFkNzg4N19zY2FuX2VsX2F0dHJfaXNfdmlzaWJsZSwKK307CisKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gc3QtPmluZGlvX2Rldi0+cmluZzsKKwlpbnQgY291bnQgPSAwLCByZXQ7CisJdTE2ICpyaW5nX2RhdGE7CisKKwlpZiAoIShyaW5nLT5zY2FuX21hc2sgJiBtYXNrKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXJpbmdfZGF0YSA9IGttYWxsb2MocmluZy0+YWNjZXNzLmdldF9ieXRlc19wZXJfZGF0dW0ocmluZyksIEdGUF9LRVJORUwpOworCWlmIChyaW5nX2RhdGEgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gcmluZy0+YWNjZXNzLnJlYWRfbGFzdChyaW5nLCAodTggKikgcmluZ19kYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfcmluZ19kYXRhOworCisJLyogZm9yIHNpbmdsZSBjaGFubmVsIHNjYW4gdGhlIHJlc3VsdCBpcyBzdG9yZWQgd2l0aCB6ZXJvIG9mZnNldCAqLworCWlmICgocmluZy0+c2Nhbl9tYXNrID09ICgoMSA8PCAxKSB8ICgxIDw8IDApKSkgJiYgKG1hc2sgPT0gKDEgPDwgMSkpKQorCQljb3VudCA9IDE7CisKKwlyZXQgPSBiZTE2X3RvX2NwdShyaW5nX2RhdGFbY291bnRdKTsKKworZXJyb3JfZnJlZV9yaW5nX2RhdGE6CisJa2ZyZWUocmluZ19kYXRhKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkNzg4N19yaW5nX3ByZWVuYWJsZSgpIHNldHVwIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByaW5nIGJlZm9yZSBlbmFibGluZworICoKKyAqIFRoZSBjb21wbGV4IG5hdHVyZSBvZiB0aGUgc2V0dGluZyBvZiB0aGUgbnViZXIgb2YgYnl0ZXMgcGVyIGRhdHVtIGlzIGR1ZQorICogdG8gdGhpcyBkcml2ZXIgY3VycmVudGx5IGVuc3VyaW5nIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyBzdG9yZWQgYXQgYW4gOAorICogYnl0ZSBib3VuZGFyeS4KKyAqKi8KK3N0YXRpYyBpbnQgYWQ3ODg3X3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc2l6ZV90IGRfc2l6ZTsKKworCWlmIChpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnl0ZXNfcGVyX2RhdHVtKSB7CisJCWRfc2l6ZSA9IHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzIC8gOCArIHNpemVvZihzNjQpOworCQlpZiAoZF9zaXplICUgOCkKKwkJCWRfc2l6ZSArPSA4IC0gKGRfc2l6ZSAlIDgpOworCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnl0ZXNfcGVyX2RhdHVtKGluZGlvX2Rldi0+cmluZywKKwkJCQkJCQkgICAgZF9zaXplKTsKKwl9CisKKwlzd2l0Y2ggKHJpbmctPnNjYW5fbWFzaykgeworCWNhc2UgKDEgPDwgMCk6CisJCXN0LT5yaW5nX21zZyA9ICZzdC0+bXNnW0FENzg4N19DSDBdOworCQlicmVhazsKKwljYXNlICgxIDw8IDEpOgorCQlzdC0+cmluZ19tc2cgPSAmc3QtPm1zZ1tBRDc4ODdfQ0gxXTsKKwkJLyogRHVtbXkgcmVhZDogcHVzaCBDSDEgc2V0dGluZyBkb3duIHRvIGhhcmR3YXJlICovCisJCXNwaV9zeW5jKHN0LT5zcGksIHN0LT5yaW5nX21zZyk7CisJCWJyZWFrOworCWNhc2UgKCgxIDw8IDEpIHwgKDEgPDwgMCkpOgorCQlzdC0+cmluZ19tc2cgPSAmc3QtPm1zZ1tBRDc4ODdfQ0gwX0NIMV07CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzg4N19yaW5nX3Bvc3RkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJLyogZHVtbXkgcmVhZDogcmVzdG9yZSBkZWZhdWx0IENIMCBzZXR0aW4gKi8KKwlyZXR1cm4gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworfQorCisvKioKKyAqIGFkNzg4N19wb2xsX2Z1bmNfdGgoKSB0aCBvZiB0cmlnZ2VyIGxhdW5jaGVkIHBvbGxpbmcgdG8gcmluZyBidWZmZXIKKyAqCisgKiBBcyBzYW1wbGluZyBvbmx5IG9jY3VycyBvbiBzcGkgY29tbXMgb2NjdXJpbmcsIGxlYXZlIHRpbWVzdGFtcGluZyB1bnRpbAorICogdGhlbi4gIFNvbWUgdHJpZ2dlcnMgd2lsbCBnZW5lcmF0ZSB0aGVpciBvd24gdGltZSBzdGFtcC4gIEN1cnJlbnRseQorICogdGhlcmUgaXMgbm8gd2F5IG9mIG5vdGlmeWluZyB0aGVtIHdoZW4gbm8gb25lIGNhcmVzLgorICoqLworc3RhdGljIHZvaWQgYWQ3ODg3X3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZzdC0+cG9sbF93b3JrKTsKKwlyZXR1cm47Cit9CisvKioKKyAqIGFkNzg4N19wb2xsX2JoX3RvX3JpbmcoKSBiaCBvZiB0cmlnZ2VyIGxhdW5jaGVkIHBvbGxpbmcgdG8gcmluZyBidWZmZXIKKyAqIEB3b3JrX3M6CXRoZSB3b3JrIHN0cnVjdCB0aHJvdWdoIHdoaWNoIHRoaXMgd2FzIHNjaGVkdWxlZAorICoKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvcHRpb24gaW4gdGhpcyBkcml2ZXIgdG8gZGlzYWJsZSB0aGUgc2F2aW5nIG9mCisgKiB0aW1lc3RhbXBzIHdpdGhpbiB0aGUgcmluZy4KKyAqIEkgdGhpbmsgdGhlIG9uZSBjb3B5IG9mIHRoaXMgYXQgYSB0aW1lIHdhcyB0byBhdm9pZCBwcm9ibGVtcyBpZiB0aGUKKyAqIHRyaWdnZXIgd2FzIHNldCBmYXIgdG9vIGhpZ2ggYW5kIHRoZSByZWFkcyB0aGVuIGxvY2tlZCB1cCB0aGUgY29tcHV0ZXIuCisgKiovCitzdGF0aWMgdm9pZCBhZDc4ODdfcG9sbF9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzg4N19zdGF0ZSwKKwkJCQkJCSAgcG9sbF93b3JrKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfYnVmZmVyICpzd19yaW5nID0gaWlvX3RvX3N3X3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXM2NCB0aW1lX25zOworCV9fdTggKmJ1ZjsKKwlpbnQgYl9zZW50OworCXNpemVfdCBkX3NpemU7CisKKwl1bnNpZ25lZCBpbnQgYnl0ZXMgPSByaW5nLT5zY2FuX2NvdW50ICogc3QtPmNoaXBfaW5mby0+c3RvcmFnZWJpdHMgLyA4OworCisJLyogRW5zdXJlIHRoZSB0aW1lc3RhbXAgaXMgOCBieXRlIGFsaWduZWQgKi8KKwlkX3NpemUgPSBieXRlcyArIHNpemVvZihzNjQpOworCWlmIChkX3NpemUgJSBzaXplb2YoczY0KSkKKwkJZF9zaXplICs9IHNpemVvZihzNjQpIC0gKGRfc2l6ZSAlIHNpemVvZihzNjQpKTsKKworCS8qIEVuc3VyZSBvbmx5IG9uZSBjb3B5IG9mIHRoaXMgZnVuY3Rpb24gcnVubmluZyBhdCBhIHRpbWUgKi8KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnN0LT5wcm90ZWN0X3JpbmcpID4gMSkKKwkJcmV0dXJuOworCisJYnVmID0ga3phbGxvYyhkX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJYl9zZW50ID0gc3BpX3N5bmMoc3QtPnNwaSwgc3QtPnJpbmdfbXNnKTsKKwlpZiAoYl9zZW50KQorCQlnb3RvIGRvbmU7CisKKwl0aW1lX25zID0gaWlvX2dldF90aW1lX25zKCk7CisKKwltZW1jcHkoYnVmLCBzdC0+ZGF0YSwgYnl0ZXMpOworCW1lbWNweShidWYgKyBkX3NpemUgLSBzaXplb2YoczY0KSwgJnRpbWVfbnMsIHNpemVvZih0aW1lX25zKSk7CisKKwlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zdG9yZV90bygmc3dfcmluZy0+YnVmLCBidWYsIHRpbWVfbnMpOworZG9uZToKKwlrZnJlZShidWYpOworCWF0b21pY19kZWMoJnN0LT5wcm90ZWN0X3JpbmcpOworfQorCitpbnQgYWQ3ODg3X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCWluZGlvX2Rldi0+cmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghaW5kaW9fZGV2LT5yaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJmluZGlvX2Rldi0+cmluZy0+YWNjZXNzKTsKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWQ3ODg3X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOworCisJLyogUmluZyBidWZmZXIgZnVuY3Rpb25zIC0gaGVyZSB0cmlnZ2VyIHNldHVwIHJlbGF0ZWQgKi8KKworCWluZGlvX2Rldi0+cmluZy0+cHJlZW5hYmxlID0gJmFkNzg4N19yaW5nX3ByZWVuYWJsZTsKKwlpbmRpb19kZXYtPnJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOworCWluZGlvX2Rldi0+cmluZy0+cG9zdGRpc2FibGUgPSAmYWQ3ODg3X3JpbmdfcG9zdGRpc2FibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5zY2FuX2VsX2F0dHJzID0gJmFkNzg4N19zY2FuX2VsX2dyb3VwOworCisJSU5JVF9XT1JLKCZzdC0+cG9sbF93b3JrLCAmYWQ3ODg3X3BvbGxfYmhfdG9fcmluZyk7CisKKwkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlyZXR1cm4gMDsKK2Vycm9yX2RlYWxsb2NhdGVfc3dfcmI6CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFkNzg4N19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLworCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKKwkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7CisJCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKKwkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7CisJfQorCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxYTQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDczMTAuYwpAQCAtMCwwICsxLDk1MiBAQAorLyoKKyAqIEFEVDczMTAgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzMxMAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFEVDczMTAgcmVnaXN0ZXJzIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIEFEVDczMTBfU1RBVFVTCQkJMAorI2RlZmluZSBBRFQ3MzEwX0NPTkZJRwkJCTEKKyNkZWZpbmUgQURUNzMxMF9URU1QRVJBVFVSRQkJMgorI2RlZmluZSBBRFQ3MzEwX0lECQkJMworI2RlZmluZSBBRFQ3MzEwX1RfQ1JJVAkJCTQKKyNkZWZpbmUgQURUNzMxMF9UX0hZU1QJCQk1CisjZGVmaW5lIEFEVDczMTBfVF9BTEFSTV9ISUdICQk2CisjZGVmaW5lIEFEVDczMTBfVF9BTEFSTV9MT1cJCTcKKworLyoKKyAqIEFEVDczMTAgc3RhdHVzCisgKi8KKyNkZWZpbmUgQURUNzMxMF9TVEFUX1RfTE9XCQkweDEwCisjZGVmaW5lIEFEVDczMTBfU1RBVF9UX0hJR0gJCTB4MjAKKyNkZWZpbmUgQURUNzMxMF9TVEFUX1RfQ1JJVAkJMHg0MAorI2RlZmluZSBBRFQ3MzEwX1NUQVRfTk9UX1JEWQkJMHg4MAorCisvKgorICogQURUNzMxMCBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3MzEwX0ZBVUxUX1FVRVVFX01BU0sJMHgzCisjZGVmaW5lIEFEVDczMTBfQ1RfUE9MQVJJVFkJCTB4NAorI2RlZmluZSBBRFQ3MzEwX0lOVF9QT0xBUklUWQkJMHg4CisjZGVmaW5lIEFEVDczMTBfRVZFTlRfTU9ERQkJMHgxMAorI2RlZmluZSBBRFQ3MzEwX01PREVfTUFTSwkJMHg2MAorI2RlZmluZSBBRFQ3MzEwX09ORVNIT1QJCQkweDIwCisjZGVmaW5lIEFEVDczMTBfU1BTCQkJMHg0MAorI2RlZmluZSBBRFQ3MzEwX1BECQkJMHg2MAorI2RlZmluZSBBRFQ3MzEwX1JFU09MVVRJT04JCTB4ODAKKworLyoKKyAqIEFEVDczMTAgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3MzEwX1QxNl9WQUxVRV9TSUdOCQkJMHg4MDAwCisjZGVmaW5lIEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVAkJNworI2RlZmluZSBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLCQkweDdGCisjZGVmaW5lIEFEVDczMTBfVDEzX1ZBTFVFX1NJR04JCQkweDEwMDAKKyNkZWZpbmUgQURUNzMxMF9UMTNfVkFMVUVfT0ZGU0VUCQkzCisjZGVmaW5lIEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVAkJNAorI2RlZmluZSBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLCQkweEYKKyNkZWZpbmUgQURUNzMxMF9UX0hZU1RfTUFTSwkJCTB4RgorI2RlZmluZSBBRFQ3MzEwX0RFVklDRV9JRF9NQVNLCQkJMHg3CisjZGVmaW5lIEFEVDczMTBfTUFOVUZBQ1RPUllfSURfTUFTSwkJMHhGOAorI2RlZmluZSBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX09GRlNFVAkJMworCisKKyNkZWZpbmUgQURUNzMxMF9DTURfUkVHX01BU0sJCQkweDI4CisjZGVmaW5lIEFEVDczMTBfQ01EX1JFR19PRkZTRVQJCQkzCisjZGVmaW5lIEFEVDczMTBfQ01EX1JFQUQJCQkweDQwCisjZGVmaW5lIEFEVDczMTBfQ01EX0NPTl9SRUFECQkJMHg0CisKKyNkZWZpbmUgQURUNzMxMF9JUlFTCQkJCTIKKworLyoKKyAqIHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTggIGNvbmZpZzsKK307CisKKy8qCisgKiBhZHQ3MzEwIHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworCitzdGF0aWMgaW50IGFkdDczMTBfc3BpX3JlYWRfd29yZChzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwl1OCBjb21tYW5kID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWludCByZXQgPSAwOworCisJY29tbWFuZCB8PSBBRFQ3MzEwX0NNRF9SRUFEOworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAmY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgY29tbWFuZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3BpX3JlYWQoc3BpX2RldiwgKHU4ICopZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgd29yZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBiZTE2X3RvX2NwdSgqZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV93cml0ZV93b3JkKHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJdTggYnVmWzNdOworCWludCByZXQgPSAwOworCisJYnVmWzBdID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWJ1ZlsxXSA9ICh1OCkoZGF0YSA+PiA4KTsKKwlidWZbMl0gPSAodTgpKGRhdGEgJiAweEZGKTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCBidWYsIDMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSB3b3JkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCXU4IGNvbW1hbmQgPSAocmVnIDw8IEFEVDczMTBfQ01EX1JFR19PRkZTRVQpICYgQURUNzMxMF9DTURfUkVHX01BU0s7CisJaW50IHJldCA9IDA7CisKKwljb21tYW5kIHw9IEFEVDczMTBfQ01EX1JFQUQ7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZjb21tYW5kLCBzaXplb2YoY29tbWFuZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBjb21tYW5kIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgcmVhZCBieXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwl1OCBidWZbMl07CisJaW50IHJldCA9IDA7CisKKwlidWZbMF0gPSAocmVnIDw8IEFEVDczMTBfQ01EX1JFR19PRkZTRVQpICYgQURUNzMxMF9DTURfUkVHX01BU0s7CisJYnVmWzFdID0gZGF0YTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCBidWYsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBieXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfTU9ERV9NQVNLOworCisJc3dpdGNoIChjb25maWcpIHsKKwljYXNlIEFEVDczMTBfUEQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLWRvd25cbiIpOworCWNhc2UgQURUNzMxMF9PTkVTSE9UOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvbmUtc2hvdFxuIik7CisJY2FzZSBBRFQ3MzEwX1NQUzoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAic3BzXG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiAofkFEVDczMTBfTU9ERV9NQVNLKTsKKwlpZiAoc3RyY21wKGJ1ZiwgInBvd2VyLWRvd24iKSkKKwkJY29uZmlnIHw9IEFEVDczMTBfUEQ7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZiwgIm9uZS1zaG90IikpCisJCWNvbmZpZyB8PSBBRFQ3MzEwX09ORVNIT1Q7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZiwgInNwcyIpKQorCQljb25maWcgfD0gQURUNzMxMF9TUFM7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxMF9zaG93X21vZGUsCisJCWFkdDczMTBfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbm9uZS1zaG90XG5zcHNcbnBvd2VyLWRvd25cbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWR0NzMxMF9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwlpbnQgYml0czsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzMxMF9SRVNPTFVUSU9OKQorCQliaXRzID0gMTY7CisJZWxzZQorCQliaXRzID0gMTM7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBiaXRzXG4iLCBiaXRzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zdG9yZV9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiAofkFEVDczMTBfUkVTT0xVVElPTik7CisJaWYgKGRhdGEpCisJCWNvbmZpZyB8PSBBRFQ3MzEwX1JFU09MVVRJT047CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNvbHV0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxMF9zaG93X3Jlc29sdXRpb24sCisJCWFkdDczMTBfc3RvcmVfcmVzb2x1dGlvbiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9JRCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRldmljZSBpZDogMHgleFxubWFudWZhY3RvcnkgaWQ6IDB4JXhcbiIsCisJCQlpZCAmIEFEVDczMTBfREVWSUNFX0lEX01BU0ssCisJCQkoaWQgJiBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX01BU0spID4+IEFEVDczMTBfTUFOVUZBQ1RPUllfSURfT0ZGU0VUKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTBfc2hvd19pZCwKKwkJTlVMTCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfY29udmVydF90ZW1wZXJhdHVyZShzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsCisJCXUxNiBkYXRhLCBjaGFyICpidWYpCit7CisJY2hhciBzaWduID0gJyAnOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfUkVTT0xVVElPTikgeworCQlpZiAoZGF0YSAmIEFEVDczMTBfVDE2X1ZBTFVFX1NJR04pIHsKKwkJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJZGF0YSA9ICh1MTYpKChBRFQ3MzEwX1QxNl9WQUxVRV9TSUdOIDw8IDEpIC0gKHUzMilkYXRhKTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjdkXG4iLCBzaWduLAorCQkJCShkYXRhID4+IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCQkJKGRhdGEgJiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKSAqIDc4MTI1KTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSAmIEFEVDczMTBfVDEzX1ZBTFVFX1NJR04pIHsKKwkJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJZGF0YSA+Pj0gQURUNzMxMF9UMTNfVkFMVUVfT0ZGU0VUOworCQkJZGF0YSA9IChBRFQ3MzEwX1QxM19WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAorCQkJCShkYXRhID4+IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCQkJKGRhdGEgJiBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKSAqIDYyNSk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBzdGF0dXM7CisJdTE2IGRhdGE7CisJaW50IHJldCwgaSA9IDA7CisKKwlkbyB7CisJCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1NUQVRVUywgJnN0YXR1cyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKwkJaSsrOworCQlpZiAoaSA9PSAxMDAwMCkKKwkJCXJldHVybiAtRUlPOworCX0gd2hpbGUgKHN0YXR1cyAmIEFEVDczMTBfU1RBVF9OT1RfUkRZKTsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfd29yZChjaGlwLCBBRFQ3MzEwX1RFTVBFUkFUVVJFLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYWR0NzMxMF9jb252ZXJ0X3RlbXBlcmF0dXJlKGNoaXAsIGRhdGEsIGJ1Zik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmFsdWUsIFNfSVJVR08sIGFkdDczMTBfc2hvd192YWx1ZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkdDczMTBfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNvbHV0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzMxMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzMxMF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9BTEFSTSAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9CRUxMT1dfQUxBUk0gICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMSkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9DUklUICAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKworc3RhdGljIHZvaWQgYWR0NzMxMF9pbnRlcnJ1cHRfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTggc3RhdHVzOworCisJaWYgKGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1NUQVRVUywgJnN0YXR1cykpCisJCXJldHVybjsKKworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9ISUdIKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzEwX0FCT1ZFX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9MT1cpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTBfQkVMTE9XX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9DUklUKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzEwX0FCT1ZFX0NSSVQsCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxMF9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goYWR0NzMxMCwgJmFkdDczMTBfaW50ZXJydXB0KTsKK0lJT19FVkVOVF9TSChhZHQ3MzEwX2N0LCAmYWR0NzMxMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfRVZFTlRfTU9ERSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3NldF9ldmVudF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmPSB+QURUNzMxMF9FVkVOVF9NT0RFOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3MzEwX0VWRU5UX01PREU7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X2F2YWlsYWJsZV9ldmVudF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tcGFyYXRvclxuaW50ZXJydXB0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y29uZmlnICYgQURUNzMxMF9GQVVMVF9RVUVVRV9NQVNLKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zZXRfZmF1bHRfcXVldWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDczMTBfRkFVTFRfUVVFVUVfTUFTSzsKKwljb25maWcgfD0gZGF0YTsKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTBfc2hvd190X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF93b3JkKGNoaXAsIGJvdW5kX3JlZywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDczMTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisKKwkJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfUkVTT0xVVElPTikgeworCQkJaWYgKGxlbiA+IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNzgxMjUpICogNzgxMjU7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID4gQURUNzMxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUKQorCQkJCWxlbiA9IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJCXBvc1tsZW5dID0gMDsKKwkJCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOworCisJCQlpZiAoIXJldCkKKwkJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCQl9CisJfQorCisJaWYgKHRtcDEgPCAwKQorCQlkYXRhID0gKHUxNikoLXRtcDEpOworCWVsc2UKKwkJZGF0YSA9ICh1MTYpdG1wMTsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3MzEwX1JFU09MVVRJT04pIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzMxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAoQURUNzMxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCWRhdGEgPDw9IEFEVDczMTBfVDEzX1ZBTFVFX09GRlNFVDsKKwl9CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV93b3JkKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0FMQVJNX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2FsYXJtX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd190X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTBfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0FMQVJNX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0NSSVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9DUklULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd190X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXU4IHRfaHlzdDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1RfSFlTVCwgJnRfaHlzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdF9oeXN0ICYgQURUNzMxMF9UX0hZU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmIChyZXQgfHwgZGF0YSA+IEFEVDczMTBfVF9IWVNUX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJdF9oeXN0ID0gKHU4KWRhdGE7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfVF9IWVNULCB0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworSUlPX0VWRU5UX0FUVFJfU0goZXZlbnRfbW9kZSwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd19ldmVudF9tb2RlLCBhZHQ3MzEwX3NldF9ldmVudF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGF2YWlsYWJsZV9ldmVudF9tb2RlcywgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMsIE5VTEwsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfZmF1bHRfcXVldWUsIGFkdDczMTBfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfYWxhcm1faGlnaCwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2FsYXJtX2hpZ2gsIGFkdDczMTBfc2V0X3RfYWxhcm1faGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2xvdywgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2FsYXJtX2xvdywgYWR0NzMxMF9zZXRfdF9hbGFybV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9jcml0LCBpaW9fZXZlbnRfYWR0NzMxMF9jdCwKKwkJYWR0NzMxMF9zaG93X3RfY3JpdCwgYWR0NzMxMF9zZXRfdF9jcml0LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfaHlzdCwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2h5c3QsIGFkdDczMTBfc2V0X3RfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3MzEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2V2ZW50X21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYXZhaWxhYmxlX2V2ZW50X21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfYWxhcm1faGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTBfZXZlbnRfY3RfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwW0FEVDczMTBfSVJRU10gPSB7CisJeworCQkuYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzLAorCX0sCisJeworCQkuYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2N0X2F0dHJpYnV0ZXMsCisJfQorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzMxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyAqYWR0NzMxMF9wbGF0Zm9ybV9kYXRhID0gc3BpX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaV9kZXYtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDczMTBfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IEFEVDczMTBfSVJRUzsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCS8qIENUIGNyaXRjYWwgdGVtcGVyYXR1cmUgZXZlbnQuIGxpbmUgMCAqLworCWlmIChzcGlfZGV2LT5pcnEpIHsKKwkJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVsyXSkKKwkJCWlycV9mbGFncyA9IGFkdDczMTBfcGxhdGZvcm1fZGF0YVsyXTsKKwkJZWxzZQorCQkJaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX0xPVzsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaV9kZXYtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlpcnFfZmxhZ3MsCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2RldjsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkdDczMTAuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogT25lIGV2ZW50IGhhbmRsZXIgY2FuIG9ubHkgYmUgYWRkZWQgdG8gb25lIGV2ZW50IGxpc3QuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3MzEwLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKworCS8qIElOVCBib3VuZCB0ZW1wZXJhdHVyZSBhbGFybSBldmVudC4gbGluZSAxICovCisJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVswXSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoYWR0NzMxMF9wbGF0Zm9ybV9kYXRhWzBdLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkxLAorCQkJCWFkdDczMTBfcGxhdGZvcm1fZGF0YVsxXSwKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfY3RfaXJxOworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWR0NzMxMC4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBPbmUgZXZlbnQgaGFuZGxlciBjYW4gb25seSBiZSBhZGRlZCB0byBvbmUgZXZlbnQgbGlzdC4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkdDczMTBfY3QsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1sxXS0+ZXZfbGlzdCk7CisJfQorCisJaWYgKHNwaV9kZXYtPmlycSAmJiBhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzMxMF9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKworCQkvKiBzZXQgaXJxIHBvbGFyaXR5IGxvdyBsZXZlbCAqLworCQljaGlwLT5jb25maWcgJj0gfkFEVDczMTBfQ1RfUE9MQVJJVFk7CisKKwkJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVsxXSAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJY2hpcC0+Y29uZmlnIHw9IEFEVDczMTBfSU5UX1BPTEFSSVRZOworCQllbHNlCisJCQljaGlwLT5jb25maWcgJj0gfkFEVDczMTBfSU5UX1BPTEFSSVRZOworCisJCXJldCA9IGFkdDczMTBfc3BpX3dyaXRlX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsIGNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKwl9CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfaW50X2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDEpOworZXJyb3JfdW5yZWdfY3RfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCXVuc2lnbmVkIGxvbmcgKmFkdDczMTBfcGxhdGZvcm1fZGF0YSA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIE5VTEwpOworCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMSk7CisJaWYgKHNwaV9kZXYtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWR0NzMxMF9pZFtdID0geworCXsgImFkdDczMTAiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZHQ3MzEwX2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkdDczMTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDczMTAiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZHQ3MzEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3MzEwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWR0NzMxMF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDczMTBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzEwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3MzEwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkdDczMTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDczMTAgZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3MzEwX2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzMxMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ1ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzQxMC5jCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogQURUNzQxMCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3NDEwCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRFQ3NDEwIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRFQ3NDEwX1RFTVBFUkFUVVJFCQkwCisjZGVmaW5lIEFEVDc0MTBfU1RBVFVTCQkJMgorI2RlZmluZSBBRFQ3NDEwX0NPTkZJRwkJCTMKKyNkZWZpbmUgQURUNzQxMF9UX0FMQVJNX0hJR0gJCTQKKyNkZWZpbmUgQURUNzQxMF9UX0FMQVJNX0xPVwkJNgorI2RlZmluZSBBRFQ3NDEwX1RfQ1JJVAkJCTgKKyNkZWZpbmUgQURUNzQxMF9UX0hZU1QJCQkweEEKKyNkZWZpbmUgQURUNzQxMF9JRAkJCTB4QgorI2RlZmluZSBBRFQ3NDEwX1JFU0VUCQkJMHgyRgorCisvKgorICogQURUNzQxMCBzdGF0dXMKKyAqLworI2RlZmluZSBBRFQ3NDEwX1NUQVRfVF9MT1cJCTB4MTAKKyNkZWZpbmUgQURUNzQxMF9TVEFUX1RfSElHSAkJMHgyMAorI2RlZmluZSBBRFQ3NDEwX1NUQVRfVF9DUklUCQkweDQwCisjZGVmaW5lIEFEVDc0MTBfU1RBVF9OT1RfUkRZCQkweDgwCisKKy8qCisgKiBBRFQ3NDEwIGNvbmZpZworICovCisjZGVmaW5lIEFEVDc0MTBfRkFVTFRfUVVFVUVfTUFTSwkweDMKKyNkZWZpbmUgQURUNzQxMF9DVF9QT0xBUklUWQkJMHg0CisjZGVmaW5lIEFEVDc0MTBfSU5UX1BPTEFSSVRZCQkweDgKKyNkZWZpbmUgQURUNzQxMF9FVkVOVF9NT0RFCQkweDEwCisjZGVmaW5lIEFEVDc0MTBfTU9ERV9NQVNLCQkweDYwCisjZGVmaW5lIEFEVDc0MTBfT05FU0hPVAkJCTB4MjAKKyNkZWZpbmUgQURUNzQxMF9TUFMJCQkweDQwCisjZGVmaW5lIEFEVDc0MTBfUEQJCQkweDYwCisjZGVmaW5lIEFEVDc0MTBfUkVTT0xVVElPTgkJMHg4MAorCisvKgorICogQURUNzQxMCBtYXNrcworICovCisjZGVmaW5lIEFEVDc0MTBfVDE2X1ZBTFVFX1NJR04JCQkweDgwMDAKKyNkZWZpbmUgQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfT0ZGU0VUCQk3CisjZGVmaW5lIEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX01BU0sJCTB4N0YKKyNkZWZpbmUgQURUNzQxMF9UMTNfVkFMVUVfU0lHTgkJCTB4MTAwMAorI2RlZmluZSBBRFQ3NDEwX1QxM19WQUxVRV9PRkZTRVQJCTMKKyNkZWZpbmUgQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUCQk0CisjZGVmaW5lIEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX01BU0sJCTB4RgorI2RlZmluZSBBRFQ3NDEwX1RfSFlTVF9NQVNLCQkJMHhGCisjZGVmaW5lIEFEVDc0MTBfREVWSUNFX0lEX01BU0sJCQkweEYKKyNkZWZpbmUgQURUNzQxMF9NQU5VRkFDVE9SWV9JRF9NQVNLCQkweEYwCisjZGVmaW5lIEFEVDc0MTBfTUFOVUZBQ1RPUllfSURfT0ZGU0VUCQk0CisKKyNkZWZpbmUgQURUNzQxMF9JUlFTCQkJCTIKKworLyoKKyAqIHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHRocmVzaF93b3JrOworCXM2NCBsYXN0X3RpbWVzdGFtcDsKKwl1OCAgY29uZmlnOworfTsKKworLyoKKyAqIGFkdDc0MTAgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfcmVhZF93b3JkKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBzd2FiMTYoKHUxNilyZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfd3JpdGVfd29yZChzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNihkYXRhKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfcmVhZF9ieXRlKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YSA9ICh1OClyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWc7CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiBBRFQ3NDEwX01PREVfTUFTSzsKKworCXN3aXRjaCAoY29uZmlnKSB7CisJY2FzZSBBRFQ3NDEwX1BEOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1kb3duXG4iKTsKKwljYXNlIEFEVDc0MTBfT05FU0hPVDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib25lLXNob3RcbiIpOworCWNhc2UgQURUNzQxMF9TUFM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNwc1xuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3NDEwX01PREVfTUFTSyk7CisJaWYgKHN0cmNtcChidWYsICJwb3dlci1kb3duIikpCisJCWNvbmZpZyB8PSBBRFQ3NDEwX1BEOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJvbmUtc2hvdCIpKQorCQljb25maWcgfD0gQURUNzQxMF9PTkVTSE9UOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJzcHMiKSkKKwkJY29uZmlnIHw9IEFEVDc0MTBfU1BTOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDc0MTBfc2hvd19tb2RlLAorCQlhZHQ3NDEwX3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5vbmUtc2hvdFxuc3BzXG5wb3dlci1kb3duXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkdDc0MTBfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJaW50IGJpdHM7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfUkVTT0xVVElPTikKKwkJYml0cyA9IDE2OworCWVsc2UKKwkJYml0cyA9IDEzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQgYml0c1xuIiwgYml0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc3RvcmVfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3NDEwX1JFU09MVVRJT04pOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzQxMF9SRVNPTFVUSU9OOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzb2x1dGlvbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDc0MTBfc2hvd19yZXNvbHV0aW9uLAorCQlhZHQ3NDEwX3N0b3JlX3Jlc29sdXRpb24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfSUQsICZpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJkZXZpY2UgaWQ6IDB4JXhcbm1hbnVmYWN0b3J5IGlkOiAweCV4XG4iLAorCQkJaWQgJiBBRFQ3NDEwX0RFVklDRV9JRF9NQVNLLAorCQkJKGlkICYgQURUNzQxMF9NQU5VRkFDVE9SWV9JRF9NQVNLKSA+PiBBRFQ3NDEwX01BTlVGQUNUT1JZX0lEX09GRlNFVCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NDEwX3Nob3dfaWQsCisJCU5VTEwsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwLAorCQl1MTYgZGF0YSwgY2hhciAqYnVmKQoreworCWNoYXIgc2lnbiA9ICcgJzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pIHsKKwkJaWYgKGRhdGEgJiBBRFQ3NDEwX1QxNl9WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzQxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS43ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSykgKiA3ODEyNSk7CisJfSBlbHNlIHsKKwkJaWYgKGRhdGEgJiBBRFQ3NDEwX1QxM19WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPj49IEFEVDc0MTBfVDEzX1ZBTFVFX09GRlNFVDsKKwkJCWRhdGEgPSAoQURUNzQxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS40ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSykgKiA2MjUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggc3RhdHVzOworCXUxNiBkYXRhOworCWludCByZXQsIGkgPSAwOworCisJZG8geworCQlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJCWkrKzsKKwkJaWYgKGkgPT0gMTAwMDApCisJCQlyZXR1cm4gLUVJTzsKKwl9IHdoaWxlIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfTk9UX1JEWSk7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX3dvcmQoY2hpcCwgQURUNzQxMF9URU1QRVJBVFVSRSwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDc0MTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZHQ3NDEwX3Nob3dfdmFsdWUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZHQ3NDEwX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzb2x1dGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0MTBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc0MTBfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQUJPVkVfQUxBUk0gICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQkVMTE9XX0FMQVJNICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQUJPVkVfQ1JJVCAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisKK3N0YXRpYyB2b2lkIGFkdDc0MTBfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IHN0YXR1czsKKworCWlmIChhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9TVEFUVVMsICZzdGF0dXMpKQorCQlyZXR1cm47CisKKwllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9ISUdIKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9MT1cpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDc0MTBfQkVMTE9XX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9DUklUKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0NSSVQsCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goYWR0NzQxMCwgJmFkdDc0MTBfaW50ZXJydXB0KTsKK0lJT19FVkVOVF9TSChhZHQ3NDEwX2N0LCAmYWR0NzQxMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfRVZFTlRfTU9ERSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3NldF9ldmVudF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmPSB+QURUNzQxMF9FVkVOVF9NT0RFOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3NDEwX0VWRU5UX01PREU7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2F2YWlsYWJsZV9ldmVudF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tcGFyYXRvclxuaW50ZXJydXB0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y29uZmlnICYgQURUNzQxMF9GQVVMVF9RVUVVRV9NQVNLKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zZXRfZmF1bHRfcXVldWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc0MTBfRkFVTFRfUVVFVUVfTUFTSzsKKwljb25maWcgfD0gZGF0YTsKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF93b3JkKGNoaXAsIGJvdW5kX3JlZywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDc0MTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisKKwkJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfUkVTT0xVVElPTikgeworCQkJaWYgKGxlbiA+IEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNzgxMjUpICogNzgxMjU7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID4gQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUKQorCQkJCWxlbiA9IEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJCXBvc1tsZW5dID0gMDsKKwkJCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOworCisJCQlpZiAoIXJldCkKKwkJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCQl9CisJfQorCisJaWYgKHRtcDEgPCAwKQorCQlkYXRhID0gKHUxNikoLXRtcDEpOworCWVsc2UKKwkJZGF0YSA9ICh1MTYpdG1wMTsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzQxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAoQURUNzQxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCWRhdGEgPDw9IEFEVDc0MTBfVDEzX1ZBTFVFX09GRlNFVDsKKwl9CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV93b3JkKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0FMQVJNX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2FsYXJtX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3NDEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc0MTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDc0MTBfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0FMQVJNX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0NSSVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3NDEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9DUklULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXU4IHRfaHlzdDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX1RfSFlTVCwgJnRfaHlzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdF9oeXN0ICYgQURUNzQxMF9UX0hZU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmIChyZXQgfHwgZGF0YSA+IEFEVDc0MTBfVF9IWVNUX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJdF9oeXN0ID0gKHU4KWRhdGE7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfVF9IWVNULCB0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworSUlPX0VWRU5UX0FUVFJfU0goZXZlbnRfbW9kZSwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd19ldmVudF9tb2RlLCBhZHQ3NDEwX3NldF9ldmVudF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGF2YWlsYWJsZV9ldmVudF9tb2RlcywgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMsIE5VTEwsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfZmF1bHRfcXVldWUsIGFkdDc0MTBfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfYWxhcm1faGlnaCwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2FsYXJtX2hpZ2gsIGFkdDc0MTBfc2V0X3RfYWxhcm1faGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2xvdywgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2FsYXJtX2xvdywgYWR0NzQxMF9zZXRfdF9hbGFybV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9jcml0LCBpaW9fZXZlbnRfYWR0NzQxMF9jdCwKKwkJYWR0NzQxMF9zaG93X3RfY3JpdCwgYWR0NzQxMF9zZXRfdF9jcml0LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfaHlzdCwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2h5c3QsIGFkdDc0MTBfc2V0X3RfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2V2ZW50X21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYXZhaWxhYmxlX2V2ZW50X21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfYWxhcm1faGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc0MTBfZXZlbnRfY3RfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0MTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwW0FEVDc0MTBfSVJRU10gPSB7CisJeworCQkuYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzLAorCX0sCisJeworCQkuYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2N0X2F0dHJpYnV0ZXMsCisJfQorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzQxMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmFkdDc0MTBfcGxhdGZvcm1fZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWR0NzQxMF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9IGFkdDc0MTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gQURUNzQxMF9JUlFTOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJLyogQ1QgY3JpdGNhbCB0ZW1wZXJhdHVyZSBldmVudC4gbGluZSAwICovCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3NDEwLgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIE9uZSBldmVudCBoYW5kbGVyIGNhbiBvbmx5IGJlIGFkZGVkIHRvIG9uZSBldmVudCBsaXN0LgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWR0NzQxMCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwl9CisKKwkvKiBJTlQgYm91bmQgdGVtcGVyYXR1cmUgYWxhcm0gZXZlbnQuIGxpbmUgMSAqLworCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVswXSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMSwKKwkJCQlhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMV0sCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2N0X2lycTsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkdDc0MTAuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogT25lIGV2ZW50IGhhbmRsZXIgY2FuIG9ubHkgYmUgYWRkZWQgdG8gb25lIGV2ZW50IGxpc3QuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3NDEwX2N0LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMV0tPmV2X2xpc3QpOworCX0KKworCWlmIChjbGllbnQtPmlycSAmJiBhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzQxMF9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKworCQkvKiBzZXQgaXJxIHBvbGFyaXR5IGxvdyBsZXZlbCAqLworCQljaGlwLT5jb25maWcgJj0gfkFEVDc0MTBfQ1RfUE9MQVJJVFk7CisKKwkJaWYgKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVsxXSAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJY2hpcC0+Y29uZmlnIHw9IEFEVDc0MTBfSU5UX1BPTEFSSVRZOworCQllbHNlCisJCQljaGlwLT5jb25maWcgJj0gfkFEVDc0MTBfSU5UX1BPTEFSSVRZOworCisJCXJldCA9IGFkdDc0MTBfaTJjX3dyaXRlX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsIGNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVnaXN0ZXJlZC5cbiIsCisJCQkgaWQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2ludF9pcnE6CisJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+aW5kaW9fZGV2LCAxKTsKK2Vycm9yX3VucmVnX2N0X2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3NDEwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisJdW5zaWduZWQgbG9uZyAqYWR0NzQxMF9wbGF0Zm9ybV9kYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMSk7CisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHQ3NDEwX2lkW10gPSB7CisJeyAiYWR0NzQxMCIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDc0MTBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWR0NzQxMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWR0NzQxMCIsCisJfSwKKwkucHJvYmUgPSBhZHQ3NDEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3NDEwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWR0NzQxMF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDc0MTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWR0NzQxMF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWR0NzQxMF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkdDc0MTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDc0MTAgZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3NDEwX2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzQxMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc1LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjRkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogQURUNzUgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFEVDc1IHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRFQ3NV9URU1QRVJBVFVSRQkJMAorI2RlZmluZSBBRFQ3NV9DT05GSUcJCQkxCisjZGVmaW5lIEFEVDc1X1RfSFlTVAkJCTIKKyNkZWZpbmUgQURUNzVfVF9PUwkJCTMKKyNkZWZpbmUgQURUNzVfT05FU0hPVAkJCTQKKworLyoKKyAqIEFEVDc1IGNvbmZpZworICovCisjZGVmaW5lIEFEVDc1X1BECQkJMHgxCisjZGVmaW5lIEFEVDc1X09TX0lOVAkJCTB4MgorI2RlZmluZSBBRFQ3NV9PU19QT0xBUklUWQkJMHg0CisjZGVmaW5lIEFEVDc1X0ZBVUxUX1FVRVVFX01BU0sJCTB4MTgKKyNkZWZpbmUgQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUCTMKKyNkZWZpbmUgQURUNzVfU01CVVNfQUxBUlQJCTB4OAorCisvKgorICogQURUNzUgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3NV9WQUxVRV9TSUdOCQkweDgwMAorI2RlZmluZSBBRFQ3NV9WQUxVRV9PRkZTRVQJCTQKKyNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUCTQKKyNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfTUFTSwkJMHhGCisKKworLyoKKyAqIHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXU4ICBjb25maWc7Cit9OworCisvKgorICogYWR0NzUgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWR0NzVfaTJjX3JlYWQoc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwLCBsZW47CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCByZWdpc3RlciBhZGRyZXNzIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVnID09IEFEVDc1X0NPTkZJRyB8fCByZWcgPT0gQURUNzVfT05FU0hPVCkKKwkJbGVuID0gMTsKKwllbHNlCisJCWxlbiA9IDI7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzVfaTJjX3dyaXRlKHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJaWYgKHJlZyA9PSBBRFQ3NV9DT05GSUcgfHwgcmVnID09IEFEVDc1X09ORVNIT1QpCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEpOworCWVsc2UKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgZGF0YSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1BEKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1zYXZlXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9QRDsKKwlpZiAoIXN0cmNtcChidWYsICJmdWxsIikpCisJCWNvbmZpZyB8PSBBRFQ3NV9QRDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NV9zaG93X21vZGUsCisJCWFkdDc1X3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxucG93ZXItZG93blxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZHQ3NV9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfb25lc2hvdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWcgJiBBRFQ3NV9PTkVTSE9UKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3N0b3JlX29uZXNob3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKKwlpbnQgcmV0OworCXU4IGNvbmZpZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9PTkVTSE9UOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzVfT05FU0hPVDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG9uZXNob3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NV9zaG93X29uZXNob3QsCisJCWFkdDc1X3N0b3JlX29uZXNob3QsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1BEKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVhZCB2YWx1ZSBpbiBwb3dlci1kb3duIG1vZGUuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X09ORVNIT1QpIHsKKwkJLyogd3JpdGUgdG8gYWN0aXZlIGNvbnZlcnRlciAqLworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjaGlwLT5jbGllbnQsIEFEVDc1X09ORVNIT1QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfVEVNUEVSQVRVUkUsICh1OCAqKSZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPSBzd2FiMTYoZGF0YSkgPj4gQURUNzVfVkFMVUVfT0ZGU0VUOworCWlmIChkYXRhICYgQURUNzVfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRFQ3NV9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuNGRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFEVDc1X1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQURUNzVfVkFMVUVfRkxPQVRfTUFTSykgKiA2MjUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZHQ3NV9zaG93X3ZhbHVlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZHQ3NV9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzVfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vbmVzaG90LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzVfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1X09USSAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKworc3RhdGljIHZvaWQgYWR0NzVfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPQorCQljb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisKKwllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKworCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDc1X09USSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKK30KKworc3RhdGljIGludCBhZHQ3NV9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDc1LCAmYWR0NzVfaW50ZXJydXB0KTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19vdGlfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X09TX0lOVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zZXRfb3RpX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfT1NfSU5UOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3NV9PU19JTlQ7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19hdmFpbGFibGVfb3RpX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG5pbnRlcnJ1cHRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3NtYnVzX2FsYXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnICYgQURUNzVfU01CVVNfQUxBUlQpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X3NtYnVzX2FsYXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfU01CVVNfQUxBUlQ7CisJaWYgKGRhdGEpCisJCWNvbmZpZyB8PSBBRFQ3NV9TTUJVU19BTEFSVDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X0ZBVUxUX1FVRVVFX01BU0spID4+CisJCQkJQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCXU4IGNvbmZpZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHJldHJpdmUgQUxBUlQgc3RhdHVzICovCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9GQVVMVF9RVUVVRV9NQVNLOworCWNvbmZpZyB8PSAoZGF0YSA8PCBBRFQ3NV9GQVVMVF9RVUVVRV9PRkZTRVQpOworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgYm91bmRfcmVnLCAodTggKikmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID0gc3dhYjE2KGRhdGEpID4+IEFEVDc1X1ZBTFVFX09GRlNFVDsKKwlpZiAoZGF0YSAmIEFEVDc1X1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YSAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spICogNjI1KTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3NldF90X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisJCWlmIChsZW4gPiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpCisJCQlsZW4gPSBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCXBvc1tsZW5dID0gMDsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChwb3MsIDEwLCAmdG1wMik7CisKKwkJaWYgKCFyZXQpCisJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisJZGF0YSA9IChkYXRhIDw8IEFEVDc1X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfCAodG1wMiAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spOworCWlmICh0bXAxIDwgMCkKKwkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJZGF0YSA8PD0gQURUNzVfVkFMVUVfT0ZGU0VUOworCWRhdGEgPSBzd2FiMTYoZGF0YSk7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgYm91bmRfcmVnLCAodTgpZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3Rfb3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3NV9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9PUywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3NldF90X29zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzVfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9PUywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3RfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc1X3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NV9UX0hZU1QsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zZXRfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzVfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9IWVNULCBidWYsIGxlbik7Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKG90aV9tb2RlLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfb3RpX21vZGUsIGFkdDc1X3NldF9vdGlfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhdmFpbGFibGVfb3RpX21vZGVzLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfYXZhaWxhYmxlX290aV9tb2RlcywgTlVMTCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChzbWJ1c19hbGFydCwgaWlvX2V2ZW50X2FkdDc1LAorCQlhZHQ3NV9zaG93X3NtYnVzX2FsYXJ0LCBhZHQ3NV9zZXRfc21idXNfYWxhcnQsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd19mYXVsdF9xdWV1ZSwgYWR0NzVfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfb3MsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd190X29zLCBhZHQ3NV9zZXRfdF9vcywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2h5c3QsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd190X2h5c3QsIGFkdDc1X3NldF90X2h5c3QsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzVfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9vdGlfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9hdmFpbGFibGVfb3RpX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3NtYnVzX2FsYXJ0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Rfb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc1X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3NV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDc1X2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDc1X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkdDc1X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3NS4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBTbywgb25seSByZWdpc3RlciBldmVudCBoYW5kbGVyIG9uY2UuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3NSwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCQlJTklUX1dPUksoJmNoaXAtPnRocmVzaF93b3JrLCBhZHQ3NV9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwkJfQorCisJCS8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCisJCWNoaXAtPmNvbmZpZyAmPSB+QURUNzVfT1NfUE9MQVJJVFk7CisKKwkJcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGNoaXAsIEFEVDc1X0NPTkZJRywgY2hpcC0+Y29uZmlnKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3JfdW5yZWdfaXJxOworCQl9CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworZXJyb3JfdW5yZWdfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDc1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHQ3NV9pZFtdID0geworCXsgImFkdDc1IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWR0NzVfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWR0NzVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDc1IiwKKwl9LAorCS5wcm9iZSA9IGFkdDc1X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3NV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkdDc1X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWR0NzVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWR0NzVfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkdDc1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWR0NzVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDc1IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzVfaW5pdCk7Cittb2R1bGVfZXhpdChhZHQ3NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQ3YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQUREQUMgZHJpdmVycworIworY29tbWVudCAiQW5hbG9nIGRpZ2l0YWwgYmktZGlyZWN0aW9uIGNvbnZlcnRvcnMiCisKK2NvbmZpZyBBRFQ3MzE2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMgZHJpdmVyIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LCBBRFQ3MzE3LCBBRFQ3MzE4CisJICBhbmQgQURUNzUxNiwgQURUNzUxNywgQURUNzUxOSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBBREMgYW5kIERBQy4KKworY29uZmlnIEFEVDczMTZfU1BJCisJdHJpc3RhdGUgInN1cHBvcnQgU1BJIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gU1BJICYmIEFEVDczMTYKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgU1BJIGJ1cyBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOAorCSAgYW5kIEFEVDc1MTYvNy85LgorCitjb25maWcgQURUNzMxNl9JMkMKKwl0cmlzdGF0ZSAic3VwcG9ydCBJMkMgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBJMkMgJiYgQURUNzMxNgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBJMkMgYnVzIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84CisJICBhbmQgQURUNzUxNi83LzkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc2ODYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIEFEREFDIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0FEVDczMTYpICs9IGFkdDczMTYubworb2JqLSQoQ09ORklHX0FEVDczMTZfU1BJKSArPSBhZHQ3MzE2LXNwaS5vCitvYmotJChDT05GSUdfQURUNzMxNl9JMkMpICs9IGFkdDczMTYtaTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQxZWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LWkyYy5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogSTJDIGJ1cyBkcml2ZXIgZm9yIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUKKyAqIHNlbnNvciwgQURDIGFuZCBEQUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImFkdDczMTYuaCIKKworLyoKKyAqIGFkdDczMTYgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3JlYWQodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbCA9IGNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsLCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsLT5kZXYsICJJMkMgZmFpbCB0byBzZWxlY3QgcmVnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2wtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X2kyY193cml0ZSh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2wgPSBjbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsLCByZWcsIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9pMmNfbXVsdGlfcmVhZCh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggY291bnQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbCA9IGNsaWVudDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjb3VudCA+IEFEVDczMTZfUkVHX01BWF9BRERSKQorCQljb3VudCA9IEFEVDczMTZfUkVHX01BWF9BRERSOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gYWR0NzMxNl9pMmNfcmVhZChjbCwgcmVnLCAmZGF0YVtpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIG11bHRpIHJlYWQgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX211bHRpX3dyaXRlKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsID0gY2xpZW50OworCWludCBpLCByZXQgPSAwOworCisJaWYgKGNvdW50ID4gQURUNzMxNl9SRUdfTUFYX0FERFIpCisJCWNvdW50ID0gQURUNzMxNl9SRUdfTUFYX0FERFI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBhZHQ3MzE2X2kyY193cml0ZShjbCwgcmVnLCBkYXRhW2ldKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsLT5kZXYsICJJMkMgbXVsdGkgd3JpdGUgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHQ3MzE2X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkdDczMTZfYnVzIGJ1cyA9IHsKKwkJLmNsaWVudCA9IGNsaWVudCwKKwkJLmlycSA9IGNsaWVudC0+aXJxLAorCQkuaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX0xPVywKKwkJLnJlYWQgPSBhZHQ3MzE2X2kyY19yZWFkLAorCQkud3JpdGUgPSBhZHQ3MzE2X2kyY193cml0ZSwKKwkJLm11bHRpX3JlYWQgPSBhZHQ3MzE2X2kyY19tdWx0aV9yZWFkLAorCQkubXVsdGlfd3JpdGUgPSBhZHQ3MzE2X2kyY19tdWx0aV93cml0ZSwKKwl9OworCisJcmV0dXJuIGFkdDczMTZfcHJvYmUoJmNsaWVudC0+ZGV2LCAmYnVzLCBpZC0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTZfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZHQ3MzE2X3JlbW92ZSgmY2xpZW50LT5kZXYpOzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkdDczMTZfaTJjX2lkW10gPSB7CisJeyAiYWR0NzMxNiIsIDAgfSwKKwl7ICJhZHQ3MzE3IiwgMCB9LAorCXsgImFkdDczMTgiLCAwIH0sCisJeyAiYWR0NzUxNiIsIDAgfSwKKwl7ICJhZHQ3NTE3IiwgMCB9LAorCXsgImFkdDc1MTkiLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWR0NzMxNl9pMmNfaWQpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJcmV0dXJuIGFkdDczMTZfZGlzYWJsZSgmY2xpZW50LT5kZXYpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZHQ3MzE2X2VuYWJsZSgmY2xpZW50LT5kZXYpOworfQorI2Vsc2UKKyMgZGVmaW5lIGFkdDczMTZfaTJjX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYWR0NzMxNl9pMmNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDczMTZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDczMTYiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZHQ3MzE2X2kyY19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzMxNl9pMmNfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkdDczMTZfaTJjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFkdDczMTZfaTJjX3Jlc3VtZSwKKwkuaWRfdGFibGUgPSBhZHQ3MzE2X2kyY19pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDczMTZfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkdDczMTZfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkdDczMTZfaTJjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWR0NzMxNl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGJ1cyBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy85IGFuZCIKKwkJCSJBRFQ3NTE2LzcvOCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzMxNl9pMmNfaW5pdCk7Cittb2R1bGVfZXhpdChhZHQ3MzE2X2kyY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlkNGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LXNwaS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQVBJIGJ1cyBkcml2ZXIgZm9yIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUKKyAqIHNlbnNvciwgQURDIGFuZCBEQUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICJhZHQ3MzE2LmgiCisKKyNkZWZpbmUgQURUNzMxNl9TUElfTUFYX0ZSRVFfSFoJCTUwMDAwMDAKKyNkZWZpbmUgQURUNzMxNl9TUElfQ01EX1JFQUQJCTB4OTEKKyNkZWZpbmUgQURUNzMxNl9TUElfQ01EX1dSSVRFCQkweDkwCisKKy8qCisgKiBhZHQ3MzE2IHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX211bHRpX3JlYWQodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGNvdW50LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNsaWVudDsKKwl1OCBjbWRbMl07CisJaW50IHJldCA9IDA7CisKKwlpZiAoY291bnQgPiBBRFQ3MzE2X1JFR19NQVhfQUREUikKKwkJY291bnQgPSBBRFQ3MzE2X1JFR19NQVhfQUREUjsKKworCWNtZFswXSA9IEFEVDczMTZfU1BJX0NNRF9XUklURTsKKwljbWRbMV0gPSByZWc7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgY21kLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgZmFpbCB0byBzZWxlY3QgcmVnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWRbMF0gPSBBRFQ3MzE2X1NQSV9DTURfUkVBRDsKKworCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpX2RldiwgY21kLCAxLCBkYXRhLCBjb3VudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgZGF0YSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGNvdW50LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNsaWVudDsKKwl1OCBidWZbQURUNzMxNl9SRUdfTUFYX0FERFIgKyAyXTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjb3VudCA+IEFEVDczMTZfUkVHX01BWF9BRERSKQorCQljb3VudCA9IEFEVDczMTZfUkVHX01BWF9BRERSOworCisJYnVmWzBdID0gQURUNzMxNl9TUElfQ01EX1dSSVRFOworCWJ1ZlsxXSA9IHJlZzsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJYnVmW2kgKyAyXSA9IGRhdGFbaV07CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgYnVmLCBjb3VudCArIDIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X3NwaV9yZWFkKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlyZXR1cm4gYWR0NzMxNl9zcGlfbXVsdGlfcmVhZChjbGllbnQsIHJlZywgMSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfd3JpdGUodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlyZXR1cm4gYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUoY2xpZW50LCByZWcsIDEsICZ2YWwpOworfQorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHQ3MzE2X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWR0NzMxNl9idXMgYnVzID0geworCQkuY2xpZW50ID0gc3BpX2RldiwKKwkJLmlycSA9IHNwaV9kZXYtPmlycSwKKwkJLmlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1csCisJCS5yZWFkID0gYWR0NzMxNl9zcGlfcmVhZCwKKwkJLndyaXRlID0gYWR0NzMxNl9zcGlfd3JpdGUsCisJCS5tdWx0aV9yZWFkID0gYWR0NzMxNl9zcGlfbXVsdGlfcmVhZCwKKwkJLm11bHRpX3dyaXRlID0gYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUsCisJfTsKKworCS8qIGRvbid0IGV4Y2VlZCBtYXggc3BlY2lmaWVkIFNQSSBDTEsgZnJlcXVlbmN5ICovCisJaWYgKHNwaV9kZXYtPm1heF9zcGVlZF9oeiA+IEFEVDczMTZfU1BJX01BWF9GUkVRX0haKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBDTEsgJWQgSHo/XG4iLAorCQkJc3BpX2Rldi0+bWF4X3NwZWVkX2h6KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3dpdGNoIGZyb20gZGVmYXVsdCBJMkMgcHJvdG9jb2wgdG8gU1BJIHByb3RvY29sICovCisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisKKwlyZXR1cm4gYWR0NzMxNl9wcm9iZSgmc3BpX2Rldi0+ZGV2LCAmYnVzLCBzcGlfZGV2LT5tb2RhbGlhcyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTZfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlyZXR1cm4gYWR0NzMxNl9yZW1vdmUoJnNwaV9kZXYtPmRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZHQ3MzE2X3NwaV9pZFtdID0geworCXsgImFkdDczMTYiLCAwIH0sCisJeyAiYWR0NzMxNyIsIDAgfSwKKwl7ICJhZHQ3MzE4IiwgMCB9LAorCXsgImFkdDc1MTYiLCAwIH0sCisJeyAiYWR0NzUxNyIsIDAgfSwKKwl7ICJhZHQ3NTE5IiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkdDczMTZfc3BpX2lkKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZHQ3MzE2X3NwaV9zdXNwZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlyZXR1cm4gYWR0NzMxNl9kaXNhYmxlKCZzcGlfZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX3Jlc3VtZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlyZXR1cm4gYWR0NzMxNl9lbmFibGUoJnNwaV9kZXYtPmRldik7Cit9CisjZWxzZQorIyBkZWZpbmUgYWR0NzMxNl9zcGlfc3VzcGVuZCBOVUxMCisjIGRlZmluZSBhZHQ3MzE2X3NwaV9yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWR0NzMxNl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWR0NzMxNiIsCisJCS5idXMgPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkdDczMTZfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3MzE2X3NwaV9yZW1vdmUpLAorCS5zdXNwZW5kID0gYWR0NzMxNl9zcGlfc3VzcGVuZCwKKwkucmVzdW1lID0gYWR0NzMxNl9zcGlfcmVzdW1lLAorCS5pZF90YWJsZSA9IGFkdDczMTZfc3BpX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWR0NzMxNl9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzE2X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3MzE2X3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzE2X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgYnVzIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQURUNzMxNi83LzggYW5kIgorCQkJIkFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBBREMgYW5kIERBQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3MzE2X3NwaV9pbml0KTsKK21vZHVsZV9leGl0KGFkdDczMTZfc3BpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI1YjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKQEAgLTAsMCArMSwyNDAyIEBACisvKgorICogQURUNzMxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOQorICoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhZHQ3MzE2LmgiCisKKy8qCisgKiBBRFQ3MzE2IHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQURUNzMxNl9JTlRfU1RBVDEJCTB4MAorI2RlZmluZSBBRFQ3MzE2X0lOVF9TVEFUMgkJMHgxCisjZGVmaW5lIEFEVDczMTZfTFNCX0lOX1RFTVBfVkRECQkweDMKKyNkZWZpbmUgQURUNzMxNl9MU0JfSU5fVEVNUF9NQVNLCTB4MworI2RlZmluZSBBRFQ3MzE2X0xTQl9WRERfTUFTSwkJMHhDCisjZGVmaW5lIEFEVDczMTZfTFNCX1ZERF9PRkZTRVQJCTIKKyNkZWZpbmUgQURUNzMxNl9MU0JfRVhfVEVNUF9BSU4JCTB4NAorI2RlZmluZSBBRFQ3MzE2X0xTQl9FWF9URU1QX01BU0sJMHgzCisjZGVmaW5lIEFEVDc1MTZfTFNCX0FJTl9TSElGVAkJMgorI2RlZmluZSBBRFQ3MzE2X0FEX01TQl9EQVRBX0JBU0UgICAgICAgIDB4NgorI2RlZmluZSBBRFQ3MzE2X0FEX01TQl9EQVRBX1JFR1MgICAgICAgIDMKKyNkZWZpbmUgQURUNzUxNl9BRF9NU0JfREFUQV9SRUdTICAgICAgICA2CisjZGVmaW5lIEFEVDczMTZfTVNCX1ZERAkJCTB4NgorI2RlZmluZSBBRFQ3MzE2X01TQl9JTl9URU1QCQkweDcKKyNkZWZpbmUgQURUNzMxNl9NU0JfRVhfVEVNUAkJMHg4CisjZGVmaW5lIEFEVDc1MTZfTVNCX0FJTjEJCTB4OAorI2RlZmluZSBBRFQ3NTE2X01TQl9BSU4yCQkweDkKKyNkZWZpbmUgQURUNzUxNl9NU0JfQUlOMwkJMHhBCisjZGVmaW5lIEFEVDc1MTZfTVNCX0FJTjQJCTB4QgorI2RlZmluZSBBRFQ3MzE2X0RBX0RBVEFfQkFTRQkJMHgxMAorI2RlZmluZSBBRFQ3MzE2X0RBX01TQl9EQVRBX1JFR1MJNAorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQQkJMHgxMAorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQQkJMHgxMQorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQgkJMHgxMgorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQgkJMHgxMworI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQwkJMHgxNAorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQwkJMHgxNQorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfRAkJMHgxNgorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfRAkJMHgxNworI2RlZmluZSBBRFQ3MzE2X0NPTkZJRzEJCQkweDE4CisjZGVmaW5lIEFEVDczMTZfQ09ORklHMgkJCTB4MTkKKyNkZWZpbmUgQURUNzMxNl9DT05GSUczCQkJMHgxQQorI2RlZmluZSBBRFQ3MzE2X0xEQUNfQ09ORklHCQkweDFCCisjZGVmaW5lIEFEVDczMTZfREFDX0NPTkZJRwkJMHgxQworI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMQkJMHgxRAorI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMgkJMHgxRQorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfT0ZGU0VUCQkweDFGCisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQJCTB4MjAKKyNkZWZpbmUgQURUNzMxNl9JTl9BTkFMT0dfVEVNUF9PRkZTRVQJMHgyMQorI2RlZmluZSBBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVAkweDIyCisjZGVmaW5lIEFEVDczMTZfVkREX0hJR0gJCTB4MjMKKyNkZWZpbmUgQURUNzMxNl9WRERfTE9XCQkJMHgyNAorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfSElHSAkJMHgyNQorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfTE9XCQkweDI2CisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9ISUdICQkweDI3CisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9MT1cJCTB4MjgKKyNkZWZpbmUgQURUNzUxNl9BSU4yX0hJR0gJCTB4MkIKKyNkZWZpbmUgQURUNzUxNl9BSU4yX0xPVwkJMHgyQworI2RlZmluZSBBRFQ3NTE2X0FJTjNfSElHSAkJMHgyRAorI2RlZmluZSBBRFQ3NTE2X0FJTjNfTE9XCQkweDJFCisjZGVmaW5lIEFEVDc1MTZfQUlONF9ISUdICQkweDJGCisjZGVmaW5lIEFEVDc1MTZfQUlONF9MT1cJCTB4MzAKKyNkZWZpbmUgQURUNzMxNl9ERVZJQ0VfSUQJCTB4NEQKKyNkZWZpbmUgQURUNzMxNl9NQU5VRkFDVFVSRV9JRAkJMHg0RQorI2RlZmluZSBBRFQ3MzE2X0RFVklDRV9SRVYJCTB4NEYKKyNkZWZpbmUgQURUNzMxNl9TUElfTE9DS19TVEFUCQkweDdGCisKKy8qCisgKiBBRFQ3MzE2IGNvbmZpZzEKKyAqLworI2RlZmluZSBBRFQ3MzE2X0VOCQkJMHgxCisjZGVmaW5lIEFEVDc1MTZfU0VMX0VYX1RFTVAJCTB4NAorI2RlZmluZSBBRFQ3NTE2X1NFTF9BSU4xXzJfRVhfVEVNUF9NQVNLCTB4NgorI2RlZmluZSBBRFQ3NTE2X1NFTF9BSU4zCQkweDgKKyNkZWZpbmUgQURUNzMxNl9JTlRfRU4JCQkweDIwCisjZGVmaW5lIEFEVDczMTZfSU5UX1BPTEFSSVRZCQkweDQwCisjZGVmaW5lIEFEVDczMTZfUEQJCQkweDgwCisKKy8qCisgKiBBRFQ3MzE2IGNvbmZpZzIKKyAqLworI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NQVNLCTB4MworI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLCTB4NworI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9WREQJMAorI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTgkJMQorI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9FWAkJMgorI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU4xCTIKKyNkZWZpbmUgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMgkzCisjZGVmaW5lIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjMJNAorI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU40CTUKKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfTU9ERQkweDEwCisjZGVmaW5lIEFEVDczMTZfRElTQUJMRV9BVkVSQUdJTkcJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0VOX1NNQlVTX1RJTUVPVVQJMHg0MAorI2RlZmluZSBBRFQ3MzE2X1JFU0VUCQkJMHg4MAorCisvKgorICogQURUNzMxNiBjb25maWczCisgKi8KKyNkZWZpbmUgQURUNzMxNl9BRENMS18yMl81CQkweDEKKyNkZWZpbmUgQURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT04JMHgyCisjZGVmaW5lIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBCTB4NAorI2RlZmluZSBBRFQ3NTE2X0FJTl9JTl9WUkVGCQkweDEwCisjZGVmaW5lIEFEVDczMTZfRU5fSU5fVEVNUF9QUk9QX0RBQ0EJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0VOX0VYX1RFTVBfUFJPUF9EQUNCCTB4NDAKKworLyoKKyAqIEFEVDczMTYgREFDIGNvbmZpZworICovCisjZGVmaW5lIEFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSwkweEYKKyNkZWZpbmUgQURUNzMxNl9EQV9FTl9NT0RFX01BU0sJCTB4MzAKKyNkZWZpbmUgQURUNzMxNl9EQV9FTl9NT0RFX1NJTkdMRQkweDAwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9BQl9DRAkweDEwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9BQkNECQkweDIwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9MREFDCQkweDMwCisjZGVmaW5lIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0FCCTB4NDAKKyNkZWZpbmUgQURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQ0QJMHg4MAorCisvKgorICogQURUNzMxNiBMREFDIGNvbmZpZworICovCisjZGVmaW5lIEFEVDczMTZfTERBQ19FTl9EQV9NQVNLCQkweEYKKyNkZWZpbmUgQURUNzMxNl9EQUNfSU5fVlJFRgkJMHgxMAorI2RlZmluZSBBRFQ3NTE2X0RBQ19BQl9JTl9WUkVGCQkweDEwCisjZGVmaW5lIEFEVDc1MTZfREFDX0NEX0lOX1ZSRUYJCTB4MjAKKyNkZWZpbmUgQURUNzUxNl9EQUNfSU5fVlJFRl9PRkZTRVQJNAorI2RlZmluZSBBRFQ3NTE2X0RBQ19JTl9WUkVGX01BU0sJMHgzMAorCisvKgorICogQURUNzMxNiBJTlRfTUFTSzIKKyAqLworI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMl9WREQJCTB4MTAKKworLyoKKyAqIEFEVDczMTYgdmFsdWUgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3MzE2X1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFEVDczMTZfVF9WQUxVRV9TSUdOCQkweDQwMAorI2RlZmluZSBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX01BU0sJMHgyCisKKy8qCisgKiBDaGlwIElECisgKi8KKyNkZWZpbmUgSURfQURUNzMxNgkJMHgxCisjZGVmaW5lIElEX0FEVDczMTcJCTB4MgorI2RlZmluZSBJRF9BRFQ3MzE4CQkweDMKKyNkZWZpbmUgSURfQURUNzUxNgkJMHgxMQorI2RlZmluZSBJRF9BRFQ3NTE3CQkweDEyCisjZGVmaW5lIElEX0FEVDc1MTkJCTB4MTQKKworI2RlZmluZSBJRF9GQU1JTFlfTUFTSwkJMHhGMAorI2RlZmluZSBJRF9BRFQ3M1hYCQkweDAKKyNkZWZpbmUgSURfQURUNzVYWAkJMHgxMAorCisvKgorICogc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwlzdHJ1Y3QgaWlvX2RldgkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdGhyZXNoX3dvcms7CisJczY0CQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGFkdDczMTZfYnVzCWJ1czsKKwl1MTYJCQlsZGFjX3BpbjsKKwl1MTYJCQlpbnRfbWFzazsJLyogMHgyZiAqLworCXU4CQkJY29uZmlnMTsKKwl1OAkJCWNvbmZpZzI7CisJdTgJCQljb25maWczOworCXU4CQkJZGFjX2NvbmZpZzsJLyogREFDIGNvbmZpZyAqLworCXU4CQkJbGRhY19jb25maWc7CS8qIExEQUMgY29uZmlnICovCisJdTgJCQlkYWNfYml0czsJLyogOCwgMTAsIDEyICovCisJdTgJCQlpZDsJCS8qIGNoaXAgaWQgKi8KK307CisKKy8qCisgKiBMb2dpYyBpbnRlcnJ1cHQgbWFzayBmb3IgdXNlciBhcHBsaWNhdGlvbiB0byBlbmFibGUKKyAqIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgQURUNzMxNl9JTl9URU1QX0hJR0hfSU5UX01BU0sJMHgxCisjZGVmaW5lIEFEVDczMTZfSU5fVEVNUF9MT1dfSU5UX01BU0sJMHgyCisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9ISUdIX0lOVF9NQVNLCTB4NAorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfTE9XX0lOVF9NQVNLCTB4OAorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfRkFVTFRfSU5UX01BU0sJMHgxMAorI2RlZmluZSBBRFQ3NTE2X0FJTjFfSU5UX01BU0sJCTB4NAorI2RlZmluZSBBRFQ3NTE2X0FJTjJfSU5UX01BU0sJCTB4MjAKKyNkZWZpbmUgQURUNzUxNl9BSU4zX0lOVF9NQVNLCQkweDQwCisjZGVmaW5lIEFEVDc1MTZfQUlONF9JTlRfTUFTSwkJMHg4MAorI2RlZmluZSBBRFQ3MzE2X1ZERF9JTlRfTUFTSwkJMHgxMDAKKyNkZWZpbmUgQURUNzMxNl9URU1QX0lOVF9NQVNLCQkweDFGCisjZGVmaW5lIEFEVDc1MTZfQUlOX0lOVF9NQVNLCQkweEUwCisjZGVmaW5lIEFEVDczMTZfVEVNUF9BSU5fSU5UX01BU0sJXAorCShBRFQ3MzE2X1RFTVBfSU5UX01BU0sgfCBBRFQ3MzE2X1RFTVBfSU5UX01BU0spCisKKy8qCisgKiBzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzMxNl9saW1pdF9yZWdzIHsKKwl1MTYJZGF0YV9oaWdoOworCXUxNglkYXRhX2xvdzsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnMSAmIEFEVDczMTZfRU4pKTsKK30KKworc3RhdGljIHNzaXplX3QgX2FkdDczMTZfc3RvcmVfZW5hYmxlZChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBlbmFibGUpCit7CisJdTggY29uZmlnMTsKKwlpbnQgcmV0OworCisJaWYgKGVuYWJsZSkKKwkJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgfCBBRFQ3MzE2X0VOOworCWVsc2UKKwkJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgJiB+QURUNzMxNl9FTjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNvbmZpZzEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMSA9IGNvbmZpZzE7CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCBlbmFibGU7CisKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWVuYWJsZSA9IDE7CisJZWxzZQorCQllbmFibGUgPSAwOworCisJaWYgKF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgZW5hYmxlKSA8IDApCisJCXJldHVybiAtRUlPOworCWVsc2UKKwkJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZWQsCisJCWFkdDczMTZfc3RvcmVfZW5hYmxlZCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19zZWxlY3RfZXhfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSAhPSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3NTE2X1NFTF9FWF9URU1QKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfc2VsZWN0X2V4X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWcxOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spICE9IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwljb25maWcxID0gY2hpcC0+Y29uZmlnMSAmICh+QURUNzUxNl9TRUxfRVhfVEVNUCk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcxIHw9IEFEVDc1MTZfU0VMX0VYX1RFTVA7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcxLCBjb25maWcxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzEgPSBjb25maWcxOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihzZWxlY3RfZXhfdGVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19zZWxlY3RfZXhfdGVtcCwKKwkJYWR0NzMxNl9zdG9yZV9zZWxlY3RfZXhfdGVtcCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNpbmdsZV9jaGFubmVsXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInJvdW5kX3JvYmluXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgJiAofkFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpOworCWlmICghbWVtY21wKGJ1ZiwgInNpbmdsZV9jaGFubmVsIiwgMTQpKQorCQljb25maWcyIHw9IEFEVDczMTZfQURfU0lOR0xFX0NIX01PREU7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X21vZGUsCisJCWFkdDczMTZfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hbGxfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNpbmdsZV9jaGFubmVsXG5yb3VuZF9yb2JpblxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWxsX21vZGVzLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfYWxsX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FkX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICghKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY2hpcC0+Y29uZmlnMiAmIEFEVDc1MTZfQURfU0lOR0xFX0NIX01BU0spIHsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX1ZERDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuIik7CisJY2FzZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTjoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iKTsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX0VYOgorCQlpZiAoKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSAmJgorCQkJKGNoaXAtPmNvbmZpZzEgJiBBRFQ3NTE2X1NFTF9BSU4xXzJfRVhfVEVNUF9NQVNLKSA9PSAwKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMiAtIEFJTjFcbiIpOworCQllbHNlCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIyIC0gRXh0ZXJuYWwgVGVtcGVyYXR1cmVcbiIpOworCWNhc2UgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMjoKKwkJaWYgKChjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSykgPT0gMCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjMgLSBBSU4yXG4iKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiTi9BXG4iKTsKKwljYXNlIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjM6CisJCWlmIChjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMykKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjQgLSBBSU4zXG4iKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiTi9BXG4iKTsKKwljYXNlIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjUgLSBBSU40XG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJOL0FcbiIpOworCX07Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfYWRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSB7CisJCWlmIChkYXRhID4gNSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLKTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSA+IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljb25maWcyID0gY2hpcC0+Y29uZmlnMiAmICh+QURUNzMxNl9BRF9TSU5HTEVfQ0hfTUFTSyk7CisJfQorCisKKwljb25maWcyIHw9IGRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhZF9jaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2FkX2NoYW5uZWwsCisJCWFkdDczMTZfc3RvcmVfYWRfY2hhbm5lbCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hbGxfYWRfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICghKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iCisJCQkJIjIgLSBFeHRlcm5hbCBUZW1wZXJhdHVyZSBvciBBSU4yXG4iCisJCQkJIjMgLSBBSU4yXG40IC0gQUlOM1xuNSAtIEFJTjRcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iCisJCQkJIjIgLSBFeHRlcm5hbCBUZW1wZXJhdHVyZVxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWxsX2FkX2NoYW5uZWxzLCBTX0lSVUdPLAorCQlhZHQ3MzE2X3Nob3dfYWxsX2FkX2NoYW5uZWxzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2Rpc2FibGVfYXZlcmFnaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfRElTQUJMRV9BVkVSQUdJTkcpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9kaXNhYmxlX2F2ZXJhZ2luZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJaW50IHJldDsKKworCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3MzE2X0RJU0FCTEVfQVZFUkFHSU5HKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzIgfD0gQURUNzMxNl9ESVNBQkxFX0FWRVJBR0lORzsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzIsIGNvbmZpZzIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMiA9IGNvbmZpZzI7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRpc2FibGVfYXZlcmFnaW5nLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2Rpc2FibGVfYXZlcmFnaW5nLAorCQlhZHQ3MzE2X3N0b3JlX2Rpc2FibGVfYXZlcmFnaW5nLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2VuYWJsZV9zbWJ1c190aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfRU5fU01CVVNfVElNRU9VVCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZV9zbWJ1c190aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgJiAofkFEVDczMTZfRU5fU01CVVNfVElNRU9VVCk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcyIHw9IEFEVDczMTZfRU5fU01CVVNfVElNRU9VVDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzIsIGNvbmZpZzIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMiA9IGNvbmZpZzI7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGVuYWJsZV9zbWJ1c190aW1lb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZV9zbWJ1c190aW1lb3V0LAorCQlhZHQ3MzE2X3N0b3JlX2VuYWJsZV9zbWJ1c190aW1lb3V0LAorCQkwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgfCBBRFQ3MzE2X1JFU0VUOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMiwgY29uZmlnMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLAorCQlOVUxMLAorCQlhZHQ3MzE2X3N0b3JlX3Jlc2V0LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3MzE2X1BEKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfcG93ZXJkb3duKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMTsKKwlpbnQgcmV0OworCisJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgJiAofkFEVDczMTZfUEQpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMSB8PSBBRFQ3MzE2X1BEOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMSwgY29uZmlnMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcxID0gY29uZmlnMTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG93ZXJkb3duLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X3Bvd2VyZG93biwKKwkJYWR0NzMxNl9zdG9yZV9wb3dlcmRvd24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZmFzdF9hZF9jbG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0FEQ0xLXzIyXzUpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9mYXN0X2FkX2Nsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJY29uZmlnMyA9IGNoaXAtPmNvbmZpZzMgJiAofkFEVDczMTZfQURDTEtfMjJfNSk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczIHw9IEFEVDczMTZfQURDTEtfMjJfNTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZhc3RfYWRfY2xvY2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZmFzdF9hZF9jbG9jaywKKwkJYWR0NzMxNl9zdG9yZV9mYXN0X2FkX2Nsb2NrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2RhX2hpZ2hfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0hJR0hfUkVTT0xVVElPTikgeworCQlpZiAoY2hpcC0+aWQgPT0gSURfQURUNzMxNiB8fCBjaGlwLT5pZCA9PSBJRF9BRFQ3NTE2KQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAoMTIgYml0cylcbiIpOworCQllbHNlIGlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE3IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTcpCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIxICgxMCBiaXRzKVxuIik7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAoOCBiaXRzKVxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZGFfaGlnaF9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJY2hpcC0+ZGFjX2JpdHMgPSA4OworCisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKSB7CisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczIHwgQURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT047CisJCWlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE2IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTYpCisJCQljaGlwLT5kYWNfYml0cyA9IDEyOworCQllbHNlIGlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE3IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTcpCisJCQljaGlwLT5kYWNfYml0cyA9IDEwOworCX0gZWxzZQorCQljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT04pOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMywgY29uZmlnMyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWczID0gY29uZmlnMzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGFfaGlnaF9yZXNvbHV0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2RhX2hpZ2hfcmVzb2x1dGlvbiwKKwkJYWR0NzMxNl9zdG9yZV9kYV9oaWdoX3Jlc29sdXRpb24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlOX2ludGVybmFsX1ZyZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgIT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkhIShjaGlwLT5jb25maWczICYgQURUNzUxNl9BSU5fSU5fVlJFRikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0FJTl9pbnRlcm5hbF9WcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSAhPSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKG1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczICYgKH5BRFQ3NTE2X0FJTl9JTl9WUkVGKTsKKwllbHNlCisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczIHwgQURUNzUxNl9BSU5fSU5fVlJFRjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKEFJTl9pbnRlcm5hbF9WcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0FJTl9pbnRlcm5hbF9WcmVmLAorCQlhZHQ3MzE2X3N0b3JlX0FJTl9pbnRlcm5hbF9WcmVmLAorCQkwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZW5hYmxlX3Byb3BfREFDQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZW5hYmxlX3Byb3BfREFDQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzM7CisJaW50IHJldDsKKworCWNvbmZpZzMgPSBjaGlwLT5jb25maWczICYgKH5BRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzMgfD0gQURUNzMxNl9FTl9JTl9URU1QX1BST1BfREFDQTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGVuYWJsZV9wcm9wb3J0aW9uX0RBQ0EsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZW5hYmxlX3Byb3BfREFDQSwKKwkJYWR0NzMxNl9zdG9yZV9lbmFibGVfcHJvcF9EQUNBLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0Ioc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkhIShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZV9wcm9wX0RBQ0Ioc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWczOworCWludCByZXQ7CisKKwljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQik7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczIHw9IEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0I7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUczLCBjb25maWczKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzMgPSBjb25maWczOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVfcHJvcG9ydGlvbl9EQUNCLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0IsCisJCWFkdDczMTZfc3RvcmVfZW5hYmxlX3Byb3BfREFDQiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfMlZyZWZfY2hfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwKKwkJY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFDXzJWcmVmX2NoX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzE2X0RBXzJWUkVGX0NIX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJZGFjX2NvbmZpZyA9IGNoaXAtPmRhY19jb25maWcgJiAofkFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSyk7CisJZGFjX2NvbmZpZyB8PSBkYXRhOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfREFDX0NPTkZJRywgZGFjX2NvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5kYWNfY29uZmlnID0gZGFjX2NvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoREFDXzJWcmVmX2NoYW5uZWxzX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfREFDXzJWcmVmX2NoX21hc2ssCisJCWFkdDczMTZfc3RvcmVfREFDXzJWcmVmX2NoX21hc2ssCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfREFDX3VwZGF0ZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoIShjaGlwLT5jb25maWczICYgQURUNzMxNl9EQV9FTl9WSUFfREFDX0xEQ0EpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJtYW51YWxcbiIpOworCWVsc2UgeworCQlzd2l0Y2ggKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgeworCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9TSU5HTEU6CisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iKTsKKwkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJfQ0Q6CisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIxIC0gYXV0byBhdCBNU0IgREFDIEFCIGFuZCBDRCB3cml0aW5nXG4iKTsKKwkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJDRDoKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjIgLSBhdXRvIGF0IE1TQiBEQUMgQUJDRCB3cml0aW5nXG4iKTsKKwkJZGVmYXVsdDogLyogQURUNzMxNl9EQV9FTl9NT0RFX0xEQUMgKi8KKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjMgLSBtYW51YWxcbiIpOworCQl9OworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfdXBkYXRlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCEoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9EQV9FTl9NT0RFX01BU0spOworCWRhY19jb25maWcgfD0gZGF0YTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ191cGRhdGVfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19EQUNfdXBkYXRlX21vZGUsCisJCWFkdDczMTZfc3RvcmVfREFDX3VwZGF0ZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FsbF9EQUNfdXBkYXRlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iCisJCQkJIjEgLSBhdXRvIGF0IE1TQiBEQUMgQUIgYW5kIENEIHdyaXRpbmdcbiIKKwkJCQkiMiAtIGF1dG8gYXQgTVNCIERBQyBBQkNEIHdyaXRpbmdcbiIKKwkJCQkiMyAtIG1hbnVhbFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJtYW51YWxcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGFsbF9EQUNfdXBkYXRlX21vZGVzLCBTX0lSVUdPLAorCQlhZHQ3MzE2X3Nob3dfYWxsX0RBQ191cGRhdGVfbW9kZXMsIE5VTEwsIDApOworCisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfdXBkYXRlX0RBQyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGxkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQSkgeworCQlpZiAoKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgIT0KKwkJCUFEVDczMTZfREFfRU5fTU9ERV9MREFDKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJCWlmIChyZXQgfHwgZGF0YSA+IEFEVDczMTZfTERBQ19FTl9EQV9NQVNLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyAmICh+QURUNzMxNl9MREFDX0VOX0RBX01BU0spOworCQlsZGFjX2NvbmZpZyB8PSBkYXRhOworCisJCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0xEQUNfQ09ORklHLAorCQkJbGRhY19jb25maWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+bGRhY19waW4sIDApOworCQlncGlvX3NldF92YWx1ZShjaGlwLT5sZGFjX3BpbiwgMSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih1cGRhdGVfREFDLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWR0NzMxNl9zdG9yZV91cGRhdGVfREFDLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBX0FCX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0FCKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFfQUJfVnJlZl9ieXBhc3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQUIpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJZGFjX2NvbmZpZyB8PSBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19BQjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBX0FCX1ZyZWZfYnlwYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBX0FCX1ZyZWZfYnlwYXNzLAorCQlhZHQ3MzE2X3N0b3JlX0RBX0FCX1ZyZWZfYnlwYXNzLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBX0NEX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0NEKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFfQ0RfVnJlZl9ieXBhc3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQ0QpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJZGFjX2NvbmZpZyB8PSBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19DRDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBX0NEX1ZyZWZfYnlwYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBX0NEX1ZyZWZfYnlwYXNzLAorCQlhZHQ3MzE2X3N0b3JlX0RBX0NEX1ZyZWZfYnlwYXNzLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19pbnRlcm5hbF9WcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsCisJCQkoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDc1MTZfREFDX0lOX1ZSRUZfTUFTSykgPj4KKwkJCUFEVDc1MTZfREFDX0lOX1ZSRUZfT0ZGU0VUKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfREFDX0lOX1ZSRUYpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfaW50ZXJuYWxfVnJlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGxkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSB7CisJCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwkJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgJiAofkFEVDc1MTZfREFDX0lOX1ZSRUZfTUFTSyk7CisJCWlmIChkYXRhICYgMHgxKQorCQkJbGRhY19jb25maWcgfD0gQURUNzUxNl9EQUNfQUJfSU5fVlJFRjsKKwkJZWxzZSBpZiAoZGF0YSAmIDB4MikKKwkJCWxkYWNfY29uZmlnIHw9IEFEVDc1MTZfREFDX0NEX0lOX1ZSRUY7CisJfSBlbHNlIHsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyAmICh+QURUNzMxNl9EQUNfSU5fVlJFRik7CisJCWlmIChkYXRhKQorCQkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyB8IEFEVDczMTZfREFDX0lOX1ZSRUY7CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfTERBQ19DT05GSUcsIGxkYWNfY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmxkYWNfY29uZmlnID0gbGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19pbnRlcm5hbF9WcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBQ19pbnRlcm5hbF9WcmVmLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19pbnRlcm5hbF9WcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FkKHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCwKKwkJaW50IGNoYW5uZWwsIGNoYXIgKmJ1ZikKK3sKKwl1MTYgZGF0YTsKKwl1OCBtc2IsIGxzYjsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCWlmICgoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpICYmCisJCWNoYW5uZWwgIT0gKGNoaXAtPmNvbmZpZzIgJiBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQURUNzMxNl9BRF9TSU5HTEVfQ0hfSU46CisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0xTQl9JTl9URU1QX1ZERCwgJmxzYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9BRF9NU0JfREFUQV9CQVNFICsgY2hhbm5lbCwgJm1zYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYXRhID0gbXNiIDw8IEFEVDczMTZfVF9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCWRhdGEgfD0gbHNiICYgQURUNzMxNl9MU0JfSU5fVEVNUF9NQVNLOworCQlicmVhazsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX1ZERDoKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfTFNCX0lOX1RFTVBfVkRELCAmbHNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisKKwkJCUFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSArIGNoYW5uZWwsICZtc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGF0YSA9IG1zYiA8PCBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlkYXRhIHw9IChsc2IgJiBBRFQ3MzE2X0xTQl9WRERfTUFTSykgPj4gQURUNzMxNl9MU0JfVkREX09GRlNFVDsKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworCWRlZmF1bHQ6IC8qIGV4X3RlbXAgYW5kIGFpbiAqLworCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9MU0JfRVhfVEVNUF9BSU4sICZsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSArIGNoYW5uZWwsICZtc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGF0YSA9IG1zYiA8PCBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlkYXRhIHw9IGxzYiAmIChBRFQ3MzE2X0xTQl9FWF9URU1QX01BU0sgPDwKKwkJCShBRFQ3NTE2X0xTQl9BSU5fU0hJRlQgKiAoY2hhbm5lbCAtCisJCQkoQURUNzMxNl9NU0JfRVhfVEVNUCAtIEFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSkpKSk7CisKKwkJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworCQllbHNlCisJCQlicmVhazsKKwl9OworCisJaWYgKGRhdGEgJiBBRFQ3MzE2X1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRFQ3MzE2X1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19WREQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzMxNl9BRF9TSU5HTEVfQ0hfVkRELCBidWYpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihWREQsIFNfSVJVR08sIGFkdDczMTZfc2hvd19WREQsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTiwgYnVmKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfaW5fdGVtcCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzMxNl9BRF9TSU5HTEVfQ0hfRVgsIGJ1Zik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXhfdGVtcF9BSU4xLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9BSU4xLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXhfdGVtcCwgU19JUlVHTywgYWR0NzMxNl9zaG93X2V4X3RlbXBfQUlOMSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19BSU4yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjIsIGJ1Zik7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKEFJTjIsIFNfSVJVR08sIGFkdDczMTZfc2hvd19BSU4yLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTjMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMywgYnVmKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoQUlOMywgU19JUlVHTywgYWR0NzMxNl9zaG93X0FJTjMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlONChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU40LCBidWYpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihBSU40LCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfQUlONCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd190ZW1wX29mZnNldChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBvZmZzZXRfYWRkciwgY2hhciAqYnVmKQoreworCWludCBkYXRhOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgb2Zmc2V0X2FkZHIsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IChpbnQpdmFsOworCWlmICh2YWwgJiAweDgwKQorCQlkYXRhIC09IDI1NjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBvZmZzZXRfYWRkciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWxvbmcgZGF0YTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDEyNyB8fCBkYXRhIDwgLTEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSA8IDApCisJCWRhdGEgKz0gMjU2OworCisJdmFsID0gKHU4KWRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgb2Zmc2V0X2FkZHIsIHZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9JTl9URU1QX09GRlNFVCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9pbl90ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9JTl9URU1QX09GRlNFVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2luX3RlbXBfb2Zmc2V0LAorCQlhZHQ3MzE2X3N0b3JlX2luX3RlbXBfb2Zmc2V0LCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2V4X3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZXhfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX29mZnNldCwKKwkJYWR0NzMxNl9zdG9yZV9leF90ZW1wX29mZnNldCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbl9hbmFsb2dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfdGVtcF9vZmZzZXQoY2hpcCwKKwkJCUFEVDczMTZfSU5fQU5BTE9HX1RFTVBfT0ZGU0VULCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2luX2FuYWxvZ190ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwKKwkJCUFEVDczMTZfSU5fQU5BTE9HX1RFTVBfT0ZGU0VULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2luX2FuYWxvZ190ZW1wX29mZnNldCwKKwkJYWR0NzMxNl9zdG9yZV9pbl9hbmFsb2dfdGVtcF9vZmZzZXQsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9leF9hbmFsb2dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X2FuYWxvZ190ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19leF9hbmFsb2dfdGVtcF9vZmZzZXQsCisJCWFkdDczMTZfc3RvcmVfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0LCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQyhzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBjaGFubmVsLCBjaGFyICpidWYpCit7CisJdTE2IGRhdGE7CisJdTggbXNiLCBsc2IsIG9mZnNldDsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwgPj0gQURUNzMxNl9EQV9NU0JfREFUQV9SRUdTIHx8CisJCShjaGFubmVsID09IDAgJiYKKwkJKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKSkgfHwKKwkJKGNoYW5uZWwgPT0gMSAmJgorCQkoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0IpKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCW9mZnNldCA9IGNoaXAtPmRhY19iaXRzIC0gODsKKworCWlmIChjaGlwLT5kYWNfYml0cyA+IDgpIHsKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfREFfREFUQV9CQVNFICsgY2hhbm5lbCAqIDIsICZsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJQURUNzMxNl9EQV9EQVRBX0JBU0UgKyAxICsgY2hhbm5lbCAqIDIsICZtc2IpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IChtc2IgPDwgb2Zmc2V0KSArIChsc2IgJiAoKDEgPDwgb2Zmc2V0KSAtIDEpKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUMoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgY2hhbm5lbCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXU4IG1zYiwgbHNiLCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbCA+PSBBRFQ3MzE2X0RBX01TQl9EQVRBX1JFR1MgfHwKKwkJKGNoYW5uZWwgPT0gMCAmJgorCQkoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fSU5fVEVNUF9QUk9QX0RBQ0EpKSB8fAorCQkoY2hhbm5lbCA9PSAxICYmCisJCShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQikpKQorCQlyZXR1cm4gLUVQRVJNOworCisJb2Zmc2V0ID0gY2hpcC0+ZGFjX2JpdHMgLSA4OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+PSAoMSA8PCBjaGlwLT5kYWNfYml0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNoaXAtPmRhY19iaXRzID4gOCkgeworCQlsc2IgPSBkYXRhICYgKDEgPDwgb2Zmc2V0KTsKKwkJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0RBX0RBVEFfQkFTRSArIGNoYW5uZWwgKiAyLCBsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJbXNiID0gZGF0YSA+PiBvZmZzZXQ7CisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsCisJCUFEVDczMTZfREFfREFUQV9CQVNFICsgMSArIGNoYW5uZWwgKiAyLCBtc2IpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19BKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAwLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19BKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19BLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19BLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19BLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19CKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAxLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19CKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19CLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19CLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19CLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19DKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAyLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19DKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMiwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19DLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19DLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19DLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19EKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAzLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19EKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19ELCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19ELAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19ELCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RFVklDRV9JRCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpZCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGV2aWNlX2lkLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZGV2aWNlX2lkLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X21hbnVmYWN0b3Jlcl9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X01BTlVGQUNUVVJFX0lELCAmaWQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlkKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtYW51ZmFjdG9yZXJfaWQsIFNfSVJVR08sCisJCWFkdDczMTZfc2hvd19tYW51ZmFjdG9yZXJfaWQsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZGV2aWNlX3JldihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IHJldjsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9ERVZJQ0VfUkVWLCAmcmV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRldmljZV9yZXYsIFNfSVJVR08sIGFkdDczMTZfc2hvd19kZXZpY2VfcmV2LCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2J1c190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggc3RhdDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9TUElfTE9DS19TVEFULCAmc3RhdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoc3RhdCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAic3BpXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImkyY1xuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYnVzX3R5cGUsIFNfSVJVR08sIGFkdDczMTZfc2hvd19idXNfdHlwZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWR0NzMxNl9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzMxNl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hbGxfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZF9jaGFubmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbGxfYWRfY2hhbm5lbHMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rpc2FibGVfYXZlcmFnaW5nLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfc21idXNfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mYXN0X2FkX2Nsb2NrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYV9oaWdoX3Jlc29sdXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0IuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ18yVnJlZl9jaGFubmVsc19tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfdXBkYXRlX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9EQUNfdXBkYXRlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl91cGRhdGVfREFDLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQV9BQl9WcmVmX2J5cGFzcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQ0RfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9WREQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF9hbmFsb2dfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19BLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19ELmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZXZpY2VfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21hbnVmYWN0b3Jlcl9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGV2aWNlX3Jldi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnVzX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzMxNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzMxNl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc1MTZfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYWxsX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zZWxlY3RfZXhfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FkX2NoYW5uZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9hZF9jaGFubmVscy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGlzYWJsZV9hdmVyYWdpbmcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9zbWJ1c190aW1lb3V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Zhc3RfYWRfY2xvY2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0FJTl9pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYV9oaWdoX3Jlc29sdXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0IuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ18yVnJlZl9jaGFubmVsc19tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfdXBkYXRlX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9EQUNfdXBkYXRlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl91cGRhdGVfREFDLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQV9BQl9WcmVmX2J5cGFzcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQ0RfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9WREQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXBfQUlOMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlOMi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlOMy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlONC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9hbmFsb2dfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X2FuYWxvZ190ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19CLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RldmljZV9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbWFudWZhY3RvcmVyX2lkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZXZpY2VfcmV2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idXNfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NTE2X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3NTE2X2F0dHJpYnV0ZXMsCit9OworCisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9ISUdIICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9MT1cgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9ISUdIICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9MT1cgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9GQVVMVCAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDQpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMSAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDUpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMiAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDYpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMyAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDcpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlONCAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDgpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfVkREICAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDkpCisKK3N0YXRpYyB2b2lkIGFkdDczMTZfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IHN0YXQxLCBzdGF0MjsKKwlpbnQgaSwgcmV0LCBjb3VudDsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfSU5UX1NUQVQxLCAmc3RhdDEpOworCWlmICghcmV0KSB7CisJCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJCWNvdW50ID0gODsKKwkJZWxzZQorCQkJY291bnQgPSA1OworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoc3RhdDEgJiAoMSA8PCBpKSkKKwkJCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9ISUdIICsgaSwKKwkJCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCQl9CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9JTlRfU1RBVDIsICZzdGF0Mik7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHN0YXQyICYgQURUNzMxNl9JTlRfTUFTSzJfVkREKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTZfVkRELAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9CisKKwllbmFibGVfaXJxKGNoaXAtPmJ1cy5pcnEpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaW50ZXJydXB0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDczMTYsICZhZHQ3MzE2X2ludGVycnVwdCk7CisKKy8qCisgKiBTaG93IG1hc2sgb2YgZW5hYmxlZCBpbnRlcnJ1cHRzIGluIEhleC4KKyAqLworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2ludF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBjaGlwLT5pbnRfbWFzayk7Cit9CisKKy8qCisgKiBTZXQgMSB0byB0aGUgbWFzayBpbiBIZXggdG8gZW5hYmxlZCBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3NldF9pbnRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCXU4IG1hc2s7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID49IEFEVDczMTZfVkREX0lOVF9NQVNLICsgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSAmIEFEVDczMTZfVkREX0lOVF9NQVNLKQorCQltYXNrID0gMDsJCQkvKiBlbmFibGUgdmRkIGludCAqLworCWVsc2UKKwkJbWFzayA9IEFEVDczMTZfSU5UX01BU0syX1ZERDsJLyogZGlzYWJsZSB2ZGQgaW50ICovCisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9JTlRfTUFTSzIsIG1hc2spOworCWlmICghcmV0KSB7CisJCWNoaXAtPmludF9tYXNrICY9IH5BRFQ3MzE2X1ZERF9JTlRfTUFTSzsKKwkJY2hpcC0+aW50X21hc2sgfD0gZGF0YSAmIEFEVDczMTZfVkREX0lOVF9NQVNLOworCX0KKworCWlmIChkYXRhICYgQURUNzMxNl9URU1QX0FJTl9JTlRfTUFTSykgeworCQlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFgpCisJCQkvKiBtYXNrIGluIHJlZyBpcyBvcHBvc2l0ZSwgc2V0IDEgdG8gZGlzYWJsZSAqLworCQkJbWFzayA9ICh+ZGF0YSkgJiBBRFQ3MzE2X1RFTVBfSU5UX01BU0s7CisJCWVsc2UKKwkJCS8qIG1hc2sgaW4gcmVnIGlzIG9wcG9zaXRlLCBzZXQgMSB0byBkaXNhYmxlICovCisJCQltYXNrID0gKH5kYXRhKSAmIEFEVDczMTZfVEVNUF9BSU5fSU5UX01BU0s7CisJfQorCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0lOVF9NQVNLMSwgbWFzayk7CisKKwljaGlwLT5pbnRfbWFzayA9IG1hc2s7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2hvd19hZF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggdmFsOworCWludCBkYXRhOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFggJiYKKwkJYm91bmRfcmVnID4gQURUNzMxNl9FWF9URU1QX0xPVykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIGJvdW5kX3JlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID0gKGludCl2YWw7CisKKwlpZiAoISgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCAmJgorCQkoY2hpcC0+Y29uZmlnMSAmIEFEVDc1MTZfU0VMX0FJTjFfMl9FWF9URU1QX01BU0spID09IDApKSB7CisJCWlmIChkYXRhICYgMHg4MCkKKwkJCWRhdGEgLT0gMjU2OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FkX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlsb25nIGRhdGE7CisJdTggdmFsOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFggJiYKKwkJYm91bmRfcmVnID4gQURUNzMxNl9FWF9URU1QX0xPVykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYICYmCisJCShjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSykgPT0gMCkgeworCQlpZiAoZGF0YSA+IDI1NSB8fCBkYXRhIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWlmIChkYXRhID4gMTI3IHx8IGRhdGEgPCAtMTI4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGRhdGEgPCAwKQorCQkJZGF0YSArPSAyNTY7CisJfQorCisJdmFsID0gKHU4KWRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgYm91bmRfcmVnLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2luX3RlbXBfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2luX3RlbXBfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTZfSU5fVEVNUF9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbl90ZW1wX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfaW5fdGVtcF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0VYX1RFTVBfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0hJR0gsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0VYX1RFTVBfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW4yX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW4yX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjJfSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluMl9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjJfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluM19oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluM19oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4zX0hJR0gsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjNfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW4zX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjRfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjRfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlONF9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW40X2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluNF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbnRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3MzE2X0lOVF9FTikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3NldF9pbnRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzE7CisJaW50IHJldDsKKworCWNvbmZpZzEgPSBjaGlwLT5jb25maWcxICYgKH5BRFQ3MzE2X0lOVF9FTik7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcxIHw9IEFEVDczMTZfSU5UX0VOOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMSwgY29uZmlnMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcxID0gY29uZmlnMTsKKworCXJldHVybiBsZW47Cit9CisKKworSUlPX0VWRU5UX0FUVFJfU0goaW50X21hc2ssIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW50X21hc2ssIGFkdDczMTZfc2V0X2ludF9tYXNrLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGluX3RlbXBfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19pbl90ZW1wX2hpZ2gsIGFkdDczMTZfc2V0X2luX3RlbXBfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChpbl90ZW1wX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19pbl90ZW1wX2xvdywgYWR0NzMxNl9zZXRfaW5fdGVtcF9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goZXhfdGVtcF9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9oaWdoLAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChleF90ZW1wX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfbG93LAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGV4X3RlbXBfYWluMV9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9oaWdoLAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChleF90ZW1wX2FpbjFfbG93LCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9sb3csCisJCWFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluMl9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjJfaGlnaCwgYWR0NzMxNl9zZXRfYWluMl9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjJfbG93LCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjJfbG93LCBhZHQ3MzE2X3NldF9haW4yX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW4zX2hpZ2gsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluM19oaWdoLCBhZHQ3MzE2X3NldF9haW4zX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluM19sb3csIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluM19sb3csIGFkdDczMTZfc2V0X2FpbjNfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjRfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW40X2hpZ2gsIGFkdDczMTZfc2V0X2FpbjRfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW40X2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW40X2xvdywgYWR0NzMxNl9zZXRfYWluNF9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goaW50X2VuYWJsZWQsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW50X2VuYWJsZWQsIGFkdDczMTZfc2V0X2ludF9lbmFibGVkLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTZfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9pbnRfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbl90ZW1wX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW5fdGVtcF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfZXhfdGVtcF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ludF9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDczMTZfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NTE2X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfaW50X21hc2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW5fdGVtcF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luX3RlbXBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfYWluMV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfYWluMV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluMl9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjJfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjNfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW4zX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW40X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluNF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW50X2VuYWJsZWQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworI2lmZGVmIENPTkZJR19QTQoraW50IGFkdDczMTZfZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfZGlzYWJsZSk7CisKK2ludCBhZHQ3MzE2X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfZW5hYmxlKTsKKyNlbmRpZgorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworaW50IF9fZGV2aW5pdCBhZHQ3MzE2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGFkdDczMTZfYnVzICpidXMsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwOworCXVuc2lnbmVkIHNob3J0ICphZHQ3MzE2X3BsYXRmb3JtX2RhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNoaXApOworCisJY2hpcC0+YnVzID0gKmJ1czsKKwljaGlwLT5uYW1lID0gbmFtZTsKKworCWlmIChuYW1lWzRdID09ICczJykKKwkJY2hpcC0+aWQgPSBJRF9BRFQ3MzE2ICsgKG5hbWVbNl0gLSAnNicpOworCWVsc2UgaWYgKG5hbWVbNF0gPT0gJzUnKQorCQljaGlwLT5pZCA9IElEX0FEVDc1MTYgKyAobmFtZVs2XSAtICc2Jyk7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoaXAtPmxkYWNfcGluID0gYWR0NzMxNl9wbGF0Zm9ybV9kYXRhWzFdOworCWlmIChjaGlwLT5sZGFjX3BpbikgeworCQljaGlwLT5jb25maWczIHw9IEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBOworCQlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCQljaGlwLT5jb25maWcxIHw9IEFEVDc1MTZfU0VMX0FJTjM7CisJfQorCWNoaXAtPmludF9tYXNrID0gQURUNzMxNl9URU1QX0lOVF9NQVNLIHwgQURUNzMxNl9WRERfSU5UX01BU0s7CisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQljaGlwLT5pbnRfbWFzayB8PSBBRFQ3NTE2X0FJTl9JTlRfTUFTSzsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gZGV2OworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkgeworCQljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDc1MTZfYXR0cmlidXRlX2dyb3VwOworCQljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkdDc1MTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCX0gZWxzZSB7CisJCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWR0NzMxNl9hdHRyaWJ1dGVfZ3JvdXA7CisJCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWR0NzMxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJfQorCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChjaGlwLT5idXMuaXJxID4gMCkgeworCQlpZiAoYWR0NzMxNl9wbGF0Zm9ybV9kYXRhWzBdKQorCQkJY2hpcC0+YnVzLmlycV9mbGFncyA9IGFkdDczMTZfcGxhdGZvcm1fZGF0YVswXTsKKworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+YnVzLmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQljaGlwLT5idXMuaXJxX2ZsYWdzLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3MzE2LgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIFNvLCBvbmx5IHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXIgb25jZS4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkdDczMTYsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzMxNl9pbnRlcnJ1cHRfYmgpOworCisJCWlmIChjaGlwLT5idXMuaXJxX2ZsYWdzICYgSVJRRl9UUklHR0VSX0hJR0gpCisJCQljaGlwLT5jb25maWcxIHw9IEFEVDczMTZfSU5UX1BPTEFSSVRZOworCX0KKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNoaXAtPmNvbmZpZzEpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl91bnJlZ19pcnE7CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMywgY2hpcC0+Y29uZmlnMyk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIHJlZ2lzdGVyZWQuXG4iLAorCQkJY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfcHJvYmUpOworCitpbnQgX19kZXZleGl0IGFkdDczMTZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaWYgKGNoaXAtPmJ1cy5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWR0NzMxNl9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURUNzMxNi83LzggYW5kIEFEVDc1MTYvNy85IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGJkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQURUNzMxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQURUNzMxNl9IXworI2RlZmluZSBfQURUNzMxNl9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBBRFQ3MzE2X1JFR19NQVhfQUREUgkJMHgzRgorCitzdHJ1Y3QgYWR0NzMxNl9idXMgeworCXZvaWQgKmNsaWVudDsKKwlpbnQgaXJxOworCWludCBpcnFfZmxhZ3M7CisJaW50ICgqcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSk7CisJaW50ICgqd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggdmFsKTsKKwlpbnQgKCptdWx0aV9yZWFkKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqbXVsdGlfd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHU4ICpkYXRhKTsKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBhZHQ3MzE2X2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhZHQ3MzE2X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCitpbnQgYWR0NzMxNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBhZHQ3MzE2X2J1cyAqYnVzLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBhZHQ3MzE2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTFiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgREFDIGRyaXZlcnMKKyMKK2NvbW1lbnQgIkRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRvcnMiCisKK2NvbmZpZyBBRDU2MjRSX1NQSQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDU2MjQvNDQvNjRSIERBQyBzcGkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTYyNFIsIEFENTY0NFIgYW5kCisJICBBRDU2NjRSIGNvbnZlcnRvcnMgKERBQykuIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGNvbW1vbiBTUEkgaW50ZXJmYWNlLgorCitjb25maWcgQUQ1NDQ2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENTQ0NC82LCBBRDU2MjAvNDAvNjAgYW5kIEFENTU0MUEvMTJBIERBQyBTUEkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTQ0NCwgQUQ1NDQ2LAorCSAgQUQ1NjIwLCBBRDU2NDAsIEFENTY2MCBhbmQgQUQ1NTQxQSwgQUQ1NTEyQSBEQUNzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDU0NDYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjMzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIERBQyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDU2MjRSX1NQSSkgKz0gYWQ1NjI0cl9zcGkubworb2JqLSQoQ09ORklHX0FENTQ0NikgKz0gYWQ1NDQ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NDQ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzODdjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQUQ1NDQ2IFNQSSBEQUMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZGFjLmgiCisKKyNpbmNsdWRlICJhZDU0NDYuaCIKKworc3RhdGljIHZvaWQgYWQ1NDQ2X3N0b3JlX3NhbXBsZShzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCwgdW5zaWduZWQgdmFsKQoreworCXN0LT5kYXRhLmQxNiA9IGNwdV90b19iZTE2KEFENTQ0Nl9MT0FEIHwKKwkJCQkJKHZhbCA8PCBzdC0+Y2hpcF9pbmZvLT5sZWZ0X3NoaWZ0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkNTU0Ml9zdG9yZV9zYW1wbGUoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdC0+ZGF0YS5kMTYgPSBjcHVfdG9fYmUxNih2YWwgPDwgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkNTYyMF9zdG9yZV9zYW1wbGUoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdC0+ZGF0YS5kMTYgPSBjcHVfdG9fYmUxNihBRDU2MjBfTE9BRCB8CisJCQkJCSh2YWwgPDwgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCBhZDU2NjBfc3RvcmVfc2FtcGxlKHN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpCit7CisJdmFsIHw9IEFENTY2MF9MT0FEOworCXN0LT5kYXRhLmQyNFswXSA9ICh2YWwgPj4gMTYpICYgMHhGRjsKKwlzdC0+ZGF0YS5kMjRbMV0gPSAodmFsID4+IDgpICYgMHhGRjsKKwlzdC0+ZGF0YS5kMjRbMl0gPSB2YWwgJiAweEZGOworfQorCitzdGF0aWMgc3NpemVfdCBhZDU0NDZfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKHZhbCA+IFJFU19NQVNLKHN0LT5jaGlwX2luZm8tPmJpdHMpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJc3QtPmNoaXBfaW5mby0+c3RvcmVfc2FtcGxlKHN0LCB2YWwpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMCwgYWQ1NDQ2X3dyaXRlLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3Nob3dfc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCS8qIENvcnJlc3BvbmRzIHRvIFZyZWYgLyAyXihiaXRzKSAqLworCXVuc2lnbmVkIGludCBzY2FsZV91diA9IChzdC0+dnJlZl9tdiAqIDEwMDApID4+IHN0LT5jaGlwX2luZm8tPmJpdHM7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lZFxuIiwgc2NhbGVfdXYgLyAxMDAwLCBzY2FsZV91diAlIDEwMDApOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfc2NhbGUsIFNfSVJVR08sIGFkNTQ0Nl9zaG93X3NjYWxlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNTQ0Nl9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ1NDQ2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX291dDBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ1NDQ2X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDU0NDZfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ1NDQ2X2NoaXBfaW5mbyBhZDU0NDZfY2hpcF9pbmZvX3RibFtdID0geworCVtJRF9BRDU0NDRdID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAyLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NDQ2X3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU0NDZdID0geworCQkuYml0cyA9IDE0LAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NDQ2X3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU1NDJBXSA9IHsKKwkJLmJpdHMgPSAxNiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTU0Ml9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NTEyQV0gPSB7CisJCS5iaXRzID0gMTIsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDQsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU1NDJfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTYyMF8yNTAwXSA9IHsKKwkJLmJpdHMgPSAxMiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMiwKKwkJLmludF92cmVmX212ID0gMjUwMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTYyMF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjIwXzEyNTBdID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAyLAorCQkuaW50X3ZyZWZfbXYgPSAxMjUwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjIwX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2NDBfMjUwMF0gPSB7CisJCS5iaXRzID0gMTQsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2MjBfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTY0MF8xMjUwXSA9IHsKKwkJLmJpdHMgPSAxNCwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLmludF92cmVmX212ID0gMTI1MCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTYyMF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjYwXzI1MDBdID0geworCQkuYml0cyA9IDE2LAorCQkuc3RvcmFnZWJpdHMgPSAyNCwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuaW50X3ZyZWZfbXYgPSAyNTAwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjYwX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2NjBfMTI1MF0gPSB7CisJCS5iaXRzID0gMTYsCisJCS5zdG9yYWdlYml0cyA9IDI0LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5pbnRfdnJlZl9tdiA9IDEyNTAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2NjBfc3RvcmVfc2FtcGxlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDU0NDZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdDsKKwlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJc3QtPnJlZyA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmNjIik7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcHV0X3JlZzsKKworCQl2b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT5yZWcpOworCX0KKworCXN0LT5jaGlwX2luZm8gPQorCQkmYWQ1NDQ2X2NoaXBfaW5mb190Ymxbc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGFdOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJc3QtPnNwaSA9IHNwaTsKKworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCX0KKworCS8qIEVzdGFiaWxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBzcGkgZGV2aWNlICovCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDU0NDZfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJLyogU2V0dXAgZGVmYXVsdCBtZXNzYWdlICovCisKKwlzdC0+eGZlci50eF9idWYgPSAmc3QtPmRhdGE7CisJc3QtPnhmZXIubGVuID0gc3QtPmNoaXBfaW5mby0+c3RvcmFnZWJpdHMgLyA4OworCisJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmc3QtPm1zZyk7CisKKwlzd2l0Y2ggKHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhKSB7CisJCWNhc2UgSURfQUQ1NjIwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjIwXzEyNTA6CisJCWNhc2UgSURfQUQ1NjQwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjQwXzEyNTA6CisJCWNhc2UgSURfQUQ1NjYwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjYwXzEyNTA6CisJCQlzdC0+dnJlZl9tdiA9IHN0LT5jaGlwX2luZm8tPmludF92cmVmX212OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodm9sdGFnZV91dikKKwkJCQlzdC0+dnJlZl9tdiA9IHZvbHRhZ2VfdXYgLyAxMDAwOworCQkJZWxzZQorCQkJCWRldl93YXJuKCZzcGktPmRldiwKKwkJCQkJICJyZWZlcmVuY2Ugdm9sdGFnZSB1bnNwZWNpZmllZFxuIik7CisJfQorCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2aWNlOgorCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2Rpc2FibGVfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKK2Vycm9yX3B1dF9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ1NDQ2X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisJa2ZyZWUoc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ1NDQ2X2lkW10gPSB7CisJeyJhZDU0NDQiLCBJRF9BRDU0NDR9LAorCXsiYWQ1NDQ2IiwgSURfQUQ1NDQ2fSwKKwl7ImFkNTU0MmEiLCBJRF9BRDU1NDJBfSwKKwl7ImFkNTUxMmEiLCBJRF9BRDU1MTJBfSwKKwl7ImFkNTYyMC0yNTAwIiwgSURfQUQ1NjIwXzI1MDB9LCAvKiBBRDU2MjAvNDAvNjA6ICovCisJeyJhZDU2MjAtMTI1MCIsIElEX0FENTYyMF8xMjUwfSwgLyogcGFydCBudW1iZXJzIG1heSBsb29rIGRpZmZlcmVudGx5ICovCisJeyJhZDU2NDAtMjUwMCIsIElEX0FENTY0MF8yNTAwfSwKKwl7ImFkNTY0MC0xMjUwIiwgSURfQUQ1NjQwXzEyNTB9LAorCXsiYWQ1NjYwLTI1MDAiLCBJRF9BRDU2NjBfMjUwMH0sCisJeyJhZDU2NjAtMTI1MCIsIElEX0FENTY2MF8xMjUwfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNTQ0Nl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQ1NDQ2IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkNTQ0Nl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkNTQ0Nl9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFkNTQ0Nl9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkNTQ0Nl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNTQ0Nl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ1NDQ2X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWQ1NDQ2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNTQ0Nl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ1NDQ2X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDU0NDQvQUQ1NDQ2IERBQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJzcGk6YWQ1NDQ2Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQUQ1NDQ2IFNQSSBEQUMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fREFDX0FENTQ0Nl9IXworI2RlZmluZSBJSU9fREFDX0FENTQ0Nl9IXworCisvKiBEQUMgQ29udHJvbCBCaXRzICovCisKKyNkZWZpbmUgQUQ1NDQ2X0xPQUQJCSgweDAgPDwgMTQpIC8qIExvYWQgYW5kIHVwZGF0ZSAqLworI2RlZmluZSBBRDU0NDZfU0RPX0RJUwkJKDB4MSA8PCAxNCkgLyogRGlzYWJsZSBTRE8gKi8KKyNkZWZpbmUgQUQ1NDQ2X05PUAkJKDB4MiA8PCAxNCkgLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lIEFENTQ0Nl9DTEtfUklTSU5HCSgweDMgPDwgMTQpIC8qIENsb2NrIGRhdGEgb24gcmlzaW5nIGVkZ2UgKi8KKworI2RlZmluZSBBRDU2MjBfTE9BRAkJKDB4MCA8PCAxNCkgLyogTG9hZCBhbmQgdXBkYXRlIE5vcm0gT3BlcmF0aW9uKi8KKyNkZWZpbmUgQUQ1NjIwX1BXUkRXTl8xawkoMHgxIDw8IDE0KSAvKiBQb3dlci1kb3duOiAxa09obSB0byBHTkQgKi8KKyNkZWZpbmUgQUQ1NjIwX1BXUkRXTl8xMDBrCSgweDIgPDwgMTQpIC8qIFBvd2VyLWRvd246IDEwMGtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTYyMF9QV1JEV05fVFJJU1RBVEUJKDB4MyA8PCAxNCkgLyogUG93ZXItZG93bjogVGhyZWUtc3RhdGUgKi8KKworI2RlZmluZSBBRDU2NjBfTE9BRAkJKDB4MCA8PCAxNikgLyogTG9hZCBhbmQgdXBkYXRlIE5vcm0gT3BlcmF0aW9uKi8KKyNkZWZpbmUgQUQ1NjYwX1BXUkRXTl8xawkoMHgxIDw8IDE2KSAvKiBQb3dlci1kb3duOiAxa09obSB0byBHTkQgKi8KKyNkZWZpbmUgQUQ1NjYwX1BXUkRXTl8xMDBrCSgweDIgPDwgMTYpIC8qIFBvd2VyLWRvd246IDEwMGtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTY2MF9QV1JEV05fVFJJU1RBVEUJKDB4MyA8PCAxNikgLyogUG93ZXItZG93bjogVGhyZWUtc3RhdGUgKi8KKworI2RlZmluZSBSRVNfTUFTSyhiaXRzKQkoKDEgPDwgKGJpdHMpKSAtIDEpCisKKy8qKgorICogc3RydWN0IGFkNTQ0Nl9zdGF0ZSAtIGRyaXZlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWwgSS9PIGRldmljZQorICogQHNwaToJCXNwaV9kZXZpY2UKKyAqIEBjaGlwX2luZm86CQljaGlwIG1vZGVsIHNwZWNpZmljIGNvbnN0YW50cywgYXZhaWxhYmxlIG1vZGVzIGV0YworICogQHJlZzoJCXN1cHBseSByZWd1bGF0b3IKKyAqIEBwb2xsX3dvcms6CQlib3R0b20gaGFsZiBvZiBwb2xsaW5nIGludGVycnVwdCBoYW5kbGVyCisgKiBAdnJlZl9tdjoJCWFjdHVhbCByZWZlcmVuY2Ugdm9sdGFnZSB1c2VkCisgKiBAeGZlcjoJCWRlZmF1bHQgc3BpIHRyYW5zZmVyCisgKiBAbXNnOgkJZGVmYXVsdCBzcGkgbWVzc2FnZQorICogQGRhdGE6CQlzcGkgdHJhbnNtaXQgYnVmZmVyCisgKi8KKworc3RydWN0IGFkNTQ0Nl9zdGF0ZSB7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCWNvbnN0IHN0cnVjdCBhZDU0NDZfY2hpcF9pbmZvCSpjaGlwX2luZm87CisJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXBvbGxfd29yazsKKwl1bnNpZ25lZCBzaG9ydAkJCXZyZWZfbXY7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCW1zZzsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0CQlkMTY7CisJCXVuc2lnbmVkIGNoYXIJCWQyNFszXTsKKwl9IGRhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZDU0NDZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogQGJpdHM6CQlhY2N1cmFjeSBvZiB0aGUgREFDIGluIGJpdHMKKyAqIEBzdG9yYWdlYml0czoJbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiB0byB0aGUgREFDCisgKiBAbGVmdF9zaGlmdDoJCW51bWJlciBvZiBiaXRzIHRoZSBkYXR1bSBtdXN0IGJlIHNoaWZ0ZWQKKyAqIEBpbnRfdnJlZl9tdjoJQUQ1NjIwLzQwLzYwOiB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UKKyAqIEBzdG9yZV9zYW1wbGU6CWNoaXAgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9uIHRvIHN0b3JlIHRoZSBkYXR1bQorICovCisKK3N0cnVjdCBhZDU0NDZfY2hpcF9pbmZvIHsKKwl1OAkJCQliaXRzOworCXU4CQkJCXN0b3JhZ2ViaXRzOworCXU4CQkJCWxlZnRfc2hpZnQ7CisJdTE2CQkJCWludF92cmVmX212OworCXZvaWQgKCpzdG9yZV9zYW1wbGUpCQkoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCk7Cit9OworCisvKioKKyAqIGFkNTQ0Nl9zdXBwb3J0ZWRfZGV2aWNlX2lkczoKKyAqIFRoZSBBRDU2MjAvNDAvNjAgcGFydHMgYXJlIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgZml4ZWQgaW50ZXJuYWwgcmVmZXJlbmNlCisgKiB2b2x0YWdlIG9wdGlvbnMuIFRoZSBhY3R1YWwgcGFydCBudW1iZXJzIG1heSBsb29rIGRpZmZlcmVudGx5CisgKiAoYW5kIGEgYml0IGNyeXB0aWMpLCBob3dldmVyIHRoaXMgc3R5bGUgaXMgdXNlZCB0byBtYWtlIGNsZWFyIHdoaWNoCisgKiBwYXJ0cyBhcmUgc3VwcG9ydGVkIGhlcmUuCisgKi8KKworZW51bSBhZDU0NDZfc3VwcG9ydGVkX2RldmljZV9pZHMgeworCUlEX0FENTQ0NCwKKwlJRF9BRDU0NDYsCisJSURfQUQ1NTQyQSwKKwlJRF9BRDU1MTJBLAorCUlEX0FENTYyMF8yNTAwLAorCUlEX0FENTYyMF8xMjUwLAorCUlEX0FENTY0MF8yNTAwLAorCUlEX0FENTY0MF8xMjUwLAorCUlEX0FENTY2MF8yNTAwLAorCUlEX0FENTY2MF8xMjUwLAorfTsKKworI2VuZGlmIC8qIElJT19EQUNfQUQ1NDQ2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MThiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFNQSV9BRDU2MjRSX0hfCisjZGVmaW5lIFNQSV9BRDU2MjRSX0hfCisKKyNkZWZpbmUgQUQ1NjI0Ul9EQUNfQ0hBTk5FTFMJNAorCisjZGVmaW5lIEFENTYyNFJfQUREUl9EQUMwCTB4MAorI2RlZmluZSBBRDU2MjRSX0FERFJfREFDMQkweDEKKyNkZWZpbmUgQUQ1NjI0Ul9BRERSX0RBQzIJMHgyCisjZGVmaW5lIEFENTYyNFJfQUREUl9EQUMzCTB4MworI2RlZmluZSBBRDU2MjRSX0FERFJfQUxMX0RBQwkweDcKKworI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OICAgICAgICAgICAgIDB4MAorI2RlZmluZSBBRDU2MjRSX0NNRF9VUERBVEVfREFDX04gICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9BTEwgIDB4MgorI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9OICAgIDB4MworI2RlZmluZSBBRDU2MjRSX0NNRF9QT1dFUkRPV05fREFDICAgICAgICAgICAgIDB4NAorI2RlZmluZSBBRDU2MjRSX0NNRF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBBRDU2MjRSX0NNRF9MREFDX1NFVFVQICAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBBRDU2MjRSX0NNRF9JTlRFUk5BTF9SRUZFUl9TRVRVUCAgICAgIDB4NworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHJfc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWM2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQUQ1NjI0UiwgQUQ1NjQ0UiwgQUQ1NjY0UiBEaWdpdGFsIHRvIGFuYWxvZyBjb252ZXJ0b3JzIHNwaSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZGFjLmgiCisjaW5jbHVkZSAiYWQ1NjI0ci5oIgorCisvKioKKyAqIHN0cnVjdCBhZDU2MjRyX3N0YXRlIC0gZGV2aWNlIHJlbGF0ZWQgc3RvcmFnZQorICogQGluZGlvX2RldjoJYXNzb2NpYXRlZCBpbmR1c3RyaWFsIElPIGRldmljZQorICogQHVzOgkJc3BpIGRldmljZQorICoqLworc3RydWN0IGFkNTYyNHJfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnVzOworCWludCBkYXRhX2xlbjsKKwlpbnQgbGRhY19tb2RlOworCWludCBkYWNfcG93ZXJfbW9kZVtBRDU2MjRSX0RBQ19DSEFOTkVMU107CisJaW50IGludGVybmFsX3JlZjsKK307CisKK3N0YXRpYyBpbnQgYWQ1NjI0cl9zcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgdTggY21kLCB1OCBhZGRyLCB1MTYgdmFsLCB1OCBsZW4pCit7CisJdTMyIGRhdGE7CisJdTggbXNnWzNdOworCisJLyoKKwkgKiBUaGUgaW5wdXQgc2hpZnQgcmVnaXN0ZXIgaXMgMjQgYml0cyB3aWRlLiBUaGUgZmlyc3QgdHdvIGJpdHMgYXJlIGRvbid0IGNhcmUgYml0cy4KKwkgKiBUaGUgbmV4dCB0aHJlZSBhcmUgdGhlIGNvbW1hbmQgYml0cywgQzIgdG8gQzAsIGZvbGxvd2VkIGJ5IHRoZSAzLWJpdCBEQUMgYWRkcmVzcywKKwkgKiBBMiB0byBBMCwgYW5kIHRoZW4gdGhlIDE2LSwgMTQtLCAxMi1iaXQgZGF0YS13b3JkLiBUaGUgZGF0YS13b3JkIGNvbXByaXNlcyB0aGUgMTYtLAorCSAqIDE0LSwgMTItYml0IGlucHV0IGNvZGUgZm9sbG93ZWQgYnkgMCwgMiwgb3IgNCBkb24ndCBjYXJlIGJpdHMsIGZvciB0aGUgQUQ1NjY0UiwKKwkgKiBBRDU2NDRSLCBhbmQgQUQ1NjI0UiwgcmVzcGVjdGl2ZWx5LgorCSAqLworCWRhdGEgPSAoMCA8PCAyMikgfCAoY21kIDw8IDE5KSB8IChhZGRyIDw8IDE2KSB8ICh2YWwgPDwgKDE2IC0gbGVuKSk7CisJbXNnWzBdID0gZGF0YSA+PiAxNjsKKwltc2dbMV0gPSBkYXRhID4+IDg7CisJbXNnWzJdID0gZGF0YTsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCBtc2csIDMpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDU2MjRyX3dyaXRlX2RhYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJbG9uZyByZWFkaW47CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZWFkaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzdC0+dXMsIEFENTYyNFJfQ01EX1dSSVRFX0lOUFVUX05fVVBEQVRFX04sCisJCQkJdGhpc19hdHRyLT5hZGRyZXNzLCByZWFkaW4sIHN0LT5kYXRhX2xlbik7CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl9yZWFkX2xkYWNfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBzdC0+bGRhY19tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9sZGFjX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWxvbmcgcmVhZGluOworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZyZWFkaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzdC0+dXMsIEFENTYyNFJfQ01EX0xEQUNfU0VUVVAsIDAsCisJCQkJcmVhZGluICYgMHhGLCAxNik7CisJc3QtPmxkYWNfbW9kZSA9IHJlYWRpbiAmIDB4RjsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5kYWNfcG93ZXJfbW9kZVt0aGlzX2F0dHItPmFkZHJlc3NdKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIHJlYWRpbjsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlYWRpbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkNTYyNHJfc3BpX3dyaXRlKHN0LT51cywgQUQ1NjI0Ul9DTURfUE9XRVJET1dOX0RBQywgMCwKKwkJCQkoKHJlYWRpbiAmIDB4MykgPDwgNCkgfAorCQkJCSgxIDw8IHRoaXNfYXR0ci0+YWRkcmVzcyksIDE2KTsKKworCXN0LT5kYWNfcG93ZXJfbW9kZVt0aGlzX2F0dHItPmFkZHJlc3NdID0gcmVhZGluICYgMHgzOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl9yZWFkX2ludGVybmFsX3JlZl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+aW50ZXJuYWxfcmVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9pbnRlcm5hbF9yZWZfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIHJlYWRpbjsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVhZGluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ1NjI0cl9zcGlfd3JpdGUoc3QtPnVzLCBBRDU2MjRSX0NNRF9JTlRFUk5BTF9SRUZFUl9TRVRVUCwgMCwKKwkJCQkhIXJlYWRpbiwgMTYpOworCisJc3QtPmludGVybmFsX3JlZiA9ICEhcmVhZGluOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDAsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMSwgYWQ1NjI0cl93cml0ZV9kYWMsIEFENTYyNFJfQUREUl9EQUMxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JBVygyLCBhZDU2MjRyX3dyaXRlX2RhYywgQUQ1NjI0Ul9BRERSX0RBQzIpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDMsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMyk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobGRhY19tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwgYWQ1NjI0cl9yZWFkX2xkYWNfbW9kZSwKKwkJICAgICAgIGFkNTYyNHJfd3JpdGVfbGRhY19tb2RlLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZXJuYWxfcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgICAgIGFkNTYyNHJfcmVhZF9pbnRlcm5hbF9yZWZfbW9kZSwKKwkJICAgICAgIGFkNTYyNHJfd3JpdGVfaW50ZXJuYWxfcmVmX21vZGUsIDApOworCisjZGVmaW5lIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERShfbnVtLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGRhY19wb3dlcl9tb2RlXyMjX251bSwgU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUl9NT0RFKDAsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZSwKKwkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcl9tb2RlLCAwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSX01PREUoMSwgYWQ1NjI0cl9yZWFkX2RhY19wb3dlcl9tb2RlLAorCQkJCSAgIGFkNTYyNHJfd3JpdGVfZGFjX3Bvd2VyX21vZGUsIDEpOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERSgyLCBhZDU2MjRyX3JlYWRfZGFjX3Bvd2VyX21vZGUsCisJCQkJICAgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZSwgMik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUl9NT0RFKDMsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZSwKKwkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcl9tb2RlLCAzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTYyNHJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfb3V0MF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dDFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQyX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0M19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xkYWNfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW50ZXJuYWxfcmVmLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTYyNHJfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNTYyNHJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTYyNHJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3Q7CisJaW50IHJldCA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwlzdC0+ZGF0YV9sZW4gPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKworCXN0LT51cyA9IHNwaTsKKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNTYyNHJfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMDsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDU2MjRyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ1NjI0cl9pZFtdID0geworCXsiYWQ1NjI0ciIsIDEyfSwKKwl7ImFkNTY0NHIiLCAxNH0sCisJeyJhZDU2NjRyIiwgMTZ9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ1NjI0cl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiYWQ1NjI0ciIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICB9LAorCS5wcm9iZSA9IGFkNTYyNHJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNTYyNHJfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDU2MjRyX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ1NjI0cl9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDU2MjRyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDU2MjRyX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNTYyNHJfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNTYyNHJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTYyNHJfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ1NjI0LzQ0LzY0UiBEQUMgc3BpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvZGFjLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9kYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgyZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvZGFjLmgKQEAgLTAsMCArMSw2IEBACisvKgorICogZGFjLmggLSBzeXNmcyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBEQUNzCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUX1JBVyhfbnVtLCBfc3RvcmUsIF9hZGRyKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dCMjX251bSMjX3JhdywgU19JV1VTUiwgTlVMTCwgX3N0b3JlLCBfYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDdkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnCkBAIC0wLDAgKzEsNTYgQEAKKyMKKyMgRGlyZWN0IERpZ2l0YWwgU3ludGhlc2lzIGRyaXZlcnMKKyMKK2NvbW1lbnQgIkRpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyIKKworY29uZmlnIEFENTkzMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDU5MzAvNTkzMiBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkNTkzMC9hZDU5MzIsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODMyCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTgzMi81IGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODMyIGFuZCBhZDk4MzUsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODM0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTgzMy80LyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIEFEOTgzMyBhbmQgQUQ5ODM0LCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ5ODM0LgorCitjb25maWcgQUQ5ODUwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTg1MC8xIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODUwLzEsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODUyCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTg1Mi80IGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODUyLzQsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5OTEwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTkxMCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTkxMCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDk5NTEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ5OTUxIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5OTUxLCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDU5MzApICs9IGFkNTkzMC5vCitvYmotJChDT05GSUdfQUQ5ODMyKSArPSBhZDk4MzIubworb2JqLSQoQ09ORklHX0FEOTgzNCkgKz0gYWQ5ODM0Lm8KK29iai0kKENPTkZJR19BRDk4NTApICs9IGFkOTg1MC5vCitvYmotJChDT05GSUdfQUQ5ODUyKSArPSBhZDk4NTIubworb2JqLSQoQ09ORklHX0FEOTkxMCkgKz0gYWQ5OTEwLm8KK29iai0kKENPTkZJR19BRDk5NTEpICs9IGFkOTk1MS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkNTkzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDAzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDU5MzAKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQ1OTMwIgorCisjZGVmaW5lIHZhbHVlX21hc2sgKHUxNikweGYwMDAKKyNkZWZpbmUgYWRkcl9zaGlmdCAxMgorCisvKiBSZWdpc3RlciBmb3JtYXQ6IDQgYml0cyBhZGRyICsgMTIgYml0cyB2YWx1ZSAqLworc3RydWN0IGFkNTkwM19jb25maWcgeworCXUxNiBjb250cm9sOworCXUxNiBpbmNudW07CisJdTE2IGZycWRlbHRbMl07CisJdTE2IGluY2l0dmw7CisJdTE2IGJ1cml0dmw7CisJdTE2IHN0cnRmcnFbMl07Cit9OworCitzdHJ1Y3QgYWQ1OTMwX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkNTkzMF9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDU5MDNfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkNTkwM19jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1OTMwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJY29uZmlnLT5jb250cm9sID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKTsKKwljb25maWctPmluY251bSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAoMSA8PCBhZGRyX3NoaWZ0KTsKKwljb25maWctPmZycWRlbHRbMF0gPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgKDIgPDwgYWRkcl9zaGlmdCk7CisJY29uZmlnLT5mcnFkZWx0WzFdID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8IDMgPDwgYWRkcl9zaGlmdDsKKwljb25maWctPmluY2l0dmwgPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgNCA8PCBhZGRyX3NoaWZ0OworCWNvbmZpZy0+YnVyaXR2bCA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCA4IDw8IGFkZHJfc2hpZnQ7CisJY29uZmlnLT5zdHJ0ZnJxWzBdID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8IDB4YyA8PCBhZGRyX3NoaWZ0OworCWNvbmZpZy0+c3RydGZycVsxXSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAweGQgPDwgYWRkcl9zaGlmdDsKKworCXhmZXIubGVuID0gbGVuOworCXhmZXIudHhfYnVmID0gY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDU5MzBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDU5MzBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTkzMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDU5MzBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTkzMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU5MzBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDU5MzBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ1OTMwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU5MzBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ1OTMwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkNTkzMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ1OTMwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDU5MzBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ1OTMwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDU5MzBfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ1OTMwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDU5MzBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTkzMF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDU5MzAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTE4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDk4MzIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTgzMiIKKworI2RlZmluZSB2YWx1ZV9tYXNrICh1MTYpMHhmMDAwCisjZGVmaW5lIGNtZF9zaGlmdCAxMgorI2RlZmluZSBhZGRfc2hpZnQgOAorI2RlZmluZSBBRDk4MzJfU1lOQyAoMSA8PCAxMykKKyNkZWZpbmUgQUQ5ODMyX1NFTFNSQyAoMSA8PCAxMikKKyNkZWZpbmUgQUQ5ODMyX1NMRUVQICgxIDw8IDEzKQorI2RlZmluZSBBRDk4MzJfUkVTRVQgKDEgPDwgMTIpCisjZGVmaW5lIEFEOTgzMl9DTFIgKDEgPDwgMTEpCisKKyNkZWZpbmUgQUREX0ZSRVEwTEwgMHgwCisjZGVmaW5lIEFERF9GUkVRMEhMIDB4MQorI2RlZmluZSBBRERfRlJFUTBMTSAweDIKKyNkZWZpbmUgQUREX0ZSRVEwSE0gMHgzCisjZGVmaW5lIEFERF9GUkVRMUxMIDB4NAorI2RlZmluZSBBRERfRlJFUTFITCAweDUKKyNkZWZpbmUgQUREX0ZSRVExTE0gMHg2CisjZGVmaW5lIEFERF9GUkVRMUhNIDB4NworI2RlZmluZSBBRERfUEhBU0UwTCAweDgKKyNkZWZpbmUgQUREX1BIQVNFMEggMHg5CisjZGVmaW5lIEFERF9QSEFTRTFMIDB4YQorI2RlZmluZSBBRERfUEhBU0UxSCAweGIKKyNkZWZpbmUgQUREX1BIQVNFMkwgMHhjCisjZGVmaW5lIEFERF9QSEFTRTJIIDB4ZAorI2RlZmluZSBBRERfUEhBU0UzTCAweGUKKyNkZWZpbmUgQUREX1BIQVNFM0ggMHhmCisKKyNkZWZpbmUgQ01EX1BIQThCSVRTVyAweDEKKyNkZWZpbmUgQ01EX1BIQTE2QklUU1cgMHgwCisjZGVmaW5lIENNRF9GUkU4QklUU1cgMHgzCisjZGVmaW5lIENNRF9GUkUxNkJJVFNXIDB4MgorI2RlZmluZSBDTURfU0VMQklUU0NUTCAweDYKKworc3RydWN0IGFkOTgzMl9zZXR0aW5nIHsKKwl1MTYgZnJlcTBbNF07CisJdTE2IGZyZXExWzRdOworCXUxNiBwaGFzZTBbMl07CisJdTE2IHBoYXNlMVsyXTsKKwl1MTYgcGhhc2UyWzJdOworCXUxNiBwaGFzZTNbMl07Cit9OworCitzdHJ1Y3QgYWQ5ODMyX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTgzMl9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk4MzJfc2V0dGluZyBjb25maWc7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJY29uZmlnLmZyZXEwWzBdID0gKENNRF9GUkU4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwTEwgPDwgYWRkX3NoaWZ0IHwgYnVmWzBdKTsKKwljb25maWcuZnJlcTBbMV0gPSAoQ01EX0ZSRTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwSEwgPDwgYWRkX3NoaWZ0IHwgYnVmWzFdKTsKKwljb25maWcuZnJlcTBbMl0gPSAoQ01EX0ZSRThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTBMTSA8PCBhZGRfc2hpZnQgfCBidWZbMl0pOworCWNvbmZpZy5mcmVxMFszXSA9IChDTURfRlJFMTZCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTBITSA8PCBhZGRfc2hpZnQgfCBidWZbM10pOworCWNvbmZpZy5mcmVxMVswXSA9IChDTURfRlJFOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUxMIDw8IGFkZF9zaGlmdCB8IGJ1Zls0XSk7CisJY29uZmlnLmZyZXExWzFdID0gKENNRF9GUkUxNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUhMIDw8IGFkZF9zaGlmdCB8IGJ1Zls1XSk7CisJY29uZmlnLmZyZXExWzJdID0gKENNRF9GUkU4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVExTE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzZdKTsKKwljb25maWcuZnJlcTFbM10gPSAoQ01EX0ZSRTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVExSE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzddKTsKKworCWNvbmZpZy5waGFzZTBbMF0gPSAoQ01EX1BIQThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfUEhBU0UwTCA8PCBhZGRfc2hpZnQgfCBidWZbOV0pOworCWNvbmZpZy5waGFzZTBbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMEggPDwgYWRkX3NoaWZ0IHwgYnVmWzEwXSk7CisJY29uZmlnLnBoYXNlMVswXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTFMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxMV0pOworCWNvbmZpZy5waGFzZTFbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMUggPDwgYWRkX3NoaWZ0IHwgYnVmWzEyXSk7CisJY29uZmlnLnBoYXNlMlswXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTJMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxM10pOworCWNvbmZpZy5waGFzZTJbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMkggPDwgYWRkX3NoaWZ0IHwgYnVmWzE0XSk7CisJY29uZmlnLnBoYXNlM1swXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTNMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxNV0pOworCWNvbmZpZy5waGFzZTNbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFM0ggPDwgYWRkX3NoaWZ0IHwgYnVmWzE2XSk7CisKKwl4ZmVyLmxlbiA9IDIgKiBsZW47CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzJfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4MzJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTgzMl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4MzJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyB2b2lkIGFkOTgzMl9pbml0KHN0cnVjdCBhZDk4MzJfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTE2IGNvbmZpZyA9IDA7CisKKwljb25maWcgPSAweDMgPDwgMTQgfCBBRDk4MzJfU0xFRVAgfCBBRDk4MzJfUkVTRVQgfCBBRDk4MzJfQ0xSOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJeGZlci5sZW4gPSAyOworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNvbmZpZyA9IDB4MiA8PCAxNCB8IEFEOTgzMl9TWU5DIHwgQUQ5ODMyX1NFTFNSQzsKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJY29uZmlnID0gQ01EX1NFTEJJVFNDVEwgPDwgY21kX3NoaWZ0OworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWc7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljb25maWcgPSAweDMgPDwgMTQ7CisKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk4MzJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5ODMyX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gMTY7CisJc3BpX3NldHVwKHNwaSk7CisJYWQ5ODMyX2luaXQoc3QpOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ5ODMyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4MzJfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODMyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkOTgzMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ5ODMyX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDk4MzJfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODMyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4MzJfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ5ODMyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDk4MzJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkOTgzMl9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDk4MzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWE2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYwpAQCAtMCwwICsxLDQ3NyBAQAorLyoKKyAqIEFEOTgzNCBTUEkgREFDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImRkcy5oIgorCisjaW5jbHVkZSAiYWQ5ODM0LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQ5ODM0X2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKiAodTY0KSAoMSA8PCBBRDk4MzRfRlJFUV9CSVRTKTsKKwlkb19kaXYoZnJlcXJlZywgbWNsayk7CisJcmV0dXJuIGZyZXFyZWc7Cit9CisKK3N0YXRpYyBpbnQgYWQ5ODM0X3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBmb3V0KQoreworCXVuc2lnbmVkIGxvbmcgcmVndmFsOworCisJaWYgKGZvdXQgPiAoc3QtPm1jbGsgLyAyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWd2YWwgPSBhZDk4MzRfY2FsY19mcmVxcmVnKHN0LT5tY2xrLCBmb3V0KTsKKworCXN0LT5mcmVxX2RhdGFbMF0gPSBjcHVfdG9fYmUxNihhZGRyIHwgKHJlZ3ZhbCAmCisJCQkJICAgICAgIFJFU19NQVNLKEFEOTgzNF9GUkVRX0JJVFMgLyAyKSkpOworCXN0LT5mcmVxX2RhdGFbMV0gPSBjcHVfdG9fYmUxNihhZGRyIHwgKChyZWd2YWwgPj4KKwkJCQkgICAgICAgKEFEOTgzNF9GUkVRX0JJVFMgLyAyKSkgJgorCQkJCSAgICAgICBSRVNfTUFTSyhBRDk4MzRfRlJFUV9CSVRTIC8gMikpKTsKKworCXJldHVybiBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPmZyZXFfbXNnKTs7Cit9CisKK3N0YXRpYyBpbnQgYWQ5ODM0X3dyaXRlX3BoYXNlKHN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoYXNlKQoreworCWlmIChwaGFzZSA+ICgxIDw8IEFEOTgzNF9QSEFTRV9CSVRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihhZGRyIHwgcGhhc2UpOworCisJcmV0dXJuIHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ5ODM0X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwlzd2l0Y2ggKHRoaXNfYXR0ci0+YWRkcmVzcykgeworCWNhc2UgQUQ5ODM0X1JFR19GUkVRMDoKKwljYXNlIEFEOTgzNF9SRUdfRlJFUTE6CisJCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfUkVHX1BIQVNFMDoKKwljYXNlIEFEOTgzNF9SRUdfUEhBU0UxOgorCQlyZXQgPSBhZDk4MzRfd3JpdGVfcGhhc2Uoc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfT1BCSVRFTjoKKwkJaWYgKHN0LT5jb250cm9sICYgQUQ5ODM0X01PREUpIHsKKwkJCXJldCA9IC1FSU5WQUw7ICAvKiBBRDk4NDMgcmVzZXJ2ZWQgbW9kZSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsKQorCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X09QQklURU47CisJCWVsc2UKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfT1BCSVRFTjsKKworCQlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCQlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X1BJTl9TVzoKKwkJaWYgKHZhbCkKKwkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9QSU5fU1c7CisJCWVsc2UKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfUElOX1NXOworCQlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCQlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X0ZTRUw6CisJY2FzZSBBRDk4MzRfUFNFTDoKKwkJaWYgKHZhbCA9PSAwKQorCQkJc3QtPmNvbnRyb2wgJj0gfih0aGlzX2F0dHItPmFkZHJlc3MgfCBBRDk4MzRfUElOX1NXKTsKKwkJZWxzZSBpZiAodmFsID09IDEpIHsKKwkJCXN0LT5jb250cm9sIHw9IHRoaXNfYXR0ci0+YWRkcmVzczsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfUElOX1NXOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfUkVTRVQ6CisJCWlmICh2YWwpCisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1JFU0VUOworCQllbHNlCisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfUkVTRVQ7CisKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCX0KKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc3RvcmVfd2F2ZXR5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0ID0gMDsKKwlib29sIGlzX2FkOTgzMyA9IHN0LT5kZXZpZCA9PSBJRF9BRDk4MzM7CisKKwltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIDA6CisJCWlmIChzeXNmc19zdHJlcShidWYsICJzaW5lIikpIHsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKKwkJCWlmIChpc19hZDk4MzMpCisJCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9PUEJJVEVOOworCQl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInRyaWFuZ2xlIikpIHsKKwkJCWlmIChpc19hZDk4MzMpIHsKKwkJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X09QQklURU47CisJCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X01PREU7CisJCQl9IGVsc2UgaWYgKHN0LT5jb250cm9sICYgQUQ5ODM0X09QQklURU4pIHsKKwkJCQlyZXQgPSAtRUlOVkFMOwkvKiBBRDk4NDMgcmVzZXJ2ZWQgbW9kZSAqLworCQkJfSBlbHNlIHsKKwkJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfTU9ERTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpc19hZDk4MzMgJiYgc3lzZnNfc3RyZXEoYnVmLCAic3F1YXJlIikpIHsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKKwkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9PUEJJVEVOOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInNxdWFyZSIpICYmCisJCQkhKHN0LT5jb250cm9sICYgQUQ5ODM0X01PREUpKSB7CisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X01PREU7CisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfT1BCSVRFTjsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZXQpIHsKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCX0KKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNwaV9nZXRfZGV2aWNlX2lkKHN0LT5zcGkpLT5uYW1lKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ5ODM0X3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkOTgzNF9zaG93X291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJY2hhciAqc3RyOworCisJaWYgKHN0LT5kZXZpZCA9PSBJRF9BRDk4MzMpCisJCXN0ciA9ICJzaW5lIHRyaWFuZ2xlIHNxdWFyZSI7CisJZWxzZSBpZiAoc3QtPmNvbnRyb2wgJiBBRDk4MzRfT1BCSVRFTikKKwkJc3RyID0gInNpbmUiOworCWVsc2UKKwkJc3RyID0gInNpbmUgdHJpYW5nbGUiOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMwX291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlLCBTX0lSVUdPLAorCQkgICAgICAgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc2hvd19vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCWNoYXIgKnN0cjsKKworCWlmIChzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKQorCQlzdHIgPSAiIjsKKwllbHNlCisJCXN0ciA9ICJzcXVhcmUiOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzMF9vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZSwgU19JUlVHTywKKwkJICAgICAgIGFkOTgzNF9zaG93X291dDFfd2F2ZXR5cGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKKworLyoqCisgKiBzZWUgZGRzLmggZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0ZSRVEoMCwgMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVHX0ZSRVEwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfRlJFUSgwLCAxLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9SRUdfRlJFUTEpOworc3RhdGljIElJT19ERVZfQVRUUl9GUkVRU1lNQk9MKDAsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X0ZTRUwpOworc3RhdGljIElJT19DT05TVF9BVFRSX0ZSRVFfU0NBTEUoMCwgIjEiKTsgLyogMUh6ICovCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhBU0UoMCwgMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVHX1BIQVNFMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BIQVNFKDAsIDEsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X1JFR19QSEFTRTEpOworc3RhdGljIElJT19ERVZfQVRUUl9QSEFTRVNZTUJPTCgwLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9QU0VMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9QSEFTRV9TQ0FMRSgwLCAiMC4wMDE1MzM5ODA4Iik7IC8qIDJQSS8yXjEyIHJhZCovCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9FTigwLCBTX0lXVVNSLCBOVUxMLAorCWFkOTgzNF93cml0ZSwgQUQ5ODM0X1BJTl9TVyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9FTkFCTEUoMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVTRVQpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRZX0VOQUJMRSgwLCAxLCBTX0lXVVNSLCBOVUxMLAorCWFkOTgzNF93cml0ZSwgQUQ5ODM0X09QQklURU4pOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfV0FWRVRZUEUoMCwgMCwgYWQ5ODM0X3N0b3JlX3dhdmV0eXBlLCAwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1dBVkVUWVBFKDAsIDEsIGFkOTgzNF9zdG9yZV93YXZldHlwZSwgMSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4MzRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzMF9mcmVxMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9mcmVxMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9kZHMwX2ZyZXFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfcGhhc2UwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX3BoYXNlMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9kZHMwX3BoYXNlX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX3BpbmNvbnRyb2xfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfZnJlcXN5bWJvbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9waGFzZXN5bWJvbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXRfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX291dDFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX291dDBfd2F2ZXR5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfb3V0MV93YXZldHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgbW9kZV90IGFkOTgzNF9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmIChzdC0+ZGV2aWQgPT0gSURfQUQ5ODM0KQorCQlyZXR1cm4gbW9kZTsKKworCWlmICgoYXR0ciA9PSAmaWlvX2Rldl9hdHRyX2RkczBfb3V0MV9lbmFibGUuZGV2X2F0dHIuYXR0cikgfHwKKwkJKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9kZHMwX291dDFfd2F2ZXR5cGUuZGV2X2F0dHIuYXR0cikgfHwKKwkJKGF0dHIgPT0KKwkJJmlpb19kZXZfYXR0cl9kZHMwX291dDFfd2F2ZXR5cGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIpKQorCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk4MzRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkOTgzNF9hdHRyaWJ1dGVzLAorCS5pc192aXNpYmxlID0gYWQ5ODM0X2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTgzNF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4MzRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0OworCWludCByZXQ7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisJfQorCisJc3QtPm1jbGsgPSBwZGF0YS0+bWNsazsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCXN0LT5zcGkgPSBzcGk7CisJc3QtPmRldmlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGE7CisKKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkOTgzNF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKSBzdDsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCS8qIFNldHVwIGRlZmF1bHQgbWVzc2FnZXMgKi8KKworCXN0LT54ZmVyLnR4X2J1ZiA9ICZzdC0+ZGF0YTsKKwlzdC0+eGZlci5sZW4gPSAyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmc3QtPm1zZyk7CisKKwlzdC0+ZnJlcV94ZmVyWzBdLnR4X2J1ZiA9ICZzdC0+ZnJlcV9kYXRhWzBdOworCXN0LT5mcmVxX3hmZXJbMF0ubGVuID0gMjsKKwlzdC0+ZnJlcV94ZmVyWzBdLmNzX2NoYW5nZSA9IDE7CisJc3QtPmZyZXFfeGZlclsxXS50eF9idWYgPSAmc3QtPmZyZXFfZGF0YVsxXTsKKwlzdC0+ZnJlcV94ZmVyWzFdLmxlbiA9IDI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZzdC0+ZnJlcV9tc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+ZnJlcV94ZmVyWzBdLCAmc3QtPmZyZXFfbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPmZyZXFfeGZlclsxXSwgJnN0LT5mcmVxX21zZyk7CisKKwlzdC0+Y29udHJvbCA9IEFEOTgzNF9CMjggfCBBRDk4MzRfUkVTRVQ7CisKKwlpZiAoIXBkYXRhLT5lbl9kaXYyKQorCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfRElWMjsKKworCWlmICghcGRhdGEtPmVuX3NpZ25iaXRfbXNiX291dCAmJiAoc3QtPmRldmlkID09IElEX0FEOTgzNCkpCisJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9TSUdOX1BJQjsKKworCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJkZXZpY2UgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCX0KKworCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIEFEOTgzNF9SRUdfRlJFUTAsIHBkYXRhLT5mcmVxMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIEFEOTgzNF9SRUdfRlJFUTEsIHBkYXRhLT5mcmVxMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGFkOTgzNF93cml0ZV9waGFzZShzdCwgQUQ5ODM0X1JFR19QSEFTRTAsIHBkYXRhLT5waGFzZTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXZpY2U7CisKKwlyZXQgPSBhZDk4MzRfd3JpdGVfcGhhc2Uoc3QsIEFEOTgzNF9SRUdfUEhBU0UxLCBwZGF0YS0+cGhhc2UxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2aWNlOgorCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2Rpc2FibGVfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKK2Vycm9yX3B1dF9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTgzNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCX0KKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDk4MzRfaWRbXSA9IHsKKwl7ImFkOTgzMyIsIElEX0FEOTgzM30sCisJeyJhZDk4MzQiLCBJRF9BRDk4MzR9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODM0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDk4MzQiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQ5ODM0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ5ODM0X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYWQ5ODM0X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ5ODM0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODM0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4MzRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZDk4MzRfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODM0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4MzRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEOTgzMy9BRDk4MzQgRERTIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInNwaTphZDk4MzQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjM2I4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQUQ5ODM0IFNQSSBERFMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fRERTX0FEOTgzNF9IXworI2RlZmluZSBJSU9fRERTX0FEOTgzNF9IXworCisvKiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBBRDk4MzRfUkVHX0NNRAkJKDAgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfRlJFUTAJKDEgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfRlJFUTEJKDIgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UwCSg2IDw8IDEzKQorI2RlZmluZSBBRDk4MzRfUkVHX1BIQVNFMQkoNyA8PCAxMykKKworLyogQ29tbWFuZCBDb250cm9sIEJpdHMgKi8KKworI2RlZmluZSBBRDk4MzRfQjI4CQkoMSA8PCAxMykKKyNkZWZpbmUgQUQ5ODM0X0hMQgkJKDEgPDwgMTIpCisjZGVmaW5lIEFEOTgzNF9GU0VMCQkoMSA8PCAxMSkKKyNkZWZpbmUgQUQ5ODM0X1BTRUwJCSgxIDw8IDEwKQorI2RlZmluZSBBRDk4MzRfUElOX1NXCQkoMSA8PCA5KQorI2RlZmluZSBBRDk4MzRfUkVTRVQJCSgxIDw8IDgpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEJCSgxIDw8IDcpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQkoMSA8PCA2KQorI2RlZmluZSBBRDk4MzRfT1BCSVRFTgkJKDEgPDwgNSkKKyNkZWZpbmUgQUQ5ODM0X1NJR05fUElCCQkoMSA8PCA0KQorI2RlZmluZSBBRDk4MzRfRElWMgkJKDEgPDwgMykKKyNkZWZpbmUgQUQ5ODM0X01PREUJCSgxIDw8IDEpCisKKyNkZWZpbmUgQUQ5ODM0X0ZSRVFfQklUUwkyOAorI2RlZmluZSBBRDk4MzRfUEhBU0VfQklUUwkxMgorCisjZGVmaW5lIFJFU19NQVNLKGJpdHMpCSgoMSA8PCAoYml0cykpIC0gMSkKKworLyoqCisgKiBzdHJ1Y3QgYWQ5ODM0X3N0YXRlIC0gZHJpdmVyIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBpbmRpb19kZXY6CQl0aGUgaW5kdXN0cmlhbCBJL08gZGV2aWNlCisgKiBAc3BpOgkJc3BpX2RldmljZQorICogQHJlZzoJCXN1cHBseSByZWd1bGF0b3IKKyAqIEBtY2xrOgkJZXh0ZXJuYWwgbWFzdGVyIGNsb2NrCisgKiBAY29udHJvbDoJCWNhY2hlZCBjb250cm9sIHdvcmQKKyAqIEB4ZmVyOgkJZGVmYXVsdCBzcGkgdHJhbnNmZXIKKyAqIEBtc2c6CQlkZWZhdWx0IHNwaSBtZXNzYWdlCisgKiBAZnJlcV94ZmVyOgkJdHVuaW5nIHdvcmQgc3BpIHRyYW5zZmVyCisgKiBAZnJlcV9tc2c6CQl0dW5pbmcgd29yZCBzcGkgbWVzc2FnZQorICogQGRhdGE6CQlzcGkgdHJhbnNtaXQgYnVmZmVyCisgKiBAZnJlcV9kYXRhOgkJdHVuaW5nIHdvcmQgc3BpIHRyYW5zbWl0IGJ1ZmZlcgorICovCisKK3N0cnVjdCBhZDk4MzRfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOworCXVuc2lnbmVkIGludAkJCW1jbGs7CisJdW5zaWduZWQgc2hvcnQJCQljb250cm9sOworCXVuc2lnbmVkIHNob3J0CQkJZGV2aWQ7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCW1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQlmcmVxX3hmZXJbMl07CisJc3RydWN0IHNwaV9tZXNzYWdlCQlmcmVxX21zZzsKKworCS8qCisJICogRE1BICh0aHVzIGNhY2hlIGNvaGVyZW5jeSBtYWludGVuYW5jZSkgcmVxdWlyZXMgdGhlCisJICogdHJhbnNmZXIgYnVmZmVycyB0byBsaXZlIGluIHRoZWlyIG93biBjYWNoZSBsaW5lcy4KKwkgKi8KKwl1bnNpZ25lZCBzaG9ydAkJCWRhdGEgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXVuc2lnbmVkIHNob3J0CQkJZnJlcV9kYXRhWzJdIDsKK307CisKKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgYWQ5ODM0X3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogQG1jbGs6CQltYXN0ZXIgY2xvY2sgaW4gSHoKKyAqIEBmcmVxMDoJCXBvd2VyIHVwIGZyZXEwIHR1bmluZyB3b3JkIGluIEh6CisgKiBAZnJlcTE6CQlwb3dlciB1cCBmcmVxMSB0dW5pbmcgd29yZCBpbiBIegorICogQHBoYXNlMDoJCXBvd2VyIHVwIHBoYXNlMCB2YWx1ZSBbMC4uNDA5NV0gY29ycmVsYXRlcyB3aXRoIDAuLjJQSQorICogQHBoYXNlMToJCXBvd2VyIHVwIHBoYXNlMSB2YWx1ZSBbMC4uNDA5NV0gY29ycmVsYXRlcyB3aXRoIDAuLjJQSQorICogQGVuX2RpdjI6CQlkaWdpdGFsIG91dHB1dC8yIGlzIHBhc3NlZCB0byB0aGUgU0lHTiBCSVQgT1VUIHBpbgorICogQGVuX3NpZ25iaXRfbXNiX291dDoJdGhlIE1TQiAob3IgTVNCLzIpIG9mIHRoZSBEQUMgZGF0YSBpcyBjb25uZWN0ZWQgdG8gdGhlCisgKgkJCVNJR04gQklUIE9VVCBwaW4uIGVuX2RpdjIgY29udHJvbHMgd2hldGhlciBpdCBpcyB0aGUgTVNCCisgKgkJCW9yIE1TQi8yIHRoYXQgaXMgb3V0cHV0LiBpZiBlbl9zaWduYml0X21zYl9vdXQ9ZmFsc2UsCisgKgkJCXRoZSBvbi1ib2FyZCBjb21wYXJhdG9yIGlzIGNvbm5lY3RlZCB0byBTSUdOIEJJVCBPVVQKKyAqLworCitzdHJ1Y3QgYWQ5ODM0X3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludAkJbWNsazsKKwl1bnNpZ25lZCBpbnQJCWZyZXEwOworCXVuc2lnbmVkIGludAkJZnJlcTE7CisJdW5zaWduZWQgc2hvcnQJCXBoYXNlMDsKKwl1bnNpZ25lZCBzaG9ydAkJcGhhc2UxOworCWJvb2wJCQllbl9kaXYyOworCWJvb2wJCQllbl9zaWduYml0X21zYl9vdXQ7Cit9OworCisvKioKKyAqIGFkOTgzNF9zdXBwb3J0ZWRfZGV2aWNlX2lkczoKKyAqLworCitlbnVtIGFkOTgzNF9zdXBwb3J0ZWRfZGV2aWNlX2lkcyB7CisJSURfQUQ5ODMzLAorCUlEX0FEOTgzNCwKK307CisKKyNlbmRpZiAvKiBJSU9fRERTX0FEOTgzNF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU5YmZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5ODUwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTg1MCIKKworI2RlZmluZSB2YWx1ZV9tYXNrICh1MTYpMHhmMDAwCisjZGVmaW5lIGFkZHJfc2hpZnQgMTIKKworLyogUmVnaXN0ZXIgZm9ybWF0OiA0IGJpdHMgYWRkciArIDEyIGJpdHMgdmFsdWUgKi8KK3N0cnVjdCBhZDk4NTBfY29uZmlnIHsKKwl1OCBjb250cm9sWzVdOworfTsKKworc3RydWN0IGFkOTg1MF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDk4NTBfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ5ODUwX2NvbmZpZyAqY29uZmlnID0gKHN0cnVjdCBhZDk4NTBfY29uZmlnICopYnVmOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTg1MF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gbGVuOworCXhmZXIudHhfYnVmID0gY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk4NTBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4NTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTg1MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4NTBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTg1MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk4NTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ5ODUwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkOTg1MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ5ODUwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDk4NTBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODUwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4NTBfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ5ODUwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDk4NTBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkOTg1MF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDk4NTAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NGZiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDk4NTIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTg1MiIKKworI2RlZmluZSBhZGRyX3BoYWFkMSAweDAKKyNkZWZpbmUgYWRkcl9waGFhZDIgMHgxCisjZGVmaW5lIGFkZHJfZnJldHUxIDB4MgorI2RlZmluZSBhZGRyX2ZyZXR1MiAweDMKKyNkZWZpbmUgYWRkcl9kZWxmcmUgMHg0CisjZGVmaW5lIGFkZHJfdXBkY2xrIDB4NQorI2RlZmluZSBhZGRyX3JhbWNsayAweDYKKyNkZWZpbmUgYWRkcl9jb250cmwgMHg3CisjZGVmaW5lIGFkZHJfb3B0c2ttIDB4OAorI2RlZmluZSBhZGRyX29wdHNrciAweGEKKyNkZWZpbmUgYWRkcl9kYWNjdGwgMHhiCisKKyNkZWZpbmUgQ09NUFBECQkoMSA8PCA0KQorI2RlZmluZSBSRUZNVUxUMgkoMSA8PCAyKQorI2RlZmluZSBCWVBQTEwJCSgxIDw8IDUpCisjZGVmaW5lIFBMTFJBTkcJCSgxIDw8IDYpCisjZGVmaW5lIElFVVBDTEsJCSgxKQorI2RlZmluZSBPU0tFTgkJKDEgPDwgNSkKKworI2RlZmluZSByZWFkX2JpdAkoMSA8PCA3KQorCisvKiBSZWdpc3RlciBmb3JtYXQ6IDEgYnl0ZSBhZGRyICsgdmFsdWUgKi8KK3N0cnVjdCBhZDk4NTJfY29uZmlnIHsKKwl1OCBwaGFqc3QwWzNdOworCXU4IHBoYWpzdDFbM107CisJdTggZnJldHVuMVs2XTsKKwl1OCBmcmV0dW4yWzZdOworCXU4IGRsdGFmcmVbNl07CisJdTggdXBkdGNsa1s1XTsKKwl1OCByYW1wcmF0WzRdOworCXU4IGNvbnRyb2xbNV07CisJdTggb3V0cHNrbVszXTsKKwl1OCBvdXRwc2tyWzJdOworCXU4IGRhY2NudGxbM107Cit9OworCitzdHJ1Y3QgYWQ5ODUyX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTg1Ml9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk4NTJfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkOTg1Ml9jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODUyX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+cGhhanN0MFswXTsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5waGFqc3QxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA2OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZnJldHVuMVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmZyZXR1bjJbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDY7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kbHRhZnJlWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+dXBkdGNsa1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNDsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnJhbXByYXRbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5jb250cm9sWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+b3V0cHNrbVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPm91dHBza3JbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kYWNjbnRsWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMsIFNfSVdVU1IsIE5VTEwsIGFkOTg1Ml9zZXRfcGFyYW1ldGVyLCAwKTsKKworc3RhdGljIHZvaWQgYWQ5ODUyX2luaXQoc3RydWN0IGFkOTg1Ml9zdGF0ZSAqc3QpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwl1OCBjb25maWdbNV07CisKKwljb25maWdbMF0gPSBhZGRyX2NvbnRybDsKKwljb25maWdbMV0gPSBDT01QUEQ7CisJY29uZmlnWzJdID0gUkVGTVVMVDIgfCBCWVBQTEwgfCBQTExSQU5HOworCWNvbmZpZ1szXSA9IElFVVBDTEs7CisJY29uZmlnWzRdID0gT1NLRU47CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKworCit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4NTJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTg1Ml9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4NTJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTg1Ml9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTJfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk4NTJfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCWFkOTg1Ml9pbml0KHN0KTsKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTg1Ml9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODUyX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTg1Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk4NTJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTg1Ml9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5ODUyX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTg1Ml9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5ODUyX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTg1Ml9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODUyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4NTJfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5ODUyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZiNzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTEwLmMKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5OTEwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk5MTAiCisKKyNkZWZpbmUgQ0ZSMSAweDAKKyNkZWZpbmUgQ0ZSMiAweDEKKyNkZWZpbmUgQ0ZSMyAweDIKKworI2RlZmluZSBBVVhEQUMgMHgzCisjZGVmaW5lIElPVVBEIDB4NAorI2RlZmluZSBGVFcgMHg3CisjZGVmaW5lIFBPVyAweDgKKyNkZWZpbmUgQVNGIDB4OQorI2RlZmluZSBNVUxUQyAweDBBCisjZGVmaW5lIERJR19SQU1QTCAweDBCCisjZGVmaW5lIERJR19SQU1QUyAweDBDCisjZGVmaW5lIERJR19SQU1QUiAweDBECisjZGVmaW5lIFNJTl9UT05FUDAgMHgwRQorI2RlZmluZSBTSU5fVE9ORVAxIDB4MEYKKyNkZWZpbmUgU0lOX1RPTkVQMiAweDEwCisjZGVmaW5lIFNJTl9UT05FUDMgMHgxMQorI2RlZmluZSBTSU5fVE9ORVA0IDB4MTIKKyNkZWZpbmUgU0lOX1RPTkVQNSAweDEzCisjZGVmaW5lIFNJTl9UT05FUDYgMHgxNAorI2RlZmluZSBTSU5fVE9ORVA3IDB4MTUKKworI2RlZmluZSBSQU1fRU5BQkxFCSgxIDw8IDcpCisKKyNkZWZpbmUgTUFOVUFMX09TSwkoMSA8PCA3KQorI2RlZmluZSBJTlZTSUMJCSgxIDw8IDYpCisjZGVmaW5lIEREU19TSU5FT1AJKDEpCisKKyNkZWZpbmUgQVVUT19PU0sJKDEpCisjZGVmaW5lIE9TS0VOCQkoMSA8PCAxKQorI2RlZmluZSBMT0FEX0FSUgkoMSA8PCAyKQorI2RlZmluZSBDTFJfUEhBCQkoMSA8PCAzKQorI2RlZmluZSBDTFJfRElHCQkoMSA8PCA0KQorI2RlZmluZSBBQ0xSX1BIQQkoMSA8PCA1KQorI2RlZmluZSBBQ0xSX0RJRwkoMSA8PCA2KQorI2RlZmluZSBMT0FEX0xSUgkoMSA8PCA3KQorCisjZGVmaW5lIExTQl9GU1QJCSgxKQorI2RlZmluZSBTRElPX0lQVAkoMSA8PCAxKQorI2RlZmluZSBFWFRfUFdECQkoMSA8PCAzKQorI2RlZmluZSBBREFDX1BXRAkoMSA8PCA0KQorI2RlZmluZSBSRUZDTEtfUFdECSgxIDw8IDUpCisjZGVmaW5lIERBQ19QV0QJCSgxIDw8IDYpCisjZGVmaW5lIERJR19QV0QJCSgxIDw8IDcpCisKKyNkZWZpbmUgRU5BX0FNUAkJKDEpCisjZGVmaW5lIFJFQURfRlRXCSgxKQorI2RlZmluZSBESUdSX0xPVwkoMSA8PCAxKQorI2RlZmluZSBESUdSX0hJR0gJKDEgPDwgMikKKyNkZWZpbmUgRElHUl9FTkEJKDEgPDwgMykKKyNkZWZpbmUgU1lOQ0NMS19FTkEJKDEgPDwgNikKKyNkZWZpbmUgSVRFUl9JT1VQRAkoMSA8PCA3KQorCisjZGVmaW5lIFRYX0VOQQkJKDEgPDwgMSkKKyNkZWZpbmUgUERDTEtfSU5WCSgxIDw8IDIpCisjZGVmaW5lIFBEQ0xLX0VOQgkoMSA8PCAzKQorCisjZGVmaW5lIFBBUkFfRU5BCSgxIDw8IDQpCisjZGVmaW5lIFNZTkNfRElTCSgxIDw8IDUpCisjZGVmaW5lIERBVEFfQVNTCSgxIDw8IDYpCisjZGVmaW5lIE1BVENIX0VOQQkoMSA8PCA3KQorCisjZGVmaW5lIFBMTF9FTkEJCSgxKQorI2RlZmluZSBQRkRfUlNUCQkoMSA8PCAyKQorI2RlZmluZSBSRUZDTEtfUlNUCSgxIDw8IDYpCisjZGVmaW5lIFJFRkNMS19CWVAJKDEgPDwgNykKKworLyogUmVnaXN0ZXIgZm9ybWF0OiAxIGJ5dGUgYWRkciArIHZhbHVlICovCitzdHJ1Y3QgYWQ5OTEwX2NvbmZpZyB7CisJdTggYXV4ZGFjWzVdOworCXU4IGlvdXBkWzVdOworCXU4IGZ0d1s1XTsKKwl1OCBwb3dbM107CisJdTggYXNmWzVdOworCXU4IG11bHRjWzVdOworCXU4IGRpZ19yYW1wbFs5XTsKKwl1OCBkaWdfcmFtcHNbOV07CisJdTggZGlnX3JhbXByWzVdOworCXU4IHNpbl90b25lcDBbOV07CisJdTggc2luX3RvbmVwMVs5XTsKKwl1OCBzaW5fdG9uZXAyWzldOworCXU4IHNpbl90b25lcDNbOV07CisJdTggc2luX3RvbmVwNFs5XTsKKwl1OCBzaW5fdG9uZXA1WzldOworCXU4IHNpbl90b25lcDZbOV07CisJdTggc2luX3RvbmVwN1s5XTsKK307CisKK3N0cnVjdCBhZDk5MTBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBpaW9fZGV2ICppZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworfTsKKworc3RhdGljIHNzaXplX3QgYWQ5OTEwX3NldF9wYXJhbWV0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJc3RydWN0IGFkOTkxMF9jb25maWcgKmNvbmZpZyA9IChzdHJ1Y3QgYWQ5OTEwX2NvbmZpZyAqKWJ1ZjsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5hdXhkYWNbMF07CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+aW91cGRbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mdHdbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5wb3dbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5hc2ZbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5tdWx0Y1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wbFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wc1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wclswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDBbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXAxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwMlswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXAzWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwNFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDVbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXA2WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwN1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk5MTBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyB2b2lkIGFkOTkxMF9pbml0KHN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTggY2ZyWzVdOworCisJY2ZyWzBdID0gQ0ZSMTsKKwljZnJbMV0gPSAwOworCWNmclsyXSA9IE1BTlVBTF9PU0sgfCBJTlZTSUMgfCBERFNfU0lORU9QOworCWNmclszXSA9IEFVVE9fT1NLIHwgT1NLRU4gfCBBQ0xSX1BIQSB8IEFDTFJfRElHIHwgTE9BRF9MUlI7CisJY2ZyWzRdID0gMDsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjZnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljZnJbMF0gPSBDRlIyOworCWNmclsxXSA9IEVOQV9BTVA7CisJY2ZyWzJdID0gUkVBRF9GVFcgfCBESUdSX0VOQSB8IElURVJfSU9VUEQ7CisJY2ZyWzNdID0gVFhfRU5BIHwgUERDTEtfSU5WIHwgUERDTEtfRU5COworCWNmcls0XSA9IFBBUkFfRU5BOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNmclswXSA9IENGUjM7CisJY2ZyWzFdID0gUExMX0VOQTsKKwljZnJbMl0gPSAwOworCWNmclszXSA9IFJFRkNMS19SU1QgfCBSRUZDTEtfQllQOworCWNmcls0XSA9IDA7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY2ZyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKworCit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk5MTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTkxMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk5MTBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTkxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk5MTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCWFkOTkxMF9pbml0KHN0KTsKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTkxMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5OTEwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTkxMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk5MTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTkxMF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5OTEwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTkxMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5OTEwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTkxMF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5OTEwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk5MTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5OTEwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTUxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5NTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VkZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTUxLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5OTUxCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk5NTEiCisKKyNkZWZpbmUgQ0ZSMSAweDAKKyNkZWZpbmUgQ0ZSMiAweDEKKworI2RlZmluZSBBVVRPX09TSwkoMSkKKyNkZWZpbmUgT1NLRU4JCSgxIDw8IDEpCisjZGVmaW5lIExPQURfQVJSCSgxIDw8IDIpCisKKyNkZWZpbmUgQVVUT19TWU5DCSgxIDw8IDcpCisKKyNkZWZpbmUgTFNCX0ZTVAkJKDEpCisjZGVmaW5lIFNESU9fSVBUCSgxIDw8IDEpCisjZGVmaW5lIENMUl9QSEEJCSgxIDw8IDIpCisjZGVmaW5lIFNJTkVfT1BUCSgxIDw8IDQpCisjZGVmaW5lIEFDTFJfUEhBCSgxIDw8IDUpCisKKyNkZWZpbmUgVkNPX1JBTkdFCSgxIDw8IDIpCisKKyNkZWZpbmUgQ1JTX09QVAkJKDEgPDwgMSkKKyNkZWZpbmUgSE1BTlVfU1lOQwkoMSA8PCAyKQorI2RlZmluZSBIU1BEX1NZTkMJKDEgPDwgMykKKworLyogUmVnaXN0ZXIgZm9ybWF0OiAxIGJ5dGUgYWRkciArIHZhbHVlICovCitzdHJ1Y3QgYWQ5OTUxX2NvbmZpZyB7CisJdTggYXNmWzNdOworCXU4IGFyclsyXTsKKwl1OCBmdHcwWzVdOworCXU4IGZ0dzFbM107Cit9OworCitzdHJ1Y3QgYWQ5OTUxX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTk1MV9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk5NTFfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkOTk1MV9jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5OTUxX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+YXNmWzBdOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmFyclswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmZ0dzBbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mdHcxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMsIFNfSVdVU1IsIE5VTEwsIGFkOTk1MV9zZXRfcGFyYW1ldGVyLCAwKTsKKworc3RhdGljIHZvaWQgYWQ5OTUxX2luaXQoc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3QpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwl1OCBjZnJbNV07CisKKwljZnJbMF0gPSBDRlIxOworCWNmclsxXSA9IDA7CisJY2ZyWzJdID0gTFNCX0ZTVCB8IENMUl9QSEEgfCBTSU5FX09QVCB8IEFDTFJfUEhBOworCWNmclszXSA9IEFVVE9fT1NLIHwgT1NLRU4gfCBMT0FEX0FSUjsKKwljZnJbNF0gPSAwOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNmclswXSA9IENGUjI7CisJY2ZyWzFdID0gVkNPX1JBTkdFOworCWNmclsyXSA9IEhTUERfU1lOQzsKKwljZnJbM10gPSAwOworCisJeGZlci5sZW4gPSA0OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5OTUxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk5NTFfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5OTUxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk5NTFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5OTUxX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5OTUxX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfc2V0dXAoc3BpKTsKKwlhZDk5NTFfaW5pdChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk5NTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDk5NTFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ5OTUxX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDk5NTFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkOTk1MV9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDk5NTFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkOTk1MV9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDk5NTFfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkOTk1MV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ5OTUxX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkOTk1MSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2Rkcy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvZGRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhYzNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2Rkcy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogZGRzLmggLSBzeXNmcyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBERFMgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfZnJlcVkKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9GUkVRKF9jaGFubmVsLCBfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX2ZyZXEjI19udW0sCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZX3NjYWxlCisgKi8KKworI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9GUkVRX1NDQUxFKF9jaGFubmVsLCBfc3RyaW5nKQkJCVwKKwlJSU9fQ09OU1RfQVRUUihkZHMjI19jaGFubmVsIyNfZnJlcV9zY2FsZSwgX3N0cmluZykKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxc3ltYm9sCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfRlJFUVNZTUJPTChfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19mcmVxc3ltYm9sLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGhhc2VZCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEhBU0UoX2NoYW5uZWwsIF9udW0sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfcGhhc2UjI19udW0sCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BoYXNlWV9zY2FsZQorICovCisKKyNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfUEhBU0VfU0NBTEUoX2NoYW5uZWwsIF9zdHJpbmcpCQkJXAorCUlJT19DT05TVF9BVFRSKGRkcyMjX2NoYW5uZWwjI19waGFzZV9zY2FsZSwgX3N0cmluZykKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZXN5bWJvbAorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BIQVNFU1lNQk9MKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BoYXNlc3ltYm9sLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9lbgorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BJTkNPTlRST0xfRU4oX2NoYW5uZWwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcilcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19waW5jb250cm9sX2VuLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9mcmVxX2VuCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9GUkVRX0VOKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfcGluY29udHJvbF9mcmVxX2VuLAkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waW5jb250cm9sX3BoYXNlX2VuCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9QSEFTRV9FTihfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BpbmNvbnRyb2xfcGhhc2VfZW4sCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dF9lbmFibGUKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRfRU5BQkxFKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dF9lbmFibGUsCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX2VuYWJsZQorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVFlfRU5BQkxFKF9jaGFubmVsLCBfb3V0cHV0LAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19vdXQjI19vdXRwdXQjI19lbmFibGUsCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dFlfd2F2ZXR5cGUKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRfV0FWRVRZUEUoX2NoYW5uZWwsIF9vdXRwdXQsIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dCMjX291dHB1dCMjX3dhdmV0eXBlLAlcCisJCQlTX0lXVVNSLCBOVUxMLCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX3dhdmV0eXBlX2F2YWlsYWJsZQorICovCisKKyNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfT1VUX1dBVkVUWVBFU19BVkFJTEFCTEUoX2NoYW5uZWwsIF9vdXRwdXQsIF9tb2RlcylcCisJSUlPX0NPTlNUX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dCMjX291dHB1dCMjX3dhdmV0eXBlX2F2YWlsYWJsZSxcCisJCQlfbW9kZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZwppbmRleCBjNDA0MzYxLi4yMzZmMTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZwpAQCAtMywxMSArMyw0NSBAQAogIwogY29tbWVudCAiRGlnaXRhbCBneXJvc2NvcGUgc2Vuc29ycyIKIAorY29uZmlnIEFESVMxNjA2MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYwNjAgWWF3IFJhdGUgR3lyb3Njb3BlIHdpdGggU1BJIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYwNjAgd2lkZSBiYW5kd2lkdGgKKwkgIHlhdyByYXRlIGd5cm9zY29wZSB3aXRoIFNQSS4KKworY29uZmlnIEFESVMxNjA4MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYwODAvMTAwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MDgwLzEwMCBZYXcgUmF0ZQorCSAgR3lyb3Njb3BlIHdpdGggU1BJLgorCitjb25maWcgQURJUzE2MTMwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjEzMCBIaWdoIFByZWNpc2lvbiBBbmd1bGFyIFJhdGUgU2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYxMzAgSGlnaCBQcmVjaXNpb24KKwkgIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyLgorCiBjb25maWcgQURJUzE2MjYwCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI2MC81IERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAgQURJUzE2MjY1IERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCiAJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgogCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKIAloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjYwLzUKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAgQURJUzE2MjY1CiAJICBwcm9ncmFtbWFibGUgZGlnaXRhbCBneXJvc2NvcGUgc2Vuc29yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZGlzMTYyNjAuCisKK2NvbmZpZyBBRElTMTYyNTEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjUxIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjI2MSBwcm9ncmFtbWFibGUKKwkgIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRpczE2MjUxLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlCmluZGV4IGI1ZjBkYzAuLjI3NjRjMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUKQEAgLTIsNiArMiwxOCBAQAogIyBNYWtlZmlsZSBmb3IgZGlnaXRhbCBneXJvc2NvcGUgc2Vuc29yIGRyaXZlcnMKICMKIAorYWRpczE2MDYwLXkgICAgICAgICAgICAgOj0gYWRpczE2MDYwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjA2MCkgKz0gYWRpczE2MDYwLm8KKworYWRpczE2MDgwLXkgICAgICAgICAgICAgOj0gYWRpczE2MDgwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjA4MCkgKz0gYWRpczE2MDgwLm8KKworYWRpczE2MTMwLXkgICAgICAgICAgICAgOj0gYWRpczE2MTMwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjEzMCkgKz0gYWRpczE2MTMwLm8KKwogYWRpczE2MjYwLXkgICAgICAgICAgICAgOj0gYWRpczE2MjYwX2NvcmUubwogYWRpczE2MjYwLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjYwX3JpbmcubyBhZGlzMTYyNjBfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjYwKSArPSBhZGlzMTYyNjAubworCithZGlzMTYyNTEteSAgICAgICAgICAgICA6PSBhZGlzMTYyNTFfY29yZS5vCitvYmotJChDT05GSUdfQURJUzE2MjUxKSArPSBhZGlzMTYyNTEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDBlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwLmgKQEAgLTAsMCArMSwxMDEgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjA2MF9IXworI2RlZmluZSBTUElfQURJUzE2MDYwX0hfCisKKyNkZWZpbmUgQURJUzE2MDYwX0dZUk8gICAgICAgMHgyMCAvKiBNZWFzdXJlIEFuZ3VsYXIgUmF0ZSAoR3lybykgKi8KKyNkZWZpbmUgQURJUzE2MDYwX1NVUFBMWV9PVVQgMHgxMCAvKiBNZWFzdXJlIFRlbXBlcmF0dXJlICovCisjZGVmaW5lIEFESVMxNjA2MF9BSU4yICAgICAgIDB4ODAgLyogTWVhc3VyZSBBSU4yICovCisjZGVmaW5lIEFESVMxNjA2MF9BSU4xICAgICAgIDB4NDAgLyogTWVhc3VyZSBBSU4xICovCisjZGVmaW5lIEFESVMxNjA2MF9URU1QX09VVCAgIDB4MjIgLyogU2V0IFBvc2l0aXZlIFNlbGYtVGVzdCBhbmQgT3V0cHV0IGZvciBBbmd1bGFyIFJhdGUgKi8KKyNkZWZpbmUgQURJUzE2MDYwX0FOR0xfT1VUICAgMHgyMSAvKiBTZXQgTmVnYXRpdmUgU2VsZi1UZXN0IGFuZCBPdXRwdXQgZm9yIEFuZ3VsYXIgUmF0ZSAqLworCisjZGVmaW5lIEFESVMxNjA2MF9NQVhfVFggICAgIDMKKyNkZWZpbmUgQURJUzE2MDYwX01BWF9SWCAgICAgMworCisvKioKKyAqIHN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzX3c6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzX3c7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1c19yOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYwNjBfc2NhbiB7CisJQURJUzE2MDYwX1NDQU5fR1lSTywKKwlBRElTMTYwNjBfU0NBTl9URU1QLAorCUFESVMxNjA2MF9TQ0FOX0FEQ18xLAorCUFESVMxNjA2MF9TQ0FOX0FEQ18yLAorfTsKKwordm9pZCBhZGlzMTYwNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MDYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MDYwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjA2MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MDYwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYwNjBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYwNjBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MDYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYwNjBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYwNjBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA2MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA2MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA2MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYwNjBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0OGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQURJUzE2MDYwIFdpZGUgQmFuZHdpZHRoIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImd5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYwNjAuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjA2MCIKKworc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqYWRpczE2MDYwX3N0OworCitpbnQgYWRpczE2MDYwX3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gMDsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IHZhbDsgLyogVGhlIGxhc3QgOCBiaXRzIGNsb2NrZWQgaW4gYXJlIGxhdGNoZWQgKi8KKworCXJldCA9IHNwaV93cml0ZShzdC0+dXNfdywgc3QtPnR4LCAzKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MDYwX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2ICp2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0ID0gc3BpX3JlYWQoc3QtPnVzX3IsIHN0LT5yeCwgMyk7CisKKwkvKiBUaGUgaW50ZXJuYWwgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFEQyBiZWdpbnMgdGhlIGNvbnZlcnNpb24gcHJvY2VzcworCSAqIG9uIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgTVNFTDEgYW5kIHN0YXJ0cyB0byBwbGFjZSBkYXRhIE1TQiBmaXJzdCBvbiB0aGUKKwkgKiBET1VUIGxpbmUgYXQgdGhlIDZ0aCBmYWxsaW5nIGVkZ2Ugb2YgU0NMSworCSAqLworCWlmIChyZXQgPT0gMCkKKwkJKnZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzKSA8PCAxMikgfCAoc3QtPnJ4WzFdIDw8IDQpIHwgKChzdC0+cnhbMl0gPj4gNCkgJiAweEYpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjA2MF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MDYwX3NwaV9yZWFkKGRldiwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYwNjBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkaXMxNjA2MF9zcGlfd3JpdGUoZGV2LCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworI2RlZmluZSBJSU9fREVWX0FUVFJfSU4oX3Nob3cpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoaW4sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVQoX3N0b3JlKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dCwgU19JUlVHTywgTlVMTCwgX3N0b3JlLCAwKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOKGFkaXMxNjA2MF9yZWFkKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUKGFkaXMxNjA2MF93cml0ZSk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MDYwIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwNjBfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA2MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDYwX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MDYwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA2MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDYwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYwNjBfcl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjA2MF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjA2MF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51c19yID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjA2MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MDYwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjA2MF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYwNjBfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjA2MCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYwNjBfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCWFkaXMxNjA2MF9zdCA9IHN0OworCXJldHVybiAwOworCitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MDYwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYwNjBfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkaXMxNjA2MF9yX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MDYwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYwNjBfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGlzMTYwNjBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MDYwX3dfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0gYWRpczE2MDYwX3N0OworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9ERVY7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisJc3QtPnVzX3cgPSBzcGk7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjA2MF93X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MDYwX3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjA2MF9yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYwNjBfcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MDYwX3JfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYwNjBfd19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MDYwX3ciLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjA2MF93X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGlzMTYwNjBfd19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MDYwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDYwX3JfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjA2MF93X2RyaXZlcik7CisJaWYgKHJldCA8IDApIHsKKwkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfcl9kcml2ZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoYWRpczE2MDYwX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRpczE2MDYwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjA2MF93X2RyaXZlcik7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRpczE2MDYwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURJUzE2MDYwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNiZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA4MC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIFNQSV9BRElTMTYwODBfSF8KKyNkZWZpbmUgU1BJX0FESVMxNjA4MF9IXworCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fQ09ERSAgIDQgLyogT3V0cHV0IGRhdGEgZm9ybWF0IHNldHRpbmcuIDA6IFR3b3MgY29tcGxlbWVudC4gMTogT2Zmc2V0IGJpbmFyeS4gKi8KKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9HWVJPICAgKDAgPDwgMTApIC8qIEd5cm9zY29wZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9URU1QICAgKDEgPDwgMTApIC8qIFRlbXBlcmF0dXJlIG91dHB1dCAqLworI2RlZmluZSBBRElTMTYwODBfRElOX0FJTjEgICAoMiA8PCAxMCkKKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9BSU4yICAgKDMgPDwgMTApCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fV1JJVEUgICgxIDw8IDE1KSAvKiAxOiBXcml0ZSBjb250ZW50cyBvbiBESU4gdG8gY29udHJvbCByZWdpc3Rlci4KKwkJCQkJKiAwOiBObyBjaGFuZ2VzIHRvIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJCSovCisKKyNkZWZpbmUgQURJUzE2MDgwX01BWF9UWCAgICAgMgorI2RlZmluZSBBRElTMTYwODBfTUFYX1JYICAgICAyCisKKy8qKgorICogc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYwODBfc2NhbiB7CisJQURJUzE2MDgwX1NDQU5fR1lSTywKKwlBRElTMTYwODBfU0NBTl9URU1QLAorCUFESVMxNjA4MF9TQ0FOX0FEQ18xLAorCUFESVMxNjA4MF9TQ0FOX0FEQ18yLAorfTsKKwordm9pZCBhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MDgwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjA4MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MDgwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYwODBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYwODBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYwODBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYwODBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA4MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYwODBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA4MF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmYjc2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQURJUzE2MDgwLzEwMCBZYXcgUmF0ZSBHeXJvc2NvcGUgd2l0aCBTUEkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MDgwLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYwODAiCisKK3N0cnVjdCBhZGlzMTYwODBfc3RhdGUgKmFkaXMxNjA4MF9zdDsKKworaW50IGFkaXMxNjA4MF9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSB2YWwgPj4gODsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYwODBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgKnZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXQgPSBzcGlfcmVhZChzdC0+dXMsIHN0LT5yeCwgMik7CisKKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSAoKHN0LT5yeFswXSAmIDB4RikgPDwgOCkgfCBzdC0+cnhbMV07CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MDgwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MTYgdmFsOworCXNzaXplX3QgcmV0OworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9ICBhZGlzMTYwODBfc3BpX3JlYWQoZGV2LCAmdmFsKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjA4MF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxNiwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MDgwX3NwaV93cml0ZShkZXYsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JTihfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihpbiwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVChfc3RvcmUpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0LCBTX0lSVUdPLCBOVUxMLCBfc3RvcmUsIDApCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU4oYWRpczE2MDgwX3JlYWQpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVQoYWRpczE2MDgwX3dyaXRlKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGlzMTYwODAiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjA4MF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MDgwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYwODBfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwODBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MDgwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYwODBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjA4MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjA4MF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjA4MF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYwODBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjA4MF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYwODBfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MDgwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYwODAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwlhZGlzMTYwODBfc3QgPSBzdDsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MDgwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYwODBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYwODAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjA4MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MDgwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYwODBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwODBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjA4MF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjA4MF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwODBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjA4MF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjA4MC8xMDAgWWF3IFJhdGUgR3lyb3Njb3BlIHdpdGggU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODBlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MTMwLmgKQEAgLTAsMCArMSwxMDggQEAKKyNpZm5kZWYgU1BJX0FESVMxNjEzMF9IXworI2RlZmluZSBTUElfQURJUzE2MTMwX0hfCisKKyNkZWZpbmUgQURJUzE2MTMwX0NPTiAgICAgICAgIDB4MAorI2RlZmluZSBBRElTMTYxMzBfQ09OX1JEICAgICAgKDEgPDwgNikKKyNkZWZpbmUgQURJUzE2MTMwX0lPUCAgICAgICAgIDB4MQorI2RlZmluZSBBRElTMTYxMzBfSU9QX0FMTF9SRFkgKDEgPDwgMykgLyogMSA9IGRhdGEtcmVhZHkgc2lnbmFsIGxvdyB3aGVuIHVucmVhZCBkYXRhIG9uIGFsbCBjaGFubmVsczsgKi8KKyNkZWZpbmUgQURJUzE2MTMwX0lPUF9TWU5DICAgICgxIDw8IDApIC8qIDEgPSBzeW5jaHJvbml6YXRpb24gZW5hYmxlZCAqLworI2RlZmluZSBBRElTMTYxMzBfUkFURURBVEEgICAgMHg4IC8qIEd5cm9zY29wZSBvdXRwdXQsIHJhdGUgb2Ygcm90YXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBEQVRBICAgIDB4QSAvKiBUZW1wZXJhdHVyZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDUyAgICAgIDB4MjggLyogR3lyb3Njb3BlIGNoYW5uZWwgc2V0dXAgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDU19FTiAgICgxIDw8IDMpIC8qIDEgPSBjaGFubmVsIGVuYWJsZTsgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBDUyAgICAgIDB4MkEgLyogVGVtcGVyYXR1cmUgY2hhbm5lbCBzZXR1cCAqLworI2RlZmluZSBBRElTMTYxMzBfVEVNUENTX0VOICAgKDEgPDwgMykKKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDT05WICAgIDB4MzAKKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBDT05WICAgIDB4MzIKKyNkZWZpbmUgQURJUzE2MTMwX01PREUgICAgICAgIDB4MzgKKyNkZWZpbmUgQURJUzE2MTMwX01PREVfMjRCSVQgICgxIDw8IDEpIC8qIDEgPSAyNC1iaXQgcmVzb2x1dGlvbjsgKi8KKworI2RlZmluZSBBRElTMTYxMzBfTUFYX1RYICAgICA0CisjZGVmaW5lIEFESVMxNjEzMF9NQVhfUlggICAgIDQKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZSB0byB3cml0ZSBkYXRhCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYxMzBfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7IC8qIDE6IDI0Yml0cyBtb2RlIDA6MTZiaXRzIG1vZGUgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkaXMxNjEzMF9zY2FuIHsKKwlBRElTMTYxMzBfU0NBTl9HWVJPLAorCUFESVMxNjEzMF9TQ0FOX1RFTVAsCit9OworCit2b2lkIGFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYxMzBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworCitpbnQgYWRpczE2MTMwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGlzMTYxMzBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkaXMxNjEzMF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkaXMxNjEzMF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2FkaXMxNjEzMF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkaXMxNjEzMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MTMwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MTMwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogU1BJX0FESVMxNjEzMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MTMwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWZmYzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMF9jb3JlLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBBRElTMTYxMzAgRGlnaXRhbCBPdXRwdXQsIEhpZ2ggUHJlY2lzaW9uIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MTMwLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYxMzAiCisKK3N0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKmFkaXMxNjEzMF9zdDsKKworaW50IGFkaXMxNjEzMF9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkciwKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSByZWdfYWRkcjsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYxMzBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkciwKKwkJdTMyICp2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURJUzE2MTMwX0NPTl9SRCB8IHJlZ19hZGRyOworCWlmIChzdC0+bW9kZSkKKwkJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDQpOworCWVsc2UKKwkJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDMpOworCisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChzdC0+bW9kZSkKKwkJCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisJCWVsc2UKKwkJCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDgpIHwgc3QtPnJ4WzJdOworCX0KKworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjEzMF9neXJvX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgdmFsOworCXNzaXplX3QgcmV0OworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9ICBhZGlzMTYxMzBfc3BpX3JlYWQoZGV2LCBBRElTMTYxMzBfUkFURURBVEEsICZ2YWwpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX3RlbXBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJc3NpemVfdCByZXQ7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gIGFkaXMxNjEzMF9zcGlfcmVhZChkZXYsIEFESVMxNjEzMF9URU1QREFUQSwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYxMzBfYml0c21vZGVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX2JpdHNtb2RlX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDE2LCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYxMzBfc3BpX3dyaXRlKGRldiwgQURJUzE2MTMwX01PREUsICEhdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MTMwX3RlbXBfcmVhZCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MTMwIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyhhZGlzMTYxMzBfZ3lyb19yZWFkLAorCQlBRElTMTYxMzBfUkFURURBVEEpOworCisjZGVmaW5lIElJT19ERVZfQVRUUl9CSVRTX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGJpdHNfbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJVFNfTU9ERShTX0lXVVNSIHwgU19JUlVHTywgYWRpczE2MTMwX2JpdHNtb2RlX3JlYWQsIGFkaXMxNjEzMF9iaXRzbW9kZV93cml0ZSwKKwkJCUFESVMxNjEzMF9NT0RFKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjEzMF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MTMwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYxMzBfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYxMzBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JpdHNfbW9kZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjEzMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MTMwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYxMzBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYxMzBfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYxMzBfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MTMwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYxMzBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCXN0LT5tb2RlID0gMTsKKworCXJldCA9IGFkaXMxNjEzMF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYxMzBfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjEzMCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCWFkaXMxNjEzMF9zdCA9IHN0OworCXJldHVybiAwOworCitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYxMzBfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkaXMxNjEzMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJYWRpczE2MTMwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYxMzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjEzMCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRpczE2MTMwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGlzMTYxMzBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkaXMxNjEzMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjEzMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRpczE2MTMwX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRpczE2MTMwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjEzMF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRpczE2MTMwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURJUzE2MTMwIEhpZ2ggUHJlY2lzaW9uIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzODUyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTEuaApAQCAtMCwwICsxLDE4NSBAQAorI2lmbmRlZiBTUElfQURJUzE2MjUxX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyNTFfSF8KKworI2RlZmluZSBBRElTMTYyNTFfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyNTFfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyNTFfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjI1MV9FTkRVUkFOQ0UgIDB4MDAgLyogRmxhc2ggbWVtb3J5IHdyaXRlIGNvdW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9TVVBQTFlfT1VUIDB4MDIgLyogUG93ZXIgc3VwcGx5IG1lYXN1cmVtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9HWVJPX09VVCAgIDB4MDQgLyogWC1heGlzIGd5cm9zY29wZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FVWF9BREMgICAgMHgwQSAvKiBhbmFsb2cgaW5wdXQgY2hhbm5lbCBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfVEVNUF9PVVQgICAweDBDIC8qIGludGVybmFsIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9BTkdMX09VVCAgIDB4MEUgLyogYW5nbGUgZGlzcGxhY2VtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9HWVJPX09GRiAgIDB4MTQgLyogQ2FsaWJyYXRpb24sIG9mZnNldC9iaWFzIGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dZUk9fU0NBTEUgMHgxNiAvKiBDYWxpYnJhdGlvbiwgc2NhbGUgYWRqdXN0bWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfQUxNX01BRzEgICAweDIwIC8qIEFsYXJtIDEgbWFnbml0dWRlL3BvbGFyaXR5IHNldHRpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9NQUcyICAgMHgyMiAvKiBBbGFybSAyIG1hZ25pdHVkZS9wb2xhcml0eSBzZXR0aW5nICovCisjZGVmaW5lIEFESVMxNjI1MV9BTE1fU01QTDEgIDB4MjQgLyogQWxhcm0gMSBkeW5hbWljIHJhdGUgb2YgY2hhbmdlIHNldHRpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9TTVBMMiAgMHgyNiAvKiBBbGFybSAyIGR5bmFtaWMgcmF0ZSBvZiBjaGFuZ2Ugc2V0dGluZyAqLworI2RlZmluZSBBRElTMTYyNTFfQUxNX0NUUkwgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FVWF9EQUMgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dQSU9fQ1RSTCAgMHgzMiAvKiBDb250cm9sLCBkaWdpdGFsIEkvTyBsaW5lICovCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTCAgIDB4MzQgLyogQ29udHJvbCwgZGF0YSByZWFkeSwgc2VsZi10ZXN0IHNldHRpbmdzICovCisjZGVmaW5lIEFESVMxNjI1MV9TTVBMX1BSRCAgIDB4MzYgLyogQ29udHJvbCwgaW50ZXJuYWwgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NFTlNfQVZHICAgMHgzOCAvKiBDb250cm9sLCBkeW5hbWljIHJhbmdlLCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NMUF9DTlQgICAgMHgzQSAvKiBDb250cm9sLCBzbGVlcCBtb2RlIGluaXRpYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVCAgMHgzQyAvKiBEaWFnbm9zdGljLCBlcnJvciBmbGFncyAqLworI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTUQgICAweDNFIC8qIENvbnRyb2wsIGdsb2JhbCBjb21tYW5kcyAqLworCisjZGVmaW5lIEFESVMxNjI1MV9FUlJPUl9BQ1RJVkUJCQkoMTw8MTQpCisjZGVmaW5lIEFESVMxNjI1MV9ORVdfREFUQQkJCSgxPDwxNCkKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0lOVF9TRUxGX1RFU1QJKDE8PDEwKSAvKiBJbnRlcm5hbCBzZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTF9ORUdfU0VMRl9URVNUCSgxPDw5KQorI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkxfUE9TX1NFTEZfVEVTVAkoMTw8OCkKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX0VOCQkoMTw8MikKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX1BPTF9ISUdICSgxPDwxKQorI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMTw8MCkKKworLyogU01QTF9QUkQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NNUExfUFJEX1RJTUVfQkFTRQkoMTw8NykgLyogVGltZSBiYXNlICh0Qik6IDAgPSAxLjk1MyBtcywgMSA9IDYwLjU0IG1zICovCisjZGVmaW5lIEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSwkweDdGCisKKy8qIFNMUF9DTlQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NMUF9DTlRfUE9XRVJfT0ZGICAgICAweDgwCisKKy8qIERJQUdfU1RBVCAqLworI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMgkoMTw8OSkKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTEJKDE8PDgpCisjZGVmaW5lIEFESVMxNjI1MV9ESUFHX1NUQVRfU0VMRl9URVNUCSgxPDw1KQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX09WRVJGTE9XCSgxPDw0KQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX1NQSV9GQUlMCSgxPDwzKQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0ZMQVNIX1VQVAkoMTw8MikKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdICSgxPDwxKQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX1BPV0VSX0xPVwkoMTw8MCkKKworI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0VSUl9NQVNLIChBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMiB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMSB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX1NFTEZfVEVTVCB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX09WRVJGTE9XIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfU1BJX0ZBSUwgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9GTEFTSF9VUFQgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdIIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCisvKiBHTE9CX0NNRCAqLworI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9GTEFTSF9VUEQJKDE8PDMpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9EQUNfTEFUQ0gJKDE8PDIpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9GQUNfQ0FMSUIJKDE8PDEpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9BVVRPX05VTEwJKDE8PDApCisKKyNkZWZpbmUgQURJUzE2MjUxX01BWF9UWCAyNAorI2RlZmluZSBBRElTMTYyNTFfTUFYX1JYIDI0CisKKyNkZWZpbmUgQURJUzE2MjUxX1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFESVMxNjI1MV9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFESVMxNjI1MV9TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCitpbnQgYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICB1OCByZWdfYWRkcmVzcywKKwkJCSAgICAgIHU4IHZhbCk7CisKK2ludCBhZGlzMTYyNTFfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpOworCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX3NlcXVlbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICB1OCAqdHgsIHU4ICpyeCwgaW50IG51bSk7CisKK2ludCBhZGlzMTYyNTFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworaW50IGFkaXMxNjI1MV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgYWRpczE2MjUxX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkaXMxNjI1MV9zY2FuIHsKKwlBRElTMTYyNTFfU0NBTl9TVVBQTFksCisJQURJUzE2MjUxX1NDQU5fR1lSTywKKwlBRElTMTYyNTFfU0NBTl9URU1QLAorCUFESVMxNjI1MV9TQ0FOX0FEQ18wLAorfTsKKwordm9pZCBhZGlzMTYyNTFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MjUxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MjUxX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjI1MV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjUxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyNTFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyNTFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNTFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjUxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyNTFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyNTFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI1MV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjI1MV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI1MV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyNTFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTFfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI1MV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTFfY29yZS5jCkBAIC0wLDAgKzEsNzc3IEBACisvKgorICogQURJUzE2MjUxIFByb2dyYW1tYWJsZSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MjUxLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYyNTEiCisKKy8qIEF0IHRoZSBtb21lbnQgdGhlIHNwaSBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBnbG9iYWwgc2V0dGluZyBvZiBjc19jaGFuZ2UuCisgKiBJdCdzIGluIHRoZSBsaWtlbHkgdG8gYmUgYWRkZWQgY29tbWVudCBhdCB0aGUgdG9wIG9mIHNwaS5oLgorICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUgZXRjLgorICovCisKKy8qKgorICogYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitpbnQgYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjI1MV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjUxX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjI1MV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjI1MV9zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjUxX1JFQURfUkVHKGxvd2VyX3JlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjUxX3NwaV9yZWFkX2J1cnN0KCkgLSByZWFkIGFsbCBkYXRhIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkIChtaW4gc2l6ZSBpcyAyNCBieXRlcykKKyAqKi8KK2ludCBhZGlzMTYyNTFfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdTMyIG9sZF9zcGVlZF9oeiA9IHN0LT51cy0+bWF4X3NwZWVkX2h6OworCWludCByZXQ7CisKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAwLAorCQl9LCB7CisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMjQsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyNTFfUkVBRF9SRUcoQURJUzE2MjUxX0dMT0JfQ01EKTsKKwlzdC0+dHhbMV0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisKKwlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IG1pbihBRElTMTYyNTFfU1BJX0JVUlNULCBvbGRfc3BlZWRfaHopOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiBidXJzdCByZWFkaW5nIik7CisKKwlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IG9sZF9zcGVlZF9oejsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyNTFfc3BpX3JlYWRfc2VxdWVuY2UoKSAtIHJlYWQgYSBzZXF1ZW5jZSBvZiAxNi1iaXQgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAdHg6IHJlZ2lzdGVyIGFkZHJlc3NlcyBpbiBieXRlcyAwLDIsNCw2Li4uIChtaW4gc2l6ZSBpcyAyKm51bSBieXRlcykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMipudW0gYnl0ZXMpCisgKiovCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX3NlcXVlbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggKnR4LCB1OCAqcngsIGludCBudW0pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyczsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldCwgaTsKKworCXhmZXJzID0ga3phbGxvYyhudW0gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoeGZlcnMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgIm1lbW9yeSBhbGxvYyBmYWlsZWQiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdHg6IHxhZGQxfGFkZHIyfGFkZHIzfC4uLnxhZGRyTiB8emVyb3wKKwkgKiByeDogfHplcm98cmVzMSB8cmVzMiB8Li4ufHJlc04tMXxyZXNOfCAqLworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJZm9yIChpID0gMDsgaSA8IG51bSArIDE7IGkrKykgeworCQlpZiAoaSA+IDApCisJCQl4ZmVyc1tpXS5yeF9idWYgPSBzdC0+cnggKyAyKihpIC0gMSk7CisJCWlmIChpIDwgbnVtKQorCQkJeGZlcnNbaV0udHhfYnVmID0gc3QtPnR4ICsgMippOworCQl4ZmVyc1tpXS5iaXRzX3Blcl93b3JkID0gODsKKwkJeGZlcnNbaV0ubGVuID0gMjsKKwkJeGZlcnNbaV0uY3NfY2hhbmdlID0gMTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzW2ldLCAmbXNnKTsKKwl9CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIHNlcXVlbmNlIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJa2ZyZWUoeGZlcnMpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsCisJCXVuc2lnbmVkIGJpdHMpCit7CisJaW50IHJldDsKKwlzMTYgdmFsID0gMDsKKwl1bnNpZ25lZCBzaGlmdCA9IDE2IC0gYml0czsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBBRElTMTYyNTFfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKGRldik7CisJdmFsID0gKChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjI1MV9FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjI1MV9jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xNGJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChkZXYsIGF0dHIsIGJ1ZiwgMTQpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xMmJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChkZXYsIGF0dHIsIGJ1ZiwgMTIpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1MTYgdDsKKwlpbnQgc3BzOworCXJldCA9IGFkaXMxNjI1MV9zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjUxX1NNUExfUFJELAorCQkJJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJc3BzID0gICh0ICYgQURJUzE2MjUxX1NNUExfUFJEX1RJTUVfQkFTRSkgPyA4IDogMjU2OworCXNwcyAvPSAodCAmIEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSykgKyAxOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCXU4IHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjU2IC8gdmFsKTsKKwlpZiAodCA+IDApCisJCXQtLTsKKwl0ICY9IEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSzsKKwlpZiAoKHQgJiBBRElTMTYyNTFfU01QTF9QUkRfRElWX01BU0spID49IDB4MEEpCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURJUzE2MjUxX1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjI1MV9TTVBMX1BSRCwKKwkJCXQpOworCisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRpczE2MjUxX3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworCisKK2ludCBhZGlzMTYyNTFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTE2IG1zYzsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjUxX01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyNTFfTVNDX0NUUkxfREFUQV9SRFlfUE9MX0hJR0g7CisJaWYgKGVuYWJsZSkKKwkJbXNjIHw9IEFESVMxNjI1MV9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKwllbHNlCisJCW1zYyAmPSB+QURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX0VOOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LCBBRElTMTYyNTFfTVNDX0NUUkwsIG1zYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MjUxX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjUxX0dMT0JfQ01ELAorCQkJQURJUzE2MjUxX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitpbnQgYWRpczE2MjUxX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSBBRElTMTYyNTFfU0xQX0NOVF9QT1dFUl9PRkY7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjI1MV9TTFBfQ05ULCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSB3aXRoIHR1cm5pbmcgZGV2aWNlIG9mZjogU0xQX0NOVCIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyNTFfc2VsZl90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjUxX01TQ19DVFJMLAorCQkJQURJUzE2MjUxX01TQ19DVFJMX0lOVF9TRUxGX1RFU1QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjUxX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJlYWRpbmcgc3RhdHVzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCWlmICghKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfRVJSX01BU0spKSB7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXJldCA9IC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTIpCisJCWRldl9lcnIoZGV2LCAiQWxhcm0gMiBhY3RpdmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMSkKKwkJZGV2X2VycihkZXYsICJBbGFybSAxIGFjdGl2ZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfU0VMRl9URVNUKQorCQlkZXZfZXJyKGRldiwgIlNlbGYgdGVzdCBlcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfT1ZFUkZMT1cpCisJCWRldl9lcnIoZGV2LCAiU2Vuc29yIG92ZXJyYW5nZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfU1BJX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU1BJIGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX0ZMQVNIX1VQVCkKKwkJZGV2X2VycihkZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdIKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSA1LjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyA0Ljc1VlxuIik7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjI1MV9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJdTE2IHNtcF9wcmQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCisJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX1NMT1c7CisJc3QtPnVzLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRpczE2MjUxX3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogRG8gc2VsZiB0ZXN0ICovCisKKwkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCisJcmV0ID0gYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCWlmIChyZXQpIHsKKwkJYWRpczE2MjUxX3Jlc2V0KGRldik7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKKwkJbXNsZWVwKEFESVMxNjI1MV9TVEFSVFVQX0RFTEFZKTsKKwkJcmV0ID0gYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBhdCBDUyVkIChpcnEgJWQpXG4iLAorCQkJc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCisJLyogdXNlIGhpZ2ggc3BpIHNwZWVkIGlmIHBvc3NpYmxlICovCisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjI1MV9TTVBMX1BSRCwgJnNtcF9wcmQpOworCWlmICghcmV0ICYmIChzbXBfcHJkICYgQURJUzE2MjUxX1NNUExfUFJEX0RJVl9NQVNLKSA8IDB4MEEpIHsKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX1NMT1c7CisJCXNwaV9zZXR1cChzdC0+dXMpOworCX0KKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygwLCBzdXBwbHksIGFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX1NVUFBMWV9PVVQpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMF9zdXBwbHlfc2NhbGUsICIwLjAwMTgzMTUiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9HWVJPKGFkaXMxNjI1MV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX0dZUk9fT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lST19TQ0FMRShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjUxX3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyNTFfd3JpdGVfMTZiaXQsCisJCUFESVMxNjI1MV9HWVJPX1NDQUxFKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lST19PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjUxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyNTFfR1lST19PRkYpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSBLIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjAuMTQ1MyBLIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDEsIGF1eCwgYWRpczE2MjUxX3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjI1MV9BVVhfQURDKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjFfYXV4X3NjYWxlLCAiMC4wMDA2MTA1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyNTFfcmVhZF9mcmVxdWVuY3ksCisJCWFkaXMxNjI1MV93cml0ZV9mcmVxdWVuY3kpOworc3RhdGljIElJT19ERVZfQVRUUl9BTkdMKGFkaXMxNjI1MV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX0FOR0xfT1VUKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGlzMTYyNTFfd3JpdGVfcmVzZXQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIwLjEyOSB+IDI1NiIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjI1MSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjUxX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyNTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjI1MV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI1MV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9neXJvX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ2xfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfYXV4X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjFfYXV4X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI1MV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjUxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyNTFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYyNTFfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYyNTFfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MjUxX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNTFfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRpczE2MjUxX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkaXMxNjI1MV9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjUxIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjI1MV9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjI1MV9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjI1MV91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjUxX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYyNTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJcmV0ID0gYWRpczE2MjUxX3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyNTFfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGlzMTYyNTFfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjUxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyNTEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjI1MV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjUxX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyNTFfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyNTFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjI1MV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjI1MV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyNTFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjI1MV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI1MSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCmluZGV4IDgxMjQ0MGEuLmMxZmQ0MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBTUElfQURJUzE2MjYwX0hfCiAjZGVmaW5lIFNQSV9BRElTMTYyNjBfSF8KKyNpbmNsdWRlICJhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oIgogCiAjZGVmaW5lIEFESVMxNjI2MF9TVEFSVFVQX0RFTEFZCTIyMCAvKiBtcyAqLwogCkBAIC05Miw2ICs5Myw3IEBACiAgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCiAgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKICAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiBAbmVnYXRlOgkJbmVnYXRlIHRoZSBzY2FsZSBwYXJhbWV0ZXIKICAqKi8KIHN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CkBAIC0xMDIsNiArMTA0LDcgQEAKIAl1OAkJCQkqdHg7CiAJdTgJCQkJKnJ4OwogCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworCXVuc2lnbmVkCQkJbmVnYXRlOjE7CiB9OwogCiBpbnQgYWRpczE2MjYwX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCmluZGV4IDdkNzcxNmUuLjA0NWUyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEFESVMxNjI2MCBQcm9ncmFtbWFibGUgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIERyaXZlcgorICogQURJUzE2MjYwL0FESVMxNjI2NSBQcm9ncmFtbWFibGUgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIERyaXZlcgogICoKICAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCkBAIC0xMzQsOCArMTM0LDYgQEAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwogCXN0LT50eFswXSA9IEFESVMxNjI2MF9SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CiAJc3QtPnR4WzFdID0gMDsKLQlzdC0+dHhbMl0gPSAwOwotCXN0LT50eFszXSA9IDA7CiAKIAlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CkBAIC0yOTMsNiArMjkxLDIyIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAorc3RhdGljIHNzaXplX3QgYWRpczE2MjYwX3JlYWRfZ3lyb19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChzdC0+bmVnYXRlKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIi0iKTsKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiJXNcbiIsICIwLjAwMTI3ODYyODIxIik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkaXMxNjI2MF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKQEAgLTQ0NywxOCArNDYxLDYgQEAKIAkJCQlBRElTMTYyNjBfU1VQUExZX09VVCk7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfSU5fTkFNRURfU0NBTEUoMCwgc3VwcGx5LCAiMC4wMDE4MzE1Iik7CiAKLXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyhhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCi0JCUFESVMxNjI2MF9HWVJPX09VVCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfR1lST19TQ0FMRSgiMC4wMDEyNzg2MjgyMSIpOwotc3RhdGljIElJT19ERVZfQVRUUl9HWVJPX0NBTElCU0NBTEUoU19JV1VTUiB8IFNfSVJVR08sCi0JCWFkaXMxNjI2MF9yZWFkXzE0Yml0X3NpZ25lZCwKLQkJYWRpczE2MjYwX3dyaXRlXzE2Yml0LAotCQlBRElTMTYyNjBfR1lST19TQ0FMRSk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fQ0FMSUJCSUFTKFNfSVdVU1IgfCBTX0lSVUdPLAotCQlhZGlzMTYyNjBfcmVhZF8xMmJpdF9zaWduZWQsCi0JCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwKLQkJQURJUzE2MjYwX0dZUk9fT0ZGKTsKLQogc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyNjBfcmVhZF8xMmJpdF91bnNpZ25lZCk7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9PRkZTRVQoIjI1Iik7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9TQ0FMRSgiMC4xNDUzIik7CkBAIC00NzAsOCArNDcyLDYgQEAKIHN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAogCQlhZGlzMTYyNjBfcmVhZF9mcmVxdWVuY3ksCiAJCWFkaXMxNjI2MF93cml0ZV9mcmVxdWVuY3kpOwotc3RhdGljIElJT19ERVZfQVRUUl9BTkdMKGFkaXMxNjI2MF9yZWFkXzE0Yml0X3NpZ25lZCwKLQkJQURJUzE2MjYwX0FOR0xfT1VUKTsKIAogc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwgTlVMTCwgYWRpczE2MjYwX3dyaXRlX3Jlc2V0LCAwKTsKIApAQCAtNDg3LDM4ICs0ODcsNzAgQEAKIAkuYXR0cnMgPSBhZGlzMTYyNjBfZXZlbnRfYXR0cmlidXRlcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNjBfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfaW4wX3N1cHBseV9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb19yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfZ3lyb19zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb19jYWxpYnNjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9neXJvX2NhbGliYmlhcy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYW5nbF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07CisjZGVmaW5lIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKGF4aXMpCQkJCQlcCisJSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMoYWRpczE2MjYwX3JlYWRfMTRiaXRfc2lnbmVkLAkJXAorCQkJCUFESVMxNjI2MF9HWVJPX09VVCk7CQkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyMjYXhpcyMjX1NDQUxFKFNfSVJVR08sCQkJXAorCQkJCQlhZGlzMTYyNjBfcmVhZF9neXJvX3NjYWxlLAlcCisJCQkJCU5VTEwsCQkJCVwKKwkJCQkJMCk7CQkJCVwKKwlzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMjI19DQUxJQlNDQUxFKFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCQkJCWFkaXMxNjI2MF9yZWFkXzEyYml0X3Vuc2lnbmVkLAlcCisJCQkJCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwJCVwKKwkJCQkJQURJUzE2MjYwX0dZUk9fU0NBTEUpOwkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyMjYXhpcyMjX0NBTElCQklBUyhTX0lXVVNSIHwgU19JUlVHTywJXAorCQkJCQlhZGlzMTYyNjBfcmVhZF8xMmJpdF9zaWduZWQsCVwKKwkJCQkJYWRpczE2MjYwX3dyaXRlXzE2Yml0LAkJXAorCQkJCQlBRElTMTYyNjBfR1lST19PRkYpOwkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfQU5HTCMjYXhpcyhhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCVwKKwkJCQkgICAgICAgQURJUzE2MjYwX0FOR0xfT1VUKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBhZGlzMTYyNjBfYXR0cmlidXRlcywKLX07CitzdGF0aWMgQURJUzE2MjYwX0dZUk9fQVRUUl9TRVQoKTsKK3N0YXRpYyBBRElTMTYyNjBfR1lST19BVFRSX1NFVChfWCk7CitzdGF0aWMgQURJUzE2MjYwX0dZUk9fQVRUUl9TRVQoX1kpOworc3RhdGljIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKF9aKTsKKworI2RlZmluZSBBRElTMTYyNjBfQVRUUl9HUk9VUChheGlzKQkJCQkJXAorCXN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI2MF9hdHRyaWJ1dGVzIyNheGlzW10gPSB7CQlcCisJCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19kZXZfYXR0cl9neXJvIyNheGlzIyNfcmF3LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfZ3lybyMjYXhpcyMjX3NjYWxlLmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfZ3lybyMjYXhpcyMjX2NhbGlic2NhbGUuZGV2X2F0dHIuYXR0ciwJXAorCQkmaWlvX2Rldl9hdHRyX2d5cm8jI2F4aXMjI19jYWxpYmJpYXMuZGV2X2F0dHIuYXR0ciwJXAorCQkmaWlvX2Rldl9hdHRyX2FuZ2wjI2F4aXMjI19yYXcuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAkJCVwKKwkJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyLAkJCVwKKwkJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLCBcCisJCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwJCQlcCisJCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCQkJXAorCQlOVUxMCQkJCQkJCVwKKwl9OwkJCQkJCQkJXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXAjI2F4aXMgXAorCT0gewkJCQkJCQkJXAorCQkuYXR0cnMgPSBhZGlzMTYyNjBfYXR0cmlidXRlcyMjYXhpcywJCQlcCisJfTsKKworc3RhdGljIEFESVMxNjI2MF9BVFRSX0dST1VQKCk7CitzdGF0aWMgQURJUzE2MjYwX0FUVFJfR1JPVVAoX3gpOworc3RhdGljIEFESVMxNjI2MF9BVFRSX0dST1VQKF95KTsKK3N0YXRpYyBBRElTMTYyNjBfQVRUUl9HUk9VUChfeik7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjI2MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YSAqcGQgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0KSB7CiAJCXJldCA9ICAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CisJaWYgKHBkKQorCQlzdC0+bmVnYXRlID0gcGQtPm5lZ2F0ZTsKIAkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKIApAQCAtNTQ1LDcgKzU3NywyNCBAQAogCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CiAJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MjYwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKLQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwOworCWlmIChwZCAmJiBwZC0+ZGlyZWN0aW9uKQorCQlzd2l0Y2ggKHBkLT5kaXJlY3Rpb24pIHsKKwkJY2FzZSAneCc6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3g7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3k7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3o7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXA7CisJCQlicmVhazsKKwkJfQorCWVsc2UKKwkJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cDsKKwogCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOwogCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKIAlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwpAQCAtNjM1LDYgKzY4NCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBUaGVzZSBwYXJ0cyBkbyBub3QgbmVlZCB0byBiZSBkaWZmZXJlbnRpYXRlZCB1bnRpbCBzb21lb25lIGFkZHMKKyAqIHN1cHBvcnQgZm9yIHRoZSBvbiBjaGlwIGZpbHRlcmluZy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkaXMxNjI2MF9pZFtdID0geworCXsiYWRpczE2MjYwIiwgMH0sCisJeyJhZGlzMTYyNjUiLCAwfSwKKwl7ImFkaXMxNjI1MCIsIDB9LAorCXsiYWRpczE2MjU1IiwgMH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYyNjBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImFkaXMxNjI2MCIsCkBAIC02NDIsNiArNzAzLDcgQEAKIAl9LAogCS5wcm9iZSA9IGFkaXMxNjI2MF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjYwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWRpczE2MjYwX2lkLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjYwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MDJlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBBRElTMTYyNjAgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBEcml2ZXIgUGxhdGZvcm0gRGF0YQorICoKKyAqIEJhc2VkIG9uIGFkaXMxNjI1NS5oIE1hdHRoaWEgQnJ1Z2dlciA8bV9icnVnZ2VyJndlYi5kZT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMKKyAgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKy8qKgorICogc3RydWN0IGFkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhIC0gaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQGRpcmVjdGlvbjogeCB5IG9yIHoKKyAqIEBuZWdhdGU6IGZsYWcgdG8gaW5kaWNhdGUgdmFsdWUgc2hvdWxkIGJlIGludmVydGVkLgorICoqLworc3RydWN0IGFkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhIHsKKwljaGFyIGRpcmVjdGlvbjsKKwl1bnNpZ25lZCBuZWdhdGU6MTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2d5cm8uaAppbmRleCA5OGI4MzdiLi5iNGVhNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9neXJvLmgKQEAgLTcxLDMgKzcxLDEyIEBACiAKICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0woX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJSUlPX0RFVklDRV9BVFRSKGFuZ2xfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xfWChfc2hvdywgX2FkZHIpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbF94X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMX1koX3Nob3csIF9hZGRyKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xfeV9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTF9aKF9zaG93LCBfYWRkcikJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsX3pfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYwppbmRleCA5N2MxZWM4Li5jZjcxNzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF9jb3JlLmMKQEAgLTU3MCw2ICs1NzAsNyBAQAogCSZpaW9fZGV2X2F0dHJfdGVtcF95X3Jhdy5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfdGVtcF96X3Jhdy5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlMzZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDYxIEBACisjCisjIElJTyBtZXRlciBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KKyMKK2NvbW1lbnQgIkFjdGl2ZSBlbmVyZ3kgbWV0ZXJpbmcgSUMiCisKK2NvbmZpZyBBREU3NzUzCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTMvNiBTaW5nbGUtUGhhc2UgTXVsdGlmdW5jdGlvbiBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1MyBTaW5nbGUtUGhhc2UgTXVsdGlmdW5jdGlvbgorCSAgTWV0ZXJpbmcgSUMgd2l0aCBkaS9kdCBTZW5zb3IgSW50ZXJmYWNlLgorCitjb25maWcgQURFNzc1NAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBREU3NzU0IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1NCBQb2x5cGhhc2UKKwkgIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlci4KKworY29uZmlnIEFERTc3NTgKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURFNzc1OCBQb2x5IFBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seXBoYXNlCisJICBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyB3aXRoIFBlciBQaGFzZSBJbmZvcm1hdGlvbiBEcml2ZXIuCisKK2NvbmZpZyBBREU3NzU5CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTkgQWN0aXZlIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1OCBBY3RpdmUgRW5lcmd5CisJICBNZXRlcmluZyBJQyB3aXRoIGRpL2R0IFNlbnNvciBJbnRlcmZhY2UuCisKK2NvbmZpZyBBREU3ODU0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIKKwlkZXBlbmRzIG9uIFNQSSB8fCBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UKKwkgIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlci4KKworY29uZmlnIEFERTc4NTRfSTJDCisJdHJpc3RhdGUgInN1cHBvcnQgSTJDIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gQURFNzg1NCAmJiBJMkMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEFERTc4NTQvNTgvNjgvNzggaG9va2VkIHRvIGFuIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkZTc4NTQtaTJjLgorCitjb25maWcgQURFNzg1NF9TUEkKKwl0cmlzdGF0ZSAic3VwcG9ydCBTUEkgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBBREU3ODU0ICYmIFNQSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgQURFNzg1NC81OC82OC83OCBob29rZWQgdG8gYSBTUEkgYnVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZGU3ODU0LXNwaS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzdkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIG1ldGVyaW5nIGljIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0FERTc3NTMpICs9IGFkZTc3NTMubworb2JqLSQoQ09ORklHX0FERTc3NTQpICs9IGFkZTc3NTQubworCithZGU3NzU4LXkgICAgICAgICAgICAgOj0gYWRlNzc1OF9jb3JlLm8KK2FkZTc3NTgtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGU3NzU4X3JpbmcubyBhZGU3NzU4X3RyaWdnZXIubworb2JqLSQoQ09ORklHX0FERTc3NTgpICs9IGFkZTc3NTgubworCitvYmotJChDT05GSUdfQURFNzc1OSkgKz0gYWRlNzc1OS5vCitvYmotJChDT05GSUdfQURFNzg1NCkgKz0gYWRlNzg1NC5vCitvYmotJChDT05GSUdfQURFNzg1NF9JMkMpICs9IGFkZTc4NTQtaTJjLm8KK29iai0kKENPTkZJR19BREU3ODU0X1NQSSkgKz0gYWRlNzg1NC1zcGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJhZmJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMKQEAgLTAsMCArMSw3MzAgQEAKKy8qCisgKiBBREU3NzUzIFNpbmdsZS1QaGFzZSBNdWx0aWZ1bmN0aW9uIE1ldGVyaW5nIElDIHdpdGggZGkvZHQgU2Vuc29yIEludGVyZmFjZSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1My5oIgorCitpbnQgYWRlNzc1M19zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzUzX1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzUzX1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M19yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTNfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTMyIHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHhGRkZGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTNfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTE2IHZhbDsKKwlhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGU3NzUzX3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19BRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTEFFTkVSR1koYWRlNzc1M19yZWFkXzI0Yml0LCBBREU3NzUzX0xBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFFTkVSR1koYWRlNzc1M19yZWFkXzI0Yml0LCBBREU3NzUzX1ZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19MVkFFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkRFTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzE2Yml0LAorCQlhZGU3NzUzX3dyaXRlXzE2Yml0LAorCQlBREU3NzUzX0NGREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZOVU0oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0ZOVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9DSEtTVU0oYWRlNzc1M19yZWFkXzhiaXQsIEFERTc3NTNfQ0hLU1VNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19QSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19BUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FHQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX1NBR0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19TQUdMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0xJTkVDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9XRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX1dESVYpOworc3RhdGljIElJT19ERVZfQVRUUl9JUk1TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZSTVMoU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzUzX1ZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9JUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19JUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9WUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19WUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9XR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzE2Yml0LAorCQlhZGU3NzUzX3dyaXRlXzE2Yml0LAorCQlBREU3NzUzX1dHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfVkFHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEdBX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19HQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVBLTFZMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0lQS0xWTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZQS0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19WUEtMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfSVBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVBSyhTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVSSU9EKFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJTlVMTCwKKwkJQURFNzc1M19QRVJJT0QpOworc3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYoMSwgU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0gxT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYoMiwgU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0gyT1MpOworCitzdGF0aWMgaW50IGFkZTc3NTNfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTggaXJxZW47CisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTNfSVJRRU4sICZpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFlbiB8PSAxIDw8IDM7IC8qIEVuYWJsZXMgYW4gaW50ZXJydXB0IHdoZW4gYSBkYXRhIGlzCisJCQkJICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMyk7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfOChkZXYsIEFERTc3NTNfSVJRRU4sIGlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLworaW50IGFkZTc3NTNfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTE2IHZhbDsKKwlhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA0OyAgLyogQUQgY29udmVydGVycyBjYW4gYmUgdHVybmVkIG9mZiAqLworCXJldCA9IGFkZTc3NTNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX2luaXRpYWxfc2V0dXAoc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCisJc3QtPnVzLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRlNzc1M19zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkZTc3NTNfcmVzZXQoZGV2KTsKKwltc2xlZXAoQURFNzc1M19TVEFSVFVQX0RFTEFZKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3JlYWRfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0LCBsZW4gPSAwOworCXU4IHQ7CisJaW50IHNwczsKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDExKSAmIDB4MzsKKwlzcHMgPSAyNzkwMCAvICgxICsgdCk7CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkIFNQU1xuIiwgc3BzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCXUxNiByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjc5MDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdC0tOworCisJaWYgKHQgPiAxKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTNfU1BJX1NMT1c7CisJZWxzZQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTNfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDMgPDwgMTEpOworCXJlZyB8PSB0IDw8IDExOworCisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRlNzc1M19yZWFkXzhiaXQpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiLTI1IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX3NjYWxlLCAiMC42NyBDIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfZnJlcXVlbmN5LAorCQlhZGU3NzUzX3dyaXRlX2ZyZXF1ZW5jeSk7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRlNzc1M193cml0ZV9yZXNldCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI3OTAwIDE0MDAwIDcwMDAgMzUwMCIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkZTc3NTMiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTNfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTNfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzUzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9waGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbHZhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZm51bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYWdsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xpbmVjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Noa3N1bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGdhX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3dnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8xLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8yLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93ZGl2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGtsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Zwa2x2bC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGVyaW9kLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTNfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NTNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1M19NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NTNfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1M19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzUzX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NTNfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1MyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzUzX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1M19pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzUzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzUzX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGU3NzUzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzUzX3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1M191bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTNfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1MyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1M19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1M19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1M19pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzUzX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzUzLzYgU2luZ2xlLVBoYXNlIE11bHRpZnVuY3Rpb24gTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzIyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuaApAQCAtMCwwICsxLDE0MCBAQAorI2lmbmRlZiBfQURFNzc1M19ICisjZGVmaW5lIF9BREU3NzUzX0gKKworI2RlZmluZSBBREU3NzUzX1dBVkVGT1JNICAgMHgwMQorI2RlZmluZSBBREU3NzUzX0FFTkVSR1kgICAgMHgwMgorI2RlZmluZSBBREU3NzUzX1JBRU5FUkdZICAgMHgwMworI2RlZmluZSBBREU3NzUzX0xBRU5FUkdZICAgMHgwNAorI2RlZmluZSBBREU3NzUzX1ZBRU5FUkdZICAgMHgwNQorI2RlZmluZSBBREU3NzUzX1JWQUVORVJHWSAgMHgwNgorI2RlZmluZSBBREU3NzUzX0xWQUVORVJHWSAgMHgwNworI2RlZmluZSBBREU3NzUzX0xWQVJFTkVSR1kgMHgwOAorI2RlZmluZSBBREU3NzUzX01PREUgICAgICAgMHgwOQorI2RlZmluZSBBREU3NzUzX0lSUUVOICAgICAgMHgwQQorI2RlZmluZSBBREU3NzUzX1NUQVRVUyAgICAgMHgwQgorI2RlZmluZSBBREU3NzUzX1JTVFNUQVRVUyAgMHgwQworI2RlZmluZSBBREU3NzUzX0NIMU9TICAgICAgMHgwRAorI2RlZmluZSBBREU3NzUzX0NIMk9TICAgICAgMHgwRQorI2RlZmluZSBBREU3NzUzX0dBSU4gICAgICAgMHgwRgorI2RlZmluZSBBREU3NzUzX1BIQ0FMICAgICAgMHgxMAorI2RlZmluZSBBREU3NzUzX0FQT1MgICAgICAgMHgxMQorI2RlZmluZSBBREU3NzUzX1dHQUlOICAgICAgMHgxMgorI2RlZmluZSBBREU3NzUzX1dESVYgICAgICAgMHgxMworI2RlZmluZSBBREU3NzUzX0NGTlVNICAgICAgMHgxNAorI2RlZmluZSBBREU3NzUzX0NGREVOICAgICAgMHgxNQorI2RlZmluZSBBREU3NzUzX0lSTVMgICAgICAgMHgxNgorI2RlZmluZSBBREU3NzUzX1ZSTVMgICAgICAgMHgxNworI2RlZmluZSBBREU3NzUzX0lSTVNPUyAgICAgMHgxOAorI2RlZmluZSBBREU3NzUzX1ZSTVNPUyAgICAgMHgxOQorI2RlZmluZSBBREU3NzUzX1ZBR0FJTiAgICAgMHgxQQorI2RlZmluZSBBREU3NzUzX1ZBRElWICAgICAgMHgxQgorI2RlZmluZSBBREU3NzUzX0xJTkVDWUMgICAgMHgxQworI2RlZmluZSBBREU3NzUzX1pYVE9VVCAgICAgMHgxRAorI2RlZmluZSBBREU3NzUzX1NBR0NZQyAgICAgMHgxRQorI2RlZmluZSBBREU3NzUzX1NBR0xWTCAgICAgMHgxRgorI2RlZmluZSBBREU3NzUzX0lQS0xWTCAgICAgMHgyMAorI2RlZmluZSBBREU3NzUzX1ZQS0xWTCAgICAgMHgyMQorI2RlZmluZSBBREU3NzUzX0lQRUFLICAgICAgMHgyMgorI2RlZmluZSBBREU3NzUzX1JTVElQRUFLICAgMHgyMworI2RlZmluZSBBREU3NzUzX1ZQRUFLICAgICAgMHgyNAorI2RlZmluZSBBREU3NzUzX1JTVFZQRUFLICAgMHgyNQorI2RlZmluZSBBREU3NzUzX1RFTVAgICAgICAgMHgyNgorI2RlZmluZSBBREU3NzUzX1BFUklPRCAgICAgMHgyNworI2RlZmluZSBBREU3NzUzX1RNT0RFICAgICAgMHgzRAorI2RlZmluZSBBREU3NzUzX0NIS1NVTSAgICAgMHgzRQorI2RlZmluZSBBREU3NzUzX0RJRVJFViAgICAgMHgzRgorCisjZGVmaW5lIEFERTc3NTNfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBREU3NzUzX1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBREU3NzUzX01BWF9UWCAgICA0CisjZGVmaW5lIEFERTc3NTNfTUFYX1JYICAgIDQKKyNkZWZpbmUgQURFNzc1M19TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3NzUzX1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTNfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzUzX1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzc1MyIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc3NTNfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGU3NzUzX3NjYW4geworCUFERTc3NTNfU0NBTl9BQ1RJVkVfUE9XRVIsCisJQURFNzc1M19TQ0FOX0NIMSwKKwlBREU3NzUzX1NDQU5fQ0gyLAorfTsKKwordm9pZCBhZGU3NzUzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkZTc3NTNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGU3NzUzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzc1M19jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzc1M191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzc1M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc3NTNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzUzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzUzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzUzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzUzX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NTNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1M191bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGVkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpAQCAtMCwwICsxLDc1NiBAQAorLyoKKyAqIEFERTc3NTQgUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3NzU0LmgiCisKK3N0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU0X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU0X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTMyIHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHhGRkZGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGU3NzU0X3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9BRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTEFFTkVSR1koYWRlNzc1NF9yZWFkXzI0Yml0LCBBREU3NzU0X0xBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFFTkVSR1koYWRlNzc1NF9yZWFkXzI0Yml0LCBBREU3NzU0X1ZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9MVkFFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X1ZQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X0FQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9CUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfQ1BIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUFQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BQVBPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JBUE9TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQkFQT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DQVBPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NBUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfV0RJVihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9XRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFESVYoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfVkFESVYpOworc3RhdGljIElJT19ERVZfQVRUUl9DRk5VTShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NGTlVNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9DRkRFTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BQVBHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0JBUEdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ0FQR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9BSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9CSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9DSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9BVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9CVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9DVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0FJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9CSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ0lSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0FWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9CVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ1ZSTVNPUyk7CisKK3N0YXRpYyBpbnQgYWRlNzc1NF9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldDsKKwl1MTYgaXJxZW47CisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBREU3NzU0X0lSUUVOLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAxNDsgLyogRW5hYmxlcyBhbiBpbnRlcnJ1cHQgd2hlbiBhIGRhdGEgaXMKKwkJCQkgICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTQpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURFNzc1NF9JUlFFTiwgaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IGFkZTc3NTRfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gNyA8PCAzOyAgLyogQURFNzc1NCBwb3dlcmVkIGRvd24gKi8KKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBREU3NzU0X09QTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogdXNlIGxvdyBzcGkgc3BlZWQgZm9yIGluaXQgKi8KKwlzdC0+dXMtPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGU3NzU0X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRlNzc1NF9yZXNldChkZXYpOworCW1zbGVlcChBREU3NzU0X1NUQVJUVVBfREVMQVkpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTggdDsKKwlpbnQgc3BzOworCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9XQVZNT0RFLAorCQkJJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0ID0gKHQgPj4gMykgJiAweDM7CisJc3BzID0gMjYwMDAgLyAoMSArIHQpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjYwMDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdC0tOworCisJaWYgKHQgPiAxKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTRfU1BJX1NMT1c7CisJZWxzZQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTRfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTRfV0FWTU9ERSwKKwkJCSZyZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmVnICY9IH4oMyA8PCAzKTsKKwlyZWcgfD0gdCA8PCAzOworCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9XQVZNT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU0X3JlYWRfOGJpdCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIxMjkgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICI0IEMiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF9mcmVxdWVuY3ksCisJCWFkZTc3NTRfd3JpdGVfZnJlcXVlbmN5KTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3NzU0X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjYwMDAgMTMwMDAgNjUwMDAgMzMwMDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1NF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbGFlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sdmFlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9icGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWFwb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JhcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfd2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFkaXYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmbnVtLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZmRlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2FfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2NfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU0X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU0X2F0dHJpYnV0ZXMsCit9OworCisKKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1NF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBREU3NzU0X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURFNzc1NF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGU3NzU0X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkZTc3NTRfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZGU3NzU0Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkZTc3NTRfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3NzU0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkZTc3NTRfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkZTc3NTRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCXJldCA9IGFkZTc3NTRfc3RvcF9kZXZpY2UoJihpbmRpb19kZXYtPmRldikpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JldDsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1NF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1NCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1NF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1NF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTRfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzU0X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzU0IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5oCkBAIC0wLDAgKzEsMTYxIEBACisjaWZuZGVmIF9BREU3NzU0X0gKKyNkZWZpbmUgX0FERTc3NTRfSAorCisjZGVmaW5lIEFERTc3NTRfQUVORVJHWSAgIDB4MDEKKyNkZWZpbmUgQURFNzc1NF9SQUVORVJHWSAgMHgwMgorI2RlZmluZSBBREU3NzU0X0xBRU5FUkdZICAweDAzCisjZGVmaW5lIEFERTc3NTRfVkFFTkVSR1kgIDB4MDQKKyNkZWZpbmUgQURFNzc1NF9SVkFFTkVSR1kgMHgwNQorI2RlZmluZSBBREU3NzU0X0xWQUVORVJHWSAweDA2CisjZGVmaW5lIEFERTc3NTRfUEVSSU9EICAgIDB4MDcKKyNkZWZpbmUgQURFNzc1NF9URU1QICAgICAgMHgwOAorI2RlZmluZSBBREU3NzU0X1dGT1JNICAgICAweDA5CisjZGVmaW5lIEFERTc3NTRfT1BNT0RFICAgIDB4MEEKKyNkZWZpbmUgQURFNzc1NF9NTU9ERSAgICAgMHgwQgorI2RlZmluZSBBREU3NzU0X1dBVk1PREUgICAweDBDCisjZGVmaW5lIEFERTc3NTRfV0FUTU9ERSAgIDB4MEQKKyNkZWZpbmUgQURFNzc1NF9WQU1PREUgICAgMHgwRQorI2RlZmluZSBBREU3NzU0X0lSUUVOICAgICAweDBGCisjZGVmaW5lIEFERTc3NTRfU1RBVFVTICAgIDB4MTAKKyNkZWZpbmUgQURFNzc1NF9SU1RBVFVTICAgMHgxMQorI2RlZmluZSBBREU3NzU0X1pYVE9VVCAgICAweDEyCisjZGVmaW5lIEFERTc3NTRfTElOQ1lDICAgIDB4MTMKKyNkZWZpbmUgQURFNzc1NF9TQUdDWUMgICAgMHgxNAorI2RlZmluZSBBREU3NzU0X1NBR0xWTCAgICAweDE1CisjZGVmaW5lIEFERTc3NTRfVlBFQUsgICAgIDB4MTYKKyNkZWZpbmUgQURFNzc1NF9JUEVBSyAgICAgMHgxNworI2RlZmluZSBBREU3NzU0X0dBSU4gICAgICAweDE4CisjZGVmaW5lIEFERTc3NTRfQVdHICAgICAgIDB4MTkKKyNkZWZpbmUgQURFNzc1NF9CV0cgICAgICAgMHgxQQorI2RlZmluZSBBREU3NzU0X0NXRyAgICAgICAweDFCCisjZGVmaW5lIEFERTc3NTRfQVZBRyAgICAgIDB4MUMKKyNkZWZpbmUgQURFNzc1NF9CVkFHICAgICAgMHgxRAorI2RlZmluZSBBREU3NzU0X0NWQUcgICAgICAweDFFCisjZGVmaW5lIEFERTc3NTRfQVBIQ0FMICAgIDB4MUYKKyNkZWZpbmUgQURFNzc1NF9CUEhDQUwgICAgMHgyMAorI2RlZmluZSBBREU3NzU0X0NQSENBTCAgICAweDIxCisjZGVmaW5lIEFERTc3NTRfQUFQT1MgICAgIDB4MjIKKyNkZWZpbmUgQURFNzc1NF9CQVBPUyAgICAgMHgyMworI2RlZmluZSBBREU3NzU0X0NBUE9TICAgICAweDI0CisjZGVmaW5lIEFERTc3NTRfQ0ZOVU0gICAgIDB4MjUKKyNkZWZpbmUgQURFNzc1NF9DRkRFTiAgICAgMHgyNgorI2RlZmluZSBBREU3NzU0X1dESVYgICAgICAweDI3CisjZGVmaW5lIEFERTc3NTRfVkFESVYgICAgIDB4MjgKKyNkZWZpbmUgQURFNzc1NF9BSVJNUyAgICAgMHgyOQorI2RlZmluZSBBREU3NzU0X0JJUk1TICAgICAweDJBCisjZGVmaW5lIEFERTc3NTRfQ0lSTVMgICAgIDB4MkIKKyNkZWZpbmUgQURFNzc1NF9BVlJNUyAgICAgMHgyQworI2RlZmluZSBBREU3NzU0X0JWUk1TICAgICAweDJECisjZGVmaW5lIEFERTc3NTRfQ1ZSTVMgICAgIDB4MkUKKyNkZWZpbmUgQURFNzc1NF9BSVJNU09TICAgMHgyRgorI2RlZmluZSBBREU3NzU0X0JJUk1TT1MgICAweDMwCisjZGVmaW5lIEFERTc3NTRfQ0lSTVNPUyAgIDB4MzEKKyNkZWZpbmUgQURFNzc1NF9BVlJNU09TICAgMHgzMgorI2RlZmluZSBBREU3NzU0X0JWUk1TT1MgICAweDMzCisjZGVmaW5lIEFERTc3NTRfQ1ZSTVNPUyAgIDB4MzQKKyNkZWZpbmUgQURFNzc1NF9BQVBHQUlOICAgMHgzNQorI2RlZmluZSBBREU3NzU0X0JBUEdBSU4gICAweDM2CisjZGVmaW5lIEFERTc3NTRfQ0FQR0FJTiAgIDB4MzcKKyNkZWZpbmUgQURFNzc1NF9BVkdBSU4gICAgMHgzOAorI2RlZmluZSBBREU3NzU0X0JWR0FJTiAgICAweDM5CisjZGVmaW5lIEFERTc3NTRfQ1ZHQUlOICAgIDB4M0EKKyNkZWZpbmUgQURFNzc1NF9DSEtTVU0gICAgMHgzRQorI2RlZmluZSBBREU3NzU0X1ZFUlNJT04gICAweDNGCisKKyNkZWZpbmUgQURFNzc1NF9SRUFEX1JFRyhhKSAgICBhCisjZGVmaW5lIEFERTc3NTRfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFERTc3NTRfTUFYX1RYICAgIDQKKyNkZWZpbmUgQURFNzc1NF9NQVhfUlggICAgNAorI2RlZmluZSBBREU3NzU0X1NUQVJUVVBfREVMQVkgMQorCisjZGVmaW5lIEFERTc3NTRfU1BJX1NMT1cJKHUzMikoMzAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1NF9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTRfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGU3NzU0IgorCisvKioKKyAqIHN0cnVjdCBhZGU3NzU0X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkZTc3NTRfc2NhbiB7CisJQURFNzc1NF9TQ0FOX1BIQV9WLAorCUFERTc3NTRfU0NBTl9QSEJfViwKKwlBREU3NzU0X1NDQU5fUEhDX1YsCisJQURFNzc1NF9TQ0FOX1BIQV9JLAorCUFERTc3NTRfU0NBTl9QSEJfSSwKKwlBREU3NzU0X1NDQU5fUEhDX0ksCit9OworCit2b2lkIGFkZTc3NTRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzc1NF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc3NTRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzc1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzc1NF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc3NTRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzU0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YmI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OC5oCkBAIC0wLDAgKzEsMTcxIEBACisjaWZuZGVmIF9BREU3NzU4X0gKKyNkZWZpbmUgX0FERTc3NThfSAorCisjZGVmaW5lIEFERTc3NThfQVdBVFRIUiAgIDB4MDEKKyNkZWZpbmUgQURFNzc1OF9CV0FUVEhSICAgMHgwMgorI2RlZmluZSBBREU3NzU4X0NXQVRUSFIgICAweDAzCisjZGVmaW5lIEFERTc3NThfQVZBUkhSICAgIDB4MDQKKyNkZWZpbmUgQURFNzc1OF9CVkFSSFIgICAgMHgwNQorI2RlZmluZSBBREU3NzU4X0NWQVJIUiAgICAweDA2CisjZGVmaW5lIEFERTc3NThfQVZBSFIgICAgIDB4MDcKKyNkZWZpbmUgQURFNzc1OF9CVkFIUiAgICAgMHgwOAorI2RlZmluZSBBREU3NzU4X0NWQUhSICAgICAweDA5CisjZGVmaW5lIEFERTc3NThfQUlSTVMgICAgIDB4MEEKKyNkZWZpbmUgQURFNzc1OF9CSVJNUyAgICAgMHgwQgorI2RlZmluZSBBREU3NzU4X0NJUk1TICAgICAweDBDCisjZGVmaW5lIEFERTc3NThfQVZSTVMgICAgIDB4MEQKKyNkZWZpbmUgQURFNzc1OF9CVlJNUyAgICAgMHgwRQorI2RlZmluZSBBREU3NzU4X0NWUk1TICAgICAweDBGCisjZGVmaW5lIEFERTc3NThfRlJFUSAgICAgIDB4MTAKKyNkZWZpbmUgQURFNzc1OF9URU1QICAgICAgMHgxMQorI2RlZmluZSBBREU3NzU4X1dGT1JNICAgICAweDEyCisjZGVmaW5lIEFERTc3NThfT1BNT0RFICAgIDB4MTMKKyNkZWZpbmUgQURFNzc1OF9NTU9ERSAgICAgMHgxNAorI2RlZmluZSBBREU3NzU4X1dBVk1PREUgICAweDE1CisjZGVmaW5lIEFERTc3NThfQ09NUE1PREUgIDB4MTYKKyNkZWZpbmUgQURFNzc1OF9MQ1lDTU9ERSAgMHgxNworI2RlZmluZSBBREU3NzU4X01BU0sgICAgICAweDE4CisjZGVmaW5lIEFERTc3NThfU1RBVFVTICAgIDB4MTkKKyNkZWZpbmUgQURFNzc1OF9SU1RBVFVTICAgMHgxQQorI2RlZmluZSBBREU3NzU4X1pYVE9VVCAgICAweDFCCisjZGVmaW5lIEFERTc3NThfTElORUNZQyAgIDB4MUMKKyNkZWZpbmUgQURFNzc1OF9TQUdDWUMgICAgMHgxRAorI2RlZmluZSBBREU3NzU4X1NBR0xWTCAgICAweDFFCisjZGVmaW5lIEFERTc3NThfVlBJTlRMVkwgIDB4MUYKKyNkZWZpbmUgQURFNzc1OF9JUElOVExWTCAgMHgyMAorI2RlZmluZSBBREU3NzU4X1ZQRUFLICAgICAweDIxCisjZGVmaW5lIEFERTc3NThfSVBFQUsgICAgIDB4MjIKKyNkZWZpbmUgQURFNzc1OF9HQUlOICAgICAgMHgyMworI2RlZmluZSBBREU3NzU4X0FWUk1TR0FJTiAweDI0CisjZGVmaW5lIEFERTc3NThfQlZSTVNHQUlOIDB4MjUKKyNkZWZpbmUgQURFNzc1OF9DVlJNU0dBSU4gMHgyNgorI2RlZmluZSBBREU3NzU4X0FJR0FJTiAgICAweDI3CisjZGVmaW5lIEFERTc3NThfQklHQUlOICAgIDB4MjgKKyNkZWZpbmUgQURFNzc1OF9DSUdBSU4gICAgMHgyOQorI2RlZmluZSBBREU3NzU4X0FXRyAgICAgICAweDJBCisjZGVmaW5lIEFERTc3NThfQldHICAgICAgIDB4MkIKKyNkZWZpbmUgQURFNzc1OF9DV0cgICAgICAgMHgyQworI2RlZmluZSBBREU3NzU4X0FWQVJHICAgICAweDJECisjZGVmaW5lIEFERTc3NThfQlZBUkcgICAgIDB4MkUKKyNkZWZpbmUgQURFNzc1OF9DVkFSRyAgICAgMHgyRgorI2RlZmluZSBBREU3NzU4X0FWQUcgICAgICAweDMwCisjZGVmaW5lIEFERTc3NThfQlZBRyAgICAgIDB4MzEKKyNkZWZpbmUgQURFNzc1OF9DVkFHICAgICAgMHgzMgorI2RlZmluZSBBREU3NzU4X0FWUk1TT1MgICAweDMzCisjZGVmaW5lIEFERTc3NThfQlZSTVNPUyAgIDB4MzQKKyNkZWZpbmUgQURFNzc1OF9DVlJNU09TICAgMHgzNQorI2RlZmluZSBBREU3NzU4X0FJUk1TT1MgICAweDM2CisjZGVmaW5lIEFERTc3NThfQklSTVNPUyAgIDB4MzcKKyNkZWZpbmUgQURFNzc1OF9DSVJNU09TICAgMHgzOAorI2RlZmluZSBBREU3NzU4X0FXQUlUT1MgICAweDM5CisjZGVmaW5lIEFERTc3NThfQldBSVRPUyAgIDB4M0EKKyNkZWZpbmUgQURFNzc1OF9DV0FJVE9TICAgMHgzQgorI2RlZmluZSBBREU3NzU4X0FWQVJPUyAgICAweDNDCisjZGVmaW5lIEFERTc3NThfQlZBUk9TICAgIDB4M0QKKyNkZWZpbmUgQURFNzc1OF9DVkFST1MgICAgMHgzRQorI2RlZmluZSBBREU3NzU4X0FQSENBTCAgICAweDNGCisjZGVmaW5lIEFERTc3NThfQlBIQ0FMICAgIDB4NDAKKyNkZWZpbmUgQURFNzc1OF9DUEhDQUwgICAgMHg0MQorI2RlZmluZSBBREU3NzU4X1dESVYgICAgICAweDQyCisjZGVmaW5lIEFERTc3NThfVkFESVYgICAgIDB4NDQKKyNkZWZpbmUgQURFNzc1OF9WQVJESVYgICAgMHg0MworI2RlZmluZSBBREU3NzU4X0FQQ0ZOVU0gICAweDQ1CisjZGVmaW5lIEFERTc3NThfQVBDRkRFTiAgIDB4NDYKKyNkZWZpbmUgQURFNzc1OF9WQVJDRk5VTSAgMHg0NworI2RlZmluZSBBREU3NzU4X1ZBUkNGREVOICAweDQ4CisjZGVmaW5lIEFERTc3NThfQ0hLU1VNICAgIDB4N0UKKyNkZWZpbmUgQURFNzc1OF9WRVJTSU9OICAgMHg3RgorCisjZGVmaW5lIEFERTc3NThfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBREU3NzU4X1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBREU3NzU4X01BWF9UWCAgICA4CisjZGVmaW5lIEFERTc3NThfTUFYX1JYICAgIDQKKyNkZWZpbmUgQURFNzc1OF9TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3NzU4X1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NThfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU4X1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzc1OCIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc3NThfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzc1OF9zY2FuIHsKKwlBREU3NzU4X1NDQU5fV0ZPUk0sCit9OworCit2b2lkIGFkZTc3NThfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzc1OF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc3NThfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpOworCisKK2ludCBhZGU3NzU4X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGU3NzU4X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK2ludCBhZGU3NzU4X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU4X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzU4X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzYzNGNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwpAQCAtMCwwICsxLDg2NiBAQAorLyoKKyAqIEFERTc3NTggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3NzU4LmgiCisKK2ludCBhZGU3NzU4X3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsOworCisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSB2YWx1ZSAmIDB4RkY7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFszXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgOCkgfCBzdC0+cnhbMl07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAyNCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworaW50IGFkZTc3NThfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9PUE1PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzc1OF9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9BUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9CUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfQlBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X0NQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1dESVYoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfV0RJVik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X1ZBRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0FJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0JJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0NJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0FWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0JWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0NWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQklSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9DSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQlZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9DVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQUlHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ0lHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQVZSTVNHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQlZSTVNHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ1ZSTVNHQUlOKTsKKworaW50IGFkZTc3NThfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTMyIGlycWVuOworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzI0KGRldiwgQURFNzc1OF9NQVNLLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAxNjsgLyogRW5hYmxlcyBhbiBpbnRlcnJ1cHQgd2hlbiBhIGRhdGEgaXMKKwkJCQkgICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTYpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzI0KGRldiwgQURFNzc1OF9NQVNLLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgYWRlNzc1OF9zdG9wX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisJYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X09QTU9ERSwKKwkJCSZ2YWwpOworCXZhbCB8PSA3IDw8IDM7ICAvKiBBREU3NzU4IHBvd2VyZWQgZG93biAqLworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfT1BNT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc3NThfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3NzU4X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc3NThfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1OCB0OworCWludCBzcHM7CisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSAodCA+PiA1KSAmIDB4MzsKKwlzcHMgPSAyNjA0MCAvICgxIDw8IHQpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjYwNDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdCA+Pj0gMTsKKworCWlmICh0ID4gMSkKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU4X1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU4X1NQSV9GQVNUOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDUgPDwgMyk7CisJcmVnIHw9IHQgPDwgNTsKKworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfV0FWTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkX3dhdmVmb3JtX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTggdDsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NThfV0FWTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDIpICYgMHg3OworCisJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgdCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3dyaXRlX3dhdmVmb3JtX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCXU4IHJlZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgPiA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDcgPDwgMik7CisJcmVnIHw9IHZhbCA8PCAyOworCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9XQVZNT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkZTc3NThfcmVhZF84Yml0KTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjEyOSBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjQgQyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FXQVRUSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0FXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CV0FUVEhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1dBVFRIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQ1dBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWQVJIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQVZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZBUkhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DVkFSSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0NWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9BVkFIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CVkFIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9DVkFIUik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfZnJlcXVlbmN5LAorCQlhZGU3NzU4X3dyaXRlX2ZyZXF1ZW5jeSk7CisKKy8qKgorICogSUlPX0RFVl9BVFRSX1dBVkVGT1JNX1RZUEUgLSBzZXQgdGhlIHR5cGUgb2Ygd2F2ZWZvcm0uCisgKiBAX21vZGU6IHN5c2ZzIGZpbGUgbW9kZS9wZXJtaXNzaW9ucworICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqKi8KKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1dBVkVGT1JNX1RZUEUoX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih3YXZlZm9ybV90eXBlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKworc3RhdGljIElJT19ERVZfQVRUUl9XQVZFRk9STV9UWVBFKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfd2F2ZWZvcm1fdHlwZSwKKwkJYWRlNzc1OF93cml0ZV93YXZlZm9ybV90eXBlKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3NzU4X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjYwMDAgMTMwMDAgNjUwMDAgMzMwMDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU4Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3dhdmVmb3JtX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXdhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3dhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdnBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2lwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3BoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93ZGl2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWRpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtc2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU4X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X2F0dHJpYnV0ZXMsCit9OworCisKKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1OF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBREU3NzU4X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURFNzc1OF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGU3NzU4X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRlNzc1OF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZGU3NzU4Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3NzU4X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkZTc3NThfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkZTc3NThfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCXJldCA9IGFkZTc3NThfc3RvcF9kZXZpY2UoJihpbmRpb19kZXYtPmRldikpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JldDsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGU3NzU4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGU3NzU4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGU3NzU4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGU3NzU4X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGU3NzU4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRlNzc1OF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRlNzc1OF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkZTc3NThfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRlNzc1OF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRlNzc1OF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTAsMCArMSwyMTIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiLi4vYWNjZWwvYWNjZWwuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRlNzc1OC5oIgorCisvKioKKyAqIGNvbWJpbmVfOF90b18zMigpIHV0aWxpdHkgZnVuY3Rpb24gdG8gbXVuZ2UgdG8gdThzIGludG8gdTMyCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBjb21iaW5lXzhfdG9fMzIodTggbG93ZXIsIHU4IG1pZCwgdTggdXBwZXIpCit7CisJdTMyIF9sb3dlciA9IGxvd2VyOworCXUzMiBfbWlkID0gbWlkOworCXUzMiBfdXBwZXIgPSB1cHBlcjsKKworCXJldHVybiBfbG93ZXIgfCAoX21pZCA8PCA4KSB8IChfdXBwZXIgPDwgMTYpOworfQorCitzdGF0aWMgSUlPX1NDQU5fRUxfQyh3Zm9ybSwgQURFNzc1OF9TQ0FOX1dGT1JNLCBBREU3NzU4X1dGT1JNLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUod2Zvcm0sIHMsIDI0LCAzMik7CitzdGF0aWMgSUlPX1NDQU5fRUxfVElNRVNUQU1QKDEpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0aW1lc3RhbXAsIHMsIDY0LCA2NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU4X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfd2Zvcm0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfd2Zvcm1faW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfd2Zvcm1fdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90aW1lc3RhbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NThfc2Nhbl9lbF9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X3NjYW5fZWxfYXR0cnMsCisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCit9OworCisvKioKKyAqIGFkZTc3NThfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKKyAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKKyAqKi8KK3N0YXRpYyB2b2lkIGFkZTc3NThfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQoreworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lOworCXNjaGVkdWxlX3dvcmsoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJLyogSW5kaWNhdGUgdGhhdCB0aGlzIGludGVycnVwdCBpcyBiZWluZyBoYW5kbGVkICovCisKKwkvKiBUZWNobmljYWxseSB0aGlzIGlzIHRyaWdnZXIgcmVsYXRlZCwgYnV0IHdpdGhvdXQgdGhpcworCSAqIGhhbmRsZXIgcnVubmluZyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IGZvciB0aGUgaW50ZXJydXB0CisJICogdG8gY2xlYXIuCisJICovCit9CisKKy8qKgorICogYWRlNzc1OF9zcGlfcmVhZF9idXJzdCgpIC0gcmVhZCBhbGwgZGF0YSByZWdpc3RlcnMKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMjQgYnl0ZXMpCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDQsCisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1JFQURfUkVHKEFERTc3NThfUlNUQVRVUyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisJc3QtPnR4WzRdID0gQURFNzc1OF9SRUFEX1JFRyhBREU3NzU4X1dGT1JNKTsKKwlzdC0+dHhbNV0gPSAwOworCXN0LT50eFs2XSA9IDA7CisJc3QtPnR4WzddID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyBXRk9STSB2YWx1ZVxuIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBXaGlsc3QgdGhpcyBtYWtlcyBhIGxvdCBvZiBjYWxscyB0byBpaW9fc3dfcmluZyBmdW5jdGlvbnMgLSBpdCBpcyB0byBkZXZpY2UKKyAqIHNwZWNpZmljIHRvIGJlIHJvbGxlZCBpbnRvIHRoZSBjb3JlLgorICovCitzdGF0aWMgdm9pZCBhZGU3NzU4X3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QKKwkJPSBjb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSwKKwkJCSAgICAgICB3b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IHN0LT5pbmRpb19kZXYtPnJpbmc7CisKKwlpbnQgaSA9IDA7CisJczMyICpkYXRhOworCXNpemVfdCBkYXRhc2l6ZSA9IHJpbmctPmFjY2Vzcy5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOworCisJZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyaW5nLT5zY2FuX2NvdW50KQorCQlpZiAoYWRlNzc1OF9zcGlfcmVhZF9idXJzdCgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzMyKHN0LT5yeFtpKjIrMl0sCisJCQkJCQlzdC0+cnhbaSoyKzFdLAorCQkJCQkJc3QtPnJ4W2kqMl0pOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikKKwkJKCgodTMyKWRhdGEgKyA0ICogcmluZy0+c2Nhbl9jb3VudCArIDQpICYgfjB4NykpID0KKwkJCXN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworfQorCitpbnQgYWRlNzc1OF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRlNzc1OF90cmlnZ2VyX2JoX3RvX3JpbmcpOworCisJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghcmluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KKwlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKKwlyaW5nLT5icGUgPSA0OworCXJpbmctPnNjYW5fZWxfYXR0cnMgPSAmYWRlNzc1OF9zY2FuX2VsX2dyb3VwOworCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKKwlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfd2Zvcm0ubnVtYmVyKTsKKworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZhZGU3NzU4X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFiY2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRlNzc1OC5oIgorCisvKioKKyAqIGFkZTc3NThfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfZGF0YV9yZHlfdHJpZ19wb2xsKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJCQkgICAgICAgaW50IGluZGV4LAorCQkJCSAgICAgICBzNjQgdGltZXN0YW1wLAorCQkJCSAgICAgICBpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSBzdC0+dHJpZzsKKworCWlpb190cmlnZ2VyX3BvbGwodHJpZywgdGltZXN0YW1wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworSUlPX0VWRU5UX1NIKGRhdGFfcmR5X3RyaWcsICZhZGU3NzU4X2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF90cmlnZ2VyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1OF90cmlnZ2VyX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OF90cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKCkgc2V0IGRhdGFyZHkgaW50ZXJydXB0IHN0YXRlCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorCQkJCQkJYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRlNzc1OF9zZXRfaXJxKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0YXRlKTsKKwlpZiAoc3RhdGUgPT0gZmFsc2UpIHsKKwkJaWlvX3JlbW92ZV9ldmVudF9mcm9tX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCQkgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdCisJCQkJCSAgIC0+ZXZfbGlzdCk7CisJCS8qIHBvc3NpYmxlIHF1aXJrIHdpdGggaGFuZGxlciBjdXJyZW50bHkgd29ya2VkIGFyb3VuZAorCQkgICBieSBlbnN1cmluZyB0aGUgd29yayBxdWV1ZSBpcyBlbXB0eSAqLworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCX0gZWxzZSB7CisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJICAgICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRlNzc1OF90cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfdHJpZ190cnlfcmVlbihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCWVuYWJsZV9pcnEoc3QtPnVzLT5pcnEpOworCS8qIGlycSByZWVuYWJsZWQgc28gc3VjY2VzcyEgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSJhZGU3NzU4LWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkZTc3NThfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGU7CisJc3QtPnRyaWctPnRyeV9yZWVuYWJsZSA9ICZhZGU3NzU4X3RyaWdfdHJ5X3JlZW47CisJc3QtPnRyaWctPmNvbnRyb2xfYXR0cnMgPSAmYWRlNzc1OF90cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0YXRlID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RhdGUtPnRyaWcpOworCWtmcmVlKHN0YXRlLT50cmlnLT5uYW1lKTsKKwlpaW9fZnJlZV90cmlnZ2VyKHN0YXRlLT50cmlnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYzNjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQURFNzc1OSBBY3RpdmUgRW5lcmd5IE1ldGVyaW5nIElDIHdpdGggZGkvZHQgU2Vuc29yIEludGVyZmFjZSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1OS5oIgorCitpbnQgYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU5X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzQwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU2NCAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNiwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU5X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwltZW1zZXQoJnN0LT50eFsxXSwgMCAsIDUpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgNDAgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9ICgodTY0KXN0LT5yeFsxXSA8PCAzMikgfCAoc3QtPnJ4WzJdIDw8IDI0KSB8CisJCShzdC0+cnhbM10gPDwgMTYpIHwgKHN0LT5yeFs0XSA8PCA4KSB8IHN0LT5yeFs1XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3JlYWRfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfcmVhZF80MGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1NjQgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ180MChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsOworCWFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZ2YWwpOworCXZhbCB8PSAxIDw8IDY7IC8qIFNvZnR3YXJlIENoaXAgUmVzZXQgKi8KKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkZTc3NTlfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FFTkVSR1koYWRlNzc1OV9yZWFkXzQwYml0LCBBREU3NzU5X0FFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkRFTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzE2Yml0LAorCQlhZGU3NzU5X3dyaXRlXzE2Yml0LAorCQlBREU3NzU5X0NGREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZOVU0oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF84Yml0LAorCQlhZGU3NzU5X3dyaXRlXzhiaXQsCisJCUFERTc3NTlfQ0ZOVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9DSEtTVU0oYWRlNzc1OV9yZWFkXzhiaXQsIEFERTc3NTlfQ0hLU1VNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OV93cml0ZV8xNmJpdCwKKwkJQURFNzc1OV9QSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OV93cml0ZV8xNmJpdCwKKwkJQURFNzc1OV9BUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FHQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X1NBR0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9TQUdMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0xJTkVDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9MRU5FUkdZKGFkZTc3NTlfcmVhZF80MGJpdCwgQURFNzc1OV9MRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEdBX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF84Yml0LAorCQlhZGU3NzU5X3dyaXRlXzhiaXQsCisJCUFERTc3NTlfR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfMTZiaXQsCisJCWFkZTc3NTlfd3JpdGVfMTZiaXQsCisJCUFERTc3NTlfQVBHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDEsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0NIMU9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDIsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0NIMk9TKTsKKworc3RhdGljIGludCBhZGU3NzU5X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXU4IGlycWVuOworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoZGV2LCBBREU3NzU5X0lSUUVOLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAzOyAvKiBFbmFibGVzIGFuIGludGVycnVwdCB3aGVuIGEgZGF0YSBpcworCQkJCSAgICBwcmVzZW50IGluIHRoZSB3YXZlZm9ybSByZWdpc3RlciAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDMpOworCisJcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzU5X0lSUUVOLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KK2ludCBhZGU3NzU5X3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWw7CisJYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNDsgIC8qIEFEIGNvbnZlcnRlcnMgY2FuIGJlIHR1cm5lZCBvZmYgKi8KKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc3NTlfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3NzU5X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc3NTlfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1MTYgdDsKKwlpbnQgc3BzOworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDMpICYgMHgzOworCXNwcyA9IDI3OTAwIC8gKDEgKyB0KTsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisJdTE2IHJlZywgdDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJdCA9ICgyNzkwMCAvIHZhbCk7CisJaWYgKHQgPiAwKQorCQl0LS07CisKKwlpZiAodCA+IDEpCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OV9TUElfU0xPVzsKKwllbHNlCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OV9TUElfRkFTVDsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZyZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmVnICY9IH4oMyA8PCAxMyk7CisJcmVnIHw9IHQgPDwgMTM7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU5X3JlYWRfOGJpdCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICI3MCBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjEgQyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkX2ZyZXF1ZW5jeSwKKwkJYWRlNzc1OV93cml0ZV9mcmVxdWVuY3kpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFU0VUKGFkZTc3NTlfd3JpdGVfcmVzZXQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIyNzkwMCAxNDAwMCA3MDAwIDM1MDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU5Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZm51bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYWdsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xpbmVjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Noa3N1bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGdhX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8xLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8yLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTlfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTlfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NTlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1OV9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NTlfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1OV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1OV9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzU5X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NTlfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1OSIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzU5X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1OV9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzU5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzU5X3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGU3NzU5X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzU5X3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1OV91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTlfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1OV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1OSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1OV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1OV9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1OV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzU5X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzU5IEFjdGl2ZSBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2RlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfQURFNzc1OV9ICisjZGVmaW5lIF9BREU3NzU5X0gKKworI2RlZmluZSBBREU3NzU5X1dBVkVGT1JNICAweDAxCisjZGVmaW5lIEFERTc3NTlfQUVORVJHWSAgIDB4MDIKKyNkZWZpbmUgQURFNzc1OV9SU1RFTkVSR1kgMHgwMworI2RlZmluZSBBREU3NzU5X1NUQVRVUyAgICAweDA0CisjZGVmaW5lIEFERTc3NTlfUlNUU1RBVFVTIDB4MDUKKyNkZWZpbmUgQURFNzc1OV9NT0RFICAgICAgMHgwNgorI2RlZmluZSBBREU3NzU5X0NGREVOICAgICAweDA3CisjZGVmaW5lIEFERTc3NTlfQ0gxT1MgICAgIDB4MDgKKyNkZWZpbmUgQURFNzc1OV9DSDJPUyAgICAgMHgwOQorI2RlZmluZSBBREU3NzU5X0dBSU4gICAgICAweDBBCisjZGVmaW5lIEFERTc3NTlfQVBHQUlOICAgIDB4MEIKKyNkZWZpbmUgQURFNzc1OV9QSENBTCAgICAgMHgwQworI2RlZmluZSBBREU3NzU5X0FQT1MgICAgICAweDBECisjZGVmaW5lIEFERTc3NTlfWlhUT1VUICAgIDB4MEUKKyNkZWZpbmUgQURFNzc1OV9TQUdDWUMgICAgMHgwRgorI2RlZmluZSBBREU3NzU5X0lSUUVOICAgICAweDEwCisjZGVmaW5lIEFERTc3NTlfU0FHTFZMICAgIDB4MTEKKyNkZWZpbmUgQURFNzc1OV9URU1QICAgICAgMHgxMgorI2RlZmluZSBBREU3NzU5X0xJTkVDWUMgICAweDEzCisjZGVmaW5lIEFERTc3NTlfTEVORVJHWSAgIDB4MTQKKyNkZWZpbmUgQURFNzc1OV9DRk5VTSAgICAgMHgxNQorI2RlZmluZSBBREU3NzU5X0NIS1NVTSAgICAweDFFCisjZGVmaW5lIEFERTc3NTlfRElFUkVWICAgIDB4MUYKKworI2RlZmluZSBBREU3NzU5X1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURFNzc1OV9XUklURV9SRUcoYSkgKChhKSB8IDB4ODApCisKKyNkZWZpbmUgQURFNzc1OV9NQVhfVFggICAgNgorI2RlZmluZSBBREU3NzU5X01BWF9SWCAgICA2CisjZGVmaW5lIEFERTc3NTlfU1RBUlRVUF9ERUxBWSAxCisKKyNkZWZpbmUgQURFNzc1OV9TUElfU0xPVwkodTMyKSgzMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU5X1NQSV9CVVJTVAkodTMyKSgxMDAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1OV9TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkZTc3NTkiCisKKy8qKgorICogc3RydWN0IGFkZTc3NTlfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGU3NzU5X3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzc1OV9zY2FuIHsKKwlBREU3NzU5X1NDQU5fQUNUSVZFX1BPV0VSLAorCUFERTc3NTlfU0NBTl9DSDFfQ0gyLAorCUFERTc3NTlfU0NBTl9DSDEsCisJQURFNzc1OV9TQ0FOX0NIMiwKK307CisKK3ZvaWQgYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGU3NzU5X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRlNzc1OV9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1Zik7CisKKworaW50IGFkZTc3NTlfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkZTc3NTlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkZTc3NTlfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGU3NzU5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1OV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRlNzc1OV9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU5X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTlfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzhlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBBREU3ODU0LzU4LzY4Lzc4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIgKEkyQyBCdXMpCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiYWRlNzg1NC5oIgorCitzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9IHZhbHVlOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgMyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzNdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzRdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiAyNCkgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzVdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCAqdmFsKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMV0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc3QtPmkyYywgc3QtPnR4LCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihzdC0+aTJjLCBzdC0+cngsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJKnZhbCA9IHN0LT5yeFswXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KHN0LT5pMmMsIHN0LT5yeCwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTMyICp2YWwpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KHN0LT5pMmMsIHN0LT5yeCwgMyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkqdmFsID0gKHN0LT5yeFswXSA8PCAxNikgfCAoc3QtPnJ4WzFdIDw8IDgpIHwgc3QtPnJ4WzJdOworb3V0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3Yoc3QtPmkyYywgc3QtPnJ4LCAzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDI0KSB8IChzdC0+cnhbMV0gPDwgMTYpIHwgKHN0LT5yeFsyXSA8PCA4KSB8IHN0LT5yeFszXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzg1NF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0KTsKKwlzdC0+cmVhZF9yZWdfOCA9IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzg7CisJc3QtPnJlYWRfcmVnXzE2ID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMTY7CisJc3QtPnJlYWRfcmVnXzI0ID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMjQ7CisJc3QtPnJlYWRfcmVnXzMyID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMzI7CisJc3QtPndyaXRlX3JlZ184ID0gYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzg7CisJc3QtPndyaXRlX3JlZ18xNiA9IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ18xNjsKKwlzdC0+d3JpdGVfcmVnXzI0ID0gYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzI0OworCXN0LT53cml0ZV9yZWdfMzIgPSBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzI7CisJc3QtPmkyYyA9IGNsaWVudDsKKwlzdC0+aXJxID0gY2xpZW50LT5pcnE7CisKKwlyZXQgPSBhZGU3ODU0X3Byb2JlKHN0LCAmY2xpZW50LT5kZXYpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoc3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkZTc4NTRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZGU3ODU0X3JlbW92ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGU3ODU0X2lkW10gPSB7CisJeyAiYWRlNzg1NCIsIDAgfSwKKwl7ICJhZGU3ODU4IiwgMCB9LAorCXsgImFkZTc4NjgiLCAwIH0sCisJeyAiYWRlNzg3OCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRlNzg1NF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZGU3ODU0X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzg1NCIsCisJfSwKKwkucHJvYmUgICAgPSBhZGU3ODU0X2kyY19wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhZGU3ODU0X2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkZTc4NTRfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGU3ODU0X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZGU3ODU0X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRlNzg1NF9pMmNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3ODU0X2kyY19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkZTc4NTRfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3ODU0X2kyY19leGl0KTsKKworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgSTJDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTgxMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIChTUEkgQnVzKQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICJhZGU3ODU0LmgiCisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXU4IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA0LAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzg1NF9XUklURV9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNSwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzRdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNiwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzVdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNywKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAyNCkgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs1XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzZdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA0LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+c3BpLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDUsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCXN0LT50eFs0XSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT5zcGktPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzNdIDw8IDgpIHwgc3QtPnJ4WzRdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA2LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCXN0LT50eFs0XSA9IDA7CisJc3QtPnR4WzVdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMjQgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbM10gPDwgMTYpIHwgKHN0LT5yeFs0XSA8PCA4KSB8IHN0LT5yeFs1XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlYWRfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXN0LT50eFswXSA9IEFERTc4NTRfUkVBRF9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gMDsKKwlzdC0+dHhbNF0gPSAwOworCXN0LT50eFs1XSA9IDA7CisJc3QtPnR4WzZdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMzIgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbM10gPDwgMjQpIHwgKHN0LT5yeFs0XSA8PCAxNikgfCAoc3QtPnJ4WzVdIDw8IDgpIHwgc3QtPnJ4WzZdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc4NTRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCXN0LT5yZWFkX3JlZ184ID0gYWRlNzg1NF9zcGlfcmVhZF9yZWdfODsKKwlzdC0+cmVhZF9yZWdfMTYgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18xNjsKKwlzdC0+cmVhZF9yZWdfMjQgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18yNDsKKwlzdC0+cmVhZF9yZWdfMzIgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18zMjsKKwlzdC0+d3JpdGVfcmVnXzggPSBhZGU3ODU0X3NwaV93cml0ZV9yZWdfODsKKwlzdC0+d3JpdGVfcmVnXzE2ID0gYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzE2OworCXN0LT53cml0ZV9yZWdfMjQgPSBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMjQ7CisJc3QtPndyaXRlX3JlZ18zMiA9IGFkZTc4NTRfc3BpX3dyaXRlX3JlZ18zMjsKKwlzdC0+aXJxID0gc3BpLT5pcnE7CisJc3QtPnNwaSA9IHNwaTsKKworCXJldCA9IGFkZTc4NTRfcHJvYmUoc3QsICZzcGktPmRldik7CisJaWYgKHJldCkgeworCQlrZnJlZShzdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJYWRlNzg1NF9yZW1vdmUoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGU3ODU0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGU3ODU0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGU3ODU0X3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzg1NF9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkZTc4NTRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGU3ODU0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGU3ODU0X2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzg1NF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGU3ODU0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3ODU0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgU1BJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTNkNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKQEAgLTAsMCArMSw2ODAgQEAKKy8qCisgKiBBREU3ODU0LzU4LzY4Lzc4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3ODU0LmgiCisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdC0+cmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdC0+cmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzMyKGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMzIoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCXUxNiB2YWw7CisKKwlzdC0+cmVhZF9yZWdfMTYoZGV2LCBBREU3ODU0X0NPTkZJRywgJnZhbCk7CisJdmFsIHw9IDEgPDwgNzsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLworCXJldCA9IHN0LT53cml0ZV9yZWdfMTYoZGV2LCBBREU3ODU0X0NPTkZJRywgdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzg1NF9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQUlHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ0lHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfTklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQlZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1ZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZBR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0JfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JWQUdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BUFBBUkVOVF9QT1dFUl9DX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9DVkFHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVdBVFRPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9CX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JXQVRUT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9DV0FUVE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZBUkdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9CVkFSR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0NWQVJHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9BVkFST1MpOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JWQVJPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1ZBUk9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJYWRlNzg1NF93cml0ZV8zMmJpdCwKKwkJQURFNzg1NF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMzJiaXQsCisJCWFkZTc4NTRfd3JpdGVfMzJiaXQsCisJCUFERTc4NTRfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9BUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9CUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9CUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DRjFERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjFERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9DRjJERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjJERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9DRjNERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjNERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfTElORUNZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0NZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzhiaXQsCisJCWFkZTc4NTRfd3JpdGVfOGJpdCwKKwkJQURFNzg1NF9TQUdDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkNZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzhiaXQsCisJCWFkZTc4NTRfd3JpdGVfOGJpdCwKKwkJQURFNzg1NF9DRkNZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BFQUtDWUMoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF84Yml0LAorCQlhZGU3ODU0X3dyaXRlXzhiaXQsCisJCUFERTc4NTRfUEVBS0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIS1NVTShhZGU3ODU0X3JlYWRfMjRiaXQsCisJCUFERTc4NTRfQ0hFQ0tTVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9BTkdMRTAoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0FOR0xFMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FOR0xFMShhZGU3ODU0X3JlYWRfMjRiaXQsCisJCUFERTc4NTRfQU5HTEUxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQU5HTEUyKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9BTkdMRTIpOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQUlSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQklSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQ0lSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9OSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfTklSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQVZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQlZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQ1ZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQklSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0NJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQlZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0NWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0EoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZBV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0IoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZCV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0MoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZDV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0EoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lBV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0IoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lCV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0MoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lDV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9BV0FUVEhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9BV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQldBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0NXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQUZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQkZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQ0ZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFSSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0FWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWQVJIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQlZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZBUkhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9DVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQVZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQlZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQ1ZBSFIpOworCitzdGF0aWMgaW50IGFkZTc4NTRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCXUzMiBpcnFlbjsKKworCXJldCA9IHN0LT5yZWFkX3JlZ18zMihkZXYsIEFERTc4NTRfTUFTSzAsICZpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFlbiB8PSAxIDw8IDE3OyAvKiAxOiBpbnRlcnJ1cHQgZW5hYmxlZCB3aGVuIGFsbCBwZXJpb2RpY2FsCisJCQkJICAgICAoYXQgOCBrSHogcmF0ZSkgRFNQIGNvbXB1dGF0aW9ucyBmaW5pc2guICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTcpOworCisJcmV0ID0gc3QtPndyaXRlX3JlZ18zMihkZXYsIEFERTc4NTRfTUFTSzAsIGlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc4NTRfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3ODU0X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc4NTRfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3ODU0X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiODAwMCIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkZTc4NTQiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc4NTRfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc4NTRfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc4NTRfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3ODU0X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2FpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25pZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2Z2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbGluZWN5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZmN5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGVha2N5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hrc3VtLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hcHBhcmVudF9wb3dlcl9hX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FwcGFyZW50X3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBwYXJlbnRfcG93ZXJfY19nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY3RpdmVfcG93ZXJfYV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9iX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9hX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfY19nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9hX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfYl9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9id2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmZ3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Nmd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbmdsZTAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ2xlMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYW5nbGUyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9icGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2YxZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZjJkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmM2Rlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Npcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRfYS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdm9sdF9iLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92b2x0X2MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N1cnJlbnRfYS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3VycmVudF9iLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdXJyZW50X2MuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzg1NF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzg1NF9hdHRyaWJ1dGVzLAorfTsKKworaW50IGFkZTc4NTRfcHJvYmUoc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFERTc4NTRfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBREU3ODU0X01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzg1NF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzg1NF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3ODU0X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc4NTRfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3QtPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJImFkZTc4NTQiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRlNzg1NF9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3ODU0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRlNzg1NF91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworCXJldHVybiByZXQ7CisKK30KK0VYUE9SVF9TWU1CT0woYWRlNzg1NF9wcm9iZSk7CisKK2ludCBhZGU3ODU0X3JlbW92ZShzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzg1NF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzdC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc4NTRfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWRlNzg1NF9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjkwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuaApAQCAtMCwwICsxLDI0NSBAQAorI2lmbmRlZiBfQURFNzg1NF9ICisjZGVmaW5lIF9BREU3ODU0X0gKKworI2RlZmluZSBBREU3ODU0X0FJR0FJTiAgICAweDQzODAKKyNkZWZpbmUgQURFNzg1NF9BVkdBSU4gICAgMHg0MzgxCisjZGVmaW5lIEFERTc4NTRfQklHQUlOICAgIDB4NDM4MgorI2RlZmluZSBBREU3ODU0X0JWR0FJTiAgICAweDQzODMKKyNkZWZpbmUgQURFNzg1NF9DSUdBSU4gICAgMHg0Mzg0CisjZGVmaW5lIEFERTc4NTRfQ1ZHQUlOICAgIDB4NDM4NQorI2RlZmluZSBBREU3ODU0X05JR0FJTiAgICAweDQzODYKKyNkZWZpbmUgQURFNzg1NF9BSVJNU09TICAgMHg0Mzg3CisjZGVmaW5lIEFERTc4NTRfQVZSTVNPUyAgIDB4NDM4OAorI2RlZmluZSBBREU3ODU0X0JJUk1TT1MgICAweDQzODkKKyNkZWZpbmUgQURFNzg1NF9CVlJNU09TICAgMHg0MzhBCisjZGVmaW5lIEFERTc4NTRfQ0lSTVNPUyAgIDB4NDM4QgorI2RlZmluZSBBREU3ODU0X0NWUk1TT1MgICAweDQzOEMKKyNkZWZpbmUgQURFNzg1NF9OSVJNU09TICAgMHg0MzhECisjZGVmaW5lIEFERTc4NTRfQVZBR0FJTiAgIDB4NDM4RQorI2RlZmluZSBBREU3ODU0X0JWQUdBSU4gICAweDQzOEYKKyNkZWZpbmUgQURFNzg1NF9DVkFHQUlOICAgMHg0MzkwCisjZGVmaW5lIEFERTc4NTRfQVdHQUlOICAgIDB4NDM5MQorI2RlZmluZSBBREU3ODU0X0FXQVRUT1MgICAweDQzOTIKKyNkZWZpbmUgQURFNzg1NF9CV0dBSU4gICAgMHg0MzkzCisjZGVmaW5lIEFERTc4NTRfQldBVFRPUyAgIDB4NDM5NAorI2RlZmluZSBBREU3ODU0X0NXR0FJTiAgICAweDQzOTUKKyNkZWZpbmUgQURFNzg1NF9DV0FUVE9TICAgMHg0Mzk2CisjZGVmaW5lIEFERTc4NTRfQVZBUkdBSU4gIDB4NDM5NworI2RlZmluZSBBREU3ODU0X0FWQVJPUyAgICAweDQzOTgKKyNkZWZpbmUgQURFNzg1NF9CVkFSR0FJTiAgMHg0Mzk5CisjZGVmaW5lIEFERTc4NTRfQlZBUk9TICAgIDB4NDM5QQorI2RlZmluZSBBREU3ODU0X0NWQVJHQUlOICAweDQzOUIKKyNkZWZpbmUgQURFNzg1NF9DVkFST1MgICAgMHg0MzlDCisjZGVmaW5lIEFERTc4NTRfQUZXR0FJTiAgIDB4NDM5RAorI2RlZmluZSBBREU3ODU0X0FGV0FUVE9TICAweDQzOUUKKyNkZWZpbmUgQURFNzg1NF9CRldHQUlOICAgMHg0MzlGCisjZGVmaW5lIEFERTc4NTRfQkZXQVRUT1MgIDB4NDNBMAorI2RlZmluZSBBREU3ODU0X0NGV0dBSU4gICAweDQzQTEKKyNkZWZpbmUgQURFNzg1NF9DRldBVFRPUyAgMHg0M0EyCisjZGVmaW5lIEFERTc4NTRfQUZWQVJHQUlOIDB4NDNBMworI2RlZmluZSBBREU3ODU0X0FGVkFST1MgICAweDQzQTQKKyNkZWZpbmUgQURFNzg1NF9CRlZBUkdBSU4gMHg0M0E1CisjZGVmaW5lIEFERTc4NTRfQkZWQVJPUyAgIDB4NDNBNgorI2RlZmluZSBBREU3ODU0X0NGVkFSR0FJTiAweDQzQTcKKyNkZWZpbmUgQURFNzg1NF9DRlZBUk9TICAgMHg0M0E4CisjZGVmaW5lIEFERTc4NTRfVkFUSFIxICAgIDB4NDNBOQorI2RlZmluZSBBREU3ODU0X1ZBVEhSMCAgICAweDQzQUEKKyNkZWZpbmUgQURFNzg1NF9XVEhSMSAgICAgMHg0M0FCCisjZGVmaW5lIEFERTc4NTRfV1RIUjAgICAgIDB4NDNBQworI2RlZmluZSBBREU3ODU0X1ZBUlRIUjEgICAweDQzQUQKKyNkZWZpbmUgQURFNzg1NF9WQVJUSFIwICAgMHg0M0FFCisjZGVmaW5lIEFERTc4NTRfUlNWICAgICAgIDB4NDNBRgorI2RlZmluZSBBREU3ODU0X1ZBTk9MT0FEICAweDQzQjAKKyNkZWZpbmUgQURFNzg1NF9BUE5PTE9BRCAgMHg0M0IxCisjZGVmaW5lIEFERTc4NTRfVkFSTk9MT0FEIDB4NDNCMgorI2RlZmluZSBBREU3ODU0X1ZMRVZFTCAgICAweDQzQjMKKyNkZWZpbmUgQURFNzg1NF9ESUNPRUZGICAgMHg0M0I1CisjZGVmaW5lIEFERTc4NTRfSFBGRElTICAgIDB4NDNCNgorI2RlZmluZSBBREU3ODU0X0lTVU1MVkwgICAweDQzQjgKKyNkZWZpbmUgQURFNzg1NF9JU1VNICAgICAgMHg0M0JGCisjZGVmaW5lIEFERTc4NTRfQUlSTVMgICAgIDB4NDNDMAorI2RlZmluZSBBREU3ODU0X0FWUk1TICAgICAweDQzQzEKKyNkZWZpbmUgQURFNzg1NF9CSVJNUyAgICAgMHg0M0MyCisjZGVmaW5lIEFERTc4NTRfQlZSTVMgICAgIDB4NDNDMworI2RlZmluZSBBREU3ODU0X0NJUk1TICAgICAweDQzQzQKKyNkZWZpbmUgQURFNzg1NF9DVlJNUyAgICAgMHg0M0M1CisjZGVmaW5lIEFERTc4NTRfTklSTVMgICAgIDB4NDNDNgorI2RlZmluZSBBREU3ODU0X1JVTiAgICAgICAweEUyMjgKKyNkZWZpbmUgQURFNzg1NF9BV0FUVEhSICAgMHhFNDAwCisjZGVmaW5lIEFERTc4NTRfQldBVFRIUiAgIDB4RTQwMQorI2RlZmluZSBBREU3ODU0X0NXQVRUSFIgICAweEU0MDIKKyNkZWZpbmUgQURFNzg1NF9BRldBVFRIUiAgMHhFNDAzCisjZGVmaW5lIEFERTc4NTRfQkZXQVRUSFIgIDB4RTQwNAorI2RlZmluZSBBREU3ODU0X0NGV0FUVEhSICAweEU0MDUKKyNkZWZpbmUgQURFNzg1NF9BVkFSSFIgICAgMHhFNDA2CisjZGVmaW5lIEFERTc4NTRfQlZBUkhSICAgIDB4RTQwNworI2RlZmluZSBBREU3ODU0X0NWQVJIUiAgICAweEU0MDgKKyNkZWZpbmUgQURFNzg1NF9BRlZBUkhSICAgMHhFNDA5CisjZGVmaW5lIEFERTc4NTRfQkZWQVJIUiAgIDB4RTQwQQorI2RlZmluZSBBREU3ODU0X0NGVkFSSFIgICAweEU0MEIKKyNkZWZpbmUgQURFNzg1NF9BVkFIUiAgICAgMHhFNDBDCisjZGVmaW5lIEFERTc4NTRfQlZBSFIgICAgIDB4RTQwRAorI2RlZmluZSBBREU3ODU0X0NWQUhSICAgICAweEU0MEUKKyNkZWZpbmUgQURFNzg1NF9JUEVBSyAgICAgMHhFNTAwCisjZGVmaW5lIEFERTc4NTRfVlBFQUsgICAgIDB4RTUwMQorI2RlZmluZSBBREU3ODU0X1NUQVRVUzAgICAweEU1MDIKKyNkZWZpbmUgQURFNzg1NF9TVEFUVVMxICAgMHhFNTAzCisjZGVmaW5lIEFERTc4NTRfT0lMVkwgICAgIDB4RTUwNworI2RlZmluZSBBREU3ODU0X09WTFZMICAgICAweEU1MDgKKyNkZWZpbmUgQURFNzg1NF9TQUdMVkwgICAgMHhFNTA5CisjZGVmaW5lIEFERTc4NTRfTUFTSzAgICAgIDB4RTUwQQorI2RlZmluZSBBREU3ODU0X01BU0sxICAgICAweEU1MEIKKyNkZWZpbmUgQURFNzg1NF9JQVdWICAgICAgMHhFNTBDCisjZGVmaW5lIEFERTc4NTRfSUJXViAgICAgIDB4RTUwRAorI2RlZmluZSBBREU3ODU0X0lDV1YgICAgICAweEU1MEUKKyNkZWZpbmUgQURFNzg1NF9WQVdWICAgICAgMHhFNTEwCisjZGVmaW5lIEFERTc4NTRfVkJXViAgICAgIDB4RTUxMQorI2RlZmluZSBBREU3ODU0X1ZDV1YgICAgICAweEU1MTIKKyNkZWZpbmUgQURFNzg1NF9BV0FUVCAgICAgMHhFNTEzCisjZGVmaW5lIEFERTc4NTRfQldBVFQgICAgIDB4RTUxNAorI2RlZmluZSBBREU3ODU0X0NXQVRUICAgICAweEU1MTUKKyNkZWZpbmUgQURFNzg1NF9BVkEgICAgICAgMHhFNTE5CisjZGVmaW5lIEFERTc4NTRfQlZBICAgICAgIDB4RTUxQQorI2RlZmluZSBBREU3ODU0X0NWQSAgICAgICAweEU1MUIKKyNkZWZpbmUgQURFNzg1NF9DSEVDS1NVTSAgMHhFNTFGCisjZGVmaW5lIEFERTc4NTRfVk5PTSAgICAgIDB4RTUyMAorI2RlZmluZSBBREU3ODU0X1BIU1RBVFVTICAweEU2MDAKKyNkZWZpbmUgQURFNzg1NF9BTkdMRTAgICAgMHhFNjAxCisjZGVmaW5lIEFERTc4NTRfQU5HTEUxICAgIDB4RTYwMgorI2RlZmluZSBBREU3ODU0X0FOR0xFMiAgICAweEU2MDMKKyNkZWZpbmUgQURFNzg1NF9QRVJJT0QgICAgMHhFNjA3CisjZGVmaW5lIEFERTc4NTRfUEhOT0xPQUQgIDB4RTYwOAorI2RlZmluZSBBREU3ODU0X0xJTkVDWUMgICAweEU2MEMKKyNkZWZpbmUgQURFNzg1NF9aWFRPVVQgICAgMHhFNjBECisjZGVmaW5lIEFERTc4NTRfQ09NUE1PREUgIDB4RTYwRQorI2RlZmluZSBBREU3ODU0X0dBSU4gICAgICAweEU2MEYKKyNkZWZpbmUgQURFNzg1NF9DRk1PREUgICAgMHhFNjEwCisjZGVmaW5lIEFERTc4NTRfQ0YxREVOICAgIDB4RTYxMQorI2RlZmluZSBBREU3ODU0X0NGMkRFTiAgICAweEU2MTIKKyNkZWZpbmUgQURFNzg1NF9DRjNERU4gICAgMHhFNjEzCisjZGVmaW5lIEFERTc4NTRfQVBIQ0FMICAgIDB4RTYxNAorI2RlZmluZSBBREU3ODU0X0JQSENBTCAgICAweEU2MTUKKyNkZWZpbmUgQURFNzg1NF9DUEhDQUwgICAgMHhFNjE2CisjZGVmaW5lIEFERTc4NTRfUEhTSUdOICAgIDB4RTYxNworI2RlZmluZSBBREU3ODU0X0NPTkZJRyAgICAweEU2MTgKKyNkZWZpbmUgQURFNzg1NF9NTU9ERSAgICAgMHhFNzAwCisjZGVmaW5lIEFERTc4NTRfQUNDTU9ERSAgIDB4RTcwMQorI2RlZmluZSBBREU3ODU0X0xDWUNNT0RFICAweEU3MDIKKyNkZWZpbmUgQURFNzg1NF9QRUFLQ1lDICAgMHhFNzAzCisjZGVmaW5lIEFERTc4NTRfU0FHQ1lDICAgIDB4RTcwNAorI2RlZmluZSBBREU3ODU0X0NGQ1lDICAgICAweEU3MDUKKyNkZWZpbmUgQURFNzg1NF9IU0RDX0NGRyAgMHhFNzA2CisjZGVmaW5lIEFERTc4NTRfQ09ORklHMiAgIDB4RUMwMQorCisjZGVmaW5lIEFERTc4NTRfUkVBRF9SRUcgICAweDEKKyNkZWZpbmUgQURFNzg1NF9XUklURV9SRUcgIDB4MAorCisjZGVmaW5lIEFERTc4NTRfTUFYX1RYICAgIDcKKyNkZWZpbmUgQURFNzg1NF9NQVhfUlggICAgNworI2RlZmluZSBBREU3ODU0X1NUQVJUVVBfREVMQVkgMQorCisjZGVmaW5lIEFERTc4NTRfU1BJX1NMT1cJKHUzMikoMzAwICogMTAwMCkKKyNkZWZpbmUgQURFNzg1NF9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFERTc4NTRfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGU3ODU0IgorCisvKioKKyAqIHN0cnVjdCBhZGU3ODU0X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBzcGk6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc4NTRfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgICAgKmkyYzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCWludAkJCQkoKnJlYWRfcmVnXzgpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTggKik7CisJaW50CQkJCSgqcmVhZF9yZWdfMTYpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTE2ICopOworCWludAkJCQkoKnJlYWRfcmVnXzI0KSAoc3RydWN0IGRldmljZSAqLCB1MTYsIHUzMiAqKTsKKwlpbnQJCQkJKCpyZWFkX3JlZ18zMikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIgKik7CisJaW50CQkJCSgqd3JpdGVfcmVnXzgpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTgpOworCWludAkJCQkoKndyaXRlX3JlZ18xNikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MTYpOworCWludAkJCQkoKndyaXRlX3JlZ18yNCkgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIpOworCWludAkJCQkoKndyaXRlX3JlZ18zMikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxOworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworZXh0ZXJuIGludCBhZGU3ODU0X3Byb2JlKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCwgc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgYWRlNzg1NF9yZW1vdmUoc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzg1NF9zY2FuIHsKKwlBREU3ODU0X1NDQU5fUEhBX1YsCisJQURFNzg1NF9TQ0FOX1BIQl9WLAorCUFERTc4NTRfU0NBTl9QSENfViwKKwlBREU3ODU0X1NDQU5fUEhBX0ksCisJQURFNzg1NF9TQ0FOX1BIQl9JLAorCUFERTc4NTRfU0NBTl9QSENfSSwKK307CisKK3ZvaWQgYWRlNzg1NF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGU3ODU0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRlNzg1NF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpOworCisKK2ludCBhZGU3ODU0X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGU3ODU0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGU3ODU0X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc4NTRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2FkZTc4NTRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRlNzg1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzg1NF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3ODU0X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc4NTRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL21ldGVyLmgKQEAgLTAsMCArMSwzOTYgQEAKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKiBtZXRlcmluZyBpYyB0eXBlcyBvZiBhdHRyaWJ1dGUgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9BX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9hX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2Jfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQ19PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9BX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2Ffb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQl9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9iX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0NfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2Ffb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihyZWFjdGl2ZV9wb3dlcl9iX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9DX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfYV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfYl9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0NfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9BX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2FfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9jX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9hX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQl9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9iX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9jX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFjdGl2ZV9wb3dlcl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFjdGl2ZV9wb3dlcl9hX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2JfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0FfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfYV9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfYl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2EsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9CKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYiwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0MoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9jLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2EsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9CKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfYiwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0MoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9jLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9MRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGxlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTEFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIobGFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodmFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGx2YWVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SVkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocnZhZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0xWQVJFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIobHZhcmVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSEtTVU0oX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaGtzdW0sIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTEUwKF9zaG93LCBfYWRkcikgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbGUwLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xFMShfc2hvdywgX2FkZHIpICAgICAgICAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xlMSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMRTIoX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsZTIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVdBVFRIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYndhdHRociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWZ3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQkZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYmZ3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0ZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2Z3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBUkhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YXJociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CVkFSSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYnZhcmhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWQVJIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdmFyaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYXZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYnZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3ZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfSU9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2b3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEhDQUwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY3BoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFwb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUFQT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFhcG9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JBUE9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiYXBvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2Fwb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihidnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUlHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQklHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0lHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTklHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihuaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihidmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfV0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHdnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1dESVYoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHdkaXYsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0ZOVU0oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NGREVOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZmRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjFERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmMWRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjJERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmMmRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjNERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmM2RlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUlSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFpcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JJUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiaXJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSVJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2lybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTklSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKG5pcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdnJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CVlJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGN2cm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0lSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoaXJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodnJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FJUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFpcm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQklSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYmlybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSVJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaXJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGF2cm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVlJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdnJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZBR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodmFnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BHQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihwZ2FfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WQURJVihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodmFkaXYsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTElORUNZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIobGluZWN5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TQUdDWUMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHNhZ2N5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRkNZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2ZjeWMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEVBS0NZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocGVha2N5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TQUdMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHNhZ2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUEtMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGlwa2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WUEtMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZwa2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUEVBSyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihpcGVhaywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SSVBFQUsoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmlwZWFrLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZQRUFLKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZwZWFrLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JWUEVBSyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihydnBlYWssIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVlBFUklPRChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2cGVyaW9kLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIX09GRihfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorICBJSU9fREVWSUNFX0FUVFIoY2hvZmZfIyNfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKy8qIGFjdGl2ZSBlbmVyZ3kgcmVnaXN0ZXIsIEFFTkVSR1ksIGlzIG1vcmUgdGhhbiBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQUVORVJHWV9IQUxGX0ZVTEwoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChhZW5lcmd5X2hhbGZfZnVsbCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIGEgU0FHIG9uIHRoZSBsaW5lIHZvbHRhZ2UgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfTElORV9WT0xUX1NBRyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKGxpbmVfdm9sdF9zYWcsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKgorICogSW5kaWNhdGVzIHRoZSBlbmQgb2YgZW5lcmd5IGFjY3VtdWxhdGlvbiBvdmVyIGFuIGludGVnZXIgbnVtYmVyCisgKiBvZiBoYWxmIGxpbmUgY3ljbGVzCisgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ1lDRU5EKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goY3ljZW5kLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogb24gdGhlIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIG9mIHRoZSB0aGUgdm9sdGFnZSB3YXZlZm9ybSAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9aRVJPX0NST1NTKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goemVyb19jcm9zcywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBhY3RpdmUgZW5lcmd5IHJlZ2lzdGVyIGhhcyBvdmVyZmxvd2VkICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0FFTkVSR1lfT1ZFUkZMT1coX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChhZW5lcmd5X292ZXJmbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIGFwcGFyZW50IGVuZXJneSByZWdpc3RlciBoYXMgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9WQUVORVJHWV9PVkVSRkxPVyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZhZW5lcmd5X292ZXJmbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIGFjdGl2ZSBlbmVyZ3kgcmVnaXN0ZXIsIFZBRU5FUkdZLCBpcyBtb3JlIHRoYW4gaGFsZiBmdWxsICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1ZBRU5FUkdZX0hBTEZfRlVMTChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZhZW5lcmd5X2hhbGZfZnVsbCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBwb3dlciBoYXMgZ29uZSBmcm9tIG5lZ2F0aXZlIHRvIHBvc2l0aXZlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1BQT1MoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChwcG9zLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIHBvd2VyIGhhcyBnb25lIGZyb20gcG9zaXRpdmUgdG8gbmVnYXRpdmUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfUE5FRyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHBuZWcsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB3YXZlZm9ybSBzYW1wbGUgZnJvbSBDaGFubmVsIDEgaGFzIGV4Y2VlZGVkIHRoZSBJUEtMVkwgdmFsdWUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfSVBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKGlwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB3YXZlZm9ybSBzYW1wbGUgZnJvbSBDaGFubmVsIDIgaGFzIGV4Y2VlZGVkIHRoZSBWUEtMVkwgdmFsdWUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfVlBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMzYzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDU0IEBACisjCisjIFJlc29sdmVyL1N5bmNocm8gZHJpdmVycworIworY29tbWVudCAiUmVzb2x2ZXIgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzIgorCitjb25maWcgQUQyUzkwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkMnM5MCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCisJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnM5MCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDJTMTIwWAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDJzMTIweCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCisJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnMxMjAwIGFuZCBhZDJzMTIwNSwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcworCSAgdmlhIHN5c2ZzLgorCitjb25maWcgQUQyUzEyMTAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQyczEyMTAgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIHNwaSByZXNvbHZlcgorCSAgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzLCBhZDJzMTIxMCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2Nob2ljZQorCXByb21wdCAiUmVzb2x1dGlvbiBDb250cm9sIgorCWRlcGVuZHMgb24gQUQyUzEyMTAKKwlkZWZhdWx0IEFEMlMxMjEwX0dQSU9fTk9ORQorCWhlbHAKKwkgIEluIG5vcm1hbCBtb2RlLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgaXMgc2VsZWN0ZWQKKwkgIHVzaW5nIHRoZSBSRVMwIGFuZCBSRVMxIGlucHV0IHBpbnMuIEluIGNvbmZpZ3VyYXRpb24gbW9kZSwgdGhlCisJICByZXNvbHV0aW9uIGlzIHNlbGVjdGVkIGJ5IHNldHRpbmcgdGhlIFJFUzAgYW5kIFJFUzEgYml0cyBpbiB0aGUKKwkgIGNvbnRyb2wgcmVnc2l0ZXIuIFdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbm9ybWFsIG1vZGUgYW5kIGNvbmZpZ3VyYXRpb24KKwkgIG1vZGUsIHRoZXJlIGFyZSBzb21lIHNjaGVtZXMgdG8ga2VlcCB0aGVtIG1hdGNocy4KKworY29uZmlnIEFEMlMxMjEwX0dQSU9fSU5QVVQKKwlib29sICJyZWFkIHJlc29sdXRpb24gZnJvbSBncGlvIHBpbnMiCisJaGVscAorCSAgR1BJTyBwaW5zIGFyZSBzYW1wbGluZyBSRVMwIGFuZCBSRVMxIHBpbnMsIHJlYWQgdGhlIHJlc29sdXRpb24KKwkgIHNldHRpbmdzIGZyb20gdGhlIEdQSU8gcGlucy4KKworY29uZmlnIEFEMlMxMjEwX0dQSU9fT1VUUFVUCisJYm9vbCAic2V0IGdwaW8gcGlucyB0byBzZXQgcmVzb2x1dGlvbiIKKwloZWxwCisJICBSRVMwIGFuZCBSRVMxIHBpbnMgYXJlIGNvbnRyb2xsZWQgYnkgR1BJT3MsIHNldHRpbmcgR1BJTyBwaW5zIHRvCisJICBzZXQgdGhlIHJlc29sdXRpb24uCisKK2NvbmZpZyBBRDJTMTIxMF9HUElPX05PTkUKKwlib29sICJ0YWtlIHRoZSByZXNwb25zaWJpbGl0eSBieSB1c2VyIgorCitlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODRhODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgUmVzb2x2ZXIvU3luY2hybyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDJTOTApICs9IGFkMnM5MC5vCitvYmotJChDT05GSUdfQUQyUzEyMFgpICs9IGFkMnMxMjB4Lm8KK29iai0kKENPTkZJR19BRDJTMTIxMCkgKz0gYWQyczEyMTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDk3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjB4LmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBhZDJzMTIweC5jIHNpbXBsZSBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzEyMDAvMTIwNQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDJzMTIweCIKKworLyogaW5wdXQgcGluIHNhbXBsZSBhbmQgcmR2ZWwgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgKi8KKyNkZWZpbmUgQUQyUzEyMFhfUE4JMgorCisvKiBpbnB1dCBjbG9jayBvbiBzZXJpYWwgaW50ZXJmYWNlICovCisjZGVmaW5lIEFEMlMxMjBYX0haCTgxOTIwMDAKKy8qIGNsb2NrIHBlcmlvZCBpbiBuYW5vIHNlY29uZCAqLworI2RlZmluZSBBRDJTMTIwWF9UU0NMSwkoMTAwMDAwMDAwMC9BRDJTMTIwWF9IWikKKworc3RydWN0IGFkMnMxMjB4X3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKKwl1bnNpZ25lZCBzaG9ydCBzYW1wbGU7CisJdW5zaWduZWQgc2hvcnQgcmR2ZWw7CisJdTggcnhbMl07CisJdTggdHhbMl07Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDJzMTIweF9zaG93X3Bvc192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwlzMTYgdmVsOworCXU4IHN0YXR1czsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMTsKKwl4ZmVyLnR4X2J1ZiA9IHN0LT50eDsKKwl4ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKKwkvKiBkZWxheSAoNiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJcG9zID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuID0gc3ByaW50ZihidWYsICIlZCAlYyVjJWMlYyAiLCBwb3MsCisJCQkJKHN0YXR1cyAmIDB4OCkgPyAnUCcgOiAnVicsCisJCQkJKHN0YXR1cyAmIDB4NCkgPyAnZCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MikgPyAnbCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MSkgPyAnMScgOiAnMCcpOworCisJLyogZGVsYXkgMTggbnMgKi8KKwkvKiBuZGVsYXkoMTgpOyAqLworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAwKTsKKwkvKiBuZGVsYXkoNSk7Ki8KKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJdmVsID0gKHN0LT5yeFswXSAmIDB4ODApID8gMHhmMDAwIDogMDsKKwl2ZWwgfD0gKCgoczE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJWQgJWMlYyVjJWNcbiIsIHZlbCwKKwkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKKwkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7CitlcnJvcl9yZXQ6CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAxKTsKKwkvKiBkZWxheSAoMiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5zIGZvciBzYW1wbGUgcHVsc2UgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIweF9zaG93X3BvcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1MTYgcG9zOworCXU4IHN0YXR1czsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMTsKKwl4ZmVyLnR4X2J1ZiA9IHN0LT50eDsKKwl4ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKKwkvKiBkZWxheSAoNiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDEpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXN0YXR1cyA9IHN0LT5yeFsxXTsKKwlwb3MgPSAoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkICVjJWMlYyVjICIsIHBvcywKKwkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKKwkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7CitlcnJvcl9yZXQ6CisJLyogZGVsYXkgKDIgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBucyBmb3Igc2FtcGxlIHB1bHNlICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMHhfc2hvd192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJczE2IHZlbDsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMCk7CisJLyogZGVsYXkgKDYgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMSk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDApOworCS8qIG5kZWxheSg1KTsqLworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXN0YXR1cyA9IHN0LT5yeFsxXTsKKwl2ZWwgPSAoc3QtPnJ4WzBdICYgMHg4MCkgPyAweGYwMDAgOiAwOworCXZlbCB8PSAoKChzMTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlZCAlYyVjJWMlY1xuIiwgdmVsLAorCQkJCShzdGF0dXMgJiAweDgpID8gJ1AnIDogJ1YnLAorCQkJCShzdGF0dXMgJiAweDQpID8gJ2QnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDIpID8gJ2wnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDEpID8gJzEnIDogJzAnKTsKK2Vycm9yX3JldDoKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDEpOworCS8qIGRlbGF5ICgyICogQUQyUzEyMFhfVFNDTEsgKyAyMCkgbnMgZm9yIHNhbXBsZSBwdWxzZSAqLworCXVkZWxheSgxKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihkZXNjcmlwdGlvbiwKKwkiMTItQml0IFIvRCBDb252ZXJ0ZXIgd2l0aCBSZWZlcmVuY2UgT3NjaWxsYXRvciIpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3NfdmVsLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3Bvc192ZWwsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3MsIFNfSVJVR08sIGFkMnMxMjB4X3Nob3dfcG9zLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmVsLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3ZlbCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzMTIweF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2Rlc2NyaXB0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3NfdmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZlbC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzMTIweF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDJzMTIweF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQyczEyMHhfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0OworCWludCBwbiwgcmV0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCAqcGlucyA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlmb3IgKHBuID0gMDsgcG4gPCBBRDJTMTIwWF9QTjsgcG4rKykgeworCQlpZiAoZ3Bpb19yZXF1ZXN0KHBpbnNbcG5dLCBEUlZfTkFNRSkpIHsKKwkJCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBwaW4gJWQgZmFpbGVkXG4iLAorCQkJCQkJRFJWX05BTUUsIHBpbnNbcG5dKTsKKwkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwaW5zW3BuXSwgMSk7CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCXN0LT5zYW1wbGUgPSBwaW5zWzBdOworCXN0LT5yZHZlbCA9IHBpbnNbMV07CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkMnMxMjB4X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlzcGktPm1heF9zcGVlZF9oeiA9IEFEMlMxMjBYX0haOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCWZvciAoLS1wbjsgcG4gPj0gMDsgcG4tLSkKKwkJZ3Bpb19mcmVlKHBpbnNbcG5dKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDJzMTIweF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQyczEyMHhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQyczEyMHhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkMnMxMjB4X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDJzMTIweF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIweF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQyczEyMHhfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQyczEyMHhfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMnMxMjB4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDJzMTIweF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdyYWZmIFlhbmcgPGdyYWZmLnlhbmdAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDJTMTIwMC8xMjA1IFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBhZDJzMTIxMC5jIHN1cHBvcnQgZm9yIHRoZSBBREkgUmVzb2x2ZXIgdG8gRGlnaXRhbCBDb252ZXJ0ZXJzOiBBRDJTMTIxMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDJzMTIxMCIKKworI2RlZmluZSBERUZfQ09OVFJPTAkJMHg3RQorCisjZGVmaW5lIE1TQl9JU19ISUdICQkweDgwCisjZGVmaW5lIE1TQl9JU19MT1cJCTB4N0YKKyNkZWZpbmUgUEhBU0VfTE9DS19SQU5HRV80NAkweDIwCisjZGVmaW5lIEVOQUJMRV9IWVNURVJFU0lTCTB4MTAKKyNkZWZpbmUgU0VUX0VOUkVTMQkJMHgwOAorI2RlZmluZSBTRVRfRU5SRVMwCQkweDA0CisjZGVmaW5lIFNFVF9SRVMxCQkweDAyCisjZGVmaW5lIFNFVF9SRVMwCQkweDAxCisKKyNkZWZpbmUgU0VUX0VOUkVTT0xVVElPTgkoU0VUX0VOUkVTMSB8IFNFVF9FTlJFUzApCisjZGVmaW5lIFNFVF9SRVNPTFVUSU9OCQkoU0VUX1JFUzEgfCBTRVRfUkVTMCkKKworI2RlZmluZSBSRUdfUE9TSVRJT04JCTB4ODAKKyNkZWZpbmUgUkVHX1ZFTE9DSVRZCQkweDgyCisjZGVmaW5lIFJFR19MT1NfVEhSRAkJMHg4OAorI2RlZmluZSBSRUdfRE9TX09WUl9USFJECTB4ODkKKyNkZWZpbmUgUkVHX0RPU19NSVNfVEhSRAkweDhBCisjZGVmaW5lIFJFR19ET1NfUlNUX01BWF9USFJECTB4OEIKKyNkZWZpbmUgUkVHX0RPU19SU1RfTUlOX1RIUkQJMHg4QworI2RlZmluZSBSRUdfTE9UX0hJR0hfVEhSRAkweDhECisjZGVmaW5lIFJFR19MT1RfTE9XX1RIUkQJMHg4RQorI2RlZmluZSBSRUdfRVhDSVRfRlJFUQkJMHg5MQorI2RlZmluZSBSRUdfQ09OVFJPTAkJMHg5MgorI2RlZmluZSBSRUdfU09GVF9SRVNFVAkJMHhGMAorI2RlZmluZSBSRUdfRkFVTFQJCTB4RkYKKworLyogcGluIFNBTVBMRSwgQTAsIEExLCBSRVMwLCBSRVMxLCBpcyBjb250cm9sbGVkIGJ5IGRyaXZlciAqLworI2RlZmluZSBBRDJTMTIxMF9TQUEJCTMKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKyMgZGVmaW5lIEFEMlMxMjEwX1JFUwkJMgorI2Vsc2UKKyMgZGVmaW5lIEFEMlMxMjEwX1JFUwkJMAorI2VuZGlmCisjZGVmaW5lIEFEMlMxMjEwX1BOCQkoQUQyUzEyMTBfU0FBICsgQUQyUzEyMTBfUkVTKQorCisjZGVmaW5lIEFEMlMxMjEwX01JTl9DTEtJTgk2MTQ0MDAwCisjZGVmaW5lIEFEMlMxMjEwX01BWF9DTEtJTgkxMDI0MDAwMAorI2RlZmluZSBBRDJTMTIxMF9NSU5fRVhDSVQJMjAwMAorI2RlZmluZSBBRDJTMTIxMF9NQVhfRVhDSVQJMjAwMDAKKyNkZWZpbmUgQUQyUzEyMTBfTUlOX0ZDVwkweDQKKyNkZWZpbmUgQUQyUzEyMTBfTUFYX0ZDVwkweDUwCisKKy8qIGRlZmF1bHQgaW5wdXQgY2xvY2sgb24gc2VyaWFsIGludGVyZmFjZSAqLworI2RlZmluZSBBRDJTMTIxMF9ERUZfQ0xLSU4JODE5MjAwMAorLyogY2xvY2sgcGVyaW9kIGluIG5hbm8gc2Vjb25kICovCisjZGVmaW5lIEFEMlMxMjEwX0RFRl9UQ0sJKDEwMDAwMDAwMDAvQUQyUzEyMTBfREVGX0NMS0lOKQorI2RlZmluZSBBRDJTMTIxMF9ERUZfRVhDSVQJMTAwMDAKKworZW51bSBhZDJzMTIxMF9tb2RlIHsKKwlNT0RfUE9TID0gMCwKKwlNT0RfVkVMLAorCU1PRF9SRVNFUlZFRCwKKwlNT0RfQ09ORklHLAorfTsKKworZW51bSBhZDJzMTIxMF9yZXMgeworCVJFU18xMCA9IDEwLAorCVJFU18xMiA9IDEyLAorCVJFU18xNCA9IDE0LAorCVJFU18xNiA9IDE2LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZXNvbHV0aW9uX3ZhbHVlW10gPSB7CisJCVJFU18xMCwgUkVTXzEyLCBSRVNfMTQsIFJFU18xNn07CisKK3N0cnVjdCBhZDJzMTIxMF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCXVuc2lnbmVkIGludCBoeXN0ZXJlc2lzOworCXVuc2lnbmVkIGludCBvbGRfZGF0YTsKKwllbnVtIGFkMnMxMjEwX21vZGUgbW9kZTsKKwllbnVtIGFkMnMxMjEwX3JlcyByZXNvbHV0aW9uOworCXVuc2lnbmVkIGludCBmY2xraW47CisJdW5zaWduZWQgaW50IGZleGNpdDsKKwl1bnNpZ25lZCBzaG9ydCBzYW1wbGU7CisJdW5zaWduZWQgc2hvcnQgYTA7CisJdW5zaWduZWQgc2hvcnQgYTE7CisJdW5zaWduZWQgc2hvcnQgcmVzMDsKKwl1bnNpZ25lZCBzaG9ydCByZXMxOworCXU4IHJ4WzNdOworCXU4IHR4WzNdOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3NhbXBsZShzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCWdwaW9fc2V0X3ZhbHVlKHN0LT5zYW1wbGUsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9zYW1wbGUoc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tb2RlKGVudW0gYWQyczEyMTBfbW9kZSBtb2RlLCBzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTU9EX1BPUzoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmEwLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmExLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RfVkVMOgorCQlncGlvX3NldF92YWx1ZShzdC0+YTAsIDApOworCQlncGlvX3NldF92YWx1ZShzdC0+YTEsIDEpOworCQlicmVhazsKKwljYXNlIE1PRF9DT05GSUc6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMSwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNldCB0byByZXNlcnZlZCBtb2RlICovCisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMSwgMCk7CisJfQorCXN0LT5tb2RlID0gbW9kZTsKK30KKworLyogd3JpdGUgMSBieXRlcyAoYWRkcmVzcyBvciBkYXRhKSB0byB0aGUgY2hpcCAqLworc3RhdGljIGludCBjb25maWdfd3JpdGUoc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCwKKwkJCQkJdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldCA9IDA7CisKKwlzdC0+eGZlci5sZW4gPSAxOworCXNldF9tb2RlKE1PRF9DT05GSUcsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlzdC0+dHhbMF0gPSBkYXRhOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXN0LT5vbGRfZGF0YSA9IDE7CisJcmV0dXJuIHJldDsKK30KKworLyogcmVhZCB2YWx1ZSBmcm9tIG9uZSBvZiB0aGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGNvbmZpZ19yZWFkKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QsCisJCQkJdW5zaWduZWQgY2hhciBhZGRyZXNzLAorCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldCA9IDA7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCXNldF9tb2RlKE1PRF9DT05GSUcsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlzdC0+dHhbMF0gPSBhZGRyZXNzIHwgTVNCX0lTX0hJR0g7CisJc3QtPnR4WzFdID0gUkVHX0ZBVUxUOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCSpkYXRhID0gc3QtPnJ4WzFdOworCXN0LT5vbGRfZGF0YSA9IDE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciBmY3c7CisJZmN3ID0gKHVuc2lnbmVkIGNoYXIpKHN0LT5mZXhjaXQgKiAoMSA8PCAxNSkgLyBzdC0+ZmNsa2luKTsKKwlpZiAoZmN3ID49IEFEMlMxMjEwX01JTl9GQ1cgJiYgZmN3IDw9IEFEMlMxMjEwX01BWF9GQ1cpIHsKKwkJY29uZmlnX3dyaXRlKHN0LCBSRUdfRVhDSVRfRlJFUSk7CisJCWNvbmZpZ193cml0ZShzdCwgZmN3KTsKKwl9IGVsc2UKKwkJcHJfZXJyKCJhZDJzMTIxMDogRkNXIG91dCBvZiByYW5nZVxuIik7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfcmVzb2x1dGlvbl9waW4oc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlkYXRhID0gKGdwaW9fZ2V0X3ZhbHVlKHN0LT5yZXMwKSA8PCAxKSAgfAorCQkJZ3Bpb19nZXRfdmFsdWUoc3QtPnJlczEpOworCXJldHVybiByZXNvbHV0aW9uX3ZhbHVlW2RhdGFdOworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Jlc29sdXRpb25fcGluKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJc3dpdGNoIChzdC0+cmVzb2x1dGlvbikgeworCWNhc2UgUkVTXzEwOgorCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMxLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfMTI6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMwLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczEsIDEpOworCQlicmVhazsKKwljYXNlIFJFU18xNDoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczAsIDEpOworCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMSwgMCk7CisJCWJyZWFrOworCWNhc2UgUkVTXzE2OgorCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMxLCAxKTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2Z0X3Jlc2V0KHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJY29uZmlnX3dyaXRlKHN0LCBSRUdfU09GVF9SRVNFVCk7CisJY29uZmlnX3dyaXRlKHN0LCAweDApOworfQorCisKKy8qIHJldHVybiB0aGUgT0xEIERBVEEgc2luY2UgbGFzdCBzcGkgYnVzIHdyaXRlICovCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJaWYgKHN0LT5vbGRfZGF0YSkgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHN0LT5yeFswXSk7CisJCXN0LT5vbGRfZGF0YSA9IDA7CisJfSBlbHNlCisJCXJldCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfcmF3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVkYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJnVkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYXRhID0gdWRhdGEgJiAweGZmOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfd3JpdGUoc3QsIGRhdGEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9zb2Z0cmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXNvZnRfcmVzZXQoc3QpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3Nob3dfZmNsa2luKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5mY2xraW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9mY2xraW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmY2xraW47CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZmY2xraW4pOworCWlmICghcmV0ICYmIGZjbGtpbiA+PSBBRDJTMTIxMF9NSU5fQ0xLSU4gJiYKKwkJCQlmY2xraW4gPD0gQUQyUzEyMTBfTUFYX0NMS0lOKSB7CisJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwkJc3QtPmZjbGtpbiA9IGZjbGtpbjsKKwl9IGVsc2UgeworCQlwcl9lcnIoImFkMnMxMjEwOiBmY2xraW4gb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0KTsKKwlzb2Z0X3Jlc2V0KHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X2ZleGNpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+ZmV4Y2l0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfZmV4Y2l0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmV4Y2l0OworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZmV4Y2l0KTsKKwlpZiAoIXJldCAmJiBmZXhjaXQgPj0gQUQyUzEyMTBfTUlOX0VYQ0lUICYmCisJCQkJZmV4Y2l0IDw9IEFEMlMxMjEwX01BWF9FWENJVCkgeworCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCXN0LT5mZXhjaXQgPSBmZXhjaXQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJhZDJzMTIxMDogZXhjaXRhdGlvbiBmcmVxdWVuY3kgb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0KTsKKwlzb2Z0X3Jlc2V0KHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X2NvbnRyb2woc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgdWRhdGE7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdWRhdGEpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfd3JpdGUoc3QsIFJFR19DT05UUk9MKTsKKwlkYXRhID0gdWRhdGEgJiBNU0JfSVNfTE9XOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSk7CisJY29uZmlnX3JlYWQoc3QsIFJFR19DT05UUk9MLCAmZGF0YSk7CisJaWYgKGRhdGEgJiBNU0JfSVNfSElHSCkgeworCQlyZXQgPSAtRUlPOworCQlwcl9lcnIoImFkMnMxMjEwOiB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIGZhaWxcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3QtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uX3ZhbHVlW2RhdGEgJiBTRVRfUkVTT0xVVElPTl07CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlkYXRhID0gcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CisJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCisJCXByX3dhcm5pbmcoImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKwlzZXRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VuZGlmCisJcmV0ID0gbGVuOworCWlmIChkYXRhICYgRU5BQkxFX0hZU1RFUkVTSVMpCisJCXN0LT5oeXN0ZXJlc2lzID0gMTsKKwllbHNlCisJCXN0LT5oeXN0ZXJlc2lzID0gMDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3Jlc29sdXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPnJlc29sdXRpb24pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdWRhdGEpOworCWlmIChyZXQgfHwgdWRhdGEgPCBSRVNfMTAgfHwgdWRhdGEgPiBSRVNfMTYpIHsKKwkJcHJfZXJyKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBvdXQgb2YgcmFuZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gflNFVF9SRVNPTFVUSU9OOworCWRhdGEgfD0gKHVkYXRhIC0gUkVTXzEwKSA+PiAxOworCWNvbmZpZ193cml0ZShzdCwgUkVHX0NPTlRST0wpOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSAmIE1TQl9JU19MT1cpOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCWlmIChkYXRhICYgTVNCX0lTX0hJR0gpIHsKKwkJcmV0ID0gLUVJTzsKKwkJcHJfZXJyKCJhZDJzMTIxMDogc2V0dGluZyByZXNvbHV0aW9uIGZhaWxcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3QtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uX3ZhbHVlW2RhdGEgJiBTRVRfUkVTT0xVVElPTl07CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlkYXRhID0gcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CisJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCisJCXByX3dhcm5pbmcoImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKwlzZXRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VuZGlmCisJcmV0ID0gbGVuOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisvKiByZWFkIHRoZSBmYXVsdCByZWdpc3RlciBzaW5jZSBsYXN0IHNhbXBsZSAqLworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJcmV0ID0gY29uZmlnX3JlYWQoc3QsIFJFR19GQVVMVCwgJmRhdGEpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJbGVuID0gc3ByaW50ZihidWYsICIweCV4XG4iLCBkYXRhKTsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9jbGVhcl9mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJc3RhcnRfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJc3RvcF9zYW1wbGUoc3QpOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfRkFVTFQsICZkYXRhKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCXN0b3Bfc2FtcGxlKHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICppYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfcmVhZChzdCwgaWF0dHItPmFkZHJlc3MsICZkYXRhKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3N0b3JlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqaWF0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ193cml0ZShzdCwgaWF0dHItPmFkZHJlc3MpOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSAmIE1TQl9JU19MT1cpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3Nob3dfcG9zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXN0LT54ZmVyLmxlbiA9IDI7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXN0YXJ0X3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDYgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCisJc2V0X21vZGUoTU9EX1BPUywgc3QpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlwb3MgPSAoKCgodTE2KShzdC0+cnhbMF0pKSA8PCA4KSB8IChzdC0+cnhbMV0pKTsKKwlpZiAoc3QtPmh5c3RlcmVzaXMpCisJCXBvcyA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb3MpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3ZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJdW5zaWduZWQgc2hvcnQgbmVnYXRpdmU7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCXMxNiB2ZWw7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKworCXNldF9tb2RlKE1PRF9WRUwsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJbmVnYXRpdmUgPSBzdC0+cnhbMF0gJiAweDgwOworCXZlbCA9ICgoKChzMTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSkpOworCXZlbCA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwlpZiAobmVnYXRpdmUpIHsKKwkJbmVnYXRpdmUgPSAoMHhmZmZmID4+IHN0LT5yZXNvbHV0aW9uKSA8PCBzdC0+cmVzb2x1dGlvbjsKKwkJdmVsIHw9IG5lZ2F0aXZlOworCX0KKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2ZWwpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3Bvc192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXVuc2lnbmVkIHNob3J0IG5lZ2F0aXZlOworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1MTYgcG9zOworCXMxNiB2ZWw7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKworCXNldF9tb2RlKE1PRF9QT1MsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcG9zID0gKCgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdKSk7CisJaWYgKHN0LT5oeXN0ZXJlc2lzKQorCQlwb3MgPj49IDE2IC0gc3QtPnJlc29sdXRpb247CisJbGVuID0gc3ByaW50ZihidWYsICIlZCAiLCBwb3MpOworCisJc3QtPnhmZXIubGVuID0gMjsKKwlzZXRfbW9kZShNT0RfVkVMLCBzdCk7CisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwluZWdhdGl2ZSA9IHN0LT5yeFswXSAmIDB4ODA7CisJdmVsID0gKCgoKHMxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdKSk7CisJdmVsID4+PSAxNiAtIHN0LT5yZXNvbHV0aW9uOworCWlmIChuZWdhdGl2ZSkgeworCQluZWdhdGl2ZSA9ICgweGZmZmYgPj4gc3QtPnJlc29sdXRpb24pIDw8IHN0LT5yZXNvbHV0aW9uOworCQl2ZWwgfD0gbmVnYXRpdmU7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVkXG4iLCB2ZWwpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoZGVzY3JpcHRpb24sCisJIlZhcmlhYmxlIFJlc29sdXRpb24sIDEwLUJpdCB0byAxNkJpdCBSL0RcblwKK0NvbnZlcnRlciB3aXRoIFJlZmVyZW5jZSBPc2NpbGxhdG9yIik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJhd19pbywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmF3LCBhZDJzMTIxMF9zdG9yZV9yYXcsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwgYWQyczEyMTBfc3RvcmVfc29mdHJlc2V0LCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZmNsa2luLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19mY2xraW4sIGFkMnMxMjEwX3N0b3JlX2ZjbGtpbiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZleGNpdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfZmV4Y2l0LAlhZDJzMTIxMF9zdG9yZV9mZXhjaXQsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjb250cm9sLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19jb250cm9sLCBhZDJzMTIxMF9zdG9yZV9jb250cm9sLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYml0cywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVzb2x1dGlvbiwgYWQyczEyMTBfc3RvcmVfcmVzb2x1dGlvbiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZhdWx0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19mYXVsdCwgYWQyczEyMTBfY2xlYXJfZmF1bHQsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3MsIFNfSVJVR08sCisJCWFkMnMxMjEwX3Nob3dfcG9zLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmVsLCBTX0lSVUdPLAorCQlhZDJzMTIxMF9zaG93X3ZlbCwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBvc192ZWwsIFNfSVJVR08sCisJCWFkMnMxMjEwX3Nob3dfcG9zX3ZlbCwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGxvc190aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0xPU19USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZG9zX292cl90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19PVlJfVEhSRCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRvc19taXNfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19ET1NfTUlTX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkb3NfcnN0X21heF90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19SU1RfTUFYX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkb3NfcnN0X21pbl90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19SU1RfTUlOX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3RfaGlnaF90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0xPVF9ISUdIX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3RfbG93X3RocmQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X3JlZywgYWQyczEyMTBfc3RvcmVfcmVnLCBSRUdfTE9UX0xPV19USFJEKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkMnMxMjEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfZGVzY3JpcHRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jhd19pby5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ZjbGtpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZmV4Y2l0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jb250cm9sLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXRzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92ZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bvc192ZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xvc190aHJkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kb3Nfb3ZyX3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rvc19taXNfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZG9zX3JzdF9tYXhfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZG9zX3JzdF9taW5fdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbG90X2hpZ2hfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbG90X2xvd190aHJkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkMnMxMjEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5hdHRycyA9IGFkMnMxMjEwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIxMF9pbml0aWFsKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlzdC0+cmVzb2x1dGlvbiA9IHJlYWRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKKyNlbmRpZgorCisJY29uZmlnX3dyaXRlKHN0LCBSRUdfQ09OVFJPTCk7CisJZGF0YSA9IERFRl9DT05UUk9MICYgfihTRVRfUkVTT0xVVElPTik7CisJZGF0YSB8PSAoc3QtPnJlc29sdXRpb24gLSBSRVNfMTApID4+IDE7CisJY29uZmlnX3dyaXRlKHN0LCBkYXRhKTsKKwlyZXQgPSBjb25maWdfcmVhZChzdCwgUkVHX0NPTlRST0wsICZkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmIChkYXRhICYgTVNCX0lTX0hJR0gpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJdXBkYXRlX2ZyZXF1ZW5jeV9jb250cm9sX3dvcmQoc3QpOworCXNvZnRfcmVzZXQoc3QpOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkMnMxMjEwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdDsKKwlpbnQgcG4sIHJldCA9IDA7CisJdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZm9yIChwbiA9IDA7IHBuIDwgQUQyUzEyMTBfUE47IHBuKyspIHsKKwkJaWYgKGdwaW9fcmVxdWVzdChwaW5zW3BuXSwgRFJWX05BTUUpKSB7CisJCQlwcl9lcnIoIiVzOiByZXF1ZXN0IGdwaW8gcGluICVkIGZhaWxlZFxuIiwKKwkJCQkJCURSVl9OQU1FLCBwaW5zW3BuXSk7CisJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCQlpZiAocG4gPCBBRDJTMTIxMF9TQUEpCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluc1twbl0sIDEpOworCQllbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKQorCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocGluc1twbl0pOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluc1twbl0sIDEpOworI2VuZGlmCisJCX0KKwl9CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisJc3QtPnhmZXIudHhfYnVmID0gc3QtPnR4OworCXN0LT54ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwlzdC0+aHlzdGVyZXNpcyA9IDE7CisJc3QtPm1vZGUgPSBNT0RfQ09ORklHOworCXN0LT5yZXNvbHV0aW9uID0gUkVTXzEyOworCXN0LT5mY2xraW4gPSBBRDJTMTIxMF9ERUZfQ0xLSU47CisJc3QtPmZleGNpdCA9IEFEMlMxMjEwX0RFRl9FWENJVDsKKwlzdC0+c2FtcGxlID0gcGluc1swXTsKKwlzdC0+YTAgPSBwaW5zWzFdOworCXN0LT5hMSA9IHBpbnNbMl07CisJc3QtPnJlczAgPSBwaW5zWzNdOworCXN0LT5yZXMxID0gcGluc1s0XTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQyczEyMTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChzcGktPm1heF9zcGVlZF9oeiAhPSBBRDJTMTIxMF9ERUZfQ0xLSU4pCisJCXN0LT5mY2xraW4gPSBzcGktPm1heF9zcGVlZF9oejsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzcGkpOworCisJYWQyczEyMTBfaW5pdGlhbChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlmb3IgKC0tcG47IHBuID49IDA7IHBuLS0pCisJCWdwaW9fZnJlZShwaW5zW3BuXSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQyczEyMTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnMxMjEwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkMnMxMjEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDJzMTIxMF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQyczEyMTBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQyczEyMTBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkMnMxMjEwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkMnMxMjEwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIxMF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQyczEyMTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHcmFmZiBZYW5nIDxncmFmZi55YW5nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQyUzEyMTAgUmVzb2x2ZXIgdG8gRGlnaXRhbCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnM5MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIGFkMnM5MC5jIHNpbXBsZSBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzkwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkMnM5MCIKKworc3RydWN0IGFkMnM5MF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CisJdTggcnhbMl07CisJdTggdHhbMl07Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDJzOTBfc2hvd19hbmd1bGFyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHZhbDsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzOTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXZhbCA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgNCkgfCAoKHN0LT5yeFsxXSAmIDB4RjApID4+IDQpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TSU1QTEVfUkVTT0xWRVIoX3Nob3cpIFwKKwlJSU9fREVWSUNFX0FUVFIoYW5ndWxhciwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihkZXNjcmlwdGlvbiwKKwkiTG93IENvc3QsIENvbXBsZXRlIDEyLUJpdCBSZXNvbHZlci10by1EaWdpdGFsIENvbnZlcnRlciIpOworc3RhdGljIElJT19ERVZfQVRUUl9TSU1QTEVfUkVTT0xWRVIoYWQyczkwX3Nob3dfYW5ndWxhcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzOTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9kZXNjcmlwdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYW5ndWxhci5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzOTBfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQyczkwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzOTBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQyczkwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkvKiBuZWVkIDYwMG5zIGJldHdlZW4gQ1MgYW5kIHRoZSBmaXJzdCBmYWxsaW5nIGVkZ2Ugb2YgU0NMSyAqLworCXNwaS0+bWF4X3NwZWVkX2h6ID0gODMwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkMnM5MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnM5MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDJzOTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkMnM5MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQyczkwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMnM5MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQyczkwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkMnM5MF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQyczkwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDJzOTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHcmFmZiBZYW5nIDxncmFmZi55YW5nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQyUzkwIFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCmluZGV4IGVlOTFhOTUuLjI0Yjc0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKQEAgLTEwOCw2ICsxMDgsMTIgQEAKIAlJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgorICogSUlPX0RFVl9BVFRSX1JFU0VUOiByZXNldHMgdGhlIGRldmljZQorICoqLworI2RlZmluZSBJSU9fREVWX0FUVFJfUkVTRVQoX3N0b3JlKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIF9zdG9yZSwgMCkKKworLyoqCiAgKiBJSU9fQ09OU1RfQVRUUl9OQU1FIC0gY29uc3RhbnQgaWRlbnRpZmllcgogICogQF9zdHJpbmc6IHRoZSBuYW1lCiAgKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L0tjb25maWcKaW5kZXggYjQ2YmQ5ZC4uODIzOTEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvS2NvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIAogY29uZmlnIFNORF9JTlRFTE1JRAogCXRyaXN0YXRlICJJbnRlbCBNSUQgc291bmQgY2FyZCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTT1VORCAmJiBTTkQKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfU0VRVUVOQ0VSCiAJc2VsZWN0IFNORF9KQUNLCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYwppbmRleCAyNGQzOTI4Li5jZTRhOWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKQEAgLTI5LDExICsyOSwxNCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgaW5pdCBmdW5jdGlvbnMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgpAQCAtMTY5LDE3ICsxNzIsMTcgQEAKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IFByb2JlIGZvciBESUQgJXhcbiIsIHBjaS0+ZGV2aWNlKTsKKwlwcl9kZWJ1ZygiUHJvYmUgZm9yIERJRCAleFxuIiwgcGNpLT5kZXZpY2UpOwogCW11dGV4X2xvY2soJmRydl9jdHhfbG9jayk7CiAJaWYgKHNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBPbmx5IG9uZSBzc3QgaGFuZGxlIGlzIHN1cHBvcnRlZFxuIik7CisJCXByX2VycigiT25seSBvbmUgc3N0IGhhbmRsZSBpcyBzdXBwb3J0ZWRcbiIpOwogCQltdXRleF91bmxvY2soJmRydl9jdHhfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJc3N0X2Rydl9jdHggPSBremFsbG9jKHNpemVvZigqc3N0X2Rydl9jdHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBpbnRlbF9zc3QgbWFsbG9jIGZhaWxcbiIpOworCQlwcl9lcnIoIm1hbGxvYyBmYWlsXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZkcnZfY3R4X2xvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMjYsNyArMjI5LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKIAogCXNzdF9kcnZfY3R4LT5tYXhfc3RyZWFtcyA9IHBjaV9pZC0+ZHJpdmVyX2RhdGE7Ci0JcHJfZGVidWcoInNzdDogR290IGRydiBkYXRhIG1heCBzdHJlYW0gJWRcbiIsCisJcHJfZGVidWcoIkdvdCBkcnYgZGF0YSBtYXggc3RyZWFtICVkXG4iLAogCQkJCXNzdF9kcnZfY3R4LT5tYXhfc3RyZWFtcyk7CiAJZm9yIChpID0gMTsgaSA8PSBzc3RfZHJ2X2N0eC0+bWF4X3N0cmVhbXM7IGkrKykgewogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tpXTsKQEAgLTI0MSwxOCArMjQ0LDE4IEBACiAJCQlzc3RfZHJ2X2N0eC0+bW1hcF9tZW0gPQogCQkJCWt6YWxsb2Moc3N0X2Rydl9jdHgtPm1tYXBfbGVuLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChzc3RfZHJ2X2N0eC0+bW1hcF9tZW0pIHsKLQkJCQlwcl9kZWJ1Zygic3N0OiBHb3QgbWVtb3J5ICVwIHNpemUgMHgleFxuIiwKKwkJCQlwcl9kZWJ1ZygiR290IG1lbW9yeSAlcCBzaXplIDB4JXhcbiIsCiAJCQkJCXNzdF9kcnZfY3R4LT5tbWFwX21lbSwKIAkJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbGVuKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChzc3RfZHJ2X2N0eC0+bW1hcF9sZW4gPCAoU1NUX01NQVBfU1RFUCpQQUdFX1NJWkUpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvYyBmYWlsLi4uYWJvcnQhIVxuIik7CisJCQkJcHJfZXJyKCJtZW0gYWxsb2MgZmFpbC4uLmFib3J0ISFcbiIpOwogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBmcmVlX3Byb2Nlc3NfcmVwbHlfd3E7CiAJCQl9CiAJCQlzc3RfZHJ2X2N0eC0+bW1hcF9sZW4gLT0gKFNTVF9NTUFQX1NURVAgKiBQQUdFX1NJWkUpOwotCQkJcHJfZGVidWcoInNzdDptZW0gYWxsb2MgZmFpbGVkLi4udHJ5aW5nICVkXG4iLAorCQkJcHJfZGVidWcoIm1lbSBhbGxvYyBmYWlsZWQuLi50cnlpbmcgJWRcbiIsCiAJCQkJCQlzc3RfZHJ2X2N0eC0+bW1hcF9sZW4pOwogCQl9CiAJfQpAQCAtMjYwLDcgKzI2Myw3IEBACiAJLyogSW5pdCB0aGUgZGV2aWNlICovCiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlpZiAocmV0KSB7Ci0JCXByX2Vycigic3N0OiBkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKKwkJcHJfZXJyKCJkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKIAkJZ290byBkb19mcmVlX21lbTsKIAl9CiAJc3N0X2Rydl9jdHgtPnBjaSA9IHBjaV9kZXZfZ2V0KHBjaSk7CkBAIC0yNzMsMjUgKzI3NiwyNSBAQAogCXNzdF9kcnZfY3R4LT5zaGltID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMSk7CiAJaWYgKCFzc3RfZHJ2X2N0eC0+c2hpbSkKIAkJZ290byBkb19yZWxlYXNlX3JlZ2lvbnM7Ci0JcHJfZGVidWcoInNzdDogU1NUIFNoaW0gUHRyICVwXG4iLCBzc3RfZHJ2X2N0eC0+c2hpbSk7CisJcHJfZGVidWcoIlNTVCBTaGltIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPnNoaW0pOwogCiAJLyogU2hhcmVkIFNSQU0gKi8KIAlzc3RfZHJ2X2N0eC0+bWFpbGJveCA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDIpOwogCWlmICghc3N0X2Rydl9jdHgtPm1haWxib3gpCiAJCWdvdG8gZG9fdW5tYXBfc2hpbTsKLQlwcl9kZWJ1Zygic3N0OiBTUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPm1haWxib3gpOworCXByX2RlYnVnKCJTUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPm1haWxib3gpOwogCiAJLyogSVJBTSAqLwogCXNzdF9kcnZfY3R4LT5pcmFtID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMyk7CiAJaWYgKCFzc3RfZHJ2X2N0eC0+aXJhbSkKIAkJZ290byBkb191bm1hcF9zcmFtOwotCXByX2RlYnVnKCJzc3Q6SVJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5pcmFtKTsKKwlwcl9kZWJ1ZygiSVJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5pcmFtKTsKIAogCS8qIERSQU0gKi8KIAlzc3RfZHJ2X2N0eC0+ZHJhbSA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDQpOwogCWlmICghc3N0X2Rydl9jdHgtPmRyYW0pCiAJCWdvdG8gZG9fdW5tYXBfaXJhbTsKLQlwcl9kZWJ1Zygic3N0OiBEUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPmRyYW0pOworCXByX2RlYnVnKCJEUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPmRyYW0pOwogCiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX1VOX0lOSVQ7CkBAIC0zMDEsMjYgKzMwNCwzMSBAQAogCQlJUlFGX1NIQVJFRCwgU1NUX0RSVl9OQU1FLCBzc3RfZHJ2X2N0eCk7CiAJaWYgKHJldCkKIAkJZ290byBkb191bm1hcF9kcmFtOwotCXByX2RlYnVnKCJzc3Q6IFJlZ2lzdGVyZWQgSVJRIDB4JXhcbiIsIHBjaS0+aXJxKTsKKwlwcl9kZWJ1ZygiUmVnaXN0ZXJlZCBJUlEgMHgleFxuIiwgcGNpLT5pcnEpOworCisJLypSZWdpc3RlciBMUEUgQ29udHJvbCBhcyBtaXNjIGRyaXZlciovCisJcmV0ID0gbWlzY19yZWdpc3RlcigmbHBlX2N0cmwpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJjb3VsZG4ndCByZWdpc3RlciBjb250cm9sIGRldmljZVxuIik7CisJCWdvdG8gZG9fZnJlZV9pcnE7CisJfQogCiAJaWYgKHNzdF9kcnZfY3R4LT5wY2lfaWQgPT0gU1NUX01SU1RfUENJX0lEKSB7CiAJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxwZV9kZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoInNzdDogY291bGRuJ3QgcmVnaXN0ZXIgTFBFIGRldmljZVxuIik7Ci0JCQlnb3RvIGRvX2ZyZWVfaXJxOwotCQl9Ci0KLQkJLypSZWdpc3RlciBMUEUgQ29udHJvbCBhcyBtaXNjIGRyaXZlciovCi0JCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxwZV9jdHJsKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvdWxkbid0IHJlZ2lzdGVyIG1pc2MgZHJpdmVyXG4iKTsKLQkJCWdvdG8gZG9fZnJlZV9pcnE7Ci0JCX0KKyAJCQlwcl9lcnIoImNvdWxkbid0IHJlZ2lzdGVyIG1pc2MgZHJpdmVyXG4iKTsKKwkJCWdvdG8gZG9fZnJlZV9taXNjOworIAkJfQogCX0KIAlzc3RfZHJ2X2N0eC0+bHBlX3N0YWxsZWQgPSAwOwotCXByX2RlYnVnKCJzc3Q6IC4uLnN1Y2Nlc3NmdWxseSBkb25lISEhXG4iKTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBjaS0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGNpLT5kZXYpOworCXBtX3J1bnRpbWVfYWxsb3coJnBjaS0+ZGV2KTsKKwlwcl9kZWJ1ZygiLi4uc3VjY2Vzc2Z1bGx5IGRvbmUhISFcbiIpOwogCXJldHVybiByZXQ7CiAKK2RvX2ZyZWVfbWlzYzoKKwltaXNjX2RlcmVnaXN0ZXIoJmxwZV9jdHJsKTsKIGRvX2ZyZWVfaXJxOgogCWZyZWVfaXJxKHBjaS0+aXJxLCBzc3RfZHJ2X2N0eCk7CiBkb191bm1hcF9kcmFtOgpAQCAtMzQ3LDcgKzM1NSw3IEBACiAJZGVzdHJveV93b3JrcXVldWUoc3N0X2Rydl9jdHgtPm1hZF93cSk7CiBkb19mcmVlX2Rydl9jdHg6CiAJa2ZyZWUoc3N0X2Rydl9jdHgpOwotCXByX2Vycigic3N0OiBQcm9iZSBmYWlsZWQgd2l0aCAweCV4XG4iLCByZXQpOworCXByX2VycigiUHJvYmUgZmFpbGVkIHdpdGggMHgleFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjUsMTAgKzM3Myw5IEBACiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX1VOX0lOSVQ7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkgeworCW1pc2NfZGVyZWdpc3RlcigmbHBlX2N0cmwpOworCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkKIAkJbWlzY19kZXJlZ2lzdGVyKCZscGVfZGV2KTsKLQkJbWlzY19kZXJlZ2lzdGVyKCZscGVfY3RybCk7Ci0JfQogCWZyZWVfaXJxKHBjaS0+aXJxLCBzc3RfZHJ2X2N0eCk7CiAJaW91bm1hcChzc3RfZHJ2X2N0eC0+ZHJhbSk7CiAJaW91bm1hcChzc3RfZHJ2X2N0eC0+aXJhbSk7CkBAIC00MDQsMTAgKzQxMSwxMiBAQAogewogCXVuaW9uIGNvbmZpZ19zdGF0dXNfcmVnIGNzcjsKIAotCXByX2RlYnVnKCJzc3Q6IGludGVsX3NzdF9zdXNwZW5kIGNhbGxlZFxuIik7CisJcHJfZGVidWcoImludGVsX3NzdF9zdXNwZW5kIGNhbGxlZFxuIik7CiAKLQlpZiAoc3N0X2Rydl9jdHgtPnBiX3N0cmVhbXMgIT0gMCB8fCBzc3RfZHJ2X2N0eC0+Y3Bfc3RyZWFtcyAhPSAwKQotCQlyZXR1cm4gLUVQRVJNOworCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCkgeworCQlwcl9lcnIoImFjdGl2ZSBzdHJlYW1zLG5vdCBhYmxlIHRvIHN1c3BlbmRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAkvKkFzc2VydCBSRVNFVCBvbiBMUEUgUHJvY2Vzc29yKi8KIAljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOwogCWNzci5mdWxsID0gY3NyLmZ1bGwgfCAweDI7CkBAIC00MzQsMTcgKzQ0MywxNyBAQAogewogCWludCByZXQgPSAwOwogCi0JcHJfZGVidWcoInNzdDogaW50ZWxfc3N0X3Jlc3VtZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJpbnRlbF9zc3RfcmVzdW1lIGNhbGxlZFxuIik7CiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX1NVU1BFTkRFRCkgewotCQlwcl9lcnIoInNzdDogU1NUIGlzIG5vdCBpbiBzdXNwZW5kZWQgc3RhdGVcbiIpOwotCQlyZXR1cm4gLUVQRVJNOworCQlwcl9lcnIoIlNTVCBpcyBub3QgaW4gc3VzcGVuZGVkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCXNzdF9kcnZfY3R4ID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCWlmIChyZXQpCi0JCXByX2Vycigic3N0OiBkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKKwkJcHJfZXJyKCJkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKIAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9VTl9JTklUOwpAQCAtNDUyLDYgKzQ2MSwzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGludGVsX3NzdF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXByX2RlYnVnKCJydW50aW1lX3N1c3BlbmQgY2FsbGVkXG4iKTsKKwlyZXR1cm4gaW50ZWxfc3N0X3N1c3BlbmQocGNpX2RldiwgUE1TR19TVVNQRU5EKTsKK30KKworc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXByX2RlYnVnKCJydW50aW1lX3Jlc3VtZSBjYWxsZWRcbiIpOworCXJldHVybiBpbnRlbF9zc3RfcmVzdW1lKHBjaV9kZXYpOworfQorCitzdGF0aWMgaW50IGludGVsX3NzdF9ydW50aW1lX2lkbGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXByX2RlYnVnKCJydW50aW1lX2lkbGUgY2FsbGVkXG4iKTsKKwlpZiAoc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQgPT0gMCAmJiBzc3RfZHJ2X2N0eC0+YW1fY250ID09IDApCisJCXBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCBTU1RfU1VTUEVORF9ERUxBWSk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGludGVsX3NzdF9wbSA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gaW50ZWxfc3N0X3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBpbnRlbF9zc3RfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfaWRsZSA9IGludGVsX3NzdF9ydW50aW1lX2lkbGUsCit9OworCiAvKiBQQ0kgUm91dGluZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbnRlbF9zc3RfaWRzW10gPSB7CiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgU1NUX01SU1RfUENJX0lEKSwgM30sCkBAIC00NjgsNiArNTA1LDkgQEAKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9IGludGVsX3NzdF9zdXNwZW5kLAogCS5yZXN1bWUgPSBpbnRlbF9zc3RfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCS5wbSA9ICZpbnRlbF9zc3RfcG0sCisJfSwKICNlbmRpZgogfTsKIApAQCAtNDgyLDE0ICs1MjIsMTQgQEAKIHsKIAkvKiBJbml0IGFsbCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGV0Yy4uLi4qLwogCWludCByZXQgPSAwOwotCXByX2RlYnVnKCJzc3Q6IElORk86ICoqKioqKioqIFNTVCBEUklWRVIgbG9hZGluZy4uIFZlcjogJXNcbiIsCisJcHJfZGVidWcoIklORk86ICoqKioqKioqIFNTVCBEUklWRVIgbG9hZGluZy4uIFZlcjogJXNcbiIsCiAJCQkJICAgICAgIFNTVF9EUklWRVJfVkVSU0lPTik7CiAKIAltdXRleF9pbml0KCZkcnZfY3R4X2xvY2spOwogCS8qIFJlZ2lzdGVyIHdpdGggUENJICovCiAJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcl9lcnIoInNzdDogUENJIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2VycigiUENJIHJlZ2lzdGVyIGZhaWxlZFxuIik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTA0LDcgKzU0NCw3IEBACiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOwogCi0JcHJfZGVidWcoInNzdDogZHJpdmVyIHVubG9hZGVkXG4iKTsKKwlwcl9kZWJ1ZygiZHJpdmVyIHVubG9hZGVkXG4iKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmggYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5oCmluZGV4IDFmMTlmMGQuLmNiMDNmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuaApAQCAtMjksNiArMjksNyBAQAogICoJYW5kIG1pZGRsZXdhcmUuCiAgKiAgVGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBTU1QgYW5kIE1BRCBkcml2ZXJzCiAgKi8KKyNpbmNsdWRlICJpbnRlbF9zc3RfaW9jdGwuaCIKIAogI2RlZmluZSBTU1RfQ0FSRF9OQU1FUyAiaW50ZWxfbWlkX2NhcmQiCiAKQEAgLTEwNywxMCArMTA4LDE1IEBACiAJaW50ICgqcG93ZXJfZG93bl9wbWljKSAodm9pZCk7CiB9OwogCitzdHJ1Y3QgaW50ZWxfc3N0X3BjbV9jb250cm9sIHsKKwlpbnQgKCpvcGVuKSAoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOworCWludCAoKmRldmljZV9jb250cm9sKSAoaW50IGNtZCwgdm9pZCAqYXJnKTsKKwlpbnQgKCpjbG9zZSkgKHVuc2lnbmVkIGludCBzdHJfaWQpOworfTsKIHN0cnVjdCBpbnRlbF9zc3RfY2FyZF9vcHMgewogCWNoYXIgKm1vZHVsZV9uYW1lOwogCXVuc2lnbmVkIGludCAgdmVuZG9yX2lkOwotCWludCAoKmNvbnRyb2xfc2V0KSAoaW50IGNvbnRyb2xfZWxlbWVudCwgdm9pZCAqdmFsdWUpOworCXN0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgKnBjbV9jb250cm9sOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2FwcF9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2FwcF9pbnRlcmZhY2UuYwppbmRleCA5OTE0NDAwLi5hMzY3OTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9hcHBfaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfYXBwX2ludGVyZmFjZS5jCkBAIC0yNywxMiArMjcsMTUgQEAKICAqICBVcHBlciBsYXllciBpbnRlcmZhY2VzIChNQUQgZHJpdmVyLCBNTUYpIHRvIFNTVCBkcml2ZXIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCiAjaW5jbHVkZSA8bGludXgvcmFyX3JlZ2lzdGVyLmg+CkBAIC01OCwxNCArNjEsMTQgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAlpZiAoc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgIT0gU05EX01BRF9JTklUX0RPTkUpIHsKLQkJcHJfd2Fybigic3N0OiBTb3VuZCBjYXJkIG5vdCBhdmFpbGJsZVxuICIpOworCQlwcl93YXJuKCJTb3VuZCBjYXJkIG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1NVU1BFTkRFRCkgewotCQlwcl9kZWJ1Zygic3N0OiBSZXN1bWluZyBmcm9tIFN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCXByX2RlYnVnKCJSZXN1bWluZyBmcm9tIFN1c3BlbmRlZCBzdGF0ZVxuIik7CiAJCXJldHZhbCA9IGludGVsX3NzdF9yZXN1bWUoc3N0X2Rydl9jdHgtPnBjaSk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFJlc3VtZSBGYWlsZWQ9ICUjeCxhYm9ydFxuIiwgcmV0dmFsKTsKKwkJCXByX2RlYnVnKCJSZXN1bWUgRmFpbGVkPSAlI3gsYWJvcnRcbiIsIHJldHZhbCk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQpAQCAtOTcsMTUgKzEwMCwyMiBAQAogICovCiBpbnQgaW50ZWxfc3N0X29wZW4oc3RydWN0IGlub2RlICppX25vZGUsIHN0cnVjdCBmaWxlICpmaWxlX3B0cikKIHsKLQlpbnQgcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJdW5zaWduZWQgaW50IHJldHZhbDsKIAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwlyZXR2YWwgPSBpbnRlbF9zc3RfY2hlY2tfZGV2aWNlKCk7CisJaWYgKHJldHZhbCkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwogCWlmIChzc3RfZHJ2X2N0eC0+ZW5jb2RlZF9jbnQgPCBNQVhfRU5DX1NUUkVBTSkgewogCQlzdHJ1Y3QgaW9jdGxfcHZ0X2RhdGEgKmRhdGEgPQogCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGlvY3RsX3B2dF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGF0YSkgeworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTE1LDkgKzEyNSwxMCBAQAogCQlkYXRhLT5wdnRfaWQgPSBzc3RfYXNzaWduX3B2dF9pZChzc3RfZHJ2X2N0eCk7CiAJCWRhdGEtPnN0cl9pZCA9IDA7CiAJCWZpbGVfcHRyLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWRhdGE7Ci0JCXByX2RlYnVnKCJzc3Q6IHB2dF9pZCBoYW5kbGUgPSAlZCFcbiIsIGRhdGEtPnB2dF9pZCk7CisJCXByX2RlYnVnKCJwdnRfaWQgaGFuZGxlID0gJWQhXG4iLCBkYXRhLT5wdnRfaWQpOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FVVNFUlM7CisJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0xMzYsMTggKzE0NywyNiBAQAogICovCiBpbnQgaW50ZWxfc3N0X29wZW5fY250cmwoc3RydWN0IGlub2RlICppX25vZGUsIHN0cnVjdCBmaWxlICpmaWxlX3B0cikKIHsKLQlpbnQgcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJdW5zaWduZWQgaW50IHJldHZhbDsKIAogCS8qIGF1ZGlvIG1hbmFnZXIgb3BlbiAqLwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwlyZXR2YWwgPSBpbnRlbF9zc3RfY2hlY2tfZGV2aWNlKCk7CisJaWYgKHJldHZhbCkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwogCWlmIChzc3RfZHJ2X2N0eC0+YW1fY250IDwgTUFYX0FNX0hBTkRMRVMpIHsKIAkJc3N0X2Rydl9jdHgtPmFtX2NudCsrOwotCQlwcl9kZWJ1Zygic3N0OiBBTSBoYW5kbGUgb3BlbmVkLi4uXG4iKTsKKwkJcHJfZGVidWcoIkFNIGhhbmRsZSBvcGVuZWQuLi5cbiIpOwogCQlmaWxlX3B0ci0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXR2YWwgPSAtRUFDQ0VTOworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwl9CiAKIAltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTE2NiwxMCArMTg1LDExIEBACiB7CiAJc3RydWN0IGlvY3RsX3B2dF9kYXRhICpkYXRhID0gZmlsZV9wdHItPnByaXZhdGVfZGF0YTsKIAotCXByX2RlYnVnKCJzc3Q6IFJlbGVhc2UgY2FsbGVkLCBjbG9zaW5nIGFwcCBoYW5kbGVcbiIpOworCXByX2RlYnVnKCJSZWxlYXNlIGNhbGxlZCwgY2xvc2luZyBhcHAgaGFuZGxlXG4iKTsKIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCXNzdF9kcnZfY3R4LT5lbmNvZGVkX2NudC0tOwogCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07CisJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCWZyZWVfc3RyZWFtX2NvbnRleHQoZGF0YS0+c3RyX2lkKTsKIAlrZnJlZShkYXRhKTsKQEAgLTE4MSw4ICsyMDEsOSBAQAogCS8qIGF1ZGlvIG1hbmFnZXIgY2xvc2UgKi8KIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCXNzdF9kcnZfY3R4LT5hbV9jbnQtLTsKKwlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7Ci0JcHJfZGVidWcoInNzdDogQU0gaGFuZGxlIGNsb3NlZFxuIik7CisJcHJfZGVidWcoIkFNIGhhbmRsZSBjbG9zZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDgsNyArMjI5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsZW5ndGggPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBzdHJlYW0gJWQgbGVuZ3RoIDB4JXhcbiIsIHN0cl9pZCwgbGVuZ3RoKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciBzdHJlYW0gJWQgbGVuZ3RoIDB4JXhcbiIsIHN0cl9pZCwgbGVuZ3RoKTsKIAogCWlmIChsZW5ndGggPiBzc3RfZHJ2X2N0eC0+bW1hcF9sZW4pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjMxLDcgKzI1Miw3IEBACiAJZWxzZQogCQlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLm1tYXBwZWQgPSB0cnVlOwogCi0JcHJfZGVidWcoInNzdDogbW1hcCByZXQgMHgleFxuIiwgcmV0dmFsKTsKKwlwcl9kZWJ1ZygibW1hcCByZXQgMHgleFxuIiwgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yNDUsNyArMjY2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NzdF9tbWFwX2J1ZmZfZW50cnkgKmJ1Zl9lbnRyeTsKIAlzdHJ1Y3Qgc25kX3NzdF9tbWFwX2J1ZmZfZW50cnkgKnRtcF9idWY7CiAKLQlwcl9kZWJ1Zygic3N0OmNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKIAlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3MCw3ICsyOTEsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6bmV3IGJ1ZmZlcnMgY291bnQgJWQgc3RhdHVzICVkXG4iLAorCXByX2RlYnVnKCJuZXcgYnVmZmVycyBjb3VudCAlZCBzdGF0dXMgJWRcbiIsCiAJCQltbWFwX2J1Zi0+ZW50cmllcywgc3RyZWFtLT5zdGF0dXMpOwogCWJ1Zl9lbnRyeSA9IHRtcF9idWY7CiAJZm9yIChpID0gMDsgaSA8IG1tYXBfYnVmLT5lbnRyaWVzOyBpKyspIHsKQEAgLTMwMCwxNCArMzIxLDE0IEBACiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX1JVTk5JTkc7CiAJCWlmIChzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLKSB7CiAJCQlpZiAoc3N0X3BsYXlfZnJhbWUoc3RyX2lkKSA8IDApIHsKLQkJCQlwcl93YXJuKCJzc3Q6IHBsYXkgZnJhbWVzIGZhaWxcbiIpOworCQkJCXByX3dhcm4oInBsYXkgZnJhbWVzIGZhaWxcbiIpOwogCQkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCQlyZXR2YWwgPSAtRUlPOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCX0gZWxzZSBpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19DQVBUVVJFKSB7CiAJCQlpZiAoc3N0X2NhcHR1cmVfZnJhbWUoc3RyX2lkKSA8IDApIHsKLQkJCQlwcl93YXJuKCJzc3Q6IGNhcHR1cmUgZnJhbWUgZmFpbFxuIik7CisJCQkJcHJfd2FybigiY2FwdHVyZSBmcmFtZSBmYWlsXG4iKTsKIAkJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCQkJcmV0dmFsID0gLUVJTzsKIAkJCQlnb3RvIG91dF9mcmVlOwpAQCAtMzI0LDcgKzM0NSw3IEBACiAKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OmVuZCBvZiBwbGF5L3JlYyBpb2N0bCBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBpb2N0bCBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKHRtcF9idWYpOwpAQCAtMzQ5LDcgKzM3MCw3IEBACiAKIAlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX0lOSVQgJiYgc3RyZWFtLT5wcmV2ID09IFNUUkVBTV9VTl9JTklUKSB7CiAJCS8qIHN0cmVhbSBpcyBub3Qgc3RhcnRlZCB5ZXQgKi8KLQkJcHJfZGVidWcoInNzdDogU3RyZWFtIGlzbid0IGluIHN0YXJ0ZWQgc3RhdGUgJWQsIHByZXYgJWRcbiIsCisJCXByX2RlYnVnKCJTdHJlYW0gaXNuJ3QgaW4gc3RhcnRlZCBzdGF0ZSAlZCwgcHJldiAlZFxuIiwKIAkJCXN0cmVhbS0+c3RhdHVzLCBzdHJlYW0tPnByZXYpOwogCX0gZWxzZSBpZiAoKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9SVU5OSU5HIHx8CiAJCQlzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUEFVU0VEKSAmJgpAQCAtMzU4LDEzICszNzksMTMgQEAKIAkJaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfUExBWUJBQ0sgfHwKIAkJCQlzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJaWYgKHNzdF9wbGF5X2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBwbGF5IGZyYW1lcyBmYWlsZWRcbiIpOworCQkJCXByX3dhcm4oInBsYXkgZnJhbWVzIGZhaWxlZFxuIik7CiAJCQkJbXV0ZXhfdW5sb2NrKCZzdHJlYW0tPmxvY2spOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9IGVsc2UgaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfQ0FQVFVSRSkgewogCQkJaWYgKHNzdF9jYXB0dXJlX2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBjYXB0dXJlIGZyYW1lcyBmYWlsZWRcbiAiKTsKKwkJCQlwcl93YXJuKCJjYXB0dXJlIGZyYW1lcyBmYWlsZWRcbiIpOwogCQkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KQEAgLTM3OSw3ICs0MDAsNyBAQAogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGUoc3N0X2Rydl9jdHgsICZzdHJlYW0tPmRhdGFfYmxrKTsKIAlpZiAocmV0dmFsKSB7CiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7Ci0JCXByX2RlYnVnKCJzc3Q6IHdhaXQgcmV0dXJuZWQgZXJyb3IuLi5cbiIpOworCQlwcl9kZWJ1Zygid2FpdCByZXR1cm5lZCBlcnJvci4uLlxuIik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NzcsNyArNDk4LDcgQEAKIAkJaWYgKCgodW5zaWduZWQgbG9uZylpb3ZlY1tpbmRleF0uaW92X2Jhc2UKIAkJCQkrIGlvdmVjW2luZGV4XS5pb3ZfbGVuKSA8CiAJCQkJKCh1bnNpZ25lZCBsb25nKWlvdmVjW2luZGV4XS5pb3ZfYmFzZSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEJ1ZmZlciBvdmVyZmxvd3MiKTsKKwkJCXByX2RlYnVnKCJCdWZmZXIgb3ZlcmZsb3dzXG4iKTsKIAkJCWtmcmVlKHN0cmVhbV9idWZzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC00OTAsNyArNTExLDcgQEAKIAkJfQogCiAJCWNvcGllZF9zaXplICs9IHNpemU7Ci0JCXByX2RlYnVnKCJzc3Q6IGNvcGllZF9zaXplIC0gJWx4XG4iLCBjb3BpZWRfc2l6ZSk7CisJCXByX2RlYnVnKCJjb3BpZWRfc2l6ZSAtICVseFxuIiwgY29waWVkX3NpemUpOwogCQlpZiAoKGNvcGllZF9zaXplID49IG1tYXBfbGVuKSB8fAogCQkJCShzdHJlYW0tPnNnX2luZGV4ID09IG5yX3NlZ3MpKSB7CiAJCQlhZGRfdG9fbGlzdCA9IDE7CkBAIC01MjAsNyArNTQxLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIGNvcHkgc2VudCBidWZmZXJzICovCi0JcHJfZGVidWcoInNzdDogY2FwdHVyZSBzdHJlYW0gY29weWluZyB0byB1c2VyIG5vdy4uLlxuIik7CisJcHJfZGVidWcoImNhcHR1cmUgc3RyZWFtIGNvcHlpbmcgdG8gdXNlciBub3cuLi5cbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrYnVmcywgX2tidWZzLCAmc3RyZWFtLT5idWZzLCBub2RlKSB7CiAJCWlmIChrYnVmcy0+aW5fdXNlID09IHRydWUpIHsKIAkJCS8qIGNvcHkgdG8gdXNlciAqLwpAQCAtNTM4LDcgKzU1OSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JcHJfZGVidWcoInNzdDogZW5kIG9mIGNhcCBjb3B5XG4iKTsKKwlwcl9kZWJ1ZygiZW5kIG9mIGNhcCBjb3B5XG4iKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01OTAsNyArNjExLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJaWYgKHN0cmVhbS0+bW1hcHBlZCA9PSB0cnVlKSB7Ci0JCXByX3dhcm4oInNzdDogdXNlciB3cml0ZSBhbmQgc3RyZWFtIGlzIG1hcHBlZCIpOworCQlwcl93YXJuKCJ1c2VyIHdyaXRlIGFuZCBzdHJlYW0gaXMgbWFwcGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmICghY291bnQpCkBAIC01OTgsNyArNjE5LDcgQEAKIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCXN0cmVhbS0+Y3VtbV9ieXRlcyA9IDA7CiAJLyogY29weSB1c2VyIGJ1ZiBkZXRhaWxzICovCi0JcHJfZGVidWcoInNzdDogbmV3IGJ1ZmZlcnMgJXAsIGNvcHkgc2l6ZSAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IGJ1ZmZlcnMgJXAsIGNvcHkgc2l6ZSAlZCwgc3RhdHVzICVkXG4iICwKIAkJCWJ1ZiwgKGludCkgY291bnQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAogCXN0cmVhbS0+YnVmX3R5cGUgPSBTU1RfQlVGX1VTRVJfU1RBVElDOwpAQCAtNjE4LDcgKzYzOSw3IEBACiAJc3RyZWFtLT5jdXJfcHRyID0gTlVMTDsKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OiBlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTYzOSw3ICs2NjAsNyBAQAogCWludCBzdHJfaWQgPSBkYXRhLT5zdHJfaWQ7CiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAotCXByX2RlYnVnKCJzc3Q6IGNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9VTl9JTklUIHx8CiAJCXN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9ERUNPREUpIHsKIAkJcmV0dXJuIC1FQkFEUlFDOwpAQCAtNjY1LDEyICs2ODYsMTIgQEAKIAlpbnQgc3RyX2lkID0gZGF0YS0+c3RyX2lkOwogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCi0JcHJfZGVidWcoInNzdDogZW50cnkgLSAlbGRcbiIsIG5yX3NlZ3MpOworCXByX2RlYnVnKCJlbnRyeSAtICVsZFxuIiwgbnJfc2Vncyk7CiAKIAlpZiAoaXNfc3luY19raW9jYihraW9jYikgPT0gZmFsc2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjgzLDcgKzcwNCw3IEBACiAJfQogCXN0cmVhbS0+Y3Vycl9ieXRlcyA9IDA7CiAJc3RyZWFtLT5jdW1tX2J5dGVzID0gMDsKLQlwcl9kZWJ1Zygic3N0OiBuZXcgc2VncyAlbGQsIG9mZnNldCAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCiAJCQlucl9zZWdzLCAoaW50KSBvZmZzZXQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAlzdHJlYW0tPmJ1Zl90eXBlID0gU1NUX0JVRl9VU0VSX1NUQVRJQzsKIAlkbyB7CkBAIC02OTgsNyArNzE5LDcgQEAKIAlzdHJlYW0tPmN1cl9wdHIgPSBOVUxMOwogCWlmIChyZXR2YWwgPj0gMCkKIAkJcmV0dmFsID0gc3RyZWFtLT5jdW1tX2J5dGVzOwotCXByX2RlYnVnKCJzc3Q6IGVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNzE5LDcgKzc0MCw3IEBACiAJaW50IHN0cl9pZCA9IGRhdGEtPnN0cl9pZDsKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciAlZFxuIiwgc3RyX2lkKTsKIAlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQgfHwKIAkJCXN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9ERUNPREUpCiAJCXJldHVybiAtRUJBRFJRQzsKQEAgLTc0NCwxNCArNzY1LDE0IEBACiAJaW50IHN0cl9pZCA9IGRhdGEtPnN0cl9pZDsKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAotCXByX2RlYnVnKCJzc3Q6IGVudHJ5IC0gJWxkXG4iLCBucl9zZWdzKTsKKwlwcl9kZWJ1ZygiZW50cnkgLSAlbGRcbiIsIG5yX3NlZ3MpOwogCiAJaWYgKGlzX3N5bmNfa2lvY2Ioa2lvY2IpID09IGZhbHNlKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IGFpb19yZWFkIGZyb20gdXNlciBzcGFjZSBpcyBub3QgYWxsb3dlZFxuIik7CisJCXByX2RlYnVnKCJhaW9fcmVhZCBmcm9tIHVzZXIgc3BhY2UgaXMgbm90IGFsbG93ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiBjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NjQsNyArNzg1LDcgQEAKIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCXN0cmVhbS0+Y3VtbV9ieXRlcyA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBuZXcgc2VncyAlbGQsIG9mZnNldCAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCiAJCQlucl9zZWdzLCAoaW50KSBvZmZzZXQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAlzdHJlYW0tPmJ1Zl90eXBlID0gU1NUX0JVRl9VU0VSX1NUQVRJQzsKIAlkbyB7CkBAIC03NzksMzQgKzgwMCwxNjkgQEAKIAlzdHJlYW0tPmN1cl9wdHIgPSBOVUxMOwogCWlmIChyZXR2YWwgPj0gMCkKIAkJcmV0dmFsID0gc3RyZWFtLT5jdW1tX2J5dGVzOwotCXByX2RlYnVnKCJzc3Q6IGVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogc3N0X3ByaW50X3N0cmVhbV9wYXJhbXMgLSBwcmludHMgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzIChkZWJ1ZyBmbikqLwogc3RhdGljIHZvaWQgc3N0X3ByaW50X3N0cmVhbV9wYXJhbXMoc3RydWN0IHNuZF9zc3RfZ2V0X3N0cmVhbV9wYXJhbXMgKmdldF9wcm0pCiB7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOnJlc3VsdCA9JWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpyZXN1bHQgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMucmVzdWx0KTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6c3RyZWFtID0gJWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpzdHJlYW0gPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMuc3RyZWFtX2lkKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6Y29kZWMgPSAlZFxuIiwKKwlwcl9kZWJ1ZygiY29kZWMgcGFyYW1zOmNvZGVjID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLmNvZGVjKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6b3BzID0gJWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpvcHMgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMub3BzKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6c3RyZWFtX3R5cGU9ICVkXG4iLAorCXByX2RlYnVnKCJjb2RlYyBwYXJhbXM6c3RyZWFtX3R5cGUgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMuc3RyZWFtX3R5cGUpOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpzZnJlcT0gJWRcbiIsCisJcHJfZGVidWcoInBjbXBhcmFtczpzZnJlcSA9ICVkXG4iLAogCQkJCWdldF9wcm0tPnBjbV9wYXJhbXMuc2ZyZXEpOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpudW1fY2hhbj0gJWRcbiIsCisJcHJfZGVidWcoInBjbXBhcmFtczpudW1fY2hhbiA9ICVkXG4iLAogCQkJCWdldF9wcm0tPnBjbV9wYXJhbXMubnVtX2NoYW4pOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpwY21fd2Rfc3o9ICVkXG4iLAorCXByX2RlYnVnKCJwY21wYXJhbXM6cGNtX3dkX3N6ID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+cGNtX3BhcmFtcy5wY21fd2Rfc3opOwogCXJldHVybjsKIH0KIAogLyoqCi0gKiBpbnRlbF9zc3RfaW9jdGwgLSByZWNpZXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKKyAqIHNzdF9jcmVhdGVfYWxnb19pcGMgLSBjcmVhdGUgaXBjIG1zZyBmb3IgYWxnb3JpdGhtIHBhcmFtZXRlcnMKKyAqCisgKiBAYWxnb19wYXJhbXM6IEFsZ29yaXRobSBwYXJhbWV0ZXJzCisgKiBAbXNnOiBwb3N0IG1zZyBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY3JlYXRlIGlwYyBtc2cKKyAqLworaW50IHNzdF9jcmVhdGVfYWxnb19pcGMoc3RydWN0IHNuZF9wcHBfcGFyYW1zICphbGdvX3BhcmFtcywKKwkJCQkJc3RydWN0IGlwY19wb3N0ICoqbXNnKQoreworCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZyhtc2cpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzc3RfZmlsbF9oZWFkZXIoJigqbXNnKS0+aGVhZGVyLAorCQkJSVBDX0lBX0FMR19QQVJBTVMsIDEsIGFsZ29fcGFyYW1zLT5zdHJfaWQpOworCSgqbXNnKS0+aGVhZGVyLnBhcnQuZGF0YSA9IHNpemVvZih1MzIpICsKKwkJCXNpemVvZigqYWxnb19wYXJhbXMpICsgYWxnb19wYXJhbXMtPnNpemU7CisJbWVtY3B5KCgqbXNnKS0+bWFpbGJveF9kYXRhLCAmKCptc2cpLT5oZWFkZXIsIHNpemVvZih1MzIpKTsKKwltZW1jcHkoKCptc2cpLT5tYWlsYm94X2RhdGEgKyBzaXplb2YodTMyKSwKKwkJCQlhbGdvX3BhcmFtcywgc2l6ZW9mKCphbGdvX3BhcmFtcykpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzdF9zZW5kX2FsZ29faXBjIC0gc2VuZCBpcGMgbXNnIGZvciBhbGdvcml0aG0gcGFyYW1ldGVycworICoKKyAqIEBtc2c6IHBvc3QgbXNnIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGlwYyBtc2cKKyAqLworaW50IHNzdF9zZW5kX2FsZ29faXBjKHN0cnVjdCBpcGNfcG9zdCAqKm1zZykKK3sKKwlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuY29uZGl0aW9uID0gZmFsc2U7CisJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLnJldF9jb2RlID0gMDsKKwlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsub24gPSB0cnVlOworCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5kYXRhID0gTlVMTDsKKwlzcGluX2xvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmKCptc2cpLT5ub2RlLCAmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KTsKKwlzcGluX3VubG9jaygmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKKwlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKKwlyZXR1cm4gc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LAorCQkJJnNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2JsaywgU1NUX0JMT0NLX1RJTUVPVVQpOworfQorCisvKioKKyAqIGludGVsX3NzdF9pb2N0bF9kc3AgLSByZWNpZXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKKyAqCisgKiBAY21kOklvY3RsIGNtZAorICogQGFyZzpkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgc3BhY2UgY29tcG9uZW50CisgKiBzZW5kcyBhIERTUCBJb2N0bCB0byBTU1QgZHJpdmVyCisgKi8KK2xvbmcgaW50ZWxfc3N0X2lvY3RsX2RzcCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgYWxnb19wYXJhbXM7CisJc3RydWN0IHNuZF9wcHBfcGFyYW1zICphbGdvX3BhcmFtc19jb3BpZWQ7CisJc3RydWN0IGlwY19wb3N0ICptc2c7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU0VUX0FMR08pOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsZ29fcGFyYW1zLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQkJc2l6ZW9mKGFsZ29fcGFyYW1zKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGFsZ29fcGFyYW1zLnNpemUgPiBTU1RfTUFJTEJPWF9TSVpFKQorCQkJcmV0dXJuIC1FTVNHU0laRTsKKworCQlwcl9kZWJ1ZygiQWxnbyBJRCAlZCBTdHIgaWQgJWQgRW5hYmxlICVkIFNpemUgJWRcbiIsCisJCQlhbGdvX3BhcmFtcy5hbGdvX2lkLCBhbGdvX3BhcmFtcy5zdHJfaWQsCisJCQlhbGdvX3BhcmFtcy5lbmFibGUsIGFsZ29fcGFyYW1zLnNpemUpOworCQlyZXR2YWwgPSBzc3RfY3JlYXRlX2FsZ29faXBjKCZhbGdvX3BhcmFtcywgJm1zZyk7CisJCWlmIChyZXR2YWwpCisJCQlicmVhazsKKwkJYWxnb19wYXJhbXMucmVzZXJ2ZWQgPSAwOworCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLT5tYWlsYm94X2RhdGEgKyBzaXplb2YoYWxnb19wYXJhbXMpLAorCQkJCWFsZ29fcGFyYW1zLnBhcmFtcywgYWxnb19wYXJhbXMuc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR2YWwgPSBzc3Rfc2VuZF9hbGdvX2lwYygmbXNnKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcHJfZGVidWcoIkVycm9yIGluIHNzdF9zZXRfYWxnbyA9ICVkXG4iLCByZXR2YWwpOworCQkJcmV0dmFsID0gLUVJTzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfR0VUX0FMR08pOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsZ29fcGFyYW1zLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQkJc2l6ZW9mKGFsZ29fcGFyYW1zKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHJfZGVidWcoIkFsZ28gSUQgJWQgU3RyIGlkICVkIEVuYWJsZSAlZCBTaXplICVkXG4iLAorCQkJYWxnb19wYXJhbXMuYWxnb19pZCwgYWxnb19wYXJhbXMuc3RyX2lkLAorCQkJYWxnb19wYXJhbXMuZW5hYmxlLCBhbGdvX3BhcmFtcy5zaXplKTsKKwkJcmV0dmFsID0gc3N0X2NyZWF0ZV9hbGdvX2lwYygmYWxnb19wYXJhbXMsICZtc2cpOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJCWFsZ29fcGFyYW1zLnJlc2VydmVkID0gMTsKKwkJcmV0dmFsID0gc3N0X3NlbmRfYWxnb19pcGMoJm1zZyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXByX2RlYnVnKCJFcnJvciBpbiBzc3RfZ2V0X2FsZ28gPSAlZFxuIiwgcmV0dmFsKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlhbGdvX3BhcmFtc19jb3BpZWQgPSAoc3RydWN0IHNuZF9wcHBfcGFyYW1zICopCisJCQkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5kYXRhOworCQlpZiAoYWxnb19wYXJhbXNfY29waWVkLT5zaXplID4gYWxnb19wYXJhbXMuc2l6ZSkgeworCQkJcHJfZGVidWcoIm1lbSBpbnN1ZmZpY2llbnQgdG8gY29weVxuIik7CisJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9IGVsc2UgeworCQkJY2hhciBfX3VzZXIgKnRtcDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhbGdvX3BhcmFtcy5wYXJhbXMsCisJCQkJCWFsZ29fcGFyYW1zX2NvcGllZC0+cGFyYW1zLAorCQkJCQlhbGdvX3BhcmFtc19jb3BpZWQtPnNpemUpKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlnb3RvIGZyZWVfbWVtOworCQkJfQorCQkJdG1wID0gKGNoYXIgX191c2VyICopYXJnICsgb2Zmc2V0b2YoCisJCQkJCXN0cnVjdCBzbmRfcHBwX3BhcmFtcywgc2l6ZSk7CisJCQlpZiAoY29weV90b191c2VyKHRtcCwgJmFsZ29fcGFyYW1zX2NvcGllZC0+c2l6ZSwKKwkJCQkJCSBzaXplb2YoX191MzIpKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJZ290byBmcmVlX21lbTsKKwkJCX0KKworCQl9CitmcmVlX21lbToKKwkJa2ZyZWUoYWxnb19wYXJhbXNfY29waWVkLT5wYXJhbXMpOworCQlrZnJlZShhbGdvX3BhcmFtc19jb3BpZWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpbnRlbF9zc3RfaW9jdGwgLSByZWNlaXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKICAqIEBmaWxlX3B0cjpwb2ludGVyIHRvIGZpbGUKICAqIEBjbWQ6SW9jdGwgY21kCiAgKiBAYXJnOmRhdGEKQEAgLTgzMiw3ICs5ODgsNyBAQAogCiAJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9QQVVTRSk6Ci0JCXByX2RlYnVnKCJzc3Q6IElPQ1RMX1BBVVNFIHJlY2lldmVkIGZvciAlZCFcbiIsIHN0cl9pZCk7CisJCXByX2RlYnVnKCJJT0NUTF9QQVVTRSByZWNlaXZlZCBmb3IgJWQhXG4iLCBzdHJfaWQpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVCQURSUUM7CiAJCQlicmVhazsKQEAgLTg0MSw3ICs5OTcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX1JFU1VNRSk6Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9JT0NUTF9SRVNVTUUgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9JT0NUTF9SRVNVTUUgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC04NTIsNyArMTAwOCw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fU0VUX1BBUkFNUyk6IHsKIAkJc3RydWN0IHNuZF9zc3RfcGFyYW1zIHN0cl9wYXJhbTsKIAotCQlwcl9kZWJ1Zygic3N0OiBJT0NUTF9TRVRfUEFSQU1TIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJJT0NUTF9TRVRfUEFSQU1TIHJlY2VpdmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtODg0LDcgKzEwNDAsNyBAQAogCQkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogU0VUX1NUUkVBTV9QQVJBTVMgcmVjaWV2ZWQhXG4iKTsKKwkJCXByX2RlYnVnKCJTRVRfU1RSRUFNX1BBUkFNUyByZWNlaXZlZCFcbiIpOwogCQkJLyogYWxsb2NhdGVkIHNldCBwYXJhbXMgb25seSAqLwogCQkJcmV0dmFsID0gc3N0X3NldF9zdHJlYW1fcGFyYW0oc3RyX2lkLCAmc3RyX3BhcmFtKTsKIAkJCS8qIEJsb2NrIHRoZSBjYWxsIGZvciByZXBseSAqLwpAQCAtOTA3LDE0ICsxMDYzLDE0IEBACiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXRfdm9sLCAodm9pZCBfX3VzZXIgKilhcmcsCiAJCQkJc2l6ZW9mKHNldF92b2wpKSkgewotCQkJcHJfZGVidWcoInNzdDogY29weSBmYWlsZWRcbiIpOworCQkJcHJfZGVidWcoImNvcHkgZmFpbGVkXG4iKTsKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBTRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCisJCXByX2RlYnVnKCJTRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCiAJCQkJc2V0X3ZvbC5zdHJlYW1faWQpOwogCQlpZiAobWlub3IgPT0gU1RSRUFNX01PRFVMRSAmJiBzZXRfdm9sLnN0cmVhbV9pZCA9PSAwKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBpbnZhbGlkIG9wZXJhdGlvbiFcbiIpOworCQkJcHJfZGVidWcoImludmFsaWQgb3BlcmF0aW9uIVxuIik7CiAJCQlyZXR2YWwgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQpAQCAtOTI5LDEwICsxMDg1LDEwIEBACiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZGVidWcoInNzdDogSU9DVExfR0VUX1ZPTFVNRSByZWNpZXZlZCBmb3Igc3RyZWFtID0gJWQhXG4iLAorCQlwcl9kZWJ1ZygiSU9DVExfR0VUX1ZPTFVNRSByZWNpZXZlZCBmb3Igc3RyZWFtID0gJWQhXG4iLAogCQkJCWdldF92b2wuc3RyZWFtX2lkKTsKIAkJaWYgKG1pbm9yID09IFNUUkVBTV9NT0RVTEUgJiYgZ2V0X3ZvbC5zdHJlYW1faWQgPT0gMCkgewotCQkJcHJfZGVidWcoInNzdDogaW52YWxpZCBvcGVyYXRpb24hXG4iKTsKKwkJCXByX2RlYnVnKCJpbnZhbGlkIG9wZXJhdGlvbiFcbiIpOwogCQkJcmV0dmFsID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTk0MSw3ICsxMDk3LDcgQEAKIAkJCXJldHZhbCA9IC1FSU87CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBpZDolZFxuLCB2b2w6JWQsIHJhbXBfZHVyOiVkLCByYW1wX3R5cGU6JWRcbiIsCisJCXByX2RlYnVnKCJpZDolZFxuLCB2b2w6JWQsIHJhbXBfZHVyOiVkLCByYW1wX3R5cGU6JWRcbiIsCiAJCQkJZ2V0X3ZvbC5zdHJlYW1faWQsIGdldF92b2wudm9sdW1lLAogCQkJCWdldF92b2wucmFtcF9kdXJhdGlvbiwgZ2V0X3ZvbC5yYW1wX3R5cGUpOwogCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3Qgc25kX3NzdF92b2wgX191c2VyICopYXJnLApAQCAtOTYxLDcgKzExMTcsNyBAQAogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9TRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCisJCXByX2RlYnVnKCJTTkRSVl9TU1RfU0VUX1ZPTFVNRSByZWNpZXZlZCBmb3IgJWQhXG4iLAogCQkJc2V0X211dGUuc3RyZWFtX2lkKTsKIAkJaWYgKG1pbm9yID09IFNUUkVBTV9NT0RVTEUgJiYgc2V0X211dGUuc3RyZWFtX2lkID09IDApIHsKIAkJCXJldHZhbCA9IC1FUEVSTTsKQEAgLTk3Myw3ICsxMTI5LDcgQEAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9HRVRfUEFSQU1TKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9nZXRfc3RyZWFtX3BhcmFtcyBnZXRfcGFyYW1zOwogCi0JCXByX2RlYnVnKCJzc3Q6IElPQ1RMX0dFVF9QQVJBTVMgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIklPQ1RMX0dFVF9QQVJBTVMgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IDApIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC05OTcsNyArMTE1Myw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9NTUFQX0NBUFRVUkUpOiB7CiAJCXN0cnVjdCBzbmRfc3N0X21tYXBfYnVmZnMgbW1hcF9idWY7CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX01NQVBfUExBWS9DQVBUVVJFIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfTU1BUF9QTEFZL0NBUFRVUkUgcmVjaWV2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC0xMDExLDcgKzExNjcsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fRFJPUCk6Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9JT0NUTF9EUk9QIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfSU9DVExfRFJPUCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTAyMyw3ICsxMTc5LDcgQEAKIAkJc3RydWN0IHNuZF9zc3RfdHN0YW1wIHRzdGFtcCA9IHswfTsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHRpbWUsIGZyZXEsIG1vZDsKIAotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfU1RSRUFNX0dFVF9UU1RBTVAgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fR0VUX1RTVEFNUCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVCQURSUUM7CiAJCQlicmVhazsKQEAgLTEwNDQsNyArMTIwMCw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fU1RBUlQpOnsKIAkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9TVEFSVCByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX1NUUkVBTV9TVEFSVCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTA4Myw3ICsxMjM5LDcgQEAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NFVF9UQVJHRVRfREVWSUNFKTogewogCQlzdHJ1Y3Qgc25kX3NzdF90YXJnZXRfZGV2aWNlIHRhcmdldF9kZXZpY2U7CiAKLQkJcHJfZGVidWcoInNzdDogU0VUX1RBUkdFVF9ERVZJQ0UgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNFVF9UQVJHRVRfREVWSUNFIHJlY2lldmVkIVxuIik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdGFyZ2V0X2RldmljZSwgKHZvaWQgX191c2VyICopYXJnLAogCQkJCXNpemVvZih0YXJnZXRfZGV2aWNlKSkpIHsKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CkBAIC0xMTAwLDcgKzEyNTYsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfRFJJVkVSX0lORk8pOiB7CiAJCXN0cnVjdCBzbmRfc3N0X2RyaXZlcl9pbmZvIGluZm87CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX0RSSVZFUl9JTkZPIHJlY2l2ZWRcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX0RSSVZFUl9JTkZPIHJlY2l2ZWRcbiIpOwogCQlpbmZvLnZlcnNpb24gPSBTU1RfVkVSU0lPTl9OVU07CiAJCS8qIGhhcmQgY29kaW5nLCBzaHVkIGdldCBzdW1ob3cgbGF0ZXIgKi8KIAkJaW5mby5hY3RpdmVfcGNtX3N0cmVhbXMgPSBzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCAtCkBAIC0xMTIyLDcgKzEyNzgsNyBAQAogCQlzdHJ1Y3Qgc25kX3NzdF9idWZmX2VudHJ5ICppYnVmX3RtcCwgKm9idWZfdG1wOwogCQljaGFyIF9fdXNlciAqZGVzdDsKIAotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfU1RSRUFNX0RFQ09ERSByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fREVDT0RFIHJlY2VpdmVkXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC0xMTk3LDcgKzEzNTMsNyBAQAogCX0KIAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX0RSQUlOKToKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9EUkFJTiByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fRFJBSU4gcmVjZWl2ZWRcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTIwOSw3ICsxMzY1LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBsb25nIF9fdXNlciAqYnl0ZXMgPSAodW5zaWduZWQgbG9uZyBsb25nIF9fdXNlciAqKWFyZzsKIAkJc3RydWN0IHNuZF9zc3RfdHN0YW1wIHRzdGFtcCA9IHswfTsKIAotCQlwcl9kZWJ1Zygic3N0OiBTVFJFQU1fQllURVNfREVDT0RFRCByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU1RSRUFNX0JZVEVTX0RFQ09ERUQgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTEyMjUsNyArMTM4MSw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9GV19JTkZPKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9md19pbmZvICpmd19pbmZvOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9GV19JTkZPIHJlY2l2ZWRcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX0ZXX0lORk8gcmVjZWl2ZWRcbiIpOwogCiAJCWZ3X2luZm8gPSBremFsbG9jKHNpemVvZigqZndfaW5mbyksIEdGUF9BVE9NSUMpOwogCQlpZiAoIWZ3X2luZm8pIHsKQEAgLTEyNDgsMTAgKzE0MDQsMTggQEAKIAkJa2ZyZWUoZndfaW5mbyk7CiAJCWJyZWFrOwogCX0KKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX0dFVF9BTEdPKToKKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NFVF9BTEdPKToKKwkJaWYgKG1pbm9yICE9IEFNX01PRFVMRSkgeworCQkJcmV0dmFsID0gLUVCQURSUUM7CisJCQlicmVhazsKKwkJfQorCQlyZXR2YWwgPSBpbnRlbF9zc3RfaW9jdGxfZHNwKGNtZCwgYXJnKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAl9Ci0JcHJfZGVidWcoInNzdDogaW50ZWxfc3N0X2lvY3RsOmNvbXBsZXRlIHJldCBjb2RlID0gJWRcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImludGVsX3NzdF9pb2N0bDpjb21wbGV0ZSByZXQgY29kZSA9ICVkXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKaW5kZXggYmYwZWFkNy4uMGE2MGU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKQEAgLTI4LDE1ICsyOCwxNSBAQAogICogIENvbW1vbiBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgU1NUCiAgKi8KIAotI2RlZmluZSBTU1RfRFJJVkVSX1ZFUlNJT04gIjEuMi4wNSIKLSNkZWZpbmUgU1NUX1ZFUlNJT05fTlVNIDB4MTIwNQorI2RlZmluZSBTU1RfRFJJVkVSX1ZFUlNJT04gIjEuMi4wOSIKKyNkZWZpbmUgU1NUX1ZFUlNJT05fTlVNIDB4MTIwOQogCiAvKiBkcml2ZXIgbmFtZXMgKi8KICNkZWZpbmUgU1NUX0RSVl9OQU1FICJpbnRlbF9zc3RfZHJpdmVyIgotI2RlZmluZSBTU1RfRldfRklMRU5BTUVfTVJTVCAiZndfc3N0XzA4MGEuYmluIgotI2RlZmluZSBTU1RfRldfRklMRU5BTUVfTUZMRCAiZndfc3N0XzA4MmYuYmluIgogI2RlZmluZSBTU1RfTVJTVF9QQ0lfSUQgMHgwODBBCiAjZGVmaW5lIFNTVF9NRkxEX1BDSV9JRCAweDA4MkYKKyNkZWZpbmUgUENJX0lEX0xFTkdUSCA0CisjZGVmaW5lIFNTVF9TVVNQRU5EX0RFTEFZIDIwMDAKIAogZW51bSBzc3Rfc3RhdGVzIHsKIAlTU1RfRldfTE9BREVEID0gMSwKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJc3RydWN0IHN0cmVhbV9pbmZvCXN0cmVhbXNbTUFYX05VTV9TVFJFQU1TXTsKIAlzdHJ1Y3Qgc3RyZWFtX2FsbG9jX2Jsb2NrIGFsbG9jX2Jsb2NrW01BWF9BQ1RJVkVfU1RSRUFNXTsKLQlzdHJ1Y3Qgc3N0X2Jsb2NrCXRndF9kZXZfYmxrLCBmd19pbmZvX2JsaywKKwlzdHJ1Y3Qgc3N0X2Jsb2NrCXRndF9kZXZfYmxrLCBmd19pbmZvX2JsaywgcHBwX3BhcmFtc19ibGssCiAJCQkJdm9sX2luZm9fYmxrLCBtdXRlX2luZm9fYmxrLCBoc19pbmZvX2JsazsKIAlzdHJ1Y3QgbXV0ZXgJCWxpc3RfbG9jazsvKiBtdXRleCBmb3IgSVBDIGxpc3QgbG9ja2luZyAqLwogCXNwaW5sb2NrX3QJbGlzdF9zcGluX2xvY2s7IC8qIG11dGV4IGZvciBJUEMgbGlzdCBsb2NraW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMKaW5kZXggNjY5ZTI5OC4uZWE4ZTI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Rydl9pbnRlcmZhY2UuYwpAQCAtMjYsMTAgKzI2LDEzIEBACiAgKiAgVXBwZXIgbGF5ZXIgaW50ZXJmYWNlcyAoTUFEIGRyaXZlciwgTU1GKSB0byBTU1QgZHJpdmVyCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9md19pcGMuaCIKQEAgLTQ1LDE3ICs0OCwxOCBAQAogewogCWludCByZXR2YWw7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19zc3Q7Ci0JY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIG5hbWVbMjBdOworCiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX1VOX0lOSVQpCiAJCXJldHVybiAtRVBFUk07Ci0JaWYgKHNzdF9kcnZfY3R4LT5wY2lfaWQgPT0gU1NUX01SU1RfUENJX0lEKQotCQluYW1lID0gU1NUX0ZXX0ZJTEVOQU1FX01SU1Q7Ci0JZWxzZQotCQluYW1lID0gU1NUX0ZXX0ZJTEVOQU1FX01GTEQ7Ci0JcHJfZGVidWcoInNzdDogRG93bmxvYWRpbmcgJXMgRlcgbm93Li4uXG4iLCBuYW1lKTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJTA0eCVzIiwgImZ3X3NzdF8iLAorCQkJCQlzc3RfZHJ2X2N0eC0+cGNpX2lkLCAiLmJpbiIpOworCisJcHJfZGVidWcoIkRvd25sb2FkaW5nICVzIEZXIG5vdy4uLlxuIiwgbmFtZSk7CiAJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZndfc3N0LCBuYW1lLCAmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic3N0OiByZXF1ZXN0IGZ3IGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKKwkJcHJfZXJyKCJyZXF1ZXN0IGZ3IGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrWzBdLnNzdF9pZCA9IEZXX0RXTkxfSUQ7CkBAIC02Niw3ICs3MCw3IEBACiAKIAlyZXR2YWwgPSBzc3Rfd2FpdF90aW1lb3V0KHNzdF9kcnZfY3R4LCAmc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrWzBdKTsKIAlpZiAocmV0dmFsKQotCQlwcl9lcnIoInNzdDogZncgZG93bmxvYWQgZmFpbGVkICVkXG4iICwgcmV0dmFsKTsKKwkJcHJfZXJyKCJmdyBkb3dubG9hZCBmYWlsZWQgJWRcbiIgLCByZXR2YWwpOwogZW5kX3Jlc3RvcmU6CiAJcmVsZWFzZV9maXJtd2FyZShmd19zc3QpOwogCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1swXS5zc3RfaWQgPSBCTE9DS19VTklOSVQ7CkBAIC05MCw3ICs5NCw3IEBACiAKIAkJcmV0cnktLTsKIAl9Ci0JcHJfZGVidWcoInNzdDogaW4gU3RhbGxlZCBTdGF0ZVxuIik7CisJcHJfZGVidWcoImluIFN0YWxsZWQgU3RhdGVcbiIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEzOCwyMyArMTQyLDIzIEBACiAJcmV0dmFsID0gc3N0X2FsbG9jX3N0cmVhbSgoY2hhciAqKSAmc3RyX3BhcmFtLT5zcGFyYW1zLCBzdHJfcGFyYW0tPm9wcywKIAkJCQlzdHJfcGFyYW0tPmNvZGVjLCBzdHJfcGFyYW0tPmRldmljZV90eXBlKTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQlwcl9lcnIoInNzdDogc3N0X2FsbG9jX3N0cmVhbSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CisJCXByX2Vycigic3N0X2FsbG9jX3N0cmVhbSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSBhbGxvY2F0ZWQgJWRcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoIlN0cmVhbSBhbGxvY2F0ZWQgJWRcbiIsIHJldHZhbCk7CiAJc3RyX2lkID0gcmV0dmFsOwogCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJLyogQmxvY2sgdGhlIGNhbGwgZm9yIHJlcGx5ICovCiAJcmV0dmFsID0gc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LAogCQkJJnN0cl9pbmZvLT5jdHJsX2JsaywgU1NUX0JMT0NLX1RJTUVPVVQpOwogCWlmICgocmV0dmFsICE9IDApIHx8IChzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgIT0gMCkpIHsKLQkJcHJfZGVidWcoInNzdDogRlcgYWxsb2MgZmFpbGVkIHJldHZhbCAlZCwgcmV0X2NvZGUgJWRcbiIsCisJCXByX2RlYnVnKCJGVyBhbGxvYyBmYWlsZWQgcmV0dmFsICVkLCByZXRfY29kZSAlZFxuIiwKIAkJCQlyZXR2YWwsIHN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSk7CiAJCXN0cl9pZCA9IC1zdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGU7IC8qcmV0dXJuIGVycm9yKi8KIAkJKmxpYl9kbmxkID0gc3RyX2luZm8tPmN0cmxfYmxrLmRhdGE7CiAJCXNzdF9jbGVhbl9zdHJlYW0oc3RyX2luZm8pOwogCX0gZWxzZQotCQlwcl9kZWJ1Zygic3N0OiBGVyBTdHJlYW0gYWxsb2NhdGVkIHN1Y2Vzc1xuIik7CisJCXByX2RlYnVnKCJGVyBTdHJlYW0gYWxsb2NhdGVkIHN1Y2Nlc3NcbiIpOwogCXJldHVybiBzdHJfaWQ7IC8qd2lsbCByZXQgZWl0aGVyIGVycm9yIChpbiBhYm92ZSBpZikgb3IgY29ycmVjdCBzdHIgaWQqLwogfQogCkBAIC0xNzEsOSArMTc1LDkgQEAKIAljYXNlIFNTVF9DT0RFQ19UWVBFX01QMzoKIAkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5tcDNfcGFyYW1zLnNmcmVxOwogCWNhc2UgU1NUX0NPREVDX1RZUEVfQUFDOgotCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMuc2ZyZXE7OworCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMuc2ZyZXE7CiAJY2FzZSBTU1RfQ09ERUNfVFlQRV9XTUE5OgotCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLndtYV9wYXJhbXMuc2ZyZXE7OworCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLndtYV9wYXJhbXMuc2ZyZXE7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTk2LDE0ICsyMDAsMTQgQEAKIAkJLyogY29kZWMgZG93bmxvYWQgaXMgcmVxdWlyZWQgKi8KIAkJc3RydWN0IHNuZF9zc3RfYWxsb2NfcmVzcG9uc2UgKnJlc3BvbnNlOwogCi0JCXByX2RlYnVnKCJzc3Q6IENvZGVjIGlzIHJlcXVpcmVkLi4uLiB0cnlpbmcgdGhhdFxuIik7CisJCXByX2RlYnVnKCJDb2RlYyBpcyByZXF1aXJlZC4uLi4gdHJ5aW5nIHRoYXRcbiIpOwogCQlpZiAobGliX2RubGQgPT0gTlVMTCkgewotCQkJcHJfZXJyKCJzc3Q6IGxpYiBkb3dubG9hZCBudWxsISEhIGFib3J0XG4iKTsKKwkJCXByX2VycigibGliIGRvd25sb2FkIG51bGwhISEgYWJvcnRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJaSA9IHNzdF9nZXRfYmxvY2tfc3RyZWFtKHNzdF9kcnZfY3R4KTsKIAkJcmVzcG9uc2UgPSBzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0ub3BzX2Jsb2NrLmRhdGE7Ci0JCXByX2RlYnVnKCJzc3Q6IGFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkXG4iLCBpKTsKKwkJcHJfZGVidWcoImFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkXG4iLCBpKTsKIAkJaWYgKGkgPCAwKSB7CiAJCQlrZnJlZShsaWJfZG5sZCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxMywxNSArMjE3LDE1IEBACiAKIAkJc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrW2ldLnNzdF9pZCA9IEJMT0NLX1VOSU5JVDsKIAkJaWYgKCFyZXR2YWwpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvZGVjIHdhcyBkb3dubG9hZGVkIHN1Y2VzZnVsbHlcbiIpOworCQkJcHJfZGVidWcoImNvZGVjIHdhcyBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseVxuIik7CiAKIAkJCXJldHZhbCA9IHNzdF9nZXRfc3RyZWFtX2FsbG9jYXRlZChzdHJfcGFyYW0sICZsaWJfZG5sZCk7CiAJCQlpZiAocmV0dmFsIDw9IDApCiAJCQkJZ290byBlcnI7CiAKLQkJCXByX2RlYnVnKCJzc3Q6IEFsbG9jIGRvbmUgc3RyZWFtIGlkICVkXG4iLCByZXR2YWwpOworCQkJcHJfZGVidWcoIkFsbG9jIGRvbmUgc3RyZWFtIGlkICVkXG4iLCByZXR2YWwpOwogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogY29kZWMgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJCXByX2RlYnVnKCJjb2RlYyBkb3dubG9hZCBmYWlsZWRcbiIpOwogCQkJcmV0dmFsID0gLUVJTzsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0yNzksOTcgKzI4MywxMzggQEAKIAkJcmV0dmFsID0gc3N0X3N0YXJ0X3N0cmVhbShtYWRfb3BzLT5zdHJlYW1faWQpOwogCQlicmVhazsKIAljYXNlIFNTVF9TTkRfU1RSRUFNX1BST0NFU1M6Ci0JCXByX2RlYnVnKCJzc3Q6IHBsYXkvY2FwdCBmcmFtZXMuLi5cbiIpOworCQlwcl9kZWJ1ZygicGxheS9jYXB0IGZyYW1lcy4uLlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiAgd3JvbmcgY29udHJvbF9vcHMgcmVwb3J0ZWRcbiIpOworCQlwcl9lcnIoIiB3cm9uZyBjb250cm9sX29wcyByZXBvcnRlZFxuIik7CiAJfQogCXJldHVybjsKIH0KLS8qCi0gKiBzc3RfY29udHJvbF9zZXQgLSBTZXQgQ29udHJvbCBwYXJhbXMKLSAqCi0gKiBAY29udHJvbF9saXN0OiBsaXN0IG9mIGNvbnRyb2xzIHRvIGJlIHNldAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBzZXQKLSAqIFNTVC9Tb3VuZCBjYXJkIGNvbnRyb2xzLiBUaGlzIGlzIHJlZ2lzdGVyZWQgd2l0aCBNSUQgZHJpdmVyCi0gKi8KLWludCBzc3RfY29udHJvbF9zZXQoaW50IGNvbnRyb2xfZWxlbWVudCwgdm9pZCAqdmFsdWUpCisKK3ZvaWQgc2VuZF9pbnRpYWxfcnhfdGltZXNsb3Qodm9pZCkKIHsKLQlpbnQgcmV0dmFsID0gMCwgc3RyX2lkID0gMDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQgJiYKKwkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzICE9IFJYX1RJTUVTTE9UX1VOSU5JVAorCQkJJiYgc3N0X2Rydl9jdHgtPnBtaWNfdmVuZG9yICE9IFNORF9OQykKKwkJc3N0X2VuYWJsZV9yeF90aW1lc2xvdChzc3RfZHJ2X2N0eC0+cnhfdGltZV9zbG90X3N0YXR1cyk7Cit9CisKKy8qCisgKiBzc3Rfb3Blbl9wY21fc3RyZWFtIC0gT3BlbiBQQ00gaW50ZXJmYWNlCisgKgorICogQHN0cl9wYXJhbTogcGFyYW1ldGVycyBvZiBwY20gc3RyZWFtCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIG9wZW4KKyAqIGEgbmV3IHBjbSBpbnRlcmZhY2UKKyAqLworaW50IHNzdF9vcGVuX3BjbV9zdHJlYW0oc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlpbnQgcmV0dmFsOworCisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9TVVNQRU5ERUQpIHsKLQkJLypMUEUgaXMgc3VzcGVuZGVkLCByZXN1bWUgaXQgYmVmb3JlIHByb2NlZGluZyovCi0JCXByX2RlYnVnKCJzc3Q6IFJlc3VtaW5nIGZyb20gU3VzcGVuZGVkIHN0YXRlXG4iKTsKKwkJLyogTFBFIGlzIHN1c3BlbmRlZCwgcmVzdW1lIGl0IGJlZm9yZSBwcm9jZWRpbmcqLworCQlwcl9kZWJ1ZygiUmVzdW1pbmcgZnJvbSBTdXNwZW5kZWQgc3RhdGVcbiIpOwogCQlyZXR2YWwgPSBpbnRlbF9zc3RfcmVzdW1lKHNzdF9kcnZfY3R4LT5wY2kpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogUmVzdW1lIEZhaWxlZCA9ICUjeCwgYWJvcnRcbiIsIHJldHZhbCk7CisJCQlwcl9lcnIoIlJlc3VtZSBGYWlsZWQgPSAlI3gsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9VTl9JTklUKSB7CiAJCS8qIEZXIGlzIG5vdCBkb3dubG9hZGVkICovCi0JCXByX2RlYnVnKCJzc3Q6IERTUCBEb3dubG9hZGluZyBGVyBub3cuLi5cbiIpOworCQlwcl9kZWJ1ZygiRFNQIERvd25sb2FkaW5nIEZXIG5vdy4uLlxuIik7CiAJCXJldHZhbCA9IHNzdF9kb3dubG9hZF9mdygpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogRlcgZG93bmxvYWQgZmFpbCAleCwgYWJvcnRcbiIsIHJldHZhbCk7CisJCQlwcl9lcnIoIkZXIGRvd25sb2FkIGZhaWwgJXgsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9Ci0JCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCAmJgotCQkJc3N0X2Rydl9jdHgtPnJ4X3RpbWVfc2xvdF9zdGF0dXMgIT0gUlhfVElNRVNMT1RfVU5JTklUCi0JCQkJJiYgc3N0X2Rydl9jdHgtPnBtaWNfdmVuZG9yICE9IFNORF9OQykKLQkJCXNzdF9lbmFibGVfcnhfdGltZXNsb3QoCi0JCQkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzKTsKKwkJc2VuZF9pbnRpYWxfcnhfdGltZXNsb3QoKTsKIAl9CiAKLQlzd2l0Y2ggKGNvbnRyb2xfZWxlbWVudCkgewotCWNhc2UgU1NUX1NORF9BTExPQzogewotCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbTsKLQkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlpZiAoIXN0cl9wYXJhbSkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JCXN0cl9wYXJhbSA9IChzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKil2YWx1ZTsKLQkJQlVHX09OKCFzdHJfcGFyYW0pOwotCQlyZXR2YWwgPSBzc3RfZ2V0X3N0cmVhbShzdHJfcGFyYW0pOwotCQlpZiAocmV0dmFsID49IDApCi0JCQlzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCsrOworCXJldHZhbCA9IHNzdF9nZXRfc3RyZWFtKHN0cl9wYXJhbSk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQrKzsKIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbcmV0dmFsXTsKIAkJc3RyX2luZm8tPnNyYyA9IE1BRF9EUlY7Ci0JCWJyZWFrOwotCX0KKwl9IGVsc2UKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc3N0X2Nsb3NlX3BjbV9zdHJlYW0gLSBDbG9zZSBQQ00gaW50ZXJmYWNlCisgKgorICogQHN0cl9pZDogc3RyZWFtIGlkIHRvIGJlIGNsb3NlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBjbG9zZQorICogYW4gZXhpc3RpbmcgcGNtIGludGVyZmFjZQorICovCitpbnQgc3N0X2Nsb3NlX3BjbV9zdHJlYW0odW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKworCXByX2RlYnVnKCJzc3Q6IHN0cmVhbSBmcmVlIGNhbGxlZFxuIik7CisJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwlmcmVlX3N0cmVhbV9jb250ZXh0KHN0cl9pZCk7CisJc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gTlVMTDsKKwlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOworCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQgPSBOVUxMOworCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07CisJcHJfZGVidWcoInNzdDogd2lsbCBjYWxsIHJ1bnRpbWUgcHV0IG5vd1xuIik7CisJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzc3RfZGV2aWNlX2NvbnRyb2wgLSBTZXQgQ29udHJvbCBwYXJhbXMKKyAqCisgKiBAY21kOiBjb250cm9sIGNtZCB0byBiZSBzZXQKKyAqIEBhcmc6IGNvbW1hbmQgYXJndW1lbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gc2V0CisgKiBTU1QvU291bmQgY2FyZCBjb250cm9scyBmb3IgYW4gb3BlbmVkIHN0cmVhbS4KKyAqIFRoaXMgaXMgcmVnaXN0ZXJlZCB3aXRoIE1JRCBkcml2ZXIKKyAqLworaW50IHNzdF9kZXZpY2VfY29udHJvbChpbnQgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldHZhbCA9IDAsIHN0cl9pZCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU1NUX1NORF9QQVVTRToKIAljYXNlIFNTVF9TTkRfUkVTVU1FOgogCWNhc2UgU1NUX1NORF9EUk9QOgogCWNhc2UgU1NUX1NORF9TVEFSVDoKLQkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuY29udHJvbF9vcCA9IGNvbnRyb2xfZWxlbWVudDsKLQkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuc3RyZWFtX2lkID0gKihpbnQgKil2YWx1ZTsKKwkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuY29udHJvbF9vcCA9IGNtZDsKKwkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuc3RyZWFtX2lkID0gKihpbnQgKilhcmc7CiAJCXF1ZXVlX3dvcmsoc3N0X2Rydl9jdHgtPm1hZF93cSwgJnNzdF9kcnZfY3R4LT5tYWRfb3BzLndxKTsKIAkJYnJlYWs7CiAKLQljYXNlIFNTVF9TTkRfRlJFRToKLQkJc3RyX2lkID0gKihpbnQgKil2YWx1ZTsKLQkJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07Ci0JCWZyZWVfc3RyZWFtX2NvbnRleHQoc3RyX2lkKTsKLQkJc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gTlVMTDsKLQkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKLQkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCA9IE5VTEw7Ci0JCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07Ci0JCWJyZWFrOwotCiAJY2FzZSBTU1RfU05EX1NUUkVBTV9JTklUOiB7CiAJCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cl9pbmZvOwogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAotCQlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gaW5pdCBjYWxsZWRcbiIpOwotCQlzdHJfaW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopdmFsdWU7CisJCXByX2RlYnVnKCJzdHJlYW0gaW5pdCBjYWxsZWRcbiIpOworCQlzdHJfaW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopYXJnOwogCQlzdHJfaWQgPSBzdHJfaW5mby0+c3RyX2lkOwogCQlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAkJaWYgKHJldHZhbCkKIAkJCWJyZWFrOwogCiAJCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwotCQlwcl9kZWJ1Zygic3N0OiBzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7CisJCXByX2RlYnVnKCJzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7CiAJCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSA9IHN0cl9pbmZvLT5tYWRfc3Vic3RyZWFtOwogCQlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gc3RyX2luZm8tPnBlcmlvZF9lbGFwc2VkOwogCQlzdHJlYW0tPnNmcmVxID0gc3RyX2luZm8tPnNmcmVxOwpAQCAtMzg0LDcgKzQyOSw3IEBACiAJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCiAKLQkJc3RyZWFtX2luZm8gPSAoc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqKXZhbHVlOworCQlzdHJlYW1faW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopYXJnOwogCQlzdHJfaWQgPSBzdHJlYW1faW5mby0+c3RyX2lkOwogCQlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAkJaWYgKHJldHZhbCkKQEAgLTM5OCwyNiArNDQzLDI2IEBACiAJCQkrKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKSksCiAJCQlzaXplb2YoZndfdHN0YW1wKSk7CiAKLQkJcHJfZGVidWcoInNzdDogUG9pbnRlciBRdWVyeSBvbiBzdHJpZCA9ICVkIG9wcyAlZFxuIiwKKwkJcHJfZGVidWcoIlBvaW50ZXIgUXVlcnkgb24gc3RyaWQgPSAlZCBvcHMgJWRcbiIsCiAJCQkJCQlzdHJfaWQsIHN0cmVhbS0+b3BzKTsKIAogCQlpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDSykKIAkJCXN0cmVhbV9pbmZvLT5idWZmZXJfcHRyID0gZndfdHN0YW1wLnNhbXBsZXNfcmVuZGVyZWQ7CiAJCWVsc2UKIAkJCXN0cmVhbV9pbmZvLT5idWZmZXJfcHRyID0gZndfdHN0YW1wLnNhbXBsZXNfcHJvY2Vzc2VkOwotCQlwcl9kZWJ1Zygic3N0OiBTYW1wbGVzIHJlbmRlcmVkID0gJWxsdSwgYnVmZmVyIHB0ciAlbGx1XG4iLAorCQlwcl9kZWJ1ZygiU2FtcGxlcyByZW5kZXJlZCA9ICVsbHUsIGJ1ZmZlciBwdHIgJWxsdVxuIiwKIAkJCWZ3X3RzdGFtcC5zYW1wbGVzX3JlbmRlcmVkLCBzdHJlYW1faW5mby0+YnVmZmVyX3B0cik7CiAJCWJyZWFrOwogCX0KIAljYXNlIFNTVF9FTkFCTEVfUlhfVElNRV9TTE9UOiB7Ci0JCWludCBzdGF0dXMgPSAqKGludCAqKXZhbHVlOworCQlpbnQgc3RhdHVzID0gKihpbnQgKilhcmc7CiAJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzID0gc3RhdHVzIDsKIAkJc3N0X2VuYWJsZV9yeF90aW1lc2xvdChzdGF0dXMpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKIAkJLyogSWxsZWdhbCBjYXNlICovCi0JCXByX3dhcm4oInNzdDogaWxsZWdhbCByZXFcbiIpOworCQlwcl93YXJuKCJpbGxlZ2FsIHJlcVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDI1LDggKzQ3MCwxNCBAQAogfQogCiAKK3N0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgcGNtX29wcyA9IHsKKwkub3BlbiA9IHNzdF9vcGVuX3BjbV9zdHJlYW0sCisJLmRldmljZV9jb250cm9sID0gc3N0X2RldmljZV9jb250cm9sLAorCS5jbG9zZSA9IHNzdF9jbG9zZV9wY21fc3RyZWFtLAorfTsKKwogc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyBzc3RfcG1pY19vcHMgPSB7Ci0JLmNvbnRyb2xfc2V0ID0gc3N0X2NvbnRyb2xfc2V0LAorCS5wY21fY29udHJvbCA9ICZwY21fb3BzLAogfTsKIAogLyoKQEAgLTQzOSwxMiArNDkwLDEyIEBACiBpbnQgcmVnaXN0ZXJfc3N0X2NhcmQoc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyAqY2FyZCkKIHsKIAlpZiAoIXNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBObyBTU1QgZHJpdmVyIHJlZ2lzdGVyIGNhcmQgcmVqZWN0XG4iKTsKKwkJcHJfZXJyKCJObyBTU1QgZHJpdmVyIHJlZ2lzdGVyIGNhcmQgcmVqZWN0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKCFjYXJkIHx8ICFjYXJkLT5tb2R1bGVfbmFtZSkgewotCQlwcl9lcnIoInNzdDogTnVsbCBQb2ludGVyIFBhc3NlZFxuIik7CisJCXByX2VycigiTnVsbCBQb2ludGVyIFBhc3NlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgPT0gU05EX01BRF9VTl9JTklUKSB7CkBAIC00NTYsMTcgKzUwNywxNyBAQAogCQkJc3N0X3BtaWNfb3BzLm1vZHVsZV9uYW1lID0gY2FyZC0+bW9kdWxlX25hbWU7CiAJCQlzc3RfZHJ2X2N0eC0+cG1pY19zdGF0ZSA9IFNORF9NQURfSU5JVF9ET05FOwogCQkJc3N0X2Rydl9jdHgtPnJ4X3RpbWVfc2xvdF9zdGF0dXMgPSAwOyAvKmRlZmF1bHQgQU1JQyovCi0JCQljYXJkLT5jb250cm9sX3NldCA9IHNzdF9wbWljX29wcy5jb250cm9sX3NldDsKKwkJCWNhcmQtPnBjbV9jb250cm9sID0gc3N0X3BtaWNfb3BzLnBjbV9jb250cm9sOwogCQkJc3N0X2Rydl9jdHgtPnNjYXJkX29wcy0+Y2FyZF9zdGF0dXMgPSBTTkRfQ0FSRF9VTl9JTklUOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyY21wIGZhaWwgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKKwkJCXByX2Vycigic3RyY21wIGZhaWwgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAl9IGVsc2UgewogCQkvKiBhbHJlYWR5IHJlZ2lzdGVyZWQgYSBkcml2ZXIgKi8KLQkJcHJfZXJyKCJzc3Q6IFJlcGVhdCBmb3IgcmVnaXN0ZXJhdGlvbi4uZGVuaWVkXG4iKTsKKwkJcHJfZXJyKCJSZXBlYXQgZm9yIHJlZ2lzdHJhdGlvbi4uZGVuaWVkXG4iKTsKIAkJcmV0dXJuIC1FQkFEUlFDOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ4MiwxMSArNTMzLDExIEBACiAgKi8KIHZvaWQgdW5yZWdpc3Rlcl9zc3RfY2FyZChzdHJ1Y3QgaW50ZWxfc3N0X2NhcmRfb3BzICpjYXJkKQogewotCWlmIChzc3RfcG1pY19vcHMuY29udHJvbF9zZXQgPT0gY2FyZC0+Y29udHJvbF9zZXQpIHsKKwlpZiAoc3N0X3BtaWNfb3BzLnBjbV9jb250cm9sID09IGNhcmQtPnBjbV9jb250cm9sKSB7CiAJCS8qIHVucmVnICovCiAJCXNzdF9wbWljX29wcy5tb2R1bGVfbmFtZSA9ICIiOwogCQlzc3RfZHJ2X2N0eC0+cG1pY19zdGF0ZSA9IFNORF9NQURfVU5fSU5JVDsKLQkJcHJfZGVidWcoInNzdDogVW5yZWdpc3RlcmVkICVzXG4iLCBjYXJkLT5tb2R1bGVfbmFtZSk7CisJCXByX2RlYnVnKCJVbnJlZ2lzdGVyZWQgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKIAl9CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYwppbmRleCBkODBhNmVlLi42ZTVjOTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYwpAQCAtMjksNiArMjksOSBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZHNwIGNvbnRyb2xsaW5nIGZ1bmN0aW9ucyBsaWtlIGZpcm13YXJlIGRvd25sb2FkLAogICogc2V0dGluZy9yZXNldHRpbmcgZHNwIGNvcmVzLCBldGMKICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC00Nyw4ICs1MCw5IEBACiB7CiAJdW5pb24gY29uZmlnX3N0YXR1c19yZWcgY3NyOwogCi0JcHJfZGVidWcoInNzdDogUmVzZXR0aW5nIHRoZSBEU1AgaW4gbXJzdFxuIik7Ci0JY3NyLmZ1bGwgPSAweDNhMjsKKwlwcl9kZWJ1ZygiUmVzZXR0aW5nIHRoZSBEU1AgaW4gbXJzdFxuIik7CisJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKKwljc3IuZnVsbCB8PSAweDM4MjsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7CiAJY3NyLnBhcnQuc3RyYl9jbnRyX3JzdCA9IDA7CkBAIC02OCw3ICs3Miw3IEBACiB7CiAJdW5pb24gY29uZmlnX3N0YXR1c19yZWcgY3NyOwogCi0JcHJfZGVidWcoInNzdDogUmVzZXR0aW5nIHRoZSBEU1AgaW4gbWVkZmllbGRcbiIpOworCXByX2RlYnVnKCJSZXNldHRpbmcgdGhlIERTUCBpbiBtZWRmaWVsZFxuIik7CiAJY3NyLmZ1bGwgPSAweDA0ODMwM0UyOwogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CiAKQEAgLTkwLDcgKzk0LDcgQEAKIAljc3IucGFydC5ydW5fc3RhbGwgPSAwOwogCWNzci5wYXJ0LnNzdF9yZXNldCA9IDA7CiAJY3NyLnBhcnQuc3RyYl9jbnRyX3JzdCA9IDE7Ci0JcHJfZGVidWcoInNzdDogU2V0dGluZyBTU1QgdG8gZXhlY3V0ZV9tcnN0IDB4JXhcbiIsIGNzci5mdWxsKTsKKwlwcl9kZWJ1ZygiU2V0dGluZyBTU1QgdG8gZXhlY3V0ZV9tcnN0IDB4JXhcbiIsIGNzci5mdWxsKTsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTEsNyArMTE1LDcgQEAKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCWNzci5mdWxsID0gMHgwNDgzMDA2MTsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwotCXByX2RlYnVnKCJzc3Q6IFN0YXJ0aW5nIHRoZSBEU1BfbWVkZmxkXG4iKTsKKwlwcl9kZWJ1ZygiU3RhcnRpbmcgdGhlIERTUF9tZWRmbGRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzAsMTYgKzEzNCwxNiBAQAogCXUzMiBjb3VudDsKIAl2b2lkIF9faW9tZW0gKnJhbTsKIAotCXByX2RlYnVnKCJzc3Q6IG1vZHVsZSBzaWduICVzIHNpemUgJXggYmxvY2tzICV4IHR5cGUgJXhcbiIsCisJcHJfZGVidWcoIm1vZHVsZSBzaWduICVzIHNpemUgJXggYmxvY2tzICV4IHR5cGUgJXhcbiIsCiAJCQltb2R1bGUtPnNpZ25hdHVyZSwgbW9kdWxlLT5tb2Rfc2l6ZSwKIAkJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOwotCXByX2RlYnVnKCJzc3Q6IG1vZHVsZSBlbnRyeXBvaW50IDB4JXhcbiIsIG1vZHVsZS0+ZW50cnlfcG9pbnQpOworCXByX2RlYnVnKCJtb2R1bGUgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKIAogCWJsb2NrID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSk7CiAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtb2R1bGUtPmJsb2NrczsgY291bnQrKykgewogCQlpZiAoYmxvY2stPnNpemUgPD0gMCkgewotCQkJcHJfZXJyKCJzc3Q6IGJsb2NrIHNpemUgaW52YWxpZFxuIik7CisJCQlwcl9lcnIoImJsb2NrIHNpemUgaW52YWxpZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CkBAIC0xNTAsNyArMTU0LDcgQEAKIAkJCXJhbSA9IHNzdF9kcnZfY3R4LT5kcmFtOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoInNzdDogd3JvbmcgcmFtIHR5cGUweCV4IGluIGJsb2NrMHgleFxuIiwKKwkJCXByX2Vycigid3JvbmcgcmFtIHR5cGUweCV4IGluIGJsb2NrMHgleFxuIiwKIAkJCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xODQsMTAgKzE4OCwxMCBAQAogCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0ZXX1NJR04sIDQpICE9IDApIHx8CiAJCQkoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgewogCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLwotCQlwcl9lcnIoInNzdDogSW52YWxpZEZXIHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlwcl9lcnIoIkludmFsaWQgRlcgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBoZWFkZXIgc2lnbj0lcyBzaXplPSV4IG1vZHVsZXM9JXggZm10PSV4IHNpemU9JXhcbiIsCisJcHJfZGVidWcoImhlYWRlciBzaWduPSVzIHNpemU9JXggbW9kdWxlcz0leCBmbXQ9JXggc2l6ZT0leFxuIiwKIAkJCWhlYWRlci0+c2lnbmF0dXJlLCBoZWFkZXItPmZpbGVfc2l6ZSwgaGVhZGVyLT5tb2R1bGVzLAogCQkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKIAltb2R1bGUgPSAodm9pZCAqKXNzdF9mdy0+ZGF0YSArIHNpemVvZigqaGVhZGVyKTsKQEAgLTIxNCw3ICsyMTgsNyBAQAogewogCWludCByZXRfdmFsOwogCi0JcHJfZGVidWcoInNzdDogbG9hZF9mdyBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJsb2FkX2Z3IGNhbGxlZFxuIik7CiAJQlVHX09OKCFmdyk7CiAKIAlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpCkBAIC0yMzksNyArMjQzLDcgQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBmdyBsb2FkZWQgc3VjY2Vzc2Z1bCEhIVxuIik7CisJcHJfZGVidWcoImZ3IGxvYWRlZCBzdWNjZXNzZnVsISEhXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMjYxLDcgKzI2NSw3IEBACiAKIAlwdnRfaWQgPSBzc3RfYXNzaWduX3B2dF9pZChzc3RfZHJ2X2N0eCk7CiAJaSA9IHNzdF9nZXRfYmxvY2tfc3RyZWFtKHNzdF9kcnZfY3R4KTsKLQlwcl9kZWJ1Zygic3N0OiBhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZCwgcHZ0X2lkICVkXG4iLCBpLCBwdnRfaWQpOworCXByX2RlYnVnKCJhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZCwgcHZ0X2lkICVkXG4iLCBpLCBwdnRfaWQpOwogCWlmIChpIDwgMCkgewogCQlrZnJlZShtc2cpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI4MSwxMSArMjg1LDExIEBACiAJaWYgKHJldHZhbCkgewogCQkvKiBlcnJvciAqLwogCQlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0uc3N0X2lkID0gQkxPQ0tfVU5JTklUOwotCQlwcl9lcnIoInNzdDogUHJlcCBjb2RlYyBkb3dubG9hZGVkIGZhaWxlZCAlZFxuIiwKKwkJcHJfZXJyKCJQcmVwIGNvZGVjIGRvd25sb2FkZWQgZmFpbGVkICVkXG4iLAogCQkJCXJldHZhbCk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBGVyByZXNwb25kZWQsIHJlYWR5IGZvciBkb3dubG9hZCBub3cuLi5cbiIpOworCXByX2RlYnVnKCJGVyByZXNwb25kZWQsIHJlYWR5IGZvciBkb3dubG9hZCBub3cuLi5cbiIpOwogCS8qIGRvd25sb2FkaW5nIG9uIHN1Y2Nlc3MgKi8KIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwogCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBTU1RfRldfTE9BREVEOwpAQCAtMzI1LDcgKzMyOSw3IEBACiAJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KTsKIAlzcGluX3VubG9jaygmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKIAlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKLQlwcl9kZWJ1Zygic3N0OiBXYWl0aW5nIGZvciBGVyByZXNwb25zZSBEb3dubG9hZCBjb21wbGV0ZVxuIik7CisJcHJfZGVidWcoIldhaXRpbmcgZm9yIEZXIHJlc3BvbnNlIERvd25sb2FkIGNvbXBsZXRlXG4iKTsKIAlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0ub3BzX2Jsb2NrLmNvbmRpdGlvbiA9IGZhbHNlOwogCXJldHZhbCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0X2Rydl9jdHgsICZzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0pOwogCWlmIChyZXR2YWwpIHsKQEAgLTMzNyw3ICszNDEsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiBGVyBzdWNlc3Mgb24gRG93bmxvYWQgY29tcGxldGVcbiIpOworCXByX2RlYnVnKCJGVyBzdWNjZXNzIG9uIERvd25sb2FkIGNvbXBsZXRlXG4iKTsKIAlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0uc3N0X2lkID0gQkxPQ0tfVU5JTklUOwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19SVU5OSU5HOwpAQCAtMzYwLDE0ICszNjQsMTQgQEAKIAogCWhlYWRlciA9IChzdHJ1Y3QgZndfaGVhZGVyICopZndfbGliLT5kYXRhOwogCWlmIChoZWFkZXItPm1vZHVsZXMgIT0gMSkgewotCQlwcl9lcnIoInNzdDogTW9kdWxlIG5vIG1pc21hdGNoIGZvdW5kXG4gIik7CisJCXByX2VycigiTW9kdWxlIG5vIG1pc21hdGNoIGZvdW5kXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0KIAltb2R1bGUgPSAodm9pZCAqKWZ3X2xpYi0+ZGF0YSArIHNpemVvZigqaGVhZGVyKTsKIAkqZW50cnlfcG9pbnQgPSBtb2R1bGUtPmVudHJ5X3BvaW50OwotCXByX2RlYnVnKCJzc3Q6IE1vZHVsZSBlbnRyeSBwb2ludCAweCV4XG4iLCAqZW50cnlfcG9pbnQpOwotCXByX2RlYnVnKCJzc3Q6IE1vZHVsZSBTaWduICVzLCBTaXplIDB4JXgsIEJsb2NrcyAweCV4IFR5cGUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiTW9kdWxlIGVudHJ5IHBvaW50IDB4JXhcbiIsICplbnRyeV9wb2ludCk7CisJcHJfZGVidWcoIk1vZHVsZSBTaWduICVzLCBTaXplIDB4JXgsIEJsb2NrcyAweCV4IFR5cGUgMHgleFxuIiwKIAkJCW1vZHVsZS0+c2lnbmF0dXJlLCBtb2R1bGUtPm1vZF9zaXplLAogCQkJbW9kdWxlLT5ibG9ja3MsIG1vZHVsZS0+dHlwZSk7CiAKQEAgLTM4MSwyMCArMzg1LDIwIEBACiAJCQlkc2l6ZSArPSBibG9jay0+c2l6ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJzc3Q6IEludmFsaWQgYmxvY2sgdHlwZSBmb3IgMHgleFxuIiwgbl9ibGspOworCQkJcHJfZXJyKCJJbnZhbGlkIGJsb2NrIHR5cGUgZm9yIDB4JXhcbiIsIG5fYmxrKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKIAl9CiAJaWYgKGlzaXplID4gc2xvdC0+aXJhbV9zaXplIHx8IGRzaXplID4gc2xvdC0+ZHJhbV9zaXplKSB7Ci0JCXByX2Vycigic3N0OiBsaWJyYXJ5IGV4Y2VlZHMgc2l6ZSBhbGxvY2F0ZWRcbiIpOworCQlwcl9lcnIoImxpYnJhcnkgZXhjZWVkcyBzaXplIGFsbG9jYXRlZFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UKLQkJcHJfZGVidWcoInNzdDogTGlicmFyeSBpcyBzYWZlIGZvciBkb3dubG9hZC4uLlxuIik7CisJCXByX2RlYnVnKCJMaWJyYXJ5IGlzIHNhZmUgZm9yIGRvd25sb2FkLi4uXG4iKTsKIAotCXByX2RlYnVnKCJzc3Q6IGlyYW0gMHgleCwgZHJhbSAweCV4LCBpcmFtIDB4JXgsIGRyYW0gMHgleFxuIiwKKwlwcl9kZWJ1ZygiaXJhbSAweCV4LCBkcmFtIDB4JXgsIGlyYW0gMHgleCwgZHJhbSAweCV4XG4iLAogCQkJaXNpemUsIGRzaXplLCBzbG90LT5pcmFtX3NpemUsIHNsb3QtPmRyYW1fc2l6ZSk7CiBleGl0OgogCXJldHVybiBlcnI7CkBAIC00MTQsMTUgKzQxOCwxNSBAQAogCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwogCi0JcHJfZGVidWcoInNzdDogTGliIFR5cGUgMHgleCwgU2xvdCAweCV4LCBvcHMgMHgleFxuIiwKKwlwcl9kZWJ1ZygiTGliIFR5cGUgMHgleCwgU2xvdCAweCV4LCBvcHMgMHgleFxuIiwKIAkJCWxpYi0+bGliX2luZm8ubGliX3R5cGUsIGxpYi0+c2xvdF9pbmZvLnNsb3RfbnVtLCBvcHMpOwotCXByX2RlYnVnKCJzc3Q6IFZlcnNpb24gMHgleCwgbmFtZSAlcywgY2FwcyAweCV4IG1lZGlhIHR5cGUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiVmVyc2lvbiAweCV4LCBuYW1lICVzLCBjYXBzIDB4JXggbWVkaWEgdHlwZSAweCV4XG4iLAogCQlsaWItPmxpYl9pbmZvLmxpYl92ZXJzaW9uLCBsaWItPmxpYl9pbmZvLmxpYl9uYW1lLAogCQlsaWItPmxpYl9pbmZvLmxpYl9jYXBzLCBsaWItPmxpYl9pbmZvLm1lZGlhX3R5cGUpOwogCi0JcHJfZGVidWcoInNzdDogSVJBTSBTaXplIDB4JXgsIG9mZnNldCAweCV4XG4iLAorCXByX2RlYnVnKCJJUkFNIFNpemUgMHgleCwgb2Zmc2V0IDB4JXhcbiIsCiAJCWxpYi0+c2xvdF9pbmZvLmlyYW1fc2l6ZSwgbGliLT5zbG90X2luZm8uaXJhbV9vZmZzZXQpOwotCXByX2RlYnVnKCJzc3Q6IERSQU0gU2l6ZSAweCV4LCBvZmZzZXQgMHgleFxuIiwKKwlwcl9kZWJ1ZygiRFJBTSBTaXplIDB4JXgsIG9mZnNldCAweCV4XG4iLAogCQlsaWItPnNsb3RfaW5mby5kcmFtX3NpemUsIGxpYi0+c2xvdF9pbmZvLmRyYW1fb2Zmc2V0KTsKIAogCXN3aXRjaCAobGliLT5saWJfaW5mby5saWJfdHlwZSkgewpAQCAtNDQyLDcgKzQ0Niw3IEBACiAJCXR5cGUgPSAid21hOV8iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInNzdDogSW52YWxpZCBjb2RlYyB0eXBlXG4iKTsKKwkJcHJfZXJyKCJJbnZhbGlkIGNvZGVjIHR5cGVcbiIpOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gd2FrZTsKIAl9CkBAIC00NTgsMTEgKzQ2MiwxMSBAQAogCQkJbGliLT5zbG90X2luZm8uc2xvdF9udW0pOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiLmJpbiIpOwogCi0JcHJfZGVidWcoInNzdDogUmVxdWVzdGluZyAlc1xuIiwgYnVmKTsKKwlwcl9kZWJ1ZygiUmVxdWVzdGluZyAlc1xuIiwgYnVmKTsKIAogCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZndfbGliLCBidWYsICZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCWlmIChlcnJvcikgewotCQlwcl9lcnIoInNzdDogbGlicmFyeSBsb2FkIGZhaWxlZCAlZFxuIiwgZXJyb3IpOworCQlwcl9lcnIoImxpYnJhcnkgbG9hZCBmYWlsZWQgJWRcbiIsIGVycm9yKTsKIAkJZ290byB3YWtlOwogCX0KIAllcnJvciA9IHNzdF92YWxpZGF0ZV9saWJyYXJ5KGZ3X2xpYiwgJmxpYi0+c2xvdF9pbmZvLCAmZW50cnlfcG9pbnQpOwpAQCAtNDc2LDcgKzQ4MCw3IEBACiAJCWdvdG8gd2FrZV9mcmVlOwogCiAJLyogbGliIGlzIGRvd25sb2FkZWQgYW5kIGluaXQgc2VuZCBhbGxvYyBhZ2FpbiAqLwotCXByX2RlYnVnKCJzc3Q6IExpYnJhcnkgaXMgZG93bmxvYWRlZCBub3cuLi5cbiIpOworCXByX2RlYnVnKCJMaWJyYXJ5IGlzIGRvd25sb2FkZWQgbm93Li4uXG4iKTsKIHdha2VfZnJlZToKIAkvKiBzc3Rfd2FrZV91cF9hbGxvY19ibG9jayhzc3RfZHJ2X2N0eCwgcHZ0X2lkLCBlcnJvciwgTlVMTCk7ICovCiAJcmVsZWFzZV9maXJtd2FyZShmd19saWIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZndfaXBjLmggYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaAppbmRleCA5ZDNjMzY4Li44ZGYzMTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaApAQCAtMzEsNiArMzEsNyBAQAogKi8KIAogI2RlZmluZSBNQVhfTlVNX1NUUkVBTVNfTVJTVCAzCisjZGVmaW5lIE1BWF9OVU1fU1RSRUFNU19NRkxEIDYKICNkZWZpbmUgTUFYX05VTV9TVFJFQU1TIDYKICNkZWZpbmUgTUFYX0RCR19SV19CWVRFUyA4MAogI2RlZmluZSBNQVhfTlVNX1NDQVRURVJfQlVGRkVSUyA4CkBAIC02Nyw2ICs2OCw4IEBACiAjZGVmaW5lIElQQ19JQV9DQVBUX1ZPSUNFIDB4MTcKICNkZWZpbmUgSVBDX0lBX0RFQ09ERV9GUkFNRVMgMHgxOAogCisjZGVmaW5lIElQQ19JQV9BTEdfUEFSQU1TIDB4MUEKKwogLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCiAjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0gMHgyMCAvKiBBbGxvY2F0ZSBhIHN0cmVhbSBJRCAqLwogI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0gMHgyMSAvKiBGcmVlIHRoZSBzdHJlYW0gSUQgKi8KQEAgLTE0MSw3MyArMTQ0LDg3IEBACiAJLyogRXJyb3IgY29kZSxyZXNwb25zZSB0byBtc2dJZDogRGVzY3JpcHRpb24gKi8KIAkvKiBDb21tb24gZXJyb3IgY29kZXMgKi8KIAlTU1RfU1VDQ0VTUyA9IDAsCS8qIFN1Y2Nlc3MgKi8KLQlTU1RfRVJSX0lOVkFMSURfU1RSRUFNX0lELCAvKiBJbnZhbGlkIHN0cmVhbSBJRCAqLwotCVNTVF9FUlJfSU5WQUxJRF9NU0dfSUQsCS8qIEludmFsaWQgbWVzc2FnZSBJRCAqLwotCVNTVF9FUlJfSU5WQUxJRF9TVFJFQU1fT1AsIC8qIEludmFsaWQgc3RyZWFtIG9wZXJhdGlvbiByZXF1ZXN0ICovCi0JU1NUX0VSUl9JTlZBTElEX1BBUkFNUywJLyogSW52YWxpZCBwYXJhbXMgKi8KLQlTU1RfRVJSX0lOVkFMSURfQ09ERUMsCS8qIEludmFsaWQgY29kZWMgdHlwZSAqLwotCVNTVF9FUlJfSU5WQUxJRF9NRURJQV9UWVBFLCAvKiBJbnZhbGlkIG1lZGlhIHR5cGUgKi8KLQlTU1RfRVJSX1NUUkVBTV9FUlIsICAvKiBBTlk6IFN0cmVhbSBjb250cm9sIG9yIGNvbmZpZyBvcgotCQkJCQlwcm9jZXNzaW5nIGVycm9yICovCisJU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9JRCA9IDEsCisJU1NUX0VSUl9JTlZBTElEX01TR19JRCA9IDIsCisJU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9PUCA9IDMsCisJU1NUX0VSUl9JTlZBTElEX1BBUkFNUyA9IDQsCisJU1NUX0VSUl9JTlZBTElEX0NPREVDID0gNSwKKwlTU1RfRVJSX0lOVkFMSURfTUVESUFfVFlQRSA9IDYsCisJU1NUX0VSUl9TVFJFQU1fRVJSID0gNywKIAogCS8qIElQQyBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9JUENfRVJSX0NBTExfQkFDS19OT1RfUkVHRCwgLyogQ2FsbCBiYWNrIGZvciBtc2cgbm90IHJlZ2QgKi8KLQlTU1RfSVBDX0VSUl9TVFJFQU1fTk9UX0FMTE9DQVRFRCwgLyogU3RyZWFtIGlzIG5vdCBhbGxvY2F0ZWQgICovCi0JU1NUX0lQQ19FUlJfU1RSRUFNX0FMTE9DX0ZBSUxFRCwgLyogQUxMT0M6U3RyZWFtIGFsbG9jIGZhaWxlZCAqLwotCVNTVF9JUENfRVJSX0dFVF9TVFJFQU1fRkFJTEVELCAvKiBBTExPQzpHZXQgc3RyZWFtIGlkIGZhaWxlZCovCi0JU1NUX0VSUl9NT0RfTk9UX0FWQUlMLCAvKiBTRVQvR0VUOiBNb2QoQUVDL0FHQy9BTEMpIG5vdCBhdmFpbGFibGUgKi8KLQlTU1RfRVJSX01PRF9ETkxEX1JRRCwgLyogU0VUL0dFVDogTW9kKEFFQy9BR0MvQUxDKSBkb3dubG9hZCByZXF1aXJlZCAqLwotCVNTVF9FUlJfU1RSRUFNX1NUT1BQRUQsCQkvKiBBTlk6IFN0cmVhbSBpcyBpbiBzdG9wcGVkIHN0YXRlICovCi0JU1NUX0VSUl9TVFJFQU1fSU5fVVNFLCAvKiBBTlk6IFN0cmVhbSBpcyBhbHJlYWR5IGluIHVzZSAqLworCVNTVF9JUENfRVJSX0NBTExfQkFDS19OT1RfUkVHRCA9IDgsCisJU1NUX0lQQ19FUlJfU1RSRUFNX05PVF9BTExPQ0FURUQgPSA5LAorCVNTVF9JUENfRVJSX1NUUkVBTV9BTExPQ19GQUlMRUQgPSAxMCwKKwlTU1RfSVBDX0VSUl9HRVRfU1RSRUFNX0ZBSUxFRCA9IDExLAorCVNTVF9FUlJfTU9EX05PVF9BVkFJTCA9IDEyLAorCVNTVF9FUlJfTU9EX0ROTERfUlFEID0gMTMsCisJU1NUX0VSUl9TVFJFQU1fU1RPUFBFRCA9IDE0LAorCVNTVF9FUlJfU1RSRUFNX0lOX1VTRSA9IDE1LAogCiAJLyogQ2FwdHVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9DQVBfRVJSX0lOQ01QTFRFX0NBUFRVUkVfTVNHLC8qIEFOWTpJbmNvbXBsZXRlIG1lc3NhZ2UgKi8KLQlTU1RfQ0FQX0VSUl9DQVBUVVJFX0ZBSUwsIC8qIEFOWTpDYXB0dXJlIG9wIGZhaWxlZCAqLwotCVNTVF9DQVBfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCwKLQlTU1RfQ0FQX0VSUl9VTkRFUl9SVU4sCS8qIGxhY2sgb2YgaW5wdXQgZGF0YSAqLwotCVNTVF9DQVBfRVJSX09WRVJGTE9XLAkvKiBsYWNrIG9mIG91dHB1dCBzcGFjZSAqLworCVNTVF9DQVBfRVJSX0lOQ01QTFRFX0NBUFRVUkVfTVNHID0gMTYsCisJU1NUX0NBUF9FUlJfQ0FQVFVSRV9GQUlMID0gMTcsCisJU1NUX0NBUF9FUlJfR0VUX0REUl9ORVdfU0dMSVNUID0gMTgsCisJU1NUX0NBUF9FUlJfVU5ERVJfUlVOID0gMTksCisJU1NUX0NBUF9FUlJfT1ZFUkZMT1cgPSAyMCwKIAogCS8qIFBsYXliYWNrIHNwZWNpZmljIGVycm9yIGNvZGVzKi8KLQlTU1RfUEJfRVJSX0lOQ01QTFRFX1BMQVlfTVNHLCAvKiBBTlk6IEluY29tcGxldGUgbWVzc2FnZSAqLwotCVNTVF9QQl9FUlJfUExBWV9GQUlMLCAvKiBBTlk6IFBsYXliYWNrIG9wZXJhdGlvbiBmYWlsZWQgKi8KLQlTU1RfUEJfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCwKKwlTU1RfUEJfRVJSX0lOQ01QTFRFX1BMQVlfTVNHID0gMjEsCisJU1NUX1BCX0VSUl9QTEFZX0ZBSUwgPSAyMiwKKwlTU1RfUEJfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCA9IDIzLAogCiAJLyogQ29kZWMgbWFuYWdlciBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9MSUJfRVJSX0xJQl9ETkxEX1JFUVVJUkVELCAvKiBBTExPQzogQ29kZWMgZG93bmxvYWQgcmVxdWlyZWQgKi8KLQlTU1RfTElCX0VSUl9MSUJfTk9UX1NVUFBPUlRFRCwgLyogTGlicmFyeSBpcyBub3Qgc3VwcG9ydGVkICovCisJU1NUX0xJQl9FUlJfTElCX0ROTERfUkVRVUlSRUQgPSAyNCwKKwlTU1RfTElCX0VSUl9MSUJfTk9UX1NVUFBPUlRFRCA9IDI1LAogCiAJLyogTGlicmFyeSBtYW5hZ2VyIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX1NDQ19FUlJfUFJFUF9ETkxEX0ZBSUxFRCwgLyogRmFpbGVkIHRvIHByZXBhcmUgZm9yIGNvZGVjIGRvd25sb2FkICovCi0JU1NUX1NDQ19FUlJfTElCX0ROTERfUkVTX0ZBSUxFRCwgLyogTGliIGRvd25sb2FkIHJlc3VtZSBmYWlsZWQgKi8KKwlTU1RfU0NDX0VSUl9QUkVQX0ROTERfRkFJTEVEID0gMjYsCisJU1NUX1NDQ19FUlJfTElCX0ROTERfUkVTX0ZBSUxFRCA9IDI3LAogCS8qIFNjaGVkdWxlciBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9TQ0hfRVJSX0ZBSUwsIC8qIFJFUE9SVDogKi8KKwlTU1RfU0NIX0VSUl9GQUlMID0gMjgsCiAKIAkvKiBETUEgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KLQlTU1RfRE1BX0VSUl9OT19DSE5MX0FWQUlMQUJMRSwgLyogRE1BIENoIG5vdCBhdmFpbGFibGUgKi8KLQlTU1RfRE1BX0VSUl9JTlZBTElEX0lOUFVUX1BBUkFNUywgLyogSW52YWxpZCBpbnB1dCBwYXJhbXMgKi8KLQlTU1RfRE1BX0VSUl9DSE5MX0FMUkVBRFlfU1VTUEVOREVELCAvKiBDaCBpcyBzdXNwZW5kZWQgKi8KLQlTU1RfRE1BX0VSUl9DSE5MX0FMUkVBRFlfU1RBUlRFRCwgLyogQ2ggYWxyZWFkeSBzdGFydGVkICovCi0JU1NUX0RNQV9FUlJfQ0hOTF9OT1RfRU5BQkxFRCwgLyogQ2ggbm90IGVuYWJsZWQgKi8KLQlTU1RfRE1BX0VSUl9UUkFOU0ZFUl9GQUlMRUQsIC8qIFRyYW5zZmVyIGZhaWxlZCAqLwotCVNTVF9TU1BfRVJSX0FMUkVBRFlfRU5BQkxFRCwgLyogUkVQT1JUOiBTU1AgYWxyZWFkeSBlbmFibGVkICovCi0JU1NUX1NTUF9FUlJfQUxSRUFEWV9ESVNBQkxFRCwgLyogUkVQT1JUOiBTU1AgYWxyZWFkeSBkaXNhYmxlZCAqLwotCVNTVF9TU1BfRVJSX05PVF9JTklUSUFMSVpFRCwKKwlTU1RfRE1BX0VSUl9OT19DSE5MX0FWQUlMQUJMRSA9IDI5LAorCVNTVF9ETUFfRVJSX0lOVkFMSURfSU5QVVRfUEFSQU1TID0gMzAsCisJU1NUX0RNQV9FUlJfQ0hOTF9BTFJFQURZX1NVU1BFTkRFRCA9IDMxLAorCVNTVF9ETUFfRVJSX0NITkxfQUxSRUFEWV9TVEFSVEVEID0gMzIsCisJU1NUX0RNQV9FUlJfQ0hOTF9OT1RfRU5BQkxFRCA9IDMzLAorCVNTVF9ETUFfRVJSX1RSQU5TRkVSX0ZBSUxFRCA9IDM0LAorCisJU1NUX1NTUF9FUlJfQUxSRUFEWV9FTkFCTEVEID0gMzUsCisJU1NUX1NTUF9FUlJfQUxSRUFEWV9ESVNBQkxFRCA9IDM2LAorCVNTVF9TU1BfRVJSX05PVF9JTklUSUFMSVpFRCA9IDM3LAorCVNTVF9TU1BfRVJSX1NSQU1fTk9fRE1BX0RBVEEgPSAzOCwKIAogCS8qIE90aGVyIGVycm9yIGNvZGVzICovCi0JU1NUX0VSUl9NT0RfSU5JVF9GQUlMLAkvKiBGaXJtd2FyZSBNb2R1bGUgaW5pdCBmYWlsZWQgKi8KKwlTU1RfRVJSX01PRF9JTklUX0ZBSUwgPSAzOSwKIAogCS8qIEZXIGluaXQgZXJyb3IgY29kZXMgKi8KLQlTU1RfUkRSX0VSUl9JT19ERVZfU0VMX05PVF9BTExPV0VELAotCVNTVF9SRFJfRVJSX1JPVVRFX0FMUkVBRFlfU1RBUlRFRCwKLQlTU1RfUkRSX1BSRVBfQ09ERUNfRE5MRF9GQUlMRUQsCisJU1NUX1JEUl9FUlJfSU9fREVWX1NFTF9OT1RfQUxMT1dFRCA9IDQwLAorCVNTVF9SRFJfRVJSX1JPVVRFX0FMUkVBRFlfU1RBUlRFRCA9IDQxLAorCVNTVF9SRFJfRVJSX0lPX0RFVl9TRUxfRkFJTEVEID0gNDIsCisJU1NUX1JEUl9QUkVQX0NPREVDX0ROTERfRkFJTEVEID0gNDMsCiAKIAkvKiBNZW1vcnkgZGVidWcgZXJyb3IgY29kZXMgKi8KLQlTU1RfRVJSX0RCR19NRU1fUkVBRF9GQUlMLAotCVNTVF9FUlJfREJHX01FTV9XUklURV9GQUlMLAorCVNTVF9FUlJfREJHX01FTV9SRUFEX0ZBSUwgPSA0NCwKKwlTU1RfRVJSX0RCR19NRU1fV1JJVEVfRkFJTCA9IDQ1LAorCVNTVF9FUlJfSU5TVUZGSUNJRU5UX0lOUFVUX1NHX0xJU1QgPSA0NiwKKwlTU1RfRVJSX0lOU1VGRklDSUVOVF9PVVRQVVRfU0dfTElTVCA9IDQ3LAogCi0JLyogRGVjb2RlIGVycm9yIGNvZGVzICovCi0JU1NUX0VSUl9ERUNfTkVFRF9JTlBVVF9CVUYsCisJU1NUX0VSUl9CVUZGRVJfTk9UX0FWQUlMQUJMRSA9IDQ4LAorCVNTVF9FUlJfQlVGRkVSX05PVF9BTExPQ0FURUQgPSA0OSwKKwlTU1RfRVJSX0lOVkFMSURfUkVHSU9OX1RZUEUgPSA1MCwKKwlTU1RfRVJSX05VTExfUFRSID0gNTEsCisJU1NUX0VSUl9JTlZBTElEX0JVRkZFUl9TSVpFID0gNTIsCisJU1NUX0VSUl9JTlZBTElEX0JVRkZFUl9JTkRFWCA9IDUzLAogCisJLypJSVBDIHNwZWNpZmljIGVycm9yIGNvZGVzICovCisJU1NUX0lJUENfUVVFVUVfRlVMTCA9IDU0LAorCVNTVF9JSVBDX0VSUl9NU0dfU05EX0ZBSUxFRCA9IDU1LAorCVNTVF9QQl9FUlJfVU5ERVJSVU5fT0NDVVJFRCA9IDU2LAorCVNTVF9SRFJfSU5TVUZGSUNJRU5UX01JWEVSX0JVRkZFUiA9IDU3LAorCVNTVF9JTlZBTElEX1RJTUVfU0xPVFMgPSA1OCwKIH07CiAKIGVudW0gZGJnX21lbV9kYXRhX3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2lvY3RsLmgKaW5kZXggMDNiOTMxNi4uYmViYzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pb2N0bC5oCkBAIC0xOTAsMjEgKzE5MCwxNSBAQAogCV9fdTMyIHJlc2VydmVkOwkvKiBObyBwcmUtcHJvY2Vzc2luZyBkZWZpbmVkIHlldCAqLwogfTsKIAotc3RydWN0IHNuZF9wYXJhbXNfYmxvY2sgewotCV9fdTMyIHR5cGU7CQkvKlR5cGUgb2YgdGhlIHBhcmFtZXRlciovCi0JX191MzIgc2l6ZTsJCS8qc2l6ZSBvZiB0aGUgcGFyYW1ldGVycyBpbiB0aGUgYmxvY2sqLwotCV9fdTggcGFyYW1zWzBdOwkvKlBhcmFtZXRlcnMgb2YgdGhlIGFsZ29yaXRobSovCi19OwotCiAvKiBQcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgc3RydWN0dXJlICovCiBzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgewotCWVudW0gc3N0X2FsZ29fdHlwZXMJYWxnb19pZDsvKiBQb3N0L1ByZSBwcm9jZXNzaW5nIGFsZ29yaXRobSBJRCAgKi8KKwlfX3U4CQkJYWxnb19pZDsvKiBQb3N0L1ByZSBwcm9jZXNzaW5nIGFsZ29yaXRobSBJRCAgKi8KIAlfX3U4CQkJc3RyX2lkOwkvKk9ubHkgNSBiaXRzIHVzZWQgMCAtIDMxIGFyZSB2YWxpZCovCiAJX191OAkJCWVuYWJsZTsJLyogMD0gZGlzYWJsZSwgMT0gZW5hYmxlKi8KIAlfX3U4CQkJcmVzZXJ2ZWQ7CiAJX191MzIJCQlzaXplOwkvKlNpemUgb2YgcGFyYW1ldGVycyBmb3IgYWxsIGJsb2NrcyovCi0Jc3RydWN0IHNuZF9wYXJhbXNfYmxvY2sJcGFyYW1zWzBdOwotfTsKKwl2b2lkCQkJKnBhcmFtczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgc25kX3NzdF9wb3N0cHJvY19pbmZvIHsKIAlfX3UzMiBzcmNfbWluOwkJLyogU3VwcG9ydGVkIFNSQyBNaW4gc2FtcGxpbmcgZnJlcSAqLwpAQCAtNDMxLDUgKzQyNSw4IEBACiAjZGVmaW5lIFNORFJWX1NTVF9GV19JTkZPCV9JT1IoJ0wnLCAweDIwLCAgc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqKQogI2RlZmluZSBTTkRSVl9TU1RfU0VUX1RBUkdFVF9ERVZJQ0UgX0lPVygnTCcsIDB4MjEsIFwKIAkJCQkJc3RydWN0IHNuZF9zc3RfdGFyZ2V0X2RldmljZSAqKQorLypEU1AgSW9jdGxzIG9uIC9kZXYvaW50ZWxfc3N0X2N0cmwgb25seSovCisjZGVmaW5lIFNORFJWX1NTVF9TRVRfQUxHTwlfSU9XKCdMJywgMHgzMCwgIHN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqKQorI2RlZmluZSBTTkRSVl9TU1RfR0VUX0FMR08JX0lPV1IoJ0wnLCAweDMxLCAgc3RydWN0IHNuZF9wcHBfcGFyYW1zICopCiAKICNlbmRpZiAvKiBfX0lOVEVMX1NTVF9JT0NUTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2lwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKaW5kZXggMzljNjdmYS4uMDc0MmRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgaXBjIGZ1bmN0aW9ucwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTc1LDE2ICs3NywxNiBAQAogCS8qVG8gY2hlY2sgaWYgTFBFIGlzIGluIHN0YWxsZWQgc3RhdGUuKi8KIAlyZXR2YWwgPSBzc3Rfc3RhbGxlZCgpOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByX2Vycigic3N0OiBpbiBzdGFsbGVkIHN0YXRlXG4iKTsKKwkJcHJfZXJyKCJpbiBzdGFsbGVkIHN0YXRlXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBwb3N0IG1lc3NhZ2UgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygicG9zdCBtZXNzYWdlIGNhbGxlZFxuIik7CiAJc3Bpbl9sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOwogCiAJLyogY2hlY2sgbGlzdCAqLwogCWlmIChsaXN0X2VtcHR5KCZzc3RfZHJ2X2N0eC0+aXBjX2Rpc3BhdGNoX2xpc3QpKSB7CiAJCS8qIGxpc3QgaXMgZW1wdHksIG1hc2sgaW1yICovCi0JCXByX2RlYnVnKCJzc3Q6IEVtcHR5IG1zZyBxdWV1ZS4uLiBtYXNraW5nXG4iKTsKKwkJcHJfZGVidWcoIkVtcHR5IG1zZyBxdWV1ZS4uLiBtYXNraW5nXG4iKTsKIAkJaW1yLmZ1bGwgPSByZWFkbChzc3RfZHJ2X2N0eC0+c2hpbSArIFNTVF9JTVJYKTsKIAkJaW1yLnBhcnQuZG9uZV9pbnRlcnJ1cHQgPSAxOwogCQkvKiBkdW1teSByZWdpc3RlciBmb3Igc2hpbSB3b3JrYXJvdW5kICovCkBAIC05Nyw3ICs5OSw3IEBACiAJaGVhZGVyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7CiAJaWYgKGhlYWRlci5wYXJ0LmJ1c3kpIHsKIAkJLyogYnVzeSwgdW5tYXNrICovCi0JCXByX2RlYnVnKCJzc3Q6IEJ1c3kgbm90IGZyZWUuLi4gdW5tYXNraW5nXG4iKTsKKwkJcHJfZGVidWcoIkJ1c3kgbm90IGZyZWUuLi4gdW5tYXNraW5nXG4iKTsKIAkJaW1yLmZ1bGwgPSByZWFkbChzc3RfZHJ2X2N0eC0+c2hpbSArIFNTVF9JTVJYKTsKIAkJaW1yLnBhcnQuZG9uZV9pbnRlcnJ1cHQgPSAwOwogCQkvKiBkdW1teSByZWdpc3RlciBmb3Igc2hpbSB3b3JrYXJvdW5kICovCkBAIC0xMDksOCArMTExLDggQEAKIAltc2cgPSBsaXN0X2VudHJ5KHNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdC5uZXh0LAogCQkJc3RydWN0IGlwY19wb3N0LCBub2RlKTsKIAlsaXN0X2RlbCgmbXNnLT5ub2RlKTsKLQlwcl9kZWJ1Zygic3N0OiBQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKLQlwcl9kZWJ1Zygic3N0OiBzaXplOiA9ICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOworCXByX2RlYnVnKCJQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKKwlwcl9kZWJ1Zygic2l6ZTogPSAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkKIAkJbWVtY3B5X3RvaW8oc3N0X2Rydl9jdHgtPm1haWxib3ggKyBTU1RfTUFJTEJPWF9TRU5ELAogCQkJbXNnLT5tYWlsYm94X2RhdGEsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CkBAIC0xNjYsMTMgKzE2OCwxMyBAQAogCQkoc3RydWN0IGlwY19oZWFkZXJfZndfaW5pdCAqKW1zZy0+bWFpbGJveDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6ICoqKiBGVyBJbml0IG1zZyBjYW1lKioqXG4iKTsKKwlwcl9kZWJ1ZygiKioqIEZXIEluaXQgbXNnIGNhbWUqKipcbiIpOwogCWlmIChpbml0LT5yZXN1bHQpIHsKIAkJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAkJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9FUlJPUjsKIAkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQlwcl9kZWJ1Zygic3N0OiBGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7Ci0JCXByX2Vycigic3N0OiBGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7CisJCXByX2RlYnVnKCJGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7CisJCXByX2VycigiRlcgSW5pdCBmYWlsZWQsIEVycm9yICV4XG4iLCBpbml0LT5yZXN1bHQpOwogCQlyZXR2YWwgPSAtaW5pdC0+cmVzdWx0OwogCQlyZXR1cm4gcmV0dmFsOwogCX0KQEAgLTE4MCwxMiArMTgyLDEzIEBACiAJCXNzdF9zZW5kX3NvdW5kX2NhcmRfdHlwZSgpOwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19SVU5OSU5HOworCXNzdF9kcnZfY3R4LT5scGVfc3RhbGxlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCXByX2RlYnVnKCJzc3Q6IEZXIFZlcnNpb24gJXguJXhcbiIsCisJcHJfZGVidWcoIkZXIFZlcnNpb24gJXguJXhcbiIsCiAJCQlpbml0LT5md192ZXJzaW9uLm1ham9yLCBpbml0LT5md192ZXJzaW9uLm1pbm9yKTsKLQlwcl9kZWJ1Zygic3N0OiBCdWlsZCBObyAleCBUeXBlICV4XG4iLAorCXByX2RlYnVnKCJCdWlsZCBObyAleCBUeXBlICV4XG4iLAogCQkJaW5pdC0+ZndfdmVyc2lvbi5idWlsZCwgaW5pdC0+ZndfdmVyc2lvbi50eXBlKTsKLQlwcl9kZWJ1Zygic3N0OiAgQnVpbGQgZGF0ZSAlcyBUaW1lICVzXG4iLAorCXByX2RlYnVnKCIgQnVpbGQgZGF0ZSAlcyBUaW1lICVzXG4iLAogCQkJaW5pdC0+YnVpbGRfaW5mby5kYXRlLCBpbml0LT5idWlsZF9pbmZvLnRpbWUpOwogCXNzdF93YWtlX3VwX2FsbG9jX2Jsb2NrKHNzdF9kcnZfY3R4LCBGV19EV05MX0lELCByZXR2YWwsIE5VTEwpOwogCXJldHVybiByZXR2YWw7CkBAIC0yMDQsMTkgKzIwNywxOSBAQAogCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzc3RfaXBjX21zZ193cSwgd3EpOwogCWludCBzdHJfaWQgPSBtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZDsKIAotCXByX2RlYnVnKCJzc3Q6IElQQyBwcm9jZXNzIGZvciAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJcHJfZGVidWcoIklQQyBwcm9jZXNzIGZvciAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CiAKIAkvKiBiYXNlZCBvbiBtc2cgaW4gbGlzdCBjYWxsIHJlc3BlY3RpdmUgaGFuZGxlciAqLwogCXN3aXRjaCAobXNnLT5oZWFkZXIucGFydC5tc2dfaWQpIHsKIAljYXNlIElQQ19TU1RfQlVGX1VOREVSX1JVTjoKIAljYXNlIElQQ19TU1RfQlVGX09WRVJfUlVOOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiAgc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQlwcl9lcnIoInN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZXJyKCJzc3Q6IEJ1ZmZlciB1bmRlci9vdmVycnVuIGZvciVkXG4iLAorCQlwcl9lcnIoIkJ1ZmZlciB1bmRlci9vdmVycnVuIGZvciAlZFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7Ci0JCXByX2Vycigic3N0OiBHb3QgVW5kZXJydW4gJiBub3QgdG8gc2VuZCBkYXRhLi4uaWdub3JlXG4iKTsKKwkJcHJfZXJyKCJHb3QgVW5kZXJydW4gJiBub3QgdG8gc2VuZCBkYXRhLi4uaWdub3JlXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIElQQ19TU1RfR0VUX1BMQVlfRlJBTUVTOgpAQCAtMjI0LDM1ICsyMjcsMzUgQEAKIAkJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtIDsKIAogCQkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IHN0cmlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQkJcHJfZXJyKCJzdHJpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJLyogY2FsbCBzc3RfcGxheV9mcmFtZSAqLwogCQkJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07Ci0JCQlwcl9kZWJ1Zygic3N0OiBzc3RfcGxheV9mcmFtZXMgZm9yICVkXG4iLAorCQkJcHJfZGVidWcoInNzdF9wbGF5X2ZyYW1lcyBmb3IgJWRcbiIsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ubG9jayk7CiAJCQlzc3RfcGxheV9mcmFtZShtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7CiAJCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ubG9jayk7CiAJCQlicmVhazsKIAkJfSBlbHNlCi0JCQlwcl9lcnIoInNzdDogc3N0X3BsYXlfZnJhbWVzIGZvciBQZW53ZWxsISFcbiIpOworCQkJcHJfZXJyKCJzc3RfcGxheV9mcmFtZXMgZm9yIFBlbndlbGwhIVxuIik7CiAKIAljYXNlIElQQ19TU1RfR0VUX0NBUFRfRlJBTUVTOgogCQlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpIHsKIAkJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCQkJLyogY2FsbCBzc3RfY2FwdHVyZV9mcmFtZSAqLwogCQkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IHN0ciBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJCXByX2Vycigic3RyIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJCXByX2RlYnVnKCJzc3Q6IHNzdF9jYXB0dXJlX2ZyYW1lcyBmb3IgJWRcbiIsCisJCQlwcl9kZWJ1Zygic3N0X2NhcHR1cmVfZnJhbWVzIGZvciAlZFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5zdHJfaWQpOwogCQkJbXV0ZXhfbG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCWlmIChzdHJlYW0tPm1tYXBwZWQgPT0gZmFsc2UgJiYKIAkJCQkJc3RyZWFtLT5zcmMgPT0gU1NUX0RSVikgewotCQkJCXByX2RlYnVnKCJzc3Q6IHdha2luZyB1cCBibG9jayBmb3IgY29weS5cbiIpOworCQkJCXByX2RlYnVnKCJ3YWtpbmcgdXAgYmxvY2sgZm9yIGNvcHkuXG4iKTsKIAkJCQlzdHJlYW0tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJCQlzdHJlYW0tPmRhdGFfYmxrLmNvbmRpdGlvbiA9IHRydWU7CiAJCQkJc3RyZWFtLT5kYXRhX2Jsay5vbiA9IGZhbHNlOwpAQCAtMjYxLDExICsyNjQsMTEgQEAKIAkJCQlzc3RfY2FwdHVyZV9mcmFtZShtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7CiAJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCX0gZWxzZQotCQkJcHJfZXJyKCJzc3Q6IHNzdF9wbGF5X2ZyYW1lcyBmb3IgUGVud2VsbCEhXG4iKTsKKwkJCXByX2Vycigic3N0X3BsYXlfZnJhbWVzIGZvciBQZW53ZWxsISFcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSVBDX0lBX1BSSU5UX1NUUklORzoKLQkJcHJfZGVidWcoInNzdDogYmVlbiBhc2tlZCB0byBwcmludCBzb21ldGhpbmcgYnkgZndcbiIpOworCQlwcl9kZWJ1ZygiYmVlbiBhc2tlZCB0byBwcmludCBzb21ldGhpbmcgYnkgZndcbiIpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKQEAgLTI3NywxMiArMjgwLDEyIEBACiAKIAljYXNlIElQQ19TU1RfU1RSRUFNX1BST0NFU1NfRkFUQUxfRVJSOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQotCQlwcl9lcnIoInNzdDogY29kZWMgZmF0YWwgZXJyb3IgJXggc3RyZWFtICVkLi4uXG4iLAorCQlwcl9lcnIoImNvZGVjIGZhdGFsIGVycm9yICV4IHN0cmVhbSAlZC4uLlxuIiwKIAkJCQltc2ctPmhlYWRlci5mdWxsLCBtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7Ci0JCXByX2Vycigic3N0OiBEcm9wcGluZyB0aGUgc3RyZWFtXG4iKTsKKwkJcHJfZXJyKCJEcm9wcGluZyB0aGUgc3RyZWFtXG4iKTsKIAkJc3N0X2Ryb3Bfc3RyZWFtKG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfTFBFX0dFVFRJTkdfU1RBTExFRDoKQEAgLTI5Myw3ICsyOTYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBJbGxlZ2FsIGNhc2UgKi8KLQkJcHJfZXJyKCJzc3Q6IFVuaGFuZGxlZCBtc2cgJXggaGVhZGVyICV4XG4iLAorCQlwcl9lcnIoIlVuaGFuZGxlZCBtc2cgJXggaGVhZGVyICV4XG4iLAogCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIuZnVsbCk7CiAJfQogCXNzdF9jbGVhcl9pbnRlcnJ1cHQoKTsKQEAgLTMyMiw3ICszMjUsNyBAQAogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewogCQkJc3N0X2Rydl9jdHgtPnRndF9kZXZfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+dGd0X2Rldl9ibGsucmV0X2NvZGUgPQogCQkJCQktbXNnLT5oZWFkZXIucGFydC5kYXRhOwpAQCAtMzMzLDYgKzMzNiw1NSBAQAogCQkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKIAkJfQogCQlicmVhazsKKwljYXNlIElQQ19JQV9BTEdfUEFSQU1TOiB7CisJCXByX2RlYnVnKCJzc3Q6SVBDX0FMR19QQVJBTVMgcmVzcG9uc2UgJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOworCQlwcl9kZWJ1Zygic3N0OiBkYXRhIHZhbHVlICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOworCQlwcl9kZWJ1Zygic3N0OiBsYXJnZSB2YWx1ZSAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5sYXJnZSk7CisKKwkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7CisJCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgeworCQkJCXByX2RlYnVnKCJzc3Q6IGFsZyBzZXQgc3VjY2Vzc1xuIik7CisJCQkJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLnJldF9jb2RlID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoInNzdDogYWxnIHNldCBmYWlsZWRcbiIpOworCQkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5yZXRfY29kZSA9CisJCQkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKG1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgeworCQkJc3RydWN0IHNuZF9wcHBfcGFyYW1zICptYWlsYm94X3BhcmFtcywgKmdldF9wYXJhbXM7CisJCQljaGFyICpwYXJhbXM7CisKKwkJCXByX2RlYnVnKCJzc3Q6IGFsZyBnZXQgc3VjY2Vzc1xuIik7CisJCQltYWlsYm94X3BhcmFtcyA9IChzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgKiltc2ctPm1haWxib3g7CisJCQlnZXRfcGFyYW1zID0ga3phbGxvYyhzaXplb2YoKmdldF9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChnZXRfcGFyYW1zID09IE5VTEwpIHsKKwkJCQlwcl9lcnIoInNzdDogb3V0IG9mIG1lbW9yeSBmb3IgQUxHIFBBUkFNUyIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5X2Zyb21pbyhnZXRfcGFyYW1zLCBtYWlsYm94X3BhcmFtcywKKwkJCQkJCQlzaXplb2YoKmdldF9wYXJhbXMpKTsKKwkJCWdldF9wYXJhbXMtPnBhcmFtcyA9IGt6YWxsb2MobWFpbGJveF9wYXJhbXMtPnNpemUsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoZ2V0X3BhcmFtcy0+cGFyYW1zID09IE5VTEwpIHsKKwkJCQlrZnJlZShnZXRfcGFyYW1zKTsKKwkJCQlwcl9lcnIoInNzdDogb3V0IG9mIG1lbW9yeSBmb3IgQUxHIFBBUkFNUyBibG9jayIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcGFyYW1zID0gbXNnLT5tYWlsYm94OworCQkJcGFyYW1zID0gcGFyYW1zICsgc2l6ZW9mKCptYWlsYm94X3BhcmFtcykgLSBzaXplb2YodTMyKTsKKwkJCW1lbWNweV9mcm9taW8oZ2V0X3BhcmFtcy0+cGFyYW1zLCBwYXJhbXMsCisJCQkJCQkJZ2V0X3BhcmFtcy0+c2l6ZSk7CisJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsucmV0X2NvZGUgPSAwOworCQkJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLmRhdGEgPSBnZXRfcGFyYW1zOworCQl9CisKKwkJaWYgKHNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5vbiA9PSB0cnVlKSB7CisJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuY29uZGl0aW9uID0gdHJ1ZTsKKwkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKKwkJfQorCQlicmVhazsKKwl9CiAJY2FzZSBJUENfSUFfR0VUX0ZXX0lORk86IHsKIAkJc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqZndfaW5mbyA9CiAJCQkoc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqKW1zZy0+bWFpbGJveDsKQEAgLTM0MCw3ICszOTIsNyBAQAogCQkJaW50IG1ham9yID0gZndfaW5mby0+ZndfdmVyc2lvbi5tYWpvcjsKIAkJCWludCBtaW5vciA9IGZ3X2luZm8tPmZ3X3ZlcnNpb24ubWlub3I7CiAJCQlpbnQgYnVpbGQgPSBmd19pbmZvLT5md192ZXJzaW9uLmJ1aWxkOwotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlwcl9kZWJ1ZygiSU5GTzogKioqRlcqKiogPSAlMDJkLiUwMmQuJTAyZFxuIiwKIAkJCQkJbWFqb3IsIG1pbm9yLCBidWlsZCk7CkBAIC0zNDksMTMgKzQwMSwxMyBAQAogCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9md19pbmZvKSk7CiAJCQlzc3RfZHJ2X2N0eC0+ZndfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5yZXRfY29kZSA9CiAJCQkJCS1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KIAkJaWYgKHNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNZW1jb3B5IHN1Y2NlZGRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTWVtY29weSBzdWNjZWVkZWRcbiIpOwogCQkJc3N0X2Rydl9jdHgtPmZ3X2luZm9fYmxrLm9uID0gZmFsc2U7CiAJCQlzc3RfZHJ2X2N0eC0+ZndfaW5mb19ibGsuY29uZGl0aW9uID0gdHJ1ZTsKIAkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKQEAgLTM2NCwxMSArNDE2LDExIEBACiAJfQogCWNhc2UgSVBDX0lBX1NFVF9TVFJFQU1fTVVURToKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkgICAgICAgbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJc3N0X2Rydl9jdHgtPm11dGVfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT5tdXRlX2luZm9fYmxrLnJldF9jb2RlID0KIAkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKQEAgLTM4MiwxMSArNDM0LDExIEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX1NFVF9TVFJFQU1fVk9MOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwKIAkJCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0KQEAgLTQwMiwxNSArNDU0LDE1IEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0dFVF9TVFJFQU1fVk9MOgogCQlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkgewotCQkJcHJfZGVidWcoInNzdDogTGFyZ2UgTXNnIFJlY2VpdmVkIFN1Y2Nlc3NmdWxseVxuIik7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIkxhcmdlIE1zZyBSZWNlaXZlZCBTdWNjZXNzZnVsbHlcbiIpOworCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJICAgICAgIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCW1lbWNweV9mcm9taW8oc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5kYXRhLAogCQkJCSh2b2lkICopIG1zZy0+bWFpbGJveCwKIAkJCQlzaXplb2Yoc3RydWN0IHNuZF9zc3Rfdm9sKSk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIk1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5yZXRfY29kZSA9CiAJCQkJCS1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CkBAIC00MjQsMTggKzQ3NiwxOCBAQAogCiAJY2FzZSBJUENfSUFfR0VUX1NUUkVBTV9QQVJBTVM6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJCWlmIChtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBHZXQgc3RyZWFtIGxhcmdlIHN1Y2Nlc3NcbiIpOworCQkJcHJfZGVidWcoIkdldCBzdHJlYW0gbGFyZ2Ugc3VjY2Vzc1xuIik7CiAJCQltZW1jcHlfZnJvbWlvKHN0cl9pbmZvLT5jdHJsX2Jsay5kYXRhLAogCQkJCSgodm9pZCAqKShtc2ctPm1haWxib3gpKSwKIAkJCQlzaXplb2Yoc3RydWN0IHNuZF9zc3RfZndfZ2V0X3N0cmVhbV9wYXJhbXMpKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCJNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CkBAIC00NDcsMTkgKzQ5OSwxOSBAQAogCQlicmVhazsKIAljYXNlIElQQ19JQV9ERUNPREVfRlJBTUVTOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCQlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCQlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQltZW1jcHlfZnJvbWlvKHN0cl9pbmZvLT5kYXRhX2Jsay5kYXRhLAogCQkJCQkoKHZvaWQgKikobXNnLT5tYWlsYm94KSksCiAJCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9kZWNvZGVfaW5mbykpOwogCQkJc3RyX2luZm8tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIk1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5kYXRhX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KQEAgLTQ3MSwxNyArNTIzLDE3IEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0RSQUlOX1NUUkVBTToKIAkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQlwcl9lcnIoInN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlID0gMDsKIAogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCkBAIC00OTYsNyArNTQ4LDcgQEAKIAogCWNhc2UgSVBDX0lBX0RST1BfU1RSRUFNOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHIgaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCQlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwpAQCAtNTA0LDEyICs1NTYsMTIgQEAKIAkJCXN0cnVjdCBzbmRfc3N0X2Ryb3BfcmVzcG9uc2UgKmRyb3BfcmVzcCA9CiAJCQkJKHN0cnVjdCBzbmRfc3N0X2Ryb3BfcmVzcG9uc2UgKiltc2ctPm1haWxib3g7CiAKLQkJCXByX2RlYnVnKCJzc3Q6IERyb3AgcmV0IGJ5dGVzICV4XG4iLCBkcm9wX3Jlc3AtPmJ5dGVzKTsKKwkJCXByX2RlYnVnKCJEcm9wIHJldCBieXRlcyAleFxuIiwgZHJvcF9yZXNwLT5ieXRlcyk7CiAKIAkJCXN0cl9pbmZvLT5jdXJyX2J5dGVzID0gZHJvcF9yZXNwLT5ieXRlczsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9ICAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CkBAIC01MjEsMTAgKzU3MywxMCBAQAogCQlicmVhazsKIAljYXNlIElQQ19JQV9FTkFCTEVfUlhfVElNRV9TTE9UOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogUlhfVElNRV9TTE9UIHN1Y2Nlc3NcbiIpOworCQkJcHJfZGVidWcoIlJYX1RJTUVfU0xPVCBzdWNjZXNzXG4iKTsKIAkJCXNzdF9kcnZfY3R4LT5oc19pbmZvX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwKIAkJCQltc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPmhzX2luZm9fYmxrLnJldF9jb2RlID0KQEAgLTU0MSwxNyArNTkzLDE3IEBACiAJY2FzZSBJUENfSUFfU0VUX1NUUkVBTV9QQVJBTVM6CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6ICBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2VycigiIHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTY0LDkgKzYxNiw5IEBACiAKIAljYXNlIElQQ19JQV9GUkVFX1NUUkVBTToKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSAlZCBmcmVlZFxuIiwgc3RyX2lkKTsKKwkJCXByX2RlYnVnKCJTdHJlYW0gJWQgZnJlZWRcbiIsIHN0cl9pZCk7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogRnJlZSBmb3IgJWQgcmV0IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCJGcmVlIGZvciAlZCByZXQgZXJyb3IgJXhcbiIsCiAJCQkJICAgICAgIHN0cl9pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJfQogCQlicmVhazsKQEAgLTU3NSw3ICs2MjcsNyBAQAogCQlzdHJ1Y3Qgc25kX3NzdF9hbGxvY19yZXNwb25zZSAqcmVzcCA9CiAJCQkJKHN0cnVjdCBzbmRfc3N0X2FsbG9jX3Jlc3BvbnNlICopbXNnLT5tYWlsYm94OwogCQlpZiAocmVzcC0+c3RyX3R5cGUucmVzdWx0KQotCQkJcHJfZXJyKCJzc3Q6IGVycm9yIGFsbG9jIHN0cmVhbSA9ICV4XG4iLAorCQkJcHJfZXJyKCJlcnJvciBhbGxvYyBzdHJlYW0gPSAleFxuIiwKIAkJCQkgICAgICAgcmVzcC0+c3RyX3R5cGUucmVzdWx0KTsKIAkJc3N0X2FsbG9jX3N0cmVhbV9yZXNwb25zZShzdHJfaWQsIHJlc3ApOwogCQlicmVhazsKQEAgLTU4NCwyMSArNjM2LDIxIEBACiAJY2FzZSBJUENfSUFfUExBWV9GUkFNRVM6CiAJY2FzZSBJUENfSUFfQ0FQVF9GUkFNRVM6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iICwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBBY2sgZm9yIHBsYXkvY2FwdCBmcmFtZXMgcmVjaXZlZFxuIik7CisJCXByX2RlYnVnKCJBY2sgZm9yIHBsYXkvY2FwdCBmcmFtZXMgcmVjZWl2ZWRcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSVBDX0lBX1BSRVBfTElCX0ROTEQ6IHsKIAkJc3RydWN0IHNuZF9zc3Rfc3RyX3R5cGUgKnN0cl90eXBlID0KIAkJCShzdHJ1Y3Qgc25kX3NzdF9zdHJfdHlwZSAqKW1zZy0+bWFpbGJveDsKLQkJcHJfZGVidWcoInNzdDogUHJlcCBMaWIgZG93bmxvYWQgJXhcbiIsCisJCXByX2RlYnVnKCJQcmVwIExpYiBkb3dubG9hZCAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCWlmIChzdHJfdHlwZS0+cmVzdWx0KQotCQkJcHJfZXJyKCJzc3Q6IFByZXAgbGliIGRvd25sb2FkICV4XG4iLCBzdHJfdHlwZS0+cmVzdWx0KTsKKwkJCXByX2VycigiUHJlcCBsaWIgZG93bmxvYWQgJXhcbiIsIHN0cl90eXBlLT5yZXN1bHQpOwogCQllbHNlCi0JCQlwcl9kZWJ1Zygic3N0OiBDYW4gZG93bmxvYWQgY29kZWMgbm93Li4uXG4iKTsKKwkJCXByX2RlYnVnKCJDYW4gZG93bmxvYWQgY29kZWMgbm93Li4uXG4iKTsKIAkJc3N0X3dha2VfdXBfYWxsb2NfYmxvY2soc3N0X2Rydl9jdHgsIHN0cl9pZCwKIAkJCQlzdHJfdHlwZS0+cmVzdWx0LCBOVUxMKTsKIAkJYnJlYWs7CkBAIC02MDksMTIgKzY2MSwxMiBAQAogCQkJKHN0cnVjdCBzbmRfc3N0X2xpYl9kb3dubG9hZF9pbmZvICopbXNnLT5tYWlsYm94OwogCQlpbnQgcmV0dmFsID0gcmVzcC0+cmVzdWx0OwogCi0JCXByX2RlYnVnKCJzc3Q6IExpYiBkb3dubG9hZGVkICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CisJCXByX2RlYnVnKCJMaWIgZG93bmxvYWRlZCAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQlpZiAocmVzcC0+cmVzdWx0KSB7Ci0JCQlwcl9lcnIoInNzdDogZXJyIGluIGxpYiBkbG9hZCAleFxuIiwgcmVzcC0+cmVzdWx0KTsKKwkJCXByX2VycigiZXJyIGluIGxpYiBkbG9hZCAleFxuIiwgcmVzcC0+cmVzdWx0KTsKIAkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJzc3Q6IENvZGVjIGRvd25sb2FkIGNvbXBsZXRlLi4uXG4iKTsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvZGVjIFR5cGUgJWQgVmVyICVkIEJ1aWx0ICVzOiAlc1xuIiwKKwkJCXByX2RlYnVnKCJDb2RlYyBkb3dubG9hZCBjb21wbGV0ZS4uLlxuIik7CisJCQlwcl9kZWJ1ZygiY29kZWMgVHlwZSAlZCBWZXIgJWQgQnVpbHQgJXM6ICVzXG4iLAogCQkJCXJlc3AtPmRsb2FkX2xpYi5saWJfaW5mby5saWJfdHlwZSwKIAkJCQlyZXNwLT5kbG9hZF9saWIubGliX2luZm8ubGliX3ZlcnNpb24sCiAJCQkJcmVzcC0+ZGxvYWRfbGliLmxpYl9pbmZvLmJfZGF0ZSwKQEAgLTYzOSwxNyArNjkxLDE3IEBACiAJY2FzZSBJUENfSUFfR0VUX0ZXX0JVSUxEX0lORjogewogCQlzdHJ1Y3Qgc3N0X2Z3X2J1aWxkX2luZm8gKmJ1aWxkID0KIAkJCShzdHJ1Y3Qgc3N0X2Z3X2J1aWxkX2luZm8gKiltc2ctPm1haWxib3g7Ci0JCXByX2RlYnVnKCJzc3Q6IEJ1aWxkIGRhdGU6JXNUaW1lOiVzIiwgYnVpbGQtPmRhdGUsIGJ1aWxkLT50aW1lKTsKKwkJcHJfZGVidWcoIkJ1aWxkIGRhdGU6JXNUaW1lOiVzIiwgYnVpbGQtPmRhdGUsIGJ1aWxkLT50aW1lKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSVBDX0lBX1NFVF9QTUlDX1RZUEU6CiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX1NUQVJUX1NUUkVBTToKLQkJcHJfZGVidWcoInNzdDogcmVwbHkgZm9yIFNUQVJUIFNUUkVBTSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJCXByX2RlYnVnKCJyZXBseSBmb3IgU1RBUlQgU1RSRUFNICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogSWxsZWdhbCBjYXNlICovCi0JCXByX2Vycigic3N0OiBwcm9jZXNzIHJlcGx5OmRlZmF1bHQgPSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJCXByX2VycigicHJvY2VzcyByZXBseTpkZWZhdWx0ID0gJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOwogCX0KIAlzc3RfY2xlYXJfaW50ZXJydXB0KCk7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfcHZ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYwppbmRleCA2NDg3ZTE5Li4wMWY4YzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYwpAQCAtMjksNiArMjksOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC02MCw3ICs2Miw3IEBACiAJCX0KIAl9CiAJaWYgKGkgPT0gTUFYX0FDVElWRV9TVFJFQU0pIHsKLQkJcHJfZXJyKCJzc3Q6IG1heCBhbGxvY19zdHJlYW0gcmVhY2hlZCIpOworCQlwcl9lcnIoIm1heCBhbGxvY19zdHJlYW0gcmVhY2hlZFxuIik7CiAJCWkgPSAtRUJVU1k7IC8qIGFjdGl2ZSBzdHJlYW0gbGltaXQgcmVhY2hlZCAqLwogCX0KIAlyZXR1cm4gaTsKQEAgLTg0LDE0ICs4NiwxNCBAQAogCQkJCWJsb2NrLT5jb25kaXRpb24pKSB7CiAJCS8qIGV2ZW50IHdha2UgKi8KIAkJaWYgKGJsb2NrLT5yZXRfY29kZSA8IDApIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gZmFpbGVkICVkXG4iLCBibG9jay0+cmV0X2NvZGUpOworCQkJcHJfZXJyKCJzdHJlYW0gZmFpbGVkICVkXG4iLCBibG9jay0+cmV0X2NvZGUpOwogCQkJcmV0dmFsID0gLUVCVVNZOwogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogZXZlbnQgdXBcbiIpOworCQkJcHJfZGVidWcoImV2ZW50IHVwXG4iKTsKIAkJCXJldHZhbCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQlwcl9lcnIoInNzdDogc2lnbmFsIGludGVycnVwdGVkXG4iKTsKKwkJcHJfZXJyKCJzaWduYWwgaW50ZXJydXB0ZWRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVFI7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0xMTUsMTggKzExNywxOCBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0IC0gd2FpdGluZy4uLi5cbiIpOworCXByX2RlYnVnKCJzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgLSB3YWl0aW5nLi4uLlxuIik7CiAJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlLAogCQkJCQkJYmxvY2stPmNvbmRpdGlvbiwKIAkJCQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKSB7CiAJCWlmIChibG9jay0+cmV0X2NvZGUgPCAwKQotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CisJCQlwcl9lcnIoInN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CiAJCWVsc2UKLQkJCXByX2RlYnVnKCJzc3Q6IGV2ZW50IHVwXG4iKTsKKwkJCXByX2RlYnVnKCJldmVudCB1cFxuIik7CiAJCXJldHZhbCA9IGJsb2NrLT5yZXRfY29kZTsKIAl9IGVsc2UgewogCQlibG9jay0+b24gPSBmYWxzZTsKLQkJcHJfZXJyKCJzc3Q6IHRpbWVvdXQgb2NjdXJlZC4uLlxuIik7CisJCXByX2VycigidGltZW91dCBvY2N1cnJlZC4uLlxuIik7CiAJCS8qc2V0dGluZyBmaXJtd2FyZSBzdGF0ZSBhcyB1bmluaXQgc28gdGhhdCB0aGUKIAkJZmlybXdhcmUgd2lsbCBnZXQgcmUtZG93bmxvYWRlZCBvbiBuZXh0IHJlcXVlc3QKIAkJdGhpcyBpcyBiZWNhdXNlIGZpcm1hcmUgbm90IHJlc3BvbmRpbmcgZm9yIDUgc2VjCkBAIC0xNTYsMTggKzE1OCwxOCBAQAogCS8qIE5PVEU6CiAJT2JzZXJ2ZWQgdGhhdCBGVyBwcm9jZXNzZXMgdGhlIGFsbG9jIG1zZyBhbmQgcmVwbGllcyBldmVuCiAJYmVmb3JlIHRoZSBhbGxvYyB0aHJlYWQgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbiAqLwotCXByX2RlYnVnKCJzc3Q6IHdhaXRpbmcgZm9yICV4LCBjb25kaXRpb24gJXhcbiIsCisJcHJfZGVidWcoIndhaXRpbmcgZm9yICV4LCBjb25kaXRpb24gJXhcbiIsCiAJCSAgICAgICBibG9jay0+c3N0X2lkLCBibG9jay0+b3BzX2Jsb2NrLmNvbmRpdGlvbik7CiAJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlLAogCQkJCWJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoU1NUX0JMT0NLX1RJTUVPVVQpKSkgewogCQkvKiBldmVudCB3YWtlICovCi0JCXByX2RlYnVnKCJzc3Q6IEV2ZW50IHdha2UgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKLQkJcHJfZGVidWcoInNzdDogbWVzc2FnZSByZXQ6ICVkXG4iLCBibG9jay0+b3BzX2Jsb2NrLnJldF9jb2RlKTsKKwkJcHJfZGVidWcoIkV2ZW50IHdha2UgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKKwkJcHJfZGVidWcoIm1lc3NhZ2UgcmV0OiAlZFxuIiwgYmxvY2stPm9wc19ibG9jay5yZXRfY29kZSk7CiAJCXJldHZhbCA9IGJsb2NrLT5vcHNfYmxvY2sucmV0X2NvZGU7CiAJfSBlbHNlIHsKIAkJYmxvY2stPm9wc19ibG9jay5vbiA9IGZhbHNlOwotCQlwcl9lcnIoInNzdDogV2FpdCB0aW1lZC1vdXQgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKKwkJcHJfZXJyKCJXYWl0IHRpbWVkLW91dCAleFxuIiwgYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24pOwogCQkvKiBzZXR0aWduIGZpcm13YXJlIHN0YXRlIGFzIHVuaW5pdCBzbyB0aGF0IHRoZQogCQlmaXJtd2FyZSB3aWxsIGdldCByZWRvd25sb2FkZWQgb24gbmV4dCByZXF1ZXN0CiAJCXRoaXMgaXMgYmVjYXVzZSBmaXJtYXJlIG5vdCByZXNwb25kaW5nIGZvciA1IHNlYwpAQCAtMTkyLDE0ICsxOTQsMTQgQEAKIAogCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfcG9zdCksIEdGUF9BVE9NSUMpOwogCWlmICghbXNnKSB7Ci0JCXByX2Vycigic3N0OiBremFsbG9jIG1zZyBmYWlsZWRcbiIpOworCQlwcl9lcnIoImt6YWxsb2MgbXNnIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW1zZy0+bWFpbGJveF9kYXRhID0ga3phbGxvYyhTU1RfTUFJTEJPWF9TSVpFLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW1zZy0+bWFpbGJveF9kYXRhKSB7CiAJCWtmcmVlKG1zZyk7Ci0JCXByX2Vycigic3N0OiBremFsbG9jIG1haWxib3hfZGF0YSBmYWlsZWQiKTsKKwkJcHJfZXJyKCJremFsbG9jIG1haWxib3hfZGF0YSBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfTsKIAkqYXJnID0gbXNnOwpAQCAtMjE5LDcgKzIyMSw3IEBACiAKIAltc2cgPSBremFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFtc2cpIHsKLQkJcHJfZXJyKCJzc3Q6IGt6YWxsb2MgbXNnIGZhaWxlZFxuIik7CisJCXByX2Vycigia3phbGxvYyBtc2cgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1zZy0+bWFpbGJveF9kYXRhID0gTlVMTDsKQEAgLTI5MCwxMCArMjkyLDEwIEBACiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCiAJaWYgKHNzdF9jcmVhdGVfc2hvcnRfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcHJfZGVidWcoInNzdDogaXBjIG1lc3NhZ2Ugc2VuZGluZzogRU5BQkxFX1JYX1RJTUVfU0xPVFxuIik7CisJcHJfZGVidWcoImlwYyBtZXNzYWdlIHNlbmRpbmc6IEVOQUJMRV9SWF9USU1FX1NMT1RcbiIpOwogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9FTkFCTEVfUlhfVElNRV9TTE9ULCAwLCAwKTsKIAltc2ctPmhlYWRlci5wYXJ0LmRhdGEgPSBzdGF0dXM7CiAJc3N0X2Rydl9jdHgtPmhzX2luZm9fYmxrLmNvbmRpdGlvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYwppbmRleCBiMmM0YjcwLi43OTVlNDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYwpAQCAtMjYsNiArMjYsOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RyZWFtIG9wZXJhdGlvbnMgb2YgU1NUIGRyaXZlcgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ1LDggKzQ3LDggQEAKICAqLwogaW50IHNzdF9jaGVja19kZXZpY2VfdHlwZSh1MzIgZGV2aWNlLCB1MzIgbnVtX2NoYW4sIHUzMiAqcGNtX3Nsb3QpCiB7Ci0JaWYgKGRldmljZSA+PSBNQVhfTlVNX1NUUkVBTVMpIHsKLQkJcHJfZGVidWcoInNzdDogZGV2aWNlIHR5cGUgaW52YWxpZCAlZFxuIiwgZGV2aWNlKTsKKwlpZiAoZGV2aWNlID4gTUFYX05VTV9TVFJFQU1TX01GTEQpIHsKKwkJcHJfZGVidWcoImRldmljZSB0eXBlIGludmFsaWQgJWRcbiIsIGRldmljZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoc3N0X2Rydl9jdHgtPnN0cmVhbXNbZGV2aWNlXS5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQpIHsKQEAgLTcxLDE1ICs3MywxNSBAQAogCQllbHNlIGlmIChkZXZpY2UgPT0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRSAmJiBudW1fY2hhbiA9PSA0KQogCQkJKnBjbV9zbG90ID0gMHgwRjsKIAkJZWxzZSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBObyBjb25kaXRpb24gc2F0aXNmaWVkLi4gcmV0IGVyclxuIik7CisJCQlwcl9kZWJ1ZygiTm8gY29uZGl0aW9uIHNhdGlzZmllZC4uIHJldCBlcnJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewotCQlwcl9kZWJ1Zygic3N0OiB0aGlzIHN0cmVhbSBzdGF0ZSBpcyBub3QgdW5pLWluaXQsIGlzICVkXG4iLAorCQlwcl9kZWJ1ZygidGhpcyBzdHJlYW0gc3RhdGUgaXMgbm90IHVuaS1pbml0LCBpcyAlZFxuIiwKIAkJCQlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tkZXZpY2VdLnN0YXR1cyk7CiAJCXJldHVybiAtRUJBRFJRQzsKIAl9Ci0JcHJfZGVidWcoInNzdDogcmV0dXJuaW5nIHNsb3QgJXhcbiIsICpwY21fc2xvdCk7CisJcHJfZGVidWcoInJldHVybmluZyBzbG90ICV4XG4iLCAqcGNtX3Nsb3QpOwogCXJldHVybiAwOwogfQogLyoqCkBAIC05Niw3ICs5OCw3IEBACiAJCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tpXS5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQpCiAJCQlyZXR1cm4gaTsKIAl9Ci0JcHJfZGVidWcoInNzdDogRGlkbnQgZmluZCBlbXB0eSBzdHJlYW0gZm9yIG1yc3RcbiIpOworCXByX2RlYnVnKCJEaWRudCBmaW5kIGVtcHR5IHN0cmVhbSBmb3IgbXJzdFxuIik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtMzA1LDcgKzMwNyw3IEBACiAJCWlmIChzdHJfaW5mby0+cHJldiA9PSBTVFJFQU1fVU5fSU5JVCkKIAkJCXJldHVybiAtRUJBRFJRQzsKIAkJaWYgKHN0cl9pbmZvLT5jdHJsX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9lcnIoIlNTVCBFUlI6IGNvbnRyb2wgcGF0aCBpcyBpbiB1c2VcbiAiKTsKKwkJCXByX2VycigiU1NUIEVSUjogY29udHJvbCBwYXRoIGlzIGluIHVzZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpCkBAIC0zMzMsNyArMzM1LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FQkFEUlFDOwotCQlwcl9lcnIoIlNTVCBFUlI6QkFEUVJDIGZvciBzdHJlYW1cbiAiKTsKKwkJcHJfZXJyKCJTU1QgRVJSOiBCQURRUkMgZm9yIHN0cmVhbVxuIik7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTQ2OCw3ICs0NzAsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVCQURSUUM7Ci0JCXByX2VycigiU1NUIEVSUjpCQURRUkMgZm9yIHN0cmVhbVxuIik7CisJCXByX2VycigiU1NUIEVSUjogQkFEUVJDIGZvciBzdHJlYW1cbiIpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtX2VuY29kZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbV9lbmNvZGVkLmMKaW5kZXggNWM0NTU2MC4uODU3ODliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtX2VuY29kZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW1fZW5jb2RlZC5jCkBAIC0yNiwxMyArMjYsMTUgQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cmVhbSBvcGVyYXRpb25zIG9mIFNTVCBkcml2ZXIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KICNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgotI2luY2x1ZGUgIi4uLy4uLy4uL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmgiCisjaW5jbHVkZSA8bGludXgvcmFyX3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vbWVtcmFyL21lbXJhci5oIgogI2VuZGlmCiAjaW5jbHVkZSAiaW50ZWxfc3N0X2lvY3RsLmgiCiAjaW5jbHVkZSAiaW50ZWxfc3N0LmgiCkBAIC01Myw3ICs1NSw3IEBACiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKIAlzdHJ1Y3Qgc25kX3NzdF9md19nZXRfc3RyZWFtX3BhcmFtcyAqZndfcGFyYW1zOwogCi0JcHJfZGVidWcoInNzdDogZ2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImdldF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC02MSwxNiArNjMsMTYgQEAKIAlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9VTl9JTklUKSB7CiAJCWlmIChzdHJfaW5mby0+Y3RybF9ibGsub24gPT0gdHJ1ZSkgewotCQkJcHJfZXJyKCJzc3Q6IGNvbnRyb2wgcGF0aCBpbiB1c2VcbiIpOworCQkJcHJfZXJyKCJjb250cm9sIHBhdGggaW4gdXNlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChzc3RfY3JlYXRlX3Nob3J0X21zZygmbXNnKSkgewotCQkJcHJfZXJyKCJzc3Q6IG1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZndfcGFyYW1zID0ga3phbGxvYyhzaXplb2YoKmZ3X3BhcmFtcyksIEdGUF9BVE9NSUMpOwogCQlpZiAoIWZ3X3BhcmFtcykgewotCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxjb2F0aW9uIGZhaWxlZFxuICIpOworCQkJcHJfZXJyKCJtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJa2ZyZWUobXNnKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMDQsNyArMTA2LDcgQEAKIAkJZ2V0X3BhcmFtcy0+Y29kZWNfcGFyYW1zLnN0cmVhbV90eXBlID0gc3RyX2luZm8tPnN0cl90eXBlOwogCQlrZnJlZShmd19wYXJhbXMpOwogCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSBpcyBub3QgaW4gdGhlIGluaXQgc3RhdGVcbiIpOworCQlwcl9kZWJ1ZygiU3RyZWFtIGlzIG5vdCBpbiB0aGUgaW5pdCBzdGF0ZVxuIik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMjUsMTcgKzEyNywxNyBAQAogCiAJQlVHX09OKCFzdHJfcGFyYW0pOwogCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLm9wcyAhPSBzdHJfcGFyYW0tPm9wcykgewotCQlwcl9lcnIoInNzdDogSW52YWxpZCBvcGVyYXRpb25cbiIpOworCQlwcl9lcnIoIkludmFsaWQgb3BlcmF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JcHJfZGVidWcoInNzdDogc2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoInNldF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwogCXN0cl9pbmZvID0gICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLnN0YXR1cyA9PSBTVFJFQU1fSU5JVCkgewogCQlpZiAoc3RyX2luZm8tPmN0cmxfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2Vycigic3N0OiBjb250cm9sIHBhdGggaW4gdXNlXG4iKTsKKwkJCXByX2VycigiY29udHJvbCBwYXRoIGluIHVzZVxuIik7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCQlpZiAoc3N0X2NyZWF0ZV9sYXJnZV9tc2coJm1zZykpCkBAIC0xNjMsNyArMTY1LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FQkFEUlFDOwotCQlwcl9lcnIoInNzdDogQkFEUVJDIGZvciBzdHJlYW1cbiIpOworCQlwcl9lcnIoIkJBRFFSQyBmb3Igc3RyZWFtXG4iKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4Myw3ICsxODUsNyBAQAogCXN0cnVjdCBzbmRfc3N0X3ZvbCAqZndfZ2V0X3ZvbDsKIAlpbnQgc3RyX2lkID0gZ2V0X3ZvbC0+c3RyZWFtX2lkOwogCi0JcHJfZGVidWcoInNzdDogZ2V0IHZvbCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJnZXQgdm9sIGNhbGxlZFxuIik7CiAKIAlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTk1LDcgKzE5Nyw3IEBACiAJc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5vbiA9IHRydWU7CiAJZndfZ2V0X3ZvbCA9IGt6YWxsb2Moc2l6ZW9mKCpmd19nZXRfdm9sKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFmd19nZXRfdm9sKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWtmcmVlKG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIwOSwxMCArMjExLDEwIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dmFsID0gLUVJTzsKIAllbHNlIHsKLQkJcHJfZGVidWcoInNzdDogc3RyZWFtIGlkICVkXG4iLCBmd19nZXRfdm9sLT5zdHJlYW1faWQpOwotCQlwcl9kZWJ1Zygic3N0OiB2b2x1bWUgJWRcbiIsIGZ3X2dldF92b2wtPnZvbHVtZSk7Ci0JCXByX2RlYnVnKCJzc3Q6IHJhbXAgZHVyYXRpb24gJWRcbiIsIGZ3X2dldF92b2wtPnJhbXBfZHVyYXRpb24pOwotCQlwcl9kZWJ1Zygic3N0OiByYW1wX3R5cGUgJWRcbiIsIGZ3X2dldF92b2wtPnJhbXBfdHlwZSk7CisJCXByX2RlYnVnKCJzdHJlYW0gaWQgJWRcbiIsIGZ3X2dldF92b2wtPnN0cmVhbV9pZCk7CisJCXByX2RlYnVnKCJ2b2x1bWUgJWRcbiIsIGZ3X2dldF92b2wtPnZvbHVtZSk7CisJCXByX2RlYnVnKCJyYW1wIGR1cmF0aW9uICVkXG4iLCBmd19nZXRfdm9sLT5yYW1wX2R1cmF0aW9uKTsKKwkJcHJfZGVidWcoInJhbXBfdHlwZSAlZFxuIiwgZndfZ2V0X3ZvbC0+cmFtcF90eXBlKTsKIAkJbWVtY3B5KGdldF92b2wsIGZ3X2dldF92b2wsIHNpemVvZigqZndfZ2V0X3ZvbCkpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjMxLDEwICsyMzMsMTAgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CiAKLQlwcl9kZWJ1Zygic3N0OiBzZXQgdm9sIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNldCB2b2wgY2FsbGVkXG4iKTsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9TRVRfU1RSRUFNX1ZPTCwgMSwKQEAgLTI1NCw3ICsyNTYsNyBAQAogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKIAkJCSZzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLCBTU1RfQkxPQ0tfVElNRU9VVCk7CiAJaWYgKHJldHZhbCkgewotCQlwcl9lcnIoInNzdDogZXJyb3IgaW4gc2V0X3ZvbCA9ICVkXG4iLCByZXR2YWwpOworCQlwcl9lcnIoImVycm9yIGluIHNldF92b2wgPSAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI3MywxMCArMjc1LDEwIEBACiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCi0JcHJfZGVidWcoInNzdDogc2V0IG11dGUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic2V0IG11dGUgY2FsbGVkXG4iKTsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9TRVRfU1RSRUFNX01VVEUsIDEsCkBAIC0yOTcsNyArMjk5LDcgQEAKIAlyZXR2YWwgPSBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgsCiAJCQkmc3N0X2Rydl9jdHgtPm11dGVfaW5mb19ibGssIFNTVF9CTE9DS19USU1FT1VUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic3N0OiBlcnJvciBpbiBzZXRfbXV0ZSA9ICVkXG4iLCByZXR2YWwpOworCQlwcl9lcnIoImVycm9yIGluIHNldF9tdXRlID0gJWRcbiIsIHJldHZhbCk7CiAJCXJldHZhbCA9IC1FSU87CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0zNTgsMjAgKzM2MCwyMCBAQAogCQlzbG90LT5kZXZpY2VfdHlwZSA9PSBTTkRfU1NUX0RFVklDRV9QQ00pIHsKIAkJCXJldHZhbCA9IHNzdF9hY3RpdmF0ZV90YXJnZXQoc2xvdCk7CiAJCQlpZiAocmV0dmFsKQotCQkJCXByX2Vycigic3N0OiBTU1RfQWN0aXZhdGVfdGFyZ2V0X2ZhaWxcbiIpOworCQkJCXByX2VycigiU1NUX0FjdGl2YXRlX3RhcmdldF9mYWlsXG4iKTsKIAkJCWVsc2UKLQkJCQlwcl9lcnIoInNzdDogU1NUX0FjdGl2YXRlX3RhcmdldF9wYXNzXG4iKTsKKwkJCQlwcl9lcnIoIlNTVF9BY3RpdmF0ZV90YXJnZXRfcGFzc1xuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfSBlbHNlIGlmIChzbG90LT5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX1BSRVBBUkUgJiYKIAkJCXNsb3QtPmRldmljZV90eXBlID09IFNORF9TU1RfREVWSUNFX1BDTSkgewogCQkJCXJldHZhbCA9IHNzdF9wcmVwYXJlX3RhcmdldChzbG90KTsKIAkJCWlmIChyZXR2YWwpCi0JCQkJcHJfZXJyKCJzc3Q6IFNTVF9wcmVwYXJlX3RhcmdldF9mYWlsXG4iKTsKKwkJCQlwcl9lcnIoIlNTVF9wcmVwYXJlX3RhcmdldF9mYWlsXG4iKTsKIAkJCWVsc2UKLQkJCQlwcl9lcnIoInNzdDogU1NUX3ByZXBhcmVfdGFyZ2V0X3Bhc3NcbiIpOworCQkJCXByX2VycigiU1NUX3ByZXBhcmVfdGFyZ2V0X3Bhc3NcbiIpOwogCQkJcmV0dXJuIHJldHZhbDsKIAl9IGVsc2UgewotCQlwcl9lcnIoInNzdDogc2xvdF9hY3Rpb24gOiAlZCwgZGV2aWNlX3R5cGU6ICVkXG4iLAorCQlwcl9lcnIoInNsb3RfYWN0aW9uIDogJWQsIGRldmljZV90eXBlOiAlZFxuIiwKIAkJCQlzbG90LT5hY3Rpb24sIHNsb3QtPmRldmljZV90eXBlKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC0zODMsNyArMzg1LDcgQEAKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZzsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9UQVJHRVRfREVWX1NFTEVDVCwgMSwgMCk7CkBAIC0zOTksMTEgKzQwMSwxMSBAQAogCWxpc3RfYWRkX3RhaWwoJm1zZy0+bm9kZSwgJnNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CiAJc3N0X3Bvc3RfbWVzc2FnZSgmc3N0X2Rydl9jdHgtPmlwY19wb3N0X21zZ193cSk7Ci0JcHJfZGVidWcoInNzdDogbWVzc2FnZSBzZW50LSB3YWl0aW5nXG4iKTsKKwlwcl9kZWJ1ZygibWVzc2FnZSBzZW50LSB3YWl0aW5nXG4iKTsKIAlyZXR2YWwgPSBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgsCiAJCQkmc3N0X2Rydl9jdHgtPnRndF9kZXZfYmxrLCBUQVJHRVRfREVWX0JMT0NLX1RJTUVPVVQpOwogCWlmIChyZXR2YWwpCi0JCXByX2Vycigic3N0OiB0YXJnZXQgZGV2aWNlIGlwYyBmYWlsZWQgPSAweCV4XG4iLCByZXR2YWwpOworCQlwcl9lcnIoInRhcmdldCBkZXZpY2UgaXBjIGZhaWxlZCA9IDB4JXhcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQpAQCAtNDM5LDcgKzQ0MSw3IEBACiAJCQkJCWdvdG8gZXJyOwogCQkJfSBlbHNlIHsKIGVycjoKLQkJCQlwcl9lcnIoInNzdDogaS9wIHBhcmFtcyBpbmNvcnJlY3RcbiIpOworCQkJCXByX2VycigiaS9wIHBhcmFtcyBpbmNvcnJlY3RcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC00NjAsMTUgKzQ2MiwxNSBAQAogewogCWludCByZXR2YWwsIGksIHByZXBhcmVfY291bnQgPSAwOwogCi0JcHJfZGVidWcoInNzdDogVGFyZ2V0IERldmljZSBTZWxlY3RcbiIpOworCXByX2RlYnVnKCJUYXJnZXQgRGV2aWNlIFNlbGVjdFxuIik7CiAKIAlpZiAodGFyZ2V0LT5kZXZpY2Vfcm91dGUgPCAwIHx8IHRhcmdldC0+ZGV2aWNlX3JvdXRlID4gMikgewotCQlwcl9lcnIoInNzdDogZGV2aWNlIHJvdXRlIGlzIGludmFsaWRcbiIpOworCQlwcl9lcnIoImRldmljZSByb3V0ZSBpcyBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHRhcmdldC0+ZGV2aWNlX3JvdXRlICE9IDApIHsKLQkJcHJfZXJyKCJzc3Q6IFVuc3VwcG9ydGVkIGNvbmZpZ1xuIik7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHZhbCA9IHNzdF90YXJnZXRfZGV2aWNlX3ZhbGlkYXRlKHRhcmdldCk7CkBAIC00ODAsMTggKzQ4MiwxOCBAQAogCQlyZXR1cm4gcmV0dmFsOwogCWZvciAoaSA9IDA7IGkgPCBTU1RfTUFYX1RBUkdFVF9ERVZJQ0VTOyBpKyspIHsKIAkJaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX0FDVElWQVRFKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBhY3RpdmF0ZSBjYWxsZWQgaW4gJWRcbiIsIGkpOworCQkJcHJfZGVidWcoImFjdGl2YXRlIGNhbGxlZCBpbiAlZFxuIiwgaSk7CiAJCQlyZXR2YWwgPSBzc3RfcGFyc2VfdGFyZ2V0KCZ0YXJnZXQtPmRldmljZXNbaV0pOwogCQkJaWYgKHJldHZhbCkKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQl9IGVsc2UgaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX1BSRVBBUkUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFBSRVBBUkUgaW4gJWQsIEZvcndhZGluZ1xuIiwgaSk7CisJCQlwcl9kZWJ1ZygiUFJFUEFSRSBpbiAlZCwgRm9yd2FyZGluZ1xuIiwgaSk7CiAJCQlyZXR2YWwgPSBzc3RfcGFyc2VfdGFyZ2V0KCZ0YXJnZXQtPmRldmljZXNbaV0pOwogCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBQYXJzZSBUYXJnZXQgZmFpbCAlZCIsIHJldHZhbCk7CisJCQkJcHJfZXJyKCJQYXJzZSBUYXJnZXQgZmFpbCAlZFxuIiwgcmV0dmFsKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcHJfZGVidWcoInNzdDogUGFyc2UgVGFyZ2V0IHN1Y2Nlc3NmdWwgJWQiLCByZXR2YWwpOworCQkJcHJfZGVidWcoIlBhcnNlIFRhcmdldCBzdWNjZXNzZnVsICVkXG4iLCByZXR2YWwpOwogCQkJaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5kZXZpY2VfdHlwZSA9PQogCQkJCQkJU05EX1NTVF9ERVZJQ0VfUENNKQogCQkJCXByZXBhcmVfY291bnQrKzsKQEAgLTUxMiwxMSArNTE0LDExIEBACiAJcmFyX3N0YXR1cyA9IHJhcl9oYW5kbGVfdG9fYnVzKGJ1ZmZlcnMsIGNvdW50KTsKIAogCWlmIChjb3VudCAhPSByYXJfc3RhdHVzKSB7Ci0JCXByX2Vycigic3N0OiBUaGUgcmFyIENBTEwgRmFpbGVkIik7CisJCXByX2VycigiVGhlIHJhciBDQUxMIEZhaWxlZCIpOwogCQlyZXR2YWwgPSAtRUlPOwogCX0KIAlpZiAoYnVmZmVycy0+aW5mby50eXBlICE9IFJBUl9UWVBFX0FVRElPKSB7Ci0JCXByX2Vycigic3N0OiBJbnZhbGlkIFJBUiB0eXBlXG4iKTsKKwkJcHJfZXJyKCJJbnZhbGlkIFJBUiB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC01MzksMTAgKzU0MSwxMCBAQAogCQlpZiAoa2J1ZnMtPmluX3VzZSA9PSBmYWxzZSkgewogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCiAJCQlpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDS19EUk0pIHsKLQkJCQlwcl9kZWJ1Zygic3N0OiBEUk0gcGxheWJhY2sgaGFuZGxpbmdcbiIpOworCQkJCXByX2RlYnVnKCJEUk0gcGxheWJhY2sgaGFuZGxpbmdcbiIpOwogCQkJCXJhcl9idWZmZXJzLmluZm8uaGFuZGxlID0gKF9fdTMyKWtidWZzLT5hZGRyOwogCQkJCXJhcl9idWZmZXJzLmluZm8uc2l6ZSA9IGtidWZzLT5zaXplOwotCQkJCXByX2RlYnVnKCJzc3Q6IHJhciBoYW5kbGUgMHgleCBzaXplPTB4JXgiLAorCQkJCXByX2RlYnVnKCJyYXIgaGFuZGxlIDB4JXggc2l6ZT0weCV4XG4iLAogCQkJCQlyYXJfYnVmZmVycy5pbmZvLmhhbmRsZSwKIAkJCQkJcmFyX2J1ZmZlcnMuaW5mby5zaXplKTsKIAkJCQlyZXR2YWwgPSAgc3N0X2dldF9SQVIoJnJhcl9idWZmZXJzLCAxKTsKQEAgLTU1Miw3ICs1NTQsNyBAQAogCQkJCXNnX2xpc3QtPmFkZHJbaV0uYWRkciA9IHJhcl9idWZmZXJzLmJ1c19hZGRyZXNzOwogCQkJCS8qIHJhcl9idWZmZXJzLmluZm8uc2l6ZTsgKi8KIAkJCQlzZ19saXN0LT5hZGRyW2ldLnNpemUgPSAoX191MzIpa2J1ZnMtPnNpemU7Ci0JCQkJcHJfZGVidWcoInNzdDogcGh5YWRkclslZF0gMHgleCBTaXplOjB4JXhcbiIKKwkJCQlwcl9kZWJ1ZygicGh5YWRkclslZF0gMHgleCBTaXplOjB4JXhcbiIKIAkJCQkJLCBpLCBzZ19saXN0LT5hZGRyW2ldLmFkZHIsCiAJCQkJCXNnX2xpc3QtPmFkZHJbaV0uc2l6ZSk7CiAJCQl9CkBAIC01NjIsNyArNTY0LDcgQEAKIAkJCQkJdmlydF90b19waHlzKCh2b2lkICopCiAJCQkJCQlrYnVmcy0+YWRkciArIGtidWZzLT5vZmZzZXQpOwogCQkJCXNnX2xpc3QtPmFkZHJbaV0uc2l6ZSA9IGtidWZzLT5zaXplOwotCQkJCXByX2RlYnVnKCJzc3Q6IHBoeWFkZHJbJWRdOjB4JXggU2l6ZToweCV4XG4iCisJCQkJcHJfZGVidWcoInBoeWFkZHJbJWRdOjB4JXggU2l6ZToweCV4XG4iCiAJCQkJLCBpICwgc2dfbGlzdC0+YWRkcltpXS5hZGRyLCBrYnVmcy0+c2l6ZSk7CiAJCQl9CiAJCQlzdHJlYW0tPmN1cnJfYnl0ZXMgKz0gc2dfbGlzdC0+YWRkcltpXS5zaXplOwpAQCAtNTc0LDcgKzU3Niw3IEBACiAJfQogCiAJc2dfbGlzdC0+bnVtX2VudHJpZXMgPSBpOwotCXByX2RlYnVnKCJzc3Q6c2cgbGlzdCBlbnRyaWVzID0gJWRcbiIsIHNnX2xpc3QtPm51bV9lbnRyaWVzKTsKKwlwcl9kZWJ1Zygic2cgbGlzdCBlbnRyaWVzID0gJWRcbiIsIHNnX2xpc3QtPm51bV9lbnRyaWVzKTsKIAlyZXR1cm4gaTsKIH0KIApAQCAtNTk1LDcgKzU5Nyw3IEBACiAJc3RydWN0IHNzdF9zdHJlYW1fYnVmcyAqa2J1ZnMgPSBOVUxMLCAqX2tidWZzOwogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCi0JcHJfZGVidWcoInNzdDogcGxheSBmcmFtZSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoInBsYXkgZnJhbWUgZm9yICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC02MTUsMTQgKzYxNywxNCBAQAogCXN0cmVhbS0+Y3Vycl9ieXRlcyA9IDA7CiAJaWYgKGxpc3RfZW1wdHkoJnN0cmVhbS0+YnVmcykpIHsKIAkJLyogbm8gdXNlciBidWZmZXIgYXZhaWxhYmxlICovCi0JCXByX2RlYnVnKCJzc3Q6IE51bGwgYnVmZmVyIHN0cmVhbSBzdGF0dXMgJWRcbiIsIHN0cmVhbS0+c3RhdHVzKTsKKwkJcHJfZGVidWcoIk51bGwgYnVmZmVyIHN0cmVhbSBzdGF0dXMgJWRcbiIsIHN0cmVhbS0+c3RhdHVzKTsKIAkJc3RyZWFtLT5wcmV2ID0gc3RyZWFtLT5zdGF0dXM7CiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7Ci0JCXByX2RlYnVnKCJzc3Q6bmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOworCQlwcl9kZWJ1ZygibmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOwogCQlpZiAoc3RyZWFtLT5uZWVkX2RyYWluaW5nID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6ZHJhaW5pbmcgc3RyZWFtXG4iKTsKKwkJCXByX2RlYnVnKCJkcmFpbmluZyBzdHJlYW1cbiIpOwogCQkJaWYgKHNzdF9jcmVhdGVfc2hvcnRfbXNnKCZtc2cpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvYyBmYWlsZWRcbiIpOworCQkJCXByX2VycigibWVtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9EUkFJTl9TVFJFQU0sCkBAIC02MzMsNyArNjM1LDcgQEAKIAkJCXNwaW5fdW5sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOwogCQkJc3N0X3Bvc3RfbWVzc2FnZSgmc3N0X2Rydl9jdHgtPmlwY19wb3N0X21zZ193cSk7CiAJCX0gZWxzZSBpZiAoc3RyZWFtLT5kYXRhX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OnVzZXIgbGlzdCBlbXB0eS4uIHdha2VcbiIpOworCQkJcHJfZGVidWcoInVzZXIgbGlzdCBlbXB0eS4uIHdha2VcbiIpOwogCQkJLyogdW5ibG9jayAqLwogCQkJc3RyZWFtLT5kYXRhX2Jsay5yZXRfY29kZSA9IDA7CiAJCQlzdHJlYW0tPmRhdGFfYmxrLmNvbmRpdGlvbiA9IHRydWU7CkBAIC02NzgsNyArNjgwLDcgQEAKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAogCi0JcHJfZGVidWcoInNzdDpjYXB0dXJlIGZyYW1lIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FwdHVyZSBmcmFtZSBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTY4OCwxOSArNjkwLDE5IEBACiAJCWlmIChrYnVmcy0+aW5fdXNlID09IHRydWUpIHsKIAkJCWxpc3RfZGVsKCZrYnVmcy0+bm9kZSk7CiAJCQlrZnJlZShrYnVmcyk7Ci0JCQlwcl9kZWJ1Zygic3N0OmRlbCBub2RlXG4iKTsKKwkJCXByX2RlYnVnKCJkZWwgbm9kZVxuIik7CiAJCX0KIAl9CiAJaWYgKGxpc3RfZW1wdHkoJnN0cmVhbS0+YnVmcykpIHsKIAkJLyogbm8gdXNlciBidWZmZXIgYXZhaWxhYmxlICovCi0JCXByX2RlYnVnKCJzc3Q6TnVsbCBidWZmZXIhISEhc3RyZWFtIHN0YXR1cyAlZFxuIiwKKwkJcHJfZGVidWcoIk51bGwgYnVmZmVyISEhIXN0cmVhbSBzdGF0dXMgJWRcbiIsCiAJCQkgICAgICAgc3RyZWFtLT5zdGF0dXMpOwogCQlzdHJlYW0tPnByZXYgPSBzdHJlYW0tPnN0YXR1czsKIAkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQkJcHJfZGVidWcoInNzdDpuZXcgc3RyZWFtIHN0YXR1cyA9ICVkXG4iLAorCQlwcl9kZWJ1ZygibmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwKIAkJCSAgICAgICBzdHJlYW0tPnN0YXR1cyk7CiAJCWlmIChzdHJlYW0tPmRhdGFfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6dXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CisJCQlwcl9kZWJ1ZygidXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CiAJCQkvKiB1bmJsb2NrICovCiAJCQlzdHJlYW0tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJCXN0cmVhbS0+ZGF0YV9ibGsuY29uZGl0aW9uID0gdHJ1ZTsKQEAgLTczMSw3ICs3MzMsNyBAQAogCXN0cmVhbS0+Y3VtbV9ieXRlcyArPSBzdHJlYW0tPmN1cnJfYnl0ZXM7CiAJc3RyZWFtLT5jdXJyX2J5dGVzID0gMDsKIAotICAgIHByX2RlYnVnKCJzc3Q6Q3VtIGJ5dGVzICA9ICVkXG4iLCBzdHJlYW0tPmN1bW1fYnl0ZXMpOworICAgIHByX2RlYnVnKCJDdW0gYnl0ZXMgID0gJWRcbiIsIHN0cmVhbS0+Y3VtbV9ieXRlcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0Myw3ICs3NDUsNyBAQAogCQlpZiAoYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplIDwgbWluX3ZhbCkKIAkJCW1pbl92YWwgPSBidWZzLT5idWZmX2VudHJ5W2ldLnNpemU7CiAJfQotCXByX2RlYnVnKCJzc3Q6bWluX3ZhbCA9ICVkXG4iLCBtaW5fdmFsKTsKKwlwcl9kZWJ1ZygibWluX3ZhbCA9ICVkXG4iLCBtaW5fdmFsKTsKIAlyZXR1cm4gbWluX3ZhbDsKIH0KIApAQCAtNzU0LDcgKzc1Niw3IEBACiAJCWlmIChidWZzLT5idWZmX2VudHJ5W2ldLnNpemUgPiBtYXhfdmFsKQogCQkJbWF4X3ZhbCA9IGJ1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZTsKIAl9Ci0JcHJfZGVidWcoInNzdDptYXhfdmFsID0gJWRcbiIsIG1heF92YWwpOworCXByX2RlYnVnKCJtYXhfdmFsID0gJWRcbiIsIG1heF92YWwpOwogCXJldHVybiBtYXhfdmFsOwogfQogCkBAIC03NzMsNyArNzc1LDcgQEAKIAkJCWlmIChkYnVmcy0+aWJ1ZnMtPmVudHJpZXMgPT0gZGJ1ZnMtPm9idWZzLT5lbnRyaWVzKQogCQkJCXJldHVybiAwOwogCQkJZWxzZSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IFJBUiBlbnRyaWVzIGRvbnQgbWF0Y2hcbiIpOworCQkJCXByX2VycigiUkFSIGVudHJpZXMgZG9udCBtYXRjaFxuIik7CiAJCQkJIHJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UKQEAgLTc4MywyNiArNzg1LDI2IEBACiAJfQogI2VuZGlmCiAJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJcHJfZGVidWcoInNzdDpubyBpL3AgYnVmZmVycywgdHJ5aW5nIGZ1bGwgc2l6ZVxuIik7CisJCXByX2RlYnVnKCJubyBpL3AgYnVmZmVycywgdHJ5aW5nIGZ1bGwgc2l6ZVxuIik7CiAJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUgPSBjdW1faW5wdXRfZ2l2ZW47CiAJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZiA9IGt6YWxsb2Moc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQlzdHJfaW5mby0+aWRlY29kZV9hbGxvYyA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQogCWlmICghc3RyX2luZm8tPmRlY29kZV9pYnVmKSB7Ci0JCXByX2RlYnVnKCJzc3Q6YnVmZiBhbGxvYyBmYWlsZWQsIHRyeSBtYXggc2l6ZVxuIik7CisJCXByX2RlYnVnKCJidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1heCBzaXplXG4iKTsKIAkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA9IGNhbGN1bGF0ZV9tYXhfc2l6ZShkYnVmcy0+aWJ1ZnMpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgPSBremFsbG9jKAogCQkJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUsIEdGUF9LRVJORUwpOwogCQlzdHJfaW5mby0+aWRlY29kZV9hbGxvYyA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQogCWlmICghc3RyX2luZm8tPmRlY29kZV9pYnVmKSB7Ci0JCXByX2RlYnVnKCJzc3Q6YnVmZiBhbGxvYyBmYWlsZWQsIHRyeSBtaW4gc2l6ZVxuIik7CisJCXByX2RlYnVnKCJidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1pbiBzaXplXG4iKTsKIAkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA9IGNhbGN1bGF0ZV9taW5fc2l6ZShkYnVmcy0+aWJ1ZnMpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgPSBremFsbG9jKHN0cl9pbmZvLT5kZWNvZGVfaXNpemUsCiAJCQkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcHJfZXJyKCJtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3RyX2luZm8tPmlkZWNvZGVfYWxsb2MgPSBzdHJfaW5mby0+ZGVjb2RlX2lzaXplOwpAQCAtODIwLDcgKzgyMiw3IEBACiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoIlNTVCBEQkdzc3Rfc2V0X211dGU6Y2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiU1NUIERCRzpzc3Rfc2V0X211dGU6Y2FsbGVkXG4iKTsKIAogCWlmIChzdHJfaW5mby0+ZGVjb2RlX2lidWZfdHlwZSA9PSBTU1RfQlVGX1JBUikgewogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCkBAIC04NTcsNyArODU5LDcgQEAKIAlkZWNfaW5mby0+aW5wdXRfYnl0ZXNfY29uc3VtZWQgPSAwOwogCWRlY19pbmZvLT5vdXRwdXRfYnl0ZXNfcHJvZHVjZWQgPSAwOwogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NzgsMTMgKzg4MCwxMyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKyNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgogc3RhdGljIGludCBzc3RfcHJlcGFyZV9pbnB1dF9idWZmZXJzX3JhcihzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvLAogCQkJc3RydWN0IHNuZF9zc3RfZGJ1ZnMgKmRidWZzLAogCQkJaW50ICppbnB1dF9pbmRleCwgaW50ICppbl9jb3BpZWQsCiAJCQlpbnQgKmlucHV0X2luZGV4X3ZhbGlkX3NpemUsIGludCAqbmV3X2VudHJ5X2ZsYWcpCiB7CiAJaW50IHJldHZhbCA9IDA7Ci0jaWZkZWYgQ09ORklHX01SU1RfUkFSX0hBTkRMRVIKIAlpbnQgaTsKIAogCWlmIChzdHJfaW5mby0+b3BzID09IFNUUkVBTV9PUFNfUExBWUJBQ0tfRFJNKSB7CkBAIC04OTQsNyArODk2LDcgQEAKIAkJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCXNpemVvZihfX3UzMikpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDpjcHkgZnJvbSB1c2VyIGZhaWxcbiIpOworCQkJcHJfZXJyKCJjcHkgZnJvbSB1c2VyIGZhaWxcbiIpOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAkJcmFyX2J1ZmZlcnMuaW5mby50eXBlID0gZGJ1ZnMtPmlidWZzLT50eXBlOwpAQCAtOTE5LDkgKzkyMSwxMCBAQAogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWZfdHlwZSA9IGRidWZzLT5pYnVmcy0+dHlwZTsKIAkJKmluX2NvcGllZCA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQotI2VuZGlmCiAJcmV0dXJuIHJldHZhbDsKIH0KKyNlbmRpZgorCiAvKlRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmVwYXJlIHRoZSBrZXJuZWwgaW5wdXQgYnVmZmVycyB3aXRoIGNvbnRlbnRzCiBiZWZvcmUgc2VuZGluZyBmb3IgZGVjb2RlKi8KIHN0YXRpYyBpbnQgc3N0X3ByZXBhcmVfaW5wdXRfYnVmZmVycyhzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvLApAQCAtOTMxLDcgKzkzNCw3IEBACiB7CiAJaW50IGksIGNweV9zaXplLCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDppbnB1dF9pbmRleCA9ICVkLCBpbnB1dCBlbnRyaWVzID0gJWRcbiIsCisJcHJfZGVidWcoImlucHV0X2luZGV4ID0gJWQsIGlucHV0IGVudHJpZXMgPSAlZFxuIiwKIAkJCSAqaW5wdXRfaW5kZXgsIGRidWZzLT5pYnVmcy0+ZW50cmllcyk7CiAJZm9yIChpID0gKmlucHV0X2luZGV4OyBpIDwgZGJ1ZnMtPmlidWZzLT5lbnRyaWVzOyBpKyspIHsKICNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgpAQCAtOTM5LDcgKzk0Miw3IEBACiAJCQlkYnVmcywgaW5wdXRfaW5kZXgsIGluX2NvcGllZCwKIAkJCQlpbnB1dF9pbmRleF92YWxpZF9zaXplLCBuZXdfZW50cnlfZmxhZyk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic3N0OiBJbiBwcmVwYXJlIGlucHV0IGJ1ZmZlcnMgZm9yIFJBUlxuIik7CisJCQlwcl9lcnIoIkluIHByZXBhcmUgaW5wdXQgYnVmZmVycyBmb3IgUkFSXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAjZW5kaWYKQEAgLTk0NywxMCArOTUwLDEwIEBACiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA9PSAwKQogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUgPQogCQkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplOwotCQlwcl9kZWJ1Zygic3N0Omlub3V0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAorCQlwcl9kZWJ1ZygiaW5vdXQgYWRkciA9ICVwLCBzaXplID0gJWRcbiIsCiAJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUpOwotCQlwcl9kZWJ1Zygic3N0OmRlY29kZV9pc2l6ZSA9ICVkLCBpbl9jb3BpZWQgJWRcbiIsCisJCXByX2RlYnVnKCJkZWNvZGVfaXNpemUgPSAlZCwgaW5fY29waWVkICVkXG4iLAogCQkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwgKmluX2NvcGllZCk7CiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA8PQogCQkJCQkoc3RyX2luZm8tPmRlY29kZV9pc2l6ZSAtICppbl9jb3BpZWQpKQpAQCAtOTU4LDEyICs5NjEsMTIgQEAKIAkJZWxzZQogCQkJY3B5X3NpemUgPSBzdHJfaW5mby0+ZGVjb2RlX2lzaXplIC0gKmluX2NvcGllZDsKIAotCQlwcl9kZWJ1Zygic3N0OmNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKKwkJcHJfZGVidWcoImNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKIAkJaWYgKCFkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyKSB7Ci0JCQlwcl9lcnIoInNzdDogaS9wIGJ1ZmZlciBpcyBudWxsXG4iKTsKKwkJCXByX2VycigiaS9wIGJ1ZmZlciBpcyBudWxsXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6VHJ5IGNvcHkgVG8gJXAsIEZyb20gJXAsIHNpemUgJWRcbiIsCisJCXByX2RlYnVnKCJUcnkgY29weSBUbyAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgKyAqaW5fY29waWVkLAogCQkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsIGNweV9zaXplKTsKIApAQCAtOTcyLDIyICs5NzUsMjIgQEAKIAkJCQkodm9pZCAqKSBkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCWNweV9zaXplKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoImNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQkqaW5fY29waWVkICs9IGNweV9zaXplOwogCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSAtPSBjcHlfc2l6ZTsKLQkJcHJfZGVidWcoInNzdDppbiBidWZmIHNpemUgPSAlZCwgaW5fY29waWVkID0gJWRcbiIsCisJCXByX2RlYnVnKCJpbiBidWZmIHNpemUgPSAlZCwgaW5fY29waWVkID0gJWRcbiIsCiAJCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSwgKmluX2NvcGllZCk7CiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSAhPSAwKSB7Ci0JCQlwcl9kZWJ1Zygic3N0Om1vcmUgaW5wdXQgYnVmZmVycyBsZWZ0XG4iKTsKKwkJCXByX2RlYnVnKCJtb3JlIGlucHV0IGJ1ZmZlcnMgbGVmdFxuIik7CiAJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyICs9IGNweV9zaXplOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCppbl9jb3BpZWQgPT0gc3RyX2luZm8tPmRlY29kZV9pc2l6ZSAmJgogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUgPT0gMCAmJgogCQkJKGkrMSkgPD0gZGJ1ZnMtPmlidWZzLT5lbnRyaWVzKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OmFsbCBpbnB1dCBidWZmZXJzIGNvcGllZFxuIik7CisJCQlwcl9kZWJ1ZygiYWxsIGlucHV0IGJ1ZmZlcnMgY29waWVkXG4iKTsKIAkJCSpuZXdfZW50cnlfZmxhZyA9IHRydWU7CiAJCQkqaW5wdXRfaW5kZXggPSBpICsgMTsKIAkJCWJyZWFrOwpAQCAtMTAwNSwyMyArMTAwOCwyMyBAQAogCiB7CiAJaW50IGksIGNweV9zaXplLCByZXR2YWwgPSAwOwotCXByX2RlYnVnKCJzc3Q6b3V0cHV0X2luZGV4ID0gJWQsIG91dHB1dCBlbnRyaWVzID0gJWRcbiIsCisJcHJfZGVidWcoIm91dHB1dF9pbmRleCA9ICVkLCBvdXRwdXQgZW50cmllcyA9ICVkXG4iLAogCQkJCSpvdXRwdXRfaW5kZXgsCiAJCQkJZGJ1ZnMtPm9idWZzLT5lbnRyaWVzKTsKIAlmb3IgKGkgPSAqb3V0cHV0X2luZGV4OyBpIDwgZGJ1ZnMtPm9idWZzLT5lbnRyaWVzOyBpKyspIHsKIAkJKm91dHB1dF9pbmRleCA9IGk7Ci0JCXByX2RlYnVnKCJzc3Q6b3V0cHV0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAorCQlwcl9kZWJ1Zygib3V0cHV0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAogCQkJZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLmJ1ZmZlciwKIAkJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplKTsKLQkJcHJfZGVidWcoInNzdDpvdXRwdXRfc2l6ZSA9ICVkLCBvdXRfY29waWVkID0gJWRcbiIsCisJCXByX2RlYnVnKCJvdXRwdXRfc2l6ZSA9ICVkLCBvdXRfY29waWVkID0gJWRcbiIsCiAJCQkJb3V0cHV0X3NpemUsICpvdXRfY29waWVkKTsKIAkJaWYgKGRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplIDwKIAkJCQkob3V0cHV0X3NpemUgLSAqb3V0X2NvcGllZCkpCiAJCQljcHlfc2l6ZSA9IGRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplOwogCQllbHNlCiAJCQljcHlfc2l6ZSA9IG91dHB1dF9zaXplIC0gKm91dF9jb3BpZWQ7Ci0JCXByX2RlYnVnKCJzc3Q6Y3B5IHNpemUgPSAlZFxuIiwgY3B5X3NpemUpOwotCQlwcl9kZWJ1Zygic3N0OlRyeSBjb3B5IFRvOiAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKKwkJcHJfZGVidWcoImNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKKwkJcHJfZGVidWcoIlRyeSBjb3B5IFRvOiAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKIAkJCQlkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCXNzdF9kcnZfY3R4LT5tbWFwX21lbSArICpvdXRfY29waWVkLAogCQkJCWNweV9zaXplKTsKQEAgLTEwMjksMTMgKzEwMzIsMTMgQEAKIAkJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbWVtICsgKm91dF9jb3BpZWQsCiAJCQkJCWNweV9zaXplKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQkJcHJfZXJyKCJjb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UKLQkJCXByX2RlYnVnKCJzc3Q6Y29weSB0byB1c2VyIHBhc3NlZFxuIik7CisJCQlwcl9kZWJ1ZygiY29weSB0byB1c2VyIHBhc3NlZFxuIik7CiAJCSpvdXRfY29waWVkICs9IGNweV9zaXplOwogCQlkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZSAtPSBjcHlfc2l6ZTsKLQkJcHJfZGVidWcoInNzdDpvL3AgYnVmZiBzaXplICVkLCBvdXRfY29waWVkICVkXG4iLAorCQlwcl9kZWJ1Zygiby9wIGJ1ZmYgc2l6ZSAlZCwgb3V0X2NvcGllZCAlZFxuIiwKIAkJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplLCAqb3V0X2NvcGllZCk7CiAJCWlmIChkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZSAhPSAwKSB7CiAJCQkqb3V0cHV0X2luZGV4ID0gaTsKQEAgLTEwNzMsNyArMTA3Niw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIGlucHV0X2J5dGVzLCBvdXRwdXRfYnl0ZXM7CiAKIAlzc3RfZHJ2X2N0eC0+c2NhcmRfb3BzLT5wb3dlcl9kb3duX3BtaWMoKTsKLQlwcl9kZWJ1Zygic3N0OiBQb3dlcmluZ19kb3duX1BNSUMuLi5cbiIpOworCXByX2RlYnVnKCJQb3dlcmluZ19kb3duX1BNSUMuLi5cbiIpOwogCiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKQEAgLTEwODEsNyArMTA4NCw3IEBACiAKIAlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9JTklUKSB7Ci0JCXByX2Vycigic3N0OiBpbnZhbGlkIHN0cmVhbSBzdGF0ZSA9ICVkXG4iLAorCQlwcl9lcnIoImludmFsaWQgc3RyZWFtIHN0YXRlID0gJWRcbiIsCiAJCQkgICAgICAgc3RyX2luZm8tPnN0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwOTgsNyArMTEwMSw3IEBACiAJcmV0dmFsID0gIHNzdF9hbGxvY2F0ZV9kZWNvZGVfYnVmKHN0cl9pbmZvLCBkYnVmcywKIAkJCQljdW1faW5wdXRfZ2l2ZW4sIGN1bV9vdXRwdXRfZ2l2ZW4pOwogCWlmIChyZXR2YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZhaWxlZCwgYWJvcnQhISFcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZCwgYWJvcnQhISFcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGZpbmlzaDsKIAl9CkBAIC0xMTE0LDcgKzExMTcsNyBAQAogCQkJZGJ1ZnMsICZpbnB1dF9pbmRleCwgJmluX2NvcGllZCwKIAkJCSZpbnB1dF9pbmRleF92YWxpZF9zaXplLCAmbmV3X2VudHJ5X2ZsYWcpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogcHJlcGFyZSBpbiBidWZmZXJzIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoInByZXBhcmUgaW4gYnVmZmVycyBmYWlsZWRcbiIpOwogCQkJZ290byBmaW5pc2g7CiAJCX0KIApAQCAtMTE0NSw4ICsxMTQ4LDggQEAKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX29zaXplID0gZGJ1ZnMtPm9idWZzLT4KIAkJCQkJYnVmZl9lbnRyeVtvdXRwdXRfaW5kZXhdLnNpemU7CiAJCQkJc3RyX2luZm8tPmRlY29kZV9vYnVmX3R5cGUgPSBkYnVmcy0+b2J1ZnMtPnR5cGU7Ci0JCQkJcHJfZGVidWcoInNzdDpEUk0gaGFuZGxpbmdcbiIpOwotCQkJCXByX2RlYnVnKCJvL3BfYWRkPTB4JWx1IFNpemU9MHgleCIsCisJCQkJcHJfZGVidWcoIkRSTSBoYW5kbGluZ1xuIik7CisJCQkJcHJfZGVidWcoIm8vcF9hZGQ9MHglbHUgU2l6ZT0weCV4XG4iLAogCQkJCQkodW5zaWduZWQgbG9uZykgc3RyX2luZm8tPmRlY29kZV9vYnVmLAogCQkJCQlzdHJfaW5mby0+ZGVjb2RlX29zaXplKTsKIAkJCX0gZWxzZSB7CkBAIC0xMTYwLDcgKzExNjMsNyBAQAogCQlpZiAoc3RyX2luZm8tPm9wcyAhPSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJaWYgKHN0cl9pbmZvLT5kZWNvZGVfaXNpemUgPiBpbl9jb3BpZWQpIHsKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX2lzaXplID0gaW5fY29waWVkOwotCQkJCXByX2RlYnVnKCJzc3Q6aS9wIHNpemUgPSAlZFxuIiwKKwkJCQlwcl9kZWJ1ZygiaS9wIHNpemUgPSAlZFxuIiwKIAkJCQkJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUpOwogCQkJfQogCQl9CkBAIC0xMTY4LDIwICsxMTcxLDE5IEBACiAKIAkJcmV0dmFsID0gc3N0X3NlbmRfZGVjb2RlX21lc3Moc3RyX2lkLCBzdHJfaW5mbywgJmRlY19pbmZvKTsKIAkJaWYgKHJldHZhbCB8fCBkZWNfaW5mby5pbnB1dF9ieXRlc19jb25zdW1lZCA9PSAwKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIlNTVCBFUlI6IG1lc3MgZmFpbGVkIG9yIG5vIGlucHV0IGNvbnN1bWVkXG4iKTsKKwkJCXByX2VycigiU1NUIEVSUjogbWVzcyBmYWlsZWQgb3Igbm8gaW5wdXQgY29uc3VtZWRcbiIpOwogCQkJZ290byBmaW5pc2g7CiAJCX0KIAkJaW5wdXRfYnl0ZXMgPSBkZWNfaW5mby5pbnB1dF9ieXRlc19jb25zdW1lZDsKIAkJb3V0cHV0X2J5dGVzID0gZGVjX2luZm8ub3V0cHV0X2J5dGVzX3Byb2R1Y2VkOwogCi0JCXByX2RlYnVnKCJzc3Q6aW5fY29waWVkPSVkLCBjb249JWxsZCwgcHJvZD0lbGxkXG4iLAorCQlwcl9kZWJ1ZygiaW5fY29waWVkPSVkLCBjb249JWxsZCwgcHJvZD0lbGxkXG4iLAogCQkJaW5fY29waWVkLCBpbnB1dF9ieXRlcywgb3V0cHV0X2J5dGVzKTsKIAkJaWYgKGRidWZzLT5vYnVmcy0+dHlwZSA9PSBTU1RfQlVGX1JBUikgewogCQkJb3V0cHV0X2luZGV4ICs9IDE7CiAJCQlpZiAob3V0cHV0X2luZGV4ID09IGRidWZzLT5vYnVmcy0+ZW50cmllcykgewogCQkJCWNvcHlfaW5fZG9uZSA9IHRydWU7Ci0JCQkJcHJfZGVidWcoInNzdDphbGwgaS9wIGNweSBkb25lXG4iKTsKKwkJCQlwcl9kZWJ1ZygiYWxsIGkvcCBjcHkgZG9uZVxuIik7CiAJCQl9CiAJCQl0b3RhbF9vdXRwdXQgKz0gb3V0cHV0X2J5dGVzOwogCQl9IGVsc2UgewpAQCAtMTE5MCwxNCArMTE5MiwxNCBAQAogCQkJcmV0dmFsID0gc3N0X3ByZXBhcmVfb3V0cHV0X2J1ZmZlcnMoc3RyX2luZm8sIGRidWZzLAogCQkJCSZvdXRwdXRfaW5kZXgsIG91dHB1dF9zaXplLCAmb3V0X2NvcGllZCk7CiAJCQlpZiAocmV0dmFsKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6cHJlcCBvdXQgYnVmZiBmYWlsXG4iKTsKKwkJCQlwcl9lcnIoInByZXAgb3V0IGJ1ZmYgZmFpbFxuIik7CiAJCQkJZ290byBmaW5pc2g7CiAJCQl9CiAJCQlpZiAoc3RyX2luZm8tPm9wcyAhPSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJCWlmIChpbl9jb3BpZWQgIT0gaW5wdXRfYnl0ZXMpIHsKIAkJCQkJaW50IGJ5dGVzX2xlZnQgPSBpbl9jb3BpZWQgLQogCQkJCQkJCQlpbnB1dF9ieXRlczsKLQkJCQkJcHJfZGVidWcoInNzdDpieXRlcyAlZFxuIiwKKwkJCQkJcHJfZGVidWcoImJ5dGVzICVkXG4iLAogCQkJCQkJCWJ5dGVzX2xlZnQpOwogCQkJCQlpZiAobmV3X2VudHJ5X2ZsYWcgPT0gdHJ1ZSkKIAkJCQkJCWlucHV0X2luZGV4LS07CkBAIC0xMjM3LDcgKzEyMzksNyBAQAogCQkJdG90YWxfb3V0cHV0ICs9IG91dF9jb3BpZWQ7CiAJCQlpZiAoc3RyX2luZm8tPmRlY29kZV9vc2l6ZSAhPSBvdXRfY29waWVkKSB7CiAJCQkJc3RyX2luZm8tPmRlY29kZV9vc2l6ZSAtPSBvdXRfY29waWVkOwotCQkJCXByX2RlYnVnKCJzc3Q6b3V0cHV0IHNpemUgbW9kaWZpZWQgPSAlZFxuIiwKKwkJCQlwcl9kZWJ1Zygib3V0cHV0IHNpemUgbW9kaWZpZWQgPSAlZFxuIiwKIAkJCQkJCXN0cl9pbmZvLT5kZWNvZGVfb3NpemUpOwogCQkJfQogCQl9CkBAIC0xMjUxLDE2ICsxMjUzLDE2IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAodG90YWxfb3V0cHV0ID09IGN1bV9vdXRwdXRfZ2l2ZW4pIHsKIAkJCQljb3B5X291dF9kb25lID0gdHJ1ZTsKLQkJCQlwcl9kZWJ1Zygic3N0OmFsbCBvL3AgY3B5IGRvbmVcbiIpOworCQkJCXByX2RlYnVnKCJhbGwgby9wIGNweSBkb25lXG4iKTsKIAkJCX0KIAogCQkJaWYgKHRvdGFsX2lucHV0ID09IGN1bV9pbnB1dF9naXZlbikgewogCQkJCWNvcHlfaW5fZG9uZSA9IHRydWU7Ci0JCQkJcHJfZGVidWcoInNzdDphbGwgaS9wIGNweSBkb25lXG4iKTsKKwkJCQlwcl9kZWJ1ZygiYWxsIGkvcCBjcHkgZG9uZVxuIik7CiAJCQl9CiAJCX0KIAotCQlwcl9kZWJ1Zygic3N0OmNvcHlfb3V0ID0gJWQsIGNvcHlfaW4gPSAlZFxuIiwKKwkJcHJfZGVidWcoImNvcHlfb3V0ID0gJWQsIGNvcHlfaW4gPSAlZFxuIiwKIAkJCQljb3B5X291dF9kb25lLCBjb3B5X2luX2RvbmUpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jCmluZGV4IDRjMDI2NGMuLmZiMjI5MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKiBBTFNBIGRyaXZlciBmb3IgSW50ZWwgTUlEIHNvdW5kIGNhcmQgY2hpcHNldAogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTAxLDEyICsxMDQsMTAgQEAKIHN0YXRpYyBpbnQgc25kX2ludGVsbWFkX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCQlpbnQgY21kKQogewotCWludCByZXRfdmFsID0gMDsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IG1hZF9zdHJlYW1fcHZ0ICpzdHJlYW07Ci0JLypzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciBidWZmZXJfdG9fc3N0OyovCi0KLQorCXN0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgKnNzdF9vcHM7CiAKIAlXQVJOX09OKCFzdWJzdHJlYW0pOwogCkBAIC0xMTUsMzggKzExNiwzNSBAQAogCiAJV0FSTl9PTighaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKTsKIAlXQVJOX09OKCFpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnNjYXJkX29wcyk7CisJc3N0X29wcyAgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9TVEFSVCwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiVHJpZ2dlciBTdGFydFxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX1NUQVJULCAmc3RyX2lkKTsKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gUlVOTklORzsKIAkJc3RyZWFtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFJVTk5JTkc7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7Ci0JCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfRFJPUCwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gc3RvcFxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX0RST1AsICZzdHJfaWQpOwogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBEUk9QUEVEOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9QQVVTRSwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gcGF1c2VcbiIpOworCQlyZXRfdmFsID0gc3N0X29wcy0+ZGV2aWNlX2NvbnRyb2woU1NUX1NORF9QQVVTRSwgJnN0cl9pZCk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CiAJCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFBBVVNFRDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1Zygic3N0OiBpbiBwYXVzZSByZWxlYXNlXG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9SRVNVTUUsCi0JCQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gcGF1c2UgcmVsZWFzZVxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX1JFU1VNRSwgJnN0cl9pZCk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CiAJCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFJVTk5JTkc7CkBAIC0xNzAsMTkgKzE2OCwxOSBAQAogCWludCByZXRfdmFsID0gMDsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAKLQlwcl9kZWJ1Zygic3N0OiBwY21fcHJlcGFyZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJwY21fcHJlcGFyZSBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlpbnRlbG1hZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JcHJfZGVidWcoInNzdDogcGIgY250ID0gJWQgY2FwIGNudCA9ICVkXG4iLFwKKwlwcl9kZWJ1ZygicGIgY250ID0gJWQgY2FwIGNudCA9ICVkXG4iLFwKIAkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQsCiAJCWludGVsbWFkZGF0YS0+Y2FwdHVyZV9jbnQpOwogCiAJaWYgKHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IFByZXBhcmUgY2FsbGVkIGZvciBhbHJlYWR5IHNldCBzdHJlYW1cbiIpOwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0RST1AsCi0JCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJQcmVwYXJlIGNhbGxlZCBmb3IgYWxyZWFkeSBzZXQgc3RyZWFtXG4iKTsKKwkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPmRldmljZV9jb250cm9sKAorCQkJCVNTVF9TTkRfRFJPUCwgJnN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC0xOTcsNyArMTk1LDcgQEAKIAkvKiByZXR1cm4gYmFjayB0aGUgc3RyZWFtIGlkICovCiAJc25wcmludGYoc3Vic3RyZWFtLT5wY20tPmlkLCBzaXplb2Yoc3Vic3RyZWFtLT5wY20tPmlkKSwKIAkJCSIlZCIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKLQlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gaWQgdG8gdXNlciA9ICVzXG4iLAorCXByX2RlYnVnKCJzdHJlYW0gaWQgdG8gdXNlciA9ICVzXG4iLAogCQkJc3Vic3RyZWFtLT5wY20tPmlkKTsKIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfaW5pdF9zdHJlYW0oc3Vic3RyZWFtKTsKQEAgLTIxMiw3ICsyMTAsNyBAQAogewogCWludCByZXRfdmFsOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2h3X3BhcmFtcyBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfaHdfcGFyYW1zIGNhbGxlZFxuIik7CiAJcmV0X3ZhbCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwogCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLApAQCAtMjIzLDcgKzIyMSw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2ludGVsbWFkX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKIAlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCkBAIC0yNTAsMTUgKzI0OCwxNSBAQAogCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPT0gSU5JVCkKIAkJcmV0dXJuIDA7CiAKLQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0JVRkZFUl9QT0lOVEVSLAotCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKKwlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5wY21fY29udHJvbC0+ZGV2aWNlX2NvbnRyb2woCisJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCAmc3RyZWFtLT5zdHJlYW1faW5mbyk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAweCV4XG4iLCByZXRfdmFsKTsKKwkJcHJfZXJyKCJlcnJvciBjb2RlID0gMHgleFxuIiwgcmV0X3ZhbCk7CiAJCXJldHVybiByZXRfdmFsOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBzYW1wbGVzIHJlcG9ydGVkIG91dCAweCVsbHhcbiIsCisJcHJfZGVidWcoInNhbXBsZXMgcmVwb3J0ZWQgb3V0IDB4JWxseFxuIiwKIAkJCXN0cmVhbS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0cik7Ci0JcHJfZGVidWcoInNzdDogRnJhbWUgYml0czo6ICVkIHBlcmlvZF9jb3VudCA6OiAlZFxuIiwKKwlwcl9kZWJ1ZygiRnJhbWUgYml0czo6ICVkIHBlcmlvZF9jb3VudCA6OiAlZFxuIiwKIAkJCShpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5mcmFtZV9iaXRzLAogCQkJKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKIApAQCAtMjc3LDI2ICsyNzUsMjYgQEAKIHsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IG1hZF9zdHJlYW1fcHZ0ICpzdHJlYW07Ci0JaW50IHJldF92YWwgPSAwOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAogCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Nsb3NlIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Nsb3NlIGNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJaW50ZWxtYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCi0JcHJfZGVidWcoInNzdDogc3RyIGlkID0gJWRcbiIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwlwcl9kZWJ1Zygic3RyIGlkID0gJWRcbiIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKIAlpZiAoc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpIHsKIAkJLyogU1NUIEFQSSB0byBhY3R1YWxseSBzdG9wL2ZyZWUgdGhlIHN0cmVhbSAqLwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0ZSRUUsCi0JCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPmNsb3NlKHN0cl9pZCk7CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQogCQkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQtLTsKIAkJZWxzZQogCQkJaW50ZWxtYWRkYXRhLT5jYXB0dXJlX2NudC0tOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfY2xvc2UgOiBwYiBjbnQgPSAlZCBjYXAgY250ID0gJWRcbiIsCisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9jbG9zZSA6IHBiIGNudCA9ICVkIGNhcCBjbnQgPSAlZFxuIiwKIAkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQsIGludGVsbWFkZGF0YS0+Y2FwdHVyZV9jbnQpOwogCWtmcmVlKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKTsKIAlyZXR1cm4gcmV0X3ZhbDsKQEAgLTMxOSw3ICszMTcsNyBAQAogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9vcGVuIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9vcGVuIGNhbGxlZFxuIik7CiAKIAlpbnRlbG1hZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKQEAgLTQ1NiwxNyArNDU0LDE3IEBACiB7CiAKIAlpZiAoIWphY2spIHsKLQkJcHJfZGVidWcoInNzdDogTUFEIGVycm9yIGphY2sgZW1wdHlcbiIpOworCQlwcl9kZWJ1ZygiTUFEIGVycm9yIGphY2sgZW1wdHlcbiIpOwogCiAJfSBlbHNlIHsKLQkJcHJfZGVidWcoInNzdDogTUFEIHNlbmQgamFjayByZXBvcnQgZm9yID0gJWQhISFcbiIsIHN0YXR1cyk7Ci0JCXByX2RlYnVnKCJzc3Q6IE1BRCBzZW5kIGphY2sgcmVwb3J0ICVkXG4iLCBqYWNrLT50eXBlKTsKKwkJcHJfZGVidWcoIk1BRCBzZW5kIGphY2sgcmVwb3J0IGZvciA9ICVkISEhXG4iLCBzdGF0dXMpOworCQlwcl9kZWJ1ZygiTUFEIHNlbmQgamFjayByZXBvcnQgJWRcbiIsIGphY2stPnR5cGUpOwogCQlzbmRfamFja19yZXBvcnQoamFjaywgc3RhdHVzKTsKIAogCQkvKmJ1dHRvbiBwcmVzc2VkIGFuZCByZWxlYXNlZCAqLwogCQlpZiAoYnV0dG9ucHJlc3NldmVudCkKIAkJCXNuZF9qYWNrX3JlcG9ydChqYWNrLCAwKTsKLQkJcHJfZGVidWcoInNzdDogTUFEIHNlbmRpbmcgamFjayByZXBvcnQgRG9uZSAhISFcbiIpOworCQlwcl9kZWJ1ZygiTUFEIHNlbmRpbmcgamFjayByZXBvcnQgRG9uZSAhISFcbiIpOwogCX0KIAogCkBAIC00OTAsNyArNDg4LDcgQEAKIAlpZiAoaW50c3RzICYgMHg0KSB7CiAKIAkJaWYgKCEoaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOworCQkJcHJfZGVidWcoIkF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOwogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAzKTsKIAogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX3dyaXRlLCBQTUlDX1dSSVRFLCAxKTsKQEAgLTUwMCw3ICs0OTgsNyBAQAogCiAJCX0KIAkJLyogc2VuZCBoZWFkcGhvbmUgZGV0ZWN0ICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkcGhvbmUgJWRcbiIsIGludHN0cyAmIDB4NCk7CisJCXByX2RlYnVnKCJNQUQgaGVhZHBob25lICVkXG4iLCBpbnRzdHMgJiAweDQpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQlwcmVzZW50ID0gIShpbnRlbG1hZGRhdGEtPmphY2tbMF0uamFja19zdGF0dXMpOwogCQlpbnRlbG1hZGRhdGEtPmphY2tbMF0uamFja19zdGF0dXMgPSBwcmVzZW50OwpAQCAtNTEwLDcgKzUwOCw3IEBACiAKIAlpZiAoaW50c3RzICYgMHgyKSB7CiAJCS8qIHNlbmQgc2hvcnQgcHVzaCAqLwotCQlwcl9kZWJ1Zygic3N0OiBNQUQgc2hvcnQgcHVzaCAlZFxuIiwgaW50c3RzICYgMHgyKTsKKwkJcHJfZGVidWcoIk1BRCBzaG9ydCBwdXNoICVkXG4iLCBpbnRzdHMgJiAweDIpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1syXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKIAkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTUxOCw3ICs1MTYsNyBAQAogCX0KIAlpZiAoaW50c3RzICYgMHgxKSB7CiAJCS8qIHNlbmQgbG9uZyBwdXNoICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBsb25nIHB1c2ggJWRcbiIsIGludHN0cyAmIDB4MSk7CisJCXByX2RlYnVnKCJNQUQgbG9uZyBwdXNoICVkXG4iLCBpbnRzdHMgJiAweDEpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1szXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKIAkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTUyNiw3ICs1MjQsNyBAQAogCX0KIAlpZiAoaW50c3RzICYgMHg4KSB7CiAJCWlmICghKGludGVsbWlkX2F1ZGlvX2ludGVycnVwdF9lbmFibGUpKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBBdWRpbyBpbnRlcnJ1cHQgZW5hYmxlXG4iKTsKKwkJCXByX2RlYnVnKCJBdWRpbyBpbnRlcnJ1cHQgZW5hYmxlXG4iKTsKIAkJCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMyk7CiAKIAkJCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc193cml0ZSwgUE1JQ19XUklURSwgMSk7CkBAIC01MzUsNyArNTMzLDcgQEAKIAkJCWludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrX3N0YXR1cyA9IDA7CiAJCX0KIAkJLyogc2VuZCBoZWFkc2V0IGRldGVjdCAqLwotCQlwcl9kZWJ1Zygic3N0OiBNQUQgaGVhZHNldCA9ICVkXG4iLCBpbnRzdHMgJiAweDgpOworCQlwcl9kZWJ1ZygiTUFEIGhlYWRzZXQgPSAlZFxuIiwgaW50c3RzICYgMHg4KTsKIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJcHJlc2VudCA9ICEoaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzKTsKIAkJaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzID0gcHJlc2VudDsKQEAgLTU1OCwxMCArNTU2LDEwIEBACiAKIAlzY2FyZF9vcHMgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IHByZXZpb3VzIHZhbHVlOiAleFxuIiwgaW50ZWxtYWRkYXRhLT5qYWNrX3ByZXZfc3RhdGUpOworCXByX2RlYnVnKCJwcmV2aW91cyB2YWx1ZTogJXhcbiIsIGludGVsbWFkZGF0YS0+amFja19wcmV2X3N0YXRlKTsKIAogCWlmICghKGludGVsbWlkX2F1ZGlvX2ludGVycnVwdF9lbmFibGUpKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IEF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOworCQlwcl9kZWJ1ZygiQXVkaW8gaW50ZXJydXB0IGVuYWJsZVxuIik7CiAJCWludGVsbWFkZGF0YS0+amFja19wcmV2X3N0YXRlID0gMHhDMDsKIAkJaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSA9IDE7CiAJfQpAQCAtNTcyLDEyICs1NzAsMTIgQEAKIAkJCXNjX2FjY2Vzc19yZWFkLnJlZ19hZGRyID0gMHgyMDE7CiAJCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzX3JlYWQsIFBNSUNfUkVBRCwgMSk7CiAJCQl2YWx1ZSA9IChzY19hY2Nlc3NfcmVhZC52YWx1ZSk7Ci0JCQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKKwkJCXByX2RlYnVnKCJ2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKIAkJfQogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHhjMCAmJiB2YWx1ZSA9PSAweDQwKSB7CiAJCQkvKmhlYWRzZXQgZGV0ZWN0ZWQuICovCi0JCQlwcl9kZWJ1Zygic3N0OiBNQUQgaGVhZHNldCBpbnNlcnRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGhlYWRzZXQgaW5zZXJ0ZWRcbiIpOwogCQkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJCXByZXNlbnQgPSAxOwogCQkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTU4Nyw3ICs1ODUsNyBAQAogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHhjMCAmJiB2YWx1ZSA9PSAweDAwKSB7CiAJCQkvKiBoZWFkcGhvbmUgIGRldGVjdGVkLiAqLwotCQkJcHJfZGVidWcoInNzdDogTUFEIGhlYWRwaG9uZSBpbnNlcnRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGhlYWRwaG9uZSBpbnNlcnRlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQkJcHJlc2VudCA9IDE7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNTk2LDkgKzU5NCw5IEBACiAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweDQwICYmIHZhbHVlID09IDB4YzApIHsKIAkJCS8qaGVhZHNldCAgcmVtb3ZlZCovCi0JCQlwcl9kZWJ1Zygic3N0OiBKYWNrIGhlYWRzZXQgc3RhdHVzICVkXG4iLAorCQkJcHJfZGVidWcoIkphY2sgaGVhZHNldCBzdGF0dXMgJWRcbiIsCiAJCQkJaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzKTsKLQkJCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkc2V0IHJlbW92ZWRcbiIpOworCQkJcHJfZGVidWcoIk1BRCBoZWFkc2V0IHJlbW92ZWRcbiIpOwogCQkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJCXByZXNlbnQgPSAwOwogCQkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTYwNyw5ICs2MDUsOSBAQAogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHgwMCAmJiB2YWx1ZSA9PSAweGMwKSB7CiAJCQkvKiBoZWFkcGhvbmUgIGRldGVjdGVkLiAqLwotCQkJcHJfZGVidWcoInNzdDogSmFjayBoZWFkcGhvbmUgc3RhdHVzICVkXG4iLAorCQkJcHJfZGVidWcoIkphY2sgaGVhZHBob25lIHN0YXR1cyAlZFxuIiwKIAkJCQkJaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2tfc3RhdHVzKTsKLQkJCXByX2RlYnVnKCJzc3Q6IGhlYWRwaG9uZSByZW1vdmVkXG4iKTsKKwkJCXByX2RlYnVnKCJoZWFkcGhvbmUgcmVtb3ZlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQkJcHJlc2VudCA9IDA7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNjE4LDcgKzYxNiw3IEBACiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHg0MCAmJiB2YWx1ZSA9PSAweDAwKSB7CiAJCQkvKmJ1dHRvbiBwcmVzc2VkKi8KIAkJCWRvX2dldHRpbWVvZmRheSgmaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmJ1dHRvbnByZXNzZWQpOwotCQkJcHJfZGVidWcoInNzdDogTUFEIGJ1dHRvbiBwcmVzcyBkZXRlY3RlZCBuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGJ1dHRvbiBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCX0KIAogCkBAIC02MjgsMTkgKzYyNiwxOSBAQAogCQkJCWRvX2dldHRpbWVvZmRheSgKIAkJCQkJJmludGVsbWFkZGF0YS0+amFja1sxXS5idXR0b25yZWxlYXNlZCk7CiAJCQkJLypidXR0b24gcHJlc3NlZCAqLwotCQkJCXByX2RlYnVnKCJzc3Q6IEJ1dHRvbiBSZWxlYXNlZCBkZXRlY3RlZFxuIik7CisJCQkJcHJfZGVidWcoIkJ1dHRvbiBSZWxlYXNlZCBkZXRlY3RlZFxuIik7CiAJCQkJdGltZWRpZmYgPSBpbnRlbG1hZGRhdGEtPmphY2tbMV0uCiAJCQkJCWJ1dHRvbnJlbGVhc2VkLnR2X3NlYyAtIGludGVsbWFkZGF0YS0+CiAJCQkJCWphY2tbMV0uYnV0dG9ucHJlc3NlZC50dl9zZWM7CiAJCQkJYnV0dG9ucHJlc3NmbGFnID0gMTsKIAkJCQlpZiAodGltZWRpZmYgPiAxKSB7Ci0JCQkJCXByX2RlYnVnKCJzc3Q6IGxvbmcgcHJlc3MgZGV0ZWN0ZWRcbiIpOworCQkJCQlwcl9kZWJ1ZygibG9uZyBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCQkJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQkJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1szXS5qYWNrOwogCQkJCQlwcmVzZW50ID0gMTsKIAkJCQkJamFja19ldmVudF9mbGFnID0gMTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcl9kZWJ1Zygic3N0OiBzaG9ydCBwcmVzcyBkZXRlY3RlZFxuIik7CisJCQkJCXByX2RlYnVnKCJzaG9ydCBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCQkJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQkJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1syXS5qYWNrOwogCQkJCQlwcmVzZW50ID0gMTsKQEAgLTY2NywyNCArNjY1LDI0IEBACiAJCXNjX2FjY2Vzc19yZWFkLnJlZ19hZGRyID0gMHgxMzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3NfcmVhZCwgUE1JQ19SRUFELCAxKTsKIAkJdmFsdWUgPSAoc2NfYWNjZXNzX3JlYWQudmFsdWUpOwotCQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoInZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgdmFsdWUpOwogCX0KIAlpZiAoaW50c3RzICYgMHgxKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IGhlYWRzZXQgZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygiaGVhZHNldCBkZXRlY3RlZFxuIik7CiAJCS8qIHNlbmQgaGVhZHNldCBkZXRlY3QvdW5kZXRlY3QgKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJcHJlc2VudCA9ICh2YWx1ZSA9PSAweDEpID8gMSA6IDA7CiAJCWphY2tfZXZlbnRfZmxhZyA9IDE7CiAJfQogCWlmIChpbnRzdHMgJiAweDIpIHsKLQkJcHJfZGVidWcoInNzdDogaGVhZHBob25lIGRldGVjdGVkXG4iKTsKKwkJcHJfZGVidWcoImhlYWRwaG9uZSBkZXRlY3RlZFxuIik7CiAJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQlwcmVzZW50ID0gKHZhbHVlID09IDB4MikgPyAxIDogMDsKIAkJamFja19ldmVudF9mbGFnID0gMTsKIAl9CiAJaWYgKGludHN0cyAmIDB4NCkgewotCQlwcl9kZWJ1Zygic3N0OiBzaG9ydCBwdXNoIGRldGVjdGVkXG4iKTsKKwkJcHJfZGVidWcoInNob3J0IHB1c2ggZGV0ZWN0ZWRcbiIpOwogCQkvKiBzZW5kIHNob3J0IHB1c2ggKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMl0uamFjazsKIAkJcHJlc2VudCA9IDE7CkBAIC02OTIsNyArNjkwLDcgQEAKIAkJYnV0dG9ucHJlc3NmbGFnID0gMTsKIAl9CiAJaWYgKGludHN0cyAmIDB4OCkgewotCQlwcl9kZWJ1Zygic3N0OiBsb25nIHB1c2ggZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygibG9uZyBwdXNoIGRldGVjdGVkXG4iKTsKIAkJLyogc2VuZCBsb25nIHB1c2ggKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbM10uamFjazsKIAkJcHJlc2VudCA9IDE7CkBAIC03MzgsMTIgKzczNiwxMiBAQAogCXUzMiByZWdiYXNlID0gQVVESU5UX0JBU0UsIHJlZ3NpemUgPSA4OwogCWNoYXIgKmRydl9uYW1lOwogCi0JcHJfZGVidWcoInNzdDogaXJxIHJlZyBkb25lLCByZWdiYXNlIDB4JXgsIHJlZ3NpemUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiaXJxIHJlZyBkb25lLCByZWdiYXNlIDB4JXgsIHJlZ3NpemUgMHgleFxuIiwKIAkJCQkJcmVnYmFzZSwgcmVnc2l6ZSk7CiAJaW50ZWxtYWRkYXRhLT5pbnRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZWdiYXNlLCByZWdzaXplKTsKIAlpZiAoIWludGVsbWFkZGF0YS0+aW50X2Jhc2UpCi0JCXByX2Vycigic3N0OiBNYXBwaW5nIG9mIGNhY2hlIGZhaWxlZFxuIik7Ci0JcHJfZGVidWcoInNzdDogaXJxID0gMHgleFxuIiwgaW50ZWxtYWRkYXRhLT5pcnEpOworCQlwcl9lcnIoIk1hcHBpbmcgb2YgY2FjaGUgZmFpbGVkXG4iKTsKKwlwcl9kZWJ1ZygiaXJxID0gMHgleFxuIiwgaW50ZWxtYWRkYXRhLT5pcnEpOwogCWlmIChpbnRlbG1hZGRhdGEtPmNwdV9pZCA9PSBDUFVfQ0hJUF9QRU5XRUxMKQogCQlkcnZfbmFtZSA9IERSSVZFUl9OQU1FX01GTEQ7CiAJZWxzZQpAQCAtNzUzLDcgKzc1MSw3IEBACiAJCQkJSVJRRl9TSEFSRUQsIGRydl9uYW1lLAogCQkJCWludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpCi0JCXByX2Vycigic3N0OiBjYW5ub3QgcmVnaXN0ZXIgSVJRXG4iKTsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgSVJRXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtNzc1LDEwICs3NzMsMTAgQEAKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3N0X2NhcmRfdmVuZG9yX2lkID0gKHZlbmRvcl9hZGRyLnZhbHVlICYgKE1BU0syfE1BU0sxfE1BU0swKSk7Ci0JCXByX2RlYnVnKCJzc3Q6IG9yZ2luYWwgbiBleHRyYXRlZCB2ZW5kb3IgaWQgPSAweCV4ICVkXG4iLAorCQlwcl9kZWJ1Zygib3JnaW5hbCBuIGV4dHJhdGVkIHZlbmRvciBpZCA9IDB4JXggJWRcbiIsCiAJCQkJdmVuZG9yX2FkZHIudmFsdWUsIHNzdF9jYXJkX3ZlbmRvcl9pZCk7CiAJCWlmIChzc3RfY2FyZF92ZW5kb3JfaWQgPCAwIHx8IHNzdF9jYXJkX3ZlbmRvcl9pZCA+IDIpIHsKLQkJCXByX2Vycigic3N0OiB2ZW5kb3IgY2FyZCBub3Qgc3VwcG9ydGVkISFcbiIpOworCQkJcHJfZXJyKCJ2ZW5kb3IgY2FyZCBub3Qgc3VwcG9ydGVkISFcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9IGVsc2UKQEAgLTgwMSw3ICs3OTksNyBAQAogCS8qIHJlZ2lzdGVyaW5nIHdpdGggU1NUIGRyaXZlciB0byBnZXQgYWNjZXNzIHRvIFNTVCBBUElzIHRvIHVzZSAqLwogCXJldF92YWwgPSByZWdpc3Rlcl9zc3RfY2FyZChpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzc3QgY2FyZCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJzc3QgY2FyZCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC04MzIsNyArODMwLDcgQEAKIAljaGFyIG5hbWVbMzJdID0gSU5URUxfTUFEOwogCXN0cnVjdCBzbmRfcGNtX29wcyAqcGJfb3BzID0gTlVMTCwgKmNhcF9vcHMgPSBOVUxMOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBwYiAlZCwgY3AgJWQsIGlkeCAlZFxuIiwgcGIsIGNhcCwgaW5kZXgpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yIHBiICVkLCBjcCAlZCwgaWR4ICVkXG4iLCBwYiwgY2FwLCBpbmRleCk7CiAJcmV0X3ZhbCA9IHNuZF9wY21fbmV3KGNhcmQsIG5hbWUsIGluZGV4LCBwYiwgY2FwLCAmcGNtKTsKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CkBAIC04NzgsNyArODc2LDcgQEAKIAogCVdBUk5fT04oIWNhcmQpOwogCVdBUk5fT04oIWludGVsbWFkZGF0YSk7Ci0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX3BjbSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfcGNtIGNhbGxlZFxuIik7CiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9wY21fbmV3KGNhcmQsIGludGVsbWFkZGF0YSwgMSwgMSwgMCk7CiAJaWYgKGludGVsbWFkZGF0YS0+Y3B1X2lkID09IENQVV9DSElQX0xJTkNST0ZUKQogCQlyZXR1cm4gcmV0X3ZhbDsKQEAgLTkwMyw3ICs5MDEsNyBAQAogCXN0cnVjdCBzbmRfamFjayAqamFjazsKIAlpbnQgcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2phY2sgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2phY2sgY2FsbGVkXG4iKTsKIAlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCXJldHZhbCA9IHNuZF9qYWNrX25ldyhpbnRlbG1hZGRhdGEtPmNhcmQsICJIZWFkcGhvbmUiLAogCQkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmphY2spOwpAQCAtOTgyLDkgKzk4MCw5IEBACiAJCXJldF92YWwgPSBzbmRfY3RsX2FkZChjYXJkLAogCQkJCXNuZF9jdGxfbmV3MSgmY29udHJvbHNbaWR4XSwKIAkJCQlpbnRlbG1hZGRhdGEpKTsKLQkJcHJfZGVidWcoInNzdDogbWl4ZXJbaWR4XT0lZCBhZGRlZFxuIiwgaWR4KTsKKwkJcHJfZGVidWcoIm1peGVyW2lkeF09JWQgYWRkZWRcbiIsIGlkeCk7CiAJCWlmIChyZXRfdmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogaW4gYWRkaW5nIG9mIGNvbnRyb2wgaW5kZXggPSAlZFxuIiwgaWR4KTsKKwkJCXByX2VycigiaW4gYWRkaW5nIG9mIGNvbnRyb2wgaW5kZXggPSAlZFxuIiwgaWR4KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTk5LDcgKzk5Nyw3IEBACiAKIAlpbnRlbG1hZGRhdGEgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Rldl9mcmVlIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9kZXZfZnJlZSBjYWxsZWRcbiIpOwogCXNuZF9jYXJkX2ZyZWUoaW50ZWxtYWRkYXRhLT5jYXJkKTsKIAkvKmdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJmF1ZGlvX2V2ZW50X2dlbmxfZmFtaWx5KTsqLwogCXVucmVnaXN0ZXJfc3N0X2NhcmQoaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKTsKQEAgLTEwNDAsMjMgKzEwMzgsMjMgQEAKIAljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CiAJdW5zaWduZWQgaW50IGNwdV9pZCA9ICh1bnNpZ25lZCBpbnQpaWQtPmRyaXZlcl9kYXRhOwogCi0JcHJfZGVidWcoInNzdDogcHJvYmUgZm9yICVzIGNwdV9pZCAlZFxuIiwgcGRldi0+bmFtZSwgY3B1X2lkKTsKKwlwcl9kZWJ1ZygicHJvYmUgZm9yICVzIGNwdV9pZCAlZFxuIiwgcGRldi0+bmFtZSwgY3B1X2lkKTsKIAlpZiAoIXN0cmNtcChwZGV2LT5uYW1lLCBEUklWRVJfTkFNRV9NUlNUKSkKLQkJcHJfZGVidWcoInNzdDogZGV0ZWN0ZWQgTVJTVFxuIik7CisJCXByX2RlYnVnKCJkZXRlY3RlZCBNUlNUXG4iKTsKIAllbHNlIGlmICghc3RyY21wKHBkZXYtPm5hbWUsIERSSVZFUl9OQU1FX01GTEQpKQotCQlwcl9kZWJ1Zygic3N0OiBkZXRlY3RlZCBNRkxEXG4iKTsKKwkJcHJfZGVidWcoImRldGVjdGVkIE1GTERcbiIpOwogCWVsc2UgewotCQlwcl9lcnIoInNzdDogZGV0ZWN0ZWQgdW5rbm93biBkZXZpY2UgYWJvcnQhIVxuIik7CisJCXByX2VycigiZGV0ZWN0ZWQgdW5rbm93biBkZXZpY2UgYWJvcnQhIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoKGNwdV9pZCA8IENQVV9DSElQX0xJTkNST0ZUKSB8fCAoY3B1X2lkID4gQ1BVX0NISVBfUEVOV0VMTCkpIHsKLQkJcHJfZXJyKCJzc3Q6IGRldGVjdGVkIHVua25vd24gY3B1X2lkIGFib3J0ISFcbiIpOworCQlwcl9lcnIoImRldGVjdGVkIHVua25vd24gY3B1X2lkIGFib3J0ISFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgaW50ZXJuYWwgY29udGV4dCBhbmQgd29ya2luZyAqLwogCWludGVsbWFkZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlbG1hZGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWludGVsbWFkZGF0YSkgewotCQlwcl9kZWJ1Zygic3N0OiBtZW0gYWxsb2N0biBmYWlsXG4iKTsKKwkJcHJfZGVidWcoIm1lbSBhbGxvY3RuIGZhaWxcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwNjQsNyArMTA2Miw3IEBACiAJaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyksCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmb3Igb3BzIGZhaWxcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZvciBvcHMgZmFpbFxuIik7CiAJCWtmcmVlKGludGVsbWFkZGF0YSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEwNzMsNyArMTA3MSw3IEBACiAJLyogY3JlYXRlIGEgY2FyZCBpbnN0YW5jZSB3aXRoIEFMU0EgZnJhbWV3b3JrICovCiAJcmV0X3ZhbCA9IHNuZF9jYXJkX2NyZWF0ZShjYXJkX2luZGV4LCBjYXJkX2lkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfY2FyZF9jcmVhdGUgZmFpbFxuIik7CisJCXByX2Vycigic25kX2NhcmRfY3JlYXRlIGZhaWxcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIApAQCAtMTA5Miw3ICsxMDkwLDcgQEAKIAkvKiByZWdpc3RlcmluZyB3aXRoIExQRSBkcml2ZXIgdG8gZ2V0IGFjY2VzcyB0byBTU1QgQVBJcyB0byB1c2UgKi8KIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3NzdF9yZWdpc3RlcihpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfc3N0X3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX3NzdF9yZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIApAQCAtMTEwMCwxOSArMTA5OCwxOSBAQAogCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9wY20oY2FyZCwgaW50ZWxtYWRkYXRhKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2ludGVsbWFkX3BjbSBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9wY20gZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX21peGVyKGludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9pbnRlbG1hZF9taXhlciBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9taXhlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfamFjayhpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfamFjayBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9qYWNrIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCkBAIC0xMTI2LDMxICsxMTI0LDMxIEBACiAKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3JlZ2lzdGVyX2lycShpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfcmVnaXN0ZXJfaXJxIGZhaWxcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9yZWdpc3Rlcl9pcnEgZmFpbFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCiAJLyogaW50ZXJuYWwgZnVuY3Rpb24gY2FsbCB0byByZWdpc3RlciBkZXZpY2Ugd2l0aCBBTFNBICovCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9jcmVhdGUoaW50ZWxtYWRkYXRhLCBjYXJkKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2ludGVsbWFkX2NyZWF0ZSBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9jcmVhdGUgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gJmludGVsbWFkZGF0YTsKIAlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCXJldF92YWwgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2NhcmRfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJzbmRfY2FyZF9yZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6c25kX2ludGVsbWFkX3Byb2JlIGNvbXBsZXRlXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX3Byb2JlIGNvbXBsZXRlXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIAogZnJlZV9tYWRfamFja193cToKIAlkZXN0cm95X3dvcmtxdWV1ZShpbnRlbG1hZGRhdGEtPm1hZF9qYWNrX3dxKTsKIGZyZWVfYWxsb2NzOgotCXByX2Vycigic3N0OiBwcm9iZSBmYWlsZWRcbiIpOworCXByX2VycigicHJvYmUgZmFpbGVkXG4iKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCWtmcmVlKGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcyk7CiAJa2ZyZWUoaW50ZWxtYWRkYXRhKTsKQEAgLTEyMDAsNyArMTE5OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9pbnRlbG1hZF9pbml0KHZvaWQpCiB7Ci0JcHJfZGVidWcoInNzdDogbWFkX2luaXQgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygibWFkX2luaXQgY2FsbGVkXG4iKTsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfaW50ZWxtYWRfZHJpdmVyKTsKIH0KIApAQCAtMTIxMSw3ICsxMjA5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9pbnRlbG1hZF9leGl0KHZvaWQpCiB7Ci0JcHJfZGVidWcoInNzdDptYWRfZXhpdCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJtYWRfZXhpdCBjYWxsZWRcbiIpOwogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX2ludGVsbWFkX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuaAppbmRleCA4MWU3NDQ4Li4wY2UxMDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5oCkBAIC0xNzgsOSArMTc4LDQgQEAKIGV4dGVybiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaW50ZWxtYWRfY29udHJvbHNfbWZsZFtdOwogZXh0ZXJuIHN0cnVjdCBzbmRfcG1pY19vcHMgKmludGVsbWFkX3ZlbmRvcl9vcHNbXTsKIAotLyogVGhpcyBpcyBhbiBlbmFibGVyIGhvb2sgYXMgdGhlIHBsYXRmb3JtIGRldGVjdGlvbiBsb2dpYyBpc24ndCB5ZXQKLSAgIHByZXNlbnQgYW5kIGRlcGVuZHMgb24gc29tZSBmaXJtd2FyZSBhbmQgRE1JIHN1cHBvcnQgdG8gZGV0ZWN0IEFBVkEKLSAgIGRldmljZXMuIEl0IHdpbGwgdmFuaXNoIG9uY2UgdGhlIEFBVkEgcGxhdGZvcm0gc3VwcG9ydCBpcyBtZXJnZWQgKi8KLSNkZWZpbmUgaXNfYWF2YSgpCTAKLQogI2VuZGlmIC8qIF9fSU5URUxNSURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9jdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYwppbmRleCAwM2I0ZWNlLi42OWFmMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYwpAQCAtMjQsNiArMjQsOSBAQAogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqICBBTFNBIGRyaXZlciBoYW5kbGluZyBtaXhlciBjb250cm9scyBmb3IgSW50ZWwgTUFEIGNoaXBzZXQKICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgImphY2suaCIKQEAgLTIxNiw3ICsyMTksNyBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfdm9sdW1lX2dldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfdm9sdW1lX2dldCBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighdXZhbCk7CiAJV0FSTl9PTigha2NvbnRyb2wpOwpAQCAtMjczLDcgKzI3Niw3IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IE11dGVfZ2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoIk11dGVfZ2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC0zMzIsNyArMzM1LDcgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCi0JcHJfZGVidWcoInNzdDogdm9sdW1lIHNldCBjYWxsZWQ6JWxkICVsZFxuIiwKKwlwcl9kZWJ1Zygidm9sdW1lIHNldCBjYWxsZWQ6JWxkICVsZFxuIiwKIAkJCXV2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCiAJCQl1dmFsLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKIApAQCAtMzg3LDcgKzM5MCw3IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9tdXRlX3NldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfbXV0ZV9zZXQgY2FsbGVkXG4iKTsKIAogCVdBUk5fT04oIXV2YWwpOwogCVdBUk5fT04oIWtjb250cm9sKTsKQEAgLTQ1NSw3ICs0NTgsNyBAQAogewogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7Ci0JcHJfZGVidWcoInNzdDogZGV2aWNlX2dldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJkZXZpY2VfZ2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC00OTEsOCArNDk0LDkgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCWludCByZXRfdmFsID0gMCwgdmVuZG9yLCBzdGF0dXM7CisJc3RydWN0IGludGVsX3NzdF9wY21fY29udHJvbCAqcGNtX2NvbnRyb2w7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfZGV2aWNlX3NldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfZGV2aWNlX3NldCBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighdXZhbCk7CiAJV0FSTl9PTigha2NvbnRyb2wpOwpAQCAtNTE4LDE1ICs1MjIsMTMgQEAKIAljYXNlIElOUFVUX1NFTDoKIAkJdmVuZG9yID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT52ZW5kb3JfaWQ7CiAJCWlmICgodmVuZG9yID09IFNORF9NWCkgfHwgKHZlbmRvciA9PSBTTkRfRlMpKSB7Ci0JCQlpZiAodXZhbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IEhTX01JQykgeworCQkJcGNtX2NvbnRyb2wgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sOworCQkJaWYgKHV2YWwtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSBIU19NSUMpCiAJCQkJc3RhdHVzID0gMTsKLQkJCQlpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPgotCQkJCWNvbnRyb2xfc2V0KFNTVF9FTkFCTEVfUlhfVElNRV9TTE9ULCAmc3RhdHVzKTsKLQkJCX0gZWxzZSB7CisJCQllbHNlCiAJCQkJc3RhdHVzID0gMDsKLQkJCQlpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPgotCQkJCWNvbnRyb2xfc2V0KFNTVF9FTkFCTEVfUlhfVElNRV9TTE9ULCAmc3RhdHVzKTsKLQkJCX0KKwkJCXBjbV9jb250cm9sLT5kZXZpY2VfY29udHJvbCgKKwkJCQkJU1NUX0VOQUJMRV9SWF9USU1FX1NMT1QsICZzdGF0dXMpOwogCQl9CiAJCXJldF92YWwgPSBzY2FyZF9vcHMtPnNldF9pbnB1dF9kZXYoCiAJCQkJdXZhbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfbXNpY19jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX21zaWNfY29udHJvbC5jCmluZGV4IDRkMTc1NWUuLmRhMDkzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfbXNpY19jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9tc2ljX2NvbnRyb2wuYwpAQCAtMjQsNiArMjQsOCBAQAogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb250cm9sIG9wZXJhdGlvbnMgb2YgbXNpYyB2ZW5kb3JzCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgpAQCAtODMsNyArODUsNyBAQAogCXNuZF9tc2ljX29wcy5jYXBfb24gPSAwOwogCXNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQgPSBETUlDOyAvKmRlZiBkZXYqLwogCXNuZF9tc2ljX29wcy5vdXRwdXRfZGV2X2lkID0gU1RFUkVPX0hFQURQSE9ORTsKLQlwcl9kZWJ1Zygic3N0OiBtc2ljIGluaXQgY29tcGxldGUhIVxuIik7CisJcHJfZGVidWcoIm1zaWMgaW5pdCBjb21wbGV0ZSEhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTczLDcgKzE3NSw3IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIHVwIHBiLi4uLiBEZXZpY2UgJWRcbiIsIGRldmljZSk7CisJcHJfZGVidWcoInBvd2VyaW5nIHVwIHBiLi4uLiBEZXZpY2UgJWRcbiIsIGRldmljZSk7CiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzMSwgUE1JQ19XUklURSwgNCk7CiAJc3dpdGNoIChkZXZpY2UpIHsKIAljYXNlIFNORF9TU1RfREVWSUNFX0hFQURTRVQ6CkBAIC0yMDUsNyArMjA3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcl93YXJuKCJzc3Q6IFdyb25nIERldmljZSAlZCwgc2VsZWN0ZWQgJWRcbiIsCisJCXByX3dhcm4oIldyb25nIERldmljZSAlZCwgc2VsZWN0ZWQgJWRcbiIsCiAJCQkgICAgICAgZGV2aWNlLCBzbmRfbXNpY19vcHMub3V0cHV0X2Rldl9pZCk7CiAJfQogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfcGNtMiwgUE1JQ19SRUFEX01PRElGWSwgMSk7CkBAIC0yNjgsNyArMjcwLDcgQEAKIAkJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgY3AuLi4uJWRcbiIsIHNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQpOworCXByX2RlYnVnKCJwb3dlcmluZyB1cCBjcC4uLi4lZFxuIiwgc25kX21zaWNfb3BzLmlucHV0X2Rldl9pZCk7CiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzMiwgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDE7CiAJaWYgKHNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQgPT0gQU1JQykKQEAgLTI4Myw3ICsyODUsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gbXNpY1xuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIGRuIG1zaWNcbiIpOwogCXNuZF9tc2ljX29wcy5wYl9vbiA9IDA7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDA7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI5Myw3ICsyOTUsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gcGIuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gcGIuLi4uXG4iKTsKIAlzbmRfbXNpY19vcHMucGJfb24gPSAwOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0zMDIsNyArMzA0LDcgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIGRuIGNwLi4uLlxuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIGRuIGNwLi4uLlxuIik7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDA7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMxMSw3ICszMTMsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogbXNpYyBzZXQgc2VsZWN0ZWQgb3V0cHV0OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm1zaWMgc2V0IHNlbGVjdGVkIG91dHB1dDolZFxuIiwgdmFsdWUpOwogCXNuZF9tc2ljX29wcy5vdXRwdXRfZGV2X2lkID0gdmFsdWU7CiAJaWYgKHNuZF9tc2ljX29wcy5wYl9vbikKIAkJbXNpY19wb3dlcl91cF9wYihTTkRfU1NUX0RFVklDRV9IRUFEU0VUKTsKQEAgLTMzMCwxNSArMzMyLDE1IEBACiAJfTsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IG1zaWNfc2V0X3NlbGVjdGVkX2lucHV0X2RldjolZFxuIiwgdmFsdWUpOworCXByX2RlYnVnKCJtc2ljX3NldF9zZWxlY3RlZF9pbnB1dF9kZXY6JWRcbiIsIHZhbHVlKTsKIAlzbmRfbXNpY19vcHMuaW5wdXRfZGV2X2lkID0gdmFsdWU7CiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgQU1JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIEFNSUMxXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBBTUlDMVxuIik7CiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19hbWljLCBQTUlDX1dSSVRFLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBETUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgRE1JQzFcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIERNSUMxXG4iKTsKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2RtaWMsIFBNSUNfV1JJVEUsIDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9wdnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfcHZ0LmMKaW5kZXggOWVkOTQ3NS4uM2JhOWRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9wdnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3B2dC5jCkBAIC0yMyw2ICsyMyw5IEBACiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICogQUxTQSBkcml2ZXIgZm9yIEludGVsIE1JRCBzb3VuZCBjYXJkIGNoaXBzZXQgLSBob2xkaW5nIHByaXZhdGUgZnVuY3Rpb25zCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTUwLDcgKzUzLDcgQEAKIAogCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0gUlVOTklORykKIAkJcmV0dXJuOwotCXByX2RlYnVnKCJzc3Q6IGNhbGxpbmcgcGVyaW9kIGVsYXBzZWRcbiIpOworCXByX2RlYnVnKCJjYWxsaW5nIHBlcmlvZCBlbGFwc2VkXG4iKTsKIAlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAJcmV0dXJuOwogfQpAQCAtNzYsOCArNzksOCBAQAogCXBhcmFtLnVjLnBjbV9wYXJhbXMucGVyaW9kX2NvdW50ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAlwYXJhbS51Yy5wY21fcGFyYW1zLnJpbmdfYnVmZmVyX2FkZHIgPQogCQkJCXZpcnRfdG9fcGh5cyhzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKTsKLQlwcl9kZWJ1Zygic3N0OiBwZXJpb2RfY250ID0gJWRcbiIsIHBhcmFtLnVjLnBjbV9wYXJhbXMucGVyaW9kX2NvdW50KTsKLQlwcl9kZWJ1Zygic3N0OiBzZnJlcT0gJWQsIHdkX3N6ID0gJWRcbiIsCisJcHJfZGVidWcoInBlcmlvZF9jbnQgPSAlZFxuIiwgcGFyYW0udWMucGNtX3BhcmFtcy5wZXJpb2RfY291bnQpOworCXByX2RlYnVnKCJzZnJlcT0gJWQsIHdkX3N6ID0gJWRcbiIsCiAJCSBwYXJhbS51Yy5wY21fcGFyYW1zLnNmcmVxLCBwYXJhbS51Yy5wY21fcGFyYW1zLnBjbV93ZF9zeik7CiAKIAlzdHJfcGFyYW1zLnNwYXJhbXMgPSBwYXJhbTsKQEAgLTg1LDI0ICs4OCwyMiBAQAogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCQlwcl9kZWJ1Zygic3N0OiBQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsIHN0cmVhbS0+ZGV2aWNlKTsKKwkJcHJfZGVidWcoIlBsYXliY2sgc3RyZWFtLERldmljZSAlZFxuIiwgc3RyZWFtLT5kZXZpY2UpOwogCX0gZWxzZSB7CiAJCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOwogCQlzdHJlYW0tPmRldmljZSA9IFNORF9TU1RfREVWSUNFX0NBUFRVUkU7Ci0JCXByX2RlYnVnKCJzc3Q6IENhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwgc3RyZWFtLT5kZXZpY2UpOworCQlwcl9kZWJ1ZygiQ2FwdHVyZSBzdHJlYW0sRGV2aWNlICVkXG4iLCBzdHJlYW0tPmRldmljZSk7CiAJfQogCXN0cl9wYXJhbXMuZGV2aWNlX3R5cGUgPSBzdHJlYW0tPmRldmljZTsKLQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0FMTE9DLAotCQkJCQkmc3RyX3BhcmFtcyk7Ci0JcHJfZGVidWcoInNzdDogU1NUX1NORF9QTEFZL0NBUFRVUkUgcmV0X3ZhbCA9ICV4XG4iLAotCQkJcmV0X3ZhbCk7CisJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPm9wZW4oJnN0cl9wYXJhbXMpOworCXByX2RlYnVnKCJzc3Q6IFNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7CiAJaWYgKHJldF92YWwgPCAwKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAogCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKIAlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBJTklUOwogCXN0cmVhbS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7Ci0JcHJfZGVidWcoInNzdDogc3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJcHJfZGVidWcoInN0ciBpZCA6ICAlZFxuIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwogCiAJcmV0dXJuIHJldF92YWw7CiB9CkBAIC0xMTMsMTUgKzExNCwxNSBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgcmV0X3ZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldHRpbmcgYnVmZmVyIHB0ciBwYXJhbVxuIik7CisJcHJfZGVidWcoInNldHRpbmcgYnVmZmVyIHB0ciBwYXJhbVxuIik7CiAJc3RyZWFtLT5zdHJlYW1faW5mby5wZXJpb2RfZWxhcHNlZCA9IHBlcmlvZF9lbGFwc2VkOwogCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOwogCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7Ci0JcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9TVFJFQU1fSU5JVCwKLQkJCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8pOworCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sLT5kZXZpY2VfY29udHJvbCgKKwkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKIAlpZiAocmV0X3ZhbCkKLQkJcHJfZXJyKCJzc3Q6IGNvbnRyb2xfc2V0IHJldCBlcnJvciAlZFxuIiwgcmV0X3ZhbCk7CisJCXByX2VycigiY29udHJvbF9zZXQgcmV0IGVycm9yICVkXG4iLCByZXRfdmFsKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIAogfQpAQCAtMTQ1LDMwICsxNDYsMjkgQEAKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY19pb3dyaXRlOChzY19hY2Nlc3NbaV0ucmVnX2FkZHIsCiAJCQkJCQkJc2NfYWNjZXNzW2ldLnZhbHVlKTsKLQkJCWlmIChyZXR2YWwpIHsKLQkJCQlwcl9lcnIoInNzdDogSVBDIHdyaXRlIGZhaWxlZCEhISAlZFxuIiwgcmV0dmFsKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycjsKIAkJfQogCX0gZWxzZSBpZiAodHlwZSA9PSBQTUlDX1JFQUQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY19pb3JlYWQ4KHNjX2FjY2Vzc1tpXS5yZWdfYWRkciwKIAkJCQkJCQkmKHNjX2FjY2Vzc1tpXS52YWx1ZSkpOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBJUEMgcmVhZCBmYWlsZWQhISEhISVkXG4iLCByZXR2YWwpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIoCiAJCQkJc2NfYWNjZXNzW2ldLnJlZ19hZGRyLCBzY19hY2Nlc3NbaV0udmFsdWUsCiAJCQkJc2NfYWNjZXNzW2ldLm1hc2spOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBJUEMgTW9kaWZ5IGZhaWxlZCEhISVkXG4iLCByZXR2YWwpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyOwogCQl9CiAJfQotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7CitlcnI6CisJcHJfZXJyKCJJUEMgZmFpbGVkIGZvciBjbWQgJWQsICVkXG4iLCByZXR2YWwsIHR5cGUpOworCXByX2VycigicmVnOjB4JTJ4IGFkZHI6MHglMnhcbiIsCisJCXNjX2FjY2Vzc1tpXS5yZWdfYWRkciwgc2NfYWNjZXNzW2ldLnZhbHVlKTsKKyAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjBfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKaW5kZXggZjU4NmQ2Mi4uNzg1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiB2ZW5kb3IgMQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKQEAgLTE1MSw3ICsxNTMsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBpbiBmcyBwb3dlciB1cCBwYlxuIik7CisJcHJfZGVidWcoImluIGZzIHBvd2VyIHVwIHBiXG4iKTsKIAlyZXR1cm4gZnNfZW5hYmxlX2F1ZGlvZGFjKFVOTVVURSk7CiB9CiAKQEAgLTE3Myw3ICsxNzUsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBpbiBmc2wgcG93ZXIgZG93biBwYlxuIik7CisJcHJfZGVidWcoImluIGZzbCBwb3dlciBkb3duIHBiXG4iKTsKIAlyZXR1cm4gZnNfZW5hYmxlX2F1ZGlvZGFjKFVOTVVURSk7CiB9CiAKQEAgLTM4MCw3ICszODIsNyBAQAogCQlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCiAJfQotCXByX2RlYnVnKCJzc3Q6IHNmcmVxOiVkLFJlZ2lzdGVyIHZhbHVlID0gJXhcbiIsIHNmcmVxLCBjb25maWcxKTsKKwlwcl9kZWJ1Zygic2ZyZXE6JWQsUmVnaXN0ZXIgdmFsdWUgPSAleFxuIiwgc2ZyZXEsIGNvbmZpZzEpOwogCiAJaWYgKHdvcmRfc2l6ZSA9PSAyNCkgewogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgID0gQVVESU9QT1JUMTsKQEAgLTQzOCwxOCArNDQwLDE4IEBACiAKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBBTUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgYW1pYyBub3Qgc3VwcG9ydGVkIGluIG1vbm8gY2ZnXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBhbWljIG5vdCBzdXBwb3J0ZWQgaW4gbW9ubyBjZmdcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX21pYywgUE1JQ19SRUFEX01PRElGWSwgMik7CiAJCWJyZWFrOwogCiAJY2FzZSBIU19NSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBoc21pY1xuIik7CisJCXByX2RlYnVnKCJTZWxlY3RpbmcgaHNtaWNcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2hzbWljLAogCQkJCVBNSUNfUkVBRF9NT0RJRlksIDIpOwogCQlicmVhazsKIAogCWNhc2UgRE1JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIGRtaWNcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIGRtaWNcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2RtaWMsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCQlicmVhazsKIApAQCAtNTA1LDcgKzUwNyw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAotCXByX2RlYnVnKCJzc3Q6IGRldl9pZDoweCV4IHZhbHVlOjB4JXhcbiIsIGRldl9pZCwgdmFsdWUpOworCXByX2RlYnVnKCJkZXZfaWQ6MHgleCB2YWx1ZToweCV4XG4iLCBkZXZfaWQsIHZhbHVlKTsKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfRE1JQ19NVVRFOgogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBNSUNDVFJMOwpAQCAtNjA2LDcgKzYwOCw3IEBACiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfTEVGVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0xFRlRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9MRUZUX1BCX1ZPTDolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSBzY19hY2Nlc3NbMV0udmFsdWUgPSB2YWx1ZTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gQVVEMTY7CiAJCXNjX2FjY2Vzc1sxXS5yZWdfYWRkciA9IEFVRDE1OwpAQCAtNjE2LDcgKzYxOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9SSUdIVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX1JJR0hUX1BCX1ZPTDolZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfUklHSFRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IHNjX2FjY2Vzc1sxXS52YWx1ZSA9IHZhbHVlOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBBVUQxNzsKIAkJc2NfYWNjZXNzWzFdLnJlZ19hZGRyID0gQVVEMTU7CkBAIC02MjksNyArNjMxLDcgQEAKIAkJcmVnX251bSA9IDI7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfQ0FQVFVSRV9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0NBUFRVUkVfVk9MOiVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9DQVBUVVJFX1ZPTDolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBNSUNMSUNUUkwxOwogCQlzY19hY2Nlc3NbMV0ucmVnX2FkZHIgPSBNSUNMSUNUUkwyOwogCQlzY19hY2Nlc3NbMl0ucmVnX2FkZHIgPSBETUlDQ1RSTDE7CkBAIC03MjYsMTcgKzcyOCwxNyBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0NBUFRVUkVfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9DQVBUVVJFX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9DQVBUVVJFX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IE1JQ0xJQ1RSTDE7CiAJCW1hc2sgPSAoTUFTSzV8TUFTSzR8TUFTSzN8TUFTSzJ8TUFTSzF8TUFTSzApOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0xFRlRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9MRUZUX1BCX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9MRUZUX1BCX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRDE2OwogCQltYXNrID0gKE1BU0s1fE1BU0s0fE1BU0szfE1BU0syfE1BU0sxfE1BU0swKTsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9SSUdIVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX1JUX1BCX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9SVF9QQl9WT0xcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBBVUQxNzsKIAkJbWFzayA9IChNQVNLNXxNQVNLNHxNQVNLM3xNQVNLMnxNQVNLMXxNQVNLMCk7CiAJCWJyZWFrOwpAQCAtNzQ1LDkgKzc0Nyw5IEBACiAJfQogCiAJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2VzcywgUE1JQ19SRUFELCAxKTsKLQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZWFkID0gMHgleFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKKwlwcl9kZWJ1ZygidmFsdWUgcmVhZCA9IDB4JXhcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CiAJKnZhbHVlID0gKGludCkgKHNjX2FjY2Vzcy52YWx1ZSAmIG1hc2spOwotCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgKnZhbHVlKTsKKwlwcl9kZWJ1ZygidmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCAqdmFsdWUpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjFfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKaW5kZXggOWRlODZiMi4uNDc4Y2ZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKQEAgLTI1LDYgKzI1LDggQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiB2ZW5kb3IgMgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgpAQCAtMTMyLDU2ICsxMzQsNiBAQAogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDQ3KTsKIH0KIAotc3RhdGljIGludCBteF9pbml0X2NhcHR1cmVfY2FyZCh2b2lkKQotewotCXN0cnVjdCBzY19yZWdfYWNjZXNzIHNjX2FjY2Vzc1tdID0gewotCQl7MHgyMDYsIDB4NWEsIDB4MH0sCi0JCXsweDIwNywgMHhiZSwgMHgwfSwKLQkJezB4MjA4LCAweDkwLCAweDB9LAotCQl7MHgyMDksIDB4MzIsIDB4MH0sCi0JCXsweDIwZSwgMHgyMiwgMHgwfSwKLQkJezB4MjEwLCAweDg0LCAweDB9LAotCQl7MHgyMjMsIDB4MjAsIDB4MH0sCi0JCXsweDIyNiwgMHhDMCwgMHgwfSwKLQl9OwotCi0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDgpOwotCWlmICgwICE9IHJldHZhbCkgewotCQkvKiBwbWljIGNvbW11bmljYXRpb24gZmFpbHMgKi8KLQkJcHJfZGVidWcoInNzdDogcG1pYyBjb21tbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByX2RlYnVnKCJzc3Q6IENhcHR1cmUgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteF9pbml0X3BsYXliYWNrX2NhcmQodm9pZCkKLXsKLQlzdHJ1Y3Qgc2NfcmVnX2FjY2VzcyBzY19hY2Nlc3NbXSA9IHsKLQkJezB4MjA2LCAweDAwLCAweDB9LAotCQl7MHgyMDcsIDB4MDAsIDB4MH0sCi0JCXsweDIwOCwgMHgwMCwgMHgwfSwKLQkJezB4MjA5LCAweDUxLCAweDB9LAotCQl7MHgyMGUsIDB4NTEsIDB4MH0sCi0JCXsweDIxMCwgMHgyMSwgMHgwfSwKLQkJezB4MjIzLCAweDAxLCAweDB9LAotCX07Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDkpOwotCWlmICgwICE9IHJldHZhbCkgewotCQkvKiBwbWljIGNvbW11bmljYXRpb24gZmFpbHMgKi8KLQkJcHJfZGVidWcoInNzdDogcG1pYyBjb21tbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByX2RlYnVnKCJzc3Q6IFBsYXliYWNrIGNvbmZpZ3VyYXRpb24gY29tcGxldGUhIVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXhfZW5hYmxlX2F1ZGlvZGFjKGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2NfcmVnX2FjY2VzcyBzY19hY2Nlc3NbM107CkBAIC0yMDQsNyArMTU2LDcgQEAKIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JcHJfZGVidWcoInNzdDogbXV0ZSBzdGF0dXMgPSAlZCIsIHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyk7CisJcHJfZGVidWcoIm11dGUgc3RhdHVzID0gJWRcbiIsIHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyk7CiAJaWYgKHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyA9PSBNVVRFIHx8CiAJCQkJc25kX3BtaWNfb3BzX214Lm1hc3Rlcl9tdXRlID09IE1VVEUpCiAJCXJldHVybiByZXR2YWw7CkBAIC00MTIsNyArMzY0LDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IFNTVCBEQkcgbXhfc2V0X3BjbV92b2ljZV9wYXJhbXMgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiU1NUIERCRzpteF9zZXRfcGNtX3ZvaWNlX3BhcmFtcyBjYWxsZWRcbiIpOwogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDQ0KTsKIH0KIApAQCAtNTI5LDcgKzQ4MSw3IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6IG14X3NldF9zZWxlY3RlZF9vdXRwdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJteF9zZXRfc2VsZWN0ZWRfb3V0cHV0X2RldiBkZXZfaWQ6MHgleFxuIiwgZGV2X2lkKTsKIAlzbmRfcG1pY19vcHNfbXgub3V0cHV0X2Rldl9pZCA9IGRldl9pZDsKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgU1RFUkVPX0hFQURQSE9ORToKQEAgLTU0OSw3ICs1MDEsNyBAQAogCQludW1fcmVnID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBSRUNFSVZFUjoKLQkJcHJfZGVidWcoInNzdDogUkVDRUlWRVIgS29za2kgc2VsZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygiUkVDRUlWRVIgS29za2kgc2VsZWN0ZWRcbiIpOwogCiAJCS8qIGNvbmZpZ3VyYXRpb24gLSBBUyBlbmFibGUsIHJlY2VpdmVyIGVuYWJsZSAqLwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSAweEZGOwpAQCAtNTU5LDcgKzUxMSw3IEBACiAJCW51bV9yZWcgPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInNzdDogTm90IGEgdmFsaWQgb3V0cHV0IGRldlxuIik7CisJCXByX2VycigiTm90IGEgdmFsaWQgb3V0cHV0IGRldlxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1dSSVRFLCBudW1fcmVnKTsKQEAgLTU5OCw3ICs1NTAsNyBAQAogCQkJcmV0dXJuIHJldHZhbDsKIAl9CiAJc25kX3BtaWNfb3BzX214LmlucHV0X2Rldl9pZCA9IGRldl9pZDsKLQlwcl9kZWJ1Zygic3N0OiBteF9zZXRfc2VsZWN0ZWRfaW5wdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJteF9zZXRfc2VsZWN0ZWRfaW5wdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOwogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIEFNSUM6CkBAIC02NDYsNyArNTk4LDcgQEAKIAl9CiAKIAotCXByX2RlYnVnKCJzc3Q6IHNldF9tdXRlIGRldl9pZDoweCV4ICwgdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOworCXByX2RlYnVnKCJzZXRfbXV0ZSBkZXZfaWQ6MHgleCAsIHZhbHVlOiVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9ETUlDX01VVEU6CkBAIC03NjAsNyArNzEyLDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IHNldF92b2wgZGV2X2lkOjB4JXggLHZhbHVlOiVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKKwlwcl9kZWJ1Zygic2V0X3ZvbCBkZXZfaWQ6MHgleCAsdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOwogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9SRUNFSVZFUl9WT0w6CiAJCXJldHVybiAwOwpAQCAtODc1LDcgKzgyNyw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAkqdmFsdWUgPSAtKHNjX2FjY2Vzcy52YWx1ZSAmIG1hc2spOwotCXByX2RlYnVnKCJzc3Q6IGdldCB2b2x1bWUgdmFsdWUgZXh0cmFjdGVkICVkXG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJnZXQgdm9sdW1lIHZhbHVlIGV4dHJhY3RlZCAlZFxuIiwgKnZhbHVlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YyX2NvbnRyb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCmluZGV4IDNhN2RlNzYuLmUzOGU4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb250cm9sIG9wZXJhdGlvbnMgb2YgdmVuZG9yIDMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSAiaW50ZWxfc3N0LmgiCkBAIC0xMjAsNyArMTIyLDcgQEAKIAlzbmRfcG1pY19vcHNfbmMubWFzdGVyX211dGUgPSBVTk1VVEU7CiAJc25kX3BtaWNfb3BzX25jLm11dGVfc3RhdHVzID0gVU5NVVRFOwogCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgMjYpOwotCXByX2RlYnVnKCJzc3Q6IGluaXQgY29tcGxldGUhIVxuIik7CisJcHJfZGVidWcoImluaXQgY29tcGxldGUhIVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2OSw3ICsxNzEsNyBAQAogCW5jX2VuYWJsZV9hdWRpb2RhYyhNVVRFKTsKIAltc2xlZXAoMzApOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgcGIuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgdXAgcGIuLi4uXG4iKTsKIAogCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IFZBVURJT0NOVDsKIAlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDI3OwpAQCAtMjIyLDcgKzIyNCw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIHVwIGNwLi4uLlxuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIHVwIGNwLi4uLlxuIik7CiAKIAlpZiAocG9ydCA9PSAweEZGKQogCQlyZXR1cm4gMDsKQEAgLTI3NSw3ICsyNzcsNyBAQAogCW5jX2VuYWJsZV9hdWRpb2RhYyhNVVRFKTsKIAogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gbmNfcG93ZXJfZG93biAuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gbmNfcG93ZXJfZG93biAuLi4uXG4iKTsKIAogCW1zbGVlcCgzMCk7CiAKQEAgLTMyNCw3ICszMjYsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBwYi4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyBkbiBwYi4uLi5cbiIpOwogCiAJbmNfZW5hYmxlX2F1ZGlvZGFjKE1VVEUpOwogCkBAIC0zNzAsNyArMzcyLDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKIAlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIH0KIApAQCAtNDAwLDcgKzQwMiw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDE0KTsKLQlwcl9kZWJ1Zygic3N0OiBWb2ljZSBwYXJhbWV0ZXJzIHNldCBzdWNjZXNzZnVsbHkhIVxuIik7CisJcHJfZGVidWcoIlZvaWNlIHBhcmFtZXRlcnMgc2V0IHN1Y2Nlc3NmdWxseSEhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUxLDIwICs0NTMsMjAgQEAKIAogCQlzY19hY2Nlc3MudmFsdWUgPSAweDA3OwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOworCQlwcl9kZWJ1ZygiUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOwogCQlzY19hY2Nlc3MubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAl9IGVsc2UgewogCQlzY19hY2Nlc3MudmFsdWUgPSAweDAwOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSAlZFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKKwkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUgJWRcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CiAJCXNjX2FjY2Vzcy5tYXNrID0gTUFTSzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCiAKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiB3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKKwlwcl9kZWJ1Zygid29yZF9zaXplID0gJWRcbiIsIHdvcmRfc2l6ZSk7CiAKIAlpZiAod29yZF9zaXplID09IDI0KSB7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRElPUE9SVDI7CkBAIC00NzcsNyArNDc5LDcgQEAKIAl9CiAJc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAKLQlwcl9kZWJ1Zygic3N0OiB3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKKwlwcl9kZWJ1Zygid29yZF9zaXplID0gJWRcbiIsIHdvcmRfc2l6ZSk7CiAJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9QT1JUMTsKIAlzY19hY2Nlc3MubWFzayA9IE1BU0s1fE1BU0s0fE1BU0sxfE1BU0swOwogCWlmICh3b3JkX3NpemUgPT0gMTYpCkBAIC01MDgsNyArNTEwLDcgQEAKIAkJcmV0dmFsID0gbmNfaW5pdF9jYXJkKCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQlwcl9kZWJ1Zygic3N0OiBuYyBzZXQgc2VsZWN0ZWQgb3V0cHV0OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm5jIHNldCBzZWxlY3RlZCBvdXRwdXQ6JWRcbiIsIHZhbHVlKTsKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBTVEVSRU9fSEVBRFBIT05FOgogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfSFAsIFBNSUNfV1JJVEUsIDIpOwpAQCAtNTE3LDcgKzUxOSw3IEBACiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19JUywgUE1JQ19XUklURSwgMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiByY3ZkIGlsbGVnYWwgcmVxdWVzdDogJWRcbiIsIHZhbHVlKTsKKwkJcHJfZXJyKCJyY3ZkIGlsbGVnYWwgcmVxdWVzdDogJWRcbiIsIHZhbHVlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC01NDEsNyArNTQzLDcgQEAKIAl9OwogCiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1dSSVRFLCAxMik7Ci0JcHJfZGVidWcoInNzdDogQXVkaW8gSW5pdCBzdWNjZXNzZnVsbHkhIVxuIik7CisJcHJfZGVidWcoIkF1ZGlvIEluaXQgc3VjY2Vzc2Z1bGx5ISFcbiIpOwogCiAJLypzZXQgb3V0cHV0IGRldmljZSAqLwogCW5jX3NldF9zZWxlY3RlZF9vdXRwdXRfZGV2KHNuZF9wbWljX29wc19uYy5vdXRwdXRfZGV2X2lkKTsKQEAgLTU0OSwxMyArNTUxLDEzIEBACiAJaWYgKHNuZF9wbWljX29wc19uYy5udW1fY2hhbm5lbCA9PSAxKSB7CiAJCXNjX2FjY2VzLnZhbHVlID0gMHgwNzsKIAkJc2NfYWNjZXMucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlcy52YWx1ZSk7CisJCXByX2RlYnVnKCJSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKIAkJc2NfYWNjZXMubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXMsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCX0gZWxzZSB7CiAJCXNjX2FjY2VzLnZhbHVlID0gMHgwMDsKIAkJc2NfYWNjZXMucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlcy52YWx1ZSk7CisJCXByX2RlYnVnKCJSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKIAkJc2NfYWNjZXMubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXMsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCX0KQEAgLTYyOSwxMSArNjMxLDExIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldCBkZXZpY2UgaWQ6OiVkLCB2YWx1ZSAlZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CisJcHJfZGVidWcoInNldCBkZXZpY2UgaWQ6OiVkLCB2YWx1ZSAlZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfTVVURV9BTEw6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX01VVEVfQUxMIHZhbHVlICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9NVVRFX0FMTCB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQlzbmRfcG1pY19vcHNfbmMubXV0ZV9zdGF0dXMgPSB2YWx1ZTsKIAkJc25kX3BtaWNfb3BzX25jLm1hc3Rlcl9tdXRlID0gdmFsdWU7CiAJCWlmICh2YWx1ZSA9PSBVTk1VVEUpIHsKQEAgLTY2OSw3ICs2NzEsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfSFBfTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0hQTUlDX01VVEUgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0hQTUlDX01VVEUgdmFsdWUgJWRcbiIsIHZhbHVlKTsKIAkJaWYgKHZhbHVlID09IFVOTVVURSkgewogCQkJLyogdW5tdXRlIHRoZSBzeXN0ZW0sIHNldCB0aGUgNnRoIGJpdCB0byBvbmUgKi8KIAkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDA7CkBAIC02ODIsNyArNjg0LDcgQEAKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9BTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0FNSUNfTVVURSB2YWx1ZSAlZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfQU1JQ19NVVRFIHZhbHVlICVkXG4iLCB2YWx1ZSk7CiAJCWlmICh2YWx1ZSA9PSBVTk1VVEUpIHsKIAkJCS8qIHVubXV0ZSB0aGUgc3lzdGVtLCBzZXQgdGhlIDZ0aCBiaXQgdG8gb25lICovCiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDAwOwpAQCAtNjk2LDcgKzY5OCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9ETUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IElOUFVUX01VVEVfRE1JQyB2YWx1ZSVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJJTlBVVF9NVVRFX0RNSUMgdmFsdWUlZFxuIiwgdmFsdWUpOwogCQlpZiAodmFsdWUgPT0gVU5NVVRFKSB7CiAJCQkvKiB1bm11dGUgdGhlIHN5c3RlbSwgc2V0IHRoZSA2dGggYml0IHRvIG9uZSAqLwogCQkJc2NfYWNjZXNzWzFdLnZhbHVlID0gMHgwMDsKQEAgLTcyNCwxMyArNzI2LDEzIEBACiAKIAkJaWYgKGRldl9pZCA9PSBQTUlDX1NORF9MRUZUX0hQX01VVEUpIHsKIAkJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IExNVVRFOwotCQkJcHJfZGVidWcoInNzdDogTEVGVF9IUF9NVVRFIHZhbHVlICVkXG4iLAorCQkJcHJfZGVidWcoIkxFRlRfSFBfTVVURSB2YWx1ZSAlZFxuIiwKIAkJCQkJc2NfYWNjZXNzWzBdLnZhbHVlKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChzbmRfcG1pY19vcHNfbmMubnVtX2NoYW5uZWwgPT0gMSkKIAkJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDA0OwogCQkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gUk1VVEU7Ci0JCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlICVkXG4iLAorCQkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUgJWRcbiIsCiAJCQkJCXNjX2FjY2Vzc1swXS52YWx1ZSk7CiAJCX0KIAkJc2NfYWNjZXNzWzBdLm1hc2sgPSBNQVNLMjsKQEAgLTc0Myw3ICs3NDUsNyBAQAogCQllbHNlCiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDAzOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBMTVVURTsKLQkJcHJfZGVidWcoInNzdDogU1BFQUtFUl9NVVRFICVkXG4iLCBzY19hY2Nlc3NbMF0udmFsdWUpOworCQlwcl9kZWJ1ZygiU1BFQUtFUl9NVVRFICVkXG4iLCBzY19hY2Nlc3NbMF0udmFsdWUpOwogCQlzY19hY2Nlc3NbMF0ubWFzayA9IE1BU0sxOwogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCQlicmVhazsKQEAgLTc2NCwxMCArNzY2LDEwIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldCB2b2x1bWU6JWRcbiIsIGRldl9pZCk7CisJcHJfZGVidWcoInNldCB2b2x1bWU6JWRcbiIsIGRldl9pZCk7CiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0NBUFRVUkVfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9DQVBUVVJFX1ZPTDp2YWx1ZTo6JWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0NBUFRVUkVfVk9MOnZhbHVlOjolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSBzY19hY2Nlc3NbMV0udmFsdWUgPQogCQkJCQlzY19hY2Nlc3NbMl0udmFsdWUgPSAtdmFsdWU7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gc2NfYWNjZXNzWzFdLm1hc2sgPSBzY19hY2Nlc3NbMl0ubWFzayA9CkBAIC03NzksNyArNzgxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX0xFRlRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9MRUZUX0hQX1ZPTCAlZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfTEVGVF9IUF9WT0wgJWRcbiIsIHZhbHVlKTsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gLXZhbHVlOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgID0gQVVESU9MVk9MOwogCQlzY19hY2Nlc3NbMF0ubWFzayA9CkBAIC03ODgsNyArNzkwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfUklHSFRfSFBfVk9MIHZhbHVlICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9SSUdIVF9IUF9WT0wgdmFsdWUgJWRcbiIsIHZhbHVlKTsKIAkJaWYgKHNuZF9wbWljX29wc19uYy5udW1fY2hhbm5lbCA9PSAxKSB7CiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDA0OwogCQkgICAgc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gUk1VVEU7CkBAIC04MjEsMTEgKzgyMywxMSBAQAogCQlyZXR1cm4gcmV0dmFsOwogCXNuZF9wbWljX29wc19uYy5pbnB1dF9kZXZfaWQgPSB2YWx1ZTsKIAotCXByX2RlYnVnKCJzc3Q6IG5jIHNldCBzZWxlY3RlZCBpbnB1dDolZFxuIiwgdmFsdWUpOworCXByX2RlYnVnKCJuYyBzZXQgc2VsZWN0ZWQgaW5wdXQ6JWRcbiIsIHZhbHVlKTsKIAogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlIEFNSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBBTUlDXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBBTUlDXG4iKTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gMHgxMDc7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4NDA7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gIE1BU0s2fE1BU0s0fE1BU0szfE1BU0sxfE1BU0swOwpAQCAtODQyLDcgKzg0NCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBIU19NSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBIU19NSUNcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIEhTX01JQ1xuIik7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IDB4MTA3OwogCQlzY19hY2Nlc3NbMF0ubWFzayA9ICBNQVNLNnxNQVNLNHxNQVNLM3xNQVNLMXxNQVNLMDsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gMHgxMDsKQEAgLTg1OSw3ICs4NjEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgRE1JQzoKLQkJcHJfZGVidWcoInNzdDogRE1JQ1xuIik7CisJCXByX2RlYnVnKCJETUlDXG4iKTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gMHgxMDc7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gTUFTSzZ8TUFTSzR8TUFTSzN8TUFTSzF8TUFTSzA7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MEI7CkBAIC04NzEsNyArODczLDcgQEAKIAkJc2NfYWNjZXNzWzJdLm1hc2sgPSBNQVNLNjsKIAkJc2NfYWNjZXNzWzNdLnJlZ19hZGRyID0gMHgxMDk7CiAJCXNjX2FjY2Vzc1szXS5tYXNrID0gTUFTSzY7Ci0JCXNjX2FjY2Vzc1szXS52YWx1ZSA9IDB4NDA7CisJCXNjX2FjY2Vzc1szXS52YWx1ZSA9IDB4MDA7CiAJCW51bV92YWwgPSA0OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODkwLDIzICs4OTIsMjMgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogZ2V0IG11dGU6OiVkXG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJnZXQgbXV0ZTo6JWRcbiIsIGRldl9pZCk7CiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfQU1JQ19NVVRFOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9JTlBVVF9NVVRFX01JQzFcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSU5QVVRfTVVURV9NSUMxXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gTElMU0VMOwogCQltYXNrID0gTUFTSzY7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfSFBfTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0lOUFVUX01VVEVfTUlDMlxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9JTlBVVF9NVVRFX01JQzJcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBMSVJTRUw7CiAJCW1hc2sgPSBNQVNLNjsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9MRUZUX0hQX01VVEU6CiAJY2FzZSBQTUlDX1NORF9SSUdIVF9IUF9NVVRFOgogCQltYXNrID0gTUFTSzI7Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05fTEVGVC9SSUdIVF9IUF9NVVRFXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05fTEVGVC9SSUdIVF9IUF9NVVRFXG4iKTsKIAkJaWYgKGRldl9pZCA9PSBQTUlDX1NORF9SSUdIVF9IUF9NVVRFKQogCQkJc2NfYWNjZXNzLnJlZ19hZGRyID0gUk1VVEU7CiAJCWVsc2UKQEAgLTkxNCwxMiArOTE2LDEyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9MRUZUX1NQRUFLRVJfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19NT05PX0VBUlBJRUNFX01VVEVcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19NT05PX0VBUlBJRUNFX01VVEVcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKIAkJbWFzayA9IE1BU0sxOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0RNSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSU5QVVRfTVVURV9ETUlDXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0lOUFVUX01VVEVfRE1JQ1xuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IDB4MTA1OwogCQltYXNrID0gTUFTSzY7CiAJCWJyZWFrOwpAQCAtOTI4LDE2ICs5MzAsMTYgQEAKIAogCX0KIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQUQsIDEpOwotCXByX2RlYnVnKCJzc3Q6IHJlZyB2YWx1ZSA9ICVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOworCXByX2RlYnVnKCJyZWcgdmFsdWUgPSAlZFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCSp2YWx1ZSA9IChzY19hY2Nlc3MudmFsdWUpICYgbWFzazsKLQlwcl9kZWJ1Zygic3N0OiBtYXNrZWQgdmFsdWUgPSAlZFxuIiwgKnZhbHVlKTsKKwlwcl9kZWJ1ZygibWFza2VkIHZhbHVlID0gJWRcbiIsICp2YWx1ZSk7CiAJaWYgKCp2YWx1ZSkKIAkJKnZhbHVlID0gMDsKIAllbHNlCiAJCSp2YWx1ZSA9IDE7Ci0JcHJfZGVidWcoInNzdDogdmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsICp2YWx1ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtOTUzLDE5ICs5NTUsMTkgQEAKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9DQVBUVVJFX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSU5QVVRfQ0FQVFVSRV9WT0xcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSU5QVVRfQ0FQVFVSRV9WT0xcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSAgTElMU0VMOwogCQltYXNrID0gKE1BU0swfE1BU0sxfE1BU0syfE1BU0szfE1BU0s0fE1BU0s1KTsKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogR0VUX1ZPTFVNRV9QTUlDX0xFRlRfSFBfVk9MXG4iKTsKKwkJcHJfZGVidWcoIkdFVF9WT0xVTUVfUE1JQ19MRUZUX0hQX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRElPTFZPTDsKIAkJbWFzayA9IChNQVNLMHxNQVNLMXxNQVNLMnxNQVNLM3xNQVNLNHxNQVNLNXxNQVNLNik7CiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9MRUZUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogR0VUX1ZPTFVNRV9QTUlDX1JJR0hUX0hQX1ZPTFxuIik7CisJCXByX2RlYnVnKCJHRVRfVk9MVU1FX1BNSUNfUklHSFRfSFBfVk9MXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9SVk9MOwogCQltYXNrID0gKE1BU0swfE1BU0sxfE1BU0syfE1BU0szfE1BU0s0fE1BU0s1fE1BU0s2KTsKIAkJYnJlYWs7CkBAIC05NzUsOSArOTc3LDkgQEAKIAogCX0KIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQUQsIDEpOwotCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJlYWQgPSAweCV4XG4iLCBzY19hY2Nlc3MudmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZWFkID0gMHgleFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAkqdmFsdWUgPSAtKChzY19hY2Nlc3MudmFsdWUpICYgbWFzayk7Ci0JcHJfZGVidWcoInNzdDogZ2V0IHZvbCB2YWx1ZSByZXR1cm5lZCA9ICVkXG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJnZXQgdm9sIHZhbHVlIHJldHVybmVkID0gJWRcbiIsICp2YWx1ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKaW5kZXggOTc4YmY4Ny4uNTE1ZTQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCkBAIC0xMSw0MyArMTEsMzcgQEAKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKICNpbmNsdWRlICJpbml0LmgiCiAKLUJZVEUJCUlzU1NGRENDb21wbGlhbmNlOwotQllURQkJSXNYRENvbXBsaWFuY2U7Ci1leHRlcm4gRFdPUkQgTWVkaWFDaGFuZ2U7Ci1leHRlcm4gaW50CUNoZWNrX0RfTWVkaWFGbXQoc3RydWN0IHVzX2RhdGEgKik7CitCWVRFIElzU1NGRENDb21wbGlhbmNlOworQllURSBJc1hEQ29tcGxpYW5jZTsKIAotLy8tLS0tLSBFTkVfSW5pdE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Jbml0TWVkaWEoKToKKyAqLwogaW50IEVORV9Jbml0TWVkaWEoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCWludAlyZXN1bHQ7CiAJQllURQlNaXNjUmVnMDMgPSAwOwogCi0JcHJpbnRrKCItLS0gSW5pdCBNZWRpYSAtLS1cbiIpOworCXByaW50ayhLRVJOX0lORk8gIi0tLSBJbml0IE1lZGlhIC0tLVxuIik7CiAJcmVzdWx0ID0gRU5FX1JlYWRfQllURSh1cywgUkVHX0NBUkRfU1RBVFVTLCAmTWlzY1JlZzAzKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiUmVhZCByZWdpc3RlciBmYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgcmVnaXN0ZXIgZmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQotCXByaW50aygiTWlzY1JlZzAzID0gJXhcbiIsIE1pc2NSZWcwMyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWlzY1JlZzAzID0gJXhcbiIsIE1pc2NSZWcwMyk7CiAKLQlpZiAoTWlzY1JlZzAzICYgMHgwMSkKLQl7Ci0JCWlmICghdXMtPlNEX1N0YXR1cy5SZWFkeSkKLQkJeworCWlmIChNaXNjUmVnMDMgJiAweDAxKSB7CisJCWlmICghdXMtPlNEX1N0YXR1cy5SZWFkeSkgewogCQkJcmVzdWx0ID0gRU5FX1NESW5pdCh1cyk7CiAJCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAJfQogCi0JaWYgKE1pc2NSZWcwMyAmIDB4MDIpCi0JewotCQlpZiAoIXVzLT5TTV9TdGF0dXMuUmVhZHkgJiYgIXVzLT5NU19TdGF0dXMuUmVhZHkpCi0JCXsKKwlpZiAoTWlzY1JlZzAzICYgMHgwMikgeworCQlpZiAoIXVzLT5TTV9TdGF0dXMuUmVhZHkgJiYgIXVzLT5NU19TdGF0dXMuUmVhZHkpIHsKIAkJCXJlc3VsdCA9IEVORV9TTUluaXQodXMpOwotCQkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JCQl7CisJCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQkJCXJlc3VsdCA9IEVORV9NU0luaXQodXMpOwogCQkJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQkJCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwpAQCAtNTgsNyArNTIsOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8vLS0tLS0gRU5FX1JlYWRfQllURSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfUmVhZF9CWVRFKCkgOgorICovCiBpbnQgRU5FX1JlYWRfQllURShzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgaW5kZXgsIHZvaWQgKmJ1ZikKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CkBAIC03NiwxOSArNzIsMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vLy0tLS0tIEVORV9TREluaXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfU0RJbml0KCk6CisgKi8KIGludCBFTkVfU0RJbml0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlCWVRFCWJ1ZlsweDIwMF07CiAKLQlwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1NESW5pdFxuIik7Ci0JLy8gU0QgSW5pdCBQYXJ0LTEKKwlwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9TREluaXRcbiIpOworCS8qIFNEIEluaXQgUGFydC0xICovCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTRF9JTklUMV9QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiTG9hZCBTRCBJbml0IENvZGUgUGFydC0xIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTG9hZCBTRCBJbml0IENvZGUgUGFydC0xIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtOTgsMTcgKzk1LDE1IEBACiAJYmNiLT5DREJbMF0gPSAweEYyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBTRCBJbml0IENvZGUgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFeGVjdGlvbiBTRCBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JLy8gU0QgSW5pdCBQYXJ0LTIKKwkvKiBTRCBJbml0IFBhcnQtMiAqLwogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU0RfSU5JVDJfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkxvYWQgU0QgSW5pdCBDb2RlIFBhcnQtMiBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkxvYWQgU0QgSW5pdCBDb2RlIFBhcnQtMiBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTExOSw0NSArMTE0LDQxIEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJmJ1ZiwgMCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAl1cy0+U0RfU3RhdHVzID0gICooUFNEX1NUQVRVUykmYnVmWzBdOwotCWlmICh1cy0+U0RfU3RhdHVzLkluc2VydCAmJiB1cy0+U0RfU3RhdHVzLlJlYWR5KQotCXsKKwlpZiAodXMtPlNEX1N0YXR1cy5JbnNlcnQgJiYgdXMtPlNEX1N0YXR1cy5SZWFkeSkgewogCQlFTkVfUmVhZFNEUmVnKHVzLCAoUEJZVEUpJmJ1Zik7Ci0JCXByaW50aygiSW5zZXJ0ICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLkluc2VydCk7Ci0JCXByaW50aygiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLlJlYWR5KTsKLQkJcHJpbnRrKCJJc01NQyAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSXNNTUMpOwotCQlwcmludGsoIkhpQ2FwYWNpdHkgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5IaUNhcGFjaXR5KTsKLQkJcHJpbnRrKCJIaVNwZWVkICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSGlTcGVlZCk7Ci0JCXByaW50aygiV3RQICAgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLld0UCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiU0QgQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOworCQlwcmludGsoS0VSTl9JTkZPICJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSW5zZXJ0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLlJlYWR5KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSXNNTUMgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLklzTU1DKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSGlDYXBhY2l0eSA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLkhpQ2FwYWNpdHkpOworCQlwcmludGsoS0VSTl9JTkZPICJIaVNwZWVkICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSGlTcGVlZCk7CisJCXByaW50ayhLRVJOX0lORk8gIld0UCAgICAgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5XdFApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0QgQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX01TSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfTVNJbml0KCk6CisgKi8KIGludCBFTkVfTVNJbml0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlCWVRFCWJ1ZlsweDIwMF07CiAJV09SRAlNU1BfQmxvY2tTaXplLCBNU1BfVXNlckFyZWFCbG9ja3M7Ci0JCiAKLQlwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX01TSW5pdFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfTVNJbml0XG4iKTsKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIE1TX0lOSVRfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkxvYWQgTVMgSW5pdCBDb2RlIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTG9hZCBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCkBAIC0xNjksNTMgKzE2MCw0OSBAQAogCWJjYi0+Q0RCWzFdCQkJPSAweDAxOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZidWYsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFeGVjdGlvbiBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJdXMtPk1TX1N0YXR1cyA9ICooUE1TX1NUQVRVUykmYnVmWzBdOwogCi0JaWYgKHVzLT5NU19TdGF0dXMuSW5zZXJ0ICYmIHVzLT5NU19TdGF0dXMuUmVhZHkpCi0JewotCQlwcmludGsoIkluc2VydCAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5JbnNlcnQpOwotCQlwcmludGsoIlJlYWR5ICAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5SZWFkeSk7Ci0JCXByaW50aygiSXNNU1BybyAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLklzTVNQcm8pOwotCQlwcmludGsoIklzTVNQSEcgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5Jc01TUEhHKTsKLQkJcHJpbnRrKCJXdFAgICAgICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuV3RQKTsKLQkJaWYgKHVzLT5NU19TdGF0dXMuSXNNU1BybykKLQkJewotCQkJTVNQX0Jsb2NrU2l6ZSAgICAgID0gKGJ1Zls2XSA8PDgpIHwgYnVmWzddOwotCQkJTVNQX1VzZXJBcmVhQmxvY2tzID0gKGJ1ZlsxMF08PDgpIHwgYnVmWzExXTsKKwlpZiAodXMtPk1TX1N0YXR1cy5JbnNlcnQgJiYgdXMtPk1TX1N0YXR1cy5SZWFkeSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSW5zZXJ0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLlJlYWR5KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSXNNU1BybyAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLklzTVNQcm8pOworCQlwcmludGsoS0VSTl9JTkZPICJJc01TUEhHICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSXNNU1BIRyk7CisJCXByaW50ayhLRVJOX0lORk8gIld0UCAgICAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5XdFApOworCQlpZiAodXMtPk1TX1N0YXR1cy5Jc01TUHJvKSB7CisJCQlNU1BfQmxvY2tTaXplICAgICAgPSAoYnVmWzZdIDw8IDgpIHwgYnVmWzddOworCQkJTVNQX1VzZXJBcmVhQmxvY2tzID0gKGJ1ZlsxMF0gPDwgOCkgfCBidWZbMTFdOwogCQkJdXMtPk1TUF9Ub3RhbEJsb2NrID0gTVNQX0Jsb2NrU2l6ZSAqIE1TUF9Vc2VyQXJlYUJsb2NrczsKLQkJfQotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlNU19DYXJkSW5pdCh1cyk7Ci0JCXByaW50aygiTVMgSW5pdCBDb2RlIE9LICEhXG4iKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHJpbnRrKCJNUyBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVMgSW5pdCBDb2RlIE9LICEhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJNUyBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9TTUluaXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICpFTkVfU01Jbml0KCkKKyAqLwogaW50IEVORV9TTUluaXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCUJZVEUJYnVmWzB4MjAwXTsKIAotCXByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfU01Jbml0XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9TTUluaXRcbiIpOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9JTklUX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJMb2FkIFNNIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9JTkZPICJMb2FkIFNNIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTIyNyw5ICsyMTQsOSBAQAogCWJjYi0+Q0RCWzFdCQkJPSAweDAxOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZidWYsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBTTSBJbml0IENvZGUgRmFpbCAhISByZXN1bHQgPSAleFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFeGVjdGlvbiBTTSBJbml0IENvZGUgRmFpbCAhISByZXN1bHQgPSAleFxuIiwgcmVzdWx0KTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTIzOCwzMiArMjI1LDMxIEBACiAJdXMtPlNNX0RldmljZUlEID0gYnVmWzFdOwogCXVzLT5TTV9DYXJkSUQgICA9IGJ1ZlsyXTsKIAotCWlmICh1cy0+U01fU3RhdHVzLkluc2VydCAmJiB1cy0+U01fU3RhdHVzLlJlYWR5KQotCXsKLQkJcHJpbnRrKCJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuSW5zZXJ0KTsKLQkJcHJpbnRrKCJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuUmVhZHkpOwotCQlwcmludGsoIld0UCAgICAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5XdFApOwotCQlwcmludGsoIkRldmljZUlEICAgPSAleFxuIiwgdXMtPlNNX0RldmljZUlEKTsKLQkJcHJpbnRrKCJDYXJkSUQgICAgID0gJXhcbiIsIHVzLT5TTV9DYXJkSUQpOworCWlmICh1cy0+U01fU3RhdHVzLkluc2VydCAmJiB1cy0+U01fU3RhdHVzLlJlYWR5KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkluc2VydCAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5JbnNlcnQpOworCQlwcmludGsoS0VSTl9JTkZPICJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuUmVhZHkpOworCQlwcmludGsoS0VSTl9JTkZPICJXdFAgICAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuV3RQKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlSUQgICA9ICV4XG4iLCB1cy0+U01fRGV2aWNlSUQpOworCQlwcmludGsoS0VSTl9JTkZPICJDYXJkSUQgICAgID0gJXhcbiIsIHVzLT5TTV9DYXJkSUQpOwogCQlNZWRpYUNoYW5nZSA9IDE7CiAJCUNoZWNrX0RfTWVkaWFGbXQodXMpOwotCX0KLQllbHNlCi0JewotCQlwcmludGsoIlNNIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIlNNIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX1JlYWRTRFJlZygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfUmVhZFNEUmVnKCkKKyAqLwogaW50IEVORV9SZWFkU0RSZWcoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqUmRCdWYpCiB7CiAJV09SRAl0bXByZWc7CiAJRFdPUkQJcmVnNGI7Ci0JCi0JLy9wcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1JlYWRTRFJlZ1xuIik7CisKKwkvKiBwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9SZWFkU0RSZWdcbiIpOyAqLwogCXJlZzRiID0gKihQRFdPUkQpJlJkQnVmWzB4MThdOwogCXVzLT5TRF9SRUFEX0JMX0xFTiA9IChCWVRFKSgocmVnNGIgPj4gOCkgJiAweDBmKTsKIApAQCAtMjc3LDc0ICsyNjMsNzUgQEAKIAlpZiAodXMtPlNEX1N0YXR1cy5IaUNhcGFjaXR5ICYmIHVzLT5TRF9TdGF0dXMuSXNNTUMpCiAJCXVzLT5IQ19DX1NJWkUgPSAqKFBEV09SRCkoJlJkQnVmWzB4MTAwXSk7CiAKLQlpZiAodXMtPlNEX1JFQURfQkxfTEVOID4gU0RfQkxPQ0tfTEVOKQotCXsKLQkJdXMtPlNEX0Jsb2NrX011bHQgPSAxIDw8ICh1cy0+U0RfUkVBRF9CTF9MRU4gLSBTRF9CTE9DS19MRU4pOwkJdXMtPlNEX1JFQURfQkxfTEVOID0gU0RfQkxPQ0tfTEVOOwotCX0KLQllbHNlCi0JewkJdXMtPlNEX0Jsb2NrX011bHQgPSAxOworCWlmICh1cy0+U0RfUkVBRF9CTF9MRU4gPiBTRF9CTE9DS19MRU4pIHsKKwkJdXMtPlNEX0Jsb2NrX011bHQgPQorCQkJMSA8PCAodXMtPlNEX1JFQURfQkxfTEVOIC0gU0RfQkxPQ0tfTEVOKTsKKwkJdXMtPlNEX1JFQURfQkxfTEVOID0gU0RfQkxPQ0tfTEVOOworCX0gZWxzZSB7CisJCXVzLT5TRF9CbG9ja19NdWx0ID0gMTsKIAl9CiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9Mb2FkQmluQ29kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Mb2FkQmluQ29kZSgpCisgKi8KIGludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFIGZsYWcpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7Ci0JLy92b2lkICpidWY7CisJLyogdm9pZCAqYnVmOyAqLwogCVBCWVRFIGJ1ZjsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9Mb2FkQmluQ29kZVxuIik7CisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfTG9hZEJpbkNvZGVcbiIpOyAqLwogCWlmICh1cy0+QklOX0ZMQUcgPT0gZmxhZykKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogCiAJYnVmID0ga21hbGxvYygweDgwMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCXN3aXRjaCAoIGZsYWcgKQotCXsKLQkJLy8gRm9yIFNECi0JCWNhc2UgU0RfSU5JVDFfUEFUVEVSTjoKLQkJCXByaW50aygiU0RfSU5JVDFfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTRF9Jbml0MSwgMHg4MDApOworCXN3aXRjaCAoZmxhZykgeworCS8qIEZvciBTRCAqLworCWNhc2UgU0RfSU5JVDFfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RfSU5JVDFfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNEX0luaXQxLCAweDgwMCk7CiAJCWJyZWFrOwotCQljYXNlIFNEX0lOSVQyX1BBVFRFUk46Ci0JCQlwcmludGsoIlNEX0lOSVQyX1BBVFRFUk5cbiIpOwotCQkJbWVtY3B5KGJ1ZiwgU0RfSW5pdDIsIDB4ODAwKTsKKwljYXNlIFNEX0lOSVQyX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNEX0lOSVQyX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBTRF9Jbml0MiwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBTRF9SV19QQVRURVJOOgotCQkJcHJpbnRrKCJTRF9SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIFNEX1Jkd3IsIDB4ODAwKTsKKwljYXNlIFNEX1JXX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNEX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBTRF9SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwotCQkvLyBGb3IgTVMKLQkJY2FzZSBNU19JTklUX1BBVFRFUk46Ci0JCQlwcmludGsoIk1TX0lOSVRfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBNU19Jbml0LCAweDgwMCk7CisJLyogRm9yIE1TICovCisJY2FzZSBNU19JTklUX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIk1TX0lOSVRfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIE1TX0luaXQsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCWNhc2UgTVNQX1JXX1BBVFRFUk46Ci0JCQlwcmludGsoIk1TUF9SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIE1TUF9SZHdyLCAweDgwMCk7CisJY2FzZSBNU1BfUldfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVNQX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBNU1BfUmR3ciwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBNU19SV19QQVRURVJOOgotCQkJcHJpbnRrKCJNU19SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIE1TX1Jkd3IsIDB4ODAwKTsKKwljYXNlIE1TX1JXX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIk1TX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBNU19SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwotCQkvLyBGb3IgU1MKLQkJY2FzZSBTTV9JTklUX1BBVFRFUk46Ci0JCQlwcmludGsoIlNNX0lOSVRfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTTV9Jbml0LCAweDgwMCk7CisJLyogRm9yIFNTICovCisJY2FzZSBTTV9JTklUX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNNX0lOSVRfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNNX0luaXQsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCWNhc2UgU01fUldfUEFUVEVSTjoKLQkJCXByaW50aygiU01fUldfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTTV9SZHdyLCAweDgwMCk7CisJY2FzZSBTTV9SV19QQVRURVJOOgorCQlwcmludGsoS0VSTl9JTkZPICJTTV9SV19QQVRURVJOXG4iKTsKKwkJbWVtY3B5KGJ1ZiwgU01fUmR3ciwgMHg4MDApOwogCQlicmVhazsKIAl9CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4ODAwOwotCWJjYi0+RmxhZ3MgPTB4MDA7CisJYmNiLT5GbGFncyA9IDB4MDA7CiAJYmNiLT5DREJbMF0gPSAweEVGOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwpAQCAtMzU0LDU0ICszNDEsNjMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vLy0tLS0tIEVORV9TZW5kU2NzaUNtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9TZW5kU2NzaUNtZCgpOgorICovCiBpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmRGlyLCB2b2lkICpidWYsIGludCB1c2Vfc2cpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjcyA9IChzdHJ1Y3QgYnVsa19jc193cmFwICopIHVzLT5pb2J1ZjsKIAogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IHRyYW5zZmVyX2xlbmd0aD1iY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCwgY3N3bGVuPTAsIHBhcnRpYWw9MDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoID0gYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgsCisJCSAgICAgY3N3bGVuID0gMCwgcGFydGlhbCA9IDA7CiAJdW5zaWduZWQgaW50IHJlc2lkdWU7CiAKLQkvL3ByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfU2VuZFNjc2lDbWRcbiIpOwotCS8vIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludAotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoInNlbmQgY21kIHRvIG91dCBlbmRwb2ludCBmYWlsIC0tLVxuIik7CisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfU2VuZFNjc2lDbWRcbiIpOyAqLworCS8qIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludCAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsCisJCQkJCSAgICBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50IGZhaWwgLS0tXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlpZiAoYnVmKQotCXsKLQkJdW5zaWduZWQgaW50IHBpcGUgPSBmRGlyID09IEZESVJfUkVBRCA/IHVzLT5yZWN2X2J1bGtfcGlwZSA6IHVzLT5zZW5kX2J1bGtfcGlwZTsKLQkJLy8gQnVsaworCWlmIChidWYpIHsKKwkJdW5zaWduZWQgaW50IHBpcGUgPSBmRGlyOworCisJCWlmIChmRGlyID09IEZESVJfUkVBRCkKKwkJCXBpcGUgPSB1cy0+cmVjdl9idWxrX3BpcGU7CisJCWVsc2UKKwkJCXBpcGUgPSB1cy0+c2VuZF9idWxrX3BpcGU7CisKKwkJLyogQnVsayAqLwogCQlpZiAodXNlX3NnKQogCQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa19zcmIodXMsIHBpcGUsIHVzLT5zcmIpOwogCQllbHNlCi0JCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX3NnKHVzLCBwaXBlLCBidWYsIHRyYW5zZmVyX2xlbmd0aCwgMCwgJnBhcnRpYWwpOwotCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJewotCQkJcHJpbnRrKCJkYXRhIHRyYW5zZmVyIGZhaWwgLS0tXG4iKTsKKwkJCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfc2codXMsIHBpcGUsIGJ1ZiwKKwkJCQkJCXRyYW5zZmVyX2xlbmd0aCwgMCwgJnBhcnRpYWwpOworCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkYXRhIHRyYW5zZmVyIGZhaWwgLS0tXG4iKTsKIAkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJCX0KIAl9CiAKLQkvLyBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCAmY3N3bGVuKTsKKwkvKiBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLAorCQkJCQkJVVNfQlVMS19DU19XUkFQX0xFTiwgJmNzd2xlbik7CiAKLQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU0hPUlQgJiYgY3N3bGVuID09IDApCi0JewotCQlwcmludGsoIlJlY2VpdmVkIDAtbGVuZ3RoIENTVzsgcmV0cnlpbmcuLi5cbiIpOwotCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sICZjc3dsZW4pOworCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TSE9SVCAmJiBjc3dsZW4gPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWNlaXZlZCAwLWxlbmd0aCBDU1c7IHJldHJ5aW5nLi4uXG4iKTsKKwkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwKKwkJCQkJYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCAmY3N3bGVuKTsKIAl9CiAKLQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU1RBTExFRCkKLQl7CisJaWYgKHJlc3VsdCA9PSBVU0JfU1RPUl9YRkVSX1NUQUxMRUQpIHsKIAkJLyogZ2V0IHRoZSBzdGF0dXMgYWdhaW4gKi8KLQkJcHJpbnRrKCJBdHRlbXB0aW5nIHRvIGdldCBDU1cgKDJuZCB0cnkpLi4uXG4iKTsKLQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXR0ZW1wdGluZyB0byBnZXQgQ1NXICgybmQgdHJ5KS4uLlxuIik7CisJCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsCisJCQkJCQliY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOwogCX0KIAogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQpAQCAtNDEwLDEyICs0MDYsMTQgQEAKIAkvKiBjaGVjayBidWxrIHN0YXR1cyAqLwogCXJlc2lkdWUgPSBsZTMyX3RvX2NwdShiY3MtPlJlc2lkdWUpOwogCi0JLyogdHJ5IHRvIGNvbXB1dGUgdGhlIGFjdHVhbCByZXNpZHVlLCBiYXNlZCBvbiBob3cgbXVjaCBkYXRhCi0JICogd2FzIHJlYWxseSB0cmFuc2ZlcnJlZCBhbmQgd2hhdCB0aGUgZGV2aWNlIHRlbGxzIHVzICovCi0JaWYgKHJlc2lkdWUgJiYgISh1cy0+ZmZsYWdzICYgVVNfRkxfSUdOT1JFX1JFU0lEVUUpKQotCXsKKwkvKgorCSAqIHRyeSB0byBjb21wdXRlIHRoZSBhY3R1YWwgcmVzaWR1ZSwgYmFzZWQgb24gaG93IG11Y2ggZGF0YQorCSAqIHdhcyByZWFsbHkgdHJhbnNmZXJyZWQgYW5kIHdoYXQgdGhlIGRldmljZSB0ZWxscyB1cworCSAqLworCWlmIChyZXNpZHVlICYmICEodXMtPmZmbGFncyAmIFVTX0ZMX0lHTk9SRV9SRVNJRFVFKSkgewogCQlyZXNpZHVlID0gbWluKHJlc2lkdWUsIHRyYW5zZmVyX2xlbmd0aCk7Ci0JCXNjc2lfc2V0X3Jlc2lkKHVzLT5zcmIsIG1heChzY3NpX2dldF9yZXNpZCh1cy0+c3JiKSwgKGludCkgcmVzaWR1ZSkpOworCQlzY3NpX3NldF9yZXNpZCh1cy0+c3JiLCBtYXgoc2NzaV9nZXRfcmVzaWQodXMtPnNyYiksCisJCQkJCQkJKGludCkgcmVzaWR1ZSkpOwogCX0KIAogCWlmIChiY3MtPlN0YXR1cyAhPSBVU19CVUxLX1NUQVRfT0spCkBAIC00MjQsMzUgKzQyMiw0MCBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfUmVhZF9EYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX1JlYWRfRGF0YSgpCisgKi8KIGludCBFTkVfUmVhZF9EYXRhKHN0cnVjdCB1c19kYXRhICp1cywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9SZWFkX0RhdGFcbiIpOwotCS8vIHNldCB1cCB0aGUgY29tbWFuZCB3cmFwcGVyCisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfUmVhZF9EYXRhXG4iKTsgKi8KKwkvKiBzZXQgdXAgdGhlIGNvbW1hbmQgd3JhcHBlciAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gbGVuZ3RoOwotCWJjYi0+RmxhZ3MgPTB4ODA7CisJYmNiLT5GbGFncyA9IDB4ODA7CiAJYmNiLT5DREJbMF0gPSAweEVEOwogCWJjYi0+Q0RCWzJdID0gMHhGRjsKIAliY2ItPkNEQlszXSA9IDB4ODE7CiAKLQkvLyBzZW5kIGNtZCB0byBvdXQgZW5kcG9pbnQKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnNlbmRfYnVsa19waXBlLCBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOworCS8qIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludCAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwKKwkJCQkJCVVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JLy8gUi9XIGRhdGEKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBidWYsIGxlbmd0aCwgTlVMTCk7CisJLyogUi9XIGRhdGEgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLAorCQkJCQkJYnVmLCBsZW5ndGgsIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JLy8gR2V0IENTVyBmb3IgZGV2aWNlIHN0YXR1cwotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CisJLyogR2V0IENTVyBmb3IgZGV2aWNlIHN0YXR1cyAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJjcywKKwkJCQkJCVVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCWlmIChiY3MtPlN0YXR1cyAhPSBVU19CVUxLX1NUQVRfT0spCkBAIC00NjEsMzUgKzQ2NCw0MCBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfV3JpdGVfRGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Xcml0ZV9EYXRhKCk6CisgKi8KIGludCBFTkVfV3JpdGVfRGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJc3RydWN0IGJ1bGtfY3Nfd3JhcCAqYmNzID0gKHN0cnVjdCBidWxrX2NzX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CiAKLQkvL3ByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfV3JpdGVfRGF0YVxuIik7Ci0JLy8gc2V0IHVwIHRoZSBjb21tYW5kIHdyYXBwZXIKKwkvKiBwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1dyaXRlX0RhdGFcbiIpOyAqLworCS8qIHNldCB1cCB0aGUgY29tbWFuZCB3cmFwcGVyICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSBsZW5ndGg7Ci0JYmNiLT5GbGFncyA9MHgwMDsKKwliY2ItPkZsYWdzID0gMHgwMDsKIAliY2ItPkNEQlswXSA9IDB4RUU7CiAJYmNiLT5DREJbMl0gPSAweEZGOwogCWJjYi0+Q0RCWzNdID0gMHg4MTsKIAotCS8vIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludAotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CisJLyogc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50ICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYmNiLAorCQkJCQkJVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBSL1cgZGF0YQotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJ1ZiwgbGVuZ3RoLCBOVUxMKTsKKwkvKiBSL1cgZGF0YSAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsCisJCQkJCQlidWYsIGxlbmd0aCwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKKwkvKiBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLAorCQkJCQkJVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJaWYgKGJjcy0+U3RhdHVzICE9IFVTX0JVTEtfU1RBVF9PSykKQEAgLTQ5OCw0MiArNTA2LDUyIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIHVzYl9zdG9yX3ByaW50X2NtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIHVzYl9zdG9yX3ByaW50X2NtZCgpOgorICovCiB2b2lkIHVzYl9zdG9yX3ByaW50X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwogCURXT1JECWNtZCA9IENkYlswXTsKLQlEV09SRAlibiAgPQkoKENkYlsyXTw8MjQpICYgMHhmZjAwMDAwMCkgfCAoKENkYlszXTw8MTYpICYgMHgwMGZmMDAwMCkgfAotCQkJKChDZGJbNF08PCA4KSAmIDB4MDAwMGZmMDApIHwgKChDZGJbNV08PCAwKSAmIDB4MDAwMDAwZmYpOwotCVdPUkQJYmxlbiA9ICgoQ2RiWzddPDwgOCkgJiAweGZmMDApIHwgKChDZGJbOF08PCAwKSAmIDB4MDBmZik7CisJRFdPUkQJYm4gID0JKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAorCQkJKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAorCQkJKChDZGJbNF0gPDwgOCkgJiAweDAwMDBmZjAwKSB8CisJCQkoKENkYls1XSA8PCAwKSAmIDB4MDAwMDAwZmYpOworCVdPUkQJYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBURVNUX1VOSVRfUkVBRFk6Ci0JCS8vcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1RFU1RfVU5JVF9SRUFEWVxuIiwgY21kKTsKKwkJLyogcHJpbnRrKEtFUk5fSU5GTworCQkJICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1RFU1RfVU5JVF9SRUFEWVxuIiwgY21kKTsgKi8KIAkJYnJlYWs7CiAJY2FzZSBJTlFVSVJZOgotCQlwcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfSU5RVUlSWVxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9JTlFVSVJZXG4iLCBjbWQpOwogCQlicmVhazsKIAljYXNlIE1PREVfU0VOU0U6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9NT0RFX1NFTlNFXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX01PREVfU0VOU0VcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgU1RBUlRfU1RPUDoKLQkJcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1NUQVJUX1NUT1BcbiIsIGNtZCk7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfU1RBUlRfU1RPUFxuIiwgY21kKTsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEX0NBUEFDSVRZOgotCQlwcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWVxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9SRUFEX0NBUEFDSVRZXG4iLCBjbWQpOwogCQlicmVhazsKIAljYXNlIFJFQURfMTA6Ci0JCS8vcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1JFQUQsIGJuID0gJVgsIGJsZW4gPSAlWFxuIiwgY21kLCBibiwgYmxlbik7CisJCS8qICBwcmludGsoS0VSTl9JTkZPCisJCQkgICAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9SRUFELGJuID0gJVgsIGJsZW4gPSAlWFxuIgorCQkJICAgLGNtZCwgYm4sIGJsZW4pOyAqLwogCQlicmVhazsKIAljYXNlIFdSSVRFXzEwOgotCQkvL3ByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9XUklURSwgYm4gPSAlWCwgYmxlbiA9ICVYXG4iLCBjbWQsIGJuLCBibGVuKTsKKwkJLyogcHJpbnRrKEtFUk5fSU5GTworCQkJICAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9XUklURSwKKwkJCSAgYm4gPSAlWCwgYmxlbiA9ICVYXG4iICwgY21kLCBibiwgYmxlbik7ICovCiAJCWJyZWFrOwogCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9BTExPV19NRURJVU1fUkVNT1ZBTFxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfQUxMT1dfTUVESVVNX1JFTU9WQUxcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIE90aGVyIGNtZFxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIE90aGVyIGNtZFxuIiwgY21kKTsKIAkJYnJlYWs7CiAJfQogCWJuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCmluZGV4IGNkMTk5ZmMuLjUyMjMxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaApAQCAtMSw1ICsxLDggQEAKICNpbmNsdWRlICJjb21tb24uaCIKIAorZXh0ZXJuIERXT1JEIE1lZGlhQ2hhbmdlOworZXh0ZXJuIGludCBDaGVja19EX01lZGlhRm10KHN0cnVjdCB1c19kYXRhICopOworCiBCWVRFIFNEX0luaXQxW10gPSB7CiAweDkwLCAweEZGLCAweDA5LCAweEUwLCAweDMwLCAweEUxLCAweDA2LCAweDkwLAogMHhGRiwgMHgyMywgMHg3NCwgMHg4MCwgMHhGMCwgMHg5MCwgMHhGRiwgMHgwOSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKaW5kZXggOWEzZmRiNC4uNDUyZWE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCUJZVEUgICAgICAgICAgICAgICAgICAgICAqUGFnZUJ1ZmZlcjsKIAlNU19MaWJUeXBlRXh0ZGF0ICAgICAgICAgRXh0cmFEYXRhOwogCi0JaWYgKChQYWdlQnVmZmVyID0gKEJZVEUgKilrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSk9PU5VTEwpCisJaWYgKChQYWdlQnVmZmVyID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpPT1OVUxMKQogCQlyZXR1cm4gKERXT1JEKS0xOwogCiAJcmVzdWx0ID0gKERXT1JEKS0xOwpAQCAtNDgwLDggKzQ4MCw4IEBACiAJRFdPUkQgIGk7CiAKIAotCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IChXT1JEICopa21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwotCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IChXT1JEICopa21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IGttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKKwl1cy0+TVNfTGliLkxvZzJQaHlNYXAgPSBrbWFsbG9jKHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jayAqIHNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoKHVzLT5NU19MaWIuUGh5MkxvZ01hcCA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5Mb2cyUGh5TWFwID09IE5VTEwpKQogCXsKQEAgLTYxMCw4ICs2MTAsOCBAQAogewogCXVzLT5NU19MaWIud3J0YmxrID0gKFdPUkQpLTE7CiAKLQl1cy0+TVNfTGliLmJsa3BhZyA9IChCWVRFICopa21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKLQl1cy0+TVNfTGliLmJsa2V4dCA9IChNU19MaWJUeXBlRXh0ZGF0ICopa21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiBzaXplb2YoTVNfTGliVHlwZUV4dGRhdCksIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuYmxrcGFnID0ga21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKKwl1cy0+TVNfTGliLmJsa2V4dCA9IGttYWxsb2ModXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrICogc2l6ZW9mKE1TX0xpYlR5cGVFeHRkYXQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICgodXMtPk1TX0xpYi5ibGtwYWcgPT0gTlVMTCkgfHwgKHVzLT5NU19MaWIuYmxrZXh0ID09IE5VTEwpKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKaW5kZXggYmRmYmY3Ni4uMmNiZTlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKQEAgLTE1Myw5ICsxNTMsOSBAQAogCVdPUkQgbGVuLCBibjsKIAogCS8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKSAgICAgICAgOyCmYiA2MjUwIGRvbid0IGNhcmUKLQkvLyAgICByZXR1cm4oRXJyQ29kZSk7ICAgICAgICAgICAgIDsKKwkvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAJLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKSAgICA7Ci0JLy8gICAgcmV0dXJuKEVyckNvZGUpOyAgICAgICAgICAgICA7CisJLy8gICAgcmV0dXJuKEVyckNvZGUpOwogCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCiAJCXJldHVybihFcnJDb2RlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKaW5kZXggMWI1MjUzNS4uY2UxMGNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCkBAIC03NjMsOCArNzYzLDggQEAKIAliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKIAliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwotCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7OwotCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7OworCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CisJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9XUklURSwgYnVmLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IDFlM2JiMTQuLjk2NDcxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CiAJaW50IGZyYW1lcyA9IGZzaXplIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCi0JaWYgKHJ1bnRpbWUgPT0gMCkKKwlpZiAocnVudGltZSA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAobGluZTZwY20tPnBvc19pbl9kb25lICsgZnJhbWVzID4gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCmluZGV4IGFiNjdlODguLmU1NTRhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHVyYiA9PSAwKSB7CisJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCXRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MobGVuZ3RoLCBHRlBfQVRPTUlDKTsKIAotCWlmICh0cmFuc2Zlcl9idWZmZXIgPT0gMCkgeworCWlmICh0cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BsYXliYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYwppbmRleCAyOTk0MGZkLi4xMGM1NDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAKIAljaGFuZ2Vfdm9sdW1lKHVyYl9vdXQsIGxpbmU2cGNtLT52b2x1bWVfcGxheWJhY2ssIGJ5dGVzX3Blcl9mcmFtZSk7CiAKLQlpZiAobGluZTZwY20tPnByZXZfZmJ1ZiAhPSAwKSB7CisJaWYgKGxpbmU2cGNtLT5wcmV2X2ZidWYgIT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19MSU5FNl9VU0JfSU1QVUxTRV9SRVNQT05TRQogCQlpZiAobGluZTZwY20tPmZsYWdzICYgTUFTS19QQ01fSU1QVUxTRSkgewogCQkJY3JlYXRlX2ltcHVsc2VfdGVzdF9zaWduYWwobGluZTZwY20sIHVyYl9vdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci5oIGIvZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXIuaAppbmRleCAwYjczNWI4Li4wZmViNzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmgKQEAgLTk1LDYgKzk1LDcgQEAKIAlkbWFfYWRkcl90IGJ1c19hZGRyZXNzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX01SU1RfUkFSX0hBTkRMRVIpCiAvKioKICAqIHJhcl9yZXNlcnZlKCkgLSByZXNlcnZlIFJBUiBidWZmZXJzCiAgKiBAYnVmZmVyczoJYXJyYXkgb2YgUkFSX2J1ZmZlcnMgd2hlcmUgdHlwZSBhbmQgc2l6ZSBvZiBidWZmZXJzIHRvCkBAIC0xNDksNyArMTUwLDI1IEBACiBleHRlcm4gc2l6ZV90IHJhcl9oYW5kbGVfdG9fYnVzKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLAogCQkJCXNpemVfdCBjb3VudCk7CiAKKyNlbHNlCiAKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9yZXNlcnZlKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9yZWxlYXNlKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9oYW5kbGVfdG9fYnVzKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmICAvKiBNUlNUX1JBUl9IQU5ETEVSICovCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmICAvKiBfTUVNUkFSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL01ha2VmaWxlCmluZGV4IGJiMzYwNmYuLjA3YTg5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL21zbS9NYWtlZmlsZQpAQCAtNDEsMTEgKzQxLDExIEBACiBvYmotJChDT05GSUdfRkJfTVNNX0xDREMpICs9IGxjZGMubwogCiAjIE1EREkKLW1zbV9tZGRpLW9ianMgOj0gbWRkaS5vIG1kZGlob3N0Lm8gbWRkaWhvc3RpLm8KK21zbV9tZGRpLXkgOj0gbWRkaS5vIG1kZGlob3N0Lm8gbWRkaWhvc3RpLm8KIG9iai0kKENPTkZJR19GQl9NU01fTURESSkgKz0gbXNtX21kZGkubwogCiAjIEV4dGVybmFsIE1EREkKLW1zbV9tZGRpX2V4dC1vYmpzIDo9IG1kZGlob3N0X2UubyBtZGRpX2V4dC5vCittc21fbWRkaV9leHQteSA6PSBtZGRpaG9zdF9lLm8gbWRkaV9leHQubwogb2JqLSQoQ09ORklHX0ZCX01TTV9FWFRNRERJKSArPSBtc21fbWRkaV9leHQubwogCiAjIFRWRW5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfdG9zaGliYV93dmdhX3B0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfdG9zaGliYV93dmdhX3B0LmMKaW5kZXggODY0ZDdjMS4uZWRiYTc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3Rvc2hpYmFfd3ZnYV9wdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY190b3NoaWJhX3d2Z2FfcHQuYwpAQCAtNzcsNyArNzcsNyBAQAogCiAJLyogZm9sbG93ZWQgYnkgcGFyYW1ldGVyIGJ5dGVzICovCiAJaWYgKG51bSkgewotCQlicCA9IChjaGFyICopJmRhdGE7OworCQlicCA9IChjaGFyICopJmRhdGE7CiAJCWJwICs9IChudW0gLSAxKTsKIAkJd2hpbGUgKG51bSkgewogCQkJdG9zaGliYV9zcGlfd3JpdGVfYnl0ZSgxLCAqYnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS9tc21fZmJfYmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbXNtX2ZiX2JsLmMKaW5kZXggMDMzZmM5NC4uMmE4MDc3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9tc21fZmJfYmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL21zbV9mYl9ibC5jCkBAIC00Miw3ICs0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBtc21fZmJfYmxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG1zbV9mYl9ibF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gbXNtX2ZiX2JsX2dldF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzID0gbXNtX2ZiX2JsX3VwZGF0ZV9zdGF0dXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS90dmVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL21zbS90dmVuYy5jCmluZGV4IGY0MWM1YWMuLjRmYmI3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vdHZlbmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL3R2ZW5jLmMKQEAgLTI3OSwxMiArMjc5LDEzIEBACiAKIAlpZiAoSVNfRVJSKHR2ZW5jX2NsaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlcnJvcjogY2FuJ3QgZ2V0IHR2ZW5jX2NsayFcbiIpOwotCQlyZXR1cm4gSVNfRVJSKHR2ZW5jX2Nsayk7CisJCXJldHVybiBQVFJfRVJSKHR2ZW5jX2Nsayk7CiAJfQogCiAJaWYgKElTX0VSUih0dmRhY19jbGspKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXJyb3I6IGNhbid0IGdldCB0dmRhY19jbGshXG4iKTsKLQkJcmV0dXJuIElTX0VSUih0dmRhY19jbGspOworCQljbGtfcHV0KHR2ZW5jX2Nsayk7CisJCXJldHVybiBQVFJfRVJSKHR2ZGFjX2Nsayk7CiAJfQogCiAvLwlwbV9xb3NfYWRkX3JlcXVpcmVtZW50KFBNX1FPU19TWVNURU1fQlVTX0ZSRVEgLCAidHZlbmMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9UT0RPCmluZGV4IGFjMmQzZDAuLjM1ZjljZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL1RPRE8KQEAgLTEsNiArMSw1IEBACiBUT0RPOgogCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwotCS0gcG9ydCBnZW9kZSBncGlvIGNhbGxzIHRvIG5ld2VyIGNzNTUzNSBBUEkKIAktIHNlZSBpZiB2eDg1NSBncGlvIEFQSSBjYW4gYmUgbWFkZSBzaW1pbGFyIGVub3VnaCB0byBjczU1MzUgc28gd2UgY2FuCiAJICBzaGFyZSBtb3JlIGNvZGUKIAktIGFsbG93IHNpbXVsdGFuZW91cyBYTy0xIGFuZCBYTy0xLjUgc3VwcG9ydApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmMKaW5kZXggNGNhNDVlYy4uOWYyNmRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+CiAjaW5jbHVkZSA8YXNtL29scGMuaD4KIApAQCAtNDksNyArNDgsNyBAQAogCWludCAoKmluaXQpKHZvaWQpOwogCXZvaWQgKCpidXNfc3RhYmlsaXplX3dpZ2dsZSkodm9pZCk7CiAJdm9pZCAoKnNldF9kY29ubG9hZCkoaW50KTsKLQlpbnQgKCpyZWFkX3N0YXR1cykodm9pZCk7CisJdTggKCpyZWFkX3N0YXR1cykodm9pZCk7CiB9OwogCiBzdGF0aWMgc3RydWN0IGRjb25fcGxhdGZvcm1fZGF0YSAqcGRhdGE7CkBAIC02MTUsNyArNjE0LDcgQEAKIAlfX0FUVFIocmVzdW1lbGluZSwgMDY0NCwgZGNvbl9yZXN1bWVsaW5lX3Nob3csIGRjb25fcmVzdW1lbGluZV9zdG9yZSksCiB9OwogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZGNvbl9ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgZGNvbl9ibF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gZGNvbmJsX2dldCwKIAkudXBkYXRlX3N0YXR1cyA9IGRjb25ibF9zZXQKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uaAppbmRleCA2NDUzY2E0Li5lNTY2ZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmgKQEAgLTI5LDI2ICsyOSw2IEBACiAjZGVmaW5lIERDT05fUkVHX1NDQU5fSU5UCTkKICNkZWZpbmUgRENPTl9SRUdfQlJJR0hUCQkxMAogCi0vKiBHUElPIHJlZ2lzdGVycyAoQ1M1NTM2KSAqLwotCi0jZGVmaW5lIE1TUl9MQkFSX0dQSU8JCTB4NTE0MDAwMEMKLQotI2RlZmluZSBHUElPeF9PVVRfVkFMICAgICAweDAwCi0jZGVmaW5lIEdQSU94X09VVF9FTiAgICAgIDB4MDQKLSNkZWZpbmUgR1BJT3hfSU5fRU4gICAgICAgMHgyMAotI2RlZmluZSBHUElPeF9JTlZfRU4gICAgICAweDI0Ci0jZGVmaW5lIEdQSU94X0lOX0ZMVFJfRU4gIDB4MjgKLSNkZWZpbmUgR1BJT3hfRVZOVENOVF9FTiAgMHgyQwotI2RlZmluZSBHUElPeF9SRUFEX0JBQ0sgICAweDMwCi0jZGVmaW5lIEdQSU94X0VWTlRfRU4gICAgIDB4MzgKLSNkZWZpbmUgR1BJT3hfTkVHRURHRV9FTiAgMHg0NAotI2RlZmluZSBHUElPeF9ORUdFREdFX1NUUyAweDRDCi0jZGVmaW5lIEdQSU9fRkxUN19BTU5UICAgIDB4RDgKLSNkZWZpbmUgR1BJT19NQVBfWCAgICAgICAgMHhFMAotI2RlZmluZSBHUElPX01BUF9ZICAgICAgICAweEU0Ci0jZGVmaW5lIEdQSU9fRkU3X1NFTCAgICAgIDB4RjcKLQotCiAvKiBTdGF0dXMgdmFsdWVzICovCiAKICNkZWZpbmUgRENPTlNUQVRfU0NBTklOVAkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xLmMKaW5kZXggNzc5ZmI3ZC4uMDQzMTk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb25feG9fMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzEuYwpAQCAtMTAsNTQgKzEwLDcwIEBACiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCi0KKyNpbmNsdWRlIDxsaW51eC9jczU1MzUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL29scGMuaD4KIAogI2luY2x1ZGUgIm9scGNfZGNvbi5oIgogCi0vKiBCYXNlIGFkZHJlc3Mgb2YgdGhlIEdQSU8gcmVnaXN0ZXJzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX2Jhc2U7Ci0KLS8qCi0gKiBMaXN0IG9mIEdQSU9zIHRoYXQgd2UgY2FyZSBhYm91dDoKLSAqIChpbikgIEdQSU8xMiAgIC0tIERDT05CTEFOSwotICogKGluKSAgR1BJT1s1Nl0gLS0gRENPTlNUQVRbMDFdCi0gKiAob3V0KSBHUElPMTEgICAtLSBEQ09OTE9BRAotICovCi0KLSNkZWZpbmUgSU5fR1BJT1MgKCgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSB8ICgxPDwxMikpCi0jZGVmaW5lIE9VVF9HUElPUyAoMTw8MTEpCi0KIHN0YXRpYyBpbnQgZGNvbl9pbml0X3hvXzEodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvLCBoaTsKIAl1bnNpZ25lZCBjaGFyIGxvYjsKIAotCXJkbXNyKE1TUl9MQkFSX0dQSU8sIGxvLCBoaSk7Ci0KLQkvKiBDaGVjayB0aGUgbWFzayBhbmQgd2hldGhlciBHUElPIGlzIGVuYWJsZWQgKHNhbml0eSBjaGVjaykgKi8KLQlpZiAoaGkgIT0gMHgwMDAwZjAwMSkgewotCQlwcmludGsoS0VSTl9FUlIgIkdQSU8gbm90IGVuYWJsZWQgLS0gY2Fubm90IHVzZSBEQ09OXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGdwaW9fcmVxdWVzdChPTFBDX0dQSU9fRENPTl9TVEFUMCwgIk9MUEMtRENPTiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib2xwYy1kY29uOiBmYWlsZWQgdG8gcmVxdWVzdCBTVEFUMCBHUElPXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChncGlvX3JlcXVlc3QoT0xQQ19HUElPX0RDT05fU1RBVDEsICJPTFBDLURDT04iKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9scGMtZGNvbjogZmFpbGVkIHRvIHJlcXVlc3QgU1RBVDEgR1BJT1xuIik7CisJCWdvdG8gZXJyX2dwX3N0YXQxOworCX0KKwlpZiAoZ3Bpb19yZXF1ZXN0KE9MUENfR1BJT19EQ09OX0lSUSwgIk9MUEMtRENPTiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib2xwYy1kY29uOiBmYWlsZWQgdG8gcmVxdWVzdCBJUlEgR1BJT1xuIik7CisJCWdvdG8gZXJyX2dwX2lycTsKKwl9CisJaWYgKGdwaW9fcmVxdWVzdChPTFBDX0dQSU9fRENPTl9MT0FELCAiT0xQQy1EQ09OIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvbHBjLWRjb246IGZhaWxlZCB0byByZXF1ZXN0IExPQUQgR1BJT1xuIik7CisJCWdvdG8gZXJyX2dwX2xvYWQ7CisJfQorCWlmIChncGlvX3JlcXVlc3QoT0xQQ19HUElPX0RDT05fQkxBTkssICJPTFBDLURDT04iKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9scGMtZGNvbjogZmFpbGVkIHRvIHJlcXVlc3QgQkxBTksgR1BJT1xuIik7CisJCWdvdG8gZXJyX2dwX2JsYW5rOwogCX0KIAotCS8qIE1hc2sgb2ZmIHRoZSBJTyBiYXNlIGFkZHJlc3MgKi8KLQlncGlvX2Jhc2UgPSBsbyAmIDB4MDAwMGZmMDA7Ci0KIAkvKiBUdXJuIG9mZiB0aGUgZXZlbnQgZW5hYmxlIGZvciBHUElPNyBqdXN0IHRvIGJlIHNhZmUgKi8KLQlvdXRsKDEgPDwgKDE2KzcpLCBncGlvX2Jhc2UgKyBHUElPeF9FVk5UX0VOKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fRENPTl9JUlEsIEdQSU9fRVZFTlRTX0VOQUJMRSk7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgY3VycmVudCBzdGF0ZSBieSByZWFkaW5nIHRoZSBHUElPIGJpdDsgZWFybGllcgorCSAqIHN0YWdlcyBvZiB0aGUgYm9vdCBwcm9jZXNzIGhhdmUgZXN0YWJsaXNoZWQgdGhlIHN0YXRlLgorCSAqCisJICogTm90ZSB0aGF0IHdlIHJlYWQgR1BJT19PVVBVVF9WQUwgcmF0aGVyIHRoYW4gR1BJT19SRUFEX0JBQ0sgaGVyZTsKKwkgKiB0aGlzIGlzIGJlY2F1c2UgT0ZXIHdpbGwgZGlzYWJsZSBpbnB1dCBmb3IgdGhlIHBpbiBhbmQgc2V0IGEgdmFsdWUuLgorCSAqIFJFQURfQkFDSyB3aWxsIG9ubHkgY29udGFpbiBhIHZhbGlkIHZhbHVlIGlmIGlucHV0IGlzIGVuYWJsZWQgYW5kCisJICogdGhlbiBhIHZhbHVlIGlzIHNldC4gIFNvLCBmdXR1cmUgcmVhZGluZ3Mgb2YgdGhlIHBpbiBjYW4gdXNlCisJICogUkVBRF9CQUNLLCBidXQgdGhlIGZpcnN0IG9uZSBjYW5ub3QuICBBd2Vzb21lLCBodWg/CisJICovCisJZGNvbl9zb3VyY2UgPSBjczU1MzVfZ3Bpb19pc3NldChPTFBDX0dQSU9fRENPTl9MT0FELCBHUElPX09VVFBVVF9WQUwpCisJCT8gRENPTl9TT1VSQ0VfQ1BVCisJCTogRENPTl9TT1VSQ0VfRENPTjsKKwlkY29uX3BlbmRpbmcgPSBkY29uX3NvdXJjZTsKIAogCS8qIFNldCB0aGUgZGlyZWN0aW9ucyBmb3IgdGhlIEdQSU8gcGlucyAqLwotCW91dGwoT1VUX0dQSU9TIHwgKElOX0dQSU9TIDw8IDE2KSwgZ3Bpb19iYXNlICsgR1BJT3hfT1VUX0VOKTsKLQlvdXRsKElOX0dQSU9TIHwgKE9VVF9HUElPUyA8PCAxNiksIGdwaW9fYmFzZSArIEdQSU94X0lOX0VOKTsKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChPTFBDX0dQSU9fRENPTl9TVEFUMCk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoT0xQQ19HUElPX0RDT05fU1RBVDEpOworCWdwaW9fZGlyZWN0aW9uX2lucHV0KE9MUENfR1BJT19EQ09OX0lSUSk7CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoT0xQQ19HUElPX0RDT05fQkxBTkspOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChPTFBDX0dQSU9fRENPTl9MT0FELAorCQkJZGNvbl9zb3VyY2UgPT0gRENPTl9TT1VSQ0VfQ1BVKTsKIAogCS8qIFNldCB1cCB0aGUgaW50ZXJydXB0IG1hcHBpbmdzICovCiAKIAkvKiBTZXQgdGhlIElSUSB0byBwYWlyIDIgKi8KLQlnZW9kZV9ncGlvX2V2ZW50X2lycShPTFBDX0dQSU9fRENPTl9JUlEsIDIpOworCWNzNTUzNV9ncGlvX3NldHVwX2V2ZW50KE9MUENfR1BJT19EQ09OX0lSUSwgMiwgMCk7CiAKIAkvKiBFbmFibGUgZ3JvdXAgMiB0byB0cmlnZ2VyIHRoZSBEQ09OIGludGVycnVwdCAqLwotCWdlb2RlX2dwaW9fc2V0X2lycSgyLCBEQ09OX0lSUSk7CisJY3M1NTM1X2dwaW9fc2V0X2lycSgyLCBEQ09OX0lSUSk7CiAKIAkvKiBTZWxlY3QgZWRnZSBsZXZlbCBmb3IgaW50ZXJydXB0IChpbiBQSUMpICovCiAJbG9iID0gaW5iKDB4NGQwKTsKQEAgLTY1LDUyICs4MSw2MSBAQAogCW91dGIobG9iLCAweDRkMCk7CiAKIAkvKiBSZWdpc3RlciB0aGUgaW50ZXJ1cHQgaGFuZGxlciAqLwotCWlmIChyZXF1ZXN0X2lycShEQ09OX0lSUSwgJmRjb25faW50ZXJydXB0LCAwLCAiRENPTiIsICZkY29uX2RyaXZlcikpCi0JCXJldHVybiAtRUlPOworCWlmIChyZXF1ZXN0X2lycShEQ09OX0lSUSwgJmRjb25faW50ZXJydXB0LCAwLCAiRENPTiIsICZkY29uX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvbHBjLWRjb246IGZhaWxlZCB0byByZXF1ZXN0IERDT04ncyBpcnFcbiIpOworCQlnb3RvIGVycl9yZXFfaXJxOworCX0KIAogCS8qIENsZWFyIElOVl9FTiBmb3IgR1BJTzcgKERDT05JUlEpICovCi0Jb3V0bCgoMTw8KDE2KzcpKSwgZ3Bpb19iYXNlICsgR1BJT3hfSU5WX0VOKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fRENPTl9JUlEsIEdQSU9fSU5QVVRfSU5WRVJUKTsKIAogCS8qIEVuYWJsZSBmaWx0ZXIgZm9yIEdQSU8xMiAoRENPTkJMQU5LKSAqLwotCW91dGwoMTw8KDEyKSwgZ3Bpb19iYXNlICsgR1BJT3hfSU5fRkxUUl9FTik7CisJY3M1NTM1X2dwaW9fc2V0KE9MUENfR1BJT19EQ09OX0JMQU5LLCBHUElPX0lOUFVUX0ZJTFRFUik7CiAKIAkvKiBEaXNhYmxlIGZpbHRlciBmb3IgR1BJTzcgKi8KLQlvdXRsKDE8PCgxNis3KSwgZ3Bpb19iYXNlICsgR1BJT3hfSU5fRkxUUl9FTik7CisJY3M1NTM1X2dwaW9fY2xlYXIoT0xQQ19HUElPX0RDT05fSVJRLCBHUElPX0lOUFVUX0ZJTFRFUik7CiAKIAkvKiBEaXNhYmxlIGV2ZW50IGNvdW50ZXIgZm9yIEdQSU83IChEQ09OSVJRKSBhbmQgR1BJTzEyIChEQ09OQkxBTkspICovCi0KLQlvdXRsKDE8PCgxNis3KSwgZ3Bpb19iYXNlICsgR1BJT3hfRVZOVENOVF9FTik7Ci0Jb3V0bCgxPDwoMTYrMTIpLCBncGlvX2Jhc2UgKyBHUElPeF9FVk5UQ05UX0VOKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fRENPTl9JUlEsIEdQSU9fSU5QVVRfRVZFTlRfQ09VTlQpOworCWNzNTUzNV9ncGlvX2NsZWFyKE9MUENfR1BJT19EQ09OX0JMQU5LLCBHUElPX0lOUFVUX0VWRU5UX0NPVU5UKTsKIAogCS8qIEFkZCBHUElPMTIgdG8gdGhlIEZpbHRlciBFdmVudCBQYWlyICM3ICovCi0Jb3V0YigxMiwgZ3Bpb19iYXNlICsgR1BJT19GRTdfU0VMKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fQkxBTkssIEdQSU9fRkU3X1NFTCk7CiAKIAkvKiBUdXJuIG9mZiBuZWdhdGl2ZSBFZGdlIEVuYWJsZSBmb3IgR1BJTzEyICovCi0Jb3V0bCgxPDwoMTYrMTIpLCBncGlvX2Jhc2UgKyBHUElPeF9ORUdFREdFX0VOKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fRENPTl9CTEFOSywgR1BJT19ORUdBVElWRV9FREdFX0VOKTsKIAogCS8qIEVuYWJsZSBuZWdhdGl2ZSBFZGdlIEVuYWJsZSBmb3IgR1BJTzcgKi8KLQlvdXRsKDE8PDcsIGdwaW9fYmFzZSArIEdQSU94X05FR0VER0VfRU4pOworCWNzNTUzNV9ncGlvX3NldChPTFBDX0dQSU9fRENPTl9JUlEsIEdQSU9fTkVHQVRJVkVfRURHRV9FTik7CiAKIAkvKiBaZXJvIHRoZSBmaWx0ZXIgYW1vdW50IGZvciBGaWx0ZXIgRXZlbnQgUGFpciAjNyAqLwotCW91dHcoMCwgZ3Bpb19iYXNlICsgR1BJT19GTFQ3X0FNTlQpOworCWNzNTUzNV9ncGlvX3NldCgwLCBHUElPX0ZMVFI3X0FNT1VOVCk7CiAKIAkvKiBDbGVhciB0aGUgbmVnYXRpdmUgZWRnZSBzdGF0dXMgZm9yIEdQSU83IGFuZCBHUElPMTIgKi8KLQlvdXRsKCgxPDw3KSB8ICgxPDwxMiksIGdwaW9fYmFzZSsweDRjKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fSVJRLCBHUElPX05FR0FUSVZFX0VER0VfU1RTKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fQkxBTkssIEdQSU9fTkVHQVRJVkVfRURHRV9TVFMpOwogCiAJLyogRklYTUU6ICBDbGVhciB0aGUgcG9zaWl0aXZlIHN0YXR1cyBhcyB3ZWxsLCBqdXN0IHRvIGJlIHN1cmUgKi8KLQlvdXRsKCgxPDw3KSB8ICgxPDwxMiksIGdwaW9fYmFzZSsweDQ4KTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fSVJRLCBHUElPX1BPU0lUSVZFX0VER0VfU1RTKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fQkxBTkssIEdQSU9fUE9TSVRJVkVfRURHRV9TVFMpOwogCiAJLyogRW5hYmxlIGV2ZW50cyBmb3IgR1BJTzcgKERDT05JUlEpIGFuZCBHUElPMTIgKERDT05CTEFOSykgKi8KLQlvdXRsKCgxPDwoNykpfCgxPDwxMiksIGdwaW9fYmFzZSArIEdQSU94X0VWTlRfRU4pOwotCi0JLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgdGhlIEdQSU8gYml0ICovCi0JLyogRWFybGllciBzdGFnZXMgb2YgdGhlIGJvb3QgcHJvY2VzcyBoYXZlIGVzdGFibGlzaGVkIHRoZSBzdGF0ZSAqLwotCWRjb25fc291cmNlID0gaW5sKGdwaW9fYmFzZSArIEdQSU94X09VVF9WQUwpICYgKDE8PDExKQotCQk/IERDT05fU09VUkNFX0NQVQotCQk6IERDT05fU09VUkNFX0RDT047Ci0JZGNvbl9wZW5kaW5nID0gZGNvbl9zb3VyY2U7CisJY3M1NTM1X2dwaW9fc2V0KE9MUENfR1BJT19EQ09OX0lSUSwgR1BJT19FVkVOVFNfRU5BQkxFKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX0RDT05fQkxBTkssIEdQSU9fRVZFTlRTX0VOQUJMRSk7CiAKIAlyZXR1cm4gMDsKKworZXJyX3JlcV9pcnE6CisJZ3Bpb19mcmVlKE9MUENfR1BJT19EQ09OX0JMQU5LKTsKK2Vycl9ncF9ibGFuazoKKwlncGlvX2ZyZWUoT0xQQ19HUElPX0RDT05fTE9BRCk7CitlcnJfZ3BfbG9hZDoKKwlncGlvX2ZyZWUoT0xQQ19HUElPX0RDT05fSVJRKTsKK2Vycl9ncF9pcnE6CisJZ3Bpb19mcmVlKE9MUENfR1BJT19EQ09OX1NUQVQxKTsKK2Vycl9ncF9zdGF0MToKKwlncGlvX2ZyZWUoT0xQQ19HUElPX0RDT05fU1RBVDApOworCXJldHVybiAtRUlPOwogfQogCiBzdGF0aWMgdm9pZCBkY29uX3dpZ2dsZV94b18xKHZvaWQpCkBAIC0xMjgsMzcgKzE1Myw0NCBAQAogCSAqIHNpbXVsdGFuZW91c2x5IHNldCBBVVgxIElOL09VVCB0byBHUElPMTQ7IGRpdHRvIGZvciBTTUJfREFUQSBhbmQKIAkgKiBHUElPMTUuCiAgCSAqLwotCWdlb2RlX2dwaW9fc2V0KE9MUENfR1BJT19TTUJfQ0xLfE9MUENfR1BJT19TTUJfREFUQSwgR1BJT19PVVRQVVRfVkFMKTsKLQlnZW9kZV9ncGlvX3NldChPTFBDX0dQSU9fU01CX0NMS3xPTFBDX0dQSU9fU01CX0RBVEEsIEdQSU9fT1VUUFVUX0VOQUJMRSk7Ci0JZ2VvZGVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fU01CX0NMS3xPTFBDX0dQSU9fU01CX0RBVEEsIEdQSU9fT1VUUFVUX0FVWDEpOwotCWdlb2RlX2dwaW9fY2xlYXIoT0xQQ19HUElPX1NNQl9DTEt8T0xQQ19HUElPX1NNQl9EQVRBLCBHUElPX09VVFBVVF9BVVgyKTsKLQlnZW9kZV9ncGlvX2NsZWFyKE9MUENfR1BJT19TTUJfQ0xLfE9MUENfR1BJT19TTUJfREFUQSwgR1BJT19JTlBVVF9BVVgxKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX1NNQl9DTEssIEdQSU9fT1VUUFVUX1ZBTCk7CisJY3M1NTM1X2dwaW9fc2V0KE9MUENfR1BJT19TTUJfREFUQSwgR1BJT19PVVRQVVRfVkFMKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX1NNQl9DTEssIEdQSU9fT1VUUFVUX0VOQUJMRSk7CisJY3M1NTM1X2dwaW9fc2V0KE9MUENfR1BJT19TTUJfREFUQSwgR1BJT19PVVRQVVRfRU5BQkxFKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fU01CX0NMSywgR1BJT19PVVRQVVRfQVVYMSk7CisJY3M1NTM1X2dwaW9fY2xlYXIoT0xQQ19HUElPX1NNQl9EQVRBLCBHUElPX09VVFBVVF9BVVgxKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fU01CX0NMSywgR1BJT19PVVRQVVRfQVVYMik7CisJY3M1NTM1X2dwaW9fY2xlYXIoT0xQQ19HUElPX1NNQl9EQVRBLCBHUElPX09VVFBVVF9BVVgyKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fU01CX0NMSywgR1BJT19JTlBVVF9BVVgxKTsKKwljczU1MzVfZ3Bpb19jbGVhcihPTFBDX0dQSU9fU01CX0RBVEEsIEdQSU9fSU5QVVRfQVVYMSk7CiAKIAlmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgewogCQl1ZGVsYXkoNSk7Ci0JCWdlb2RlX2dwaW9fY2xlYXIoT0xQQ19HUElPX1NNQl9DTEssIEdQSU9fT1VUUFVUX1ZBTCk7CisJCWNzNTUzNV9ncGlvX2NsZWFyKE9MUENfR1BJT19TTUJfQ0xLLCBHUElPX09VVFBVVF9WQUwpOwogCQl1ZGVsYXkoNSk7Ci0JCWdlb2RlX2dwaW9fc2V0KE9MUENfR1BJT19TTUJfQ0xLLCBHUElPX09VVFBVVF9WQUwpOworCQljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX1NNQl9DTEssIEdQSU9fT1VUUFVUX1ZBTCk7CiAJfQogCXVkZWxheSg1KTsKLQlnZW9kZV9ncGlvX3NldChPTFBDX0dQSU9fU01CX0NMS3xPTFBDX0dQSU9fU01CX0RBVEEsIEdQSU9fT1VUUFVUX0FVWDEpOwotCWdlb2RlX2dwaW9fc2V0KE9MUENfR1BJT19TTUJfQ0xLfE9MUENfR1BJT19TTUJfREFUQSwgR1BJT19JTlBVVF9BVVgxKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX1NNQl9DTEssIEdQSU9fT1VUUFVUX0FVWDEpOworCWNzNTUzNV9ncGlvX3NldChPTFBDX0dQSU9fU01CX0RBVEEsIEdQSU9fT1VUUFVUX0FVWDEpOworCWNzNTUzNV9ncGlvX3NldChPTFBDX0dQSU9fU01CX0NMSywgR1BJT19JTlBVVF9BVVgxKTsKKwljczU1MzVfZ3Bpb19zZXQoT0xQQ19HUElPX1NNQl9EQVRBLCBHUElPX0lOUFVUX0FVWDEpOwogfQogCiBzdGF0aWMgdm9pZCBkY29uX3NldF9kY29ubG9hZF8xKGludCB2YWwpCiB7Ci0JaWYgKHZhbCkJCi0JCW91dGwoMTw8MTEsIGdwaW9fYmFzZSArIEdQSU94X09VVF9WQUwpOwotCWVsc2UKLQkJb3V0bCgxPDwoMTEgKyAxNiksIGdwaW9fYmFzZSArIEdQSU94X09VVF9WQUwpOworCWdwaW9fc2V0X3ZhbHVlKE9MUENfR1BJT19EQ09OX0xPQUQsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgZGNvbl9yZWFkX3N0YXR1c194b18xKHZvaWQpCitzdGF0aWMgdTggZGNvbl9yZWFkX3N0YXR1c194b18xKHZvaWQpCiB7Ci0JaW50IHN0YXR1cyA9IGlubChncGlvX2Jhc2UgKyBHUElPeF9SRUFEX0JBQ0spID4+IDU7Ci0JCisJdTggc3RhdHVzOworCisJc3RhdHVzID0gZ3Bpb19nZXRfdmFsdWUoT0xQQ19HUElPX0RDT05fU1RBVDApOworCXN0YXR1cyB8PSBncGlvX2dldF92YWx1ZShPTFBDX0dQSU9fRENPTl9TVEFUMSkgPDwgMTsKKwogCS8qIENsZWFyIHRoZSBuZWdhdGl2ZSBlZGdlIHN0YXR1cyBmb3IgR1BJTzcgKi8KLQlvdXRsKDEgPDwgNywgZ3Bpb19iYXNlICsgR1BJT3hfTkVHRURHRV9TVFMpOworCWNzNTUzNV9ncGlvX3NldChPTFBDX0dQSU9fRENPTl9JUlEsIEdQSU9fTkVHQVRJVkVfRURHRV9TVFMpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb25feG9fMV81LmMKaW5kZXggY2NhNmEyMy4uNGY1NjA5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb25feG9fMV81LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb25feG9fMV81LmMKQEAgLTE5NSw5ICsxOTUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBkY29uX3JlYWRfc3RhdHVzX3hvXzFfNSh2b2lkKSAKK3N0YXRpYyB1OCBkY29uX3JlYWRfc3RhdHVzX3hvXzFfNSh2b2lkKQogewotCWludCBzdGF0dXM7CisJdTggc3RhdHVzOwogCQogCWlmICghZGNvbl93YXNfaXJxKCkpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCmluZGV4IDY3NzE1MjAuLjY4MzY1N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYwpAQCAtNjksNyArNjksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwaGlzb25fcGNpX3RibFtdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBoaXNvbl9wY2lfdGJsKSA9IHsKIAl7IFBDSV9WRU5ET1JfSURfUEhJU09OLCBQQ0lfREVWSUNFX0lEX1BTNTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkgIFBDSV9DTEFTU19TVE9SQUdFX0lERSA8PCA4LCAweGZmZmYwMCwgMCB9LAogCXsgMCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jcnlwdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jcnlwdG8uYwppbmRleCAyZmRiM2UwLi42NTQwODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY3J5cHRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jCkBAIC0xMzAsMTAgKzEzMCw4IEBACiAKIHZvaWQgcG9obWVsZnNfY3J5cHRvX2VuZ2luZV9leGl0KHN0cnVjdCBwb2htZWxmc19jcnlwdG9fZW5naW5lICplKQogewotCWlmIChlLT5oYXNoKQotCQljcnlwdG9fZnJlZV9oYXNoKGUtPmhhc2gpOwotCWlmIChlLT5jaXBoZXIpCi0JCWNyeXB0b19mcmVlX2FibGtjaXBoZXIoZS0+Y2lwaGVyKTsKKwljcnlwdG9fZnJlZV9oYXNoKGUtPmhhc2gpOworCWNyeXB0b19mcmVlX2FibGtjaXBoZXIoZS0+Y2lwaGVyKTsKIAlrZnJlZShlLT5kYXRhKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL25ldC5jCmluZGV4IDkyNzk4OTcuLmIyZTkxODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9uZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvbmV0LmMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCQkJCWlmIChkZW50cnkpIHsKIAkJCQkJYWxpYXMgPSBkX21hdGVyaWFsaXNlX3VuaXF1ZShkZW50cnksICZucGktPnZmc19pbm9kZSk7CiAJCQkJCWlmIChhbGlhcykKLQkJCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQkJCWRwdXQoYWxpYXMpOwogCQkJCX0KIAogCQkJCWRwdXQoZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oCmluZGV4IDlmMjVlZjAuLmI4ODY4YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaApAQCAtMzAsNyArMzAsOCBAQAogICAgIEFic3RyYWN0OgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgIAlXaGVuICAgICAgICAgICAgV2hhdAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKICAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNDUsNyArNDYsNyBAQAogCiAvKiAqLwogLyogRGV2aWNlIElEICYgVmVuZG9yIElEIHJlbGF0ZWQgZGVmaW5pdGlvbnMsICovCi0vKiBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Ugbm90IHN1cmUgaXQgYmVsb25ncyB0byB3aGF0IGNoaXAuICovCisvKiBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Uga25vdyBmb3Igc3VyZSB3aGF0IGNoaXAgaXQgYmVsb25ncyB0b28uICovCiAvKiAqLwogI2RlZmluZSBOSUNfUENJX1ZFTkRPUl9JRAkJMHgxODE0CiAjZGVmaW5lIFBDSUJVU19JTlRFTF9WRU5ET1IJMHg4MDg2CkBAIC04Myw3ICs4NCw3IEBACiAJdTMyIFNEUHRyMTsKIAkvKldvcmQzICovCiAJdTMyIHJzdjI6MjQ7Ci0JdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KIAl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCiAJdTMyIHJzdjoyOwogCXUzMiBUQ086MTsJCS8qICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaAppbmRleCBlZDBjMGI0Li5lODE1OGZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oCkBAIC0zMCw3ICszMCw4IEBACiAgICAgQWJzdHJhY3Q6CiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTkzLDcgKzk0LDcgQEAKIAkvKiBXb3JkIDAgKi8KIAl1MzIgVVNCRE1BVHhQa3RMZW46MTY7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4gKi8KIAl1MzIgcnN2Ojg7Ci0JdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KIAl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCiAJdTMyIFN3VXNlTGFzdFJvdW5kOjE7CS8qIFNvZnR3YXJlIHVzZS4gKi8KIAl1MzIgcnN2MjoyOwkJLyogU29mdHdhcmUgdXNlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAppbmRleCBlOGY3MTcyLi4zZDFlNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaApAQCAtMzIsNiArMzIsNyBAQAogCiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkgIFdoYXQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCSAgRml4IGEgY29tbWVudHMsIGFuZCB0eXBvcwogCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC00Myw3ICs0NCw3IEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyogdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLiAqLwotLyogTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4gKi8KKy8qIE1BQyBibG9jayB1c2VzIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLiAqLwogI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgpAQCAtNDU4LDggKzQ1OSw4IEBACiAvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzBfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCi0JCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgUmVnSWRBbmRDb250ZW50OjI0OwkvKiBSZWdpc3RlciB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCBCQlAgcmVnaXN0ZXIgKi8KIAkJdTMyIFN0YW5kYnlNb2RlOjE7CS8qIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOiBsb3cgd2hlbiBzdGFuZGJ5ICovCiAJCXUzMiBTZWw6MTsJLyogMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlICovCiAJCXUzMiBCdXN5OjE7CS8qIDA6IGlkbGUgMTogOGJ1c3kgKi8KQEAgLTQ2OSw3ICs0NzAsNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMQkJCTB4MTAyNAogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzFfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIFJGR2FwOjU7CS8qIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykgKi8KIAkJdTMyIHJzdjo3OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKQEAgLTQ3OCw3ICs0NzksNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMgkJCTB4MTAyOAkvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzJfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIHJzdjo4OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKIAl1MzIgd29yZDsKQEAgLTQ5MCw3ICs0OTEsNyBAQAogCQl1MzIgT2ZmUGVyaW9kOjg7CS8qIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMgKi8KIAkJdTMyIFNsb3dCbGlua1BlcmlvZDo2OwkvKiBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMgKi8KIAkJdTMyIHJzdjoyOwotCQl1MzIgUkxlZE1vZGU6MjsJLyogcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uICovCisJCXUzMiBSTGVkTW9kZToyOwkvKiByZWQgTGVkIE1vZGUgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24gKi8KIAkJdTMyIEdMZWRNb2RlOjI7CS8qIGdyZWVuIExlZCBNb2RlICovCiAJCXUzMiBZTGVkTW9kZToyOwkvKiB5ZWxsb3cgTGVkIE1vZGUgKi8KIAkJdTMyIExlZFBvbGFyOjE7CS8qIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaCAqLwpAQCAtNjIxLDkgKzYyMiw5IEBACiAjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCiB0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQyB7CiAJc3RydWN0IHsKLQkJdTMyIFNob3J0UnR5TGltaXQ6ODsJLyogIHNob3J0IHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5TGltaXQ6ODsJLypsb25nIHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5VGhyZToxMjsJLyogTG9uZyByZXRyeSB0aHJlc2hvb2xkICovCisJCXUzMiBTaG9ydFJ0eUxpbWl0Ojg7CS8qIHNob3J0IHJldHJ5IGxpbWl0ICovCisJCXUzMiBMb25nUnR5TGltaXQ6ODsJLyogbG9uZyByZXRyeSBsaW1pdCAqLworCQl1MzIgTG9uZ1J0eVRocmU6MTI7CS8qIExvbmcgcmV0cnkgdGhyZXNob2xkICovCiAJCXUzMiBOb25BZ2dSdHlNb2RlOjE7CS8qIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgQWdnUnR5TW9kZToxOwkvKiBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgVHhhdXRvRkJFbmFibGU6MTsJLyogVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKaW5kZXggOWY5MjRlYS4uOTg0NTRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCQkJfQkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSB7CQkJXAotCQkJREJHUFJJTlRfRVJSKCgiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKTsJXAogCQkJKihfcFYpID0gKF9wQWQpLT5CYnBXcml0ZUxhdGNoW19iYnBJRF07ICAgICAgICAgICAgICAgXAogCQkJaWYgKChfYlZpYU1DVSkgPT0gVFJVRSkgewkJCVwKIAkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7CQkJCVwKQEAgLTMzNiwxMSArMzM2LDExIEBACiAJCQl9CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJREJHUFJJTlRfRVJSKCIgLCBicnQzMHh4QmFuTWN1Q21kID0gJWQsIFJlYWQgQkJQICVkIFxuIiwgKF9BKS0+YnJ0MzB4eEJhbk1jdUNtZCwgKF9JKSk7CVwKIAkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJXAogCX0JCQkJCQkJCVwKIAlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpIHx8ICgoX0EpLT5iUENJY2xrT2ZmID09IFRSVUUpKSB7IFwKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7IFwKKwkJREJHUFJJTlRfRVJSKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpOyBcCiAJCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCVwKIAl9CQkJCQkJCQlcCiB9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJCWJyZWFrOwkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChfYnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgewkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfYmJwSUQpOwlcCiAJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKSB7CQkJXAogCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CVwKIAkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJXApAQCAtNDU5LDE1ICs0NTksMTUgQEAKIAkJCQlicmVhazsJCQkJCQkJCQkJCQkJCQlcCiAJCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCX0gZWxzZSB7CQkJCQkJXAotCQkJREJHUFJJTlRfRVJSKCgiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKTsJXAogCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpIHsgXAogCQkJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCQkJCVwKIAkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWwuIEJ1c3lDbnQ9ICVkLmJQQ0ljbGtPZmYgPSAlZC4gXG4iLCBfSSwgQmJwQ3NyLndvcmQsIEJ1c3lDbnQsIChfQSktPmJQQ0ljbGtPZmYpOwlcCiAJCX0JCQkJCQkJCQkJCQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIioqKioqKiBCQlBfV3JpdGVfTGF0Y2ggQnVmZmVyIGV4Y2VlZHMgbWF4IGJvdW5kcnkgKioqKioqIFxuIikpOwlcCisJCURCR1BSSU5UX0VSUigiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKTsJXAogCX0JCQkJCQkJCQkJCQkJCQkJCQlcCiB9CiAjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwppbmRleCBjMjkzM2M2Li4zMzQ3MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDkwLmMKQEAgLTI4LDEwICsyOCwxMSBAQAogCXJ0MzA5MC5jCiAKIAlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMDcwCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzA3MAogCiAJUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwlXaG8gICAgICAgICAJCVdoZW4gICAgICAgICAgICBXaGF0CisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC01MSw3ICs1Miw4IEBACiAJaWYgKElTX1JUMzA5MChwQWQpKSB7CiAJCS8qIEluaXQgUkYgY2FsaWJyYXRpb24gKi8KIAkJLyogRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCi0JCXUzMiBSZlJlZyA9IDAsIGRhdGE7CisJCXU4IFJmUmVnOworCQl1MzIgZGF0YTsKIAogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJlJmUmVnKTsKIAkJUmZSZWcgfD0gMHg4MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzB4eC5jCmluZGV4IDQzNjdhMTkuLjM1NGRlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMweHguYwpAQCAtMjgsMTAgKzI4LDExIEBACiAJcnQzMHh4LmMKIAogCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KIAogCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJV2hvICAgICAgICAgCQlXaGVuICAgICAgICAgICAgV2hhdAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAKQEAgLTUzLDcgKzU0LDcgQEAKIAksCiAJe1JGX1IwNiwgMHgwMn0KIAksCi0Je1JGX1IwNywgMHg3MH0KKwl7UkZfUjA3LCAweDYwfQogCSwKIAl7UkZfUjA5LCAweDBGfQogCSwKQEAgLTg5LDcgKzkwLDcgQEAKIAogdTggTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9yZWdfcGFpcikpOwogCi0vKiBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KKy8qIEFudGVubmEgZGl2ZXJzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KIC8qIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sICovCiAvKiBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZSAqLwogLyogVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcyAqLwpAQCAtMjQzLDcgKzI0NCw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4gKi8KKwkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcDsgY2F1c2VzIGRyaXZlciBoYW5nLiAqLwogCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkgewogCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJCQkgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsCkBAIC00NDEsNyArNDQyLDcgQEAKIAogCQkvKiBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMSAqLwogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MzA7CisJCVJGVmFsdWUgfD0gMHgyMDsKIAkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKIAogCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCmluZGV4IDhlZWY4MmQuLmIwNDZjMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC03OTksOCArNzk5LDggQEAKIAkJCS8qIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQSAqLwogCQkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC04MzksOCArODM5LDggQEAKIAkgICAgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpIHsKIAkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0KLQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCi0JCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQlNRU1fQUxMT0NfRkxBRyk7CiAJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CiAJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwpAQCAtOTA4LDggKzkwOCw4IEBACiAJCS8qICovCiAJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkgewogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC0xMjcwLDEzICsxMjcwLDEzIEBACiAKIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCURCR1BSSU5UX0VSUigiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0gZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxKSkgewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwppbmRleCA5M2E1MzQ3Li4yMjA0YzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAJLyogUjY2IHNob3VsZCBub3QgYmUgMCAqLwogCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkgewogCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwotCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpOwogCX0KIAogCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwppbmRleCA0M2Q3M2EwLi43YWY1OWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CiAJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAogCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKIAlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY19wY2kuYwppbmRleCBlMjZiYTQ5Li44NTBmMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkgewogCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIik7CiAJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIAkJCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCiAJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CiAJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJCS8qIEVycm9yIGhhbmRsaW5nICovCiAJCQlpZiAocERtYUJ1Zi0+QWxsb2NWYSA9PSBOVUxMKSB7CiAJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIFJ4UmluZydzIDFzdCBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3VzYi5jCmluZGV4IDcyNzMxY2IuLjY0YTY1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCW9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgKCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSwKIAkJCSAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKIAkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgewotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWdvdG8gb3V0MTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCmluZGV4IGUzN2I2NGIuLjAwNDBmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTI3OTQsNyArMjc5NCw3IEBACiAKIAkvKiBDaGVjayBsZW5ndGggKi8KIAlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIENoZWNrIFdQQSBvciBXUEEyICovCkBAIC0yODAzLDE0ICsyODAzLDEzIEBACiAJCXUxNiB1Y291bnQ7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsCi0JCQkJICAgICAgX19mdW5jX18pKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODM2LDE0ICsyODM1LDEzIEBACiAJCWlzV1BBMiA9IFRSVUU7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKSkgewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBMlxuIiwKLQkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEEyXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODYzLDcgKzI4NjEsNyBAQAogCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqICh1Y291bnQgLSAxKSk7CiAKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19mdW5jX18sIHBFaWQtPkVpZCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVW5rbm93biBJRSAoJWQpXG4iLCBfX2Z1bmNfXywgcEVpZC0+RWlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yODcyLDggKzI4NzAsNyBAQAogCWxlbiAtPSBvZmZzZXQ7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSkgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLAotCQkJICAgICAgX19mdW5jX18pKTsKKwkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBwb2ludGVyIHRvIEFLTSBjb3VudCAqLwpAQCAtMjg4Miw4ICsyODc5LDcgQEAKIAkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCWFjb3VudCA9IGNwdTJsZTE2KHBBa20tPmFjb3VudCk7CiAJaWYgKGFjb3VudCA+IDIpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAotCQkJICAgICAgX19mdW5jX18sIGFjb3VudCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBBS00gaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIGFjb3VudCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBHZXQgdGhlIEFLTSBzdWl0ZSAqLwpAQCAtMjkxMCw3ICsyOTA2LDcgQEAKIAkJCXJldHVybiBwQnVmOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwppbmRleCAwMzQxMmY1Li5mZWQwYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlpZiAoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQogCQkJZWZ1c2VmcmVlbnVtID0gMDsKIAl9Ci0JcHJpbnRrKCJlZnVzZUZyZWVOdW1iZXIgaXMgJWRcbiIsIGVmdXNlZnJlZW51bSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIiwgZWZ1c2VmcmVlbnVtKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtMjc0LDE2ICsyNzQsMjMgQEAKIAlpbnQgaSA9IDA7CiAJaWYgKCFwQWQtPmJVc2VFZnVzZSkKIAkJcmV0dXJuIEZBTFNFOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIDA6ICIpOworCiAJZm9yIChpID0gMDsgaSA8IEVGVVNFX1VTQUdFX01BUF9FTkQgLyAyOyBpKyspIHsKIAkJSW5CdWZbMF0gPSAyICogaTsKIAkJSW5CdWZbMV0gPSAyOwogCQlJbkJ1ZlsyXSA9IDB4MDsKIAogCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlwcmludGsoIlxuQmxvY2sgJXg6IiwgaSAvIDgpOwotCQlwcmludGsoIiUwNHggIiwgSW5CdWZbMl0pOworCQlpZiAoaSAmJiBpICUgNCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrICV4OiIsIGkgLyA4KTsKKwkJfQorCQlwcmludGsoS0VSTl9DT05UICIlMDR4ICIsIEluQnVmWzJdKTsKIAl9CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwogCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKaW5kZXggNzMwMGM2ZS4uZDljM2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lSGFuZGxlcjogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogCkBAIC00Njk4LDggKzQ2OTgsNyBAQAogCiAJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCiAJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwKLQkJCSAgICAgIE1zZ0xlbikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApAQCAtNDc2MiwxMiArNDc2MSwxMiBAQAogCWlmIChSVE1QX1RFU1RfRkxBRwogCSAgICAocEFkLAogCSAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTQ3NzcsNyArNDc3Niw3IEBACiAKIAl7CiAJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIsIHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCURCR1BSSU5UX0VSUigiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLCBwRnJhbWUtPkhkci5GQy5TdWJUeXBlKTsKIAkJCXJldHVybiBGQUxTRTsKIAkJfQogCX0KQEAgLTQ4NjcsNyArNDg2Niw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZTogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKaW5kZXggNTE5MTIxZC4uMjg5NTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9yZi5jCkBAIC0xMzEsOCArMTMxLDcgQEAKIAkJfQogCX0KIAlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkgewotCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWwsIGlbJWRdLCBrWyVkXVxuIiwgcmVnSUQsCi0JCQkgICAgICByZmNzci53b3JkLCBpLCBrKSk7CisJCURCR1BSSU5UX0VSUigiUkYgcmVhZCBSJWQ9MHgleCBmYWlsLCBpWyVkXSwga1slZF1cbiIsIHJlZ0lELCByZmNzci53b3JkLCBpLCBrKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCmluZGV4IDM2MjhlODUuLmQzNTlhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0xNjksMTQgKzE2OSwxNCBAQAogCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKIAkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkgewogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25CdWYsIE1BWF9CRUFDT05fU0laRSk7CiAKIAkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAodm9pZCAqKikgJiBwQWQpOwogCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKQEAgLTc4NSw4ICs3ODUsNyBAQAogCQkgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CiAKIAlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pIHsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIiwKLQkJCSAgICAgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJREJHUFJJTlRfRVJSKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKTsKIAkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CiAKIAkJICAgLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZApAQCAtMjkxMSw3ICsyOTEwLDcgQEAKIAkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CiAJCX0KIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCQlEQkdQUklOVF9FUlIoIlJUTVBTZXRUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKTsKIAl9CiB9CiAKQEAgLTI5NDcsNyArMjk0Niw3IEBACiAJCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0yOTg5LDcgKzI5ODgsNyBAQAogCQlSdG1wVGltZXJRUmVtb3ZlKHBUaW1lci0+cEFkLCBwVGltZXIpOwogI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0zMjUxLDggKzMyNTAsNyBAQAogCS8qIExvYWQgODA1MSBmaXJtd2FyZSAqLwogCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyNjgsOCArMzI2Niw3IEBACiAKIAlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyODQsNyArMzI4MSw3IEBACiAKIAlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMjsKIAl9CiAJLyogSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdCAqLwpAQCAtMzMwOSw4ICszMzA2LDcgQEAKIAkvKiAqLwogCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CiAJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAotCQkJICAgICAgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCWdvdG8gZXJyMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwppbmRleCA4NDRkNGI5Li44MGZhNDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQl9IHdoaWxlIChpKysgPCAxMDApOwogCiAJCWlmIChpID4gMTAwKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQl9CiAKQEAgLTI5Niw3ICsyOTYsNyBAQAogI2lmZGVmIFJUTVBfTUFDX1BDSQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQkJewotCQkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJfQogCQkJcmV0dXJuIEZBTFNFOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYwppbmRleCAyZDVmODQ3Li4xZGZiODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAJCQl9CiAKIAkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7Ci0JCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQkJREJHUFJJTlRfRVJSKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAppbmRleCAwMTQxNGMzLi5jZDFlZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMzIsOCArMzIsOSBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCUpvaG4gQ2hhbmcJCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAJCTIwMDQtMDktMDYgICAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcyBpbiBjb21tZW50cwogCiAqLwogI2lmbmRlZiBfX01MTUVfSF9fCkBAIC00MSw3ICs0Miw3IEBACiAKICNpbmNsdWRlICJydG1wX2RvdDExLmgiCiAKLS8qIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLSAqLworLyogbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwogLyogRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdCAqLwogI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCiAKQEAgLTc3LDcgKzc4LDcgQEAKICNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwCS8qIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxICovCiAKIC8qIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuICovCi0vKiBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZSAqLworLyogU2hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUgKi8KIC8qI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0gKi8KICNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NQkvKiAtNTUgZGIgaXMgY29uc2lkZXJlZCBtaWQtZGlzdGFuY2UgKi8KICNkZWZpbmUgUlNTSV9GT1JfTE9XX1RYX1BPV0VSICAgICAgIC00NQkvKiAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZCAqLwpAQCAtMTIzLDcgKzEyNCw3IEBACiAjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLCBUSUQpICAgICAgKFRJRF9NQUNfSEFTSChBZGRyLCBUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQogCiAvKiBMRUQgQ29udHJvbCAqLwotLyogYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCisvKiBhc3NvY2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCiAvKiBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmICovCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCkBAIC0yODQsOCArMjg1LDggQEAKIAogLyogODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICovCiAvKiA3LjMuMi42MCAqLwotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8qIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4gKi8KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8qIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvKiBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLyogaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMAkvKiBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLiAqLwogI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8qIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLyppbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbiAqLwpAQCAtMzI1LDcgKzMyNiw3IEBACiB9OwogCiAvKiAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlICovCi0vKiBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuICovCisvKiBJZiBvbmUgRXZlbnQgKEEpIGlzIGRlbGV0ZWQgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgKEIpIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4gKi8KICNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0CiBzdHJ1Y3QgcnRfdHJpZ2dlcl9ldmVudF90YWIgewogCXU4IEV2ZW50QU5vOwpAQCAtMzU3LDE0ICszNTgsMTQgQEAKIAl1OCBDaExpc3RbMF07CiB9OwogCi0vKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLwogc3RydWN0IFBBQ0tFRCBydF9jaGFfc3dpdGNoX2Fubm91bmNlX2llIHsKIAl1OCBTd2l0Y2hNb2RlOwkvKmNoYW5uZWwgc3dpdGNoIG1vZGUgKi8KIAl1OCBOZXdDaGFubmVsOwkvKiAqLwogCXU4IFN3aXRjaENvdW50OwkvKiAqLwogfTsKIAotLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLworLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMgKi8KIHN0cnVjdCBQQUNLRUQgcnRfc2VjX2NoYV9vZmZzZXRfaWUgewogCXU4IFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CS8qIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkgKi8KIH07CkBAIC0zNzcsNyArMzc4LDcgQEAKIAl1OCBNQ1NTZXRbMTZdOwogfTsKIAotLypUaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuICovCisvKlRoaXMgc3RydWN0dXJlIHN1YnRyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLiAqLwogLypGZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLiAqLwogc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgewogCXUxNiBDaGFubmVsV2lkdGg6MTsKQEAgLTM4NywxNCArMzg4LDE0IEBACiAJdTE2IFNob3J0R0lmb3I0MDoxOwkvKmZvcjQwTUh6ICovCiAJdTE2IFR4U1RCQzoxOwogCXUxNiBSeFNUQkM6MjsJLyogMiBiaXRzICovCi0JdTE2IEFtc2R1RW5hYmxlOjE7CS8qIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbiAqLworCXUxNiBBbXNkdUVuYWJsZToxOwkvKiBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5lZml0IG9mIDgwMi4xMW4gKi8KIAl1MTYgQW1zZHVTaXplOjE7CS8qIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUgKi8KIAl1MTYgcnN2OjU7CiAKIAkvKlN1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRSAqLwogCXU4IE1heFJBbXBkdUZhY3RvcjoyOwogCXU4IE1wZHVEZW5zaXR5OjM7Ci0JdTggRXh0Q2hhbk9mZnNldDoyOwkvKiBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nICAgICB1OCAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbiAqLworCXU4IEV4dENoYW5PZmZzZXQ6MjsJLyogUGxlYXNlIG5vdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgICAgIHU4ICAgTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuICovCiAJdTggUmVjb21XaWR0aDoxOwogCiAJdTE2IE9wZXJhaW9uTW9kZToyOwpAQCAtNDgxLDcgKzQ4Miw3IEBACiAJdTE2IEFNU0RVU3VwcG9ydGVkOjE7CS8qIDA6IG5vdCBwZXJtaXR0ZWQgICAgICAgICAgICAgMTogcGVybWl0dGVkICovCiAJdTE2IEJBUG9saWN5OjE7CS8qIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQSAqLwogCXUxNiBUSUQ6NDsJCS8qIHZhbHVlIG9mIFRDIG9zIFRTICovCi0JdTE2IEJ1ZlNpemU6MTA7CS8qIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzciAqLworCXUxNiBCdWZTaXplOjEwOwkvKiBudW1iZXIgb2YgYnVmZmVyIG9mIHNpemUgMjMwNCBvY3RldHNyICovCiB9OwogCiAvKiAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQgKi8KQEAgLTU1MSw3ICs1NTIsNyBAQAogCUJBU0VRX0NPTlRST0wgQkFTdGFydGluZ1NlcTsKIH07CiAKLS8qIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBICovCisvKiBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYXRvcnkgaW4gSFQgU1RBICovCiBzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX210YmEgewogCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOwogCXUxNiBEdXJhdGlvbjsKQEAgLTY0Nyw3ICs2NDgsNyBAQAogCXU4IGJpdG1hc2tbOF07CiB9OwogCi0vKiBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0ICovCisvKiBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdCAqLwogc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9ybV9yZXFfYWN0aW9uIHsKIAlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CiAJdTggQ2F0ZWdvcnk7CkBAIC03MDksNyArNzEwLDcgQEAKIAl1OCBDd21pbls0XTsKIAl1OCBDd21heFs0XTsKIAl1MTYgVHhvcFs0XTsJCS8qIGluIHVuaXQgb2YgMzItdXMgKi8KLQlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkgKi8KKwlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdG9yeSAqLwogfTsKIAogLyogUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCkBAIC03NTcsNyArNzU4LDcgQEAKIHN0cnVjdCBydF9ic3NfZW50cnkgewogCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CiAJdTggQ2hhbm5lbDsKLQl1OCBDZW50cmFsQ2hhbm5lbDsJLypTdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLworCXU4IENlbnRyYWxDaGFubmVsOwkvKlN0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gdXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLwogCXU4IEJzc1R5cGU7CiAJdTE2IEF0aW1XaW47CiAJdTE2IEJlYWNvblBlcmlvZDsKQEAgLTg1NSw3ICs4NTYsNyBAQAogCVNUQVRFX01BQ0hJTkVfRlVOQyAqVHJhbnNGdW5jOwogfTsKIAotLyogTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKy8qIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LiAqLwogLyogT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4gKi8KIC8qIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mICovCiAvKiBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseSAqLwpAQCAtOTk2LDcgKzk5Nyw3IEBACiAjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkvKiB1bml0OiBzZWMgKi8KICNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAotLyogQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4gKi8KKy8qIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW51ZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LiAqLwogI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCS8qIHBhY2tldCBjbnQuICovCiAKIC8qIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKaW5kZXggMTcwNGMyNy4uNWEyNWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlOYW1lCQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sgCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIGNvbW1lbnRzCiAqLwogI2lmbmRlZiBfT0lEX0hfCiAjZGVmaW5lIF9PSURfSF8KQEAgLTc4LDcgKzc5LDcgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKICNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2Ci0vKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jICovCisvKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24gKi8KICNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJNTQJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwCS8qIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUgKi8KICNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIJLyogaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEgKi8KQEAgLTg3LDcgKzg4LDcgQEAKICNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CiAKICNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCi0jZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0CiAjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CiAjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgogI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwpAQCAtNjEwLDcgKzYxMSw3IEBACiAKIHN0cnVjdCBydF84MDJfMTFfZXZlbnRfdGFibGUgewogCXVuc2lnbmVkIGxvbmcgTnVtOwotCXVuc2lnbmVkIGxvbmcgUnN2OwkJLyogdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBSc3Y7CQkvKiB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTlRFR0VSIGJvdW5kYXJ5ICovCiAJc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOwogfTsKIApAQCAtNzIxLDkgKzcyMiw5IEBACiAjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJLyogT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CS8qIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CS8qIEFzc29jaWF0aW9uIGZhaWxlZCAqLwotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJLyogRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLwotI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KLSNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkvKiBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CS8qIERlYXV0aGVudGljYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLworI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW50aWNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dCAqLworI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CS8qIERlYXV0aGVudGljYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0ICovCiAjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkvKiBFQVAgc3VjY2VlZCAqLwogI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIJLyogUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbCAqLwogI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkvKiBJbmRpY2F0ZSBMYXN0IE9JRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcGNpX21haW5fZGV2LmMKaW5kZXggMzIxZmFjZC4uMjVmYmIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3BjaV9tYWluX2Rldi5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZSBmb3IgUENJIGJhc2VkIGNoaXBzZXRzIGluIExpbnV4IHBsYXRmb3JtLgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgIAlXaGVuICAgICAgICAgICAgV2hhdAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIHNvbWUgY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDAsOCArNDEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCi0vKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KLS8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KKy8qIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIGEgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBlLW1haWwgbWUuICovCisvKiBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKi8KIE1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NjAvUlQzMDkwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTUwLDkgKzUxLDYgQEAKIC8qICovCiAvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KIC8qICovCi1leHRlcm4gaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci1leHRlcm4gaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQogc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwpAQCAtMjA1LDcgKzIwMyw3IEBACiAKIAkvKiBpbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyICovCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAicnQyODYwOiBwY2kgZW5hYmxlIGZhaWwhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01OTksNyArNTk3LDcgQEAKIAkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAogCQkJICAgICAoIiBBVVhfQ1RSTCA9IDB4JTMyeFxuIiwgTWFjVmFsdWUpKTsKIAotCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGluZnRlcmZhY2UsIGFuZCBmb3IgcG93ZXIgc29sdXRpb24gMyAqLworCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGludGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzICovCiAJCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCiAJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQogCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpIHsKQEAgLTkwMiw3ICs5MDAsNyBAQAogCQkJCSAgQ29uZmlndXJhdGlvbik7CiAJCWlmICgoQ29uZmlndXJhdGlvbiAhPSAwKSAmJiAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKSB7CiAJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCS8qIElmIGNhbGwgZnJvbSBpbnRlcmZhY2UgZG93biwgcmVzdG9yZSB0byBvcmdpbmlhbCBzZXR0aW5nLiAqLworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yaWdpbmFsIHNldHRpbmcuICovCiAJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKIAkJCQlDb25maWd1cmF0aW9uIHw9IHBBZC0+SG9zdExua0N0cmxDb25maWd1cmF0aW9uOwogCQkJZWxzZQpAQCAtOTI0LDcgKzkyMiw3IEBACiAJCQkJICBDb25maWd1cmF0aW9uKTsKIAkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKIAkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQkvKiBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JpZ2luYWwgc2V0dGluZy4gKi8KIAkJCWlmIChMZXZlbCA9PSBSRVNUT1JFX0NMT1NFKQogCQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb247CiAJCQllbHNlCkBAIC0xMTA2LDEyICsxMTA0LDEyIEBACiAJCWlmIChwb3MgIT0gMCkKIAkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKIAotCQkvKiBJZiBjb25maWd1cmFyZWQgdG8gdHVybiBvbiBMMS4gKi8KKwkJLyogSWYgY29uZmlndXJlZCB0byB0dXJuIG9uIEwxLiAqLwogCQlIb3N0Q29uZmlndXJhdGlvbiA9IDA7CiAJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9PSAxKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRlcixQU00gOiBGb3JjZSBBU1BNXG4iKSk7CiAKLQkJCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwkJCS8qIFNraXAgbm9uLWV4aXN0IGRldmljZSByaWdodCBhd2F5ICovCiAJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKIAkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKIAkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwppbmRleCBhYmZlZWExLi43Mjg4NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCi0JcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiMjI0Nsb25lIyMjXG4iKTsKIAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQpAQCAtMzQzLDkgKzM0Myw4IEBACiAJCQkJCSAgIFJUTVBfUEtUX1RBSUxfUEFERElORyk7CiAJaWYgKHBQYWNrZXQgPT0gTlVMTCkgewogCQkqcHBQYWNrZXQgPSBOVUxMOwotI2lmZGVmIERFQlVHCi0JCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKLSNlbmRpZgorCQlwcl9kZXZlbCgiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKKwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAJLyogMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQgKi8KQEAgLTYwMSwxNSArNjAwLDE1IEBACiAJCXJldHVybjsKIAogCXB0ID0gcFNyY0J1ZlZBOwotCXByaW50aygiJXM6ICVwLCBsZW4gPSAlZFxuIiwgc3RyLCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcCwgbGVuID0gJWRcbiIsIHN0ciwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwogCWZvciAoeCA9IDA7IHggPCBTcmNCdWZMZW47IHgrKykgewogCQlpZiAoeCAlIDE2ID09IDApCi0JCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOwotCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDR4IDogIiwgeCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOwogCQlpZiAoeCAlIDE2ID09IDE1KQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIH0KIAogLyoKQEAgLTc2NywxMyArNzY2LDEzIEBACiAJCS8qIFFPUyAqLwogCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkgewogCQkJaGVhZGVyX2xlbiArPSAyOwotCQkJLyogRGF0YSBza2lwIFFPUyBjb250b3JsIGZpZWxkICovCisJCQkvKiBEYXRhIHNraXAgUU9TIGNvbnRyb2wgZmllbGQgKi8KIAkJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKIAkJfQogCQkvKiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysgKi8KIAkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpIHsKIAkJCWhlYWRlcl9sZW4gKz0gNDsKLQkJCS8qIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZCAqLworCQkJLyogRGF0YSBza2lwIEhUQyBjb250cm9sIGZpZWxkICovCiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CiAJCX0KIAkJLyogQ29weSBIZWFkZXIgKi8KQEAgLTg1NCw3ICs4NTMsNyBAQAogCQkJCQkJCQkJIFJTU0kxLAogCQkJCQkJCQkJIFJTU0lfMSksCiAJCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwKLQkJCQkJCSAgUlNTSV8yKSk7OworCQkJCQkJICBSU1NJXzIpKTsKIAogCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CiAJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwpAQCAtOTI2LDcgKzkyNSw3IEBACiAJCSAgICByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCBydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwKIAkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSk7CiAJCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOworCQkJcHJpbnRrKEtFUk5fRVJSICJydDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTEwMjIsNyArMTAyMSw3IEBACiAJfQogI2Vsc2UKIAlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpIHsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIHRhc2soJXMpIHdpdGggcGlkKCVkKSFcbiIsCisJCXByaW50ayhLRVJOX0lORk8gIlRlcm1pbmF0ZSB0aGUgdGFzayglcykgd2l0aCBwaWQoJWQpIVxuIiwKIAkJICAgICAgIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKIAkJbWIoKTsKIAkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKQEAgLTExNzUsNyArMTE3NCw3IEBACiAJbmV0X2RldiA9IHBOZXREZXY7CiAJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCS8qIHdvcmstYXJvdW5kIGZvciB0aGUgU3VTRSBkdWUgdG8gaXQgaGFzIGl0J3Mgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLworCS8qIHdvcmstYXJvdW5kIGZvciBTdVNFLCBkdWUgdG8gdGhlbSBoYXZpbmcgdGhlaXIgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLwogCXsKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKIAkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsCkBAIC0xMzAwLDcgKzEyOTksNyBAQAogCWludCByZXQsIHJ0bmxfbG9ja2VkID0gRkFMU0U7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSdG1wT1NOZXREZXZBdHRhY2goKS0tLT5cbiIpKTsKLQkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3RydWUsIG5vdyBkbyBpdC4gKi8KKwkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUsIG5vdyBkbyBpdC4gKi8KIAlpZiAocERldk9wSG9vaykgewogCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCkBAIC0xMzUxLDEwICsxMzUwLDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIGZpbmQgYSBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCisJLyogZmluZCBhbiBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCiAJc3RhdHVzID0gUnRtcE9TTmV0RGV2UmVxdWVzdE5hbWUocEFkLCBwTmV0RGV2LCBwTmFtZVByZWZpeCwgZGV2TnVtKTsKIAlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJLyogZXJyb3IhIG5vIGFueSBhdmFpbGFibGUgcmEgbmFtZSBjYW4gYmUgdXNlZCEgKi8KKwkJLyogZXJyb3IhIG5vIGF2YWlsYWJsZSByYSBuYW1lIGNhbiBiZSB1c2VkISAqLwogCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKIAkJCSAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLAogCQkJICBwTmFtZVByZWZpeCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCmluZGV4IDVhY2VkZjEuLjkyZmY1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICBBYnN0cmFjdDoKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgICAJV2hlbiAgICAgICAgIAlXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMCAJRml4IHR5cG8gaW4gYSBjb21tZW50CiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDIyLDExICs0MjMsNyBAQAogCiAjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQogCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJFUlJPUiEgIik7ICAgICAgICAgIFwKLSAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgREJHUFJJTlRfRVJSKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCwgIyNhcmdzKQogCiAjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCQlcCiB7CQkJCQkJCQkJXApAQCAtNzI2LDcgKzcyMyw3IEBACiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQogCiAvKiAqLwotLyogICAgICBTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uICovCisvKiAgICAgIFNwZWNpZmljIFBhY2tldCBUeXBlIGRlZmluaXRpb24gKi8KIC8qICovCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKaW5kZXggYWQ2MGNlYS4uNzAxNTYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMzEsNyArMzEsOCBAQAogICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggdHlwb3MgaW4gY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMTAxLDggKzEwMiw4IEBACiAJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKIAkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CiAJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpNc2dFbGVtID0KLQkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAotCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJTUVNX0FMTE9DX0ZMQUcpOwogCiAJCQlpZiAoTXNnRWxlbSkgewogCQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsCkBAIC0yMzQsNyArMjM1LDcgQEAKIAkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOwogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCS8qIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwgKi8KKwkJLyogSWYgZHJpdmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLCAqLwogCQkvKiBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uICovCiAJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CiAJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKQEAgLTMxMCw4ICszMTEsOCBAQAogCQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CiAJCX0KIAkJLyogUmVjZWl2ZSBwYWNrZXRzIHRvIGNsZWFyIERNQSBpbmRleCBhZnRlciBkaXNhYmxlIGludGVycnVwdC4gKi8KLQkJLypSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHBBZCk7ICovCi0JCS8qIHB1dCB0byByYWRpbyBvZmYgdG8gc2F2ZSBwb3dlciB3aGVuIGRyaXZlciB1bmxvYWQuICBBZnRlciByYWRpb29mZiwgY2FuJ3Qgd3JpdGUgL3JlYWQgcmVnaXN0ZXIuICBTbyBuZWVkIHRvIGZpbmlzaCBhbGwgKi8KKwkJLyogUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdChwQWQpOyAqLworCQkvKiBwdXQgcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2Fkcy4gIEFmdGVyIHJhZGlvb2ZmLCBjYW4ndCB3cml0ZS9yZWFkIHJlZ2lzdGVyLCBzbyBuZWVkIHRvIGZpbmlzaCBhbGwuICovCiAJCS8qIHJlZ2lzdGVyIGFjY2VzcyBiZWZvcmUgUmFkaW8gb2ZmLiAqLwogCiAJCWJyYyA9IFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIFJUTVBfSEFMVCwgMCk7CkBAIC00MjAsNyArNDIxLDcgQEAKIAl7CiAJCXUzMiByZWcgPSAwOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7CS8qIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cyAqLwotCQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweDEzMDAgPSAlMDh4XG4iLCByZWcpOwogCX0KIAogCXsKQEAgLTcyNCw3ICs3MjUsOCBAQAogaW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKQogewogCi0JKnBwQWQgPSAodm9pZCAqKXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsJLypwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KKwkqcHBBZCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKKwkvKiBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KIAogCWlmICgqcHBBZCkgewogCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYwppbmRleCAzMDA0YmU2Li5lNWZiNjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAJV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCBhIHR5cG8KICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMzU2LDcgKzM1Nyw3IEBACiAKIAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7CiAKLQkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkgKi8KKwkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCB3aXRob3V0IGFueSAqLwogCS8qIGJ1ZyByZXBvcnQgb3V0cHV0ICovCiAJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwogCS8qCkBAIC03ODcsNyArNzg4LDcgQEAKIH0KIAogLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCisgKiBpbnZhbGlkIG9yIHdyaXRlYmFjayBjYWNoZQogICogYW5kIGNvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKICAqLwogZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnB0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jCmluZGV4IGJjZmMwZjUuLmViMDM3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJTmFtZQkJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcy4KIAogKi8KIApAQCAtNDAsMjUgKzQxLDI1IEBACiAKIHZvaWQgZHVtcF91cmIoc3RydWN0IHVyYiAqcHVyYikKIHsKLQlwcmludGsoInVyYiAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiKTsKLQlwcmludGsoIlx0ZGV2ICAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiLT5kZXYpOwotCXByaW50aygiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOwotCXByaW50aygiXHRwaXBlICAgICAgICAgICAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+cGlwZSk7Ci0JcHJpbnRrKCJcdHN0YXR1cyAgICAgICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXR1cyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2J1ZmZlciAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAidXJiICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmIpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGRldiAgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYi0+ZGV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHBpcGUgICAgICAgICAgICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT5waXBlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzdGF0dXMgICAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGF0dXMpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0dHJhbnNmZXJfYnVmZmVyICAgICAgIDoweCUwOGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCXByaW50aygiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQlwcmludGsoIlx0YWN0dWFsX2xlbmd0aCAgICAgICAgIDolZFxuIiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JcHJpbnRrKCJcdHNldHVwX3BhY2tldCAgICAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRhY3R1YWxfbGVuZ3RoICAgICAgICAgOiVkXG4iLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzZXR1cF9wYWNrZXQgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPnNldHVwX3BhY2tldCk7Ci0JcHJpbnRrKCJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKLQlwcmludGsoIlx0bnVtYmVyX29mX3BhY2tldHMgICAgIDolZFxuIiwgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMpOwotCXByaW50aygiXHRpbnRlcnZhbCAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5pbnRlcnZhbCk7Ci0JcHJpbnRrKCJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKLQlwcmludGsoIlx0Y29udGV4dCAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRudW1iZXJfb2ZfcGFja2V0cyAgICAgOiVkXG4iLCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0aW50ZXJ2YWwgICAgICAgICAgICAgIDolZFxuIiwgcHVyYi0+aW50ZXJ2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb250ZXh0ICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbnRleHQpOwotCXByaW50aygiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+Y29tcGxldGUpOwogfQogCkBAIC0yNzksNyArMjgwLDcgQEAKIAkgICAgJiYgIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwKIAkJCQkgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CiAJCQkJICAgICAgQnVsa091dFBpcGVJZCkpKSB7Ci0JCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlICovCisJCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlICovCiAJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAogCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CiAJCQkJICAgICBCdWxrT3V0UGlwZUlkKSk7CkBAIC0zMzUsNyArMzM2LDcgQEAKIAl9CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIH0KIApAQCAtMzgzLDcgKzM4NCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIAogfQpAQCAtNDI3LDcgKzQyOCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKIAogCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLwotCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJUlRVU0JLaWNrQnVsa091dChwQWQpOwogCiB9CkBAIC01NzUsNyArNTc2LDcgQEAKIAkJfSBlbHNlIHsKIAogCQkJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCi0JCQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkJCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8CiAJCQkgICAgTUdNVF9SSU5HX1NJWkUKIAkJCSAgICAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCmluZGV4IGNhNTRlNTMuLjcwZGFhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC0zMSwxMSArMzEsMTIgQEAKICAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisgICAgUGF1bCBMaW4gICAgCTIwMDItMDgtMDEgICAgCWNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAJMjAwMi0wOS0wNiAgICAJbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAJMjAwNC0wOS0wNiAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKICovCiAjaWZuZGVmIF9fUlRNUF9IX18KICNkZWZpbmUgX19SVE1QX0hfXwpAQCAtMzM3LDcgKzMzOCw3IEBACiAjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKICNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKIAotLyogaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworLyogaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQgKi8KICNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAogewkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApIHsJXApAQCAtNDY2LDcgKzQ2Nyw3IEBACiAvKiBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZSAqLwogLyogY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIGNoYXIgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yICovCiAvKiB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0ICovCi0vKiBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIgKi8KKy8qIGJlZm9yZSBnaXZpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NpYXRlZCBwYWlyICovCiAvKiB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBjaGFyIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IgKi8KIC8qIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuICovCiAvKiAqLwpAQCAtNjAyLDcgKzYwMyw3IEBACiB9OwogCiBzdHJ1Y3QgcnRfY291bnRlcl9kcnMgewotCS8qIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KKwkvKiByZWNvcmQgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KIAl1MTYgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKIAl1OCBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwogCXU4IFR4UmF0ZVVwUGVuYWx0eTsJLyogZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24gKi8KQEAgLTcxOSw3ICs3MjAsNyBAQAogLyogUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQgKi8KIC8qICovCiBzdHJ1Y3QgcnRfcGFja2V0X2luZm8gewotCXUzMiBQaHlzaWNhbEJ1ZmZlckNvdW50OwkvKiBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkICovCisJdTMyIFBoeXNpY2FsQnVmZmVyQ291bnQ7CS8qIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkICovCiAJdTMyIEJ1ZmZlckNvdW50OwkvKiBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZCAqLwogCXUzMiBUb3RhbFBhY2tldExlbmd0aDsJLyogU2VsZiBleHBsYWluZWQgKi8KIAljaGFyICpwRmlyc3RCdWZmZXI7CS8qIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KQEAgLTg0Niw4ICs4NDcsOCBAQAogLyogUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbCAqLwogdHlwZWRlZiB1bmlvbiBfUFNfQ09OVFJPTCB7CiAJc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBFbmFibGVQU2luSWRsZToxOwkvKiBFbmFibGUgcmFkaW8gb2ZmIHdoZW4gbm90IGNvbm5lY3QgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLwotCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdWNudGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCisJCXVuc2lnbmVkIGxvbmcgRW5hYmxlUFNpbklkbGU6MTsJLyogRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0ZWQgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLworCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdW5jdGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4UG93ZXJNb2RlOjI7CS8qIFBvd2VyIExldmVsIE1vZGUgZm9yIHJ0MzB4eCBjaGlwICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4Rm9sbG93SG9zdEFTUE06MTsJLyogQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4gKi8KIAkJdW5zaWduZWQgbG9uZyBydDMweHhGb3JjZUFTUE1UZXN0OjE7CS8qIEZvcmNlIGVuYWJsZSBMMSBmb3IgcnQzMHh4IGNoaXAuIFRoaXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJ0MzB4eEZvbGxvd0hvc3RBU1BNIE1vZGUuICovCkBAIC0xMTE3LDggKzExMTgsOCBAQAogCXVuc2lnbmVkIGxvbmcgVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCXVuc2lnbmVkIGxvbmcgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCUJPT0xFQU4gRW5hYmxlQmVhY29uOwkvKiB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLiAqLwotCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLwotCXU4IER0aW1CaXRPbjsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLworCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHRvIGNoYW5nZS4gKi8KKwl1OCBEdGltQml0T247CS8qIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkcyB0byBjaGFuZ2UuICovCiB9OwogI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCkBAIC0xMjExLDcgKzEyMTIsNyBAQAogCS8qQk9PTEVBTiAgICAgICAgICAgICAgIGJBdXRvVHhSYXRlU3dpdGNoOyAqLwogCXU4IE1pblR4UmF0ZTsJLyogUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExICovCiAJdTggUnRzUmF0ZTsJCS8qIFJBVEVfeHh4ICovCi0JSFRUUkFOU01JVF9TRVRUSU5HIE1sbWVUcmFuc21pdDsJLyogTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4gKi8KKwlIVFRSQU5TTUlUX1NFVFRJTkcgTWxtZVRyYW5zbWl0OwkvKiBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpb24gYXQgSHQgcmF0ZS4gKi8KIAl1OCBNbG1lUmF0ZTsJCS8qIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMgKi8KIAl1OCBCYXNpY01sbWVSYXRlOwkvKiBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMgKi8KIApAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CiAJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEhUSW5mbzsJLyogVXNlZnVsIGFzIEFQLiAqLwogCS8qVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4gKi8KLQkvKlRoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuICovCisJLypUaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLiAqLwogCXN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUgTmV3RXh0Q2hhbk9mZnNldDsJLyo3LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudCAqLwogCiAJQk9PTEVBTiBiSFRQcm90ZWN0OwpAQCAtMTMyOSw3ICsxMzMwLDcgQEAKIAkvKiBHUk9VUCAxIC0gKi8KIAkvKiAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlICovCiAJLyogICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwgKi8KLQkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KKwkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWlzZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KIAkvKiAgIEFQIG9yIElCU1MgaG9sZGVyKS4gKi8KIAkvKiAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4ICovCiAJdTggQnNzVHlwZTsJCS8qIEJTU19JTkZSQSBvciBCU1NfQURIT0MgKi8KQEAgLTEzODYsMTIgKzEzODcsMTIgQEAKIAogCS8qIEZvciBXUEEgY291bnRlcm1lYXN1cmVzICovCiAJdW5zaWduZWQgbG9uZyBMYXN0TWljRXJyb3JUaW1lOwkvKiByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLiAqLworCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvY2lhdGlvbikuICovCiAJQk9PTEVBTiBiQmxvY2tBc3NvYzsJLyogQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLiAqLwogCS8qIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUgKi8KIAlXUEFfU1RBVEUgV3BhU3RhdGU7CS8qIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXggKi8KIAl1OCBSZXBsYXlDb3VudGVyWzhdOwotCXU4IEFOb25jZVszMl07CS8qIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IgKi8KKwl1OCBBTm9uY2VbMzJdOwkvKiBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdWhlbnRpY2F0b3IgKi8KIAl1OCBTTm9uY2VbMzJdOwkvKiBTTm9uY2UgZm9yIFdQQS1QU0sgKi8KIAogCXU4IExhc3RTTlIwOwkJLyogbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgKi8KQEAgLTE0MjMsNyArMTQyNCw3IEBACiAJdTggUlNOSUVfTGVuOwogCXU4IFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLyogVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCiAKLQl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJpbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZSAqLwogCXUxNiBSUElEZW5zaXR5WzhdOwkvKiBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbiAqLwogCiAJdTggUk1SZXFDbnQ7CQkvKiBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4gKi8KQEAgLTE0ODksOSArMTQ5MCw5IEBACiAJQk9PTEVBTiBiRm9yY2VUeEJ1cnN0OwkvKiAxOiBmb3JjZSBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgKi8KIH07CiAKLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEgKi8KKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcHMgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBICovCiAvKiBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkICovCi0vKiBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZSAqLworLyogYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZSAqLwogLyogaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4gKi8KIC8qIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0byAqLwogLyogdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLiAqLwpAQCAtMTUxOSw3ICsxNTIwLDcgQEAKIAkvKkNob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuICovCiAJQk9PTEVBTiBWYWxpZEFzQ0xJOwkvKiBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLiAqLwogCUJPT0xFQU4gVmFsaWRBc1dEUzsJLyogVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuICovCi0JQk9PTEVBTiBWYWxpZEFzQXBDbGk7CS8qVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KKwlCT09MRUFOIFZhbGlkQXNBcENsaTsJLyogVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KIAlCT09MRUFOIFZhbGlkQXNNZXNoOwogCUJPT0xFQU4gVmFsaWRBc0RsczsJLyogVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLiAqLwogCUJPT0xFQU4gaXNDYWNoZWQ7CkBAIC0xNTI3LDcgKzE1MjgsNyBAQAogCiAJdTggRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7CS8qIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNICovCiAJLypqYW4gZm9yIHdwYSAqLwotCS8qIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCICovCisJLyogcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQiAqLwogCXU4IENNVGltZXJSdW5uaW5nOwogCXU4IGFwaWR4OwkJLyogTUJTUyBudW1iZXIgKi8KIAl1OCBSU05JRV9MZW47CkBAIC0xNzIyLDcgKzE3MjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgUnQzeHhSYWxpbmtMaW5rQ3RybDsJLyogVVNlZCBmb3IgMzA5MEYgY2hpcCAqLwogCXUxNiBEZXZpY2VJRDsJLyogUmVhZCBmcm9tIFBDSSBjb25maWcgKi8KIAl1bnNpZ25lZCBsb25nIEFjY2Vzc0JCUEZhaWxDb3VudDsKLQlCT09MRUFOIGJQQ0ljbGtPZmY7CS8qIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uICovCisJQk9PTEVBTiBiUENJY2xrT2ZmOwkvKiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNwYWNlLi4gKi8KIAlCT09MRUFOIGJQQ0ljbGtPZmZEaXNhYmxlVHg7CS8qICovCiAKIAlCT09MRUFOIGJydDMweHhCYW5NY3VDbWQ7CS8qd2hlbiA9IDB4ZmYgbWVhbnMgYWxsIGNvbW1hbmRzIGFyZSBvayB0byBzZXQgLiAqLwpAQCAtMTg3MSw5ICsxODcyLDkgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJdTggUmZJY1R5cGU7CQkvKiBSRklDX3h4eCAqLwogCXVuc2lnbmVkIGxvbmcgUmZGcmVxT2Zmc2V0OwkvKiBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZyAqLwotCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRCAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoZSBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQgKi8KIAotCUVFUFJPTV9BTlRFTk5BX1NUUlVDIEFudGVubmE7CS8qIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICovCisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsJLyogU2luY2UgQW50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gKi8KIAlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAogCS8qIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQgKi8KQEAgLTE5OTAsNyArMTk5MSw3IEBACiAJc3RydWN0IHJ0X2NvbW1vbl9jb25maWcgQ29tbW9uQ2ZnOwogCXN0cnVjdCBydF9tbG1lIE1sbWU7CiAKLQkvKiBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4gKi8KKwkvKiBBUCBuZWVkcyB0aG9zZSB2YXJpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuICovCiAJc3RydWN0IHJ0X21sbWVfYXV4IE1sbWVBdXg7CS8qIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUgKi8KIAlzdHJ1Y3QgcnRfYnNzX3RhYmxlIFNjYW5UYWI7CS8qIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgKi8KIApAQCAtMjAxMiw3ICsyMDEzLDcgQEAKIAkvKiB2YXJpb3VzIENvdW50ZXJzICovCiAJc3RydWN0IHJ0X2NvdW50ZXJfODAyXzMgQ291bnRlcnM4MDIzOwkvKiA4MDIuMyBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyXzgwMl8xMSBXbGFuQ291bnRlcnM7CS8qIDgwMi4xMSBNSUIgY291bnRlcnMgKi8KLQlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldGFyeSBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyX2RycyBEcnNDb3VudGVyczsJLyogY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcgKi8KIAlzdHJ1Y3QgcnRfcHJpdmF0ZSBQcml2YXRlSW5mbzsJLyogUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzICovCiAKQEAgLTIwMjQsNyArMjAyNSw3IEBACiAJdTE2IFNlcXVlbmNlOwogCiAJLyogQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uICovCi0JLyorKytEaWRuJ3QgdXNlZCBhbnltb3JlICovCisJLyorKytOb3QgdXNlZCBhbnltb3JlICovCiAJdW5zaWduZWQgbG9uZyBMaW5rRG93blRpbWU7CiAJLyotLS0gKi8KIAl1bnNpZ25lZCBsb25nIExhc3RSeFJhdGU7CkBAIC0yMDM2LDcgKzIwMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgRXh0cmFJbmZvOwkvKiBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMgKi8KIAl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IgKi8KIAotCS8qKysrRGlkbid0IHVzZWQgYW55bW9yZSAqLworCS8qKysrTm90IHVzZWQgYW55bW9yZSAqLwogCXVuc2lnbmVkIGxvbmcgTWFjSWNWZXJzaW9uOwkvKiBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5EICovCiAJLyotLS0gKi8KIApAQCAtMjA4OSw3ICsyMDkwLDcgQEAKIAl1bnNpZ25lZCBsb25nIEJ1bGtPdXRSZXE7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGU7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVPdGhlcjsKLQl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLyogc2VlbXMgbm90IHVzZSBub3c/ICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8qIHNlZW1zIG5vdCB1c2VkIG5vdz8gKi8KIAl1bnNpZ25lZCBsb25nIEJ1bGtJblJlcTsKIAl1bnNpZ25lZCBsb25nIEJ1bGtJbkNvbXBsZXRlOwogCXVuc2lnbmVkIGxvbmcgQnVsa0luQ29tcGxldGVGYWlsOwpAQCAtMjE5Niw5ICsyMTk3LDkgQEAKIHN0cnVjdCBydF90eF9ibGsgewogCXU4IFF1ZUlkeDsKIAl1OCBUeEZyYW1lVHlwZTsJLyogSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaCAqLwotCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLworCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB0aGF0IHdhbnRzIHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLwogCXUxNiBUb3RhbEZyYWdOdW07CS8qIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2ggKi8KLQl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KKwl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgdGhhdCB3YW50cyB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KIAogCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgVHhQYWNrZXRMaXN0OwogCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsJLyogTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcyAqLwpAQCAtMjIwNyw3ICsyMjA4LDcgQEAKIAkvKiBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuICovCiAJdm9pZCAqcFBhY2tldDsKIAl1OCAqcFNyY0J1ZkhlYWRlcjsJLyogUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEgKi8KLQl1OCAqcFNyY0J1ZkRhdGE7CS8qIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzICovCisJdTggKnBTcmNCdWZEYXRhOwkvKiBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgaGFuZGxpbmcgcHJvZ3Jlc3NzICovCiAJdTMyIFNyY0J1ZkxlbjsJCS8qIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyICovCiAJdTggKnBFeHRyYUxsY1NuYXBFbmNhcDsJLyogTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZCAqLwogCXU4IEhlYWRlckJ1ZlsxMjhdOwkvKiBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQICovCkBAIC0yMjE5LDcgKzIyMjAsNyBAQAogCXU4IGFwaWR4OwkJLyogVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0ICovCiAJdTggV2NpZDsJCS8qIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldCAqLwogCXU4IFVzZXJQcmlvcml0eTsJLyogcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0ICovCi0JdTggRnJhbWVHYXA7CQkvKiB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZSAqLworCXU4IEZyYW1lR2FwOwkJLyogd2hhdCBraW5kIG9mIElGUyBkb2VzIHRoaXMgcGFja2V0IHVzZSAqLwogCXU4IE1wZHVSZXFOdW07CS8qIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZSAqLwogCXU4IFR4UmF0ZTsJCS8qIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/ICovCiAJdTggQ2lwaGVyQWxnOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCkBAIC0yOTc4LDcgKzI5NzksNyBAQAogCiB2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi12b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTs7Cit2b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAogdm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAogCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKaW5kZXggOWM1NGJhYy4uNmFjNjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApAQCAtMzEsMTAgKzMxLDExIEBACiAgICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgIAkgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKKyAgICBQYXVsIExpbiAgICAJMDgtMDEtMjAwMiAgICAJY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIAkwOC0wNS0yMDAzICAgIAlhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcwogKi8KICNpZm5kZWYgX19SVE1QX0RFRl9IX18KICNkZWZpbmUgX19SVE1QX0RFRl9IX18KQEAgLTExMSwxMSArMTEyLDExIEBACiAJV01NIE5vdGU6IElmIG1lbW9yeSBvZiB5b3VyIHN5c3RlbSBpcyBub3QgbXVjaCwgcGxlYXNlIHJlZHVjZSB0aGUgZGVmaW5pdGlvbjsKIAlvciB3aGVuIHlvdSBkbyBXTU0gdGVzdCwgdGhlIHF1ZXVlIGZvciBsb3cgcHJpb3JpdHkgQUMgd2lsbCBiZSBmdWxsLCBpLmUuCiAJVFhfUklOR19TSVpFICsgTUFYX1BBQ0tFVFNfSU5fUVVFVUUgcGFja2V0cyBmb3IgdGhlIEFDIHdpbGwgYmUgYnVmZmVyZWQgaW4KLQlXTEFOLCBtYXliZSBubyBhbnkgcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlci4KKwlXTEFOLCBtYXliZSBubyBwYWNrZXQgYnVmZmVycyBjYW4gZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlci4KIAotCVNvbWV0aW1lcyBubyBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLCB0aGUgc3lzdGVtIHdpbGwKKwlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCiAJc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCi0JU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KKwlTbyBubyBXTU0gY2FuIGJlIHNlZW4gaW4gdGhlIGFpci4KICovCiAKIC8qCkBAIC0xMjUsNyArMTI2LDcgQEAKIAlBbmQgaW4gcnRfbWFpbl9lbmQuYywgY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiAzOyBpcyBjaGFuZ2VkIHRvCiAJY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiA0OwogKi8KLS8qIFRPRE86IEZvciBWeFdvcmtzIHRoZSBzaXplIGlzIDI1Ni4gU2hhbGwgd2UgY2FobmdlIHRoZSB2YWx1ZSBhcyAyNTYgZm9yIGFsbCBPUz8/Pz8/ICovCisvKiBUT0RPOiBGb3IgVnhXb3JrcyB0aGUgc2l6ZSBpcyAyNTYuIFNoYWxsIHdlIGNoYW5nZSB0aGUgdmFsdWUgYXMgMjU2IGZvciBhbGwgT1M/ICovCiAjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpCS8qKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLICovCiAKICNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCkBAIC0xNzEsNyArMTcyLDcgQEAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAogI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCiAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvKkRldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LiAqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8qRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguICovCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAogCkBAIC0yMDUsOCArMjA2LDggQEAKICNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgogLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4gKi8KICNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8qIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZSAqLwotLyouIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLworLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBnbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggZG9lc24ndCBpbmRpY2F0ZSB1bmljYXRlIG5vciBtdWx0aWNhc3QgcGFja2V0cyBmb3IgbWUgKi8KKy8qIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLwogI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvKiBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUgKi8KIApAQCAtMzAzLDcgKzMwNCw3IEBACiAKIC8qIFdEUyBkZWZpbml0aW9uICovCiAjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MAkvKiBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAJLyogV0RTIGxpbmtzIHVzZSBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLwogCiAjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCiAjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCkBAIC01NTksNyArNTYwLDcgQEAKICNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzCS8qIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KIAogLyogRm9yIDgwMi4xMW4gRDMuMDMgKi8KLS8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQgKi8KKy8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8qIDgwMi4xMW4gRDMuMDMgICAgICAgIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1dBUEkJCQkJCQkJNjgJLyogV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MgkvKiA4MDIuMTFuIEQzLjAuMyAqLwpAQCAtNjc4LDcgKzY3OSw3IEBACiAKICNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAogCi0vKlRob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4gKi8KKy8qVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvIG5vdCBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLiAqLwogLypDYXRlZ29yeSAqLwogI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCkBAIC03NDgsNyArNzQ5LDcgQEAKIAogI2RlZmluZSBBQ1RfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FDVF9TVEFURSAqIE1BWF9BQ1RfTVNHKQogLyogKi8KLS8qIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KIC8qICovCiAjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKQEAgLTk0OCw3ICs5NDksNyBAQAogI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MAkvKiBiNjo1ID0gMTEgKi8KIAogLyogKi8KLS8qIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uICovCisvKiBydG1wX2RhdGEuYyB1c2VzIHRoaXMgZGVmaW5pdGlvbiAqLwogLyogKi8KICNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0CiAjZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMApAQCAtMTI4OCw3ICsxMjg5LDcgQEAKICNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAogI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQogI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgotLyogaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKICNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQgKi8KQEAgLTEzMDUsNyArMTMwNiw3IEBACiAjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKICNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKICNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8qIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQogLyogRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZCAqLwpAQCAtMTMxOSw3ICsxMzIwLDcgQEAKICNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKICNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQogI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgotLyogaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgKi8KKy8qIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGRhdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90aW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKaW5kZXggMjhiOGFjNi4uMTViNjI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTI4LDEzICsyOCwxNCBAQAogCXJ0bXBfdGltZXIuaAogCiAgICAgQWJzdHJhY3Q6Ci0JUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVsY2FyYXRpb25zCisJUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVjbGFyYXRpb25zIAogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICAgIFdoZW4gICAgICAgICAgICAgICAgV2hhdAorCVdobyAgICAgICAgICAJCVdoZW4gICAgICAgICAgICAgICAgIFdoYXQKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLQlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCisJTmFtZSAgICAgICAgICAJCURhdGUgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisJU2hpYW5nIFR1ICAgIAkJQXVnLTI4LTIwMDggCSAgICAgaW5pdCB2ZXJzaW9uCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkgICAgIEZpeCBhIHR5cG8KIAogKi8KIApAQCAtNTEsOCArNTIsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBUaW1lciBSZWxhdGVkIE1BUkNPIC0tLS0tLS0tLS0tLS0tLSovCiAvKiBJbiBzb21lIG9zIG9yIGNoaXBzZXQsIHdlIGhhdmUgYSBsb3Qgb2YgdGltZXIgZnVuY3Rpb25zIGFuZCB3aWxsIHJlYWQvd3JpdGUgcmVnaXN0ZXIsICovCi0vKiAgIGl0J3Mgbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gKi8KLS8qICBzdWJtaXQgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LiAqLworLyogaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiAqLworLyogc3VibWl0IHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4gKi8KIAogI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCiB0eXBlZGVmIHZvaWQoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpICh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKaW5kZXggNjQ4ZmQ2My4uNGMzMjViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMzcsNyArMzcsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTYwLDcgKzYwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTgwLDcgKzgwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtOTQsNyArOTQsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTExMCw3ICsxMTAsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtMTI2LDcgKzEyNiw3IEBACiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246Ci0JCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQsCiAJCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KIAogCVBhcmFtZXRyczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCmluZGV4IGI3ZWZiMGIuLjU5ZTkzMWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKQEAgLTMyLDcgKzMyLDggQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisJSm9obgkJCTIwMDQtOS0zCQlwb3J0aW5nIGZyb20gUlQyNTAwCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkJRml4IHR5cG9zCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCkBAIC0yNzcsMTAgKzI3OCwxMCBAQAogCXUxNiBWYXJJZXNPZmZzZXQ7CiAJdTE2IFN0YXR1czsKIAotCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kICovCiAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCQkJICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLApAQCAtNjA1LDEwICs2MDYsMTAgQEAKIAl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CiAJdTE2IFN0YXR1czsKIAotCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kICovCiAJaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpIHsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCQkgKCJBU1NPQyAtIEJsb2NrIFJlQXNzb2MgcmVxdWVzdCBkdXJpbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwogCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLApAQCAtMTAwMSw3ICsxMDAyLDcgQEAKIAlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPQogCSAgICBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CiAKLQkvKiBTb21lIEhUIEFQIG1pZ2h0IGxvc3QgV01NIElFLiBXZSBhZGQgV01NIG91cnNlbHZlcy4gYmVhY3Vhc2UgSFQgcmVxdWlyZXMgUW9TIG9uLiAqLworCS8qIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWNhdXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4gKi8KIAlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpIHsKIAkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOwogCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKQEAgLTEwNTQsNyArMTA1NSw3IEBACiAJLyogU2V0IE5ldyBXUEEgaW5mb3JtYXRpb24gKi8KIAlJZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWRkcjIsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKLQkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJBU1NPQyAtIENhbid0IGZpbmQgQlNTIGFmdGVyIHJlY2VpdmluZyBBc3NvYyByZXNwb25zZVxuIik7CiAJfSBlbHNlIHsKIAkJLyogSW5pdCB2YXJpYWJsZSAqLwogCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKaW5kZXggNDA0YmQyMi4uMjNlYTAwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKb2huCQkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTQ1NSwxMCArNDU2LDEwIEBACiAJdTggKnBPdXRCdWZmZXIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwLCB0bXAgPSAwOwogCi0JLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kICovCisJLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVyaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KIAlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCisJCQkgKCIlcyAtIEJsb2NrIEF1dGggcmVxdWVzdCBkdXJpbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIsCiAJCQkgIHBTTU5hbWUpKTsKIAkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CkBAIC01MDgsOCArNTA5LDcgQEAKIAkJUlRNUFNldFRpbWVyKHBBdXRoVGltZXIsIFRpbWVvdXQpOwogCQlyZXR1cm4gVFJVRTsKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwKLQkJCSAgICAgIHBTTU5hbWUpKTsKKwkJREJHUFJJTlRfRVJSKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZFxuIiwgcFNNTmFtZSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYwppbmRleCBjMzgwNTUxLi40OTk2MjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkJMjAwNC0wOC0wOAkJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAorCUpvaG4JCQkyMDA0LTA4LTA4CQlNYWpvciBtb2RpZmljYXRpb24gZnJvbSBSVDI1NjAKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTY0LDcgKzY1LDcgQEAKIAogLyogVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc3NmdWxseSBKT0lOIGFuIElCU1MsICovCiAvKiBvciAzLiBzdWNjZXNzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTICovCi0vKiBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MgKi8KKy8qIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZpcmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncyAqLwogLyogYW5kIGFyZSBjb3BpZWQgdG8gcEFkLT5TdGFBY3RpdmUgKi8KICNkZWZpbmUgQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjE0LDggKzIxNSw3IEBACiAJCWJyZWFrOwogI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCWRlZmF1bHQ6Ci0JCURCR1BSSU5UX0VSUigoIkVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLAotCQkJICAgICAgRWxlbS0+TXNnVHlwZSkpOworCQlEQkdQUklOVF9FUlIoIkVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLAogCQkgICAgICAgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCi0JLyogQWRkIFNTSUQgaW50byBNbG1lQXV4IGZvciBzaXRlIHN1cmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQgKi8KKwkvKiBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VydmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQgKi8KIAlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CiAJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsCiAJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CkBAIC02NjYsNyArNjY2LDcgQEAKIH0KIAogLyogUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lICovCi0vKiBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMgKi8KKy8qIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9wZXJhdGlvbnMgKi8KIC8qIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZSAqLwogLyogdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4gKi8KIC8qIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPyAqLwpAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAkvKiBDaGFuZ2UgdG8gQVAgY2hhbm5lbCAqLwogCWlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQogCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgewotCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkvKiBNdXN0IHVzZSA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTI1OSw3ICsxMjU5LDcgQEAKIAl9IGVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCiAJCSAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0KIAkJICAgICAgIEJXXzQwKSkgewotCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLworCQkvKiBNdXN0IHVzZSA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwpAQCAtMTM0MywxMiArMTM0MywxMiBAQAogCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOwogCUFzaWNTZXRFZGNhUGFybShwQWQsICZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtKTsKIAotCS8qIENhbGwgdGhpcyBmb3IgUlRTIHByb3RlY3Rpb25mb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0ICovCisJLyogQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbiBmb3IgbGVnYWN5IHJhdGUsIHdlIHdpbGwgYWx3YXlzIGVuYWJsZSBSVFMgdGhyZXNob2xkLCBidXQgbm9ybWFsbHkgaXQgd2lsbCBub3QgaGl0ICovCiAJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoT0ZETVNFVFBST1RFQ1QgfCBDQ0tTRVRQUk9URUNUKSwgVFJVRSwKIAkJCSAgRkFMU0UpOwogCiAJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkgewotCQkvKiBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLiAqLworCQkvKiBVcGRhdGUgSFQgcHJvdGVjdGlvbiBmb3IgYmFzZWQgb24gQVAncyBvcGVyYXRpbmcgbW9kZS4gKi8KIAkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkgewogCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAogCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KQEAgLTE1MzAsNyArMTUzMCw3IEBACiAJCS8qIEFkZCBCU1NJRCB0byBXQ0lEIHNlYXJjaCB0YWJsZSAqLwogCQlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBCU1NJRF9XQ0lELCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKLQkJLyogSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleSAqLworCQkvKiBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaXJ3aXNlIGFuZCBzaGFyZWQga2V5ICovCiAJCWlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgJiYKIAkJICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgogCQkgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpIHx8CkBAIC0xNjgxLDkgKzE2ODEsOSBAQAogCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7CiAJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOwkvKiBSZXNldCBjb25maWcgZmxhZyAqLwotCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cCAqLworCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gYWZ0ZXIgbGluayBpcyB1cCAqLwogCi0JLyogU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sgKi8KKwkvKiBTZXQgYmFzaWMgYXV0byBmYWxsIGJhY2sgKi8KIAl7CiAJCXU4ICpwVGFibGU7CiAJCXU4IFRhYmxlU2l6ZSA9IDA7CkBAIC0xODU0LDggKzE4NTQsOCBAQAogCU5vdGU6CiAJCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KIAkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgotCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCi0JCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KKwkJT3RoZXJ3aXNlIG9uIDQtd2F5IGhhbmRzaGFraW5nIHdpbGwgZmFpbCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGdldAorCQlyZW1vdmVkIHdoaWxlIGF1dG8gcmVjb25uZWN0LgogCQlEaXNjb25uZWN0IHJlcXVlc3QgZnJvbSBBUCwgaXQgbWVhbnMgd2Ugd2lsbCBzdGFydCBhZnJlc2ggNC13YXkgaGFuZHNoYWtpbmcKIAkJb24gV1BBIG1vZGUuCiAKQEAgLTE4NzAsOSArMTg3MCw5IEBACiAJCXJldHVybjsKIAogCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkvKkNvbW1lbnQgdGhlIGNvZGVzLCBiZWFzdWUgdGhlIGxpbmUgMjI5MSBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uLiAqLwotCS8qUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICAgICAgICAgICAgICAgJkNhbmNlbGxlZCk7ICovCi0JLyogTm90IGFsbG93IGdvIHRvIHNsZWVwIHdpdGhpbiBsaW5rZG93biBmdW5jdGlvbi4gKi8KKwkvKiBDb21tZW50IHRoZSBjb2RlcywgYmVjYXVzZSB0aGUgbGluZSAyMjkxIGNhbGwgdGhlIHNhbWUgZnVuY3Rpb24uICovCisJLyogUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOyAqLworCS8qIE5vdCBhbGxvd2VkIGdvIHRvIHNsZWVwIHdpdGhpbiB0aGUgbGlua2Rvd24gZnVuY3Rpb24uICovCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CkBAIC0xOTcwLDcgKzE5NzAsNyBAQAogCS8qIFNldCBMRUQgKi8KIAlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7CiAJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RjA7Ci0JUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LiAqLworCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBoYXMgbm90IGRvbmUgaXQuICovCiAKIAlBc2ljRGlzYWJsZVN5bmMocEFkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvcnRtcF9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwppbmRleCAyMzg3OWI3Li5lODJjNmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYwpAQCAtMzEsNyArMzEsOCBAQAogCURhdGEgcGF0aCBzdWJyb3V0aW5lcwogCiAJUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gCQlXaGVuCQkJV2hhdAorCVdobyAJICAJCVdoZW4JCVdoYXQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCB0eXBvcwogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCkBAIC0yNTcsOCArMjU4LDggQEAKIAkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpIHsKIAkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQl9IGVsc2UgewotCQkJLyogRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUgKi8KLQkJCS8qICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllciAqLworCQkJLyogRGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgRUFQIGZyYW1lICovCisJCQkvKiB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllciAqLwogCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywKIAkJCQkJCUZyb21XaGljaEJTU0lEKTsKIAkJfQpAQCAtNjQ0LDcgKzY0NSw3IEBACiAKIAkJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCiAJCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJCURCR1BSSU5UX0VSUigoIlNUQUhhbmRsZVJ4TWdtdEZyYW1lOiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlZCBcbiIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC04NTMsNyArODU0LDcgQEAKIAlOT05FCiAKIE5vdGU6Ci0JVGhpcyBmdW5jdGlvbiBkbyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KKwlUaGlzIGZ1bmN0aW9uIGRvZXMgZWFybHkgY2hlY2tpbmcgYW5kIGNsYXNzaWZpY2F0aW9uIGZvciBzZW5kLW91dCBwYWNrZXQuCiAJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtOTQzLDcgKzk0NCw3IEBACiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJICgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgIVNyY0J1Zkxlbj0leFxuIiwKIAkJCSAgU3JjQnVmTGVuKSk7Ci0JCS8qIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLworCQkvKiBSZXNvdXJjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLwogCQkvKiByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllciAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwpAQCAtOTc5LDcgKzk4MCw3IEBACiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJXBNKSBpbiBNYWNUYWIhXG4iLAogCQkJCXBTcmNCdWZWQSkpOwotCQkvKiBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KKwkJLyogUmVzb3VyY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MgKi8KIAkJLyogcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKQEAgLTEwNTcsOSArMTA1OCw5IEBACiAKIAkvKiBTVEVQIDIuIENoZWNrIHRoZSByZXF1aXJlbWVudCBvZiBSVFM6ICovCiAJLyogICAgICAgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudCAqLwotCS8qICAgICAgICAgaWYgdGhlIGZyYWdtZW50IHNpemUgbGFyZ2UgdGhhbiBSVFMgdGhyZXNob2xkICovCisJLyogICAgICAgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBSVFMgdGhyZXNob2xkICovCiAJLyogICAgIEZvciBSVDI4eHgsIExldCBBU0lDIHNlbmQgUlRTL0NUUyAqLwotLyogICAgICBSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOyAqLworCS8qICAgICAgUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCAwKTsgKi8KIAlpZiAoTnVtYmVyT2ZGcmFnID4gMSkKIAkJUlRTUmVxdWlyZWQgPQogCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID4KQEAgLTExNzEsOCArMTE3Miw4IEBACiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCi0JCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisJCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAorCQlvdXQgYXZhaWxhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgogCiAJQXJndW1lbnRzOgogCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgpAQCAtMTU4OCw3ICsxNTg5LDcgQEAKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0JLyogcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdtZW50LiAqLworCS8qIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlci4gTExDIGhlYWRlciBzaG91bGQgYXQgNC1ieXRlcyBhbGlnbm1lbnQuICovCiAJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOwogCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKIAlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwpAQCAtMjAxNCw3ICsyMDE1LDcgQEAKIAkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAl9Ci0JLyogVGhlIHJlbWFpbmluZyBjb250ZW50IG9mIE1QRFUgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQgKi8KKwkvKiBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbm1lbnQgKi8KIAlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CiAJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwogCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CkBAIC0yMTE0LDcgKzIxMTUsNyBAQAogCQkJICAgIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CiAKIAkJCS8qIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICovCi0JCQkvKiAgICAgIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4gKi8KKwkJCS8qIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4gKi8KIAkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsCiAJCQkJCSAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CiAJCQkJCQkJICBIZWFkZXJCdWYKQEAgLTIyOTEsOCArMjI5Miw4IEBACiAJCQkJICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIHBUeEJsay0+cEtleSwKIAkJCQkgICAgICAwKTsKIAotCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ICovCi0JCS8qICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLiAqLworCQkvKiBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2F1c2UgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0ZWQgKi8KKwkJLyogICAgICAgICAgICAgICAgICAgICAgdG8gY29ycmVjdCBsZW5ndGgsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuICovCiAJCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwKIAkJCSAgICAgICAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOwogCQkvKnNrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsgKi8KQEAgLTIzMDEsNyArMjMwMiw3IEBACiAJCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOwogCX0KIAkvKiAqLwotCS8qIGNhbGN1YXRlIHRoZSBvdmVyaGVhZCBieXRlcyB0aGF0IGVuY3J5cHRpb24gYWxnb3JpdGhtIG1heSBhZGQuIFRoaXMgKi8KKwkvKiBjYWxjdWxhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcyAqLwogCS8qIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkICovCiAJLyogKi8KIAlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKaW5kZXggOGY5ZmQxOS4uMGMzMjYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMKQEAgLTMyLDcgKzMyLDggQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKwlKb2huIENoYW5nICAJCTIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCB0eXBvcwogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIApAQCAtMTE4LDcgKzExOSw3IEBACiAJTmRpc01vdmVNZW1vcnkocEFpZCwgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOwogCUxlbmd0aCArPSAyOwogCi0JLyogQWlkIGFscmVhZHkgc3dhcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KKwkvKiBBaWQgYWxyZWFkeSBzd2FwcGVkIGJ5dGUgb3JkZXIgaW4gUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKCkgZm9yIGJpZyBlbmRpYW4gcGxhdGZvcm0gKi8KIAkqcEFpZCA9ICgqcEFpZCkgJiAweDNmZmY7CS8qIEFJRCBpcyBsb3cgMTQtYml0ICovCiAKIAkvKiAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCmluZGV4IDc0N2QzYzYuLjcwNTRiYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKQEAgLTMyLDggKzMyLDkgQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcJMjAwNC0wOS0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQotCUphbiBMZWUJCTIwMDYtMDgtMDEgICAgICBtb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisJSm9obiBDaGFuZwkJMjAwNC0wOS0wMSAgICAgIAltb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKKwlKYW4gTGVlCQkJMjAwNi0wOC0wMSAgICAgIAltb2RpZmllZCBmb3IgcnQyODYwIGZvciA4MDIuMTFuCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkJRml4IHR5cG9zCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCkBAIC0yMzMsOSArMjM0LDkgQEAKIAkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAKIAkJLyogKi8KLQkJLyogVG8gcHJldmVudCBkYXRhIGxvc3QuICovCi0JCS8qIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLiAqLwotCQkvKiBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZSAqLworCQkvKiBUbyBwcmV2ZW50IGRhdGEgbG9zcy4gKi8KKwkJLyogU2VuZCBhIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4gKi8KKwkJLyogQW5kIHNob3VsZCBzZW5kIGEgTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZSAqLwogCQkvKiAqLwogCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCiAJCSAgICAmJiAoSU5GUkFfT04ocEFkKSkpIHsKQEAgLTI4Myw3ICsyODQsNyBAQAogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKIAkJU2Nhbk5leHRDaGFubmVsKHBBZCk7CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTY2FuUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIik7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsCkBAIC01MzUsNyArNTM2LDcgQEAKIAkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsCiAJCQkgICAgJlN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOworCQlEQkdQUklOVF9FUlIoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbC5cbiIpOwogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwogCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwKQEAgLTc1MCw5ICs3NTEsOSBAQAogCiAJCS8qIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0ICovCiAJCS8qIEJTUyBwYXJhbWV0ZXJzIGhlcmUuICovCi0JCS8qIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPyAqLwotCQkvKiAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8gKi8KLQkJLyogQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZCAqLworCQkvKiBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFUSU9OPyAqLworCQkvKiAgICBEbyB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPyAqLworCQkvKiBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkcyAqLwogCQkvKiAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuICovCiAJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkgewogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCkBAIC04NzYsNyArODc3LDcgQEAKIAkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOwogCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKIAotCQkJLyogQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QgKi8KKwkJCS8qIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAJCQkvKiBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlICovCiAJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CiAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwKQEAgLTEyMDcsNyArMTIwOCw3IEBACiAJCQl9CiAKIAkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7Ci0JCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQkJREJHUFJJTlRfRVJSKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pOwogCQkJfQogCQl9CiAJCS8qIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCmluZGV4IDY5YjhhMjQuLmZmMzQ4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jCkBAIC0zMyw3ICszMyw4IEBACiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKLQlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CisJUGF1bCBMaW4JCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTg2LDcgKzg3LDcgQEAKIAkJCS8qIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbiAqLwogCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CiAJCQkvKiBXZSBzaGFsbCBibG9jayBhbGwgcmVjZXB0aW9uICovCi0JCQkvKiBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2ljYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZSAqLworCQkJLyogV2Ugc2hhbGwgY2xlYW4gYWxsIFR4IHJpbmcgYW5kIGRpc2Fzc29jaWF0ZSBmcm9tIEFQIGFmdGVyIG5leHQgRUFQT0wgZnJhbWUgKi8KIAkJCS8qICovCiAJCQkvKiBObyBuZWNlc3NhcnkgdG8gY2xlYW4gYWxsIFR4IHJpbmcsIG9uIFJUTVBIYXJkVHJhbnNtaXQgd2lsbCBzdG9wIHNlbmRpbmcgbm9uLTgwMi4xWCBFQVBPTCBwYWNrZXRzICovCiAJCQkvKiBpZiBwQWQtPlN0YUNmZy5NaWNFcnJDbnQgZ3JlYXRlciB0aGFuIDIuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwppbmRleCBlMDk1YTQ0Li41NzE3ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKQEAgLTMxLDEwICszMSwxMSBAQAogICAgIElPQ1RMIHJlbGF0ZWQgc3Vicm91dGluZXMKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgCVdobyAgICAgICAgCQkgV2hlbiAgICAgICAgICBXaGF0CiAgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgUm9yeSBDaGVuICAgMDEtMDMtMjAwMyAgICBjcmVhdGVkCi0JUm9yeSBDaGVuICAgMDItMTQtMjAwNSAgICBtb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisgICAJUm9yeSBDaGVuICAgCQkwMS0wMy0yMDAzICAgIAljcmVhdGVkCisJUm9yeSBDaGVuICAgCQkwMi0xNC0yMDA1ICAgIAltb2RpZnkgdG8gc3VwcG9ydCBSVDYxCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggdHlwb3MKICovCiAKICNpbmNsdWRlCSJydF9jb25maWcuaCIKQEAgLTg1MSw3ICs4NTIsNyBAQAogCiAJCS8qCiAJCSAgIFByb3RvY29sOgotCQkgICBpdCB3aWxsIHNob3cgc2Nhbm5lZCBBUCdzIFdpcmVsZXNzTW9kZSAuCisJCSAgIGl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlLgogCQkgICBpdCBtaWdodCBiZQogCQkgICA4MDIuMTFhCiAJCSAgIDgwMi4xMWEvbgpAQCAtODc1LDEzICs4NzYsMTMgQEAKIAkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFhIik7CiAJCQl9IGVsc2UgewogCQkJCS8qCi0JCQkJICAgaWYgb25lIG9mIG5vbiBCIG1vZGUgcmF0ZSBpcyBzZXQgc3VwcG9ydGVkIHJhdGUgLiBpdCBtZWFuIEcgb25seS4KKwkJCQkgICBpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSwgaXQgbWVhbnMgRyBvbmx5LgogCQkJCSAqLwogCQkJCWZvciAocmF0ZUNudCA9IDA7CiAJCQkJICAgICByYXRlQ250IDwgcEJzc0VudHJ5LT5TdXBSYXRlTGVuOwogCQkJCSAgICAgcmF0ZUNudCsrKSB7CiAJCQkJCS8qCi0JCQkJCSAgIDZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KKwkJCQkJICAgNk1icHMoMTQwKSA5TWJwcygxNDYpIGFuZCA+PTEyTWJwcygxNTIpIGFyZSBzdXBwb3J0ZWQgcmF0ZSwgaXQgbWVhbnMgRyBvbmx5LgogCQkJCQkgKi8KIAkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PSAxNDAKIAkJCQkJICAgIHx8IHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PQpAQCAtMTQxNyw3ICsxNDE4LDcgQEAKIAkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkgewogCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKIAkJfSBlbHNlCi0JCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgdGhlIG1vZGUgaXMgb25seSBjaGFuZ2VkICovCiAJCWlmICghKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNzMyLDggKzI3MzMsOCBAQAogCQkJfQogCQkJaWYgKElORlJBX09OKHBBZGFwdGVyKSkgewogCQkJCS8qQk9PTEVBTiBDYW5jZWxsZWQ7ICovCi0JCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRCAqLwotCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgZnJvbSByZWNvbm5lY3RpbmcgdG8gdGhlIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlcyB1c2VycyBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCiAJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKIAkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC4KIAkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkLApAQCAtMjc2Niw4ICsyNzY3LDggQEAKIAkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOwogCQkJfQogCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkgewotCQkJCS8qIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQgKi8KLQkJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCisJCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IGZyb20gcmVjb25uZWN0aW5nIHRvIHRoZSBvbGQgU1NJRCAqLworCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZXMgdXNlcnMgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLwogCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CiAJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguCiAJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZCwKQEAgLTI4ODQsNyArMjg4NSw3IEBACiAJCX0KIAkJLyogRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uICovCiAJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLCAweDMpOwotCQkvKiBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuICovCisJCS8qIEFTSUMgc3VwcG9ydHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLiAqLwogCQkvKlJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7ICovCiAJCS8qVmFsdWUgfD0gKDB4ODApOyAqLwogCQkvKlJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwppbmRleCBjZDE1ZGFhLi5lZTY4ZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMKQEAgLTI3LDggKzI3LDggQEAKICNpbmNsdWRlICJydF9jb25maWcuaCIKIAogLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCi0vKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KLS8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KKy8qIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIHRoZSBidWcgaW4gY3VycmVudCB2ZXJzaW9uIG9mIGRyaXZlciwgcGxlYXNlIGUtbWFpbCBtZS4gKi8KKy8qIE90aGVyd2lzZSBwb3N0IHRvIHRoZSBmb3J1bSBhdCByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKi8KIE1PRFVMRV9BVVRIT1IoIlBhdWwgTGluIDxwYXVsX2xpbkByYWxpbmt0ZWNoLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUlQyODcwL1JUMzA3MCBXaXJlbGVzcyBMYW4gTGludXggRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcnR1c2JfdXNiX2lkX2xlbjsgaSsrKSB7CiAJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKIAkJICAgIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KSB7Ci0JCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAicnQyODcwOiBpZFZlbmRvciA9IDB4JXgsIGlkUHJvZHVjdCA9IDB4JXhcbiIsCiAJCQkgICAgICAgZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCiAJCQkgICAgICAgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKIAkJCWJyZWFrOwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJfQogCiAJaWYgKGkgPT0gcnR1c2JfdXNiX2lkX2xlbikgewotCQlwcmludGsoInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC0zMjMsNyArMzIzLDcgQEAKIAogCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpIHsKIAkJcHJpbnRrCi0JCSAgICAoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwKKwkJICAgIChLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLAogCQkgICAgIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBGQUxTRTsKIAl9CkBAIC00MjMsNyArNDIzLDcgQEAKIC8qIEluaXQgZHJpdmVyIG1vZHVsZSAqLwogaW50IF9faW5pdCBydHVzYl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKCJydHVzYiBpbml0IC0tLT5cbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJydHVzYiBpbml0IC0tLT5cbiIpOwogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7CiB9CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogdm9pZCBfX2V4aXQgcnR1c2JfZXhpdCh2b2lkKQogewogCXVzYl9kZXJlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOwotCXByaW50aygiPC0tLSBydHVzYiBleGl0XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0tLSBydHVzYiBleGl0XG4iKTsKIH0KIAogbW9kdWxlX2luaXQocnR1c2JfaW5pdCk7CkBAIC04MTQsNyArODE0LDcgQEAKIAkJICBkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+ZGV2cGF0aCkpOwogCWlmICghcEFkKSB7CiAJCXVzYl9wdXRfZGV2KGRldik7Ci0JCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJydHVzYl9kaXNjb25uZWN0OiBwQWQgPT0gTlVMTCFcbiIpOwogCQlyZXR1cm47CiAJfQogCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpOwpAQCAtODg0LDggKzg4NCw4IEBACiAJaWYgKG5ldF9kZXYgPT0gTlVMTCkKIAkJZ290byBlcnJfb3V0X2ZyZWVfcmFkZXY7CiAKLQkvKiBIZXJlIGFyZSB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgd2l0aCB1c2Igc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KLQkvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIuCisJLyogSGVyZSBhcmUgdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHdpdGggdXNiIHNwZWNpZmljIHBhcmFtZXRlcnMuIAorCSAqIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlci4KIAkgKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbAogCSAqIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaAppbmRleCA2MTk5YWU2Li4xMTZmYzJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKQEAgLTMyLDEzICszMiwxNCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJTmFtZQkJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncworCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCBhIHR5cG8KICovCiAKICNpZm5kZWYJX19XUEFfSF9fCiAjZGVmaW5lCV9fV1BBX0hfXwogCi0vKiBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGggKi8KKy8qIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aCAqLwogI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgogI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKICNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGRkOGEyMjEuLmIyNmI1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtODIyLDcgKzgyMiw3IEBACiAJCXsKIAkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKIAkJfSBlbHNlIHsKLQkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7OworCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKIAkJfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKaW5kZXggYjE3ODZkYy4uZmFjNGVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKQEAgLTg5LDcgKzg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIAlDT01QX0lOVFIgICAgICAgfAogCQkJCUNPTVBfRVJSIDsgLy9hbHdheXMgb3BlbiBlcnIgZmxhZ3Mgb24KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxOTJfcGNpX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRsODE5Ml9wY2lfaWRfdGJsKSA9IHsKICNpZmRlZiBSVEw4MTkwUAogCS8qIFJlYWx0ZWsgKi8KIAkvKiBEbGluayAqLwpAQCAtMjI4Myw5ICsyMjgzLDcgQEAKIAkJCQlJTVJfVFhGT1ZXIHwgSU1SX0JjbkludCB8IElNUl9UQkRPSyB8IElNUl9UQkRFUik7CiAKIAlwcml2LT5BY21Db250cm9sID0gMDsKLQlwcml2LT5wRmlybXdhcmUgPSAocnRfZmlybXdhcmUqKXZtYWxsb2Moc2l6ZW9mKHJ0X2Zpcm13YXJlKSk7Ci0JaWYgKHByaXYtPnBGaXJtd2FyZSkKLQltZW1zZXQocHJpdi0+cEZpcm13YXJlLCAwLCBzaXplb2YocnRfZmlybXdhcmUpKTsKKwlwcml2LT5wRmlybXdhcmUgPSB2emFsbG9jKHNpemVvZihydF9maXJtd2FyZSkpOwogCiAJLyogcnggcmVsYXRlZCBxdWV1ZSAqLwogICAgICAgICBza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5yeF9xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHkuYwppbmRleCBkODNiY2JjLi41MGNkMGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMKQEAgLTI1OTYsNyArMjU5Niw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gcmV0OzsKKwlyZXR1cm4gcmV0OwogCiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKaW5kZXggMjA2ZDkyNC4uZWVmYzY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKICNjY2ZsYWdzLXkgKz0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQogI2NjZmxhZ3MteSArPSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCiBjY2ZsYWdzLXkgKz0gLURVU0VfT05FX1BJUEUKLWNjZmxhZ3MteSArPSAtREVOQUJMRV9ET1QxMUQKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEKIAogcjgxOTJ1X3VzYi15IDo9IHI4MTkyVV9jb3JlLm8gcjgxODBfOTNjeDYubyByODE5MlVfd3gubwkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCmluZGV4IGQ5OWNjMDMuLjkyZTdhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICiAjZGVmaW5lIF9fSU5DX0RPVDExRF9ICiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiaWVlZTgwMjExL2llZWU4MDIxMS5oIgogCiAKQEAgLTk4LDUgKzk3LDQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAogCXU4IGNoYW5uZWwKICk7Ci0jZW5kaWYgLyogRU5BQkxFX0RPVDExRCAqLwogI2VuZGlmIC8qICNpZm5kZWYgX19JTkNfRE9UMTFEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCmluZGV4IDQ1NzA0ZjguLjA3NzVjNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpAQCAtMjAsNyArMjAsNiBAQAogZW5kaWYKICNjY2ZsYWdzLXkgOj0gLURKT0hOX05PQ1BZCiAjZmxhZ3MgdG8gZW5hYmxlIG9yIGRpc2JsZSA4MDIxMUQgZmVhdHVyZQotY2NmbGFncy15ICs9IC1ERU5BQkxFX0RPVDExRAogaWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKIAkJICAgICAgaWVlZTgwMjExX3NvZnRtYWMubyBcCiAJCSAgICAgIGllZWU4MDIxMV90eC5vIFwKQEAgLTc1LDcgKzc0LDYgQEAKIENGTEFHUyArPSAtRE1PRFZFUlNJT05TIC1ERVhQT1JUX1NZTVRBQiAtaW5jbHVkZSAkKEtTUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaAogI0tlcm5lbCAyLjQuMjAKICNDRkxBR1MgKz0gLURfX05PX1ZFUlNJT05fXyAtREVYUE9SVF9TWU1UQUIKLSNDRkxBR1MgKz0gLURFTkFCTEVfRE9UMTFECiBTTVAgOj0gJChzaGVsbCAkKENDKSAkKE1PRENGTEFHUykgLUUgLWRNICQoQ09ORklHX0ZJTEUpIHwgXAogICAgZ3JlcCBDT05GSUdfU01QIHwgYXdrICd7cHJpbnQgJCQzfScpCiBpZm5lcSAoJChTTVApLDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwppbmRleCBiOTFjYmZjLi5jZTYzZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTEsNCArMSwzIEBACi0jaWZkZWYgRU5BQkxFX0RPVDExRAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8JRmlsZToKIC8vCQlEb3QxMWQuYwpAQCAtMjIwLDQgKzIxOSwzIEBACiBFWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKIEVYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOwogCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCmluZGV4IDE1YjdhNGIuLjU0ZjJiNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaApAQCAtMSwxMCArMSw4IEBACiAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICiAjZGVmaW5lIF9fSU5DX0RPVDExRF9ICiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKLS8vI2RlZmluZSBFTkFCTEVfRE9UMTFECiAKIC8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCiAKQEAgLTk4LDUgKzk2LDQgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKIAl1OCBjaGFubmVsCiApOwotI2VuZGlmIC8vRU5BQkxFX0RPVDExRAogI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGUxMjE2YjcuLmMwYjg0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtMTU3MiwxMCArMTU3Miw4IEBACiAjaWZkZWYgVEhPTUFTX1RVUkJPCiAJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcwogI2VuZGlmCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCXUxNiBDb3VudHJ5SWVMZW47CiAJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOwotI2VuZGlmCiAJLy8gSFQgUmVsYXRlZCwgYnkgYW15LCAyMDA4LjA0LjI5CiAJQlNTX0hUCWJzc2h0OwogCS8vIEFkZCB0byBoYW5kbGUgYnJvYWRjb20gQVAgbWFuYWdlbWVudCBmcmFtZSBDQ0sgcmF0ZS4KQEAgLTE3NjksNyArMTc2Nyw2IEBACiAjZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMgQklUMjgKICNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJMAkvLyBEbyBub3QgY2hhbmdlIHRoZSBSRk9mZiByZWFzb24uIERlZmluZWQgYnkgQnJ1Y2UsIDIwMDgtMDEtMTcuCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiB0eXBlZGVmIGVudW0KIHsKIAlDT1VOVFJZX0NPREVfRkNDID0gMCwKQEAgLTE3ODQsNyArMTc4MSw2IEBACiAJQ09VTlRSWV9DT0RFX01JQywKIAlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTgogfWNvdW50cnlfY29kZV90eXBlX3Q7Ci0jZW5kaWYKIAogI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKIHR5cGVkZWYgc3RydWN0IF9SVF9MSU5LX0RFVEVDVF9UewpAQCAtMTk3MCwxMiArMTk2Niw4IEBACiAKIAkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLwogCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl2b2lkKiBwRG90MTFkSW5mbzsKIAlib29sIGJHbG9iYWxEb21haW47Ci0jZWxzZQotCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0jZW5kaWYKIAlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCiAJaW50IGJhc2ljX3JhdGU7CiAJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggYzhjYTlkOC4uMWVhOGRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC00NCw5ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKQEAgLTE1OTksNyArMTU5Nyw2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCkBAIC0xNjMyLDcgKzE2MjksNiBAQAogCX0KIAogfQotI2VuZGlmCiAKIGludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKQEAgLTIwODYsMTQgKzIwODIsMTIgQEAKIAkJCSAgICAgICAiUW9TIEVycm9yIG5lZWQgdG8gcGFyc2UgUU9TX1BBUkFNRVRFUiBJRVxuIik7CiAJCQlicmVhazsKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKIAkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ09VTlRSWTogJWQgYnl0ZXNcbiIsCiAJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJLy9wcmludGsoIj09PT09PlJlY2VpdmUgPCVzPiBDb3VudHJ5IElFXG4iLG5ldHdvcmstPnNzaWQpOwogCQkJaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZShpZWVlLCBpbmZvX2VsZW1lbnQsIG5ldHdvcmssIG5ldHdvcmstPmJzc2lkKTsvL2FkZHIyIGlzIHNhbWUgYXMgYWRkcjMgd2hlbiBmcm9tIGFuIEFQCiAJCQlicmVhazsKLSNlbmRpZgogLyogVE9ETyAqLwogCQlkZWZhdWx0OgogCQkJSUVFRTgwMjExX0RFQlVHX01HTVQKQEAgLTIyMjksMTAgKzIyMjMsOCBAQAogI2lmZGVmIFRIT01BU19UVVJCTwogCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDA7CiAjZW5kaWYKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJbmV0d29yay0+Q291bnRyeUllTGVuID0gMDsKIAltZW1zZXQobmV0d29yay0+Q291bnRyeUllQnVmLCAwLCBNQVhfSUVfTEVOKTsKLSNlbmRpZgogLy9Jbml0aWFsaXplIEhUIHBhcmFtZXRlcnMKIAkvL2llZWU4MDIxMV9odF9pbml0aWFsaXplKCZuZXR3b3JrLT5ic3NodCk7CiAJSFRJbml0aWFsaXplQnNzRGVzYygmbmV0d29yay0+YnNzaHQpOwpAQCAtMjM5OSwxMCArMjM5MSw4IEBACiAJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKICNlbmRpZgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWRzdC0+Q291bnRyeUllTGVuID0gc3JjLT5Db3VudHJ5SWVMZW47CiAJbWVtY3B5KGRzdC0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVMZW4pOwotI2VuZGlmCiAKIAkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAogCWRzdC0+YldpdGhBaXJvbmV0SUUgPSBzcmMtPmJXaXRoQWlyb25ldElFOwpAQCAtMjQ3MCw3ICsyNDYwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkvLyBGb3IgQXN1cyBFZWVQYyByZXF1ZXN0LAogCS8vICgxKSBpZiB3aXJlbGVzcyBhZGFwdGVyIHJlY2VpdmUgZ2V0IGFueSA4MDIuMTFkIGNvdW50cnkgY29kZSBpbiBBUCBiZWFjb24sCiAJLy8JICAgd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZm9sbG93IHRoZSBjb3VudHJ5IGNvZGUuCkBAIC0yNTI3LDcgKzI1MTYsNiBAQAogCQkJfQogCQl9CiAJfQotI2VuZGlmCiAKIAkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcwogCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBiYzhjNDI1Li4yMGY4YzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yMSw5ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogCiB1OCByc25fYXV0aGVuX2NpcGhlcl9zdWl0ZVsxNl1bNF0gPSB7CiAJezB4MDAsMHgwRiwweEFDLDB4MDB9LCAvL1VzZSBncm91cCBrZXksIC8vUmVzZXJ2ZWQKQEAgLTQzMCwxMCArNDI4LDggQEAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc2hvcnQgY2ggPSAwOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0jZW5kaWYKIAlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CiAKIAl3aGlsZSgxKQpAQCAtNDQzLDExICs0MzksNyBAQAogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKLSNlbHNlCi0JCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKLSNlbmRpZgogCiAJCS8qIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiB0d28gc2l0dWF0aW9ucwogCQkgKiAxLSBXZSBoYXZlIHN3aXRjaGVkIHRvIGFkLWhvYyBtb2RlIGFuZCB3ZSBhcmUKQEAgLTQ3MSw5ICs0NjMsNyBAQAogCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKIAkJCWdvdG8gb3V0OwogCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCWlmKGNoYW5uZWxfbWFwW2NoXSA9PSAxKQotI2VuZGlmCiAJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwogCiAJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKQEAgLTQ5NiwxMCArNDg2LDggQEAKIAl9CiAJZWxzZXsKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7Ci0jZW5kaWYKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogfQogfQpAQCAtNTEwLDEwICs0OTgsOCBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc29mdG1hY19zY2FuX3dxKTsKIAlzdGF0aWMgc2hvcnQgd2F0Y2hkb2cgPSAwOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CiAJbWVtY3B5KGNoYW5uZWxfbWFwLCBHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0jZW5kaWYKIAlpZighaWVlZS0+aWVlZV91cCkKIAkJcmV0dXJuOwogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKQEAgLTUyMywyNSArNTA5LDE2IEBACiAJCWlmICh3YXRjaGRvZysrID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQl7CiAJCS8vaWYgY3VycmVudCBjaGFubmVsIGlzIG5vdCBpbiBjaGFubmVsIG1hcCwgc2V0IHRvIGRlZmF1bHQgY2hhbm5lbC4KLQkJI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkJCWlmICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLQkJI2Vsc2UKLQkJCWlmICghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLQkJI2VuZGlmCisJCQlpZiAoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSkgewogCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gNjsKIAkJCQlnb3RvIG91dDsgLyogbm8gZ29vZCBjaGFucyAqLworCQkJfQogCQl9Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCX13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLSNlbHNlCi0JfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotI2VuZGlmCiAJaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQogCQlnb3RvIG91dDsKIAlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCi0jZW5kaWYKIAlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKIAogCkBAIC01NTAsMTAgKzUyNyw4IEBACiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIAlyZXR1cm47CiBvdXQ6Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7Ci0jZW5kaWYKIAlpZWVlLT5hY3RzY2FubmluZyA9IGZhbHNlOwogCXdhdGNoZG9nID0gMDsKIAlpZWVlLT5zY2FubmluZyA9IDA7CkBAIC02MzUsNyArNjEwLDYgQEAKIC8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewogCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQpAQCAtNjQzLDcgKzYxNyw2IEBACiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KIAl9Ci0jZW5kaWYKIAlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKIAkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApewogCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOwpAQCAtNjU3LDcgKzYzMCw2IEBACiAvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwogdm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQogCXsKIAkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKQEAgLTY2NSw3ICs2MzcsNiBAQAogCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwogCQl9CiAJfQotI2VuZGlmCiAJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCiAJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKGllZWUpOwpAQCAtMjM5MCwxMSArMjM2MSw5IEBACiAJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CiAKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQgLy9pZiBjcmVhdGluZyBhbiBhZC1ob2MsIHNldCBpdHMgY2hhbm5lbCB0byAxMCB0ZW1wb3JhcmlseS0tdGhpcyBpcyB0aGUgcmVxdWlyZW1lbnQgZm9yIEFTVVMsIG5vdCAxMUQsIHNvIGRpc2FibGUgMTFkLgogLy8JaWYoKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpICYmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkKIAlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OwotI2VuZGlmCiAJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRoY2VkIHRvCiAJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKIAkgKiBiZWluZyB2ZXJ5IGZldyB0aW1lIGluIG1hbmFnZWQgbW9kZSAoc28gdGhlIGNhcmQgaGF2ZSBoYWQgbm8KQEAgLTI0ODMsNyArMjQ1Miw2IEBACiB2b2lkIGllZWU4MDIxMV9zdGFydF9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJLy8KIAkvLyBSZWY6IDgwMi4xMWQgMTEuMS4zLjMKIAkvLyBTVEEgc2hhbGwgbm90IHN0YXJ0IGEgQlNTIHVubGVzcyBwcm9wZXJseSBmb3JtZWQgQmVhY29uIGZyYW1lIGluY2x1ZGluZyBhIENvdW50cnkgSUUuCkBAIC0yNDk1LDcgKzI0NjMsNiBAQAogCQkJcmV0dXJuOwogCQl9CiAJfQotI2VuZGlmCiAJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZXQgd2UKIAkgKiBhcmUgaW50ZXJlc3RlZCBpbiAoaWYgYW55KS4KIAkgKiBpZiBub3QgKHdlIGFyZSBkaXNhc3NvY2lhdGVkIGFuZCB3ZSBhcmUgbm90CkBAIC0yNTMwLDEwICsyNDk3LDggQEAKIAogCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKIAkJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCiAJCURvdDExZF9SZXNldChpZWVlKTsKLSNlbmRpZgogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKIAlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CiAJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKQEAgLTI2NjksMTEgKzI2MzQsNyBAQAogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKIAkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOwotI2Vsc2UKLQkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOwotI2VuZGlmCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7CiAJfQogCkBAIC0yNzIxLDExICsyNjgyLDkgQEAKIAlmb3IoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkgIGllZWUtPnNlcV9jdHJsW2ldID0gMDsKIAl9Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWllZWUtPnBEb3QxMWRJbmZvID0ga3phbGxvYyhzaXplb2YoUlRfRE9UMTFEX0lORk8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWllZWUtPnBEb3QxMWRJbmZvKQogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgRE9UMTFEXG4iKTsKLSNlbmRpZgogCS8vYWRkZWQgZm9yICBBUCByb2FtaW5nCiAJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDI7CiAJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7CkBAIC0yNzk2LDEzICsyNzU1LDExIEBACiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoTlVMTCAhPSBpZWVlLT5wRG90MTFkSW5mbykKIAl7CiAJCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKIAkJaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOwogCX0KLSNlbmRpZgogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwppbmRleCBmMzM1YzI1Li5jYjVhM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCkBAIC0xNSw5ICsxNSw3IEBACiAKIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogLyogRklYTUU6IGFkZCBBIGZyZXFzICovCiAKIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKQEAgLTYzLDEyICs2MSwxMCBAQAogCiAJfWVsc2UgeyAvKiBTZXQgdGhlIGNoYW5uZWwgKi8KIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJaWYgKCEoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcClbZndycS0+bV0pIHsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotI2VuZGlmCiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKIAkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IDgxYWEyZWQuLmVjNzg0NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtNzU0LDcgKzc1NCw3IEBACiAJCXsKIAkJCXR4Yi0+cXVldWVfaW5kZXggPSBVUDJBQyhza2ItPnByaW9yaXR5KTsKIAkJfSBlbHNlIHsKLQkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7OworCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKIAkJfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKaW5kZXggNDk0ZjE4MC4uYWU0ZjJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKQEAgLTc3LDkgKzc3LDcgQEAKICNpbmNsdWRlICJyODE5Ml9wbS5oIgogI2VuZGlmCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiZG90MTFkLmgiCi0jZW5kaWYKIC8vc2V0IGhlcmUgdG8gb3BlbiB5b3VyIHRyYWNlIGNvZGUuIC8vV0IKIHUzMiBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ID0gXAogCQkJLy8JQ09NUF9JTklUICAgIAl8CkBAIC0xNjYsNyArMTY0LDYgQEAKICNlbmRpZgogfTsKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAogdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfTElTVAogewpAQCAtMjQyLDkgKzIzOSw3IEBACiAJfQogCXJldHVybjsKIH0KLSNlbmRpZgogCi0jZGVmaW5lIGVxTWFjQWRkcihhLGIpICggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApCiAKICNkZWZpbmUgCXJ4X2hhbF9pc19jY2tfcmF0ZShfcGRydmluZm8pXAogCQkJKF9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMU0gfHxcCkBAIC0xNTA3LDcgKzE1MDIsNyBAQAogCXsKIAkJLy8KIAkJLy8gSGFuZGxlIEhXIEJlYWNvbjoKLQkJLy8gV2UgaGFkIHRyYW5zZmVyIG91ciBiZWFjb24gZnJhbWUgdG8gaG9zdCBjb250cm9sZXIgYXQgdGhpcyBtb21lbnQuCisJCS8vIFdlIGhhZCB0cmFuc2ZlciBvdXIgYmVhY29uIGZyYW1lIHRvIGhvc3QgY29udHJvbGxlciBhdCB0aGlzIG1vbWVudC4KIAkJLy8KIAkJLy8KIAkJLy8gQ2F1dGlvbjoKQEAgLTIyMDMsNiArMjE5OCw4IEBACiAKIAlwcml2LT5yeF91cmIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiICopICogKE1BWF9SWF9VUkIrMSksCiAJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPnJ4X3VyYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKIAogI2lmbmRlZiBKQUNLU09OX05FV19SWAogCWZvcihpPTA7aTwoTUFYX1JYX1VSQisxKTtpKyspewpAQCAtMzE1NSw3ICszMTUyLDYgQEAKIHNob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYocHJpdi0+Q2hhbm5lbFBsYW4gPiBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTil7CiAJCXByaW50aygicnRsODE4MF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKIAkJcHJpdi0+Q2hhbm5lbFBsYW49IDA7CkBAIC0zMTYzLDIxICszMTU5LDYgQEAKIAlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsIHBsYW4gaXMgJWRcbiIscHJpdi0+Q2hhbm5lbFBsYW4pOwogCiAJcnRsODE5eF9zZXRfY2hhbm5lbF9tYXAocHJpdi0+Q2hhbm5lbFBsYW4sIHByaXYpOwotI2Vsc2UKLQlpbnQgY2gsaTsKLQkvL1NldCBEZWZhdWx0IENoYW5uZWwgUGxhbgotCWlmKCFjaGFubmVscyl7Ci0JCURNRVNHKCJObyBjaGFubmVscywgYWJvcnRpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQljaD1jaGFubmVsczsKLQlwcml2LT5DaGFubmVsUGxhbj0gMDsvL2hpa2FydQotCSAvLyBzZXQgY2hhbm5lbHMgMS4uMTQgYWxsb3dlZCBpbiBnaXZlbiBsb2NhbGUKLQlmb3IgKGk9MTsgaTw9MTQ7IGkrKykgewotCQkocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaV0gPSAodTgpKGNoICYgMHgwMSk7Ci0JCWNoID4+PSAxOwotCX0KLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC01MDg1LDcgKzUwNjYsNyBAQAogCQkJLy9HZXQgUnggc25yIHZhbHVlIGluIERCCiAJCQl0bXBfcnhzbnIgPQlwb2ZkbV9idWYtPnJ4c25yX1hbaV07CiAJCQlyeF9zbnJYID0gKGNoYXIpKHRtcF9yeHNucik7Ci0JCQkvL3J4X3NuclggPj49IDE7OworCQkJLy9yeF9zbnJYID4+PSAxOwogCQkJcnhfc25yWCAvPSAyOwogCQkJcHJpdi0+c3RhdHMucnhTTlJkQltpXSA9IChsb25nKXJ4X3Nuclg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYwppbmRleCAyNWQ1Yzg3Li5mNjQwOGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCkBAIC0yMSw5ICsyMSw3IEBACiAjaW5jbHVkZSAicjgxOTJVLmgiCiAjaW5jbHVkZSAicjgxOTJVX2h3LmgiCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiZG90MTFkLmgiCi0jZW5kaWYKIAogI2RlZmluZSBSQVRFX0NPVU5UIDEyCiB1MzIgcnRsODE4MF9yYXRlc1tdID0gezEwMDAwMDAsMjAwMDAwMCw1NTAwMDAwLDExMDAwMDAwLApAQCAtNDU4LDExICs0NTYsNyBAQAogCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7CiAKIAkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKLSNlbHNlCi0JCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgewotI2VuZGlmCiAJCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBpICsgMTsKIAkJCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW2ldICogMTAwMDAwOwogCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCmluZGV4IGEzYWRhZWQuLjQxNjg0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwpAQCAtNiw5ICs2LDcgQEAKICNpbmNsdWRlICJyODE5MlVfZG0uaCIKICNpbmNsdWRlICJyODE5eFVfZmlybXdhcmVfaW1nLmgiCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAjaW5jbHVkZSAiZG90MTFkLmgiCi0jZW5kaWYKIHN0YXRpYyB1MzIgUkZfQ0hBTk5FTF9UQUJMRV9aRUJSQVtdID0gewogCTAsCiAJMHgwODVjLCAvLzI0MTIgMQpAQCAtMTAxMSw3ICsxMDA5LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCXJldHVybiByZXQ7OworCXJldHVybiByZXQ7CiAKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyNTcsMTMgKzEyNTUsMTEgQEAKIAogCVJUX1RSQUNFKENPTVBfQ0gsICI9PT09PiVzKCk9PT09c3RhZ2U6JWQsIHN0ZXA6JWQsIGNoYW5uZWw6JWRcbiIsIF9fRlVOQ1RJT05fXywgKnN0YWdlLCAqc3RlcCwgY2hhbm5lbCk7CiAvLwlSVF9BU1NFUlQoSXNMZWdhbENoYW5uZWwoQWRhcHRlciwgY2hhbm5lbCksICgiaWxsZWdhbCBjaGFubmVsOiAlZFxuIiwgY2hhbm5lbCkpOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAlpZiAoIUlzTGVnYWxDaGFubmVsKHByaXYtPmllZWU4MDIxMSwgY2hhbm5lbCkpCiAJewogCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT09PT09PT09PT0+c2V0IHRvIGlsbGVnYWwgY2hhbm5lbDolZFxuIiwgY2hhbm5lbCk7CiAJCXJldHVybiB0cnVlOyAvL3JldHVybiB0cnVlIHRvIHRlbGwgdXBwZXIgY2FsbGVyIGZ1bmN0aW9uIHRoaXMgY2hhbm5lbCBzZXR0aW5nIGlzIGZpbmlzaGVkISBPciBpdCB3aWxsIGluIHdoaWxlIGxvb3AuCiAJfQotI2VuZGlmCiAvL0ZJWE1FOm5lZWQgdG8gY2hlY2sgd2hldGhlciBjaGFubmVsIGlzIGxlZ2FsIG9yIG5vdCBoZXJlLldCCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL1RPRE8KaW5kZXggNWM4ODgyMS4uMmFhNWRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9UT0RPCkBAIC0zLDcgKzMsNiBAQAogLSBzd2l0Y2ggdG8gdXNlIExJQjgwMjExCiAtIHN3aXRjaCB0byB1c2UgTUFDODAyMTEKIC0gY2hlY2twYXRjaC5wbCBmaXhlcyAtIG9ubHkgYSBmZXcgcmVtYWluCi0tIHNwYXJzZSBmaXhlcwogLSBzd2l0Y2ggZnJvbSBsYXJnZSBpbmxpbmUgZmlybXdhcmUgZmlsZSB0byB1c2UgdGhlIGZpcm13YXJlIGludGVyZmFjZQogICBhbmQgYWRkIHRoZSBmaWxlIHRvIHRoZSBsaW51eC1maXJtd2FyZSBwYWNrYWdlLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKaW5kZXggODMxZDgxZS4uMzZlZWI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaApAQCAtMTk1LDEwICsxOTUsNyBAQAogCiBzdGF0aWMgaW5saW5lIHU4ICpfbWFsbG9jKHUzMiBzeikKIHsKLQl1OCAqcGJ1ZjsKLQotCXBidWYgPQlrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKLQlyZXR1cm4gcGJ1ZjsKKwlyZXR1cm4Ja21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfY2FuY2VsX3RpbWVyX2V4KHN0cnVjdCB0aW1lcl9saXN0ICpwdGltZXIpCkBAIC0yMjAsMzQgKzIxNywyMiBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBfUk5EOCh1MzIgc3opCiB7Ci0JdTMyCXZhbDsKLQotCXZhbCA9ICgoc3ogPj4gMykgKyAoKHN6ICYgNykgPyAxIDogMCkpIDw8IDM7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gKChzeiA+PiAzKSArICgoc3ogJiA3KSA/IDEgOiAwKSkgPDwgMzsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgX1JORDEyOCh1MzIgc3opCiB7Ci0JdTMyCXZhbDsKLQotCXZhbCA9ICgoc3ogPj4gNykgKyAoKHN6ICYgMTI3KSA/IDEgOiAwKSkgPDwgNzsKLQlyZXR1cm4gdmFsOworCXJldHVybiAoKHN6ID4+IDcpICsgKChzeiAmIDEyNykgPyAxIDogMCkpIDw8IDc7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9STkQyNTYodTMyIHN6KQogewotCXUzMgl2YWw7Ci0KLQl2YWwgPSAoKHN6ID4+IDgpICsgKChzeiAmIDI1NSkgPyAxIDogMCkpIDw8IDg7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gKChzeiA+PiA4KSArICgoc3ogJiAyNTUpID8gMSA6IDApKSA8PCA4OwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBfUk5ENTEyKHUzMiBzeikKIHsKLQl1MzIJdmFsOwotCi0JdmFsID0gKChzeiA+PiA5KSArICgoc3ogJiA1MTEpID8gMSA6IDApKSA8PCA5OwotCXJldHVybiB2YWw7CisJcmV0dXJuICgoc3ogPj4gOSkgKyAoKHN6ICYgNTExKSA/IDEgOiAwKSkgPDwgOTsKIH0KIAogI2RlZmluZSBTVFJVQ1RfUEFDS0VEIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCmluZGV4IDk3MzBhZTEuLjFkYzEyYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKQEAgLTQyOCw3ICs0MjgsNyBAQAogCQkgICAgICB1MTYgY250cywgdTggKmRhdGEpCiB7CiAJaW50IGk7Ci0JdTggcmVzID0gdHJ1ZTs7CisJdTggcmVzID0gdHJ1ZTsKIAogCWlmIChzdGFydF9hZGRyID4gRUZVU0VfTUFYX1NJWkUpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKaW5kZXggOGVkYzUxOC4uODhhMTUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQljYXNlIDB4MTE6CiAJCWNhc2UgMHgxMjoKIAkJY2FzZSAweDEzOgotCQkJYWRkciA9IFJUTDg3MTJfRE1BX0gyQ0NNRDs7CisJCQlhZGRyID0gUlRMODcxMl9ETUFfSDJDQ01EOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlhZGRyID0gUlRMODcxMl9ETUFfQkVROy8qUlRMODcxMl9FUF9MTzsqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwppbmRleCBiODE5NWUzLi43NWYxYTZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCQkJCQkgICAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsCiAJCQkJCSAgIDB4MCwgMHgwfTsKIAkJCWRhdGFsZW4gPSBwYXR0cmliLT5wa3RsZW4gLSBwYXR0cmliLT5oZHJsZW47Ci0JCQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQ7OworCQkJcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUOwogCQkJaWYgKGJtY3N0KSB7CiAJCQkJaWYgKCFtZW1jbXAocHNlY3VyaXR5cHJpdi0+WEdycHR4bWlja2V5CiAJCQkJICAgW3BzZWN1cml0eXByaXYtPlhHcnBLZXlpZF0uc2tleSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCmluZGV4IGYxZjBjNjMuLmE2OTJlZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiBzdGF0aWMgdm9pZCByODcxeHVfZGV2X3JlbW92ZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGYpOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpOwogCiAJaWYgKHBhZGFwdGVyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3Avc2Ftc3VuZy1sYXB0b3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCmluZGV4IGFjMmJmMTEuLjcwMWU4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGJhY2tsaWdodF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgYmFja2xpZ2h0X29wcyA9IHsKIAkuZ2V0X2JyaWdodG5lc3MJPSBnZXRfYnJpZ2h0bmVzcywKIAkudXBkYXRlX3N0YXR1cwk9IHVwZGF0ZV9zdGF0dXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmYxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIERYX1NFUAorCXRyaXN0YXRlICJEaXNjcmV0aXggU0VQIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIERpc2NyZXRpeCBTRVAgZHJpdmVyOyB1c2VkIGZvciB0aGUgc2VjdXJpdHkgcHJvY2Vzc29yIHN1YnN5c3RlbQorCSAgb24gYmFyZCB0aGUgSW50ZWwgTW9iaWxlIEludGVybmV0IERldmljZS4KKworCSAgVGhlIGRyaXZlcidzIG5hbWUgaXMgc2VwX2RyaXZlci4KKworCSAgSWYgdW5zdXJlLCBzZWxlY3QgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0RYX1NFUCkgOj0gc2VwX2RyaXZlci5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODljMjQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9UT0RPCkBAIC0wLDAgKzEsNSBAQAorVG9kbydzIHNvIGZhciAoZnJvbSBBbGFuIENveCkKKy0gQ2hlY2sgd2hldGhlciBpdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIGFueSBvZiB0aGUga2VybmVsIGNyeXB0byBBUEkKKyAgaW50ZXJmYWNlcyAtIENyeXB0byBBUEkgJ2dsdWUnIGlzIHN0aWxsIG5vdCByZWFkeSB0byBzdWJtaXQKKy0gQ2xlYW4gdXAgdW51c2VkIGlvY3RscyAtIE5lZWRzIHZlbmRvciBoZWxwCistIENsZWFuIHVwIHVudXNlZCBmaWVsZHMgaW4gaW9jdGwgc3RydWN0dXJlcyAtIE5lZWRzIHZlbmRvciBoZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kZXYuaApAQCAtMCwwICsxLDE1NiBAQAorI2lmbmRlZiBfX1NFUF9ERVZfSF9fCisjZGVmaW5lIF9fU0VQX0RFVl9IX18KKworLyoKKyAqCisgKiAgc2VwX2Rldi5oIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERldmljZSBTdHJ1Y3R1cmVzCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVMKKyAqICAyMDEwLjA5LjE0ICB1cGdyYWRlIHRvIE1lZGZpZWxkCisgKi8KKworc3RydWN0IHNlcF9kZXZpY2UgeworCS8qIHBvaW50ZXIgdG8gcGNpIGRldiAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogY2hhcmFjdGVyIGRldmljZSBmaWxlICovCisJc3RydWN0IGNkZXYgc2VwX2NkZXY7CisJc3RydWN0IGNkZXYgc2VwX2RhZW1vbl9jZGV2OworCXN0cnVjdCBjZGV2IHNlcF9zaW5nbGV0b25fY2RldjsKKworCS8qIGRldmljZXMgKHVzaW5nIG1pc2MgZGV2KSAqLworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfc2VwOworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfc2luZ2xldG9uOworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfZGFlbW9uOworCisJLyogbWFqb3IgLyBtaW5vciBudW1iZXJzIG9mIGRldmljZSAqLworCWRldl90IHNlcF9kZXZubzsKKwlkZXZfdCBzZXBfZGFlbW9uX2Rldm5vOworCWRldl90IHNlcF9zaW5nbGV0b25fZGV2bm87CisKKwlzdHJ1Y3QgbXV0ZXggc2VwX211dGV4OworCXN0cnVjdCBtdXRleCBpb2N0bF9tdXRleDsKKwlzcGlubG9ja190IHNuZF9ycGx5X2xjazsKKworCS8qIGZsYWdzIHRvIGluZGljYXRlIHVzZSBhbmQgbG9jayBzdGF0dXMgb2Ygc2VwICovCisJdTMyIHBpZF9kb2luZ190cmFuc2FjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGluX3VzZV9mbGFnczsKKworCS8qIHJlcXVlc3QgZGFlbW9uIGFscmVhZCBvcGVuICovCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0X2RhZW1vbl9vcGVuOworCisJLyogMSA9IE1vb3Jlc3Rvd247IDAgPSBNZWRmaWVsZCAqLworCWludCBtcnN0OworCisJLyogYWRkcmVzcyBvZiB0aGUgc2hhcmVkIG1lbW9yeSBhbGxvY2F0ZWQgZHVyaW5nIGluaXQgZm9yIFNFUCBkcml2ZXIKKwkgICAoY29oZXJlbnQgYWxsb2MpICovCisJZG1hX2FkZHJfdCBzaGFyZWRfYnVzOworCXNpemVfdCBzaGFyZWRfc2l6ZTsKKwl2b2lkICpzaGFyZWRfYWRkcjsKKworCS8qIHJlc3RyaWN0ZWQgYWNjZXNzIHJlZ2lvbiAoY29oZXJlbnQgYWxsb2MpICovCisJZG1hX2FkZHJfdCByYXJfYnVzOworCXNpemVfdCByYXJfc2l6ZTsKKwl2b2lkICpyYXJfYWRkcjsKKworCS8qIEZpcm13YXJlIHJlZ2lvbnM7IGNhY2hlIGlzIGF0IHJhciBmb3IgTW9vcmVzdG93biBhbmQKKwkgICByZXNpZGVudCBpcyBhdCByYXIgZm9yIE1lZGZpZWxkICovCisJZG1hX2FkZHJfdCBjYWNoZV9idXM7CisJc2l6ZV90IGNhY2hlX3NpemU7CisJdm9pZCAqY2FjaGVfYWRkcjsKKworCWRtYV9hZGRyX3QgcmVzaWRlbnRfYnVzOworCXNpemVfdCByZXNpZGVudF9zaXplOworCXZvaWQgKnJlc2lkZW50X2FkZHI7CisKKwkvKiBzZXAncyBzY3JhdGNocGFkICovCisJZG1hX2FkZHJfdCBkY2FjaGVfYnVzOworCXNpemVfdCBkY2FjaGVfc2l6ZTsKKwl2b2lkICpkY2FjaGVfYWRkcjsKKworCS8qIE9ubHkgdXNlZCBvbiBNZWRmaWVsZCAqLworCWRtYV9hZGRyX3QgZXh0YXBwX2J1czsKKwlzaXplX3QgZXh0YXBwX3NpemU7CisJdm9pZCAqZXh0YXBwX2FkZHI7CisKKwkvKiBzdGFydCBhZGRyZXNzIG9mIHRoZSBhY2Nlc3MgdG8gdGhlIFNFUCByZWdpc3RlcnMgZnJvbSBkcml2ZXIgKi8KKwlkbWFfYWRkcl90IHJlZ19waHlzaWNhbF9hZGRyOworCWRtYV9hZGRyX3QgcmVnX3BoeXNpY2FsX2VuZDsKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyOworCisJLyogd2FpdCBxdWV1ZSBoZWFkIChldmVudCkgb2YgdGhlIGRyaXZlciAqLworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50OworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3JlcXVlc3RfZGFlbW9uOworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X21tYXA7CisKKwlzdHJ1Y3Qgc2VwX2NhbGxlcl9pZF9lbnRyeQorCQljYWxsZXJfaWRfdGFibGVbU0VQX0NBTExFUl9JRF9UQUJMRV9OVU1fRU5UUklFU107CisKKwkvKiBhY2Nlc3MgZmxhZyBmb3Igc2luZ2xldG9uIGRldmljZSAqLworCXVuc2lnbmVkIGxvbmcgc2luZ2xldG9uX2FjY2Vzc19mbGFnOworCisJLyogdHJhbnNhY3Rpb24gY291bnRlciB0aGF0IGNvb3JkaW5hdGVzIHRoZQorCSAgIHRyYW5zYWN0aW9ucyBiZXR3ZWVuIFNFUCBhbmQgSE9TVCAqLworCXVuc2lnbmVkIGxvbmcgc2VuZF9jdDsKKwkvKiBjb3VudGVyIGZvciB0aGUgbWVzc2FnZXMgZnJvbSBzZXAgKi8KKwl1bnNpZ25lZCBsb25nIHJlcGx5X2N0OworCS8qIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGluIHRoZSBwb29sIGZvciB0aGUKKwkgICBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJbG9uZyBkYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkOworCisJdTMyIG51bV9vZl9kYXRhX2FsbG9jYXRpb25zOworCisJLyogbnVtYmVyIG9mIHRoZSBsbGkgdGFibGVzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KKwl1MzIgICAgIG51bV9sbGlfdGFibGVzX2NyZWF0ZWQ7CisKKwkvKiBudW1iZXIgb2YgZGF0YSBjb250cm9sIGJsb2NrcyAqLworCXUzMiBucl9kY2JfY3JlYXQ7CisKKwlzdHJ1Y3Qgc2VwX2RtYV9yZXNvdXJjZSBkbWFfcmVzX2FycltTRVBfTUFYX05VTV9TWU5DX0RNQV9PUFNdOworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VwX3dyaXRlX3JlZyhzdHJ1Y3Qgc2VwX2RldmljZSAqZGV2LCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICphZGRyID0gZGV2LT5yZWdfYWRkciArIHJlZzsKKwl3cml0ZWwodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzZXBfcmVhZF9yZWcoc3RydWN0IHNlcF9kZXZpY2UgKmRldiwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBkZXYtPnJlZ19hZGRyICsgcmVnOworCXJldHVybiByZWFkbChhZGRyKTsKK30KKworLyogd2FpdCBmb3IgU1JBTSB3cml0ZSBjb21wbGV0ZShpbmRpcmVjdCB3cml0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNlcF93YWl0X3NyYW1fd3JpdGUoc3RydWN0IHNlcF9kZXZpY2UgKmRldikKK3sKKwl1MzIgcmVnX3ZhbDsKKwlkbyB7CisJCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoZGV2LCBIV19TUkFNX0RBVEFfUkVBRFlfUkVHX0FERFIpOworCX0gd2hpbGUgKCEocmVnX3ZhbCAmIDEpKTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZDU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCkBAIC0wLDAgKzEsMzU3NyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlci5jIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERyaXZlciBtYWluIGdyb3VwIG9mIGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDA5LjA2LjI2CUluaXRpYWwgcHVibGlzaAorICogIDIwMTAuMDkuMTQgIFVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KKworI2luY2x1ZGUgIi4uL21lbXJhci9tZW1yYXIuaCIKKworI2luY2x1ZGUgInNlcF9kcml2ZXJfaHdfZGVmcy5oIgorI2luY2x1ZGUgInNlcF9kcml2ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAic2VwX2RyaXZlcl9hcGkuaCIKKyNpbmNsdWRlICJzZXBfZGV2LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURFRklORVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTRVBfUkFSX0lPX01FTV9SRUdJT05fU0laRSAweDQwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlHTE9CQUwgdmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEtlZXAgdGhpcyBhIHNpbmdsZSBzdGF0aWMgb2JqZWN0IGZvciBub3cgdG8ga2VlcCB0aGUgY29udmVyc2lvbiBlYXN5ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwX2RldjsKKworLyoqCisgKglzZXBfbG9hZF9maXJtd2FyZSAtIGNvcHkgZmlybXdhcmUgY2FjaGUvcmVzaWRlbnQKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2Ugd2UgYXJlIGxvYWRpbmcKKyAqCisgKglUaGlzIGZ1bmN0aW9ucyBjb3BpZXMgdGhlIGNhY2hlIGFuZCByZXNpZGVudCBmcm9tIHRoZWlyIHNvdXJjZQorICoJbG9jYXRpb24gaW50byBkZXN0aW5hdGlvbiBzaGFyZWQgbWVtb3J5LgorICovCitzdGF0aWMgaW50IHNlcF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljaGFyICpjYWNoZV9uYW1lID0gImNhY2hlLmltYWdlLmJpbiI7CisJY2hhciAqcmVzX25hbWUgPSAicmVzaWRlbnQuaW1hZ2UuYmluIjsKKwljaGFyICpleHRhcHBfbmFtZSA9ICJleHRhcHAuaW1hZ2UuYmluIjsKKwlpbnQgZXJyb3IgOworCXVuc2lnbmVkIGxvbmcgd29yazEsIHdvcmsyLCB3b3JrMzsKKworCS8qIFNldCBhZGRyZXNzZXMgYW5kIGxvYWQgcmVzaWRlbnQgKi8KKwlzZXAtPnJlc2lkZW50X2J1cyA9IHNlcC0+cmFyX2J1czsKKwlzZXAtPnJlc2lkZW50X2FkZHIgPSBzZXAtPnJhcl9hZGRyOworCisJZXJyb3IgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgcmVzX25hbWUsICZzZXAtPnBkZXYtPmRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgcmVzaWRlbnQgZndcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWVtY3B5KHNlcC0+cmVzaWRlbnRfYWRkciwgKHZvaWQgKilmdy0+ZGF0YSwgZnctPnNpemUpOworCXNlcC0+cmVzaWRlbnRfc2l6ZSA9IGZ3LT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyZXNpZGVudCB2aXJ0dWFsIGlzICVwXG4iLAorCQlzZXAtPnJlc2lkZW50X2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVzaWRlbnQgYnVzIGlzICVseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2VwLT5yZXNpZGVudF9idXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVzaWRlbnQgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5yZXNpZGVudF9zaXplKTsKKworCS8qIFNldCBhZGRyZXNzZXMgZm9yIGRjYWNoZSAobm8gbG9hZGluZyBuZWVkZWQpICovCisJd29yazEgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X2J1czsKKwl3b3JrMiA9ICh1bnNpZ25lZCBsb25nKXNlcC0+cmVzaWRlbnRfc2l6ZTsKKwl3b3JrMyA9ICh3b3JrMSArIHdvcmsyICsgKDEwMjQgKiA0KSkgJiAweGZmZmZmMDAwOworCXNlcC0+ZGNhY2hlX2J1cyA9IChkbWFfYWRkcl90KXdvcmszOworCisJd29yazEgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X2FkZHI7CisJd29yazIgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X3NpemU7CisJd29yazMgPSAod29yazEgKyB3b3JrMiArICgxMDI0ICogNCkpICYgMHhmZmZmZjAwMDsKKwlzZXAtPmRjYWNoZV9hZGRyID0gKHZvaWQgKil3b3JrMzsKKworCXNlcC0+ZGNhY2hlX3NpemUgPSAxMDI0ICogMTI4OworCisJLyogU2V0IGFkZHJlc3NlcyBhbmQgbG9hZCBjYWNoZSAqLworCXNlcC0+Y2FjaGVfYnVzID0gc2VwLT5kY2FjaGVfYnVzICsgc2VwLT5kY2FjaGVfc2l6ZTsKKwlzZXAtPmNhY2hlX2FkZHIgPSBzZXAtPmRjYWNoZV9hZGRyICsgc2VwLT5kY2FjaGVfc2l6ZTsKKworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGNhY2hlX25hbWUsICZzZXAtPnBkZXYtPmRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IGNhY2hlIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbWNweShzZXAtPmNhY2hlX2FkZHIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzZXAtPmNhY2hlX3NpemUgPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FjaGUgdmlydHVhbCBpcyAlcFxuIiwKKwkJc2VwLT5jYWNoZV9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhY2hlIGJ1cyBpcyAlMDhseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2VwLT5jYWNoZV9idXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FjaGUgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5jYWNoZV9zaXplKTsKKworCS8qIFNldCBhZGRyZXNzZXMgYW5kIGxvYWQgZXh0YXBwICovCisJc2VwLT5leHRhcHBfYnVzID0gc2VwLT5jYWNoZV9idXMgKyAoMTAyNCAqIDM3MCk7CisJc2VwLT5leHRhcHBfYWRkciA9IHNlcC0+Y2FjaGVfYWRkciArICgxMDI0ICogMzcwKTsKKworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGV4dGFwcF9uYW1lLCAmc2VwLT5wZGV2LT5kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBleHRhcHAgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWVtY3B5KHNlcC0+ZXh0YXBwX2FkZHIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzZXAtPmV4dGFwcF9zaXplID0gZnctPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImV4dGFwcCB2aXJ0dWFsIGlzICVwXG4iLAorCQlzZXAtPmV4dGFwcF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImV4dGFwcCBidXMgaXMgJTA4bGx4XG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXNlcC0+ZXh0YXBwX2J1cyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHRhcHAgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5leHRhcHBfc2l6ZSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK01PRFVMRV9GSVJNV0FSRSgic2VwL2NhY2hlLmltYWdlLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJzZXAvcmVzaWRlbnQuaW1hZ2UuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInNlcC9leHRhcHAuaW1hZ2UuYmluIik7CisKKy8qKgorICoJc2VwX2R1bXBfbWVzc2FnZSAtIGR1bXAgdGhlIG1lc3NhZ2UgdGhhdCBpcyBwZW5kaW5nCisgKglAc2VwOiBTRVAgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHNlcF9kdW1wX21lc3NhZ2Uoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgY291bnQ7CisJdTMyICpwID0gc2VwLT5zaGFyZWRfYWRkcjsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMiAqIDQ7IGNvdW50ICs9IDQpCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiV29yZCAlZCBvZiB0aGUgbWVzc2FnZSBpcyAleFxuIiwKKwkJCQkJCQkJY291bnQsICpwKyspOworfQorCisvKioKKyAqCXNlcF9tYXBfYW5kX2FsbG9jX3NoYXJlZF9hcmVhIC0JYWxsb2NhdGUgc2hhcmVkIGJsb2NrCisgKglAc2VwOiBzZWN1cml0eSBwcm9jZXNzb3IKKyAqCUBzaXplOiBzaXplIG9mIHNoYXJlZCBhcmVhCisgKi8KK3N0YXRpYyBpbnQgc2VwX21hcF9hbmRfYWxsb2Nfc2hhcmVkX2FyZWEoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlzZXAtPnNoYXJlZF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwKKwkJc2VwLT5zaGFyZWRfc2l6ZSwKKwkJJnNlcC0+c2hhcmVkX2J1cywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNlcC0+c2hhcmVkX2FkZHIpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJInNoYXJlZCBtZW1vcnkgZG1hX2FsbG9jX2NvaGVyZW50IGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNoYXJlZF9hZGRyICV6eCBieXRlcyBAJXAgKGJ1cyAlbGx4KVxuIiwKKwkJCQlzZXAtPnNoYXJlZF9zaXplLCBzZXAtPnNoYXJlZF9hZGRyLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5zaGFyZWRfYnVzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfdW5tYXBfYW5kX2ZyZWVfc2hhcmVkX2FyZWEgLSBmcmVlIHNoYXJlZCBibG9jaworICoJQHNlcDogc2VjdXJpdHkgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyB2b2lkIHNlcF91bm1hcF9hbmRfZnJlZV9zaGFyZWRfYXJlYShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2hhcmVkIGFyZWEgdW5tYXAgYW5kIGZyZWVcbiIpOworCWRtYV9mcmVlX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwgc2VwLT5zaGFyZWRfc2l6ZSwKKwkJCQlzZXAtPnNoYXJlZF9hZGRyLCBzZXAtPnNoYXJlZF9idXMpOworfQorCisvKioKKyAqCXNlcF9zaGFyZWRfYnVzX3RvX3ZpcnQgLSBjb252ZXJ0IGJ1cy92aXJ0IGFkZHJlc3NlcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGJ1c19hZGRyZXNzOiBhZGRyZXNzIHRvIGNvbnZlcnQKKyAqCisgKglSZXR1cm5zIHZpcnR1YWwgYWRkcmVzcyBpbnNpZGUgdGhlIHNoYXJlZCBhcmVhIGFjY29yZGluZworICoJdG8gdGhlIGJ1cyBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZCAqc2VwX3NoYXJlZF9idXNfdG9fdmlydChzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCQkJCQkJZG1hX2FkZHJfdCBidXNfYWRkcmVzcykKK3sKKwlyZXR1cm4gc2VwLT5zaGFyZWRfYWRkciArIChidXNfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2J1cyk7Cit9CisKKy8qKgorICoJb3BlbiBmdW5jdGlvbiBmb3IgdGhlIHNpbmdsZXRvbiBkcml2ZXIKKyAqCUBpbm9kZV9wdHIgc3RydWN0IGlub2RlICoKKyAqCUBmaWxlX3B0ciBzdHJ1Y3QgZmlsZSAqCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIHNpbmdsZXRvbiBkZXZpY2UgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NpbmdsZXRvbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZV9wdHIpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJLyoKKwkgKiBHZXQgdGhlIFNFUCBkZXZpY2Ugc3RydWN0dXJlIGFuZCB1c2UgaXQgZm9yIHRoZQorCSAqIHByaXZhdGVfZGF0YSBmaWVsZCBpbiBmaWxwIGZvciBvdGhlciBtZXRob2RzCisJICovCisJc2VwID0gc2VwX2RldjsKKworCWZpbGVfcHRyLT5wcml2YXRlX2RhdGEgPSBzZXA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlNpbmdsZXRvbiBvcGVuIGZvciBwaWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhbGxpbmcgdGVzdCBhbmQgc2V0IGZvciBzaW5nbGV0b24gMFxuIik7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNlcC0+c2luZ2xldG9uX2FjY2Vzc19mbGFnKSkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2luZ2xldG9uX29wZW4gZW5kXG4iKTsKK2VuZF9mdW5jdGlvbjoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX29wZW4gLSBkZXZpY2Ugb3BlbiBtZXRob2QKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIHRvIFNFUCBkZXZpY2UKKyAqCisgKglPcGVuIG1ldGhvZCBmb3IgdGhlIFNFUCBkZXZpY2UuIENhbGxlZCB3aGVuIHVzZXJzcGFjZSBvcGVucworICoJdGhlIFNFUCBkZXZpY2Ugbm9kZS4KKyAqCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzZXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJLyoKKwkgKiBHZXQgdGhlIFNFUCBkZXZpY2Ugc3RydWN0dXJlIGFuZCB1c2UgaXQgZm9yIHRoZQorCSAqIHByaXZhdGVfZGF0YSBmaWVsZCBpbiBmaWxwIGZvciBvdGhlciBtZXRob2RzCisJICovCisJc2VwID0gc2VwX2RldjsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBzZXA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIk9wZW4gZm9yIHBpZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCS8qIEFueW9uZSBjYW4gb3BlbjsgbG9ja2luZyB0YWtlcyBwbGFjZSBhdCB0cmFuc2FjdGlvbiBsZXZlbCAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zaW5nbGV0b25fcmVsZWFzZSAtIGNsb3NlIGEgU0VQIHNpbmdsZXRvbiBkZXZpY2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGV2aWNlLiBBcyB0aGUgb3BlbiBwcm90ZWN0cyBhZ2FpbnN0CisgKgltdWx0aXBsZSBzaW11bHRhZW5vdXMgb3BlbnMgdGhhdCBtZWFucyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqCWZpbmFsIHJlZmVyZW5jZSB0byB0aGUgb3BlbiBoYW5kbGUgaXMgZHJvcHBlZC4KKyAqLworc3RhdGljIGludCBzZXBfc2luZ2xldG9uX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiU2luZ2xldG9uIHJlbGVhc2UgZm9yIHBpZCAlZFxuIiwKKwkJCQkJCQljdXJyZW50LT5waWQpOworCWNsZWFyX2JpdCgwLCAmc2VwLT5zaW5nbGV0b25fYWNjZXNzX2ZsYWcpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9yZXF1ZXN0X2RhZW1vbm9wZW4gLSByZXF1ZXN0IGRhZW1vbiBvcGVuIG1ldGhvZAorICoJQGlub2RlOiBpbm9kZSBvZiBTRVAgZGV2aWNlCisgKglAZmlscDogZmlsZSBoYW5kbGUgdG8gU0VQIGRldmljZQorICoKKyAqCU9wZW4gbWV0aG9kIGZvciB0aGUgU0VQIHJlcXVlc3QgZGFlbW9uLiBDYWxsZWQgd2hlbgorICoJcmVxdWVzdCBkYWVtb24gaW4gdXNlcnNwYWNlIG9wZW5zIHRoZSBTRVAgZGV2aWNlIG5vZGUuCisgKgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlcXVlc3RfZGFlbW9uX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IHNlcF9kZXY7CisJaW50IGVycm9yID0gMDsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHNlcDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiUmVxdWVzdCBkYWVtb24gb3BlbiBmb3IgcGlkICVkXG4iLAorCQljdXJyZW50LT5waWQpOworCisJLyogVGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgb25seSBvbmUgcmVxdWVzdCBkYWVtb24gKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhbGxpbmcgdGVzdCBhbmQgc2V0IGZvciByZXFfZG1vbiBvcGVuIDBcbiIpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzZXAtPnJlcXVlc3RfZGFlbW9uX29wZW4pKQorCQllcnJvciA9IC1FQlVTWTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX3JlbGVhc2UgLSBjbG9zZSBhIFNFUCBkYWVtb24KKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGFlbW9uLgorICovCitzdGF0aWMgaW50IHNlcF9yZXF1ZXN0X2RhZW1vbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlJlcXVlcyBkYWVtb24gcmVsZWFzZSBmb3IgcGlkICVkXG4iLAorCQljdXJyZW50LT5waWQpOworCisJLyogQ2xlYXIgdGhlIHJlcXVlc3RfZGFlbW9uX29wZW4gZmxhZyAqLworCWNsZWFyX2JpdCgwLCAmc2VwLT5yZXF1ZXN0X2RhZW1vbl9vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciAtIHBva2UgdGhlIFNFUAorICoJQHNlcDogc3RydWN0IHNlcF9kZXZpY2UgKgorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmFpc2VzIGludGVycnVwdCB0byBTRVBtIHRoYXQgc2lnbmFscyB0aGF0IGlzIGhhcyBhCisgKgluZXcgY29tbWFuZCBmcm9tIEhPU1QKKyAqLworc3RhdGljIGludCBzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXVuc2lnbmVkIGxvbmcgbGNrX2ZsYWdzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciBzdGFydFxuIik7CisKKwlzZXBfZHVtcF9tZXNzYWdlKHNlcCk7CisKKwkvKiBDb3VudGVycyBhcmUgbG9ja2FibGUgcmVnaW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCXNlcC0+c2VuZF9jdCsrOworCXNlcC0+cmVwbHlfY3QrKzsKKworCS8qIFNlbmQgdGhlIGludGVycnVwdCB0byBTRVAgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIyX1JFR19BRERSLCBzZXAtPnNlbmRfY3QpOworCXNlcC0+c2VuZF9jdCsrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9yZXFfZGFlbW9uX3NlbmRfcmVwbHkgc2VuZF9jdCAlbHggcmVwbHlfY3QgJWx4XG4iLAorCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciBlbmRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKglzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyIC0gZnJlZSBETUEgdGFibGUKKyAqCUBzZXA6IHBvaW50ZXJlIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJSGFuZGxlcyB0aGUgcmVxdWVzdCB0byAgZnJlZSBETUEgdGFibGUgZm9yIHN5bmNocm9uaWMgYWN0aW9ucworICovCitzdGF0aWMgaW50IHNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgY291bnQ7CisJaW50IGRjYl9jb3VudGVyOworCS8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZG1hX3Jlc291cmNlIHN0cnVjdCAqLworCXN0cnVjdCBzZXBfZG1hX3Jlc291cmNlICpkbWE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIgc3RhcnRcbiIpOworCisJZm9yIChkY2JfY291bnRlciA9IDA7IGRjYl9jb3VudGVyIDwgc2VwLT5ucl9kY2JfY3JlYXQ7IGRjYl9jb3VudGVyKyspIHsKKwkJZG1hID0gJnNlcC0+ZG1hX3Jlc19hcnJbZGNiX2NvdW50ZXJdOworCisJCS8qIFVubWFwIGFuZCBmcmVlIGlucHV0IG1hcCBhcnJheSAqLworCQlpZiAoZG1hLT5pbl9tYXBfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+aW5fbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCQkJZG1hX3VubWFwX3BhZ2UoJnNlcC0+cGRldi0+ZGV2LAorCQkJCQlkbWEtPmluX21hcF9hcnJheVtjb3VudF0uZG1hX2FkZHIsCisJCQkJCWRtYS0+aW5fbWFwX2FycmF5W2NvdW50XS5zaXplLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCX0KKwkJCWtmcmVlKGRtYS0+aW5fbWFwX2FycmF5KTsKKwkJfQorCisJCS8qIFVubWFwIG91dHB1dCBtYXAgYXJyYXksIERPTidUIGZyZWUgaXQgeWV0ICovCisJCWlmIChkbWEtPm91dF9tYXBfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+b3V0X251bV9wYWdlczsgY291bnQrKykgeworCQkJCWRtYV91bm1hcF9wYWdlKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkJZG1hLT5vdXRfbWFwX2FycmF5W2NvdW50XS5kbWFfYWRkciwKKwkJCQkJZG1hLT5vdXRfbWFwX2FycmF5W2NvdW50XS5zaXplLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJfQorCQkJa2ZyZWUoZG1hLT5vdXRfbWFwX2FycmF5KTsKKwkJfQorCisJCS8qIEZyZWUgcGFnZSBjYWNoZSBmb3Igb3V0cHV0ICovCisJCWlmIChkbWEtPmluX3BhZ2VfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+aW5fbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZG1hLT5pbl9wYWdlX2FycmF5W2NvdW50XSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRtYS0+aW5fcGFnZV9hcnJheVtjb3VudF0pOworCQkJfQorCQkJa2ZyZWUoZG1hLT5pbl9wYWdlX2FycmF5KTsKKwkJfQorCisJCWlmIChkbWEtPm91dF9wYWdlX2FycmF5KSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBkbWEtPm91dF9udW1fcGFnZXM7IGNvdW50KyspIHsKKwkJCQlpZiAoIVBhZ2VSZXNlcnZlZChkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSkpCisJCQkJCVNldFBhZ2VEaXJ0eShkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZG1hLT5vdXRfcGFnZV9hcnJheVtjb3VudF0pOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSk7CisJCQl9CisJCQlrZnJlZShkbWEtPm91dF9wYWdlX2FycmF5KTsKKwkJfQorCisJCS8qIFJlc2V0IGFsbCB0aGUgdmFsdWVzICovCisJCWRtYS0+aW5fcGFnZV9hcnJheSA9IE5VTEw7CisJCWRtYS0+b3V0X3BhZ2VfYXJyYXkgPSBOVUxMOworCQlkbWEtPmluX251bV9wYWdlcyA9IDA7CisJCWRtYS0+b3V0X251bV9wYWdlcyA9IDA7CisJCWRtYS0+aW5fbWFwX2FycmF5ID0gTlVMTDsKKwkJZG1hLT5vdXRfbWFwX2FycmF5ID0gTlVMTDsKKwkJZG1hLT5pbl9tYXBfbnVtX2VudHJpZXMgPSAwOworCQlkbWEtPm91dF9tYXBfbnVtX2VudHJpZXMgPSAwOworCX0KKworCXNlcC0+bnJfZGNiX2NyZWF0ID0gMDsKKwlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX21tYXAgLSBtYXBzIHRoZSBzaGFyZWQgYXJlYSB0byB1c2VyIHNwYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHZtYTogcG9pbnRlciB0byB2bV9hcmVhX3N0cnVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUga2VybmVsIHdoZW4gdGhlIGRhZW1vbiBhdHRlbXB0cyBhbiBtbWFwKCkgc3lzY2FsbAorICoJdXNpbmcgb3VyIGhhbmRsZS4KKyAqLworc3RhdGljIGludCBzZXBfcmVxdWVzdF9kYWVtb25fbW1hcChzdHJ1Y3QgZmlsZSAgKmZpbHAsCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICAqdm1hKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZG1hX2FkZHJfdCBidXNfYWRkcmVzczsKKwlpbnQgZXJyb3IgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gbW1hcCBzdGFydFxuIik7CisKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBTRVBfRFJJVkVSX01NTUFQX0FSRUFfU0laRSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzICovCisJYnVzX2FkZHJlc3MgPSBzZXAtPnNoYXJlZF9idXM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJ1c19hZGRyZXNzIGlzICUwOGx4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZylidXNfYWRkcmVzcyk7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgYnVzX2FkZHJlc3MgPj4gUEFHRV9TSElGVCwKKwkJdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJyZW1hcF9wYWdlX3JhbmdlIGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gbW1hcCBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmVxdWVzdF9kYWVtb25fcG9sbCAtIHBvbGwgaW1wbGVtZW50YXRpb24KKyAqCUBzZXA6IHN0cnVjdCBzZXBfZGV2aWNlICogZm9yIGN1cnJlbnQgU0VQIGRldmljZQorICoJQGZpbHA6IHN0cnVjdCBmaWxlICogZm9yIG9wZW4gZmlsZQorICoJQHdhaXQ6IHBvbGxfdGFibGUgKiBmb3IgcG9sbAorICoKKyAqCUNhbGxlZCB3aGVuIG91ciBkZXZpY2UgaXMgcGFydCBvZiBhIHBvbGwoKSBvciBzZWxlY3QoKSBzeXNjYWxsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VwX3JlcXVlc3RfZGFlbW9uX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJcG9sbF90YWJsZSAgKndhaXQpCit7CisJdTMyCW1hc2sgPSAwOworCS8qIEdQUjIgcmVnaXN0ZXIgKi8KKwl1MzIJcmV0dmFsMjsKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogc3RhcnRcbiIpOworCisJcG9sbF93YWl0KGZpbHAsICZzZXAtPmV2ZW50X3JlcXVlc3RfZGFlbW9uLCB3YWl0KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIHBvbGw6IHNlbmRfY3QgaXMgJWx4IHJlcGx5IGN0IGlzICVseFxuIiwKKwkJCQkJCXNlcC0+c2VuZF9jdCwgc2VwLT5yZXBseV9jdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJLyogQ2hlY2sgaWYgdGhlIGRhdGEgaXMgcmVhZHkgKi8KKwlpZiAoc2VwLT5zZW5kX2N0ID09IHNlcC0+cmVwbHlfY3QpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisKKwkJcmV0dmFsMiA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImRhZW1vbiBwb2xsOiBkYXRhIGNoZWNrIChHUFIyKSBpcyAleFxuIiwgcmV0dmFsMik7CisKKwkJLyogQ2hlY2sgaWYgUFJJTlQgcmVxdWVzdCAqLworCQlpZiAoKHJldHZhbDIgPj4gMzApICYgMHgxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBwb2xsOiBQUklOVEYgcmVxdWVzdCBpblxuIik7CisJCQltYXNrIHw9IFBPTExJTjsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQl9CisJCS8qIENoZWNrIGlmIE5WUyByZXF1ZXN0ICovCisJCWlmIChyZXR2YWwyID4+IDMxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBwb2xsOiBOVlMgcmVxdWVzdCBpblxuIik7CisJCQltYXNrIHw9IFBPTExQUkkgfCBQT0xMV1JOT1JNOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImRhZW1vbiBwb2xsOiBubyByZXBseSByZWNlaXZlZDsgcmV0dXJuaW5nIDBcbiIpOworCQltYXNrID0gMDsKKwl9CitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogZXhpdFxuIik7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJc2VwX3JlbGVhc2UgLSBjbG9zZSBhIFNFUCBkZXZpY2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHNlcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlJlbGVhc2UgZm9yIHBpZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwkvKiBJcyB0aGlzIHRoZSBwcm9jZXNzIHRoYXQgaGFzIGEgdHJhbnNhY3Rpb24gb3Blbj8KKwkgKiBJZiBzbywgbGV0cyByZXNldCBwaWRfZG9pbmdfdHJhbnNhY3Rpb24gdG8gMCBhbmQKKwkgKiBjbGVhciB0aGUgaW4gdXNlIGZsYWdzLCBhbmQgdGhlbiB3YWtlIHVwIHNlcF9ldmVudAorCSAqIHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGNhbiBkbyB0cmFuc2FjdGlvbnMKKwkgKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIndha2luZyB1cCBldmVudCBhbmQgbW1hcF9ldmVudFxuIik7CisJaWYgKHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID09IGN1cnJlbnQtPnBpZCkgeworCQljbGVhcl9iaXQoU0VQX01NQVBfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJCWNsZWFyX2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKwkJd2FrZV91cCgmc2VwLT5ldmVudCk7CisJCXNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfbW1hcCAtICBtYXBzIHRoZSBzaGFyZWQgYXJlYSB0byB1c2VyIHNwYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHZtYTogcG9pbnRlciB0byB2bV9hcmVhX3N0cnVjdAorICoKKyAqCUNhbGxlZCBvbiBhbiBtbWFwIG9mIG91ciBzcGFjZSB2aWEgdGhlIG5vcm1hbCBTRVAgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRtYV9hZGRyX3QgYnVzX2FkZHI7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGVycm9yID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibW1hcCBzdGFydFxuIik7CisKKwkvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGJ1c3kgKG93biB0aGUgZGV2aWNlKSAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXAtPmV2ZW50LAorCQl0ZXN0X2FuZF9zZXRfYml0KFNFUF9NTUFQX0xPQ0tfQklULAorCQkmc2VwLT5pbl91c2VfZmxhZ3MpID09IDApOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCWVycm9yID0gLUVJTlRSOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yOworCX0KKwkvKgorCSAqIFRoZSBwaWRfZG9pbmdfdHJhbnNhY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9jZXNzCisJICogbm93IG93bnMgdGhlIGZhY2lsaXRpZXMgdG8gcGVyZm9ybWEgYSB0cmFuc2FjdGlvbiB3aXRoCisJICogdGhlIFNFUC4gV2hpbGUgdGhpcyBwcm9jZXNzIGlzIHBlcmZvcm1pbmcgYSB0cmFuc2FjdGlvbiwKKwkgKiBubyBvdGhlciBwcm9jZXNzIHdobyBoYXMgdGhlIFNFUCBkZXZpY2Ugb3BlbiBjYW4gcGVyZm9ybQorCSAqIGFueSB0cmFuc2FjdGlvbnMuIFRoaXMgbWV0aG9kIGFsbG93cyBtb3JlIHRoYW4gb25lIHByb2Nlc3MKKwkgKiB0byBoYXZlIHRoZSBkZXZpY2Ugb3BlbiBhdCBhbnkgZ2l2ZW4gdGltZSwgd2hpY2ggcHJvdmlkZXMKKwkgKiBmaW5lciBncmFudWxhcml0eSBmb3IgZGV2aWNlIHV0aWxpemF0aW9uIGJ5IG11bHRpcGxlCisJICogcHJvY2Vzc2VzLgorCSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IGN1cnJlbnQtPnBpZDsKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIFplcm8gdGhlIHBvb2xzIGFuZCB0aGUgbnVtYmVyIG9mIGRhdGEgcG9vbCBhbG9jYXRpb24gcG9pbnRlcnMgKi8KKwlzZXAtPmRhdGFfcG9vbF9ieXRlc19hbGxvY2F0ZWQgPSAwOworCXNlcC0+bnVtX29mX2RhdGFfYWxsb2NhdGlvbnMgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSBtYXBwZWQgcmFuZ2UgaXMgYXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UKKwkgKiBzaGFyZWQgYXJlYQorCSAqLworCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+IFNFUF9EUklWRVJfTU1NQVBfQVJFQV9TSVpFKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoYXJlZF9hZGRyIGlzICVwXG4iLCBzZXAtPnNoYXJlZF9hZGRyKTsKKworCS8qIEdldCBidXMgYWRkcmVzcyAqLworCWJ1c19hZGRyID0gc2VwLT5zaGFyZWRfYnVzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJidXNfYWRkcmVzcyBpcyAlbHhcbiIsICh1bnNpZ25lZCBsb25nKWJ1c19hZGRyKTsKKworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBidXNfYWRkciA+PiBQQUdFX1NISUZULAorCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJyZW1hcF9wYWdlX3JhbmdlIGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJtbWFwIGVuZFxuIik7CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yOgorCS8qIENsZWFyIHRoZSBiaXQgKi8KKwljbGVhcl9iaXQoU0VQX01NQVBfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJbXV0ZXhfbG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCXNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID0gMDsKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIFJhaXNlIGV2ZW50IGZvciBzdHVjayBjb250ZXh0ZXMgKi8KKworCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1tYXAgZXJyb3IgLSB3YWtpbmcgdXAgZXZlbnRcbiIpOworCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCitlbmRfZnVuY3Rpb246CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9wb2xsIC0gcG9sbCBoYW5kbGVyCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHdhaXQ6IHBvaW50ZXIgdG8gcG9sbF90YWJsZQorICoKKyAqCUNhbGxlZCBieSB0aGUgT1Mgd2hlbiB0aGUga2VybmVsIGlzIGFza2VkIHRvIGRvIGEgcG9sbCBvbgorICoJYSBTRVAgZmlsZSBoYW5kbGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VwX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdTMyIG1hc2sgPSAwOworCXUzMiByZXR2YWwgPSAwOworCXUzMiByZXR2YWwyID0gMDsKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IHN0YXJ0XG4iKTsKKworCS8qIEFtIEkgdGhlIHByb2Nlc3MgdGhhdCBvd25zIHRoZSB0cmFuc2FjdGlvbj8gKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJaWYgKGN1cnJlbnQtPnBpZCAhPSBzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJwb2xsOyB3cm9uZyBwaWRcbiIpOworCQltYXNrID0gUE9MTEVSUjsKKwkJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIENoZWNrIGlmIHNlbmQgY29tbWFuZCBvciBzZW5kX3JlcGx5IHdlcmUgYWN0aXZhdGVkIHByZXZpb3VzbHkgKi8KKwlpZiAoIXRlc3RfYml0KFNFUF9TRU5EX01TR19MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKSkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJwb2xsOyBsb2NrIGJpdCBzZXRcbiIpOworCQltYXNrID0gUE9MTEVSUjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWRkIHRoZSBldmVudCB0byB0aGUgcG9sbGluZyB3YWl0IHRhYmxlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBjYWxsaW5nIHdhaXQgc2VwX2V2ZW50XG4iKTsKKworCXBvbGxfd2FpdChmaWxwLCAmc2VwLT5ldmVudCwgd2FpdCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IHNlbmRfY3QgaXMgJWx4IHJlcGx5IGN0IGlzICVseFxuIiwKKwkJc2VwLT5zZW5kX2N0LCBzZXAtPnJlcGx5X2N0KTsKKworCS8qIENoZWNrIGlmIGVycm9yIG9jY3VyZWQgZHVyaW5nIHBvbGwgKi8KKwlyZXR2YWwyID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIzX1JFR19BRERSKTsKKwlpZiAocmV0dmFsMiAhPSAweDApIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicG9sbDsgcG9sbCBlcnJvciAleFxuIiwgcmV0dmFsMik7CisJCW1hc2sgfD0gUE9MTEVSUjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJaWYgKHNlcC0+c2VuZF9jdCA9PSBzZXAtPnJlcGx5X2N0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCQlyZXR2YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IGRhdGEgcmVhZHkgY2hlY2sgKEdQUjIpICAleFxuIiwKKwkJCXJldHZhbCk7CisKKwkJLyogQ2hlY2sgaWYgcHJpbnRmIHJlcXVlc3QgICovCisJCWlmICgocmV0dmFsID4+IDMwKSAmIDB4MSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBTRVAgcHJpbnRmIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZSB0aGlzIGlzIFNFUCByZXBseSBvciByZXF1ZXN0ICovCisJCWlmIChyZXR2YWwgPj4gMzEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicG9sbDogU0VQIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IG5vcm1hbCByZXR1cm5cbiIpOworCQkJLyogSW4gY2FzZSBpdCBpcyBhZ2FpbiBieSBzZW5kX3JlcGx5X2NvbWFuZCAqLworCQkJY2xlYXJfYml0KFNFUF9TRU5EX01TR19MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKTsKKwkJCXNlcF9kdW1wX21lc3NhZ2Uoc2VwKTsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJwb2xsOyBTRVAgcmVwbHkgUE9MTElOIHwgUE9MTFJETk9STVxuIik7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicG9sbDsgbm8gcmVwbHkgcmVjZWl2ZWQ7IHJldHVybmluZyBtYXNrIG9mIDBcbiIpOworCQltYXNrID0gMDsKKwl9CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IGVuZFxuIik7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJc2VwX3RpbWVfYWRkcmVzcyAtIGFkZHJlc3MgaW4gU0VQIG1lbW9yeSBvZiB0aW1lCisgKglAc2VwOiBTRVAgZGV2aWNlIHdlIHdhbnQgdGhlIGFkZHJlc3MgZnJvbQorICoKKyAqCVJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgdHdvIGR3b3JkcyBpbiBtZW1vcnkgdXNlZCBmb3IgdGltZQorICoJc2V0dGluZy4KKyAqLworc3RhdGljIHUzMiAqc2VwX3RpbWVfYWRkcmVzcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXJldHVybiBzZXAtPnNoYXJlZF9hZGRyICsgU0VQX0RSSVZFUl9TWVNURU1fVElNRV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTOworfQorCisvKioKKyAqCXNlcF9zZXRfdGltZSAtIHNldCB0aGUgU0VQIHRpbWUKKyAqCUBzZXA6IHRoZSBTRVAgd2UgYXJlIHNldHRpbmcgdGhlIHRpbWUgZm9yCisgKgorICoJQ2FsY3VsYXRlcyB0aW1lIGFuZCBzZXRzIGl0IGF0IHRoZSBwcmVkZWZpbmVkIGFkZHJlc3MuCisgKglDYWxsZWQgd2l0aCB0aGUgU0VQIG11dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNlcF9zZXRfdGltZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisJdTMyICp0aW1lX2FkZHI7CS8qIEFkZHJlc3Mgb2YgdGltZSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwgKi8KKworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X3RpbWUgc3RhcnRcbiIpOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0aW1lKTsKKworCS8qIFNldCB2YWx1ZSBpbiB0aGUgU1lTVEVNIE1FTU9SWSBvZmZzZXQgKi8KKwl0aW1lX2FkZHIgPSBzZXBfdGltZV9hZGRyZXNzKHNlcCk7CisKKwl0aW1lX2FkZHJbMF0gPSBTRVBfVElNRV9WQUxfVE9LRU47CisJdGltZV9hZGRyWzFdID0gdGltZS50dl9zZWM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInRpbWUudHZfc2VjIGlzICVsdVxuIiwgdGltZS50dl9zZWMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGltZV9hZGRyIGlzICVwXG4iLCB0aW1lX2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwLT5zaGFyZWRfYWRkciBpcyAlcFxuIiwgc2VwLT5zaGFyZWRfYWRkcik7CisKKwlyZXR1cm4gdGltZS50dl9zZWM7Cit9CisKKy8qKgorICoJc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlciAtIGluc2VydCBjYWxsZXIgaWQgZW50cnkKKyAqCUBzZXA6IFNFUCBkZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gc3RydWN0IGNhbGxlcl9pZF9zdHJ1Y3QKKyAqCisgKglJbnNlcnRzIHRoZSBkYXRhIGludG8gdGhlIGNhbGxlciBpZCB0YWJsZS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KKyAqCWZhbGxzIHVuZGVyIHRoZSBpb2N0bCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqaGFzaDsKKwlpbnQgICBlcnJvciA9IDA7CisJaW50ICAgaTsKKwlzdHJ1Y3QgY2FsbGVyX2lkX3N0cnVjdCBjb21tYW5kX2FyZ3M7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIgc3RhcnRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVM7IGkrKykgeworCQlpZiAoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0ucGlkID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm5vIG1vcmUgY2FsbGVyIGlkIGVudHJpZXMgbGVmdFxuIik7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1heGltdW0gbnVtYmVyIGlzICVkXG4iLAorCQkJCQlTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTKTsKKwkJZXJyb3IgPSAtRVVTRVJTOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDb3B5IHRoZSBkYXRhICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJc2l6ZW9mKGNvbW1hbmRfYXJncykpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJaGFzaCA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5jYWxsZXJJZEFkZHJlc3M7CisKKwlpZiAoIWNvbW1hbmRfYXJncy5waWQgfHwgIWNvbW1hbmRfYXJncy5jYWxsZXJJZFNpemVJbkJ5dGVzKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwaWQgaXMgJXhcbiIsIGNvbW1hbmRfYXJncy5waWQpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FsbGVySWRTaXplSW5CeXRlcyBpcyAleFxuIiwKKwkJY29tbWFuZF9hcmdzLmNhbGxlcklkU2l6ZUluQnl0ZXMpOworCisJaWYgKGNvbW1hbmRfYXJncy5jYWxsZXJJZFNpemVJbkJ5dGVzID4KKwkJCQkJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpIHsKKwkJZXJyb3IgPSAtRU1TR1NJWkU7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCXNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLnBpZCA9IGNvbW1hbmRfYXJncy5waWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0uY2FsbGVySWRIYXNoLAorCQloYXNoLCBjb21tYW5kX2FyZ3MuY2FsbGVySWRTaXplSW5CeXRlcykpCisJCWVycm9yID0gLUVGQVVMVDsKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZCAtIHNldCB0aGUgY2FsbGVyIGlkCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdF9zZXBfZGV2aWNlCisgKgorICoJU2V0IHRoZSBjYWxsZXIgSUQgKGlmIGl0IGV4aXN0cykgdG8gdGhlIFNFUC4gTm90ZSB0aGF0IHRoaXMKKyAqCWZ1bmN0aW9uIGZhbGxzIHVuZGVyIHRoZSBpb2N0bCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZChzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWludCBpOworCXUzMiAqaGFzaF9idWZfcHRyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X2N1cnJlbnRfY2FsbGVyX2lkIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImN1cnJlbnQgcHJvY2VzcyBpcyAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCS8qIFplcm8gdGhlIHByZXZpb3VzIHZhbHVlICovCisJbWVtc2V0KHNlcC0+c2hhcmVkX2FkZHIgKyBTRVBfQ0FMTEVSX0lEX09GRlNFVF9CWVRFUywKKwkJCQkJMCwgU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpOworCisJZm9yIChpID0gMDsgaSA8IFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVM7IGkrKykgeworCQlpZiAoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0ucGlkID09IGN1cnJlbnQtPnBpZCkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJDYWxsZXIgSWQgZm91bmRcbiIpOworCisJCQltZW1jcHkoc2VwLT5zaGFyZWRfYWRkciArIFNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTLAorCQkJCSh2b2lkICopKHNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLmNhbGxlcklkSGFzaCksCisJCQkJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogRW5zdXJlIGRhdGEgaXMgaW4gbGl0dGxlIGVuZGlhbiAqLworCWhhc2hfYnVmX3B0ciA9ICh1MzIgKilzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0NBTExFUl9JRF9PRkZTRVRfQllURVM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fV09SRFM7IGkrKykKKwkJaGFzaF9idWZfcHRyW2ldID0gY3B1X3RvX2xlMzIoaGFzaF9idWZfcHRyW2ldKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZCBlbmRcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlciAtIGtpY2sgb2ZmIGEgY29tbWFuZAorICoJQHNlcDogU0VQIGJlaW5nIHNpZ25hbGxlZAorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmFpc2VzIGludGVycnVwdCB0byBTRVAgdGhhdCBzaWduYWxzIHRoYXQgaXMgaGFzIGEgbmV3CisgKgljb21tYW5kIGZyb20gdGhlIGhvc3QKKyAqCisgKiAgICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgZmFsbCB1bmRlciB0aGUgaW9jdGwgbG9jaworICovCitzdGF0aWMgaW50IHNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXVuc2lnbmVkIGxvbmcgbGNrX2ZsYWdzOworCWludCBlcnJvciA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncykpIHsKKwkJZXJyb3IgPSAtRVBST1RPOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJc2VwX3NldF90aW1lKHNlcCk7CisKKwlzZXBfc2V0X2N1cnJlbnRfY2FsbGVyX2lkKHNlcCk7CisKKwlzZXBfZHVtcF9tZXNzYWdlKHNlcCk7CisKKwkvKiBVcGRhdGUgY291bnRlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwlzZXAtPnNlbmRfY3QrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX3NlbmRfY29tbWFuZF9oYW5kbGVyIHNlbmRfY3QgJWx4IHJlcGx5X2N0ICVseFxuIiwKKwkJCQkJCXNlcC0+c2VuZF9jdCwgc2VwLT5yZXBseV9jdCk7CisKKwkvKiBTZW5kIGludGVycnVwdCB0byBTRVAgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIwX1JFR19BRERSLCAweDIpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2VuZF9jb21tYW5kX2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciAtYWxsb2NhdGUgcG9vbCBtZW1vcnkKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gc3RydWN0IGFsbG9jX3N0cnVjdAorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYWxsb2NhdGUgZGF0YSBwb29sIG1lbW9yeSByZXF1ZXN0CisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgY2FsY3VsYXRlcyB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlCisgKglhbGxvY2F0ZWQgbWVtb3J5LCBhbmQgdGhlIG9mZnNldCBvZiB0aGlzIGFyZWEgZnJvbSB0aGUgbWFwcGVkIGFkZHJlc3MuCisgKglUaGVyZWZvcmUsIHRoZSBGVk9zIGluIHVzZXIgc3BhY2UgY2FuIGNhbGN1bGF0ZSB0aGUgZXhhY3QgdmlydHVhbAorICoJYWRkcmVzcyBvZiB0aGlzIGFsbG9jYXRlZCBtZW1vcnkKKyAqLworc3RhdGljIGludCBzZXBfYWxsb2NhdGVfZGF0YV9wb29sX21lbW9yeV9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgYWxsb2Nfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCS8qIEhvbGRzIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGFkZHJlc3MgaW4gdGhlIHN5c3RlbSBtZW1vcnkgcG9vbCAqLworCXUzMiAqdG9rZW5fYWRkcjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGFsbG9jX3N0cnVjdCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJaWYgKChzZXAtPmRhdGFfcG9vbF9ieXRlc19hbGxvY2F0ZWQgKyBjb21tYW5kX2FyZ3MubnVtX2J5dGVzKSA+CisJCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJImJ5dGVzX2FsbG9jYXRlZDogJXhcbiIsIChpbnQpc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJIm9mZnNldDogJXhcbiIsIFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTKTsKKwkvKiBTZXQgdGhlIHZpcnR1YWwgYW5kIGJ1cyBhZGRyZXNzICovCisJY29tbWFuZF9hcmdzLm9mZnNldCA9IFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTICsKKwkJc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJjb21tYW5kX2FyZ3Mub2Zmc2V0OiAleFxuIiwgY29tbWFuZF9hcmdzLm9mZnNldCk7CisKKwkvKiBQbGFjZSBpbiB0aGUgc2hhcmVkIGFyZWEgdGhhdCBpcyBrbm93biBieSB0aGUgU0VQICovCisJdG9rZW5fYWRkciA9ICh1MzIgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTICsKKwkJKHNlcC0+bnVtX29mX2RhdGFfYWxsb2NhdGlvbnMpKjIqc2l6ZW9mKHUzMikpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhbGxvY2F0aW9uIG9mZnNldDogJXhcbiIsCisJCVNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGEgcG9vbCB0b2tlbiBhZGRyIGlzICVwXG4iLCB0b2tlbl9hZGRyKTsKKworCXRva2VuX2FkZHJbMF0gPSBTRVBfREFUQV9QT09MX1BPSU5URVJTX1ZBTF9UT0tFTjsKKwl0b2tlbl9hZGRyWzFdID0gKHUzMilzZXAtPnNoYXJlZF9idXMgKworCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9BUkVBX09GRlNFVF9JTl9CWVRFUyArCisJCXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YSBwb29sIHRva2VuIFswXSAleFxuIiwgdG9rZW5fYWRkclswXSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhIHBvb2wgdG9rZW4gWzFdICV4XG4iLCB0b2tlbl9hZGRyWzFdKTsKKworCS8qIFdyaXRlIHRoZSBtZW1vcnkgYmFjayB0byB0aGUgdXNlciBzcGFjZSAqLworCWVycm9yID0gY29weV90b191c2VyKCh2b2lkICopYXJnLCAodm9pZCAqKSZjb21tYW5kX2FyZ3MsCisJCXNpemVvZihzdHJ1Y3QgYWxsb2Nfc3RydWN0KSk7CisJaWYgKGVycm9yKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogVXBkYXRlIHRoZSBhbGxvY2F0aW9uICovCisJc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkICs9IGNvbW1hbmRfYXJncy5udW1fYnl0ZXM7CisJc2VwLT5udW1fb2ZfZGF0YV9hbGxvY2F0aW9ucyArPSAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhX2FsbG9jYXRpb25zICVkXG4iLAorCQlzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJ5dGVzIGFsbG9jYXRlZCAgJWRcbiIsCisJCShpbnQpc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkKTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfbG9ja19rZXJuZWxfcGFnZXMgLSBtYXAga2VybmVsIHBhZ2VzIGZvciBETUEKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBrZXJuZWxfdmlydF9hZGRyOiBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIGluIGtlcm5lbAorICoJQGRhdGFfc2l6ZTogc2l6ZSBvZiBkYXRhCisgKglAbGxpX2FycmF5X3B0cjogbGxpIGFycmF5CisgKglAaW5fb3V0X2ZsYWc6IGlucHV0IGludG8gZGV2aWNlIG9yIG91dHB1dCBmcm9tIGRldmljZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gbG9ja3MgYWxsIHRoZSBwaHlzaWNhbCBwYWdlcyBvZiB0aGUga2VybmVsIHZpcnR1YWwgYnVmZmVyCisgKglhbmQgY29uc3RydWN0IGEgYmFzaWMgbGxpICBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBob2xkcyB0aGUgcGh5c2ljYWwKKyAqCXBhZ2UgYWRkcmVzcyBhbmQgdGhlIHNpemUgdGhhdCBhcHBsaWNhdGlvbiBkYXRhIGhvbGRzIGluIHRoaXMgcGFnZQorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZHVyaW5nIGtlcm5lbCBjcnlwdG8gbW9kIGNhbGxzIGZyb20gd2l0aGluCisgKgl0aGUga2VybmVsICh3aGVuIGlvY3RsIGlzIG5vdCB1c2VkKQorICovCitzdGF0aWMgaW50IHNlcF9sb2NrX2tlcm5lbF9wYWdlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcga2VybmVsX3ZpcnRfYWRkciwKKwl1MzIgZGF0YV9zaXplLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICoqbGxpX2FycmF5X3B0ciwKKwlpbnQgaW5fb3V0X2ZsYWcpCisKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIEFycmF5IG9mIGxsaSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfYXJyYXk7CisJLyogTWFwIGFycmF5ICovCisJc3RydWN0IHNlcF9kbWFfbWFwICptYXBfYXJyYXk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9sb2NrX2tlcm5lbF9wYWdlcyBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJrZXJuZWxfdmlydF9hZGRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWtlcm5lbF92aXJ0X2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV4XG4iLCBkYXRhX3NpemUpOworCisJbGxpX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWxsaV9hcnJheSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKwltYXBfYXJyYXkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VwX2RtYV9tYXApLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW1hcF9hcnJheSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I7CisJfQorCisJbWFwX2FycmF5WzBdLmRtYV9hZGRyID0KKwkJZG1hX21hcF9zaW5nbGUoJnNlcC0+cGRldi0+ZGV2LCAodm9pZCAqKWtlcm5lbF92aXJ0X2FkZHIsCisJCWRhdGFfc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCW1hcF9hcnJheVswXS5zaXplID0gZGF0YV9zaXplOworCisKKwkvKgorCSAqIFNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcGFnZSAtIGFwcCBkYXRhIG1heSBzdGFydCBub3QgYXQKKwkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlCisJICovCisJbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzID0gKHUzMiltYXBfYXJyYXlbMF0uZG1hX2FkZHI7CisJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUgPSBtYXBfYXJyYXlbMF0uc2l6ZTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MsCisJCWxsaV9hcnJheVswXS5ibG9ja19zaXplKTsKKworCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMgPSAxOworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5ID0gTlVMTDsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfbnVtX2VudHJpZXMgPSAxOworCX0gZWxzZSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbnVtX3BhZ2VzID0gMTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkgPSBOVUxMOworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX251bV9lbnRyaWVzID0gMTsKKwl9CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yOgorCWtmcmVlKGxsaV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9sb2NrX2tlcm5lbF9wYWdlcyBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfbG9ja191c2VyX3BhZ2VzIC0gbG9jayBhbmQgbWFwIHVzZXIgcGFnZXMgZm9yIERNQQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFwcF92aXJ0X2FkZHI6IHVzZXIgbWVtb3J5IGRhdGEgYnVmZmVyCisgKglAZGF0YV9zaXplOiBzaXplIG9mIGRhdGEgYnVmZmVyCisgKglAbGxpX2FycmF5X3B0cjogbGxpIGFycmF5CisgKglAaW5fb3V0X2ZsYWc6IGlucHV0IG9yIG91dHB1dCB0byBkZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGxvY2tzIGFsbCB0aGUgcGh5c2ljYWwgcGFnZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisgKgl2aXJ0dWFsIGJ1ZmZlciBhbmQgY29uc3RydWN0IGEgYmFzaWMgbGxpICBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeQorICoJaG9sZHMgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhbmQgdGhlIHNpemUgdGhhdCBhcHBsaWNhdGlvbgorICoJZGF0YSBob2xkcyBpbiB0aGlzIHBoeXNpY2FsIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgc2VwX2xvY2tfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXUzMiBhcHBfdmlydF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKipsbGlfYXJyYXlfcHRyLAorCWludCBpbl9vdXRfZmxhZykKKworeworCWludCBlcnJvciA9IDA7CisJdTMyIGNvdW50OworCWludCByZXN1bHQ7CisJLyogVGhlIHRoZSBwYWdlIG9mIHRoZSBlbmQgYWRkcmVzcyBvZiB0aGUgdXNlciBzcGFjZSBidWZmZXIgKi8KKwl1MzIgZW5kX3BhZ2U7CisJLyogVGhlIHBhZ2Ugb2YgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHVzZXIgc3BhY2UgYnVmZmVyICovCisJdTMyIHN0YXJ0X3BhZ2U7CisJLyogVGhlIHJhbmdlIGluIHBhZ2VzICovCisJdTMyIG51bV9wYWdlczsKKwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBwYWdlICovCisJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5OworCS8qIEFycmF5IG9mIGxsaSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfYXJyYXk7CisJLyogTWFwIGFycmF5ICovCisJc3RydWN0IHNlcF9kbWFfbWFwICptYXBfYXJyYXk7CisJLyogRGlyZWN0aW9uIG9mIHRoZSBETUEgbWFwcGluZyBmb3IgbG9ja2VkIHBhZ2VzICovCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JZGlyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfbG9ja191c2VyX3BhZ2VzIHN0YXJ0XG4iKTsKKworCS8qIFNldCBzdGFydCBhbmQgZW5kIHBhZ2VzICBhbmQgbnVtIHBhZ2VzICovCisJZW5kX3BhZ2UgPSAoYXBwX3ZpcnRfYWRkciArIGRhdGFfc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJc3RhcnRfcGFnZSA9IGFwcF92aXJ0X2FkZHIgPj4gUEFHRV9TSElGVDsKKwludW1fcGFnZXMgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2UgKyAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfdmlydF9hZGRyIGlzICV4XG4iLCBhcHBfdmlydF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGFfc2l6ZSBpcyAleFxuIiwgZGF0YV9zaXplKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXJ0X3BhZ2UgaXMgJXhcbiIsIHN0YXJ0X3BhZ2UpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZW5kX3BhZ2UgaXMgJXhcbiIsIGVuZF9wYWdlKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm51bV9wYWdlcyBpcyAleFxuIiwgbnVtX3BhZ2VzKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic3RhcnRpbmcgcGFnZV9hcnJheSBtYWxsb2NcbiIpOworCisJLyogQWxsb2NhdGUgYXJyYXkgb2YgcGFnZXMgc3RydWN0dXJlIHBvaW50ZXJzICovCisJcGFnZV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBhZ2VfYXJyYXkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJbWFwX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9kbWFfbWFwKSAqIG51bV9wYWdlcywgR0ZQX0FUT01JQyk7CisJaWYgKCFtYXBfYXJyYXkpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAia21hbGxvYyBmb3IgbWFwX2FycmF5IGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjE7CisJfQorCisJbGxpX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICogbnVtX3BhZ2VzLAorCQlHRlBfQVRPTUlDKTsKKworCWlmICghbGxpX2FycmF5KSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImttYWxsb2MgZm9yIGxsaV9hcnJheSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IyOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic3RhcnRpbmcgZ2V0X3VzZXJfcGFnZXNcbiIpOworCisJLyogQ29udmVydCB0aGUgYXBwbGljYXRpb24gdmlydHVhbCBhZGRyZXNzIGludG8gYSBzZXQgb2YgcGh5c2ljYWwgKi8KKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmVzdWx0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGFwcF92aXJ0X2FkZHIsCisJCW51bV9wYWdlcywKKwkJKChpbl9vdXRfZmxhZyA9PSBTRVBfRFJJVkVSX0lOX0ZMQUcpID8gMCA6IDEpLAorCQkwLCBwYWdlX2FycmF5LCBOVUxMKTsKKworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIHBhZ2VzIGxvY2tlZCAtIGlmIG5vdCBhbGwgdGhlbiBleGl0IHdpdGggZXJyb3IgKi8KKwlpZiAocmVzdWx0ICE9IG51bV9wYWdlcykgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkibm90IGFsbCBwYWdlcyBsb2NrZWQgYnkgZ2V0X3VzZXJfcGFnZXNcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IzOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZ2V0X3VzZXJfcGFnZXMgc3VjY2VlZGVkXG4iKTsKKworCS8qIFNldCBkaXJlY3Rpb24gKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKQorCQlkaXIgPSBETUFfVE9fREVWSUNFOworCWVsc2UKKwkJZGlyID0gRE1BX0ZST01fREVWSUNFOworCisJLyoKKwkgKiBGaWxsIHRoZSBhcnJheSB1c2luZyBwYWdlIGFycmF5IGRhdGEgYW5kCisJICogbWFwIHRoZSBwYWdlcyAtIHRoaXMgYWN0aW9uIHdpbGwgYWxzbyBmbHVzaCB0aGUgY2FjaGUgYXMgbmVlZGVkCisJICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCS8qIEZpbGwgdGhlIG1hcCBhcnJheSAqLworCQltYXBfYXJyYXlbY291bnRdLmRtYV9hZGRyID0KKwkJCWRtYV9tYXBfcGFnZSgmc2VwLT5wZGV2LT5kZXYsIHBhZ2VfYXJyYXlbY291bnRdLAorCQkJMCwgUEFHRV9TSVpFLCAvKmRpciovRE1BX0JJRElSRUNUSU9OQUwpOworCisJCW1hcF9hcnJheVtjb3VudF0uc2l6ZSA9IFBBR0VfU0laRTsKKworCQkvKiBGaWxsIHRoZSBsbGkgYXJyYXkgZW50cnkgKi8KKwkJbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcyA9ICh1MzIpbWFwX2FycmF5W2NvdW50XS5kbWFfYWRkcjsKKwkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplID0gUEFHRV9TSVpFOworCisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWNvdW50LCAodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAorCQkJY291bnQsIGxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CisJfQorCisJLyogQ2hlY2sgdGhlIG9mZnNldCBmb3IgdGhlIGZpcnN0IHBhZ2UgKi8KKwlsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgPQorCQlsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgKyAoYXBwX3ZpcnRfYWRkciAmICh+UEFHRV9NQVNLKSk7CisKKwkvKiBDaGVjayB0aGF0IG5vdCBhbGwgdGhlIGRhdGEgaXMgaW4gdGhlIGZpcnN0IHBhZ2Ugb25seSAqLworCWlmICgoUEFHRV9TSVpFIC0gKGFwcF92aXJ0X2FkZHIgJiAoflBBR0VfTUFTSykpKSA+PSBkYXRhX3NpemUpCisJCWxsaV9hcnJheVswXS5ibG9ja19zaXplID0gZGF0YV9zaXplOworCWVsc2UKKwkJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUgPQorCQkJUEFHRV9TSVpFIC0gKGFwcF92aXJ0X2FkZHIgJiAoflBBR0VfTUFTSykpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAorCQlsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUpOworCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGxhc3QgcGFnZSAqLworCWlmIChudW1fcGFnZXMgPiAxKSB7CisJCWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5ibG9ja19zaXplID0KKwkJCShhcHBfdmlydF9hZGRyICsgZGF0YV9zaXplKSAmICh+UEFHRV9NQVNLKTsKKworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkibGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbnVtX3BhZ2VzIC0gMSwKKwkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MsCisJCQludW1fcGFnZXMgLSAxLAorCQkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplKTsKKwl9CisKKwkvKiBTZXQgb3V0cHV0IHBhcmFtcyBhY29yZGluZyB0byB0aGUgaW5fb3V0IGZsYWcgKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBwYWdlX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfYXJyYXkgPSBtYXBfYXJyYXk7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX21hcF9udW1fZW50cmllcyA9CisJCQkJCQkJCW51bV9wYWdlczsKKwl9IGVsc2UgeworCQkqbGxpX2FycmF5X3B0ciA9IGxsaV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X251bV9wYWdlcyA9IG51bV9wYWdlczsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkgPQorCQkJCQkJCQlwYWdlX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX251bV9lbnRyaWVzID0KKwkJCQkJCQkJbnVtX3BhZ2VzOworCX0KKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IzOgorCS8qIEZyZWUgbGxpIGFycmF5ICovCisJa2ZyZWUobGxpX2FycmF5KTsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IyOgorCWtmcmVlKG1hcF9hcnJheSk7CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yMToKKwkvKiBGcmVlIHBhZ2UgYXJyYXkgKi8KKwlrZnJlZShwYWdlX2FycmF5KTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2xvY2tfdXNlcl9wYWdlcyBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKgl1MzIgc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUgLSBzaXplIHRoZSBMTEkgdGFibGUKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfaW5fYXJyYXlfcHRyCisgKglAbnVtX2FycmF5X2VudHJpZXMKKyAqCUBsYXN0X3RhYmxlX2ZsYWcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgZGF0YSB0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbnRvCisgKgl0aGUgbGxpIHRhYmxlIGZyb20gdGhpcyBhcnJheSwgc3VjaCB0aGF0IGVpdGhlciB0aGUgdGFibGUgaXMgZnVsbAorICoJKGFsbCBlbnRyaWVzIGFyZSBlbnRlcmVkKSwgb3IgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUKKyAqCWxsaSBhcnJheQorICovCitzdGF0aWMgdTMyIHNlcF9jYWxjdWxhdGVfbGxpX3RhYmxlX21heF9zaXplKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheV9wdHIsCisJdTMyIG51bV9hcnJheV9lbnRyaWVzLAorCXUzMiAqbGFzdF90YWJsZV9mbGFnKQoreworCXUzMiBjb3VudGVyOworCS8qIFRhYmxlIGRhdGEgc2l6ZSAqLworCXUzMiB0YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIERhdGEgc2l6ZSBmb3IgdGhlIG5leHQgdGFibGUgKi8KKwl1MzIgbmV4dF90YWJsZV9kYXRhX3NpemU7CisKKwkqbGFzdF90YWJsZV9mbGFnID0gMDsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBkYXRhIGluIHRoZSBvdXQgbGxpIHRhYmxlIHRpbGwgd2UgZmlsbCB0aGUgd2hvbGUKKwkgKiB0YWJsZSBvciB0aWxsIHRoZSBkYXRhIGhhcyBlbmRlZAorCSAqLworCWZvciAoY291bnRlciA9IDA7CisJCShjb3VudGVyIDwgKFNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQIC0gMSkpICYmCisJCQkoY291bnRlciA8IG51bV9hcnJheV9lbnRyaWVzKTsgY291bnRlcisrKQorCQl0YWJsZV9kYXRhX3NpemUgKz0gbGxpX2luX2FycmF5X3B0cltjb3VudGVyXS5ibG9ja19zaXplOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGVudHJ5LAorCSAqIG1lYW5pbmcgdGhpcyBpYSB0aGUgbGFzdCB0YWJsZSB0byBidWlsZCwKKwkgKiBhbmQgbm8gbmVlZCB0byBjaGVjayB0aGUgYmxvY2sgYWxpZ25tZW50CisJICovCisJaWYgKGNvdW50ZXIgPT0gbnVtX2FycmF5X2VudHJpZXMpIHsKKwkJLyogU2V0IHRoZSBsYXN0IHRhYmxlIGZsYWcgKi8KKwkJKmxhc3RfdGFibGVfZmxhZyA9IDE7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBkYXRhIHNpemUgb2YgdGhlIG5leHQgdGFibGUuCisJICogU3RvcCBpZiBubyBlbnRyaWVzIGxlZnQgb3IgaWYgZGF0YSBzaXplIGlzIG1vcmUgdGhlIERNQSByZXN0cmljdGlvbgorCSAqLworCW5leHRfdGFibGVfZGF0YV9zaXplID0gMDsKKwlmb3IgKDsgY291bnRlciA8IG51bV9hcnJheV9lbnRyaWVzOyBjb3VudGVyKyspIHsKKwkJbmV4dF90YWJsZV9kYXRhX3NpemUgKz0gbGxpX2luX2FycmF5X3B0cltjb3VudGVyXS5ibG9ja19zaXplOworCQlpZiAobmV4dF90YWJsZV9kYXRhX3NpemUgPj0gU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIG5leHQgdGFibGUgZGF0YSBzaXplIGlzIGxlc3MgdGhlbiBETUEgcnN0cmljdGlvbi4KKwkgKiBpZiBpdCBpcyAtIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IHRhYmxlIHNpemUsIHNvIHRoYXQgdGhlIG5leHQKKwkgKiB0YWJsZSBkYXRhIHNpemUgd2lsbCBiZSBhZGFxdWV0ZSBmb3IgRE1BCisJICovCisJaWYgKG5leHRfdGFibGVfZGF0YV9zaXplICYmCisJCW5leHRfdGFibGVfZGF0YV9zaXplIDwgU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRSkKKworCQl0YWJsZV9kYXRhX3NpemUgLT0gKFNFUF9EUklWRVJfTUlOX0RBVEFfU0laRV9QRVJfVEFCTEUgLQorCQkJbmV4dF90YWJsZV9kYXRhX3NpemUpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZSBkYXRhIHNpemUgaXMgJXhcbiIsCisJCQkJCQkJdGFibGVfZGF0YV9zaXplKTsKK2VuZF9mdW5jdGlvbjoKKwlyZXR1cm4gdGFibGVfZGF0YV9zaXplOworfQorCisvKioKKyAqCXNlcF9idWlsZF9sbGlfdGFibGUgLSBidWlsZCBhbiBsbGkgYXJyYXkgZm9yIHRoZSBnaXZlbiB0YWJsZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGxsaV9hcnJheV9wdHI6IHBvaW50ZXIgdG8gbGxpIGFycmF5CisgKglAbGxpX3RhYmxlX3B0cjogcG9pbnRlciB0byBsbGkgdGFibGUKKyAqCUBudW1fcHJvY2Vzc2VkX2VudHJpZXNfcHRyOiBwb2ludGVyIHRvIG51bWJlciBvZiBlbnRyaWVzCisgKglAbnVtX3RhYmxlX2VudHJpZXNfcHRyOiBwb2ludGVyIHRvIG51bWJlciBvZiB0YWJsZXMKKyAqCUB0YWJsZV9kYXRhX3NpemU6IHRvdGFsIGRhdGEgc2l6ZQorICoKKyAqCUJ1aWxkcyBhbnQgbGxpIHRhYmxlIGZyb20gdGhlIGxsaV9hcnJheSBhY2NvcmRpbmcgdG8KKyAqCXRoZSBnaXZlbiBzaXplIG9mIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2VwX2J1aWxkX2xsaV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5CSpsbGlfYXJyYXlfcHRyLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5CSpsbGlfdGFibGVfcHRyLAorCXUzMiAqbnVtX3Byb2Nlc3NlZF9lbnRyaWVzX3B0ciwKKwl1MzIgKm51bV90YWJsZV9lbnRyaWVzX3B0ciwKKwl1MzIgdGFibGVfZGF0YV9zaXplKQoreworCS8qIEN1cnJlbnQgdGFibGUgZGF0YSBzaXplICovCisJdTMyIGN1cnJfdGFibGVfZGF0YV9zaXplOworCS8qIENvdW50ZXIgb2YgbGxpIGFycmF5IGVudHJ5ICovCisJdTMyIGFycmF5X2NvdW50ZXI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9idWlsZF9sbGlfdGFibGUgc3RhcnRcbiIpOworCisJLyogSW5pdCBjdXJycmVudCB0YWJsZSBkYXRhIHNpemUgYW5kIGxsaSBhcnJheSBlbnRyeSBjb3VudGVyICovCisJY3Vycl90YWJsZV9kYXRhX3NpemUgPSAwOworCWFycmF5X2NvdW50ZXIgPSAwOworCSpudW1fdGFibGVfZW50cmllc19wdHIgPSAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsIHRhYmxlX2RhdGFfc2l6ZSk7CisKKwkvKiBGaWxsIHRoZSB0YWJsZSB0aWxsIHRhYmxlIHNpemUgcmVhY2hlcyB0aGUgbmVlZGVkIGFtb3VudCAqLworCXdoaWxlIChjdXJyX3RhYmxlX2RhdGFfc2l6ZSA8IHRhYmxlX2RhdGFfc2l6ZSkgeworCQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlICovCisJCSgqbnVtX3RhYmxlX2VudHJpZXNfcHRyKSsrOworCisJCWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCWNwdV90b19sZTMyKGxsaV9hcnJheV9wdHJbYXJyYXlfY291bnRlcl0uYnVzX2FkZHJlc3MpOworCisJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPQorCQkJY3B1X3RvX2xlMzIobGxpX2FycmF5X3B0clthcnJheV9jb3VudGVyXS5ibG9ja19zaXplKTsKKworCQljdXJyX3RhYmxlX2RhdGFfc2l6ZSArPSBsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJsb2NrX3NpemU7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJsbGlfdGFibGVfcHRyIGlzICVwXG4iLAorCQkJCQkJCQlsbGlfdGFibGVfcHRyKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCS8qIENoZWNrIGZvciBvdmVyZmxvdyBvZiB0aGUgdGFibGUgZGF0YSAqLworCQlpZiAoY3Vycl90YWJsZV9kYXRhX3NpemUgPiB0YWJsZV9kYXRhX3NpemUpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJjdXJyX3RhYmxlX2RhdGFfc2l6ZSB0b28gbGFyZ2VcbiIpOworCisJCQkvKiBVcGRhdGUgdGhlIHNpemUgb2YgYmxvY2sgaW4gdGhlIHRhYmxlICovCisJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIC09CisJCQljcHVfdG9fbGUzMigoY3Vycl90YWJsZV9kYXRhX3NpemUgLSB0YWJsZV9kYXRhX3NpemUpKTsKKworCQkJLyogVXBkYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluIHRoZSBsbGkgYXJyYXkgKi8KKwkJCWxsaV9hcnJheV9wdHJbYXJyYXlfY291bnRlcl0uYnVzX2FkZHJlc3MgKz0KKwkJCWNwdV90b19sZTMyKGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCQkvKiBVcGRhdGUgdGhlIGJsb2NrIHNpemUgbGVmdCBpbiB0aGUgbGxpIGFycmF5ICovCisJCQlsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJsb2NrX3NpemUgPQorCQkJCShjdXJyX3RhYmxlX2RhdGFfc2l6ZSAtIHRhYmxlX2RhdGFfc2l6ZSk7CisJCX0gZWxzZQorCQkJLyogQWR2YW5jZSB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGxpX2FycmF5ICovCisJCQlhcnJheV9jb3VudGVyKys7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkibGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CisKKwkJLyogTW92ZSB0byB0aGUgbmV4dCBlbnRyeSBpbiB0YWJsZSAqLworCQlsbGlfdGFibGVfcHRyKys7CisJfQorCisJLyogU2V0IHRoZSBpbmZvIGVudHJ5IHRvIGRlZmF1bHQgKi8KKwlsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CisJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImxsaV90YWJsZV9wdHIgaXMgJXBcbiIsIGxsaV90YWJsZV9wdHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJLyogU2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVyICovCisJKm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIgKz0gYXJyYXlfY291bnRlcjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibnVtX3Byb2Nlc3NlZF9lbnRyaWVzX3B0ciBpcyAleFxuIiwKKwkJKm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfYnVpbGRfbGxpX3RhYmxlIGVuZFxuIik7Cit9CisKKy8qKgorICoJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzIC0gbWFwIHNoYXJlZCBhcmVhIHRvIGJ1cyBhZGRyZXNzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAdmlydF9hZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gY29udmVydAorICoKKyAqCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW5zaWRlIHNoYXJlZCBhcmVhIGFjY29yZGluZworICoJdG8gdGhlIHZpcnR1YWwgYWRkcmVzcy4gSXQgY2FuIGJlIGVpdGhlciBvbiB0aGUgZXh0ZXJuYSBSQU0gZGV2aWNlCisgKgkoaW9yZW1hcHBlZCksIG9yIG9uIHRoZSBzeXN0ZW0gUkFNCisgKglUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgZXh0ZXJuYWwgUkFNCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IHNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXZvaWQgKnZpcnRfYWRkcmVzcykKK3sKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoIHZpcnQgdG8gcGh5cyB2ICVwXG4iLCB2aXJ0X2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2ggdmlydCB0byBwaHlzIHAgJTA4bHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKQorCQlzZXAtPnNoYXJlZF9idXMgKyAodmlydF9hZGRyZXNzIC0gc2VwLT5zaGFyZWRfYWRkcikpOworCisJcmV0dXJuIHNlcC0+c2hhcmVkX2J1cyArIChzaXplX3QpKHZpcnRfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2FkZHIpOworfQorCisvKioKKyAqCXNlcF9zaGFyZWRfYXJlYV9idXNfdG9fdmlydCAtIG1hcCBzaGFyZWQgYXJlYSBidXMgYWRkcmVzcyB0byBrZXJuZWwKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBidXNfYWRkcmVzczogYnVzIGFkZHJlc3MgdG8gY29udmVydAorICoKKyAqCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBpbnNpZGUgc2hhcmVkIGFyZWEKKyAqCWFjY29yZGluZyB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gSXQgY2FuIGJlIGVpdGhlciBvbiB0aGUKKyAqCWV4dGVybmEgUkFNIGRldmljZSAoaW9yZW1hcHBlZCksIG9yIG9uIHRoZSBzeXN0ZW0gUkFNCisgKglUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgZXh0ZXJuYWwgUkFNCisgKi8KK3N0YXRpYyB2b2lkICpzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwlkbWFfYWRkcl90IGJ1c19hZGRyZXNzKQoreworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2hhcmVkIGJ1cyB0byB2aXJ0IGI9JWx4IHY9JWx4XG4iLAorCQkodW5zaWduZWQgbG9uZylidXNfYWRkcmVzcywgKHVuc2lnbmVkIGxvbmcpKHNlcC0+c2hhcmVkX2FkZHIgKworCQkJKHNpemVfdCkoYnVzX2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9idXMpKSk7CisKKwlyZXR1cm4gc2VwLT5zaGFyZWRfYWRkcgkrIChzaXplX3QpKGJ1c19hZGRyZXNzIC0gc2VwLT5zaGFyZWRfYnVzKTsKK30KKworLyoqCisgKglzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyAtIGR1bXAgTExJIHRhYmxlCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAbGxpX3RhYmxlX3B0cjogcG9pbnRlciB0byBzZXBfbGxpX2VudHJ5CisgKglAbnVtX3RhYmxlX2VudHJpZXM6IG51bWJlciBvZiBlbnRyaWVzCisgKglAdGFibGVfZGF0YV9zaXplOiB0b3RhbCBkYXRhIHNpemUKKyAqCisgKglXYWxrIHRoZSB0aGUgbGlzdCBvZiB0aGUgcHJpbnQgY3JlYXRlZCB0YWJsZXMgYW5kIHByaW50IGFsbCB0aGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfdGFibGVfcHRyLAorCXVuc2lnbmVkIGxvbmcgbnVtX3RhYmxlX2VudHJpZXMsCisJdW5zaWduZWQgbG9uZyB0YWJsZV9kYXRhX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9jb3VudCA9IDE7CisJdW5zaWduZWQgbG9uZyBlbnRyaWVzX2NvdW50ID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMgc3RhcnRcbiIpOworCisJd2hpbGUgKCh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImxsaSB0YWJsZSAlMDhseCwgdGFibGVfZGF0YV9zaXplIGlzICVsdVxuIiwKKwkJCXRhYmxlX2NvdW50LCB0YWJsZV9kYXRhX3NpemUpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm51bV90YWJsZV9lbnRyaWVzIGlzICVsdVxuIiwKKwkJCQkJCQludW1fdGFibGVfZW50cmllcyk7CisKKwkJLyogUHJpbnQgZW50cmllcyBvZiB0aGUgdGFibGUgKHdpdGhvdXQgaW5mbyBlbnRyeSkgKi8KKwkJZm9yIChlbnRyaWVzX2NvdW50ID0gMDsgZW50cmllc19jb3VudCA8IG51bV90YWJsZV9lbnRyaWVzOworCQkJZW50cmllc19jb3VudCsrLCBsbGlfdGFibGVfcHRyKyspIHsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJImxsaV90YWJsZV9wdHIgYWRkcmVzcyBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgbGxpX3RhYmxlX3B0cik7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJwaHlzIGFkZHJlc3MgaXMgJTA4bHggYmxvY2sgc2l6ZSBpcyAleFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcywKKwkJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKKwkJfQorCQkvKiBQb2ludCB0byB0aGUgaW5mbyBlbnRyeSAqLworCQlsbGlfdGFibGVfcHRyLS07CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyBsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyBsbGlfdGFibGVfcHRyLT5waHlzaWNhbF9hZGRyZXNzIGlzICUwOGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCisKKwkJdGFibGVfZGF0YV9zaXplID0gbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSAmIDB4ZmZmZmZmOworCQludW1fdGFibGVfZW50cmllcyA9IChsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID4+IDI0KSAmIDB4ZmY7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyB0YWJsZV9kYXRhX3NpemUgaXMgJWx1IG51bV90YWJsZV9lbnRyaWVzIGlzIgorCQkJIiAlbHUgYnVzX2FkZHJlc3MgaXMlbHVcbiIsIHRhYmxlX2RhdGFfc2l6ZSwKKwkJCW51bV90YWJsZV9lbnRyaWVzLCAodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyk7CisKKwkJaWYgKCh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzICE9IDB4ZmZmZmZmZmYpCisJCQlsbGlfdGFibGVfcHRyID0gKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJCQkJc2VwX3NoYXJlZF9idXNfdG9fdmlydChzZXAsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCisJCXRhYmxlX2NvdW50Kys7CisJfQorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMgZW5kXG4iKTsKK30KKworCisvKioKKyAqCXNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZSAtIGNyZWF0ZSBhIGJsYW5rIExMSSB0YWJsZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGxsaV90YWJsZV9hZGRyX3B0cjogcG9pbnRlciB0byBsbGkgdGFibGUKKyAqCUBudW1fZW50cmllc19wdHI6IHBvaW50ZXIgdG8gbnVtYmVyIG9mIGVudHJpZXMKKyAqCUB0YWJsZV9kYXRhX3NpemVfcHRyOiBwb2ludCB0byB0YWJsZSBkYXRhIHNpemUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZW1wdHkgbGxpIHRhYmxlcyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9hZGRyX3B0ciwKKwkJdTMyICpudW1fZW50cmllc19wdHIsCisJCXUzMiAqdGFibGVfZGF0YV9zaXplX3B0cikKK3sKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX3RhYmxlX3B0cjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlIHN0YXJ0XG4iKTsKKworCS8qIEZpbmQgdGhlIGFyZWEgZm9yIG5ldyB0YWJsZSAqLworCWxsaV90YWJsZV9wdHIgPQorCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArCisJCXNlcC0+bnVtX2xsaV90YWJsZXNfY3JlYXRlZCAqIHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApOworCisJbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgPSAwOworCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPSAwOworCisJbGxpX3RhYmxlX3B0cisrOworCWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzID0gMHhGRkZGRkZGRjsKKwlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID0gMDsKKworCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlciB2YWx1ZSAqLworCSpsbGlfdGFibGVfYWRkcl9wdHIgPSBzZXAtPnNoYXJlZF9idXMgKworCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKgorCQlzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVA7CisKKwkvKiBTZXQgdGhlIG51bSBvZiBlbnRyaWVzIGFuZCB0YWJsZSBkYXRhIHNpemUgZm9yIGVtcHR5IHRhYmxlICovCisJKm51bV9lbnRyaWVzX3B0ciA9IDI7CisJKnRhYmxlX2RhdGFfc2l6ZV9wdHIgPSAwOworCisJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgY3JlYXRlZCB0YWJsZXMgKi8KKwlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQrKzsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlIHN0YXJ0XG4iKTsKKworfQorCisvKioKKyAqCXNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZSAtIHByZXBhcmUgaW5wdXQgRE1BIG1hcHBpbmdzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAZGF0YV9zaXplOgorICoJQGJsb2NrX3NpemU6CisgKglAbGxpX3RhYmxlX3B0cjoKKyAqCUBudW1fZW50cmllc19wdHI6CisgKglAdGFibGVfZGF0YV9zaXplX3B0cjoKKyAqCUBpc19rdmE6IHNldCBmb3Iga2VybmVsIGRhdGEgKGtlcm5lbCBjcnlwdGlvIGNhbGwpCisgKgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBvbmx5IGlucHV0IERNQSB0YWJsZSBmb3Igc3luaHJvbmljIHN5bW1ldHJpYworICoJb3BlcmF0aW9ucyAoSEFTSCkKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfaW5wdXRfZG1hX3RhYmxlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcHBfdmlydF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJdTMyIGJsb2NrX3NpemUsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX3B0ciwKKwl1MzIgKm51bV9lbnRyaWVzX3B0ciwKKwl1MzIgKnRhYmxlX2RhdGFfc2l6ZV9wdHIsCisJYm9vbCBpc19rdmEpCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBQb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSB0YWJsZSAtIHRoZSBsYXN0IGVudHJ5ICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmluZm9fZW50cnlfcHRyOworCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHBhZ2UgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX2FycmF5X3B0cjsKKwkvKiBQb2ludHMgdG8gdGhlIGZpcnN0IGVudHJ5IHRvIGJlIHByb2Nlc3NlZCBpbiB0aGUgbGxpX2luX2FycmF5ICovCisJdTMyIGN1cnJlbnRfZW50cnkgPSAwOworCS8qIE51bSBlbnRyaWVzIGluIHRoZSB2aXJ0dWFsIGJ1ZmZlciAqLworCXUzMiBzZXBfbGxpX2VudHJpZXMgPSAwOworCS8qIExsaSB0YWJsZSBwb2ludGVyICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmluX2xsaV90YWJsZV9wdHI7CisJLyogVGhlIHRvdGFsIGRhdGEgaW4gb25lIHRhYmxlICovCisJdTMyIHRhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogRmxhZyBmb3IgbGFzdCB0YWJsZSAqLworCXUzMiBsYXN0X3RhYmxlX2ZsYWcgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIGxsaSB0YWJsZSAqLworCXUzMiBudW1fZW50cmllc19pbl90YWJsZSA9IDA7CisJLyogTmV4dCB0YWJsZSBhZGRyZXNzICovCisJdm9pZCAqbGxpX3RhYmxlX2FsbG9jX2FkZHIgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9pbnB1dF9kbWFfdGFibGUgc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV4XG4iLCBkYXRhX3NpemUpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYmxvY2tfc2l6ZSBpcyAleFxuIiwgYmxvY2tfc2l6ZSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYWdlcyBwb2ludGVycyAqLworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBOVUxMOworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcyA9IDA7CisKKwkvKiBTZXQgdGhlIGtlcm5lbCBhZGRyZXNzIGZvciBmaXJzdCB0YWJsZSB0byBiZSBhbGxvY2F0ZWQgKi8KKwlsbGlfdGFibGVfYWxsb2NfYWRkciA9ICh2b2lkICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKiBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApOworCisJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCS8qIFNwZWNpYWwgY2FzZSAgLSBjcmVhdGUgbWVwdHUgdGFibGUgLSAyIGVudHJpZXMsIHplcm8gZGF0YSAqLworCQlzZXBfcHJlcGFyZV9lbXB0eV9sbGlfdGFibGUoc2VwLCBsbGlfdGFibGVfcHRyLAorCQkJCW51bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisJCWdvdG8gdXBkYXRlX2RjYl9jb3VudGVyOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBwYWdlcyBhcmUgaW4gS2VybmVsIFZpcnR1YWwgQWRkcmVzcyBsYXlvdXQgKi8KKwlpZiAoaXNfa3ZhID09IHRydWUpCisJCS8qIExvY2sgdGhlIHBhZ2VzIGluIHRoZSBrZXJuZWwgKi8KKwkJZXJyb3IgPSBzZXBfbG9ja19rZXJuZWxfcGFnZXMoc2VwLCBhcHBfdmlydF9hZGRyLAorCQkJZGF0YV9zaXplLCAmbGxpX2FycmF5X3B0ciwgU0VQX0RSSVZFUl9JTl9GTEFHKTsKKwllbHNlCisJCS8qCisJCSAqIExvY2sgdGhlIHBhZ2VzIG9mIHRoZSB1c2VyIGJ1ZmZlcgorCQkgKiBhbmQgdHJhbnNsYXRlIHRoZW0gdG8gcGFnZXMKKwkJICovCisJCWVycm9yID0gc2VwX2xvY2tfdXNlcl9wYWdlcyhzZXAsIGFwcF92aXJ0X2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfYXJyYXlfcHRyLCBTRVBfRFJJVkVSX0lOX0ZMQUcpOworCisJaWYgKGVycm9yKQorCQlnb3RvIGVuZF9mdW5jdGlvbjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAib3V0cHV0IHNlcF9pbl9udW1fcGFnZXMgaXMgJXhcbiIsCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcyk7CisKKwljdXJyZW50X2VudHJ5ID0gMDsKKwlpbmZvX2VudHJ5X3B0ciA9IE5VTEw7CisKKwlzZXBfbGxpX2VudHJpZXMgPSBzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXM7CisKKwkvKiBMb29wIHRpbGwgYWxsIHRoZSBlbnRyaWVzIGluIGluIGFycmF5IGFyZSBub3QgcHJvY2Vzc2VkICovCisJd2hpbGUgKGN1cnJlbnRfZW50cnkgPCBzZXBfbGxpX2VudHJpZXMpIHsKKworCQkvKiBTZXQgdGhlIG5ldyBpbnB1dCBhbmQgb3V0cHV0IHRhYmxlcyAqLworCQlpbl9sbGlfdGFibGVfcHRyID0KKwkJCShzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKWxsaV90YWJsZV9hbGxvY19hZGRyOworCisJCWxsaV90YWJsZV9hbGxvY19hZGRyICs9IHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVA7CisKKwkJaWYgKGxsaV90YWJsZV9hbGxvY19hZGRyID4KKwkJCSgodm9pZCAqKXNlcC0+c2hhcmVkX2FkZHIgKworCQkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMpKSB7CisKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uX2Vycm9yOworCisJCX0KKworCQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBjcmVhdGVkIHRhYmxlcyAqLworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQrKzsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiBkYXRhIGZvciBpbnB1dCB0YWJsZSAqLworCQl0YWJsZV9kYXRhX3NpemUgPSBzZXBfY2FsY3VsYXRlX2xsaV90YWJsZV9tYXhfc2l6ZShzZXAsCisJCQkmbGxpX2FycmF5X3B0cltjdXJyZW50X2VudHJ5XSwKKwkJCShzZXBfbGxpX2VudHJpZXMgLSBjdXJyZW50X2VudHJ5KSwKKwkJCSZsYXN0X3RhYmxlX2ZsYWcpOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHRhYmxlIC0KKwkJICogdGhlbiBhbGxpZ24gaXQgdG8gdGhlIGJsb2NrIHNpemUKKwkJICovCisJCWlmICghbGFzdF90YWJsZV9mbGFnKQorCQkJdGFibGVfZGF0YV9zaXplID0KKwkJCQkodGFibGVfZGF0YV9zaXplIC8gYmxvY2tfc2l6ZSkgKiBibG9ja19zaXplOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAib3V0cHV0IHRhYmxlX2RhdGFfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KKwkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfYXJyYXlfcHRyW2N1cnJlbnRfZW50cnldLAorCQkJaW5fbGxpX3RhYmxlX3B0ciwKKwkJCSZjdXJyZW50X2VudHJ5LCAmbnVtX2VudHJpZXNfaW5fdGFibGUsIHRhYmxlX2RhdGFfc2l6ZSk7CisKKwkJaWYgKGluZm9fZW50cnlfcHRyID09IE5VTEwpIHsKKworCQkJLyogU2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkJCSpsbGlfdGFibGVfcHRyID0gc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwKKwkJCQlpbl9sbGlfdGFibGVfcHRyKTsKKwkJCSpudW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19pbl90YWJsZTsKKwkJCSp0YWJsZV9kYXRhX3NpemVfcHRyID0gdGFibGVfZGF0YV9zaXplOworCisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkib3V0cHV0IGxsaV90YWJsZV9pbl9wdHIgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKmxsaV90YWJsZV9wdHIpOworCisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX2VudHJ5X3B0ci0+YnVzX2FkZHJlc3MgPQorCQkJCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsCisJCQkJCQkJaW5fbGxpX3RhYmxlX3B0cik7CisJCQlpbmZvX2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSA9CisJCQkJKChudW1fZW50cmllc19pbl90YWJsZSkgPDwgMjQpIHwKKwkJCQkodGFibGVfZGF0YV9zaXplKTsKKwkJfQorCQkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBjdXJyZW50IHRhYmxlcyAqLworCQlpbmZvX2VudHJ5X3B0ciA9IGluX2xsaV90YWJsZV9wdHIgKyBudW1fZW50cmllc19pbl90YWJsZSAtIDE7CisJfQorCS8qIFByaW50IGlucHV0IHRhYmxlcyAqLworCXNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzKHNlcCwgKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJCXNlcF9zaGFyZWRfYXJlYV9idXNfdG9fdmlydChzZXAsICpsbGlfdGFibGVfcHRyKSwKKwkJKm51bV9lbnRyaWVzX3B0ciwgKnRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCS8qIFRoZSBhcnJheSBvZiB0aGUgcGFnZXMgKi8KKwlrZnJlZShsbGlfYXJyYXlfcHRyKTsKKwordXBkYXRlX2RjYl9jb3VudGVyOgorCS8qIFVwZGF0ZSBEQ0IgY291bnRlciAqLworCXNlcC0+bnJfZGNiX2NyZWF0Kys7CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl9lcnJvcjoKKwkvKiBGcmVlIGFsbCB0aGUgYWxsb2NhdGVkIHJlc291cmNlcyAqLworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX21hcF9hcnJheSk7CisJa2ZyZWUobGxpX2FycmF5X3B0cik7CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fcGFnZV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZSBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorLyoqCisgKglzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkgLSBwcmVwYXJlIEFFUy9ERVMgbWFwcGluZ3MKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfaW5fYXJyYXk6CisgKglAc2VwX2luX2xsaV9lbnRyaWVzOgorICoJQGxsaV9vdXRfYXJyYXk6CisgKglAc2VwX291dF9sbGlfZW50cmllcworICoJQGJsb2NrX3NpemUKKyAqCUBsbGlfdGFibGVfaW5fcHRyCisgKglAbGxpX3RhYmxlX291dF9wdHIKKyAqCUBpbl9udW1fZW50cmllc19wdHIKKyAqCUBvdXRfbnVtX2VudHJpZXNfcHRyCisgKglAdGFibGVfZGF0YV9zaXplX3B0cgorICoKKyAqCVRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgaW5wdXQgYW5kIG91dHB1dCBETUEgdGFibGVzIGZvcgorICoJc3ltbWV0cmljIG9wZXJhdGlvbnMgKEFFUy9ERVMpIGFjY29yZGluZyB0byB0aGUgYmxvY2sKKyAqCXNpemUgZnJvbSBMTEkgYXJheXMKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpKAorCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheSwKKwl1MzIJc2VwX2luX2xsaV9lbnRyaWVzLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfb3V0X2FycmF5LAorCXUzMglzZXBfb3V0X2xsaV9lbnRyaWVzLAorCXUzMglibG9ja19zaXplLAorCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9pbl9wdHIsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX291dF9wdHIsCisJdTMyCSppbl9udW1fZW50cmllc19wdHIsCisJdTMyCSpvdXRfbnVtX2VudHJpZXNfcHRyLAorCXUzMgkqdGFibGVfZGF0YV9zaXplX3B0cikKK3sKKwkvKiBQb2ludHMgdG8gdGhlIGFyZWEgd2hlcmUgbmV4dCBsbGkgdGFibGUgY2FuIGJlIGFsbG9jYXRlZCAqLworCXZvaWQgKmxsaV90YWJsZV9hbGxvY19hZGRyID0gMDsKKwkvKiBJbnB1dCBsbGkgdGFibGUgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqaW5fbGxpX3RhYmxlX3B0ciA9IE5VTEw7CisJLyogT3V0cHV0IGxsaSB0YWJsZSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpvdXRfbGxpX3RhYmxlX3B0ciA9IE5VTEw7CisJLyogUG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgdGFibGUgLSB0aGUgbGFzdCBlbnRyeSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbmZvX2luX2VudHJ5X3B0ciA9IE5VTEw7CisJLyogUG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgdGFibGUgLSB0aGUgbGFzdCBlbnRyeSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbmZvX291dF9lbnRyeV9wdHIgPSBOVUxMOworCS8qIFBvaW50cyB0byB0aGUgZmlyc3QgZW50cnkgdG8gYmUgcHJvY2Vzc2VkIGluIHRoZSBsbGlfaW5fYXJyYXkgKi8KKwl1MzIgY3VycmVudF9pbl9lbnRyeSA9IDA7CisJLyogUG9pbnRzIHRvIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBwcm9jZXNzZWQgaW4gdGhlIGxsaV9vdXRfYXJyYXkgKi8KKwl1MzIgY3VycmVudF9vdXRfZW50cnkgPSAwOworCS8qIE1heCBzaXplIG9mIHRoZSBpbnB1dCB0YWJsZSAqLworCXUzMiBpbl90YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIE1heCBzaXplIG9mIHRoZSBvdXRwdXQgdGFibGUgKi8KKwl1MzIgb3V0X3RhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogRmxhZyB0ZSBzaWduaWZpZXMgaWYgdGhpcyBpcyB0aGUgbGFzdCB0YWJsZXMgYnVpbGQgKi8KKwl1MzIgbGFzdF90YWJsZV9mbGFnID0gMDsKKwkvKiBUaGUgZGF0YSBzaXplIHRoYXQgc2hvdWxkIGJlIGluIHRhYmxlICovCisJdTMyIHRhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogTnVtYmVyIG9mIGV0bnJpZXMgaW4gdGhlIGlucHV0IHRhYmxlICovCisJdTMyIG51bV9lbnRyaWVzX2luX3RhYmxlID0gMDsKKwkvKiBOdW1iZXIgb2YgZXRucmllcyBpbiB0aGUgb3V0cHV0IHRhYmxlICovCisJdTMyIG51bV9lbnRyaWVzX291dF90YWJsZSA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSBzdGFydFxuIik7CisKKwkvKiBJbml0aWF0ZSB0byBwb2ludCBhZnRlciB0aGUgbWVzc2FnZSBhcmVhICovCisJbGxpX3RhYmxlX2FsbG9jX2FkZHIgPSAodm9pZCAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJKHNlcC0+bnVtX2xsaV90YWJsZXNfY3JlYXRlZCAqCisJCShzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApKSk7CisKKwkvKiBMb29wIHRpbGwgYWxsIHRoZSBlbnRyaWVzIGluIGluIGFycmF5IGFyZSBub3QgcHJvY2Vzc2VkICovCisJd2hpbGUgKGN1cnJlbnRfaW5fZW50cnkgPCBzZXBfaW5fbGxpX2VudHJpZXMpIHsKKwkJLyogU2V0IHRoZSBuZXcgaW5wdXQgYW5kIG91dHB1dCB0YWJsZXMgKi8KKwkJaW5fbGxpX3RhYmxlX3B0ciA9CisJCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKilsbGlfdGFibGVfYWxsb2NfYWRkcjsKKworCQlsbGlfdGFibGVfYWxsb2NfYWRkciArPSBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJCS8qIFNldCB0aGUgZmlyc3Qgb3V0cHV0IHRhYmxlcyAqLworCQlvdXRfbGxpX3RhYmxlX3B0ciA9CisJCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKilsbGlfdGFibGVfYWxsb2NfYWRkcjsKKworCQkvKiBDaGVjayBpZiB0aGUgRE1BIHRhYmxlIGFyZWEgbGltaXQgd2FzIG92ZXJydW4gKi8KKwkJaWYgKChsbGlfdGFibGVfYWxsb2NfYWRkciArIHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApID4KKwkJCSgodm9pZCAqKXNlcC0+c2hhcmVkX2FkZHIgKworCQkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMpKSB7CisKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImRtYSB0YWJsZSBsaW1pdCBvdmVycnVuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgdGhlIGxsaSB0YWJsZXMgY3JlYXRlZCAqLworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKz0gMjsKKworCQlsbGlfdGFibGVfYWxsb2NfYWRkciArPSBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBzaXplIG9mIGRhdGEgZm9yIGlucHV0IHRhYmxlICovCisJCWluX3RhYmxlX2RhdGFfc2l6ZSA9CisJCQlzZXBfY2FsY3VsYXRlX2xsaV90YWJsZV9tYXhfc2l6ZShzZXAsCisJCQkmbGxpX2luX2FycmF5W2N1cnJlbnRfaW5fZW50cnldLAorCQkJKHNlcF9pbl9sbGlfZW50cmllcyAtIGN1cnJlbnRfaW5fZW50cnkpLAorCQkJJmxhc3RfdGFibGVfZmxhZyk7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgZGF0YSBmb3Igb3V0cHV0IHRhYmxlICovCisJCW91dF90YWJsZV9kYXRhX3NpemUgPQorCQkJc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUoc2VwLAorCQkJJmxsaV9vdXRfYXJyYXlbY3VycmVudF9vdXRfZW50cnldLAorCQkJKHNlcF9vdXRfbGxpX2VudHJpZXMgLSBjdXJyZW50X291dF9lbnRyeSksCisJCQkmbGFzdF90YWJsZV9mbGFnKTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJpbl90YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQlpbl90YWJsZV9kYXRhX3NpemUpOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dF90YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQlvdXRfdGFibGVfZGF0YV9zaXplKTsKKworCQl0YWJsZV9kYXRhX3NpemUgPSBpbl90YWJsZV9kYXRhX3NpemU7CisKKwkJaWYgKCFsYXN0X3RhYmxlX2ZsYWcpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCB0YWJsZSwKKwkJCSAqIHRoZW4gbXVzdCBjaGVjayB3aGVyZSB0aGUgZGF0YSBpcyBzbWFsbGVzdAorCQkJICogYW5kIHRoZW4gYWxpZ24gaXQgdG8gdGhlIGJsb2NrIHNpemUKKwkJCSAqLworCQkJaWYgKHRhYmxlX2RhdGFfc2l6ZSA+IG91dF90YWJsZV9kYXRhX3NpemUpCisJCQkJdGFibGVfZGF0YV9zaXplID0gb3V0X3RhYmxlX2RhdGFfc2l6ZTsKKworCQkJLyoKKwkJCSAqIE5vdyBjYWxjdWxhdGUgdGhlIHRhYmxlIHNpemUgc28gdGhhdAorCQkJICogaXQgd2lsbCBiZSBtb2R1bGUgYmxvY2sgc2l6ZQorCQkJICovCisJCQl0YWJsZV9kYXRhX3NpemUgPSAodGFibGVfZGF0YV9zaXplIC8gYmxvY2tfc2l6ZSkgKgorCQkJCWJsb2NrX3NpemU7CisJCX0KKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInRhYmxlX2RhdGFfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KKwkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfaW5fYXJyYXlbY3VycmVudF9pbl9lbnRyeV0sCisJCQlpbl9sbGlfdGFibGVfcHRyLAorCQkJJmN1cnJlbnRfaW5fZW50cnksCisJCQkmbnVtX2VudHJpZXNfaW5fdGFibGUsCisJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBvdXRwdXQgbGxpIHRhYmxlICovCisJCXNlcF9idWlsZF9sbGlfdGFibGUoc2VwLCAmbGxpX291dF9hcnJheVtjdXJyZW50X291dF9lbnRyeV0sCisJCQlvdXRfbGxpX3RhYmxlX3B0ciwKKwkJCSZjdXJyZW50X291dF9lbnRyeSwKKwkJCSZudW1fZW50cmllc19vdXRfdGFibGUsCisJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIElmIGluZm8gZW50cnkgaXMgbnVsbCAtIHRoaXMgaXMgdGhlIGZpcnN0IHRhYmxlIGJ1aWx0ICovCisJCWlmIChpbmZvX2luX2VudHJ5X3B0ciA9PSBOVUxMKSB7CisJCQkvKiBTZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCQkJKmxsaV90YWJsZV9pbl9wdHIgPQorCQkJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwgaW5fbGxpX3RhYmxlX3B0cik7CisKKwkJCSppbl9udW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19pbl90YWJsZTsKKworCQkJKmxsaV90YWJsZV9vdXRfcHRyID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCW91dF9sbGlfdGFibGVfcHRyKTsKKworCQkJKm91dF9udW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19vdXRfdGFibGU7CisJCQkqdGFibGVfZGF0YV9zaXplX3B0ciA9IHRhYmxlX2RhdGFfc2l6ZTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkib3V0cHV0IGxsaV90YWJsZV9pbl9wdHIgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKmxsaV90YWJsZV9pbl9wdHIpOworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkib3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSpsbGlfdGFibGVfb3V0X3B0cik7CisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX2luX2VudHJ5X3B0ci0+YnVzX2FkZHJlc3MgPQorCQkJCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsCisJCQkJaW5fbGxpX3RhYmxlX3B0cik7CisKKwkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplID0KKwkJCQkoKG51bV9lbnRyaWVzX2luX3RhYmxlKSA8PCAyNCkgfAorCQkJCSh0YWJsZV9kYXRhX3NpemUpOworCisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX291dF9lbnRyeV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCW91dF9sbGlfdGFibGVfcHRyKTsKKworCQkJaW5mb19vdXRfZW50cnlfcHRyLT5ibG9ja19zaXplID0KKwkJCQkoKG51bV9lbnRyaWVzX291dF90YWJsZSkgPDwgMjQpIHwKKwkJCQkodGFibGVfZGF0YV9zaXplKTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJIm91dHB1dCBsbGlfdGFibGVfaW5fcHRyOiUwOGx4ICUwOHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19pbl9lbnRyeV9wdHItPmJ1c19hZGRyZXNzLAorCQkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplKTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJIm91dHB1dCBsbGlfdGFibGVfb3V0X3B0cjolMDhseCAgJTA4eFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylpbmZvX291dF9lbnRyeV9wdHItPmJ1c19hZGRyZXNzLAorCQkJCWluZm9fb3V0X2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSk7CisJCX0KKworCQkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBjdXJyZW50IHRhYmxlcyAqLworCQlpbmZvX2luX2VudHJ5X3B0ciA9IGluX2xsaV90YWJsZV9wdHIgKworCQkJbnVtX2VudHJpZXNfaW5fdGFibGUgLSAxOworCQlpbmZvX291dF9lbnRyeV9wdHIgPSBvdXRfbGxpX3RhYmxlX3B0ciArCisJCQludW1fZW50cmllc19vdXRfdGFibGUgLSAxOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBudW1fZW50cmllc19vdXRfdGFibGUgaXMgJXhcbiIsCisJCQkodTMyKW51bV9lbnRyaWVzX291dF90YWJsZSk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBpbmZvX2luX2VudHJ5X3B0ciBpcyAlbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZylpbmZvX2luX2VudHJ5X3B0cik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBpbmZvX291dF9lbnRyeV9wdHIgaXMgJWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19vdXRfZW50cnlfcHRyKTsKKwl9CisKKwkvKiBQcmludCBpbnB1dCB0YWJsZXMgKi8KKwlzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzZXAsCisJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJc2VwX3NoYXJlZF9hcmVhX2J1c190b192aXJ0KHNlcCwgKmxsaV90YWJsZV9pbl9wdHIpLAorCSppbl9udW1fZW50cmllc19wdHIsCisJKnRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCisJLyogUHJpbnQgb3V0cHV0IHRhYmxlcyAqLworCXNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzKHNlcCwKKwkoc3RydWN0IHNlcF9sbGlfZW50cnkgKikKKwlzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQoc2VwLCAqbGxpX3RhYmxlX291dF9wdHIpLAorCSpvdXRfbnVtX2VudHJpZXNfcHRyLAorCSp0YWJsZV9kYXRhX3NpemVfcHRyKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpIGVuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZSAtIHByZXBhcmUgRE1BIEkvTyB0YWJsZQorICoJQGFwcF92aXJ0X2luX2FkZHI6CisgKglAYXBwX3ZpcnRfb3V0X2FkZHI6CisgKglAZGF0YV9zaXplOgorICoJQGJsb2NrX3NpemU6CisgKglAbGxpX3RhYmxlX2luX3B0cjoKKyAqCUBsbGlfdGFibGVfb3V0X3B0cjoKKyAqCUBpbl9udW1fZW50cmllc19wdHI6CisgKglAb3V0X251bV9lbnRyaWVzX3B0cjoKKyAqCUB0YWJsZV9kYXRhX3NpemVfcHRyOgorICoJQGlzX2t2YTogc2V0IGZvciBrZXJuZWwgZGF0YTsgdXNlZCBvbmx5IGZvciBrZXJuZWwgY3J5cHRvIG1vZHVsZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gYnVpbGRzIGlucHV0IGFuZCBvdXRwdXQgRE1BIHRhYmxlcyBmb3Igc3luaHJvbmljCisgKglzeW1tZXRyaWMgb3BlcmF0aW9ucyAoQUVTLCBERVMsIEhBU0gpLiBJdCBhbHNvIGNoZWNrcyB0aGF0IGVhY2ggdGFibGUKKyAqCWlzIG9mIHRoZSBtb2R1bGFyIGJsb2NrIHNpemUKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgYXBwX3ZpcnRfaW5fYWRkciwKKwl1bnNpZ25lZCBsb25nIGFwcF92aXJ0X291dF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJdTMyIGJsb2NrX3NpemUsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX2luX3B0ciwKKwlkbWFfYWRkcl90ICpsbGlfdGFibGVfb3V0X3B0ciwKKwl1MzIgKmluX251bV9lbnRyaWVzX3B0ciwKKwl1MzIgKm91dF9udW1fZW50cmllc19wdHIsCisJdTMyICp0YWJsZV9kYXRhX3NpemVfcHRyLAorCWJvb2wgaXNfa3ZhKQorCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBBcnJheSBvZiBwb2ludGVycyBvZiBwYWdlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheTsKKwkvKiBBcnJheSBvZiBwb2ludGVycyBvZiBwYWdlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9vdXRfYXJyYXk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUgc3RhcnRcbiIpOworCisJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCS8qIFByZXBhcmUgZW1wdHkgdGFibGUgZm9yIGlucHV0IGFuZCBvdXRwdXQgKi8KKwkJc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHNlcCwgbGxpX3RhYmxlX2luX3B0ciwKKwkJCWluX251bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwkJc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHNlcCwgbGxpX3RhYmxlX291dF9wdHIsCisJCQlvdXRfbnVtX2VudHJpZXNfcHRyLCB0YWJsZV9kYXRhX3NpemVfcHRyKTsKKworCQlnb3RvIHVwZGF0ZV9kY2JfY291bnRlcjsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYWdlcyBwb2ludGVycyAqLworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBOVUxMOworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9wYWdlX2FycmF5ID0gTlVMTDsKKworCS8qIExvY2sgdGhlIHBhZ2VzIG9mIHRoZSBidWZmZXIgYW5kIHRyYW5zbGF0ZSB0aGVtIHRvIHBhZ2VzICovCisJaWYgKGlzX2t2YSA9PSB0cnVlKSB7CisJCWVycm9yID0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfaW5fYWRkciwKKwkJCWRhdGFfc2l6ZSwgJmxsaV9pbl9hcnJheSwgU0VQX0RSSVZFUl9JTl9GTEFHKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkibG9jayBrZXJuZWwgZm9yIGluIGZhaWxlZFxuIik7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCisJCWVycm9yID0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfb3V0X2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfb3V0X2FycmF5LCBTRVBfRFJJVkVSX09VVF9GTEFHKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkibG9jayBrZXJuZWwgZm9yIG91dCBmYWlsZWRcbiIpOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKwl9CisKKwllbHNlIHsKKwkJZXJyb3IgPSBzZXBfbG9ja191c2VyX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfaW5fYWRkciwKKwkJCQlkYXRhX3NpemUsICZsbGlfaW5fYXJyYXksIFNFUF9EUklWRVJfSU5fRkxBRyk7CisJCWlmIChlcnJvcikgeworCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJzZXBfbG9ja191c2VyX3BhZ2VzIGZvciBpbnB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIpOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKworCQllcnJvciA9IHNlcF9sb2NrX3VzZXJfcGFnZXMoc2VwLCBhcHBfdmlydF9vdXRfYWRkciwKKwkJCWRhdGFfc2l6ZSwgJmxsaV9vdXRfYXJyYXksIFNFUF9EUklWRVJfT1VUX0ZMQUcpOworCisJCWlmIChlcnJvcikgeworCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJzZXBfbG9ja191c2VyX3BhZ2VzIGZvciBvdXRwdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfbGxpX2luOworCQl9CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfaW5fbnVtX3BhZ2VzIGlzICV4XG4iLAorCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX291dF9udW1fcGFnZXMgaXMgJXhcbiIsCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9udW1fcGFnZXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVAgaXMgJXhcbiIsCisJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKTsKKworCS8qIENhbGwgdGhlIGZ1Y250aW9uIHRoYXQgY3JlYXRlcyB0YWJsZSBmcm9tIHRoZSBsbGkgYXJyYXlzICovCisJZXJyb3IgPSBzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkoc2VwLCBsbGlfaW5fYXJyYXksCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcywKKwkJbGxpX291dF9hcnJheSwKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X251bV9wYWdlcywKKwkJYmxvY2tfc2l6ZSwgbGxpX3RhYmxlX2luX3B0ciwgbGxpX3RhYmxlX291dF9wdHIsCisJCWluX251bV9lbnRyaWVzX3B0ciwgb3V0X251bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJInNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSBmYWlsZWRcbiIpOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yOworCX0KKworCWtmcmVlKGxsaV9vdXRfYXJyYXkpOworCWtmcmVlKGxsaV9pbl9hcnJheSk7CisKK3VwZGF0ZV9kY2JfY291bnRlcjoKKwkvKiBVcGRhdGUgRENCIGNvdW50ZXIgKi8KKwlzZXAtPm5yX2RjYl9jcmVhdCsrOworCS8qIEZhbGwgdGhyb3VnaCAtIGZyZWUgdGhlIGxsaSBlbnRyeSBhcnJheXMgKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImluX251bV9lbnRyaWVzX3B0ciBpcyAlMDh4XG4iLAorCQkJCQkJKmluX251bV9lbnRyaWVzX3B0cik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJvdXRfbnVtX2VudHJpZXNfcHRyIGlzICUwOHhcbiIsCisJCQkJCQkqb3V0X251bV9lbnRyaWVzX3B0cik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZV9kYXRhX3NpemVfcHRyIGlzICUwOHhcbiIsCisJCQkJCQkqdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I6CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9hcnJheSk7CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkpOworCWtmcmVlKGxsaV9vdXRfYXJyYXkpOworCisKK2VuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjoKKwlrZnJlZShzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfYXJyYXkpOworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkpOworCWtmcmVlKGxsaV9pbl9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUgZW5kIHJlc3VsdCA9ICVkXG4iLCBlcnJvcik7CisKKwlyZXR1cm4gZXJyb3I7CisKK30KKworLyoqCisgKglzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYiAtIHByZXBhcmUgY29udHJvbCBibG9ja3MKKyAqCUBhcHBfaW5fYWRkcmVzczogdW5zaWduZWQgbG9uZzsgZm9yIGRhdGEgYnVmZmVyIGluICh1c2VyIHNwYWNlKQorICoJQGFwcF9vdXRfYWRkcmVzczogdW5zaWduZWQgbG9uZzsgZm9yIGRhdGEgYnVmZmVyIG91dCAodXNlciBzcGFjZSkKKyAqCUBkYXRhX2luX3NpemU6IHUzMjsgZm9yIHNpemUgb2YgZGF0YQorICoJQGJsb2NrX3NpemU6IHUzMjsgZm9yIGJsb2NrIHNpemUKKyAqCUB0YWlsX2Jsb2NrX3NpemU6IHUzMjsgZm9yIHNpemUgb2YgdGFpbCBibG9jaworICoJQGlzYXBwbGV0OiBib29sOyB0byBpbmRpY2F0ZSBleHRlcm5hbCBhcHAKKyAqCUBpc19rdmE6IGJvb2w7IGtlcm5lbCBidWZmZXI7IG9ubHkgdXNlZCBmb3Iga2VybmVsIGNyeXB0byBtb2R1bGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBsaW5rZWQgRE1BIHRhYmxlcyBhbmQgcHV0cyB0aGUKKyAqCWFkZHJlc3MgZm9yIHRoZSBsaW5rZWQgbGlzdCBvZiB0YWJsZXMgaW50YSBhIERDQiAoZGF0YSBjb250cm9sCisgKglibG9jaykgdGhlIGFkZHJlc3Mgb2Ygd2hpY2ggaXMga25vd24gYnkgdGhlIFNFUCBoYXJkd2FyZQorICoJTm90ZSB0aGF0IGFsbCBidXMgYWRkcmVzc2VzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgU0VQCisgKglhcmUgaW4gMzIgYml0IGZvcm1hdDsgdGhlIFNFUCBpcyBhIDMyIGJpdCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgIGFwcF9pbl9hZGRyZXNzLAorCXVuc2lnbmVkIGxvbmcgIGFwcF9vdXRfYWRkcmVzcywKKwl1MzIgIGRhdGFfaW5fc2l6ZSwKKwl1MzIgIGJsb2NrX3NpemUsCisJdTMyICB0YWlsX2Jsb2NrX3NpemUsCisJYm9vbCBpc2FwcGxldCwKKwlib29sCWlzX2t2YSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIFNpemUgb2YgdGFpbCAqLworCXUzMiB0YWlsX3NpemUgPSAwOworCS8qIEFkZHJlc3Mgb2YgdGhlIGNyZWF0ZWQgRENCIHRhYmxlICovCisJc3RydWN0IHNlcF9kY2Jsb2NrICpkY2JfdGFibGVfcHRyID0gTlVMTDsKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgRE1BIHRhYmxlICovCisJZG1hX2FkZHJfdCBpbl9maXJzdF9tbGxpX2FkZHJlc3MgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBpbnB1dCBETUEgdGFibGUgKi8KKwl1MzIgIGluX2ZpcnN0X251bV9lbnRyaWVzID0gMDsKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb3V0cHV0IERNQSB0YWJsZSAqLworCWRtYV9hZGRyX3QgIG91dF9maXJzdF9tbGxpX2FkZHJlc3MgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBvdXRwdXQgRE1BIHRhYmxlICovCisJdTMyICBvdXRfZmlyc3RfbnVtX2VudHJpZXMgPSAwOworCS8qIERhdGEgaW4gdGhlIGZpcnN0IGlucHV0L291dHB1dCB0YWJsZSAqLworCXUzMiAgZmlyc3RfZGF0YV9zaXplID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYiBzdGFydFxuIik7CisKKwlpZiAoc2VwLT5ucl9kY2JfY3JlYXQgPT0gU0VQX01BWF9OVU1fU1lOQ19ETUFfT1BTKSB7CisJCS8qIE5vIG1vcmUgRENCcyB0byBhbGxvY2F0ZSAqLworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJubyBtb3JlIERDQnMgYXZhaWxhYmxlXG4iKTsKKwkJZXJyb3IgPSAtRU5PU1BDOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXcgRENCICovCisJZGNiX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2RjYmxvY2sgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsKKwkJKHNlcC0+bnJfZGNiX2NyZWF0ICogc2l6ZW9mKHN0cnVjdCBzZXBfZGNibG9jaykpKTsKKworCS8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIERDQiAqLworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfYWRkcmVzcyA9IDA7CisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9udW1fZW50cmllcyA9IDA7CisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9kYXRhX3NpemUgPSAwOworCWRjYl90YWJsZV9wdHItPm91dHB1dF9tbGxpX2FkZHJlc3MgPSAwOworCWRjYl90YWJsZV9wdHItPm91dHB1dF9tbGxpX251bV9lbnRyaWVzID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9kYXRhX3NpemUgPSAwOworCWRjYl90YWJsZV9wdHItPnRhaWxfZGF0YV9zaXplID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRfdnJfdGFpbF9wdCA9IDA7CisKKwlpZiAoaXNhcHBsZXQgPT0gdHJ1ZSkgeworCQl0YWlsX3NpemUgPSBkYXRhX2luX3NpemUgJSBibG9ja19zaXplOworCQlpZiAodGFpbF9zaXplKSB7CisJCQlpZiAoZGF0YV9pbl9zaXplIDwgdGFpbF9ibG9ja19zaXplKSB7CisJCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiZGF0YSBpbiBzaXplIHNtYWxsZXIgdGhhbiB0YWlsIGJsb2NrIHNpemVcbiIpOworCQkJCWVycm9yID0gLUVOT1NQQzsKKwkJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJCX0KKwkJCWlmICh0YWlsX2Jsb2NrX3NpemUpCisJCQkJLyoKKwkJCQkgKiBDYXNlIHRoZSB0YWlsIHNpemUgc2hvdWxkIGJlCisJCQkJICogYmlnZ2VyIHRoYW4gdGhlIHJlYWwgYmxvY2sgc2l6ZQorCQkJCSAqLworCQkJCXRhaWxfc2l6ZSA9IHRhaWxfYmxvY2tfc2l6ZSArCisJCQkJCSgoZGF0YV9pbl9zaXplIC0KKwkJCQkJCXRhaWxfYmxvY2tfc2l6ZSkgJSBibG9ja19zaXplKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBkYXRhIGZvciBETUEgb3BlcmF0aW9uICovCisJCWlmIChkYXRhX2luX3NpemUgPCBTRVBfRFJJVkVSX01JTl9EQVRBX1NJWkVfUEVSX1RBQkxFKSB7CisJCQlpZiAoaXNfa3ZhID09IHRydWUpIHsKKwkJCQltZW1jcHkoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCAqKWFwcF9pbl9hZGRyZXNzLCBkYXRhX2luX3NpemUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCBfX3VzZXIgKilhcHBfaW5fYWRkcmVzcywKKwkJCQkJZGF0YV9pbl9zaXplKSkgeworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQkJCX0KKwkJCX0KKworCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUgPSBkYXRhX2luX3NpemU7CisKKwkJCS8qIFNldCB0aGUgb3V0cHV0IHVzZXItc3BhY2UgYWRkcmVzcyBmb3IgbWVtMm1lbSBvcCAqLworCQkJaWYgKGFwcF9vdXRfYWRkcmVzcykKKwkJCQlkY2JfdGFibGVfcHRyLT5vdXRfdnJfdGFpbF9wdCA9CisJCQkJCQkJKHUzMilhcHBfb3V0X2FkZHJlc3M7CisKKwkJCS8qCisJCQkgKiBVcGRhdGUgYm90aCBkYXRhIGxlbmd0aCBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGF2b2lkCisJCQkgKiBzZWNvbmQgZGF0YSBjb3B5IGFuZCBhbGxvdyBidWlsZGluZyBvZiBlbXB0eSBtbGxpCisJCQkgKiB0YWJsZXMKKwkJCSAqLworCQkJdGFpbF9zaXplID0gMHgwOworCQkJZGF0YV9pbl9zaXplID0gMHgwOworCQl9CisJCWlmICh0YWlsX3NpemUpIHsKKwkJCWlmIChpc19rdmEgPT0gdHJ1ZSkgeworCQkJCW1lbWNweShkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCSh2b2lkICopKGFwcF9pbl9hZGRyZXNzICsgZGF0YV9pbl9zaXplIC0KKwkJCQkJdGFpbF9zaXplKSwgdGFpbF9zaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2UgaGF2ZSB0YWlsIGRhdGEgLSBjb3B5IGl0IHRvIERDQiAqLworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCSh2b2lkICopKGFwcF9pbl9hZGRyZXNzICsKKwkJCQkJZGF0YV9pbl9zaXplIC0gdGFpbF9zaXplKSwgdGFpbF9zaXplKSkgeworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQkJCX0KKwkJCX0KKwkJCWlmIChhcHBfb3V0X2FkZHJlc3MpCisJCQkJLyoKKwkJCQkgKiBDYWxjdWxhdGUgdGhlIG91dHB1dCBhZGRyZXNzCisJCQkJICogYWNjb3JkaW5nIHRvIHRhaWwgZGF0YSBzaXplCisJCQkJICovCisJCQkJZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQgPQorCQkJCQkodTMyKWFwcF9vdXRfYWRkcmVzcyArIGRhdGFfaW5fc2l6ZQorCQkJCQktIHRhaWxfc2l6ZTsKKworCQkJLyogU2F2ZSB0aGUgcmVhbCB0YWlsIGRhdGEgc2l6ZSAqLworCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUgPSB0YWlsX3NpemU7CisJCQkvKgorCQkJICogVXBkYXRlIHRoZSBkYXRhIHNpemUgd2l0aG91dCB0aGUgdGFpbAorCQkJICogZGF0YSBzaXplIEFLQSBkYXRhIGZvciB0aGUgZG1hCisJCQkgKi8KKwkJCWRhdGFfaW5fc2l6ZSA9IChkYXRhX2luX3NpemUgLSB0YWlsX3NpemUpOworCQl9CisJfQorCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYnVpbGQgb25seSBpbnB1dCB0YWJsZSBvciBpbnB1dC9vdXRwdXQgKi8KKwlpZiAoYXBwX291dF9hZGRyZXNzKSB7CisJCS8qIFByZXBhcmUgaW5wdXQvb3V0cHV0IHRhYmxlcyAqLworCQllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUoc2VwLAorCQkJYXBwX2luX2FkZHJlc3MsCisJCQlhcHBfb3V0X2FkZHJlc3MsCisJCQlkYXRhX2luX3NpemUsCisJCQlibG9ja19zaXplLAorCQkJJmluX2ZpcnN0X21sbGlfYWRkcmVzcywKKwkJCSZvdXRfZmlyc3RfbWxsaV9hZGRyZXNzLAorCQkJJmluX2ZpcnN0X251bV9lbnRyaWVzLAorCQkJJm91dF9maXJzdF9udW1fZW50cmllcywKKwkJCSZmaXJzdF9kYXRhX3NpemUsCisJCQlpc19rdmEpOworCX0gZWxzZSB7CisJCS8qIFByZXBhcmUgaW5wdXQgdGFibGVzICovCisJCWVycm9yID0gc2VwX3ByZXBhcmVfaW5wdXRfZG1hX3RhYmxlKHNlcCwKKwkJCWFwcF9pbl9hZGRyZXNzLAorCQkJZGF0YV9pbl9zaXplLAorCQkJYmxvY2tfc2l6ZSwKKwkJCSZpbl9maXJzdF9tbGxpX2FkZHJlc3MsCisJCQkmaW5fZmlyc3RfbnVtX2VudHJpZXMsCisJCQkmZmlyc3RfZGF0YV9zaXplLAorCQkJaXNfa3ZhKTsKKwl9CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgZnJvbSBwcmVwYXJlIERDQiBjYWxsXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogU2V0IHRoZSBEQ0IgdmFsdWVzICovCisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9hZGRyZXNzID0gaW5fZmlyc3RfbWxsaV9hZGRyZXNzOworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfbnVtX2VudHJpZXMgPSBpbl9maXJzdF9udW1fZW50cmllczsKKwlkY2JfdGFibGVfcHRyLT5pbnB1dF9tbGxpX2RhdGFfc2l6ZSA9IGZpcnN0X2RhdGFfc2l6ZTsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9hZGRyZXNzID0gb3V0X2ZpcnN0X21sbGlfYWRkcmVzczsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9udW1fZW50cmllcyA9IG91dF9maXJzdF9udW1fZW50cmllczsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9kYXRhX3NpemUgPSBmaXJzdF9kYXRhX3NpemU7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGVfaW5fZGNiIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworCit9CisKKworLyoqCisgKglzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyIC0gY3JlYXRlIHN5bmMgRE1BIHRhYmxlcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byBzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0CisgKgorICoJSGFuZGxlIHRoZSByZXF1ZXN0IGZvciBjcmVhdGlvbiBvZiB0aGUgRE1BIHRhYmxlcyBmb3IgdGhlIHN5bmNocm9uaWMKKyAqCXN5bW1ldHJpYyBvcGVyYXRpb25zIChBRVMsREVTKS4gTm90ZSB0aGF0IGFsbCBidXMgYWRkcmVzc2VzIHRoYXQgYXJlCisgKglwYXNzZWQgdG8gdGhlIFNFUCBhcmUgaW4gMzIgYml0IGZvcm1hdDsgdGhlIFNFUCBpcyBhIDMyIGJpdCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogQ29tbWFuZCBhcmd1bWVudHMgKi8KKwlzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX2NyZWF0ZV9zeW5jX2RtYV90YWJsZXNfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfaW5fYWRkcmVzcyBpcyAlMDhsbHhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYXBwX291dF9hZGRyZXNzIGlzICUwOGxseFxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5hcHBfb3V0X2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV1XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmRhdGFfaW5fc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJibG9ja19zaXplIGlzICV1XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmJsb2NrX3NpemUpOworCisJLyogVmFsaWRhdGUgdXNlciBwYXJhbWV0ZXJzICovCisJaWYgKCFjb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGVfaW5fZGNiKHNlcCwKKwkJKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLmFwcF9pbl9hZGRyZXNzLAorCQkodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuYXBwX291dF9hZGRyZXNzLAorCQljb21tYW5kX2FyZ3MuZGF0YV9pbl9zaXplLAorCQljb21tYW5kX2FyZ3MuYmxvY2tfc2l6ZSwKKwkJMHgwLAorCQlmYWxzZSwKKwkJZmFsc2UpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYiAtIGZyZWUgRE1BIHRhYmxlcyBhbmQgRENCcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGlzYXBwbGV0OiBpbmRpY2F0ZXMgZXh0ZXJuYWwgYXBwbGljYXRpb24gKHVzZWQgZm9yIGtlcm5lbCBhY2Nlc3MpCisgKglAaXNfa3ZhOiBpbmRpY2F0ZXMga2VybmVsIGFkZHJlc3NlcyAob25seSB1c2VkIGZvciBrZXJuZWwgY3J5cHRvKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIERNQSB0YWJsZXMgYW5kIERDQgorICovCitzdGF0aWMgaW50IHNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLCBib29sIGlzYXBwbGV0LAorCWJvb2wgaXNfa3ZhKQoreworCWludCBpID0gMDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBlcnJvcl90ZW1wID0gMDsKKwlzdHJ1Y3Qgc2VwX2RjYmxvY2sgKmRjYl90YWJsZV9wdHI7CisJdW5zaWduZWQgbG9uZyBwdF9ob2xkOworCXZvaWQgKnRhaWxfcHQ7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYiBzdGFydFxuIik7CisKKwlpZiAoaXNhcHBsZXQgPT0gdHJ1ZSkgeworCQkvKiBTZXQgcG9pbnRlciB0byBmaXJzdCBEQ0IgdGFibGUgKi8KKwkJZGNiX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2RjYmxvY2sgKikKKwkJCShzZXAtPnNoYXJlZF9hZGRyICsKKwkJCVNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKTsKKworCQkvKiBHbyBvdmVyIGVhY2ggRENCIGFuZCBzZWUgaWYgdGFpbCBwb2ludGVyIG11c3QgYmUgdXBkYXRlZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2VwLT5ucl9kY2JfY3JlYXQ7IGkrKywgZGNiX3RhYmxlX3B0cisrKSB7CisJCQlpZiAoZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQpIHsKKwkJCQlwdF9ob2xkID0gKHVuc2lnbmVkIGxvbmcpZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQ7CisJCQkJdGFpbF9wdCA9ICh2b2lkICopcHRfaG9sZDsKKwkJCQlpZiAoaXNfa3ZhID09IHRydWUpIHsKKwkJCQkJbWVtY3B5KHRhaWxfcHQsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGFfc2l6ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyb3JfdGVtcCA9IGNvcHlfdG9fdXNlcigKKwkJCQkJCXRhaWxfcHQsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGFfc2l6ZSk7CisJCQkJfQorCQkJCWlmIChlcnJvcl90ZW1wKSB7CisJCQkJCS8qIFJlbGVhc2UgdGhlIERNQSByZXNvdXJjZSAqLworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiBGcmVlIHRoZSBvdXRwdXQgcGFnZXMsIGlmIGFueSAqLworCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2ZyZWVfZG1hX3RhYmxlc19hbmRfZGNiIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9nZXRfc3RhdGljX3Bvb2xfYWRkcl9oYW5kbGVyIC0gZ2V0IHN0YXRpYyBwb29sIGFkZHJlc3MKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGJ1cyBhbmQgdmlydHVhbCBhZGRyZXNzZXMgb2YgdGhlIHN0YXRpYyBwb29sCisgKi8KK3N0YXRpYyBpbnQgc2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1MzIgKnN0YXRpY19wb29sX2FkZHIgPSBOVUxMOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZ2V0X3N0YXRpY19wb29sX2FkZHJfaGFuZGxlciBzdGFydFxuIik7CisKKwlzdGF0aWNfcG9vbF9hZGRyID0gKHUzMiAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMpOworCisJc3RhdGljX3Bvb2xfYWRkclswXSA9IFNFUF9TVEFUSUNfUE9PTF9WQUxfVE9LRU47CisJc3RhdGljX3Bvb2xfYWRkclsxXSA9ICh1MzIpc2VwLT5zaGFyZWRfYnVzICsKKwkJU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9PRkZTRVRfSU5fQllURVM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXRpYyBwb29sOiBwaHlzaWNhbCAleFxuIiwKKwkJKHUzMilzdGF0aWNfcG9vbF9hZGRyWzFdKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIgZW5kXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zdGFydF9oYW5kbGVyIC0gc3RhcnQgZGV2aWNlCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3N0YXJ0X2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ192YWw7CisJdW5zaWduZWQgbG9uZyBlcnJvciA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zdGFydF9oYW5kbGVyIHN0YXJ0XG4iKTsKKworCS8qIFdhaXQgaW4gcG9sbGluZyBmb3IgbWVzc2FnZSBmcm9tIFNFUCAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisJfSB3aGlsZSAoIXJlZ192YWwpOworCisJLyogQ2hlY2sgdGhlIHZhbHVlICovCisJaWYgKHJlZ192YWwgPT0gMHgxKQorCQkvKiBGYXRhbCBlcnJvciAtIHJlYWQgZXJyb3Igc3RhdHVzIGZyb20gR1BSTyAqLworCQllcnJvciA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMF9SRUdfQUREUik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc3RhcnRfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKgllcF9jaGVja19zdW1fY2FsYyAtIGNoZWNrc3VtIG1lc3NhZ2VzCisgKglAZGF0YTogYnVmZmVyIHRvIGNoZWNrc3VtCisgKglAbGVuZ3RoOiBidWZmZXIgc2l6ZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBjaGVja3N1bSBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgc2VudAorICoJdG8gdGhlIFNFUC4KKyAqLworc3RhdGljIHUzMiBzZXBfY2hlY2tfc3VtX2NhbGModTggKmRhdGEsIHUzMiBsZW5ndGgpCit7CisJdTMyIHN1bSA9IDA7CisJdTE2ICpUZGF0YSA9ICh1MTYgKilkYXRhOworCisJd2hpbGUgKGxlbmd0aCA+IDEpIHsKKwkJLyogIFRoaXMgaXMgdGhlIGlubmVyIGxvb3AgKi8KKwkJc3VtICs9ICpUZGF0YSsrOworCQlsZW5ndGggLT0gMjsKKwl9CisKKwkvKiAgQWRkIGxlZnQtb3ZlciBieXRlLCBpZiBhbnkgKi8KKwlpZiAobGVuZ3RoID4gMCkKKwkJc3VtICs9ICoodTggKilUZGF0YTsKKworCS8qICBGb2xkIDMyLWJpdCBzdW0gdG8gMTYgYml0cyAqLworCXdoaWxlIChzdW0+PjE2KQorCQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCisJcmV0dXJuIH5zdW0gJiAweEZGRkY7Cit9CisKKy8qKgorICoJc2VwX2luaXRfaGFuZGxlciAtCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYXJnOiBwYXJhbWV0ZXJzIGZyb20gdXNlciBzcGFjZSBhcHBsaWNhdGlvbgorICoKKyAqCUhhbmRsZXMgdGhlIHJlcXVlc3QgZm9yIFNFUCBpbml0aWFsaXphdGlvbgorICoJTm90ZSB0aGF0IHRoaXMgd2lsbCBnbyBhd2F5IGZvciBNZWRmaWVsZCBvbmNlIHRoZSBTQ1UKKyAqCVNFUCBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZQorICoJQWxzbyBub3RlIHRoYXQgdGhlIG1lc3NhZ2UgdG8gdGhlIFNFUCBoYXMgY29tcG9uZW50cworICoJZnJvbSB1c2VyIHNwYWNlIGFzIHdlbGwgYXMgY29tcG9uZW50cyB3cml0dGVuIGJ5IHRoZSBkcml2ZXIKKyAqCVRoaXMgaXMgYmVjdWFzZSB0aGUgcG9ydGlvbnMgb2YgdGhlIG1lc3NhZ2UgdGhhdCBwZXJ0YWluIHRvCisgKglwaHlzaWNhbCBhZGRyZXNzZXMgbXVzdCBiZSBzZXQgYnkgdGhlIGRyaXZlciBhZnRlciB0aGUgbWVzc2FnZQorICoJbGVhdmVzIGN1c3RvZHkgb2YgdGhlIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gZm9yIHNlY3VyaXR5CisgKglyZWFzb25zLgorICovCitzdGF0aWMgaW50IHNlcF9pbml0X2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdTMyIG1lc3NhZ2VfYnVmZlsxNF07CisJdTMyIGNvdW50ZXI7CisJaW50IGVycm9yID0gMDsKKwl1MzIgcmVnX3ZhbDsKKwlkbWFfYWRkcl90IG5ld19iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBhZGRyX2hvbGQ7CisJc3RydWN0IGluaXRfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2luaXRfaGFuZGxlciBzdGFydFxuIik7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIG5vdCBpbml0aWFsaXplZCBhbHJlYWR5ICovCisJcmVnX3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisKKwlpZiAocmVnX3ZhbCAhPSAweDIpIHsKKwkJZXJyb3IgPSBTRVBfQUxSRUFEWV9JTklUSUFMSVpFRF9FUlI7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImluaXQ7IGRldmljZSBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogT25seSByb290IGNhbiBpbml0aWFsaXplICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWVycm9yID0gLUVBQ0NFUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQ29weSBpbiB0aGUgcGFyYW1ldGVycyAqLworCWVycm9yID0gY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQlzaXplb2Yoc3RydWN0IGluaXRfc3RydWN0KSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCisJaWYgKCFjb21tYW5kX2FyZ3MubWVzc2FnZV9hZGRyIHx8ICFjb21tYW5kX2FyZ3Muc2VwX3NyYW1fYWRkciB8fAorCQljb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzID4gMTQpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDb3B5IGluIHRoZSBTRVAgaW5pdCBtZXNzYWdlICovCisJYWRkcl9ob2xkID0gKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLm1lc3NhZ2VfYWRkcjsKKwllcnJvciA9IGNvcHlfZnJvbV91c2VyKG1lc3NhZ2VfYnVmZiwKKwkJKHZvaWQgX191c2VyICopYWRkcl9ob2xkLAorCQljb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzKnNpemVvZih1MzIpKTsKKworCWlmIChlcnJvcikgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIExvYWQgcmVzaWRlbnQsIGNhY2hlLCBhbmQgZXh0YXBwIGZpcm13YXJlICovCisJZXJyb3IgPSBzZXBfbG9hZF9maXJtd2FyZShzZXApOworCisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJpbml0OyBjb3B5IFNFUCBpbml0IG1lc3NhZ2UgZmFpbGVkICV4XG4iLCBlcnJvcik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIENvbXB1dGUgdGhlIGJhc2UgYWRkcmVzcyAqLworCW5ld19iYXNlX2FkZHIgPSBzZXAtPnNoYXJlZF9idXM7CisKKwlpZiAoc2VwLT5yZXNpZGVudF9idXMgPCBuZXdfYmFzZV9hZGRyKQorCQluZXdfYmFzZV9hZGRyID0gc2VwLT5yZXNpZGVudF9idXM7CisKKwlpZiAoc2VwLT5jYWNoZV9idXMgPCBuZXdfYmFzZV9hZGRyKQorCQluZXdfYmFzZV9hZGRyID0gc2VwLT5jYWNoZV9idXM7CisKKwlpZiAoc2VwLT5kY2FjaGVfYnVzIDwgbmV3X2Jhc2VfYWRkcikKKwkJbmV3X2Jhc2VfYWRkciA9IHNlcC0+ZGNhY2hlX2J1czsKKworCS8qIFB1dCBwaHlzaWNhbCBhZGRyZXNzZXMgaW4gU0VQIG1lc3NhZ2UgKi8KKwltZXNzYWdlX2J1ZmZbM10gPSAodTMyKW5ld19iYXNlX2FkZHI7CisJbWVzc2FnZV9idWZmWzRdID0gKHUzMilzZXAtPnNoYXJlZF9idXM7CisJbWVzc2FnZV9idWZmWzZdID0gKHUzMilzZXAtPnJlc2lkZW50X2J1czsKKwltZXNzYWdlX2J1ZmZbN10gPSAodTMyKXNlcC0+Y2FjaGVfYnVzOworCW1lc3NhZ2VfYnVmZls4XSA9ICh1MzIpc2VwLT5kY2FjaGVfYnVzOworCisJbWVzc2FnZV9idWZmW2NvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHMgLSAxXSA9IDB4MDsKKwltZXNzYWdlX2J1ZmZbY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcyAtIDFdID0KKwkJc2VwX2NoZWNrX3N1bV9jYWxjKCh1OCAqKW1lc3NhZ2VfYnVmZiwKKwkJY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcypzaXplb2YodTMyKSk7CisKKwkvKiBEZWJ1ZyBwcmludCBvZiBtZXNzYWdlICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGNvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHM7CisJCQkJCQkJCWNvdW50ZXIrKykKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBTRVAgbWVzc2FnZSB3b3JkICVkIGlzICV4XG4iLAorCQkJY291bnRlciwgbWVzc2FnZV9idWZmW2NvdW50ZXJdKTsKKworCS8qIFRlbGwgdGhlIFNFUCB0aGUgc3JhbSBhZGRyZXNzICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX1NSQU1fQUREUl9SRUdfQUREUiwgY29tbWFuZF9hcmdzLnNlcF9zcmFtX2FkZHIpOworCisJLyogUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgU0VQICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGNvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHM7CisJCQkJCQkJCWNvdW50ZXIrKykgeworCQlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfU1JBTV9EQVRBX1JFR19BRERSLAorCQkJCQkJbWVzc2FnZV9idWZmW2NvdW50ZXJdKTsKKwkJc2VwX3dhaXRfc3JhbV93cml0ZShzZXApOworCX0KKworCS8qIFNpZ25hbCBTRVAgdGhhdCBtZXNzYWdlIGlzIHJlYWR5IGFuZCB0byBpbml0ICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUiwgMHgxKTsKKworCS8qIFdhaXQgZm9yIGFja25vd2xlZGdlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyB3YWl0aW5nIGZvciBtc2cgcmVzcG9uc2VcbiIpOworCisJZG8geworCQlyZWdfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIzX1JFR19BRERSKTsKKwl9IHdoaWxlICghKHJlZ192YWwgJiAweEZGRkZGRkZEKSk7CisKKwlpZiAocmVnX3ZhbCA9PSAweDEpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgZGV2aWNlIGludCBmYWlsZWRcbiIpOworCQllcnJvciA9IHNlcF9yZWFkX3JlZyhzZXAsIDB4ODA2MCk7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImluaXQ7IHN3IG1vbml0b3IgaXMgJXhcbiIsIGVycm9yKTsKKwkJZXJyb3IgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjBfUkVHX0FERFIpOworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBlcnJvciBpcyAleFxuIiwgZXJyb3IpOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBlbmQgQ0MgSU5JVCwgcmVnX3ZhbCBpcyAleFxuIiwgcmVnX3ZhbCk7CisKKwkvKiBTaWduYWwgU0VQIHRvIHplcm8gdGhlIEdQUjMgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIwX1JFR19BRERSLCAweDEwKTsKKworCS8qIFdhaXQgZm9yIHJlc3BvbnNlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyB3YWl0aW5nIGZvciB6ZXJvIHNldCByZXNwb25zZVxuIik7CisKKwlkbyB7CisJCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjNfUkVHX0FERFIpOworCX0gd2hpbGUgKHJlZ192YWwgIT0gMCk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImluaXQgaXMgZG9uZVxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9lbmRfdHJhbnNhY3Rpb25faGFuZGxlciAtIGVuZCB0cmFuc2FjdGlvbgorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoKKyAqCVRoaXMgQVBJIGhhbmRsZXMgdGhlIGVuZCB0cmFuc2FjdGlvbiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgc2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZW5kX3RyYW5zYWN0aW9uX2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogQ2xlYXIgdGhlIGRhdGEgcG9vbCBwb2ludGVycyBUb2tlbiAqLworCW1lbXNldCgodm9pZCAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0RSSVZFUl9EQVRBX1BPT0xfQUxMT0NBVElPTl9PRkZTRVRfSU5fQllURVMpLAorCQkwLCBzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zKjIqc2l6ZW9mKHUzMikpOworCisJLyogQ2hlY2sgdGhhdCBhbGwgdGhlIERNQSByZXNvdXJjZXMgd2VyZSBmcmVlZCAqLworCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKworCWNsZWFyX2JpdChTRVBfTU1BUF9MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKTsKKworCS8qCisJICogV2UgYXJlIG5vdyB0aHJvdWdoIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBMZXQncworCSAqIGFsbG93IG90aGVyIHByb2Nlc3NlcyB3aG8gaGF2ZSB0aGUgZGV2aWNlIG9wZW4KKwkgKiB0byBwZXJmb3JtIHRyYW5zYWN0aW9ucworCSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJLyogUmFpc2UgZXZlbnQgZm9yIHN0dWNrIGNvbnRleHRlcyAqLworCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ3YWtpbmcgdXAgZXZlbnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyIGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciAtIHByZXBhcmUgYSBjb250cm9sIGJsb2NrCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYXJnOiBwb2ludGVyIHRvIHVzZXIgcGFyYW1ldGVycworICoKKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCByZXRyaWV2ZSB0aGUgUkFSIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzZXMsIHR5cGUKKyAqCSYgc2l6ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBSQVIgaGFuZGxlcyBwcm92aWRlZCBpbiB0aGUgYnVmZmVycyB2ZWN0b3IuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yOworCS8qIENvbW1hbmQgYXJndW1lbnRzICovCisJc3RydWN0IGJ1aWxkX2RjYl9zdHJ1Y3QgY29tbWFuZF9hcmdzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciBzdGFydFxuIik7CisKKwkvKiBHZXQgdGhlIGNvbW1hbmQgYXJndW1lbnRzICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidWlsZF9kY2Jfc3RydWN0KSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImFwcF9pbl9hZGRyZXNzIGlzICUwOGxseFxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5hcHBfaW5fYWRkcmVzcyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfb3V0X2FkZHJlc3MgaXMgJTA4bGx4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmFwcF9vdXRfYWRkcmVzcyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuZGF0YV9pbl9zaXplKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYmxvY2tfc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWlsIGJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MudGFpbF9ibG9ja19zaXplKTsKKworCWVycm9yID0gc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZV9pbl9kY2Ioc2VwLAorCQkodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MsCisJCSh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5hcHBfb3V0X2FkZHJlc3MsCisJCWNvbW1hbmRfYXJncy5kYXRhX2luX3NpemUsIGNvbW1hbmRfYXJncy5ibG9ja19zaXplLAorCQljb21tYW5kX2FyZ3MudGFpbF9ibG9ja19zaXplLCB0cnVlLCBmYWxzZSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2RjYl9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworCit9CisKKy8qKgorICoJc2VwX2ZyZWVfZGNiX2hhbmRsZXIgLSBmcmVlIGNvbnRyb2wgYmxvY2sgcmVzb3VyY2VzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgRENCIHJlc291cmNlcyBhbmQgdXBkYXRlcyB0aGUgbmVlZGVkCisgKgl1c2VyLXNwYWNlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgc2VwX2ZyZWVfZGNiX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgZXJyb3IgOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJudW0gb2YgRENCcyAleFxuIiwgc2VwLT5ucl9kY2JfY3JlYXQpOworCisJZXJyb3IgPSBzZXBfZnJlZV9kbWFfdGFibGVzX2FuZF9kY2Ioc2VwLCBmYWxzZSwgZmFsc2UpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kY2JfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyIC0gcHJlcGFyZSBhbiBvdXRwdXQgbWVzc2FnZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhcmFtZXRlcnMKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0cmlldmUgdGhlIFJBUiBidWZmZXIgcGh5c2ljYWwgYWRkcmVzc2VzLCB0eXBlCisgKgkmIHNpemUgY29ycmVzcG9uZGluZyB0byB0aGUgUkFSIGhhbmRsZXMgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcnMgdmVjdG9yLgorICovCitzdGF0aWMgaW50IHNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIENvbW1hbmQgYXJncyAqLworCXN0cnVjdCByYXJfaG5kbF90b19idXNfc3RydWN0IGNvbW1hbmRfYXJnczsKKwlzdHJ1Y3QgUkFSX2J1ZmZlciByYXJfYnVmOworCS8qIEJ1cyBhZGRyZXNzICovCisJZG1hX2FkZHJfdCAgcmFyX2J1cyA9IDA7CisJLyogSG9sZHMgdGhlIFJBUiBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gbWVtb3J5IG9mZnNldCAqLworCXUzMiAqcmFyX2FkZHI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogQ29weSB0aGUgZGF0YSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29tbWFuZF9hcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQlzaXplb2YoY29tbWFuZF9hcmdzKSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDYWxsIHRvIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIG9ubHkgaWYgdXNlciBoYW5kbGUgaXMgbm90IE5VTEwgKi8KKwlpZiAoY29tbWFuZF9hcmdzLnJhcl9oYW5kbGUpIHsKKwkJbWVtc2V0KCZyYXJfYnVmLCAwLCBzaXplb2YocmFyX2J1ZikpOworCQlyYXJfYnVmLmluZm8uaGFuZGxlID0gKHUzMiljb21tYW5kX2FyZ3MucmFyX2hhbmRsZTsKKworCQlpZiAocmFyX2hhbmRsZV90b19idXMoJnJhcl9idWYsIDEpICE9IDEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmFyX2hhbmRsZV90b19idXMgZmFpbHVyZVxuIik7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCQlyYXJfYnVzID0gcmFyX2J1Zi5idXNfYWRkcmVzczsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyYXIgbXNnOyByYXJfYWRkcl9idXMgPSAleFxuIiwgKHUzMilyYXJfYnVzKTsKKworCS8qIFNldCB2YWx1ZSBpbiB0aGUgU1lTVEVNIE1FTU9SWSBvZmZzZXQgKi8KKwlyYXJfYWRkciA9ICh1MzIgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKTsKKworCS8qIENvcHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIFN5c3RlbSBBcmVhIGZvciB0aGUgU0VQICovCisJcmFyX2FkZHJbMF0gPSBTRVBfUkFSX1ZBTF9UT0tFTjsKKwlyYXJfYWRkclsxXSA9IHJhcl9idXM7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIgc3RhcnRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmVhbGxvY19leHRfY2FjaGVfaGFuZGxlciAtIHJlcG9ydCBsb2NhdGlvbiBvZiBleHRjYWNoZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhcmFtZXRlcnMKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHRlbGxzIHRoZSBTRVAgd2hlcmUgdGhlIGV4dGFwcCBpcyBsb2NhdGVkCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlYWxsb2NfZXh0X2NhY2hlX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBIb2xkcyB0aGUgbmV3IGV4dCBjYWNoZSBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gbWVtb3J5IG9mZnNldCAqLworCXUzMiAqc3lzdGVtX2FkZHI7CisKKwkvKiBTZXQgdmFsdWUgaW4gdGhlIFNZU1RFTSBNRU1PUlkgb2Zmc2V0ICovCisJc3lzdGVtX2FkZHIgPSAodTMyICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9FWFRfQ0FDSEVfQUREUl9PRkZTRVRfSU5fQllURVMpOworCisJLyogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgU3lzdGVtIEFyZWEgZm9yIHRoZSBTRVAgKi8KKwlzeXN0ZW1fYWRkclswXSA9IFNFUF9FWFRfQ0FDSEVfQUREUl9WQUxfVE9LRU47CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHQgY2FjaGUgaW5pdDsgc3lzdGVtIGFkZHIgMCBpcyAleFxuIiwKKwkJCQkJCQlzeXN0ZW1fYWRkclswXSk7CisJc3lzdGVtX2FkZHJbMV0gPSBzZXAtPmV4dGFwcF9idXM7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHQgY2FjaGUgaW5pdDsgc3lzdGVtIGFkZHIgMSBpcyAleFxuIiwKKwkJCQkJCQlzeXN0ZW1fYWRkclsxXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfaW9jdGwgLSBpb2N0bCBhcGkKKyAqCUBmaWxwOiBwb2ludGVyIHRvIHN0cnVjdCBmaWxlCisgKglAY21kOiBjb21tYW5kCisgKglAYXJnOiBwb2ludGVyIHRvIGFyZ3VtZW50IHN0cnVjdHVyZQorICoKKyAqCUltcGxlbWVudCB0aGUgaW9jdGwgbWV0aG9kcyBhdmFpbGJsZSBvbiB0aGUgU0VQIGRldmljZS4KKyAqLworc3RhdGljIGxvbmcgc2VwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImlvY3RsIHN0YXJ0XG4iKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY21kIGlzICV4XG4iLCBjbWQpOworCisJLyogTWFrZSBzdXJlIHdlIG93biB0aGlzIGRldmljZSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlpZiAoKGN1cnJlbnQtPnBpZCAhPSBzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbikgJiYKKwkJCQkoc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24gIT0gMCkpIHsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBwaWQgaXMgbm90IG93bmVyXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJCWVycm9yID0gLUVBQ0NFUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIGZvciBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gLUVOT1RUWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogTG9jayB0byBwcmV2ZW50IHRoZSBkYWVtb24gdG8gaW50ZXJmZXJlIHdpdGggb3BlcmF0aW9uICovCisJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VQX0lPQ1NFTkRTRVBDT01NQU5EOgorCQkvKiBTZW5kIGNvbW1hbmQgdG8gU0VQICovCisJCWVycm9yID0gc2VwX3NlbmRfY29tbWFuZF9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0FMTE9DREFUQVBPTEw6CisJCS8qIEFsbG9jYXRlIGRhdGEgcG9vbCAqLworCQllcnJvciA9IHNlcF9hbGxvY2F0ZV9kYXRhX3Bvb2xfbWVtb3J5X2hhbmRsZXIoc2VwLCBhcmcpOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NDUkVBVEVTWU1ETUFUQUJMRToKKwkJLyogQ3JlYXRlIERNQSB0YWJsZSBmb3Igc3luaHJvbmljIG9wZXJhdGlvbiAqLworCQllcnJvciA9IHNlcF9jcmVhdGVfc3luY19kbWFfdGFibGVzX2hhbmRsZXIoc2VwLCBhcmcpOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NGUkVFRE1BVEFCTEVEQVRBOgorCQkvKiBGcmVlIHRoZSBwYWdlcyAqLworCQllcnJvciA9IHNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DU0VQU1RBUlQ6CisJCS8qIFN0YXJ0IGNvbW1hbmQgdG8gU0VQICovCisJCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDApIC8qIE9ubHkgZm9yIG9sZCBjaGlwICovCisJCQllcnJvciA9IHNlcF9zdGFydF9oYW5kbGVyKHNlcCk7CisJCWVsc2UKKwkJCWVycm9yID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIG9uIG5ldyBjaGlwICovCisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1NFUElOSVQ6CisJCS8qIEluaXQgY29tbWFuZCB0byBTRVAgKi8KKwkJaWYgKHNlcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgLyogT25seSBmb3Igb2xkIGNoaXAgKi8KKwkJCWVycm9yID0gc2VwX2luaXRfaGFuZGxlcihzZXAsIGFyZyk7CisJCWVsc2UKKwkJCWVycm9yID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIG9uIG5ldyBjaGlwICovCisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0dFVFNUQVRJQ1BPT0xBRERSOgorCQkvKiBJbmZvcm0gdGhlIFNFUCB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlIHN0YXRpYyBwb29sICovCisJCWVycm9yID0gc2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DRU5EVFJBTlNBQ1RJT046CisJCWVycm9yID0gc2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1JFQUxMT0NFWFRDQUNIRToKKwkJaWYgKHNlcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgLyogT25seSBmb3Igb2xkIGNoaXAgKi8KKwkJCWVycm9yID0gc2VwX3JlYWxsb2NfZXh0X2NhY2hlX2hhbmRsZXIoc2VwLCBhcmcpOworCQllbHNlCisJCQllcnJvciA9IC1FUEVSTTsgLyogTm90IHBlcm1pdHRlZCBvbiBuZXcgY2hpcCAqLworCQlicmVhazsKKwljYXNlIFNFUF9JT0NSQVJQUkVQQVJFTUVTU0FHRToKKwkJZXJyb3IgPSBzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyKHNlcCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DUFJFUEFSRURDQjoKKwkJZXJyb3IgPSBzZXBfcHJlcGFyZV9kY2JfaGFuZGxlcihzZXAsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0ZSRUVEQ0I6CisJCWVycm9yID0gc2VwX2ZyZWVfZGNiX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnZhbGlkIGlvY3RsICV4XG4iLCBjbWQpOworCQllcnJvciA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfc2luZ2xldG9uX2lvY3RsIC0gaW9jdGwgYXBpIGZvciBzaW5nbGV0b24gaW50ZXJmYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQGNtZDogY29tbWFuZAorICoJQGFyZzogcG9pbnRlciB0byBhcmd1bWVudCBzdHJ1Y3R1cmUKKyAqCisgKglJbXBsZW1lbnQgdGhlIGFkZGl0aW9uYWwgaW9jdGxzIGZvciB0aGUgc2luZ2xldG9uIGRldmljZQorICovCitzdGF0aWMgbG9uZyBzZXBfc2luZ2xldG9uX2lvY3RsKHN0cnVjdCBmaWxlICAqZmlscCwgdTMyIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyBlcnJvciA9IDA7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2luZ2xldG9uX2lvY3RsIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNtZCBpcyAleFxuIiwgY21kKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgaXMgZm9yIHRoZSBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gIC1FTk9UVFk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBvd24gdGhpcyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJaWYgKChjdXJyZW50LT5waWQgIT0gc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24pICYmCisJCQkJKHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uICE9IDApKSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2luZ2xldG9uIGlvY3RsIHBpZCBpcyBub3Qgb3duZXJcbiIpOworCQltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVBfSU9DVExTRVRDQUxMRVJJRDoKKwkJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisJCWVycm9yID0gc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlcihzZXAsIGFyZyk7CisJCW11dGV4X3VubG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yID0gc2VwX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzaW5nbGV0b24gaW9jdGwgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX2lvY3RsIC0gaW9jdGwgZm9yIGRhZW1vbgorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUBjbWQ6IGNvbW1hbmQKKyAqCUBhcmc6IHBvaW50ZXIgdG8gYXJndW1lbnQgc3RydWN0dXJlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSByZXF1ZXN0IGRhZW1vbiB0byBwZXJmb3JtIGlvY3RscyBvbiB0aGUgZGFlbW9uIGRldmljZQorICovCitzdGF0aWMgbG9uZyBzZXBfcmVxdWVzdF9kYWVtb25faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHUzMiBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlsb25nIGVycm9yOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIGlvY3RsOiBjbWQgaXMgJXhcbiIsIGNtZCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIGZvciBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gLUVOT1RUWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogT25seSBvbmUgcHJvY2VzcyBjYW4gYWNjZXNzIGlvY3RsIGF0IGFueSBnaXZlbiB0aW1lICovCisJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VQX0lPQ1NFTkRTRVBSUExZQ09NTUFORDoKKwkJLyogU2VuZCByZXBseSBjb21tYW5kIHRvIFNFUCAqLworCQllcnJvciA9IHNlcF9yZXFfZGFlbW9uX3NlbmRfcmVwbHlfY29tbWFuZF9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0VORFRSQU5TQUNUSU9OOgorCQkvKgorCQkgKiBFbmQgcmVxIGRhZW1vbiB0cmFuc2FjdGlvbiwgZG8gbm90aGluZworCQkgKiB3aWxsIGJlIHJlbW92ZWQgdXBvbiB1cGRhdGUgaW4gbWlkZGxld2FyZQorCQkgKiBBUEkgbGlicmFyeQorCQkgKi8KKwkJZXJyb3IgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogbm8gc3VjaCBJT0NUTFxuIik7CisJCWVycm9yID0gLUVOT1RUWTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzZXAtPmlvY3RsX211dGV4KTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIGlvY3RsOiBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorCisvKioKKyAqCXNlcF9pbnRoYW5kbGVyIC0gaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IGludGVycnVwdAorICoJQGRldl9pZDogZGV2aWNlIGlkCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXBfaW50aGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaXJxcmV0dXJuX3QgaW50X2Vycm9yID0gSVJRX0hBTkRMRUQ7CisJdW5zaWduZWQgbG9uZyBsY2tfZmxhZ3M7CisJdTMyIHJlZ192YWwsIHJlZ192YWwyID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZGV2X2lkOworCisJLyogUmVhZCB0aGUgSVJSIHJlZ2lzdGVyIHRvIGNoZWNrIGlmIHRoaXMgaXMgU0VQIGludGVycnVwdCAqLworCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX0lSUl9SRUdfQUREUik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJTRVAgSW50ZXJydXB0IC0gcmVnIGlzICUwOHhcbiIsIHJlZ192YWwpOworCisJaWYgKHJlZ192YWwgJiAoMHgxIDw8IDEzKSkgeworCQkvKiBMb2NrIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIgb2YgcmVwbHkgbWVzc2FnZXMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCQlzZXAtPnJlcGx5X2N0Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwIGludDogc2VuZF9jdCAlbHggcmVwbHlfY3QgJWx4XG4iLAorCQkJCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJCS8qIElzIHRoaXMgcHJpbnRmIG9yIGRhZW1vbiByZXF1ZXN0PyAqLworCQlyZWdfdmFsMiA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIlNFUCBJbnRlcnJ1cHQgLSByZWcyIGlzICUwOHhcbiIsIHJlZ192YWwyKTsKKworCQlpZiAoKHJlZ192YWwyID4+IDMwKSAmIDB4MSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IHByaW50ZiByZXF1ZXN0XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCQl9IGVsc2UgaWYgKHJlZ192YWwyID4+IDMxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImludDogZGFlbW9uIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImludDogU0VQIHJlcGx5XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IG5vdCBTRVAgaW50ZXJydXB0XG4iKTsKKwkJaW50X2Vycm9yID0gSVJRX05PTkU7CisJfQorCWlmIChpbnRfZXJyb3IgPT0gSVJRX0hBTkRMRUQpCisJCXNlcF93cml0ZV9yZWcoc2VwLCBIV19IT1NUX0lDUl9SRUdfQUREUiwgcmVnX3ZhbCk7CisKKwlyZXR1cm4gaW50X2Vycm9yOworfQorCisvKioKKyAqCXNlcF9yZWNvbmZpZ19zaGFyZWRfYXJlYSAtIHJlY29uZmlndXJlIHNoYXJlZCBhcmVhCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJUmVjb25maWcgdGhlIHNoYXJlZCBhcmVhIGJldHdlZW4gSE9TVCBhbmQgU0VQIC0gbmVlZGVkIGluIGNhc2UKKyAqCXRoZSBEWF9DQ19Jbml0IGZ1bmN0aW9uIHdhcyBjYWxsZWQgYmVmb3JlIE9TIGxvYWRpbmcuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlY29uZmlnX3NoYXJlZF9hcmVhKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IHJldF92YWw7CisKKwkvKiB1c2UgdG8gbGltaXQgd2FpdGluZyBmb3IgU0VQICovCisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVjb25maWcgc2hhcmVkIGFyZWEgc3RhcnRcbiIpOworCisJLyogU2VuZCB0aGUgbmV3IFNIQVJFRCBNRVNTQUdFIEFSRUEgdG8gdGhlIFNFUCAqLworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VuZGluZyAlMDhsbHggdG8gc2VwXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5zaGFyZWRfYnVzKTsKKworCXNlcF93cml0ZV9yZWcoc2VwLCBIV19IT1NUX0hPU1RfU0VQX0dQUjFfUkVHX0FERFIsIHNlcC0+c2hhcmVkX2J1cyk7CisKKwkvKiBQb2xsIGZvciBTRVAgcmVzcG9uc2UgKi8KKwlyZXRfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIxX1JFR19BRERSKTsKKworCWVuZF90aW1lID0gamlmZmllcyArIChXQUlUX1RJTUUgKiBIWik7CisKKwl3aGlsZSAoKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSkgJiYgKHJldF92YWwgIT0gMHhmZmZmZmZmZikgJiYKKwkJKHJldF92YWwgIT0gc2VwLT5zaGFyZWRfYnVzKSkKKwkJcmV0X3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMV9SRUdfQUREUik7CisKKwkvKiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIChyZWdpc3RlcikgKi8KKwlpZiAocmV0X3ZhbCAhPSBzZXAtPnNoYXJlZF9idXMpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiY291bGQgbm90IHJlY29uZmlnIHNoYXJlZCBhcmVhXG4iKTsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicmVzdWx0IHdhcyAleFxuIiwgcmV0X3ZhbCk7CisJCXJldF92YWwgPSAtRU5PTUVNOworCX0gZWxzZQorCQlyZXRfdmFsID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVjb25maWcgc2hhcmVkIGFyZWEgZW5kXG4iKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyogRmlsZSBvcGVyYXRpb24gZm9yIHNpbmdsZXRvbiBTRVAgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2luZ2xldG9uX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzZXBfc2luZ2xldG9uX2lvY3RsLAorCS5wb2xsID0gc2VwX3BvbGwsCisJLm9wZW4gPSBzZXBfc2luZ2xldG9uX29wZW4sCisJLnJlbGVhc2UgPSBzZXBfc2luZ2xldG9uX3JlbGVhc2UsCisJLm1tYXAgPSBzZXBfbW1hcCwKK307CisKKy8qIEZpbGUgb3BlcmF0aW9uIGZvciBkYWVtb24gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFlbW9uX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzZXBfcmVxdWVzdF9kYWVtb25faW9jdGwsCisJLnBvbGwgPSBzZXBfcmVxdWVzdF9kYWVtb25fcG9sbCwKKwkub3BlbiA9IHNlcF9yZXF1ZXN0X2RhZW1vbl9vcGVuLAorCS5yZWxlYXNlID0gc2VwX3JlcXVlc3RfZGFlbW9uX3JlbGVhc2UsCisJLm1tYXAgPSBzZXBfcmVxdWVzdF9kYWVtb25fbW1hcCwKK307CisKKy8qIFRoZSBmaWxlcyBvcGVyYXRpb25zIHN0cnVjdHVyZSBvZiB0aGUgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZXBfZmlsZV9vcGVyYXRpb25zID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bCA9IHNlcF9pb2N0bCwKKwkucG9sbCA9IHNlcF9wb2xsLAorCS5vcGVuID0gc2VwX29wZW4sCisJLnJlbGVhc2UgPSBzZXBfcmVsZWFzZSwKKwkubW1hcCA9IHNlcF9tbWFwLAorfTsKKworLyoqCisgKglzZXBfcmVnaXN0ZXJfZHJpdmVyX3dpdGhfZnMgLSByZWdpc3RlciBtaXNjIGRldmljZXMKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgZHJpdmVyIHdpdGggdGhlIGZpbGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlZ2lzdGVyX2RyaXZlcl93aXRoX2ZzKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IHJldF92YWw7CisKKwlzZXAtPm1pc2NkZXZfc2VwLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCXNlcC0+bWlzY2Rldl9zZXAubmFtZSA9IFNFUF9ERVZfTkFNRTsKKwlzZXAtPm1pc2NkZXZfc2VwLmZvcHMgPSAmc2VwX2ZpbGVfb3BlcmF0aW9uczsKKworCXNlcC0+bWlzY2Rldl9zaW5nbGV0b24ubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1I7CisJc2VwLT5taXNjZGV2X3NpbmdsZXRvbi5uYW1lID0gU0VQX0RFVl9TSU5HTEVUT047CisJc2VwLT5taXNjZGV2X3NpbmdsZXRvbi5mb3BzID0gJnNpbmdsZXRvbl9maWxlX29wZXJhdGlvbnM7CisKKwlzZXAtPm1pc2NkZXZfZGFlbW9uLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCXNlcC0+bWlzY2Rldl9kYWVtb24ubmFtZSA9IFNFUF9ERVZfREFFTU9OOworCXNlcC0+bWlzY2Rldl9kYWVtb24uZm9wcyA9ICZkYWVtb25fZmlsZV9vcGVyYXRpb25zOworCisJcmV0X3ZhbCA9IG1pc2NfcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zZXApOworCWlmIChyZXRfdmFsKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1pc2MgcmVnIGZhaWxzIGZvciBTRVAgJXhcbiIsCisJCQlyZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0X3ZhbCA9IG1pc2NfcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zaW5nbGV0b24pOworCWlmIChyZXRfdmFsKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1pc2MgcmVnIGZhaWxzIGZvciBzaW5nICV4XG4iLAorCQkJcmV0X3ZhbCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NlcCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBtaXNjX3JlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfZGFlbW9uKTsKKwlpZiAocmV0X3ZhbCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtaXNjIHJlZyBmYWlscyBmb3IgZG1uICV4XG4iLAorCQkJcmV0X3ZhbCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NlcCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NpbmdsZXRvbik7CisKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCXJldHVybiByZXRfdmFsOworfQorCisKKy8qKgorICoJc2VwX3Byb2JlIC0gcHJvYmUgYSBtYXRjaGluZyBQQ0kgZGV2aWNlCisgKglAcGRldjogcGNpX2RldmljZQorICoJQGVuZDogcGNpX2RldmljZV9pZAorICoKKyAqCUF0dGVtcHQgdG8gc2V0IHVwIGFuZCBjb25maWd1cmUgYSBTRVAgZGV2aWNlIHRoYXQgaGFzIGJlZW4KKyAqCWRpc2NvdmVyZWQgYnkgdGhlIFBDSSBsYXllci4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2VwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJcHJfZGVidWcoIlNFUCBwY2kgcHJvYmUgc3RhcnRpbmdcbiIpOworCWlmIChzZXBfZGV2ICE9IE5VTEwpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm9ubHkgb25lIFNFUCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIGRldmljZSAqLworCWVycm9yID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJlcnJvciBlbmFibGluZyBwY2kgZGV2aWNlXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHNlcF9kZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRldmljZSAqLworCXNlcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VwX2RldmljZSksIEdGUF9BVE9NSUMpOworCWlmIChzZXBfZGV2ID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSJjYW4ndCBrbWFsbG9jIHRoZSBzZXBfZGV2aWNlIHN0cnVjdHVyZVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyoKKwkgKiBXZSdyZSBnb2luZyB0byB1c2UgYW5vdGhlciB2YXJpYWJsZSBmb3IgYWN0dWFsbHkKKwkgKiB3b3JraW5nIHdpdGggdGhlIGRldmljZTsgdGhpcyB3YXksIGlmIHdlIGhhdmUKKwkgKiBtdWx0aXBsZSBkZXZpY2VzIGluIHRoZSBmdXR1cmUsIGl0IHdvdWxkIGJlIGVhc2llcgorCSAqIHRvIG1ha2UgYXBwcm9wcmlhdGUgY2hhbmdlcworCSAqLworCXNlcCA9IHNlcF9kZXY7CisKKwlzZXAtPnBkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcC0+ZXZlbnQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCXNwaW5fbG9ja19pbml0KCZzZXAtPnNuZF9ycGx5X2xjayk7CisJbXV0ZXhfaW5pdCgmc2VwLT5zZXBfbXV0ZXgpOworCW11dGV4X2luaXQoJnNlcC0+aW9jdGxfbXV0ZXgpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJQQ0kgb2J0YWluZWQsIGRldmljZSBiZWluZyBwcmVwYXJlZFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyZXZpc2lvbiBpcyAlZFxuIiwgc2VwLT5wZGV2LT5yZXZpc2lvbik7CisKKwkvKiBTZXQgdXAgb3VyIHJlZ2lzdGVyIGFyZWEgKi8KKwlzZXAtPnJlZ19waHlzaWNhbF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHNlcC0+cGRldiwgMCk7CisJaWYgKCFzZXAtPnJlZ19waHlzaWNhbF9hZGRyKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcmVnaXN0ZXIgc3RhcnRcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjsKKwl9CisKKwlzZXAtPnJlZ19waHlzaWNhbF9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHNlcC0+cGRldiwgMCk7CisJaWYgKCFzZXAtPnJlZ19waHlzaWNhbF9lbmQpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiRXJyb3IgZ2V0dGluZyByZWdpc3RlciBlbmRcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjsKKwl9CisKKwlzZXAtPnJlZ19hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHNlcC0+cmVnX3BoeXNpY2FsX2FkZHIsCisJCShzaXplX3QpKHNlcC0+cmVnX3BoeXNpY2FsX2VuZCAtIHNlcC0+cmVnX3BoeXNpY2FsX2FkZHIgKyAxKSk7CisJaWYgKCFzZXAtPnJlZ19hZGRyKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcmVnaXN0ZXIgdmlydHVhbFxuIik7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9zZXBfZGV2OworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkiUmVnaXN0ZXIgYXJlYSBzdGFydCAlbGx4IGVuZCAlbGx4IHZpcnR1YWwgJXBcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5yZWdfcGh5c2ljYWxfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZXAtPnJlZ19waHlzaWNhbF9lbmQsCisJCXNlcC0+cmVnX2FkZHIpOworCisJLyogQWxsb2NhdGUgdGhlIHNoYXJlZCBhcmVhICovCisJc2VwLT5zaGFyZWRfc2l6ZSA9IFNFUF9EUklWRVJfTUVTU0FHRV9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfU0laRV9CWVRFUyArCisJCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMgKworCQlTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX1NJWkVfSU5fQllURVMgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9TSVpFX0lOX0JZVEVTOworCisJaWYgKHNlcF9tYXBfYW5kX2FsbG9jX3NoYXJlZF9hcmVhKHNlcCkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQkvKiBBbGxvY2F0aW9uIGZhaWxlZCAqLworCQlnb3RvIGVuZF9mdW5jdGlvbl9lcnJvcjsKKwl9CisKKwlzZXAtPnJhcl9zaXplID0gRkFLRV9SQVJfU0laRTsKKwlzZXAtPnJhcl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwKKwkJc2VwLT5yYXJfc2l6ZSwgJnNlcC0+cmFyX2J1cywgR0ZQX0tFUk5FTCk7CisJaWYgKHNlcC0+cmFyX2FkZHIgPT0gTlVMTCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBtZmxkIHJhclxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fZGVhbGxvY2F0ZV9zZXBfc2hhcmVkX2FyZWE7CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyYXIgc3RhcnQgaXMgJXAsIHBoeSBpcyAlbGx4LCIKKwkJIiBzaXplIGlzICV6eFxuIiwgc2VwLT5yYXJfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZXAtPnJhcl9idXMsCisJCXNlcC0+cmFyX3NpemUpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhYm91dCB0byB3cml0ZSBJTVIgYW5kIElDUiBSRUdfQUREUlxuIik7CisKKwkvKiBDbGVhciBJQ1IgcmVnaXN0ZXIgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9JQ1JfUkVHX0FERFIsIDB4RkZGRkZGRkYpOworCisJLyogU2V0IHRoZSBJTVIgcmVnaXN0ZXIgLSBvcGVuIG9ubHkgR1BSIDIgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9JTVJfUkVHX0FERFIsICh+KDB4MSA8PCAxMykpKTsKKworCS8qIFJlYWQgc2VuZC9yZWNlaXZlIGNvdW50ZXJzIGZyb20gU0VQICovCisJc2VwLT5yZXBseV9jdCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJc2VwLT5yZXBseV9jdCAmPSAweDNGRkZGRkZGOworCXNlcC0+c2VuZF9jdCA9IHNlcC0+cmVwbHlfY3Q7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImFib3V0IHRvIGNhbGwgcmVxdWVzdF9pcnFcbiIpOworCS8qIEdldCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnJvciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2VwX2ludGhhbmRsZXIsIElSUUZfU0hBUkVELAorCQkic2VwX2RyaXZlciIsIHNlcCk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gZW5kX2Z1bmN0aW9uX2RlYWxsb2NfcmFyOworCisJLyogVGhlIG5ldyBjaGlwIHJlcXVpcmVzIGFzaGFyZWQgYXJlYSByZWNvbmZpZ3VyZSAqLworCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDQpIHsgLyogT25seSBmb3IgbmV3IGNoaXAgKi8KKwkJZXJyb3IgPSBzZXBfcmVjb25maWdfc2hhcmVkX2FyZWEoc2VwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9pcnE7CisJfQorCS8qIEZpbmFsbHkgbWFnaWMgdXAgdGhlIGRldmljZSBub2RlcyAqLworCS8qIFJlZ2lzdGVyIGRyaXZlciB3aXRoIHRoZSBmcyAqLworCWVycm9yID0gc2VwX3JlZ2lzdGVyX2RyaXZlcl93aXRoX2ZzKHNlcCk7CisJaWYgKGVycm9yID09IDApCisJCS8qIFN1Y2Nlc3MgKi8KKwkJcmV0dXJuIDA7CisKK2VuZF9mdW5jdGlvbl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHNlcCk7CisKK2VuZF9mdW5jdGlvbl9kZWFsbG9jX3JhcjoKKwlpZiAoc2VwLT5yYXJfYWRkcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnNlcC0+cGRldi0+ZGV2LCBzZXAtPnJhcl9zaXplLAorCQkJc2VwLT5yYXJfYWRkciwgc2VwLT5yYXJfYnVzKTsKKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX2RlYWxsb2NhdGVfc2VwX3NoYXJlZF9hcmVhOgorCS8qIERlLWFsbG9jYXRlIHNoYXJlZCBhcmVhICovCisJc2VwX3VubWFwX2FuZF9mcmVlX3NoYXJlZF9hcmVhKHNlcCk7CisKK2VuZF9mdW5jdGlvbl9lcnJvcjoKKwlpb3VubWFwKHNlcC0+cmVnX2FkZHIpOworCitlbmRfZnVuY3Rpb25fZnJlZV9zZXBfZGV2OgorCXBjaV9kZXZfcHV0KHNlcF9kZXYtPnBkZXYpOworCWtmcmVlKHNlcF9kZXYpOworCXNlcF9kZXYgPSBOVUxMOworCitlbmRfZnVuY3Rpb25fZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCitlbmRfZnVuY3Rpb246CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBzZXBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBzZXBfZGV2OworCisJLyogVW5yZWdpc3RlciBmcm9tIGZzICovCisJbWlzY19kZXJlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfc2VwKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zaW5nbGV0b24pOworCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X2RhZW1vbik7CisKKwkvKiBGcmVlIHRoZSBpcnEgKi8KKwlmcmVlX2lycShzZXAtPnBkZXYtPmlycSwgc2VwKTsKKworCS8qIEZyZWUgdGhlIHNoYXJlZCBhcmVhICAqLworCXNlcF91bm1hcF9hbmRfZnJlZV9zaGFyZWRfYXJlYShzZXBfZGV2KTsKKwlpb3VubWFwKCh2b2lkICopIHNlcF9kZXYtPnJlZ19hZGRyKTsKK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHNlcF9wY2lfaWRfdGJsKSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRkxEX1BDSV9ERVZJQ0VfSUQpfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzZXBfcGNpX2lkX3RibCk7CisKKy8qIEZpZWxkIGZvciByZWdpc3RlcmluZyBkcml2ZXIgdG8gUENJIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNlcF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gInNlcF9zZWNfZHJpdmVyIiwKKwkuaWRfdGFibGUgPSBzZXBfcGNpX2lkX3RibCwKKwkucHJvYmUgPSBzZXBfcHJvYmUsCisJLnJlbW92ZSA9IHNlcF9yZW1vdmUKK307CisKKworLyoqCisgKglzZXBfaW5pdCAtIGluaXQgZnVuY3Rpb24KKyAqCisgKglNb2R1bGUgbG9hZCB0aW1lLiBSZWdpc3RlciB0aGUgUENJIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNlcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNlcF9wY2lfZHJpdmVyKTsKK30KKworCisvKioKKyAqCXNlcF9leGl0IC0gY2FsbGVkIHRvIHVubG9hZCBkcml2ZXIKKyAqCisgKglEcm9wIHRoZSBtaXNjIGRldmljZXMgdGhlbiByZW1vdmUgYW5kIHVubWFwIHRoZSB2YXJpb3VzIHJlc291cmNlcworICoJdGhhdCBhcmUgbm90IHJlbGVhc2VkIGJ5IHRoZSBkcml2ZXIgcmVtb3ZlIG1ldGhvZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNlcF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzZXBfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoc2VwX2luaXQpOworbW9kdWxlX2V4aXQoc2VwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiZmEyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9hcGkuaApAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlcl9hcGkuaCAtIFNlY3VyaXR5IFByb2Nlc3NvciBEcml2ZXIgYXBpIGRlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDkuMTQgIFVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKworI2lmbmRlZiBfX1NFUF9EUklWRVJfQVBJX0hfXworI2RlZmluZSBfX1NFUF9EUklWRVJfQVBJX0hfXworCisvKiBUeXBlIG9mIHJlcXVlc3QgZnJvbSBkZXZpY2UgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TUkNfUkVQTFkJCTEKKyNkZWZpbmUgU0VQX0RSSVZFUl9TUkNfUkVRCQkyCisjZGVmaW5lIFNFUF9EUklWRVJfU1JDX1BSSU5URgkJMworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRZUEVERUZTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE5vdGUgdGhhdCBzZXZlcmFsIG1lbWJlcnMgb2YgdGhlc2Ugc3RydWN0cmVzIGFyZSBvbmx5IGhlcmUKKyAqIGZvciBjYW1wYXRhYmlsaXR5IHdpdGggdGhlIG1pZGRsZXdhcmU7IHRoZXkgYXJlIG5vdCB1c2VkCisgKiBieSB0aGlzIGRyaXZlci4KKyAqIEFsbCB1c2VyIHNwYWNlIGJ1ZmZlciBhZGRyZXNzZXMgYXJlIHNldCB0byBhbGlnbmVkIHU2NAorICogaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCA2NCBiaXQgc3lzdGVtcworICovCisKKy8qCisgIGluaXQgY29tbWFuZCBzdHJ1Y3Q7IHRoaXMgd2lsbCBnbyBhd2F5IHdoZW4gU0NVIGRvZXMgaW5pdAorKi8KK3N0cnVjdCBpbml0X3N0cnVjdCB7CisJLyogYWRkcmVzcyB0aGF0IFNFUCBjYW4gYWNjZXNzIGZvciBtZXNzYWdlICovCisJYWxpZ25lZF91NjQgICBtZXNzYWdlX2FkZHI7CisKKwkvKiBtZXNzYWdlIHNpemUgKi8KKwl1MzIgICBtZXNzYWdlX3NpemVfaW5fd29yZHM7CisKKwkvKiBvZmZzZXQgb2YgdGhlIGluaXQgbWVzc2FnZSBpbiB0aGUgc2VwIHNyYW0gKi8KKwl1MzIgICBzZXBfc3JhbV9hZGRyOworCisJLyogLW5vdCB1c2VkLSByZXNpZGVudCBzaXplIGluIGJ5dGVzKi8KKwl1MzIgICB1bnVzZWRfcmVzaWRlbnRfc2l6ZV9pbl9ieXRlczsKKworCS8qIC1ub3QgdXNlZC0gY2FjaGUgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX2NhY2hlX3NpemVfaW5fYnl0ZXM7CisKKwkvKiAtbm90IHVzZWQtIGV4dCBjYWNoZSBjdXJyZW50IGFkZHJlc3MgKi8KKwlhbGlnbmVkX3U2NCAgIHVudXNlZF9leHRjYWNoZV9hZGRyOworCisJLyogLW5vdCB1c2VkLSBleHQgY2FjaGUgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX2V4dGNhY2hlX3NpemVfaW5fYnl0ZXM7Cit9OworCitzdHJ1Y3QgcmVhbGxvY19leHRfc3RydWN0IHsKKwkvKiAtbm90IHVzZWQtIGN1cnJlbnQgZXh0ZXJuYWwgY2FjaGUgYWRkcmVzcyAqLworCWFsaWduZWRfdTY0ICAgdW51c2VkX2V4dF9jYWNoZV9hZGRyOworCisJLyogLW5vdCB1c2VkLSBleHRlcm5hbCBjYWNoZSBzaXplIGluIGJ5dGVzKi8KKwl1MzIgICB1bnVzZWRfZXh0X2NhY2hlX3NpemVfaW5fYnl0ZXM7Cit9OworCitzdHJ1Y3QgYWxsb2Nfc3RydWN0IHsKKwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBzaGFyZWQgcG9vbCBhcmVhICovCisJdTMyICBvZmZzZXQ7CisJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlICovCisJdTMyICBudW1fYnl0ZXM7Cit9OworCisvKgorCU5vdGUgdGhhdCBhbGwgYXBwIGFkZHJlc3NlcyBhcmUgY2FzdCBhcyB1MzI7IHRoZSBzZXAKKwltaWRkbGV3YXJlIHNlbmRzIHRoZW0gYXMgZml4ZWQgMzIgYml0IHdvcmRzCisqLworc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCB7CisJLyogYWRkcmVzcyB2YWx1ZSBvZiB0aGUgZGF0YSBpbiAodXNlciBzcGFjZSBhZGRyKSAqLworCWFsaWduZWRfdTY0IGFwcF9pbl9hZGRyZXNzOworCisJLyogc2l6ZSBvZiBkYXRhIGluICovCisJdTMyIGRhdGFfaW5fc2l6ZTsKKworCS8qIGFkZHJlc3Mgb2YgdGhlIGRhdGEgb3V0ICh1c2VyIHNwYWNlIGFkZHIpICovCisJYWxpZ25lZF91NjQgYXBwX291dF9hZGRyZXNzOworCisJLyogdGhlIHNpemUgb2YgdGhlIGJsb2NrIG9mIHRoZSBvcGVyYXRpb24gLSBpZiBuZWVkZWQsCisJICAgZXZlcnkgdGFibGUgd2lsbCBiZSBtb2R1bG8gdGhpcyBwYXJhbWV0ZXIgKi8KKwl1MzIgYmxvY2tfc2l6ZTsKKworCS8qIC1ub3QgdXNlZC0gZGlzdGluY3QgdXNlci9rZXJuZWwgbGF5b3V0ICovCisJYm9vbCBpc0tlcm5lbFZpcnR1YWxBZGRyZXNzOworCit9OworCisvKiBjb21tYW5kIHN0cnVjdCBmb3IgZ2V0dGluZyBjYWxsZXIgaWQgdmFsdWUgYW5kIGFkZHJlc3MgKi8KK3N0cnVjdCBjYWxsZXJfaWRfc3RydWN0IHsKKwkvKiBwaWQgb2YgdGhlIHByb2Nlc3MgKi8KKwl1MzIgcGlkOworCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY2FsbGVyIGlkIGhhc2ggKi8KKwlhbGlnbmVkX3U2NCBjYWxsZXJJZEFkZHJlc3M7CisJLyogY2FsbGVyIGlkIGhhc2ggc2l6ZSBpbiBieXRlcyAqLworCXUzMiBjYWxsZXJJZFNpemVJbkJ5dGVzOworfTsKKworLyoKKyAgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBEQ0IKKyovCitzdHJ1Y3Qgc2VwX2RjYmxvY2sgeworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGlucHV0IG1sbGkgKi8KKwl1MzIJaW5wdXRfbWxsaV9hZGRyZXNzOworCS8qIG51bSBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBpbnB1dCBtbGxpICovCisJdTMyCWlucHV0X21sbGlfbnVtX2VudHJpZXM7CisJLyogc2l6ZSBvZiBkYXRhIGluIHRoZSBmaXJzdCBpbnB1dCBtbGxpICovCisJdTMyCWlucHV0X21sbGlfZGF0YV9zaXplOworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG91dHB1dCBtbGxpICovCisJdTMyCW91dHB1dF9tbGxpX2FkZHJlc3M7CisJLyogbnVtIG9mIGVudHJpZXMgaW4gdGhlIGZpcnN0IG91dHB1dCBtbGxpICovCisJdTMyCW91dHB1dF9tbGxpX251bV9lbnRyaWVzOworCS8qIHNpemUgb2YgZGF0YSBpbiB0aGUgZmlyc3Qgb3V0cHV0IG1sbGkgKi8KKwl1MzIJb3V0cHV0X21sbGlfZGF0YV9zaXplOworCS8qIHBvaW50ZXIgdG8gdGhlIG91dHB1dCB2aXJ0dWFsIHRhaWwgKi8KKwl1MzIJb3V0X3ZyX3RhaWxfcHQ7CisJLyogc2l6ZSBvZiB0YWlsIGRhdGEgKi8KKwl1MzIJdGFpbF9kYXRhX3NpemU7CisJLyogaW5wdXQgdGFpbCBkYXRhIGFycmF5ICovCisJdTgJdGFpbF9kYXRhWzY0XTsKK307CisKK3N0cnVjdCBzZXBfY2FsbGVyX2lkX2VudHJ5IHsKKwlpbnQgcGlkOworCXVuc2lnbmVkIGNoYXIgY2FsbGVySWRIYXNoW1NFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTXTsKK307CisKKy8qCisJY29tbWFuZCBzdHJ1Y3R1cmUgZm9yIGJ1aWxkaW5nIGRjYiBibG9jayAoY3VycmVudGx5IGZvciBleHQgYXBwIG9ubHkKKyovCitzdHJ1Y3QgYnVpbGRfZGNiX3N0cnVjdCB7CisJLyogYWRkcmVzcyB2YWx1ZSBvZiB0aGUgZGF0YSBpbiAqLworCWFsaWduZWRfdTY0IGFwcF9pbl9hZGRyZXNzOworCS8qIHNpemUgb2YgZGF0YSBpbiAqLworCXUzMiAgZGF0YV9pbl9zaXplOworCS8qIGFkZHJlc3Mgb2YgdGhlIGRhdGEgb3V0ICovCisJYWxpZ25lZF91NjQgYXBwX291dF9hZGRyZXNzOworCS8qIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiB0aGUgb3BlcmF0aW9uIC0gaWYgbmVlZGVkLAorCWV2ZXJ5IHRhYmxlIHdpbGwgYmUgbW9kdWxvIHRoaXMgcGFyYW1ldGVyICovCisJdTMyICBibG9ja19zaXplOworCS8qIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiB0aGUgb3BlcmF0aW9uIC0gaWYgbmVlZGVkLAorCWV2ZXJ5IHRhYmxlIHdpbGwgYmUgbW9kdWxvIHRoaXMgcGFyYW1ldGVyICovCisJdTMyICB0YWlsX2Jsb2NrX3NpemU7Cit9OworCisvKioKKyAqIEBzdHJ1Y3Qgc2VwX2RtYV9tYXAKKyAqCisgKiBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBtYXBwaW5nIHRoZSB1c2VyIHBhZ2VzCisgKgkgICAgIG9yIGtlcm5lbCBidWZmZXJzIGZvciBkbWEgb3BlcmF0aW9ucworICoKKyAqCisgKi8KK3N0cnVjdCBzZXBfZG1hX21hcCB7CisJLyogbWFwcGVkIGRtYSBhZGRyZXNzICovCisJZG1hX2FkZHJfdCAgICBkbWFfYWRkcjsKKwkvKiBzaXplIG9mIHRoZSBtYXBwZWQgZGF0YSAqLworCXNpemVfdCAgICAgICAgc2l6ZTsKK307CisKK3N0cnVjdCBzZXBfZG1hX3Jlc291cmNlIHsKKwkvKiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGFnZXMgdGhhdCByZXByZXNlbnQKKwlpbnB1dCBkYXRhIGZvciB0aGUgc3luY2hyb25pYyBETUEgYWN0aW9uICovCisJc3RydWN0IHBhZ2UgKippbl9wYWdlX2FycmF5OworCisJLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBhZ2VzIHRoYXQgcmVwcmVzZW50IG91dAorCWRhdGEgZm9yIHRoZSBzeW5jaHJvbmljIERNQSBhY3Rpb24gKi8KKwlzdHJ1Y3QgcGFnZSAqKm91dF9wYWdlX2FycmF5OworCisJLyogbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXBfaW5fcGFnZV9hcnJheSAqLworCXUzMiBpbl9udW1fcGFnZXM7CisKKwkvKiBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHNlcF9vdXRfcGFnZV9hcnJheSAqLworCXUzMiBvdXRfbnVtX3BhZ2VzOworCisJLyogbWFwIGFycmF5IG9mIHRoZSBpbnB1dCBkYXRhICovCisJc3RydWN0IHNlcF9kbWFfbWFwICppbl9tYXBfYXJyYXk7CisKKwkvKiBtYXAgYXJyYXkgb2YgdGhlIG91dHB1dCBkYXRhICovCisJc3RydWN0IHNlcF9kbWFfbWFwICpvdXRfbWFwX2FycmF5OworCisJLyogbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIGlucHV0IG1hcHAgYXJyYXkgKi8KKwl1MzIgaW5fbWFwX251bV9lbnRyaWVzOworCisJLyogbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIG91dHB1dCBtYXBwIGFycmF5ICovCisJdTMyIG91dF9tYXBfbnVtX2VudHJpZXM7Cit9OworCisKKy8qIGNvbW1hbmQgc3RydWN0IGZvciB0cmFuc2xhdGluZyByYXIgaGFuZGxlIHRvIGJ1cyBhZGRyZXNzCisgICBhbmQgc2V0dGluZyBpdCBhdCBwcmVkZWZpbmVkIGxvY2F0aW9uICovCitzdHJ1Y3QgcmFyX2huZGxfdG9fYnVzX3N0cnVjdCB7CisKKwkvKiByYXIgaGFuZGxlICovCisJYWxpZ25lZF91NjQgcmFyX2hhbmRsZTsKK307CisKKy8qCisgIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudCBvbmUgZW50cnkgaW4gdGhlIERNQSBMTEkgdGFibGUKKyovCitzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSB7CisJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCXUzMiBidXNfYWRkcmVzczsKKworCS8qIGJsb2NrIHNpemUgKi8KKwl1MzIgYmxvY2tfc2l6ZTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUlPQ1RMIGNvbW1hbmQgZGVmaW5lcworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbWFnaWMgbnVtYmVyIDEgb2YgdGhlIHNlcCBJT0NUTCBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NfTUFHSUNfTlVNQkVSCSAgICAgICAgICAgICAgICAgICAgICdzJworCisvKiBzZW5kcyBpbnRlcnJ1cHQgdG8gc2VwIHRoYXQgbWVzc2FnZSBpcyByZWFkeSAqLworI2RlZmluZSBTRVBfSU9DU0VORFNFUENPTU1BTkQJIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDApCisKKy8qIHNlbmRzIGludGVycnVwdCB0byBzZXAgdGhhdCBtZXNzYWdlIGlzIHJlYWR5ICovCisjZGVmaW5lIFNFUF9JT0NTRU5EU0VQUlBMWUNPTU1BTkQJIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDEpCisKKy8qIGFsbG9jYXRlIG1lbW9yeSBpbiBkYXRhIHBvb2wgKi8KKyNkZWZpbmUgU0VQX0lPQ0FMTE9DREFUQVBPTEwJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDIsIHN0cnVjdCBhbGxvY19zdHJ1Y3QpCisKKy8qIGNyZWF0ZSBzeW0gZG1hIGxsaSB0YWJsZXMgKi8KKyNkZWZpbmUgU0VQX0lPQ0NSRUFURVNZTURNQVRBQkxFCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCA1LCBzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0KQorCisvKiBmcmVlIGR5bmFtaWMgZGF0YSBhYWxvY2F0ZWQgZHVyaW5nIHRhYmxlIGNyZWF0aW9uICovCisjZGVmaW5lIFNFUF9JT0NGUkVFRE1BVEFCTEVEQVRBCSBcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCA3KQorCisvKiBnZXQgdGhlIHN0YXRpYyBwb29sIGFyZWEgYWRkZXJzc2VzIChwaHlzaWNhbCBhbmQgdmlydHVhbCkgKi8KKyNkZWZpbmUgU0VQX0lPQ0dFVFNUQVRJQ1BPT0xBRERSCVwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDgpCisKKy8qIHN0YXJ0IHNlcCBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NTRVBTVEFSVAkgXAorCV9JTyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMTIpCisKKy8qIGluaXQgc2VwIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0VQX0lPQ1NFUElOSVQJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDEzLCBzdHJ1Y3QgaW5pdF9zdHJ1Y3QpCisKKy8qIGVuZCB0cmFuc2FjdGlvbiBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NFTkRUUkFOU0FDVElPTgkgXAorCV9JTyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMTUpCisKKy8qIHJlYWxsb2NhdGUgZXh0ZXJuYWwgYXBwOyB1bnVzZWQgc3RydWN0dXJlIHN0aWxsIG5lZWRlZCBmb3IKKyAqIGNvbXBhdGFiaWxpdHkgd2l0aCBtaWRkbGV3YXJlICovCisjZGVmaW5lIFNFUF9JT0NSRUFMTE9DRVhUQ0FDSEUJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDE4LCBzdHJ1Y3QgcmVhbGxvY19leHRfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NSQVJQUkVQQVJFTUVTU0FHRQlcCisJX0lPVyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMjAsIHN0cnVjdCByYXJfaG5kbF90b19idXNfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NUTFNFVENBTExFUklECVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAzNCwgc3RydWN0IGNhbGxlcl9pZF9zdHJ1Y3QpCisKKyNkZWZpbmUgU0VQX0lPQ1BSRVBBUkVEQ0IJCQkJCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAzNSwgc3RydWN0IGJ1aWxkX2RjYl9zdHJ1Y3QpCisKKyNkZWZpbmUgU0VQX0lPQ0ZSRUVEQ0IJCQkJCVwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDM2KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9jb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg2MjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2NvbmZpZy5oCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICoKKyAqICBzZXBfZHJpdmVyX2NvbmZpZy5oIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERyaXZlciBjb25maWd1cmF0aW9uCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDYuMjYJVXBncmFkZSB0byBNZWRmaWVsZAorICoKKyAqLworCisjaWZuZGVmIF9fU0VQX0RSSVZFUl9DT05GSUdfSF9fCisjZGVmaW5lIF9fU0VQX0RSSVZFUl9DT05GSUdfSF9fCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEUklWRVIgQ09ORklHVVJBVElPTiBGTEFHUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogaWYgZmxhZyBpcyBvbiAsIHRoZW4gdGhlIGRyaXZlciBpcyBydW5uaW5nIGluIHBvbGxpbmcgYW5kCisJbm90IGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIFNFUF9EUklWRVJfUE9MTElOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogZmxhZyB3aGljaCBkZWZpbmVzIGlmIHRoZSBzaGFyZWQgYXJlYSBhZGRyZXNzIHNob3VsZCBiZQorCXJlY29uZmlnZWQgKHNlbmQgdG8gU0VQIGFuZXcpIGR1cmluZyBpbml0IG9mIHRoZSBkcml2ZXIgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9SRUNPTkZJR19NRVNTQUdFX0FSRUEgICAgICAgICAgICAgICAgMAorCisvKiB0aGUgbW9kZSBmb3IgcnVubmluZyBvbiB0aGUgQVJNMTE3MiBFdmFsdWF0aW9uIHBsYXRmb3JtIChmbGFnIGlzIDEpICovCisjZGVmaW5lIFNFUF9EUklWRVJfQVJNX0RFQlVHX01PREUgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5URVJOQUwgREFUQSBDT05GSUdVUkFUSU9OCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGZsYWcgZm9yIHRoZSBpbnB1dCBhcnJheSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0lOX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIGZsYWcgZm9yIG91dHB1dCBhcnJheSAqLworI2RlZmluZSBTRVBfRFJJVkVSX09VVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gb25lIExMSSB0YWJsZXMgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVAgICAgICAgICAgICAgMzEKKworLyogbWluaW11bSBkYXRhIHNpemUgb2YgdGhlIE1MTEkgdGFibGUgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRQkJMTYKKworLyogZmxhZyB0aGF0IHNpZ25pZmllcyB0YWggdGhlIGxvY2sgaXMKK2N1cnJlbnRseSBoZWxkIGJ5IHRoZSBwcm9jY2VzcyAoc3RydWN0IGZpbGUpICovCisjZGVmaW5lIFNFUF9EUklWRVJfT1dOX0xPQ0tfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogZmxhZyB0aGF0IHNpZ25pZmllcyB0YWggdGhlIGxvY2sgaXMgY3VycmVudGx5IE5PVAoraGVsZCBieSB0aGUgcHJvY2Nlc3MgKHN0cnVjdCBmaWxlKSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0RJU09XTl9MT0NLX0ZMQUcgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIGluZGljYXRlcyB3aGV0aGVyIGRyaXZlciBoYXMgbWFwcGVkL3VubWFwcGVkIHNoYXJlZCBhcmVhICovCisjZGVmaW5lIFNFUF9SRVFVRVNUX0RBRU1PTl9NQVBQRUQgMQorI2RlZmluZSBTRVBfUkVRVUVTVF9EQUVNT05fVU5NQVBQRUQgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU0hBUkVEIEFSRUEgIG1lbW9yeSB0b3RhbCBzaXplIGlzIDM2SworCWl0IGlzIGRpdmlkZWQgaXMgZm9sbG93aW5nOgorCisJU0hBUkVEX01FU1NBR0VfQVJFQSAgICAgICAgICAgICAgICAgICAgIDhLICAgICAgICAgfQorCQkJCQkJCQkJfQorCVNUQVRJQ19QT09MX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICA0SyAgICAgICAgIH0gTUFQUEVEIEFSRUEgKCAyNCBLKQorCQkJCQkJCQkJfQorCURBVEFfUE9PTF9BUkVBICAgICAgICAgICAgICAgICAgICAgICAgICAxMksgICAgICAgIH0KKworCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBICAgICAgICAgICAgICA1SworCisJcGxhY2Vob2xkZXIgdW50aWwgZHJ2ZXIgY2hhbmdlcworCUZMT1dfRE1BX1RBQkxFU19BUkVBICAgICAgICAgICAgICAgICAgICA0SworCisJU1lTVEVNX01FTU9SWV9BUkVBICAgICAgICAgICAgICAgICAgICAgIDNrCisKKwlTWVNURU1fTUVNT1JZIHRvdGFsIHNpemUgaXMgM2sKKwlpdCBpcyBkaXZpZGVkIGFzIGZvbGxvd2luZzoKKworCVRJTUVfTUVNT1JZX0FSRUEgICAgICAgICAgICAgICAgICAgICA4QgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFNFUF9ERVZfTkFNRSAic2VwX3NlY19kcml2ZXIiCisjZGVmaW5lIFNFUF9ERVZfU0lOR0xFVE9OICJzZXBfc2VjX3NpbmdsZXRvbl9kcml2ZXIiCisjZGVmaW5lIFNFUF9ERVZfREFFTU9OICJzZXBfcmVxX2RhZW1vbl9kcml2ZXIiCisKKworLyoKKwl0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgLSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBzaGFyZWQKKwlhcmVhIHdpbGwgYmUgZGVkaWNhdGVkIHRvIHRoZSBkbWEgbGxpIHRhYmxlcworKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NQVhfTUVTU0FHRV9TSVpFX0lOX0JZVEVTCQkJKDggKiAxMDI0KQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBzaGFyZWQgYXJlYSBpbiBwYWdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX01FU1NBR0VfU0hBUkVEX0FSRUFfU0laRV9JTl9CWVRFUwkJKDggKiAxMDI0KQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBwb29sIHN0YXRpYyBhcmVhIGluIHBhZ2VzICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1RBVElDX0FSRUFfU0laRV9JTl9CWVRFUwkJCSg0ICogMTAyNCkKKworLyogdGhlIHNpemUgb2YgdGhlIGRhdGEgcG9vbCBzaGFyZWQgYXJlYSBzaXplIGluIHBhZ2VzICovCisjZGVmaW5lIFNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMJCSgxNiAqIDEwMjQpCisKKy8qIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIHNoYXJlZCBhcmVhIGluIHBhZ2VzICovCisjZGVmaW5lIFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMJKDEwMjQgKiA1KQorCisvKiBQbGFjZWhvbGRlciB1bnRpbCBkcml2ZXIgY2hhbmdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX0ZMT1dfRE1BX1RBQkxFU19BUkVBX1NJWkVfSU5fQllURVMJCSgxMDI0ICogNCkKKworLyogc3lzdGVtIGRhdGEgKHRpbWUsIGNhbGxlciBpZCBldGMnKSBwb29sICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RBVEFfTUVNT1JZX1NJWkVfSU5fQllURVMJCSgxMDI0ICogMykKKworLyogdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRpbWUgbWVtb3J5ICovCisjZGVmaW5lIFNFUF9EUklWRVJfVElNRV9NRU1PUllfU0laRV9JTl9CWVRFUwkJCTgKKworLyogdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFJBUiBwYXJhbWV0ZXJzIG1lbW9yeSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9SQVJfTUVNT1JZX1NJWkVfSU5fQllURVMJCTgKKworLyogYXJlYSBzaXplIHRoYXQgaXMgbWFwcGVkICAtIHdlIG1hcCB0aGUgTUVTU0FHRSBBUkVBLCBTVEFUSUMgUE9PTCBhbmQKKwlEQVRBIFBPT0wgYXJlYXMuIGFyZWEgbXVzdCBiZSBtb2R1bGUgNGsgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NTU1BUF9BUkVBX1NJWkUJCQkJKDEwMjQgKiAyOCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCW9mZnNldHMgb2YgdGhlIGFyZWFzIHN0YXJ0aW5nIGZyb20gdGhlIHNoYXJlZCBhcmVhIHN0YXJ0IGFkZHJlc3MKKyovCisKKy8qIG1lc3NhZ2UgYXJlYSBvZmZzZXQgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NRVNTQUdFX0FSRUFfT0ZGU0VUX0lOX0JZVEVTCQkJMAorCisvKiBzdGF0aWMgcG9vbCBhcmVhIG9mZnNldCAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX09GRlNFVF9JTl9CWVRFUyBcCisJKFNFUF9EUklWRVJfTUVTU0FHRV9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTKQorCisvKiBkYXRhIHBvb2wgYXJlYSBvZmZzZXQgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9EQVRBX1BPT0xfQVJFQV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX09GRlNFVF9JTl9CWVRFUyArIFwKKwlTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX1NJWkVfSU5fQllURVMpCisKKy8qIHN5bmhyb25pYyBkbWEgdGFibGVzIGFyZWEgb2Zmc2V0ICovCisjZGVmaW5lIFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyBcCisJKFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTICsgXAorCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMpCisKKy8qIHN5c3RlbSBtZW1vcnkgb2Zmc2V0IGluIGJ5dGVzICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RBVEFfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyBcCisJKFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArIFwKKwlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIHRpbWUgYXJlYSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9USU1FX01FTU9SWV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9PRkZTRVRfSU5fQllURVMpCisKKy8qIG9mZnNldCBvZiB0aGUgUkFSIGFyZWEgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NZU1RFTV9USU1FX01FTU9SWV9PRkZTRVRfSU5fQllURVMgKyBcCisJU0VQX0RSSVZFUl9USU1FX01FTU9SWV9TSVpFX0lOX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIGNhbGxlciBpZCBhcmVhICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMgKyBcCisgICAgU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9TSVpFX0lOX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIERDQiBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fREFUQV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsgXAorCTB4NDAwKQorCisvKiBvZmZzZXQgb2YgdGhlIGV4dCBjYWNoZSBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0VYVF9DQUNIRV9BRERSX09GRlNFVF9JTl9CWVRFUyBcCisJU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMKKworLyogb2Zmc2V0IG9mIHRoZSBhbGxvY2F0aW9uIGRhdGEgcG9pbnRlciBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0NBTExFUl9JRF9PRkZTRVRfQllURVMgKyBcCisJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpCisKKy8qIHRoZSB0b2tlbiB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRpbWUgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfVElNRV9WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzQ1Njc4CisKKyNkZWZpbmUgRkFLRV9SQVJfU0laRSAoMTAyNCoxMDI0KSAvKiB1c2VkIG9ubHkgZm9yIG1mbGQgKi8KKy8qIERFQlVHIExFVkVMIE1BU0tTICovCisKKy8qIHNpemUgb2YgdGhlIGNhbGxlciBpZCBoYXNoIChzaGEyKSAqLworI2RlZmluZSBTRVBfQ0FMTEVSX0lEX0hBU0hfU0laRV9JTl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAzMgorCisvKiBzaXplIG9mIHRoZSBjYWxsZXIgaWQgaGFzaCAoc2hhMikgaW4gMzIgYml0IHdvcmRzICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX1dPUkRTICAgICAgICAgICAgICAgIDgKKworLyogbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FsbGVyIGlkIHRhYmxlICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVMgICAgICAgICAgICAgICAgICAgICAgIDIwCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIHN5bWV0cmljIG9wZXJhdGlvbiAodGhhdCByZXF1aXJlIERNQSByZXNvdXJjZSkKKwlwZXIgb25lIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0VQX01BWF9OVU1fU1lOQ19ETUFfT1BTCQkJMTYKKworLyogdGhlIHRva2VuIHRoYXQgZGVmaW5lcyB0aGUgc3RhcnQgb2YgdGltZSBhZGRyZXNzICovCisjZGVmaW5lIFNFUF9SQVJfVkFMX1RPS0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QUJBQkFCQUIKKworLyogaW9jdGwgZXJyb3IgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB0cnlpbmcKKyAgIHRvIHJlYWxsb2MgdGhlIGNhY2hlL3Jlc2lkZW50IHNlY29uZCB0aW1lICovCisjZGVmaW5lIFNFUF9BTFJFQURZX0lOSVRJQUxJWkVEX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisKKy8qIGJpdCB0aGF0IGxvY2tzIGFjY2VzcyB0byB0aGUgc2hhcmVkIGFyZWEgKi8KKyNkZWZpbmUgU0VQX01NQVBfTE9DS19CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBiaXQgdGhhdCBsb2NrIGFjY2VzcyB0byB0aGUgcG9sbCAgLSBhZnRlciBzZW5kX2NvbW1hbmQgKi8KKyNkZWZpbmUgU0VQX1NFTkRfTVNHX0xPQ0tfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBzdGF0aWMgcG9vbCBhZGRyZXNzIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0VQX1NUQVRJQ19QT09MX1ZBTF9UT0tFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQkJBQUJCQQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHBvb2wgcG9pbnRlcnMgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfREFUQV9QT09MX1BPSU5URVJTX1ZBTF9UT0tFTiAgICAgICAgICAgICAgICAgICAgICAweEVEREVFRERFCisKKy8qIHRoZSB0b2tlbiB0aGF0IGRlZmluZXMgdGhlIGRhdGEgcG9vbCBwb2ludGVycyBhZGRyZXNzICovCisjZGVmaW5lIFNFUF9FWFRfQ0FDSEVfQUREUl9WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkFCQUJBQkEKKworLyogVGltZSBsaW1pdCBmb3IgU0VQIHRvIGZpbmlzaCAqLworI2RlZmluZSBXQUlUX1RJTUUgMTAKKworI2VuZGlmIC8qIFNFUCBEUklWRVIgQ09ORklHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfaHdfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2h3X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2h3X2RlZnMuaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlcl9od19kZWZzLmggLSBTZWN1cml0eSBQcm9jZXNzb3IgRHJpdmVyIGhhcmR3YXJlIGRlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDkuMjAJVXBncmFkZSB0byBNZWRmaWVsZAorICoKKyAqLworCisjaWZuZGVmIFNFUF9EUklWRVJfSFdfREVGU19fSAorI2RlZmluZSBTRVBfRFJJVkVSX0hXX0RFRlNfX0gKKworLyogUENJIElEJ3MgKi8KKyNkZWZpbmUgTUZMRF9QQ0lfREVWSUNFX0lEIDB4MDgyNgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBIVyBSZWdpc3RlcnMgRGVmaW5lcy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSovCisKKworLyogY2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCQlIV19SMEJfQUREUl8wX1JFR19BRERSCQkJMHgwMDAwVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzFfUkVHX0FERFIJCQkweDAwMDRVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfMl9SRUdfQUREUgkJCTB4MDAwOFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl8zX1JFR19BRERSCQkJMHgwMDBjVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzRfUkVHX0FERFIJCQkweDAwMTBVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfNV9SRUdfQUREUgkJCTB4MDAxNFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl82X1JFR19BRERSCQkJMHgwMDE4VUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzdfUkVHX0FERFIJCQkweDAwMWNVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfOF9SRUdfQUREUgkJCTB4MDAyMFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl8wX1JFR19BRERSCQkJMHgwMDgwVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzFfUkVHX0FERFIJCQkweDAwODRVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfMl9SRUdfQUREUgkJCTB4MDA4OFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl8zX1JFR19BRERSCQkJMHgwMDhjVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzRfUkVHX0FERFIJCQkweDAwOTBVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfNV9SRUdfQUREUgkJCTB4MDA5NFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl82X1JFR19BRERSCQkJMHgwMDk4VUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzdfUkVHX0FERFIJCQkweDAwOWNVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfOF9SRUdfQUREUgkJCTB4MDBhMFVMCisjZGVmaW5lCQlIV19SM0JfUkVHX0FERFIJCQkJMHgwMEMwVUwKKyNkZWZpbmUJCUhXX1I0Ql9SRUdfQUREUgkJCQkweDAxMDBVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfMF9SRUdfQUREUgkJCTB4MDE0MFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl8xX1JFR19BRERSCQkJMHgwMTQ0VUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzJfUkVHX0FERFIJCQkweDAxNDhVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfM19SRUdfQUREUgkJCTB4MDE0Y1VMCisjZGVmaW5lCQlIV19DU0FfQUREUl80X1JFR19BRERSCQkJMHgwMTUwVUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzVfUkVHX0FERFIJCQkweDAxNTRVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfNl9SRUdfQUREUgkJCTB4MDE1OFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl83X1JFR19BRERSCQkJMHgwMTVjVUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzhfUkVHX0FERFIJCQkweDAxNjBVTAorI2RlZmluZQkJSFdfQ1NBX1JFR19BRERSCQkJCTB4MDE0MFVMCisjZGVmaW5lCQlIV19TSU5CX1JFR19BRERSCQkJMHgwMTgwVUwKKyNkZWZpbmUJCUhXX1NPVVRCX1JFR19BRERSCQkJMHgwMTg0VUwKKyNkZWZpbmUJCUhXX1BLSV9DT05UUk9MX1JFR19BRERSCQkJMHgwMUMwVUwKKyNkZWZpbmUJCUhXX1BLSV9TVEFUVVNfUkVHX0FERFIJCQkweDAxQzRVTAorI2RlZmluZQkJSFdfUEtJX0JVU1lfUkVHX0FERFIJCQkweDAxQzhVTAorI2RlZmluZQkJSFdfUEtJX0FfMTAyNV9SRUdfQUREUgkJCTB4MDFDQ1VMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9DVExfUkVHX0FERFIJCTB4MDFEMFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9PRkZTRVRfUkVHX0FERFIJCTB4MDFENFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9QT0lOVEVSU19SRUdfQUREUgkJMHgwMUQ4VUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0RMRU5HX1JFR19BRERSCQkweDAxRENVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfRVhQX1BPSU5URVJTX1JFR19BRERSCTB4MDFFMFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9SRVNfUE9JTlRFUlNfUkVHX0FERFIJMHgwMUU0VUwKKyNkZWZpbmUJCUhXX1BLSV9DTFJfUkVHX0FERFIJCQkweDAxRThVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfQlVTWV9SRUdfQUREUgkJMHgwMUU4VUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0ZJUlNUX0VYUF9OX1JFR19BRERSCTB4MDFFQ1VMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9NVUxfQlkxX1JFR19BRERSCQkweDAxRjBVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfUk1VTF9TRUxfUkVHX0FERFIJCTB4MDFGNFVMCisjZGVmaW5lCQlIV19ERVNfS0VZXzBfUkVHX0FERFIJCQkweDAyMDhVTAorI2RlZmluZQkJSFdfREVTX0tFWV8xX1JFR19BRERSCQkJMHgwMjBDVUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfMl9SRUdfQUREUgkJCTB4MDIxMFVMCisjZGVmaW5lCQlIV19ERVNfS0VZXzNfUkVHX0FERFIJCQkweDAyMTRVTAorI2RlZmluZQkJSFdfREVTX0tFWV80X1JFR19BRERSCQkJMHgwMjE4VUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfNV9SRUdfQUREUgkJCTB4MDIxQ1VMCisjZGVmaW5lCQlIV19ERVNfQ09OVFJPTF8wX1JFR19BRERSCQkweDAyMjBVTAorI2RlZmluZQkJSFdfREVTX0NPTlRST0xfMV9SRUdfQUREUgkJMHgwMjI0VUwKKyNkZWZpbmUJCUhXX0RFU19JVl8wX1JFR19BRERSCQkJMHgwMjI4VUwKKyNkZWZpbmUJCUhXX0RFU19JVl8xX1JFR19BRERSCQkJMHgwMjJDVUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzBfUkVHX0FERFIJCTB4MDQwMFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl8xX1JFR19BRERSCQkweDA0MDRVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfMl9SRUdfQUREUgkJMHgwNDA4VUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzNfUkVHX0FERFIJCTB4MDQwY1VMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl80X1JFR19BRERSCQkweDA0MTBVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfNV9SRUdfQUREUgkJMHgwNDE0VUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzZfUkVHX0FERFIJCTB4MDQxOFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl83X1JFR19BRERSCQkweDA0MWNVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX1JFR19BRERSCQkJMHgwNDAwVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMF9SRUdfQUREUgkJMHgwNDQwVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMV9SRUdfQUREUgkJMHgwNDQ0VUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMl9SRUdfQUREUgkJMHgwNDQ4VUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfM19SRUdfQUREUgkJMHgwNDRjVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX1JFR19BRERSCQkJMHgwNDQwVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMF9SRUdfQUREUgkJMHgwNDYwVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMV9SRUdfQUREUgkJMHgwNDY0VUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMl9SRUdfQUREUgkJMHgwNDY4VUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfM19SRUdfQUREUgkJMHgwNDZjVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX1JFR19BRERSCQkJMHgwNDYwVUwKKyNkZWZpbmUJCUhXX0FFU19TS19SRUdfQUREUgkJCTB4MDQ3OFVMCisjZGVmaW5lCQlIV19BRVNfTUFDX09LX1JFR19BRERSCQkJMHgwNDgwVUwKKyNkZWZpbmUJCUhXX0FFU19QUkVWX0lWXzBfQUREUl8wX1JFR19BRERSCTB4MDQ5MFVMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX0FERFJfMV9SRUdfQUREUgkweDA0OTRVTAorI2RlZmluZQkJSFdfQUVTX1BSRVZfSVZfMF9BRERSXzJfUkVHX0FERFIJMHgwNDk4VUwKKyNkZWZpbmUJCUhXX0FFU19QUkVWX0lWXzBfQUREUl8zX1JFR19BRERSCTB4MDQ5Y1VMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX1JFR19BRERSCQkweDA0OTBVTAorI2RlZmluZQkJSFdfQUVTX0NPTlRST0xfUkVHX0FERFIJCQkweDA0QzBVTAorI2RlZmluZQkJSFdfSEFTSF9IMF9SRUdfQUREUgkJCTB4MDY0MFVMCisjZGVmaW5lCQlIV19IQVNIX0gxX1JFR19BRERSCQkJMHgwNjQ0VUwKKyNkZWZpbmUJCUhXX0hBU0hfSDJfUkVHX0FERFIJCQkweDA2NDhVTAorI2RlZmluZQkJSFdfSEFTSF9IM19SRUdfQUREUgkJCTB4MDY0Q1VMCisjZGVmaW5lCQlIV19IQVNIX0g0X1JFR19BRERSCQkJMHgwNjUwVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDVfUkVHX0FERFIJCQkweDA2NTRVTAorI2RlZmluZQkJSFdfSEFTSF9INl9SRUdfQUREUgkJCTB4MDY1OFVMCisjZGVmaW5lCQlIV19IQVNIX0g3X1JFR19BRERSCQkJMHgwNjVDVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDhfUkVHX0FERFIJCQkweDA2NjBVTAorI2RlZmluZQkJSFdfSEFTSF9IOV9SRUdfQUREUgkJCTB4MDY2NFVMCisjZGVmaW5lCQlIV19IQVNIX0gxMF9SRUdfQUREUgkJCTB4MDY2OFVMCisjZGVmaW5lCQlIV19IQVNIX0gxMV9SRUdfQUREUgkJCTB4MDY2Q1VMCisjZGVmaW5lCQlIV19IQVNIX0gxMl9SRUdfQUREUgkJCTB4MDY3MFVMCisjZGVmaW5lCQlIV19IQVNIX0gxM19SRUdfQUREUgkJCTB4MDY3NFVMCisjZGVmaW5lCQlIV19IQVNIX0gxNF9SRUdfQUREUgkJCTB4MDY3OFVMCisjZGVmaW5lCQlIV19IQVNIX0gxNV9SRUdfQUREUgkJCTB4MDY3Q1VMCisjZGVmaW5lCQlIV19IQVNIX0NPTlRST0xfUkVHX0FERFIJCTB4MDdDMFVMCisjZGVmaW5lCQlIV19IQVNIX1BBRF9FTl9SRUdfQUREUgkJCTB4MDdDNFVMCisjZGVmaW5lCQlIV19IQVNIX1BBRF9DRkdfUkVHX0FERFIJCTB4MDdDOFVMCisjZGVmaW5lCQlIV19IQVNIX0NVUl9MRU5fMF9SRUdfQUREUgkJMHgwN0NDVUwKKyNkZWZpbmUJCUhXX0hBU0hfQ1VSX0xFTl8xX1JFR19BRERSCQkweDA3RDBVTAorI2RlZmluZQkJSFdfSEFTSF9DVVJfTEVOXzJfUkVHX0FERFIJCTB4MDdENFVMCisjZGVmaW5lCQlIV19IQVNIX0NVUl9MRU5fM19SRUdfQUREUgkJMHgwN0Q4VUwKKyNkZWZpbmUJCUhXX0hBU0hfUEFSQU1fUkVHX0FERFIJCQkweDA3RENVTAorI2RlZmluZQkJSFdfSEFTSF9JTlRfQlVTWV9SRUdfQUREUgkJMHgwN0UwVUwKKyNkZWZpbmUJCUhXX0hBU0hfU1dfUkVTRVRfUkVHX0FERFIJCTB4MDdFNFVMCisjZGVmaW5lCQlIV19IQVNIX0VORElBTkVTU19SRUdfQUREUgkJMHgwN0U4VUwKKyNkZWZpbmUJCUhXX0hBU0hfREFUQV9SRUdfQUREUgkJCTB4MDdFQ1VMCisjZGVmaW5lCQlIV19EUk5HX0NPTlRST0xfUkVHX0FERFIJCTB4MDgwMFVMCisjZGVmaW5lCQlIV19EUk5HX1ZBTElEX1JFR19BRERSCQkJMHgwODA0VUwKKyNkZWZpbmUJCUhXX0RSTkdfREFUQV9SRUdfQUREUgkJCTB4MDgwOFVMCisjZGVmaW5lCQlIV19STkRfU1JDX0VOX1JFR19BRERSCQkJMHgwODBDVUwKKyNkZWZpbmUJCUhXX0FFU19DTEtfRU5BQkxFX1JFR19BRERSCQkweDA4MTBVTAorI2RlZmluZQkJSFdfREVTX0NMS19FTkFCTEVfUkVHX0FERFIJCTB4MDgxNFVMCisjZGVmaW5lCQlIV19IQVNIX0NMS19FTkFCTEVfUkVHX0FERFIJCTB4MDgxOFVMCisjZGVmaW5lCQlIV19QS0lfQ0xLX0VOQUJMRV9SRUdfQUREUgkJMHgwODFDVUwKKyNkZWZpbmUJCUhXX0NMS19TVEFUVVNfUkVHX0FERFIJCQkweDA4MjRVTAorI2RlZmluZQkJSFdfQ0xLX0VOQUJMRV9SRUdfQUREUgkJCTB4MDgyOFVMCisjZGVmaW5lCQlIV19EUk5HX1NBTVBMRV9SRUdfQUREUgkJCTB4MDg1MFVMCisjZGVmaW5lCQlIV19STkRfU1JDX0NUTF9SRUdfQUREUgkJCTB4MDg1OFVMCisjZGVmaW5lCQlIV19DUllQVE9fQ1RMX1JFR19BRERSCQkJMHgwOTAwVUwKKyNkZWZpbmUJCUhXX0NSWVBUT19TVEFUVVNfUkVHX0FERFIJCTB4MDkwQ1VMCisjZGVmaW5lCQlIV19DUllQVE9fQlVTWV9SRUdfQUREUgkJCTB4MDkxMFVMCisjZGVmaW5lCQlIV19BRVNfQlVTWV9SRUdfQUREUgkJCTB4MDkxNFVMCisjZGVmaW5lCQlIV19ERVNfQlVTWV9SRUdfQUREUgkJCTB4MDkxOFVMCisjZGVmaW5lCQlIV19IQVNIX0JVU1lfUkVHX0FERFIJCQkweDA5MUNVTAorI2RlZmluZQkJSFdfQ09OVEVOVF9SRUdfQUREUgkJCTB4MDkyNFVMCisjZGVmaW5lCQlIV19WRVJTSU9OX1JFR19BRERSCQkJMHgwOTI4VUwKKyNkZWZpbmUJCUhXX0NPTlRFWFRfSURfUkVHX0FERFIJCQkweDA5MzBVTAorI2RlZmluZQkJSFdfRElOX0JVRkZFUl9SRUdfQUREUgkJCTB4MEMwMFVMCisjZGVmaW5lCQlIV19ESU5fTUVNX0RNQV9CVVNZX1JFR19BRERSCQkweDBjMjBVTAorI2RlZmluZQkJSFdfU1JDX0xMSV9NRU1fQUREUl9SRUdfQUREUgkJMHgwYzI0VUwKKyNkZWZpbmUJCUhXX1NSQ19MTElfV09SRDBfUkVHX0FERFIJCTB4MEMyOFVMCisjZGVmaW5lCQlIV19TUkNfTExJX1dPUkQxX1JFR19BRERSCQkweDBDMkNVTAorI2RlZmluZQkJSFdfU1JBTV9TUkNfQUREUl9SRUdfQUREUgkJMHgwYzMwVUwKKyNkZWZpbmUJCUhXX0RJTl9TUkFNX0JZVEVTX0xFTl9SRUdfQUREUgkJMHgwYzM0VUwKKyNkZWZpbmUJCUhXX0RJTl9TUkFNX0RNQV9CVVNZX1JFR19BRERSCQkweDBDMzhVTAorI2RlZmluZQkJSFdfV1JJVEVfQUxJR05fUkVHX0FERFIJCQkweDBDM0NVTAorI2RlZmluZQkJSFdfT0xEX0RBVEFfUkVHX0FERFIJCQkweDBDNDhVTAorI2RlZmluZQkJSFdfV1JJVEVfQUxJR05fTEFTVF9SRUdfQUREUgkJMHgwQzRDVUwKKyNkZWZpbmUJCUhXX0RPVVRfQlVGRkVSX1JFR19BRERSCQkJMHgwQzAwVUwKKyNkZWZpbmUJCUhXX0RTVF9MTElfV09SRDBfUkVHX0FERFIJCTB4MEQyOFVMCisjZGVmaW5lCQlIV19EU1RfTExJX1dPUkQxX1JFR19BRERSCQkweDBEMkNVTAorI2RlZmluZQkJSFdfRFNUX0xMSV9NRU1fQUREUl9SRUdfQUREUgkJMHgwRDI0VUwKKyNkZWZpbmUJCUhXX0RPVVRfTUVNX0RNQV9CVVNZX1JFR19BRERSCQkweDBEMjBVTAorI2RlZmluZQkJSFdfU1JBTV9ERVNUX0FERFJfUkVHX0FERFIJCTB4MEQzMFVMCisjZGVmaW5lCQlIV19ET1VUX1NSQU1fQllURVNfTEVOX1JFR19BRERSCQkweDBEMzRVTAorI2RlZmluZQkJSFdfRE9VVF9TUkFNX0RNQV9CVVNZX1JFR19BRERSCQkweDBEMzhVTAorI2RlZmluZQkJSFdfUkVBRF9BTElHTl9SRUdfQUREUgkJCTB4MEQzQ1VMCisjZGVmaW5lCQlIV19SRUFEX0xBU1RfREFUQV9SRUdfQUREUgkJMHgwRDQ0VUwKKyNkZWZpbmUJCUhXX1JDNF9USFJVX0NQVV9SRUdfQUREUgkJMHgwRDRDVUwKKyNkZWZpbmUJCUhXX0FIQl9TSU5HTEVfUkVHX0FERFIJCQkweDBFMDBVTAorI2RlZmluZQkJSFdfU1JBTV9EQVRBX1JFR19BRERSCQkJMHgwRjAwVUwKKyNkZWZpbmUJCUhXX1NSQU1fQUREUl9SRUdfQUREUgkJCTB4MEYwNFVMCisjZGVmaW5lCQlIV19TUkFNX0RBVEFfUkVBRFlfUkVHX0FERFIJCTB4MEYwOFVMCisjZGVmaW5lCQlIV19IT1NUX0lSUl9SRUdfQUREUgkJCTB4MEEwMFVMCisjZGVmaW5lCQlIV19IT1NUX0lNUl9SRUdfQUREUgkJCTB4MEEwNFVMCisjZGVmaW5lCQlIV19IT1NUX0lDUl9SRUdfQUREUgkJCTB4MEEwOFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9TUkFNX1RIUkVTSE9MRF9SRUdfQUREUgkweDBBMTBVTAorI2RlZmluZQkJSFdfSE9TVF9TRVBfQlVTWV9SRUdfQUREUgkJMHgwQTE0VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0xDU19SRUdfQUREUgkJMHgwQTE4VUwKKyNkZWZpbmUJCUhXX0hPU1RfQ0NfU1dfUlNUX1JFR19BRERSCQkweDBBNDBVTAorI2RlZmluZQkJSFdfSE9TVF9TRVBfU1dfUlNUX1JFR19BRERSCQkweDBBNDRVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQwX1JFR19BRERSCTB4MEE4MFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDFfUkVHX0FERFIJMHgwQTg0VUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UMl9SRUdfQUREUgkweDBBODhVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQzX1JFR19BRERSCTB4MEE4Y1VMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDRfUkVHX0FERFIJMHgwQTkwVUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UNV9SRUdfQUREUgkweDBBOTRVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQ2X1JFR19BRERSCTB4MEE5OFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDdfUkVHX0FERFIJMHgwQTljVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMF9SRUdfQUREUgkJMHgwQjAwVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMV9SRUdfQUREUgkJMHgwQjA0VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUgkJMHgwQjA4VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUgkJMHgwQjBDVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUgkJMHgwQjgwVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMV9SRUdfQUREUgkJMHgwQjg0VUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMl9SRUdfQUREUgkJMHgwQjg4VUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSM19SRUdfQUREUgkJMHgwQjhDVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9FTkRJQU5fUkVHX0FERFIJCTB4MEI5MFVMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfQ09NTV9DTEtfRU5fUkVHX0FERFIJMHgwQjk0VUwKKyNkZWZpbmUJCUhXX0NMUl9TUkFNX0JVU1lfUkVHX1JFR19BRERSCQkweDBGMENVTAorI2RlZmluZQkJSFdfQ0NfU1JBTV9CQVNFX0FERFJFU1MJCQkweDU4MDBVTAorCisjZW5kaWYJCS8qIGlmbmRlZiBIV19ERUZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKaW5kZXggMjRmNDdkNi4uMGJjMTEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYwpAQCAtOTk2LDcgKzk5Niw3IEBACiAKIAogLyogSmFzb24gKDA4LzExLzIwMDkpIFBDSV9EUlYgd3JhcHBlciBlc3NlbnRpYWwgc3RydWN0cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNtdGNmYl9wY2lfdGFibGVbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShzbXRjZmJfcGNpX3RhYmxlKSA9IHsKIAl7MHgxMjZmLCAweDcxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCiAJezB4MTI2ZiwgMHg3MTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXsweDEyNmYsIDB4NzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKQEAgLTEwNzEsNyArMTA3MSw3IEBACiAJLyogd2hlbiByZXN1bWluZywgcmVzdG9yZSBwY2kgZGF0YSBhbmQgZmIgY3Vyc29yICovCiAJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9GUkVFWkUpIHsKIAkJcmV0diA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKLQkJcmV0diA9IHBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQogCQkJcmV0dXJuIC0xOwogCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbWJmcy9kaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbWJmcy9kaXIuYwppbmRleCBkZDYxMmY1Li44N2EzYTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc21iZnMvZGlyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtYmZzL2Rpci5jCkBAIC00MDMsMTIgKzQwMyw2IEBACiB2b2lkCiBzbWJfbmV3X2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKLQotCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfQ0FTRSkKLQkJZF9zZXRfZF9vcChkZW50cnksICZzbWJmc19kZW50cnlfb3BlcmF0aW9uc19jYXNlKTsKLQllbHNlCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmc21iZnNfZGVudHJ5X29wZXJhdGlvbnMpOwogCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKIH0KIApAQCAtNDQwLDcgKzQzNCw2IEBACiAJc3RydWN0IHNtYl9mYXR0ciBmaW5mbzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnJvcjsKLQlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcjsKIAogCWVycm9yID0gLUVOQU1FVE9PTE9ORzsKIAlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gU01CX01BWE5BTUVMRU4pCkBAIC00NjgsMTIgKzQ2MSw2IEBACiAJCWlub2RlID0gc21iX2lnZXQoZGlyLT5pX3NiLCAmZmluZm8pOwogCQlpZiAoaW5vZGUpIHsKIAlhZGRfZW50cnk6Ci0JCQlzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKLQkJCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfQ0FTRSkKLQkJCQlkX3NldF9kX29wKGRlbnRyeSwgJnNtYmZzX2RlbnRyeV9vcGVyYXRpb25zX2Nhc2UpOwotCQkJZWxzZQotCQkJCWRfc2V0X2Rfb3AoZGVudHJ5LCAmc21iZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCiAJCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAkJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOwogCQkJZXJyb3IgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtYmZzL2lub2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc21iZnMvaW5vZGUuYwppbmRleCAyNDQzMTlkLi4wNzc4NTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc21iZnMvaW5vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc21iZnMvaW5vZGUuYwpAQCAtNjE0LDYgKzYxNCwxMCBAQAogCQlwcmludGsoS0VSTl9FUlIgInNtYmZzOiBmYWlsZWQgdG8gc3RhcnQgc21iaW9kXG4iKTsKIAkJZ290byBvdXRfbm9fc21iaW9kOwogCX0KKwlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0NBU0UpCisJCXNiLT5zX2Rfb3AgPSAmc21iZnNfZGVudHJ5X29wZXJhdGlvbnNfY2FzZTsKKwllbHNlCisJCXNiLT5zX2Rfb3AgPSAmc21iZnNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIAkvKgogCSAqIEtlZXAgdGhlIHN1cGVyIGJsb2NrIGxvY2tlZCB3aGlsZSB3ZSBnZXQgdGhlIHJvb3QgaW5vZGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc21iZnMvcHJvdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9zbWJmcy9wcm90by5oCmluZGV4IDA1OTM5YTYuLjM4ODNjYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbWJmcy9wcm90by5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbWJmcy9wcm90by5oCkBAIC0zOCw2ICszOCw4IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWJfZGlyX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uc191bml4OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzbWJmc19kZW50cnlfb3BlcmF0aW9uc19jYXNlOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzbWJmc19kZW50cnlfb3BlcmF0aW9uczsKIGV4dGVybiB2b2lkIHNtYl9uZXdfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBleHRlcm4gdm9pZCBzbWJfcmVuZXdfdGltZXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIC8qIGNhY2hlLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKaW5kZXggZDk2Mzk4Yy4uMmNmNzdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKQEAgLTEsNyArMSw3IEBACiBjb25maWcgU09MTzZYMTAKIAl0cmlzdGF0ZSAiU29mdGxvZ2ljIDZ4MTAgTVBFRyBjb2RlYyBjYXJkcyIKLQlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19ERVYgJiYgU05ECi0Jc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19ERVYgJiYgU05EICYmIEkyQworCXNlbGVjdCBWSURFT0JVRl9ETUFfU0cKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgU29mdGxvZ2ljIGJhc2VkIE1QRUctNCBhbmQgaC4yNjQgY29kZWMKIAkgIGNvZGVjIGNhcmRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETwppbmRleCBlNmEyZWUyLi43ZTZjNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETwpAQCAtMSw3ICsxLDUgQEAKIFRPRE8gKHN0YWdpbmcgPT4gbWFpbik6CiAKLQkqIGNoZWNrcGF0Y2gucGwgKGhhdmVuJ3QgcnVuIGl0IHlldCkKLQkqIExpbmRlbnQgKHNob3VsZCBiZSBjbGVhbiwgYnV0IGNoZWNrKQogCSogTW90aW9uIGRldGVjdGlvbiBmbGFncyBuZWVkIHRvIGJlIG1vdmVkIHRvIHY0bDIKIAkqIFNvbWUgcHJpdmF0ZSBDSURzIG5lZWQgdG8gYmUgbW92ZWQgdG8gdjRsMgogCkBAIC0yMSw4ICsxOSw2IEBACiAJICAtIGltcGxlbWVudCBwbGF5YmFjayB2aWEgZXh0ZXJuYWwgc291bmQgamFjawogCSAgLSBpbXBsZW1lbnQgbG9vcGJhY2sgb2YgZXh0ZXJuYWwgc291bmQgamFjayB3aXRoIGluY29taW5nIGF1ZGlvPwogCSAgLSBpbXBsZW1lbnQgcGF1c2UvcmVzdW1lCi0JICAtIGNoZWNrIGludG8gamFja2luZyBzb3VuZCBmcm9tIHR4Mjh4eCBjaGlwcyBkaXJlY3RseSAodG8gYXZvaWQKLQkgICAgZy43MjMvOGtoeiBsaW1pdGF0aW9ucykKIAogUGxhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYyBCZW4gQ29sbGlucwogPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1jb3JlLmMKaW5kZXggNGEwNTFjZC4uYzQzMzEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtY29yZS5jCkBAIC0xMzYsNiArMTM2LDcgQEAKIAlpbnQgcmV0OwogCWludCBzZHJhbTsKIAl1OCBjaGlwX2lkOworCiAJc29sb19kZXYgPSBremFsbG9jKHNpemVvZigqc29sb19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc29sb19kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjMsMjEgKzE2NCwyMSBAQAogCWNoaXBfaWQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LCBTT0xPX0NISVBfT1BUSU9OKSAmCiAJCQkJCVNPTE9fQ0hJUF9JRF9NQVNLOwogCXN3aXRjaCAoY2hpcF9pZCkgewotCQljYXNlIDc6Ci0JCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSAxNjsKLQkJCXNvbG9fZGV2LT5ucl9leHQgPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDg7Ci0JCQlzb2xvX2Rldi0+bnJfZXh0ID0gMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkludmFsaWQgY2hpcF9pZCAweCUwMngsICIKLQkJCQkgImRlZmF1bHRpbmcgdG8gNCBjaGFubmVsc1xuIiwKLQkJCQkgY2hpcF9pZCk7Ci0JCWNhc2UgNToKLQkJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDQ7Ci0JCQlzb2xvX2Rldi0+bnJfZXh0ID0gMTsKKwljYXNlIDc6CisJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDE2OworCQlzb2xvX2Rldi0+bnJfZXh0ID0gNTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSA4OworCQlzb2xvX2Rldi0+bnJfZXh0ID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkludmFsaWQgY2hpcF9pZCAweCUwMngsICIKKwkJCSAiZGVmYXVsdGluZyB0byA0IGNoYW5uZWxzXG4iLAorCQkJIGNoaXBfaWQpOworCWNhc2UgNToKKwkJc29sb19kZXYtPm5yX2NoYW5zID0gNDsKKwkJc29sb19kZXYtPm5yX2V4dCA9IDE7CiAJfQogCiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB0byBzdGFydCAqLwpAQCAtMjYxLDEzICsyNjIsMTggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNvbG82MDEwX2lkX3RhYmxlW10gPSB7CisJLyogNjAxMCBiYXNlZCBjYXJkcyAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09GVExPR0lDLCBQQ0lfREVWSUNFX0lEX1NPTE82MDEwKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX05FVVNPTE9fNCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9ORVVTT0xPXzkpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfTkVVU09MT18xNil9LAotCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9DT01NU09MT180KX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzkpfSwKLQl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fMTYpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfU09MT180KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fOSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ19TT0xPXzE2KX0sCisJLyogNjExMCBiYXNlZCBjYXJkcyAqLworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ182MTEwXzQpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfNjExMF84KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfMTYpfSwKIAl7MCx9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZGlzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWRpc3AuYwppbmRleCA1NTVmMDI0Li5mODY2Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZGlzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1kaXNwLmMKQEAgLTE5OCwxMiArMTk4LDEyIEBACiAJfQogCiAJLyogRGVmYXVsdCBtb3Rpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9UX0FEUiwgU09MT19WSV9NT1RJT05fRU4oMCkgfAorCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9BRFIsIFNPTE9fVklfTU9USU9OX0VOKDApIHwKIAkJICAgICAgIChTT0xPX01PVElPTl9FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQ1RSTCwKIAkJICAgICAgIFNPTE9fVklfTU9USU9OX0ZSQU1FX0NPVU5UKDMpIHwKIAkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9MRU5HVEgoc29sb19kZXYtPnZpZGVvX2hzaXplIC8gMTYpCi0JCSAgICAgICB8IC8vU09MT19WSV9NT1RJT05fSU5UUl9TVEFSVF9TVE9QIHwKKwkJICAgICAgIHwgLyogU09MT19WSV9NT1RJT05fSU5UUl9TVEFSVF9TVE9QIHwgKi8KIAkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9DT1VOVCgxMCkpOwogCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9USU9OX0JPUkRFUiwgMCk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfQ1RSTCgwKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKDApLCAwKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfU1RPUCgwKSwgMCk7Ci0JCisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfQ1RSTCgxKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKDEpLCAwKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfU1RPUCgxKSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMKaW5kZXggYTZjZjBhOC4uNDgxYTQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1lbmMuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgInNvbG82MDEwLmgiCiAjaW5jbHVkZSAic29sbzYwMTAtb3NkLWZvbnQuaCIKIAotI2RlZmluZSBDQVBUVVJFX01BWF9CQU5EV0lEVEgJCTMyCS8vIEQxIDRjaGFubmVsIChEMSA9PSA0KQorI2RlZmluZSBDQVBUVVJFX01BWF9CQU5EV0lEVEgJCTMyCS8qIEQxIDRjaGFubmVsIChEMSA9PSA0KSAqLwogI2RlZmluZSBPU0dfQlVGRkVSX1NJWkUJCQkxMDI0CiAKICNkZWZpbmUgVklfUFJPR19IU0laRQkJCSgxMjgwIC0gMTYpCkBAIC0xNDUsOCArMTQ1LDggQEAKIAogCXNvbG9fcDJtX2RtYShzb2xvX2RldiwgMCwgMSwgYnVmLCBTT0xPX0VPU0RfRVhUX0FERFIoc29sb19kZXYpICsKIAkJICAgICAoc29sb19lbmMtPmNoICogU09MT19FT1NEX0VYVF9TSVpFKSwgU09MT19FT1NEX0VYVF9TSVpFKTsKLSAgICAgICAgcmVnIHw9ICgxIDw8IHNvbG9fZW5jLT5jaCk7Ci0gICAgICAgIHNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX09TRF9DSCwgcmVnKTsKKwlyZWcgfD0gKDEgPDwgc29sb19lbmMtPmNoKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9PU0RfQ0gsIHJlZyk7CiAKIAlrZnJlZShidWYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWc3MjMuYwppbmRleCA4MmZiY2I4Li4yNTRiNDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1nNzIzLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIGlzIGJyb2tlbiBkb3duIHRvIDIwICogNDggYnl0ZSByZWdpb25zIChvbmUgZm9yIGVhY2ggY2hhbm5lbCBwb3NzaWJsZSkKICAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgYmVpbmcgZHVtbXkgZGF0YS4gKi8KICNkZWZpbmUgTUFYX0JVRkZFUgkJKEc3MjNfUEVSSU9EX0JZVEVTICogUEVSSU9EU19NQVgpCi0jZGVmaW5lIElSUV9QQUdFUwkJNCAvLyAwIC0gNAorI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KICNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKICNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUwogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKIAlrZnJlZShzb2xvX3BjbSk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNtZCkKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCiB7Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3NvbG9fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0dzI4X2dldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMjc5LDE1ICsyNzksMTUgQEAKIHsKIAlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1OCBjaCA9IHZhbHVlLT5pZC5udW1pZCAtIDE7Ci0gICAgICAgIHU4IG9sZF92YWw7CisJdTggb2xkX3ZhbDsKIAotICAgICAgICBvbGRfdmFsID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOworCW9sZF92YWwgPSB0dzI4X2dldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCk7CiAJaWYgKG9sZF92YWwgPT0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJdHcyOF9zZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gsIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKIAotICAgICAgICByZXR1cm4gMTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lID0gewpAQCAtMzY4LDE0ICszNjgsMTYgQEAKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiU09MTy02MDEwIik7CiAJa2N0bCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lOwogCWtjdGwuY291bnQgPSBzb2xvX2Rldi0+bnJfY2hhbnM7Ci0gICAgICAgIHJldCA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgma2N0bCwgc29sb19kZXYpKTsKKwlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKHJldCA9IHNvbG9fc25kX3BjbV9pbml0KHNvbG9fZGV2KSkgPCAwKQorCXJldCA9IHNvbG9fc25kX3BjbV9pbml0KHNvbG9fZGV2KTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBzbmRfZXJyb3I7CiAKLQlpZiAoKHJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gc25kX2Vycm9yOwogCiAJc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYwppbmRleCA0NmY3YTcxZWRhLi44ODY5Yjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1ncGlvLmMKQEAgLTkyLDggKzkyLDggQEAKIAogaW50IHNvbG9fZ3Bpb19pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQogewotICAgICAgICBzb2xvX2dwaW9fY29uZmlnKHNvbG9fZGV2KTsKLSAgICAgICAgcmV0dXJuIDA7CisJc29sb19ncGlvX2NvbmZpZyhzb2xvX2Rldik7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc29sb19ncGlvX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMKaW5kZXggY2FkZDUxMi4uNjBiNjljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1pMmMuYwpAQCAtNDYsNyArNDYsNyBAQAogCiAJaTJjX3RyYW5zZmVyKCZzb2xvX2Rldi0+aTJjX2FkYXBbaWRdLCBtc2dzLCAyKTsKIAotICAgICAgICByZXR1cm4gZGF0YTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogdm9pZCBzb2xvX2kyY193cml0ZWJ5dGUoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGludCBpZCwgdTggYWRkciwKQEAgLTIyNSw5ICsyMjUsOSBAQAogCX0KIAogCWlmIChpID09IFNPTE9fSTJDX0FEQVBURVJTKQotCQlyZXR1cm4gbnVtOyAvLyBYWFggUmlnaHQgcmV0dXJuIHZhbHVlIGZvciBmYWlsdXJlPworCQlyZXR1cm4gbnVtOyAvKiBYWFggUmlnaHQgcmV0dXJuIHZhbHVlIGZvciBmYWlsdXJlPyAqLwogCi0JZG93bigmc29sb19kZXYtPmkyY19zZW0pOworCW11dGV4X2xvY2soJnNvbG9fZGV2LT5pMmNfbXV0ZXgpOwogCXNvbG9fZGV2LT5pMmNfaWQgPSBpOwogCXNvbG9fZGV2LT5pMmNfbXNnID0gbXNnczsKIAlzb2xvX2Rldi0+aTJjX21zZ19udW0gPSBudW07CkBAIC0yNTgsNyArMjU4LDcgQEAKIAlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX0lETEU7CiAJc29sb19kZXYtPmkyY19pZCA9IC0xOwogCi0JdXAoJnNvbG9fZGV2LT5pMmNfc2VtKTsKKwltdXRleF91bmxvY2soJnNvbG9fZGV2LT5pMmNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4NCw3ICsyODQsNyBAQAogCXNvbG9fZGV2LT5pMmNfaWQgPSAtMTsKIAlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX0lETEU7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29sb19kZXYtPmkyY193YWl0KTsKLQlzZW1hX2luaXQoJnNvbG9fZGV2LT5pMmNfc2VtLCAxKTsKKwltdXRleF9pbml0KCZzb2xvX2Rldi0+aTJjX211dGV4KTsKIAogCWZvciAoaSA9IDA7IGkgPCBTT0xPX0kyQ19BREFQVEVSUzsgaSsrKSB7CiAJCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9ICZzb2xvX2Rldi0+aTJjX2FkYXBbaV07CkBAIC0yOTYsNyArMjk2LDggQEAKIAkJYWRhcC0+cmV0cmllcyA9IDE7CiAJCWFkYXAtPmRldi5wYXJlbnQgPSAmc29sb19kZXYtPnBkZXYtPmRldjsKIAotCQlpZiAoKHJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKSkpIHsKKwkJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCQlpZiAocmV0KSB7CiAJCQlhZGFwLT5hbGdvX2RhdGEgPSBOVUxMOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKaW5kZXggZDZmNTY1Yi4uZDcyZWZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzb2xvX29zZF9mb250W10gPSB7CiAJMHgwMDAwMDAwMCwgMHgwMDAwYzBjOCwgMHhjY2ZlZmUwYywgMHgwODAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDEwMTAzODM4LCAweDdjN2NmZWZlLCAweDAwMDAwMDAwLAkvLyAwCisJMHgwMDAwMDAwMCwgMHgxMDEwMzgzOCwgMHg3YzdjZmVmZSwgMHgwMDAwMDAwMCwJLyogMCAqLwogCTB4MDAwMDAwMDAsIDB4ZmVmZTdjN2MsIDB4MzgzODEwMTAsIDB4MTAwMDAwMDAsCiAJMHgwMDAwMDAwMCwgMHg3YzgyZmVmZSwgMHhmZWZlZmU3YywgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwMDAxMDM4LCAweDEwMDAwMDAwLCAweDAwMDAwMDAwLApAQCAtNTQsNjcgKzU0LDY3IEBACiAJMHgwMDAwMDAzZiwgMHg3ZjQwNGM1MiwgMHg1MjRjNDA3ZiwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDdjLCAweDgyYmE4MmJhLCAweDgyYmE4MmZlLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgxODNjM2MzYywgMHgxODE4MDAxOCwgMHgxODAwMDAwMCwJLy8gMzIgICAhCisJMHgwMDAwMDAwMCwgMHgxODNjM2MzYywgMHgxODE4MDAxOCwgMHgxODAwMDAwMCwJLyogMzIgICAhICovCiAJMHgwMDAwMDA2NiwgMHg2NjI0MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDZjNmNmZTZjLCAweDZjNmNmZTZjLCAweDZjMDAwMDAwLAkvLyAzNCAiICMKKwkweDAwMDAwMDAwLCAweDZjNmNmZTZjLCAweDZjNmNmZTZjLCAweDZjMDAwMDAwLAkvKiAzNCAiICMgKi8KIAkweDAwMDAxMDEwLCAweDdjZDZkNjE2LCAweDdjZDBkNmQ2LCAweDdjMTAxMDAwLAotCTB4MDAwMDAwMDAsIDB4MDA4NmM2NjAsIDB4MzAxODBjYzYsIDB4YzIwMDAwMDAsCS8vIDM2ICQgJQorCTB4MDAwMDAwMDAsIDB4MDA4NmM2NjAsIDB4MzAxODBjYzYsIDB4YzIwMDAwMDAsCS8qIDM2ICQgJSAqLwogCTB4MDAwMDAwMDAsIDB4Mzg2YzZjMzgsIDB4ZGM3NjY2NjYsIDB4ZGMwMDAwMDAsCi0JMHgwMDAwMDAwYywgMHgwYzBjMDYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwJLy8gMzggJiAnCisJMHgwMDAwMDAwYywgMHgwYzBjMDYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwJLyogMzggJiAnICovCiAJMHgwMDAwMDAwMCwgMHgzMDE4MGMwYywgMHgwYzBjMGMxOCwgMHgzMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDBjMTgzMDMwLCAweDMwMzAzMDE4LCAweDBjMDAwMDAwLAkvLyA0MCAoICkKKwkweDAwMDAwMDAwLCAweDBjMTgzMDMwLCAweDMwMzAzMDE4LCAweDBjMDAwMDAwLAkvKiA0MCAoICkgKi8KIAkweDAwMDAwMDAwLCAweDAwMDA2NjNjLCAweGZmM2M2NjAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDE4MTgsIDB4N2UxODE4MDAsIDB4MDAwMDAwMDAsCS8vIDQyICogKworCTB4MDAwMDAwMDAsIDB4MDAwMDE4MTgsIDB4N2UxODE4MDAsIDB4MDAwMDAwMDAsCS8qIDQyICogKyAqLwogCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMGUsIDB4MGMwNjAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3ZTAwMDAwMCwgMHgwMDAwMDAwMCwJLy8gNDQgLCAtCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3ZTAwMDAwMCwgMHgwMDAwMDAwMCwJLyogNDQgLCAtICovCiAJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwNjAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDgwYzA2MDMwLCAweDE4MGMwNjAyLCAweDAwMDAwMDAwLAkvLyA0NiAuIC8KKwkweDAwMDAwMDAwLCAweDgwYzA2MDMwLCAweDE4MGMwNjAyLCAweDAwMDAwMDAwLAkvKiA0NiAuIC8gKi8KIAkweDAwMDAwMDdjLCAweGM2ZTZmNmRlLCAweGNlYzZjNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMzAsIDB4MzgzYzMwMzAsIDB4MzAzMDMwZmMsIDB4MDAwMDAwMDAsCS8vIDQ4IDAgMQorCTB4MDAwMDAwMzAsIDB4MzgzYzMwMzAsIDB4MzAzMDMwZmMsIDB4MDAwMDAwMDAsCS8qIDQ4IDAgMSAqLwogCTB4MDAwMDAwN2MsIDB4YzZjMDYwMzAsIDB4MTgwY2M2ZmUsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3YywgMHhjNmMwYzA3YywgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLy8gNTAgMiAzCisJMHgwMDAwMDA3YywgMHhjNmMwYzA3YywgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLyogNTAgMiAzICovCiAJMHgwMDAwMDA2MCwgMHg3MDc4NmM2NiwgMHhmZTYwNjBmMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGZlLCAweDA2MDYwNjdlLCAweGMwYzBjNjdjLCAweDAwMDAwMDAwLAkvLyA1MiA0IDUKKwkweDAwMDAwMGZlLCAweDA2MDYwNjdlLCAweGMwYzBjNjdjLCAweDAwMDAwMDAwLAkvKiA1MiA0IDUgKi8KIAkweDAwMDAwMDM4LCAweDBjMDYwNjdlLCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwZmUsIDB4YzZjMDYwMzAsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCS8vIDU0IDYgNworCTB4MDAwMDAwZmUsIDB4YzZjMDYwMzAsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCS8qIDU0IDYgNyAqLwogCTB4MDAwMDAwN2MsIDB4YzZjNmM2N2MsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3YywgMHhjNmM2YzZmYywgMHhjMGMwNjAzOCwgMHgwMDAwMDAwMCwJLy8gNTYgOCA5CisJMHgwMDAwMDA3YywgMHhjNmM2YzZmYywgMHhjMGMwNjAzOCwgMHgwMDAwMDAwMCwJLyogNTYgOCA5ICovCiAJMHgwMDAwMDAwMCwgMHgxODE4MDAwMCwgMHgwMDE4MTgwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDE4MTgwMDAwLCAweDAwMTgxODBjLCAweDAwMDAwMDAwLAkvLyA1OCA6IDsKKwkweDAwMDAwMDAwLCAweDE4MTgwMDAwLCAweDAwMTgxODBjLCAweDAwMDAwMDAwLAkvKiA1OCA6IDsgKi8KIAkweDAwMDAwMDYwLCAweDMwMTgwYzA2LCAweDBjMTgzMDYwLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsIDB4MDA3ZTAwMDAsIDB4MDA3ZTAwMDAsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwNiwgMHgwYzE4MzA2MCwgMHgzMDE4MGMwNiwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDdjLCAweGM2YzY2MDMwLCAweDMwMDAzMDMwLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwN2MsIDB4YzZmNmQ2ZDYsIDB4NzYwNjA2N2MsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAxMCwgMHgzODZjYzZjNiwgMHhmZWM2YzZjNiwgMHgwMDAwMDAwMCwJLy8gNjQgQCBBCisJMHgwMDAwMDAxMCwgMHgzODZjYzZjNiwgMHhmZWM2YzZjNiwgMHgwMDAwMDAwMCwJLyogNjQgQCBBICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHhjNmM2YzY3ZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweDA2MDZjYzc4LCAweDAwMDAwMDAwLAkvLyA2NgorCTB4MDAwMDAwNzgsIDB4Y2MwNjA2MDYsIDB4MDYwNmNjNzgsIDB4MDAwMDAwMDAsCS8qIDY2ICovCiAJMHgwMDAwMDAzZSwgMHg2NmM2YzZjNiwgMHhjNmM2NjYzZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGZlLCAweDA2MDYwNjNlLCAweDA2MDYwNmZlLCAweDAwMDAwMDAwLAkvLyA2OAorCTB4MDAwMDAwZmUsIDB4MDYwNjA2M2UsIDB4MDYwNjA2ZmUsIDB4MDAwMDAwMDAsCS8qIDY4ICovCiAJMHgwMDAwMDBmZSwgMHgwNjA2MDYzZSwgMHgwNjA2MDYwNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweGY2YzZjY2I4LCAweDAwMDAwMDAwLAkvLyA3MAorCTB4MDAwMDAwNzgsIDB4Y2MwNjA2MDYsIDB4ZjZjNmNjYjgsIDB4MDAwMDAwMDAsCS8qIDcwICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2YzZmZSwgMHhjNmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDE4MTgxODE4LCAweDE4MTgxODNjLCAweDAwMDAwMDAwLAkvLyA3MgorCTB4MDAwMDAwM2MsIDB4MTgxODE4MTgsIDB4MTgxODE4M2MsIDB4MDAwMDAwMDAsCS8qIDcyICovCiAJMHgwMDAwMDA2MCwgMHg2MDYwNjA2MCwgMHg2MDY2NjYzYywgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2NjYzNjFlLCAweDM2NjZjNmM2LCAweDAwMDAwMDAwLAkvLyA3NAorCTB4MDAwMDAwYzYsIDB4YzY2NjM2MWUsIDB4MzY2NmM2YzYsIDB4MDAwMDAwMDAsCS8qIDc0ICovCiAJMHgwMDAwMDAwNiwgMHgwNjA2MDYwNiwgMHgwNjA2MDZmZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGVlZmVkNmM2LCAweGM2YzZjNmM2LCAweDAwMDAwMDAwLAkvLyA3NgorCTB4MDAwMDAwYzYsIDB4ZWVmZWQ2YzYsIDB4YzZjNmM2YzYsIDB4MDAwMDAwMDAsCS8qIDc2ICovCiAJMHgwMDAwMDBjNiwgMHhjZWRlZmVmNiwgMHhlNmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2YzY2YzM4LCAweDAwMDAwMDAwLAkvLyA3OAorCTB4MDAwMDAwMzgsIDB4NmNjNmM2YzYsIDB4YzZjNjZjMzgsIDB4MDAwMDAwMDAsCS8qIDc4ICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHgwNjA2MDYwNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2ZDY3YzM4LCAweDYwMDAwMDAwLAkvLyA4MAorCTB4MDAwMDAwMzgsIDB4NmNjNmM2YzYsIDB4YzZkNjdjMzgsIDB4NjAwMDAwMDAsCS8qIDgwICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHg2NmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDdjLCAweGM2YzYwYzM4LCAweDYwYzZjNjdjLCAweDAwMDAwMDAwLAkvLyA4MgorCTB4MDAwMDAwN2MsIDB4YzZjNjBjMzgsIDB4NjBjNmM2N2MsIDB4MDAwMDAwMDAsCS8qIDgyICovCiAJMHgwMDAwMDA3ZSwgMHgxODE4MTgxOCwgMHgxODE4MTgxOCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAkvLyA4NAorCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCS8qIDg0ICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2YzZjNiwgMHhjNjZjMzgxMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGQ2ZDZmZTZjLCAweDAwMDAwMDAwLAkvLyA4NgorCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4ZDZkNmZlNmMsIDB4MDAwMDAwMDAsCS8qIDg2ICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2NmMzOCwgMHg2Y2M2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDY2LCAweDY2NjY2NjY2LCAweDNjMTgxODE4LCAweDAwMDAwMDAwLAkvLyA4OAorCTB4MDAwMDAwNjYsIDB4NjY2NjY2NjYsIDB4M2MxODE4MTgsIDB4MDAwMDAwMDAsCS8qIDg4ICovCiAJMHgwMDAwMDBmZSwgMHhjMDYwMzAxOCwgMHgwYzA2MDZmZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDBjMGMwYzBjLCAweDBjMGMwYzNjLCAweDAwMDAwMDAwLAkvLyA5MAorCTB4MDAwMDAwM2MsIDB4MGMwYzBjMGMsIDB4MGMwYzBjM2MsIDB4MDAwMDAwMDAsCS8qIDkwICovCiAJMHgwMDAwMDAwMiwgMHgwNjBjMTgzMCwgMHg2MGMwODAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDMwMzAzMDMwLCAweDMwMzAzMDNjLCAweDAwMDAwMDAwLAkvLyA5MgorCTB4MDAwMDAwM2MsIDB4MzAzMDMwMzAsIDB4MzAzMDMwM2MsIDB4MDAwMDAwMDAsCS8qIDkyICovCiAJMHgwMDAwMTAzOCwgMHg2Y2M2MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwZmUwMDAwLAogCTB4MDAwMDE4MTgsIDB4MzAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcDJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcDJtLmMKaW5kZXggN2VkM2VkNC4uOTU2ZGVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXAybS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1wMm0uYwpAQCAtMTgsMTAgKzE4LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogCi0vLyAjZGVmaW5lIFNPTE9fVEVTVF9QMk0KKy8qICNkZWZpbmUgU09MT19URVNUX1AyTSAqLwogCiBpbnQgc29sb19wMm1fZG1hKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgdm9pZCAqc3lzX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpCkBAIC0zMCw4ICszMSw5IEBACiAJaW50IHJldDsKIAogCVdBUk5fT04oIXNpemUpOwotCVdBUk5fT04oaWQgPj0gU09MT19OUl9QMk0pOwotCWlmICghc2l6ZSB8fCBpZCA+PSBTT0xPX05SX1AyTSkKKwlCVUdfT04oaWQgPj0gU09MT19OUl9QMk0pOworCisJaWYgKCFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoc29sb19kZXYtPnBkZXYsIHN5c19hZGRyLCBzaXplLApAQCAtNDgsNDEgKzUwLDEzNiBAQAogaW50IHNvbG9fcDJtX2RtYV90KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgICBkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQogewotCXN0cnVjdCBzb2xvX3AybV9kZXYgKnAybV9kZXY7Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSAwOworCXN0cnVjdCBwMm1fZGVzYyAqZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSAqIDIsIEdGUF9ETUEpOworCWludCByZXQ7CiAKLQlXQVJOX09OKCFzaXplKTsKLQlXQVJOX09OKGlkID49IFNPTE9fTlJfUDJNKTsKLQlpZiAoIXNpemUgfHwgaWQgPj0gU09MT19OUl9QMk0pCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChkZXNjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc29sb19wMm1fcHVzaF9kZXNjKCZkZXNjWzFdLCB3ciwgZG1hX2FkZHIsIGV4dF9hZGRyLCBzaXplLCAwLCAwKTsKKwlyZXQgPSBzb2xvX3AybV9kbWFfZGVzYyhzb2xvX2RldiwgaWQsIGRlc2MsIDIpOworCWtmcmVlKGRlc2MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzb2xvX3AybV9wdXNoX2Rlc2Moc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgd3IsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQl1MzIgZXh0X2FkZHIsIHUzMiBzaXplLCBpbnQgcmVwZWF0LCB1MzIgZXh0X3NpemUpCit7CisJZGVzYy0+dGEgPSBkbWFfYWRkcjsKKwlkZXNjLT5mYSA9IGV4dF9hZGRyOworCisJZGVzYy0+ZXh0ID0gU09MT19QMk1fQ09QWV9TSVpFKHNpemUgPj4gMik7CisJZGVzYy0+Y3RybCA9IFNPTE9fUDJNX0JVUlNUX1NJWkUoU09MT19QMk1fQlVSU1RfMjU2KSB8CisJCSh3ciA/IFNPTE9fUDJNX1dSSVRFIDogMCkgfCBTT0xPX1AyTV9UUkFOU19PTjsKKworCS8qIEV4dCBzaXplIG9ubHkgbWF0dGVycyB3aGVuIHdlJ3JlIHJlcGVhdGluZyAqLworCWlmIChyZXBlYXQpIHsKKwkJZGVzYy0+ZXh0IHw9IFNPTE9fUDJNX0VYVF9JTkMoZXh0X3NpemUgPj4gMik7CisJCWRlc2MtPmN0cmwgfD0gIFNPTE9fUDJNX1BDSV9JTkMoc2l6ZSA+PiAyKSB8CisJCQlTT0xPX1AyTV9SRVBFQVQocmVwZWF0KTsKKwl9Cit9CisKK2ludCBzb2xvX3AybV9kbWFfZGVzYyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywgaW50IGRlc2NfY291bnQpCit7CisJc3RydWN0IHNvbG9fcDJtX2RldiAqcDJtX2RldjsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgY29uZmlnID0gMDsKKwlkbWFfYWRkcl90IGRlc2NfZG1hID0gMDsKKworCUJVR19PTihpZCA+PSBTT0xPX05SX1AyTSk7CisJQlVHX09OKCFkZXNjX2NvdW50IHx8IGRlc2NfY291bnQgPiBTT0xPX05SX1AyTV9ERVNDKTsKIAogCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaWRdOwogCi0JZG93bigmcDJtX2Rldi0+c2VtKTsKKwltdXRleF9sb2NrKCZwMm1fZGV2LT5tdXRleCk7CiAKLXN0YXJ0X2RtYToKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpZCksIDApOworCiAJSU5JVF9DT01QTEVUSU9OKHAybV9kZXYtPmNvbXBsZXRpb24pOwogCXAybV9kZXYtPmVycm9yID0gMDsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fVEFSX0FEUihpZCksIGRtYV9hZGRyKTsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fRVhUX0FEUihpZCksIGV4dF9hZGRyKTsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fRVhUX0NGRyhpZCksCi0JCSAgICAgICBTT0xPX1AyTV9DT1BZX1NJWkUoc2l6ZSA+PiAyKSk7Ci0Jc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaWQpLAotCQkgICAgICAgU09MT19QMk1fQlVSU1RfU0laRShTT0xPX1AyTV9CVVJTVF8yNTYpIHwKLQkJICAgICAgICh3ciA/IFNPTE9fUDJNX1dSSVRFIDogMCkgfCBTT0xPX1AyTV9UUkFOU19PTik7CiAKKwkvKiBFbmFibGUgdGhlIGRlc2NyaXB0b3JzICovCisJY29uZmlnID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGlkKSk7CisJZGVzY19kbWEgPSBwY2lfbWFwX3NpbmdsZShzb2xvX2Rldi0+cGRldiwgZGVzYywKKwkJCQkgIGRlc2NfY291bnQgKiBzaXplb2YoKmRlc2MpLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU19BRFIoaWQpLCBkZXNjX2RtYSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU0NfSUQoaWQpLCBkZXNjX2NvdW50IC0gMSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTkZJRyhpZCksIGNvbmZpZyB8CisJCSAgICAgICBTT0xPX1AyTV9ERVNDX01PREUpOworCisJLyogU2hvdWxkIGhhdmUgYWxsIGRlc2NyaXB0b3JzIGNvbXBsZXRlZCBmcm9tIG9uZSBpbnRlcnJ1cHQgKi8KIAl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwMm1fZGV2LT5jb21wbGV0aW9uLCBIWik7CiAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpZCksIDApOwogCi0JLyogWFhYIFJlYWxseSBsb29rcyB0byBtZSBsaWtlIHdlIHdpbGwgZ2V0IHN0dWNrIGhlcmUgaWYgYQotCSAqIHJlYWwgUENJIFAyTSBlcnJvciBvY2N1cnMgKi8KKwkvKiBSZXNldCBiYWNrIHRvIG5vbi1kZXNjcmlwdG9yIG1vZGUgKi8KKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGlkKSwgY29uZmlnKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fREVTQ19JRChpZCksIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9ERVNfQURSKGlkKSwgMCk7CisJcGNpX3VubWFwX3NpbmdsZShzb2xvX2Rldi0+cGRldiwgZGVzY19kbWEsCisJCQkgZGVzY19jb3VudCAqIHNpemVvZigqZGVzYyksCisJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKIAlpZiAocDJtX2Rldi0+ZXJyb3IpCi0JCWdvdG8gc3RhcnRfZG1hOworCQlyZXQgPSAtRUlPOworCWVsc2UgaWYgKHRpbWVvdXQgPT0gMCkKKwkJcmV0ID0gLUVBR0FJTjsKIAotCXVwKCZwMm1fZGV2LT5zZW0pOworCW11dGV4X3VubG9jaygmcDJtX2Rldi0+bXV0ZXgpOwogCi0JcmV0dXJuICh0aW1lb3V0ID09IDApID8gLUVBR0FJTiA6IDA7CisJV0FSTl9PTl9PTkNFKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc29sb19wMm1fZG1hX3NnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwKKwkJICAgIHN0cnVjdCBwMm1fZGVzYyAqcGRlc2MsIGludCB3ciwKKwkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHUzMiBzZ19vZmYsCisJCSAgICB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQoreworCWludCBpOworCWludCBpZHg7CisKKwlCVUdfT04oaWQgPj0gU09MT19OUl9QMk0pOworCisJaWYgKFdBUk5fT05fT05DRSghc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBkZXNjLCAwLCBzaXplb2YoKnBkZXNjKSk7CisKKwkvKiBTaG91bGQgcmV3cml0ZSB0aGlzIHRvIGhhbmRsZSA+IFNPTE9fTlJfUDJNX0RFU0MgdHJhbnNhY3Rpb25zICovCisJZm9yIChpID0gMCwgaWR4ID0gMTsgaWR4IDwgU09MT19OUl9QMk1fREVTQyAmJiBzZyAmJiBzaXplID4gMDsKKwkgICAgIGkrKywgc2cgPSBzZ19uZXh0KHNnKSkgeworCQlzdHJ1Y3QgcDJtX2Rlc2MgKmRlc2MgPSAmcGRlc2NbaWR4XTsKKwkJdTMyIHNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQl1MzIgbGVuOworCisJCWlmIChzZ19vZmYgPj0gc2dfbGVuKSB7CisJCQlzZ19vZmYgLT0gc2dfbGVuOworCQkJY29udGludWU7CisJCX0KKworCQlzZ19sZW4gLT0gc2dfb2ZmOworCQlsZW4gPSBtaW4oc2dfbGVuLCBzaXplKTsKKworCQlzb2xvX3AybV9wdXNoX2Rlc2MoZGVzYywgd3IsIHNnX2RtYV9hZGRyZXNzKHNnKSArIHNnX29mZiwKKwkJCQkgICBleHRfYWRkciwgbGVuLCAwLCAwKTsKKworCQlzaXplIC09IGxlbjsKKwkJZXh0X2FkZHIgKz0gbGVuOworCQlpZHgrKzsKKworCQlzZ19vZmYgPSAwOworCX0KKworCVdBUk5fT05fT05DRShzaXplIHx8IGkgPj0gU09MT19OUl9QMk1fREVTQyk7CisKKwlyZXR1cm4gc29sb19wMm1fZG1hX2Rlc2Moc29sb19kZXYsIGlkLCBwZGVzYywgaWR4KTsKIH0KIAogI2lmZGVmIFNPTE9fVEVTVF9QMk0KQEAgLTE0NywxMyArMjQ0LDE2IEBACiAJcmV0dXJuOwogfQogI2Vsc2UKLSNkZWZpbmUgcnVuX3AybV90ZXN0KF9fc29sbykJZG97fXdoaWxlKDApCisjZGVmaW5lIHJ1bl9wMm1fdGVzdChfX3NvbG8pCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKIHZvaWQgc29sb19wMm1faXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBpbnQgaWQpCiB7CisJc3RydWN0IHNvbG9fcDJtX2RldiAqcDJtX2RldiA9ICZzb2xvX2Rldi0+cDJtX2RldltpZF07CisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfUDJNKGlkKSk7Ci0JY29tcGxldGUoJnNvbG9fZGV2LT5wMm1fZGV2W2lkXS5jb21wbGV0aW9uKTsKKworCWNvbXBsZXRlKCZwMm1fZGV2LT5jb21wbGV0aW9uKTsKIH0KIAogdm9pZCBzb2xvX3AybV9lcnJvcl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBzdGF0dXMpCkBAIC0xODgsMTYgKzI4OCwxNCBAQAogCWZvciAoaSA9IDA7IGkgPCBTT0xPX05SX1AyTTsgaSsrKSB7CiAJCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaV07CiAKLQkJc2VtYV9pbml0KCZwMm1fZGV2LT5zZW0sIDEpOworCQltdXRleF9pbml0KCZwMm1fZGV2LT5tdXRleCk7CiAJCWluaXRfY29tcGxldGlvbigmcDJtX2Rldi0+Y29tcGxldGlvbik7CiAKLQkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU19BRFIoaSksCi0JCQkgICAgICAgX19wYShwMm1fZGV2LT5kZXNjKSk7Ci0KIAkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaSksIDApOwogCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGkpLAogCQkJICAgICAgIFNPTE9fUDJNX0NTQ18xNkJJVF81NjUgfAotCQkJICAgICAgIFNPTE9fUDJNX0RNQV9JTlRFUlZBTCgwKSB8CisJCQkgICAgICAgU09MT19QMk1fRE1BX0lOVEVSVkFMKDMpIHwKKwkJCSAgICAgICBTT0xPX1AyTV9ERVNDX0lOVFJfT1BUIHwKIAkJCSAgICAgICBTT0xPX1AyTV9QQ0lfTUFTVEVSX01PREUpOwogCQlzb2xvNjAxMF9pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX1AyTShpKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmMKaW5kZXggMDE1OWM4My4uOTA1YTZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdHcyOC5jCkBAIC0zNSwxMDcgKzM1LDEwNyBAQAogI2RlZmluZSBERUZBVUxUX1ZBQ1RJVkVfUEFMCQkoMzEyLURFRkFVTFRfVkRFTEFZX1BBTCkKIAogc3RhdGljIHU4IHRibF90dzI4NjRfdGVtcGxhdGVbXSA9IHsKLQkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDAwCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgwMCAqLwogCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgxMAorCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MTAgKi8KIAkweDEyLCAweGY1LCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MjAKKwkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDIwICovCiAJMHgxMiwgMHhmNSwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDMwCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgzMCAqLwogCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg0MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NTAKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDYwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg3MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEzLCAweDAwLAotCTB4MDAsIDB4MDIsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4ODAsIDB4NDQsIDB4NTAsIC8vIDB4ODAKKwkweDAwLCAweDAyLCAweDAwLCAweGNjLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvKiAweDgwICovCiAJMHgyMiwgMHgwMSwgMHhkOCwgMHhiYywgMHhiOCwgMHg0NCwgMHgzOCwgMHgwMCwKLQkweDAwLCAweDc4LCAweDcyLCAweDNlLCAweDE0LCAweGE1LCAweGU0LCAweDA1LCAvLyAweDkwCisJMHgwMCwgMHg3OCwgMHg3MiwgMHgzZSwgMHgxNCwgMHhhNSwgMHhlNCwgMHgwNSwgLyogMHg5MCAqLwogCTB4MDAsIDB4MjgsIDB4NDQsIDB4NDQsIDB4YTAsIDB4ODgsIDB4NWEsIDB4MDEsCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxYSwgMHgxYSwgMHgxYSwgMHgxYSwgLy8gMHhhMAorCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MWEsIDB4MWEsIDB4MWEsIDB4MWEsIC8qIDB4YTAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweDQ0LAotCTB4NDQsIDB4MGEsIDB4MDAsIDB4ZmYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIC8vIDB4YjAKKwkweDQ0LCAweDBhLCAweDAwLCAweGZmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAvKiAweGIwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweGMwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMCAqLwogCTB4MDAsIDB4MDAsIDB4NTUsIDB4MDAsIDB4YjEsIDB4ZTQsIDB4NDAsIDB4MDAsCi0JMHg3NywgMHg3NywgMHgwMSwgMHgxMywgMHg1NywgMHg5YiwgMHhkZiwgMHgyMCwgLy8gMHhkMAorCTB4NzcsIDB4NzcsIDB4MDEsIDB4MTMsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MjAsIC8qIDB4ZDAgKi8KIAkweDY0LCAweGE4LCAweGVjLCAweGQxLCAweDBmLCAweDExLCAweDExLCAweDgxLAotCTB4MTAsIDB4ZTAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIC8vIDB4ZTAKKwkweDEwLCAweGUwLCAweGJiLCAweGJiLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvKiAweGUwICovCiAJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweDgzLCAweGI1LCAweDA5LCAweDc4LCAweDg1LCAweDAwLCAweDAxLCAweDIwLCAvLyAweGYwCisJMHg4MywgMHhiNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLyogMHhmMCAqLwogCTB4NjQsIDB4MTEsIDB4NDAsIDB4YWYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCiB9OwogCiBzdGF0aWMgdTggdGJsX3R3Mjg2NV9udHNjX3RlbXBsYXRlW10gPSB7Ci0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgwMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MDAgKi8KIAkweDEyLCAweGZmLCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MTAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDEwICovCiAJMHgxMiwgMHhmZiwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDIwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgyMCAqLwogCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHg0OCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgzMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4NDgsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MzAgKi8KIAkweDEyLCAweGZmLCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4OTAsIDB4NjgsIDB4MDAsIDB4MzgsIDB4ODAsIDB4ODAsIC8vIDB4NDAKKwkweDAwLCAweDAwLCAweDkwLCAweDY4LCAweDAwLCAweDM4LCAweDgwLCAweDgwLCAvKiAweDQwICovCiAJMHg4MCwgMHg4MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHg0NSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDQzLAotCTB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZjEsIDB4MDMsIDB4RUYsIDB4MDMsIC8vIDB4NzAKKwkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvKiAweDcwICovCiAJMHhFOSwgMHgwMywgMHhEOSwgMHgxNSwgMHgxNSwgMHhFNCwgMHhBMywgMHg4MCwKLQkweDAwLCAweDAyLCAweDAwLCAweENDLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLyogMHg4MCAqLwogCTB4MjIsIDB4MDEsIDB4RDgsIDB4QkMsIDB4QjgsIDB4NDQsIDB4MzgsIDB4MDAsCi0JMHgwMCwgMHg3OCwgMHg0NCwgMHgzRCwgMHgxNCwgMHhBNSwgMHhFMCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8qIDB4OTAgKi8KIAkweDAwLCAweDI4LCAweDQ0LCAweDQ0LCAweEEwLCAweDkwLCAweDUyLCAweDEzLAotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUEsIDB4MUEsIDB4MUIsIDB4MUEsIC8vIDB4YTAKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFCLCAweDFBLCAvKiAweGEwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHg0NCwKLQkweDQ0LCAweDRBLCAweDAwLCAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAvLyAweGIwCisJMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLyogMHhiMCAqLwogCTB4RkYsIDB4RTcsIDB4RTksIDB4RTksIDB4RUIsIDB4RkYsIDB4RDYsIDB4RDgsCi0JMHhEOCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4RDgsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAgKi8KIAkweDAwLCAweDAwLCAweDU1LCAweDAwLCAweEU0LCAweDM5LCAweDAwLCAweDgwLAotCTB4NzcsIDB4NzcsIDB4MDMsIDB4MjAsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MzEsIC8vIDB4ZDAKKwkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvKiAweGQwICovCiAJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKLQkweDEwLCAweEMwLCAweEFBLCAweEFBLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogMHhlMCAqLwogCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4MywgMHhCNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4ODMsIDB4QjUsIDB4MDksIDB4NzgsIDB4ODUsIDB4MDAsIDB4MDEsIDB4MjAsIC8qIDB4ZjAgKi8KIAkweDY0LCAweDUxLCAweDQwLCAweGFmLCAweEZGLCAweEYwLCAweDAwLCAweEMwLAogfTsKIAogc3RhdGljIHU4IHRibF90dzI4NjVfcGFsX3RlbXBsYXRlW10gPSB7Ci0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLy8gMHgwMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8qIDB4MDAgKi8KIAkweDExLCAweGZmLCAweDAxLCAweGMzLCAweDAwLCAweDAwLCAweDAxLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8vIDB4MTAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvKiAweDEwICovCiAJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDIwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLyogMHgyMCAqLwogCTB4MTEsIDB4ZmYsIDB4MDEsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLy8gMHgzMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8qIDB4MzAgKi8KIAkweDExLCAweGZmLCAweDAxLCAweGMzLCAweDAwLCAweDAwLCAweDAxLCAweDdmLAotCTB4MDAsIDB4OTQsIDB4OTAsIDB4NDgsIDB4MDAsIDB4MzgsIDB4N0YsIDB4ODAsIC8vIDB4NDAKKwkweDAwLCAweDk0LCAweDkwLCAweDQ4LCAweDAwLCAweDM4LCAweDdGLCAweDgwLCAvKiAweDQwICovCiAJMHg4MCwgMHg4MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHg0NSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDQzLAotCTB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZjEsIDB4MDMsIDB4RUYsIDB4MDMsIC8vIDB4NzAKKwkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvKiAweDcwICovCiAJMHhFQSwgMHgwMywgMHhEOSwgMHgxNSwgMHgxNSwgMHhFNCwgMHhBMywgMHg4MCwKLQkweDAwLCAweDAyLCAweDAwLCAweENDLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLyogMHg4MCAqLwogCTB4MjIsIDB4MDEsIDB4RDgsIDB4QkMsIDB4QjgsIDB4NDQsIDB4MzgsIDB4MDAsCi0JMHgwMCwgMHg3OCwgMHg0NCwgMHgzRCwgMHgxNCwgMHhBNSwgMHhFMCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8qIDB4OTAgKi8KIAkweDAwLCAweDI4LCAweDQ0LCAweDQ0LCAweEEwLCAweDkwLCAweDUyLCAweDEzLAotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIC8vIDB4YTAKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAvKiAweGEwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHg0NCwKLQkweDQ0LCAweDRBLCAweDAwLCAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAvLyAweGIwCisJMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLyogMHhiMCAqLwogCTB4RkYsIDB4RTcsIDB4RTksIDB4RTksIDB4RTksIDB4RkYsIDB4RDcsIDB4RDgsCi0JMHhEOSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4RDksIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAgKi8KIAkweDAwLCAweDAwLCAweDU1LCAweDAwLCAweEU0LCAweDM5LCAweDAwLCAweDgwLAotCTB4NzcsIDB4NzcsIDB4MDMsIDB4MjAsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MzEsIC8vIDB4ZDAKKwkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvKiAweGQwICovCiAJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKLQkweDEwLCAweEMwLCAweEFBLCAweEFBLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogMHhlMCAqLwogCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4MywgMHhCNSwgMHgwOSwgMHgwMCwgMHhBMCwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4ODMsIDB4QjUsIDB4MDksIDB4MDAsIDB4QTAsIDB4MDAsIDB4MDEsIDB4MjAsIC8qIDB4ZjAgKi8KIAkweDY0LCAweDUxLCAweDQwLCAweGFmLCAweEZGLCAweEYwLCAweDAwLCAweEMwLAogfTsKIApAQCAtMTgxLDggKzE4MSw4IEBACiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAotLy8JcHJpbnRrKCJzb2xvNjAxMC90dzI4OiBFcnJvciB3cml0aW5nIHJlZ2lzdGVyOiAlMDJ4LT4lMDJ4IFslMDJ4XVxuIiwKLS8vCQlhZGRyLCBvZmYsIHZhbCk7CisvKglwcmludGsoInNvbG82MDEwL3R3Mjg6IEVycm9yIHdyaXRpbmcgcmVnaXN0ZXI6ICUwMngtPiUwMnggWyUwMnhdXG4iLAorCQlhZGRyLCBvZmYsIHZhbCk7ICovCiB9CiAKIHN0YXRpYyBpbnQgdHcyODY1X3NldHVwKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBkZXZfYWRkcikKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDB4ZmY7IGkrKykgewogCQkvKiBTa2lwIHJlYWQgb25seSByZWdpc3RlcnMgKi8KLQkJaWYgKGkgPj0gMHhiOCAmJiBpIDw9IDB4YzEgKQorCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGkgJiB+MHgzMCkgPT0gMHgwMCB8fAogCQkgICAgKGkgJiB+MHgzMCkgPT0gMHgwYyB8fApAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CiAJCS8qIFNraXAgcmVhZCBvbmx5IHJlZ2lzdGVycyAqLwotCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSApCisJCWlmIChpID49IDB4YjggJiYgaSA8PSAweGMxKQogCQkJY29udGludWU7CiAJCWlmICgoaSAmIH4weDMwKSA9PSAweDAwIHx8CiAJCSAgICAoaSAmIH4weDMwKSA9PSAweDBjIHx8CkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogCX07CiAKIAl1OCB0YmxfdHcyODE1X3NmcltdID0gewotCQkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDQ1LCAweGEwLCAweGQwLCAweDJmLCAvLyAweDAwCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4NDUsIDB4YTAsIDB4ZDAsIDB4MmYsIC8qIDB4MDAgKi8KIAkJMHg2NCwgMHg4MCwgMHg4MCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJMHgwMCwgMHgwZiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNiwgMHgwMCwgLy8gMHgxMAorCQkweDAwLCAweDBmLCAweDA1LCAweDAwLCAweDAwLCAweDgwLCAweDA2LCAweDAwLCAvKiAweDEwICovCiAJCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4ODgsIDB4ODgsIDB4YzAsIDB4MDAsIDB4MjAsIDB4NjQsIDB4YTgsIDB4ZWMsIC8vIDB4MjAKKwkJMHg4OCwgMHg4OCwgMHhjMCwgMHgwMCwgMHgyMCwgMHg2NCwgMHhhOCwgMHhlYywgLyogMHgyMCAqLwogCQkweDMxLCAweDc1LCAweGI5LCAweGZkLCAweDAwLCAweDAwLCAweDg4LCAweDg4LAotCQkweDg4LCAweDExLCAweDAwLCAweDg4LCAweDg4LCAweDAwLAkJLy8gMHgzMAorCQkweDg4LCAweDExLCAweDAwLCAweDg4LCAweDg4LCAweDAwLAkJLyogMHgzMCAqLwogCX07CiAJdTggKnRibF90dzI4MTVfY29tbW9uOwogCWludCBpOwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IDB4MGY7IGkrKykgewogCQkJaWYgKGkgPT0gMHgwMCkKLQkJCQljb250aW51ZTsJLy8gcmVhZC1vbmx5CisJCQkJY29udGludWU7CS8qIHJlYWQtb25seSAqLwogCQkJc29sb19pMmNfd3JpdGVieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKIAkJCQkJICAgZGV2X2FkZHIsIChjaCAqIDB4MTApICsgaSwKIAkJCQkJICAgdGJsX3R3MjgxNV9jb21tb25baV0pOwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIAorLyoKICAqIFdlIGFjY2Vzc2VkIHRoZSB2aWRlbyBzdGF0dXMgc2lnbmFsIGluIHRoZSBUZWNod2VsbCBjaGlwIHRocm91Z2gKICAqIGlpYy9pMmMgYmVjYXVzZSB0aGUgdmlkZW8gc3RhdHVzIHJlcG9ydGVkIGJ5IHJlZ2lzdGVyIFJFR19WSV9TVEFUVVMxCiAgKiAoYWRkcmVzcyAweDAxMkMpIG9mIHRoZSBTT0xPNjAxMCBjaGlwIGRvZXNuJ3QgZ2l2ZSB0aGUgY29ycmVjdCB2aWRlbwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJCXJ2YWwgPSB0d19yZWFkYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sCiAJCQkJICAgVFcyODZ4X0JSSUdIVE5FU1NfQUREUihjaCksCiAJCQkJICAgVFdfQlJJR0hUTkVTU19BRERSKGNoKSk7Ci0JCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkgCisJCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkKIAkJCSp2YWwgPSAoczMyKSgoY2hhcilydmFsKSArIDEyODsKIAkJZWxzZQogCQkJKnZhbCA9IHJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCmluZGV4IDA5N2U4MmIuLjdiYmI5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKQEAgLTQ3LDEzICs0NywxNCBAQAogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZQl2aWRxOwogCXN0cnVjdCBsaXN0X2hlYWQJdmlkcV9hY3RpdmU7CiAJc3RydWN0IHRhc2tfc3RydWN0CSprdGhyZWFkOworCXN0cnVjdCBwMm1fZGVzYwkJZGVzY1tTT0xPX05SX1AyTV9ERVNDXTsKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHZpZF92b3BfaGVhZGVyW10gPSB7CiAJMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyMCwKIAkweDAyLCAweDQ4LCAweDA1LCAweGMwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLAogCTB4MDAsIDB4NDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4OTcsIDB4NTMsIDB4MDQsCi0JMHgxZiwgMHg0YywgMHg1OCwgMHgxMCwgMHg3OCwgMHg1MSwgMHgxOCwgMHgzZSwKKwkweDFmLCAweDRjLCAweDU4LCAweDEwLCAweDc4LCAweDUxLCAweDE4LCAweDNmLAogfTsKIAogLyoKQEAgLTE1MSw2ICsxNTIsMTEgQEAKIAllbHNlCiAJCXNvbG9fZGV2LT5tb3Rpb25fbWFzayAmPSB+KDEgPDwgY2gpOwogCisJLyogRG8gdGhpcyByZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSB0dXJuaW5nIG9uIG9yIG9mZiAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZW5jLT5zb2xvX2RldiwgU09MT19WSV9NT1RfQ0xFQVIsCisJCSAgICAgICAxIDw8IHNvbG9fZW5jLT5jaCk7CisJc29sb19lbmMtPm1vdGlvbl9kZXRlY3RlZCA9IDA7CisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQURSLAogCQkgICAgICAgU09MT19WSV9NT1RJT05fRU4oc29sb19kZXYtPm1vdGlvbl9tYXNrKSB8CiAJCSAgICAgICAoU09MT19NT1RJT05fRVhUX0FERFIoc29sb19kZXYpID4+IDE2KSk7CkBAIC0xODQsNyArMTkwLDcgQEAKIAkJc29sb19lbmMtPmJ3X3dlaWdodCA8PD0gMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0FSTigxLCAibW9kZSBpcyB1bmtub3duIik7CisJCVdBUk4oMSwgIm1vZGUgaXMgdW5rbm93blxuIik7CiAJfQogfQogCkBAIC0yMTEsMTEgKzIxNyw2IEBACiAJCQlzb2xvX2Rldi0+ZW5jX2J3X3JlbWFpbiAtPSBzb2xvX2VuYy0+Yndfd2VpZ2h0OwogCX0KIAotCWZoLT5rdGhyZWFkID0ga3RocmVhZF9ydW4oc29sb19lbmNfdGhyZWFkLCBmaCwgU09MTzYwMTBfTkFNRSAiX2VuYyIpOwotCi0JaWYgKElTX0VSUihmaC0+a3RocmVhZCkpCi0JCXJldHVybiBQVFJfRVJSKGZoLT5rdGhyZWFkKTsKLQogCWZoLT5lbmNfb24gPSAxOwogCWZoLT5yZF9pZHggPSBzb2xvX2VuYy0+c29sb19kZXYtPmVuY193cl9pZHg7CiAKQEAgLTI3OSw2ICsyODAsMjQgQEAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19DQVBfQ0hfQ09NUF9FTkFfRShzb2xvX2VuYy0+Y2gpLCAwKTsKIH0KIAorc3RhdGljIGludCBzb2xvX3N0YXJ0X2ZoX3RocmVhZChzdHJ1Y3Qgc29sb19lbmNfZmggKmZoKQoreworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKworCWZoLT5rdGhyZWFkID0ga3RocmVhZF9ydW4oc29sb19lbmNfdGhyZWFkLCBmaCwgU09MTzYwMTBfTkFNRSAiX2VuYyIpOworCisJLyogT29wcywgd2UgaGFkIGEgcHJvYmxlbSAqLworCWlmIChJU19FUlIoZmgtPmt0aHJlYWQpKSB7CisJCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOworCQlzb2xvX2VuY19vZmYoZmgpOworCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJCXJldHVybiBQVFJfRVJSKGZoLT5rdGhyZWFkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgZW5jX3Jlc2V0X2dvcChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gpCiB7CiAJQlVHX09OKGNoID49IHNvbG9fZGV2LT5ucl9jaGFucyk7CkBAIC0yOTksMjIgKzMxOCw2OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY19nZXRfbXBlZ19kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgZG1hX2FkZHJfdCBidWYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIGVuY193cml0ZV9zZyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXU4ICpzcmMgPSBidWY7CisKKwlmb3IgKHNnID0gc2dsaXN0OyBzZyAmJiBzaXplID4gMDsgc2cgPSBzZ19uZXh0KHNnKSkgeworCQl1OCAqcCA9IHNnX3ZpcnQoc2cpOworCQlzaXplX3QgbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgc2l6ZTsgaSsrKQorCQkJcFtpXSA9ICooc3JjKyspOworCX0KK30KKworc3RhdGljIGludCBlbmNfZ2V0X21wZWdfZG1hX3NnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHNraXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IHJldDsKIAogCWlmIChvZmYgPiBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpCisJaWYgKG9mZiArIHNpemUgPD0gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSkgeworCQlyZXR1cm4gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwKKwkJCQkgICAgICAgZGVzYywgMCwgc2dsaXN0LCBza2lwLAorCQkJCSAgICAgICBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmLCBzaXplKTsKKwl9CisKKwkvKiBCdWZmZXIgd3JhcCAqLworCXJldCA9IHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX01QNEUsIGRlc2MsIDAsCisJCQkgICAgICBzZ2xpc3QsIHNraXAsIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCisJCQkgICAgICBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmKTsKKworCXJldCB8PSBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCBkZXNjLCAwLAorCQkJICAgICAgIHNnbGlzdCwgc2tpcCArIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCisJCQkgICAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSwKKwkJCSAgICAgICBzaXplICsgb2ZmIC0gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuY19nZXRfbXBlZ19kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwKKwkJCSAgICAgIGRtYV9hZGRyX3QgYnVmLCB1bnNpZ25lZCBpbnQgb2ZmLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHJldDsKKworCWlmIChvZmYgPiBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpIHsKIAkJcmV0dXJuIHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgMCwgYnVmLAogCQkJCSAgICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCX0KIAogCS8qIEJ1ZmZlciB3cmFwICovCiAJcmV0ID0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLCBidWYsCi0JCQkgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKLQkJCSAgICBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmKTsKKwkJCSAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKKwkJCSAgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CiAKIAlyZXQgfD0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLAogCQkJICAgICAgYnVmICsgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZiwKQEAgLTMzNyw3MCArNDAyLDEwOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZW5jX2dldF9qcGVnX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgZG1hX2FkZHJfdCBidWYsCi0JCQkgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW50IGVuY19nZXRfanBlZ19kbWFfc2coc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsCisJCQkgICAgICAgc3RydWN0IHAybV9kZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgc2tpcCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKG9mZiA+IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG9mZiArIHNpemUgPD0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSkKLQkJcmV0dXJuIHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgMCwgYnVmLAotCQkJCSAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpIHsKKwkJcmV0dXJuIHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsCisJCQkJICAgICAgIGRlc2MsIDAsIHNnbGlzdCwgc2tpcCwKKwkJCQkgICAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwgc2l6ZSk7CisJfQogCiAJLyogQnVmZmVyIHdyYXAgKi8KLQlyZXQgPSBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIDAsIGJ1ZiwKLQkJCSAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKLQkJCSAgICAgU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisJcmV0ID0gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgZGVzYywgMCwKKwkJCSAgICAgIHNnbGlzdCwgc2tpcCwgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKKwkJCSAgICAgIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYpOwogCi0JcmV0IHw9IHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgMCwKLQkJCSAgICAgIGJ1ZiArIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCi0JCQkgICAgICBTT0xPX0pQRUdfRVhUX0FERFIoc29sb19kZXYpLAotCQkJICAgICAgc2l6ZSArIG9mZiAtIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpOworCXJldCB8PSBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9KUEVHLCBkZXNjLCAwLAorCQkJICAgICAgIHNnbGlzdCwgc2tpcCArIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCisJCQkgICAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSwKKwkJCSAgICAgICBzaXplICsgb2ZmIC0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNvbG9fZmlsbF9qcGVnKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsIHN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYsCi0JCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBkbWFfYWRkcl90IHZidWYpCisvKiBSZXR1cm5zIHRydWUgb2YgX19jaGsgaXMgd2l0aGluIHRoZSBmaXJzdCBfX3JhbmdlIGJ5dGVzIG9mIF9fb2ZmICovCisjZGVmaW5lIE9GRl9JTl9SQU5HRShfX29mZiwgX19yYW5nZSwgX19jaGspIFwKKwkoKF9fb2ZmIDw9IF9fY2hrKSAmJiAoKF9fb2ZmICsgX19yYW5nZSkgPj0gX19jaGspKQorCitzdGF0aWMgdm9pZCBzb2xvX2pwZWdfaGVhZGVyKHN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jLAorCQkJICAgICBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmKQogewotCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKLQlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKLQl1OCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdm9pZCAqc3JjID0ganBlZ19oZWFkZXI7CisJc2l6ZV90IGNvcGllZCA9IDA7CisJc2l6ZV90IHRvX2NvcHkgPSBzaXplb2YoanBlZ19oZWFkZXIpOwogCi0JbWVtY3B5KHAsIGpwZWdfaGVhZGVyLCBzaXplb2YoanBlZ19oZWFkZXIpKTsKLQlwW1NPRjBfU1RBUlQgKyA1XSA9IDB4ZmYgJiAoc29sb19lbmMtPmhlaWdodCA+PiA4KTsKLQlwW1NPRjBfU1RBUlQgKyA2XSA9IDB4ZmYgJiBzb2xvX2VuYy0+aGVpZ2h0OwotCXBbU09GMF9TVEFSVCArIDddID0gMHhmZiAmIChzb2xvX2VuYy0+d2lkdGggPj4gOCk7Ci0JcFtTT0YwX1NUQVJUICsgOF0gPSAweGZmICYgc29sb19lbmMtPndpZHRoOworCWZvciAoc2cgPSB2YnVmLT5zZ2xpc3Q7IHNnICYmIGNvcGllZCA8IHRvX2NvcHk7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJc2l6ZV90IHRoaXNfY29weSA9IG1pbihzZ19kbWFfbGVuKHNnKSwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludCkodG9fY29weSAtIGNvcGllZCkpOworCQl1OCAqcCA9IHNnX3ZpcnQoc2cpOwogCi0JdmJ1ZiArPSBzaXplb2YoanBlZ19oZWFkZXIpOwotCXZiLT5zaXplID0gZW5jX2J1Zi0+anBlZ19zaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKTsKKwkJbWVtY3B5KHAsIHNyYyArIGNvcGllZCwgdGhpc19jb3B5KTsKIAotCXJldHVybiBlbmNfZ2V0X2pwZWdfZG1hKHNvbG9fZGV2LCB2YnVmLCBlbmNfYnVmLT5qcGVnX29mZiwKLQkJCQllbmNfYnVmLT5qcGVnX3NpemUpOworCQlpZiAoT0ZGX0lOX1JBTkdFKGNvcGllZCwgdGhpc19jb3B5LCBTT0YwX1NUQVJUICsgNSkpCisJCQlwWyhTT0YwX1NUQVJUICsgNSkgLSBjb3BpZWRdID0KKwkJCQkweGZmICYgKHNvbG9fZW5jLT5oZWlnaHQgPj4gOCk7CisJCWlmIChPRkZfSU5fUkFOR0UoY29waWVkLCB0aGlzX2NvcHksIFNPRjBfU1RBUlQgKyA2KSkKKwkJCXBbKFNPRjBfU1RBUlQgKyA2KSAtIGNvcGllZF0gPSAweGZmICYgc29sb19lbmMtPmhlaWdodDsKKwkJaWYgKE9GRl9JTl9SQU5HRShjb3BpZWQsIHRoaXNfY29weSwgU09GMF9TVEFSVCArIDcpKQorCQkJcFsoU09GMF9TVEFSVCArIDcpIC0gY29waWVkXSA9CisJCQkJMHhmZiAmIChzb2xvX2VuYy0+d2lkdGggPj4gOCk7CisJCWlmIChPRkZfSU5fUkFOR0UoY29waWVkLCB0aGlzX2NvcHksIFNPRjBfU1RBUlQgKyA4KSkKKwkJCXBbKFNPRjBfU1RBUlQgKyA4KSAtIGNvcGllZF0gPSAweGZmICYgc29sb19lbmMtPndpZHRoOworCisJCWNvcGllZCArPSB0aGlzX2NvcHk7CisJfQorfQorCitzdGF0aWMgaW50IHNvbG9fZmlsbF9qcGVnKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsIHN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYsCisJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJICBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPmVuYy0+c29sb19kZXY7CisJaW50IHNpemUgPSBlbmNfYnVmLT5qcGVnX3NpemU7CisKKwkvKiBDb3B5IHRoZSBoZWFkZXIgZmlyc3QgKGRpcmVjdCB3cml0ZSkgKi8KKwlzb2xvX2pwZWdfaGVhZGVyKGZoLT5lbmMsIHZidWYpOworCisJdmItPnNpemUgPSBzaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKTsKKworCS8qIEdyYWIgdGhlIGpwZWcgZnJhbWUgKi8KKwlyZXR1cm4gZW5jX2dldF9qcGVnX2RtYV9zZyhzb2xvX2RldiwgZmgtPmRlc2MsIHZidWYtPnNnbGlzdCwKKwkJCQkgICBzaXplb2YoanBlZ19oZWFkZXIpLAorCQkJCSAgIGVuY19idWYtPmpwZWdfb2ZmLCBzaXplKTsKIH0KIAogc3RhdGljIGludCBzb2xvX2ZpbGxfbXBlZyhzdHJ1Y3Qgc29sb19lbmNfZmggKmZoLCBzdHJ1Y3Qgc29sb19lbmNfYnVmICplbmNfYnVmLAotCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwgZG1hX2FkZHJfdCB2YnVmKQorCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqdmJ1ZikKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CiAJc3RydWN0IHZvcF9oZWFkZXIgdmg7CiAJaW50IHJldDsKIAlpbnQgZnJhbWVfc2l6ZSwgZnJhbWVfb2ZmOworCWludCBza2lwID0gMDsKIAogCWlmIChXQVJOX09OX09OQ0UoZW5jX2J1Zi0+c2l6ZSA8PSBzaXplb2YodmgpKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEZpcnN0IGdldCB0aGUgaGFyZHdhcmUgdm9wIGhlYWRlciAobm90IHJlYWwgbXBlZykgKi8KIAlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hKHNvbG9fZGV2LCAmdmgsIGVuY19idWYtPm9mZiwgc2l6ZW9mKHZoKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC0xOworCWlmIChXQVJOX09OX09OQ0UocmV0KSkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChXQVJOX09OX09OQ0Uodmguc2l6ZSA+IGVuY19idWYtPnNpemUpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCiAJdmItPndpZHRoID0gdmguaHNpemUgPDwgNDsKIAl2Yi0+aGVpZ2h0ID0gdmgudnNpemUgPDwgNDsKQEAgLTQxMCw5ICs1MTMsOSBAQAogCWlmICghZW5jX2J1Zi0+dm9wKSB7CiAJCXUxNiBmcHMgPSBzb2xvX2Rldi0+ZnBzICogMTAwMDsKIAkJdTE2IGludGVydmFsID0gc29sb19lbmMtPmludGVydmFsICogMTAwMDsKLQkJdTggKnAgPSB2aWRlb2J1Zl9xdWV1ZV90b192YWRkcigmZmgtPnZpZHEsIHZiKTsKKwkJdTggcFtzaXplb2YodmlkX3ZvcF9oZWFkZXIpXTsKIAotCQltZW1jcHkocCwgdmlkX3ZvcF9oZWFkZXIsIHNpemVvZih2aWRfdm9wX2hlYWRlcikpOworCQltZW1jcHkocCwgdmlkX3ZvcF9oZWFkZXIsIHNpemVvZihwKSk7CiAKIAkJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlID09IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykKIAkJCXBbMTBdIHw9ICgoWFZJRF9QQVJfNDNfTlRTQyA8PCAzKSAmIDB4NzgpOwpAQCAtNDM0LDQzICs1MzcsNDkgQEAKIAkJaWYgKHZoLmludGVybGFjZSkKIAkJCXBbMjldIHw9IDB4MjA7CiAKKwkJZW5jX3dyaXRlX3NnKHZidWYtPnNnbGlzdCwgcCwgc2l6ZW9mKHApKTsKKwogCQkvKiBBZGp1c3QgdGhlIGRtYSBidWZmZXIgcGFzdCB0aGlzIGhlYWRlciAqLwogCQl2Yi0+c2l6ZSArPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOwotCQl2YnVmICs9IHNpemVvZih2aWRfdm9wX2hlYWRlcik7CisJCXNraXAgPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOwogCX0KIAogCS8qIE5vdyBnZXQgdGhlIGFjdHVhbCBtcGVnIHBheWxvYWQgKi8KIAlmcmFtZV9vZmYgPSAoZW5jX2J1Zi0+b2ZmICsgc2l6ZW9mKHZoKSkgJSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpOwogCWZyYW1lX3NpemUgPSBlbmNfYnVmLT5zaXplIC0gc2l6ZW9mKHZoKTsKLQlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hX3Qoc29sb19kZXYsIHZidWYsIGZyYW1lX29mZiwgZnJhbWVfc2l6ZSk7Ci0JaWYgKFdBUk5fT05fT05DRShyZXQpKQotCQlyZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKwlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hX3NnKHNvbG9fZGV2LCBmaC0+ZGVzYywgdmJ1Zi0+c2dsaXN0LAorCQkJCSAgc2tpcCwgZnJhbWVfb2ZmLCBmcmFtZV9zaXplKTsKKwlXQVJOX09OX09OQ0UocmV0KTsKKworCXJldHVybiByZXQ7CiB9CiAKLS8qIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuICgwKSwgbGVhdmVzIHNvbG9fZW5jLT5sb2NrIHVubG9ja2VkICovCi1zdGF0aWMgaW50IHNvbG9fZW5jX2ZpbGxidWYoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwKK3N0YXRpYyB2b2lkIHNvbG9fZW5jX2ZpbGxidWYoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwKIAkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CiAJc3RydWN0IHNvbG9fZW5jX2J1ZiAqZW5jX2J1ZiA9IE5VTEw7Ci0JZG1hX2FkZHJfdCB2YnVmOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKnZidWY7CiAJaW50IHJldDsKKwlpbnQgZXJyb3IgPSAxOwogCXUxNiBpZHggPSBmaC0+cmRfaWR4OwogCiAJd2hpbGUgKGlkeCAhPSBzb2xvX2Rldi0+ZW5jX3dyX2lkeCkgewogCQlzdHJ1Y3Qgc29sb19lbmNfYnVmICplYnVmID0gJnNvbG9fZGV2LT5lbmNfYnVmW2lkeF07CisKIAkJaWR4ID0gKGlkeCArIDEpICUgU09MT19OUl9SSU5HX0JVRlM7CisKKwkJaWYgKGVidWYtPmNoICE9IHNvbG9fZW5jLT5jaCkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHKSB7Ci0JCQlpZiAoZmgtPnR5cGUgIT0gZWJ1Zi0+dHlwZSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChlYnVmLT5jaCA9PSBzb2xvX2VuYy0+Y2gpIHsKKwkJCWlmIChmaC0+dHlwZSA9PSBlYnVmLT50eXBlKSB7CiAJCQkJZW5jX2J1ZiA9IGVidWY7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoZWJ1Zi0+Y2ggPT0gc29sb19lbmMtPmNoKSB7CisJCX0gZWxzZSB7CiAJCQkvKiBGb3IgbWpwZWcsIGtlZXAgcmVhZGluZyB0byB0aGUgbmV3ZXN0IGZyYW1lICovCiAJCQllbmNfYnVmID0gZWJ1ZjsKIAkJfQpAQCAtNDc4LDQ4ICs1ODcsNTUgQEAKIAogCWZoLT5yZF9pZHggPSBpZHg7CiAKLQlpZiAoIWVuY19idWYpCi0JCXJldHVybiAtMTsKKwlpZiAoV0FSTl9PTl9PTkNFKCFlbmNfYnVmKSkKKwkJZ290byBidWZfZXJyOwogCiAJaWYgKChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHICYmCiAJICAgICB2Yi0+YnNpemUgPCBlbmNfYnVmLT5zaXplKSB8fAogCSAgICAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTUpQRUcgJiYKIAkgICAgIHZiLT5ic2l6ZSA8IChlbmNfYnVmLT5qcGVnX3NpemUgKyBzaXplb2YoanBlZ19oZWFkZXIpKSkpIHsKLQkJcmV0dXJuIC0xOworCQlXQVJOX09OX09OQ0UoMSk7CisJCWdvdG8gYnVmX2VycjsKIAl9CiAKLQlpZiAoISh2YnVmID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YikpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBJcyBpdCBvayB0aGF0IHdlIG1lc3Mgd2l0aCB0aGlzIGJ1ZmZlciBvdXQgb2YgbG9jaz8gKi8KLQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCXZidWYgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCWlmIChXQVJOX09OX09OQ0UoIXZidWYpKQorCQlnb3RvIGJ1Zl9lcnI7CiAKIAlpZiAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRykKIAkJcmV0ID0gc29sb19maWxsX21wZWcoZmgsIGVuY19idWYsIHZiLCB2YnVmKTsKIAllbHNlCiAJCXJldCA9IHNvbG9fZmlsbF9qcGVnKGZoLCBlbmNfYnVmLCB2YiwgdmJ1Zik7CiAKLQlpZiAocmV0KSAvLyBJZ25vcmUgZmFpbHVyZXMKLQkJcmV0dXJuIDA7CisJaWYgKCFyZXQpCisJCWVycm9yID0gMDsKIAotCWxpc3RfZGVsKCZ2Yi0+cXVldWUpOwotCXZiLT5maWVsZF9jb3VudCsrOwotCXZiLT50cyA9IGVuY19idWYtPnRzOwotCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CitidWZfZXJyOgorCWlmIChlcnJvcikgeworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9FUlJPUjsKKwl9IGVsc2UgeworCQl2Yi0+ZmllbGRfY291bnQrKzsKKwkJdmItPnRzID0gZW5jX2J1Zi0+dHM7CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJfQogCiAJd2FrZV91cCgmdmItPmRvbmUpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBzb2xvX2VuY190aHJlYWRfdHJ5KHN0cnVjdCBzb2xvX2VuY19maCAqZmgpCiB7CiAJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwogCiAJZm9yICg7OykgewogCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAorCQlpZiAoZmgtPnJkX2lkeCA9PSBzb2xvX2Rldi0+ZW5jX3dyX2lkeCkKKwkJCWJyZWFrOworCiAJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcV9hY3RpdmUpKQogCQkJYnJlYWs7CiAKQEAgLTUyOSw5ICs2NDUsMTEgQEAKIAkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ2Yi0+ZG9uZSkpCiAJCQlicmVhazsKIAotCQkvKiBPbiBzdWNjZXNzLCByZXR1cm5zIHdpdGggc29sb19lbmMtPmxvY2sgdW5sb2NrZWQgKi8KLQkJaWYgKHNvbG9fZW5jX2ZpbGxidWYoZmgsIHZiKSkKLQkJCWJyZWFrOworCQlsaXN0X2RlbCgmdmItPnF1ZXVlKTsKKworCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJCXNvbG9fZW5jX2ZpbGxidWYoZmgsIHZiKTsKIAl9CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnNvbG9fZW5jLT5sb2NrKTsKQEAgLTU1Nyw3ICs2NzUsNyBAQAogCiAJcmVtb3ZlX3dhaXRfcXVldWUoJnNvbG9fZW5jLT50aHJlYWRfd2FpdCwgJndhaXQpOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiB2b2lkIHNvbG9fbW90aW9uX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKQEAgLTYxNCw3ICs3MzIsOCBAQAogCQlqcGVnX25leHQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LAogCQkJCQlTT0xPX1ZFX0pQRUdfUVVFKHNvbG9fZGV2LT5lbmNfaWR4KSk7CiAKLQkJaWYgKChjaCA9IChtcGVnX2N1cnJlbnQgPj4gMjQpICYgMHgxZikgPj0gU09MT19NQVhfQ0hBTk5FTFMpIHsKKwkJY2ggPSAobXBlZ19jdXJyZW50ID4+IDI0KSAmIDB4MWY7CisJCWlmIChjaCA+PSBTT0xPX01BWF9DSEFOTkVMUykgewogCQkJY2ggLT0gU09MT19NQVhfQ0hBTk5FTFM7CiAJCQllbmNfdHlwZSA9IFNPTE9fRU5DX1RZUEVfRVhUOwogCQl9IGVsc2UKQEAgLTY2OSwxMiArNzg4LDEyIEBACiBzdGF0aWMgaW50IHNvbG9fZW5jX2J1Zl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmNvdW50LAogCQkJICAgICAgdW5zaWduZWQgaW50ICpzaXplKQogewotICAgICAgICAqc2l6ZSA9IEZSQU1FX0JVRl9TSVpFOworCSpzaXplID0gRlJBTUVfQlVGX1NJWkU7CiAKLSAgICAgICAgaWYgKCpjb3VudCA8IE1JTl9WSURfQlVGRkVSUykKKwlpZiAoKmNvdW50IDwgTUlOX1ZJRF9CVUZGRVJTKQogCQkqY291bnQgPSBNSU5fVklEX0JVRkZFUlM7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19lbmNfYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTY5Niw3ICs4MTUsOSBAQAogCWlmICh2Yi0+c3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgewogCQlpbnQgcmMgPSB2aWRlb2J1Zl9pb2xvY2sodnEsIHZiLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCQkJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJCQl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCQkJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtNzE5LDcgKzg0MCwxMCBAQAogc3RhdGljIHZvaWQgc29sb19lbmNfYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKIAkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7Ci0JdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKworCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOworCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KIApAQCAtNzUwLDI1ICs4NzQsMjIgQEAKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHNvbG9fZW5jX2ZoICpmaDsKIAotCWlmICgoZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChmaCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOwotCiAJZmgtPmVuYyA9IHNvbG9fZW5jOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCUlOSVRfTElTVF9IRUFEKCZmaC0+dmlkcV9hY3RpdmUpOwogCWZoLT5mbXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKIAlmaC0+dHlwZSA9IFNPTE9fRU5DX1RZUEVfU1REOwogCi0JdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KCZmaC0+dmlkcSwgJnNvbG9fZW5jX3ZpZGVvX3FvcHMsCi0JCQkJICAgICZzb2xvX2VuYy0+c29sb19kZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgJnNvbG9fZW5jLT5sb2NrLAotCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIpLCBmaCwgTlVMTCk7Ci0KLQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmc29sb19lbmNfdmlkZW9fcW9wcywKKwkJCSAgICAgICAmc29sb19lbmMtPnNvbG9fZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgICAgJnNvbG9fZW5jLT5sb2NrLAorCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIpLCBmaCwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc4NSw3ICs5MDYsMTEgQEAKIAogCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAkJcmV0ID0gc29sb19lbmNfb24oZmgpOwotCSAgICAgICAgc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc29sb19zdGFydF9maF90aHJlYWQoZmgpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC03OTcsMTAgKzkyMiwxNSBAQAogc3RhdGljIGludCBzb2xvX2VuY19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOwogCiAJdmlkZW9idWZfc3RvcCgmZmgtPnZpZHEpOwogCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCisJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAJc29sb19lbmNfb2ZmKGZoKTsKKwlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCiAJa2ZyZWUoZmgpOwogCiAJcmV0dXJuIDA7CkBAIC04NDIsNyArOTcyLDcgQEAKIAlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQogCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwogCWVsc2UKLQkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfUEFMX0I7CiAKIAlpZiAoIXR3MjhfZ2V0X3ZpZGVvX3N0YXR1cyhzb2xvX2Rldiwgc29sb19lbmMtPmNoKSkKIAkJaW5wdXQtPnN0YXR1cyA9IFY0TDJfSU5fU1RfTk9fU0lHTkFMOwpAQCAtOTE1LDkgKzEwNDUsOCBAQAogCiAJaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCiAJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpIHsKKwllbHNlIGlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfSU5URVJMQUNFRCkKIAkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQl9CiAKIAkvKiBKdXN0IHNldCB0aGVzZSAqLwogCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CkBAIC05MzcsNyArMTA2Niw4IEBACiAKIAlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAotCWlmICgocmV0ID0gc29sb19lbmNfdHJ5X2ZtdF9jYXAoZmlsZSwgcHJpdiwgZikpKSB7CisJcmV0ID0gc29sb19lbmNfdHJ5X2ZtdF9jYXAoZmlsZSwgcHJpdiwgZik7CisJaWYgKHJldCkgewogCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTk1Niw3ICsxMDg2LDEwIEBACiAKIAlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOwogCi0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNvbG9fc3RhcnRfZmhfdGhyZWFkKGZoKTsKIH0KIAogc3RhdGljIGludCBzb2xvX2VuY19nZXRfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTk3Nyw3ICsxMTEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb2xvX2VuY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCAKK3N0YXRpYyBpbnQgc29sb19lbmNfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQogewogCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OwpAQCAtMTAxNCw2ICsxMTQ3LDEwIEBACiAJCXNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNvbG9fc3RhcnRfZmhfdGhyZWFkKGZoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gdmlkZW9idWZfZHFidWYoJmZoLT52aWRxLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKQEAgLTEwMzMsMTIgKzExNzAsMTYgQEAKIAogCS8qIENoZWNrIGZvciBrZXkgZnJhbWUgb24gbXBlZyBkYXRhICovCiAJaWYgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01QRUcpIHsKLQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIgPSBmaC0+dmlkcS5idWZzW2J1Zi0+aW5kZXhdOwotCQl1OCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOwotCQlpZiAocFszXSA9PSAweDAwKQotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOwotCQllbHNlCi0JCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmID0KKwkJCQl2aWRlb2J1Zl90b19kbWEoZmgtPnZpZHEuYnVmc1tidWYtPmluZGV4XSk7CisKKwkJaWYgKHZidWYpIHsKKwkJCXU4ICpwID0gc2dfdmlydCh2YnVmLT5zZ2xpc3QpOworCQkJaWYgKHBbM10gPT0gMHgwMCkKKwkJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCQllbHNlCisJCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BGUkFNRTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMTEzNiw3ICsxMjc3LDcgQEAKIAkvKiBYWFg6IFNob3VsZG4ndCB3ZSBiZSBhYmxlIHRvIGdldC9zZXQgdGhpcyBmcm9tIHZpZGVvYnVmPyAqLwogCWNwLT5yZWFkYnVmZmVycyA9IDI7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMTc2LDcgKzEzMTcsNyBAQAogCiAJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2xvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEyNDAsNyArMTM4MSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBzb2xvX3F1ZXJ5bWVudShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEyNTAsNyArMTM5MSw4IEBACiAJaW50IGVycjsKIAogCXFjdHJsLmlkID0gcW1lbnUtPmlkOwotCWlmICgoZXJyID0gc29sb19xdWVyeWN0cmwoZmlsZSwgcHJpdiwgJnFjdHJsKSkpCisJZXJyID0gc29sb19xdWVyeWN0cmwoZmlsZSwgcHJpdiwgJnFjdHJsKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51KHFtZW51LCAmcWN0cmwsIE5VTEwpOwpAQCAtMTM1MCw5ICsxNDkyLDkgQEAKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX1JEU19UWF9SQURJT19URVhUOgogCQkJaWYgKGN0cmwtPnNpemUgLSAxID4gT1NEX1RFWFRfTUFYKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRVJBTkdFOworCQkJCWVyciA9IC1FUkFOR0U7CiAJCQllbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAllcnIgPSBjb3B5X2Zyb21fdXNlcihzb2xvX2VuYy0+b3NkX3RleHQsCisJCQkJZXJyID0gY29weV9mcm9tX3VzZXIoc29sb19lbmMtPm9zZF90ZXh0LAogCQkJCQkJICAgICBjdHJsLT5zdHJpbmcsCiAJCQkJCQkgICAgIE9TRF9URVhUX01BWCk7CiAJCQkJc29sb19lbmMtPm9zZF90ZXh0W09TRF9URVhUX01BWF0gPSAnXDAnOwpAQCAtMTQ1OSw3ICsxNjAxLDcgQEAKIAkubWlub3IJCQk9IC0xLAogCS5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAogCi0JLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00sCisJLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX0IsCiAJLmN1cnJlbnRfbm9ybQkJPSBWNEwyX1NURF9OVFNDX00sCiB9OwogCkBAIC0xNTA1LDcgKzE2NDcsNyBAQAogCWF0b21pY19zZXQoJnNvbG9fZW5jLT5yZWFkZXJzLCAwKTsKIAogCXNvbG9fZW5jLT5xcCA9IFNPTE9fREVGQVVMVF9RUDsKLSAgICAgICAgc29sb19lbmMtPmdvcCA9IHNvbG9fZGV2LT5mcHM7CisJc29sb19lbmMtPmdvcCA9IHNvbG9fZGV2LT5mcHM7CiAJc29sb19lbmMtPmludGVydmFsID0gMTsKIAlzb2xvX2VuYy0+bW9kZSA9IFNPTE9fRU5DX01PREVfQ0lGOwogCXNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoID0gU09MT19ERUZfTU9UX1RIUkVTSDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi5jCmluZGV4IDZmZmQyMWQuLmE4NDkxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDIuYwpAQCAtMjQsMTQgKzI0LDEzIEBACiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKIAogI2RlZmluZSBTT0xPX0hXX0JQTAkJMjA0OAogI2RlZmluZSBTT0xPX0RJU1BfUElYX0ZJRUxECVY0TDJfRklFTERfSU5URVJMQUNFRAotI2RlZmluZSBTT0xPX0RJU1BfQlVGX1NJWkUJKDY0ICogMTAyNCkgLy8gNjRrCiAKIC8qIEltYWdlIHNpemUgaXMgdHdvIGZpZWxkcywgU09MT19IV19CUEwgaXMgb25lIGhvcml6b250YWwgbGluZSAqLwogI2RlZmluZSBzb2xvX3ZsaW5lcyhfX3NvbG8pCShfX3NvbG8tPnZpZGVvX3ZzaXplICogMikKQEAgLTQ5LDYgKzQ4LDggQEAKIAlzcGlubG9ja190CQlzbG9jazsKIAlpbnQJCQlvbGRfd3JpdGU7CiAJc3RydWN0IGxpc3RfaGVhZAl2aWRxX2FjdGl2ZTsKKwlzdHJ1Y3QgcDJtX2Rlc2MJCWRlc2NbU09MT19OUl9QMk1fREVTQ107CisJaW50CQkJZGVzY19pZHg7CiB9OwogCiB1bnNpZ25lZCB2aWRlb19uciA9IC0xOwpAQCAtOTYsNyArOTcsNyBAQAogCQkgICAgICAgU09MT19WSV9XSU5fRVgoZXgpIHwKIAkJICAgICAgIFNPTE9fVklfV0lOX1NDQUxFKHNjYWxlKSk7CiAKLSAgICAgICAgc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfV0lOX0NUUkwxKGNoKSwKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9XSU5fQ1RSTDEoY2gpLAogCQkgICAgICAgU09MT19WSV9XSU5fU1koc3kpIHwKIAkJICAgICAgIFNPTE9fVklfV0lOX0VZKGV5KSk7CiB9CkBAIC0yMDMsNTAgKzIwNCwxNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZGlzcF9yZXNldF9kZXNjKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoKQoreworCS8qIFdlIHVzZSBkZXNjIG1vZGUsIHdoaWNoIGlnbm9yZXMgZGVzYyAwICovCisJbWVtc2V0KGZoLT5kZXNjLCAwLCBzaXplb2YoKmZoLT5kZXNjKSk7CisJZmgtPmRlc2NfaWR4ID0gMTsKK30KKworc3RhdGljIGludCBkaXNwX2ZsdXNoX2Rlc2NzKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoKQoreworCWludCByZXQ7CisKKwlpZiAoIWZoLT5kZXNjX2lkeCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBzb2xvX3AybV9kbWFfZGVzYyhmaC0+c29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9ESVNQLAorCQkJCWZoLT5kZXNjLCBmaC0+ZGVzY19pZHgpOworCWRpc3BfcmVzZXRfZGVzYyhmaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRpc3BfcHVzaF9kZXNjKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkgICAgICB1MzIgZXh0X2FkZHIsIGludCBzaXplLCBpbnQgcmVwZWF0LCBpbnQgZXh0X3NpemUpCit7CisJaWYgKGZoLT5kZXNjX2lkeCA+PSBTT0xPX05SX1AyTV9ERVNDKSB7CisJCWludCByZXQgPSBkaXNwX2ZsdXNoX2Rlc2NzKGZoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc29sb19wMm1fcHVzaF9kZXNjKCZmaC0+ZGVzY1tmaC0+ZGVzY19pZHhdLCAwLCBkbWFfYWRkciwgZXh0X2FkZHIsCisJCQkgICBzaXplLCByZXBlYXQsIGV4dF9zaXplKTsKKwlmaC0+ZGVzY19pZHgrKzsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzb2xvX2ZpbGxidWYoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgsCiAJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7Ci0JZG1hX2FkZHJfdCB2YnVmOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKnZidWY7CiAJdW5zaWduZWQgaW50IGZkbWFfYWRkcjsKLQlpbnQgZnJhbWVfc2l6ZTsKIAlpbnQgZXJyb3IgPSAxOwogCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJZG1hX2FkZHJfdCBzZ19kbWE7CisJaW50IHNnX3NpemVfbGVmdDsKIAotCWlmICghKHZidWYgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKSkpCisJdmJ1ZiA9IHZpZGVvYnVmX3RvX2RtYSh2Yik7CisJaWYgKCF2YnVmKQogCQlnb3RvIGZpbmlzaF9idWY7CiAKIAlpZiAoZXJhc2Vfb2ZmKHNvbG9fZGV2KSkgewotCQl2b2lkICpwID0gdmlkZW9idWZfcXVldWVfdG9fdmFkZHIoJmZoLT52aWRxLCB2Yik7Ci0JCWludCBpbWFnZV9zaXplID0gc29sb19pbWFnZV9zaXplKHNvbG9fZGV2KTsKLQkJZm9yIChpID0gMDsgaSA8IGltYWdlX3NpemU7IGkgKz0gMikgewotCQkJKCh1OCAqKXApW2ldID0gMHg4MDsKLQkJCSgodTggKilwKVtpICsgMV0gPSAweDAwOworCQlpbnQgaTsKKworCQkvKiBKdXN0IGJsaXQgdG8gdGhlIGVudGlyZSBzZyBsaXN0LCBpZ25vcmluZyBzaXplICovCisJCWZvcl9lYWNoX3NnKHZidWYtPnNnbGlzdCwgc2csIHZidWYtPnNnbGVuLCBpKSB7CisJCQl2b2lkICpwID0gc2dfdmlydChzZyk7CisJCQlzaXplX3QgbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworCQkJCSgodTggKilwKVtpXSA9IDB4ODA7CisJCQkJKCh1OCAqKXApW2kgKyAxXSA9IDB4MDA7CisJCQl9CiAJCX0KKwogCQllcnJvciA9IDA7CiAJCWdvdG8gZmluaXNoX2J1ZjsKIAl9CiAKLQlmcmFtZV9zaXplID0gU09MT19IV19CUEwgKiBzb2xvX3ZsaW5lcyhzb2xvX2Rldik7Ci0JZmRtYV9hZGRyID0gU09MT19ESVNQX0VYVF9BRERSKHNvbG9fZGV2KSArIChmaC0+b2xkX3dyaXRlICogZnJhbWVfc2l6ZSk7CisJZGlzcF9yZXNldF9kZXNjKGZoKTsKKwlzZyA9IHZidWYtPnNnbGlzdDsKKwlzZ19kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJc2dfc2l6ZV9sZWZ0ID0gc2dfZG1hX2xlbihzZyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZnJhbWVfc2l6ZSAvIFNPTE9fRElTUF9CVUZfU0laRTsgaSsrKSB7Ci0JCWludCBqOwotCQlmb3IgKGogPSAwOyBqIDwgKFNPTE9fRElTUF9CVUZfU0laRSAvIFNPTE9fSFdfQlBMKTsgaisrKSB7Ci0JCQlpZiAoc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9ESVNQLCAwLAotCQkJCQkgICB2YnVmLCBmZG1hX2FkZHIgKyAoaiAqIFNPTE9fSFdfQlBMKSwKLQkJCQkJICAgc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpKSkKKwlmZG1hX2FkZHIgPSBTT0xPX0RJU1BfRVhUX0FERFIoc29sb19kZXYpICsgKGZoLT5vbGRfd3JpdGUgKgorCQkJKFNPTE9fSFdfQlBMICogc29sb192bGluZXMoc29sb19kZXYpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb192bGluZXMoc29sb19kZXYpOyBpKyspIHsKKwkJaW50IGxpbmVfbGVuID0gc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpOworCQlpbnQgbGluZXM7CisKKwkJaWYgKCFzZ19zaXplX2xlZnQpIHsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlpZiAoc2cgPT0gTlVMTCkKIAkJCQlnb3RvIGZpbmlzaF9idWY7Ci0JCQl2YnVmICs9IHNvbG9fYnl0ZXNwZXJsaW5lKHNvbG9fZGV2KTsKKwkJCXNnX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCXNnX3NpemVfbGVmdCA9IHNnX2RtYV9sZW4oc2cpOwogCQl9Ci0JCWZkbWFfYWRkciArPSBTT0xPX0RJU1BfQlVGX1NJWkU7CisKKwkJLyogTm8gcm9vbSBmb3IgYW4gZW50aXJlIGxpbmUsIHNvIGNodW5rIGl0IHVwICovCisJCWlmIChzZ19zaXplX2xlZnQgPCBsaW5lX2xlbikgeworCQkJaW50IHRoaXNfYWRkciA9IGZkbWFfYWRkcjsKKworCQkJd2hpbGUgKGxpbmVfbGVuID4gMCkgeworCQkJCWludCB0aGlzX3dyaXRlOworCisJCQkJaWYgKCFzZ19zaXplX2xlZnQpIHsKKwkJCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCQkJaWYgKHNnID09IE5VTEwpCisJCQkJCQlnb3RvIGZpbmlzaF9idWY7CisJCQkJCXNnX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCQkJc2dfc2l6ZV9sZWZ0ID0gc2dfZG1hX2xlbihzZyk7CisJCQkJfQorCisJCQkJdGhpc193cml0ZSA9IG1pbihzZ19zaXplX2xlZnQsIGxpbmVfbGVuKTsKKworCQkJCWlmIChkaXNwX3B1c2hfZGVzYyhmaCwgc2dfZG1hLCB0aGlzX2FkZHIsCisJCQkJCQkgICB0aGlzX3dyaXRlLCAwLCAwKSkKKwkJCQkJZ290byBmaW5pc2hfYnVmOworCisJCQkJbGluZV9sZW4gLT0gdGhpc193cml0ZTsKKwkJCQlzZ19zaXplX2xlZnQgLT0gdGhpc193cml0ZTsKKwkJCQlzZ19kbWEgKz0gdGhpc193cml0ZTsKKwkJCQl0aGlzX2FkZHIgKz0gdGhpc193cml0ZTsKKwkJCX0KKworCQkJZmRtYV9hZGRyICs9IFNPTE9fSFdfQlBMOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBTaG92ZSBhcyBtYW55IGxpbmVzIGludG8gYSByZXBlYXRpbmcgZGVzY3JpcHRvciBhcyBwb3NzaWJsZSAqLworCQlsaW5lcyA9IG1pbihzZ19zaXplX2xlZnQgLyBsaW5lX2xlbiwKKwkJCSAgICBzb2xvX3ZsaW5lcyhzb2xvX2RldikgLSBpKTsKKworCQlpZiAoZGlzcF9wdXNoX2Rlc2MoZmgsIHNnX2RtYSwgZmRtYV9hZGRyLCBsaW5lX2xlbiwKKwkJCQkgICBsaW5lcyAtIDEsIFNPTE9fSFdfQlBMKSkKKwkJCWdvdG8gZmluaXNoX2J1ZjsKKworCQlpICs9IGxpbmVzIC0gMTsKKwkJZmRtYV9hZGRyICs9IFNPTE9fSFdfQlBMICogbGluZXM7CisJCXNnX2RtYSArPSBsaW5lcyAqIGxpbmVfbGVuOworCQlzZ19zaXplX2xlZnQgLT0gbGluZXMgKiBsaW5lX2xlbjsKIAl9Ci0JZXJyb3IgPSAwOworCisJZXJyb3IgPSBkaXNwX2ZsdXNoX2Rlc2NzKGZoKTsKIAogZmluaXNoX2J1ZjoKIAlpZiAoZXJyb3IpIHsKIAkJdmItPnN0YXRlID0gVklERU9CVUZfRVJST1I7CiAJfSBlbHNlIHsKKwkJdmItPnNpemUgPSBzb2xvX3ZsaW5lcyhzb2xvX2RldikgKiBzb2xvX2J5dGVzcGVybGluZShzb2xvX2Rldik7CiAJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CiAJCXZiLT5maWVsZF9jb3VudCsrOwogCQlkb19nZXR0aW1lb2ZkYXkoJnZiLT50cyk7CkBAIC0yNzUsNyArMzc1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWN1cl93cml0ZSA9IFNPTE9fVklfU1RBVFVTMF9QQUdFKHNvbG9fcmVnX3JlYWQoZmgtPnNvbG9fZGV2LAotCQkJCQkJCVNPTE9fVklfU1RBVFVTMCkpOworCQkJCQkJIFNPTE9fVklfU1RBVFVTMCkpOwogCQlpZiAoY3VyX3dyaXRlID09IGZoLT5vbGRfd3JpdGUpCiAJCQlicmVhazsKIApAQCAtMzEwLDcgKzQxMCw3IEBACiAKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmc29sb19kZXYtPmRpc3BfdGhyZWFkX3dhaXQsICZ3YWl0KTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2xvX3N0YXJ0X3RocmVhZChzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCkKQEAgLTMzNywxMiArNDM3LDEyIEBACiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSB2cS0+cHJpdl9kYXRhOwogCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ICA9IGZoLT5zb2xvX2RldjsKIAotICAgICAgICAqc2l6ZSA9IHNvbG9faW1hZ2Vfc2l6ZShzb2xvX2Rldik7CisJKnNpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOwogCi0gICAgICAgIGlmICgqY291bnQgPCBNSU5fVklEX0JVRkZFUlMpCisJaWYgKCpjb3VudCA8IE1JTl9WSURfQlVGRkVSUykKIAkJKmNvdW50ID0gTUlOX1ZJRF9CVUZGRVJTOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNvbG9fYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTM2NCw3ICs0NjQsOSBAQAogCWlmICh2Yi0+c3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgewogCQlpbnQgcmMgPSB2aWRlb2J1Zl9pb2xvY2sodnEsIHZiLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCQkJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJCQl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCQkJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtMzg4LDcgKzQ5MCwxMCBAQAogc3RhdGljIHZvaWQgc29sb19idWZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLAogCQkJICAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKLQl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUodnEsIHZiKTsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCisJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOwogfQogCkBAIC00MDQsNyArNTA5LDcgQEAKIHsKIAlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotICAgICAgICByZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52aWRxLCB3YWl0KTsKKwlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52aWRxLCB3YWl0KTsKIH0KIAogc3RhdGljIGludCBzb2xvX3Y0bDJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC00MjAsNyArNTI1LDggQEAKIAlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaDsKIAlpbnQgcmV0OwogCi0JaWYgKChmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZoID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2luaXQoJmZoLT5zbG9jayk7CkBAIC00MjgsMTYgKzUzNCwxNyBAQAogCWZoLT5zb2xvX2RldiA9IHNvbG9fZGV2OwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCi0JaWYgKChyZXQgPSBzb2xvX3N0YXJ0X3RocmVhZChmaCkpKSB7CisJcmV0ID0gc29sb19zdGFydF90aHJlYWQoZmgpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoZmgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdCgmZmgtPnZpZHEsICZzb2xvX3ZpZGVvX3FvcHMsCi0JCQkJICAgICZzb2xvX2Rldi0+cGRldi0+ZGV2LCAmZmgtPnNsb2NrLAotCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkJICAgIFNPTE9fRElTUF9QSVhfRklFTEQsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmc29sb192aWRlb19xb3BzLAorCQkJICAgICAgICZzb2xvX2Rldi0+cGRldi0+ZGV2LCAmZmgtPnNsb2NrLAorCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCSAgICAgICBTT0xPX0RJU1BfUElYX0ZJRUxELAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MzAsNyArNjM3LDcgQEAKIAlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQogCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwogCWVsc2UKLQkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfUEFMX0I7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMiw3ICs3MjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvbG9fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgCitzdGF0aWMgaW50IHNvbG9fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCiB7CiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSBwcml2OwpAQCAtNzgxLDExICs4ODgsMTEgQEAKIAkudmlkaW9jX3FidWYJCQk9IHNvbG9fcWJ1ZiwKIAkudmlkaW9jX2RxYnVmCQkJPSBzb2xvX2RxYnVmLAogCS52aWRpb2Nfc3RyZWFtb24JCT0gc29sb19zdHJlYW1vbiwKLSAgICAgICAgLnZpZGlvY19zdHJlYW1vZmYJCT0gc29sb19zdHJlYW1vZmYsCisJLnZpZGlvY19zdHJlYW1vZmYJCT0gc29sb19zdHJlYW1vZmYsCiAJLyogQ29udHJvbHMgKi8KIAkudmlkaW9jX3F1ZXJ5Y3RybAkJPSBzb2xvX2Rpc3BfcXVlcnljdHJsLAotICAgICAgICAudmlkaW9jX2dfY3RybAkJCT0gc29sb19kaXNwX2dfY3RybCwKLSAgICAgICAgLnZpZGlvY19zX2N0cmwJCQk9IHNvbG9fZGlzcF9zX2N0cmwsCisJLnZpZGlvY19nX2N0cmwJCQk9IHNvbG9fZGlzcF9nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwJCQk9IHNvbG9fZGlzcF9zX2N0cmwsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzb2xvX3Y0bDJfdGVtcGxhdGUgPSB7CkBAIC03OTUsNyArOTAyLDcgQEAKIAkubWlub3IJCQk9IC0xLAogCS5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAogCi0JLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00sCisJLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX0IsCiAJLmN1cnJlbnRfbm9ybQkJPSBWNEwyX1NURF9OVFNDX00sCiB9OwogCkBAIC04MzYsMTMgKzk0MywxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBzb2xvX2Rldi0+bnJfY2hhbnM7IGkrKykgewogCQlzb2xvX3Y0bDJfc2V0X2NoKHNvbG9fZGV2LCBpKTsKIAkJd2hpbGUgKGVyYXNlX29mZihzb2xvX2RldikpCi0JCQk7Ly8gRG8gbm90aGluZworCQkJOy8qIERvIG5vdGhpbmcgKi8KIAl9CiAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgZGlzcGxheSBjaGFubmVsICovCiAJc29sb192NGwyX3NldF9jaChzb2xvX2RldiwgMCk7CiAJd2hpbGUgKGVyYXNlX29mZihzb2xvX2RldikpCi0JCTsvLyBEbyBub3RoaW5nCisJCTsvKiBEbyBub3RoaW5nICovCiAKIAlzb2xvNjAxMF9pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX1ZJREVPX0lOKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLmggYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaAppbmRleCBkY2E4ZTNlLi45YzkzMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC00OCwxMCArNDgsMTQgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVVTT0xPXzQJCTB4NDMwNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVVNPTE9fOQkJMHg0MzA5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVVU09MT18xNgkweDQzMTAKLS8qIENvbW1lbGwgU29mdGxvZ2ljIDYwMTAgYmFzZWQgY2FyZHMgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01NU09MT180CTB4NEUwNAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzkJMHg0RTA5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fMTYJMHg0RTEwCisvKiBCbHVlY2hlcnJ5IFNvZnRsb2dpYyA2MDEwIGJhc2VkIGNhcmRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfU09MT180CQkweDRFMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ19TT0xPXzkJCTB4NEUwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fMTYJMHg0RTEwCisvKiBCbHVlY2hlcnJ5IFNvZnRsb2dpYyA2MTEwIGJhc2VkIGNhcmRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfNjExMF80CQkweDUzMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ182MTEwXzgJCTB4NTMwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfMTYJMHg1MzEwCiAjZW5kaWYgLyogQmx1ZWNoZXJyeSAqLwogCiAjZGVmaW5lIFNPTE82MDEwX05BTUUJCQkic29sbzYwMTAiCkBAIC02NCw3ICs2OCw3IEBACiAjZGVmaW5lIFNPTE82MDEwX1ZFUl9NSU5PUgkJMAogI2RlZmluZSBTT0xPNjAxMF9WRVJfU1VCCQkwCiAjZGVmaW5lIFNPTE82MDEwX1ZFUl9OVU0gXAotICAgIEtFUk5FTF9WRVJTSU9OKFNPTE82MDEwX1ZFUl9NQUpPUiwgU09MTzYwMTBfVkVSX01JTk9SLCBTT0xPNjAxMF9WRVJfU1VCKQorCUtFUk5FTF9WRVJTSU9OKFNPTE82MDEwX1ZFUl9NQUpPUiwgU09MTzYwMTBfVkVSX01JTk9SLCBTT0xPNjAxMF9WRVJfU1VCKQogCiAvKgogICogVGhlIFNPTE82MDEwIGFjdHVhbGx5IGhhcyA4IGkyYyBjaGFubmVscywgYnV0IHdlIG9ubHkgdXNlIDIuCkBAIC03OCw3ICs4Miw2IEBACiAvKiBETUEgRW5naW5lIHNldHVwICovCiAjZGVmaW5lIFNPTE9fTlJfUDJNCQkJNAogI2RlZmluZSBTT0xPX05SX1AyTV9ERVNDCQkyNTYKLSNkZWZpbmUgU09MT19QMk1fREVTQ19TSVpFCQkoU09MT19OUl9QMk1fREVTQyAqIDE2KQogLyogTVBFRyBhbmQgSlBFRyBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgYW5kIGxvY2tzIHNvIHRoZXkgbXVzdCBiZSB0b2dldGhlcgogICogaW4gdGhlIHNhbWUgZG1hIGNoYW5uZWwuICovCiAjZGVmaW5lIFNPTE9fUDJNX0RNQV9JRF9NUDRFCQkwCkBAIC0xMjMsMTEgKzEyNiwxNyBAQAogCUlJQ19TVEFURV9TVE9QCiB9OwogCitzdHJ1Y3QgcDJtX2Rlc2MgeworCXUzMiBjdHJsOworCXUzMiBleHQ7CisJdTMyIHRhOworCXUzMiBmYTsKK307CisKIHN0cnVjdCBzb2xvX3AybV9kZXYgewotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKIAlpbnQJCQllcnJvcjsKLQl1OAkJCWRlc2NbU09MT19QMk1fREVTQ19TSVpFXTsKIH07CiAKICNkZWZpbmUgT1NEX1RFWFRfTUFYCQkzMApAQCAtMTg1LDcgKzE5NCw3IEBACiAJLyogaTJjIHJlbGF0ZWQgaXRlbXMgKi8KIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJaTJjX2FkYXBbU09MT19JMkNfQURBUFRFUlNdOwogCWVudW0gU09MT19JMkNfU1RBVEUJaTJjX3N0YXRlOwotCXN0cnVjdCBzZW1hcGhvcmUJaTJjX3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCWkyY19tdXRleDsKIAlpbnQJCQlpMmNfaWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJaTJjX3dhaXQ7CiAJc3RydWN0IGkyY19tc2cJCSppMmNfbXNnOwpAQCAtMjEyLDcgKzIyMSw3IEBACiAJc3RydWN0IHNvbG9fZW5jX2J1ZgllbmNfYnVmW1NPTE9fTlJfUklOR19CVUZTXTsKIAogCS8qIEN1cnJlbnQgdmlkZW8gc2V0dGluZ3MgKi8KLQl1MzIgCQkJdmlkZW9fdHlwZTsKKwl1MzIJCQl2aWRlb190eXBlOwogCXUxNgkJCXZpZGVvX2hzaXplLCB2aWRlb192c2l6ZTsKIAl1MTYJCQl2b3V0X2hzdGFydCwgdm91dF92c3RhcnQ7CiAJdTE2CQkJdmluX2hzdGFydCwgdmluX3ZzdGFydDsKQEAgLTMwNiw2ICszMTUsMTQgQEAKIAkJICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSk7CiBpbnQgc29sb19wMm1fZG1hKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgdm9pZCAqc3lzX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOworaW50IHNvbG9fcDJtX2RtYV9zZyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICBzdHJ1Y3QgcDJtX2Rlc2MgKnBkZXNjLCBpbnQgd3IsCisJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdTMyIHNnX29mZiwKKwkJICAgIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOwordm9pZCBzb2xvX3AybV9wdXNoX2Rlc2Moc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgd3IsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQl1MzIgZXh0X2FkZHIsIHUzMiBzaXplLCBpbnQgcmVwZWF0LCB1MzIgZXh0X3NpemUpOworaW50IHNvbG9fcDJtX2RtYV9kZXNjKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwKKwkJICAgICAgc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgZGVzY19jb3VudCk7CiAKIC8qIFNldCB0aGUgdGhyZXNob2xkIGZvciBtb3Rpb24gZGV0ZWN0aW9uICovCiB2b2lkIHNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1MTYgdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCmluZGV4IGNjNzlmOWUuLjQwOGJiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwpAQCAtOTg0LDggKzk4NCwxMCBAQAogCSAqIG5vdCBrbm93biBhaGVhZCBvZiB0aW1lLgogCSAqLwogCWFjY2Vzc2liaWxpdHlfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImFjY2Vzc2liaWxpdHkiLCBOVUxMKTsKLQlpZiAoIWFjY2Vzc2liaWxpdHlfa29iaikKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFhY2Nlc3NpYmlsaXR5X2tvYmopIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCiAJc3BlYWt1cF9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic3BlYWt1cCIsIGFjY2Vzc2liaWxpdHlfa29iaik7CiAJaWYgKCFzcGVha3VwX2tvYmopIHsKQEAgLTEwMDIsNyArMTAwNCw3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfZ3JvdXA7CiAKLQlyZXR1cm4gMDsKKwlnb3RvIG91dDsKIAogZXJyX2dyb3VwOgogCXN5c2ZzX3JlbW92ZV9ncm91cChzcGVha3VwX2tvYmosICZtYWluX2F0dHJfZ3JvdXApOwpAQCAtMTAxMCw2ICsxMDEyLDcgQEAKIAlrb2JqZWN0X3B1dChzcGVha3VwX2tvYmopOwogZXJyX2FjYzoKIAlrb2JqZWN0X3B1dChhY2Nlc3NpYmlsaXR5X2tvYmopOworb3V0OgogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYwppbmRleCA0YjdhOWMyLi4zY2QwMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jCkBAIC0yMjUzLDE3ICsyMjUzLDE3IEBACiAKIAllcnIgPSBzcGVha3VwX2FkZF92aXJ0dWFsX2tleWJvYXJkKCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAlpbml0aWFsaXplX21zZ3MoKTsJLyogSW5pdGlhbGl6ZSBhcnJheXMgZm9yIGkxOG4uICovCiAJZmlyc3RfY29uc29sZSA9IGt6YWxsb2Moc2l6ZW9mKCpmaXJzdF9jb25zb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmaXJzdF9jb25zb2xlKQotCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSBzcGVha3VwX2tvYmpfaW5pdCgpOwotCWlmIChlcnIpIHsKLQkJa2ZyZWUoZmlyc3RfY29uc29sZSk7Ci0JCXJldHVybiBlcnI7CisJaWYgKCFmaXJzdF9jb25zb2xlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NvbnM7CiAJfQorCWVyciA9IHNwZWFrdXBfa29ial9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfa29iamVjdDsKIAogCXJlc2V0X2RlZmF1bHRfY2hhcnMoKTsKIAlyZXNldF9kZWZhdWx0X2NoYXJ0YWIoKTsKQEAgLTIyOTksMTEgKzIyOTksMjAgQEAKIAogCXNwZWFrdXBfdGFzayA9IGt0aHJlYWRfY3JlYXRlKHNwZWFrdXBfdGhyZWFkLCBOVUxMLCAic3BlYWt1cCIpOwogCXNldF91c2VyX25pY2Uoc3BlYWt1cF90YXNrLCAxMCk7Ci0JaWYgKCFJU19FUlIoc3BlYWt1cF90YXNrKSkKLQkJd2FrZV91cF9wcm9jZXNzKHNwZWFrdXBfdGFzayk7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKHNwZWFrdXBfdGFzaykpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfa29iamVjdDsKKwl9CisJd2FrZV91cF9wcm9jZXNzKHNwZWFrdXBfdGFzayk7CisJZ290byBvdXQ7CisKK2Vycl9rb2JqZWN0Ogorc3BlYWt1cF9rb2JqX2V4aXQoKTsKKwlrZnJlZShmaXJzdF9jb25zb2xlKTsKK2Vycl9jb25zOgorCXNwZWFrdXBfcmVtb3ZlX3ZpcnR1YWxfa2V5Ym9hcmQoKTsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBtb2R1bGVfaW5pdChzcGVha3VwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaAppbmRleCA4NDBiZGRiLi5kMzZjOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaApAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lIENPTE9SX0JVRkZFUl9TSVpFIDE2MAogCi1zdHJ1Y3Qgc3BrX2hpZ2hsaWdodF9jb2xvcl90cmFja3sKK3N0cnVjdCBzcGtfaGlnaGxpZ2h0X2NvbG9yX3RyYWNrIHsKIAkvKiBDb3VudCBvZiBlYWNoIGJhY2tncm91bmQgY29sb3IgKi8KIAl1bnNpZ25lZCBpbnQgYmdjb3VudFs4XTsKIAkvKiBCdWZmZXIgZm9yIGNoYXJhY3RlcnMgZHJhd24gd2l0aCBlYWNoIGJhY2tncm91bmQgY29sb3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYwppbmRleCA2M2E5ZDBhLi4wMDdiMjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogLyoqKiogSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBEaXYsIFJlbWFpbmRlciBvcGVyYXRpb24gb24gdTY0ICoqKiovCiAKQEAgLTcyOSwzNCArNzMwLDE2IEBACiB9CiAqLwogCi1zdGF0aWMgaW50IEdMT0JfU0JEX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3NwZWN0cmFfZnRsX2FzeW5jKHZvaWQgKnVudXNlZCwgYXN5bmNfY29va2llX3QgY29va2llKQogewogCWludCBpOwogCi0JLyogU2V0IGRlYnVnIG91dHB1dCBsZXZlbCAoMH4zKSBoZXJlLiAzIGlzIG1vc3QgdmVyYm9zZSAqLwotCXByaW50ayhLRVJOX0FMRVJUICJTcGVjdHJhOiAlc1xuIiwgR0xPQl92ZXJzaW9uKTsKLQotCW11dGV4X2luaXQoJnNwZWN0cmFfbG9jayk7Ci0KLQlHTE9CX1NCRF9tYWpvcm51bSA9IHJlZ2lzdGVyX2Jsa2RldigwLCBHTE9CX1NCRF9OQU1FKTsKLQlpZiAoR0xPQl9TQkRfbWFqb3JudW0gPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgdGhlIG1ham9yICVkIGZvciBTcGVjdHJhIiwKLQkJICAgICAgIEdMT0JfU0JEX21ham9ybnVtKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoUEFTUyAhPSBHTE9CX0ZUTF9GbGFzaF9Jbml0KCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gSW5pdGlhbGl6ZSBGbGFzaCBEZXZpY2UuICIKLQkJICAgICAgICJBYm9ydGluZ1xuIik7Ci0JCWdvdG8gb3V0X2ZsYXNoX3JlZ2lzdGVyOwotCX0KLQogCS8qIGNyZWF0ZV9zeXNmc19lbnRyeSgmZGV2LT5kZXYpOyAqLwogCiAJaWYgKFBBU1MgIT0gR0xPQl9GVExfSWRlbnRpZnlEZXZpY2UoJklkZW50aWZ5RGV2aWNlRGF0YSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gUmVhZCBGbGFzaCBEZXZpY2UuICIKIAkJICAgICAgICJBYm9ydGluZ1xuIik7Ci0JCWdvdG8gb3V0X2ZsYXNoX3JlZ2lzdGVyOworCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIkluIEdMT0JfU0JEX2luaXQ6ICIKIAkJCSAgICAgICAiTnVtIGJsb2Nrcz0lZCwgcGFnZXNwZXJibG9jaz0lZCwgIgpAQCAtNzc1LDI0ICs3NTgsNTAgQEAKIAl9CiAJcHJpbnRrKEtFUk5fQUxFUlQgIlNwZWN0cmE6IGJsb2NrIHRhYmxlIGhhcyBiZWVuIGZvdW5kLlxuIik7CiAKKwlHTE9CX1NCRF9tYWpvcm51bSA9IHJlZ2lzdGVyX2Jsa2RldigwLCBHTE9CX1NCRF9OQU1FKTsKKwlpZiAoR0xPQl9TQkRfbWFqb3JudW0gPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgdGhlIG1ham9yICVkIGZvciBTcGVjdHJhIiwKKwkJICAgICAgIEdMT0JfU0JEX21ham9ybnVtKTsKKwkJZ290byBvdXRfZnRsX2ZsYXNoX3JlZ2lzdGVyOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBOVU1fREVWSUNFUzsgaSsrKQogCQlpZiAoU0JEX3NldHVwX2RldmljZSgmbmFuZF9kZXZpY2VbaV0sIGkpID09IC1FTk9NRU0pCi0JCQlnb3RvIG91dF9mdGxfZmxhc2hfcmVnaXN0ZXI7CisJCQlnb3RvIG91dF9ibGtfcmVnaXN0ZXI7CiAKIAluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKIAkJICAgICAgICJTcGVjdHJhOiBtb2R1bGUgbG9hZGVkIHdpdGggbWFqb3IgbnVtYmVyICVkXG4iLAogCQkgICAgICAgR0xPQl9TQkRfbWFqb3JudW0pOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogCitvdXRfYmxrX3JlZ2lzdGVyOgorCXVucmVnaXN0ZXJfYmxrZGV2KEdMT0JfU0JEX21ham9ybnVtLCBHTE9CX1NCRF9OQU1FKTsKIG91dF9mdGxfZmxhc2hfcmVnaXN0ZXI6CiAJR0xPQl9GVExfQ2FjaGVfUmVsZWFzZSgpOwotb3V0X2ZsYXNoX3JlZ2lzdGVyOgotCUdMT0JfRlRMX0ZsYXNoX1JlbGVhc2UoKTsKLQl1bnJlZ2lzdGVyX2Jsa2RldihHTE9CX1NCRF9tYWpvcm51bSwgR0xPQl9TQkRfTkFNRSk7CiAJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBNb2R1bGUgbG9hZCBmYWlsZWQuXG4iKTsKK30KIAotCXJldHVybiAtRU5PTUVNOworaW50IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKCkKK3sKKwlhc3luY19zY2hlZHVsZShyZWdpc3Rlcl9zcGVjdHJhX2Z0bF9hc3luYywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9zcGVjdHJhX2Z0bCk7CisKK3N0YXRpYyBpbnQgR0xPQl9TQkRfaW5pdCh2b2lkKQoreworCS8qIFNldCBkZWJ1ZyBvdXRwdXQgbGV2ZWwgKDB+MykgaGVyZS4gMyBpcyBtb3N0IHZlcmJvc2UgKi8KKwlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogJXNcbiIsIEdMT0JfdmVyc2lvbik7CisKKwltdXRleF9pbml0KCZzcGVjdHJhX2xvY2spOworCisJaWYgKFBBU1MgIT0gR0xPQl9GVExfRmxhc2hfSW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIEluaXRpYWxpemUgRmxhc2ggRGV2aWNlLiAiCisJCSAgICAgICAiQWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBHTE9CX1NCRF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmgKaW5kZXggNmM1ZDkwYy4uODVjMDc1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuaApAQCAtODAsNSArODAsNiBAQAogZXh0ZXJuIGludCBHTE9CX0NhbGNfVXNlZF9CaXRzKHUzMiBuKTsKIGV4dGVybiB1NjQgR0xPQl91NjRfRGl2KHU2NCBhZGRyLCB1MzIgZGl2aXNvcik7CiBleHRlcm4gdTY0IEdMT0JfdTY0X1JlbWFpbmRlcih1NjQgYWRkciwgdTMyIGRpdmlzb3JfdHlwZSk7CitleHRlcm4gaW50IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKHZvaWQpOwogCiAjZW5kaWYgLyogX0ZGU1BPUlRfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mbGFzaC5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guYwppbmRleCA0ZTZlNDUxLi5mYjM5YzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmMKQEAgLTEyNTgsOSArMTI1OCw3IEBACiAKIAlnX1NCRENtZEluZGV4ID0gMDsKIAotCUdMT0JfTExEX0ZsYXNoX0luaXQoKTsKLQotCXN0YXR1cyA9IEdMT0JfTExEX1JlYWRfRGV2aWNlX0lEKCk7CisJc3RhdHVzID0gR0xPQl9MTERfRmxhc2hfSW5pdCgpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYwppbmRleCA2NzMzYmJmLi4wOTVmMmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX2VtdS5jCkBAIC0xODAsMTAgKzE4MCw4IEBACiAJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAogCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAKLQlmbGFzaF9tZW1vcnlbMF0gPSAodTggKil2bWFsbG9jKEdMT0JfTExEX1BBR0VfU0laRSAqCi0JCQkJCQkgICBHTE9CX0xMRF9CTE9DS1MgKgotCQkJCQkJICAgR0xPQl9MTERfUEFHRVMgKgotCQkJCQkJICAgc2l6ZW9mKHU4KSk7CisJZmxhc2hfbWVtb3J5WzBdID0gdm1hbGxvYyhHTE9CX0xMRF9QQUdFX1NJWkUgKiBHTE9CX0xMRF9CTE9DS1MgKgorCQkJCSAgR0xPQl9MTERfUEFHRVMgKiBzaXplb2YodTgpKTsKIAlpZiAoIWZsYXNoX21lbW9yeVswXSkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5ICIKIAkJICAgICAgICJmb3IgbmFuZCBlbXVsYXRvciFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKaW5kZXggMGQ2NDdhOGYuLjIyNjNkM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuYwpAQCAtMjM5NSwxMTIgKzIzOTUsOSBAQAogCXVuc2lnbmVkIGxvbmcgY3NyX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBjc3JfbGVuOwogCXN0cnVjdCBtcnN0X25hbmRfaW5mbyAqcG5kZXYgPSAmaW5mbzsKLQotCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihkZXYpOwotCXBuZGV2LT5kZXYgPSBkZXY7Ci0KLQljc3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwotCWlmICghY3NyX2Jhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfcmVzb3VyY2Vfc3RhcnQgZmFpbGVkIVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbGVkX3JlcV9jc3I7Ci0JfQotCi0JY3NyX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKTsKLQlpZiAoIWNzcl9sZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfcmVzb3VyY2VfbGVuIGZhaWxlZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxlZF9yZXFfY3NyOwotCX0KLQotCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBTUEVDVFJBX05BTkRfTkFNRSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byByZXF1ZXN0ICIKLQkJICAgICAgICJtZW1vcnkgcmVnaW9uXG4iKTsKLQkJZ290byBmYWlsZWRfcmVxX2NzcjsKLQl9Ci0KLQlwbmRldi0+aW9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNzcl9iYXNlLCBjc3JfbGVuKTsKLQlpZiAoIXBuZGV2LT5pb2FkZHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKLQl9Ci0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhOiBDU1IgMHglMDhseCAtPiAweCVwICgweCVseClcbiIsCi0JCSAgICAgICBjc3JfYmFzZSwgcG5kZXYtPmlvYWRkciwgY3NyX2xlbik7Ci0KLQlpbml0X2NvbXBsZXRpb24oJnBuZGV2LT5jb21wbGV0ZSk7Ci0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhOiBJUlEgJWRcbiIsIGRldi0+aXJxKTsKLQotI2lmIENNRF9ETUEKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGNkbWFfaXNyLCBJUlFGX1NIQVJFRCwKLQkJCVNQRUNUUkFfTkFORF9OQU1FLCAmaW5mbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKLQkJZ290byBmYWlsZWRfcmVtYXBfY3NyOwotCX0KLSNlbHNlCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZG1hX2lzciwgSVJRRl9TSEFSRUQsCi0JCQlTUEVDVFJBX05BTkRfTkFNRSwgJmluZm8pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7Ci0JCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKLQl9Ci0jZW5kaWYKLQotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBuZGV2KTsKLQotCXJldHVybiAwOwotCi1mYWlsZWRfcmVtYXBfY3NyOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKLWZhaWxlZF9yZXFfY3NyOgotCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbmFuZF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IG1yc3RfbmFuZF9pbmZvICpwbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCi0JCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQotI2lmIENNRF9ETUEKLQlmcmVlX2lycShkZXYtPmlycSwgcG5kZXYpOwotI2VuZGlmCi0JaW91bm1hcChwbmRldi0+aW9hZGRyKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci19Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuYW5kX3BjaV9pZHMpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmFuZF9wY2lfZHJpdmVyID0gewotCS5uYW1lID0gU1BFQ1RSQV9OQU5EX05BTUUsCi0JLmlkX3RhYmxlID0gbmFuZF9wY2lfaWRzLAotCS5wcm9iZSA9IG5hbmRfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBuYW5kX3BjaV9yZW1vdmUsCi19OwotCi1pbnQgTkFORF9GbGFzaF9Jbml0KHZvaWQpCi17Ci0JaW50IHJldHZhbDsKIAl1MzIgaW50X21hc2s7CiAKLQluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCiAJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAogCUZsYXNoUmVnID0gaW9yZW1hcF9ub2NhY2hlKEdMT0JfSFdDVExfUkVHX0JBU0UsCkBAIC0yNTgyLDYgKzI0NzksMTIyIEBACiAJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFdPX1JPV19BRERSX0NZQ0xFUyk7CiAJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRUNDX0VOQUJMRSk7CiAJZW5hYmxlX2VjYyA9IDE7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbGVkX3JlcV9jc3I7CisJfQorCisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlwbmRldi0+ZGV2ID0gZGV2OworCisJY3NyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpZiAoIWNzcl9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX3N0YXJ0IGZhaWxlZCFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxlZF9yZXFfY3NyOworCX0KKworCWNzcl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7CisJaWYgKCFjc3JfbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX2xlbiBmYWlsZWQhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsZWRfcmVxX2NzcjsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgU1BFQ1RSQV9OQU5EX05BTUUpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gcmVxdWVzdCAiCisJCSAgICAgICAibWVtb3J5IHJlZ2lvblxuIik7CisJCWdvdG8gZmFpbGVkX3JlcV9jc3I7CisJfQorCisJcG5kZXYtPmlvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjc3JfYmFzZSwgY3NyX2xlbik7CisJaWYgKCFwbmRldi0+aW9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogQ1NSIDB4JTA4bHggLT4gMHglcCAoMHglbHgpXG4iLAorCQkgICAgICAgY3NyX2Jhc2UsIHBuZGV2LT5pb2FkZHIsIGNzcl9sZW4pOworCisJaW5pdF9jb21wbGV0aW9uKCZwbmRldi0+Y29tcGxldGUpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogSVJRICVkXG4iLCBkZXYtPmlycSk7CisKKyNpZiBDTURfRE1BCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBjZG1hX2lzciwgSVJRRl9TSEFSRUQsCisJCQlTUEVDVFJBX05BTkRfTkFNRSwgJmluZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7CisJCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKKwl9CisjZWxzZQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZGRtYV9pc3IsIElSUUZfU0hBUkVELAorCQkJU1BFQ1RSQV9OQU5EX05BTUUsICZpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorI2VuZGlmCisKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBwbmRldik7CisKKwlyZXQgPSBHTE9CX0xMRF9SZWFkX0RldmljZV9JRCgpOworCWlmIChyZXQpIHsKKwkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKCk7CisJaWYgKHJldCkgeworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9yZW1hcF9jc3I6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZmFpbGVkX3JlcV9jc3I6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaW91bm1hcChGbGFzaE1lbSk7CisJaW91bm1hcChGbGFzaFJlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuYW5kX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gKnBuZGV2ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisjaWYgQ01EX0RNQQorCWZyZWVfaXJxKGRldi0+aXJxLCBwbmRldik7CisjZW5kaWYKKwlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5hbmRfcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuYW5kX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBTUEVDVFJBX05BTkRfTkFNRSwKKwkuaWRfdGFibGUgPSBuYW5kX3BjaV9pZHMsCisJLnByb2JlID0gbmFuZF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IG5hbmRfcGNpX3JlbW92ZSwKK307CisKK2ludCBOQU5EX0ZsYXNoX0luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAKIAlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZuYW5kX3BjaV9kcml2ZXIpOwogCWlmIChyZXR2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Njc5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBUT1VDSFNDUkVFTl9TWU5BUFRJQ1NfSTJDX1JNSTQKKwl0cmlzdGF0ZSAiU3luYXB0aWNzIGkyYyBybWk0IHRvdWNoc2NyZWVuIgorCWRlcGVuZHMgb24gSTJDICYmIElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5bmFwdGljcyBSTUk0IGFuZAorCSAgd2FudCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJ1aWx0LWluIHRvdWNoc2NyZWVuLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5hcHRpY3Nfcm1pNF90cy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NlMmVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFJNSTQgdG91Y2hzY3JlZW4gZHJpdmVyLgorIworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NZTkFQVElDU19JMkNfUk1JNCkgKz0gc3luYXB0aWNzX2kyY19ybWk0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9UT0RPCkBAIC0wLDAgKzEsNyBAQAorVE9ETworLS0tLQorCitXYWl0IGZvciB0aGUgb2ZmaWNpYWwgdXBzdHJlYW0gc3luYXB0aWNzIHJtaTQgY2xlYXJwYWQgZHJpdmVycyBhcyBwcm9taXNlZCBvdmVyIHRoZSBwYXN0IGZldyBtb250aHMKK01lcmdlIGFueSBkZXZpY2Ugc3VwcG9ydCBuZWVkZWQgZnJvbSB0aGlzIGRyaXZlciBpbnRvIGl0CitEZWxldGUgdGhpcyBkcml2ZXIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjA0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKQEAgLTAsMCArMSwxMTc5IEBACisvKioKKyAqCisgKiBTeW5hcHRpY3MgUmVnaXN0ZXIgTWFwcGVkIEludGVyZmFjZSAoUk1JNCkgSTJDIFBoeXNpY2FsIExheWVyIERyaXZlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwLCBTeW5hcHRpY3MgSW5jb3Jwb3JhdGVkCisgKgorICogQXV0aG9yOiBKcyBIQSA8anMuaGFAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yOiBOYXZlZW4gS3VtYXIgRyA8bmF2ZWVuLmdhZGRpcGF0aUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBDb3B5cmlnaHQgMjAxMCAoYykgU1QtRXJpY3Nzb24gQUIKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMMiBsaWNlbnNlLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIEdQTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgInN5bmFwdGljc19pMmNfcm1pNC5oIgorCisvKiBUT0RPOiBmb3IgbXVsdGlwbGUgZGV2aWNlIHN1cHBvcnQgd2lsbCBuZWVkIGEgcGVyLWRldmljZSBtdXRleCAqLworI2RlZmluZSBEUklWRVJfTkFNRSAic3luYXB0aWNzX3JtaTRfaTJjIgorCisjZGVmaW5lIE1BWF9FUlJPUl9SRVBPUlQJNgorI2RlZmluZSBNQVhfVE9VQ0hfTUFKT1IJCTE1CisjZGVmaW5lIE1BWF9SRVRSWV9DT1VOVAkJNQorI2RlZmluZSBTVERfUVVFUllfTEVOCQkyMQorI2RlZmluZSBQQUdFX0xFTgkJMgorI2RlZmluZSBEQVRBX0JVRl9MRU4JCTMyCisjZGVmaW5lIEJVRl9MRU4JCQkzNworI2RlZmluZSBRVUVSWV9MRU4JCTkKKyNkZWZpbmUgREFUQV9MRU4JCTEyCisjZGVmaW5lIEhBU19UQVAJCQkweDAxCisjZGVmaW5lIEhBU19QQUxNREVURUNUCQkweDAxCisjZGVmaW5lIEhBU19ST1RBVEUJCTB4MDIKKyNkZWZpbmUgSEFTX1RBUEFOREhPTEQJCTB4MDIKKyNkZWZpbmUgSEFTX0RPVUJMRVRBUAkJMHgwNAorI2RlZmluZSBIQVNfRUFSTFlUQVAJCTB4MDgKKyNkZWZpbmUgSEFTX1JFTEVBU0UJCTB4MDgKKyNkZWZpbmUgSEFTX0ZMSUNLCQkweDEwCisjZGVmaW5lIEhBU19QUkVTUwkJMHgyMAorI2RlZmluZSBIQVNfUElOQ0gJCTB4NDAKKworI2RlZmluZSBNQVNLXzE2QklUCQkweEZGRkYKKyNkZWZpbmUgTUFTS184QklUCQkweEZGCisjZGVmaW5lIE1BU0tfN0JJVAkJMHg3RgorI2RlZmluZSBNQVNLXzVCSVQJCTB4MUYKKyNkZWZpbmUgTUFTS180QklUCQkweDBGCisjZGVmaW5lIE1BU0tfM0JJVAkJMHgwNworI2RlZmluZSBNQVNLXzJCSVQJCTB4MDMKKyNkZWZpbmUgVE9VQ0hQQURfQ1RSTF9JTlRSCTB4OAorI2RlZmluZSBQRFRfU1RBUlRfU0NBTl9MT0NBVElPTiAoMHgwMEU5KQorI2RlZmluZSBQRFRfRU5EX1NDQU5fTE9DQVRJT04JKDB4MDAwQSkKKyNkZWZpbmUgUERUX0VOVFJZX1NJWkUJCSgweDAwMDYpCisjZGVmaW5lIFJNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTCQkoOCkKKyNkZWZpbmUgU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0JKDB4MTEpCisjZGVmaW5lIFNZTkFQVElDU19STUk0X0RFVklDRV9DT05UUk9MX0ZVTkNfTlVNCSgweDAxKQorCisvKioKKyAqIHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjIC0gY29udGFpbnMgdGhlIGZ1bnRpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICogQHF1ZXJ5X2Jhc2VfYWRkcjogYmFzZSBhZGRyZXNzIGZvciBxdWVyeQorICogQGNtZF9iYXNlX2FkZHI6IGJhc2UgYWRkcmVzcyBmb3IgY29tbWFuZAorICogQGN0cmxfYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3MgZm9yIGNvbnRyb2wKKyAqIEBkYXRhX2Jhc2VfYWRkcjogYmFzZSBhZGRyZXNzIGZvciBkYXRhCisgKiBAaW50cl9zcmNfY291bnQ6IGNvdW50IGZvciB0aGUgaW50ZXJydXB0IHNvdXJjZQorICogQGZuX251bWJlcjogZnVuY3Rpb24gbnVtYmVyCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnaXZlcyB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICogb2YgdGhlIHBhcnRpY3VsYXIgZnVuY3Rpb25hbGl0eS4KKyAqLworc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MgeworCXVuc2lnbmVkIGNoYXIJcXVlcnlfYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJY21kX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCWN0cmxfYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJZGF0YV9iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhcglpbnRyX3NyY19jb3VudDsKKwl1bnNpZ25lZCBjaGFyCWZuX251bWJlcjsKK307CisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuIC0gY29udGFpbnMgdGhlIGZ1bnRpb24gaW5mb3JtYXRpb24KKyAqIEBmbl9udW1iZXI6IGZ1bmN0aW9uIG51bWJlcgorICogQG51bV9vZl9kYXRhX3NvdXJjZXM6IG51bWJlciBvZiBkYXRhIHNvdXJjZXMKKyAqIEBudW1fb2ZfZGF0YV9wb2ludHM6IG51bWJlciBvZiBmaW5nZXJzIHRvdWNoZWQKKyAqIEBzaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s6IGRhdGEgcmVnaXN0ZXIgYmxvY2sgc2l6ZQorICogQGluZGV4X3RvX2ludHJfcmVnOiBpbmRleCBmb3IgaW50ZXJydXB0IHJlZ2lzdGVyCisgKiBAaW50cl9tYXNrOiBpbnRlcnJ1cHQgbWFzayB2YWx1ZQorICogQGZuX2Rlc2M6IHZhcmlhYmxlIGZvciBmdW5jdGlvbiBkZXNjcmlwdG9yIHN0cnVjdHVyZQorICogQGxpbms6IGxpbmtlZCBsaXN0IGZvciBmdW5jdGlvbiBkZXNjcmlwdG9ycworICoKKyAqIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgZGF0YSBzb3VyY2VzIGFuZAorICogdGhlIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4geworCXVuc2lnbmVkIGNoYXIJCWZuX251bWJlcjsKKwl1bnNpZ25lZCBjaGFyCQludW1fb2ZfZGF0YV9zb3VyY2VzOworCXVuc2lnbmVkIGNoYXIJCW51bV9vZl9kYXRhX3BvaW50czsKKwl1bnNpZ25lZCBjaGFyCQlzaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s7CisJdW5zaWduZWQgY2hhcgkJaW5kZXhfdG9faW50cl9yZWc7CisJdW5zaWduZWQgY2hhcgkJaW50cl9tYXNrOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjCWZuX2Rlc2M7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8gLSBjb250YWlucyB0aGUgcm1pNCBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIEB2ZXJzaW9uX21ham9yOiBwcm90b2NvbCBtYWpvciB2ZXJzaW9uIG51bWJlcgorICogQHZlcnNpb25fbWlub3I6IHByb3RvY29sIG1pbm9yIHZlcnNpb24gbnVtYmVyCisgKiBAbWFudWZhY3R1cmVyX2lkOiBtYW51ZmFjdHVyZXIgaWRlbnRpZmljYXRpb24gYnl0ZQorICogQHByb2R1Y3RfcHJvcHM6IHByb2R1Y3QgcHJvcGVydGllcyBpbmZvcm1hdGlvbgorICogQHByb2R1Y3RfaW5mbzogcHJvZHVjdCBpbmZvIGFycmF5CisgKiBAZGF0ZV9jb2RlOiBkZXZpY2UgbWFudWZhY3R1cmUgZGF0ZQorICogQHRlc3Rlcl9pZDogdGVzdGVyIGlkIGFycmF5CisgKiBAc2VyaWFsX251bWJlcjogc2VyaWFsIG51bWJlciBmb3IgdGhhdCBkZXZpY2UKKyAqIEBwcm9kdWN0X2lkX3N0cmluZzogcHJvZHVjdCBpZCBmb3IgdGhlIGRldmljZQorICogQHN1cHBvcnRfZm5fbGlzdDogbGlua2VkIGxpc3QgZm9yIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgZGF0YSBzb3VyY2VzIGFuZAorICogdGhlIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8geworCXVuc2lnbmVkIGludAkJdmVyc2lvbl9tYWpvcjsKKwl1bnNpZ25lZCBpbnQJCXZlcnNpb25fbWlub3I7CisJdW5zaWduZWQgY2hhcgkJbWFudWZhY3R1cmVyX2lkOworCXVuc2lnbmVkIGNoYXIJCXByb2R1Y3RfcHJvcHM7CisJdW5zaWduZWQgY2hhcgkJcHJvZHVjdF9pbmZvWzJdOworCXVuc2lnbmVkIGNoYXIJCWRhdGVfY29kZVszXTsKKwl1bnNpZ25lZCBzaG9ydAkJdGVzdGVyX2lkOworCXVuc2lnbmVkIHNob3J0CQlzZXJpYWxfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIJCXByb2R1Y3RfaWRfc3RyaW5nWzExXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN1cHBvcnRfZm5fbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgLSBjb250YWlucyB0aGUgcm1pNCBkZXZpY2UgZGF0YQorICogQHJtaTRfbW9kX2luZm86IHN0cnVjdHVyZSB2YXJpYWJsZSBmb3Igcm1pNCBkZXZpY2UgaW5mbworICogQGlucHV0X2RldjogcG9pbnRlciBmb3IgaW5wdXQgZGV2aWNlCisgKiBAaTJjX2NsaWVudDogcG9pbnRlciBmb3IgaTJjIGNsaWVudAorICogQGJvYXJkOiBjb25zdGFudCBwb2ludGVyIGZvciB0b3VjaCBwbGF0Zm9ybSBkYXRhCisgKiBAZm5fbGlzdF9tdXRleDogbXV0ZXggZm9yIGZ1bnRpb24gbGlzdAorICogQHJtaTRfcGFnZV9tdXRleDogbXV0ZXggZm9yIHJtaTQgcGFnZQorICogQGN1cnJlbnRfcGFnZTogdmFyaWFibGUgZm9yIGludGVnZXIKKyAqIEBudW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyOiBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGNvdW50CisgKiBAZm4wMV9jdHJsX2Jhc2VfYWRkcjogY29udHJvbCBiYXNlIGFkZHJlc3MgZm9yIGZuMDEKKyAqIEBmbjAxX3F1ZXJ5X2Jhc2VfYWRkcjogcXVlcnkgYmFzZSBhZGRyZXNzIGZvciBmbjAxCisgKiBAZm4wMV9kYXRhX2Jhc2VfYWRkcjogZGF0YSBiYXNlIGFkZHJlc3MgZm9yIGZuMDEKKyAqIEBzZW5zb3JfbWF4X3g6IHNlbnNvciBtYXhpbXVtIHggdmFsdWUKKyAqIEBzZW5zb3JfbWF4X3k6IHNlbnNvciBtYXhpbXVtIHkgdmFsdWUKKyAqIEByZWd1bGF0b3I6IHBvaW50ZXIgdG8gdGhlIHJlZ3VsYXRvciBzdHJ1Y3R1cmUKKyAqIEB3YWl0OiB3YWl0IHF1ZXVlIHN0cnVjdHVyZSB2YXJpYWJsZQorICogQHRvdWNoX3N0b3BwZWQ6IGZsYWcgdG8gc3RvcCB0aGUgdGhyZWFkIGZ1bmN0aW9uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGRldmljZSBkYXRhIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSB7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RldmljZV9pbmZvIHJtaTRfbW9kX2luZm87CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXRfZGV2OworCXN0cnVjdCBpMmNfY2xpZW50CSppMmNfY2xpZW50OworCWNvbnN0IHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKwlzdHJ1Y3QgbXV0ZXgJCWZuX2xpc3RfbXV0ZXg7CisJc3RydWN0IG11dGV4CQlybWk0X3BhZ2VfbXV0ZXg7CisJaW50CQkJY3VycmVudF9wYWdlOworCXVuc2lnbmVkIGludAkJbnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3RlcjsKKwl1bnNpZ25lZCBzaG9ydAkJZm4wMV9jdHJsX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJZm4wMV9xdWVyeV9iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQJCWZuMDFfZGF0YV9iYXNlX2FkZHI7CisJaW50CQkJc2Vuc29yX21heF94OworCWludAkJCXNlbnNvcl9tYXhfeTsKKwlzdHJ1Y3QgcmVndWxhdG9yCSpyZWd1bGF0b3I7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKwlib29sCQkJdG91Y2hfc3RvcHBlZDsKK307CisKKy8qKgorICogc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UoKSAtIHNldHMgdGhlIHBhZ2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQGFkZHJlc3M6IHNldCB0aGUgYWRkcmVzcyBvZiB0aGUgcGFnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBhZ2UgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCXVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXVuc2lnbmVkIGNoYXIJdHhidWZbUEFHRV9MRU5dOworCWludAkJcmV0dmFsOworCXVuc2lnbmVkIGludAlwYWdlOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCXBhZ2UJPSAoKGFkZHJlc3MgPj4gOCkgJiBNQVNLXzhCSVQpOworCWlmIChwYWdlICE9IHBkYXRhLT5jdXJyZW50X3BhZ2UpIHsKKwkJdHhidWZbMF0JPSBNQVNLXzhCSVQ7CisJCXR4YnVmWzFdCT0gcGFnZTsKKwkJcmV0dmFsCT0gaTJjX21hc3Rlcl9zZW5kKGkyYywgdHhidWYsIFBBR0VfTEVOKTsKKwkJaWYgKHJldHZhbCAhPSBQQUdFX0xFTikKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6ZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJZWxzZQorCQkJcGRhdGEtPmN1cnJlbnRfcGFnZSA9IHBhZ2U7CisJfSBlbHNlCisJCXJldHZhbCA9IFBBR0VfTEVOOworCXJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKCkgLSByZWFkIHRoZSBibG9jayBvZiBkYXRhCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEBhZGRyZXNzOiByZWFkIHRoZSBibG9jayBvZiBkYXRhIGZyb20gdGhpcyBvZmZzZXQKKyAqIEB2YWxwOiBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgcmVhZAorICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIHRoZSBibG9jayBvZiBkYXRhIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQkJdW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKnZhbHAsIGludCBzaXplKQoreworCWludCByZXR2YWwgPSAwOworCWludCByZXRyeV9jb3VudCA9IDA7CisJaW50IGluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCW11dGV4X2xvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UocGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gUEFHRV9MRU4pCisJCWdvdG8gZXhpdDsKKwlpbmRleCA9IGFkZHJlc3MgJiBNQVNLXzhCSVQ7CityZXRyeToKKwlyZXR2YWwgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShpMmMsIGluZGV4LCBzaXplLCB2YWxwKTsKKwlpZiAocmV0dmFsICE9IHNpemUpIHsKKwkJaWYgKCsrcmV0cnlfY291bnQgPT0gTUFYX1JFVFJZX0NPVU5UKQorCQkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkJIiVzOmFkZHJlc3MgMHglMDR4IHNpemUgJWQgZmFpbGVkOiVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYWRkcmVzcywgc2l6ZSwgcmV0dmFsKTsKKwkJZWxzZSB7CisJCQlzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShwZGF0YSwgYWRkcmVzcyk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorZXhpdDoKKwltdXRleF91bmxvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9pMmNfYnl0ZV93cml0ZSgpIC0gd3JpdGUgdGhlIHNpbmdsZSBieXRlIGRhdGEKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQGFkZHJlc3M6IHdyaXRlIHRoZSBibG9jayBvZiBkYXRhIGZyb20gdGhpcyBvZmZzZXQKKyAqIEBkYXRhOiBkYXRhIHRvIGJlIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0byB3cml0ZSB0aGUgc2luZ2xlIGJ5dGUgZGF0YSBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGFkZHJlc3MsCisJCQkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciB0eGJ1ZlsyXTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKiBDYW4ndCBoYXZlIGFueW9uZSBlbHNlIGNoYW5naW5nIHRoZSBwYWdlIGJlaGluZCBvdXIgYmFja3MgKi8KKwltdXRleF9sb2NrKCYocGRhdGEtPnJtaTRfcGFnZV9tdXRleCkpOworCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UocGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gUEFHRV9MRU4pCisJCWdvdG8gZXhpdDsKKwl0eGJ1ZlswXQk9IGFkZHJlc3MgJiBNQVNLXzhCSVQ7CisJdHhidWZbMV0JPSBkYXRhOworCXJldHZhbAkJPSBpMmNfbWFzdGVyX3NlbmQocGRhdGEtPmkyY19jbGllbnQsIHR4YnVmLCAyKTsKKwkvKiBBZGQgaW4gcmV0cnkgb24gd3JpdGVzIG9ubHkgaW4gY2VydGlhbiBlcnJvciByZXR1cm4gdmFsdWVzICovCisJaWYgKHJldHZhbCAhPSAyKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6ZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJcmV0dmFsID0gLUVJTzsKKwl9IGVsc2UKKwkJcmV0dmFsID0gMTsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCYocGRhdGEtPnJtaTRfcGFnZV9tdXRleCkpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfcmVwb3J0KCkgLSByZXBvcnRzIGZvciB0aGUgcm1pNCB0b3VjaHBhZCBkZXZpY2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQHJmaTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9mbiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRvIHJlcG9ydHMgZm9yIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICovCitzdGF0aWMgaW50IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX3JlcG9ydChzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gKnJmaSkKK3sKKwkvKiBudW1iZXIgb2YgdG91Y2ggcG9pbnRzIC0gZmluZ2VycyBkb3duIGluIHRoaXMgY2FzZSAqLworCWludAl0b3VjaF9jb3VudCA9IDA7CisJaW50CWZpbmdlcjsKKwlpbnQJZmluZ2Vyc19zdXBwb3J0ZWQ7CisJaW50CWZpbmdlcl9yZWdpc3RlcnM7CisJaW50CXJlZzsKKwlpbnQJZmluZ2VyX3NoaWZ0OworCWludAlmaW5nZXJfc3RhdHVzOworCWludAlyZXR2YWw7CisJdW5zaWduZWQgc2hvcnQJZGF0YV9iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQJZGF0YV9vZmZzZXQ7CisJdW5zaWduZWQgY2hhcglkYXRhX3JlZ19ibGtfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCXZhbHVlc1syXTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbREFUQV9MRU5dOworCWludAl4W1JNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTXTsKKwlpbnQJeVtSTUk0X05VTUJFUl9PRl9NQVhfRklOR0VSU107CisJaW50CXd4W1JNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTXTsKKwlpbnQJd3lbUk1JNF9OVU1CRVJfT0ZfTUFYX0ZJTkdFUlNdOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qIGdldCAyRCBzZW5zb3IgZmluZ2VyIGRhdGEgKi8KKwkvKgorCSAqIEZpcnN0IGdldCB0aGUgZmluZ2VyIHN0YXR1cyBmaWVsZCAtIHRoZSBzaXplIG9mIHRoZSBmaW5nZXIgc3RhdHVzCisJICogZmllbGQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGZpbmdlciBzdXBwb3J0ZSAtIDIgYml0cyBwZXIKKwkgKiBmaW5nZXIsIHNvIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHJlYWQgaXM6CisJICogcmVnaXN0ZXJDb3VudCA9IGNlaWwobnVtYmVyT2ZGaW5nZXJzLzQpLgorCSAqIFJlYWQgdGhlIHJlcXVpcmVkIG51bWJlciBvZiByZWdpc3RlcnMgYW5kIGNoZWNrIGVhY2ggMiBiaXQgZmllbGQgdG8KKwkgKiBkZXRlcm1pbmUgaWYgYSBmaW5nZXIgaXMgZG93bjoKKwkgKgkwMCA9IGZpbmdlciBub3QgcHJlc2VudCwKKwkgKgkwMSA9IGZpbmdlciBwcmVzZW50IGFuZCBkYXRhIGFjY3VyYXRlLAorCSAqCTEwID0gZmluZ2VyIHByZXNlbnQgYnV0IGRhdGEgbWF5IG5vdCBiZSBhY2N1cmF0ZSwKKwkgKgkxMSA9IHJlc2VydmVkIGZvciBwcm9kdWN0IHVzZS4KKwkgKi8KKwlmaW5nZXJzX3N1cHBvcnRlZAk9IHJmaS0+bnVtX29mX2RhdGFfcG9pbnRzOworCWZpbmdlcl9yZWdpc3RlcnMJPSAoZmluZ2Vyc19zdXBwb3J0ZWQgKyAzKS80OworCWRhdGFfYmFzZV9hZGRyCQk9IHJmaS0+Zm5fZGVzYy5kYXRhX2Jhc2VfYWRkcjsKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwgZGF0YV9iYXNlX2FkZHIsIHZhbHVlcywKKwkJCQkJCQlmaW5nZXJfcmVnaXN0ZXJzKTsKKwlpZiAocmV0dmFsICE9IGZpbmdlcl9yZWdpc3RlcnMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZWFkIHN0YXR1cyByZWdpc3RlcnMgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEZvciBlYWNoIGZpbmdlciBwcmVzZW50LCByZWFkIHRoZSBwcm9wZXIgbnVtYmVyIG9mIHJlZ2lzdGVycworCSAqIHRvIGdldCBhYnNvbHV0ZSBkYXRhLgorCSAqLworCWRhdGFfcmVnX2Jsa19zaXplID0gcmZpLT5zaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s7CisJZm9yIChmaW5nZXIgPSAwOyBmaW5nZXIgPCBmaW5nZXJzX3N1cHBvcnRlZDsgZmluZ2VyKyspIHsKKwkJLyogZGV0ZXJtaW5lIHdoaWNoIGRhdGEgYnl0ZSB0aGUgZmluZ2VyIHN0YXR1cyBpcyBpbiAqLworCQlyZWcgPSBmaW5nZXIvNDsKKwkJLyogYml0IHNoaWZ0IHRvIGdldCBmaW5nZXIncyBzdGF0dXMgKi8KKwkJZmluZ2VyX3NoaWZ0CT0gKGZpbmdlciAlIDQpICogMjsKKwkJZmluZ2VyX3N0YXR1cwk9ICh2YWx1ZXNbcmVnXSA+PiBmaW5nZXJfc2hpZnQpICYgMzsKKwkJLyoKKwkJICogaWYgZmluZ2VyIHN0YXR1cyBpbmRpY2F0ZXMgYSBmaW5nZXIgaXMgcHJlc2VudCB0aGVuCisJCSAqIHJlYWQgdGhlIGZpbmdlciBkYXRhIGFuZCByZXBvcnQgaXQKKwkJICovCisJCWlmIChmaW5nZXJfc3RhdHVzID09IDEgfHwgZmluZ2VyX3N0YXR1cyA9PSAyKSB7CisJCQkvKiBSZWFkIHRoZSBmaW5nZXIgZGF0YSAqLworCQkJZGF0YV9vZmZzZXQgPSBkYXRhX2Jhc2VfYWRkciArCisJCQkJCSgoZmluZ2VyICogZGF0YV9yZWdfYmxrX3NpemUpICsKKwkJCQkJZmluZ2VyX3JlZ2lzdGVycyk7CisJCQlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwKKwkJCQkJCWRhdGFfb2Zmc2V0LCBkYXRhLAorCQkJCQkJZGF0YV9yZWdfYmxrX3NpemUpOworCQkJaWYgKHJldHZhbCAhPSBkYXRhX3JlZ19ibGtfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6cmVhZCBkYXRhIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQl4W3RvdWNoX2NvdW50XQk9CisJCQkJCShkYXRhWzBdIDw8IDQpIHwgKGRhdGFbMl0gJiBNQVNLXzRCSVQpOworCQkJCXlbdG91Y2hfY291bnRdCT0KKwkJCQkJKGRhdGFbMV0gPDwgNCkgfAorCQkJCQkoKGRhdGFbMl0gPj4gNCkgJiBNQVNLXzRCSVQpOworCQkJCXd5W3RvdWNoX2NvdW50XQk9CisJCQkJCQkoZGF0YVszXSA+PiA0KSAmIE1BU0tfNEJJVDsKKwkJCQl3eFt0b3VjaF9jb3VudF0JPQorCQkJCQkJKGRhdGFbM10gJiBNQVNLXzRCSVQpOworCisJCQkJaWYgKHBkYXRhLT5ib2FyZC0+eF9mbGlwKQorCQkJCQl4W3RvdWNoX2NvdW50XSA9CisJCQkJCQlwZGF0YS0+c2Vuc29yX21heF94IC0KKwkJCQkJCQkJeFt0b3VjaF9jb3VudF07CisJCQkJaWYgKHBkYXRhLT5ib2FyZC0+eV9mbGlwKQorCQkJCQl5W3RvdWNoX2NvdW50XSA9CisJCQkJCQlwZGF0YS0+c2Vuc29yX21heF95IC0KKwkJCQkJCQkJeVt0b3VjaF9jb3VudF07CisJCQl9CisJCQkvKiBudW1iZXIgb2YgYWN0aXZlIHRvdWNoIHBvaW50cyAqLworCQkJdG91Y2hfY291bnQrKzsKKwkJfQorCX0KKworCS8qIHJlcG9ydCB0byBpbnB1dCBzdWJzeXN0ZW0gKi8KKwlpZiAodG91Y2hfY291bnQpIHsKKwkJZm9yIChmaW5nZXIgPSAwOyBmaW5nZXIgPCB0b3VjaF9jb3VudDsgZmluZ2VyKyspIHsKKwkJCWlucHV0X3JlcG9ydF9hYnMocGRhdGEtPmlucHV0X2RldiwgQUJTX01UX1RPVUNIX01BSk9SLAorCQkJCQkJbWF4KHd4W2Zpbmdlcl0gLCB3eVtmaW5nZXJdKSk7CisJCQlpbnB1dF9yZXBvcnRfYWJzKHBkYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQkJCQl4W2Zpbmdlcl0pOworCQkJaW5wdXRfcmVwb3J0X2FicyhwZGF0YS0+aW5wdXRfZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKKwkJCQkJCQkJeVtmaW5nZXJdKTsKKwkJCWlucHV0X210X3N5bmMocGRhdGEtPmlucHV0X2Rldik7CisJCX0KKwl9IGVsc2UKKwkJaW5wdXRfbXRfc3luYyhwZGF0YS0+aW5wdXRfZGV2KTsKKworCS8qIHN5bmMgYWZ0ZXIgZ3JvdXBzIG9mIGV2ZW50cyAqLworCWlucHV0X3N5bmMocGRhdGEtPmlucHV0X2Rldik7CisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgdG91Y2ggcG9pbnRzICovCisJcmV0dXJuIHRvdWNoX2NvdW50OworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X3JlcG9ydF9kZXZpY2UoKSAtIHJlcG9ydHMgdGhlIHJtaTQgZGV2aWNlCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZmk6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZm4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2FsbCB0aGUgcmVwb3J0IGZ1bmN0aW9uIG9mIHRoZSBybWk0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9yZXBvcnRfZGV2aWNlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuICpyZmkpCit7CisJaW50IHRvdWNoID0gMDsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisJc3RhdGljIGludCBudW1fZXJyb3JfcmVwb3J0czsKKwlpZiAocmZpLT5mbl9udW1iZXIgIT0gU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0pIHsKKwkJbnVtX2Vycm9yX3JlcG9ydHMrKzsKKwkJaWYgKG51bV9lcnJvcl9yZXBvcnRzIDwgTUFYX0VSUk9SX1JFUE9SVCkKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6cmVwb3J0IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwl9IGVsc2UKKwkJdG91Y2ggPSBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9yZXBvcnQocGRhdGEsIHJmaSk7CisJcmV0dXJuIHRvdWNoOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KCkgLSByZXBvcnRzIHRvIGlucHV0IHN1YnN5c3RlbQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWRzIGluIGFsbCBkYXRhIHNvdXJjZXMgYW5kIHJlcG9ydHMKKyAqIHRoZW0gdG8gdGhlIGlucHV0IHN1YnN5c3RlbS4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyCWludHJfc3RhdHVzWzRdOworCS8qIG51bWJlciBvZiB0b3VjaCBwb2ludHMgLSBmaW5nZXJzIG9yIGJ1dHRvbnMgKi8KKwlpbnQgdG91Y2ggPSAwOworCXVuc2lnbmVkIGludCByZXR2YWw7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuCQkqcmZpOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kZXZpY2VfaW5mbwkqcm1pOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qCisJICogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uICQwMQorCSAqIGNvbnRyb2wgcmVnaXN0ZXIrMSB0byBmaW5kIHdoaWNoIHNvdXJjZShzKSB3ZXJlIGludGVycnVwdGluZworCSAqIHNvIHdlIGNhbiByZWFkIHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZShzKSAoMkQgc2Vuc29yLCBidXR0b25zLi4pCisJICovCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsCisJCQkJCXBkYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwKKwkJCQkJaW50cl9zdGF0dXMsCisJCQkJCXBkYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlpZiAocmV0dmFsICE9IHBkYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJjb3VsZCBub3QgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyc1xuIik7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIGNoZWNrIGVhY2ggZnVuY3Rpb24gdGhhdCBoYXMgZGF0YSBzb3VyY2VzIGFuZCBpZiB0aGUgaW50ZXJydXB0IGZvcgorCSAqIHRoYXQgdHJpZ2dlcmVkIHRoZW4gY2FsbCB0aGF0IFJNSTQgZnVuY3Rpb25zIHJlcG9ydCgpIGZ1bmN0aW9uIHRvCisJICogZ2F0aGVyIGRhdGEgYW5kIHJlcG9ydCBpdCB0byB0aGUgaW5wdXQgc3Vic3lzdGVtCisJICovCisJcm1pID0gJihwZGF0YS0+cm1pNF9tb2RfaW5mbyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZmksICZybWktPnN1cHBvcnRfZm5fbGlzdCwgbGluaykgeworCQlpZiAocmZpLT5udW1fb2ZfZGF0YV9zb3VyY2VzKSB7CisJCQlpZiAoaW50cl9zdGF0dXNbcmZpLT5pbmRleF90b19pbnRyX3JlZ10gJgorCQkJCQkJCXJmaS0+aW50cl9tYXNrKQorCQkJCXRvdWNoID0gc3luYXB0aWNzX3JtaTRfcmVwb3J0X2RldmljZShwZGF0YSwKKwkJCQkJCQkJCXJmaSk7CisJCX0KKwl9CisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgdG91Y2ggcG9pbnRzICovCisJcmV0dXJuIHRvdWNoOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X2lycSgpIC0gdGhyZWFkIGZ1bmN0aW9uIGZvciBybWk0IGF0dGVudGlvbiBsaW5lCisgKiBAaXJxOiBpcnEgdmFsdWUKKyAqIEBkYXRhOiB2b2lkIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVycnVwdCB0aHJlYWQgZnVuY3Rpb24uIEl0IGp1c3Qgbm90aWZpZXMgdGhlCisgKiBhcHBsaWNhdGlvbiBsYXllciB0aGF0IGF0dGVudGlvbiBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHN5bmFwdGljc19ybWk0X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSA9IGRhdGE7CisJaW50IHRvdWNoX2NvdW50OworCWRvIHsKKwkJdG91Y2hfY291bnQgPSBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KHBkYXRhKTsKKwkJaWYgKHRvdWNoX2NvdW50KQorCQkJd2FpdF9ldmVudF90aW1lb3V0KHBkYXRhLT53YWl0LCBwZGF0YS0+dG91Y2hfc3RvcHBlZCwKKwkJCQkJCQltc2Vjc190b19qaWZmaWVzKDEpKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIXBkYXRhLT50b3VjaF9zdG9wcGVkKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfZGV0ZWN0KCkgLSBkZXRlY3RzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAcmZpOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuIHN0cnVjdHVyZQorICogQGZkOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuX2Rlc2Mgc3RydWN0dXJlCisgKiBAaW50ZXJydXB0Y291bnQ6IGNvdW50IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdG8gZGV0ZWN0cyB0aGUgcm1pNCB0b3VjaHBhZCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9kZXRlY3Qoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gKnJmaSwKKwkJCQkJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MgKmZkLAorCQkJCQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0Y291bnQpCit7CisJdW5zaWduZWQgY2hhcglxdWVyaWVzW1FVRVJZX0xFTl07CisJdW5zaWduZWQgc2hvcnQJaW50cl9vZmZzZXQ7CisJdW5zaWduZWQgY2hhcglhYnNfZGF0YV9zaXplOworCXVuc2lnbmVkIGNoYXIJYWJzX2RhdGFfYmxrX3NpemU7CisJdW5zaWduZWQgY2hhcgllZ3JfMCwgZWdyXzE7CisJdW5zaWduZWQgaW50CWFsbF9kYXRhX2Jsa19zaXplOworCWludAloYXNfcGluY2gsIGhhc19mbGljaywgaGFzX3RhcDsKKwlpbnQJaGFzX3RhcGFuZGhvbGQsIGhhc19kb3VibGV0YXA7CisJaW50CWhhc19lYXJseXRhcCwgaGFzX3ByZXNzOworCWludAloYXNfcGFsbWRldGVjdCwgaGFzX3JvdGF0ZTsKKwlpbnQJaGFzX3JlbDsKKwlpbnQJaTsKKwlpbnQJcmV0dmFsOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCXJmaS0+Zm5fZGVzYy5xdWVyeV9iYXNlX2FkZHIJPSBmZC0+cXVlcnlfYmFzZV9hZGRyOworCXJmaS0+Zm5fZGVzYy5kYXRhX2Jhc2VfYWRkcgk9IGZkLT5kYXRhX2Jhc2VfYWRkcjsKKwlyZmktPmZuX2Rlc2MuaW50cl9zcmNfY291bnQJPSBmZC0+aW50cl9zcmNfY291bnQ7CisJcmZpLT5mbl9kZXNjLmZuX251bWJlcgkJPSBmZC0+Zm5fbnVtYmVyOworCXJmaS0+Zm5fbnVtYmVyCQkJPSBmZC0+Zm5fbnVtYmVyOworCXJmaS0+bnVtX29mX2RhdGFfc291cmNlcwk9IGZkLT5pbnRyX3NyY19jb3VudDsKKwlyZmktPmZuX2Rlc2MuY3RybF9iYXNlX2FkZHIJPSBmZC0+Y3RybF9iYXNlX2FkZHI7CisJcmZpLT5mbl9kZXNjLmNtZF9iYXNlX2FkZHIJPSBmZC0+Y21kX2Jhc2VfYWRkcjsKKworCS8qCisJICogbmVlZCB0byBnZXQgbnVtYmVyIG9mIGZpbmdlcnMgc3VwcG9ydGVkLCBkYXRhIHNpemUsIGV0Yy4KKwkgKiB0byBiZSB1c2VkIHdoZW4gZ2V0dGluZyBkYXRhIHNpbmNlIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvCisJICogcmVhZCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZmluZ2VycyBzdXBwb3J0ZWQgYW5kIGRhdGEgc2l6ZS4KKwkgKi8KKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwgZmQtPnF1ZXJ5X2Jhc2VfYWRkciwKKwkJCQkJCQlxdWVyaWVzLAorCQkJCQkJCXNpemVvZihxdWVyaWVzKSk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YocXVlcmllcykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZWFkIGZ1bmN0aW9uIHF1ZXJ5IHJlZ2lzdGVyc1xuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCS8qCisJICogMkQgZGF0YSBzb3VyY2VzIGhhdmUgb25seSAzIGJpdHMgZm9yIHRoZSBudW1iZXIgb2YgZmluZ2VycworCSAqIHN1cHBvcnRlZCAtIHNvIHRoZSBlbmNvZGluZyBpcyBhIGJpdCB3aWVyZC4KKwkgKi8KKwlpZiAoKHF1ZXJpZXNbMV0gJiBNQVNLXzNCSVQpIDw9IDQpCisJCS8qIGFkZCAxIHNpbmNlIHplcm8gYmFzZWQgKi8KKwkJcmZpLT5udW1fb2ZfZGF0YV9wb2ludHMgPSAocXVlcmllc1sxXSAmIE1BU0tfM0JJVCkgKyAxOworCWVsc2UgeworCQkvKgorCQkgKiBhIHZhbHVlIG9mIDUgaXMgdXAgdG8gMTAgZmluZ2VycyAtIDYgYW5kIDcgYXJlIHJlc2VydmVkCisJCSAqIChzaG91bGRuJ3QgZ2V0IHRoZXNlIGkgaW50IHJldHZhbDtuIGEgbm9ybWFsIDJEIHNvdXJjZSkuCisJCSAqLworCQlpZiAoKHF1ZXJpZXNbMV0gJiBNQVNLXzNCSVQpID09IDUpCisJCQlyZmktPm51bV9vZl9kYXRhX3BvaW50cyA9IDEwOworCX0KKwkvKiBOZWVkIHRvIGdldCBpbnRlcnJ1cHQgaW5mbyBmb3IgaGFuZGxpbmcgaW50ZXJydXB0cyAqLworCXJmaS0+aW5kZXhfdG9faW50cl9yZWcgPSAoaW50ZXJydXB0Y291bnQgKyA3KS84OworCWlmIChyZmktPmluZGV4X3RvX2ludHJfcmVnICE9IDApCisJCXJmaS0+aW5kZXhfdG9faW50cl9yZWcgLT0gMTsKKwkvKgorCSAqIGxvb3AgdGhyb3VnaCBpbnRlcnJ1cHRzIGZvciBlYWNoIHNvdXJjZSBpbiBmbiAkMTEKKwkgKiBhbmQgb3IgaW4gYSBiaXQgdG8gdGhlIGludGVycnVwdCBtYXNrIGZvciBlYWNoLgorCSAqLworCWludHJfb2Zmc2V0ID0gaW50ZXJydXB0Y291bnQgJSA4OworCXJmaS0+aW50cl9tYXNrID0gMDsKKwlmb3IgKGkgPSBpbnRyX29mZnNldDsKKwkJaSA8ICgoZmQtPmludHJfc3JjX2NvdW50ICYgTUFTS18zQklUKSArIGludHJfb2Zmc2V0KTsgaSsrKQorCQlyZmktPmludHJfbWFzayB8PSAxIDw8IGk7CisKKwkvKiBTaXplIG9mIGp1c3QgdGhlIGFic29sdXRlIGRhdGEgZm9yIG9uZSBmaW5nZXIgKi8KKwlhYnNfZGF0YV9zaXplCT0gcXVlcmllc1s1XSAmIE1BU0tfMkJJVDsKKwkvKiBPbmUgZWFjaCBmb3IgWCBhbmQgWSwgb25lIGZvciBMU0IgZm9yIFggJiBZLCBvbmUgZm9yIFcsIG9uZSBmb3IgWiAqLworCWFic19kYXRhX2Jsa19zaXplID0gMyArICgyICogKGFic19kYXRhX3NpemUgPT0gMCA/IDEgOiAwKSk7CisJcmZpLT5zaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2sgPSBhYnNfZGF0YV9ibGtfc2l6ZTsKKworCS8qCisJICogbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZGF0YSB0byByZWFkIC0gdGhpcyBkZXBlbmRzIG9uCisJICogY29uZGl0aW9ucyBzdWNoIGFzIHdoZXRoZXIgUmVsYXRpdmUgZGF0YSBpcyByZXBvcnRlZCBhbmQgaWYgR2VzdHVyZQorCSAqIGRhdGEgaXMgcmVwb3J0ZWQuCisJICovCisJZWdyXzAgPSBxdWVyaWVzWzddOworCWVncl8xID0gcXVlcmllc1s4XTsKKworCS8qCisJICogR2V0IGluZm8gYWJvdXQgd2hhdCBFR1IgZGF0YSBpcyBzdXBwb3J0ZWQsIHdoZXRoZXIgaXQgaGFzCisJICogUmVsYXRpdmUgZGF0YSBzdXBwb3J0ZWQsIGV0Yy4KKwkgKi8KKwloYXNfcGluY2gJPSBlZ3JfMCAmIEhBU19QSU5DSDsKKwloYXNfZmxpY2sJPSBlZ3JfMCAmIEhBU19GTElDSzsKKwloYXNfdGFwCQk9IGVncl8wICYgSEFTX1RBUDsKKwloYXNfZWFybHl0YXAJPSBlZ3JfMCAmIEhBU19FQVJMWVRBUDsKKwloYXNfcHJlc3MJPSBlZ3JfMCAmIEhBU19QUkVTUzsKKwloYXNfcm90YXRlCT0gZWdyXzEgJiBIQVNfUk9UQVRFOworCWhhc19yZWwJCT0gcXVlcmllc1sxXSAmIEhBU19SRUxFQVNFOworCWhhc190YXBhbmRob2xkCT0gZWdyXzAgJiBIQVNfVEFQQU5ESE9MRDsKKwloYXNfZG91YmxldGFwCT0gZWdyXzAgJiBIQVNfRE9VQkxFVEFQOworCWhhc19wYWxtZGV0ZWN0CT0gZWdyXzEgJiBIQVNfUEFMTURFVEVDVDsKKworCS8qCisJICogU2l6ZSBvZiBhbGwgZGF0YSBpbmNsdWRpbmcgZmluZ2VyIHN0YXR1cywgYWJzb2x1dGUgZGF0YSBmb3IgZWFjaAorCSAqIGZpbmdlciwgcmVsYXRpdmUgZGF0YSBhbmQgRUdSIGRhdGEKKwkgKi8KKwlhbGxfZGF0YV9ibGtfc2l6ZSA9CisJCS8qIGZpbmdlciBzdGF0dXMsIGZvdXIgZmluZ2VycyBwZXIgcmVnaXN0ZXIgKi8KKwkJKChyZmktPm51bV9vZl9kYXRhX3BvaW50cyArIDMpIC8gNCkgKworCQkvKiBhYnNvbHV0ZSBkYXRhLCBwZXIgZmluZ2VyIHRpbWVzIG51bWJlciBvZiBmaW5nZXJzICovCisJCShhYnNfZGF0YV9ibGtfc2l6ZSAqIHJmaS0+bnVtX29mX2RhdGFfcG9pbnRzKSArCisJCS8qCisJCSAqIHR3byByZWxhdGl2ZSByZWdpc3RlcnMgKGlmIHJlbGF0aXZlIGlzIGJlaW5nIHJlcG9ydGVkKQorCQkgKi8KKwkJMiAqIGhhc19yZWwgKworCQkvKgorCQkgKiBGMTFfMkRfZGF0YTggaXMgb25seSBwcmVzZW50IGlmIHRoZSBlZ3JfMAorCQkgKiByZWdpc3RlciBpcyBub24temVyby4KKwkJICovCisJCSEhKGVncl8wKSArCisJCS8qCisJCSAqIEYxMV8yRF9kYXRhOSBpcyBvbmx5IHByZXNlbnQgaWYgZWl0aGVyIGVncl8wIG9yCisJCSAqIGVncl8xIHJlZ2lzdGVycyBhcmUgbm9uLXplcm8uCisJCSAqLworCQkoZWdyXzAgfHwgZWdyXzEpICsKKwkJLyoKKwkJICogRjExXzJEX2RhdGExMCBpcyBvbmx5IHByZXNlbnQgaWYgRUdSX1BJTkNIIG9yIEVHUl9GTElDSyBvZgorCQkgKiBlZ3JfMCByZXBvcnRzIGFzIDEuCisJCSAqLworCQkhIShoYXNfcGluY2ggfCBoYXNfZmxpY2spICsKKwkJLyoKKwkJICogRjExXzJEX2RhdGExMSBhbmQgRjExXzJEX2RhdGExMiBhcmUgb25seSBwcmVzZW50IGlmCisJCSAqIEVHUl9GTElDSyBvZiBlZ3JfMCByZXBvcnRzIGFzIDEuCisJCSAqLworCQkyICogISEoaGFzX2ZsaWNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHN5bnBhdGljc19ybWk0X3RvdWNocGFkX2NvbmZpZygpIC0gY29uZml1cmVzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAcmZpOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdG8gY29uZml1cmVzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICovCitpbnQgc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfY29uZmlnKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpKQoreworCS8qCisJICogRm9yIHRoZSBkYXRhIHNvdXJjZSAtIHByaW50IGluZm8gYW5kIGRvIGFueQorCSAqIHNvdXJjZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorCSAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVtCVUZfTEVOXTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKiBHZXQgYW5kIHByaW50IHNvbWUgaW5mbyBhYm91dCB0aGUgZGF0YSBzb3VyY2UuLi4gKi8KKwkvKiBUbyBRdWVyeSAyRCBkZXZpY2VzIHdlIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSBhZGRyZXNzIG9idGFpbmVkCisJICogZnJvbSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBzdG9yZWQgaW4gdGhlIFJNSSBmdW5jdGlvbiBpbmZvLgorCSAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQkJcmZpLT5mbl9kZXNjLnF1ZXJ5X2Jhc2VfYWRkciwKKwkJCQkJCWRhdGEsIFFVRVJZX0xFTik7CisJaWYgKHJldHZhbCAhPSBRVUVSWV9MRU4pCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6cmVhZCBxdWVyeSByZWdpc3RlcnMgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJZWxzZSB7CisJCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQkJcmZpLT5mbl9kZXNjLmN0cmxfYmFzZV9hZGRyLAorCQkJCQkJZGF0YSwgREFUQV9CVUZfTEVOKTsKKwkJaWYgKHJldHZhbCAhPSBEQVRBX0JVRl9MRU4pIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIlczpyZWFkIGNvbnRyb2wgcmVnaXN0ZXJzIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQkvKiBTdG9yZSB0aGVzZSBmb3IgdXNlIGxhdGVyKi8KKwkJcGRhdGEtPnNlbnNvcl9tYXhfeCA9ICgoZGF0YVs2XSAmIE1BU0tfOEJJVCkgPDwgMCkgfAorCQkJCQkJKChkYXRhWzddICYgTUFTS180QklUKSA8PCA4KTsKKwkJcGRhdGEtPnNlbnNvcl9tYXhfeSA9ICgoZGF0YVs4XSAmIE1BU0tfNUJJVCkgPDwgMCkgfAorCQkJCQkJKChkYXRhWzldICYgTUFTS180QklUKSA8PCA4KTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9pMmNfcXVlcnlfZGV2aWNlKCkgLSBxdWVyeSB0aGUgcm1pNCBkZXZpY2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBxdWVyeSB0aGUgcm1pNCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc3luYXB0aWNzX3JtaTRfaTJjX3F1ZXJ5X2RldmljZShzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEpCit7CisJaW50IGk7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIHN0ZF9xdWVyaWVzW1NURF9RVUVSWV9MRU5dOworCXVuc2lnbmVkIGNoYXIgaW50cl9jb3VudCA9IDA7CisJaW50IGRhdGFfc291cmNlcyA9IDA7CisJdW5zaWduZWQgaW50IGN0cmxfb2Zmc2V0OworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjCXJtaV9mZDsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8gKnJtaTsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKgorCSAqIGluaXQgdGhlIHBoeXNpY2FsIGRyaXZlcnMgUk1JIG1vZHVsZQorCSAqIGluZm8gbGlzdCBvZiBmdW5jdGlvbnMKKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcGRhdGEtPnJtaTRfbW9kX2luZm8uc3VwcG9ydF9mbl9saXN0KTsKKworCS8qCisJICogUmVhZCB0aGUgUGFnZSBEZXNjcmlwdG9yIFRhYmxlIHRvIGRldGVybWluZSB3aGF0IGZ1bmN0aW9ucworCSAqIGFyZSBwcmVzZW50CisJICovCisJZm9yIChpID0gUERUX1NUQVJUX1NDQU5fTE9DQVRJT047IGkgPiBQRFRfRU5EX1NDQU5fTE9DQVRJT047CisJCQkJCQlpIC09IFBEVF9FTlRSWV9TSVpFKSB7CisJCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLCBpLAorCQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmcm1pX2ZkLAorCQkJCQkJc2l6ZW9mKHJtaV9mZCkpOworCQlpZiAocmV0dmFsICE9IHNpemVvZihybWlfZmQpKSB7CisJCQkvKiBmYWlsZWQgdG8gcmVhZCBuZXh0IFBEVCBlbnRyeSAqLworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmZpID0gTlVMTDsKKwkJaWYgKHJtaV9mZC5mbl9udW1iZXIpIHsKKwkJCXN3aXRjaCAocm1pX2ZkLmZuX251bWJlciAmIE1BU0tfOEJJVCkgeworCQkJY2FzZSBTWU5BUFRJQ1NfUk1JNF9ERVZJQ0VfQ09OVFJPTF9GVU5DX05VTToKKwkJCQlwZGF0YS0+Zm4wMV9xdWVyeV9iYXNlX2FkZHIgPQorCQkJCQkJcm1pX2ZkLnF1ZXJ5X2Jhc2VfYWRkcjsKKwkJCQlwZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciA9CisJCQkJCQlybWlfZmQuY3RybF9iYXNlX2FkZHI7CisJCQkJcGRhdGEtPmZuMDFfZGF0YV9iYXNlX2FkZHIgPQorCQkJCQkJcm1pX2ZkLmRhdGFfYmFzZV9hZGRyOworCQkJCWJyZWFrOworCQkJY2FzZSBTWU5BUFRJQ1NfUk1JNF9UT1VDSFBBRF9GVU5DX05VTToKKwkJCQlpZiAocm1pX2ZkLmludHJfc3JjX2NvdW50KSB7CisJCQkJCXJmaSA9IGttYWxsb2Moc2l6ZW9mKCpyZmkpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQkJaWYgKCFyZmkpIHsKKwkJCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkJCSIlczprbWFsbG9jIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQl9CisJCQkJCXJldHZhbCA9IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX2RldGVjdAorCQkJCQkJCQkocGRhdGEsCXJmaSwKKwkJCQkJCQkJJnJtaV9mZCwKKwkJCQkJCQkJaW50cl9jb3VudCk7CisJCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBpbnRlcnJ1cHQgY291bnQgZm9yIG5leHQgaXRlcmF0aW9uICovCisJCQlpbnRyX2NvdW50ICs9IChybWlfZmQuaW50cl9zcmNfY291bnQgJiBNQVNLXzNCSVQpOworCQkJLyoKKwkJCSAqIFdlIG9ubHkgd2FudCB0byBhZGQgZnVuY3Rpb25zIHRvIHRoZSBsaXN0CisJCQkgKiB0aGF0IGhhdmUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKwkJCSAqLworCQkJaWYgKHJmaSAmJiBybWlfZmQuaW50cl9zcmNfY291bnQpIHsKKwkJCQkvKiBsaW5rIHRoaXMgZnVuY3Rpb24gaW5mbyB0byB0aGUgUk1JIG1vZHVsZSAqLworCQkJCW11dGV4X2xvY2soJihwZGF0YS0+Zm5fbGlzdF9tdXRleCkpOworCQkJCWxpc3RfYWRkX3RhaWwoJnJmaS0+bGluaywKKwkJCQkJJnBkYXRhLT5ybWk0X21vZF9pbmZvLnN1cHBvcnRfZm5fbGlzdCk7CisJCQkJbXV0ZXhfdW5sb2NrKCYocGRhdGEtPmZuX2xpc3RfbXV0ZXgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBIHplcm8gaW4gdGhlIGZ1bmN0aW9uIG51bWJlcgorCQkJICogc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBQRFQKKwkJCSAqLworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkJIiVzOmVuZCBvZiBQRFRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogY2FsY3VsYXRlIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgY291bnQgLSB1c2VkIGluIHRoZQorCSAqIElTUiB0byByZWFkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBpbnRlcnJ1cHQgcmVnaXN0ZXJzCisJICovCisJcGRhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXIgPSAoaW50cl9jb3VudCArIDcpIC8gODsKKwkvKgorCSAqIEZ1bmN0aW9uICQwMSB3aWxsIGJlIHVzZWQgdG8gcXVlcnkgdGhlIHByb2R1Y3QgcHJvcGVydGllcywKKwkgKiBhbmQgcHJvZHVjdCBJRCAgc28gd2UgaGFkIHRvIHJlYWQgdGhlIFBEVCBhYm92ZSBmaXJzdCB0byBnZXQKKwkgKiB0aGUgRm4gJDAxIHF1ZXJ5IGFkZHJlc3MgYW5kIHByaW9yIHRvIGZpbGxpbmcgaW4gdGhlIHByb2R1Y3QKKwkgKiBpbmZvLiBOT1RFOiBFdmVuIGFuIHVuZmxhc2hlZCBkZXZpY2Ugd2lsbCBzdGlsbCBoYXZlIEZOICQwMS4KKwkgKi8KKworCS8qIExvYWQgdXAgdGhlIHN0YW5kYXJkIHF1ZXJpZXMgYW5kIGdldCB0aGUgUk1JNCBtb2R1bGUgaW5mbyAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQlwZGF0YS0+Zm4wMV9xdWVyeV9iYXNlX2FkZHIsCisJCQkJCXN0ZF9xdWVyaWVzLAorCQkJCQlzaXplb2Yoc3RkX3F1ZXJpZXMpKTsKKwlpZiAocmV0dmFsICE9IHNpemVvZihzdGRfcXVlcmllcykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpGYWlsZWQgcmVhZGluZyBxdWVyaWVzXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJIHJldHVybiAtRUlPOworCX0KKworCS8qIEN1cnJlbnRseSBzdXBwb3J0ZWQgUk1JIHZlcnNpb24gaXMgNC4wICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8udmVyc2lvbl9tYWpvcgk9IDQ7CisJcGRhdGEtPnJtaTRfbW9kX2luZm8udmVyc2lvbl9taW5vcgk9IDA7CisJLyoKKwkgKiBnZXQgbWFudWZhY3R1cmVyIGlkLCBwcm9kdWN0X3Byb3BzLCBwcm9kdWN0IGluZm8sCisJICogZGF0ZSBjb2RlLCB0ZXN0ZXIgaWQsIHNlcmlhbCBudW0gYW5kIHByb2R1Y3QgaWQgKG5hbWUpCisJICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkCT0gc3RkX3F1ZXJpZXNbMF07CisJcGRhdGEtPnJtaTRfbW9kX2luZm8ucHJvZHVjdF9wcm9wcwk9IHN0ZF9xdWVyaWVzWzFdOworCXBkYXRhLT5ybWk0X21vZF9pbmZvLnByb2R1Y3RfaW5mb1swXQk9IHN0ZF9xdWVyaWVzWzJdOworCXBkYXRhLT5ybWk0X21vZF9pbmZvLnByb2R1Y3RfaW5mb1sxXQk9IHN0ZF9xdWVyaWVzWzNdOworCS8qIHllYXIgLSAyMDAxLTIwMzIgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5kYXRlX2NvZGVbMF0JPSBzdGRfcXVlcmllc1s0XSAmIE1BU0tfNUJJVDsKKwkvKiBtb250aCAtIDEtMTIgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5kYXRlX2NvZGVbMV0JPSBzdGRfcXVlcmllc1s1XSAmIE1BU0tfNEJJVDsKKwkvKiBkYXkgLSAxLTMxICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8uZGF0ZV9jb2RlWzJdCT0gc3RkX3F1ZXJpZXNbNl0gJiBNQVNLXzVCSVQ7CisJcGRhdGEtPnJtaTRfbW9kX2luZm8udGVzdGVyX2lkID0gKChzdGRfcXVlcmllc1s3XSAmIE1BU0tfN0JJVCkgPDwgOCkgfAorCQkJCQkJKHN0ZF9xdWVyaWVzWzhdICYgTUFTS183QklUKTsKKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5zZXJpYWxfbnVtYmVyID0KKwkJKChzdGRfcXVlcmllc1s5XSAmIE1BU0tfN0JJVCkgPDwgOCkgfAorCQkJCShzdGRfcXVlcmllc1sxMF0gJiBNQVNLXzdCSVQpOworCW1lbWNweShwZGF0YS0+cm1pNF9tb2RfaW5mby5wcm9kdWN0X2lkX3N0cmluZywgJnN0ZF9xdWVyaWVzWzExXSwgMTApOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFN5bmFwdGljcyBkZXZpY2UgLSByZXBvcnQgaWYgbm90LiAqLworCWlmIChwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQgIT0gMSkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm9uLVN5bmFwdGljcyBtZmcgaWQ6JWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmZpLCAmcGRhdGEtPnJtaTRfbW9kX2luZm8uc3VwcG9ydF9mbl9saXN0LCBsaW5rKQorCQlkYXRhX3NvdXJjZXMgKz0gcmZpLT5udW1fb2ZfZGF0YV9zb3VyY2VzOworCWlmIChkYXRhX3NvdXJjZXMpIHsKKwkJcm1pID0gJihwZGF0YS0+cm1pNF9tb2RfaW5mbyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmZpLCAmcm1pLT5zdXBwb3J0X2ZuX2xpc3QsIGxpbmspIHsKKwkJCWlmIChyZmktPm51bV9vZl9kYXRhX3NvdXJjZXMpIHsKKwkJCQlpZiAocmZpLT5mbl9udW1iZXIgPT0KKwkJCQkJU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0pIHsKKwkJCQkJcmV0dmFsID0gc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfY29uZmlnCisJCQkJCQkJCShwZGF0YSwgcmZpKTsKKwkJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZQorCQkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkJCSIlczpmbl9udW1iZXIgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCS8qCisJCQkJICogVHVybiBvbiBpbnRlcnJ1cHRzIGZvciB0aGlzCisJCQkJICogZnVuY3Rpb24ncyBkYXRhIHNvdXJjZXMuCisJCQkJICovCisJCQkJY3RybF9vZmZzZXQgPSBwZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciArIDEgKworCQkJCQkJCXJmaS0+aW5kZXhfdG9faW50cl9yZWc7CisJCQkJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2J5dGVfd3JpdGUocGRhdGEsCisJCQkJCQkJY3RybF9vZmZzZXQsCisJCQkJCQkJcmZpLT5pbnRyX21hc2spOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X3Byb2JlKCkgLSBJbml0aWFsemUgdGhlIGkyYy1jbGllbnQgdG91Y2hzY3JlZW4gZHJpdmVyCisgKiBAaTJjOiBpMmMgY2xpZW50IHN0cnVjdHVyZSBwb2ludGVyCisgKiBAaWQ6aTJjIGRldmljZSBpZCBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbnN0YW5jZQorICogZGF0YSBhbmQgcmVxdWVzdCB0aGUgaXJxIGFuZCBzZXQgdGhlIGluc3RhbmNlIGRhdGEgYXMgdGhlIGNsaWVudHMKKyAqIHBsYXRmb3JtIGRhdGEgdGhlbiByZWdpc3RlciB0aGUgcGh5c2ljYWwgZHJpdmVyIHdoaWNoIHdpbGwgZG8gYSBzY2FuIG9mCisgKiB0aGUgcm1pNCBQaHlzaWNhbCBEZXZpY2UgVGFibGUgYW5kIGVudW1lcmF0ZSBhbnkgcm1pNCBmdW5jdGlvbnMgdGhhdAorICogaGF2ZSBkYXRhIHNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHN5bmFwdGljc19ybWk0X3Byb2JlCisJKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGludHJfc3RhdHVzWzRdOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGE7CisJY29uc3Qgc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtZGF0YSA9CisJCQkJCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpMmMgc21idXMgYnl0ZSBkYXRhIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXBsYXRmb3JtZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBubyBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGNsaWVudCAqLworCXJtaTRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhKSAqIDIsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFybWk0X2RhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm8gbWVtb3J5IGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlybWk0X2RhdGEtPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmIChybWk0X2RhdGEtPmlucHV0X2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6aW5wdXQgZGV2aWNlIGFsbG9jIGZhaWxlZFxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW5wdXQ7CisJfQorCisJZGV2X3NldF9uYW1lKCZjbGllbnQtPmRldiwgcGxhdGZvcm1kYXRhLT5uYW1lKTsKKworCWlmIChwbGF0Zm9ybWRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlybWk0X2RhdGEtPnJlZ3VsYXRvciA9IHJlZ3VsYXRvcl9nZXQoJmNsaWVudC0+ZGV2LCAidi10b3VjaCIpOworCQlpZiAoSVNfRVJSKHJtaTRfZGF0YS0+cmVndWxhdG9yKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpnZXQgcmVndWxhdG9yIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJcmV0dmFsID0gUFRSX0VSUihybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCQlnb3RvIGVycl9yZWd1bGF0b3I7CisJCX0KKwkJcmVndWxhdG9yX2VuYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcm1pNF9kYXRhLT53YWl0KTsKKwkvKgorCSAqIENvcHkgaTJjX2NsaWVudCBwb2ludGVyIGludG8gUlRJRCdzIGkyY19jbGllbnQgcG9pbnRlciBmb3IKKwkgKiBsYXRlciB1c2UgaW4gcm1pNF9yZWFkLCBybWk0X3dyaXRlLCBldGMuCisJICovCisJcm1pNF9kYXRhLT5pMmNfY2xpZW50CQk9IGNsaWVudDsKKwkvKiBTbyB3ZSBzZXQgdGhlIHBhZ2UgY29ycmVjdGx5IHRoZSBmaXJzdCB0aW1lICovCisJcm1pNF9kYXRhLT5jdXJyZW50X3BhZ2UJCT0gTUFTS18xNkJJVDsKKwlybWk0X2RhdGEtPmJvYXJkCQk9IHBsYXRmb3JtZGF0YTsKKwlybWk0X2RhdGEtPnRvdWNoX3N0b3BwZWQJPSBmYWxzZTsKKworCS8qIGluaXQgdGhlIG11dGV4ZXMgZm9yIG1haW50YWluIHRoZSBsaXN0cyAqLworCW11dGV4X2luaXQoJihybWk0X2RhdGEtPmZuX2xpc3RfbXV0ZXgpKTsKKwltdXRleF9pbml0KCYocm1pNF9kYXRhLT5ybWk0X3BhZ2VfbXV0ZXgpKTsKKworCS8qCisJICogUmVnaXN0ZXIgcGh5c2ljYWwgZHJpdmVyIC0gdGhpcyB3aWxsIGNhbGwgdGhlIGRldGVjdCBmdW5jdGlvbiB0aGF0CisJICogd2lsbCB0aGVuIHNjYW4gdGhlIGRldmljZSBhbmQgZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQKKwkgKiBybWk0IGZ1bmN0aW9ucy4KKwkgKi8KKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfcXVlcnlfZGV2aWNlKHJtaTRfZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBybWk0IHF1ZXJ5IGRldmljZSBmYWlsZWRcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9xdWVyeV9kZXY7CisJfQorCisJLyogU3RvcmUgdGhlIGluc3RhbmNlIGRhdGEgaW4gdGhlIGkyY19jbGllbnQgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBybWk0X2RhdGEpOworCisJLyppbml0aWFsaXplIHRoZSBpbnB1dCBkZXZpY2UgcGFyYW1ldGVycyAqLworCXJtaTRfZGF0YS0+aW5wdXRfZGV2LT5uYW1lCT0gRFJJVkVSX05BTUU7CisJcm1pNF9kYXRhLT5pbnB1dF9kZXYtPnBoeXMJPSAiU3luYXB0aWNzX0NsZWFycGFkIjsKKwlybWk0X2RhdGEtPmlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJcm1pNF9kYXRhLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEocm1pNF9kYXRhLT5pbnB1dF9kZXYsIHJtaTRfZGF0YSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbiBoYW5kbGVycyBmb3Igcm1pNCAqLworCXNldF9iaXQoRVZfU1lOLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfS0VZLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfQUJTLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLCAwLAorCQkJCQlybWk0X2RhdGEtPnNlbnNvcl9tYXhfeCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLCAwLAorCQkJCQlybWk0X2RhdGEtPnNlbnNvcl9tYXhfeSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9UT1VDSF9NQUpPUiwgMCwKKwkJCQkJCU1BWF9UT1VDSF9NQUpPUiwgMCwgMCk7CisKKwlyZXR2YWwgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uocm1pNF9kYXRhLT5pbnB1dF9kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczppbnB1dCByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfaW5wdXRfcmVnaXN0ZXI7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCXN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHJtaTRfZGF0YSwKKwkJCXJtaTRfZGF0YS0+Zm4wMV9kYXRhX2Jhc2VfYWRkciArIDEsIGludHJfc3RhdHVzLAorCQkJCXJtaTRfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3Rlcik7CisJcmV0dmFsID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGxhdGZvcm1kYXRhLT5pcnFfbnVtYmVyLCBOVUxMLAorCQkJCQlzeW5hcHRpY3Nfcm1pNF9pcnEsCisJCQkJCXBsYXRmb3JtZGF0YS0+aXJxX3R5cGUsCisJCQkJCXBsYXRmb3JtZGF0YS0+bmFtZSwgcm1pNF9kYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6VW5hYmxlIHRvIGdldCBhdHRuIGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGxhdGZvcm1kYXRhLT5pcnFfbnVtYmVyKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZXJyX3JlcXVlc3RfaXJxOgorCWZyZWVfaXJxKHBsYXRmb3JtZGF0YS0+aXJxX251bWJlciwgcm1pNF9kYXRhKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShybWk0X2RhdGEtPmlucHV0X2Rldik7CitlcnJfaW5wdXRfcmVnaXN0ZXI6CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CitlcnJfcXVlcnlfZGV2OgorCWlmIChwbGF0Zm9ybWRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlyZWd1bGF0b3JfZGlzYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCXJlZ3VsYXRvcl9wdXQocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCX0KK2Vycl9yZWd1bGF0b3I6CisJaW5wdXRfZnJlZV9kZXZpY2Uocm1pNF9kYXRhLT5pbnB1dF9kZXYpOworCXJtaTRfZGF0YS0+aW5wdXRfZGV2ID0gTlVMTDsKK2Vycl9pbnB1dDoKKwlrZnJlZShybWk0X2RhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogc3luYXB0aWNzX3JtaTRfcmVtb3ZlKCkgLSBSZW1vdmVzIHRoZSBpMmMtY2xpZW50IHRvdWNoc2NyZWVuIGRyaXZlcgorICogQGNsaWVudDogaTJjIGNsaWVudCBzdHJ1Y3R1cmUgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVudGlvbiB1c2VzIHRvIHJlbW92ZSB0aGUgaTJjLWNsaWVudAorICogdG91Y2hzY3JlZW4gZHJpdmVyIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHN5bmFwdGljc19ybWk0X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBybWk0X2RhdGEtPmJvYXJkOworCisJcm1pNF9kYXRhLT50b3VjaF9zdG9wcGVkID0gdHJ1ZTsKKwl3YWtlX3VwKCZybWk0X2RhdGEtPndhaXQpOworCWZyZWVfaXJxKHBkYXRhLT5pcnFfbnVtYmVyLCBybWk0X2RhdGEpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHJtaTRfZGF0YS0+aW5wdXRfZGV2KTsKKwlpZiAocGRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlyZWd1bGF0b3JfZGlzYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCXJlZ3VsYXRvcl9wdXQocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCX0KKwlrZnJlZShybWk0X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qKgorICogc3luYXB0aWNzX3JtaTRfc3VzcGVuZCgpIC0gc3VzcGVuZCB0aGUgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVudGlvbiBpcyB1c2VkIHRvIHN1c3BlbmQgdGhlCisgKiB0b3VjaCBwYW5lbCBjb250cm9sbGVyIGFuZCByZXR1cm5zIGludGVnZXIKKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBUb3VjaCBzbGVlcCBtb2RlICovCisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGludHJfc3RhdHVzOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBybWk0X2RhdGEtPmJvYXJkOworCisJcm1pNF9kYXRhLT50b3VjaF9zdG9wcGVkID0gdHJ1ZTsKKwlkaXNhYmxlX2lycShwZGF0YS0+aXJxX251bWJlcik7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChybWk0X2RhdGEsCisJCQkJcm1pNF9kYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwKKwkJCQkmaW50cl9zdGF0dXMsCisJCQkJcm1pNF9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKHJtaTRfZGF0YSwKKwkJCQkJcm1pNF9kYXRhLT5mbjAxX2N0cmxfYmFzZV9hZGRyICsgMSwKKwkJCQkJKGludHJfc3RhdHVzICYgflRPVUNIUEFEX0NUUkxfSU5UUikpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHBkYXRhLT5yZWd1bGF0b3JfZW4pCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKworCXJldHVybiAwOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUoKSAtIHJlc3VtZSB0aGUgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVudGlvbiBpcyB1c2VkIHRvIHJlc3VtZSB0aGUgdG91Y2ggcGFuZWwKKyAqIGNvbnRyb2xsZXIgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBpbnRyX3N0YXR1czsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcm1pNF9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcm1pNF9kYXRhLT5ib2FyZDsKKworCWlmIChwZGF0YS0+cmVndWxhdG9yX2VuKQorCQlyZWd1bGF0b3JfZW5hYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKworCWVuYWJsZV9pcnEocGRhdGEtPmlycV9udW1iZXIpOworCXJtaTRfZGF0YS0+dG91Y2hfc3RvcHBlZCA9IGZhbHNlOworCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocm1pNF9kYXRhLAorCQkJCXJtaTRfZGF0YS0+Zm4wMV9kYXRhX2Jhc2VfYWRkciArIDEsCisJCQkJJmludHJfc3RhdHVzLAorCQkJCXJtaTRfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3Rlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYnl0ZV93cml0ZShybWk0X2RhdGEsCisJCQkJCXJtaTRfZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciArIDEsCisJCQkJCShpbnRyX3N0YXR1cyB8IFRPVUNIUEFEX0NUUkxfSU5UUikpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzeW5hcHRpY3Nfcm1pNF9kZXZfcG1fb3BzID0geworCS5zdXNwZW5kID0gc3luYXB0aWNzX3JtaTRfc3VzcGVuZCwKKwkucmVzdW1lICA9IHN5bmFwdGljc19ybWk0X3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN5bmFwdGljc19ybWk0X2lkX3RhYmxlW10gPSB7CisJeyBEUklWRVJfTkFNRSwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3luYXB0aWNzX3JtaTRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3luYXB0aWNzX3JtaTRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0JRFJJVkVSX05BTUUsCisJCS5vd25lcgk9CVRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPQkmc3luYXB0aWNzX3JtaTRfZGV2X3BtX29wcywKKyNlbmRpZgorCX0sCisJLnByb2JlCQk9CXN5bmFwdGljc19ybWk0X3Byb2JlLAorCS5yZW1vdmUJCT0JX19kZXZleGl0X3Aoc3luYXB0aWNzX3JtaTRfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPQlzeW5hcHRpY3Nfcm1pNF9pZF90YWJsZSwKK307CisvKioKKyAqIHN5bmFwdGljc19ybWk0X2luaXQoKSAtIEluaXRpYWxpemUgdGhlIHRvdWNoc2NyZWVuIGRyaXZlcgorICoKKyAqIFRoaXMgZnVudGlvbiB1c2VzIHRvIGluaXRpYWxpemVzIHRoZSBzeW5hcHRpY3MKKyAqIHRvdWNoc2NyZWVuIGRyaXZlciBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzeW5hcHRpY3Nfcm1pNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzeW5hcHRpY3Nfcm1pNF9kcml2ZXIpOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9leGl0KCkgLSBEZS1pbml0aWFsaXplIHRoZSB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqCisgKiBUaGlzIGZ1bnRpb24gdXNlcyB0byBkZS1pbml0aWFsaXplIHRoZSBzeW5hcHRpY3MKKyAqIHRvdWNoc2NyZWVuIGRyaXZlciBhbmQgcmV0dXJucyBub25lLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3luYXB0aWNzX3JtaTRfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZzeW5hcHRpY3Nfcm1pNF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHN5bmFwdGljc19ybWk0X2luaXQpOworbW9kdWxlX2V4aXQoc3luYXB0aWNzX3JtaTRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIm5hdmVlbi5nYWRkaXBhdGlAc3Rlcmljc3Nvbi5jb20sIGpzLmhhQHN0ZXJpY3Nzb24uY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInN5bmFwdGljcyBybWk0IGkyYyB0b3VjaCBEcml2ZXIiKTsKK01PRFVMRV9BTElBUygiaTJjOnN5bmFwdGljc19ybWk0X3RzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmggYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYWUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqCisgKiBTeW5hcHRpY3MgUmVnaXN0ZXIgTWFwcGVkIEludGVyZmFjZSAoUk1JNCkgSTJDIFBoeXNpY2FsIExheWVyIERyaXZlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwLCBTeW5hcHRpY3MgSW5jb3Jwb3JhdGVkCisgKgorICogQXV0aG9yOiBKcyBIQSA8anMuaGFAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yOiBOYXZlZW4gS3VtYXIgRyA8bmF2ZWVuLmdhZGRpcGF0aUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBDb3B5cmlnaHQgMjAxMCAoYykgU1QtRXJpY3Nzb24gQUIKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMMiBsaWNlbnNlLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIEdQTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKworI2lmbmRlZiBfU1lOQVBUSUNTX1JNSTRfSF9JTkNMVURFRF8KKyNkZWZpbmUgX1NZTkFQVElDU19STUk0X0hfSU5DTFVERURfCisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgLSBjb250YWlucyB0aGUgcm1pNCBwbGF0Zm9ybSBkYXRhCisgKiBAaXJxX251bWJlcjogaXJxIG51bWJlcgorICogQGlycV90eXBlOiBpcnEgdHlwZQorICogQHggZmxpcDogeCBmbGlwIGZsYWcKKyAqIEB5IGZsaXA6IHkgZmxpcCBmbGFnCisgKiBAcmVndWxhdG9yX2VuOiByZWd1bGF0b3IgZW5hYmxlIGZsYWcKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBnaXZlcyBwbGF0Zm9ybSBkYXRhIGZvciBybWk0LgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaXJxX251bWJlcjsKKwlpbnQgaXJxX3R5cGU7CisJYm9vbCB4X2ZsaXA7CisJYm9vbCB5X2ZsaXA7CisJYm9vbCByZWd1bGF0b3JfZW47Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwppbmRleCAxYmUwODFmLi5hM2IwYTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCkBAIC01OTYsNyArNTk2LDcgQEAKIAkJZGV2X2RiZyhicmlkZ2UsICJEU1AgY19pbnQwMCBBZGRyZXNzID0gIDB4JXhcbiIsIGRzcF9hZGRyKTsKIAkJaWYgKGRzcF9kZWJ1ZykKIAkJCXdoaWxlIChfX3Jhd19yZWFkdyhkd19zeW5jX2FkZHIpKQotCQkJCTs7CisJCQkJOwogCiAJCS8qIFdhaXQgZm9yIERTUCB0byBjbGVhciB3b3JkIGluIHNoYXJlZCBtZW1vcnkgKi8KIAkJLyogUmVhZCB0aGUgTG9jYXRpb24gKi8KQEAgLTE2NzEsNyArMTY3MSw3IEBACiAJCQkvKiBGaW5kIGEgZnJlZSBMMiBQVC4gKi8KIAkJCWZvciAoaSA9IDA7IChpIDwgcHQtPmwyX251bV9wYWdlcykgJiYKIAkJCSAgICAgKHB0LT5wZ19pbmZvW2ldLm51bV9lbnRyaWVzICE9IDApOyBpKyspCi0JCQkJOzsKKwkJCQk7CiAJCQlpZiAoaSA8IHB0LT5sMl9udW1fcGFnZXMpIHsKIAkJCQlsMl9wYWdlX251bSA9IGk7CiAJCQkJbDJfYmFzZV9wYSA9IHB0LT5sMl9iYXNlX3BhICsgKGwyX3BhZ2VfbnVtICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwppbmRleCBhNmFlMDA3Li4yODM1NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCkBAIC05NDMsNyArOTQzLDcgQEAKIAogCS8qIERldGVybWluZSB3aGljaCBwaGFzZSB0aGlzIHNlY3Rpb24gYmVsb25ncyB0byAqLwogCWZvciAocGNoID0gc2VjdF9uYW1lICsgMTsgKnBjaCAmJiAqcGNoICE9IHNlcHM7IHBjaCsrKQotCQk7OworCQk7CiAKIAlpZiAoKnBjaCkgewogCQlwY2grKzsJCS8qIFNraXAgb3ZlciB0aGUgJzonICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCmluZGV4IDgzMjYwOGQuLjA4YmQyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCkBAIC03OTksMjAgKzc5OSw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkZXYtPnByaXZfbG9jaywgZmxhZ3MyKTsKIAl9CiAKLQotCWlmICghdmRldi0+dWQudGNwX3NvY2tldCkgewotCQkvKiB0Y3AgY29ubmVjdGlvbiBpcyBjbG9zZWQgKi8KLQkJdXNiaXBfdWluZm8oInZoY2lfaGNkOiB2aGNpX3VyYl9kZXF1ZXVlKCkgZ2l2ZXMgYmFjayB1cmIgJXBcbiIsCi0JCQkJCQkJCQl1cmIpOwotCi0JCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwKLQkJCQkJCQkJdXJiLT5zdGF0dXMpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwogCiAJdXNiaXBfZGJnX3ZoY2lfaGMoImxlYXZlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy9Nb2R1bGUuc3ltdmVycyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy9Nb2R1bGUuc3ltdmVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL01vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKaW5kZXggNGQ3NDU2Mi4uNDJkZTgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV9jYTkxY3g0MiI7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYTkxY3g0Ml9pZHNbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShjYTkxY3g0Ml9pZHMpID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1RVTkRSQSwgUENJX0RFVklDRV9JRF9UVU5EUkFfQ0E5MUMxNDIpIH0sCiAJeyB9LAogfTsKQEAgLTU4LDcgKzU4LDcgQEAKIAogc3RhdGljIHUzMiBjYTkxY3g0Ml9ETUFfaXJxaGFuZGxlcihzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2UpCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+ZG1hX3F1ZXVlKSk7CisJd2FrZV91cCgmYnJpZGdlLT5kbWFfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfRE1BOwogfQpAQCAtODIsMTQgKzgyLDE0IEBACiAvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIDQgcXVldWVzICovCiBzdGF0aWMgdTMyIGNhOTFjeDQyX01CX2lycWhhbmRsZXIoc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlLCBpbnQgbWJveF9tYXNrKQogewotCXdha2VfdXAoJihicmlkZ2UtPm1ib3hfcXVldWUpKTsKKwl3YWtlX3VwKCZicmlkZ2UtPm1ib3hfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfTUJPWDsKIH0KIAogc3RhdGljIHUzMiBjYTkxY3g0Ml9JQUNLX2lycWhhbmRsZXIoc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlKQogewotCXdha2VfdXAoJihicmlkZ2UtPmlhY2tfcXVldWUpKTsKKwl3YWtlX3VwKCZicmlkZ2UtPmlhY2tfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfU1dfSUFDSzsKIH0KQEAgLTIwNyw5ICsyMDcsOSBAQAogCXBkZXYgPSBjb250YWluZXJfb2YoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOwogCiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwotCUlOSVRfTElTVF9IRUFEKCYoY2E5MWN4NDJfYnJpZGdlLT52bWVfZXJyb3JzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+dm1lX2Vycm9ycyk7CiAKLQltdXRleF9pbml0KCYoY2E5MWN4NDJfYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfaW5pdCgmY2E5MWN4NDJfYnJpZGdlLT5pcnFfbXR4KTsKIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyBmcm9tIFBDSSB0byBWTUUgKi8KIAlpb3dyaXRlMzIoMCwgYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CkBAIC0yNTksOCArMjU5LDggQEAKIC8qCiAgKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAogICovCi12b2lkIGNhOTFjeDQyX2lycV9zZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLCBpbnQgc3RhdGUsCi0JaW50IHN5bmMpCitzdGF0aWMgdm9pZCBjYTkxY3g0Ml9pcnFfc2V0KHN0cnVjdCB2bWVfYnJpZGdlICpjYTkxY3g0Ml9icmlkZ2UsIGludCBsZXZlbCwKKwlpbnQgc3RhdGUsIGludCBzeW5jKQogCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC0yODcsNyArMjg3LDcgQEAKIAl9CiB9CiAKLWludCBjYTkxY3g0Ml9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLAorc3RhdGljIGludCBjYTkxY3g0Ml9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLAogCWludCBzdGF0aWQpCiB7CiAJdTMyIHRtcDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCWlmIChzdGF0aWQgJiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJdG1wID0gaW9yZWFkMzIoYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CiAKQEAgLTMxOCwxMiArMzE4LDEyIEBACiAJdG1wID0gdG1wICYgfigxIDw8IChsZXZlbCArIDI0KSk7CiAJaW93cml0ZTMyKHRtcCwgYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+dm1lX2ludCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNhOTFjeDQyX3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCitzdGF0aWMgaW50IGNhOTFjeDQyX3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKIAlkbWFfYWRkcl90IHBjaV9iYXNlLCB2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CkBAIC00MjksNyArNDI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNhOTFjeDQyX3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCBjYTkxY3g0Ml9zbGF2ZV9nZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJZG1hX2FkZHJfdCAqcGNpX2Jhc2UsIHZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQogewpAQCAtNTE4LDggKzUxOCw4IEBACiAJCWltYWdlLT5rZXJuX2Jhc2UgPSBOVUxMOwogCQlpZiAoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lICE9IE5VTEwpCiAJCQlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOwotCQltZW1zZXQoJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKKwkJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJfQogCiAJaWYgKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSA9PSBOVUxMKSB7CkBAIC01NDAsNyArNTQwLDcgQEAKIAlpbWFnZS0+YnVzX3Jlc291cmNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CiAKIAlyZXR2YWwgPSBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKHBkZXYtPmJ1cywKLQkJJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgc2l6ZSwgc2l6ZSwgUENJQklPU19NSU5fTUVNLAorCQkmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgc2l6ZSwgc2l6ZSwgUENJQklPU19NSU5fTUVNLAogCQkwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtICIKQEAgLTU2MywxMCArNTYzLDEwIEBACiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIGVycl9yZW1hcDoKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogZXJyX3Jlc291cmNlOgogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIGVycl9uYW1lOgogCXJldHVybiByZXR2YWw7CiB9CkBAIC01NzgsMTMgKzU3OCwxMyBAQAogewogCWlvdW5tYXAoaW1hZ2UtPmtlcm5fYmFzZSk7CiAJaW1hZ2UtPmtlcm5fYmFzZSA9IE5VTEw7Ci0JcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKIAlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCW1lbXNldCgmKGltYWdlLT5idXNfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiB9CiAKIAotaW50IGNhOTFjeDQyX21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsCiAJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlLCB2bWVfd2lkdGhfdCBkd2lkdGgpCiB7CkBAIC02MjAsNyArNjIwLDcgQEAKIAkJZ290byBlcnJfd2luZG93OwogCX0KIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKgogCSAqIExldCdzIGFsbG9jYXRlIHRoZSByZXNvdXJjZSBoZXJlIHJhdGhlciB0aGFuIGZ1cnRoZXIgdXAgdGhlIHN0YWNrIGFzCkBAIC02MjgsNyArNjI4LDcgQEAKIAkgKi8KIAlyZXR2YWwgPSBjYTkxY3g0Ml9hbGxvY19yZXNvdXJjZShpbWFnZSwgc2l6ZSk7CiAJaWYgKHJldHZhbCkgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKIAkJCSJmb3IgcmVzb3VyY2UgbmFtZVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CkBAIC02NzIsNyArNjcyLDcgQEAKIAkJdGVtcF9jdGwgfD0gQ0E5MUNYNDJfTFNJX0NUTF9WRFdfRDY0OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGRhdGEgd2lkdGhcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9kd2lkdGg7CkBAIC03MDQsNyArNzA0LDcgQEAKIAljYXNlIFZNRV9VU0VSMzoKIAljYXNlIFZNRV9VU0VSNDoKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hc3BhY2U7CkBAIC03MzAsNyArNzMwLDcgQEAKIAogCWlvd3JpdGUzMih0ZW1wX2N0bCwgYnJpZGdlLT5iYXNlICsgQ0E5MUNYNDJfTFNJX0NUTFtpXSk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIAogZXJyX2FzcGFjZToKQEAgLTc0MSw4ICs3NDEsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCi0JdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAorc3RhdGljIGludCBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCWludCAqZW5hYmxlZCwgdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlLCB2bWVfd2lkdGhfdCAqZHdpZHRoKQogewogCXVuc2lnbmVkIGludCBpLCBjdGw7CkBAIC04MjgsMjQgKzgyOCwyNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUsIHZtZV93aWR0aF90ICpkd2lkdGgpCiB7CiAJaW50IHJldHZhbDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR2YWwgPSBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoaW1hZ2UsIGVuYWJsZWQsIHZtZV9iYXNlLCBzaXplLCBhc3BhY2UsCiAJCWN5Y2xlLCBkd2lkdGgpOwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAotCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKK3N0YXRpYyBzc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKKwl2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKIHsKIAlzc2l6ZV90IHJldHZhbDsKIAl2b2lkICphZGRyID0gaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldDsKQEAgLTg1NSw3ICs4NTUsNyBAQAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyBWTUUgYWRkcmVzcyBhbGlnbm1lbnQgcHJvYmxlbQogCSAqIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgbWF4aW1hbCBkYXRhIHdpZHRoIGN5Y2xlLgpAQCAtODk5LDEzICs4OTksMTMgQEAKIAl9CiBvdXQ6CiAJcmV0dmFsID0gY291bnQ7Ci0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKLQlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgc3NpemVfdCBjYTkxY3g0Ml9tYXN0ZXJfd3JpdGUoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCXZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0KQogewogCXNzaXplX3QgcmV0dmFsOwogCXZvaWQgKmFkZHIgPSBpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0OwpAQCAtOTE1LDcgKzkxNSw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIEhlcmUgd2UgYXBwbHkgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5IHdlIGRvIGluIG1hc3Rlcl9yZWFkCiAJICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIEQxNiBjeWNsZSB3aGVuIHJlcXVpcmVkLgpAQCAtOTU0LDExICs5NTQsMTIgQEAKIG91dDoKIAlyZXR2YWwgPSBjb3VudDsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCiAJcmV0dXJuIHJldHZhbDsKIH0KIAotdW5zaWduZWQgaW50IGNhOTFjeDQyX21hc3Rlcl9ybXcoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorc3RhdGljIHVuc2lnbmVkIGludCBjYTkxY3g0Ml9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKIAl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGNvbXBhcmUsIHVuc2lnbmVkIGludCBzd2FwLAogCWxvZmZfdCBvZmZzZXQpCiB7CkBAIC05NzQsMTAgKzk3NSwxMCBAQAogCWkgPSBpbWFnZS0+bnVtYmVyOwogCiAJLyogTG9ja2luZyBhcyB3ZSBjYW4gb25seSBkbyBvbmUgb2YgdGhlc2UgYXQgYSB0aW1lICovCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+dm1lX3JtdykpOworCW11dGV4X2xvY2soJmJyaWRnZS0+dm1lX3Jtdyk7CiAKIAkvKiBMb2NrIGltYWdlICovCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCXBjaV9hZGRyID0gKHUzMilpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0OwogCkBAIC0xMDA3LDE1ICsxMDA4LDE1IEBACiAJaW93cml0ZTMyKDAsIGJyaWRnZS0+YmFzZSArIFNDWUNfQ1RMKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9ybXcpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2FkZChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0LCBzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsCi0Jc3RydWN0IHZtZV9kbWFfYXR0ciAqZGVzdCwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBjYTkxY3g0Ml9kbWFfbGlzdF9hZGQoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCwKKwlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKmRlc3QsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeSwgKnByZXY7CiAJc3RydWN0IHZtZV9kbWFfcGNpICpwY2lfYXR0cjsKQEAgLTEwMzYsMTQgKzEwMzcsMTQgQEAKIAl9CiAKIAkvKiBUZXN0IGRlc2NyaXB0b3IgYWxpZ25tZW50ICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKSYoZW50cnktPmRlc2NyaXB0b3IpICYgQ0E5MUNYNDJfRENQUF9NKSB7CisJaWYgKCh1bnNpZ25lZCBsb25nKSZlbnRyeS0+ZGVzY3JpcHRvciAmIENBOTFDWDQyX0RDUFBfTSkgewogCQlkZXZfZXJyKGRldiwgIkRlc2NyaXB0b3Igbm90IGFsaWduZWQgdG8gMTYgYnl0ZSBib3VuZGFyeSBhcyAiCi0JCQkicmVxdWlyZWQ6ICVwXG4iLCAmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJCQkicmVxdWlyZWQ6ICVwXG4iLCAmZW50cnktPmRlc2NyaXB0b3IpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hbGlnbjsKIAl9CiAKLQltZW1zZXQoJihlbnRyeS0+ZGVzY3JpcHRvciksIDAsIHNpemVvZihzdHJ1Y3QgY2E5MWN4NDJfZG1hX2Rlc2NyaXB0b3IpKTsKKwltZW1zZXQoJmVudHJ5LT5kZXNjcmlwdG9yLCAwLCBzaXplb2Yoc3RydWN0IGNhOTFjeDQyX2RtYV9kZXNjcmlwdG9yKSk7CiAKIAlpZiAoZGVzdC0+dHlwZSA9PSBWTUVfRE1BX1ZNRSkgewogCQllbnRyeS0+ZGVzY3JpcHRvci5kY3RsIHw9IENBOTFDWDQyX0RDVExfTDJWOwpAQCAtMTEzOCwxNCArMTEzOSwxNCBAQAogCWVudHJ5LT5kZXNjcmlwdG9yLmRjcHAgPSBDQTkxQ1g0Ml9EQ1BQX05VTEw7CiAKIAkvKiBBZGQgdG8gbGlzdCAqLwotCWxpc3RfYWRkX3RhaWwoJihlbnRyeS0+bGlzdCksICYobGlzdC0+ZW50cmllcykpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmbGlzdC0+ZW50cmllcyk7CiAKIAkvKiBGaWxsIG91dCBwcmV2aW91cyBkZXNjcmlwdG9ycyAiTmV4dCBBZGRyZXNzIiAqLwotCWlmIChlbnRyeS0+bGlzdC5wcmV2ICE9ICYobGlzdC0+ZW50cmllcykpIHsKKwlpZiAoZW50cnktPmxpc3QucHJldiAhPSAmbGlzdC0+ZW50cmllcykgewogCQlwcmV2ID0gbGlzdF9lbnRyeShlbnRyeS0+bGlzdC5wcmV2LCBzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5LAogCQkJbGlzdCk7CiAJCS8qIFdlIG5lZWQgdGhlIGJ1cyBhZGRyZXNzIGZvciB0aGUgcG9pbnRlciAqLwotCQlkZXNjX3B0ciA9IHZpcnRfdG9fYnVzKCYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwkJZGVzY19wdHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCQlwcmV2LT5kZXNjcmlwdG9yLmRjcHAgPSBkZXNjX3B0ciAmIH5DQTkxQ1g0Ml9EQ1BQX007CiAJfQogCkBAIC0xMTc1LDcgKzExNzYsNyBAQAogCQlyZXR1cm4gMTsKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2V4ZWMoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfZG1hX2xpc3RfZXhlYyhzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0KQogewogCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlICpjdHJscjsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeTsKQEAgLTExOTAsMjggKzExOTEsMjggQEAKIAlicmlkZ2UgPSBjdHJsci0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAlkZXYgPSBjdHJsci0+cGFyZW50LT5wYXJlbnQ7CiAKLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOwogCi0JaWYgKCEobGlzdF9lbXB0eSgmKGN0cmxyLT5ydW5uaW5nKSkpKSB7CisJaWYgKCEobGlzdF9lbXB0eSgmY3RybHItPnJ1bm5pbmcpKSkgewogCQkvKgogCQkgKiBYWFggV2UgaGF2ZSBhbiBhY3RpdmUgRE1BIHRyYW5zZmVyIGFuZCBjdXJyZW50bHkgaGF2ZW4ndAogCQkgKiAgICAgc29ydGVkIG91dCB0aGUgbWVjaGFuaXNtIGZvciAicGVuZGluZyIgRE1BIHRyYW5zZmVycy4KIAkJICogICAgIFJldHVybiBidXN5LgogCQkgKi8KIAkJLyogTmVlZCB0byBhZGQgdG8gcGVuZGluZyBoZXJlICovCi0JCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewotCQlsaXN0X2FkZCgmKGxpc3QtPmxpc3QpLCAmKGN0cmxyLT5ydW5uaW5nKSk7CisJCWxpc3RfYWRkKCZsaXN0LT5saXN0LCAmY3RybHItPnJ1bm5pbmcpOwogCX0KIAogCS8qIEdldCBmaXJzdCBidXMgYWRkcmVzcyBhbmQgd3JpdGUgaW50byByZWdpc3RlcnMgKi8KLQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJihsaXN0LT5lbnRyaWVzKSwgc3RydWN0IGNhOTFjeDQyX2RtYV9lbnRyeSwKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmxpc3QtPmVudHJpZXMsIHN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnksCiAJCWxpc3QpOwogCi0JYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCi0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlpb3dyaXRlMzIoMCwgYnJpZGdlLT5iYXNlICsgRFRCQyk7CiAJaW93cml0ZTMyKGJ1c19hZGRyICYgfkNBOTFDWDQyX0RDUFBfTSwgYnJpZGdlLT5iYXNlICsgRENQUCk7CkBAIC0xMjQ5LDIxICsxMjUwLDIxIEBACiAJfQogCiAJLyogUmVtb3ZlIGxpc3QgZnJvbSBydW5uaW5nIGxpc3QgKi8KLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOwotCWxpc3RfZGVsKCYobGlzdC0+bGlzdCkpOwotCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwltdXRleF9sb2NrKCZjdHJsci0+bXR4KTsKKwlsaXN0X2RlbCgmbGlzdC0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiAKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCitzdGF0aWMgaW50IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeTsKIAogCS8qIGRldGFjaCBhbmQgZnJlZSBlYWNoIGVudHJ5ICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJihsaXN0LT5lbnRyaWVzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZsaXN0LT5lbnRyaWVzKSB7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWVudHJ5ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnksIGxpc3QpOwogCQlrZnJlZShlbnRyeSk7CkBAIC0xMjc5LDggKzEyODAsOCBAQAogICogVGhpcyBkb2VzIG5vdCBlbmFibGUgdGhlIExNIG1vbml0b3IgLSB0aGF0IHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGZpcnN0CiAgKiBjYWxsYmFjayBpcyBhdHRhY2hlZCBhbmQgZGlzYWJsZWQgd2hlbiB0aGUgbGFzdCBjYWxsYmFjayBpcyByZW1vdmVkLgogICovCi1pbnQgY2E5MWN4NDJfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCitzdGF0aWMgaW50IGNhOTFjeDQyX2xtX3NldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwKKwl1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwgdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewogCXUzMiB0ZW1wX2Jhc2UsIGxtX2N0bCA9IDA7CiAJaW50IGk7CkBAIC0xMjk4LDEyICsxMjk5LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWxsYmFjayBhdHRhY2hlZCwgd2UgY2FuJ3QgbW92ZSBpdCEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKIAkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkgewotCQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJCWRldl9lcnIoZGV2LCAiTG9jYXRpb24gbW9uaXRvciBjYWxsYmFjayBhdHRhY2hlZCwgIgogCQkJCSJjYW4ndCByZXNldFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTMyMSw3ICsxMzIyLDcgQEAKIAkJbG1fY3RsIHw9IENBOTFDWDQyX0xNX0NUTF9BU19BMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJZGV2X2VycihkZXYsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0xMzM5LDcgKzEzNDAsNyBAQAogCWlvd3JpdGUzMihsbV9iYXNlLCBicmlkZ2UtPmJhc2UgKyBMTV9CUyk7CiAJaW93cml0ZTMyKGxtX2N0bCwgYnJpZGdlLT5iYXNlICsgTE1fQ1RMKTsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzQ3LDE1ICsxMzQ4LDE1IEBACiAvKiBHZXQgY29uZmlndXJhdGlvbiBvZiB0aGUgY2FsbGJhY2sgbW9uaXRvciBhbmQgcmV0dXJuIHdoZXRoZXIgaXQgaXMgZW5hYmxlZAogICogb3IgZGlzYWJsZWQuCiAgKi8KLWludCBjYTkxY3g0Ml9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbG1fZ2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLAorCXVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwgdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUpCiB7CiAJdTMyIGxtX2N0bCwgZW5hYmxlZCA9IDA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwogCiAJYnJpZGdlID0gbG0tPnBhcmVudC0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJKmxtX2Jhc2UgPSAodW5zaWduZWQgbG9uZyBsb25nKWlvcmVhZDMyKGJyaWRnZS0+YmFzZSArIExNX0JTKTsKIAlsbV9jdGwgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwpAQCAtMTM4MCw3ICsxMzgxLDcgQEAKIAlpZiAobG1fY3RsICYgQ0E5MUNYNDJfTE1fQ1RMX0RBVEEpCiAJCSpjeWNsZSB8PSBWTUVfREFUQTsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIGVuYWJsZWQ7CiB9CkBAIC0xMzkwLDcgKzEzOTEsNyBAQAogICoKICAqIENhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSBtb25pdG9yIHRyaWdnZXJlZC4KICAqLwotaW50IGNhOTFjeDQyX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCitzdGF0aWMgaW50IGNhOTFjeDQyX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQpKQogewogCXUzMiBsbV9jdGwsIHRtcDsKQEAgLTE0MDAsMTkgKzE0MDEsMTkgQEAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAlkZXYgPSBsbS0+cGFyZW50LT5wYXJlbnQ7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogRW5zdXJlIHRoYXQgdGhlIGxvY2F0aW9uIG1vbml0b3IgaXMgY29uZmlndXJlZCAtIG5lZWQgUEdNIG9yIERBVEEgKi8KIAlsbV9jdGwgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCWlmICgobG1fY3RsICYgKENBOTFDWDQyX0xNX0NUTF9QR00gfCBDQTkxQ1g0Ml9MTV9DVExfREFUQSkpID09IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKGRldiwgIkxvY2F0aW9uIG1vbml0b3Igbm90IHByb3Blcmx5IGNvbmZpZ3VyZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IGEgY2FsbGJhY2sgaXNuJ3QgYWxyZWFkeSBhdHRhY2hlZCAqLwogCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdICE9IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKGRldiwgIkV4aXN0aW5nIGNhbGxiYWNrIGF0dGFjaGVkXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xNDMxLDcgKzE0MzIsNyBAQAogCQlpb3dyaXRlMzIobG1fY3RsLCBicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDM5LDE0ICsxNDQwLDE0IEBACiAvKgogICogRGV0YWNoIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9ybiBhIHNwZWNpZmljIGxvY2F0aW9uIG1vbml0b3IuCiAgKi8KLWludCBjYTkxY3g0Ml9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQorc3RhdGljIGludCBjYTkxY3g0Ml9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQogewogCXUzMiB0bXA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwogCiAJYnJpZGdlID0gbG0tPnBhcmVudC0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogRGlzYWJsZSBMb2NhdGlvbiBNb25pdG9yIGFuZCBlbnN1cmUgcHJldmlvdXMgaW50ZXJydXB0cyBhcmUgY2xlYXIgKi8KIAl0bXAgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKQEAgLTE0NjcsMTIgKzE0NjgsMTIgQEAKIAkJaW93cml0ZTMyKHRtcCwgYnJpZGdlLT5iYXNlICsgTE1fQ1RMKTsKIAl9CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSkKIHsKIAl1MzIgc2xvdCA9IDA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwpAQCAtMTUyNiw3ICsxNTI3LDcgQEAKIAogCS8qIEFsbG9jYXRlIG1lbSBmb3IgQ1IvQ1NSIGltYWdlICovCiAJYnJpZGdlLT5jcmNzcl9rZXJuZWwgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBWTUVfQ1JDU1JfQlVGX1NJWkUsCi0JCSYoYnJpZGdlLT5jcmNzcl9idXMpKTsKKwkJJmJyaWRnZS0+Y3Jjc3JfYnVzKTsKIAlpZiAoYnJpZGdlLT5jcmNzcl9rZXJuZWwgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBDUi9DU1IgIgogCQkJImltYWdlXG4iKTsKQEAgLTE2MzIsMTIgKzE2MzMsMTIgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIHdhaXQgcXVldWVzICYgbXV0dWFsIGV4Y2x1c2lvbiBmbGFncyAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihjYTkxY3g0Ml9kZXZpY2UtPmRtYV9xdWV1ZSkpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihjYTkxY3g0Ml9kZXZpY2UtPmlhY2tfcXVldWUpKTsKLQltdXRleF9pbml0KCYoY2E5MWN4NDJfZGV2aWNlLT52bWVfaW50KSk7Ci0JbXV0ZXhfaW5pdCgmKGNhOTFjeDQyX2RldmljZS0+dm1lX3JtdykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhOTFjeDQyX2RldmljZS0+ZG1hX3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYTkxY3g0Ml9kZXZpY2UtPmlhY2tfcXVldWUpOworCW11dGV4X2luaXQoJmNhOTFjeDQyX2RldmljZS0+dm1lX2ludCk7CisJbXV0ZXhfaW5pdCgmY2E5MWN4NDJfZGV2aWNlLT52bWVfcm13KTsKIAotCWNhOTFjeDQyX2JyaWRnZS0+cGFyZW50ID0gJihwZGV2LT5kZXYpOworCWNhOTFjeDQyX2JyaWRnZS0+cGFyZW50ID0gJnBkZXYtPmRldjsKIAlzdHJjcHkoY2E5MWN4NDJfYnJpZGdlLT5uYW1lLCBkcml2ZXJfbmFtZSk7CiAKIAkvKiBTZXR1cCBJUlEgKi8KQEAgLTE2NDgsNyArMTY0OSw3IEBACiAJfQogCiAJLyogQWRkIG1hc3RlciB3aW5kb3dzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpOworCUlOSVRfTElTVF9IRUFEKCZjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBDQTkxQzE0Ml9NQVhfTUFTVEVSOyBpKyspIHsKIAkJbWFzdGVyX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xNjU5LDcgKzE2NjAsNyBAQAogCQkJZ290byBlcnJfbWFzdGVyOwogCQl9CiAJCW1hc3Rlcl9pbWFnZS0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCQlzcGluX2xvY2tfaW5pdCgmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2tfaW5pdCgmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAkJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwogCQltYXN0ZXJfaW1hZ2UtPm51bWJlciA9IGk7CiAJCW1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKQEAgLTE2NjcsMTUgKzE2NjgsMTUgQEAKIAkJbWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyID0gVk1FX1NDVCB8IFZNRV9CTFQgfCBWTUVfTUJMVCB8CiAJCQlWTUVfU1VQRVIgfCBWTUVfVVNFUiB8IFZNRV9QUk9HIHwgVk1FX0RBVEE7CiAJCW1hc3Rlcl9pbWFnZS0+d2lkdGhfYXR0ciA9IFZNRV9EOCB8IFZNRV9EMTYgfCBWTUVfRDMyIHwgVk1FX0Q2NDsKLQkJbWVtc2V0KCYobWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UpLCAwLAorCQltZW1zZXQoJm1hc3Rlcl9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAogCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQltYXN0ZXJfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwotCQlsaXN0X2FkZF90YWlsKCYobWFzdGVyX2ltYWdlLT5saXN0KSwKLQkJCSYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJCWxpc3RfYWRkX3RhaWwoJm1hc3Rlcl9pbWFnZS0+bGlzdCwKKwkJCSZjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBzbGF2ZSB3aW5kb3dzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0E5MUMxNDJfTUFYX1NMQVZFOyBpKyspIHsKIAkJc2xhdmVfaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMTY4Niw3ICsxNjg3LDcgQEAKIAkJCWdvdG8gZXJyX3NsYXZlOwogCQl9CiAJCXNsYXZlX2ltYWdlLT5wYXJlbnQgPSBjYTkxY3g0Ml9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2luaXQoJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKIAkJc2xhdmVfaW1hZ2UtPm51bWJlciA9IGk7CiAJCXNsYXZlX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTI0IHwgVk1FX0EzMiB8IFZNRV9VU0VSMSB8CkBAIC0xNjk4LDEyICsxNjk5LDEyIEBACiAKIAkJc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKIAkJCVZNRV9TVVBFUiB8IFZNRV9VU0VSIHwgVk1FX1BST0cgfCBWTUVfREFUQTsKLQkJbGlzdF9hZGRfdGFpbCgmKHNsYXZlX2ltYWdlLT5saXN0KSwKLQkJCSYoY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmc2xhdmVfaW1hZ2UtPmxpc3QsCisJCQkmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBkbWEgZW5naW5lcyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJihjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0E5MUMxNDJfTUFYX0RNQTsgaSsrKSB7CiAJCWRtYV9jdHJsciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMTcxNCwxOSArMTcxNSwxOSBAQAogCQkJZ290byBlcnJfZG1hOwogCQl9CiAJCWRtYV9jdHJsci0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCQltdXRleF9pbml0KCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfaW5pdCgmZG1hX2N0cmxyLT5tdHgpOwogCQlkbWFfY3RybHItPmxvY2tlZCA9IDA7CiAJCWRtYV9jdHJsci0+bnVtYmVyID0gaTsKIAkJZG1hX2N0cmxyLT5yb3V0ZV9hdHRyID0gVk1FX0RNQV9WTUVfVE9fTUVNIHwKIAkJCVZNRV9ETUFfTUVNX1RPX1ZNRTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnBlbmRpbmcpKTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnJ1bm5pbmcpKTsKLQkJbGlzdF9hZGRfdGFpbCgmKGRtYV9jdHJsci0+bGlzdCksCi0JCQkmKGNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCQlJTklUX0xJU1RfSEVBRCgmZG1hX2N0cmxyLT5wZW5kaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9jdHJsci0+cnVubmluZyk7CisJCWxpc3RfYWRkX3RhaWwoJmRtYV9jdHJsci0+bGlzdCwKKwkJCSZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBsb2NhdGlvbiBtb25pdG9yIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKTsKIAlsbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAobG0gPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCkBAIC0xNzM1LDExICsxNzM2LDExIEBACiAJCWdvdG8gZXJyX2xtOwogCX0KIAlsbS0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCW11dGV4X2luaXQoJihsbS0+bXR4KSk7CisJbXV0ZXhfaW5pdCgmbG0tPm10eCk7CiAJbG0tPmxvY2tlZCA9IDA7CiAJbG0tPm51bWJlciA9IDE7CiAJbG0tPm1vbml0b3JzID0gNDsKLQlsaXN0X2FkZF90YWlsKCYobG0tPmxpc3QpLCAmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJbGlzdF9hZGRfdGFpbCgmbG0tPmxpc3QsICZjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CiAKIAljYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX2dldCA9IGNhOTFjeDQyX3NsYXZlX2dldDsKIAljYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3NldCA9IGNhOTFjeDQyX3NsYXZlX3NldDsKQEAgLTE3ODYsMjggKzE3ODcsMjggQEAKIAljYTkxY3g0Ml9jcmNzcl9leGl0KGNhOTFjeDQyX2JyaWRnZSwgcGRldik7CiBlcnJfbG06CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobG0pOwogCX0KIGVycl9kbWE6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGRtYV9jdHJscik7CiAJfQogZXJyX3NsYXZlOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiBlcnJfbWFzdGVyOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCiAJCQlsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKQEAgLTE4MzEsNyArMTgzMiw3IEBACiAKIH0KIAotdm9pZCBjYTkxY3g0Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCBjYTkxY3g0Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKIAlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqbWFzdGVyX2ltYWdlOwpAQCAtMTg3MCwyOCArMTg3MSwyOCBAQAogCWNhOTFjeDQyX2NyY3NyX2V4aXQoY2E5MWN4NDJfYnJpZGdlLCBwZGV2KTsKIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpIHsKIAkJbG0gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGxtKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CiAJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShzbGF2ZV9pbWFnZSk7CiAJfQogCiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oCmluZGV4IGU3MmM2NWIuLjAyYTdjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIHN0cnVjdCBjYTkxY3g0Ml9kcml2ZXIgewotCXZvaWQgKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpiYXNlOwkvKiBCYXNlIEFkZHJlc3Mgb2YgZGV2aWNlIHJlZ2lzdGVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IG1ib3hfcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA0OTJkZGIyLi4yNmVhNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdHNpMTQ4IjsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRzaTE0OF9pZHNbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh0c2kxNDhfaWRzKSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UVU5EUkEsIFBDSV9ERVZJQ0VfSURfVFVORFJBX1RTSTE0OCkgfSwKIAl7IH0sCiB9OwpAQCAtODEsMTEgKzgxLDExIEBACiAJdTMyIHNlcnZpY2VkID0gMDsKIAogCWlmIChjaGFubmVsX21hc2sgJiBUU0kxNDhfTENTUl9JTlRTX0RNQTBTKSB7Ci0JCXdha2VfdXAoJihicmlkZ2UtPmRtYV9xdWV1ZVswXSkpOworCQl3YWtlX3VwKCZicmlkZ2UtPmRtYV9xdWV1ZVswXSk7CiAJCXNlcnZpY2VkIHw9IFRTSTE0OF9MQ1NSX0lOVENfRE1BMEM7CiAJfQogCWlmIChjaGFubmVsX21hc2sgJiBUU0kxNDhfTENTUl9JTlRTX0RNQTFTKSB7Ci0JCXdha2VfdXAoJihicmlkZ2UtPmRtYV9xdWV1ZVsxXSkpOworCQl3YWtlX3VwKCZicmlkZ2UtPmRtYV9xdWV1ZVsxXSk7CiAJCXNlcnZpY2VkIHw9IFRTSTE0OF9MQ1NSX0lOVENfRE1BMUM7CiAJfQogCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAoZXJyb3IpIHsKIAkJZXJyb3ItPmFkZHJlc3MgPSBlcnJvcl9hZGRyOwogCQllcnJvci0+YXR0cmlidXRlcyA9IGVycm9yX2F0dHJpYjsKLQkJbGlzdF9hZGRfdGFpbCgmKGVycm9yLT5saXN0KSwgJih0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSk7CisJCWxpc3RfYWRkX3RhaWwoJmVycm9yLT5saXN0LCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycyk7CiAJfSBlbHNlIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciAiCiAJCQkiVk1FYnVzIEVycm9yIHJlcG9ydGluZ1xuIik7CkBAIC0yMTAsNyArMjEwLDcgQEAKICAqLwogc3RhdGljIHUzMiB0c2kxNDhfSUFDS19pcnFoYW5kbGVyKHN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2UpCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+aWFja19xdWV1ZSkpOworCXdha2VfdXAoJmJyaWRnZS0+aWFja19xdWV1ZSk7CiAKIAlyZXR1cm4gVFNJMTQ4X0xDU1JfSU5UQ19JQUNLQzsKIH0KQEAgLTMyMCw5ICszMjAsOSBAQAogCWJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OwogCiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykpOworCUlOSVRfTElTVF9IRUFEKCZ0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKTsKIAotCW11dGV4X2luaXQoJih0c2kxNDhfYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfaW5pdCgmdHNpMTQ4X2JyaWRnZS0+aXJxX210eCk7CiAKIAlyZXN1bHQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsCiAJCQkgICAgIHRzaTE0OF9pcnFoYW5kbGVyLApAQCAtMzc0LDggKzM3NCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0c2kxNDhfaXJxX2V4aXQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCB0c2kxNDhfaXJxX2V4aXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UsCisJc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CisJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OworCiAJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwpAQCAtMzg0LDEzICszODcsMTMgQEAKIAlpb3dyaXRlMzJiZSgweEZGRkZGRkZGLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRDKTsKIAogCS8qIERldGFjaCBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWZyZWVfaXJxKHBkZXYtPmlycSwgcGRldik7CisJZnJlZV9pcnEocGRldi0+aXJxLCB0c2kxNDhfYnJpZGdlKTsKIH0KIAogLyoKICAqIENoZWNrIHRvIHNlZSBpZiBhbiBJQUNrIGhhcyBiZWVuIHJlY2VpdmVkLCByZXR1cm4gdHJ1ZSAoMSkgb3IgZmFsc2UgKDApLgogICovCi1pbnQgdHNpMTQ4X2lhY2tfcmVjZWl2ZWQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSkKK3N0YXRpYyBpbnQgdHNpMTQ4X2lhY2tfcmVjZWl2ZWQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSkKIHsKIAl1MzIgdG1wOwogCkBAIC00MDUsNyArNDA4LDcgQEAKIC8qCiAgKiBDb25maWd1cmUgVk1FIGludGVycnVwdAogICovCi12b2lkIHRzaTE0OF9pcnFfc2V0KHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsCitzdGF0aWMgdm9pZCB0c2kxNDhfaXJxX3NldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSwgaW50IGxldmVsLAogCWludCBzdGF0ZSwgaW50IHN5bmMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC00NDUsMTQgKzQ0OCwxNSBAQAogICogR2VuZXJhdGUgYSBWTUUgYnVzIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIGxldmVsICYgdmVjdG9yLiBXYWl0IGZvcgogICogaW50ZXJydXB0IHRvIGJlIGFja2VkLgogICovCi1pbnQgdHNpMTQ4X2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQorc3RhdGljIGludCB0c2kxNDhfaXJxX2dlbmVyYXRlKHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsCisJaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSB0c2kxNDhfYnJpZGdlLT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJLyogUmVhZCBWSUNSIHJlZ2lzdGVyICovCiAJdG1wID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9WSUNSKTsKQEAgLTQ3MCw3ICs0NzQsNyBAQAogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShicmlkZ2UtPmlhY2tfcXVldWUsCiAJCXRzaTE0OF9pYWNrX3JlY2VpdmVkKGJyaWRnZSkpOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT52bWVfaW50KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTYsNyArNTAwLDcgQEAKIAkgKi8KIAllcnJfcG9zID0gTlVMTDsKIAkvKiBJdGVyYXRlIHRocm91Z2ggZXJyb3JzICovCi0JbGlzdF9mb3JfZWFjaChlcnJfcG9zLCAmKHRzaTE0OF9icmlkZ2UtPnZtZV9lcnJvcnMpKSB7CisJbGlzdF9mb3JfZWFjaChlcnJfcG9zLCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykgewogCQl2bWVfZXJyID0gbGlzdF9lbnRyeShlcnJfcG9zLCBzdHJ1Y3Qgdm1lX2J1c19lcnJvciwgbGlzdCk7CiAJCWlmICgodm1lX2Vyci0+YWRkcmVzcyA+PSBhZGRyZXNzKSAmJgogCQkJKHZtZV9lcnItPmFkZHJlc3MgPCBib3VuZCkpIHsKQEAgLTUzMCw3ICs1MzQsNyBAQAogCSAqLwogCWVycl9wb3MgPSBOVUxMOwogCS8qIEl0ZXJhdGUgdGhyb3VnaCBlcnJvcnMgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZXJyX3BvcywgdGVtcCwgJih0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShlcnJfcG9zLCB0ZW1wLCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykgewogCQl2bWVfZXJyID0gbGlzdF9lbnRyeShlcnJfcG9zLCBzdHJ1Y3Qgdm1lX2J1c19lcnJvciwgbGlzdCk7CiAKIAkJaWYgKCh2bWVfZXJyLT5hZGRyZXNzID49IGFkZHJlc3MpICYmCkBAIC01NDUsNyArNTQ5LDcgQEAKIC8qCiAgKiBJbml0aWFsaXplIGEgc2xhdmUgd2luZG93IHdpdGggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzLgogICovCi1pbnQgdHNpMTQ4X3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCitzdGF0aWMgaW50IHRzaTE0OF9zbGF2ZV9zZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsCiAJZG1hX2FkZHJfdCBwY2lfYmFzZSwgdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewpAQCAtNjk1LDcgKzY5OSw3IEBACiAvKgogICogR2V0IHNsYXZlIHdpbmRvdyBjb25maWd1cmF0aW9uLgogICovCi1pbnQgdHNpMTQ4X3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCB0c2kxNDhfc2xhdmVfZ2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCWRtYV9hZGRyX3QgKnBjaV9iYXNlLCB2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKIHsKQEAgLTgxOSw4ICs4MjMsOCBAQAogCQlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIAkJaWYgKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSAhPSBOVUxMKQogCQkJa2ZyZWUoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lKTsKLQkJcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKLQkJbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJcmVsZWFzZV9yZXNvdXJjZSgmaW1hZ2UtPmJ1c19yZXNvdXJjZSk7CisJCW1lbXNldCgmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCX0KIAogCS8qIEV4aXQgaGVyZSBpZiBzaXplIGlzIHplcm8gKi8KQEAgLTg0NSw3ICs4NDksNyBAQAogCWltYWdlLT5idXNfcmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAogCXJldHZhbCA9IHBjaV9idXNfYWxsb2NfcmVzb3VyY2UocGRldi0+YnVzLAotCQkmKGltYWdlLT5idXNfcmVzb3VyY2UpLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCisJCSZpbWFnZS0+YnVzX3Jlc291cmNlLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCiAJCTAsIE5VTEwsIE5VTEwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtICIKQEAgLTg2OCwxMCArODcyLDEwIEBACiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIGVycl9yZW1hcDoKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogZXJyX3Jlc291cmNlOgogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIGVycl9uYW1lOgogCXJldHVybiByZXR2YWw7CiB9CkBAIC04ODMsMTUgKzg4NywxNSBAQAogewogCWlvdW5tYXAoaW1hZ2UtPmtlcm5fYmFzZSk7CiAJaW1hZ2UtPmtlcm5fYmFzZSA9IE5VTEw7Ci0JcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKIAlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCW1lbXNldCgmKGltYWdlLT5idXNfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiB9CiAKIC8qCiAgKiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0Ym91bmQgd2luZG93LgogICovCi1pbnQgdHNpMTQ4X21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgdHNpMTQ4X21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAogCXZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSwgdm1lX3dpZHRoX3QgZHdpZHRoKQogewpAQCAtOTI0LDcgKzkyOCw3IEBACiAJCWdvdG8gZXJyX3dpbmRvdzsKIAl9CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJLyogTGV0J3MgYWxsb2NhdGUgdGhlIHJlc291cmNlIGhlcmUgcmF0aGVyIHRoYW4gZnVydGhlciB1cCB0aGUgc3RhY2sgYXMKIAkgKiBpdCBhdm9pZHMgcHVzaGluZyBsb2FkcyBvZiBidXMgZGVwZW5kYW50IHN0dWZmIHVwIHRoZSBzdGFjay4gSWYgc2l6ZQpAQCAtOTMyLDcgKzkzNiw3IEBACiAJICovCiAJcmV0dmFsID0gdHNpMTQ4X2FsbG9jX3Jlc291cmNlKGltYWdlLCBzaXplKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCiAJCQkicmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZXM7CkBAIC05NTksMTkgKzk2MywxOSBAQAogCXJlZ19zcGxpdCh2bWVfb2Zmc2V0LCAmdm1lX29mZnNldF9oaWdoLCAmdm1lX29mZnNldF9sb3cpOwogCiAJaWYgKHBjaV9iYXNlX2xvdyAmIDB4RkZGRikgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBQQ0kgYmFzZSBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAocGNpX2JvdW5kX2xvdyAmIDB4RkZGRikgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBQQ0kgYm91bmQgYWxpZ25tZW50XG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZ3JhbjsKIAl9CiAJaWYgKHZtZV9vZmZzZXRfbG93ICYgMHhGRkZGKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIFZNRSBPZmZzZXQgIgogCQkJImFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CkBAIC0xMDM1LDcgKzEwMzksNyBAQAogCQl0ZW1wX2N0bCB8PSBUU0kxNDhfTENTUl9PVEFUX0RCV18zMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2R3aWR0aDsKQEAgLTEwNzIsNyArMTA3Niw3IEBACiAJCXRlbXBfY3RsIHw9IFRTSTE0OF9MQ1NSX09UQVRfQU1PREVfVVNFUjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hc3BhY2U7CkBAIC0xMTA5LDcgKzExMTMsNyBAQAogCWlvd3JpdGUzMmJlKHRlbXBfY3RsLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9PVFtpXSArCiAJCVRTSTE0OF9MQ1NSX09GRlNFVF9PVEFUKTsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCXJldHVybiAwOwogCiBlcnJfYXNwYWNlOgpAQCAtMTEyNyw3ICsxMTMxLDcgQEAKICAqCiAgKiBYWFggTm90IHBhcnNpbmcgcHJlZmV0Y2ggaW5mb3JtYXRpb24uCiAgKi8KLWludCBfX3RzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCBfX3RzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSwgdm1lX3dpZHRoX3QgKmR3aWR0aCkKIHsKQEAgLTEyMzcsMjMgKzEyNDEsMjMgQEAKIH0KIAogCi1pbnQgdHNpMTQ4X21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCitzdGF0aWMgaW50IHRzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSwgdm1lX3dpZHRoX3QgKmR3aWR0aCkKIHsKIAlpbnQgcmV0dmFsOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHZhbCA9IF9fdHNpMTQ4X21hc3Rlcl9nZXQoaW1hZ2UsIGVuYWJsZWQsIHZtZV9iYXNlLCBzaXplLCBhc3BhY2UsCiAJCWN5Y2xlLCBkd2lkdGgpOwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IHRzaTE0OF9tYXN0ZXJfcmVhZChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHRzaTE0OF9tYXN0ZXJfcmVhZChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHJldHZhbCwgZW5hYmxlZDsKQEAgLTEyNjYsNyArMTI3MCw3IEBACiAKIAl0c2kxNDhfYnJpZGdlID0gaW1hZ2UtPnBhcmVudDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAltZW1jcHlfZnJvbWlvKGJ1ZiwgaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldCwgKHVuc2lnbmVkIGludCljb3VudCk7CiAJcmV0dmFsID0gY291bnQ7CkBAIC0xMjg5LDEzICsxMjkzLDEzIEBACiAJfQogCiBza2lwX2NoazoKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKIAotc3NpemVfdCB0c2kxNDhfbWFzdGVyX3dyaXRlKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAorc3RhdGljIHNzaXplX3QgdHNpMTQ4X21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHJldHZhbCA9IDAsIGVuYWJsZWQ7CkBAIC0xMzEyLDcgKzEzMTYsNyBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJbWVtY3B5X3RvaW8oaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldCwgYnVmLCAodW5zaWduZWQgaW50KWNvdW50KTsKIAlyZXR2YWwgPSBjb3VudDsKQEAgLTEzNTIsNyArMTM1Niw3IEBACiAJfQogCiBza2lwX2NoazoKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMzYyLDcgKzEzNjYsNyBAQAogICoKICAqIFJlcXVpcmVzIGEgcHJldmlvdXNseSBjb25maWd1cmVkIG1hc3RlciB3aW5kb3csIHJldHVybnMgZmluYWwgdmFsdWUuCiAgKi8KLXVuc2lnbmVkIGludCB0c2kxNDhfbWFzdGVyX3JtdyhzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsCitzdGF0aWMgdW5zaWduZWQgaW50IHRzaTE0OF9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKIAl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGNvbXBhcmUsIHVuc2lnbmVkIGludCBzd2FwLAogCWxvZmZfdCBvZmZzZXQpCiB7CkBAIC0xMzc4LDEwICsxMzgyLDEwIEBACiAJaSA9IGltYWdlLT5udW1iZXI7CiAKIAkvKiBMb2NraW5nIGFzIHdlIGNhbiBvbmx5IGRvIG9uZSBvZiB0aGVzZSBhdCBhIHRpbWUgKi8KLQltdXRleF9sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfbG9jaygmYnJpZGdlLT52bWVfcm13KTsKIAogCS8qIExvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcGNpX2FkZHJfaGlnaCA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfT1RbaV0gKwogCQlUU0kxNDhfTENTUl9PRkZTRVRfT1RTQVUpOwpAQCAtMTQxMSw5ICsxNDE1LDkgQEAKIAl0bXAgJj0gflRTSTE0OF9MQ1NSX1ZNQ1RSTF9STVdFTjsKIAlpb3dyaXRlMzJiZSh0bXAsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX1ZNQ1RSTCk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAotCW11dGV4X3VubG9jaygmKGJyaWRnZS0+dm1lX3JtdykpOworCW11dGV4X3VubG9jaygmYnJpZGdlLT52bWVfcm13KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjA5LDggKzE2MTMsOCBAQAogLyoKICAqIEFkZCBhIGxpbmsgbGlzdCBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0CiAgKi8KLWludCB0c2kxNDhfZG1hX2xpc3RfYWRkKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKnNyYywKLQlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpkZXN0LCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHRzaTE0OF9kbWFfbGlzdF9hZGQoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCwKKwlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKmRlc3QsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSAqZW50cnksICpwcmV2OwogCXUzMiBhZGRyZXNzX2hpZ2gsIGFkZHJlc3NfbG93OwpAQCAtMTYzMywxMCArMTYzNywxMCBAQAogCX0KIAogCS8qIFRlc3QgZGVzY3JpcHRvciBhbGlnbm1lbnQgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpJihlbnRyeS0+ZGVzY3JpcHRvcikgJiAweDcpIHsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpJmVudHJ5LT5kZXNjcmlwdG9yICYgMHg3KSB7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiRGVzY3JpcHRvciBub3QgYWxpZ25lZCB0byA4ICIKIAkJCSJieXRlIGJvdW5kYXJ5IGFzIHJlcXVpcmVkOiAlcFxuIiwKLQkJCSYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwkJCSZlbnRyeS0+ZGVzY3JpcHRvcik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FsaWduOwogCX0KQEAgLTE2NDQsNyArMTY0OCw3IEBACiAJLyogR2l2ZW4gd2UgYXJlIGdvaW5nIHRvIGZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUsIHdlIHByb2JhYmx5IGRvbid0CiAJICogbmVlZCB0byB6ZXJvIGl0LCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSBmb3Igbm93LgogCSAqLwotCW1lbXNldCgmKGVudHJ5LT5kZXNjcmlwdG9yKSwgMCwgc2l6ZW9mKHN0cnVjdCB0c2kxNDhfZG1hX2Rlc2NyaXB0b3IpKTsKKwltZW1zZXQoJmVudHJ5LT5kZXNjcmlwdG9yLCAwLCBzaXplb2Yoc3RydWN0IHRzaTE0OF9kbWFfZGVzY3JpcHRvcikpOwogCiAJLyogRmlsbCBvdXQgc291cmNlIHBhcnQgKi8KIAlzd2l0Y2ggKHNyYy0+dHlwZSkgewpAQCAtMTY4MSw3ICsxNjg1LDcgQEAKIAkJZW50cnktPmRlc2NyaXB0b3IuZHNhdCA9IFRTSTE0OF9MQ1NSX0RTQVRfVFlQX1ZNRTsKIAogCQlyZXR2YWwgPSB0c2kxNDhfZG1hX3NldF92bWVfc3JjX2F0dHJpYnV0ZXMoCi0JCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICYoZW50cnktPmRlc2NyaXB0b3IuZHNhdCksCisJCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICZlbnRyeS0+ZGVzY3JpcHRvci5kc2F0LAogCQkJdm1lX2F0dHItPmFzcGFjZSwgdm1lX2F0dHItPmN5Y2xlLCB2bWVfYXR0ci0+ZHdpZHRoKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGVycl9zb3VyY2U7CkBAIC0xNzE5LDcgKzE3MjMsNyBAQAogCQllbnRyeS0+ZGVzY3JpcHRvci5kZGF0ID0gVFNJMTQ4X0xDU1JfRERBVF9UWVBfVk1FOwogCiAJCXJldHZhbCA9IHRzaTE0OF9kbWFfc2V0X3ZtZV9kZXN0X2F0dHJpYnV0ZXMoCi0JCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICYoZW50cnktPmRlc2NyaXB0b3IuZGRhdCksCisJCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICZlbnRyeS0+ZGVzY3JpcHRvci5kZGF0LAogCQkJdm1lX2F0dHItPmFzcGFjZSwgdm1lX2F0dHItPmN5Y2xlLCB2bWVfYXR0ci0+ZHdpZHRoKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGVycl9kZXN0OwpAQCAtMTczNSwxNiArMTczOSwxNiBAQAogCWVudHJ5LT5kZXNjcmlwdG9yLmRjbnQgPSAodTMyKWNvdW50OwogCiAJLyogQWRkIHRvIGxpc3QgKi8KLQlsaXN0X2FkZF90YWlsKCYoZW50cnktPmxpc3QpLCAmKGxpc3QtPmVudHJpZXMpKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmxpc3QtPmVudHJpZXMpOwogCiAJLyogRmlsbCBvdXQgcHJldmlvdXMgZGVzY3JpcHRvcnMgIk5leHQgQWRkcmVzcyIgKi8KLQlpZiAoZW50cnktPmxpc3QucHJldiAhPSAmKGxpc3QtPmVudHJpZXMpKSB7CisJaWYgKGVudHJ5LT5saXN0LnByZXYgIT0gJmxpc3QtPmVudHJpZXMpIHsKIAkJcHJldiA9IGxpc3RfZW50cnkoZW50cnktPmxpc3QucHJldiwgc3RydWN0IHRzaTE0OF9kbWFfZW50cnksCiAJCQlsaXN0KTsKIAkJLyogV2UgbmVlZCB0aGUgYnVzIGFkZHJlc3MgZm9yIHRoZSBwb2ludGVyICovCi0JCWRlc2NfcHRyID0gdmlydF90b19idXMoJihlbnRyeS0+ZGVzY3JpcHRvcikpOwotCQlyZWdfc3BsaXQoZGVzY19wdHIsICYocHJldi0+ZGVzY3JpcHRvci5kbmxhdSksCi0JCQkmKHByZXYtPmRlc2NyaXB0b3IuZG5sYWwpKTsKKwkJZGVzY19wdHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOworCQlyZWdfc3BsaXQoZGVzY19wdHIsICZwcmV2LT5kZXNjcmlwdG9yLmRubGF1LAorCQkJJnByZXYtPmRlc2NyaXB0b3IuZG5sYWwpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTc4Miw3ICsxNzg2LDcgQEAKICAqCiAgKiBYWFggTmVlZCB0byBwcm92aWRlIGNvbnRyb2wgcmVnaXN0ZXIgY29uZmlndXJhdGlvbi4KICAqLwotaW50IHRzaTE0OF9kbWFfbGlzdF9leGVjKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCitzdGF0aWMgaW50IHRzaTE0OF9kbWFfbGlzdF9leGVjKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UgKmN0cmxyOwogCWludCBjaGFubmVsLCByZXR2YWwgPSAwOwpAQCAtMTc5OSwzMCArMTgwMywzMCBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOwogCiAJY2hhbm5lbCA9IGN0cmxyLT5udW1iZXI7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJihjdHJsci0+cnVubmluZykpKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZjdHJsci0+cnVubmluZykpIHsKIAkJLyoKIAkJICogWFhYIFdlIGhhdmUgYW4gYWN0aXZlIERNQSB0cmFuc2ZlciBhbmQgY3VycmVudGx5IGhhdmVuJ3QKIAkJICogICAgIHNvcnRlZCBvdXQgdGhlIG1lY2hhbmlzbSBmb3IgInBlbmRpbmciIERNQSB0cmFuc2ZlcnMuCiAJCSAqICAgICBSZXR1cm4gYnVzeS4KIAkJICovCiAJCS8qIE5lZWQgdG8gYWRkIHRvIHBlbmRpbmcgaGVyZSAqLwotCQltdXRleF91bmxvY2soJihjdHJsci0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfSBlbHNlIHsKLQkJbGlzdF9hZGQoJihsaXN0LT5saXN0KSwgJihjdHJsci0+cnVubmluZykpOworCQlsaXN0X2FkZCgmbGlzdC0+bGlzdCwgJmN0cmxyLT5ydW5uaW5nKTsKIAl9CiAKIAkvKiBHZXQgZmlyc3QgYnVzIGFkZHJlc3MgYW5kIHdyaXRlIGludG8gcmVnaXN0ZXJzICovCi0JZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCYobGlzdC0+ZW50cmllcyksIHN0cnVjdCB0c2kxNDhfZG1hX2VudHJ5LAorCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmbGlzdC0+ZW50cmllcywgc3RydWN0IHRzaTE0OF9kbWFfZW50cnksCiAJCWxpc3QpOwogCi0JYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCi0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlyZWdfc3BsaXQoYnVzX2FkZHIsICZidXNfYWRkcl9oaWdoLCAmYnVzX2FkZHJfbG93KTsKIApAQCAtMTg1MCw5ICsxODU0LDkgQEAKIAl9CiAKIAkvKiBSZW1vdmUgbGlzdCBmcm9tIHJ1bm5pbmcgbGlzdCAqLwotCW11dGV4X2xvY2soJihjdHJsci0+bXR4KSk7Ci0JbGlzdF9kZWwoJihsaXN0LT5saXN0KSk7Ci0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOworCWxpc3RfZGVsKCZsaXN0LT5saXN0KTsKKwltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4NjIsMTMgKzE4NjYsMTMgQEAKICAqCiAgKiBXZSBoYXZlIGEgc2VwYXJhdGUgZnVuY3Rpb24sIGRvbid0IGFzc3VtZSB0aGF0IHRoZSBjaGFpbiBjYW4ndCBiZSByZXVzZWQuCiAgKi8KLWludCB0c2kxNDhfZG1hX2xpc3RfZW1wdHkoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgdHNpMTQ4X2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAlzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSAqZW50cnk7CiAKIAkvKiBkZXRhY2ggYW5kIGZyZWUgZWFjaCBlbnRyeSAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICYobGlzdC0+ZW50cmllcykpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmbGlzdC0+ZW50cmllcykgewogCQlsaXN0X2RlbChwb3MpOwogCQllbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSwgbGlzdCk7CiAJCWtmcmVlKGVudHJ5KTsKQEAgLTE4ODQsNyArMTg4OCw3IEBACiAgKiBUaGlzIGRvZXMgbm90IGVuYWJsZSB0aGUgTE0gbW9uaXRvciAtIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgZmlyc3QKICAqIGNhbGxiYWNrIGlzIGF0dGFjaGVkIGFuZCBkaXNhYmxlZCB3aGVuIHRoZSBsYXN0IGNhbGxiYWNrIGlzIHJlbW92ZWQuCiAgKi8KLWludCB0c2kxNDhfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX3NldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgdW5zaWduZWQgbG9uZyBsb25nIGxtX2Jhc2UsCiAJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewogCXUzMiBsbV9iYXNlX2hpZ2gsIGxtX2Jhc2VfbG93LCBsbV9jdGwgPSAwOwpAQCAtMTg5NiwxMiArMTkwMCwxMiBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgY2FsbGJhY2sgYXR0YWNoZWQsIHdlIGNhbid0IG1vdmUgaXQhICovCiAJZm9yIChpID0gMDsgaSA8IGxtLT5tb25pdG9yczsgaSsrKSB7CiAJCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW2ldICE9IE5VTEwpIHsKLQkJCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkxvY2F0aW9uIG1vbml0b3IgIgogCQkJCSJjYWxsYmFjayBhdHRhY2hlZCwgY2FuJ3QgcmVzZXRcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTE5MjIsNyArMTkyNiw3IEBACiAJCWxtX2N0bCB8PSBUU0kxNDhfTENTUl9MTUFUX0FTX0E2NDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKQEAgLTE5NDMsNyArMTk0Nyw3IEBACiAJaW93cml0ZTMyYmUobG1fYmFzZV9sb3csIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQkFMKTsKIAlpb3dyaXRlMzJiZShsbV9jdGwsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5NTEsMTUgKzE5NTUsMTUgQEAKIC8qIEdldCBjb25maWd1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayBtb25pdG9yIGFuZCByZXR1cm4gd2hldGhlciBpdCBpcyBlbmFibGVkCiAgKiBvciBkaXNhYmxlZC4KICAqLwotaW50IHRzaTE0OF9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX2dldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwKKwl1bnNpZ25lZCBsb25nIGxvbmcgKmxtX2Jhc2UsIHZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQogewogCXUzMiBsbV9iYXNlX2hpZ2gsIGxtX2Jhc2VfbG93LCBsbV9jdGwsIGVuYWJsZWQgPSAwOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAlsbV9iYXNlX2hpZ2ggPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQkFVKTsKIAlsbV9iYXNlX2xvdyA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1CQUwpOwpAQCAtMTk5Miw3ICsxOTk2LDcgQEAKIAlpZiAobG1fY3RsICYgVFNJMTQ4X0xDU1JfTE1BVF9EQVRBKQogCQkqY3ljbGUgfD0gVk1FX0RBVEE7CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiBlbmFibGVkOwogfQpAQCAtMjAwMiw3ICsyMDA2LDcgQEAKICAqCiAgKiBDYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgbW9uaXRvciB0cmlnZ2VyZWQuCiAgKi8KLWludCB0c2kxNDhfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQpKQogewogCXUzMiBsbV9jdGwsIHRtcDsKQEAgLTIwMTMsMTIgKzIwMTcsMTIgQEAKIAogCWJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OwogCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAogCS8qIEVuc3VyZSB0aGF0IHRoZSBsb2NhdGlvbiBtb25pdG9yIGlzIGNvbmZpZ3VyZWQgLSBuZWVkIFBHTSBvciBEQVRBICovCiAJbG1fY3RsID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9MTUFUKTsKIAlpZiAoKGxtX2N0bCAmIChUU0kxNDhfTENTUl9MTUFUX1BHTSB8IFRTSTE0OF9MQ1NSX0xNQVRfREFUQSkpID09IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkxvY2F0aW9uIG1vbml0b3Igbm90IHByb3Blcmx5ICIKIAkJCSJjb25maWd1cmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDI2LDcgKzIwMzAsNyBAQAogCiAJLyogQ2hlY2sgdGhhdCBhIGNhbGxiYWNrIGlzbid0IGFscmVhZHkgYXR0YWNoZWQgKi8KIAlpZiAoYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSAhPSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJFeGlzdGluZyBjYWxsYmFjayBhdHRhY2hlZFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjA0OSw3ICsyMDUzLDcgQEAKIAkJaW93cml0ZTMyYmUobG1fY3RsLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9MTUFUKTsKIAl9CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA1NywxNCArMjA2MSwxNCBAQAogLyoKICAqIERldGFjaCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvcm4gYSBzcGVjaWZpYyBsb2NhdGlvbiBtb25pdG9yLgogICovCi1pbnQgdHNpMTQ4X2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCitzdGF0aWMgaW50IHRzaTE0OF9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQogewogCXUzMiBsbV9lbiwgdG1wOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBEaXNhYmxlIExvY2F0aW9uIE1vbml0b3IgYW5kIGVuc3VyZSBwcmV2aW91cyBpbnRlcnJ1cHRzIGFyZSBjbGVhciAqLwogCWxtX2VuID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CkBAIC0yMDg5LDcgKzIwOTMsNyBAQAogCQlpb3dyaXRlMzJiZSh0bXAsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDk3LDcgKzIxMDEsNyBAQAogLyoKICAqIERldGVybWluZSBHZW9ncmFwaGljYWwgQWRkcmVzc2luZwogICovCi1pbnQgdHNpMTQ4X3Nsb3RfZ2V0KHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlKQorc3RhdGljIGludCB0c2kxNDhfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UpCiB7CiAJdTMyIHNsb3QgPSAwOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CkBAIC0yMTQyLDcgKzIxNDYsNyBAQAogCiAJLyogQWxsb2NhdGUgbWVtIGZvciBDUi9DU1IgaW1hZ2UgKi8KIAlicmlkZ2UtPmNyY3NyX2tlcm5lbCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFZNRV9DUkNTUl9CVUZfU0laRSwKLQkJJihicmlkZ2UtPmNyY3NyX2J1cykpOworCQkmYnJpZGdlLT5jcmNzcl9idXMpOwogCWlmIChicmlkZ2UtPmNyY3NyX2tlcm5lbCA9PSBOVUxMKSB7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgogCQkJIkNSL0NTUiBpbWFnZVxuIik7CkBAIC0yMjgwLDEzICsyMjg0LDEzIEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcyAmIG11dHVhbCBleGNsdXNpb24gZmxhZ3MgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYodHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzBdKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHRzaTE0OF9kZXZpY2UtPmRtYV9xdWV1ZVsxXSkpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJih0c2kxNDhfZGV2aWNlLT5pYWNrX3F1ZXVlKSk7Ci0JbXV0ZXhfaW5pdCgmKHRzaTE0OF9kZXZpY2UtPnZtZV9pbnQpKTsKLQltdXRleF9pbml0KCYodHNpMTQ4X2RldmljZS0+dm1lX3JtdykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRzaTE0OF9kZXZpY2UtPmRtYV9xdWV1ZVswXSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzFdKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0c2kxNDhfZGV2aWNlLT5pYWNrX3F1ZXVlKTsKKwltdXRleF9pbml0KCZ0c2kxNDhfZGV2aWNlLT52bWVfaW50KTsKKwltdXRleF9pbml0KCZ0c2kxNDhfZGV2aWNlLT52bWVfcm13KTsKIAotCXRzaTE0OF9icmlkZ2UtPnBhcmVudCA9ICYocGRldi0+ZGV2KTsKKwl0c2kxNDhfYnJpZGdlLT5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXN0cmNweSh0c2kxNDhfYnJpZGdlLT5uYW1lLCBkcml2ZXJfbmFtZSk7CiAKIAkvKiBTZXR1cCBJUlEgKi8KQEAgLTIzMTQsNyArMjMxOCw3IEBACiAJCQlnb3RvIGVycl9tYXN0ZXI7CiAJCX0KIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCXNwaW5fbG9ja19pbml0KCYodHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRzaTE0OF9kZXZpY2UtPmZsdXNoX2ltYWdlLT5sb2NrKTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmxvY2tlZCA9IDE7CiAJCXRzaTE0OF9kZXZpY2UtPmZsdXNoX2ltYWdlLT5udW1iZXIgPSBtYXN0ZXJfbnVtOwogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfApAQCAtMjMyNCwxMyArMjMyOCwxMyBAQAogCQkJVk1FXzJlU1NUMTYwIHwgVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwKIAkJCVZNRV9VU0VSIHwgVk1FX1BST0cgfCBWTUVfREFUQTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPndpZHRoX2F0dHIgPSBWTUVfRDE2IHwgVk1FX0QzMjsKLQkJbWVtc2V0KCYodHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsCisJCW1lbXNldCgmdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwKIAkJCXNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwogCX0KIAogCS8qIEFkZCBtYXN0ZXIgd2luZG93cyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXJfbnVtOyBpKyspIHsKIAkJbWFzdGVyX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0yMzQxLDcgKzIzNDUsNyBAQAogCQkJZ290byBlcnJfbWFzdGVyOwogCQl9CiAJCW1hc3Rlcl9pbWFnZS0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQkJc3Bpbl9sb2NrX2luaXQoJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMDsKIAkJbWFzdGVyX2ltYWdlLT5udW1iZXIgPSBpOwogCQltYXN0ZXJfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8CkBAIC0yMzUxLDE1ICsyMzU1LDE1IEBACiAJCQlWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfCBWTUVfVVNFUiB8CiAJCQlWTUVfUFJPRyB8IFZNRV9EQVRBOwogCQltYXN0ZXJfaW1hZ2UtPndpZHRoX2F0dHIgPSBWTUVfRDE2IHwgVk1FX0QzMjsKLQkJbWVtc2V0KCYobWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UpLCAwLAorCQltZW1zZXQoJm1hc3Rlcl9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAogCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQltYXN0ZXJfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwotCQlsaXN0X2FkZF90YWlsKCYobWFzdGVyX2ltYWdlLT5saXN0KSwKLQkJCSYodHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpOworCQlsaXN0X2FkZF90YWlsKCZtYXN0ZXJfaW1hZ2UtPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIHNsYXZlIHdpbmRvd3MgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcyk7CiAJZm9yIChpID0gMDsgaSA8IFRTSTE0OF9NQVhfU0xBVkU7IGkrKykgewogCQlzbGF2ZV9pbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0yMzcwLDcgKzIzNzQsNyBAQAogCQkJZ290byBlcnJfc2xhdmU7CiAJCX0KIAkJc2xhdmVfaW1hZ2UtPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2luaXQoJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKIAkJc2xhdmVfaW1hZ2UtPm51bWJlciA9IGk7CiAJCXNsYXZlX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8IFZNRV9BMzIgfApAQCAtMjM4MCwxMiArMjM4NCwxMiBAQAogCQkJVk1FXzJlVk1FIHwgVk1FXzJlU1NUIHwgVk1FXzJlU1NUQiB8IFZNRV8yZVNTVDE2MCB8CiAJCQlWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfCBWTUVfVVNFUiB8CiAJCQlWTUVfUFJPRyB8IFZNRV9EQVRBOwotCQlsaXN0X2FkZF90YWlsKCYoc2xhdmVfaW1hZ2UtPmxpc3QpLAotCQkJJih0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmc2xhdmVfaW1hZ2UtPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKIAl9CiAKIAkvKiBBZGQgZG1hIGVuZ2luZXMgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCUlOSVRfTElTVF9IRUFEKCZ0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgVFNJMTQ4X01BWF9ETUE7IGkrKykgewogCQlkbWFfY3RybHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTIzOTYsMjEgKzI0MDAsMjEgQEAKIAkJCWdvdG8gZXJyX2RtYTsKIAkJfQogCQlkbWFfY3RybHItPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihkbWFfY3RybHItPm10eCkpOworCQltdXRleF9pbml0KCZkbWFfY3RybHItPm10eCk7CiAJCWRtYV9jdHJsci0+bG9ja2VkID0gMDsKIAkJZG1hX2N0cmxyLT5udW1iZXIgPSBpOwogCQlkbWFfY3RybHItPnJvdXRlX2F0dHIgPSBWTUVfRE1BX1ZNRV9UT19NRU0gfAogCQkJVk1FX0RNQV9NRU1fVE9fVk1FIHwgVk1FX0RNQV9WTUVfVE9fVk1FIHwKIAkJCVZNRV9ETUFfTUVNX1RPX01FTSB8IFZNRV9ETUFfUEFUVEVSTl9UT19WTUUgfAogCQkJVk1FX0RNQV9QQVRURVJOX1RPX01FTTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnBlbmRpbmcpKTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnJ1bm5pbmcpKTsKLQkJbGlzdF9hZGRfdGFpbCgmKGRtYV9jdHJsci0+bGlzdCksCi0JCQkmKHRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9jdHJsci0+cGVuZGluZyk7CisJCUlOSVRfTElTVF9IRUFEKCZkbWFfY3RybHItPnJ1bm5pbmcpOworCQlsaXN0X2FkZF90YWlsKCZkbWFfY3RybHItPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIGxvY2F0aW9uIG1vbml0b3IgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CiAJbG0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxtID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgpAQCAtMjQxOSwxMSArMjQyMywxMSBAQAogCQlnb3RvIGVycl9sbTsKIAl9CiAJbG0tPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JbXV0ZXhfaW5pdCgmKGxtLT5tdHgpKTsKKwltdXRleF9pbml0KCZsbS0+bXR4KTsKIAlsbS0+bG9ja2VkID0gMDsKIAlsbS0+bnVtYmVyID0gMTsKIAlsbS0+bW9uaXRvcnMgPSA0OwotCWxpc3RfYWRkX3RhaWwoJihsbS0+bGlzdCksICYodHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJbGlzdF9hZGRfdGFpbCgmbG0tPmxpc3QsICZ0c2kxNDhfYnJpZGdlLT5sbV9yZXNvdXJjZXMpOwogCiAJdHNpMTQ4X2JyaWRnZS0+c2xhdmVfZ2V0ID0gdHNpMTQ4X3NsYXZlX2dldDsKIAl0c2kxNDhfYnJpZGdlLT5zbGF2ZV9zZXQgPSB0c2kxNDhfc2xhdmVfc2V0OwpAQCAtMjQ3Nyw0MSArMjQ4MSw0MCBAQAogCiAJcmV0dXJuIDA7CiAKLQl2bWVfdW5yZWdpc3Rlcl9icmlkZ2UodHNpMTQ4X2JyaWRnZSk7CiBlcnJfcmVnOgogCXRzaTE0OF9jcmNzcl9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogZXJyX2NyY3NyOgogZXJyX2xtOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKHRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobG0pOwogCX0KIGVycl9kbWE6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiBlcnJfc2xhdmU6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CiAJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShzbGF2ZV9pbWFnZSk7CiAJfQogZXJyX21hc3RlcjoKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCiAJCQlsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobWFzdGVyX2ltYWdlKTsKIAl9CiAKLQl0c2kxNDhfaXJxX2V4aXQodHNpMTQ4X2RldmljZSwgcGRldik7CisJdHNpMTQ4X2lycV9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogZXJyX2lycToKIGVycl90ZXN0OgogCWlvdW5tYXAodHNpMTQ4X2RldmljZS0+YmFzZSk7CkBAIC0yNTMxLDYgKzI1MzQsNyBAQAogc3RhdGljIHZvaWQgdHNpMTQ4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcGxpc3Q7CiAJc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKm1hc3Rlcl9pbWFnZTsKIAlzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICpzbGF2ZV9pbWFnZTsKIAlzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSAqZG1hX2N0cmxyOwpAQCAtMjU4MiwzNiArMjU4NiwzNCBAQAogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UTTEpOwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UTTIpOwogCi0JdHNpMTQ4X2lycV9leGl0KGJyaWRnZSwgcGRldik7CisJdHNpMTQ4X2lycV9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogCiAJdm1lX3VucmVnaXN0ZXJfYnJpZGdlKHRzaTE0OF9icmlkZ2UpOwogCiAJdHNpMTQ4X2NyY3NyX2V4aXQodHNpMTQ4X2JyaWRnZSwgcGRldik7CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGRtYV9jdHJscik7CiAJfQogCiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShtYXN0ZXJfaW1hZ2UpOwogCX0KIAotCXRzaTE0OF9pcnFfZXhpdChicmlkZ2UsIHBkZXYpOwotCiAJaW91bm1hcChicmlkZ2UtPmJhc2UpOwogCiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmggYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCmluZGV4IGJkYTY0ZWYuLjlmOTdmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaApAQCAtMzUsNyArMzUsNyBAQAogCiAvKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IHRzaTE0OF9kcml2ZXIgewotCXZvaWQgKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpiYXNlOwkvKiBCYXNlIEFkZHJlc3Mgb2YgZGV2aWNlIHJlZ2lzdGVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZVsyXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwogCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkoaW50KTsJLyogQ2FsbGVkIGluIGludGVycnVwdCBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCmluZGV4IDcxYmJjNTIuLmE1NzExNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV91c2VyIjsKIAogc3RhdGljIGludCBidXNbVVNFUl9CVVNfTUFYXTsKLXN0YXRpYyBpbnQgYnVzX251bTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVzX251bTsKIAogLyogQ3VycmVudGx5IERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZvciBWTUU6CiAgKgpAQCAtOTIsNyArOTIsNyBAQAogICogU3RydWN0dXJlIHRvIGhhbmRsZSBpbWFnZSByZWxhdGVkIHBhcmFtZXRlcnMuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQl2b2lkIF9faW9tZW0gKmtlcm5fYnVmOwkvKiBCdWZmZXIgYWRkcmVzcyBpbiBrZXJuZWwgc3BhY2UgKi8KKwl2b2lkICprZXJuX2J1ZjsJLyogQnVmZmVyIGFkZHJlc3MgaW4ga2VybmVsIHNwYWNlICovCiAJZG1hX2FkZHJfdCBwY2lfYnVmOwkvKiBCdWZmZXIgYWRkcmVzcyBpbiBQQ0kgYWRkcmVzcyBzcGFjZSAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplX2J1ZjsJLyogQnVmZmVyIHNpemUgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsJLyogU2VtYXBob3JlIGZvciBsb2NraW5nIGltYWdlICovCkBAIC0xMTQsOSArMTE0LDkgQEAKIH0gZHJpdmVyX3N0YXRzX3Q7CiBzdGF0aWMgZHJpdmVyX3N0YXRzX3Qgc3RhdGlzdGljczsKIAotc3RydWN0IGNkZXYgKnZtZV91c2VyX2NkZXY7CQkvKiBDaGFyYWN0ZXIgZGV2aWNlICovCi1zdHJ1Y3QgY2xhc3MgKnZtZV91c2VyX3N5c2ZzX2NsYXNzOwkvKiBTeXNmcyBjbGFzcyAqLwotc3RydWN0IGRldmljZSAqdm1lX3VzZXJfYnJpZGdlOwkJLyogUG9pbnRlciB0byB0aGUgYnJpZGdlIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBjZGV2ICp2bWVfdXNlcl9jZGV2OwkJLyogQ2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBjbGFzcyAqdm1lX3VzZXJfc3lzZnNfY2xhc3M7CS8qIFN5c2ZzIGNsYXNzICovCitzdGF0aWMgc3RydWN0IGRldmljZSAqdm1lX3VzZXJfYnJpZGdlOwkJLyogUG9pbnRlciB0byBicmlkZ2UgZGV2aWNlICovCiAKIAogc3RhdGljIGNvbnN0IGludCB0eXBlW1ZNRV9ERVZTXSA9IHsJTUFTVEVSX01JTk9SLAlNQVNURVJfTUlOT1IsCkBAIC0xMjksMTMgKzEyOSwxNCBAQAogCiBzdGF0aWMgaW50IHZtZV91c2VyX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCB2bWVfdXNlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAorCWxvZmZfdCAqKTsKIHN0YXRpYyBsb2ZmX3Qgdm1lX3VzZXJfbGxzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIHN0YXRpYyBsb25nIHZtZV91c2VyX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotc3RhdGljIGludCBfX2V4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBfX2RldmluaXQgdm1lX3VzZXJfcHJvYmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IF9fZGV2ZXhpdCB2bWVfdXNlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZtZV91c2VyX2ZvcHMgPSB7CiAJLm9wZW4gPSB2bWVfdXNlcl9vcGVuLApAQCAtMjQ2LDcgKzI0Nyw3IEBACiAgKiBwYWdlKSB0cmFuc2ZlcnMgd2lsbCBsb2NrIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlciBpbnRvIG1lbW9yeSBhbmQgdGhlbgogICogdHJhbnNmZXIgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgdXNlciBzcGFjZSBidWZmZXJzIG91dCB0byBWTUUuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHJlc291cmNlX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHJlc291cmNlX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3NpemVfdCByZXR2YWw7CkBAIC0yNzcsNyArMjc4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGJ1ZmZlcl90b191c2VyKHVuc2lnbmVkIGludCBtaW5vciwgY2hhciBfX3VzZXIgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQl2b2lkIF9faW9tZW0gKmltYWdlX3B0cjsKKwl2b2lkICppbWFnZV9wdHI7CiAJc3NpemVfdCByZXR2YWw7CiAKIAlpbWFnZV9wdHIgPSBpbWFnZVttaW5vcl0ua2Vybl9idWYgKyAqcHBvczsKQEAgLTI5MywxMCArMjk0LDEwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHNzaXplX3QgYnVmZmVyX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IGJ1ZmZlcl9mcm9tX3VzZXIodW5zaWduZWQgaW50IG1pbm9yLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXZvaWQgX19pb21lbSAqaW1hZ2VfcHRyOworCXZvaWQgKmltYWdlX3B0cjsKIAlzaXplX3QgcmV0dmFsOwogCiAJaW1hZ2VfcHRyID0gaW1hZ2VbbWlub3JdLmtlcm5fYnVmICsgKnBwb3M7CkBAIC0zMTIsNyArMzEzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgc3NpemVfdCB2bWVfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKK3N0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCWxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBpbnQgbWlub3IgPSBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKQEAgLTM1Niw4ICszNTcsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpOwogCXNzaXplX3QgcmV0dmFsOwpAQCAtNDU1LDYgKzQ1Niw3IEBACiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CiAJaW50IHJldHZhbDsKIAlkbWFfYWRkcl90IHBjaV9hZGRyOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJc3RhdGlzdGljcy5pb2N0bHMrKzsKIApAQCAtNDcwLDExICs0NzIsMTEgQEAKIAkJCSAqCXRvIHVzZXJzcGFjZSBhcyB0aGV5IGFyZQogCQkJICovCiAJCQlyZXR2YWwgPSB2bWVfbWFzdGVyX2dldChpbWFnZVttaW5vcl0ucmVzb3VyY2UsCi0JCQkJJihtYXN0ZXIuZW5hYmxlKSwgJihtYXN0ZXIudm1lX2FkZHIpLAotCQkJCSYobWFzdGVyLnNpemUpLCAmKG1hc3Rlci5hc3BhY2UpLAotCQkJCSYobWFzdGVyLmN5Y2xlKSwgJihtYXN0ZXIuZHdpZHRoKSk7CisJCQkJJm1hc3Rlci5lbmFibGUsICZtYXN0ZXIudm1lX2FkZHIsCisJCQkJJm1hc3Rlci5zaXplLCAmbWFzdGVyLmFzcGFjZSwKKwkJCQkmbWFzdGVyLmN5Y2xlLCAmbWFzdGVyLmR3aWR0aCk7CiAKLQkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgJm1hc3RlciwKKwkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmbWFzdGVyLAogCQkJCXNpemVvZihzdHJ1Y3Qgdm1lX21hc3RlcikpOwogCQkJaWYgKGNvcGllZCAhPSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFydGlhbCBjb3B5IHRvICIKQEAgLTQ4Nyw4ICs0ODksNyBAQAogCiAJCWNhc2UgVk1FX1NFVF9NQVNURVI6CiAKLQkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZtYXN0ZXIsIChjaGFyICopYXJnLAotCQkJCXNpemVvZihtYXN0ZXIpKTsKKwkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZtYXN0ZXIsIGFyZ3AsIHNpemVvZihtYXN0ZXIpKTsKIAkJCWlmIChjb3BpZWQgIT0gMCkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBhcnRpYWwgY29weSBmcm9tICIKIAkJCQkJInVzZXJzcGFjZVxuIik7CkBAIC01MTQsMTEgKzUxNSwxMSBAQAogCQkJICoJdG8gdXNlcnNwYWNlIGFzIHRoZXkgYXJlCiAJCQkgKi8KIAkJCXJldHZhbCA9IHZtZV9zbGF2ZV9nZXQoaW1hZ2VbbWlub3JdLnJlc291cmNlLAotCQkJCSYoc2xhdmUuZW5hYmxlKSwgJihzbGF2ZS52bWVfYWRkciksCi0JCQkJJihzbGF2ZS5zaXplKSwgJnBjaV9hZGRyLCAmKHNsYXZlLmFzcGFjZSksCi0JCQkJJihzbGF2ZS5jeWNsZSkpOworCQkJCSZzbGF2ZS5lbmFibGUsICZzbGF2ZS52bWVfYWRkciwKKwkJCQkmc2xhdmUuc2l6ZSwgJnBjaV9hZGRyLCAmc2xhdmUuYXNwYWNlLAorCQkJCSZzbGF2ZS5jeWNsZSk7CiAKLQkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgJnNsYXZlLAorCQkJY29waWVkID0gY29weV90b191c2VyKGFyZ3AsICZzbGF2ZSwKIAkJCQlzaXplb2Yoc3RydWN0IHZtZV9zbGF2ZSkpOwogCQkJaWYgKGNvcGllZCAhPSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFydGlhbCBjb3B5IHRvICIKQEAgLTUzMSw4ICs1MzIsNyBAQAogCiAJCWNhc2UgVk1FX1NFVF9TTEFWRToKIAotCQkJY29waWVkID0gY29weV9mcm9tX3VzZXIoJnNsYXZlLCAoY2hhciAqKWFyZywKLQkJCQlzaXplb2Yoc2xhdmUpKTsKKwkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZzbGF2ZSwgYXJncCwgc2l6ZW9mKHNsYXZlKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQYXJ0aWFsIGNvcHkgZnJvbSAiCiAJCQkJCSJ1c2Vyc3BhY2VcbiIpOwpAQCAtNTk2LDcgKzU5Niw3IEBACiBzdGF0aWMgc3RydWN0IHZtZV9kcml2ZXIgdm1lX3VzZXJfZHJpdmVyID0gewogCS5uYW1lID0gZHJpdmVyX25hbWUsCiAJLnByb2JlID0gdm1lX3VzZXJfcHJvYmUsCi0JLnJlbW92ZSA9IHZtZV91c2VyX3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aodm1lX3VzZXJfcmVtb3ZlKSwKIH07CiAKIApAQCAtNjExLDYgKzYxMSw3IEBACiAJaWYgKGJ1c19udW0gPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBjYXJkcywgc2tpcHBpbmcgcmVnaXN0cmF0aW9uXG4iLAogCQkJZHJpdmVyX25hbWUpOworCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGVycl9ub2NhcmQ7CiAJfQogCkBAIC02MjksNiArNjMwLDcgQEAKIAlpZiAoaWRzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIElEIHRhYmxlXG4iLAogCQkJZHJpdmVyX25hbWUpOworCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pZDsKIAl9CiAKQEAgLTY1Miw3ICs2NTQsNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIAotCXZtZV91bnJlZ2lzdGVyX2RyaXZlcigmdm1lX3VzZXJfZHJpdmVyKTsKIGVycl9yZWc6CiAJa2ZyZWUoaWRzKTsKIGVycl9pZDoKQEAgLTY2NSw3ICs2NjYsOCBAQAogICogYXMgcHJhY3RpY2FsLiBXZSB3aWxsIHRoZXJlZm9yZSByZXNlcnZlIHRoZSBidWZmZXJzIGFuZCByZXF1ZXN0IHRoZSBpbWFnZXMKICAqIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGxhdGVyLgogICovCi1zdGF0aWMgaW50IF9faW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLCBpbnQgY3VyX3Nsb3QpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLAorCWludCBjdXJfc2xvdCkKIHsKIAlpbnQgaSwgZXJyOwogCWNoYXIgbmFtZVsxMl07CkBAIC02ODMsNyArNjg1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgVk1FX0RFVlM7IGkrKykgewogCQlpbWFnZVtpXS5rZXJuX2J1ZiA9IE5VTEw7CiAJCWltYWdlW2ldLnBjaV9idWYgPSAwOwotCQlzZW1hX2luaXQoJihpbWFnZVtpXS5zZW0pLCAxKTsKKwkJc2VtYV9pbml0KCZpbWFnZVtpXS5zZW0sIDEpOwogCQlpbWFnZVtpXS5kZXZpY2UgPSBOVUxMOwogCQlpbWFnZVtpXS5yZXNvdXJjZSA9IE5VTEw7CiAJCWltYWdlW2ldLnVzZXJzID0gMDsKQEAgLTcyNyw3ICs3MjksNyBAQAogCQl9CiAJCWltYWdlW2ldLnNpemVfYnVmID0gUENJX0JVRl9TSVpFOwogCQlpbWFnZVtpXS5rZXJuX2J1ZiA9IHZtZV9hbGxvY19jb25zaXN0ZW50KGltYWdlW2ldLnJlc291cmNlLAotCQkJaW1hZ2VbaV0uc2l6ZV9idWYsICYoaW1hZ2VbaV0ucGNpX2J1ZikpOworCQkJaW1hZ2VbaV0uc2l6ZV9idWYsICZpbWFnZVtpXS5wY2lfYnVmKTsKIAkJaWYgKGltYWdlW2ldLmtlcm5fYnVmID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKIAkJCQkiYnVmZmVyXG4iKTsKQEAgLTgyOCw4ICs4MzAsOCBAQAogZXJyX3NsYXZlOgogCXdoaWxlIChpID4gU0xBVkVfTUlOT1IpIHsKIAkJaS0tOwotCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJCWJ1Zl91bmFsbG9jKGkpOworCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJfQogZXJyX2NsYXNzOgogCWNkZXZfZGVsKHZtZV91c2VyX2NkZXYpOwpAQCAtODQwLDcgKzg0Miw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsIGludCBjdXJfc2xvdCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IHZtZV91c2VyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLAorCWludCBjdXJfc2xvdCkKIHsKIAlpbnQgaTsKIApAQCAtODQ5LDEzICs4NTIsMTUgQEAKIAkJZGV2aWNlX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MsIE1LREVWKFZNRV9NQUpPUiwgaSkpOwogCWNsYXNzX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MpOwogCi0JZm9yIChpID0gTUFTVEVSX01JTk9SOyBpIDwgKE1BU1RFUl9NQVggKyAxKTsgaSsrKQorCWZvciAoaSA9IE1BU1RFUl9NSU5PUjsgaSA8IChNQVNURVJfTUFYICsgMSk7IGkrKykgewogCQlrZnJlZShpbWFnZVtpXS5rZXJuX2J1Zik7CisJCXZtZV9tYXN0ZXJfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CisJfQogCiAJZm9yIChpID0gU0xBVkVfTUlOT1I7IGkgPCAoU0xBVkVfTUFYICsgMSk7IGkrKykgewogCQl2bWVfc2xhdmVfc2V0KGltYWdlW2ldLnJlc291cmNlLCAwLCAwLCAwLCAwLCBWTUVfQTMyLCAwKTsKLQkJdm1lX3NsYXZlX2ZyZWUoaW1hZ2VbaV0ucmVzb3VyY2UpOwogCQlidWZfdW5hbGxvYyhpKTsKKwkJdm1lX3NsYXZlX2ZyZWUoaW1hZ2VbaV0ucmVzb3VyY2UpOwogCX0KIAogCS8qIFVucmVnaXN0ZXIgZGV2aWNlIGRyaXZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKaW5kZXggMDkzZmJmZi4uZDlmYzg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAl9CiAKIAkvKiBMb29wIHRocm91Z2ggc2xhdmUgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaChzbGF2ZV9wb3MsICYoYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChzbGF2ZV9wb3MsICZicmlkZ2UtPnNsYXZlX3Jlc291cmNlcykgewogCQlzbGF2ZV9pbWFnZSA9IGxpc3RfZW50cnkoc2xhdmVfcG9zLAogCQkJc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTI1NSwxNyArMjU1LDE3IEBACiAJCX0KIAogCQkvKiBGaW5kIGFuIHVubG9ja2VkIGFuZCBjb21wYXRpYmxlIGltYWdlICovCi0JCW11dGV4X2xvY2soJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2xvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlpZiAoKChzbGF2ZV9pbWFnZS0+YWRkcmVzc19hdHRyICYgYWRkcmVzcykgPT0gYWRkcmVzcykgJiYKIAkJCSgoc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgJiBjeWNsZSkgPT0gY3ljbGUpICYmCiAJCQkoc2xhdmVfaW1hZ2UtPmxvY2tlZCA9PSAwKSkgewogCiAJCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMTsKLQkJCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmc2xhdmVfaW1hZ2UtPm10eCk7CiAJCQlhbGxvY2F0ZWRfaW1hZ2UgPSBzbGF2ZV9pbWFnZTsKIAkJCWJyZWFrOwogCQl9Ci0JCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAl9CiAKIAkvKiBObyBmcmVlIGltYWdlICovCkBAIC0yNzgsMTUgKzI3OCwxNSBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAJcmVzb3VyY2UtPnR5cGUgPSBWTUVfU0xBVkU7Ci0JcmVzb3VyY2UtPmVudHJ5ID0gJihhbGxvY2F0ZWRfaW1hZ2UtPmxpc3QpOworCXJlc291cmNlLT5lbnRyeSA9ICZhbGxvY2F0ZWRfaW1hZ2UtPmxpc3Q7CiAKIAlyZXR1cm4gcmVzb3VyY2U7CiAKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCW11dGV4X2xvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwltdXRleF91bmxvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogZXJyX2ltYWdlOgogZXJyX2J1czoKIAlyZXR1cm4gTlVMTDsKQEAgLTM2OSwxMiArMzY5LDEyIEBACiAJfQogCiAJLyogVW5sb2NrIGltYWdlICovCi0JbXV0ZXhfbG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwltdXRleF9sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAlpZiAoc2xhdmVfaW1hZ2UtPmxvY2tlZCA9PSAwKQogCQlwcmludGsoS0VSTl9FUlIgIkltYWdlIGlzIGFscmVhZHkgZnJlZVxuIik7CiAKIAlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKLQltdXRleF91bmxvY2soJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAogCS8qIEZyZWUgdXAgcmVzb3VyY2UgbWVtb3J5ICovCiAJa2ZyZWUocmVzb3VyY2UpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJfQogCiAJLyogTG9vcCB0aHJvdWdoIG1hc3RlciByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoKG1hc3Rlcl9wb3MsICYoYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gobWFzdGVyX3BvcywgJmJyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KG1hc3Rlcl9wb3MsCiAJCQlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTQxMSwxOCArNDExLDE4IEBACiAJCX0KIAogCQkvKiBGaW5kIGFuIHVubG9ja2VkIGFuZCBjb21wYXRpYmxlIGltYWdlICovCi0JCXNwaW5fbG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCWlmICgoKG1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyICYgYWRkcmVzcykgPT0gYWRkcmVzcykgJiYKIAkJCSgobWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyICYgY3ljbGUpID09IGN5Y2xlKSAmJgogCQkJKChtYXN0ZXJfaW1hZ2UtPndpZHRoX2F0dHIgJiBkd2lkdGgpID09IGR3aWR0aCkgJiYKIAkJCShtYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9PSAwKSkgewogCiAJCQltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDE7Ci0JCQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQkJc3Bpbl91bmxvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCQlhbGxvY2F0ZWRfaW1hZ2UgPSBtYXN0ZXJfaW1hZ2U7CiAJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAl9CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UgZm91bmQgYSByZXNvdXJjZSAqLwpAQCAtNDM3LDE2ICs0MzcsMTYgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCXJlc291cmNlLT50eXBlID0gVk1FX01BU1RFUjsKLQlyZXNvdXJjZS0+ZW50cnkgPSAmKGFsbG9jYXRlZF9pbWFnZS0+bGlzdCk7CisJcmVzb3VyY2UtPmVudHJ5ID0gJmFsbG9jYXRlZF9pbWFnZS0+bGlzdDsKIAogCXJldHVybiByZXNvdXJjZTsKIAogCWtmcmVlKHJlc291cmNlKTsKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwotCXNwaW5fdW5sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiBlcnJfaW1hZ2U6CiBlcnJfYnVzOgogCXJldHVybiBOVUxMOwpAQCAtNjI4LDEyICs2MjgsMTIgQEAKIAl9CiAKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJaWYgKG1hc3Rlcl9pbWFnZS0+bG9ja2VkID09IDApCiAJCXByaW50ayhLRVJOX0VSUiAiSW1hZ2UgaXMgYWxyZWFkeSBmcmVlXG4iKTsKIAogCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMDsKLQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZtYXN0ZXJfaW1hZ2UtPmxvY2spOwogCiAJLyogRnJlZSB1cCByZXNvdXJjZSBtZW1vcnkgKi8KIAlrZnJlZShyZXNvdXJjZSk7CkBAIC02NjIsNyArNjYyLDcgQEAKIAl9CiAKIAkvKiBMb29wIHRocm91Z2ggRE1BIHJlc291cmNlcyAqLwotCWxpc3RfZm9yX2VhY2goZG1hX3BvcywgJihicmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChkbWFfcG9zLCAmYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkoZG1hX3BvcywKIAkJCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIApAQCAtNjcyLDE2ICs2NzIsMTYgQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgYW5kIGNvbXBhdGlibGUgY29udHJvbGxlciAqLwotCQltdXRleF9sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfbG9jaygmZG1hX2N0cmxyLT5tdHgpOwogCQlpZiAoKChkbWFfY3RybHItPnJvdXRlX2F0dHIgJiByb3V0ZSkgPT0gcm91dGUpICYmCiAJCQkoZG1hX2N0cmxyLT5sb2NrZWQgPT0gMCkpIHsKIAogCQkJZG1hX2N0cmxyLT5sb2NrZWQgPSAxOwotCQkJbXV0ZXhfdW5sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmZG1hX2N0cmxyLT5tdHgpOwogCQkJYWxsb2NhdGVkX2N0cmxyID0gZG1hX2N0cmxyOwogCQkJYnJlYWs7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJfQogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGZvdW5kIGEgcmVzb3VyY2UgKi8KQEAgLTY5NCwxNSArNjk0LDE1IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAlyZXNvdXJjZS0+dHlwZSA9IFZNRV9ETUE7Ci0JcmVzb3VyY2UtPmVudHJ5ID0gJihhbGxvY2F0ZWRfY3RybHItPmxpc3QpOworCXJlc291cmNlLT5lbnRyeSA9ICZhbGxvY2F0ZWRfY3RybHItPmxpc3Q7CiAKIAlyZXR1cm4gcmVzb3VyY2U7CiAKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwltdXRleF9sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJZG1hX2N0cmxyLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKGRtYV9jdHJsci0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZkbWFfY3RybHItPm10eCk7CiBlcnJfY3RybHI6CiBlcnJfYnVzOgogCXJldHVybiBOVUxMOwpAQCAtNzI5LDkgKzcyOSw5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGRtYSBsaXN0XG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCUlOSVRfTElTVF9IRUFEKCYoZG1hX2xpc3QtPmVudHJpZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1hX2xpc3QtPmVudHJpZXMpOwogCWRtYV9saXN0LT5wYXJlbnQgPSBjdHJscjsKLQltdXRleF9pbml0KCYoZG1hX2xpc3QtPm10eCkpOworCW11dGV4X2luaXQoJmRtYV9saXN0LT5tdHgpOwogCiAJcmV0dXJuIGRtYV9saXN0OwogfQpAQCAtODgwLDE0ICs4ODAsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmxpc3QtPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJMaW5rIExpc3QgYWxyZWFkeSBzdWJtaXR0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR2YWwgPSBicmlkZ2UtPmRtYV9saXN0X2FkZChsaXN0LCBzcmMsIGRlc3QsIGNvdW50KTsKIAotCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCW11dGV4X3VubG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC05MDMsMTEgKzkwMywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdXRleF9sb2NrKCYobGlzdC0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHZhbCA9IGJyaWRnZS0+ZG1hX2xpc3RfZXhlYyhsaXN0KTsKIAotCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCW11dGV4X3VubG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC05MjMsNyArOTIzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmxpc3QtPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJMaW5rIExpc3QgaW4gdXNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTM1LDEwICs5MzUsMTAgQEAKIAlyZXR2YWwgPSBicmlkZ2UtPmRtYV9saXN0X2VtcHR5KGxpc3QpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZW1wdHkgbGluay1saXN0IGVudHJpZXNcbiIpOwotCQltdXRleF91bmxvY2soJihsaXN0LT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsaXN0LT5tdHgpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQltdXRleF91bmxvY2soJihsaXN0LT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxpc3QtPm10eCk7CiAJa2ZyZWUobGlzdCk7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtOTU2LDIwICs5NTYsMjAgQEAKIAogCWN0cmxyID0gbGlzdF9lbnRyeShyZXNvdXJjZS0+ZW50cnksIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAotCWlmICghbXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmY3RybHItPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJSZXNvdXJjZSBidXN5LCBjYW4ndCBmcmVlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpZiAoIShsaXN0X2VtcHR5KCYoY3RybHItPnBlbmRpbmcpKSAmJiBsaXN0X2VtcHR5KCYoY3RybHItPnJ1bm5pbmcpKSkpIHsKKwlpZiAoIShsaXN0X2VtcHR5KCZjdHJsci0+cGVuZGluZykgJiYgbGlzdF9lbXB0eSgmY3RybHItPnJ1bm5pbmcpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZXNvdXJjZSBzdGlsbCBwcm9jZXNzaW5nIHRyYW5zZmVyc1xuIik7Ci0JCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAljdHJsci0+bG9ja2VkID0gMDsKIAotCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDEzLDEwICsxMDEzLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogCiAJaWYgKGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7Ci0JCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCQltdXRleF91bmxvY2soJmJyaWRnZS0+aXJxX210eCk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZNRSBJbnRlcnJ1cHQgYWxyZWFkeSB0YWtlblxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTAyOCw3ICsxMDI4LDcgQEAKIAkvKiBFbmFibGUgSVJRIGxldmVsICovCiAJYnJpZGdlLT5pcnFfc2V0KGJyaWRnZSwgbGV2ZWwsIDEsIDEpOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCW11dGV4X2xvY2soJmJyaWRnZS0+aXJxX210eCk7CiAKIAlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50LS07CiAKQEAgLTEwNjUsNyArMTA2NSw3IEBACiAJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBOVUxMOwogCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGEgPSBOVUxMOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2ZyZWUpOwogCkBAIC0xMTExLDcgKzExMTEsNyBAQAogCX0KIAogCS8qIExvb3AgdGhyb3VnaCBETUEgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaChsbV9wb3MsICYoYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChsbV9wb3MsICZicmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkobG1fcG9zLAogCQkJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTExMjIsMTQgKzExMjIsMTQgQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgY29udHJvbGxlciAqLwotCQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCQltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAkJaWYgKGxtLT5sb2NrZWQgPT0gMCkgewogCQkJbG0tPmxvY2tlZCA9IDE7Ci0JCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQkJYWxsb2NhdGVkX2xtID0gbG07CiAJCQlicmVhazsKIAkJfQotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJfQogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGZvdW5kIGEgcmVzb3VyY2UgKi8KQEAgLTExNDIsMTUgKzExNDIsMTUgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCXJlc291cmNlLT50eXBlID0gVk1FX0xNOwotCXJlc291cmNlLT5lbnRyeSA9ICYoYWxsb2NhdGVkX2xtLT5saXN0KTsKKwlyZXNvdXJjZS0+ZW50cnkgPSAmYWxsb2NhdGVkX2xtLT5saXN0OwogCiAJcmV0dXJuIHJlc291cmNlOwogCiBlcnJfYWxsb2M6CiAJLyogVW5sb2NrIGltYWdlICovCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAlsbS0+bG9ja2VkID0gMDsKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIGVycl9sbToKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogCiAJbG0gPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogWFhYCiAJICogQ2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBjYWxsYmFja3Mgc3RpbGwgYXR0YWNoZWQsIGlmCkBAIC0xMjc5LDcgKzEyNzksNyBAQAogCiAJbG0tPmxvY2tlZCA9IDA7CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCWtmcmVlKHJlc291cmNlKTsKIH0KQEAgLTEzMjYsNyArMTMyNiw3IEBACiBzdGF0aWMgdm9pZCB2bWVfZnJlZV9idXNfbnVtKGludCBidXMpCiB7CiAJbXV0ZXhfbG9jaygmdm1lX2J1c19udW1fbXR4KTsKLQl2bWVfYnVzX251bWJlcnMgfD0gfigweDEgPDwgYnVzKTsKKwl2bWVfYnVzX251bWJlcnMgJj0gfigweDEgPDwgYnVzKTsKIAltdXRleF91bmxvY2soJnZtZV9idXNfbnVtX210eCk7CiB9CiAKQEAgLTEzNDMsMTEgKzEzNDMsMTEgQEAKIAkgKiBzcGVjaWZpY2F0aW9uLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBWTUVfU0xPVFNfTUFYOyBpKyspIHsKLQkJZGV2ID0gJihicmlkZ2UtPmRldltpXSk7CisJCWRldiA9ICZicmlkZ2UtPmRldltpXTsKIAkJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKIAogCQlkZXYtPnBhcmVudCA9IGJyaWRnZS0+cGFyZW50OwotCQlkZXYtPmJ1cyA9ICYodm1lX2J1c190eXBlKTsKKwkJZGV2LT5idXMgPSAmdm1lX2J1c190eXBlOwogCQkvKgogCQkgKiBXZSBzYXZlIGEgcG9pbnRlciB0byB0aGUgYnJpZGdlIGluIHBsYXRmb3JtX2RhdGEgc28gdGhhdCB3ZQogCQkgKiBjYW4gZ2V0IHRvIGl0IGxhdGVyLiBXZSBrZWVwIGRyaXZlcl9kYXRhIGZvciB1c2UgYnkgdGhlCkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCWkgPSBWTUVfU0xPVFNfTUFYOwogZXJyX3JlZzoKIAl3aGlsZSAoaSA+IC0xKSB7Ci0JCWRldiA9ICYoYnJpZGdlLT5kZXZbaV0pOworCQlkZXYgPSAmYnJpZGdlLT5kZXZbaV07CiAJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CiAJfQogCXZtZV9mcmVlX2J1c19udW0oYnJpZGdlLT5udW0pOwpAQCAtMTM4MSw3ICsxMzgxLDcgQEAKIAogCiAJZm9yIChpID0gMDsgaSA8IFZNRV9TTE9UU19NQVg7IGkrKykgewotCQlkZXYgPSAmKGJyaWRnZS0+ZGV2W2ldKTsKKwkJZGV2ID0gJmJyaWRnZS0+ZGV2W2ldOwogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogCX0KIAl2bWVfZnJlZV9idXNfbnVtKGJyaWRnZS0+bnVtKTsKQEAgLTE0MTgsNyArMTQxOCw3IEBACiAJLyogRGV0ZXJtaW5lIHNsb3QgbnVtYmVyICovCiAJbnVtID0gMDsKIAl3aGlsZSAobnVtIDwgVk1FX1NMT1RTX01BWCkgewotCQlpZiAoJihicmlkZ2UtPmRldltudW1dKSA9PSBkZXYpCisJCWlmICgmYnJpZGdlLT5kZXZbbnVtXSA9PSBkZXYpCiAJCQlicmVhazsKIAogCQludW0rKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKaW5kZXggYjY1M2VjMC4uNGM2ZWMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAl2bWVfY3ljbGVfdCBjeWNsZV9hdHRyOwogCXZtZV93aWR0aF90IHdpZHRoX2F0dHI7CiAJc3RydWN0IHJlc291cmNlIGJ1c19yZXNvdXJjZTsKLQl2b2lkICprZXJuX2Jhc2U7CisJdm9pZCBfX2lvbWVtICprZXJuX2Jhc2U7CiB9OwogCiBzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKaW5kZXggMzJkMDk1Yy4uOTUxYTNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKQEAgLTIwNTgsNyArMjA1OCw3IEBACiBRV09SRCBDQVJEcUdldFRTRk9mZnNldCAodW5zaWduZWQgY2hhciBieVJ4UmF0ZSwgUVdPUkQgcXdUU0YxLCBRV09SRCBxd1RTRjIpCiB7CiAgICAgUVdPUkQgICBxd1RTRk9mZnNldDsKLSAgICB1bnNpZ25lZCBzaG9ydCB3UnhCY25UU0ZPZmZzdD0gMDs7CisgICAgdW5zaWduZWQgc2hvcnQgd1J4QmNuVFNGT2Zmc3Q9IDA7CiAKICAgICBISURXT1JEKHF3VFNGT2Zmc2V0KSA9IDA7CiAgICAgTE9EV09SRChxd1RTRk9mZnNldCkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jCmluZGV4IDkyZTMzOTkuLjVlNDI1ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaXdjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMKQEAgLTIwNzMsNyArMjA3Myw3IEBACiAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICp3cnEsCiAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCiB7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDs7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogaW50IGl3Y3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKaW5kZXggODA1MTY0YmUuLjc0NDc5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5jCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgbSA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzRdKSk7CiAKICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMCttKjQpIHsgLy8gdmVyKDIpICsgR0soNCkgKyBQSyBjb3VudCgyKSArIFBLUyg0Km0pICsgQUtNU1MgY291bnQoMikKLSAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7CiAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgIHBieU9VSSA9ICYocFJTTi0+YWJ5UlNOWzgrNCptXSk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NOb2RlLT5hYnlBS01TU0F1dGhUeXBlKS9zaXplb2YodW5zaWduZWQgY2hhcikpOyBpKyspIHsKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICh1bnNpZ25lZCBzaG9ydClqOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QUtNU1NBdXRoQ291bnQ6ICVkXG4iLCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KTsKIAotICAgICAgICAgICAgbiA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOzsKKyAgICAgICAgICAgIG4gPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTsKICAgICAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gMTIrNCptKzQqbikgeyAvLyB2ZXIoMikrR0soNCkrUEtDbnQoMikrUEtTKDQqbSkrQUtNU1NDbnQoMikrQUtNU1MoNCpuKStDYXAoMikKICAgICAgICAgICAgICAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLndSU05DYXAgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAmKHBSU04tPmFieVJTTls4KzQqbSs0Km5dKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKaW5kZXggZTVhZGQyMC4uMGQxMTE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwpAQCAtOTYzLDcgKzk2Myw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBTlRfUlhCOgogICAgICAgICAgICAgcERldmljZS0+YnlCQlJ4Q29uZiAmPSAweEZFOwotICAgICAgICAgICAgcERldmljZS0+YnlCQlJ4Q29uZiB8PSAweDAyOzsKKyAgICAgICAgICAgIHBEZXZpY2UtPmJ5QkJSeENvbmYgfD0gMHgwMjsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYwppbmRleCA4ZGUyMWFhLi5hNDkwNTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYwpAQCAtMTA5Miw3ICsxMDkyLDcgQEAKICAgICAgICAgcERldmljZS0+c01nbXRPYmoudUN1cnJDaGFubmVsID0gYnlOZXdDaGFubmVsOwogICAgICAgICBiUmVzdWx0ID0gQ0FSRGJTZXRNZWRpYUNoYW5uZWwocERldmljZSwgYnlOZXdDaGFubmVsKTsKIAotICAgICAgICByZXR1cm4oYlJlc3VsdCk7CisJcmV0dXJuIGJSZXN1bHQ7CiAgICAgfQogICAgIHBEZXZpY2UtPmJ5Q2hhbm5lbFN3aXRjaENvdW50ID0gYnlDb3VudDsKICAgICBwRGV2aWNlLT5ieU5ld0NoYW5uZWwgPSBieU5ld0NoYW5uZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYwppbmRleCAxZjlkMjk2My4uZjRmYjBjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCkBAIC0xNjA4LDggKzE2MDgsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcERldmljZS0+YklzUnhNbmdXb3JrSXRlbVF1ZXVlZCA9IEZBTFNFOwotICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJcERldmljZS0+YklzUnhNbmdXb3JrSXRlbVF1ZXVlZCA9IEZBTFNFOworCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCmluZGV4IDAwMDRiZTguLjIxMjEyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKQEAgLTE4ODMsNyArMTg4Myw3IEBACiAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICp3cnEsCiAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCiB7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDs7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogaW50IGl3Y3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYwppbmRleCAwYzEyZmQzLi5lOGMxYjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IGluIERvemUgbW9kZQogICAgIENvbnRyb2x2UmVhZEJ5dGUocERldmljZSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgTUFDX1JFR19QU0NUTCwgJmJ5RGF0YSk7CiAgICAgaWYgKCAoYnlEYXRhICYgUFNDVExfUFMpICE9IDAgKQotICAgICAgICByZXR1cm4gVFJVRTs7CisgICAgICAgIHJldHVybiBUUlVFOwogCiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgIT0gV01BQ19NT0RFX0lCU1NfU1RBKSB7CiAgICAgICAgIC8vIGNoZWNrIGlmIGluIFRJTSB3YWtlIHBlcmlvZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwppbmRleCBiYmRjMTI3Li44ZjE4NTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwpAQCAtNjgsOCArNjgsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBDbGFzc2VzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwotc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CitzdGF0aWMgaW50ICAgICAgICAgIG1zZ2xldmVsICAgICAgICAgICAgICAgID0gTVNHX0xFVkVMX0lORk87CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMKaW5kZXggYTZiZDUzMy4uMDcxNTYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMKQEAgLTIxNCwxMyArMjE0LDE0IEBACiAgICAgLyogUGhhc2UgMSwgc3RlcCAyICovCiAgICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7CiAgICAgICAgIGogPSAyKihpICYgMSk7Ci0gICAgICAgIHAxa1swXSA9IChwMWtbMF0gKyB0a2lwX3Nib3goIChwMWtbNF0gXiAoKDI1NipwYnlUS2V5WzEral0pICsgcGJ5VEtleVtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLSAgICAgICAgcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCggKHAxa1swXSBeICgoMjU2KnBieVRLZXlbNStqXSkgKyBwYnlUS2V5WzQral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0gICAgICAgIHAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goIChwMWtbMV0gXiAoKDI1NipwYnlUS2V5Wzkral0pICsgcGJ5VEtleVs4K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotICAgICAgICBwMWtbM10gPSAocDFrWzNdICsgdGtpcF9zYm94KCAocDFrWzJdIF4gKCgyNTYqcGJ5VEtleVsxMytqXSkgKyBwYnlUS2V5WzEyK2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotICAgICAgICBwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KCAocDFrWzNdIF4gKCgoMjU2KnBieVRLZXlbMStqXSkgKyBwYnlUS2V5W2pdKSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKKyAgICAgICAgcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCgocDFrWzRdIF4gKCgyNTYqcGJ5VEtleVsxK2pdKSArIHBieVRLZXlbal0pKSAlIDY1NTM2KSkgJSA2NTUzNjsKKyAgICAgICAgcDFrWzFdID0gKHAxa1sxXSArIHRraXBfc2JveCgocDFrWzBdIF4gKCgyNTYqcGJ5VEtleVs1K2pdKSArIHBieVRLZXlbNCtqXSkpICUgNjU1MzYpKSAlIDY1NTM2OworICAgICAgICBwMWtbMl0gPSAocDFrWzJdICsgdGtpcF9zYm94KChwMWtbMV0gXiAoKDI1NipwYnlUS2V5Wzkral0pICsgcGJ5VEtleVs4K2pdKSkgJSA2NTUzNikpICUgNjU1MzY7CisgICAgICAgIHAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goKHAxa1syXSBeICgoMjU2KnBieVRLZXlbMTMral0pICsgcGJ5VEtleVsxMitqXSkpICUgNjU1MzYpKSAlIDY1NTM2OworICAgICAgICBwMWtbNF0gPSAocDFrWzRdICsgdGtpcF9zYm94KChwMWtbM10gXiAoKCgyNTYqcGJ5VEtleVsxK2pdKSArIHBieVRLZXlbal0pKSkgJSA2NTUzNikpICUgNjU1MzY7CiAgICAgICAgIHAxa1s0XSA9IChwMWtbNF0gKyBpKSAlIDY1NTM2OwogICAgIH0KKyAKICAgICAvKiBQaGFzZSAyLCBTdGVwIDEgKi8KICAgICBwcGswID0gcDFrWzBdOwogICAgIHBwazEgPSBwMWtbMV07CkBAIC0yMzAsMTkgKzIzMSwxOSBAQAogICAgIHBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKIAogICAgIC8qIFBoYXNlMiwgU3RlcCAyICovCi0gICAgcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goIChwcGs1IF4gKCgyNTYqcGJ5VEtleVsxXSkgKyBwYnlUS2V5WzBdKSkgJSA2NTUzNik7Ci0gICAgcHBrMSA9IHBwazEgKyB0a2lwX3Nib3goIChwcGswIF4gKCgyNTYqcGJ5VEtleVszXSkgKyBwYnlUS2V5WzJdKSkgJSA2NTUzNik7Ci0gICAgcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goIChwcGsxIF4gKCgyNTYqcGJ5VEtleVs1XSkgKyBwYnlUS2V5WzRdKSkgJSA2NTUzNik7Ci0gICAgcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goIChwcGsyIF4gKCgyNTYqcGJ5VEtleVs3XSkgKyBwYnlUS2V5WzZdKSkgJSA2NTUzNik7Ci0gICAgcHBrNCA9IHBwazQgKyB0a2lwX3Nib3goIChwcGszIF4gKCgyNTYqcGJ5VEtleVs5XSkgKyBwYnlUS2V5WzhdKSkgJSA2NTUzNik7Ci0gICAgcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goIChwcGs0IF4gKCgyNTYqcGJ5VEtleVsxMV0pICsgcGJ5VEtleVsxMF0pKSAlIDY1NTM2KTsKKwlwcGswID0gcHBrMCArIHRraXBfc2JveCgocHBrNSBeICgoMjU2KnBieVRLZXlbMV0pICsgcGJ5VEtleVswXSkpICUgNjU1MzYpOworCXBwazEgPSBwcGsxICsgdGtpcF9zYm94KChwcGswIF4gKCgyNTYqcGJ5VEtleVszXSkgKyBwYnlUS2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goKHBwazEgXiAoKDI1NipwYnlUS2V5WzVdKSArIHBieVRLZXlbNF0pKSAlIDY1NTM2KTsKKwlwcGszID0gcHBrMyArIHRraXBfc2JveCgocHBrMiBeICgoMjU2KnBieVRLZXlbN10pICsgcGJ5VEtleVs2XSkpICUgNjU1MzYpOworCXBwazQgPSBwcGs0ICsgdGtpcF9zYm94KChwcGszIF4gKCgyNTYqcGJ5VEtleVs5XSkgKyBwYnlUS2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goKHBwazQgXiAoKDI1NipwYnlUS2V5WzExXSkgKyBwYnlUS2V5WzEwXSkpICUgNjU1MzYpOwogCi0gICAgcHBrMCA9IHBwazAgKyByb3RyMShwcGs1IF4gKCgyNTYqcGJ5VEtleVsxM10pICsgcGJ5VEtleVsxMl0pKTsKLSAgICBwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NipwYnlUS2V5WzE1XSkgKyBwYnlUS2V5WzE0XSkpOwotICAgIHBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7Ci0gICAgcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKLSAgICBwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOwotICAgIHBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7CisJcHBrMCA9IHBwazAgKyByb3RyMShwcGs1IF4gKCgyNTYqcGJ5VEtleVsxM10pICsgcGJ5VEtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NipwYnlUS2V5WzE1XSkgKyBwYnlUS2V5WzE0XSkpOworCXBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7CisJcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKKwlwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOworCXBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7CiAKICAgICAvKiBQaGFzZSAyLCBTdGVwIDMgKi8KICAgICBwYnlSQzRLZXlbMF0gPSAodHNjMiA+PiA4KSAlIDI1NjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhMi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmMKaW5kZXggNmQxMzE5MC4uZDRmM2Y3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICBtID0gKigoUFdPUkQpICYocFJTTi0+YWJ5UlNOWzRdKSk7CiAKICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMCttKjQpIHsgLy8gdmVyKDIpICsgR0soNCkgKyBQSyBjb3VudCgyKSArIFBLUyg0Km0pICsgQUtNU1MgY291bnQoMikKLSAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OworICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTsKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgcGJ5T1VJID0gJihwUlNOLT5hYnlSU05bOCs0Km1dKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU05vZGUtPmFieUFLTVNTQXV0aFR5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewpAQCAtMjM0LDcgKzIzNCw3IEBACiAgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKFdPUkQpajsKICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0FLTVNTQXV0aENvdW50OiAlZFxuIiwgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCk7CiAKLSAgICAgICAgICAgIG4gPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OworICAgICAgICAgICAgbiA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTsKICAgICAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gMTIrNCptKzQqbikgeyAvLyB2ZXIoMikrR0soNCkrUEtDbnQoMikrUEtTKDQqbSkrQUtNU1NDbnQoMikrQUtNU1MoNCpuKStDYXAoMikKICAgICAgICAgICAgICAgICBwQlNTTm9kZS0+c1JTTkNhcE9iai5iUlNOQ2FwRXhpc3QgPSBUUlVFOwogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLndSU05DYXAgPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bOCs0Km0rNCpuXSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dlc3RicmlkZ2UvYXN0b3JpYS9hcmNoL2FybS9tYWNoLW9tYXAyL2N5YXNoYWxvbWFwX2tlcm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dlc3RicmlkZ2UvYXN0b3JpYS9hcmNoL2FybS9tYWNoLW9tYXAyL2N5YXNoYWxvbWFwX2tlcm5lbC5jCmluZGV4IGE2NzgwMjkuLmFkMGM2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93ZXN0YnJpZGdlL2FzdG9yaWEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jeWFzaGFsb21hcF9rZXJuZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2VzdGJyaWRnZS9hc3RvcmlhL2FyY2gvYXJtL21hY2gtb21hcDIvY3lhc2hhbG9tYXBfa2VybmVsLmMKQEAgLTIxMjcsMTAgKzIxMjcsNyBAQAogICovCiB2b2lkICpjeV9hc19oYWxfYWxsb2ModWludDMyX3QgY250KQogewotCXZvaWQgKnJldF9wOwotCi0JcmV0X3AgPSBrbWFsbG9jKGNudCwgR0ZQX0FUT01JQyk7Ci0JcmV0dXJuIHJldF9wOworCXJldHVybiBrbWFsbG9jKGNudCwgR0ZQX0FUT01JQyk7CiB9CiAKIC8qCkBAIC0yMTUwLDEwICsyMTQ3LDcgQEAKICAqLwogdm9pZCAqY3lfYXNfaGFsX2NfYl9hbGxvYyh1aW50MzJfdCBjbnQpCiB7Ci0Jdm9pZCAqcmV0X3A7Ci0KLQlyZXRfcCA9IGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKLQlyZXR1cm4gcmV0X3A7CisJcmV0dXJuIGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKaW5kZXggNzlmYTIyNy4uMDgxZDQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACiB3MzV1bmQteSA6PQkJCVwKIAltZHMubwkJCVwKLQltbG1ldHhyeC5vCQlcCiAJbXRvLm8JCQlcCiAJcGh5X2NhbGlicmF0aW9uLm8JXAogCXJlZy5vCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCmluZGV4IDJiODdhMDAuLmQ3YjNhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAjaW5jbHVkZSAibXRvLmgiCiAKICNpbmNsdWRlICJtYWNfc3RydWN0dXJlcy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKaW5kZXggZWQzZGYyOS4uNzZjNjNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCkBAIC0yMSwyMyArMjEsMTEgQEAKICNpZm5kZWYgX01BQ19TdHJ1Y3R1cmVzX0hfCiAjZGVmaW5lIF9NQUNfU3RydWN0dXJlc19IXwogCi0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBTb21lIG1pc2NlbGxhbmVvdXMgZGVmaW5pdGlvbnMKLS8vLS0tLS0qLwotI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgICAzMAogI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgICAgICAgICAgICAgICAgICAgIDE2ICAvKiAxMjggYml0cyAqLwotI2RlZmluZQlNQVhfODAyXzExX0ZSQUdNRU5UX05VTUJFUgkJMTAgLyogQnkgc3BlYyAqLwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gODAyLjExIEZyYW1lIGRlZmluZQogLy8tLS0tLSAqLwotI2RlZmluZSBNQVNLX1BST1RPQ09MX1ZFUlNJT05fVFlQRQkweDBGCi0jZGVmaW5lIE1BU0tfRlJBR01FTlRfTlVNQkVSCQkweDAwMEYKLSNkZWZpbmUgU0VRVUVOQ0VfTlVNQkVSX1NISUZUCQk0Ci0jZGVmaW5lIERJRkZFUl8xMV9UT18zCQkJCTE4CiAjZGVmaW5lIERPVF8xMV9NQUNfSEVBREVSX1NJWkUJCTI0CiAjZGVmaW5lIERPVF8xMV9TTkFQX1NJWkUJCQk2CiAjZGVmaW5lIERPVF8xMV9EVVJBVElPTl9PRkZTRVQJCTIKQEAgLTQ3LDE1ICszNSw5IEBACiAjZGVmaW5lIERPVF8xMV9UWVBFX09GRlNFVAkJCTMwCiAjZGVmaW5lIERPVF8xMV9EQVRBX09GRlNFVCAgICAgICAgICAyNAogI2RlZmluZSBET1RfMTFfREFfT0ZGU0VUCQkJNAotI2RlZmluZSBET1RfM19UWVBFX0FSUAkJCQkweDgwRjMKLSNkZWZpbmUgRE9UXzNfVFlQRV9JUFgJCQkJMHg4MTM3Ci0jZGVmaW5lIERPVF8zX1RZUEVfT0ZGU0VUCQkJMTIKIAotCi0jZGVmaW5lIEVUSEVSTkVUX0hFQURFUl9TSVpFCQkJMTQKICNkZWZpbmUgTUFYX0VUSEVSTkVUX1BBQ0tFVF9TSVpFCQkxNTE0CiAKLQogLyogLS0tLS0gIG1hbmFnZW1lbnQgOiBUeXBlIG9mIEJpdHMgKDIsIDMpIGFuZCBTdWJ0eXBlIG9mIEJpdHMgKDQsIDUsIDYsIDcpICovCiAjZGVmaW5lIE1BQ19TVUJUWVBFX01OR01OVF9BU1NPQ19SRVFVRVNUICAgIDB4MDAKICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0FTU09DX1JFU1BPTlNFICAgMHgxMApAQCAtNjksMTI5ICs1MSw2IEBACiAjZGVmaW5lIE1BQ19TVUJUWVBFX01OR01OVF9BVVRIRU5USUNBVElPTiAgIDB4QjAKICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0RFQVVUSEVOVElDQVRJT04gMHhDMAogCi0vKiAtLS0tLSAgY29udHJvbCA6IFR5cGUgb2YgQml0cyAoMiwgMykgYW5kIFN1YnR5cGUgb2YgQml0cyAoNCwgNSwgNiwgNykgKi8KLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9QU1BPTEwgICAgICAgICAgMHhBNAotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX1JUUyAgICAgICAgICAgICAweEI0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfQ1RTICAgICAgICAgICAgIDB4QzQKLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9BQ0sgICAgICAgICAgICAgMHhENAotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX0NGRU5EICAgICAgICAgICAweEU0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfQ0ZFTkRfQ0ZBQ0sgICAgIDB4RjQKLQotLyogLS0tLS0gIGRhdGEgOiBUeXBlIG9mIEJpdHMgKDIsIDMpIGFuZCBTdWJ0eXBlIG9mIEJpdHMgKDQsIDUsIDYsIDcpICovCi0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRkFDSyAgICAgICAgICAgICAgMHgxOAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZBQ0tfQ0ZQT0xMICAgICAgIDB4MzgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9OVUxMICAgICAgICAgICAgICAgMHg0OAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGQUNLX05VTEwgICAgICAgICAweDU4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZQT0xMX05VTEwgICAgICAgIDB4NjgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRkFDS19DRlBPTExfTlVMTCAgMHg3OAotCi0vKiAtLS0tLSAgRnJhbWUgVHlwZSBvZiBCaXRzICgyLCAzKSAqLwotI2RlZmluZSBNQUNfVFlQRV9NQU5BR0VNRU5UICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE1BQ19UWVBFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTUFDX1RZUEVfREFUQSAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotCi0vKiAtLS0tLSBkZWZpbml0aW9ucyBmb3IgTWFuYWdlbWVudCBGcmFtZSBFbGVtZW50IElEICgxIEJZVEUpICovCi0jZGVmaW5lIEVMRU1FTlRfSURfU1NJRCAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRUxFTUVOVF9JRF9TVVBQT1JURURfUkFURVMgICAgICAgICAgMQotI2RlZmluZSBFTEVNRU5UX0lEX0ZIX1BBUkFNRVRFUl9TRVQgICAgICAgICAyCi0jZGVmaW5lIEVMRU1FTlRfSURfRFNfUEFSQU1FVEVSX1NFVCAgICAgICAgIDMKLSNkZWZpbmUgRUxFTUVOVF9JRF9DRl9QQVJBTUVURVJfU0VUICAgICAgICAgNAotI2RlZmluZSBFTEVNRU5UX0lEX1RJTSAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEVMRU1FTlRfSURfSUJTU19QQVJBTUVURVJfU0VUICAgICAgIDYKLS8qIDd+MTUgcmVzZXJ2ZXJkICovCi0jZGVmaW5lIEVMRU1FTlRfSURfQ0hBTExFTkdFX1RFWFQgICAgICAgICAgIDE2Ci0vKiAxN34zMSByZXNlcnZlZCBmb3IgY2hhbGxlbmdlIHRleHQgZXh0ZW5zaW9uICovCi0vKiAzMn4yNTUgcmVzZXJ2ZWQgKi8KLS8qLS0gIDExRyAgLS0gKi8KLSNkZWZpbmUgRUxFTUVOVF9JRF9FUlBfSU5GT1JNQVRJT04JCQk0MgotI2RlZmluZSBFTEVNRU5UX0lEX0VYVEVOREVEX1NVUFBPUlRFRF9SQVRFUyA1MAotCi0vKiAtLSAgV1BBICAtLSAqLwotCi0jZGVmaW5lIEVMRU1FTlRfSURfUlNOX1dQQQkJCQkJMjIxCi0jaWZkZWYgX1dQQTJfCi0jZGVmaW5lIEVMRU1FTlRfSURfUlNOX1dQQTIJCQkJICAgIDQ4Ci0jZW5kaWYgLyogZW5kaWYgV1BBMiAqLwotCi0jZGVmaW5lIFdMQU5fTUFYX1BBSVJXSVNFX0NJUEhFUl9TVUlURV9DT1VOVCAgICAoKHUxNikgNikKLSNkZWZpbmUgV0xBTl9NQVhfQVVUSF9LRVlfTUdUX1NVSVRFX0xJU1RfQ09VTlQgICgodTE2KSAyKQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICBSZWFzb24gQ29kZSAoVGFibGUgMTgpOiBpbmRpY2F0ZSB0aGUgcmVhc29uIG9mIERpc0Fzc29jLCBEZUF1dGhlbgotKiAgbGVuZ3RoIG9mIFJlYXNvbkNvZGUgaXMgMiBPY3RzLgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFJFQVNPTl9SRUFTRVJFRCAgICAgICAgICAgICAwCi0jZGVmaW5lIFJFQVNPTl9VTlNQRUNJRElFRCAgICAgICAgICAxCi0jZGVmaW5lIFJFQVNPTl9QUkVBVVRIX0lOVkFMSUQgICAgICAyCi0jZGVmaW5lIERFQVVUSF9SRUFTT05fTEVGVF9CU1MgICAgICAzCi0jZGVmaW5lIERJU0FTU19SRUFTT05fQVBfSU5BQ1RJVkUgICA0Ci0jZGVmaW5lIERJU0FTU19SRUFTT05fQVBfQlVTWSAgICAgICA1Ci0jZGVmaW5lIFJFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSAgICA2Ci0jZGVmaW5lIFJFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPX1NUQSAgICA3Ci0jZGVmaW5lIERJU0FTU19SRUFTT05fTEVGVF9CU1MgICAgICA4Ci0jZGVmaW5lIFJFQVNPTl9OT1RfQVVUSF9ZRVQgICAgICAgICA5Ci0vKiA4MDIuMTFpIGRlZmluZSAqLwotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9JRQkJCQkJCTEzCi0jZGVmaW5lIFJFQVNPTl9NSUNfRVJST1IJCQkJCQkxNAotI2RlZmluZSBSRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVAkJCTE1Ci0jZGVmaW5lIFJFQVNPTl9HUk9VUEtFWV9VUERBVEVfVElNRU9VVAkJCTE2Ci0jZGVmaW5lIFJFQVNPTl9JRV9ESUZGXzRXQVlfQVNTT0MJCQkJMTcKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfTVVMVElDQVNUX0NJUEhFUgkJCTE4Ci0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX1VOSUNBU1RfQ0lQSEVSCQkJMTkKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfQUtNUAkJCQkJCTIwCi0jZGVmaW5lIFJFQVNPTl9VTlNVUFBPUlRFRF9SU05JRV9WRVJTSU9OCQkyMQotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9SU05JRV9DQVBBQklMSVRZCQkJMjIKLSNkZWZpbmUgUkVBU09OXzgwMl8xWF9BVVRIX0ZBSUwJCQkJCTIzCi0jZGVmaW5lCVJFQVNPTl9DSVBIRVJfUkVKRUNUX1BFUl9TRUNfUE9MSUNZCQkxNAotCi0vKgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZW51bV9NTVBEVVJlc3VsdENvZGUgLS0KLS8vICAgU3RhdHVzIGNvZGUgKDIgT2N0cykgaW4gdGhlIE1NUERVJ3MgZnJhbWUgYm9keS4gVGFibGUuMTkKLS8vCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1lbnVtIGVudW1fTU1QRFVSZXN1bHRDb2RlCi17Ci0vLyAgICBTVUNDRVNTICAgPSAwLCAgICAgIC8vIFJlZGVmaW5lZAotICAgIFVOU1BFQ0lGSUVEX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAotCi0gICAgLy8gMiAtIDkgUmVzZXJ2ZWQKLQotICAgIE5PVF9TVVBQUk9UX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgPSAxMCwKLQotICAgIC8vUkVBU1NPQ0lBVElPTl9ERU5JRUQKLSAgICAvLwotICAgIFJFQVNTT0NfREVOSUVEX1VOQUJMRV9DRk1fQVNTT0NfRVhJU1QgICAgICAgPSAxMSwKLQotICAgIC8vQVNTT0NJQVRJT05fREVOSUVEX05PVF9JTl9TVEFOREFSRAotICAgIC8vCi0gICAgQVNTT0NfREVOSUVEX1JFQVNPTl9OT1RfSU5fU1RBTkRBUkQgICAgICAgICA9IDEyLAotICAgIFBFRVJfTk9UX1NVUFBPUlRfQVVUSF9BTEdPUklUSE0gICAgICAgICAgICAgPSAxMywKLSAgICBBVVRIX1NFUU5VTV9PVVRfT0ZfRVhQRUNUICAgICAgICAgICAgICAgICAgID0gMTQsCi0gICAgQVVUSF9SRUpFQ1RfUkVBU09OX0NIQUxMRU5HRV9GQUlMICAgICAgICAgICA9IDE1LAotICAgIEFVVEhfUkVKRUNUX1JFQVNPTl9XQUlUX1RJTUVPVVQgICAgICAgICAgICAgPSAxNiwKLSAgICBBU1NPQ19ERU5JRURfUkVBU09OX0FQX0JVU1kgICAgICAgICAgICAgICAgID0gMTcsCi0gICAgQVNTT0NfREVOSUVEX1JFQVNPTl9OT1RfU1VQUE9SVF9CQVNJQ19SQVRFICA9IDE4Ci19IFdCX01NUERVUkVTVUxUQ09ERSwgKlBXQl9NTVBEVVJFU1VMVENPREU7Ci0qLwotCi0jZGVmaW5lCVJBVEVfQklUTUFQXzFNCQkJCTEKLSNkZWZpbmUJUkFURV9CSVRNQVBfMk0JCQkJMgotI2RlZmluZQlSQVRFX0JJVE1BUF81ZG90NU0JCQk1Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzZNCQkJCTYKLSNkZWZpbmUgUkFURV9CSVRNQVBfOU0JCQkJOQotI2RlZmluZSBSQVRFX0JJVE1BUF8xMU0JCQkJMTEKLSNkZWZpbmUgUkFURV9CSVRNQVBfMTJNCQkJCTEyCi0jZGVmaW5lIFJBVEVfQklUTUFQXzE4TQkJCQkxOAotI2RlZmluZSBSQVRFX0JJVE1BUF8yMk0JCQkJMjIKLSNkZWZpbmUgUkFURV9CSVRNQVBfMjRNCQkJCTI0Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzMzTQkJCQkxNwotI2RlZmluZSBSQVRFX0JJVE1BUF8zNk0JCQkJMTkKLSNkZWZpbmUgUkFURV9CSVRNQVBfNDhNCQkJCTI1Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzU0TQkJCQkyOAotCiAjZGVmaW5lIFJBVEVfQVVUTwkJCQkJMAogI2RlZmluZSBSQVRFXzFNCQkJCQkJMgogI2RlZmluZSBSQVRFXzJNCQkJCQkJNApAQCAtMjA5LDQwOCArNjgsNCBAQAogI2RlZmluZSBSQVRFXzU0TQkJCQkJMTA4CiAjZGVmaW5lIFJBVEVfTUFYCQkJCQkyNTUKIAotLyogQ0FQQUJJTElUWSAqLwotI2RlZmluZSBDQVBBQklMSVRZX0VTU19CSVQJCQkJMHgwMDAxCi0jZGVmaW5lIENBUEFCSUxJVFlfSUJTU19CSVQJCQkJMHgwMDAyCi0jZGVmaW5lIENBUEFCSUxJVFlfQ0ZfUE9MTF9CSVQJCQkweDAwMDQKLSNkZWZpbmUgQ0FQQUJJTElUWV9DRl9QT0xMX1JFUV9CSVQJCTB4MDAwOAotI2RlZmluZSBDQVBBQklMSVRZX1BSSVZBQ1lfQklUCQkJMHgwMDEwCi0jZGVmaW5lIENBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEVfQklUCTB4MDAyMAotI2RlZmluZSBDQVBBQklMSVRZX1BCQ0NfQklUCQkJCTB4MDA0MAotI2RlZmluZSBDQVBBQklMSVRZX0NIQU5fQUdJTElUWV9CSVQJCTB4MDA4MAotI2RlZmluZSBDQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRV9CSVQJMHgwNDAwCi0jZGVmaW5lIENBUEFCSUxJVFlfRFNTU19PRkRNX0JJVAkJMHgyMDAwCi0KLQotc3RydWN0IENhcGFiaWxpdHlfSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0gIHVuaW9uIHsKLQl1MTYgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHdWYWx1ZTsKLSAgICAjaWZkZWYgX0JJR19FTkRJQU5fICAvKiAyMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLSAgICBzdHJ1Y3QgX0NhcGFiaWxpdHkgewotCS8qIC0tICAxMUcgIC0tICovCi0JdTgJUmVzZXJ2ZWQzOjI7Ci0JdTgJRFNTU19PRkRNOjE7Ci0JdTgJUmVzZXJ2ZWQyOjI7Ci0JdTgJU2hvcnRfU2xvdF9UaW1lOjE7Ci0JdTggICAgUmVzZXJ2ZWQxOjI7Ci0JdTggICAgQ2hhbm5lbF9BZ2lsaXR5OjE7Ci0JdTggICAgUEJDQzoxOwotCXU4ICAgIFNob3J0UHJlYW1ibGU6MTsKLQl1OCAgICBDRl9Qcml2YWN5OjE7Ci0JdTggICAgQ0ZfUG9sbF9SZXF1ZXN0OjE7Ci0JdTggICAgQ0ZfUG9sbGFibGU6MTsKLQl1OCAgICBJQlNTOjE7Ci0JdTggICAgRVNTOjE7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQ2FwYWJpbGl0eTsKLSAgICAjZWxzZQotICAgIHN0cnVjdCBfQ2FwYWJpbGl0eSB7Ci0JdTggICAgRVNTOjE7Ci0JdTggICAgSUJTUzoxOwotCXU4ICAgIENGX1BvbGxhYmxlOjE7Ci0JdTggICAgQ0ZfUG9sbF9SZXF1ZXN0OjE7Ci0JdTggICAgQ0ZfUHJpdmFjeToxOwotCXU4ICAgIFNob3J0UHJlYW1ibGU6MTsKLQl1OCAgICBQQkNDOjE7Ci0JdTggICAgQ2hhbm5lbF9BZ2lsaXR5OjE7Ci0JdTggICAgUmVzZXJ2ZWQxOjI7Ci0JCS8qIC0tICAxMUcgIC0tICovCi0JCXU4CVNob3J0X1Nsb3RfVGltZToxOwotCQl1OAlSZXNlcnZlZDI6MjsKLQkJdTgJRFNTU19PRkRNOjE7Ci0JCXU4CVJlc2VydmVkMzoyOwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIENhcGFiaWxpdHk7Ci0gICAgI2VuZGlmCi0gIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgRkhfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBEd2VsbF9UaW1lWzJdOwotICAgIHU4ICAgIEhvcF9TZXQ7Ci0gICAgdTggICAgSG9wX1BhdHRlcm47Ci0gICAgdTggICAgSG9wX0luZGV4OwotfTsKLQotc3RydWN0IERTX1BhcmFtZXRlcl9TZXRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQ3VycmVudF9DaGFubmVsOwotfTsKLQotc3RydWN0IFN1cHBvcnRlZF9SYXRlc19FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBTdXBwb3J0ZWRSYXRlc1s4XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgU1NJRF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBTU0lEWzMyXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIDsKLQotc3RydWN0IENGX1BhcmFtZXRlcl9TZXRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQ0ZQX0NvdW50OwotICAgIHU4ICAgIENGUF9QZXJpb2Q7Ci0gICAgdTggICAgQ0ZQX01heER1cmF0aW9uWzJdOyAgICAgLyogaW4gVGltZSBVbml0cyAqLwotICAgIHU4ICAgIENGUF9EdXJSZW1haW5pbmdbMl07ICAgIC8qIGluIHRpbWUgdW5pdHMgKi8KLX07Ci0KLXN0cnVjdCBUSU1fRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgRFRJTV9Db3VudDsKLSAgICB1OCAgICBEVElNX1BlcmlvZDsKLSAgICB1OCAgICBCaXRtYXBfQ29udHJvbDsKLSAgICB1OCAgICBQYXJ0aWFsX1ZpcnR1YWxfQml0bWFwWzI1MV07Ci19OwotCi1zdHJ1Y3QgSUJTU19QYXJhbWV0ZXJfU2V0X0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIEFUSU1fV2luZG93WzJdOwotfTsKLQotc3RydWN0IENoYWxsZW5nZV9UZXh0X0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIENoYWxsZW5nZV9UZXh0WzI1M107Ci19OwotCi1zdHJ1Y3QgUEhZX1BhcmFtZXRlcl9TZXRfRWxlbWVudCB7Ci0vKiAgaW50ICAgICBhU2xvdFRpbWU7ICovCi0vKiAgaW50ICAgICBhU2lmc1RpbWU7ICovCi0gICAgczMyICAgICBhQ0NBVGltZTsKLSAgICBzMzIgICAgIGFSeFR4VHVybmFyb3VuZFRpbWU7Ci0gICAgczMyICAgICBhVHhQTENQRGVsYXk7Ci0gICAgczMyICAgICBSeFBMQ1BEZWxheTsKLSAgICBzMzIgICAgIGFSeFR4U3dpdGNoVGltZTsKLSAgICBzMzIgICAgIGFUeFJhbXBPbnRpbWU7Ci0gICAgczMyICAgICBhVHhSYW1wT2ZmVGltZTsKLSAgICBzMzIgICAgIGFUeFJGRGVsYXk7Ci0gICAgczMyICAgICBhUnhSRkRlbGF5OwotICAgIHMzMiAgICAgYUFpclByb3BhZ2F0aW9uVGltZTsKLSAgICBzMzIgICAgIGFNQUNQcm9jZXNzaW5nRGVsYXk7Ci0gICAgczMyICAgICBhUHJlYW1ibGVMZW5ndGg7Ci0gICAgczMyICAgICBhUExDUEhlYWRlckxlbmd0aDsKLSAgICBzMzIgICAgIGFNUERVRHVyYXRpb25GYWN0b3I7Ci0gICAgczMyICAgICBhTVBEVU1heExlbmd0aDsKLS8qICBpbnQgICAgIGFDV21pbjsgKi8KLS8qICBpbnQgICAgIGFDV21heDsgKi8KLX07Ci0KLS8qIC0tICAxMUcgIC0tICovCi1zdHJ1Y3QgRVJQX0luZm9ybWF0aW9uX0VsZW1lbnQgewotICAgIHU4CUVsZW1lbnRfSUQ7Ci0gICAgdTgJTGVuZ3RoOwotICAgICNpZmRlZiBfQklHX0VORElBTl8gLyogMjAwNjA5MjYgYWRkIGJ5IGFuc29uJ3MgZW5kaWFuICovCi0JdTgJUmVzZXJ2ZWQ6NTsgICAvKiAyMDA2MDkyNiBhZGQgYnkgYW5zb24gKi8KLQl1OAlCYXJrZXJfUHJlYW1ibGVfTW9kZToxOwotCXU4CVVzZV9Qcm90ZWN0aW9uOjE7Ci0gICAgICAgdTgJTm9uRVJQX1ByZXNlbnQ6MTsKLSAgICAjZWxzZQotCXU4CU5vbkVSUF9QcmVzZW50OjE7Ci0JdTgJVXNlX1Byb3RlY3Rpb246MTsKLQl1OAlCYXJrZXJfUHJlYW1ibGVfTW9kZToxOwotCXU4CVJlc2VydmVkOjU7Ci0gICAgI2VuZGlmCi19OwotCi1zdHJ1Y3QgRXh0ZW5kZWRfU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgewotICAgIHU4CUVsZW1lbnRfSUQ7Ci0gICAgdTgJTGVuZ3RoOwotICAgIHU4CUV4dGVuZGVkU3VwcG9ydGVkUmF0ZXNbMjU1XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBXUEEoODAyLjExaSBkcmFmdCAzLjApICovCi0jZGVmaW5lIFZFUlNJT05fV1BBCQkJCTEKLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgVkVSU0lPTl9XUEEyICAgICAgICAgICAgMQotI2VuZGlmIC8qIGVuZCBkZWYgIF9XUEEyXyAqLwotLyogV1BBMi4wIE9VST0wMDo1MDpGMiwgdGhlIE1TQiBpcyByZXNlcnZlZCBmb3Igc3VpdGUgdHlwZSAqLwotI2RlZmluZSBPVUlfV1BBCQkJCQkweDAwRjI1MDAwCi0jaWZkZWYgX1dQQTJfCi0vKiBmb3Igd3BhMiBjaGFuZ2UgdG8gMHgwMEFDT0YwNCBieSBXcyAyNi8wNC8wNCAqLwotI2RlZmluZSBPVUlfV1BBMgkJCQkweDAwQUMwRjAwCi0jZW5kaWYgLyogZW5kIGRlZiBfV1BBMl8gKi8KLQotI2RlZmluZSBPVUlfV1BBX0FERElUSU9OQUwJCTB4MDEKLSNkZWZpbmUgV0xBTl9NSU5fUlNOX1dQQV9MRU5HVEggICAgICAgICAgICAgICAgIDYgLyogYWRkZWQgYnkgd3MgMDkvMTAvMDQgKi8KLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgV0xBTl9NSU5fUlNOX1dQQTJfTEVOR1RIICAgICAgICAgICAgICAgIDIgLyogRml4IHRvIDIgMDkvMTQvMDUgKi8KLSNlbmRpZiAvKiBlbmQgZGVmIF9XUEEyXyAqLwotCi0jZGVmaW5lIG91aV93cGEgICAgICAgICAgICAgICAgICAodTMyKShPVUlfV1BBfE9VSV9XUEFfQURESVRJT05BTCkKLQotI2RlZmluZSBXUEFfT1VJX0JJRyAgICAoKHUzMikgMHgwMUYyNTAwMCkvKiBhZGRlZCBieSB3cyAwOS8yMy8wNCAqLwotI2RlZmluZSBXUEFfT1VJX0xJVFRMRSAgKCh1MzIpIDB4MDFGMjUwMDEpLyogYWRkZWQgYnkgd3MgMDkvMjMvMDQgKi8KLS8qIDIwMDYxMTA4IEZvciBXUFMuIEl0J3MgbGl0dGxlIGVuZGlhbi4gQmlnIGVuZGlhbiBpcyAweDAwNTBGMjA0ICovCi0jZGVmaW5lIFdQQV9XUFNfT1VJCQkJCWNwdV90b19sZTMyKDB4MDRGMjUwMDApCi0KLS8qIC0tLS0tV1BBMi0tLS0tICovCi0jaWZkZWYgX1dQQTJfCi0jZGVmaW5lIFdQQTJfT1VJX0JJRyAgICAoKHUzMikweDAxQUMwRjAwKQotI2RlZmluZSBXUEEyX09VSV9MSVRUTEUgKCh1MzIpMHgwMUFDMEYwMSkKLSNlbmRpZiAvKiBlbmQgZGVmIF9XUEEyXyAqLwotCi0vKiBBdXRoZW50aWNhdGlvbiBzdWl0ZSAqLwotI2RlZmluZSBPVUlfQVVUSF9XUEFfTk9ORSAgICAgICAgICAgMHgwMCAvKiBmb3IgV1BBX05PTkUgKi8KLSNkZWZpbmUgT1VJX0FVVEhfODAyMVgJCQkJMHgwMQotI2RlZmluZSBPVUlfQVVUSF9QU0sJCQkJMHgwMgotLyogQ2lwaGVyIHN1aXRlICovCi0jZGVmaW5lIE9VSV9DSVBIRVJfR1JPVVBfS0VZICAgICAgICAweDAwICAvKiBhZGRlZCBieSB3cyAwNS8yMS8wNCAqLwotI2RlZmluZSBPVUlfQ0lQSEVSX1dFUF80MAkJCTB4MDEKLSNkZWZpbmUgT1VJX0NJUEhFUl9US0lQCQkJCTB4MDIKLSNkZWZpbmUgT1VJX0NJUEhFUl9DQ01QCQkJCTB4MDQKLSNkZWZpbmUgT1VJX0NJUEhFUl9XRVBfMTA0CQkJMHgwNQotCi1zdHJ1Y3Qgc3VpdGVfc2VsZWN0b3J7Ci0JdW5pb257Ci0JCXU4CVZhbHVlWzRdOwotCQlzdHJ1Y3QgX1NVSVRfIHsKLQkJCXU4CU9VSVszXTsKLQkJCXU4CVR5cGU7Ci0JCX0gU3VpdFNlbGVjdG9yOwotCX07Ci19OwotCi0vKiAtLSAgV1BBICAtLSAqLwotc3RydWN0CVJTTl9JbmZvcm1hdGlvbl9FbGVtZW50ewotCXU4CQkJCQlFbGVtZW50X0lEOwotCXU4CQkJCQlMZW5ndGg7Ci0gLyogV1BBIHZlcnNpb24gMi4wIGFkZGl0aW9uYWwgZmllbGQsIGFuZCBzaG91bGQgYmUgMDA6NTA6RjI6MDEgKi8KLQlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJT3VpV1BBQWRkaXRpb25hbDsKLQl1MTYJCQkJCVZlcnNpb247Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlHcm91cEtleVN1aXRlOwotCXUxNgkJCQkJUGFpcndpc2VLZXlTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcgkJUGFpcndpc2VLZXlTdWl0ZVsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotc3RydWN0IFJTTl9BdXRoX1N1Yl9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLQl1MTYJCQkJQXV0aEtleU1uZ3RTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglBdXRoS2V5TW5ndFN1aXRlWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIC0tICBXUEEyICAtLSAqLwotc3RydWN0IFJTTl9DYXBhYmlsaXR5X0VsZW1lbnQgewotICB1bmlvbiB7Ci0JdTE2CV9fYXR0cmlidXRlX18gKChwYWNrZWQpKQl3VmFsdWU7Ci0gICAgI2lmZGVmIF9CSUdfRU5ESUFOXwkgLyogMjAwNjA5MjcgYWRkIGJ5IGFuc29uJ3MgZW5kaWFuICovCi0gICAgc3RydWN0IF9SU05fQ2FwYWJpbGl0eSB7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDI6ODsgLyogMjAwNTEyMDEgKi8KLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMToyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgR1RLX1JlcGxheV9Db3VudGVyOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQVEtfUmVwbGF5X0NvdW50ZXI6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlOjE7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQcmVfQXV0aDoxOwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSU05fQ2FwYWJpbGl0eTsKLSAgICAjZWxzZQotICAgIHN0cnVjdCBfUlNOX0NhcGFiaWxpdHkgewotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUHJlX0F1dGg6MTsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIE5vX1BhaXJ3aXNlOjE7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQVEtfUmVwbGF5X0NvdW50ZXI6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIEdUS19SZXBsYXlfQ291bnRlcjoyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQxOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDI6ODsgLyogMjAwNTEyMDEgKi8KLSAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUlNOX0NhcGFiaWxpdHk7Ci0gICAgI2VuZGlmCi0KLSAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotCi0jaWZkZWYgX1dQQTJfCi1zdHJ1Y3QgcG1raWQgewotICB1OCBwVmFsdWVbMTZdOwotfTsKLQotc3RydWN0CVdQQTJfUlNOX0luZm9ybWF0aW9uX0VsZW1lbnQgewotCXU4CQkJCQlFbGVtZW50X0lEOwotCXU4CQkJCQlMZW5ndGg7Ci0JdTE2CQkJCQlWZXJzaW9uOwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcgkJR3JvdXBLZXlTdWl0ZTsKLQl1MTYJCQkJCVBhaXJ3aXNlS2V5U3VpdGVDb3VudDsKLQlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJCVBhaXJ3aXNlS2V5U3VpdGVbMV07Ci0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgV1BBMl9SU05fQXV0aF9TdWJfSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0JdTE2CQkJCUF1dGhLZXlNbmd0U3VpdGVDb3VudDsKLQlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJQXV0aEtleU1uZ3RTdWl0ZVsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBQTUtJRF9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLQl1MTYJCQkJUE1LSURfQ291bnQ7Ci0Jc3RydWN0IHBta2lkIHBta2lkWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZW5kaWYgLyogZW5kZGVmIF9XUEEyXyAqLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE1BQyBGcmFtZSBzdHJ1Y3R1cmUgKGRpZmZlcmVudCB0eXBlKSBhbmQgc3ViZmllbGQgc3RydWN0dXJlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdHJ1Y3QgTUFDX2ZyYW1lX2NvbnRyb2wgewotLyogYSBjb21iaW5hdGlvbiBvZiB0aGUgW1Byb3RvY29sIFZlcnNpb24sIENvbnRyb2wgVHlwZSwgQ29udHJvbCBTdWJ0eXBlXSovCi0gICAgdTggICAgbWFjX2ZyYW1lX2luZm87Ci0vKiAyMDA2MDkyNyBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLSAgICAjaWZkZWYgX0JJR19FTkRJQU5fCi0gICAgdTggICAgb3JkZXI6MTsKLSAgICB1OCAgICBXRVA6MTsKLSAgICB1OCAgICBtb3JlX2RhdGE6MTsKLSAgICB1OCAgICBwd3JfbWd0OjE7Ci0gICAgdTggICAgcmV0cnk6MTsKLSAgICB1OCAgICBtb3JlX2ZyYWc6MTsKLSAgICB1OCAgICBmcm9tX2RzOjE7Ci0gICAgdTggICAgdG9fZHM6MTsKLSAgICAjZWxzZQotICAgIHU4ICAgIHRvX2RzOjE7Ci0gICAgdTggICAgZnJvbV9kczoxOwotICAgIHU4ICAgIG1vcmVfZnJhZzoxOwotICAgIHU4ICAgIHJldHJ5OjE7Ci0gICAgdTggICAgcHdyX21ndDoxOwotICAgIHU4ICAgIG1vcmVfZGF0YToxOwotICAgIHU4ICAgIFdFUDoxOwotICAgIHU4ICAgIG9yZGVyOjE7Ci0gICAgI2VuZGlmCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IE1hbmFnZW1lbnRfRnJhbWUgewotLyogMkIsIFRvRFMsRnJvbURTLE1vcmVGcmFnLE1vcmVEYXRhLE9yZGVyPTAgKi8KLSAgICBzdHJ1Y3QgTUFDX2ZyYW1lX2NvbnRyb2wgZnJhbWVfY29udHJvbDsKLSAgICB1MTYJCWR1cmF0aW9uOwotICAgIHU4CQlEQVtNQUNfQUREUl9MRU5HVEhdOwkJCS8qIEFkZHIxICovCi0gICAgdTgJCVNBW01BQ19BRERSX0xFTkdUSF07CQkJLyogQWRkcjIgKi8KLSAgICB1OAkJQlNTSURbTUFDX0FERFJfTEVOR1RIXTsJCQkvKiBBZGRyMyAqLwotICAgIHUxNgkJU2VxdWVuY2VfQ29udHJvbDsKLSAgICAvKiBNYW5hZ2VtZW50IEZyYW1lIEJvZHkgPD0gMzI1IGJ5dGVzICovCi0gICAgLyogRkNTIDQgYnl0ZXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBTVy1NQUMgZG9uJ3QgVHgvUnggQ29udHJvbC1GcmFtZSwgSFctTUFDIGRvIGl0LiAqLwotc3RydWN0IENvbnRyb2xfRnJhbWUgewotLyogVG9EUyxGcm9tRFMsTW9yZUZyYWcsUmV0cnksTW9yZURhdGEsV0VQLE9yZGVyPTAgKi8KLSAgICBzdHJ1Y3QgTUFDX2ZyYW1lX2NvbnRyb2wgZnJhbWVfY29udHJvbDsKLSAgICB1MTYJCWR1cmF0aW9uOwotICAgIHU4CQlSQVtNQUNfQUREUl9MRU5HVEhdOwotICAgIHU4CQlUQVtNQUNfQUREUl9MRU5HVEhdOwotICAgIHUxNgkJRkNTOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBEYXRhX0ZyYW1lIHsKLSAgICBzdHJ1Y3QgTUFDX2ZyYW1lX2NvbnRyb2wgZnJhbWVfY29udHJvbDsKLSAgICB1MTYJCWR1cmF0aW9uOwotICAgIHU4CQlBZGRyMVtNQUNfQUREUl9MRU5HVEhdOwotICAgIHU4CQlBZGRyMltNQUNfQUREUl9MRU5HVEhdOwotICAgIHU4CQlBZGRyM1tNQUNfQUREUl9MRU5HVEhdOwotICAgIHUxNgkJU2VxdWVuY2VfQ29udHJvbDsKLSAgICB1OAkJQWRkcjRbTUFDX0FERFJfTEVOR1RIXTsgLyogb25seSBleGlzdCB3aGVuIFRvRFM9RnJvbURTPTEgKi8KLSAgICAvKiBEYXRhIEZyYW1lIEJvZHkgPD0gMjMxMiAqLwotICAgIC8qIEZDUyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBEaXNhc3NvY2lhdGlvbl9GcmFtZV9Cb2R5IHsKLSAgICB1MTYgICAgcmVhc29uQ29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNzb2NpYXRpb25fUmVxdWVzdF9GcmFtZV9Cb2R5IHsKLSAgICB1MTYgICAgY2FwYWJpbGl0eV9pbmZvcm1hdGlvbjsKLSAgICB1MTYgICAgbGlzdGVuSW50ZXJ2YWw7Ci0gICAgdTggICAgIEN1cnJlbnRfQVBfQWRkcmVzc1tNQUNfQUREUl9MRU5HVEhdOy8qIGZvciByZWFzc29jaWF0aW9uIG9ubHkgKi8KLSAgICAvKiAgU1NJRCAoMiszMiBieXRlcykgKi8KLSAgICAvKiAgU3VwcG9ydGVkX1JhdGVzICgyKzggYnl0ZXMpICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IEFzc29jaWF0aW9uX1Jlc3BvbnNlX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBzdGF0dXNDb2RlOwotICAgIHUxNiAgICBBc3NvY2lhdGlvbl9JRDsKLSAgICBzdHJ1Y3QgU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgc3VwcG9ydGVkUmF0ZXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLypzdHJ1Y3QgUmVhc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkKLXsKLSAgICB1MTYgICAgY2FwYWJpbGl0eV9pbmZvcm1hdGlvbjsKLSAgICB1MTYgICAgbGlzdGVuSW50ZXJ2YWw7Ci0gICAgdTggICAgIEN1cnJlbnRfQVBfQWRkcmVzc1tNQUNfQUREUl9MRU5HVEhdOwotICAgIC8vIFNTSUQgKDIrMzIgYnl0ZXMpCi0gICAgLy8gU3VwcG9ydGVkX1JhdGVzICgyKzggYnl0ZXMpCi19OyovCi0vKiBlbGltaW5hdGVkIGJ5IFdTIDA3LzIyLzA0IGNvbWJvaW5lZCB3aXRoIGFzc29jaWF0ZWlvbiByZXF1ZXN0IGZyYW1lLiAqLwotCi1zdHJ1Y3QgUmVhc3NvY2lhdGlvbl9SZXNwb25zZV9GcmFtZV9Cb2R5IHsKLSAgICB1MTYgICAgY2FwYWJpbGl0eV9pbmZvcm1hdGlvbjsKLSAgICB1MTYgICAgc3RhdHVzQ29kZTsKLSAgICB1MTYgICAgQXNzb2NpYXRpb25fSUQ7Ci0gICAgc3RydWN0IFN1cHBvcnRlZF9SYXRlc19FbGVtZW50IHN1cHBvcnRlZFJhdGVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBEZWF1dGhlbnRpY2F0aW9uX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICByZWFzb25Db2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotc3RydWN0IFByb2JlX1Jlc3BvbnNlX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBUaW1lc3RhbXA7Ci0gICAgdTE2ICAgIEJlYWNvbl9JbnRlcnZhbDsKLSAgICB1MTYgICAgQ2FwYWJpbGl0eV9JbmZvcm1hdGlvbjsKLSAgICAvKiBTU0lECi0gICAgLy8gU3VwcG9ydGVkX1JhdGVzCi0gICAgLy8gUEhZIHBhcmFtZXRlciBTZXQgKERTIFBhcmFtZXRlcnMpCi0gICAgLy8gQ0YgcGFyYW1ldGVyIFNldAotICAgIC8vIElCU1MgcGFyYW1ldGVyIFNldCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBBdXRoZW50aWNhdGlvbl9GcmFtZV9Cb2R5IHsKLSAgICB1MTYgICAgYWxnb3JpdGhtTnVtYmVyOwotICAgIHUxNiAgICBzZXF1ZW5jZU51bWJlcjsKLSAgICB1MTYgICAgc3RhdHVzQ29kZTsKLQkvKiBOQjogZG9uJ3QgaW5jbHVkZSBDaGFsbGVuZ2VUZXh0IGluIHRoaXMgc3RydWN0dXJlCi0JLy8gc3RydWN0IENoYWxsZW5nZV9UZXh0X0VsZW1lbnQgc0NoYWxsZW5nZVRleHRFbGVtZW50OwotCS8vIHdrY2hlbiBhZGRlZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQogI2VuZGlmIC8qIF9NQUNfU3RydWN0dXJlX0hfICovCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYwppbmRleCA5MjE3NzYyLi45Y2ZlYTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYwpAQCAtMSw5ICsxLDcgQEAKICNpbmNsdWRlICJtZHNfZi5oIgotI2luY2x1ZGUgIm1sbWV0eHJ4X2YuaCIKICNpbmNsdWRlICJtdG8uaCIKLSNpbmNsdWRlICJzeXNkZWYuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCi0jaW5jbHVkZSAid2JsaW51eF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1dHhfZi5oIgogCiB1bnNpZ25lZCBjaGFyCiBNZHNfaW5pdGlhbChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCkBAIC0xNywxMSArMTUsNiBAQAogCXJldHVybiBoYWxfZ2V0X3R4X2J1ZmZlcigmYWRhcHRlci0+c0h3RGF0YSwgJnBNZHMtPnBUeEJ1ZmZlcik7CiB9CiAKLXZvaWQKLU1kc19EZXN0cm95KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKLXsKLX0KLQogc3RhdGljIHZvaWQgTWRzX0R1cmF0aW9uU2V0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKnBEZXMsICB1OCAqYnVmZmVyKQogewogCXN0cnVjdCBUMDBfZGVzY3JpcHRvciAqcFQwMDsKQEAgLTM1MCw5ICszNDMsNyBAQAogCWN0bXAxID0gY3RtcGYgPSBDVVJSRU5UX1RYX1JBVEVfRk9SX01ORzsKIAogCXBEZXMtPlR4UmF0ZSA9IGN0bXAxOwotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlwcmludGsoIlR4IHJhdGUgPSV4XG4iLCBjdG1wMSk7Ci0JI2VuZGlmCisJcHJfZGVidWcoIlR4IHJhdGUgPSV4XG4iLCBjdG1wMSk7CiAKIAlwVDAxLT5UMDFfbW9kdWxhdGlvbl90eXBlID0gKGN0bXAxJTMpID8gMCA6IDE7CiAKQEAgLTQwNCw2ICszOTUsNDQgQEAKIAogfQogCitzdGF0aWMgdm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXNjKQoreworCWRlc2MtPkludGVybmFsVXNlZCA9IGRlc2MtPmJ1ZmZlcl9zdGFydF9pbmRleCArIGRlc2MtPmJ1ZmZlcl9udW1iZXI7CisJZGVzYy0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKKwlkZXNjLT5idWZmZXJfYWRkcmVzc1tkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFU7CisJZGVzYy0+YnVmZmVyX3NpemVbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOworCWRlc2MtPmJ1ZmZlcl90b3RhbF9zaXplICs9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOworCWRlc2MtPmJ1ZmZlcl9udW1iZXIrKzsKKwlkZXNjLT5UeXBlID0gYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKK30KKworc3RhdGljIHZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHM4ICpwRGF0YSkKK3sKKwlpbnQgaTsKKworCS8qIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgeworCQlpZiAocERhdGEgPT0gKHM4ICopJihhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQorCQkJYnJlYWs7CisJfQorCWlmIChhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKKwkJYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBmYWxzZTsKKwllbHNlICB7CisJCS8qIFNvbWV0aGluZyB3cm9uZworCQkgUEQ0MyBBZGQgZGVidWcgY29kZSBoZXJlPz8/ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBNTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKK3sKKyAgICAvKiBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlciAqLworCWFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gMDsKKwlNTE1FZnJlZU1NUERVQnVmZmVyKGFkYXB0ZXIsIGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVKTsKKworCS8qIFJldHVybiByZXNvdXJjZSAqLworCWFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7Cit9CisKIHZvaWQKIE1kc19UeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpCiB7CkBAIC00MzAsOSArNDU5LDcgQEAKIAlkbyB7CiAJCUZpbGxJbmRleCA9IHBNZHMtPlR4RmlsbEluZGV4OwogCQlpZiAocE1kcy0+VHhPd25lcltGaWxsSW5kZXhdKSB7IC8qIElzIG93bmVkIGJ5IHNvZnR3YXJlIDA6WWVzIDE6Tm8gKi8KLSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJCXByaW50aygiW01kc19UeF0gVHggT3duZXIgaXMgSC9XLlxuIik7Ci0jZW5kaWYKKwkJCXByX2RlYnVnKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQ3Niw5ICs1MDMsNyBAQAogCiAJCQkvKiBGb3Igc3BlZWQgdXAgS2V5IHNldHRpbmcgKi8KIAkJCWlmIChwVHhEZXMtPkVhcEZpeCkgewotI2lmZGVmIF9QRV9UWF9EVU1QXwotCQkJCXByaW50aygiMzU6IEVQQSA0dGggZnJhbWUgZGV0ZWN0ZWQuIFNpemUgPSAlZFxuIiwgUGFja2V0U2l6ZSk7Ci0jZW5kaWYKKwkJCQlwcl9kZWJ1ZygiMzU6IEVQQSA0dGggZnJhbWUgZGV0ZWN0ZWQuIFNpemUgPSAlZFxuIiwgUGFja2V0U2l6ZSk7CiAJCQkJcEh3RGF0YS0+SXNLZXlQcmVTZXQgPSAxOwogCQkJfQogCkBAIC00OTIsMTEgKzUxNyw2IEBACiAJCQlYbWl0QnVmU2l6ZSArPSBDdXJyZW50U2l6ZTsKIAkJCVhtaXRCdWZBZGRyZXNzICs9IEN1cnJlbnRTaXplOwogCi0jaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQkJCWlmICgoWG1pdEJ1ZkFkZHJlc3NbRE9UXzExX0RBX09GRlNFVCs4XSAmIDB4ZmMpICE9IE1BQ19TVUJUWVBFX01OR01OVF9QUk9CRV9SRVFVRVNUKSAvKiArOCBmb3IgVVNCIGhkciAqLwotI2VuZGlmCi0JCQkJcE1kcy0+VHhUb2dnbGUgPSB0cnVlOwotCiAJCQkvKiBHZXQgcGFja2V0IHRvIHRyYW5zbWl0IGNvbXBsZXRlZCwgMTpURVNUU1RBIDI6TUxNRSAzOiBOZGlzIGRhdGEgKi8KIAkJCU1MTUVfU2VuZENvbXBsZXRlKGFkYXB0ZXIsIDAsIHRydWUpOwogCkBAIC01NjcsOSArNTg3LDcgQEAKIAkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbUmV0cnlDb3VudF0gKz0gUmV0cnlDb3VudDsKIAkJCQllbHNlCiAJCQkJCXBId0RhdGEtPnR4X3JldHJ5X2NvdW50WzddICs9IFJldHJ5Q291bnQ7Ci0JCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQkJCXByaW50aygiZHRvX3R4X3JldHJ5X2NvdW50ID0lZFxuIiwgcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50KTsKLQkJCQkjZW5kaWYKKwkJCQlwcl9kZWJ1ZygiZHRvX3R4X3JldHJ5X2NvdW50ID0lZFxuIiwgcEh3RGF0YS0+ZHRvX3R4X3JldHJ5X2NvdW50KTsKIAkJCQlNVE9fU2V0VHhDb3VudChhZGFwdGVyLCBUeFJhdGUsIFJldHJ5Q291bnQpOwogCQkJfQogCQkJcEh3RGF0YS0+ZHRvX3R4X2ZyYWdfY291bnQgKz0gKFJldHJ5Q291bnQrMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaAppbmRleCA3ZjY4ZGVhLi5jZThiZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKQEAgLTEsMTEgKzEsMTAgQEAKICNpZm5kZWYgX19XSU5CT05EX01EU19GX0gKICNkZWZpbmUgX19XSU5CT05EX01EU19GX0gKIAotI2luY2x1ZGUgIndiaGFsX3MuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgogI2luY2x1ZGUgImNvcmUuaCIKIAogdW5zaWduZWQgY2hhciBNZHNfaW5pdGlhbChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOwotdm9pZCBNZHNfRGVzdHJveShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOwogdm9pZCBNZHNfVHgoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKTsKIHZvaWQgTWRzX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCBUMDJfZGVzY3JpcHRvciAqcHQwMik7CiB2b2lkIE1kc19NcGR1UHJvY2VzcyhzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKnByeGRlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaAppbmRleCBlMmRlNGJkLi5lZWVkZjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKQEAgLTEwNywxMCArMTA3LDYgQEAKIAl1OAlUeFJhdGVbKChNQVhfVVNCX1RYX0RFU0NSSVBUT1IgKyAxKSAmIH4weDAxKV1bMl07IC8qIFswXSBjdXJyZW50IHR4IHJhdGUsIFsxXSBmYWxsIGJhY2sgcmF0ZSAqLwogCXU4CVR4SW5mb1soKE1BWF9VU0JfVFhfREVTQ1JJUFRPUiArIDEpICYgfjB4MDEpXTsgLypTdG9yZSBpbmZvcm1hdGlvbiBmb3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIAotCS8qIGZvciBzY2FubmluZyBtZWNoYW5pc20gKi8KLQl1OAlUeFRvZ2dsZTsJLyogSXQgaXMgVFJVRSBpZiB0aGVyZSBhcmUgdHggYWN0aXZpdGllcyBpbiBzb21lIHRpbWUgaW50ZXJ2YWwgKi8KLQl1OAlSZXNlcnZlZF9bM107Ci0KIAkvKiAtLS0tIGZvciBUeCBQYXJhbWV0ZXIgKi8KIAl1MTYJVHhGcmFnbWVudFRocmVzaG9sZDsJLyogRm9yIGZyYW1lIGJvZHkgb25seSAqLwogCXUxNglUeFJUU1RocmVzaG9sZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI1YTIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIE1vZHVsZSBOYW1lOgotICAgIE1MTUVUeFJ4LkMKLQotICBEZXNjcmlwdGlvbjoKLSAgICBUaGUgaW50ZXJmYWNlIGJldHdlZW4gTURTIChNQUMgRGF0YSBTZXJ2aWNlKSBhbmQgTUxNRS4KLQotICBSZXZpc2lvbiBIaXN0b3J5OgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkyMDAyMDkgICAgICBVTjIwIEplbm5pZmVyIFh1Ci0JCUluaXRpYWwgUmVsZWFzZQotCQkyMDAyMTEwOCAgICBQRDQzIEF1c3RpbiBMaXUKLQkJMjAwMzAxMTcgICAgUEQ0MyBBdXN0aW4gTGl1Ci0JCURlbGV0ZWQgTUxNRVJldHVyblBhY2tldCBhbmQgTUxNRVByb2NUaHJlYWQoKQotCi0gIENvcHlyaWdodCAoYykgMTk5Ni0yMDAyIFdpbmJvbmQgRWxlY3Ryb25pY3MgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNpbmNsdWRlICJzeXNkZWYuaCIKLQotI2luY2x1ZGUgIm1kc19mLmgiCi0KLXZvaWQgTUxNRV9HZXROZXh0UGFja2V0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqZGVzYykKLXsKLQlkZXNjLT5JbnRlcm5hbFVzZWQgPSBkZXNjLT5idWZmZXJfc3RhcnRfaW5kZXggKyBkZXNjLT5idWZmZXJfbnVtYmVyOwotCWRlc2MtPkludGVybmFsVXNlZCAlPSBNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVg7Ci0JZGVzYy0+YnVmZmVyX2FkZHJlc3NbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVOwotCWRlc2MtPmJ1ZmZlcl9zaXplW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKLQlkZXNjLT5idWZmZXJfdG90YWxfc2l6ZSArPSBhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbjsKLQlkZXNjLT5idWZmZXJfbnVtYmVyKys7Ci0JZGVzYy0+VHlwZSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUuRGF0YVR5cGU7Ci19Ci0KLXN0YXRpYyB2b2lkIE1MTUVmcmVlTU1QRFVCdWZmZXIoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzOCAqcERhdGEpCi17Ci0JaW50IGk7Ci0KLQkvKiBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RYX01NUERVOyBpKyspIHsKLQkJaWYgKHBEYXRhID09IChzOCAqKSYoYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVW2ldKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0pCi0JCWFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldID0gZmFsc2U7Ci0JZWxzZSAgewotCQkvKiBTb21ldGhpbmcgd3JvbmcKLQkJIFBENDMgQWRkIGRlYnVnIGNvZGUgaGVyZT8/PyAqLwotCX0KLX0KLQotdm9pZAotTUxNRV9TZW5kQ29tcGxldGUoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCB1OCBQYWNrZXRJRCwgdW5zaWduZWQgY2hhciBTZW5kT0spCi17Ci0gICAgLyogUmVjbGFpbSB0aGUgZGF0YSBidWZmZXIgKi8KLQlhZGFwdGVyLT5zTWxtZUZyYW1lLmxlbiA9IDA7Ci0JTUxNRWZyZWVNTVBEVUJ1ZmZlcihhZGFwdGVyLCBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVSk7Ci0KLQkvKiBSZXR1cm4gcmVzb3VyY2UgKi8KLQlhZGFwdGVyLT5zTWxtZUZyYW1lLklzSW5Vc2VkID0gUEFDS0VUX0ZSRUVfVE9fVVNFOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTI1MDdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4X2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE1MTUVUeFJ4LkggLS0KLS8vCi0vLyAgIEZ1bmN0aW9ucyBkZWZpbmVkIGluIE1MTUVUeFJ4LmMuCi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAyIFdpbmJvbmQgRWxlY3RyaWNzIENvcnAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNpZm5kZWYgX01MTUVUWFJYX0gKLSNkZWZpbmUgX01MTUVUWFJYX0gKLQotI2luY2x1ZGUgImNvcmUuaCIKLQotdm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpwRGVzKTsKLQotdm9pZAotTUxNRV9TZW5kQ29tcGxldGUoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCB1OCBQYWNrZXRJRCwKLQkJICB1bnNpZ25lZCBjaGFyIFNlbmRPSyk7Ci0KLSNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotczggU2VuZEJDTnVsbERhdGEoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCB1MTYgd0lkeCk7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCmluZGV4IDljZDIxMjcuLmMwM2U1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jCkBAIC0xNyw5ICsxNywxMCBAQAogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLSNpbmNsdWRlICJzeXNkZWYuaCIKICNpbmNsdWRlICJzbWVfYXBpLmgiCi0jaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndiaGFsLmgiCisjaW5jbHVkZSAid2IzNXJlZ19mLmgiCisjaW5jbHVkZSAiY29yZS5oIgogCiAvKiBEZWNsYXJlIFNRMyB0byByYXRlIGFuZCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCB0YWJsZSAqLwogLyogRGVjbGFyZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZHMgdGFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKaW5kZXggMmIzNzViYS4uMDk4NDRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMKQEAgLTEwLDkgKzEwLDEwIEBACiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKiBJTkNMVURFIEZJTEVTIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAic3lzZGVmLmgiCiAjaW5jbHVkZSAicGh5X2NhbGlicmF0aW9uLmgiCi0jaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndiaGFsLmgiCisjaW5jbHVkZSAid2IzNXJlZ19mLmgiCisjaW5jbHVkZSAiY29yZS5oIgogCiAKIC8qKioqKioqKioqKioqKioqKiogREVCVUcgQ09OU1RBTlQgQU5EIE1BQ1JPIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAppbmRleCAzMDMyMDMxLi44NGY2ZTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICiAjZGVmaW5lIF9fV0lOQk9ORF9QSFlfQ0FMSUJSQVRJT05fSAogCi0jaW5jbHVkZSAid2JoYWxfZi5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAKICNkZWZpbmUgUkVHX0FHQ19DVFJMMQkJMHgxMDAwCiAjZGVmaW5lIFJFR19BR0NfQ1RSTDIJCTB4MTAwNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYwppbmRleCA5OTBmOWQ0Li4xYjM4ZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYwpAQCAtMSw1ICsxLDYgQEAKLSNpbmNsdWRlICJzeXNkZWYuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJjb3JlLmgiCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDEwLDkgKzEwMTEsNyBAQAogCWNhc2UgUkZfQUlST0hBXzcyMzA6CiAJCS8qIFN0YXJ0IHRvIGZpbGwgUkYgcGFyYW1ldGVycywgUExMX09OIHNob3VsZCBiZSBwdWxsZWQgbG93LiAqLwogCQlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwMDApOwotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCXByaW50aygiKiBQTExfT04gICAgbG93XG4iKTsKLQkJI2VuZGlmCisJCXByX2RlYnVnKCIqIFBMTF9PTiAgICBsb3dcbiIpOwogCQludW1iZXIgPSBBUlJBWV9TSVpFKGFsNzIzMF9yZl9kYXRhXzI0KTsKIAkJU2V0X0NoYW5JbmRlcF9SZkRhdGFfYWw3MjMwXzI0KHBId0RhdGEsIHBsdG1wLCBudW1iZXIpOwogCQlicmVhazsKQEAgLTEwOTgsOSArMTA5Nyw3IEBACiAJY2FzZSBSRl9BSVJPSEFfNzIzMDoKIAkJLyogUkYgcGFyYW1ldGVycyBoYXZlIGZpbGxlZCBjb21wbGV0ZWx5LCBQTExfT04gc2hvdWxkIGJlIHB1bGxlZCBoaWdoICovCiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDA4MCk7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCIqIFBMTF9PTiAgICBoaWdoXG4iKTsKLQkJI2VuZGlmCisJCXByX2RlYnVnKCIqIFBMTF9PTiAgICBoaWdoXG4iKTsKIAogCQkvKiAyLjRHSHogKi8KIAkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDlBQkE4RjsKQEAgLTExMTUsOSArMTExMiw3IEBACiAKIAkJLyogNUdIeiAqLwogCQlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwMDApOwotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCXByaW50aygiKiBQTExfT04gICAgbG93XG4iKTsKLQkJI2VuZGlmCisJCXByX2RlYnVnKCIqIFBMTF9PTiAgICBsb3dcbiIpOwogCiAJCW51bWJlciA9IEFSUkFZX1NJWkUoYWw3MjMwX3JmX2RhdGFfNTApOwogCQlTZXRfQ2hhbkluZGVwX1JmRGF0YV9hbDcyMzBfNTAocEh3RGF0YSwgcGx0bXAsIG51bWJlcik7CkBAIC0xMTI3LDkgKzExMjIsNyBAQAogCQltc2xlZXAoNSk7CiAKIAkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwKTsKLQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlwcmludGsoIiogUExMX09OICAgIGhpZ2hcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGhpZ2hcbiIpOwogCiAJCWx0bXAgPSAoMSA8PCAzMSkgfCAoMCA8PCAzMCkgfCAoMjQgPDwgMjQpIHwgMHg5QUJBOEY7CiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDg2NCwgbHRtcCk7CkBAIC0xNzk1LDkgKzE3ODgsNyBAQAogCiAJCQkvKiBXcml0ZSB0byByZWdpc3Rlci4gbnVtYmVyIG11c3QgbGVzcyBhbmQgZXF1YWwgdGhhbiAxNiAqLwogCQkJV2IzNVJlZ19CdXJzdFdyaXRlKHBId0RhdGEsIDB4MDg2NCwgcGx0bXAsIG51bWJlciwgTk9fSU5DUkVNRU5UKTsKLQkJCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJCXByaW50aygiQmFuZCBjaGFuZ2VkXG4iKTsKLQkJCSNlbmRpZgorCQkJcHJfZGVidWcoIkJhbmQgY2hhbmdlZFxuIik7CiAJCX0KIAogCQlpZiAoQ2hhbm5lbC5iYW5kIDw9IEJBTkRfVFlQRV9PRkRNXzI0KSB7IC8qIGNoYW5uZWwgMSB+IDE0ICovCkBAIC0yMDczLDExICsyMDY0LDcgQEAKIAkgKi8KIAogCS8qIE0wMCBiaXQgc2V0ICovCi0JI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi0JcmVnLT5NMDBfTWFjQ29udHJvbCA9IDA7IC8qIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBzb2Z0d2FyZSAqLwotCSNlbHNlCiAJcmVnLT5NMDBfTWFjQ29udHJvbCA9IDB4ODAwMDAwMDA7IC8qIFNvbHZlIGJlYWNvbiBzZXF1ZW5jZSBudW1iZXIgc3RvcCBieSBoYXJkd2FyZSAqLwotCSNlbmRpZgogCiAJLyogTTI0IGRpc2FibGUgZW50ZXIgcG93ZXIgc2F2ZSwgQkIgUnhPbiBhbmQgZW5hYmxlIE5BViBhdHRhY2sgKi8KIAlyZWctPk0yNF9NYWNDb250cm9sID0gMHgwODA0MDA0MjsKQEAgLTIzMzYsMTMgKzIzMjMsNiBAQAogCQlwSHdEYXRhLT5UeFZnYUZvcjUwWzMyXS5UeFZnYVZhbHVlID0gcFR4VmdhWzE3XSAtIHN0bXAgKiAyIC8gNDsKIAkJcEh3RGF0YS0+VHhWZ2FGb3I1MFszMV0uVHhWZ2FWYWx1ZSA9IHBUeFZnYVsxN10gLSBzdG1wICogMyAvIDQ7CiAJfQotCi0JI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCXByaW50aygiIFR4VmdhRm9yMjQgOlxuIik7Ci0JRGF0YURtcCgodTggKilwSHdEYXRhLT5UeFZnYUZvcjI0LCAxNCAsIDApOwotCXByaW50aygiIFR4VmdhRm9yNTAgOlxuIik7Ci0JRGF0YURtcCgodTggKilwSHdEYXRhLT5UeFZnYUZvcjUwLCA3MCAsIDApOwotCSNlbmRpZgogfQogCiB2b2lkIEJCUHJvY2Vzc29yX1JhdGVDaGFuZ2luZyhzdHJ1Y3QgaHdfZGF0YSAqcEh3RGF0YSwgIHU4IHJhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9zeXNkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ3MWY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogIFdpbmJvbmQgV0xBTiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBkZWZpbmVzICovCi0KLSNpZm5kZWYgU1lTX0RFRl9ICi0jZGVmaW5lIFNZU19ERUZfSAotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2RlZmluZSBXQl9MSU5VWAotI2RlZmluZSBXQl9MSU5VWF9XUEFfUFNLCi0KLSNkZWZpbmUgX1VTRV9GQUxMQkFDS19SQVRFXwotCi0jZGVmaW5lIF9XUEEyXwotCi0jaWZuZGVmIF9XUEFfUFNLX0RFQlVHCi0jdW5kZWYgIF9XUEFfUFNLX0RFQlVHCi0jZW5kaWYKLQotLyogZGVidWcgcHJpbnQgb3B0aW9ucywgbWFyayB3aGF0IGRlYnVnIHlvdSBkb24ndCBuZWVkICovCi0KLSNpZmRlZiBGVUxMX0RFQlVHCi0jZGVmaW5lIF9QRV9TVEFURV9EVU1QXwotI2RlZmluZSBfUEVfVFhfRFVNUF8KLSNkZWZpbmUgX1BFX1JYX0RVTVBfCi0jZGVmaW5lIF9QRV9PSURfRFVNUF8KLSNkZWZpbmUgX1BFX0RUT19EVU1QXwotI2RlZmluZSBfUEVfUkVHX0RVTVBfCi0jZGVmaW5lIF9QRV9VU0JfSU5JX0RVTVBfCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKaW5kZXggNzcwNzIyMy4uNDJhZTYxMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnLmMKQEAgLTEsNCArMSwzIEBACi0jaW5jbHVkZSAic3lzZGVmLmgiCiAjaW5jbHVkZSAid2IzNXJlZ19mLmgiCiAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTE0MCw4ICsxMzksOCBAQAogCiAJLyogU3luYyBJb0NhbGxEcml2ZXIgKi8KIAlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2cocEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMCksCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBId0RhdGEtPnVkZXYsCisJCQkgICAgICAgdXNiX3NuZGN0cmxwaXBlKHBId0RhdGEtPnVkZXYsIDApLAogCQkJICAgICAgIDB4MDMsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX09VVCwKIAkJCSAgICAgICAweDAsIFJlZ2lzdGVyTm8sICZSZWdpc3RlclZhbHVlLCA0LCBIWiAqIDEwMCk7CiAJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CkBAIC0xNTAsOSArMTQ5LDcgQEAKIAlXYjM1UmVnX0VQMFZNX3N0YXJ0KHBId0RhdGEpOwogCiAJaWYgKHJldCA8IDApIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCXByaW50aygiRVAwIFdyaXRlIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDAgV3JpdGUgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIik7CiAJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTMwNSw4ICszMDIsOCBAQAogCQltc2xlZXAoMTApOwogCiAJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDApLAorCXJldCA9IHVzYl9jb250cm9sX21zZyhwSHdEYXRhLT51ZGV2LAorCQkJICAgICAgIHVzYl9yY3ZjdHJscGlwZShwSHdEYXRhLT51ZGV2LCAwKSwKIAkJCSAgICAgICAweDAxLCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgICAweDAsIFJlZ2lzdGVyTm8sIHBsdG1wLCA0LCBIWiAqIDEwMCk7CiAKQEAgLTMyMCw5ICszMTcsNyBAQAogCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CiAKIAlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJcHJpbnRrKCJFUDAgUmVhZCByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiRVAwIFJlYWQgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIik7CiAJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTQzMiw4ICs0MjcsOCBAQAogCWlmIChyZWdfcXVldWUtPkRJUkVDVCA9PSAxKSAvKiBvdXRwdXQgKi8KIAkJcEJ1ZmZlciA9ICZyZWdfcXVldWUtPlZBTFVFOwogCi0JdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT5XYlVzYi51ZGV2LCByZWdfcXVldWUpLAorCXVzYl9maWxsX2NvbnRyb2xfdXJiKHVyYiwgcEh3RGF0YS0+dWRldiwKKwkJCSAgICAgIFJFR19ESVJFQ1RJT04ocEh3RGF0YS0+dWRldiwgcmVnX3F1ZXVlKSwKIAkJCSAgICAgICh1OCAqKWRyLCBwQnVmZmVyLCBjcHVfdG9fbGUxNihkci0+d0xlbmd0aCksCiAJCQkgICAgICBXYjM1UmVnX0VQMFZNX2NvbXBsZXRlLCAodm9pZCAqKXBId0RhdGEpOwogCkBAIC00NDIsOSArNDM3LDcgQEAKIAlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJldCA8IDApIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCXByaW50aygiRVAwIElycCBzZW5kaW5nIGVycm9yXG4iKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiRVAwIElycCBzZW5kaW5nIGVycm9yXG4iKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAlyZXR1cm47CkBAIC00NzksOSArNDcyLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZyZWctPkVQMFZNX3NwaW5fbG9jayk7CiAKIAkJaWYgKHJlZy0+RVAwVk1fc3RhdHVzKSB7Ci0jaWZkZWYgX1BFX1JFR19EVU1QXwotCQkJcHJpbnRrKCJFUDAgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKTsKLSNlbmRpZgorCQkJcHJfZGVidWcoIkVQMCBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpOwogCQkJcmVnLT5FUDB2bV9zdGF0ZSA9IFZNX1NUT1A7CiAJCQlwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSA9IDE7CiAJCX0gZWxzZSB7CkBAIC01MjYsOSArNTE3LDcgQEAKIAkJCXVzYl9mcmVlX3VyYih1cmIpOwogCQkJa2ZyZWUocmVnX3F1ZXVlKTsKIAkJfSBlbHNlIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCQlwcmludGsoIkVQMCBxdWV1ZSByZWxlYXNlIGVycm9yXG4iKTsKLSNlbmRpZgorCQkJcHJfZGVidWcoIkVQMCBxdWV1ZSByZWxlYXNlIGVycm9yXG4iKTsKIAkJfQogCQlzcGluX2xvY2tfaXJxKCZyZWctPkVQMFZNX3NwaW5fbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmgKaW5kZXggYmYyM2MxMC4uOTVkYzk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAogI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJFR19GX0gKIAotI2luY2x1ZGUgIndiaGFsX3MuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgogCiAvKgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCmluZGV4IDRlZmYwMDkuLmViMjc0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oCkBAIC01LDYgKzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCitzdHJ1Y3QgaHdfZGF0YTsKKwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICoKICAqCQkJSEFMIHNldHRpbmcgZnVuY3Rpb24KQEAgLTQ5LDExICs1MSw3IEBACiAjZGVmaW5lIERFRkFVTFRfQ1dNQVgJCQkxMDIzCS8qIChNMkMpIENXbWF4LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTAyMy4gKi8KICNkZWZpbmUgREVGQVVMVF9BSUQJCQkxCS8qIChNMzQpIEFJRC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAxLTIwMDcuICovCiAKLSNpZmRlZiBfVVNFX0ZBTExCQUNLX1JBVEVfCiAjZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAkyCS8qIChNMzgpIGFzIG5hbWVkICovCi0jZWxzZQotI2RlZmluZSBERUZBVUxUX1JBVEVfUkVUUllfTElNSVQJNwkvKiAoTTM4KSBhcyBuYW1lZCAqLwotI2VuZGlmCiAKICNkZWZpbmUgREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUCTcJLyogKE0zOCkgTG9uZ1JldHJ5TGltaXQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xNS4gKi8KICNkZWZpbmUgREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVAk3CS8qIChNMzgpIFNob3J0UmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LiAqLwpAQCAtMTY4LDQgKzE2Niw3NSBAQAogCXUzMglTUTNfZmlsdGVyW01BWF9TUTNfRklMVEVSX1NJWkVdOwogCXUzMglTUTNfaW5kZXg7CiB9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBoYWxfcmVtb3ZlX21hcHBpbmdfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqbWFjX2FkZHIpOwordm9pZCBoYWxfcmVtb3ZlX2RlZmF1bHRfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MzIgaW5kZXgpOwordW5zaWduZWQgY2hhciBoYWxfc2V0X21hcHBpbmdfa2V5KHN0cnVjdCBod19kYXRhICphZGFwdGVyLCB1OCAqbWFjX2FkZHIsCisJCQkJICB1OCBudWxsX2tleSwgdTggd2VwX29uLCB1OCAqdHhfdHNjLAorCQkJCSAgdTggKnJ4X3RzYywgdTgga2V5X3R5cGUsIHU4IGtleV9sZW4sCisJCQkJICB1OCAqa2V5X2RhdGEpOwordW5zaWduZWQgY2hhciBoYWxfc2V0X2RlZmF1bHRfa2V5KHN0cnVjdCBod19kYXRhICphZGFwdGVyLCB1OCBpbmRleCwKKwkJCQkgIHU4IG51bGxfa2V5LCB1OCB3ZXBfb24sIHU4ICp0eF90c2MsCisJCQkJICB1OCAqcnhfdHNjLCB1OCBrZXlfdHlwZSwgdTgga2V5X2xlbiwKKwkJCQkgIHU4ICprZXlfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordm9pZCBoYWxfY2xlYXJfYWxsX2dyb3VwX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordm9pZCBoYWxfY2xlYXJfYWxsX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9zZXRfcG93ZXJfc2F2ZV9tb2RlKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1bnNpZ25lZCBjaGFyIHBvd2VyX3NhdmUsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgd2FrZXVwLCB1bnNpZ25lZCBjaGFyIGR0aW0pOwordm9pZCBoYWxfZ2V0X3Bvd2VyX3NhdmVfbW9kZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKmluX3B3cl9zYXZlKTsKK3ZvaWQgaGFsX3NldF9zbG90X3RpbWUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IHR5cGUpOworCisjZGVmaW5lIGhhbF9zZXRfYXRpbV93aW5kb3coX0EsIF9BVE0pCisKK3ZvaWQgaGFsX3N0YXJ0X2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggbWFjX29wX21vZGUpOworCisvKiAwOkJTUyBTVEEgMTpJQlNTIFNUQSAqLwordm9pZCBoYWxfam9pbl9yZXF1ZXN0KHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBic3NfdHlwZSk7CisKK3ZvaWQgaGFsX3N0b3Bfc3luY19ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordm9pZCBoYWxfcmVzdW1lX3N5bmNfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKK3ZvaWQgaGFsX3NldF9haWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBhaWQpOwordm9pZCBoYWxfc2V0X2Jzc2lkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqYnNzaWQpOwordm9pZCBoYWxfZ2V0X2Jzc2lkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqYnNzaWQpOwordm9pZCBoYWxfc2V0X2xpc3Rlbl9pbnRlcnZhbChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGxpc3Rlbl9pbnRlcnZhbCk7Cit2b2lkIGhhbF9zZXRfY2FwX2luZm8oc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBjYXBhYmlsaXR5X2luZm8pOwordm9pZCBoYWxfc2V0X3NzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpzc2lkLCB1OCBzc2lkX2xlbik7Cit2b2lkIGhhbF9zdGFydF90eDAoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOworCisjZGVmaW5lIGhhbF9nZXRfY3dtaW4oX0EpCSgoX0EpLT5jd21pbikKKwordm9pZCBoYWxfc2V0X2N3bWF4KHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgY3dpbl9tYXgpOworCisjZGVmaW5lIGhhbF9nZXRfY3dtYXgoX0EpCSgoX0EpLT5jd21heCkKKwordm9pZCBoYWxfc2V0X3Jzbl93cGEoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUzMiAqcnNuX2llX2JpdG1hcCwKKwkJICAgICB1MzIgKnJzbl9vdWlfdHlwZSAsIHVuc2lnbmVkIGNoYXIgZGVzaXJlZF9hdXRoX21vZGUpOwordm9pZCBoYWxfc2V0X2Nvbm5lY3RfaW5mbyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdW5zaWduZWQgY2hhciBib19jb25uZWN0KTsKK3U4IGhhbF9nZXRfZXN0X3NxMyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggY291bnQpOwordm9pZCBoYWxfZGVzY3JpcHRvcl9pbmRpY2F0ZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwKKwkJCSAgICAgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqZGVzKTsKK3U4IGhhbF9nZXRfYW50ZW5uYV9udW1iZXIoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordTMyIGhhbF9nZXRfYnNzX3BrX2NudChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7CisKKyNkZWZpbmUgaGFsX2dldF9yZWdpb25fZnJvbV9FRVBST00oX0EpCSgoX0EpLT5yZWcuRUVQUk9NUmVnaW9uKQorI2RlZmluZSBoYWxfZ2V0X3R4X2J1ZmZlcihfQSwgX0IpCVdiMzVUeF9nZXRfdHhfYnVmZmVyKF9BLCBfQikKKyNkZWZpbmUgaGFsX3NvZnR3YXJlX3NldChfQSkJCShfQS0+U29mdHdhcmVTZXQpCisjZGVmaW5lIGhhbF9kcml2ZXJfaW5pdF9PSyhfQSkJCShfQS0+SXNJbml0T0spCisjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2hpZ2goX0EpCShfQS0+UlNTSV9oaWdoKQorI2RlZmluZSBoYWxfcnNzaV9ib3VuZGFyeV9sb3coX0EpCShfQS0+UlNTSV9sb3cpCisjZGVmaW5lIGhhbF9zY2FuX2ludGVydmFsKF9BKQkJKF9BLT5TY2FuX0ludGVydmFsKQorCisjZGVmaW5lIFBIWV9ERUJVRyhtc2csIGFyZ3MuLi4pCisKKy8qIHJldHVybiAxMDBtcyBjb3VudCAqLworI2RlZmluZSBoYWxfZ2V0X3RpbWVfY291bnQoX1ApCQkoX1AtPnRpbWVfY291bnQgLyAxMCkKKworI2RlZmluZSBoYWxfaWJzc19kaXNjb25uZWN0KF9BKQkJKGhhbF9zdG9wX3N5bmNfYnNzKF9BKSkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCmluZGV4IDQ0ODUxNGEuLmYxMThlZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgotI2luY2x1ZGUgInN5c2RlZi5oIgogI2luY2x1ZGUgIndiMzVyeF9mLmgiCiAKIHN0YXRpYyB2b2lkIHBhY2tldF9jYW1lKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBjaGFyICpwUnhCdWZmZXJBZGRyZXNzLCBpbnQgUGFja2V0U2l6ZSkKQEAgLTEwOSwxMCArMTA4LDcgQEAKIAogCQkJLyogQmFzaWMgY2hlY2sgZm9yIFJ4IGxlbmd0aC4gSXMgbGVuZ3RoIHZhbGlkPyAqLwogCQkJaWYgKFBhY2tldFNpemUgPiBNQVhfUEFDS0VUX1NJWkUpIHsKLSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJCQlwcmludGsoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLCBQYWNrZXRTaXplKTsKLSNlbmRpZgotCisJCQkJcHJfZGVidWcoIlNlcmlvdXMgRVJST1IgOiBSeCBkYXRhIHNpemUgdG9vIGxvbmcsIHNpemUgPSVkXG4iLCBQYWNrZXRTaXplKTsKIAkJCQlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX1NUT1A7CiAJCQkJcFdiMzVSeC0+RXAzRXJyb3JDb3VudDIrKzsKIAkJCQlicmVhazsKQEAgLTE3NCw3ICsxNzAsNyBAQAogCS8qIFRoZSBJUlAgaXMgY29tcGxldGVkICovCiAJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9DT01QTEVURUQ7CiAKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvKiBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZCAqLworCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgLyogTXVzdCBiZSBoZXJlLCBvciBSeEJ1ZmZlcklkIGlzIGludmFsaWQgKi8KIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQpAQCAtMTg2LDkgKzE4Miw3IEBACiAKIAkvKiBUaGUgVVJCIGlzIGNvbXBsZXRlZCwgY2hlY2sgdGhlIHJlc3VsdCAqLwogCWlmIChwV2IzNVJ4LT5FUDNWTV9zdGF0dXMgIT0gMCkgewotI2lmZGVmIF9QRV9VU0JfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCJFUDMgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiRVAzIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIik7CiAJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0yMzksNyArMjMzLDcgQEAKIAl1MzIJCQlSeEJ1ZmZlcklkOwogCiAJLyogSXNzdWluZyBVUkIgKi8KLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVJ4LT5yeF9oYWx0KQpAQCAtMjQ5LDkgKzI0Myw3IEBACiAJUnhCdWZmZXJJZCA9IHBXYjM1UngtPlJ4QnVmZmVySWQ7CiAJaWYgKCFwV2IzNVJ4LT5SeE93bmVyW1J4QnVmZmVySWRdKSB7CiAJCS8qIEl0J3MgaW1wb3NzaWJsZSB0byBydW4gaGVyZS4gKi8KLSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJcHJpbnRrKCJSeCBkcml2ZXIgZmlmbyB1bmF2YWlsYWJsZVxuIik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI2OCw4ICsyNjAsOCBAQAogCX0KIAlwUnhCdWZmZXJBZGRyZXNzID0gcFdiMzVSeC0+cERSeDsKIAotCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDMpLAorCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcEh3RGF0YS0+dWRldiwKKwkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBId0RhdGEtPnVkZXYsIDMpLAogCQkJICBwUnhCdWZmZXJBZGRyZXNzLCBNQVhfVVNCX1JYX0JVRkZFUiwKIAkJCSAgV2IzNVJ4X0NvbXBsZXRlLCBodyk7CiAKQEAgLTMzNyw5ICszMjksNyBAQAogCS8qIENhbmNlbGluZyB0aGUgSXJwIGlmIGFscmVhZHkgc2VuZHMgaXQgb3V0LiAqLwogCWlmIChwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKSB7CiAJCXVzYl91bmxpbmtfdXJiKHBXYjM1UngtPlJ4VXJiKTsgLyogT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVJ4X2Rlc3Ryb3kgdG8gZnJlZSB0aGVtICovCi0jaWZkZWYgX1BFX1JYX0RVTVBfCi0JCXByaW50aygiRVAzIFJ4IHN0b3BcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDMgUnggc3RvcFxuIik7CiAJfQogfQogCkBAIC0zNTUsOCArMzQ1LDYgQEAKIAogCWlmIChwV2IzNVJ4LT5SeFVyYikKIAkJdXNiX2ZyZWVfdXJiKHBXYjM1UngtPlJ4VXJiKTsKLSNpZmRlZiBfUEVfUlhfRFVNUF8KLQlwcmludGsoIldiMzVSeF9kZXN0cm95IE9LXG4iKTsKLSNlbmRpZgorCXByX2RlYnVnKCJXYjM1UnhfZGVzdHJveSBPS1xuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCmluZGV4IDk4YWNjZTUuLjFmZGY2NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX19XSU5CT05EX1dCMzVSWF9GX0gKIAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgIndiaGFsX3MuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gSW50ZXJmYWNlIGZ1bmN0aW9uIGRlY2xhcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMKaW5kZXggMmE5ZDA1NS4uNDRmYzNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgIndiMzV0eF9mLmgiCiAjaW5jbHVkZSAibWRzX2YuaCIKLSNpbmNsdWRlICJzeXNkZWYuaCIKIAogdW5zaWduZWQgY2hhcgogV2IzNVR4X2dldF90eF9idWZmZXIoc3RydWN0IGh3X2RhdGEgKiBwSHdEYXRhLCB1OCAqKnBCdWZmZXIpCkBAIC00MSw3ICs0MCw3IEBACiAJcFdiMzVUeC0+VHhTZW5kSW5kZXgrKzsKIAlwV2IzNVR4LT5UeFNlbmRJbmRleCAlPSBNQVhfVVNCX1RYX0JVRkZFUl9OVU1CRVI7CiAKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSAvLyBMZXQgV2JXbGFuSGFsdCB0byBoYW5kbGUgc3VycHJpc2UgcmVtb3ZlCiAJCWdvdG8gZXJyb3I7CiAKIAlpZiAocFdiMzVUeC0+dHhfaGFsdCkKQEAgLTc0LDcgKzczLDcgQEAKIAl1MzIJCVNlbmRJbmRleDsKIAogCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpCiAJCWdvdG8gY2xlYW51cDsKIAogCWlmIChwV2IzNVR4LT50eF9oYWx0KQpAQCAtODksOCArODgsOCBAQAogCS8vCiAJLy8gSXNzdWluZyBVUkIKIAkvLwotCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCA0KSwKKwl1c2JfZmlsbF9idWxrX3VyYihwVXJiLCBwSHdEYXRhLT51ZGV2LAorCQkJICB1c2Jfc25kYnVsa3BpcGUocEh3RGF0YS0+dWRldiwgNCksCiAJCQkgIHBUeEJ1ZmZlckFkZHJlc3MsIHBNZHMtPlR4QnVmZmVyU2l6ZVsgU2VuZEluZGV4IF0sCiAJCQkgIFdiMzVUeF9jb21wbGV0ZSwgYWRhcHRlcik7CiAKQEAgLTE1MywxNiArMTUyLDEyIEBACiAJLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgVHJwIG9mIEVQMgogCWlmIChwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQogCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHgyVXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlwcmludGsoIkVQMiBUeCBzdG9wXG4iKTsKLQkjZW5kaWYKKwlwcl9kZWJ1ZygiRVAyIFR4IHN0b3BcbiIpOwogCiAJLy8gVHJ5aW5nIHRvIGNhbmNlbGluZyB0aGUgSXJwIG9mIEVQNAogCWlmIChwV2IzNVR4LT5FUDR2bV9zdGF0ZSA9PSBWTV9SVU5OSU5HKQogCQl1c2JfdW5saW5rX3VyYiggcFdiMzVUeC0+VHg0VXJiICk7IC8vIE9ubHkgdXNlIHVubGluaywgbGV0IFdiMzVUeF9kZXN0cm90IHRvIGZyZWUgdGhlbQotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlwcmludGsoIkVQNCBUeCBzdG9wXG4iKTsKLQkjZW5kaWYKKwlwcl9kZWJ1ZygiRVA0IFR4IHN0b3BcbiIpOwogfQogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTgyLDkgKzE3Nyw3IEBACiAJaWYgKHBXYjM1VHgtPlR4MlVyYikKIAkJdXNiX2ZyZWVfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsKIAotCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQlwcmludGsoIldiMzVUeF9kZXN0cm95IE9LXG4iKTsKLQkjZW5kaWYKKwlwcl9kZWJ1ZygiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpOwogfQogCiB2b2lkIFdiMzVUeF9DdXJyZW50VGltZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHUzMiBUaW1lQ291bnQpCkBAIC0yMjIsNyArMjE1LDcgQEAKIAlwV2IzNVR4LT5FUDJWTV9zdGF0dXMgPSBwVXJiLT5zdGF0dXM7CiAKIAkvLyBGb3IgTGludXggMi40LiBJbnRlcnJ1cHQgd2lsbCBhbHdheXMgdHJpZ2dlcgotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVR4LT50eF9oYWx0KQpAQCAtMjYzLDcgKzI1Niw3IEBACiAJdTMyICoJcGx0bXAgPSAodTMyICopcFdiMzVUeC0+RVAyX2J1ZjsKIAlpbnQJCXJldHY7CiAKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVR4LT50eF9oYWx0KQpAQCAtMjcyLDE2ICsyNjUsMTQgQEAKIAkvLwogCS8vIElzc3VpbmcgVVJCCiAJLy8KLQl1c2JfZmlsbF9pbnRfdXJiKCBwVXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LCB1c2JfcmN2aW50cGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LDIpLAorCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPnVkZXYsMiksCiAJCQkgIHBsdG1wLCBNQVhfSU5URVJSVVBUX0xFTkdUSCwgV2IzNVR4X0VQMlZNX2NvbXBsZXRlLCBhZGFwdGVyLCAzMik7CiAKIAlwV2IzNVR4LT5FUDJ2bV9zdGF0ZSA9IFZNX1JVTk5JTkc7CiAJcmV0diA9IHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJldHYgPCAwKSB7Ci0JCSNpZmRlZiBfUEVfVFhfRFVNUF8KLQkJcHJpbnRrKCJFUDIgVHggSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIkVQMiBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaAppbmRleCAxZDNiNTE1Li4wMThmZDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9fV0lOQk9ORF9XQjM1VFhfRl9ICiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAid2JoYWxfZi5oIgogCiAvKgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuaAppbmRleCA4MjFhMWIzLi4zOWU4NGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWwuaApAQCAtMzQyLDkgKzM0Miw2IEBACiAJdm9pZAkqYnVmZmVyX2FkZHJlc3NbTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYXTsKIH07CiAKLQotI2RlZmluZSBERUZBVUxUX05VTExfUEFDS0VUX0NPVU5UCTE4MDAwMAkvKiAxODAgc2Vjb25kcyAqLwotCiAjZGVmaW5lIE1BWF9UWFZHQV9FRVBST00JCTkJLyogSG93IG1hbnkgd29yZCh1MTYpIG9mIEVFUFJPTSB3aWxsIGJlIHVzZWQgZm9yIFR4VkdBICovCiAjZGVmaW5lIE1BWF9SRl9QQVJBTUVURVIJCTMyCiAKQEAgLTM1OSw3ICszNTYsNiBAQAogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLSNpbmNsdWRlICJ3YnVzYl9zLmgiCiAjaW5jbHVkZSAid2IzNXJlZ19zLmgiCiAjaW5jbHVkZSAid2IzNXR4X3MuaCIKICNpbmNsdWRlICJ3YjM1cnhfcy5oIgpAQCAtNDQwLDcgKzQzNiw3IEBACiAJICogVmFyaWFibGUgZm9yIGVhY2ggbW9kdWxlCiAJICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkgKi8KLQlzdHJ1Y3Qgd2JfdXNiCQlXYlVzYjsJLyogTmVlZCBXYlVzYi5oICovCisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAJc3RydWN0IHdiMzVfcmVnCQlyZWc7CS8qIE5lZWQgV2IzNVJlZy5oICovCiAJc3RydWN0IHdiMzVfdHgJCVdiMzVUeDsgLyogTmVlZCBXYjM1VHguaCAqLwogCXN0cnVjdCB3YjM1X3J4CQlXYjM1Ung7IC8qIE5lZWQgV2IzNVJ4LmggKi8KQEAgLTUxMCwxNiArNTA2LDggQEAKIAl1MzIJCVJ4Qnl0ZUNvdW50TGFzdDsKIAl1MzIJCVR4Qnl0ZUNvdW50TGFzdDsKIAotCWF0b21pY190CVN1cnByaXNlUmVtb3ZlQ291bnQ7Ci0KIAkvKiBGb3IgZ2xvYmFsIHRpbWVyICovCiAJdTMyCQl0aW1lX2NvdW50OwkvKiBUSUNLX1RJTUVfMTAwbXMgMSA9IDEwMG1zICovCi0KLQkvKiBGb3IgZXJyb3IgcmVjb3ZlciAqLwotCXUzMgkJSHdTdG9wOwotCi0JLyogRm9yIGF2b2lkIEFQIGRpc2Nvbm5lY3QgKi8KLQl1MzIJCU51bGxQYWNrZXRDb3VudDsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc4YzE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIERldmljZSByZWxhdGVkIGluY2x1ZGUKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLSNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKLSNpbmNsdWRlICJ3YjM1dHhfZi5oIgotI2luY2x1ZGUgIndiMzVyeF9mLmgiCi0KLSNpbmNsdWRlICJjb3JlLmgiCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRnVuY3Rpb24gZGVjbGFyYXRpb24KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi12b2lkIGhhbF9yZW1vdmVfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICptYWNfYWRkcik7Ci12b2lkIGhhbF9yZW1vdmVfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUzMiBpbmRleCk7Ci11bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKLQkJCQkgIHU4IG51bGxfa2V5LCB1OCB3ZXBfb24sIHU4ICp0eF90c2MsCi0JCQkJICB1OCAqcnhfdHNjLCB1OCBrZXlfdHlwZSwgdTgga2V5X2xlbiwKLQkJCQkgIHU4ICprZXlfZGF0YSk7Ci11bnNpZ25lZCBjaGFyIGhhbF9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4IGluZGV4LAotCQkJCSAgdTggbnVsbF9rZXksIHU4IHdlcF9vbiwgdTggKnR4X3RzYywKLQkJCQkgIHU4ICpyeF90c2MsIHU4IGtleV90eXBlLCB1OCBrZXlfbGVuLAotCQkJCSAgdTggKmtleV9kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci12b2lkIGhhbF9jbGVhcl9hbGxfZ3JvdXBfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci12b2lkIGhhbF9jbGVhcl9hbGxfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX3NldF9wb3dlcl9zYXZlX21vZGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHVuc2lnbmVkIGNoYXIgcG93ZXJfc2F2ZSwKLQkJCSAgICAgdW5zaWduZWQgY2hhciB3YWtldXAsIHVuc2lnbmVkIGNoYXIgZHRpbSk7Ci12b2lkIGhhbF9nZXRfcG93ZXJfc2F2ZV9tb2RlKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqaW5fcHdyX3NhdmUpOwotdm9pZCBoYWxfc2V0X3Nsb3RfdGltZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggdHlwZSk7Ci0KLSNkZWZpbmUgaGFsX3NldF9hdGltX3dpbmRvdyhfQSwgX0FUTSkKLQotdm9pZCBoYWxfc3RhcnRfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBtYWNfb3BfbW9kZSk7Ci0KLS8qIDA6QlNTIFNUQSAxOklCU1MgU1RBICovCi12b2lkIGhhbF9qb2luX3JlcXVlc3Qoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IGJzc190eXBlKTsKLQotdm9pZCBoYWxfc3RvcF9zeW5jX2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci12b2lkIGhhbF9yZXN1bWVfc3luY19ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotdm9pZCBoYWxfc2V0X2FpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGFpZCk7Ci12b2lkIGhhbF9zZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Ci12b2lkIGhhbF9nZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Ci12b2lkIGhhbF9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgbGlzdGVuX2ludGVydmFsKTsKLXZvaWQgaGFsX3NldF9jYXBfaW5mbyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGNhcGFiaWxpdHlfaW5mbyk7Ci12b2lkIGhhbF9zZXRfc3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKnNzaWQsIHU4IHNzaWRfbGVuKTsKLXZvaWQgaGFsX3N0YXJ0X3R4MChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci0KLSNkZWZpbmUgaGFsX2dldF9jd21pbihfQSkJKChfQSktPmN3bWluKQotCi12b2lkIGhhbF9zZXRfY3dtYXgoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBjd2luX21heCk7Ci0KLSNkZWZpbmUgaGFsX2dldF9jd21heChfQSkJKChfQSktPmN3bWF4KQotCi12b2lkIGhhbF9zZXRfcnNuX3dwYShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTMyICpyc25faWVfYml0bWFwLAotCQkgICAgIHUzMiAqcnNuX291aV90eXBlICwgdW5zaWduZWQgY2hhciBkZXNpcmVkX2F1dGhfbW9kZSk7Ci12b2lkIGhhbF9zZXRfY29ubmVjdF9pbmZvKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1bnNpZ25lZCBjaGFyIGJvX2Nvbm5lY3QpOwotdTggaGFsX2dldF9lc3Rfc3EzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBjb3VudCk7Ci12b2lkIGhhbF9kZXNjcmlwdG9yX2luZGljYXRlKHN0cnVjdCBod19kYXRhICpod19kYXRhLAotCQkJICAgICBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXMpOwotdTggaGFsX2dldF9hbnRlbm5hX251bWJlcihzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci11MzIgaGFsX2dldF9ic3NfcGtfY250KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLQotI2RlZmluZSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTShfQSkJKChfQSktPnJlZy5FRVBST01SZWdpb24pCi0jZGVmaW5lIGhhbF9nZXRfdHhfYnVmZmVyKF9BLCBfQikJV2IzNVR4X2dldF90eF9idWZmZXIoX0EsIF9CKQotI2RlZmluZSBoYWxfc29mdHdhcmVfc2V0KF9BKQkJKF9BLT5Tb2Z0d2FyZVNldCkKLSNkZWZpbmUgaGFsX2RyaXZlcl9pbml0X09LKF9BKQkJKF9BLT5Jc0luaXRPSykKLSNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfaGlnaChfQSkJKF9BLT5SU1NJX2hpZ2gpCi0jZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2xvdyhfQSkJKF9BLT5SU1NJX2xvdykKLSNkZWZpbmUgaGFsX3NjYW5faW50ZXJ2YWwoX0EpCQkoX0EtPlNjYW5fSW50ZXJ2YWwpCi0KLSNkZWZpbmUgUEhZX0RFQlVHKG1zZywgYXJncy4uLikKLQotLyogcmV0dXJuIDEwMG1zIGNvdW50ICovCi0jZGVmaW5lIGhhbF9nZXRfdGltZV9jb3VudChfUCkJCShfUC0+dGltZV9jb3VudCAvIDEwKQotI2RlZmluZSBoYWxfZGV0ZWN0X2Vycm9yKF9QKQkJKF9QLT5XYlVzYi5EZXRlY3RDb3VudCkKLQotI2RlZmluZSBoYWxfaWJzc19kaXNjb25uZWN0KF9BKQkJKGhhbF9zdG9wX3N5bmNfYnNzKF9BKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3dibGludXhfZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWQyMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIF9fV0JMSU5VWF9GX0gKLSNkZWZpbmUgX19XQkxJTlVYX0ZfSAotCi0jaW5jbHVkZSAiY29yZS5oIgotI2luY2x1ZGUgIm1kc19zLmgiCi0KLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0gKgotICogd2JsaW51eF9mLmgKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLWludCB3YjM1X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci12b2lkIHdiMzVfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3YjM1X25ldGRldl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKaW5kZXggM2Y2MGNmNy4uMjE2M2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCkBAIC0xNCwxMCArMTQsMTEgQEAKIAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJtZHNfZi5oIgotI2luY2x1ZGUgIm1sbWV0eHJ4X2YuaCIKICNpbmNsdWRlICJtdG8uaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCi0jaW5jbHVkZSAid2JsaW51eF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJ3YjM1dHhfZi5oIgorI2luY2x1ZGUgIndiMzVyeF9mLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiSVM4OUMzNSA4MDIuMTFiZyBXTEFOIFVTQiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTE4MSwxMCArMTgyLDcgQEAKIAlSRlN5bnRoZXNpemVyX1N3aXRjaGluZ0NoYW5uZWwocEh3RGF0YSwgY2hhbm5lbCk7IC8qIFN3aXRjaCBjaGFubmVsICovCiAJcEh3RGF0YS0+Q2hhbm5lbCA9IGNoYW5uZWwuQ2hhbk5vOwogCXBId0RhdGEtPmJhbmQgPSBjaGFubmVsLmJhbmQ7Ci0jaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JcHJpbnRrKCJTZXQgY2hhbm5lbCBpcyAlZCwgYmFuZCA9JWRcbiIsIHBId0RhdGEtPkNoYW5uZWwsCi0JICAgICAgIHBId0RhdGEtPmJhbmQpOwotI2VuZGlmCisJcHJfZGVidWcoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwgcEh3RGF0YS0+YmFuZCk7CiAJcmVnLT5NMjhfTWFjQ29udHJvbCAmPSB+MHhmZjsJLyogQ2xlYW4gY2hhbm5lbCBpbmZvcm1hdGlvbiBmaWVsZCAqLwogCXJlZy0+TTI4X01hY0NvbnRyb2wgfD0gY2hhbm5lbC5DaGFuTm87CiAJV2IzNVJlZ19Xcml0ZVdpdGhDYWxsYmFja1ZhbHVlKHBId0RhdGEsIDB4MDgyOCwgcmVnLT5NMjhfTWFjQ29udHJvbCwKQEAgLTMzOSwxMCArMzM3LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGhhbF9pZGxlKHN0cnVjdCBod19kYXRhICpwSHdEYXRhKQogewogCXN0cnVjdCB3YjM1X3JlZyAqcmVnID0gJnBId0RhdGEtPnJlZzsKLQlzdHJ1Y3Qgd2JfdXNiICpwV2JVc2IgPSAmcEh3RGF0YS0+V2JVc2I7CiAKLQlpZiAoIXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlCi0JICAgICYmIChwV2JVc2ItPkRldGVjdENvdW50IHx8IHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkpCisJaWYgKCFwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSAmJiByZWctPkVQMHZtX3N0YXRlICE9IFZNX1NUT1ApCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtNjA4LDE1ICs2MDQsNiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCX0KLQotCQkvKiBBY3RpdmUgc2VuZCBudWxsIHBhY2tldCB0byBhdm9pZCBBUCBkaXNjb25uZWN0ICovCi0JCWlmIChwSHdEYXRhLT5MRURfTGlua09uKSB7Ci0JCQlwSHdEYXRhLT5OdWxsUGFja2V0Q291bnQgKz0gVGltZUludGVydmFsOwotCQkJaWYgKHBId0RhdGEtPk51bGxQYWNrZXRDb3VudCA+PQotCQkJICAgIERFRkFVTFRfTlVMTF9QQUNLRVRfQ09VTlQpIHsKLQkJCQlwSHdEYXRhLT5OdWxsUGFja2V0Q291bnQgPSAwOwotCQkJfQotCQl9CiAJfQogCiAJcEh3RGF0YS0+dGltZV9jb3VudCArPSBUaW1lSW50ZXJ2YWw7CkBAIC02NTEsMTMgKzYzOCw2IEBACiAKIAlTb2Z0d2FyZVNldCA9IGhhbF9zb2Z0d2FyZV9zZXQocEh3RGF0YSk7CiAKLSNpZmRlZiBWZW5kb3IyCi0JLyogVHJ5IHRvIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGNvbnRhaW4gKi8KLQlTb2Z0d2FyZVNldCA+Pj0gODsKLQlpZiAoU29mdHdhcmVTZXQgIT0gMHg4MikKLQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KIAlXYjM1Unhfc3RhcnQoaHcpOwogCVdiMzVUeF9FUDJWTV9zdGFydChwcml2KTsKIApAQCAtNzM0LDkgKzcxNCw3IEBACiAJfQogCiAJcHJpdi0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vID0gaGFsX2dldF9hbnRlbm5hX251bWJlcihwSHdEYXRhKTsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlwcmludGsoIkRyaXZlciBpbml0LCBhbnRlbm5hIG5vID0gJWRcbiIsIHBzTE9DQUwtPmJBbnRlbm5hTm8pOwotI2VuZGlmCisJcHJfZGVidWcoIkRyaXZlciBpbml0LCBhbnRlbm5hIG5vID0gJWRcbiIsIHByaXYtPnNMb2NhbFBhcmEuYkFudGVubmFObyk7CiAJaGFsX2dldF9od19yYWRpb19vZmYocEh3RGF0YSk7CiAKIAkvKiBXYWl0aW5nIGZvciBIQUwgc2V0dGluZyBPSyAqLwpAQCAtNzY5LDcgKzc0Nyw2IEBACiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmRldjsKIAlzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKnByaXY7Ci0Jc3RydWN0IHdiX3VzYiAqcFdiVXNiOwogCWludCBuciwgZXJyOwogCXUzMiBsdG1wOwogCkBAIC04MDAsMTYgKzc3NywxMyBAQAogCiAJcHJpdiA9IGRldi0+cHJpdjsKIAotCXBXYlVzYiA9ICZwcml2LT5zSHdEYXRhLldiVXNiOwotCXBXYlVzYi0+dWRldiA9IHVkZXY7CisJcHJpdi0+c0h3RGF0YS51ZGV2ID0gdWRldjsKIAogCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKIAotCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpIHsKKwlpZiAoZW5kcG9pbnRbMl0ud01heFBhY2tldFNpemUgPT0gNTEyKQogCQlwcmludGsoIlt3MzV1bmRdIFdvcmtpbmcgb24gVVNCIDIuMFxuIik7Ci0JCXBXYlVzYi0+SXNVc2IyMCA9IDE7Ci0JfQogCiAJZXJyID0gd2IzNV9od19pbml0KGRldik7CiAJaWYgKGVycikKQEAgLTg2MCwxMyArODM0LDkgQEAKIAogc3RhdGljIHZvaWQgd2IzNV9od19oYWx0KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKIHsKLQlNZHNfRGVzdHJveShhZGFwdGVyKTsKLQogCS8qIFR1cm4gb2ZmIFJ4IGFuZCBUeCBoYXJkd2FyZSBhYmlsaXR5ICovCiAJaGFsX3N0b3AoJmFkYXB0ZXItPnNId0RhdGEpOwotI2lmZGVmIF9QRV9VU0JfSU5JX0RVTVBfCi0JcHJpbnRrKCJbdzM1dW5kXSBIYWxfc3RvcCBPLksuXG4iKTsKLSNlbmRpZgorCXByX2RlYnVnKCJbdzM1dW5kXSBIYWxfc3RvcCBPLksuXG4iKTsKIAkvKiBXYWl0aW5nIElycCBjb21wbGV0ZWQgKi8KIAltc2xlZXAoMTAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTYxYWU1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDQgV2luYm9uZCBFbGVjdHJvbmljIENvcnBvcmF0aW9uCi0gKgotICogIE1vZHVsZSBOYW1lOgotICogICAgd2J1c2Jfcy5oCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2lmbmRlZiBfX1dJTkJPTkRfV0JVU0JfU19ICi0jZGVmaW5lIF9fV0lOQk9ORF9XQlVTQl9TX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLXN0cnVjdCB3Yl91c2IgewotCXUzMglJc1VzYjIwOwotCXN0cnVjdAl1c2JfZGV2aWNlICp1ZGV2OwotCXUzMglEZXRlY3RDb3VudDsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMKaW5kZXggMDIwYjE3YS4uMjhhZTlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CisgICAgZGV2ID0gcGNpX2dldF9kcnZkYXRhKCBwZGV2ICk7CiAgICAgaWYoIGRldiA9PSBOVUxMICkgewogICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgcmV0cmlldmUgbmV0X2RldmljZSBzdHJ1Y3R1cmVcbiIgKTsKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCmluZGV4IDdhMTMzN2QuLmE0NTllNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQl9IGVsc2UgewogCQkJREJHX1RSQUNFKERiZ0luZm8sICJGL1cgaW1hZ2UgZmlsZSBmb3VuZFxuIik7CiAjZGVmaW5lIERIRl9BTExPQ19TSVpFIDk2MDAwCQkJLyoganVzdCBiZWxvdyA5NkssIGxldCdzIGhvcGUgaXQgc3VmZmljZXMgZm9yIG5vdyBhbmQgZm9yIHRoZSBmdXR1cmUgKi8KLQkJCWNwID0gKGNoYXIgKil2bWFsbG9jKERIRl9BTExPQ19TSVpFKTsKKwkJCWNwID0gdm1hbGxvYyhESEZfQUxMT0NfU0laRSk7CiAJCQlpZiAoY3AgPT0gTlVMTCkgewogCQkJCURCR19FUlJPUihEYmdJbmZvLCAiZXJyb3IgaW4gdm1hbGxvY1xuIik7CiAJCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKaW5kZXggZTRjODgwNC4uOWI4MzNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCkBAIC00Miw3ICs0Miw3IEBACiAgICAgQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUIHRhbGxpZXM7CiAgICAgc3NpemVfdCByZXQgPSAtRUlOVkFMOwogCi0gICAgcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKyAgICByY3VfcmVhZF9sb2NrKCk7CiAgICAgaWYgKGRldl9pc2FsaXZlKGRldikpIHsKIAl3bF9sb2NrKGxwLCAmZmxhZ3MpOwogCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkgICAgfQogICAgIH0KIAotICAgIHJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKyAgICByY3VfcmVhZF91bmxvY2soKTsKICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKaW5kZXggODM4NzlmOS4uMTQ2ZjM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAKIAkJCS8qIHRhY2sgb24gU05BUCAqLwogCQkJZV9zbmFwID0KLQkJCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSk7CisJCQkgICAgKHN0cnVjdCB3bGFuX3NuYXAgKikgc2tiX3B1c2goc2tiLAorCQkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSk7CiAJCQllX3NuYXAtPnR5cGUgPSBodG9ucyhwcm90byk7CiAJCQlpZiAoZXRoY29udiA9PSBXTEFOX0VUSENPTlZfODAyMWgKIAkJCSAgICAmJiBwODAyMTFfc3R0X2ZpbmRwcm90byhwcm90bykpIHsKQEAgLTE2MSw3ICsxNjIsOCBAQAogCiAJCQkvKiB0YWNrIG9uIGxsYyAqLwogCQkJZV9sbGMgPQotCQkJICAgIChzdHJ1Y3Qgd2xhbl9sbGMgKikgc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CisJCQkgICAgKHN0cnVjdCB3bGFuX2xsYyAqKSBza2JfcHVzaChza2IsCisJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykpOwogCQkJZV9sbGMtPmRzYXAgPSAweEFBOwkvKiBTTkFQLCBzZWUgSUVFRSA4MDIgKi8KIAkJCWVfbGxjLT5zc2FwID0gMHhBQTsKIAkJCWVfbGxjLT5jdGwgPSAweDAzOwpAQCAtMjk3LDEwICsyOTksMTIgQEAKIAlpZiAoKFdMQU5fR0VUX0ZDX1RPRFMoZmMpID09IDApICYmIChXTEFOX0dFVF9GQ19GUk9NRFMoZmMpID09IDApKSB7CiAJCW1lbWNweShkYWRkciwgd19oZHItPmEzLmExLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTMuYTIsIFdMQU5fRVRIQUREUl9MRU4pOwotCX0gZWxzZSBpZiAoKFdMQU5fR0VUX0ZDX1RPRFMoZmMpID09IDApICYmIChXTEFOX0dFVF9GQ19GUk9NRFMoZmMpID09IDEpKSB7CisJfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMCkKKwkJCSYmIChXTEFOX0dFVF9GQ19GUk9NRFMoZmMpID09IDEpKSB7CiAJCW1lbWNweShkYWRkciwgd19oZHItPmEzLmExLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTMuYTMsIFdMQU5fRVRIQUREUl9MRU4pOwotCX0gZWxzZSBpZiAoKFdMQU5fR0VUX0ZDX1RPRFMoZmMpID09IDEpICYmIChXTEFOX0dFVF9GQ19GUk9NRFMoZmMpID09IDApKSB7CisJfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMSkKKwkJCSYmIChXTEFOX0dFVF9GQ19GUk9NRFMoZmMpID09IDApKSB7CiAJCW1lbWNweShkYWRkciwgd19oZHItPmEzLmEzLCBXTEFOX0VUSEFERFJfTEVOKTsKIAkJbWVtY3B5KHNhZGRyLCB3X2hkci0+YTMuYTIsIFdMQU5fRVRIQUREUl9MRU4pOwogCX0gZWxzZSB7CkBAIC0zNDksNyArMzUzLDggQEAKIAogCWVfbGxjID0gKHN0cnVjdCB3bGFuX2xsYyAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQpOwogCWVfc25hcCA9Ci0JICAgIChzdHJ1Y3Qgd2xhbl9zbmFwICopIChza2ItPmRhdGEgKyBwYXlsb2FkX29mZnNldCArIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpKTsKKwkgICAgKHN0cnVjdCB3bGFuX3NuYXAgKikgKHNrYi0+ZGF0YSArIHBheWxvYWRfb2Zmc2V0ICsKKwkJc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykpOwogCiAJLyogVGVzdCBmb3IgdGhlIHZhcmlvdXMgZW5jb2RpbmdzICovCiAJaWYgKChwYXlsb2FkX2xlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHdsYW5fZXRoaGRyKSkgJiYKQEAgLTM3Miw5ICszNzcsMTEgQEAKIAkJLyogY2hvcCBvZmYgdGhlIDgwMi4xMSBDUkMgKi8KIAkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIFdMQU5fQ1JDX0xFTik7CiAKLQl9IGVsc2UgaWYgKChwYXlsb2FkX2xlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSArIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKLQkJICAgJiYgKGVfbGxjLT5kc2FwID09IDB4YWEpICYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQotCQkgICAmJiAoZV9sbGMtPmN0bCA9PSAweDAzKQorCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsKKwkJc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQorCQkmJihlX2xsYy0+ZHNhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPnNzYXAgPT0gMHhhYSkKKwkJJiYgKGVfbGxjLT5jdGwgPT0gMHgwMykKIAkJICAgJiYKIAkJICAgKCgobWVtY21wKGVfc25hcC0+b3VpLCBvdWlfcmZjMTA0MiwgV0xBTl9JRUVFX09VSV9MRU4pID09IDApCiAJCSAgICAgJiYgKGV0aGNvbnYgPT0gV0xBTl9FVEhDT05WXzgwMjFoKQpAQCAtNDA2LDIxICs0MTMsMjUgQEAKIAkJLyogY2hvcCBvZmYgdGhlIDgwMi4xMSBDUkMgKi8KIAkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIFdMQU5fQ1JDX0xFTik7CiAKLQl9IGVsc2UgaWYgKChwYXlsb2FkX2xlbmd0aCA+PSBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSArIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKLQkJICAgJiYgKGVfbGxjLT5kc2FwID09IDB4YWEpICYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQotCQkgICAmJiAoZV9sbGMtPmN0bCA9PSAweDAzKSkgeworCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsKKwkJc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQorCQkmJihlX2xsYy0+ZHNhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPnNzYXAgPT0gMHhhYSkKKwkJJiYgKGVfbGxjLT5jdGwgPT0gMHgwMykpIHsKIAkJcHJfZGVidWcoIjgwMi4xaC9SRkMxMDQyIGxlbjogJWRcbiIsIHBheWxvYWRfbGVuZ3RoKTsKLQkJLyogaXQncyBhbiA4MDIuMWggZnJhbWUgfHwgKGFuIFJGQzEwNDIgJiYgcHJvdG9jb2wgaXMgbm90IGluIFNUVCkgKi8KLQkJLyogYnVpbGQgYSBESVhJSSArIFJGQzg5NCAqLworCQkvKiBpdCdzIGFuIDgwMi4xaCBmcmFtZSB8fCAoYW4gUkZDMTA0MiAmJiBwcm90b2NvbCBub3QgaW4gU1RUKQorCQkgICBidWlsZCBhIERJWElJICsgUkZDODk0ICovCiAKIAkJLyogVGVzdCBmb3IgYW4gb3Zlcmxlbmd0aCBmcmFtZSAqLwotCQlpZiAoKHBheWxvYWRfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgLSBzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCi0JCSAgICA+IG5ldGRldi0+bXR1KSB7CisJCWlmICgocGF5bG9hZF9sZW5ndGggLSBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSAtCisJCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCisJCQk+IG5ldGRldi0+bXR1KSB7CiAJCQkvKiBBIGJvZ3VzIGxlbmd0aCBldGhmcm0gaGFzIGJlZW4gc2VudC4gKi8KIAkJCS8qIElzIHNvbWVvbmUgdHJ5aW5nIGFuIG9mbG93IGF0dGFjaz8gKi8KIAkJCXByaW50ayhLRVJOX0VSUiAiRElYSUkgZnJhbWUgdG9vIGxhcmdlICglbGQgPiAlZClcbiIsCi0JCQkgICAgICAgKGxvbmcgaW50KShwYXlsb2FkX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0KLQkJCQkJICBzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpLCBuZXRkZXYtPm10dSk7CisJCQkgICAgICAgKGxvbmcgaW50KShwYXlsb2FkX2xlbmd0aCAtCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKSwgbmV0ZGV2LT5tdHUpOwogCQkJcmV0dXJuIDE7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCmluZGV4IGVjYTAzOTEuLmVhNDkzYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKQEAgLTY2LDEyICs2NiwxNCBAQAogI2RlZmluZQlQODAyMTFfRlJNTUVUQV9NQUdJQwkweDgwMjExMAogCiAjZGVmaW5lIFA4MDIxMVNLQl9GUk1NRVRBKHMpIFwKLQkoKCgoKHN0cnVjdCBwODAyMTFfZnJtbWV0YSAqKSgocyktPmNiKSktPm1hZ2ljKSA9PSBQODAyMTFfRlJNTUVUQV9NQUdJQykgPyBcCisJKCgoKChzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKikoKHMpLT5jYikpLT5tYWdpYykgPT0gXAorCQlQODAyMTFfRlJNTUVUQV9NQUdJQykgPyBcCiAJCSgoc3RydWN0IHA4MDIxMV9mcm1tZXRhICopKChzKS0+Y2IpKSA6IFwKIAkJKE5VTEwpKQogCiAjZGVmaW5lIFA4MDIxMVNLQl9SWE1FVEEocykgXAotCShQODAyMTFTS0JfRlJNTUVUQSgocykpID8gIFA4MDIxMVNLQl9GUk1NRVRBKChzKSktPnJ4IDogKChzdHJ1Y3QgcDgwMjExX3J4bWV0YSAqKShOVUxMKSkpCisJKFA4MDIxMVNLQl9GUk1NRVRBKChzKSkgPyAgUDgwMjExU0tCX0ZSTU1FVEEoKHMpKS0+cnggOiBcCisJCSgoc3RydWN0IHA4MDIxMV9yeG1ldGEgKikoTlVMTCkpKQogCiBzdHJ1Y3QgcDgwMjExX3J4bWV0YSB7CiAJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCmluZGV4IGI3YjRhNzMuLmIwYWYyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jCkBAIC0zMDEsNyArMzAxLDggQEAKIAkJCQkJaWYgKG1lbWNtcAogCQkJCQkgICAgKGhkci0+YTEsIHdsYW5kZXYtPm5ldGRldi0+ZGV2X2FkZHIsCiAJCQkJCSAgICAgRVRIX0FMRU4pICE9IDApIHsKLQkJCQkJCS8qIGJ1dCByZWplY3QgYW55dGhpbmcgZWxzZSB0aGF0IGlzbid0IG11bHRpY2FzdCAqLworCQkJCQkJLyogYnV0IHJlamVjdCBhbnl0aGluZyBlbHNlIHRoYXQKKwkJCQkJCSAgIGlzbid0IG11bHRpY2FzdCAqLwogCQkJCQkJaWYgKCEoaGRyLT5hMVswXSAmIDB4MDEpKSB7CiAJCQkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQkJCWNvbnRpbnVlOwpAQCAtNzcwLDcgKzc3MSw4IEBACiAJfQogCiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN0cnVjdCBkZXZpY2UgKi8KLQluZXRkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB3aXJlbGVzc19kZXYpLCAid2xhbiVkIiwgZXRoZXJfc2V0dXApOworCW5ldGRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksICJ3bGFuJWQiLAorCQkJCWV0aGVyX3NldHVwKTsKIAlpZiAobmV0ZGV2ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2MgbmV0ZGV2LlxuIik7CiAJCXdsYW5fZnJlZV93aXBoeSh3aXBoeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCmluZGV4IDFlYzMzNzQuLjg1ODg0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCkBAIC05NCwxMSArOTQsMTEgQEAKICNlbmRpZgogCiAvKi0tLSBOU0QgQ2FwYWJpbGl0aWVzIEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFA4MDIxMV9OU0RDQVBfSEFSRFdBUkVXRVAgICAgICAgICAgIDB4MDEJLyogaGFyZHdhcmUgd2VwIGVuZ2luZSAqLwotI2RlZmluZSBQODAyMTFfTlNEQ0FQX1NIT1JUX1BSRUFNQkxFICAgICAgICAweDEwCS8qIGhhcmR3YXJlIHN1cHBvcnRzICovCi0jZGVmaW5lIFA4MDIxMV9OU0RDQVBfSFdGUkFHTUVOVCAgICAgICAgICAgIDB4ODAJLyogbnNkIGhhbmRsZXMgZnJhZy9kZWZyYWcgKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9BVVRPSk9JTiAgICAgICAgICAgICAgMHgxMDAJLyogbnNkIGRvZXMgYXV0b2pvaW4gKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9OT1NDQU4gICAgICAgICAgICAgICAgMHgyMDAJLyogbnNkIGNhbiBzY2FuICovCisjZGVmaW5lIFA4MDIxMV9OU0RDQVBfSEFSRFdBUkVXRVAgICAgICAgICAgIDB4MDEgIC8qIGhhcmR3YXJlIHdlcCBlbmdpbmUgKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9TSE9SVF9QUkVBTUJMRSAgICAgICAgMHgxMCAgLyogaGFyZHdhcmUgc3VwcG9ydHMgKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9IV0ZSQUdNRU5UICAgICAgICAgICAgMHg4MCAgLyogbnNkIGhhbmRsZXMgZnJhZy9kZWZyYWcgKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9BVVRPSk9JTiAgICAgICAgICAgICAgMHgxMDAgLyogbnNkIGRvZXMgYXV0b2pvaW4gKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9OT1NDQU4gICAgICAgICAgICAgICAgMHgyMDAgLyogbnNkIGNhbiBzY2FuICovCiAKIC8qIFJlY2VpdmVkIGZyYW1lIHN0YXRpc3RpY3MgKi8KIHR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1yeF90IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCmluZGV4IDQxYTk5YzUuLjlkZWM4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaApAQCAtMTQxLDE0ICsxNDEsMTQgQEAKICNkZWZpbmUgUDgwMjExRElEX0xTQl9JVEVNCQkoMTIpCiAjZGVmaW5lIFA4MDIxMURJRF9MU0JfSU5ERVgJCSgxOCkKICNkZWZpbmUgUDgwMjExRElEX0xTQl9JU1RBQkxFCQkoMjYpCi0jZGVmaW5lIFA4MDIxMURJRF9MU0JfQUNDRVNTIAkJKDI3KQorI2RlZmluZSBQODAyMTFESURfTFNCX0FDQ0VTUwkJKDI3KQogCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX1NFQ1RJT04JCSgweDAwMDAwMDNmVUwpCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX0dST1VQCQkoMHgwMDAwMDAzZlVMKQogI2RlZmluZSBQODAyMTFESURfTUFTS19JVEVNCQkoMHgwMDAwMDAzZlVMKQogI2RlZmluZSBQODAyMTFESURfTUFTS19JTkRFWAkJKDB4MDAwMDAwZmZVTCkKICNkZWZpbmUgUDgwMjExRElEX01BU0tfSVNUQUJMRQkJKDB4MDAwMDAwMDFVTCkKLSNkZWZpbmUgUDgwMjExRElEX01BU0tfQUNDRVNTIAkJKDB4MDAwMDAwMDNVTCkKKyNkZWZpbmUgUDgwMjExRElEX01BU0tfQUNDRVNTCQkoMHgwMDAwMDAwM1VMKQogCiAjZGVmaW5lIFA4MDIxMURJRF9NSyhhLCBtLCBsKQkoKCgodTMyKShhKSkgJiAobSkpIDw8IChsKSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCmluZGV4IDA0NTE0YTguLjY2NzVjODIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCkBAIC0yMTMsOCArMjEzLDggQEAKIAkJdTE2IHdvcmRidWZbMTddOwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJCSAgSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsCi0JCQkJCQkgIEhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0pOworCQkJCQlIRkEzODR4X1JJRF9DTkZST0FNSU5HTU9ERSwKKwkJCQkJSEZBMzg0eF9ST0FNTU9ERV9IT1NUU0NBTl9IT1NUUk9BTSk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJzZXRjb25maWcoUk9BTUlOR01PREUpIGZhaWxlZC4gcmVzdWx0PSVkXG4iLApAQCAtMjU4LDggKzI1OCw4IEBACiAJCX0KIAkJLyogaWJzcyBvcHRpb25zICovCiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywKLQkJCQkJCSAgSEZBMzg0eF9SSURfQ1JFQVRFSUJTUywKLQkJCQkJCSAgSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTKTsKKwkJCQkJSEZBMzg0eF9SSURfQ1JFQVRFSUJTUywKKwkJCQkJSEZBMzg0eF9DUkVBVEVJQlNTX0pPSU5DUkVBVEVJQlNTKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0IENSRUFURUlCU1MuXG4iKTsKIAkJCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0KQEAgLTQxNiw3ICs0MTYsOCBAQAogI2RlZmluZSBSRVFCQVNJQ1JBVEUoTikgXAogCWlmICgoY291bnQgPj0gTikgJiYgRE9UMTFfUkFURTVfSVNCQVNJQ19HRVQoaXRlbS0+c3VwcHJhdGVzWyhOKS0xXSkpIHsgXAogCQlyZXEtPmJhc2ljcmF0ZSAjIyBOIC5kYXRhID0gaXRlbS0+c3VwcHJhdGVzWyhOKS0xXTsgXAotCQlyZXEtPmJhc2ljcmF0ZSAjIyBOIC5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKKwkJcmVxLT5iYXNpY3JhdGUgIyMgTiAuc3RhdHVzID0gXAorCQkJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCiAJfQogCiAJUkVRQkFTSUNSQVRFKDEpOwpAQCAtNDMxLDcgKzQzMiw4IEBACiAjZGVmaW5lIFJFUVNVUFBSQVRFKE4pIFwKIAlpZiAoY291bnQgPj0gTikgeyBcCiAJCXJlcS0+c3VwcHJhdGUgIyMgTiAuZGF0YSA9IGl0ZW0tPnN1cHByYXRlc1soTiktMV07IFwKLQkJcmVxLT5zdXBwcmF0ZSAjIyBOIC5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKKwkJcmVxLT5zdXBwcmF0ZSAjIyBOIC5zdGF0dXMgPSBcCisJCQlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7IFwKIAl9CiAKIAlSRVFTVVBQUkFURSgxKTsKQEAgLTExMDIsNyArMTEwNCw3IEBACiAJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGh3LCAwKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcKLQkJCSAgICAoImZhaWxlZCB0byBkaXNhYmxlIHBvcnQgMCBhZnRlciBzbmlmZmluZywgcmVzdWx0PSVkXG4iLAorCQkJKCJmYWlsZWQgdG8gZGlzYWJsZSBwb3J0IDAgYWZ0ZXIgc25pZmZpbmcsIHJlc3VsdD0lZFxuIiwKIAkJCSAgICAgcmVzdWx0KTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CkBAIC0xMTM3LDcgKzExMzksNyBAQAogCQkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2VuYWJsZShodywgMCk7CiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJcHJfZGVidWcKLQkJCQkgICAgKCJmYWlsZWQgdG8gZW5hYmxlIHBvcnQgdG8gcHJlc25pZmYgc2V0dGluZywgcmVzdWx0PSVkXG4iLAorCQkJCSgiZmFpbGVkIHRvIGVuYWJsZSBwb3J0IHRvIHByZXNuaWZmIHNldHRpbmcsIHJlc3VsdD0lZFxuIiwKIAkJCQkgICAgIHJlc3VsdCk7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CkBAIC0xMTYxLDcgKzExNjMsNyBAQAogCQkJCQkJICAmKGh3LT5wcmVzbmlmZl9wb3J0X3R5cGUpKTsKIAkJCQlpZiAocmVzdWx0KSB7CiAJCQkJCXByX2RlYnVnCi0JCQkJCSAgICAoImZhaWxlZCB0byByZWFkIHBvcnR0eXBlLCByZXN1bHQ9JWRcbiIsCisJCQkJCSgiZmFpbGVkIHRvIHJlYWQgcG9ydHR5cGUsIHJlc3VsdD0lZFxuIiwKIAkJCQkJICAgICByZXN1bHQpOwogCQkJCQlnb3RvIGZhaWxlZDsKIAkJCQl9CkBAIC0xMTcxLDcgKzExNzMsNyBAQAogCQkJCQkJICAmKGh3LT5wcmVzbmlmZl93ZXBmbGFncykpOwogCQkJCWlmIChyZXN1bHQpIHsKIAkJCQkJcHJfZGVidWcKLQkJCQkJICAgICgiZmFpbGVkIHRvIHJlYWQgd2VwZmxhZ3MsIHJlc3VsdD0lZFxuIiwKKwkJCQkJKCJmYWlsZWQgdG8gcmVhZCB3ZXBmbGFncywgcmVzdWx0PSVkXG4iLAogCQkJCQkgICAgIHJlc3VsdCk7CiAJCQkJCWdvdG8gZmFpbGVkOwogCQkJCX0KQEAgLTEyMzgsOCArMTI0MCw4IEBACiAKIAkJCWlmIChyZXN1bHQpIHsKIAkJCQlwcl9kZWJ1ZwotCQkJCSAgICAoImZhaWxlZCB0byBzZXQgd2VwZmxhZ3M9MHglMDR4LCByZXN1bHQ9JWRcbiIsCi0JCQkJICAgICB3b3JkLCByZXN1bHQpOworCQkJCSAgKCJmYWlsZWQgdG8gc2V0IHdlcGZsYWdzPTB4JTA0eCwgcmVzdWx0PSVkXG4iLAorCQkJCSAgIHdvcmQsIHJlc3VsdCk7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKaW5kZXggNGY3M2QwOS4uZWUwMDhlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKQEAgLTQ3Miw5ICs0NzIsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlX2lkLCBwZGV2KTsKLQkJaWYgKHBkZXYpCisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCBuYnJpZGdlX2lkLCBwZGV2KTsKKwkJaWYgKHBkZXYpIHsKIAkJCXZhbGlkX3BkZXYgPSAxOworCQkJcGNpX2Rldl9wdXQocGRldik7CisJCX0KIAl9CiAKIAlpZiAoIXZhbGlkX3BkZXYpIHsKQEAgLTIxNzgsOCArMjE4MCw3IEBACiAKICNpZm5kZWYgQUdQT0ZGCiAJaWYgKFhHSWZiX3F1ZXVlbW9kZSA9PSBBR1BfQ01EX1FVRVVFKSB7Ci0JCWFncF9pbmZvID0gdm1hbGxvYyhzaXplb2YoKmFncF9pbmZvKSk7Ci0JCW1lbXNldCgodm9pZCAqKWFncF9pbmZvLCAweDAwLCBzaXplb2YoKmFncF9pbmZvKSk7CisJCWFncF9pbmZvID0gdnphbGxvYyhzaXplb2YoKmFncF9pbmZvKSk7CiAJCWFncF9jb3B5X2luZm8oYWdwX2luZm8pOwogCiAJCWFncF9iYWNrZW5kX2FjcXVpcmUoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS94dm1hbGxvYy5jCmluZGV4IDNmZGJiOGEuLmI2NDQwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0veHZtYWxsb2MuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc2xpbmRleCA9IGdldF9pbmRleF9mb3JfaW5zZXJ0KGJsb2NrLT5zaXplKTsKIAlmbGluZGV4ID0gc2xpbmRleCAvIEJJVFNfUEVSX0xPTkc7CiAKLQlibG9jay0+bGluay5wcmV2X3BhZ2UgPSAwOworCWJsb2NrLT5saW5rLnByZXZfcGFnZSA9IE5VTEw7CiAJYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSAwOwogCWJsb2NrLT5saW5rLm5leHRfcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CiAJYmxvY2stPmxpbmsubmV4dF9vZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAogCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CiAJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7Ci0JYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X3BhZ2UgPSBOVUxMOwogCWJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKIAogCWlmICghcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSkgewpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCSAqLwogCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UsCiAJCQkJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0LCBLTV9VU0VSMSk7Ci0JCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IE5VTEw7CiAJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKIAkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYwppbmRleCBkMGU5ZTAyLi41NDE1NzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCX0KIAogCW51bV9wYWdlcyA9IHpyYW0tPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7Ci0JenJhbS0+dGFibGUgPSB2bWFsbG9jKG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKKwl6cmFtLT50YWJsZSA9IHZ6YWxsb2MobnVtX3BhZ2VzICogc2l6ZW9mKCp6cmFtLT50YWJsZSkpOwogCWlmICghenJhbS0+dGFibGUpIHsKIAkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHpyYW0gYWRkcmVzcyB0YWJsZVxuIik7CiAJCS8qIFRvIHByZXZlbnQgYWNjZXNzaW5nIHRhYmxlIGVudHJpZXMgZHVyaW5nIGNsZWFudXAgKi8KQEAgLTUzNSw3ICs1MzUsNiBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQotCW1lbXNldCh6cmFtLT50YWJsZSwgMCwgbnVtX3BhZ2VzICogc2l6ZW9mKCp6cmFtLT50YWJsZSkpOwogCiAJc2V0X2NhcGFjaXR5KHpyYW0tPmRpc2ssIHpyYW0tPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKaW5kZXggMGQyMzZmNC4uYjAwMTAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKQEAgLTI4NCwxMiArMjg0LDExIEBACiAKIG1vZHVsZV9wYXJhbShpeGpkZWJ1ZywgaW50LCAwKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl4al9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpeGpfcGNpX3RibCkgPSB7CiAJeyBQQ0lfVkVORE9SX0lEX1FVSUNLTkVULCBQQ0lfREVWSUNFX0lEX1FVSUNLTkVUX1hKLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCiAJeyB9CiB9OwotCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXhqX3BjaV90YmwpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NTgxLDcgKzY1ODAsOCBAQAogCWNhc2UgSVhKQ1RMX1NFVF9GSUxURVI6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmamYsIGFyZ3AsIHNpemVvZihqZikpKSAKIAkJCXJldHZhbCA9IC1FRkFVTFQ7Ci0JCXJldHZhbCA9IGl4al9pbml0X2ZpbHRlcihqLCAmamYpOworCQllbHNlCisJCQlyZXR2YWwgPSBpeGpfaW5pdF9maWx0ZXIoaiwgJmpmKTsKIAkJYnJlYWs7CiAJY2FzZSBJWEpDVExfU0VUX0ZJTFRFUl9SQVc6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmamZyLCBhcmdwLCBzaXplb2YoamZyKSkpIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL0tjb25maWcgYi9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZwppbmRleCBiZjdjNjg3Li5mN2E1ZGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZwpAQCAtNCw2ICs0LDcgQEAKIAogbWVudWNvbmZpZyBUSEVSTUFMCiAJdHJpc3RhdGUgIkdlbmVyaWMgVGhlcm1hbCBzeXNmcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBORVQKIAloZWxwCiAJICBHZW5lcmljIFRoZXJtYWwgU3lzZnMgZHJpdmVyIG9mZmVycyBhIGdlbmVyaWMgbWVjaGFuaXNtIGZvcgogCSAgdGhlcm1hbCBtYW5hZ2VtZW50LiBVc3VhbGx5IGl0J3MgbWFkZSB1cCBvZiBvbmUgb3IgbW9yZSB0aGVybWFsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCmluZGV4IDEzYzcyYzYuLjdkMGU2M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCkBAIC0zMiw2ICszMiw4IEBACiAjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlpoYW5nIFJ1aSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIHRoZXJtYWwgbWFuYWdlbWVudCBzeXNmcyBzdXBwb3J0Iik7CkBAIC01OCw2ICs2MCwyMiBAQAogc3RhdGljIExJU1RfSEVBRCh0aGVybWFsX2NkZXZfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHRoZXJtYWxfbGlzdF9sb2NrKTsKIAorc3RhdGljIHVuc2lnbmVkIGludCB0aGVybWFsX2V2ZW50X3NlcW51bTsKKworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSB0aGVybWFsX2V2ZW50X2dlbmxfZmFtaWx5ID0geworCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCisJLm5hbWUgPSBUSEVSTUFMX0dFTkxfRkFNSUxZX05BTUUsCisJLnZlcnNpb24gPSBUSEVSTUFMX0dFTkxfVkVSU0lPTiwKKwkubWF4YXR0ciA9IFRIRVJNQUxfR0VOTF9BVFRSX01BWCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgdGhlcm1hbF9ldmVudF9tY2dycCA9IHsKKwkubmFtZSA9IFRIRVJNQUxfR0VOTF9NQ0FTVF9HUk9VUF9OQU1FLAorfTsKKworc3RhdGljIGludCBnZW5ldGxpbmtfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGdlbmV0bGlua19leGl0KHZvaWQpOworCiBzdGF0aWMgaW50IGdldF9pZHIoc3RydWN0IGlkciAqaWRyLCBzdHJ1Y3QgbXV0ZXggKmxvY2ssIGludCAqaWQpCiB7CiAJaW50IGVycjsKQEAgLTgyMywxMSArODQxLDggQEAKICAqIEBkZXZkYXRhOglkZXZpY2UgcHJpdmF0ZSBkYXRhLgogICogQG9wczoJCXN0YW5kYXJkIHRoZXJtYWwgY29vbGluZyBkZXZpY2VzIGNhbGxiYWNrcy4KICAqLwotc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKnRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoY2hhciAqdHlwZSwKLQkJCQkJCQkgICAgICAgdm9pZCAqZGV2ZGF0YSwKLQkJCQkJCQkgICAgICAgc3RydWN0Ci0JCQkJCQkJICAgICAgIHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzCi0JCQkJCQkJICAgICAgICpvcHMpCitzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcigKKyAgICAgY2hhciAqdHlwZSwgdm9pZCAqZGV2ZGF0YSwgY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICpvcHMpCiB7CiAJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7CiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnBvczsKQEAgLTEwNDgsMTMgKzEwNjMsOSBAQAogICogc2VjdGlvbiAxMS4xLjUuMSBvZiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIDMuMC4KICAqLwogc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIoY2hhciAqdHlwZSwKLQkJCQkJCQkgaW50IHRyaXBzLAotCQkJCQkJCSB2b2lkICpkZXZkYXRhLCBzdHJ1Y3QKLQkJCQkJCQkgdGhlcm1hbF96b25lX2RldmljZV9vcHMKLQkJCQkJCQkgKm9wcywgaW50IHRjMSwgaW50Ci0JCQkJCQkJIHRjMiwKLQkJCQkJCQkgaW50IHBhc3NpdmVfZGVsYXksCi0JCQkJCQkJIGludCBwb2xsaW5nX2RlbGF5KQorCWludCB0cmlwcywgdm9pZCAqZGV2ZGF0YSwKKwljb25zdCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgKm9wcywKKwlpbnQgdGMxLCBpbnQgdGMyLCBpbnQgcGFzc2l2ZV9kZWxheSwgaW50IHBvbGxpbmdfZGVsYXkpCiB7CiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6OwogCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpwb3M7CkBAIC0xMjE0LDYgKzEyMjUsODIgQEAKIAogRVhQT1JUX1NZTUJPTCh0aGVybWFsX3pvbmVfZGV2aWNlX3VucmVnaXN0ZXIpOwogCitpbnQgZ2VuZXJhdGVfbmV0bGlua19ldmVudCh1MzIgb3JpZywgZW51bSBldmVudHMgZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyOworCXN0cnVjdCB0aGVybWFsX2dlbmxfZXZlbnQgKnRoZXJtYWxfZXZlbnQ7CisJdm9pZCAqbXNnX2hlYWRlcjsKKwlpbnQgc2l6ZTsKKwlpbnQgcmVzdWx0OworCisJLyogYWxsb2NhdGUgbWVtb3J5ICovCisJc2l6ZSA9IG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgdGhlcm1hbF9nZW5sX2V2ZW50KSkgKyBcCisJCQkJbmxhX3RvdGFsX3NpemUoMCk7CisKKwlza2IgPSBnZW5sbXNnX25ldyhzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBhZGQgdGhlIGdlbmV0bGluayBtZXNzYWdlIGhlYWRlciAqLworCW1zZ19oZWFkZXIgPSBnZW5sbXNnX3B1dChza2IsIDAsIHRoZXJtYWxfZXZlbnRfc2VxbnVtKyssCisJCQkJICZ0aGVybWFsX2V2ZW50X2dlbmxfZmFtaWx5LCAwLAorCQkJCSBUSEVSTUFMX0dFTkxfQ01EX0VWRU5UKTsKKwlpZiAoIW1zZ19oZWFkZXIpIHsKKwkJbmxtc2dfZnJlZShza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmaWxsIHRoZSBkYXRhICovCisJYXR0ciA9IG5sYV9yZXNlcnZlKHNrYiwgVEhFUk1BTF9HRU5MX0FUVFJfRVZFTlQsIFwKKwkJCXNpemVvZihzdHJ1Y3QgdGhlcm1hbF9nZW5sX2V2ZW50KSk7CisKKwlpZiAoIWF0dHIpIHsKKwkJbmxtc2dfZnJlZShza2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0aGVybWFsX2V2ZW50ID0gbmxhX2RhdGEoYXR0cik7CisJaWYgKCF0aGVybWFsX2V2ZW50KSB7CisJCW5sbXNnX2ZyZWUoc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KHRoZXJtYWxfZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgdGhlcm1hbF9nZW5sX2V2ZW50KSk7CisKKwl0aGVybWFsX2V2ZW50LT5vcmlnID0gb3JpZzsKKwl0aGVybWFsX2V2ZW50LT5ldmVudCA9IGV2ZW50OworCisJLyogc2VuZCBtdWx0aWNhc3QgZ2VuZXRsaW5rIG1lc3NhZ2UgKi8KKwlyZXN1bHQgPSBnZW5sbXNnX2VuZChza2IsIG1zZ19oZWFkZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCW5sbXNnX2ZyZWUoc2tiKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXN1bHQgPSBnZW5sbXNnX211bHRpY2FzdChza2IsIDAsIHRoZXJtYWxfZXZlbnRfbWNncnAuaWQsIEdGUF9BVE9NSUMpOworCWlmIChyZXN1bHQpCisJCXByaW50ayhLRVJOX0lORk8gImZhaWxlZCB0byBzZW5kIG5ldGxpbmsgZXZlbnQ6JWQiLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJhdGVfbmV0bGlua19ldmVudCk7CisKK3N0YXRpYyBpbnQgZ2VuZXRsaW5rX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJnRoZXJtYWxfZXZlbnRfZ2VubF9mYW1pbHkpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXN1bHQgPSBnZW5sX3JlZ2lzdGVyX21jX2dyb3VwKCZ0aGVybWFsX2V2ZW50X2dlbmxfZmFtaWx5LAorCQkJCQkmdGhlcm1hbF9ldmVudF9tY2dycCk7CisJaWYgKHJlc3VsdCkKKwkJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmdGhlcm1hbF9ldmVudF9nZW5sX2ZhbWlseSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIGludCBfX2luaXQgdGhlcm1hbF9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xMjI1LDkgKzEzMTIsMTUgQEAKIAkJbXV0ZXhfZGVzdHJveSgmdGhlcm1hbF9pZHJfbG9jayk7CiAJCW11dGV4X2Rlc3Ryb3koJnRoZXJtYWxfbGlzdF9sb2NrKTsKIAl9CisJcmVzdWx0ID0gZ2VuZXRsaW5rX2luaXQoKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBnZW5ldGxpbmtfZXhpdCh2b2lkKQoreworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJnRoZXJtYWxfZXZlbnRfZ2VubF9mYW1pbHkpOworfQorCiBzdGF0aWMgdm9pZCBfX2V4aXQgdGhlcm1hbF9leGl0KHZvaWQpCiB7CiAJY2xhc3NfdW5yZWdpc3RlcigmdGhlcm1hbF9jbGFzcyk7CkBAIC0xMjM1LDcgKzEzMjgsOCBAQAogCWlkcl9kZXN0cm95KCZ0aGVybWFsX2NkZXZfaWRyKTsKIAltdXRleF9kZXN0cm95KCZ0aGVybWFsX2lkcl9sb2NrKTsKIAltdXRleF9kZXN0cm95KCZ0aGVybWFsX2xpc3RfbG9jayk7CisJZ2VuZXRsaW5rX2V4aXQoKTsKIH0KIAotc3Vic3lzX2luaXRjYWxsKHRoZXJtYWxfaW5pdCk7Citmc19pbml0Y2FsbCh0aGVybWFsX2luaXQpOwogbW9kdWxlX2V4aXQodGhlcm1hbF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IGI5Mjc4YTEuLmZjYTYxNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCSAqIEp1c3QgcmUtZW5hYmxlIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBlbmRwb2ludCB0b2dnbGVzLgogCQkgKi8KIAkJdXNiX2VuYWJsZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgZmFsc2UpOwotCX0gZWxzZSBpZiAoIWVycm9yICYmIGludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKSB7CisJfSBlbHNlIGlmICghZXJyb3IgJiYgIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CiAJCXIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJCWlmIChyIDwgMCkKQEAgLTk2MCw3ICs5NjAsNyBAQAogCX0KIAogCS8qIFRyeSB0byByZWJpbmQgdGhlIGludGVyZmFjZSAqLwotCWlmIChpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikgeworCWlmICghaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKIAkJaW50Zi0+bmVlZHNfYmluZGluZyA9IDA7CiAJCXJjID0gZGV2aWNlX2F0dGFjaCgmaW50Zi0+ZGV2KTsKIAkJaWYgKHJjIDwgMCkKQEAgLTExMDcsOCArMTEwNyw3IEBACiAJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpIHsKIAogCQkvKiBDYXJyeSBvdXQgYSBkZWZlcnJlZCBzd2l0Y2ggdG8gYWx0c2V0dGluZyAwICovCi0JCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJgotCQkJCWludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKSB7CisJCWlmIChpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCAmJiAhaW50Zi0+ZGV2LnBvd2VyLmluX3N1c3BlbmQpIHsKIAkJCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uCiAJCQkJCWRlc2MuYkludGVyZmFjZU51bWJlciwgMCk7CiAJCQlpbnRmLT5uZWVkc19hbHRzZXR0aW5nMCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lteF91ZGMuYwppbmRleCAxMjEwNTM0Li41NDA4MTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMKQEAgLTEzMjAsNyArMTMyMCw3IEBACiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVVNCIGdhZGdlZCBkcml2ZXIgZnVuY3Rpb25zCisgKiBVU0IgZ2FkZ2V0IGRyaXZlciBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KIGludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9sYW5nd2VsbF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sYW5nd2VsbF91ZGMuYwppbmRleCA3Nzc5NzI0Li4xZWNhOGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGFuZ3dlbGxfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xhbmd3ZWxsX3VkYy5jCkBAIC0zMDg2LDcgKzMwODYsNyBAQAogCiAJa2ZyZWUoZGV2LT5lcCk7CiAKLQkvKiBkaWFibGUgSVJRIGhhbmRsZXIgKi8KKwkvKiBkaXNhYmxlIElSUSBoYW5kbGVyICovCiAJaWYgKGRldi0+Z290X2lycSkKIAkJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOwogCkBAIC0zNDA2LDcgKzM0MDYsNyBAQAogCS8qIGRpc2FibGUgaW50ZXJydXB0IGFuZCBzZXQgY29udHJvbGxlciB0byBzdG9wIHN0YXRlICovCiAJbGFuZ3dlbGxfdWRjX3N0b3AoZGV2KTsKIAotCS8qIGRpYWJsZSBJUlEgaGFuZGxlciAqLworCS8qIGRpc2FibGUgSVJRIGhhbmRsZXIgKi8KIAlpZiAoZGV2LT5nb3RfaXJxKQogCQlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CiAJZGV2LT5nb3RfaXJxID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zdG9yYWdlX2NvbW1vbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKaW5kZXggM2I1MTNiYS4uYjAxNTU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3N0b3JhZ2VfY29tbW9uLmMKQEAgLTU0Myw3ICs1NDMsNyBAQAogCXJvID0gY3VybHVuLT5pbml0aWFsbHlfcm87CiAJaWYgKCFybykgewogCQlmaWxwID0gZmlscF9vcGVuKGZpbGVuYW1lLCBPX1JEV1IgfCBPX0xBUkdFRklMRSwgMCk7Ci0JCWlmICgtRVJPRlMgPT0gUFRSX0VSUihmaWxwKSkKKwkJaWYgKFBUUl9FUlIoZmlscCkgPT0gLUVST0ZTIHx8IFBUUl9FUlIoZmlscCkgPT0gLUVBQ0NFUykKIAkJCXJvID0gMTsKIAl9CiAJaWYgKHJvKQpAQCAtNTU4LDEwICs1NTgsNyBAQAogCiAJaWYgKGZpbHAtPmZfcGF0aC5kZW50cnkpCiAJCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpZiAoaW5vZGUgJiYgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgewotCQlpZiAoYmRldl9yZWFkX29ubHkoaW5vZGUtPmlfYmRldikpCi0JCQlybyA9IDE7Ci0JfSBlbHNlIGlmICghaW5vZGUgfHwgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwlpZiAoIWlub2RlIHx8ICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkpIHsKIAkJTElORk8oY3VybHVuLCAiaW52YWxpZCBmaWxlIHR5cGU6ICVzXG4iLCBmaWxlbmFtZSk7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYwppbmRleCAyMDA5MmEyLi4xMmZkMTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jCkBAIC05OCwxMyArOTgsMTMgQEAKIAl1c2ItPmludHJfbmVzdGluZ19jbnQtLTsKIH0KIAotLyogZGlhYmxlIHRoZSB1c2IgaW50ZXJydXB0ICovCisvKiBkaXNhYmxlIHRoZSB1c2IgaW50ZXJydXB0ICovCiB2b2lkIGZoY2lfdXNiX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBmaGNpX3VzYiAqdXNiKQogewogCXN0cnVjdCBmaGNpX2hjZCAqZmhjaSA9IHVzYi0+ZmhjaTsKIAogCWlmICh1c2ItPmludHJfbmVzdGluZ19jbnQgPT0gMCkgewotCQkvKiBkaWFibGUgdGhlIHRpbWVyIGludGVycnVwdCAqLworCQkvKiBkaXNhYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KIAkJZGlzYWJsZV9pcnFfbm9zeW5jKGZoY2ktPnRpbWVyLT5pcnEpOwogCiAJCS8qIGRpc2FibGUgdGhlIHVzYiBpbnRlcnJ1cHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS10ZHMuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS10ZHMuYwppbmRleCA3YmU1NDhjLi4zOGZlMDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktdGRzLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9maGNpLXRkcy5jCkBAIC0yNzEsOCArMjcxLDggQEAKIAogLyoKICAqIENvbGxlY3QgdGhlIHN1Ym1pdHRlZCBmcmFtZXMgYW5kIGluZm9ybSB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlbQotICogSXQgaXMgYWxzbyBwcmVwZWFyaW5nIHRoZSBURHMgZm9yIG5ldyBmcmFtZXMuIElmIHRoZSBUeCBpbnRlcnJ1cHRzCi0gKiBhcmUgZGlhYmxlZCwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoYXQgcm91dGluZSB0byBnZXQKKyAqIEl0IGlzIGFsc28gcHJlcGFyaW5nIHRoZSBURHMgZm9yIG5ldyBmcmFtZXMuIElmIHRoZSBUeCBpbnRlcnJ1cHRzCisgKiBhcmUgZGlzYWJsZWQsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGF0IHJvdXRpbmUgdG8gZ2V0CiAgKiBjb25maXJtYXRpb24gYWJvdXQgdGhlIHN1Ym1pdHRlZCBmcmFtZXMuIE90aGVyd2lzZSwgdGhlIHJvdXRpbmUgaXMKICAqIGNhbGxlZCBmcm9tZSB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBkdXJpbmcgdGhlIFR4IGludGVycnVwdC4KICAqIEluIHRoYXQgY2FzZSB0aGUgYXBwbGljYXRpb24gaXMgaW5mb3JtZWQgYnkgY2FsbGluZyB0aGUgYXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaW14MjEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lteDIxLWhjZC5jCmluZGV4IGU0OWI3NWEuLmY5MGQwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaW14MjEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pbXgyMS1oY2QuYwpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbXgyMS0+bG9jaywgZmxhZ3MpOwogCi0JLyogUmVzZXQgdGhlIEhvc3QgY29udHJvbGVyIG1vZHVsZXMgKi8KKwkvKiBSZXNldCB0aGUgSG9zdCBjb250cm9sbGVyIG1vZHVsZXMgKi8KIAl3cml0ZWwoVVNCT1RHX1JTVF9SU1RDVFJMIHwgVVNCT1RHX1JTVF9SU1RSSCB8CiAJCVVTQk9UR19SU1RfUlNUSFNJRSB8IFVTQk9UR19SU1RfUlNUSEMsCiAJCWlteDIxLT5yZWdzICsgVVNCT1RHX1JTVF9DVFJMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLWhjZC5jCmluZGV4IDMyMTQ5YmUuLmUwY2IxMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYwpAQCAtMzA5NCw3ICszMDk0LDcgQEAKIAogCS8qIFNvbWUgYm9hcmRzIChtb3N0bHkgVklBPykgcmVwb3J0IGJvZ3VzIG92ZXJjdXJyZW50IGluZGljYXRpb25zLAogCSAqIGNhdXNpbmcgbWFzc2l2ZSBsb2cgc3BhbSB1bmxlc3Mgd2UgY29tcGxldGVseSBpZ25vcmUgdGhlbS4gIEl0Ci0JICogbWF5IGJlIHJlbGV2YW50IHRoYXQgVklBIFZUODIzNSBjb250cm9sZXJzLCB3aGVyZSBQT1JUX1BPV0VSIGlzCisJICogbWF5IGJlIHJlbGV2YW50IHRoYXQgVklBIFZUODIzNSBjb250cm9sbGVycywgd2hlcmUgUE9SVF9QT1dFUiBpcwogCSAqIGFsd2F5cyBzZXQsIHNlZW0gdG8gY2xlYXIgUE9SVF9PQ0MgYW5kIFBPUlRfQ1NDIHdoZW4gd3JpdGluZyB0bwogCSAqIFBPUlRfUE9XRVI7IHRoYXQncyBzdXJwcmlzaW5nLCBidXQgbWF5YmUgd2l0aGluLXNwZWMuCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jIGIvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYwppbmRleCA0NGY4YjkyMi4uYTZhZmQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCkBAIC03MTcsNyArNzE3LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCmluZGV4IGM5MDc4ZTQuLmU1NzNlNDcwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCkBAIC03NjksNyArNzY5LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvd2FycmlvciksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCmluZGV4IGVkZmZlZjYuLmVlZmI4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogCWludCBpOwogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbnRpYWxpemUgaXQgKi8KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jCmluZGV4IDllODYzOWQuLmIwMTc2ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggOWIxNjJkZi4uZWQ1OGM2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTY4NCw3ICsxNjg0LDcgQEAKIAlzdHJ1Y3QgbXVzYl9od19lcAkqaHdfZXA7CiAJdW5zaWduZWQJCWNvdW50ID0gMDsKIAotCS8qIGludGlhbGl6ZSBlbmRwb2ludCBsaXN0IGp1c3Qgb25jZSAqLworCS8qIGluaXRpYWxpemUgZW5kcG9pbnQgbGlzdCBqdXN0IG9uY2UgKi8KIAlJTklUX0xJU1RfSEVBRCgmKG11c2ItPmcuZXBfbGlzdCkpOwogCiAJZm9yIChlcG51bSA9IDAsIGh3X2VwID0gbXVzYi0+ZW5kcG9pbnRzOwpAQCAtMTc2NSw3ICsxNzY1LDcgQEAKICAqCiAgKiAtRUlOVkFMIHNvbWV0aGluZyB3ZW50IHdyb25nIChub3QgZHJpdmVyKQogICogLUVCVVNZIGFub3RoZXIgZ2FkZ2V0IGlzIGFscmVhZHkgdXNpbmcgdGhlIGNvbnRyb2xsZXIKLSAqIC1FTk9NRU0gbm8gbWVtZW9yeSB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24KKyAqIC1FTk9NRU0gbm8gbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgogICoKICAqIEBwYXJhbSBkcml2ZXIgdGhlIGdhZGdldCBkcml2ZXIKICAqIEBwYXJhbSBiaW5kIHRoZSBkcml2ZXIncyBiaW5kIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggY2RmYjE4Ni4uNzQ4Nzc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNjE1LDcgKzYxNSw2IEBACiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDQsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDUsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDYsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCi0JeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDcsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDgsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMDksIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhaVEVfVkVORE9SX0lELCAweDAwMGEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtcnBpcGUuYwppbmRleCBjN2IxZDgxLi44Y2I5ZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1ycGlwZS5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3dhLXJwaXBlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICAqCiAgKiAgVVNCIFN0YWNrIHBvcnQgbnVtYmVyICAgIDQgKDEgYmFzZWQpCiAgKiAgV1VTQiBjb2RlIHBvcnQgaW5kZXggICAgIDMgKDAgYmFzZWQpCi0gKiAgVVNCIEFkZHJlc3NzICAgICAgICAgICAgIDUgKDIgYmFzZWQgLS0gMCBpcyBmb3IgZGVmYXVsdCwgMSBmb3Igcm9vdCBodWIpCisgKiAgVVNCIEFkZHJlc3MgICAgICAgICAgICAgNSAoMiBiYXNlZCAtLSAwIGlzIGZvciBkZWZhdWx0LCAxIGZvciByb290IGh1YikKICAqCiAgKiAgTm93LCBiZWNhdXNlIHdlIGRvbid0IHVzZSB0aGUgY29uY2VwdCBhcyBkZWZhdWx0IGFkZHJlc3MgZXhhY3RseQogICogIGxpa2UgdGhlICh3aXJlZCkgVVNCIGNvZGUgZG9lcywgd2UgbmVlZCB0byBraW5kIG9mIHNraXAgaXQuIFNvIHdlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL0tjb25maWcKaW5kZXggNTVkYzZmYi4uZDkxNmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtMTEsNiArMTEsMTMgQEAKIGNvbmZpZyBIQVZFX0ZCX0lNWAogCWJvb2wKIAorY29uZmlnIFNIX01JUElfRFNJCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIChTVVBFUkggfHwgQVJDSF9TSE1PQklMRSkgJiYgSEFWRV9DTEsKKworY29uZmlnIFNIX0xDRF9NSVBJX0RTSQorCWJvb2wKKwogc291cmNlICJkcml2ZXJzL2NoYXIvYWdwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9ncHUvdmdhL0tjb25maWciCkBAIC00MTQsNyArNDIxLDcgQEAKIAkgIFkgaGVyZS4KIAogY29uZmlnIEZCX0lNWAotCXRyaXN0YXRlICJNb3Rvcm9sYSBpLk1YIExDRCBzdXBwb3J0IgorCXRyaXN0YXRlICJGcmVlc2NhbGUgaS5NWCBMQ0Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZCICYmIChIQVZFX0ZCX0lNWCB8fCBBUkNIX01YMSB8fCBBUkNIX01YMikKIAlzZWxlY3QgRkJfQ0ZCX0ZJTExSRUNUCiAJc2VsZWN0IEZCX0NGQl9DT1BZQVJFQQpAQCAtMTI3Myw3ICsxMjgwLDcgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYXRyb3hmYi4KIAogCSAgWW91IGNhbiBwYXNzIHNldmVyYWwgcGFyYW1ldGVycyB0byB0aGUgZHJpdmVyIGF0IGJvb3QgdGltZSBvciBhdAotCSAgbW9kdWxlIGxvYWQgdGltZS4gVGhlIHBhcmFtZXRlcnMgbG9vayBsaWtlICJ2aWRlbz1tYXRyb3g6WFhYIiwgYW5kCisJICBtb2R1bGUgbG9hZCB0aW1lLiBUaGUgcGFyYW1ldGVycyBsb29rIGxpa2UgInZpZGVvPW1hdHJveGZiOlhYWCIsIGFuZAogCSAgYXJlIGRlc2NyaWJlZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZiL21hdHJveGZiLnR4dD4uCiAKIGNvbmZpZyBGQl9NQVRST1hfTUlMTEVOSVVNCkBAIC0xOTkwLDEzICsxOTk3LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFNIX01JUElfRFNJCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIChTVVBFUkggfHwgQVJDSF9TSE1PQklMRSkgJiYgSEFWRV9DTEsKLQotY29uZmlnIFNIX0xDRF9NSVBJX0RTSQotCWJvb2wKLQogY29uZmlnIEZCX1NIX01PQklMRV9MQ0RDCiAJdHJpc3RhdGUgIlN1cGVySCBNb2JpbGUgTENEQyBmcmFtZWJ1ZmZlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gRkIgJiYgKFNVUEVSSCB8fCBBUkNIX1NITU9CSUxFKSAmJiBIQVZFX0NMSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jIGIvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCmluZGV4IDhkY2UyNTEuLmJhYzE2MzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdG1lbF9sY2RmYi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlyZXR1cm4gbGNkY19yZWFkbChzaW5mbywgQVRNRUxfTENEQ19DT05UUkFTVF9WQUwpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgYXRtZWxfbGNkY19ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgYXRtZWxfbGNkY19ibF9vcHMgPSB7CiAJLnVwZGF0ZV9zdGF0dXMgPSBhdG1lbF9ibF91cGRhdGVfc3RhdHVzLAogCS5nZXRfYnJpZ2h0bmVzcyA9IGF0bWVsX2JsX2dldF9icmlnaHRuZXNzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IDM0YTA4NTEuLmRkOWRlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtMTc4Niw3ICsxNzg2LDcgQEAKIAlyZXR1cm4gYmQtPnByb3BzLmJyaWdodG5lc3M7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhdHkxMjhfYmxfZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhdHkxMjhfYmxfZGF0YSA9IHsKIAkuZ2V0X2JyaWdodG5lc3MJPSBhdHkxMjhfYmxfZ2V0X2JyaWdodG5lc3MsCiAJLnVwZGF0ZV9zdGF0dXMJPSBhdHkxMjhfYmxfdXBkYXRlX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKaW5kZXggNWEzY2UzYS4uNzY3YWI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwpAQCAtMjIyMSw3ICsyMjIxLDcgQEAKIAlyZXR1cm4gYmQtPnByb3BzLmJyaWdodG5lc3M7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhdHlfYmxfZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBhdHlfYmxfZGF0YSA9IHsKIAkuZ2V0X2JyaWdodG5lc3MgPSBhdHlfYmxfZ2V0X2JyaWdodG5lc3MsCiAJLnVwZGF0ZV9zdGF0dXMJPSBhdHlfYmxfdXBkYXRlX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFja2xpZ2h0LmMKaW5kZXggMjU2OTY2ZS4uOWI4MTFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2JhY2tsaWdodC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYWNrbGlnaHQuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJcmV0dXJuIGJkLT5wcm9wcy5icmlnaHRuZXNzOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgcmFkZW9uX2JsX2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgcmFkZW9uX2JsX2RhdGEgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gcmFkZW9uX2JsX2dldF9icmlnaHRuZXNzLAogCS51cGRhdGVfc3RhdHVzCT0gcmFkZW9uX2JsX3VwZGF0ZV9zdGF0dXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvODhwbTg2MHhfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMKaW5kZXggMzhmZmMzZi4uYzc4OWM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvODhwbTg2MHhfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC84OHBtODYweF9ibC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHBtODYweF9iYWNrbGlnaHRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHBtODYweF9iYWNrbGlnaHRfb3BzID0gewogCS5vcHRpb25zCT0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAogCS51cGRhdGVfc3RhdHVzCT0gcG04NjB4X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzLAogCS5nZXRfYnJpZ2h0bmVzcwk9IHBtODYweF9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sNGYwMDI0MnQwMy5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYwppbmRleCBjNjc4MDFlLi45OGFkM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sNGYwMDI0MnQwMy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2w0ZjAwMjQydDAzLmMKQEAgLTI1LDcgKzI1LDcgQEAKIHN0cnVjdCBsNGYwMDI0MnQwM19wcml2IHsKIAlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwogCXN0cnVjdCBsY2RfZGV2aWNlCSpsZDsKLQlpbnQgbGNkX29uOjE7CisJaW50IGxjZF9zdGF0ZTsKIAlzdHJ1Y3QgcmVndWxhdG9yICppb19yZWc7CiAJc3RydWN0IHJlZ3VsYXRvciAqY29yZV9yZWc7CiB9OwpAQCAtNjIsMTEgKzYyLDM2IEBACiAJCXJlZ3VsYXRvcl9lbmFibGUocHJpdi0+Y29yZV9yZWcpOwogCX0KIAorCWw0ZjAwMjQydDAzX3Jlc2V0KHBkYXRhLT5yZXNldF9ncGlvKTsKKwogCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5kYXRhX2VuYWJsZV9ncGlvLCAxKTsKIAltc2xlZXAoNjApOwogCXNwaV93cml0ZShzcGksIChjb25zdCB1OCAqKWNtZCwgQVJSQVlfU0laRShjbWQpICogc2l6ZW9mKHUxNikpOwogfQogCitzdGF0aWMgdm9pZCBsNGYwMDI0MnQwM19sY2RfcG93ZXJkb3duKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGw0ZjAwMjQydDAzX3BkYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGw0ZjAwMjQydDAzX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiUG93ZXJpbmcgZG93biBMQ0RcbiIpOworCisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8sIDApOworCisJaWYgKHByaXYtPmlvX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+aW9fcmVnKTsKKworCWlmIChwcml2LT5jb3JlX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUocHJpdi0+Y29yZV9yZWcpOworfQorCitzdGF0aWMgaW50IGw0ZjAwMjQydDAzX2xjZF9wb3dlcl9nZXQoc3RydWN0IGxjZF9kZXZpY2UgKmxkKQoreworCXN0cnVjdCBsNGYwMDI0MnQwM19wcml2ICpwcml2ID0gbGNkX2dldF9kYXRhKGxkKTsKKworCXJldHVybiBwcml2LT5sY2Rfc3RhdGU7Cit9CisKIHN0YXRpYyBpbnQgbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX3NldChzdHJ1Y3QgbGNkX2RldmljZSAqbGQsIGludCBwb3dlcikKIHsKIAlzdHJ1Y3QgbDRmMDAyNDJ0MDNfcHJpdiAqcHJpdiA9IGxjZF9nZXRfZGF0YShsZCk7CkBAIC03OSwzNSArMTA0LDU0IEBACiAJY29uc3QgdTE2IGRpc29mZiA9IDB4Mjg7CiAKIAlpZiAocG93ZXIgPD0gRkJfQkxBTktfTk9STUFMKSB7Ci0JCWlmIChwcml2LT5sY2Rfb24pCi0JCQlyZXR1cm4gMDsKKwkJaWYgKHByaXYtPmxjZF9zdGF0ZSA8PSBGQl9CTEFOS19OT1JNQUwpIHsKKwkJCS8qIERvIG5vdGhpbmcsIHRoZSBMQ0QgaXMgcnVubmluZyAqLworCQl9IGVsc2UgaWYgKHByaXYtPmxjZF9zdGF0ZSA8IEZCX0JMQU5LX1BPV0VSRE9XTikgeworCQkJZGV2X2RiZygmc3BpLT5kZXYsICJSZXN1bWluZyBMQ0RcbiIpOwogCi0JCWRldl9kYmcoJnNwaS0+ZGV2LCAidHVybmluZyBvbiBMQ0RcbiIpOworCQkJc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJnNscG91dCwgc2l6ZW9mKHUxNikpOworCQkJbXNsZWVwKDYwKTsKKwkJCXNwaV93cml0ZShzcGksIChjb25zdCB1OCAqKSZkaXNvbiwgc2l6ZW9mKHUxNikpOworCQl9IGVsc2UgeworCQkJLyogcHJpdi0+bGNkX3N0YXRlID09IEZCX0JMQU5LX1BPV0VSRE9XTiAqLworCQkJbDRmMDAyNDJ0MDNfbGNkX2luaXQoc3BpKTsKKwkJCXByaXYtPmxjZF9zdGF0ZSA9IEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ7CisJCQlsNGYwMDI0MnQwM19sY2RfcG93ZXJfc2V0KHByaXYtPmxkLCBwb3dlcik7CisJCX0KKwl9IGVsc2UgaWYgKHBvd2VyIDwgRkJfQkxBTktfUE9XRVJET1dOKSB7CisJCWlmIChwcml2LT5sY2Rfc3RhdGUgPD0gRkJfQkxBTktfTk9STUFMKSB7CisJCQkvKiBTZW5kIHRoZSBkaXNwbGF5IGluIHN0YW5kYnkgKi8KKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiU3RhbmRieSB0aGUgTENEXG4iKTsKIAotCQlzcGlfd3JpdGUoc3BpLCAoY29uc3QgdTggKikmc2xwb3V0LCBzaXplb2YodTE2KSk7Ci0JCW1zbGVlcCg2MCk7Ci0JCXNwaV93cml0ZShzcGksIChjb25zdCB1OCAqKSZkaXNvbiwgc2l6ZW9mKHUxNikpOwotCi0JCXByaXYtPmxjZF9vbiA9IDE7CisJCQlzcGlfd3JpdGUoc3BpLCAoY29uc3QgdTggKikmZGlzb2ZmLCBzaXplb2YodTE2KSk7CisJCQltc2xlZXAoNjApOworCQkJc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJnNscGluLCBzaXplb2YodTE2KSk7CisJCX0gZWxzZSBpZiAocHJpdi0+bGNkX3N0YXRlIDwgRkJfQkxBTktfUE9XRVJET1dOKSB7CisJCQkvKiBEbyBub3RoaW5nLCB0aGUgTENEIGlzIGFscmVhZHkgaW4gc3RhbmRieSAqLworCQl9IGVsc2UgeworCQkJLyogcHJpdi0+bGNkX3N0YXRlID09IEZCX0JMQU5LX1BPV0VSRE9XTiAqLworCQkJbDRmMDAyNDJ0MDNfbGNkX2luaXQoc3BpKTsKKwkJCXByaXYtPmxjZF9zdGF0ZSA9IEZCX0JMQU5LX1VOQkxBTks7CisJCQlsNGYwMDI0MnQwM19sY2RfcG93ZXJfc2V0KGxkLCBwb3dlcik7CisJCX0KIAl9IGVsc2UgewotCQlpZiAoIXByaXYtPmxjZF9vbikKLQkJCXJldHVybiAwOwotCi0JCWRldl9kYmcoJnNwaS0+ZGV2LCAidHVybmluZyBvZmYgTENEXG4iKTsKLQotCQlzcGlfd3JpdGUoc3BpLCAoY29uc3QgdTggKikmZGlzb2ZmLCBzaXplb2YodTE2KSk7Ci0JCW1zbGVlcCg2MCk7Ci0JCXNwaV93cml0ZShzcGksIChjb25zdCB1OCAqKSZzbHBpbiwgc2l6ZW9mKHUxNikpOwotCi0JCXByaXYtPmxjZF9vbiA9IDA7CisJCS8qIHBvd2VyID09IEZCX0JMQU5LX1BPV0VSRE9XTiAqLworCQlpZiAocHJpdi0+bGNkX3N0YXRlICE9IEZCX0JMQU5LX1BPV0VSRE9XTikgeworCQkJLyogQ2xlYXIgdGhlIHNjcmVlbiBiZWZvcmUgc2h1dHRpbmcgZG93biAqLworCQkJc3BpX3dyaXRlKHNwaSwgKGNvbnN0IHU4ICopJmRpc29mZiwgc2l6ZW9mKHUxNikpOworCQkJbXNsZWVwKDYwKTsKKwkJCWw0ZjAwMjQydDAzX2xjZF9wb3dlcmRvd24oc3BpKTsKKwkJfQogCX0KIAorCXByaXYtPmxjZF9zdGF0ZSA9IHBvd2VyOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGNkX29wcyBsNGZfb3BzID0gewogCS5zZXRfcG93ZXIJPSBsNGYwMDI0MnQwM19sY2RfcG93ZXJfc2V0LAotCS5nZXRfcG93ZXIJPSBOVUxMLAorCS5nZXRfcG93ZXIJPSBsNGYwMDI0MnQwM19sY2RfcG93ZXJfZ2V0LAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgbDRmMDAyNDJ0MDNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTE4NSw5ICsyMjksOSBAQAogCX0KIAogCS8qIEluaXQgdGhlIExDRCAqLwotCWw0ZjAwMjQydDAzX3Jlc2V0KHBkYXRhLT5yZXNldF9ncGlvKTsKIAlsNGYwMDI0MnQwM19sY2RfaW5pdChzcGkpOwotCWw0ZjAwMjQydDAzX2xjZF9wb3dlcl9zZXQocHJpdi0+bGQsIDEpOworCXByaXYtPmxjZF9zdGF0ZSA9IEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ7CisJbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX3NldChwcml2LT5sZCwgRkJfQkxBTktfVU5CTEFOSyk7CiAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICJFcHNvbiBsNGYwMDI0MnQwMyBsY2QgcHJvYmVkLlxuIik7CiAKQEAgLTIxNCw5ICsyNTgsMTEgQEAKIAlzdHJ1Y3QgbDRmMDAyNDJ0MDNfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwogCXN0cnVjdCBsNGYwMDI0MnQwM19wZGF0YSAqcGRhdGEgPSBwcml2LT5zcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX3NldChwcml2LT5sZCwgMCk7CisJbDRmMDAyNDJ0MDNfbGNkX3Bvd2VyX3NldChwcml2LT5sZCwgRkJfQkxBTktfUE9XRVJET1dOKTsKIAlsY2RfZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+bGQpOwogCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisKIAlncGlvX2ZyZWUocGRhdGEtPmRhdGFfZW5hYmxlX2dwaW8pOwogCWdwaW9fZnJlZShwZGF0YS0+cmVzZXRfZ3Bpbyk7CiAKQEAgLTIzMCw2ICsyNzYsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbDRmMDAyNDJ0MDNfc2h1dGRvd24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbDRmMDAyNDJ0MDNfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOworCisJaWYgKHByaXYpCisJCWw0ZjAwMjQydDAzX2xjZF9wb3dlcl9zZXQocHJpdi0+bGQsIEZCX0JMQU5LX1BPV0VSRE9XTik7CisKK30KKwogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGw0ZjAwMjQydDAzX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsNGYwMDI0MnQwMyIsCkBAIC0yMzcsNiArMjkyLDcgQEAKIAl9LAogCS5wcm9iZQkJPSBsNGYwMDI0MnQwM19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGw0ZjAwMjQydDAzX3JlbW92ZSksCisJLnNodXRkb3duCT0gbDRmMDAyNDJ0MDNfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBsNGYwMDI0MnQwM19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMKaW5kZXggYjJiMmM3Yi4uMjA5YWNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWF4ODkyNV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L21heDg5MjVfYmwuYwpAQCAtOTIsNyArOTIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBtYXg4OTI1X2JhY2tsaWdodF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbWF4ODkyNV9iYWNrbGlnaHRfb3BzID0gewogCS5vcHRpb25zCT0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAogCS51cGRhdGVfc3RhdHVzCT0gbWF4ODkyNV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cywKIAkuZ2V0X2JyaWdodG5lc3MJPSBtYXg4OTI1X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwppbmRleCA5MTU0NDhlLi5jOTc0OTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCkBAIC0zNzUsNyArMzc1LDggQEAKIAl1MTYgc2F2ZWQxLCBzYXZlZDI7CiAJdm9sYXRpbGUgdTE2ICpwOwogCi0JaWYgKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgPT0gVklERU9fVFlQRV9WTEZCKSB7CisJaWYgKHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgPT0gVklERU9fVFlQRV9WTEZCIHx8CisJICAgIHNjcmVlbl9pbmZvLm9yaWdfdmlkZW9faXNWR0EgPT0gVklERU9fVFlQRV9FRkkpIHsKIAkgICAgICBub192Z2E6CiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAkJY29uc3dpdGNocCA9ICZkdW1teV9jb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2lteGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2lteGZiLmMKaW5kZXggMWFiMmMyNS4uNjliZDRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbXhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaW14ZmIuYwpAQCAtOTc0LDYgKzk3NCw2IEBACiBtb2R1bGVfaW5pdChpbXhmYl9pbml0KTsKIG1vZHVsZV9leGl0KGlteGZiX2NsZWFudXApOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1vdG9yb2xhIGkuTVggZnJhbWVidWZmZXIgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBpLk1YIGZyYW1lYnVmZmVyIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiU2FzY2hhIEhhdWVyLCBQZW5ndXRyb25peCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCmluZGV4IDA1MmRkOWYuLmEwODJkZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKQEAgLTEyNDcsNDYgKzEyNDcsNDYgQEAKIH07CiAKIC8qIGluaXRpYWxpemVkIGJ5IHNldHVwLCBzZWUgZXhwbGFuYXRpb24gYXQgZW5kIG9mIGZpbGUgKHNlYXJjaCBmb3IgTU9EVUxFX1BBUk1fREVTQykgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtOwkJLyogIm1hdHJveDptZW06eHh4eHhNIiAqLworc3RhdGljIHVuc2lnbmVkIGludCBtZW07CQkvKiAibWF0cm94ZmI6bWVtOnh4eHh4TSIgKi8KIHN0YXRpYyBpbnQgb3B0aW9uX3ByZWNpc2Vfd2lkdGggPSAxOwkvKiBjYW5ub3QgYmUgY2hhbmdlZCwgb3B0aW9uX3ByZWNpc2Vfd2lkdGg9PTAgbXVzdCBpbXBseSBub2FjY2VsICovCi1zdGF0aWMgaW50IGludjI0OwkJCS8qICJtYXRyb3g6aW52MjQiICovCi1zdGF0aWMgaW50IGNyb3NzNE1CID0gLTE7CQkvKiAibWF0cm94OmNyb3NzNE1CIiAqLwotc3RhdGljIGludCBkaXNhYmxlZDsJCQkvKiAibWF0cm94OmRpc2FibGVkIiAqLwotc3RhdGljIGludCBub2FjY2VsOwkJCS8qICJtYXRyb3g6bm9hY2NlbCIgKi8KLXN0YXRpYyBpbnQgbm9wYW47CQkJLyogIm1hdHJveDpub3BhbiIgKi8KLXN0YXRpYyBpbnQgbm9fcGNpX3JldHJ5OwkJLyogIm1hdHJveDpub3BjaXJldHJ5IiAqLwotc3RhdGljIGludCBub3ZnYTsJCQkvKiAibWF0cm94Om5vdmdhIiAqLwotc3RhdGljIGludCBub2Jpb3M7CQkJLyogIm1hdHJveDpub2Jpb3MiICovCi1zdGF0aWMgaW50IG5vaW5pdCA9IDE7CQkJLyogIm1hdHJveDppbml0IiAqLwotc3RhdGljIGludCBpbnZlcnNlOwkJCS8qICJtYXRyb3g6aW52ZXJzZSIgKi8KLXN0YXRpYyBpbnQgc2dyYW07CQkJLyogIm1hdHJveDpzZ3JhbSIgKi8KK3N0YXRpYyBpbnQgaW52MjQ7CQkJLyogIm1hdHJveGZiOmludjI0IiAqLworc3RhdGljIGludCBjcm9zczRNQiA9IC0xOwkJLyogIm1hdHJveGZiOmNyb3NzNE1CIiAqLworc3RhdGljIGludCBkaXNhYmxlZDsJCQkvKiAibWF0cm94ZmI6ZGlzYWJsZWQiICovCitzdGF0aWMgaW50IG5vYWNjZWw7CQkJLyogIm1hdHJveGZiOm5vYWNjZWwiICovCitzdGF0aWMgaW50IG5vcGFuOwkJCS8qICJtYXRyb3hmYjpub3BhbiIgKi8KK3N0YXRpYyBpbnQgbm9fcGNpX3JldHJ5OwkJLyogIm1hdHJveGZiOm5vcGNpcmV0cnkiICovCitzdGF0aWMgaW50IG5vdmdhOwkJCS8qICJtYXRyb3hmYjpub3ZnYSIgKi8KK3N0YXRpYyBpbnQgbm9iaW9zOwkJCS8qICJtYXRyb3hmYjpub2Jpb3MiICovCitzdGF0aWMgaW50IG5vaW5pdCA9IDE7CQkJLyogIm1hdHJveGZiOmluaXQiICovCitzdGF0aWMgaW50IGludmVyc2U7CQkJLyogIm1hdHJveGZiOmludmVyc2UiICovCitzdGF0aWMgaW50IHNncmFtOwkJCS8qICJtYXRyb3hmYjpzZ3JhbSIgKi8KICNpZmRlZiBDT05GSUdfTVRSUgotc3RhdGljIGludCBtdHJyID0gMTsJCQkvKiAibWF0cm94Om5vbXRyciIgKi8KK3N0YXRpYyBpbnQgbXRyciA9IDE7CQkJLyogIm1hdHJveGZiOm5vbXRyciIgKi8KICNlbmRpZgotc3RhdGljIGludCBncmF5c2NhbGU7CQkJLyogIm1hdHJveDpncmF5c2NhbGUiICovCi1zdGF0aWMgaW50IGRldiA9IC0xOwkJCS8qICJtYXRyb3g6ZGV2Onh4eHh4IiAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2ZXNhID0gfjA7CQkvKiAibWF0cm94OnZlc2E6eHh4eHgiICovCi1zdGF0aWMgaW50IGRlcHRoID0gLTE7CQkJLyogIm1hdHJveDpkZXB0aDp4eHh4eCIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgeHJlczsJCS8qICJtYXRyb3g6eHJlczp4eHh4eCIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgeXJlczsJCS8qICJtYXRyb3g6eXJlczp4eHh4eCIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdXBwZXIgPSB+MDsJCS8qICJtYXRyb3g6dXBwZXI6eHh4eHgiICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGxvd2VyID0gfjA7CQkvKiAibWF0cm94Omxvd2VyOnh4eHh4IiAqLwotc3RhdGljIHVuc2lnbmVkIGludCB2c2xlbjsJCS8qICJtYXRyb3g6dnNsZW46eHh4eHgiICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGxlZnQgPSB+MDsJCS8qICJtYXRyb3g6bGVmdDp4eHh4eCIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmlnaHQgPSB+MDsJCS8qICJtYXRyb3g6cmlnaHQ6eHh4eHgiICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGhzbGVuOwkJLyogIm1hdHJveDpoc2xlbjp4eHh4eCIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGl4Y2xvY2s7CQkvKiAibWF0cm94OnBpeGNsb2NrOnh4eHh4IiAqLwotc3RhdGljIGludCBzeW5jID0gLTE7CQkJLyogIm1hdHJveDpzeW5jOnh4eHh4IiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBmdjsJCQkvKiAibWF0cm94OmZ2Onh4eHh4IiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBmaDsJCQkvKiAibWF0cm94OmZoOnh4eHh4ayIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4Y2xrOwkJLyogIm1hdHJveDptYXhjbGs6eHh4eE0iICovCi1zdGF0aWMgaW50IGRmcDsJCQkJLyogIm1hdHJveDpkZnAgKi8KLXN0YXRpYyBpbnQgZGZwX3R5cGUgPSAtMTsJCS8qICJtYXRyb3g6ZGZwOnh4eCAqLwotc3RhdGljIGludCBtZW10eXBlID0gLTE7CQkvKiAibWF0cm94Om1lbXR5cGU6eHh4IiAqLwotc3RhdGljIGNoYXIgb3V0cHV0c1s4XTsJCQkvKiAibWF0cm94Om91dHB1dHM6eHh4IiAqLworc3RhdGljIGludCBncmF5c2NhbGU7CQkJLyogIm1hdHJveGZiOmdyYXlzY2FsZSIgKi8KK3N0YXRpYyBpbnQgZGV2ID0gLTE7CQkJLyogIm1hdHJveGZiOmRldjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmVzYSA9IH4wOwkJLyogIm1hdHJveGZiOnZlc2E6eHh4eHgiICovCitzdGF0aWMgaW50IGRlcHRoID0gLTE7CQkJLyogIm1hdHJveGZiOmRlcHRoOnh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCB4cmVzOwkJLyogIm1hdHJveGZiOnhyZXM6eHh4eHgiICovCitzdGF0aWMgdW5zaWduZWQgaW50IHlyZXM7CQkvKiAibWF0cm94ZmI6eXJlczp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXBwZXIgPSB+MDsJCS8qICJtYXRyb3hmYjp1cHBlcjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG93ZXIgPSB+MDsJCS8qICJtYXRyb3hmYjpsb3dlcjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnNsZW47CQkvKiAibWF0cm94ZmI6dnNsZW46eHh4eHgiICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxlZnQgPSB+MDsJCS8qICJtYXRyb3hmYjpsZWZ0Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCByaWdodCA9IH4wOwkJLyogIm1hdHJveGZiOnJpZ2h0Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCBoc2xlbjsJCS8qICJtYXRyb3hmYjpoc2xlbjp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGl4Y2xvY2s7CQkvKiAibWF0cm94ZmI6cGl4Y2xvY2s6eHh4eHgiICovCitzdGF0aWMgaW50IHN5bmMgPSAtMTsJCQkvKiAibWF0cm94ZmI6c3luYzp4eHh4eCIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnY7CQkJLyogIm1hdHJveGZiOmZ2Onh4eHh4IiAqLworc3RhdGljIHVuc2lnbmVkIGludCBmaDsJCQkvKiAibWF0cm94ZmI6Zmg6eHh4eHhrIiAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXhjbGs7CQkvKiAibWF0cm94ZmI6bWF4Y2xrOnh4eHhNIiAqLworc3RhdGljIGludCBkZnA7CQkJCS8qICJtYXRyb3hmYjpkZnAgKi8KK3N0YXRpYyBpbnQgZGZwX3R5cGUgPSAtMTsJCS8qICJtYXRyb3hmYjpkZnA6eHh4ICovCitzdGF0aWMgaW50IG1lbXR5cGUgPSAtMTsJCS8qICJtYXRyb3hmYjptZW10eXBlOnh4eCIgKi8KK3N0YXRpYyBjaGFyIG91dHB1dHNbOF07CQkJLyogIm1hdHJveGZiOm91dHB1dHM6eHh4IiAqLwogCiAjaWZuZGVmIE1PRFVMRQotc3RhdGljIGNoYXIgdmlkZW9tb2RlWzY0XTsJCS8qICJtYXRyb3g6bW9kZTp4eHh4eCIgb3IgIm1hdHJveDp4eHh4eCIgKi8KK3N0YXRpYyBjaGFyIHZpZGVvbW9kZVs2NF07CQkvKiAibWF0cm94ZmI6bW9kZTp4eHh4eCIgb3IgIm1hdHJveGZiOnh4eHh4IiAqLwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgbWF0cm94ZmJfZ2V0bWVtb3J5KHN0cnVjdCBtYXRyb3hfZmJfaW5mbyAqbWluZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jIGIvZHJpdmVycy92aWRlby9tb2RlZGIuYwppbmRleCBkMmJiMzY1Li40OGMzZWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21vZGVkYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbW9kZWRiLmMKQEAgLTMyLDMwMCArMzIsMzIwIEBACiBjb25zdCBjaGFyICpmYl9tb2RlX29wdGlvbjsKIEVYUE9SVF9TWU1CT0xfR1BMKGZiX21vZGVfb3B0aW9uKTsKIAotICAgIC8qCi0gICAgICogIFN0YW5kYXJkIHZpZGVvIG1vZGUgZGVmaW5pdGlvbnMgKHRha2VuIGZyb20gWEZyZWU4NikKLSAgICAgKi8KKy8qCisgKiAgU3RhbmRhcmQgdmlkZW8gbW9kZSBkZWZpbml0aW9ucyAodGFrZW4gZnJvbSBYRnJlZTg2KQorICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmJfdmlkZW9tb2RlIG1vZGVkYltdID0gewotICAgIHsKKwogCS8qIDY0MHg0MDAgQCA3MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KLQlOVUxMLCA3MCwgNjQwLCA0MDAsIDM5NzIxLCA0MCwgMjQsIDM5LCA5LCA5NiwgMiwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzAsIDY0MCwgNDAwLCAzOTcyMSwgNDAsIDI0LCAzOSwgOSwgOTYsIDIsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDY0MHg0ODAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KLQlOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NzIxLCA0MCwgMjQsIDMyLCAxMSwgOTYsIDIsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjEsIDQwLCAyNCwgMzIsIDExLCA5NiwgMiwJMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogODAweDYwMCBAIDU2IEh6LCAzNS4xNSBrSHogaHN5bmMgKi8KLQlOVUxMLCA1NiwgODAwLCA2MDAsIDI3Nzc3LCAxMjgsIDI0LCAyMiwgMSwgNzIsIDIsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDU2LCA4MDAsIDYwMCwgMjc3NzcsIDEyOCwgMjQsIDIyLCAxLCA3MiwgMiwJMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTAyNHg3NjggQCA4NyBIeiBpbnRlcmxhY2VkLCAzNS41IGtIeiBoc3luYyAqLwotCU5VTEwsIDg3LCAxMDI0LCA3NjgsIDIyMjcxLCA1NiwgMjQsIDMzLCA4LCAxNjAsIDgsCi0JMCwgRkJfVk1PREVfSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDg3LCAxMDI0LCA3NjgsIDIyMjcxLCA1NiwgMjQsIDMzLCA4LCAxNjAsIDgsIDAsCisJCUZCX1ZNT0RFX0lOVEVSTEFDRUQgfSwKKwogCS8qIDY0MHg0MDAgQCA4NSBIeiwgMzcuODYga0h6IGhzeW5jICovCi0JTlVMTCwgODUsIDY0MCwgNDAwLCAzMTc0NiwgOTYsIDMyLCA0MSwgMSwgNjQsIDMsCi0JRkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgODUsIDY0MCwgNDAwLCAzMTc0NiwgOTYsIDMyLCA0MSwgMSwgNjQsIDMsCisJCUZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogNjQweDQ4MCBAIDcyIEh6LCAzNi41IGtIeiBoc3luYyAqLwotCU5VTEwsIDcyLCA2NDAsIDQ4MCwgMzE3NDYsIDE0NCwgNDAsIDMwLCA4LCA0MCwgMywKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzIsIDY0MCwgNDgwLCAzMTc0NiwgMTQ0LCA0MCwgMzAsIDgsIDQwLCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiA2NDB4NDgwIEAgNzUgSHosIDM3LjUwIGtIeiBoc3luYyAqLwotCU5VTEwsIDc1LCA2NDAsIDQ4MCwgMzE3NDYsIDEyMCwgMTYsIDE2LCAxLCA2NCwgMywKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzUsIDY0MCwgNDgwLCAzMTc0NiwgMTIwLCAxNiwgMTYsIDEsIDY0LCAzLAkwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiA4MDB4NjAwIEAgNjAgSHosIDM3Ljgga0h6IGhzeW5jICovCi0JTlVMTCwgNjAsIDgwMCwgNjAwLCAyNTAwMCwgODgsIDQwLCAyMywgMSwgMTI4LCA0LAotCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCA4MDAsIDYwMCwgMjUwMDAsIDg4LCA0MCwgMjMsIDEsIDEyOCwgNCwKKwkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDY0MHg0ODAgQCA4NSBIeiwgNDMuMjcga0h6IGhzeW5jICovCi0JTlVMTCwgODUsIDY0MCwgNDgwLCAyNzc3NywgODAsIDU2LCAyNSwgMSwgNTYsIDMsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDg1LCA2NDAsIDQ4MCwgMjc3NzcsIDgwLCA1NiwgMjUsIDEsIDU2LCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMTUyeDg2NCBAIDg5IEh6IGludGVybGFjZWQsIDQ0IGtIeiBoc3luYyAqLwotCU5VTEwsIDg5LCAxMTUyLCA4NjQsIDE1Mzg0LCA5NiwgMTYsIDExMCwgMSwgMjE2LCAxMCwKLQkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgODksIDExNTIsIDg2NCwgMTUzODQsIDk2LCAxNiwgMTEwLCAxLCAyMTYsIDEwLCAwLAorCQlGQl9WTU9ERV9JTlRFUkxBQ0VEIH0sCiAJLyogODAweDYwMCBAIDcyIEh6LCA0OC4wIGtIeiBoc3luYyAqLwotCU5VTEwsIDcyLCA4MDAsIDYwMCwgMjAwMDAsIDY0LCA1NiwgMjMsIDM3LCAxMjAsIDYsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzIsIDgwMCwgNjAwLCAyMDAwMCwgNjQsIDU2LCAyMywgMzcsIDEyMCwgNiwKKwkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDEwMjR4NzY4IEAgNjAgSHosIDQ4LjQga0h6IGhzeW5jICovCi0JTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODQsIDE2OCwgOCwgMjksIDMsIDE0NCwgNiwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNjAsIDEwMjQsIDc2OCwgMTUzODQsIDE2OCwgOCwgMjksIDMsIDE0NCwgNiwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogNjQweDQ4MCBAIDEwMCBIeiwgNTMuMDEga0h6IGhzeW5jICovCi0JTlVMTCwgMTAwLCA2NDAsIDQ4MCwgMjE4MzQsIDk2LCAzMiwgMzYsIDgsIDk2LCA2LAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCAxMDAsIDY0MCwgNDgwLCAyMTgzNCwgOTYsIDMyLCAzNiwgOCwgOTYsIDYsCTAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDExNTJ4ODY0IEAgNjAgSHosIDUzLjUga0h6IGhzeW5jICovCi0JTlVMTCwgNjAsIDExNTIsIDg2NCwgMTExMjMsIDIwOCwgNjQsIDE2LCA0LCAyNTYsIDgsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCAxMTUyLCA4NjQsIDExMTIzLCAyMDgsIDY0LCAxNiwgNCwgMjU2LCA4LCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiA4MDB4NjAwIEAgODUgSHosIDU1Ljg0IGtIeiBoc3luYyAqLwotCU5VTEwsIDg1LCA4MDAsIDYwMCwgMTY0NjAsIDE2MCwgNjQsIDM2LCAxNiwgNjQsIDUsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDg1LCA4MDAsIDYwMCwgMTY0NjAsIDE2MCwgNjQsIDM2LCAxNiwgNjQsIDUsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDEwMjR4NzY4IEAgNzAgSHosIDU2LjUga0h6IGhzeW5jICovCi0JTlVMTCwgNzAsIDEwMjQsIDc2OCwgMTMzMzMsIDE0NCwgMjQsIDI5LCAzLCAxMzYsIDYsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDcwLCAxMDI0LCA3NjgsIDEzMzMzLCAxNDQsIDI0LCAyOSwgMywgMTM2LCA2LCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMjgweDEwMjQgQCA4NyBIeiBpbnRlcmxhY2VkLCA1MSBrSHogaHN5bmMgKi8KLQlOVUxMLCA4NywgMTI4MCwgMTAyNCwgMTI1MDAsIDU2LCAxNiwgMTI4LCAxLCAyMTYsIDEyLAotCTAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA4NywgMTI4MCwgMTAyNCwgMTI1MDAsIDU2LCAxNiwgMTI4LCAxLCAyMTYsIDEyLAkwLAorCQlGQl9WTU9ERV9JTlRFUkxBQ0VEIH0sCisKIAkvKiA4MDB4NjAwIEAgMTAwIEh6LCA2NC4wMiBrSHogaHN5bmMgKi8KLQlOVUxMLCAxMDAsIDgwMCwgNjAwLCAxNDM1NywgMTYwLCA2NCwgMzAsIDQsIDY0LCA2LAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCAxMDAsIDgwMCwgNjAwLCAxNDM1NywgMTYwLCA2NCwgMzAsIDQsIDY0LCA2LCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMDI0eDc2OCBAIDc2IEh6LCA2Mi41IGtIeiBoc3luYyAqLwotCU5VTEwsIDc2LCAxMDI0LCA3NjgsIDExNzY0LCAyMDgsIDgsIDM2LCAxNiwgMTIwLCAzLAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA3NiwgMTAyNCwgNzY4LCAxMTc2NCwgMjA4LCA4LCAzNiwgMTYsIDEyMCwgMywgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTE1Mng4NjQgQCA3MCBIeiwgNjIuNCBrSHogaHN5bmMgKi8KLQlOVUxMLCA3MCwgMTE1MiwgODY0LCAxMDg2OSwgMTA2LCA1NiwgMjAsIDEsIDE2MCwgMTAsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDcwLCAxMTUyLCA4NjQsIDEwODY5LCAxMDYsIDU2LCAyMCwgMSwgMTYwLCAxMCwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTI4MHgxMDI0IEAgNjEgSHosIDY0LjIga0h6IGhzeW5jICovCi0JTlVMTCwgNjEsIDEyODAsIDEwMjQsIDkwOTAsIDIwMCwgNDgsIDI2LCAxLCAxODQsIDMsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYxLCAxMjgwLCAxMDI0LCA5MDkwLCAyMDAsIDQ4LCAyNiwgMSwgMTg0LCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxNDAweDEwNTAgQCA2MEh6LCA2My45IGtIeiBoc3luYyAqLwotCU5VTEwsIDYwLCAxNDAwLCAxMDUwLCA5MjU5LCAxMzYsIDQwLCAxMywgMSwgMTEyLCAzLAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgICAJCi0gICAgfSwgeworCXsgTlVMTCwgNjAsIDE0MDAsIDEwNTAsIDkyNTksIDEzNiwgNDAsIDEzLCAxLCAxMTIsIDMsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDE0MDB4MTA1MCBAIDc1LDEwNyBIeiwgODIsMzkyIGtIeiAraHN5bmMgK3ZzeW5jKi8KLQlOVUxMLCA3NSwgMTQwMCwgMTA1MCwgNzE5MCwgMTIwLCA1NiwgMjMsIDEwLCAxMTIsIDEzLAotCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDc1LCAxNDAwLCAxMDUwLCA3MTkwLCAxMjAsIDU2LCAyMywgMTAsIDExMiwgMTMsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxNDAweDEwNTAgQCA2MCBIeiwgPyBrSHogK2hzeW5jICt2c3luYyovCi0gICAgICAgIE5VTEwsIDYwLCAxNDAwLCAxMDUwLCA5MjU5LCAxMjgsIDQwLCAxMiwgMCwgMTEyLCAzLAotCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCAxNDAwLCAxMDUwLCA5MjU5LCAxMjgsIDQwLCAxMiwgMCwgMTEyLCAzLAorCQlGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTAyNHg3NjggQCA4NSBIeiwgNzAuMjQga0h6IGhzeW5jICovCi0JTlVMTCwgODUsIDEwMjQsIDc2OCwgMTAxMTEsIDE5MiwgMzIsIDM0LCAxNCwgMTYwLCA2LAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA4NSwgMTAyNCwgNzY4LCAxMDExMSwgMTkyLCAzMiwgMzQsIDE0LCAxNjAsIDYsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDExNTJ4ODY0IEAgNzggSHosIDcwLjgga0h6IGhzeW5jICovCi0JTlVMTCwgNzgsIDExNTIsIDg2NCwgOTA5MCwgMjI4LCA4OCwgMzIsIDAsIDg0LCAxMiwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzgsIDExNTIsIDg2NCwgOTA5MCwgMjI4LCA4OCwgMzIsIDAsIDg0LCAxMiwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTI4MHgxMDI0IEAgNzAgSHosIDc0LjU5IGtIeiBoc3luYyAqLwotCU5VTEwsIDcwLCAxMjgwLCAxMDI0LCA3OTA1LCAyMjQsIDMyLCAyOCwgOCwgMTYwLCA4LAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA3MCwgMTI4MCwgMTAyNCwgNzkwNSwgMjI0LCAzMiwgMjgsIDgsIDE2MCwgOCwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTYwMHgxMjAwIEAgNjBIeiwgNzUuMDAga0h6IGhzeW5jICovCi0JTlVMTCwgNjAsIDE2MDAsIDEyMDAsIDYxNzIsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNjAsIDE2MDAsIDEyMDAsIDYxNzIsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMTUyeDg2NCBAIDg0IEh6LCA3Ni4wIGtIeiBoc3luYyAqLwotCU5VTEwsIDg0LCAxMTUyLCA4NjQsIDc0MDcsIDE4NCwgMzEyLCAzMiwgMCwgMTI4LCAxMiwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgODQsIDExNTIsIDg2NCwgNzQwNywgMTg0LCAzMTIsIDMyLCAwLCAxMjgsIDEyLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMjgweDEwMjQgQCA3NCBIeiwgNzguODUga0h6IGhzeW5jICovCi0JTlVMTCwgNzQsIDEyODAsIDEwMjQsIDc0MDcsIDI1NiwgMzIsIDM0LCAzLCAxNDQsIDMsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDc0LCAxMjgwLCAxMDI0LCA3NDA3LCAyNTYsIDMyLCAzNCwgMywgMTQ0LCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMDI0eDc2OCBAIDEwMEh6LCA4MC4yMSBrSHogaHN5bmMgKi8KLQlOVUxMLCAxMDAsIDEwMjQsIDc2OCwgODY1OCwgMTkyLCAzMiwgMjEsIDMsIDE5MiwgMTAsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDEwMCwgMTAyNCwgNzY4LCA4NjU4LCAxOTIsIDMyLCAyMSwgMywgMTkyLCAxMCwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTI4MHgxMDI0IEAgNzYgSHosIDgxLjEzIGtIeiBoc3luYyAqLwotCU5VTEwsIDc2LCAxMjgwLCAxMDI0LCA3NDA3LCAyNDgsIDMyLCAzNCwgMywgMTA0LCAzLAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA3NiwgMTI4MCwgMTAyNCwgNzQwNywgMjQ4LCAzMiwgMzQsIDMsIDEwNCwgMywgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTYwMHgxMjAwIEAgNzAgSHosIDg3LjUwIGtIeiBoc3luYyAqLwotCU5VTEwsIDcwLCAxNjAwLCAxMjAwLCA1MjkxLCAzMDQsIDY0LCA0NiwgMSwgMTkyLCAzLAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA3MCwgMTYwMCwgMTIwMCwgNTI5MSwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTE1Mng4NjQgQCAxMDAgSHosIDg5LjYyIGtIeiBoc3luYyAqLwotCU5VTEwsIDEwMCwgMTE1MiwgODY0LCA3MjY0LCAyMjQsIDMyLCAxNywgMiwgMTI4LCAxOSwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgMTAwLCAxMTUyLCA4NjQsIDcyNjQsIDIyNCwgMzIsIDE3LCAyLCAxMjgsIDE5LCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMjgweDEwMjQgQCA4NSBIeiwgOTEuMTUga0h6IGhzeW5jICovCi0JTlVMTCwgODUsIDEyODAsIDEwMjQsIDYzNDksIDIyNCwgNjQsIDQ0LCAxLCAxNjAsIDMsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgODUsIDEyODAsIDEwMjQsIDYzNDksIDIyNCwgNjQsIDQ0LCAxLCAxNjAsIDMsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxNjAweDEyMDAgQCA3NSBIeiwgOTMuNzUga0h6IGhzeW5jICovCi0JTlVMTCwgNzUsIDE2MDAsIDEyMDAsIDQ5MzgsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNzUsIDE2MDAsIDEyMDAsIDQ5MzgsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxNjgweDEwNTAgQCA2MCBIeiwgNjUuMTkxIGtIeiBoc3luYyAqLwotCU5VTEwsIDYwLCAxNjgwLCAxMDUwLCA2ODQ4LCAyODAsIDEwNCwgMzAsIDMsIDE3NiwgNiwKLQlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA2MCwgMTY4MCwgMTA1MCwgNjg0OCwgMjgwLCAxMDQsIDMwLCAzLCAxNzYsIDYsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxNjAweDEyMDAgQCA4NSBIeiwgMTA1Ljc3IGtIeiBoc3luYyAqLwotCU5VTEwsIDg1LCAxNjAwLCAxMjAwLCA0NTQ1LCAyNzIsIDE2LCAzNywgNCwgMTkyLCAzLAotCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDg1LCAxNjAwLCAxMjAwLCA0NTQ1LCAyNzIsIDE2LCAzNywgNCwgMTkyLCAzLAorCQlGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTI4MHgxMDI0IEAgMTAwIEh6LCAxMDcuMTYga0h6IGhzeW5jICovCi0JTlVMTCwgMTAwLCAxMjgwLCAxMDI0LCA1NTAyLCAyNTYsIDMyLCAyNiwgNywgMTI4LCAxNSwKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgMTAwLCAxMjgwLCAxMDI0LCA1NTAyLCAyNTYsIDMyLCAyNiwgNywgMTI4LCAxNSwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTgwMHgxNDQwIEAgNjRIeiwgOTYuMTUga0h6IGhzeW5jICAqLwotCU5VTEwsIDY0LCAxODAwLCAxNDQwLCA0MzQ3LCAzMDQsIDk2LCA0NiwgMSwgMTkyLCAzLAotCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDY0LCAxODAwLCAxNDQwLCA0MzQ3LCAzMDQsIDk2LCA0NiwgMSwgMTkyLCAzLAorCQlGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMTgwMHgxNDQwIEAgNzBIeiwgMTA0LjUyIGtIeiBoc3luYyAgKi8KLQlOVUxMLCA3MCwgMTgwMCwgMTQ0MCwgNDAwMCwgMzA0LCA5NiwgNDYsIDEsIDE5MiwgMywKLQlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA3MCwgMTgwMCwgMTQ0MCwgNDAwMCwgMzA0LCA5NiwgNDYsIDEsIDE5MiwgMywKKwkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDUxMngzODQgQCA3OCBIeiwgMzEuNTAga0h6IGhzeW5jICovCi0JTlVMTCwgNzgsIDUxMiwgMzg0LCA0OTYwMywgNDgsIDE2LCAxNiwgMSwgNjQsIDMsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDc4LCA1MTIsIDM4NCwgNDk2MDMsIDQ4LCAxNiwgMTYsIDEsIDY0LCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiA1MTJ4Mzg0IEAgODUgSHosIDM0LjM4IGtIeiBoc3luYyAqLwotCU5VTEwsIDg1LCA1MTIsIDM4NCwgNDU0NTQsIDQ4LCAxNiwgMTYsIDEsIDY0LCAzLAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgICB9LCB7CisJeyBOVUxMLCA4NSwgNTEyLCAzODQsIDQ1NDU0LCA0OCwgMTYsIDE2LCAxLCA2NCwgMywgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCB9LAorCiAJLyogMzIweDIwMCBAIDcwIEh6LCAzMS41IGtIeiBoc3luYywgODo1IGFzcGVjdCByYXRpbyAqLwotCU5VTEwsIDcwLCAzMjAsIDIwMCwgNzk0NDAsIDE2LCAxNiwgMjAsIDQsIDQ4LCAxLAotCTAsIEZCX1ZNT0RFX0RPVUJMRQotICAgIH0sIHsKKwl7IE5VTEwsIDcwLCAzMjAsIDIwMCwgNzk0NDAsIDE2LCAxNiwgMjAsIDQsIDQ4LCAxLCAwLAorCQlGQl9WTU9ERV9ET1VCTEUgfSwKKwogCS8qIDMyMHgyNDAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMsIDQ6MyBhc3BlY3QgcmF0aW8gKi8KLQlOVUxMLCA2MCwgMzIwLCAyNDAsIDc5NDQwLCAxNiwgMTYsIDE2LCA1LCA0OCwgMSwKLQkwLCBGQl9WTU9ERV9ET1VCTEUKLSAgICB9LCB7CisJeyBOVUxMLCA2MCwgMzIwLCAyNDAsIDc5NDQwLCAxNiwgMTYsIDE2LCA1LCA0OCwgMSwgMCwKKwkJRkJfVk1PREVfRE9VQkxFIH0sCisKIAkvKiAzMjB4MjQwIEAgNzIgSHosIDM2LjUga0h6IGhzeW5jICovCi0JTlVMTCwgNzIsIDMyMCwgMjQwLCA2MzQ5MiwgMTYsIDE2LCAxNiwgNCwgNDgsIDIsCi0JMCwgRkJfVk1PREVfRE9VQkxFCi0gICAgfSwgeworCXsgTlVMTCwgNzIsIDMyMCwgMjQwLCA2MzQ5MiwgMTYsIDE2LCAxNiwgNCwgNDgsIDIsIDAsCisJCUZCX1ZNT0RFX0RPVUJMRSB9LAorCiAJLyogNDAweDMwMCBAIDU2IEh6LCAzNS4yIGtIeiBoc3luYywgNDozIGFzcGVjdCByYXRpbyAqLwotCU5VTEwsIDU2LCA0MDAsIDMwMCwgNTU1NTUsIDY0LCAxNiwgMTAsIDEsIDMyLCAxLAotCTAsIEZCX1ZNT0RFX0RPVUJMRQotICAgIH0sIHsKKwl7IE5VTEwsIDU2LCA0MDAsIDMwMCwgNTU1NTUsIDY0LCAxNiwgMTAsIDEsIDMyLCAxLCAwLAorCQlGQl9WTU9ERV9ET1VCTEUgfSwKKwogCS8qIDQwMHgzMDAgQCA2MCBIeiwgMzcuOCBrSHogaHN5bmMgKi8KLQlOVUxMLCA2MCwgNDAwLCAzMDAsIDUwMDAwLCA0OCwgMTYsIDExLCAxLCA2NCwgMiwKLQkwLCBGQl9WTU9ERV9ET1VCTEUKLSAgICB9LCB7CisJeyBOVUxMLCA2MCwgNDAwLCAzMDAsIDUwMDAwLCA0OCwgMTYsIDExLCAxLCA2NCwgMiwgMCwKKwkJRkJfVk1PREVfRE9VQkxFIH0sCisKIAkvKiA0MDB4MzAwIEAgNzIgSHosIDQ4LjAga0h6IGhzeW5jICovCi0JTlVMTCwgNzIsIDQwMCwgMzAwLCA0MDAwMCwgMzIsIDI0LCAxMSwgMTksIDY0LCAzLAotCTAsIEZCX1ZNT0RFX0RPVUJMRQotICAgIH0sIHsKKwl7IE5VTEwsIDcyLCA0MDAsIDMwMCwgNDAwMDAsIDMyLCAyNCwgMTEsIDE5LCA2NCwgMywJMCwKKwkJRkJfVk1PREVfRE9VQkxFIH0sCisKIAkvKiA0ODB4MzAwIEAgNTYgSHosIDM1LjIga0h6IGhzeW5jLCA4OjUgYXNwZWN0IHJhdGlvICovCi0JTlVMTCwgNTYsIDQ4MCwgMzAwLCA0NjE3NiwgODAsIDE2LCAxMCwgMSwgNDAsIDEsCi0JMCwgRkJfVk1PREVfRE9VQkxFCi0gICAgfSwgeworCXsgTlVMTCwgNTYsIDQ4MCwgMzAwLCA0NjE3NiwgODAsIDE2LCAxMCwgMSwgNDAsIDEsIDAsCisJCUZCX1ZNT0RFX0RPVUJMRSB9LAorCiAJLyogNDgweDMwMCBAIDYwIEh6LCAzNy44IGtIeiBoc3luYyAqLwotCU5VTEwsIDYwLCA0ODAsIDMwMCwgNDE4NTgsIDU2LCAxNiwgMTEsIDEsIDgwLCAyLAotCTAsIEZCX1ZNT0RFX0RPVUJMRQotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCA0ODAsIDMwMCwgNDE4NTgsIDU2LCAxNiwgMTEsIDEsIDgwLCAyLCAwLAorCQlGQl9WTU9ERV9ET1VCTEUgfSwKKwogCS8qIDQ4MHgzMDAgQCA2MyBIeiwgMzkuNiBrSHogaHN5bmMgKi8KLQlOVUxMLCA2MywgNDgwLCAzMDAsIDQwMDAwLCA1NiwgMTYsIDExLCAxLCA4MCwgMiwKLQkwLCBGQl9WTU9ERV9ET1VCTEUKLSAgICB9LCB7CisJeyBOVUxMLCA2MywgNDgwLCAzMDAsIDQwMDAwLCA1NiwgMTYsIDExLCAxLCA4MCwgMiwgMCwKKwkJRkJfVk1PREVfRE9VQkxFIH0sCisKIAkvKiA0ODB4MzAwIEAgNzIgSHosIDQ4LjAga0h6IGhzeW5jICovCi0JTlVMTCwgNzIsIDQ4MCwgMzAwLCAzMzM4NiwgNDAsIDI0LCAxMSwgMTksIDgwLCAzLAotCTAsIEZCX1ZNT0RFX0RPVUJMRQotICAgIH0sIHsKKwl7IE5VTEwsIDcyLCA0ODAsIDMwMCwgMzMzODYsIDQwLCAyNCwgMTEsIDE5LCA4MCwgMywgMCwKKwkJRkJfVk1PREVfRE9VQkxFIH0sCisKIAkvKiAxOTIweDEyMDAgQCA2MCBIeiwgNzQuNSBLaHogaHN5bmMgKi8KLQlOVUxMLCA2MCwgMTkyMCwgMTIwMCwgNTE3NywgMTI4LCAzMzYsIDEsIDM4LCAyMDgsIDMsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCi0JRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCAxOTIwLCAxMjAwLCA1MTc3LCAxMjgsIDMzNiwgMSwgMzgsIDIwOCwgMywKKwkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDExNTJ4NzY4LCA2MCBIeiwgUG93ZXJCb29rIEc0IFRpdGFuaXVtIEkgYW5kIElJICovCi0JTlVMTCwgNjAsIDExNTIsIDc2OCwgMTQwNDcsIDE1OCwgMjYsIDI5LCAzLCAxMzYsIDYsCi0JRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgeworCXsgTlVMTCwgNjAsIDExNTIsIDc2OCwgMTQwNDcsIDE1OCwgMjYsIDI5LCAzLCAxMzYsIDYsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKIAkvKiAxMzY2eDc2OCwgNjAgSHosIDQ3LjQwMyBrSHogaHN5bmMsIFdYR0EgMTY6OSBhc3BlY3QgcmF0aW8gKi8KLQlOVUxMLCA2MCwgMTM2NiwgNzY4LCAxMzgwNiwgMTIwLCAxMCwgMTQsIDMsIDMyLCA1LAotCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKLSAgIH0sIHsKKwl7IE5VTEwsIDYwLCAxMzY2LCA3NjgsIDEzODA2LCAxMjAsIDEwLCAxNCwgMywgMzIsIDUsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfSwKKwogCS8qIDEyODB4ODAwLCA2MCBIeiwgNDcuNDAzIGtIeiBoc3luYywgV1hHQSAxNjoxMCBhc3BlY3QgcmF0aW8gKi8KLQlOVUxMLCA2MCwgMTI4MCwgODAwLCAxMjA0OCwgMjAwLCA2NCwgMjQsIDEsIDEzNiwgMywKLQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECi0gICAgfSwgewotICAgICAgIC8qIDcyMHg1NzZpIEAgNTAgSHosIDE1LjYyNSBrSHogaHN5bmMgKFBBTCBSR0IpICovCi0gICAgICAgTlVMTCwgNTAsIDcyMCwgNTc2LCA3NDA3NCwgNjQsIDE2LCAzOSwgNSwgNjQsIDUsCi0gICAgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAotICAgIH0sIHsKLSAgICAgICAvKiA4MDB4NTIwaSBAIDUwIEh6LCAxNS42MjUga0h6IGhzeW5jIChQQUwgUkdCKSAqLwotICAgICAgIE5VTEwsIDUwLCA4MDAsIDUyMCwgNTg4MjMsIDE0NCwgNjQsIDcyLCAyOCwgODAsIDUsCi0gICAgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAotICAgIH0sIHsKKwl7IE5VTEwsIDYwLCAxMjgwLCA4MDAsIDEyMDQ4LCAyMDAsIDY0LCAyNCwgMSwgMTM2LCAzLCAwLAorCQlGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCisKKwkvKiA3MjB4NTc2aSBAIDUwIEh6LCAxNS42MjUga0h6IGhzeW5jIChQQUwgUkdCKSAqLworCXsgTlVMTCwgNTAsIDcyMCwgNTc2LCA3NDA3NCwgNjQsIDE2LCAzOSwgNSwgNjQsIDUsIDAsCisJCUZCX1ZNT0RFX0lOVEVSTEFDRUQgfSwKKworCS8qIDgwMHg1MjBpIEAgNTAgSHosIDE1LjYyNSBrSHogaHN5bmMgKFBBTCBSR0IpICovCisJeyBOVUxMLCA1MCwgODAwLCA1MjAsIDU4ODIzLCAxNDQsIDY0LCA3MiwgMjgsIDgwLCA1LCAwLAorCQlGQl9WTU9ERV9JTlRFUkxBQ0VEIH0sCisKIAkvKiA4NjR4NDgwIEAgNjAgSHosIDM1LjE1IGtIeiBoc3luYyAqLwotCU5VTEwsIDYwLCA4NjQsIDQ4MCwgMjc3NzcsIDEsIDEsIDEsIDEsIDAsIDAsCi0JMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAotICAgIH0sCisJeyBOVUxMLCA2MCwgODY0LCA0ODAsIDI3Nzc3LCAxLCAxLCAxLCAxLCAwLCAwLAorCQkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIH0sCiB9OwogCiAjaWZkZWYgQ09ORklHX0ZCX01PREVfSEVMUEVSUwogY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBjZWFfbW9kZXNbNjRdID0gewogCS8qICMxOiA2NDB4NDgwcEA1OS45NC82MEh6ICovCiAJWzFdID0gewotCQlOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NzIyLCA0OCwgMTYsIDMzLCAxMCwgOTYsIDIsIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIDAsCisJCU5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjIsIDQ4LCAxNiwgMzMsIDEwLCA5NiwgMiwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKIAl9LAogCS8qICMzOiA3MjB4NDgwcEA1OS45NC82MEh6ICovCiAJWzNdID0gewotCQlOVUxMLCA2MCwgNzIwLCA0ODAsIDM3MDM3LCA2MCwgMTYsIDMwLCA5LCA2MiwgNiwgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKKwkJTlVMTCwgNjAsIDcyMCwgNDgwLCAzNzAzNywgNjAsIDE2LCAzMCwgOSwgNjIsIDYsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIDAsCiAJfSwKIAkvKiAjNTogMTkyMHgxMDgwaUA1OS45NC82MEh6ICovCiAJWzVdID0gewogCQlOVUxMLCA2MCwgMTkyMCwgMTA4MCwgMTM3NjMsIDE0OCwgODgsIDE1LCAyLCA0NCwgNSwKLQkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX0lOVEVSTEFDRUQsIDAsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9JTlRFUkxBQ0VELCAwLAogCX0sCiAJLyogIzc6IDcyMCgxNDQwKXg0ODBpSEA1OS45NC82MEh6ICovCiAJWzddID0gewotCQlOVUxMLCA2MCwgMTQ0MCwgNDgwLCAxODU1NC8qMzcxMDgqLywgMTE0LCAzOCwgMTUsIDQsIDEyNCwgMywgMCwgRkJfVk1PREVfSU5URVJMQUNFRCwgMCwKKwkJTlVMTCwgNjAsIDE0NDAsIDQ4MCwgMTg1NTQvKjM3MTA4Ki8sIDExNCwgMzgsIDE1LCA0LCAxMjQsIDMsIDAsCisJCUZCX1ZNT0RFX0lOVEVSTEFDRUQsIDAsCiAJfSwKIAkvKiAjOTogNzIwKDE0NDApeDI0MHBIQDU5Ljk0LzYwSHogKi8KIAlbOV0gPSB7Ci0JCU5VTEwsIDYwLCAxNDQwLCAyNDAsIDE4NTU0LCAxMTQsIDM4LCAxNiwgNCwgMTI0LCAzLCAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCAwLAorCQlOVUxMLCA2MCwgMTQ0MCwgMjQwLCAxODU1NCwgMTE0LCAzOCwgMTYsIDQsIDEyNCwgMywgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKIAl9LAogCS8qICMxODogNzIweDU3NnBIQDUwSHogKi8KIAlbMThdID0gewotCQlOVUxMLCA1MCwgNzIwLCA1NzYsIDM3MDM3LCA2OCwgMTIsIDM5LCA1LCA2NCwgNSwgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKKwkJTlVMTCwgNTAsIDcyMCwgNTc2LCAzNzAzNywgNjgsIDEyLCAzOSwgNSwgNjQsIDUsIDAsCisJCUZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIDAsCiAJfSwKIAkvKiAjMTk6IDEyODB4NzIwcEA1MEh6ICovCiAJWzE5XSA9IHsKIAkJTlVMTCwgNTAsIDEyODAsIDcyMCwgMTM0NjgsIDIyMCwgNDQwLCAyMCwgNSwgNDAsIDUsCi0JCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCAwLAorCQlGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKIAl9LAogCS8qICMyMDogMTkyMHgxMDgwaUA1MEh6ICovCiAJWzIwXSA9IHsKIAkJTlVMTCwgNTAsIDE5MjAsIDEwODAsIDEzNDgwLCAxNDgsIDUyOCwgMTUsIDUsIDUyOCwgNSwKLQkJRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX0lOVEVSTEFDRUQsIDAsCisJCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCQlGQl9WTU9ERV9JTlRFUkxBQ0VELCAwLAogCX0sCiAJLyogIzMyOiAxOTIweDEwODBwQDIzLjk4LzI0SHogKi8KIAlbMzJdID0gewogCQlOVUxMLCAyNCwgMTkyMCwgMTA4MCwgMTM0NjgsIDE0OCwgNjM4LCAzNiwgNCwgNDQsIDUsCi0JCUZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCAwLAorCQlGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKIAl9LAogCS8qICMzNTogKDI4ODApeDQ4MHA0eEA1OS45NC82MEh6ICovCiAJWzM1XSA9IHsKLQkJTlVMTCwgNjAsIDI4ODAsIDQ4MCwgOTI1MCwgMjQwLCA2NCwgMzAsIDksIDI0OCwgNiwgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKKwkJTlVMTCwgNjAsIDI4ODAsIDQ4MCwgOTI1MCwgMjQwLCA2NCwgMzAsIDksIDI0OCwgNiwgMCwKKwkJRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgMCwKIAl9LAogfTsKIApAQCAtMzQwLDEwICszNjAsMTAgQEAKIAl7IE5VTEwsIDg1LCA3MjEsIDQwMCwgMjgxNjksIDEwOCwgMzYsIDQyLCAwMSwgNzIsIDMsCiAJICBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDMgNjQweDQ4MC02MCBWRVNBICovCi0JeyBOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NjgyLCAgNDgsIDE2LCAzMywgMTAsIDk2LCAyLCAKKwl7IE5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk2ODIsICA0OCwgMTYsIDMzLCAxMCwgOTYsIDIsCiAJICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VELCBGQl9NT0RFX0lTX1ZFU0EgfSwKIAkvKiA0IDY0MHg0ODAtNzIgVkVTQSAqLwotCXsgTlVMTCwgNzIsIDY0MCwgNDgwLCAzMTc0NiwgMTI4LCAyNCwgMjksIDksIDQwLCAyLCAKKwl7IE5VTEwsIDcyLCA2NDAsIDQ4MCwgMzE3NDYsIDEyOCwgMjQsIDI5LCA5LCA0MCwgMiwKIAkgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDUgNjQweDQ4MC03NSBWRVNBICovCiAJeyBOVUxMLCA3NSwgNjQwLCA0ODAsIDMxNzQ2LCAxMjAsIDE2LCAxNiwgMDEsIDY0LCAzLApAQCAtNDI2LDcgKzQ0Niw3IEBACiAJICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKIAkgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQSB9LAogCS8qIDI2IDE2MDB4MTIwMC03NSBWRVNBICovCi0JeyBOVUxMLCA3NSwgMTYwMCwgMTIwMCwgNDkzOCwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywgCisJeyBOVUxMLCA3NSwgMTYwMCwgMTIwMCwgNDkzOCwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywKIAkgIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAogCSAgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBIH0sCiAJLyogMjcgMTYwMHgxMjAwLTg1IFZFU0EgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnVjOTAwZmIuYyBiL2RyaXZlcnMvdmlkZW8vbnVjOTAwZmIuYwppbmRleCA4MTY4N2VkLi42MjQ5OGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL251YzkwMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9udWM5MDBmYi5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC01OTcsOSArNTk4LDkgQEAKIAl9CiAKIAlmYmktPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKCFmYmktPmNsayB8fCBJU19FUlIoZmJpLT5jbGspKSB7CisJaWYgKElTX0VSUihmYmktPmNsaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJudWM5MDAtbGNkOmZhaWxlZCB0byBnZXQgbGNkIGNsb2NrIHNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7CisJCXJldCA9IFBUUl9FUlIoZmJpLT5jbGspOwogCQlnb3RvIHJlbGVhc2VfaXJxOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9iYWNrbGlnaHQuYwppbmRleCAyZmI1NTJhLi42YWFjNmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9iYWNrbGlnaHQuYwpAQCAtODcsNyArODcsNyBAQAogCXJldHVybiBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIG52aWRpYV9ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgbnZpZGlhX2JsX29wcyA9IHsKIAkuZ2V0X2JyaWdodG5lc3MgPSBudmlkaWFfYmxfZ2V0X2JyaWdodG5lc3MsCiAJLnVwZGF0ZV9zdGF0dXMJPSBudmlkaWFfYmxfdXBkYXRlX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL0tjb25maWcKaW5kZXggMTIzMjdiYi4uOTQwY2FiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvS2NvbmZpZwpAQCAtMSwxMSArMSwxMyBAQAogbWVudSAiT01BUDIvMyBEaXNwbGF5IERldmljZSBEcml2ZXJzIgogICAgICAgICBkZXBlbmRzIG9uIE9NQVAyX0RTUwogCi1jb25maWcgUEFORUxfR0VORVJJQwotICAgICAgICB0cmlzdGF0ZSAiR2VuZXJpYyBQYW5lbCIKK2NvbmZpZyBQQU5FTF9HRU5FUklDX0RQSQorICAgICAgICB0cmlzdGF0ZSAiR2VuZXJpYyBEUEkgUGFuZWwiCiAgICAgICAgIGhlbHAKLQkgIEdlbmVyaWMgcGFuZWwgZHJpdmVyLgotCSAgVXNlZCBmb3IgRFZJIG91dHB1dCBmb3IgQmVhZ2xlIGFuZCBPTUFQMyBTRFAuCisJICBHZW5lcmljIERQSSBwYW5lbCBkcml2ZXIuCisJICBTdXBwb3J0cyBEVkkgb3V0cHV0IGZvciBCZWFnbGUgYW5kIE9NQVAzIFNEUC4KKwkgIFN1cHBvcnRzIExDRCBQYW5lbCB1c2VkIGluIFRJIFNEUDM0MzAgYW5kIEVWTSBib2FyZHMsCisJICBPTUFQMzUxNyBFVk0gYm9hcmRzIGFuZCBDTS1UMzUuCiAKIGNvbmZpZyBQQU5FTF9TSEFSUF9MUzAzN1Y3RFcwMQogICAgICAgICB0cmlzdGF0ZSAiU2hhcnAgTFMwMzdWN0RXMDEgTENEIFBhbmVsIgpAQCAtMTQsMTEgKzE2LDEyIEBACiAgICAgICAgIGhlbHAKICAgICAgICAgICBMQ0QgUGFuZWwgdXNlZCBpbiBUSSdzIFNEUDM0MzAgYW5kIEVWTSBib2FyZHMKIAotY29uZmlnIFBBTkVMX1NIQVJQX0xRMDQzVDFERzAxCi0gICAgICAgIHRyaXN0YXRlICJTaGFycCBMUTA0M1QxREcwMSBMQ0QgUGFuZWwiCi0gICAgICAgIGRlcGVuZHMgb24gT01BUDJfRFNTCi0gICAgICAgIGhlbHAKLSAgICAgICAgICBMQ0QgUGFuZWwgdXNlZCBpbiBUSSdzIE9NQVAzNTE3IEVWTSBib2FyZHMKK2NvbmZpZyBQQU5FTF9ORUNfTkw4MDQ4SEwxMV8wMUIKKwl0cmlzdGF0ZSAiTkVDIE5MODA0OEhMMTEtMDFCIFBhbmVsIgorCWRlcGVuZHMgb24gT01BUDJfRFNTCisJaGVscAorCQlUaGlzIE5FQyBOTDgwNDhITDExLTAxQiBwYW5lbCBpcyBURlQgTENECisJCXVzZWQgaW4gdGhlIFpvb20yLzMvMzYzMCBzZHAgYm9hcmRzLgogCiBjb25maWcgUEFORUxfVEFBTAogICAgICAgICB0cmlzdGF0ZSAiVGFhbCBEU0kgUGFuZWwiCkBAIC0yNiwxMiArMjksNiBAQAogICAgICAgICBoZWxwCiAgICAgICAgICAgVGFhbCBEU0kgY29tbWFuZCBtb2RlIHBhbmVsIGZyb20gVFBPLgogCi1jb25maWcgUEFORUxfVE9QUE9MWV9URE8zNVMKLSAgICAgICAgdHJpc3RhdGUgIlRvcHBvbHkgVERPMzVTIExDRCBQYW5lbCBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIE9NQVAyX0RTUwotICAgICAgICBoZWxwCi0gICAgICAgICAgTENEIFBhbmVsIHVzZWQgaW4gQ00tVDM1Ci0KIGNvbmZpZyBQQU5FTF9UUE9fVEQwNDNNVEVBMQogICAgICAgICB0cmlzdGF0ZSAiVFBPIFREMDQzTVRFQTEgTENEIFBhbmVsIgogICAgICAgICBkZXBlbmRzIG9uIE9NQVAyX0RTUyAmJiBTUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL01ha2VmaWxlCmluZGV4IGFhMzg2MDkuLjg2MWYwMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9NYWtlZmlsZQpAQCAtMSw4ICsxLDcgQEAKLW9iai0kKENPTkZJR19QQU5FTF9HRU5FUklDKSArPSBwYW5lbC1nZW5lcmljLm8KK29iai0kKENPTkZJR19QQU5FTF9HRU5FUklDX0RQSSkgKz0gcGFuZWwtZ2VuZXJpYy1kcGkubwogb2JqLSQoQ09ORklHX1BBTkVMX1NIQVJQX0xTMDM3VjdEVzAxKSArPSBwYW5lbC1zaGFycC1sczAzN3Y3ZHcwMS5vCi1vYmotJChDT05GSUdfUEFORUxfU0hBUlBfTFEwNDNUMURHMDEpICs9IHBhbmVsLXNoYXJwLWxxMDQzdDFkZzAxLm8KK29iai0kKENPTkZJR19QQU5FTF9ORUNfTkw4MDQ4SEwxMV8wMUIpICs9IHBhbmVsLW5lYy1ubDgwNDhobDExLTAxYi5vCiAKIG9iai0kKENPTkZJR19QQU5FTF9UQUFMKSArPSBwYW5lbC10YWFsLm8KLW9iai0kKENPTkZJR19QQU5FTF9UT1BQT0xZX1RETzM1UykgKz0gcGFuZWwtdG9wcG9seS10ZG8zNXMubwogb2JqLSQoQ09ORklHX1BBTkVMX1RQT19URDA0M01URUExKSArPSBwYW5lbC10cG8tdGQwNDNtdGVhMS5vCiBvYmotJChDT05GSUdfUEFORUxfQUNYNTY1QUtNKSArPSBwYW5lbC1hY3g1NjVha20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1nZW5lcmljLWRwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWIzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMtZHBpLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBHZW5lcmljIERQSSBQYW5lbHMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBDYW5vbmljYWwgTHRkLgorICogQXV0aG9yOiBCcnlhbiBXdSA8YnJ5YW4ud3VAY2Fub25pY2FsLmNvbT4KKyAqCisgKiBMQ0QgcGFuZWwgZHJpdmVyIGZvciBTaGFycCBMUTA0M1QxREcwMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqIEF1dGhvcjogVmFpYmhhdiBIaXJlbWF0aCA8aHZhaWJoYXZAdGkuY29tPgorICoKKyAqIExDRCBwYW5lbCBkcml2ZXIgZm9yIFRvcHBvbHkgVERPMzVTCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IENvbXB1TGFiLCBMdGQuCisgKiBBdXRob3I6IE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRvbWkgVmFsa2VpbmVuIDx0b21pLnZhbGtlaW5lbkBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxwbGF0L3BhbmVsLWdlbmVyaWMtZHBpLmg+CisKK3N0cnVjdCBwYW5lbF9jb25maWcgeworCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5nczsKKworCWludCBhY2JpOwkvKiBhYy1iaWFzIHBpbiB0cmFuc2l0aW9ucyBwZXIgaW50ZXJydXB0ICovCisJLyogVW5pdDogbGluZSBjbG9ja3MgKi8KKwlpbnQgYWNiOwkvKiBhYy1iaWFzIHBpbiBmcmVxdWVuY3kgKi8KKworCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnOworCisJaW50IHBvd2VyX29uX2RlbGF5OworCWludCBwb3dlcl9vZmZfZGVsYXk7CisKKwkvKgorCSAqIFVzZWQgdG8gbWF0Y2ggZGV2aWNlIHRvIHBhbmVsIGNvbmZpZ3VyYXRpb24KKwkgKiB3aGVuIHVzZSBnZW5lcmljIHBhbmVsIGRyaXZlcgorCSAqLworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisvKiBQYW5lbCBjb25maWd1cmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBwYW5lbF9jb25maWcgZ2VuZXJpY19kcGlfcGFuZWxzW10gPSB7CisJLyogR2VuZXJpYyBQYW5lbCAqLworCXsKKwkJeworCQkJLnhfcmVzCQk9IDY0MCwKKwkJCS55X3JlcwkJPSA0ODAsCisKKwkJCS5waXhlbF9jbG9jawk9IDIzNTAwLAorCisJCQkuaGZwCQk9IDQ4LAorCQkJLmhzdwkJPSAzMiwKKwkJCS5oYnAJCT0gODAsCisKKwkJCS52ZnAJCT0gMywKKwkJCS52c3cJCT0gNCwKKwkJCS52YnAJCT0gNywKKwkJfSwKKwkJLmFjYmkJCQk9IDB4MCwKKwkJLmFjYgkJCT0gMHgwLAorCQkuY29uZmlnCQkJPSBPTUFQX0RTU19MQ0RfVEZULAorCQkucG93ZXJfb25fZGVsYXkJCT0gMCwKKwkJLnBvd2VyX29mZl9kZWxheQk9IDAsCisJCS5uYW1lCQkJPSAiZ2VuZXJpYyIsCisJfSwKKworCS8qIFNoYXJwIExRMDQzVDFERzAxICovCisJeworCQl7CisJCQkueF9yZXMJCT0gNDgwLAorCQkJLnlfcmVzCQk9IDI3MiwKKworCQkJLnBpeGVsX2Nsb2NrCT0gOTAwMCwKKworCQkJLmhzdwkJPSA0MiwKKwkJCS5oZnAJCT0gMywKKwkJCS5oYnAJCT0gMiwKKworCQkJLnZzdwkJPSAxMSwKKwkJCS52ZnAJCT0gMywKKwkJCS52YnAJCT0gMiwKKwkJfSwKKwkJLmFjYmkJCQk9IDB4MCwKKwkJLmFjYgkJCT0gMHgwLAorCQkuY29uZmlnCQkJPSBPTUFQX0RTU19MQ0RfVEZUIHwgT01BUF9EU1NfTENEX0lWUyB8CisJCQkJCU9NQVBfRFNTX0xDRF9JSFMgfCBPTUFQX0RTU19MQ0RfSUVPLAorCQkucG93ZXJfb25fZGVsYXkJCT0gNTAsCisJCS5wb3dlcl9vZmZfZGVsYXkJPSAxMDAsCisJCS5uYW1lCQkJPSAic2hhcnBfbHEiLAorCX0sCisKKwkvKiBTaGFycCBMUzAzN1Y3RFcwMSAqLworCXsKKwkJeworCQkJLnhfcmVzCQk9IDQ4MCwKKwkJCS55X3JlcwkJPSA2NDAsCisKKwkJCS5waXhlbF9jbG9jawk9IDE5MjAwLAorCisJCQkuaHN3CQk9IDIsCisJCQkuaGZwCQk9IDEsCisJCQkuaGJwCQk9IDI4LAorCisJCQkudnN3CQk9IDEsCisJCQkudmZwCQk9IDEsCisJCQkudmJwCQk9IDEsCisJCX0sCisJCS5hY2JpCQkJPSAweDAsCisJCS5hY2IJCQk9IDB4MjgsCisJCS5jb25maWcJCQk9IE9NQVBfRFNTX0xDRF9URlQgfCBPTUFQX0RTU19MQ0RfSVZTIHwKKwkJCQkJCU9NQVBfRFNTX0xDRF9JSFMsCisJCS5wb3dlcl9vbl9kZWxheQkJPSA1MCwKKwkJLnBvd2VyX29mZl9kZWxheQk9IDEwMCwKKwkJLm5hbWUJCQk9ICJzaGFycF9scyIsCisJfSwKKworCS8qIFRvcHBvbHkgVERPMzVTICovCisJeworCQl7CisJCQkueF9yZXMJCT0gNDgwLAorCQkJLnlfcmVzCQk9IDY0MCwKKworCQkJLnBpeGVsX2Nsb2NrCT0gMjYwMDAsCisKKwkJCS5oZnAJCT0gMTA0LAorCQkJLmhzdwkJPSA4LAorCQkJLmhicAkJPSA4LAorCisJCQkudmZwCQk9IDQsCisJCQkudnN3CQk9IDIsCisJCQkudmJwCQk9IDIsCisJCX0sCisJCS5hY2JpCQkJPSAweDAsCisJCS5hY2IJCQk9IDB4MCwKKwkJLmNvbmZpZwkJCT0gT01BUF9EU1NfTENEX1RGVCB8IE9NQVBfRFNTX0xDRF9JVlMgfAorCQkJCQlPTUFQX0RTU19MQ0RfSUhTIHwgT01BUF9EU1NfTENEX0lQQyB8CisJCQkJCU9NQVBfRFNTX0xDRF9PTk9GRiwKKwkJLnBvd2VyX29uX2RlbGF5CQk9IDAsCisJCS5wb3dlcl9vZmZfZGVsYXkJPSAwLAorCQkubmFtZQkJCT0gInRvcHBvbHlfdGRvMzVzIiwKKwl9LAorfTsKKworc3RydWN0IHBhbmVsX2Rydl9kYXRhIHsKKworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKKworCXN0cnVjdCBwYW5lbF9jb25maWcgKnBhbmVsX2NvbmZpZzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhbmVsX2dlbmVyaWNfZHBpX2RhdGEKKypnZXRfcGFuZWxfZGF0YShjb25zdCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSAqKSBkc3NkZXYtPmRhdGE7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19kcGlfcGFuZWxfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByOworCXN0cnVjdCBwYW5lbF9nZW5lcmljX2RwaV9kYXRhICpwYW5lbF9kYXRhID0gZ2V0X3BhbmVsX2RhdGEoZHNzZGV2KTsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisJc3RydWN0IHBhbmVsX2NvbmZpZyAqcGFuZWxfY29uZmlnID0gZHJ2X2RhdGEtPnBhbmVsX2NvbmZpZzsKKworCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOworCWlmIChyKQorCQlnb3RvIGVycjA7CisKKwkvKiB3YWl0IGNvdXBsZSBvZiB2c3luY3MgdW50aWwgZW5hYmxpbmcgdGhlIExDRCAqLworCWlmIChwYW5lbF9jb25maWctPnBvd2VyX29uX2RlbGF5KQorCQltc2xlZXAocGFuZWxfY29uZmlnLT5wb3dlcl9vbl9kZWxheSk7CisKKwlpZiAocGFuZWxfZGF0YS0+cGxhdGZvcm1fZW5hYmxlKSB7CisJCXIgPSBwYW5lbF9kYXRhLT5wbGF0Zm9ybV9lbmFibGUoZHNzZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycjE7CisJfQorCisJcmV0dXJuIDA7CitlcnIxOgorCW9tYXBkc3NfZHBpX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworZXJyMDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19kcGlfcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSAqcGFuZWxfZGF0YSA9IGdldF9wYW5lbF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBwYW5lbF9jb25maWcgKnBhbmVsX2NvbmZpZyA9IGRydl9kYXRhLT5wYW5lbF9jb25maWc7CisKKwlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKHBhbmVsX2RhdGEtPnBsYXRmb3JtX2Rpc2FibGUpCisJCXBhbmVsX2RhdGEtPnBsYXRmb3JtX2Rpc2FibGUoZHNzZGV2KTsKKworCS8qIHdhaXQgY291cGxlIG9mIHZzeW5jcyBhZnRlciBkaXNhYmxpbmcgdGhlIExDRCAqLworCWlmIChwYW5lbF9jb25maWctPnBvd2VyX29mZl9kZWxheSkKKwkJbXNsZWVwKHBhbmVsX2NvbmZpZy0+cG93ZXJfb2ZmX2RlbGF5KTsKKworCW9tYXBkc3NfZHBpX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfZHBpX3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZ2VuZXJpY19kcGlfZGF0YSAqcGFuZWxfZGF0YSA9IGdldF9wYW5lbF9kYXRhKGRzc2Rldik7CisJc3RydWN0IHBhbmVsX2NvbmZpZyAqcGFuZWxfY29uZmlnID0gTlVMTDsKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRydl9kYXRhID0gTlVMTDsKKwlpbnQgaTsKKworCWRldl9kYmcoJmRzc2Rldi0+ZGV2LCAicHJvYmVcbiIpOworCisJaWYgKCFwYW5lbF9kYXRhIHx8ICFwYW5lbF9kYXRhLT5uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdlbmVyaWNfZHBpX3BhbmVscyk7IGkrKykgeworCQlpZiAoc3RyY21wKHBhbmVsX2RhdGEtPm5hbWUsIGdlbmVyaWNfZHBpX3BhbmVsc1tpXS5uYW1lKSA9PSAwKSB7CisJCQlwYW5lbF9jb25maWcgPSAmZ2VuZXJpY19kcGlfcGFuZWxzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXBhbmVsX2NvbmZpZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkc3NkZXYtPnBhbmVsLmNvbmZpZyA9IHBhbmVsX2NvbmZpZy0+Y29uZmlnOworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IHBhbmVsX2NvbmZpZy0+dGltaW5nczsKKwlkc3NkZXYtPnBhbmVsLmFjYiA9IHBhbmVsX2NvbmZpZy0+YWNiOworCWRzc2Rldi0+cGFuZWwuYWNiaSA9IHBhbmVsX2NvbmZpZy0+YWNiaTsKKworCWRydl9kYXRhID0ga3phbGxvYyhzaXplb2YoKmRydl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZfZGF0YS0+ZHNzZGV2ID0gZHNzZGV2OworCWRydl9kYXRhLT5wYW5lbF9jb25maWcgPSBwYW5lbF9jb25maWc7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBkcnZfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19kcGlfcGFuZWxfcmVtb3ZlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgcGFuZWxfZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKCZkc3NkZXYtPmRldik7CisKKwlkZXZfZGJnKCZkc3NkZXYtPmRldiwgInJlbW92ZVxuIik7CisKKwlrZnJlZShkcnZfZGF0YSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRzc2Rldi0+ZGV2LCBOVUxMKTsKK30KKworc3RhdGljIGludCBnZW5lcmljX2RwaV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKworCXIgPSBnZW5lcmljX2RwaV9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2RwaV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlnZW5lcmljX2RwaV9wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKKworCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfZHBpX3BhbmVsX3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWdlbmVyaWNfZHBpX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOworCisJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19kcGlfcGFuZWxfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgciA9IDA7CisKKwlyID0gZ2VuZXJpY19kcGlfcGFuZWxfcG93ZXJfb24oZHNzZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19kcGlfcGFuZWxfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQoreworCWRwaV9zZXRfdGltaW5ncyhkc3NkZXYsIHRpbWluZ3MpOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2RwaV9wYW5lbF9nZXRfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJKnRpbWluZ3MgPSBkc3NkZXYtPnBhbmVsLnRpbWluZ3M7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY19kcGlfcGFuZWxfY2hlY2tfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCit7CisJcmV0dXJuIGRwaV9jaGVja190aW1pbmdzKGRzc2RldiwgdGltaW5ncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIGRwaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGdlbmVyaWNfZHBpX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2VuZXJpY19kcGlfcGFuZWxfcmVtb3ZlLAorCisJLmVuYWJsZQkJPSBnZW5lcmljX2RwaV9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBnZW5lcmljX2RwaV9wYW5lbF9kaXNhYmxlLAorCS5zdXNwZW5kCT0gZ2VuZXJpY19kcGlfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGdlbmVyaWNfZHBpX3BhbmVsX3Jlc3VtZSwKKworCS5zZXRfdGltaW5ncwk9IGdlbmVyaWNfZHBpX3BhbmVsX3NldF90aW1pbmdzLAorCS5nZXRfdGltaW5ncwk9IGdlbmVyaWNfZHBpX3BhbmVsX2dldF90aW1pbmdzLAorCS5jaGVja190aW1pbmdzCT0gZ2VuZXJpY19kcGlfcGFuZWxfY2hlY2tfdGltaW5ncywKKworCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJnZW5lcmljX2RwaV9wYW5lbCIsCisJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2VuZXJpY19kcGlfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZkcGlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdlbmVyaWNfZHBpX3BhbmVsX2Rydl9leGl0KHZvaWQpCit7CisJb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJmRwaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChnZW5lcmljX2RwaV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChnZW5lcmljX2RwaV9wYW5lbF9kcnZfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLWdlbmVyaWMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZ2VuZXJpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVhNjhkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBHZW5lcmljIHBhbmVsIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KLSAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIGdlbmVyaWNfcGFuZWxfdGltaW5ncyA9IHsKLQkvKiA2NDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLwotCS54X3JlcwkJPSA2NDAsCi0JLnlfcmVzCQk9IDQ4MCwKLQkucGl4ZWxfY2xvY2sJPSAyMzUwMCwKLQkuaGZwCQk9IDQ4LAotCS5oc3cJCT0gMzIsCi0JLmhicAkJPSA4MCwKLQkudmZwCQk9IDMsCi0JLnZzdwkJPSA0LAotCS52YnAJCT0gNywKLX07Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wYW5lbF9wb3dlcl9vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaW50IHI7Ci0KLQlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKLQkJcmV0dXJuIDA7Ci0KLQlyID0gb21hcGRzc19kcGlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKLQlpZiAocikKLQkJZ290byBlcnIwOwotCi0JaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKSB7Ci0JCXIgPSBkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOwotCQlpZiAocikKLQkJCWdvdG8gZXJyMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLWVycjE6Ci0Jb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Ci1lcnIwOgotCXJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCBnZW5lcmljX3BhbmVsX3Bvd2VyX29mZihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCi0JCXJldHVybjsKLQotCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCi0JCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOwotCi0Jb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wYW5lbF9wcm9iZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUOwotCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IGdlbmVyaWNfcGFuZWxfdGltaW5nczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBnZW5lcmljX3BhbmVsX3JlbW92ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQotCXIgPSBnZW5lcmljX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbmVyaWNfcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JZ2VuZXJpY19wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOwotfQotCi1zdGF0aWMgaW50IGdlbmVyaWNfcGFuZWxfc3VzcGVuZChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JZ2VuZXJpY19wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKLQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQotCXIgPSBnZW5lcmljX3BhbmVsX3Bvd2VyX29uKGRzc2Rldik7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0JZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbmVyaWNfcGFuZWxfc2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQotewotCWRwaV9zZXRfdGltaW5ncyhkc3NkZXYsIHRpbWluZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBnZW5lcmljX3BhbmVsX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKLXsKLQkqdGltaW5ncyA9IGRzc2Rldi0+cGFuZWwudGltaW5nczsKLX0KLQotc3RhdGljIGludCBnZW5lcmljX3BhbmVsX2NoZWNrX3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQotewotCXJldHVybiBkcGlfY2hlY2tfdGltaW5ncyhkc3NkZXYsIHRpbWluZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciBnZW5lcmljX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gZ2VuZXJpY19wYW5lbF9wcm9iZSwKLQkucmVtb3ZlCQk9IGdlbmVyaWNfcGFuZWxfcmVtb3ZlLAotCi0JLmVuYWJsZQkJPSBnZW5lcmljX3BhbmVsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IGdlbmVyaWNfcGFuZWxfZGlzYWJsZSwKLQkuc3VzcGVuZAk9IGdlbmVyaWNfcGFuZWxfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGdlbmVyaWNfcGFuZWxfcmVzdW1lLAotCi0JLnNldF90aW1pbmdzCT0gZ2VuZXJpY19wYW5lbF9zZXRfdGltaW5ncywKLQkuZ2V0X3RpbWluZ3MJPSBnZW5lcmljX3BhbmVsX2dldF90aW1pbmdzLAotCS5jaGVja190aW1pbmdzCT0gZ2VuZXJpY19wYW5lbF9jaGVja190aW1pbmdzLAotCi0JLmRyaXZlciAgICAgICAgID0gewotCQkubmFtZSAgID0gImdlbmVyaWNfcGFuZWwiLAotCQkub3duZXIgID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGdlbmVyaWNfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZnZW5lcmljX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBnZW5lcmljX3BhbmVsX2Rydl9leGl0KHZvaWQpCi17Ci0Jb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJmdlbmVyaWNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZ2VuZXJpY19wYW5lbF9kcnZfaW5pdCk7Ci1tb2R1bGVfZXhpdChnZW5lcmljX3BhbmVsX2Rydl9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtbmVjLW5sODA0OGhsMTEtMDFiLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLW5lYy1ubDgwNDhobDExLTAxYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWUwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLW5lYy1ubDgwNDhobDExLTAxYi5jCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogU3VwcG9ydCBmb3IgTkVDLW5sODA0OGhsMTEtMDFiIHBhbmVsIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKiBBdXRob3I6IEVyaWsgR2lsbGluZyA8a29ua2Vyc0BhbmRyb2lkLmNvbT4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDxwbGF0L2Rpc3BsYXkuaD4KKworI2RlZmluZSBMQ0RfWFJFUwkJODAwCisjZGVmaW5lIExDRF9ZUkVTCQk0ODAKKy8qCisgKiBORUMgUElYIENsb2NrIFJhdGluZ3MKKyAqIE1JTjoyMS44TUh6IFRZUDoyMy44TUh6IE1BWDoyNS43TUh6CisgKi8KKyNkZWZpbmUgTENEX1BJWEVMX0NMT0NLCQkyMzgwMAorCitzdHJ1Y3QgbmVjXzgwNDhfZGF0YSB7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBhZGRyOworCXVuc2lnbmVkIGNoYXIgZGF0OworfSBuZWNfODA0OF9pbml0X3NlcVtdID0geworCXsgMywgMHgwMSB9LCB7IDAsIDB4MDAgfSwgeyAxLCAweDAxIH0sIHsgNCwgMHgwMCB9LCB7IDUsIDB4MTQgfSwKKwl7IDYsIDB4MjQgfSwgeyAxNiwgMHhENyB9LCB7IDE3LCAweDAwIH0sIHsgMTgsIDB4MDAgfSwgeyAxOSwgMHg1NSB9LAorCXsgMjAsIDB4MDEgfSwgeyAyMSwgMHg3MCB9LCB7IDIyLCAweDFFIH0sIHsgMjMsIDB4MjUgfSwJeyAyNCwgMHgyNSB9LAorCXsgMjUsIDB4MDIgfSwgeyAyNiwgMHgwMiB9LCB7IDI3LCAweEEwIH0sIHsgMzIsIDB4MkYgfSwgeyAzMywgMHgwRiB9LAorCXsgMzQsIDB4MEYgfSwgeyAzNSwgMHgwRiB9LCB7IDM2LCAweDBGIH0sIHsgMzcsIDB4MEYgfSwJeyAzOCwgMHgwRiB9LAorCXsgMzksIDB4MDAgfSwgeyA0MCwgMHgwMiB9LCB7IDQxLCAweDAyIH0sIHsgNDIsIDB4MDIgfSwJeyA0MywgMHgwRiB9LAorCXsgNDQsIDB4MEYgfSwgeyA0NSwgMHgwRiB9LCB7IDQ2LCAweDBGIH0sIHsgNDcsIDB4MEYgfSwJeyA0OCwgMHgwRiB9LAorCXsgNDksIDB4MEYgfSwgeyA1MCwgMHgwMCB9LCB7IDUxLCAweDAyIH0sIHsgNTIsIDB4MDIgfSwgeyA1MywgMHgwMiB9LAorCXsgODAsIDB4MEMgfSwgeyA4MywgMHg0MiB9LCB7IDg0LCAweDQyIH0sIHsgODUsIDB4NDEgfSwJeyA4NiwgMHgxNCB9LAorCXsgODksIDB4ODggfSwgeyA5MCwgMHgwMSB9LCB7IDkxLCAweDAwIH0sIHsgOTIsIDB4MDIgfSwJeyA5MywgMHgwQyB9LAorCXsgOTQsIDB4MUMgfSwgeyA5NSwgMHgyNyB9LCB7IDk4LCAweDQ5IH0sIHsgOTksIDB4MjcgfSwgeyAxMDIsIDB4NzYgfSwKKwl7IDEwMywgMHgyNyB9LCB7IDExMiwgMHgwMSB9LCB7IDExMywgMHgwRSB9LCB7IDExNCwgMHgwMiB9LAorCXsgMTE1LCAweDBDIH0sIHsgMTE4LCAweDBDIH0sIHsgMTIxLCAweDMwIH0sIHsgMTMwLCAweDAwIH0sCisJeyAxMzEsIDB4MDAgfSwgeyAxMzIsIDB4RkMgfSwgeyAxMzQsIDB4MDAgfSwgeyAxMzYsIDB4MDAgfSwKKwl7IDEzOCwgMHgwMCB9LCB7IDEzOSwgMHgwMCB9LCB7IDE0MCwgMHgwMCB9LCB7IDE0MSwgMHhGQyB9LAorCXsgMTQzLCAweDAwIH0sIHsgMTQ1LCAweDAwIH0sIHsgMTQ3LCAweDAwIH0sIHsgMTQ4LCAweDAwIH0sCisJeyAxNDksIDB4MDAgfSwgeyAxNTAsIDB4RkMgfSwgeyAxNTIsIDB4MDAgfSwgeyAxNTQsIDB4MDAgfSwKKwl7IDE1NiwgMHgwMCB9LCB7IDE1NywgMHgwMCB9LCB7IDIsIDB4MDAgfSwKK307CisKKy8qCisgKiBORUMgTkw4MDQ4SEwxMS0wMUIgIE1hbnVhbAorICogZGVmaW5lcyBIRkIsIEhTVywgSEJQLCBWRlAsIFZTVywgVkJQIGFzIHNob3duIGJlbG93CisgKi8KKworc3RhdGljIHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgbmVjXzgwNDhfcGFuZWxfdGltaW5ncyA9IHsKKwkvKiA4MDAgeCA0ODAgQCA2MCBIeiAgUmVkdWNlZCBibGFua2luZyBWRVNBIENWVCAwLjMxTTMtUiAqLworCS54X3JlcwkJPSBMQ0RfWFJFUywKKwkueV9yZXMJCT0gTENEX1lSRVMsCisJLnBpeGVsX2Nsb2NrCT0gTENEX1BJWEVMX0NMT0NLLAorCS5oZnAJCT0gNiwKKwkuaHN3CQk9IDEsCisJLmhicAkJPSA0LAorCS52ZnAJCT0gMywKKwkudnN3CQk9IDEsCisJLnZicAkJPSA0LAorfTsKKworc3RhdGljIGludCBuZWNfODA0OF9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmJsLT5kZXYpOworCWludCBsZXZlbDsKKworCWlmICghZHNzZGV2LT5zZXRfYmFja2xpZ2h0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChibC0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgorCQkJYmwtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspCisJCWxldmVsID0gYmwtPnByb3BzLmJyaWdodG5lc3M7CisJZWxzZQorCQlsZXZlbCA9IDA7CisKKwlyZXR1cm4gZHNzZGV2LT5zZXRfYmFja2xpZ2h0KGRzc2RldiwgbGV2ZWwpOworfQorCitzdGF0aWMgaW50IG5lY184MDQ4X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCkKK3sKKwlpZiAoYmwtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTksgJiYKKwkJCWJsLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQlyZXR1cm4gYmwtPnByb3BzLmJyaWdodG5lc3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIG5lY184MDQ4X2JsX29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MJPSBuZWNfODA0OF9ibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IG5lY184MDQ4X2JsX3VwZGF0ZV9zdGF0dXMsCit9OworCitzdGF0aWMgaW50IG5lY184MDQ4X3BhbmVsX3Byb2JlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmw7CisJc3RydWN0IG5lY184MDQ4X2RhdGEgKm5lY2Q7CisJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOworCWludCByOworCisJZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwgT01BUF9EU1NfTENEX0lWUyB8CisJCQkJT01BUF9EU1NfTENEX0lIUyB8IE9NQVBfRFNTX0xDRF9SRiB8CisJCQkJT01BUF9EU1NfTENEX09OT0ZGOworCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IG5lY184MDQ4X3BhbmVsX3RpbWluZ3M7CisKKwluZWNkID0ga3phbGxvYyhzaXplb2YoKm5lY2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5lY2QpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZkc3NkZXYtPmRldiwgbmVjZCk7CisKKwltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CisJcHJvcHMubWF4X2JyaWdodG5lc3MgPSAyNTU7CisKKwlibCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoIm5lYy04MDQ4IiwgJmRzc2Rldi0+ZGV2LCBkc3NkZXYsCisJCQkmbmVjXzgwNDhfYmxfb3BzLCAmcHJvcHMpOworCWlmIChJU19FUlIoYmwpKSB7CisJCXIgPSBQVFJfRVJSKGJsKTsKKwkJa2ZyZWUobmVjZCk7CisJCXJldHVybiByOworCX0KKwluZWNkLT5ibCA9IGJsOworCisJYmwtPnByb3BzLmZiX2JsYW5rID0gRkJfQkxBTktfVU5CTEFOSzsKKwlibC0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJsLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IGRzc2Rldi0+bWF4X2JhY2tsaWdodF9sZXZlbDsKKwlibC0+cHJvcHMuYnJpZ2h0bmVzcyA9IGRzc2Rldi0+bWF4X2JhY2tsaWdodF9sZXZlbDsKKworCXIgPSBuZWNfODA0OF9ibF91cGRhdGVfc3RhdHVzKGJsKTsKKwlpZiAociA8IDApCisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBsY2QgYnJpZ2h0bmVzc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmVjXzgwNDhfcGFuZWxfcmVtb3ZlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgbmVjXzgwNDhfZGF0YSAqbmVjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IG5lY2QtPmJsOworCisJYmwtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCW5lY184MDQ4X2JsX3VwZGF0ZV9zdGF0dXMoYmwpOworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihibCk7CisKKwlrZnJlZShuZWNkKTsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQoreworCWludCByID0gMDsKKwlzdHJ1Y3QgbmVjXzgwNDhfZGF0YSAqbmVjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IG5lY2QtPmJsOworCisJaWYgKGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKSB7CisJCXIgPSBkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZShkc3NkZXYpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXIgPSBuZWNfODA0OF9ibF91cGRhdGVfc3RhdHVzKGJsKTsKKwlpZiAociA8IDApCisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBsY2QgYnJpZ2h0bmVzc1xuIik7CisKKwlyID0gb21hcGRzc19kcGlfZGlzcGxheV9lbmFibGUoZHNzZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBuZWNfODA0OF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlzdHJ1Y3QgbmVjXzgwNDhfZGF0YSAqbmVjZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZHNzZGV2LT5kZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibCA9IG5lY2QtPmJsOworCisJb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7CisKKwlibC0+cHJvcHMuYnJpZ2h0bmVzcyA9IDA7CisJbmVjXzgwNDhfYmxfdXBkYXRlX3N0YXR1cyhibCk7CisKKwlpZiAoZHNzZGV2LT5wbGF0Zm9ybV9kaXNhYmxlKQorCQlkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUoZHNzZGV2KTsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwluZWNfODA0OF9wYW5lbF9kaXNhYmxlKGRzc2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmVjXzgwNDhfcGFuZWxfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlyZXR1cm4gbmVjXzgwNDhfcGFuZWxfZW5hYmxlKGRzc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgbmVjXzgwNDhfcmVjb21tZW5kZWRfYnBwKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlyZXR1cm4gMTY7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIG5lY184MDQ4X2RyaXZlciA9IHsKKwkucHJvYmUJCQk9IG5lY184MDQ4X3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCQk9IG5lY184MDQ4X3BhbmVsX3JlbW92ZSwKKwkuZW5hYmxlCQkJPSBuZWNfODA0OF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJCT0gbmVjXzgwNDhfcGFuZWxfZGlzYWJsZSwKKwkuc3VzcGVuZAkJPSBuZWNfODA0OF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IG5lY184MDQ4X3BhbmVsX3Jlc3VtZSwKKwkuZ2V0X3JlY29tbWVuZGVkX2JwcAk9IG5lY184MDQ4X3JlY29tbWVuZGVkX2JwcCwKKworCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAiTkVDXzgwNDhfcGFuZWwiLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgbmVjXzgwNDhfc3BpX3NlbmQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgY2hhciByZWdfYWRkciwKKwkJCXVuc2lnbmVkIGNoYXIgcmVnX2RhdGEpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGNtZCA9IDAsIGRhdGEgPSAwOworCisJY21kID0gMHgwMDAwIHwgcmVnX2FkZHI7IC8qIHJlZ2lzdGVyIGFkZHJlc3Mgd3JpdGUgKi8KKwlkYXRhID0gMHgwMTAwIHwgcmVnX2RhdGEgOyAvKiByZWdpc3RlciBkYXRhIHdyaXRlICovCisJZGF0YSA9IChjbWQgPDwgMTYpIHwgZGF0YTsKKworCXJldCA9IHNwaV93cml0ZShzcGksICh1bnNpZ25lZCBjaGFyICopJmRhdGEsIDQpOworCWlmIChyZXQpCisJCXByX2VycigiZXJyb3IgaW4gc3BpX3dyaXRlICV4XG4iLCBkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9uZWNfODA0OF93dmdhX2xjZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXVuc2lnbmVkIGludCBpOworCS8qIEluaXRpYWxpemF0aW9uIFNlcXVlbmNlICovCisJLyogbmVjXzgwNDhfc3BpX3NlbmQoc3BpLCBSRUcsIFZBTCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKEFSUkFZX1NJWkUobmVjXzgwNDhfaW5pdF9zZXEpIC0gMSk7IGkrKykKKwkJbmVjXzgwNDhfc3BpX3NlbmQoc3BpLCBuZWNfODA0OF9pbml0X3NlcVtpXS5hZGRyLAorCQkJCW5lY184MDQ4X2luaXRfc2VxW2ldLmRhdCk7CisJdWRlbGF5KDIwKTsKKwluZWNfODA0OF9zcGlfc2VuZChzcGksIG5lY184MDQ4X2luaXRfc2VxW2ldLmFkZHIsCisJCQkJbmVjXzgwNDhfaW5pdF9zZXFbaV0uZGF0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCXNwaS0+Yml0c19wZXJfd29yZCA9IDMyOworCXNwaV9zZXR1cChzcGkpOworCisJaW5pdF9uZWNfODA0OF93dmdhX2xjZChzcGkpOworCisJcmV0dXJuIG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcigmbmVjXzgwNDhfZHJpdmVyKTsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJb21hcF9kc3NfdW5yZWdpc3Rlcl9kcml2ZXIoJm5lY184MDQ4X2RyaXZlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9zcGlfc3VzcGVuZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwluZWNfODA0OF9zcGlfc2VuZChzcGksIDIsIDB4MDEpOworCW1kZWxheSg0MCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZWNfODA0OF9zcGlfcmVzdW1lKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJLyogcmVpbml0aWFsaXplIHRoZSBwYW5lbCAqLworCXNwaV9zZXR1cChzcGkpOworCW5lY184MDQ4X3NwaV9zZW5kKHNwaSwgMiwgMHgwMCk7CisJaW5pdF9uZWNfODA0OF93dmdhX2xjZChzcGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBuZWNfODA0OF9zcGlfZHJpdmVyID0geworCS5wcm9iZQkJPSBuZWNfODA0OF9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuZWNfODA0OF9zcGlfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IG5lY184MDQ4X3NwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbmVjXzgwNDhfc3BpX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibmVjXzgwNDhfc3BpIiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZWNfODA0OF9sY2RfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZuZWNfODA0OF9zcGlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5lY184MDQ4X2xjZF9leGl0KHZvaWQpCit7CisJcmV0dXJuIHNwaV91bnJlZ2lzdGVyX2RyaXZlcigmbmVjXzgwNDhfc3BpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5lY184MDQ4X2xjZF9pbml0KTsKK21vZHVsZV9leGl0KG5lY184MDQ4X2xjZF9leGl0KTsKK01PRFVMRV9BVVRIT1IoIkVyaWsgR2lsbGluZyA8a29ua2Vyc0BhbmRyb2lkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkVDLW5sODA0OGhsMTEtMDFiIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1zaGFycC1scTA0M3QxZGcwMS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC1zaGFycC1scTA0M3QxZGcwMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzY4OTZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtc2hhcnAtbHEwNDN0MWRnMDEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTENEIHBhbmVsIGRyaXZlciBmb3IgU2hhcnAgTFEwNDNUMURHMDEKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCi0gKiBBdXRob3I6IFZhaWJoYXYgSGlyZW1hdGggPGh2YWliaGF2QHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHNoYXJwX2xxX3RpbWluZ3MgPSB7Ci0JLnhfcmVzID0gNDgwLAotCS55X3JlcyA9IDI3MiwKLQotCS5waXhlbF9jbG9jawk9IDkwMDAsCi0KLQkuaHN3CQk9IDQyLAotCS5oZnAJCT0gMywKLQkuaGJwCQk9IDIsCi0KLQkudnN3CQk9IDExLAotCS52ZnAJCT0gMywKLQkudmJwCQk9IDIsCi19OwotCi1zdGF0aWMgaW50IHNoYXJwX2xxX3BhbmVsX3Bvd2VyX29uKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpbnQgcjsKLQotCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKQotCQlyZXR1cm4gMDsKLQotCXIgPSBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOwotCWlmIChyKQotCQlnb3RvIGVycjA7Ci0KLQkvKiB3YWl0IGNvdXBsZSBvZiB2c3luY3MgdW50aWwgZW5hYmxpbmcgdGhlIExDRCAqLwotCW1zbGVlcCg1MCk7Ci0KLQlpZiAoZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUpIHsKLQkJciA9IGRzc2Rldi0+cGxhdGZvcm1fZW5hYmxlKGRzc2Rldik7Ci0JCWlmIChyKQotCQkJZ290byBlcnIxOwotCX0KLQotCXJldHVybiAwOwotZXJyMToKLQlvbWFwZHNzX2RwaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKLWVycjA6Ci0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIHNoYXJwX2xxX3BhbmVsX3Bvd2VyX29mZihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCi0JCXJldHVybjsKLQotCWlmIChkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUpCi0JCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOwotCi0JLyogd2FpdCBhdCBsZWFzdCA1IHZzeW5jcyBhZnRlciBkaXNhYmxpbmcgdGhlIExDRCAqLwotCW1zbGVlcCgxMDApOwotCi0Jb21hcGRzc19kcGlfZGlzcGxheV9kaXNhYmxlKGRzc2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhcnBfbHFfcGFuZWxfcHJvYmUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCi0JZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwgT01BUF9EU1NfTENEX0lWUyB8Ci0JCU9NQVBfRFNTX0xDRF9JSFMgfCBPTUFQX0RTU19MQ0RfSUVPOwotCWRzc2Rldi0+cGFuZWwuYWNiID0gMHgwOwotCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9IHNoYXJwX2xxX3RpbWluZ3M7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2hhcnBfbHFfcGFuZWxfcmVtb3ZlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLX0KLQotc3RhdGljIGludCBzaGFycF9scV9wYW5lbF9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQotCXIgPSBzaGFycF9scV9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaGFycF9scV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlzaGFycF9scV9wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOwotfQotCi1zdGF0aWMgaW50IHNoYXJwX2xxX3BhbmVsX3N1c3BlbmQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCXNoYXJwX2xxX3BhbmVsX3Bvd2VyX29mZihkc3NkZXYpOwotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX1NVU1BFTkRFRDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGFycF9scV9wYW5lbF9yZXN1bWUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByID0gMDsKLQotCXIgPSBzaGFycF9scV9wYW5lbF9wb3dlcl9vbihkc3NkZXYpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciBzaGFycF9scV9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHNoYXJwX2xxX3BhbmVsX3Byb2JlLAotCS5yZW1vdmUJCT0gc2hhcnBfbHFfcGFuZWxfcmVtb3ZlLAotCi0JLmVuYWJsZQkJPSBzaGFycF9scV9wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSBzaGFycF9scV9wYW5lbF9kaXNhYmxlLAotCS5zdXNwZW5kCT0gc2hhcnBfbHFfcGFuZWxfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNoYXJwX2xxX3BhbmVsX3Jlc3VtZSwKLQotCS5kcml2ZXIgICAgICAgICA9IHsKLQkJLm5hbWUgICA9ICJzaGFycF9scV9wYW5lbCIsCi0JCS5vd25lciAgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc2hhcnBfbHFfcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZzaGFycF9scV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2hhcnBfbHFfcGFuZWxfZHJ2X2V4aXQodm9pZCkKLXsKLQlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmc2hhcnBfbHFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2hhcnBfbHFfcGFuZWxfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoc2hhcnBfbHFfcGFuZWxfZHJ2X2V4aXQpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYwppbmRleCBlMWM3NjVkLi42MTAyNmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyB0YWFsX2JsX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyB0YWFsX2JsX29wcyA9IHsKIAkuZ2V0X2JyaWdodG5lc3MgPSB0YWFsX2JsX2dldF9pbnRlbnNpdHksCiAJLnVwZGF0ZV9zdGF0dXMgID0gdGFhbF9ibF91cGRhdGVfc3RhdHVzLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdG9wcG9seS10ZG8zNXMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdG9wcG9seS10ZG8zNXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2ZTkwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRvcHBvbHktdGRvMzVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIExDRCBwYW5lbCBkcml2ZXIgZm9yIFRvcHBvbHkgVERPMzVTCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IENvbXB1TGFiLCBMdGQuCi0gKiBBdXRob3I6IE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+Ci0gKgotICogQmFzZWQgb24gZ2VuZXJpYyBwYW5lbCBzdXBwb3J0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KLSAqIEF1dGhvcjogVG9taSBWYWxrZWluZW4gPHRvbWkudmFsa2VpbmVuQG5va2lhLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8cGxhdC9kaXNwbGF5Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHRvcHBvbHlfdGRvX3BhbmVsX3RpbWluZ3MgPSB7Ci0JLyogNjQwIHggNDgwIEAgNjAgSHogIFJlZHVjZWQgYmxhbmtpbmcgVkVTQSBDVlQgMC4zMU0zLVIgKi8KLQkueF9yZXMJCT0gNDgwLAotCS55X3JlcwkJPSA2NDAsCi0KLQkucGl4ZWxfY2xvY2sJPSAyNjAwMCwKLQotCS5oZnAJCT0gMTA0LAotCS5oc3cJCT0gOCwKLQkuaGJwCQk9IDgsCi0KLQkudmZwCQk9IDQsCi0JLnZzdwkJPSAyLAotCS52YnAJCT0gMiwKLX07Ci0KLXN0YXRpYyBpbnQgdG9wcG9seV90ZG9fcGFuZWxfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCWludCByOwotCi0JaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCi0JCXJldHVybiAwOwotCi0JciA9IG9tYXBkc3NfZHBpX2Rpc3BsYXlfZW5hYmxlKGRzc2Rldik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyMDsKLQotCWlmIChkc3NkZXYtPnBsYXRmb3JtX2VuYWJsZSkgewotCQlyID0gZHNzZGV2LT5wbGF0Zm9ybV9lbmFibGUoZHNzZGV2KTsKLQkJaWYgKHIpCi0JCQlnb3RvIGVycjE7Ci0JfQotCi0JcmV0dXJuIDA7Ci1lcnIxOgotCW9tYXBkc3NfZHBpX2Rpc3BsYXlfZGlzYWJsZShkc3NkZXYpOwotZXJyMDoKLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgdG9wcG9seV90ZG9fcGFuZWxfcG93ZXJfb2ZmKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpZiAoZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKLQkJcmV0dXJuOwotCi0JaWYgKGRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZSkKLQkJZHNzZGV2LT5wbGF0Zm9ybV9kaXNhYmxlKGRzc2Rldik7Ci0KLQlvbWFwZHNzX2RwaV9kaXNwbGF5X2Rpc2FibGUoZHNzZGV2KTsKLX0KLQotc3RhdGljIGludCB0b3Bwb2x5X3Rkb19wYW5lbF9wcm9iZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JZHNzZGV2LT5wYW5lbC5jb25maWcgPSBPTUFQX0RTU19MQ0RfVEZUIHwKLQkJCSAgICAgICBPTUFQX0RTU19MQ0RfSVZTIHwKLQkJCSAgICAgICBPTUFQX0RTU19MQ0RfSUhTIHwKLQkJCSAgICAgICBPTUFQX0RTU19MQ0RfSVBDIHwKLQkJCSAgICAgICBPTUFQX0RTU19MQ0RfT05PRkY7Ci0KLQlkc3NkZXYtPnBhbmVsLnRpbWluZ3MgPSB0b3Bwb2x5X3Rkb19wYW5lbF90aW1pbmdzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRvcHBvbHlfdGRvX3BhbmVsX3JlbW92ZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci19Ci0KLXN0YXRpYyBpbnQgdG9wcG9seV90ZG9fcGFuZWxfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpbnQgciA9IDA7Ci0KLQlyID0gdG9wcG9seV90ZG9fcGFuZWxfcG93ZXJfb24oZHNzZGV2KTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdG9wcG9seV90ZG9fcGFuZWxfZGlzYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCi17Ci0JdG9wcG9seV90ZG9fcGFuZWxfcG93ZXJfb2ZmKGRzc2Rldik7Ci0KLQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRDsKLX0KLQotc3RhdGljIGludCB0b3Bwb2x5X3Rkb19wYW5lbF9zdXNwZW5kKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQl0b3Bwb2x5X3Rkb19wYW5lbF9wb3dlcl9vZmYoZHNzZGV2KTsKLQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdG9wcG9seV90ZG9fcGFuZWxfcmVzdW1lKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlpbnQgciA9IDA7Ci0KLQlyID0gdG9wcG9seV90ZG9fcGFuZWxfcG93ZXJfb24oZHNzZGV2KTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlkc3NkZXYtPnN0YXRlID0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgZ2VuZXJpY19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHRvcHBvbHlfdGRvX3BhbmVsX3Byb2JlLAotCS5yZW1vdmUJCT0gdG9wcG9seV90ZG9fcGFuZWxfcmVtb3ZlLAotCi0JLmVuYWJsZQkJPSB0b3Bwb2x5X3Rkb19wYW5lbF9lbmFibGUsCi0JLmRpc2FibGUJPSB0b3Bwb2x5X3Rkb19wYW5lbF9kaXNhYmxlLAotCS5zdXNwZW5kCT0gdG9wcG9seV90ZG9fcGFuZWxfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHRvcHBvbHlfdGRvX3BhbmVsX3Jlc3VtZSwKLQotCS5kcml2ZXIgICAgICAgICA9IHsKLQkJLm5hbWUgICA9ICJ0b3Bwb2x5X3RkbzM1c19wYW5lbCIsCi0JCS5vd25lciAgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdG9wcG9seV90ZG9fcGFuZWxfZHJ2X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZnZW5lcmljX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0b3Bwb2x5X3Rkb19wYW5lbF9kcnZfZXhpdCh2b2lkKQotewotCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZnZW5lcmljX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHRvcHBvbHlfdGRvX3BhbmVsX2Rydl9pbml0KTsKLW1vZHVsZV9leGl0KHRvcHBvbHlfdGRvX3BhbmVsX2Rydl9leGl0KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCmluZGV4IGZhNDBmYTUuLjlmOGM2OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwpAQCAtNDQsMzQgKzQ0LDQwIEBACiAvKiBESVNQQyAqLwogI2RlZmluZSBESVNQQ19CQVNFCQkJMHg0ODA1MDQwMAogCi0jZGVmaW5lIERJU1BDX1NaX1JFR1MJCQlTWl8xSworI2RlZmluZSBESVNQQ19TWl9SRUdTCQkJU1pfNEsKIAogc3RydWN0IGRpc3BjX3JlZyB7IHUxNiBpZHg7IH07CiAKICNkZWZpbmUgRElTUENfUkVHKGlkeCkJCQkoKGNvbnN0IHN0cnVjdCBkaXNwY19yZWcpIHsgaWR4IH0pCiAKLS8qIERJU1BDIGNvbW1vbiAqLworLyoKKyAqIERJU1BDIGNvbW1vbiByZWdpc3RlcnMgYW5kCisgKiBESVNQQyBjaGFubmVsIHJlZ2lzdGVycyAsIGNoID0gMCBmb3IgTENELCBjaCA9IDEgZm9yCisgKiBESUdJVCwgYW5kIGNoID0gMiBmb3IgTENEMgorICovCiAjZGVmaW5lIERJU1BDX1JFVklTSU9OCQkJRElTUENfUkVHKDB4MDAwMCkKICNkZWZpbmUgRElTUENfU1lTQ09ORklHCQkJRElTUENfUkVHKDB4MDAxMCkKICNkZWZpbmUgRElTUENfU1lTU1RBVFVTCQkJRElTUENfUkVHKDB4MDAxNCkKICNkZWZpbmUgRElTUENfSVJRU1RBVFVTCQkJRElTUENfUkVHKDB4MDAxOCkKICNkZWZpbmUgRElTUENfSVJRRU5BQkxFCQkJRElTUENfUkVHKDB4MDAxQykKICNkZWZpbmUgRElTUENfQ09OVFJPTAkJCURJU1BDX1JFRygweDAwNDApCisjZGVmaW5lIERJU1BDX0NPTlRST0wyCQkJRElTUENfUkVHKDB4MDIzOCkKICNkZWZpbmUgRElTUENfQ09ORklHCQkJRElTUENfUkVHKDB4MDA0NCkKKyNkZWZpbmUgRElTUENfQ09ORklHMgkJCURJU1BDX1JFRygweDA2MjApCiAjZGVmaW5lIERJU1BDX0NBUEFCTEUJCQlESVNQQ19SRUcoMHgwMDQ4KQotI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SMAkJRElTUENfUkVHKDB4MDA0QykKLSNkZWZpbmUgRElTUENfREVGQVVMVF9DT0xPUjEJCURJU1BDX1JFRygweDAwNTApCi0jZGVmaW5lIERJU1BDX1RSQU5TX0NPTE9SMAkJRElTUENfUkVHKDB4MDA1NCkKLSNkZWZpbmUgRElTUENfVFJBTlNfQ09MT1IxCQlESVNQQ19SRUcoMHgwMDU4KQorI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SKGNoKQkJRElTUENfUkVHKGNoID09IDAgPyAweDAwNEMgOiBcCisJCQkJCShjaCA9PSAxID8gMHgwMDUwIDogMHgwM0FDKSkKKyNkZWZpbmUgRElTUENfVFJBTlNfQ09MT1IoY2gpCQlESVNQQ19SRUcoY2ggPT0gMCA/IDB4MDA1NCA6IFwKKwkJCQkJKGNoID09IDEgPyAweDAwNTggOiAweDAzQjApKQogI2RlZmluZSBESVNQQ19MSU5FX1NUQVRVUwkJRElTUENfUkVHKDB4MDA1QykKICNkZWZpbmUgRElTUENfTElORV9OVU1CRVIJCURJU1BDX1JFRygweDAwNjApCi0jZGVmaW5lIERJU1BDX1RJTUlOR19ICQkJRElTUENfUkVHKDB4MDA2NCkKLSNkZWZpbmUgRElTUENfVElNSU5HX1YJCQlESVNQQ19SRUcoMHgwMDY4KQotI2RlZmluZSBESVNQQ19QT0xfRlJFUQkJCURJU1BDX1JFRygweDAwNkMpCi0jZGVmaW5lIERJU1BDX0RJVklTT1IJCQlESVNQQ19SRUcoMHgwMDcwKQorI2RlZmluZSBESVNQQ19USU1JTkdfSChjaCkJCURJU1BDX1JFRyhjaCAhPSAyID8gMHgwMDY0IDogMHgwNDAwKQorI2RlZmluZSBESVNQQ19USU1JTkdfVihjaCkJCURJU1BDX1JFRyhjaCAhPSAyID8gMHgwMDY4IDogMHgwNDA0KQorI2RlZmluZSBESVNQQ19QT0xfRlJFUShjaCkJCURJU1BDX1JFRyhjaCAhPSAyID8gMHgwMDZDIDogMHgwNDA4KQorI2RlZmluZSBESVNQQ19ESVZJU09SKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAwNzAgOiAweDA0MEMpCiAjZGVmaW5lIERJU1BDX0dMT0JBTF9BTFBIQQkJRElTUENfUkVHKDB4MDA3NCkKICNkZWZpbmUgRElTUENfU0laRV9ESUcJCQlESVNQQ19SRUcoMHgwMDc4KQotI2RlZmluZSBESVNQQ19TSVpFX0xDRAkJCURJU1BDX1JFRygweDAwN0MpCisjZGVmaW5lIERJU1BDX1NJWkVfTENEKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAwN0MgOiAweDAzQ0MpCiAKIC8qIERJU1BDIEdGWCBwbGFuZSAqLwogI2RlZmluZSBESVNQQ19HRlhfQkEwCQkJRElTUENfUkVHKDB4MDA4MCkKQEAgLTg2LDEzICs5MiwxMiBAQAogI2RlZmluZSBESVNQQ19HRlhfV0lORE9XX1NLSVAJCURJU1BDX1JFRygweDAwQjQpCiAjZGVmaW5lIERJU1BDX0dGWF9UQUJMRV9CQQkJRElTUENfUkVHKDB4MDBCOCkKIAotI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMQkJRElTUENfUkVHKDB4MDFENCkKLSNkZWZpbmUgRElTUENfREFUQV9DWUNMRTIJCURJU1BDX1JFRygweDAxRDgpCi0jZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUzCQlESVNQQ19SRUcoMHgwMURDKQotCi0jZGVmaW5lIERJU1BDX0NQUl9DT0VGX1IJCURJU1BDX1JFRygweDAyMjApCi0jZGVmaW5lIERJU1BDX0NQUl9DT0VGX0cJCURJU1BDX1JFRygweDAyMjQpCi0jZGVmaW5lIERJU1BDX0NQUl9DT0VGX0IJCURJU1BDX1JFRygweDAyMjgpCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUxKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAxRDQgOiAweDAzQzApCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUyKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAxRDggOiAweDAzQzQpCisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUzKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAxREMgOiAweDAzQzgpCisjZGVmaW5lIERJU1BDX0NQUl9DT0VGX1IoY2gpCQlESVNQQ19SRUcoY2ggIT0gMiA/IDB4MDIyMCA6IDB4MDNCQykKKyNkZWZpbmUgRElTUENfQ1BSX0NPRUZfRyhjaCkJCURJU1BDX1JFRyhjaCAhPSAyID8gMHgwMjI0IDogMHgwM0I4KQorI2RlZmluZSBESVNQQ19DUFJfQ09FRl9CKGNoKQkJRElTUENfUkVHKGNoICE9IDIgPyAweDAyMjggOiAweDAzQjQpCiAKICNkZWZpbmUgRElTUENfR0ZYX1BSRUxPQUQJCURJU1BDX1JFRygweDAyMkMpCiAKQEAgLTIxNywxOCArMjIyLDI5IEBACiAJU1IoSVJRRU5BQkxFKTsKIAlTUihDT05UUk9MKTsKIAlTUihDT05GSUcpOwotCVNSKERFRkFVTFRfQ09MT1IwKTsKLQlTUihERUZBVUxUX0NPTE9SMSk7Ci0JU1IoVFJBTlNfQ09MT1IwKTsKLQlTUihUUkFOU19DT0xPUjEpOworCVNSKERFRkFVTFRfQ09MT1IoMCkpOworCVNSKERFRkFVTFRfQ09MT1IoMSkpOworCVNSKFRSQU5TX0NPTE9SKDApKTsKKwlTUihUUkFOU19DT0xPUigxKSk7CiAJU1IoTElORV9OVU1CRVIpOwotCVNSKFRJTUlOR19IKTsKLQlTUihUSU1JTkdfVik7Ci0JU1IoUE9MX0ZSRVEpOwotCVNSKERJVklTT1IpOworCVNSKFRJTUlOR19IKDApKTsKKwlTUihUSU1JTkdfVigwKSk7CisJU1IoUE9MX0ZSRVEoMCkpOworCVNSKERJVklTT1IoMCkpOwogCVNSKEdMT0JBTF9BTFBIQSk7CiAJU1IoU0laRV9ESUcpOwotCVNSKFNJWkVfTENEKTsKKwlTUihTSVpFX0xDRCgwKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgeworCQlTUihDT05UUk9MMik7CisJCVNSKERFRkFVTFRfQ09MT1IoMikpOworCQlTUihUUkFOU19DT0xPUigyKSk7CisJCVNSKFNJWkVfTENEKDIpKTsKKwkJU1IoVElNSU5HX0goMikpOworCQlTUihUSU1JTkdfVigyKSk7CisJCVNSKFBPTF9GUkVRKDIpKTsKKwkJU1IoRElWSVNPUigyKSk7CisJCVNSKENPTkZJRzIpOworCX0KIAogCVNSKEdGWF9CQTApOwogCVNSKEdGWF9CQTEpOwpAQCAtMjQxLDEzICsyNTcsMjIgQEAKIAlTUihHRlhfV0lORE9XX1NLSVApOwogCVNSKEdGWF9UQUJMRV9CQSk7CiAKLQlTUihEQVRBX0NZQ0xFMSk7Ci0JU1IoREFUQV9DWUNMRTIpOwotCVNSKERBVEFfQ1lDTEUzKTsKKwlTUihEQVRBX0NZQ0xFMSgwKSk7CisJU1IoREFUQV9DWUNMRTIoMCkpOworCVNSKERBVEFfQ1lDTEUzKDApKTsKIAotCVNSKENQUl9DT0VGX1IpOwotCVNSKENQUl9DT0VGX0cpOwotCVNSKENQUl9DT0VGX0IpOworCVNSKENQUl9DT0VGX1IoMCkpOworCVNSKENQUl9DT0VGX0coMCkpOworCVNSKENQUl9DT0VGX0IoMCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKKwkJU1IoQ1BSX0NPRUZfQigyKSk7CisJCVNSKENQUl9DT0VGX0coMikpOworCQlTUihDUFJfQ09FRl9SKDIpKTsKKworCQlTUihEQVRBX0NZQ0xFMSgyKSk7CisJCVNSKERBVEFfQ1lDTEUyKDIpKTsKKwkJU1IoREFUQV9DWUNMRTMoMikpOworCX0KIAogCVNSKEdGWF9QUkVMT0FEKTsKIApAQCAtMzU2LDE4ICszODEsMjggQEAKIAkvKlJSKElSUUVOQUJMRSk7Ki8KIAkvKlJSKENPTlRST0wpOyovCiAJUlIoQ09ORklHKTsKLQlSUihERUZBVUxUX0NPTE9SMCk7Ci0JUlIoREVGQVVMVF9DT0xPUjEpOwotCVJSKFRSQU5TX0NPTE9SMCk7Ci0JUlIoVFJBTlNfQ09MT1IxKTsKKwlSUihERUZBVUxUX0NPTE9SKDApKTsKKwlSUihERUZBVUxUX0NPTE9SKDEpKTsKKwlSUihUUkFOU19DT0xPUigwKSk7CisJUlIoVFJBTlNfQ09MT1IoMSkpOwogCVJSKExJTkVfTlVNQkVSKTsKLQlSUihUSU1JTkdfSCk7Ci0JUlIoVElNSU5HX1YpOwotCVJSKFBPTF9GUkVRKTsKLQlSUihESVZJU09SKTsKKwlSUihUSU1JTkdfSCgwKSk7CisJUlIoVElNSU5HX1YoMCkpOworCVJSKFBPTF9GUkVRKDApKTsKKwlSUihESVZJU09SKDApKTsKIAlSUihHTE9CQUxfQUxQSEEpOwogCVJSKFNJWkVfRElHKTsKLQlSUihTSVpFX0xDRCk7CisJUlIoU0laRV9MQ0QoMCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKKwkJUlIoREVGQVVMVF9DT0xPUigyKSk7CisJCVJSKFRSQU5TX0NPTE9SKDIpKTsKKwkJUlIoU0laRV9MQ0QoMikpOworCQlSUihUSU1JTkdfSCgyKSk7CisJCVJSKFRJTUlOR19WKDIpKTsKKwkJUlIoUE9MX0ZSRVEoMikpOworCQlSUihESVZJU09SKDIpKTsKKwkJUlIoQ09ORklHMik7CisJfQogCiAJUlIoR0ZYX0JBMCk7CiAJUlIoR0ZYX0JBMSk7CkBAIC0zODAsMTMgKzQxNSwyMiBAQAogCVJSKEdGWF9XSU5ET1dfU0tJUCk7CiAJUlIoR0ZYX1RBQkxFX0JBKTsKIAotCVJSKERBVEFfQ1lDTEUxKTsKLQlSUihEQVRBX0NZQ0xFMik7Ci0JUlIoREFUQV9DWUNMRTMpOworCVJSKERBVEFfQ1lDTEUxKDApKTsKKwlSUihEQVRBX0NZQ0xFMigwKSk7CisJUlIoREFUQV9DWUNMRTMoMCkpOwogCi0JUlIoQ1BSX0NPRUZfUik7Ci0JUlIoQ1BSX0NPRUZfRyk7Ci0JUlIoQ1BSX0NPRUZfQik7CisJUlIoQ1BSX0NPRUZfUigwKSk7CisJUlIoQ1BSX0NPRUZfRygwKSk7CisJUlIoQ1BSX0NPRUZfQigwKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgeworCQlSUihEQVRBX0NZQ0xFMSgyKSk7CisJCVJSKERBVEFfQ1lDTEUyKDIpKTsKKwkJUlIoREFUQV9DWUNMRTMoMikpOworCisJCVJSKENQUl9DT0VGX0IoMikpOworCQlSUihDUFJfQ09FRl9HKDIpKTsKKwkJUlIoQ1BSX0NPRUZfUigyKSk7CisJfQogCiAJUlIoR0ZYX1BSRUxPQUQpOwogCkBAIC00OTAsNyArNTM0LDggQEAKIAogCS8qIGVuYWJsZSBsYXN0LCBiZWNhdXNlIExDRCAmIERJR0lUIGVuYWJsZSBhcmUgaGVyZSAqLwogCVJSKENPTlRST0wpOwotCisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKKwkJUlIoQ09OVFJPTDIpOwogCS8qIGNsZWFyIHNwdXJpb3VzIFNZTkNfTE9TVF9ESUdJVCBpbnRlcnJ1cHRzICovCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0lSUVNUQVRVUywgRElTUENfSVJRX1NZTkNfTE9TVF9ESUdJVCk7CiAKQEAgLTUxNiw0MiArNTYxLDYzIEBACiB7CiAJaW50IGJpdDsKIAotCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQorCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8CisJCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKIAkJYml0ID0gNTsgLyogR09MQ0QgKi8KIAllbHNlCiAJCWJpdCA9IDY7IC8qIEdPRElHSVQgKi8KIAotCXJldHVybiBSRUdfR0VUKERJU1BDX0NPTlRST0wsIGJpdCwgYml0KSA9PSAxOworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJcmV0dXJuIFJFR19HRVQoRElTUENfQ09OVFJPTDIsIGJpdCwgYml0KSA9PSAxOworCWVsc2UKKwkJcmV0dXJuIFJFR19HRVQoRElTUENfQ09OVFJPTCwgYml0LCBiaXQpID09IDE7CiB9CiAKIHZvaWQgZGlzcGNfZ28oZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgYml0OworCWJvb2wgZW5hYmxlX2JpdCwgZ29fYml0OwogCiAJZW5hYmxlX2Nsb2NrcygxKTsKIAotCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQorCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8CisJCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKIAkJYml0ID0gMDsgLyogTENERU5BQkxFICovCiAJZWxzZQogCQliaXQgPSAxOyAvKiBESUdJVEFMRU5BQkxFICovCiAKIAkvKiBpZiB0aGUgY2hhbm5lbCBpcyBub3QgZW5hYmxlZCwgd2UgZG9uJ3QgbmVlZCBHTyAqLwotCWlmIChSRUdfR0VUKERJU1BDX0NPTlRST0wsIGJpdCwgYml0KSA9PSAwKQorCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJZW5hYmxlX2JpdCA9IFJFR19HRVQoRElTUENfQ09OVFJPTDIsIGJpdCwgYml0KSA9PSAxOworCWVsc2UKKwkJZW5hYmxlX2JpdCA9IFJFR19HRVQoRElTUENfQ09OVFJPTCwgYml0LCBiaXQpID09IDE7CisKKwlpZiAoIWVuYWJsZV9iaXQpCiAJCWdvdG8gZW5kOwogCi0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKKwkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQogCQliaXQgPSA1OyAvKiBHT0xDRCAqLwogCWVsc2UKIAkJYml0ID0gNjsgLyogR09ESUdJVCAqLwogCi0JaWYgKFJFR19HRVQoRElTUENfQ09OVFJPTCwgYml0LCBiaXQpID09IDEpIHsKKwlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJCWdvX2JpdCA9IFJFR19HRVQoRElTUENfQ09OVFJPTDIsIGJpdCwgYml0KSA9PSAxOworCWVsc2UKKwkJZ29fYml0ID0gUkVHX0dFVChESVNQQ19DT05UUk9MLCBiaXQsIGJpdCkgPT0gMTsKKworCWlmIChnb19iaXQpIHsKIAkJRFNTRVJSKCJHTyBiaXQgbm90IGRvd24gZm9yIGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwogCQlnb3RvIGVuZDsKIAl9CiAKLQlEU1NEQkcoIkdPICVzXG4iLCBjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8gIkxDRCIgOiAiRElHSVQiKTsKKwlEU1NEQkcoIkdPICVzXG4iLCBjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8gIkxDRCIgOgorCQkoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIgPyAiTENEMiIgOiAiRElHSVQiKSk7CiAKLQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCAxLCBiaXQsIGJpdCk7CisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgMSwgYml0LCBiaXQpOworCWVsc2UKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgMSwgYml0LCBiaXQpOwogZW5kOgogCWVuYWJsZV9jbG9ja3MoMCk7CiB9CkBAIC03NzMsMTMgKzgzOSwyNiBAQAogCWRpc3BjX3dyaXRlX3JlZyh2c2lfcmVnW3BsYW5lLTFdLCB2YWwpOwogfQogCitzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3ByZV9tdWx0X2FscGhhKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCit7CisJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVfTVVMVF9BTFBIQSkpCisJCXJldHVybjsKKworCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBX1ZJRDEpICYmCisJCXBsYW5lID09IE9NQVBfRFNTX1ZJREVPMSkKKwkJcmV0dXJuOworCisJUkVHX0ZMRF9NT0QoZGlzcGNfcmVnX2F0dFtwbGFuZV0sIGVuYWJsZSA/IDEgOiAwLCAyOCwgMjgpOworfQorCiBzdGF0aWMgdm9pZCBfZGlzcGNfc2V0dXBfZ2xvYmFsX2FscGhhKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTggZ2xvYmFsX2FscGhhKQogewogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKIAkJcmV0dXJuOwogCi0JQlVHX09OKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKLQkJCXBsYW5lID09IE9NQVBfRFNTX1ZJREVPMSk7CisJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEFfVklEMSkgJiYKKwkJcGxhbmUgPT0gT01BUF9EU1NfVklERU8xKQorCQlyZXR1cm47CiAKIAlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKQogCQlSRUdfRkxEX01PRChESVNQQ19HTE9CQUxfQUxQSEEsIGdsb2JhbF9hbHBoYSwgNywgMCk7CkBAIC04NTEsNiArOTMwLDcgQEAKIHsKIAlpbnQgc2hpZnQ7CiAJdTMyIHZhbDsKKwlpbnQgY2hhbiA9IDAsIGNoYW4yID0gMDsKIAogCXN3aXRjaCAocGxhbmUpIHsKIAljYXNlIE9NQVBfRFNTX0dGWDoKQEAgLTg2Niw3ICs5NDYsMjkgQEAKIAl9CiAKIAl2YWwgPSBkaXNwY19yZWFkX3JlZyhkaXNwY19yZWdfYXR0W3BsYW5lXSk7Ci0JdmFsID0gRkxEX01PRCh2YWwsIGNoYW5uZWwsIHNoaWZ0LCBzaGlmdCk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgeworCQlzd2l0Y2ggKGNoYW5uZWwpIHsKKwkJY2FzZSBPTUFQX0RTU19DSEFOTkVMX0xDRDoKKwkJCWNoYW4gPSAwOworCQkJY2hhbjIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT01BUF9EU1NfQ0hBTk5FTF9ESUdJVDoKKwkJCWNoYW4gPSAxOworCQkJY2hhbjIgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT01BUF9EU1NfQ0hBTk5FTF9MQ0QyOgorCQkJY2hhbiA9IDA7CisJCQljaGFuMiA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisKKwkJdmFsID0gRkxEX01PRCh2YWwsIGNoYW4sIHNoaWZ0LCBzaGlmdCk7CisJCXZhbCA9IEZMRF9NT0QodmFsLCBjaGFuMiwgMzEsIDMwKTsKKwl9IGVsc2UgeworCQl2YWwgPSBGTERfTU9EKHZhbCwgY2hhbm5lbCwgc2hpZnQsIHNoaWZ0KTsKKwl9CiAJZGlzcGNfd3JpdGVfcmVnKGRpc3BjX3JlZ19hdHRbcGxhbmVdLCB2YWwpOwogfQogCkBAIC05MjMsMTMgKzEwMjUsMTMgQEAKIAllbmFibGVfY2xvY2tzKDApOwogfQogCi12b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCit2b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCiB7CiAJdTMyIHZhbDsKIAlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CiAJdmFsID0gRkxEX1ZBTChoZWlnaHQgLSAxLCAyNiwgMTYpIHwgRkxEX1ZBTCh3aWR0aCAtIDEsIDEwLCAwKTsKIAllbmFibGVfY2xvY2tzKDEpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TSVpFX0xDRCwgdmFsKTsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfU0laRV9MQ0QoY2hhbm5lbCksIHZhbCk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIApAQCAtMTQyNiwxMiArMTUyOCwxMyBAQAogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19mY2xrX2ZpdmVfdGFwcyh1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCi0JCXUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LCBlbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19mY2xrX2ZpdmVfdGFwcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsCisJCXUxNiBoZWlnaHQsIHUxNiBvdXRfd2lkdGgsIHUxNiBvdXRfaGVpZ2h0LAorCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKQogewogCXUzMiBmY2xrID0gMDsKIAkvKiBGSVhNRSB2ZW5jIHBjbGs/ICovCi0JdTY0IHRtcCwgcGNsayA9IGRpc3BjX3BjbGtfcmF0ZSgpOworCXU2NCB0bXAsIHBjbGsgPSBkaXNwY19wY2xrX3JhdGUoY2hhbm5lbCk7CiAKIAlpZiAoaGVpZ2h0ID4gb3V0X2hlaWdodCkgewogCQkvKiBGSVhNRSBnZXQgcmVhbCBkaXNwbGF5IFBQTCAqLwpAQCAtMTQ2Myw4ICsxNTY2LDggQEAKIAlyZXR1cm4gZmNsazsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19mY2xrKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKLQkJdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2ZjbGsoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IHdpZHRoLAorCQl1MTYgaGVpZ2h0LCB1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCkKIHsKIAl1bnNpZ25lZCBpbnQgaGYsIHZmOwogCkBAIC0xNDg4LDcgKzE1OTEsNyBAQAogCQl2ZiA9IDE7CiAKIAkvKiBGSVhNRSB2ZW5jIHBjbGs/ICovCi0JcmV0dXJuIGRpc3BjX3BjbGtfcmF0ZSgpICogdmYgKiBoZjsKKwlyZXR1cm4gZGlzcGNfcGNsa19yYXRlKGNoYW5uZWwpICogdmYgKiBoZjsKIH0KIAogdm9pZCBkaXNwY19zZXRfY2hhbm5lbF9vdXQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsX291dCkKQEAgLTE1MDcsNyArMTYxMCw4IEBACiAJCWJvb2wgaWxhY2UsCiAJCWVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlLAogCQl1OCByb3RhdGlvbiwgaW50IG1pcnJvciwKLQkJdTggZ2xvYmFsX2FscGhhKQorCQl1OCBnbG9iYWxfYWxwaGEsIHU4IHByZV9tdWx0X2FscGhhLAorCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCWNvbnN0IGludCBtYXhkb3duc2NhbGUgPSBjcHVfaXNfb21hcDM0eHgoKSA/IDQgOiAyOwogCWJvb2wgZml2ZV90YXBzID0gMDsKQEAgLTE1MzYsMjkgKzE2NDAsMTIgQEAKIAkJCQloZWlnaHQsIHBvc195LCBvdXRfaGVpZ2h0KTsKIAl9CiAKKwlpZiAoIWRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKHBsYW5lLCBjb2xvcl9tb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAocGxhbmUgPT0gT01BUF9EU1NfR0ZYKSB7CiAJCWlmICh3aWR0aCAhPSBvdXRfd2lkdGggfHwgaGVpZ2h0ICE9IG91dF9oZWlnaHQpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKLQkJY2FzZSBPTUFQX0RTU19DT0xPUl9BUkdCMTY6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfQVJHQjMyOgotCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQkEzMjoKLQkJCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6Ci0JCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0IxMlU6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTY6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgotCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQjI0VToKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCX0gZWxzZSB7CiAJCS8qIHZpZGVvIHBsYW5lICovCiAKQEAgLTE1NzIsNDIgKzE2NTksMTYgQEAKIAkJICAgb3V0X2hlaWdodCA+IGhlaWdodCAqIDgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKLQkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JYMzI6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTJVOgotCQkJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMTY6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfUkdCMjRQOgotCQljYXNlIE9NQVBfRFNTX0NPTE9SX1JHQjI0VToKLQkJCWJyZWFrOwotCi0JCWNhc2UgT01BUF9EU1NfQ09MT1JfQVJHQjE2OgotCQljYXNlIE9NQVBfRFNTX0NPTE9SX0FSR0IzMjoKLQkJY2FzZSBPTUFQX0RTU19DT0xPUl9SR0JBMzI6Ci0JCQlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQV9WSUQxKSAmJgotCQkJCQlwbGFuZSA9PSBPTUFQX0RTU19WSURFTzEpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKLQotCQljYXNlIE9NQVBfRFNTX0NPTE9SX1lVVjI6Ci0JCWNhc2UgT01BUF9EU1NfQ09MT1JfVVlWWToKKwkJaWYgKGNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAorCQkJY29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZKQogCQkJY2NvbnYgPSAxOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CiAKIAkJLyogTXVzdCB1c2UgNS10YXAgZmlsdGVyPyAqLwogCQlmaXZlX3RhcHMgPSBoZWlnaHQgPiBvdXRfaGVpZ2h0ICogMjsKIAogCQlpZiAoIWZpdmVfdGFwcykgewotCQkJZmNsayA9IGNhbGNfZmNsayh3aWR0aCwgaGVpZ2h0LAotCQkJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQpOworCQkJZmNsayA9IGNhbGNfZmNsayhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LCBvdXRfd2lkdGgsCisJCQkJCW91dF9oZWlnaHQpOwogCiAJCQkvKiBUcnkgNS10YXAgZmlsdGVyIGlmIDMtdGFwIGZjbGsgaXMgdG9vIGhpZ2ggKi8KIAkJCWlmIChjcHVfaXNfb21hcDM0eHgoKSAmJiBoZWlnaHQgPiBvdXRfaGVpZ2h0ICYmCkBAIC0xNjIxLDcgKzE2ODIsNyBAQAogCQl9CiAKIAkJaWYgKGZpdmVfdGFwcykKLQkJCWZjbGsgPSBjYWxjX2ZjbGtfZml2ZV90YXBzKHdpZHRoLCBoZWlnaHQsCisJCQlmY2xrID0gY2FsY19mY2xrX2ZpdmVfdGFwcyhjaGFubmVsLCB3aWR0aCwgaGVpZ2h0LAogCQkJCQlvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGNvbG9yX21vZGUpOwogCiAJCURTU0RCRygicmVxdWlyZWQgZmNsayByYXRlID0gJWx1IEh6XG4iLCBmY2xrKTsKQEAgLTE2OTMsOCArMTc1NCw4IEBACiAKIAlfZGlzcGNfc2V0X3JvdGF0aW9uX2F0dHJzKHBsYW5lLCByb3RhdGlvbiwgbWlycm9yLCBjb2xvcl9tb2RlKTsKIAotCWlmIChwbGFuZSAhPSBPTUFQX0RTU19WSURFTzEpCi0JCV9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEocGxhbmUsIGdsb2JhbF9hbHBoYSk7CisJX2Rpc3BjX3NldF9wcmVfbXVsdF9hbHBoYShwbGFuZSwgcHJlX211bHRfYWxwaGEpOworCV9kaXNwY19zZXR1cF9nbG9iYWxfYWxwaGEocGxhbmUsIGdsb2JhbF9hbHBoYSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MTAsMzYgKzE3NzEsNDQgQEAKIAljb21wbGV0ZShjb21wbCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9lbmFibGVfbGNkX291dChib29sIGVuYWJsZSkKK3N0YXRpYyB2b2lkIF9lbmFibGVfbGNkX291dChlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSkKIHsKLQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMCwgMCk7CisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgZW5hYmxlID8gMSA6IDAsIDAsIDApOworCWVsc2UKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDAsIDApOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwY19lbmFibGVfbGNkX291dChib29sIGVuYWJsZSkKK3N0YXRpYyB2b2lkIGRpc3BjX2VuYWJsZV9sY2Rfb3V0KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBjb21wbGV0aW9uIGZyYW1lX2RvbmVfY29tcGxldGlvbjsKIAlib29sIGlzX29uOwogCWludCByOworCXUzMiBpcnE7CiAKIAllbmFibGVfY2xvY2tzKDEpOwogCiAJLyogV2hlbiB3ZSBkaXNhYmxlIExDRCBvdXRwdXQsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBmcmFtZSBpcyBkb25lLgogCSAqIE90aGVyd2lzZSB0aGUgRFNTIGlzIHN0aWxsIHdvcmtpbmcsIGFuZCB0dXJuaW5nIG9mZiB0aGUgY2xvY2tzCiAJICogcHJldmVudHMgRFNTIGZyb20gZ29pbmcgdG8gT0ZGIG1vZGUgKi8KLQlpc19vbiA9IFJFR19HRVQoRElTUENfQ09OVFJPTCwgMCwgMCk7CisJaXNfb24gPSBjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMiA/CisJCQlSRUdfR0VUKERJU1BDX0NPTlRST0wyLCAwLCAwKSA6CisJCQlSRUdfR0VUKERJU1BDX0NPTlRST0wsIDAsIDApOworCisJaXJxID0gY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIgPyBESVNQQ19JUlFfRlJBTUVET05FMiA6CisJCQlESVNQQ19JUlFfRlJBTUVET05FOwogCiAJaWYgKCFlbmFibGUgJiYgaXNfb24pIHsKIAkJaW5pdF9jb21wbGV0aW9uKCZmcmFtZV9kb25lX2NvbXBsZXRpb24pOwogCiAJCXIgPSBvbWFwX2Rpc3BjX3JlZ2lzdGVyX2lzcihkaXNwY19kaXNhYmxlX2lzciwKLQkJCQkmZnJhbWVfZG9uZV9jb21wbGV0aW9uLAotCQkJCURJU1BDX0lSUV9GUkFNRURPTkUpOworCQkJCSZmcmFtZV9kb25lX2NvbXBsZXRpb24sIGlycSk7CiAKIAkJaWYgKHIpCiAJCQlEU1NFUlIoImZhaWxlZCB0byByZWdpc3RlciBGUkFNRURPTkUgaXNyXG4iKTsKIAl9CiAKLQlfZW5hYmxlX2xjZF9vdXQoZW5hYmxlKTsKKwlfZW5hYmxlX2xjZF9vdXQoY2hhbm5lbCwgZW5hYmxlKTsKIAogCWlmICghZW5hYmxlICYmIGlzX29uKSB7CiAJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmcmFtZV9kb25lX2NvbXBsZXRpb24sCkBAIC0xNzQ3LDggKzE4MTYsNyBAQAogCQkJRFNTRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIEZSQU1FIERPTkVcbiIpOwogCiAJCXIgPSBvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKGRpc3BjX2Rpc2FibGVfaXNyLAotCQkJCSZmcmFtZV9kb25lX2NvbXBsZXRpb24sCi0JCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CisJCQkJJmZyYW1lX2RvbmVfY29tcGxldGlvbiwgaXJxKTsKIAogCQlpZiAocikKIAkJCURTU0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgRlJBTUVET05FIGlzclxuIik7CkBAIC0xODE4LDYgKzE4ODYsOCBAQAogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAkJZGlzcGMuaXJxX2Vycm9yX21hc2sgPSBESVNQQ19JUlFfTUFTS19FUlJPUjsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKKwkJCWRpc3BjLmlycV9lcnJvcl9tYXNrIHw9IERJU1BDX0lSUV9TWU5DX0xPU1QyOwogCQlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBESVNQQ19JUlFfU1lOQ19MT1NUX0RJR0lUKTsKIAkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKQEAgLTE4MzIsMTQgKzE5MDIsMTcgQEAKIAkJcmV0dXJuICEhUkVHX0dFVChESVNQQ19DT05UUk9MLCAwLCAwKTsKIAllbHNlIGlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCiAJCXJldHVybiAhIVJFR19HRVQoRElTUENfQ09OVFJPTCwgMSwgMSk7CisJZWxzZSBpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJCXJldHVybiAhIVJFR19HRVQoRElTUENfQ09OVFJPTDIsIDAsIDApOwogCWVsc2UKIAkJQlVHKCk7CiB9CiAKIHZvaWQgZGlzcGNfZW5hYmxlX2NoYW5uZWwoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCiB7Ci0JaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCi0JCWRpc3BjX2VuYWJsZV9sY2Rfb3V0KGVuYWJsZSk7CisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKKwkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlkaXNwY19lbmFibGVfbGNkX291dChjaGFubmVsLCBlbmFibGUpOwogCWVsc2UgaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkKIAkJZGlzcGNfZW5hYmxlX2RpZ2l0X291dChlbmFibGUpOwogCWVsc2UKQEAgLTE4NDgsNiArMTkyMSw5IEBACiAKIHZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWxfcG9sYXJpdHkoYm9vbCBhY3RfaGlnaCkKIHsKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0xDREVOQUJMRVBPTCkpCisJCXJldHVybjsKKwogCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgYWN0X2hpZ2ggPyAxIDogMCwgMjksIDI5KTsKIAllbmFibGVfY2xvY2tzKDApOwpAQCAtMTg1NSw2ICsxOTMxLDkgQEAKIAogdm9pZCBkaXNwY19sY2RfZW5hYmxlX3NpZ25hbChib29sIGVuYWJsZSkKIHsKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0xDREVOQUJMRVNJR05BTCkpCisJCXJldHVybjsKKwogCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDI4LCAyOCk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKQEAgLTE4NjIsMjAgKzE5NDEsMjcgQEAKIAogdm9pZCBkaXNwY19wY2tfZnJlZV9lbmFibGUoYm9vbCBlbmFibGUpCiB7CisJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QQ0tGUkVFRU5BQkxFKSkKKwkJcmV0dXJuOworCiAJZW5hYmxlX2Nsb2NrcygxKTsKIAlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMjcsIDI3KTsKIAllbmFibGVfY2xvY2tzKDApOwogfQogCi12b2lkIGRpc3BjX2VuYWJsZV9maWZvaGFuZGNoZWNrKGJvb2wgZW5hYmxlKQordm9pZCBkaXNwY19lbmFibGVfZmlmb2hhbmRjaGVjayhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSkKIHsKIAllbmFibGVfY2xvY2tzKDEpOwotCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlID8gMSA6IDAsIDE2LCAxNik7CisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUgPyAxIDogMCwgMTYsIDE2KTsKKwllbHNlCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlID8gMSA6IDAsIDE2LCAxNik7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogCi12b2lkIGRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9sY2RfZGlzcGxheV90eXBlIHR5cGUpCit2b2lkIGRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9sY2RfZGlzcGxheV90eXBlIHR5cGUpCiB7CiAJaW50IG1vZGU7CiAKQEAgLTE4OTQsNyArMTk4MCwxMCBAQAogCX0KIAogCWVuYWJsZV9jbG9ja3MoMSk7Ci0JUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgbW9kZSwgMywgMyk7CisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgbW9kZSwgMywgMyk7CisJZWxzZQorCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBtb2RlLCAzLCAzKTsKIAllbmFibGVfY2xvY2tzKDApOwogfQogCkBAIC0xOTA4LDI1ICsxOTk3LDIxIEBACiAKIHZvaWQgZGlzcGNfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQogewotCWNvbnN0IHN0cnVjdCBkaXNwY19yZWcgZGVmX3JlZ1tdID0geyBESVNQQ19ERUZBVUxUX0NPTE9SMCwKLQkJCQlESVNQQ19ERUZBVUxUX0NPTE9SMSB9OwotCiAJZW5hYmxlX2Nsb2NrcygxKTsKLQlkaXNwY193cml0ZV9yZWcoZGVmX3JlZ1tjaGFubmVsXSwgY29sb3IpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ERUZBVUxUX0NPTE9SKGNoYW5uZWwpLCBjb2xvcik7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdTMyIGRpc3BjX2dldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7Ci0JY29uc3Qgc3RydWN0IGRpc3BjX3JlZyBkZWZfcmVnW10gPSB7IERJU1BDX0RFRkFVTFRfQ09MT1IwLAotCQkJCURJU1BDX0RFRkFVTFRfQ09MT1IxIH07CiAJdTMyIGw7CiAKIAlCVUdfT04oY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUICYmCi0JICAgICAgIGNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpOworCQljaGFubmVsICE9IE9NQVBfRFNTX0NIQU5ORUxfTENEICYmCisJCWNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKTsKIAogCWVuYWJsZV9jbG9ja3MoMSk7Ci0JbCA9IGRpc3BjX3JlYWRfcmVnKGRlZl9yZWdbY2hhbm5lbF0pOworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ERUZBVUxUX0NPTE9SKGNoYW5uZWwpKTsKIAllbmFibGVfY2xvY2tzKDApOwogCiAJcmV0dXJuIGw7CkBAIC0xOTM2LDE2ICsyMDIxLDE1IEBACiAJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHlwZSwKIAkJdTMyIHRyYW5zX2tleSkKIHsKLQljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIHRyX3JlZ1tdID0gewotCQlESVNQQ19UUkFOU19DT0xPUjAsIERJU1BDX1RSQU5TX0NPTE9SMSB9OwotCiAJZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgdHlwZSwgMTEsIDExKTsKLQllbHNlIC8qIE9NQVBfRFNTX0NIQU5ORUxfRElHSVQgKi8KKwllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIHR5cGUsIDEzLCAxMyk7CisJZWxzZSAvKiBPTUFQX0RTU19DSEFOTkVMX0xDRDIgKi8KKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHMiwgdHlwZSwgMTEsIDExKTsKIAotCWRpc3BjX3dyaXRlX3JlZyh0cl9yZWdbY2hdLCB0cmFuc19rZXkpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19UUkFOU19DT0xPUihjaCksIHRyYW5zX2tleSk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIApAQCAtMTk1MywyMSArMjAzNywyMCBAQAogCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlICp0eXBlLAogCQl1MzIgKnRyYW5zX2tleSkKIHsKLQljb25zdCBzdHJ1Y3QgZGlzcGNfcmVnIHRyX3JlZ1tdID0gewotCQlESVNQQ19UUkFOU19DT0xPUjAsIERJU1BDX1RSQU5TX0NPTE9SMSB9OwotCiAJZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAodHlwZSkgewogCQlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCQkqdHlwZSA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxMSwgMTEpOwogCQllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQkJKnR5cGUgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTMsIDEzKTsKKwkJZWxzZSBpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQkJKnR5cGUgPSBSRUdfR0VUKERJU1BDX0NPTkZJRzIsIDExLCAxMSk7CiAJCWVsc2UKIAkJCUJVRygpOwogCX0KIAogCWlmICh0cmFuc19rZXkpCi0JCSp0cmFuc19rZXkgPSBkaXNwY19yZWFkX3JlZyh0cl9yZWdbY2hdKTsKKwkJKnRyYW5zX2tleSA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RSQU5TX0NPTE9SKGNoKSk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIApAQCAtMTk3Niw4ICsyMDU5LDEwIEBACiAJZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxMCwgMTApOwotCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCAqLworCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxMiwgMTIpOworCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9MQ0QyICovCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSwgMTAsIDEwKTsKIAllbmFibGVfY2xvY2tzKDApOwogfQogdm9pZCBkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoZW51bSBvbWFwX2NoYW5uZWwgY2gsIGJvb2wgZW5hYmxlKQpAQCAtMTk4OCw4ICsyMDczLDEwIEBACiAJZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxOCwgMTgpOwotCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCAqLworCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCAxOSwgMTkpOworCWVsc2UgLyogT01BUF9EU1NfQ0hBTk5FTF9MQ0QyICovCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSwgMTgsIDE4KTsKIAllbmFibGVfY2xvY2tzKDApOwogfQogYm9vbCBkaXNwY19hbHBoYV9ibGVuZGluZ19lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoKQpAQCAtMjAwMywxMyArMjA5MCwxNCBAQAogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOCwgMTgpOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCi0JCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTgsIDE4KTsKKwkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOSwgMTkpOworCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHMiwgMTgsIDE4KTsKIAllbHNlCiAJCUJVRygpOwogCWVuYWJsZV9jbG9ja3MoMCk7CiAKIAlyZXR1cm4gZW5hYmxlZDsKLQogfQogCiAKQEAgLTIwMjIsNiArMjExMCw4IEBACiAJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTAsIDEwKTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQllbmFibGVkID0gUkVHX0dFVChESVNQQ19DT05GSUcsIDEyLCAxMik7CisJZWxzZSBpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQllbmFibGVkID0gUkVHX0dFVChESVNQQ19DT05GSUcyLCAxMCwgMTApOwogCWVsc2UKIAkJQlVHKCk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKQEAgLTIwMzAsNyArMjEyMCw3IEBACiB9CiAKIAotdm9pZCBkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXModTggZGF0YV9saW5lcykKK3ZvaWQgZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHU4IGRhdGFfbGluZXMpCiB7CiAJaW50IGNvZGU7CiAKQEAgLTIwNTMsMTEgKzIxNDMsMTUgQEAKIAl9CiAKIAllbmFibGVfY2xvY2tzKDEpOwotCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGNvZGUsIDksIDgpOworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTDIsIGNvZGUsIDksIDgpOworCWVsc2UKKwkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgY29kZSwgOSwgOCk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAotdm9pZCBkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoZW51bSBvbWFwX3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlIG1vZGUpCit2b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAorCQllbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgbW9kZSkKIHsKIAl1MzIgbDsKIAlpbnQgc3RhbGxtb2RlOwpAQCAtMjA4NywxMyArMjE4MSwxNyBAQAogCiAJZW5hYmxlX2Nsb2NrcygxKTsKIAotCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKLQotCWwgPSBGTERfTU9EKGwsIHN0YWxsbW9kZSwgMTEsIDExKTsKLQlsID0gRkxEX01PRChsLCBncG91dDAsIDE1LCAxNSk7Ci0JbCA9IEZMRF9NT0QobCwgZ3BvdXQxLCAxNiwgMTYpOwotCi0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikgeworCQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTDIpOworCQlsID0gRkxEX01PRChsLCBzdGFsbG1vZGUsIDExLCAxMSk7CisJCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MMiwgbCk7CisJfSBlbHNlIHsKKwkJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wpOworCQlsID0gRkxEX01PRChsLCBzdGFsbG1vZGUsIDExLCAxMSk7CisJCWwgPSBGTERfTU9EKGwsIGdwb3V0MCwgMTUsIDE1KTsKKwkJbCA9IEZMRF9NT0QobCwgZ3BvdXQxLCAxNiwgMTYpOworCQlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7CisJfQogCiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KQEAgLTIxMjksOCArMjIyNyw4IEBACiAJCQl0aW1pbmdzLT52ZnAsIHRpbWluZ3MtPnZicCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfbGNkX3RpbWluZ3MoaW50IGhzdywgaW50IGhmcCwgaW50IGhicCwKLQkJCQkgICBpbnQgdnN3LCBpbnQgdmZwLCBpbnQgdmJwKQorc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9sY2RfdGltaW5ncyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBpbnQgaHN3LAorCQlpbnQgaGZwLCBpbnQgaGJwLCBpbnQgdnN3LCBpbnQgdmZwLCBpbnQgdmJwKQogewogCXUzMiB0aW1pbmdfaCwgdGltaW5nX3Y7CiAKQEAgLTIxNDksMTMgKzIyNDcsMTQgQEAKIAl9CiAKIAllbmFibGVfY2xvY2tzKDEpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfSCwgdGltaW5nX2gpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfViwgdGltaW5nX3YpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfSChjaGFubmVsKSwgdGltaW5nX2gpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfVihjaGFubmVsKSwgdGltaW5nX3YpOwogCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIC8qIGNoYW5nZSBuYW1lIHRvIG1vZGU/ICovCi12b2lkIGRpc3BjX3NldF9sY2RfdGltaW5ncyhzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQordm9pZCBkaXNwY19zZXRfbGNkX3RpbWluZ3MoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKIHsKIAl1bnNpZ25lZCB4dG90LCB5dG90OwogCXVuc2lnbmVkIGxvbmcgaHQsIHZ0OwpAQCAtMjE2NSwxMCArMjI2NCwxMSBAQAogCQkJCXRpbWluZ3MtPnZmcCwgdGltaW5ncy0+dmJwKSkKIAkJQlVHKCk7CiAKLQlfZGlzcGNfc2V0X2xjZF90aW1pbmdzKHRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLCB0aW1pbmdzLT5oYnAsCi0JCQl0aW1pbmdzLT52c3csIHRpbWluZ3MtPnZmcCwgdGltaW5ncy0+dmJwKTsKKwlfZGlzcGNfc2V0X2xjZF90aW1pbmdzKGNoYW5uZWwsIHRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLAorCQkJdGltaW5ncy0+aGJwLCB0aW1pbmdzLT52c3csIHRpbWluZ3MtPnZmcCwKKwkJCXRpbWluZ3MtPnZicCk7CiAKLQlkaXNwY19zZXRfbGNkX3NpemUodGltaW5ncy0+eF9yZXMsIHRpbWluZ3MtPnlfcmVzKTsKKwlkaXNwY19zZXRfbGNkX3NpemUoY2hhbm5lbCwgdGltaW5ncy0+eF9yZXMsIHRpbWluZ3MtPnlfcmVzKTsKIAogCXh0b3QgPSB0aW1pbmdzLT54X3JlcyArIHRpbWluZ3MtPmhmcCArIHRpbWluZ3MtPmhzdyArIHRpbWluZ3MtPmhicDsKIAl5dG90ID0gdGltaW5ncy0+eV9yZXMgKyB0aW1pbmdzLT52ZnAgKyB0aW1pbmdzLT52c3cgKyB0aW1pbmdzLT52YnA7CkBAIC0yMTc2LDcgKzIyNzYsOCBAQAogCWh0ID0gKHRpbWluZ3MtPnBpeGVsX2Nsb2NrICogMTAwMCkgLyB4dG90OwogCXZ0ID0gKHRpbWluZ3MtPnBpeGVsX2Nsb2NrICogMTAwMCkgLyB4dG90IC8geXRvdDsKIAotCURTU0RCRygieHJlcyAldSB5cmVzICV1XG4iLCB0aW1pbmdzLT54X3JlcywgdGltaW5ncy0+eV9yZXMpOworCURTU0RCRygiY2hhbm5lbCAlZCB4cmVzICV1IHlyZXMgJXVcbiIsIGNoYW5uZWwsIHRpbWluZ3MtPnhfcmVzLAorCQkJdGltaW5ncy0+eV9yZXMpOwogCURTU0RCRygicGNrICV1XG4iLCB0aW1pbmdzLT5waXhlbF9jbG9jayk7CiAJRFNTREJHKCJoc3cgJWQgaGZwICVkIGhicCAlZCB2c3cgJWQgdmZwICVkIHZicCAlZFxuIiwKIAkJCXRpbWluZ3MtPmhzdywgdGltaW5ncy0+aGZwLCB0aW1pbmdzLT5oYnAsCkBAIC0yMTg1LDIxICsyMjg2LDIzIEBACiAJRFNTREJHKCJoc3luYyAlbHVIeiwgdnN5bmMgJWx1SHpcbiIsIGh0LCB2dCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BjX3NldF9sY2RfZGl2aXNvcih1MTYgbGNrX2RpdiwgdTE2IHBja19kaXYpCitzdGF0aWMgdm9pZCBkaXNwY19zZXRfbGNkX2Rpdmlzb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTE2IGxja19kaXYsCisJCXUxNiBwY2tfZGl2KQogewogCUJVR19PTihsY2tfZGl2IDwgMSk7CiAJQlVHX09OKHBja19kaXYgPCAyKTsKIAogCWVuYWJsZV9jbG9ja3MoMSk7Ci0JZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1IsCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1IoY2hhbm5lbCksCiAJCQlGTERfVkFMKGxja19kaXYsIDIzLCAxNikgfCBGTERfVkFMKHBja19kaXYsIDcsIDApKTsKIAllbmFibGVfY2xvY2tzKDApOwogfQogCi1zdGF0aWMgdm9pZCBkaXNwY19nZXRfbGNkX2Rpdmlzb3IoaW50ICpsY2tfZGl2LCBpbnQgKnBja19kaXYpCitzdGF0aWMgdm9pZCBkaXNwY19nZXRfbGNkX2Rpdmlzb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgaW50ICpsY2tfZGl2LAorCQlpbnQgKnBja19kaXYpCiB7CiAJdTMyIGw7Ci0JbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKGNoYW5uZWwpKTsKIAkqbGNrX2RpdiA9IEZMRF9HRVQobCwgMjMsIDE2KTsKIAkqcGNrX2RpdiA9IEZMRF9HRVQobCwgNywgMCk7CiB9CkBAIC0yMjE5LDEzICsyMzIyLDEzIEBACiAJcmV0dXJuIHI7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZGlzcGNfbGNsa19yYXRlKHZvaWQpCit1bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCWludCBsY2Q7CiAJdW5zaWduZWQgbG9uZyByOwogCXUzMiBsOwogCi0JbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKGNoYW5uZWwpKTsKIAogCWxjZCA9IEZMRF9HRVQobCwgMjMsIDE2KTsKIApAQCAtMjIzNCwxMyArMjMzNywxMyBAQAogCXJldHVybiByIC8gbGNkOwogfQogCi11bnNpZ25lZCBsb25nIGRpc3BjX3BjbGtfcmF0ZSh2b2lkKQordW5zaWduZWQgbG9uZyBkaXNwY19wY2xrX3JhdGUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgbGNkLCBwY2Q7CiAJdW5zaWduZWQgbG9uZyByOwogCXUzMiBsOwogCi0JbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKGNoYW5uZWwpKTsKIAogCWxjZCA9IEZMRF9HRVQobCwgMjMsIDE2KTsKIAlwY2QgPSBGTERfR0VUKGwsIDcsIDApOwpAQCAtMjI1Niw4ICsyMzU5LDYgQEAKIAogCWVuYWJsZV9jbG9ja3MoMSk7CiAKLQlkaXNwY19nZXRfbGNkX2Rpdmlzb3IoJmxjZCwgJnBjZCk7Ci0KIAlzZXFfcHJpbnRmKHMsICItIERJU1BDIC1cbiIpOwogCiAJc2VxX3ByaW50ZihzLCAiZGlzcGMgZmNsayBzb3VyY2UgPSAlc1xuIiwKQEAgLTIyNjUsOSArMjM2NiwyNSBAQAogCQkJImRzczFfYWx3b25fZmNsayIgOiAiZHNpMV9wbGxfZmNsayIpOwogCiAJc2VxX3ByaW50ZihzLCAiZmNrXHRcdCUtMTZsdVxuIiwgZGlzcGNfZmNsa19yYXRlKCkpOwotCXNlcV9wcmludGYocywgImxja1x0XHQlLTE2bHVsY2sgZGl2XHQldVxuIiwgZGlzcGNfbGNsa19yYXRlKCksIGxjZCk7Ci0Jc2VxX3ByaW50ZihzLCAicGNrXHRcdCUtMTZsdXBjayBkaXZcdCV1XG4iLCBkaXNwY19wY2xrX3JhdGUoKSwgcGNkKTsKIAorCXNlcV9wcmludGYocywgIi0gTENEMSAtXG4iKTsKKworCWRpc3BjX2dldF9sY2RfZGl2aXNvcihPTUFQX0RTU19DSEFOTkVMX0xDRCwgJmxjZCwgJnBjZCk7CisKKwlzZXFfcHJpbnRmKHMsICJsY2tcdFx0JS0xNmx1bGNrIGRpdlx0JXVcbiIsCisJCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLCBsY2QpOworCXNlcV9wcmludGYocywgInBja1x0XHQlLTE2bHVwY2sgZGl2XHQldVxuIiwKKwkJCWRpc3BjX3BjbGtfcmF0ZShPTUFQX0RTU19DSEFOTkVMX0xDRCksIHBjZCk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgeworCQlzZXFfcHJpbnRmKHMsICItIExDRDIgLVxuIik7CisKKwkJZGlzcGNfZ2V0X2xjZF9kaXZpc29yKE9NQVBfRFNTX0NIQU5ORUxfTENEMiwgJmxjZCwgJnBjZCk7CisKKwkJc2VxX3ByaW50ZihzLCAibGNrXHRcdCUtMTZsdWxjayBkaXZcdCV1XG4iLAorCQkJCWRpc3BjX2xjbGtfcmF0ZShPTUFQX0RTU19DSEFOTkVMX0xDRDIpLCBsY2QpOworCQlzZXFfcHJpbnRmKHMsICJwY2tcdFx0JS0xNmx1cGNrIGRpdlx0JXVcbiIsCisJCQkJZGlzcGNfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEMiksIHBjZCk7CisJfQogCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKQEAgLTIzMDksNiArMjQyNiwxMiBAQAogCVBJUyhTWU5DX0xPU1QpOwogCVBJUyhTWU5DX0xPU1RfRElHSVQpOwogCVBJUyhXQUtFVVApOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKKwkJUElTKEZSQU1FRE9ORTIpOworCQlQSVMoVlNZTkMyKTsKKwkJUElTKEFDQklBU19DT1VOVF9TVEFUMik7CisJCVBJUyhTWU5DX0xPU1QyKTsKKwl9CiAjdW5kZWYgUElTCiB9CiAjZW5kaWYKQEAgLTIzMjcsMTkgKzI0NTAsMzAgQEAKIAlEVU1QUkVHKERJU1BDX0NPTlRST0wpOwogCURVTVBSRUcoRElTUENfQ09ORklHKTsKIAlEVU1QUkVHKERJU1BDX0NBUEFCTEUpOwotCURVTVBSRUcoRElTUENfREVGQVVMVF9DT0xPUjApOwotCURVTVBSRUcoRElTUENfREVGQVVMVF9DT0xPUjEpOwotCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IwKTsKLQlEVU1QUkVHKERJU1BDX1RSQU5TX0NPTE9SMSk7CisJRFVNUFJFRyhESVNQQ19ERUZBVUxUX0NPTE9SKDApKTsKKwlEVU1QUkVHKERJU1BDX0RFRkFVTFRfQ09MT1IoMSkpOworCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoMCkpOworCURVTVBSRUcoRElTUENfVFJBTlNfQ09MT1IoMSkpOwogCURVTVBSRUcoRElTUENfTElORV9TVEFUVVMpOwogCURVTVBSRUcoRElTUENfTElORV9OVU1CRVIpOwotCURVTVBSRUcoRElTUENfVElNSU5HX0gpOwotCURVTVBSRUcoRElTUENfVElNSU5HX1YpOwotCURVTVBSRUcoRElTUENfUE9MX0ZSRVEpOwotCURVTVBSRUcoRElTUENfRElWSVNPUik7CisJRFVNUFJFRyhESVNQQ19USU1JTkdfSCgwKSk7CisJRFVNUFJFRyhESVNQQ19USU1JTkdfVigwKSk7CisJRFVNUFJFRyhESVNQQ19QT0xfRlJFUSgwKSk7CisJRFVNUFJFRyhESVNQQ19ESVZJU09SKDApKTsKIAlEVU1QUkVHKERJU1BDX0dMT0JBTF9BTFBIQSk7CiAJRFVNUFJFRyhESVNQQ19TSVpFX0RJRyk7Ci0JRFVNUFJFRyhESVNQQ19TSVpFX0xDRCk7CisJRFVNUFJFRyhESVNQQ19TSVpFX0xDRCgwKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgeworCQlEVU1QUkVHKERJU1BDX0NPTlRST0wyKTsKKwkJRFVNUFJFRyhESVNQQ19DT05GSUcyKTsKKwkJRFVNUFJFRyhESVNQQ19ERUZBVUxUX0NPTE9SKDIpKTsKKwkJRFVNUFJFRyhESVNQQ19UUkFOU19DT0xPUigyKSk7CisJCURVTVBSRUcoRElTUENfVElNSU5HX0goMikpOworCQlEVU1QUkVHKERJU1BDX1RJTUlOR19WKDIpKTsKKwkJRFVNUFJFRyhESVNQQ19QT0xfRlJFUSgyKSk7CisJCURVTVBSRUcoRElTUENfRElWSVNPUigyKSk7CisJCURVTVBSRUcoRElTUENfU0laRV9MQ0QoMikpOworCX0KIAogCURVTVBSRUcoRElTUENfR0ZYX0JBMCk7CiAJRFVNUFJFRyhESVNQQ19HRlhfQkExKTsKQEAgLTIzNTMsMTMgKzI0ODcsMjIgQEAKIAlEVU1QUkVHKERJU1BDX0dGWF9XSU5ET1dfU0tJUCk7CiAJRFVNUFJFRyhESVNQQ19HRlhfVEFCTEVfQkEpOwogCi0JRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMSk7Ci0JRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMik7Ci0JRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMyk7CisJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMSgwKSk7CisJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMigwKSk7CisJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMygwKSk7CiAKLQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IpOwotCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyk7Ci0JRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKTsKKwlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IoMCkpOworCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRygwKSk7CisJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKDApKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CisJCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTEoMikpOworCQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUyKDIpKTsKKwkJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMygyKSk7CisKKwkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9SKDIpKTsKKwkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKDIpKTsKKwkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKDIpKTsKKwl9CiAKIAlEVU1QUkVHKERJU1BDX0dGWF9QUkVMT0FEKTsKIApAQCAtMjQ1OCw4ICsyNjAxLDggQEAKICN1bmRlZiBEVU1QUkVHCiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfcG9sX2ZyZXEoYm9vbCBvbm9mZiwgYm9vbCByZiwgYm9vbCBpZW8sIGJvb2wgaXBjLAotCQkJCWJvb2wgaWhzLCBib29sIGl2cywgdTggYWNiaSwgdTggYWNiKQorc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9wb2xfZnJlcShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIG9ub2ZmLCBib29sIHJmLAorCQlib29sIGllbywgYm9vbCBpcGMsIGJvb2wgaWhzLCBib29sIGl2cywgdTggYWNiaSwgdTggYWNiKQogewogCXUzMiBsID0gMDsKIApAQCAtMjQ3NiwxMyArMjYxOSwxNCBAQAogCWwgfD0gRkxEX1ZBTChhY2IsIDcsIDApOwogCiAJZW5hYmxlX2Nsb2NrcygxKTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfUE9MX0ZSRVEsIGwpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUShjaGFubmVsKSwgbCk7CiAJZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAotdm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYikKK3ZvaWQgZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCWVudW0gb21hcF9wYW5lbF9jb25maWcgY29uZmlnLCB1OCBhY2JpLCB1OCBhY2IpCiB7Ci0JX2Rpc3BjX3NldF9wb2xfZnJlcSgoY29uZmlnICYgT01BUF9EU1NfTENEX09OT0ZGKSAhPSAwLAorCV9kaXNwY19zZXRfcG9sX2ZyZXEoY2hhbm5lbCwgKGNvbmZpZyAmIE9NQVBfRFNTX0xDRF9PTk9GRikgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfUkYpICE9IDAsCiAJCQkoY29uZmlnICYgT01BUF9EU1NfTENEX0lFTykgIT0gMCwKIAkJCShjb25maWcgJiBPTUFQX0RTU19MQ0RfSVBDKSAhPSAwLApAQCAtMjU1MSwyNCArMjY5NSwyNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZGlzcGNfc2V0X2Nsb2NrX2RpdihzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCitpbnQgZGlzcGNfc2V0X2Nsb2NrX2RpdihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAorCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pCiB7CiAJRFNTREJHKCJsY2sgPSAlbHUgKCV1KVxuIiwgY2luZm8tPmxjaywgY2luZm8tPmxja19kaXYpOwogCURTU0RCRygicGNrID0gJWx1ICgldSlcbiIsIGNpbmZvLT5wY2ssIGNpbmZvLT5wY2tfZGl2KTsKIAotCWRpc3BjX3NldF9sY2RfZGl2aXNvcihjaW5mby0+bGNrX2RpdiwgY2luZm8tPnBja19kaXYpOworCWRpc3BjX3NldF9sY2RfZGl2aXNvcihjaGFubmVsLCBjaW5mby0+bGNrX2RpdiwgY2luZm8tPnBja19kaXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBkaXNwY19nZXRfY2xvY2tfZGl2KHN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbykKK2ludCBkaXNwY19nZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbykKIHsKIAl1bnNpZ25lZCBsb25nIGZjazsKIAogCWZjayA9IGRpc3BjX2ZjbGtfcmF0ZSgpOwogCi0JY2luZm8tPmxja19kaXYgPSBSRUdfR0VUKERJU1BDX0RJVklTT1IsIDIzLCAxNik7Ci0JY2luZm8tPnBja19kaXYgPSBSRUdfR0VUKERJU1BDX0RJVklTT1IsIDcsIDApOworCWNpbmZvLT5sY2tfZGl2ID0gUkVHX0dFVChESVNQQ19ESVZJU09SKGNoYW5uZWwpLCAyMywgMTYpOworCWNpbmZvLT5wY2tfZGl2ID0gUkVHX0dFVChESVNQQ19ESVZJU09SKGNoYW5uZWwpLCA3LCAwKTsKIAogCWNpbmZvLT5sY2sgPSBmY2sgLyBjaW5mby0+bGNrX2RpdjsKIAljaW5mby0+cGNrID0gY2luZm8tPmxjayAvIGNpbmZvLT5wY2tfZGl2OwpAQCAtMjcwOCw2ICsyODU0LDggQEAKIAlQSVMoVklEMl9GSUZPX1VOREVSRkxPVyk7CiAJUElTKFNZTkNfTE9TVCk7CiAJUElTKFNZTkNfTE9TVF9ESUdJVCk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKKwkJUElTKFNZTkNfTE9TVDIpOwogI3VuZGVmIFBJUwogCiAJcHJpbnRrKCJcbiIpOwpAQCAtMjkyNiw2ICszMDc0LDQ1IEBACiAJCX0KIAl9CiAKKwlpZiAoZXJyb3JzICYgRElTUENfSVJRX1NZTkNfTE9TVDIpIHsKKwkJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2VyID0gTlVMTDsKKwkJYm9vbCBlbmFibGUgPSBmYWxzZTsKKworCQlEU1NFUlIoIlNZTkNfTE9TVCBmb3IgTENEMiwgZGlzYWJsaW5nIExDRDJcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlfbWFuYWdlcnMoKTsgKytpKSB7CisJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKKwkJCW1nciA9IG9tYXBfZHNzX2dldF9vdmVybGF5X21hbmFnZXIoaSk7CisKKwkJCWlmIChtZ3ItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikgeworCQkJCW1hbmFnZXIgPSBtZ3I7CisJCQkJZW5hYmxlID0gbWdyLT5kZXZpY2UtPnN0YXRlID09CisJCQkJCQlPTUFQX0RTU19ESVNQTEFZX0FDVElWRTsKKwkJCQltZ3ItPmRldmljZS0+ZHJpdmVyLT5kaXNhYmxlKG1nci0+ZGV2aWNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChtYW5hZ2VyKSB7CisJCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSBtYW5hZ2VyLT5kZXZpY2U7CisJCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKKwkJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CisJCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CisKKwkJCQlpZiAoIShvdmwtPmNhcHMgJiBPTUFQX0RTU19PVkxfQ0FQX0RJU1BDKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAob3ZsLT5pZCAhPSAwICYmIG92bC0+bWFuYWdlciA9PSBtYW5hZ2VyKQorCQkJCQlkaXNwY19lbmFibGVfcGxhbmUob3ZsLT5pZCwgMCk7CisJCQl9CisKKwkJCWRpc3BjX2dvKG1hbmFnZXItPmlkKTsKKwkJCW1kZWxheSg1MCk7CisJCQlpZiAoZW5hYmxlKQorCQkJCWRzc2Rldi0+ZHJpdmVyLT5lbmFibGUoZHNzZGV2KTsKKwkJfQorCX0KKwogCWlmIChlcnJvcnMgJiBESVNQQ19JUlFfT0NQX0VSUikgewogCQlEU1NFUlIoIk9DUF9FUlJcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5X21hbmFnZXJzKCk7ICsraSkgewpAQCAtMzAzMyw2ICszMjIwLDggQEAKIAltZW1zZXQoZGlzcGMucmVnaXN0ZXJlZF9pc3IsIDAsIHNpemVvZihkaXNwYy5yZWdpc3RlcmVkX2lzcikpOwogCiAJZGlzcGMuaXJxX2Vycm9yX21hc2sgPSBESVNQQ19JUlFfTUFTS19FUlJPUjsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKQorCQlkaXNwYy5pcnFfZXJyb3JfbWFzayB8PSBESVNQQ19JUlFfU1lOQ19MT1NUMjsKIAogCS8qIHRoZXJlJ3MgU1lOQ19MT1NUX0RJR0lUIHdhaXRpbmcgYWZ0ZXIgZW5hYmxpbmcgdGhlIERTUywKIAkgKiBzbyBjbGVhciBpdCAqLwpAQCAtMzA2NSw3ICszMjU0LDggQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfU1lTQ09ORklHLCBsKTsKIAogCS8qIEZVTkNHQVRFRCAqLwotCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgMSwgOSwgOSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZVTkNHQVRFRCkpCisJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgMSwgOSwgOSk7CiAKIAkvKiBMMyBmaXJld2FsbCBzZXR0aW5nOiBlbmFibGUgYWNjZXNzIHRvIE9DTSBSQU0gKi8KIAkvKiBYWFggdGhpcyBzaG91bGQgYmUgc29tZXdoZXJlIGluIHBsYXQtb21hcCAqLwpAQCAtMzEzOSwxNyArMzMyOSwxOCBAQAogCQkgICAgICAgZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKIAkJICAgICAgIGJvb2wgaWxhY2UsCiAJCSAgICAgICBlbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZSwKLQkJICAgICAgIHU4IHJvdGF0aW9uLCBib29sIG1pcnJvciwgdTggZ2xvYmFsX2FscGhhKQorCQkgICAgICAgdTggcm90YXRpb24sIGJvb2wgbWlycm9yLCB1OCBnbG9iYWxfYWxwaGEsCisJCSAgICAgICB1OCBwcmVfbXVsdF9hbHBoYSwgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgciA9IDA7CiAKIAlEU1NEQkcoImRpc3BjX3NldHVwX3BsYW5lICVkLCBwYSAleCwgc3cgJWQsICVkLCVkLCAlZHglZCAtPiAiCi0JICAgICAgICIlZHglZCwgaWxhY2UgJWQsIGNtb2RlICV4LCByb3QgJWQsIG1pciAlZFxuIiwKKwkgICAgICAgIiVkeCVkLCBpbGFjZSAlZCwgY21vZGUgJXgsIHJvdCAlZCwgbWlyICVkIGNoYW4gJWRcbiIsCiAJICAgICAgIHBsYW5lLCBwYWRkciwgc2NyZWVuX3dpZHRoLCBwb3NfeCwgcG9zX3ksCiAJICAgICAgIHdpZHRoLCBoZWlnaHQsCiAJICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwKIAkgICAgICAgaWxhY2UsIGNvbG9yX21vZGUsCi0JICAgICAgIHJvdGF0aW9uLCBtaXJyb3IpOworCSAgICAgICByb3RhdGlvbiwgbWlycm9yLCBjaGFubmVsKTsKIAogCWVuYWJsZV9jbG9ja3MoMSk7CiAKQEAgLTMxNjEsNyArMzM1Miw4IEBACiAJCQkgICBjb2xvcl9tb2RlLCBpbGFjZSwKIAkJCSAgIHJvdGF0aW9uX3R5cGUsCiAJCQkgICByb3RhdGlvbiwgbWlycm9yLAotCQkJICAgZ2xvYmFsX2FscGhhKTsKKwkJCSAgIGdsb2JhbF9hbHBoYSwKKwkJCSAgIHByZV9tdWx0X2FscGhhLCBjaGFubmVsKTsKIAogCWVuYWJsZV9jbG9ja3MoMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RwaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKaW5kZXggOTYwZTk3Ny4uNzVmYjBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKQEAgLTQwLDggKzQwLDkgQEAKIH0gZHBpOwogCiAjaWZkZWYgQ09ORklHX09NQVAyX0RTU19VU0VfRFNJX1BMTAotc3RhdGljIGludCBkcGlfc2V0X2RzaV9jbGsoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcGNrX3JlcSwKLQkJdW5zaWduZWQgbG9uZyAqZmNrLCBpbnQgKmxja19kaXYsIGludCAqcGNrX2RpdikKK3N0YXRpYyBpbnQgZHBpX3NldF9kc2lfY2xrKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwgYm9vbCBpc190ZnQsCisJCXVuc2lnbmVkIGxvbmcgcGNrX3JlcSwgdW5zaWduZWQgbG9uZyAqZmNrLCBpbnQgKmxja19kaXYsCisJCWludCAqcGNrX2RpdikKIHsKIAlzdHJ1Y3QgZHNpX2Nsb2NrX2luZm8gZHNpX2NpbmZvOwogCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvIGRpc3BjX2NpbmZvOwpAQCAtNTgsNyArNTksNyBAQAogCiAJZHNzX3NlbGVjdF9kaXNwY19jbGtfc291cmNlKERTU19TUkNfRFNJMV9QTExfRkNMSyk7CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2RpdigmZGlzcGNfY2luZm8pOworCXIgPSBkaXNwY19zZXRfY2xvY2tfZGl2KGRzc2Rldi0+bWFuYWdlci0+aWQsICZkaXNwY19jaW5mbyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC02OSw4ICs3MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotc3RhdGljIGludCBkcGlfc2V0X2Rpc3BjX2Nsayhib29sIGlzX3RmdCwgdW5zaWduZWQgbG9uZyBwY2tfcmVxLAotCQl1bnNpZ25lZCBsb25nICpmY2ssIGludCAqbGNrX2RpdiwgaW50ICpwY2tfZGl2KQorc3RhdGljIGludCBkcGlfc2V0X2Rpc3BjX2NsayhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsIGJvb2wgaXNfdGZ0LAorCQl1bnNpZ25lZCBsb25nIHBja19yZXEsIHVuc2lnbmVkIGxvbmcgKmZjaywgaW50ICpsY2tfZGl2LAorCQlpbnQgKnBja19kaXYpCiB7CiAJc3RydWN0IGRzc19jbG9ja19pbmZvIGRzc19jaW5mbzsKIAlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBkaXNwY19jaW5mbzsKQEAgLTg0LDcgKzg2LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyID0gZGlzcGNfc2V0X2Nsb2NrX2RpdigmZGlzcGNfY2luZm8pOworCXIgPSBkaXNwY19zZXRfY2xvY2tfZGl2KGRzc2Rldi0+bWFuYWdlci0+aWQsICZkaXNwY19jaW5mbyk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0xMDcsMTcgKzEwOSwxNyBAQAogCiAJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSzEpOwogCi0JZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+cGFuZWwuY29uZmlnLCBkc3NkZXYtPnBhbmVsLmFjYmksCi0JCQlkc3NkZXYtPnBhbmVsLmFjYik7CisJZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+bWFuYWdlci0+aWQsIGRzc2Rldi0+cGFuZWwuY29uZmlnLAorCQkJZHNzZGV2LT5wYW5lbC5hY2JpLCBkc3NkZXYtPnBhbmVsLmFjYik7CiAKIAlpc190ZnQgPSAoZHNzZGV2LT5wYW5lbC5jb25maWcgJiBPTUFQX0RTU19MQ0RfVEZUKSAhPSAwOwogCiAjaWZkZWYgQ09ORklHX09NQVAyX0RTU19VU0VfRFNJX1BMTAotCXIgPSBkcGlfc2V0X2RzaV9jbGsoaXNfdGZ0LCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCi0JCQkmZmNrLCAmbGNrX2RpdiwgJnBja19kaXYpOworCXIgPSBkcGlfc2V0X2RzaV9jbGsoZHNzZGV2LCBpc190ZnQsIHQtPnBpeGVsX2Nsb2NrICogMTAwMCwgJmZjaywKKwkJCSZsY2tfZGl2LCAmcGNrX2Rpdik7CiAjZWxzZQotCXIgPSBkcGlfc2V0X2Rpc3BjX2Nsayhpc190ZnQsIHQtPnBpeGVsX2Nsb2NrICogMTAwMCwKLQkJCSZmY2ssICZsY2tfZGl2LCAmcGNrX2Rpdik7CisJciA9IGRwaV9zZXRfZGlzcGNfY2xrKGRzc2RldiwgaXNfdGZ0LCB0LT5waXhlbF9jbG9jayAqIDEwMDAsICZmY2ssCisJCQkmbGNrX2RpdiwgJnBja19kaXYpOwogI2VuZGlmCiAJaWYgKHIpCiAJCWdvdG8gZXJyMDsKQEAgLTEzMiw3ICsxMzQsNyBAQAogCQl0LT5waXhlbF9jbG9jayA9IHBjazsKIAl9CiAKLQlkaXNwY19zZXRfbGNkX3RpbWluZ3ModCk7CisJZGlzcGNfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsIHQpOwogCiBlcnIwOgogCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CkBAIC0xNDUsMTAgKzE0NywxMiBAQAogCiAJaXNfdGZ0ID0gKGRzc2Rldi0+cGFuZWwuY29uZmlnICYgT01BUF9EU1NfTENEX1RGVCkgIT0gMDsKIAotCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKLQlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShpc190ZnQgPyBPTUFQX0RTU19MQ0RfRElTUExBWV9URlQgOgotCQkJT01BUF9EU1NfTENEX0RJU1BMQVlfU1ROKTsKLQlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5waHkuZHBpLmRhdGFfbGluZXMpOworCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLAorCQkJT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUyk7CisJZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgaXNfdGZ0ID8KKwkJCU9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCA6IE9NQVBfRFNTX0xDRF9ESVNQTEFZX1NUTik7CisJZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlkc3NkZXYtPnBoeS5kcGkuZGF0YV9saW5lcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNCw3ICsyMzgsNyBAQAogCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOwogCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CiAJCWRwaV9zZXRfbW9kZShkc3NkZXYpOwotCQlkaXNwY19nbyhPTUFQX0RTU19DSEFOTkVMX0xDRCk7CisJCWRpc3BjX2dvKGRzc2Rldi0+bWFuYWdlci0+aWQpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woZHBpX3NldF90aW1pbmdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKaW5kZXggYWE0ZjdhNS4uZGRmM2EwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKQEAgLTc5Miw3ICs3OTIsOCBAQAogfQogCiAvKiBjYWxjdWxhdGUgY2xvY2sgcmF0ZXMgdXNpbmcgZGl2aWRlcnMgaW4gY2luZm8gKi8KLXN0YXRpYyBpbnQgZHNpX2NhbGNfY2xvY2tfcmF0ZXMoc3RydWN0IGRzaV9jbG9ja19pbmZvICpjaW5mbykKK3N0YXRpYyBpbnQgZHNpX2NhbGNfY2xvY2tfcmF0ZXMoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAorCQlzdHJ1Y3QgZHNpX2Nsb2NrX2luZm8gKmNpbmZvKQogewogCWlmIChjaW5mby0+cmVnbiA9PSAwIHx8IGNpbmZvLT5yZWduID4gUkVHTl9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODEyLDcgKzgxMyw3IEBACiAJCSAqIHdpdGggRFNTMl9GQ0sgc291cmNlIGFsc28gKi8KIAkJY2luZm8tPmhpZ2hmcmVxID0gMDsKIAl9IGVsc2UgewotCQljaW5mby0+Y2xraW4gPSBkaXNwY19wY2xrX3JhdGUoKTsKKwkJY2luZm8tPmNsa2luID0gZGlzcGNfcGNsa19yYXRlKGRzc2Rldi0+bWFuYWdlci0+aWQpOwogCiAJCWlmIChjaW5mby0+Y2xraW4gPCAzMjAwMDAwMCkKIAkJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CkBAIC0xMjA2LDggKzEyMDcsOCBAQAogCiAJc2VxX3ByaW50ZihzLAkiVlBfQ0xLXHRcdCVsdVxuIgogCQkJIlZQX1BDTEtcdFx0JWx1XG4iLAotCQkJZGlzcGNfbGNsa19yYXRlKCksCi0JCQlkaXNwY19wY2xrX3JhdGUoKSk7CisJCQlkaXNwY19sY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpLAorCQkJZGlzcGNfcGNsa19yYXRlKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAKIAllbmFibGVfY2xvY2tzKDApOwogfQpAQCAtMjg4OCw3ICsyODg5LDcgQEAKIAlpZiAoZHNzZGV2LT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKIAkJZHNzX3NldHVwX3BhcnRpYWxfcGxhbmVzKGRzc2RldiwgeCwgeSwgdywgaCwKIAkJCQllbmxhcmdlX3VwZGF0ZV9hcmVhKTsKLQkJZGlzcGNfc2V0X2xjZF9zaXplKCp3LCAqaCk7CisJCWRpc3BjX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCAqdywgKmgpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjk0NywxMiArMjk0OCwxNCBAQAogCQlyZXR1cm4gcjsKIAl9CiAKLQlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOworCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwogCi0JZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKE9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0kpOwotCWRpc3BjX2VuYWJsZV9maWZvaGFuZGNoZWNrKDEpOworCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShkc3NkZXYtPm1hbmFnZXItPmlkLAorCQkJT01BUF9EU1NfUEFSQUxMRUxNT0RFX0RTSSk7CisJZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZHNzZGV2LT5tYW5hZ2VyLT5pZCwgMSk7CiAKLQlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUpOworCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CiAKIAl7CiAJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5ncyA9IHsKQEAgLTI5NjQsNyArMjk2Nyw3IEBACiAJCQkudmJwCQk9IDAsCiAJCX07CiAKLQkJZGlzcGNfc2V0X2xjZF90aW1pbmdzKCZ0aW1pbmdzKTsKKwkJZGlzcGNfc2V0X2xjZF90aW1pbmdzKGRzc2Rldi0+bWFuYWdlci0+aWQsICZ0aW1pbmdzKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI5ODcsNyArMjk5MCw3IEBACiAJY2luZm8ucmVnbSAgPSBkc3NkZXYtPnBoeS5kc2kuZGl2LnJlZ207CiAJY2luZm8ucmVnbTMgPSBkc3NkZXYtPnBoeS5kc2kuZGl2LnJlZ20zOwogCWNpbmZvLnJlZ200ID0gZHNzZGV2LT5waHkuZHNpLmRpdi5yZWdtNDsKLQlyID0gZHNpX2NhbGNfY2xvY2tfcmF0ZXMoJmNpbmZvKTsKKwlyID0gZHNpX2NhbGNfY2xvY2tfcmF0ZXMoZHNzZGV2LCAmY2luZm8pOwogCWlmIChyKSB7CiAJCURTU0VSUigiRmFpbGVkIHRvIGNhbGMgZHNpIGNsb2Nrc1xuIik7CiAJCXJldHVybiByOwpAQCAtMzAxOSw3ICszMDIyLDcgQEAKIAkJcmV0dXJuIHI7CiAJfQogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKSB7CiAJCURTU0VSUigiRmFpbGVkIHRvIHNldCBkaXNwYyBjbG9ja3NcbiIpOwogCQlyZXR1cm4gcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKaW5kZXggNWM3OTQwZC4uYjM5NDk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKQEAgLTMzMyw5ICszMzMsOSBAQAogdm9pZCBkaXNwY19sY2RfZW5hYmxlX3NpZ25hbF9wb2xhcml0eShib29sIGFjdF9oaWdoKTsKIHZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWwoYm9vbCBlbmFibGUpOwogdm9pZCBkaXNwY19wY2tfZnJlZV9lbmFibGUoYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19lbmFibGVfZmlmb2hhbmRjaGVjayhib29sIGVuYWJsZSk7Cit2b2lkIGRpc3BjX2VuYWJsZV9maWZvaGFuZGNoZWNrKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKIAotdm9pZCBkaXNwY19zZXRfbGNkX3NpemUodTE2IHdpZHRoLCB1MTYgaGVpZ2h0KTsKK3ZvaWQgZGlzcGNfc2V0X2xjZF9zaXplKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7CiB2b2lkIGRpc3BjX3NldF9kaWdpdF9zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7CiB1MzIgZGlzcGNfZ2V0X3BsYW5lX2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwogdm9pZCBkaXNwY19zZXR1cF9wbGFuZV9maWZvKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpOwpAQCAtMzU5LDcgKzM1OSw4IEBACiAJCSAgICAgIGJvb2wgaWxhY2UsCiAJCSAgICAgIGVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlLAogCQkgICAgICB1OCByb3RhdGlvbiwgYm9vbCBtaXJyb3IsCi0JCSAgICAgIHU4IGdsb2JhbF9hbHBoYSk7CisJCSAgICAgIHU4IGdsb2JhbF9hbHBoYSwgdTggcHJlX211bHRfYWxwaGEsCisJCSAgICAgIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwogCiBib29sIGRpc3BjX2dvX2J1c3koZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7CiB2b2lkIGRpc3BjX2dvKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwpAQCAtMzY4LDkgKzM2OSwxMSBAQAogaW50IGRpc3BjX2VuYWJsZV9wbGFuZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKTsKIHZvaWQgZGlzcGNfZW5hYmxlX3JlcGxpY2F0aW9uKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpOwogCi12b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgbW9kZSk7Ci12b2lkIGRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyh1OCBkYXRhX2xpbmVzKTsKLXZvaWQgZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZW51bSBvbWFwX2xjZF9kaXNwbGF5X3R5cGUgdHlwZSk7Cit2b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAorCQllbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgbW9kZSk7Cit2b2lkIGRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1OCBkYXRhX2xpbmVzKTsKK3ZvaWQgZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJZW51bSBvbWFwX2xjZF9kaXNwbGF5X3R5cGUgdHlwZSk7CiB2b2lkIGRpc3BjX3NldF9sb2FkbW9kZShlbnVtIG9tYXBfZHNzX2xvYWRfbW9kZSBtb2RlKTsKIAogdm9pZCBkaXNwY19zZXRfZGVmYXVsdF9jb2xvcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MzIgY29sb3IpOwpAQCAtMzg3LDE3ICszOTAsMjEgQEAKIGJvb2wgZGlzcGNfYWxwaGFfYmxlbmRpbmdfZW5hYmxlZChlbnVtIG9tYXBfY2hhbm5lbCBjaCk7CiAKIGJvb2wgZGlzcGNfbGNkX3RpbWluZ3Nfb2soc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncyk7Ci12b2lkIGRpc3BjX3NldF9sY2RfdGltaW5ncyhzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKTsKK3ZvaWQgZGlzcGNfc2V0X2xjZF90aW1pbmdzKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpOwogdW5zaWduZWQgbG9uZyBkaXNwY19mY2xrX3JhdGUodm9pZCk7Ci11bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZSh2b2lkKTsKLXVuc2lnbmVkIGxvbmcgZGlzcGNfcGNsa19yYXRlKHZvaWQpOwotdm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYik7Cit1bnNpZ25lZCBsb25nIGRpc3BjX2xjbGtfcmF0ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKTsKK3Vuc2lnbmVkIGxvbmcgZGlzcGNfcGNsa19yYXRlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpOwordm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJZW51bSBvbWFwX3BhbmVsX2NvbmZpZyBjb25maWcsIHU4IGFjYmksIHU4IGFjYik7CiB2b2lkIGRpc3BjX2ZpbmRfY2xrX2RpdnMoYm9vbCBpc190ZnQsIHVuc2lnbmVkIGxvbmcgcmVxX3BjaywgdW5zaWduZWQgbG9uZyBmY2ssCiAJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CiBpbnQgZGlzcGNfY2FsY19jbG9ja19yYXRlcyh1bnNpZ25lZCBsb25nIGRpc3BjX2ZjbGtfcmF0ZSwKIAkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKLWludCBkaXNwY19zZXRfY2xvY2tfZGl2KHN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7Ci1pbnQgZGlzcGNfZ2V0X2Nsb2NrX2RpdihzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyAqY2luZm8pOworaW50IGRpc3BjX3NldF9jbG9ja19kaXYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJc3RydWN0IGRpc3BjX2Nsb2NrX2luZm8gKmNpbmZvKTsKK2ludCBkaXNwY19nZXRfY2xvY2tfZGl2KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvICpjaW5mbyk7CiAKIAogLyogVkVOQyAqLwpAQCAtNDI0LDggKzQzMSw4IEBACiAKIGludCByZmJpX2NvbmZpZ3VyZShpbnQgcmZiaV9tb2R1bGUsIGludCBicHAsIGludCBsaW5lcyk7CiB2b2lkIHJmYmlfZW5hYmxlX3JmYmkoYm9vbCBlbmFibGUpOwotdm9pZCByZmJpX3RyYW5zZmVyX2FyZWEodTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAotCQkJICAgICB2b2lkIChjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOwordm9pZCByZmJpX3RyYW5zZmVyX2FyZWEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1MTYgd2lkdGgsCisJCXUxNiBoZWlnaHQsIHZvaWQgKGNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CiB2b2lkIHJmYmlfc2V0X3RpbWluZ3MoaW50IHJmYmlfbW9kdWxlLCBzdHJ1Y3QgcmZiaV90aW1pbmdzICp0KTsKIHVuc2lnbmVkIGxvbmcgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCk7CiBpbnQgcmZiaV9pbml0X2Rpc3BsYXkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCmluZGV4IDg2N2Y2OGQuLmNmM2VmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCkBAIC04Miw2ICs4MiwxOCBAQAogCU9NQVBfRElTUExBWV9UWVBFX1ZFTkMsCiB9OwogCitzdGF0aWMgY29uc3QgZW51bSBvbWFwX2Rpc3BsYXlfdHlwZSBvbWFwNF9kc3Nfc3VwcG9ydGVkX2Rpc3BsYXlzW10gPSB7CisJLyogT01BUF9EU1NfQ0hBTk5FTF9MQ0QgKi8KKwlPTUFQX0RJU1BMQVlfVFlQRV9EQkkgfCBPTUFQX0RJU1BMQVlfVFlQRV9EU0ksCisKKwkvKiBPTUFQX0RTU19DSEFOTkVMX0RJR0lUICovCisJT01BUF9ESVNQTEFZX1RZUEVfVkVOQywKKworCS8qIE9NQVBfRFNTX0NIQU5ORUxfTENEMiAqLworCU9NQVBfRElTUExBWV9UWVBFX0RQSSB8IE9NQVBfRElTUExBWV9UWVBFX0RCSSB8CisJT01BUF9ESVNQTEFZX1RZUEVfRFNJLAorfTsKKwogc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb2xvcl9tb2RlIG9tYXAyX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXNbXSA9IHsKIAkvKiBPTUFQX0RTU19HRlggKi8KIAlPTUFQX0RTU19DT0xPUl9DTFVUMSB8IE9NQVBfRFNTX0NPTE9SX0NMVVQyIHwKQEAgLTEyNyw2ICsxMzksMTAgQEAKIAkucmVnX2ZpZWxkcyA9IG9tYXAyX2Rzc19yZWdfZmllbGRzLAogCS5udW1fcmVnX2ZpZWxkcyA9IEFSUkFZX1NJWkUob21hcDJfZHNzX3JlZ19maWVsZHMpLAogCisJLmhhc19mZWF0dXJlCT0KKwkJRkVBVF9MQ0RFTkFCTEVQT0wgfCBGRUFUX0xDREVOQUJMRVNJR05BTCB8CisJCUZFQVRfUENLRlJFRUVOQUJMRSB8IEZFQVRfRlVOQ0dBVEVELAorCiAJLm51bV9tZ3JzID0gMiwKIAkubnVtX292bHMgPSAzLAogCS5zdXBwb3J0ZWRfZGlzcGxheXMgPSBvbWFwMl9kc3Nfc3VwcG9ydGVkX2Rpc3BsYXlzLApAQCAtMTM0LDExICsxNTAsMTQgQEAKIH07CiAKIC8qIE9NQVAzIERTUyBGZWF0dXJlcyAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19mZWF0dXJlcyBvbWFwM19kc3NfZmVhdHVyZXMgPSB7CitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2ZlYXR1cmVzIG9tYXAzNDMwX2Rzc19mZWF0dXJlcyA9IHsKIAkucmVnX2ZpZWxkcyA9IG9tYXAzX2Rzc19yZWdfZmllbGRzLAogCS5udW1fcmVnX2ZpZWxkcyA9IEFSUkFZX1NJWkUob21hcDNfZHNzX3JlZ19maWVsZHMpLAogCi0JLmhhc19mZWF0dXJlCT0gRkVBVF9HTE9CQUxfQUxQSEEsCisJLmhhc19mZWF0dXJlCT0KKwkJRkVBVF9HTE9CQUxfQUxQSEEgfCBGRUFUX0xDREVOQUJMRVBPTCB8CisJCUZFQVRfTENERU5BQkxFU0lHTkFMIHwgRkVBVF9QQ0tGUkVFRU5BQkxFIHwKKwkJRkVBVF9GVU5DR0FURUQsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCkBAIC0xNDYsNiArMTY1LDM2IEBACiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXAzX2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2ZlYXR1cmVzIG9tYXAzNjMwX2Rzc19mZWF0dXJlcyA9IHsKKwkucmVnX2ZpZWxkcyA9IG9tYXAzX2Rzc19yZWdfZmllbGRzLAorCS5udW1fcmVnX2ZpZWxkcyA9IEFSUkFZX1NJWkUob21hcDNfZHNzX3JlZ19maWVsZHMpLAorCisJLmhhc19mZWF0dXJlICAgID0KKwkJRkVBVF9HTE9CQUxfQUxQSEEgfCBGRUFUX0xDREVOQUJMRVBPTCB8CisJCUZFQVRfTENERU5BQkxFU0lHTkFMIHwgRkVBVF9QQ0tGUkVFRU5BQkxFIHwKKwkJRkVBVF9QUkVfTVVMVF9BTFBIQSB8IEZFQVRfRlVOQ0dBVEVELAorCisJLm51bV9tZ3JzID0gMiwKKwkubnVtX292bHMgPSAzLAorCS5zdXBwb3J0ZWRfZGlzcGxheXMgPSBvbWFwM19kc3Nfc3VwcG9ydGVkX2Rpc3BsYXlzLAorCS5zdXBwb3J0ZWRfY29sb3JfbW9kZXMgPSBvbWFwM19kc3Nfc3VwcG9ydGVkX2NvbG9yX21vZGVzLAorfTsKKworLyogT01BUDQgRFNTIEZlYXR1cmVzICovCitzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2ZlYXR1cmVzIG9tYXA0X2Rzc19mZWF0dXJlcyA9IHsKKwkucmVnX2ZpZWxkcyA9IG9tYXAzX2Rzc19yZWdfZmllbGRzLAorCS5udW1fcmVnX2ZpZWxkcyA9IEFSUkFZX1NJWkUob21hcDNfZHNzX3JlZ19maWVsZHMpLAorCisJLmhhc19mZWF0dXJlCT0KKwkJRkVBVF9HTE9CQUxfQUxQSEEgfCBGRUFUX1BSRV9NVUxUX0FMUEhBIHwKKwkJRkVBVF9NR1JfTENEMiwKKworCS5udW1fbWdycyA9IDMsCisJLm51bV9vdmxzID0gMywKKwkuc3VwcG9ydGVkX2Rpc3BsYXlzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9kaXNwbGF5cywKKwkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDNfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKK307CisKIC8qIEZ1bmN0aW9ucyByZXR1cm5pbmcgdmFsdWVzIHJlbGF0ZWQgdG8gYSBEU1MgZmVhdHVyZSAqLwogaW50IGRzc19mZWF0X2dldF9udW1fbWdycyh2b2lkKQogewpAQCAtMTY3LDYgKzIxNiwxMyBAQAogCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5zdXBwb3J0ZWRfY29sb3JfbW9kZXNbcGxhbmVdOwogfQogCitib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSkKK3sKKwlyZXR1cm4gb21hcF9jdXJyZW50X2Rzc19mZWF0dXJlcy0+c3VwcG9ydGVkX2NvbG9yX21vZGVzW3BsYW5lXSAmCisJCQljb2xvcl9tb2RlOworfQorCiAvKiBEU1MgaGFzX2ZlYXR1cmUgY2hlY2sgKi8KIGJvb2wgZHNzX2hhc19mZWF0dXJlKGVudW0gZHNzX2ZlYXRfaWQgaWQpCiB7CkBAIC0xODYsNiArMjQyLDEwIEBACiB7CiAJaWYgKGNwdV9pc19vbWFwMjR4eCgpKQogCQlvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzID0gJm9tYXAyX2Rzc19mZWF0dXJlczsKKwllbHNlIGlmIChjcHVfaXNfb21hcDM2MzAoKSkKKwkJb21hcF9jdXJyZW50X2Rzc19mZWF0dXJlcyA9ICZvbWFwMzYzMF9kc3NfZmVhdHVyZXM7CisJZWxzZSBpZiAoY3B1X2lzX29tYXAzNHh4KCkpCisJCW9tYXBfY3VycmVudF9kc3NfZmVhdHVyZXMgPSAmb21hcDM0MzBfZHNzX2ZlYXR1cmVzOwogCWVsc2UKLQkJb21hcF9jdXJyZW50X2Rzc19mZWF0dXJlcyA9ICZvbWFwM19kc3NfZmVhdHVyZXM7CisJCW9tYXBfY3VycmVudF9kc3NfZmVhdHVyZXMgPSAmb21hcDRfZHNzX2ZlYXR1cmVzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaAppbmRleCBjYjIzMWVhLi5iOWM3MGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaApAQCAtMjAsMTMgKzIwLDE5IEBACiAjaWZuZGVmIF9fT01BUDJfRFNTX0ZFQVRVUkVTX0gKICNkZWZpbmUgX19PTUFQMl9EU1NfRkVBVFVSRVNfSAogCi0jZGVmaW5lIE1BWF9EU1NfTUFOQUdFUlMJMgorI2RlZmluZSBNQVhfRFNTX01BTkFHRVJTCTMKICNkZWZpbmUgTUFYX0RTU19PVkVSTEFZUwkzCiAKIC8qIERTUyBoYXMgZmVhdHVyZSBpZCAqLwogZW51bSBkc3NfZmVhdF9pZCB7CiAJRkVBVF9HTE9CQUxfQUxQSEEJPSAxIDw8IDAsCiAJRkVBVF9HTE9CQUxfQUxQSEFfVklEMQk9IDEgPDwgMSwKKwlGRUFUX1BSRV9NVUxUX0FMUEhBCT0gMSA8PCAyLAorCUZFQVRfTENERU5BQkxFUE9MCT0gMSA8PCAzLAorCUZFQVRfTENERU5BQkxFU0lHTkFMCT0gMSA8PCA0LAorCUZFQVRfUENLRlJFRUVOQUJMRQk9IDEgPDwgNSwKKwlGRUFUX0ZVTkNHQVRFRAkJPSAxIDw8IDYsCisJRkVBVF9NR1JfTENEMgkJPSAxIDw8IDcsCiB9OwogCiAvKiBEU1MgcmVnaXN0ZXIgZmllbGQgaWQgKi8KQEAgLTQzLDYgKzQ5LDggQEAKIGludCBkc3NfZmVhdF9nZXRfbnVtX292bHModm9pZCk7CiBlbnVtIG9tYXBfZGlzcGxheV90eXBlIGRzc19mZWF0X2dldF9zdXBwb3J0ZWRfZGlzcGxheXMoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCk7CiBlbnVtIG9tYXBfY29sb3JfbW9kZSBkc3NfZmVhdF9nZXRfc3VwcG9ydGVkX2NvbG9yX21vZGVzKGVudW0gb21hcF9wbGFuZSBwbGFuZSk7Citib29sIGRzc19mZWF0X2NvbG9yX21vZGVfc3VwcG9ydGVkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKKwkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSk7CiAKIGJvb2wgZHNzX2hhc19mZWF0dXJlKGVudW0gZHNzX2ZlYXRfaWQgaWQpOwogdm9pZCBkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKGVudW0gZHNzX2ZlYXRfcmVnX2ZpZWxkIGlkLCB1OCAqc3RhcnQsIHU4ICplbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jCmluZGV4IDU0NWU5YjkuLjE3MmQ0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKQEAgLTQwNiw2ICs0MDYsNyBAQAogCXUxNiBvdXRfd2lkdGg7CS8qIGlmIDAsIG91dF93aWR0aCA9PSB3aWR0aCAqLwogCXUxNiBvdXRfaGVpZ2h0OwkvKiBpZiAwLCBvdXRfaGVpZ2h0ID09IGhlaWdodCAqLwogCXU4IGdsb2JhbF9hbHBoYTsKKwl1OCBwcmVfbXVsdF9hbHBoYTsKIAogCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWw7CiAJYm9vbCByZXBsaWNhdGlvbjsKQEAgLTUxMiwxMSArNTEzLDE0IEBACiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1MDApOwogCXUzMiBpcnE7CiAKLQlpZiAobWdyLT5kZXZpY2UtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykKKwlpZiAobWdyLT5kZXZpY2UtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykgewogCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERDsKLQllbHNlCi0JCWlycSA9IERJU1BDX0lSUV9WU1lOQzsKLQorCX0gZWxzZSB7CisJCWlmIChtZ3ItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQorCQkJaXJxID0gRElTUENfSVJRX1ZTWU5DOworCQllbHNlCisJCQlpcnEgPSBESVNQQ19JUlFfVlNZTkMyOworCX0KIAlyZXR1cm4gb21hcF9kaXNwY193YWl0X2Zvcl9pcnFfaW50ZXJydXB0aWJsZV90aW1lb3V0KGlycSwgdGltZW91dCk7CiB9CiAKQEAgLTUyNCw3ICs1MjgsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKIAlzdHJ1Y3QgbWFuYWdlcl9jYWNoZV9kYXRhICptYzsKLQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsOwogCXUzMiBpcnE7CiAJaW50IHI7CiAJaW50IGk7CkBAIC01MzUsNyArNTM4LDYgQEAKIAogCWlmIChkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykgewogCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERCB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTjsKLQkJY2hhbm5lbCA9IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQ7CiAJfSBlbHNlIHsKIAkJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKIAkJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZTsKQEAgLTU0MywxMSArNTQ1LDE0IEBACiAJCQlpZiAobW9kZSAhPSBPTUFQX0RTU19VUERBVEVfQVVUTykKIAkJCQlyZXR1cm4gMDsKIAotCQkJaXJxID0gRElTUENfSVJRX0ZSQU1FRE9ORTsKKwkJCWlycSA9IChkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKSA/CisJCQkJRElTUENfSVJRX0ZSQU1FRE9ORQorCQkJCTogRElTUENfSVJRX0ZSQU1FRE9ORTI7CiAJCX0gZWxzZSB7Ci0JCQlpcnEgPSBESVNQQ19JUlFfVlNZTkM7CisJCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPworCQkJCURJU1BDX0lSUV9WU1lOQworCQkJCTogRElTUENfSVJRX1ZTWU5DMjsKIAkJfQotCQljaGFubmVsID0gT01BUF9EU1NfQ0hBTk5FTF9MQ0Q7CiAJfQogCiAJbWMgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbbWdyLT5pZF07CkBAIC01OTQsNyArNTk5LDYgQEAKIGludCBkc3NfbWdyX3dhaXRfZm9yX2dvX292bChzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwpCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1MDApOwotCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWw7CiAJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2M7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OwogCXUzMiBpcnE7CkBAIC02MTEsNyArNjE1LDYgQEAKIAogCWlmIChkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykgewogCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERCB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTjsKLQkJY2hhbm5lbCA9IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQ7CiAJfSBlbHNlIHsKIAkJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKIAkJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZTsKQEAgLTYxOSwxMSArNjIyLDE0IEBACiAJCQlpZiAobW9kZSAhPSBPTUFQX0RTU19VUERBVEVfQVVUTykKIAkJCQlyZXR1cm4gMDsKIAotCQkJaXJxID0gRElTUENfSVJRX0ZSQU1FRE9ORTsKKwkJCWlycSA9IChkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKSA/CisJCQkJRElTUENfSVJRX0ZSQU1FRE9ORQorCQkJCTogRElTUENfSVJRX0ZSQU1FRE9ORTI7CiAJCX0gZWxzZSB7Ci0JCQlpcnEgPSBESVNQQ19JUlFfVlNZTkM7CisJCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPworCQkJCURJU1BDX0lSUV9WU1lOQworCQkJCTogRElTUENfSVJRX1ZTWU5DMjsKIAkJfQotCQljaGFubmVsID0gT01BUF9EU1NfQ0hBTk5FTF9MQ0Q7CiAJfQogCiAJb2MgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbb3ZsLT5pZF07CkBAIC04NDIsNyArODQ4LDkgQEAKIAkJCWMtPnJvdGF0aW9uX3R5cGUsCiAJCQljLT5yb3RhdGlvbiwKIAkJCWMtPm1pcnJvciwKLQkJCWMtPmdsb2JhbF9hbHBoYSk7CisJCQljLT5nbG9iYWxfYWxwaGEsCisJCQljLT5wcmVfbXVsdF9hbHBoYSwKKwkJCWMtPmNoYW5uZWwpOwogCiAJaWYgKHIpIHsKIAkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCkBAIC04OTQsMTAgKzkwMiwxMCBAQAogCXIgPSAwOwogCWJ1c3kgPSBmYWxzZTsKIAotCW1ncl9idXN5WzBdID0gZGlzcGNfZ29fYnVzeSgwKTsKLQltZ3JfYnVzeVsxXSA9IGRpc3BjX2dvX2J1c3koMSk7Ci0JbWdyX2dvWzBdID0gZmFsc2U7Ci0JbWdyX2dvWzFdID0gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspIHsKKwkJbWdyX2J1c3lbaV0gPSBkaXNwY19nb19idXN5KGkpOworCQltZ3JfZ29baV0gPSBmYWxzZTsKKwl9CiAKIAkvKiBDb21taXQgb3ZlcmxheSBzZXR0aW5ncyAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb3ZsczsgKytpKSB7CkBAIC0xMTU2LDkgKzExNjQsMTAgQEAKIAljb25zdCBpbnQgbnVtX21ncnMgPSBkc3NfZmVhdF9nZXRfbnVtX21ncnMoKTsKIAlpbnQgaSwgcjsKIAlib29sIG1ncl9idXN5W01BWF9EU1NfTUFOQUdFUlNdOworCXUzMiBpcnFfbWFzazsKIAotCW1ncl9idXN5WzBdID0gZGlzcGNfZ29fYnVzeSgwKTsKLQltZ3JfYnVzeVsxXSA9IGRpc3BjX2dvX2J1c3koMSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCisJCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKIAogCXNwaW5fbG9jaygmZHNzX2NhY2hlLmxvY2spOwogCkBAIC0xMTc5LDggKzExODgsOCBAQAogCQlnb3RvIGVuZDsKIAogCS8qIHJlLXJlYWQgYnVzeSBmbGFncyAqLwotCW1ncl9idXN5WzBdID0gZGlzcGNfZ29fYnVzeSgwKTsKLQltZ3JfYnVzeVsxXSA9IGRpc3BjX2dvX2J1c3koMSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9tZ3JzOyBpKyspCisJCW1ncl9idXN5W2ldID0gZGlzcGNfZ29fYnVzeShpKTsKIAogCS8qIGtlZXAgcnVubmluZyBhcyBsb25nIGFzIHRoZXJlIGFyZSBidXN5IG1hbmFnZXJzLCBzbyB0aGF0CiAJICogd2UgY2FuIGNvbGxlY3Qgb3ZlcmxheS1hcHBsaWVkIGluZm9ybWF0aW9uICovCkBAIC0xMTg5LDkgKzExOTgsMTIgQEAKIAkJCWdvdG8gZW5kOwogCX0KIAotCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3IoZHNzX2FwcGx5X2lycV9oYW5kbGVyLCBOVUxMLAotCQkJRElTUENfSVJRX1ZTWU5DCXwgRElTUENfSVJRX0VWU1lOQ19PREQgfAotCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOKTsKKwlpcnFfbWFzayA9IERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9FVlNZTkNfT0REIHwKKwkJCURJU1BDX0lSUV9FVlNZTkNfRVZFTjsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKQorCQlpcnFfbWFzayB8PSBESVNQQ19JUlFfVlNZTkMyOworCisJb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihkc3NfYXBwbHlfaXJxX2hhbmRsZXIsIE5VTEwsIGlycV9tYXNrKTsKIAlkc3NfY2FjaGUuaXJxX2VuYWJsZWQgPSBmYWxzZTsKIAogZW5kOgpAQCAtMTI2NSw2ICsxMjc3LDcgQEAKIAkJb2MtPm91dF93aWR0aCA9IG92bC0+aW5mby5vdXRfd2lkdGg7CiAJCW9jLT5vdXRfaGVpZ2h0ID0gb3ZsLT5pbmZvLm91dF9oZWlnaHQ7CiAJCW9jLT5nbG9iYWxfYWxwaGEgPSBvdmwtPmluZm8uZ2xvYmFsX2FscGhhOworCQlvYy0+cHJlX211bHRfYWxwaGEgPSBvdmwtPmluZm8ucHJlX211bHRfYWxwaGE7CiAKIAkJb2MtPnJlcGxpY2F0aW9uID0KIAkJCWRzc191c2VfcmVwbGljYXRpb24oZHNzZGV2LCBvdmwtPmluZm8uY29sb3JfbW9kZSk7CkBAIC0xMzgzLDkgKzEzOTYsMTQgQEAKIAlyID0gMDsKIAlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CiAJaWYgKCFkc3NfY2FjaGUuaXJxX2VuYWJsZWQpIHsKLQkJciA9IG9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKGRzc19hcHBseV9pcnFfaGFuZGxlciwgTlVMTCwKLQkJCQlESVNQQ19JUlFfVlNZTkMJfCBESVNQQ19JUlFfRVZTWU5DX09ERCB8Ci0JCQkJRElTUENfSVJRX0VWU1lOQ19FVkVOKTsKKwkJdTMyIG1hc2s7CisKKwkJbWFzayA9IERJU1BDX0lSUV9WU1lOQwl8IERJU1BDX0lSUV9FVlNZTkNfT0REIHwKKwkJCURJU1BDX0lSUV9FVlNZTkNfRVZFTjsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkKKwkJCW1hc2sgfD0gRElTUENfSVJRX1ZTWU5DMjsKKworCQlyID0gb21hcF9kaXNwY19yZWdpc3Rlcl9pc3IoZHNzX2FwcGx5X2lycV9oYW5kbGVyLCBOVUxMLCBtYXNrKTsKIAkJZHNzX2NhY2hlLmlycV9lbmFibGVkID0gdHJ1ZTsKIAl9CiAJY29uZmlndXJlX2Rpc3BjKCk7CkBAIC0xNDc3LDYgKzE0OTUsMTAgQEAKIAkJCW1nci0+bmFtZSA9ICJ0diI7CiAJCQltZ3ItPmlkID0gT01BUF9EU1NfQ0hBTk5FTF9ESUdJVDsKIAkJCWJyZWFrOworCQljYXNlIDI6CisJCQltZ3ItPm5hbWUgPSAibGNkMiI7CisJCQltZ3ItPmlkID0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyOworCQkJYnJlYWs7CiAJCX0KIAogCQltZ3ItPnNldF9kZXZpY2UgPSAmb21hcF9kc3Nfc2V0X2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwppbmRleCA3NTY0MmMyLi40NTZlZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCkBAIC0yNTcsNiArMjU3LDQzIEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfcHJlX211bHRfYWxwaGFfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCW92bC0+aW5mby5wcmVfbXVsdF9hbHBoYSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG92ZXJsYXlfcHJlX211bHRfYWxwaGFfc3RvcmUoc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCWludCByOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOworCisJb3ZsLT5nZXRfb3ZlcmxheV9pbmZvKG92bCwgJmluZm8pOworCisJLyogb25seSBHRlggYW5kIFZpZGVvMiBwbGFuZSBzdXBwb3J0IHByZSBhbHBoYSBtdWx0aXBsaWVkCisJICogc2V0IHplcm8gZm9yIFZpZGVvMSBwbGFuZQorCSAqLworCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBX1ZJRDEpICYmCisJCW92bC0+aWQgPT0gT01BUF9EU1NfVklERU8xKQorCQlpbmZvLnByZV9tdWx0X2FscGhhID0gMDsKKwllbHNlCisJCWluZm8ucHJlX211bHRfYWxwaGEgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXIgPSBvdmwtPnNldF9vdmVybGF5X2luZm8ob3ZsLCAmaW5mbyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJaWYgKG92bC0+bWFuYWdlcikgeworCQlyID0gb3ZsLT5tYW5hZ2VyLT5hcHBseShvdmwtPm1hbmFnZXIpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiBzaXplOworfQorCiBzdHJ1Y3Qgb3ZlcmxheV9hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG9tYXBfb3ZlcmxheSAqLCBjaGFyICopOwpAQCAtMjgwLDYgKzMxNyw5IEBACiAJCW92ZXJsYXlfZW5hYmxlZF9zaG93LCBvdmVybGF5X2VuYWJsZWRfc3RvcmUpOwogc3RhdGljIE9WRVJMQVlfQVRUUihnbG9iYWxfYWxwaGEsIFNfSVJVR098U19JV1VTUiwKIAkJb3ZlcmxheV9nbG9iYWxfYWxwaGFfc2hvdywgb3ZlcmxheV9nbG9iYWxfYWxwaGFfc3RvcmUpOworc3RhdGljIE9WRVJMQVlfQVRUUihwcmVfbXVsdF9hbHBoYSwgU19JUlVHT3xTX0lXVVNSLAorCQlvdmVybGF5X3ByZV9tdWx0X2FscGhhX3Nob3csCisJCW92ZXJsYXlfcHJlX211bHRfYWxwaGFfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqb3ZlcmxheV9zeXNmc19hdHRyc1tdID0gewogCSZvdmVybGF5X2F0dHJfbmFtZS5hdHRyLApAQCAtMjkwLDYgKzMzMCw3IEBACiAJJm92ZXJsYXlfYXR0cl9vdXRwdXRfc2l6ZS5hdHRyLAogCSZvdmVybGF5X2F0dHJfZW5hYmxlZC5hdHRyLAogCSZvdmVybGF5X2F0dHJfZ2xvYmFsX2FscGhhLmF0dHIsCisJJm92ZXJsYXlfYXR0cl9wcmVfbXVsdF9hbHBoYS5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTYyMywxMiArNjY0LDIyIEBACiAJaW50IGk7CiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICpsY2RfbWdyOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqdHZfbWdyOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbGNkMl9tZ3IgPSBOVUxMOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyID0gTlVMTDsKIAogCWxjZF9tZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKE9NQVBfRFNTX09WTF9NR1JfTENEKTsKIAl0dl9tZ3IgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheV9tYW5hZ2VyKE9NQVBfRFNTX09WTF9NR1JfVFYpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpCisJCWxjZDJfbWdyID0gb21hcF9kc3NfZ2V0X292ZXJsYXlfbWFuYWdlcihPTUFQX0RTU19PVkxfTUdSX0xDRDIpOwogCi0JaWYgKGRzc2Rldi0+dHlwZSAhPSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DKSB7CisJaWYgKGRzc2Rldi0+Y2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpIHsKKwkJaWYgKCFsY2QyX21nci0+ZGV2aWNlIHx8IGZvcmNlKSB7CisJCQlpZiAobGNkMl9tZ3ItPmRldmljZSkKKwkJCQlsY2QyX21nci0+dW5zZXRfZGV2aWNlKGxjZDJfbWdyKTsKKwkJCWxjZDJfbWdyLT5zZXRfZGV2aWNlKGxjZDJfbWdyLCBkc3NkZXYpOworCQkJbWdyID0gbGNkMl9tZ3I7CisJCX0KKwl9IGVsc2UgaWYgKGRzc2Rldi0+dHlwZSAhPSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DKSB7CiAJCWlmICghbGNkX21nci0+ZGV2aWNlIHx8IGZvcmNlKSB7CiAJCQlpZiAobGNkX21nci0+ZGV2aWNlKQogCQkJCWxjZF9tZ3ItPnVuc2V0X2RldmljZShsY2RfbWdyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYwppbmRleCBiYmU2MjQ2Li4xMGEyZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCkBAIC0zMDEsOCArMzAxLDggQEAKIH0KIEVYUE9SVF9TWU1CT0wob21hcF9yZmJpX3dyaXRlX3BpeGVscyk7CiAKLXZvaWQgcmZiaV90cmFuc2Zlcl9hcmVhKHUxNiB3aWR0aCwgdTE2IGhlaWdodCwKLQkJCSAgICAgdm9pZCAoY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQordm9pZCByZmJpX3RyYW5zZmVyX2FyZWEoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LCB1MTYgd2lkdGgsCisJCXUxNiBoZWlnaHQsIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCiB7CiAJdTMyIGw7CiAKQEAgLTMxMSw5ICszMTEsOSBAQAogCiAJRFNTREJHKCJyZmJpX3RyYW5zZmVyX2FyZWEgJWR4JWRcbiIsIHdpZHRoLCBoZWlnaHQpOwogCi0JZGlzcGNfc2V0X2xjZF9zaXplKHdpZHRoLCBoZWlnaHQpOworCWRpc3BjX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCB3aWR0aCwgaGVpZ2h0KTsKIAotCWRpc3BjX2VuYWJsZV9jaGFubmVsKE9NQVBfRFNTX0NIQU5ORUxfTENELCB0cnVlKTsKKwlkaXNwY19lbmFibGVfY2hhbm5lbChkc3NkZXYtPm1hbmFnZXItPmlkLCB0cnVlKTsKIAogCXJmYmkuZnJhbWVkb25lX2NhbGxiYWNrID0gY2FsbGJhY2s7CiAJcmZiaS5mcmFtZWRvbmVfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CkBAIC04ODcsNyArODg3LDcgQEAKIAogCWlmIChkc3NkZXYtPm1hbmFnZXItPmNhcHMgJiBPTUFQX0RTU19PVkxfTUdSX0NBUF9ESVNQQykgewogCQlkc3Nfc2V0dXBfcGFydGlhbF9wbGFuZXMoZHNzZGV2LCB4LCB5LCB3LCBoLCB0cnVlKTsKLQkJZGlzcGNfc2V0X2xjZF9zaXplKCp3LCAqaCk7CisJCWRpc3BjX3NldF9sY2Rfc2l6ZShkc3NkZXYtPm1hbmFnZXItPmlkLCAqdywgKmgpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODk5LDcgKzg5OSw3IEBACiAJCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqZGF0YSkKIHsKIAlpZiAoZHNzZGV2LT5tYW5hZ2VyLT5jYXBzICYgT01BUF9EU1NfT1ZMX01HUl9DQVBfRElTUEMpIHsKLQkJcmZiaV90cmFuc2Zlcl9hcmVhKHcsIGgsIGNhbGxiYWNrLCBkYXRhKTsKKwkJcmZiaV90cmFuc2Zlcl9hcmVhKGRzc2RldiwgdywgaCwgY2FsbGJhY2ssIGRhdGEpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKIAkJdm9pZCBfX2lvbWVtICphZGRyOwpAQCAtMTAxOCwxMSArMTAxOCwxMyBAQAogCQlnb3RvIGVycjE7CiAJfQogCi0JZGlzcGNfc2V0X2xjZF9kaXNwbGF5X3R5cGUoT01BUF9EU1NfTENEX0RJU1BMQVlfVEZUKTsKKwlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShkc3NkZXYtPm1hbmFnZXItPmlkLAorCQkJT01BUF9EU1NfTENEX0RJU1BMQVlfVEZUKTsKIAotCWRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShPTUFQX0RTU19QQVJBTExFTE1PREVfUkZCSSk7CisJZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19QQVJBTExFTE1PREVfUkZCSSk7CiAKLQlkaXNwY19zZXRfdGZ0X2RhdGFfbGluZXMoZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUpOworCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPmN0cmwucGl4ZWxfc2l6ZSk7CiAKIAlyZmJpX2NvbmZpZ3VyZShkc3NkZXYtPnBoeS5yZmJpLmNoYW5uZWwsCiAJCQkgICAgICAgZHNzZGV2LT5jdHJsLnBpeGVsX3NpemUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCmluZGV4IGVlMDdhM2MuLmI2NGFkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jCkBAIC0zNSwxMiArMzUsMTYgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yICp2ZGRzX3NkaV9yZWc7CiB9IHNkaTsKIAotc3RhdGljIHZvaWQgc2RpX2Jhc2ljX2luaXQodm9pZCkKLXsKLQlkaXNwY19zZXRfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUoT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUyk7CitzdGF0aWMgdm9pZCBzZGlfYmFzaWNfaW5pdChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiAKLQlkaXNwY19zZXRfbGNkX2Rpc3BsYXlfdHlwZShPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOwotCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcygyNCk7Cit7CisJZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19QQVJBTExFTE1PREVfQllQQVNTKTsKKworCWRpc3BjX3NldF9sY2RfZGlzcGxheV90eXBlKGRzc2Rldi0+bWFuYWdlci0+aWQsCisJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQpOworCisJZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsIDI0KTsKIAlkaXNwY19sY2RfZW5hYmxlX3NpZ25hbF9wb2xhcml0eSgxKTsKIH0KIApAQCAtNjgsMjAgKzcyLDIwIEBACiAJaWYgKCFzZGkuc2tpcF9pbml0KQogCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLMSk7CiAKLQlzZGlfYmFzaWNfaW5pdCgpOworCXNkaV9iYXNpY19pbml0KGRzc2Rldik7CiAKIAkvKiAxNS41LjkuMS4yICovCiAJZHNzZGV2LT5wYW5lbC5jb25maWcgfD0gT01BUF9EU1NfTENEX1JGIHwgT01BUF9EU1NfTENEX09OT0ZGOwogCi0JZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+cGFuZWwuY29uZmlnLCBkc3NkZXYtPnBhbmVsLmFjYmksCi0JCQlkc3NkZXYtPnBhbmVsLmFjYik7CisJZGlzcGNfc2V0X3BvbF9mcmVxKGRzc2Rldi0+bWFuYWdlci0+aWQsIGRzc2Rldi0+cGFuZWwuY29uZmlnLAorCQkJZHNzZGV2LT5wYW5lbC5hY2JpLCBkc3NkZXYtPnBhbmVsLmFjYik7CiAKIAlpZiAoIXNkaS5za2lwX2luaXQpIHsKIAkJciA9IGRzc19jYWxjX2Nsb2NrX2RpdigxLCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCiAJCQkJJmRzc19jaW5mbywgJmRpc3BjX2NpbmZvKTsKIAl9IGVsc2UgewogCQlyID0gZHNzX2dldF9jbG9ja19kaXYoJmRzc19jaW5mbyk7Ci0JCXIgPSBkaXNwY19nZXRfY2xvY2tfZGl2KCZkaXNwY19jaW5mbyk7CisJCXIgPSBkaXNwY19nZXRfY2xvY2tfZGl2KGRzc2Rldi0+bWFuYWdlci0+aWQsICZkaXNwY19jaW5mbyk7CiAJfQogCiAJaWYgKHIpCkBAIC0xMDIsMTMgKzEwNiwxMyBAQAogCX0KIAogCi0JZGlzcGNfc2V0X2xjZF90aW1pbmdzKHQpOworCWRpc3BjX3NldF9sY2RfdGltaW5ncyhkc3NkZXYtPm1hbmFnZXItPmlkLCB0KTsKIAogCXIgPSBkc3Nfc2V0X2Nsb2NrX2RpdigmZHNzX2NpbmZvKTsKIAlpZiAocikKIAkJZ290byBlcnIyOwogCi0JciA9IGRpc3BjX3NldF9jbG9ja19kaXYoJmRpc3BjX2NpbmZvKTsKKwlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKQogCQlnb3RvIGVycjI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jCmluZGV4IDZhNzA0ZjEuLjRmZGFiOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwpAQCAtMjEzMiw4ICsyMTMyLDkgQEAKIAljaGFyICpzdHIsICpvcHRpb25zLCAqdGhpc19vcHQ7CiAJaW50IHIgPSAwOwogCi0Jc3RyID0ga21hbGxvYyhzdHJsZW4oZGVmX21vZGUpICsgMSwgR0ZQX0tFUk5FTCk7Ci0Jc3RyY3B5KHN0ciwgZGVmX21vZGUpOworCXN0ciA9IGtzdHJkdXAoZGVmX21vZGUsIEdGUF9LRVJORUwpOworCWlmICghc3RyKQorCQlyZXR1cm4gLUVOT01FTTsKIAlvcHRpb25zID0gc3RyOwogCiAJd2hpbGUgKCFyICYmICh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwppbmRleCA2MThmMzZiLi5kYTM4ODE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvZmJkZXYuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJcmV0dXJuIGJkLT5wcm9wcy5icmlnaHRuZXNzOwogfQogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgcml2YV9ibF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgcml2YV9ibF9vcHMgPSB7CiAJLmdldF9icmlnaHRuZXNzID0gcml2YV9ibF9nZXRfYnJpZ2h0bmVzcywKIAkudXBkYXRlX3N0YXR1cwk9IHJpdmFfYmxfdXBkYXRlX3N0YXR1cywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwppbmRleCA0NmI0MzA5Li42MWM4MTllMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC05MTgsOSArOTE5LDkgQEAKIAl9CiAKIAlpbmZvLT5jbGsgPSBjbGtfZ2V0KE5VTEwsICJsY2QiKTsKLQlpZiAoIWluZm8tPmNsayB8fCBJU19FUlIoaW5mby0+Y2xrKSkgeworCWlmIChJU19FUlIoaW5mby0+Y2xrKSkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBnZXQgbGNkIGNsb2NrIHNvdXJjZVxuIik7Ci0JCXJldCA9IC1FTk9FTlQ7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+Y2xrKTsKIAkJZ290byByZWxlYXNlX2lycTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYyBiL2RyaXZlcnMvdmlkZW8vc2hfbW9iaWxlX2hkbWkuYwppbmRleCA4YzU5Y2M4Li43NGQ5ZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NoX21vYmlsZV9oZG1pLmMKKysrIGIvZHJpdmVycy92aWRlby9zaF9tb2JpbGVfaGRtaS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTIyMSw2ICsyMjIsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgZWRpZF93b3JrOwogCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CiAJc3RydWN0IGZiX21vbnNwZWNzIG1vbnNwZWM7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOwogfTsKIAogc3RhdGljIHZvaWQgaGRtaV93cml0ZShzdHJ1Y3Qgc2hfaGRtaSAqaGRtaSwgdTggZGF0YSwgdTggcmVnKQpAQCAtNzM3LDcgKzczOSw3IEBACiAJc3RydWN0IGZiX21vZGVsaXN0ICptb2RlbGlzdCA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGZfd2lkdGggPSAwLCBmX2hlaWdodCA9IDAsIGZfcmVmcmVzaCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmb3VuZF9yYXRlX2Vycm9yID0gVUxPTkdfTUFYOyAvKiBzaWxseSBjb21waWxlci4uLiAqLwotCWJvb2wgZXhhY3RfbWF0Y2ggPSBmYWxzZTsKKwlib29sIHNjYW5uaW5nID0gZmFsc2UsIHByZWZlcnJlZF9iYWQgPSBmYWxzZTsKIAl1OCBlZGlkWzEyOF07CiAJY2hhciAqZm9yY2VkOwogCWludCBpOwpAQCAtODAwLDYgKzgwMiw5IEBACiAJCWlmIChpIDwgMikgewogCQkJZl93aWR0aCA9IDA7CiAJCQlmX2hlaWdodCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgdXNlciB3YW50cyB1cyB0byB1c2UgdGhlIEVESUQgZGF0YSAqLworCQkJc2Nhbm5pbmcgPSB0cnVlOwogCQl9CiAJCWRldl9kYmcoaGRtaS0+ZGV2LCAiRm9yY2VkIG1vZGUgJXV4JXVAJXVIelxuIiwKIAkJCWZfd2lkdGgsIGZfaGVpZ2h0LCBmX3JlZnJlc2gpOwpAQCAtODA3LDM3ICs4MTIsNTYgQEAKIAogCS8qIFdhbGsgbW9uaXRvciBtb2RlcyB0byBmaW5kIHRoZSBiZXN0IG9yIHRoZSBleGFjdCBtYXRjaCAqLwogCWZvciAoaSA9IDAsIG1vZGUgPSBoZG1pLT5tb25zcGVjLm1vZGVkYjsKLQkgICAgIGZfd2lkdGggJiYgZl9oZWlnaHQgJiYgaSA8IGhkbWktPm1vbnNwZWMubW9kZWRiX2xlbiAmJiAhZXhhY3RfbWF0Y2g7CisJICAgICBpIDwgaGRtaS0+bW9uc3BlYy5tb2RlZGJfbGVuICYmIHNjYW5uaW5nOwogCSAgICAgaSsrLCBtb2RlKyspIHsKIAkJdW5zaWduZWQgbG9uZyByYXRlX2Vycm9yOwogCi0JCS8qIE5vIGludGVyZXN0IGluIHVubWF0Y2hpbmcgbW9kZXMgKi8KLQkJaWYgKGZfd2lkdGggIT0gbW9kZS0+eHJlcyB8fCBmX2hlaWdodCAhPSBtb2RlLT55cmVzKQorCQlpZiAoIWZfd2lkdGggJiYgIWZfaGVpZ2h0KSB7CisJCQkvKgorCQkJICogQSBwYXJhbWV0ZXIgc3RyaW5nICJ2aWRlbz1zaF9tb2JpbGVfbGNkYzoweDAiIG1lYW5zCisJCQkgKiB1c2UgdGhlIHByZWZlcnJlZCBFRElEIG1vZGUuIElmIGl0IGlzIHJlamVjdGVkIGJ5CisJCQkgKiAuZmJfY2hlY2tfdmFyKCksIGtlZXAgbG9va2luZywgdW50aWwgYW4gYWNjZXB0YWJsZQorCQkJICogb25lIGlzIGZvdW5kLgorCQkJICovCisJCQlpZiAoKG1vZGUtPmZsYWcgJiBGQl9NT0RFX0lTX0ZJUlNUKSB8fCBwcmVmZXJyZWRfYmFkKQorCQkJCXNjYW5uaW5nID0gZmFsc2U7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoZl93aWR0aCAhPSBtb2RlLT54cmVzIHx8IGZfaGVpZ2h0ICE9IG1vZGUtPnlyZXMpIHsKKwkJCS8qIE5vIGludGVyZXN0IGluIHVubWF0Y2hpbmcgbW9kZXMgKi8KIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJcmF0ZV9lcnJvciA9IHNoX2hkbWlfcmF0ZV9lcnJvcihoZG1pLCBtb2RlLCBoZG1pX3JhdGUsIHBhcmVudF9yYXRlKTsKIAotCQlpZiAoZl9yZWZyZXNoID09IG1vZGUtPnJlZnJlc2ggfHwgKCFmX3JlZnJlc2ggJiYgIXJhdGVfZXJyb3IpKQotCQkJLyoKLQkJCSAqIEV4YWN0IG1hdGNoIGlmIGVpdGhlciB0aGUgcmVmcmVzaCByYXRlIG1hdGNoZXMgb3IgaXQKLQkJCSAqIGhhc24ndCBiZWVuIHNwZWNpZmllZCBhbmQgd2UndmUgZm91bmQgYSBtb2RlLCBmb3IKLQkJCSAqIHdoaWNoIHdlIGNhbiBjb25maWd1cmUgdGhlIGNsb2NrIHByZWNpc2VseQotCQkJICovCi0JCQlleGFjdF9tYXRjaCA9IHRydWU7Ci0JCWVsc2UgaWYgKGZvdW5kICYmIGZvdW5kX3JhdGVfZXJyb3IgPD0gcmF0ZV9lcnJvcikKLQkJCS8qCi0JCQkgKiBXZSBvdGhlcndpc2Ugc2VhcmNoIGZvciB0aGUgY2xvc2VzdCBtYXRjaGluZyBjbG9jawotCQkJICogcmF0ZSAtIGVpdGhlciBpZiBubyByZWZyZXNoIHJhdGUgaGFzIGJlZW4gc3BlY2lmaWVkCi0JCQkgKiBvciB3ZSBjYW5ub3QgZmluZCBhbiBleGFjdGx5IG1hdGNoaW5nIG9uZQotCQkJICovCi0JCQljb250aW51ZTsKKwkJaWYgKHNjYW5uaW5nKSB7CisJCQlpZiAoZl9yZWZyZXNoID09IG1vZGUtPnJlZnJlc2ggfHwgKCFmX3JlZnJlc2ggJiYgIXJhdGVfZXJyb3IpKQorCQkJCS8qCisJCQkJICogRXhhY3QgbWF0Y2ggaWYgZWl0aGVyIHRoZSByZWZyZXNoIHJhdGUKKwkJCQkgKiBtYXRjaGVzIG9yIGl0IGhhc24ndCBiZWVuIHNwZWNpZmllZCBhbmQgd2UndmUKKwkJCQkgKiBmb3VuZCBhIG1vZGUsIGZvciB3aGljaCB3ZSBjYW4gY29uZmlndXJlIHRoZQorCQkJCSAqIGNsb2NrIHByZWNpc2VseQorCQkJCSAqLworCQkJCXNjYW5uaW5nID0gZmFsc2U7CisJCQllbHNlIGlmIChmb3VuZCAmJiBmb3VuZF9yYXRlX2Vycm9yIDw9IHJhdGVfZXJyb3IpCisJCQkJLyoKKwkJCQkgKiBXZSBvdGhlcndpc2Ugc2VhcmNoIGZvciB0aGUgY2xvc2VzdCBtYXRjaGluZworCQkJCSAqIGNsb2NrIHJhdGUgLSBlaXRoZXIgaWYgbm8gcmVmcmVzaCByYXRlIGhhcworCQkJCSAqIGJlZW4gc3BlY2lmaWVkIG9yIHdlIGNhbm5vdCBmaW5kIGFuIGV4YWN0bHkKKwkJCQkgKiBtYXRjaGluZyBvbmUKKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJfQogCiAJCS8qIENoZWNrIGlmIHN1cHBvcnRlZDogc3VmZmljaWVudCBmYiBtZW1vcnksIHN1cHBvcnRlZCBjbG9jay1yYXRlICovCiAJCWZiX3ZpZGVvbW9kZV90b192YXIodmFyLCBtb2RlKTsKIAorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCiAJCWlmIChpbmZvICYmIGluZm8tPmZib3BzLT5mYl9jaGVja192YXIgJiYKIAkJICAgIGluZm8tPmZib3BzLT5mYl9jaGVja192YXIodmFyLCBpbmZvKSkgewotCQkJZXhhY3RfbWF0Y2ggPSBmYWxzZTsKKwkJCXNjYW5uaW5nID0gdHJ1ZTsKKwkJCXByZWZlcnJlZF9iYWQgPSB0cnVlOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtODU1LDkgKzg3OSw5IEBACiAJICogZHJpdmVyLCBhbmQgcGFzc2luZyAtPmluZm8gd2l0aCBIRE1JIHBsYXRmb3JtIGRhdGEuCiAJICovCiAJaWYgKGluZm8gJiYgIWZvdW5kKSB7Ci0JCW1vZGVsaXN0ID0gaGRtaS0+aW5mby0+bW9kZWxpc3QubmV4dCAmJgotCQkJIWxpc3RfZW1wdHkoJmhkbWktPmluZm8tPm1vZGVsaXN0KSA/Ci0JCQlsaXN0X2VudHJ5KGhkbWktPmluZm8tPm1vZGVsaXN0Lm5leHQsCisJCW1vZGVsaXN0ID0gaW5mby0+bW9kZWxpc3QubmV4dCAmJgorCQkJIWxpc3RfZW1wdHkoJmluZm8tPm1vZGVsaXN0KSA/CisJCQlsaXN0X2VudHJ5KGluZm8tPm1vZGVsaXN0Lm5leHQsCiAJCQkJICAgc3RydWN0IGZiX21vZGVsaXN0LCBsaXN0KSA6CiAJCQlOVUxMOwogCkBAIC0xMTAwLDYgKzExMjQsNyBAQAogCW11dGV4X2xvY2soJmhkbWktPm11dGV4KTsKIAogCWlmIChoZG1pLT5ocF9zdGF0ZSA9PSBIRE1JX0hPVFBMVUdfQ09OTkVDVEVEKSB7CisJCXN0cnVjdCBmYl9pbmZvICppbmZvID0gaGRtaS0+aW5mbzsKIAkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IDAsIGhkbWlfcmF0ZTsKIAogCQkvKiBBIGRldmljZSBoYXMgYmVlbiBwbHVnZ2VkIGluICovCkBAIC0xMTIxLDIyICsxMTQ2LDIxIEBACiAJCS8qIFN3aXRjaGVkIHRvIGFub3RoZXIgKGQpIHBvd2VyLXNhdmUgbW9kZSAqLwogCQltc2xlZXAoMTApOwogCi0JCWlmICghaGRtaS0+aW5mbykKKwkJaWYgKCFpbmZvKQogCQkJZ290byBvdXQ7CiAKLQkJY2ggPSBoZG1pLT5pbmZvLT5wYXI7CisJCWNoID0gaW5mby0+cGFyOwogCiAJCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKIAogCQkvKiBIRE1JIHBsdWcgaW4gKi8KIAkJaWYgKCFzaF9oZG1pX211c3RfcmVjb25maWd1cmUoaGRtaSkgJiYKLQkJICAgIGhkbWktPmluZm8tPnN0YXRlID09IEZCSU5GT19TVEFURV9SVU5OSU5HKSB7CisJCSAgICBpbmZvLT5zdGF0ZSA9PSBGQklORk9fU1RBVEVfUlVOTklORykgewogCQkJLyoKIAkJCSAqIEZpcnN0IGFjdGl2YXRpb24gd2l0aCB0aGUgZGVmYXVsdCBtb25pdG9yIC0ganVzdCB0dXJuCiAJCQkgKiBvbiwgaWYgd2UgcnVuIGEgcmVzdW1lIGhlcmUsIHRoZSBsb2dvIGRpc2FwcGVhcnMKIAkJCSAqLwotCQkJaWYgKGxvY2tfZmJfaW5mbyhoZG1pLT5pbmZvKSkgewotCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvID0gaGRtaS0+aW5mbzsKKwkJCWlmIChsb2NrX2ZiX2luZm8oaW5mbykpIHsKIAkJCQlpbmZvLT52YXIud2lkdGggPSBoZG1pLT52YXIud2lkdGg7CiAJCQkJaW5mby0+dmFyLmhlaWdodCA9IGhkbWktPnZhci5oZWlnaHQ7CiAJCQkJc2hfaGRtaV9kaXNwbGF5X29uKGhkbWksIGluZm8pOwpAQCAtMTE0NCw3ICsxMTY4LDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIE5ldyBtb25pdG9yIG9yIGhhdmUgdG8gd2FrZSB1cCAqLwotCQkJZmJfc2V0X3N1c3BlbmQoaGRtaS0+aW5mbywgMCk7CisJCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKIAkJfQogCiAJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKQEAgLTExNzUsMTMgKzExOTksNiBAQAogfQogCiBzdGF0aWMgaW50IHNoX2hkbWlfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKTsKLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaF9oZG1pX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gc2hfaGRtaV9ub3RpZnksCi19OwotCi1zdGF0aWMgaW50IHNoX2hkbWlfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiAJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBmYl9ldmVudCAqZXZlbnQgPSBkYXRhOwpAQCAtMTE5MCw3ICsxMjA3LDcgQEAKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2xjZGNfYm9hcmRfY2ZnCSpib2FyZF9jZmcgPSAmY2gtPmNmZy5ib2FyZF9jZmc7CiAJc3RydWN0IHNoX2hkbWkgKmhkbWkgPSBib2FyZF9jZmctPmJvYXJkX2RhdGE7CiAKLQlpZiAobmIgIT0gJnNoX2hkbWlfbm90aWZpZXIgfHwgIWhkbWkgfHwgaGRtaS0+aW5mbyAhPSBpbmZvKQorCWlmICghaGRtaSB8fCBuYiAhPSAmaGRtaS0+bm90aWZpZXIgfHwgaGRtaS0+aW5mbyAhPSBpbmZvKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAlzd2l0Y2goYWN0aW9uKSB7CkBAIC0xMjA5LDExICsxMjI2LDExIEBACiAJCSAqIHRlbXBvcmFyaWx5LCBzeW5jaHJvbmlzZSB3aXRoIHRoZSB3b3JrIHF1ZXVlIGFuZCByZS1hY3F1aXJlCiAJCSAqIHRoZSBpbmZvLT5sb2NrLgogCQkgKi8KLQkJdW5sb2NrX2ZiX2luZm8oaGRtaS0+aW5mbyk7CisJCXVubG9ja19mYl9pbmZvKGluZm8pOwogCQltdXRleF9sb2NrKCZoZG1pLT5tdXRleCk7CiAJCWhkbWktPmluZm8gPSBOVUxMOwogCQltdXRleF91bmxvY2soJmhkbWktPm11dGV4KTsKLQkJbG9ja19mYl9pbmZvKGhkbWktPmluZm8pOworCQlsb2NrX2ZiX2luZm8oaW5mbyk7CiAJCXJldHVybiBOT1RJRllfT0s7CiAJfQogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTEzMTEsNiArMTMyOCw5IEBACiAJCWdvdG8gZWNvZGVjOwogCX0KIAorCWhkbWktPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBzaF9oZG1pX25vdGlmeTsKKwlmYl9yZWdpc3Rlcl9jbGllbnQoJmhkbWktPm5vdGlmaWVyKTsKKwogCXJldHVybiAwOwogCiBlY29kZWM6CkBAIC0xMzQxLDYgKzEzNjEsOCBAQAogCiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOwogCisJZmJfdW5yZWdpc3Rlcl9jbGllbnQoJmhkbWktPm5vdGlmaWVyKTsKKwogCWJvYXJkX2NmZy0+ZGlzcGxheV9vbiA9IE5VTEw7CiAJYm9hcmRfY2ZnLT5kaXNwbGF5X29mZiA9IE5VTEw7CiAJYm9hcmRfY2ZnLT5ib2FyZF9kYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYyBiL2RyaXZlcnMvdmlkZW8vc3N0ZmIuYwppbmRleCBkZWU2NGMzLi4yYWI3MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3NzdGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zc3RmYi5jCkBAIC01MzYsNyArNTM2LDcgQEAKIAlmYmlpbml0MiA9IHNzdF9yZWFkKEZCSUlOSVQyKTsKIAlmYmlpbml0MyA9IHNzdF9yZWFkKEZCSUlOSVQzKTsKIAotCS8qIGV2ZXJ5dGhpbmcgaXMgcmVzZXQuIHdlIGVuYWJsZSBmYmlpbml0Mi8zIHJlbWFwIDogZGFjIGFjY2VzIG9rICovCisJLyogZXZlcnl0aGluZyBpcyByZXNldC4gd2UgZW5hYmxlIGZiaWluaXQyLzMgcmVtYXAgOiBkYWMgYWNjZXNzIG9rICovCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzc3RfZGV2LCBQQ0lfSU5JVF9FTkFCTEUsCiAJICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRU5fSU5JVF9XUiB8IFBDSV9SRU1BUF9EQUMgKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby91ZGxmYi5jIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCmluZGV4IDAyMDU4OWEuLjJjODM2NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKQEAgLTExMjgsMTQgKzExMjgsMTMgQEAKIAkJICogQnV0IHdpdGggaW1wZXJmZWN0IGRhbWFnZSBpbmZvIHdlIG1heSBzZW5kIHBpeGVscyBvdmVyIFVTQgogCQkgKiB0aGF0IHdlcmUsIGluIGZhY3QsIHVuY2hhbmdlZCAtIHdhc3RpbmcgbGltaXRlZCBVU0IgYmFuZHdpZHRoCiAJCSAqLwotCQluZXdfYmFjayA9IHZtYWxsb2MobmV3X2xlbik7CisJCW5ld19iYWNrID0gdnphbGxvYyhuZXdfbGVuKTsKIAkJaWYgKCFuZXdfYmFjaykKLQkJCXByX2luZm8oIk5vIHNoYWRvdy9iYWNraW5nIGJ1ZmZlciBhbGxjb2F0ZWRcbiIpOworCQkJcHJfaW5mbygiTm8gc2hhZG93L2JhY2tpbmcgYnVmZmVyIGFsbG9jYXRlZFxuIik7CiAJCWVsc2UgewogCQkJaWYgKGRldi0+YmFja2luZ19idWZmZXIpCiAJCQkJdmZyZWUoZGV2LT5iYWNraW5nX2J1ZmZlcik7CiAJCQlkZXYtPmJhY2tpbmdfYnVmZmVyID0gbmV3X2JhY2s7Ci0JCQltZW1zZXQoZGV2LT5iYWNraW5nX2J1ZmZlciwgMCwgbmV3X2xlbik7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYyBiL2RyaXZlcnMvdmlkZW8vdnQ4NTAwbGNkZmIuYwppbmRleCA3NjE3ZjEyLi4wZTEyMGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3Z0ODUwMGxjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby92dDg1MDBsY2RmYi5jCkBAIC0yMTUsNiArMjE1LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiB2dDg1MDBsY2RfYmxhbmsoKToKKyAqCUJsYW5rIHRoZSBkaXNwbGF5IGJ5IHNldHRpbmcgYWxsIHBhbGV0dGUgdmFsdWVzIHRvIHplcm8uICBOb3RlLAorICogCVRydWUgQ29sb3IgbW9kZXMgZG8gbm90IHJlYWxseSB1c2UgdGhlIHBhbGV0dGUsIHNvIHRoaXMgd2lsbCBub3QKKyAqICAgICAgYmxhbmsgdGhlIGRpc3BsYXkgaW4gYWxsIG1vZGVzLgorICovCitzdGF0aWMgaW50IHZ0ODUwMGxjZF9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBpOworCisJc3dpdGNoIChibGFuaykgeworCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKKwljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CisJY2FzZSBGQl9CTEFOS19OT1JNQUw6CisJCWlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiB8fAorCQkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfU1RBVElDX1BTRVVET0NPTE9SKQorCQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCXZ0ODUwMGxjZF9zZXRjb2xyZWcoaSwgMCwgMCwgMCwgMCwgaW5mbyk7CisJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgorCQlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfUFNFVURPQ09MT1IgfHwKKwkJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1NUQVRJQ19QU0VVRE9DT0xPUikKKwkJCWZiX3NldF9jbWFwKCZpbmZvLT5jbWFwLCBpbmZvKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHZ0ODUwMGxjZF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5mYl9zZXRfcGFyCT0gdnQ4NTAwbGNkX3NldF9wYXIsCkBAIC0yMjUsNiArMjUyLDcgQEAKIAkuZmJfc3luYwk9IHdtdF9nZV9zeW5jLAogCS5mYl9pb2N0bAk9IHZ0ODUwMGxjZF9pb2N0bCwKIAkuZmJfcGFuX2Rpc3BsYXkJPSB2dDg1MDBsY2RfcGFuX2Rpc3BsYXksCisJLmZiX2JsYW5rCT0gdnQ4NTAwbGNkX2JsYW5rLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHZ0ODUwMGxjZF9oYW5kbGVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwppbmRleCA0YWJiMGI5Li4zZTY5MzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKKysrIGIvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCkBAIC01NjIsMjYgKzU2MiwyNCBAQAogc3RhdGljIGludCB4ZW5mYl9jb25uZWN0X2JhY2tlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IHhlbmZiX2luZm8gKmluZm8pCiB7Ci0JaW50IHJldCwgZXZ0Y2huOworCWludCByZXQsIGV2dGNobiwgaXJxOwogCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0OwogCiAJcmV0ID0geGVuYnVzX2FsbG9jX2V2dGNobihkZXYsICZldnRjaG4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihldnRjaG4sIHhlbmZiX2V2ZW50X2hhbmRsZXIsCisJaXJxID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihldnRjaG4sIHhlbmZiX2V2ZW50X2hhbmRsZXIsCiAJCQkJCTAsIGRldi0+ZGV2aWNldHlwZSwgaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAoaXJxIDwgMCkgewogCQl4ZW5idXNfZnJlZV9ldnRjaG4oZGV2LCBldnRjaG4pOwogCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAiYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlciIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gaXJxOwogCX0KLQlpbmZvLT5pcnEgPSByZXQ7Ci0KICBhZ2FpbjoKIAlyZXQgPSB4ZW5idXNfdHJhbnNhY3Rpb25fc3RhcnQoJnhidCk7CiAJaWYgKHJldCkgewogCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAic3RhcnRpbmcgdHJhbnNhY3Rpb24iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byB1bmJpbmRfaXJxOwogCX0KIAlyZXQgPSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInBhZ2UtcmVmIiwgIiVsdSIsCiAJCQkgICAgdmlydF90b19tZm4oaW5mby0+cGFnZSkpOwpAQCAtNjAzLDIwICs2MDEsMjUgQEAKIAkJaWYgKHJldCA9PSAtRUFHQUlOKQogCQkJZ290byBhZ2FpbjsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgImNvbXBsZXRpbmcgdHJhbnNhY3Rpb24iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byB1bmJpbmRfaXJxOwogCX0KIAogCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKwlpbmZvLT5pcnEgPSBpcnE7CiAJcmV0dXJuIDA7CiAKICBlcnJvcl94ZW5idXM6CiAJeGVuYnVzX3RyYW5zYWN0aW9uX2VuZCh4YnQsIDEpOwogCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJ3cml0aW5nIHhlbnN0b3JlIik7CisgdW5iaW5kX2lycToKKwl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKGlycSwgaW5mbyk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgeGVuZmJfZGlzY29ubmVjdF9iYWNrZW5kKHN0cnVjdCB4ZW5mYl9pbmZvICppbmZvKQogeworCS8qIFByZXZlbnQgeGVuZmIgcmVmcmVzaCAqLworCWluZm8tPnVwZGF0ZV93YW50ZWQgPSAwOwogCWlmIChpbmZvLT5pcnEgPj0gMCkKIAkJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpbmZvLT5pcnEsIGluZm8pOwogCWluZm8tPmlycSA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKaW5kZXggMWY1MTM2Ni4uZjBjOTA5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCkBAIC0xNiw2ICsxNiwxNyBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZQogCSAgc2ltcGxlIDY0Yml0IG1lbW9yeSByb20oZHMyNDAxL2RzMjQxMS9kczE5OTAqKSB0byB5b3VyIHdpcmUuCiAKK2NvbmZpZyBXMV9TTEFWRV9EUzI0MjMKKwl0cmlzdGF0ZSAiQ291bnRlciAxLXdpcmUgZGV2aWNlIChEUzI0MjMpIgorCXNlbGVjdCBDUkMxNgorCWhlbHAKKwkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3UgY2FuIHJlYWQgdGhlIGNvdW50ZXIgdmFsdWVzIGF2YWlsYWJsZQorCSAgaW4gdGhlIERTMjQyMyBjaGlwc2V0IGZyb20gdGhlIHcxX3NsYXZlIGZpbGUgdW5kZXIgdGhlCisJICBzeXMgZmlsZSBzeXN0ZW0uCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgMS13aXJlCisJICBjb3VudGVyIGZhbWlseSBkZXZpY2UgKERTMjQyMykuCisKIGNvbmZpZyBXMV9TTEFWRV9EUzI0MzEKIAl0cmlzdGF0ZSAiMWtiIEVFUFJPTSBmYW1pbHkgc3VwcG9ydCAoRFMyNDMxKSIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy9NYWtlZmlsZSBiL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCmluZGV4IGYxZjUxZjEuLjNjNzYzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfVzFfU0xBVkVfVEhFUk0pCSs9IHcxX3RoZXJtLm8KIG9iai0kKENPTkZJR19XMV9TTEFWRV9TTUVNKQkrPSB3MV9zbWVtLm8KK29iai0kKENPTkZJR19XMV9TTEFWRV9EUzI0MjMpCSs9IHcxX2RzMjQyMy5vCiBvYmotJChDT05GSUdfVzFfU0xBVkVfRFMyNDMxKQkrPSB3MV9kczI0MzEubwogb2JqLSQoQ09ORklHX1cxX1NMQVZFX0RTMjQzMykJKz0gdzFfZHMyNDMzLm8KIG9iai0kKENPTkZJR19XMV9TTEFWRV9EUzI3NjApCSs9IHcxX2RzMjc2MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MjMuYyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX2RzMjQyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2RiZTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNDIzLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKgl3MV9kczI0MjMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBNaWthIExhaXRpbyA8bGFtaWtyQHBpbHBwYS5vcmc+CisgKgorICogVGhpcyBkcml2ZXIgd2lsbCByZWFkIGFuZCB3cml0ZSB0aGUgdmFsdWUgb2YgNCBjb3VudGVycyB0byB3MV9zbGF2ZSBmaWxlIGluCisgKiBzeXMgZmlsZXN5c3RlbS4KKyAqIEluc3BpcmVkIGJ5IHRoZSB3MV90aGVybSBhbmQgdzFfZHMyNDMxIGRyaXZlcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0aGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzE2Lmg+CisKKyNpbmNsdWRlICIuLi93MS5oIgorI2luY2x1ZGUgIi4uL3cxX2ludC5oIgorI2luY2x1ZGUgIi4uL3cxX2ZhbWlseS5oIgorCisjZGVmaW5lIENSQzE2X1ZBTElECTB4YjAwMQorI2RlZmluZSBDUkMxNl9JTklUCTAKKworI2RlZmluZSBDT1VOVEVSX0NPVU5UIDQKKyNkZWZpbmUgUkVBRF9CWVRFX0NPVU5UIDQyCisKK3N0YXRpYyBzc2l6ZV90IHcxX2NvdW50ZXJfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB3MV9jb3VudGVyX2F0dHIgPQorCV9fQVRUUih3MV9zbGF2ZSwgU19JUlVHTywgdzFfY291bnRlcl9yZWFkLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgdzFfY291bnRlcl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqb3V0X2J1ZikKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0gZGV2X3RvX3cxX3NsYXZlKGRldmljZSk7CisJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gc2wtPm1hc3RlcjsKKwl1OCByYnVmW0NPVU5URVJfQ09VTlQgKiBSRUFEX0JZVEVfQ09VTlRdOworCXU4IHdyYnVmWzNdOworCWludCByb21fYWRkcjsKKwlpbnQgcmVhZF9ieXRlX2NvdW50OworCWludCByZXN1bHQ7CisJc3NpemVfdCBjOworCWludCBpaTsKKwlpbnQgcDsKKwlpbnQgY3JjOworCisJYwkJPSBQQUdFX1NJWkU7CisJcm9tX2FkZHIJPSAoMTIgPDwgNSkgKyAzMTsKKwl3cmJ1ZlswXQk9IDB4QTU7CisJd3JidWZbMV0JPSByb21fYWRkciAmIDB4RkY7CisJd3JidWZbMl0JPSByb21fYWRkciA+PiA4OworCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCWlmICghdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgeworCQl3MV93cml0ZV9ibG9jayhkZXYsIHdyYnVmLCAzKTsKKwkJcmVhZF9ieXRlX2NvdW50ID0gMDsKKwkJZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworCQkJLyoKKwkJCSAqIDEgYnl0ZSBmb3IgZmlyc3QgYnl0ZXMgaW4gcmFtIHBhZ2UgcmVhZAorCQkJICogNCBieXRlcyBmb3IgY291bnRlcgorCQkJICogNCBieXRlcyBmb3IgemVybyBiaXRzCisJCQkgKiAyIGJ5dGVzIGZvciBjcmMKKwkJCSAqIDMxIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoZSByYW0gcGFnZQorCQkJICovCisJCQlyZWFkX2J5dGVfY291bnQgKz0gdzFfcmVhZF9ibG9jayhkZXYsCisJCQkJcmJ1ZiArIChwICogUkVBRF9CWVRFX0NPVU5UKSwgUkVBRF9CWVRFX0NPVU5UKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IFJFQURfQllURV9DT1VOVDsgKytpaSkKKwkJCQljIC09IHNucHJpbnRmKG91dF9idWYgKyBQQUdFX1NJWkUgLSBjLAorCQkJCQljLCAiJTAyeCAiLAorCQkJCQlyYnVmWyhwICogUkVBRF9CWVRFX0NPVU5UKSArIGlpXSk7CisJCQlpZiAocmVhZF9ieXRlX2NvdW50ICE9IChwICsgMSkgKiBSRUFEX0JZVEVfQ09VTlQpIHsKKwkJCQlkZXZfd2FybihkZXZpY2UsCisJCQkJCSJ3MV9jb3VudGVyX3JlYWQoKSByZXR1cm5lZCAldSBieXRlcyAiCisJCQkJCSJpbnN0ZWFkIG9mICVkIGJ5dGVzIHdhbnRlZC5cbiIsCisJCQkJCXJlYWRfYnl0ZV9jb3VudCwKKwkJCQkJUkVBRF9CWVRFX0NPVU5UKTsKKwkJCQljIC09IHNucHJpbnRmKG91dF9idWYgKyBQQUdFX1NJWkUgLSBjLAorCQkJCQljLCAiY3JjPU5PXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHAgPT0gMCkgeworCQkJCQljcmMgPSBjcmMxNihDUkMxNl9JTklULCB3cmJ1ZiwgMyk7CisJCQkJCWNyYyA9IGNyYzE2KGNyYywgcmJ1ZiwgMTEpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIERTMjQyMyBjYWxjdWxhdGVzIGNyYyBmcm9tIGFsbCBieXRlcworCQkJCQkgKiByZWFkIGFmdGVyIHRoZSBwcmV2aW91cyBjcmMgYnl0ZXMuCisJCQkJCSAqLworCQkJCQljcmMgPSBjcmMxNihDUkMxNl9JTklULAorCQkJCQkJKHJidWYgKyAxMSkgKworCQkJCQkJKChwIC0gMSkgKiBSRUFEX0JZVEVfQ09VTlQpLAorCQkJCQkJUkVBRF9CWVRFX0NPVU5UKTsKKwkJCQl9CisJCQkJaWYgKGNyYyA9PSBDUkMxNl9WQUxJRCkgeworCQkJCQlyZXN1bHQgPSAwOworCQkJCQlmb3IgKGlpID0gNDsgaWkgPiAwOyBpaS0tKSB7CisJCQkJCQlyZXN1bHQgPDw9IDg7CisJCQkJCQlyZXN1bHQgfD0gcmJ1ZlsocCAqCisJCQkJCQkJUkVBRF9CWVRFX0NPVU5UKSArIGlpXTsKKwkJCQkJfQorCQkJCQljIC09IHNucHJpbnRmKG91dF9idWYgKyBQQUdFX1NJWkUgLSBjLAorCQkJCQkJYywgImNyYz1ZRVMgYz0lZFxuIiwgcmVzdWx0KTsKKwkJCQl9IGVsc2UgeworCQkJCQljIC09IHNucHJpbnRmKG91dF9idWYgKyBQQUdFX1NJWkUgLSBjLAorCQkJCQkJYywgImNyYz1OT1xuIik7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYyAtPSBzbnByaW50ZihvdXRfYnVmICsgUEFHRV9TSVpFIC0gYywgYywgIkNvbm5lY3Rpb24gZXJyb3IiKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKwlyZXR1cm4gUEFHRV9TSVpFIC0gYzsKK30KKworc3RhdGljIGludCB3MV9mMWRfYWRkX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZSgmc2wtPmRldiwgJncxX2NvdW50ZXJfYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHcxX2YxZF9yZW1vdmVfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCkKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNsLT5kZXYsICZ3MV9jb3VudGVyX2F0dHIpOworfQorCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfZjFkX2ZvcHMgPSB7CisJLmFkZF9zbGF2ZSAgICAgID0gdzFfZjFkX2FkZF9zbGF2ZSwKKwkucmVtb3ZlX3NsYXZlICAgPSB3MV9mMWRfcmVtb3ZlX3NsYXZlLAorfTsKKworc3RhdGljIHN0cnVjdCB3MV9mYW1pbHkgdzFfZmFtaWx5XzFkID0geworCS5maWQgPSBXMV9DT1VOVEVSX0RTMjQyMywKKwkuZm9wcyA9ICZ3MV9mMWRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHcxX2YxZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHcxX3JlZ2lzdGVyX2ZhbWlseSgmdzFfZmFtaWx5XzFkKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHcxX2YxZF9leGl0KHZvaWQpCit7CisJdzFfdW5yZWdpc3Rlcl9mYW1pbHkoJncxX2ZhbWlseV8xZCk7Cit9CisKK21vZHVsZV9pbml0KHcxX2YxZF9pbml0KTsKK21vZHVsZV9leGl0KHcxX2YxZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWlrYSBMYWl0aW8gPGxhbWlrckBwaWxwcGEub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ3MSBmYW1pbHkgMWQgZHJpdmVyIGZvciBEUzI0MjMsIDQgY291bnRlcnMgYW5kIDRrYiByYW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmggYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCmluZGV4IDNjYTFiOTIuLmYzYjYzNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKKysrIGIvZHJpdmVycy93MS93MV9mYW1pbHkuaApAQCAtMzAsNiArMzAsNyBAQAogI2RlZmluZSBXMV9GQU1JTFlfU01FTV8wMQkweDAxCiAjZGVmaW5lIFcxX0ZBTUlMWV9TTUVNXzgxCTB4ODEKICNkZWZpbmUgVzFfVEhFUk1fRFMxOFMyMCAJMHgxMAorI2RlZmluZSBXMV9DT1VOVEVSX0RTMjQyMwkweDFECiAjZGVmaW5lIFcxX1RIRVJNX0RTMTgyMiAgCTB4MjIKICNkZWZpbmUgVzFfRUVQUk9NX0RTMjQzMyAgCTB4MjMKICNkZWZpbmUgVzFfVEhFUk1fRFMxOEIyMCAJMHgyOApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IGE1YWQ3N2UuLjJlMjQwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTQwOSwxNSArNDA5LDI2IEBACiAJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgogCiBjb25maWcgRjcxODA4RV9XRFQKLQl0cmlzdGF0ZSAiRmludGVrIEY3MTgwOEUsIEY3MTg4MkZHIGFuZCBGNzE4ODlGRyBXYXRjaGRvZyIKKwl0cmlzdGF0ZSAiRmludGVrIEY3MTgwOEUsIEY3MTg2MkZHLCBGNzE4NjksIEY3MTg4MkZHIGFuZCBGNzE4ODlGRyBXYXRjaGRvZyIKIAlkZXBlbmRzIG9uIFg4NiAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgRmludGVrCi0JICBGNzE4MDhFLCBGNzE4ODJGRyBhbmQgRjcxODg5RkcgU3VwZXIgSS9PIGNvbnRyb2xsZXJzLgorCSAgRjcxODA4RSwgRjcxODYyRkcsIEY3MTg2OSwgRjcxODgyRkcgYW5kIEY3MTg4OUZHIFN1cGVyIEkvTyBjb250cm9sbGVycy4KIAogCSAgWW91IGNhbiBjb21waWxlIHRoaXMgZHJpdmVyIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCwgb3IgdXNlCiAJICBpdCBhcyBhIG1vZHVsZS4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZjcxODA4ZV93ZHQuCiAKK2NvbmZpZyBTUDUxMDBfVENPCisJdHJpc3RhdGUgIkFNRC9BVEkgU1A1MTAwIFRDTyBUaW1lci9XYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBIYXJkd2FyZSB3YXRjaGRvZyBkcml2ZXIgZm9yIHRoZSBBTUQvQVRJIFNQNTEwMCBjaGlwc2V0LiBUaGUgVENPCisJICAoVG90YWwgQ29zdCBvZiBPd25lcnNoaXApIHRpbWVyIGlzIGEgd2F0Y2hkb2cgdGltZXIgdGhhdCB3aWxsIHJlYm9vdAorCSAgdGhlIG1hY2hpbmUgYWZ0ZXIgaXRzIGV4cGlyYXRpb24uIFRoZSBleHBpcmF0aW9uIHRpbWUgY2FuIGJlCisJICBjb25maWd1cmVkIHdpdGggdGhlICJoZWFydGJlYXQiIHBhcmFtZXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc3A1MTAwX3Rjby4KIAogY29uZmlnIEdFT0RFX1dEVAogCXRyaXN0YXRlICJBTUQgR2VvZGUgQ1M1NTM1L0NTNTUzNiBXYXRjaGRvZyIKQEAgLTYzMSw2ICs2NDIsMjQgQEAKIAogCSAgTW9zdCBwZW9wbGUgd2lsbCBzYXkgTi4KIAorY29uZmlnIE5WX1RDTworCXRyaXN0YXRlICJuVmlkaWEgVENPIFRpbWVyL1dhdGNoZG9nIgorCWRlcGVuZHMgb24gWDg2ICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIEhhcmR3YXJlIGRyaXZlciBmb3IgdGhlIFRDTyB0aW1lciBidWlsdCBpbnRvIHRoZSBuVmlkaWEgSHViIGZhbWlseQorCSAgKHN1Y2ggYXMgdGhlIE1DUDUxKS4gIFRoZSBUQ08gKFRvdGFsIENvc3Qgb2YgT3duZXJzaGlwKSB0aW1lciBpcyBhCisJICB3YXRjaGRvZyB0aW1lciB0aGF0IHdpbGwgcmVib290IHRoZSBtYWNoaW5lIGFmdGVyIGl0cyBzZWNvbmQKKwkgIGV4cGlyYXRpb24uIFRoZSBleHBpcmF0aW9uIHRpbWUgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUKKwkgICJoZWFydGJlYXQiIHBhcmFtZXRlci4KKworCSAgT24gc29tZSBtb3RoZXJib2FyZHMgdGhlIGRyaXZlciBtYXkgZmFpbCB0byByZXNldCB0aGUgY2hpcHNldCdzCisJICBOT19SRUJPT1QgZmxhZyB3aGljaCBwcmV2ZW50cyB0aGUgd2F0Y2hkb2cgZnJvbSByZWJvb3RpbmcgdGhlCisJICBtYWNoaW5lLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHlvdSB3aWxsIGdldCBhIGtlcm5lbCBtZXNzYWdlIGxpa2UKKwkgICJmYWlsZWQgdG8gcmVzZXQgTk9fUkVCT09UIGZsYWcsIHJlYm9vdCBkaXNhYmxlZCBieSBoYXJkd2FyZSIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG52X3Rjby4KKwogY29uZmlnIFJEQzMyMVhfV0RUCiAJdHJpc3RhdGUgIlJEQyBSLTMyMXggU29DIHdhdGNoZG9nIgogCWRlcGVuZHMgb24gWDg2X1JEQzMyMVgKQEAgLTcyMiwxNCArNzUxLDE1IEBACiAJICBNb3N0IHBlb3BsZSB3aWxsIHNheSBOLgogCiBjb25maWcgVzgzNjI3SEZfV0RUCi0JdHJpc3RhdGUgIlc4MzYyN0hGIFdhdGNoZG9nIFRpbWVyIgorCXRyaXN0YXRlICJXODM2MjdIRi9XODM2MjdESEcgV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBYODYKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBvbiB0aGUgVzgzNjI3SEYgY2hpcHNldAogCSAgYXMgdXNlZCBpbiBBZHZhbnRlY2ggUEMtOTU3OCBhbmQgVHlhbiBTMjcyMS01MzMgbW90aGVyYm9hcmRzCi0JICAoYW5kIGxpa2VseSBvdGhlcnMpLiAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0bwotCSAgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyCi0JICBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuCisJICAoYW5kIGxpa2VseSBvdGhlcnMpLiBUaGUgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIFc4MzYyN0RIRyBjaGlwLgorCSAgVGhpcyB3YXRjaGRvZyBzaW1wbHkgd2F0Y2hlcyB5b3VyIGtlcm5lbCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndAorCSAgZnJlZXplLCBhbmQgaWYgaXQgZG9lcywgaXQgcmVib290cyB5b3VyIGNvbXB1dGVyIGFmdGVyIGEgY2VydGFpbgorCSAgYW1vdW50IG9mIHRpbWUuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2hmX3dkdC4KQEAgLTgzMiwxMCArODYyLDIyIEBACiAKICMgTTY4SyBBcmNoaXRlY3R1cmUKIAotIyBNNjhLTk9NTVUgQXJjaGl0ZWN0dXJlCitjb25maWcgTTU0OHhfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiTUNGNTQ4eCB3YXRjaGRvZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTTU0OHgKKwloZWxwCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtNTQ4eF93ZHQuCiAKICMgTUlQUyBBcmNoaXRlY3R1cmUKIAorY29uZmlnIEFUSDc5X1dEVAorCXRyaXN0YXRlICJBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIGhhcmR3YXJlIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVRINzkKKwloZWxwCisJICBIYXJkd2FyZSBkcml2ZXIgZm9yIHRoZSBidWlsdC1pbiB3YXRjaGRvZyB0aW1lciBvbiB0aGUgQXRoZXJvcworCSAgQVI3MVhYL0FSNzI0WC9BUjkxM1ggU29Dcy4KKwogY29uZmlnIEJDTTQ3WFhfV0RUCiAJdHJpc3RhdGUgIkJyb2FkY29tIEJDTTQ3eHggV2F0Y2hkb2cgVGltZXIiCiAJZGVwZW5kcyBvbiBCQ000N1hYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCA0YjBlZjM4Li5kZDc3NjY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTY4LDYgKzY4LDcgQEAKIG9iai0kKENPTkZJR19BTElNMTUzNV9XRFQpICs9IGFsaW0xNTM1X3dkdC5vCiBvYmotJChDT05GSUdfQUxJTTcxMDFfV0RUKSArPSBhbGltNzEwMV93ZHQubwogb2JqLSQoQ09ORklHX0Y3MTgwOEVfV0RUKSArPSBmNzE4MDhlX3dkdC5vCitvYmotJChDT05GSUdfU1A1MTAwX1RDTykgKz0gc3A1MTAwX3Rjby5vCiBvYmotJChDT05GSUdfR0VPREVfV0RUKSArPSBnZW9kZXdkdC5vCiBvYmotJChDT05GSUdfU0M1MjBfV0RUKSArPSBzYzUyMF93ZHQubwogb2JqLSQoQ09ORklHX1NCQ19GSVRQQzJfV0FUQ0hET0cpICs9IHNiY19maXRwYzJfd2R0Lm8KQEAgLTg2LDYgKzg3LDcgQEAKIG9iai0kKENPTkZJR19TQzEyMDBfV0RUKSArPSBzYzEyMDB3ZHQubwogb2JqLSQoQ09ORklHX1NDeDIwMF9XRFQpICs9IHNjeDIwMF93ZHQubwogb2JqLSQoQ09ORklHX1BDODc0MTNfV0RUKSArPSBwYzg3NDEzX3dkdC5vCitvYmotJChDT05GSUdfTlZfVENPKSArPSBudl90Y28ubwogb2JqLSQoQ09ORklHX1JEQzMyMVhfV0RUKSArPSByZGMzMjF4X3dkdC5vCiBvYmotJChDT05GSUdfNjBYWF9XRFQpICs9IHNiYzYweHh3ZHQubwogb2JqLSQoQ09ORklHX1NCQzgzNjBfV0RUKSArPSBzYmM4MzYwLm8KQEAgLTEwNCwxMCArMTA2LDEwIEBACiAjIE0zMlIgQXJjaGl0ZWN0dXJlCiAKICMgTTY4SyBBcmNoaXRlY3R1cmUKLQotIyBNNjhLTk9NTVUgQXJjaGl0ZWN0dXJlCitvYmotJChDT05GSUdfTTU0OHhfV0FUQ0hET0cpICs9IG01NDh4X3dkdC5vCiAKICMgTUlQUyBBcmNoaXRlY3R1cmUKK29iai0kKENPTkZJR19BVEg3OV9XRFQpICs9IGF0aDc5X3dkdC5vCiBvYmotJChDT05GSUdfQkNNNDdYWF9XRFQpICs9IGJjbTQ3eHhfd2R0Lm8KIG9iai0kKENPTkZJR19CQ002M1hYX1dEVCkgKz0gYmNtNjN4eF93ZHQubwogb2JqLSQoQ09ORklHX1JDMzI0MzRfV0RUKSArPSByYzMyNDM0X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hbGltMTUzNV93ZHQuYwppbmRleCAxZTljYWVhLi5mYTRkMzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2FsaW0xNTM1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTE1MzVfd2R0LmMKQEAgLTMwMSw3ICszMDEsNyBAQAogICoJd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaV9wY2lfdGJsW10gPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWxpX3BjaV90YmxbXSBfX3VzZWQgPSB7CiAJeyBQQ0lfVkVORE9SX0lEX0FMLCAweDE1MzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKIAl7IFBDSV9WRU5ET1JfSURfQUwsIDB4MTUzNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXsgMCwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2FsaW03MTAxX3dkdC5jCmluZGV4IGQ4ZDRkYTkuLjRiN2EyYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvYWxpbTcxMDFfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hbGltNzEwMV93ZHQuYwpAQCAtNDMwLDcgKzQzMCw3IEBACiBtb2R1bGVfaW5pdChhbGltNzEwMV93ZHRfaW5pdCk7CiBtb2R1bGVfZXhpdChhbGltNzEwMV93ZHRfdW5sb2FkKTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaW03MTAxX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaW03MTAxX3BjaV90YmxbXSBfX2RldmluaXRkYXRhIF9fdXNlZCA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NMTUzMykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSkgfSwKIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvYXRoNzlfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWM4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0aDc5X3dkdC5jCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCBidWlsdC1pbiBoYXJkd2FyZSB3YXRjaGRvZyB0aW1lci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4IEltcmUgS2Fsb3ogPGthbG96QG9wZW53cnQub3JnPgorICoKKyAqIFRoaXMgZHJpdmVyIHdhcyBiYXNlZCBvbjogZHJpdmVycy93YXRjaGRvZy9peHA0eHhfd2R0LmMKKyAqCUF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCUNvcHlyaWdodCAyMDA0IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIHdoaWNoIGFnYWluIHdhcyBiYXNlZCBvbiBzYTExMDAgZHJpdmVyLAorICoJQ29weXJpZ2h0IChDKSAyMDAwIE9sZWcgRHJva2luIDxncmVlbkBjcmltZWEuZWR1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF0aDc5L2F0aDc5Lmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXRoNzkvYXI3MXh4X3JlZ3MuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkiYXRoNzktd2R0IgorCisjZGVmaW5lIFdEVF9USU1FT1VUCTE1CS8qIHNlY29uZHMgKi8KKworI2RlZmluZSBXRE9HX0NUUkxfTEFTVF9SRVNFVAlCSVQoMzEpCisjZGVmaW5lIFdET0dfQ1RSTF9BQ1RJT05fTUFTSwkzCisjZGVmaW5lIFdET0dfQ1RSTF9BQ1RJT05fTk9ORQkwCS8qIG5vIGFjdGlvbiAqLworI2RlZmluZSBXRE9HX0NUUkxfQUNUSU9OX0dQSQkxCS8qIGdlbmVyYWwgcHVycG9zZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgV0RPR19DVFJMX0FDVElPTl9OTUkJMgkvKiBOTUkgKi8KKyNkZWZpbmUgV0RPR19DVFJMX0FDVElPTl9GQ1IJMwkvKiBmdWxsIGNoaXAgcmVzZXQgKi8KKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAiCisJCQkgICAiKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKK3N0YXRpYyBpbnQgdGltZW91dCA9IFdEVF9USU1FT1VUOworbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsICJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMgIgorCQkJICAiKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0RUX1RJTUVPVVQpICJzKSIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfZmxhZ3M7CisKKyNkZWZpbmUgV0RUX0ZMQUdTX0JVU1kJCTAKKyNkZWZpbmUgV0RUX0ZMQUdTX0VYUEVDVF9DTE9TRQkxCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICp3ZHRfY2xrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2ZyZXE7CitzdGF0aWMgaW50IGJvb3Rfc3RhdHVzOworc3RhdGljIGludCBtYXhfdGltZW91dDsKKworc3RhdGljIGlubGluZSB2b2lkIGF0aDc5X3dkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwlhdGg3OV9yZXNldF93cihBUjcxWFhfUkVTRVRfUkVHX1dET0csIHdkdF9mcmVxICogdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg3OV93ZHRfZW5hYmxlKHZvaWQpCit7CisJYXRoNzlfd2R0X2tlZXBhbGl2ZSgpOworCWF0aDc5X3Jlc2V0X3dyKEFSNzFYWF9SRVNFVF9SRUdfV0RPR19DVFJMLCBXRE9HX0NUUkxfQUNUSU9OX0ZDUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg3OV93ZHRfZGlzYWJsZSh2b2lkKQoreworCWF0aDc5X3Jlc2V0X3dyKEFSNzFYWF9SRVNFVF9SRUdfV0RPR19DVFJMLCBXRE9HX0NUUkxfQUNUSU9OX05PTkUpOworfQorCitzdGF0aWMgaW50IGF0aDc5X3dkdF9zZXRfdGltZW91dChpbnQgdmFsKQoreworCWlmICh2YWwgPCAxIHx8IHZhbCA+IG1heF90aW1lb3V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRpbWVvdXQgPSB2YWw7CisJYXRoNzlfd2R0X2tlZXBhbGl2ZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRoNzlfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0RUX0ZMQUdTX0JVU1ksICZ3ZHRfZmxhZ3MpKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2xlYXJfYml0KFdEVF9GTEFHU19FWFBFQ1RfQ0xPU0UsICZ3ZHRfZmxhZ3MpOworCWF0aDc5X3dkdF9lbmFibGUoKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBhdGg3OV93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9iaXQoV0RUX0ZMQUdTX0VYUEVDVF9DTE9TRSwgJndkdF9mbGFncykpCisJCWF0aDc5X3dkdF9kaXNhYmxlKCk7CisJZWxzZSB7CisJCXByX2NyaXQoRFJJVkVSX05BTUUgIjogZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHksICIKKwkJCSJ3YXRjaGRvZyB0aW1lciB3aWxsIG5vdCBzdG9wIVxuIik7CisJCWF0aDc5X3dkdF9rZWVwYWxpdmUoKTsKKwl9CisKKwljbGVhcl9iaXQoV0RUX0ZMQUdTX0JVU1ksICZ3ZHRfZmxhZ3MpOworCWNsZWFyX2JpdChXRFRfRkxBR1NfRVhQRUNUX0NMT1NFLCAmd2R0X2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg3OV93ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmRhdGEsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWNsZWFyX2JpdChXRFRfRkxBR1NfRVhQRUNUX0NMT1NFLCAmd2R0X2ZsYWdzKTsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlzZXRfYml0KFdEVF9GTEFHU19FWFBFQ1RfQ0xPU0UsCisJCQkJCQkmd2R0X2ZsYWdzKTsKKwkJCX0KKwkJfQorCisJCWF0aDc5X3dkdF9rZWVwYWxpdmUoKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gYXRoNzlfd2R0X2luZm8gPSB7CisJLm9wdGlvbnMJCT0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcgfAorCQkJCSAgV0RJT0ZfTUFHSUNDTE9TRSB8IFdESU9GX0NBUkRSRVNFVCwKKwkuZmlybXdhcmVfdmVyc2lvbgk9IDAsCisJLmlkZW50aXR5CQk9ICJBVEg3OSB3YXRjaGRvZyIsCit9OworCitzdGF0aWMgbG9uZyBhdGg3OV93ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IGVycjsKKwlpbnQgdDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQllcnIgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmF0aDc5X3dkdF9pbmZvLAorCQkJCSAgIHNpemVvZihhdGg3OV93ZHRfaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCWVyciA9IHB1dF91c2VyKDAsIHApOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJZXJyID0gcHV0X3VzZXIoYm9vdF9zdGF0dXMsIHApOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlhdGg3OV93ZHRfa2VlcGFsaXZlKCk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQllcnIgPSBnZXRfdXNlcih0LCBwKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWVyciA9IGF0aDc5X3dkdF9zZXRfdGltZW91dCh0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQllcnIgPSBwdXRfdXNlcih0aW1lb3V0LCBwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdGg3OV93ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGF0aDc5X3dkdF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBhdGg3OV93ZHRfaW9jdGwsCisJLm9wZW4JCT0gYXRoNzlfd2R0X29wZW4sCisJLnJlbGVhc2UJPSBhdGg3OV93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdGg3OV93ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9ICJ3YXRjaGRvZyIsCisJLmZvcHMgPSAmYXRoNzlfd2R0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGg3OV93ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgY3RybDsKKwlpbnQgZXJyOworCisJd2R0X2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIndkdCIpOworCWlmIChJU19FUlIod2R0X2NsaykpCisJCXJldHVybiBQVFJfRVJSKHdkdF9jbGspOworCisJZXJyID0gY2xrX2VuYWJsZSh3ZHRfY2xrKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jbGtfcHV0OworCisJd2R0X2ZyZXEgPSBjbGtfZ2V0X3JhdGUod2R0X2Nsayk7CisJaWYgKCF3ZHRfZnJlcSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9jbGtfZGlzYWJsZTsKKwl9CisKKwltYXhfdGltZW91dCA9ICgweGZmZmZmZmZmdWwgLyB3ZHRfZnJlcSk7CisJaWYgKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiBtYXhfdGltZW91dCkgeworCQl0aW1lb3V0ID0gbWF4X3RpbWVvdXQ7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkidGltZW91dCB2YWx1ZSBtdXN0IGJlIDAgPCB0aW1lb3V0IDwgJWQsIHVzaW5nICVkXG4iLAorCQkJbWF4X3RpbWVvdXQsIHRpbWVvdXQpOworCX0KKworCWN0cmwgPSBhdGg3OV9yZXNldF9ycihBUjcxWFhfUkVTRVRfUkVHX1dET0dfQ1RSTCk7CisJYm9vdF9zdGF0dXMgPSAoY3RybCAmIFdET0dfQ1RSTF9MQVNUX1JFU0VUKSA/IFdESU9GX0NBUkRSRVNFVCA6IDA7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZhdGg3OV93ZHRfbWlzY2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIHJlZ2lzdGVyIG1pc2MgZGV2aWNlLCBlcnI9JWRcbiIsIGVycik7CisJCWdvdG8gZXJyX2Nsa19kaXNhYmxlOworCX0KKworCXJldHVybiAwOworCitlcnJfY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGUod2R0X2Nsayk7CitlcnJfY2xrX3B1dDoKKwljbGtfcHV0KHdkdF9jbGspOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0aDc5X3dkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmF0aDc5X3dkdF9taXNjZGV2KTsKKwljbGtfZGlzYWJsZSh3ZHRfY2xrKTsKKwljbGtfcHV0KHdkdF9jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGg5N193ZHRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlhdGg3OV93ZHRfZGlzYWJsZSgpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdGg3OV93ZHRfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXRoNzlfd2R0X3JlbW92ZSksCisJLnNodXRkb3duCT0gYXRoOTdfd2R0X3NodXRkb3duLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXRoNzlfd2R0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdGg3OV93ZHRfZHJpdmVyLCBhdGg3OV93ZHRfcHJvYmUpOworfQorbW9kdWxlX2luaXQoYXRoNzlfd2R0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRoNzlfd2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRoNzlfd2R0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdGg3OV93ZHRfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCBoYXJkd2FyZSB3YXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmciKTsKK01PRFVMRV9BVVRIT1IoIkltcmUgS2Fsb3ogPGthbG96QG9wZW53cnQub3JnIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYm9va2Vfd2R0LmMKaW5kZXggZDExZmZiMC4uN2U3ZWM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ib29rZV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2Jvb2tlX3dkdC5jCkBAIC04NSw2ICs4NSwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2Jvb2tlX3dkdF9zZXQodm9pZCAqZGF0YSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gbWZzcHIoU1BSTl9UQ1IpOworCXZhbCAmPSB+V0RUUF9NQVNLOworCXZhbCB8PSBXRFRQKGJvb2tlX3dkdF9wZXJpb2QpOworCisJbXRzcHIoU1BSTl9UQ1IsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb2tlX3dkdF9zZXQodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShfX2Jvb2tlX3dkdF9zZXQsIE5VTEwsIDApOworfQorCiBzdGF0aWMgdm9pZCBfX2Jvb2tlX3dkdF9waW5nKHZvaWQgKmRhdGEpCiB7CiAJbXRzcHIoU1BSTl9UU1IsIFRTUl9FTld8VFNSX1dJUyk7CkBAIC0xODEsOCArMTk3LDcgQEAKICNlbHNlCiAJCWJvb2tlX3dkdF9wZXJpb2QgPSB0bXA7CiAjZW5kaWYKLQkJbXRzcHIoU1BSTl9UQ1IsIChtZnNwcihTUFJOX1RDUikgJiB+V0RUUF9NQVNLKSB8Ci0JCQkJCQlXRFRQKGJvb2tlX3dkdF9wZXJpb2QpKTsKKwkJYm9va2Vfd2R0X3NldCgpOwogCQlyZXR1cm4gMDsKIAljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CiAJCXJldHVybiBwdXRfdXNlcihib29rZV93ZHRfcGVyaW9kLCBwKTsKQEAgLTE5Myw4ICsyMDgsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogd2R0X2lzX2FjdGl2ZSBzdG9yZXMgd2V0aGVyIG9yIG5vdCB0aGUgL2Rldi93YXRjaGRvZyBkZXZpY2UgaXMgb3BlbmVkICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3ZHRfaXNfYWN0aXZlOworCiBzdGF0aWMgaW50IGJvb2tlX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX2FjdGl2ZSkpCisJCXJldHVybiAtRUJVU1k7CisKIAlzcGluX2xvY2soJmJvb2tlX3dkdF9sb2NrKTsKIAlpZiAoYm9va2Vfd2R0X2VuYWJsZWQgPT0gMCkgewogCQlib29rZV93ZHRfZW5hYmxlZCA9IDE7CkBAIC0yMTAsOCArMjMyLDE3IEBACiAKIHN0YXRpYyBpbnQgYm9va2Vfd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisjaWZuZGVmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorCS8qIE5vcm1hbGx5LCB0aGUgd2F0Y2hkb2cgaXMgZGlzYWJsZWQgd2hlbiAvZGV2L3dhdGNoZG9nIGlzIGNsb3NlZCwgYnV0CisJICogaWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIGRlZmluZWQsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUKKwkgKiB3YXRjaGRvZyBzaG91bGQgcmVtYWluIGVuYWJsZWQuICBTbyB3ZSBkaXNhYmxlIGl0IG9ubHkgaWYKKwkgKiBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IGRlZmluZWQuCisJICovCiAJb25fZWFjaF9jcHUoX19ib29rZV93ZHRfZGlzYWJsZSwgTlVMTCwgMCk7CiAJYm9va2Vfd2R0X2VuYWJsZWQgPSAwOworI2VuZGlmCisKKwljbGVhcl9iaXQoMCwgJndkdF9pc19hY3RpdmUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2Y3MTgwOGVfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2Y3MTgwOGVfd2R0LmMKaW5kZXggNjVlNTc5Ni4uZDRkOGQxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9mNzE4MDhlX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZjcxODA4ZV93ZHQuYwpAQCAtNDIsMTggKzQyLDIxIEBACiAjZGVmaW5lIFNJT19SRUdfREVWSUQJCTB4MjAJLyogRGV2aWNlIElEICgyIGJ5dGVzKSAqLwogI2RlZmluZSBTSU9fUkVHX0RFVlJFVgkJMHgyMgkvKiBEZXZpY2UgcmV2aXNpb24gKi8KICNkZWZpbmUgU0lPX1JFR19NQU5JRAkJMHgyMwkvKiBGaW50ZWsgSUQgKDIgYnl0ZXMpICovCisjZGVmaW5lIFNJT19SRUdfUk9NX0FERFJfU0VMCTB4MjcJLyogUk9NIGFkZHJlc3Mgc2VsZWN0ICovCisjZGVmaW5lIFNJT19SRUdfTUZVTkNUMQkJMHgyOQkvKiBNdWx0aSBmdW5jdGlvbiBzZWxlY3QgMSAqLworI2RlZmluZSBTSU9fUkVHX01GVU5DVDIJCTB4MmEJLyogTXVsdGkgZnVuY3Rpb24gc2VsZWN0IDIgKi8KKyNkZWZpbmUgU0lPX1JFR19NRlVOQ1QzCQkweDJiCS8qIE11bHRpIGZ1bmN0aW9uIHNlbGVjdCAzICovCiAjZGVmaW5lIFNJT19SRUdfRU5BQkxFCQkweDMwCS8qIExvZ2ljYWwgZGV2aWNlIGVuYWJsZSAqLwogI2RlZmluZSBTSU9fUkVHX0FERFIJCTB4NjAJLyogTG9naWNhbCBkZXZpY2UgYWRkcmVzcyAoMiBieXRlcykgKi8KIAogI2RlZmluZSBTSU9fRklOVEVLX0lECQkweDE5MzQJLyogTWFudWZhY3R1cmVycyBJRCAqLwotI2RlZmluZSBTSU9fRjcxODA4X0lECQkweDA5MDEgIC8qIENoaXBzZXQgSUQgKi8KLSNkZWZpbmUgU0lPX0Y3MTg1OF9JRAkJMHgwNTA3ICAvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GNzE4MDhfSUQJCTB4MDkwMQkvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GNzE4NThfSUQJCTB4MDUwNwkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4NjJfSUQJCTB4MDYwMQkvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GNzE4NjlfSUQJCTB4MDgxNAkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4ODJfSUQJCTB4MDU0MQkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4ODlfSUQJCTB4MDcyMwkvKiBDaGlwc2V0IElEICovCiAKLSNkZWZpbmUJRjcxODgyRkdfUkVHX1NUQVJUCQkweDAxCi0KICNkZWZpbmUgRjcxODA4RkdfUkVHX1dET19DT05GCQkweGYwCiAjZGVmaW5lIEY3MTgwOEZHX1JFR19XRFRfQ09ORgkJMHhmNQogI2RlZmluZSBGNzE4MDhGR19SRUdfV0RfVElNRQkJMHhmNgpAQCAtNzAsMTMgKzczLDE1IEBACiAjZGVmaW5lIFdBVENIRE9HX01BWF9USU1FT1VUCSg2MCAqIDI1NSkKICNkZWZpbmUgV0FUQ0hET0dfUFVMU0VfV0lEVEgJMTI1CS8qIDEyNSBtcywgZGVmYXVsdCBwdWxzZSB3aWR0aCBmb3IKIAkJCQkJICAgd2F0Y2hkb2cgc2lnbmFsICovCisjZGVmaW5lIFdBVENIRE9HX0Y3MTg2MkZHX1BJTgk2MwkvKiBkZWZhdWx0IHdhdGNoZG9nIHJlc2V0IG91dHB1dAorCQkJCQkgICBwaW4gbnVtYmVyIDYzICovCiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CiAKIHN0YXRpYyBjb25zdCBpbnQgbWF4X3RpbWVvdXQgPSBXQVRDSERPR19NQVhfVElNRU9VVDsKLXN0YXRpYyBpbnQgdGltZW91dCA9IDYwOwkvKiBkZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcyAqLworc3RhdGljIGludCB0aW1lb3V0ID0gV0FUQ0hET0dfVElNRU9VVDsJLyogZGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMgKi8KIG1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LAogCSJXYXRjaGRvZyB0aW1lb3V0IGluIHNlY29uZHMuIDE8PSB0aW1lb3V0IDw9IgpAQCAtODksNiArOTQsMTIgQEAKIAkiV2F0Y2hkb2cgc2lnbmFsIHB1bHNlIHdpZHRoLiAwKD1sZXZlbCksIDEgbXMsIDI1IG1zLCAxMjUgbXMgb3IgNTAwMCBtcyIKIAkJCSIgKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfUFVMU0VfV0lEVEgpICIpIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZjcxODYyZmdfcGluID0gV0FUQ0hET0dfRjcxODYyRkdfUElOOworbW9kdWxlX3BhcmFtKGY3MTg2MmZnX3BpbiwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGY3MTg2MmZnX3BpbiwKKwkiV2F0Y2hkb2cgZjcxODYyZmcgcmVzZXQgb3V0cHV0IHBpbiBjb25maWd1cmF0aW9uLiBDaG9vc2UgcGluIDU2IG9yIDYzIgorCQkJIiAoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19GNzE4NjJGR19QSU4pIikiKTsKKwogc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOwogbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlIik7CkBAIC05OCwxMiArMTA5LDEzIEBACiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X3dpdGh0aW1lb3V0LCAiU3RhcnQgd2F0Y2hkb2cgdGltZXIgb24gbW9kdWxlIGxvYWQgd2l0aCIKIAkiIGdpdmVuIGluaXRpYWwgdGltZW91dC4gWmVybyAoZGVmYXVsdCkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiIpOwogCi1lbnVtIGNoaXBzIHsgZjcxODA4ZmcsIGY3MTg1OGZnLCBmNzE4NjJmZywgZjcxODgyZmcsIGY3MTg4OWZnIH07CitlbnVtIGNoaXBzIHsgZjcxODA4ZmcsIGY3MTg1OGZnLCBmNzE4NjJmZywgZjcxODY5LCBmNzE4ODJmZywgZjcxODg5ZmcgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmY3MTgwOGVfbmFtZXNbXSA9IHsKIAkiZjcxODA4ZmciLAogCSJmNzE4NThmZyIsCiAJImY3MTg2MmZnIiwKKwkiZjcxODY5IiwKIAkiZjcxODgyZmciLAogCSJmNzE4ODlmZyIsCiB9OwpAQCAtMjgyLDYgKzI5NCwyOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZjcxODYyZmdfcGluX2NvbmZpZ3VyZSh1bnNpZ25lZCBzaG9ydCBpb2FkZHIpCit7CisJLyogV2hlbiBpb2FkZHIgaXMgbm9uLXplcm8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gaGFzIHRvIHRha2UgY2FyZSBvZgorCSAgIG11dGV4IGhhbmRsaW5nIGFuZCBzdXBlcmlvIHByZXBhcmF0aW9uISAqLworCisJaWYgKGY3MTg2MmZnX3BpbiA9PSA2MykgeworCQlpZiAoaW9hZGRyKSB7CisJCQkvKiBTUEkgbXVzdCBiZSBkaXNhYmxlZCBmaXJzdCB0byB1c2UgdGhpcyBwaW4hICovCisJCQlzdXBlcmlvX2NsZWFyX2JpdChpb2FkZHIsIFNJT19SRUdfUk9NX0FERFJfU0VMLCA2KTsKKwkJCXN1cGVyaW9fc2V0X2JpdChpb2FkZHIsIFNJT19SRUdfTUZVTkNUMywgNCk7CisJCX0KKwl9IGVsc2UgaWYgKGY3MTg2MmZnX3BpbiA9PSA1NikgeworCQlpZiAoaW9hZGRyKQorCQkJc3VwZXJpb19zZXRfYml0KGlvYWRkciwgU0lPX1JFR19NRlVOQ1QxLCAxKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBJbnZhbGlkIGFyZ3VtZW50IGY3MTg2MmZnX3Bpbj0lZFxuIiwKKwkJCQlmNzE4NjJmZ19waW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd2F0Y2hkb2dfc3RhcnQodm9pZCkKIHsKIAkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZGllIGFzIHNvb24gYXMgdGhlIHdhdGNoZG9nIGlzIGVuYWJsZWQgYmVsb3cgKi8KQEAgLTI5OSwxOSArMzMzLDMwIEBACiAJc3dpdGNoICh3YXRjaGRvZy50eXBlKSB7CiAJY2FzZSBmNzE4MDhmZzoKIAkJLyogU2V0IHBpbiAyMSB0byBHUElPMjMvV0RUUlNUIywgdGhlbiB0byBXRFRSU1QjICovCi0JCXN1cGVyaW9fY2xlYXJfYml0KHdhdGNoZG9nLnNpb2FkZHIsIDB4MmEsIDMpOwotCQlzdXBlcmlvX2NsZWFyX2JpdCh3YXRjaGRvZy5zaW9hZGRyLCAweDJiLCAzKTsKKwkJc3VwZXJpb19jbGVhcl9iaXQod2F0Y2hkb2cuc2lvYWRkciwgU0lPX1JFR19NRlVOQ1QyLCAzKTsKKwkJc3VwZXJpb19jbGVhcl9iaXQod2F0Y2hkb2cuc2lvYWRkciwgU0lPX1JFR19NRlVOQ1QzLCAzKTsKKwkJYnJlYWs7CisKKwljYXNlIGY3MTg2MmZnOgorCQllcnIgPSBmNzE4NjJmZ19waW5fY29uZmlndXJlKHdhdGNoZG9nLnNpb2FkZHIpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3N1cGVyaW87CisJCWJyZWFrOworCisJY2FzZSBmNzE4Njk6CisJCS8qIEdQSU8xNCAtLT4gV0RUUlNUIyAqLworCQlzdXBlcmlvX2NsZWFyX2JpdCh3YXRjaGRvZy5zaW9hZGRyLCBTSU9fUkVHX01GVU5DVDEsIDQpOwogCQlicmVhazsKIAogCWNhc2UgZjcxODgyZmc6CiAJCS8qIFNldCBwaW4gNTYgdG8gV0RUUlNUIyAqLwotCQlzdXBlcmlvX3NldF9iaXQod2F0Y2hkb2cuc2lvYWRkciwgMHgyOSwgMSk7CisJCXN1cGVyaW9fc2V0X2JpdCh3YXRjaGRvZy5zaW9hZGRyLCBTSU9fUkVHX01GVU5DVDEsIDEpOwogCQlicmVhazsKIAogCWNhc2UgZjcxODg5Zmc6CiAJCS8qIHNldCBwaW4gNDAgdG8gV0RUUlNUIyAqLwotCQlzdXBlcmlvX291dGIod2F0Y2hkb2cuc2lvYWRkciwgMHgyYiwKLQkJCQlzdXBlcmlvX2luYih3YXRjaGRvZy5zaW9hZGRyLCAweDJiKSAmIDB4Y2YpOworCQlzdXBlcmlvX291dGIod2F0Y2hkb2cuc2lvYWRkciwgU0lPX1JFR19NRlVOQ1QzLAorCQkJc3VwZXJpb19pbmIod2F0Y2hkb2cuc2lvYWRkciwgU0lPX1JFR19NRlVOQ1QzKSAmIDB4Y2YpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC03MTEsMTYgKzc1NiwxOSBAQAogCWNhc2UgU0lPX0Y3MTgwOF9JRDoKIAkJd2F0Y2hkb2cudHlwZSA9IGY3MTgwOGZnOwogCQlicmVhazsKKwljYXNlIFNJT19GNzE4NjJfSUQ6CisJCXdhdGNoZG9nLnR5cGUgPSBmNzE4NjJmZzsKKwkJZXJyID0gZjcxODYyZmdfcGluX2NvbmZpZ3VyZSgwKTsgLyogdmFsaWRhdGUgbW9kdWxlIHBhcmFtZXRlciAqLworCQlicmVhazsKKwljYXNlIFNJT19GNzE4NjlfSUQ6CisJCXdhdGNoZG9nLnR5cGUgPSBmNzE4Njk7CisJCWJyZWFrOwogCWNhc2UgU0lPX0Y3MTg4Ml9JRDoKIAkJd2F0Y2hkb2cudHlwZSA9IGY3MTg4MmZnOwogCQlicmVhazsKIAljYXNlIFNJT19GNzE4ODlfSUQ6CiAJCXdhdGNoZG9nLnR5cGUgPSBmNzE4ODlmZzsKIAkJYnJlYWs7Ci0JY2FzZSBTSU9fRjcxODYyX0lEOgotCQkvKiBUaGVzZSBoYXZlIGEgd2F0Y2hkb2csIHRob3VnaCBpdCBpc24ndCBpbXBsZW1lbnRlZCAoeWV0KS4gKi8KLQkJZXJyID0gLUVOT1NZUzsKLQkJZ290byBleGl0OwogCWNhc2UgU0lPX0Y3MTg1OF9JRDoKIAkJLyogQ29uZmlybWVkIChieSBkYXRhc2hlZXQpIG5vdCB0byBoYXZlIGEgd2F0Y2hkb2cuICovCiAJCWVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKaW5kZXggZGVhN2I1Yi4uMjRiOTY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAJdW5zaWduZWQgbG9uZyByb21fcGw7CiAJc3RhdGljIGludCBkaWVfbm1pX2NhbGxlZDsKIAotCWlmICh1bFJlYXNvbiAhPSBESUVfTk1JICYmIHVsUmVhc29uICE9IERJRV9OTUlfSVBJKQorCWlmICh1bFJlYXNvbiAhPSBESUVfTk1JVU5LTk9XTikKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWhwd2R0X25taV9kZWNvZGluZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYwppbmRleCBiODgzOGQyLi4yYzZjMmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqCWludGVsIFRDTyBXYXRjaGRvZyBEcml2ZXIKICAqCi0gKgkoYykgQ29weXJpZ2h0IDIwMDYtMjAwOSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCShjKSBDb3B5cmlnaHQgMjAwNi0yMDEwIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNiwxMyArMjYsMTUgQEAKICAqCWRvY3VtZW50IG51bWJlciAzMDE0NzMtMDAyLCAzMDE0NzQtMDI2OiA4MjgwMUYgKElDSDYpCiAgKglkb2N1bWVudCBudW1iZXIgMzEzMDgyLTAwMSwgMzEzMDc1LTAwNjogNjMxeEVTQiwgNjMyeEVTQgogICoJZG9jdW1lbnQgbnVtYmVyIDMwNzAxMy0wMDMsIDMwNzAxNC0wMjQ6IDgyODAxRyAoSUNINykKKyAqCWRvY3VtZW50IG51bWJlciAzMjI4OTYtMDAxLCAzMjI4OTctMDAxOiBOTTEwCiAgKglkb2N1bWVudCBudW1iZXIgMzEzMDU2LTAwMywgMzEzMDU3LTAxNzogODI4MDFIIChJQ0g4KQogICoJZG9jdW1lbnQgbnVtYmVyIDMxNjk3Mi0wMDQsIDMxNjk3My0wMTI6IDgyODAxSSAoSUNIOSkKICAqCWRvY3VtZW50IG51bWJlciAzMTk5NzMtMDAyLCAzMTk5NzQtMDAyOiA4MjgwMUogKElDSDEwKQogICoJZG9jdW1lbnQgbnVtYmVyIDMyMjE2OS0wMDEsIDMyMjE3MC0wMDM6IDUgU2VyaWVzLCAzNDAwIFNlcmllcyAoUENIKQogICoJZG9jdW1lbnQgbnVtYmVyIDMyMDA2Ni0wMDMsIDMyMDI1Ny0wMDg6IEVQODA1OTcgKElJQ0gpCi0gKglkb2N1bWVudCBudW1iZXIgVEJEICAgICAgICAgICAgICAgICAgIDogQ291Z2FyIFBvaW50IChDUFQpCisgKglkb2N1bWVudCBudW1iZXIgMzI0NjQ1LTAwMSwgMzI0NjQ2LTAwMTogQ291Z2FyIFBvaW50IChDUFQpCiAgKglkb2N1bWVudCBudW1iZXIgVEJEICAgICAgICAgICAgICAgICAgIDogUGF0c2J1cmcgKFBCRykKKyAqCWRvY3VtZW50IG51bWJlciBUQkQgICAgICAgICAgICAgICAgICAgOiBESDg5eHhDQwogICovCiAKIC8qCkBAIC04NSw2ICs4Nyw3IEBACiAJVENPX0lDSDdESCwJLyogSUNIN0RIICovCiAJVENPX0lDSDdNLAkvKiBJQ0g3LU0gJiBJQ0g3LVUgKi8KIAlUQ09fSUNIN01ESCwJLyogSUNINy1NIERIICovCisJVENPX05NMTAsCS8qIE5NMTAgKi8KIAlUQ09fSUNIOCwJLyogSUNIOCAmIElDSDhSICovCiAJVENPX0lDSDhESCwJLyogSUNIOERIICovCiAJVENPX0lDSDhETywJLyogSUNIOERPICovCkBAIC0xNDksNiArMTUyLDcgQEAKIAlUQ09fQ1BUMzEsCS8qIENvdWdhciBQb2ludCAqLwogCVRDT19QQkcxLAkvKiBQYXRzYnVyZyAqLwogCVRDT19QQkcyLAkvKiBQYXRzYnVyZyAqLworCVRDT19ESDg5WFhDQywJLyogREg4OXh4Q0MgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMTc0LDYgKzE3OCw3IEBACiAJeyJJQ0g3REgiLCAyfSwKIAl7IklDSDctTSBvciBJQ0g3LVUiLCAyfSwKIAl7IklDSDctTSBESCIsIDJ9LAorCXsiTk0xMCIsIDJ9LAogCXsiSUNIOCBvciBJQ0g4UiIsIDJ9LAogCXsiSUNIOERIIiwgMn0sCiAJeyJJQ0g4RE8iLCAyfSwKQEAgLTIzOCw2ICsyNDMsNyBAQAogCXsiQ291Z2FyIFBvaW50IiwgMn0sCiAJeyJQYXRzYnVyZyIsIDJ9LAogCXsiUGF0c2J1cmciLCAyfSwKKwl7IkRIODl4eENDIiwgMn0sCiAJe05VTEwsIDB9CiB9OwogCkBAIC0yOTEsNiArMjk3LDcgQEAKIAl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzAsCQlUQ09fSUNIN0RIKX0sCiAJeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCQlUQ09fSUNIN00pfSwKIAl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsCQlUQ09fSUNIN01ESCl9LAorCXsgSVRDT19QQ0lfREVWSUNFKDB4MjdiYywJCQkJVENPX05NMTApfSwKIAl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwJCVRDT19JQ0g4KX0sCiAJeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsCQlUQ09fSUNIOERIKX0sCiAJeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsCQlUQ09fSUNIOERPKX0sCkBAIC0zNTUsNiArMzYyLDcgQEAKIAl7IElUQ09fUENJX0RFVklDRSgweDFjNWYsCQkJCVRDT19DUFQzMSl9LAogCXsgSVRDT19QQ0lfREVWSUNFKDB4MWQ0MCwJCQkJVENPX1BCRzEpfSwKIAl7IElUQ09fUENJX0RFVklDRSgweDFkNDEsCQkJCVRDT19QQkcyKX0sCisJeyBJVENPX1BDSV9ERVZJQ0UoMHgyMzEwLAkJCQlUQ09fREg4OVhYQ0MpfSwKIAl7IDAsIH0sCQkJLyogRW5kIG9mIGxpc3QgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaVRDT193ZHRfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2tzODY5NV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cva3M4Njk1X3dkdC5jCmluZGV4IDI4NTJiYjIuLjgxMTQ3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cva3M4Njk1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cva3M4Njk1X3dkdC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWNoL3RpbWV4Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy10aW1lci5oPgogCiAjZGVmaW5lIFdEVF9ERUZBVUxUX1RJTUUJNQkvKiBzZWNvbmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL201NDh4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tNTQ4eF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJiY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9tNTQ4eF93ZHQuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIGRyaXZlcnMvd2F0Y2hkb2cvbTU0OHhfd2R0LmMKKyAqCisgKiBXYXRjaGRvZyBkcml2ZXIgZm9yIENvbGRGaXJlIE1DRjU0OHggcHJvY2Vzc29ycworICogQ29weXJpZ2h0IDIwMTAgKGMpIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBtYWNxZWwuYmU+CisgKgorICogQWRhcHRlZCBmcm9tIHRoZSBJWFA0eHggd2F0Y2hkb2cgZHJpdmVyLCB3aGljaCBjYXJyaWVzIHRoZXNlIG5vdGljZXM6CisgKgorICogIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiAgQ29weXJpZ2h0IDIwMDQgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuCisgKiAgQmFzZWQgb24gc2ExMTAwIGRyaXZlciwgQ29weXJpZ2h0IChDKSAyMDAwIE9sZWcgRHJva2luIDxncmVlbkBjcmltZWEuZWR1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSA8YXNtL201NDh4c2ltLmg+CisjaW5jbHVkZSA8YXNtL201NDh4Z3B0Lmg+CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGVhcnRiZWF0ID0gMzA7CS8qIChzZWNzKSBEZWZhdWx0IGlzIDAuNSBtaW51dGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9zdGF0dXM7CisKKyNkZWZpbmUJV0RUX0lOX1VTRQkJMAorI2RlZmluZQlXRFRfT0tfVE9fQ0xPU0UJCTEKKworc3RhdGljIHZvaWQgd2R0X2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBnbXMwOworCisJLyogcHJlc2VydmUgR1BJTyB1c2FnZSwgaWYgYW55ICovCisJZ21zMCA9IF9fcmF3X3JlYWRsKE1DRl9NQkFSICsgTUNGX0dQVF9HTVMwKTsKKwlpZiAoZ21zMCAmIE1DRl9HUFRfR01TX1RNU19HUElPKQorCQlnbXMwICY9IChNQ0ZfR1BUX0dNU19UTVNfR1BJTyB8IE1DRl9HUFRfR01TX0dQSU9fTUFTSworCQkJCQkJCXwgTUNGX0dQVF9HTVNfT0QpOworCWVsc2UKKwkJZ21zMCA9IE1DRl9HUFRfR01TX1RNU19HUElPIHwgTUNGX0dQVF9HTVNfT0Q7CisJX19yYXdfd3JpdGVsKGdtczAsIE1DRl9NQkFSICsgTUNGX0dQVF9HTVMwKTsKKwlfX3Jhd193cml0ZWwoTUNGX0dQVF9HQ0lSX1BSRShoZWFydGJlYXQqKE1DRl9CVVNDTEsvMHhmZmZmKSkgfAorCQkJTUNGX0dQVF9HQ0lSX0NOVCgweGZmZmYpLCBNQ0ZfTUJBUiArIE1DRl9HUFRfR0NJUjApOworCWdtczAgfD0gTUNGX0dQVF9HTVNfT0NQVygweEE1KSB8IE1DRl9HUFRfR01TX1dERU4gfCBNQ0ZfR1BUX0dNU19DRTsKKwlfX3Jhd193cml0ZWwoZ21zMCwgTUNGX01CQVIgKyBNQ0ZfR1BUX0dNUzApOworfQorCitzdGF0aWMgdm9pZCB3ZHRfZGlzYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBnbXMwOworCisJLyogZGlzYWJsZSB3YXRjaGRvZyAqLworCWdtczAgPSBfX3Jhd19yZWFkbChNQ0ZfTUJBUiArIE1DRl9HUFRfR01TMCk7CisJZ21zMCAmPSB+KE1DRl9HUFRfR01TX1dERU4gfCBNQ0ZfR1BUX0dNU19DRSk7CisJX19yYXdfd3JpdGVsKGdtczAsIE1DRl9NQkFSICsgTUNGX0dQVF9HTVMwKTsKK30KKworc3RhdGljIHZvaWQgd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCXVuc2lnbmVkIGludCBnbXMwOworCisJZ21zMCA9IF9fcmF3X3JlYWRsKE1DRl9NQkFSICsgTUNGX0dQVF9HTVMwKTsKKwlnbXMwIHw9IE1DRl9HUFRfR01TX09DUFcoMHhBNSk7CisJX19yYXdfd3JpdGVsKGdtczAsIE1DRl9NQkFSICsgTUNGX0dQVF9HTVMwKTsKK30KKworc3RhdGljIGludCBtNTQ4eF93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChXRFRfSU5fVVNFLCAmd2R0X3N0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwljbGVhcl9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cyk7CisJd2R0X2VuYWJsZSgpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIHNzaXplX3QgbTU0OHhfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpkYXRhLAorCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWNsZWFyX2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKworCQkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJc2V0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucwk9IFdESU9GX01BR0lDQ0xPU0UgfCBXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCS5pZGVudGl0eQk9ICJDb2xkZmlyZSBNNTQ4eCBXYXRjaGRvZyIsCit9OworCitzdGF0aWMgbG9uZyBtNTQ4eF93ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAtRU5PVFRZOworCWludCB0aW1lOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsICZpZGVudCwKKwkJCQkgICBzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldCA9IHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfa2VlcGFsaXZlKCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlyZXQgPSBnZXRfdXNlcih0aW1lLCAoaW50ICopYXJnKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lIDw9IDAgfHwgdGltZSA+IDMwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQloZWFydGJlYXQgPSB0aW1lOworCQl3ZHRfZW5hYmxlKCk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXQgPSBwdXRfdXNlcihoZWFydGJlYXQsIChpbnQgKilhcmcpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtNTQ4eF93ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9iaXQoV0RUX09LX1RPX0NMT1NFLCAmd2R0X3N0YXR1cykpCisJCXdkdF9kaXNhYmxlKCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBEZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseSAtICIKKwkJCQkJInRpbWVyIHdpbGwgbm90IHN0b3BcbiIpOworCQl3ZHRfa2VlcGFsaXZlKCk7CisJfQorCWNsZWFyX2JpdChXRFRfSU5fVVNFLCAmd2R0X3N0YXR1cyk7CisJY2xlYXJfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbTU0OHhfd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBtNTQ4eF93ZHRfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gbTU0OHhfd2R0X2lvY3RsLAorCS5vcGVuCQk9IG01NDh4X3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gbTU0OHhfd2R0X3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbTU0OHhfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJm01NDh4X3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTU0OHhfd2R0X2luaXQodm9pZCkKK3sKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihNQ0ZfTUJBUiArIE1DRl9HUFRfR0NJUjAsIDQsCisJCQkJCQkiQ29sZGZpcmUgTTU0OHggV2F0Y2hkb2ciKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIkNvbGRmaXJlIE01NDh4IFdhdGNoZG9nIDogSS9PIHJlZ2lvbiBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiQ29sZEZpcmUgd2F0Y2hkb2cgZHJpdmVyIGlzIGxvYWRlZC5cbiIpOworCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJm01NDh4X3dkdF9taXNjZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG01NDh4X3dkdF9leGl0KHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZtNTQ4eF93ZHRfbWlzY2Rldik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKE1DRl9NQkFSICsgTUNGX0dQVF9HQ0lSMCwgNCk7Cit9CisKK21vZHVsZV9pbml0KG01NDh4X3dkdF9pbml0KTsKK21vZHVsZV9leGl0KG01NDh4X3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQG1hY3FlbC5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29sZGZpcmUgTTU0OHggV2F0Y2hkb2ciKTsKKworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMgKGRlZmF1bHQgMzBzKSIpOworCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMgYi9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTBhYTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICoJbnZfdGNvIDAuMDE6CVRDTyB0aW1lciBkcml2ZXIgZm9yIE5WIGNoaXBzZXRzCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCUJhc2VkIG9mZiBpOHh4X3Rjby5jOgorICoJKGMpIENvcHlyaWdodCAyMDAwIGtlcm5lbCBjb25jZXB0cyA8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4sIEFsbCBSaWdodHMKKyAqCVJlc2VydmVkLgorICoJCQkJaHR0cDovL3d3dy5rZXJuZWxjb25jZXB0cy5kZQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVENPIHRpbWVyIGRyaXZlciBmb3IgTlYgY2hpcHNldHMKKyAqCWJhc2VkIG9uIHNvZnRkb2cuYyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICovCisKKy8qCisgKglJbmNsdWRlcywgZGVmaW5lcywgdmFyaWFibGVzLCBtb2R1bGUgcGFyYW1ldGVycywgLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJudl90Y28uaCIKKworLyogTW9kdWxlIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFRDT19WRVJTSU9OICIwLjAxIgorI2RlZmluZSBUQ09fTU9EVUxFX05BTUUgIk5WX1RDTyIKKyNkZWZpbmUgVENPX0RSSVZFUl9OQU1FICAgVENPX01PRFVMRV9OQU1FICIsIHYiIFRDT19WRVJTSU9OCisjZGVmaW5lIFBGWCBUQ09fTU9EVUxFX05BTUUgIjogIgorCisvKiBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNvYmFzZTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGNvX2xvY2spOwkvKiBHdWFyZHMgdGhlIGhhcmR3YXJlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1lcl9hbGl2ZTsKK3N0YXRpYyBjaGFyIHRjb19leHBlY3RfY2xvc2U7CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnRjb19wY2k7CisKKy8qIHRoZSB3YXRjaGRvZyBwbGF0Zm9ybSBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpudl90Y29fcGxhdGZvcm1fZGV2aWNlOworCisvKiBtb2R1bGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgMzAJLyogMzAgc2VjIGRlZmF1bHQgaGVhcnRiZWF0ICgyPGhlYXJ0YmVhdDwzOSkgKi8KK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOyAgLyogaW4gc2Vjb25kcyAqLworbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0IGluIHNlY29uZHMuICgyPGhlYXJ0YmVhdDwzOSwgIgorCQkJICAgICJkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCIKKwkJIiAoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworLyoKKyAqIFNvbWUgVENPIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgc2Vjb25kc190b190aWNrcyhpbnQgc2Vjb25kcykKK3sKKwkvKiB0aGUgaW50ZXJuYWwgdGltZXIgaXMgc3RvcmVkIGFzIHRpY2tzIHdoaWNoIGRlY3JlbWVudAorCSAqIGV2ZXJ5IDAuNiBzZWNvbmRzICovCisJcmV0dXJuIChzZWNvbmRzICogMTApIC8gNjsKK30KKworc3RhdGljIHZvaWQgdGNvX3RpbWVyX3N0YXJ0KHZvaWQpCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRjb19sb2NrLCBmbGFncyk7CisJdmFsID0gaW5sKFRDT19DTlQodGNvYmFzZSkpOworCXZhbCAmPSB+VENPX0NOVF9UQ09IQUxUOworCW91dGwodmFsLCBUQ09fQ05UKHRjb2Jhc2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Y29fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0Y29fdGltZXJfc3RvcCh2b2lkKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Y29fbG9jaywgZmxhZ3MpOworCXZhbCA9IGlubChUQ09fQ05UKHRjb2Jhc2UpKTsKKwl2YWwgfD0gVENPX0NOVF9UQ09IQUxUOworCW91dGwodmFsLCBUQ09fQ05UKHRjb2Jhc2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Y29fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0Y29fdGltZXJfa2VlcGFsaXZlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Y29fbG9jaywgZmxhZ3MpOworCW91dGIoMHgwMSwgVENPX1JMRCh0Y29iYXNlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGNvX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHRtcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHZhbDsKKworCS8qCisJICogbm90ZSBzZWNvbmRzX3RvX3RpY2tzKHQpID4gdCwgc28gaWYgdCA+IDB4M2YsIHNvIGlzCisJICogdG1ydmFsPXNlY29uZHNfdG9fdGlja3ModCkuICBDaGVjayB0aGF0IHRoZSBjb3VudCBpbiBzZWNvbmRzIGlzbid0CisJICogb3V0IG9mIHJhbmdlIG9uIGl0J3Mgb3duICh0byBhdm9pZCBvdmVyZmxvdyBpbiB0bXJ2YWwpLgorCSAqLworCWlmICh0IDwgMCB8fCB0ID4gMHgzZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJdG1ydmFsID0gc2Vjb25kc190b190aWNrcyh0KTsKKworCS8qICJWYWx1ZXMgb2YgMGgtM2ggYXJlIGlnbm9yZWQgYW5kIHNob3VsZCBub3QgYmUgYXR0ZW1wdGVkIiAqLworCWlmICh0bXJ2YWwgPiAweDNmIHx8IHRtcnZhbCA8IDB4MDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV3JpdGUgbmV3IGhlYXJ0YmVhdCB0byB3YXRjaGRvZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Y29fbG9jaywgZmxhZ3MpOworCXZhbCA9IGluYihUQ09fVE1SKHRjb2Jhc2UpKTsKKwl2YWwgJj0gMHhjMDsKKwl2YWwgfD0gdG1ydmFsOworCW91dGIodmFsLCBUQ09fVE1SKHRjb2Jhc2UpKTsKKwl2YWwgPSBpbmIoVENPX1RNUih0Y29iYXNlKSk7CisKKwlpZiAoKHZhbCAmIDB4M2YpICE9IHRtcnZhbCkKKwkJcmV0ID0gLUVJTlZBTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Y29fbG9jaywgZmxhZ3MpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWhlYXJ0YmVhdCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgkvZGV2L3dhdGNoZG9nIGhhbmRsaW5nCisgKi8KKworc3RhdGljIGludCBudl90Y29fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnRpbWVyX2FsaXZlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFJlbG9hZCBhbmQgYWN0aXZhdGUgdGltZXIgKi8KKwl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJdGNvX3RpbWVyX3N0YXJ0KCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IG52X3Rjb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIFNodXQgb2ZmIHRoZSB0aW1lciAqLworCWlmICh0Y29fZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXRjb190aW1lcl9zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyAiCisJCSAgICAgICAid2F0Y2hkb2chXG4iKTsKKwkJdGNvX3RpbWVyX2tlZXBhbGl2ZSgpOworCX0KKwljbGVhcl9iaXQoMCwgJnRpbWVyX2FsaXZlKTsKKwl0Y29fZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbnZfdGNvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qCisJCQkgKiBub3RlOiBqdXN0IGluIGNhc2Ugc29tZW9uZSB3cm90ZSB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKiBmaXZlIG1vbnRocyBhZ28uLi4KKwkJCSAqLworCQkJdGNvX2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qCisJCQkgKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljCisJCQkgKiBjaGFyYWN0ZXIKKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSAhPSBsZW47IGkrKykgeworCQkJCWNoYXIgYzsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgZGF0YSArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCXRjb19leHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCisJCS8qIHNvbWVvbmUgd3JvdGUgdG8gdXMsIHdlIHNob3VsZCByZWxvYWQgdGhlIHRpbWVyICovCisJCXRjb190aW1lcl9rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGxvbmcgbnZfdGNvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgbmV3X2hlYXJ0YmVhdDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPQkJVENPX01PRFVMRV9OQU1FLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIobmV3X29wdGlvbnMsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChuZXdfb3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQl0Y29fdGltZXJfc3RvcCgpOworCQkJcmV0dmFsID0gMDsKKwkJfQorCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJCQl0Y29fdGltZXJfc3RhcnQoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKwkJcmV0dXJuIHJldHZhbDsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJdGNvX3RpbWVyX2tlZXBhbGl2ZSgpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfaGVhcnRiZWF0LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodGNvX3RpbWVyX3NldF9oZWFydGJlYXQobmV3X2hlYXJ0YmVhdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdGNvX3RpbWVyX2tlZXBhbGl2ZSgpOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoKKyAqCUtlcm5lbCBJbnRlcmZhY2VzCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnZfdGNvX2ZvcHMgPSB7CisJLm93bmVyID0JCVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQkJbm9fbGxzZWVrLAorCS53cml0ZSA9CQludl90Y29fd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0JbnZfdGNvX2lvY3RsLAorCS5vcGVuID0JCQludl90Y29fb3BlbiwKKwkucmVsZWFzZSA9CQludl90Y29fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBudl90Y29fbWlzY2RldiA9IHsKKwkubWlub3IgPQlXQVRDSERPR19NSU5PUiwKKwkubmFtZSA9CQkid2F0Y2hkb2ciLAorCS5mb3BzID0JCSZudl90Y29fZm9wcywKK307CisKKy8qCisgKiBEYXRhIGZvciBQQ0kgZHJpdmVyIGludGVyZmFjZQorICoKKyAqIFRoaXMgZGF0YSBvbmx5IGV4aXN0cyBmb3IgZXhwb3J0aW5nIHRoZSBzdXBwb3J0ZWQKKyAqIFBDSSBpZHMgdmlhIE1PRFVMRV9ERVZJQ0VfVEFCTEUuICBXZSBkbyBub3QgYWN0dWFsbHkKKyAqIHJlZ2lzdGVyIGEgcGNpX2RyaXZlciwgYmVjYXVzZSBzb21lb25lIGVsc2UgbWlnaHQgb25lIGRheQorICogd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0Y29fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9TTUJVUywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X1NNQlVTLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0sCQkJLyogRW5kIG9mIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdGNvX3BjaV90YmwpOworCisvKgorICoJSW5pdCAmIGV4aXQgcm91dGluZXMKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2luaXQgbnZfdGNvX2dldGRldmljZSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCXUzMiB2YWw7CisKKwkvKiBGaW5kIHRoZSBQQ0kgZGV2aWNlICovCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJaWYgKHBjaV9tYXRjaF9pZCh0Y29fcGNpX3RibCwgZGV2KSAhPSBOVUxMKSB7CisJCQl0Y29fcGNpID0gZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXRjb19wY2kpCisJCXJldHVybiAwOworCisJLyogRmluZCB0aGUgYmFzZSBpbyBwb3J0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRjb19wY2ksIDB4NjQsICZ2YWwpOworCXZhbCAmPSAweGZmZmY7CisJaWYgKHZhbCA9PSAweDAwMDEgfHwgdmFsID09IDB4MDAwMCkgeworCQkvKiBTb21ldGhpbmcgaXMgd3JvbmcgaGVyZSwgYmFyIGlzbid0IHNldHVwICovCisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBnZXQgdGNvYmFzZSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXZhbCAmPSAweGZmMDA7CisJdGNvYmFzZSA9IHZhbCArIDB4NDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHRjb2Jhc2UsIDB4MTAsICJOViBUQ08iKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsCisJCSAgICAgICB0Y29iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2V0IGEgcmVhc29uYWJsZSBoZWFydGJlYXQgYmVmb3JlIHdlIHN0b3AgdGhlIHRpbWVyICovCisJdGNvX3RpbWVyX3NldF9oZWFydGJlYXQoMzApOworCisJLyoKKwkgKiBTdG9wIHRoZSBUQ08gYmVmb3JlIHdlIGNoYW5nZSBhbnl0aGluZyBzbyB3ZSBkb24ndCByYWNlIHdpdGgKKwkgKiBhIHplcm9lZCB0aW1lci4KKwkgKi8KKwl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJdGNvX3RpbWVyX3N0b3AoKTsKKworCS8qIERpc2FibGUgU01JIGNhdXNlZCBieSBUQ08gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKE1DUDUxX1NNSV9FTih0Y29iYXNlKSwgNCwgIk5WIFRDTyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKKwkJICAgICAgIE1DUDUxX1NNSV9FTih0Y29iYXNlKSk7CisJCWdvdG8gb3V0OworCX0KKwl2YWwgPSBpbmwoTUNQNTFfU01JX0VOKHRjb2Jhc2UpKTsKKwl2YWwgJj0gfk1DUDUxX1NNSV9FTl9UQ087CisJb3V0bCh2YWwsIE1DUDUxX1NNSV9FTih0Y29iYXNlKSk7CisJdmFsID0gaW5sKE1DUDUxX1NNSV9FTih0Y29iYXNlKSk7CisJcmVsZWFzZV9yZWdpb24oTUNQNTFfU01JX0VOKHRjb2Jhc2UpLCA0KTsKKwlpZiAodmFsICYgTUNQNTFfU01JX0VOX1RDTykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgZGlzYWJsZSBTTUkgY2F1c2VkIGJ5IFRDT1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGNoaXBzZXQncyBOT19SRUJPT1QgYml0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRjb19wY2ksIE1DUDUxX1NNQlVTX1NFVFVQX0IsICZ2YWwpOworCXZhbCB8PSBNQ1A1MV9TTUJVU19TRVRVUF9CX1RDT19SRUJPT1Q7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0Y29fcGNpLCBNQ1A1MV9TTUJVU19TRVRVUF9CLCB2YWwpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0Y29fcGNpLCBNQ1A1MV9TTUJVU19TRVRVUF9CLCAmdmFsKTsKKwlpZiAoISh2YWwgJiBNQ1A1MV9TTUJVU19TRVRVUF9CX1RDT19SRUJPT1QpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZXNldCBOT19SRUJPT1QgZmxhZywgcmVib290ICIKKwkJICAgICAgICJkaXNhYmxlZCBieSBoYXJkd2FyZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiAxOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKHRjb2Jhc2UsIDB4MTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudl90Y29faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBoYXJkd2FyZSB3YXRjaGRvZyBpcyB0aGVyZSAqLworCWlmICghbnZfdGNvX2dldGRldmljZSgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIHRvIHNlZSBpZiBsYXN0IHJlYm9vdCB3YXMgZHVlIHRvIHdhdGNoZG9nIHRpbWVvdXQgKi8KKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiV2F0Y2hkb2cgcmVib290ICVzZGV0ZWN0ZWQuXG4iLAorCSAgICAgICBpbmwoVENPX1NUUyh0Y29iYXNlKSkgJiBUQ09fU1RTX1RDTzJUT19TVFMgPyAiIiA6ICJub3QgIik7CisKKwkvKiBDbGVhciBvdXQgdGhlIG9sZCBzdGF0dXMgKi8KKwlvdXRsKFRDT19TVFNfUkVTRVQsIFRDT19TVFModGNvYmFzZSkpOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBoZWFydGJlYXQgdmFsdWUgaXMgd2l0aGluIGl0J3MgcmFuZ2UuCisJICogSWYgbm90LCByZXNldCB0byB0aGUgZGVmYXVsdC4KKwkgKi8KKwlpZiAodGNvX3RpbWVyX3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KSkgeworCQloZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7CisJCXRjb190aW1lcl9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJoZWFydGJlYXQgdmFsdWUgbXVzdCBiZSAyPGhlYXJ0YmVhdDwzOSwgIgorCQkgICAgICAgInVzaW5nICVkXG4iLCBoZWFydGJlYXQpOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJm52X3Rjb19taXNjZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgIgorCQkgICAgICAgIihlcnI9JWQpXG4iLCBXQVRDSERPR19NSU5PUiwgcmV0KTsKKwkJZ290byB1bnJlZ19yZWdpb247CisJfQorCisJY2xlYXJfYml0KDAsICZ0aW1lcl9hbGl2ZSk7CisKKwl0Y29fdGltZXJfc3RvcCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkICgweCUwNHgpLiBoZWFydGJlYXQ9JWQgc2VjICIKKwkgICAgICAgIihub3dheW91dD0lZClcbiIsIHRjb2Jhc2UsIGhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK3VucmVnX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbih0Y29iYXNlLCAweDEwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnZfdGNvX2NsZWFudXAodm9pZCkKK3sKKwl1MzIgdmFsOworCisJLyogU3RvcCB0aGUgdGltZXIgYmVmb3JlIHdlIGxlYXZlICovCisJaWYgKCFub3dheW91dCkKKwkJdGNvX3RpbWVyX3N0b3AoKTsKKworCS8qIFNldCB0aGUgTk9fUkVCT09UIGJpdCB0byBwcmV2ZW50IGxhdGVyIHJlYm9vdHMsIGp1c3QgZm9yIHN1cmUgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGNvX3BjaSwgTUNQNTFfU01CVVNfU0VUVVBfQiwgJnZhbCk7CisJdmFsICY9IH5NQ1A1MV9TTUJVU19TRVRVUF9CX1RDT19SRUJPT1Q7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0Y29fcGNpLCBNQ1A1MV9TTUJVU19TRVRVUF9CLCB2YWwpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0Y29fcGNpLCBNQ1A1MV9TTUJVU19TRVRVUF9CLCAmdmFsKTsKKwlpZiAodmFsICYgTUNQNTFfU01CVVNfU0VUVVBfQl9UQ09fUkVCT09UKSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYICJDb3VsZG4ndCB1bnNldCBSRUJPT1QgYml0LiAgTWFjaGluZSBtYXkgIgorCQkgICAgICAgInNvb24gcmVzZXRcbiIpOworCX0KKworCS8qIERlcmVnaXN0ZXIgKi8KKwltaXNjX2RlcmVnaXN0ZXIoJm52X3Rjb19taXNjZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbih0Y29iYXNlLCAweDEwKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbnZfdGNvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaWYgKHRjb2Jhc2UpCisJCW52X3Rjb19jbGVhbnVwKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnZfdGNvX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwl0Y29fdGltZXJfc3RvcCgpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBudl90Y29fZHJpdmVyID0geworCS5wcm9iZQkJPSBudl90Y29faW5pdCwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG52X3Rjb19yZW1vdmUpLAorCS5zaHV0ZG93bgk9IG52X3Rjb19zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gVENPX01PRFVMRV9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBudl90Y29faW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5WIFRDTyBXYXRjaERvZyBUaW1lciBEcml2ZXIgdiVzXG4iLAorCSAgICAgICBUQ09fVkVSU0lPTik7CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm52X3Rjb19kcml2ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwludl90Y29fcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgKKwkJCQkJVENPX01PRFVMRV9OQU1FLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihudl90Y29fcGxhdGZvcm1fZGV2aWNlKSkgeworCQllcnIgPSBQVFJfRVJSKG52X3Rjb19wbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKwordW5yZWdfcGxhdGZvcm1fZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZudl90Y29fZHJpdmVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbnZfdGNvX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobnZfdGNvX3BsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm52X3Rjb19kcml2ZXIpOworCXByaW50ayhLRVJOX0lORk8gUEZYICJOViBUQ08gV2F0Y2hkb2cgTW9kdWxlIFVubG9hZGVkLlxuIik7Cit9CisKK21vZHVsZV9pbml0KG52X3Rjb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChudl90Y29fY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJNaWtlIFdheWNoaXNvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQ08gdGltZXIgZHJpdmVyIGZvciBOViBjaGlwc2V0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9udl90Y28uaCBiL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkMWQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqCW52X3RjbzoJVENPIHRpbWVyIGRyaXZlciBmb3IgblZpZGlhIGNoaXBzZXRzLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwNSBHb29nbGUgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKglTdXBwb3J0ZWQgQ2hpcHNldHM6CisgKgkJLSBNQ1A1MS9NQ1A1NQorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMCBrZXJuZWwgY29uY2VwdHMgPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+LCBBbGwgUmlnaHRzCisgKglSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cua2VybmVsY29uY2VwdHMuZGUKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIga2VybmVsIGNvbmNlcHRzIG5vciBOaWxzIEZhZXJiZXIgYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDAJa2VybmVsIGNvbmNlcHRzIDxuaWxzQGtlcm5lbGNvbmNlcHRzLmRlPgorICoJCQkJZGV2ZWxvcGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZW50cm8gQUcsIEhhYXIvTXVuaWNoIChHZXJtYW55KQorICoKKyAqCVRDTyB0aW1lciBkcml2ZXIgZm9yIE5WIGNoaXBzZXRzCisgKgliYXNlZCBvbiBzb2Z0ZG9nLmMgYnkgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqLworCisvKgorICogU29tZSBhZGRyZXNzIGRlZmluaXRpb25zIGZvciB0aGUgVENPCisgKi8KKworI2RlZmluZSBUQ09fUkxEKGJhc2UpCSgoYmFzZSkgKyAweDAwKQkvKiBUQ08gVGltZXIgUmVsb2FkIGFuZCBDdXJyZW50IFZhbHVlICovCisjZGVmaW5lIFRDT19UTVIoYmFzZSkJKChiYXNlKSArIDB4MDEpCS8qIFRDTyBUaW1lciBJbml0aWFsIFZhbHVlCSovCisKKyNkZWZpbmUgVENPX1NUUyhiYXNlKQkoKGJhc2UpICsgMHgwNCkJLyogVENPIFN0YXR1cyBSZWdpc3RlcgkJKi8KKy8qCisgKiBUQ08gQm9vdCBTdGF0dXMgYml0OiBzZXQgb24gVENPIHJlc2V0LCByZXNldCBieSBzb2Z0d2FyZSBvciBzdGFuZGJ5CisgKiBwb3dlci1nb29kIChzdXJ2aXZlcyByZWJvb3RzKSwgdW5mb3J0dW5hdGVseSB0aGlzIGJpdCBpcyBuZXZlcgorICogc2V0LgorICovCisjICBkZWZpbmUgVENPX1NUU19CT09UX1NUUwkoMSA8PCA5KQorLyoKKyAqIGZpcnN0IGFuZCAybmQgdGltZW91dCBzdGF0dXMgYml0cywgdGhlc2UgYWxzbyBzdXJ2aXZlIGEgd2FybSBib290LAorICogYW5kIHRoZXkgd29yaywgc28gd2UgdXNlIHRoZW0uCisgKi8KKyMgIGRlZmluZSBUQ09fU1RTX1RDT19JTlRfU1RTCSgxIDw8IDEpCisjICBkZWZpbmUgVENPX1NUU19UQ08yVE9fU1RTCSgxIDw8IDEwKQorIyAgZGVmaW5lIFRDT19TVFNfUkVTRVQJCShUQ09fU1RTX0JPT1RfU1RTIHwgVENPX1NUU19UQ08yVE9fU1RTIHwgXAorCQkJCSBUQ09fU1RTX1RDT19JTlRfU1RTKQorCisjZGVmaW5lIFRDT19DTlQoYmFzZSkJKChiYXNlKSArIDB4MDgpCS8qIFRDTyBDb250cm9sIFJlZ2lzdGVyCSovCisjICBkZWZpbmUgVENPX0NOVF9UQ09IQUxUCSgxIDw8IDEyKQorCisjZGVmaW5lIE1DUDUxX1NNQlVTX1NFVFVQX0IgMHhlOAorIyAgZGVmaW5lIE1DUDUxX1NNQlVTX1NFVFVQX0JfVENPX1JFQk9PVCAoMSA8PCAyNSkKKworLyoKKyAqIFRoZSBTTUlfRU4gcmVnaXN0ZXIgaXMgYXQgdGhlIGJhc2UgaW8gYWRkcmVzcyArIDB4MDQsCisgKiB3aGlsZSBUQ09CQVNFIGlzICsgMHg0MC4KKyAqLworI2RlZmluZSBNQ1A1MV9TTUlfRU4oYmFzZSkJKChiYXNlKSAtIDB4NDAgKyAweDA0KQorIyAgZGVmaW5lIE1DUDUxX1NNSV9FTl9UQ08JKCgxIDw8IDQpIHwgKDEgPDwgNSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NwNTEwMF90Y28uYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A1MTAwX3Rjby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODM3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NwNTEwMF90Y28uYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqCXNwNTEwMF90Y28gOglUQ08gdGltZXIgZHJpdmVyIGZvciBzcDUxMDAgY2hpcHNldHMKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoJQmFzZWQgb24gaTh4eF90Y28uYzoKKyAqCShjKSBDb3B5cmlnaHQgMjAwMCBrZXJuZWwgY29uY2VwdHMgPG5pbHNAa2VybmVsY29uY2VwdHMuZGU+LCBBbGwgUmlnaHRzCisgKglSZXNlcnZlZC4KKyAqCQkJCWh0dHA6Ly93d3cua2VybmVsY29uY2VwdHMuZGUKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVNlZSBBTUQgUHVibGljYXRpb24gNDMwMDkgIkFNRCBTQjcwMC83MTAvNzUwIFJlZ2lzdGVyIFJlZmVyZW5jZSBHdWlkZSIKKyAqLworCisvKgorICoJSW5jbHVkZXMsIGRlZmluZXMsIHZhcmlhYmxlcywgbW9kdWxlIHBhcmFtZXRlcnMsIC4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJzcDUxMDBfdGNvLmgiCisKKy8qIE1vZHVsZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUQ09fVkVSU0lPTiAiMC4wMSIKKyNkZWZpbmUgVENPX01PRFVMRV9OQU1FICJTUDUxMDAgVENPIHRpbWVyIgorI2RlZmluZSBUQ09fRFJJVkVSX05BTUUgICBUQ09fTU9EVUxFX05BTUUgIiwgdiIgVENPX1ZFUlNJT04KKyNkZWZpbmUgUEZYIFRDT19NT0RVTEVfTkFNRSAiOiAiCisKKy8qIGludGVybmFsIHZhcmlhYmxlcyAqLworc3RhdGljIHZvaWQgX19pb21lbSAqdGNvYmFzZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG1faW9iYXNlOworc3RhdGljIERFRklORV9TUElOTE9DSyh0Y29fbG9jayk7CS8qIEd1YXJkcyB0aGUgaGFyZHdhcmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2FsaXZlOworc3RhdGljIGNoYXIgdGNvX2V4cGVjdF9jbG9zZTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc3A1MTAwX3Rjb19wY2k7CisKKy8qIHRoZSB3YXRjaGRvZyBwbGF0Zm9ybSBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzcDUxMDBfdGNvX3BsYXRmb3JtX2RldmljZTsKKworLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBXQVRDSERPR19IRUFSVEJFQVQgNjAJLyogNjAgc2VjIGRlZmF1bHQgaGVhcnRiZWF0LiAqLworc3RhdGljIGludCBoZWFydGJlYXQgPSBXQVRDSERPR19IRUFSVEJFQVQ7ICAvKiBpbiBzZWNvbmRzICovCittb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKGRlZmF1bHQ9IgorCQkgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX0hFQVJUQkVBVCkgIikiKTsKKworc3RhdGljIGludCBub3dheW91dCA9IFdBVENIRE9HX05PV0FZT1VUOworbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCIKKwkJIiAoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworLyoKKyAqIFNvbWUgVENPIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCB0Y29fdGltZXJfc3RhcnQodm9pZCkKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGNvX2xvY2ssIGZsYWdzKTsKKwl2YWwgPSByZWFkbChTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCXZhbCB8PSBTUDUxMDBfV0RUX1NUQVJUX1NUT1BfQklUOworCXdyaXRlbCh2YWwsIFNQNTEwMF9XRFRfQ09OVFJPTCh0Y29iYXNlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGNvX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdGNvX3RpbWVyX3N0b3Aodm9pZCkKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGNvX2xvY2ssIGZsYWdzKTsKKwl2YWwgPSByZWFkbChTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCXZhbCAmPSB+U1A1MTAwX1dEVF9TVEFSVF9TVE9QX0JJVDsKKwl3cml0ZWwodmFsLCBTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRjb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRjb190aW1lcl9rZWVwYWxpdmUodm9pZCkKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGNvX2xvY2ssIGZsYWdzKTsKKwl2YWwgPSByZWFkbChTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCXZhbCB8PSBTUDUxMDBfV0RUX1RSSUdHRVJfQklUOworCXdyaXRlbCh2YWwsIFNQNTEwMF9XRFRfQ09OVFJPTCh0Y29iYXNlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGNvX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdChpbnQgdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHQgPCAwIHx8IHQgPiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV3JpdGUgbmV3IGhlYXJ0YmVhdCB0byB3YXRjaGRvZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ0Y29fbG9jaywgZmxhZ3MpOworCXdyaXRlbCh0LCBTUDUxMDBfV0RUX0NPVU5UKHRjb2Jhc2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0Y29fbG9jaywgZmxhZ3MpOworCisJaGVhcnRiZWF0ID0gdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCS9kZXYvd2F0Y2hkb2cgaGFuZGxpbmcKKyAqLworCitzdGF0aWMgaW50IHNwNTEwMF90Y29fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiAvZGV2L3dhdGNoZG9nIGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnRpbWVyX2FsaXZlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFJlbG9hZCBhbmQgYWN0aXZhdGUgdGltZXIgKi8KKwl0Y29fdGltZXJfc3RhcnQoKTsKKwl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHNwNTEwMF90Y29fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBTaHV0IG9mZiB0aGUgdGltZXIuICovCisJaWYgKHRjb19leHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJdGNvX3RpbWVyX3N0b3AoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUIFBGWAorCQkJIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJfQorCWNsZWFyX2JpdCgwLCAmdGltZXJfYWxpdmUpOworCXRjb19leHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzcDUxMDBfdGNvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJLyogU2VlIGlmIHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyICdWJyBhbmQgcmVsb2FkIHRoZSB0aW1lciAqLworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCS8qIG5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkJCSAqIGZpdmUgbW9udGhzIGFnby4uLiAqLworCQkJdGNvX2V4cGVjdF9jbG9zZSA9IDA7CisKKwkJCS8qIHNjYW4gdG8gc2VlIHdoZXRoZXIgb3Igbm90IHdlIGdvdCB0aGUgbWFnaWMgY2hhcmFjdGVyCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQl0Y29fZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCB3ZSBzaG91bGQgcmVsb2FkIHRoZSB0aW1lciAqLworCQl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBsb25nIHNwNTEwMF90Y29faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBuZXdfb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKKwlpbnQgbmV3X2hlYXJ0YmVhdDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJCS5vcHRpb25zID0JCVdESU9GX1NFVFRJTUVPVVQgfAorCQkJCQlXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKKwkJLmZpcm13YXJlX3ZlcnNpb24gPQkwLAorCQkuaWRlbnRpdHkgPQkJVENPX01PRFVMRV9OQU1FLAorCX07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsCisJCQlzaXplb2YoaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyKG5ld19vcHRpb25zLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobmV3X29wdGlvbnMgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJdGNvX3RpbWVyX3N0b3AoKTsKKwkJCXJldHZhbCA9IDA7CisJCX0KKwkJaWYgKG5ld19vcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJdGNvX3RpbWVyX3N0YXJ0KCk7CisJCQl0Y29fdGltZXJfa2VlcGFsaXZlKCk7CisJCQlyZXR2YWwgPSAwOworCQl9CisJCXJldHVybiByZXR2YWw7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXRjb190aW1lcl9rZWVwYWxpdmUoKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X2hlYXJ0YmVhdCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHRjb190aW1lcl9zZXRfaGVhcnRiZWF0KG5ld19oZWFydGJlYXQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRjb190aW1lcl9rZWVwYWxpdmUoKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoaGVhcnRiZWF0LCBwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKKy8qCisgKiBLZXJuZWwgSW50ZXJmYWNlcworICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwNTEwMF90Y29fZm9wcyA9IHsKKwkub3duZXIgPQkJVEhJU19NT0RVTEUsCisJLmxsc2VlayA9CQlub19sbHNlZWssCisJLndyaXRlID0JCXNwNTEwMF90Y29fd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0Jc3A1MTAwX3Rjb19pb2N0bCwKKwkub3BlbiA9CQkJc3A1MTAwX3Rjb19vcGVuLAorCS5yZWxlYXNlID0JCXNwNTEwMF90Y29fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzcDUxMDBfdGNvX21pc2NkZXYgPSB7CisJLm1pbm9yID0JV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPQkJIndhdGNoZG9nIiwKKwkuZm9wcyA9CQkmc3A1MTAwX3Rjb19mb3BzLAorfTsKKworLyoKKyAqIERhdGEgZm9yIFBDSSBkcml2ZXIgaW50ZXJmYWNlCisgKgorICogVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZAorICogUENJIGlkcyB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseQorICogcmVnaXN0ZXIgYSBwY2lfZHJpdmVyLCBiZWNhdXNlIHNvbWVvbmUgZWxzZSBtaWdodAorICogd2FudCB0byByZWdpc3RlciBhbm90aGVyIGRyaXZlciBvbiB0aGUgc2FtZSBQQ0kgaWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzcDUxMDBfdGNvX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9TQlgwMF9TTUJVUywgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIH0sCisJeyAwLCB9LAkJCS8qIEVuZCBvZiBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNwNTEwMF90Y29fcGNpX3RibCk7CisKKy8qCisgKiBJbml0ICYgZXhpdCByb3V0aW5lcworICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIF9fZGV2aW5pdCBzcDUxMDBfdGNvX3NldHVwZGV2aWNlKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJdTMyIHZhbDsKKworCS8qIE1hdGNoIHRoZSBQQ0kgZGV2aWNlICovCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJaWYgKHBjaV9tYXRjaF9pZChzcDUxMDBfdGNvX3BjaV90YmwsIGRldikgIT0gTlVMTCkgeworCQkJc3A1MTAwX3Rjb19wY2kgPSBkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghc3A1MTAwX3Rjb19wY2kpCisJCXJldHVybiAwOworCisJLyogUmVxdWVzdCB0aGUgSU8gcG9ydHMgdXNlZCBieSB0aGlzIGRyaXZlciAqLworCXBtX2lvYmFzZSA9IFNQNTEwMF9JT19QTV9JTkRFWF9SRUc7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwbV9pb2Jhc2UsIFNQNTEwMF9QTV9JT1BPUlRTX1NJWkUsICJTUDUxMDAgVENPIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSS9PIGFkZHJlc3MgMHglMDR4IGFscmVhZHkgaW4gdXNlXG4iLAorCQkJcG1faW9iYXNlKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIEZpbmQgdGhlIHdhdGNoZG9nIGJhc2UgYWRkcmVzcy4gKi8KKwlvdXRiKFNQNTEwMF9QTV9XQVRDSERPR19CQVNFMywgU1A1MTAwX0lPX1BNX0lOREVYX1JFRyk7CisJdmFsID0gaW5iKFNQNTEwMF9JT19QTV9EQVRBX1JFRyk7CisJb3V0YihTUDUxMDBfUE1fV0FUQ0hET0dfQkFTRTIsIFNQNTEwMF9JT19QTV9JTkRFWF9SRUcpOworCXZhbCA9IHZhbCA8PCA4IHwgaW5iKFNQNTEwMF9JT19QTV9EQVRBX1JFRyk7CisJb3V0YihTUDUxMDBfUE1fV0FUQ0hET0dfQkFTRTEsIFNQNTEwMF9JT19QTV9JTkRFWF9SRUcpOworCXZhbCA9IHZhbCA8PCA4IHwgaW5iKFNQNTEwMF9JT19QTV9EQVRBX1JFRyk7CisJb3V0YihTUDUxMDBfUE1fV0FUQ0hET0dfQkFTRTAsIFNQNTEwMF9JT19QTV9JTkRFWF9SRUcpOworCS8qIExvdyB0aHJlZSBiaXRzIG9mIEJBU0UwIGFyZSByZXNlcnZlZC4gKi8KKwl2YWwgPSB2YWwgPDwgOCB8IChpbmIoU1A1MTAwX0lPX1BNX0RBVEFfUkVHKSAmIDB4ZjgpOworCisJdGNvYmFzZSA9IGlvcmVtYXAodmFsLCBTUDUxMDBfV0RUX01FTV9NQVBfU0laRSk7CisJaWYgKHRjb2Jhc2UgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gZ2V0IHRjb2Jhc2UgYWRkcmVzc1xuIik7CisJCWdvdG8gdW5yZWdfcmVnaW9uOworCX0KKworCS8qIEVuYWJsZSB3YXRjaGRvZyBkZWNvZGUgYml0ICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNwNTEwMF90Y29fcGNpLAorCQkJICAgICAgU1A1MTAwX1BDSV9XQVRDSERPR19NSVNDX1JFRywKKwkJCSAgICAgICZ2YWwpOworCisJdmFsIHw9IFNQNTEwMF9QQ0lfV0FUQ0hET0dfREVDT0RFX0VOOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzcDUxMDBfdGNvX3BjaSwKKwkJCSAgICAgICBTUDUxMDBfUENJX1dBVENIRE9HX01JU0NfUkVHLAorCQkJICAgICAgIHZhbCk7CisKKwkvKiBFbmFibGUgV2F0Y2hkb2cgdGltZXIgYW5kIHNldCB0aGUgcmVzb2x1dGlvbiB0byAxIHNlYy4gKi8KKwlvdXRiKFNQNTEwMF9QTV9XQVRDSERPR19DT05UUk9MLCBTUDUxMDBfSU9fUE1fSU5ERVhfUkVHKTsKKwl2YWwgPSBpbmIoU1A1MTAwX0lPX1BNX0RBVEFfUkVHKTsKKwl2YWwgfD0gU1A1MTAwX1BNX1dBVENIRE9HX1NFQ09ORF9SRVM7CisJdmFsICY9IH5TUDUxMDBfUE1fV0FUQ0hET0dfRElTQUJMRTsKKwlvdXRiKHZhbCwgU1A1MTAwX0lPX1BNX0RBVEFfUkVHKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIHdhdGNoZG9nIGFjdGlvbiBpcyBzZXQgdG8gcmVzZXQgdGhlIHN5c3RlbS4gKi8KKwl2YWwgPSByZWFkbChTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCXZhbCAmPSB+U1A1MTAwX1BNX1dBVENIRE9HX0FDVElPTl9SRVNFVDsKKwl3cml0ZWwodmFsLCBTUDUxMDBfV0RUX0NPTlRST0wodGNvYmFzZSkpOworCisJLyogU2V0IGEgcmVhc29uYWJsZSBoZWFydGJlYXQgYmVmb3JlIHdlIHN0b3AgdGhlIHRpbWVyICovCisJdGNvX3RpbWVyX3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KTsKKworCS8qCisJICogU3RvcCB0aGUgVENPIGJlZm9yZSB3ZSBjaGFuZ2UgYW55dGhpbmcgc28gd2UgZG9uJ3QgcmFjZSB3aXRoCisJICogYSB6ZXJvZWQgdGltZXIuCisJICovCisJdGNvX3RpbWVyX3N0b3AoKTsKKworCS8qIERvbmUgKi8KKwlyZXR1cm4gMTsKKworCWlvdW5tYXAodGNvYmFzZSk7Cit1bnJlZ19yZWdpb246CisJcmVsZWFzZV9yZWdpb24ocG1faW9iYXNlLCBTUDUxMDBfUE1fSU9QT1JUU19TSVpFKTsKK2V4aXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwNTEwMF90Y29faW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGhhcmR3YXJlIHdhdGNoZG9nIGlzIHRoZXJlLiBJZiBmb3VuZCwgdGhlbgorCSAqIHNldCBpdCB1cC4KKwkgKi8KKwlpZiAoIXNwNTEwMF90Y29fc2V0dXBkZXZpY2UoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgbGFzdCByZWJvb3Qgd2FzIGR1ZSB0byB3YXRjaGRvZyB0aW1lb3V0ICovCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIldhdGNoZG9nIHJlYm9vdCAlc2RldGVjdGVkLlxuIiwKKwkgICAgICAgcmVhZGwoU1A1MTAwX1dEVF9DT05UUk9MKHRjb2Jhc2UpKSAmIFNQNTEwMF9QTV9XQVRDSERPR19GSVJFRCA/CisJCSAgICAgICIiIDogIm5vdCAiKTsKKworCS8qIENsZWFyIG91dCB0aGUgb2xkIHN0YXR1cyAqLworCXZhbCA9IHJlYWRsKFNQNTEwMF9XRFRfQ09OVFJPTCh0Y29iYXNlKSk7CisJdmFsICY9IH5TUDUxMDBfUE1fV0FUQ0hET0dfRklSRUQ7CisJd3JpdGVsKHZhbCwgU1A1MTAwX1dEVF9DT05UUk9MKHRjb2Jhc2UpKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiBpdCdzIHJhbmdlLgorCSAqIElmIG5vdCwgcmVzZXQgdG8gdGhlIGRlZmF1bHQuCisJICovCisJaWYgKHRjb190aW1lcl9zZXRfaGVhcnRiZWF0KGhlYXJ0YmVhdCkpIHsKKwkJaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOworCQl0Y29fdGltZXJfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpOworCX0KKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnNwNTEwMF90Y29fbWlzY2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSIKKwkJICAgICAgICIlZCAoZXJyPSVkKVxuIiwKKwkJICAgICAgIFdBVENIRE9HX01JTk9SLCByZXQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJY2xlYXJfYml0KDAsICZ0aW1lcl9hbGl2ZSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQgKDB4JXApLiBoZWFydGJlYXQ9JWQgc2VjIgorCQkiIChub3dheW91dD0lZClcbiIsCisJCXRjb2Jhc2UsIGhlYXJ0YmVhdCwgbm93YXlvdXQpOworCisJcmV0dXJuIDA7CisKK2V4aXQ6CisJaW91bm1hcCh0Y29iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihwbV9pb2Jhc2UsIFNQNTEwMF9QTV9JT1BPUlRTX1NJWkUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzcDUxMDBfdGNvX2NsZWFudXAodm9pZCkKK3sKKwkvKiBTdG9wIHRoZSB0aW1lciBiZWZvcmUgd2UgbGVhdmUgKi8KKwlpZiAoIW5vd2F5b3V0KQorCQl0Y29fdGltZXJfc3RvcCgpOworCisJLyogRGVyZWdpc3RlciAqLworCW1pc2NfZGVyZWdpc3Rlcigmc3A1MTAwX3Rjb19taXNjZGV2KTsKKwlpb3VubWFwKHRjb2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHBtX2lvYmFzZSwgU1A1MTAwX1BNX0lPUE9SVFNfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNwNTEwMF90Y29fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpZiAodGNvYmFzZSkKKwkJc3A1MTAwX3Rjb19jbGVhbnVwKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwNTEwMF90Y29fc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXRjb190aW1lcl9zdG9wKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwNTEwMF90Y29fZHJpdmVyID0geworCS5wcm9iZQkJPSBzcDUxMDBfdGNvX2luaXQsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcDUxMDBfdGNvX3JlbW92ZSksCisJLnNodXRkb3duCT0gc3A1MTAwX3Rjb19zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gVENPX01PRFVMRV9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcDUxMDBfdGNvX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJTUDUxMDAgVENPIFdhdGNoRG9nIFRpbWVyIERyaXZlciB2JXNcbiIsCisJICAgICAgIFRDT19WRVJTSU9OKTsKKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3A1MTAwX3Rjb19kcml2ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzcDUxMDBfdGNvX3BsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoCisJCQkJCVRDT19NT0RVTEVfTkFNRSwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIoc3A1MTAwX3Rjb19wbGF0Zm9ybV9kZXZpY2UpKSB7CisJCWVyciA9IFBUUl9FUlIoc3A1MTAwX3Rjb19wbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIHVucmVnX3BsYXRmb3JtX2RyaXZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKwordW5yZWdfcGxhdGZvcm1fZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzcDUxMDBfdGNvX2RyaXZlcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNwNTEwMF90Y29fY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzcDUxMDBfdGNvX3BsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwNTEwMF90Y29fZHJpdmVyKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU1A1MTAwIFRDTyBXYXRjaGRvZyBNb2R1bGUgVW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoc3A1MTAwX3Rjb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzcDUxMDBfdGNvX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiUHJpeWFua2EgR3VwdGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVENPIHRpbWVyIGRyaXZlciBmb3IgU1A1MTAwIGNoaXBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3A1MTAwX3Rjby5oIGIvZHJpdmVycy93YXRjaGRvZy9zcDUxMDBfdGNvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMTZjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A1MTAwX3Rjby5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKglzcDUxMDBfdGNvOglUQ08gdGltZXIgZHJpdmVyIGZvciBzcDUxMDAgY2hpcHNldHMuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCVRDTyB0aW1lciBkcml2ZXIgZm9yIHNwNTEwMCBjaGlwc2V0cworICovCisKKy8qCisgKiBTb21lIGFkZHJlc3MgZGVmaW5pdGlvbnMgZm9yIHRoZSBXYXRjaGRvZworICovCisKKyNkZWZpbmUgU1A1MTAwX1dEVF9NRU1fTUFQX1NJWkUJCTB4MDgKKyNkZWZpbmUgU1A1MTAwX1dEVF9DT05UUk9MKGJhc2UpCSgoYmFzZSkgKyAweDAwKSAvKiBXYXRjaGRvZyBDb250cm9sICovCisjZGVmaW5lIFNQNTEwMF9XRFRfQ09VTlQoYmFzZSkJCSgoYmFzZSkgKyAweDA0KSAvKiBXYXRjaGRvZyBDb3VudCAqLworCisjZGVmaW5lIFNQNTEwMF9XRFRfU1RBUlRfU1RPUF9CSVQJMQorI2RlZmluZSBTUDUxMDBfV0RUX1RSSUdHRVJfQklUCQkoMSA8PCA3KQorCisjZGVmaW5lIFNQNTEwMF9QQ0lfV0FUQ0hET0dfTUlTQ19SRUcJMHg0MQorI2RlZmluZSBTUDUxMDBfUENJX1dBVENIRE9HX0RFQ09ERV9FTgkoMSA8PCAzKQorCisjZGVmaW5lIFNQNTEwMF9QTV9JT1BPUlRTX1NJWkUJCTB4MDIKKworLyogVGhlc2UgdHdvIElPIHJlZ2lzdGVycyBhcmUgaGFyZGNvZGVkIGFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8KKyAqIHJlYWQgdGhlbSBmcm9tIGEgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1A1MTAwX0lPX1BNX0lOREVYX1JFRwkJMHhDRDYKKyNkZWZpbmUgU1A1MTAwX0lPX1BNX0RBVEFfUkVHCQkweENENworCisjZGVmaW5lIFNQNTEwMF9QTV9XQVRDSERPR19DT05UUk9MCTB4NjkKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX0JBU0UwCTB4NkMKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX0JBU0UxCTB4NkQKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX0JBU0UyCTB4NkUKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX0JBU0UzCTB4NkYKKworI2RlZmluZSBTUDUxMDBfUE1fV0FUQ0hET0dfRklSRUQJKDEgPDwgMSkKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX0FDVElPTl9SRVNFVAkoMSA8PCAyKQorCisjZGVmaW5lIFNQNTEwMF9QTV9XQVRDSERPR19ESVNBQkxFCTEKKyNkZWZpbmUgU1A1MTAwX1BNX1dBVENIRE9HX1NFQ09ORF9SRVMJKDMgPDwgMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3c4MzYyN2hmX3dkdC5jCmluZGV4IDBmNTI4OGQuLmU1YzkxZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvdzgzNjI3aGZfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy93ODM2MjdoZl93ZHQuYwpAQCAtNDIsNyArNDIsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmL3RoZi9oZyBXRFQiCisjZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmL3RoZi9oZy9kaGcgV0RUIgogI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCiAjZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KIApAQCAtODksNyArODksNyBAQAogCQljID0gKChpbmJfcChXRFRfRUZEUikgJiAweGY3KSB8IDB4MDQpOyAvKiBzZWxlY3QgV0RUMCAqLwogCQlvdXRiX3AoMHgyYiwgV0RUX0VGRVIpOwogCQlvdXRiX3AoYywgV0RUX0VGRFIpOwkvKiBzZXQgR1BJTzMgdG8gV0RUMCAqLwotCX0gZWxzZSBpZiAoYyA9PSAweDg4KSB7CS8qIFc4MzYyN0VIRiAqLworCX0gZWxzZSBpZiAoYyA9PSAweDg4IHx8IGMgPT0gMHhhMCkgewkvKiBXODM2MjdFSEYgLyBXODM2MjdESEcgKi8KIAkJb3V0Yl9wKDB4MmQsIFdEVF9FRkVSKTsgLyogc2VsZWN0IEdQSU81ICovCiAJCWMgPSBpbmJfcChXRFRfRUZEUikgJiB+MHgwMTsgLyogUElONzcgLT4gV0RUMCMgKi8KIAkJb3V0Yl9wKDB4MmQsIFdEVF9FRkVSKTsKQEAgLTEyOSw2ICsxMjksOCBAQAogCXQgPSBpbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY1ICovCiAJdCAmPSB+MHgwQzsgICAgICAgICAgICAgICAvKiBzZXQgc2Vjb25kIG1vZGUgJiBkaXNhYmxlIGtleWJvYXJkCiAJCQkJICAgIHR1cm5pbmcgb2ZmIHdhdGNoZG9nICovCisJdCB8PSAweDAyOwkJICAvKiBlbmFibGUgdGhlIFdEVE8jIG91dHB1dCBsb3cgcHVsc2UKKwkJCQkgICAgdG8gdGhlIEtCUlNUIyBwaW4gKFBJTjYwKSAqLwogCW91dGJfcCh0LCBXRFRfRUZEUik7ICAgIC8qIFdyaXRlIGJhY2sgdG8gQ1JGNSAqLwogCiAJb3V0Yl9wKDB4RjcsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjcgKi8KQEAgLTMyMSw3ICszMjMsNyBAQAogewogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJXRFQgZHJpdmVyIGZvciB0aGUgV2luYm9uZChUTSkgVzgzNjI3SEYvVEhGL0hHIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIldEVCBkcml2ZXIgZm9yIHRoZSBXaW5ib25kKFRNKSBXODM2MjdIRi9USEYvSEcvREhHIFN1cGVyIEkvTyBjaGlwIGluaXRpYWxpc2luZy5cbiIpOwogCiAJaWYgKHdkdF9zZXRfaGVhcnRiZWF0KHRpbWVvdXQpKSB7CiAJCXdkdF9zZXRfaGVhcnRiZWF0KFdBVENIRE9HX1RJTUVPVVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vS2NvbmZpZyBiL2RyaXZlcnMveGVuL0tjb25maWcKaW5kZXggNmU2MTgwYy4uMDdiZWMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vS2NvbmZpZworKysgYi9kcml2ZXJzL3hlbi9LY29uZmlnCkBAIC0yOSw2ICsyOSwxNCBAQAogCSAgZmlyaW5nLgogCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCiAKK2NvbmZpZyBYRU5fQkFDS0VORAorCWJvb2wgIkJhY2tlbmQgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBYRU5fRE9NMAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGJhY2tlbmQgZGV2aWNlIGRyaXZlcnMgdGhhdCBwcm92aWRlIEkvTyBzZXJ2aWNlcworCSAgdG8gb3RoZXIgdmlydHVhbCBtYWNoaW5lcy4KKwogY29uZmlnIFhFTkZTCiAJdHJpc3RhdGUgIlhlbiBmaWxlc3lzdGVtIgogCWRlZmF1bHQgeQpAQCAtNjIsOSArNzAsMTkgQEAKIAkgdmlydHVhbCBlbnZpcm9ubWVudCwgL3N5cy9oeXBlcnZpc29yIHdpbGwgc3RpbGwgYmUgcHJlc2VudCwKIAkgYnV0IHdpbGwgaGF2ZSBubyB4ZW4gY29udGVudHMuCiAKK2NvbmZpZyBYRU5fWEVOQlVTX0ZST05URU5ECisJdHJpc3RhdGUKKworY29uZmlnIFhFTl9HTlRERVYKKwl0cmlzdGF0ZSAidXNlcnNwYWNlIGdyYW50IGFjY2VzcyBkZXZpY2UgZHJpdmVyIgorCWRlcGVuZHMgb24gWEVOCisJc2VsZWN0IE1NVV9OT1RJRklFUgorCWhlbHAKKwkgIEFsbG93cyB1c2Vyc3BhY2UgcHJvY2Vzc2VzIHRvIHVzZSBncmFudHMuCisKIGNvbmZpZyBYRU5fUExBVEZPUk1fUENJCiAJdHJpc3RhdGUgInhlbiBwbGF0Zm9ybSBwY2kgZGV2aWNlIGRyaXZlciIKLQlkZXBlbmRzIG9uIFhFTl9QVkhWTQorCWRlcGVuZHMgb24gWEVOX1BWSFZNICYmIFBDSQogCWRlZmF1bHQgbQogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIFhlbiBQQ0kgUGxhdGZvcm0gZGV2aWNlOiBpdCBpcyByZXNwb25zaWJsZSBmb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL01ha2VmaWxlIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKaW5kZXggNTMzYTE5OS4uNTA4OGNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKQEAgLTksMTEgKzksMTQgQEAKIG9iai0kKENPTkZJR19YRU5fWEVOQ09NTSkJKz0geGVuY29tbS5vCiBvYmotJChDT05GSUdfWEVOX0JBTExPT04pCSs9IGJhbGxvb24ubwogb2JqLSQoQ09ORklHX1hFTl9ERVZfRVZUQ0hOKQkrPSB4ZW4tZXZ0Y2huLm8KK29iai0kKENPTkZJR19YRU5fR05UREVWKQkrPSB4ZW4tZ250ZGV2Lm8KIG9iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwogb2JqLSQoQ09ORklHX1hFTl9TWVNfSFlQRVJWSVNPUikJKz0gc3lzLWh5cGVydmlzb3Iubwotb2JqLSQoQ09ORklHX1hFTl9QTEFURk9STV9QQ0kpCSs9IHBsYXRmb3JtLXBjaS5vCitvYmotJChDT05GSUdfWEVOX1BMQVRGT1JNX1BDSSkJKz0geGVuLXBsYXRmb3JtLXBjaS5vCiBvYmotJChDT05GSUdfU1dJT1RMQl9YRU4pCSs9IHN3aW90bGIteGVuLm8KIG9iai0kKENPTkZJR19YRU5fRE9NMCkJCSs9IHBjaS5vCiAKIHhlbi1ldnRjaG4teQkJCTo9IGV2dGNobi5vCit4ZW4tZ250ZGV2LXkJCQkJOj0gZ250ZGV2Lm8KIAoreGVuLXBsYXRmb3JtLXBjaS15CQk6PSBwbGF0Zm9ybS1wY2kubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCA2NWY4NjM3Li43NDY4MTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtMTcwLDYgKzE3MCw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXZ0Y2huX2Zyb21faXJxKHVuc2lnbmVkIGlycSkKIHsKKwlpZiAodW5saWtlbHkoV0FSTihpcnEgPCAwIHx8IGlycSA+PSBucl9pcnFzLCAiSW52YWxpZCBpcnEgJWQhXG4iLCBpcnEpKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gaW5mb19mb3JfaXJxKGlycSktPmV2dGNobjsKIH0KIApAQCAtNDA1LDE1ICs0MDgsMjEgQEAKIHsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7CiAJaW50IGlycSwgcmVzOwotCWludCBzdGFydCA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IGJvdHRvbSA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IHRvcCA9IG5yX2lycXMtMTsKIAotCWlmIChzdGFydCA9PSBucl9pcnFzKQorCWlmIChib3R0b20gPT0gbnJfaXJxcykKIAkJZ290byBub19pcnFzOwogCi0JLyogbnJfaXJxcyBpcyBhIG1hZ2ljIHZhbHVlLiBNdXN0IG5vdCB1c2UgaXQuKi8KLQlmb3IgKGlycSA9IG5yX2lycXMtMTsgaXJxID4gc3RhcnQ7IGlycS0tKSB7CisJLyogVGhpcyBsb29wIHN0YXJ0cyBmcm9tIHRoZSB0b3Agb2YgSVJRIHNwYWNlIGFuZCBnb2VzIGRvd24uCisJICogV2UgbmVlZCB0aGlzIGIvYyBpZiB3ZSBoYXZlIGEgUENJIGRldmljZSBpbiBhIFhlbiBQViBndWVzdAorCSAqIHdlIGRvIG5vdCBoYXZlIGFuIElPLUFQSUMgKHRob3VnaCB0aGUgYmFja2VuZCBtaWdodCBoYXZlIHRoZW0pCisJICogbWFwcGVkIGluLiBUbyBub3QgaGF2ZSBhIGNvbGxpc2lvbiBvZiBwaHlzaWNhbCBJUlFzIHdpdGggdGhlIFhlbgorCSAqIGV2ZW50IGNoYW5uZWxzIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIElSUSBzcGFjZSBmb3IgdmlydHVhbCBJUlFzLgorCSAqLworCWZvciAoaXJxID0gdG9wOyBpcnEgPiBib3R0b207IGlycS0tKSB7CiAJCWRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGlycSk7Ci0JCS8qIG9ubHkgMC0+MTUgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCisJCS8qIG9ubHkgMTUtPjAgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCiAJCWlmICghZGF0YSkKIAkJCWJyZWFrOwogCQlpZiAoZGF0YS0+Y2hpcCA9PSAmbm9faXJxX2NoaXApCkBAIC00MjQsNyArNDMzLDcgQEAKIAkJCXJldHVybiBpcnE7CiAJfQogCi0JaWYgKGlycSA9PSBzdGFydCkKKwlpZiAoaXJxID09IGJvdHRvbSkKIAkJZ290byBub19pcnFzOwogCiAJcmVzID0gaXJxX2FsbG9jX2Rlc2NfYXQoaXJxLCAtMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9nbnRkZXYuYyBiL2RyaXZlcnMveGVuL2dudGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzFjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi9nbnRkZXYuYwpAQCAtMCwwICsxLDY2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ250ZGV2LmMKKyAqCisgKiBEZXZpY2UgZm9yIGFjY2Vzc2luZyAoaW4gdXNlci1zcGFjZSkgcGFnZXMgdGhhdCBoYXZlIGJlZW4gZ3JhbnRlZCBieSBvdGhlcgorICogZG9tYWlucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgRCBHIE11cnJheS4KKyAqICAgICAgICAgICAoYykgMjAwOSBHZXJkIEhvZmZtYW5uIDxrcmF4ZWxAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDx4ZW4veGVuLmg+CisjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+CisjaW5jbHVkZSA8eGVuL2dudGRldi5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9wYWdlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkRlcmVrIEcuIE11cnJheSA8RGVyZWsuTXVycmF5QGNsLmNhbS5hYy51az4sICIKKwkgICAgICAiR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVzZXItc3BhY2UgZ3JhbnRlZCBwYWdlIGFjY2VzcyBkcml2ZXIiKTsKKworc3RhdGljIGludCBsaW1pdCA9IDEwMjQ7Cittb2R1bGVfcGFyYW0obGltaXQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxpbWl0LCAiTWF4aW11bSBudW1iZXIgb2YgZ3JhbnRzIHRoYXQgbWF5IGJlIG1hcHBlZCBhdCAiCisJCSJvbmNlIGJ5IGEgZ250ZGV2IGluc3RhbmNlIik7CisKK3N0cnVjdCBnbnRkZXZfcHJpdiB7CisJc3RydWN0IGxpc3RfaGVhZCBtYXBzOworCXVpbnQzMl90IHVzZWQ7CisJdWludDMyX3QgbGltaXQ7CisJLyogbG9jayBwcm90ZWN0cyBtYXBzIGZyb20gY29uY3VycmVudCBjaGFuZ2VzICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCBtbXVfbm90aWZpZXIgbW47Cit9OworCitzdHJ1Y3QgZ3JhbnRfbWFwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CisJc3RydWN0IGdudGRldl9wcml2ICpwcml2OworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCWludCBpbmRleDsKKwlpbnQgY291bnQ7CisJaW50IGZsYWdzOworCWludCBpc19tYXBwZWQ7CisJc3RydWN0IGlvY3RsX2dudGRldl9ncmFudF9yZWYgKmdyYW50czsKKwlzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgICAqbWFwX29wczsKKwlzdHJ1Y3QgZ250dGFiX3VubWFwX2dyYW50X3JlZiAqdW5tYXBfb3BzOworCXN0cnVjdCBwYWdlICoqcGFnZXM7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZ250ZGV2X3ByaW50X21hcHMoc3RydWN0IGdudGRldl9wcml2ICpwcml2LAorCQkJICAgICAgY2hhciAqdGV4dCwgaW50IHRleHRfaW5kZXgpCit7CisjaWZkZWYgREVCVUcKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7CisKKwlwcl9kZWJ1ZygibWFwcyBsaXN0IChwcml2ICVwLCB1c2FnZSAlZC8lZClcbiIsCisJICAgICAgIHByaXYsIHByaXYtPnVzZWQsIHByaXYtPmxpbWl0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcHJpdi0+bWFwcywgbmV4dCkKKwkJcHJfZGVidWcoIiAgaW5kZXggJTJkLCBjb3VudCAlMmQgJXNcbiIsCisJCSAgICAgICBtYXAtPmluZGV4LCBtYXAtPmNvdW50LAorCQkgICAgICAgbWFwLT5pbmRleCA9PSB0ZXh0X2luZGV4ICYmIHRleHQgPyB0ZXh0IDogIiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3JhbnRfbWFwICpnbnRkZXZfYWxsb2NfbWFwKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwgaW50IGNvdW50KQoreworCXN0cnVjdCBncmFudF9tYXAgKmFkZDsKKwlpbnQgaTsKKworCWFkZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncmFudF9tYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSBhZGQpCisJCXJldHVybiBOVUxMOworCisJYWRkLT5ncmFudHMgICAgPSBremFsbG9jKHNpemVvZihhZGQtPmdyYW50c1swXSkgICAgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJYWRkLT5tYXBfb3BzICAgPSBremFsbG9jKHNpemVvZihhZGQtPm1hcF9vcHNbMF0pICAgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJYWRkLT51bm1hcF9vcHMgPSBremFsbG9jKHNpemVvZihhZGQtPnVubWFwX29wc1swXSkgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJYWRkLT5wYWdlcyAgICAgPSBremFsbG9jKHNpemVvZihhZGQtPnBhZ2VzWzBdKSAgICAgKiBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKE5VTEwgPT0gYWRkLT5ncmFudHMgICAgfHwKKwkgICAgTlVMTCA9PSBhZGQtPm1hcF9vcHMgICB8fAorCSAgICBOVUxMID09IGFkZC0+dW5tYXBfb3BzIHx8CisJICAgIE5VTEwgPT0gYWRkLT5wYWdlcykKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlhZGQtPnBhZ2VzW2ldID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSk7CisJCWlmIChhZGQtPnBhZ2VzW2ldID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwl9CisKKwlhZGQtPmluZGV4ID0gMDsKKwlhZGQtPmNvdW50ID0gY291bnQ7CisJYWRkLT5wcml2ICA9IHByaXY7CisKKwlpZiAoYWRkLT5jb3VudCArIHByaXYtPnVzZWQgPiBwcml2LT5saW1pdCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gYWRkOworCitlcnI6CisJaWYgKGFkZC0+cGFnZXMpCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoYWRkLT5wYWdlc1tpXSkKKwkJCQlfX2ZyZWVfcGFnZShhZGQtPnBhZ2VzW2ldKTsKKwkJfQorCWtmcmVlKGFkZC0+cGFnZXMpOworCWtmcmVlKGFkZC0+Z3JhbnRzKTsKKwlrZnJlZShhZGQtPm1hcF9vcHMpOworCWtmcmVlKGFkZC0+dW5tYXBfb3BzKTsKKwlrZnJlZShhZGQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnbnRkZXZfYWRkX21hcChzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsIHN0cnVjdCBncmFudF9tYXAgKmFkZCkKK3sKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hcCwgJnByaXYtPm1hcHMsIG5leHQpIHsKKwkJaWYgKGFkZC0+aW5kZXggKyBhZGQtPmNvdW50IDwgbWFwLT5pbmRleCkgeworCQkJbGlzdF9hZGRfdGFpbCgmYWRkLT5uZXh0LCAmbWFwLT5uZXh0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlhZGQtPmluZGV4ID0gbWFwLT5pbmRleCArIG1hcC0+Y291bnQ7CisJfQorCWxpc3RfYWRkX3RhaWwoJmFkZC0+bmV4dCwgJnByaXYtPm1hcHMpOworCitkb25lOgorCXByaXYtPnVzZWQgKz0gYWRkLT5jb3VudDsKKwlnbnRkZXZfcHJpbnRfbWFwcyhwcml2LCAiW25ld10iLCBhZGQtPmluZGV4KTsKK30KKworc3RhdGljIHN0cnVjdCBncmFudF9tYXAgKmdudGRldl9maW5kX21hcF9pbmRleChzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCisJCWludCBpbmRleCwgaW50IGNvdW50KQoreworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcHJpdi0+bWFwcywgbmV4dCkgeworCQlpZiAobWFwLT5pbmRleCAhPSBpbmRleCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWFwLT5jb3VudCAhPSBjb3VudCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbWFwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBncmFudF9tYXAgKmdudGRldl9maW5kX21hcF92YWRkcihzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcHJpdi0+bWFwcywgbmV4dCkgeworCQlpZiAoIW1hcC0+dm1hKQorCQkJY29udGludWU7CisJCWlmICh2YWRkciA8IG1hcC0+dm1hLT52bV9zdGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAodmFkZHIgPj0gbWFwLT52bWEtPnZtX2VuZCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbWFwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnbnRkZXZfZGVsX21hcChzdHJ1Y3QgZ3JhbnRfbWFwICptYXApCit7CisJaW50IGk7CisKKwlpZiAobWFwLT52bWEpCisJCXJldHVybiAtRUJVU1k7CisJZm9yIChpID0gMDsgaSA8IG1hcC0+Y291bnQ7IGkrKykKKwkJaWYgKG1hcC0+dW5tYXBfb3BzW2ldLmhhbmRsZSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwltYXAtPnByaXYtPnVzZWQgLT0gbWFwLT5jb3VudDsKKwlsaXN0X2RlbCgmbWFwLT5uZXh0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ250ZGV2X2ZyZWVfbWFwKHN0cnVjdCBncmFudF9tYXAgKm1hcCkKK3sKKwlpbnQgaTsKKworCWlmICghbWFwKQorCQlyZXR1cm47CisKKwlpZiAobWFwLT5wYWdlcykKKwkJZm9yIChpID0gMDsgaSA8IG1hcC0+Y291bnQ7IGkrKykgeworCQkJaWYgKG1hcC0+cGFnZXNbaV0pCisJCQkJX19mcmVlX3BhZ2UobWFwLT5wYWdlc1tpXSk7CisJCX0KKwlrZnJlZShtYXAtPnBhZ2VzKTsKKwlrZnJlZShtYXAtPmdyYW50cyk7CisJa2ZyZWUobWFwLT5tYXBfb3BzKTsKKwlrZnJlZShtYXAtPnVubWFwX29wcyk7CisJa2ZyZWUobWFwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZmluZF9ncmFudF9wdGVzKHB0ZV90ICpwdGUsIHBndGFibGVfdCB0b2tlbiwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBncmFudF9tYXAgKm1hcCA9IGRhdGE7CisJdW5zaWduZWQgaW50IHBnbnIgPSAoYWRkciAtIG1hcC0+dm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwl1NjQgcHRlX21hZGRyOworCisJQlVHX09OKHBnbnIgPj0gbWFwLT5jb3VudCk7CisJcHRlX21hZGRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdGUpLm1hZGRyOworCisJZ250dGFiX3NldF9tYXBfb3AoJm1hcC0+bWFwX29wc1twZ25yXSwgcHRlX21hZGRyLAorCQkJICBHTlRNQVBfY29udGFpbnNfcHRlIHwgbWFwLT5mbGFncywKKwkJCSAgbWFwLT5ncmFudHNbcGducl0ucmVmLAorCQkJICBtYXAtPmdyYW50c1twZ25yXS5kb21pZCk7CisJZ250dGFiX3NldF91bm1hcF9vcCgmbWFwLT51bm1hcF9vcHNbcGducl0sIHB0ZV9tYWRkciwKKwkJCSAgICBHTlRNQVBfY29udGFpbnNfcHRlIHwgbWFwLT5mbGFncywKKwkJCSAgICAwIC8qIGhhbmRsZSAqLyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX2dyYW50X3BhZ2VzKHN0cnVjdCBncmFudF9tYXAgKm1hcCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXByX2RlYnVnKCJtYXAgJWQrJWRcbiIsIG1hcC0+aW5kZXgsIG1hcC0+Y291bnQpOworCWVyciA9IGdudHRhYl9tYXBfcmVmcyhtYXAtPm1hcF9vcHMsIG1hcC0+cGFnZXMsIG1hcC0+Y291bnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFwLT5jb3VudDsgaSsrKSB7CisJCWlmIChtYXAtPm1hcF9vcHNbaV0uc3RhdHVzKQorCQkJZXJyID0gLUVJTlZBTDsKKwkJbWFwLT51bm1hcF9vcHNbaV0uaGFuZGxlID0gbWFwLT5tYXBfb3BzW2ldLmhhbmRsZTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1bm1hcF9ncmFudF9wYWdlcyhzdHJ1Y3QgZ3JhbnRfbWFwICptYXAsIGludCBvZmZzZXQsIGludCBwYWdlcykKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXByX2RlYnVnKCJtYXAgJWQrJWQgWyVkKyVkXVxuIiwgbWFwLT5pbmRleCwgbWFwLT5jb3VudCwgb2Zmc2V0LCBwYWdlcyk7CisJZXJyID0gZ250dGFiX3VubWFwX3JlZnMobWFwLT51bm1hcF9vcHMgKyBvZmZzZXQsIG1hcC0+cGFnZXMsIHBhZ2VzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKKwkJaWYgKG1hcC0+dW5tYXBfb3BzW29mZnNldCtpXS5zdGF0dXMpCisJCQllcnIgPSAtRUlOVkFMOworCQltYXAtPnVubWFwX29wc1tvZmZzZXQraV0uaGFuZGxlID0gMDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGdudGRldl92bWFfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGdyYW50X21hcCAqbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlwcl9kZWJ1ZygiY2xvc2UgJXBcbiIsIHZtYSk7CisJbWFwLT5pc19tYXBwZWQgPSAwOworCW1hcC0+dm1hID0gTlVMTDsKKwl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ250ZGV2X3ZtYV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJcHJfZGVidWcoInZhZGRyICVwLCBwZ29mZiAlbGQgKHNob3VsZG4ndCBoYXBwZW4pXG4iLAorCQkJdm1mLT52aXJ0dWFsX2FkZHJlc3MsIHZtZi0+cGdvZmYpOworCXZtZi0+ZmxhZ3MgPSBWTV9GQVVMVF9FUlJPUjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBnbnRkZXZfdm1vcHMgPSB7CisJLmNsb3NlID0gZ250ZGV2X3ZtYV9jbG9zZSwKKwkuZmF1bHQgPSBnbnRkZXZfdm1hX2ZhdWx0LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIG1uX2ludmxfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllciAqbW4sCisJCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGdudGRldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKG1uLCBzdHJ1Y3QgZ250ZGV2X3ByaXYsIG1uKTsKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7CisJdW5zaWduZWQgbG9uZyBtc3RhcnQsIG1lbmQ7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZwcml2LT5tYXBzLCBuZXh0KSB7CisJCWlmICghbWFwLT52bWEpCisJCQljb250aW51ZTsKKwkJaWYgKCFtYXAtPmlzX21hcHBlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWFwLT52bWEtPnZtX3N0YXJ0ID49IGVuZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWFwLT52bWEtPnZtX2VuZCA8PSBzdGFydCkKKwkJCWNvbnRpbnVlOworCQltc3RhcnQgPSBtYXgoc3RhcnQsIG1hcC0+dm1hLT52bV9zdGFydCk7CisJCW1lbmQgICA9IG1pbihlbmQsICAgbWFwLT52bWEtPnZtX2VuZCk7CisJCXByX2RlYnVnKCJtYXAgJWQrJWQgKCVseCAlbHgpLCByYW5nZSAlbHggJWx4LCBtcmFuZ2UgJWx4ICVseFxuIiwKKwkJCQltYXAtPmluZGV4LCBtYXAtPmNvdW50LAorCQkJCW1hcC0+dm1hLT52bV9zdGFydCwgbWFwLT52bWEtPnZtX2VuZCwKKwkJCQlzdGFydCwgZW5kLCBtc3RhcnQsIG1lbmQpOworCQllcnIgPSB1bm1hcF9ncmFudF9wYWdlcyhtYXAsCisJCQkJCShtc3RhcnQgLSBtYXAtPnZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQsCisJCQkJCShtZW5kIC0gbXN0YXJ0KSA+PiBQQUdFX1NISUZUKTsKKwkJV0FSTl9PTihlcnIpOworCX0KKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG1uX2ludmxfcGFnZShzdHJ1Y3QgbW11X25vdGlmaWVyICptbiwKKwkJCSBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJbW5faW52bF9yYW5nZV9zdGFydChtbiwgbW0sIGFkZHJlc3MsIGFkZHJlc3MgKyBQQUdFX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBtbl9yZWxlYXNlKHN0cnVjdCBtbXVfbm90aWZpZXIgKm1uLAorCQkgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IGdudGRldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKG1uLCBzdHJ1Y3QgZ250ZGV2X3ByaXYsIG1uKTsKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7CisJaW50IGVycjsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZwcml2LT5tYXBzLCBuZXh0KSB7CisJCWlmICghbWFwLT52bWEpCisJCQljb250aW51ZTsKKwkJcHJfZGVidWcoIm1hcCAlZCslZCAoJWx4ICVseClcbiIsCisJCQkJbWFwLT5pbmRleCwgbWFwLT5jb3VudCwKKwkJCQltYXAtPnZtYS0+dm1fc3RhcnQsIG1hcC0+dm1hLT52bV9lbmQpOworCQllcnIgPSB1bm1hcF9ncmFudF9wYWdlcyhtYXAsIC8qIG9mZnNldCAqLyAwLCBtYXAtPmNvdW50KTsKKwkJV0FSTl9PTihlcnIpOworCX0KKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Cit9CisKK3N0cnVjdCBtbXVfbm90aWZpZXJfb3BzIGdudGRldl9tbXVfb3BzID0geworCS5yZWxlYXNlICAgICAgICAgICAgICAgID0gbW5fcmVsZWFzZSwKKwkuaW52YWxpZGF0ZV9wYWdlICAgICAgICA9IG1uX2ludmxfcGFnZSwKKwkuaW52YWxpZGF0ZV9yYW5nZV9zdGFydCA9IG1uX2ludmxfcmFuZ2Vfc3RhcnQsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBnbnRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmxpcCkKK3sKKwlzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXY7CisJaW50IHJldCA9IDA7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPm1hcHMpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5saW1pdCA9IGxpbWl0OworCisJcHJpdi0+bW0gPSBnZXRfdGFza19tbShjdXJyZW50KTsKKwlpZiAoIXByaXYtPm1tKSB7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcHJpdi0+bW4ub3BzID0gJmdudGRldl9tbXVfb3BzOworCXJldCA9IG1tdV9ub3RpZmllcl9yZWdpc3RlcigmcHJpdi0+bW4sIHByaXYtPm1tKTsKKwltbXB1dChwcml2LT5tbSk7CisKKwlpZiAocmV0KSB7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZsaXAtPnByaXZhdGVfZGF0YSA9IHByaXY7CisJcHJfZGVidWcoInByaXYgJXBcbiIsIHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ250ZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZsaXApCit7CisJc3RydWN0IGdudGRldl9wcml2ICpwcml2ID0gZmxpcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKwlpbnQgZXJyOworCisJcHJfZGVidWcoInByaXYgJXBcbiIsIHByaXYpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnByaXYtPm1hcHMpKSB7CisJCW1hcCA9IGxpc3RfZW50cnkocHJpdi0+bWFwcy5uZXh0LCBzdHJ1Y3QgZ3JhbnRfbWFwLCBuZXh0KTsKKwkJZXJyID0gZ250ZGV2X2RlbF9tYXAobWFwKTsKKwkJaWYgKFdBUk5fT04oZXJyKSkKKwkJCWdudGRldl9mcmVlX21hcChtYXApOworCisJfQorCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCW1tdV9ub3RpZmllcl91bnJlZ2lzdGVyKCZwcml2LT5tbiwgcHJpdi0+bW0pOworCWtmcmVlKHByaXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBnbnRkZXZfaW9jdGxfbWFwX2dyYW50X3JlZihzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBpb2N0bF9nbnRkZXZfbWFwX2dyYW50X3JlZiBfX3VzZXIgKnUpCit7CisJc3RydWN0IGlvY3RsX2dudGRldl9tYXBfZ3JhbnRfcmVmIG9wOworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKwlpbnQgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZvcCwgdSwgc2l6ZW9mKG9wKSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcHJfZGVidWcoInByaXYgJXAsIGFkZCAlZFxuIiwgcHJpdiwgb3AuY291bnQpOworCWlmICh1bmxpa2VseShvcC5jb3VudCA8PSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KG9wLmNvdW50ID4gcHJpdi0+bGltaXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IC1FTk9NRU07CisJbWFwID0gZ250ZGV2X2FsbG9jX21hcChwcml2LCBvcC5jb3VudCk7CisJaWYgKCFtYXApCisJCXJldHVybiBlcnI7CisJaWYgKGNvcHlfZnJvbV91c2VyKG1hcC0+Z3JhbnRzLCAmdS0+cmVmcywKKwkJCSAgIHNpemVvZihtYXAtPmdyYW50c1swXSkgKiBvcC5jb3VudCkgIT0gMCkgeworCQlnbnRkZXZfZnJlZV9tYXAobWFwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCWdudGRldl9hZGRfbWFwKHByaXYsIG1hcCk7CisJb3AuaW5kZXggPSBtYXAtPmluZGV4IDw8IFBBR0VfU0hJRlQ7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCisJaWYgKGNvcHlfdG9fdXNlcih1LCAmb3AsIHNpemVvZihvcCkpICE9IDApIHsKKwkJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwkJZ250ZGV2X2RlbF9tYXAobWFwKTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCQlnbnRkZXZfZnJlZV9tYXAobWFwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGdudGRldl9pb2N0bF91bm1hcF9ncmFudF9yZWYoc3RydWN0IGdudGRldl9wcml2ICpwcml2LAorCQkJCQkgc3RydWN0IGlvY3RsX2dudGRldl91bm1hcF9ncmFudF9yZWYgX191c2VyICp1KQoreworCXN0cnVjdCBpb2N0bF9nbnRkZXZfdW5tYXBfZ3JhbnRfcmVmIG9wOworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmb3AsIHUsIHNpemVvZihvcCkpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCXByX2RlYnVnKCJwcml2ICVwLCBkZWwgJWQrJWRcbiIsIHByaXYsIChpbnQpb3AuaW5kZXgsIChpbnQpb3AuY291bnQpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwltYXAgPSBnbnRkZXZfZmluZF9tYXBfaW5kZXgocHJpdiwgb3AuaW5kZXggPj4gUEFHRV9TSElGVCwgb3AuY291bnQpOworCWlmIChtYXApCisJCWVyciA9IGdudGRldl9kZWxfbWFwKG1hcCk7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCWlmICghZXJyKQorCQlnbnRkZXZfZnJlZV9tYXAobWFwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9uZyBnbnRkZXZfaW9jdGxfZ2V0X29mZnNldF9mb3JfdmFkZHIoc3RydWN0IGdudGRldl9wcml2ICpwcml2LAorCQkJCQkgICAgICBzdHJ1Y3QgaW9jdGxfZ250ZGV2X2dldF9vZmZzZXRfZm9yX3ZhZGRyIF9fdXNlciAqdSkKK3sKKwlzdHJ1Y3QgaW9jdGxfZ250ZGV2X2dldF9vZmZzZXRfZm9yX3ZhZGRyIG9wOworCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmb3AsIHUsIHNpemVvZihvcCkpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCXByX2RlYnVnKCJwcml2ICVwLCBvZmZzZXQgZm9yIHZhZGRyICVseFxuIiwgcHJpdiwgKHVuc2lnbmVkIGxvbmcpb3AudmFkZHIpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwltYXAgPSBnbnRkZXZfZmluZF9tYXBfdmFkZHIocHJpdiwgb3AudmFkZHIpOworCWlmIChtYXAgPT0gTlVMTCB8fAorCSAgICBtYXAtPnZtYS0+dm1fc3RhcnQgIT0gb3AudmFkZHIpIHsKKwkJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJb3Aub2Zmc2V0ID0gbWFwLT5pbmRleCA8PCBQQUdFX1NISUZUOworCW9wLmNvdW50ID0gbWFwLT5jb3VudDsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAoY29weV90b191c2VyKHUsICZvcCwgc2l6ZW9mKG9wKSkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGdudGRldl9pb2N0bF9zZXRfbWF4X2dyYW50cyhzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYsCisJCQkJCXN0cnVjdCBpb2N0bF9nbnRkZXZfc2V0X21heF9ncmFudHMgX191c2VyICp1KQoreworCXN0cnVjdCBpb2N0bF9nbnRkZXZfc2V0X21heF9ncmFudHMgb3A7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCB1LCBzaXplb2Yob3ApKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlwcl9kZWJ1ZygicHJpdiAlcCwgbGltaXQgJWRcbiIsIHByaXYsIG9wLmNvdW50KTsKKwlpZiAob3AuY291bnQgPiBsaW1pdCkKKwkJcmV0dXJuIC1FMkJJRzsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJcHJpdi0+bGltaXQgPSBvcC5jb3VudDsKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGdudGRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmxpcCwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZ250ZGV2X3ByaXYgKnByaXYgPSBmbGlwLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKnB0ciA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJT0NUTF9HTlRERVZfTUFQX0dSQU5UX1JFRjoKKwkJcmV0dXJuIGdudGRldl9pb2N0bF9tYXBfZ3JhbnRfcmVmKHByaXYsIHB0cik7CisKKwljYXNlIElPQ1RMX0dOVERFVl9VTk1BUF9HUkFOVF9SRUY6CisJCXJldHVybiBnbnRkZXZfaW9jdGxfdW5tYXBfZ3JhbnRfcmVmKHByaXYsIHB0cik7CisKKwljYXNlIElPQ1RMX0dOVERFVl9HRVRfT0ZGU0VUX0ZPUl9WQUREUjoKKwkJcmV0dXJuIGdudGRldl9pb2N0bF9nZXRfb2Zmc2V0X2Zvcl92YWRkcihwcml2LCBwdHIpOworCisJY2FzZSBJT0NUTF9HTlRERVZfU0VUX01BWF9HUkFOVFM6CisJCXJldHVybiBnbnRkZXZfaW9jdGxfc2V0X21heF9ncmFudHMocHJpdiwgcHRyKTsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJwcml2ICVwLCB1bmtub3duIGNtZCAleFxuIiwgcHJpdiwgY21kKTsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbnRkZXZfbW1hcChzdHJ1Y3QgZmlsZSAqZmxpcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGdudGRldl9wcml2ICpwcml2ID0gZmxpcC0+cHJpdmF0ZV9kYXRhOworCWludCBpbmRleCA9IHZtYS0+dm1fcGdvZmY7CisJaW50IGNvdW50ID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgJiYgISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcl9kZWJ1ZygibWFwICVkKyVkIGF0ICVseCAocGdvZmYgJWx4KVxuIiwKKwkJCWluZGV4LCBjb3VudCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCW1hcCA9IGdudGRldl9maW5kX21hcF9pbmRleChwcml2LCBpbmRleCwgY291bnQpOworCWlmICghbWFwKQorCQlnb3RvIHVubG9ja19vdXQ7CisJaWYgKG1hcC0+dm1hKQorCQlnb3RvIHVubG9ja19vdXQ7CisJaWYgKHByaXYtPm1tICE9IHZtYS0+dm1fbW0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSHVoPyBPdGhlciBtbT9cbiIpOworCQlnb3RvIHVubG9ja19vdXQ7CisJfQorCisJdm1hLT52bV9vcHMgPSAmZ250ZGV2X3Ztb3BzOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRHxWTV9ET05UQ09QWXxWTV9ET05URVhQQU5EfFZNX1BGTk1BUDsKKworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gbWFwOworCW1hcC0+dm1hID0gdm1hOworCisJbWFwLT5mbGFncyA9IEdOVE1BUF9ob3N0X21hcCB8IEdOVE1BUF9hcHBsaWNhdGlvbl9tYXA7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwkJbWFwLT5mbGFncyB8PSBHTlRNQVBfcmVhZG9ubHk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwllcnIgPSBhcHBseV90b19wYWdlX3JhbmdlKHZtYS0+dm1fbW0sIHZtYS0+dm1fc3RhcnQsCisJCQkJICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICBmaW5kX2dyYW50X3B0ZXMsIG1hcCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJmaW5kX2dyYW50X3B0ZXMoKSBmYWlsdXJlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gbWFwX2dyYW50X3BhZ2VzKG1hcCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYXBfZ3JhbnRfcGFnZXMoKSBmYWlsdXJlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJbWFwLT5pc19tYXBwZWQgPSAxOworCisJcmV0dXJuIDA7CisKK3VubG9ja19vdXQ6CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdudGRldl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gZ250ZGV2X29wZW4sCisJLnJlbGVhc2UgPSBnbnRkZXZfcmVsZWFzZSwKKwkubW1hcCA9IGdudGRldl9tbWFwLAorCS51bmxvY2tlZF9pb2N0bCA9IGdudGRldl9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGdudGRldl9taXNjZGV2ID0geworCS5taW5vciAgICAgICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgICAgICAgICA9ICJ4ZW4vZ250ZGV2IiwKKwkuZm9wcyAgICAgICAgID0gJmdudGRldl9mb3BzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGdudGRldl9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWlmICgheGVuX2RvbWFpbigpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmdudGRldl9taXNjZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgZ250ZGV2IGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ250ZGV2X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmdudGRldl9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoZ250ZGV2X2luaXQpOworbW9kdWxlX2V4aXQoZ250ZGV2X2V4aXQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCmluZGV4IDZjNDUzMTguLjllZjU0ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKKysrIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwpAQCAtNDQ3LDYgKzQ0Nyw1MiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ250dGFiX21heF9ncmFudF9mcmFtZXMpOwogCitpbnQgZ250dGFiX21hcF9yZWZzKHN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqbWFwX29wcywKKwkJICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgaSwgcmV0OworCXB0ZV90ICpwdGU7CisJdW5zaWduZWQgbG9uZyBtZm47CisKKwlyZXQgPSBIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX21hcF9ncmFudF9yZWYsIG1hcF9vcHMsIGNvdW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJLyogbTJwIG92ZXJyaWRlIG9ubHkgc3VwcG9ydGVkIGZvciBHTlRNQVBfY29udGFpbnNfcHRlIG1hcHBpbmdzICovCisJCWlmICghKG1hcF9vcHNbaV0uZmxhZ3MgJiBHTlRNQVBfY29udGFpbnNfcHRlKSkKKwkJCWNvbnRpbnVlOworCQlwdGUgPSAocHRlX3QgKikgKG1mbl90b192aXJ0KFBGTl9ET1dOKG1hcF9vcHNbaV0uaG9zdF9hZGRyKSkgKworCQkJCShtYXBfb3BzW2ldLmhvc3RfYWRkciAmIH5QQUdFX01BU0spKTsKKwkJbWZuID0gcHRlX21mbigqcHRlKTsKKwkJcmV0ID0gbTJwX2FkZF9vdmVycmlkZShtZm4sIHBhZ2VzW2ldKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9tYXBfcmVmcyk7CisKK2ludCBnbnR0YWJfdW5tYXBfcmVmcyhzdHJ1Y3QgZ250dGFiX3VubWFwX2dyYW50X3JlZiAqdW5tYXBfb3BzLAorCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IGksIHJldDsKKworCXJldCA9IEhZUEVSVklTT1JfZ3JhbnRfdGFibGVfb3AoR05UVEFCT1BfdW5tYXBfZ3JhbnRfcmVmLCB1bm1hcF9vcHMsIGNvdW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gbTJwX3JlbW92ZV9vdmVycmlkZShwYWdlc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnbnR0YWJfdW5tYXBfcmVmcyk7CisKIHN0YXRpYyBpbnQgZ250dGFiX21hcCh1bnNpZ25lZCBpbnQgc3RhcnRfaWR4LCB1bnNpZ25lZCBpbnQgZW5kX2lkeCkKIHsKIAlzdHJ1Y3QgZ250dGFiX3NldHVwX3RhYmxlIHNldHVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vcGxhdGZvcm0tcGNpLmMgYi9kcml2ZXJzL3hlbi9wbGF0Zm9ybS1wY2kuYwppbmRleCBjMDFiNWRkLi5hZmJlMDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9wbGF0Zm9ybS1wY2kuYworKysgYi9kcml2ZXJzL3hlbi9wbGF0Zm9ybS1wY2kuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJaW50IGksIHJldDsKLQlsb25nIGlvYWRkciwgaW9sZW47CisJbG9uZyBpb2FkZHI7CiAJbG9uZyBtbWlvX2FkZHIsIG1taW9fbGVuOwogCXVuc2lnbmVkIGludCBtYXhfbnJfZ2ZyYW1lczsKIApAQCAtMTE0LDcgKzExNCw2IEBACiAJCXJldHVybiBpOwogCiAJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWlvbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKIAogCW1taW9fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKIAltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CkBAIC0xMjUsMTkgKzEyNCwxMyBAQAogCQlnb3RvIHBjaV9vdXQ7CiAJfQogCi0JaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihtbWlvX2FkZHIsIG1taW9fbGVuLCBEUlZfTkFNRSkgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNRU0gSS9PIHJlc291cmNlIDB4JWx4IEAgMHglbHggYnVzeVxuIiwKLQkJICAgICAgIG1taW9fYWRkciwgbW1pb19sZW4pOwotCQlyZXQgPSAtRUJVU1k7CisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsIERSVl9OQU1FKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBwY2lfb3V0OwotCX0KIAotCWlmIChyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIGlvbGVuLCBEUlZfTkFNRSkgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJL08gcmVzb3VyY2UgMHglbHggQCAweCVseCBidXN5XG4iLAotCQkgICAgICAgaW9sZW4sIGlvYWRkcik7Ci0JCXJldCA9IC1FQlVTWTsKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgRFJWX05BTUUpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIG1lbV9vdXQ7Ci0JfQogCiAJcGxhdGZvcm1fbW1pbyA9IG1taW9fYWRkcjsKIAlwbGF0Zm9ybV9tbWlvbGVuID0gbW1pb19sZW47CkBAIC0xNjksOSArMTYyLDkgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgaW9sZW4pOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKIG1lbV9vdXQ6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKG1taW9fYWRkciwgbW1pb19sZW4pOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAxKTsKIHBjaV9vdXQ6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMvTWFrZWZpbGUgYi9kcml2ZXJzL3hlbi94ZW5idXMvTWFrZWZpbGUKaW5kZXggNTU3MWY1Yi4uOGRjYTY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy9NYWtlZmlsZQpAQCAtNSwzICs1LDggQEAKIHhlbmJ1cy1vYmpzICs9IHhlbmJ1c19jb21tcy5vCiB4ZW5idXMtb2JqcyArPSB4ZW5idXNfeHMubwogeGVuYnVzLW9ianMgKz0geGVuYnVzX3Byb2JlLm8KKworeGVuYnVzLWJlLW9ianMtJChDT05GSUdfWEVOX0JBQ0tFTkQpICs9IHhlbmJ1c19wcm9iZV9iYWNrZW5kLm8KK3hlbmJ1cy1vYmpzICs9ICQoeGVuYnVzLWJlLW9ianMteSkKKworb2JqLSQoQ09ORklHX1hFTl9YRU5CVVNfRlJPTlRFTkQpICs9IHhlbmJ1c19wcm9iZV9mcm9udGVuZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggZGViOWM0Yi4uYmFhNjVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgogCi0jaW5jbHVkZSA8eGVuL3BsYXRmb3JtX3BjaS5oPgogI2luY2x1ZGUgPHhlbi9odm0uaD4KIAogI2luY2x1ZGUgInhlbmJ1c19jb21tcy5oIgpAQCAtNzMsMTUgKzcyLDYgQEAKIAogc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQoeGVuc3RvcmVfY2hhaW4pOwogCi1zdGF0aWMgdm9pZCB3YWl0X2Zvcl9kZXZpY2VzKHN0cnVjdCB4ZW5idXNfZHJpdmVyICp4ZW5kcnYpOwotCi1zdGF0aWMgaW50IHhlbmJ1c19wcm9iZV9mcm9udGVuZChjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpuYW1lKTsKLQotc3RhdGljIHZvaWQgeGVuYnVzX2Rldl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpfZGV2KTsKLQotc3RhdGljIGludCB4ZW5idXNfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCB4ZW5idXNfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCiAvKiBJZiBzb21ldGhpbmcgaW4gYXJyYXkgb2YgaWRzIG1hdGNoZXMgdGhpcyBkZXZpY2UsIHJldHVybiBpdC4gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqCiBtYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IHhlbmJ1c19kZXZpY2VfaWQgKmFyciwgc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKQEAgLTEwMiwzNCArOTIsNyBAQAogCiAJcmV0dXJuIG1hdGNoX2RldmljZShkcnYtPmlkcywgdG9feGVuYnVzX2RldmljZShfZGV2KSkgIT0gTlVMTDsKIH0KLQotc3RhdGljIGludCB4ZW5idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKLXsKLQlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gdG9feGVuYnVzX2RldmljZShfZGV2KTsKLQotCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz14ZW46JXMiLCBkZXYtPmRldmljZXR5cGUpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotCi0vKiBkZXZpY2UvPHR5cGU+LzxpZD4gPT4gPHR5cGU+LTxpZD4gKi8KLXN0YXRpYyBpbnQgZnJvbnRlbmRfYnVzX2lkKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQotewotCW5vZGVuYW1lID0gc3RyY2hyKG5vZGVuYW1lLCAnLycpOwotCWlmICghbm9kZW5hbWUgfHwgc3RybGVuKG5vZGVuYW1lICsgMSkgPj0gWEVOX0JVU19JRF9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlhFTkJVUzogYmFkIGZyb250ZW5kICVzXG4iLCBub2RlbmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmxjcHkoYnVzX2lkLCBub2RlbmFtZSArIDEsIFhFTl9CVVNfSURfU0laRSk7Ci0JaWYgKCFzdHJjaHIoYnVzX2lkLCAnLycpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlhFTkJVUzogYnVzX2lkICVzIG5vIHNsYXNoXG4iLCBidXNfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JKnN0cmNocihidXNfaWQsICcvJykgPSAnLSc7Ci0JcmV0dXJuIDA7Ci19CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfbWF0Y2gpOwogCiAKIHN0YXRpYyB2b2lkIGZyZWVfb3RoZXJlbmRfZGV0YWlscyhzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQpAQCAtMTQ5LDcgKzExMiwzMCBAQAogfQogCiAKLWludCByZWFkX290aGVyZW5kX2RldGFpbHMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiwKK3N0YXRpYyBpbnQgdGFsa190b19vdGhlcmVuZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZGV2LmRyaXZlcik7CisKKwlmcmVlX290aGVyZW5kX3dhdGNoKGRldik7CisJZnJlZV9vdGhlcmVuZF9kZXRhaWxzKGRldik7CisKKwlyZXR1cm4gZHJ2LT5yZWFkX290aGVyZW5kX2RldGFpbHMoZGV2KTsKK30KKworCisKK3N0YXRpYyBpbnQgd2F0Y2hfb3RoZXJlbmQoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGVuX2J1c190eXBlICpidXMgPQorCQljb250YWluZXJfb2YoZGV2LT5kZXYuYnVzLCBzdHJ1Y3QgeGVuX2J1c190eXBlLCBidXMpOworCisJcmV0dXJuIHhlbmJ1c193YXRjaF9wYXRoZm10KGRldiwgJmRldi0+b3RoZXJlbmRfd2F0Y2gsCisJCQkJICAgIGJ1cy0+b3RoZXJlbmRfY2hhbmdlZCwKKwkJCQkgICAgIiVzLyVzIiwgZGV2LT5vdGhlcmVuZCwgInN0YXRlIik7Cit9CisKKworaW50IHhlbmJ1c19yZWFkX290aGVyZW5kX2RldGFpbHMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiwKIAkJCQkgY2hhciAqaWRfbm9kZSwgY2hhciAqcGF0aF9ub2RlKQogewogCWludCBlcnIgPSB4ZW5idXNfZ2F0aGVyKFhCVF9OSUwsIHhlbmRldi0+bm9kZW5hbWUsCkBAIC0xNzQsMzkgKzE2MCwxMSBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfcmVhZF9vdGhlcmVuZF9kZXRhaWxzKTsKIAotCi1zdGF0aWMgaW50IHJlYWRfYmFja2VuZF9kZXRhaWxzKHN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW5kZXYpCi17Ci0JcmV0dXJuIHJlYWRfb3RoZXJlbmRfZGV0YWlscyh4ZW5kZXYsICJiYWNrZW5kLWlkIiwgImJhY2tlbmQiKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHhlbmJ1c19kZXZfYXR0cnNbXSA9IHsKLQlfX0FUVFJfTlVMTAotfTsKLQotLyogQnVzIHR5cGUgZm9yIGZyb250ZW5kIGRyaXZlcnMuICovCi1zdGF0aWMgc3RydWN0IHhlbl9idXNfdHlwZSB4ZW5idXNfZnJvbnRlbmQgPSB7Ci0JLnJvb3QgPSAiZGV2aWNlIiwKLQkubGV2ZWxzID0gMiwgCQkvKiBkZXZpY2UvdHlwZS88aWQ+ICovCi0JLmdldF9idXNfaWQgPSBmcm9udGVuZF9idXNfaWQsCi0JLnByb2JlID0geGVuYnVzX3Byb2JlX2Zyb250ZW5kLAotCS5idXMgPSB7Ci0JCS5uYW1lICAgICAgPSAieGVuIiwKLQkJLm1hdGNoICAgICA9IHhlbmJ1c19tYXRjaCwKLQkJLnVldmVudCAgICA9IHhlbmJ1c191ZXZlbnQsCi0JCS5wcm9iZSAgICAgPSB4ZW5idXNfZGV2X3Byb2JlLAotCQkucmVtb3ZlICAgID0geGVuYnVzX2Rldl9yZW1vdmUsCi0JCS5zaHV0ZG93biAgPSB4ZW5idXNfZGV2X3NodXRkb3duLAotCQkuZGV2X2F0dHJzID0geGVuYnVzX2Rldl9hdHRycywKLQotCQkuc3VzcGVuZCAgID0geGVuYnVzX2Rldl9zdXNwZW5kLAotCQkucmVzdW1lICAgID0geGVuYnVzX2Rldl9yZXN1bWUsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIG90aGVyZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCi0JCQkgICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCit2b2lkIHhlbmJ1c19vdGhlcmVuZF9jaGFuZ2VkKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoLAorCQkJICAgICBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICBpbnQgaWdub3JlX29uX3NodXRkb3duKQogewogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYgPQogCQljb250YWluZXJfb2Yod2F0Y2gsIHN0cnVjdCB4ZW5idXNfZGV2aWNlLCBvdGhlcmVuZF93YXRjaCk7CkBAIC0yMzQsMTEgKzE5Miw3IEBACiAJICogd29yayB0aGF0IGNhbiBmYWlsIGUuZy4sIHdoZW4gdGhlIHJvb3RmcyBpcyBnb25lLgogCSAqLwogCWlmIChzeXN0ZW1fc3RhdGUgPiBTWVNURU1fUlVOTklORykgewotCQlzdHJ1Y3QgeGVuX2J1c190eXBlICpidXMgPSBidXM7Ci0JCWJ1cyA9IGNvbnRhaW5lcl9vZihkZXYtPmRldi5idXMsIHN0cnVjdCB4ZW5fYnVzX3R5cGUsIGJ1cyk7Ci0JCS8qIElmIHdlJ3JlIGZyb250ZW5kLCBkcml2ZSB0aGUgc3RhdGUgbWFjaGluZSB0byBDbG9zZWQuICovCi0JCS8qIFRoaXMgc2hvdWxkIGNhdXNlIHRoZSBiYWNrZW5kIHRvIHJlbGVhc2Ugb3VyIHJlc291cmNlcy4gKi8KLQkJaWYgKChidXMgPT0gJnhlbmJ1c19mcm9udGVuZCkgJiYgKHN0YXRlID09IFhlbmJ1c1N0YXRlQ2xvc2luZykpCisJCWlmIChpZ25vcmVfb25fc2h1dGRvd24gJiYgKHN0YXRlID09IFhlbmJ1c1N0YXRlQ2xvc2luZykpCiAJCQl4ZW5idXNfZnJvbnRlbmRfY2xvc2VkKGRldik7CiAJCXJldHVybjsKIAl9CkBAIC0yNDYsMjUgKzIwMCw3IEBACiAJaWYgKGRydi0+b3RoZXJlbmRfY2hhbmdlZCkKIAkJZHJ2LT5vdGhlcmVuZF9jaGFuZ2VkKGRldiwgc3RhdGUpOwogfQotCi0KLXN0YXRpYyBpbnQgdGFsa190b19vdGhlcmVuZChzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQotewotCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZGV2LmRyaXZlcik7Ci0KLQlmcmVlX290aGVyZW5kX3dhdGNoKGRldik7Ci0JZnJlZV9vdGhlcmVuZF9kZXRhaWxzKGRldik7Ci0KLQlyZXR1cm4gZHJ2LT5yZWFkX290aGVyZW5kX2RldGFpbHMoZGV2KTsKLX0KLQotCi1zdGF0aWMgaW50IHdhdGNoX290aGVyZW5kKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHhlbmJ1c193YXRjaF9wYXRoZm10KGRldiwgJmRldi0+b3RoZXJlbmRfd2F0Y2gsIG90aGVyZW5kX2NoYW5nZWQsCi0JCQkJICAgICIlcy8lcyIsIGRldi0+b3RoZXJlbmQsICJzdGF0ZSIpOwotfQotCitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfb3RoZXJlbmRfY2hhbmdlZCk7CiAKIGludCB4ZW5idXNfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CkBAIC0zMDgsOCArMjQ0LDkgQEAKIGZhaWw6CiAJeGVuYnVzX2Rldl9lcnJvcihkZXYsIGVyciwgInhlbmJ1c19kZXZfcHJvYmUgb24gJXMiLCBkZXYtPm5vZGVuYW1lKTsKIAl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDbG9zZWQpOwotCXJldHVybiAtRU5PREVWOworCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfZGV2X3Byb2JlKTsKIAogaW50IHhlbmJ1c19kZXZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CkBAIC0zMjcsOCArMjY0LDkgQEAKIAl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDbG9zZWQpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuYnVzX2Rldl9yZW1vdmUpOwogCi1zdGF0aWMgdm9pZCB4ZW5idXNfZGV2X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit2b2lkIHhlbmJ1c19kZXZfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKIHsKIAlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gdG9feGVuYnVzX2RldmljZShfZGV2KTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSA1KkhaOwpAQCAtMzQ5LDYgKzI4Nyw3IEBACiAgb3V0OgogCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19kZXZfc2h1dGRvd24pOwogCiBpbnQgeGVuYnVzX3JlZ2lzdGVyX2RyaXZlcl9jb21tb24oc3RydWN0IHhlbmJ1c19kcml2ZXIgKmRydiwKIAkJCQkgIHN0cnVjdCB4ZW5fYnVzX3R5cGUgKmJ1cywKQEAgLTM2MiwyNSArMzAxLDcgQEAKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KLQotaW50IF9feGVuYnVzX3JlZ2lzdGVyX2Zyb250ZW5kKHN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnYsCi0JCQkgICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKQotewotCWludCByZXQ7Ci0KLQlkcnYtPnJlYWRfb3RoZXJlbmRfZGV0YWlscyA9IHJlYWRfYmFja2VuZF9kZXRhaWxzOwotCi0JcmV0ID0geGVuYnVzX3JlZ2lzdGVyX2RyaXZlcl9jb21tb24oZHJ2LCAmeGVuYnVzX2Zyb250ZW5kLAotCQkJCQkgICAgb3duZXIsIG1vZF9uYW1lKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogSWYgdGhpcyBkcml2ZXIgaXMgbG9hZGVkIGFzIGEgbW9kdWxlIHdhaXQgZm9yIGRldmljZXMgdG8gYXR0YWNoLiAqLwotCXdhaXRfZm9yX2RldmljZXMoZHJ2KTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoX194ZW5idXNfcmVnaXN0ZXJfZnJvbnRlbmQpOworRVhQT1JUX1NZTUJPTF9HUEwoeGVuYnVzX3JlZ2lzdGVyX2RyaXZlcl9jb21tb24pOwogCiB2b2lkIHhlbmJ1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqZHJ2KQogewpAQCAtNTUxLDI0ICs0NzIsNyBAQAogCWtmcmVlKHhlbmRldik7CiAJcmV0dXJuIGVycjsKIH0KLQotLyogZGV2aWNlLzx0eXBlbmFtZT4vPG5hbWU+ICovCi1zdGF0aWMgaW50IHhlbmJ1c19wcm9iZV9mcm9udGVuZChjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNoYXIgKm5vZGVuYW1lOwotCWludCBlcnI7Ci0KLQlub2RlbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMvJXMvJXMiLAotCQkJICAgICB4ZW5idXNfZnJvbnRlbmQucm9vdCwgdHlwZSwgbmFtZSk7Ci0JaWYgKCFub2RlbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlEUFJJTlRLKCIlcyIsIG5vZGVuYW1lKTsKLQotCWVyciA9IHhlbmJ1c19wcm9iZV9ub2RlKCZ4ZW5idXNfZnJvbnRlbmQsIHR5cGUsIG5vZGVuYW1lKTsKLQlrZnJlZShub2RlbmFtZSk7Ci0JcmV0dXJuIGVycjsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19wcm9iZV9ub2RlKTsKIAogc3RhdGljIGludCB4ZW5idXNfcHJvYmVfZGV2aWNlX3R5cGUoc3RydWN0IHhlbl9idXNfdHlwZSAqYnVzLCBjb25zdCBjaGFyICp0eXBlKQogewpAQCAtNTgyLDEwICs0ODYsMTEgQEAKIAkJcmV0dXJuIFBUUl9FUlIoZGlyKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkaXJfbjsgaSsrKSB7Ci0JCWVyciA9IGJ1cy0+cHJvYmUodHlwZSwgZGlyW2ldKTsKKwkJZXJyID0gYnVzLT5wcm9iZShidXMsIHR5cGUsIGRpcltpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CisKIAlrZnJlZShkaXIpOwogCXJldHVybiBlcnI7CiB9CkBAIC02MDUsOSArNTEwLDExIEBACiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CisKIAlrZnJlZShkaXIpOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfcHJvYmVfZGV2aWNlcyk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhcl9jb3VudChjb25zdCBjaGFyICpzdHIsIGNoYXIgYykKIHsKQEAgLTY3MCwzMiArNTc3LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfZGV2X2NoYW5nZWQpOwogCi1zdGF0aWMgdm9pZCBmcm9udGVuZF9jaGFuZ2VkKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoLAotCQkJICAgICBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCURQUklOVEsoIiIpOwotCi0JeGVuYnVzX2Rldl9jaGFuZ2VkKHZlY1tYU19XQVRDSF9QQVRIXSwgJnhlbmJ1c19mcm9udGVuZCk7Ci19Ci0KLS8qIFdlIHdhdGNoIGZvciBkZXZpY2VzIGFwcGVhcmluZyBhbmQgdmFuaXNoaW5nLiAqLwotc3RhdGljIHN0cnVjdCB4ZW5idXNfd2F0Y2ggZmVfd2F0Y2ggPSB7Ci0JLm5vZGUgPSAiZGV2aWNlIiwKLQkuY2FsbGJhY2sgPSBmcm9udGVuZF9jaGFuZ2VkLAotfTsKLQotc3RhdGljIGludCB4ZW5idXNfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitpbnQgeGVuYnVzX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhkZXY7CisJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhkZXYKKwkJPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgeGVuYnVzX2RldmljZSwgZGV2KTsKIAotCURQUklOVEsoIiIpOworCURQUklOVEsoIiVzIiwgeGRldi0+bm9kZW5hbWUpOwogCiAJaWYgKGRldi0+ZHJpdmVyID09IE5VTEwpCiAJCXJldHVybiAwOwogCWRydiA9IHRvX3hlbmJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXhkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgeGVuYnVzX2RldmljZSwgZGV2KTsKIAlpZiAoZHJ2LT5zdXNwZW5kKQogCQllcnIgPSBkcnYtPnN1c3BlbmQoeGRldiwgc3RhdGUpOwogCWlmIChlcnIpCkBAIC03MDMsMjEgKzU5NiwyMCBAQAogCQkgICAgICAgInhlbmJ1czogc3VzcGVuZCAlcyBmYWlsZWQ6ICVpXG4iLCBkZXZfbmFtZShkZXYpLCBlcnIpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuYnVzX2Rldl9zdXNwZW5kKTsKIAotc3RhdGljIGludCB4ZW5idXNfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgeGVuYnVzX2Rldl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCBlcnI7CiAJc3RydWN0IHhlbmJ1c19kcml2ZXIgKmRydjsKLQlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGRldjsKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGRldgorCQk9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB4ZW5idXNfZGV2aWNlLCBkZXYpOwogCi0JRFBSSU5USygiIik7CisJRFBSSU5USygiJXMiLCB4ZGV2LT5ub2RlbmFtZSk7CiAKIAlpZiAoZGV2LT5kcml2ZXIgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0KIAlkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQl4ZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHhlbmJ1c19kZXZpY2UsIGRldik7Ci0KIAllcnIgPSB0YWxrX3RvX290aGVyZW5kKHhkZXYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtNzQ4LDYgKzY0MCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19kZXZfcmVzdW1lKTsKIAogLyogQSBmbGFnIHRvIGRldGVybWluZSBpZiB4ZW5zdG9yZWQgaXMgJ3JlYWR5JyAoaS5lLiBoYXMgc3RhcnRlZCkgKi8KIGludCB4ZW5zdG9yZWRfcmVhZHkgPSAwOwpAQCAtNzc2LDExICs2NjksNiBAQAogewogCXhlbnN0b3JlZF9yZWFkeSA9IDE7CiAKLQkvKiBFbnVtZXJhdGUgZGV2aWNlcyBpbiB4ZW5zdG9yZSBhbmQgd2F0Y2ggZm9yIGNoYW5nZXMuICovCi0JeGVuYnVzX3Byb2JlX2RldmljZXMoJnhlbmJ1c19mcm9udGVuZCk7Ci0JcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZmZV93YXRjaCk7Ci0JeGVuYnVzX2JhY2tlbmRfcHJvYmVfYW5kX3dhdGNoKCk7Ci0KIAkvKiBOb3RpZnkgb3RoZXJzIHRoYXQgeGVuc3RvcmUgaXMgdXAgKi8KIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ZW5zdG9yZV9jaGFpbiwgMCwgTlVMTCk7CiB9CkBAIC04MDksMTYgKzY5Nyw3IEBACiAKIAllcnIgPSAtRU5PREVWOwogCWlmICgheGVuX2RvbWFpbigpKQotCQlnb3RvIG91dF9lcnJvcjsKLQotCS8qIFJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBrZXJuZWwgYnVzIHN1YnN5c3RlbSAqLwotCWVyciA9IGJ1c19yZWdpc3RlcigmeGVuYnVzX2Zyb250ZW5kLmJ1cyk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfZXJyb3I7Ci0KLQllcnIgPSB4ZW5idXNfYmFja2VuZF9idXNfcmVnaXN0ZXIoKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF91bnJlZ19mcm9udDsKKwkJcmV0dXJuIGVycjsKIAogCS8qCiAJICogRG9tYWluMCBkb2Vzbid0IGhhdmUgYSBzdG9yZV9ldnRjaG4gb3Igc3RvcmVfbWZuIHlldC4KQEAgLTg3NCw3ICs3NTMsNyBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIlhFTkJVUzogRXJyb3IgaW5pdGlhbGl6aW5nIHhlbnN0b3JlIGNvbW1zOiAlaVxuIiwgZXJyKTsKLQkJZ290byBvdXRfdW5yZWdfYmFjazsKKwkJZ290byBvdXRfZXJyb3I7CiAJfQogCiAjaWZkZWYgQ09ORklHX1hFTl9DT01QQVRfWEVORlMKQEAgLTg4NywxMzMgKzc2NiwxMyBAQAogCiAJcmV0dXJuIDA7CiAKLSAgb3V0X3VucmVnX2JhY2s6Ci0JeGVuYnVzX2JhY2tlbmRfYnVzX3VucmVnaXN0ZXIoKTsKLQotICBvdXRfdW5yZWdfZnJvbnQ6Ci0JYnVzX3VucmVnaXN0ZXIoJnhlbmJ1c19mcm9udGVuZC5idXMpOwotCiAgIG91dF9lcnJvcjoKIAlpZiAocGFnZSAhPSAwKQogCQlmcmVlX3BhZ2UocGFnZSk7CisKIAlyZXR1cm4gZXJyOwogfQogCiBwb3N0Y29yZV9pbml0Y2FsbCh4ZW5idXNfaW5pdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGludCBpc19kZXZpY2VfY29ubmVjdGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiA9IHRvX3hlbmJ1c19kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGF0YTsKLQlzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqeGVuZHJ2OwotCi0JLyoKLQkgKiBBIGRldmljZSB3aXRoIG5vIGRyaXZlciB3aWxsIG5ldmVyIGNvbm5lY3QuIFdlIGNhcmUgb25seSBhYm91dAotCSAqIGRldmljZXMgd2hpY2ggc2hvdWxkIGN1cnJlbnRseSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLgotCSAqLwotCWlmICghZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JLyogSXMgdGhpcyBzZWFyY2ggbGltaXRlZCB0byBhIHBhcnRpY3VsYXIgZHJpdmVyPyAqLwotCWlmIChkcnYgJiYgKGRldi0+ZHJpdmVyICE9IGRydikpCi0JCXJldHVybiAwOwotCi0JeGVuZHJ2ID0gdG9feGVuYnVzX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JcmV0dXJuICh4ZW5kZXYtPnN0YXRlIDwgWGVuYnVzU3RhdGVDb25uZWN0ZWQgfHwKLQkJKHhlbmRldi0+c3RhdGUgPT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQgJiYKLQkJIHhlbmRydi0+aXNfcmVhZHkgJiYgIXhlbmRydi0+aXNfcmVhZHkoeGVuZGV2KSkpOwotfQotCi1zdGF0aWMgaW50IGV4aXN0c19jb25uZWN0aW5nX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCXJldHVybiBidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBkcnYsCi0JCQkJaXNfZGV2aWNlX2Nvbm5lY3RpbmcpOwotfQotCi1zdGF0aWMgaW50IHByaW50X2RldmljZV9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW5kZXYgPSB0b194ZW5idXNfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRhdGE7Ci0KLQkvKiBJcyB0aGlzIG9wZXJhdGlvbiBsaW1pdGVkIHRvIGEgcGFydGljdWxhciBkcml2ZXI/ICovCi0JaWYgKGRydiAmJiAoZGV2LT5kcml2ZXIgIT0gZHJ2KSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWRldi0+ZHJpdmVyKSB7Ci0JCS8qIEluZm9ybWF0aW9uIG9ubHk6IGlzIHRoaXMgdG9vIG5vaXN5PyAqLwotCQlwcmludGsoS0VSTl9JTkZPICJYRU5CVVM6IERldmljZSB3aXRoIG5vIGRyaXZlcjogJXNcbiIsCi0JCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lKTsKLQl9IGVsc2UgaWYgKHhlbmRldi0+c3RhdGUgPCBYZW5idXNTdGF0ZUNvbm5lY3RlZCkgewotCQllbnVtIHhlbmJ1c19zdGF0ZSByc3RhdGUgPSBYZW5idXNTdGF0ZVVua25vd247Ci0JCWlmICh4ZW5kZXYtPm90aGVyZW5kKQotCQkJcnN0YXRlID0geGVuYnVzX3JlYWRfZHJpdmVyX3N0YXRlKHhlbmRldi0+b3RoZXJlbmQpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IFRpbWVvdXQgY29ubmVjdGluZyAiCi0JCSAgICAgICAidG8gZGV2aWNlOiAlcyAobG9jYWwgc3RhdGUgJWQsIHJlbW90ZSBzdGF0ZSAlZClcbiIsCi0JCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lLCB4ZW5kZXYtPnN0YXRlLCByc3RhdGUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBXZSBvbmx5IHdhaXQgZm9yIGRldmljZSBzZXR1cCBhZnRlciBtb3N0IGluaXRjYWxscyBoYXZlIHJ1bi4gKi8KLXN0YXRpYyBpbnQgcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlczsKLQotLyoKLSAqIE9uIGEgNS1taW51dGUgdGltZW91dCwgd2FpdCBmb3IgYWxsIGRldmljZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuICBXZSBuZWVkCi0gKiB0byBkbyB0aGlzIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBmaWxlc3lzdGVtcyBhbmQgLyBvciBuZXR3b3JrIGRldmljZXMKLSAqIG5lZWRlZCBmb3IgYm9vdCBhcmUgYXZhaWxhYmxlLCBiZWZvcmUgd2UgY2FuIGFsbG93IHRoZSBib290IHRvIHByb2NlZWQuCi0gKgotICogVGhpcyBuZWVkcyB0byBiZSBvbiBhIGxhdGVfaW5pdGNhbGwsIHRvIGhhcHBlbiBhZnRlciB0aGUgZnJvbnRlbmQgZGV2aWNlCi0gKiBkcml2ZXJzIGhhdmUgYmVlbiBpbml0aWFsaXNlZCwgYnV0IGJlZm9yZSB0aGUgcm9vdCBmcyBpcyBtb3VudGVkLgotICoKLSAqIEEgcG9zc2libGUgaW1wcm92ZW1lbnQgaGVyZSB3b3VsZCBiZSB0byBoYXZlIHRoZSB0b29scyBhZGQgYSBwZXItZGV2aWNlCi0gKiBmbGFnIHRvIHRoZSBzdG9yZSBlbnRyeSwgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIG5lZWRlZCBhdCBib290IHRpbWUuCi0gKiBUaGlzIHdvdWxkIGFsbG93IHBlb3BsZSB3aG8ga25ldyB3aGF0IHRoZXkgd2VyZSBkb2luZyB0byBhY2NlbGVyYXRlIHRoZWlyCi0gKiBib290IHNsaWdodGx5LCBidXQgb2YgY291cnNlIG5lZWRzIHRvb2xzIG9yIG1hbnVhbCBpbnRlcnZlbnRpb24gdG8gc2V0IHVwCi0gKiB0aG9zZSBmbGFncyBjb3JyZWN0bHkuCi0gKi8KLXN0YXRpYyB2b2lkIHdhaXRfZm9yX2RldmljZXMoc3RydWN0IHhlbmJ1c19kcml2ZXIgKnhlbmRydikKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0geGVuZHJ2ID8gJnhlbmRydi0+ZHJpdmVyIDogTlVMTDsKLQl1bnNpZ25lZCBpbnQgc2Vjb25kc193YWl0ZWQgPSAwOwotCi0JaWYgKCFyZWFkeV90b193YWl0X2Zvcl9kZXZpY2VzIHx8ICF4ZW5fZG9tYWluKCkpCi0JCXJldHVybjsKLQotCXdoaWxlIChleGlzdHNfY29ubmVjdGluZ19kZXZpY2UoZHJ2KSkgewotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIChzZWNvbmRzX3dhaXRlZCs1KSpIWikpIHsKLQkJCWlmICghc2Vjb25kc193YWl0ZWQpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBXYWl0aW5nIGZvciAiCi0JCQkJICAgICAgICJkZXZpY2VzIHRvIGluaXRpYWxpc2U6ICIpOwotCQkJc2Vjb25kc193YWl0ZWQgKz0gNTsKLQkJCXByaW50aygiJXVzLi4uIiwgMzAwIC0gc2Vjb25kc193YWl0ZWQpOwotCQkJaWYgKHNlY29uZHNfd2FpdGVkID09IDMwMCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWi8xMCk7Ci0JfQotCi0JaWYgKHNlY29uZHNfd2FpdGVkKQotCQlwcmludGsoIlxuIik7Ci0KLQlidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBkcnYsCi0JCQkgcHJpbnRfZGV2aWNlX3N0YXR1cyk7Ci19Ci0KLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCBib290X3dhaXRfZm9yX2RldmljZXModm9pZCkKLXsKLQlpZiAoeGVuX2h2bV9kb21haW4oKSAmJiAheGVuX3BsYXRmb3JtX3BjaV91bnBsdWcpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlcyA9IDE7Ci0Jd2FpdF9mb3JfZGV2aWNlcyhOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotbGF0ZV9pbml0Y2FsbChib290X3dhaXRfZm9yX2RldmljZXMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmggYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmgKaW5kZXggNmM1ZTMxOC4uMjQ2NjU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5oCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuaApAQCAtMzYsMjYgKzM2LDE1IEBACiAKICNkZWZpbmUgWEVOX0JVU19JRF9TSVpFCQkJMjAKIAotI2lmZGVmIENPTkZJR19YRU5fQkFDS0VORAotZXh0ZXJuIHZvaWQgeGVuYnVzX2JhY2tlbmRfc3VzcGVuZChpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKLWV4dGVybiB2b2lkIHhlbmJ1c19iYWNrZW5kX3Jlc3VtZShpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKLWV4dGVybiB2b2lkIHhlbmJ1c19iYWNrZW5kX3Byb2JlX2FuZF93YXRjaCh2b2lkKTsKLWV4dGVybiBpbnQgeGVuYnVzX2JhY2tlbmRfYnVzX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgeGVuYnVzX2JhY2tlbmRfYnVzX3VucmVnaXN0ZXIodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHhlbmJ1c19iYWNrZW5kX3N1c3BlbmQoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5idXNfYmFja2VuZF9yZXN1bWUoaW50ICgqZm4pKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5idXNfYmFja2VuZF9wcm9iZV9hbmRfd2F0Y2godm9pZCkge30KLXN0YXRpYyBpbmxpbmUgaW50IHhlbmJ1c19iYWNrZW5kX2J1c19yZWdpc3Rlcih2b2lkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgeGVuYnVzX2JhY2tlbmRfYnVzX3VucmVnaXN0ZXIodm9pZCkge30KLSNlbmRpZgotCiBzdHJ1Y3QgeGVuX2J1c190eXBlCiB7CiAJY2hhciAqcm9vdDsKIAl1bnNpZ25lZCBpbnQgbGV2ZWxzOwogCWludCAoKmdldF9idXNfaWQpKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKLQlpbnQgKCpwcm9iZSkoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGlyKTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IHhlbl9idXNfdHlwZSAqYnVzLCBjb25zdCBjaGFyICp0eXBlLAorCQkgICAgIGNvbnN0IGNoYXIgKmRpcik7CisJdm9pZCAoKm90aGVyZW5kX2NoYW5nZWQpKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoLCBjb25zdCBjaGFyICoqdmVjLAorCQkJCSB1bnNpZ25lZCBpbnQgbGVuKTsKIAlzdHJ1Y3QgYnVzX3R5cGUgYnVzOwogfTsKIApAQCAtNzMsNCArNjIsMTYgQEAKIAogZXh0ZXJuIHZvaWQgeGVuYnVzX2Rldl9jaGFuZ2VkKGNvbnN0IGNoYXIgKm5vZGUsIHN0cnVjdCB4ZW5fYnVzX3R5cGUgKmJ1cyk7CiAKK2V4dGVybiB2b2lkIHhlbmJ1c19kZXZfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2Rldik7CisKK2V4dGVybiBpbnQgeGVuYnVzX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBpbnQgeGVuYnVzX2Rldl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgeGVuYnVzX290aGVyZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCisJCQkJICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgIGludCBpZ25vcmVfb25fc2h1dGRvd24pOworCitleHRlcm4gaW50IHhlbmJ1c19yZWFkX290aGVyZW5kX2RldGFpbHMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiwKKwkJCQkJY2hhciAqaWRfbm9kZSwgY2hhciAqcGF0aF9ub2RlKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2JhY2tlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfYmFja2VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2JhY2tlbmQuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGFsa3MgdG8gWGVuIFN0b3JlIHRvIGZpZ3VyZSBvdXQgd2hhdCBkZXZpY2VzIHdlIGhhdmUgKGJhY2tlbmQgaGFsZikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJ1c3R5IFJ1c3NlbGwsIElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgV3JheSwgSGV3bGV0dC1QYWNrYXJkCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgWGVuU291cmNlIEx0ZAorICogQ29weXJpZ2h0IChDKSAyMDA3IFNvbGFyZmxhcmUgQ29tbXVuaWNhdGlvbnMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCQkJCVwKKwlwcl9kZWJ1ZygieGVuYnVzX3Byb2JlICglczolZCkgIiBmbXQgIi5cbiIsCVwKKwkJIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KKyNpbmNsdWRlIDx4ZW4vZmVhdHVyZXMuaD4KKworI2luY2x1ZGUgInhlbmJ1c19jb21tcy5oIgorI2luY2x1ZGUgInhlbmJ1c19wcm9iZS5oIgorCisvKiBiYWNrZW5kLzx0eXBlPi88ZmUtdXVpZD4vPGlkPiA9PiA8dHlwZT4tPGZlLWRvbWlkPi08aWQ+ICovCitzdGF0aWMgaW50IGJhY2tlbmRfYnVzX2lkKGNoYXIgYnVzX2lkW1hFTl9CVVNfSURfU0laRV0sIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQoreworCWludCBkb21pZCwgZXJyOworCWNvbnN0IGNoYXIgKmRldmlkLCAqdHlwZSwgKmZyb250ZW5kOworCXVuc2lnbmVkIGludCB0eXBlbGVuOworCisJdHlwZSA9IHN0cmNocihub2RlbmFtZSwgJy8nKTsKKwlpZiAoIXR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCXR5cGUrKzsKKwl0eXBlbGVuID0gc3RyY3Nwbih0eXBlLCAiLyIpOworCWlmICghdHlwZWxlbiB8fCB0eXBlW3R5cGVsZW5dICE9ICcvJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZpZCA9IHN0cnJjaHIobm9kZW5hbWUsICcvJykgKyAxOworCisJZXJyID0geGVuYnVzX2dhdGhlcihYQlRfTklMLCBub2RlbmFtZSwgImZyb250ZW5kLWlkIiwgIiVpIiwgJmRvbWlkLAorCQkJICAgICJmcm9udGVuZCIsIE5VTEwsICZmcm9udGVuZCwKKwkJCSAgICBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChzdHJsZW4oZnJvbnRlbmQpID09IDApCisJCWVyciA9IC1FUkFOR0U7CisJaWYgKCFlcnIgJiYgIXhlbmJ1c19leGlzdHMoWEJUX05JTCwgZnJvbnRlbmQsICIiKSkKKwkJZXJyID0gLUVOT0VOVDsKKwlrZnJlZShmcm9udGVuZCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNucHJpbnRmKGJ1c19pZCwgWEVOX0JVU19JRF9TSVpFLCAiJS4qcy0laS0lcyIsCisJCSAgICAgdHlwZWxlbiwgdHlwZSwgZG9taWQsIGRldmlkKSA+PSBYRU5fQlVTX0lEX1NJWkUpCisJCXJldHVybiAtRU5PU1BDOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhlbmJ1c191ZXZlbnRfYmFja2VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqeGRldjsKKwlzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqZHJ2OworCXN0cnVjdCB4ZW5fYnVzX3R5cGUgKmJ1czsKKworCURQUklOVEsoIiIpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXhkZXYgPSB0b194ZW5idXNfZGV2aWNlKGRldik7CisJYnVzID0gY29udGFpbmVyX29mKHhkZXYtPmRldi5idXMsIHN0cnVjdCB4ZW5fYnVzX3R5cGUsIGJ1cyk7CisJaWYgKHhkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBzdHVmZiB3ZSB3YW50IHRvIHBhc3MgdG8gL3NiaW4vaG90cGx1ZyAqLworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJYRU5CVVNfVFlQRT0lcyIsIHhkZXYtPmRldmljZXR5cGUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJYRU5CVVNfUEFUSD0lcyIsIHhkZXYtPm5vZGVuYW1lKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiWEVOQlVTX0JBU0VfUEFUSD0lcyIsIGJ1cy0+cm9vdCkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGRldi0+ZHJpdmVyKSB7CisJCWRydiA9IHRvX3hlbmJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCQlpZiAoZHJ2ICYmIGRydi0+dWV2ZW50KQorCQkJcmV0dXJuIGRydi0+dWV2ZW50KHhkZXYsIGVudik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGJhY2tlbmQvPHR5cGVuYW1lPi88ZnJvbnRlbmQtdXVpZD4vPG5hbWU+ICovCitzdGF0aWMgaW50IHhlbmJ1c19wcm9iZV9iYWNrZW5kX3VuaXQoc3RydWN0IHhlbl9idXNfdHlwZSAqYnVzLAorCQkJCSAgICAgY29uc3QgY2hhciAqZGlyLAorCQkJCSAgICAgY29uc3QgY2hhciAqdHlwZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqbm9kZW5hbWU7CisJaW50IGVycjsKKworCW5vZGVuYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy8lcyIsIGRpciwgbmFtZSk7CisJaWYgKCFub2RlbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlEUFJJTlRLKCIlc1xuIiwgbm9kZW5hbWUpOworCisJZXJyID0geGVuYnVzX3Byb2JlX25vZGUoYnVzLCB0eXBlLCBub2RlbmFtZSk7CisJa2ZyZWUobm9kZW5hbWUpOworCXJldHVybiBlcnI7Cit9CisKKy8qIGJhY2tlbmQvPHR5cGVuYW1lPi88ZnJvbnRlbmQtZG9taWQ+ICovCitzdGF0aWMgaW50IHhlbmJ1c19wcm9iZV9iYWNrZW5kKHN0cnVjdCB4ZW5fYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqdHlwZSwKKwkJCQljb25zdCBjaGFyICpkb21pZCkKK3sKKwljaGFyICpub2RlbmFtZTsKKwlpbnQgZXJyID0gMDsKKwljaGFyICoqZGlyOworCXVuc2lnbmVkIGludCBpLCBkaXJfbiA9IDA7CisKKwlEUFJJTlRLKCIiKTsKKworCW5vZGVuYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy8lcy8lcyIsIGJ1cy0+cm9vdCwgdHlwZSwgZG9taWQpOworCWlmICghbm9kZW5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJZGlyID0geGVuYnVzX2RpcmVjdG9yeShYQlRfTklMLCBub2RlbmFtZSwgIiIsICZkaXJfbik7CisJaWYgKElTX0VSUihkaXIpKSB7CisJCWtmcmVlKG5vZGVuYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlyKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyX247IGkrKykgeworCQllcnIgPSB4ZW5idXNfcHJvYmVfYmFja2VuZF91bml0KGJ1cywgbm9kZW5hbWUsIHR5cGUsIGRpcltpXSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJa2ZyZWUoZGlyKTsKKwlrZnJlZShub2RlbmFtZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZnJvbnRlbmRfY2hhbmdlZChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKKwkJCSAgICBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXhlbmJ1c19vdGhlcmVuZF9jaGFuZ2VkKHdhdGNoLCB2ZWMsIGxlbiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB4ZW5idXNfYmFja2VuZF9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCB4ZW5fYnVzX3R5cGUgeGVuYnVzX2JhY2tlbmQgPSB7CisJLnJvb3QgPSAiYmFja2VuZCIsCisJLmxldmVscyA9IDMsCQkvKiBiYWNrZW5kL3R5cGUvPGZyb250ZW5kPi88aWQ+ICovCisJLmdldF9idXNfaWQgPSBiYWNrZW5kX2J1c19pZCwKKwkucHJvYmUgPSB4ZW5idXNfcHJvYmVfYmFja2VuZCwKKwkub3RoZXJlbmRfY2hhbmdlZCA9IGZyb250ZW5kX2NoYW5nZWQsCisJLmJ1cyA9IHsKKwkJLm5hbWUJCT0gInhlbi1iYWNrZW5kIiwKKwkJLm1hdGNoCQk9IHhlbmJ1c19tYXRjaCwKKwkJLnVldmVudAkJPSB4ZW5idXNfdWV2ZW50X2JhY2tlbmQsCisJCS5wcm9iZQkJPSB4ZW5idXNfZGV2X3Byb2JlLAorCQkucmVtb3ZlCQk9IHhlbmJ1c19kZXZfcmVtb3ZlLAorCQkuc2h1dGRvd24JPSB4ZW5idXNfZGV2X3NodXRkb3duLAorCQkuZGV2X2F0dHJzCT0geGVuYnVzX2JhY2tlbmRfZGV2X2F0dHJzLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBiYWNrZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCisJCQkgICAgY29uc3QgY2hhciAqKnZlYywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlEUFJJTlRLKCIiKTsKKworCXhlbmJ1c19kZXZfY2hhbmdlZCh2ZWNbWFNfV0FUQ0hfUEFUSF0sICZ4ZW5idXNfYmFja2VuZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX3dhdGNoIGJlX3dhdGNoID0geworCS5ub2RlID0gImJhY2tlbmQiLAorCS5jYWxsYmFjayA9IGJhY2tlbmRfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgcmVhZF9mcm9udGVuZF9kZXRhaWxzKHN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW5kZXYpCit7CisJcmV0dXJuIHhlbmJ1c19yZWFkX290aGVyZW5kX2RldGFpbHMoeGVuZGV2LCAiZnJvbnRlbmQtaWQiLCAiZnJvbnRlbmQiKTsKK30KKworaW50IHhlbmJ1c19kZXZfaXNfb25saW5lKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJjLCB2YWw7CisKKwlyYyA9IHhlbmJ1c19zY2FuZihYQlRfTklMLCBkZXYtPm5vZGVuYW1lLCAib25saW5lIiwgIiVkIiwgJnZhbCk7CisJaWYgKHJjICE9IDEpCisJCXZhbCA9IDA7IC8qIG5vIG9ubGluZSBub2RlIHByZXNlbnQgKi8KKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfZGV2X2lzX29ubGluZSk7CisKK2ludCBfX3hlbmJ1c19yZWdpc3Rlcl9iYWNrZW5kKHN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnYsCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpCit7CisJZHJ2LT5yZWFkX290aGVyZW5kX2RldGFpbHMgPSByZWFkX2Zyb250ZW5kX2RldGFpbHM7CisKKwlyZXR1cm4geGVuYnVzX3JlZ2lzdGVyX2RyaXZlcl9jb21tb24oZHJ2LCAmeGVuYnVzX2JhY2tlbmQsCisJCQkJCSAgICAgb3duZXIsIG1vZF9uYW1lKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9feGVuYnVzX3JlZ2lzdGVyX2JhY2tlbmQpOworCitzdGF0aWMgaW50IGJhY2tlbmRfcHJvYmVfYW5kX3dhdGNoKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbm90aWZpZXIsCisJCQkJICAgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCQkgICB2b2lkICpkYXRhKQoreworCS8qIEVudW1lcmF0ZSBkZXZpY2VzIGluIHhlbnN0b3JlIGFuZCB3YXRjaCBmb3IgY2hhbmdlcy4gKi8KKwl4ZW5idXNfcHJvYmVfZGV2aWNlcygmeGVuYnVzX2JhY2tlbmQpOworCXJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmYmVfd2F0Y2gpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgaW50IF9faW5pdCB4ZW5idXNfcHJvYmVfYmFja2VuZF9pbml0KHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5zdG9yZV9ub3RpZmllciA9IHsKKwkJLm5vdGlmaWVyX2NhbGwgPSBiYWNrZW5kX3Byb2JlX2FuZF93YXRjaAorCX07CisJaW50IGVycjsKKworCURQUklOVEsoIiIpOworCisJLyogUmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGtlcm5lbCBidXMgc3Vic3lzdGVtICovCisJZXJyID0gYnVzX3JlZ2lzdGVyKCZ4ZW5idXNfYmFja2VuZC5idXMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZWdpc3Rlcl94ZW5zdG9yZV9ub3RpZmllcigmeGVuc3RvcmVfbm90aWZpZXIpOworCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwoeGVuYnVzX3Byb2JlX2JhY2tlbmRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2Zyb250ZW5kLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlX2Zyb250ZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjYzJkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmVfZnJvbnRlbmQuYwpAQCAtMCwwICsxLDI5NCBAQAorI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikJCQkJXAorCXByX2RlYnVnKCJ4ZW5idXNfcHJvYmUgKCVzOiVkKSAiIGZtdCAiLlxuIiwJXAorCQkgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KKyNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KKworI2luY2x1ZGUgPHhlbi9wbGF0Zm9ybV9wY2kuaD4KKworI2luY2x1ZGUgInhlbmJ1c19jb21tcy5oIgorI2luY2x1ZGUgInhlbmJ1c19wcm9iZS5oIgorCisKKy8qIGRldmljZS88dHlwZT4vPGlkPiA9PiA8dHlwZT4tPGlkPiAqLworc3RhdGljIGludCBmcm9udGVuZF9idXNfaWQoY2hhciBidXNfaWRbWEVOX0JVU19JRF9TSVpFXSwgY29uc3QgY2hhciAqbm9kZW5hbWUpCit7CisJbm9kZW5hbWUgPSBzdHJjaHIobm9kZW5hbWUsICcvJyk7CisJaWYgKCFub2RlbmFtZSB8fCBzdHJsZW4obm9kZW5hbWUgKyAxKSA+PSBYRU5fQlVTX0lEX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBiYWQgZnJvbnRlbmQgJXNcbiIsIG5vZGVuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RybGNweShidXNfaWQsIG5vZGVuYW1lICsgMSwgWEVOX0JVU19JRF9TSVpFKTsKKwlpZiAoIXN0cmNocihidXNfaWQsICcvJykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBidXNfaWQgJXMgbm8gc2xhc2hcbiIsIGJ1c19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkqc3RyY2hyKGJ1c19pZCwgJy8nKSA9ICctJzsKKwlyZXR1cm4gMDsKK30KKworLyogZGV2aWNlLzx0eXBlbmFtZT4vPG5hbWU+ICovCitzdGF0aWMgaW50IHhlbmJ1c19wcm9iZV9mcm9udGVuZChzdHJ1Y3QgeGVuX2J1c190eXBlICpidXMsIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqbm9kZW5hbWU7CisJaW50IGVycjsKKworCW5vZGVuYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy8lcy8lcyIsIGJ1cy0+cm9vdCwgdHlwZSwgbmFtZSk7CisJaWYgKCFub2RlbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlEUFJJTlRLKCIlcyIsIG5vZGVuYW1lKTsKKworCWVyciA9IHhlbmJ1c19wcm9iZV9ub2RlKGJ1cywgdHlwZSwgbm9kZW5hbWUpOworCWtmcmVlKG5vZGVuYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHhlbmJ1c191ZXZlbnRfZnJvbnRlbmQoc3RydWN0IGRldmljZSAqX2RldiwKKwkJCQkgIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2ID0gdG9feGVuYnVzX2RldmljZShfZGV2KTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz14ZW46JXMiLCBkZXYtPmRldmljZXR5cGUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGJhY2tlbmRfY2hhbmdlZChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKKwkJCSAgICBjb25zdCBjaGFyICoqdmVjLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXhlbmJ1c19vdGhlcmVuZF9jaGFuZ2VkKHdhdGNoLCB2ZWMsIGxlbiwgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB4ZW5idXNfZnJvbnRlbmRfZGV2X2F0dHJzW10gPSB7CisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeGVuX2J1c190eXBlIHhlbmJ1c19mcm9udGVuZCA9IHsKKwkucm9vdCA9ICJkZXZpY2UiLAorCS5sZXZlbHMgPSAyLAkJLyogZGV2aWNlL3R5cGUvPGlkPiAqLworCS5nZXRfYnVzX2lkID0gZnJvbnRlbmRfYnVzX2lkLAorCS5wcm9iZSA9IHhlbmJ1c19wcm9iZV9mcm9udGVuZCwKKwkub3RoZXJlbmRfY2hhbmdlZCA9IGJhY2tlbmRfY2hhbmdlZCwKKwkuYnVzID0geworCQkubmFtZQkJPSAieGVuIiwKKwkJLm1hdGNoCQk9IHhlbmJ1c19tYXRjaCwKKwkJLnVldmVudAkJPSB4ZW5idXNfdWV2ZW50X2Zyb250ZW5kLAorCQkucHJvYmUJCT0geGVuYnVzX2Rldl9wcm9iZSwKKwkJLnJlbW92ZQkJPSB4ZW5idXNfZGV2X3JlbW92ZSwKKwkJLnNodXRkb3duCT0geGVuYnVzX2Rldl9zaHV0ZG93biwKKwkJLmRldl9hdHRycwk9IHhlbmJ1c19mcm9udGVuZF9kZXZfYXR0cnMsCisKKwkJLnN1c3BlbmQJPSB4ZW5idXNfZGV2X3N1c3BlbmQsCisJCS5yZXN1bWUJCT0geGVuYnVzX2Rldl9yZXN1bWUsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIGZyb250ZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCisJCQkgICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJRFBSSU5USygiIik7CisKKwl4ZW5idXNfZGV2X2NoYW5nZWQodmVjW1hTX1dBVENIX1BBVEhdLCAmeGVuYnVzX2Zyb250ZW5kKTsKK30KKworCisvKiBXZSB3YXRjaCBmb3IgZGV2aWNlcyBhcHBlYXJpbmcgYW5kIHZhbmlzaGluZy4gKi8KK3N0YXRpYyBzdHJ1Y3QgeGVuYnVzX3dhdGNoIGZlX3dhdGNoID0geworCS5ub2RlID0gImRldmljZSIsCisJLmNhbGxiYWNrID0gZnJvbnRlbmRfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgcmVhZF9iYWNrZW5kX2RldGFpbHMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldikKK3sKKwlyZXR1cm4geGVuYnVzX3JlYWRfb3RoZXJlbmRfZGV0YWlscyh4ZW5kZXYsICJiYWNrZW5kLWlkIiwgImJhY2tlbmQiKTsKK30KKworc3RhdGljIGludCBpc19kZXZpY2VfY29ubmVjdGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhlbmRldiA9IHRvX3hlbmJ1c19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGF0YTsKKwlzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqeGVuZHJ2OworCisJLyoKKwkgKiBBIGRldmljZSB3aXRoIG5vIGRyaXZlciB3aWxsIG5ldmVyIGNvbm5lY3QuIFdlIGNhcmUgb25seSBhYm91dAorCSAqIGRldmljZXMgd2hpY2ggc2hvdWxkIGN1cnJlbnRseSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nLgorCSAqLworCWlmICghZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJLyogSXMgdGhpcyBzZWFyY2ggbGltaXRlZCB0byBhIHBhcnRpY3VsYXIgZHJpdmVyPyAqLworCWlmIChkcnYgJiYgKGRldi0+ZHJpdmVyICE9IGRydikpCisJCXJldHVybiAwOworCisJeGVuZHJ2ID0gdG9feGVuYnVzX2RyaXZlcihkZXYtPmRyaXZlcik7CisJcmV0dXJuICh4ZW5kZXYtPnN0YXRlIDwgWGVuYnVzU3RhdGVDb25uZWN0ZWQgfHwKKwkJKHhlbmRldi0+c3RhdGUgPT0gWGVuYnVzU3RhdGVDb25uZWN0ZWQgJiYKKwkJIHhlbmRydi0+aXNfcmVhZHkgJiYgIXhlbmRydi0+aXNfcmVhZHkoeGVuZGV2KSkpOworfQorCitzdGF0aWMgaW50IGV4aXN0c19jb25uZWN0aW5nX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBkcnYsCisJCQkJaXNfZGV2aWNlX2Nvbm5lY3RpbmcpOworfQorCitzdGF0aWMgaW50IHByaW50X2RldmljZV9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4ZW5kZXYgPSB0b194ZW5idXNfZGV2aWNlKGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRhdGE7CisKKwkvKiBJcyB0aGlzIG9wZXJhdGlvbiBsaW1pdGVkIHRvIGEgcGFydGljdWxhciBkcml2ZXI/ICovCisJaWYgKGRydiAmJiAoZGV2LT5kcml2ZXIgIT0gZHJ2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRldi0+ZHJpdmVyKSB7CisJCS8qIEluZm9ybWF0aW9uIG9ubHk6IGlzIHRoaXMgdG9vIG5vaXN5PyAqLworCQlwcmludGsoS0VSTl9JTkZPICJYRU5CVVM6IERldmljZSB3aXRoIG5vIGRyaXZlcjogJXNcbiIsCisJCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lKTsKKwl9IGVsc2UgaWYgKHhlbmRldi0+c3RhdGUgPCBYZW5idXNTdGF0ZUNvbm5lY3RlZCkgeworCQllbnVtIHhlbmJ1c19zdGF0ZSByc3RhdGUgPSBYZW5idXNTdGF0ZVVua25vd247CisJCWlmICh4ZW5kZXYtPm90aGVyZW5kKQorCQkJcnN0YXRlID0geGVuYnVzX3JlYWRfZHJpdmVyX3N0YXRlKHhlbmRldi0+b3RoZXJlbmQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJYRU5CVVM6IFRpbWVvdXQgY29ubmVjdGluZyAiCisJCSAgICAgICAidG8gZGV2aWNlOiAlcyAobG9jYWwgc3RhdGUgJWQsIHJlbW90ZSBzdGF0ZSAlZClcbiIsCisJCSAgICAgICB4ZW5kZXYtPm5vZGVuYW1lLCB4ZW5kZXYtPnN0YXRlLCByc3RhdGUpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBXZSBvbmx5IHdhaXQgZm9yIGRldmljZSBzZXR1cCBhZnRlciBtb3N0IGluaXRjYWxscyBoYXZlIHJ1bi4gKi8KK3N0YXRpYyBpbnQgcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlczsKKworLyoKKyAqIE9uIGEgNS1taW51dGUgdGltZW91dCwgd2FpdCBmb3IgYWxsIGRldmljZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuICBXZSBuZWVkCisgKiB0byBkbyB0aGlzIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBmaWxlc3lzdGVtcyBhbmQgLyBvciBuZXR3b3JrIGRldmljZXMKKyAqIG5lZWRlZCBmb3IgYm9vdCBhcmUgYXZhaWxhYmxlLCBiZWZvcmUgd2UgY2FuIGFsbG93IHRoZSBib290IHRvIHByb2NlZWQuCisgKgorICogVGhpcyBuZWVkcyB0byBiZSBvbiBhIGxhdGVfaW5pdGNhbGwsIHRvIGhhcHBlbiBhZnRlciB0aGUgZnJvbnRlbmQgZGV2aWNlCisgKiBkcml2ZXJzIGhhdmUgYmVlbiBpbml0aWFsaXNlZCwgYnV0IGJlZm9yZSB0aGUgcm9vdCBmcyBpcyBtb3VudGVkLgorICoKKyAqIEEgcG9zc2libGUgaW1wcm92ZW1lbnQgaGVyZSB3b3VsZCBiZSB0byBoYXZlIHRoZSB0b29scyBhZGQgYSBwZXItZGV2aWNlCisgKiBmbGFnIHRvIHRoZSBzdG9yZSBlbnRyeSwgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIG5lZWRlZCBhdCBib290IHRpbWUuCisgKiBUaGlzIHdvdWxkIGFsbG93IHBlb3BsZSB3aG8ga25ldyB3aGF0IHRoZXkgd2VyZSBkb2luZyB0byBhY2NlbGVyYXRlIHRoZWlyCisgKiBib290IHNsaWdodGx5LCBidXQgb2YgY291cnNlIG5lZWRzIHRvb2xzIG9yIG1hbnVhbCBpbnRlcnZlbnRpb24gdG8gc2V0IHVwCisgKiB0aG9zZSBmbGFncyBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2RldmljZXMoc3RydWN0IHhlbmJ1c19kcml2ZXIgKnhlbmRydikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0geGVuZHJ2ID8gJnhlbmRydi0+ZHJpdmVyIDogTlVMTDsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kc193YWl0ZWQgPSAwOworCisJaWYgKCFyZWFkeV90b193YWl0X2Zvcl9kZXZpY2VzIHx8ICF4ZW5fZG9tYWluKCkpCisJCXJldHVybjsKKworCXdoaWxlIChleGlzdHNfY29ubmVjdGluZ19kZXZpY2UoZHJ2KSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIChzZWNvbmRzX3dhaXRlZCs1KSpIWikpIHsKKwkJCWlmICghc2Vjb25kc193YWl0ZWQpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWEVOQlVTOiBXYWl0aW5nIGZvciAiCisJCQkJICAgICAgICJkZXZpY2VzIHRvIGluaXRpYWxpc2U6ICIpOworCQkJc2Vjb25kc193YWl0ZWQgKz0gNTsKKwkJCXByaW50aygiJXVzLi4uIiwgMzAwIC0gc2Vjb25kc193YWl0ZWQpOworCQkJaWYgKHNlY29uZHNfd2FpdGVkID09IDMwMCkKKwkJCQlicmVhazsKKwkJfQorCisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShIWi8xMCk7CisJfQorCisJaWYgKHNlY29uZHNfd2FpdGVkKQorCQlwcmludGsoIlxuIik7CisKKwlidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBkcnYsCisJCQkgcHJpbnRfZGV2aWNlX3N0YXR1cyk7Cit9CisKK2ludCBfX3hlbmJ1c19yZWdpc3Rlcl9mcm9udGVuZChzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqZHJ2LAorCQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSkKK3sKKwlpbnQgcmV0OworCisJZHJ2LT5yZWFkX290aGVyZW5kX2RldGFpbHMgPSByZWFkX2JhY2tlbmRfZGV0YWlsczsKKworCXJldCA9IHhlbmJ1c19yZWdpc3Rlcl9kcml2ZXJfY29tbW9uKGRydiwgJnhlbmJ1c19mcm9udGVuZCwKKwkJCQkJICAgIG93bmVyLCBtb2RfbmFtZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIElmIHRoaXMgZHJpdmVyIGlzIGxvYWRlZCBhcyBhIG1vZHVsZSB3YWl0IGZvciBkZXZpY2VzIHRvIGF0dGFjaC4gKi8KKwl3YWl0X2Zvcl9kZXZpY2VzKGRydik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9feGVuYnVzX3JlZ2lzdGVyX2Zyb250ZW5kKTsKKworc3RhdGljIGludCBmcm9udGVuZF9wcm9iZV9hbmRfd2F0Y2goc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJLyogRW51bWVyYXRlIGRldmljZXMgaW4geGVuc3RvcmUgYW5kIHdhdGNoIGZvciBjaGFuZ2VzLiAqLworCXhlbmJ1c19wcm9iZV9kZXZpY2VzKCZ4ZW5idXNfZnJvbnRlbmQpOworCXJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmZmVfd2F0Y2gpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHhlbmJ1c19wcm9iZV9mcm9udGVuZF9pbml0KHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5zdG9yZV9ub3RpZmllciA9IHsKKwkJLm5vdGlmaWVyX2NhbGwgPSBmcm9udGVuZF9wcm9iZV9hbmRfd2F0Y2gKKwl9OworCWludCBlcnI7CisKKwlEUFJJTlRLKCIiKTsKKworCS8qIFJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBrZXJuZWwgYnVzIHN1YnN5c3RlbSAqLworCWVyciA9IGJ1c19yZWdpc3RlcigmeGVuYnVzX2Zyb250ZW5kLmJ1cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlZ2lzdGVyX3hlbnN0b3JlX25vdGlmaWVyKCZ4ZW5zdG9yZV9ub3RpZmllcik7CisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh4ZW5idXNfcHJvYmVfZnJvbnRlbmRfaW5pdCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBib290X3dhaXRfZm9yX2RldmljZXModm9pZCkKK3sKKwlpZiAoeGVuX2h2bV9kb21haW4oKSAmJiAheGVuX3BsYXRmb3JtX3BjaV91bnBsdWcpCisJCXJldHVybiAtRU5PREVWOworCisJcmVhZHlfdG9fd2FpdF9mb3JfZGV2aWNlcyA9IDE7CisJd2FpdF9mb3JfZGV2aWNlcyhOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChib290X3dhaXRfZm9yX2RldmljZXMpOworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2loZXgyZncuYyBiL2Zpcm13YXJlL2loZXgyZncuYwppbmRleCBiYTBjZjBiLi5jZjM4ZTE1IDEwMDY0NAotLS0gYS9maXJtd2FyZS9paGV4MmZ3LmMKKysrIGIvZmlybXdhcmUvaWhleDJmdy5jCkBAIC0xMjQsOCArMTI0LDcgQEAKIAlpZiAocHJvY2Vzc19paGV4KGRhdGEsIHN0LnN0X3NpemUpKQogCQlyZXR1cm4gMTsKIAotCW91dHB1dF9yZWNvcmRzKG91dGZkKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gb3V0cHV0X3JlY29yZHMob3V0ZmQpOwogfQogCiBzdGF0aWMgaW50IHByb2Nlc3NfaWhleCh1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUpCkBAIC0yNjksMTEgKzI2OCwxMyBAQAogCiAJCXAtPmFkZHIgPSBodG9ubChwLT5hZGRyKTsKIAkJcC0+bGVuID0gaHRvbnMocC0+bGVuKTsKLQkJd3JpdGUob3V0ZmQsICZwLT5hZGRyLCB3cml0ZWxlbik7CisJCWlmICh3cml0ZShvdXRmZCwgJnAtPmFkZHIsIHdyaXRlbGVuKSAhPSB3cml0ZWxlbikKKwkJCXJldHVybiAxOwogCQlwID0gcC0+bmV4dDsKIAl9CiAJLyogRU9GIHJlY29yZCBpcyB6ZXJvIGxlbmd0aCwgc2luY2Ugd2UgZG9uJ3QgYm90aGVyIHRvIHJlcHJlc2VudAogCSAgIHRoZSB0eXBlIGZpZWxkIGluIHRoZSBiaW5hcnkgdmVyc2lvbiAqLwotCXdyaXRlKG91dGZkLCB6ZXJvZXMsIDYpOworCWlmICh3cml0ZShvdXRmZCwgemVyb2VzLCA2KSAhPSA2KQorCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzLzlwL0tjb25maWcgYi9mcy85cC9LY29uZmlnCmluZGV4IDdlMDUxMTQuLjgxNGFjNGUgMTAwNjQ0Ci0tLSBhL2ZzLzlwL0tjb25maWcKKysrIGIvZnMvOXAvS2NvbmZpZwpAQCAtOSw2ICs5LDggQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgOVBfRlMKKwogY29uZmlnIDlQX0ZTQ0FDSEUKIAlib29sICJFbmFibGUgOVAgY2xpZW50IGNhY2hpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApAQCAtMjAsNyArMjIsNiBAQAogCiBjb25maWcgOVBfRlNfUE9TSVhfQUNMCiAJYm9vbCAiOVAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCi0JZGVwZW5kcyBvbiA5UF9GUwogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCkBAIC0zMCwzICszMSw1IEBACiAJICBMaW51eCB3ZWJzaXRlIDxodHRwOi8vYWNsLmJlc3RiaXRzLmF0Lz4uCiAKIAkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgQWNjZXNzIENvbnRyb2wgTGlzdHMgYXJlLCBzYXkgTgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvOXAvTWFrZWZpbGUgYi9mcy85cC9NYWtlZmlsZQppbmRleCBmOGJhMzdlLi5hYjhjMTI3IDEwMDY0NAotLS0gYS9mcy85cC9NYWtlZmlsZQorKysgYi9mcy85cC9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKIDlwLW9ianMgOj0gXAogCXZmc19zdXBlci5vIFwKIAl2ZnNfaW5vZGUubyBcCisJdmZzX2lub2RlX2RvdGwubyBcCiAJdmZzX2FkZHIubyBcCiAJdmZzX2ZpbGUubyBcCiAJdmZzX2Rpci5vIFwKZGlmZiAtLWdpdCBhL2ZzLzlwL2FjbC5jIGIvZnMvOXAvYWNsLmMKaW5kZXggNmU1OGM0Yy4uMDJhMmNmNiAxMDA2NDQKLS0tIGEvZnMvOXAvYWNsLmMKKysrIGIvZnMvOXAvYWNsLmMKQEAgLTI4LDcgKzI4LDcgQEAKIHsKIAlzc2l6ZV90IHNpemU7CiAJdm9pZCAqdmFsdWUgPSBOVUxMOwotCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7OworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CiAKIAlzaXplID0gdjlmc19maWRfeGF0dHJfZ2V0KGZpZCwgbmFtZSwgTlVMTCwgMCk7CiAJaWYgKHNpemUgPiAwKSB7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CiAJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKIAkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJcmV0dmFsID0gYWNsID8gLUVJTlZBTCA6IDA7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcy85cC92OWZzLmggYi9mcy85cC92OWZzLmgKaW5kZXggY2I2Mzk2OC4uYzRiNWQ4OCAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmcy5oCisrKyBiL2ZzLzlwL3Y5ZnMuaApAQCAtMTEzLDkgKzExMywyNyBAQAogCiBzdHJ1Y3QgcDlfZmlkICp2OWZzX3Nlc3Npb25faW5pdChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKiwgY29uc3QgY2hhciAqLAogCQkJCQkJCQkJY2hhciAqKTsKLXZvaWQgdjlmc19zZXNzaW9uX2Nsb3NlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOwotdm9pZCB2OWZzX3Nlc3Npb25fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOwotdm9pZCB2OWZzX3Nlc3Npb25fYmVnaW5fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworZXh0ZXJuIHZvaWQgdjlmc19zZXNzaW9uX2Nsb3NlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworZXh0ZXJuIHZvaWQgdjlmc19zZXNzaW9uX2NhbmNlbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKK2V4dGVybiB2b2lkIHY5ZnNfc2Vzc2lvbl9iZWdpbl9jYW5jZWwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqdjlmc192ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuYW1laWRhdGEpOworZXh0ZXJuIGludCB2OWZzX3Zmc191bmxpbmsoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKTsKK2V4dGVybiBpbnQgdjlmc192ZnNfcm1kaXIoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKTsKK2V4dGVybiBpbnQgdjlmc192ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CitleHRlcm4gdm9pZCB2OWZzX3Zmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkJdm9pZCAqcCk7CitleHRlcm4gc3RydWN0IGlub2RlICp2OWZzX2lub2RlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJCQlzdHJ1Y3QgcDlfZmlkICpmaWQsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90bDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uc19kb3RsOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zX2RvdGw7CitleHRlcm4gc3RydWN0IGlub2RlICp2OWZzX2lub2RlX2RvdGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywKKwkJCXN0cnVjdCBwOV9maWQgKmZpZCwKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogCiAvKiBvdGhlciBkZWZhdWx0IGdsb2JhbHMgKi8KICNkZWZpbmUgVjlGU19QT1JUCTU2NApAQCAtMTM4LDMgKzE1NiwyMSBAQAogewogCXJldHVybiB2OXNlcy0+ZmxhZ3MgJiBWOUZTX1BST1RPXzIwMDBMOwogfQorCisvKioKKyAqIHY5ZnNfaW5vZGVfZnJvbV9maWQgLSBIZWxwZXIgcm91dGluZSB0byBwb3B1bGF0ZSBhbiBpbm9kZSBieQorICogaXNzdWluZyBhIGF0dHJpYnV0ZSByZXF1ZXN0CisgKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KKyAqIEBmaWQ6IGZpZCB0byBpc3N1ZSBhdHRyaWJ1dGUgcmVxdWVzdCBmb3IKKyAqIEBzYjogc3VwZXJibG9jayBvbiB3aGljaCB0byBjcmVhdGUgaW5vZGUKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICoKK3Y5ZnNfaW5vZGVfZnJvbV9maWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAorCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKHY5ZnNfcHJvdG9fZG90bCh2OXNlcykpCisJCXJldHVybiB2OWZzX2lub2RlX2RvdGwodjlzZXMsIGZpZCwgc2IpOworCWVsc2UKKwkJcmV0dXJuIHY5ZnNfaW5vZGUodjlzZXMsIGZpZCwgc2IpOworfQpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmc192ZnMuaCBiL2ZzLzlwL3Y5ZnNfdmZzLmgKaW5kZXggYmFiMGVhYy4uYjc4OWY4ZSAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmc192ZnMuaAorKysgYi9mcy85cC92OWZzX3Zmcy5oCkBAIC01OSw3ICs1OSw2IEBACiBpbnQgdjlmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBpbnQgdjlmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCB2OWZzX2lub2RlMnN0YXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHA5X3dzdGF0ICpzdGF0KTsKLXZvaWQgdjlmc19kZW50cnlfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICopOwogaW50IHY5ZnNfdWZsYWdzMm9tb2RlKGludCB1ZmxhZ3MsIGludCBleHRlbmRlZCk7CiAKIHNzaXplX3Qgdjlmc19maWxlX3JlYWRuKHN0cnVjdCBmaWxlICosIGNoYXIgKiwgY2hhciBfX3VzZXIgKiwgdTMyLCB1NjQpOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2RlbnRyeS5jIGIvZnMvOXAvdmZzX2RlbnRyeS5jCmluZGV4IDQ2NmQyYTQuLjIzM2I3ZDQgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19kZW50cnkuYworKysgYi9mcy85cC92ZnNfZGVudHJ5LmMKQEAgLTg2LDcgKzg2LDcgQEAKICAqCiAgKi8KIAotdm9pZCB2OWZzX2RlbnRyeV9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyB2b2lkIHY5ZnNfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCB2OWZzX2RlbnRyeSAqZGVudDsKIAlzdHJ1Y3QgcDlfZmlkICp0ZW1wLCAqY3VycmVudF9maWQ7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGUuYyBiL2ZzLzlwL3Zmc19pbm9kZS5jCmluZGV4IDU5NzgyOTguLmI3NmE0MGIgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19pbm9kZS5jCisrKyBiL2ZzLzlwL3Zmc19pbm9kZS5jCkBAIC00OSwxNSArNDksOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdHU7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19kb3RsOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zX2RvdGw7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnNfZG90bDsKLQotc3RhdGljIGludAotdjlmc192ZnNfbWtub2RfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb21vZGUsCi0JCSAgICBkZXZfdCByZGV2KTsKIAogLyoqCiAgKiB1bml4bW9kZTJwOW1vZGUgLSBjb252ZXJ0IHVuaXggbW9kZSBiaXRzIHRvIHBsYW4gOQpAQCAtMjUxLDQxICsyNDQsNiBAQAogI2VuZGlmCiAKIC8qKgotICogdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZSAtIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGdpZCBmb3IgY3JlYXRpbmcgYQotICogbmV3IGZpbGUgc3lzdGVtIG9iamVjdC4gVGhpcyBjaGVja3MgdGhlIFNfSVNHSUQgdG8gZGV0ZXJtaW5lIHRoZSBvd25pbmcKLSAqIGdyb3VwIG9mIHRoZSBuZXcgZmlsZSBzeXN0ZW0gb2JqZWN0LgotICovCi0KLXN0YXRpYyBnaWRfdCB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlKQotewotCUJVR19PTihkaXJfaW5vZGUgPT0gTlVMTCk7Ci0KLQlpZiAoZGlyX2lub2RlLT5pX21vZGUgJiBTX0lTR0lEKSB7Ci0JCS8qIHNldF9naWQgYml0IGlzIHNldC4qLwotCQlyZXR1cm4gZGlyX2lub2RlLT5pX2dpZDsKLQl9Ci0JcmV0dXJuIGN1cnJlbnRfZnNnaWQoKTsKLX0KLQotLyoqCi0gKiB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZSAtIGhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGRlbnRyeSBmcm9tCi0gKiBkaXIgaW5vZGUuCi0gKgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLQotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JLyogRGlyZWN0b3J5IHNob3VsZCBoYXZlIG9ubHkgb25lIGVudHJ5LiAqLwotCUJVR19PTihTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFsaXN0X2lzX3Npbmd1bGFyKCZpbm9kZS0+aV9kZW50cnkpKTsKLQlkZW50cnkgPSBsaXN0X2VudHJ5KGlub2RlLT5pX2RlbnRyeS5uZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JcmV0dXJuIGRlbnRyeTsKLX0KLQotLyoqCiAgKiB2OWZzX2dldF9pbm9kZSAtIGhlbHBlciBmdW5jdGlvbiB0byBzZXR1cCBhbiBpbm9kZQogICogQHNiOiBzdXBlcmJsb2NrCiAgKiBAbW9kZTogbW9kZSB0byBzZXR1cCBpbm9kZSB3aXRoCkBAIC00NTQsNyArNDEyLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgc3RydWN0IGlub2RlICoKK3N0cnVjdCBpbm9kZSAqCiB2OWZzX2lub2RlKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCBwOV9maWQgKmZpZCwKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpAQCAtNDg5LDYwICs0NDcsNiBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgotdjlmc19pbm9kZV9kb3RsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCBwOV9maWQgKmZpZCwKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXN0cnVjdCBpbm9kZSAqcmV0ID0gTlVMTDsKLQlpbnQgZXJyOwotCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0OwotCi0Jc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQkFTSUMpOwotCWlmIChJU19FUlIoc3QpKQotCQlyZXR1cm4gRVJSX0NBU1Qoc3QpOwotCi0JcmV0ID0gdjlmc19nZXRfaW5vZGUoc2IsIHN0LT5zdF9tb2RlKTsKLQlpZiAoSVNfRVJSKHJldCkpIHsKLQkJZXJyID0gUFRSX0VSUihyZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCByZXQpOwotCXJldC0+aV9pbm8gPSB2OWZzX3FpZDJpbm8oJnN0LT5xaWQpOwotI2lmZGVmIENPTkZJR185UF9GU0NBQ0hFCi0Jdjlmc192Y29va2llX3NldF9xaWQocmV0LCAmc3QtPnFpZCk7Ci0Jdjlmc19jYWNoZV9pbm9kZV9nZXRfY29va2llKHJldCk7Ci0jZW5kaWYKLQllcnIgPSB2OWZzX2dldF9hY2wocmV0LCBmaWQpOwotCWlmIChlcnIpIHsKLQkJaXB1dChyZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQlrZnJlZShzdCk7Ci0JcmV0dXJuIHJldDsKLWVycm9yOgotCWtmcmVlKHN0KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKioKLSAqIHY5ZnNfaW5vZGVfZnJvbV9maWQgLSBIZWxwZXIgcm91dGluZSB0byBwb3B1bGF0ZSBhbiBpbm9kZSBieQotICogaXNzdWluZyBhIGF0dHJpYnV0ZSByZXF1ZXN0Ci0gKiBAdjlzZXM6IHNlc3Npb24gaW5mb3JtYXRpb24KLSAqIEBmaWQ6IGZpZCB0byBpc3N1ZSBhdHRyaWJ1dGUgcmVxdWVzdCBmb3IKLSAqIEBzYjogc3VwZXJibG9jayBvbiB3aGljaCB0byBjcmVhdGUgaW5vZGUKLSAqCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICoKLXY5ZnNfaW5vZGVfZnJvbV9maWQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAotCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlpZiAodjlmc19wcm90b19kb3RsKHY5c2VzKSkKLQkJcmV0dXJuIHY5ZnNfaW5vZGVfZG90bCh2OXNlcywgZmlkLCBzYik7Ci0JZWxzZQotCQlyZXR1cm4gdjlmc19pbm9kZSh2OXNlcywgZmlkLCBzYik7Ci19Ci0KIC8qKgogICogdjlmc19yZW1vdmUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgZGVsZXRlZApAQCAtNjMzLDEyICs1MzcsNiBAQAogCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0KLQlpZiAodjlzZXMtPmNhY2hlKQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfY2FjaGVkX2RlbnRyeV9vcGVyYXRpb25zKTsKLQllbHNlCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19kZW50cnlfb3BlcmF0aW9ucyk7Ci0KIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7CiAJaWYgKGVyciA8IDApCkBAIC02NTcsMTQ0ICs1NTUsNiBAQAogfQogCiAvKioKLSAqIHY5ZnNfdmZzX2NyZWF0ZV9kb3RsIC0gVkZTIGhvb2sgdG8gY3JlYXRlIGZpbGVzIGZvciA5UDIwMDAuTCBwcm90b2NvbC4KLSAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQKLSAqIEBkZW50cnk6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCi0gKiBAbW9kZTogY3JlYXRlIHBlcm1pc3Npb25zCi0gKiBAbmQ6IHBhdGggaW5mb3JtYXRpb24KLSAqCi0gKi8KLQotc3RhdGljIGludAotdjlmc192ZnNfY3JlYXRlX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9tb2RlLAotCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlpbnQgZXJyID0gMDsKLQljaGFyICpuYW1lID0gTlVMTDsKLQlnaWRfdCBnaWQ7Ci0JaW50IGZsYWdzOwotCW1vZGVfdCBtb2RlOwotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7Ci0Jc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTDsKLQlzdHJ1Y3QgcDlfZmlkICpkZmlkLCAqb2ZpZDsKLQlzdHJ1Y3QgZmlsZSAqZmlscDsKLQlzdHJ1Y3QgcDlfcWlkIHFpZDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMLCAqZGFjbCA9IE5VTEw7Ci0KLQl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKLQlpZiAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX09QRU4pCi0JCWZsYWdzID0gbmQtPmludGVudC5vcGVuLmZsYWdzIC0gMTsKLQllbHNlIHsKLQkJLyoKLQkJICogY3JlYXRlIGNhbGwgd2l0aG91dCBMT09LVVBfT1BFTiBpcyBkdWUKLQkJICogdG8gbWtub2Qgb2YgcmVndWxhciBmaWxlcy4gU28gdXNlIG1rbm9kCi0JCSAqIG9wZXJhdGlvbi4KLQkJICovCi0JCXJldHVybiB2OWZzX3Zmc19ta25vZF9kb3RsKGRpciwgZGVudHJ5LCBvbW9kZSwgMCk7Ci0JfQotCi0JbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJ2OWZzX3Zmc19jcmVhdGVfZG90bDogbmFtZTolcyBmbGFnczoweCV4ICIKLQkJCSJtb2RlOjB4JXhcbiIsIG5hbWUsIGZsYWdzLCBvbW9kZSk7Ci0KLQlkZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeS0+ZF9wYXJlbnQpOwotCWlmIChJU19FUlIoZGZpZCkpIHsKLQkJZXJyID0gUFRSX0VSUihkZmlkKTsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBjbG9uZSBhIGZpZCB0byB1c2UgZm9yIGNyZWF0aW9uICovCi0Jb2ZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDAsIE5VTEwsIDEpOwotCWlmIChJU19FUlIob2ZpZCkpIHsKLQkJZXJyID0gUFRSX0VSUihvZmlkKTsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZ2lkID0gdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShkaXIpOwotCi0JbW9kZSA9IG9tb2RlOwotCS8qIFVwZGF0ZSBtb2RlIGJhc2VkIG9uIEFDTCB2YWx1ZSAqLwotCWVyciA9IHY5ZnNfYWNsX21vZGUoZGlyLCAmbW9kZSwgJmRhY2wsICZwYWNsKTsKLQlpZiAoZXJyKSB7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAotCQkJICAgIkZhaWxlZCB0byBnZXQgYWNsIHZhbHVlcyBpbiBjcmVhdCAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZXJyID0gcDlfY2xpZW50X2NyZWF0ZV9kb3RsKG9maWQsIG5hbWUsIGZsYWdzLCBtb2RlLCBnaWQsICZxaWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAotCQkJCSJwOV9jbGllbnRfb3Blbl9kb3RsIGZhaWxlZCBpbiBjcmVhdCAlZFxuIiwKLQkJCQllcnIpOwotCQlnb3RvIGVycm9yOwotCX0KLQkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLwotCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUgfHwKLQkgICAgKG5kICYmIG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSkgewotCQlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7Ci0JCWlmIChJU19FUlIoZmlkKSkgewotCQkJZXJyID0gUFRSX0VSUihmaWQpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsCi0JCQkJZXJyKTsKLQkJCWZpZCA9IE5VTEw7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaW5vZGUgPSB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLAotCQkJCWVycik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCS8qIFRoZSBmaWQgd291bGQgZ2V0IGNsdW5rZWQgdmlhIGEgZHB1dCAqLwotCQlmaWQgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE5vdCBpbiBjYWNoZWQgbW9kZS4gTm8gbmVlZCB0byBwb3B1bGF0ZQotCQkgKiBpbm9kZSB3aXRoIHN0YXQuIFdlIG5lZWQgdG8gZ2V0IGFuIGlub2RlCi0JCSAqIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgYWNsIHdpdGggZGVudHJ5Ci0JCSAqLwotCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2RlbnRyeV9vcGVyYXRpb25zKTsKLQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQl9Ci0JLyogTm93IHNldCB0aGUgQUNMIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlICovCi0Jdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksIGRhY2wsIHBhY2wpOwotCi0JLyogaWYgd2UgYXJlIG9wZW5pbmcgYSBmaWxlLCBhc3NpZ24gdGhlIG9wZW4gZmlkIHRvIHRoZSBmaWxlICovCi0JaWYgKG5kICYmIG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSB7Ci0JCWZpbHAgPSBsb29rdXBfaW5zdGFudGlhdGVfZmlscChuZCwgZGVudHJ5LCBnZW5lcmljX2ZpbGVfb3Blbik7Ci0JCWlmIChJU19FUlIoZmlscCkpIHsKLQkJCXA5X2NsaWVudF9jbHVuayhvZmlkKTsKLQkJCXJldHVybiBQVFJfRVJSKGZpbHApOwotCQl9Ci0JCWZpbHAtPnByaXZhdGVfZGF0YSA9IG9maWQ7Ci0JfSBlbHNlCi0JCXA5X2NsaWVudF9jbHVuayhvZmlkKTsKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQlpZiAob2ZpZCkKLQkJcDlfY2xpZW50X2NsdW5rKG9maWQpOwotCWlmIChmaWQpCi0JCXA5X2NsaWVudF9jbHVuayhmaWQpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgogICogdjlmc192ZnNfY3JlYXRlIC0gVkZTIGhvb2sgdG8gY3JlYXRlIGZpbGVzCiAgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBjcmVhdGVkCiAgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZApAQCAtODg0LDEwNyArNjQ0LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0KLS8qKgotICogdjlmc192ZnNfbWtkaXJfZG90bCAtIFZGUyBta2RpciBob29rIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeQotICogQGRpcjogIGlub2RlIHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKLSAqIEBkZW50cnk6IGRlbnRyeSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCi0gKiBAbW9kZTogbW9kZSBmb3IgbmV3IGRpcmVjdG9yeQotICoKLSAqLwotCi1zdGF0aWMgaW50IHY5ZnNfdmZzX21rZGlyX2RvdGwoc3RydWN0IGlub2RlICpkaXIsCi0JCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb21vZGUpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwotCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKLQlnaWRfdCBnaWQ7Ci0JY2hhciAqbmFtZTsKLQltb2RlX3QgbW9kZTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBwOV9xaWQgcWlkOwotCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqZGFjbCA9IE5VTEwsICpwYWNsID0gTlVMTDsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAibmFtZSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JZXJyID0gMDsKLQl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKLQotCW9tb2RlIHw9IFNfSUZESVI7Ci0JaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKLQkJb21vZGUgfD0gU19JU0dJRDsKLQotCWRpcl9kZW50cnkgPSB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShkaXIpOwotCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGlyX2RlbnRyeSk7Ci0JaWYgKElTX0VSUihkZmlkKSkgewotCQllcnIgPSBQVFJfRVJSKGRmaWQpOwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlkZmlkID0gTlVMTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7Ci0JbW9kZSA9IG9tb2RlOwotCS8qIFVwZGF0ZSBtb2RlIGJhc2VkIG9uIEFDTCB2YWx1ZSAqLwotCWVyciA9IHY5ZnNfYWNsX21vZGUoZGlyLCAmbW9kZSwgJmRhY2wsICZwYWNsKTsKLQlpZiAoZXJyKSB7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAotCQkJICAgIkZhaWxlZCB0byBnZXQgYWNsIHZhbHVlcyBpbiBta2RpciAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JZXJyID0gcDlfY2xpZW50X21rZGlyX2RvdGwoZGZpZCwgbmFtZSwgbW9kZSwgZ2lkLCAmcWlkKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJvcjsKLQotCS8qIGluc3RhbnRpYXRlIGlub2RlIGFuZCBhc3NpZ24gdGhlIHVub3BlbmVkIGZpZCB0byB0aGUgZGVudHJ5ICovCi0JaWYgKHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9MT09TRSB8fCB2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfRlNDQUNIRSkgewotCQlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7Ci0JCWlmIChJU19FUlIoZmlkKSkgewotCQkJZXJyID0gUFRSX0VSUihmaWQpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsCi0JCQkJZXJyKTsKLQkJCWZpZCA9IE5VTEw7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJaW5vZGUgPSB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLAotCQkJCWVycik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWZpZCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlCi0JCSAqIGlub2RlIHdpdGggc3RhdC4gV2UgbmVlZCB0byBnZXQgYW4gaW5vZGUKLQkJICogc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBhY2wgd2l0aCBkZW50cnkKLQkJICovCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCX0KLQkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7Ci0KLWVycm9yOgotCWlmIChmaWQpCi0JCXA5X2NsaWVudF9jbHVuayhmaWQpOwotCXJldHVybiBlcnI7Ci19Ci0KIC8qKgogICogdjlmc192ZnNfbG9va3VwIC0gVkZTIGxvb2t1cCBob29rIHRvICJ3YWxrIiB0byBhIG5ldyBpbm9kZQogICogQGRpcjogIGlub2RlIHRoYXQgaXMgYmVpbmcgd2Fsa2VkIGZyb20KQEAgLTk5Myw3ICs2NTIsNyBAQAogICoKICAqLwogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqdjlmc192ZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCitzdHJ1Y3QgZGVudHJ5ICp2OWZzX3Zmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuYW1laWRhdGEpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKQEAgLTEwNDAsMTEgKzY5OSw2IEBACiAJCWdvdG8gZXJyb3JfaXB1dDsKIAogaW5zdF9vdXQ6Ci0JaWYgKHY5c2VzLT5jYWNoZSkKLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2NhY2hlZF9kZW50cnlfb3BlcmF0aW9ucyk7Ci0JZWxzZQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiAKQEAgLTEwNjMsNyArNzE3LDcgQEAKICAqCiAgKi8KIAotc3RhdGljIGludCB2OWZzX3Zmc191bmxpbmsoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKQoraW50IHY5ZnNfdmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBkZW50cnkgKmQpCiB7CiAJcmV0dXJuIHY5ZnNfcmVtb3ZlKGksIGQsIDApOwogfQpAQCAtMTA3NSw3ICs3MjksNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50IHY5ZnNfdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKK2ludCB2OWZzX3Zmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBkZW50cnkgKmQpCiB7CiAJcmV0dXJuIHY5ZnNfcmVtb3ZlKGksIGQsIDEpOwogfQpAQCAtMTA4OSw3ICs3NDMsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50CitpbnQKIHY5ZnNfdmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCiAJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKIHsKQEAgLTExOTYsNDIgKzg1MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXY5ZnNfdmZzX2dldGF0dHJfZG90bChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkgc3RydWN0IGtzdGF0ICpzdGF0KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQ7Ci0Jc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7Ci0KLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImRlbnRyeTogJXBcbiIsIGRlbnRyeSk7Ci0JZXJyID0gLUVQRVJNOwotCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkZW50cnktPmRfaW5vZGUpOwotCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpCi0JCXJldHVybiBzaW1wbGVfZ2V0YXR0cihtbnQsIGRlbnRyeSwgc3RhdCk7Ci0KLQlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKLQlpZiAoSVNfRVJSKGZpZCkpCi0JCXJldHVybiBQVFJfRVJSKGZpZCk7Ci0KLQkvKiBBc2sgZm9yIGFsbCB0aGUgZmllbGRzIGluIHN0YXQgc3RydWN0dXJlLiBTZXJ2ZXIgd2lsbCByZXR1cm4KLQkgKiB3aGF0ZXZlciBpdCBzdXBwb3J0cwotCSAqLwotCi0Jc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQUxMKTsKLQlpZiAoSVNfRVJSKHN0KSkKLQkJcmV0dXJuIFBUUl9FUlIoc3QpOwotCi0Jdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIGRlbnRyeS0+ZF9pbm9kZSk7Ci0JZ2VuZXJpY19maWxsYXR0cihkZW50cnktPmRfaW5vZGUsIHN0YXQpOwotCS8qIENoYW5nZSBibG9jayBzaXplIHRvIHdoYXQgdGhlIHNlcnZlciByZXR1cm5lZCAqLwotCXN0YXQtPmJsa3NpemUgPSBzdC0+c3RfYmxrc2l6ZTsKLQotCWtmcmVlKHN0KTsKLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKiB2OWZzX3Zmc19zZXRhdHRyIC0gc2V0IGZpbGUgbWV0YWRhdGEKICAqIEBkZW50cnk6IGZpbGUgd2hvc2UgbWV0YWRhdGEgdG8gc2V0CkBAIC0xMjkxLDY0ICs5MDksNiBAQAogfQogCiAvKioKLSAqIHY5ZnNfdmZzX3NldGF0dHJfZG90bCAtIHNldCBmaWxlIG1ldGFkYXRhCi0gKiBAZGVudHJ5OiBmaWxlIHdob3NlIG1ldGFkYXRhIHRvIHNldAotICogQGlhdHRyOiBtZXRhZGF0YSBhc3NpZ25tZW50IHN0cnVjdHVyZQotICoKLSAqLwotCi1pbnQgdjlmc192ZnNfc2V0YXR0cl9kb3RsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKLXsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7Ci0Jc3RydWN0IHA5X2ZpZCAqZmlkOwotCXN0cnVjdCBwOV9pYXR0cl9kb3RsIHA5YXR0cjsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiXG4iKTsKLQotCXJldHZhbCA9IGlub2RlX2NoYW5nZV9vayhkZW50cnktPmRfaW5vZGUsIGlhdHRyKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JcDlhdHRyLnZhbGlkID0gaWF0dHItPmlhX3ZhbGlkOwotCXA5YXR0ci5tb2RlID0gaWF0dHItPmlhX21vZGU7Ci0JcDlhdHRyLnVpZCA9IGlhdHRyLT5pYV91aWQ7Ci0JcDlhdHRyLmdpZCA9IGlhdHRyLT5pYV9naWQ7Ci0JcDlhdHRyLnNpemUgPSBpYXR0ci0+aWFfc2l6ZTsKLQlwOWF0dHIuYXRpbWVfc2VjID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKLQlwOWF0dHIuYXRpbWVfbnNlYyA9IGlhdHRyLT5pYV9hdGltZS50dl9uc2VjOwotCXA5YXR0ci5tdGltZV9zZWMgPSBpYXR0ci0+aWFfbXRpbWUudHZfc2VjOwotCXA5YXR0ci5tdGltZV9uc2VjID0gaWF0dHItPmlhX210aW1lLnR2X25zZWM7Ci0KLQlyZXR2YWwgPSAtRVBFUk07Ci0JdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRlbnRyeS0+ZF9pbm9kZSk7Ci0JZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7Ci0JaWYgKElTX0VSUihmaWQpKQotCQlyZXR1cm4gUFRSX0VSUihmaWQpOwotCi0JcmV0dmFsID0gcDlfY2xpZW50X3NldGF0dHIoZmlkLCAmcDlhdHRyKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCWlmICgoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAmJgotCSAgICBpYXR0ci0+aWFfc2l6ZSAhPSBpX3NpemVfcmVhZChkZW50cnktPmRfaW5vZGUpKSB7Ci0JCXJldHZhbCA9IHZtdHJ1bmNhdGUoZGVudHJ5LT5kX2lub2RlLCBpYXR0ci0+aWFfc2l6ZSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXNldGF0dHJfY29weShkZW50cnktPmRfaW5vZGUsIGlhdHRyKTsKLQltYXJrX2lub2RlX2RpcnR5KGRlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgewotCQkvKiBXZSBhbHNvIHdhbnQgdG8gdXBkYXRlIEFDTCB3aGVuIHdlIHVwZGF0ZSBtb2RlIGJpdHMgKi8KLQkJcmV0dmFsID0gdjlmc19hY2xfY2htb2QoZGVudHJ5KTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiB2OWZzX3N0YXQyaW5vZGUgLSBwb3B1bGF0ZSBhbiBpbm9kZSBzdHJ1Y3R1cmUgd2l0aCBtaXN0YXQgaW5mbwogICogQHN0YXQ6IFBsYW4gOSBtZXRhZGF0YSAobWlzdGF0KSBzdHJ1Y3R1cmUKICAqIEBpbm9kZTogaW5vZGUgdG8gcG9wdWxhdGUKQEAgLTE0MjYsNzcgKzk4Niw2IEBACiB9CiAKIC8qKgotICogdjlmc19zdGF0Mmlub2RlX2RvdGwgLSBwb3B1bGF0ZSBhbiBpbm9kZSBzdHJ1Y3R1cmUgd2l0aCBzdGF0IGluZm8KLSAqIEBzdGF0OiBzdGF0IHN0cnVjdHVyZQotICogQGlub2RlOiBpbm9kZSB0byBwb3B1bGF0ZQotICogQHNiOiBzdXBlcmJsb2NrIG9mIGZpbGVzeXN0ZW0KLSAqCi0gKi8KLQotdm9pZAotdjlmc19zdGF0Mmlub2RlX2RvdGwoc3RydWN0IHA5X3N0YXRfZG90bCAqc3RhdCwgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQotCWlmICgoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19CQVNJQykgPT0gUDlfU1RBVFNfQkFTSUMpIHsKLQkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc3RhdC0+c3RfYXRpbWVfc2VjOwotCQlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gc3RhdC0+c3RfYXRpbWVfbnNlYzsKLQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc3RhdC0+c3RfbXRpbWVfc2VjOwotCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gc3RhdC0+c3RfbXRpbWVfbnNlYzsKLQkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc3RhdC0+c3RfY3RpbWVfc2VjOwotCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKLQkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOwotCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7Ci0JCWlub2RlLT5pX25saW5rID0gc3RhdC0+c3Rfbmxpbms7Ci0JCWlub2RlLT5pX21vZGUgPSBzdGF0LT5zdF9tb2RlOwotCQlpbm9kZS0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoc3RhdC0+c3RfcmRldik7Ci0KLQkJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fCAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkpCi0JCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX3JkZXYpOwotCi0JCWlfc2l6ZV93cml0ZShpbm9kZSwgc3RhdC0+c3Rfc2l6ZSk7Ci0JCWlub2RlLT5pX2Jsb2NrcyA9IHN0YXQtPnN0X2Jsb2NrczsKLQl9IGVsc2UgewotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19BVElNRSkgewotCQkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc3RhdC0+c3RfYXRpbWVfc2VjOwotCQkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2F0aW1lX25zZWM7Ci0JCX0KLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTVRJTUUpIHsKLQkJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPnN0X210aW1lX3NlYzsKLQkJCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9tdGltZV9uc2VjOwotCQl9Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0NUSU1FKSB7Ci0JCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzdGF0LT5zdF9jdGltZV9zZWM7Ci0JCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKLQkJfQotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19VSUQpCi0JCQlpbm9kZS0+aV91aWQgPSBzdGF0LT5zdF91aWQ7Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dJRCkKLQkJCWlub2RlLT5pX2dpZCA9IHN0YXQtPnN0X2dpZDsKLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTkxJTkspCi0JCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOwotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19NT0RFKSB7Ci0JCQlpbm9kZS0+aV9tb2RlID0gc3RhdC0+c3RfbW9kZTsKLQkJCWlmICgoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgfHwKLQkJCQkJCShTX0lTQ0hSKGlub2RlLT5pX21vZGUpKSkKLQkJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCi0JCQkJCQkJCWlub2RlLT5pX3JkZXYpOwotCQl9Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX1JERVYpCi0JCQlpbm9kZS0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoc3RhdC0+c3RfcmRldik7Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX1NJWkUpCi0JCQlpX3NpemVfd3JpdGUoaW5vZGUsIHN0YXQtPnN0X3NpemUpOwotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19CTE9DS1MpCi0JCQlpbm9kZS0+aV9ibG9ja3MgPSBzdGF0LT5zdF9ibG9ja3M7Ci0JfQotCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dFTikKLQkJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzdGF0LT5zdF9nZW47Ci0KLQkvKiBDdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBQOV9TVEFUU19CVElNRSBhbmQgUDlfU1RBVFNfREFUQV9WRVJTSU9OCi0JICogYmVjYXVzZSB0aGUgaW5vZGUgc3RydWN0dXJlIGRvZXMgbm90IGhhdmUgZmllbGRzIGZvciB0aGVtLgotCSAqLwotfQotCi0vKioKICAqIHY5ZnNfcWlkMmlubyAtIGNvbnZlcnQgcWlkIGludG8gaW5vZGUgbnVtYmVyCiAgKiBAcWlkOiBxaWQgdG8gaGFzaAogICoKQEAgLTE2MDIsNyArMTA5MSw3IEBACiAgKgogICovCiAKLXN0YXRpYyB2b2lkCit2b2lkCiB2OWZzX3Zmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kLCB2b2lkICpwKQogewogCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7CkBAIC0xNjQ2LDk0ICsxMTM1LDYgQEAKIH0KIAogLyoqCi0gKiB2OWZzX3Zmc19zeW1saW5rX2RvdGwgLSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHN5bWxpbmtzCi0gKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgY29udGFpbmluZyBzeW1saW5rCi0gKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKLSAqIEBzeW1uYW1lOiBzeW1saW5rIGRhdGEKLSAqCi0gKiBTZWUgQWxzbzogOVAyMDAwLkwgUkZDIGZvciBtb3JlIGluZm9ybWF0aW9uCi0gKgotICovCi0KLXN0YXRpYyBpbnQKLXY5ZnNfdmZzX3N5bWxpbmtfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQljb25zdCBjaGFyICpzeW1uYW1lKQotewotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7Ci0Jc3RydWN0IHA5X2ZpZCAqZGZpZDsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IHA5X3FpZCBxaWQ7Ci0JY2hhciAqbmFtZTsKLQlpbnQgZXJyOwotCWdpZF90IGdpZDsKLQotCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOwotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAidjlmc192ZnNfc3ltbGlua19kb3RsIDogJWx1LCVzLCVzXG4iLAotCQkJZGlyLT5pX2lubywgbmFtZSwgc3ltbmFtZSk7Ci0JdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7Ci0KLQlkZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeS0+ZF9wYXJlbnQpOwotCWlmIChJU19FUlIoZGZpZCkpIHsKLQkJZXJyID0gUFRSX0VSUihkZmlkKTsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7Ci0KLQkvKiBTZXJ2ZXIgZG9lc24ndCBhbHRlciBmaWQgb24gVFNZTUxJTksuIEhlbmNlIG5vIG5lZWQgdG8gY2xvbmUgaXQuICovCi0JZXJyID0gcDlfY2xpZW50X3N5bWxpbmsoZGZpZCwgbmFtZSwgKGNoYXIgKilzeW1uYW1lLCBnaWQsICZxaWQpOwotCi0JaWYgKGVyciA8IDApIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfc3ltbGluayBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWYgKHY5c2VzLT5jYWNoZSkgewotCQkvKiBOb3cgd2FsayBmcm9tIHRoZSBwYXJlbnQgc28gd2UgY2FuIGdldCBhbiB1bm9wZW5lZCBmaWQuICovCi0JCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKLQkJaWYgKElTX0VSUihmaWQpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGZpZCk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKLQkJCQkJZXJyKTsKLQkJCWZpZCA9IE5VTEw7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0KLQkJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIGRlbnRyeSAqLwotCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCi0JCQkJCWVycik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWZpZCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJLyogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlIGlub2RlIHdpdGggc3RhdCAqLwotCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgU19JRkxOSyk7Ci0JCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2RlbnRyeV9vcGVyYXRpb25zKTsKLQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQl9Ci0KLWVycm9yOgotCWlmIChmaWQpCi0JCXA5X2NsaWVudF9jbHVuayhmaWQpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoqCiAgKiB2OWZzX3Zmc19zeW1saW5rIC0gaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzeW1saW5rcwogICogQGRpcjogZGlyZWN0b3J5IGlub2RlIGNvbnRhaW5pbmcgc3ltbGluawogICogQGRlbnRyeTogZGVudHJ5IGZvciBzeW1saW5rCkBAIC0xNzkyLDc3ICsxMTkzLDYgQEAKIH0KIAogLyoqCi0gKiB2OWZzX3Zmc19saW5rX2RvdGwgLSBjcmVhdGUgYSBoYXJkbGluayBmb3IgZG90bAotICogQG9sZF9kZW50cnk6IGRlbnRyeSBmb3IgZmlsZSB0byBsaW5rIHRvCi0gKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKLSAqIEBkZW50cnk6IGRlbnRyeSBmb3IgbGluawotICoKLSAqLwotCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19saW5rX2RvdGwoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCi0JCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBwOV9maWQgKmRmaWQsICpvbGRmaWQ7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwotCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7Ci0KLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImRpciBpbm86ICVsdSwgb2xkX25hbWU6ICVzLCBuZXdfbmFtZTogJXNcbiIsCi0JCQlkaXItPmlfaW5vLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCi0JdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7Ci0JZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7Ci0JZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKLQlpZiAoSVNfRVJSKGRmaWQpKQotCQlyZXR1cm4gUFRSX0VSUihkZmlkKTsKLQotCW9sZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5KTsKLQlpZiAoSVNfRVJSKG9sZGZpZCkpCi0JCXJldHVybiBQVFJfRVJSKG9sZGZpZCk7Ci0KLQluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKLQotCWVyciA9IHA5X2NsaWVudF9saW5rKGRmaWQsIG9sZGZpZCwgKGNoYXIgKilkZW50cnktPmRfbmFtZS5uYW1lKTsKLQotCWlmIChlcnIgPCAwKSB7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X2xpbmsgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKLQkJLyogR2V0IHRoZSBsYXRlc3Qgc3RhdCBpbmZvIGZyb20gc2VydmVyLiAqLwotCQlzdHJ1Y3QgcDlfZmlkICpmaWQ7Ci0JCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0OwotCi0JCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5KTsKLQkJaWYgKElTX0VSUihmaWQpKQotCQkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKLQotCQlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7Ci0JCWlmIChJU19FUlIoc3QpKQotCQkJcmV0dXJuIFBUUl9FUlIoc3QpOwotCi0JCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKLQotCQlrZnJlZShzdCk7Ci0JfSBlbHNlIHsKLQkJLyogQ2FjaGluZyBkaXNhYmxlZC4gTm8gbmVlZCB0byBnZXQgdXB0byBkYXRlIHN0YXQgaW5mby4KLQkJICogVGhpcyBkZW50cnkgd2lsbCBiZSByZWxlYXNlZCBpbW1lZGlhdGVseS4gU28sIGp1c3QgaG9sZCB0aGUKLQkJICogaW5vZGUKLQkJICovCi0JCWlob2xkKG9sZF9kZW50cnktPmRfaW5vZGUpOwotCX0KLQotCWRfc2V0X2Rfb3AoZGVudHJ5LCBvbGRfZGVudHJ5LT5kX29wKTsKLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioKICAqIHY5ZnNfdmZzX21rbm9kIC0gY3JlYXRlIGEgc3BlY2lhbCBmaWxlCiAgKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKICAqIEBkZW50cnk6IGRlbnRyeSBmb3IgZmlsZQpAQCAtMTkwNywxNjAgKzEyMzcsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLS8qKgotICogdjlmc192ZnNfbWtub2RfZG90bCAtIGNyZWF0ZSBhIHNwZWNpYWwgZmlsZQotICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCi0gKiBAZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUKLSAqIEBtb2RlOiBtb2RlIGZvciBjcmVhdGlvbgotICogQHJkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lhbCBmaWxlCi0gKgotICovCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19ta25vZF9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSwKLQkJZGV2X3QgcmRldikKLXsKLQlpbnQgZXJyOwotCWNoYXIgKm5hbWU7Ci0JbW9kZV90IG1vZGU7Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMLCAqZGZpZCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlnaWRfdCBnaWQ7Ci0Jc3RydWN0IHA5X3FpZCBxaWQ7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeTsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpkYWNsID0gTlVMTCwgKnBhY2wgPSBOVUxMOwotCi0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCi0JCSIgJWx1LCVzIG1vZGU6ICV4IE1BSk9SOiAldSBNSU5PUjogJXVcbiIsIGRpci0+aV9pbm8sCi0JCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIG9tb2RlLCBNQUpPUihyZGV2KSwgTUlOT1IocmRldikpOwotCi0JaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwotCWRpcl9kZW50cnkgPSB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShkaXIpOwotCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGlyX2RlbnRyeSk7Ci0JaWYgKElTX0VSUihkZmlkKSkgewotCQllcnIgPSBQVFJfRVJSKGRmaWQpOwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlkZmlkID0gTlVMTDsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7Ci0JbW9kZSA9IG9tb2RlOwotCS8qIFVwZGF0ZSBtb2RlIGJhc2VkIG9uIEFDTCB2YWx1ZSAqLwotCWVyciA9IHY5ZnNfYWNsX21vZGUoZGlyLCAmbW9kZSwgJmRhY2wsICZwYWNsKTsKLQlpZiAoZXJyKSB7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAotCQkJICAgIkZhaWxlZCB0byBnZXQgYWNsIHZhbHVlcyBpbiBta25vZCAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0KLQllcnIgPSBwOV9jbGllbnRfbWtub2RfZG90bChkZmlkLCBuYW1lLCBtb2RlLCByZGV2LCBnaWQsICZxaWQpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KLQlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7Ci0JCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKLQkJaWYgKElTX0VSUihmaWQpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGZpZCk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKLQkJCQllcnIpOwotCQkJZmlkID0gTlVMTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCi0JCQkJZXJyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2NhY2hlZF9kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJZmlkID0gTlVMTDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBOb3QgaW4gY2FjaGVkIG1vZGUuIE5vIG5lZWQgdG8gcG9wdWxhdGUgaW5vZGUgd2l0aCBzdGF0LgotCQkgKiBzb2NrZXQgc3lzY2FsbCByZXR1cm5zIGEgZmQsIHNvIHdlIG5lZWQgaW5zdGFudGlhdGUKLQkJICovCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCX0KLQkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7Ci1lcnJvcjoKLQlpZiAoZmlkKQotCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19yZWFkbGlua19kb3RsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQotewotCWludCByZXR2YWw7Ci0Jc3RydWN0IHA5X2ZpZCAqZmlkOwotCWNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIiAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0JcmV0dmFsID0gLUVQRVJNOwotCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnkpOwotCWlmIChJU19FUlIoZmlkKSkKLQkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKLQotCXJldHZhbCA9IHA5X2NsaWVudF9yZWFkbGluayhmaWQsICZ0YXJnZXQpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOwotCi0Jc3RybmNweShidWZmZXIsIHRhcmdldCwgYnVmbGVuKTsKLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIiVzIC0+ICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLCBidWZmZXIpOwotCi0JcmV0dmFsID0gc3RybmxlbihidWZmZXIsIGJ1Zmxlbik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiB2OWZzX3Zmc19mb2xsb3dfbGlua19kb3RsIC0gZm9sbG93IGEgc3ltbGluayBwYXRoCi0gKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKLSAqIEBuZDogbmFtZWlkYXRhCi0gKgotICovCi0KLXN0YXRpYyB2b2lkICoKLXY5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlpbnQgbGVuID0gMDsKLQljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7Ci0KLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIiVzIG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQotCWlmICghbGluaykKLQkJbGluayA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JZWxzZSB7Ci0JCWxlbiA9IHY5ZnNfdmZzX3JlYWRsaW5rX2RvdGwoZGVudHJ5LCBsaW5rLCBQQVRIX01BWCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQlfX3B1dG5hbWUobGluayk7Ci0JCQlsaW5rID0gRVJSX1BUUihsZW4pOwotCQl9IGVsc2UKLQkJCWxpbmtbbWluKGxlbiwgUEFUSF9NQVgtMSldID0gMDsKLQl9Ci0JbmRfc2V0X2xpbmsobmQsIGxpbmspOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdHUgPSB7CiAJLmNyZWF0ZSA9IHY5ZnNfdmZzX2NyZWF0ZSwKIAkubG9va3VwID0gdjlmc192ZnNfbG9va3VwLApAQCAtMjA3NSwyNSArMTI1MSw2IEBACiAJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKLQkuY3JlYXRlID0gdjlmc192ZnNfY3JlYXRlX2RvdGwsCi0JLmxvb2t1cCA9IHY5ZnNfdmZzX2xvb2t1cCwKLQkubGluayA9IHY5ZnNfdmZzX2xpbmtfZG90bCwKLQkuc3ltbGluayA9IHY5ZnNfdmZzX3N5bWxpbmtfZG90bCwKLQkudW5saW5rID0gdjlmc192ZnNfdW5saW5rLAotCS5ta2RpciA9IHY5ZnNfdmZzX21rZGlyX2RvdGwsCi0JLnJtZGlyID0gdjlmc192ZnNfcm1kaXIsCi0JLm1rbm9kID0gdjlmc192ZnNfbWtub2RfZG90bCwKLQkucmVuYW1lID0gdjlmc192ZnNfcmVuYW1lLAotCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0cl9kb3RsLAotCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0cl9kb3RsLAotCS5zZXR4YXR0ciA9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyID0gZ2VuZXJpY19nZXR4YXR0ciwKLQkucmVtb3ZleGF0dHIgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAotCS5saXN0eGF0dHIgPSB2OWZzX2xpc3R4YXR0ciwKLQkuY2hlY2tfYWNsID0gdjlmc19jaGVja19hY2wsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkuY3JlYXRlID0gdjlmc192ZnNfY3JlYXRlLAogCS5sb29rdXAgPSB2OWZzX3Zmc19sb29rdXAsCkBAIC0yMTExLDE2ICsxMjY4LDYgQEAKIAkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKLQkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHJfZG90bCwKLQkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHJfZG90bCwKLQkuc2V0eGF0dHIgPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCi0JLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKLQkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCi0JLmNoZWNrX2FjbCA9IHY5ZnNfY2hlY2tfYWNsLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewogCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssCiAJLmZvbGxvd19saW5rID0gdjlmc192ZnNfZm9sbG93X2xpbmssCkBAIC0yMTI5LDE0ICsxMjc2LDMgQEAKIAkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKLQkucmVhZGxpbmsgPSB2OWZzX3Zmc19yZWFkbGlua19kb3RsLAotCS5mb2xsb3dfbGluayA9IHY5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwsCi0JLnB1dF9saW5rID0gdjlmc192ZnNfcHV0X2xpbmssCi0JLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCi0JLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCi0JLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAotCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCi0JLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAotfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMgYi9mcy85cC92ZnNfaW5vZGVfZG90bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2ZmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy85cC92ZnNfaW5vZGVfZG90bC5jCkBAIC0wLDAgKzEsODI0IEBACisvKgorICogIGxpbnV4L2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdmZzIGlub2RlIG9wcyBmb3IgdGhlIDlQMjAwMC5MIHByb3RvY29sLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRXJpYyBWYW4gSGVuc2JlcmdlbiA8ZXJpY3ZoQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgUm9uIE1pbm5pY2ggPHJtaW5uaWNoQGxhbmwuZ292PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG86CisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICogIEJvc3RvbiwgTUEgIDAyMTExLTEzMDEgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CisjaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgorCisjaW5jbHVkZSAidjlmcy5oIgorI2luY2x1ZGUgInY5ZnNfdmZzLmgiCisjaW5jbHVkZSAiZmlkLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCitzdGF0aWMgaW50Cit2OWZzX3Zmc19ta25vZF9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSwKKwkJICAgIGRldl90IHJkZXYpOworCisvKioKKyAqIHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBnaWQgZm9yIGNyZWF0aW5nIGEKKyAqIG5ldyBmaWxlIHN5c3RlbSBvYmplY3QuIFRoaXMgY2hlY2tzIHRoZSBTX0lTR0lEIHRvIGRldGVybWluZSB0aGUgb3duaW5nCisgKiBncm91cCBvZiB0aGUgbmV3IGZpbGUgc3lzdGVtIG9iamVjdC4KKyAqLworCitzdGF0aWMgZ2lkX3Qgdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSkKK3sKKwlCVUdfT04oZGlyX2lub2RlID09IE5VTEwpOworCisJaWYgKGRpcl9pbm9kZS0+aV9tb2RlICYgU19JU0dJRCkgeworCQkvKiBzZXRfZ2lkIGJpdCBpcyBzZXQuKi8KKwkJcmV0dXJuIGRpcl9pbm9kZS0+aV9naWQ7CisJfQorCXJldHVybiBjdXJyZW50X2ZzZ2lkKCk7Cit9CisKKy8qKgorICogdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUgLSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkZW50cnkgZnJvbQorICogZGlyIGlub2RlLgorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCS8qIERpcmVjdG9yeSBzaG91bGQgaGF2ZSBvbmx5IG9uZSBlbnRyeS4gKi8KKwlCVUdfT04oU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhbGlzdF9pc19zaW5ndWxhcigmaW5vZGUtPmlfZGVudHJ5KSk7CisJZGVudHJ5ID0gbGlzdF9lbnRyeShpbm9kZS0+aV9kZW50cnkubmV4dCwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXJldHVybiBkZW50cnk7Cit9CisKK3N0cnVjdCBpbm9kZSAqCit2OWZzX2lub2RlX2RvdGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICpyZXQgPSBOVUxMOworCWludCBlcnI7CisJc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7CisKKwlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7CisJaWYgKElTX0VSUihzdCkpCisJCXJldHVybiBFUlJfQ0FTVChzdCk7CisKKwlyZXQgPSB2OWZzX2dldF9pbm9kZShzYiwgc3QtPnN0X21vZGUpOworCWlmIChJU19FUlIocmV0KSkgeworCQllcnIgPSBQVFJfRVJSKHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIHJldCk7CisJcmV0LT5pX2lubyA9IHY5ZnNfcWlkMmlubygmc3QtPnFpZCk7CisjaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKKwl2OWZzX3Zjb29raWVfc2V0X3FpZChyZXQsICZzdC0+cWlkKTsKKwl2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUocmV0KTsKKyNlbmRpZgorCWVyciA9IHY5ZnNfZ2V0X2FjbChyZXQsIGZpZCk7CisJaWYgKGVycikgeworCQlpcHV0KHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCWtmcmVlKHN0KTsKKwlyZXR1cm4gcmV0OworZXJyb3I6CisJa2ZyZWUoc3QpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICogdjlmc192ZnNfY3JlYXRlX2RvdGwgLSBWRlMgaG9vayB0byBjcmVhdGUgZmlsZXMgZm9yIDlQMjAwMC5MIHByb3RvY29sLgorICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgY3JlYXRlZAorICogQGRlbnRyeTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQKKyAqIEBtb2RlOiBjcmVhdGUgcGVybWlzc2lvbnMKKyAqIEBuZDogcGF0aCBpbmZvcm1hdGlvbgorICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19jcmVhdGVfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb21vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBlcnIgPSAwOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWdpZF90IGdpZDsKKwlpbnQgZmxhZ3M7CisJbW9kZV90IG1vZGU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMOworCXN0cnVjdCBwOV9maWQgKmRmaWQsICpvZmlkOworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBwOV9xaWQgcWlkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCA9IE5VTEwsICpkYWNsID0gTlVMTDsKKworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCWlmIChuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikKKwkJZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgLSAxOworCWVsc2UgeworCQkvKgorCQkgKiBjcmVhdGUgY2FsbCB3aXRob3V0IExPT0tVUF9PUEVOIGlzIGR1ZQorCQkgKiB0byBta25vZCBvZiByZWd1bGFyIGZpbGVzLiBTbyB1c2UgbWtub2QKKwkJICogb3BlcmF0aW9uLgorCQkgKi8KKwkJcmV0dXJuIHY5ZnNfdmZzX21rbm9kX2RvdGwoZGlyLCBkZW50cnksIG9tb2RlLCAwKTsKKwl9CisKKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfdmZzX2NyZWF0ZV9kb3RsOiBuYW1lOiVzIGZsYWdzOjB4JXggIgorCQkJIm1vZGU6MHgleFxuIiwgbmFtZSwgZmxhZ3MsIG9tb2RlKTsKKworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7CisJaWYgKElTX0VSUihkZmlkKSkgeworCQllcnIgPSBQVFJfRVJSKGRmaWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIGNsb25lIGEgZmlkIHRvIHVzZSBmb3IgY3JlYXRpb24gKi8KKwlvZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMCwgTlVMTCwgMSk7CisJaWYgKElTX0VSUihvZmlkKSkgeworCQllcnIgPSBQVFJfRVJSKG9maWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7CisKKwltb2RlID0gb21vZGU7CisJLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCisJZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOworCWlmIChlcnIpIHsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIGNyZWF0ICVkXG4iLCBlcnIpOworCQlnb3RvIGVycm9yOworCX0KKwllcnIgPSBwOV9jbGllbnRfY3JlYXRlX2RvdGwob2ZpZCwgbmFtZSwgZmxhZ3MsIG1vZGUsIGdpZCwgJnFpZCk7CisJaWYgKGVyciA8IDApIHsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCQkJInA5X2NsaWVudF9vcGVuX2RvdGwgZmFpbGVkIGluIGNyZWF0ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KKwlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7CisJaWYgKElTX0VSUihmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsIGVycik7CisJCWZpZCA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CisJfQorCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTm93IHNldCB0aGUgQUNMIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlICovCisJdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksIGRhY2wsIHBhY2wpOworCisJLyogU2luY2Ugd2UgYXJlIG9wZW5pbmcgYSBmaWxlLCBhc3NpZ24gdGhlIG9wZW4gZmlkIHRvIHRoZSBmaWxlICovCisJZmlscCA9IGxvb2t1cF9pbnN0YW50aWF0ZV9maWxwKG5kLCBkZW50cnksIGdlbmVyaWNfZmlsZV9vcGVuKTsKKwlpZiAoSVNfRVJSKGZpbHApKSB7CisJCXA5X2NsaWVudF9jbHVuayhvZmlkKTsKKwkJcmV0dXJuIFBUUl9FUlIoZmlscCk7CisJfQorCWZpbHAtPnByaXZhdGVfZGF0YSA9IG9maWQ7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChvZmlkKQorCQlwOV9jbGllbnRfY2x1bmsob2ZpZCk7CisJaWYgKGZpZCkKKwkJcDlfY2xpZW50X2NsdW5rKGZpZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2OWZzX3Zmc19ta2Rpcl9kb3RsIC0gVkZTIG1rZGlyIGhvb2sgdG8gY3JlYXRlIGEgZGlyZWN0b3J5CisgKiBAZGlyOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQGRlbnRyeTogZGVudHJ5IHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKKyAqIEBtb2RlOiBtb2RlIGZvciBuZXcgZGlyZWN0b3J5CisgKgorICovCisKK3N0YXRpYyBpbnQgdjlmc192ZnNfbWtkaXJfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTCwgKmRmaWQgPSBOVUxMOworCWdpZF90IGdpZDsKKwljaGFyICpuYW1lOworCW1vZGVfdCBtb2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHA5X3FpZCBxaWQ7CisJc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpkYWNsID0gTlVMTCwgKnBhY2wgPSBOVUxMOworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJuYW1lICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwllcnIgPSAwOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCisJb21vZGUgfD0gU19JRkRJUjsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKQorCQlvbW9kZSB8PSBTX0lTR0lEOworCisJZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7CisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWRmaWQgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKwltb2RlID0gb21vZGU7CisJLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCisJZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOworCWlmIChlcnIpIHsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIG1rZGlyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycm9yOworCX0KKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwllcnIgPSBwOV9jbGllbnRfbWtkaXJfZG90bChkZmlkLCBuYW1lLCBtb2RlLCBnaWQsICZxaWQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7CisJCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKKwkJaWYgKElTX0VSUihmaWQpKSB7CisJCQllcnIgPSBQVFJfRVJSKGZpZCk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQkJZmlkID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCisJCQkJZXJyKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJZXJyID0gdjlmc19maWRfYWRkKGRlbnRyeSwgZmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOworCQlmaWQgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vdCBpbiBjYWNoZWQgbW9kZS4gTm8gbmVlZCB0byBwb3B1bGF0ZQorCQkgKiBpbm9kZSB3aXRoIHN0YXQuIFdlIG5lZWQgdG8gZ2V0IGFuIGlub2RlCisJCSAqIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgYWNsIHdpdGggZGVudHJ5CisJCSAqLworCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl9CisJLyogTm93IHNldCB0aGUgQUNMIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlICovCisJdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksIGRhY2wsIHBhY2wpOworCitlcnJvcjoKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit2OWZzX3Zmc19nZXRhdHRyX2RvdGwoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkZW50cnk6ICVwXG4iLCBkZW50cnkpOworCWVyciA9IC1FUEVSTTsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKQorCQlyZXR1cm4gc2ltcGxlX2dldGF0dHIobW50LCBkZW50cnksIHN0YXQpOworCisJZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7CisJaWYgKElTX0VSUihmaWQpKQorCQlyZXR1cm4gUFRSX0VSUihmaWQpOworCisJLyogQXNrIGZvciBhbGwgdGhlIGZpZWxkcyBpbiBzdGF0IHN0cnVjdHVyZS4gU2VydmVyIHdpbGwgcmV0dXJuCisJICogd2hhdGV2ZXIgaXQgc3VwcG9ydHMKKwkgKi8KKworCXN0ID0gcDlfY2xpZW50X2dldGF0dHJfZG90bChmaWQsIFA5X1NUQVRTX0FMTCk7CisJaWYgKElTX0VSUihzdCkpCisJCXJldHVybiBQVFJfRVJSKHN0KTsKKworCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCBkZW50cnktPmRfaW5vZGUpOworCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwkvKiBDaGFuZ2UgYmxvY2sgc2l6ZSB0byB3aGF0IHRoZSBzZXJ2ZXIgcmV0dXJuZWQgKi8KKwlzdGF0LT5ibGtzaXplID0gc3QtPnN0X2Jsa3NpemU7CisKKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc192ZnNfc2V0YXR0cl9kb3RsIC0gc2V0IGZpbGUgbWV0YWRhdGEKKyAqIEBkZW50cnk6IGZpbGUgd2hvc2UgbWV0YWRhdGEgdG8gc2V0CisgKiBAaWF0dHI6IG1ldGFkYXRhIGFzc2lnbm1lbnQgc3RydWN0dXJlCisgKgorICovCisKK2ludCB2OWZzX3Zmc19zZXRhdHRyX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQ7CisJc3RydWN0IHA5X2lhdHRyX2RvdGwgcDlhdHRyOworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJcbiIpOworCisJcmV0dmFsID0gaW5vZGVfY2hhbmdlX29rKGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlwOWF0dHIudmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7CisJcDlhdHRyLm1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKKwlwOWF0dHIudWlkID0gaWF0dHItPmlhX3VpZDsKKwlwOWF0dHIuZ2lkID0gaWF0dHItPmlhX2dpZDsKKwlwOWF0dHIuc2l6ZSA9IGlhdHRyLT5pYV9zaXplOworCXA5YXR0ci5hdGltZV9zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfc2VjOworCXA5YXR0ci5hdGltZV9uc2VjID0gaWF0dHItPmlhX2F0aW1lLnR2X25zZWM7CisJcDlhdHRyLm10aW1lX3NlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7CisJcDlhdHRyLm10aW1lX25zZWMgPSBpYXR0ci0+aWFfbXRpbWUudHZfbnNlYzsKKworCXJldHZhbCA9IC1FUEVSTTsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKKwlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGZpZCkpCisJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwlyZXR2YWwgPSBwOV9jbGllbnRfc2V0YXR0cihmaWQsICZwOWF0dHIpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCisJICAgIGlhdHRyLT5pYV9zaXplICE9IGlfc2l6ZV9yZWFkKGRlbnRyeS0+ZF9pbm9kZSkpIHsKKwkJcmV0dmFsID0gdm10cnVuY2F0ZShkZW50cnktPmRfaW5vZGUsIGlhdHRyLT5pYV9zaXplKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJc2V0YXR0cl9jb3B5KGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOworCW1hcmtfaW5vZGVfZGlydHkoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCS8qIFdlIGFsc28gd2FudCB0byB1cGRhdGUgQUNMIHdoZW4gd2UgdXBkYXRlIG1vZGUgYml0cyAqLworCQlyZXR2YWwgPSB2OWZzX2FjbF9jaG1vZChkZW50cnkpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHY5ZnNfc3RhdDJpbm9kZV9kb3RsIC0gcG9wdWxhdGUgYW4gaW5vZGUgc3RydWN0dXJlIHdpdGggc3RhdCBpbmZvCisgKiBAc3RhdDogc3RhdCBzdHJ1Y3R1cmUKKyAqIEBpbm9kZTogaW5vZGUgdG8gcG9wdWxhdGUKKyAqIEBzYjogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCisgKgorICovCisKK3ZvaWQKK3Y5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0YXQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisKKwlpZiAoKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQkFTSUMpID09IFA5X1NUQVRTX0JBU0lDKSB7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2F0aW1lX3NlYzsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2F0aW1lX25zZWM7CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPnN0X210aW1lX3NlYzsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X210aW1lX25zZWM7CisJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2N0aW1lX3NlYzsKKwkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2N0aW1lX25zZWM7CisJCWlub2RlLT5pX3VpZCA9IHN0YXQtPnN0X3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gc3RhdC0+c3RfZ2lkOworCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOworCQlpbm9kZS0+aV9tb2RlID0gc3RhdC0+c3RfbW9kZTsKKwkJaW5vZGUtPmlfcmRldiA9IG5ld19kZWNvZGVfZGV2KHN0YXQtPnN0X3JkZXYpOworCisJCWlmICgoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgfHwgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpKQorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9yZGV2KTsKKworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHN0YXQtPnN0X3NpemUpOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzdGF0LT5zdF9ibG9ja3M7CisJfSBlbHNlIHsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQVRJTUUpIHsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2F0aW1lX3NlYzsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9hdGltZV9uc2VjOworCQl9CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX01USU1FKSB7CisJCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzdGF0LT5zdF9tdGltZV9zZWM7CisJCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gc3RhdC0+c3RfbXRpbWVfbnNlYzsKKwkJfQorCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19DVElNRSkgeworCQkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc3RhdC0+c3RfY3RpbWVfc2VjOworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2N0aW1lX25zZWM7CisJCX0KKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfVUlEKQorCQkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX05MSU5LKQorCQkJaW5vZGUtPmlfbmxpbmsgPSBzdGF0LT5zdF9ubGluazsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTU9ERSkgeworCQkJaW5vZGUtPmlfbW9kZSA9IHN0YXQtPnN0X21vZGU7CisJCQlpZiAoKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHx8CisJCQkJCQkoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkpCisJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCQkJCQlpbm9kZS0+aV9yZGV2KTsKKwkJfQorCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19SREVWKQorCQkJaW5vZGUtPmlfcmRldiA9IG5ld19kZWNvZGVfZGV2KHN0YXQtPnN0X3JkZXYpOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19TSVpFKQorCQkJaV9zaXplX3dyaXRlKGlub2RlLCBzdGF0LT5zdF9zaXplKTsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQkxPQ0tTKQorCQkJaW5vZGUtPmlfYmxvY2tzID0gc3RhdC0+c3RfYmxvY2tzOworCX0KKwlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19HRU4pCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc3RhdC0+c3RfZ2VuOworCisJLyogQ3VycmVudGx5IHdlIGRvbid0IHN1cHBvcnQgUDlfU1RBVFNfQlRJTUUgYW5kIFA5X1NUQVRTX0RBVEFfVkVSU0lPTgorCSAqIGJlY2F1c2UgdGhlIGlub2RlIHN0cnVjdHVyZSBkb2VzIG5vdCBoYXZlIGZpZWxkcyBmb3IgdGhlbS4KKwkgKi8KK30KKworc3RhdGljIGludAordjlmc192ZnNfc3ltbGlua19kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpkZmlkOworCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcDlfcWlkIHFpZDsKKwljaGFyICpuYW1lOworCWludCBlcnI7CisJZ2lkX3QgZ2lkOworCisJbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJ2OWZzX3Zmc19zeW1saW5rX2RvdGwgOiAlbHUsJXMsJXNcbiIsCisJCQlkaXItPmlfaW5vLCBuYW1lLCBzeW1uYW1lKTsKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7CisJaWYgKElTX0VSUihkZmlkKSkgeworCQllcnIgPSBQVFJfRVJSKGRmaWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKworCS8qIFNlcnZlciBkb2Vzbid0IGFsdGVyIGZpZCBvbiBUU1lNTElOSy4gSGVuY2Ugbm8gbmVlZCB0byBjbG9uZSBpdC4gKi8KKwllcnIgPSBwOV9jbGllbnRfc3ltbGluayhkZmlkLCBuYW1lLCAoY2hhciAqKXN5bW5hbWUsIGdpZCwgJnFpZCk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF9zeW1saW5rIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAodjlzZXMtPmNhY2hlKSB7CisJCS8qIE5vdyB3YWxrIGZyb20gdGhlIHBhcmVudCBzbyB3ZSBjYW4gZ2V0IGFuIHVub3BlbmVkIGZpZC4gKi8KKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOworCQlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAorCQkJCQllcnIpOworCQkJZmlkID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gZGVudHJ5ICovCisJCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQkJZXJyKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJZXJyID0gdjlmc19maWRfYWRkKGRlbnRyeSwgZmlkKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yOworCQlmaWQgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIE5vdCBpbiBjYWNoZWQgbW9kZS4gTm8gbmVlZCB0byBwb3B1bGF0ZSBpbm9kZSB3aXRoIHN0YXQgKi8KKwkJaW5vZGUgPSB2OWZzX2dldF9pbm9kZShkaXItPmlfc2IsIFNfSUZMTkspOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJfQorCitlcnJvcjoKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogdjlmc192ZnNfbGlua19kb3RsIC0gY3JlYXRlIGEgaGFyZGxpbmsgZm9yIGRvdGwKKyAqIEBvbGRfZGVudHJ5OiBkZW50cnkgZm9yIGZpbGUgdG8gbGluayB0bworICogQGRpcjogaW5vZGUgZGVzdGluYXRpb24gZm9yIG5ldyBsaW5rCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIGxpbmsKKyAqCisgKi8KKworc3RhdGljIGludAordjlmc192ZnNfbGlua19kb3RsKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgcDlfZmlkICpkZmlkLCAqb2xkZmlkOworCWNoYXIgKm5hbWU7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJkaXIgaW5vOiAlbHUsIG9sZF9uYW1lOiAlcywgbmV3X25hbWU6ICVzXG4iLAorCQkJZGlyLT5pX2lubywgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCWRpcl9kZW50cnkgPSB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShkaXIpOworCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGlyX2RlbnRyeSk7CisJaWYgKElTX0VSUihkZmlkKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGZpZCk7CisKKwlvbGRmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSk7CisJaWYgKElTX0VSUihvbGRmaWQpKQorCQlyZXR1cm4gUFRSX0VSUihvbGRmaWQpOworCisJbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwllcnIgPSBwOV9jbGllbnRfbGluayhkZmlkLCBvbGRmaWQsIChjaGFyICopZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF9saW5rIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7CisJCS8qIEdldCB0aGUgbGF0ZXN0IHN0YXQgaW5mbyBmcm9tIHNlcnZlci4gKi8KKwkJc3RydWN0IHA5X2ZpZCAqZmlkOworCQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdDsKKworCQlmaWQgPSB2OWZzX2ZpZF9sb29rdXAob2xkX2RlbnRyeSk7CisJCWlmIChJU19FUlIoZmlkKSkKKwkJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwkJc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQkFTSUMpOworCQlpZiAoSVNfRVJSKHN0KSkKKwkJCXJldHVybiBQVFJfRVJSKHN0KTsKKworCQl2OWZzX3N0YXQyaW5vZGVfZG90bChzdCwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwkJa2ZyZWUoc3QpOworCX0gZWxzZSB7CisJCS8qIENhY2hpbmcgZGlzYWJsZWQuIE5vIG5lZWQgdG8gZ2V0IHVwdG8gZGF0ZSBzdGF0IGluZm8uCisJCSAqIFRoaXMgZGVudHJ5IHdpbGwgYmUgcmVsZWFzZWQgaW1tZWRpYXRlbHkuIFNvLCBqdXN0IGhvbGQgdGhlCisJCSAqIGlub2RlCisJCSAqLworCQlpaG9sZChvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwl9CisJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2OWZzX3Zmc19ta25vZF9kb3RsIC0gY3JlYXRlIGEgc3BlY2lhbCBmaWxlCisgKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3IgZmlsZQorICogQG1vZGU6IG1vZGUgZm9yIGNyZWF0aW9uCisgKiBAcmRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWFsIGZpbGUKKyAqCisgKi8KK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX21rbm9kX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9tb2RlLAorCQlkZXZfdCByZGV2KQoreworCWludCBlcnI7CisJY2hhciAqbmFtZTsKKwltb2RlX3QgbW9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWdpZF90IGdpZDsKKwlzdHJ1Y3QgcDlfcWlkIHFpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OworCXN0cnVjdCBwb3NpeF9hY2wgKmRhY2wgPSBOVUxMLCAqcGFjbCA9IE5VTEw7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKKwkJIiAlbHUsJXMgbW9kZTogJXggTUFKT1I6ICV1IE1JTk9SOiAldVxuIiwgZGlyLT5pX2lubywKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgb21vZGUsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7CisKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7CisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCWRmaWQgPSBOVUxMOworCQlnb3RvIGVycm9yOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKwltb2RlID0gb21vZGU7CisJLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCisJZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOworCWlmIChlcnIpIHsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCisJCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIG1rbm9kICVkXG4iLCBlcnIpOworCQlnb3RvIGVycm9yOworCX0KKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKworCWVyciA9IHA5X2NsaWVudF9ta25vZF9kb3RsKGRmaWQsIG5hbWUsIG1vZGUsIHJkZXYsIGdpZCwgJnFpZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLworCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOworCQlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAorCQkJCWVycik7CisJCQlmaWQgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWZpZCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlIGlub2RlIHdpdGggc3RhdC4KKwkJICogc29ja2V0IHN5c2NhbGwgcmV0dXJucyBhIGZkLCBzbyB3ZSBuZWVkIGluc3RhbnRpYXRlCisJCSAqLworCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl9CisJLyogTm93IHNldCB0aGUgQUNMIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHZhbHVlICovCisJdjlmc19zZXRfY3JlYXRlX2FjbChkZW50cnksIGRhY2wsIHBhY2wpOworZXJyb3I6CisJaWYgKGZpZCkKKwkJcDlfY2xpZW50X2NsdW5rKGZpZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2OWZzX3Zmc19mb2xsb3dfbGlua19kb3RsIC0gZm9sbG93IGEgc3ltbGluayBwYXRoCisgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKKyAqIEBuZDogbmFtZWlkYXRhCisgKgorICovCisKK3N0YXRpYyB2b2lkICoKK3Y5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwOV9maWQgKmZpZDsKKwljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7CisJY2hhciAqdGFyZ2V0OworCisJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICIlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIWxpbmspIHsKKwkJbGluayA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gbmRzZXQ7CisJfQorCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnkpOworCWlmIChJU19FUlIoZmlkKSkgeworCQlfX3B1dG5hbWUobGluayk7CisJCWxpbmsgPSBFUlJfUFRSKFBUUl9FUlIoZmlkKSk7CisJCWdvdG8gbmRzZXQ7CisJfQorCXJldHZhbCA9IHA5X2NsaWVudF9yZWFkbGluayhmaWQsICZ0YXJnZXQpOworCWlmICghcmV0dmFsKSB7CisJCXN0cmNweShsaW5rLCB0YXJnZXQpOworCQlrZnJlZSh0YXJnZXQpOworCQlnb3RvIG5kc2V0OworCX0KKwlfX3B1dG5hbWUobGluayk7CisJbGluayA9IEVSUl9QVFIocmV0dmFsKTsKK25kc2V0OgorCW5kX3NldF9saW5rKG5kLCBsaW5rKTsKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19kb3RsID0geworCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGVfZG90bCwKKwkubG9va3VwID0gdjlmc192ZnNfbG9va3VwLAorCS5saW5rID0gdjlmc192ZnNfbGlua19kb3RsLAorCS5zeW1saW5rID0gdjlmc192ZnNfc3ltbGlua19kb3RsLAorCS51bmxpbmsgPSB2OWZzX3Zmc191bmxpbmssCisJLm1rZGlyID0gdjlmc192ZnNfbWtkaXJfZG90bCwKKwkucm1kaXIgPSB2OWZzX3Zmc19ybWRpciwKKwkubWtub2QgPSB2OWZzX3Zmc19ta25vZF9kb3RsLAorCS5yZW5hbWUgPSB2OWZzX3Zmc19yZW5hbWUsCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCisJLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisJLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAorCS5jaGVja19hY2wgPSB2OWZzX2NoZWNrX2FjbCwKK307CisKK2NvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zX2RvdGwgPSB7CisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCisJLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisJLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAorCS5jaGVja19hY2wgPSB2OWZzX2NoZWNrX2FjbCwKK307CisKK2NvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zX2RvdGwgPSB7CisJLnJlYWRsaW5rID0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsgPSB2OWZzX3Zmc19mb2xsb3dfbGlua19kb3RsLAorCS5wdXRfbGluayA9IHY5ZnNfdmZzX3B1dF9saW5rLAorCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0cl9kb3RsLAorCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0cl9kb3RsLAorCS5zZXR4YXR0ciA9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gZ2VuZXJpY19nZXR4YXR0ciwKKwkucmVtb3ZleGF0dHIgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorCS5saXN0eGF0dHIgPSB2OWZzX2xpc3R4YXR0ciwKK307CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfc3VwZXIuYyBiL2ZzLzlwL3Zmc19zdXBlci5jCmluZGV4IGM1NWM2MTQuLmRiYWFiZTMgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19zdXBlci5jCisrKyBiL2ZzLzlwL3Zmc19zdXBlci5jCkBAIC0xNDEsNiArMTQxLDExIEBACiAJfQogCXY5ZnNfZmlsbF9zdXBlcihzYiwgdjlzZXMsIGZsYWdzLCBkYXRhKTsKIAorCWlmICh2OXNlcy0+Y2FjaGUpCisJCXNiLT5zX2Rfb3AgPSAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnM7CisJZWxzZQorCQlzYi0+c19kX29wID0gJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnM7CisKIAlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgbW9kZSk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJcmV0dmFsID0gUFRSX0VSUihpbm9kZSk7CkBAIC0yMTcsOSArMjIyLDYgQEAKIAogCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiICVwXG4iLCBzKTsKIAotCWlmIChzLT5zX3Jvb3QpCi0JCXY5ZnNfZGVudHJ5X3JlbGVhc2Uocy0+c19yb290KTsJLyogY2x1bmsgcm9vdCAqLwotCiAJa2lsbF9hbm9uX3N1cGVyKHMpOwogCiAJdjlmc19zZXNzaW9uX2NhbmNlbCh2OXNlcyk7CmRpZmYgLS1naXQgYS9mcy85cC94YXR0ci5jIGIvZnMvOXAveGF0dHIuYwppbmRleCA0M2VjN2RmLi5kMjg4NzczIDEwMDY0NAotLS0gYS9mcy85cC94YXR0ci5jCisrKyBiL2ZzLzlwL3hhdHRyLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJInA5X2NsaWVudF94YXR0cmNyZWF0ZSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CiAJCWdvdG8gZXJyb3I7CiAJfQotCW1zaXplID0gZmlkLT5jbG50LT5tc2l6ZTs7CisJbXNpemUgPSBmaWQtPmNsbnQtPm1zaXplOwogCXdoaWxlICh2YWx1ZV9sZW4pIHsKIAkJaWYgKHZhbHVlX2xlbiA+IChtc2l6ZSAtIFA5X0lPSERSU1opKQogCQkJd3JpdGVfY291bnQgPSBtc2l6ZSAtIFA5X0lPSERSU1o7CmRpZmYgLS1naXQgYS9mcy9hZGZzL2Rpci5jIGIvZnMvYWRmcy9kaXIuYwppbmRleCBiZjc2OTNjLi4zYjRhNzY0IDEwMDY0NAotLS0gYS9mcy9hZGZzL2Rpci5jCisrKyBiL2ZzL2FkZnMvZGlyLmMKQEAgLTI3Niw3ICsyNzYsNiBAQAogCXN0cnVjdCBvYmplY3RfaW5mbyBvYmo7CiAJaW50IGVycm9yOwogCi0JZF9zZXRfZF9vcChkZW50cnksICZhZGZzX2RlbnRyeV9vcGVyYXRpb25zKTsKIAlsb2NrX2tlcm5lbCgpOwogCWVycm9yID0gYWRmc19kaXJfbG9va3VwX2J5bmFtZShkaXIsICZkZW50cnktPmRfbmFtZSwgJm9iaik7CiAJaWYgKGVycm9yID09IDApIHsKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvc3VwZXIuYyBiL2ZzL2FkZnMvc3VwZXIuYwppbmRleCBhNDA0MWI1Li4yZDc5NTQwIDEwMDY0NAotLS0gYS9mcy9hZGZzL3N1cGVyLmMKKysrIGIvZnMvYWRmcy9zdXBlci5jCkBAIC00NzMsNiArNDczLDcgQEAKIAkJYXNiLT5zX25hbWVsZW4gPSBBREZTX0ZfTkFNRV9MRU47CiAJfQogCisJc2ItPnNfZF9vcCA9ICZhZGZzX2RlbnRyeV9vcGVyYXRpb25zOwogCXJvb3QgPSBhZGZzX2lnZXQoc2IsICZyb290X29iaik7CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKQEAgLTQ4Myw4ICs0ODQsNyBAQAogCQlrZnJlZShhc2ItPnNfbWFwKTsKIAkJYWRmc19lcnJvcihzYiwgImdldCByb290IGlub2RlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlCi0JCWRfc2V0X2Rfb3Aoc2ItPnNfcm9vdCwgJmFkZnNfZGVudHJ5X29wZXJhdGlvbnMpOworCX0KIAl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYWZmcy5oIGIvZnMvYWZmcy9hZmZzLmgKaW5kZXggYThjYmRlYi4uMGU5NWY3MyAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hZmZzLmgKKysrIGIvZnMvYWZmcy9hZmZzLmgKQEAgLTIwMSw2ICsyMDEsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMJIGFmZnNfYW9wc19vZnM7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMJIGFmZnNfZGVudHJ5X29wZXJhdGlvbnM7CitleHRlcm4gY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zCSBhZmZzX2ludGxfZGVudHJ5X29wZXJhdGlvbnM7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogYWZmc19zZXRfYmxvY2tzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCmluZGV4IDk0NGE0MDQuLmUzZTllZmMgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvbmFtZWkuYworKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAkuZF9jb21wYXJlCT0gYWZmc19jb21wYXJlX2RlbnRyeSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYWZmc19pbnRsX2RlbnRyeV9vcGVyYXRpb25zID0geworY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA9IHsKIAkuZF9oYXNoCQk9IGFmZnNfaW50bF9oYXNoX2RlbnRyeSwKIAkuZF9jb21wYXJlCT0gYWZmc19pbnRsX2NvbXBhcmVfZGVudHJ5LAogfTsKQEAgLTI0MCw3ICsyNDAsNiBAQAogCQlpZiAoSVNfRVJSKGlub2RlKSkKIAkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJfQotCWRfc2V0X2Rfb3AoZGVudHJ5LCBBRkZTX1NCKHNiKS0+c19mbGFncyAmIFNGX0lOVEwgPyAmYWZmc19pbnRsX2RlbnRyeV9vcGVyYXRpb25zIDogJmFmZnNfZGVudHJ5X29wZXJhdGlvbnMpOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9zdXBlci5jIGIvZnMvYWZmcy9zdXBlci5jCmluZGV4IGQzOTA4MWIuLmIzMTUwN2QgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvc3VwZXIuYworKysgYi9mcy9hZmZzL3N1cGVyLmMKQEAgLTQ3NywxMiArNDc3LDE2IEBACiAJCWdvdG8gb3V0X2Vycm9yX25vaW5vZGU7CiAJfQogCisJaWYgKEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfSU5UTCkKKwkJc2ItPnNfZF9vcCA9ICZhZmZzX2ludGxfZGVudHJ5X29wZXJhdGlvbnM7CisJZWxzZQorCQlzYi0+c19kX29wID0gJmFmZnNfZGVudHJ5X29wZXJhdGlvbnM7CisKIAlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwogCWlmICghc2ItPnNfcm9vdCkgewogCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IEdldCByb290IGlub2RlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0X2Vycm9yOwogCX0KLQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZhZmZzX2RlbnRyeV9vcGVyYXRpb25zKTsKIAogCXByX2RlYnVnKCJBRkZTOiBzX2ZsYWdzPSVsWFxuIixzYi0+c19mbGFncyk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9hZnMvY21zZXJ2aWNlLmMgYi9mcy9hZnMvY21zZXJ2aWNlLmMKaW5kZXggYTNiY2VjNy4uMWM4YzZjYyAxMDA2NDQKLS0tIGEvZnMvYWZzL2Ntc2VydmljZS5jCisrKyBiL2ZzL2Fmcy9jbXNlcnZpY2UuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwogCiAJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9DYWxsQmFjayk7Ci0Jc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM2LDcgKzMzNiw3IEBACiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwogCiAJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZSk7Ci0Jc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY3LDcgKzM2Nyw3IEBACiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwogCiAJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZSk7Ci0Jc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAwLDcgKzQwMCw3IEBACiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAogCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfUHJvYmUpOwotCXNjaGVkdWxlX3dvcmsoJmNhbGwtPndvcmspOworCXF1ZXVlX3dvcmsoYWZzX3dxLCAmY2FsbC0+d29yayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7CiAKIAlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX1Byb2JlVXVpZCk7Ci0Jc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTgwLDYgKzU4MCw2IEBACiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAogCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfVGVsbE1lQWJvdXRZb3Vyc2VsZik7Ci0Jc2NoZWR1bGVfd29yaygmY2FsbC0+d29yayk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwppbmRleCAzNGEzMjYzLi5lNmE0YWI5IDEwMDY0NAotLS0gYS9mcy9hZnMvZGlyLmMKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC02Miw3ICs2Miw3IEBACiAJLnNldGF0dHIJPSBhZnNfc2V0YXR0ciwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYWZzX2ZzX2RlbnRyeV9vcGVyYXRpb25zID0geworY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFmc19mc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKIAkuZF9yZXZhbGlkYXRlCT0gYWZzX2RfcmV2YWxpZGF0ZSwKIAkuZF9kZWxldGUJPSBhZnNfZF9kZWxldGUsCiAJLmRfcmVsZWFzZQk9IGFmc19kX3JlbGVhc2UsCkBAIC01ODIsOCArNTgyLDYgQEAKIAl9CiAKIHN1Y2Nlc3M6Ci0JZF9zZXRfZF9vcChkZW50cnksICZhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJX2xlYXZlKCIgPSAwIHsgdm49JXUgdT0ldSB9IC0+IHsgaW5vPSVsdSB2PSVsbHUgfSIsCiAJICAgICAgIGZpZC52bm9kZSwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggNmQ0YmMxYy4uNThjNjMzYiAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTQ4Niw2ICs0ODYsNyBAQAogICogZGlyLmMKICAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYWZzX2ZzX2RlbnRyeV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX2Rpcl9maWxlX29wZXJhdGlvbnM7CiAKIC8qCkBAIC01NzYsNiArNTc3LDcgQEAKIC8qCiAgKiBtYWluLmMKICAqLworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfd3E7CiBleHRlcm4gc3RydWN0IGFmc191dWlkIGFmc191dWlkOwogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggY2ZkMWNiZS4uNDJkZDJlNCAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0zMCw2ICszMCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHJvb3RjZWxsLCAicm9vdCBBRlMgY2VsbCBuYW1lIGFuZCBWTCBzZXJ2ZXIgSVAgYWRkciBsaXN0Iik7CiAKIHN0cnVjdCBhZnNfdXVpZCBhZnNfdXVpZDsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfd3E7CiAKIC8qCiAgKiBnZXQgYSBjbGllbnQgVVVJRApAQCAtODcsMTAgKzg4LDE2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKKwkvKiBjcmVhdGUgd29ya3F1ZXVlICovCisJcmV0ID0gLUVOT01FTTsKKwlhZnNfd3EgPSBhbGxvY193b3JrcXVldWUoImFmcyIsIDAsIDApOworCWlmICghYWZzX3dxKQorCQlyZXR1cm4gcmV0OworCiAJLyogcmVnaXN0ZXIgdGhlIC9wcm9jIHN0dWZmICovCiAJcmV0ID0gYWZzX3Byb2NfaW5pdCgpOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycm9yX3Byb2M7CiAKICNpZmRlZiBDT05GSUdfQUZTX0ZTQ0FDSEUKIAkvKiB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2FjaGUgKi8KQEAgLTE0MCw2ICsxNDcsOCBAQAogZXJyb3JfY2FjaGU6CiAjZW5kaWYKIAlhZnNfcHJvY19jbGVhbnVwKCk7CitlcnJvcl9wcm9jOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc193cSk7CiAJcmN1X2JhcnJpZXIoKTsKIAlwcmludGsoS0VSTl9FUlIgImtBRlM6IGZhaWxlZCB0byByZWdpc3RlcjogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTE2Myw3ICsxNzIsNyBAQAogCWFmc19wdXJnZV9zZXJ2ZXJzKCk7CiAJYWZzX2NhbGxiYWNrX3VwZGF0ZV9raWxsKCk7CiAJYWZzX3Zsb2NhdGlvbl9wdXJnZSgpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZGVzdHJveV93b3JrcXVldWUoYWZzX3dxKTsKIAlhZnNfY2VsbF9wdXJnZSgpOwogI2lmZGVmIENPTkZJR19BRlNfRlNDQUNIRQogCWZzY2FjaGVfdW5yZWdpc3Rlcl9uZXRmcygmYWZzX2NhY2hlX25ldGZzKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tbnRwdC5jIGIvZnMvYWZzL21udHB0LmMKaW5kZXggNjE1MzQxNy4uZTgzYzAzMyAxMDA2NDQKLS0tIGEvZnMvYWZzL21udHB0LmMKKysrIGIvZnMvYWZzL21udHB0LmMKQEAgLTI2OCw4ICsyNjgsOCBAQAogCQlwYXRoX3B1dCgmbmQtPnBhdGgpOwogCQluZC0+cGF0aC5tbnQgPSBuZXdtbnQ7CiAJCW5kLT5wYXRoLmRlbnRyeSA9IGRnZXQobmV3bW50LT5tbnRfcm9vdCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX21udHB0X2V4cGlyeV90aW1lciwKLQkJCQkgICAgICBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfd3EsICZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLAorCQkJCSAgIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKIAkJYnJlYWs7CiAJY2FzZSAtRUJVU1k6CiAJCS8qIHNvbWVvbmUgZWxzZSBtYWRlIGEgbW91bnQgaGVyZSB3aGlsc3Qgd2Ugd2VyZSBidXN5ICovCkBAIC0yOTUsOCArMjk1LDggQEAKIAogCWlmICghbGlzdF9lbXB0eSgmYWZzX3Zmc21vdW50cykpIHsKIAkJbWFya19tb3VudHNfZm9yX2V4cGlyeSgmYWZzX3Zmc21vdW50cyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX21udHB0X2V4cGlyeV90aW1lciwKLQkJCQkgICAgICBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfd3EsICZhZnNfbW50cHRfZXhwaXJ5X3RpbWVyLAorCQkJCSAgIGFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKIAl9CiAKIAlfbGVhdmUoIiIpOwpAQCAtMzEwLDYgKzMxMCw1IEBACiAJX2VudGVyKCIiKTsKIAogCUFTU0VSVChsaXN0X2VtcHR5KCZhZnNfdmZzbW91bnRzKSk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmYWZzX21udHB0X2V4cGlyeV90aW1lcik7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFmc19tbnRwdF9leHBpcnlfdGltZXIpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwppbmRleCA2NTRkOGZkLi5lNDVhMzIzIDEwMDY0NAotLS0gYS9mcy9hZnMvcnhycGMuYworKysgYi9mcy9hZnMvcnhycGMuYwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJaWYgKCFjYWxsKSB7CiAJCS8qIGl0cyBhbiBpbmNvbWluZyBjYWxsIGZvciBvdXIgY2FsbGJhY2sgc2VydmljZSAqLwogCQlza2JfcXVldWVfdGFpbCgmYWZzX2luY29taW5nX2NhbGxzLCBza2IpOwotCQlzY2hlZHVsZV93b3JrKCZhZnNfY29sbGVjdF9pbmNvbWluZ19jYWxsX3dvcmspOworCQlxdWV1ZV93b3JrKGFmc193cSwgJmFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yayk7CiAJfSBlbHNlIHsKIAkJLyogcm91dGUgdGhlIG1lc3NhZ2VzIGRpcmVjdGx5IHRvIHRoZSBhcHByb3ByaWF0ZSBjYWxsICovCiAJCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuYyBiL2ZzL2Fmcy9zZXJ2ZXIuYwppbmRleCA5ZmRjN2ZlLi5kNTliNzUxIDEwMDY0NAotLS0gYS9mcy9hZnMvc2VydmVyLmMKKysrIGIvZnMvYWZzL3NlcnZlci5jCkBAIC0yMzgsOCArMjM4LDggQEAKIAlpZiAoYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpID09IDApIHsKIAkJbGlzdF9tb3ZlX3RhaWwoJnNlcnZlci0+Z3JhdmUsICZhZnNfc2VydmVyX2dyYXZleWFyZCk7CiAJCXNlcnZlci0+dGltZV9vZl9kZWF0aCA9IGdldF9zZWNvbmRzKCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWZzX3NlcnZlcl9yZWFwZXIsCi0JCQkJICAgICAgYWZzX3NlcnZlcl90aW1lb3V0ICogSFopOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX3dxLCAmYWZzX3NlcnZlcl9yZWFwZXIsCisJCQkJICAgYWZzX3NlcnZlcl90aW1lb3V0ICogSFopOwogCX0KIAlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9ncmF2ZXlhcmRfbG9jayk7CiAJX2xlYXZlKCIgW2RlYWRdIik7CkBAIC0yODUsMTAgKzI4NSwxMSBAQAogCQlleHBpcnkgPSBzZXJ2ZXItPnRpbWVfb2ZfZGVhdGggKyBhZnNfc2VydmVyX3RpbWVvdXQ7CiAJCWlmIChleHBpcnkgPiBub3cpIHsKIAkJCWRlbGF5ID0gKGV4cGlyeSAtIG5vdykgKiBIWjsKLQkJCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfc2VydmVyX3JlYXBlciwgZGVsYXkpKSB7CisJCQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfd3EsICZhZnNfc2VydmVyX3JlYXBlciwKKwkJCQkJCWRlbGF5KSkgewogCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKLQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLAotCQkJCQkJICAgICAgZGVsYXkpOworCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfd3EsICZhZnNfc2VydmVyX3JlYXBlciwKKwkJCQkJCSAgIGRlbGF5KTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC0zMjMsNSArMzI0LDUgQEAKIHsKIAlhZnNfc2VydmVyX3RpbWVvdXQgPSAwOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc19zZXJ2ZXJfcmVhcGVyLCAwKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX3dxLCAmYWZzX3NlcnZlcl9yZWFwZXIsIDApOwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmMgYi9mcy9hZnMvc3VwZXIuYwppbmRleCBmOTAxYTlkLi5mYjI0MGU4IDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuYworKysgYi9mcy9hZnMvc3VwZXIuYwpAQCAtMzM2LDYgKzMzNiw3IEBACiAJaWYgKCFyb290KQogCQlnb3RvIGVycm9yOwogCisJc2ItPnNfZF9vcCA9ICZhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnM7CiAJc2ItPnNfcm9vdCA9IHJvb3Q7CiAKIAlfbGVhdmUoIiA9IDAiKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwppbmRleCA5YWMyNjBkLi40MzE5ODRkIDEwMDY0NAotLS0gYS9mcy9hZnMvdmxvY2F0aW9uLmMKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC01MDcsOCArNTA3LDggQEAKIAkJX2RlYnVnKCJidXJpZWQiKTsKIAkJbGlzdF9tb3ZlX3RhaWwoJnZsLT5ncmF2ZSwgJmFmc192bG9jYXRpb25fZ3JhdmV5YXJkKTsKIAkJdmwtPnRpbWVfb2ZfZGVhdGggPSBnZXRfc2Vjb25kcygpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCwKLQkJCQkgICAgICBhZnNfdmxvY2F0aW9uX3RpbWVvdXQgKiBIWik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfd3EsICZhZnNfdmxvY2F0aW9uX3JlYXAsCisJCQkJICAgYWZzX3Zsb2NhdGlvbl90aW1lb3V0ICogSFopOwogCiAJCS8qIHN1c3BlbmQgdXBkYXRlcyBvbiB0aGlzIHJlY29yZCAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJnZsLT51cGRhdGUpKSB7CkBAIC01NjEsMTEgKzU2MSwxMSBAQAogCQlpZiAoZXhwaXJ5ID4gbm93KSB7CiAJCQlkZWxheSA9IChleHBpcnkgLSBub3cpICogSFo7CiAJCQlfZGVidWcoImRlbGF5ICVsdSIsIGRlbGF5KTsKLQkJCWlmICghc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXAsCi0JCQkJCQkgICBkZWxheSkpIHsKKwkJCWlmICghcXVldWVfZGVsYXllZF93b3JrKGFmc193cSwgJmFmc192bG9jYXRpb25fcmVhcCwKKwkJCQkJCWRlbGF5KSkgewogCQkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCk7Ci0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZnNfdmxvY2F0aW9uX3JlYXAsCi0JCQkJCQkgICAgICBkZWxheSk7CisJCQkJcXVldWVfZGVsYXllZF93b3JrKGFmc193cSwgJmFmc192bG9jYXRpb25fcmVhcCwKKwkJCQkJCSAgIGRlbGF5KTsKIAkJCX0KIAkJCWJyZWFrOwogCQl9CkBAIC02MjAsNyArNjIwLDcgQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWZzX3Zsb2NhdGlvbl9yZWFwKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFmc192bG9jYXRpb25fcmVhcCwgMCk7CisJcXVldWVfZGVsYXllZF93b3JrKGFmc193cSwgJmFmc192bG9jYXRpb25fcmVhcCwgMCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IDhjOGY2YzUuLjVlMDBmMTUgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC03OTgsMjkgKzc5OCwxMiBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhhaW9fd3EsICZjdHgtPndxLCB0aW1lb3V0KTsKIH0KIAotCiAvKgotICogYWlvX3J1bl9pb2NiczoKLSAqIAlQcm9jZXNzIGFsbCBwZW5kaW5nIHJldHJpZXMgcXVldWVkIG9uIHRoZSBpb2N0eAotICogCXJ1biBsaXN0LgotICogQXNzdW1lcyBpdCBpcyBvcGVyYXRpbmcgd2l0aGluIHRoZSBhaW8gaXNzdWVyJ3MgbW0KLSAqIGNvbnRleHQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhaW9fcnVuX2lvY2JzKHN0cnVjdCBraW9jdHggKmN0eCkKLXsKLQlpbnQgcmVxdWV1ZTsKLQotCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOwotCi0JcmVxdWV1ZSA9IF9fYWlvX3J1bl9pb2NicyhjdHgpOwotCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7Ci0JaWYgKHJlcXVldWUpCi0JCWFpb19xdWV1ZV93b3JrKGN0eCk7Ci19Ci0KLS8qCi0gKiBqdXN0IGxpa2UgYWlvX3J1bl9pb2NicywgYnV0IGtlZXBzIHJ1bm5pbmcgdGhlbSB1bnRpbAotICogdGhlIGxpc3Qgc3RheXMgZW1wdHkKKyAqIGFpb19ydW5fYWxsX2lvY2JzOgorICoJUHJvY2VzcyBhbGwgcGVuZGluZyByZXRyaWVzIHF1ZXVlZCBvbiB0aGUgaW9jdHgKKyAqCXJ1biBsaXN0LCBhbmQga2VlcCBydW5uaW5nIHRoZW0gdW50aWwgdGhlIGxpc3QKKyAqCXN0YXlzIGVtcHR5LgorICogQXNzdW1lcyBpdCBpcyBvcGVyYXRpbmcgd2l0aGluIHRoZSBhaW8gaXNzdWVyJ3MgbW0gY29udGV4dC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGFpb19ydW5fYWxsX2lvY2JzKHN0cnVjdCBraW9jdHggKmN0eCkKIHsKQEAgLTE4MzksNyArMTgyMiw3IEBACiAJbG9uZyByZXQgPSAtRUlOVkFMOwogCiAJaWYgKGxpa2VseShpb2N0eCkpIHsKLQkJaWYgKGxpa2VseShtaW5fbnIgPD0gbnIgJiYgbWluX25yID49IDAgJiYgbnIgPj0gMCkpCisJCWlmIChsaWtlbHkobWluX25yIDw9IG5yICYmIG1pbl9uciA+PSAwKSkKIAkJCXJldCA9IHJlYWRfZXZlbnRzKGlvY3R4LCBtaW5fbnIsIG5yLCBldmVudHMsIHRpbWVvdXQpOwogCQlwdXRfaW9jdHgoaW9jdHgpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Fub25faW5vZGVzLmMgYi9mcy9hbm9uX2lub2Rlcy5jCmluZGV4IDVmZDM4MTEyYS4uY2JlNTdmMyAxMDA2NDQKLS0tIGEvZnMvYW5vbl9pbm9kZXMuYworKysgYi9mcy9hbm9uX2lub2Rlcy5jCkBAIC0yNiwxMiArMjYsNiBAQAogc3RhdGljIHN0cnVjdCBpbm9kZSAqYW5vbl9pbm9kZV9pbm9kZTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFub25faW5vZGVfZm9wczsKIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKmFub25faW5vZGVmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQotewotCXJldHVybiBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgImFub25faW5vZGU6IiwgTlVMTCwgQU5PTl9JTk9ERV9GU19NQUdJQyk7Ci19Ci0KIC8qCiAgKiBhbm9uX2lub2RlZnNfZG5hbWUoKSBpcyBjYWxsZWQgZnJvbSBkX3BhdGgoKS4KICAqLwpAQCAtNDEsMTQgKzM1LDIyIEBACiAJCQkJZGVudHJ5LT5kX25hbWUubmFtZSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYW5vbl9pbm9kZWZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2RuYW1lCT0gYW5vbl9pbm9kZWZzX2RuYW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFub25faW5vZGVmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgImFub25faW5vZGU6IiwgTlVMTCwKKwkJCSZhbm9uX2lub2RlZnNfZGVudHJ5X29wZXJhdGlvbnMsIEFOT05fSU5PREVfRlNfTUFHSUMpOworfQorCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYW5vbl9pbm9kZV9mc190eXBlID0gewogCS5uYW1lCQk9ICJhbm9uX2lub2RlZnMiLAogCS5tb3VudAkJPSBhbm9uX2lub2RlZnNfbW91bnQsCiAJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhbm9uX2lub2RlZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7Ci0JLmRfZG5hbWUJPSBhbm9uX2lub2RlZnNfZG5hbWUsCi19OwogCiAvKgogICogbm9wIC5zZXRfcGFnZV9kaXJ0eSBtZXRob2Qgc28gdGhhdCBwZW9wbGUgY2FuIHVzZSAucGFnZV9ta3dyaXRlIG9uCkBAIC02NCw5ICs2Niw5IEBACiB9OwogCiAvKioKLSAqIGFub25faW5vZGVfZ2V0ZmQgLSBjcmVhdGVzIGEgbmV3IGZpbGUgaW5zdGFuY2UgYnkgaG9va2luZyBpdCB1cCB0byBhbgotICogICAgICAgICAgICAgICAgICAgIGFub255bW91cyBpbm9kZSwgYW5kIGEgZGVudHJ5IHRoYXQgZGVzY3JpYmUgdGhlICJjbGFzcyIKLSAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZmlsZQorICogYW5vbl9pbm9kZV9nZXRmaWxlIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW4KKyAqICAgICAgICAgICAgICAgICAgICAgIGFub255bW91cyBpbm9kZSwgYW5kIGEgZGVudHJ5IHRoYXQgZGVzY3JpYmUgdGhlICJjbGFzcyIKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlCiAgKgogICogQG5hbWU6ICAgIFtpbl0gICAgbmFtZSBvZiB0aGUgImNsYXNzIiBvZiB0aGUgbmV3IGZpbGUKICAqIEBmb3BzOiAgICBbaW5dICAgIGZpbGUgb3BlcmF0aW9ucyBmb3IgdGhlIG5ldyBmaWxlCkBAIC0xMTMsNyArMTE1LDYgQEAKIAkgKi8KIAlpaG9sZChhbm9uX2lub2RlX2lub2RlKTsKIAotCWRfc2V0X2Rfb3AocGF0aC5kZW50cnksICZhbm9uX2lub2RlZnNfZGVudHJ5X29wZXJhdGlvbnMpOwogCWRfaW5zdGFudGlhdGUocGF0aC5kZW50cnksIGFub25faW5vZGVfaW5vZGUpOwogCiAJZXJyb3IgPSAtRU5GSUxFOwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9lbmRpYW4uaCBiL2ZzL2JlZnMvZW5kaWFuLmgKaW5kZXggNmNiODRkOC4uMjcyMjM4NyAxMDA2NDQKLS0tIGEvZnMvYmVmcy9lbmRpYW4uaAorKysgYi9mcy9iZWZzL2VuZGlhbi5oCkBAIC0xMDIsMjIgKzEwMiwyMiBAQAogfQogCiBzdGF0aWMgaW5saW5lIGJlZnNfZGF0YV9zdHJlYW0KLWZzZHNfdG9fY3B1KGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGlza19kYXRhX3N0cmVhbSBuKQorZnNkc190b19jcHUoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgYmVmc19kaXNrX2RhdGFfc3RyZWFtICpuKQogewogCWJlZnNfZGF0YV9zdHJlYW0gZGF0YTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBCRUZTX05VTV9ESVJFQ1RfQkxPQ0tTOyArK2kpCi0JCWRhdGEuZGlyZWN0W2ldID0gZnNydW5fdG9fY3B1KHNiLCBuLmRpcmVjdFtpXSk7CisJCWRhdGEuZGlyZWN0W2ldID0gZnNydW5fdG9fY3B1KHNiLCBuLT5kaXJlY3RbaV0pOwogCi0JZGF0YS5tYXhfZGlyZWN0X3JhbmdlID0gZnM2NF90b19jcHUoc2IsIG4ubWF4X2RpcmVjdF9yYW5nZSk7Ci0JZGF0YS5pbmRpcmVjdCA9IGZzcnVuX3RvX2NwdShzYiwgbi5pbmRpcmVjdCk7Ci0JZGF0YS5tYXhfaW5kaXJlY3RfcmFuZ2UgPSBmczY0X3RvX2NwdShzYiwgbi5tYXhfaW5kaXJlY3RfcmFuZ2UpOwotCWRhdGEuZG91YmxlX2luZGlyZWN0ID0gZnNydW5fdG9fY3B1KHNiLCBuLmRvdWJsZV9pbmRpcmVjdCk7CisJZGF0YS5tYXhfZGlyZWN0X3JhbmdlID0gZnM2NF90b19jcHUoc2IsIG4tPm1heF9kaXJlY3RfcmFuZ2UpOworCWRhdGEuaW5kaXJlY3QgPSBmc3J1bl90b19jcHUoc2IsIG4tPmluZGlyZWN0KTsKKwlkYXRhLm1heF9pbmRpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLCBuLT5tYXhfaW5kaXJlY3RfcmFuZ2UpOworCWRhdGEuZG91YmxlX2luZGlyZWN0ID0gZnNydW5fdG9fY3B1KHNiLCBuLT5kb3VibGVfaW5kaXJlY3QpOwogCWRhdGEubWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLAotCQkJCQkJICAgICBuLgorCQkJCQkJICAgICBuLT4KIAkJCQkJCSAgICAgbWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSk7Ci0JZGF0YS5zaXplID0gZnM2NF90b19jcHUoc2IsIG4uc2l6ZSk7CisJZGF0YS5zaXplID0gZnM2NF90b19jcHUoc2IsIG4tPnNpemUpOwogCiAJcmV0dXJuIGRhdGE7CiB9CmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKaW5kZXggZGU5MzU4MS4uYjFkMGM3OSAxMDA2NDQKLS0tIGEvZnMvYmVmcy9saW51eHZmcy5jCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCWludCBudW1fYmxrczsKIAogCQliZWZzX2luby0+aV9kYXRhLmRzID0KLQkJICAgIGZzZHNfdG9fY3B1KHNiLCByYXdfaW5vZGUtPmRhdGEuZGF0YXN0cmVhbSk7CisJCSAgICBmc2RzX3RvX2NwdShzYiwgJnJhd19pbm9kZS0+ZGF0YS5kYXRhc3RyZWFtKTsKIAogCQludW1fYmxrcyA9IGJlZnNfY291bnRfYmxvY2tzKHNiLCAmYmVmc19pbm8tPmlfZGF0YS5kcyk7CiAJCWlub2RlLT5pX2Jsb2NrcyA9CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggNjg4NGUxOS4uZDViNjQwYiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtNjYsMTIgKzY2LDExIEBACiAjZGVmaW5lIEVMRl9QQUdFQUxJR04oX3YpICgoKF92KSArIEVMRl9NSU5fQUxJR04gLSAxKSAmIH4oRUxGX01JTl9BTElHTiAtIDEpKQogCiBzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBlbGZfZm9ybWF0ID0gewotCQkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCQkubG9hZF9iaW5hcnkJPSBsb2FkX2VsZl9iaW5hcnksCi0JCS5sb2FkX3NobGliCT0gbG9hZF9lbGZfbGlicmFyeSwKLQkJLmNvcmVfZHVtcAk9IGVsZl9jb3JlX2R1bXAsCi0JCS5taW5fY29yZWR1bXAJPSBFTEZfRVhFQ19QQUdFU0laRSwKLQkJLmhhc3Zkc28JPSAxCisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX2VsZl9iaW5hcnksCisJLmxvYWRfc2hsaWIJPSBsb2FkX2VsZl9saWJyYXJ5LAorCS5jb3JlX2R1bXAJPSBlbGZfY29yZV9kdW1wLAorCS5taW5fY29yZWR1bXAJPSBFTEZfRVhFQ19QQUdFU0laRSwKIH07CiAKICNkZWZpbmUgQkFEX0FERFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA+PSBUQVNLX1NJWkUpCkBAIC0zMTYsOCArMzE1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmbmRlZiBlbGZfbWFwCi0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSwKIAkJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplKQpAQCAtMzU0LDggKzM1MSw2IEBACiAJcmV0dXJuKG1hcF9hZGRyKTsKIH0KIAotI2VuZGlmIC8qICFlbGZfbWFwICovCi0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX21hcHBpbmdfc2l6ZShzdHJ1Y3QgZWxmX3BoZHIgKmNtZHMsIGludCBucikKIHsKIAlpbnQgaSwgZmlyc3RfaWR4ID0gLTEsIGxhc3RfaWR4ID0gLTE7CkBAIC00MjEsNyArNDE2LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZXR2YWwgPSBrZXJuZWxfcmVhZChpbnRlcnByZXRlciwgaW50ZXJwX2VsZl9leC0+ZV9waG9mZiwKLQkJCSAgICAgKGNoYXIgKillbGZfcGhkYXRhLHNpemUpOworCQkJICAgICAoY2hhciAqKWVsZl9waGRhdGEsIHNpemUpOwogCWVycm9yID0gLUVJTzsKIAlpZiAocmV0dmFsICE9IHNpemUpIHsKIAkJaWYgKHJldHZhbCA8IDApCkBAIC02MDEsNyArNTk2LDcgQEAKIAkJZ290byBvdXQ7CiAJaWYgKCFlbGZfY2hlY2tfYXJjaCgmbG9jLT5lbGZfZXgpKQogCQlnb3RvIG91dDsKLQlpZiAoIWJwcm0tPmZpbGUtPmZfb3B8fCFicHJtLT5maWxlLT5mX29wLT5tbWFwKQorCWlmICghYnBybS0+ZmlsZS0+Zl9vcCB8fCAhYnBybS0+ZmlsZS0+Zl9vcC0+bW1hcCkKIAkJZ290byBvdXQ7CiAKIAkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwpAQCAtNzYxLDggKzc1Niw4IEBACiAJCQkvKiBUaGVyZSB3YXMgYSBQVF9MT0FEIHNlZ21lbnQgd2l0aCBwX21lbXN6ID4gcF9maWxlc3oKIAkJCSAgIGJlZm9yZSB0aGlzIG9uZS4gTWFwIGFub255bW91cyBwYWdlcywgaWYgbmVlZGVkLAogCQkJICAgYW5kIGNsZWFyIHRoZSBhcmVhLiAgKi8KLQkJCXJldHZhbCA9IHNldF9icmsgKGVsZl9ic3MgKyBsb2FkX2JpYXMsCi0JCQkJCSAgZWxmX2JyayArIGxvYWRfYmlhcyk7CisJCQlyZXR2YWwgPSBzZXRfYnJrKGVsZl9ic3MgKyBsb2FkX2JpYXMsCisJCQkJCSBlbGZfYnJrICsgbG9hZF9iaWFzKTsKIAkJCWlmIChyZXR2YWwpIHsKIAkJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKIAkJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKZGlmZiAtLWdpdCBhL2ZzL2Jpby1pbnRlZ3JpdHkuYyBiL2ZzL2Jpby1pbnRlZ3JpdHkuYwppbmRleCA0ZDBmZjVlLi5lNDljY2UyIDEwMDY0NAotLS0gYS9mcy9iaW8taW50ZWdyaXR5LmMKKysrIGIvZnMvYmlvLWludGVncml0eS5jCkBAIC03ODIsNyArNzgyLDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlraW50ZWdyaXR5ZF93cSA9IGNyZWF0ZV93b3JrcXVldWUoImtpbnRlZ3JpdHlkIik7CisJLyoKKwkgKiBraW50ZWdyaXR5ZCB3b24ndCBibG9jayBtdWNoIGJ1dCBtYXkgYnVybiBhIGxvdCBvZiBDUFUgY3ljbGVzLgorCSAqIE1ha2UgaXQgaGlnaHByaSBDUFUgaW50ZW5zaXZlIHdxIHdpdGggbWF4IGNvbmN1cnJlbmN5IG9mIDEuCisJICovCisJa2ludGVncml0eWRfd3EgPSBhbGxvY193b3JrcXVldWUoImtpbnRlZ3JpdHlkIiwgV1FfTUVNX1JFQ0xBSU0gfAorCQkJCQkgV1FfSElHSFBSSSB8IFdRX0NQVV9JTlRFTlNJVkUsIDEpOwogCWlmICgha2ludGVncml0eWRfd3EpCiAJCXBhbmljKCJGYWlsZWQgdG8gY3JlYXRlIGtpbnRlZ3JpdHlkXG4iKTsKIApkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCA3NzFmMjM1Li5mZTNmNTljMSAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTQzMiw5ICs0MzIsNiBAQAogCW11dGV4X2luaXQoJmJkZXYtPmJkX211dGV4KTsKIAlJTklUX0xJU1RfSEVBRCgmYmRldi0+YmRfaW5vZGVzKTsKIAlJTklUX0xJU1RfSEVBRCgmYmRldi0+YmRfbGlzdCk7Ci0jaWZkZWYgQ09ORklHX1NZU0ZTCi0JSU5JVF9MSVNUX0hFQUQoJmJkZXYtPmJkX2hvbGRlcl9saXN0KTsKLSNlbmRpZgogCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CiAJLyogSW5pdGlhbGl6ZSBtdXRleCBmb3IgZnJlZXplLiAqLwogCW11dGV4X2luaXQoJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKQEAgLTQ3Myw3ICs0NzAsNyBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmJkX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCAweDYyNjQ2NTc2KTsKKwlyZXR1cm4gbW91bnRfcHNldWRvKGZzX3R5cGUsICJiZGV2OiIsICZiZGV2X3NvcHMsIE5VTEwsIDB4NjI2NDY1NzYpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYmRfdHlwZSA9IHsKQEAgLTY2OSw3ICs2NjYsNyBAQAogCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpCiAJCXJldHVybiB0cnVlOyAgCSAvKiBpcyBhIHdob2xlIGRldmljZSB3aGljaCBpc24ndCBoZWxkICovCiAKLQllbHNlIGlmICh3aG9sZS0+YmRfaG9sZGVyID09IGJkX2NsYWltKQorCWVsc2UgaWYgKHdob2xlLT5iZF9ob2xkZXIgPT0gYmRfbWF5X2NsYWltKQogCQlyZXR1cm4gdHJ1ZTsgCSAvKiBpcyBhIHBhcnRpdGlvbiBvZiBhIGRldmljZSB0aGF0IGlzIGJlaW5nIHBhcnRpdGlvbmVkICovCiAJZWxzZSBpZiAod2hvbGUtPmJkX2hvbGRlciAhPSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CSAvKiBpcyBhIHBhcnRpdGlvbiBvZiBhIGhlbGQgZGV2aWNlICovCkBAIC03ODEsNDQwICs3NzgsODggQEAKIAl9CiB9CiAKLS8qIHJlbGVhc2VzIGJkZXZfbG9jayAqLwotc3RhdGljIHZvaWQgX19iZF9hYm9ydF9jbGFpbWluZyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICp3aG9sZSwgdm9pZCAqaG9sZGVyKQotewotCUJVR19PTih3aG9sZS0+YmRfY2xhaW1pbmcgIT0gaG9sZGVyKTsKLQl3aG9sZS0+YmRfY2xhaW1pbmcgPSBOVUxMOwotCXdha2VfdXBfYml0KCZ3aG9sZS0+YmRfY2xhaW1pbmcsIDApOwotCi0Jc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Ci0JYmRwdXQod2hvbGUpOwotfQotCi0vKioKLSAqIGJkX2Fib3J0X2NsYWltaW5nIC0gYWJvcnQgY2xhaW1pbmcgYSBibG9jayBkZXZpY2UKLSAqIEB3aG9sZTogd2hvbGUgYmxvY2sgZGV2aWNlIHJldHVybmVkIGJ5IGJkX3N0YXJ0X2NsYWltaW5nKCkKLSAqIEBob2xkZXI6IGhvbGRlciB0cnlpbmcgdG8gY2xhaW0gQGJkZXYKLSAqCi0gKiBBYm9ydCBhIGNsYWltaW5nIGJsb2NrIHN0YXJ0ZWQgYnkgYmRfc3RhcnRfY2xhaW1pbmcoKS4gIE5vdGUgdGhhdAotICogQHdob2xlIGlzIG5vdCB0aGUgYmxvY2sgZGV2aWNlIHRvIGJlIGNsYWltZWQgYnV0IHRoZSB3aG9sZSBkZXZpY2UKLSAqIHJldHVybmVkIGJ5IGJkX3N0YXJ0X2NsYWltaW5nKCkuCi0gKgotICogQ09OVEVYVDoKLSAqIEdyYWJzIGFuZCByZWxlYXNlcyBiZGV2X2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkIGJkX2Fib3J0X2NsYWltaW5nKHN0cnVjdCBibG9ja19kZXZpY2UgKndob2xlLCB2b2lkICpob2xkZXIpCi17Ci0Jc3Bpbl9sb2NrKCZiZGV2X2xvY2spOwotCV9fYmRfYWJvcnRfY2xhaW1pbmcod2hvbGUsIGhvbGRlcik7CQkvKiByZWxlYXNlcyBiZGV2X2xvY2sgKi8KLX0KLQotLyogaW5jcmVtZW50IGhvbGRlcnMgd2hlbiB3ZSBoYXZlIGEgbGVnaXRpbWF0ZSBjbGFpbS4gcmVxdWlyZXMgYmRldl9sb2NrICovCi1zdGF0aWMgdm9pZCBfX2JkX2NsYWltKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKndob2xlLAotCQkJCQl2b2lkICpob2xkZXIpCi17Ci0JLyogbm90ZSB0aGF0IGZvciBhIHdob2xlIGRldmljZSBiZF9ob2xkZXJzCi0JICogd2lsbCBiZSBpbmNyZW1lbnRlZCB0d2ljZSwgYW5kIGJkX2hvbGRlciB3aWxsCi0JICogYmUgc2V0IHRvIGJkX2NsYWltIGJlZm9yZSBiZWluZyBzZXQgdG8gaG9sZGVyCi0JICovCi0Jd2hvbGUtPmJkX2hvbGRlcnMrKzsKLQl3aG9sZS0+YmRfaG9sZGVyID0gYmRfY2xhaW07Ci0JYmRldi0+YmRfaG9sZGVycysrOwotCWJkZXYtPmJkX2hvbGRlciA9IGhvbGRlcjsKLX0KLQotLyoqCi0gKiBiZF9maW5pc2hfY2xhaW1pbmcgLSBmaW5pc2ggY2xhaW1pbmcgYSBibG9jayBkZXZpY2UKLSAqIEBiZGV2OiBibG9jayBkZXZpY2Ugb2YgaW50ZXJlc3QgKHBhc3NlZCB0byBiZF9zdGFydF9jbGFpbWluZygpKQotICogQHdob2xlOiB3aG9sZSBibG9jayBkZXZpY2UgcmV0dXJuZWQgYnkgYmRfc3RhcnRfY2xhaW1pbmcoKQotICogQGhvbGRlcjogaG9sZGVyIHRyeWluZyB0byBjbGFpbSBAYmRldgotICoKLSAqIEZpbmlzaCBhIGNsYWltaW5nIGJsb2NrIHN0YXJ0ZWQgYnkgYmRfc3RhcnRfY2xhaW1pbmcoKS4KLSAqCi0gKiBDT05URVhUOgotICogR3JhYnMgYW5kIHJlbGVhc2VzIGJkZXZfbG9jay4KLSAqLwotc3RhdGljIHZvaWQgYmRfZmluaXNoX2NsYWltaW5nKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCi0JCQkJc3RydWN0IGJsb2NrX2RldmljZSAqd2hvbGUsIHZvaWQgKmhvbGRlcikKLXsKLQlzcGluX2xvY2soJmJkZXZfbG9jayk7Ci0JQlVHX09OKCFiZF9tYXlfY2xhaW0oYmRldiwgd2hvbGUsIGhvbGRlcikpOwotCV9fYmRfY2xhaW0oYmRldiwgd2hvbGUsIGhvbGRlcik7Ci0JX19iZF9hYm9ydF9jbGFpbWluZyh3aG9sZSwgaG9sZGVyKTsgLyogbm90IGFjdHVhbGx5IGFuIGFib3J0ICovCi19Ci0KLS8qKgotICogYmRfY2xhaW0gLSBjbGFpbSBhIGJsb2NrIGRldmljZQotICogQGJkZXY6IGJsb2NrIGRldmljZSB0byBjbGFpbQotICogQGhvbGRlcjogaG9sZGVyIHRyeWluZyB0byBjbGFpbSBAYmRldgotICoKLSAqIFRyeSB0byBjbGFpbSBAYmRldiB3aGljaCBtdXN0IGhhdmUgYmVlbiBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqIENPTlRFWFQ6Ci0gKiBNaWdodCBzbGVlcC4KLSAqCi0gKiBSRVRVUk5TOgotICogMCBpZiBzdWNjZXNzZnVsLCAtRUJVU1kgaWYgQGJkZXYgaXMgYWxyZWFkeSBjbGFpbWVkLgotICovCi1pbnQgYmRfY2xhaW0oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdm9pZCAqaG9sZGVyKQotewotCXN0cnVjdCBibG9ja19kZXZpY2UgKndob2xlID0gYmRldi0+YmRfY29udGFpbnM7Ci0JaW50IHJlczsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlzcGluX2xvY2soJmJkZXZfbG9jayk7Ci0JcmVzID0gYmRfcHJlcGFyZV90b19jbGFpbShiZGV2LCB3aG9sZSwgaG9sZGVyKTsKLQlpZiAocmVzID09IDApCi0JCV9fYmRfY2xhaW0oYmRldiwgd2hvbGUsIGhvbGRlcik7Ci0Jc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Ci0KLQlyZXR1cm4gcmVzOwotfQotRVhQT1JUX1NZTUJPTChiZF9jbGFpbSk7Ci0KLXZvaWQgYmRfcmVsZWFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQotewotCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKLQlpZiAoIS0tYmRldi0+YmRfY29udGFpbnMtPmJkX2hvbGRlcnMpCi0JCWJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgPSBOVUxMOwotCWlmICghLS1iZGV2LT5iZF9ob2xkZXJzKQotCQliZGV2LT5iZF9ob2xkZXIgPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOwotfQotCi1FWFBPUlRfU1lNQk9MKGJkX3JlbGVhc2UpOwotCiAjaWZkZWYgQ09ORklHX1NZU0ZTCi0vKgotICogRnVuY3Rpb25zIGZvciBiZF9jbGFpbV9ieV9rb2JqZWN0IC8gYmRfcmVsZWFzZV9mcm9tX2tvYmplY3QKLSAqCi0gKiAgICAgSWYgYSBrb2JqZWN0IGlzIHBhc3NlZCB0byBiZF9jbGFpbV9ieV9rb2JqZWN0KCkKLSAqICAgICBhbmQgdGhlIGtvYmplY3QgaGFzIGEgcGFyZW50IGRpcmVjdG9yeSwKLSAqICAgICBmb2xsb3dpbmcgc3ltbGlua3MgYXJlIGNyZWF0ZWQ6Ci0gKiAgICAgICAgbyBmcm9tIHRoZSBrb2JqZWN0IHRvIHRoZSBjbGFpbWVkIGJkZXYKLSAqICAgICAgICBvIGZyb20gImhvbGRlcnMiIGRpcmVjdG9yeSBvZiB0aGUgYmRldiB0byB0aGUgcGFyZW50IG9mIHRoZSBrb2JqZWN0Ci0gKiAgICAgYmRfcmVsZWFzZV9mcm9tX2tvYmplY3QoKSByZW1vdmVzIHRoZXNlIHN5bWxpbmtzLgotICoKLSAqICAgICBFeGFtcGxlOgotICogICAgICAgIElmIC9kZXYvZG0tMCBtYXBzIHRvIC9kZXYvc2RhLCBrb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8KLSAqICAgICAgICAvc3lzL2Jsb2NrL2RtLTAvc2xhdmVzIGlzIHBhc3NlZCB0byBiZF9jbGFpbV9ieV9rb2JqZWN0KCksIHRoZW46Ci0gKiAgICAgICAgICAgL3N5cy9ibG9jay9kbS0wL3NsYXZlcy9zZGEgLS0+IC9zeXMvYmxvY2svc2RhCi0gKiAgICAgICAgICAgL3N5cy9ibG9jay9zZGEvaG9sZGVycy9kbS0wIC0tPiAvc3lzL2Jsb2NrL2RtLTAKLSAqLwotCiBzdGF0aWMgaW50IGFkZF9zeW1saW5rKHN0cnVjdCBrb2JqZWN0ICpmcm9tLCBzdHJ1Y3Qga29iamVjdCAqdG8pCiB7Ci0JaWYgKCFmcm9tIHx8ICF0bykKLQkJcmV0dXJuIDA7CiAJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKGZyb20sIHRvLCBrb2JqZWN0X25hbWUodG8pKTsKIH0KIAogc3RhdGljIHZvaWQgZGVsX3N5bWxpbmsoc3RydWN0IGtvYmplY3QgKmZyb20sIHN0cnVjdCBrb2JqZWN0ICp0bykKIHsKLQlpZiAoIWZyb20gfHwgIXRvKQotCQlyZXR1cm47CiAJc3lzZnNfcmVtb3ZlX2xpbmsoZnJvbSwga29iamVjdF9uYW1lKHRvKSk7CiB9CiAKLS8qCi0gKiAnc3RydWN0IGJkX2hvbGRlcicgY29udGFpbnMgcG9pbnRlcnMgdG8ga29iamVjdHMgc3ltbGlua2VkIGJ5Ci0gKiBiZF9jbGFpbV9ieV9rb2JqZWN0LgotICogSXQncyBjb25uZWN0ZWQgdG8gYmRfaG9sZGVyX2xpc3Qgd2hpY2ggaXMgcHJvdGVjdGVkIGJ5IGJkZXYtPmJkX3NlbS4KLSAqLwotc3RydWN0IGJkX2hvbGRlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBjaGFpbiBvZiBob2xkZXJzIG9mIHRoZSBiZGV2ICovCi0JaW50IGNvdW50OwkJLyogcmVmZXJlbmNlcyBmcm9tIHRoZSBob2xkZXIgKi8KLQlzdHJ1Y3Qga29iamVjdCAqc2RpcjsJLyogaG9sZGVyIG9iamVjdCwgZS5nLiAiL2Jsb2NrL2RtLTAvc2xhdmVzIiAqLwotCXN0cnVjdCBrb2JqZWN0ICpoZGV2OwkvKiBlLmcuICIvYmxvY2svZG0tMCIgKi8KLQlzdHJ1Y3Qga29iamVjdCAqaGRpcjsJLyogZS5nLiAiL2Jsb2NrL3NkYS9ob2xkZXJzIiAqLwotCXN0cnVjdCBrb2JqZWN0ICpzZGV2OwkvKiBlLmcuICIvYmxvY2svc2RhIiAqLwotfTsKLQotLyoKLSAqIEdldCByZWZlcmVuY2VzIG9mIHJlbGF0ZWQga29iamVjdHMgYXQgb25jZS4KLSAqIFJldHVybnMgMSBvbiBzdWNjZXNzLiAwIG9uIGZhaWx1cmUuCi0gKgotICogU2hvdWxkIGNhbGwgYmRfaG9sZGVyX3JlbGVhc2VfZGlycygpIGFmdGVyIHN1Y2Nlc3NmdWwgdXNlLgotICovCi1zdGF0aWMgaW50IGJkX2hvbGRlcl9ncmFiX2RpcnMoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJCXN0cnVjdCBiZF9ob2xkZXIgKmJvKQotewotCWlmICghYmRldiB8fCAhYm8pCi0JCXJldHVybiAwOwotCi0JYm8tPnNkaXIgPSBrb2JqZWN0X2dldChiby0+c2Rpcik7Ci0JaWYgKCFiby0+c2RpcikKLQkJcmV0dXJuIDA7Ci0KLQliby0+aGRldiA9IGtvYmplY3RfZ2V0KGJvLT5zZGlyLT5wYXJlbnQpOwotCWlmICghYm8tPmhkZXYpCi0JCWdvdG8gZmFpbF9wdXRfc2RpcjsKLQotCWJvLT5zZGV2ID0ga29iamVjdF9nZXQoJnBhcnRfdG9fZGV2KGJkZXYtPmJkX3BhcnQpLT5rb2JqKTsKLQlpZiAoIWJvLT5zZGV2KQotCQlnb3RvIGZhaWxfcHV0X2hkZXY7Ci0KLQliby0+aGRpciA9IGtvYmplY3RfZ2V0KGJkZXYtPmJkX3BhcnQtPmhvbGRlcl9kaXIpOwotCWlmICghYm8tPmhkaXIpCi0JCWdvdG8gZmFpbF9wdXRfc2RldjsKLQotCXJldHVybiAxOwotCi1mYWlsX3B1dF9zZGV2OgotCWtvYmplY3RfcHV0KGJvLT5zZGV2KTsKLWZhaWxfcHV0X2hkZXY6Ci0Ja29iamVjdF9wdXQoYm8tPmhkZXYpOwotZmFpbF9wdXRfc2RpcjoKLQlrb2JqZWN0X3B1dChiby0+c2Rpcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUHV0IHJlZmVyZW5jZXMgb2YgcmVsYXRlZCBrb2JqZWN0cyBhdCBvbmNlLiAqLwotc3RhdGljIHZvaWQgYmRfaG9sZGVyX3JlbGVhc2VfZGlycyhzdHJ1Y3QgYmRfaG9sZGVyICpibykKLXsKLQlrb2JqZWN0X3B1dChiby0+aGRpcik7Ci0Ja29iamVjdF9wdXQoYm8tPnNkZXYpOwotCWtvYmplY3RfcHV0KGJvLT5oZGV2KTsKLQlrb2JqZWN0X3B1dChiby0+c2Rpcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmRfaG9sZGVyICphbGxvY19iZF9ob2xkZXIoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGJkX2hvbGRlciAqYm87Ci0KLQlibyA9IGt6YWxsb2Moc2l6ZW9mKCpibyksIEdGUF9LRVJORUwpOwotCWlmICghYm8pCi0JCXJldHVybiBOVUxMOwotCi0JYm8tPmNvdW50ID0gMTsKLQliby0+c2RpciA9IGtvYmo7Ci0KLQlyZXR1cm4gYm87Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYmRfaG9sZGVyKHN0cnVjdCBiZF9ob2xkZXIgKmJvKQotewotCWtmcmVlKGJvKTsKLX0KLQogLyoqCi0gKiBmaW5kX2JkX2hvbGRlciAtIGZpbmQgbWF0Y2hpbmcgc3RydWN0IGJkX2hvbGRlciBmcm9tIHRoZSBibG9jayBkZXZpY2UKKyAqIGJkX2xpbmtfZGlza19ob2xkZXIgLSBjcmVhdGUgc3ltbGlua3MgYmV0d2VlbiBob2xkaW5nIGRpc2sgYW5kIHNsYXZlIGJkZXYKKyAqIEBiZGV2OiB0aGUgY2xhaW1lZCBzbGF2ZSBiZGV2CisgKiBAZGlzazogdGhlIGhvbGRpbmcgZGlzawogICoKLSAqIEBiZGV2OglzdHJ1Y3QgYmxvY2sgZGV2aWNlIHRvIGJlIHNlYXJjaGVkCi0gKiBAYm86CQl0YXJnZXQgc3RydWN0IGJkX2hvbGRlcgorICogVGhpcyBmdW5jdGlvbnMgY3JlYXRlcyB0aGUgZm9sbG93aW5nIHN5c2ZzIHN5bWxpbmtzLgogICoKLSAqIFJldHVybnMgbWF0Y2hpbmcgZW50cnkgd2l0aCBAYm8gaW4gQGJkZXYtPmJkX2hvbGRlcl9saXN0LgotICogSWYgZm91bmQsIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gdGhlIHBvaW50ZXIuCi0gKiBJZiBub3QgZm91bmQsIHJldHVybnMgTlVMTC4KKyAqIC0gZnJvbSAic2xhdmVzIiBkaXJlY3Rvcnkgb2YgdGhlIGhvbGRlciBAZGlzayB0byB0aGUgY2xhaW1lZCBAYmRldgorICogLSBmcm9tICJob2xkZXJzIiBkaXJlY3Rvcnkgb2YgdGhlIEBiZGV2IHRvIHRoZSBob2xkZXIgQGRpc2sKKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgL2Rldi9kbS0wIG1hcHMgdG8gL2Rldi9zZGEgYW5kIGRpc2sgZm9yIGRtLTAgaXMKKyAqIHBhc3NlZCB0byBiZF9saW5rX2Rpc2tfaG9sZGVyKCksIHRoZW46CisgKgorICogICAvc3lzL2Jsb2NrL2RtLTAvc2xhdmVzL3NkYSAtLT4gL3N5cy9ibG9jay9zZGEKKyAqICAgL3N5cy9ibG9jay9zZGEvaG9sZGVycy9kbS0wIC0tPiAvc3lzL2Jsb2NrL2RtLTAKKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBjbGFpbWVkIEBiZGV2IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kCisgKiBlbnN1cmUgdGhhdCBib3RoIEBiZGV2IGFuZCBAZGlzayBhcmUgdmFsaWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBhbmQKKyAqIGxpZmV0aW1lIG9mIHRoZXNlIHN5bWxpbmtzLgorICoKKyAqIENPTlRFWFQ6CisgKiBNaWdodCBzbGVlcC4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBiZF9ob2xkZXIgKmZpbmRfYmRfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCi0JCQkJCXN0cnVjdCBiZF9ob2xkZXIgKmJvKQoraW50IGJkX2xpbmtfZGlza19ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0Jc3RydWN0IGJkX2hvbGRlciAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZiZGV2LT5iZF9ob2xkZXJfbGlzdCwgbGlzdCkKLQkJaWYgKHRtcC0+c2RpciA9PSBiby0+c2RpcikgewotCQkJdG1wLT5jb3VudCsrOwotCQkJcmV0dXJuIHRtcDsKLQkJfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogYWRkX2JkX2hvbGRlciAtIGNyZWF0ZSBzeXNmcyBzeW1saW5rcyBmb3IgYmRfY2xhaW0oKSByZWxhdGlvbnNoaXAKLSAqCi0gKiBAYmRldjoJYmxvY2sgZGV2aWNlIHRvIGJlIGJkX2NsYWltZWQKLSAqIEBibzoJCXByZWFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYnkgYWxsb2NfYmRfaG9sZGVyKCkKLSAqCi0gKiBBZGQgQGJvIHRvIEBiZGV2LT5iZF9ob2xkZXJfbGlzdCwgY3JlYXRlIHN5bWxpbmtzLgotICoKLSAqIFJldHVybnMgMCBpZiBzeW1saW5rcyBhcmUgY3JlYXRlZC4KLSAqIFJldHVybnMgLXZlIGlmIHNvbWV0aGluZyBmYWlscy4KLSAqLwotc3RhdGljIGludCBhZGRfYmRfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBiZF9ob2xkZXIgKmJvKQotewotCWludCBlcnI7Ci0KLQlpZiAoIWJvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghYmRfaG9sZGVyX2dyYWJfZGlycyhiZGV2LCBibykpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQllcnIgPSBhZGRfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBhZGRfc3ltbGluayhiby0+aGRpciwgYm8tPmhkZXYpOwotCWlmIChlcnIpIHsKLQkJZGVsX3N5bWxpbmsoYm8tPnNkaXIsIGJvLT5zZGV2KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJmJkZXYtPmJkX2hvbGRlcl9saXN0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBkZWxfYmRfaG9sZGVyIC0gZGVsZXRlIHN5c2ZzIHN5bWxpbmtzIGZvciBiZF9jbGFpbSgpIHJlbGF0aW9uc2hpcAotICoKLSAqIEBiZGV2OglibG9jayBkZXZpY2UgdG8gYmUgYmRfY2xhaW1lZAotICogQGtvYmo6CWhvbGRlcidzIGtvYmplY3QKLSAqCi0gKiBJZiB0aGVyZSBpcyBtYXRjaGluZyBlbnRyeSB3aXRoIEBrb2JqIGluIEBiZGV2LT5iZF9ob2xkZXJfbGlzdAotICogYW5kIG5vIG90aGVyIGJkX2NsYWltKCkgZnJvbSB0aGUgc2FtZSBrb2JqZWN0LAotICogcmVtb3ZlIHRoZSBzdHJ1Y3QgYmRfaG9sZGVyIGZyb20gdGhlIGxpc3QsIGRlbGV0ZSBzeW1saW5rcyBmb3IgaXQuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBiZF9ob2xkZXIgd2hlbiBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdAotICogYW5kIHJlYWR5IHRvIGJlIGZyZWVkLgotICogUmV0dXJucyBOVUxMIGlmIG1hdGNoaW5nIGNsYWltIGlzbid0IGZvdW5kIG9yIHRoZXJlIGlzIG90aGVyIGJkX2NsYWltKCkKLSAqIGJ5IHRoZSBzYW1lIGtvYmplY3QuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmRfaG9sZGVyICpkZWxfYmRfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCi0JCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBiZF9ob2xkZXIgKmJvOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShibywgJmJkZXYtPmJkX2hvbGRlcl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiby0+c2RpciA9PSBrb2JqKSB7Ci0JCQliby0+Y291bnQtLTsKLQkJCUJVR19PTihiby0+Y291bnQgPCAwKTsKLQkJCWlmICghYm8tPmNvdW50KSB7Ci0JCQkJbGlzdF9kZWwoJmJvLT5saXN0KTsKLQkJCQlkZWxfc3ltbGluayhiby0+c2RpciwgYm8tPnNkZXYpOwotCQkJCWRlbF9zeW1saW5rKGJvLT5oZGlyLCBiby0+aGRldik7Ci0JCQkJYmRfaG9sZGVyX3JlbGVhc2VfZGlycyhibyk7Ci0JCQkJcmV0dXJuIGJvOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiBiZF9jbGFpbV9ieV9rb2JqZWN0IC0gYmRfY2xhaW0oKSB3aXRoIGFkZGl0aW9uYWwga29iamVjdCBzaWduYXR1cmUKLSAqCi0gKiBAYmRldjoJYmxvY2sgZGV2aWNlIHRvIGJlIGNsYWltZWQKLSAqIEBob2xkZXI6CWhvbGRlcidzIHNpZ25hdHVyZQotICogQGtvYmo6CWhvbGRlcidzIGtvYmplY3QKLSAqCi0gKiBEbyBiZF9jbGFpbSgpIGFuZCBpZiBpdCBzdWNjZWVkcywgY3JlYXRlIHN5c2ZzIHN5bWxpbmtzIGJldHdlZW4KLSAqIHRoZSBiZGV2IGFuZCB0aGUgaG9sZGVyJ3Mga29iamVjdC4KLSAqIFVzZSBiZF9yZWxlYXNlX2Zyb21fa29iamVjdCgpIHdoZW4gcmVsZXNpbmcgdGhlIGNsYWltZWQgYmRldi4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKHNhbWUgYXMgYmRfY2xhaW0oKSkKLSAqIFJldHVybnMgZXJybm8gb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBiZF9jbGFpbV9ieV9rb2JqZWN0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHZvaWQgKmhvbGRlciwKLQkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBiZF9ob2xkZXIgKmJvLCAqZm91bmQ7Ci0KLQlpZiAoIWtvYmopCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYm8gPSBhbGxvY19iZF9ob2xkZXIoa29iaik7Ci0JaWYgKCFibykKLQkJcmV0dXJuIC1FTk9NRU07CisJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7CiAKLQllcnIgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKKwlXQVJOX09OX09OQ0UoIWJkZXYtPmJkX2hvbGRlciB8fCBiZGV2LT5iZF9ob2xkZXJfZGlzayk7CiAKLQlmb3VuZCA9IGZpbmRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKLQlpZiAoZm91bmQpCi0JCWdvdG8gZmFpbDsKKwkvKiBGSVhNRTogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgb25jZSBhZGRfZGlzaygpIGhhbmRsZXMgZXJyb3JzICovCisJaWYgKFdBUk5fT04oIWRpc2stPnNsYXZlX2RpciB8fCAhYmRldi0+YmRfcGFydC0+aG9sZGVyX2RpcikpCisJCWdvdG8gb3V0X3VubG9jazsKIAotCWVyciA9IGFkZF9iZF9ob2xkZXIoYmRldiwgYm8pOwotCWlmIChlcnIpCi0JCWJkX3JlbGVhc2UoYmRldik7Ci0JZWxzZQotCQlibyA9IE5VTEw7Ci1mYWlsOgorCXJldCA9IGFkZF9zeW1saW5rKGRpc2stPnNsYXZlX2RpciwgJnBhcnRfdG9fZGV2KGJkZXYtPmJkX3BhcnQpLT5rb2JqKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZXQgPSBhZGRfc3ltbGluayhiZGV2LT5iZF9wYXJ0LT5ob2xkZXJfZGlyLCAmZGlza190b19kZXYoZGlzayktPmtvYmopOworCWlmIChyZXQpIHsKKwkJZGVsX3N5bWxpbmsoZGlzay0+c2xhdmVfZGlyLCAmcGFydF90b19kZXYoYmRldi0+YmRfcGFydCktPmtvYmopOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJYmRldi0+YmRfaG9sZGVyX2Rpc2sgPSBkaXNrOworb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKLQlmcmVlX2JkX2hvbGRlcihibyk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYmRfbGlua19kaXNrX2hvbGRlcik7CiAKLS8qKgotICogYmRfcmVsZWFzZV9mcm9tX2tvYmplY3QgLSBiZF9yZWxlYXNlKCkgd2l0aCBhZGRpdGlvbmFsIGtvYmplY3Qgc2lnbmF0dXJlCi0gKgotICogQGJkZXY6CWJsb2NrIGRldmljZSB0byBiZSByZWxlYXNlZAotICogQGtvYmo6CWhvbGRlcidzIGtvYmplY3QKLSAqCi0gKiBEbyBiZF9yZWxlYXNlKCkgYW5kIHJlbW92ZSBzeXNmcyBzeW1saW5rcyBjcmVhdGVkIGJ5IGJkX2NsYWltX2J5X2tvYmplY3QoKS4KLSAqLwotc3RhdGljIHZvaWQgYmRfcmVsZWFzZV9mcm9tX2tvYmplY3Qoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJCQkJc3RydWN0IGtvYmplY3QgKmtvYmopCitzdGF0aWMgdm9pZCBiZF91bmxpbmtfZGlza19ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKLQlpZiAoIWtvYmopCisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9ob2xkZXJfZGlzazsKKworCWJkZXYtPmJkX2hvbGRlcl9kaXNrID0gTlVMTDsKKwlpZiAoIWRpc2spCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKLQliZF9yZWxlYXNlKGJkZXYpOwotCWZyZWVfYmRfaG9sZGVyKGRlbF9iZF9ob2xkZXIoYmRldiwga29iaikpOwotCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworCWRlbF9zeW1saW5rKGRpc2stPnNsYXZlX2RpciwgJnBhcnRfdG9fZGV2KGJkZXYtPmJkX3BhcnQpLT5rb2JqKTsKKwlkZWxfc3ltbGluayhiZGV2LT5iZF9wYXJ0LT5ob2xkZXJfZGlyLCAmZGlza190b19kZXYoZGlzayktPmtvYmopOwogfQotCi0vKioKLSAqIGJkX2NsYWltX2J5X2Rpc2sgLSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBiZF9jbGFpbV9ieV9rb2JqZWN0KCkKLSAqCi0gKiBAYmRldjoJYmxvY2sgZGV2aWNlIHRvIGJlIGNsYWltZWQKLSAqIEBob2xkZXI6CWhvbGRlcidzIHNpZ25hdHVyZQotICogQGRpc2s6CWhvbGRlcidzIGdlbmRpc2sKLSAqCi0gKiBDYWxsIGJkX2NsYWltX2J5X2tvYmplY3QoKSB3aXRoIGdldHRpbmcgQGRpc2stPnNsYXZlX2Rpci4KLSAqLwotaW50IGJkX2NsYWltX2J5X2Rpc2soc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdm9pZCAqaG9sZGVyLAotCQkJc3RydWN0IGdlbmRpc2sgKmRpc2spCi17Ci0JcmV0dXJuIGJkX2NsYWltX2J5X2tvYmplY3QoYmRldiwgaG9sZGVyLCBrb2JqZWN0X2dldChkaXNrLT5zbGF2ZV9kaXIpKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJkX2NsYWltX2J5X2Rpc2spOwotCi0vKioKLSAqIGJkX3JlbGVhc2VfZnJvbV9kaXNrIC0gd3JhcHBlciBmdW5jdGlvbiBmb3IgYmRfcmVsZWFzZV9mcm9tX2tvYmplY3QoKQotICoKLSAqIEBiZGV2OglibG9jayBkZXZpY2UgdG8gYmUgY2xhaW1lZAotICogQGRpc2s6CWhvbGRlcidzIGdlbmRpc2sKLSAqCi0gKiBDYWxsIGJkX3JlbGVhc2VfZnJvbV9rb2JqZWN0KCkgYW5kIHB1dCBAZGlzay0+c2xhdmVfZGlyLgotICovCi12b2lkIGJkX3JlbGVhc2VfZnJvbV9kaXNrKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCWJkX3JlbGVhc2VfZnJvbV9rb2JqZWN0KGJkZXYsIGRpc2stPnNsYXZlX2Rpcik7Ci0Ja29iamVjdF9wdXQoZGlzay0+c2xhdmVfZGlyKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJkX3JlbGVhc2VfZnJvbV9kaXNrKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYmRfdW5saW5rX2Rpc2tfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7IH0KICNlbmRpZgogCi0vKgotICogVHJpZXMgdG8gb3BlbiBibG9jayBkZXZpY2UgYnkgZGV2aWNlIG51bWJlci4gIFVzZSBpdCBPTkxZIGlmIHlvdQotICogcmVhbGx5IGRvIG5vdCBoYXZlIGFueXRoaW5nIGJldHRlciAtIGkuZS4gd2hlbiB5b3UgYXJlIGJlaGluZCBhCi0gKiB0cnVseSBzdWNreSBpbnRlcmZhY2UgYW5kIGFsbCB5b3UgYXJlIGdpdmVuIGlzIGEgZGV2aWNlIG51bWJlci4gIF9OZXZlcl8KLSAqIHRvIGJlIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzLiAgSWYgeW91IGV2ZXIgbmVlZCBpdCAtIHJlY29uc2lkZXIKLSAqIHlvdXIgQVBJLgotICovCi1zdHJ1Y3QgYmxvY2tfZGV2aWNlICpvcGVuX2J5X2Rldm51bShkZXZfdCBkZXYsIGZtb2RlX3QgbW9kZSkKLXsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmRnZXQoZGV2KTsKLQlpbnQgZXJyID0gLUVOT01FTTsKLQlpZiAoYmRldikKLQkJZXJyID0gYmxrZGV2X2dldChiZGV2LCBtb2RlKTsKLQlyZXR1cm4gZXJyID8gRVJSX1BUUihlcnIpIDogYmRldjsKLX0KLQotRVhQT1JUX1NZTUJPTChvcGVuX2J5X2Rldm51bSk7Ci0KIC8qKgogICogZmx1c2hfZGlzayAtIGludmFsaWRhdGVzIGFsbCBidWZmZXItY2FjaGUgZW50cmllcyBvbiBhIGRpc2sKICAqCkBAIC0xMzA5LDEwICs5NTQsMTEgQEAKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CiAJY29uc3Qgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zICpiZG9wcyA9IGRpc2stPmZvcHM7CisJdW5zaWduZWQgaW50IGV2ZW50czsKIAotCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQpCi0JCXJldHVybiAwOwotCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQoYmRldi0+YmRfZGlzaykpCisJZXZlbnRzID0gZGlza19jbGVhcl9ldmVudHMoZGlzaywgRElTS19FVkVOVF9NRURJQV9DSEFOR0UgfAorCQkJCSAgIERJU0tfRVZFTlRfRUpFQ1RfUkVRVUVTVCk7CisJaWYgKCEoZXZlbnRzICYgRElTS19FVkVOVF9NRURJQV9DSEFOR0UpKQogCQlyZXR1cm4gMDsKIAogCWZsdXNoX2Rpc2soYmRldik7CkBAIC0xNDc1LDE3ICsxMTIxLDE3MSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSkKKy8qKgorICogYmxrZGV2X2dldCAtIG9wZW4gYSBibG9jayBkZXZpY2UKKyAqIEBiZGV2OiBibG9ja19kZXZpY2UgdG8gb3BlbgorICogQG1vZGU6IEZNT0RFXyogbWFzaworICogQGhvbGRlcjogZXhjbHVzaXZlIGhvbGRlciBpZGVudGlmaWVyCisgKgorICogT3BlbiBAYmRldiB3aXRoIEBtb2RlLiAgSWYgQG1vZGUgaW5jbHVkZXMgJUZNT0RFX0VYQ0wsIEBiZGV2IGlzCisgKiBvcGVuIHdpdGggZXhjbHVzaXZlIGFjY2Vzcy4gIFNwZWNpZnlpbmcgJUZNT0RFX0VYQ0wgd2l0aCAlTlVMTAorICogQGhvbGRlciBpcyBpbnZhbGlkLiAgRXhjbHVzaXZlIG9wZW5zIG1heSBuZXN0IGZvciB0aGUgc2FtZSBAaG9sZGVyLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoZSByZWZlcmVuY2UgY291bnQgb2YgQGJkZXYgaXMgdW5jaGFuZ2VkLiAgT24gZmFpbHVyZSwKKyAqIEBiZGV2IGlzIHB1dC4KKyAqCisgKiBDT05URVhUOgorICogTWlnaHQgc2xlZXAuCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBibGtkZXZfZ2V0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwgdm9pZCAqaG9sZGVyKQogewotCXJldHVybiBfX2Jsa2Rldl9nZXQoYmRldiwgbW9kZSwgMCk7CisJc3RydWN0IGJsb2NrX2RldmljZSAqd2hvbGUgPSBOVUxMOworCWludCByZXM7CisKKwlXQVJOX09OX09OQ0UoKG1vZGUgJiBGTU9ERV9FWENMKSAmJiAhaG9sZGVyKTsKKworCWlmICgobW9kZSAmIEZNT0RFX0VYQ0wpICYmIGhvbGRlcikgeworCQl3aG9sZSA9IGJkX3N0YXJ0X2NsYWltaW5nKGJkZXYsIGhvbGRlcik7CisJCWlmIChJU19FUlIod2hvbGUpKSB7CisJCQliZHB1dChiZGV2KTsKKwkJCXJldHVybiBQVFJfRVJSKHdob2xlKTsKKwkJfQorCX0KKworCXJlcyA9IF9fYmxrZGV2X2dldChiZGV2LCBtb2RlLCAwKTsKKworCS8qIF9fYmxrZGV2X2dldCgpIG1heSBhbHRlciByZWFkIG9ubHkgc3RhdHVzLCBjaGVjayBpdCBhZnRlcndhcmRzICovCisJaWYgKCFyZXMgJiYgKG1vZGUgJiBGTU9ERV9XUklURSkgJiYgYmRldl9yZWFkX29ubHkoYmRldikpIHsKKwkJX19ibGtkZXZfcHV0KGJkZXYsIG1vZGUsIDApOworCQlyZXMgPSAtRUFDQ0VTOworCX0KKworCWlmICh3aG9sZSkgeworCQkvKiBmaW5pc2ggY2xhaW1pbmcgKi8KKwkJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOworCQlzcGluX2xvY2soJmJkZXZfbG9jayk7CisKKwkJaWYgKCFyZXMpIHsKKwkJCUJVR19PTighYmRfbWF5X2NsYWltKGJkZXYsIHdob2xlLCBob2xkZXIpKTsKKwkJCS8qCisJCQkgKiBOb3RlIHRoYXQgZm9yIGEgd2hvbGUgZGV2aWNlIGJkX2hvbGRlcnMKKwkJCSAqIHdpbGwgYmUgaW5jcmVtZW50ZWQgdHdpY2UsIGFuZCBiZF9ob2xkZXIKKwkJCSAqIHdpbGwgYmUgc2V0IHRvIGJkX21heV9jbGFpbSBiZWZvcmUgYmVpbmcKKwkJCSAqIHNldCB0byBob2xkZXIKKwkJCSAqLworCQkJd2hvbGUtPmJkX2hvbGRlcnMrKzsKKwkJCXdob2xlLT5iZF9ob2xkZXIgPSBiZF9tYXlfY2xhaW07CisJCQliZGV2LT5iZF9ob2xkZXJzKys7CisJCQliZGV2LT5iZF9ob2xkZXIgPSBob2xkZXI7CisJCX0KKworCQkvKiB0ZWxsIG90aGVycyB0aGF0IHdlJ3JlIGRvbmUgKi8KKwkJQlVHX09OKHdob2xlLT5iZF9jbGFpbWluZyAhPSBob2xkZXIpOworCQl3aG9sZS0+YmRfY2xhaW1pbmcgPSBOVUxMOworCQl3YWtlX3VwX2JpdCgmd2hvbGUtPmJkX2NsYWltaW5nLCAwKTsKKworCQlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKworCQkvKgorCQkgKiBCbG9jayBldmVudCBwb2xsaW5nIGZvciB3cml0ZSBjbGFpbXMuICBBbnkgd3JpdGUKKwkJICogaG9sZGVyIG1ha2VzIHRoZSB3cml0ZV9ob2xkZXIgc3RhdGUgc3RpY2sgdW50aWwgYWxsCisJCSAqIGFyZSByZWxlYXNlZC4gIFRoaXMgaXMgZ29vZCBlbm91Z2ggYW5kIHRyYWNraW5nCisJCSAqIGluZGl2aWR1YWwgd3JpdGVhYmxlIHJlZmVyZW5jZSBpcyB0b28gZnJhZ2lsZSBnaXZlbgorCQkgKiB0aGUgd2F5IEBtb2RlIGlzIHVzZWQgaW4gYmxrZGV2X2dldC9wdXQoKS4KKwkJICovCisJCWlmICghcmVzICYmIChtb2RlICYgRk1PREVfV1JJVEUpICYmICFiZGV2LT5iZF93cml0ZV9ob2xkZXIpIHsKKwkJCWJkZXYtPmJkX3dyaXRlX2hvbGRlciA9IHRydWU7CisJCQlkaXNrX2Jsb2NrX2V2ZW50cyhiZGV2LT5iZF9kaXNrKTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworCQliZHB1dCh3aG9sZSk7CisJfQorCisJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0woYmxrZGV2X2dldCk7CiAKKy8qKgorICogYmxrZGV2X2dldF9ieV9wYXRoIC0gb3BlbiBhIGJsb2NrIGRldmljZSBieSBuYW1lCisgKiBAcGF0aDogcGF0aCB0byB0aGUgYmxvY2sgZGV2aWNlIHRvIG9wZW4KKyAqIEBtb2RlOiBGTU9ERV8qIG1hc2sKKyAqIEBob2xkZXI6IGV4Y2x1c2l2ZSBob2xkZXIgaWRlbnRpZmllcgorICoKKyAqIE9wZW4gdGhlIGJsb2NrZGV2aWNlIGRlc2NyaWJlZCBieSB0aGUgZGV2aWNlIGZpbGUgYXQgQHBhdGguICBAbW9kZQorICogYW5kIEBob2xkZXIgYXJlIGlkZW50aWNhbCB0byBibGtkZXZfZ2V0KCkuCisgKgorICogT24gc3VjY2VzcywgdGhlIHJldHVybmVkIGJsb2NrX2RldmljZSBoYXMgcmVmZXJlbmNlIGNvdW50IG9mIG9uZS4KKyAqCisgKiBDT05URVhUOgorICogTWlnaHQgc2xlZXAuCisgKgorICogUkVUVVJOUzoKKyAqIFBvaW50ZXIgdG8gYmxvY2tfZGV2aWNlIG9uIHN1Y2Nlc3MsIEVSUl9QVFIoLWVycm5vKSBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpibGtkZXZfZ2V0X2J5X3BhdGgoY29uc3QgY2hhciAqcGF0aCwgZm1vZGVfdCBtb2RlLAorCQkJCQl2b2lkICpob2xkZXIpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgZXJyOworCisJYmRldiA9IGxvb2t1cF9iZGV2KHBhdGgpOworCWlmIChJU19FUlIoYmRldikpCisJCXJldHVybiBiZGV2OworCisJZXJyID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCBob2xkZXIpOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwlyZXR1cm4gYmRldjsKK30KK0VYUE9SVF9TWU1CT0woYmxrZGV2X2dldF9ieV9wYXRoKTsKKworLyoqCisgKiBibGtkZXZfZ2V0X2J5X2RldiAtIG9wZW4gYSBibG9jayBkZXZpY2UgYnkgZGV2aWNlIG51bWJlcgorICogQGRldjogZGV2aWNlIG51bWJlciBvZiBibG9jayBkZXZpY2UgdG8gb3BlbgorICogQG1vZGU6IEZNT0RFXyogbWFzaworICogQGhvbGRlcjogZXhjbHVzaXZlIGhvbGRlciBpZGVudGlmaWVyCisgKgorICogT3BlbiB0aGUgYmxvY2tkZXZpY2UgZGVzY3JpYmVkIGJ5IGRldmljZSBudW1iZXIgQGRldi4gIEBtb2RlIGFuZAorICogQGhvbGRlciBhcmUgaWRlbnRpY2FsIHRvIGJsa2Rldl9nZXQoKS4KKyAqCisgKiBVc2UgaXQgT05MWSBpZiB5b3UgcmVhbGx5IGRvIG5vdCBoYXZlIGFueXRoaW5nIGJldHRlciAtIGkuZS4gd2hlbgorICogeW91IGFyZSBiZWhpbmQgYSB0cnVseSBzdWNreSBpbnRlcmZhY2UgYW5kIGFsbCB5b3UgYXJlIGdpdmVuIGlzIGEKKyAqIGRldmljZSBudW1iZXIuICBfTmV2ZXJfIHRvIGJlIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzLiAgSWYgeW91CisgKiBldmVyIG5lZWQgaXQgLSByZWNvbnNpZGVyIHlvdXIgQVBJLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm5lZCBibG9ja19kZXZpY2UgaGFzIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUuCisgKgorICogQ09OVEVYVDoKKyAqIE1pZ2h0IHNsZWVwLgorICoKKyAqIFJFVFVSTlM6CisgKiBQb2ludGVyIHRvIGJsb2NrX2RldmljZSBvbiBzdWNjZXNzLCBFUlJfUFRSKC1lcnJubykgb24gZmFpbHVyZS4KKyAqLworc3RydWN0IGJsb2NrX2RldmljZSAqYmxrZGV2X2dldF9ieV9kZXYoZGV2X3QgZGV2LCBmbW9kZV90IG1vZGUsIHZvaWQgKmhvbGRlcikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCBlcnI7CisKKwliZGV2ID0gYmRnZXQoZGV2KTsKKwlpZiAoIWJkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCBob2xkZXIpOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwlyZXR1cm4gYmRldjsKK30KK0VYUE9SVF9TWU1CT0woYmxrZGV2X2dldF9ieV9kZXYpOworCiBzdGF0aWMgaW50IGJsa2Rldl9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqd2hvbGUgPSBOVUxMOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0JaW50IHJlczsKIAogCS8qCiAJICogUHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kIGFsbG93IGxhcmdlIGZpbGUgYWNjZXNzCkBAIC0xNTA2LDI2ICsxMzA2LDkgQEAKIAlpZiAoYmRldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9FWENMKSB7Ci0JCXdob2xlID0gYmRfc3RhcnRfY2xhaW1pbmcoYmRldiwgZmlscCk7Ci0JCWlmIChJU19FUlIod2hvbGUpKSB7Ci0JCQliZHB1dChiZGV2KTsKLQkJCXJldHVybiBQVFJfRVJSKHdob2xlKTsKLQkJfQotCX0KLQogCWZpbHAtPmZfbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CiAKLQlyZXMgPSBibGtkZXZfZ2V0KGJkZXYsIGZpbHAtPmZfbW9kZSk7Ci0KLQlpZiAod2hvbGUpIHsKLQkJaWYgKHJlcyA9PSAwKQotCQkJYmRfZmluaXNoX2NsYWltaW5nKGJkZXYsIHdob2xlLCBmaWxwKTsKLQkJZWxzZQotCQkJYmRfYWJvcnRfY2xhaW1pbmcod2hvbGUsIGZpbHApOwotCX0KLQotCXJldHVybiByZXM7CisJcmV0dXJuIGJsa2Rldl9nZXQoYmRldiwgZmlscC0+Zl9tb2RlLCBmaWxwKTsKIH0KIAogc3RhdGljIGludCBfX2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLCBpbnQgZm9yX3BhcnQpCkBAIC0xNTM5LDYgKzEzMjIsNyBAQAogCQliZGV2LT5iZF9wYXJ0X2NvdW50LS07CiAKIAlpZiAoIS0tYmRldi0+YmRfb3BlbmVycykgeworCQlXQVJOX09OX09OQ0UoYmRldi0+YmRfaG9sZGVycyk7CiAJCXN5bmNfYmxvY2tkZXYoYmRldik7CiAJCWtpbGxfYmRldihiZGV2KTsKIAl9CkBAIC0xNTY5LDYgKzEzNTMsNDUgQEAKIAogaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQogeworCWlmIChtb2RlICYgRk1PREVfRVhDTCkgeworCQlib29sIGJkZXZfZnJlZTsKKworCQkvKgorCQkgKiBSZWxlYXNlIGEgY2xhaW0gb24gdGhlIGRldmljZS4gIFRoZSBob2xkZXIgZmllbGRzCisJCSAqIGFyZSBwcm90ZWN0ZWQgd2l0aCBiZGV2X2xvY2suICBiZF9tdXRleCBpcyB0bworCQkgKiBzeW5jaHJvbml6ZSBkaXNrX2hvbGRlciB1bmxpbmtpbmcuCisJCSAqLworCQltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7CisJCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKworCQlXQVJOX09OX09OQ0UoLS1iZGV2LT5iZF9ob2xkZXJzIDwgMCk7CisJCVdBUk5fT05fT05DRSgtLWJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXJzIDwgMCk7CisKKwkJLyogYmRfY29udGFpbnMgbWlnaHQgcG9pbnQgdG8gc2VsZiwgY2hlY2sgaW4gYSBzZXBhcmF0ZSBzdGVwICovCisJCWlmICgoYmRldl9mcmVlID0gIWJkZXYtPmJkX2hvbGRlcnMpKQorCQkJYmRldi0+YmRfaG9sZGVyID0gTlVMTDsKKwkJaWYgKCFiZGV2LT5iZF9jb250YWlucy0+YmRfaG9sZGVycykKKwkJCWJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgPSBOVUxMOworCisJCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOworCisJCS8qCisJCSAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNsYWltLCByZW1vdmUgaG9sZGVyIGxpbmsgYW5kCisJCSAqIHVuYmxvY2sgZXZwb2xsIGlmIGl0IHdhcyBhIHdyaXRlIGhvbGRlci4KKwkJICovCisJCWlmIChiZGV2X2ZyZWUpIHsKKwkJCWJkX3VubGlua19kaXNrX2hvbGRlcihiZGV2KTsKKwkJCWlmIChiZGV2LT5iZF93cml0ZV9ob2xkZXIpIHsKKwkJCQlkaXNrX3VuYmxvY2tfZXZlbnRzKGJkZXYtPmJkX2Rpc2spOworCQkJCWJkZXYtPmJkX3dyaXRlX2hvbGRlciA9IGZhbHNlOworCQkJfSBlbHNlCisJCQkJZGlza19jaGVja19ldmVudHMoYmRldi0+YmRfZGlzayk7CisJCX0KKworCQltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKKwl9IGVsc2UKKwkJZGlza19jaGVja19ldmVudHMoYmRldi0+YmRfZGlzayk7CisKIAlyZXR1cm4gX19ibGtkZXZfcHV0KGJkZXYsIG1vZGUsIDApOwogfQogRVhQT1JUX1NZTUJPTChibGtkZXZfcHV0KTsKQEAgLTE1NzYsOCArMTM5OSw3IEBACiBzdGF0aWMgaW50IGJsa2Rldl9jbG9zZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoZmlscC0+Zl9tYXBwaW5nLT5ob3N0KTsKLQlpZiAoYmRldi0+YmRfaG9sZGVyID09IGZpbHApCi0JCWJkX3JlbGVhc2UoYmRldik7CisKIAlyZXR1cm4gYmxrZGV2X3B1dChiZGV2LCBmaWxwLT5mX21vZGUpOwogfQogCkBAIC0xNzIyLDY3ICsxNTQ0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobG9va3VwX2JkZXYpOwogCi0vKioKLSAqIG9wZW5fYmRldl9leGNsdXNpdmUgIC0gIG9wZW4gYSBibG9jayBkZXZpY2UgYnkgbmFtZSBhbmQgc2V0IGl0IHVwIGZvciB1c2UKLSAqCi0gKiBAcGF0aDoJc3BlY2lhbCBmaWxlIHJlcHJlc2VudGluZyB0aGUgYmxvY2sgZGV2aWNlCi0gKiBAbW9kZToJRk1PREVfLi4uIGNvbWJpbmF0aW9uIHRvIHBhc3MgYmUgdXNlZAotICogQGhvbGRlcjoJb3duZXIgZm9yIGV4Y2x1c2lvbgotICoKLSAqIE9wZW4gdGhlIGJsb2NrZGV2aWNlIGRlc2NyaWJlZCBieSB0aGUgc3BlY2lhbCBmaWxlIGF0IEBwYXRoLCBjbGFpbSBpdAotICogZm9yIHRoZSBAaG9sZGVyLgotICovCi1zdHJ1Y3QgYmxvY2tfZGV2aWNlICpvcGVuX2JkZXZfZXhjbHVzaXZlKGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwgdm9pZCAqaG9sZGVyKQotewotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsICp3aG9sZTsKLQlpbnQgZXJyb3I7Ci0KLQliZGV2ID0gbG9va3VwX2JkZXYocGF0aCk7Ci0JaWYgKElTX0VSUihiZGV2KSkKLQkJcmV0dXJuIGJkZXY7Ci0KLQl3aG9sZSA9IGJkX3N0YXJ0X2NsYWltaW5nKGJkZXYsIGhvbGRlcik7Ci0JaWYgKElTX0VSUih3aG9sZSkpIHsKLQkJYmRwdXQoYmRldik7Ci0JCXJldHVybiB3aG9sZTsKLQl9Ci0KLQllcnJvciA9IGJsa2Rldl9nZXQoYmRldiwgbW9kZSk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9hYm9ydF9jbGFpbWluZzsKLQotCWVycm9yID0gLUVBQ0NFUzsKLQlpZiAoKG1vZGUgJiBGTU9ERV9XUklURSkgJiYgYmRldl9yZWFkX29ubHkoYmRldikpCi0JCWdvdG8gb3V0X2Jsa2Rldl9wdXQ7Ci0KLQliZF9maW5pc2hfY2xhaW1pbmcoYmRldiwgd2hvbGUsIGhvbGRlcik7Ci0JcmV0dXJuIGJkZXY7Ci0KLW91dF9ibGtkZXZfcHV0OgotCWJsa2Rldl9wdXQoYmRldiwgbW9kZSk7Ci1vdXRfYWJvcnRfY2xhaW1pbmc6Ci0JYmRfYWJvcnRfY2xhaW1pbmcod2hvbGUsIGhvbGRlcik7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotfQotCi1FWFBPUlRfU1lNQk9MKG9wZW5fYmRldl9leGNsdXNpdmUpOwotCi0vKioKLSAqIGNsb3NlX2JkZXZfZXhjbHVzaXZlICAtICBjbG9zZSBhIGJsb2NrZGV2aWNlIG9wZW5lZCBieSBvcGVuX2JkZXZfZXhjbHVzaXZlKCkKLSAqCi0gKiBAYmRldjoJYmxvY2tkZXZpY2UgdG8gY2xvc2UKLSAqIEBtb2RlOgltb2RlLCBtdXN0IG1hdGNoIHRoYXQgdXNlZCB0byBvcGVuLgotICoKLSAqIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIG9wZW5fYmRldl9leGNsdXNpdmUoKS4KLSAqLwotdm9pZCBjbG9zZV9iZGV2X2V4Y2x1c2l2ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCi17Ci0JYmRfcmVsZWFzZShiZGV2KTsKLQlibGtkZXZfcHV0KGJkZXYsIG1vZGUpOwotfQotCi1FWFBPUlRfU1lNQk9MKGNsb3NlX2JkZXZfZXhjbHVzaXZlKTsKLQogaW50IF9faW52YWxpZGF0ZV9kZXZpY2Uoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZ2V0X3N1cGVyKGJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXhwb3J0LmMgYi9mcy9idHJmcy9leHBvcnQuYwppbmRleCAwY2NmOWE4Li45Nzg2OTYzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHBvcnQuYworKysgYi9mcy9idHJmcy9leHBvcnQuYwpAQCAtNjUsNyArNjUsNiBAQAogewogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gYnRyZnNfc2Ioc2IpLT5mc19pbmZvOwogCXN0cnVjdCBidHJmc19yb290ICpyb290OwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCBpbmRleDsKQEAgLTEwOCwxMCArMTA3LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQogCi0JZGVudHJ5ID0gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOwotCWlmICghSVNfRVJSKGRlbnRyeSkpCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmYnRyZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCXJldHVybiBkZW50cnk7CisJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGlub2RlKTsKIGZhaWw6CiAJc3JjdV9yZWFkX3VubG9jaygmZnNfaW5mby0+c3Vidm9sX3NyY3UsIGluZGV4KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMTY2LDcgKzE2Miw2IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYnRyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IGNoaWxkLT5kX2lub2RlOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koZGlyKS0+cm9vdDsKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKQEAgLTIyMywxMCArMjE4LDcgQEAKIAogCWtleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CiAJa2V5Lm9mZnNldCA9IDA7Ci0JZGVudHJ5ID0gZF9vYnRhaW5fYWxpYXMoYnRyZnNfaWdldChyb290LT5mc19pbmZvLT5zYiwgJmtleSwgcm9vdCwgTlVMTCkpOwotCWlmICghSVNfRVJSKGRlbnRyeSkpCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmYnRyZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCXJldHVybiBkZW50cnk7CisJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGJ0cmZzX2lnZXQocm9vdC0+ZnNfaW5mby0+c2IsICZrZXksIHJvb3QsIE5VTEwpKTsKIGZhaWw6CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCBhMGZmNDZhLi5hMzc5OGEzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTQwODQsOCArNDA4NCw2IEBACiAJaW50IGluZGV4OwogCWludCByZXQ7CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgJmJ0cmZzX2RlbnRyeV9vcGVyYXRpb25zKTsKLQogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBCVFJGU19OQU1FX0xFTikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKQEAgLTcxMTcsNiArNzExNSwxMCBAQAogCWFsbG9jX3N0YXJ0ID0gb2Zmc2V0ICYgfm1hc2s7CiAJYWxsb2NfZW5kID0gIChvZmZzZXQgKyBsZW4gKyBtYXNrKSAmIH5tYXNrOwogCisJLyogV2Ugb25seSBzdXBwb3J0IHRoZSBGQUxMT0NfRkxfS0VFUF9TSVpFIG1vZGUgKi8KKwlpZiAobW9kZSAmJiAobW9kZSAhPSBGQUxMT0NfRkxfS0VFUF9TSVpFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJLyoKIAkgKiB3YWl0IGZvciBvcmRlcmVkIElPIGJlZm9yZSB3ZSBoYXZlIGFueSBsb2Nrcy4gIFdlJ2xsIGxvb3AgYWdhaW4KIAkgKiBiZWxvdyB3aXRoIHRoZSBsb2NrcyBoZWxkLgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggODgzYzZmYS4uMjJhY2RhYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC00NjAsNiArNDYwLDcgQEAKIAlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CiAJc2ItPnNfbWFnaWMgPSBCVFJGU19TVVBFUl9NQUdJQzsKIAlzYi0+c19vcCA9ICZidHJmc19zdXBlcl9vcHM7CisJc2ItPnNfZF9vcCA9ICZidHJmc19kZW50cnlfb3BlcmF0aW9uczsKIAlzYi0+c19leHBvcnRfb3AgPSAmYnRyZnNfZXhwb3J0X29wczsKIAlzYi0+c194YXR0ciA9IGJ0cmZzX3hhdHRyX2hhbmRsZXJzOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggNmI5ODg0NS4uMTcxOGUxYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoZGV2aWNlLT5iZGV2KSB7Ci0JCQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7CisJCQlibGtkZXZfcHV0KGRldmljZS0+YmRldiwgZGV2aWNlLT5tb2RlKTsKIAkJCWRldmljZS0+YmRldiA9IE5VTEw7CiAJCQlmc19kZXZpY2VzLT5vcGVuX2RldmljZXMtLTsKIAkJfQpAQCAtNTI3LDcgKzUyNyw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmZzX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CiAJCWlmIChkZXZpY2UtPmJkZXYpIHsKLQkJCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGRldmljZS0+YmRldiwgZGV2aWNlLT5tb2RlKTsKKwkJCWJsa2Rldl9wdXQoZGV2aWNlLT5iZGV2LCBkZXZpY2UtPm1vZGUpOwogCQkJZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzLS07CiAJCX0KIAkJaWYgKGRldmljZS0+d3JpdGVhYmxlKSB7CkBAIC01ODQsMTMgKzU4NCwxNSBAQAogCWludCBzZWVkaW5nID0gMTsKIAlpbnQgcmV0ID0gMDsKIAorCWZsYWdzIHw9IEZNT0RFX0VYQ0w7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgaGVhZCwgZGV2X2xpc3QpIHsKIAkJaWYgKGRldmljZS0+YmRldikKIAkJCWNvbnRpbnVlOwogCQlpZiAoIWRldmljZS0+bmFtZSkKIAkJCWNvbnRpbnVlOwogCi0JCWJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldmljZS0+bmFtZSwgZmxhZ3MsIGhvbGRlcik7CisJCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgoZGV2aWNlLT5uYW1lLCBmbGFncywgaG9sZGVyKTsKIAkJaWYgKElTX0VSUihiZGV2KSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAib3BlbiAlcyBmYWlsZWRcbiIsIGRldmljZS0+bmFtZSk7CiAJCQlnb3RvIGVycm9yOwpAQCAtNjQyLDcgKzY0NCw3IEBACiBlcnJvcl9icmVsc2U6CiAJCWJyZWxzZShiaCk7CiBlcnJvcl9jbG9zZToKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgRk1PREVfUkVBRCk7CisJCWJsa2Rldl9wdXQoYmRldiwgZmxhZ3MpOwogZXJyb3I6CiAJCWNvbnRpbnVlOwogCX0KQEAgLTY4OCw3ICs2OTAsOCBAQAogCiAJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CiAKLQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShwYXRoLCBmbGFncywgaG9sZGVyKTsKKwlmbGFncyB8PSBGTU9ERV9FWENMOworCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgocGF0aCwgZmxhZ3MsIGhvbGRlcik7CiAKIAlpZiAoSVNfRVJSKGJkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoYmRldik7CkBAIC03MjAsNyArNzIzLDcgQEAKIAogCWJyZWxzZShiaCk7CiBlcnJvcl9jbG9zZToKLQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCBmbGFncyk7CisJYmxrZGV2X3B1dChiZGV2LCBmbGFncyk7CiBlcnJvcjoKIAltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xMTgzLDggKzExODYsOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAl9IGVsc2UgewotCQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShkZXZpY2VfcGF0aCwgRk1PREVfUkVBRCwKLQkJCQkgICAgICByb290LT5mc19pbmZvLT5iZGV2X2hvbGRlcik7CisJCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgoZGV2aWNlX3BhdGgsIEZNT0RFX1JFQUQgfCBGTU9ERV9FWENMLAorCQkJCQkgIHJvb3QtPmZzX2luZm8tPmJkZXZfaG9sZGVyKTsKIAkJaWYgKElTX0VSUihiZGV2KSkgewogCQkJcmV0ID0gUFRSX0VSUihiZGV2KTsKIAkJCWdvdG8gb3V0OwpAQCAtMTI1MSw3ICsxMjU0LDcgQEAKIAkJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bGF0ZXN0X2JkZXYgPSBuZXh0X2RldmljZS0+YmRldjsKIAogCWlmIChkZXZpY2UtPmJkZXYpIHsKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoZGV2aWNlLT5iZGV2LCBkZXZpY2UtPm1vZGUpOworCQlibGtkZXZfcHV0KGRldmljZS0+YmRldiwgZGV2aWNlLT5tb2RlKTsKIAkJZGV2aWNlLT5iZGV2ID0gTlVMTDsKIAkJZGV2aWNlLT5mc19kZXZpY2VzLT5vcGVuX2RldmljZXMtLTsKIAl9CkBAIC0xMjk0LDcgKzEyOTcsNyBAQAogCWJyZWxzZShiaCk7CiBlcnJvcl9jbG9zZToKIAlpZiAoYmRldikKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgRk1PREVfUkVBRCk7CisJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRCB8IEZNT0RFX0VYQ0wpOwogb3V0OgogCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dm9sdW1lX211dGV4KTsKIAltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOwpAQCAtMTQ0Niw3ICsxNDQ5LDggQEAKIAlpZiAoKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+c2VlZGluZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShkZXZpY2VfcGF0aCwgMCwgcm9vdC0+ZnNfaW5mby0+YmRldl9ob2xkZXIpOworCWJkZXYgPSBibGtkZXZfZ2V0X2J5X3BhdGgoZGV2aWNlX3BhdGgsIEZNT0RFX0VYQ0wsCisJCQkJICByb290LT5mc19pbmZvLT5iZGV2X2hvbGRlcik7CiAJaWYgKElTX0VSUihiZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoYmRldik7CiAKQEAgLTE1NzIsNyArMTU3Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOwogCXJldHVybiByZXQ7CiBlcnJvcjoKLQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCAwKTsKKwlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX0VYQ0wpOwogCWlmIChzZWVkaW5nX2RldikgewogCQltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOwogCQl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ZvbHVtZXMuaCBiL2ZzL2J0cmZzL3ZvbHVtZXMuaAppbmRleCAyNzQwZGI0OS4uMWJlNzgxMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5oCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuaApAQCAtNTAsNyArNTAsNyBAQAogCiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAotCS8qIHRoZSBtb2RlIHNlbnQgdG8gb3Blbl9iZGV2X2V4Y2x1c2l2ZSAqLworCS8qIHRoZSBtb2RlIHNlbnQgdG8gYmxrZGV2X2dldCAqLwogCWZtb2RlX3QgbW9kZTsKIAogCWNoYXIgKm5hbWU7CmRpZmYgLS1naXQgYS9mcy9jZXBoL01ha2VmaWxlIGIvZnMvY2VwaC9NYWtlZmlsZQppbmRleCA5ZTZjNGYyLi5iZDM1MjEyIDEwMDY0NAotLS0gYS9mcy9jZXBoL01ha2VmaWxlCisrKyBiL2ZzL2NlcGgvTWFrZWZpbGUKQEAgLTIsMzEgKzIsMTAgQEAKICMgTWFrZWZpbGUgZm9yIENFUEggZmlsZXN5c3RlbS4KICMKIAotaWZuZXEgKCQoS0VSTkVMUkVMRUFTRSksKQotCiBvYmotJChDT05GSUdfQ0VQSF9GUykgKz0gY2VwaC5vCiAKLWNlcGgtb2JqcyA6PSBzdXBlci5vIGlub2RlLm8gZGlyLm8gZmlsZS5vIGxvY2tzLm8gYWRkci5vIGlvY3RsLm8gXAorY2VwaC15IDo9IHN1cGVyLm8gaW5vZGUubyBkaXIubyBmaWxlLm8gbG9ja3MubyBhZGRyLm8gaW9jdGwubyBcCiAJZXhwb3J0Lm8gY2Fwcy5vIHNuYXAubyB4YXR0ci5vIFwKIAltZHNfY2xpZW50Lm8gbWRzbWFwLm8gc3RyaW5ncy5vIGNlcGhfZnJhZy5vIFwKIAlkZWJ1Z2ZzLm8KIAotZWxzZQotI090aGVyd2lzZSB3ZSB3ZXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kCi0jIGxpbmU7IGludm9rZSB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4KLQotS0VSTkVMRElSID89IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAotUFdEIDo9ICQoc2hlbGwgcHdkKQotCi1kZWZhdWx0OiBhbGwKLQotYWxsOgotCSQoTUFLRSkgLUMgJChLRVJORUxESVIpIE09JChQV0QpIENPTkZJR19DRVBIX0ZTPW0gbW9kdWxlcwotCi1tb2R1bGVzX2luc3RhbGw6Ci0JJChNQUtFKSAtQyAkKEtFUk5FTERJUikgTT0kKFBXRCkgQ09ORklHX0NFUEhfRlM9bSBtb2R1bGVzX2luc3RhbGwKLQotY2xlYW46Ci0JJChNQUtFKSAtQyAkKEtFUk5FTERJUikgTT0kKFBXRCkgY2xlYW4KLQotZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvZGVidWdmcy5jIGIvZnMvY2VwaC9kZWJ1Z2ZzLmMKaW5kZXggN2FlMWIzZC4uMDhmNjVmYSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kZWJ1Z2ZzLmMKKysrIGIvZnMvY2VwaC9kZWJ1Z2ZzLmMKQEAgLTYwLDEwICs2MCwxMyBAQAogCWZvciAocnAgPSByYl9maXJzdCgmbWRzYy0+cmVxdWVzdF90cmVlKTsgcnA7IHJwID0gcmJfbmV4dChycCkpIHsKIAkJcmVxID0gcmJfZW50cnkocnAsIHN0cnVjdCBjZXBoX21kc19yZXF1ZXN0LCByX25vZGUpOwogCi0JCWlmIChyZXEtPnJfcmVxdWVzdCkKLQkJCXNlcV9wcmludGYocywgIiVsbGRcdG1kcyVkXHQiLCByZXEtPnJfdGlkLCByZXEtPnJfbWRzKTsKLQkJZWxzZQorCQlpZiAocmVxLT5yX3JlcXVlc3QgJiYgcmVxLT5yX3Nlc3Npb24pCisJCQlzZXFfcHJpbnRmKHMsICIlbGxkXHRtZHMlZFx0IiwgcmVxLT5yX3RpZCwKKwkJCQkgICByZXEtPnJfc2Vzc2lvbi0+c19tZHMpOworCQllbHNlIGlmICghcmVxLT5yX3JlcXVlc3QpCiAJCQlzZXFfcHJpbnRmKHMsICIlbGxkXHQobm8gcmVxdWVzdClcdCIsIHJlcS0+cl90aWQpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICIlbGxkXHQobm8gc2Vzc2lvbilcdCIsIHJlcS0+cl90aWQpOwogCiAJCXNlcV9wcmludGYocywgIiVzIiwgY2VwaF9tZHNfb3BfbmFtZShyZXEtPnJfb3ApKTsKIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggZmE3Y2EwNC4uMGJjNjhkZSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC0xMjI0LDYgKzEyMjQsMjYgQEAKIAl9CiB9CiAKKy8qCisgKiBSZXR1cm4gbmFtZSBoYXNoIGZvciBhIGdpdmVuIGRlbnRyeS4gIFRoaXMgaXMgZGVwZW5kZW50IG9uCisgKiB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGhhc2ggZnVuY3Rpb24uCisgKi8KK3Vuc2lnbmVkIGNlcGhfZGVudHJ5X2hhc2goc3RydWN0IGRlbnRyeSAqZG4pCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBkbi0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqZGNpID0gY2VwaF9pbm9kZShkaXIpOworCisJc3dpdGNoIChkY2ktPmlfZGlyX2xheW91dC5kbF9kaXJfaGFzaCkgeworCWNhc2UgMDoJLyogZm9yIGJhY2t3YXJkIGNvbXBhdCAqLworCWNhc2UgQ0VQSF9TVFJfSEFTSF9MSU5VWDoKKwkJcmV0dXJuIGRuLT5kX25hbWUuaGFzaDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBjZXBoX3N0cl9oYXNoKGRjaS0+aV9kaXJfbGF5b3V0LmRsX2Rpcl9oYXNoLAorCQkJCSAgICAgZG4tPmRfbmFtZS5uYW1lLCBkbi0+ZF9uYW1lLmxlbik7CisJfQorfQorCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNlcGhfZGlyX2ZvcHMgPSB7CiAJLnJlYWQgPSBjZXBoX3JlYWRfZGlyLAogCS5yZWFkZGlyID0gY2VwaF9yZWFkZGlyLApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9leHBvcnQuYyBiL2ZzL2NlcGgvZXhwb3J0LmMKaW5kZXggMjI5N2Q5NC4uZTQxMDU2MSAxMDA2NDQKLS0tIGEvZnMvY2VwaC9leHBvcnQuYworKysgYi9mcy9jZXBoL2V4cG9ydC5jCkBAIC01OSw3ICs1OSw3IEBACiAJCWRvdXQoImVuY29kZV9maCAlcCBjb25uZWN0YWJsZVxuIiwgZGVudHJ5KTsKIAkJY2ZoLT5pbm8gPSBjZXBoX2lubyhkZW50cnktPmRfaW5vZGUpOwogCQljZmgtPnBhcmVudF9pbm8gPSBjZXBoX2lubyhwYXJlbnQtPmRfaW5vZGUpOwotCQljZmgtPnBhcmVudF9uYW1lX2hhc2ggPSBwYXJlbnQtPmRfbmFtZS5oYXNoOworCQljZmgtPnBhcmVudF9uYW1lX2hhc2ggPSBjZXBoX2RlbnRyeV9oYXNoKHBhcmVudCk7CiAJCSptYXhfbGVuID0gY29ubmVjdGVkX2hhbmRsZV9sZW5ndGg7CiAJCXR5cGUgPSAyOwogCX0gZWxzZSBpZiAoKm1heF9sZW4gPj0gaGFuZGxlX2xlbmd0aCkgewpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9pbm9kZS5jIGIvZnMvY2VwaC9pbm9kZS5jCmluZGV4IGU2MWRlNGYuLmU4MzVlZmYgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvaW5vZGUuYworKysgYi9mcy9jZXBoL2lub2RlLmMKQEAgLTI5Nyw2ICsyOTcsOCBAQAogCWNpLT5pX3JlbGVhc2VfY291bnQgPSAwOwogCWNpLT5pX3N5bWxpbmsgPSBOVUxMOwogCisJbWVtc2V0KCZjaS0+aV9kaXJfbGF5b3V0LCAwLCBzaXplb2YoY2ktPmlfZGlyX2xheW91dCkpOworCiAJY2ktPmlfZnJhZ3RyZWUgPSBSQl9ST09UOwogCW11dGV4X2luaXQoJmNpLT5pX2ZyYWd0cmVlX211dGV4KTsKIApAQCAtNjg5LDYgKzY5MSw4IEBACiAJCWlub2RlLT5pX29wID0gJmNlcGhfZGlyX2lvcHM7CiAJCWlub2RlLT5pX2ZvcCA9ICZjZXBoX2Rpcl9mb3BzOwogCisJCWNpLT5pX2Rpcl9sYXlvdXQgPSBpaW5mby0+ZGlyX2xheW91dDsKKwogCQljaS0+aV9maWxlcyA9IGxlNjRfdG9fY3B1KGluZm8tPmZpbGVzKTsKIAkJY2ktPmlfc3ViZGlycyA9IGxlNjRfdG9fY3B1KGluZm8tPnN1YmRpcnMpOwogCQljaS0+aV9yYnl0ZXMgPSBsZTY0X3RvX2NwdShpbmZvLT5yYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9tZHNfY2xpZW50LmMgYi9mcy9jZXBoL21kc19jbGllbnQuYwppbmRleCBhNTBmY2ExLi4xZTMwZDE5IDEwMDY0NAotLS0gYS9mcy9jZXBoL21kc19jbGllbnQuYworKysgYi9mcy9jZXBoL21kc19jbGllbnQuYwpAQCAtNjAsNyArNjAsOCBAQAogICogcGFyc2UgaW5kaXZpZHVhbCBpbm9kZSBpbmZvCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcmVwbHlfaW5mb19pbih2b2lkICoqcCwgdm9pZCAqZW5kLAotCQkJICAgICAgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX2luICppbmZvKQorCQkJICAgICAgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX2luICppbmZvLAorCQkJICAgICAgIGludCBmZWF0dXJlcykKIHsKIAlpbnQgZXJyID0gLUVJTzsKIApAQCAtNzQsNiArNzUsMTIgQEAKIAlpbmZvLT5zeW1saW5rID0gKnA7CiAJKnAgKz0gaW5mby0+c3ltbGlua19sZW47CiAKKwlpZiAoZmVhdHVyZXMgJiBDRVBIX0ZFQVRVUkVfRElSTEFZT1VUSEFTSCkKKwkJY2VwaF9kZWNvZGVfY29weV9zYWZlKHAsIGVuZCwgJmluZm8tPmRpcl9sYXlvdXQsCisJCQkJICAgICAgc2l6ZW9mKGluZm8tPmRpcl9sYXlvdXQpLCBiYWQpOworCWVsc2UKKwkJbWVtc2V0KCZpbmZvLT5kaXJfbGF5b3V0LCAwLCBzaXplb2YoaW5mby0+ZGlyX2xheW91dCkpOworCiAJY2VwaF9kZWNvZGVfMzJfc2FmZShwLCBlbmQsIGluZm8tPnhhdHRyX2xlbiwgYmFkKTsKIAljZXBoX2RlY29kZV9uZWVkKHAsIGVuZCwgaW5mby0+eGF0dHJfbGVuLCBiYWQpOwogCWluZm8tPnhhdHRyX2RhdGEgPSAqcDsKQEAgLTg4LDEyICs5NSwxMyBAQAogICogdGFyZ2V0IGlub2RlLgogICovCiBzdGF0aWMgaW50IHBhcnNlX3JlcGx5X2luZm9fdHJhY2Uodm9pZCAqKnAsIHZvaWQgKmVuZCwKLQkJCQkgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX3BhcnNlZCAqaW5mbykKKwkJCQkgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX3BhcnNlZCAqaW5mbywKKwkJCQkgIGludCBmZWF0dXJlcykKIHsKIAlpbnQgZXJyOwogCiAJaWYgKGluZm8tPmhlYWQtPmlzX2RlbnRyeSkgewotCQllcnIgPSBwYXJzZV9yZXBseV9pbmZvX2luKHAsIGVuZCwgJmluZm8tPmRpcmkpOworCQllcnIgPSBwYXJzZV9yZXBseV9pbmZvX2luKHAsIGVuZCwgJmluZm8tPmRpcmksIGZlYXR1cmVzKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIG91dF9iYWQ7CiAKQEAgLTExNCw3ICsxMjIsNyBAQAogCX0KIAogCWlmIChpbmZvLT5oZWFkLT5pc190YXJnZXQpIHsKLQkJZXJyID0gcGFyc2VfcmVwbHlfaW5mb19pbihwLCBlbmQsICZpbmZvLT50YXJnZXRpKTsKKwkJZXJyID0gcGFyc2VfcmVwbHlfaW5mb19pbihwLCBlbmQsICZpbmZvLT50YXJnZXRpLCBmZWF0dXJlcyk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXRfYmFkOwogCX0KQEAgLTEzNCw3ICsxNDIsOCBAQAogICogcGFyc2UgcmVhZGRpciByZXN1bHRzCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcmVwbHlfaW5mb19kaXIodm9pZCAqKnAsIHZvaWQgKmVuZCwKLQkJCQlzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfaW5mb19wYXJzZWQgKmluZm8pCisJCQkJc3RydWN0IGNlcGhfbWRzX3JlcGx5X2luZm9fcGFyc2VkICppbmZvLAorCQkJCWludCBmZWF0dXJlcykKIHsKIAl1MzIgbnVtLCBpID0gMDsKIAlpbnQgZXJyOwpAQCAtMTgyLDcgKzE5MSw3IEBACiAJCSpwICs9IHNpemVvZihzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfbGVhc2UpOwogCiAJCS8qIGlub2RlICovCi0JCWVyciA9IHBhcnNlX3JlcGx5X2luZm9faW4ocCwgZW5kLCAmaW5mby0+ZGlyX2luW2ldKTsKKwkJZXJyID0gcGFyc2VfcmVwbHlfaW5mb19pbihwLCBlbmQsICZpbmZvLT5kaXJfaW5baV0sIGZlYXR1cmVzKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIG91dF9iYWQ7CiAJCWkrKzsKQEAgLTIwNSw3ICsyMTQsOCBAQAogICogcGFyc2UgZmNudGwgRl9HRVRMSyByZXN1bHRzCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcmVwbHlfaW5mb19maWxlbG9jayh2b2lkICoqcCwgdm9pZCAqZW5kLAotICAgICAgICAgICAgICAgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX3BhcnNlZCAqaW5mbykKKwkJCQkgICAgIHN0cnVjdCBjZXBoX21kc19yZXBseV9pbmZvX3BhcnNlZCAqaW5mbywKKwkJCQkgICAgIGludCBmZWF0dXJlcykKIHsKIAlpZiAoKnAgKyBzaXplb2YoKmluZm8tPmZpbGVsb2NrX3JlcGx5KSA+IGVuZCkKIAkJZ290byBiYWQ7CkBAIC0yMjUsMTkgKzIzNSwyMSBAQAogICogcGFyc2UgZXh0cmEgcmVzdWx0cwogICovCiBzdGF0aWMgaW50IHBhcnNlX3JlcGx5X2luZm9fZXh0cmEodm9pZCAqKnAsIHZvaWQgKmVuZCwKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfaW5mb19wYXJzZWQgKmluZm8pCisJCQkJICBzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfaW5mb19wYXJzZWQgKmluZm8sCisJCQkJICBpbnQgZmVhdHVyZXMpCiB7CiAJaWYgKGluZm8tPmhlYWQtPm9wID09IENFUEhfTURTX09QX0dFVEZJTEVMT0NLKQotCQlyZXR1cm4gcGFyc2VfcmVwbHlfaW5mb19maWxlbG9jayhwLCBlbmQsIGluZm8pOworCQlyZXR1cm4gcGFyc2VfcmVwbHlfaW5mb19maWxlbG9jayhwLCBlbmQsIGluZm8sIGZlYXR1cmVzKTsKIAllbHNlCi0JCXJldHVybiBwYXJzZV9yZXBseV9pbmZvX2RpcihwLCBlbmQsIGluZm8pOworCQlyZXR1cm4gcGFyc2VfcmVwbHlfaW5mb19kaXIocCwgZW5kLCBpbmZvLCBmZWF0dXJlcyk7CiB9CiAKIC8qCiAgKiBwYXJzZSBlbnRpcmUgbWRzIHJlcGx5CiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcmVwbHlfaW5mbyhzdHJ1Y3QgY2VwaF9tc2cgKm1zZywKLQkJCSAgICBzdHJ1Y3QgY2VwaF9tZHNfcmVwbHlfaW5mb19wYXJzZWQgKmluZm8pCisJCQkgICAgc3RydWN0IGNlcGhfbWRzX3JlcGx5X2luZm9fcGFyc2VkICppbmZvLAorCQkJICAgIGludCBmZWF0dXJlcykKIHsKIAl2b2lkICpwLCAqZW5kOwogCXUzMiBsZW47CkBAIC0yNTAsNyArMjYyLDcgQEAKIAkvKiB0cmFjZSAqLwogCWNlcGhfZGVjb2RlXzMyX3NhZmUoJnAsIGVuZCwgbGVuLCBiYWQpOwogCWlmIChsZW4gPiAwKSB7Ci0JCWVyciA9IHBhcnNlX3JlcGx5X2luZm9fdHJhY2UoJnAsIHArbGVuLCBpbmZvKTsKKwkJZXJyID0gcGFyc2VfcmVwbHlfaW5mb190cmFjZSgmcCwgcCtsZW4sIGluZm8sIGZlYXR1cmVzKTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIG91dF9iYWQ7CiAJfQpAQCAtMjU4LDcgKzI3MCw3IEBACiAJLyogZXh0cmEgKi8KIAljZXBoX2RlY29kZV8zMl9zYWZlKCZwLCBlbmQsIGxlbiwgYmFkKTsKIAlpZiAobGVuID4gMCkgewotCQllcnIgPSBwYXJzZV9yZXBseV9pbmZvX2V4dHJhKCZwLCBwK2xlbiwgaW5mbyk7CisJCWVyciA9IHBhcnNlX3JlcGx5X2luZm9fZXh0cmEoJnAsIHArbGVuLCBpbmZvLCBmZWF0dXJlcyk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXRfYmFkOwogCX0KQEAgLTY1NCw3ICs2NjYsNyBAQAogCQl9IGVsc2UgewogCQkJLyogZGlyICsgbmFtZSAqLwogCQkJaW5vZGUgPSBkaXI7Ci0JCQloYXNoID0gcmVxLT5yX2RlbnRyeS0+ZF9uYW1lLmhhc2g7CisJCQloYXNoID0gY2VwaF9kZW50cnlfaGFzaChyZXEtPnJfZGVudHJ5KTsKIAkJCWlzX2hhc2ggPSB0cnVlOwogCQl9CiAJfQpAQCAtMTY5Myw3ICsxNzA1LDYgQEAKIAlzdHJ1Y3QgY2VwaF9tc2cgKm1zZzsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JcmVxLT5yX21kcyA9IG1kczsKIAlyZXEtPnJfYXR0ZW1wdHMrKzsKIAlpZiAocmVxLT5yX2lub2RlKSB7CiAJCXN0cnVjdCBjZXBoX2NhcCAqY2FwID0KQEAgLTE3ODAsNiArMTc5MSw4IEBACiAJCWdvdG8gZmluaXNoOwogCX0KIAorCXB1dF9yZXF1ZXN0X3Nlc3Npb24ocmVxKTsKKwogCW1kcyA9IF9fY2hvb3NlX21kcyhtZHNjLCByZXEpOwogCWlmIChtZHMgPCAwIHx8CiAJICAgIGNlcGhfbWRzbWFwX2dldF9zdGF0ZShtZHNjLT5tZHNtYXAsIG1kcykgPCBDRVBIX01EU19TVEFURV9BQ1RJVkUpIHsKQEAgLTE3OTcsNiArMTgxMCw4IEBACiAJCQlnb3RvIGZpbmlzaDsKIAkJfQogCX0KKwlyZXEtPnJfc2Vzc2lvbiA9IGdldF9zZXNzaW9uKHNlc3Npb24pOworCiAJZG91dCgiZG9fcmVxdWVzdCBtZHMlZCBzZXNzaW9uICVwIHN0YXRlICVzXG4iLCBtZHMsIHNlc3Npb24sCiAJICAgICBzZXNzaW9uX3N0YXRlX25hbWUoc2Vzc2lvbi0+c19zdGF0ZSkpOwogCWlmIChzZXNzaW9uLT5zX3N0YXRlICE9IENFUEhfTURTX1NFU1NJT05fT1BFTiAmJgpAQCAtMTgwOSw3ICsxODI0LDYgQEAKIAl9CiAKIAkvKiBzZW5kIHJlcXVlc3QgKi8KLQlyZXEtPnJfc2Vzc2lvbiA9IGdldF9zZXNzaW9uKHNlc3Npb24pOwogCXJlcS0+cl9yZXNlbmRfbWRzID0gLTE7ICAgLyogZm9yZ2V0IGFueSBwcmV2aW91cyBtZHMgaGludCAqLwogCiAJaWYgKHJlcS0+cl9yZXF1ZXN0X3N0YXJ0ZWQgPT0gMCkgICAvKiBub3RlIHJlcXVlc3Qgc3RhcnQgdGltZSAqLwpAQCAtMTg2Myw3ICsxODc3LDYgQEAKIAkJaWYgKHJlcS0+cl9zZXNzaW9uICYmCiAJCSAgICByZXEtPnJfc2Vzc2lvbi0+c19tZHMgPT0gbWRzKSB7CiAJCQlkb3V0KCIga2lja2luZyB0aWQgJWxsdVxuIiwgcmVxLT5yX3RpZCk7Ci0JCQlwdXRfcmVxdWVzdF9zZXNzaW9uKHJlcSk7CiAJCQlfX2RvX3JlcXVlc3QobWRzYywgcmVxKTsKIAkJfQogCX0KQEAgLTIwNTYsOCArMjA2OSwxMSBAQAogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSAgewogCQkJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKHJlcS0+cl9pbm9kZSk7Ci0JCQlzdHJ1Y3QgY2VwaF9jYXAgKmNhcCA9Ci0JCQkJY2VwaF9nZXRfY2FwX2Zvcl9tZHMoY2ksIHJlcS0+cl9tZHMpOzsKKwkJCXN0cnVjdCBjZXBoX2NhcCAqY2FwID0gTlVMTDsKKworCQkJaWYgKHJlcS0+cl9zZXNzaW9uKQorCQkJCWNhcCA9IGNlcGhfZ2V0X2NhcF9mb3JfbWRzKGNpLAorCQkJCQkJICAgcmVxLT5yX3Nlc3Npb24tPnNfbWRzKTsKIAogCQkJZG91dCgiYWxyZWFkeSB1c2luZyBhdXRoIik7CiAJCQlpZiAoKCFjYXAgfHwgY2FwICE9IGNpLT5pX2F1dGhfY2FwKSB8fApAQCAtMjEwMSw3ICsyMTE3LDcgQEAKIAogCWRvdXQoImhhbmRsZV9yZXBseSB0aWQgJWxsZCByZXN1bHQgJWRcbiIsIHRpZCwgcmVzdWx0KTsKIAlyaW5mbyA9ICZyZXEtPnJfcmVwbHlfaW5mbzsKLQllcnIgPSBwYXJzZV9yZXBseV9pbmZvKG1zZywgcmluZm8pOworCWVyciA9IHBhcnNlX3JlcGx5X2luZm8obXNnLCByaW5mbywgc2Vzc2lvbi0+c19jb24ucGVlcl9mZWF0dXJlcyk7CiAJbXV0ZXhfdW5sb2NrKCZtZHNjLT5tdXRleCk7CiAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5zX211dGV4KTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvbWRzX2NsaWVudC5oIGIvZnMvY2VwaC9tZHNfY2xpZW50LmgKaW5kZXggYWFiZTU2My4uNGUzYTljYyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9tZHNfY2xpZW50LmgKKysrIGIvZnMvY2VwaC9tZHNfY2xpZW50LmgKQEAgLTM1LDYgKzM1LDcgQEAKICAqLwogc3RydWN0IGNlcGhfbWRzX3JlcGx5X2luZm9faW4gewogCXN0cnVjdCBjZXBoX21kc19yZXBseV9pbm9kZSAqaW47CisJc3RydWN0IGNlcGhfZGlyX2xheW91dCBkaXJfbGF5b3V0OwogCXUzMiBzeW1saW5rX2xlbjsKIAljaGFyICpzeW1saW5rOwogCXUzMiB4YXR0cl9sZW47CkBAIC0xNjUsNyArMTY2LDYgQEAKIAlzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICpyX21kc2M7CiAKIAlpbnQgcl9vcDsgICAgICAgICAgICAgICAgICAgIC8qIG1kcyBvcCBjb2RlICovCi0JaW50IHJfbWRzOwogCiAJLyogb3BlcmF0aW9uIG9uIHdoYXQ/ICovCiAJc3RydWN0IGlub2RlICpyX2lub2RlOyAgICAgICAgICAgICAgLyogYXJnMSAqLwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zdXBlci5jIGIvZnMvY2VwaC9zdXBlci5jCmluZGV4IDA4YjQ2MGEuLmJmNmYwZjMgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvc3VwZXIuYworKysgYi9mcy9jZXBoL3N1cGVyLmMKQEAgLTQyOCw3ICs0MjgsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCWZzYy0+Y2xpZW50LT5leHRyYV9tb25fZGlzcGF0Y2ggPSBleHRyYV9tb25fZGlzcGF0Y2g7Ci0JZnNjLT5jbGllbnQtPnN1cHBvcnRlZF9mZWF0dXJlcyB8PSBDRVBIX0ZFQVRVUkVfRkxPQ0s7CisJZnNjLT5jbGllbnQtPnN1cHBvcnRlZF9mZWF0dXJlcyB8PSBDRVBIX0ZFQVRVUkVfRkxPQ0sgfAorCQlDRVBIX0ZFQVRVUkVfRElSTEFZT1VUSEFTSDsKIAlmc2MtPmNsaWVudC0+bW9uYy53YW50X21kc21hcCA9IDE7CiAKIAlmc2MtPm1vdW50X29wdGlvbnMgPSBmc29wdDsKQEAgLTQ0MywxMyArNDQ0LDE3IEBACiAJCWdvdG8gZmFpbF9jbGllbnQ7CiAKIAllcnIgPSAtRU5PTUVNOwotCWZzYy0+d2Jfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJjZXBoLXdyaXRlYmFjayIpOworCS8qCisJICogVGhlIG51bWJlciBvZiBjb25jdXJyZW50IHdvcmtzIGNhbiBiZSBoaWdoIGJ1dCB0aGV5IGRvbid0IG5lZWQKKwkgKiB0byBiZSBwcm9jZXNzZWQgaW4gcGFyYWxsZWwsIGxpbWl0IGNvbmN1cnJlbmN5LgorCSAqLworCWZzYy0+d2Jfd3EgPSBhbGxvY193b3JrcXVldWUoImNlcGgtd3JpdGViYWNrIiwgMCwgMSk7CiAJaWYgKGZzYy0+d2Jfd3EgPT0gTlVMTCkKIAkJZ290byBmYWlsX2JkaTsKLQlmc2MtPnBnX2ludl93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjZXBoLXBnLWludmFsaWQiKTsKKwlmc2MtPnBnX2ludl93cSA9IGFsbG9jX3dvcmtxdWV1ZSgiY2VwaC1wZy1pbnZhbGlkIiwgMCwgMSk7CiAJaWYgKGZzYy0+cGdfaW52X3dxID09IE5VTEwpCiAJCWdvdG8gZmFpbF93Yl93cTsKLQlmc2MtPnRydW5jX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNlcGgtdHJ1bmMiKTsKKwlmc2MtPnRydW5jX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJjZXBoLXRydW5jIiwgMCwgMSk7CiAJaWYgKGZzYy0+dHJ1bmNfd3EgPT0gTlVMTCkKIAkJZ290byBmYWlsX3BnX2ludl93cTsKIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zdXBlci5oIGIvZnMvY2VwaC9zdXBlci5oCmluZGV4IDQ1NTNkODguLjIwYjkwN2Q3IDEwMDY0NAotLS0gYS9mcy9jZXBoL3N1cGVyLmgKKysrIGIvZnMvY2VwaC9zdXBlci5oCkBAIC0yMzksNiArMjM5LDcgQEAKIAl1bnNpZ25lZCBpX2NlcGhfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBpX3JlbGVhc2VfY291bnQ7CiAKKwlzdHJ1Y3QgY2VwaF9kaXJfbGF5b3V0IGlfZGlyX2xheW91dDsKIAlzdHJ1Y3QgY2VwaF9maWxlX2xheW91dCBpX2xheW91dDsKIAljaGFyICppX3N5bWxpbms7CiAKQEAgLTc2OCw2ICs3NjksNyBAQAogZXh0ZXJuIHZvaWQgY2VwaF9kZW50cnlfbHJ1X3RvdWNoKHN0cnVjdCBkZW50cnkgKmRuKTsKIGV4dGVybiB2b2lkIGNlcGhfZGVudHJ5X2xydV9kZWwoc3RydWN0IGRlbnRyeSAqZG4pOwogZXh0ZXJuIHZvaWQgY2VwaF9pbnZhbGlkYXRlX2RlbnRyeV9sZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIHVuc2lnbmVkIGNlcGhfZGVudHJ5X2hhc2goc3RydWN0IGRlbnRyeSAqZG4pOwogCiAvKgogICogb3VyIGRfb3BzIHZhcnkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGlub2RlIGlzIGxpdmUsCmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCBlNWI5ZGY5Li5kY2E5ZTVlIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTU5LDcgKzU5LDcgQEAKIH0gKmNocmRldnNbQ0hSREVWX01BSk9SX0hBU0hfU0laRV07CiAKIC8qIGluZGV4IGluIHRoZSBhYm92ZSAqLwotc3RhdGljIGlubGluZSBpbnQgbWFqb3JfdG9faW5kZXgoaW50IG1ham9yKQorc3RhdGljIGlubGluZSBpbnQgbWFqb3JfdG9faW5kZXgodW5zaWduZWQgbWFqb3IpCiB7CiAJcmV0dXJuIG1ham9yICUgQ0hSREVWX01BSk9SX0hBU0hfU0laRTsKIH0KQEAgLTQxNywxOCArNDE3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgY2Rldl9pbmRleChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWludCBpZHg7Ci0Jc3RydWN0IGtvYmplY3QgKmtvYmo7Ci0KLQlrb2JqID0ga29ial9sb29rdXAoY2Rldl9tYXAsIGlub2RlLT5pX3JkZXYsICZpZHgpOwotCWlmICgha29iaikKLQkJcmV0dXJuIC0xOwotCWtvYmplY3RfcHV0KGtvYmopOwotCXJldHVybiBpZHg7Ci19Ci0KIHZvaWQgY2RfZm9yZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3Bpbl9sb2NrKCZjZGV2X2xvY2spOwpAQCAtNTgyLDcgKzU3MCw2IEBACiBFWFBPUlRfU1lNQk9MKGNkZXZfYWxsb2MpOwogRVhQT1JUX1NZTUJPTChjZGV2X2RlbCk7CiBFWFBPUlRfU1lNQk9MKGNkZXZfYWRkKTsKLUVYUE9SVF9TWU1CT0woY2Rldl9pbmRleCk7CiBFWFBPUlRfU1lNQk9MKF9fcmVnaXN0ZXJfY2hyZGV2KTsKIEVYUE9SVF9TWU1CT0woX191bnJlZ2lzdGVyX2NocmRldik7CiBFWFBPUlRfU1lNQk9MKGRpcmVjdGx5X21hcHBhYmxlX2NkZXZfYmRpKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2FjaGUuYyBiL2ZzL2NpZnMvY2FjaGUuYwppbmRleCAyMjRkN2JiZC4uZTY1NGRmZDAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2FjaGUuYworKysgYi9mcy9jaWZzL2NhY2hlLmMKQEAgLTY0LDcgKzY0LDkgQEAKIAkJCQkgICB2b2lkICpidWZmZXIsIHVpbnQxNl90IG1heGJ1ZikKIHsKIAljb25zdCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBjb29raWVfbmV0ZnNfZGF0YTsKLQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLT5hZGRyLnNvY2tBZGRyOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmRzdGFkZHI7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYTsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhOwogCXN0cnVjdCBjaWZzX3NlcnZlcl9rZXkgKmtleSA9IGJ1ZmZlcjsKIAl1aW50MTZfdCBrZXlfbGVuID0gc2l6ZW9mKHN0cnVjdCBjaWZzX3NlcnZlcl9rZXkpOwogCkBAIC03NiwxNiArNzgsMTYgQEAKIAkgKi8KIAlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKIAljYXNlIEFGX0lORVQ6Ci0JCWtleS0+ZmFtaWx5ID0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9mYW1pbHk7Ci0JCWtleS0+cG9ydCA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydDsKLQkJa2V5LT5hZGRyWzBdLmlwdjRfYWRkciA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkcjsKKwkJa2V5LT5mYW1pbHkgPSBzYS0+c2FfZmFtaWx5OworCQlrZXktPnBvcnQgPSBhZGRyLT5zaW5fcG9ydDsKKwkJa2V5LT5hZGRyWzBdLmlwdjRfYWRkciA9IGFkZHItPnNpbl9hZGRyOwogCQlrZXlfbGVuICs9IHNpemVvZihrZXktPmFkZHJbMF0uaXB2NF9hZGRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFGX0lORVQ2OgotCQlrZXktPmZhbWlseSA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9mYW1pbHk7Ci0JCWtleS0+cG9ydCA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0OwotCQlrZXktPmFkZHJbMF0uaXB2Nl9hZGRyID0gc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2FkZHI7CisJCWtleS0+ZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKKwkJa2V5LT5wb3J0ID0gYWRkcjYtPnNpbjZfcG9ydDsKKwkJa2V5LT5hZGRyWzBdLmlwdjZfYWRkciA9IGFkZHI2LT5zaW42X2FkZHI7CiAJCWtleV9sZW4gKz0gc2l6ZW9mKGtleS0+YWRkclswXS5pcHY2X2FkZHIpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2RlYnVnLmMgYi9mcy9jaWZzL2NpZnNfZGVidWcuYwppbmRleCAxMDNhYjhiLi5lZGU5ODMwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfZGVidWcuYworKysgYi9mcy9jaWZzL2NpZnNfZGVidWcuYwpAQCAtMTE5LDI5ICsxMTksMjcgQEAKIAkJICAgICJEaXNwbGF5IEludGVybmFsIENJRlMgRGF0YSBTdHJ1Y3R1cmVzIGZvciBEZWJ1Z2dpbmdcbiIKIAkJICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXNlcV9wcmludGYobSwgIkNJRlMgVmVyc2lvbiAlc1xuIiwgQ0lGU19WRVJTSU9OKTsKLQlzZXFfcHJpbnRmKG0sICJGZWF0dXJlczogIik7CisJc2VxX3ByaW50ZihtLCAiRmVhdHVyZXM6Iik7CiAjaWZkZWYgQ09ORklHX0NJRlNfREZTX1VQQ0FMTAotCXNlcV9wcmludGYobSwgImRmcyIpOwotCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3ByaW50ZihtLCAiIGRmcyIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfRlNDQUNIRQotCXNlcV9wcmludGYobSwgImZzY2FjaGUiKTsKLQlzZXFfcHV0YyhtLCAnICcpOworCXNlcV9wcmludGYobSwgIiBmc2NhY2hlIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0lGU19XRUFLX1BXX0hBU0gKLQlzZXFfcHJpbnRmKG0sICJsYW5tYW4iKTsKLQlzZXFfcHV0YyhtLCAnICcpOworCXNlcV9wcmludGYobSwgIiBsYW5tYW4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCi0Jc2VxX3ByaW50ZihtLCAicG9zaXgiKTsKLQlzZXFfcHV0YyhtLCAnICcpOworCXNlcV9wcmludGYobSwgIiBwb3NpeCIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfVVBDQUxMCi0Jc2VxX3ByaW50ZihtLCAic3BuZWdvIik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgc3BuZWdvIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgotCXNlcV9wcmludGYobSwgInhhdHRyIik7CisJc2VxX3ByaW50ZihtLCAiIHhhdHRyIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0lGU19BQ0wKKwlzZXFfcHJpbnRmKG0sICIgYWNsIik7CiAjZW5kaWYKIAlzZXFfcHV0YyhtLCAnXG4nKTsKIAlzZXFfcHJpbnRmKG0sICJBY3RpdmUgVkZTIFJlcXVlc3RzOiAlZFxuIiwgR2xvYmFsVG90YWxBY3RpdmVYaWQpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX3NwbmVnby5jIGIvZnMvY2lmcy9jaWZzX3NwbmVnby5jCmluZGV4IDg3MDQ0OTAuLjRkZmJhODIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc19zcG5lZ28uYworKysgYi9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKQEAgLTk4LDYgKzk4LDggQEAKIGNpZnNfZ2V0X3NwbmVnb19rZXkoc3RydWN0IGNpZnNTZXNJbmZvICpzZXNJbmZvKQogewogCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHNlc0luZm8tPnNlcnZlcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2VydmVyLT5kc3RhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZzZXJ2ZXItPmRzdGFkZHI7CiAJY2hhciAqZGVzY3JpcHRpb24sICpkcDsKIAlzaXplX3QgZGVzY19sZW47CiAJc3RydWN0IGtleSAqc3BuZWdvX2tleTsKQEAgLTEyNywxMCArMTI5LDEwIEBACiAJZHAgPSBkZXNjcmlwdGlvbiArIHN0cmxlbihkZXNjcmlwdGlvbik7CiAKIAkvKiBhZGQgdGhlIHNlcnZlciBhZGRyZXNzICovCi0JaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5ID09IEFGX0lORVQpCi0JCXNwcmludGYoZHAsICJpcDQ9JXBJNCIsICZzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIpOwotCWVsc2UgaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5ID09IEFGX0lORVQ2KQotCQlzcHJpbnRmKGRwLCAiaXA2PSVwSTYiLCAmc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2FkZHIpOworCWlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpCisJCXNwcmludGYoZHAsICJpcDQ9JXBJNCIsICZzYS0+c2luX2FkZHIpOworCWVsc2UgaWYgKHNlcnZlci0+ZHN0YWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNwcmludGYoZHAsICJpcDY9JXBJNiIsICZzYTYtPnNpbjZfYWRkcik7CiAJZWxzZQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCmluZGV4IGY4NTY3MzIuLjY2ZjNkNTAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYworKysgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKQEAgLTcyLDYgKzcyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBzZXJ2ZXItPnNydl9tdXRleCBoZWxkICovCiBpbnQgY2lmc19zaWduX3NtYihzdHJ1Y3Qgc21iX2hkciAqY2lmc19wZHUsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKIHsKQEAgLTg0LDE0ICs4NSwxMiBAQAogCWlmICgoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSA9PSAwKQogCQlyZXR1cm4gcmM7CiAKLQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0KIAkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlJlc2VydmVkID0gMDsKIAogCSpwZXhwZWN0ZWRfcmVzcG9uc2Vfc2VxdWVuY2VfbnVtYmVyID0gc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKIAlzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOwotCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAKIAlyYyA9IGNpZnNfY2FsY3VsYXRlX3NpZ25hdHVyZShjaWZzX3BkdSwgc2VydmVyLCBzbWJfc2lnbmF0dXJlKTsKIAlpZiAocmMpCkBAIC0xNDksNiArMTQ4LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggc2VydmVyLT5zcnZfbXV0ZXggaGVsZCAqLwogaW50IGNpZnNfc2lnbl9zbWIyKHN0cnVjdCBrdmVjICppb3YsIGludCBuX3ZlYywgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkgICBfX3UzMiAqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKIHsKQEAgLTE2MiwxNCArMTYyLDEyIEBACiAJaWYgKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApCiAJCXJldHVybiByYzsKIAotCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuU2VxdWVuY2VOdW1iZXIgPQogCQkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlJlc2VydmVkID0gMDsKIAogCSpwZXhwZWN0ZWRfcmVzcG9uc2Vfc2VxdWVuY2VfbnVtYmVyID0gc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKIAlzZXJ2ZXItPnNlcXVlbmNlX251bWJlcisrOwotCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAKIAlyYyA9IGNpZnNfY2FsY19zaWduYXR1cmUyKGlvdiwgbl92ZWMsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggOGUyMWUwZi4uZDlmNjUyYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0xNzQsNiArMTc0LDEyIEBACiAJCWdvdG8gb3V0X25vX3Jvb3Q7CiAJfQogCisJLyogZG8gdGhhdCAqYWZ0ZXIqIGRfYWxsb2Nfcm9vdCgpIC0gd2Ugd2FudCBOVUxMIC0+ZF9vcCBmb3Igcm9vdCBoZXJlICovCisJaWYgKGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYiktPm5vY2FzZSkKKwkJc2ItPnNfZF9vcCA9ICZjaWZzX2NpX2RlbnRyeV9vcHM7CisJZWxzZQorCQlzYi0+c19kX29wID0gJmNpZnNfZGVudHJ5X29wczsKKwogI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VSVkVSX0lOVU0pIHsKIAkJY0ZZSSgxLCAiZXhwb3J0IG9wcyBzdXBwb3J0ZWQiKTsKQEAgLTMyOSw2ICszMzUsOCBAQAogCWNpZnNfaW5vZGUtPmludmFsaWRfbWFwcGluZyA9IGZhbHNlOwogCWNpZnNfaW5vZGUtPnZmc19pbm9kZS5pX2Jsa2JpdHMgPSAxNDsgIC8qIDIqKjE0ID0gQ0lGU19NQVhfTVNHU0laRSAqLwogCWNpZnNfaW5vZGUtPnNlcnZlcl9lb2YgPSAwOworCWNpZnNfaW5vZGUtPnVuaXF1ZWlkID0gMDsKKwljaWZzX2lub2RlLT5jcmVhdGV0aW1lID0gMDsKIAogCS8qIENhbiBub3Qgc2V0IGlfZmxhZ3MgaGVyZSAtIHRoZXkgZ2V0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuCiAJICAgdG8gemVybyBieSB0aGUgVkZTICovCkBAIC0zNjEsMTggKzM2OSwxOSBAQAogc3RhdGljIHZvaWQKIGNpZnNfc2hvd19hZGRyZXNzKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQogeworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2EgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZzZXJ2ZXItPmRzdGFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2E2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgJnNlcnZlci0+ZHN0YWRkcjsKKwogCXNlcV9wcmludGYocywgIixhZGRyPSIpOwogCi0Jc3dpdGNoIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2ZhbWlseSkgeworCXN3aXRjaCAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKLQkJc2VxX3ByaW50ZihzLCAiJXBJNCIsICZzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKTsKKwkJc2VxX3ByaW50ZihzLCAiJXBJNCIsICZzYS0+c2luX2FkZHIuc19hZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBBRl9JTkVUNjoKLQkJc2VxX3ByaW50ZihzLCAiJXBJNiIsCi0JCQkgICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2FkZHIuczZfYWRkcik7Ci0JCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfc2NvcGVfaWQpCi0JCQlzZXFfcHJpbnRmKHMsICIlJSV1IiwKLQkJCQkgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfc2NvcGVfaWQpOworCQlzZXFfcHJpbnRmKHMsICIlcEk2IiwgJnNhNi0+c2luNl9hZGRyLnM2X2FkZHIpOworCQlpZiAoc2E2LT5zaW42X3Njb3BlX2lkKQorCQkJc2VxX3ByaW50ZihzLCAiJSUldSIsIHNhNi0+c2luNl9zY29wZV9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNlcV9wcmludGYocywgIih1bmtub3duKSIpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCmluZGV4IDcxMzZjMGMuLjYwNmNhOGIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2dsb2IuaAorKysgYi9mcy9jaWZzL2NpZnNnbG9iLmgKQEAgLTE2MywxMCArMTYzLDcgQEAKIAljaGFyIHNlcnZlcl9SRkMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOwogCWNoYXIgKmhvc3RuYW1lOyAvKiBob3N0bmFtZSBwb3J0aW9uIG9mIFVOQyBzdHJpbmcgKi8KIAlzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0OwotCXVuaW9uIHsKLQkJc3RydWN0IHNvY2thZGRyX2luIHNvY2tBZGRyOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNvY2tBZGRyNjsKLQl9IGFkZHI7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZHN0YWRkcjsKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzcmNhZGRyOyAvKiBsb2NhbGx5IGJpbmQgdG8gdGhpcyBJUCAqLwogCXdhaXRfcXVldWVfaGVhZF90IHJlc3BvbnNlX3E7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF9xOyAvKiBpZiBtb3JlIHRoYW4gbWF4bXB4IHRvIHNydnIgbXVzdCBibG9jayovCkBAIC0yMTAsNyArMjA3LDcgQEAKIAljaGFyIGNyeXB0a2V5W0NJRlNfQ1JZUFRPX0tFWV9TSVpFXTsgLyogdXNlZCBieSBudGxtLCBudGxtdjIgZXRjICovCiAJLyogMTZ0aCBieXRlIG9mIFJGQzEwMDEgd29ya3N0YXRpb24gbmFtZSBpcyBhbHdheXMgbnVsbCAqLwogCWNoYXIgd29ya3N0YXRpb25fUkZDMTAwMV9uYW1lW1JGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMXTsKLQlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7IC8qIG5lZWRlZCBmb3IgQ0lGUyBQRFUgc2lnbmF0dXJlICovCisJX191MzIgc2VxdWVuY2VfbnVtYmVyOyAvKiBmb3Igc2lnbmluZywgcHJvdGVjdGVkIGJ5IHNydl9tdXRleCAqLwogCXN0cnVjdCBzZXNzaW9uX2tleSBzZXNzaW9uX2tleTsKIAl1bnNpZ25lZCBsb25nIGxzdHJwOyAvKiB3aGVuIHdlIGdvdCBsYXN0IHJlc3BvbnNlIGZyb20gdGhpcyBzZXJ2ZXIgKi8KIAl1MTYgZGlhbGVjdDsgLyogZGlhbGVjdCBpbmRleCB0aGF0IHNlcnZlciBjaG9zZSAqLwpAQCAtNDU2LDYgKzQ1Myw3IEBACiAJYm9vbCBpbnZhbGlkX21hcHBpbmc6MTsJCS8qIHBhZ2VjYWNoZSBpcyBpbnZhbGlkICovCiAJdTY0ICBzZXJ2ZXJfZW9mOwkJLyogY3VycmVudCBmaWxlIHNpemUgb24gc2VydmVyICovCiAJdTY0ICB1bmlxdWVpZDsJCQkvKiBzZXJ2ZXIgaW5vZGUgbnVtYmVyICovCisJdTY0ICBjcmVhdGV0aW1lOwkJLyogY3JlYXRpb24gdGltZSBvbiBzZXJ2ZXIgKi8KICNpZmRlZiBDT05GSUdfQ0lGU19GU0NBQ0hFCiAJc3RydWN0IGZzY2FjaGVfY29va2llICpmc2NhY2hlOwogI2VuZGlmCkBAIC01NzYsNiArNTc0LDcgQEAKIAl1NjQJCWNmX3VuaXF1ZWlkOwogCXU2NAkJY2ZfZW9mOwogCXU2NAkJY2ZfYnl0ZXM7CisJdTY0CQljZl9jcmVhdGV0aW1lOwogCXVpZF90CQljZl91aWQ7CiAJZ2lkX3QJCWNmX2dpZDsKIAl1bW9kZV90CQljZl9tb2RlOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzc21iLmMgYi9mcy9jaWZzL2NpZnNzbWIuYwppbmRleCA2N2FjZmIzLi4yZjY3OTVlIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNzbWIuYworKysgYi9mcy9jaWZzL2NpZnNzbWIuYwpAQCAtNDAxLDE1ICs0MDEsMTIgQEAKIAllbHNlIGlmICgoc2VjRmxhZ3MgJiBDSUZTU0VDX0FVVEhfTUFTSykgPT0gQ0lGU1NFQ19NQVlfS1JCNSkgewogCQljRllJKDEsICJLZXJiZXJvcyBvbmx5IG1lY2hhbmlzbSwgZW5hYmxlIGV4dGVuZGVkIHNlY3VyaXR5Iik7CiAJCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOwotCX0KLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKLQllbHNlIGlmICgoc2VjRmxhZ3MgJiBDSUZTU0VDX01VU1RfTlRMTVNTUCkgPT0gQ0lGU1NFQ19NVVNUX05UTE1TU1ApCisJfSBlbHNlIGlmICgoc2VjRmxhZ3MgJiBDSUZTU0VDX01VU1RfTlRMTVNTUCkgPT0gQ0lGU1NFQ19NVVNUX05UTE1TU1ApCiAJCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOwogCWVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfQVVUSF9NQVNLKSA9PSBDSUZTU0VDX01BWV9OVExNU1NQKSB7CiAJCWNGWUkoMSwgIk5UTE1TU1Agb25seSBtZWNoYW5pc20sIGVuYWJsZSBleHRlbmRlZCBzZWN1cml0eSIpOwogCQlwU01CLT5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfRVhUX1NFQzsKIAl9Ci0jZW5kaWYKIAogCWNvdW50ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgQ0lGU19OVU1fUFJPVDsgaSsrKSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGNjMWE4NjAuLmE2NWQzMTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC02NCw4ICs2NCw4IEBACiAJY2hhciAqVU5DOwogCWNoYXIgKlVOQ2lwOwogCWNoYXIgKmlvY2hhcnNldDsgIC8qIGxvY2FsIGNvZGUgcGFnZSBmb3IgbWFwcGluZyB0byBhbmQgZnJvbSBVbmljb2RlICovCi0JY2hhciBzb3VyY2VfcmZjMTAwMV9uYW1lWzE2XTsgLyogbmV0YmlvcyBuYW1lIG9mIGNsaWVudCAqLwotCWNoYXIgdGFyZ2V0X3JmYzEwMDFfbmFtZVsxNl07IC8qIG5ldGJpb3MgbmFtZSBvZiBzZXJ2ZXIgZm9yIFdpbjl4L01FICovCisJY2hhciBzb3VyY2VfcmZjMTAwMV9uYW1lW1JGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMXTsgLyogY2xudCBuYiBuYW1lICovCisJY2hhciB0YXJnZXRfcmZjMTAwMV9uYW1lW1JGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMXTsgLyogc3J2ciBuYiBuYW1lICovCiAJdWlkX3QgY3JlZF91aWQ7CiAJdWlkX3QgbGludXhfdWlkOwogCWdpZF90IGxpbnV4X2dpZDsKQEAgLTExNSw4ICsxMTUsOCBAQAogI2RlZmluZSBUTElOS19FUlJPUl9FWFBJUkUJKDEgKiBIWikKICNkZWZpbmUgVExJTktfSURMRV9FWFBJUkUJKDYwMCAqIEhaKQogCi1zdGF0aWMgaW50IGlwdjRfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwotc3RhdGljIGludCBpcHY2X2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKK3N0YXRpYyBpbnQgaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOworc3RhdGljIGludCBnZW5lcmljX2lwX2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKIHN0YXRpYyB2b2lkIHRsaW5rX3JiX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IHRjb25fbGluayAqbmV3X3RsaW5rKTsKIHN0YXRpYyB2b2lkIGNpZnNfcHJ1bmVfdGxpbmtzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKQEAgLTIwMCwxMCArMjAwLDkgQEAKIAl3aGlsZSAoKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKSAmJgogCSAgICAgICAoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0dvb2QpKSB7CiAJCXRyeV90b19mcmVlemUoKTsKLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9mYW1pbHkgPT0gQUZfSU5FVDYpCi0JCQlyYyA9IGlwdjZfY29ubmVjdChzZXJ2ZXIpOwotCQllbHNlCi0JCQlyYyA9IGlwdjRfY29ubmVjdChzZXJ2ZXIpOworCisJCS8qIHdlIHNob3VsZCB0cnkgb25seSB0aGUgcG9ydCB3ZSBjb25uZWN0ZWQgdG8gYmVmb3JlICovCisJCXJjID0gZ2VuZXJpY19pcF9jb25uZWN0KHNlcnZlcik7CiAJCWlmIChyYykgewogCQkJY0ZZSSgxLCAicmVjb25uZWN0IGVycm9yICVkIiwgcmMpOwogCQkJbXNsZWVwKDMwMDApOwpAQCAtNDc3LDcgKzQ3Niw3IEBACiAJCQkgKiBpbml0aWFsaXplIGZyYW1lKQogCQkJICovCiAJCQljaWZzX3NldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkciwgQ0lGU19QT1JUKTsKKwkJCQkJJnNlcnZlci0+ZHN0YWRkciwgQ0lGU19QT1JUKTsKIAkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CiAJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwogCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKQEAgLTgxNywxMSArODE2LDExIEBACiAJICogaW5mb3JtYXRpb25hbCwgb25seSB1c2VkIGZvciBzZXJ2ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQKIAkgKiBwb3J0IDQ0NSBhbmQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgbW91bnQgdGltZQogCSAqLwotCW1lbXNldCh2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWUsIDB4MjAsIDE1KTsKLQlmb3IgKGkgPSAwOyBpIDwgc3Rybmxlbihub2RlbmFtZSwgMTUpOyBpKyspCisJbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwgMHgyMCwgUkZDMTAwMV9OQU1FX0xFTik7CisJZm9yIChpID0gMDsgaSA8IHN0cm5sZW4obm9kZW5hbWUsIFJGQzEwMDFfTkFNRV9MRU4pOyBpKyspCiAJCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVtpXSA9IHRvdXBwZXIobm9kZW5hbWVbaV0pOwogCi0Jdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lWzE1XSA9IDA7CisJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW1JGQzEwMDFfTkFNRV9MRU5dID0gMDsKIAkvKiBudWxsIHRhcmdldCBuYW1lIGluZGljYXRlcyB0byB1c2UgKlNNQlNFUlZSIGRlZmF1bHQgY2FsbGVkIG5hbWUKIAkgICBpZiB3ZSBlbmQgdXAgc2VuZGluZyBSRkMxMDAxIHNlc3Npb24gaW5pdGlhbGl6ZSAqLwogCXZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZVswXSA9IDA7CkBAIC05ODUsMTMgKzk4NCwxMSBAQAogCQkJCXJldHVybiAxOwogCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgImtyYjUiLCA0KSA9PSAwKSB7CiAJCQkJdm9sLT5zZWNGbGcgfD0gQ0lGU1NFQ19NQVlfS1JCNTsKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKIAkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtc3NwaSIsIDgpID09IDApIHsKIAkJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01BWV9OVExNU1NQIHwKIAkJCQkJQ0lGU1NFQ19NVVNUX1NJR047CiAJCQl9IGVsc2UgaWYgKHN0cm5pY21wKHZhbHVlLCAibnRsbXNzcCIsIDcpID09IDApIHsKIAkJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01BWV9OVExNU1NQOwotI2VuZGlmCiAJCQl9IGVsc2UgaWYgKHN0cm5pY21wKHZhbHVlLCAibnRsbXYyaSIsIDcpID09IDApIHsKIAkJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01BWV9OVExNVjIgfAogCQkJCQlDSUZTU0VDX01VU1RfU0lHTjsKQEAgLTExNjgsMjIgKzExNjUsMjIgQEAKIAkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSB8fCAoKnZhbHVlID09ICcgJykpIHsKIAkJCQljRllJKDEsICJpbnZhbGlkIChlbXB0eSkgbmV0Ymlvc25hbWUiKTsKIAkJCX0gZWxzZSB7Ci0JCQkJbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwgMHgyMCwgMTUpOwotCQkJCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0JCQkJLyogQkIgYXJlIHRoZXJlIGNhc2VzIGluIHdoaWNoIGEgY29tbWEgY2FuIGJlCi0JCQkJdmFsaWQgaW4gdGhpcyB3b3Jrc3RhdGlvbiBuZXRiaW9zIG5hbWUgKGFuZCBuZWVkCi0JCQkJc3BlY2lhbCBoYW5kbGluZyk/ICovCi0KLQkJCQkvKiBXZSBkbyBub3QgdXBwZXJjYXNlIG5ldGJpb3NuYW1lIGZvciB1c2VyICovCisJCQkJbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwgMHgyMCwKKwkJCQkJUkZDMTAwMV9OQU1FX0xFTik7CisJCQkJLyoKKwkJCQkgKiBGSVhNRTogYXJlIHRoZXJlIGNhc2VzIGluIHdoaWNoIGEgY29tbWEgY2FuCisJCQkJICogYmUgdmFsaWQgaW4gd29ya3N0YXRpb24gbmV0YmlvcyBuYW1lIChhbmQKKwkJCQkgKiBuZWVkIHNwZWNpYWwgaGFuZGxpbmcpPworCQkJCSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBSRkMxMDAxX05BTUVfTEVOOyBpKyspIHsKKwkJCQkJLyogZG9uJ3QgdWNhc2UgbmV0Ymlvc25hbWUgZm9yIHVzZXIgKi8KIAkJCQkJaWYgKHZhbHVlW2ldID09IDApCiAJCQkJCQlicmVhazsKLQkJCQkJZWxzZQotCQkJCQkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0KLQkJCQkJCQkJdmFsdWVbaV07CisJCQkJCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVtpXSA9IHZhbHVlW2ldOwogCQkJCX0KIAkJCQkvKiBUaGUgc3RyaW5nIGhhcyAxNnRoIGJ5dGUgemVybyBzdGlsbCBmcm9tCiAJCQkJc2V0IGF0IHRvcCBvZiB0aGUgZnVuY3Rpb24gICovCi0JCQkJaWYgKChpID09IDE1KSAmJiAodmFsdWVbaV0gIT0gMCkpCisJCQkJaWYgKGkgPT0gUkZDMTAwMV9OQU1FX0xFTiAmJiB2YWx1ZVtpXSAhPSAwKQogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBuZXRiaW9zbmFtZSIKIAkJCQkJCSIgbG9uZ2VyIHRoYW4gMTUgdHJ1bmNhdGVkLlxuIik7CiAJCQl9CkBAIC0xMTkzLDcgKzExOTAsOCBAQAogCQkJCWNGWUkoMSwgImVtcHR5IHNlcnZlciBuZXRiaW9zbmFtZSBzcGVjaWZpZWQiKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogbGFzdCBieXRlLCB0eXBlLCBpcyAweDIwIGZvciBzZXJ2ciB0eXBlICovCi0JCQkJbWVtc2V0KHZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZSwgMHgyMCwgMTYpOworCQkJCW1lbXNldCh2b2wtPnRhcmdldF9yZmMxMDAxX25hbWUsIDB4MjAsCisJCQkJCVJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKIAogCQkJCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CiAJCQkJLyogQkIgYXJlIHRoZXJlIGNhc2VzIGluIHdoaWNoIGEgY29tbWEgY2FuIGJlCkBAIC0xMjEwLDcgKzEyMDgsNyBAQAogCQkJCX0KIAkJCQkvKiBUaGUgc3RyaW5nIGhhcyAxNnRoIGJ5dGUgemVybyBzdGlsbCBmcm9tCiAJCQkJICAgc2V0IGF0IHRvcCBvZiB0aGUgZnVuY3Rpb24gICovCi0JCQkJaWYgKChpID09IDE1KSAmJiAodmFsdWVbaV0gIT0gMCkpCisJCQkJaWYgKGkgPT0gUkZDMTAwMV9OQU1FX0xFTiAmJiB2YWx1ZVtpXSAhPSAwKQogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBzZXJ2ZXIgbmV0IgogCQkJCQkiYmlvc25hbWUgbG9uZ2VyIHRoYW4gMTUgdHJ1bmNhdGVkLlxuIik7CiAJCQl9CkBAIC0xMzQxLDEwICsxMzM5LDggQEAKIAkJCXZvbC0+bm9fcHN4X2FjbCA9IDA7CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vYWNsIiwgNSkgPT0gMCkgewogCQkJdm9sLT5ub19wc3hfYWNsID0gMTsKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibG9jYWxsZWFzZSIsIDYpID09IDApIHsKIAkJCXZvbC0+bG9jYWxfbGVhc2UgPSAxOwotI2VuZGlmCiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInNpZ24iLCA0KSA9PSAwKSB7CiAJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01VU1RfU0lHTjsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAic2VhbCIsIDQpID09IDApIHsKQEAgLTE0NTQsMzUgKzE0NTAsNzEgQEAKIAl9CiB9CiAKKy8qCisgKiBJZiBubyBwb3J0IGlzIHNwZWNpZmllZCBpbiBhZGRyIHN0cnVjdHVyZSwgd2UgdHJ5IHRvIG1hdGNoIHdpdGggNDQ1IHBvcnQKKyAqIGFuZCBpZiBpdCBmYWlscyAtIHdpdGggMTM5IHBvcnRzLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgYWRkcmVzcworICogZmFtaWxpZXMgb2Ygc2VydmVyIGFuZCBhZGRyIGFyZSBlcXVhbC4KKyAqLworc3RhdGljIGJvb2wKK21hdGNoX3BvcnQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgaW50IHBvcnQsICpzcG9ydDsKKworCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzcG9ydCA9ICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmc2VydmVyLT5kc3RhZGRyKS0+c2luX3BvcnQ7CisJCXBvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRyKS0+c2luX3BvcnQ7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCXNwb3J0ID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2VydmVyLT5kc3RhZGRyKS0+c2luNl9wb3J0OworCQlwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIGFkZHIpLT5zaW42X3BvcnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIXBvcnQpIHsKKwkJcG9ydCA9IGh0b25zKENJRlNfUE9SVCk7CisJCWlmIChwb3J0ID09ICpzcG9ydCkKKwkJCXJldHVybiB0cnVlOworCisJCXBvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOworCX0KKworCXJldHVybiBwb3J0ID09ICpzcG9ydDsKK30KIAogc3RhdGljIGJvb2wKIG1hdGNoX2FkZHJlc3Moc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCiAJICAgICAgc3RydWN0IHNvY2thZGRyICpzcmNhZGRyKQogewotCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLQogCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7Ci0JY2FzZSBBRl9JTkVUOgotCQlpZiAoYWRkcjQtPnNpbl9hZGRyLnNfYWRkciAhPQotCQkgICAgc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9hZGRyLnNfYWRkcikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFkZHI0LT5zaW5fcG9ydCAmJgotCQkgICAgYWRkcjQtPnNpbl9wb3J0ICE9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydCkKKwljYXNlIEFGX0lORVQ6IHsKKwkJc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNydl9hZGRyNCA9CisJCQkJCShzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2VydmVyLT5kc3RhZGRyOworCisJCWlmIChhZGRyNC0+c2luX2FkZHIuc19hZGRyICE9IHNydl9hZGRyNC0+c2luX2FkZHIuc19hZGRyKQogCQkJcmV0dXJuIGZhbHNlOwogCQlicmVhazsKLQljYXNlIEFGX0lORVQ2OgorCX0KKwljYXNlIEFGX0lORVQ2OiB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzcnZfYWRkcjYgPQorCQkJCQkoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzZXJ2ZXItPmRzdGFkZHI7CisKIAkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJmFkZHI2LT5zaW42X2FkZHIsCi0JCQkJICAgICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2FkZHIpKQorCQkJCSAgICAgJnNydl9hZGRyNi0+c2luNl9hZGRyKSkKIAkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFkZHI2LT5zaW42X3Njb3BlX2lkICE9Ci0JCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfc2NvcGVfaWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChhZGRyNi0+c2luNl9wb3J0ICYmCi0JCSAgICBhZGRyNi0+c2luNl9wb3J0ICE9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0KQorCQlpZiAoYWRkcjYtPnNpbjZfc2NvcGVfaWQgIT0gc3J2X2FkZHI2LT5zaW42X3Njb3BlX2lkKQogCQkJcmV0dXJuIGZhbHNlOwogCQlicmVhazsKIAl9CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIGZhbHNlOyAvKiBkb24ndCBleHBlY3QgdG8gYmUgaGVyZSAqLworCX0KIAogCWlmICghc3JjaXBfbWF0Y2hlcyhzcmNhZGRyLCAoc3RydWN0IHNvY2thZGRyICopJnNlcnZlci0+c3JjYWRkcikpCiAJCXJldHVybiBmYWxzZTsKQEAgLTE1NDksNiArMTU4MSw5IEBACiAJCQkJICAgKHN0cnVjdCBzb2NrYWRkciAqKSZ2b2wtPnNyY2FkZHIpKQogCQkJY29udGludWU7CiAKKwkJaWYgKCFtYXRjaF9wb3J0KHNlcnZlciwgYWRkcikpCisJCQljb250aW51ZTsKKwogCQlpZiAoIW1hdGNoX3NlY3VyaXR5KHNlcnZlciwgdm9sKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNjgxLDE0ICsxNzE2LDEzIEBACiAJCWNGWUkoMSwgImF0dGVtcHRpbmcgaXB2NiBjb25uZWN0Iik7CiAJCS8qIEJCIHNob3VsZCB3ZSBhbGxvdyBpcHY2IG9uIHBvcnQgMTM5PyAqLwogCQkvKiBvdGhlciBPUyBuZXZlciBvYnNlcnZlZCBpbiBXaWxkIGRvaW5nIDEzOSB3aXRoIHY2ICovCi0JCW1lbWNweSgmdGNwX3Nlcy0+YWRkci5zb2NrQWRkcjYsIHNpbl9zZXJ2ZXI2LAotCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKLQkJcmMgPSBpcHY2X2Nvbm5lY3QodGNwX3Nlcyk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KCZ0Y3Bfc2VzLT5hZGRyLnNvY2tBZGRyLCBzaW5fc2VydmVyLAotCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotCQlyYyA9IGlwdjRfY29ubmVjdCh0Y3Bfc2VzKTsKLQl9CisJCW1lbWNweSgmdGNwX3Nlcy0+ZHN0YWRkciwgc2luX3NlcnZlcjYsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCX0gZWxzZQorCQltZW1jcHkoJnRjcF9zZXMtPmRzdGFkZHIsIHNpbl9zZXJ2ZXIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKwlyYyA9IGlwX2Nvbm5lY3QodGNwX3Nlcyk7CiAJaWYgKHJjIDwgMCkgewogCQljRVJST1IoMSwgIkVycm9yIGNvbm5lY3RpbmcgdG8gc29ja2V0LiBBYm9ydGluZyBvcGVyYXRpb24iKTsKIAkJZ290byBvdXRfZXJyX2NyeXB0b19yZWxlYXNlOwpAQCAtMTc5Myw2ICsxODI3LDggQEAKIHsKIAlpbnQgcmMgPSAtRU5PTUVNLCB4aWQ7CiAJc3RydWN0IGNpZnNTZXNJbmZvICpzZXM7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzZXJ2ZXItPmRzdGFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzZXJ2ZXItPmRzdGFkZHI7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMTgzNiwxMiArMTg3MiwxMCBAQAogCiAJLyogbmV3IFNNQiBzZXNzaW9uIHVzZXMgb3VyIHNlcnZlciByZWYgKi8KIAlzZXMtPnNlcnZlciA9IHNlcnZlcjsKLQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk2IiwKLQkJCSZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkcik7CisJaWYgKHNlcnZlci0+ZHN0YWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNwcmludGYoc2VzLT5zZXJ2ZXJOYW1lLCAiJXBJNiIsICZhZGRyNi0+c2luNl9hZGRyKTsKIAllbHNlCi0JCXNwcmludGYoc2VzLT5zZXJ2ZXJOYW1lLCAiJXBJNCIsCi0JCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9hZGRyLnNfYWRkcik7CisJCXNwcmludGYoc2VzLT5zZXJ2ZXJOYW1lLCAiJXBJNCIsICZhZGRyLT5zaW5fYWRkcik7CiAKIAlpZiAodm9sdW1lX2luZm8tPnVzZXJuYW1lKQogCQlzdHJuY3B5KHNlcy0+dXNlck5hbWUsIHZvbHVtZV9pbmZvLT51c2VybmFtZSwKQEAgLTIxMzYsMTkgKzIxNzAsMTA2IEBACiB9CiAKIHN0YXRpYyBpbnQKLWlwdjRfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCitpcF9yZmMxMDAxX2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQogewogCWludCByYyA9IDA7Ci0JaW50IHZhbDsKLQlib29sIGNvbm5lY3RlZCA9IGZhbHNlOwotCV9fYmUxNiBvcmlnX3BvcnQgPSAwOworCS8qCisJICogc29tZSBzZXJ2ZXJzIHJlcXVpcmUgUkZDMTAwMSBzZXNzaW5pdCBiZWZvcmUgc2VuZGluZworCSAqIG5lZ3Byb3QgLSBCQiBjaGVjayByZWNvbm5lY3Rpb24gaW4gY2FzZSB3aGVyZSBzZWNvbmQKKwkgKiBzZXNzaW5pdCBpcyBzZW50IGJ1dCBubyBzZWNvbmQgbmVncHJvdAorCSAqLworCXN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0ICpzZXNfaW5pdF9idWY7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWY7CisJc2VzX2luaXRfYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmIChzZXNfaW5pdF9idWYpIHsKKwkJc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLmNhbGxlZF9sZW4gPSAzMjsKKworCQlpZiAoc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lICYmCisJCSAgICBzZXJ2ZXItPnNlcnZlcl9SRkMxMDAxX25hbWVbMF0gIT0gMCkKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxlZF9uYW1lLAorCQkJCSAgICAgIHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZSwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisJCWVsc2UKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxlZF9uYW1lLAorCQkJCSAgICAgIERFRkFVTFRfQ0lGU19DQUxMRURfTkFNRSwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisKKwkJc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLmNhbGxpbmdfbGVuID0gMzI7CisKKwkJLyoKKwkJICogY2FsbGluZyBuYW1lIGVuZHMgaW4gbnVsbCAoYnl0ZSAxNikgZnJvbSBvbGQgc21iCisJCSAqIGNvbnZlbnRpb24uCisJCSAqLworCQlpZiAoc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUgJiYKKwkJICAgIHNlcnZlci0+d29ya3N0YXRpb25fUkZDMTAwMV9uYW1lWzBdICE9IDApCisJCQlyZmMxMDAybWFuZ2xlKHNlc19pbml0X2J1Zi0+dHJhaWxlci4KKwkJCQkgICAgICBzZXNzaW9uX3JlcS5jYWxsaW5nX25hbWUsCisJCQkJICAgICAgc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUsCisJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOworCQllbHNlCisJCQlyZmMxMDAybWFuZ2xlKHNlc19pbml0X2J1Zi0+dHJhaWxlci4KKwkJCQkgICAgICBzZXNzaW9uX3JlcS5jYWxsaW5nX25hbWUsCisJCQkJICAgICAgIkxJTlVYX0NJRlNfQ0xOVCIsCisJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOworCisJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTEgPSAwOworCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUyID0gMDsKKwkJc21iX2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKXNlc19pbml0X2J1ZjsKKworCQkvKiBzaXplb2YgUkZDMTAwMl9TRVNTSU9OX1JFUVVFU1Qgd2l0aCBubyBzY29wZSAqLworCQlzbWJfYnVmLT5zbWJfYnVmX2xlbmd0aCA9IDB4ODEwMDAwNDQ7CisJCXJjID0gc21iX3NlbmQoc2VydmVyLCBzbWJfYnVmLCAweDQ0KTsKKwkJa2ZyZWUoc2VzX2luaXRfYnVmKTsKKwkJLyoKKwkJICogUkZDMTAwMSBsYXllciBpbiBhdCBsZWFzdCBvbmUgc2VydmVyCisJCSAqIHJlcXVpcmVzIHZlcnkgc2hvcnQgYnJlYWsgYmVmb3JlIG5lZ3Byb3QKKwkJICogcHJlc3VtYWJseSBiZWNhdXNlIG5vdCBleHBlY3RpbmcgbmVncHJvdAorCQkgKiB0byBmb2xsb3cgc28gZmFzdC4gIFRoaXMgaXMgYSBzaW1wbGUKKwkJICogc29sdXRpb24gdGhhdCB3b3JrcyB3aXRob3V0CisJCSAqIGNvbXBsaWNhdGluZyB0aGUgY29kZSBhbmQgY2F1c2VzIG5vCisJCSAqIHNpZ25pZmljYW50IHNsb3dpbmcgZG93biBvbiBtb3VudAorCQkgKiBmb3IgZXZlcnlvbmUgZWxzZQorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKwkvKgorCSAqIGVsc2UgdGhlIG5lZ3Byb3QgbWF5IHN0aWxsIHdvcmsgd2l0aG91dCB0aGlzCisJICogZXZlbiB0aG91Z2ggbWFsbG9jIGZhaWxlZAorCSAqLworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitnZW5lcmljX2lwX2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgc2hvcnQgaW50IHNwb3J0OworCWludCBzbGVuLCBzZmFtaWx5OwogCXN0cnVjdCBzb2NrZXQgKnNvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyOworCisJc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmRzdGFkZHI7CisKKwlpZiAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYWRkciktPnNpbjZfcG9ydDsKKwkJc2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJc2ZhbWlseSA9IEFGX0lORVQ2OworCX0gZWxzZSB7CisJCXNwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FkZHIpLT5zaW5fcG9ydDsKKwkJc2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQlzZmFtaWx5ID0gQUZfSU5FVDsKKwl9CiAKIAlpZiAoc29ja2V0ID09IE5VTEwpIHsKLQkJcmMgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfU1RSRUFNLAorCQlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oc2ZhbWlseSwgU09DS19TVFJFQU0sCiAJCQkJICAgICAgSVBQUk9UT19UQ1AsICZzb2NrZXQpOwogCQlpZiAocmMgPCAwKSB7CiAJCQljRVJST1IoMSwgIkVycm9yICVkIGNyZWF0aW5nIHNvY2tldCIsIHJjKTsKKwkJCXNlcnZlci0+c3NvY2tldCA9IE5VTEw7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIApAQCAtMjE1NiwyMTggKzIyNzcsMTkgQEAKIAkJY0ZZSSgxLCAiU29ja2V0IGNyZWF0ZWQiKTsKIAkJc2VydmVyLT5zc29ja2V0ID0gc29ja2V0OwogCQlzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7Ci0JCWNpZnNfcmVjbGFzc2lmeV9zb2NrZXQ0KHNvY2tldCk7CisJCWlmIChzZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJY2lmc19yZWNsYXNzaWZ5X3NvY2tldDYoc29ja2V0KTsKKwkJZWxzZQorCQkJY2lmc19yZWNsYXNzaWZ5X3NvY2tldDQoc29ja2V0KTsKIAl9CiAKIAlyYyA9IGJpbmRfc29ja2V0KHNlcnZlcik7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0JLyogdXNlciBvdmVycm9kZSBkZWZhdWx0IHBvcnQgKi8KLQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0KSB7Ci0JCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCSAgJnNlcnZlci0+YWRkci5zb2NrQWRkciwKLQkJCQkJICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwgMCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoIWNvbm5lY3RlZCkgewotCQkvKiBzYXZlIG9yaWdpbmFsIHBvcnQgc28gd2UgY2FuIHJldHJ5IHVzZXIgc3BlY2lmaWVkIHBvcnQKLQkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KLQkJb3JpZ19wb3J0ID0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0OwotCi0JCS8qIGRvIG5vdCByZXRyeSBvbiB0aGUgc2FtZSBwb3J0IHdlIGp1c3QgZmFpbGVkIG9uICovCi0JCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgIT0gaHRvbnMoQ0lGU19QT1JUKSkgewotCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKLQkJCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LAotCQkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkciwKLQkJCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCAwKTsKLQkJCWlmIChyYyA+PSAwKQotCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JaWYgKCFjb25uZWN0ZWQpIHsKLQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gaHRvbnMoUkZDMTAwMV9QT1JUKTsKLQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJICAgICAgJnNlcnZlci0+YWRkci5zb2NrQWRkciwKLQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIDApOwotCQlpZiAocmMgPj0gMCkKLQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JfQotCi0JLyogZ2l2ZSB1cCBoZXJlIC0gdW5sZXNzIHdlIHdhbnQgdG8gcmV0cnkgb24gZGlmZmVyZW50Ci0JCXByb3RvY29sIGZhbWlsaWVzIHNvbWUgZGF5ICovCi0JaWYgKCFjb25uZWN0ZWQpIHsKLQkJaWYgKG9yaWdfcG9ydCkKLQkJCXNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydCA9IG9yaWdfcG9ydDsKLQkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIgdmlhIGlwdjQiLCByYyk7Ci0JCXNvY2tfcmVsZWFzZShzb2NrZXQpOwotCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0KLQkvKgotCSAqIEV2ZW50dWFsbHkgY2hlY2sgZm9yIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIGNoYW5nZSBmcm9tCi0JICogIHRoZSBkZWZhdWx0LiBzb2NrX3NldHNvY2tvcHQgbm90IHVzZWQgYmVjYXVzZSBpdCBleHBlY3RzCi0JICogIHVzZXIgc3BhY2UgYnVmZmVyCi0JICovCi0Jc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSA3ICogSFo7Ci0Jc29ja2V0LT5zay0+c2tfc25kdGltZW8gPSA1ICogSFo7Ci0KLQkvKiBtYWtlIHRoZSBidWZzaXplcyBkZXBlbmQgb24gd3NpemUvcnNpemUgYW5kIG1heCByZXF1ZXN0cyAqLwotCWlmIChzZXJ2ZXItPm5vYXV0b3R1bmUpIHsKLQkJaWYgKHNvY2tldC0+c2stPnNrX3NuZGJ1ZiA8ICgyMDAgKiAxMDI0KSkKLQkJCXNvY2tldC0+c2stPnNrX3NuZGJ1ZiA9IDIwMCAqIDEwMjQ7Ci0JCWlmIChzb2NrZXQtPnNrLT5za19yY3ZidWYgPCAoMTQwICogMTAyNCkpCi0JCQlzb2NrZXQtPnNrLT5za19yY3ZidWYgPSAxNDAgKiAxMDI0OwotCX0KLQotCWlmIChzZXJ2ZXItPnRjcF9ub2RlbGF5KSB7Ci0JCXZhbCA9IDE7Ci0JCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29ja2V0LCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwKLQkJCQkoY2hhciAqKSZ2YWwsIHNpemVvZih2YWwpKTsKLQkJaWYgKHJjKQotCQkJY0ZZSSgxLCAic2V0IFRDUF9OT0RFTEFZIHNvY2tldCBvcHRpb24gZXJyb3IgJWQiLCByYyk7Ci0JfQotCi0JIGNGWUkoMSwgInNuZGJ1ZiAlZCByY3ZidWYgJWQgcmN2dGltZW8gMHglbHgiLAotCQkgc29ja2V0LT5zay0+c2tfc25kYnVmLAotCQkgc29ja2V0LT5zay0+c2tfcmN2YnVmLCBzb2NrZXQtPnNrLT5za19yY3Z0aW1lbyk7Ci0KLQkvKiBzZW5kIFJGQzEwMDEgc2Vzc2luaXQgKi8KLQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID09IGh0b25zKFJGQzEwMDFfUE9SVCkpIHsKLQkJLyogc29tZSBzZXJ2ZXJzIHJlcXVpcmUgUkZDMTAwMSBzZXNzaW5pdCBiZWZvcmUgc2VuZGluZwotCQluZWdwcm90IC0gQkIgY2hlY2sgcmVjb25uZWN0aW9uIGluIGNhc2Ugd2hlcmUgc2Vjb25kCi0JCXNlc3Npbml0IGlzIHNlbnQgYnV0IG5vIHNlY29uZCBuZWdwcm90ICovCi0JCXN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0ICpzZXNfaW5pdF9idWY7Ci0JCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmOwotCQlzZXNfaW5pdF9idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCksCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoc2VzX2luaXRfYnVmKSB7Ci0JCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOwotCQkJaWYgKHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZSAmJgotCQkJICAgIHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZVswXSAhPSAwKQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCi0JCQkJCSAgICAgIHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZSwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCQkJZWxzZQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCi0JCQkJCSAgICAgIERFRkFVTFRfQ0lGU19DQUxMRURfTkFNRSwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCi0JCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGluZ19sZW4gPSAzMjsKLQotCQkJLyogY2FsbGluZyBuYW1lIGVuZHMgaW4gbnVsbCAoYnl0ZSAxNikgZnJvbSBvbGQgc21iCi0JCQljb252ZW50aW9uLiAqLwotCQkJaWYgKHNlcnZlci0+d29ya3N0YXRpb25fUkZDMTAwMV9uYW1lICYmCi0JCQkgICAgc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbMF0gIT0gMCkKLQkJCQlyZmMxMDAybWFuZ2xlKHNlc19pbml0X2J1Zi0+dHJhaWxlci4KLQkJCQkJCXNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKLQkJCQkJICAgICAgc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUsCi0JCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKLQkJCWVsc2UKLQkJCQlyZmMxMDAybWFuZ2xlKHNlc19pbml0X2J1Zi0+dHJhaWxlci4KLQkJCQkJCXNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKLQkJCQkJICAgICAgIkxJTlVYX0NJRlNfQ0xOVCIsCi0JCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKLQotCQkJc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLnNjb3BlMSA9IDA7Ci0JCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUyID0gMDsKLQkJCXNtYl9idWYgPSAoc3RydWN0IHNtYl9oZHIgKilzZXNfaW5pdF9idWY7Ci0JCQkvKiBzaXplb2YgUkZDMTAwMl9TRVNTSU9OX1JFUVVFU1Qgd2l0aCBubyBzY29wZSAqLwotCQkJc21iX2J1Zi0+c21iX2J1Zl9sZW5ndGggPSAweDgxMDAwMDQ0OwotCQkJcmMgPSBzbWJfc2VuZChzZXJ2ZXIsIHNtYl9idWYsIDB4NDQpOwotCQkJa2ZyZWUoc2VzX2luaXRfYnVmKTsKLQkJCW1zbGVlcCgxKTsgLyogUkZDMTAwMSBsYXllciBpbiBhdCBsZWFzdCBvbmUgc2VydmVyCi0JCQkJICAgICAgcmVxdWlyZXMgdmVyeSBzaG9ydCBicmVhayBiZWZvcmUgbmVncHJvdAotCQkJCSAgICAgIHByZXN1bWFibHkgYmVjYXVzZSBub3QgZXhwZWN0aW5nIG5lZ3Byb3QKLQkJCQkgICAgICB0byBmb2xsb3cgc28gZmFzdC4gIFRoaXMgaXMgYSBzaW1wbGUKLQkJCQkgICAgICBzb2x1dGlvbiB0aGF0IHdvcmtzIHdpdGhvdXQKLQkJCQkgICAgICBjb21wbGljYXRpbmcgdGhlIGNvZGUgYW5kIGNhdXNlcyBubwotCQkJCSAgICAgIHNpZ25pZmljYW50IHNsb3dpbmcgZG93biBvbiBtb3VudAotCQkJCSAgICAgIGZvciBldmVyeW9uZSBlbHNlICovCi0JCX0KLQkJLyogZWxzZSB0aGUgbmVncHJvdCBtYXkgc3RpbGwgd29yayB3aXRob3V0IHRoaXMKLQkJZXZlbiB0aG91Z2ggbWFsbG9jIGZhaWxlZCAqLwotCi0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50Ci1pcHY2X2Nvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQotewotCWludCByYyA9IDA7Ci0JaW50IHZhbDsKLQlib29sIGNvbm5lY3RlZCA9IGZhbHNlOwotCV9fYmUxNiBvcmlnX3BvcnQgPSAwOwotCXN0cnVjdCBzb2NrZXQgKnNvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQotCWlmIChzb2NrZXQgPT0gTlVMTCkgewotCQlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVDYsIFNPQ0tfU1RSRUFNLAotCQkJCSAgICAgIElQUFJPVE9fVENQLCAmc29ja2V0KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJY0VSUk9SKDEsICJFcnJvciAlZCBjcmVhdGluZyBpcHY2IHNvY2tldCIsIHJjKTsKLQkJCXNvY2tldCA9IE5VTEw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQkvKiBCQiBvdGhlciBzb2NrZXQgb3B0aW9ucyB0byBzZXQgS0VFUEFMSVZFLCBOT0RFTEFZPyAqLwotCQljRllJKDEsICJpcHY2IFNvY2tldCBjcmVhdGVkIik7Ci0JCXNlcnZlci0+c3NvY2tldCA9IHNvY2tldDsKLQkJc29ja2V0LT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0ZTOwotCQljaWZzX3JlY2xhc3NpZnlfc29ja2V0Nihzb2NrZXQpOwotCX0KLQotCXJjID0gYmluZF9zb2NrZXQoc2VydmVyKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiB1c2VyIG92ZXJyb2RlIGRlZmF1bHQgcG9ydCAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydCkgewotCQlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwKLQkJCQkoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LAotCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwgMCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoIWNvbm5lY3RlZCkgewotCQkvKiBzYXZlIG9yaWdpbmFsIHBvcnQgc28gd2UgY2FuIHJldHJ5IHVzZXIgc3BlY2lmaWVkIHBvcnQKLQkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KLQotCQlvcmlnX3BvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydDsKLQkJLyogZG8gbm90IHJldHJ5IG9uIHRoZSBzYW1lIHBvcnQgd2UganVzdCBmYWlsZWQgb24gKi8KLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ICE9IGh0b25zKENJRlNfUE9SVCkpIHsKLQkJCXNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKLQkJCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCSZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LAotCQkJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksIDApOwotCQkJaWYgKHJjID49IDApCi0JCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJfQotCX0KLQlpZiAoIWNvbm5lY3RlZCkgewotCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7Ci0JCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopCi0JCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkcjYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLCAwKTsKLQkJaWYgKHJjID49IDApCi0JCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotCS8qIGdpdmUgdXAgaGVyZSAtIHVubGVzcyB3ZSB3YW50IHRvIHJldHJ5IG9uIGRpZmZlcmVudAotCQlwcm90b2NvbCBmYW1pbGllcyBzb21lIGRheSAqLwotCWlmICghY29ubmVjdGVkKSB7Ci0JCWlmIChvcmlnX3BvcnQpCi0JCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydCA9IG9yaWdfcG9ydDsKLQkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIgdmlhIGlwdjYiLCByYyk7CisJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIHNhZGRyLCBzbGVuLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWNGWUkoMSwgIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc2VydmVyIiwgcmMpOwogCQlzb2NrX3JlbGVhc2Uoc29ja2V0KTsKIAkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKIAkJcmV0dXJuIHJjOwpAQCAtMjM4MSwxOSArMjMwMyw2MSBAQAogCXNvY2tldC0+c2stPnNrX3JjdnRpbWVvID0gNyAqIEhaOwogCXNvY2tldC0+c2stPnNrX3NuZHRpbWVvID0gNSAqIEhaOwogCisJLyogbWFrZSB0aGUgYnVmc2l6ZXMgZGVwZW5kIG9uIHdzaXplL3JzaXplIGFuZCBtYXggcmVxdWVzdHMgKi8KKwlpZiAoc2VydmVyLT5ub2F1dG90dW5lKSB7CisJCWlmIChzb2NrZXQtPnNrLT5za19zbmRidWYgPCAoMjAwICogMTAyNCkpCisJCQlzb2NrZXQtPnNrLT5za19zbmRidWYgPSAyMDAgKiAxMDI0OworCQlpZiAoc29ja2V0LT5zay0+c2tfcmN2YnVmIDwgKDE0MCAqIDEwMjQpKQorCQkJc29ja2V0LT5zay0+c2tfcmN2YnVmID0gMTQwICogMTAyNDsKKwl9CisKIAlpZiAoc2VydmVyLT50Y3Bfbm9kZWxheSkgewotCQl2YWwgPSAxOworCQlpbnQgdmFsID0gMTsKIAkJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrZXQsIFNPTF9UQ1AsIFRDUF9OT0RFTEFZLAogCQkJCShjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOwogCQlpZiAocmMpCiAJCQljRllJKDEsICJzZXQgVENQX05PREVMQVkgc29ja2V0IG9wdGlvbiBlcnJvciAlZCIsIHJjKTsKIAl9CiAKLQlzZXJ2ZXItPnNzb2NrZXQgPSBzb2NrZXQ7CisJIGNGWUkoMSwgInNuZGJ1ZiAlZCByY3ZidWYgJWQgcmN2dGltZW8gMHglbHgiLAorCQkgc29ja2V0LT5zay0+c2tfc25kYnVmLAorCQkgc29ja2V0LT5zay0+c2tfcmN2YnVmLCBzb2NrZXQtPnNrLT5za19yY3Z0aW1lbyk7CisKKwlpZiAoc3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkKKwkJcmMgPSBpcF9yZmMxMDAxX2Nvbm5lY3Qoc2VydmVyKTsKIAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludAoraXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJdW5zaWduZWQgc2hvcnQgaW50ICpzcG9ydDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlci0+ZHN0YWRkcjsKKworCWlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzcG9ydCA9ICZhZGRyNi0+c2luNl9wb3J0OworCWVsc2UKKwkJc3BvcnQgPSAmYWRkci0+c2luX3BvcnQ7CisKKwlpZiAoKnNwb3J0ID09IDApIHsKKwkJaW50IHJjOworCisJCS8qIHRyeSB3aXRoIDQ0NSBwb3J0IGF0IGZpcnN0ICovCisJCSpzcG9ydCA9IGh0b25zKENJRlNfUE9SVCk7CisKKwkJcmMgPSBnZW5lcmljX2lwX2Nvbm5lY3Qoc2VydmVyKTsKKwkJaWYgKHJjID49IDApCisJCQlyZXR1cm4gcmM7CisKKwkJLyogaWYgaXQgZmFpbGVkLCB0cnkgd2l0aCAxMzkgcG9ydCAqLworCQkqc3BvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOworCX0KKworCXJldHVybiBnZW5lcmljX2lwX2Nvbm5lY3Qoc2VydmVyKTsKK30KKwogdm9pZCByZXNldF9jaWZzX3VuaXhfY2FwcyhpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAogCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc21iX3ZvbCAqdm9sX2luZm8pCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCBkYjJhNThjLi4xZTk1ZGQ2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2Rpci5jCisrKyBiL2ZzL2NpZnMvZGlyLmMKQEAgLTEzMCwxNyArMTMwLDYgQEAKIAlyZXR1cm4gZnVsbF9wYXRoOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9jaWZzX2RlbnRyeShzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAotCQkJICAgICAgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksCi0JCQkgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld2lub2RlKQotewotCWlmICh0Y29uLT5ub2Nhc2UpCi0JCWRfc2V0X2Rfb3AoZGlyZW50cnksICZjaWZzX2NpX2RlbnRyeV9vcHMpOwotCWVsc2UKLQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfZGVudHJ5X29wcyk7Ci0JZF9pbnN0YW50aWF0ZShkaXJlbnRyeSwgbmV3aW5vZGUpOwotfQotCiAvKiBJbm9kZSBvcGVyYXRpb25zIGluIHNpbWlsYXIgb3JkZXIgdG8gaG93IHRoZXkgYXBwZWFyIGluIExpbnV4IGZpbGUgZnMuaCAqLwogCiBpbnQKQEAgLTI5MywxMCArMjgyLDggQEAKIAkJCWFyZ3MudWlkID0gTk9fQ0hBTkdFXzY0OwogCQkJYXJncy5naWQgPSBOT19DSEFOR0VfNjQ7CiAJCX0KLQkJQ0lGU1NNQlVuaXhTZXRQYXRoSW5mbyh4aWQsIHRjb24sIGZ1bGxfcGF0aCwgJmFyZ3MsCi0JCQkJCWNpZnNfc2ItPmxvY2FsX25scywKLQkJCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCQlDSUZTU01CVW5peFNldEZpbGVJbmZvKHhpZCwgdGNvbiwgJmFyZ3MsIGZpbGVIYW5kbGUsCisJCQkJCWN1cnJlbnQtPnRnaWQpOwogCX0gZWxzZSB7CiAJCS8qIEJCIGltcGxlbWVudCBtb2RlIHNldHRpbmcgdmlhIFdpbmRvd3Mgc2VjdXJpdHkKIAkJICAgZGVzY3JpcHRvcnMgZS5nLiAqLwpAQCAtMzI5LDcgKzMxNiw3IEBACiAKIGNpZnNfY3JlYXRlX3NldF9kZW50cnk6CiAJaWYgKHJjID09IDApCi0JCXNldHVwX2NpZnNfZGVudHJ5KHRjb24sIGRpcmVudHJ5LCBuZXdpbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKIAllbHNlCiAJCWNGWUkoMSwgIkNyZWF0ZSB3b3JrZWQsIGdldF9pbm9kZV9pbmZvIGZhaWxlZCByYyA9ICVkIiwgcmMpOwogCkBAIC00MjAsMTAgKzQwNyw2IEBACiAKIAkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJm5ld2lub2RlLCBmdWxsX3BhdGgsCiAJCQkJCQlpbm9kZS0+aV9zYiwgeGlkKTsKLQkJaWYgKHBUY29uLT5ub2Nhc2UpCi0JCQlkX3NldF9kX29wKGRpcmVudHJ5LCAmY2lmc19jaV9kZW50cnlfb3BzKTsKLQkJZWxzZQotCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfZGVudHJ5X29wcyk7CiAKIAkJaWYgKHJjID09IDApCiAJCQlkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBuZXdpbm9kZSk7CkBAIC02MDMsMTAgKzU4Niw2IEBACiAJCQkJcGFyZW50X2Rpcl9pbm9kZS0+aV9zYiwgeGlkLCBOVUxMKTsKIAogCWlmICgocmMgPT0gMCkgJiYgKG5ld0lub2RlICE9IE5VTEwpKSB7Ci0JCWlmIChwVGNvbi0+bm9jYXNlKQotCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfY2lfZGVudHJ5X29wcyk7Ci0JCWVsc2UKLQkJCWRfc2V0X2Rfb3AoZGlyZW50cnksICZjaWZzX2RlbnRyeV9vcHMpOwogCQlkX2FkZChkaXJlbnRyeSwgbmV3SW5vZGUpOwogCQlpZiAocG9zaXhfb3BlbikgewogCQkJZmlscCA9IGxvb2t1cF9pbnN0YW50aWF0ZV9maWxwKG5kLCBkaXJlbnRyeSwKQEAgLTYzMywxMCArNjEyLDYgQEAKIAl9IGVsc2UgaWYgKHJjID09IC1FTk9FTlQpIHsKIAkJcmMgPSAwOwogCQlkaXJlbnRyeS0+ZF90aW1lID0gamlmZmllczsKLQkJaWYgKHBUY29uLT5ub2Nhc2UpCi0JCQlkX3NldF9kX29wKGRpcmVudHJ5LCAmY2lmc19jaV9kZW50cnlfb3BzKTsKLQkJZWxzZQotCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfZGVudHJ5X29wcyk7CiAJCWRfYWRkKGRpcmVudHJ5LCBOVUxMKTsKIAkvKglpZiBpdCB3YXMgb25jZSBhIGRpcmVjdG9yeSAoYnV0IGhvdyBjYW4gd2UgdGVsbD8pIHdlIGNvdWxkIGRvCiAJCXNocmlua19kY2FjaGVfcGFyZW50KGRpcmVudHJ5KTsgKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggNWEyODY2MC4uZDg0MzYzMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTEwNCw1MyArMTA0LDYgQEAKIAkJcmV0dXJuIEZJTEVfT1BFTjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2lmc19vcGVuX2lub2RlX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uLCBfX3UzMiBvcGxvY2ssIEZJTEVfQUxMX0lORk8gKmJ1ZiwKLQljaGFyICpmdWxsX3BhdGgsIGludCB4aWQpCi17Ci0Jc3RydWN0IGNpZnNJbm9kZUluZm8gKnBDaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOwotCXN0cnVjdCB0aW1lc3BlYyB0ZW1wOwotCWludCByYzsKLQotCWlmIChwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKLQkJLyogd2UgaGF2ZSB0aGUgaW5vZGUgb3BlbiBzb21ld2hlcmUgZWxzZQotCQkgICBubyBuZWVkIHRvIGRpc2NhcmQgY2FjaGUgZGF0YSAqLwotCQlnb3RvIGNsaWVudF9jYW5fY2FjaGU7Ci0JfQotCi0JLyogQkIgbmVlZCBzYW1lIGNoZWNrIGluIGNpZnNfY3JlYXRlIHRvbz8gKi8KLQkvKiBpZiBub3Qgb3Bsb2NrZWQsIGludmFsaWRhdGUgaW5vZGUgcGFnZXMgaWYgbXRpbWUgb3IgZmlsZQotCSAgIHNpemUgY2hhbmdlZCAqLwotCXRlbXAgPSBjaWZzX05UdGltZVRvVW5peChidWYtPkxhc3RXcml0ZVRpbWUpOwotCWlmICh0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZ0ZW1wKSAmJgotCQkJICAgKGlub2RlLT5pX3NpemUgPT0KLQkJCSAgICAobG9mZl90KWxlNjRfdG9fY3B1KGJ1Zi0+RW5kT2ZGaWxlKSkpIHsKLQkJY0ZZSSgxLCAiaW5vZGUgdW5jaGFuZ2VkIG9uIHNlcnZlciIpOwotCX0gZWxzZSB7Ci0JCWlmIChpbm9kZS0+aV9tYXBwaW5nKSB7Ci0JCQkvKiBCQiBubyBuZWVkIHRvIGxvY2sgaW5vZGUgdW50aWwgYWZ0ZXIgaW52YWxpZGF0ZQotCQkJc2luY2UgbmFtZWkgY29kZSBzaG91bGQgYWxyZWFkeSBoYXZlIGl0IGxvY2tlZD8gKi8KLQkJCXJjID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKLQkJCW1hcHBpbmdfc2V0X2Vycm9yKGlub2RlLT5pX21hcHBpbmcsIHJjKTsKLQkJfQotCQljRllJKDEsICJpbnZhbGlkYXRpbmcgcmVtb3RlIGlub2RlIHNpbmNlIG9wZW4gZGV0ZWN0ZWQgaXQgIgotCQkJICJjaGFuZ2VkIik7Ci0JCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKLQl9Ci0KLWNsaWVudF9jYW5fY2FjaGU6Ci0JaWYgKHBUY29uLT51bml4X2V4dCkKLQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJmlub2RlLCBmdWxsX3BhdGgsIGlub2RlLT5pX3NiLAotCQkJCQkgICAgICB4aWQpOwotCWVsc2UKLQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZpbm9kZSwgZnVsbF9wYXRoLCBidWYsIGlub2RlLT5pX3NiLAotCQkJCQkgeGlkLCBOVUxMKTsKLQotCWNpZnNfc2V0X29wbG9ja19sZXZlbChwQ2lmc0lub2RlLCBvcGxvY2spOwotCi0JcmV0dXJuIHJjOwotfQotCiBpbnQgY2lmc19wb3NpeF9vcGVuKGNoYXIgKmZ1bGxfcGF0aCwgc3RydWN0IGlub2RlICoqcGlub2RlLAogCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIHVuc2lnbmVkIGludCBmX2ZsYWdzLAogCQkJX191MzIgKnBvcGxvY2ssIF9fdTE2ICpwbmV0ZmlkLCBpbnQgeGlkKQpAQCAtMjEzLDYgKzE2Niw3NiBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludAorY2lmc19udF9vcGVuKGNoYXIgKmZ1bGxfcGF0aCwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKKwkgICAgIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIHVuc2lnbmVkIGludCBmX2ZsYWdzLCBfX3UzMiAqcG9wbG9jaywKKwkgICAgIF9fdTE2ICpwbmV0ZmlkLCBpbnQgeGlkKQoreworCWludCByYzsKKwlpbnQgZGVzaXJlZEFjY2VzczsKKwlpbnQgZGlzcG9zaXRpb247CisJRklMRV9BTExfSU5GTyAqYnVmOworCisJZGVzaXJlZEFjY2VzcyA9IGNpZnNfY29udmVydF9mbGFncyhmX2ZsYWdzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIG9wZW4gZmxhZyBtYXBwaW5nIHRhYmxlOgorICoKKyAqCVBPU0lYIEZsYWcgICAgICAgICAgICBDSUZTIERpc3Bvc2l0aW9uCisgKgktLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQorICoJT19DUkVBVCAgICAgICAgICAgICAgIEZJTEVfT1BFTl9JRgorICoJT19DUkVBVCB8IE9fRVhDTCAgICAgIEZJTEVfQ1JFQVRFCisgKglPX0NSRUFUIHwgT19UUlVOQyAgICAgRklMRV9PVkVSV1JJVEVfSUYKKyAqCU9fVFJVTkMgICAgICAgICAgICAgICBGSUxFX09WRVJXUklURQorICoJbm9uZSBvZiB0aGUgYWJvdmUgICAgIEZJTEVfT1BFTgorICoKKyAqCU5vdGUgdGhhdCB0aGVyZSBpcyBub3QgYSBkaXJlY3QgbWF0Y2ggYmV0d2VlbiBkaXNwb3NpdGlvbgorICoJRklMRV9TVVBFUlNFREUgKGllIGNyZWF0ZSB3aGV0aGVyIG9yIG5vdCBmaWxlIGV4aXN0cyBhbHRob3VnaAorICoJT19DUkVBVCB8IE9fVFJVTkMgaXMgc2ltaWxhciBidXQgdHJ1bmNhdGVzIHRoZSBleGlzdGluZworICoJZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBmaWxlIGFzIEZJTEVfU1VQRVJTRURFIGRvZXMKKyAqCSh3aGljaCB1c2VzIHRoZSBhdHRyaWJ1dGVzIC8gbWV0YWRhdGEgcGFzc2VkIGluIG9uIG9wZW4gY2FsbCkKKyAqPworICo/ICBPX1NZTkMgaXMgYSByZWFzb25hYmxlIG1hdGNoIHRvIENJRlMgd3JpdGV0aHJvdWdoIGZsYWcKKyAqPyAgYW5kIHRoZSByZWFkIHdyaXRlIGZsYWdzIG1hdGNoIHJlYXNvbmFibHkuICBPX0xBUkdFRklMRQorICo/ICBpcyBpcnJlbGV2YW50IGJlY2F1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgaXMgYWx3YXlzIHVzZWQKKyAqPyAgYnkgdGhpcyBjbGllbnQuIEZsYWdzIE9fQVBQRU5ELCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksCisgKgkgT19GQVNZTkMsIE9fTk9GT0xMT1csIE9fTk9OQkxPQ0sgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlkaXNwb3NpdGlvbiA9IGNpZnNfZ2V0X2Rpc3Bvc2l0aW9uKGZfZmxhZ3MpOworCisJLyogQkIgcGFzcyBPX1NZTkMgZmxhZyB0aHJvdWdoIG9uIGZpbGUgYXR0cmlidXRlcyAuLiBCQiAqLworCisJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQorCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKKwkJCSBkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgcG5ldGZpZCwgcG9wbG9jaywgYnVmLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKKwkJCQkgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJZWxzZQorCQlyYyA9IFNNQkxlZ2FjeU9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAorCQkJZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsIHBuZXRmaWQsIHBvcGxvY2ssIGJ1ZiwKKwkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKKwkJCQkmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlpZiAodGNvbi0+dW5peF9leHQpCisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZpbm9kZSwgZnVsbF9wYXRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgeGlkKTsKKwllbHNlCisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmaW5vZGUsIGZ1bGxfcGF0aCwgYnVmLCBpbm9kZS0+aV9zYiwKKwkJCQkJIHhpZCwgcG5ldGZpZCk7CisKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByYzsKK30KKwogc3RydWN0IGNpZnNGaWxlSW5mbyAqCiBjaWZzX25ld19maWxlaW5mbyhfX3UxNiBmaWxlSGFuZGxlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJICBzdHJ1Y3QgdGNvbl9saW5rICp0bGluaywgX191MzIgb3Bsb2NrKQpAQCAtMzE3LDEwICszNDAsOCBAQAogCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDaWZzRmlsZSA9IE5VTEw7CiAJc3RydWN0IGNpZnNJbm9kZUluZm8gKnBDaWZzSW5vZGU7CiAJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKLQlpbnQgZGVzaXJlZEFjY2VzczsKLQlpbnQgZGlzcG9zaXRpb247CisJYm9vbCBwb3NpeF9vcGVuX29rID0gZmFsc2U7CiAJX191MTYgbmV0ZmlkOwotCUZJTEVfQUxMX0lORk8gKmJ1ZiA9IE5VTEw7CiAKIAl4aWQgPSBHZXRYaWQoKTsKIApAQCAtMzU4LDE3ICszNzksNyBAQAogCQkJCWZpbGUtPmZfZmxhZ3MsICZvcGxvY2ssICZuZXRmaWQsIHhpZCk7CiAJCWlmIChyYyA9PSAwKSB7CiAJCQljRllJKDEsICJwb3NpeCBvcGVuIHN1Y2NlZWRlZCIpOwotCi0JCQlwQ2lmc0ZpbGUgPSBjaWZzX25ld19maWxlaW5mbyhuZXRmaWQsIGZpbGUsIHRsaW5rLAotCQkJCQkJICAgICAgb3Bsb2NrKTsKLQkJCWlmIChwQ2lmc0ZpbGUgPT0gTlVMTCkgewotCQkJCUNJRlNTTUJDbG9zZSh4aWQsIHRjb24sIG5ldGZpZCk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJfQotCi0JCQljaWZzX2ZzY2FjaGVfc2V0X2lub2RlX2Nvb2tpZShpbm9kZSwgZmlsZSk7Ci0KLQkJCWdvdG8gb3V0OworCQkJcG9zaXhfb3Blbl9vayA9IHRydWU7CiAJCX0gZWxzZSBpZiAoKHJjID09IC1FSU5WQUwpIHx8IChyYyA9PSAtRU9QTk9UU1VQUCkpIHsKIAkJCWlmICh0Y29uLT5zZXMtPnNlcnZlck5PUykKIAkJCQljRVJST1IoMSwgInNlcnZlciAlcyBvZiB0eXBlICVzIHJldHVybmVkIgpAQCAtMzg1LDEwMyArMzk2LDM5IEBACiAJCSAgIG9yIERGUyBlcnJvcnMgKi8KIAl9CiAKLQlkZXNpcmVkQWNjZXNzID0gY2lmc19jb252ZXJ0X2ZsYWdzKGZpbGUtPmZfZmxhZ3MpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgb3BlbiBmbGFnIG1hcHBpbmcgdGFibGU6Ci0gKgotICoJUE9TSVggRmxhZyAgICAgICAgICAgIENJRlMgRGlzcG9zaXRpb24KLSAqCS0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gKglPX0NSRUFUICAgICAgICAgICAgICAgRklMRV9PUEVOX0lGCi0gKglPX0NSRUFUIHwgT19FWENMICAgICAgRklMRV9DUkVBVEUKLSAqCU9fQ1JFQVQgfCBPX1RSVU5DICAgICBGSUxFX09WRVJXUklURV9JRgotICoJT19UUlVOQyAgICAgICAgICAgICAgIEZJTEVfT1ZFUldSSVRFCi0gKglub25lIG9mIHRoZSBhYm92ZSAgICAgRklMRV9PUEVOCi0gKgotICoJTm90ZSB0aGF0IHRoZXJlIGlzIG5vdCBhIGRpcmVjdCBtYXRjaCBiZXR3ZWVuIGRpc3Bvc2l0aW9uCi0gKglGSUxFX1NVUEVSU0VERSAoaWUgY3JlYXRlIHdoZXRoZXIgb3Igbm90IGZpbGUgZXhpc3RzIGFsdGhvdWdoCi0gKglPX0NSRUFUIHwgT19UUlVOQyBpcyBzaW1pbGFyIGJ1dCB0cnVuY2F0ZXMgdGhlIGV4aXN0aW5nCi0gKglmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGZpbGUgYXMgRklMRV9TVVBFUlNFREUgZG9lcwotICoJKHdoaWNoIHVzZXMgdGhlIGF0dHJpYnV0ZXMgLyBtZXRhZGF0YSBwYXNzZWQgaW4gb24gb3BlbiBjYWxsKQotICo/Ci0gKj8gIE9fU1lOQyBpcyBhIHJlYXNvbmFibGUgbWF0Y2ggdG8gQ0lGUyB3cml0ZXRocm91Z2ggZmxhZwotICo/ICBhbmQgdGhlIHJlYWQgd3JpdGUgZmxhZ3MgbWF0Y2ggcmVhc29uYWJseS4gIE9fTEFSR0VGSUxFCi0gKj8gIGlzIGlycmVsZXZhbnQgYmVjYXVzZSBsYXJnZWZpbGUgc3VwcG9ydCBpcyBhbHdheXMgdXNlZAotICo/ICBieSB0aGlzIGNsaWVudC4gRmxhZ3MgT19BUFBFTkQsIE9fRElSRUNULCBPX0RJUkVDVE9SWSwKLSAqCSBPX0ZBU1lOQywgT19OT0ZPTExPVywgT19OT05CTE9DSyBuZWVkIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCWRpc3Bvc2l0aW9uID0gY2lmc19nZXRfZGlzcG9zaXRpb24oZmlsZS0+Zl9mbGFncyk7Ci0KLQkvKiBCQiBwYXNzIE9fU1lOQyBmbGFnIHRocm91Z2ggb24gZmlsZSBhdHRyaWJ1dGVzIC4uIEJCICovCi0KLQkvKiBBbHNvIHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHJldHVybmVkIGJ5IFNNQk9wZW4KLQkgICBhbmQgY2FsbGluZyBnZXRfaW5vZGVfaW5mbyB3aXRoIHJldHVybmVkIGJ1ZiAoYXQgbGVhc3QgaGVscHMKLQkgICBub24tVW5peCBzZXJ2ZXIgY2FzZSkgKi8KLQotCS8qIEJCIHdlIGNhbiBub3QgZG8gdGhpcyBpZiB0aGlzIGlzIHRoZSBzZWNvbmQgb3BlbiBvZiBhIGZpbGUKLQkgICBhbmQgdGhlIGZpcnN0IGhhbmRsZSBoYXMgd3JpdGViZWhpbmQgZGF0YSwgd2UgbWlnaHQgYmUKLQkgICBhYmxlIHRvIHNpbXBseSBkbyBhIGZpbGVtYXBfZmRhdGF3cml0ZS9maWxlbWFwX2ZkYXRhd2FpdCBmaXJzdCAqLwotCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQUxMX0lORk8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OworCWlmICghcG9zaXhfb3Blbl9vaykgeworCQlyYyA9IGNpZnNfbnRfb3BlbihmdWxsX3BhdGgsIGlub2RlLCBjaWZzX3NiLCB0Y29uLAorCQkJCSAgZmlsZS0+Zl9mbGFncywgJm9wbG9jaywgJm5ldGZpZCwgeGlkKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX05UX1NNQlMpCi0JCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAotCQkJIGRlc2lyZWRBY2Nlc3MsIENSRUFURV9OT1RfRElSLCAmbmV0ZmlkLCAmb3Bsb2NrLCBidWYsCi0JCQkgY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncwotCQkJCSAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQllbHNlCi0JCXJjID0gLUVJTzsgLyogbm8gTlQgU01CIHN1cHBvcnQgZmFsbCBpbnRvIGxlZ2FjeSBvcGVuIGJlbG93ICovCi0KLQlpZiAocmMgPT0gLUVJTykgewotCQkvKiBPbGQgc2VydmVyLCB0cnkgbGVnYWN5IHN0eWxlIE9wZW5YICovCi0JCXJjID0gU01CTGVnYWN5T3Blbih4aWQsIHRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sCi0JCQlkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgYnVmLAotCQkJY2lmc19zYi0+bG9jYWxfbmxzLCBjaWZzX3NiLT5tbnRfY2lmc19mbGFncwotCQkJCSYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCX0KLQlpZiAocmMpIHsKLQkJY0ZZSSgxLCAiY2lmc19vcGVuIHJldHVybmVkIDB4JXgiLCByYyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gY2lmc19vcGVuX2lub2RlX2hlbHBlcihpbm9kZSwgdGNvbiwgb3Bsb2NrLCBidWYsIGZ1bGxfcGF0aCwgeGlkKTsKLQlpZiAocmMgIT0gMCkKLQkJZ290byBvdXQ7Ci0KIAlwQ2lmc0ZpbGUgPSBjaWZzX25ld19maWxlaW5mbyhuZXRmaWQsIGZpbGUsIHRsaW5rLCBvcGxvY2spOwogCWlmIChwQ2lmc0ZpbGUgPT0gTlVMTCkgeworCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCWNpZnNfZnNjYWNoZV9zZXRfaW5vZGVfY29va2llKGlub2RlLCBmaWxlKTsKIAotCWlmIChvcGxvY2sgJiBDSUZTX0NSRUFURV9BQ1RJT04pIHsKKwlpZiAoKG9wbG9jayAmIENJRlNfQ1JFQVRFX0FDVElPTikgJiYgIXBvc2l4X29wZW5fb2sgJiYgdGNvbi0+dW5peF9leHQpIHsKIAkJLyogdGltZSB0byBzZXQgbW9kZSB3aGljaCB3ZSBjYW4gbm90IHNldCBlYXJsaWVyIGR1ZSB0bwogCQkgICBwcm9ibGVtcyBjcmVhdGluZyBuZXcgcmVhZC1vbmx5IGZpbGVzICovCi0JCWlmICh0Y29uLT51bml4X2V4dCkgewotCQkJc3RydWN0IGNpZnNfdW5peF9zZXRfaW5mb19hcmdzIGFyZ3MgPSB7Ci0JCQkJLm1vZGUJPSBpbm9kZS0+aV9tb2RlLAotCQkJCS51aWQJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmdpZAk9IE5PX0NIQU5HRV82NCwKLQkJCQkuY3RpbWUJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmF0aW1lCT0gTk9fQ0hBTkdFXzY0LAotCQkJCS5tdGltZQk9IE5PX0NIQU5HRV82NCwKLQkJCQkuZGV2aWNlCT0gMCwKLQkJCX07Ci0JCQlDSUZTU01CVW5peFNldFBhdGhJbmZvKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCAmYXJncywKLQkJCQkJICAgICAgIGNpZnNfc2ItPmxvY2FsX25scywKLQkJCQkJICAgICAgIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJCUNJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQkJfQorCQlzdHJ1Y3QgY2lmc191bml4X3NldF9pbmZvX2FyZ3MgYXJncyA9IHsKKwkJCS5tb2RlCT0gaW5vZGUtPmlfbW9kZSwKKwkJCS51aWQJPSBOT19DSEFOR0VfNjQsCisJCQkuZ2lkCT0gTk9fQ0hBTkdFXzY0LAorCQkJLmN0aW1lCT0gTk9fQ0hBTkdFXzY0LAorCQkJLmF0aW1lCT0gTk9fQ0hBTkdFXzY0LAorCQkJLm10aW1lCT0gTk9fQ0hBTkdFXzY0LAorCQkJLmRldmljZQk9IDAsCisJCX07CisJCUNJRlNTTUJVbml4U2V0RmlsZUluZm8oeGlkLCB0Y29uLCAmYXJncywgbmV0ZmlkLAorCQkJCQlwQ2lmc0ZpbGUtPnBpZCk7CiAJfQogCiBvdXQ6Ci0Ja2ZyZWUoYnVmKTsKIAlrZnJlZShmdWxsX3BhdGgpOwogCUZyZWVYaWQoeGlkKTsKIAljaWZzX3B1dF90bGluayh0bGluayk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2lub2RlLmMgYi9mcy9jaWZzL2lub2RlLmMKaW5kZXggYTg1M2E4OS4uYjA2YjYwNiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9pbm9kZS5jCisrKyBiL2ZzL2NpZnMvaW5vZGUuYwpAQCAtNTE4LDYgKzUxOCw3IEBACiAKIAlmYXR0ci0+Y2ZfZW9mID0gbGU2NF90b19jcHUoaW5mby0+RW5kT2ZGaWxlKTsKIAlmYXR0ci0+Y2ZfYnl0ZXMgPSBsZTY0X3RvX2NwdShpbmZvLT5BbGxvY2F0aW9uU2l6ZSk7CisJZmF0dHItPmNmX2NyZWF0ZXRpbWUgPSBsZTY0X3RvX2NwdShpbmZvLT5DcmVhdGlvblRpbWUpOwogCiAJaWYgKGZhdHRyLT5jZl9jaWZzYXR0cnMgJiBBVFRSX0RJUkVDVE9SWSkgewogCQlmYXR0ci0+Y2ZfbW9kZSA9IFNfSUZESVIgfCBjaWZzX3NiLT5tbnRfZGlyX21vZGU7CkBAIC03NzksNiArNzgwLDEwIEBACiAJaWYgKENJRlNfSShpbm9kZSktPnVuaXF1ZWlkICE9IGZhdHRyLT5jZl91bmlxdWVpZCkKIAkJcmV0dXJuIDA7CiAKKwkvKiB1c2UgY3JlYXRldGltZSBsaWtlIGFuIGlfZ2VuZXJhdGlvbiBmaWVsZCAqLworCWlmIChDSUZTX0koaW5vZGUpLT5jcmVhdGV0aW1lICE9IGZhdHRyLT5jZl9jcmVhdGV0aW1lKQorCQlyZXR1cm4gMDsKKwogCS8qIGRvbid0IG1hdGNoIGlub2RlIG9mIGRpZmZlcmVudCB0eXBlICovCiAJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSAhPSAoZmF0dHItPmNmX21vZGUgJiBTX0lGTVQpKQogCQlyZXR1cm4gMDsKQEAgLTc5Niw2ICs4MDEsNyBAQAogCXN0cnVjdCBjaWZzX2ZhdHRyICpmYXR0ciA9IChzdHJ1Y3QgY2lmc19mYXR0ciAqKSBvcGFxdWU7CiAKIAlDSUZTX0koaW5vZGUpLT51bmlxdWVpZCA9IGZhdHRyLT5jZl91bmlxdWVpZDsKKwlDSUZTX0koaW5vZGUpLT5jcmVhdGV0aW1lID0gZmF0dHItPmNmX2NyZWF0ZXRpbWU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMTgsMTAgKzEzMjQsNiBAQAogLypCQiBjaGVjayAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQgKSB0byBzZWUgaWYgbmVlZAogCXRvIHNldCB1aWQvZ2lkICovCiAJCQlpbmNfbmxpbmsoaW5vZGUpOwotCQkJaWYgKHBUY29uLT5ub2Nhc2UpCi0JCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfY2lfZGVudHJ5X29wcyk7Ci0JCQllbHNlCi0JCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfZGVudHJ5X29wcyk7CiAKIAkJCWNpZnNfdW5peF9iYXNpY190b19mYXR0cigmZmF0dHIsIHBJbmZvLCBjaWZzX3NiKTsKIAkJCWNpZnNfZmlsbF91bmlxdWVpZChpbm9kZS0+aV9zYiwgJmZhdHRyKTsKQEAgLTEzNjIsMTAgKzEzNjQsNiBAQAogCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdpbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAogCQkJCQkJIGlub2RlLT5pX3NiLCB4aWQsIE5VTEwpOwogCi0JCWlmIChwVGNvbi0+bm9jYXNlKQotCQkJZF9zZXRfZF9vcChkaXJlbnRyeSwgJmNpZnNfY2lfZGVudHJ5X29wcyk7Ci0JCWVsc2UKLQkJCWRfc2V0X2Rfb3AoZGlyZW50cnksICZjaWZzX2RlbnRyeV9vcHMpOwogCQlkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBuZXdpbm9kZSk7CiAJCSAvKiBzZXR0aW5nIG5saW5rIG5vdCBuZWNlc3NhcnkgZXhjZXB0IGluIGNhc2VzIHdoZXJlIHdlCiAJCSAgKiBmYWlsZWQgdG8gZ2V0IGl0IGZyb20gdGhlIHNlcnZlciBvciB3YXMgc2V0IGJvZ3VzICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2xpbmsuYyBiL2ZzL2NpZnMvbGluay5jCmluZGV4IGZlMmY2YTkuLjMwNjc2OWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvbGluay5jCisrKyBiL2ZzL2NpZnMvbGluay5jCkBAIC01MjQsMTAgKzUyNCw2IEBACiAJCQljRllJKDEsICJDcmVhdGUgc3ltbGluayBvaywgZ2V0aW5vZGVpbmZvIGZhaWwgcmMgPSAlZCIsCiAJCQkgICAgICByYyk7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocFRjb24tPm5vY2FzZSkKLQkJCQlkX3NldF9kX29wKGRpcmVudHJ5LCAmY2lmc19jaV9kZW50cnlfb3BzKTsKLQkJCWVsc2UKLQkJCQlkX3NldF9kX29wKGRpcmVudHJ5LCAmY2lmc19kZW50cnlfb3BzKTsKIAkJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmVhZGRpci5jIGIvZnMvY2lmcy9yZWFkZGlyLmMKaW5kZXggZWM1YjY4ZS4uN2YyNWNjMyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9yZWFkZGlyLmMKKysrIGIvZnMvY2lmcy9yZWFkZGlyLmMKQEAgLTEwMiwxMSArMTAyLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKGNpZnNfc2JfbWFzdGVyX3Rjb24oQ0lGU19TQihzYikpLT5ub2Nhc2UpCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmY2lmc19jaV9kZW50cnlfb3BzKTsKLQllbHNlCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmY2lmc19kZW50cnlfb3BzKTsKLQogCWFsaWFzID0gZF9tYXRlcmlhbGlzZV91bmlxdWUoZGVudHJ5LCBpbm9kZSk7CiAJaWYgKGFsaWFzICE9IE5VTEwpIHsKIAkJZHB1dChkZW50cnkpOwpAQCAtMTYwLDYgKzE1NSw3IEBACiAJZmF0dHItPmNmX2NpZnNhdHRycyA9IGxlMzJfdG9fY3B1KGluZm8tPkV4dEZpbGVBdHRyaWJ1dGVzKTsKIAlmYXR0ci0+Y2ZfZW9mID0gbGU2NF90b19jcHUoaW5mby0+RW5kT2ZGaWxlKTsKIAlmYXR0ci0+Y2ZfYnl0ZXMgPSBsZTY0X3RvX2NwdShpbmZvLT5BbGxvY2F0aW9uU2l6ZSk7CisJZmF0dHItPmNmX2NyZWF0ZXRpbWUgPSBsZTY0X3RvX2NwdShpbmZvLT5DcmVhdGlvblRpbWUpOwogCWZhdHRyLT5jZl9hdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGluZm8tPkxhc3RBY2Nlc3NUaW1lKTsKIAlmYXR0ci0+Y2ZfY3RpbWUgPSBjaWZzX05UdGltZVRvVW5peChpbmZvLT5DaGFuZ2VUaW1lKTsKIAlmYXR0ci0+Y2ZfbXRpbWUgPSBjaWZzX05UdGltZVRvVW5peChpbmZvLT5MYXN0V3JpdGVUaW1lKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc2Vzcy5jIGIvZnMvY2lmcy9zZXNzLmMKaW5kZXggN2IwMWQzZi4uZWI3NDY0OCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zZXNzLmMKKysrIGIvZnMvY2lmcy9zZXNzLmMKQEAgLTQyMCw3ICs0MjAsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCiAvKiBCQiBNb3ZlIHRvIG50bG1zc3AuYyBldmVudHVhbGx5ICovCiAKIC8qIFdlIGRvIG5vdCBtYWxsb2MgdGhlIGJsb2IsIGl0IGlzIHBhc3NlZCBpbiBwYnVmZmVyLCBiZWNhdXNlCkBAIC00MzEsMTMgKzQzMCwxNCBAQAogCU5FR09USUFURV9NRVNTQUdFICpzZWNfYmxvYiA9IChORUdPVElBVEVfTUVTU0FHRSAqKXBidWZmZXI7CiAJX191MzIgZmxhZ3M7CiAKKwltZW1zZXQocGJ1ZmZlciwgMCwgc2l6ZW9mKE5FR09USUFURV9NRVNTQUdFKSk7CiAJbWVtY3B5KHNlY19ibG9iLT5TaWduYXR1cmUsIE5UTE1TU1BfU0lHTkFUVVJFLCA4KTsKIAlzZWNfYmxvYi0+TWVzc2FnZVR5cGUgPSBOdExtTmVnb3RpYXRlOwogCiAJLyogQkIgaXMgTlRMTVYyIHNlc3Npb24gc2VjdXJpdHkgZm9ybWF0IGVhc2llciB0byB1c2UgaGVyZT8gKi8KIAlmbGFncyA9IE5UTE1TU1BfTkVHT1RJQVRFXzU2IHwJTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCB8CiAJCU5UTE1TU1BfTkVHT1RJQVRFXzEyOCB8IE5UTE1TU1BfTkVHT1RJQVRFX1VOSUNPREUgfAotCQlOVExNU1NQX05FR09USUFURV9OVExNOworCQlOVExNU1NQX05FR09USUFURV9OVExNIHwgTlRMTVNTUF9ORUdPVElBVEVfRVhURU5ERURfU0VDOwogCWlmIChzZXMtPnNlcnZlci0+c2VjTW9kZSAmCiAJCQkoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSB7CiAJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX1NJR047CkBAIC00NDYsNyArNDQ2LDcgQEAKIAkJCQlOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJfQogCi0Jc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzIHw9IGNwdV90b19sZTMyKGZsYWdzKTsKKwlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CiAKIAlzZWNfYmxvYi0+V29ya3N0YXRpb25OYW1lLkJ1ZmZlck9mZnNldCA9IDA7CiAJc2VjX2Jsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGggPSAwOwpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJZmxhZ3MgPSBOVExNU1NQX05FR09USUFURV81NiB8CiAJCU5UTE1TU1BfUkVRVUVTVF9UQVJHRVQgfCBOVExNU1NQX05FR09USUFURV9UQVJHRVRfSU5GTyB8CiAJCU5UTE1TU1BfTkVHT1RJQVRFXzEyOCB8IE5UTE1TU1BfTkVHT1RJQVRFX1VOSUNPREUgfAotCQlOVExNU1NQX05FR09USUFURV9OVExNOworCQlOVExNU1NQX05FR09USUFURV9OVExNIHwgTlRMTVNTUF9ORUdPVElBVEVfRVhURU5ERURfU0VDOwogCWlmIChzZXMtPnNlcnZlci0+c2VjTW9kZSAmCiAJICAgKFNFQ01PREVfU0lHTl9SRVFVSVJFRCB8IFNFQ01PREVfU0lHTl9FTkFCTEVEKSkKIAkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfU0lHTjsKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9BTFdBWVNfU0lHTjsKIAogCXRtcCA9IHBidWZmZXIgKyBzaXplb2YoQVVUSEVOVElDQVRFX01FU1NBR0UpOwotCXNlY19ibG9iLT5OZWdvdGlhdGVGbGFncyB8PSBjcHVfdG9fbGUzMihmbGFncyk7CisJc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwogCiAJc2VjX2Jsb2ItPkxtQ2hhbGxlbmdlUmVzcG9uc2UuQnVmZmVyT2Zmc2V0ID0KIAkJCQljcHVfdG9fbGUzMihzaXplb2YoQVVUSEVOVElDQVRFX01FU1NBR0UpKTsKQEAgLTU0NCw4ICs1NDQsOSBAQAogCXNlY19ibG9iLT5Xb3Jrc3RhdGlvbk5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CiAJdG1wICs9IDI7CiAKLQlpZiAoKHNlcy0+bnRsbXNzcC0+c2VydmVyX2ZsYWdzICYgTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSCkgJiYKLQkJCSFjYWxjX3NlY2tleShzZXMpKSB7CisJaWYgKCgoc2VzLT5udGxtc3NwLT5zZXJ2ZXJfZmxhZ3MgJiBOVExNU1NQX05FR09USUFURV9LRVlfWENIKSB8fAorCQkoc2VzLT5udGxtc3NwLT5zZXJ2ZXJfZmxhZ3MgJiBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUMpKQorCQkJJiYgIWNhbGNfc2Vja2V5KHNlcykpIHsKIAkJbWVtY3B5KHRtcCwgc2VzLT5udGxtc3NwLT5jaXBoZXJ0ZXh0LCBDSUZTX0NQSFRYVF9TSVpFKTsKIAkJc2VjX2Jsb2ItPlNlc3Npb25LZXkuQnVmZmVyT2Zmc2V0ID0gY3B1X3RvX2xlMzIodG1wIC0gcGJ1ZmZlcik7CiAJCXNlY19ibG9iLT5TZXNzaW9uS2V5Lkxlbmd0aCA9IGNwdV90b19sZTE2KENJRlNfQ1BIVFhUX1NJWkUpOwpAQCAtNTYzLDE3ICs1NjQsNiBAQAogCXJldHVybiByYzsKIH0KIAotCi1zdGF0aWMgdm9pZCBzZXR1cF9udGxtc3NwX25lZ19yZXEoU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CLAotCQkJCSBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcykKLXsKLQlidWlsZF9udGxtc3NwX25lZ290aWF0ZV9ibG9iKCZwU01CLT5yZXEuU2VjdXJpdHlCbG9iWzBdLCBzZXMpOwotCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZgotCiBpbnQKIENJRlNfU2Vzc1NldHVwKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzLAogCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY3ApCkBAIC04MTQsNzEgKzgwNCw3MCBAQAogCQlyYyA9IC1FTk9TWVM7CiAJCWdvdG8gc3NldHVwX2V4aXQ7CiAjZW5kaWYgLyogQ09ORklHX0NJRlNfVVBDQUxMICovCi0JfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKLQkJaWYgKHR5cGUgPT0gUmF3TlRMTVNTUCkgewotCQkJaWYgKChwU01CLT5yZXEuaGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgPT0gMCkgewotCQkJCWNFUlJPUigxLCAiTlRMTVNTUCByZXF1aXJlcyBVbmljb2RlIHN1cHBvcnQiKTsKLQkJCQlyYyA9IC1FTk9TWVM7Ci0JCQkJZ290byBzc2V0dXBfZXhpdDsKLQkJCX0KLQotCQkJY0ZZSSgxLCAibnRsbXNzcCBzZXNzaW9uIHNldHVwIHBoYXNlICVkIiwgcGhhc2UpOwotCQkJcFNNQi0+cmVxLmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOwotCQkJY2FwYWJpbGl0aWVzIHw9IENBUF9FWFRFTkRFRF9TRUNVUklUWTsKLQkJCXBTTUItPnJlcS5DYXBhYmlsaXRpZXMgfD0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKLQkJCWlmIChwaGFzZSA9PSBOdExtTmVnb3RpYXRlKSB7Ci0JCQkJc2V0dXBfbnRsbXNzcF9uZWdfcmVxKHBTTUIsIHNlcyk7Ci0JCQkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpOwotCQkJCWlvdlsxXS5pb3ZfYmFzZSA9ICZwU01CLT5yZXEuU2VjdXJpdHlCbG9iWzBdOwotCQkJfSBlbHNlIGlmIChwaGFzZSA9PSBOdExtQXV0aGVudGljYXRlKSB7Ci0JCQkJLyogNSBpcyBhbiBlbXBpcmljYWwgdmFsdWUsIGxhcmdlIGVub3VnaHQgdG8KLQkJCQkgKiBob2xkIGF1dGhlbnRpY2F0ZSBtZXNzYWdlLCBtYXggMTAgb2YKLQkJCQkgKiBhdiBwYXJpcywgZG9hbWluLHVzZXIsd29ya3N0YXRpb24gbWFtZXMsCi0JCQkJICogZmxhZ3MgZXRjLi4KLQkJCQkgKi8KLQkJCQludGxtc3NwYmxvYiA9IGttYWxsb2MoCi0JCQkJCTUqc2l6ZW9mKHN0cnVjdCBfQVVUSEVOVElDQVRFX01FU1NBR0UpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJCQlpZiAoIW50bG1zc3BibG9iKSB7Ci0JCQkJCWNFUlJPUigxLCAiQ2FuJ3QgYWxsb2NhdGUgTlRMTVNTUCIpOwotCQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJCWdvdG8gc3NldHVwX2V4aXQ7Ci0JCQkJfQotCi0JCQkJcmMgPSBidWlsZF9udGxtc3NwX2F1dGhfYmxvYihudGxtc3NwYmxvYiwKLQkJCQkJCQkmYmxvYl9sZW4sIHNlcywgbmxzX2NwKTsKLQkJCQlpZiAocmMpCi0JCQkJCWdvdG8gc3NldHVwX2V4aXQ7Ci0JCQkJaW92WzFdLmlvdl9sZW4gPSBibG9iX2xlbjsKLQkJCQlpb3ZbMV0uaW92X2Jhc2UgPSBudGxtc3NwYmxvYjsKLQkJCQlwU01CLT5yZXEuU2VjdXJpdHlCbG9iTGVuZ3RoID0KLQkJCQkJY3B1X3RvX2xlMTYoYmxvYl9sZW4pOwotCQkJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIHRlbGwgdGhlIHNlcnZlciB0aGF0IHdlCi0JCQkJICAgYXJlIHVzaW5nIHRoZSB1aWQgdGhhdCBpdCBqdXN0IGdhdmUgdXMgYmFjawotCQkJCSAgIG9uIHRoZSByZXNwb25zZSAoY2hhbGxlbmdlKSAqLwotCQkJCXNtYl9idWYtPlVpZCA9IHNlcy0+U3VpZDsKLQkJCX0gZWxzZSB7Ci0JCQkJY0VSUk9SKDEsICJpbnZhbGlkIHBoYXNlICVkIiwgcGhhc2UpOwotCQkJCXJjID0gLUVOT1NZUzsKLQkJCQlnb3RvIHNzZXR1cF9leGl0OwotCQkJfQotCQkJLyogdW5pY29kZSBzdHJpbmdzIG11c3QgYmUgd29yZCBhbGlnbmVkICovCi0JCQlpZiAoKGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW4pICUgMikgewotCQkJCSpiY2NfcHRyID0gMDsKLQkJCQliY2NfcHRyKys7Ci0JCQl9Ci0JCQl1bmljb2RlX29zbG1fc3RyaW5ncygmYmNjX3B0ciwgbmxzX2NwKTsKLQkJfSBlbHNlIHsKLQkJCWNFUlJPUigxLCAic2VjVHlwZSAlZCBub3Qgc3VwcG9ydGVkISIsIHR5cGUpOworCX0gZWxzZSBpZiAodHlwZSA9PSBSYXdOVExNU1NQKSB7CisJCWlmICgocFNNQi0+cmVxLmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpID09IDApIHsKKwkJCWNFUlJPUigxLCAiTlRMTVNTUCByZXF1aXJlcyBVbmljb2RlIHN1cHBvcnQiKTsKIAkJCXJjID0gLUVOT1NZUzsKIAkJCWdvdG8gc3NldHVwX2V4aXQ7CiAJCX0KLSNlbHNlCisKKwkJY0ZZSSgxLCAibnRsbXNzcCBzZXNzaW9uIHNldHVwIHBoYXNlICVkIiwgcGhhc2UpOworCQlwU01CLT5yZXEuaGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfRVhURU5ERURfU0VDVVJJVFk7CisJCXBTTUItPnJlcS5DYXBhYmlsaXRpZXMgfD0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKKwkJc3dpdGNoKHBoYXNlKSB7CisJCWNhc2UgTnRMbU5lZ290aWF0ZToKKwkJCWJ1aWxkX250bG1zc3BfbmVnb3RpYXRlX2Jsb2IoCisJCQkJcFNNQi0+cmVxLlNlY3VyaXR5QmxvYiwgc2VzKTsKKwkJCWlvdlsxXS5pb3ZfbGVuID0gc2l6ZW9mKE5FR09USUFURV9NRVNTQUdFKTsKKwkJCWlvdlsxXS5pb3ZfYmFzZSA9IHBTTUItPnJlcS5TZWN1cml0eUJsb2I7CisJCQlwU01CLT5yZXEuU2VjdXJpdHlCbG9iTGVuZ3RoID0KKwkJCQljcHVfdG9fbGUxNihzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpKTsKKwkJCWJyZWFrOworCQljYXNlIE50TG1BdXRoZW50aWNhdGU6CisJCQkvKgorCQkJICogNSBpcyBhbiBlbXBpcmljYWwgdmFsdWUsIGxhcmdlIGVub3VnaCB0byBob2xkCisJCQkgKiBhdXRoZW50aWNhdGUgbWVzc2FnZSBwbHVzIG1heCAxMCBvZiBhdiBwYXJpcywKKwkJCSAqIGRvbWFpbiwgdXNlciwgd29ya3N0YXRpb24gbmFtZXMsIGZsYWdzLCBldGMuCisJCQkgKi8KKwkJCW50bG1zc3BibG9iID0ga3phbGxvYygKKwkJCQk1KnNpemVvZihzdHJ1Y3QgX0FVVEhFTlRJQ0FURV9NRVNTQUdFKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghbnRsbXNzcGJsb2IpIHsKKwkJCQljRVJST1IoMSwgIkNhbid0IGFsbG9jYXRlIE5UTE1TU1AgYmxvYiIpOworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIHNzZXR1cF9leGl0OworCQkJfQorCisJCQlyYyA9IGJ1aWxkX250bG1zc3BfYXV0aF9ibG9iKG50bG1zc3BibG9iLAorCQkJCQkJJmJsb2JfbGVuLCBzZXMsIG5sc19jcCk7CisJCQlpZiAocmMpCisJCQkJZ290byBzc2V0dXBfZXhpdDsKKwkJCWlvdlsxXS5pb3ZfbGVuID0gYmxvYl9sZW47CisJCQlpb3ZbMV0uaW92X2Jhc2UgPSBudGxtc3NwYmxvYjsKKwkJCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihibG9iX2xlbik7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoYXQgd2UgdGVsbCB0aGUgc2VydmVyIHRoYXQgd2UgYXJlIHVzaW5nCisJCQkgKiB0aGUgdWlkIHRoYXQgaXQganVzdCBnYXZlIHVzIGJhY2sgb24gdGhlIHJlc3BvbnNlCisJCQkgKiAoY2hhbGxlbmdlKQorCQkJICovCisJCQlzbWJfYnVmLT5VaWQgPSBzZXMtPlN1aWQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNFUlJPUigxLCAiaW52YWxpZCBwaGFzZSAlZCIsIHBoYXNlKTsKKwkJCXJjID0gLUVOT1NZUzsKKwkJCWdvdG8gc3NldHVwX2V4aXQ7CisJCX0KKwkJLyogdW5pY29kZSBzdHJpbmdzIG11c3QgYmUgd29yZCBhbGlnbmVkICovCisJCWlmICgoaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbikgJSAyKSB7CisJCQkqYmNjX3B0ciA9IDA7CisJCQliY2NfcHRyKys7CisJCX0KKwkJdW5pY29kZV9vc2xtX3N0cmluZ3MoJmJjY19wdHIsIG5sc19jcCk7CisJfSBlbHNlIHsKIAkJY0VSUk9SKDEsICJzZWNUeXBlICVkIG5vdCBzdXBwb3J0ZWQhIiwgdHlwZSk7CiAJCXJjID0gLUVOT1NZUzsKIAkJZ290byBzc2V0dXBfZXhpdDsKLSNlbmRpZgogCX0KIAogCWlvdlsyXS5pb3ZfYmFzZSA9IHN0cl9hcmVhOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy90cmFuc3BvcnQuYyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKaW5kZXggZTA1ODhjZC4uNTljYTgxYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy90cmFuc3BvcnQuYworKysgYi9mcy9jaWZzL3RyYW5zcG9ydC5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAlpZiAoc3NvY2tldCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT1RTT0NLOyAvKiBCQiBldmVudHVhbGx5IGFkZCByZWNvbm5lY3QgY29kZSBoZXJlICovCiAKLQlzbWJfbXNnLm1zZ19uYW1lID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLT5hZGRyLnNvY2tBZGRyOworCXNtYl9tc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmRzdGFkZHI7CiAJc21iX21zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOwogCXNtYl9tc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9jYWNoZS5jIGIvZnMvY29kYS9jYWNoZS5jCmluZGV4IDU1MjVlMWMuLjY5MDE1NzggMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvY2FjaGUuYworKysgYi9mcy9jb2RhL2NhY2hlLmMKQEAgLTIwLDEwICsyMCw5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfY2FjaGUuaD4KKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCisjaW5jbHVkZSAiY29kYV9jYWNoZS5oIgogCiBzdGF0aWMgYXRvbWljX3QgcGVybWlzc2lvbl9lcG9jaCA9IEFUT01JQ19JTklUKDApOwogCmRpZmYgLS1naXQgYS9mcy9jb2RhL2Nub2RlLmMgYi9mcy9jb2RhL2Nub2RlLmMKaW5kZXggNjAyMjQwNS4uNjQ3NTg3NyAxMDA2NDQKLS0tIGEvZnMvY29kYS9jbm9kZS5jCisrKyBiL2ZzL2NvZGEvY25vZGUuYwpAQCAtNyw5ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb2RhLmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvZGFfZmlkZXEoc3RydWN0IENvZGFGaWQgKmZpZDEsIHN0cnVjdCBDb2RhRmlkICpmaWQyKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb2RhX2NhY2hlLmggYi9mcy9jb2RhL2NvZGFfY2FjaGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9jb2RhX2NhY2hlLmgKcmVuYW1lIHRvIGZzL2NvZGEvY29kYV9jYWNoZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvZGFfZnNfaS5oIGIvZnMvY29kYS9jb2RhX2ZzX2kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9jb2RhX2ZzX2kuaApyZW5hbWUgdG8gZnMvY29kYS9jb2RhX2ZzX2kuaApkaWZmIC0tZ2l0IGEvZnMvY29kYS9jb2RhX2xpbnV4LmMgYi9mcy9jb2RhL2NvZGFfbGludXguYwppbmRleCBiZjRhM2ZkLi4yYmRiY2MxIDEwMDY0NAotLS0gYS9mcy9jb2RhL2NvZGFfbGludXguYworKysgYi9mcy9jb2RhL2NvZGFfbGludXguYwpAQCAtMTcsOSArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8bGludXgvY29kYS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KICNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+CisjaW5jbHVkZSAiY29kYV9saW51eC5oIgogCiAvKiBpbml0aWFsaXplIHRoZSBkZWJ1Z2dpbmcgdmFyaWFibGVzICovCiBpbnQgY29kYV9mYWtlX3N0YXRmczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oIGIvZnMvY29kYS9jb2RhX2xpbnV4LmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9jb2RhX2xpbnV4LmgKcmVuYW1lIHRvIGZzL2NvZGEvY29kYV9saW51eC5oCmluZGV4IDRjY2M1OWMuLjliMGM1MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oCisrKyBiL2ZzL2NvZGEvY29kYV9saW51eC5oCkBAIC0yMCwxMyArMjAsMTUgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CQkKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+CisjaW5jbHVkZSAiY29kYV9mc19pLmgiCiAKIC8qIG9wZXJhdGlvbnMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjb2RhX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvZGFfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvZGFfaW9jdGxfaW5vZGVfb3BlcmF0aW9uczsKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBjb2RhX2RlbnRyeV9vcGVyYXRpb25zOworCiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjb2RhX2ZpbGVfYW9wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNvZGFfc3ltbGlua19hb3BzOwogCmRpZmYgLS1naXQgYS9mcy9jb2RhL2Rpci5jIGIvZnMvY29kYS9kaXIuYwppbmRleCAyOWJhZGQ5Li4yYjhkYWU0IDEwMDY0NAotLS0gYS9mcy9jb2RhL2Rpci5jCisrKyBiL2ZzL2NvZGEvZGlyLmMKQEAgLTIzLDEwICsyMyw5IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfY2FjaGUuaD4KKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCisjaW5jbHVkZSAiY29kYV9jYWNoZS5oIgogCiAjaW5jbHVkZSAiY29kYV9pbnQuaCIKIApAQCAtNjEsNyArNjAsNyBAQAogfQogI2RlZmluZSBDT0RBX0VJT19FUlJPUiAoKHZvaWQgKikgKGNvZGFfcmV0dXJuX0VJTykpCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29kYV9kZW50cnlfb3BlcmF0aW9ucyA9Citjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29kYV9kZW50cnlfb3BlcmF0aW9ucyA9CiB7CiAJLmRfcmV2YWxpZGF0ZQk9IGNvZGFfZGVudHJ5X3JldmFsaWRhdGUsCiAJLmRfZGVsZXRlCT0gY29kYV9kZW50cnlfZGVsZXRlLApAQCAtMTI2LDggKzEyNSw2IEBACiAJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIAogZXhpdDoKLQlkX3NldF9kX29wKGVudHJ5LCAmY29kYV9kZW50cnlfb3BlcmF0aW9ucyk7Ci0KIAlpZiAoaW5vZGUgJiYgKHR5cGUgJiBDT0RBX05PQ0FDSEUpKQogCQljb2RhX2ZsYWdfaW5vZGUoaW5vZGUsIENfVkFUVFIgfCBDX1BVUkdFKTsKIApkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwppbmRleCBjOGI1MGJhLi4wNDMzMDU3IDEwMDY0NAotLS0gYS9mcy9jb2RhL2ZpbGUuYworKysgYi9mcy9jb2RhL2ZpbGUuYwpAQCAtMjEsMTAgKzIxLDkgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvY29kYS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CiAKKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCiAjaW5jbHVkZSAiY29kYV9pbnQuaCIKIAogc3RhdGljIHNzaXplX3QKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvaW5vZGUuYyBiL2ZzL2NvZGEvaW5vZGUuYwppbmRleCA1MGRjN2QxLi44NzFiMjc3IDEwMDY0NAotLS0gYS9mcy9jb2RhL2lub2RlLmMKKysrIGIvZnMvY29kYS9pbm9kZS5jCkBAIC0yOCwxMCArMjgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfY2FjaGUuaD4KKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCisjaW5jbHVkZSAiY29kYV9jYWNoZS5oIgogCiAjaW5jbHVkZSAiY29kYV9pbnQuaCIKIApAQCAtNDUsNyArNDQsNyBAQAogc3RhdGljIHN0cnVjdCBpbm9kZSAqY29kYV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGNvZGFfaW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoY29kYV9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCW1lbXNldCgmZWktPmNfZmlkLCAwLCBzaXplb2Yoc3RydWN0IENvZGFGaWQpKTsKQEAgLTE5Myw2ICsxOTIsNyBAQAogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTI7CiAJc2ItPnNfbWFnaWMgPSBDT0RBX1NVUEVSX01BR0lDOwogCXNiLT5zX29wID0gJmNvZGFfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c19kX29wID0gJmNvZGFfZGVudHJ5X29wZXJhdGlvbnM7CiAJc2ItPnNfYmRpID0gJnZjLT5iZGk7CiAKIAkvKiBnZXQgcm9vdCBmaWQgZnJvbSBWZW51czogdGhpcyBuZWVkcyB0aGUgcm9vdCBpbm9kZSAqLwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9waW9jdGwuYyBiL2ZzL2NvZGEvcGlvY3RsLmMKaW5kZXggNzQxZjBiZC4uNmNiYjNhZiAxMDA2NDQKLS0tIGEvZnMvY29kYS9waW9jdGwuYworKysgYi9mcy9jb2RhL3Bpb2N0bC5jCkBAIC0xOSwxMCArMTksMTAgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvY29kYS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CiAKKyNpbmNsdWRlICJjb2RhX2xpbnV4LmgiCisKIC8qIHBpb2N0bCBvcHMgKi8KIHN0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwogc3RhdGljIGxvbmcgY29kYV9waW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCmRpZmYgLS1naXQgYS9mcy9jb2RhL3BzZGV2LmMgYi9mcy9jb2RhL3BzZGV2LmMKaW5kZXggNjI2NDdhOC4uOGY2MTZlMCAxMDA2NDQKLS0tIGEvZnMvY29kYS9wc2Rldi5jCisrKyBiL2ZzL2NvZGEvcHNkZXYuYwpAQCAtNDMsMTAgKzQzLDEwIEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+CiAjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgogCisjaW5jbHVkZSAiY29kYV9saW51eC5oIgorCiAjaW5jbHVkZSAiY29kYV9pbnQuaCIKIAogLyogc3RhdGlzdGljcyAqLwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9zeW1saW5rLmMgYi9mcy9jb2RhL3N5bWxpbmsuYwppbmRleCBhZjc4ZjAwLi5hYjk0ZWY2IDEwMDY0NAotLS0gYS9mcy9jb2RhL3N5bWxpbmsuYworKysgYi9mcy9jb2RhL3N5bWxpbmsuYwpAQCAtMTYsOSArMTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorCisjaW5jbHVkZSAiY29kYV9saW51eC5oIgogCiBzdGF0aWMgaW50IGNvZGFfc3ltbGlua19maWxsZXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewpkaWZmIC0tZ2l0IGEvZnMvY29kYS91cGNhbGwuYyBiL2ZzL2NvZGEvdXBjYWxsLmMKaW5kZXggYzM1NjNjYS4uOTcyN2UwYyAxMDA2NDQKLS0tIGEvZnMvY29kYS91cGNhbGwuYworKysgYi9mcy9jb2RhL3VwY2FsbC5jCkBAIC0zMywxMCArMzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogCiAjaW5jbHVkZSA8bGludXgvY29kYS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KICNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+Ci0jaW5jbHVkZSA8bGludXgvY29kYV9jYWNoZS5oPgorI2luY2x1ZGUgImNvZGFfbGludXguaCIKKyNpbmNsdWRlICJjb2RhX2NhY2hlLmgiCiAKICNpbmNsdWRlICJjb2RhX2ludC5oIgogCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oIGIvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaAppbmRleCAwMjZjZjY4Li44MmJkYThmIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCisrKyBiL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKQEAgLTkwLDYgKzkwLDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbl9mb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvbmZpZ2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvbmZpZ2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29uZmlnZnNfZGVudHJ5X29wczsKIAogZXh0ZXJuIGludCBjb25maWdmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkgICAgY29uc3QgY2hhciAqc3ltbmFtZSk7CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9kaXIuYyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCmluZGV4IDM2NjM3YTguLjkwZmYzY2IgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2Rpci5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29uZmlnZnNfZGVudHJ5X29wcyA9IHsKK2NvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBjb25maWdmc19kZW50cnlfb3BzID0gewogCS5kX2lwdXQJCT0gY29uZmlnZnNfZF9pcHV0LAogCS8qIHNpbXBsZV9kZWxldGVfZGVudHJ5KCkgaXNuJ3QgZXhwb3J0ZWQgKi8KIAkuZF9kZWxldGUJPSBjb25maWdmc19kX2RlbGV0ZSwKQEAgLTQ0Miw3ICs0NDIsNiBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JZF9zZXRfZF9vcChkZW50cnksICZjb25maWdmc19kZW50cnlfb3BzKTsKIAlkX3JlaGFzaChkZW50cnkpOwogCiAJcmV0dXJuIDA7CkBAIC00ODksNyArNDg4LDYgQEAKIAkJICovCiAJCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBOQU1FX01BWCkKIAkJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwotCQlkX3NldF9kX29wKGRlbnRyeSwgJmNvbmZpZ2ZzX2RlbnRyeV9vcHMpOwogCQlkX2FkZChkZW50cnksIE5VTEwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC02ODMsNyArNjgxLDYgQEAKIAlyZXQgPSAtRU5PTUVNOwogCWNoaWxkID0gZF9hbGxvYyhwYXJlbnQsICZuYW1lKTsKIAlpZiAoY2hpbGQpIHsKLQkJZF9zZXRfZF9vcChjaGlsZCwgJmNvbmZpZ2ZzX2RlbnRyeV9vcHMpOwogCQlkX2FkZChjaGlsZCwgTlVMTCk7CiAKIAkJcmV0ID0gY29uZmlnZnNfYXR0YWNoX2dyb3VwKCZwYXJlbnRfZ3JvdXAtPmNnX2l0ZW0sCkBAIC0xNjgxLDcgKzE2NzgsNiBAQAogCWVyciA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvYyhjb25maWdmc19zYi0+c19yb290LCAmbmFtZSk7CiAJaWYgKGRlbnRyeSkgewotCQlkX3NldF9kX29wKGRlbnRyeSwgJmNvbmZpZ2ZzX2RlbnRyeV9vcHMpOwogCQlkX2FkZChkZW50cnksIE5VTEwpOwogCiAJCWVyciA9IGNvbmZpZ2ZzX2F0dGFjaF9ncm91cChzZC0+c19lbGVtZW50LCAmZ3JvdXAtPmNnX2l0ZW0sCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9tb3VudC5jIGIvZnMvY29uZmlnZnMvbW91bnQuYwppbmRleCA3ZDM2MDdmLi5lY2M2MjE3IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9tb3VudC5jCisrKyBiL2ZzL2NvbmZpZ2ZzL21vdW50LmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCWNvbmZpZ2ZzX3Jvb3RfZ3JvdXAuY2dfaXRlbS5jaV9kZW50cnkgPSByb290OwogCXJvb3QtPmRfZnNkYXRhID0gJmNvbmZpZ2ZzX3Jvb3Q7CiAJc2ItPnNfcm9vdCA9IHJvb3Q7CisJc2ItPnNfZF9vcCA9ICZjb25maWdmc19kZW50cnlfb3BzOyAvKiB0aGUgcmVzdCBnZXQgdGhhdCAqLwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCmluZGV4IDMyZmQ1ZmUuLmUxNDE5MzkgMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9pbm9kZS5jCisrKyBiL2ZzL2NyYW1mcy9pbm9kZS5jCkBAIC0zNCw1NyArMzQsODEgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgocmVhZF9tdXRleCk7CiAKIAotLyogVGhlc2UgdHdvIG1hY3JvcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSwgdG8gcHJvdmlkZSBiZXR0ZXIgc3RfaW5vCi0gICBzZW1hbnRpY3MuICovCi0jZGVmaW5lIENSQU1JTk8oeCkJKCgoeCktPm9mZnNldCAmJiAoeCktPnNpemUpPyh4KS0+b2Zmc2V0PDwyOjEpCisvKiBUaGVzZSBtYWNyb3MgbWF5IGNoYW5nZSBpbiBmdXR1cmUsIHRvIHByb3ZpZGUgYmV0dGVyIHN0X2lubyBzZW1hbnRpY3MuICovCiAjZGVmaW5lIE9GRlNFVCh4KQkoKHgpLT5pX2lubykKIAotc3RhdGljIHZvaWQgc2V0dXBfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGNyYW1mc19pbm9kZSAqIGNyYW1mc19pbm9kZSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNyYW1pbm8oc3RydWN0IGNyYW1mc19pbm9kZSAqY2lubywgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKKwlpZiAoIWNpbm8tPm9mZnNldCkKKwkJcmV0dXJuIG9mZnNldCArIDE7CisJaWYgKCFjaW5vLT5zaXplKQorCQlyZXR1cm4gb2Zmc2V0ICsgMTsKKworCS8qCisJICogVGhlIGZpbGUgbW9kZSB0ZXN0IGZpeGVzIGJ1Z2d5IG1rY3JhbWZzIGltcGxlbWVudGF0aW9ucyB3aGVyZQorCSAqIGNyYW1mc19pbm9kZS0+b2Zmc2V0IGlzIHNldCB0byBhIG5vbiB6ZXJvIHZhbHVlIGZvciBlbnRyaWVzCisJICogd2hpY2ggZGlkIG5vdCBjb250YWluIGRhdGEsIGxpa2UgZGV2aWNlcyBub2RlIGFuZCBmaWZvcy4KKwkgKi8KKwlzd2l0Y2ggKGNpbm8tPm1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJY2FzZSBTX0lGRElSOgorCWNhc2UgU19JRkxOSzoKKwkJcmV0dXJuIGNpbm8tPm9mZnNldCA8PCAyOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gb2Zmc2V0ICsgMTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X2NyYW1mc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCXN0cnVjdCBjcmFtZnNfaW5vZGUgKmNyYW1mc19pbm9kZSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgemVyb3RpbWU7CisKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBjcmFtaW5vKGNyYW1mc19pbm9kZSwgb2Zmc2V0KSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKKworCXN3aXRjaCAoY3JhbWZzX2lub2RlLT5tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNyYW1mc19hb3BzOworCQlicmVhazsKKwljYXNlIFNfSUZESVI6CisJCWlub2RlLT5pX29wID0gJmNyYW1mc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmNyYW1mc19kaXJlY3Rvcnlfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjcmFtZnNfYW9wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBjcmFtZnNfaW5vZGUtPm1vZGUsCisJCQkJb2xkX2RlY29kZV9kZXYoY3JhbWZzX2lub2RlLT5zaXplKSk7CisJfQorCiAJaW5vZGUtPmlfbW9kZSA9IGNyYW1mc19pbm9kZS0+bW9kZTsKIAlpbm9kZS0+aV91aWQgPSBjcmFtZnNfaW5vZGUtPnVpZDsKLQlpbm9kZS0+aV9zaXplID0gY3JhbWZzX2lub2RlLT5zaXplOwotCWlub2RlLT5pX2Jsb2NrcyA9IChjcmFtZnNfaW5vZGUtPnNpemUgLSAxKSAvIDUxMiArIDE7CiAJaW5vZGUtPmlfZ2lkID0gY3JhbWZzX2lub2RlLT5naWQ7CisKKwkvKiBpZiB0aGUgbG93ZXIgMiBiaXRzIGFyZSB6ZXJvLCB0aGUgaW5vZGUgY29udGFpbnMgZGF0YSAqLworCWlmICghKGlub2RlLT5pX2lubyAmIDMpKSB7CisJCWlub2RlLT5pX3NpemUgPSBjcmFtZnNfaW5vZGUtPnNpemU7CisJCWlub2RlLT5pX2Jsb2NrcyA9IChjcmFtZnNfaW5vZGUtPnNpemUgLSAxKSAvIDUxMiArIDE7CisJfQorCiAJLyogU3RydWN0IGNvcHkgaW50ZW50aW9uYWwgKi8KIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSB6ZXJvdGltZTsKIAkvKiBpbm9kZS0+aV9ubGluayBpcyBsZWZ0IDEgLSBhcmd1YWJseSB3cm9uZyBmb3IgZGlyZWN0b3JpZXMsCiAJICAgYnV0IGl0J3MgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgcmVhZGluZyB0aGUgZGlyZWN0b3J5CiAJICAgY29udGVudHMuICAxIHlpZWxkcyB0aGUgcmlnaHQgcmVzdWx0IGluIEdOVSBmaW5kLCBldmVuCiAJICAgd2l0aG91dCAtbm9sZWFmIG9wdGlvbi4gKi8KLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewotCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOwotCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNyYW1mc19hb3BzOwotCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlpbm9kZS0+aV9vcCA9ICZjcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZjcmFtZnNfZGlyZWN0b3J5X29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNyYW1mc19hb3BzOwotCX0gZWxzZSB7Ci0JCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKLQkJCW9sZF9kZWNvZGVfZGV2KGNyYW1mc19pbm9kZS0+c2l6ZSkpOwotCX0KLX0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X2NyYW1mc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCXN0cnVjdCBjcmFtZnNfaW5vZGUgKiBjcmFtZnNfaW5vZGUpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlpZiAoQ1JBTUlOTyhjcmFtZnNfaW5vZGUpID09IDEpIHsKLQkJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOwotCQlpZiAoaW5vZGUpIHsKLQkJCWlub2RlLT5pX2lubyA9IDE7Ci0JCQlzZXR1cF9pbm9kZShpbm9kZSwgY3JhbWZzX2lub2RlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIENSQU1JTk8oY3JhbWZzX2lub2RlKSk7Ci0JCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKLQkJCXNldHVwX2lub2RlKGlub2RlLCBjcmFtZnNfaW5vZGUpOwotCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCX0KLQl9CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisKIAlyZXR1cm4gaW5vZGU7CiB9CiAKQEAgLTI2NSw2ICsyODksOSBAQAogCQlwcmludGsoS0VSTl9FUlIgImNyYW1mczogcm9vdCBpcyBub3QgYSBkaXJlY3RvcnlcbiIpOwogCQlnb3RvIG91dDsKIAl9CisJLyogY29ycmVjdCBzdHJhbmdlLCBoYXJkLWNvZGVkIHBlcm1pc3Npb25zIG9mIG1rY3JhbWZzICovCisJc3VwZXIucm9vdC5tb2RlIHw9IChTX0lSVVNSIHwgU19JWFVTUiB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgpOworCiAJcm9vdF9vZmZzZXQgPSBzdXBlci5yb290Lm9mZnNldCA8PCAyOwogCWlmIChzdXBlci5mbGFncyAmIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yKSB7CiAJCXNiaS0+c2l6ZT1zdXBlci5zaXplOwpAQCAtMjg5LDcgKzMxNiw3IEBACiAKIAkvKiBTZXQgaXQgYWxsIHVwLi4gKi8KIAlzYi0+c19vcCA9ICZjcmFtZnNfb3BzOwotCXJvb3QgPSBnZXRfY3JhbWZzX2lub2RlKHNiLCAmc3VwZXIucm9vdCk7CisJcm9vdCA9IGdldF9jcmFtZnNfaW5vZGUoc2IsICZzdXBlci5yb290LCAwKTsKIAlpZiAoIXJvb3QpCiAJCWdvdG8gb3V0OwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CkBAIC0zNjUsNyArMzkyLDcgQEAKIAkJICovCiAJCW5hbWVsZW4gPSBkZS0+bmFtZWxlbiA8PCAyOwogCQltZW1jcHkoYnVmLCBuYW1lLCBuYW1lbGVuKTsKLQkJaW5vID0gQ1JBTUlOTyhkZSk7CisJCWlubyA9IGNyYW1pbm8oZGUsIE9GRlNFVChpbm9kZSkgKyBvZmZzZXQpOwogCQltb2RlID0gZGUtPm1vZGU7CiAJCW11dGV4X3VubG9jaygmcmVhZF9tdXRleCk7CiAJCW5leHRvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2YoKmRlKSArIG5hbWVsZW47CkBAIC00MDQsOCArNDMxLDkgQEAKIAkJc3RydWN0IGNyYW1mc19pbm9kZSAqZGU7CiAJCWNoYXIgKm5hbWU7CiAJCWludCBuYW1lbGVuLCByZXR2YWw7CisJCWludCBkaXJfb2ZmID0gT0ZGU0VUKGRpcikgKyBvZmZzZXQ7CiAKLQkJZGUgPSBjcmFtZnNfcmVhZChkaXItPmlfc2IsIE9GRlNFVChkaXIpICsgb2Zmc2V0LCBzaXplb2YoKmRlKStDUkFNRlNfTUFYUEFUSExFTik7CisJCWRlID0gY3JhbWZzX3JlYWQoZGlyLT5pX3NiLCBkaXJfb2ZmLCBzaXplb2YoKmRlKStDUkFNRlNfTUFYUEFUSExFTik7CiAJCW5hbWUgPSAoY2hhciAqKShkZSsxKTsKIAogCQkvKiBUcnkgdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygc29ydGVkIGRpcmVjdG9yaWVzICovCkBAIC00MzYsNyArNDY0LDcgQEAKIAkJaWYgKCFyZXR2YWwpIHsKIAkJCXN0cnVjdCBjcmFtZnNfaW5vZGUgZW50cnkgPSAqZGU7CiAJCQltdXRleF91bmxvY2soJnJlYWRfbXV0ZXgpOwotCQkJZF9hZGQoZGVudHJ5LCBnZXRfY3JhbWZzX2lub2RlKGRpci0+aV9zYiwgJmVudHJ5KSk7CisJCQlkX2FkZChkZW50cnksIGdldF9jcmFtZnNfaW5vZGUoZGlyLT5pX3NiLCAmZW50cnksIGRpcl9vZmYpKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIGVsc2UgKHJldHZhbCA8IDApICovCmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDU2OTlkNGMuLjBjNmQ1YzUgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0xMzIwLDYgKzEzMjAsNyBAQAogCQlfX2RnZXRfZGxvY2socGFyZW50KTsKIAkJZGVudHJ5LT5kX3BhcmVudCA9IHBhcmVudDsKIAkJZGVudHJ5LT5kX3NiID0gcGFyZW50LT5kX3NiOworCQlkX3NldF9kX29wKGRlbnRyeSwgZGVudHJ5LT5kX3NiLT5zX2Rfb3ApOwogCQlsaXN0X2FkZCgmZGVudHJ5LT5kX3UuZF9jaGlsZCwgJnBhcmVudC0+ZF9zdWJkaXJzKTsKIAkJc3Bpbl91bmxvY2soJnBhcmVudC0+ZF9sb2NrKTsKIAl9CkBAIC0xMzM1LDYgKzEzMzYsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRfYWxsb2MoTlVMTCwgbmFtZSk7CiAJaWYgKGRlbnRyeSkgewogCQlkZW50cnktPmRfc2IgPSBzYjsKKwkJZF9zZXRfZF9vcChkZW50cnksIGRlbnRyeS0+ZF9zYi0+c19kX29wKTsKIAkJZGVudHJ5LT5kX3BhcmVudCA9IGRlbnRyeTsKIAkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9ESVNDT05ORUNURUQ7CiAJfQpAQCAtMTUwNyw2ICsxNTA5LDcgQEAKIAkJcmVzID0gZF9hbGxvYyhOVUxMLCAmbmFtZSk7CiAJCWlmIChyZXMpIHsKIAkJCXJlcy0+ZF9zYiA9IHJvb3RfaW5vZGUtPmlfc2I7CisJCQlkX3NldF9kX29wKHJlcywgcmVzLT5kX3NiLT5zX2Rfb3ApOwogCQkJcmVzLT5kX3BhcmVudCA9IHJlczsKIAkJCWRfaW5zdGFudGlhdGUocmVzLCByb290X2lub2RlKTsKIAkJfQpAQCAtMTU2Nyw2ICsxNTcwLDcgQEAKIAkvKiBhdHRhY2ggYSBkaXNjb25uZWN0ZWQgZGVudHJ5ICovCiAJc3Bpbl9sb2NrKCZ0bXAtPmRfbG9jayk7CiAJdG1wLT5kX3NiID0gaW5vZGUtPmlfc2I7CisJZF9zZXRfZF9vcCh0bXAsIHRtcC0+ZF9zYi0+c19kX29wKTsKIAl0bXAtPmRfaW5vZGUgPSBpbm9kZTsKIAl0bXAtPmRfZmxhZ3MgfD0gRENBQ0hFX0RJU0NPTk5FQ1RFRDsKIAlsaXN0X2FkZCgmdG1wLT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKQEAgLTE5NjYsNyArMTk3MCw3IEBACiAvKioKICAqIGRfdmFsaWRhdGUgLSB2ZXJpZnkgZGVudHJ5IHByb3ZpZGVkIGZyb20gaW5zZWN1cmUgc291cmNlIChkZXByZWNhdGVkKQogICogQGRlbnRyeTogVGhlIGRlbnRyeSBhbGxlZ2VkIHRvIGJlIHZhbGlkIGNoaWxkIG9mIEBkcGFyZW50Ci0gKiBAZHBhcmVudDogVGhlIHBhcmVudCBkZW50cnkgKGtub3duIHRvIGJlIHZhbGlkKQorICogQHBhcmVudDogVGhlIHBhcmVudCBkZW50cnkgKGtub3duIHRvIGJlIHZhbGlkKQogICoKICAqIEFuIGluc2VjdXJlIHNvdXJjZSBoYXMgc2VudCB1cyBhIGRlbnRyeSwgaGVyZSB3ZSB2ZXJpZnkgaXQgYW5kIGRnZXQoKSBpdC4KICAqIFRoaXMgaXMgdXNlZCBieSBuY3BmcyBpbiBpdHMgcmVhZGRpciBpbXBsZW1lbnRhdGlvbi4KQEAgLTI0NDksOCArMjQ1Myw3IEBACiB9CiAKIC8qKgotICogUHJlcGVuZCBwYXRoIHN0cmluZyB0byBhIGJ1ZmZlcgotICoKKyAqIHByZXBlbmRfcGF0aCAtIFByZXBlbmQgcGF0aCBzdHJpbmcgdG8gYSBidWZmZXIKICAqIEBwYXRoOiB0aGUgZGVudHJ5L3Zmc21vdW50IHRvIHJlcG9ydAogICogQHJvb3Q6IHJvb3QgdmZzbW50L2RlbnRyeSAobWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24pCiAgKiBAYnVmZmVyOiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvd2NvbW1zLmMgYi9mcy9kbG0vbG93Y29tbXMuYwppbmRleCAzN2EzNGMyLi45YzY0YWU5IDEwMDY0NAotLS0gYS9mcy9kbG0vbG93Y29tbXMuYworKysgYi9mcy9kbG0vbG93Y29tbXMuYwpAQCAtNjMsNiArNjMsOSBAQAogI2RlZmluZSBORUVERURfUk1FTSAoNCoxMDI0KjEwMjQpCiAjZGVmaW5lIENPTk5fSEFTSF9TSVpFIDMyCiAKKy8qIE51bWJlciBvZiBtZXNzYWdlcyB0byBzZW5kIGJlZm9yZSByZXNjaGVkdWxpbmcgKi8KKyNkZWZpbmUgTUFYX1NFTkRfTVNHX0NPVU5UIDI1CisKIHN0cnVjdCBjYnVmIHsKIAl1bnNpZ25lZCBpbnQgYmFzZTsKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtMTA4LDYgKzExMSw3IEBACiAjZGVmaW5lIENGX0lOSVRfUEVORElORyA0CiAjZGVmaW5lIENGX0lTX09USEVSQ09OIDUKICNkZWZpbmUgQ0ZfQ0xPU0UgNgorI2RlZmluZSBDRl9BUFBfTElNSVRFRCA3CiAJc3RydWN0IGxpc3RfaGVhZCB3cml0ZXF1ZXVlOyAgLyogTGlzdCBvZiBvdXRnb2luZyB3cml0ZXF1ZXVlX2VudHJpZXMgKi8KIAlzcGlubG9ja190IHdyaXRlcXVldWVfbG9jazsKIAlpbnQgKCpyeF9hY3Rpb24pIChzdHJ1Y3QgY29ubmVjdGlvbiAqKTsJLyogV2hhdCB0byBkbyB3aGVuIGFjdGl2ZSAqLwpAQCAtMjk1LDcgKzI5OSwxNyBAQAogewogCXN0cnVjdCBjb25uZWN0aW9uICpjb24gPSBzb2NrMmNvbihzayk7CiAKLQlpZiAoY29uICYmICF0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSkKKwlpZiAoIWNvbikKKwkJcmV0dXJuOworCisJY2xlYXJfYml0KFNPQ0tfTk9TUEFDRSwgJmNvbi0+c29jay0+ZmxhZ3MpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDRl9BUFBfTElNSVRFRCwgJmNvbi0+ZmxhZ3MpKSB7CisJCWNvbi0+c29jay0+c2stPnNrX3dyaXRlX3BlbmRpbmctLTsKKwkJY2xlYXJfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJmNvbi0+c29jay0+ZmxhZ3MpOworCX0KKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChDRl9XUklURV9QRU5ESU5HLCAmY29uLT5mbGFncykpCiAJCXF1ZXVlX3dvcmsoc2VuZF93b3JrcXVldWUsICZjb24tPnN3b3JrKTsKIH0KIApAQCAtOTE1LDYgKzkyOSw3IEBACiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2FkZHIsIHNyY19hZGRyOwogCWludCBhZGRyX2xlbjsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gTlVMTDsKKwlpbnQgb25lID0gMTsKIAogCWlmIChjb24tPm5vZGVpZCA9PSAwKSB7CiAJCWxvZ19wcmludCgiYXR0ZW1wdCB0byBjb25uZWN0IHNvY2sgMCBmb2lsZWQiKTsKQEAgLTk2MCw2ICs5NzUsMTEgQEAKIAltYWtlX3NvY2thZGRyKCZzYWRkciwgZGxtX2NvbmZpZy5jaV90Y3BfcG9ydCwgJmFkZHJfbGVuKTsKIAogCWxvZ19wcmludCgiY29ubmVjdGluZyB0byAlZCIsIGNvbi0+bm9kZWlkKTsKKworCS8qIFR1cm4gb2ZmIE5hZ2xlJ3MgYWxnb3JpdGhtICovCisJa2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwKKwkJCSAgc2l6ZW9mKG9uZSkpOworCiAJcmVzdWx0ID0KIAkJc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsIGFkZHJfbGVuLAogCQkJCSAgIE9fTk9OQkxPQ0spOwpAQCAtMTAxMSw2ICsxMDMxLDEwIEBACiAJCWdvdG8gY3JlYXRlX291dDsKIAl9CiAKKwkvKiBUdXJuIG9mZiBOYWdsZSdzIGFsZ29yaXRobSAqLworCWtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSZvbmUsCisJCQkgIHNpemVvZihvbmUpKTsKKwogCXJlc3VsdCA9IGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKIAkJCQkgICAoY2hhciAqKSZvbmUsIHNpemVvZihvbmUpKTsKIApAQCAtMTI5Nyw2ICsxMzIxLDcgQEAKIAljb25zdCBpbnQgbXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUIHwgTVNHX05PU0lHTkFMOwogCXN0cnVjdCB3cml0ZXF1ZXVlX2VudHJ5ICplOwogCWludCBsZW4sIG9mZnNldDsKKwlpbnQgY291bnQgPSAwOwogCiAJbXV0ZXhfbG9jaygmY29uLT5zb2NrX211dGV4KTsKIAlpZiAoY29uLT5zb2NrID09IE5VTEwpCkBAIC0xMzE5LDE0ICsxMzQ0LDI3IEBACiAJCQlyZXQgPSBrZXJuZWxfc2VuZHBhZ2UoY29uLT5zb2NrLCBlLT5wYWdlLCBvZmZzZXQsIGxlbiwKIAkJCQkJICAgICAgbXNnX2ZsYWdzKTsKIAkJCWlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gMCkgeworCQkJCWlmIChyZXQgPT0gLUVBR0FJTiAmJgorCQkJCSAgICB0ZXN0X2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZjb24tPnNvY2stPmZsYWdzKSAmJgorCQkJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChDRl9BUFBfTElNSVRFRCwgJmNvbi0+ZmxhZ3MpKSB7CisJCQkJCS8qIE5vdGlmeSBUQ1AgdGhhdCB3ZSdyZSBsaW1pdGVkIGJ5IHRoZQorCQkJCQkgKiBhcHBsaWNhdGlvbiB3aW5kb3cgc2l6ZS4KKwkJCQkJICovCisJCQkJCXNldF9iaXQoU09DS19OT1NQQUNFLCAmY29uLT5zb2NrLT5mbGFncyk7CisJCQkJCWNvbi0+c29jay0+c2stPnNrX3dyaXRlX3BlbmRpbmcrKzsKKwkJCQl9CiAJCQkJY29uZF9yZXNjaGVkKCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlpZiAocmV0IDw9IDApCiAJCQkJZ290byBzZW5kX2Vycm9yOwogCQl9Ci0JCQkvKiBEb24ndCBzdGFydmUgcGVvcGxlIGZpbGxpbmcgYnVmZmVycyAqLworCisJCS8qIERvbid0IHN0YXJ2ZSBwZW9wbGUgZmlsbGluZyBidWZmZXJzICovCisJCWlmICgrK2NvdW50ID49IE1BWF9TRU5EX01TR19DT1VOVCkgewogCQkJY29uZF9yZXNjaGVkKCk7CisJCQljb3VudCA9IDA7CisJCX0KIAogCQlzcGluX2xvY2soJmNvbi0+d3JpdGVxdWV1ZV9sb2NrKTsKIAkJZS0+b2Zmc2V0ICs9IHJldDsKQEAgLTE0MzAsMjAgKzE0NjgsMTkgQEAKIAogc3RhdGljIGludCB3b3JrX3N0YXJ0KHZvaWQpCiB7Ci0JaW50IGVycm9yOwotCXJlY3Zfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgiZGxtX3JlY3YiKTsKLQllcnJvciA9IElTX0VSUihyZWN2X3dvcmtxdWV1ZSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3JlY3YgJWQiLCBlcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKKwlyZWN2X3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgiZGxtX3JlY3YiLCBXUV9NRU1fUkVDTEFJTSB8CisJCQkJCSBXUV9ISUdIUFJJIHwgV1FfRlJFRVpFQUJMRSwgMCk7CisJaWYgKCFyZWN2X3dvcmtxdWV1ZSkgeworCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9yZWN2Iik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNlbmRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRsbV9zZW5kIik7Ci0JZXJyb3IgPSBJU19FUlIoc2VuZF93b3JrcXVldWUpOwotCWlmIChlcnJvcikgewotCQlsb2dfcHJpbnQoImNhbid0IHN0YXJ0IGRsbV9zZW5kICVkIiwgZXJyb3IpOworCXNlbmRfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJkbG1fc2VuZCIsIFdRX01FTV9SRUNMQUlNIHwKKwkJCQkJIFdRX0hJR0hQUkkgfCBXUV9GUkVFWkVBQkxFLCAwKTsKKwlpZiAoIXNlbmRfd29ya3F1ZXVlKSB7CisJCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3NlbmQiKTsKIAkJZGVzdHJveV93b3JrcXVldWUocmVjdl93b3JrcXVldWUpOwotCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggMzM3MzUyYS4uNjRmZjAyMyAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC00NDEsNyArNDQxLDYgQEAKIAlzdHJ1Y3QgcXN0ciBsb3dlcl9uYW1lOwogCWludCByYyA9IDA7CiAKLQlkX3NldF9kX29wKGVjcnlwdGZzX2RlbnRyeSwgJmVjcnlwdGZzX2RvcHMpOwogCWlmICgoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubGVuID09IDEKIAkgICAgICYmICFzdHJjbXAoZWNyeXB0ZnNfZGVudHJ5LT5kX25hbWUubmFtZSwgIi4iKSkKIAkgICAgfHwgKGVjcnlwdGZzX2RlbnRyeS0+ZF9uYW1lLmxlbiA9PSAyCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggMzUxMDM4Ni4uZDNiMjhhYiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWFpbi5jCisrKyBiL2ZzL2VjcnlwdGZzL21haW4uYwpAQCAtMTQxLDI1ICsxNDEsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qKgotICogZWNyeXB0ZnNfaW50ZXJwb3NlCi0gKiBAbG93ZXJfZGVudHJ5OiBFeGlzdGluZyBkZW50cnkgaW4gdGhlIGxvd2VyIGZpbGVzeXN0ZW0KLSAqIEBkZW50cnk6IGVjcnlwdGZzJyBkZW50cnkKLSAqIEBzYjogZWNyeXB0ZnMncyBzdXBlcl9ibG9jawotICogQGZsYWdzOiBmbGFncyB0byBnb3Zlcm4gYmVoYXZpb3Igb2YgaW50ZXJwb3NlIHByb2NlZHVyZQotICoKLSAqIEludGVycG9zZXMgdXBwZXIgYW5kIGxvd2VyIGRlbnRyaWVzLgotICoKLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKLSAqLwotaW50IGVjcnlwdGZzX2ludGVycG9zZShzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncykKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmVjcnlwdGZzX2dldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlLAorCQkgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IHJjID0gMDsKIAotCWxvd2VyX2lub2RlID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlOwogCWlmIChsb3dlcl9pbm9kZS0+aV9zYiAhPSBlY3J5cHRmc19zdXBlcmJsb2NrX3RvX2xvd2VyKHNiKSkgewogCQlyYyA9IC1FWERFVjsKIAkJZ290byBvdXQ7CkBAIC0xODksMTcgKzE3NiwzOCBAQAogCWlmIChzcGVjaWFsX2ZpbGUobG93ZXJfaW5vZGUtPmlfbW9kZSkpCiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbG93ZXJfaW5vZGUtPmlfbW9kZSwKIAkJCQkgICBsb3dlcl9pbm9kZS0+aV9yZGV2KTsKLQlkX3NldF9kX29wKGRlbnRyeSwgJmVjcnlwdGZzX2RvcHMpOwogCWZzc3RhY2tfY29weV9hdHRyX2FsbChpbm9kZSwgbG93ZXJfaW5vZGUpOwogCS8qIFRoaXMgc2l6ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGZvciByZWFsIGZpbGVzIHcvIGhlYWRlcnMgYW5kCiAJICogb3RoZXIgbWV0YWRhdGEgKi8KIAlmc3N0YWNrX2NvcHlfaW5vZGVfc2l6ZShpbm9kZSwgbG93ZXJfaW5vZGUpOworCXJldHVybiBpbm9kZTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihyYyk7Cit9CisKKy8qKgorICogZWNyeXB0ZnNfaW50ZXJwb3NlCisgKiBAbG93ZXJfZGVudHJ5OiBFeGlzdGluZyBkZW50cnkgaW4gdGhlIGxvd2VyIGZpbGVzeXN0ZW0KKyAqIEBkZW50cnk6IGVjcnlwdGZzJyBkZW50cnkKKyAqIEBzYjogZWNyeXB0ZnMncyBzdXBlcl9ibG9jaworICogQGZsYWdzOiBmbGFncyB0byBnb3Zlcm4gYmVoYXZpb3Igb2YgaW50ZXJwb3NlIHByb2NlZHVyZQorICoKKyAqIEludGVycG9zZXMgdXBwZXIgYW5kIGxvd2VyIGRlbnRyaWVzLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzOyBub24temVybyBvdGhlcndpc2UKKyAqLworaW50IGVjcnlwdGZzX2ludGVycG9zZShzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kZW50cnksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmxvd2VyX2lub2RlID0gbG93ZXJfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlY3J5cHRmc19nZXRfaW5vZGUobG93ZXJfaW5vZGUsIHNiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOwogCWlmIChmbGFncyAmIEVDUllQVEZTX0lOVEVSUE9TRV9GTEFHX0RfQUREKQogCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAllbHNlCiAJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBlbnVtIHsgZWNyeXB0ZnNfb3B0X3NpZywgZWNyeXB0ZnNfb3B0X2VjcnlwdGZzX3NpZywKQEAgLTQ5Miw1OSArNTAwLDExIEBACiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZWNyeXB0ZnNfZnNfdHlwZTsKIAogLyoqCi0gKiBlY3J5cHRmc19yZWFkX3N1cGVyCi0gKiBAc2I6IFRoZSBlY3J5cHRmcyBzdXBlciBibG9jawotICogQGRldl9uYW1lOiBUaGUgcGF0aCB0byBtb3VudCBvdmVyCi0gKgotICogUmVhZCB0aGUgc3VwZXIgYmxvY2sgb2YgdGhlIGxvd2VyIGZpbGVzeXN0ZW0sIGFuZCB1c2UKLSAqIGVjcnlwdGZzX2ludGVycG9zZSB0byBjcmVhdGUgb3VyIGluaXRpYWwgaW5vZGUgYW5kIHN1cGVyIGJsb2NrCi0gKiBzdHJ1Y3QuCi0gKi8KLXN0YXRpYyBpbnQgZWNyeXB0ZnNfcmVhZF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpkZXZfbmFtZSkKLXsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwotCWludCByYzsKLQotCXJjID0ga2Vybl9wYXRoKGRldl9uYW1lLCBMT09LVVBfRk9MTE9XIHwgTE9PS1VQX0RJUkVDVE9SWSwgJnBhdGgpOwotCWlmIChyYykgewotCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAicGF0aF9sb29rdXAoKSBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHBhdGguZGVudHJ5LT5kX3NiLT5zX3R5cGUgPT0gJmVjcnlwdGZzX2ZzX3R5cGUpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlwcmludGsoS0VSTl9FUlIgIk1vdW50IG9uIGZpbGVzeXN0ZW0gb2YgdHlwZSAiCi0JCQkiZUNyeXB0ZnMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGR1ZSB0byAiCi0JCQkia25vd24gaW5jb21wYXRpYmlsaXRpZXNcbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQllY3J5cHRmc19zZXRfc3VwZXJibG9ja19sb3dlcihzYiwgcGF0aC5kZW50cnktPmRfc2IpOwotCXNiLT5zX21heGJ5dGVzID0gcGF0aC5kZW50cnktPmRfc2ItPnNfbWF4Ynl0ZXM7Ci0Jc2ItPnNfYmxvY2tzaXplID0gcGF0aC5kZW50cnktPmRfc2ItPnNfYmxvY2tzaXplOwotCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXIoc2ItPnNfcm9vdCwgcGF0aC5kZW50cnkpOwotCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXJfbW50KHNiLT5zX3Jvb3QsIHBhdGgubW50KTsKLQlyYyA9IGVjcnlwdGZzX2ludGVycG9zZShwYXRoLmRlbnRyeSwgc2ItPnNfcm9vdCwgc2IsIDApOwotCWlmIChyYykKLQkJZ290byBvdXRfZnJlZTsKLQlyYyA9IDA7Ci0JZ290byBvdXQ7Ci1vdXRfZnJlZToKLQlwYXRoX3B1dCgmcGF0aCk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKICAqIGVjcnlwdGZzX2dldF9zYgogICogQGZzX3R5cGUKICAqIEBmbGFncwogICogQGRldl9uYW1lOiBUaGUgcGF0aCB0byBtb3VudCBvdmVyCiAgKiBAcmF3X2RhdGE6IFRoZSBvcHRpb25zIHBhc3NlZCBpbnRvIHRoZSBrZXJuZWwKLSAqCi0gKiBUaGUgd2hvbGUgZWNyeXB0ZnNfZ2V0X3NiIHByb2Nlc3MgaXMgYnJva2VuIGludG8gMyBmdW5jdGlvbnM6Ci0gKiBlY3J5cHRmc19wYXJzZV9vcHRpb25zKCk6IGhhbmRsZSBvcHRpb25zIHBhc3NlZCB0byBlY3J5cHRmcywgaWYgYW55Ci0gKiBlY3J5cHRmc19yZWFkX3N1cGVyKCk6IHRoaXMgYWNjZXNzZXMgdGhlIGxvd2VyIGZpbGVzeXN0ZW0gYW5kIHVzZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZWNyeXB0ZnNfaW50ZXJwb3NlIHRvIHBlcmZvcm0gbW9zdCBvZiB0aGUgbGlua2luZwotICogZWNyeXB0ZnNfaW50ZXJwb3NlKCk6IGxpbmtzIHRoZSBsb3dlciBmaWxlc3lzdGVtIGludG8gZWNyeXB0ZnMgKGlub2RlLmMpCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICplY3J5cHRmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAogCQkJY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhKQpAQCAtNTUzLDYgKzUxMyw4IEBACiAJc3RydWN0IGVjcnlwdGZzX3NiX2luZm8gKnNiaTsKIAlzdHJ1Y3QgZWNyeXB0ZnNfZGVudHJ5X2luZm8gKnJvb3RfaW5mbzsKIAljb25zdCBjaGFyICplcnIgPSAiR2V0dGluZyBzYiBmYWlsZWQiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBhdGggcGF0aDsKIAlpbnQgcmM7CiAKIAlzYmkgPSBrbWVtX2NhY2hlX3phbGxvYyhlY3J5cHRmc19zYl9pbmZvX2NhY2hlLCBHRlBfS0VSTkVMKTsKQEAgLTU3NSwxMCArNTM3LDggQEAKIAogCXMtPnNfZmxhZ3MgPSBmbGFnczsKIAlyYyA9IGJkaV9zZXR1cF9hbmRfcmVnaXN0ZXIoJnNiaS0+YmRpLCAiZWNyeXB0ZnMiLCBCRElfQ0FQX01BUF9DT1BZKTsKLQlpZiAocmMpIHsKLQkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAocmMpCisJCWdvdG8gb3V0MTsKIAogCWVjcnlwdGZzX3NldF9zdXBlcmJsb2NrX3ByaXZhdGUocywgc2JpKTsKIAlzLT5zX2JkaSA9ICZzYmktPmJkaTsKQEAgLTU4NiwzNCArNTQ2LDU0IEBACiAJLyogLT5raWxsX3NiKCkgd2lsbCB0YWtlIGNhcmUgb2Ygc2JpIGFmdGVyIHRoYXQgcG9pbnQgKi8KIAlzYmkgPSBOVUxMOwogCXMtPnNfb3AgPSAmZWNyeXB0ZnNfc29wczsKKwlzLT5zX2Rfb3AgPSAmZWNyeXB0ZnNfZG9wczsKKworCWVyciA9ICJSZWFkaW5nIHNiIGZhaWxlZCI7CisJcmMgPSBrZXJuX3BhdGgoZGV2X25hbWUsIExPT0tVUF9GT0xMT1cgfCBMT09LVVBfRElSRUNUT1JZLCAmcGF0aCk7CisJaWYgKHJjKSB7CisJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJrZXJuX3BhdGgoKSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDE7CisJfQorCWlmIChwYXRoLmRlbnRyeS0+ZF9zYi0+c190eXBlID09ICZlY3J5cHRmc19mc190eXBlKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJNb3VudCBvbiBmaWxlc3lzdGVtIG9mIHR5cGUgIgorCQkJImVDcnlwdGZzIGV4cGxpY2l0bHkgZGlzYWxsb3dlZCBkdWUgdG8gIgorCQkJImtub3duIGluY29tcGF0aWJpbGl0aWVzXG4iKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJZWNyeXB0ZnNfc2V0X3N1cGVyYmxvY2tfbG93ZXIocywgcGF0aC5kZW50cnktPmRfc2IpOworCXMtPnNfbWF4Ynl0ZXMgPSBwYXRoLmRlbnRyeS0+ZF9zYi0+c19tYXhieXRlczsKKwlzLT5zX2Jsb2Nrc2l6ZSA9IHBhdGguZGVudHJ5LT5kX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCWlub2RlID0gZWNyeXB0ZnNfZ2V0X2lub2RlKHBhdGguZGVudHJ5LT5kX2lub2RlLCBzKTsKKwlyYyA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9mcmVlOworCisJcy0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXMtPnNfcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCXJjID0gLUVOT01FTTsKLQlzLT5zX3Jvb3QgPSBkX2FsbG9jKE5VTEwsICYoY29uc3Qgc3RydWN0IHFzdHIpIHsKLQkJCSAgICAgLmhhc2ggPSAwLC5uYW1lID0gIi8iLC5sZW4gPSAxfSk7Ci0JaWYgKCFzLT5zX3Jvb3QpIHsKLQkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlkX3NldF9kX29wKHMtPnNfcm9vdCwgJmVjcnlwdGZzX2RvcHMpOwotCXMtPnNfcm9vdC0+ZF9zYiA9IHM7Ci0Jcy0+c19yb290LT5kX3BhcmVudCA9IHMtPnNfcm9vdDsKLQogCXJvb3RfaW5mbyA9IGttZW1fY2FjaGVfemFsbG9jKGVjcnlwdGZzX2RlbnRyeV9pbmZvX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJvb3RfaW5mbykgewotCQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcm9vdF9pbmZvKQorCQlnb3RvIG91dF9mcmVlOworCiAJLyogLT5raWxsX3NiKCkgd2lsbCB0YWtlIGNhcmUgb2Ygcm9vdF9pbmZvICovCiAJZWNyeXB0ZnNfc2V0X2RlbnRyeV9wcml2YXRlKHMtPnNfcm9vdCwgcm9vdF9pbmZvKTsKKwllY3J5cHRmc19zZXRfZGVudHJ5X2xvd2VyKHMtPnNfcm9vdCwgcGF0aC5kZW50cnkpOworCWVjcnlwdGZzX3NldF9kZW50cnlfbG93ZXJfbW50KHMtPnNfcm9vdCwgcGF0aC5tbnQpOworCiAJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0JcmMgPSBlY3J5cHRmc19yZWFkX3N1cGVyKHMsIGRldl9uYW1lKTsKLQlpZiAocmMpIHsKLQkJZGVhY3RpdmF0ZV9sb2NrZWRfc3VwZXIocyk7Ci0JCWVyciA9ICJSZWFkaW5nIHNiIGZhaWxlZCI7Ci0JCWdvdG8gb3V0OwotCX0KIAlyZXR1cm4gZGdldChzLT5zX3Jvb3QpOwogCitvdXRfZnJlZToKKwlwYXRoX3B1dCgmcGF0aCk7CitvdXQxOgorCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwogb3V0OgogCWlmIChzYmkpIHsKIAkJZWNyeXB0ZnNfZGVzdHJveV9tb3VudF9jcnlwdF9zdGF0KCZzYmktPm1vdW50X2NyeXB0X3N0YXQpOwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCA4Y2YwNzI0Li5jYzhhOWI3IDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgYXZhaWxhYmxlIGluc2lkZSAvcHJvYy9zeXMvZnMvZXBvbGwvCiAgKi8KIC8qIE1heGltdW0gbnVtYmVyIG9mIGVwb2xsIHdhdGNoZWQgZGVzY3JpcHRvcnMsIHBlciB1c2VyICovCi1zdGF0aWMgaW50IG1heF91c2VyX3dhdGNoZXMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBsb25nIG1heF91c2VyX3dhdGNoZXMgX19yZWFkX21vc3RseTsKIAogLyoKICAqIFRoaXMgbXV0ZXggaXMgdXNlZCB0byBzZXJpYWxpemUgZXBfZnJlZSgpIGFuZCBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkuCkBAIC0yNDAsMTYgKzI0MCwxOCBAQAogCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAKLXN0YXRpYyBpbnQgemVybzsKK3N0YXRpYyBsb25nIHplcm87CitzdGF0aWMgbG9uZyBsb25nX21heCA9IExPTkdfTUFYOwogCiBjdGxfdGFibGUgZXBvbGxfdGFibGVbXSA9IHsKIAl7CiAJCS5wcm9jbmFtZQk9ICJtYXhfdXNlcl93YXRjaGVzIiwKIAkJLmRhdGEJCT0gJm1heF91c2VyX3dhdGNoZXMsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tYXhsZW4JCT0gc2l6ZW9mKG1heF91c2VyX3dhdGNoZXMpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAogCQkuZXh0cmExCQk9ICZ6ZXJvLAorCQkuZXh0cmEyCQk9ICZsb25nX21heCwKIAl9LAogCXsgfQogfTsKQEAgLTU2MSw3ICs1NjMsNyBAQAogCS8qIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBmcmVlIHRoZSBldmVudHBvbGwgaXRlbSAqLwogCWttZW1fY2FjaGVfZnJlZShlcGlfY2FjaGUsIGVwaSk7CiAKLQlhdG9taWNfZGVjKCZlcC0+dXNlci0+ZXBvbGxfd2F0Y2hlcyk7CisJYXRvbWljX2xvbmdfZGVjKCZlcC0+dXNlci0+ZXBvbGxfd2F0Y2hlcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg5OCwxMSArOTAwLDEyIEBACiB7CiAJaW50IGVycm9yLCByZXZlbnRzLCBwd2FrZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIHVzZXJfd2F0Y2hlczsKIAlzdHJ1Y3QgZXBpdGVtICplcGk7CiAJc3RydWN0IGVwX3BxdWV1ZSBlcHE7CiAKLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmVwLT51c2VyLT5lcG9sbF93YXRjaGVzKSA+PQotCQkgICAgIG1heF91c2VyX3dhdGNoZXMpKQorCXVzZXJfd2F0Y2hlcyA9IGF0b21pY19sb25nX3JlYWQoJmVwLT51c2VyLT5lcG9sbF93YXRjaGVzKTsKKwlpZiAodW5saWtlbHkodXNlcl93YXRjaGVzID49IG1heF91c2VyX3dhdGNoZXMpKQogCQlyZXR1cm4gLUVOT1NQQzsKIAlpZiAoIShlcGkgPSBrbWVtX2NhY2hlX2FsbG9jKGVwaV9jYWNoZSwgR0ZQX0tFUk5FTCkpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTk2Niw3ICs5NjksNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKIAotCWF0b21pY19pbmMoJmVwLT51c2VyLT5lcG9sbF93YXRjaGVzKTsKKwlhdG9taWNfbG9uZ19pbmMoJmVwLT51c2VyLT5lcG9sbF93YXRjaGVzKTsKIAogCS8qIFdlIGhhdmUgdG8gY2FsbCB0aGlzIG91dHNpZGUgdGhlIGxvY2sgKi8KIAlpZiAocHdha2UpCkBAIC0xNDI2LDYgKzE0MjksNyBAQAogCSAqLwogCW1heF91c2VyX3dhdGNoZXMgPSAoKChzaS50b3RhbHJhbSAtIHNpLnRvdGFsaGlnaCkgLyAyNSkgPDwgUEFHRV9TSElGVCkgLwogCQlFUF9JVEVNX0NPU1Q7CisJQlVHX09OKG1heF91c2VyX3dhdGNoZXMgPCAwKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIHBlcmZvcm0gc2FmZSBwb2xsIHdhaXQgaGVhZCB3YWtlIHVwcyAqLwogCWVwX25lc3RlZF9jYWxsc19pbml0KCZwb2xsX3NhZmV3YWtlX25jYWxscyk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCAyNzA5YjM0Li40N2NkYTQxIDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTI4LDIxICsyOCwzMCBAQAogCiB0eXBlZGVmIHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yIGV4dDJfZGlyZW50OwogCisvKgorICogVGVzdHMgYWdhaW5zdCBNQVhfUkVDX0xFTiBldGMgd2VyZSBwdXQgaW4gcGxhY2UgZm9yIDY0ayBibG9jaworICogc2l6ZXM7IGlmIHRoYXQgaXMgbm90IHBvc3NpYmxlIG9uIHRoaXMgYXJjaCwgd2UgY2FuIHNraXAKKyAqIHRob3NlIHRlc3RzIGFuZCBzcGVlZCB0aGluZ3MgdXAuCisgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZXh0Ml9yZWNfbGVuX2Zyb21fZGlzayhfX2xlMTYgZGxlbikKIHsKIAl1bnNpZ25lZCBsZW4gPSBsZTE2X3RvX2NwdShkbGVuKTsKIAorI2lmIChQQUdFX0NBQ0hFX1NJWkUgPj0gNjU1MzYpCiAJaWYgKGxlbiA9PSBFWFQyX01BWF9SRUNfTEVOKQogCQlyZXR1cm4gMSA8PCAxNjsKKyNlbmRpZgogCXJldHVybiBsZW47CiB9CiAKIHN0YXRpYyBpbmxpbmUgX19sZTE2IGV4dDJfcmVjX2xlbl90b19kaXNrKHVuc2lnbmVkIGxlbikKIHsKKyNpZiAoUEFHRV9DQUNIRV9TSVpFID49IDY1NTM2KQogCWlmIChsZW4gPT0gKDEgPDwgMTYpKQogCQlyZXR1cm4gY3B1X3RvX2xlMTYoRVhUMl9NQVhfUkVDX0xFTik7CiAJZWxzZQogCQlCVUdfT04obGVuID4gKDEgPDwgMTYpKTsKKyNlbmRpZgogCXJldHVybiBjcHVfdG9fbGUxNihsZW4pOwogfQogCkBAIC0xMjksMTUgKzEzOCwxNSBAQAogCQlwID0gKGV4dDJfZGlyZW50ICopKGthZGRyICsgb2Zmcyk7CiAJCXJlY19sZW4gPSBleHQyX3JlY19sZW5fZnJvbV9kaXNrKHAtPnJlY19sZW4pOwogCi0JCWlmIChyZWNfbGVuIDwgRVhUMl9ESVJfUkVDX0xFTigxKSkKKwkJaWYgKHVubGlrZWx5KHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKDEpKSkKIAkJCWdvdG8gRXNob3J0OwotCQlpZiAocmVjX2xlbiAmIDMpCisJCWlmICh1bmxpa2VseShyZWNfbGVuICYgMykpCiAJCQlnb3RvIEVhbGlnbjsKLQkJaWYgKHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkKKwkJaWYgKHVubGlrZWx5KHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkpCiAJCQlnb3RvIEVuYW1lbGVuOwotCQlpZiAoKChvZmZzICsgcmVjX2xlbiAtIDEpIF4gb2ZmcykgJiB+KGNodW5rX3NpemUtMSkpCisJCWlmICh1bmxpa2VseSgoKG9mZnMgKyByZWNfbGVuIC0gMSkgXiBvZmZzKSAmIH4oY2h1bmtfc2l6ZS0xKSkpCiAJCQlnb3RvIEVzcGFuOwotCQlpZiAobGUzMl90b19jcHUocC0+aW5vZGUpID4gbWF4X2ludW1iZXIpCisJCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdShwLT5pbm9kZSkgPiBtYXhfaW51bWJlcikpCiAJCQlnb3RvIEVpbnVtYmVyOwogCX0KIAlpZiAob2ZmcyAhPSBsaW1pdCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvbmFtZWkuYyBiL2ZzL2V4dDIvbmFtZWkuYwppbmRleCBmOGFlY2QyLi4yZTFkODM0IDEwMDY0NAotLS0gYS9mcy9leHQyL25hbWVpLmMKKysrIGIvZnMvZXh0Mi9uYW1laS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW5vZGUgPSBOVUxMOwogCWlmIChpbm8pIHsKIAkJaW5vZGUgPSBleHQyX2lnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAodW5saWtlbHkoSVNfRVJSKGlub2RlKSkpIHsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWlmIChQVFJfRVJSKGlub2RlKSA9PSAtRVNUQUxFKSB7CiAJCQkJZXh0Ml9lcnJvcihkaXItPmlfc2IsIF9fZnVuY19fLAogCQkJCQkJImRlbGV0ZWQgaW5vZGUgcmVmZXJlbmNlZDogJWx1IiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCBlMGM2MzgwLi43NzMxNjk1IDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC00Myw5ICs0MywxMCBAQAogc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKiBidWYpOwogc3RhdGljIGludCBleHQyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOwogCi12b2lkIGV4dDJfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCi0JCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDJfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CkBAIC01OSw5ICs2MCwxMyBAQAogCX0KIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMi1mcyAoJXMpOiBlcnJvcjogJXM6ICIsIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJFWFQyLWZzICglcyk6IGVycm9yOiAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sICZ2YWYpOworCiAJdmFfZW5kKGFyZ3MpOwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfUEFOSUMpKQpAQCAtNzYsMTIgKzgxLDE2IEBACiB2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwKIAkJY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoIiVzRVhUMi1mcyAoJXMpOiAiLCBwcmVmaXgsIHNiLT5zX2lkKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50aygiJXNFWFQyLWZzICglcyk6ICVwVlxuIiwgcHJlZml4LCBzYi0+c19pZCwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHIuYyBiL2ZzL2V4dDIveGF0dHIuYwppbmRleCBmODQ3MDBiLi5jMmU0ZGNlIDEwMDY0NAotLS0gYS9mcy9leHQyL3hhdHRyLmMKKysrIGIvZnMvZXh0Mi94YXR0ci5jCkBAIC0xOTksMTQgKzE5OSw2IEBACiAJCQlnb3RvIGZvdW5kOwogCQllbnRyeSA9IG5leHQ7CiAJfQotCS8qIENoZWNrIHRoZSByZW1haW5pbmcgbmFtZSBlbnRyaWVzICovCi0Jd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgewotCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9Ci0JCQlFWFQyX1hBVFRSX05FWFQoZW50cnkpOwotCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKLQkJCWdvdG8gYmFkX2Jsb2NrOwotCQllbnRyeSA9IG5leHQ7Ci0JfQogCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCiAJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKIAllcnJvciA9IC1FTk9EQVRBOwpAQCAtMzU1LDcgKzM0Nyw3IEBACiAvKgogICogZXh0Ml94YXR0cl9zZXQoKQogICoKLSAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiAgVmFsdWUKICAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCiAgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAogICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCmRpZmYgLS1naXQgYS9mcy9leHQzL2JhbGxvYy5jIGIvZnMvZXh0My9iYWxsb2MuYwppbmRleCBiM2RiMjI2Li4wNDU5OTVjIDEwMDY0NAotLS0gYS9mcy9leHQzL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KIAogLyoKICAqIGJhbGxvYy5jIGNvbnRhaW5zIHRoZSBibG9ja3MgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCkBAIC0zOSw2ICs0MCwyMSBAQAogCiAjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKIAorLyoKKyAqIENhbGN1bGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnVtYmVyIGFuZCBvZmZzZXQsIGdpdmVuIGEgYmxvY2sgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwlleHQzX2ZzYmxrX3QgYmxvY2tuciwgdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQzX2dycGJsa190ICpvZmZzZXRwKQoreworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCisJYmxvY2tuciA9IGJsb2NrbnIgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlpZiAob2Zmc2V0cCkKKwkJKm9mZnNldHAgPSBibG9ja25yICUgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlpZiAoYmxvY2tncnBwKQorCQkqYmxvY2tncnBwID0gYmxvY2tuciAvIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7Cit9CisKIC8qKgogICogZXh0M19nZXRfZ3JvdXBfZGVzYygpIC0tIGxvYWQgZ3JvdXAgZGVzY3JpcHRvciBmcm9tIGRpc2sKICAqIEBzYjoJCQlzdXBlciBibG9jawpAQCAtMTg4NSwzICsxOTAxLDI1MyBAQAogCXJldHVybiBleHQzX2JnX251bV9nZGJfbWV0YShzYixncm91cCk7CiAKIH0KKworLyoqCisgKiBleHQzX3RyaW1fYWxsX2ZyZWUgLS0gZnVuY3Rpb24gdG8gdHJpbSBhbGwgZnJlZSBzcGFjZSBpbiBhbGxvYy4gZ3JvdXAKKyAqIEBzYjoJCQlzdXBlciBibG9jayBmb3IgZmlsZSBzeXN0ZW0KKyAqIEBncm91cDoJCWFsbG9jYXRpb24gZ3JvdXAgdG8gdHJpbQorICogQHN0YXJ0OgkJZmlyc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQorICogQG1heDoJCWxhc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQorICogQGdkcDoJCWFsbG9jYXRpb24gZ3JvdXAgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBAbWluYmxvY2tzOgkJbWluaW11bSBleHRlbnQgYmxvY2sgY291bnQKKyAqCisgKiBleHQzX3RyaW1fYWxsX2ZyZWUgd2Fsa3MgdGhyb3VnaCBncm91cCdzIGJsb2NrIGJpdG1hcCBzZWFyY2hpbmcgZm9yIGZyZWUKKyAqIGJsb2Nrcy4gV2hlbiB0aGUgZnJlZSBibG9jayBpcyBmb3VuZCwgaXQgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBibG9jayBhbmQKKyAqIGNvbnNlcXVlbnQgZnJlZSBibG9jayB0byBnZXQgdGhlIGJpZ2dlc3QgZnJlZSBleHRlbnQgcG9zc2libGUsIHVudGlsIGl0CisgKiByZWFjaGVzIGFueSB1c2VkIGJsb2NrLiBUaGVuIGlzc3VlIGEgVFJJTSBjb21tYW5kIG9uIHRoaXMgZXh0ZW50IGFuZCBmcmVlCisgKiB0aGUgZXh0ZW50IGluIHRoZSBibG9jayBiaXRtYXAuIFRoaXMgaXMgZG9uZSB1bnRpbCB3aG9sZSBncm91cCBpcyBzY2FubmVkLgorICovCitleHQzX2dycGJsa190IGV4dDNfdHJpbV9hbGxfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZ3JvdXAsCisJCQkJZXh0M19ncnBibGtfdCBzdGFydCwgZXh0M19ncnBibGtfdCBtYXgsCisJCQkJZXh0M19ncnBibGtfdCBtaW5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlleHQzX2dycGJsa190IG5leHQsIGZyZWVfYmxvY2tzLCBiaXQsIGZyZWVkLCBjb3VudCA9IDA7CisJZXh0M19mc2Jsa190IGRpc2NhcmRfYmxvY2s7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoLCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJaW50IGVyciA9IDAsIHJldCA9IDA7CisKKwkvKgorCSAqIFdlIHdpbGwgdXBkYXRlIG9uZSBibG9jayBiaXRtYXAsIGFuZCBvbmUgZ3JvdXAgZGVzY3JpcHRvcgorCSAqLworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydF9zYihzYiwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldHRpbmcgdW5kbyBhY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmdkcF9iaCk7CisJaWYgKCFnZHApIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBnZHBfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKworCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJc2JpID0gRVhUM19TQihzYik7CisKKwkgLyogV2FsayB0aHJvdWdoIHRoZSB3aG9sZSBncm91cCAqLworCXdoaWxlIChzdGFydCA8IG1heCkgeworCQlzdGFydCA9IGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soc3RhcnQsIGJpdG1hcF9iaCwgbWF4KTsKKwkJaWYgKHN0YXJ0IDwgMCkKKwkJCWJyZWFrOworCQluZXh0ID0gc3RhcnQ7CisKKwkJLyoKKwkJICogQWxsb2NhdGUgY29udGlndW91cyBmcmVlIGV4dGVudHMgYnkgc2V0dGluZyBiaXRzIGluIHRoZQorCQkgKiBibG9jayBiaXRtYXAKKwkJICovCisJCXdoaWxlIChuZXh0IDwgbWF4CisJCQkmJiBjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSwKKwkJCQkJbmV4dCwgYml0bWFwX2JoKSkgeworCQkJbmV4dCsrOworCQl9CisKKwkJIC8qIFdlIGRpZCBub3QgY2xhaW0gYW55IGJsb2NrcyAqLworCQlpZiAobmV4dCA9PSBzdGFydCkKKwkJCWNvbnRpbnVlOworCisJCWRpc2NhcmRfYmxvY2sgPSAoZXh0M19mc2Jsa190KXN0YXJ0ICsKKwkJCQlleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7CisKKwkJLyogVXBkYXRlIGNvdW50ZXJzICovCisJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgc3RhcnQgLSBuZXh0KTsKKwkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIG5leHQgLSBzdGFydCk7CisKKwkJLyogRG8gbm90IGlzc3VlIGEgVFJJTSBvbiBleHRlbnRzIHNtYWxsZXIgdGhhbiBtaW5ibG9ja3MgKi8KKwkJaWYgKChuZXh0IC0gc3RhcnQpIDwgbWluYmxvY2tzKQorCQkJZ290byBmcmVlX2V4dGVudDsKKworCQkgLyogU2VuZCB0aGUgVFJJTSBjb21tYW5kIGRvd24gdG8gdGhlIGRldmljZSAqLworCQllcnIgPSBzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBuZXh0IC0gc3RhcnQsCisJCQkJICAgICAgIEdGUF9OT0ZTLCAwKTsKKwkJY291bnQgKz0gKG5leHQgLSBzdGFydCk7CitmcmVlX2V4dGVudDoKKwkJZnJlZWQgPSAwOworCisJCS8qCisJCSAqIENsZWFyIGJpdHMgaW4gdGhlIGJpdG1hcAorCQkgKi8KKwkJZm9yIChiaXQgPSBzdGFydDsgYml0IDwgbmV4dDsgYml0KyspIHsKKwkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjbGVhciBiaXQiKTsKKwkJCWlmICghZXh0M19jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApLAorCQkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCQlleHQzX2Vycm9yKHNiLCBfX2Z1bmNfXywKKwkJCQkJImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICJFM0ZTQkxLLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcpYml0KTsKKwkJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOworCQkJfSBlbHNlIHsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisKKwkJLyogVXBkYXRlIGNvdXRlcnMgKi8KKwkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50LCBmcmVlZCk7CisJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBmcmVlZCk7CisKKwkJc3RhcnQgPSBuZXh0OworCQlpZiAoZXJyIDwgMCkgeworCQkJaWYgKGVyciAhPSAtRU9QTk9UU1VQUCkKKwkJCQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiRGlzY2FyZCBjb21tYW5kICIKKwkJCQkJICAgICAicmV0dXJuZWQgZXJyb3IgJWRcbiIsIGVycik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKworCQkvKiBObyBtb3JlIHN1aXRhYmxlIGV4dGVudHMgKi8KKwkJaWYgKChmcmVlX2Jsb2NrcyAtIGNvdW50KSA8IG1pbmJsb2NrcykKKwkJCWJyZWFrOworCX0KKworCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOworCXJldCA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJaWYgKCFlcnIpCisJCWVyciA9IHJldDsKKworCS8qIEFuZCB0aGUgZ3JvdXAgZGVzY3JpcHRvciBibG9jayAqLworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKKwlyZXQgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZHBfYmgpOworCWlmICghZXJyKQorCQllcnIgPSByZXQ7CisKKwlleHQzX2RlYnVnKCJ0cmltbWVkICVkIGJsb2NrcyBpbiB0aGUgZ3JvdXAgJWRcbiIsCisJCWNvdW50LCBncm91cCk7CisKK2Vycl9vdXQ6CisJaWYgKGVycikKKwkJY291bnQgPSBlcnI7CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlicmVsc2UoYml0bWFwX2JoKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBleHQzX3RyaW1fZnMoKSAtLSB0cmltIGlvY3RsIGhhbmRsZSBmdW5jdGlvbgorICogQHNiOgkJCXN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqIEBzdGFydDoJCUZpcnN0IEJ5dGUgdG8gdHJpbQorICogQGxlbjoJCW51bWJlciBvZiBCeXRlcyB0byB0cmltIGZyb20gc3RhcnQKKyAqIEBtaW5sZW46CQltaW5pbXVtIGV4dGVudCBsZW5ndGggaW4gQnl0ZXMKKyAqCisgKiBleHQzX3RyaW1fZnMgZ29lcyB0aHJvdWdoIGFsbCBhbGxvY2F0aW9uIGdyb3VwcyBjb250YWluaW5nIEJ5dGVzIGZyb20KKyAqIHN0YXJ0IHRvIHN0YXJ0K2xlbi4gRm9yIGVhY2ggc3VjaCBhIGdyb3VwIGV4dDNfdHJpbV9hbGxfZnJlZSBmdW5jdGlvbgorICogaXMgaW52b2tlZCB0byB0cmltIGFsbCBmcmVlIHNwYWNlLgorICovCitpbnQgZXh0M190cmltX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc3RyaW1fcmFuZ2UgKnJhbmdlKQoreworCWV4dDNfZ3JwYmxrX3QgbGFzdF9ibG9jaywgZmlyc3RfYmxvY2ssIGZyZWVfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZ3JvdXAsIGxhc3RfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBncm91cCwgbmdyb3VwczsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisJdWludDY0X3Qgc3RhcnQsIGxlbiwgbWlubGVuLCB0cmltbWVkOworCWV4dDNfZnNibGtfdCBtYXhfYmxrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CisJaW50IHJldCA9IDA7CisKKwlzdGFydCA9IHJhbmdlLT5zdGFydCA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlsZW4gPSByYW5nZS0+bGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCW1pbmxlbiA9IHJhbmdlLT5taW5sZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdHJpbW1lZCA9IDA7CisKKwlpZiAodW5saWtlbHkobWlubGVuID4gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdGFydCA+PSBtYXhfYmxrcykKKwkJZ290byBvdXQ7CisJaWYgKHN0YXJ0IDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIHsKKwkJbGVuIC09IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIC0gc3RhcnQ7CisJCXN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJfQorCWlmIChzdGFydCArIGxlbiA+IG1heF9ibGtzKQorCQlsZW4gPSBtYXhfYmxrcyAtIHN0YXJ0OworCisJbmdyb3VwcyA9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlzbXBfcm1iKCk7CisKKwkvKiBEZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QgZ3JvdXAgdG8gZXhhbWluZSBiYXNlZCBvbiBzdGFydCBhbmQgbGVuICovCisJZXh0M19nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDNfZnNibGtfdCkgc3RhcnQsCisJCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9ibG9jayk7CisJZXh0M19nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDNfZnNibGtfdCkgKHN0YXJ0ICsgbGVuKSwKKwkJCQkgICAgICZsYXN0X2dyb3VwLCAmbGFzdF9ibG9jayk7CisJbGFzdF9ncm91cCA9IChsYXN0X2dyb3VwID4gbmdyb3VwcyAtIDEpID8gbmdyb3VwcyAtIDEgOiBsYXN0X2dyb3VwOworCWxhc3RfYmxvY2sgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCisJaWYgKGZpcnN0X2dyb3VwID4gbGFzdF9ncm91cCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGdyb3VwID0gZmlyc3RfZ3JvdXA7IGdyb3VwIDw9IGxhc3RfZ3JvdXA7IGdyb3VwKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOworCQlpZiAoIWdkcCkKKwkJCWJyZWFrOworCisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWlmIChmcmVlX2Jsb2NrcyA8IG1pbmxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChsZW4gPj0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJCWxlbiAtPSAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIGZpcnN0X2Jsb2NrKTsKKwkJZWxzZQorCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgbGVuOworCisJCXJldCA9IGV4dDNfdHJpbV9hbGxfZnJlZShzYiwgZ3JvdXAsIGZpcnN0X2Jsb2NrLAorCQkJCQlsYXN0X2Jsb2NrLCBtaW5sZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXRyaW1tZWQgKz0gcmV0OworCQlmaXJzdF9ibG9jayA9IDA7CisJfQorCisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSAwOworCitvdXQ6CisJcmFuZ2UtPmxlbiA9IHRyaW1tZWQgKiBzYi0+c19ibG9ja3NpemU7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9kaXIuYyBiL2ZzL2V4dDMvZGlyLmMKaW5kZXggZTJlNzJjMy4uMzRmMGEwNyAxMDA2NDQKLS0tIGEvZnMvZXh0My9kaXIuYworKysgYi9mcy9leHQzL2Rpci5jCkBAIC02OSwyNSArNjksMjYgQEAKIAljb25zdCBjaGFyICogZXJyb3JfbXNnID0gTlVMTDsKIAljb25zdCBpbnQgcmxlbiA9IGV4dDNfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwogCi0JaWYgKHJsZW4gPCBFWFQzX0RJUl9SRUNfTEVOKDEpKQorCWlmICh1bmxpa2VseShybGVuIDwgRVhUM19ESVJfUkVDX0xFTigxKSkpCiAJCWVycm9yX21zZyA9ICJyZWNfbGVuIGlzIHNtYWxsZXIgdGhhbiBtaW5pbWFsIjsKLQllbHNlIGlmIChybGVuICUgNCAhPSAwKQorCWVsc2UgaWYgKHVubGlrZWx5KHJsZW4gJSA0ICE9IDApKQogCQllcnJvcl9tc2cgPSAicmVjX2xlbiAlIDQgIT0gMCI7Ci0JZWxzZSBpZiAocmxlbiA8IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKSkKKwllbHNlIGlmICh1bmxpa2VseShybGVuIDwgRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKSkKIAkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgdG9vIHNtYWxsIGZvciBuYW1lX2xlbiI7Ci0JZWxzZSBpZiAoKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSkgKyBybGVuID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwllbHNlIGlmICh1bmxpa2VseSgoKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSkgKyBybGVuID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpKQogCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOwotCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgotCQkJbGUzMl90b19jcHUoRVhUM19TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJZWxzZSBpZiAodW5saWtlbHkobGUzMl90b19jcHUoZGUtPmlub2RlKSA+CisJCQlsZTMyX3RvX2NwdShFWFQzX1NCKGRpci0+aV9zYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSkpCiAJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKIAotCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwlpZiAodW5saWtlbHkoZXJyb3JfbXNnICE9IE5VTEwpKQogCQlleHQzX2Vycm9yIChkaXItPmlfc2IsIGZ1bmN0aW9uLAogCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCiAJCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCiAJCQlkaXItPmlfaW5vLCBlcnJvcl9tc2csIG9mZnNldCwKIAkJCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAogCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKKwogCXJldHVybiBlcnJvcl9tc2cgPT0gTlVMTCA/IDEgOiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggYTk1ODA2MS4uYWU5NGY2ZCAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjE0NSwxMyArMjE0NSwxNSBAQAogCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCWlmIChiaCkgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCkpCisJCQkJcmV0dXJuOwogCQl9CiAJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJdHJ1bmNhdGVfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKTsKIAkJaWYgKGJoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZXRha2luZyB3cml0ZSBhY2Nlc3MiKTsKLQkJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKQorCQkJCXJldHVybjsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pb2N0bC5jIGIvZnMvZXh0My9pb2N0bC5jCmluZGV4IDg4OTc0ODEuLmZjMDgwZGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW9jdGwuYworKysgYi9mcy9leHQzL2lvY3RsLmMKQEAgLTI3Niw3ICsyNzYsMjkgQEAKIAkJbW50X2Ryb3Bfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCXJldHVybiBlcnI7CiAJfQorCWNhc2UgRklUUklNOiB7CiAKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQlzdHJ1Y3QgZnN0cmltX3JhbmdlIHJhbmdlOworCQlpbnQgcmV0ID0gMDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmFuZ2UsIChzdHJ1Y3QgZnN0cmltX3JhbmdlICopYXJnLAorCQkJCSAgIHNpemVvZihyYW5nZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gZXh0M190cmltX2ZzKHNiLCAmcmFuZ2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGZzdHJpbV9yYW5nZSAqKWFyZywgJnJhbmdlLAorCQkJCSBzaXplb2YocmFuZ2UpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PVFRZOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IGJjZTlkY2UuLmIyN2JhNzEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTg1OCw2ICs4NTgsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKnJldCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgYmxvY2ssIGI7CisJY29uc3QgdTggKm5hbWUgPSBlbnRyeS0+bmFtZTsKIAlpbnQgcmFfbWF4ID0gMDsJCS8qIE51bWJlciBvZiBiaCdzIGluIHRoZSByZWFkYWhlYWQKIAkJCQkgICBidWZmZXIsIGJoX3VzZVtdICovCiAJaW50IHJhX3B0ciA9IDA7CQkvKiBDdXJyZW50IGluZGV4IGludG8gcmVhZGFoZWFkCkBAIC04NzEsNiArODcyLDE2IEBACiAJbmFtZWxlbiA9IGVudHJ5LT5sZW47CiAJaWYgKG5hbWVsZW4gPiBFWFQzX05BTUVfTEVOKQogCQlyZXR1cm4gTlVMTDsKKwlpZiAoKG5hbWVsZW4gPD0gMikgJiYgKG5hbWVbMF0gPT0gJy4nKSAmJgorCSAgICAobmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAwKSkgeworCQkvKgorCQkgKiAiLiIgb3IgIi4uIiB3aWxsIG9ubHkgYmUgaW4gdGhlIGZpcnN0IGJsb2NrCisJCSAqIE5GUyBtYXkgbG9vayB1cCAiLi4iOyAiLiIgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIFZGUworCQkgKi8KKwkJYmxvY2sgPSBzdGFydCA9IDA7CisJCW5ibG9ja3MgPSAxOworCQlnb3RvIHJlc3RhcnQ7CisJfQogCWlmIChpc19keChkaXIpKSB7CiAJCWJoID0gZXh0M19keF9maW5kX2VudHJ5KGRpciwgZW50cnksIHJlc19kaXIsICZlcnIpOwogCQkvKgpAQCAtOTYxLDU1ICs5NzIsMzUgQEAKIAkJCXN0cnVjdCBxc3RyICplbnRyeSwgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKipyZXNfZGlyLAogCQkJaW50ICplcnIpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlzdHJ1Y3QgZHhfaGFzaF9pbmZvCWhpbmZvOwotCXUzMiBoYXNoOwogCXN0cnVjdCBkeF9mcmFtZSBmcmFtZXNbMl0sICpmcmFtZTsKLQlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUsICp0b3A7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrOwogCWludCByZXR2YWw7Ci0JaW50IG5hbWVsZW4gPSBlbnRyeS0+bGVuOwotCWNvbnN0IHU4ICpuYW1lID0gZW50cnktPm5hbWU7CiAKLQlzYiA9IGRpci0+aV9zYjsKLQkvKiBORlMgbWF5IGxvb2sgdXAgIi4uIiAtIGxvb2sgYXQgZHhfcm9vdCBkaXJlY3RvcnkgYmxvY2sgKi8KLQlpZiAobmFtZWxlbiA+IDIgfHwgbmFtZVswXSAhPSAnLid8fCAobmFtZWxlbiA9PSAyICYmIG5hbWVbMV0gIT0gJy4nKSkgewotCQlpZiAoIShmcmFtZSA9IGR4X3Byb2JlKGVudHJ5LCBkaXIsICZoaW5mbywgZnJhbWVzLCBlcnIpKSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCWZyYW1lID0gZnJhbWVzOwotCQlmcmFtZS0+YmggPSBOVUxMOwkJCS8qIGZvciBkeF9yZWxlYXNlKCkgKi8KLQkJZnJhbWUtPmF0ID0gKHN0cnVjdCBkeF9lbnRyeSAqKWZyYW1lczsJLyogaGFjayBmb3IgemVybyBlbnRyeSovCi0JCWR4X3NldF9ibG9jayhmcmFtZS0+YXQsIDApOwkJLyogZHhfcm9vdCBibG9jayBpcyAwICovCi0JfQotCWhhc2ggPSBoaW5mby5oYXNoOworCWlmICghKGZyYW1lID0gZHhfcHJvYmUoZW50cnksIGRpciwgJmhpbmZvLCBmcmFtZXMsIGVycikpKQorCQlyZXR1cm4gTlVMTDsKIAlkbyB7CiAJCWJsb2NrID0gZHhfZ2V0X2Jsb2NrKGZyYW1lLT5hdCk7CiAJCWlmICghKGJoID0gZXh0M19icmVhZCAoTlVMTCxkaXIsIGJsb2NrLCAwLCBlcnIpKSkKIAkJCWdvdG8gZXJyb3V0OwotCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOwotCQl0b3AgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsgc2ItPnNfYmxvY2tzaXplIC0KLQkJCQkgICAgICAgRVhUM19ESVJfUkVDX0xFTigwKSk7Ci0JCWZvciAoOyBkZSA8IHRvcDsgZGUgPSBleHQzX25leHRfZW50cnkoZGUpKSB7Ci0JCQlpbnQgb2ZmID0gKGJsb2NrIDw8IEVYVDNfQkxPQ0tfU0laRV9CSVRTKHNiKSkKLQkJCQkgICsgKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSk7CiAKLQkJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoX19mdW5jX18sIGRpciwgZGUsIGJoLCBvZmYpKSB7Ci0JCQkJYnJlbHNlKGJoKTsKLQkJCQkqZXJyID0gRVJSX0JBRF9EWF9ESVI7Ci0JCQkJZ290byBlcnJvdXQ7Ci0JCQl9Ci0KLQkJCWlmIChleHQzX21hdGNoKG5hbWVsZW4sIG5hbWUsIGRlKSkgewotCQkJCSpyZXNfZGlyID0gZGU7Ci0JCQkJZHhfcmVsZWFzZShmcmFtZXMpOwotCQkJCXJldHVybiBiaDsKLQkJCX0KKwkJcmV0dmFsID0gc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIGVudHJ5LAorCQkJCQkgYmxvY2sgPDwgRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpLAorCQkJCQkgcmVzX2Rpcik7CisJCWlmIChyZXR2YWwgPT0gMSkgeworCQkJZHhfcmVsZWFzZShmcmFtZXMpOworCQkJcmV0dXJuIGJoOwogCQl9Ci0JCWJyZWxzZSAoYmgpOworCQlicmVsc2UoYmgpOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkqZXJyID0gRVJSX0JBRF9EWF9ESVI7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCiAJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgY29udGludWUgdG8gc2VhcmNoICovCi0JCXJldHZhbCA9IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhkaXIsIGhhc2gsIGZyYW1lLAorCQlyZXR2YWwgPSBleHQzX2h0cmVlX25leHRfYmxvY2soZGlyLCBoaW5mby5oYXNoLCBmcmFtZSwKIAkJCQkJICAgICAgIGZyYW1lcywgTlVMTCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLApAQCAtMTA0Nyw3ICsxMDM4LDcgQEAKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CiAJCWlub2RlID0gZXh0M19pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQkJaWYgKHVubGlrZWx5KElTX0VSUihpbm9kZSkpKSB7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVTVEFMRSkgewogCQkJCWV4dDNfZXJyb3IoZGlyLT5pX3NiLCBfX2Z1bmNfXywKIAkJCQkJCSJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICVsdSIsCkBAIC0xNjA3LDcgKzE1OTgsOSBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0KLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAl9CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsIGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmZXJyKTsKIAlpZiAoIWRlKQpAQCAtMTY0NCw4ICsxNjM3LDEzIEBACiAJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZGVsZXRlX2VudHJ5IiwgZGlyLCBkZSwgYmgsIGkpKQogCQkJcmV0dXJuIC1FSU87CiAJCWlmIChkZSA9PSBkZV9kZWwpICB7CisJCQlpbnQgZXJyOworCiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisKIAkJCWlmIChwZGUpCiAJCQkJcGRlLT5yZWNfbGVuID0gZXh0M19yZWNfbGVuX3RvX2Rpc2soCiAJCQkJCWV4dDNfcmVjX2xlbl9mcm9tX2Rpc2socGRlLT5yZWNfbGVuKSArCkBAIC0xNjU0LDcgKzE2NTIsMTIgQEAKIAkJCQlkZS0+aW5vZGUgPSAwOwogCQkJZGlyLT5pX3ZlcnNpb24rKzsKIAkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlpZiAoZXJyKSB7Citqb3VybmFsX2Vycm9yOgorCQkJCWV4dDNfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSArPSBleHQzX3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuKTsKQEAgLTE3NjIsNyArMTc2NSw3IEBACiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkaXJfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrID0gTlVMTDsKIAlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOwogCWludCBlcnIsIHJldHJpZXMgPSAwOwogCkBAIC0xNzkwLDE1ICsxNzkzLDE0IEBACiAJaW5vZGUtPmlfZm9wID0gJmV4dDNfZGlyX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfc2l6ZSA9IEVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJZGlyX2Jsb2NrID0gZXh0M19icmVhZCAoaGFuZGxlLCBpbm9kZSwgMCwgMSwgJmVycik7Ci0JaWYgKCFkaXJfYmxvY2spIHsKLQkJZHJvcF9ubGluayhpbm9kZSk7IC8qIGlzIHRoaXMgbmxpbmsgPT0gMD8gKi8KLQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJaXB1dCAoaW5vZGUpOwotCQlnb3RvIG91dF9zdG9wOwotCX0KKwlpZiAoIWRpcl9ibG9jaykKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkaXJfYmxvY2stPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOwogCWRlLT5uYW1lX2xlbiA9IDE7CkBAIC0xODE0LDExICsxODE2LDE2IEBACiAJZXh0M19zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKIAlpbm9kZS0+aV9ubGluayA9IDI7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyX2Jsb2NrKTsKLQlicmVsc2UgKGRpcl9ibG9jayk7Ci0JZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCWVyciA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKKwllcnIgPSBleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCiAJaWYgKGVycikgeworb3V0X2NsZWFyX2lub2RlOgogCQlpbm9kZS0+aV9ubGluayA9IDA7CiAJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xODI3LDEwICsxODM0LDE0IEBACiAJfQogCWluY19ubGluayhkaXIpOwogCWV4dDNfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKLQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCWVyciA9IGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogb3V0X3N0b3A6CisJYnJlbHNlKGRpcl9ibG9jayk7CiAJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7CkBAIC0yMzUzLDcgKzIzNjQsOSBAQAogCQkJZ290byBlbmRfcmVuYW1lOwogCX0gZWxzZSB7CiAJCUJVRkZFUl9UUkFDRShuZXdfYmgsICJnZXQgd3JpdGUgYWNjZXNzIik7Ci0JCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgbmV3X2JoKTsKKwkJcmV0dmFsID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBuZXdfYmgpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQluZXdfZGUtPmlub2RlID0gY3B1X3RvX2xlMzIob2xkX2lub2RlLT5pX2lubyk7CiAJCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKG5ld19kaXItPmlfc2IsCiAJCQkJCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpCkBAIC0yMzYyLDcgKzIzNzUsOSBAQAogCQluZXdfZGlyLT5pX2N0aW1lID0gbmV3X2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOwogCQlCVUZGRVJfVFJBQ0UobmV3X2JoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJcmV0dmFsID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJYnJlbHNlKG5ld19iaCk7CiAJCW5ld19iaCA9IE5VTEw7CiAJfQpAQCAtMjQxMSwxMCArMjQyNiwxNyBAQAogCWV4dDNfdXBkYXRlX2R4X2ZsYWcob2xkX2Rpcik7CiAJaWYgKGRpcl9iaCkgewogCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9iaCk7CisJCXJldHZhbCA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2JoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJUEFSRU5UX0lOTyhkaXJfYmgtPmJfZGF0YSkgPSBjcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CiAJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlyZXR2YWwgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlpZiAocmV0dmFsKSB7Citqb3VybmFsX2Vycm9yOgorCQkJZXh0M19zdGRfZXJyb3IobmV3X2Rpci0+aV9zYiwgcmV0dmFsKTsKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwkJfQogCQlkcm9wX25saW5rKG9sZF9kaXIpOwogCQlpZiAobmV3X2lub2RlKSB7CiAJCQlkcm9wX25saW5rKG5ld19pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCBlNzQ2ZDMwLi4xMDhiMTQyIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTI0OSw3ICsyNDksMTEgQEAKIAkJbWVtY3B5KGdkYi0+Yl9kYXRhLCBzYmktPnNfZ3JvdXBfZGVzY1tpXS0+Yl9kYXRhLCBnZGItPmJfc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZ2RiKTsKIAkJdW5sb2NrX2J1ZmZlcihnZGIpOwotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlpZiAoZXJyKSB7CisJCQlicmVsc2UoZ2RiKTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQogCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjY5LDcgKzI3MywxMSBAQAogCQkJZXJyID0gUFRSX0VSUihnZGIpOwogCQkJZ290byBleGl0X2JoOwogCQl9Ci0JCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWlmIChlcnIpIHsKKwkJCWJyZWxzZShnZGIpOworCQkJZ290byBleGl0X2JoOworCQl9CiAJCWV4dDNfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CkBAIC0yOTUsNyArMzAzLDExIEBACiAJCQllcnIgPSBQVFJfRVJSKGl0KTsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpdCk7CisJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGl0KTsKKwkJaWYgKGVycikgeworCQkJYnJlbHNlKGl0KTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQogCQlicmVsc2UoaXQpOwogCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAl9CkBAIC0zMDYsNyArMzE4LDkgQEAKIAogCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpLAogCQkJYmgtPmJfZGF0YSk7Ci0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfYmg7CiAJYnJlbHNlKGJoKTsKIAogCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KQEAgLTMxOSw3ICszMzMsNyBAQAogCiAJbWFya19iaXRtYXBfZW5kKEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYiksIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCiAJCQliaC0+Yl9kYXRhKTsKLQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwogZXhpdF9iaDoKIAlicmVsc2UoYmgpOwogCkBAIC01MDMsMTIgKzUxNywxOSBAQAogCSAqIHJlc2VydmVkIGlub2RlLCBhbmQgd2lsbCBiZWNvbWUgR0RUIGJsb2NrcyAocHJpbWFyeSBhbmQgYmFja3VwKS4KIAkgKi8KIAlkYXRhW2dkYl9udW0gJSBFWFQzX0FERFJfUEVSX0JMT0NLKHNiKV0gPSAwOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpbmQpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpbmQpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9ncm91cF9kZXNjOwogCWJyZWxzZShkaW5kKTsKKwlkaW5kID0gTlVMTDsKIAlpbm9kZS0+aV9ibG9ja3MgLT0gKGdkYmFja3VwcyArIDEpICogc2ItPnNfYmxvY2tzaXplID4+IDk7Ci0JZXh0M19tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZ3JvdXBfZGVzYzsKIAltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsICpwcmltYXJ5KTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAqcHJpbWFyeSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2dyb3VwX2Rlc2M7CiAKIAlvX2dyb3VwX2Rlc2MgPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjOwogCW1lbWNweShuX2dyb3VwX2Rlc2MsIG9fZ3JvdXBfZGVzYywKQEAgLTUxOSwxMCArNTQwLDE0IEBACiAJa2ZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfaW5vZGU7CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9ncm91cF9kZXNjOgorCWtmcmVlKG5fZ3JvdXBfZGVzYyk7CiBleGl0X2lub2RlOgogCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgaWxvYy5iaCk7CiAJYnJlbHNlKGlsb2MuYmgpOwpAQCAtNzA2LDE2ICs3MzEsMjAgQEAKIAkJfQogCQlleHQzX2RlYnVnKCJ1cGRhdGUgbWV0YWRhdGEgYmFja3VwICUjMDRseFxuIiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcpYmgtPmJfYmxvY2tucik7Ci0JCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKQorCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkgeworCQkJYnJlbHNlKGJoKTsKIAkJCWJyZWFrOworCQl9CiAJCWxvY2tfYnVmZmVyKGJoKTsKIAkJbWVtY3B5KGJoLT5iX2RhdGEsIGRhdGEsIHNpemUpOwogCQlpZiAocmVzdCkKIAkJCW1lbXNldChiaC0+Yl9kYXRhICsgc2l6ZSwgMCwgcmVzdCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CiAJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKIAl9CiAJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKQEAgLTkyMiw3ICs5NTEsOSBAQAogCS8qIFVwZGF0ZSB0aGUgZ2xvYmFsIGZzIHNpemUgZmllbGRzICovCiAJc2JpLT5zX2dyb3Vwc19jb3VudCsrOwogCi0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2pvdXJuYWw7CiAKIAkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcwogCSAqIGFjdGl2ZS4gKi8KQEAgLTkzNCw3ICs5NjUsNyBAQAogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCi0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CiAKIGV4aXRfam91cm5hbDoKIAltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CkBAIC0xMDY0LDggKzEwOTUsMTQgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAJZXMtPnNfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIob19ibG9ja3NfY291bnQgKyBhZGQpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKIAltdXRleF91bmxvY2soJkVYVDNfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKKwlpZiAoZXJyKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19mdW5jX18sCisJCQkgICAgICJlcnJvciAlZCBvbiBqb3VybmFsIGRpcnR5IG1ldGFkYXRhIiwgZXJyKTsKKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJZ290byBleGl0X3B1dDsKKwl9CiAJZXh0M19kZWJ1ZygiZnJlZWluZyBibG9ja3MgIkUzRlNCTEsiIHRocm91Z2ggIkUzRlNCTEsiXG4iLAogCQkgICBvX2Jsb2Nrc19jb3VudCwgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCWV4dDNfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCwgJmZyZWVkX2Jsb2Nrcyk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNzdjZTE2MS4uN2FhNzY3ZCAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTQzLDEyICsxNDMsMTYgQEAKIHZvaWQgZXh0M19tc2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqcHJlZml4LAogCQljb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50aygiJXNFWFQzLWZzICglcyk6ICIsIHByZWZpeCwgc2ItPnNfaWQpOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJpbnRrKCIlc0VYVDMtZnMgKCVzKTogJXBWXG4iLCBwcmVmaXgsIHNiLT5zX2lkLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIH0KIApAQCAtMTk1LDE1ICsxOTksMjAgQEAKIAkJCXNiLT5zX2lkKTsKIH0KIAotdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCBleHQzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCQljb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX0NSSVQgIkVYVDMtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sICZ2YWYpOworCiAJdmFfZW5kKGFyZ3MpOwogCiAJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOwpAQCAtMjc0LDE1ICsyODMsMjAgQEAKICAqIGNhc2Ugd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCBwYW5pYyBpbW1lZGlhdGVseS4KICAqLwogCi12b2lkIGV4dDNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCi0JCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDNfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX0NSSVQgIkVYVDMtZnMgKCVzKTogZXJyb3I6ICVzOiAiLCBzYi0+c19pZCwgZnVuY3Rpb24pOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyAoJXMpOiBlcnJvcjogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKQEAgLTMwMCwxNiArMzE0LDIwIEBACiAJCWpvdXJuYWxfYWJvcnQoRVhUM19TQihzYiktPnNfam91cm5hbCwgLUVJTyk7CiB9CiAKLXZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnMgKCVzKTogd2FybmluZzogJXM6ICIsCi0JICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzICglcyk6IHdhcm5pbmc6ICVzOiAlcFZcbiIsCisJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKQEAgLTM0Niw3ICszNjQsNyBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0JYmRldiA9IG9wZW5fYnlfZGV2bnVtKGRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJYmRldiA9IGJsa2Rldl9nZXRfYnlfZGV2KGRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURXxGTU9ERV9FWENMLCBzYik7CiAJaWYgKElTX0VSUihiZGV2KSkKIAkJZ290byBmYWlsOwogCXJldHVybiBiZGV2OwpAQCAtMzYzLDggKzM4MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0M19ibGtkZXZfcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7Ci0JYmRfcmVsZWFzZShiZGV2KTsKLQlyZXR1cm4gYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwlyZXR1cm4gYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wpOwogfQogCiBzdGF0aWMgaW50IGV4dDNfYmxrZGV2X3JlbW92ZShzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCkBAIC0xODQ4LDEzICsxODY1LDE1IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotCWlmIChnZW5lcmljX2NoZWNrX2FkZHJlc3NhYmxlKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAotCQkJCSAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpKSB7CisJZXJyID0gZ2VuZXJpY19jaGVja19hZGRyZXNzYWJsZShzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkJbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSk7CisJaWYgKGVycikgewogCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCiAJCQkiZXJyb3I6IGZpbGVzeXN0ZW0gaXMgdG9vIGxhcmdlIHRvIG1vdW50IHNhZmVseSIpOwogCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA8IDgpCiAJCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCiAJCQkJImVycm9yOiBDT05GSUdfTEJEQUYgbm90IGVuYWJsZWQiKTsKKwkJcmV0ID0gZXJyOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKQEAgLTIxNDIsMTMgKzIxNjEsNiBAQAogCWlmIChiZGV2ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGJkX2NsYWltKGJkZXYsIHNiKSkgewotCQlleHQzX21zZyhzYiwgS0VSTl9FUlIsCi0JCQkiZXJyb3I6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZSIpOwotCQlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJaGJsb2NrID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoYmRldik7CiAJaWYgKGJsb2Nrc2l6ZSA8IGhibG9jaykgewpAQCAtMjI5Nyw3ICsyMzA5LDcgQEAKIAlFWFQzX1NCKHNiKS0+c19qb3VybmFsID0gam91cm5hbDsKIAlleHQzX2NsZWFyX2pvdXJuYWxfZXJyKHNiLCBlcyk7CiAKLQlpZiAoam91cm5hbF9kZXZudW0gJiYKKwlpZiAoIXJlYWxseV9yZWFkX29ubHkgJiYgam91cm5hbF9kZXZudW0gJiYKIAkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7CiAJCWVzLT5zX2pvdXJuYWxfZGV2ID0gY3B1X3RvX2xlMzIoam91cm5hbF9kZXZudW0pOwogCmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyLmMgYi9mcy9leHQzL3hhdHRyLmMKaW5kZXggZTY5ZGM2ZC4uMzJlNmNjMiAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0ci5jCisrKyBiL2ZzL2V4dDMveGF0dHIuYwpAQCAtOTI1LDcgKzkyNSw3IEBACiAvKgogICogZXh0M194YXR0cl9zZXRfaGFuZGxlKCkKICAqCi0gKiBDcmVhdGUsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbm9kZS4gQnVmZmVyCisgKiBDcmVhdGUsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbm9kZS4gIFZhbHVlCiAgKiBpcyBOVUxMIHRvIHJlbW92ZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZCBub24tTlVMTCB0bwogICogZWl0aGVyIHJlcGxhY2UgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBvciBjcmVhdGUgYSBuZXcgZXh0ZW5kZWQKICAqIGF0dHJpYnV0ZS4gVGhlIGZsYWdzIFhBVFRSX1JFUExBQ0UgYW5kIFhBVFRSX0NSRUFURQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggMTRjM2FmMi4uYWRmOTZiOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC01OTIsNyArNTkyLDggQEAKIAkgKiBBY2NvdW50IGZvciB0aGUgYWxsb2NhdGVkIG1ldGEgYmxvY2tzLiAgV2Ugd2lsbCBuZXZlcgogCSAqIGZhaWwgRURRVU9UIGZvciBtZXRkYXRhLCBidXQgd2UgZG8gYWNjb3VudCBmb3IgaXQuCiAJICovCi0JaWYgKCEoKmVycnApICYmIEVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgeworCWlmICghKCplcnJwKSAmJgorCSAgICBleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfREVMQUxMT0NfUkVTRVJWRUQpKSB7CiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gYXIubGVuOwogCQlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jCmluZGV4IGVjZTc2ZmIuLjE2NGM1NjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZGlyLmMKKysrIGIvZnMvZXh0NC9kaXIuYwpAQCAtNjAsOSArNjAsMTMgQEAKIAlyZXR1cm4gKGV4dDRfZmlsZXR5cGVfdGFibGVbZmlsZXR5cGVdKTsKIH0KIAotCisvKgorICogUmV0dXJuIDAgaWYgdGhlIGRpcmVjdG9yeSBlbnRyeSBpcyBPSywgYW5kIDEgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCisgKgorICogTm90ZTogdGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBleHQyIGFuZCBleHQzIGhpc3RvcmljYWxseSByZXR1cm5lZC4uLgorICovCiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCi0JCQkgICBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQpAQCAtNzEsMjYgKzc1LDM3IEBACiAJY29uc3QgaW50IHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuLAogCQkJCQkJZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAKLQlpZiAocmxlbiA8IEVYVDRfRElSX1JFQ19MRU4oMSkpCisJaWYgKHVubGlrZWx5KHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKDEpKSkKIAkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOwotCWVsc2UgaWYgKHJsZW4gJSA0ICE9IDApCisJZWxzZSBpZiAodW5saWtlbHkocmxlbiAlIDQgIT0gMCkpCiAJCWVycm9yX21zZyA9ICJyZWNfbGVuICUgNCAhPSAwIjsKLQllbHNlIGlmIChybGVuIDwgRVhUNF9ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKQorCWVsc2UgaWYgKHVubGlrZWx5KHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpKQogCQllcnJvcl9tc2cgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKLQllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCWVsc2UgaWYgKHVubGlrZWx5KCgoY2hhciAqKSBkZSAtIGJoLT5iX2RhdGEpICsgcmxlbiA+CisJCQkgIGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQogCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOwotCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgotCQkJbGUzMl90b19jcHUoRVhUNF9TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJZWxzZSBpZiAodW5saWtlbHkobGUzMl90b19jcHUoZGUtPmlub2RlKSA+CisJCQlsZTMyX3RvX2NwdShFWFQ0X1NCKGRpci0+aV9zYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSkpCiAJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKKwllbHNlCisJCXJldHVybiAwOwogCi0JaWYgKGVycm9yX21zZyAhPSBOVUxMKQotCQlleHQ0X2Vycm9yX2lub2RlKGRpciwgZnVuY3Rpb24sIGxpbmUsIGJoLT5iX2Jsb2NrbnIsCi0JCQkiYmFkIGVudHJ5IGluIGRpcmVjdG9yeTogJXMgLSAiCi0JCQkib2Zmc2V0PSV1KCV1KSwgaW5vZGU9JXUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKLQkJCWVycm9yX21zZywgKHVuc2lnbmVkKSAob2Zmc2V0JWJoLT5iX3NpemUpLCBvZmZzZXQsCi0JCQlsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAotCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKLQlyZXR1cm4gZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMDsKKwlpZiAoZmlscCkKKwkJZXh0NF9lcnJvcl9maWxlKGZpbHAsIGZ1bmN0aW9uLCBsaW5lLCBiaCA/IGJoLT5iX2Jsb2NrbnIgOiAwLAorCQkJCSJiYWQgZW50cnkgaW4gZGlyZWN0b3J5OiAlcyAtIG9mZnNldD0ldSgldSksICIKKwkJCQkiaW5vZGU9JXUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKKwkJCQllcnJvcl9tc2csICh1bnNpZ25lZCkgKG9mZnNldCViaC0+Yl9zaXplKSwKKwkJCQlvZmZzZXQsIGxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCisJCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKKwllbHNlCisJCWV4dDRfZXJyb3JfaW5vZGUoZGlyLCBmdW5jdGlvbiwgbGluZSwgYmggPyBiaC0+Yl9ibG9ja25yIDogMCwKKwkJCQkiYmFkIGVudHJ5IGluIGRpcmVjdG9yeTogJXMgLSBvZmZzZXQ9JXUoJXUpLCAiCisJCQkJImlub2RlPSV1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCQkJZXJyb3JfbXNnLCAodW5zaWduZWQpIChvZmZzZXQlYmgtPmJfc2l6ZSksCisJCQkJb2Zmc2V0LCBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAorCQkJCXJsZW4sIGRlLT5uYW1lX2xlbik7CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0xNTIsOCArMTY3LDkgQEAKIAkJICovCiAJCWlmICghYmgpIHsKIAkJCWlmICghZGlyX2hhc19lcnJvcikgewotCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJkaXJlY3RvcnkgIgotCQkJCQkgICAiY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlTHUiLAorCQkJCUVYVDRfRVJST1JfRklMRShmaWxwLCAwLAorCQkJCQkJImRpcmVjdG9yeSBjb250YWlucyBhICIKKwkJCQkJCSJob2xlIGF0IG9mZnNldCAlbGx1IiwKIAkJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZmlscC0+Zl9wb3MpOwogCQkJCWRpcl9oYXNfZXJyb3IgPSAxOwogCQkJfQpAQCAtMTk0LDggKzIxMCw4IEBACiAJCXdoaWxlICghZXJyb3IgJiYgZmlscC0+Zl9wb3MgPCBpbm9kZS0+aV9zaXplCiAJCSAgICAgICAmJiBvZmZzZXQgPCBzYi0+c19ibG9ja3NpemUpIHsKIAkJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKLQkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoaW5vZGUsIGRlLAotCQkJCQkJICBiaCwgb2Zmc2V0KSkgeworCQkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBmaWxwLCBkZSwKKwkJCQkJCSBiaCwgb2Zmc2V0KSkgewogCQkJCS8qCiAJCQkJICogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZSBuZXh0IGJsb2NrCiAJCQkJICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IDk0Y2UzZDcuLjFkZTY1ZjUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC02Miw4ICs2Miw4IEBACiAjZGVmaW5lIEVYVDRfRVJST1JfSU5PREVfQkxPQ0soaW5vZGUsIGJsb2NrLCBmbXQsIGEuLi4pCQkJXAogCWV4dDRfZXJyb3JfaW5vZGUoKGlub2RlKSwgX19mdW5jX18sIF9fTElORV9fLCAoYmxvY2spLCAoZm10KSwgIyMgYSkKIAotI2RlZmluZSBFWFQ0X0VSUk9SX0ZJTEUoZmlsZSwgZm10LCBhLi4uKQlcCi0JZXh0NF9lcnJvcl9maWxlKF9fZnVuY19fLCBfX0xJTkVfXywgKGZpbGUpLCAoZm10KSwgIyMgYSkKKyNkZWZpbmUgRVhUNF9FUlJPUl9GSUxFKGZpbGUsIGJsb2NrLCBmbXQsIGEuLi4pCQkJCVwKKwlleHQ0X2Vycm9yX2ZpbGUoKGZpbGUpLCBfX2Z1bmNfXywgX19MSU5FX18sIChibG9jayksIChmbXQpLCAjIyBhKQogCiAvKiBkYXRhIHR5cGUgZm9yIGJsb2NrIG9mZnNldCBvZiBibG9jayBncm91cCAqLwogdHlwZWRlZiBpbnQgZXh0NF9ncnBibGtfdDsKQEAgLTU2MSwyMyArNTYxLDcgQEAKICNkZWZpbmUgRVhUNF9JT0MzMl9TRVRWRVJTSU9OX09MRAlGU19JT0MzMl9TRVRWRVJTSU9OCiAjZW5kaWYKIAotCi0vKgotICogIE1vdW50IG9wdGlvbnMKLSAqLwotc3RydWN0IGV4dDRfbW91bnRfb3B0aW9ucyB7Ci0JdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKLQl1aWRfdCBzX3Jlc3VpZDsKLQlnaWRfdCBzX3Jlc2dpZDsKLQl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOwotCXUzMiBzX21pbl9iYXRjaF90aW1lLCBzX21heF9iYXRjaF90aW1lOwotI2lmZGVmIENPTkZJR19RVU9UQQotCWludCBzX2pxdW90YV9mbXQ7Ci0JY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwotI2VuZGlmCi19OwotCi0vKiBNYXggcGh5c2ljYWwgYmxvY2sgd2UgY2FuIGFkZHJlcyB3L28gZXh0ZW50cyAqLworLyogTWF4IHBoeXNpY2FsIGJsb2NrIHdlIGNhbiBhZGRyZXNzIHcvbyBleHRlbnRzICovCiAjZGVmaW5lIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUwkweEZGRkZGRkZGCiAKIC8qCkBAIC03MDksNiArNjkzLDggQEAKIAlpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgRVhUNF9JKGlub2RlKSwgeHRpbWUgIyMgX2V4dHJhKSkgICAgIFwKIAkJZXh0NF9kZWNvZGVfZXh0cmFfdGltZSgmKGlub2RlKS0+eHRpbWUsCQkJICAgICAgIFwKIAkJCQkgICAgICAgcmF3X2lub2RlLT54dGltZSAjIyBfZXh0cmEpOwkgICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgICBcCisJCShpbm9kZSktPnh0aW1lLnR2X25zZWMgPSAwOwkJCQkgICAgICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBFWFQ0X0VJTk9ERV9HRVRfWFRJTUUoeHRpbWUsIGVpbm9kZSwgcmF3X2lub2RlKQkJCSAgICAgICBcCkBAIC03MTksNiArNzA1LDggQEAKIAlpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgZWlub2RlLCB4dGltZSAjIyBfZXh0cmEpKQkgICAgICAgXAogCQlleHQ0X2RlY29kZV9leHRyYV90aW1lKCYoZWlub2RlKS0+eHRpbWUsCQkgICAgICAgXAogCQkJCSAgICAgICByYXdfaW5vZGUtPnh0aW1lICMjIF9leHRyYSk7CSAgICAgICBcCisJZWxzZQkJCQkJCQkJICAgICAgIFwKKwkJKGVpbm9kZSktPnh0aW1lLnR2X25zZWMgPSAwOwkJCQkgICAgICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBpX2Rpc2tfdmVyc2lvbiBvc2QxLmxpbnV4MS5sX2lfdmVyc2lvbgpAQCAtNzUwLDEyICs3MzgsMTMgQEAKIAogLyoKICAqIHN0b3JhZ2UgZm9yIGNhY2hlZCBleHRlbnQKKyAqIElmIGVjX2xlbiA9PSAwLCB0aGVuIHRoZSBjYWNoZSBpcyBpbnZhbGlkLgorICogSWYgZWNfc3RhcnQgPT0gMCwgdGhlbiB0aGUgY2FjaGUgcmVwcmVzZW50cyBhIGdhcCAobnVsbCBtYXBwaW5nKQogICovCiBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgewogCWV4dDRfZnNibGtfdAllY19zdGFydDsKIAlleHQ0X2xibGtfdAllY19ibG9jazsKIAlfX3UzMgkJZWNfbGVuOyAvKiBtdXN0IGJlIDMyYml0IHRvIHJldHVybiBob2xlcyAqLwotCV9fdTMyCQllY190eXBlOwogfTsKIAogLyoKQEAgLTc3NCwxMCArNzYzLDEyIEBACiAJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCiAJICovCiAJZXh0NF9ncm91cF90CWlfYmxvY2tfZ3JvdXA7CisJZXh0NF9sYmxrX3QJaV9kaXJfc3RhcnRfbG9va3VwOworI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiAJdW5zaWduZWQgbG9uZwlpX3N0YXRlX2ZsYWdzOwkJLyogRHluYW1pYyBzdGF0ZSBmbGFncyAqLworI2VuZGlmCiAJdW5zaWduZWQgbG9uZwlpX2ZsYWdzOwogCi0JZXh0NF9sYmxrX3QJCWlfZGlyX3N0YXJ0X2xvb2t1cDsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCS8qCiAJICogRXh0ZW5kZWQgYXR0cmlidXRlcyBjYW4gYmUgcmVhZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBtYWluIGZpbGUKQEAgLTgyMCw3ICs4MTEsNyBAQAogCSAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUgaV9kYXRhX3NlbTsKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwotCXN0cnVjdCBqYmQyX2lub2RlIGppbm9kZTsKKwlzdHJ1Y3QgamJkMl9pbm9kZSAqamlub2RlOwogCiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKIAkvKgpAQCAtODQwLDE0ICs4MzEsMTIgQEAKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7Ci0JdW5zaWduZWQgc2hvcnQgaV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnOwotCXNlY3Rvcl90IGlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jazsKKwlleHQ0X2xibGtfdCBpX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2s7CiAJaW50IGlfZGFfbWV0YWRhdGFfY2FsY19sZW47CiAKIAkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCiAJX191MTYgaV9leHRyYV9pc2l6ZTsKIAotCXNwaW5sb2NrX3QgaV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrOwogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIHF1b3RhIHNwYWNlIHJlc2VydmF0aW9uLCBtYW5hZ2VkIGludGVybmFsbHkgYnkgcXVvdGEgY29kZSAqLwogCXFzaXplX3QgaV9yZXNlcnZlZF9xdW90YTsKQEAgLTg1Niw5ICs4NDUsMTEgQEAKIAkvKiBjb21wbGV0ZWQgSU9zIHRoYXQgbWlnaHQgbmVlZCB1bndyaXR0ZW4gZXh0ZW50cyBoYW5kbGluZyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaV9jb21wbGV0ZWRfaW9fbGlzdDsKIAlzcGlubG9ja190IGlfY29tcGxldGVkX2lvX2xvY2s7CisJYXRvbWljX3QgaV9pb2VuZF9jb3VudDsJLyogTnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvX2VuZCBzdHJ1Y3RzICovCiAJLyogY3VycmVudCBpb19lbmQgc3RydWN0dXJlIGZvciBhc3luYyBESU8gd3JpdGUqLwogCWV4dDRfaW9fZW5kX3QgKmN1cl9haW9fZGlvOwotCWF0b21pY190IGlfaW9lbmRfY291bnQ7CS8qIE51bWJlciBvZiBvdXRzdGFuZGluZyBpb19lbmQgc3RydWN0cyAqLworCisJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7CiAKIAkvKgogCSAqIFRyYW5zYWN0aW9ucyB0aGF0IGNvbnRhaW4gaW5vZGUncyBtZXRhZGF0YSBuZWVkZWQgdG8gY29tcGxldGUKQEAgLTkxNywxMSArOTA4LDIwIEBACiAjZGVmaW5lIEVYVDRfTU9VTlRfRElTQ0FSRAkJMHg0MDAwMDAwMCAvKiBJc3N1ZSBESVNDQVJEIHJlcXVlc3RzICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSU5JVF9JTk9ERV9UQUJMRQkweDgwMDAwMDAwIC8qIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBpdGFibGVzICovCiAKLSNkZWZpbmUgY2xlYXJfb3B0KG8sIG9wdCkJCW8gJj0gfkVYVDRfTU9VTlRfIyNvcHQKLSNkZWZpbmUgc2V0X29wdChvLCBvcHQpCQkJbyB8PSBFWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIGNsZWFyX29wdChzYiwgb3B0KQkJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0ICY9IFwKKwkJCQkJCX5FWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQoc2IsIG9wdCkJCUVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBcCisJCQkJCQlFWFQ0X01PVU5UXyMjb3B0CiAjZGVmaW5lIHRlc3Rfb3B0KHNiLCBvcHQpCQkoRVhUNF9TQihzYiktPnNfbW91bnRfb3B0ICYgXAogCQkJCQkgRVhUNF9NT1VOVF8jI29wdCkKIAorI2RlZmluZSBjbGVhcl9vcHQyKHNiLCBvcHQpCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQyICY9IFwKKwkJCQkJCX5FWFQ0X01PVU5UMl8jI29wdAorI2RlZmluZSBzZXRfb3B0MihzYiwgb3B0KQkJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0MiB8PSBcCisJCQkJCQlFWFQ0X01PVU5UMl8jI29wdAorI2RlZmluZSB0ZXN0X29wdDIoc2IsIG9wdCkJCShFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQyICYgXAorCQkJCQkgRVhUNF9NT1VOVDJfIyNvcHQpCisKICNkZWZpbmUgZXh0NF9zZXRfYml0CQkJZXh0Ml9zZXRfYml0CiAjZGVmaW5lIGV4dDRfc2V0X2JpdF9hdG9taWMJCWV4dDJfc2V0X2JpdF9hdG9taWMKICNkZWZpbmUgZXh0NF9jbGVhcl9iaXQJCQlleHQyX2NsZWFyX2JpdApAQCAtMTA4Nyw2ICsxMDg3LDcgQEAKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKnNfZ3JvdXBfZGVzYzsKIAl1bnNpZ25lZCBpbnQgc19tb3VudF9vcHQ7CisJdW5zaWduZWQgaW50IHNfbW91bnRfb3B0MjsKIAl1bnNpZ25lZCBpbnQgc19tb3VudF9mbGFnczsKIAlleHQ0X2ZzYmxrX3Qgc19zYl9ibG9jazsKIAl1aWRfdCBzX3Jlc3VpZDsKQEAgLTEyMzcsMjQgKzEyMzgsMzkgQEAKIAlFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFLAkJLyogSW5vZGUgaXMgbWlncmF0aW5nICovCiAJRVhUNF9TVEFURV9ESU9fVU5XUklUVEVOLAkvKiBuZWVkIGNvbnZlcnQgb24gZGlvIGRvbmUqLwogCUVYVDRfU1RBVEVfTkVXRU5UUlksCQkvKiBGaWxlIGp1c3QgYWRkZWQgdG8gZGlyICovCisJRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCwJLyogYmxrcyBhbHJlYWR5IHJlc2VydmVkIGZvciBkZWxhbGxvYyAqLwogfTsKIAotI2RlZmluZSBFWFQ0X0lOT0RFX0JJVF9GTlMobmFtZSwgZmllbGQpCQkJCQlcCisjZGVmaW5lIEVYVDRfSU5PREVfQklUX0ZOUyhuYW1lLCBmaWVsZCwgb2Zmc2V0KQkJCQlcCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X3Rlc3RfaW5vZGVfIyNuYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBiaXQpCVwKIHsJCQkJCQkJCQlcCi0JcmV0dXJuIHRlc3RfYml0KGJpdCwgJkVYVDRfSShpbm9kZSktPmlfIyNmaWVsZCk7CQlcCisJcmV0dXJuIHRlc3RfYml0KGJpdCArIChvZmZzZXQpLCAmRVhUNF9JKGlub2RlKS0+aV8jI2ZpZWxkKTsJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3NldF9pbm9kZV8jI25hbWUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJpdCkJXAogewkJCQkJCQkJCVwKLQlzZXRfYml0KGJpdCwgJkVYVDRfSShpbm9kZSktPmlfIyNmaWVsZCk7CQkJXAorCXNldF9iaXQoYml0ICsgKG9mZnNldCksICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2NsZWFyX2lub2RlXyMjbmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYml0KSBcCiB7CQkJCQkJCQkJXAotCWNsZWFyX2JpdChiaXQsICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJCVwKKwljbGVhcl9iaXQoYml0ICsgKG9mZnNldCksICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJXAogfQogCi1FWFQ0X0lOT0RFX0JJVF9GTlMoZmxhZywgZmxhZ3MpCi1FWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIHN0YXRlX2ZsYWdzKQorRVhUNF9JTk9ERV9CSVRfRk5TKGZsYWcsIGZsYWdzLCAwKQorI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCitFWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIHN0YXRlX2ZsYWdzLCAwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9jbGVhcl9zdGF0ZV9mbGFncyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSkKK3sKKwkoZWkpLT5pX3N0YXRlX2ZsYWdzID0gMDsKK30KKyNlbHNlCitFWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIGZsYWdzLCAzMikKKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfY2xlYXJfc3RhdGVfZmxhZ3Moc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkpCit7CisJLyogV2UgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgY2FsbGVycyB3aWxsIHNldCBpX2ZsYWdzICovCit9CisjZW5kaWYKICNlbHNlCiAvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0NGZzIHN1cGVyYmxvY2ssIG5vdAogICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdApAQCAtMTY0MiwxMCArMTY1OCwxMiBAQAogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCQkgIHN0cnVjdCBmaWxlICosCiAJCQkJICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGludCk7Ci0jZGVmaW5lIGV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgZGUsIGJoLCBvZmZzZXQpIFwKLQlfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChkZSksIChiaCksIChvZmZzZXQpKQorI2RlZmluZSBleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIGZpbHAsIGRlLCBiaCwgb2Zmc2V0KQkJCVwKKwl1bmxpa2VseShfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChmaWxwKSwgXAorCQkJCQkoZGUpLCAoYmgpLCAob2Zmc2V0KSkpCiBleHRlcm4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCwKIAkJCQkgICAgX191MzIgbWlub3JfaGFzaCwKIAkJCQkgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCk7CkBAIC0xNjUzLDYgKzE2NzEsNyBAQAogCiAvKiBmc3luYy5jICovCiBleHRlcm4gaW50IGV4dDRfc3luY19maWxlKHN0cnVjdCBmaWxlICosIGludCk7CitleHRlcm4gaW50IGV4dDRfZmx1c2hfY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqKTsKIAogLyogaGFzaC5jICovCiBleHRlcm4gaW50IGV4dDRmc19kaXJoYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdApAQCAtMTc1Miw4ICsxNzcxLDggQEAKIAkJCSAgICAgZXh0NF9mc2Jsa190LCBjb25zdCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDUsIDYpKSk7CiBleHRlcm4gdm9pZCBleHQ0X2Vycm9yX2ZpbGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworCQkJICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOwogZXh0ZXJuIHZvaWQgX19leHQ0X3N0ZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLAogCQkJICAgICB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gdm9pZCBfX2V4dDRfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaCBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKaW5kZXggMjhjZTcwZi4uMmUyOWFiYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAorKysgYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCkBAIC0xMTksMTAgKzExOSw2IEBACiAgKiBzdHJ1Y3R1cmUgZm9yIGV4dGVybmFsIEFQSQogICovCiAKLSNkZWZpbmUgRVhUNF9FWFRfQ0FDSEVfTk8JMAotI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9HQVAJMQotI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQJMgotCiAvKgogICogdG8gYmUgY2FsbGVkIGJ5IGV4dDRfZXh0X3dhbGtfc3BhY2UoKQogICogbmVnYXRpdmUgcmV0Y29kZSAtIGVycm9yCkBAIC0xOTcsNyArMTkzLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCUVYVDRfSShpbm9kZSktPmlfY2FjaGVkX2V4dGVudC5lY190eXBlID0gRVhUNF9FWFRfQ0FDSEVfTk87CisJRVhUNF9JKGlub2RlKS0+aV9jYWNoZWRfZXh0ZW50LmVjX2xlbiA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoc3RydWN0IGV4dDRfZXh0ZW50ICpleHQpCkBAIC0yNzgsNyArMjc0LDcgQEAKIH0KIAogZXh0ZXJuIGludCBleHQ0X2V4dF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgc2VjdG9yX3QgbGJsb2Nrcyk7CisJCQkJCSBleHQ0X2xibGtfdCBsYmxvY2tzKTsKIGV4dGVybiBpbnQgZXh0NF9leHRlbnRfdHJlZV9pbml0KGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQkgICBpbnQgbnVtLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2piZDIuaCBiL2ZzL2V4dDQvZXh0NF9qYmQyLmgKaW5kZXggYjBiZDc5Mi4uZDhiOTkyZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2piZDIuaAorKysgYi9mcy9leHQ0L2V4dDRfamJkMi5oCkBAIC0yNTMsNyArMjUzLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCi0JCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCQlyZXR1cm4gamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlLCBFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDA1NTRjNDguLmM0MDY4ZjYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xMTcsMTEgKzExNywzMyBAQAogCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OwogCQlkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAKLQkJLyogdHJ5IHRvIHByZWRpY3QgYmxvY2sgcGxhY2VtZW50ICovCisJCS8qCisJCSAqIFRyeSB0byBwcmVkaWN0IGJsb2NrIHBsYWNlbWVudCBhc3N1bWluZyB0aGF0IHdlIGFyZQorCQkgKiBmaWxsaW5nIGluIGEgZmlsZSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUKKwkJICogbm9uLXNwYXJzZSAtLS0gaS5lLiwgaW4gdGhlIGNhc2Ugb2YgbGliYmZkIHdyaXRpbmcKKwkJICogYW4gRUxGIG9iamVjdCBzZWN0aW9ucyBvdXQtb2Ytb3JkZXIgYnV0IGluIGEgd2F5CisJCSAqIHRoZSBldmVudHVhbGx5IHJlc3VsdHMgaW4gYSBjb250aWd1b3VzIG9iamVjdCBvcgorCQkgKiBleGVjdXRhYmxlIGZpbGUsIG9yIHNvbWUgZGF0YWJhc2UgZXh0ZW5kaW5nIGEgdGFibGUKKwkJICogc3BhY2UgZmlsZS4gIEhvd2V2ZXIsIHRoaXMgaXMgYWN0dWFsbHkgc29tZXdoYXQKKwkJICogbm9uLWlkZWFsIGlmIHdlIGFyZSB3cml0aW5nIGEgc3BhcnNlIGZpbGUgc3VjaCBhcworCQkgKiBxZW11IG9yIEtWTSB3cml0aW5nIGEgcmF3IGltYWdlIGZpbGUgdGhhdCBpcyBnb2luZworCQkgKiB0byBzdGF5IGZhaXJseSBzcGFyc2UsIHNpbmNlIGl0IHdpbGwgZW5kIHVwCisJCSAqIGZyYWdtZW50aW5nIHRoZSBmaWxlIHN5c3RlbSdzIGZyZWUgc3BhY2UuICBNYXliZSB3ZQorCQkgKiBzaG91bGQgaGF2ZSBzb21lIGh1ZXJpc3RpY3Mgb3Igc29tZSB3YXkgdG8gYWxsb3cKKwkJICogdXNlcnNwYWNlIHRvIHBhc3MgYSBoaW50IHRvIGZpbGUgc3lzdGVtLAorCQkgKiBlc3BlY2lpYWxseSBpZiB0aGUgbGF0dGVyIGNhc2UgdHVybnMgb3V0IHRvIGJlCisJCSAqIGNvbW1vbi4KKwkJICovCiAJCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7Ci0JCWlmIChleCkKLQkJCXJldHVybiAoZXh0NF9leHRfcGJsb2NrKGV4KSArCi0JCQkJKGJsb2NrIC0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkpOworCQlpZiAoZXgpIHsKKwkJCWV4dDRfZnNibGtfdCBleHRfcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCk7CisJCQlleHQ0X2xibGtfdCBleHRfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCisJCQlpZiAoYmxvY2sgPiBleHRfYmxvY2spCisJCQkJcmV0dXJuIGV4dF9wYmxrICsgKGJsb2NrIC0gZXh0X2Jsb2NrKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gZXh0X3BibGsgLSAoZXh0X2Jsb2NrIC0gYmxvY2spOworCQl9CiAKIAkJLyogaXQgbG9va3MgbGlrZSBpbmRleCBpcyBlbXB0eTsKIAkJICogdHJ5IHRvIGZpbmQgc3RhcnRpbmcgYmxvY2sgZnJvbSBpbmRleCBpdHNlbGYgKi8KQEAgLTI0NCw3ICsyNjYsNyBAQAogICogdG8gYWxsb2NhdGUgQGJsb2NrcwogICogV29yc2UgY2FzZSBpcyBvbmUgYmxvY2sgcGVyIGV4dGVudAogICovCi1pbnQgZXh0NF9leHRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrKQoraW50IGV4dDRfZXh0X2NhbGNfbWV0YWRhdGFfYW1vdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibG9jaykKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJaW50IGlkeHMsIG51bSA9IDA7CkBAIC0xODcyLDEyICsxODk0LDEwIEBACiAJCQljYmV4LmVjX2Jsb2NrID0gc3RhcnQ7CiAJCQljYmV4LmVjX2xlbiA9IGVuZCAtIHN0YXJ0OwogCQkJY2JleC5lY19zdGFydCA9IDA7Ci0JCQljYmV4LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9HQVA7CiAJCX0gZWxzZSB7CiAJCQljYmV4LmVjX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAkJCWNiZXguZWNfbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOwogCQkJY2JleC5lY19zdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7Ci0JCQljYmV4LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQ7CiAJCX0KIAogCQlpZiAodW5saWtlbHkoY2JleC5lY19sZW4gPT0gMCkpIHsKQEAgLTE5MTcsMTMgKzE5MzcsMTIgQEAKIAogc3RhdGljIHZvaWQKIGV4dDRfZXh0X3B1dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKLQkJCV9fdTMyIGxlbiwgZXh0NF9mc2Jsa190IHN0YXJ0LCBpbnQgdHlwZSkKKwkJCV9fdTMyIGxlbiwgZXh0NF9mc2Jsa190IHN0YXJ0KQogewogCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OwogCUJVR19PTihsZW4gPT0gMCk7CiAJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCWNleCA9ICZFWFQ0X0koaW5vZGUpLT5pX2NhY2hlZF9leHRlbnQ7Ci0JY2V4LT5lY190eXBlID0gdHlwZTsKIAljZXgtPmVjX2Jsb2NrID0gYmxvY2s7CiAJY2V4LT5lY19sZW4gPSBsZW47CiAJY2V4LT5lY19zdGFydCA9IHN0YXJ0OwpAQCAtMTk3NiwxNSArMTk5NSwxOCBAQAogCX0KIAogCWV4dF9kZWJ1ZygiIC0+ICV1OiVsdVxuIiwgbGJsb2NrLCBsZW4pOwotCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgbGJsb2NrLCBsZW4sIDAsIEVYVDRfRVhUX0NBQ0hFX0dBUCk7CisJZXh0NF9leHRfcHV0X2luX2NhY2hlKGlub2RlLCBsYmxvY2ssIGxlbiwgMCk7CiB9CiAKKy8qCisgKiBSZXR1cm4gMCBpZiBjYWNoZSBpcyBpbnZhbGlkOyAxIGlmIHRoZSBjYWNoZSBpcyB2YWxpZAorICovCiBzdGF0aWMgaW50CiBleHQ0X2V4dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKIAkJCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgpCiB7CiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlICpjZXg7Ci0JaW50IHJldCA9IEVYVDRfRVhUX0NBQ0hFX05POworCWludCByZXQgPSAwOwogCiAJLyoKIAkgKiBXZSBib3Jyb3cgaV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrIHRvIHByb3RlY3QgaV9jYWNoZWRfZXh0ZW50CkBAIC0xOTkzLDExICsyMDE1LDkgQEAKIAljZXggPSAmRVhUNF9JKGlub2RlKS0+aV9jYWNoZWRfZXh0ZW50OwogCiAJLyogaGFzIGNhY2hlIHZhbGlkIGRhdGE/ICovCi0JaWYgKGNleC0+ZWNfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9OTykKKwlpZiAoY2V4LT5lY19sZW4gPT0gMCkKIAkJZ290byBlcnJvdXQ7CiAKLQlCVUdfT04oY2V4LT5lY190eXBlICE9IEVYVDRfRVhUX0NBQ0hFX0dBUCAmJgotCQkJY2V4LT5lY190eXBlICE9IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CiAJaWYgKGluX3JhbmdlKGJsb2NrLCBjZXgtPmVjX2Jsb2NrLCBjZXgtPmVjX2xlbikpIHsKIAkJZXgtPmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY2V4LT5lY19ibG9jayk7CiAJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgY2V4LT5lY19zdGFydCk7CkBAIC0yMDA1LDcgKzIwMjUsNyBAQAogCQlleHRfZGVidWcoIiV1IGNhY2hlZCBieSAldToldTolbGx1XG4iLAogCQkJCWJsb2NrLAogCQkJCWNleC0+ZWNfYmxvY2ssIGNleC0+ZWNfbGVuLCBjZXgtPmVjX3N0YXJ0KTsKLQkJcmV0ID0gY2V4LT5lY190eXBlOworCQlyZXQgPSAxOwogCX0KIGVycm91dDoKIAlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKQEAgLTI4MjUsMTQgKzI4NDUsMTQgQEAKICAqIHRvIGFuIHVuaW5pdGlhbGl6ZWQgZXh0ZW50LgogICoKICAqIFdyaXRpbmcgdG8gYW4gdW5pbml0aXplZCBleHRlbnQgbWF5IHJlc3VsdCBpbiBzcGxpdHRpbmcgdGhlIHVuaW5pdGlhbGl6ZWQKLSAqIGV4dGVudCBpbnRvIG11bHRpcGxlIC9pbnRpYWxpemVkIHVuaW50aWFsaXplZCBleHRlbnRzICh1cCB0byB0aHJlZSkKKyAqIGV4dGVudCBpbnRvIG11bHRpcGxlIC9pbml0aWFsaXplZCB1bmluaXRpYWxpemVkIGV4dGVudHMgKHVwIHRvIHRocmVlKQogICogVGhlcmUgYXJlIHRocmVlIHBvc3NpYmlsaXRpZXM6CiAgKiAgIGE+IFRoZXJlIGlzIG5vIHNwbGl0IHJlcXVpcmVkOiBFbnRpcmUgZXh0ZW50IHNob3VsZCBiZSB1bmluaXRpYWxpemVkCiAgKiAgIGI+IFNwbGl0cyBpbiB0d28gZXh0ZW50czogV3JpdGUgaXMgaGFwcGVuaW5nIGF0IGVpdGhlciBlbmQgb2YgdGhlIGV4dGVudAogICogICBjPiBTcGxpdHMgaW4gdGhyZWUgZXh0ZW50czogU29tb25lIGlzIHdyaXRpbmcgaW4gbWlkZGxlIG9mIHRoZSBleHRlbnQKICAqCiAgKiBPbmUgb2YgbW9yZSBpbmRleCBibG9ja3MgbWF5YmUgbmVlZGVkIGlmIHRoZSBleHRlbnQgdHJlZSBncm93IGFmdGVyCi0gKiB0aGUgdW5pbnRpYWxpemVkIGV4dGVudCBzcGxpdC4gVG8gcHJldmVudCBFTk9TUEMgb2NjdXIgYXQgdGhlIElPCisgKiB0aGUgdW5pbml0aWFsaXplZCBleHRlbnQgc3BsaXQuIFRvIHByZXZlbnQgRU5PU1BDIG9jY3VyIGF0IHRoZSBJTwogICogY29tcGxldGUsIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHVuaW5pdGlhbGl6ZWQgZXh0ZW50IGJlZm9yZSBESU8gc3VibWl0CiAgKiB0aGUgSU8uIFRoZSB1bmluaXRpYWxpemVkIGV4dGVudCBjYWxsZWQgYXQgdGhpcyB0aW1lIHdpbGwgYmUgc3BsaXQKICAqIGludG8gdGhyZWUgdW5pbml0aWFsaXplZCBleHRlbnQoYXQgbW9zdCkuIEFmdGVyIElPIGNvbXBsZXRlLCB0aGUgcGFydApAQCAtMzA4Miw3ICszMTAyLDcgQEAKICAqIEhhbmRsZSBFT0ZCTE9DS1NfRkwgZmxhZywgY2xlYXJpbmcgaXQgaWYgbmVjZXNzYXJ5CiAgKi8KIHN0YXRpYyBpbnQgY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCQkgICAgICBleHQ0X2xibGtfdCBsYmxrLAogCQkJICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtMzExMiw3ICszMTMyLDcgQEAKIAkgKiB0aGlzIHR1cm5zIG91dCB0byBiZSBmYWxzZSwgd2UgY2FuIGJhaWwgb3V0IGZyb20gdGhpcwogCSAqIGZ1bmN0aW9uIGltbWVkaWF0ZWx5LgogCSAqLwotCWlmIChtYXAtPm1fbGJsayArIGxlbiA8IGxlMzJfdG9fY3B1KGxhc3RfZXgtPmVlX2Jsb2NrKSArCisJaWYgKGxibGsgKyBsZW4gPCBsZTMyX3RvX2NwdShsYXN0X2V4LT5lZV9ibG9jaykgKwogCSAgICBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihsYXN0X2V4KSkKIAkJcmV0dXJuIDA7CiAJLyoKQEAgLTMxNjgsOCArMzE4OCw4IEBACiAJCQkJCQkJcGF0aCk7CiAJCWlmIChyZXQgPj0gMCkgewogCQkJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMSk7Ci0JCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLCBwYXRoLAotCQkJCQkJIG1hcC0+bV9sZW4pOworCQkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLAorCQkJCQkJIHBhdGgsIG1hcC0+bV9sZW4pOwogCQl9IGVsc2UKIAkJCWVyciA9IHJldDsKIAkJZ290byBvdXQyOwpAQCAtMzE5OSw3ICszMjE5LDggQEAKIAlyZXQgPSBleHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDEpOwotCQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLCBwYXRoLCBtYXAtPm1fbGVuKTsKKwkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXRoLAorCQkJCQkgbWFwLT5tX2xlbik7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBvdXQyOwogCX0KQEAgLTMyNzYsNyArMzI5Nyw3IEBACiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CiAJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4LCAqZXg7CiAJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOwotCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0LCBjYWNoZV90eXBlOworCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0OwogCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAlleHQ0X2lvX2VuZF90ICppbyA9IEVYVDRfSShpbm9kZSktPmN1cl9haW9fZGlvOwpAQCAtMzI4NSw5ICszMzA2LDggQEAKIAkJICBtYXAtPm1fbGJsaywgbWFwLT5tX2xlbiwgaW5vZGUtPmlfaW5vKTsKIAogCS8qIGNoZWNrIGluIGNhY2hlICovCi0JY2FjaGVfdHlwZSA9IGV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBtYXAtPm1fbGJsaywgJm5ld2V4KTsKLQlpZiAoY2FjaGVfdHlwZSkgewotCQlpZiAoY2FjaGVfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9HQVApIHsKKwlpZiAoZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIG1hcC0+bV9sYmxrLCAmbmV3ZXgpKSB7CisJCWlmICghbmV3ZXguZWVfc3RhcnRfbG8gJiYgIW5ld2V4LmVlX3N0YXJ0X2hpKSB7CiAJCQlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCkgewogCQkJCS8qCiAJCQkJICogYmxvY2sgaXNuJ3QgYWxsb2NhdGVkIHlldCBhbmQKQEAgLTMyOTYsNyArMzMxNiw3IEBACiAJCQkJZ290byBvdXQyOwogCQkJfQogCQkJLyogd2Ugc2hvdWxkIGFsbG9jYXRlIHJlcXVlc3RlZCBibG9jayAqLwotCQl9IGVsc2UgaWYgKGNhY2hlX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UKSB7CisJCX0gZWxzZSB7CiAJCQkvKiBibG9jayBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQkJbmV3YmxvY2sgPSBtYXAtPm1fbGJsawogCQkJCSAgIC0gbGUzMl90b19jcHUobmV3ZXguZWVfYmxvY2spCkBAIC0zMzA1LDggKzMzMjUsNiBAQAogCQkJYWxsb2NhdGVkID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJm5ld2V4KSAtCiAJCQkJKG1hcC0+bV9sYmxrIC0gbGUzMl90b19jcHUobmV3ZXguZWVfYmxvY2spKTsKIAkJCWdvdG8gb3V0OwotCQl9IGVsc2UgewotCQkJQlVHKCk7CiAJCX0KIAl9CiAKQEAgLTMzNTcsOCArMzM3NSw3IEBACiAJCQkvKiBEbyBub3QgcHV0IHVuaW5pdGlhbGl6ZWQgZXh0ZW50IGluIHRoZSBjYWNoZSAqLwogCQkJaWYgKCFleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKGV4KSkgewogCQkJCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgZWVfYmxvY2ssCi0JCQkJCQkJZWVfbGVuLCBlZV9zdGFydCwKLQkJCQkJCQlFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpOworCQkJCQkJCWVlX2xlbiwgZWVfc3RhcnQpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJcmV0ID0gZXh0NF9leHRfaGFuZGxlX3VuaW5pdGlhbGl6ZWRfZXh0ZW50cyhoYW5kbGUsCkBAIC0zNDU2LDcgKzM0NzMsNyBAQAogCQkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX1VOSU5JVDsKIAl9CiAKLQllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLCBwYXRoLCBhci5sZW4pOworCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwgYXIubGVuKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDI7CiAKQEAgLTM0OTAsOCArMzUwNyw3IEBACiAJICogd2hlbiBpdCBpcyBfbm90XyBhbiB1bmluaXRpYWxpemVkIGV4dGVudC4KIAkgKi8KIAlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1VOSU5JVF9FWFQpID09IDApIHsKLQkJZXh0NF9leHRfcHV0X2luX2NhY2hlKGlub2RlLCBtYXAtPm1fbGJsaywgYWxsb2NhdGVkLCBuZXdibG9jaywKLQkJCQkJCUVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CisJCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssIGFsbG9jYXRlZCwgbmV3YmxvY2spOwogCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKIAl9IGVsc2UKIAkJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMCk7CkBAIC0zNTE5LDYgKzM1MzUsMTIgQEAKIAlpbnQgZXJyID0gMDsKIAogCS8qCisJICogZmluaXNoIGFueSBwZW5kaW5nIGVuZF9pbyB3b3JrIHNvIHdlIHdvbid0IHJ1biB0aGUgcmlzayBvZgorCSAqIGNvbnZlcnRpbmcgYW55IHRydW5jYXRlZCBibG9ja3MgdG8gaW5pdGlhbGl6ZWQgbGF0ZXIKKwkgKi8KKwlleHQ0X2ZsdXNoX2NvbXBsZXRlZF9JTyhpbm9kZSk7CisKKwkvKgogCSAqIHByb2JhYmx5IGZpcnN0IGV4dGVudCB3ZSdyZSBnb25uYSBmcmVlIHdpbGwgYmUgbGFzdCBpbiBibG9jawogCSAqLwogCWVyciA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSk7CkBAIC0zNjIyLDYgKzM2NDQsMTAgQEAKIAlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAl1bnNpZ25lZCBpbnQgY3JlZGl0cywgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CiAKKwkvKiBXZSBvbmx5IHN1cHBvcnQgdGhlIEZBTExPQ19GTF9LRUVQX1NJWkUgbW9kZSAqLworCWlmIChtb2RlICYmIChtb2RlICE9IEZBTExPQ19GTF9LRUVQX1NJWkUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAkvKgogCSAqIGN1cnJlbnRseSBzdXBwb3J0aW5nIChwcmUpYWxsb2NhdGUgbW9kZSBmb3IgZXh0ZW50LWJhc2VkCiAJICogZmlsZXMgX29ubHlfCkBAIC0zNzY3LDcgKzM3OTMsNyBAQAogCiAJbG9naWNhbCA9ICAoX191NjQpbmV3ZXgtPmVjX2Jsb2NrIDw8IGJsa3NpemVfYml0czsKIAotCWlmIChuZXdleC0+ZWNfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9HQVApIHsKKwlpZiAobmV3ZXgtPmVjX3N0YXJ0ID09IDApIHsKIAkJcGdvZmZfdCBvZmZzZXQ7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggNWE1YzU1ZC4uYmIwMDNkYyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJc3RydWN0IHZmc21vdW50ICptbnQgPSBmaWxwLT5mX3BhdGgubW50OwogCXN0cnVjdCBwYXRoIHBhdGg7CiAJY2hhciBidWZbNjRdLCAqY3A7CkBAIC0xMjcsNiArMTI4LDI3IEBACiAJCQlleHQ0X21hcmtfc3VwZXJfZGlydHkoc2IpOwogCQl9CiAJfQorCS8qCisJICogU2V0IHVwIHRoZSBqYmQyX2lub2RlIGlmIHdlIGFyZSBvcGVuaW5nIHRoZSBpbm9kZSBmb3IKKwkgKiB3cml0aW5nIGFuZCB0aGUgam91cm5hbCBpcyBwcmVzZW50CisJICovCisJaWYgKHNiaS0+c19qb3VybmFsICYmICFlaS0+amlub2RlICYmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKKwkJc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSA9IGpiZDJfYWxsb2NfaW5vZGUoR0ZQX0tFUk5FTCk7CisKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKCFlaS0+amlub2RlKSB7CisJCQlpZiAoIWppbm9kZSkgeworCQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWVpLT5qaW5vZGUgPSBqaW5vZGU7CisJCQlqYmQyX2pvdXJuYWxfaW5pdF9qYmRfaW5vZGUoZWktPmppbm9kZSwgaW5vZGUpOworCQkJamlub2RlID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWlmICh1bmxpa2VseShqaW5vZGUgIT0gTlVMTCkpCisJCQlqYmQyX2ZyZWVfaW5vZGUoamlub2RlKTsKKwl9CiAJcmV0dXJuIGRxdW90X2ZpbGVfb3Blbihpbm9kZSwgZmlscCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZnN5bmMuYyBiL2ZzL2V4dDQvZnN5bmMuYwppbmRleCBjMWE3YmM5Li43ODI5YjI4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZzeW5jLmMKKysrIGIvZnMvZXh0NC9mc3luYy5jCkBAIC03NSw3ICs3NSw3IEBACiAgKiB0byB3cml0dGVuLgogICogVGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgSU9zIG9uIHN1Y2Nlc3MuCiAgKi8KLXN0YXRpYyBpbnQgZmx1c2hfY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitleHRlcm4gaW50IGV4dDRfZmx1c2hfY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJZXh0NF9pb19lbmRfdCAqaW87CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IGZsdXNoX2NvbXBsZXRlZF9JTyhpbm9kZSk7CisJcmV0ID0gZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oaW5vZGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCAxY2UyNDBhLi5lYjkwOTdhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTEwMjcsNyArMTAyNyw3IEBACiAJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHNiaS0+c19uZXh0X2dlbmVyYXRpb24rKzsKIAlzcGluX3VubG9jaygmc2JpLT5zX25leHRfZ2VuX2xvY2spOwogCi0JZWktPmlfc3RhdGVfZmxhZ3MgPSAwOworCWV4dDRfY2xlYXJfc3RhdGVfZmxhZ3MoZWkpOyAvKiBPbmx5IHJlbGV2YW50IG9uIDMyLWJpdCBhcmNocyAqLwogCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FVyk7CiAKIAllaS0+aV9leHRyYV9pc2l6ZSA9IEVYVDRfU0Ioc2IpLT5zX3dhbnRfZXh0cmFfaXNpemU7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggZTY1OTU5Ny4uOWY3ZjllNCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMzksNyArMzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgInhhdHRyLmgiCkBAIC01NCwxMCArNTYsMTcgQEAKIAkJCQkJICAgICAgbG9mZl90IG5ld19zaXplKQogewogCXRyYWNlX2V4dDRfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShpbm9kZSwgbmV3X3NpemUpOwotCXJldHVybiBqYmQyX2pvdXJuYWxfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZSgKLQkJCQkJRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbCwKLQkJCQkJJkVYVDRfSShpbm9kZSktPmppbm9kZSwKLQkJCQkJbmV3X3NpemUpOworCS8qCisJICogSWYgamlub2RlIGlzIHplcm8sIHRoZW4gd2UgbmV2ZXIgb3BlbmVkIHRoZSBmaWxlIGZvcgorCSAqIHdyaXRpbmcsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsCisJICogamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoKSBzaW5jZSB0aGVyZSdzIG5vCisJICogb3V0c3RhbmRpbmcgd3JpdGVzIHdlIG5lZWQgdG8gZmx1c2guCisJICovCisJaWYgKCFFWFQ0X0koaW5vZGUpLT5qaW5vZGUpCisJCXJldHVybiAwOworCXJldHVybiBqYmQyX2pvdXJuYWxfYmVnaW5fb3JkZXJlZF90cnVuY2F0ZShFWFQ0X0pPVVJOQUwoaW5vZGUpLAorCQkJCQkJICAgRVhUNF9JKGlub2RlKS0+amlub2RlLAorCQkJCQkJICAgbmV3X3NpemUpOwogfQogCiBzdGF0aWMgdm9pZCBleHQ0X2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCk7CkBAIC01NTIsNyArNTYxLDcgQEAKIH0KIAogLyoqCi0gKglleHQ0X2Jsa3NfdG9fYWxsb2NhdGU6IExvb2sgdXAgdGhlIGJsb2NrIG1hcCBhbmQgY291bnQgdGhlIG51bWJlcgorICoJZXh0NF9ibGtzX3RvX2FsbG9jYXRlIC0gTG9vayB1cCB0aGUgYmxvY2sgbWFwIGFuZCBjb3VudCB0aGUgbnVtYmVyCiAgKglvZiBkaXJlY3QgYmxvY2tzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gYnJhbmNoLgogICoKICAqCUBicmFuY2g6IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcwpAQCAtNTkxLDEzICs2MDAsMTkgQEAKIAogLyoqCiAgKglleHQ0X2FsbG9jX2Jsb2NrczogbXVsdGlwbGUgYWxsb2NhdGUgYmxvY2tzIG5lZWRlZCBmb3IgYSBicmFuY2gKKyAqCUBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICoJQGlub2RlOiBpbm9kZSB3aGljaCBuZWVkcyBhbGxvY2F0ZWQgYmxvY2tzCisgKglAaWJsb2NrOiB0aGUgbG9naWNhbCBibG9jayB0byBzdGFydCBhbGxvY2F0ZWQgYXQKKyAqCUBnb2FsOiBwcmVmZXJyZWQgcGh5c2ljYWwgYmxvY2sgb2YgYWxsb2NhdGlvbgogICoJQGluZGlyZWN0X2Jsa3M6IHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIGluZGlyZWN0CiAgKgkJCWJsb2NrcwotICoKKyAqCUBibGtzOiBudW1iZXIgb2YgZGVzaXJlZCBibG9ja3MKICAqCUBuZXdfYmxvY2tzOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgbmV3IGJsb2NrIG51bWJlcnMgZm9yCiAgKgl0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5lZWRlZCkgYW5kIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2ssCi0gKglAYmxrczoJb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIHRvdGFsIG51bWJlciBvZiBhbGxvY2F0ZWQKLSAqCQlkaXJlY3QgYmxvY2tzCisgKglAZXJyOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgZXJyb3IgY29kZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGFzCisgKglyZXF1ZXN0ZWQgYnkgdGhlIHBhc3NlZC1pbiBwYXJhbWV0ZXJzLgogICovCiBzdGF0aWMgaW50IGV4dDRfYWxsb2NfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIGV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCkBAIC03MTEsOSArNzI2LDExIEBACiAKIC8qKgogICoJZXh0NF9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCiAgKglAaW5vZGU6IG93bmVyCiAgKglAaW5kaXJlY3RfYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBpbmRpcmVjdCBibG9ja3MKICAqCUBibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGRpcmVjdCBibG9ja3MKKyAqCUBnb2FsOiBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24KICAqCUBvZmZzZXRzOiBvZmZzZXRzIChpbiB0aGUgYmxvY2tzKSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gbmV4dC4KICAqCUBicmFuY2g6IHBsYWNlIHRvIHN0b3JlIHRoZSBjaGFpbiBpbi4KICAqCkBAIC04MjYsNiArODQzLDcgQEAKIAogLyoqCiAgKiBleHQ0X3NwbGljZV9icmFuY2ggLSBzcGxpY2UgdGhlIGFsbG9jYXRlZCBicmFuY2ggb250byBpbm9kZS4KKyAqIEBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgogICogQGlub2RlOiBvd25lcgogICogQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKICAqIEBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCkBAIC0xMDgxLDcgKzEwOTksNyBAQAogICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWV0YWRhdGEgYmxvY2tzIG5lZWQgdG8gcmVzZXJ2ZQogICogdG8gYWxsb2NhdGUgYSBibG9jayBsb2NhdGVkIGF0IEBsYmxvY2sKICAqLwotc3RhdGljIGludCBleHQ0X2NhbGNfbWV0YWRhdGFfYW1vdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGxibG9jaykKK3N0YXRpYyBpbnQgZXh0NF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCiB7CiAJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlyZXR1cm4gZXh0NF9leHRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CkBAIC0xMzIwLDcgKzEzMzgsNyBAQAogCSAqIGF2b2lkIGRvdWJsZSBhY2NvdW50aW5nCiAJICovCiAJaWYgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUpCi0JCUVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZyA9IDE7CisJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEKTsKIAkvKgogCSAqIFdlIG5lZWQgdG8gY2hlY2sgZm9yIEVYVDQgaGVyZSBiZWNhdXNlIG1pZ3JhdGUKIAkgKiBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIGlub2RlIHR5cGUgaW4gYmV0d2VlbgpAQCAtMTM1MCw3ICsxMzY4LDcgQEAKIAkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHJldHZhbCwgMSk7CiAJfQogCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKQotCQlFWFQ0X0koaW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgPSAwOworCQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEKTsKIAogCXVwX3dyaXRlKCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkpOwogCWlmIChyZXR2YWwgPiAwICYmIG1hcC0+bV9mbGFncyAmIEVYVDRfTUFQX01BUFBFRCkgewpAQCAtMTg3OCw3ICsxODk2LDcgQEAKIC8qCiAgKiBSZXNlcnZlIGEgc2luZ2xlIGJsb2NrIGxvY2F0ZWQgYXQgbGJsb2NrCiAgKi8KLXN0YXRpYyBpbnQgZXh0NF9kYV9yZXNlcnZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGxibG9jaykKK3N0YXRpYyBpbnQgZXh0NF9kYV9yZXNlcnZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibG9jaykKIHsKIAlpbnQgcmV0cmllcyA9IDA7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CkBAIC0yMjM5LDcgKzIyNTcsNyBAQAogCSAqIGFmZmVjdHMgZnVuY3Rpb25zIGluIG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBhbGxvY2F0aW9uCiAJICogY2FsbCBwYXRoLiAgVGhpcyBmbGFnIGV4aXN0cyBwcmltYXJpbHkgYmVjYXVzZSB3ZSBkb24ndAogCSAqIHdhbnQgdG8gY2hhbmdlICptYW55KiBjYWxsIGZ1bmN0aW9ucywgc28gZXh0NF9tYXBfYmxvY2tzKCkKLQkgKiB3aWxsIHNldCB0aGUgbWFnaWMgaV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnIG9uY2UgdGhlCisJICogd2lsbCBzZXQgdGhlIEVYVDRfU1RBVEVfREVMQUxMT0NfUkVTRVJWRUQgZmxhZyBvbmNlIHRoZQogCSAqIGlub2RlJ3MgYWxsb2NhdGlvbiBzZW1hcGhvcmUgaXMgdGFrZW4uCiAJICoKIAkgKiBJZiB0aGUgYmxvY2tzIGluIHF1ZXN0aW9ucyB3ZXJlIGRlbGFsbG9jIGJsb2Nrcywgc2V0CkBAIC0zMzYyLDcgKzMzODAsNyBAQAogCSAqIGRvaW5nIEkvTyBhdCBhbGwuCiAJICoKIAkgKiBXZSBjb3VsZCBjYWxsIHdyaXRlX2NhY2hlX3BhZ2VzKCksIGFuZCB0aGVuIHJlZGlydHkgYWxsIG9mCi0JICogdGhlIHBhZ2VzIGJ5IGNhbGxpbmcgcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZWJhY2soKSBidXQgdGhhdAorCSAqIHRoZSBwYWdlcyBieSBjYWxsaW5nIHJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKCkgYnV0IHRoYXQKIAkgKiB3b3VsZCBiZSB1Z2x5IGluIHRoZSBleHRyZW1lLiAgU28gaW5zdGVhZCB3ZSB3b3VsZCBuZWVkIHRvCiAJICogcmVwbGljYXRlIHBhcnRzIG9mIHRoZSBjb2RlIGluIHRoZSBhYm92ZSBmdW5jdGlvbnMsCiAJICogc2ltcGxpZnlpbmcgdGhlbSBiZWN1YXNlIHdlIHdvdWxkbid0IGFjdHVhbGx5IGludGVuZCB0bwpAQCAtMzcyMCw4ICszNzM4LDcgQEAKIHJldHJ5OgogCWlvX2VuZCA9IGV4dDRfaW5pdF9pb19lbmQoaW5vZGUsIEdGUF9BVE9NSUMpOwogCWlmICghaW9fZW5kKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWxsb2NhdGlvbiBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIiVzOiBhbGxvY2F0aW9uIGZhaWxcbiIsIF9fZnVuY19fKTsKIAkJc2NoZWR1bGUoKTsKIAkJZ290byByZXRyeTsKIAl9CkBAIC0zNzQ1LDkgKzM3NjIsOSBAQAogICogcHJlYWxsb2NhdGVkIGV4dGVudHMsIGFuZCB0aG9zZSB3cml0ZSBleHRlbmQgdGhlIGZpbGUsIG5vIG5lZWQgdG8KICAqIGZhbGwgYmFjayB0byBidWZmZXJlZCBJTy4KICAqCi0gKiBGb3IgaG9sZXMsIHdlIGZhbGxvY2F0ZSB0aG9zZSBibG9ja3MsIG1hcmsgdGhlbSBhcyB1bmludGlhbGl6ZWQKKyAqIEZvciBob2xlcywgd2UgZmFsbG9jYXRlIHRob3NlIGJsb2NrcywgbWFyayB0aGVtIGFzIHVuaW5pdGlhbGl6ZWQKICAqIElmIHRob3NlIGJsb2NrcyB3ZXJlIHByZWFsbG9jYXRlZCwgd2UgbWFyayBzdXJlIHRoZXkgYXJlIHNwbGl0ZWQsIGJ1dAotICogc3RpbGwga2VlcCB0aGUgcmFuZ2UgdG8gd3JpdGUgYXMgdW5pbnRpYWxpemVkLgorICogc3RpbGwga2VlcCB0aGUgcmFuZ2UgdG8gd3JpdGUgYXMgdW5pbml0aWFsaXplZC4KICAqCiAgKiBUaGUgdW53cnJpdHRlbiBleHRlbnRzIHdpbGwgYmUgY29udmVydGVkIHRvIHdyaXR0ZW4gd2hlbiBESU8gaXMgY29tcGxldGVkLgogICogRm9yIGFzeW5jIGRpcmVjdCBJTywgc2luY2UgdGhlIElPIG1heSBzdGlsbCBwZW5kaW5nIHdoZW4gcmV0dXJuLCB3ZQpAQCAtNDA0NSw3ICs0MDYyLDcgQEAKIAlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgewogCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJfSBlbHNlIHsKLQkJaWYgKGV4dDRfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkgJiYgRVhUNF9JKGlub2RlKS0+amlub2RlKQogCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAl9CkBAIC00MTY5LDYgKzQxODYsNyBAQAogewogCV9fbGUzMiAqcDsKIAlpbnQJZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCB8IEVYVDRfRlJFRV9CTE9DS1NfVkFMSURBVEVEOworCWludAllcnI7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBOwpAQCAtNDE4NCwxMSArNDIwMiwyMyBAQAogCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCWlmIChiaCkgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJfQotCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7Ci0JCWV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICAgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVyciA9IGV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAorCQkJCQkJICBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwkJCXJldHVybiAxOworCQl9CiAJCWlmIChiaCkgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAicmV0YWtpbmcgd3JpdGUgYWNjZXNzIik7CiAJCQlleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKQEAgLTQzNDksNiArNDM3OSw3IEBACiAJCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSwKIAkJCQkJKF9fbGUzMiAqKSBiaC0+Yl9kYXRhICsgYWRkcl9wZXJfYmxvY2ssCiAJCQkJCWRlcHRoKTsKKwkJCWJyZWxzZShiaCk7CiAKIAkJCS8qCiAJCQkgKiBFdmVyeXRoaW5nIGJlbG93IHRoaXMgdGhpcyBwb2ludGVyIGhhcyBiZWVuCkBAIC00ODU5LDcgKzQ4OTAsNyBAQAogCX0KIAlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCk7CiAKLQllaS0+aV9zdGF0ZV9mbGFncyA9IDA7CisJZXh0NF9jbGVhcl9zdGF0ZV9mbGFncyhlaSk7CS8qIE9ubHkgcmVsZXZhbnQgb24gMzItYml0IGFyY2hzICovCiAJZWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IDA7CiAJZWktPmlfZHRpbWUgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZHRpbWUpOwogCS8qIFdlIG5vdyBoYXZlIGVub3VnaCBmaWVsZHMgdG8gY2hlY2sgaWYgdGhlIGlub2RlIHdhcyBhY3RpdmUgb3Igbm90LgpAQCAtNTExOCw3ICs1MTQ5LDcgQEAKIAlpZiAoZXh0NF9pbm9kZV9ibG9ja3Nfc2V0KGhhbmRsZSwgcmF3X2lub2RlLCBlaSkpCiAJCWdvdG8gb3V0X2JyZWxzZTsKIAlyYXdfaW5vZGUtPmlfZHRpbWUgPSBjcHVfdG9fbGUzMihlaS0+aV9kdGltZSk7Ci0JcmF3X2lub2RlLT5pX2ZsYWdzID0gY3B1X3RvX2xlMzIoZWktPmlfZmxhZ3MpOworCXJhd19pbm9kZS0+aV9mbGFncyA9IGNwdV90b19sZTMyKGVpLT5pX2ZsYWdzICYgMHhGRkZGRkZGRik7CiAJaWYgKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzLT5zX2NyZWF0b3Jfb3MgIT0KIAkgICAgY3B1X3RvX2xlMzIoRVhUNF9PU19IVVJEKSkKIAkJcmF3X2lub2RlLT5pX2ZpbGVfYWNsX2hpZ2ggPQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCA1YjRkNGUzLi44NTFmNDliIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtMjYwOCwxOCArMjYwOCwxMiBAQAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwgZXh0NF9ncnBibGtfdCBibG9jaywgaW50IGNvdW50KQogewotCWludCByZXQ7CiAJZXh0NF9mc2Jsa190IGRpc2NhcmRfYmxvY2s7CiAKIAlkaXNjYXJkX2Jsb2NrID0gYmxvY2sgKyBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBibG9ja19ncm91cCk7CiAJdHJhY2VfZXh0NF9kaXNjYXJkX2Jsb2NrcyhzYiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGRpc2NhcmRfYmxvY2ssIGNvdW50KTsKLQlyZXQgPSBzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwotCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApIHsKLQkJZXh0NF93YXJuaW5nKHNiLCAiZGlzY2FyZCBub3Qgc3VwcG9ydGVkLCBkaXNhYmxpbmciKTsKLQkJY2xlYXJfb3B0KEVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCwgRElTQ0FSRCk7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIHNiX2lzc3VlX2Rpc2NhcmQoc2IsIGRpc2NhcmRfYmxvY2ssIGNvdW50LCBHRlBfTk9GUywgMCk7CiB9CiAKIC8qCkBAIC0yNjMxLDcgKzI2MjUsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBqb3VybmFsLT5qX3ByaXZhdGU7CiAJc3RydWN0IGV4dDRfYnVkZHkgZTRiOwogCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmRiOwotCWludCBlcnIsIGNvdW50ID0gMCwgY291bnQyID0gMDsKKwlpbnQgZXJyLCByZXQsIGNvdW50ID0gMCwgY291bnQyID0gMDsKIAlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKmVudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpsdG1wOwogCkBAIC0yNjQxLDkgKzI2MzUsMTUgQEAKIAkJbWJfZGVidWcoMSwgImdvbm5hIGZyZWUgJXUgYmxvY2tzIGluIGdyb3VwICV1ICgweCVwKToiLAogCQkJIGVudHJ5LT5jb3VudCwgZW50cnktPmdyb3VwLCBlbnRyeSk7CiAKLQkJaWYgKHRlc3Rfb3B0KHNiLCBESVNDQVJEKSkKLQkJCWV4dDRfaXNzdWVfZGlzY2FyZChzYiwgZW50cnktPmdyb3VwLAorCQlpZiAodGVzdF9vcHQoc2IsIERJU0NBUkQpKSB7CisJCQlyZXQgPSBleHQ0X2lzc3VlX2Rpc2NhcmQoc2IsIGVudHJ5LT5ncm91cCwKIAkJCQkJZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKKwkJCWlmICh1bmxpa2VseShyZXQgPT0gLUVPUE5PVFNVUFApKSB7CisJCQkJZXh0NF93YXJuaW5nKHNiLCAiZGlzY2FyZCBub3Qgc3VwcG9ydGVkLCAiCisJCQkJCQkgImRpc2FibGluZyIpOworCQkJCWNsZWFyX29wdChzYiwgRElTQ0FSRCk7CisJCQl9CisJCX0KIAogCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGVudHJ5LT5ncm91cCwgJmU0Yik7CiAJCS8qIHdlIGV4cGVjdCB0byBmaW5kIGV4aXN0aW5nIGJ1ZGR5IGJlY2F1c2UgaXQncyBwaW5uZWQgKi8KQEAgLTM4ODEsMTkgKzM4ODEsNiBAQAogCX0KIH0KIAotLyoKLSAqIGZpbmRzIGFsbCBwcmVhbGxvY2F0ZWQgc3BhY2VzIGFuZCByZXR1cm4gYmxvY2tzIGJlaW5nIGZyZWVkIHRvIHRoZW0KLSAqIGlmIHByZWFsbG9jYXRlZCBzcGFjZSBiZWNvbWVzIGZ1bGwgKG5vIGJsb2NrIGlzIHVzZWQgZnJvbSB0aGUgc3BhY2UpCi0gKiB0aGVuIHRoZSBmdW5jdGlvbiBmcmVlcyBzcGFjZSBpbiBidWRkeQotICogWFhYOiBhdCB0aGUgbW9tZW50LCB0cnVuY2F0ZSAod2hpY2ggaXMgdGhlIG9ubHkgd2F5IHRvIGZyZWUgYmxvY2tzKQotICogZGlzY2FyZHMgYWxsIHByZWFsbG9jYXRpb25zCi0gKi8KLXN0YXRpYyB2b2lkIGV4dDRfbWJfcmV0dXJuX3RvX3ByZWFsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJc3RydWN0IGV4dDRfYnVkZHkgKmU0YiwKLQkJCQkJc2VjdG9yX3QgYmxvY2ssIGludCBjb3VudCkKLXsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJkVYVDRfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCkpOwotfQogI2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHCiBzdGF0aWMgdm9pZCBleHQ0X21iX3Nob3dfYWMoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKQEAgLTQyODMsNyArNDI3MCw3IEBACiAJICogRURRVU9UIGNoZWNrLCBhcyBibG9ja3MgYW5kIHF1b3RhcyBoYXZlIGJlZW4gYWxyZWFkeQogCSAqIHJlc2VydmVkIHdoZW4gZGF0YSBiZWluZyBjb3BpZWQgaW50byBwYWdlY2FjaGUuCiAJICovCi0JaWYgKEVYVDRfSShhci0+aW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcpCisJaWYgKGV4dDRfdGVzdF9pbm9kZV9zdGF0ZShhci0+aW5vZGUsIEVYVDRfU1RBVEVfREVMQUxMT0NfUkVTRVJWRUQpKQogCQlhci0+ZmxhZ3MgfD0gRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRDsKIAllbHNlIHsKIAkJLyogV2l0aG91dCBkZWxheWVkIGFsbG9jYXRpb24gd2UgbmVlZCB0byB2ZXJpZnkKQEAgLTQzODAsNyArNDM2Nyw4IEBACiAJaWYgKGlucXVvdGEgJiYgYXItPmxlbiA8IGlucXVvdGEpCiAJCWRxdW90X2ZyZWVfYmxvY2soYXItPmlub2RlLCBpbnF1b3RhIC0gYXItPmxlbik7CiAJaWYgKCFhci0+bGVuKSB7Ci0JCWlmICghRVhUNF9JKGFyLT5pbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykKKwkJaWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoYXItPmlub2RlLAorCQkJCQkgICBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEKSkKIAkJCS8qIHJlbGVhc2UgYWxsIHRoZSByZXNlcnZlZCBibG9ja3MgaWYgbm9uIGRlbGFsbG9jICovCiAJCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyLAogCQkJCQkJcmVzZXJ2X2Jsa3MpOwpAQCAtNDYyNiw3ICs0NjE0LDExIEBACiAJCSAqIGJsb2NrcyBiZWluZyBmcmVlZCBhcmUgbWV0YWRhdGEuIHRoZXNlIGJsb2NrcyBzaG91bGRuJ3QKIAkJICogYmUgdXNlZCB1bnRpbCB0aGlzIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZAogCQkgKi8KLQkJbmV3X2VudHJ5ICA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9mcmVlX2V4dF9jYWNoZXAsIEdGUF9OT0ZTKTsKKwkJbmV3X2VudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgR0ZQX05PRlMpOworCQlpZiAoIW5ld19lbnRyeSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CiAJCW5ld19lbnRyeS0+c3RhcnRfYmxrID0gYml0OwogCQluZXdfZW50cnktPmdyb3VwICA9IGJsb2NrX2dyb3VwOwogCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CkBAIC00NjQzLDcgKzQ2MzUsNiBAQAogCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKIAkJbWJfY2xlYXJfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYml0LCBjb3VudCk7CiAJCW1iX2ZyZWVfYmxvY2tzKGlub2RlLCAmZTRiLCBiaXQsIGNvdW50KTsKLQkJZXh0NF9tYl9yZXR1cm5fdG9fcHJlYWxsb2NhdGlvbihpbm9kZSwgJmU0YiwgYmxvY2ssIGNvdW50KTsKIAl9CiAKIAlyZXQgPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSArIGNvdW50OwpAQCAtNDcxOCw4ICs0NzA5LDYgQEAKIAlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCiAJcmV0ID0gZXh0NF9pc3N1ZV9kaXNjYXJkKHNiLCBncm91cCwgc3RhcnQsIGNvdW50KTsKLQlpZiAocmV0KQotCQlleHQ0X3N0ZF9lcnJvcihzYiwgcmV0KTsKIAogCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCW1iX2ZyZWVfYmxvY2tzKE5VTEwsIGU0Yiwgc3RhcnQsIGV4LmZlX2xlbik7CkBAIC00ODE5LDYgKzQ4MDgsOCBAQAogCWV4dDRfZ3JvdXBfdCBncm91cCwgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJZXh0NF9ncnBibGtfdCBjbnQgPSAwLCBmaXJzdF9ibG9jaywgbGFzdF9ibG9jazsKIAl1aW50NjRfdCBzdGFydCwgbGVuLCBtaW5sZW4sIHRyaW1tZWQ7CisJZXh0NF9mc2Jsa190IGZpcnN0X2RhdGFfYmxrID0KKwkJCWxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOwogCWludCByZXQgPSAwOwogCiAJc3RhcnQgPSByYW5nZS0+c3RhcnQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CkBAIC00ODI4LDYgKzQ4MTksMTAgQEAKIAogCWlmICh1bmxpa2VseShtaW5sZW4gPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0YXJ0IDwgZmlyc3RfZGF0YV9ibGspIHsKKwkJbGVuIC09IGZpcnN0X2RhdGFfYmxrIC0gc3RhcnQ7CisJCXN0YXJ0ID0gZmlyc3RfZGF0YV9ibGs7CisJfQogCiAJLyogRGV0ZXJtaW5lIGZpcnN0IGFuZCBsYXN0IGdyb3VwIHRvIGV4YW1pbmUgYmFzZWQgb24gc3RhcnQgYW5kIGxlbiAqLwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIChleHQ0X2ZzYmxrX3QpIHN0YXJ0LApAQCAtNDg1MSw3ICs0ODQ2LDcgQEAKIAkJaWYgKGxlbiA+PSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQogCQkJbGVuIC09IChFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gZmlyc3RfYmxvY2spOwogCQllbHNlCi0JCQlsYXN0X2Jsb2NrID0gbGVuOworCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgbGVuOwogCiAJCWlmIChlNGIuYmRfaW5mby0+YmJfZnJlZSA+PSBtaW5sZW4pIHsKIAkJCWNudCA9IGV4dDRfdHJpbV9hbGxfZnJlZShzYiwgJmU0YiwgZmlyc3RfYmxvY2ssCmRpZmYgLS1naXQgYS9mcy9leHQ0L21pZ3JhdGUuYyBiL2ZzL2V4dDQvbWlncmF0ZS5jCmluZGV4IDI1ZjNhOTcuLmIwYTEyNmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWlncmF0ZS5jCisrKyBiL2ZzL2V4dDQvbWlncmF0ZS5jCkBAIC00OTYsNyArNDk2LDcgQEAKIAlnb2FsID0gKCgoaW5vZGUtPmlfaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSAqCiAJCUVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikpICsgMTsKIAl0bXBfaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGlub2RlLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUsCi0JCQkJICAgU19JRlJFRywgMCwgZ29hbCk7CisJCQkJICAgU19JRlJFRywgTlVMTCwgZ29hbCk7CiAJaWYgKElTX0VSUih0bXBfaW5vZGUpKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggZGM0MGU3NS4uNTQ4NTM5MCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtNTgxLDkgKzU4MSw5IEBACiAJCQkJCSAgIGRpci0+aV9zYi0+c19ibG9ja3NpemUgLQogCQkJCQkgICBFWFQ0X0RJUl9SRUNfTEVOKDApKTsKIAlmb3IgKDsgZGUgPCB0b3A7IGRlID0gZXh0NF9uZXh0X2VudHJ5KGRlLCBkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkgewotCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgZGUsIGJoLAotCQkJCQkoYmxvY2s8PEVYVDRfQkxPQ0tfU0laRV9CSVRTKGRpci0+aV9zYikpCi0JCQkJCQkrKChjaGFyICopZGUgLSBiaC0+Yl9kYXRhKSkpIHsKKwkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgTlVMTCwgZGUsIGJoLAorCQkJCShibG9jazw8RVhUNF9CTE9DS19TSVpFX0JJVFMoZGlyLT5pX3NiKSkKKwkJCQkJICsgKChjaGFyICopZGUgLSBiaC0+Yl9kYXRhKSkpIHsKIAkJCS8qIE9uIGVycm9yLCBza2lwIHRoZSBmX3BvcyB0byB0aGUgbmV4dCBibG9jay4gKi8KIAkJCWRpcl9maWxlLT5mX3BvcyA9IChkaXJfZmlsZS0+Zl9wb3MgfAogCQkJCQkoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7CkBAIC04MjAsNyArODIwLDcgQEAKIAkJaWYgKChjaGFyICopIGRlICsgbmFtZWxlbiA8PSBkbGltaXQgJiYKIAkJICAgIGV4dDRfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgewogCQkJLyogZm91bmQgYSBtYXRjaCAtIGp1c3QgdG8gYmUgc3VyZSwgZG8gYSBmdWxsIGNoZWNrICovCi0JCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgZGUsIGJoLCBvZmZzZXQpKQorCQkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgTlVMTCwgZGUsIGJoLCBvZmZzZXQpKQogCQkJCXJldHVybiAtMTsKIAkJCSpyZXNfZGlyID0gZGU7CiAJCQlyZXR1cm4gMTsKQEAgLTEwMzYsNyArMTAzNiw3IEBACiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQlpbm9kZSA9IGV4dDRfaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmICh1bmxpa2VseShJU19FUlIoaW5vZGUpKSkgeworCQlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkJaWYgKFBUUl9FUlIoaW5vZGUpID09IC1FU1RBTEUpIHsKIAkJCQlFWFQ0X0VSUk9SX0lOT0RFKGRpciwKIAkJCQkJCSAiZGVsZXRlZCBpbm9kZSByZWZlcmVuY2VkOiAldSIsCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLT5iX2RhdGE7CiAJCXRvcCA9IGJoLT5iX2RhdGEgKyBibG9ja3NpemUgLSByZWNsZW47CiAJCXdoaWxlICgoY2hhciAqKSBkZSA8PSB0b3ApIHsKLQkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBkZSwgYmgsIG9mZnNldCkpCisJCQlpZiAoZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBOVUxMLCBkZSwgYmgsIG9mZnNldCkpCiAJCQkJcmV0dXJuIC1FSU87CiAJCQlpZiAoZXh0NF9tYXRjaChuYW1lbGVuLCBuYW1lLCBkZSkpCiAJCQkJcmV0dXJuIC1FRVhJU1Q7CkBAIC0xNjAyLDcgKzE2MDIsMTEgQEAKIAkJCWlmIChlcnIpCiAJCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQl9Ci0JCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGZyYW1lc1swXS5iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGZyYW1lc1swXS5iaCk7CisJCWlmIChlcnIpIHsKKwkJCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCQkJZ290byBjbGVhbnVwOworCQl9CiAJfQogCWRlID0gZG9fc3BsaXQoaGFuZGxlLCBkaXIsICZiaCwgZnJhbWUsICZoaW5mbywgJmVycik7CiAJaWYgKCFkZSkKQEAgLTE2MzAsMTcgKzE2MzQsMjEgQEAKIHsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsICpwZGU7CiAJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAogCWkgPSAwOwogCXBkZSA9IE5VTEw7CiAJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAl3aGlsZSAoaSA8IGJoLT5iX3NpemUpIHsKLQkJaWYgKCFleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIGRlLCBiaCwgaSkpCisJCWlmIChleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIE5VTEwsIGRlLCBiaCwgaSkpCiAJCQlyZXR1cm4gLUVJTzsKIAkJaWYgKGRlID09IGRlX2RlbCkgIHsKIAkJCUJVRkZFUl9UUkFDRShiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJCWV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCWV4dDRfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQogCQkJaWYgKHBkZSkKIAkJCQlwZGUtPnJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzaygKIAkJCQkJZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhwZGUtPnJlY19sZW4sCkBAIC0xNjUyLDcgKzE2NjAsMTEgQEAKIAkJCQlkZS0+aW5vZGUgPSAwOwogCQkJZGlyLT5pX3ZlcnNpb24rKzsKIAkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaCk7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgpOworCQkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQlleHQ0X3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJCXJldHVybiAwOwogCQl9CiAJCWkgKz0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0+cmVjX2xlbiwgYmxvY2tzaXplKTsKQEAgLTE3ODksNyArMTgwMSw3IEBACiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2Jsb2NrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2Jsb2NrID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CiAJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSA9IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CiAJaW50IGVyciwgcmV0cmllcyA9IDA7CkBAIC0xODIyLDcgKzE4MzQsOSBAQAogCWlmICghZGlyX2Jsb2NrKQogCQlnb3RvIG91dF9jbGVhcl9pbm9kZTsKIAlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCWV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CiAJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgZGlyX2Jsb2NrLT5iX2RhdGE7CiAJZGUtPmlub2RlID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKIAlkZS0+bmFtZV9sZW4gPSAxOwpAQCAtMTgzOSwxMCArMTg1MywxMiBAQAogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwogCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGRpcl9ibG9jayk7Ci0JYnJlbHNlKGRpcl9ibG9jayk7Ci0JZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCWVyciA9IGV4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCWlmICghZXJyKQorCQllcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOwogCWlmIChlcnIpIHsKIG91dF9jbGVhcl9pbm9kZToKIAkJY2xlYXJfbmxpbmsoaW5vZGUpOwpAQCAtMTg1MywxMCArMTg2OSwxMyBAQAogCX0KIAlleHQ0X2luY19jb3VudChoYW5kbGUsIGRpcik7CiAJZXh0NF91cGRhdGVfZHhfZmxhZyhkaXIpOwotCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CisJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbGVhcl9pbm9kZTsKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogb3V0X3N0b3A6CisJYnJlbHNlKGRpcl9ibG9jayk7CiAJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7CkBAIC0xOTE5LDcgKzE5MzgsNyBAQAogCQkJfQogCQkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAkJfQotCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBkZSwgYmgsIG9mZnNldCkpIHsKKwkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBOVUxMLCBkZSwgYmgsIG9mZnNldCkpIHsKIAkJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGJoLT5iX2RhdGEgKwogCQkJCQkJCSBzYi0+c19ibG9ja3NpemUpOwogCQkJb2Zmc2V0ID0gKG9mZnNldCB8IChzYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOwpAQCAtMjQwNyw3ICsyNDI2LDExIEBACiAJCQkJCWV4dDRfY3VycmVudF90aW1lKG5ld19kaXIpOwogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBuZXdfZGlyKTsKIAkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBuZXdfZGlyLCBuZXdfYmgpOworCQlyZXR2YWwgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19kaXIsIG5ld19iaCk7CisJCWlmICh1bmxpa2VseShyZXR2YWwpKSB7CisJCQlleHQ0X3N0ZF9lcnJvcihuZXdfZGlyLT5pX3NiLCByZXR2YWwpOworCQkJZ290byBlbmRfcmVuYW1lOworCQl9CiAJCWJyZWxzZShuZXdfYmgpOwogCQluZXdfYmggPSBOVUxMOwogCX0KQEAgLTI0NTksNyArMjQ4MiwxMSBAQAogCQlQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhLCBuZXdfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkgPQogCQkJCQkJY3B1X3RvX2xlMzIobmV3X2Rpci0+aV9pbm8pOwogCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG9sZF9kaXIsIGRpcl9iaCk7CisJCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKKwkJaWYgKHJldHZhbCkgeworCQkJZXh0NF9zdGRfZXJyb3Iob2xkX2Rpci0+aV9zYiwgcmV0dmFsKTsKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwkJfQogCQlleHQ0X2RlY19jb3VudChoYW5kbGUsIG9sZF9kaXIpOwogCQlpZiAobmV3X2lub2RlKSB7CiAJCQkvKiBjaGVja2VkIGVtcHR5X2RpciBhYm92ZSwgY2FuJ3QgaGF2ZSBhbm90aGVyIHBhcmVudCwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFnZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKaW5kZXggYmVhY2NlMS4uNzI3MGRjZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKKysrIGIvZnMvZXh0NC9wYWdlLWlvLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlpZiAoaW9fcGFnZV9jYWNoZXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJaW9fZW5kX2NhY2hlcCA9IEtNRU1fQ0FDSEUoZXh0NF9pb19lbmQsIFNMQUJfUkVDTEFJTV9BQ0NPVU5UKTsKLQlpZiAoaW9fcGFnZV9jYWNoZXAgPT0gTlVMTCkgeworCWlmIChpb19lbmRfY2FjaGVwID09IE5VTEwpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGlvX3BhZ2VfY2FjaGVwKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTU4LDExICsxNTgsOCBAQAogCiBleHQ0X2lvX2VuZF90ICpleHQ0X2luaXRfaW9fZW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGdmcF90IGZsYWdzKQogewotCWV4dDRfaW9fZW5kX3QgKmlvID0gTlVMTDsKLQotCWlvID0ga21lbV9jYWNoZV9hbGxvYyhpb19lbmRfY2FjaGVwLCBmbGFncyk7CisJZXh0NF9pb19lbmRfdCAqaW8gPSBrbWVtX2NhY2hlX3phbGxvYyhpb19lbmRfY2FjaGVwLCBmbGFncyk7CiAJaWYgKGlvKSB7Ci0JCW1lbXNldChpbywgMCwgc2l6ZW9mKCppbykpOwogCQlhdG9taWNfaW5jKCZFWFQ0X0koaW5vZGUpLT5pX2lvZW5kX2NvdW50KTsKIAkJaW8tPmlub2RlID0gaW5vZGU7CiAJCUlOSVRfV09SSygmaW8tPndvcmssIGV4dDRfZW5kX2lvX3dvcmspOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9yZXNpemUuYyBiL2ZzL2V4dDQvcmVzaXplLmMKaW5kZXggOTgxYzg0Ny4uM2VjYzZlNCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9yZXNpemUuYworKysgYi9mcy9leHQ0L3Jlc2l6ZS5jCkBAIC0yMjAsNyArMjIwLDExIEBACiAJCW1lbWNweShnZGItPmJfZGF0YSwgc2JpLT5zX2dyb3VwX2Rlc2NbaV0tPmJfZGF0YSwgZ2RiLT5iX3NpemUpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7CiAJCXVubG9ja19idWZmZXIoZ2RiKTsKLQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYik7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQlicmVsc2UoZ2RiKTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjU4LDcgKzI2MiwxMSBAQAogCiAJZXh0NF9tYXJrX2JpdG1hcF9lbmQoaW5wdXQtPmJsb2Nrc19jb3VudCwgc2ItPnNfYmxvY2tzaXplICogOCwKIAkJCSAgICAgYmgtPmJfZGF0YSk7Ci0JZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CisJCWdvdG8gZXhpdF9iaDsKKwl9CiAJYnJlbHNlKGJoKTsKIAkvKiBNYXJrIHVudXNlZCBlbnRyaWVzIGluIGlub2RlIGJpdG1hcCB1c2VkICovCiAJZXh0NF9kZWJ1ZygiY2xlYXIgaW5vZGUgYml0bWFwICUjMDRsbHggKCslbGx1KVxuIiwKQEAgLTI3MCw3ICsyNzgsOSBAQAogCiAJZXh0NF9tYXJrX2JpdG1hcF9lbmQoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgc2ItPnNfYmxvY2tzaXplICogOCwKIAkJCSAgICAgYmgtPmJfZGF0YSk7Ci0JZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwogZXhpdF9iaDoKIAlicmVsc2UoYmgpOwogCkBAIC00MjIsMTcgKzQzMiwyMSBAQAogCQlnb3RvIGV4aXRfZGluZDsKIAl9CiAKLQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKSkpCisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOworCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGV4aXRfZGluZDsKIAotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCAqcHJpbWFyeSkpKQorCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgKnByaW1hcnkpOworCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGV4aXRfc2JoOwogCi0JaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpbmQpKSkKLQkJZ290byBleGl0X3ByaW1hcnk7CisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBkaW5kKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiAKIAkvKiBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoKSBnZXRzIGEgcmVmZXJlbmNlIG9uIHRoZSBpbG9jICovCi0JaWYgKChlcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpKSkKKwllcnIgPSBleHQ0X3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGV4aXRfZGluZGo7CiAKIAluX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKChnZGJfbnVtICsgMSkgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLApAQCAtNDU0LDEyICs0NjgsMjAgQEAKIAkgKiByZXNlcnZlZCBpbm9kZSwgYW5kIHdpbGwgYmVjb21lIEdEVCBibG9ja3MgKHByaW1hcnkgYW5kIGJhY2t1cCkuCiAJICovCiAJZGF0YVtnZGJfbnVtICUgRVhUNF9BRERSX1BFUl9CTE9DSyhzYildID0gMDsKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGRpbmQpOwotCWJyZWxzZShkaW5kKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGRpbmQpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOworCQlnb3RvIGV4aXRfaW5vZGU7CisJfQogCWlub2RlLT5pX2Jsb2NrcyAtPSAoZ2RiYWNrdXBzICsgMSkgKiBzYi0+c19ibG9ja3NpemUgPj4gOTsKIAlleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CiAJbWVtc2V0KCgqcHJpbWFyeSktPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsICpwcmltYXJ5KTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsICpwcmltYXJ5KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKKwkJZ290byBleGl0X2lub2RlOworCX0KKwlicmVsc2UoZGluZCk7CiAKIAlvX2dyb3VwX2Rlc2MgPSBFWFQ0X1NCKHNiKS0+c19ncm91cF9kZXNjOwogCW1lbWNweShuX2dyb3VwX2Rlc2MsIG9fZ3JvdXBfZGVzYywKQEAgLTQ3MCwxOSArNDkyLDE5IEBACiAJa2ZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwotCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJaWYgKGVycikKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogCiBleGl0X2lub2RlOgogCS8qIGV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGlsb2MuYmgpOyAqLwogCWJyZWxzZShpbG9jLmJoKTsKIGV4aXRfZGluZGo6CiAJLyogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgZGluZCk7ICovCi1leGl0X3ByaW1hcnk6Ci0JLyogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgKnByaW1hcnkpOyAqLwogZXhpdF9zYmg6Ci0JLyogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgKnByaW1hcnkpOyAqLworCS8qIGV4dDRfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7ICovCiBleGl0X2RpbmQ6CiAJYnJlbHNlKGRpbmQpOwogZXhpdF9iaDoKQEAgLTY2NSw3ICs2ODcsOSBAQAogCQkJbWVtc2V0KGJoLT5iX2RhdGEgKyBzaXplLCAwLCByZXN0KTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwotCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiAJCWJyZWxzZShiaCk7CiAJfQogCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCkBAIC04ODMsNyArOTA3LDExIEBACiAJLyogVXBkYXRlIHRoZSBnbG9iYWwgZnMgc2l6ZSBmaWVsZHMgKi8KIAlzYmktPnNfZ3JvdXBzX2NvdW50Kys7CiAKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHByaW1hcnkpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgcHJpbWFyeSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KIAogCS8qIFVwZGF0ZSB0aGUgcmVzZXJ2ZWQgYmxvY2sgY291bnRzIG9ubHkgb25jZSB0aGUgbmV3IGdyb3VwIGlzCiAJICogYWN0aXZlLiAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IGNkMzdmOWQuLmNiMTBhMDYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTM4OCwxMyArMzg4LDE0IEBACiB2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKIAkJICB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9DUklUICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczolZDogY29tbSAlczogIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBjdXJyZW50LT5jb21tKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6JWQ6IGNvbW0gJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBjdXJyZW50LT5jb21tLCAmdmFmKTsKIAl2YV9lbmQoYXJncyk7CiAKIAlleHQ0X2hhbmRsZV9lcnJvcihzYik7CkBAIC00MDUsMjggKzQwNiwzMSBAQAogCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7CiAKIAllcy0+c19sYXN0X2Vycm9yX2lubyA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CiAJZXMtPnNfbGFzdF9lcnJvcl9ibG9jayA9IGNwdV90b19sZTY0KGJsb2NrKTsKIAlzYXZlX2Vycm9yX2luZm8oaW5vZGUtPmlfc2IsIGZ1bmN0aW9uLCBsaW5lKTsKIAl2YV9zdGFydChhcmdzLCBmbXQpOworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6JWQ6IGlub2RlICMlbHU6ICIsCiAJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBmdW5jdGlvbiwgbGluZSwgaW5vZGUtPmlfaW5vKTsKIAlpZiAoYmxvY2spCi0JCXByaW50aygiYmxvY2sgJWxsdTogIiwgYmxvY2spOwotCXByaW50aygiY29tbSAlczogIiwgY3VycmVudC0+Y29tbSk7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiYmxvY2sgJWxsdTogIiwgYmxvY2spOworCXByaW50ayhLRVJOX0NPTlQgImNvbW0gJXM6ICVwVlxuIiwgY3VycmVudC0+Y29tbSwgJnZhZik7CiAJdmFfZW5kKGFyZ3MpOwogCiAJZXh0NF9oYW5kbGVfZXJyb3IoaW5vZGUtPmlfc2IpOwogfQogCiB2b2lkIGV4dDRfZXJyb3JfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSAgICAgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCQkgICAgIHVuc2lnbmVkIGludCBsaW5lLCBleHQ0X2ZzYmxrX3QgYmxvY2ssCisJCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CiAJY2hhciBwYXRobmFtZVs4MF0sICpwYXRoOwpAQCAtNDM0LDE3ICs0MzgsMTggQEAKIAllcyA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzOwogCWVzLT5zX2xhc3RfZXJyb3JfaW5vID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKIAlzYXZlX2Vycm9yX2luZm8oaW5vZGUtPmlfc2IsIGZ1bmN0aW9uLCBsaW5lKTsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwogCXBhdGggPSBkX3BhdGgoJihmaWxlLT5mX3BhdGgpLCBwYXRobmFtZSwgc2l6ZW9mKHBhdGhuYW1lKSk7Ci0JaWYgKCFwYXRoKQorCWlmIChJU19FUlIocGF0aCkpCiAJCXBhdGggPSAiKHVua25vd24pIjsKIAlwcmludGsoS0VSTl9DUklUCi0JICAgICAgICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczolZDogaW5vZGUgIyVsdSAiCi0JICAgICAgICIoY29tbSAlcyBwYXRoICVzKTogIiwKLQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBpbm9kZS0+aV9pbm8sCi0JICAgICAgIGN1cnJlbnQtPmNvbW0sIHBhdGgpOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisJICAgICAgICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczolZDogaW5vZGUgIyVsdTogIiwKKwkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBpbm9kZS0+aV9pbm8pOworCWlmIChibG9jaykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiYmxvY2sgJWxsdTogIiwgYmxvY2spOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKwlwcmludGsoS0VSTl9DT05UICJjb21tICVzOiBwYXRoICVzOiAlcFZcbiIsIGN1cnJlbnQtPmNvbW0sIHBhdGgsICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKIAogCWV4dDRfaGFuZGxlX2Vycm9yKGlub2RlLT5pX3NiKTsKQEAgLTU0MywyOCArNTQ4LDI5IEBACiAJCXBhbmljKCJFWFQ0LWZzIHBhbmljIGZyb20gcHJldmlvdXMgZXJyb3JcbiIpOwogfQogCi12b2lkIGV4dDRfbXNnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqcHJlZml4LAotCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3ZvaWQgZXh0NF9tc2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50aygiJXNFWFQ0LWZzICglcyk6ICIsIHByZWZpeCwgc2ItPnNfaWQpOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKwlwcmludGsoIiVzRVhUNC1mcyAoJXMpOiAlcFZcbiIsIHByZWZpeCwgc2ItPnNfaWQsICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKIH0KIAogdm9pZCBfX2V4dDRfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKIAkJICAgIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6JWQ6ICIsCi0JICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgbGluZSk7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6JWQ6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCAmdmFmKTsKIAl2YV9lbmQoYXJncyk7CiB9CiAKQEAgLTU3NSwyMSArNTgxLDI1IEBACiBfX3JlbGVhc2VzKGJpdGxvY2spCiBfX2FjcXVpcmVzKGJpdGxvY2spCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwogCiAJZXMtPnNfbGFzdF9lcnJvcl9pbm8gPSBjcHVfdG9fbGUzMihpbm8pOwogCWVzLT5zX2xhc3RfZXJyb3JfYmxvY2sgPSBjcHVfdG9fbGU2NChibG9jayk7CiAJX19zYXZlX2Vycm9yX2luZm8oc2IsIGZ1bmN0aW9uLCBsaW5lKTsKKwogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOwogCXByaW50ayhLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiVkOiBncm91cCAldSIsCiAJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgbGluZSwgZ3JwKTsKIAlpZiAoaW5vKQotCQlwcmludGsoImlub2RlICVsdTogIiwgaW5vKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiaW5vZGUgJWx1OiAiLCBpbm8pOwogCWlmIChibG9jaykKLQkJcHJpbnRrKCJibG9jayAlbGx1OiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9DT05UICJibG9jayAlbGx1OiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrKTsKKwlwcmludGsoS0VSTl9DT05UICIlcFZcbiIsICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX0NPTlQpKSB7CkBAIC02NDcsNyArNjU3LDcgQEAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWJkZXYgPSBibGtkZXZfZ2V0X2J5X2RldihkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCwgc2IpOwogCWlmIChJU19FUlIoYmRldikpCiAJCWdvdG8gZmFpbDsKIAlyZXR1cm4gYmRldjsKQEAgLTY2Myw4ICs2NzMsNyBAQAogICovCiBzdGF0aWMgaW50IGV4dDRfYmxrZGV2X3B1dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewotCWJkX3JlbGVhc2UoYmRldik7Ci0JcmV0dXJuIGJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJcmV0dXJuIGJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURXxGTU9ERV9FWENMKTsKIH0KIAogc3RhdGljIGludCBleHQ0X2Jsa2Rldl9yZW1vdmUoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpKQpAQCAtODA4LDIxICs4MTcsMTUgQEAKIAltZW1zZXQoJmVpLT5pX2NhY2hlZF9leHRlbnQsIDAsIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRfY2FjaGUpKTsKIAlJTklUX0xJU1RfSEVBRCgmZWktPmlfcHJlYWxsb2NfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmVpLT5pX3ByZWFsbG9jX2xvY2spOwotCS8qCi0JICogTm90ZTogIFdlIGNhbiBiZSBjYWxsZWQgYmVmb3JlIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgaXMgc2V0LAotCSAqIHRoZXJlZm9yZSBpdCBjYW4gYmUgbnVsbCBoZXJlLiAgRG9uJ3QgY2hlY2sgaXQsIGp1c3QgaW5pdGlhbGl6ZQotCSAqIGppbm9kZS4KLQkgKi8KLQlqYmQyX2pvdXJuYWxfaW5pdF9qYmRfaW5vZGUoJmVpLT5qaW5vZGUsICZlaS0+dmZzX2lub2RlKTsKIAllaS0+aV9yZXNlcnZlZF9kYXRhX2Jsb2NrcyA9IDA7CiAJZWktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MgPSAwOwogCWVpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyA9IDA7CiAJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gPSAwOwotCWVpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgPSAwOwogCXNwaW5fbG9ja19pbml0KCYoZWktPmlfYmxvY2tfcmVzZXJ2YXRpb25fbG9jaykpOwogI2lmZGVmIENPTkZJR19RVU9UQQogCWVpLT5pX3Jlc2VydmVkX3F1b3RhID0gMDsKICNlbmRpZgorCWVpLT5qaW5vZGUgPSBOVUxMOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9jb21wbGV0ZWRfaW9fbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrKTsKIAllaS0+Y3VyX2Fpb19kaW8gPSBOVUxMOwpAQCAtODk4LDkgKzkwMSwxMiBAQAogCWVuZF93cml0ZWJhY2soaW5vZGUpOwogCWRxdW90X2Ryb3AoaW5vZGUpOwogCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7Ci0JaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkpCi0JCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19qb3VybmFsLAotCQkJCSAgICAgICAmRVhUNF9JKGlub2RlKS0+amlub2RlKTsKKwlpZiAoRVhUNF9JKGlub2RlKS0+amlub2RlKSB7CisJCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShFWFQ0X0pPVVJOQUwoaW5vZGUpLAorCQkJCQkgICAgICAgRVhUNF9JKGlub2RlKS0+amlub2RlKTsKKwkJamJkMl9mcmVlX2lub2RlKEVYVDRfSShpbm9kZSktPmppbm9kZSk7CisJCUVYVDRfSShpbm9kZSktPmppbm9kZSA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9zaG93X3F1b3RhX29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZXEsCkBAIC0xMzkzLDcgKzEzOTksNyBAQAogCQlzYmktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQotCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOworCXNldF9vcHQoc2IsIFFVT1RBKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTQ0OCwyMSArMTQ1NCwyMSBAQAogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2JzZF9kZjoKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsIGRlcHJlY2F0ZWRfbXNnLCBwLCAiMi42LjM4Iik7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJY2xlYXJfb3B0KHNiLCBNSU5JWF9ERik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbWluaXhfZGY6CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCBkZXByZWNhdGVkX21zZywgcCwgIjIuNi4zOCIpOwotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBNSU5JWF9ERik7CisJCQlzZXRfb3B0KHNiLCBNSU5JWF9ERik7CiAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ncnBpZDoKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsIGRlcHJlY2F0ZWRfbXNnLCBwLCAiMi42LjM4Iik7Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUElEKTsKKwkJCXNldF9vcHQoc2IsIEdSUElEKTsKIAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vZ3JwaWQ6CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCBkZXByZWNhdGVkX21zZywgcCwgIjIuNi4zOCIpOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUElEKTsKKwkJCWNsZWFyX29wdChzYiwgR1JQSUQpOwogCiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmVzdWlkOgpAQCAtMTQ4MCwzOCArMTQ4NiwzOCBAQAogCQkJLyogKnNiX2Jsb2NrID0gbWF0Y2hfaW50KCZhcmdzWzBdKTsgKi8KIAkJCWJyZWFrOwogCQljYXNlIE9wdF9lcnJfcGFuaWM6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19QQU5JQyk7CisJCQljbGVhcl9vcHQoc2IsIEVSUk9SU19DT05UKTsKKwkJCWNsZWFyX29wdChzYiwgRVJST1JTX1JPKTsKKwkJCXNldF9vcHQoc2IsIEVSUk9SU19QQU5JQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZXJyX3JvOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOwotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOworCQkJY2xlYXJfb3B0KHNiLCBFUlJPUlNfQ09OVCk7CisJCQljbGVhcl9vcHQoc2IsIEVSUk9SU19QQU5JQyk7CisJCQlzZXRfb3B0KHNiLCBFUlJPUlNfUk8pOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Vycl9jb250OgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0KHNiLCBFUlJPUlNfUk8pOworCQkJY2xlYXJfb3B0KHNiLCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdChzYiwgRVJST1JTX0NPTlQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vdWlkMzI6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PX1VJRDMyKTsKKwkJCXNldF9vcHQoc2IsIE5PX1VJRDMyKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9kZWJ1ZzoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCQkJc2V0X29wdChzYiwgREVCVUcpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29sZGFsbG9jOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlzZXRfb3B0KHNiLCBPTERBTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfb3Jsb3Y6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgT0xEQUxMT0MpOworCQkJY2xlYXJfb3B0KHNiLCBPTERBTExPQyk7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCQljYXNlIE9wdF91c2VyX3hhdHRyOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCXNldF9vcHQoc2IsIFhBVFRSX1VTRVIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vdXNlcl94YXR0cjoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWNsZWFyX29wdChzYiwgWEFUVFJfVVNFUik7CiAJCQlicmVhazsKICNlbHNlCiAJCWNhc2UgT3B0X3VzZXJfeGF0dHI6CkBAIC0xNTIxLDEwICsxNTI3LDEwIEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wKIAkJY2FzZSBPcHRfYWNsOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQkJc2V0X29wdChzYiwgUE9TSVhfQUNMKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2FjbDoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQkJY2xlYXJfb3B0KHNiLCBQT1NJWF9BQ0wpOwogCQkJYnJlYWs7CiAjZWxzZQogCQljYXNlIE9wdF9hY2w6CkBAIC0xNTQzLDcgKzE1NDksNyBAQAogCQkJCQkgIkNhbm5vdCBzcGVjaWZ5IGpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CisJCQlzZXRfb3B0KHNiLCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9kZXY6CiAJCQlpZiAoaXNfcmVtb3VudCkgewpAQCAtMTU1NiwxNCArMTU2MiwxNCBAQAogCQkJKmpvdXJuYWxfZGV2bnVtID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfY2hlY2tzdW06Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfQ0hFQ0tTVU0pOworCQkJc2V0X29wdChzYiwgSk9VUk5BTF9DSEVDS1NVTSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9hc3luY19jb21taXQ6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfQVNZTkNfQ09NTUlUKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgSk9VUk5BTF9DSEVDS1NVTSk7CisJCQlzZXRfb3B0KHNiLCBKT1VSTkFMX0FTWU5DX0NPTU1JVCk7CisJCQlzZXRfb3B0KHNiLCBKT1VSTkFMX0NIRUNLU1VNKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2xvYWQ6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PTE9BRCk7CisJCQlzZXRfb3B0KHNiLCBOT0xPQUQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2NvbW1pdDoKIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQpAQCAtMTYwNiwxNSArMTYxMiwxNSBAQAogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQl9IGVsc2UgewotCQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0ZMQUdTKTsKKwkJCQljbGVhcl9vcHQoc2IsIERBVEFfRkxBR1MpOwogCQkJCXNiaS0+c19tb3VudF9vcHQgfD0gZGF0YV9vcHQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGF0YV9lcnJfYWJvcnQ6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRVJSX0FCT1JUKTsKKwkJCXNldF9vcHQoc2IsIERBVEFfRVJSX0FCT1JUKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9kYXRhX2Vycl9pZ25vcmU6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREFUQV9FUlJfQUJPUlQpOworCQkJY2xlYXJfb3B0KHNiLCBEQVRBX0VSUl9BQk9SVCk7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAkJY2FzZSBPcHRfdXNyanF1b3RhOgpAQCAtMTY1NCwxMiArMTY2MCwxMiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3F1b3RhOgogCQljYXNlIE9wdF91c3JxdW90YToKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOwotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7CisJCQlzZXRfb3B0KHNiLCBRVU9UQSk7CisJCQlzZXRfb3B0KHNiLCBVU1JRVU9UQSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZ3JwcXVvdGE6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOworCQkJc2V0X29wdChzYiwgUVVPVEEpOworCQkJc2V0X29wdChzYiwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vcXVvdGE6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikpIHsKQEAgLTE2NjcsOSArMTY3Myw5IEBACiAJCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIFVTUlFVT1RBKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisJCQljbGVhcl9vcHQoc2IsIFFVT1RBKTsKKwkJCWNsZWFyX29wdChzYiwgVVNSUVVPVEEpOworCQkJY2xlYXJfb3B0KHNiLCBHUlBRVU9UQSk7CiAJCQlicmVhazsKICNlbHNlCiAJCWNhc2UgT3B0X3F1b3RhOgpAQCAtMTY5NSw3ICsxNzAxLDcgQEAKIAkJCXNiaS0+c19tb3VudF9mbGFncyB8PSBFWFQ0X01GX0ZTX0FCT1JURUQ7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9iYXJyaWVyOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOworCQkJY2xlYXJfb3B0KHNiLCBCQVJSSUVSKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9iYXJyaWVyOgogCQkJaWYgKGFyZ3NbMF0uZnJvbSkgewpAQCAtMTcwNCw5ICsxNzEwLDkgQEAKIAkJCX0gZWxzZQogCQkJCW9wdGlvbiA9IDE7CS8qIE5vIGFyZ3VtZW50LCBkZWZhdWx0IHRvIDEgKi8KIAkJCWlmIChvcHRpb24pCi0JCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJCQlzZXRfb3B0KHNiLCBCQVJSSUVSKTsKIAkJCWVsc2UKLQkJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CisJCQkJY2xlYXJfb3B0KHNiLCBCQVJSSUVSKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pZ25vcmU6CiAJCQlicmVhazsKQEAgLTE3MzAsMTcgKzE3MzYsMTcgQEAKIAkJCQkgIklnbm9yaW5nIGRlcHJlY2F0ZWQgYmggb3B0aW9uIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaV92ZXJzaW9uOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBJX1ZFUlNJT04pOworCQkJc2V0X29wdChzYiwgSV9WRVJTSU9OKTsKIAkJCXNiLT5zX2ZsYWdzIHw9IE1TX0lfVkVSU0lPTjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2RlbGFsbG9jOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKKwkJCWNsZWFyX29wdChzYiwgREVMQUxMT0MpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X21ibGtfaW9fc3VibWl0OgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBNQkxLX0lPX1NVQk1JVCk7CisJCQlzZXRfb3B0KHNiLCBNQkxLX0lPX1NVQk1JVCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9tYmxrX2lvX3N1Ym1pdDoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBNQkxLX0lPX1NVQk1JVCk7CisJCQljbGVhcl9vcHQoc2IsIE1CTEtfSU9fU1VCTUlUKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9zdHJpcGU6CiAJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKQEAgLTE3NTAsMTMgKzE3NTYsMTMgQEAKIAkJCXNiaS0+c19zdHJpcGUgPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGVsYWxsb2M6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKKwkJCXNldF9vcHQoc2IsIERFTEFMTE9DKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ibG9ja192YWxpZGl0eToKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkxPQ0tfVkFMSURJVFkpOworCQkJc2V0X29wdChzYiwgQkxPQ0tfVkFMSURJVFkpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vYmxvY2tfdmFsaWRpdHk6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgQkxPQ0tfVkFMSURJVFkpOworCQkJY2xlYXJfb3B0KHNiLCBCTE9DS19WQUxJRElUWSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3M6CiAJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKQEAgLTE3ODAsNyArMTc4Niw3IEBACiAJCQkJCQkJICAgIG9wdGlvbik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9hdXRvX2RhX2FsbG9jOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LE5PX0FVVE9fREFfQUxMT0MpOworCQkJc2V0X29wdChzYiwgTk9fQVVUT19EQV9BTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfYXV0b19kYV9hbGxvYzoKIAkJCWlmIChhcmdzWzBdLmZyb20pIHsKQEAgLTE3ODksMjQgKzE3OTUsMjQgQEAKIAkJCX0gZWxzZQogCQkJCW9wdGlvbiA9IDE7CS8qIE5vIGFyZ3VtZW50LCBkZWZhdWx0IHRvIDEgKi8KIAkJCWlmIChvcHRpb24pCi0JCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PX0FVVE9fREFfQUxMT0MpOworCQkJCWNsZWFyX29wdChzYiwgTk9fQVVUT19EQV9BTExPQyk7CiAJCQllbHNlCi0JCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LE5PX0FVVE9fREFfQUxMT0MpOworCQkJCXNldF9vcHQoc2IsTk9fQVVUT19EQV9BTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGlzY2FyZDoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRElTQ0FSRCk7CisJCQlzZXRfb3B0KHNiLCBESVNDQVJEKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2Rpc2NhcmQ6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRElTQ0FSRCk7CisJCQljbGVhcl9vcHQoc2IsIERJU0NBUkQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Rpb3JlYWRfbm9sb2NrOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBESU9SRUFEX05PTE9DSyk7CisJCQlzZXRfb3B0KHNiLCBESU9SRUFEX05PTE9DSyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGlvcmVhZF9sb2NrOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJT1JFQURfTk9MT0NLKTsKKwkJCWNsZWFyX29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2luaXRfaW5vZGVfdGFibGU6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIElOSVRfSU5PREVfVEFCTEUpOworCQkJc2V0X29wdChzYiwgSU5JVF9JTk9ERV9UQUJMRSk7CiAJCQlpZiAoYXJnc1swXS5mcm9tKSB7CiAJCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCiAJCQkJCXJldHVybiAwOwpAQCAtMTgxNyw3ICsxODIzLDcgQEAKIAkJCXNiaS0+c19saV93YWl0X211bHQgPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9pbml0X2lub2RlX3RhYmxlOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIElOSVRfSU5PREVfVEFCTEUpOworCQkJY2xlYXJfb3B0KHNiLCBJTklUX0lOT0RFX1RBQkxFKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLApAQCAtMTgyOSwxMCArMTgzNSwxMCBAQAogI2lmZGVmIENPTkZJR19RVU9UQQogCWlmIChzYmktPnNfcWZfbmFtZXNbVVNSUVVPVEFdIHx8IHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKIAkJaWYgKHRlc3Rfb3B0KHNiLCBVU1JRVU9UQSkgJiYgc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSkKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7CisJCQljbGVhcl9vcHQoc2IsIFVTUlFVT1RBKTsKIAogCQlpZiAodGVzdF9vcHQoc2IsIEdSUFFVT1RBKSAmJiBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKQotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKKwkJCWNsZWFyX29wdChzYiwgR1JQUVVPVEEpOwogCiAJCWlmICh0ZXN0X29wdChzYiwgR1JQUVVPVEEpIHx8IHRlc3Rfb3B0KHNiLCBVU1JRVU9UQSkpIHsKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm9sZCBhbmQgbmV3IHF1b3RhICIKQEAgLTE5MDIsMTIgKzE5MDgsMTIgQEAKIAlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCiAJCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JXUsICIKLQkJCQkiYnBnPSVsdSwgaXBnPSVsdSwgbW89JTA0eF1cbiIsCisJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNHgsIG1vMj0lMDR4XVxuIiwKIAkJCXNiLT5zX2Jsb2Nrc2l6ZSwKIAkJCXNiaS0+c19ncm91cHNfY291bnQsCiAJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAogCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKLQkJCXNiaS0+c19tb3VudF9vcHQpOworCQkJc2JpLT5zX21vdW50X29wdCwgc2JpLT5zX21vdW50X29wdDIpOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTE5MzcsMTQgKzE5NDMsMTMgQEAKIAlzaXplID0gZmxleF9ncm91cF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgZmxleF9ncm91cHMpOwogCXNiaS0+c19mbGV4X2dyb3VwcyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7Ci0JCXNiaS0+c19mbGV4X2dyb3VwcyA9IHZtYWxsb2Moc2l6ZSk7Ci0JCWlmIChzYmktPnNfZmxleF9ncm91cHMpCi0JCQltZW1zZXQoc2JpLT5zX2ZsZXhfZ3JvdXBzLCAwLCBzaXplKTsKLQl9Ci0JaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7Ci0JCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAiCi0JCQkJIiV1IGZsZXggZ3JvdXBzIiwgZmxleF9ncm91cF9jb3VudCk7Ci0JCWdvdG8gZmFpbGVkOworCQlzYmktPnNfZmxleF9ncm91cHMgPSB2emFsbG9jKHNpemUpOworCQlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzID09IE5VTEwpIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAldSBmbGV4IGdyb3VwcyIsCisJCQkJIGZsZXhfZ3JvdXBfY291bnQpOworCQkJZ290byBmYWlsZWQ7CisJCX0KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CkBAIC0yOTIzLDcgKzI5MjgsNyBAQAogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X2xpX3JlcXVlc3QgKmVscjsKIAlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKHNiaS0+c19saV9yZXF1ZXN0ICE9IE5VTEwpCiAJCXJldHVybiAwOwpAQCAtMzA3OCw0MSArMzA4Myw0MSBAQAogCiAJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLwogCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKLQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIElOSVRfSU5PREVfVEFCTEUpOworCXNldF9vcHQoc2IsIElOSVRfSU5PREVfVEFCTEUpOwogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9ERUJVRykKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CisJCXNldF9vcHQoc2IsIERFQlVHKTsKIAlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fQlNER1JPVVBTKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsIGRlcHJlY2F0ZWRfbXNnLCAiYnNkZ3JvdXBzIiwKIAkJCSIyLjYuMzgiKTsKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCXNldF9vcHQoc2IsIEdSUElEKTsKIAl9CiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX1VJRDE2KQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PX1VJRDMyKTsKKwkJc2V0X29wdChzYiwgTk9fVUlEMzIpOwogI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1hBVFRSCiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX1hBVFRSX1VTRVIpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCXNldF9vcHQoc2IsIFhBVFRSX1VTRVIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0FDTCkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQlzZXRfb3B0KHNiLCBQT1NJWF9BQ0wpOwogI2VuZGlmCiAJaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9KTU9ERSkgPT0gRVhUNF9ERUZNX0pNT0RFX0RBVEEpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgSk9VUk5BTF9EQVRBKTsKKwkJc2V0X29wdChzYiwgSk9VUk5BTF9EQVRBKTsKIAllbHNlIGlmICgoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fSk1PREUpID09IEVYVDRfREVGTV9KTU9ERV9PUkRFUkVEKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE9SREVSRURfREFUQSk7CisJCXNldF9vcHQoc2IsIE9SREVSRURfREFUQSk7CiAJZWxzZSBpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0pNT0RFKSA9PSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0spCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgV1JJVEVCQUNLX0RBVEEpOworCQlzZXRfb3B0KHNiLCBXUklURUJBQ0tfREFUQSk7CiAKIAlpZiAobGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX2Vycm9ycykgPT0gRVhUNF9FUlJPUlNfUEFOSUMpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKKwkJc2V0X29wdChzYiwgRVJST1JTX1BBTklDKTsKIAllbHNlIGlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQ0X0VSUk9SU19DT05USU5VRSkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CisJCXNldF9vcHQoc2IsIEVSUk9SU19DT05UKTsKIAllbHNlCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJc2V0X29wdChzYiwgRVJST1JTX1JPKTsKIAlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fQkxPQ0tfVkFMSURJVFkpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkxPQ0tfVkFMSURJVFkpOworCQlzZXRfb3B0KHNiLCBCTE9DS19WQUxJRElUWSk7CiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0RJU0NBUkQpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRElTQ0FSRCk7CisJCXNldF9vcHQoc2IsIERJU0NBUkQpOwogCiAJc2JpLT5zX3Jlc3VpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXN1aWQpOwogCXNiaS0+c19yZXNnaWQgPSBsZTE2X3RvX2NwdShlcy0+c19kZWZfcmVzZ2lkKTsKQEAgLTMxMjEsNyArMzEyNiw3IEBACiAJc2JpLT5zX21heF9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CiAKIAlpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX05PQkFSUklFUikgPT0gMCkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJc2V0X29wdChzYiwgQkFSUklFUik7CiAKIAkvKgogCSAqIGVuYWJsZSBkZWxheWVkIGFsbG9jYXRpb24gYnkgZGVmYXVsdApAQCAtMzEyOSw3ICszMTM0LDcgQEAKIAkgKi8KIAlpZiAoIUlTX0VYVDNfU0Ioc2IpICYmCiAJICAgICgoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fTk9ERUxBTExPQykgPT0gMCkpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVMQUxMT0MpOworCQlzZXRfb3B0KHNiLCBERUxBTExPQyk7CiAKIAlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgc2JpLT5zX2VzLT5zX21vdW50X29wdHMsIHNiLAogCQkJICAgJmpvdXJuYWxfZGV2bnVtLCAmam91cm5hbF9pb3ByaW8sIE5VTEwsIDApKSB7CkBAIC0zNDMyLDggKzM0MzcsOCBAQAogCQkgICAgICAgInN1cHByZXNzZWQgYW5kIG5vdCBtb3VudGVkIHJlYWQtb25seSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudF93cTsKIAl9IGVsc2UgewotCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREFUQV9GTEFHUyk7Ci0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgV1JJVEVCQUNLX0RBVEEpOworCQljbGVhcl9vcHQoc2IsIERBVEFfRkxBR1MpOworCQlzZXRfb3B0KHNiLCBXUklURUJBQ0tfREFUQSk7CiAJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKIAkJbmVlZHNfcmVjb3ZlcnkgPSAwOwogCQlnb3RvIG5vX2pvdXJuYWw7CkBAIC0zNDcxLDkgKzM0NzYsOSBAQAogCQkgKi8KIAkJaWYgKGpiZDJfam91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKIAkJICAgIChzYmktPnNfam91cm5hbCwgMCwgMCwgSkJEMl9GRUFUVVJFX0lOQ09NUEFUX1JFVk9LRSkpCi0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIE9SREVSRURfREFUQSk7CisJCQlzZXRfb3B0KHNiLCBPUkRFUkVEX0RBVEEpOwogCQllbHNlCi0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfREFUQSk7CisJCQlzZXRfb3B0KHNiLCBKT1VSTkFMX0RBVEEpOwogCQlicmVhazsKIAogCWNhc2UgRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEE6CkBAIC0zNTYzLDE4ICszNTY4LDE4IEBACiAJICAgICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEpKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkZWxhbGxvYyBvcHRpb24gLSAiCiAJCQkgInJlcXVlc3RlZCBkYXRhIGpvdXJuYWxpbmcgbW9kZSIpOwotCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREVMQUxMT0MpOworCQljbGVhcl9vcHQoc2IsIERFTEFMTE9DKTsKIAl9CiAJaWYgKHRlc3Rfb3B0KHNiLCBESU9SRUFEX05PTE9DSykpIHsKIAkJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkgewogCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIGRpb3JlYWRfbm9sb2NrICIKIAkJCQkib3B0aW9uIC0gcmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRElPUkVBRF9OT0xPQ0spOworCQkJY2xlYXJfb3B0KHNiLCBESU9SRUFEX05PTE9DSyk7CiAJCX0KIAkJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSA8IFBBR0VfU0laRSkgewogCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIGRpb3JlYWRfbm9sb2NrICIKIAkJCQkib3B0aW9uIC0gYmxvY2sgc2l6ZSBpcyB0b28gc21hbGwiKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBESU9SRUFEX05PTE9DSyk7CisJCQljbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTsKIAkJfQogCX0KIApAQCAtMzc3MiwxMyArMzc3Nyw2IEBACiAJaWYgKGJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoYmRfY2xhaW0oYmRldiwgc2IpKSB7Ci0JCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKLQkJCSJmYWlsZWQgdG8gY2xhaW0gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UiKTsKLQkJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCWhibG9jayA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpOwogCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKQEAgLTQxNzMsNiArNDE3MSwyMiBAQAogCXJldHVybiAwOwogfQogCisvKgorICogU3RydWN0dXJlIHRvIHNhdmUgbW91bnQgb3B0aW9ucyBmb3IgZXh0NF9yZW1vdW50J3MgYmVuZWZpdAorICovCitzdHJ1Y3QgZXh0NF9tb3VudF9vcHRpb25zIHsKKwl1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OworCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQyOworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CisJdTMyIHNfbWluX2JhdGNoX3RpbWUsIHNfbWF4X2JhdGNoX3RpbWU7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IHNfanF1b3RhX2ZtdDsKKwljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgZXh0NF9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCiB7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwpAQCAtNDE5Myw2ICs0MjA3LDcgQEAKIAlsb2NrX3N1cGVyKHNiKTsKIAlvbGRfc2JfZmxhZ3MgPSBzYi0+c19mbGFnczsKIAlvbGRfb3B0cy5zX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJb2xkX29wdHMuc19tb3VudF9vcHQyID0gc2JpLT5zX21vdW50X29wdDI7CiAJb2xkX29wdHMuc19yZXN1aWQgPSBzYmktPnNfcmVzdWlkOwogCW9sZF9vcHRzLnNfcmVzZ2lkID0gc2JpLT5zX3Jlc2dpZDsKIAlvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbCA9IHNiaS0+c19jb21taXRfaW50ZXJ2YWw7CkBAIC00MzQ2LDYgKzQzNjEsNyBAQAogcmVzdG9yZV9vcHRzOgogCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOwogCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5zX21vdW50X29wdDsKKwlzYmktPnNfbW91bnRfb3B0MiA9IG9sZF9vcHRzLnNfbW91bnRfb3B0MjsKIAlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CiAJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOwogCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuYyBiL2ZzL2V4dDQveGF0dHIuYwppbmRleCBmYTRiODk5Li5mYzMyMTc2IDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmMKKysrIGIvZnMvZXh0NC94YXR0ci5jCkBAIC00MjcsMjMgKzQyNywyMyBAQAogc3RhdGljIGludAogZXh0NF94YXR0cl9saXN0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCiB7Ci0JaW50IGlfZXJyb3IsIGJfZXJyb3I7CisJaW50IHJldCwgcmV0MjsKIAogCWRvd25fcmVhZCgmRVhUNF9JKGRlbnRyeS0+ZF9pbm9kZSktPnhhdHRyX3NlbSk7Ci0JaV9lcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfbGlzdChkZW50cnksIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotCWlmIChpX2Vycm9yIDwgMCkgewotCQliX2Vycm9yID0gMDsKLQl9IGVsc2UgewotCQlpZiAoYnVmZmVyKSB7Ci0JCQlidWZmZXIgKz0gaV9lcnJvcjsKLQkJCWJ1ZmZlcl9zaXplIC09IGlfZXJyb3I7Ci0JCX0KLQkJYl9lcnJvciA9IGV4dDRfeGF0dHJfYmxvY2tfbGlzdChkZW50cnksIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotCQlpZiAoYl9lcnJvciA8IDApCi0JCQlpX2Vycm9yID0gMDsKKwlyZXQgPSByZXQyID0gZXh0NF94YXR0cl9pYm9keV9saXN0KGRlbnRyeSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3V0OworCWlmIChidWZmZXIpIHsKKwkJYnVmZmVyICs9IHJldDsKKwkJYnVmZmVyX3NpemUgLT0gcmV0OwogCX0KKwlyZXQgPSBleHQ0X3hhdHRyX2Jsb2NrX2xpc3QoZGVudHJ5LCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvdXQ7CisJcmV0ICs9IHJldDI7CitlcnJvdXQ6CiAJdXBfcmVhZCgmRVhUNF9JKGRlbnRyeS0+ZF9pbm9kZSktPnhhdHRyX3NlbSk7Ci0JcmV0dXJuIGlfZXJyb3IgKyBiX2Vycm9yOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC05NDcsNyArOTQ3LDcgQEAKIC8qCiAgKiBleHQ0X3hhdHRyX3NldF9oYW5kbGUoKQogICoKLSAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiAgVmFsdWUKICAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCiAgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAogICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0LmggYi9mcy9mYXQvZmF0LmgKaW5kZXggZDc1YTc3Zi4uZjUwNDA4OSAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZhdC5oCisrKyBiL2ZzL2ZhdC9mYXQuaApAQCAtMzE5LDcgKzMxOSw4IEBACiAJCQlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZSwgbG9mZl90IGlfcG9zKTsKIGV4dGVybiBpbnQgZmF0X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gaW50IGZhdF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQsCi0JCQljb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqZnNfZGlyX2lub2RlX29wcywgaW50IGlzdmZhdCk7CisJCQljb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqZnNfZGlyX2lub2RlX29wcywKKwkJCWludCBpc3ZmYXQsIHZvaWQgKCpzZXR1cCkoc3RydWN0IHN1cGVyX2Jsb2NrICopKTsKIAogZXh0ZXJuIGludCBmYXRfZmx1c2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqaTEsCiAJCSAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaTIpOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCAyMDYzNTFhLi44Njc1M2ZlIDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtNzAzLDcgKzcwMyw2IEBACiAJCXN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGRlbnRyeSAqcmVzdWx0OwogCXUzMiAqZmggPSBmaWQtPnJhdzsKIAogCWlmIChmaF9sZW4gPCA1IHx8IGZoX3R5cGUgIT0gMykKQEAgLTc0OCwxMCArNzQ3LDcgQEAKIAkgKiB0aGUgZmF0X2lnZXQgbG9va3VwIGFnYWluLiAgSWYgdGhhdCBmYWlscywgdGhlbiB3ZSBhcmUgdG90YWxseSBvdXQKIAkgKiBvZiBsdWNrLiAgQnV0IGFsbCB0aGF0IGlzIGZvciBhbm90aGVyIGRheQogCSAqLwotCXJlc3VsdCA9IGRfb2J0YWluX2FsaWFzKGlub2RlKTsKLQlpZiAoIUlTX0VSUihyZXN1bHQpKQotCQlkX3NldF9kX29wKHJlc3VsdCwgc2ItPnNfcm9vdC0+ZF9vcCk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOwogfQogCiBzdGF0aWMgaW50CkBAIC03OTksOCArNzk1LDYgQEAKIAlicmVsc2UoYmgpOwogCiAJcGFyZW50ID0gZF9vYnRhaW5fYWxpYXMoaW5vZGUpOwotCWlmICghSVNfRVJSKHBhcmVudCkpCi0JCWRfc2V0X2Rfb3AocGFyZW50LCBzYi0+c19yb290LT5kX29wKTsKIG91dDoKIAl1bmxvY2tfc3VwZXIoc2IpOwogCkBAIC0xMjQ0LDcgKzEyMzgsOCBAQAogICogUmVhZCB0aGUgc3VwZXIgYmxvY2sgb2YgYW4gTVMtRE9TIEZTLgogICovCiBpbnQgZmF0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCwKLQkJICAgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgKmZzX2Rpcl9pbm9kZV9vcHMsIGludCBpc3ZmYXQpCisJCSAgIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICpmc19kaXJfaW5vZGVfb3BzLCBpbnQgaXN2ZmF0LAorCQkgICB2b2lkICgqc2V0dXApKHN0cnVjdCBzdXBlcl9ibG9jayAqKSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGUgPSBOVUxMLCAqZmF0X2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwpAQCAtMTI4MCw2ICsxMjc1LDggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X2ZhaWw7CiAKKwlzZXR1cChzYik7IC8qIGZsYXZvdXItc3BlY2lmaWMgc3R1ZmYgdGhhdCBuZWVkcyBvcHRpb25zICovCisKIAllcnJvciA9IC1FSU87CiAJc2JfbWluX2Jsb2Nrc2l6ZShzYiwgNTEyKTsKIAliaCA9IHNiX2JyZWFkKHNiLCAwKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9uYW1laV9tc2Rvcy5jIGIvZnMvZmF0L25hbWVpX21zZG9zLmMKaW5kZXggMzVmZmU0My4uNzExNDk5MCAxMDA2NDQKLS0tIGEvZnMvZmF0L25hbWVpX21zZG9zLmMKKysrIGIvZnMvZmF0L25hbWVpX21zZG9zLmMKQEAgLTIyNywxMSArMjI3LDcgQEAKIAl9CiBvdXQ6CiAJdW5sb2NrX3N1cGVyKHNiKTsKLQlkX3NldF9kX29wKGRlbnRyeSwgJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zKTsKLQlkZW50cnkgPSBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKLQlpZiAoZGVudHJ5KQotCQlkX3NldF9kX29wKGRlbnRyeSwgJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zKTsKLQlyZXR1cm4gZGVudHJ5OworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIAogZXJyb3I6CiAJdW5sb2NrX3N1cGVyKHNiKTsKQEAgLTY2MSwyMSArNjU3LDE2IEBACiAJLmdldGF0dHIJPSBmYXRfZ2V0YXR0ciwKIH07CiAKK3N0YXRpYyB2b2lkIHNldHVwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc2ItPnNfZF9vcCA9ICZtc2Rvc19kZW50cnlfb3BlcmF0aW9uczsKKwlzYi0+c19mbGFncyB8PSBNU19OT0FUSU1FOworfQorCiBzdGF0aWMgaW50IG1zZG9zX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLQlpbnQgcmVzOwotCi0JbG9ja19zdXBlcihzYik7Ci0JcmVzID0gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJm1zZG9zX2Rpcl9pbm9kZV9vcGVyYXRpb25zLCAwKTsKLQlpZiAocmVzKSB7Ci0JCXVubG9ja19zdXBlcihzYik7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0Jc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKLQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZtc2Rvc19kZW50cnlfb3BlcmF0aW9ucyk7Ci0JdW5sb2NrX3N1cGVyKHNiKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJm1zZG9zX2Rpcl9pbm9kZV9vcGVyYXRpb25zLAorCQkJICAgICAwLCBzZXR1cCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICptc2Rvc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9uYW1laV92ZmF0LmMgYi9mcy9mYXQvbmFtZWlfdmZhdC5jCmluZGV4IGUzZmZjNWUuLmY4OGY3NTIgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9uYW1laV92ZmF0LmMKKysrIGIvZnMvZmF0L25hbWVpX3ZmYXQuYwpAQCAtNzcyLDEzICs3NzIsMTAgQEAKIAogb3V0OgogCXVubG9ja19zdXBlcihzYik7Ci0JZF9zZXRfZF9vcChkZW50cnksIHNiLT5zX3Jvb3QtPmRfb3ApOwogCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOwogCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwotCWlmIChkZW50cnkpIHsKLQkJZF9zZXRfZF9vcChkZW50cnksIHNiLT5zX3Jvb3QtPmRfb3ApOworCWlmIChkZW50cnkpCiAJCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOwotCX0KIAlyZXR1cm4gZGVudHJ5OwogCiBlcnJvcjoKQEAgLTEwNjYsMjQgKzEwNjMsMTggQEAKIAkuZ2V0YXR0cgk9IGZhdF9nZXRhdHRyLAogfTsKIAorc3RhdGljIHZvaWQgc2V0dXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoTVNET1NfU0Ioc2IpLT5vcHRpb25zLm5hbWVfY2hlY2sgIT0gJ3MnKQorCQlzYi0+c19kX29wID0gJnZmYXRfY2lfZGVudHJ5X29wczsKKwllbHNlCisJCXNiLT5zX2Rfb3AgPSAmdmZhdF9kZW50cnlfb3BzOworfQorCiBzdGF0aWMgaW50IHZmYXRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewotCWludCByZXM7Ci0KLQlsb2NrX3N1cGVyKHNiKTsKLQlyZXMgPSBmYXRfZmlsbF9zdXBlcihzYiwgZGF0YSwgc2lsZW50LCAmdmZhdF9kaXJfaW5vZGVfb3BlcmF0aW9ucywgMSk7Ci0JaWYgKHJlcykgewotCQl1bmxvY2tfc3VwZXIoc2IpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCWlmIChNU0RPU19TQihzYiktPm9wdGlvbnMubmFtZV9jaGVjayAhPSAncycpCi0JCWRfc2V0X2Rfb3Aoc2ItPnNfcm9vdCwgJnZmYXRfY2lfZGVudHJ5X29wcyk7Ci0JZWxzZQotCQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZ2ZmF0X2RlbnRyeV9vcHMpOwotCi0JdW5sb2NrX3N1cGVyKHNiKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJnZmYXRfZGlyX2lub2RlX29wZXJhdGlvbnMsCisJCQkgICAgIDEsIHNldHVwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnZmYXRfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCmRpZmYgLS1naXQgYS9mcy9mcy13cml0ZWJhY2suYyBiL2ZzL2ZzLXdyaXRlYmFjay5jCmluZGV4IDNkMDZjY2MuLjU5YzZlNDkgMTAwNjQ0Ci0tLSBhL2ZzL2ZzLXdyaXRlYmFjay5jCisrKyBiL2ZzL2ZzLXdyaXRlYmFjay5jCkBAIC04NCwxMyArODQsOSBAQAogCXJldHVybiBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBpbm9kZSwgaV93Yl9saXN0KTsKIH0KIAotc3RhdGljIHZvaWQgYmRpX3F1ZXVlX3dvcmsoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKLQkJc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrKQorLyogV2FrZXVwIGZsdXNoZXIgdGhyZWFkIG9yIGZvcmtlciB0aHJlYWQgdG8gZm9yayBpdC4gUmVxdWlyZXMgYmRpLT53Yl9sb2NrLiAqLworc3RhdGljIHZvaWQgYmRpX3dha2V1cF9mbHVzaGVyKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCiB7Ci0JdHJhY2Vfd3JpdGViYWNrX3F1ZXVlKGJkaSwgd29yayk7Ci0KLQlzcGluX2xvY2tfYmgoJmJkaS0+d2JfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmd29yay0+bGlzdCwgJmJkaS0+d29ya19saXN0KTsKIAlpZiAoYmRpLT53Yi50YXNrKSB7CiAJCXdha2VfdXBfcHJvY2VzcyhiZGktPndiLnRhc2spOwogCX0gZWxzZSB7CkBAIC05OCwxNSArOTQsMjYgQEAKIAkJICogVGhlIGJkaSB0aHJlYWQgaXNuJ3QgdGhlcmUsIHdha2UgdXAgdGhlIGZvcmtlciB0aHJlYWQgd2hpY2gKIAkJICogd2lsbCBjcmVhdGUgYW5kIHJ1biBpdC4KIAkJICovCi0JCXRyYWNlX3dyaXRlYmFja19ub3RocmVhZChiZGksIHdvcmspOwogCQl3YWtlX3VwX3Byb2Nlc3MoZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvLndiLnRhc2spOwogCX0KK30KKworc3RhdGljIHZvaWQgYmRpX3F1ZXVlX3dvcmsoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwKKwkJCSAgIHN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayAqd29yaykKK3sKKwl0cmFjZV93cml0ZWJhY2tfcXVldWUoYmRpLCB3b3JrKTsKKworCXNwaW5fbG9ja19iaCgmYmRpLT53Yl9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ3b3JrLT5saXN0LCAmYmRpLT53b3JrX2xpc3QpOworCWlmICghYmRpLT53Yi50YXNrKQorCQl0cmFjZV93cml0ZWJhY2tfbm90aHJlYWQoYmRpLCB3b3JrKTsKKwliZGlfd2FrZXVwX2ZsdXNoZXIoYmRpKTsKIAlzcGluX3VubG9ja19iaCgmYmRpLT53Yl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKIF9fYmRpX3N0YXJ0X3dyaXRlYmFjayhzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLCBsb25nIG5yX3BhZ2VzLAotCQlib29sIHJhbmdlX2N5Y2xpYywgYm9vbCBmb3JfYmFja2dyb3VuZCkKKwkJICAgICAgYm9vbCByYW5nZV9jeWNsaWMpCiB7CiAJc3RydWN0IHdiX3dyaXRlYmFja193b3JrICp3b3JrOwogCkBAIC0xMjYsNyArMTMzLDYgQEAKIAl3b3JrLT5zeW5jX21vZGUJPSBXQl9TWU5DX05PTkU7CiAJd29yay0+bnJfcGFnZXMJPSBucl9wYWdlczsKIAl3b3JrLT5yYW5nZV9jeWNsaWMgPSByYW5nZV9jeWNsaWM7Ci0Jd29yay0+Zm9yX2JhY2tncm91bmQgPSBmb3JfYmFja2dyb3VuZDsKIAogCWJkaV9xdWV1ZV93b3JrKGJkaSwgd29yayk7CiB9CkBAIC0xNDQsNyArMTUwLDcgQEAKICAqLwogdm9pZCBiZGlfc3RhcnRfd3JpdGViYWNrKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGxvbmcgbnJfcGFnZXMpCiB7Ci0JX19iZGlfc3RhcnRfd3JpdGViYWNrKGJkaSwgbnJfcGFnZXMsIHRydWUsIGZhbHNlKTsKKwlfX2JkaV9zdGFydF93cml0ZWJhY2soYmRpLCBucl9wYWdlcywgdHJ1ZSk7CiB9CiAKIC8qKgpAQCAtMTUyLDEzICsxNTgsMjEgQEAKICAqIEBiZGk6IHRoZSBiYWNraW5nIGRldmljZSB0byB3cml0ZSBmcm9tCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIFRoaXMgZG9lcyBXQl9TWU5DX05PTkUgYmFja2dyb3VuZCB3cml0ZWJhY2suIFRoZSBJTyBpcyBvbmx5Ci0gKiAgIHN0YXJ0ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHdlIG1ha2Ugbm8gZ3VhcmVudGVlcyBvbgotICogICBjb21wbGV0aW9uLiBDYWxsZXIgbmVlZCBub3QgaG9sZCBzYiBzX3Vtb3VudCBzZW1hcGhvcmUuCisgKiAgIFRoaXMgbWFrZXMgc3VyZSBXQl9TWU5DX05PTkUgYmFja2dyb3VuZCB3cml0ZWJhY2sgaGFwcGVucy4gV2hlbgorICogICB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIGl0IGlzIG9ubHkgZ3VhcmFudGVlZCB0aGF0IGZvciBnaXZlbiBCREkKKyAqICAgc29tZSBJTyBpcyBoYXBwZW5pbmcgaWYgd2UgYXJlIG92ZXIgYmFja2dyb3VuZCBkaXJ0eSB0aHJlc2hvbGQuCisgKiAgIENhbGxlciBuZWVkIG5vdCBob2xkIHNiIHNfdW1vdW50IHNlbWFwaG9yZS4KICAqLwogdm9pZCBiZGlfc3RhcnRfYmFja2dyb3VuZF93cml0ZWJhY2soc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKIHsKLQlfX2JkaV9zdGFydF93cml0ZWJhY2soYmRpLCBMT05HX01BWCwgdHJ1ZSwgdHJ1ZSk7CisJLyoKKwkgKiBXZSBqdXN0IHdha2UgdXAgdGhlIGZsdXNoZXIgdGhyZWFkLiBJdCB3aWxsIHBlcmZvcm0gYmFja2dyb3VuZAorCSAqIHdyaXRlYmFjayBhcyBzb29uIGFzIHRoZXJlIGlzIG5vIG90aGVyIHdvcmsgdG8gZG8uCisJICovCisJdHJhY2Vfd3JpdGViYWNrX3dha2VfYmFja2dyb3VuZChiZGkpOworCXNwaW5fbG9ja19iaCgmYmRpLT53Yl9sb2NrKTsKKwliZGlfd2FrZXVwX2ZsdXNoZXIoYmRpKTsKKwlzcGluX3VubG9ja19iaCgmYmRpLT53Yl9sb2NrKTsKIH0KIAogLyoKQEAgLTYxNiw2ICs2MzAsNyBAQAogCX07CiAJdW5zaWduZWQgbG9uZyBvbGRlc3RfamlmOwogCWxvbmcgd3JvdGUgPSAwOworCWxvbmcgd3JpdGVfY2h1bms7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAogCWlmICh3YmMuZm9yX2t1cGRhdGUpIHsKQEAgLTYyOCw2ICs2NDMsMjQgQEAKIAkJd2JjLnJhbmdlX2VuZCA9IExMT05HX01BWDsKIAl9CiAKKwkvKgorCSAqIFdCX1NZTkNfQUxMIG1vZGUgZG9lcyBsaXZlbG9jayBhdm9pZGFuY2UgYnkgc3luY2luZyBkaXJ0eQorCSAqIGlub2Rlcy9wYWdlcyBpbiBvbmUgYmlnIGxvb3AuIFNldHRpbmcgd2JjLm5yX3RvX3dyaXRlPUxPTkdfTUFYCisJICogaGVyZSBhdm9pZHMgY2FsbGluZyBpbnRvIHdyaXRlYmFja19pbm9kZXNfd2IoKSBtb3JlIHRoYW4gb25jZS4KKwkgKgorCSAqIFRoZSBpbnRlbmRlZCBjYWxsIHNlcXVlbmNlIGZvciBXQl9TWU5DX0FMTCB3cml0ZWJhY2sgaXM6CisJICoKKwkgKiAgICAgIHdiX3dyaXRlYmFjaygpCisJICogICAgICAgICAgX193cml0ZWJhY2tfaW5vZGVzX3NiKCkgICAgIDw9PSBjYWxsZWQgb25seSBvbmNlCisJICogICAgICAgICAgICAgIHdyaXRlX2NhY2hlX3BhZ2VzKCkgICAgIDw9PSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbm9kZQorCSAqICAgICAgICAgICAgICAgICAgIChxdWlja2x5KSB0YWcgY3VycmVudGx5IGRpcnR5IHBhZ2VzCisJICogICAgICAgICAgICAgICAgICAgKG1heWJlIHNsb3dseSkgc3luYyBhbGwgdGFnZ2VkIHBhZ2VzCisJICovCisJaWYgKHdiYy5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKQorCQl3cml0ZV9jaHVuayA9IE1BWF9XUklURUJBQ0tfUEFHRVM7CisJZWxzZQorCQl3cml0ZV9jaHVuayA9IExPTkdfTUFYOworCiAJd2JjLndiX3N0YXJ0ID0gamlmZmllczsgLyogbGl2ZWxvY2sgYXZvaWRhbmNlICovCiAJZm9yICg7OykgewogCQkvKgpAQCAtNjM3LDYgKzY3MCwxNiBAQAogCQkJYnJlYWs7CiAKIAkJLyoKKwkJICogQmFja2dyb3VuZCB3cml0ZW91dCBhbmQga3VwZGF0ZS1zdHlsZSB3cml0ZWJhY2sgbWF5CisJCSAqIHJ1biBmb3JldmVyLiBTdG9wIHRoZW0gaWYgdGhlcmUgaXMgb3RoZXIgd29yayB0byBkbworCQkgKiBzbyB0aGF0IGUuZy4gc3luYyBjYW4gcHJvY2VlZC4gVGhleSdsbCBiZSByZXN0YXJ0ZWQKKwkJICogYWZ0ZXIgdGhlIG90aGVyIHdvcmtzIGFyZSBhbGwgZG9uZS4KKwkJICovCisJCWlmICgod29yay0+Zm9yX2JhY2tncm91bmQgfHwgd29yay0+Zm9yX2t1cGRhdGUpICYmCisJCSAgICAhbGlzdF9lbXB0eSgmd2ItPmJkaS0+d29ya19saXN0KSkKKwkJCWJyZWFrOworCisJCS8qCiAJCSAqIEZvciBiYWNrZ3JvdW5kIHdyaXRlb3V0LCBzdG9wIHdoZW4gd2UgYXJlIGJlbG93IHRoZQogCQkgKiBiYWNrZ3JvdW5kIGRpcnR5IHRocmVzaG9sZAogCQkgKi8KQEAgLTY0NCw3ICs2ODcsNyBAQAogCQkJYnJlYWs7CiAKIAkJd2JjLm1vcmVfaW8gPSAwOwotCQl3YmMubnJfdG9fd3JpdGUgPSBNQVhfV1JJVEVCQUNLX1BBR0VTOworCQl3YmMubnJfdG9fd3JpdGUgPSB3cml0ZV9jaHVuazsKIAkJd2JjLnBhZ2VzX3NraXBwZWQgPSAwOwogCiAJCXRyYWNlX3diY193cml0ZWJhY2tfc3RhcnQoJndiYywgd2ItPmJkaSk7CkBAIC02NTQsOCArNjk3LDggQEAKIAkJCXdyaXRlYmFja19pbm9kZXNfd2Iod2IsICZ3YmMpOwogCQl0cmFjZV93YmNfd3JpdGViYWNrX3dyaXR0ZW4oJndiYywgd2ItPmJkaSk7CiAKLQkJd29yay0+bnJfcGFnZXMgLT0gTUFYX1dSSVRFQkFDS19QQUdFUyAtIHdiYy5ucl90b193cml0ZTsKLQkJd3JvdGUgKz0gTUFYX1dSSVRFQkFDS19QQUdFUyAtIHdiYy5ucl90b193cml0ZTsKKwkJd29yay0+bnJfcGFnZXMgLT0gd3JpdGVfY2h1bmsgLSB3YmMubnJfdG9fd3JpdGU7CisJCXdyb3RlICs9IHdyaXRlX2NodW5rIC0gd2JjLm5yX3RvX3dyaXRlOwogCiAJCS8qCiAJCSAqIElmIHdlIGNvbnN1bWVkIGV2ZXJ5dGhpbmcsIHNlZSBpZiB3ZSBoYXZlIG1vcmUKQEAgLTY3MCw3ICs3MTMsNyBAQAogCQkvKgogCQkgKiBEaWQgd2Ugd3JpdGUgc29tZXRoaW5nPyBUcnkgZm9yIG1vcmUKIAkJICovCi0JCWlmICh3YmMubnJfdG9fd3JpdGUgPCBNQVhfV1JJVEVCQUNLX1BBR0VTKQorCQlpZiAod2JjLm5yX3RvX3dyaXRlIDwgd3JpdGVfY2h1bmspCiAJCQljb250aW51ZTsKIAkJLyoKIAkJICogTm90aGluZyB3cml0dGVuLiBXYWl0IGZvciBzb21lIGlub2RlIHRvCkBAIC03MTgsNiArNzYxLDIzIEBACiAJCWdldF9ucl9kaXJ0eV9pbm9kZXMoKTsKIH0KIAorc3RhdGljIGxvbmcgd2JfY2hlY2tfYmFja2dyb3VuZF9mbHVzaChzdHJ1Y3QgYmRpX3dyaXRlYmFjayAqd2IpCit7CisJaWYgKG92ZXJfYmdyb3VuZF90aHJlc2goKSkgeworCisJCXN0cnVjdCB3Yl93cml0ZWJhY2tfd29yayB3b3JrID0geworCQkJLm5yX3BhZ2VzCT0gTE9OR19NQVgsCisJCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAorCQkJLmZvcl9iYWNrZ3JvdW5kCT0gMSwKKwkJCS5yYW5nZV9jeWNsaWMJPSAxLAorCQl9OworCisJCXJldHVybiB3Yl93cml0ZWJhY2sod2IsICZ3b3JrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGxvbmcgd2JfY2hlY2tfb2xkX2RhdGFfZmx1c2goc3RydWN0IGJkaV93cml0ZWJhY2sgKndiKQogewogCXVuc2lnbmVkIGxvbmcgZXhwaXJlZDsKQEAgLTc4Nyw2ICs4NDcsNyBAQAogCSAqIENoZWNrIGZvciBwZXJpb2RpYyB3cml0ZWJhY2ssIGt1cGRhdGVkKCkgc3R5bGUKIAkgKi8KIAl3cm90ZSArPSB3Yl9jaGVja19vbGRfZGF0YV9mbHVzaCh3Yik7CisJd3JvdGUgKz0gd2JfY2hlY2tfYmFja2dyb3VuZF9mbHVzaCh3Yik7CiAJY2xlYXJfYml0KEJESV93cml0ZWJhY2tfcnVubmluZywgJndiLT5iZGktPnN0YXRlKTsKIAogCXJldHVybiB3cm90ZTsKQEAgLTg3Myw3ICs5MzQsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJkaSwgJmJkaV9saXN0LCBiZGlfbGlzdCkgewogCQlpZiAoIWJkaV9oYXNfZGlydHlfaW8oYmRpKSkKIAkJCWNvbnRpbnVlOwotCQlfX2JkaV9zdGFydF93cml0ZWJhY2soYmRpLCBucl9wYWdlcywgZmFsc2UsIGZhbHNlKTsKKwkJX19iZGlfc3RhcnRfd3JpdGViYWNrKGJkaSwgbnJfcGFnZXMsIGZhbHNlKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC0xMTY0LDcgKzEyMjUsNyBAQAogICogQHNiOiB0aGUgc3VwZXJibG9jawogICoKICAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGFuZCB3YWl0cyBvbiBhbnkgZGlydHkgaW5vZGUgYmVsb25naW5nIHRvIHRoaXMKLSAqIHN1cGVyX2Jsb2NrLiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHN5bmNlZCBpcyByZXR1cm5lZC4KKyAqIHN1cGVyX2Jsb2NrLgogICovCiB2b2lkIHN5bmNfaW5vZGVzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMjQyLDExICsxMzAzLDExIEBACiBFWFBPUlRfU1lNQk9MKHN5bmNfaW5vZGUpOwogCiAvKioKLSAqIHN5bmNfaW5vZGUgLSB3cml0ZSBhbiBpbm9kZSB0byBkaXNrCisgKiBzeW5jX2lub2RlX21ldGFkYXRhIC0gd3JpdGUgYW4gaW5vZGUgdG8gZGlzawogICogQGlub2RlOiB0aGUgaW5vZGUgdG8gc3luYwogICogQHdhaXQ6IHdhaXQgZm9yIEkvTyB0byBjb21wbGV0ZS4KICAqCi0gKiBXcml0ZSBhbiBpbm9kZSB0byBkaXNrIGFuZCBhZGp1c3QgaXQncyBkaXJ0eSBzdGF0ZSBhZnRlciBjb21wbGV0aW9uLgorICogV3JpdGUgYW4gaW5vZGUgdG8gZGlzayBhbmQgYWRqdXN0IGl0cyBkaXJ0eSBzdGF0ZSBhZnRlciBjb21wbGV0aW9uLgogICoKICAqIE5vdGU6IG9ubHkgd3JpdGVzIHRoZSBhY3R1YWwgaW5vZGUsIG5vIGFzc29jaWF0ZWQgZGF0YSBvciBvdGhlciBtZXRhZGF0YS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMvZnNjYWNoZS9vcGVyYXRpb24uYyBiL2ZzL2ZzY2FjaGUvb3BlcmF0aW9uLmMKaW5kZXggYjlmMzRlYS4uNDhhMThmMSAxMDA2NDQKLS0tIGEvZnMvZnNjYWNoZS9vcGVyYXRpb24uYworKysgYi9mcy9mc2NhY2hlL29wZXJhdGlvbi5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJb2JqZWN0LT5uX29wcysrOwogCQlvYmplY3QtPm5fZXhjbHVzaXZlKys7CS8qIHJlYWRzIGFuZCB3cml0ZXMgbXVzdCB3YWl0ICovCiAKLQkJaWYgKG9iamVjdC0+bl9vcHMgPiAwKSB7CisJCWlmIChvYmplY3QtPm5fb3BzID4gMSkgewogCQkJYXRvbWljX2luYygmb3AtPnVzYWdlKTsKIAkJCWxpc3RfYWRkX3RhaWwoJm9wLT5wZW5kX2xpbmssICZvYmplY3QtPnBlbmRpbmdfb3BzKTsKIAkJCWZzY2FjaGVfc3RhdCgmZnNjYWNoZV9uX29wX3BlbmQpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kZXYuYyBiL2ZzL2Z1c2UvZGV2LmMKaW5kZXggNmUwNzY5Ni4uY2Y4ZDI4ZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kZXYuYworKysgYi9mcy9mdXNlL2Rldi5jCkBAIC0yNTEsNiArMjUxLDIwIEBACiAJa2lsbF9mYXN5bmMoJmZjLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIH0KIAordm9pZCBmdXNlX3F1ZXVlX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldCwKKwkJICAgICAgIHU2NCBub2RlaWQsIHU2NCBubG9va3VwKQoreworCWZvcmdldC0+Zm9yZ2V0X29uZS5ub2RlaWQgPSBub2RlaWQ7CisJZm9yZ2V0LT5mb3JnZXRfb25lLm5sb29rdXAgPSBubG9va3VwOworCisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJZmMtPmZvcmdldF9saXN0X3RhaWwtPm5leHQgPSBmb3JnZXQ7CisJZmMtPmZvcmdldF9saXN0X3RhaWwgPSBmb3JnZXQ7CisJd2FrZV91cCgmZmMtPndhaXRxKTsKKwlraWxsX2Zhc3luYygmZmMtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Cit9CisKIHN0YXRpYyB2b2lkIGZsdXNoX2JnX3F1ZXVlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewogCXdoaWxlIChmYy0+YWN0aXZlX2JhY2tncm91bmQgPCBmYy0+bWF4X2JhY2tncm91bmQgJiYKQEAgLTQzOCwxMiArNDUyLDYgQEAKIAl9CiB9CiAKLXZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi17Ci0JcmVxLT5pc3JlcGx5ID0gMDsKLQlmdXNlX3JlcXVlc3Rfc2VuZF9ub3dhaXQoZmMsIHJlcSk7Ci19Ci0KIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7CiAJcmVxLT5pc3JlcGx5ID0gMTsKQEAgLTg5Niw5ICs5MDQsMTUgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGZvcmdldF9wZW5kaW5nKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCXJldHVybiBmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0ICE9IE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgcmVxdWVzdF9wZW5kaW5nKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewotCXJldHVybiAhbGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpIHx8ICFsaXN0X2VtcHR5KCZmYy0+aW50ZXJydXB0cyk7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykgfHwgIWxpc3RfZW1wdHkoJmZjLT5pbnRlcnJ1cHRzKSB8fAorCQlmb3JnZXRfcGVuZGluZyhmYyk7CiB9CiAKIC8qIFdhaXQgdW50aWwgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSBvbiB0aGUgcGVuZGluZyBsaXN0ICovCkBAIC05NjAsNiArOTc0LDEyMCBAQAogCXJldHVybiBlcnIgPyBlcnIgOiByZXFzaXplOwogfQogCitzdGF0aWMgc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmRlcXVldWVfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCQkgICAgICAgdW5zaWduZWQgbWF4LAorCQkJCQkgICAgICAgdW5zaWduZWQgKmNvdW50cCkKK3sKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqaGVhZCA9IGZjLT5mb3JnZXRfbGlzdF9oZWFkLm5leHQ7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKipuZXdoZWFkID0gJmhlYWQ7CisJdW5zaWduZWQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgKm5ld2hlYWQgIT0gTlVMTCAmJiBjb3VudCA8IG1heDsgY291bnQrKykKKwkJbmV3aGVhZCA9ICYoKm5ld2hlYWQpLT5uZXh0OworCisJZmMtPmZvcmdldF9saXN0X2hlYWQubmV4dCA9ICpuZXdoZWFkOworCSpuZXdoZWFkID0gTlVMTDsKKwlpZiAoZmMtPmZvcmdldF9saXN0X2hlYWQubmV4dCA9PSBOVUxMKQorCQlmYy0+Zm9yZ2V0X2xpc3RfdGFpbCA9ICZmYy0+Zm9yZ2V0X2xpc3RfaGVhZDsKKworCWlmIChjb3VudHAgIT0gTlVMTCkKKwkJKmNvdW50cCA9IGNvdW50OworCisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkX3NpbmdsZV9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsCisJCQkJICAgc2l6ZV90IG5ieXRlcykKK19fcmVsZWFzZXMoZmMtPmxvY2spCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0ID0gZGVxdWV1ZV9mb3JnZXQoZmMsIDEsIE5VTEwpOworCXN0cnVjdCBmdXNlX2ZvcmdldF9pbiBhcmcgPSB7CisJCS5ubG9va3VwID0gZm9yZ2V0LT5mb3JnZXRfb25lLm5sb29rdXAsCisJfTsKKwlzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgaWggPSB7CisJCS5vcGNvZGUgPSBGVVNFX0ZPUkdFVCwKKwkJLm5vZGVpZCA9IGZvcmdldC0+Zm9yZ2V0X29uZS5ub2RlaWQsCisJCS51bmlxdWUgPSBmdXNlX2dldF91bmlxdWUoZmMpLAorCQkubGVuID0gc2l6ZW9mKGloKSArIHNpemVvZihhcmcpLAorCX07CisKKwlzcGluX3VubG9jaygmZmMtPmxvY2spOworCWtmcmVlKGZvcmdldCk7CisJaWYgKG5ieXRlcyA8IGloLmxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmaWgsIHNpemVvZihpaCkpOworCWlmICghZXJyKQorCQllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmYXJnLCBzaXplb2YoYXJnKSk7CisJZnVzZV9jb3B5X2ZpbmlzaChjcyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGloLmxlbjsKK30KKworc3RhdGljIGludCBmdXNlX3JlYWRfYmF0Y2hfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorCQkJCSAgIHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLCBzaXplX3QgbmJ5dGVzKQorX19yZWxlYXNlcyhmYy0+bG9jaykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIG1heF9mb3JnZXRzOworCXVuc2lnbmVkIGNvdW50OworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpoZWFkOworCXN0cnVjdCBmdXNlX2JhdGNoX2ZvcmdldF9pbiBhcmcgPSB7IC5jb3VudCA9IDAgfTsKKwlzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgaWggPSB7CisJCS5vcGNvZGUgPSBGVVNFX0JBVENIX0ZPUkdFVCwKKwkJLnVuaXF1ZSA9IGZ1c2VfZ2V0X3VuaXF1ZShmYyksCisJCS5sZW4gPSBzaXplb2YoaWgpICsgc2l6ZW9mKGFyZyksCisJfTsKKworCWlmIChuYnl0ZXMgPCBpaC5sZW4pIHsKKwkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWF4X2ZvcmdldHMgPSAobmJ5dGVzIC0gaWgubGVuKSAvIHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lKTsKKwloZWFkID0gZGVxdWV1ZV9mb3JnZXQoZmMsIG1heF9mb3JnZXRzLCAmY291bnQpOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisKKwlhcmcuY291bnQgPSBjb3VudDsKKwlpaC5sZW4gKz0gY291bnQgKiBzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X29uZSk7CisJZXJyID0gZnVzZV9jb3B5X29uZShjcywgJmloLCBzaXplb2YoaWgpKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZnVzZV9jb3B5X29uZShjcywgJmFyZywgc2l6ZW9mKGFyZykpOworCisJd2hpbGUgKGhlYWQpIHsKKwkJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldCA9IGhlYWQ7CisKKwkJaWYgKCFlcnIpIHsKKwkJCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZmb3JnZXQtPmZvcmdldF9vbmUsCisJCQkJCSAgICBzaXplb2YoZm9yZ2V0LT5mb3JnZXRfb25lKSk7CisJCX0KKwkJaGVhZCA9IGZvcmdldC0+bmV4dDsKKwkJa2ZyZWUoZm9yZ2V0KTsKKwl9CisKKwlmdXNlX2NvcHlfZmluaXNoKGNzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gaWgubGVuOworfQorCitzdGF0aWMgaW50IGZ1c2VfcmVhZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgKmNzLAorCQkJICAgIHNpemVfdCBuYnl0ZXMpCitfX3JlbGVhc2VzKGZjLT5sb2NrKQoreworCWlmIChmYy0+bWlub3IgPCAxNiB8fCBmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0LT5uZXh0ID09IE5VTEwpCisJCXJldHVybiBmdXNlX3JlYWRfc2luZ2xlX2ZvcmdldChmYywgY3MsIG5ieXRlcyk7CisJZWxzZQorCQlyZXR1cm4gZnVzZV9yZWFkX2JhdGNoX2ZvcmdldChmYywgY3MsIG5ieXRlcyk7Cit9CisKIC8qCiAgKiBSZWFkIGEgc2luZ2xlIHJlcXVlc3QgaW50byB0aGUgdXNlcnNwYWNlIGZpbGVzeXN0ZW0ncyBidWZmZXIuICBUaGlzCiAgKiBmdW5jdGlvbiB3YWl0cyB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlLCB0aGVuIHJlbW92ZXMgaXQgZnJvbQpAQCAtOTk4LDYgKzExMjYsMTQgQEAKIAkJcmV0dXJuIGZ1c2VfcmVhZF9pbnRlcnJ1cHQoZmMsIGNzLCBuYnl0ZXMsIHJlcSk7CiAJfQogCisJaWYgKGZvcmdldF9wZW5kaW5nKGZjKSkgeworCQlpZiAobGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpIHx8IGZjLT5mb3JnZXRfYmF0Y2gtLSA+IDApCisJCQlyZXR1cm4gZnVzZV9yZWFkX2ZvcmdldChmYywgY3MsIG5ieXRlcyk7CisKKwkJaWYgKGZjLT5mb3JnZXRfYmF0Y2ggPD0gLTgpCisJCQlmYy0+Zm9yZ2V0X2JhdGNoID0gMTY7CisJfQorCiAJcmVxID0gbGlzdF9lbnRyeShmYy0+cGVuZGluZy5uZXh0LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwogCXJlcS0+c3RhdGUgPSBGVVNFX1JFUV9SRUFESU5HOwogCWxpc3RfbW92ZSgmcmVxLT5saXN0LCAmZmMtPmlvKTsKQEAgLTEwOTAsNyArMTIyNiw3IEBACiAJaWYgKCFmYykKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWJ1ZnMgPSBrbWFsbG9jKHBpcGUtPmJ1ZmZlcnMgKiBzaXplb2YgKHN0cnVjdCBwaXBlX2J1ZmZlciksIEdGUF9LRVJORUwpOworCWJ1ZnMgPSBrbWFsbG9jKHBpcGUtPmJ1ZmZlcnMgKiBzaXplb2Yoc3RydWN0IHBpcGVfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTYyNiw3ICsxNzYyLDcgQEAKIAlpZiAoIWZjKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZiAoc3RydWN0IHBpcGVfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZihzdHJ1Y3QgcGlwZV9idWZmZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZnMpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNzcwLDYgKzE5MDYsOCBAQAogCWZsdXNoX2JnX3F1ZXVlKGZjKTsKIAllbmRfcmVxdWVzdHMoZmMsICZmYy0+cGVuZGluZyk7CiAJZW5kX3JlcXVlc3RzKGZjLCAmZmMtPnByb2Nlc3NpbmcpOworCXdoaWxlIChmb3JnZXRfcGVuZGluZyhmYykpCisJCWtmcmVlKGRlcXVldWVfZm9yZ2V0KGZjLCAxLCBOVUxMKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rpci5jIGIvZnMvZnVzZS9kaXIuYwppbmRleCBmNzM4NTk5Li5iZmVkODQ0IDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rpci5jCisrKyBiL2ZzL2Z1c2UvZGlyLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2lmIEJJVFNfUEVSX0xPTkcgPj0gNjQKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX2RlbnRyeV9zZXR0aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5LCB1NjQgdGltZSkKQEAgLTE2OSw3ICsxNjksNyBAQAogCQlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOwogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKIAkJc3RydWN0IGZ1c2VfcmVxICpyZXE7Ci0JCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwkJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAkJc3RydWN0IGRlbnRyeSAqcGFyZW50OwogCQl1NjQgYXR0cl92ZXJzaW9uOwogCkBAIC0xODIsOCArMTgyLDggQEAKIAkJaWYgKElTX0VSUihyZXEpKQogCQkJcmV0dXJuIDA7CiAKLQkJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7Ci0JCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwkJZm9yZ2V0ID0gZnVzZV9hbGxvY19mb3JnZXQoKTsKKwkJaWYgKCFmb3JnZXQpIHsKIAkJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjAzLDE1ICsyMDMsMTQgQEAKIAkJaWYgKCFlcnIpIHsKIAkJCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKIAkJCWlmIChvdXRhcmcubm9kZWlkICE9IGdldF9ub2RlX2lkKGlub2RlKSkgewotCQkJCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsCi0JCQkJCQkgb3V0YXJnLm5vZGVpZCwgMSk7CisJCQkJZnVzZV9xdWV1ZV9mb3JnZXQoZmMsIGZvcmdldCwgb3V0YXJnLm5vZGVpZCwgMSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAkJCWZpLT5ubG9va3VwKys7CiAJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQl9Ci0JCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCQlrZnJlZShmb3JnZXQpOwogCQlpZiAoZXJyIHx8IChvdXRhcmcuYXR0ci5tb2RlIF4gaW5vZGUtPmlfbW9kZSkgJiBTX0lGTVQpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjYzLDcgKzI2Miw3IEBACiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKLQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAl1NjQgYXR0cl92ZXJzaW9uOwogCWludCBlcnI7CiAKQEAgLTI3Nyw5ICsyNzYsOSBAQAogCWlmIChJU19FUlIocmVxKSkKIAkJZ290byBvdXQ7CiAKLQlmb3JnZXRfcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKLQllcnIgPSBQVFJfRVJSKGZvcmdldF9yZXEpOwotCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwlmb3JnZXQgPSBmdXNlX2FsbG9jX2ZvcmdldCgpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFmb3JnZXQpIHsKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzA1LDEzICszMDQsMTMgQEAKIAkJCSAgIGF0dHJfdmVyc2lvbik7CiAJZXJyID0gLUVOT01FTTsKIAlpZiAoISppbm9kZSkgewotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmb3JnZXRfcmVxLCBvdXRhcmctPm5vZGVpZCwgMSk7CisJCWZ1c2VfcXVldWVfZm9yZ2V0KGZjLCBmb3JnZXQsIG91dGFyZy0+bm9kZWlkLCAxKTsKIAkJZ290byBvdXQ7CiAJfQogCWVyciA9IDA7CiAKICBvdXRfcHV0X2ZvcmdldDoKLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKKwlrZnJlZShmb3JnZXQpOwogIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzUxLDcgKzM1MCw2IEBACiAJfQogCiAJZW50cnkgPSBuZXdlbnQgPyBuZXdlbnQgOiBlbnRyeTsKLQlkX3NldF9kX29wKGVudHJ5LCAmZnVzZV9kZW50cnlfb3BlcmF0aW9ucyk7CiAJaWYgKG91dGFyZ192YWxpZCkKIAkJZnVzZV9jaGFuZ2VfZW50cnlfdGltZW91dChlbnRyeSwgJm91dGFyZyk7CiAJZWxzZQpAQCAtMzc4LDcgKzM3Niw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oZGlyKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKLQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAlzdHJ1Y3QgZnVzZV9jcmVhdGVfaW4gaW5hcmc7CiAJc3RydWN0IGZ1c2Vfb3Blbl9vdXQgb3V0b3BlbjsKIAlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0ZW50cnk7CkBAIC0zOTIsOSArMzkwLDkgQEAKIAlpZiAoZmxhZ3MgJiBPX0RJUkVDVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3JnZXRfcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKLQlpZiAoSVNfRVJSKGZvcmdldF9yZXEpKQotCQlyZXR1cm4gUFRSX0VSUihmb3JnZXRfcmVxKTsKKwlmb3JnZXQgPSBmdXNlX2FsbG9jX2ZvcmdldCgpOworCWlmICghZm9yZ2V0KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CiAJZXJyID0gUFRSX0VSUihyZXEpOwpAQCAtNDUyLDEwICs0NTAsMTAgQEAKIAlpZiAoIWlub2RlKSB7CiAJCWZsYWdzICY9IH4oT19DUkVBVCB8IE9fRVhDTCB8IE9fVFJVTkMpOwogCQlmdXNlX3N5bmNfcmVsZWFzZShmZiwgZmxhZ3MpOwotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmb3JnZXRfcmVxLCBvdXRlbnRyeS5ub2RlaWQsIDEpOworCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZm9yZ2V0LCBvdXRlbnRyeS5ub2RlaWQsIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CisJa2ZyZWUoZm9yZ2V0KTsKIAlkX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CiAJZnVzZV9jaGFuZ2VfZW50cnlfdGltZW91dChlbnRyeSwgJm91dGVudHJ5KTsKIAlmdXNlX2ludmFsaWRhdGVfYXR0cihkaXIpOwpAQCAtNDczLDcgKzQ3MSw3IEBACiAgb3V0X3B1dF9yZXF1ZXN0OgogCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CiAgb3V0X3B1dF9mb3JnZXRfcmVxOgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDg3LDEyICs0ODUsMTIgQEAKIAlzdHJ1Y3QgZnVzZV9lbnRyeV9vdXQgb3V0YXJnOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVycjsKLQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAotCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpIHsKKwlmb3JnZXQgPSBmdXNlX2FsbG9jX2ZvcmdldCgpOworCWlmICghZm9yZ2V0KSB7CiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Ci0JCXJldHVybiBQVFJfRVJSKGZvcmdldF9yZXEpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAltZW1zZXQoJm91dGFyZywgMCwgc2l6ZW9mKG91dGFyZykpOwpAQCAtNTE5LDEwICs1MTcsMTAgQEAKIAlpbm9kZSA9IGZ1c2VfaWdldChkaXItPmlfc2IsIG91dGFyZy5ub2RlaWQsIG91dGFyZy5nZW5lcmF0aW9uLAogCQkJICAmb3V0YXJnLmF0dHIsIGVudHJ5X2F0dHJfdGltZW91dCgmb3V0YXJnKSwgMCk7CiAJaWYgKCFpbm9kZSkgewotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmb3JnZXRfcmVxLCBvdXRhcmcubm9kZWlkLCAxKTsKKwkJZnVzZV9xdWV1ZV9mb3JnZXQoZmMsIGZvcmdldCwgb3V0YXJnLm5vZGVpZCwgMSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKKwlrZnJlZShmb3JnZXQpOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CkBAIC01NDUsNyArNTQzLDcgQEAKIAlyZXR1cm4gMDsKIAogIG91dF9wdXRfZm9yZ2V0X3JlcToKLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKKwlrZnJlZShmb3JnZXQpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggOGI5ODRhMi4uOTVkYTFiYyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTE2MzQsOSArMTYzNCw5IEBACiAgKiBhbmQgNjRiaXQuICBGb3J0dW5hdGVseSB3ZSBjYW4gZGV0ZXJtaW5lIHdoaWNoIHN0cnVjdHVyZSB0aGUgc2VydmVyCiAgKiB1c2VkIGZyb20gdGhlIHNpemUgb2YgdGhlIHJlcGx5LgogICovCi1zdGF0aWMgaW50IGZ1c2VfY29weV9pb2N0bF9pb3ZlYyhzdHJ1Y3QgaW92ZWMgKmRzdCwgdm9pZCAqc3JjLAotCQkJCSBzaXplX3QgdHJhbnNmZXJyZWQsIHVuc2lnbmVkIGNvdW50LAotCQkJCSBib29sIGlzX2NvbXBhdCkKK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2lvY3RsX2lvdmVjX29sZChzdHJ1Y3QgaW92ZWMgKmRzdCwgdm9pZCAqc3JjLAorCQkJCSAgICAgc2l6ZV90IHRyYW5zZmVycmVkLCB1bnNpZ25lZCBjb3VudCwKKwkJCQkgICAgIGJvb2wgaXNfY29tcGF0KQogewogI2lmZGVmIENPTkZJR19DT01QQVQKIAlpZiAoY291bnQgKiBzaXplb2Yoc3RydWN0IGNvbXBhdF9pb3ZlYykgPT0gdHJhbnNmZXJyZWQpIHsKQEAgLTE2ODAsNiArMTY4MCw0MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGZ1c2VfY29weV9pb2N0bF9pb3ZlYyhzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGlvdmVjICpkc3QsCisJCQkJIHZvaWQgKnNyYywgc2l6ZV90IHRyYW5zZmVycmVkLCB1bnNpZ25lZCBjb3VudCwKKwkJCQkgYm9vbCBpc19jb21wYXQpCit7CisJdW5zaWduZWQgaTsKKwlzdHJ1Y3QgZnVzZV9pb2N0bF9pb3ZlYyAqZmlvdiA9IHNyYzsKKworCWlmIChmYy0+bWlub3IgPCAxNikgeworCQlyZXR1cm4gZnVzZV9jb3B5X2lvY3RsX2lvdmVjX29sZChkc3QsIHNyYywgdHJhbnNmZXJyZWQsCisJCQkJCQkgY291bnQsIGlzX2NvbXBhdCk7CisJfQorCisJaWYgKGNvdW50ICogc2l6ZW9mKHN0cnVjdCBmdXNlX2lvY3RsX2lvdmVjKSAhPSB0cmFuc2ZlcnJlZCkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkvKiBEaWQgdGhlIHNlcnZlciBzdXBwbHkgYW4gaW5hcHByb3ByaWF0ZSB2YWx1ZT8gKi8KKwkJaWYgKGZpb3ZbaV0uYmFzZSAhPSAodW5zaWduZWQgbG9uZykgZmlvdltpXS5iYXNlIHx8CisJCSAgICBmaW92W2ldLmxlbiAhPSAodW5zaWduZWQgbG9uZykgZmlvdltpXS5sZW4pCisJCQlyZXR1cm4gLUVJTzsKKworCQlkc3RbaV0uaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGZpb3ZbaV0uYmFzZTsKKwkJZHN0W2ldLmlvdl9sZW4gPSAoc2l6ZV90KSBmaW92W2ldLmxlbjsKKworI2lmZGVmIENPTkZJR19DT01QQVQKKwkJaWYgKGlzX2NvbXBhdCAmJgorCQkgICAgKHB0cl90b19jb21wYXQoZHN0W2ldLmlvdl9iYXNlKSAhPSBmaW92W2ldLmJhc2UgfHwKKwkJICAgICAoY29tcGF0X3NpemVfdCkgZHN0W2ldLmlvdl9sZW4gIT0gZmlvdltpXS5sZW4pKQorCQkJcmV0dXJuIC1FSU87CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCiAvKgogICogRm9yIGlvY3RscywgdGhlcmUgaXMgbm8gZ2VuZXJpYyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIG1lbW9yeQogICogbmVlZHMgdG8gYmUgcmVhZCBhbmQvb3Igd3JpdHRlbi4gIEZ1cnRoZXJtb3JlLCBpb2N0bHMgYXJlIGFsbG93ZWQKQEAgLTE3NDAsMTggKzE3NzYsMjUgQEAKIAlzdHJ1Y3QgZnVzZV9pb2N0bF9vdXQgb3V0YXJnOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKLQlzdHJ1Y3QgcGFnZSAqaW92X3BhZ2UgPSBOVUxMOworCXN0cnVjdCBpb3ZlYyAqaW92X3BhZ2UgPSBOVUxMOwogCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7CiAJc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKIAlpbnQgZXJyOwogCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCWluYXJnLmZsYWdzIHw9IEZVU0VfSU9DVExfMzJCSVQ7CisjZWxzZQorCWlmIChmbGFncyAmIEZVU0VfSU9DVExfQ09NUEFUKQorCQlpbmFyZy5mbGFncyB8PSBGVVNFX0lPQ1RMXzMyQklUOworI2VuZGlmCisKIAkvKiBhc3N1bWUgYWxsIHRoZSBpb3ZzIHJldHVybmVkIGJ5IGNsaWVudCBhbHdheXMgZml0cyBpbiBhIHBhZ2UgKi8KLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpb3ZlYykgKiBGVVNFX0lPQ1RMX01BWF9JT1YgPiBQQUdFX1NJWkUpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGZ1c2VfaW9jdGxfaW92ZWMpICogRlVTRV9JT0NUTF9NQVhfSU9WID4gUEFHRV9TSVpFKTsKIAogCWVyciA9IC1FTk9NRU07CiAJcGFnZXMgPSBremFsbG9jKHNpemVvZihwYWdlc1swXSkgKiBGVVNFX01BWF9QQUdFU19QRVJfUkVRLCBHRlBfS0VSTkVMKTsKLQlpb3ZfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaW92X3BhZ2UgPSAoc3RydWN0IGlvdmVjICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2VzIHx8ICFpb3ZfcGFnZSkKIAkJZ290byBvdXQ7CiAKQEAgLTE3NjAsNyArMTgwMyw3IEBACiAJICogUkVUUlkgZnJvbSBzZXJ2ZXIgaXMgbm90IGFsbG93ZWQuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBGVVNFX0lPQ1RMX1VOUkVTVFJJQ1RFRCkpIHsKLQkJc3RydWN0IGlvdmVjICppb3YgPSBwYWdlX2FkZHJlc3MoaW92X3BhZ2UpOworCQlzdHJ1Y3QgaW92ZWMgKmlvdiA9IGlvdl9wYWdlOwogCiAJCWlvdi0+aW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJCWlvdi0+aW92X2xlbiA9IF9JT0NfU0laRShjbWQpOwpAQCAtMTg0MSw3ICsxODg0LDcgQEAKIAogCS8qIGRpZCBpdCBhc2sgZm9yIHJldHJ5PyAqLwogCWlmIChvdXRhcmcuZmxhZ3MgJiBGVVNFX0lPQ1RMX1JFVFJZKSB7Ci0JCWNoYXIgKnZhZGRyOworCQl2b2lkICp2YWRkcjsKIAogCQkvKiBubyByZXRyeSBpZiBpbiByZXN0cmljdGVkIG1vZGUgKi8KIAkJZXJyID0gLUVJTzsKQEAgLTE4NjIsMTQgKzE5MDUsMTQgQEAKIAkJCWdvdG8gb3V0OwogCiAJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZXNbMF0sIEtNX1VTRVIwKTsKLQkJZXJyID0gZnVzZV9jb3B5X2lvY3RsX2lvdmVjKHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSksIHZhZGRyLAorCQllcnIgPSBmdXNlX2NvcHlfaW9jdGxfaW92ZWMoZmMsIGlvdl9wYWdlLCB2YWRkciwKIAkJCQkJICAgIHRyYW5zZmVycmVkLCBpbl9pb3ZzICsgb3V0X2lvdnMsCiAJCQkJCSAgICAoZmxhZ3MgJiBGVVNFX0lPQ1RMX0NPTVBBVCkgIT0gMCk7CiAJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCi0JCWluX2lvdiA9IHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSk7CisJCWluX2lvdiA9IGlvdl9wYWdlOwogCQlvdXRfaW92ID0gaW5faW92ICsgaW5faW92czsKIAogCQllcnIgPSBmdXNlX3ZlcmlmeV9pb2N0bF9pb3YoaW5faW92LCBpbl9pb3ZzKTsKQEAgLTE4OTEsOCArMTkzNCw3IEBACiAgb3V0OgogCWlmIChyZXEpCiAJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Ci0JaWYgKGlvdl9wYWdlKQotCQlfX2ZyZWVfcGFnZShpb3ZfcGFnZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpb3ZfcGFnZSk7CiAJd2hpbGUgKG51bV9wYWdlcykKIAkJX19mcmVlX3BhZ2UocGFnZXNbLS1udW1fcGFnZXNdKTsKIAlrZnJlZShwYWdlcyk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Z1c2VfaS5oIGIvZnMvZnVzZS9mdXNlX2kuaAppbmRleCA1N2Q0YTNhLi5hZTU3NDRhIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Z1c2VfaS5oCisrKyBiL2ZzL2Z1c2UvZnVzZV9pLmgKQEAgLTUzLDYgKzUzLDEyIEBACiBleHRlcm4gdW5zaWduZWQgbWF4X3VzZXJfYmdyZXE7CiBleHRlcm4gdW5zaWduZWQgbWF4X3VzZXJfY29uZ3RocmVzaDsKIAorLyogT25lIGZvcmdldCByZXF1ZXN0ICovCitzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayB7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X29uZSBmb3JnZXRfb25lOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpuZXh0OworfTsKKwogLyoqIEZVU0UgaW5vZGUgKi8KIHN0cnVjdCBmdXNlX2lub2RlIHsKIAkvKiogSW5vZGUgZGF0YSAqLwpAQCAtNjYsNyArNzIsNyBAQAogCXU2NCBubG9va3VwOwogCiAJLyoqIFRoZSByZXF1ZXN0IHVzZWQgZm9yIHNlbmRpbmcgdGhlIEZPUkdFVCBtZXNzYWdlICovCi0Jc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmb3JnZXQ7CiAKIAkvKiogVGltZSBpbiBqaWZmaWVzIHVudGlsIHRoZSBmaWxlIGF0dHJpYnV0ZXMgYXJlIHZhbGlkICovCiAJdTY0IGlfdGltZTsKQEAgLTI1NSw3ICsyNjEsNiBAQAogCiAJLyoqIERhdGEgZm9yIGFzeW5jaHJvbm91cyByZXF1ZXN0cyAqLwogCXVuaW9uIHsKLQkJc3RydWN0IGZ1c2VfZm9yZ2V0X2luIGZvcmdldF9pbjsKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBmdXNlX3JlbGVhc2VfaW4gaW47CiAJCQlzdHJ1Y3QgcGF0aCBwYXRoOwpAQCAtMzY5LDYgKzM3NCwxMyBAQAogCS8qKiBQZW5kaW5nIGludGVycnVwdHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGludGVycnVwdHM7CiAKKwkvKiogUXVldWUgb2YgcGVuZGluZyBmb3JnZXRzICovCisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgZm9yZ2V0X2xpc3RfaGVhZDsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0X2xpc3RfdGFpbDsKKworCS8qKiBCYXRjaGluZyBvZiBGT1JHRVQgcmVxdWVzdHMgKHBvc2l0aXZlIGluZGljYXRlcyBGT1JHRVQgYmF0Y2gpICovCisJaW50IGZvcmdldF9iYXRjaDsKKwogCS8qKiBGbGFnIGluZGljYXRpbmcgaWYgY29ubmVjdGlvbiBpcyBibG9ja2VkLiAgVGhpcyB3aWxsIGJlCiAJICAgIHRoZSBjYXNlIGJlZm9yZSB0aGUgSU5JVCByZXBseSBpcyByZWNlaXZlZCwgYW5kIGlmIHRoZXJlCiAJICAgIGFyZSB0b28gbWFueSBvdXRzdGFkaW5nIGJhY2tncm91bmRzIHJlcXVlc3RzICovCkBAIC01NDMsOCArNTU1LDEwIEBACiAvKioKICAqIFNlbmQgRk9SR0VUIGNvbW1hbmQKICAqLwotdm9pZCBmdXNlX3NlbmRfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwKLQkJICAgICAgdTY0IG5vZGVpZCwgdTY0IG5sb29rdXApOwordm9pZCBmdXNlX3F1ZXVlX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldCwKKwkJICAgICAgIHU2NCBub2RlaWQsIHU2NCBubG9va3VwKTsKKworc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZ1c2VfYWxsb2NfZm9yZ2V0KHZvaWQpOwogCiAvKioKICAqIEluaXRpYWxpemUgUkVBRCBvciBSRUFERElSIHJlcXVlc3QKQEAgLTY1NiwxMSArNjcwLDYgQEAKIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyoqCi0gKiBTZW5kIGEgcmVxdWVzdCB3aXRoIG5vIHJlcGx5Ci0gKi8KLXZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfbm9yZXBseShzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwotCi0vKioKICAqIFNlbmQgYSByZXF1ZXN0IGluIHRoZSBiYWNrZ3JvdW5kCiAgKi8KIHZvaWQgZnVzZV9yZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IGE4YjMxZGEuLjllM2Y2OGMgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTcxLDYgKzcxLDExIEBACiAJdW5zaWduZWQgYmxrc2l6ZTsKIH07CiAKK3N0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmdXNlX2FsbG9jX2ZvcmdldCgpCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmdXNlX2ZvcmdldF9saW5rKSwgR0ZQX0tFUk5FTCk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmZ1c2VfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpAQCAtOTAsOCArOTUsOCBAQAogCUlOSVRfTElTVF9IRUFEKCZmaS0+cXVldWVkX3dyaXRlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZpLT53cml0ZXBhZ2VzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmaS0+cGFnZV93YWl0cSk7Ci0JZmktPmZvcmdldF9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKLQlpZiAoIWZpLT5mb3JnZXRfcmVxKSB7CisJZmktPmZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJaWYgKCFmaS0+Zm9yZ2V0KSB7CiAJCWttZW1fY2FjaGVfZnJlZShmdXNlX2lub2RlX2NhY2hlcCwgaW5vZGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMTEsMjQgKzExNiwxMCBAQAogCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmZpLT53cml0ZV9maWxlcykpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZmktPnF1ZXVlZF93cml0ZXMpKTsKLQlpZiAoZmktPmZvcmdldF9yZXEpCi0JCWZ1c2VfcmVxdWVzdF9mcmVlKGZpLT5mb3JnZXRfcmVxKTsKKwlrZnJlZShmaS0+Zm9yZ2V0KTsKIAljYWxsX3JjdSgmaW5vZGUtPmlfcmN1LCBmdXNlX2lfY2FsbGJhY2spOwogfQogCi12b2lkIGZ1c2Vfc2VuZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAotCQkgICAgICB1NjQgbm9kZWlkLCB1NjQgbmxvb2t1cCkKLXsKLQlzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4gKmluYXJnID0gJnJlcS0+bWlzYy5mb3JnZXRfaW47Ci0JaW5hcmctPm5sb29rdXAgPSBubG9va3VwOwotCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0ZPUkdFVDsKLQlyZXEtPmluLmgubm9kZWlkID0gbm9kZWlkOwotCXJlcS0+aW4ubnVtYXJncyA9IDE7Ci0JcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2luKTsKLQlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBpbmFyZzsKLQlmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KGZjLCByZXEpOwotfQotCiBzdGF0aWMgdm9pZCBmdXNlX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwpAQCAtMTM2LDggKzEyNyw4IEBACiAJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CiAJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CiAJCXN0cnVjdCBmdXNlX2lub2RlICpmaSA9IGdldF9mdXNlX2lub2RlKGlub2RlKTsKLQkJZnVzZV9zZW5kX2ZvcmdldChmYywgZmktPmZvcmdldF9yZXEsIGZpLT5ub2RlaWQsIGZpLT5ubG9va3VwKTsKLQkJZmktPmZvcmdldF9yZXEgPSBOVUxMOworCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZmktPmZvcmdldCwgZmktPm5vZGVpZCwgZmktPm5sb29rdXApOworCQlmaS0+Zm9yZ2V0ID0gTlVMTDsKIAl9CiB9CiAKQEAgLTU0MSw2ICs1MzIsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZmYy0+aW50ZXJydXB0cyk7CiAJSU5JVF9MSVNUX0hFQUQoJmZjLT5iZ19xdWV1ZSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZjLT5lbnRyeSk7CisJZmMtPmZvcmdldF9saXN0X3RhaWwgPSAmZmMtPmZvcmdldF9saXN0X2hlYWQ7CiAJYXRvbWljX3NldCgmZmMtPm51bV93YWl0aW5nLCAwKTsKIAlmYy0+bWF4X2JhY2tncm91bmQgPSBGVVNFX0RFRkFVTFRfTUFYX0JBQ0tHUk9VTkQ7CiAJZmMtPmNvbmdlc3Rpb25fdGhyZXNob2xkID0gRlVTRV9ERUZBVUxUX0NPTkdFU1RJT05fVEhSRVNIT0xEOwpAQCAtNjI1LDEwICs2MTcsOCBAQAogCQlnb3RvIG91dF9pcHV0OwogCiAJZW50cnkgPSBkX29idGFpbl9hbGlhcyhpbm9kZSk7Ci0JaWYgKCFJU19FUlIoZW50cnkpICYmIGdldF9ub2RlX2lkKGlub2RlKSAhPSBGVVNFX1JPT1RfSUQpIHsKLQkJZF9zZXRfZF9vcChlbnRyeSwgJmZ1c2VfZGVudHJ5X29wZXJhdGlvbnMpOworCWlmICghSVNfRVJSKGVudHJ5KSAmJiBnZXRfbm9kZV9pZChpbm9kZSkgIT0gRlVTRV9ST09UX0lEKQogCQlmdXNlX2ludmFsaWRhdGVfZW50cnlfY2FjaGUoZW50cnkpOwotCX0KIAogCXJldHVybiBlbnRyeTsKIApAQCAtNzI3LDEwICs3MTcsOCBAQAogCX0KIAogCXBhcmVudCA9IGRfb2J0YWluX2FsaWFzKGlub2RlKTsKLQlpZiAoIUlTX0VSUihwYXJlbnQpICYmIGdldF9ub2RlX2lkKGlub2RlKSAhPSBGVVNFX1JPT1RfSUQpIHsKLQkJZF9zZXRfZF9vcChwYXJlbnQsICZmdXNlX2RlbnRyeV9vcGVyYXRpb25zKTsKKwlpZiAoIUlTX0VSUihwYXJlbnQpICYmIGdldF9ub2RlX2lkKGlub2RlKSAhPSBGVVNFX1JPT1RfSUQpCiAJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeV9jYWNoZShwYXJlbnQpOwotCX0KIAogCXJldHVybiBwYXJlbnQ7CiB9CkBAIC05OTcsNiArOTg1LDggQEAKIAkJaXB1dChyb290KTsKIAkJZ290byBlcnJfcHV0X2Nvbm47CiAJfQorCS8qIG9ubHkgbm93IC0gd2Ugd2FudCByb290IGRlbnRyeSB3aXRoIE5VTEwgLT5kX29wICovCisJc2ItPnNfZF9vcCA9ICZmdXNlX2RlbnRyeV9vcGVyYXRpb25zOwogCiAJaW5pdF9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKIAlpZiAoIWluaXRfcmVxKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9leHBvcnQuYyBiL2ZzL2dmczIvZXhwb3J0LmMKaW5kZXggOTcwMTJlYy4uOTAyM2RiOCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9leHBvcnQuYworKysgYi9mcy9nZnMyL2V4cG9ydC5jCkBAIC0xMjYsMTIgKzEyNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZnMyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCi0JZGVudHJ5ID0gZF9vYnRhaW5fYWxpYXMoZ2ZzMl9sb29rdXBpKGNoaWxkLT5kX2lub2RlLCAmZ2ZzMl9xZG90ZG90LCAxKSk7Ci0JaWYgKCFJU19FUlIoZGVudHJ5KSkKLQkJZF9zZXRfZF9vcChkZW50cnksICZnZnMyX2RvcHMpOwotCXJldHVybiBkZW50cnk7CisJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGdmczJfbG9va3VwaShjaGlsZC0+ZF9pbm9kZSwgJmdmczJfcWRvdGRvdCwgMSkpOwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2ZzMl9nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xMzksNyArMTM0LDYgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAKIAlpbm9kZSA9IGdmczJfaWxvb2t1cChzYiwgaW51bS0+bm9fYWRkcik7CiAJaWYgKGlub2RlKSB7CkBAIC0xNTYsMTAgKzE1MCw3IEBACiAJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAKIG91dF9pbm9kZToKLQlkZW50cnkgPSBkX29idGFpbl9hbGlhcyhpbm9kZSk7Ci0JaWYgKCFJU19FUlIoZGVudHJ5KSkKLQkJZF9zZXRfZF9vcChkZW50cnksICZnZnMyX2RvcHMpOwotCXJldHVybiBkZW50cnk7CisJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGlub2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmdmczJfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWQgKmZpZCwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5jb3JlLmggYi9mcy9nZnMyL2luY29yZS5oCmluZGV4IDhkM2QyYjQuLmE3OTc5MGMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5jb3JlLmgKKysrIGIvZnMvZ2ZzMi9pbmNvcmUuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBfX0lOQ09SRV9ET1RfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9kbG0uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuYwppbmRleCAyYWVhYmQ0Li43Nzc5MjdjIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19mc3R5cGUuYworKysgYi9mcy9nZnMyL29wc19mc3R5cGUuYwpAQCAtNDQwLDcgKzQ0MCw2IEBACiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JZF9zZXRfZF9vcChkZW50cnksICZnZnMyX2RvcHMpOwogCSpkcHRyID0gZGVudHJ5OwogCXJldHVybiAwOwogfQpAQCAtMTEwNiw2ICsxMTA1LDcgQEAKIAogCXNiLT5zX21hZ2ljID0gR0ZTMl9NQUdJQzsKIAlzYi0+c19vcCA9ICZnZnMyX3N1cGVyX29wczsKKwlzYi0+c19kX29wID0gJmdmczJfZG9wczsKIAlzYi0+c19leHBvcnRfb3AgPSAmZ2ZzMl9leHBvcnRfb3BzOwogCXNiLT5zX3hhdHRyID0gZ2ZzMl94YXR0cl9oYW5kbGVyczsKIAlzYi0+c19xY29wID0gJmdmczJfcXVvdGFjdGxfb3BzOwpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKLQlmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEOworCWZtb2RlX3QgbW9kZSA9IEZNT0RFX1JFQUQgfCBGTU9ERV9FWENMOwogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZ2ZzMl9hcmdzIGFyZ3M7CiAJc3RydWN0IGdmczJfc2JkICpzZHA7CkBAIC0xMjc2LDcgKzEyNzYsNyBAQAogCWlmICghKGZsYWdzICYgTVNfUkRPTkxZKSkKIAkJbW9kZSB8PSBGTU9ERV9XUklURTsKIAotCWJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldl9uYW1lLCBtb2RlLCBmc190eXBlKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKGRldl9uYW1lLCBtb2RlLCBmc190eXBlKTsKIAlpZiAoSVNfRVJSKGJkZXYpKQogCQlyZXR1cm4gRVJSX0NBU1QoYmRldik7CiAKQEAgLTEyOTgsNyArMTI5OCw3IEBACiAJCWdvdG8gZXJyb3JfYmRldjsKIAogCWlmIChzLT5zX3Jvb3QpCi0JCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGJkZXYsIG1vZGUpOworCQlibGtkZXZfcHV0KGJkZXYsIG1vZGUpOwogCiAJbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwogCWFyZ3MuYXJfcXVvdGEgPSBHRlMyX1FVT1RBX0RFRkFVTFQ7CkBAIC0xMzQyLDcgKzEzNDIsNyBAQAogCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIGVycm9yX2JkZXY6Ci0JY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgbW9kZSk7CisJYmxrZGV2X3B1dChiZGV2LCBtb2RlKTsKIAlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2lub2RlLmMgYi9mcy9nZnMyL29wc19pbm9kZS5jCmluZGV4IDE1MDFkYjQuLjA0MGI1YTIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfaW5vZGUuYwpAQCAtMTA2LDggKzEwNiw2IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgJmdmczJfZG9wcyk7Ci0KIAlpbm9kZSA9IGdmczJfbG9va3VwaShkaXIsICZkZW50cnktPmRfbmFtZSwgMCk7CiAJaWYgKGlub2RlICYmIElTX0VSUihpbm9kZSkpCiAJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CkBAIC0xNDI3LDYgKzE0MjUsMTAgQEAKIAlsb2ZmX3QgbmV4dCA9IChvZmZzZXQgKyBsZW4gLSAxKSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCW5leHQgPSAobmV4dCArIDEpIDw8IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQ7CiAKKwkvKiBXZSBvbmx5IHN1cHBvcnQgdGhlIEZBTExPQ19GTF9LRUVQX1NJWkUgbW9kZSAqLworCWlmIChtb2RlICYmIChtb2RlICE9IEZBTExPQ19GTF9LRUVQX1NJWkUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlvZmZzZXQgPSAob2Zmc2V0ID4+IHNkcC0+c2Rfc2Iuc2JfYnNpemVfc2hpZnQpIDw8CiAJCSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwogCmRpZmYgLS1naXQgYS9mcy9oZnMvZGlyLmMgYi9mcy9oZnMvZGlyLmMKaW5kZXggZWE0YWVmZS4uYWZhNjZhYSAxMDA2NDQKLS0tIGEvZnMvaGZzL2Rpci5jCisrKyBiL2ZzL2hmcy9kaXIuYwpAQCAtMjUsOCArMjUsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWludCByZXM7CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgJmhmc19kZW50cnlfb3BlcmF0aW9ucyk7Ci0KIAloZnNfZmluZF9pbml0KEhGU19TQihkaXItPmlfc2IpLT5jYXRfdHJlZSwgJmZkKTsKIAloZnNfY2F0X2J1aWxkX2tleShkaXItPmlfc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CiAJcmVzID0gaGZzX2JyZWNfcmVhZCgmZmQsICZyZWMsIHNpemVvZihyZWMpKTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zdXBlci5jIGIvZnMvaGZzL3N1cGVyLmMKaW5kZXggMGJlZjYyYS4uMWI1NWY3MCAxMDA2NDQKLS0tIGEvZnMvaGZzL3N1cGVyLmMKKysrIGIvZnMvaGZzL3N1cGVyLmMKQEAgLTQyOSwxMyArNDI5LDEyIEBACiAJaWYgKCFyb290X2lub2RlKQogCQlnb3RvIGJhaWxfbm9fcm9vdDsKIAorCXNiLT5zX2Rfb3AgPSAmaGZzX2RlbnRyeV9vcGVyYXRpb25zOwogCXJlcyA9IC1FTk9NRU07CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKIAlpZiAoIXNiLT5zX3Jvb3QpCiAJCWdvdG8gYmFpbF9pcHV0OwogCi0JZF9zZXRfZF9vcChzYi0+c19yb290LCAmaGZzX2RlbnRyeV9vcGVyYXRpb25zKTsKLQogCS8qIGV2ZXJ5dGhpbmcncyBva2F5ICovCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IGY4OTZkYzg0Li40ZGY1MDU5IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2Rpci5jCisrKyBiL2ZzL2hmc3BsdXMvZGlyLmMKQEAgLTM3LDcgKzM3LDYgQEAKIAogCXNiID0gZGlyLT5pX3NiOwogCi0JZF9zZXRfZF9vcChkZW50cnksICZoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zKTsKIAlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKIAloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKIAloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggNmVlNmFkMi4uOWEzYjQ3OSAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtNDQ0LDEzICs0NDQsMTMgQEAKIAkJZXJyID0gUFRSX0VSUihyb290KTsKIAkJZ290byBjbGVhbnVwOwogCX0KKwlzYi0+c19kX29wID0gJmhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKIAkJaXB1dChyb290KTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwogCX0KLQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zKTsKIAogCXN0ci5sZW4gPSBzaXplb2YoSEZTUF9ISURERU5ESVJfTkFNRSkgLSAxOwogCXN0ci5uYW1lID0gSEZTUF9ISURERU5ESVJfTkFNRTsKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggZDMyNDRkOS4uMjYzOGM4MzRlIDEwMDY0NAotLS0gYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYworKysgYi9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYwpAQCAtNjEyLDcgKzYxMiw2IEBACiAJCWdvdG8gb3V0X3B1dDsKIAogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCWRfc2V0X2Rfb3AoZGVudHJ5LCAmaG9zdGZzX2RlbnRyeV9vcHMpOwogCXJldHVybiBOVUxMOwogCiAgb3V0X3B1dDoKQEAgLTkyMiw2ICs5MjEsNyBAQAogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CiAJc2ItPnNfbWFnaWMgPSBIT1NURlNfU1VQRVJfTUFHSUM7CiAJc2ItPnNfb3AgPSAmaG9zdGZzX3Nib3BzOworCXNiLT5zX2Rfb3AgPSAmaG9zdGZzX2RlbnRyeV9vcHM7CiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCiAJLyogTlVMTCBpcyBwcmludGVkIGFzIDxOVUxMPiBieSBzcHJpbnRmOiBhdm9pZCB0aGF0LiAqLwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kZW50cnkuYyBiL2ZzL2hwZnMvZGVudHJ5LmMKaW5kZXggMzJjMTNhOS4uMDVkNDgxNiAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kZW50cnkuYworKysgYi9mcy9ocGZzL2RlbnRyeS5jCkBAIC01OCwxMiArNTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGhwZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7Citjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaHBmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKIAkuZF9oYXNoCQk9IGhwZnNfaGFzaF9kZW50cnksCiAJLmRfY29tcGFyZQk9IGhwZnNfY29tcGFyZV9kZW50cnksCiB9OwotCi12b2lkIGhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQlkX3NldF9kX29wKGRlbnRyeSwgJmhwZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKaW5kZXggMjMzODEzMC4uZDMyZjYzYSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9kaXIuYworKysgYi9mcy9ocGZzL2Rpci5jCkBAIC0yOTgsNyArMjk4LDYgQEAKIAogCWVuZDoKIAllbmRfYWRkOgotCWhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKGRlbnRyeSk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCWRfYWRkKGRlbnRyeSwgcmVzdWx0KTsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvaHBmc19mbi5oIGIvZnMvaHBmcy9ocGZzX2ZuLmgKaW5kZXggMmZlZTE3ZC4uMWM0M2RiZSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9ocGZzX2ZuLmgKKysrIGIvZnMvaHBmcy9ocGZzX2ZuLmgKQEAgLTIzMyw3ICsyMzMsNyBAQAogCiAvKiBkZW50cnkuYyAqLwogCi12b2lkIGhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGhwZnNfZGVudHJ5X29wZXJhdGlvbnM7CiAKIC8qIGRpci5jICovCiAKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvc3VwZXIuYyBiL2ZzL2hwZnMvc3VwZXIuYwppbmRleCA0OTkzNWJhLi5iMzA0MjZiIDEwMDY0NAotLS0gYS9mcy9ocGZzL3N1cGVyLmMKKysrIGIvZnMvaHBmcy9zdXBlci5jCkBAIC01NTAsNiArNTUwLDcgQEAKIAkvKiBGaWxsIHN1cGVyYmxvY2sgc3R1ZmYgKi8KIAlzLT5zX21hZ2ljID0gSFBGU19TVVBFUl9NQUdJQzsKIAlzLT5zX29wID0gJmhwZnNfc29wczsKKwlzLT5zX2Rfb3AgPSAmaHBmc19kZW50cnlfb3BlcmF0aW9uczsKIAogCXNiaS0+c2Jfcm9vdCA9IHN1cGVyYmxvY2stPnJvb3Q7CiAJc2JpLT5zYl9mc19zaXplID0gc3VwZXJibG9jay0+bl9zZWN0b3JzOwpAQCAtNjUxLDcgKzY1Miw2IEBACiAJCWlwdXQocm9vdCk7CiAJCWdvdG8gYmFpbDA7CiAJfQotCWhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKHMtPnNfcm9vdCk7CiAKIAkvKgogCSAqIGZpbmQgdGhlIHJvb3QgZGlyZWN0b3J5J3MgLiBwb2ludGVyICYgZmluaXNoIGZpbGxpbmcgaW4gdGhlIGlub2RlCmRpZmYgLS1naXQgYS9mcy9pc29mcy9pbm9kZS5jIGIvZnMvaXNvZnMvaW5vZGUuYwppbmRleCA4NDRhNzkwLi5hMGYzODMzIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pbm9kZS5jCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTkzOSwxNyArOTM5LDE4IEBACiAJCWdvdG8gb3V0X2lwdXQ7CiAJfQogCi0JLyogZ2V0IHRoZSByb290IGRlbnRyeSAqLwotCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7Ci0JaWYgKCEocy0+c19yb290KSkKLQkJZ290byBvdXRfbm9fcm9vdDsKLQogCXRhYmxlID0gMDsKIAlpZiAoam9saWV0X2xldmVsKQogCQl0YWJsZSArPSAyOwogCWlmIChvcHQuY2hlY2sgPT0gJ3InKQogCQl0YWJsZSsrOwotCWRfc2V0X2Rfb3Aocy0+c19yb290LCAmaXNvZnNfZGVudHJ5X29wc1t0YWJsZV0pOworCisJcy0+c19kX29wID0gJmlzb2ZzX2RlbnRyeV9vcHNbdGFibGVdOworCisJLyogZ2V0IHRoZSByb290IGRlbnRyeSAqLworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCEocy0+c19yb290KSkKKwkJZ290byBvdXRfbm9fcm9vdDsKIAogCWtmcmVlKG9wdC5pb2NoYXJzZXQpOwogCmRpZmYgLS1naXQgYS9mcy9pc29mcy9uYW1laS5jIGIvZnMvaXNvZnMvbmFtZWkuYwppbmRleCA2NzlhODQ5Li40ZmIzZTgwIDEwMDY0NAotLS0gYS9mcy9pc29mcy9uYW1laS5jCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTE3Miw4ICsxNzIsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3ApOwotCiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CmRpZmYgLS1naXQgYS9mcy9qYmQvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCmluZGV4IDg0NmEzZjMuLjViMmU0YzMgMTAwNjQ0Ci0tLSBhL2ZzL2piZC90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAkgKiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbi4gIFJlYWxseSwgd2Ugb25seSBuZWVkIHRvIGdpdmUgaXQKIAkgKiBjb21taXR0aW5nX3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgcGx1cyAiZW5vdWdoIiBmb3IKIAkgKiB0aGUgbG9nIGNvbnRyb2wgYmxvY2tzLgotCSAqIEFsc28sIHRoaXMgdGVzdCBpcyBpbmNvbnNpdGVudCB3aXRoIHRoZSBtYXRjaGluZyBvbmUgaW4KKwkgKiBBbHNvLCB0aGlzIHRlc3QgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIG1hdGNoaW5nIG9uZSBpbgogCSAqIGpvdXJuYWxfZXh0ZW5kKCkuCiAJICovCiAJaWYgKF9fbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpKSB7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4IGY4MzdiYTkuLjllNDY4NjkgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5hbC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9qYmQyLmg+CkBAIC05Myw2ICs5NCw3IEBACiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9pbml0X2piZF9pbm9kZSk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZSk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9iZWdpbl9vcmRlcmVkX3RydW5jYXRlKTsKK0VYUE9SVF9TWU1CT0woamJkMl9pbm9kZV9jYWNoZSk7CiAKIHN0YXRpYyBpbnQgam91cm5hbF9jb252ZXJ0X3N1cGVyYmxvY2tfdjEoam91cm5hbF90ICosIGpvdXJuYWxfc3VwZXJibG9ja190ICopOwogc3RhdGljIHZvaWQgX19qb3VybmFsX2Fib3J0X3NvZnQgKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKTsKQEAgLTgyNyw3ICs4MjksNyBAQAogCiAJam91cm5hbCA9IGt6YWxsb2Moc2l6ZW9mKCpqb3VybmFsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFqb3VybmFsKQotCQlnb3RvIGZhaWw7CisJCXJldHVybiBOVUxMOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X2xvZ3NwYWNlKTsKQEAgLTg1MiwxNCArODU0LDEyIEBACiAJZXJyID0gamJkMl9qb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWwsIEpPVVJOQUxfUkVWT0tFX0RFRkFVTFRfSEFTSCk7CiAJaWYgKGVycikgewogCQlrZnJlZShqb3VybmFsKTsKLQkJZ290byBmYWlsOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9oaXN0b3J5X2xvY2spOwogCiAJcmV0dXJuIGpvdXJuYWw7Ci1mYWlsOgotCXJldHVybiBOVUxMOwogfQogCiAvKiBqYmQyX2pvdXJuYWxfaW5pdF9kZXYgYW5kIGpiZDJfam91cm5hbF9pbml0X2lub2RlOgpAQCAtMTk4Miw3ICsxOTgyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2FsbG9jX2pvdXJuYWxfaGVhZCh2b2lkKQogewogCXN0cnVjdCBqb3VybmFsX2hlYWQgKnJldDsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3dhcm5pbmc7CiAKICNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwogCWF0b21pY19pbmMoJm5yX2pvdXJuYWxfaGVhZHMpOwpAQCAtMTk5MCwxMSArMTk4OSw3IEBACiAJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSwgR0ZQX05PRlMpOwogCWlmICghcmV0KSB7CiAJCWpiZF9kZWJ1ZygxLCAib3V0IG9mIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkXG4iKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF93YXJuaW5nICsgNSpIWikpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiRU5PTUVNIGluICVzLCByZXRyeWluZy5cbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJbGFzdF93YXJuaW5nID0gamlmZmllczsKLQkJfQorCQlwcl9ub3RpY2VfcmF0ZWxpbWl0ZWQoIkVOT01FTSBpbiAlcywgcmV0cnlpbmcuXG4iLCBfX2Z1bmNfXyk7CiAJCXdoaWxlICghcmV0KSB7CiAJCQl5aWVsZCgpOwogCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhqYmQyX2pvdXJuYWxfaGVhZF9jYWNoZSwgR0ZQX05PRlMpOwpAQCAtMjI5MiwxNyArMjI4NywxOSBAQAogCiAjZW5kaWYKIAotc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfaGFuZGxlX2NhY2hlOworc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfaGFuZGxlX2NhY2hlLCAqamJkMl9pbm9kZV9jYWNoZTsKIAogc3RhdGljIGludCBfX2luaXQgam91cm5hbF9pbml0X2hhbmRsZV9jYWNoZSh2b2lkKQogewotCWpiZDJfaGFuZGxlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpiZDJfam91cm5hbF9oYW5kbGUiLAotCQkJCXNpemVvZihoYW5kbGVfdCksCi0JCQkJMCwJCS8qIG9mZnNldCAqLwotCQkJCVNMQUJfVEVNUE9SQVJZLAkvKiBmbGFncyAqLwotCQkJCU5VTEwpOwkJLyogY3RvciAqLworCWpiZDJfaGFuZGxlX2NhY2hlID0gS01FTV9DQUNIRShqYmQyX2pvdXJuYWxfaGFuZGxlLCBTTEFCX1RFTVBPUkFSWSk7CiAJaWYgKGpiZDJfaGFuZGxlX2NhY2hlID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkpCRDogZmFpbGVkIHRvIGNyZWF0ZSBoYW5kbGUgY2FjaGVcbiIpOworCQlwcmludGsoS0VSTl9FTUVSRyAiSkJEMjogZmFpbGVkIHRvIGNyZWF0ZSBoYW5kbGUgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJamJkMl9pbm9kZV9jYWNoZSA9IEtNRU1fQ0FDSEUoamJkMl9pbm9kZSwgMCk7CisJaWYgKGpiZDJfaW5vZGVfY2FjaGUgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FTUVSRyAiSkJEMjogZmFpbGVkIHRvIGNyZWF0ZSBpbm9kZSBjYWNoZVxuIik7CisJCWttZW1fY2FjaGVfZGVzdHJveShqYmQyX2hhbmRsZV9jYWNoZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyZXR1cm4gMDsKQEAgLTIzMTIsNiArMjMwOSw5IEBACiB7CiAJaWYgKGpiZDJfaGFuZGxlX2NhY2hlKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koamJkMl9oYW5kbGVfY2FjaGUpOworCWlmIChqYmQyX2lub2RlX2NhY2hlKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koamJkMl9pbm9kZV9jYWNoZSk7CisKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2piZDIvcmVjb3ZlcnkuYyBiL2ZzL2piZDIvcmVjb3ZlcnkuYwppbmRleCAyYmM0ZDVmLi4xY2FkODY5IDEwMDY0NAotLS0gYS9mcy9qYmQyL3JlY292ZXJ5LmMKKysrIGIvZnMvamJkMi9yZWNvdmVyeS5jCkBAIC0yOTksMTAgKzI5OSwxMCBAQAogI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCiAJCWludCBkcm9wcGVkID0gaW5mby5lbmRfdHJhbnNhY3Rpb24gLSAKIAkJCWJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19zZXF1ZW5jZSk7Ci0jZW5kaWYKIAkJamJkX2RlYnVnKDEsCiAJCQkgICJKQkQ6IGlnbm9yaW5nICVkIHRyYW5zYWN0aW9uJXMgZnJvbSB0aGUgam91cm5hbC5cbiIsCiAJCQkgIGRyb3BwZWQsIChkcm9wcGVkID09IDEpID8gIiIgOiAicyIpOworI2VuZGlmCiAJCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSArK2luZm8uZW5kX3RyYW5zYWN0aW9uOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvamJkMi90cmFuc2FjdGlvbi5jIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCmluZGV4IDZiZjBhMjQuLmZhYWQyYmQgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYworKysgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCSAqIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLiAgUmVhbGx5LCB3ZSBvbmx5IG5lZWQgdG8gZ2l2ZSBpdAogCSAqIGNvbW1pdHRpbmdfdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyBwbHVzICJlbm91Z2giIGZvcgogCSAqIHRoZSBsb2cgY29udHJvbCBibG9ja3MuCi0JICogQWxzbywgdGhpcyB0ZXN0IGlzIGluY29uc2l0ZW50IHdpdGggdGhlIG1hdGNoaW5nIG9uZSBpbgorCSAqIEFsc28sIHRoaXMgdGVzdCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgbWF0Y2hpbmcgb25lIGluCiAJICogamJkMl9qb3VybmFsX2V4dGVuZCgpLgogCSAqLwogCWlmIChfX2piZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpKSB7CkBAIC0zNDAsOSArMzQwLDcgQEAKIAkJamJkMl9mcmVlX2hhbmRsZShoYW5kbGUpOwogCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOwogCQloYW5kbGUgPSBFUlJfUFRSKGVycik7Ci0JCWdvdG8gb3V0OwogCX0KLW91dDoKIAlyZXR1cm4gaGFuZGxlOwogfQogRVhQT1JUX1NZTUJPTChqYmQyX19qb3VybmFsX3N0YXJ0KTsKQEAgLTU4OSw3ICs1ODcsNyBAQAogCXRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOwogCWpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOwogCi0JamJkX2RlYnVnKDUsICJidWZmZXJfaGVhZCAlcCwgZm9yY2VfY29weSAlZFxuIiwgamgsIGZvcmNlX2NvcHkpOworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwLCBmb3JjZV9jb3B5ICVkXG4iLCBqaCwgZm9yY2VfY29weSk7CiAKIAlKQlVGRkVSX1RSQUNFKGpoLCAiZW50cnkiKTsKIHJlcGVhdDoKQEAgLTc3NCw3ICs3NzIsNyBAQAogCQlKX0VYUEVDVF9KSChqaCwgYnVmZmVyX3VwdG9kYXRlKGpoMmJoKGpoKSksCiAJCQkgICAgIlBvc3NpYmxlIElPIGZhaWx1cmUuXG4iKTsKIAkJcGFnZSA9IGpoMmJoKGpoKS0+Yl9wYWdlOwotCQlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpIGpoMmJoKGpoKS0+Yl9kYXRhKSAmIH5QQUdFX01BU0s7CisJCW9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoMmJoKGpoKS0+Yl9kYXRhKTsKIAkJc291cmNlID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCQkvKiBGaXJlIGRhdGEgZnJvemVuIHRyaWdnZXIganVzdCBiZWZvcmUgd2UgY29weSB0aGUgZGF0YSAqLwogCQlqYmQyX2J1ZmZlcl9mcm96ZW5fdHJpZ2dlcihqaCwgc291cmNlICsgb2Zmc2V0LApkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19sb2dtZ3IuYyBiL2ZzL2pmcy9qZnNfbG9nbWdyLmMKaW5kZXggZTFiODQ5My4uMjc4ZTNmYiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19sb2dtZ3IuYworKysgYi9mcy9qZnMvamZzX2xvZ21nci5jCkBAIC0xMTIwLDE2ICsxMTIwLDEzIEBACiAJICogZmlsZSBzeXN0ZW1zIHRvIGxvZyBtYXkgaGF2ZSBuLXRvLTEgcmVsYXRpb25zaGlwOwogCSAqLwogCi0JYmRldiA9IG9wZW5fYnlfZGV2bnVtKHNiaS0+bG9nZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9kZXYoc2JpLT5sb2dkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCwKKwkJCQkgbG9nKTsKIAlpZiAoSVNfRVJSKGJkZXYpKSB7CiAJCXJjID0gLVBUUl9FUlIoYmRldik7CiAJCWdvdG8gZnJlZTsKIAl9CiAKLQlpZiAoKHJjID0gYmRfY2xhaW0oYmRldiwgbG9nKSkpIHsKLQkJZ290byBjbG9zZTsKLQl9Ci0KIAlsb2ctPmJkZXYgPSBiZGV2OwogCW1lbWNweShsb2ctPnV1aWQsIHNiaS0+bG9ndXVpZCwgc2l6ZW9mKGxvZy0+dXVpZCkpOwogCkBAIC0xMTM3LDcgKzExMzQsNyBAQAogCSAqIGluaXRpYWxpemUgbG9nOgogCSAqLwogCWlmICgocmMgPSBsbUxvZ0luaXQobG9nKSkpCi0JCWdvdG8gdW5jbGFpbTsKKwkJZ290byBjbG9zZTsKIAogCWxpc3RfYWRkKCZsb2ctPmpvdXJuYWxfbGlzdCwgJmpmc19leHRlcm5hbF9sb2dzKTsKIApAQCAtMTE2MywxMSArMTE2MCw4IEBACiAJbGlzdF9kZWwoJmxvZy0+am91cm5hbF9saXN0KTsKIAlsYm1Mb2dTaHV0ZG93bihsb2cpOwogCi0gICAgICB1bmNsYWltOgotCWJkX3JlbGVhc2UoYmRldik7Ci0KICAgICAgIGNsb3NlOgkJLyogY2xvc2UgZXh0ZXJuYWwgbG9nIGRldmljZSAqLwotCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wpOwogCiAgICAgICBmcmVlOgkJLyogZnJlZSBsb2cgZGVzY3JpcHRvciAqLwogCW11dGV4X3VubG9jaygmamZzX2xvZ19tdXRleCk7CkBAIC0xNTEyLDggKzE1MDYsNyBAQAogCWJkZXYgPSBsb2ctPmJkZXY7CiAJcmMgPSBsbUxvZ1NodXRkb3duKGxvZyk7CiAKLQliZF9yZWxlYXNlKGJkZXYpOwotCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wpOwogCiAJa2ZyZWUobG9nKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL25hbWVpLmMgYi9mcy9qZnMvbmFtZWkuYwppbmRleCA0NDE0ZTNhLi44MWVhZDg1IDEwMDY0NAotLS0gYS9mcy9qZnMvbmFtZWkuYworKysgYi9mcy9qZnMvbmFtZWkuYwpAQCAtMTQ2NSw5ICsxNDY1LDYgQEAKIAogCWpmc19pbmZvKCJqZnNfbG9va3VwOiBuYW1lID0gJXMiLCBuYW1lKTsKIAotCWlmIChKRlNfU0JJKGRpcC0+aV9zYiktPm1udGZsYWcgJiBKRlNfT1MyKQotCQlkX3NldF9kX29wKGRlbnRyeSwgJmpmc19jaV9kZW50cnlfb3BlcmF0aW9ucyk7Ci0KIAlpZiAoKG5hbWVbMF0gPT0gJy4nKSAmJiAobGVuID09IDEpKQogCQlpbnVtID0gZGlwLT5pX2lubzsKIAllbHNlIGlmIChzdHJjbXAobmFtZSwgIi4uIikgPT0gMCkKQEAgLTE0OTIsMTIgKzE0ODksNyBAQAogCQlyZXR1cm4gRVJSX0NBU1QoaXApOwogCX0KIAotCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOwotCi0JaWYgKGRlbnRyeSAmJiAoSkZTX1NCSShkaXAtPmlfc2IpLT5tbnRmbGFnICYgSkZTX09TMikpCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmamZzX2NpX2RlbnRyeV9vcGVyYXRpb25zKTsKLQotCXJldHVybiBkZW50cnk7CisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOwogfQogCiBzdGF0aWMgc3RydWN0IGlub2RlICpqZnNfbmZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApkaWZmIC0tZ2l0IGEvZnMvamZzL3N1cGVyLmMgYi9mcy9qZnMvc3VwZXIuYwppbmRleCAzMTUwZDc2Li5lZWNhNDhhIDEwMDY0NAotLS0gYS9mcy9qZnMvc3VwZXIuYworKysgYi9mcy9qZnMvc3VwZXIuYwpAQCAtNTE1LDYgKzUxNSw5IEBACiAKIAlzYi0+c19tYWdpYyA9IEpGU19TVVBFUl9NQUdJQzsKIAorCWlmIChzYmktPm1udGZsYWcgJiBKRlNfT1MyKQorCQlzYi0+c19kX29wID0gJmpmc19jaV9kZW50cnlfb3BlcmF0aW9uczsKKwogCWlub2RlID0gamZzX2lnZXQoc2IsIFJPT1RfSSk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CkBAIC01MjQsOSArNTI3LDYgQEAKIAlpZiAoIXNiLT5zX3Jvb3QpCiAJCWdvdG8gb3V0X25vX3Jvb3Q7CiAKLQlpZiAoc2JpLT5tbnRmbGFnICYgSkZTX09TMikKLQkJZF9zZXRfZF9vcChzYi0+c19yb290LCAmamZzX2NpX2RlbnRyeV9vcGVyYXRpb25zKTsKLQogCS8qIGxvZ2ljYWwgYmxvY2tzIGFyZSByZXByZXNlbnRlZCBieSA0MCBiaXRzIGluIHB4ZF90LCBldGMuICovCiAJc2ItPnNfbWF4Ynl0ZXMgPSAoKHU2NCkgc2ItPnNfYmxvY2tzaXplKSA8PCA0MDsKICNpZiBCSVRTX1BFUl9MT05HID09IDMyCmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwppbmRleCA4ODkzMTFlLi5jODhlYWI1IDEwMDY0NAotLS0gYS9mcy9saWJmcy5jCisrKyBiL2ZzL2xpYmZzLmMKQEAgLTIxNyw3ICsyMTcsOCBAQAogICogd2lsbCBuZXZlciBiZSBtb3VudGFibGUpCiAgKi8KIHN0cnVjdCBkZW50cnkgKm1vdW50X3BzZXVkbyhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgY2hhciAqbmFtZSwKLQljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3BzLCB1bnNpZ25lZCBsb25nIG1hZ2ljKQorCWNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpvcHMsCisJY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zICpkb3BzLCB1bnNpZ25lZCBsb25nIG1hZ2ljKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHNnZXQoZnNfdHlwZSwgTlVMTCwgc2V0X2Fub25fc3VwZXIsIE5VTEwpOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKQEAgLTI1NCw2ICsyNTUsNyBAQAogCWRlbnRyeS0+ZF9wYXJlbnQgPSBkZW50cnk7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIHJvb3QpOwogCXMtPnNfcm9vdCA9IGRlbnRyeTsKKwlzLT5zX2Rfb3AgPSBkb3BzOwogCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwogCXJldHVybiBkZ2V0KHMtPnNfcm9vdCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL01ha2VmaWxlIGIvZnMvbG9ja2QvTWFrZWZpbGUKaW5kZXggOTdmNjA3My4uY2E1OGQ2NCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvTWFrZWZpbGUKKysrIGIvZnMvbG9ja2QvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIG9iai0kKENPTkZJR19MT0NLRCkgKz0gbG9ja2QubwogCi1sb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGhvc3QubyBzdmMubyBzdmNsb2NrLm8gc3Zjc2hhcmUubyBcCi0JICAgICAgICBzdmNwcm9jLm8gc3Zjc3Vicy5vIG1vbi5vIHhkci5vIGdyYWNlLm8KLWxvY2tkLW9ianMtJChDT05GSUdfTE9DS0RfVjQpICs9IHhkcjQubyBzdmM0cHJvYy5vCitsb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGNsbnR4ZHIubyBob3N0Lm8gc3ZjLm8gc3ZjbG9jay5vIFwKKwkgICAgICAgIHN2Y3NoYXJlLm8gc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubyBncmFjZS5vCitsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSBjbG50NHhkci5vIHhkcjQubyBzdmM0cHJvYy5vCiBsb2NrZC1vYmpzCQkgICAgICA6PSAkKGxvY2tkLW9ianMteSkKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnQ0eGRyLmMgYi9mcy9sb2NrZC9jbG50NHhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDhiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9jbG50NHhkci5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogbGludXgvZnMvbG9ja2QvY2xudDR4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBOTE0gdmVyc2lvbiA0IFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKgorICogTkxNIGNsaWVudC1zaWRlIG9ubHkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKyNpZiAoTkxNQ0xOVF9PSFNJWkUgPiBYRFJfTUFYX05FVE9CSikKKyMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBYRFJfTUFYX05FVE9CSiEiCisjZW5kaWYKKworI2lmIChOTE1DTE5UX09IU0laRSA+IE5MTV9NQVhTVFJMRU4pCisjICBlcnJvciAiTkxNIGhvc3QgbmFtZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gTkxNJ3MgbWF4aW11bSBzdHJpbmcgbGVuZ3RoISIKKyNlbmRpZgorCisvKgorICogRGVjbGFyZSB0aGUgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBOTE0gYXJndW1lbnRzIGFuZCByZXBsaWVzIGFzCisgKiBudW1iZXIgb2YgMzJiaXQtd29yZHMKKyAqLworI2RlZmluZSBOTE00X3ZvaWRfc3oJCSgwKQorI2RlZmluZSBOTE00X2Nvb2tpZV9zegkJKDErKE5MTV9NQVhDT09LSUVMRU4+PjIpKQorI2RlZmluZSBOTE00X2NhbGxlcl9zegkJKDErKE5MTUNMTlRfT0hTSVpFPj4yKSkKKyNkZWZpbmUgTkxNNF9vd25lcl9zegkJKDErKE5MTUNMTlRfT0hTSVpFPj4yKSkKKyNkZWZpbmUgTkxNNF9maGFuZGxlX3N6CQkoMSsoTkZTM19GSFNJWkU+PjIpKQorI2RlZmluZSBOTE00X2xvY2tfc3oJCSg1K05MTTRfY2FsbGVyX3N6K05MTTRfb3duZXJfc3orTkxNNF9maGFuZGxlX3N6KQorI2RlZmluZSBOTE00X2hvbGRlcl9zegkJKDYrTkxNNF9vd25lcl9zeikKKworI2RlZmluZSBOTE00X3Rlc3RhcmdzX3N6CShOTE00X2Nvb2tpZV9zeisxK05MTTRfbG9ja19zeikKKyNkZWZpbmUgTkxNNF9sb2NrYXJnc19zegkoTkxNNF9jb29raWVfc3orNCtOTE00X2xvY2tfc3opCisjZGVmaW5lIE5MTTRfY2FuY2FyZ3Nfc3oJKE5MTTRfY29va2llX3N6KzIrTkxNNF9sb2NrX3N6KQorI2RlZmluZSBOTE00X3VubG9ja2FyZ3Nfc3oJKE5MTTRfY29va2llX3N6K05MTTRfbG9ja19zeikKKworI2RlZmluZSBOTE00X3Rlc3RyZXNfc3oJCShOTE00X2Nvb2tpZV9zeisxK05MTTRfaG9sZGVyX3N6KQorI2RlZmluZSBOTE00X3Jlc19zegkJKE5MTTRfY29va2llX3N6KzEpCisjZGVmaW5lIE5MTTRfbm9yZXBfc3oJCSgwKQorCisKK3N0YXRpYyBzNjQgbG9mZl90X3RvX3M2NChsb2ZmX3Qgb2Zmc2V0KQoreworCXM2NCByZXM7CisKKwlpZiAob2Zmc2V0ID49IE5MTTRfT0ZGU0VUX01BWCkKKwkJcmVzID0gTkxNNF9PRkZTRVRfTUFYOworCWVsc2UgaWYgKG9mZnNldCA8PSAtTkxNNF9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNNF9PRkZTRVRfTUFYOworCWVsc2UKKwkJcmVzID0gb2Zmc2V0OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIG5sbTRfY29tcHV0ZV9vZmZzZXRzKGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaywKKwkJCQkgdTY0ICpsX29mZnNldCwgdTY0ICpsX2xlbikKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZsb2NrLT5mbDsKKworCUJVR19PTihmbC0+Zmxfc3RhcnQgPiBOTE00X09GRlNFVF9NQVgpOworCUJVR19PTihmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmCisJCQkJZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKTsKKworCSpsX29mZnNldCA9IGxvZmZfdF90b19zNjQoZmwtPmZsX3N0YXJ0KTsKKwlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQorCQkqbF9sZW4gPSAwOworCWVsc2UKKwkJKmxfbGVuID0gbG9mZl90X3RvX3M2NChmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMSk7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVjb2RlIGJ1ZmZlciBvdmVyZmxvd3Mgb3V0LW9mLWxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X292ZXJmbG93X21zZyhjb25zdCBjaGFyICpmdW5jLCBjb25zdCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCWRwcmludGsoImxvY2tkOiAlcyBwcmVtYXR1cmVseSBoaXQgdGhlIGVuZCBvZiBvdXIgcmVjZWl2ZSBidWZmZXIuICIKKwkJIlJlbWFpbmluZyBidWZmZXIgbGVuZ3RoIGlzICV0dSB3b3Jkcy5cbiIsCisJCWZ1bmMsIHhkci0+ZW5kIC0geGRyLT5wKTsKK30KKworCisvKgorICogRW5jb2RlL2RlY29kZSBOTE12NCBiYXNpYyBkYXRhIHR5cGVzCisgKgorICogQmFzaWMgTkxNdjQgZGF0YSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBBcHBlbmRpeCBJSSwgc2VjdGlvbiA2LjEuNAorICogb2YgUkZDIDE4MTM6ICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iIGFuZCBpbiBDaGFwdGVyCisgKiAxMCBvZiBYL09wZW4ncyAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICoKKyAqIE5vdCBhbGwgYmFzaWMgZGF0YSB0eXBlcyBoYXZlIHRoZWlyIG93biBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIGZ1bmN0aW9ucy4gIEZvciBydW4tdGltZSBlZmZpY2llbmN5LCBzb21lIGRhdGEgdHlwZXMgYXJlIGVuY29kZWQKKyAqIG9yIGRlY29kZWQgaW5saW5lLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ib29sKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCA9IHZhbHVlID8geGRyX29uZSA6IHhkcl96ZXJvOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfaW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgczMyIHZhbHVlKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIodmFsdWUpOworfQorCisvKgorICoJdHlwZWRlZiBvcGFxdWUgbmV0b2JqPE1BWE5FVE9CSl9TWj4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisKKwlCVUdfT04obGVuZ3RoID4gWERSX01BWF9ORVRPQkopOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJIHN0cnVjdCB4ZHJfbmV0b2JqICpvYmopCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KGxlbmd0aCA+IFhEUl9NQVhfTkVUT0JKKSkKKwkJZ290byBvdXRfc2l6ZTsKKwlvYmotPmxlbiA9IGxlbmd0aDsKKwlvYmotPmRhdGEgPSAodTggKilwOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBuZXRvYmogd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogY29va2llOworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgIGNvbnN0IHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJQlVHX09OKGNvb2tpZS0+bGVuID4gTkxNX01BWENPT0tJRUxFTik7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZjb29raWUtPmRhdGEsIGNvb2tpZS0+bGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJLyogYXBwYXJlbnRseSBIUFVYIGNhbiByZXR1cm4gZW1wdHkgY29va2llcyAqLworCWlmIChsZW5ndGggPT0gMCkKKwkJZ290byBvdXRfaHB1eDsKKwlpZiAobGVuZ3RoID4gTkxNX01BWENPT0tJRUxFTikKKwkJZ290byBvdXRfc2l6ZTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBsZW5ndGgpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwljb29raWUtPmxlbiA9IGxlbmd0aDsKKwltZW1jcHkoY29va2llLT5kYXRhLCBwLCBsZW5ndGgpOworCXJldHVybiAwOworb3V0X2hwdXg6CisJY29va2llLT5sZW4gPSA0OworCW1lbXNldChjb29raWUtPmRhdGEsIDAsIDQpOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBjb29raWUgd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogZmg7CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9maChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwlCVUdfT04oZmgtPnNpemUgPiBORlMzX0ZIU0laRSk7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZmaC0+ZGF0YSwgZmgtPnNpemUpOworfQorCisvKgorICoJZW51bSBubG00X3N0YXRzIHsKKyAqCQlOTE00X0dSQU5URUQgPSAwLAorICoJCU5MTTRfREVOSUVEID0gMSwKKyAqCQlOTE00X0RFTklFRF9OT0xPQ0tTID0gMiwKKyAqCQlOTE00X0JMT0NLRUQgPSAzLAorICoJCU5MTTRfREVOSUVEX0dSQUNFX1BFUklPRCA9IDQsCisgKgkJTkxNNF9ERUFETENLID0gNSwKKyAqCQlOTE00X1JPRlMgPSA2LAorICoJCU5MTTRfU1RBTEVfRkggPSA3LAorICoJCU5MTTRfRkJJRyA9IDgsCisgKgkJTkxNNF9GQUlMRUQgPSA5CisgKgl9OworICoKKyAqCXN0cnVjdCBubG00X3N0YXQgeworICoJCW5sbTRfc3RhdHMgc3RhdDsKKyAqCX07CisgKgorICogTkI6IHdlIGRvbid0IHN3YXAgYnl0ZXMgZm9yIHRoZSBOTE0gc3RhdHVzIHZhbHVlcy4gIFRoZSB1cHBlcgorICogbGF5ZXJzIGRlYWwgZGlyZWN0bHkgd2l0aCB0aGUgc3RhdHVzIHZhbHVlIGluIG5ldHdvcmsgYnl0ZQorICogb3JkZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG00X3N0YXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3QgX19iZTMyIHN0YXQpCit7CisJX19iZTMyICpwOworCisJQlVHX09OKGJlMzJfdG9fY3B1KHN0YXQpID4gTkxNX0ZBSUxFRCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBzdGF0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG00X3N0YXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgX19iZTMyICpzdGF0KQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAodW5saWtlbHkoKnAgPiBubG00X2ZhaWxlZCkpCisJCWdvdG8gb3V0X2JhZF94ZHI7CisJKnN0YXQgPSAqcDsKKwlyZXR1cm4gMDsKK291dF9iYWRfeGRyOgorCWRwcmludGsoIiVzOiBzZXJ2ZXIgcmV0dXJuZWQgaW52YWxpZCBubG00X3N0YXRzIHZhbHVlOiAldVxuIiwKKwkJCV9fZnVuY19fLCBiZTMyX3RvX2NwdXAocCkpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X2hvbGRlciB7CisgKgkJYm9vbAlleGNsdXNpdmU7CisgKgkJaW50MzIJc3ZpZDsKKyAqCQluZXRvYmoJb2g7CisgKgkJdWludDY0CWxfb2Zmc2V0OworICoJCXVpbnQ2NAlsX2xlbjsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG00X2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrID0gJnJlc3VsdC0+bG9jazsKKwl1NjQgbF9vZmZzZXQsIGxfbGVuOworCV9fYmUzMiAqcDsKKworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1JETENLKTsKKwllbmNvZGVfaW50MzIoeGRyLCBsb2NrLT5zdmlkKTsKKwllbmNvZGVfbmV0b2JqKHhkciwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA0KTsKKwlubG00X2NvbXB1dGVfb2Zmc2V0cyhsb2NrLCAmbF9vZmZzZXQsICZsX2xlbik7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbF9vZmZzZXQpOworCXhkcl9lbmNvZGVfaHlwZXIocCwgbF9sZW4pOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG00X2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCXN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZyZXN1bHQtPmxvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAmbG9jay0+Zmw7CisJdTY0IGxfb2Zmc2V0LCBsX2xlbjsKKwl1MzIgZXhjbHVzaXZlOworCWludCBlcnJvcjsKKwlfX2JlMzIgKnA7CisJczMyIGVuZDsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlleGNsdXNpdmUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlsb2NrLT5zdmlkID0gYmUzMl90b19jcHVwKHApOworCWZsLT5mbF9waWQgPSAocGlkX3QpbG9jay0+c3ZpZDsKKworCWVycm9yID0gZGVjb2RlX25ldG9iaih4ZHIsICZsb2NrLT5vaCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA4ICsgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCisJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJZmwtPmZsX3R5cGUgID0gZXhjbHVzaXZlICE9IDAgPyBGX1dSTENLIDogRl9SRExDSzsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbF9vZmZzZXQpOworCXhkcl9kZWNvZGVfaHlwZXIocCwgJmxfbGVuKTsKKwllbmQgPSBsX29mZnNldCArIGxfbGVuIC0gMTsKKworCWZsLT5mbF9zdGFydCA9IChsb2ZmX3QpbF9vZmZzZXQ7CisJaWYgKGxfbGVuID09IDAgfHwgZW5kIDwgMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJZWxzZQorCQlmbC0+ZmxfZW5kID0gKGxvZmZfdCllbmQ7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKglzdHJpbmcgY2FsbGVyX25hbWU8TE1fTUFYU1RSTEVOPjsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2NhbGxlcl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogTkI6IGNsaWVudC1zaWRlIGRvZXMgbm90IHNldCBsb2NrLT5sZW4gKi8KKwl1MzIgbGVuZ3RoID0gc3RybGVuKG5hbWUpOworCV9fYmUzMiAqcDsKKworCUJVR19PTihsZW5ndGggPiBOTE1fTUFYU1RSTEVOKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuZ3RoKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBuYW1lLCBsZW5ndGgpOworfQorCisvKgorICoJc3RydWN0IG5sbTRfbG9jayB7CisgKgkJc3RyaW5nCWNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisgKgkJbmV0b2JqCWZoOworICoJCW5ldG9iaglvaDsKKyAqCQlpbnQzMglzdmlkOworICoJCXVpbnQ2NAlsX29mZnNldDsKKyAqCQl1aW50NjQJbF9sZW47CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbmxtNF9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwl1NjQgbF9vZmZzZXQsIGxfbGVuOworCV9fYmUzMiAqcDsKKworCWVuY29kZV9jYWxsZXJfbmFtZSh4ZHIsIGxvY2stPmNhbGxlcik7CisJZW5jb2RlX2ZoKHhkciwgJmxvY2stPmZoKTsKKwllbmNvZGVfbmV0b2JqKHhkciwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA4ICsgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGxvY2stPnN2aWQpOworCisJbmxtNF9jb21wdXRlX29mZnNldHMobG9jaywgJmxfb2Zmc2V0LCAmbF9sZW4pOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxfb2Zmc2V0KTsKKwl4ZHJfZW5jb2RlX2h5cGVyKHAsIGxfbGVuKTsKK30KKworCisvKgorICogTkxNdjQgWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqCisgKiBOTE12NCBhcmd1bWVudCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBBcHBlbmRpeCBJSSBvZiBSRkMgMTgxMzoKKyAqICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iIGFuZCBDaGFwdGVyIDEwIG9mIFgvT3BlbidzCisgKiAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICovCisKKy8qCisgKglzdHJ1Y3QgbmxtNF90ZXN0YXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGV4Y2x1c2l2ZTsKKyAqCQlzdHJ1Y3QgbmxtNF9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtNF94ZHJfZW5jX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbTRfbG9jayh4ZHIsIGxvY2spOworfQorCisvKgorICoJc3RydWN0IG5sbTRfbG9ja2FyZ3MgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJYm9vbCBibG9jazsKKyAqCQlib29sIGV4Y2x1c2l2ZTsKKyAqCQlzdHJ1Y3QgbmxtNF9sb2NrIGFsb2NrOworICoJCWJvb2wgcmVjbGFpbTsKKyAqCQlpbnQgc3RhdGU7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ib29sKHhkciwgYXJncy0+YmxvY2spOworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKTsKKwllbmNvZGVfbmxtNF9sb2NrKHhkciwgbG9jayk7CisJZW5jb2RlX2Jvb2woeGRyLCBhcmdzLT5yZWNsYWltKTsKKwllbmNvZGVfaW50MzIoeGRyLCBhcmdzLT5zdGF0ZSk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtNF9jYW5jYXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGJsb2NrOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG00X2xvY2sgYWxvY2s7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ib29sKHhkciwgYXJncy0+YmxvY2spOworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKTsKKwllbmNvZGVfbmxtNF9sb2NrKHhkciwgbG9jayk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtNF91bmxvY2thcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCXN0cnVjdCBubG00X2xvY2sgYWxvY2s7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ubG00X2xvY2soeGRyLCBsb2NrKTsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X3JlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3N0YXQgc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbTRfeGRyX2VuY19yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZyZXN1bHQtPmNvb2tpZSk7CisJZW5jb2RlX25sbTRfc3RhdCh4ZHIsIHJlc3VsdC0+c3RhdHVzKTsKK30KKworLyoKKyAqCXVuaW9uIG5sbTRfdGVzdHJwbHkgc3dpdGNoIChubG00X3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTkxNNF9ERU5JRUQ6CisgKgkJc3RydWN0IG5sbTRfaG9sZGVyIGhvbGRlcjsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IG5sbTRfdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbTRfeGRyX2VuY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWVuY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWVuY29kZV9ubG00X3N0YXQoeGRyLCByZXN1bHQtPnN0YXR1cyk7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllbmNvZGVfbmxtNF9ob2xkZXIoeGRyLCByZXN1bHQpOworfQorCisKKy8qCisgKiBOTE12NCBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICoKKyAqIE5MTXY0IGFyZ3VtZW50IHR5cGVzIGFyZSBkZWZpbmVkIGluIEFwcGVuZGl4IElJIG9mIFJGQyAxODEzOgorICogIk5GUyBWZXJzaW9uIDMgUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIgYW5kIENoYXB0ZXIgMTAgb2YgWC9PcGVuJ3MKKyAqICJQcm90b2NvbHMgZm9yIEludGVyd29ya2luZzogWE5GUywgVmVyc2lvbiAzVyIuCisgKi8KKworLyoKKyAqCXVuaW9uIG5sbTRfdGVzdHJwbHkgc3dpdGNoIChubG00X3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTkxNNF9ERU5JRUQ6CisgKgkJc3RydWN0IG5sbTRfaG9sZGVyIGhvbGRlcjsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IG5sbTRfdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX25sbTRfdGVzdHJwbHkoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25sbTRfc3RhdCh4ZHIsICZyZXN1bHQtPnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllcnJvciA9IGRlY29kZV9ubG00X2hvbGRlcih4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG5sbTRfeGRyX2RlY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX25sbTRfdGVzdHJwbHkoeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X3JlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3N0YXQgc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgbmxtNF94ZHJfZGVjX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9ubG00X3N0YXQoeGRyLCAmcmVzdWx0LT5zdGF0dXMpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtNF94ZHJfZGVjX25vcmVwCU5VTEwKKworI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCQlcCitbTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCisJLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJlcHJvY190KW5sbTRfeGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJkcHJvY190KW5sbTRfeGRyX2RlY18jI3Jlc3R5cGUsCQlcCisJLnBfYXJnbGVuICAgID0gTkxNNF8jI2FyZ3R5cGUjI19zeiwJCQkJXAorCS5wX3JlcGxlbiAgICA9IE5MTTRfIyNyZXN0eXBlIyNfc3osCQkJCVwKKwkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKKwkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG00X3Byb2NlZHVyZXNbXSA9IHsKKwlQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisJUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisJUFJPQyhDQU5DRUwsCQljYW5jYXJncywJcmVzKSwKKwlQUk9DKFVOTE9DSywJCXVubG9ja2FyZ3MsCXJlcyksCisJUFJPQyhHUkFOVEVELAkJdGVzdGFyZ3MsCXJlcyksCisJUFJPQyhURVNUX01TRywJCXRlc3RhcmdzLAlub3JlcCksCisJUFJPQyhMT0NLX01TRywJCWxvY2thcmdzLAlub3JlcCksCisJUFJPQyhDQU5DRUxfTVNHLAljYW5jYXJncywJbm9yZXApLAorCVBST0MoVU5MT0NLX01TRywJdW5sb2NrYXJncywJbm9yZXApLAorCVBST0MoR1JBTlRFRF9NU0csCXRlc3RhcmdzLAlub3JlcCksCisJUFJPQyhURVNUX1JFUywJCXRlc3RyZXMsCW5vcmVwKSwKKwlQUk9DKExPQ0tfUkVTLAkJcmVzLAkJbm9yZXApLAorCVBST0MoQ0FOQ0VMX1JFUywJcmVzLAkJbm9yZXApLAorCVBST0MoVU5MT0NLX1JFUywJcmVzLAkJbm9yZXApLAorCVBST0MoR1JBTlRFRF9SRVMsCXJlcywJCW5vcmVwKSwKK307CisKK3N0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjQgPSB7CisJLm51bWJlcgkJPSA0LAorCS5ucnByb2NzCT0gQVJSQVlfU0laRShubG00X3Byb2NlZHVyZXMpLAorCS5wcm9jcwkJPSBubG00X3Byb2NlZHVyZXMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudGxvY2suYyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKaW5kZXggMjU1MDllYi4uOGQ0ZWE4MyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudGxvY2suYworKysgYi9mcy9sb2NrZC9jbG50bG9jay5jCkBAIC03OSw3ICs3OSw3IEBACiAgKi8KIHZvaWQgbmxtY2xudF9kb25lKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKIHsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbWNsbnRfcmVsZWFzZV9ob3N0KGhvc3QpOwogCWxvY2tkX2Rvd24oKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5sbWNsbnRfZG9uZSk7CkBAIC0yNzMsNyArMjczLDcgQEAKIAlzcGluX3VubG9jaygmbmxtX2Jsb2NrZWRfbG9jayk7CiAKIAkvKiBSZWxlYXNlIGhvc3QgaGFuZGxlIGFmdGVyIHVzZSAqLwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtY2xudF9yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbG9ja2RfZG93bigpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggMzMyYzU0Yy4uYWRiNDVlYyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJldHVybjsKIAlsaXN0X2RlbCgmbG9ja293bmVyLT5saXN0KTsKIAlzcGluX3VubG9jaygmbG9ja293bmVyLT5ob3N0LT5oX2xvY2spOwotCW5sbV9yZWxlYXNlX2hvc3QobG9ja293bmVyLT5ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfaG9zdChsb2Nrb3duZXItPmhvc3QpOwogCWtmcmVlKGxvY2tvd25lcik7CiB9CiAKQEAgLTIwNywyMiArMjA3LDIyIEBACiAJCXByaW50aygibmxtX2FsbG9jX2NhbGw6IGZhaWxlZCwgd2FpdGluZyBmb3IgbWVtb3J5XG4iKTsKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUqSFopOwogCX0KLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbWNsbnRfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBOVUxMOwogfQogCi12b2lkIG5sbV9yZWxlYXNlX2NhbGwoc3RydWN0IG5sbV9ycXN0ICpjYWxsKQordm9pZCBubG1jbG50X3JlbGVhc2VfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpCiB7CiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT5hX2NvdW50KSkKIAkJcmV0dXJuOwotCW5sbV9yZWxlYXNlX2hvc3QoY2FsbC0+YV9ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOwogCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhjYWxsKTsKIAlrZnJlZShjYWxsKTsKIH0KIAogc3RhdGljIHZvaWQgbmxtY2xudF9ycGNfcmVsZWFzZSh2b2lkICpkYXRhKQogewotCW5sbV9yZWxlYXNlX2NhbGwoZGF0YSk7CisJbmxtY2xudF9yZWxlYXNlX2NhbGwoZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgbmxtX3dhaXRfb25fZ3JhY2Uod2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlKQpAQCAtNDM2LDcgKzQzNiw3IEBACiAJCQlzdGF0dXMgPSBubG1fc3RhdF90b19lcnJubyhyZXEtPmFfcmVzLnN0YXR1cyk7CiAJfQogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogb3V0X3VuYmxvY2s6CiAJbmxtY2xudF9maW5pc2hfYmxvY2soYmxvY2spOwogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiBvdXRfdW5sb2NrOgogCS8qIEZhdGFsIGVycm9yOiBlbnN1cmUgdGhhdCB3ZSByZW1vdmUgdGhlIGxvY2sgYWx0b2dldGhlciAqLwpAQCAtNjk0LDcgKzY5NCw3IEBACiAJLyogV2hhdCB0byBkbyBub3c/IEknbSBvdXQgb2YgbXkgZGVwdGguLi4gKi8KIAlzdGF0dXMgPSAtRU5PTENLOwogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTc1NSw3ICs3NTUsNyBAQAogCQkJTkxNUFJPQ19DQU5DRUwsICZubG1jbG50X2NhbmNlbF9vcHMpOwogCWlmIChzdGF0dXMgPT0gMCAmJiByZXEtPmFfcmVzLnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkKIAkJc3RhdHVzID0gLUVOT0xDSzsKLQlubG1fcmVsZWFzZV9jYWxsKHJlcSk7CisJbmxtY2xudF9yZWxlYXNlX2NhbGwocmVxKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50eGRyLmMgYi9mcy9sb2NrZC9jbG50eGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwYWMzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2NsbnR4ZHIuYwpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2NsbnR4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBOTE0gdmVyc2lvbiAzIFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKiBOTE0gdmVyc2lvbiAzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggTkxNIHZlcnNpb25zIDEgYW5kIDIuCisgKgorICogTkxNIGNsaWVudC1zaWRlIG9ubHkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKyNpZiAoTkxNQ0xOVF9PSFNJWkUgPiBYRFJfTUFYX05FVE9CSikKKyMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBYRFJfTUFYX05FVE9CSiEiCisjZW5kaWYKKworLyoKKyAqIERlY2xhcmUgdGhlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgTkxNIGFyZ3VtZW50cyBhbmQgcmVwbGllcyBhcworICogbnVtYmVyIG9mIDMyYml0LXdvcmRzCisgKi8KKyNkZWZpbmUgTkxNX2Nvb2tpZV9zegkJKDErKE5MTV9NQVhDT09LSUVMRU4+PjIpKQorI2RlZmluZSBOTE1fY2FsbGVyX3N6CQkoMSsoTkxNQ0xOVF9PSFNJWkU+PjIpKQorI2RlZmluZSBOTE1fb3duZXJfc3oJCSgxKyhOTE1DTE5UX09IU0laRT4+MikpCisjZGVmaW5lIE5MTV9maGFuZGxlX3N6CQkoMSsoTkZTMl9GSFNJWkU+PjIpKQorI2RlZmluZSBOTE1fbG9ja19zegkJKDMrTkxNX2NhbGxlcl9zeitOTE1fb3duZXJfc3orTkxNX2ZoYW5kbGVfc3opCisjZGVmaW5lIE5MTV9ob2xkZXJfc3oJCSg0K05MTV9vd25lcl9zeikKKworI2RlZmluZSBOTE1fdGVzdGFyZ3Nfc3oJCShOTE1fY29va2llX3N6KzErTkxNX2xvY2tfc3opCisjZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJKE5MTV9jb29raWVfc3orNCtOTE1fbG9ja19zeikKKyNkZWZpbmUgTkxNX2NhbmNhcmdzX3N6CQkoTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6KQorI2RlZmluZSBOTE1fdW5sb2NrYXJnc19zegkoTkxNX2Nvb2tpZV9zeitOTE1fbG9ja19zeikKKworI2RlZmluZSBOTE1fdGVzdHJlc19zegkJKE5MTV9jb29raWVfc3orMStOTE1faG9sZGVyX3N6KQorI2RlZmluZSBOTE1fcmVzX3N6CQkoTkxNX2Nvb2tpZV9zeisxKQorI2RlZmluZSBOTE1fbm9yZXBfc3oJCSgwKQorCisKK3N0YXRpYyBzMzIgbG9mZl90X3RvX3MzMihsb2ZmX3Qgb2Zmc2V0KQoreworCXMzMiByZXM7CisKKwlpZiAob2Zmc2V0ID49IE5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE1fT0ZGU0VUX01BWDsKKwllbHNlIGlmIChvZmZzZXQgPD0gLU5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNX09GRlNFVF9NQVg7CisJZWxzZQorCQlyZXMgPSBvZmZzZXQ7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbmxtX2NvbXB1dGVfb2Zmc2V0cyhjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2ssCisJCQkJdTMyICpsX29mZnNldCwgdTMyICpsX2xlbikKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZsb2NrLT5mbDsKKworCUJVR19PTihmbC0+Zmxfc3RhcnQgPiBOTE1fT0ZGU0VUX01BWCk7CisJQlVHX09OKGZsLT5mbF9lbmQgPiBOTE1fT0ZGU0VUX01BWCAmJgorCQkJCWZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCk7CisKKwkqbF9vZmZzZXQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJKmxfbGVuID0gMDsKKwllbHNlCisJCSpsX2xlbiA9IGxvZmZfdF90b19zMzIoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworfQorCisvKgorICogSGFuZGxlIGRlY29kZSBidWZmZXIgb3ZlcmZsb3dzIG91dC1vZi1saW5lLgorICovCitzdGF0aWMgdm9pZCBwcmludF9vdmVyZmxvd19tc2coY29uc3QgY2hhciAqZnVuYywgY29uc3Qgc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwlkcHJpbnRrKCJsb2NrZDogJXMgcHJlbWF0dXJlbHkgaGl0IHRoZSBlbmQgb2Ygb3VyIHJlY2VpdmUgYnVmZmVyLiAiCisJCSJSZW1haW5pbmcgYnVmZmVyIGxlbmd0aCBpcyAldHUgd29yZHMuXG4iLAorCQlmdW5jLCB4ZHItPmVuZCAtIHhkci0+cCk7Cit9CisKKworLyoKKyAqIEVuY29kZS9kZWNvZGUgTkxNdjMgYmFzaWMgZGF0YSB0eXBlcworICoKKyAqIEJhc2ljIE5MTXYzIGRhdGEgdHlwZXMgYXJlIG5vdCBkZWZpbmVkIGluIGFuIElFVEYgc3RhbmRhcmRzCisgKiBkb2N1bWVudC4gIFgvT3BlbiBoYXMgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBkYXRhIHR5cGVzIHRoYXQKKyAqIGlzIHVzZWZ1bC4gIFNlZSBDaGFwdGVyIDEwIG9mICJQcm90b2NvbHMgZm9yIEludGVyd29ya2luZzoKKyAqIFhORlMsIFZlcnNpb24gM1ciLgorICoKKyAqIE5vdCBhbGwgYmFzaWMgZGF0YSB0eXBlcyBoYXZlIHRoZWlyIG93biBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIGZ1bmN0aW9ucy4gIEZvciBydW4tdGltZSBlZmZpY2llbmN5LCBzb21lIGRhdGEgdHlwZXMgYXJlIGVuY29kZWQKKyAqIG9yIGRlY29kZWQgaW5saW5lLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ib29sKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCA9IHZhbHVlID8geGRyX29uZSA6IHhkcl96ZXJvOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfaW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgczMyIHZhbHVlKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIodmFsdWUpOworfQorCisvKgorICoJdHlwZWRlZiBvcGFxdWUgbmV0b2JqPE1BWE5FVE9CSl9TWj4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisKKwlCVUdfT04obGVuZ3RoID4gWERSX01BWF9ORVRPQkopOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJIHN0cnVjdCB4ZHJfbmV0b2JqICpvYmopCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KGxlbmd0aCA+IFhEUl9NQVhfTkVUT0JKKSkKKwkJZ290byBvdXRfc2l6ZTsKKwlvYmotPmxlbiA9IGxlbmd0aDsKKwlvYmotPmRhdGEgPSAodTggKilwOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBuZXRvYmogd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogY29va2llOworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgIGNvbnN0IHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJQlVHX09OKGNvb2tpZS0+bGVuID4gTkxNX01BWENPT0tJRUxFTik7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZjb29raWUtPmRhdGEsIGNvb2tpZS0+bGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwl1MzIgbGVuZ3RoOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlsZW5ndGggPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkvKiBhcHBhcmVudGx5IEhQVVggY2FuIHJldHVybiBlbXB0eSBjb29raWVzICovCisJaWYgKGxlbmd0aCA9PSAwKQorCQlnb3RvIG91dF9ocHV4OworCWlmIChsZW5ndGggPiBOTE1fTUFYQ09PS0lFTEVOKQorCQlnb3RvIG91dF9zaXplOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGxlbmd0aCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWNvb2tpZS0+bGVuID0gbGVuZ3RoOworCW1lbWNweShjb29raWUtPmRhdGEsIHAsIGxlbmd0aCk7CisJcmV0dXJuIDA7CitvdXRfaHB1eDoKKwljb29raWUtPmxlbiA9IDQ7CisJbWVtc2V0KGNvb2tpZS0+ZGF0YSwgMCwgNCk7CisJcmV0dXJuIDA7CitvdXRfc2l6ZToKKwlkcHJpbnRrKCJORlM6IHJldHVybmVkIGNvb2tpZSB3YXMgdG9vIGxvbmc6ICV1XG4iLCBsZW5ndGgpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCW5ldG9iaiBmaDsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2ZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCUJVR19PTihmaC0+c2l6ZSAhPSBORlMyX0ZIU0laRSk7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZmaC0+ZGF0YSwgTkZTMl9GSFNJWkUpOworfQorCisvKgorICoJZW51bSBubG1fc3RhdHMgeworICoJCUxDS19HUkFOVEVEID0gMCwKKyAqCQlMQ0tfREVOSUVEID0gMSwKKyAqCQlMQ0tfREVOSUVEX05PTE9DS1MgPSAyLAorICoJCUxDS19CTE9DS0VEID0gMywKKyAqCQlMQ0tfREVOSUVEX0dSQUNFX1BFUklPRCA9IDQKKyAqCX07CisgKgorICoKKyAqCXN0cnVjdCBubG1fc3RhdCB7CisgKgkJbmxtX3N0YXRzIHN0YXQ7CisgKgl9OworICoKKyAqIE5COiB3ZSBkb24ndCBzd2FwIGJ5dGVzIGZvciB0aGUgTkxNIHN0YXR1cyB2YWx1ZXMuICBUaGUgdXBwZXIKKyAqIGxheWVycyBkZWFsIGRpcmVjdGx5IHdpdGggdGhlIHN0YXR1cyB2YWx1ZSBpbiBuZXR3b3JrIGJ5dGUKKyAqIG9yZGVyLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ubG1fc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIGNvbnN0IF9fYmUzMiBzdGF0KQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihiZTMyX3RvX2NwdShzdGF0KSA+IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBzdGF0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG1fc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgX19iZTMyICpzdGF0KQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAodW5saWtlbHkoKnAgPiBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2QpKQorCQlnb3RvIG91dF9lbnVtOworCSpzdGF0ID0gKnA7CisJcmV0dXJuIDA7CitvdXRfZW51bToKKwlkcHJpbnRrKCIlczogc2VydmVyIHJldHVybmVkIGludmFsaWQgbmxtX3N0YXRzIHZhbHVlOiAldVxuIiwKKwkJX19mdW5jX18sIGJlMzJfdG9fY3B1cChwKSk7CisJcmV0dXJuIC1FSU87CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICoJc3RydWN0IG5sbV9ob2xkZXIgeworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCWludCB1cHBpZDsKKyAqCQluZXRvYmogb2g7CisgKgkJdW5zaWduZWQgbF9vZmZzZXQ7CisgKgkJdW5zaWduZWQgbF9sZW47CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbmxtX2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmcmVzdWx0LT5sb2NrOworCXUzMiBsX29mZnNldCwgbF9sZW47CisJX19iZTMyICpwOworCisJZW5jb2RlX2Jvb2woeGRyLCBsb2NrLT5mbC5mbF90eXBlID09IEZfUkRMQ0spOworCWVuY29kZV9pbnQzMih4ZHIsIGxvY2stPnN2aWQpOworCWVuY29kZV9uZXRvYmooeGRyLCBsb2NrLT5vaC5kYXRhLCBsb2NrLT5vaC5sZW4pOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQpOworCW5sbV9jb21wdXRlX29mZnNldHMobG9jaywgJmxfb2Zmc2V0LCAmbF9sZW4pOworCSpwKysgPSBjcHVfdG9fYmUzMihsX29mZnNldCk7CisJKnAgICA9IGNwdV90b19iZTMyKGxfbGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfbmxtX2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCXN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZyZXN1bHQtPmxvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAmbG9jay0+Zmw7CisJdTMyIGV4Y2x1c2l2ZSwgbF9vZmZzZXQsIGxfbGVuOworCWludCBlcnJvcjsKKwlfX2JlMzIgKnA7CisJczMyIGVuZDsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlleGNsdXNpdmUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlsb2NrLT5zdmlkID0gYmUzMl90b19jcHVwKHApOworCWZsLT5mbF9waWQgPSAocGlkX3QpbG9jay0+c3ZpZDsKKworCWVycm9yID0gZGVjb2RlX25ldG9iaih4ZHIsICZsb2NrLT5vaCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCisJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJZmwtPmZsX3R5cGUgID0gZXhjbHVzaXZlICE9IDAgPyBGX1dSTENLIDogRl9SRExDSzsKKwlsX29mZnNldCA9IGJlMzJfdG9fY3B1cChwKyspOworCWxfbGVuID0gYmUzMl90b19jcHVwKHApOworCWVuZCA9IGxfb2Zmc2V0ICsgbF9sZW4gLSAxOworCisJZmwtPmZsX3N0YXJ0ID0gKGxvZmZfdClsX29mZnNldDsKKwlpZiAobF9sZW4gPT0gMCB8fCBlbmQgPCAwKQorCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwllbHNlCisJCWZsLT5mbF9lbmQgPSAobG9mZl90KWVuZDsKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY2FsbGVyX25hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBOQjogY2xpZW50LXNpZGUgZG9lcyBub3Qgc2V0IGxvY2stPmxlbiAqLworCXUzMiBsZW5ndGggPSBzdHJsZW4obmFtZSk7CisJX19iZTMyICpwOworCisJQlVHX09OKGxlbmd0aCA+IE5MTV9NQVhTVFJMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIG5hbWUsIGxlbmd0aCk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX2xvY2sgeworICoJCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworICoJCW5ldG9iaiBmaDsKKyAqCQluZXRvYmogb2g7CisgKgkJaW50IHVwcGlkOworICoJCXVuc2lnbmVkIGxfb2Zmc2V0OworICoJCXVuc2lnbmVkIGxfbGVuOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25sbV9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXUzMiBsX29mZnNldCwgbF9sZW47CisJX19iZTMyICpwOworCisJZW5jb2RlX2NhbGxlcl9uYW1lKHhkciwgbG9jay0+Y2FsbGVyKTsKKwllbmNvZGVfZmgoeGRyLCAmbG9jay0+ZmgpOworCWVuY29kZV9uZXRvYmooeGRyLCBsb2NrLT5vaC5kYXRhLCBsb2NrLT5vaC5sZW4pOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIobG9jay0+c3ZpZCk7CisKKwlubG1fY29tcHV0ZV9vZmZzZXRzKGxvY2ssICZsX29mZnNldCwgJmxfbGVuKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIobF9vZmZzZXQpOworCSpwICAgPSBjcHVfdG9fYmUzMihsX2xlbik7Cit9CisKKworLyoKKyAqIE5MTXYzIFhEUiBlbmNvZGUgZnVuY3Rpb25zCisgKgorICogTkxNdjMgYXJndW1lbnQgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ2hhcHRlciAxMCBvZiBUaGUgT3BlbiBHcm91cCdzCisgKiAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICovCisKKy8qCisgKglzdHJ1Y3QgbmxtX3Rlc3RhcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG1fbG9jayBhbG9jazsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbV94ZHJfZW5jX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3MpCit7CisJY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrID0gJmFyZ3MtPmxvY2s7CisKKwllbmNvZGVfY29va2llKHhkciwgJmFyZ3MtPmNvb2tpZSk7CisJZW5jb2RlX2Jvb2woeGRyLCBsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spOworCWVuY29kZV9ubG1fbG9jayh4ZHIsIGxvY2spOworfQorCisvKgorICoJc3RydWN0IG5sbV9sb2NrYXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGJsb2NrOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG1fbG9jayBhbG9jazsKKyAqCQlib29sIHJlY2xhaW07CisgKgkJaW50IHN0YXRlOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGFyZ3MtPmJsb2NrKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbV9sb2NrKHhkciwgbG9jayk7CisJZW5jb2RlX2Jvb2woeGRyLCBhcmdzLT5yZWNsYWltKTsKKwllbmNvZGVfaW50MzIoeGRyLCBhcmdzLT5zdGF0ZSk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX2NhbmNhcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCWJvb2wgYmxvY2s7CisgKgkJYm9vbCBleGNsdXNpdmU7CisgKgkJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGFyZ3MtPmJsb2NrKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbV9sb2NrKHhkciwgbG9jayk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfbmxtX2xvY2soeGRyLCBsb2NrKTsKK30KKworLyoKKyAqCXN0cnVjdCBubG1fcmVzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCW5sbV9zdGF0IHN0YXQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG1feGRyX2VuY19yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWVuY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWVuY29kZV9ubG1fc3RhdCh4ZHIsIHJlc3VsdC0+c3RhdHVzKTsKK30KKworLyoKKyAqCXVuaW9uIG5sbV90ZXN0cnBseSBzd2l0Y2ggKG5sbV9zdGF0cyBzdGF0KSB7CisgKgljYXNlIExDS19ERU5JRUQ6CisgKgkJc3RydWN0IG5sbV9ob2xkZXIgaG9sZGVyOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKglzdHJ1Y3QgbmxtX3Rlc3RyZXMgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJbmxtX3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG1fdGVzdHJwbHkoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQljb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWlmIChyZXN1bHQtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkKKwkJZW5jb2RlX25sbV9ob2xkZXIoeGRyLCByZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBubG1feGRyX2VuY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwllbmNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwllbmNvZGVfbmxtX3N0YXQoeGRyLCByZXN1bHQtPnN0YXR1cyk7CisJZW5jb2RlX25sbV90ZXN0cnBseSh4ZHIsIHJlc3VsdCk7Cit9CisKKworLyoKKyAqIE5MTXYzIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKgorICogTkxNdjMgcmVzdWx0IHR5cGVzIGFyZSBkZWZpbmVkIGluIENoYXB0ZXIgMTAgb2YgVGhlIE9wZW4gR3JvdXAncworICogIlByb3RvY29scyBmb3IgSW50ZXJ3b3JraW5nOiBYTkZTLCBWZXJzaW9uIDNXIi4KKyAqLworCisvKgorICoJdW5pb24gbmxtX3Rlc3RycGx5IHN3aXRjaCAobmxtX3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTENLX0RFTklFRDoKKyAqCQlzdHJ1Y3QgbmxtX2hvbGRlciBob2xkZXI7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXN0cnVjdCBubG1fdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG1fdGVzdHJwbHkgdGVzdF9zdGF0OworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfbmxtX3Rlc3RycGx5KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9ubG1fc3RhdCh4ZHIsICZyZXN1bHQtPnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllcnJvciA9IGRlY29kZV9ubG1faG9sZGVyKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmxtX3hkcl9kZWNfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9ubG1fdGVzdHJwbHkoeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqCXN0cnVjdCBubG1fcmVzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCW5sbV9zdGF0IHN0YXQ7CisgKgl9OworICovCitzdGF0aWMgaW50IG5sbV94ZHJfZGVjX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX2Nvb2tpZSh4ZHIsICZyZXN1bHQtPmNvb2tpZSk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfbmxtX3N0YXQoeGRyLCAmcmVzdWx0LT5zdGF0dXMpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtX3hkcl9kZWNfbm9yZXAJTlVMTAorCisjZGVmaW5lIFBST0MocHJvYywgYXJndHlwZSwgcmVzdHlwZSkJXAorW05MTVBST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAorCS5wX3Byb2MgICAgICA9IE5MTVBST0NfIyNwcm9jLAkJCQkJXAorCS5wX2VuY29kZSAgICA9IChreGRyZXByb2NfdClubG1feGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJkcHJvY190KW5sbV94ZHJfZGVjXyMjcmVzdHlwZSwJCVwKKwkucF9hcmdsZW4gICAgPSBOTE1fIyNhcmd0eXBlIyNfc3osCQkJCVwKKwkucF9yZXBsZW4gICAgPSBOTE1fIyNyZXN0eXBlIyNfc3osCQkJCVwKKwkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKKwkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG1fcHJvY2VkdXJlc1tdID0geworCVBST0MoVEVTVCwJCXRlc3RhcmdzLAl0ZXN0cmVzKSwKKwlQUk9DKExPQ0ssCQlsb2NrYXJncywJcmVzKSwKKwlQUk9DKENBTkNFTCwJCWNhbmNhcmdzLAlyZXMpLAorCVBST0MoVU5MT0NLLAkJdW5sb2NrYXJncywJcmVzKSwKKwlQUk9DKEdSQU5URUQsCQl0ZXN0YXJncywJcmVzKSwKKwlQUk9DKFRFU1RfTVNHLAkJdGVzdGFyZ3MsCW5vcmVwKSwKKwlQUk9DKExPQ0tfTVNHLAkJbG9ja2FyZ3MsCW5vcmVwKSwKKwlQUk9DKENBTkNFTF9NU0csCWNhbmNhcmdzLAlub3JlcCksCisJUFJPQyhVTkxPQ0tfTVNHLAl1bmxvY2thcmdzLAlub3JlcCksCisJUFJPQyhHUkFOVEVEX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKwlQUk9DKFRFU1RfUkVTLAkJdGVzdHJlcywJbm9yZXApLAorCVBST0MoTE9DS19SRVMsCQlyZXMsCQlub3JlcCksCisJUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisJUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisJUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjEgPSB7CisJCS5udW1iZXIJCT0gMSwKKwkJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKG5sbV9wcm9jZWR1cmVzKSwKKwkJLnByb2NzCQk9IG5sbV9wcm9jZWR1cmVzLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjMgPSB7CisJCS5udW1iZXIJCT0gMywKKwkJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKG5sbV9wcm9jZWR1cmVzKSwKKwkJLnByb2NzCQk9IG5sbV9wcm9jZWR1cmVzLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbgkqbmxtX3ZlcnNpb25zW10gPSB7CisJWzFdID0gJm5sbV92ZXJzaW9uMSwKKwlbM10gPSAmbmxtX3ZlcnNpb24zLAorI2lmZGVmIENPTkZJR19MT0NLRF9WNAorCVs0XSA9ICZubG1fdmVyc2lvbjQsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5sbV9ycGNfc3RhdHM7CisKK3N0cnVjdCBycGNfcHJvZ3JhbQkJbmxtX3Byb2dyYW0gPSB7CisJCS5uYW1lCQk9ICJsb2NrZCIsCisJCS5udW1iZXIJCT0gTkxNX1BST0dSQU0sCisJCS5ucnZlcnMJCT0gQVJSQVlfU0laRShubG1fdmVyc2lvbnMpLAorCQkudmVyc2lvbgk9IG5sbV92ZXJzaW9ucywKKwkJLnN0YXRzCQk9ICZubG1fcnBjX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2hvc3QuYyBiL2ZzL2xvY2tkL2hvc3QuYwppbmRleCBlZDBjNTlmLi41ZjFiY2IyIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9ob3N0LmMKKysrIGIvZnMvbG9ja2QvaG9zdC5jCkBAIC0yNSw5ICsyNSwyMiBAQAogI2RlZmluZSBOTE1fSE9TVF9FWFBJUkUJCSgzMDAgKiBIWikKICNkZWZpbmUgTkxNX0hPU1RfQ09MTEVDVAkoMTIwICogSFopCiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlubG1faG9zdHNbTkxNX0hPU1RfTlJIQVNIXTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlubG1fc2VydmVyX2hvc3RzW05MTV9IT1NUX05SSEFTSF07CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQJbmxtX2NsaWVudF9ob3N0c1tOTE1fSE9TVF9OUkhBU0hdOworCisjZGVmaW5lIGZvcl9lYWNoX2hvc3QoaG9zdCwgcG9zLCBjaGFpbiwgdGFibGUpIFwKKwlmb3IgKChjaGFpbikgPSAodGFibGUpOyBcCisJICAgICAoY2hhaW4pIDwgKHRhYmxlKSArIE5MTV9IT1NUX05SSEFTSDsgKysoY2hhaW4pKSBcCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KChob3N0KSwgKHBvcyksIChjaGFpbiksIGhfaGFzaCkKKworI2RlZmluZSBmb3JfZWFjaF9ob3N0X3NhZmUoaG9zdCwgcG9zLCBuZXh0LCBjaGFpbiwgdGFibGUpIFwKKwlmb3IgKChjaGFpbikgPSAodGFibGUpOyBcCisJICAgICAoY2hhaW4pIDwgKHRhYmxlKSArIE5MTV9IT1NUX05SSEFTSDsgKysoY2hhaW4pKSBcCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoKGhvc3QpLCAocG9zKSwgKG5leHQpLCBcCisJCQkJCQkoY2hhaW4pLCBoX2hhc2gpCisKIHN0YXRpYyB1bnNpZ25lZCBsb25nCQluZXh0X2djOwotc3RhdGljIGludAkJCW5yaG9zdHM7CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJbnJob3N0czsKIHN0YXRpYyBERUZJTkVfTVVURVgobmxtX2hvc3RfbXV0ZXgpOwogCiBzdGF0aWMgdm9pZAkJCW5sbV9nY19ob3N0cyh2b2lkKTsKQEAgLTQwLDggKzUzLDYgQEAKIAljb25zdCB1MzIJCXZlcnNpb247CS8qIE5MTSB2ZXJzaW9uIHRvIHNlYXJjaCBmb3IgKi8KIAljb25zdCBjaGFyCQkqaG9zdG5hbWU7CS8qIHJlbW90ZSdzIGhvc3RuYW1lICovCiAJY29uc3Qgc2l6ZV90CQlob3N0bmFtZV9sZW47CS8qIGl0J3MgbGVuZ3RoICovCi0JY29uc3Qgc3RydWN0IHNvY2thZGRyCSpzcmNfc2FwOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCi0JY29uc3Qgc2l6ZV90CQlzcmNfbGVuOwkvKiBpdCdzIGxlbmd0aCAqLwogCWNvbnN0IGludAkJbm9yZXN2cG9ydDsJLyogdXNlIG5vbi1wcml2IHBvcnQgKi8KIH07CiAKQEAgLTg4LDEyNyArOTksODMgQEAKIH0KIAogLyoKLSAqIENvbW1vbiBob3N0IGxvb2t1cCByb3V0aW5lIGZvciBzZXJ2ZXIgJiBjbGllbnQKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIG5sbV9ob3N0LiAgQ29tbW9uIHRvIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmxtX2hvc3QgKm5sbV9sb29rdXBfaG9zdChzdHJ1Y3QgbmxtX2xvb2t1cF9ob3N0X2luZm8gKm5pKQorc3RhdGljIHN0cnVjdCBubG1faG9zdCAqbmxtX2FsbG9jX2hvc3Qoc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvICpuaSwKKwkJCQkgICAgICAgc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKIHsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7CisJc3RydWN0IG5sbV9ob3N0ICpob3N0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAKLQltdXRleF9sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0KLQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBuZXh0X2djKSkKLQkJbmxtX2djX2hvc3RzKCk7Ci0KLQkvKiBXZSBtYXkga2VlcCBzZXZlcmFsIG5sbV9ob3N0IG9iamVjdHMgZm9yIGEgcGVlciwgYmVjYXVzZSBlYWNoCi0JICogbmxtX2hvc3QgaXMgaWRlbnRpZmllZCBieQotCSAqIChhZGRyZXNzLCBwcm90b2NvbCwgdmVyc2lvbiwgc2VydmVyL2NsaWVudCkKLQkgKiBXZSBjb3VsZCBwcm9iYWJseSBzaW1wbGlmeSB0aGlzIGEgbGl0dGxlIGJ5IHB1dHRpbmcgYWxsIHRob3NlCi0JICogZGlmZmVyZW50IE5MTSBycGNfY2xpZW50cyBpbnRvIG9uZSBzaW5nbGUgbmxtX2hvc3Qgb2JqZWN0LgotCSAqIFRoaXMgd291bGQgYWxsb3cgdXMgdG8gaGF2ZSBvbmUgbmxtX2hvc3QgcGVyIGFkZHJlc3MuCi0JICovCi0JY2hhaW4gPSAmbmxtX2hvc3RzW25sbV9oYXNoX2FkZHJlc3MobmktPnNhcCldOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvc3QsIHBvcywgY2hhaW4sIGhfaGFzaCkgewotCQlpZiAoIXJwY19jbXBfYWRkcihubG1fYWRkcihob3N0KSwgbmktPnNhcCkpCi0JCQljb250aW51ZTsKLQotCQkvKiBTZWUgaWYgd2UgaGF2ZSBhbiBOU00gaGFuZGxlIGZvciB0aGlzIGNsaWVudCAqLwotCQlpZiAoIW5zbSkKLQkJCW5zbSA9IGhvc3QtPmhfbnNtaGFuZGxlOwotCi0JCWlmIChob3N0LT5oX3Byb3RvICE9IG5pLT5wcm90b2NvbCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoaG9zdC0+aF92ZXJzaW9uICE9IG5pLT52ZXJzaW9uKQotCQkJY29udGludWU7Ci0JCWlmIChob3N0LT5oX3NlcnZlciAhPSBuaS0+c2VydmVyKQotCQkJY29udGludWU7Ci0JCWlmIChuaS0+c2VydmVyICYmIG5pLT5zcmNfbGVuICE9IDAgJiYKLQkJICAgICFycGNfY21wX2FkZHIobmxtX3NyY2FkZHIoaG9zdCksIG5pLT5zcmNfc2FwKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIE1vdmUgdG8gaGVhZCBvZiBoYXNoIGNoYWluLiAqLwotCQlobGlzdF9kZWwoJmhvc3QtPmhfaGFzaCk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKLQotCQlubG1fZ2V0X2hvc3QoaG9zdCk7Ci0JCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZm91bmQgaG9zdCAlcyAoJXMpXG4iLAotCQkJCWhvc3QtPmhfbmFtZSwgaG9zdC0+aF9hZGRyYnVmKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBUaGUgaG9zdCB3YXNuJ3QgaW4gb3VyIGhhc2ggdGFibGUuICBJZiB3ZSBkb24ndAotCSAqIGhhdmUgYW4gTlNNIGhhbmRsZSBmb3IgaXQgeWV0LCBjcmVhdGUgb25lLgotCSAqLwotCWlmIChuc20pCisJaWYgKG5zbSAhPSBOVUxMKQogCQlhdG9taWNfaW5jKCZuc20tPnNtX2NvdW50KTsKIAllbHNlIHsKIAkJaG9zdCA9IE5VTEw7CiAJCW5zbSA9IG5zbV9nZXRfaGFuZGxlKG5pLT5zYXAsIG5pLT5zYWxlbiwKIAkJCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuKTsKLQkJaWYgKCFuc20pIHsKLQkJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyAiCi0JCQkJIm5vIG5zbSBoYW5kbGVcbiIpOworCQlpZiAodW5saWtlbHkobnNtID09IE5VTEwpKSB7CisJCQlkcHJpbnRrKCJsb2NrZDogJXMgZmFpbGVkOyBubyBuc20gaGFuZGxlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFob3N0KSB7CisJaG9zdCA9IGttYWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGhvc3QgPT0gTlVMTCkpIHsKKwkJZHByaW50aygibG9ja2Q6ICVzIGZhaWxlZDsgbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCW5zbV9yZWxlYXNlKG5zbSk7Ci0JCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyBubyBtZW1vcnlcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JaG9zdC0+aF9uYW1lCSAgID0gbnNtLT5zbV9uYW1lOwotCWhvc3QtPmhfYWRkcmJ1ZiAgICA9IG5zbS0+c21fYWRkcmJ1ZjsKKwogCW1lbWNweShubG1fYWRkcihob3N0KSwgbmktPnNhcCwgbmktPnNhbGVuKTsKLQlob3N0LT5oX2FkZHJsZW4gPSBuaS0+c2FsZW47CisJaG9zdC0+aF9hZGRybGVuICAgID0gbmktPnNhbGVuOwogCXJwY19zZXRfcG9ydChubG1fYWRkcihob3N0KSwgMCk7Ci0JbWVtY3B5KG5sbV9zcmNhZGRyKGhvc3QpLCBuaS0+c3JjX3NhcCwgbmktPnNyY19sZW4pOwotCWhvc3QtPmhfc3JjYWRkcmxlbiA9IG5pLT5zcmNfbGVuOworCWhvc3QtPmhfc3JjYWRkcmxlbiA9IDA7CisKKwlob3N0LT5oX3JwY2NsbnQgICAgPSBOVUxMOworCWhvc3QtPmhfbmFtZQkgICA9IG5zbS0+c21fbmFtZTsKIAlob3N0LT5oX3ZlcnNpb24gICAgPSBuaS0+dmVyc2lvbjsKIAlob3N0LT5oX3Byb3RvICAgICAgPSBuaS0+cHJvdG9jb2w7Ci0JaG9zdC0+aF9ycGNjbG50ICAgID0gTlVMTDsKLQltdXRleF9pbml0KCZob3N0LT5oX211dGV4KTsKLQlob3N0LT5oX25leHRyZWJpbmQgPSBqaWZmaWVzICsgTkxNX0hPU1RfUkVCSU5EOwotCWhvc3QtPmhfZXhwaXJlcyAgICA9IGppZmZpZXMgKyBOTE1fSE9TVF9FWFBJUkU7Ci0JYXRvbWljX3NldCgmaG9zdC0+aF9jb3VudCwgMSk7CisJaG9zdC0+aF9yZWNsYWltaW5nID0gMDsKKwlob3N0LT5oX3NlcnZlciAgICAgPSBuaS0+c2VydmVyOworCWhvc3QtPmhfbm9yZXN2cG9ydCA9IG5pLT5ub3Jlc3Zwb3J0OworCWhvc3QtPmhfaW51c2UgICAgICA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaG9zdC0+aF9ncmFjZXdhaXQpOwogCWluaXRfcndzZW0oJmhvc3QtPmhfcndzZW0pOwotCWhvc3QtPmhfc3RhdGUgICAgICA9IDA7CQkJLyogcHNldWRvIE5TTSBzdGF0ZSAqLwotCWhvc3QtPmhfbnNtc3RhdGUgICA9IDA7CQkJLyogcmVhbCBOU00gc3RhdGUgKi8KLQlob3N0LT5oX25zbWhhbmRsZSAgPSBuc207Ci0JaG9zdC0+aF9zZXJ2ZXIJICAgPSBuaS0+c2VydmVyOwotCWhvc3QtPmhfbm9yZXN2cG9ydCA9IG5pLT5ub3Jlc3Zwb3J0OwotCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKwlob3N0LT5oX3N0YXRlICAgICAgPSAwOworCWhvc3QtPmhfbnNtc3RhdGUgICA9IDA7CisJaG9zdC0+aF9waWRjb3VudCAgID0gMDsKKwlhdG9taWNfc2V0KCZob3N0LT5oX2NvdW50LCAxKTsKKwltdXRleF9pbml0KCZob3N0LT5oX211dGV4KTsKKwlob3N0LT5oX25leHRyZWJpbmQgPSBub3cgKyBOTE1fSE9TVF9SRUJJTkQ7CisJaG9zdC0+aF9leHBpcmVzICAgID0gbm93ICsgTkxNX0hPU1RfRVhQSVJFOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2xvY2tvd25lcnMpOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5oX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2dyYW50ZWQpOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX3JlY2xhaW0pOwotCi0JbnJob3N0cysrOwotCi0JZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBjcmVhdGVkIGhvc3QgJXNcbiIsCi0JCQlob3N0LT5oX25hbWUpOworCWhvc3QtPmhfbnNtaGFuZGxlICA9IG5zbTsKKwlob3N0LT5oX2FkZHJidWYgICAgPSBuc20tPnNtX2FkZHJidWY7CiAKIG91dDoKLQltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKIAlyZXR1cm4gaG9zdDsKIH0KIAogLyoKLSAqIERlc3Ryb3kgYSBob3N0CisgKiBEZXN0cm95IGFuIG5sbV9ob3N0IGFuZCBmcmVlIGFzc29jaWF0ZWQgcmVzb3VyY2VzCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBubG1faG9zdF9tdXRleC4KICAqLwotc3RhdGljIHZvaWQKLW5sbV9kZXN0cm95X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQorc3RhdGljIHZvaWQgbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoc3RydWN0IG5sbV9ob3N0ICpob3N0KQogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAorCWRwcmludGsoImxvY2tkOiBkZXN0cm95IGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOwogCUJVR19PTihhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkpOwogCisJaGxpc3RfZGVsX2luaXQoJmhvc3QtPmhfaGFzaCk7CisKIAluc21fdW5tb25pdG9yKGhvc3QpOwogCW5zbV9yZWxlYXNlKGhvc3QtPmhfbnNtaGFuZGxlKTsKIApAQCAtMjE2LDYgKzE4Myw4IEBACiAJaWYgKGNsbnQgIT0gTlVMTCkKIAkJcnBjX3NodXRkb3duX2NsaWVudChjbG50KTsKIAlrZnJlZShob3N0KTsKKworCW5yaG9zdHMtLTsKIH0KIAogLyoqCkBAIC0yNDksMTIgKzIxOCw3NiBAQAogCQkuaG9zdG5hbWVfbGVuCT0gc3RybGVuKGhvc3RuYW1lKSwKIAkJLm5vcmVzdnBvcnQJPSBub3Jlc3Zwb3J0LAogCX07CisJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBOVUxMOwogCiAJZHByaW50aygibG9ja2Q6ICVzKGhvc3Q9JyVzJywgdmVycz0ldSwgcHJvdG89JXMpXG4iLCBfX2Z1bmNfXywKIAkJCShob3N0bmFtZSA/IGhvc3RuYW1lIDogIjxub25lPiIpLCB2ZXJzaW9uLAogCQkJKHByb3RvY29sID09IElQUFJPVE9fVURQID8gInVkcCIgOiAidGNwIikpOwogCi0JcmV0dXJuIG5sbV9sb29rdXBfaG9zdCgmbmkpOworCW11dGV4X2xvY2soJm5sbV9ob3N0X211dGV4KTsKKworCWNoYWluID0gJm5sbV9jbGllbnRfaG9zdHNbbmxtX2hhc2hfYWRkcmVzcyhzYXApXTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKKwkJaWYgKCFycGNfY21wX2FkZHIobmxtX2FkZHIoaG9zdCksIHNhcCkpCisJCQljb250aW51ZTsKKworCQkvKiBTYW1lIGFkZHJlc3MuIFNoYXJlIGFuIE5TTSBoYW5kbGUgaWYgd2UgYWxyZWFkeSBoYXZlIG9uZSAqLworCQlpZiAobnNtID09IE5VTEwpCisJCQluc20gPSBob3N0LT5oX25zbWhhbmRsZTsKKworCQlpZiAoaG9zdC0+aF9wcm90byAhPSBwcm90b2NvbCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaG9zdC0+aF92ZXJzaW9uICE9IHZlcnNpb24pCisJCQljb250aW51ZTsKKworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCWRwcmludGsoImxvY2tkOiAlcyBmb3VuZCBob3N0ICVzICglcylcbiIsIF9fZnVuY19fLAorCQkJaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlob3N0ID0gbmxtX2FsbG9jX2hvc3QoJm5pLCBuc20pOworCWlmICh1bmxpa2VseShob3N0ID09IE5VTEwpKQorCQlnb3RvIG91dDsKKworCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKwlucmhvc3RzKys7CisKKwlkcHJpbnRrKCJsb2NrZDogJXMgY3JlYXRlZCBob3N0ICVzICglcylcbiIsIF9fZnVuY19fLAorCQlob3N0LT5oX25hbWUsIGhvc3QtPmhfYWRkcmJ1Zik7CisKK291dDoKKwltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKKwlyZXR1cm4gaG9zdDsKK30KKworLyoqCisgKiBubG1jbG50X3JlbGVhc2VfaG9zdCAtIHJlbGVhc2UgY2xpZW50IG5sbV9ob3N0CisgKiBAaG9zdDogbmxtX2hvc3QgdG8gcmVsZWFzZQorICoKKyAqLwordm9pZCBubG1jbG50X3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgY2xpZW50IGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpIDwgMCk7CisJQlVHX09OKGhvc3QtPmhfc2VydmVyKTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZob3N0LT5oX2NvdW50KSkgeworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfZ3JhbnRlZCkpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfcmVjbGFpbSkpOworCisJCW11dGV4X2xvY2soJm5sbV9ob3N0X211dGV4KTsKKwkJbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoaG9zdCk7CisJCW11dGV4X3VubG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCX0KIH0KIAogLyoqCkBAIC0yNzksMTIgKzMxMiwxOCBAQAogCQkJCSAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKIAkJCQkgICAgY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbikKIHsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3QgPSBOVUxMOworCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBOVUxMOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CiAJCS5zaW5fZmFtaWx5CT0gQUZfSU5FVCwKIAl9OwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNiA9IHsKIAkJLnNpbjZfZmFtaWx5CT0gQUZfSU5FVDYsCiAJfTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNyY19zYXA7CisJc2l6ZV90IHNyY19sZW4gPSBycXN0cC0+cnFfYWRkcmxlbjsKIAlzdHJ1Y3QgbmxtX2xvb2t1cF9ob3N0X2luZm8gbmkgPSB7CiAJCS5zZXJ2ZXIJCT0gMSwKIAkJLnNhcAkJPSBzdmNfYWRkcihycXN0cCksCkBAIC0yOTMsMjcgKzMzMiw5MSBAQAogCQkudmVyc2lvbgk9IHJxc3RwLT5ycV92ZXJzLAogCQkuaG9zdG5hbWUJPSBob3N0bmFtZSwKIAkJLmhvc3RuYW1lX2xlbgk9IGhvc3RuYW1lX2xlbiwKLQkJLnNyY19sZW4JPSBycXN0cC0+cnFfYWRkcmxlbiwKIAl9OwogCiAJZHByaW50aygibG9ja2Q6ICVzKGhvc3Q9JyUqcycsIHZlcnM9JXUsIHByb3RvPSVzKVxuIiwgX19mdW5jX18sCiAJCQkoaW50KWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUsIHJxc3RwLT5ycV92ZXJzLAogCQkJKHJxc3RwLT5ycV9wcm90ID09IElQUFJPVE9fVURQID8gInVkcCIgOiAidGNwIikpOwogCisJbXV0ZXhfbG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCiAJc3dpdGNoIChuaS5zYXAtPnNhX2ZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKIAkJc2luLnNpbl9hZGRyLnNfYWRkciA9IHJxc3RwLT5ycV9kYWRkci5hZGRyLnNfYWRkcjsKLQkJbmkuc3JjX3NhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luOworCQlzcmNfc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW47CiAJCWJyZWFrOwogCWNhc2UgQUZfSU5FVDY6CiAJCWlwdjZfYWRkcl9jb3B5KCZzaW42LnNpbjZfYWRkciwgJnJxc3RwLT5ycV9kYWRkci5hZGRyNik7Ci0JCW5pLnNyY19zYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjY7CisJCXNyY19zYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOworCQlkcHJpbnRrKCJsb2NrZDogJXMgZmFpbGVkOyB1bnJlY29nbml6ZWQgYWRkcmVzcyBmYW1pbHlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldHVybiBubG1fbG9va3VwX2hvc3QoJm5pKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBuZXh0X2djKSkKKwkJbmxtX2djX2hvc3RzKCk7CisKKwljaGFpbiA9ICZubG1fc2VydmVyX2hvc3RzW25sbV9oYXNoX2FkZHJlc3Mobmkuc2FwKV07CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7CisJCWlmICghcnBjX2NtcF9hZGRyKG5sbV9hZGRyKGhvc3QpLCBuaS5zYXApKQorCQkJY29udGludWU7CisKKwkJLyogU2FtZSBhZGRyZXNzLiBTaGFyZSBhbiBOU00gaGFuZGxlIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUgKi8KKwkJaWYgKG5zbSA9PSBOVUxMKQorCQkJbnNtID0gaG9zdC0+aF9uc21oYW5kbGU7CisKKwkJaWYgKGhvc3QtPmhfcHJvdG8gIT0gbmkucHJvdG9jb2wpCisJCQljb250aW51ZTsKKwkJaWYgKGhvc3QtPmhfdmVyc2lvbiAhPSBuaS52ZXJzaW9uKQorCQkJY29udGludWU7CisJCWlmICghcnBjX2NtcF9hZGRyKG5sbV9zcmNhZGRyKGhvc3QpLCBzcmNfc2FwKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1vdmUgdG8gaGVhZCBvZiBoYXNoIGNoYWluLiAqLworCQlobGlzdF9kZWwoJmhvc3QtPmhfaGFzaCk7CisJCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCWRwcmludGsoImxvY2tkOiAlcyBmb3VuZCBob3N0ICVzICglcylcbiIsCisJCQlfX2Z1bmNfXywgaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlob3N0ID0gbmxtX2FsbG9jX2hvc3QoJm5pLCBuc20pOworCWlmICh1bmxpa2VseShob3N0ID09IE5VTEwpKQorCQlnb3RvIG91dDsKKworCW1lbWNweShubG1fc3JjYWRkcihob3N0KSwgc3JjX3NhcCwgc3JjX2xlbik7CisJaG9zdC0+aF9zcmNhZGRybGVuID0gc3JjX2xlbjsKKwlobGlzdF9hZGRfaGVhZCgmaG9zdC0+aF9oYXNoLCBjaGFpbik7CisJbnJob3N0cysrOworCisJZHByaW50aygibG9ja2Q6ICVzIGNyZWF0ZWQgaG9zdCAlcyAoJXMpXG4iLAorCQlfX2Z1bmNfXywgaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qKgorICogbmxtc3ZjX3JlbGVhc2VfaG9zdCAtIHJlbGVhc2Ugc2VydmVyIG5sbV9ob3N0CisgKiBAaG9zdDogbmxtX2hvc3QgdG8gcmVsZWFzZQorICoKKyAqIEhvc3QgaXMgZGVzdHJveWVkIGxhdGVyIGluIG5sbV9nY19ob3N0KCkuCisgKi8KK3ZvaWQgbmxtc3ZjX3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHByaW50aygibG9ja2Q6IHJlbGVhc2Ugc2VydmVyIGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpIDwgMCk7CisJQlVHX09OKCFob3N0LT5oX3NlcnZlcik7CisJYXRvbWljX2RlYygmaG9zdC0+aF9jb3VudCk7CiB9CiAKIC8qCkBAIC00MTMsMjAgKzUxNiwyOCBAQAogCXJldHVybiBob3N0OwogfQogCi0vKgotICogUmVsZWFzZSBOTE0gaG9zdCBhZnRlciB1c2UKLSAqLwotdm9pZCBubG1fcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3N0YXRpYyBzdHJ1Y3QgbmxtX2hvc3QgKm5leHRfaG9zdF9zdGF0ZShzdHJ1Y3QgaGxpc3RfaGVhZCAqY2FjaGUsCisJCQkJCXN0cnVjdCBuc21faGFuZGxlICpuc20sCisJCQkJCWNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKQogewotCWlmIChob3N0ICE9IE5VTEwpIHsKLQkJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgaG9zdCAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSA8IDApOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaG9zdC0+aF9jb3VudCkpIHsKLQkJCUJVR19PTighbGlzdF9lbXB0eSgmaG9zdC0+aF9sb2Nrb3duZXJzKSk7Ci0JCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfZ3JhbnRlZCkpOwotCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZob3N0LT5oX3JlY2xhaW0pKTsKKwlzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCisJbXV0ZXhfbG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCWZvcl9lYWNoX2hvc3QoaG9zdCwgcG9zLCBjaGFpbiwgY2FjaGUpIHsKKwkJaWYgKGhvc3QtPmhfbnNtaGFuZGxlID09IG5zbQorCQkgICAgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgeworCQkJaG9zdC0+aF9uc21zdGF0ZSA9IGluZm8tPnN0YXRlOworCQkJaG9zdC0+aF9zdGF0ZSsrOworCisJCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KK291dDoKKwltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKKwlyZXR1cm4gaG9zdDsKIH0KIAogLyoqCkBAIC00MzgsOCArNTQ5LDYgQEAKICAqLwogdm9pZCBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbykKIHsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOwogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIApAQCAtNDUyLDMyICs1NjEsMTUgQEAKIAkgKiBsb2NrIGZvciB0aGlzLgogCSAqIFRvIGF2b2lkIHByb2Nlc3NpbmcgYSBob3N0IHNldmVyYWwgdGltZXMsIHdlIG1hdGNoIHRoZSBuc21zdGF0ZS4KIAkgKi8KLWFnYWluOgltdXRleF9sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7Ci0JCQlpZiAoaG9zdC0+aF9uc21oYW5kbGUgPT0gbnNtCi0JCQkgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgewotCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBpbmZvLT5zdGF0ZTsKLQkJCQlob3N0LT5oX3N0YXRlKys7Ci0KLQkJCQlubG1fZ2V0X2hvc3QoaG9zdCk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0KLQkJCQlpZiAoaG9zdC0+aF9zZXJ2ZXIpIHsKLQkJCQkJLyogV2UncmUgc2VydmVyIGZvciB0aGlzIGd1eSwganVzdCBkaXRjaAotCQkJCQkgKiBhbGwgdGhlIGxvY2tzIGhlIGhlbGQuICovCi0JCQkJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEhlJ3MgdGhlIHNlcnZlciwgaW5pdGlhdGUgbG9jayByZWNvdmVyeS4gKi8KLQkJCQkJbmxtY2xudF9yZWNvdmVyeShob3N0KTsKLQkJCQl9Ci0KLQkJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOwotCQkJCWdvdG8gYWdhaW47Ci0JCQl9Ci0JCX0KKwl3aGlsZSAoKGhvc3QgPSBuZXh0X2hvc3Rfc3RhdGUobmxtX3NlcnZlcl9ob3N0cywgbnNtLCBpbmZvKSkgIT0gTlVMTCkgeworCQlubG1zdmNfZnJlZV9ob3N0X3Jlc291cmNlcyhob3N0KTsKKwkJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CisJd2hpbGUgKChob3N0ID0gbmV4dF9ob3N0X3N0YXRlKG5sbV9jbGllbnRfaG9zdHMsIG5zbSwgaW5mbykpICE9IE5VTEwpIHsKKwkJbmxtY2xudF9yZWNvdmVyeShob3N0KTsKKwkJbmxtY2xudF9yZWxlYXNlX2hvc3QoaG9zdCk7CisJfQorCiAJbnNtX3JlbGVhc2UobnNtKTsKIH0KIApAQCAtNDk3LDEzICs1ODksMTEgQEAKIAogCS8qIEZpcnN0LCBtYWtlIGFsbCBob3N0cyBlbGlnaWJsZSBmb3IgZ2MgKi8KIAlkcHJpbnRrKCJsb2NrZDogbnVraW5nIGFsbCBob3N0cy4uLlxuIik7Ci0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7Ci0JCQlob3N0LT5oX2V4cGlyZXMgPSBqaWZmaWVzIC0gMTsKLQkJCWlmIChob3N0LT5oX3JwY2NsbnQpIHsKLQkJCQlycGNfc2h1dGRvd25fY2xpZW50KGhvc3QtPmhfcnBjY2xudCk7Ci0JCQkJaG9zdC0+aF9ycGNjbG50ID0gTlVMTDsKLQkJCX0KKwlmb3JfZWFjaF9ob3N0KGhvc3QsIHBvcywgY2hhaW4sIG5sbV9zZXJ2ZXJfaG9zdHMpIHsKKwkJaG9zdC0+aF9leHBpcmVzID0gamlmZmllcyAtIDE7CisJCWlmIChob3N0LT5oX3JwY2NsbnQpIHsKKwkJCXJwY19zaHV0ZG93bl9jbGllbnQoaG9zdC0+aF9ycGNjbG50KTsKKwkJCWhvc3QtPmhfcnBjY2xudCA9IE5VTEw7CiAJCX0KIAl9CiAKQEAgLTUxMiwxNSArNjAyLDEzIEBACiAJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CiAKIAkvKiBjb21wbGFpbiBpZiBhbnkgaG9zdHMgYXJlIGxlZnQgKi8KLQlpZiAobnJob3N0cykgeworCWlmIChucmhvc3RzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2Q6IGNvdWxkbid0IHNodXRkb3duIGhvc3QgbW9kdWxlIVxuIik7Ci0JCWRwcmludGsoImxvY2tkOiAlZCBob3N0cyBsZWZ0OlxuIiwgbnJob3N0cyk7Ci0JCWZvciAoY2hhaW4gPSBubG1faG9zdHM7IGNoYWluIDwgbmxtX2hvc3RzICsgTkxNX0hPU1RfTlJIQVNIOyArK2NoYWluKSB7Ci0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKLQkJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAotCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOwotCQkJfQorCQlkcHJpbnRrKCJsb2NrZDogJWx1IGhvc3RzIGxlZnQ6XG4iLCBucmhvc3RzKTsKKwkJZm9yX2VhY2hfaG9zdChob3N0LCBwb3MsIGNoYWluLCBubG1fc2VydmVyX2hvc3RzKSB7CisJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJaG9zdC0+aF9uYW1lLCBhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCksCisJCQkJaG9zdC0+aF9pbnVzZSwgaG9zdC0+aF9leHBpcmVzKTsKIAkJfQogCX0KIH0KQEAgLTUzOCwyOSArNjI2LDIyIEBACiAJc3RydWN0IG5sbV9ob3N0CSpob3N0OwogCiAJZHByaW50aygibG9ja2Q6IGhvc3QgZ2FyYmFnZSBjb2xsZWN0aW9uXG4iKTsKLQlmb3IgKGNoYWluID0gbmxtX2hvc3RzOyBjaGFpbiA8IG5sbV9ob3N0cyArIE5MTV9IT1NUX05SSEFTSDsgKytjaGFpbikgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpCi0JCQlob3N0LT5oX2ludXNlID0gMDsKLQl9CisJZm9yX2VhY2hfaG9zdChob3N0LCBwb3MsIGNoYWluLCBubG1fc2VydmVyX2hvc3RzKQorCQlob3N0LT5oX2ludXNlID0gMDsKIAogCS8qIE1hcmsgYWxsIGhvc3RzIHRoYXQgaG9sZCBsb2NrcywgYmxvY2tzIG9yIHNoYXJlcyAqLwogCW5sbXN2Y19tYXJrX3Jlc291cmNlcygpOwogCi0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3N0LCBwb3MsIG5leHQsIGNoYWluLCBoX2hhc2gpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgfHwgaG9zdC0+aF9pbnVzZQotCQkJIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsIGhvc3QtPmhfZXhwaXJlcykpIHsKLQkJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAotCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZHByaW50aygibG9ja2Q6IGRlbGV0ZSBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOwotCQkJaGxpc3RfZGVsX2luaXQoJmhvc3QtPmhfaGFzaCk7Ci0KLQkJCW5sbV9kZXN0cm95X2hvc3QoaG9zdCk7Ci0JCQlucmhvc3RzLS07CisJZm9yX2VhY2hfaG9zdF9zYWZlKGhvc3QsIHBvcywgbmV4dCwgY2hhaW4sIG5sbV9zZXJ2ZXJfaG9zdHMpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSB8fCBob3N0LT5oX2ludXNlCisJCSB8fCB0aW1lX2JlZm9yZShqaWZmaWVzLCBob3N0LT5oX2V4cGlyZXMpKSB7CisJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgIgorCQkJCSIoY250ICVkIHVzZSAlZCBleHAgJWxkKVxuIiwKKwkJCQlob3N0LT5oX25hbWUsIGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSwKKwkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJY29udGludWU7CiAJCX0KKwkJbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoaG9zdCk7CiAJfQogCiAJbmV4dF9nYyA9IGppZmZpZXMgKyBOTE1fSE9TVF9DT0xMRUNUOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvbW9uLmMgYi9mcy9sb2NrZC9tb24uYwppbmRleCBlMGM5MTg5Li4yM2Q3NDUxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9tb24uYworKysgYi9mcy9sb2NrZC9tb24uYwpAQCAtNDAxLDI2ICs0MDEsMjIgQEAKICAqIFN0YXR1cyBNb25pdG9yIHdpcmUgcHJvdG9jb2wuCiAgKi8KIAotc3RhdGljIGludCBlbmNvZGVfbnNtX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcpCitzdGF0aWMgdm9pZCBlbmNvZGVfbnNtX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcpCiB7CiAJY29uc3QgdTMyIGxlbiA9IHN0cmxlbihzdHJpbmcpOwogCV9fYmUzMiAqcDsKIAotCWlmICh1bmxpa2VseShsZW4gPiBTTV9NQVhTVFJMRU4pKQotCQlyZXR1cm4gLUVJTzsKLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBzaXplb2YodTMyKSArIGxlbik7Ci0JaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlPOworCUJVR19PTihsZW4gPiBTTV9NQVhTVFJMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW4pOwogCXhkcl9lbmNvZGVfb3BhcXVlKHAsIHN0cmluZywgbGVuKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqICJtb25fbmFtZSIgc3BlY2lmaWVzIHRoZSBob3N0IHRvIGJlIG1vbml0b3JlZC4KICAqLwotc3RhdGljIGludCBlbmNvZGVfbW9uX25hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX21vbl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlyZXR1cm4gZW5jb2RlX25zbV9zdHJpbmcoeGRyLCBhcmdwLT5tb25fbmFtZSk7CisJZW5jb2RlX25zbV9zdHJpbmcoeGRyLCBhcmdwLT5tb25fbmFtZSk7CiB9CiAKIC8qCkBAIC00MjksMzUgKzQyNSwyNSBAQAogICogKHZpYSB0aGUgTkxNUFJPQ19TTV9OT1RJRlkgY2FsbCkgdGhhdCB0aGUgc3RhdGUgb2YgaG9zdCAibW9uX25hbWUiCiAgKiBoYXMgY2hhbmdlZC4KICAqLwotc3RhdGljIGludCBlbmNvZGVfbXlfaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX215X2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlpbnQgc3RhdHVzOwogCV9fYmUzMiAqcDsKIAotCXN0YXR1cyA9IGVuY29kZV9uc21fc3RyaW5nKHhkciwgdXRzbmFtZSgpLT5ub2RlbmFtZSk7Ci0JaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKLQkJcmV0dXJuIHN0YXR1czsKLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAzICogc2l6ZW9mKHUzMikpOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gaHRvbmwoYXJncC0+cHJvZyk7Ci0JKnArKyA9IGh0b25sKGFyZ3AtPnZlcnMpOwotCSpwKysgPSBodG9ubChhcmdwLT5wcm9jKTsKLQlyZXR1cm4gMDsKKwllbmNvZGVfbnNtX3N0cmluZyh4ZHIsIHV0c25hbWUoKS0+bm9kZW5hbWUpOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA0ICsgNCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZ3AtPnByb2cpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdwLT52ZXJzKTsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3AtPnByb2MpOwogfQogCiAvKgogICogVGhlICJtb25faWQiIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbm9uLXByaXZhdGUgYXJndW1lbnRzCiAgKiBvZiBhbiBOU01QUk9DX01PTiBvciBOU01QUk9DX1VOTU9OIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQgZW5jb2RlX21vbl9pZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgdm9pZCBlbmNvZGVfbW9uX2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gZW5jb2RlX21vbl9uYW1lKHhkciwgYXJncCk7Ci0JaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKLQkJcmV0dXJuIHN0YXR1czsKLQlyZXR1cm4gZW5jb2RlX215X2lkKHhkciwgYXJncCk7CisJZW5jb2RlX21vbl9uYW1lKHhkciwgYXJncCk7CisJZW5jb2RlX215X2lkKHhkciwgYXJncCk7CiB9CiAKIC8qCkBAIC00NjUsNjggKzQ1MSw1NiBAQAogICogYnkgdGhlIE5TTVBST0NfTU9OIGNhbGwuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwbGllZCBpbiB0aGUKICAqIE5MTVBST0NfU01fTk9USUZZIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQgZW5jb2RlX3ByaXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX3ByaXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewogCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIFNNX1BSSVZfU0laRSk7CisJeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgYXJncC0+cHJpdi0+ZGF0YSwgU01fUFJJVl9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgbnNtX3hkcl9lbmNfbW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3sKKwllbmNvZGVfbW9uX2lkKHhkciwgYXJncCk7CisJZW5jb2RlX3ByaXYoeGRyLCBhcmdwKTsKK30KKworc3RhdGljIHZvaWQgbnNtX3hkcl9lbmNfdW5tb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCit7CisJZW5jb2RlX21vbl9pZCh4ZHIsIGFyZ3ApOworfQorCitzdGF0aWMgaW50IG5zbV94ZHJfZGVjX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwotCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIGFyZ3AtPnByaXYtPmRhdGEsIFNNX1BSSVZfU0laRSk7CisJcmVzcC0+c3RhdHVzID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzcC0+c3RhdGUgPSBiZTMyX3RvX2NwdXAocCk7CisKKwlkcHJpbnRrKCJsb2NrZDogJXMgc3RhdHVzICVkIHN0YXRlICVkXG4iLAorCQlfX2Z1bmNfXywgcmVzcC0+c3RhdHVzLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeGRyX2VuY19tb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0JaW50IHN0YXR1czsKLQotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQlzdGF0dXMgPSBlbmNvZGVfbW9uX2lkKCZ4ZHIsIGFyZ3ApOwotCWlmICh1bmxpa2VseShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCXJldHVybiBlbmNvZGVfcHJpdigmeGRyLCBhcmdwKTsKLX0KLQotc3RhdGljIGludCB4ZHJfZW5jX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQotewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLQotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQlyZXR1cm4gZW5jb2RlX21vbl9pZCgmeGRyLCBhcmdwKTsKLX0KLQotc3RhdGljIGludCB4ZHJfZGVjX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbnNtX3hkcl9kZWNfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkgICAgc3RydWN0IG5zbV9yZXMgKnJlc3ApCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOworCV9fYmUzMiAqcDsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSgmeGRyLCAyICogc2l6ZW9mKHUzMikpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKLQlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKKwlyZXNwLT5zdGF0ZSA9IGJlMzJfdG9fY3B1cChwKTsKIAotCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKLQkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHhkcl9kZWNfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCi0JCQlzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKLXsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0KLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgc2l6ZW9mKHUzMikpOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKLQotCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXQgc3RhdGUgJWRcbiIsIHJlc3AtPnN0YXRlKTsKKwlkcHJpbnRrKCJsb2NrZDogJXMgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0Miw4ICs1MTYsOCBAQAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKIFtOU01QUk9DX01PTl0gPSB7CiAJCS5wX3Byb2MJCT0gTlNNUFJPQ19NT04sCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfbW9uLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZGVjX3N0YXRfcmVzLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpbnNtX3hkcl9lbmNfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpbnNtX3hkcl9kZWNfc3RhdF9yZXMsCiAJCS5wX2FyZ2xlbgk9IFNNX21vbl9zeiwKIAkJLnBfcmVwbGVuCT0gU01fbW9ucmVzX3N6LAogCQkucF9zdGF0aWR4CT0gTlNNUFJPQ19NT04sCkBAIC01NTEsOCArNTI1LDggQEAKIAl9LAogW05TTVBST0NfVU5NT05dID0gewogCQkucF9wcm9jCQk9IE5TTVBST0NfVU5NT04sCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfdW5tb24sCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXhkcl9kZWNfc3RhdCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KW5zbV94ZHJfZW5jX3VubW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpbnNtX3hkcl9kZWNfc3RhdCwKIAkJLnBfYXJnbGVuCT0gU01fbW9uX2lkX3N6LAogCQkucF9yZXBsZW4JPSBTTV91bm1vbnJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IE5TTVBST0NfVU5NT04sCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmM0cHJvYy5jIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwppbmRleCAzOGQyNjExLi45YTQxZmRjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmM0cHJvYy5jCisrKyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlyZXR1cm4gMDsKIAogbm9fbG9ja3M6Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsJCiAJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CkBAIC05Miw3ICs5Miw3IEBACiAJZWxzZQogCQlkcHJpbnRrKCJsb2NrZDogVEVTVDQgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CiAKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzQsNyArMTM0LDcgQEAKIAllbHNlCiAJCWRwcmludGsoImxvY2tkOiBMT0NLICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKIAotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiByYzsKIH0KQEAgLTE2NCw3ICsxNjQsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jayk7CiAKIAlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y191bmxvY2soZmlsZSwgJmFyZ3AtPmxvY2spOwogCiAJZHByaW50aygibG9ja2Q6IFVOTE9DSyAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0yMjksNyArMjI5LDcgQEAKIAogc3RhdGljIHZvaWQgbmxtNHN2Y19jYWxsYmFja19yZWxlYXNlKHZvaWQgKmRhdGEpCiB7Ci0JbmxtX3JlbGVhc2VfY2FsbChkYXRhKTsKKwlubG1zdmNfcmVsZWFzZV9jYWxsKGRhdGEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBubG00c3ZjX2NhbGxiYWNrX29wcyA9IHsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCiAJc3RhdCA9IGZ1bmMocnFzdHAsIGFyZ3AsICZjYWxsLT5hX3Jlcyk7CiAJaWYgKHN0YXQgIT0gMCkgewotCQlubG1fcmVsZWFzZV9jYWxsKGNhbGwpOworCQlubG1zdmNfcmVsZWFzZV9jYWxsKGNhbGwpOwogCQlyZXR1cm4gc3RhdDsKIAl9CiAKQEAgLTMzNCw3ICszMzQsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOwogCiAJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlyZXNwLT5zdGF0dXMgPSBubG1zdmNfdW5zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOwogCiAJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCiAJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjbG9jay5jIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCmluZGV4IGVmNTY1OWIuLjZlMzE2OTUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y2xvY2suYworKysgYi9mcy9sb2NrZC9zdmNsb2NrLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIHN0YXRpYyBpbnQgbmxtc3ZjX3NldGdyYW50YXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwsIHN0cnVjdCBubG1fbG9jayAqbG9jayk7CiBzdGF0aWMgdm9pZCBubG1zdmNfZnJlZWdyYW50YXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmxtc3ZjX2dyYW50X29wczsKK3N0YXRpYyBjb25zdCBjaGFyICpubG1kYmdfY29va2llMmEoY29uc3Qgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSk7CiAKIC8qCiAgKiBUaGUgbGlzdCBvZiBibG9ja2VkIGxvY2tzIHRvIHJldHJ5CkBAIC0yMzMsNyArMjM0LDcgQEAKIGZhaWxlZF9mcmVlOgogCWtmcmVlKGJsb2NrKTsKIGZhaWxlZDoKLQlubG1fcmVsZWFzZV9jYWxsKGNhbGwpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoY2FsbCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI2Niw3ICsyNjcsNyBAQAogCW11dGV4X3VubG9jaygmZmlsZS0+Zl9tdXRleCk7CiAKIAlubG1zdmNfZnJlZWdyYW50YXJncyhibG9jay0+Yl9jYWxsKTsKLQlubG1fcmVsZWFzZV9jYWxsKGJsb2NrLT5iX2NhbGwpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoYmxvY2stPmJfY2FsbCk7CiAJbmxtX3JlbGVhc2VfZmlsZShibG9jay0+Yl9maWxlKTsKIAlrZnJlZShibG9jay0+Yl9mbCk7CiAJa2ZyZWUoYmxvY2spOwpAQCAtOTM0LDMgKzkzNSwzMiBAQAogCiAJcmV0dXJuIHRpbWVvdXQ7CiB9CisKKyNpZmRlZiBSUENfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpubG1kYmdfY29va2llMmEoY29uc3Qgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwkvKgorCSAqIFdlIGNhbiBnZXQgYXdheSB3aXRoIGEgc3RhdGljIGJ1ZmZlciBiZWNhdXNlIHdlJ3JlIG9ubHkKKwkgKiBjYWxsZWQgd2l0aCBCS0wgaGVsZC4KKwkgKi8KKwlzdGF0aWMgY2hhciBidWZbMipOTE1fTUFYQ09PS0lFTEVOKzFdOworCXVuc2lnbmVkIGludCBpLCBsZW4gPSBzaXplb2YoYnVmKTsKKwljaGFyICpwID0gYnVmOworCisJbGVuLS07CS8qIGFsbG93IGZvciB0cmFpbGluZyBcMCAqLworCWlmIChsZW4gPCAzKQorCQlyZXR1cm4gIj8/PyI7CisJZm9yIChpID0gMCA7IGkgPCBjb29raWUtPmxlbiA7IGkrKykgeworCQlpZiAobGVuIDwgMikgeworCQkJc3RyY3B5KHAtMywgIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJc3ByaW50ZihwLCAiJTAyeCIsIGNvb2tpZS0+ZGF0YVtpXSk7CisJCXAgKz0gMjsKKwkJbGVuIC09IDI7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3Byb2MuYyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwppbmRleCAwY2FlYTUzLi5kMjdhYWIxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCkBAIC04MCw3ICs4MCw3IEBACiAJcmV0dXJuIDA7CiAKIG5vX2xvY2tzOgotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlyZXR1cm4gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlkcHJpbnRrKCJsb2NrZDogVEVTVCAgICAgICAgICBzdGF0dXMgJWQgdmVycyAlZFxuIiwKIAkJCW50b2hsKHJlc3AtPnN0YXR1cyksIHJxc3RwLT5ycV92ZXJzKTsKIAotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiByYzsKIH0KQEAgLTE2NCw3ICsxNjQsNyBAQAogCWVsc2UKIAkJZHByaW50aygibG9ja2Q6IExPQ0sgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwogCi0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTk0LDcgKzE5NCw3IEBACiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKSk7CiAKIAlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y191bmxvY2soZmlsZSwgJmFyZ3AtPmxvY2spKTsKIAogCWRwcmludGsoImxvY2tkOiBVTkxPQ0sgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQpAQCAtMjU3LDkgKzI1NywxNyBAQAogCQkJLXRhc2stPnRrX3N0YXR1cyk7CiB9CiAKK3ZvaWQgbmxtc3ZjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT5hX2NvdW50KSkKKwkJcmV0dXJuOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoY2FsbC0+YV9ob3N0KTsKKwlrZnJlZShjYWxsKTsKK30KKwogc3RhdGljIHZvaWQgbmxtc3ZjX2NhbGxiYWNrX3JlbGVhc2Uodm9pZCAqZGF0YSkKIHsKLQlubG1fcmVsZWFzZV9jYWxsKGRhdGEpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoZGF0YSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5sbXN2Y19jYWxsYmFja19vcHMgPSB7CkBAIC0yOTEsNyArMjk5LDcgQEAKIAogCXN0YXQgPSBmdW5jKHJxc3RwLCBhcmdwLCAmY2FsbC0+YV9yZXMpOwogCWlmIChzdGF0ICE9IDApIHsKLQkJbmxtX3JlbGVhc2VfY2FsbChjYWxsKTsKKwkJbmxtc3ZjX3JlbGVhc2VfY2FsbChjYWxsKTsKIAkJcmV0dXJuIHN0YXQ7CiAJfQogCkBAIC0zNjYsNyArMzc0LDcgQEAKIAlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CiAKIAlkcHJpbnRrKCJsb2NrZDogU0hBUkUgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTM5OSw3ICs0MDcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y191bnNoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCkpOwogCiAJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC00MzEsNyArNDM5LDcgQEAKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCiAJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwppbmRleCBiNTgzYWIwLi45NjQ2NjZjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC94ZHIuYworKysgYi9mcy9sb2NrZC94ZHIuYwpAQCAtMTQ5LDM3ICsxNDksNiBAQAogfQogCiAvKgotICogRW5jb2RlIGEgbG9jayBhcyBwYXJ0IG9mIGFuIE5MTSBjYWxsCi0gKi8KLXN0YXRpYyBfX2JlMzIgKgotbmxtX2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQotewotCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwotCV9fczMyCQkJc3RhcnQsIGxlbjsKLQotCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQotCSB8fCAhKHAgPSBubG1fZW5jb2RlX2ZoKHAsICZsb2NrLT5maCkpCi0JIHx8ICEocCA9IG5sbV9lbmNvZGVfb2gocCwgJmxvY2stPm9oKSkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGZsLT5mbF9zdGFydCA+IE5MTV9PRkZTRVRfTUFYCi0JIHx8IChmbC0+ZmxfZW5kID4gTkxNX09GRlNFVF9NQVggJiYgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzdGFydCA9IGxvZmZfdF90b19zMzIoZmwtPmZsX3N0YXJ0KTsKLQlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQotCQlsZW4gPSAwOwotCWVsc2UKLQkJbGVuID0gbG9mZl90X3RvX3MzMihmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMSk7Ci0KLQkqcCsrID0gaHRvbmwobG9jay0+c3ZpZCk7Ci0JKnArKyA9IGh0b25sKHN0YXJ0KTsKLQkqcCsrID0gaHRvbmwobGVuKTsKLQotCXJldHVybiBwOwotfQotCi0vKgogICogRW5jb2RlIHJlc3VsdCBvZiBhIFRFU1QvVEVTVF9NU0cgY2FsbAogICovCiBzdGF0aWMgX19iZTMyICoKQEAgLTM3MiwyNTkgKzM0MSwzIEBACiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KLQotLyoKLSAqIE5vdywgdGhlIGNsaWVudCBzaWRlIFhEUiBmdW5jdGlvbnMKLSAqLwotI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKLXN0YXRpYyBpbnQKLW5sbWNsdF9kZWNvZGVfdm9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpwdHIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9kZWNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSAqcCsrOwotCWlmIChyZXNwLT5zdGF0dXMgPT0gbmxtX2xja19kZW5pZWQpIHsKLQkJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmcmVzcC0+bG9jay5mbDsKLQkJdTMyCQkJZXhjbDsKLQkJczMyCQkJc3RhcnQsIGxlbiwgZW5kOwotCi0JCW1lbXNldCgmcmVzcC0+bG9jaywgMCwgc2l6ZW9mKHJlc3AtPmxvY2spKTsKLQkJbG9ja3NfaW5pdF9sb2NrKGZsKTsKLQkJZXhjbCA9IG50b2hsKCpwKyspOwotCQlyZXNwLT5sb2NrLnN2aWQgPSBudG9obCgqcCsrKTsKLQkJZmwtPmZsX3BpZCA9IChwaWRfdClyZXNwLT5sb2NrLnN2aWQ7Ci0JCWlmICghKHAgPSBubG1fZGVjb2RlX29oKHAsICZyZXNwLT5sb2NrLm9oKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKLQkJZmwtPmZsX3R5cGUgID0gZXhjbD8gRl9XUkxDSyA6IEZfUkRMQ0s7Ci0JCXN0YXJ0ID0gbnRvaGwoKnArKyk7Ci0JCWxlbiA9IG50b2hsKCpwKyspOwotCQllbmQgPSBzdGFydCArIGxlbiAtIDE7Ci0KLQkJZmwtPmZsX3N0YXJ0ID0gczMyX3RvX2xvZmZfdChzdGFydCk7Ci0JCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQotCQkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7Ci0JCWVsc2UKLQkJCWZsLT5mbF9lbmQgPSBzMzJfdG9fbG9mZl90KGVuZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gYXJncC0+YmxvY2s/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQlpZiAoIShwID0gbmxtX2VuY29kZV9sb2NrKHAsIGxvY2spKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPnJlY2xhaW0/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gaHRvbmwoYXJncC0+c3RhdGUpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtY2x0X2VuY29kZV9jYW5jYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQotewotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSByZXNwLT5zdGF0dXM7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ubG1jbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCi0JCXJldHVybiAtRUlPOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtY2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIChOTE1DTE5UX09IU0laRSA+IFhEUl9NQVhfTkVUT0JKKQotIyAgZXJyb3IgIk5MTSBob3N0IG5hbWUgY2Fubm90IGJlIGxhcmdlciB0aGFuIFhEUl9NQVhfTkVUT0JKISIKLSNlbmRpZgotCi0vKgotICogQnVmZmVyIHJlcXVpcmVtZW50cyBmb3IgTkxNCi0gKi8KLSNkZWZpbmUgTkxNX3ZvaWRfc3oJCTAKLSNkZWZpbmUgTkxNX2Nvb2tpZV9zegkJMStYRFJfUVVBRExFTihOTE1fTUFYQ09PS0lFTEVOKQotI2RlZmluZSBOTE1fY2FsbGVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTUNMTlRfT0hTSVpFKQotI2RlZmluZSBOTE1fb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTV9maGFuZGxlX3N6CQkxK1hEUl9RVUFETEVOKE5GUzJfRkhTSVpFKQotI2RlZmluZSBOTE1fbG9ja19zegkJMytOTE1fY2FsbGVyX3N6K05MTV9vd25lcl9zeitOTE1fZmhhbmRsZV9zegotI2RlZmluZSBOTE1faG9sZGVyX3N6CQk0K05MTV9vd25lcl9zegotCi0jZGVmaW5lIE5MTV90ZXN0YXJnc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJTkxNX2Nvb2tpZV9zeis0K05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV9jYW5jYXJnc19zegkJTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV91bmxvY2thcmdzX3N6CU5MTV9jb29raWVfc3orTkxNX2xvY2tfc3oKLQotI2RlZmluZSBOTE1fdGVzdHJlc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9ob2xkZXJfc3oKLSNkZWZpbmUgTkxNX3Jlc19zegkJTkxNX2Nvb2tpZV9zeisxCi0jZGVmaW5lIE5MTV9ub3JlcF9zegkJMAotCi0vKgotICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCi0gKi8KLSNkZWZpbmUgbmxtY2x0X2RlY29kZV9ub3JlcAlOVUxMCi0KLSNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQlcCi1bTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCi0JLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbWNsdF9lbmNvZGVfIyNhcmd0eXBlLAkJXAotCS5wX2RlY29kZSAgICA9IChreGRycHJvY190KSBubG1jbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKLQkucF9hcmdsZW4gICAgPSBOTE1fIyNhcmd0eXBlIyNfc3osCQkJCVwKLQkucF9yZXBsZW4gICAgPSBOTE1fIyNyZXN0eXBlIyNfc3osCQkJCVwKLQkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKLQkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCi0JfQotCi1zdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG1fcHJvY2VkdXJlc1tdID0gewotICAgIFBST0MoVEVTVCwJCXRlc3RhcmdzLAl0ZXN0cmVzKSwKLSAgICBQUk9DKExPQ0ssCQlsb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKENBTkNFTCwJY2FuY2FyZ3MsCXJlcyksCi0gICAgUFJPQyhVTkxPQ0ssCXVubG9ja2FyZ3MsCXJlcyksCi0gICAgUFJPQyhHUkFOVEVELAl0ZXN0YXJncywJcmVzKSwKLSAgICBQUk9DKFRFU1RfTVNHLAl0ZXN0YXJncywJbm9yZXApLAotICAgIFBST0MoTE9DS19NU0csCWxvY2thcmdzLAlub3JlcCksCi0gICAgUFJPQyhDQU5DRUxfTVNHLAljYW5jYXJncywJbm9yZXApLAotICAgIFBST0MoVU5MT0NLX01TRywJdW5sb2NrYXJncywJbm9yZXApLAotICAgIFBST0MoR1JBTlRFRF9NU0csCXRlc3RhcmdzLAlub3JlcCksCi0gICAgUFJPQyhURVNUX1JFUywJdGVzdHJlcywJbm9yZXApLAotICAgIFBST0MoTE9DS19SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKENBTkNFTF9SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKFVOTE9DS19SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKEdSQU5URURfUkVTLAlyZXMsCQlub3JlcCksCi0jaWZkZWYgTkxNQ0xOVF9TVVBQT1JUX1NIQVJFUwotICAgIFBST0MoU0hBUkUsCQlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKLSAgICBQUk9DKFVOU0hBUkUsCXNoYXJlYXJncywJc2hhcmVyZXMpLAotICAgIFBST0MoTk1fTE9DSywJbG9ja2FyZ3MsCXJlcyksCi0gICAgUFJPQyhGUkVFX0FMTCwJbm90aWZ5LAkJdm9pZCksCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb24xID0gewotCQkubnVtYmVyCQk9IDEsCi0JCS5ucnByb2NzCT0gMTYsCi0JCS5wcm9jcwkJPSBubG1fcHJvY2VkdXJlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb24zID0gewotCQkubnVtYmVyCQk9IDMsCi0JCS5ucnByb2NzCT0gMjQsCi0JCS5wcm9jcwkJPSBubG1fcHJvY2VkdXJlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKglubG1fdmVyc2lvbnNbXSA9IHsKLQlbMV0gPSAmbmxtX3ZlcnNpb24xLAotCVszXSA9ICZubG1fdmVyc2lvbjMsCi0jaWZkZWYgCUNPTkZJR19MT0NLRF9WNAotCVs0XSA9ICZubG1fdmVyc2lvbjQsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5sbV9zdGF0czsKLQotc3RydWN0IHJwY19wcm9ncmFtCQlubG1fcHJvZ3JhbSA9IHsKLQkJLm5hbWUJCT0gImxvY2tkIiwKLQkJLm51bWJlcgkJPSBOTE1fUFJPR1JBTSwKLQkJLm5ydmVycwkJPSBBUlJBWV9TSVpFKG5sbV92ZXJzaW9ucyksCi0JCS52ZXJzaW9uCT0gbmxtX3ZlcnNpb25zLAotCQkuc3RhdHMJCT0gJm5sbV9zdGF0cywKLX07Ci0KLSNpZmRlZiBSUENfREVCVUcKLWNvbnN0IGNoYXIgKm5sbWRiZ19jb29raWUyYShjb25zdCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqY29va2llKQotewotCS8qCi0JICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzdGF0aWMgYnVmZmVyIGJlY2F1c2Ugd2UncmUgb25seQotCSAqIGNhbGxlZCB3aXRoIEJLTCBoZWxkLgotCSAqLwotCXN0YXRpYyBjaGFyIGJ1ZlsyKk5MTV9NQVhDT09LSUVMRU4rMV07Ci0JdW5zaWduZWQgaW50IGksIGxlbiA9IHNpemVvZihidWYpOwotCWNoYXIgKnAgPSBidWY7Ci0KLQlsZW4tLTsJLyogYWxsb3cgZm9yIHRyYWlsaW5nIFwwICovCi0JaWYgKGxlbiA8IDMpCi0JCXJldHVybiAiPz8/IjsKLQlmb3IgKGkgPSAwIDsgaSA8IGNvb2tpZS0+bGVuIDsgaSsrKSB7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlzdHJjcHkocC0zLCAiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlzcHJpbnRmKHAsICIlMDJ4IiwgY29va2llLT5kYXRhW2ldKTsKLQkJcCArPSAyOwotCQlsZW4gLT0gMjsKLQl9Ci0JKnAgPSAnXDAnOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCmluZGV4IGFkOWRiYmMuLmRmYTQ3ODkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkcjQuYworKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTkzLDE1ICs5Myw2IEBACiAJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmLT5zaXplKTsKIH0KIAotc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCi17Ci0JKnArKyA9IGh0b25sKGYtPnNpemUpOwotCWlmIChmLT5zaXplKSBwW1hEUl9RVUFETEVOKGYtPnNpemUpLTFdID0gMDsgLyogZG9uJ3QgbGVhayBhbnl0aGluZyAqLwotCW1lbWNweShwLCBmLT5kYXRhLCBmLT5zaXplKTsKLQlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGYtPnNpemUpOwotfQotCiAvKgogICogRW5jb2RlIGFuZCBkZWNvZGUgb3duZXIgaGFuZGxlCiAgKi8KQEAgLTExMiwxMiArMTAzLDYgQEAKIH0KIAogc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKLXsKLQlyZXR1cm4geGRyX2VuY29kZV9uZXRvYmoocCwgb2gpOwotfQotCi1zdGF0aWMgX19iZTMyICoKIG5sbTRfZGVjb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CkBAIC0xNTAsMzggKzEzNSw2IEBACiB9CiAKIC8qCi0gKiBFbmNvZGUgYSBsb2NrIGFzIHBhcnQgb2YgYW4gTkxNIGNhbGwKLSAqLwotc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQotewotCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwotCV9fczY0CQkJc3RhcnQsIGxlbjsKLQotCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQotCSB8fCAhKHAgPSBubG00X2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQotCSB8fCAhKHAgPSBubG00X2VuY29kZV9vaChwLCAmbG9jay0+b2gpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoZmwtPmZsX3N0YXJ0ID4gTkxNNF9PRkZTRVRfTUFYCi0JIHx8IChmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCi0JCXJldHVybiBOVUxMOwotCi0JKnArKyA9IGh0b25sKGxvY2stPnN2aWQpOwotCi0Jc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7Ci0JaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKLQkJbGVuID0gMDsKLQllbHNlCi0JCWxlbiA9IGxvZmZfdF90b19zNjQoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOwotCi0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgc3RhcnQpOwotCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxlbik7Ci0KLQlyZXR1cm4gcDsKLX0KLQotLyoKICAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKICAqLwogc3RhdGljIF9fYmUzMiAqCkBAIC0zNzksMjExICszMzIsMyBAQAogewogCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9Ci0KLS8qCi0gKiBOb3csIHRoZSBjbGllbnQgc2lkZSBYRFIgZnVuY3Rpb25zCi0gKi8KLSNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCi1zdGF0aWMgaW50Ci1ubG00Y2x0X2RlY29kZV92b2lkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCi0JCXJldHVybiAtRUlPOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtNGNsdF9kZWNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlpZiAocmVzcC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKSB7Ci0JCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJnJlc3AtPmxvY2suZmw7Ci0JCXUzMgkJCWV4Y2w7Ci0JCV9fdTY0CQkJc3RhcnQsIGxlbjsKLQkJX19zNjQJCQllbmQ7Ci0KLQkJbWVtc2V0KCZyZXNwLT5sb2NrLCAwLCBzaXplb2YocmVzcC0+bG9jaykpOwotCQlsb2Nrc19pbml0X2xvY2soZmwpOwotCQlleGNsID0gbnRvaGwoKnArKyk7Ci0JCXJlc3AtPmxvY2suc3ZpZCA9IG50b2hsKCpwKyspOwotCQlmbC0+ZmxfcGlkID0gKHBpZF90KXJlc3AtPmxvY2suc3ZpZDsKLQkJaWYgKCEocCA9IG5sbTRfZGVjb2RlX29oKHAsICZyZXNwLT5sb2NrLm9oKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKLQkJZmwtPmZsX3R5cGUgID0gZXhjbD8gRl9XUkxDSyA6IEZfUkRMQ0s7Ci0JCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZzdGFydCk7Ci0JCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZsZW4pOwotCQllbmQgPSBzdGFydCArIGxlbiAtIDE7Ci0KLQkJZmwtPmZsX3N0YXJ0ID0gczY0X3RvX2xvZmZfdChzdGFydCk7Ci0JCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQotCQkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7Ci0JCWVsc2UKLQkJCWZsLT5mbF9lbmQgPSBzNjRfdG9fbG9mZl90KGVuZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQotewotCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwotCi0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPnJlY2xhaW0/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gaHRvbmwoYXJncC0+c3RhdGUpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtNGNsdF9lbmNvZGVfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPmJsb2NrPyB4ZHJfb25lIDogeGRyX3plcm87Ci0JKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3VubG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IHJlc3AtPnN0YXR1czsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX3Rlc3RyZXMocCwgcmVzcCkpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIChOTE1DTE5UX09IU0laRSA+IFhEUl9NQVhfTkVUT0JKKQotIyAgZXJyb3IgIk5MTSBob3N0IG5hbWUgY2Fubm90IGJlIGxhcmdlciB0aGFuIFhEUl9NQVhfTkVUT0JKISIKLSNlbmRpZgotCi0jaWYgKE5MTUNMTlRfT0hTSVpFID4gTkxNX01BWFNUUkxFTikKLSMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBOTE0ncyBtYXhpbXVtIHN0cmluZyBsZW5ndGghIgotI2VuZGlmCi0KLS8qCi0gKiBCdWZmZXIgcmVxdWlyZW1lbnRzIGZvciBOTE0KLSAqLwotI2RlZmluZSBOTE00X3ZvaWRfc3oJCTAKLSNkZWZpbmUgTkxNNF9jb29raWVfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWENPT0tJRUxFTikKLSNkZWZpbmUgTkxNNF9jYWxsZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTTRfb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTTRfZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMzX0ZIU0laRSkKLSNkZWZpbmUgTkxNNF9sb2NrX3N6CQk1K05MTTRfY2FsbGVyX3N6K05MTTRfb3duZXJfc3orTkxNNF9maGFuZGxlX3N6Ci0jZGVmaW5lIE5MTTRfaG9sZGVyX3N6CQk2K05MTTRfb3duZXJfc3oKLQotI2RlZmluZSBOTE00X3Rlc3RhcmdzX3N6CU5MTTRfY29va2llX3N6KzErTkxNNF9sb2NrX3N6Ci0jZGVmaW5lIE5MTTRfbG9ja2FyZ3Nfc3oJTkxNNF9jb29raWVfc3orNCtOTE00X2xvY2tfc3oKLSNkZWZpbmUgTkxNNF9jYW5jYXJnc19zeglOTE00X2Nvb2tpZV9zeisyK05MTTRfbG9ja19zegotI2RlZmluZSBOTE00X3VubG9ja2FyZ3Nfc3oJTkxNNF9jb29raWVfc3orTkxNNF9sb2NrX3N6Ci0KLSNkZWZpbmUgTkxNNF90ZXN0cmVzX3N6CQlOTE00X2Nvb2tpZV9zeisxK05MTTRfaG9sZGVyX3N6Ci0jZGVmaW5lIE5MTTRfcmVzX3N6CQlOTE00X2Nvb2tpZV9zeisxCi0jZGVmaW5lIE5MTTRfbm9yZXBfc3oJCTAKLQotLyoKLSAqIEZvciBOTE0sIGEgdm9pZCBwcm9jZWR1cmUgcmVhbGx5IHJldHVybnMgbm90aGluZwotICovCi0jZGVmaW5lIG5sbTRjbHRfZGVjb2RlX25vcmVwCU5VTEwKLQotI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCQlcCi1bTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCi0JLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbTRjbHRfZW5jb2RlXyMjYXJndHlwZSwJCVwKLQkucF9kZWNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmxtNGNsdF9kZWNvZGVfIyNyZXN0eXBlLAkJXAotCS5wX2FyZ2xlbiAgICA9IE5MTTRfIyNhcmd0eXBlIyNfc3osCQkJCVwKLQkucF9yZXBsZW4gICAgPSBOTE00XyMjcmVzdHlwZSMjX3N6LAkJCQlcCi0JLnBfc3RhdGlkeCAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfbmFtZSAgICAgID0gI3Byb2MsCQkJCQkJXAotCX0KLQotc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbmxtNF9wcm9jZWR1cmVzW10gPSB7Ci0gICAgUFJPQyhURVNULAkJdGVzdGFyZ3MsCXRlc3RyZXMpLAotICAgIFBST0MoTE9DSywJCWxvY2thcmdzLAlyZXMpLAotICAgIFBST0MoQ0FOQ0VMLAljYW5jYXJncywJcmVzKSwKLSAgICBQUk9DKFVOTE9DSywJdW5sb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKEdSQU5URUQsCXRlc3RhcmdzLAlyZXMpLAotICAgIFBST0MoVEVTVF9NU0csCXRlc3RhcmdzLAlub3JlcCksCi0gICAgUFJPQyhMT0NLX01TRywJbG9ja2FyZ3MsCW5vcmVwKSwKLSAgICBQUk9DKENBTkNFTF9NU0csCWNhbmNhcmdzLAlub3JlcCksCi0gICAgUFJPQyhVTkxPQ0tfTVNHLAl1bmxvY2thcmdzLAlub3JlcCksCi0gICAgUFJPQyhHUkFOVEVEX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKLSAgICBQUk9DKFRFU1RfUkVTLAl0ZXN0cmVzLAlub3JlcCksCi0gICAgUFJPQyhMT0NLX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoQ0FOQ0VMX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoVU5MT0NLX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoR1JBTlRFRF9SRVMsCXJlcywJCW5vcmVwKSwKLSNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCi0gICAgUFJPQyhTSEFSRSwJCXNoYXJlYXJncywJc2hhcmVyZXMpLAotICAgIFBST0MoVU5TSEFSRSwJc2hhcmVhcmdzLAlzaGFyZXJlcyksCi0gICAgUFJPQyhOTV9MT0NLLAlsb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKEZSRUVfQUxMLAlub3RpZnksCQl2b2lkKSwKLSNlbmRpZgotfTsKLQotc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uNCA9IHsKLQkubnVtYmVyCQk9IDQsCi0JLm5ycHJvY3MJPSAyNCwKLQkucHJvY3MJCT0gbmxtNF9wcm9jZWR1cmVzLAotfTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDA4NDE1YjIuLjBmMzk5ODIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtNDQ0LDE1ICs0NDQsOSBAQAogCWZsLT5mbF9maWxlLT5mX293bmVyLnNpZ251bSA9IDA7CiB9CiAKLXN0YXRpYyBpbnQgbGVhc2VfbXlsZWFzZV9jYWxsYmFjayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgc3RydWN0IGZpbGVfbG9jayAqdHJ5KQotewotCXJldHVybiBmbC0+ZmxfZmlsZSA9PSB0cnktPmZsX2ZpbGU7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgbGVhc2VfbWFuYWdlcl9vcHMgPSB7CiAJLmZsX2JyZWFrID0gbGVhc2VfYnJlYWtfY2FsbGJhY2ssCiAJLmZsX3JlbGVhc2VfcHJpdmF0ZSA9IGxlYXNlX3JlbGVhc2VfcHJpdmF0ZV9jYWxsYmFjaywKLQkuZmxfbXlsZWFzZSA9IGxlYXNlX215bGVhc2VfY2FsbGJhY2ssCiAJLmZsX2NoYW5nZSA9IGxlYXNlX21vZGlmeSwKIH07CiAKQEAgLTE0MDUsNyArMTM5OSw3IEBACiAJZm9yIChiZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CiAJCQkoKGZsID0gKmJlZm9yZSkgIT0gTlVMTCkgJiYgSVNfTEVBU0UoZmwpOwogCQkJYmVmb3JlID0gJmZsLT5mbF9uZXh0KSB7Ci0JCWlmIChsZWFzZS0+ZmxfbG1vcHMtPmZsX215bGVhc2UoZmwsIGxlYXNlKSkKKwkJaWYgKGZsLT5mbF9maWxlID09IGZpbHApCiAJCQlteV9iZWZvcmUgPSBiZWZvcmU7CiAJCWVsc2UgaWYgKGZsLT5mbF90eXBlID09IChGX0lOUFJPR1JFU1MgfCBGX1VOTENLKSkKIAkJCS8qCmRpZmYgLS1naXQgYS9mcy9sb2dmcy9kZXZfYmRldi5jIGIvZnMvbG9nZnMvZGV2X2JkZXYuYwppbmRleCA5MmNhNmZiLi43MjNiYzViIDEwMDY0NAotLS0gYS9mcy9sb2dmcy9kZXZfYmRldi5jCisrKyBiL2ZzL2xvZ2ZzL2Rldl9iZGV2LmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCiBzdGF0aWMgdm9pZCBiZGV2X3B1dF9kZXZpY2Uoc3RydWN0IGxvZ2ZzX3N1cGVyICpzKQogewotCWNsb3NlX2JkZXZfZXhjbHVzaXZlKHMtPnNfYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJYmxrZGV2X3B1dChzLT5zX2JkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCk7CiB9CiAKIHN0YXRpYyBpbnQgYmRldl9jYW5fd3JpdGVfYnVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU2NCBvZnMpCkBAIC0zMjUsMTMgKzMyNSwxNCBAQAogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAKLQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShkZXZuYW1lLCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFLCB0eXBlKTsKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKGRldm5hbWUsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCwKKwkJCQkgIHR5cGUpOwogCWlmIChJU19FUlIoYmRldikpCiAJCXJldHVybiBQVFJfRVJSKGJkZXYpOwogCiAJaWYgKE1BSk9SKGJkZXYtPmJkX2RldikgPT0gTVREX0JMT0NLX01BSk9SKSB7CiAJCWludCBtdGRuciA9IE1JTk9SKGJkZXYtPmJkX2Rldik7Ci0JCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCQlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEV8Rk1PREVfRVhDTCk7CiAJCXJldHVybiBsb2dmc19nZXRfc2JfbXRkKHAsIG10ZG5yKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwppbmRleCA5MzQ0NDc0Li5hMjU0NDRhYiAxMDA2NDQKLS0tIGEvZnMvbWJjYWNoZS5jCisrKyBiL2ZzL21iY2FjaGUuYwpAQCAtNzYsMTggKzc2LDYgQEAKIEVYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KTsKICNlbmRpZgogCi1zdHJ1Y3QgbWJfY2FjaGUgewotCXN0cnVjdCBsaXN0X2hlYWQJCWNfY2FjaGVfbGlzdDsKLQljb25zdCBjaGFyCQkJKmNfbmFtZTsKLQlhdG9taWNfdAkJCWNfZW50cnlfY291bnQ7Ci0JaW50CQkJCWNfbWF4X2VudHJpZXM7Ci0JaW50CQkJCWNfYnVja2V0X2JpdHM7Ci0Jc3RydWN0IGttZW1fY2FjaGUJCSpjX2VudHJ5X2NhY2hlOwotCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2Jsb2NrX2hhc2g7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJKmNfaW5kZXhfaGFzaDsKLX07Ci0KLQogLyoKICAqIEdsb2JhbCBkYXRhOiBsaXN0IG9mIGFsbCBtYmNhY2hlJ3MsIGxydSBsaXN0LCBhbmQgYSBzcGlubG9jayBmb3IKICAqIGFjY2Vzc2luZyBjYWNoZSBkYXRhIHN0cnVjdHVyZXMgb24gU01QIG1hY2hpbmVzLiBUaGUgbHJ1IGxpc3QgaXMKZGlmZiAtLWdpdCBhL2ZzL21pbml4L25hbWVpLmMgYi9mcy9taW5peC9uYW1laS5jCmluZGV4IDFiOWUwNzcuLmNlNzMzN2QgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L25hbWVpLmMKKysrIGIvZnMvbWluaXgvbmFtZWkuYwpAQCAtMjMsOCArMjMsNiBAQAogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKIAlpbm9fdCBpbm87CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3ApOwotCiAJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IG1pbml4X3NiKGRpci0+aV9zYiktPnNfbmFtZWxlbikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKZGlmZiAtLWdpdCBhL2ZzL21wYWdlLmMgYi9mcy9tcGFnZS5jCmluZGV4IGZkNTZjYTIuLmQ3ODQ1NWEgMTAwNjQ0Ci0tLSBhL2ZzL21wYWdlLmMKKysrIGIvZnMvbXBhZ2UuYwpAQCAtNDAsNyArNDAsNyBAQAogICogc3RhdHVzIG9mIHRoYXQgcGFnZSBpcyBoYXJkLiAgU2VlIGVuZF9idWZmZXJfYXN5bmNfcmVhZCgpIGZvciB0aGUgZGV0YWlscy4KICAqIFRoZXJlIGlzIG5vIHBvaW50IGluIGR1cGxpY2F0aW5nIGFsbCB0aGF0IGNvbXBsZXhpdHkuCiAgKi8KLXN0YXRpYyB2b2lkIG1wYWdlX2VuZF9pb19yZWFkKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3N0YXRpYyB2b2lkIG1wYWdlX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCiB7CiAJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CiAJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CkBAIC01MCw0NCArNTAsMjkgQEAKIAogCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQogCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7Ci0KLQkJaWYgKHVwdG9kYXRlKSB7Ci0JCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpIHsKKwkJCWlmICh1cHRvZGF0ZSkgeworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0gZWxzZSB7IC8qIGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFICovCisJCQlpZiAoIXVwdG9kYXRlKSB7CisJCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJCWlmIChwYWdlLT5tYXBwaW5nKQorCQkJCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJCX0KKwkJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJfQotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKLQliaW9fcHV0KGJpbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYWdlX2VuZF9pb193cml0ZShzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCi17Ci0JY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7Ci0KLQlkbyB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKLQotCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQotCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7Ci0KLQkJaWYgKCF1cHRvZGF0ZSl7Ci0JCQlTZXRQYWdlRXJyb3IocGFnZSk7Ci0JCQlpZiAocGFnZS0+bWFwcGluZykKLQkJCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKLQkJfQotCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CiAJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CiAJYmlvX3B1dChiaW8pOwogfQogCiBzdGF0aWMgc3RydWN0IGJpbyAqbXBhZ2VfYmlvX3N1Ym1pdChpbnQgcncsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQliaW8tPmJpX2VuZF9pbyA9IG1wYWdlX2VuZF9pb19yZWFkOwotCWlmIChydyA9PSBXUklURSkKLQkJYmlvLT5iaV9lbmRfaW8gPSBtcGFnZV9lbmRfaW9fd3JpdGU7CisJYmlvLT5iaV9lbmRfaW8gPSBtcGFnZV9lbmRfaW87CiAJc3VibWl0X2JpbyhydywgYmlvKTsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDE5NDMzY2QuLjhkZjdhNzggMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKiBAaW5vZGU6CWlub2RlIHRvIGNoZWNrIGFjY2VzcyByaWdodHMgZm9yCiAgKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQykKICAqIEBjaGVja19hY2w6CW9wdGlvbmFsIGNhbGxiYWNrIHRvIGNoZWNrIGZvciBQb3NpeCBBQ0xzCi0gKiBAZmxhZ3MJSVBFUk1fRkxBR18gZmxhZ3MuCisgKiBAZmxhZ3M6CUlQRVJNX0ZMQUdfIGZsYWdzLgogICoKICAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCiAgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCkBAIC00MDcsNyArNDA3LDcgQEAKIC8qKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1IC0gZHJvcCB0aGlzIG5hbWVpZGF0YSBvdXQgb2YgcmN1LXdhbGsKICAqIEBuZDogbmFtZWlkYXRhIHBhdGh3YWxrIGRhdGEgdG8gZHJvcAotICogQFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSExJRCBvbiBmYWlsdXJlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FQ0hJTEQgb24gZmFpbHVyZQogICoKICAqIFBhdGggd2Fsa2luZyBoYXMgMiBtb2RlcywgcmN1LXdhbGsgYW5kIHJlZi13YWxrIChzZWUKICAqIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcGF0aC1sb29rdXAudHh0KS4gX19kcm9wX3JjdSogZnVuY3Rpb25zIGF0dGVtcHQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSAtIGRyb3AgbmFtZWlkYXRhIGFuZCBkZW50cnkgb3V0IG9mIHJjdS13YWxrCiAgKiBAbmQ6IG5hbWVpZGF0YSBwYXRod2FsayBkYXRhIHRvIGRyb3AKICAqIEBkZW50cnk6IGRlbnRyeSB0byBkcm9wCi0gKiBAUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUNITElEIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSElMRCBvbiBmYWlsdXJlCiAgKgogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSBhdHRlbXB0cyB0byBkcm9wIHRoZSBjdXJyZW50IG5kLT5wYXRoIGFuZCBuZC0+cm9vdCwKICAqIGFuZCBkZW50cnkgaW50byByZWYtd2Fsay4gQGRlbnRyeSBtdXN0IGJlIGEgcGF0aCBmb3VuZCBieSBhIGRvX2xvb2t1cCBjYWxsIG9uCkBAIC00NzksNiArNDc5LDE0IEBACiAJc3RydWN0IGZzX3N0cnVjdCAqZnMgPSBjdXJyZW50LT5mczsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBuZC0+cGF0aC5kZW50cnk7CiAKKwkvKgorCSAqIEl0IGNhbiBiZSBwb3NzaWJsZSB0byByZXZhbGlkYXRlIHRoZSBkZW50cnkgdGhhdCB3ZSBzdGFydGVkCisJICogdGhlIHBhdGggd2FsayB3aXRoLiBmb3JjZV9yZXZhbF9wYXRoIG1heSBhbHNvIHJldmFsaWRhdGUgdGhlCisJICogZGVudHJ5IGFscmVhZHkgY29tbWl0dGVkIHRvIHRoZSBuYW1laWRhdGEuCisJICovCisJaWYgKHVubGlrZWx5KHBhcmVudCA9PSBkZW50cnkpKQorCQlyZXR1cm4gbmFtZWlkYXRhX2Ryb3BfcmN1KG5kKTsKKwogCUJVR19PTighKG5kLT5mbGFncyAmIExPT0tVUF9SQ1UpKTsKIAlpZiAobmQtPnJvb3QubW50KSB7CiAJCXNwaW5fbG9jaygmZnMtPmxvY2spOwpAQCAtNTMwLDcgKzUzOCw3IEBACiAvKioKICAqIG5hbWVpZGF0YV9kcm9wX3JjdV9sYXN0IC0gZHJvcCBuYW1laWRhdGEgZW5kaW5nIHBhdGggd2FsayBvdXQgb2YgcmN1LXdhbGsKICAqIEBuZDogbmFtZWlkYXRhIHBhdGh3YWxrIGRhdGEgdG8gZHJvcAotICogQFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSExJRCBvbiBmYWlsdXJlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FQ0hJTEQgb24gZmFpbHVyZQogICoKICAqIG5hbWVpZGF0YV9kcm9wX3JjdV9sYXN0IGF0dGVtcHRzIHRvIGRyb3AgdGhlIGN1cnJlbnQgbmQtPnBhdGggaW50byByZWYtd2Fsay4KICAqIG5kLT5wYXRoIHNob3VsZCBiZSB0aGUgZmluYWwgZWxlbWVudCBvZiB0aGUgbG9va3VwLCBzbyBuZC0+cm9vdCBpcyBkaXNjYXJkZWQuCkBAIC01ODMsNiArNTkxLDEzIEBACiAJCWZwdXQobmQtPmludGVudC5vcGVuLmZpbGUpOwogfQogCisvKgorICogQ2FsbCBkX3JldmFsaWRhdGUgYW5kIGhhbmRsZSBmaWxlc3lzdGVtcyB0aGF0IHJlcXVlc3QgcmN1LXdhbGsKKyAqIHRvIGJlIGRyb3BwZWQuIFRoaXMgbWF5IGJlIGNhbGxlZCBhbmQgcmV0dXJuIGluIHJjdS13YWxrIG1vZGUsCisgKiByZWdhcmRsZXNzIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IuIElmIC1FQ0hJTEQgaXMgcmV0dXJuZWQsIHRoZSBjYWxsZXIKKyAqIG11c3QgcmV0dXJuIC1FQ0hJTEQgYmFjayB1cCB0aGUgcGF0aCB3YWxrIHN0YWNrIHNvIHBhdGggd2FsayBtYXkKKyAqIGJlIHJlc3RhcnRlZCBpbiByZWYtd2FsayBtb2RlLgorICovCiBzdGF0aWMgaW50IGRfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWludCBzdGF0dXM7CkBAIC02NzMsNiArNjg4LDkgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIXN0YXR1cykgeworCQkvKiBEb24ndCBkX2ludmFsaWRhdGUgaW4gcmN1LXdhbGsgbW9kZSAqLworCQlpZiAobmFtZWlkYXRhX2Ryb3BfcmN1KG5kKSkKKwkJCXJldHVybiAtRUNISUxEOwogCQlkX2ludmFsaWRhdGUoZGVudHJ5KTsKIAkJc3RhdHVzID0gLUVTVEFMRTsKIAl9CkBAIC03NjEsNyArNzc5LDggQEAKIAkJbW50cHV0KHBhdGgtPm1udCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXRoX3RvX25hbWVpZGF0YShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW5saW5lIHZvaWQgcGF0aF90b19uYW1laWRhdGEoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCisJCQkJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWlmICghKG5kLT5mbGFncyAmIExPT0tVUF9SQ1UpKSB7CiAJCWRwdXQobmQtPnBhdGguZGVudHJ5KTsKQEAgLTc3MywyMCArNzkyLDIwIEBACiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50Ci1fX2RvX2ZvbGxvd19saW5rKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdm9pZCAqKnApCitfX2RvX2ZvbGxvd19saW5rKGNvbnN0IHN0cnVjdCBwYXRoICpsaW5rLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgdm9pZCAqKnApCiB7CiAJaW50IGVycm9yOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHBhdGgtPmRlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaW5rLT5kZW50cnk7CiAKLQl0b3VjaF9hdGltZShwYXRoLT5tbnQsIGRlbnRyeSk7CisJdG91Y2hfYXRpbWUobGluay0+bW50LCBkZW50cnkpOwogCW5kX3NldF9saW5rKG5kLCBOVUxMKTsKIAotCWlmIChwYXRoLT5tbnQgIT0gbmQtPnBhdGgubW50KSB7Ci0JCXBhdGhfdG9fbmFtZWlkYXRhKHBhdGgsIG5kKTsKKwlpZiAobGluay0+bW50ICE9IG5kLT5wYXRoLm1udCkgeworCQlwYXRoX3RvX25hbWVpZGF0YShsaW5rLCBuZCk7CiAJCW5kLT5pbm9kZSA9IG5kLT5wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAkJZGdldChkZW50cnkpOwogCX0KLQltbnRnZXQocGF0aC0+bW50KTsKKwltbnRnZXQobGluay0+bW50KTsKIAogCW5kLT5sYXN0X3R5cGUgPSBMQVNUX0JJTkQ7CiAJKnAgPSBkZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKGRlbnRyeSwgbmQpOwpAQCAtMTk1MCw4ICsxOTY5LDkgQEAKIAlyZXR1cm4gYnJlYWtfbGVhc2UoaW5vZGUsIGZsYWcpOwogfQogCi1zdGF0aWMgaW50IGhhbmRsZV90cnVuY2F0ZShzdHJ1Y3QgcGF0aCAqcGF0aCkKK3N0YXRpYyBpbnQgaGFuZGxlX3RydW5jYXRlKHN0cnVjdCBmaWxlICpmaWxwKQogeworCXN0cnVjdCBwYXRoICpwYXRoID0gJmZpbHAtPmZfcGF0aDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCWludCBlcnJvciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOwogCWlmIChlcnJvcikKQEAgLTE5NjUsNyArMTk4NSw3IEBACiAJaWYgKCFlcnJvcikgewogCQllcnJvciA9IGRvX3RydW5jYXRlKHBhdGgtPmRlbnRyeSwgMCwKIAkJCQkgICAgQVRUUl9NVElNRXxBVFRSX0NUSU1FfEFUVFJfT1BFTiwKLQkJCQkgICAgTlVMTCk7CisJCQkJICAgIGZpbHApOwogCX0KIAlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0yMDYzLDcgKzIwODMsNyBAQAogCX0KIAlpZiAoIUlTX0VSUihmaWxwKSkgewogCQlpZiAod2lsbF90cnVuY2F0ZSkgewotCQkJZXJyb3IgPSBoYW5kbGVfdHJ1bmNhdGUoJm5kLT5wYXRoKTsKKwkJCWVycm9yID0gaGFuZGxlX3RydW5jYXRlKGZpbHApOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJZnB1dChmaWxwKTsKIAkJCQlmaWxwID0gRVJSX1BUUihlcnJvcik7CkBAIC0yMTA0LDExICsyMTI0LDEzIEBACiAJCWRpciA9IG5kLT5wYXRoLmRlbnRyeTsKIAljYXNlIExBU1RfRE9UOgogCQlpZiAobmVlZF9yZXZhbF9kb3QoZGlyKSkgewotCQkJZXJyb3IgPSBkX3JldmFsaWRhdGUobmQtPnBhdGguZGVudHJ5LCBuZCk7Ci0JCQlpZiAoIWVycm9yKQotCQkJCWVycm9yID0gLUVTVEFMRTsKLQkJCWlmIChlcnJvciA8IDApCisJCQlpbnQgc3RhdHVzID0gZF9yZXZhbGlkYXRlKG5kLT5wYXRoLmRlbnRyeSwgbmQpOworCQkJaWYgKCFzdGF0dXMpCisJCQkJc3RhdHVzID0gLUVTVEFMRTsKKwkJCWlmIChzdGF0dXMgPCAwKSB7CisJCQkJZXJyb3IgPSBzdGF0dXM7CiAJCQkJZ290byBleGl0OworCQkJfQogCQl9CiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBMQVNUX1JPT1Q6CkBAIC0yMzI3LDExICsyMzQ5LDEyIEBACiAJbmQuZmxhZ3MgPSBmbGFnczsKIAlmaWxwID0gZG9fbGFzdCgmbmQsICZwYXRoLCBvcGVuX2ZsYWcsIGFjY19tb2RlLCBtb2RlLCBwYXRobmFtZSk7CiAJd2hpbGUgKHVubGlrZWx5KCFmaWxwKSkgeyAvKiB0cmFpbGluZyBzeW1saW5rICovCi0JCXN0cnVjdCBwYXRoIGhvbGRlcjsKKwkJc3RydWN0IHBhdGggbGluayA9IHBhdGg7CisJCXN0cnVjdCBpbm9kZSAqbGlua2kgPSBsaW5rLmRlbnRyeS0+ZF9pbm9kZTsKIAkJdm9pZCAqY29va2llOwogCQllcnJvciA9IC1FTE9PUDsKIAkJLyogU19JU0RJUiBwYXJ0IGlzIGEgdGVtcG9yYXJ5IGF1dG9tb3VudCBrbHVkZ2UgKi8KLQkJaWYgKCEobmQuZmxhZ3MgJiBMT09LVVBfRk9MTE9XKSAmJiAhU19JU0RJUihuZC5pbm9kZS0+aV9tb2RlKSkKKwkJaWYgKCEobmQuZmxhZ3MgJiBMT09LVVBfRk9MTE9XKSAmJiAhU19JU0RJUihsaW5raS0+aV9tb2RlKSkKIAkJCWdvdG8gZXhpdF9kcHV0OwogCQlpZiAoY291bnQrKyA9PSAzMikKIAkJCWdvdG8gZXhpdF9kcHV0OwpAQCAtMjM0NywyMyArMjM3MCwyMiBAQAogCQkgKiBqdXN0IHNldCBMQVNUX0JJTkQuCiAJCSAqLwogCQluZC5mbGFncyB8PSBMT09LVVBfUEFSRU5UOwotCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2ZvbGxvd19saW5rKHBhdGguZGVudHJ5LCAmbmQpOworCQllcnJvciA9IHNlY3VyaXR5X2lub2RlX2ZvbGxvd19saW5rKGxpbmsuZGVudHJ5LCAmbmQpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGV4aXRfZHB1dDsKLQkJZXJyb3IgPSBfX2RvX2ZvbGxvd19saW5rKCZwYXRoLCAmbmQsICZjb29raWUpOworCQllcnJvciA9IF9fZG9fZm9sbG93X2xpbmsoJmxpbmssICZuZCwgJmNvb2tpZSk7CiAJCWlmICh1bmxpa2VseShlcnJvcikpIHsKLQkJCWlmICghSVNfRVJSKGNvb2tpZSkgJiYgbmQuaW5vZGUtPmlfb3AtPnB1dF9saW5rKQotCQkJCW5kLmlub2RlLT5pX29wLT5wdXRfbGluayhwYXRoLmRlbnRyeSwgJm5kLCBjb29raWUpOworCQkJaWYgKCFJU19FUlIoY29va2llKSAmJiBsaW5raS0+aV9vcC0+cHV0X2xpbmspCisJCQkJbGlua2ktPmlfb3AtPnB1dF9saW5rKGxpbmsuZGVudHJ5LCAmbmQsIGNvb2tpZSk7CiAJCQkvKiBuZC5wYXRoIGhhZCBiZWVuIGRyb3BwZWQgKi8KLQkJCW5kLnBhdGggPSBwYXRoOworCQkJbmQucGF0aCA9IGxpbms7CiAJCQlnb3RvIG91dF9wYXRoOwogCQl9Ci0JCWhvbGRlciA9IHBhdGg7CiAJCW5kLmZsYWdzICY9IH5MT09LVVBfUEFSRU5UOwogCQlmaWxwID0gZG9fbGFzdCgmbmQsICZwYXRoLCBvcGVuX2ZsYWcsIGFjY19tb2RlLCBtb2RlLCBwYXRobmFtZSk7Ci0JCWlmIChuZC5pbm9kZS0+aV9vcC0+cHV0X2xpbmspCi0JCQluZC5pbm9kZS0+aV9vcC0+cHV0X2xpbmsoaG9sZGVyLmRlbnRyeSwgJm5kLCBjb29raWUpOwotCQlwYXRoX3B1dCgmaG9sZGVyKTsKKwkJaWYgKGxpbmtpLT5pX29wLT5wdXRfbGluaykKKwkJCWxpbmtpLT5pX29wLT5wdXRfbGluayhsaW5rLmRlbnRyeSwgJm5kLCBjb29raWUpOworCQlwYXRoX3B1dCgmbGluayk7CiAJfQogb3V0OgogCWlmIChuZC5yb290Lm1udCkKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2Rpci5jIGIvZnMvbmNwZnMvZGlyLmMKaW5kZXggMjhmMTM2ZC4uZjY5NDZiYiAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZGlyLmMKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTIxLDkgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgotCi0jaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgorI2luY2x1ZGUgIm5jcF9mcy5oIgogCiBzdGF0aWMgdm9pZCBuY3BfcmVhZF92b2x1bWVfbGlzdChzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCwKIAkJCQlzdHJ1Y3QgbmNwX2NhY2hlX2NvbnRyb2wgKik7CkBAIC04Miw3ICs4MCw3IEBACiAJCXVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqKTsKIHN0YXRpYyBpbnQgbmNwX2RlbGV0ZV9kZW50cnkoY29uc3Qgc3RydWN0IGRlbnRyeSAqKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3BfZGVudHJ5X29wZXJhdGlvbnMgPQorY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5jcF9kZW50cnlfb3BlcmF0aW9ucyA9CiB7CiAJLmRfcmV2YWxpZGF0ZQk9IG5jcF9sb29rdXBfdmFsaWRhdGUsCiAJLmRfaGFzaAkJPSBuY3BfaGFzaF9kZW50cnksCkBAIC05MCwxNCArODgsNiBAQAogCS5kX2RlbGV0ZQk9IG5jcF9kZWxldGVfZGVudHJ5LAogfTsKIAotY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5jcF9yb290X2RlbnRyeV9vcGVyYXRpb25zID0KLXsKLQkuZF9oYXNoCQk9IG5jcF9oYXNoX2RlbnRyeSwKLQkuZF9jb21wYXJlCT0gbmNwX2NvbXBhcmVfZGVudHJ5LAotCS5kX2RlbGV0ZQk9IG5jcF9kZWxldGVfZGVudHJ5LAotfTsKLQotCiAjZGVmaW5lIG5jcF9uYW1lc3BhY2UoaSkJKE5DUF9TRVJWRVIoaSktPm5hbWVfc3BhY2VbTkNQX0ZJTkZPKGkpLT52b2xOdW1iZXJdKQogCiBzdGF0aWMgaW5saW5lIGludCBuY3BfcHJlc2VydmVfZW50cnlfY2FzZShzdHJ1Y3QgaW5vZGUgKmksIF9fdTMyIG5zY3JlYXRvcikKQEAgLTMwOSw2ICsyOTksOSBAQAogCWludCByZXMsIHZhbCA9IDAsIGxlbjsKIAlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOwogCisJaWYgKGRlbnRyeSA9PSBkZW50cnktPmRfc2ItPnNfcm9vdCkKKwkJcmV0dXJuIDE7CisKIAlpZiAobmQtPmZsYWdzICYgTE9PS1VQX1JDVSkKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKQEAgLTYzNyw3ICs2MzAsNiBAQAogCQllbnRyeS0+aW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDIpOwogCQlpbm9kZSA9IG5jcF9pZ2V0KGRpci0+aV9zYiwgZW50cnkpOwogCQlpZiAoaW5vZGUpIHsKLQkJCWRfc2V0X2Rfb3AobmV3ZGVudCwgJm5jcF9kZW50cnlfb3BlcmF0aW9ucyk7CiAJCQlkX2luc3RhbnRpYXRlKG5ld2RlbnQsIGlub2RlKTsKIAkJCWlmICghaGFzaGVkKQogCQkJCWRfcmVoYXNoKG5ld2RlbnQpOwpAQCAtODkzLDcgKzg4NSw2IEBACiAJaWYgKGlub2RlKSB7CiAJCW5jcF9uZXdfZGVudHJ5KGRlbnRyeSk7CiBhZGRfZW50cnk6Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmbmNwX2RlbnRyeV9vcGVyYXRpb25zKTsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJCWVycm9yID0gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggY2I1MGFhZi4uMGVkNjVlMCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtMTgsOCArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+Ci0jaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgorI2luY2x1ZGUgIm5jcF9mcy5oIgogCiBzdGF0aWMgaW50IG5jcF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGRhdGFzeW5jKQogewpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW5vZGUuYyBiL2ZzL25jcGZzL2lub2RlLmMKaW5kZXggOWIzOWE1ZC4uMDBhMWQxYyAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW5vZGUuYworKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC0zMSwxMSArMzEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgotCiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAotI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKyNpbmNsdWRlICJuY3BfZnMuaCIKICNpbmNsdWRlICJnZXRvcHQuaCIKIAogI2RlZmluZSBOQ1BfREVGQVVMVF9GSUxFX01PREUgMDYwMApAQCAtNTQ0LDYgKzU0Miw3IEBACiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKIAlzYi0+c19tYWdpYyA9IE5DUF9TVVBFUl9NQUdJQzsKIAlzYi0+c19vcCA9ICZuY3Bfc29wczsKKwlzYi0+c19kX29wID0gJm5jcF9kZW50cnlfb3BlcmF0aW9uczsKIAlzYi0+c19iZGkgPSAmc2VydmVyLT5iZGk7CiAKIAlzZXJ2ZXIgPSBOQ1BfU0JQKHNiKTsKQEAgLTcyMyw3ICs3MjIsNiBAQAogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CiAgICAgICAgIGlmICghc2ItPnNfcm9vdCkKIAkJZ290byBvdXRfbm9fcm9vdDsKLQlkX3NldF9kX29wKHNiLT5zX3Jvb3QsICZuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9ucyk7CiAJcmV0dXJuIDA7CiAKIG91dF9ub19yb290OgpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKaW5kZXggZDQwYTU0Ny4uNzkwZTkyYSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW9jdGwuYworKysgYi9mcy9uY3Bmcy9pb2N0bC5jCkBAIC0yMCwxMSArMjAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+Ci0KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgorI2luY2x1ZGUgIm5jcF9mcy5oIgogCiAvKiBtYXhpbXVtIGxpbWl0IGZvciBuY3Bfb2JqZWN0bmFtZV9pb2N0bCAqLwogI2RlZmluZSBOQ1BfT0JKRUNUX05BTUVfTUFYX0xFTgk0MDk2CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9tbWFwLmMgYi9mcy9uY3Bmcy9tbWFwLmMKaW5kZXggNTZmNWIzYS4uYTdjMDdiNCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvbW1hcC5jCisrKyBiL2ZzL25jcGZzL21tYXAuYwpAQCAtMTYsMTIgKzE2LDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+CiAKLSNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKKyNpbmNsdWRlICJuY3BfZnMuaCIKKwogLyoKICAqIEZpbGwgaW4gdGhlIHN1cHBsaWVkIHBhZ2UgZm9yIG1tYXAKICAqIFhYWDogaG93IGFyZSB3ZSBleGNsdWRpbmcgdHJ1bmNhdGUvaW52YWxpZGF0ZSBoZXJlPyBNYXliZSBuZWVkIHRvIGxvY2sKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcF9mcy5oIGIvZnMvbmNwZnMvbmNwX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4MzFhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25jcGZzL25jcF9mcy5oCkBAIC0wLDAgKzEsOTggQEAKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKyNpbmNsdWRlICJuY3BfZnNfaS5oIgorI2luY2x1ZGUgIm5jcF9mc19zYi5oIgorCisvKiBkZWZpbmUgYmVjYXVzZSBpdCBpcyBlYXN5IHRvIGNoYW5nZSBQUklOVEsgdG8geyp9UFJJTlRLICovCisjZGVmaW5lIFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZvcm1hdCAsICMjIGFyZ3MpCisKKyN1bmRlZiBOQ1BGU19QQVJBTk9JQQorI2lmZGVmIE5DUEZTX1BBUkFOT0lBCisjZGVmaW5lIFBQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBQUklOVEsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZm5kZWYgREVCVUdfTkNQCisjZGVmaW5lIERFQlVHX05DUCAwCisjZW5kaWYKKyNpZiBERUJVR19OQ1AgPiAwCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBQUklOVEsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisjaWYgREVCVUdfTkNQID4gMQorI2RlZmluZSBERFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFBSSU5USyhmb3JtYXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgTkNQX01BWF9SUENfVElNRU9VVCAoNipIWikKKworCitzdHJ1Y3QgbmNwX2VudHJ5X2luZm8geworCXN0cnVjdCBud19pbmZvX3N0cnVjdAlpOworCWlub190CQkJaW5vOworCWludAkJCW9wZW5lZDsKKwlpbnQJCQlhY2Nlc3M7CisJdW5zaWduZWQgaW50CQl2b2x1bWU7CisJX191OAkJCWZpbGVfaGFuZGxlWzZdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmNwX3NlcnZlciAqTkNQX1NCUChjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisjZGVmaW5lIE5DUF9TRVJWRVIoaW5vZGUpCU5DUF9TQlAoKGlub2RlKS0+aV9zYikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5jcF9pbm9kZV9pbmZvICpOQ1BfRklORk8oY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgbmNwX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKKy8qIGxpbnV4L2ZzL25jcGZzL2lub2RlLmMgKi8KK2ludCBuY3Bfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKK3N0cnVjdCBpbm9kZSAqbmNwX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqKTsKK3ZvaWQgbmNwX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICopOwordm9pZCBuY3BfdXBkYXRlX2lub2RlMihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICopOworCisvKiBsaW51eC9mcy9uY3Bmcy9kaXIuYyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5jcF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5jcF9kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgbmNwX2RlbnRyeV9vcGVyYXRpb25zOworaW50IG5jcF9jb25uX2xvZ2dlZF9pbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitpbnQgbmNwX2RhdGVfZG9zMnVuaXgoX19sZTE2IHRpbWUsIF9fbGUxNiBkYXRlKTsKK3ZvaWQgbmNwX2RhdGVfdW5peDJkb3MoaW50IHVuaXhfZGF0ZSwgX19sZTE2ICogdGltZSwgX19sZTE2ICogZGF0ZSk7CisKKy8qIGxpbnV4L2ZzL25jcGZzL2lvY3RsLmMgKi8KK2xvbmcgbmNwX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Citsb25nIG5jcF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworLyogbGludXgvZnMvbmNwZnMvc29jay5jICovCitpbnQgbmNwX3JlcXVlc3QyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBmdW5jdGlvbiwKKwl2b2lkKiByZXBseSwgaW50IG1heF9yZXBseV9zaXplKTsKK3N0YXRpYyBpbmxpbmUgaW50IG5jcF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBmdW5jdGlvbikgeworCXJldHVybiBuY3BfcmVxdWVzdDIoc2VydmVyLCBmdW5jdGlvbiwgc2VydmVyLT5wYWNrZXQsIHNlcnZlci0+cGFja2V0X3NpemUpOworfQoraW50IG5jcF9jb25uZWN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpOworaW50IG5jcF9kaXNjb25uZWN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpOwordm9pZCBuY3BfbG9ja19zZXJ2ZXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcik7Cit2b2lkIG5jcF91bmxvY2tfc2VydmVyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpOworCisvKiBsaW51eC9mcy9uY3Bmcy9zeW1saW5rLmMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BGU19FWFRSQVMpIHx8IGRlZmluZWQoQ09ORklHX05DUEZTX05GU19OUykKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5jcF9zeW1saW5rX2FvcHM7CitpbnQgbmNwX3N5bWxpbmsoc3RydWN0IGlub2RlKiwgc3RydWN0IGRlbnRyeSosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorCisvKiBsaW51eC9mcy9uY3Bmcy9maWxlLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuY3BfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2ZpbGVfb3BlcmF0aW9uczsKK2ludCBuY3BfbWFrZV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworCisvKiBsaW51eC9mcy9uY3Bmcy9tbWFwLmMgKi8KK2ludCBuY3BfbW1hcChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CisKKy8qIGxpbnV4L2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuYyAqLworaW50IG5jcF9tYWtlX2Nsb3NlZChzdHJ1Y3QgaW5vZGUgKik7CisKKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25jcF9mc19pLmggYi9mcy9uY3Bmcy9uY3BfZnNfaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2xpbnV4L25jcF9mc19pLmgKcmVuYW1lIHRvIGZzL25jcGZzL25jcF9mc19pLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmNwX2ZzX3NiLmggYi9mcy9uY3Bmcy9uY3BfZnNfc2IuaApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2xpbnV4L25jcF9mc19zYi5oCnJlbmFtZSB0byBmcy9uY3Bmcy9uY3BfZnNfc2IuaAppbmRleCBkNjRiMGU4Li40YWY4MDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25jcF9mc19zYi5oCisrKyBiL2ZzL25jcGZzL25jcF9mc19zYi5oCkBAIC0xMywxNSArMTMsMzAgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBOQ1BfREVGQVVMVF9PUFRJT05TIDAJCS8qIDIgZm9yIHBhY2tldCBzaWduYXR1cmVzICovCiAKIHN0cnVjdCBzb2NrOwogCitzdHJ1Y3QgbmNwX21vdW50X2RhdGFfa2VybmVsIHsKKwl1bnNpZ25lZCBsb25nICAgIGZsYWdzOwkJLyogTkNQX01PVU5UXyogZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJIGludF9mbGFnczsJLyogaW50ZXJuYWwgZmxhZ3MgKi8KKyNkZWZpbmUgTkNQX0lNT1VOVF9MT0dHRURJTl9QT1NTSUJMRQkweDAwMDEKKwlfX2tlcm5lbF91aWQzMl90IG1vdW50ZWRfdWlkOwkvKiBXaG8gbWF5IHVtb3VudCgpIHRoaXMgZmlsZXN5c3RlbT8gKi8KKwlzdHJ1Y3QgcGlkICAgICAgKndkb2dfcGlkOwkvKiBXaG8gY2FyZXMgZm9yIG91ciB3YXRjaGRvZyBwYWNrZXRzPyAqLworCXVuc2lnbmVkIGludCAgICAgbmNwX2ZkOwkvKiBUaGUgc29ja2V0IHRvIHRoZSBuY3AgcG9ydCAqLworCXVuc2lnbmVkIGludCAgICAgdGltZV9vdXQ7CS8qIEhvdyBsb25nIHNob3VsZCBJIHdhaXQgYWZ0ZXIKKwkJCQkJICAgc2VuZGluZyBhIE5DUCByZXF1ZXN0PyAqLworCXVuc2lnbmVkIGludCAgICAgcmV0cnlfY291bnQ7CS8qIEFuZCBob3cgb2Z0ZW4gc2hvdWxkIEkgcmV0cnk/ICovCisJdW5zaWduZWQgY2hhcgkgbW91bnRlZF92b2xbTkNQX1ZPTE5BTUVfTEVOICsgMV07CisJX19rZXJuZWxfdWlkMzJfdCB1aWQ7CisJX19rZXJuZWxfZ2lkMzJfdCBnaWQ7CisJX19rZXJuZWxfbW9kZV90ICBmaWxlX21vZGU7CisJX19rZXJuZWxfbW9kZV90ICBkaXJfbW9kZTsKKwlpbnQJCSBpbmZvX2ZkOworfTsKKwogc3RydWN0IG5jcF9zZXJ2ZXIgewogCiAJc3RydWN0IG5jcF9tb3VudF9kYXRhX2tlcm5lbCBtOwkvKiBOZWFybHkgYWxsIG9mIHRoZSBtb3VudCBkYXRhIGlzIG9mCkBAIC0xNTgsNyArMTczLDQgQEAKIAlzZXJ2ZXItPmNvbm5fc3RhdHVzIHw9IDB4MDE7CiB9CiAKLSNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZgotIApkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jCmluZGV4IGE5NTYxNWEuLjk4MWE5NTYgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuYworKysgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMKQEAgLTExLDcgKzExLDcgQEAKIAogCiAKLSNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisjaW5jbHVkZSAibmNwX2ZzLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRfc2VydmVyX2xvY2tlZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQogewpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCmluZGV4IDEyMjBkZjcuLjA5ODgxZTYgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaAorKysgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmgKQEAgLTMyLDggKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2VuZGlmIC8qIENPTkZJR19OQ1BGU19OTFMgKi8KIAotI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgotCiAjZGVmaW5lIE5DUF9NSU5fU1lNTElOS19TSVpFCTgKICNkZWZpbmUgTkNQX01BWF9TWU1MSU5LX1NJWkUJNTEyCiAKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMgYi9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5jCmluZGV4IGQ4YjJkN2UuLjA4OTA3NTkgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMKKysrIGIvZnMvbmNwZnMvbmNwc2lnbl9rZXJuZWwuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25jcC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgIm5jcF9mcy5oIgogI2luY2x1ZGUgIm5jcHNpZ25fa2VybmVsLmgiCiAKIC8qIGkzODY6IDMyLWJpdCwgbGl0dGxlIGVuZGlhbiwgaGFuZGxlcyBtaXMtYWxpZ25tZW50ICovCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oIGIvZnMvbmNwZnMvbmNwc2lnbl9rZXJuZWwuaAppbmRleCA2NDUxYTY4Li5kOWExNDM4IDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oCisrKyBiL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmgKQEAgLTgsOCArOCw2IEBACiAjaWZuZGVmIF9OQ1BTSUdOX0tFUk5FTF9ICiAjZGVmaW5lIF9OQ1BTSUdOX0tFUk5FTF9ICiAKLSNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KLQogI2lmZGVmIENPTkZJR19OQ1BGU19QQUNLRVRfU0lHTklORwogdm9pZCBfX3NpZ25fcGFja2V0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBfX3UzMiB0b3RhbHNpemUsIHZvaWQgKnNpZ25fYnVmZik7CiBpbnQgc2lnbl92ZXJpZnlfcmVwbHkoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIF9fdTMyIHRvdGFsc2l6ZSwgY29uc3Qgdm9pZCAqc2lnbl9idWZmKTsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL3NvY2suYyBiL2ZzL25jcGZzL3NvY2suYwppbmRleCA2NjhiZDI2Li4zYTE1ODcyIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9zb2NrLmMKKysrIGIvZnMvbmNwZnMvc29jay5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorI2luY2x1ZGUgIm5jcF9mcy5oIgogCiAjaW5jbHVkZSAibmNwc2lnbl9rZXJuZWwuaCIKIApkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvc3ltbGluay5jIGIvZnMvbmNwZnMvc3ltbGluay5jCmluZGV4IGM2MzRmZDEuLjY2MWY4NjEgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL3N5bWxpbmsuYworKysgYi9mcy9uY3Bmcy9zeW1saW5rLmMKQEAgLTI1LDEzICsyNSwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgotCisjaW5jbHVkZSAibmNwX2ZzLmgiCiAKIC8qIHRoZXNlIG1hZ2ljIG51bWJlcnMgbXVzdCBhcHBlYXIgaW4gdGhlIHN5bWxpbmsgZmlsZSAtLSB0aGlzIG1ha2VzIGl0IGEgYml0CiAgICBtb3JlIHJlc2lsaWVudCBhZ2FpbnN0IHRoZSBtYWdpYyBhdHRyaWJ1dGVzIGJlaW5nIHNldCBvbiByYW5kb20gZmlsZXMuICovCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2suYyBiL2ZzL25mcy9jYWxsYmFjay5jCmluZGV4IDkzYThiM2IuLjE5OTAxNjUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5jCisrKyBiL2ZzL25mcy9jYWxsYmFjay5jCkBAIC0xNiw5ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYmNfeHBydC5oPgotI2VuZGlmCiAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAKQEAgLTEzNyw2ICsxMzUsMzMgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogLyoKKyAqICAqIENCX1NFUVVFTkNFIG9wZXJhdGlvbnMgd2lsbCBmYWlsIHVudGlsIHRoZSBjYWxsYmFjayBzZXNzaW9uaWQgaXMgc2V0LgorICogICAqLworaW50IG5mczRfc2V0X2NhbGxiYWNrX3Nlc3Npb25pZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBzdmNfc2VydiAqc2VydiA9IGNscC0+Y2xfcnBjY2xpZW50LT5jbF94cHJ0LT5iY19zZXJ2OworCXN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqYmNfc2lkOworCisJaWYgKCFzZXJ2LT5zdl9iY194cHJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9uIHN1Y2Nlc3MgZnJlZWQgaW4geHBydF9mcmVlICovCisJYmNfc2lkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfc2Vzc2lvbmlkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiY19zaWQpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShiY19zaWQtPmRhdGEsICZjbHAtPmNsX3Nlc3Npb24tPnNlc3NfaWQuZGF0YSwKKwkJTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7CisJc3Bpbl9sb2NrX2JoKCZzZXJ2LT5zdl9jYl9sb2NrKTsKKwlzZXJ2LT5zdl9iY194cHJ0LT54cHRfYmNfc2lkID0gYmNfc2lkOworCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9jYl9sb2NrKTsKKwlkcHJpbnRrKCIlcyBzZXQgeHB0X2JjX3NpZD0ldToldToldToldSBmb3Igc3ZfYmNfeHBydCAlcFxuIiwgX19mdW5jX18sCisJCSgodTMyICopYmNfc2lkLT5kYXRhKVswXSwgKCh1MzIgKiliY19zaWQtPmRhdGEpWzFdLAorCQkoKHUzMiAqKWJjX3NpZC0+ZGF0YSlbMl0sICgodTMyICopYmNfc2lkLT5kYXRhKVszXSwKKwkJc2Vydi0+c3ZfYmNfeHBydCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBUaGUgY2FsbGJhY2sgc2VydmljZSBmb3IgTkZTdjQuMSBjYWxsYmFja3MKICAqLwogc3RhdGljIGludApAQCAtMTc3LDMwICsyMDIsMzggQEAKIHN0cnVjdCBzdmNfcnFzdCAqCiBuZnM0MV9jYWxsYmFja191cChzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKLQlzdHJ1Y3Qgc3ZjX3hwcnQgKmJjX3hwcnQ7Ci0Jc3RydWN0IHN2Y19ycXN0ICpycXN0cCA9IEVSUl9QVFIoLUVOT01FTSk7CisJc3RydWN0IHN2Y19ycXN0ICpycXN0cDsKKwlpbnQgcmV0OwogCi0JZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogQ3JlYXRlIGEgc3ZjX3NvY2sgZm9yIHRoZSBzZXJ2aWNlICovCi0JYmNfeHBydCA9IHN2Y19zb2NrX2NyZWF0ZShzZXJ2LCB4cHJ0LT5wcm90KTsKLQlpZiAoIWJjX3hwcnQpCisJLyoKKwkgKiBDcmVhdGUgYW4gc3ZjX3NvY2sgZm9yIHRoZSBiYWNrIGNoYW5uZWwgc2VydmljZSB0aGF0IHNoYXJlcyB0aGUKKwkgKiBmb3JlIGNoYW5uZWwgY29ubmVjdGlvbi4KKwkgKiBSZXR1cm5zIHRoZSBpbnB1dCBwb3J0ICgwKSBhbmQgc2V0cyB0aGUgc3ZjX3NlcnYgYmNfeHBydCBvbiBzdWNjZXNzCisJICovCisJcmV0ID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ0Y3AtYmMiLCAmaW5pdF9uZXQsIFBGX0lORVQsIDAsCisJCQkgICAgICBTVkNfU09DS19BTk9OWU1PVVMpOworCWlmIChyZXQgPCAwKSB7CisJCXJxc3RwID0gRVJSX1BUUihyZXQpOwogCQlnb3RvIG91dDsKKwl9CiAKIAkvKgogCSAqIFNhdmUgdGhlIHN2Y19zZXJ2IGluIHRoZSB0cmFuc3BvcnQgc28gdGhhdCBpdCBjYW4KIAkgKiBiZSByZWZlcmVuY2VkIHdoZW4gdGhlIHNlc3Npb24gYmFja2NoYW5uZWwgaXMgaW5pdGlhbGl6ZWQKIAkgKi8KLQlzZXJ2LT5iY194cHJ0ID0gYmNfeHBydDsKIAl4cHJ0LT5iY19zZXJ2ID0gc2VydjsKIAogCUlOSVRfTElTVF9IRUFEKCZzZXJ2LT5zdl9jYl9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmc2Vydi0+c3ZfY2JfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2Vydi0+c3ZfY2Jfd2FpdHEpOwogCXJxc3RwID0gc3ZjX3ByZXBhcmVfdGhyZWFkKHNlcnYsICZzZXJ2LT5zdl9wb29sc1swXSk7Ci0JaWYgKElTX0VSUihycXN0cCkpCi0JCXN2Y19zb2NrX2Rlc3Ryb3koYmNfeHBydCk7CisJaWYgKElTX0VSUihycXN0cCkpIHsKKwkJc3ZjX3hwcnRfcHV0KHNlcnYtPnN2X2JjX3hwcnQpOworCQlzZXJ2LT5zdl9iY194cHJ0ID0gTlVMTDsKKwl9CiBvdXQ6Ci0JZHByaW50aygiLS0+ICVzIHJldHVybiAlcFxuIiwgX19mdW5jX18sIHJxc3RwKTsKKwlkcHJpbnRrKCItLT4gJXMgcmV0dXJuICVsZFxuIiwgX19mdW5jX18sCisJCUlTX0VSUihycXN0cCkgPyBQVFJfRVJSKHJxc3RwKSA6IDApOwogCXJldHVybiBycXN0cDsKIH0KIApAQCAtMjMzLDYgKzI2NiwxMCBAQAogCQlzdHJ1Y3QgbmZzX2NhbGxiYWNrX2RhdGEgKmNiX2luZm8pCiB7CiB9CitpbnQgbmZzNF9zZXRfY2FsbGJhY2tfc2Vzc2lvbmlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKIC8qCkBAIC0zMjgsNiArMzY1LDkgQEAKIAlzdHJ1Y3QgcnBjX2NsbnQgKnIgPSBjbHAtPmNsX3JwY2NsaWVudDsKIAljaGFyICpwID0gc3ZjX2dzc19wcmluY2lwYWwocnFzdHApOwogCisJLyogTm8gUlBDX0FVVEhfR1NTIG9uIE5GU3Y0LjEgYmFjayBjaGFubmVsIHlldCAqLworCWlmIChjbHAtPmNsX21pbm9ydmVyc2lvbiAhPSAwKQorCQlyZXR1cm4gU1ZDX0RST1A7CiAJLyoKIAkgKiBJdCBtaWdodCBqdXN0IGJlIGEgbm9ybWFsIHVzZXIgcHJpbmNpcGFsLCBpbiB3aGljaCBjYXNlCiAJICogdXNlcnNwYWNlIHdvbid0IGJvdGhlciB0byB0ZWxsIHVzIHRoZSBuYW1lIGF0IGFsbC4KQEAgLTM0NSw2ICszODUsMjMgQEAKIAlyZXR1cm4gU1ZDX09LOwogfQogCisvKiBwZ19hdXRoZW50aWNhdGUgbWV0aG9kIGhlbHBlciAqLworc3RhdGljIHN0cnVjdCBuZnNfY2xpZW50ICpuZnNfY2JfZmluZF9jbGllbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgKnNlc3Npb25pZCA9IGJjX3hwcnRfc2lkKHJxc3RwKTsKKwlpbnQgaXNfY2JfY29tcG91bmQgPSBycXN0cC0+cnFfcHJvYyA9PSBDQl9DT01QT1VORCA/IDEgOiAwOworCisJZHByaW50aygiLS0+ICVzIHJxX3Byb2MgJWRcbiIsIF9fZnVuY19fLCBycXN0cC0+cnFfcHJvYyk7CisJaWYgKHN2Y19pc19iYWNrY2hhbm5lbChycXN0cCkpCisJCS8qIFNlc3Npb25pZCAodXN1YWxseSkgc2V0IGFmdGVyIENCX05VTEwgcGluZyAqLworCQlyZXR1cm4gbmZzNF9maW5kX2NsaWVudF9zZXNzaW9uaWQoc3ZjX2FkZHIocnFzdHApLCBzZXNzaW9uaWQsCisJCQkJCQkgIGlzX2NiX2NvbXBvdW5kKTsKKwllbHNlCisJCS8qIE5vIGNhbGxiYWNrIGlkZW50aWZpZXIgaW4gcGdfYXV0aGVudGljYXRlICovCisJCXJldHVybiBuZnM0X2ZpbmRfY2xpZW50X25vX2lkZW50KHN2Y19hZGRyKHJxc3RwKSk7Cit9CisKKy8qIHBnX2F1dGhlbnRpY2F0ZSBtZXRob2QgZm9yIG5mc3Y0IGNhbGxiYWNrIHRocmVhZHMuICovCiBzdGF0aWMgaW50IG5mc19jYWxsYmFja19hdXRoZW50aWNhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwpAQCAtMzUyLDcgKzQwOSw3IEBACiAJaW50IHJldCA9IFNWQ19PSzsKIAogCS8qIERvbid0IHRhbGsgdG8gc3RyYW5nZXJzICovCi0JY2xwID0gbmZzX2ZpbmRfY2xpZW50KHN2Y19hZGRyKHJxc3RwKSwgNCk7CisJY2xwID0gbmZzX2NiX2ZpbmRfY2xpZW50KHJxc3RwKTsKIAlpZiAoY2xwID09IE5VTEwpCiAJCXJldHVybiBTVkNfRFJPUDsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmggYi9mcy9uZnMvY2FsbGJhY2suaAppbmRleCA4NWE3Y2ZkLi5kM2I0NGY5IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2suaAorKysgYi9mcy9uZnMvY2FsbGJhY2suaApAQCAtMzQsMTAgKzM0LDE3IEBACiAJT1BfQ0JfSUxMRUdBTCA9IDEwMDQ0LAogfTsKIAorc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgeworCV9fYmUzMgkJCWRyY19zdGF0dXM7CisJc3RydWN0IG5mc19jbGllbnQJKmNscDsKKwlzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQJKnN2Y19zaWQ7IC8qIHY0LjEgY2FsbGJhY2sgc2VydmljZSBzZXNzaW9uaWQgKi8KK307CisKIHN0cnVjdCBjYl9jb21wb3VuZF9oZHJfYXJnIHsKIAl1bnNpZ25lZCBpbnQgdGFnbGVuOwogCWNvbnN0IGNoYXIgKnRhZzsKIAl1bnNpZ25lZCBpbnQgbWlub3J2ZXJzaW9uOworCXVuc2lnbmVkIGludCBjYl9pZGVudDsgLyogdjQuMCBjYWxsYmFjayBpZGVudGlmaWVyICovCiAJdW5zaWduZWQgbm9wczsKIH07CiAKQEAgLTEwMywxNCArMTEwLDIzIEBACiAJdWludDMyX3QJCQljc3JfdGFyZ2V0X2hpZ2hlc3RzbG90aWQ7CiB9OwogCi1leHRlcm4gdW5zaWduZWQgbmZzNF9jYWxsYmFja19zZXF1ZW5jZShzdHJ1Y3QgY2Jfc2VxdWVuY2VhcmdzICphcmdzLAotCQkJCSAgICAgICBzdHJ1Y3QgY2Jfc2VxdWVuY2VyZXMgKnJlcyk7CitleHRlcm4gX19iZTMyIG5mczRfY2FsbGJhY2tfc2VxdWVuY2Uoc3RydWN0IGNiX3NlcXVlbmNlYXJncyAqYXJncywKKwkJCQkgICAgICAgc3RydWN0IGNiX3NlcXVlbmNlcmVzICpyZXMsCisJCQkJICAgICAgIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpOwogCiBleHRlcm4gaW50IG5mczQxX3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sCiAJCQkJCSAgICAgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKTsKIAogI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19SREFUQV9ETEcJMAogI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19XREFUQV9ETEcJMQorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19ESVJfRExHICAgICAgICAgMgorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19GSUxFX0xBWU9VVCAgICAgMworI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19CTEtfTEFZT1VUICAgICAgNAorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19PQkpfTEFZT1VUX01JTiAgOAorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19PQkpfTEFZT1VUX01BWCAgOQorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19PVEhFUl9MQVlPVVRfTUlOIDEyCisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX09USEVSX0xBWU9VVF9NQVggMTUKKyNkZWZpbmUgUkNBNF9UWVBFX01BU0tfQUxMIDB4ZjMxZgogCiBzdHJ1Y3QgY2JfcmVjYWxsYW55YXJncyB7CiAJc3RydWN0IHNvY2thZGRyCSpjcmFhX2FkZHI7CkBAIC0xMTgsMjUgKzEzNCw1MiBAQAogCXVpbnQzMl90CWNyYWFfdHlwZV9tYXNrOwogfTsKIAotZXh0ZXJuIHVuc2lnbmVkIG5mczRfY2FsbGJhY2tfcmVjYWxsYW55KHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzLCB2b2lkICpkdW1teSk7CitleHRlcm4gX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsYW55KHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzLAorCQkJCQl2b2lkICpkdW1teSwKKwkJCQkJc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcyk7CiAKIHN0cnVjdCBjYl9yZWNhbGxzbG90YXJncyB7CiAJc3RydWN0IHNvY2thZGRyCSpjcnNhX2FkZHI7CiAJdWludDMyX3QJY3JzYV90YXJnZXRfbWF4X3Nsb3RzOwogfTsKLWV4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3JlY2FsbHNsb3Qoc3RydWN0IGNiX3JlY2FsbHNsb3RhcmdzICphcmdzLAotCQkJCQkgIHZvaWQgKmR1bW15KTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGxzbG90KHN0cnVjdCBjYl9yZWNhbGxzbG90YXJncyAqYXJncywKKwkJCQkJIHZvaWQgKmR1bW15LAorCQkJCQkgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcyk7CiAKK3N0cnVjdCBjYl9sYXlvdXRyZWNhbGxhcmdzIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJCSpjYmxfYWRkcjsKKwl1aW50MzJfdAkJY2JsX3JlY2FsbF90eXBlOworCXVpbnQzMl90CQljYmxfbGF5b3V0X3R5cGU7CisJdWludDMyX3QJCWNibF9sYXlvdXRjaGFuZ2VkOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBuZnNfZmgJCWNibF9maDsKKwkJCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSBjYmxfcmFuZ2U7CisJCQluZnM0X3N0YXRlaWQJCWNibF9zdGF0ZWlkOworCQl9OworCQlzdHJ1Y3QgbmZzX2ZzaWQJCWNibF9mc2lkOworCX07Cit9OworCitleHRlcm4gdW5zaWduZWQgbmZzNF9jYWxsYmFja19sYXlvdXRyZWNhbGwoCisJc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgKmFyZ3MsCisJdm9pZCAqZHVtbXksIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpOworCitleHRlcm4gdm9pZCBuZnM0X2NoZWNrX2RyYWluX2JjX2NvbXBsZXRlKHN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlcyk7CitleHRlcm4gdm9pZCBuZnM0X2NiX3Rha2Vfc2xvdChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAotZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKTsKLWV4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KTsKLQorZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLAorCQkJCSAgICBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzLAorCQkJCSAgICBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15LAorCQkJCSAgIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpOwogI2lmZGVmIENPTkZJR19ORlNfVjQKIGV4dGVybiBpbnQgbmZzX2NhbGxiYWNrX3VwKHUzMiBtaW5vcnZlcnNpb24sIHN0cnVjdCBycGNfeHBydCAqeHBydCk7CiBleHRlcm4gdm9pZCBuZnNfY2FsbGJhY2tfZG93bihpbnQgbWlub3J2ZXJzaW9uKTsKIGV4dGVybiBpbnQgbmZzNF92YWxpZGF0ZV9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uLAogCQkJCQkgICAgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKTsKK2V4dGVybiBpbnQgbmZzNF9zZXRfY2FsbGJhY2tfc2Vzc2lvbmlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8KIC8qCiAgKiBuZnM0MTogQ2FsbGJhY2tzIGFyZSBleHBlY3RlZCB0byBub3QgY2F1c2Ugc3Vic3RhbnRpYWwgbGF0ZW5jeSwKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCmluZGV4IDI5NTBmY2EuLjRiYjkxY2IgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYwpAQCAtMTIsMzAgKzEyLDMzIEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwbmZzLmgiCiAKICNpZmRlZiBORlNfREVCVUcKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19DQUxMQkFDSwogI2VuZGlmCi0gCi1fX2JlMzIgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKKworX19iZTMyIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsCisJCQkgICAgIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMsCisJCQkgICAgIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JcmVzLT5iaXRtYXBbMF0gPSByZXMtPmJpdG1hcFsxXSA9IDA7Ci0JcmVzLT5zdGF0dXMgPSBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7Ci0JY2xwID0gbmZzX2ZpbmRfY2xpZW50KGFyZ3MtPmFkZHIsIDQpOwotCWlmIChjbHAgPT0gTlVMTCkKKwlyZXMtPnN0YXR1cyA9IGh0b25sKE5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJT04pOworCWlmICghY3BzLT5jbHApIC8qIEFsd2F5cyBzZXQgZm9yIHY0LjAuIFNldCBpbiBjYl9zZXF1ZW5jZSBmb3IgdjQuMSAqLwogCQlnb3RvIG91dDsKIAotCWRwcmludGsoIk5GUzogR0VUQVRUUiBjYWxsYmFjayByZXF1ZXN0IGZyb20gJXNcbiIsCi0JCXJwY19wZWVyYWRkcjJzdHIoY2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpKTsKKwlyZXMtPmJpdG1hcFswXSA9IHJlcy0+Yml0bWFwWzFdID0gMDsKKwlyZXMtPnN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFESEFORExFKTsKIAotCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShjbHAsICZhcmdzLT5maCk7CisJZHByaW50aygiTkZTOiBHRVRBVFRSIGNhbGxiYWNrIHJlcXVlc3QgZnJvbSAlc1xuIiwKKwkJcnBjX3BlZXJhZGRyMnN0cihjcHMtPmNscC0+Y2xfcnBjY2xpZW50LCBSUENfRElTUExBWV9BRERSKSk7CisKKwlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoY3BzLT5jbHAsICZhcmdzLT5maCk7CiAJaWYgKGlub2RlID09IE5VTEwpCi0JCWdvdG8gb3V0X3B1dGNsaWVudDsKKwkJZ290byBvdXQ7CiAJbmZzaSA9IE5GU19JKGlub2RlKTsKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZGVsZWdhdGlvbiA9IHJjdV9kZXJlZmVyZW5jZShuZnNpLT5kZWxlZ2F0aW9uKTsKQEAgLTU1LDQ5ICs1OCw0MSBAQAogb3V0X2lwdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaXB1dChpbm9kZSk7Ci1vdXRfcHV0Y2xpZW50OgotCW5mc19wdXRfY2xpZW50KGNscCk7CiBvdXQ6CiAJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIG50b2hsKHJlcy0+c3RhdHVzKSk7CiAJcmV0dXJuIHJlcy0+c3RhdHVzOwogfQogCi1fX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KQorX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSwKKwkJCSAgICBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlfX2JlMzIgcmVzOwogCQotCXJlcyA9IGh0b25sKE5GUzRFUlJfQkFESEFORExFKTsKLQljbHAgPSBuZnNfZmluZF9jbGllbnQoYXJncy0+YWRkciwgNCk7Ci0JaWYgKGNscCA9PSBOVUxMKQorCXJlcyA9IGh0b25sKE5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJT04pOworCWlmICghY3BzLT5jbHApIC8qIEFsd2F5cyBzZXQgZm9yIHY0LjAuIFNldCBpbiBjYl9zZXF1ZW5jZSBmb3IgdjQuMSAqLwogCQlnb3RvIG91dDsKIAogCWRwcmludGsoIk5GUzogUkVDQUxMIGNhbGxiYWNrIHJlcXVlc3QgZnJvbSAlc1xuIiwKLQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUikpOworCQlycGNfcGVlcmFkZHIyc3RyKGNwcy0+Y2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpKTsKIAotCWRvIHsKLQkJc3RydWN0IG5mc19jbGllbnQgKnByZXYgPSBjbHA7Ci0KLQkJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKGNscCwgJmFyZ3MtPmZoKTsKLQkJaWYgKGlub2RlICE9IE5VTEwpIHsKLQkJCS8qIFNldCB1cCBhIGhlbHBlciB0aHJlYWQgdG8gYWN0dWFsbHkgcmV0dXJuIHRoZSBkZWxlZ2F0aW9uICovCi0JCQlzd2l0Y2ggKG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgJmFyZ3MtPnN0YXRlaWQpKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlyZXMgPSAwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIC1FTk9FTlQ6Ci0JCQkJCWlmIChyZXMgIT0gMCkKLQkJCQkJCXJlcyA9IGh0b25sKE5GUzRFUlJfQkFEX1NUQVRFSUQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXMgPSBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKLQkJCX0KLQkJCWlwdXQoaW5vZGUpOwotCQl9Ci0JCWNscCA9IG5mc19maW5kX2NsaWVudF9uZXh0KHByZXYpOwotCQluZnNfcHV0X2NsaWVudChwcmV2KTsKLQl9IHdoaWxlIChjbHAgIT0gTlVMTCk7CisJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURIQU5ETEUpOworCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShjcHMtPmNscCwgJmFyZ3MtPmZoKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJLyogU2V0IHVwIGEgaGVscGVyIHRocmVhZCB0byBhY3R1YWxseSByZXR1cm4gdGhlIGRlbGVnYXRpb24gKi8KKwlzd2l0Y2ggKG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgJmFyZ3MtPnN0YXRlaWQpKSB7CisJY2FzZSAwOgorCQlyZXMgPSAwOworCQlicmVhazsKKwljYXNlIC1FTk9FTlQ6CisJCWlmIChyZXMgIT0gMCkKKwkJCXJlcyA9IGh0b25sKE5GUzRFUlJfQkFEX1NUQVRFSUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXMgPSBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwl9CisJaXB1dChpbm9kZSk7CiBvdXQ6CiAJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIG50b2hsKHJlcykpOwogCXJldHVybiByZXM7CkBAIC0xMTMsNiArMTA4LDEzOSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAKK3N0YXRpYyB1MzIgaW5pdGlhdGVfZmlsZV9kcmFpbmluZyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQkJCSAgc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CisJc3RydWN0IGlub2RlICppbm87CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXUzMiBydiA9IE5GUzRFUlJfTk9NQVRDSElOR19MQVlPVVQ7CisJTElTVF9IRUFEKGZyZWVfbWVfbGlzdCk7CisKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsbywgJmNscC0+Y2xfbGF5b3V0cywgcGxoX2xheW91dHMpIHsKKwkJaWYgKG5mc19jb21wYXJlX2ZoKCZhcmdzLT5jYmxfZmgsCisJCQkJICAgJk5GU19JKGxvLT5wbGhfaW5vZGUpLT5maCkpCisJCQljb250aW51ZTsKKwkJaW5vID0gaWdyYWIobG8tPnBsaF9pbm9kZSk7CisJCWlmICghaW5vKQorCQkJY29udGludWU7CisJCWZvdW5kID0gdHJ1ZTsKKwkJLyogV2l0aG91dCB0aGlzLCBsYXlvdXQgY2FuIGJlIGZyZWVkIGFzIHNvb24KKwkJICogYXMgd2UgcmVsZWFzZSBjbF9sb2NrLgorCQkgKi8KKwkJZ2V0X2xheW91dF9oZHIobG8pOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIE5GUzRFUlJfTk9NQVRDSElOR19MQVlPVVQ7CisKKwlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKKwlpZiAodGVzdF9iaXQoTkZTX0xBWU9VVF9CVUxLX1JFQ0FMTCwgJmxvLT5wbGhfZmxhZ3MpIHx8CisJICAgIG1hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChsbywgJmZyZWVfbWVfbGlzdCwKKwkJCQkJYXJncy0+Y2JsX3JhbmdlLmlvbW9kZSkpCisJCXJ2ID0gTkZTNEVSUl9ERUxBWTsKKwllbHNlCisJCXJ2ID0gTkZTNEVSUl9OT01BVENISU5HX0xBWU9VVDsKKwlwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChsbywgJmFyZ3MtPmNibF9zdGF0ZWlkLCB0cnVlKTsKKwlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOworCXBuZnNfZnJlZV9sc2VnX2xpc3QoJmZyZWVfbWVfbGlzdCk7CisJcHV0X2xheW91dF9oZHIobG8pOworCWlwdXQoaW5vKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB1MzIgaW5pdGlhdGVfYnVsa19kcmFpbmluZyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQkJCSAgc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CisJc3RydWN0IGlub2RlICppbm87CisJdTMyIHJ2ID0gTkZTNEVSUl9OT01BVENISU5HX0xBWU9VVDsKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICp0bXA7CisJTElTVF9IRUFEKHJlY2FsbF9saXN0KTsKKwlMSVNUX0hFQUQoZnJlZV9tZV9saXN0KTsKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfcmFuZ2UgcmFuZ2UgPSB7CisJCS5pb21vZGUgPSBJT01PREVfQU5ZLAorCQkub2Zmc2V0ID0gMCwKKwkJLmxlbmd0aCA9IE5GUzRfTUFYX1VJTlQ2NCwKKwl9OworCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobG8sICZjbHAtPmNsX2xheW91dHMsIHBsaF9sYXlvdXRzKSB7CisJCWlmICgoYXJncy0+Y2JsX3JlY2FsbF90eXBlID09IFJFVFVSTl9GU0lEKSAmJgorCQkgICAgbWVtY21wKCZORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5mc2lkLAorCQkJICAgJmFyZ3MtPmNibF9mc2lkLCBzaXplb2Yoc3RydWN0IG5mc19mc2lkKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFpZ3JhYihsby0+cGxoX2lub2RlKSkKKwkJCWNvbnRpbnVlOworCQlnZXRfbGF5b3V0X2hkcihsbyk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmbG8tPnBsaF9idWxrX3JlY2FsbCkpOworCQlsaXN0X2FkZCgmbG8tPnBsaF9idWxrX3JlY2FsbCwgJnJlY2FsbF9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvLCB0bXAsCisJCQkJICZyZWNhbGxfbGlzdCwgcGxoX2J1bGtfcmVjYWxsKSB7CisJCWlubyA9IGxvLT5wbGhfaW5vZGU7CisJCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOworCQlzZXRfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKTsKKwkJaWYgKG1hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChsbywgJmZyZWVfbWVfbGlzdCwgcmFuZ2UuaW9tb2RlKSkKKwkJCXJ2ID0gTkZTNEVSUl9ERUxBWTsKKwkJbGlzdF9kZWxfaW5pdCgmbG8tPnBsaF9idWxrX3JlY2FsbCk7CisJCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJCXB1dF9sYXlvdXRfaGRyKGxvKTsKKwkJaXB1dChpbm8pOworCX0KKwlwbmZzX2ZyZWVfbHNlZ19saXN0KCZmcmVlX21lX2xpc3QpOworCXJldHVybiBydjsKK30KKworc3RhdGljIHUzMiBkb19jYWxsYmFja19sYXlvdXRyZWNhbGwoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJCQkgICAgc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgKmFyZ3MpCit7CisJdTMyIHJlcyA9IE5GUzRFUlJfREVMQVk7CisKKwlkcHJpbnRrKCIlcyBlbnRlciwgdHlwZT0laVxuIiwgX19mdW5jX18sIGFyZ3MtPmNibF9yZWNhbGxfdHlwZSk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoTkZTNENMTlRfTEFZT1VUUkVDQUxMLCAmY2xwLT5jbF9zdGF0ZSkpCisJCWdvdG8gb3V0OworCWlmIChhcmdzLT5jYmxfcmVjYWxsX3R5cGUgPT0gUkVUVVJOX0ZJTEUpCisJCXJlcyA9IGluaXRpYXRlX2ZpbGVfZHJhaW5pbmcoY2xwLCBhcmdzKTsKKwllbHNlCisJCXJlcyA9IGluaXRpYXRlX2J1bGtfZHJhaW5pbmcoY2xwLCBhcmdzKTsKKwljbGVhcl9iaXQoTkZTNENMTlRfTEFZT1VUUkVDQUxMLCAmY2xwLT5jbF9zdGF0ZSk7CitvdXQ6CisJZHByaW50aygiJXMgcmV0dXJuaW5nICVpXG4iLCBfX2Z1bmNfXywgcmVzKTsKKwlyZXR1cm4gcmVzOworCit9CisKK19fYmUzMiBuZnM0X2NhbGxiYWNrX2xheW91dHJlY2FsbChzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyAqYXJncywKKwkJCQkgIHZvaWQgKmR1bW15LCBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQoreworCXUzMiByZXM7CisKKwlkcHJpbnRrKCIlczogLS0+XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY3BzLT5jbHApCisJCXJlcyA9IGRvX2NhbGxiYWNrX2xheW91dHJlY2FsbChjcHMtPmNscCwgYXJncyk7CisJZWxzZQorCQlyZXMgPSBORlM0RVJSX09QX05PVF9JTl9TRVNTSU9OOworCisJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIHJlcyk7CisJcmV0dXJuIGNwdV90b19iZTMyKHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBuZnNfcmVjYWxsX2FsbF9sYXlvdXRzKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgYXJnczsKKworCS8qIFByZXRlbmQgd2UgZ290IGEgQ0JfTEFZT1VUUkVDQUxMKEFMTCkgKi8KKwltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5jYmxfcmVjYWxsX3R5cGUgPSBSRVRVUk5fQUxMOworCS8qIEZJWE1FIHdlIGlnbm9yZSBlcnJvcnMsIHdoYXQgc2hvdWxkIHdlIGRvPyAqLworCWRvX2NhbGxiYWNrX2xheW91dHJlY2FsbChjbHAsICZhcmdzKTsKK30KKwogaW50IG5mczQxX3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKIHsKIAlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQpAQCAtMTg1LDQyICszMTMsNiBAQAogfQogCiAvKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBoZWxkICdzdHJ1Y3QgbmZzX2NsaWVudCcgdGhhdCBtYXRjaGVzIHRoZSBzZXJ2ZXIncwotICogYWRkcmVzcywgbWFqb3IgdmVyc2lvbiBudW1iZXIsIGFuZCBzZXNzaW9uIElELiAgSXQgaXMgdGhlIGNhbGxlcidzCi0gKiByZXNwb25zaWJpbGl0eSB0byByZWxlYXNlIHRoZSByZXR1cm5lZCByZWZlcmVuY2UuCi0gKgotICogUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyBjb25uZWN0aW9ucyB3aXRoIHNlc3Npb25zLCBvciBpZiBubyBzZXNzaW9uCi0gKiBtYXRjaGVzIHRoZSBvbmUgb2YgaW50ZXJlc3QuCi0gKi8KLSBzdGF0aWMgc3RydWN0IG5mc19jbGllbnQgKmZpbmRfY2xpZW50X3dpdGhfc2Vzc2lvbigKLQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHUzMiBuZnN2ZXJzaW9uLAotCXN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqc2Vzc2lvbmlkKQotewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7Ci0KLQljbHAgPSBuZnNfZmluZF9jbGllbnQoYWRkciwgNCk7Ci0JaWYgKGNscCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWRvIHsKLQkJc3RydWN0IG5mc19jbGllbnQgKnByZXYgPSBjbHA7Ci0KLQkJaWYgKGNscC0+Y2xfc2Vzc2lvbiAhPSBOVUxMKSB7Ci0JCQlpZiAobWVtY21wKGNscC0+Y2xfc2Vzc2lvbi0+c2Vzc19pZC5kYXRhLAotCQkJCQlzZXNzaW9uaWQtPmRhdGEsCi0JCQkJCU5GUzRfTUFYX1NFU1NJT05JRF9MRU4pID09IDApIHsKLQkJCQkvKiBSZXR1cm5zIGEgaGVsZCByZWZlcmVuY2UgdG8gY2xwICovCi0JCQkJcmV0dXJuIGNscDsKLQkJCX0KLQkJfQotCQljbHAgPSBuZnNfZmluZF9jbGllbnRfbmV4dChwcmV2KTsKLQkJbmZzX3B1dF9jbGllbnQocHJldik7Ci0JfSB3aGlsZSAoY2xwICE9IE5VTEwpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCiAgKiBGb3IgZWFjaCByZWZlcnJpbmcgY2FsbCB0cmlwbGUsIGNoZWNrIHRoZSBzZXNzaW9uJ3Mgc2xvdCB0YWJsZSBmb3IKICAqIGEgbWF0Y2guICBJZiB0aGUgc2xvdCBpcyBpbiB1c2UgYW5kIHRoZSBzZXF1ZW5jZSBudW1iZXJzIG1hdGNoLCB0aGUKICAqIGNsaWVudCBpcyBzdGlsbCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgpAQCAtMjc2LDIwICszNjgsMzQgQEAKIH0KIAogX19iZTMyIG5mczRfY2FsbGJhY2tfc2VxdWVuY2Uoc3RydWN0IGNiX3NlcXVlbmNlYXJncyAqYXJncywKLQkJCQlzdHJ1Y3QgY2Jfc2VxdWVuY2VyZXMgKnJlcykKKwkJCSAgICAgIHN0cnVjdCBjYl9zZXF1ZW5jZXJlcyAqcmVzLAorCQkJICAgICAgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcykKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCWludCBpOwogCV9fYmUzMiBzdGF0dXM7CiAKKwljcHMtPmNscCA9IE5VTEw7CisKIAlzdGF0dXMgPSBodG9ubChORlM0RVJSX0JBRFNFU1NJT04pOwotCWNscCA9IGZpbmRfY2xpZW50X3dpdGhfc2Vzc2lvbihhcmdzLT5jc2FfYWRkciwgNCwgJmFyZ3MtPmNzYV9zZXNzaW9uaWQpOworCS8qIEluY29taW5nIHNlc3Npb24gbXVzdCBtYXRjaCB0aGUgY2FsbGJhY2sgc2Vzc2lvbiAqLworCWlmIChtZW1jbXAoJmFyZ3MtPmNzYV9zZXNzaW9uaWQsIGNwcy0+c3ZjX3NpZCwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTikpCisJCWdvdG8gb3V0OworCisJY2xwID0gbmZzNF9maW5kX2NsaWVudF9zZXNzaW9uaWQoYXJncy0+Y3NhX2FkZHIsCisJCQkJCSAmYXJncy0+Y3NhX3Nlc3Npb25pZCwgMSk7CiAJaWYgKGNscCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAorCS8qIHN0YXRlIG1hbmFnZXIgaXMgcmVzZXR0aW5nIHRoZSBzZXNzaW9uICovCisJaWYgKHRlc3RfYml0KE5GUzRfU0VTU0lPTl9EUkFJTklORywgJmNscC0+Y2xfc2Vzc2lvbi0+c2Vzc2lvbl9zdGF0ZSkpIHsKKwkJc3RhdHVzID0gTkZTNEVSUl9ERUxBWTsKKwkJZ290byBvdXQ7CisJfQorCiAJc3RhdHVzID0gdmFsaWRhdGVfc2VxaWQoJmNscC0+Y2xfc2Vzc2lvbi0+YmNfc2xvdF90YWJsZSwgYXJncyk7CiAJaWYgKHN0YXR1cykKLQkJZ290byBvdXRfcHV0Y2xpZW50OworCQlnb3RvIG91dDsKIAogCS8qCiAJICogQ2hlY2sgZm9yIHBlbmRpbmcgcmVmZXJyaW5nIGNhbGxzLiAgSWYgYSBtYXRjaCBpcyBmb3VuZCwgYQpAQCAtMjk4LDcgKzQwNCw3IEBACiAJICovCiAJaWYgKHJlZmVycmluZ19jYWxsX2V4aXN0cyhjbHAsIGFyZ3MtPmNzYV9ucmNsaXN0cywgYXJncy0+Y3NhX3JjbGlzdHMpKSB7CiAJCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfREVMQVkpOwotCQlnb3RvIG91dF9wdXRjbGllbnQ7CisJCWdvdG8gb3V0OwogCX0KIAogCW1lbWNweSgmcmVzLT5jc3Jfc2Vzc2lvbmlkLCAmYXJncy0+Y3NhX3Nlc3Npb25pZCwKQEAgLTMwNyw4MyArNDEzLDkzIEBACiAJcmVzLT5jc3Jfc2xvdGlkID0gYXJncy0+Y3NhX3Nsb3RpZDsKIAlyZXMtPmNzcl9oaWdoZXN0c2xvdGlkID0gTkZTNDFfQkNfTUFYX0NBTExCQUNLUyAtIDE7CiAJcmVzLT5jc3JfdGFyZ2V0X2hpZ2hlc3RzbG90aWQgPSBORlM0MV9CQ19NQVhfQ0FMTEJBQ0tTIC0gMTsKKwluZnM0X2NiX3Rha2Vfc2xvdChjbHApOworCWNwcy0+Y2xwID0gY2xwOyAvKiBwdXQgaW4gbmZzNF9jYWxsYmFja19jb21wb3VuZCAqLwogCi1vdXRfcHV0Y2xpZW50OgotCW5mc19wdXRfY2xpZW50KGNscCk7CiBvdXQ6CiAJZm9yIChpID0gMDsgaSA8IGFyZ3MtPmNzYV9ucmNsaXN0czsgaSsrKQogCQlrZnJlZShhcmdzLT5jc2FfcmNsaXN0c1tpXS5yY2xfcmVmY2FsbHMpOwogCWtmcmVlKGFyZ3MtPmNzYV9yY2xpc3RzKTsKIAotCWlmIChzdGF0dXMgPT0gaHRvbmwoTkZTNEVSUl9SRVRSWV9VTkNBQ0hFRF9SRVApKQotCQlyZXMtPmNzcl9zdGF0dXMgPSAwOwotCWVsc2UKKwlpZiAoc3RhdHVzID09IGh0b25sKE5GUzRFUlJfUkVUUllfVU5DQUNIRURfUkVQKSkgeworCQljcHMtPmRyY19zdGF0dXMgPSBzdGF0dXM7CisJCXN0YXR1cyA9IDA7CisJfSBlbHNlCiAJCXJlcy0+Y3NyX3N0YXR1cyA9IHN0YXR1czsKKwogCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWQgcmVzLT5jc3Jfc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywKIAkJbnRvaGwoc3RhdHVzKSwgbnRvaGwocmVzLT5jc3Jfc3RhdHVzKSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsYW55KHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzLCB2b2lkICpkdW1teSkKK3N0YXRpYyBib29sCit2YWxpZGF0ZV9iaXRtYXBfdmFsdWVzKHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOworCXJldHVybiAobWFzayAmIH5SQ0E0X1RZUEVfTUFTS19BTEwpID09IDA7Cit9CisKK19fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbGFueShzdHJ1Y3QgY2JfcmVjYWxsYW55YXJncyAqYXJncywgdm9pZCAqZHVtbXksCisJCQkgICAgICAgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcykKK3sKIAlfX2JlMzIgc3RhdHVzOwogCWZtb2RlX3QgZmxhZ3MgPSAwOwogCi0Jc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9PUF9OT1RfSU5fU0VTU0lPTik7Ci0JY2xwID0gbmZzX2ZpbmRfY2xpZW50KGFyZ3MtPmNyYWFfYWRkciwgNCk7Ci0JaWYgKGNscCA9PSBOVUxMKQorCXN0YXR1cyA9IGNwdV90b19iZTMyKE5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJT04pOworCWlmICghY3BzLT5jbHApIC8qIHNldCBpbiBjYl9zZXF1ZW5jZSAqLwogCQlnb3RvIG91dDsKIAogCWRwcmludGsoIk5GUzogUkVDQUxMX0FOWSBjYWxsYmFjayByZXF1ZXN0IGZyb20gJXNcbiIsCi0JCXJwY19wZWVyYWRkcjJzdHIoY2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpKTsKKwkJcnBjX3BlZXJhZGRyMnN0cihjcHMtPmNscC0+Y2xfcnBjY2xpZW50LCBSUENfRElTUExBWV9BRERSKSk7CiAKKwlzdGF0dXMgPSBjcHVfdG9fYmUzMihORlM0RVJSX0lOVkFMKTsKKwlpZiAoIXZhbGlkYXRlX2JpdG1hcF92YWx1ZXMoYXJncy0+Y3JhYV90eXBlX21hc2spKQorCQlnb3RvIG91dDsKKworCXN0YXR1cyA9IGNwdV90b19iZTMyKE5GUzRfT0spOwogCWlmICh0ZXN0X2JpdChSQ0E0X1RZUEVfTUFTS19SREFUQV9ETEcsIChjb25zdCB1bnNpZ25lZCBsb25nICopCiAJCSAgICAgJmFyZ3MtPmNyYWFfdHlwZV9tYXNrKSkKIAkJZmxhZ3MgPSBGTU9ERV9SRUFEOwogCWlmICh0ZXN0X2JpdChSQ0E0X1RZUEVfTUFTS19XREFUQV9ETEcsIChjb25zdCB1bnNpZ25lZCBsb25nICopCiAJCSAgICAgJmFyZ3MtPmNyYWFfdHlwZV9tYXNrKSkKIAkJZmxhZ3MgfD0gRk1PREVfV1JJVEU7Ci0KKwlpZiAodGVzdF9iaXQoUkNBNF9UWVBFX01BU0tfRklMRV9MQVlPVVQsIChjb25zdCB1bnNpZ25lZCBsb25nICopCisJCSAgICAgJmFyZ3MtPmNyYWFfdHlwZV9tYXNrKSkKKwkJcG5mc19yZWNhbGxfYWxsX2xheW91dHMoY3BzLT5jbHApOwogCWlmIChmbGFncykKLQkJbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhjbHAsIGZsYWdzKTsKLQlzdGF0dXMgPSBodG9ubChORlM0X09LKTsKKwkJbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhjcHMtPmNscCwgZmxhZ3MpOwogb3V0OgogCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBudG9obChzdGF0dXMpKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBSZWR1Y2UgdGhlIGZvcmUgY2hhbm5lbCdzIG1heF9zbG90cyB0byB0aGUgdGFyZ2V0IHZhbHVlICovCi1fX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGxzbG90KHN0cnVjdCBjYl9yZWNhbGxzbG90YXJncyAqYXJncywgdm9pZCAqZHVtbXkpCitfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGxzbG90KHN0cnVjdCBjYl9yZWNhbGxzbG90YXJncyAqYXJncywgdm9pZCAqZHVtbXksCisJCQkJc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcykKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCXN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKmZjX3RibDsKIAlfX2JlMzIgc3RhdHVzOwogCiAJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9PUF9OT1RfSU5fU0VTU0lPTik7Ci0JY2xwID0gbmZzX2ZpbmRfY2xpZW50KGFyZ3MtPmNyc2FfYWRkciwgNCk7Ci0JaWYgKGNscCA9PSBOVUxMKQorCWlmICghY3BzLT5jbHApIC8qIHNldCBpbiBjYl9zZXF1ZW5jZSAqLwogCQlnb3RvIG91dDsKIAogCWRwcmludGsoIk5GUzogQ0JfUkVDQUxMX1NMT1QgcmVxdWVzdCBmcm9tICVzIHRhcmdldCBtYXggc2xvdHMgJWRcbiIsCi0JCXJwY19wZWVyYWRkcjJzdHIoY2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpLAorCQlycGNfcGVlcmFkZHIyc3RyKGNwcy0+Y2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpLAogCQlhcmdzLT5jcnNhX3RhcmdldF9tYXhfc2xvdHMpOwogCi0JZmNfdGJsID0gJmNscC0+Y2xfc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZTsKKwlmY190YmwgPSAmY3BzLT5jbHAtPmNsX3Nlc3Npb24tPmZjX3Nsb3RfdGFibGU7CiAKIAlzdGF0dXMgPSBodG9ubChORlM0RVJSX0JBRF9ISUdIX1NMT1QpOwogCWlmIChhcmdzLT5jcnNhX3RhcmdldF9tYXhfc2xvdHMgPiBmY190YmwtPm1heF9zbG90cyB8fAogCSAgICBhcmdzLT5jcnNhX3RhcmdldF9tYXhfc2xvdHMgPCAxKQotCQlnb3RvIG91dF9wdXRjbGllbnQ7CisJCWdvdG8gb3V0OwogCiAJc3RhdHVzID0gaHRvbmwoTkZTNF9PSyk7CiAJaWYgKGFyZ3MtPmNyc2FfdGFyZ2V0X21heF9zbG90cyA9PSBmY190YmwtPm1heF9zbG90cykKLQkJZ290byBvdXRfcHV0Y2xpZW50OworCQlnb3RvIG91dDsKIAogCWZjX3RibC0+dGFyZ2V0X21heF9zbG90cyA9IGFyZ3MtPmNyc2FfdGFyZ2V0X21heF9zbG90czsKLQluZnM0MV9oYW5kbGVfcmVjYWxsX3Nsb3QoY2xwKTsKLW91dF9wdXRjbGllbnQ6Ci0JbmZzX3B1dF9jbGllbnQoY2xwKTsJLyogYmFsYW5jZSBuZnNfZmluZF9jbGllbnQgKi8KKwluZnM0MV9oYW5kbGVfcmVjYWxsX3Nsb3QoY3BzLT5jbHApOwogb3V0OgogCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBudG9obChzdGF0dXMpKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCmluZGV4IDA1YWYyMTIuLjIzMTEyYzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFja194ZHIuYworKysgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKQEAgLTEwLDggKzEwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvbmZzNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYmNfeHBydC5oPgogI2luY2x1ZGUgIm5mczRfZnMuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgQ0JfT1BfVEFHTEVOX01BWFNaCSg1MTIpCiAjZGVmaW5lIENCX09QX0hEUl9SRVNfTUFYU1oJKDIgKyBDQl9PUF9UQUdMRU5fTUFYU1opCkBAIC0yMiw2ICsyNCw3IEBACiAjZGVmaW5lIENCX09QX1JFQ0FMTF9SRVNfTUFYU1oJKENCX09QX0hEUl9SRVNfTUFYU1opCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKKyNkZWZpbmUgQ0JfT1BfTEFZT1VUUkVDQUxMX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWikKICNkZWZpbmUgQ0JfT1BfU0VRVUVOQ0VfUkVTX01BWFNaCShDQl9PUF9IRFJfUkVTX01BWFNaICsgXAogCQkJCQk0ICsgMSArIDMpCiAjZGVmaW5lIENCX09QX1JFQ0FMTEFOWV9SRVNfTUFYU1oJKENCX09QX0hEUl9SRVNfTUFYU1opCkBAIC0zMyw3ICszNiw4IEBACiAvKiBJbnRlcm5hbCBlcnJvciBjb2RlICovCiAjZGVmaW5lIE5GUzRFUlJfUkVTT1VSQ0VfSERSCTExMDUwCiAKLXR5cGVkZWYgX19iZTMyICgqY2FsbGJhY2tfcHJvY2Vzc19vcF90KSh2b2lkICosIHZvaWQgKik7Cit0eXBlZGVmIF9fYmUzMiAoKmNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCkodm9pZCAqLCB2b2lkICosCisJCQkJCXN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICopOwogdHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19kZWNvZGVfYXJnX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwogdHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19lbmNvZGVfcmVzX3QpKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqLCB2b2lkICopOwogCkBAIC0xNjAsNyArMTY0LDcgQEAKIAloZHItPm1pbm9ydmVyc2lvbiA9IG50b2hsKCpwKyspOwogCS8qIENoZWNrIG1pbm9yIHZlcnNpb24gaXMgemVybyBvciBvbmUuICovCiAJaWYgKGhkci0+bWlub3J2ZXJzaW9uIDw9IDEpIHsKLQkJcCsrOwkvKiBza2lwIGNhbGxiYWNrX2lkZW50ICovCisJCWhkci0+Y2JfaWRlbnQgPSBudG9obCgqcCsrKTsgLyogaWdub3JlZCBieSB2NC4xICovCiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5GU3Y0IHNlcnZlciBjYWxsYmFjayB3aXRoICIKIAkJCSJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gJXUhXG4iLApAQCAtMjIwLDYgKzIyNCw2NiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAKK3N0YXRpYyBfX2JlMzIgZGVjb2RlX2xheW91dHJlY2FsbF9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIHN0cnVjdCBjYl9sYXlvdXRyZWNhbGxhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKwlfX2JlMzIgc3RhdHVzID0gMDsKKwl1aW50MzJfdCBpb21vZGU7CisKKwlhcmdzLT5jYmxfYWRkciA9IHN2Y19hZGRyKHJxc3RwKTsKKwlwID0gcmVhZF9idWYoeGRyLCA0ICogc2l6ZW9mKHVpbnQzMl90KSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpIHsKKwkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9CQURYRFIpOworCQlnb3RvIG91dDsKKwl9CisKKwlhcmdzLT5jYmxfbGF5b3V0X3R5cGUgPSBudG9obCgqcCsrKTsKKwkvKiBEZXBpdGUgdGhlIHNwZWMncyB4ZHIsIGlvbW9kZSByZWFsbHkgYmVsb25ncyBpbiB0aGUgRklMRSBzd2l0Y2gsCisJICogYXMgaXQgaXMgdW51c2VhYmxlIGFuZCBpZ25vcmVkIHdpdGggdGhlIG90aGVyIHR5cGVzLgorCSAqLworCWlvbW9kZSA9IG50b2hsKCpwKyspOworCWFyZ3MtPmNibF9sYXlvdXRjaGFuZ2VkID0gbnRvaGwoKnArKyk7CisJYXJncy0+Y2JsX3JlY2FsbF90eXBlID0gbnRvaGwoKnArKyk7CisKKwlpZiAoYXJncy0+Y2JsX3JlY2FsbF90eXBlID09IFJFVFVSTl9GSUxFKSB7CisJCWFyZ3MtPmNibF9yYW5nZS5pb21vZGUgPSBpb21vZGU7CisJCXN0YXR1cyA9IGRlY29kZV9maCh4ZHIsICZhcmdzLT5jYmxfZmgpOworCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJZ290byBvdXQ7CisKKwkJcCA9IHJlYWRfYnVmKHhkciwgMiAqIHNpemVvZih1aW50NjRfdCkpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkgeworCQkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9CQURYRFIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPmNibF9yYW5nZS5vZmZzZXQpOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+Y2JsX3JhbmdlLmxlbmd0aCk7CisJCXN0YXR1cyA9IGRlY29kZV9zdGF0ZWlkKHhkciwgJmFyZ3MtPmNibF9zdGF0ZWlkKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoYXJncy0+Y2JsX3JlY2FsbF90eXBlID09IFJFVFVSTl9GU0lEKSB7CisJCXAgPSByZWFkX2J1Zih4ZHIsIDIgKiBzaXplb2YodWludDY0X3QpKTsKKwkJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpIHsKKwkJCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFEWERSKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZhcmdzLT5jYmxfZnNpZC5tYWpvcik7CisJCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZhcmdzLT5jYmxfZnNpZC5taW5vcik7CisJfSBlbHNlIGlmIChhcmdzLT5jYmxfcmVjYWxsX3R5cGUgIT0gUkVUVVJOX0FMTCkgeworCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX0JBRFhEUik7CisJCWdvdG8gb3V0OworCX0KKwlkcHJpbnRrKCIlczogbHR5cGUgMHgleCBpb21vZGUgJWQgY2hhbmdlZCAlZCByZWNhbGxfdHlwZSAlZFxuIiwKKwkJX19mdW5jX18sCisJCWFyZ3MtPmNibF9sYXlvdXRfdHlwZSwgaW9tb2RlLAorCQlhcmdzLT5jYmxfbGF5b3V0Y2hhbmdlZCwgYXJncy0+Y2JsX3JlY2FsbF90eXBlKTsKK291dDoKKwlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgbnRvaGwoc3RhdHVzKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIF9fYmUzMiBkZWNvZGVfc2Vzc2lvbmlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqc2lkKQogewpAQCAtNTc0LDEwICs2MzgsMTAgQEAKIAljYXNlIE9QX0NCX1NFUVVFTkNFOgogCWNhc2UgT1BfQ0JfUkVDQUxMX0FOWToKIAljYXNlIE9QX0NCX1JFQ0FMTF9TTE9UOgorCWNhc2UgT1BfQ0JfTEFZT1VUUkVDQUxMOgogCQkqb3AgPSAmY2FsbGJhY2tfb3BzW29wX25yXTsKIAkJYnJlYWs7CiAKLQljYXNlIE9QX0NCX0xBWU9VVFJFQ0FMTDoKIAljYXNlIE9QX0NCX05PVElGWV9ERVZJQ0VJRDoKIAljYXNlIE9QX0NCX05PVElGWToKIAljYXNlIE9QX0NCX1BVU0hfREVMRUc6CkBAIC01OTMsNiArNjU3LDM3IEBACiAJcmV0dXJuIGh0b25sKE5GU19PSyk7CiB9CiAKK3N0YXRpYyB2b2lkIG5mczRfY2FsbGJhY2tfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsID0gJnNlc3Npb24tPmJjX3Nsb3RfdGFibGU7CisKKwlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CisJLyoKKwkgKiBMZXQgdGhlIHN0YXRlIG1hbmFnZXIga25vdyBjYWxsYmFjayBwcm9jZXNzaW5nIGRvbmUuCisJICogQSBzaW5nbGUgc2xvdCwgc28gaGlnaGVzdCB1c2VkIHNsb3RpZCBpcyBlaXRoZXIgMCBvciAtMQorCSAqLworCXRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZC0tOworCW5mczRfY2hlY2tfZHJhaW5fYmNfY29tcGxldGUoc2Vzc2lvbik7CisJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfY2JfZnJlZV9zbG90KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJaWYgKGNscCAmJiBjbHAtPmNsX3Nlc3Npb24pCisJCW5mczRfY2FsbGJhY2tfZnJlZV9zbG90KGNscC0+Y2xfc2Vzc2lvbik7Cit9CisKKy8qIEEgc2luZ2xlIHNsb3QsIHNvIGhpZ2hlc3QgdXNlZCBzbG90aWQgaXMgZWl0aGVyIDAgb3IgLTEgKi8KK3ZvaWQgbmZzNF9jYl90YWtlX3Nsb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwgPSAmY2xwLT5jbF9zZXNzaW9uLT5iY19zbG90X3RhYmxlOworCisJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCXRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCsrOworCUJVR19PTih0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgIT0gMCk7CisJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Cit9CisKICNlbHNlIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCiBzdGF0aWMgX19iZTMyCkBAIC02MDEsNiArNjk2LDkgQEAKIAlyZXR1cm4gaHRvbmwoTkZTNEVSUl9NSU5PUl9WRVJTX01JU01BVENIKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzNF9jYl9mcmVlX3Nsb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKK30KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogc3RhdGljIF9fYmUzMgpAQCAtNjIxLDcgKzcxOSw4IEBACiBzdGF0aWMgX19iZTMyIHByb2Nlc3Nfb3AodWludDMyX3QgbWlub3J2ZXJzaW9uLCBpbnQgbm9wLAogCQlzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyX2luLCB2b2lkICphcmdwLAotCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyX291dCwgdm9pZCAqcmVzcCwgaW50KiBkcmNfc3RhdHVzKQorCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyX291dCwgdm9pZCAqcmVzcCwKKwkJc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcykKIHsKIAlzdHJ1Y3QgY2FsbGJhY2tfb3AgKm9wID0gJmNhbGxiYWNrX29wc1swXTsKIAl1bnNpZ25lZCBpbnQgb3BfbnI7CkBAIC02NDQsOCArNzQzLDggQEAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGVuY29kZV9oZHI7CiAKLQlpZiAoKmRyY19zdGF0dXMpIHsKLQkJc3RhdHVzID0gKmRyY19zdGF0dXM7CisJaWYgKGNwcy0+ZHJjX3N0YXR1cykgeworCQlzdGF0dXMgPSBjcHMtPmRyY19zdGF0dXM7CiAJCWdvdG8gZW5jb2RlX2hkcjsKIAl9CiAKQEAgLTY1MywxNiArNzUyLDEwIEBACiAJaWYgKG1heGxlbiA+IDAgJiYgbWF4bGVuIDwgUEFHRV9TSVpFKSB7CiAJCXN0YXR1cyA9IG9wLT5kZWNvZGVfYXJncyhycXN0cCwgeGRyX2luLCBhcmdwKTsKIAkJaWYgKGxpa2VseShzdGF0dXMgPT0gMCkpCi0JCQlzdGF0dXMgPSBvcC0+cHJvY2Vzc19vcChhcmdwLCByZXNwKTsKKwkJCXN0YXR1cyA9IG9wLT5wcm9jZXNzX29wKGFyZ3AsIHJlc3AsIGNwcyk7CiAJfSBlbHNlCiAJCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOwogCi0JLyogT25seSBzZXQgYnkgT1BfQ0JfU0VRVUVOQ0UgcHJvY2Vzc2luZyAqLwotCWlmIChzdGF0dXMgPT0gaHRvbmwoTkZTNEVSUl9SRVRSWV9VTkNBQ0hFRF9SRVApKSB7Ci0JCSpkcmNfc3RhdHVzID0gc3RhdHVzOwotCQlzdGF0dXMgPSAwOwotCX0KLQogZW5jb2RlX2hkcjoKIAlyZXMgPSBlbmNvZGVfb3BfaGRyKHhkcl9vdXQsIG9wX25yLCBzdGF0dXMpOwogCWlmICh1bmxpa2VseShyZXMpKQpAQCAtNjgxLDggKzc3NCwxMSBAQAogCXN0cnVjdCBjYl9jb21wb3VuZF9oZHJfYXJnIGhkcl9hcmcgPSB7IDAgfTsKIAlzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyBoZHJfcmVzID0geyBOVUxMIH07CiAJc3RydWN0IHhkcl9zdHJlYW0geGRyX2luLCB4ZHJfb3V0OwotCV9fYmUzMiAqcDsKLQlfX2JlMzIgc3RhdHVzLCBkcmNfc3RhdHVzID0gMDsKKwlfX2JlMzIgKnAsIHN0YXR1czsKKwlzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSBjcHMgPSB7CisJCS5kcmNfc3RhdHVzID0gMCwKKwkJLmNscCA9IE5VTEwsCisJfTsKIAl1bnNpZ25lZCBpbnQgbm9wcyA9IDA7CiAKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKQEAgLTY5Niw2ICs3OTIsMTMgQEAKIAlpZiAoc3RhdHVzID09IF9fY29uc3RhbnRfaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSkpCiAJCXJldHVybiBycGNfZ2FyYmFnZV9hcmdzOwogCisJaWYgKGhkcl9hcmcubWlub3J2ZXJzaW9uID09IDApIHsKKwkJY3BzLmNscCA9IG5mczRfZmluZF9jbGllbnRfaWRlbnQoaGRyX2FyZy5jYl9pZGVudCk7CisJCWlmICghY3BzLmNscCkKKwkJCXJldHVybiBycGNfZHJvcF9yZXBseTsKKwl9IGVsc2UKKwkJY3BzLnN2Y19zaWQgPSBiY194cHJ0X3NpZChycXN0cCk7CisKIAloZHJfcmVzLnRhZ2xlbiA9IGhkcl9hcmcudGFnbGVuOwogCWhkcl9yZXMudGFnID0gaGRyX2FyZy50YWc7CiAJaWYgKGVuY29kZV9jb21wb3VuZF9oZHJfcmVzKCZ4ZHJfb3V0LCAmaGRyX3JlcykgIT0gMCkKQEAgLTcwMyw3ICs4MDYsNyBAQAogCiAJd2hpbGUgKHN0YXR1cyA9PSAwICYmIG5vcHMgIT0gaGRyX2FyZy5ub3BzKSB7CiAJCXN0YXR1cyA9IHByb2Nlc3Nfb3AoaGRyX2FyZy5taW5vcnZlcnNpb24sIG5vcHMsIHJxc3RwLAotCQkJCSAgICAmeGRyX2luLCBhcmdwLCAmeGRyX291dCwgcmVzcCwgJmRyY19zdGF0dXMpOworCQkJCSAgICAmeGRyX2luLCBhcmdwLCAmeGRyX291dCwgcmVzcCwgJmNwcyk7CiAJCW5vcHMrKzsKIAl9CiAKQEAgLTcxNiw2ICs4MTksOCBAQAogCiAJKmhkcl9yZXMuc3RhdHVzID0gc3RhdHVzOwogCSpoZHJfcmVzLm5vcHMgPSBodG9ubChub3BzKTsKKwluZnM0X2NiX2ZyZWVfc2xvdChjcHMuY2xwKTsKKwluZnNfcHV0X2NsaWVudChjcHMuY2xwKTsKIAlkcHJpbnRrKCIlczogZG9uZSwgc3RhdHVzID0gJXVcbiIsIF9fZnVuY19fLCBudG9obChzdGF0dXMpKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC03MzksNiArODQ0LDEyIEBACiAJCS5yZXNfbWF4c2l6ZSA9IENCX09QX1JFQ0FMTF9SRVNfTUFYU1osCiAJfSwKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKKwlbT1BfQ0JfTEFZT1VUUkVDQUxMXSA9IHsKKwkJLnByb2Nlc3Nfb3AgPSAoY2FsbGJhY2tfcHJvY2Vzc19vcF90KW5mczRfY2FsbGJhY2tfbGF5b3V0cmVjYWxsLAorCQkuZGVjb2RlX2FyZ3MgPQorCQkJKGNhbGxiYWNrX2RlY29kZV9hcmdfdClkZWNvZGVfbGF5b3V0cmVjYWxsX2FyZ3MsCisJCS5yZXNfbWF4c2l6ZSA9IENCX09QX0xBWU9VVFJFQ0FMTF9SRVNfTUFYU1osCisJfSwKIAlbT1BfQ0JfU0VRVUVOQ0VdID0gewogCQkucHJvY2Vzc19vcCA9IChjYWxsYmFja19wcm9jZXNzX29wX3QpbmZzNF9jYWxsYmFja19zZXF1ZW5jZSwKIAkJLmRlY29kZV9hcmdzID0gKGNhbGxiYWNrX2RlY29kZV9hcmdfdClkZWNvZGVfY2Jfc2VxdWVuY2VfYXJncywKZGlmZiAtLWdpdCBhL2ZzL25mcy9jbGllbnQuYyBiL2ZzL25mcy9jbGllbnQuYwppbmRleCAwODcwZDBkLi4xOTJmMmY4IDEwMDY0NAotLS0gYS9mcy9uZnMvY2xpZW50LmMKKysrIGIvZnMvbmZzL2NsaWVudC5jCkBAIC01Niw2ICs1NiwzMCBAQAogc3RhdGljIExJU1RfSEVBRChuZnNfY2xpZW50X2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChuZnNfdm9sdW1lX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG5mc19jbGllbnRfYWN0aXZlX3dxKTsKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgREVGSU5FX0lEUihjYl9pZGVudF9pZHIpOyAvKiBQcm90ZWN0ZWQgYnkgbmZzX2NsaWVudF9sb2NrICovCisKKy8qCisgKiBHZXQgYSB1bmlxdWUgTkZTdjQuMCBjYWxsYmFjayBpZGVudGlmaWVyIHdoaWNoIHdpbGwgYmUgdXNlZAorICogYnkgdGhlIFY0LjAgY2FsbGJhY2sgc2VydmljZSB0byBsb29rdXAgdGhlIG5mc19jbGllbnQgc3RydWN0CisgKi8KK3N0YXRpYyBpbnQgbmZzX2dldF9jYl9pZGVudF9pZHIoc3RydWN0IG5mc19jbGllbnQgKmNscCwgaW50IG1pbm9ydmVyc2lvbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjbHAtPnJwY19vcHMtPnZlcnNpb24gIT0gNCB8fCBtaW5vcnZlcnNpb24gIT0gMCkKKwkJcmV0dXJuIHJldDsKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmNiX2lkZW50X2lkciwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlyZXQgPSBpZHJfZ2V0X25ldygmY2JfaWRlbnRfaWRyLCBjbHAsICZjbHAtPmNsX2NiX2lkZW50KTsKKwlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKIC8qCiAgKiBSUEMgY3J1ZnQgZm9yIE5GUwpAQCAtMTQ0LDcgKzE2OCwxMCBAQAogCWNscC0+Y2xfcHJvdG8gPSBjbF9pbml0LT5wcm90bzsKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKLQlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9kZWxlZ2F0aW9ucyk7CisJZXJyID0gbmZzX2dldF9jYl9pZGVudF9pZHIoY2xwLCBjbF9pbml0LT5taW5vcnZlcnNpb24pOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfY2xlYW51cDsKKwogCXNwaW5fbG9ja19pbml0KCZjbHAtPmNsX2xvY2spOwogCUlOSVRfREVMQVlFRF9XT1JLKCZjbHAtPmNsX3JlbmV3ZCwgbmZzNF9yZW5ld19zdGF0ZSk7CiAJcnBjX2luaXRfd2FpdF9xdWV1ZSgmY2xwLT5jbF9ycGN3YWl0cSwgIk5GUyBjbGllbnQiKTsKQEAgLTE3MCwyMSArMTk3LDE3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0Ci0vKgotICogQ2xlYXJzL3B1dHMgYWxsIG1pbm9yIHZlcnNpb24gc3BlY2lmaWMgcGFydHMgZnJvbSBhbiBuZnNfY2xpZW50IHN0cnVjdAotICogcmV2ZXJ0aW5nIGl0IHRvIG1pbm9ydmVyc2lvbiAwLgotICovCi1zdGF0aWMgdm9pZCBuZnM0X2NsZWFyX2NsaWVudF9taW5vcl92ZXJzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCi17CiAjaWZkZWYgQ09ORklHX05GU19WNF8xCi0JaWYgKG5mczRfaGFzX3Nlc3Npb24oY2xwKSkgeworc3RhdGljIHZvaWQgbmZzNF9zaHV0ZG93bl9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJaWYgKG5mczRfaGFzX3Nlc3Npb24oY2xwKSkKIAkJbmZzNF9kZXN0cm95X3Nlc3Npb24oY2xwLT5jbF9zZXNzaW9uKTsKLQkJY2xwLT5jbF9zZXNzaW9uID0gTlVMTDsKLQl9Ci0KLQljbHAtPmNsX212b3BzID0gbmZzX3Y0X21pbm9yX29wc1swXTsKLSNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIH0KKyNlbHNlIC8qIENPTkZJR19ORlNfVjRfMSAqLworc3RhdGljIHZvaWQgbmZzNF9zaHV0ZG93bl9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKIC8qCiAgKiBEZXN0cm95IHRoZSBORlM0IGNhbGxiYWNrIHNlcnZpY2UKQEAgLTE5OSwxNyArMjIyLDQ5IEBACiB7CiAJaWYgKF9fdGVzdF9hbmRfY2xlYXJfYml0KE5GU19DU19SRU5FV0QsICZjbHAtPmNsX3Jlc19zdGF0ZSkpCiAJCW5mczRfa2lsbF9yZW5ld2QoY2xwKTsKLQluZnM0X2NsZWFyX2NsaWVudF9taW5vcl92ZXJzaW9uKGNscCk7CisJbmZzNF9zaHV0ZG93bl9zZXNzaW9uKGNscCk7CiAJbmZzNF9kZXN0cm95X2NhbGxiYWNrKGNscCk7CiAJaWYgKF9fdGVzdF9hbmRfY2xlYXJfYml0KE5GU19DU19JRE1BUCwgJmNscC0+Y2xfcmVzX3N0YXRlKSkKIAkJbmZzX2lkbWFwX2RlbGV0ZShjbHApOwogCiAJcnBjX2Rlc3Ryb3lfd2FpdF9xdWV1ZSgmY2xwLT5jbF9ycGN3YWl0cSk7CiB9CisKKy8qIGlkcl9yZW1vdmVfYWxsIGlzIG5vdCBuZWVkZWQgYXMgYWxsIGlkJ3MgYXJlIHJlbW92ZWQgYnkgbmZzX3B1dF9jbGllbnQgKi8KK3ZvaWQgbmZzX2NsZWFudXBfY2JfaWRlbnRfaWRyKHZvaWQpCit7CisJaWRyX2Rlc3Ryb3koJmNiX2lkZW50X2lkcik7Cit9CisKKy8qIG5mc19jbGllbnRfbG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBuZnNfY2JfaWRyX3JlbW92ZV9sb2NrZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlpZiAoY2xwLT5jbF9jYl9pZGVudCkKKwkJaWRyX3JlbW92ZSgmY2JfaWRlbnRfaWRyLCBjbHAtPmNsX2NiX2lkZW50KTsKK30KKworc3RhdGljIHZvaWQgcG5mc19pbml0X3NlcnZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXJwY19pbml0X3dhaXRfcXVldWUoJnNlcnZlci0+cm9jX3JwY3dhaXRxLCAicE5GUyBST0MiKTsKK30KKwogI2Vsc2UKIHN0YXRpYyB2b2lkIG5mczRfc2h1dGRvd25fY2xpZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiB9CisKK3ZvaWQgbmZzX2NsZWFudXBfY2JfaWRlbnRfaWRyKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19jYl9pZHJfcmVtb3ZlX2xvY2tlZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworfQorCitzdGF0aWMgdm9pZCBwbmZzX2luaXRfc2VydmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKIC8qCkBAIC0yNDgsNiArMzAzLDcgQEAKIAogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZjbHAtPmNsX2NvdW50LCAmbmZzX2NsaWVudF9sb2NrKSkgewogCQlsaXN0X2RlbCgmY2xwLT5jbF9zaGFyZV9saW5rKTsKKwkJbmZzX2NiX2lkcl9yZW1vdmVfbG9ja2VkKGNscCk7CiAJCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwogCiAJCUJVR19PTighbGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpOwpAQCAtMzYzLDcwICs0MTksMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEZpbmQgYSBjbGllbnQgYnkgSVAgYWRkcmVzcyBhbmQgcHJvdG9jb2wgdmVyc2lvbgotICogLSByZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBjbGllbnQKLSAqLwotc3RydWN0IG5mc19jbGllbnQgKm5mc19maW5kX2NsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHUzMiBuZnN2ZXJzaW9uKQorLyogQ29tbW9uIG1hdGNoIHJvdXRpbmUgZm9yIHY0LjAgYW5kIHY0LjEgY2FsbGJhY2sgc2VydmljZXMgKi8KK2Jvb2wKK25mczRfY2JfbWF0Y2hfY2xpZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJICAgICB1MzIgbWlub3J2ZXJzaW9uKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisJc3RydWN0IHNvY2thZGRyICpjbGFwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZjbHAtPmNsX2FkZHI7CiAKLQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZuZnNfY2xpZW50X2xpc3QsIGNsX3NoYXJlX2xpbmspIHsKLQkJc3RydWN0IHNvY2thZGRyICpjbGFwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZjbHAtPmNsX2FkZHI7CisJLyogRG9uJ3QgbWF0Y2ggY2xpZW50cyB0aGF0IGZhaWxlZCB0byBpbml0aWFsaXNlICovCisJaWYgKCEoY2xwLT5jbF9jb25zX3N0YXRlID09IE5GU19DU19SRUFEWSB8fAorCSAgICBjbHAtPmNsX2NvbnNfc3RhdGUgPT0gTkZTX0NTX1NFU1NJT05fSU5JVElORykpCisJCXJldHVybiBmYWxzZTsKIAotCQkvKiBEb24ndCBtYXRjaCBjbGllbnRzIHRoYXQgZmFpbGVkIHRvIGluaXRpYWxpc2UgcHJvcGVybHkgKi8KLQkJaWYgKCEoY2xwLT5jbF9jb25zX3N0YXRlID09IE5GU19DU19SRUFEWSB8fAotCQkgICAgICBjbHAtPmNsX2NvbnNfc3RhdGUgPT0gTkZTX0NTX1NFU1NJT05fSU5JVElORykpCi0JCQljb250aW51ZTsKKwkvKiBNYXRjaCB0aGUgdmVyc2lvbiBhbmQgbWlub3J2ZXJzaW9uICovCisJaWYgKGNscC0+cnBjX29wcy0+dmVyc2lvbiAhPSA0IHx8CisJICAgIGNscC0+Y2xfbWlub3J2ZXJzaW9uICE9IG1pbm9ydmVyc2lvbikKKwkJcmV0dXJuIGZhbHNlOwogCi0JCS8qIERpZmZlcmVudCBORlMgdmVyc2lvbnMgY2Fubm90IHNoYXJlIHRoZSBzYW1lIG5mc19jbGllbnQgKi8KLQkJaWYgKGNscC0+cnBjX29wcy0+dmVyc2lvbiAhPSBuZnN2ZXJzaW9uKQotCQkJY29udGludWU7CisJLyogTWF0Y2ggb25seSB0aGUgSVAgYWRkcmVzcywgbm90IHRoZSBwb3J0IG51bWJlciAqLworCWlmICghbmZzX3NvY2thZGRyX21hdGNoX2lwYWRkcihhZGRyLCBjbGFwKSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JCS8qIE1hdGNoIG9ubHkgdGhlIElQIGFkZHJlc3MsIG5vdCB0aGUgcG9ydCBudW1iZXIgKi8KLQkJaWYgKCFuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyKGFkZHIsIGNsYXApKQotCQkJY29udGludWU7Ci0KLQkJYXRvbWljX2luYygmY2xwLT5jbF9jb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCQlyZXR1cm4gY2xwOwotCX0KLQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEZpbmQgYSBjbGllbnQgYnkgSVAgYWRkcmVzcyBhbmQgcHJvdG9jb2wgdmVyc2lvbgotICogLSByZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBjbGllbnQKLSAqLwotc3RydWN0IG5mc19jbGllbnQgKm5mc19maW5kX2NsaWVudF9uZXh0KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCi17Ci0Jc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmNscC0+Y2xfYWRkcjsKLQl1MzIgbmZzdmVycyA9IGNscC0+cnBjX29wcy0+dmVyc2lvbjsKLQotCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKGNscCwgJm5mc19jbGllbnRfbGlzdCwgY2xfc2hhcmVfbGluaykgewotCQlzdHJ1Y3Qgc29ja2FkZHIgKmNsYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmNscC0+Y2xfYWRkcjsKLQotCQkvKiBEb24ndCBtYXRjaCBjbGllbnRzIHRoYXQgZmFpbGVkIHRvIGluaXRpYWxpc2UgcHJvcGVybHkgKi8KLQkJaWYgKGNscC0+Y2xfY29uc19zdGF0ZSAhPSBORlNfQ1NfUkVBRFkpCi0JCQljb250aW51ZTsKLQotCQkvKiBEaWZmZXJlbnQgTkZTIHZlcnNpb25zIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBuZnNfY2xpZW50ICovCi0JCWlmIChjbHAtPnJwY19vcHMtPnZlcnNpb24gIT0gbmZzdmVycykKLQkJCWNvbnRpbnVlOwotCi0JCS8qIE1hdGNoIG9ubHkgdGhlIElQIGFkZHJlc3MsIG5vdCB0aGUgcG9ydCBudW1iZXIgKi8KLQkJaWYgKCFuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyKHNhcCwgY2xhcCkpCi0JCQljb250aW51ZTsKLQotCQlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKLQkJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JCXJldHVybiBjbHA7Ci0JfQotCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCXJldHVybiBOVUxMOworCXJldHVybiB0cnVlOwogfQogCiAvKgpAQCAtOTg4LDYgKzEwMDIsMjcgQEAKIAl0YXJnZXQtPm9wdGlvbnMgPSBzb3VyY2UtPm9wdGlvbnM7CiB9CiAKK3N0YXRpYyB2b2lkIG5mc19zZXJ2ZXJfaW5zZXJ0X2xpc3RzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKKworCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmc2VydmVyLT5jbGllbnRfbGluaywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bWFzdGVyX2xpbmssICZuZnNfdm9sdW1lX2xpc3QpOworCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCit9CisKK3N0YXRpYyB2b2lkIG5mc19zZXJ2ZXJfcmVtb3ZlX2xpc3RzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCWxpc3RfZGVsX3JjdSgmc2VydmVyLT5jbGllbnRfbGluayk7CisJbGlzdF9kZWwoJnNlcnZlci0+bWFzdGVyX2xpbmspOworCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCisJc3luY2hyb25pemVfcmN1KCk7Cit9CisKIC8qCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIHNlcnZlciByZWNvcmQKICAqLwpAQCAtMTAwNCw2ICsxMDM5LDcgQEAKIAkvKiBaZXJvIG91dCB0aGUgTkZTIHN0YXRlIHN0dWZmICovCiAJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+Y2xpZW50X2xpbmspOwogCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPm1hc3Rlcl9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5kZWxlZ2F0aW9ucyk7CiAKIAlhdG9taWNfc2V0KCZzZXJ2ZXItPmFjdGl2ZSwgMCk7CiAKQEAgLTEwMTksNiArMTA1NSw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCXBuZnNfaW5pdF9zZXJ2ZXIoc2VydmVyKTsKKwogCXJldHVybiBzZXJ2ZXI7CiB9CiAKQEAgLTEwMjksMTEgKzEwNjcsOCBAQAogewogCWRwcmludGsoIi0tPiBuZnNfZnJlZV9zZXJ2ZXIoKVxuIik7CiAKKwluZnNfc2VydmVyX3JlbW92ZV9saXN0cyhzZXJ2ZXIpOwogCXVuc2V0X3BuZnNfbGF5b3V0ZHJpdmVyKHNlcnZlcik7Ci0Jc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCWxpc3RfZGVsKCZzZXJ2ZXItPmNsaWVudF9saW5rKTsKLQlsaXN0X2RlbCgmc2VydmVyLT5tYXN0ZXJfbGluayk7Ci0Jc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CiAKIAlpZiAoc2VydmVyLT5kZXN0cm95ICE9IE5VTEwpCiAJCXNlcnZlci0+ZGVzdHJveShzZXJ2ZXIpOwpAQCAtMTEwOCwxMSArMTE0Myw3IEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHNlcnZlci0+ZnNpZC5tYWpvciwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc2VydmVyLT5mc2lkLm1pbm9yKTsKIAotCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPmNsaWVudF9saW5rLCAmc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zdXBlcmJsb2Nrcyk7Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5tYXN0ZXJfbGluaywgJm5mc192b2x1bWVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7Ci0KKwluZnNfc2VydmVyX2luc2VydF9saXN0cyhzZXJ2ZXIpOwogCXNlcnZlci0+bW91bnRfdGltZSA9IGppZmZpZXM7CiAJbmZzX2ZyZWVfZmF0dHIoZmF0dHIpOwogCXJldHVybiBzZXJ2ZXI7CkBAIC0xMTI1LDYgKzExNTYsMTAxIEBACiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAvKgorICogTkZTdjQuMCBjYWxsYmFjayB0aHJlYWQgaGVscGVyCisgKgorICogRmluZCBhIGNsaWVudCBieSBJUCBhZGRyZXNzLCBwcm90b2NvbCB2ZXJzaW9uLCBhbmQgbWlub3J2ZXJzaW9uCisgKgorICogQ2FsbGVkIGZyb20gdGhlIHBnX2F1dGhlbnRpY2F0ZSBtZXRob2QuIFRoZSBjYWxsYmFjayBpZGVudGlmaWVyCisgKiBpcyBub3QgdXNlZCBhcyBpdCBoYXMgbm90IGJlZW4gZGVjb2RlZC4KKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBjbGllbnQKKyAqLworc3RydWN0IG5mc19jbGllbnQgKgorbmZzNF9maW5kX2NsaWVudF9ub19pZGVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscDsKKworCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJm5mc19jbGllbnRfbGlzdCwgY2xfc2hhcmVfbGluaykgeworCQlpZiAobmZzNF9jYl9tYXRjaF9jbGllbnQoYWRkciwgY2xwLCAwKSA9PSBmYWxzZSkKKwkJCWNvbnRpbnVlOworCQlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisJCXJldHVybiBjbHA7CisJfQorCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCXJldHVybiBOVUxMOworfQorCisvKgorICogTkZTdjQuMCBjYWxsYmFjayB0aHJlYWQgaGVscGVyCisgKgorICogRmluZCBhIGNsaWVudCBieSBjYWxsYmFjayBpZGVudGlmaWVyCisgKi8KK3N0cnVjdCBuZnNfY2xpZW50ICoKK25mczRfZmluZF9jbGllbnRfaWRlbnQoaW50IGNiX2lkZW50KQoreworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisKKwlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7CisJY2xwID0gaWRyX2ZpbmQoJmNiX2lkZW50X2lkciwgY2JfaWRlbnQpOworCWlmIChjbHApCisJCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCXJldHVybiBjbHA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKKy8qCisgKiBORlN2NC4xIGNhbGxiYWNrIHRocmVhZCBoZWxwZXIKKyAqIEZvciBDQl9DT01QT1VORCBjYWxscywgZmluZCBhIGNsaWVudCBieSBJUCBhZGRyZXNzLCBwcm90b2NvbCB2ZXJzaW9uLAorICogbWlub3J2ZXJzaW9uLCBhbmQgc2Vzc2lvbklECisgKgorICogQ1JFQVRFX1NFU1NJT04gdHJpZ2dlcnMgYSBDQl9OVUxMIHBpbmcgZnJvbSBzZXJ2ZXJzLiBUaGUgY2FsbGJhY2sgc2VydmljZQorICogc2Vzc2lvbmlkIGNhbiBvbmx5IGJlIHNldCBhZnRlciB0aGUgQ1JFQVRFX1NFU1NJT04gcmV0dXJuLCBzbyBhIENCX05VTEwKKyAqIGNhbiBhcnJpdmUgYmVmb3JlIHRoZSBjYWxsYmFjayBzZXNzaW9uaWQgaXMgc2V0LiBGb3IgQ0JfTlVMTCBjYWxscywKKyAqIGZpbmQgYSBjbGllbnQgYnkgSVAgYWRkcmVzcyBwcm90b2NvbCB2ZXJzaW9uLCBhbmQgbWlub3J2ZXJzaW9uLgorICoKKyAqIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIGNsaWVudAorICovCitzdHJ1Y3QgbmZzX2NsaWVudCAqCituZnM0X2ZpbmRfY2xpZW50X3Nlc3Npb25pZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkgICBzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgKnNpZCwgaW50IGlzX2NiX2NvbXBvdW5kKQoreworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisKKwlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZuZnNfY2xpZW50X2xpc3QsIGNsX3NoYXJlX2xpbmspIHsKKwkJaWYgKG5mczRfY2JfbWF0Y2hfY2xpZW50KGFkZHIsIGNscCwgMSkgPT0gZmFsc2UpCisJCQljb250aW51ZTsKKworCQlpZiAoIW5mczRfaGFzX3Nlc3Npb24oY2xwKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1hdGNoIHNlc3Npb25pZCB1bmxlc3MgY2JfbnVsbCBjYWxsKi8KKwkJaWYgKGlzX2NiX2NvbXBvdW5kICYmIChtZW1jbXAoY2xwLT5jbF9zZXNzaW9uLT5zZXNzX2lkLmRhdGEsCisJCSAgICBzaWQtPmRhdGEsIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pICE9IDApKQorCQkJY29udGludWU7CisKKwkJYXRvbWljX2luYygmY2xwLT5jbF9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCQlyZXR1cm4gY2xwOworCX0KKwlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCisKK3N0cnVjdCBuZnNfY2xpZW50ICoKK25mczRfZmluZF9jbGllbnRfc2Vzc2lvbmlkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqc2lkLCBpbnQgaXNfY2JfY29tcG91bmQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCisKKy8qCiAgKiBJbml0aWFsaXplIHRoZSBORlM0IGNhbGxiYWNrIHNlcnZpY2UKICAqLwogc3RhdGljIGludCBuZnM0X2luaXRfY2FsbGJhY2soc3RydWN0IG5mc19jbGllbnQgKmNscCkKQEAgLTEzNDIsMTEgKzE0NjgsNyBAQAogCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlM0X01BWE5BTUxFTikKIAkJc2VydmVyLT5uYW1lbGVuID0gTkZTNF9NQVhOQU1MRU47CiAKLQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5jbGllbnRfbGluaywgJnNlcnZlci0+bmZzX2NsaWVudC0+Y2xfc3VwZXJibG9ja3MpOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bWFzdGVyX2xpbmssICZuZnNfdm9sdW1lX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCisJbmZzX3NlcnZlcl9pbnNlcnRfbGlzdHMoc2VydmVyKTsKIAlzZXJ2ZXItPm1vdW50X3RpbWUgPSBqaWZmaWVzOwogb3V0OgogCW5mc19mcmVlX2ZhdHRyKGZhdHRyKTsKQEAgLTE1NTEsMTEgKzE2NzMsNyBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfc2VydmVyOwogCi0Jc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+Y2xpZW50X2xpbmssICZzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3N1cGVyYmxvY2tzKTsKLQlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPm1hc3Rlcl9saW5rLCAmbmZzX3ZvbHVtZV9saXN0KTsKLQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQorCW5mc19zZXJ2ZXJfaW5zZXJ0X2xpc3RzKHNlcnZlcik7CiAJc2VydmVyLT5tb3VudF90aW1lID0gamlmZmllczsKIAogCW5mc19mcmVlX2ZhdHRyKGZhdHRyX2ZzaW5mbyk7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGVsZWdhdGlvbi5jIGIvZnMvbmZzL2RlbGVnYXRpb24uYwppbmRleCAxZmQ2MmZjLi4zNjRlNDMyIDEwMDY0NAotLS0gYS9mcy9uZnMvZGVsZWdhdGlvbi5jCisrKyBiL2ZzL25mcy9kZWxlZ2F0aW9uLmMKQEAgLTQwLDExICs0MCwyMyBAQAogCWNhbGxfcmN1KCZkZWxlZ2F0aW9uLT5yY3UsIG5mc19mcmVlX2RlbGVnYXRpb25fY2FsbGJhY2spOwogfQogCisvKioKKyAqIG5mc19tYXJrX2RlbGVnYXRpb25fcmVmZXJlbmNlZCAtIHNldCBkZWxlZ2F0aW9uJ3MgUkVGRVJFTkNFRCBmbGFnCisgKiBAZGVsZWdhdGlvbjogZGVsZWdhdGlvbiB0byBwcm9jZXNzCisgKgorICovCiB2b2lkIG5mc19tYXJrX2RlbGVnYXRpb25fcmVmZXJlbmNlZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCiB7CiAJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRUZFUkVOQ0VELCAmZGVsZWdhdGlvbi0+ZmxhZ3MpOwogfQogCisvKioKKyAqIG5mc19oYXZlX2RlbGVnYXRpb24gLSBjaGVjayBpZiBpbm9kZSBoYXMgYSBkZWxlZ2F0aW9uCisgKiBAaW5vZGU6IGlub2RlIHRvIGNoZWNrCisgKiBAZmxhZ3M6IGRlbGVnYXRpb24gdHlwZXMgdG8gY2hlY2sgZm9yCisgKgorICogUmV0dXJucyBvbmUgaWYgaW5vZGUgaGFzIHRoZSBpbmRpY2F0ZWQgZGVsZWdhdGlvbiwgb3RoZXJ3aXNlIHplcm8uCisgKi8KIGludCBuZnNfaGF2ZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGZtb2RlX3QgZmxhZ3MpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwpAQCAtMTE5LDEwICsxMzEsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNldCB1cCBhIGRlbGVnYXRpb24gb24gYW4gaW5vZGUKKy8qKgorICogbmZzX2lub2RlX3JlY2xhaW1fZGVsZWdhdGlvbiAtIHByb2Nlc3MgYSBkZWxlZ2F0aW9uIHJlY2xhaW0gcmVxdWVzdAorICogQGlub2RlOiBpbm9kZSB0byBwcm9jZXNzCisgKiBAY3JlZDogY3JlZGVudGlhbCB0byB1c2UgZm9yIHJlcXVlc3QKKyAqIEByZXM6IG5ldyBkZWxlZ2F0aW9uIHN0YXRlIGZyb20gc2VydmVyCisgKgogICovCi12b2lkIG5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3ZvaWQgbmZzX2lub2RlX3JlY2xhaW1fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsCisJCQkJICBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAJc3RydWN0IHJwY19jcmVkICpvbGRjcmVkID0gTlVMTDsKQEAgLTE3NSwzOCArMTkyLDUyIEBACiAJcmV0dXJuIGlub2RlOwogfQogCi1zdGF0aWMgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksCi0JCQkJCQkJICAgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkLAotCQkJCQkJCSAgIHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdGF0aWMgc3RydWN0IG5mc19kZWxlZ2F0aW9uICoKK25mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoc3RydWN0IG5mc19pbm9kZSAqbmZzaSwKKwkJCSAgICAgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24gPQogCQlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5mc2ktPmRlbGVnYXRpb24sCi0JCQkJCSAgbG9ja2RlcF9pc19oZWxkKCZjbHAtPmNsX2xvY2spKTsKKwkJCQlsb2NrZGVwX2lzX2hlbGQoJnNlcnZlci0+bmZzX2NsaWVudC0+Y2xfbG9jaykpOwogCiAJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCkKIAkJZ290byBub21hdGNoOworCiAJc3Bpbl9sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKLQlpZiAoc3RhdGVpZCAhPSBOVUxMICYmIG1lbWNtcChkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHN0YXRlaWQtPmRhdGEsCi0JCQkJc2l6ZW9mKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSkpICE9IDApCi0JCWdvdG8gbm9tYXRjaF91bmxvY2s7CiAJbGlzdF9kZWxfcmN1KCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0KTsKIAlkZWxlZ2F0aW9uLT5pbm9kZSA9IE5VTEw7CiAJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5mc2ktPmRlbGVnYXRpb24sIE5VTEwpOwogCXNwaW5fdW5sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIAlyZXR1cm4gZGVsZWdhdGlvbjsKLW5vbWF0Y2hfdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIG5vbWF0Y2g6CiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBTZXQgdXAgYSBkZWxlZ2F0aW9uIG9uIGFuIGlub2RlCitzdGF0aWMgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpuZnNfZGV0YWNoX2RlbGVnYXRpb24oc3RydWN0IG5mc19pbm9kZSAqbmZzaSwKKwkJCQkJCSAgICBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKG5mc2ksIHNlcnZlcik7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJcmV0dXJuIGRlbGVnYXRpb247Cit9CisKKy8qKgorICogbmZzX2lub2RlX3NldF9kZWxlZ2F0aW9uIC0gc2V0IHVwIGEgZGVsZWdhdGlvbiBvbiBhbiBpbm9kZQorICogQGlub2RlOiBpbm9kZSB0byB3aGljaCBkZWxlZ2F0aW9uIGFwcGxpZXMKKyAqIEBjcmVkOiBjcmVkIHRvIHVzZSBmb3Igc3Vic2VxdWVudCBkZWxlZ2F0aW9uIHByb2Nlc3NpbmcKKyAqIEByZXM6IG5ldyBkZWxlZ2F0aW9uIHN0YXRlIGZyb20gc2VydmVyCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUuCiAgKi8KIGludCBuZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mc19jbGllbnQ7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sICpvbGRfZGVsZWdhdGlvbjsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmZyZWVtZSA9IE5VTEw7CkBAIC0yMjcsNyArMjU4LDcgQEAKIAogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKIAlvbGRfZGVsZWdhdGlvbiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobmZzaS0+ZGVsZWdhdGlvbiwKLQkJCQkJCSAgIGxvY2tkZXBfaXNfaGVsZCgmY2xwLT5jbF9sb2NrKSk7CisJCQkJCWxvY2tkZXBfaXNfaGVsZCgmY2xwLT5jbF9sb2NrKSk7CiAJaWYgKG9sZF9kZWxlZ2F0aW9uICE9IE5VTEwpIHsKIAkJaWYgKG1lbWNtcCgmZGVsZWdhdGlvbi0+c3RhdGVpZCwgJm9sZF9kZWxlZ2F0aW9uLT5zdGF0ZWlkLAogCQkJCQlzaXplb2Yob2xkX2RlbGVnYXRpb24tPnN0YXRlaWQpKSA9PSAwICYmCkBAIC0yNDYsOSArMjc3LDkgQEAKIAkJCWRlbGVnYXRpb24gPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJZnJlZW1lID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChuZnNpLCBOVUxMLCBjbHApOworCQlmcmVlbWUgPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKG5mc2ksIHNlcnZlcik7CiAJfQotCWxpc3RfYWRkX3JjdSgmZGVsZWdhdGlvbi0+c3VwZXJfbGlzdCwgJmNscC0+Y2xfZGVsZWdhdGlvbnMpOworCWxpc3RfYWRkX3JjdSgmZGVsZWdhdGlvbi0+c3VwZXJfbGlzdCwgJnNlcnZlci0+ZGVsZWdhdGlvbnMpOwogCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSBkZWxlZ2F0aW9uLT50eXBlOwogCXJjdV9hc3NpZ25fcG9pbnRlcihuZnNpLT5kZWxlZ2F0aW9uLCBkZWxlZ2F0aW9uKTsKIAlkZWxlZ2F0aW9uID0gTlVMTDsKQEAgLTI5MCw3MyArMzIxLDg1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIFJldHVybiBhbGwgZGVsZWdhdGlvbnMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGZvciByZXR1cm4KKy8qKgorICogbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zIC0gcmV0dXJuIHByZXZpb3VzbHkgbWFya2VkIGRlbGVnYXRpb25zCisgKiBAY2xwOiBuZnNfY2xpZW50IHRvIHByb2Nlc3MKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KICAqLwogaW50IG5mc19jbGllbnRfcmV0dXJuX21hcmtlZF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJaW50IGVyciA9IDA7CiAKIHJlc3RhcnQ6CiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7Ci0JCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwgJmRlbGVnYXRpb24tPmZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2dyYWJfaW5vZGUoZGVsZWdhdGlvbik7Ci0JCWlmIChpbm9kZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoTkZTX0koaW5vZGUpLCBOVUxMLCBjbHApOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKLQkJCWZpbGVtYXBfZmx1c2goaW5vZGUtPmlfbWFwcGluZyk7Ci0JCQllcnIgPSBfX25mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbiwgMCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJnNlcnZlci0+ZGVsZWdhdGlvbnMsCisJCQkJCQkJCXN1cGVyX2xpc3QpIHsKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwKKwkJCQkJCQkmZGVsZWdhdGlvbi0+ZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCQkJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9ncmFiX2lub2RlKGRlbGVnYXRpb24pOworCQkJaWYgKGlub2RlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uKE5GU19JKGlub2RlKSwKKwkJCQkJCQkJc2VydmVyKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCisJCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKSB7CisJCQkJZmlsZW1hcF9mbHVzaChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQllcnIgPSBfX25mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwKKwkJCQkJCQkJZGVsZWdhdGlvbiwgMCk7CisJCQl9CisJCQlpcHV0KGlub2RlKTsKKwkJCWlmICghZXJyKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKKwkJCXJldHVybiBlcnI7CiAJCX0KLQkJaXB1dChpbm9kZSk7Ci0JCWlmICghZXJyKQotCQkJZ290byByZXN0YXJ0OwotCQlzZXRfYml0KE5GUzRDTE5UX0RFTEVHUkVUVVJOLCAmY2xwLT5jbF9zdGF0ZSk7Ci0JCXJldHVybiBlcnI7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAwOwogfQogCi0vKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkZWxlZ2F0aW9uIHdpdGhvdXQgcmVjbGFpbWluZyBvcGVucwotICogb3IgcHJvdGVjdGluZyBhZ2FpbnN0IGRlbGVnYXRpb24gcmVjbGFpbXMuCi0gKiBJdCBpcyB0aGVyZWZvcmUgcmVhbGx5IG9ubHkgc2FmZSB0byBiZSBjYWxsZWQgZnJvbQotICogbmZzNF9jbGVhcl9pbm9kZSgpCisvKioKKyAqIG5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbl9ub3JlY2xhaW0gLSByZXR1cm4gZGVsZWdhdGlvbiwgZG9uJ3QgcmVjbGFpbSBvcGVucworICogQGlub2RlOiBpbm9kZSB0byBwcm9jZXNzCisgKgorICogRG9lcyBub3QgcHJvdGVjdCBhZ2FpbnN0IGRlbGVnYXRpb24gcmVjbGFpbXMsIHRoZXJlZm9yZSByZWFsbHkgb25seSBzYWZlCisgKiB0byBiZSBjYWxsZWQgZnJvbSBuZnM0X2NsZWFyX2lub2RlKCkuCiAgKi8KIHZvaWQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uX25vcmVjbGFpbShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAKIAlpZiAocmN1X2FjY2Vzc19wb2ludGVyKG5mc2ktPmRlbGVnYXRpb24pICE9IE5VTEwpIHsKLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChuZnNpLCBOVUxMLCBjbHApOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbihuZnNpLCBzZXJ2ZXIpOwogCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQogCQkJbmZzX2RvX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uLCAwKTsKIAl9CiB9CiAKKy8qKgorICogbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uIC0gc3luY2hyb25vdXNseSByZXR1cm4gYSBkZWxlZ2F0aW9uCisgKiBAaW5vZGU6IGlub2RlIHRvIHByb2Nlc3MKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqLwogaW50IG5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAJaW50IGVyciA9IDA7CiAKIAlpZiAocmN1X2FjY2Vzc19wb2ludGVyKG5mc2ktPmRlbGVnYXRpb24pICE9IE5VTEwpIHsKLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChuZnNpLCBOVUxMLCBjbHApOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbihuZnNpLCBzZXJ2ZXIpOwogCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKSB7CiAJCQluZnNfd2JfYWxsKGlub2RlKTsKIAkJCWVyciA9IF9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uLCAxKTsKQEAgLTM2NSw0NiArNDA4LDYxIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQorc3RhdGljIHZvaWQgbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uKQogeworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGRlbGVnYXRpb24tPmlub2RlKS0+bmZzX2NsaWVudDsKKwogCXNldF9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpOwogCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKIH0KIAotLyoKLSAqIFJldHVybiBhbGwgZGVsZWdhdGlvbnMgYXNzb2NpYXRlZCB0byBhIHN1cGVyIGJsb2NrCisvKioKKyAqIG5mc19zdXBlcl9yZXR1cm5fYWxsX2RlbGVnYXRpb25zIC0gcmV0dXJuIGRlbGVnYXRpb25zIGZvciBvbmUgc3VwZXJibG9jaworICogQHNiOiBzYiB0byBwcm9jZXNzCisgKgogICovCiB2b2lkIG5mc19zdXBlcl9yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TQihzYiktPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAKIAlpZiAoY2xwID09IE5VTEwpCiAJCXJldHVybjsKKwogCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZzZXJ2ZXItPmRlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CiAJCXNwaW5fbG9jaygmZGVsZWdhdGlvbi0+bG9jayk7Ci0JCWlmIChkZWxlZ2F0aW9uLT5pbm9kZSAhPSBOVUxMICYmIGRlbGVnYXRpb24tPmlub2RlLT5pX3NiID09IHNiKQotCQkJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRVRVUk4sICZkZWxlZ2F0aW9uLT5mbGFncyk7CisJCXNldF9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpOwogCQlzcGluX3VubG9jaygmZGVsZWdhdGlvbi0+bG9jayk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOworCiAJaWYgKG5mc19jbGllbnRfcmV0dXJuX21hcmtlZF9kZWxlZ2F0aW9ucyhjbHApICE9IDApCiAJCW5mczRfc2NoZWR1bGVfc3RhdGVfbWFuYWdlcihjbHApOwogfQogCi1zdGF0aWMKLXZvaWQgbmZzX2NsaWVudF9tYXJrX3JldHVybl9hbGxfZGVsZWdhdGlvbl90eXBlcyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBmbW9kZV90IGZsYWdzKQorc3RhdGljIHZvaWQgbmZzX21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJCQkgZm1vZGVfdCBmbGFncykKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmc2VydmVyLT5kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgewogCQlpZiAoKGRlbGVnYXRpb24tPnR5cGUgPT0gKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKSAmJiAhKGZsYWdzICYgRk1PREVfV1JJVEUpKQogCQkJY29udGludWU7CiAJCWlmIChkZWxlZ2F0aW9uLT50eXBlICYgZmxhZ3MpCi0JCQluZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihjbHAsIGRlbGVnYXRpb24pOworCQkJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oZGVsZWdhdGlvbik7CiAJfQorfQorCitzdGF0aWMgdm9pZCBuZnNfY2xpZW50X21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCisJCQkJCQkJZm1vZGVfdCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKQorCQluZnNfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoc2VydmVyLCBmbGFncyk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKQEAgLTQxOSwxOSArNDc3LDMyIEBACiAJCW5mczRfc2NoZWR1bGVfc3RhdGVfbWFuYWdlcihjbHApOwogfQogCisvKioKKyAqIG5mc19leHBpcmVfYWxsX2RlbGVnYXRpb25fdHlwZXMKKyAqIEBjbHA6IGNsaWVudCB0byBwcm9jZXNzCisgKiBAZmxhZ3M6IGRlbGVnYXRpb24gdHlwZXMgdG8gZXhwaXJlCisgKgorICovCiB2b2lkIG5mc19leHBpcmVfYWxsX2RlbGVnYXRpb25fdHlwZXMoc3RydWN0IG5mc19jbGllbnQgKmNscCwgZm1vZGVfdCBmbGFncykKIHsKIAluZnNfY2xpZW50X21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNscCwgZmxhZ3MpOwogCW5mc19kZWxlZ2F0aW9uX3J1bl9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKKy8qKgorICogbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbnMKKyAqIEBjbHA6IGNsaWVudCB0byBwcm9jZXNzCisgKgorICovCiB2b2lkIG5mc19leHBpcmVfYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhjbHAsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwogfQogCi0vKgotICogUmV0dXJuIGFsbCBkZWxlZ2F0aW9ucyBmb2xsb3dpbmcgYW4gTkZTNEVSUl9DQl9QQVRIX0RPV04gZXJyb3IuCisvKioKKyAqIG5mc19oYW5kbGVfY2JfcGF0aGRvd24gLSByZXR1cm4gYWxsIGRlbGVnYXRpb25zIGFmdGVyIE5GUzRFUlJfQ0JfUEFUSF9ET1dOCisgKiBAY2xwOiBjbGllbnQgdG8gcHJvY2VzcworICoKICAqLwogdm9pZCBuZnNfaGFuZGxlX2NiX3BhdGhkb3duKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CkBAIC00NDAsMjkgKzUxMSw0MyBAQAogCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKGNscCk7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc19jbGllbnRfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCitzdGF0aWMgdm9pZCBuZnNfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJnNlcnZlci0+ZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChORlNfREVMRUdBVElPTl9SRUZFUkVOQ0VELCAmZGVsZWdhdGlvbi0+ZmxhZ3MpKQogCQkJY29udGludWU7Ci0JCW5mc19tYXJrX3JldHVybl9kZWxlZ2F0aW9uKGNscCwgZGVsZWdhdGlvbik7CisJCW5mc19tYXJrX3JldHVybl9kZWxlZ2F0aW9uKGRlbGVnYXRpb24pOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAorLyoqCisgKiBuZnNfZXhwaXJlX3VucmVmZXJlbmNlZF9kZWxlZ2F0aW9ucyAtIEVsaW1pbmF0ZSB1bnVzZWQgZGVsZWdhdGlvbnMKKyAqIEBjbHA6IG5mc19jbGllbnQgdG8gcHJvY2VzcworICoKKyAqLwogdm9pZCBuZnNfZXhwaXJlX3VucmVmZXJlbmNlZF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCW5mc19jbGllbnRfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKGNscCk7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykKKwkJbmZzX21hcmtfcmV0dXJuX3VucmVmZXJlbmNlZF9kZWxlZ2F0aW9ucyhzZXJ2ZXIpOworCXJjdV9yZWFkX3VubG9jaygpOworCiAJbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKIH0KIAotLyoKLSAqIEFzeW5jaHJvbm91cyBkZWxlZ2F0aW9uIHJlY2FsbCEKKy8qKgorICogbmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uIC0gYXN5bmNocm9ub3VzbHkgcmV0dXJuIGEgZGVsZWdhdGlvbgorICogQGlub2RlOiBpbm9kZSB0byBwcm9jZXNzCisgKiBAc3RhdGVpZDogc3RhdGUgSUQgaW5mb3JtYXRpb24gZnJvbSBDQl9SRUNBTEwgYXJndW1lbnRzCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUuCiAgKi8KLWludCBuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQoraW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKIHsKIAlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NFUlZFUihpbm9kZSktPm5mc19jbGllbnQ7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwpAQCAtNDc0LDIyICs1NTksMjEgQEAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQotCW5mc19tYXJrX3JldHVybl9kZWxlZ2F0aW9uKGNscCwgZGVsZWdhdGlvbik7CisJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oZGVsZWdhdGlvbik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAluZnNfZGVsZWdhdGlvbl9ydW5fc3RhdGVfbWFuYWdlcihjbHApOwogCXJldHVybiAwOwogfQogCi0vKgotICogUmV0cmlldmUgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCBhIGRlbGVnYXRpb24KLSAqLwotc3RydWN0IGlub2RlICpuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitzdGF0aWMgc3RydWN0IGlub2RlICoKK25mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGVfc2VydmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOwogCXN0cnVjdCBpbm9kZSAqcmVzID0gTlVMTDsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZzZXJ2ZXItPmRlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CiAJCXNwaW5fbG9jaygmZGVsZWdhdGlvbi0+bG9jayk7CiAJCWlmIChkZWxlZ2F0aW9uLT5pbm9kZSAhPSBOVUxMICYmCiAJCSAgICBuZnNfY29tcGFyZV9maChmaGFuZGxlLCAmTkZTX0koZGVsZWdhdGlvbi0+aW5vZGUpLT5maCkgPT0gMCkgewpAQCAtNDk5LDQ5ICs1ODMsMTIxIEBACiAJCWlmIChyZXMgIT0gTlVMTCkKIAkJCWJyZWFrOwogCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUgLSByZXRyaWV2ZSB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZGVsZWdhdGlvbgorICogQGNscDogY2xpZW50IHN0YXRlIGhhbmRsZQorICogQGZoYW5kbGU6IGZpbGVoYW5kbGUgZnJvbSBhIGRlbGVnYXRpb24gcmVjYWxsCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIGlub2RlIG1hdGNoaW5nICJmaGFuZGxlLCIgb3IgTlVMTCBpZiBhIG1hdGNoaW5nIGlub2RlCisgKiBjYW5ub3QgYmUgZm91bmQuCisgKi8KK3N0cnVjdCBpbm9kZSAqbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQkJCQljb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGlub2RlICpyZXMgPSBOVUxMOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKSB7CisJCXJlcyA9IG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGVfc2VydmVyKHNlcnZlciwgZmhhbmRsZSk7CisJCWlmIChyZXMgIT0gTlVMTCkKKwkJCWJyZWFrOworCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmVzOwogfQogCi0vKgotICogTWFyayBhbGwgZGVsZWdhdGlvbnMgYXMgbmVlZGluZyB0byBiZSByZWNsYWltZWQKK3N0YXRpYyB2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbV9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmc2VydmVyLT5kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkKKwkJc2V0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncyk7Cit9CisKKy8qKgorICogbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltIC0gbWFyayBhbGwgZGVsZWdhdGlvbnMgYXMgbmVlZGluZyB0byBiZSByZWNsYWltZWQKKyAqIEBjbHA6IG5mc19jbGllbnQgdG8gcHJvY2VzcworICoKICAqLwogdm9pZCBuZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0oc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKLQlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwogCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkKLQkJc2V0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspCisJCW5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbV9zZXJ2ZXIoc2VydmVyKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotLyoKLSAqIFJlYXAgYWxsIHVuY2xhaW1lZCBkZWxlZ2F0aW9ucyBhZnRlciByZWJvb3QgcmVjb3ZlcnkgaXMgZG9uZQorLyoqCisgKiBuZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZCAtIHJlYXAgdW5jbGFpbWVkIGRlbGVnYXRpb25zIGFmdGVyIHJlYm9vdCByZWNvdmVyeSBpcyBkb25lCisgKiBAY2xwOiBuZnNfY2xpZW50IHRvIHByb2Nlc3MKKyAqCiAgKi8KIHZvaWQgbmZzX2RlbGVnYXRpb25fcmVhcF91bmNsYWltZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCiByZXN0YXJ0OgogCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgewotCQlpZiAodGVzdF9iaXQoTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpID09IDApCi0JCQljb250aW51ZTsKLQkJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9ncmFiX2lub2RlKGRlbGVnYXRpb24pOwotCQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKE5GU19JKGlub2RlKSwgTlVMTCwgY2xwKTsKLQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQotCQkJbmZzX2ZyZWVfZGVsZWdhdGlvbihkZWxlZ2F0aW9uKTsKLQkJaXB1dChpbm9kZSk7Ci0JCWdvdG8gcmVzdGFydDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmc2VydmVyLT5kZWxlZ2F0aW9ucywKKwkJCQkJCQkJc3VwZXJfbGlzdCkgeworCQkJaWYgKHRlc3RfYml0KE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSwKKwkJCQkJCSZkZWxlZ2F0aW9uLT5mbGFncykgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZ3JhYl9pbm9kZShkZWxlZ2F0aW9uKTsKKwkJCWlmIChpbm9kZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbihORlNfSShpbm9kZSksCisJCQkJCQkJCXNlcnZlcik7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQkJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkKKwkJCQluZnNfZnJlZV9kZWxlZ2F0aW9uKGRlbGVnYXRpb24pOworCQkJaXB1dChpbm9kZSk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKKy8qKgorICogbmZzX2RlbGVnYXRpb25zX3ByZXNlbnQgLSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIGRlbGVnYXRpb25zCisgKiBAY2xwOiBjbGllbnQgc3RhdGUgaGFuZGxlCisgKgorICogUmV0dXJucyBvbmUgaWYgdGhlcmUgYXJlIGFueSBuZnNfZGVsZWdhdGlvbiBzdHJ1Y3R1cmVzIGF0dGFjaGVkCisgKiB0byB0aGlzIG5mc19jbGllbnQuCisgKi8KK2ludCBuZnNfZGVsZWdhdGlvbnNfcHJlc2VudChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspCisJCWlmICghbGlzdF9lbXB0eSgmc2VydmVyLT5kZWxlZ2F0aW9ucykpIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbmZzNF9jb3B5X2RlbGVnYXRpb25fc3RhdGVpZCAtIENvcHkgaW5vZGUncyBzdGF0ZSBJRCBpbmZvcm1hdGlvbgorICogQGRzdDogc3RhdGVpZCBkYXRhIHN0cnVjdHVyZSB0byBmaWxsIGluCisgKiBAaW5vZGU6IGlub2RlIHRvIGNoZWNrCisgKgorICogUmV0dXJucyBvbmUgYW5kIGZpbGxzIGluICJkc3QtPmRhdGEiICogaWYgaW5vZGUgaGFkIGEgZGVsZWdhdGlvbiwKKyAqIG90aGVyd2lzZSB6ZXJvIGlzIHJldHVybmVkLgorICovCiBpbnQgbmZzNF9jb3B5X2RlbGVnYXRpb25fc3RhdGVpZChuZnM0X3N0YXRlaWQgKmRzdCwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RlbGVnYXRpb24uaCBiL2ZzL25mcy9kZWxlZ2F0aW9uLmgKaW5kZXggMjAyNjMwNC4uZDkzMjJlNCAxMDA2NDQKLS0tIGEvZnMvbmZzL2RlbGVnYXRpb24uaAorKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5oCkBAIC00NCw2ICs0NCw3IEBACiB2b2lkIG5mc19leHBpcmVfdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogdm9pZCBuZnNfaGFuZGxlX2NiX3BhdGhkb3duKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogaW50IG5mc19jbGllbnRfcmV0dXJuX21hcmtlZF9kZWxlZ2F0aW9ucyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKK2ludCBuZnNfZGVsZWdhdGlvbnNfcHJlc2VudChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKIAogdm9pZCBuZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0oc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiB2b2lkIG5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IGQzM2RhNTMuLmRmOGMwM2EgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTMzLDggKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogCiAjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgogI2luY2x1ZGUgImlvc3RhdC5oIgpAQCAtMTI1LDkgKzEyNSwxMCBAQAogCS5wZXJtaXNzaW9uCT0gbmZzX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKIAkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAotCS5nZXR4YXR0ciAgICAgICA9IG5mczRfZ2V0eGF0dHIsCi0JLnNldHhhdHRyICAgICAgID0gbmZzNF9zZXR4YXR0ciwKLQkubGlzdHhhdHRyICAgICAgPSBuZnM0X2xpc3R4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGdlbmVyaWNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogCiAjZW5kaWYgLyogQ09ORklHX05GU19WNCAqLwpAQCAtMTcyLDcgKzE3Myw3IEBACiAJc3RydWN0IG5mc19jYWNoZV9hcnJheV9lbnRyeSBhcnJheVswXTsKIH07CiAKLXR5cGVkZWYgX19iZTMyICogKCpkZWNvZGVfZGlyZW50X3QpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50KTsKK3R5cGVkZWYgaW50ICgqZGVjb2RlX2RpcmVudF90KShzdHJ1Y3QgeGRyX3N0cmVhbSAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiB0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGZpbGUJKmZpbGU7CiAJc3RydWN0IHBhZ2UJKnBhZ2U7CkBAIC0zNzgsMTQgKzM3OSwxNCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotLyogRmlsbCBpbiBhbiBlbnRyeSBiYXNlZCBvbiB0aGUgeGRyIGNvZGUgc3RvcmVkIGluIGRlc2MtPnBhZ2UgKi8KLXN0YXRpYwotaW50IHhkcl9kZWNvZGUobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgc3RydWN0IHhkcl9zdHJlYW0gKnN0cmVhbSkKK3N0YXRpYyBpbnQgeGRyX2RlY29kZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsCisJCSAgICAgIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCV9fYmUzMiAqcCA9IGRlc2MtPmRlY29kZShzdHJlYW0sIGVudHJ5LCBORlNfU0VSVkVSKGRlc2MtPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLCBkZXNjLT5wbHVzKTsKLQlpZiAoSVNfRVJSKHApKQotCQlyZXR1cm4gUFRSX0VSUihwKTsKKwlpbnQgZXJyb3I7CiAKKwllcnJvciA9IGRlc2MtPmRlY29kZSh4ZHIsIGVudHJ5LCBkZXNjLT5wbHVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAllbnRyeS0+ZmF0dHItPnRpbWVfc3RhcnQgPSBkZXNjLT50aW1lc3RhbXA7CiAJZW50cnktPmZhdHRyLT5nZW5jb3VudCA9IGRlc2MtPmdlbmNvdW50OwogCXJldHVybiAwOwpAQCAtNDM4LDcgKzQzOSw2IEBACiAJaWYgKGRlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgTkZTX1BST1RPKGRpciktPmRlbnRyeV9vcHMpOwogCWlub2RlID0gbmZzX2ZoZ2V0KGRlbnRyeS0+ZF9zYiwgZW50cnktPmZoLCBlbnRyeS0+ZmF0dHIpOwogCWlmIChJU19FUlIoaW5vZGUpKQogCQlnb3RvIG91dDsKQEAgLTQ1OSwyNSArNDU5LDI2IEBACiAvKiBQZXJmb3JtIGNvbnZlcnNpb24gZnJvbSB4ZHIgdG8gY2FjaGUgYXJyYXkgKi8KIHN0YXRpYwogaW50IG5mc19yZWFkZGlyX3BhZ2VfZmlsbGVyKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IG5mc19lbnRyeSAqZW50cnksCi0JCQkJdm9pZCAqeGRyX3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQorCQkJCXN0cnVjdCBwYWdlICoqeGRyX3BhZ2VzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGJ1ZmxlbikKIHsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSBzdHJlYW07Ci0Jc3RydWN0IHhkcl9idWYgYnVmOwotCV9fYmUzMiAqcHRyID0geGRyX3BhZ2U7CisJc3RydWN0IHhkcl9idWYgYnVmID0geworCQkucGFnZXMgPSB4ZHJfcGFnZXMsCisJCS5wYWdlX2xlbiA9IGJ1ZmxlbiwKKwkJLmJ1ZmxlbiA9IGJ1ZmxlbiwKKwkJLmxlbiA9IGJ1ZmxlbiwKKwl9OworCXN0cnVjdCBwYWdlICpzY3JhdGNoOwogCXN0cnVjdCBuZnNfY2FjaGVfYXJyYXkgKmFycmF5OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJaW50IHN0YXR1czsKIAotCWJ1Zi5oZWFkLT5pb3ZfYmFzZSA9IHhkcl9wYWdlOwotCWJ1Zi5oZWFkLT5pb3ZfbGVuID0gYnVmbGVuOwotCWJ1Zi50YWlsLT5pb3ZfbGVuID0gMDsKLQlidWYucGFnZV9iYXNlID0gMDsKLQlidWYucGFnZV9sZW4gPSAwOwotCWJ1Zi5idWZsZW4gPSBidWYuaGVhZC0+aW92X2xlbjsKLQlidWYubGVuID0gYnVmLmhlYWQtPmlvdl9sZW47CisJc2NyYXRjaCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHNjcmF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnN0cmVhbSwgJmJ1ZiwgcHRyKTsKLQorCXhkcl9pbml0X2RlY29kZSgmc3RyZWFtLCAmYnVmLCBOVUxMKTsKKwl4ZHJfc2V0X3NjcmF0Y2hfYnVmZmVyKCZzdHJlYW0sIHBhZ2VfYWRkcmVzcyhzY3JhdGNoKSwgUEFHRV9TSVpFKTsKIAogCWRvIHsKIAkJc3RhdHVzID0geGRyX2RlY29kZShkZXNjLCBlbnRyeSwgJnN0cmVhbSk7CkBAIC01MDYsNiArNTA3LDggQEAKIAkJfSBlbHNlCiAJCQlzdGF0dXMgPSBQVFJfRVJSKGFycmF5KTsKIAl9CisKKwlwdXRfcGFnZShzY3JhdGNoKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC01MjEsNyArNTI0LDYgQEAKIHZvaWQgbmZzX3JlYWRkaXJfZnJlZV9sYXJnZV9wYWdlKHZvaWQgKnB0ciwgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJdW5zaWduZWQgaW50IG5wYWdlcykKIHsKLQl2bV91bm1hcF9yYW0ocHRyLCBucGFnZXMpOwogCW5mc19yZWFkZGlyX2ZyZWVfcGFnZWFycmF5KHBhZ2VzLCBucGFnZXMpOwogfQogCkBAIC01MzAsOSArNTMyLDggQEAKICAqIHRvIG5mc19yZWFkZGlyX2ZyZWVfbGFyZ2VfcGFnZQogICovCiBzdGF0aWMKLXZvaWQgKm5mc19yZWFkZGlyX2xhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG5wYWdlcykKK2ludCBuZnNfcmVhZGRpcl9sYXJnZV9wYWdlKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBucGFnZXMpCiB7Ci0Jdm9pZCAqcHRyOwogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CkBAIC01NDEsMTMgKzU0MiwxMSBAQAogCQkJZ290byBvdXRfZnJlZXBhZ2VzOwogCQlwYWdlc1tpXSA9IHBhZ2U7CiAJfQorCXJldHVybiAwOwogCi0JcHRyID0gdm1fbWFwX3JhbShwYWdlcywgbnBhZ2VzLCAwLCBQQUdFX0tFUk5FTCk7Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChwdHIpKQotCQlyZXR1cm4gcHRyOwogb3V0X2ZyZWVwYWdlczoKIAluZnNfcmVhZGRpcl9mcmVlX3BhZ2VhcnJheShwYWdlcywgaSk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYwpAQCAtNTY2LDYgKzU2NSw3IEBACiAJZW50cnkuZW9mID0gMDsKIAllbnRyeS5maCA9IG5mc19hbGxvY19maGFuZGxlKCk7CiAJZW50cnkuZmF0dHIgPSBuZnNfYWxsb2NfZmF0dHIoKTsKKwllbnRyeS5zZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKIAlpZiAoZW50cnkuZmggPT0gTlVMTCB8fCBlbnRyeS5mYXR0ciA9PSBOVUxMKQogCQlnb3RvIG91dDsKIApAQCAtNTc3LDggKzU3Nyw4IEBACiAJbWVtc2V0KGFycmF5LCAwLCBzaXplb2Yoc3RydWN0IG5mc19jYWNoZV9hcnJheSkpOwogCWFycmF5LT5lb2ZfaW5kZXggPSAtMTsKIAotCXBhZ2VzX3B0ciA9IG5mc19yZWFkZGlyX2xhcmdlX3BhZ2UocGFnZXMsIGFycmF5X3NpemUpOwotCWlmICghcGFnZXNfcHRyKQorCXN0YXR1cyA9IG5mc19yZWFkZGlyX2xhcmdlX3BhZ2UocGFnZXMsIGFycmF5X3NpemUpOworCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIG91dF9yZWxlYXNlX2FycmF5OwogCWRvIHsKIAkJdW5zaWduZWQgaW50IHBnbGVuOwpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJCWlmIChzdGF0dXMgPCAwKQogCQkJYnJlYWs7CiAJCXBnbGVuID0gc3RhdHVzOwotCQlzdGF0dXMgPSBuZnNfcmVhZGRpcl9wYWdlX2ZpbGxlcihkZXNjLCAmZW50cnksIHBhZ2VzX3B0ciwgcGFnZSwgcGdsZW4pOworCQlzdGF0dXMgPSBuZnNfcmVhZGRpcl9wYWdlX2ZpbGxlcihkZXNjLCAmZW50cnksIHBhZ2VzLCBwYWdlLCBwZ2xlbik7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlpZiAoc3RhdHVzID09IC1FTk9TUEMpCiAJCQkJc3RhdHVzID0gMDsKQEAgLTExOTIsOCArMTE5Miw2IEBACiAJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5GU19TRVJWRVIoZGlyKS0+bmFtZWxlbikKIAkJZ290byBvdXQ7CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgTkZTX1BST1RPKGRpciktPmRlbnRyeV9vcHMpOwotCiAJLyoKIAkgKiBJZiB3ZSdyZSBkb2luZyBhbiBleGNsdXNpdmUgY3JlYXRlLCBvcHRpbWl6ZSBhd2F5IHRoZSBsb29rdXAKIAkgKiBidXQgZG9uJ3QgaGFzaCB0aGUgZGVudHJ5LgpAQCAtMTIyMSw3ICsxMjE5LDcgQEAKIAkJZ290byBvdXRfdW5ibG9ja19zaWxseXJlbmFtZTsKIAl9CiAJaW5vZGUgPSBuZnNfZmhnZXQoZGVudHJ5LT5kX3NiLCBmaGFuZGxlLCBmYXR0cik7Ci0JcmVzID0gKHN0cnVjdCBkZW50cnkgKilpbm9kZTsKKwlyZXMgPSBFUlJfQ0FTVChpbm9kZSk7CiAJaWYgKElTX0VSUihyZXMpKQogCQlnb3RvIG91dF91bmJsb2NrX3NpbGx5cmVuYW1lOwogCkBAIC0xMzM3LDcgKzEzMzUsNiBAQAogCQlyZXMgPSBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCQlnb3RvIG91dDsKIAl9Ci0JZF9zZXRfZF9vcChkZW50cnksIE5GU19QUk9UTyhkaXIpLT5kZW50cnlfb3BzKTsKIAogCS8qIExldCB2ZnNfY3JlYXRlKCkgZGVhbCB3aXRoIE9fRVhDTC4gSW5zdGFudGlhdGUsIGJ1dCBkb24ndCBoYXNoCiAJICogdGhlIGRlbnRyeS4gKi8KQEAgLTEzNTUsOCArMTM1Miw3IEBACiAJaWYgKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpIHsKIAkJYXR0ci5pYV9tb2RlID0gbmQtPmludGVudC5vcGVuLmNyZWF0ZV9tb2RlOwogCQlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOwotCQlpZiAoIUlTX1BPU0lYQUNMKGRpcikpCi0JCQlhdHRyLmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKKwkJYXR0ci5pYV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfSBlbHNlIHsKIAkJb3Blbl9mbGFncyAmPSB+KE9fRVhDTCB8IE9fQ1JFQVQpOwogCQlhdHRyLmlhX3ZhbGlkID0gMDsKQEAgLTE0MTAsMTEgKzE0MDYsMTUgQEAKIHN0YXRpYyBpbnQgbmZzX29wZW5fcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBpbm9kZSAqZGlyOwogCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CiAJaW50IG9wZW5mbGFncywgcmV0ID0gMDsKIAorCWlmIChuZC0+ZmxhZ3MgJiBMT09LVVBfUkNVKQorCQlyZXR1cm4gLUVDSElMRDsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCWlmICghaXNfYXRvbWljX29wZW4obmQpIHx8IGRfbW91bnRwb2ludChkZW50cnkpKQogCQlnb3RvIG5vX29wZW47CiAKQEAgLTE1ODMsNiArMTU4Myw3IEBACiB7CiAJc3RydWN0IGlhdHRyIGF0dHI7CiAJaW50IGVycm9yOworCWludCBvcGVuX2ZsYWdzID0gMDsKIAogCWRmcHJpbnRrKFZGUywgIk5GUzogY3JlYXRlKCVzLyVsZCksICVzXG4iLAogCQkJZGlyLT5pX3NiLT5zX2lkLCBkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKQEAgLTE1OTAsNyArMTU5MSwxMCBAQAogCWF0dHIuaWFfbW9kZSA9IG1vZGU7CiAJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKIAotCWVycm9yID0gTkZTX1BST1RPKGRpciktPmNyZWF0ZShkaXIsIGRlbnRyeSwgJmF0dHIsIDAsIE5VTEwpOworCWlmICgobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgIT0gMCkKKwkJb3Blbl9mbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFnczsKKworCWVycm9yID0gTkZTX1BST1RPKGRpciktPmNyZWF0ZShkaXIsIGRlbnRyeSwgJmF0dHIsIG9wZW5fZmxhZ3MsIE5VTEwpOwogCWlmIChlcnJvciAhPSAwKQogCQlnb3RvIG91dF9lcnI7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9uZnMvZ2V0cm9vdC5jIGIvZnMvbmZzL2dldHJvb3QuYwppbmRleCA1NTk2YzZhLi5iNWZmZThmYSAxMDA2NDQKLS0tIGEvZnMvbmZzL2dldHJvb3QuYworKysgYi9mcy9uZnMvZ2V0cm9vdC5jCkBAIC0xMTksOSArMTE5LDYgQEAKIAl9CiAKIAlzZWN1cml0eV9kX2luc3RhbnRpYXRlKHJldCwgaW5vZGUpOwotCi0JaWYgKHJldC0+ZF9vcCA9PSBOVUxMKQotCQlkX3NldF9kX29wKHJldCwgc2VydmVyLT5uZnNfY2xpZW50LT5ycGNfb3BzLT5kZW50cnlfb3BzKTsKIG91dDoKIAluZnNfZnJlZV9mYXR0cihmc2luZm8uZmF0dHIpOwogCXJldHVybiByZXQ7CkBAIC0yMjcsOSArMjI0LDYgQEAKIAogCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUocmV0LCBpbm9kZSk7CiAKLQlpZiAocmV0LT5kX29wID09IE5VTEwpCi0JCWRfc2V0X2Rfb3AocmV0LCBzZXJ2ZXItPm5mc19jbGllbnQtPnJwY19vcHMtPmRlbnRyeV9vcHMpOwotCiBvdXQ6CiAJbmZzX2ZyZWVfZmF0dHIoZmF0dHIpOwogCWRwcmludGsoIjwtLSBuZnM0X2dldF9yb290KClcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lkbWFwLmMgYi9mcy9uZnMvaWRtYXAuYwppbmRleCA0ZTJkOWI2Li4xODY5Njg4IDEwMDY0NAotLS0gYS9mcy9uZnMvaWRtYXAuYworKysgYi9mcy9uZnMvaWRtYXAuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJcmV0dXJuIG5mc19pZG1hcF9sb29rdXBfbmFtZShnaWQsICJncm91cCIsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotI2Vsc2UgIC8qIENPTkZJR19ORlNfVVNFX0lETUFQUEVSIG5vdCBkZWZpbmVkICovCisjZWxzZSAgLyogQ09ORklHX05GU19VU0VfTkVXX0lETUFQUEVSIG5vdCBkZWZpbmVkICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCAwMTdkYWEzLi5jZTAwYjcwIDEwMDY0NAotLS0gYS9mcy9uZnMvaW5vZGUuYworKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtMTQxMCw5ICsxNDEwLDkgQEAKICAqLwogdm9pZCBuZnM0X2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJcG5mc19kZXN0cm95X2xheW91dChORlNfSShpbm9kZSkpOwogCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAllbmRfd3JpdGViYWNrKGlub2RlKTsKLQlwbmZzX2Rlc3Ryb3lfbGF5b3V0KE5GU19JKGlub2RlKSk7CiAJLyogSWYgd2UgYXJlIGhvbGRpbmcgYSBkZWxlZ2F0aW9uLCByZXR1cm4gaXQhICovCiAJbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uX25vcmVjbGFpbShpbm9kZSk7CiAJLyogRmlyc3QgY2FsbCBzdGFuZGFyZCBORlMgY2xlYXJfaW5vZGUoKSBjb2RlICovCkBAIC0xNjE5LDYgKzE2MTksNyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcnBjX3Byb2NfdW5yZWdpc3RlcigibmZzIik7CiAjZW5kaWYKKwluZnNfY2xlYW51cF9jYl9pZGVudF9pZHIoKTsKIAl1bnJlZ2lzdGVyX25mc19mcygpOwogCW5mc19mc19wcm9jX2V4aXQoKTsKIAluZnNpb2Rfc3RvcCgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaAppbmRleCBlNjM1NmI3Li5iZmEzYTM0IDEwMDY0NAotLS0gYS9mcy9uZnMvaW50ZXJuYWwuaAorKysgYi9mcy9uZnMvaW50ZXJuYWwuaApAQCAtMTI4LDkgKzEyOCwxMyBAQAogLyogY2xpZW50LmMgKi8KIGV4dGVybiBzdHJ1Y3QgcnBjX3Byb2dyYW0gbmZzX3Byb2dyYW07CiAKK2V4dGVybiB2b2lkIG5mc19jbGVhbnVwX2NiX2lkZW50X2lkcih2b2lkKTsKIGV4dGVybiB2b2lkIG5mc19wdXRfY2xpZW50KHN0cnVjdCBuZnNfY2xpZW50ICopOwotZXh0ZXJuIHN0cnVjdCBuZnNfY2xpZW50ICpuZnNfZmluZF9jbGllbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHUzMik7Ci1leHRlcm4gc3RydWN0IG5mc19jbGllbnQgKm5mc19maW5kX2NsaWVudF9uZXh0KHN0cnVjdCBuZnNfY2xpZW50ICopOworZXh0ZXJuIHN0cnVjdCBuZnNfY2xpZW50ICpuZnM0X2ZpbmRfY2xpZW50X25vX2lkZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKTsKK2V4dGVybiBzdHJ1Y3QgbmZzX2NsaWVudCAqbmZzNF9maW5kX2NsaWVudF9pZGVudChpbnQpOworZXh0ZXJuIHN0cnVjdCBuZnNfY2xpZW50ICoKK25mczRfZmluZF9jbGllbnRfc2Vzc2lvbmlkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgKiwKKwkJCSAgIGludCk7CiBleHRlcm4gc3RydWN0IG5mc19zZXJ2ZXIgKm5mc19jcmVhdGVfc2VydmVyKAogCQkJCQljb25zdCBzdHJ1Y3QgbmZzX3BhcnNlZF9tb3VudF9kYXRhICosCiAJCQkJCXN0cnVjdCBuZnNfZmggKik7CkBAIC0xODUsMTcgKzE4OSwyMCBAQAogZXh0ZXJuIHZvaWQgbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUodm9pZCk7CiAKIC8qIG5mczJ4ZHIuYyAqLwotZXh0ZXJuIGludCBuZnNfc3RhdF90b19lcnJubyhpbnQpOworZXh0ZXJuIGludCBuZnNfc3RhdF90b19lcnJubyhlbnVtIG5mc19zdGF0KTsKIGV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mc19wcm9jZWR1cmVzW107Ci1leHRlcm4gX19iZTMyICpuZnNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIHN0cnVjdCBuZnNfc2VydmVyICosIGludCk7CitleHRlcm4gaW50IG5mczJfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLAorCQkJCXN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIAogLyogbmZzM3hkci5jICovCiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnMzX3Byb2NlZHVyZXNbXTsKLWV4dGVybiBfX2JlMzIgKm5mczNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIHN0cnVjdCBuZnNfc2VydmVyICosIGludCk7CitleHRlcm4gaW50IG5mczNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLAorCQkJCXN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIAogLyogbmZzNHhkci5jICovCiAjaWZkZWYgQ09ORklHX05GU19WNAotZXh0ZXJuIF9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50KTsKK2V4dGVybiBpbnQgbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICosCisJCQkJc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX05GU19WNF8xCiBleHRlcm4gY29uc3QgdTMyIG5mczQxX21heHJlYWRfb3ZlcmhlYWQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvbW91bnRfY2xudC5jIGIvZnMvbmZzL21vdW50X2NsbnQuYwppbmRleCA0Zjk4MWYxLi5kNGMyZDZiIDEwMDY0NAotLS0gYS9mcy9uZnMvbW91bnRfY2xudC5jCisrKyBiL2ZzL25mcy9tb3VudF9jbG50LmMKQEAgLTIzNiwxMCArMjM2LDggQEAKIAkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCQkuZmxhZ3MJCT0gUlBDX0NMTlRfQ1JFQVRFX05PUElORywKIAl9OwotCXN0cnVjdCBtb3VudHJlcwlyZXN1bHQ7CiAJc3RydWN0IHJwY19tZXNzYWdlIG1zZwk9IHsKIAkJLnJwY19hcmdwCT0gaW5mby0+ZGlycGF0aCwKLQkJLnJwY19yZXNwCT0gJnJlc3VsdCwKIAl9OwogCXN0cnVjdCBycGNfY2xudCAqY2xudDsKIAlpbnQgc3RhdHVzOwpAQCAtMjQ4LDcgKzI0Niw3IEBACiAJCWFyZ3MuZmxhZ3MgfD0gUlBDX0NMTlRfQ1JFQVRFX05PTlBSSVZQT1JUOwogCiAJY2xudCA9IHJwY19jcmVhdGUoJmFyZ3MpOwotCWlmICh1bmxpa2VseShJU19FUlIoY2xudCkpKQorCWlmIChJU19FUlIoY2xudCkpCiAJCWdvdG8gb3V0X2NsbnRfZXJyOwogCiAJZHByaW50aygiTkZTOiBzZW5kaW5nIFVNTlQgcmVxdWVzdCBmb3IgJXM6JXNcbiIsCkBAIC0yODAsMjkgKzI3OCwyMCBAQAogICogWERSIGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIGZvciBNT1VOVAogICovCiAKLXN0YXRpYyBpbnQgZW5jb2RlX21udGRpcnBhdGgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqcGF0aG5hbWUpCitzdGF0aWMgdm9pZCBlbmNvZGVfbW50ZGlycGF0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpwYXRobmFtZSkKIHsKIAljb25zdCB1MzIgcGF0aG5hbWVfbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKIAlfX2JlMzIgKnA7CiAKLQlpZiAodW5saWtlbHkocGF0aG5hbWVfbGVuID4gTU5UUEFUSExFTikpCi0JCXJldHVybiAtRUlPOwotCi0JcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgc2l6ZW9mKHUzMikgKyBwYXRobmFtZV9sZW4pOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKKwlCVUdfT04ocGF0aG5hbWVfbGVuID4gTU5UUEFUSExFTik7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIHBhdGhuYW1lX2xlbik7CiAJeGRyX2VuY29kZV9vcGFxdWUocCwgcGF0aG5hbWUsIHBhdGhuYW1lX2xlbik7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbnRfZW5jX2RpcnBhdGgoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJCSAgIGNvbnN0IGNoYXIgKmRpcnBhdGgpCitzdGF0aWMgdm9pZCBtbnRfeGRyX2VuY19kaXJwYXRoKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IGNoYXIgKmRpcnBhdGgpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwotCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCXJldHVybiBlbmNvZGVfbW50ZGlycGF0aCgmeGRyLCBkaXJwYXRoKTsKKwllbmNvZGVfbW50ZGlycGF0aCh4ZHIsIGRpcnBhdGgpOwogfQogCiAvKgpAQCAtMzIwLDEwICszMDksMTAgQEAKIAl1MzIgc3RhdHVzOwogCV9fYmUzMiAqcDsKIAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIHNpemVvZihzdGF0dXMpKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87Ci0Jc3RhdHVzID0gbnRvaGwoKnApOworCXN0YXR1cyA9IGJlMzJfdG9fY3B1cChwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1udF9lcnJ0YmwpOyBpKyspIHsKIAkJaWYgKG1udF9lcnJ0YmxbaV0uc3RhdHVzID09IHN0YXR1cykgewpAQCAtMzUxLDE4ICszNDAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbnRfZGVjX21vdW50cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgICAgc3RydWN0IG1vdW50cmVzICpyZXMpCitzdGF0aWMgaW50IG1udF94ZHJfZGVjX21vdW50cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG1vdW50cmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7Ci0KLQlzdGF0dXMgPSBkZWNvZGVfc3RhdHVzKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX3N0YXR1cyh4ZHIsIHJlcyk7CiAJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwIHx8IHJlcy0+ZXJybm8gIT0gMCkpCiAJCXJldHVybiBzdGF0dXM7Ci0JcmV0dXJuIGRlY29kZV9maGFuZGxlKCZ4ZHIsIHJlcyk7CisJcmV0dXJuIGRlY29kZV9maGFuZGxlKHhkciwgcmVzKTsKIH0KIAogc3RhdGljIGludCBkZWNvZGVfZmhzX3N0YXR1cyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbW91bnRyZXMgKnJlcykKQEAgLTM3MSwxMCArMzU4LDEwIEBACiAJdTMyIHN0YXR1czsKIAlfX2JlMzIgKnA7CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBzaXplb2Yoc3RhdHVzKSk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwotCXN0YXR1cyA9IG50b2hsKCpwKTsKKwlzdGF0dXMgPSBiZTMyX3RvX2NwdXAocCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtbnQzX2VycnRibCk7IGkrKykgewogCQlpZiAobW50M19lcnJ0YmxbaV0uc3RhdHVzID09IHN0YXR1cykgewpAQCAtMzk0LDExICszODEsMTEgQEAKIAl1MzIgc2l6ZTsKIAlfX2JlMzIgKnA7CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBzaXplb2Yoc2l6ZSkpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKIAotCXNpemUgPSBudG9obCgqcCsrKTsKKwlzaXplID0gYmUzMl90b19jcHVwKHApOwogCWlmIChzaXplID4gTkZTM19GSFNJWkUgfHwgc2l6ZSA9PSAwKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNDIxLDE1ICs0MDgsMTUgQEAKIAlpZiAoKmNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgc2l6ZW9mKGVudHJpZXMpKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87Ci0JZW50cmllcyA9IG50b2hsKCpwKTsKKwllbnRyaWVzID0gYmUzMl90b19jcHVwKHApOwogCWRwcmludGsoIk5GUzogcmVjZWl2ZWQgJXUgYXV0aCBmbGF2b3JzXG4iLCBlbnRyaWVzKTsKIAlpZiAoZW50cmllcyA+IE5GU19NQVhfU0VDRkxBVk9SUykKIAkJZW50cmllcyA9IE5GU19NQVhfU0VDRkxBVk9SUzsKIAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIHNpemVvZih1MzIpICogZW50cmllcyk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCAqIGVudHJpZXMpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNDM3LDcgKzQyNCw3IEBACiAJCWVudHJpZXMgPSAqY291bnQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7Ci0JCWZsYXZvcnNbaV0gPSBudG9obCgqcCsrKTsKKwkJZmxhdm9yc1tpXSA9IGJlMzJfdG9fY3B1cChwKyspOwogCQlkcHJpbnRrKCJORlM6ICAgYXV0aCBmbGF2b3JbJXVdOiAlZFxuIiwgaSwgZmxhdm9yc1tpXSk7CiAJfQogCSpjb3VudCA9IGk7CkBAIC00NDUsMzAgKzQzMiwyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1udF9kZWNfbW91bnRyZXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgICAgIHN0cnVjdCBtb3VudHJlcyAqcmVzKQorc3RhdGljIGludCBtbnRfeGRyX2RlY19tb3VudHJlczMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBtb3VudHJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCi0Jc3RhdHVzID0gZGVjb2RlX2Zoc19zdGF0dXMoJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfZmhzX3N0YXR1cyh4ZHIsIHJlcyk7CiAJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwIHx8IHJlcy0+ZXJybm8gIT0gMCkpCiAJCXJldHVybiBzdGF0dXM7Ci0Jc3RhdHVzID0gZGVjb2RlX2ZoYW5kbGUzKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX2ZoYW5kbGUzKHhkciwgcmVzKTsKIAlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKSB7CiAJCXJlcy0+ZXJybm8gPSAtRUJBREhBTkRMRTsKIAkJcmV0dXJuIDA7CiAJfQotCXJldHVybiBkZWNvZGVfYXV0aF9mbGF2b3JzKCZ4ZHIsIHJlcyk7CisJcmV0dXJuIGRlY29kZV9hdXRoX2ZsYXZvcnMoeGRyLCByZXMpOwogfQogCiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBtbnRfcHJvY2VkdXJlc1tdID0gewogCVtNT1VOVFBST0NfTU5UXSA9IHsKIAkJLnBfcHJvYwkJPSBNT1VOVFBST0NfTU5ULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCltbnRfZW5jX2RpcnBhdGgsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KW1udF9kZWNfbW91bnRyZXMsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdCltbnRfeGRyX2VuY19kaXJwYXRoLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpbW50X3hkcl9kZWNfbW91bnRyZXMsCiAJCS5wX2FyZ2xlbgk9IE1OVF9lbmNfZGlycGF0aF9zeiwKIAkJLnBfcmVwbGVuCT0gTU5UX2RlY19tb3VudHJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IE1PVU5UUFJPQ19NTlQsCkBAIC00NzYsNyArNDYxLDcgQEAKIAl9LAogCVtNT1VOVFBST0NfVU1OVF0gPSB7CiAJCS5wX3Byb2MJCT0gTU9VTlRQUk9DX1VNTlQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KW1udF9lbmNfZGlycGF0aCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KW1udF94ZHJfZW5jX2RpcnBhdGgsCiAJCS5wX2FyZ2xlbgk9IE1OVF9lbmNfZGlycGF0aF9zeiwKIAkJLnBfc3RhdGlkeAk9IE1PVU5UUFJPQ19VTU5ULAogCQkucF9uYW1lCQk9ICJVTU9VTlQiLApAQCAtNDg2LDggKzQ3MSw4IEBACiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBtbnQzX3Byb2NlZHVyZXNbXSA9IHsKIAlbTU9VTlRQUk9DM19NTlRdID0gewogCQkucF9wcm9jCQk9IE1PVU5UUFJPQzNfTU5ULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCltbnRfZW5jX2RpcnBhdGgsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KW1udF9kZWNfbW91bnRyZXMzLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpbW50X3hkcl9lbmNfZGlycGF0aCwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KW1udF94ZHJfZGVjX21vdW50cmVzMywKIAkJLnBfYXJnbGVuCT0gTU5UX2VuY19kaXJwYXRoX3N6LAogCQkucF9yZXBsZW4JPSBNTlRfZGVjX21vdW50cmVzM19zeiwKIAkJLnBfc3RhdGlkeAk9IE1PVU5UUFJPQzNfTU5ULApAQCAtNDk1LDcgKzQ4MCw3IEBACiAJfSwKIAlbTU9VTlRQUk9DM19VTU5UXSA9IHsKIAkJLnBfcHJvYwkJPSBNT1VOVFBST0MzX1VNTlQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KW1udF9lbmNfZGlycGF0aCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KW1udF94ZHJfZW5jX2RpcnBhdGgsCiAJCS5wX2FyZ2xlbgk9IE1OVF9lbmNfZGlycGF0aF9zeiwKIAkJLnBfc3RhdGlkeAk9IE1PVU5UUFJPQzNfVU1OVCwKIAkJLnBfbmFtZQkJPSAiVU1PVU5UIiwKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCmluZGV4IDU5MTRhMTkuLjc5MmNiMTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMyeGRyLmMKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtNjEsNTg0ICs2MSwxMDA4IEBACiAjZGVmaW5lIE5GU19yZWFkZGlycmVzX3N6CSgxKQogI2RlZmluZSBORlNfc3RhdGZzcmVzX3N6CSgxK05GU19pbmZvX3N6KQogCi0vKgotICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKLSAqLwotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2VuY29kZV9maGFuZGxlKF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKLXsKLQltZW1jcHkocCwgZmhhbmRsZS0+ZGF0YSwgTkZTMl9GSFNJWkUpOwotCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX2ZoYW5kbGUoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQotewotCS8qIE5GU3YyIGhhbmRsZXMgaGF2ZSBhIGZpeGVkIGxlbmd0aCAqLwotCWZoYW5kbGUtPnNpemUgPSBORlMyX0ZIU0laRTsKLQltZW1jcHkoZmhhbmRsZS0+ZGF0YSwgcCwgTkZTMl9GSFNJWkUpOwotCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTMl9GSFNJWkUpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMioKLXhkcl9lbmNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCi17Ci0JKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOwotCS8qIENvbnZlcnQgbmFub3NlY29uZHMgaW50byBtaWNyb3NlY29uZHMgKi8KLQkqcCsrID0gaHRvbmwodGltZXAtPnR2X25zZWMgPyB0aW1lcC0+dHZfbnNlYyAvIDEwMDAgOiAwKTsKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIqCi14ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQotewotCS8qCi0JICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGlzIGEKLQkgKiBTdW4gY29udmVudGlvbiBmb3IgInNldCB0byBjdXJyZW50IHNlcnZlciB0aW1lIi4KLQkgKiBJdCdzIG5lZWRlZCB0byBtYWtlIHBlcm1pc3Npb25zIGNoZWNrcyBmb3IgdGhlCi0JICogInRvdWNoIiBwcm9ncmFtIGFjcm9zcyB2MiBtb3VudHMgdG8gU29sYXJpcyBhbmQKLQkgKiBJcml4IGJveGVzIHdvcmsgY29ycmVjdGx5LiBTZWUgZGVzY3JpcHRpb24gb2YKLQkgKiBzYXR0ciBpbiBzZWN0aW9uIDYuMSBvZiAiTkZTIElsbHVzdHJhdGVkIiBieQotCSAqIEJyZW50IENhbGxhZ2hhbiwgQWRkaXNvbi1XZXNsZXksIElTQk4gMC0yMDEtMzI3NTAtNQotCSAqLwotCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfc2VjKTsKLQkqcCsrID0gaHRvbmwoMTAwMDAwMCk7Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyKgoteGRyX2RlY29kZV90aW1lKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKLXsKLQl0aW1lcC0+dHZfc2VjID0gbnRvaGwoKnArKyk7Ci0JLyogQ29udmVydCBtaWNyb3NlY29uZHMgaW50byBuYW5vc2Vjb25kcyAqLwotCXRpbWVwLT50dl9uc2VjID0gbnRvaGwoKnArKykgKiAxMDAwOwotCXJldHVybiBwOwotfQotCi1zdGF0aWMgX19iZTMyICoKLXhkcl9kZWNvZGVfZmF0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKLXsKLQl1MzIgcmRldiwgdHlwZTsKLQl0eXBlID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPm1vZGUgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+bmxpbmsgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+dWlkID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPmdpZCA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5zaXplID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPmR1Lm5mczIuYmxvY2tzaXplID0gbnRvaGwoKnArKyk7Ci0JcmRldiA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5kdS5uZnMyLmJsb2NrcyA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5mc2lkLm1ham9yID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPmZzaWQubWlub3IgPSAwOwotCWZhdHRyLT5maWxlaWQgPSBudG9obCgqcCsrKTsKLQlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+YXRpbWUpOwotCXAgPSB4ZHJfZGVjb2RlX3RpbWUocCwgJmZhdHRyLT5tdGltZSk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmN0aW1lKTsKLQlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVjI7Ci0JZmF0dHItPnJkZXYgPSBuZXdfZGVjb2RlX2RldihyZGV2KTsKLQlpZiAodHlwZSA9PSBORkNIUiAmJiByZGV2ID09IE5GUzJfRklGT19ERVYpIHsKLQkJZmF0dHItPm1vZGUgPSAoZmF0dHItPm1vZGUgJiB+U19JRk1UKSB8IFNfSUZJRk87Ci0JCWZhdHRyLT5yZGV2ID0gMDsKLQl9Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9lbmNvZGVfc2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCi17Ci0JY29uc3QgX19iZTMyIG5vdF9zZXQgPSBfX2NvbnN0YW50X2h0b25sKDB4RkZGRkZGRkYpOwotCi0JKnArKyA9IChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgPyBodG9ubChhdHRyLT5pYV9tb2RlKSA6IG5vdF9zZXQ7Ci0JKnArKyA9IChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSA/IGh0b25sKGF0dHItPmlhX3VpZCkgOiBub3Rfc2V0OwotCSpwKysgPSAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgPyBodG9ubChhdHRyLT5pYV9naWQpIDogbm90X3NldDsKLQkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSA/IGh0b25sKGF0dHItPmlhX3NpemUpIDogbm90X3NldDsKLQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKSB7Ci0JCXAgPSB4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX2F0aW1lKTsKLQl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgewotCQlwID0geGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7Ci0JfSBlbHNlIHsKLQkJKnArKyA9IG5vdF9zZXQ7Ci0JCSpwKysgPSBub3Rfc2V0OwotCX0KLQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7Ci0JCXAgPSB4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX210aW1lKTsKLQl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgewotCQlwID0geGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKHAsICZhdHRyLT5pYV9tdGltZSk7Ci0JfSBlbHNlIHsKLQkJKnArKyA9IG5vdF9zZXQ7CQotCQkqcCsrID0gbm90X3NldDsKLQl9Ci0gIAlyZXR1cm4gcDsKLX0KIAogLyoKLSAqIE5GUyBlbmNvZGUgZnVuY3Rpb25zCisgKiBXaGlsZSBlbmNvZGluZyBhcmd1bWVudHMsIHNldCB1cCB0aGUgcmVwbHkgYnVmZmVyIGluIGFkdmFuY2UgdG8KKyAqIHJlY2VpdmUgcmVwbHkgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlIGNhY2hlLgogICovCi0vKgotICogRW5jb2RlIGZpbGUgaGFuZGxlIGFyZ3VtZW50Ci0gKiBHRVRBVFRSLCBSRUFETElOSywgU1RBVEZTCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfZmhhbmRsZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGZoKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgU0VUQVRUUiBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zYXR0cmFyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBkaXJlY3Rvcnkgb3BzIGFyZ3VtZW50Ci0gKiBMT09LVVAsIFJNRElSCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfZGlyb3BhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZGlyb3BhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIFJFTU9WRSBhcmd1bWVudAotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlbW92ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mc19yZW1vdmVhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUubmFtZSwgYXJncy0+bmFtZS5sZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFyZ3VtZW50cyB0byBhIFJFQUQgY2FsbC4gU2luY2Ugd2UgcmVhZCBkYXRhIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UKLSAqIGNhY2hlLCB3ZSBhbHNvIHNldCB1cCB0aGUgcmVwbHkgaW92ZWMgaGVyZSBzbyB0aGF0IGlvdlsxXSBwb2ludHMKLSAqIGV4YWN0bHkgdG8gdGhlIHBhZ2Ugd2Ugd2FudCB0byBmZXRjaC4KLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQorc3RhdGljIHZvaWQgcHJlcGFyZV9yZXBseV9idWZmZXIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCBwYWdlICoqcGFnZXMsCisJCQkJIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSB1bnNpZ25lZCBpbnQgYnVmc2l6ZSkKIHsKIAlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX2NyZWQtPmNyX2F1dGg7CiAJdW5zaWduZWQgaW50IHJlcGxlbjsKLQl1MzIgb2Zmc2V0ID0gKHUzMilhcmdzLT5vZmZzZXQ7Ci0JdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CiAKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQkqcCsrID0gaHRvbmwob2Zmc2V0KTsKLQkqcCsrID0gaHRvbmwoY291bnQpOwotCSpwKysgPSBodG9ubChjb3VudCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRyZXNfc3opIDw8IDI7Ci0JeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sCi0JCQkgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgY291bnQpOwotCXJlcS0+cnFfcmN2X2J1Zi5mbGFncyB8PSBYRFJCVUZfUkVBRDsKLQlyZXR1cm4gMDsKKwlyZXBsZW4gPSBSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIGJ1ZnNpemU7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwgcGFnZXMsIGJhc2UsIGxlbik7CiB9CiAKIC8qCi0gKiBEZWNvZGUgUkVBRCByZXBseQorICogSGFuZGxlIGRlY29kZSBidWZmZXIgb3ZlcmZsb3dzIG91dC1vZi1saW5lLgogICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlYWRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCi17Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOwotCXNpemVfdCBoZHJsZW47Ci0JdTMyIGNvdW50LCByZWN2ZDsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXAgPSB4ZHJfZGVjb2RlX2ZhdHRyKHAsIHJlcy0+ZmF0dHIpOwotCi0JY291bnQgPSBudG9obCgqcCsrKTsKLQlyZXMtPmVvZiA9IDA7Ci0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKLQlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRCByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCi0JCQkJImxlbmd0aCAlWnUgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKLQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRCBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOwotCQl4ZHJfc2hpZnRfYnVmKCZyZXEtPnJxX3Jjdl9idWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7Ci0JfQotCi0JcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOwotCWlmIChjb3VudCA+IHJlY3ZkKSB7Ci0JCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVwbHk6ICIKLQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOwotCQljb3VudCA9IHJlY3ZkOwotCX0KLQotCWRwcmludGsoIlJQQzogICAgICByZWFkcmVzIE9LIGNvdW50ICV1XG4iLCBjb3VudCk7Ci0JaWYgKGNvdW50IDwgcmVzLT5jb3VudCkKLQkJcmVzLT5jb3VudCA9IGNvdW50OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0KLS8qCi0gKiBXcml0ZSBhcmd1bWVudHMuIFNwbGljZSB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaW92ZWMuCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQotewotCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwotCXUzMiBvZmZzZXQgPSAodTMyKWFyZ3MtPm9mZnNldDsKLQl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCSpwKysgPSBodG9ubChvZmZzZXQpOwotCSpwKysgPSBodG9ubChvZmZzZXQpOwotCSpwKysgPSBodG9ubChjb3VudCk7Ci0JKnArKyA9IGh0b25sKGNvdW50KTsKLQlzbmRidWYtPmxlbiA9IHhkcl9hZGp1c3RfaW92ZWMoc25kYnVmLT5oZWFkLCBwKTsKLQotCS8qIENvcHkgdGhlIHBhZ2UgYXJyYXkgKi8KLQl4ZHJfZW5jb2RlX3BhZ2VzKHNuZGJ1ZiwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgY291bnQpOwotCXNuZGJ1Zi0+ZmxhZ3MgfD0gWERSQlVGX1dSSVRFOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIGNyZWF0ZSBhcmd1bWVudHMKLSAqIENSRUFURSwgTUtESVIKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY3JlYXRlYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZW5hbWVhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+b2xkX2Rpcik7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+b2xkX25hbWUtPm5hbWUsIGFyZ3MtPm9sZF9uYW1lLT5sZW4pOwotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+bmV3X2Rpcik7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmV3X25hbWUtPm5hbWUsIGFyZ3MtPm5ld19uYW1lLT5sZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBMSU5LIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbGlua2FyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+dG9maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9uYW1lLCBhcmdzLT50b2xlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIFNZTUxJTksgYXJndW1lbnRzCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfc3ltbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zeW1saW5rYXJncyAqYXJncykKLXsKLQlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKLQlzaXplX3QgcGFkOwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+cGF0aGxlbik7Ci0Jc25kYnVmLT5sZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+aGVhZCwgcCk7Ci0KLQl4ZHJfZW5jb2RlX3BhZ2VzKHNuZGJ1ZiwgYXJncy0+cGFnZXMsIDAsIGFyZ3MtPnBhdGhsZW4pOwotCi0JLyoKLQkgKiB4ZHJfZW5jb2RlX3BhZ2VzIG1heSBoYXZlIGFkZGVkIGEgZmV3IGJ5dGVzIHRvIGVuc3VyZSB0aGUKLQkgKiBwYXRobmFtZSBlbmRzIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgU3RhcnQgZW5jb2RpbmcgdGhlCi0JICogYXR0cmlidXRlcyBhZnRlciB0aGUgcGFkIGJ5dGVzLgotCSAqLwotCXBhZCA9IHNuZGJ1Zi0+dGFpbC0+aW92X2xlbjsKLQlpZiAocGFkID4gMCkKLQkJcCsrOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQlzbmRidWYtPmxlbiArPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+dGFpbCwgcCkgLSBwYWQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgYXJndW1lbnRzIHRvIHJlYWRkaXIgY2FsbAotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlYWRkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZGRpcmFyZ3MgKmFyZ3MpCi17Ci0Jc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwotCXVuc2lnbmVkIGludCByZXBsZW47Ci0JdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+Y29va2llKTsKLQkqcCsrID0gaHRvbmwoY291bnQpOyAvKiBzZWUgYWJvdmUgKi8KLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0KLQkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KLQlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlNfcmVhZGRpcnJlc19zeikgPDwgMjsKLQl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIDAsIGNvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlY29kZSB0aGUgcmVzdWx0IG9mIGEgcmVhZGRpciBjYWxsLgotICogV2UncmUgbm90IHJlYWxseSBkZWNvZGluZyBhbnltb3JlLCB3ZSBqdXN0IGxlYXZlIHRoZSBidWZmZXIgdW50b3VjaGVkCi0gKiBhbmQgb25seSBjaGVjayB0aGF0IGl0IGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdC4KLSAqIFRoZSByZWFsIGRlY29kaW5nIGhhcHBlbnMgaW4gbmZzX2RlY29kZV9lbnRyeSBiZWxvdywgY2FsbGVkIGRpcmVjdGx5Ci0gKiBmcm9tIG5mc19yZWFkZGlyIGZvciBlYWNoIGVudHJ5LgotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCi17Ci0Jc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2U7Ci0Jc2l6ZV90IGhkcmxlbjsKLQl1bnNpZ25lZCBpbnQgcGdsZW4sIHJlY3ZkOwotCWludCBzdGF0dXM7Ci0KLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0KLQloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOwotCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFERElSIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKLQkJCQkibGVuZ3RoICVadSA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOwotCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFERElSIGhlYWRlciBpcyBzaG9ydC4gaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7Ci0JCXhkcl9zaGlmdF9idWYocmN2YnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOwotCX0KLQotCXBnbGVuID0gcmN2YnVmLT5wYWdlX2xlbjsKLQlyZWN2ZCA9IHJjdmJ1Zi0+bGVuIC0gaGRybGVuOwotCWlmIChwZ2xlbiA+IHJlY3ZkKQotCQlwZ2xlbiA9IHJlY3ZkOwotCXBhZ2UgPSByY3ZidWYtPnBhZ2VzOwotCXJldHVybiBwZ2xlbjsKLX0KLQogc3RhdGljIHZvaWQgcHJpbnRfb3ZlcmZsb3dfbXNnKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JZHByaW50aygibmZzOiAlczogcHJlbWF0dXJlbHkgaGl0IGVuZCBvZiByZWNlaXZlIGJ1ZmZlci4gIgorCWRwcmludGsoIk5GUzogJXMgcHJlbWF0dXJlbHkgaGl0IHRoZSBlbmQgb2Ygb3VyIHJlY2VpdmUgYnVmZmVyLiAiCiAJCSJSZW1haW5pbmcgYnVmZmVyIGxlbmd0aCBpcyAldHUgd29yZHMuXG4iLAogCQlmdW5jLCB4ZHItPmVuZCAtIHhkci0+cCk7CiB9CiAKLV9fYmUzMiAqCi1uZnNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IHBsdXMpCisKKy8qCisgKiBFbmNvZGUvZGVjb2RlIE5GU3YyIGJhc2ljIGRhdGEgdHlwZXMKKyAqCisgKiBCYXNpYyBORlN2MiBkYXRhIHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMi4zIG9mIFJGQyAxMDk0OgorICogIk5GUzogTmV0d29yayBGaWxlIFN5c3RlbSBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIi4KKyAqCisgKiBOb3QgYWxsIGJhc2ljIGRhdGEgdHlwZXMgaGF2ZSB0aGVpciBvd24gZW5jb2RpbmcgYW5kIGRlY29kaW5nCisgKiBmdW5jdGlvbnMuICBGb3IgcnVuLXRpbWUgZWZmaWNpZW5jeSwgc29tZSBkYXRhIHR5cGVzIGFyZSBlbmNvZGVkCisgKiBvciBkZWNvZGVkIGlubGluZS4KKyAqLworCisvKgorICoJdHlwZWRlZiBvcGFxdWUJbmZzZGF0YTw+OworICovCitzdGF0aWMgaW50IGRlY29kZV9uZnNkYXRhKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzdWx0KQoreworCXUzMiByZWN2ZCwgY291bnQ7CisJc2l6ZV90IGhkcmxlbjsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJY291bnQgPSBiZTMyX3RvX2NwdXAocCk7CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkoY291bnQgPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOworb3V0OgorCXhkcl9yZWFkX3BhZ2VzKHhkciwgY291bnQpOworCXJlc3VsdC0+ZW9mID0gMDsJLyogTkZTdjIgZG9lcyBub3QgcGFzcyBFT0YgZmxhZyBvbiB0aGUgd2lyZS4gKi8KKwlyZXN1bHQtPmNvdW50ID0gY291bnQ7CisJcmV0dXJuIGNvdW50Oworb3V0X2NoZWF0aW5nOgorCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVzdWx0OiAiCisJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOworCWNvdW50ID0gcmVjdmQ7CisJZ290byBvdXQ7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICoJZW51bSBzdGF0IHsKKyAqCQlORlNfT0sgPSAwLAorICoJCU5GU0VSUl9QRVJNID0gMSwKKyAqCQlORlNFUlJfTk9FTlQgPSAyLAorICoJCU5GU0VSUl9JTyA9IDUsCisgKgkJTkZTRVJSX05YSU8gPSA2LAorICoJCU5GU0VSUl9BQ0NFUyA9IDEzLAorICoJCU5GU0VSUl9FWElTVCA9IDE3LAorICoJCU5GU0VSUl9OT0RFViA9IDE5LAorICoJCU5GU0VSUl9OT1RESVIgPSAyMCwKKyAqCQlORlNFUlJfSVNESVIgPSAyMSwKKyAqCQlORlNFUlJfRkJJRyA9IDI3LAorICoJCU5GU0VSUl9OT1NQQyA9IDI4LAorICoJCU5GU0VSUl9ST0ZTID0gMzAsCisgKgkJTkZTRVJSX05BTUVUT09MT05HID0gNjMsCisgKgkJTkZTRVJSX05PVEVNUFRZID0gNjYsCisgKgkJTkZTRVJSX0RRVU9UID0gNjksCisgKgkJTkZTRVJSX1NUQUxFID0gNzAsCisgKgkJTkZTRVJSX1dGTFVTSCA9IDk5CisgKgl9OworICovCitzdGF0aWMgaW50IGRlY29kZV9zdGF0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX3N0YXQgKnN0YXR1cykKIHsKIAlfX2JlMzIgKnA7CisKIAlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKLQlpZiAodW5saWtlbHkoIXApKQorCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKLQlpZiAoIW50b2hsKCpwKyspKSB7Ci0JCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwotCQlpZiAodW5saWtlbHkoIXApKQotCQkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JCWlmICghbnRvaGwoKnArKykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKLQkJZW50cnktPmVvZiA9IDE7Ci0JCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKKwkqc3RhdHVzID0gYmUzMl90b19jcHVwKHApOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIDIuMy4yLiAgZnR5cGUKKyAqCisgKgllbnVtIGZ0eXBlIHsKKyAqCQlORk5PTiA9IDAsCisgKgkJTkZSRUcgPSAxLAorICoJCU5GRElSID0gMiwKKyAqCQlORkJMSyA9IDMsCisgKgkJTkZDSFIgPSA0LAorICoJCU5GTE5LID0gNQorICoJfTsKKyAqCisgKi8KK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfZnR5cGUoX19iZTMyICpwLCB1MzIgKnR5cGUpCit7CisJKnR5cGUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAodW5saWtlbHkoKnR5cGUgPiBORjJGSUZPKSkKKwkJKnR5cGUgPSBORkJBRDsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIDIuMy4zLiAgZmhhbmRsZQorICoKKyAqCXR5cGVkZWYgb3BhcXVlIGZoYW5kbGVbRkhTSVpFXTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2ZoYW5kbGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCit7CisJX19iZTMyICpwOworCisJQlVHX09OKGZoLT5zaXplICE9IE5GUzJfRkhTSVpFKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBORlMyX0ZIU0laRSk7CisJbWVtY3B5KHAsIGZoLT5kYXRhLCBORlMyX0ZIU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTMl9GSFNJWkUpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlmaC0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCW1lbWNweShmaC0+ZGF0YSwgcCwgTkZTMl9GSFNJWkUpOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIDIuMy40LiAgdGltZXZhbAorICoKKyAqCXN0cnVjdCB0aW1ldmFsIHsKKyAqCQl1bnNpZ25lZCBpbnQgc2Vjb25kczsKKyAqCQl1bnNpZ25lZCBpbnQgdXNlY29uZHM7CisgKgl9OworICovCitzdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX3RpbWUoX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCSpwKysgPSBjcHVfdG9fYmUzMih0aW1lcC0+dHZfc2VjKTsKKwlpZiAodGltZXAtPnR2X25zZWMgIT0gMCkKKwkJKnArKyA9IGNwdV90b19iZTMyKHRpbWVwLT50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQyk7CisJZWxzZQorCQkqcCsrID0gY3B1X3RvX2JlMzIoMCk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBQYXNzaW5nIHRoZSBpbnZhbGlkIHZhbHVlIHVzZWNvbmRzPTEwMDAwMDAgaXMgYSBTdW4gY29udmVudGlvbiBmb3IKKyAqICJzZXQgdG8gY3VycmVudCBzZXJ2ZXIgdGltZSIuICBJdCdzIG5lZWRlZCB0byBtYWtlIHBlcm1pc3Npb25zIGNoZWNrcworICogZm9yIHRoZSAidG91Y2giIHByb2dyYW0gYWNyb3NzIHYyIG1vdW50cyB0byBTb2xhcmlzIGFuZCBJcml4IHNlcnZlcnMKKyAqIHdvcmsgY29ycmVjdGx5LiAgU2VlIGRlc2NyaXB0aW9uIG9mIHNhdHRyIGluIHNlY3Rpb24gNi4xIG9mICJORlMKKyAqIElsbHVzdHJhdGVkIiBieSBCcmVudCBDYWxsYWdoYW4sIEFkZGlzb24tV2VzbGV5LCBJU0JOIDAtMjAxLTMyNzUwLTUuCisgKi8KK3N0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZShfX2JlMzIgKnAsCisJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJKnArKyA9IGNwdV90b19iZTMyKHRpbWVwLT50dl9zZWMpOworCSpwKysgPSBjcHVfdG9fYmUzMigxMDAwMDAwKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIF9fYmUzMiAqeGRyX2RlY29kZV90aW1lKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwl0aW1lcC0+dHZfc2VjID0gYmUzMl90b19jcHVwKHArKyk7CisJdGltZXAtPnR2X25zZWMgPSBiZTMyX3RvX2NwdXAocCsrKSAqIE5TRUNfUEVSX1VTRUM7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiAyLjMuNS4gIGZhdHRyCisgKgorICoJc3RydWN0IGZhdHRyIHsKKyAqCQlmdHlwZQkJdHlwZTsKKyAqCQl1bnNpZ25lZCBpbnQJbW9kZTsKKyAqCQl1bnNpZ25lZCBpbnQJbmxpbms7CisgKgkJdW5zaWduZWQgaW50CXVpZDsKKyAqCQl1bnNpZ25lZCBpbnQJZ2lkOworICoJCXVuc2lnbmVkIGludAlzaXplOworICoJCXVuc2lnbmVkIGludAlibG9ja3NpemU7CisgKgkJdW5zaWduZWQgaW50CXJkZXY7CisgKgkJdW5zaWduZWQgaW50CWJsb2NrczsKKyAqCQl1bnNpZ25lZCBpbnQJZnNpZDsKKyAqCQl1bnNpZ25lZCBpbnQJZmlsZWlkOworICoJCXRpbWV2YWwJCWF0aW1lOworICoJCXRpbWV2YWwJCW10aW1lOworICoJCXRpbWV2YWwJCWN0aW1lOworICoJfTsKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2ZhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXUzMiByZGV2LCB0eXBlOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIE5GU19mYXR0cl9zeiA8PCAyKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisKKwlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVjI7CisKKwlwID0geGRyX2RlY29kZV9mdHlwZShwLCAmdHlwZSk7CisKKwlmYXR0ci0+bW9kZSA9IGJlMzJfdG9fY3B1cChwKyspOworCWZhdHRyLT5ubGluayA9IGJlMzJfdG9fY3B1cChwKyspOworCWZhdHRyLT51aWQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+Z2lkID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPnNpemUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKworCXJkZXYgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+cmRldiA9IG5ld19kZWNvZGVfZGV2KHJkZXYpOworCWlmICh0eXBlID09ICh1MzIpTkZDSFIgJiYgcmRldiA9PSAodTMyKU5GUzJfRklGT19ERVYpIHsKKwkJZmF0dHItPm1vZGUgPSAoZmF0dHItPm1vZGUgJiB+U19JRk1UKSB8IFNfSUZJRk87CisJCWZhdHRyLT5yZGV2ID0gMDsKIAl9CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA4KTsKLQlpZiAodW5saWtlbHkoIXApKQotCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlmYXR0ci0+ZHUubmZzMi5ibG9ja3MgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+ZnNpZC5tYWpvciA9IGJlMzJfdG9fY3B1cChwKyspOworCWZhdHRyLT5mc2lkLm1pbm9yID0gMDsKKwlmYXR0ci0+ZmlsZWlkID0gYmUzMl90b19jcHVwKHArKyk7CiAKLQllbnRyeS0+aW5vCSAgPSBudG9obCgqcCsrKTsKLQllbnRyeS0+bGVuCSAgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+YXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUocCwgJmZhdHRyLT5tdGltZSk7CisJeGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+Y3RpbWUpOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KIAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGVudHJ5LT5sZW4gKyA0KTsKLQlpZiAodW5saWtlbHkoIXApKQorLyoKKyAqIDIuMy42LiAgc2F0dHIKKyAqCisgKglzdHJ1Y3Qgc2F0dHIgeworICoJCXVuc2lnbmVkIGludAltb2RlOworICoJCXVuc2lnbmVkIGludAl1aWQ7CisgKgkJdW5zaWduZWQgaW50CWdpZDsKKyAqCQl1bnNpZ25lZCBpbnQJc2l6ZTsKKyAqCQl0aW1ldmFsCQlhdGltZTsKKyAqCQl0aW1ldmFsCQltdGltZTsKKyAqCX07CisgKi8KKworI2RlZmluZSBORlMyX1NBVFRSX05PVF9TRVQJKDB4ZmZmZmZmZmYpCisKK3N0YXRpYyBfX2JlMzIgKnhkcl90aW1lX25vdF9zZXQoX19iZTMyICpwKQoreworCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfc2F0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGlhdHRyICphdHRyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIE5GU19zYXR0cl9zeiA8PCAyKTsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKwkJKnArKyA9IGNwdV90b19iZTMyKGF0dHItPmlhX21vZGUpOworCWVsc2UKKwkJKnArKyA9IGNwdV90b19iZTMyKE5GUzJfU0FUVFJfTk9UX1NFVCk7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCSpwKysgPSBjcHVfdG9fYmUzMihhdHRyLT5pYV91aWQpOworCWVsc2UKKwkJKnArKyA9IGNwdV90b19iZTMyKE5GUzJfU0FUVFJfTk9UX1NFVCk7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCSpwKysgPSBjcHVfdG9fYmUzMihhdHRyLT5pYV9naWQpOworCWVsc2UKKwkJKnArKyA9IGNwdV90b19iZTMyKE5GUzJfU0FUVFJfTk9UX1NFVCk7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCQkqcCsrID0gY3B1X3RvX2JlMzIoKHUzMilhdHRyLT5pYV9zaXplKTsKKwllbHNlCisJCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRV9TRVQpCisJCXAgPSB4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX2F0aW1lKTsKKwllbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCXAgPSB4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUocCwgJmF0dHItPmlhX2F0aW1lKTsKKwllbHNlCisJCXAgPSB4ZHJfdGltZV9ub3Rfc2V0KHApOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKQorCQl4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX210aW1lKTsKKwllbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpCisJCXhkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZShwLCAmYXR0ci0+aWFfbXRpbWUpOworCWVsc2UKKwkJeGRyX3RpbWVfbm90X3NldChwKTsKK30KKworLyoKKyAqIDIuMy43LiAgZmlsZW5hbWUKKyAqCisgKgl0eXBlZGVmIHN0cmluZyBmaWxlbmFtZTxNQVhOQU1MRU4+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfZmlsZW5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgbGVuZ3RoKQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihsZW5ndGggPiBORlMyX01BWE5BTUxFTik7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbmd0aCk7CisJeGRyX2VuY29kZV9vcGFxdWUocCwgbmFtZSwgbGVuZ3RoKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZmlsZW5hbWVfaW5saW5lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBjb25zdCBjaGFyICoqbmFtZSwgdTMyICpsZW5ndGgpCit7CisJX19iZTMyICpwOworCXUzMiBjb3VudDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKLQllbnRyeS0+bmFtZQkgID0gKGNvbnN0IGNoYXIgKikgcDsKLQlwCQkgKz0gWERSX1FVQURMRU4oZW50cnktPmxlbik7Ci0JZW50cnktPnByZXZfY29va2llCSAgPSBlbnRyeS0+Y29va2llOwotCWVudHJ5LT5jb29raWUJICA9IG50b2hsKCpwKyspOworCWNvdW50ID0gYmUzMl90b19jcHVwKHApOworCWlmIChjb3VudCA+IE5GUzNfTUFYTkFNTEVOKQorCQlnb3RvIG91dF9uYW1ldG9vbG9uZzsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBjb3VudCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCSpuYW1lID0gKGNvbnN0IGNoYXIgKilwOworCSpsZW5ndGggPSBjb3VudDsKKwlyZXR1cm4gMDsKK291dF9uYW1ldG9vbG9uZzoKKwlkcHJpbnRrKCJORlM6IHJldHVybmVkIGZpbGVuYW1lIHRvbyBsb25nOiAldVxuIiwgY291bnQpOworCXJldHVybiAtRU5BTUVUT09MT05HOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIDIuMy44LiAgcGF0aAorICoKKyAqCXR5cGVkZWYgc3RyaW5nIHBhdGg8TUFYUEFUSExFTj47CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9wYXRoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBwYWdlICoqcGFnZXMsIHUzMiBsZW5ndGgpCit7CisJX19iZTMyICpwOworCisJQlVHX09OKGxlbmd0aCA+IE5GUzJfTUFYUEFUSExFTik7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBjcHVfdG9fYmUzMihsZW5ndGgpOworCXhkcl93cml0ZV9wYWdlcyh4ZHIsIHBhZ2VzLCAwLCBsZW5ndGgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9wYXRoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJdTMyIGxlbmd0aCwgcmVjdmQ7CisJc2l6ZV90IGhkcmxlbjsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHApOworCWlmICh1bmxpa2VseShsZW5ndGggPj0geGRyLT5idWYtPnBhZ2VfbGVuIHx8IGxlbmd0aCA+IE5GU19NQVhQQVRITEVOKSkKKwkJZ290byBvdXRfc2l6ZTsKKwloZHJsZW4gPSAodTggKil4ZHItPnAgLSAodTggKil4ZHItPmlvdi0+aW92X2Jhc2U7CisJcmVjdmQgPSB4ZHItPmJ1Zi0+bGVuIC0gaGRybGVuOworCWlmICh1bmxpa2VseShsZW5ndGggPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOworCisJeGRyX3JlYWRfcGFnZXMoeGRyLCBsZW5ndGgpOworCXhkcl90ZXJtaW5hdGVfc3RyaW5nKHhkci0+YnVmLCBsZW5ndGgpOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBwYXRobmFtZSB0b28gbG9uZzogJXVcbiIsIGxlbmd0aCk7CisJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CitvdXRfY2hlYXRpbmc6CisJZHByaW50aygiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcGF0aG5hbWUgcmVzdWx0OiAiCisJCSJsZW5ndGggJXUgPiByZWNlaXZlZCAldVxuIiwgbGVuZ3RoLCByZWN2ZCk7CisJcmV0dXJuIC1FSU87CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogMi4zLjkuICBhdHRyc3RhdAorICoKKyAqCXVuaW9uIGF0dHJzdGF0IHN3aXRjaCAoc3RhdCBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTX09LOgorICoJCWZhdHRyIGF0dHJpYnV0ZXM7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICovCitzdGF0aWMgaW50IGRlY29kZV9hdHRyc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2ZhdHRyKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworLyoKKyAqIDIuMy4xMC4gIGRpcm9wYXJncworICoKKyAqCXN0cnVjdCBkaXJvcGFyZ3MgeworICoJCWZoYW5kbGUgIGRpcjsKKyAqCQlmaWxlbmFtZSBuYW1lOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2Rpcm9wYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIGxlbmd0aCkKK3sKKwllbmNvZGVfZmhhbmRsZSh4ZHIsIGZoKTsKKwllbmNvZGVfZmlsZW5hbWUoeGRyLCBuYW1lLCBsZW5ndGgpOworfQorCisvKgorICogMi4zLjExLiAgZGlyb3ByZXMKKyAqCisgKgl1bmlvbiBkaXJvcHJlcyBzd2l0Y2ggKHN0YXQgc3RhdHVzKSB7CisgKgljYXNlIE5GU19PSzoKKyAqCQlzdHJ1Y3QgeworICoJCQlmaGFuZGxlIGZpbGU7CisgKgkJCWZhdHRyICAgYXR0cmlidXRlczsKKyAqCQl9IGRpcm9wb2s7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICovCitzdGF0aWMgaW50IGRlY29kZV9kaXJvcG9rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX2ZoYW5kbGUoeGRyLCByZXN1bHQtPmZoKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9mYXR0cih4ZHIsIHJlc3VsdC0+ZmF0dHIpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBkZWNvZGVfZGlyb3ByZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19kaXJvcG9rICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2Rpcm9wb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisKKy8qCisgKiBORlN2MiBYRFIgZW5jb2RlIGZ1bmN0aW9ucworICoKKyAqIE5GU3YyIGFyZ3VtZW50IHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMi4yIG9mIFJGQyAxMDk0OgorICogIk5GUzogTmV0d29yayBGaWxlIFN5c3RlbSBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIi4KKyAqLworCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfZmhhbmRsZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCit7CisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBmaCk7Cit9CisKKy8qCisgKiAyLjIuMy4gIHNhdHRyYXJncworICoKKyAqCXN0cnVjdCBzYXR0cmFyZ3MgeworICoJCWZoYW5kbGUgZmlsZTsKKyAqCQlzYXR0ciBhdHRyaWJ1dGVzOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnNfc2F0dHJhcmdzICphcmdzKQoreworCWVuY29kZV9maGFuZGxlKHhkciwgYXJncy0+ZmgpOworCWVuY29kZV9zYXR0cih4ZHIsIGFyZ3MtPnNhdHRyKTsKK30KKworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnNfZGlyb3BhcmdzICphcmdzKQoreworCWVuY29kZV9kaXJvcGFyZ3MoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKK30KKworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGxpbmthcmdzICphcmdzKQoreworCWVuY29kZV9maGFuZGxlKHhkciwgYXJncy0+ZmgpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwKKwkJCQkJYXJncy0+cGdsZW4sIE5GU19yZWFkbGlua3Jlc19zeik7Cit9CisKKy8qCisgKiAyLjIuNy4gIHJlYWRhcmdzCisgKgorICoJc3RydWN0IHJlYWRhcmdzIHsKKyAqCQlmaGFuZGxlIGZpbGU7CisgKgkJdW5zaWduZWQgb2Zmc2V0OworICoJCXVuc2lnbmVkIGNvdW50OworICoJCXVuc2lnbmVkIHRvdGFsY291bnQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZGFyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCXUzMiBvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisJX19iZTMyICpwOworCisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgNCArIDQpOworCSpwKysgPSBjcHVfdG9fYmUzMihvZmZzZXQpOworCSpwKysgPSBjcHVfdG9fYmUzMihjb3VudCk7CisJKnAgPSBjcHVfdG9fYmUzMihjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCWVuY29kZV9yZWFkYXJncyh4ZHIsIGFyZ3MpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwKKwkJCQkJYXJncy0+Y291bnQsIE5GU19yZWFkcmVzX3N6KTsKKwlyZXEtPnJxX3Jjdl9idWYuZmxhZ3MgfD0gWERSQlVGX1JFQUQ7Cit9CisKKy8qCisgKiAyLjIuOS4gIHdyaXRlYXJncworICoKKyAqCXN0cnVjdCB3cml0ZWFyZ3MgeworICoJCWZoYW5kbGUgZmlsZTsKKyAqCQl1bnNpZ25lZCBiZWdpbm9mZnNldDsKKyAqCQl1bnNpZ25lZCBvZmZzZXQ7CisgKgkJdW5zaWduZWQgdG90YWxjb3VudDsKKyAqCQluZnNkYXRhIGRhdGE7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfd3JpdGVhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXUzMiBvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisJX19iZTMyICpwOworCisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgNCArIDQgKyA0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIob2Zmc2V0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIob2Zmc2V0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoY291bnQpOworCisJLyogbmZzZGF0YSAqLworCSpwID0gY3B1X3RvX2JlMzIoY291bnQpOworCXhkcl93cml0ZV9wYWdlcyh4ZHIsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCWVuY29kZV93cml0ZWFyZ3MoeGRyLCBhcmdzKTsKKwl4ZHItPmJ1Zi0+ZmxhZ3MgfD0gWERSQlVGX1dSSVRFOworfQorCisvKgorICogMi4yLjEwLiAgY3JlYXRlYXJncworICoKKyAqCXN0cnVjdCBjcmVhdGVhcmdzIHsKKyAqCQlkaXJvcGFyZ3Mgd2hlcmU7CisgKgkJc2F0dHIgYXR0cmlidXRlczsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJncyh4ZHIsIGFyZ3MtPmZoLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCWVuY29kZV9zYXR0cih4ZHIsIGFyZ3MtPnNhdHRyKTsKK30KKworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX3JlbW92ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzKHhkciwgYXJncy0+ZmgsIGFyZ3MtPm5hbWUubmFtZSwgYXJncy0+bmFtZS5sZW4pOworfQorCisvKgorICogMi4yLjEyLiAgcmVuYW1lYXJncworICoKKyAqCXN0cnVjdCByZW5hbWVhcmdzIHsKKyAqCQlkaXJvcGFyZ3MgZnJvbTsKKyAqCQlkaXJvcGFyZ3MgdG87CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfcmVuYW1lYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mc19yZW5hbWVhcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBxc3RyICpvbGQgPSBhcmdzLT5vbGRfbmFtZTsKKwljb25zdCBzdHJ1Y3QgcXN0ciAqbmV3ID0gYXJncy0+bmV3X25hbWU7CisKKwllbmNvZGVfZGlyb3BhcmdzKHhkciwgYXJncy0+b2xkX2Rpciwgb2xkLT5uYW1lLCBvbGQtPmxlbik7CisJZW5jb2RlX2Rpcm9wYXJncyh4ZHIsIGFyZ3MtPm5ld19kaXIsIG5ldy0+bmFtZSwgbmV3LT5sZW4pOworfQorCisvKgorICogMi4yLjEzLiAgbGlua2FyZ3MKKyAqCisgKglzdHJ1Y3QgbGlua2FyZ3MgeworICoJCWZoYW5kbGUgZnJvbTsKKyAqCQlkaXJvcGFyZ3MgdG87CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mc19saW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfZmhhbmRsZSh4ZHIsIGFyZ3MtPmZyb21maCk7CisJZW5jb2RlX2Rpcm9wYXJncyh4ZHIsIGFyZ3MtPnRvZmgsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOworfQorCisvKgorICogMi4yLjE0LiAgc3ltbGlua2FyZ3MKKyAqCisgKglzdHJ1Y3Qgc3ltbGlua2FyZ3MgeworICoJCWRpcm9wYXJncyBmcm9tOworICoJCXBhdGggdG87CisgKgkJc2F0dHIgYXR0cmlidXRlczsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3N5bWxpbmthcmdzICphcmdzKQoreworCWVuY29kZV9kaXJvcGFyZ3MoeGRyLCBhcmdzLT5mcm9tZmgsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKKwllbmNvZGVfcGF0aCh4ZHIsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wYXRobGVuKTsKKwllbmNvZGVfc2F0dHIoeGRyLCBhcmdzLT5zYXR0cik7Cit9CisKKy8qCisgKiAyLjIuMTcuICByZWFkZGlyYXJncworICoKKyAqCXN0cnVjdCByZWFkZGlyYXJncyB7CisgKgkJZmhhbmRsZSBkaXI7CisgKgkJbmZzY29va2llIGNvb2tpZTsKKyAqCQl1bnNpZ25lZCBjb3VudDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgNCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmNvb2tpZSk7CisJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19yZWFkZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRkaXJhcmdzICphcmdzKQoreworCWVuY29kZV9yZWFkZGlyYXJncyh4ZHIsIGFyZ3MpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIDAsCisJCQkJCWFyZ3MtPmNvdW50LCBORlNfcmVhZGRpcnJlc19zeik7Cit9CisKKy8qCisgKiBORlN2MiBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICoKKyAqIE5GU3YyIHJlc3VsdCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDIuMiBvZiBSRkMgMTA5NDoKKyAqICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIuCisgKi8KKworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgdm9pZCAqX191bnVzZWQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0Oworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCitzdGF0aWMgaW50IG5mczJfeGRyX2RlY19hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mc19mYXR0ciAqcmVzdWx0KQoreworCXJldHVybiBkZWNvZGVfYXR0cnN0YXQoeGRyLCByZXN1bHQpOworfQorCitzdGF0aWMgaW50IG5mczJfeGRyX2RlY19kaXJvcHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mc19kaXJvcG9rICpyZXN1bHQpCit7CisJcmV0dXJuIGRlY29kZV9kaXJvcHJlcyh4ZHIsIHJlc3VsdCk7Cit9CisKKy8qCisgKiAyLjIuNi4gIHJlYWRsaW5rcmVzCisgKgorICoJdW5pb24gcmVhZGxpbmtyZXMgc3dpdGNoIChzdGF0IHN0YXR1cykgeworICoJY2FzZSBORlNfT0s6CisgKgkJcGF0aCBkYXRhOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqLworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKl9fdW51c2VkKQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX3N0YXQoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GU19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9wYXRoKHhkcik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAyLjIuNy4gIHJlYWRyZXMKKyAqCisgKgl1bmlvbiByZWFkcmVzIHN3aXRjaCAoc3RhdCBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTX09LOgorICoJCWZhdHRyIGF0dHJpYnV0ZXM7CisgKgkJbmZzZGF0YSBkYXRhOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqLworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfcmVhZHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9zdGF0KHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfZmF0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9uZnNkYXRhKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlc3VsdCkKK3sKKwkvKiBBbGwgTkZTdjIgd3JpdGVzIGFyZSAiZmlsZSBzeW5jIiB3cml0ZXMgKi8KKwlyZXN1bHQtPnZlcmYtPmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJcmV0dXJuIGRlY29kZV9hdHRyc3RhdCh4ZHIsIHJlc3VsdC0+ZmF0dHIpOworfQorCisvKioKKyAqIG5mczJfZGVjb2RlX2RpcmVudCAtIERlY29kZSBhIHNpbmdsZSBORlN2MiBkaXJlY3RvcnkgZW50cnkgc3RvcmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jYWwgcGFnZSBjYWNoZS4KKyAqIEB4ZHI6IFhEUiBzdHJlYW0gd2hlcmUgZW50cnkgcmVzaWRlcworICogQGVudHJ5OiBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIGVudHJ5IGRhdGEKKyAqIEBwbHVzOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIHJlYWRkaXJwbHVzIGVudHJ5CisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbnZva2VkIGR1cmluZyBSRUFERElSIHJlcGx5IGRlY29kaW5nLCBidXQKKyAqIHJhdGhlciB3aGVuZXZlciBhbiBhcHBsaWNhdGlvbiBpbnZva2VzIHRoZSBnZXRkZW50cygyKSBzeXN0ZW0gY2FsbAorICogb24gYSBkaXJlY3RvcnkgYWxyZWFkeSBpbiBvdXIgY2FjaGUuCisgKgorICogMi4yLjE3LiAgZW50cnkKKyAqCisgKglzdHJ1Y3QgZW50cnkgeworICoJCXVuc2lnbmVkCWZpbGVpZDsKKyAqCQlmaWxlbmFtZQluYW1lOworICoJCW5mc2Nvb2tpZQljb29raWU7CisgKgkJZW50cnkJCSpuZXh0ZW50cnk7CisgKgl9OworICovCitpbnQgbmZzMl9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAorCQkgICAgICAgaW50IHBsdXMpCit7CisJX19iZTMyICpwOworCWludCBlcnJvcjsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAoKnArKyA9PSB4ZHJfemVybykgeworCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwkJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCQlnb3RvIG91dF9vdmVyZmxvdzsKKwkJaWYgKCpwKysgPT0geGRyX3plcm8pCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZW50cnktPmVvZiA9IDE7CisJCXJldHVybiAtRUJBRENPT0tJRTsKKwl9CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJZW50cnktPmlubyA9IGJlMzJfdG9fY3B1cChwKTsKKworCWVycm9yID0gZGVjb2RlX2ZpbGVuYW1lX2lubGluZSh4ZHIsICZlbnRyeS0+bmFtZSwgJmVudHJ5LT5sZW4pOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCXJldHVybiBlcnJvcjsKKworCS8qCisJICogVGhlIHR5cGUgKHNpemUgYW5kIGJ5dGUgb3JkZXIpIG9mIG5mc2Nvb2tpZSBpc24ndCBkZWZpbmVkIGluCisJICogUkZDIDEwOTQuICBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCBpdCdzIGFuIFhEUiB1aW50MzIuCisJICovCisJZW50cnktPnByZXZfY29va2llID0gZW50cnktPmNvb2tpZTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJZW50cnktPmNvb2tpZSA9IGJlMzJfdG9fY3B1cChwKTsKIAogCWVudHJ5LT5kX3R5cGUgPSBEVF9VTktOT1dOOwogCi0JcCA9IHhkcl9pbmxpbmVfcGVlayh4ZHIsIDgpOwotCWlmIChwICE9IE5VTEwpCi0JCWVudHJ5LT5lb2YgPSAhcFswXSAmJiBwWzFdOwotCWVsc2UKLQkJZW50cnktPmVvZiA9IDA7Ci0KLQlyZXR1cm4gcDsKKwlyZXR1cm4gMDsKIAogb3V0X292ZXJmbG93OgogCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKLQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwlyZXR1cm4gLUVBR0FJTjsKIH0KIAogLyoKLSAqIE5GUyBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICogMi4yLjE3LiAgcmVhZGRpcnJlcworICoKKyAqCXVuaW9uIHJlYWRkaXJyZXMgc3dpdGNoIChzdGF0IHN0YXR1cykgeworICoJY2FzZSBORlNfT0s6CisgKgkJc3RydWN0IHsKKyAqCQkJZW50cnkgKmVudHJpZXM7CisgKgkJCWJvb2wgZW9mOworICoJCX0gcmVhZGRpcm9rOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKiBSZWFkIHRoZSBkaXJlY3RvcnkgY29udGVudHMgaW50byB0aGUgcGFnZSBjYWNoZSwgYnV0IGRvbid0CisgKiB0b3VjaCB0aGVtLiAgVGhlIGFjdHVhbCBkZWNvZGluZyBpcyBkb25lIGJ5IG5mczJfZGVjb2RlX2RpcmVudCgpCisgKiBkdXJpbmcgc3Vic2VxdWVudCBuZnNfcmVhZGRpcigpIGNhbGxzLgogICovCi0vKgotICogRGVjb2RlIHNpbXBsZSBzdGF0dXMgcmVwbHkKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9zdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQorc3RhdGljIGludCBkZWNvZGVfcmVhZGRpcm9rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JaW50CXN0YXR1czsKLQotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpICE9IDApCi0JCXN0YXR1cyA9IG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqIERlY29kZSBhdHRyc3RhdCByZXBseQotICogR0VUQVRUUiwgU0VUQVRUUiwgV1JJVEUKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKLXsKLQlpbnQJc3RhdHVzOwotCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGVjb2RlIGRpcm9wcmVzIHJlcGx5Ci0gKiBMT09LVVAsIENSRUFURSwgTUtESVIKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9kaXJvcHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Rpcm9wb2sgKnJlcykKLXsKLQlpbnQJc3RhdHVzOwotCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXAgPSB4ZHJfZGVjb2RlX2ZoYW5kbGUocCwgcmVzLT5maCk7Ci0JeGRyX2RlY29kZV9mYXR0cihwLCByZXMtPmZhdHRyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBSRUFETElOSyBhcmdzCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZGxpbmthcmdzICphcmdzKQotewotCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfY3JlZC0+Y3JfYXV0aDsKLQl1bnNpZ25lZCBpbnQgcmVwbGVuOwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRsaW5rcmVzX3N6KSA8PCAyOwotCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgUkVBRExJTksgcmVwbHkKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZWFkbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKLXsKLQlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKLQlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOworCXUzMiByZWN2ZCwgcGdsZW47CiAJc2l6ZV90IGhkcmxlbjsKLQl1MzIgbGVuLCByZWN2ZDsKLQlpbnQJc3RhdHVzOwogCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCS8qIENvbnZlcnQgbGVuZ3RoIG9mIHN5bWxpbmsgKi8KLQlsZW4gPSBudG9obCgqcCsrKTsKLQlpZiAobGVuID49IHJjdmJ1Zi0+cGFnZV9sZW4pIHsKLQkJZHByaW50aygibmZzOiBzZXJ2ZXIgcmV0dXJuZWQgZ2lhbnQgc3ltbGluayFcbiIpOwotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQl9Ci0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKLQlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRExJTksgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgotCQkJCSJsZW5ndGggJVp1ID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7Ci0JCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOwotCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQURMSU5LIGhlYWRlciBpcyBzaG9ydC4gaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7Ci0JCXhkcl9zaGlmdF9idWYocmN2YnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOwotCX0KLQlyZWN2ZCA9IHJlcS0+cnFfcmN2X2J1Zi5sZW4gLSBoZHJsZW47Ci0JaWYgKHJlY3ZkIDwgbGVuKSB7Ci0JCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWRsaW5rIHJlcGx5OiAiCi0JCQkJImNvdW50ICV1ID4gcmVjdmQgJXVcbiIsIGxlbiwgcmVjdmQpOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJcGdsZW4gPSB4ZHItPmJ1Zi0+cGFnZV9sZW47CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkocGdsZW4gPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOworb3V0OgorCXhkcl9yZWFkX3BhZ2VzKHhkciwgcGdsZW4pOworCXJldHVybiBwZ2xlbjsKK291dF9jaGVhdGluZzoKKwlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkZGlyIHJlc3VsdDogIgorCQkicGdsZW4gJXUgPiByZWN2ZCAldVxuIiwgcGdsZW4sIHJlY3ZkKTsKKwlwZ2xlbiA9IHJlY3ZkOworCWdvdG8gb3V0OworfQogCi0JeGRyX3Rlcm1pbmF0ZV9zdHJpbmcocmN2YnVmLCBsZW4pOwotCXJldHVybiAwOworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfcmVhZGRpcnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICpfX3VudXNlZCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9zdGF0KHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfcmVhZGRpcm9rKHhkcik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgV1JJVEUgcmVwbHkKKyAqIDIuMi4xOC4gIHN0YXRmc3JlcworICoKKyAqCXVuaW9uIHN0YXRmc3JlcyAoc3RhdCBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTX09LOgorICoJCXN0cnVjdCB7CisgKgkJCXVuc2lnbmVkIHRzaXplOworICoJCQl1bnNpZ25lZCBic2l6ZTsKKyAqCQkJdW5zaWduZWQgYmxvY2tzOworICoJCQl1bnNpZ25lZCBiZnJlZTsKKyAqCQkJdW5zaWduZWQgYmF2YWlsOworICoJCX0gaW5mbzsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfd3JpdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQorc3RhdGljIGludCBkZWNvZGVfaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzMl9mc3N0YXQgKnJlc3VsdCkKIHsKLQlyZXMtPnZlcmYtPmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7Ci0JcmV0dXJuIG5mc194ZHJfYXR0cnN0YXQocmVxLCBwLCByZXMtPmZhdHRyKTsKLX0KKwlfX2JlMzIgKnA7CiAKLS8qCi0gKiBEZWNvZGUgU1RBVEZTIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdGZzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMyX2Zzc3RhdCAqcmVzKQotewotCWludAlzdGF0dXM7Ci0KLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0KLQlyZXMtPnRzaXplICA9IG50b2hsKCpwKyspOwotCXJlcy0+YnNpemUgID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5ibG9ja3MgPSBudG9obCgqcCsrKTsKLQlyZXMtPmJmcmVlICA9IG50b2hsKCpwKyspOwotCXJlcy0+YmF2YWlsID0gbnRvaGwoKnArKyk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTX2luZm9fc3ogPDwgMik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCXJlc3VsdC0+dHNpemUgID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5ic2l6ZSAgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPmJsb2NrcyA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+YmZyZWUgID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5iYXZhaWwgPSBiZTMyX3RvX2NwdXAocCk7CiAJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgaW50IG5mczJfeGRyX2RlY19zdGF0ZnNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBzdHJ1Y3QgbmZzMl9mc3N0YXQgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9zdGF0KHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfaW5mbyh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKwogLyoKICAqIFdlIG5lZWQgdG8gdHJhbnNsYXRlIGJldHdlZW4gbmZzIHN0YXR1cyByZXR1cm4gdmFsdWVzIGFuZAogICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgogICovCi1zdGF0aWMgc3RydWN0IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCBzdGF0OwogCWludCBlcnJubzsKIH0gbmZzX2VycnRibFtdID0gewpAQCAtNjc4LDI4ICsxMTAyLDMwIEBACiAJeyAtMSwJCQktRUlPCQl9CiB9OwogCi0vKgotICogQ29udmVydCBhbiBORlMgZXJyb3IgY29kZSB0byBhIGxvY2FsIG9uZS4KLSAqIFRoaXMgb25lIGlzIHVzZWQgam9pbnRseSBieSBORlN2MiBhbmQgTkZTdjMuCisvKioKKyAqIG5mc19zdGF0X3RvX2Vycm5vIC0gY29udmVydCBhbiBORlMgc3RhdHVzIGNvZGUgdG8gYSBsb2NhbCBlcnJubworICogQHN0YXR1czogTkZTIHN0YXR1cyBjb2RlIHRvIGNvbnZlcnQKKyAqCisgKiBSZXR1cm5zIGEgbG9jYWwgZXJybm8gdmFsdWUsIG9yIC1FSU8gaWYgdGhlIE5GUyBzdGF0dXMgY29kZSBpcworICogbm90IHJlY29nbml6ZWQuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgam9pbnRseSBieSBORlN2MiBhbmQgTkZTdjMuCiAgKi8KLWludAotbmZzX3N0YXRfdG9fZXJybm8oaW50IHN0YXQpCitpbnQgbmZzX3N0YXRfdG9fZXJybm8oZW51bSBuZnNfc3RhdCBzdGF0dXMpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBuZnNfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgewotCQlpZiAobmZzX2VycnRibFtpXS5zdGF0ID09IHN0YXQpCisJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gKGludClzdGF0dXMpCiAJCQlyZXR1cm4gbmZzX2VycnRibFtpXS5lcnJubzsKIAl9Ci0JZHByaW50aygibmZzX3N0YXRfdG9fZXJybm86IGJhZCBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZTogJWRcbiIsIHN0YXQpOworCWRwcmludGsoIk5GUzogVW5yZWNvZ25pemVkIG5mcyBzdGF0dXMgdmFsdWU6ICV1XG4iLCBzdGF0dXMpOwogCXJldHVybiBuZnNfZXJydGJsW2ldLmVycm5vOwogfQogCiAjZGVmaW5lIFBST0MocHJvYywgYXJndHlwZSwgcmVzdHlwZSwgdGltZXIpCQkJCVwKIFtORlNQUk9DXyMjcHJvY10gPSB7CQkJCQkJCVwKIAkucF9wcm9jCSAgICA9ICBORlNQUk9DXyMjcHJvYywJCQkJCVwKLQkucF9lbmNvZGUgICA9ICAoa3hkcnByb2NfdCkgbmZzX3hkcl8jI2FyZ3R5cGUsCQkJXAotCS5wX2RlY29kZSAgID0gIChreGRycHJvY190KSBuZnNfeGRyXyMjcmVzdHlwZSwJCQlcCisJLnBfZW5jb2RlICAgPSAgKGt4ZHJlcHJvY190KW5mczJfeGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgPSAgKGt4ZHJkcHJvY190KW5mczJfeGRyX2RlY18jI3Jlc3R5cGUsCQlcCiAJLnBfYXJnbGVuICAgPSAgTkZTXyMjYXJndHlwZSMjX3N6LAkJCQlcCiAJLnBfcmVwbGVuICAgPSAgTkZTXyMjcmVzdHlwZSMjX3N6LAkJCQlcCiAJLnBfdGltZXIgICAgPSAgdGltZXIsCQkJCQkJXApAQCAtNzA3LDIxICsxMTMzLDIxIEBACiAJLnBfbmFtZSAgICAgPSAgI3Byb2MsCQkJCQkJXAogCX0KIHN0cnVjdCBycGNfcHJvY2luZm8JbmZzX3Byb2NlZHVyZXNbXSA9IHsKLSAgICBQUk9DKEdFVEFUVFIsCWZoYW5kbGUsCWF0dHJzdGF0LCAxKSwKLSAgICBQUk9DKFNFVEFUVFIsCXNhdHRyYXJncywJYXR0cnN0YXQsIDApLAotICAgIFBST0MoTE9PS1VQLAlkaXJvcGFyZ3MsCWRpcm9wcmVzLCAyKSwKLSAgICBQUk9DKFJFQURMSU5LLAlyZWFkbGlua2FyZ3MsCXJlYWRsaW5rcmVzLCAzKSwKLSAgICBQUk9DKFJFQUQsCQlyZWFkYXJncywJcmVhZHJlcywgMyksCi0gICAgUFJPQyhXUklURSwJCXdyaXRlYXJncywJd3JpdGVyZXMsIDQpLAotICAgIFBST0MoQ1JFQVRFLAljcmVhdGVhcmdzLAlkaXJvcHJlcywgMCksCi0gICAgUFJPQyhSRU1PVkUsCXJlbW92ZWFyZ3MsCXN0YXQsIDApLAotICAgIFBST0MoUkVOQU1FLAlyZW5hbWVhcmdzLAlzdGF0LCAwKSwKLSAgICBQUk9DKExJTkssCQlsaW5rYXJncywJc3RhdCwgMCksCi0gICAgUFJPQyhTWU1MSU5LLAlzeW1saW5rYXJncywJc3RhdCwgMCksCi0gICAgUFJPQyhNS0RJUiwJCWNyZWF0ZWFyZ3MsCWRpcm9wcmVzLCAwKSwKLSAgICBQUk9DKFJNRElSLAkJZGlyb3BhcmdzLAlzdGF0LCAwKSwKLSAgICBQUk9DKFJFQURESVIsCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLCAzKSwKLSAgICBQUk9DKFNUQVRGUywJZmhhbmRsZSwJc3RhdGZzcmVzLCAwKSwKKwlQUk9DKEdFVEFUVFIsCWZoYW5kbGUsCWF0dHJzdGF0LAkxKSwKKwlQUk9DKFNFVEFUVFIsCXNhdHRyYXJncywJYXR0cnN0YXQsCTApLAorCVBST0MoTE9PS1VQLAlkaXJvcGFyZ3MsCWRpcm9wcmVzLAkyKSwKKwlQUk9DKFJFQURMSU5LLAlyZWFkbGlua2FyZ3MsCXJlYWRsaW5rcmVzLAkzKSwKKwlQUk9DKFJFQUQsCXJlYWRhcmdzLAlyZWFkcmVzLAkzKSwKKwlQUk9DKFdSSVRFLAl3cml0ZWFyZ3MsCXdyaXRlcmVzLAk0KSwKKwlQUk9DKENSRUFURSwJY3JlYXRlYXJncywJZGlyb3ByZXMsCTApLAorCVBST0MoUkVNT1ZFLAlyZW1vdmVhcmdzLAlzdGF0LAkJMCksCisJUFJPQyhSRU5BTUUsCXJlbmFtZWFyZ3MsCXN0YXQsCQkwKSwKKwlQUk9DKExJTkssCWxpbmthcmdzLAlzdGF0LAkJMCksCisJUFJPQyhTWU1MSU5LLAlzeW1saW5rYXJncywJc3RhdCwJCTApLAorCVBST0MoTUtESVIsCWNyZWF0ZWFyZ3MsCWRpcm9wcmVzLAkwKSwKKwlQUk9DKFJNRElSLAlkaXJvcGFyZ3MsCXN0YXQsCQkwKSwKKwlQUk9DKFJFQURESVIsCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLAkzKSwKKwlQUk9DKFNUQVRGUywJZmhhbmRsZSwJc3RhdGZzcmVzLAkwKSwKIH07CiAKIHN0cnVjdCBycGNfdmVyc2lvbgkJbmZzX3ZlcnNpb24yID0gewpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczN4ZHIuYyBiL2ZzL25mcy9uZnMzeGRyLmMKaW5kZXggZjZjYzYwZi4uMDFjNWU4YiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczN4ZHIuYworKysgYi9mcy9uZnMvbmZzM3hkci5jCkBAIC0zNywxOCArMzcsMTYgQEAKICNkZWZpbmUgTkZTM19maWxlbmFtZV9zegkoMSsoTkZTM19NQVhOQU1MRU4+PjIpKQogI2RlZmluZSBORlMzX3BhdGhfc3oJCSgxKyhORlMzX01BWFBBVEhMRU4+PjIpKQogI2RlZmluZSBORlMzX2ZhdHRyX3N6CQkoMjEpCi0jZGVmaW5lIE5GUzNfd2NjX2F0dHJfc3oJCSg2KQorI2RlZmluZSBORlMzX2Nvb2tpZXZlcmZfc3oJKE5GUzNfQ09PS0lFVkVSRlNJWkU+PjIpCisjZGVmaW5lIE5GUzNfd2NjX2F0dHJfc3oJKDYpCiAjZGVmaW5lIE5GUzNfcHJlX29wX2F0dHJfc3oJKDErTkZTM193Y2NfYXR0cl9zeikKICNkZWZpbmUgTkZTM19wb3N0X29wX2F0dHJfc3oJKDErTkZTM19mYXR0cl9zeikKLSNkZWZpbmUgTkZTM193Y2NfZGF0YV9zegkJKE5GUzNfcHJlX29wX2F0dHJfc3orTkZTM19wb3N0X29wX2F0dHJfc3opCi0jZGVmaW5lIE5GUzNfZnNzdGF0X3N6CQkKLSNkZWZpbmUgTkZTM19mc2luZm9fc3oJCQotI2RlZmluZSBORlMzX3BhdGhjb25mX3N6CQkKLSNkZWZpbmUgTkZTM19lbnRyeV9zegkJKE5GUzNfZmlsZW5hbWVfc3orMykKLQotI2RlZmluZSBORlMzX3NhdHRyYXJnc19zegkoTkZTM19maF9zeitORlMzX3NhdHRyX3N6KzMpCisjZGVmaW5lIE5GUzNfd2NjX2RhdGFfc3oJKE5GUzNfcHJlX29wX2F0dHJfc3orTkZTM19wb3N0X29wX2F0dHJfc3opCiAjZGVmaW5lIE5GUzNfZGlyb3BhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfZmlsZW5hbWVfc3opCi0jZGVmaW5lIE5GUzNfcmVtb3ZlYXJnc19zegkoTkZTM19maF9zeitORlMzX2ZpbGVuYW1lX3N6KQorCisjZGVmaW5lIE5GUzNfZ2V0YXR0cmFyZ3Nfc3oJKE5GUzNfZmhfc3opCisjZGVmaW5lIE5GUzNfc2V0YXR0cmFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19zYXR0cl9zeiszKQorI2RlZmluZSBORlMzX2xvb2t1cGFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19maWxlbmFtZV9zeikKICNkZWZpbmUgTkZTM19hY2Nlc3NhcmdzX3N6CShORlMzX2ZoX3N6KzEpCiAjZGVmaW5lIE5GUzNfcmVhZGxpbmthcmdzX3N6CShORlMzX2ZoX3N6KQogI2RlZmluZSBORlMzX3JlYWRhcmdzX3N6CShORlMzX2ZoX3N6KzMpCkBAIC01NywxNCArNTUsMTYgQEAKICNkZWZpbmUgTkZTM19ta2RpcmFyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6K05GUzNfc2F0dHJfc3opCiAjZGVmaW5lIE5GUzNfc3ltbGlua2FyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6KzErTkZTM19zYXR0cl9zeikKICNkZWZpbmUgTkZTM19ta25vZGFyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6KzIrTkZTM19zYXR0cl9zeikKKyNkZWZpbmUgTkZTM19yZW1vdmVhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfZmlsZW5hbWVfc3opCiAjZGVmaW5lIE5GUzNfcmVuYW1lYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orTkZTM19kaXJvcGFyZ3Nfc3opCiAjZGVmaW5lIE5GUzNfbGlua2FyZ3Nfc3oJCShORlMzX2ZoX3N6K05GUzNfZGlyb3BhcmdzX3N6KQotI2RlZmluZSBORlMzX3JlYWRkaXJhcmdzX3N6CShORlMzX2ZoX3N6KzIpCisjZGVmaW5lIE5GUzNfcmVhZGRpcmFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19jb29raWV2ZXJmX3N6KzMpCisjZGVmaW5lIE5GUzNfcmVhZGRpcnBsdXNhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfY29va2lldmVyZl9zeis0KQogI2RlZmluZSBORlMzX2NvbW1pdGFyZ3Nfc3oJKE5GUzNfZmhfc3orMykKIAotI2RlZmluZSBORlMzX2F0dHJzdGF0X3N6CSgxK05GUzNfZmF0dHJfc3opCi0jZGVmaW5lIE5GUzNfd2Njc3RhdF9zegkJKDErTkZTM193Y2NfZGF0YV9zeikKLSNkZWZpbmUgTkZTM19yZW1vdmVyZXNfc3oJKE5GUzNfd2Njc3RhdF9zeikKKyNkZWZpbmUgTkZTM19nZXRhdHRycmVzX3N6CSgxK05GUzNfZmF0dHJfc3opCisjZGVmaW5lIE5GUzNfc2V0YXR0cnJlc19zegkoMStORlMzX3djY19kYXRhX3N6KQorI2RlZmluZSBORlMzX3JlbW92ZXJlc19zegkoTkZTM19zZXRhdHRycmVzX3N6KQogI2RlZmluZSBORlMzX2xvb2t1cHJlc19zegkoMStORlMzX2ZoX3N6KygyICogTkZTM19wb3N0X29wX2F0dHJfc3opKQogI2RlZmluZSBORlMzX2FjY2Vzc3Jlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeisxKQogI2RlZmluZSBORlMzX3JlYWRsaW5rcmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzEpCkBAIC0xMDAsMTA3OSArMTAwLDIzNjIgQEAKIAlbTkYzRklGT10gPSBTX0lGSUZPLAogfTsKIAorLyoKKyAqIFdoaWxlIGVuY29kaW5nIGFyZ3VtZW50cywgc2V0IHVwIHRoZSByZXBseSBidWZmZXIgaW4gYWR2YW5jZSB0bworICogcmVjZWl2ZSByZXBseSBkYXRhIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UgY2FjaGUuCisgKi8KK3N0YXRpYyB2b2lkIHByZXBhcmVfcmVwbHlfYnVmZmVyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCSB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgdW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisKKwlyZXBsZW4gPSBSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIGJ1ZnNpemU7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwgcGFnZXMsIGJhc2UsIGxlbik7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVjb2RlIGJ1ZmZlciBvdmVyZmxvd3Mgb3V0LW9mLWxpbmUuCisgKi8KIHN0YXRpYyB2b2lkIHByaW50X292ZXJmbG93X21zZyhjb25zdCBjaGFyICpmdW5jLCBjb25zdCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCWRwcmludGsoIm5mczogJXM6IHByZW1hdHVyZWx5IGhpdCBlbmQgb2YgcmVjZWl2ZSBidWZmZXIuICIKKwlkcHJpbnRrKCJORlM6ICVzIHByZW1hdHVyZWx5IGhpdCB0aGUgZW5kIG9mIG91ciByZWNlaXZlIGJ1ZmZlci4gIgogCQkiUmVtYWluaW5nIGJ1ZmZlciBsZW5ndGggaXMgJXR1IHdvcmRzLlxuIiwKIAkJZnVuYywgeGRyLT5lbmQgLSB4ZHItPnApOwogfQogCisKIC8qCi0gKiBDb21tb24gTkZTIFhEUiBmdW5jdGlvbnMgYXMgaW5saW5lcworICogRW5jb2RlL2RlY29kZSBORlN2MyBiYXNpYyBkYXRhIHR5cGVzCisgKgorICogQmFzaWMgTkZTdjMgZGF0YSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDIuNSBvZiBSRkMgMTgxMzoKKyAqICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iLgorICoKKyAqIE5vdCBhbGwgYmFzaWMgZGF0YSB0eXBlcyBoYXZlIHRoZWlyIG93biBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIGZ1bmN0aW9ucy4gIEZvciBydW4tdGltZSBlZmZpY2llbmN5LCBzb21lIGRhdGEgdHlwZXMgYXJlIGVuY29kZWQKKyAqIG9yIGRlY29kZWQgaW5saW5lLgogICovCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZW5jb2RlX2ZoYW5kbGUoX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCkKKworc3RhdGljIHZvaWQgZW5jb2RlX3VpbnQzMihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1MzIgdmFsdWUpCiB7Ci0JcmV0dXJuIHhkcl9lbmNvZGVfYXJyYXkocCwgZmgtPmRhdGEsIGZoLT5zaXplKTsKKwlfX2JlMzIgKnAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIodmFsdWUpOwogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX2ZoYW5kbGUoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKLXsKLQlpZiAoKGZoLT5zaXplID0gbnRvaGwoKnArKykpIDw9IE5GUzNfRkhTSVpFKSB7Ci0JCW1lbWNweShmaC0+ZGF0YSwgcCwgZmgtPnNpemUpOwotCQlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGZoLT5zaXplKTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfZmhhbmRsZV9zdHJlYW0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCitzdGF0aWMgaW50IGRlY29kZV91aW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyICp2YWx1ZSkKIHsKIAlfX2JlMzIgKnA7CisKIAlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKLQlpZiAodW5saWtlbHkoIXApKQorCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKLQlmaC0+c2l6ZSA9IG50b2hsKCpwKyspOwotCi0JaWYgKGZoLT5zaXplIDw9IE5GUzNfRkhTSVpFKSB7Ci0JCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGZoLT5zaXplKTsKLQkJaWYgKHVubGlrZWx5KCFwKSkKLQkJCWdvdG8gb3V0X292ZXJmbG93OwotCQltZW1jcHkoZmgtPmRhdGEsIHAsIGZoLT5zaXplKTsKLQkJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmaC0+c2l6ZSk7Ci0JfQotCXJldHVybiBOVUxMOwotCisJKnZhbHVlID0gYmUzMl90b19jcHVwKHApOworCXJldHVybiAwOwogb3V0X292ZXJmbG93OgogCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKLQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkZWNvZGVfdWludDY0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHU2NCAqdmFsdWUpCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCXhkcl9kZWNvZGVfaHlwZXIocCwgdmFsdWUpOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoKLSAqIEVuY29kZS9kZWNvZGUgdGltZS4KKyAqIGZpbGVpZDMKKyAqCisgKgl0eXBlZGVmIHVpbnQ2NCBmaWxlaWQzOwogICovCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZW5jb2RlX3RpbWUzKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfZmlsZWlkMyhfX2JlMzIgKnAsIHU2NCAqZmlsZWlkKQogewotCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfc2VjKTsKLQkqcCsrID0gaHRvbmwodGltZXAtPnR2X25zZWMpOwotCXJldHVybiBwOworCXJldHVybiB4ZHJfZGVjb2RlX2h5cGVyKHAsIGZpbGVpZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQorc3RhdGljIGludCBkZWNvZGVfZmlsZWlkMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1NjQgKmZpbGVpZCkKIHsKLQl0aW1lcC0+dHZfc2VjID0gbnRvaGwoKnArKyk7Ci0JdGltZXAtPnR2X25zZWMgPSBudG9obCgqcCsrKTsKLQlyZXR1cm4gcDsKKwlyZXR1cm4gZGVjb2RlX3VpbnQ2NCh4ZHIsIGZpbGVpZCk7CiB9CiAKLXN0YXRpYyBfX2JlMzIgKgoteGRyX2RlY29kZV9mYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorLyoKKyAqIGZpbGVuYW1lMworICoKKyAqCXR5cGVkZWYgc3RyaW5nIGZpbGVuYW1lMzw+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfZmlsZW5hbWUzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBsZW5ndGgpCiB7Ci0JdW5zaWduZWQgaW50CXR5cGUsIG1ham9yLCBtaW5vcjsKLQl1bW9kZV90CQlmbW9kZTsKKwlfX2JlMzIgKnA7CiAKLQl0eXBlID0gbnRvaGwoKnArKyk7CisJQlVHX09OKGxlbmd0aCA+IE5GUzNfTUFYTkFNTEVOKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuZ3RoKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBuYW1lLCBsZW5ndGgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9pbmxpbmVfZmlsZW5hbWUzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgY29uc3QgY2hhciAqKm5hbWUsIHUzMiAqbGVuZ3RoKQoreworCV9fYmUzMiAqcDsKKwl1MzIgY291bnQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJY291bnQgPSBiZTMyX3RvX2NwdXAocCk7CisJaWYgKGNvdW50ID4gTkZTM19NQVhOQU1MRU4pCisJCWdvdG8gb3V0X25hbWV0b29sb25nOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGNvdW50KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJKm5hbWUgPSAoY29uc3QgY2hhciAqKXA7CisJKmxlbmd0aCA9IGNvdW50OworCXJldHVybiAwOworCitvdXRfbmFtZXRvb2xvbmc6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBmaWxlbmFtZSB0b28gbG9uZzogJXVcbiIsIGNvdW50KTsKKwlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBuZnNwYXRoMworICoKKyAqCXR5cGVkZWYgc3RyaW5nIG5mc3BhdGgzPD47CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9uZnNwYXRoMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJICAgIGNvbnN0IHUzMiBsZW5ndGgpCit7CisJQlVHX09OKGxlbmd0aCA+IE5GUzNfTUFYUEFUSExFTik7CisJZW5jb2RlX3VpbnQzMih4ZHIsIGxlbmd0aCk7CisJeGRyX3dyaXRlX3BhZ2VzKHhkciwgcGFnZXMsIDAsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25mc3BhdGgzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJdTMyIHJlY3ZkLCBjb3VudDsKKwlzaXplX3QgaGRybGVuOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwljb3VudCA9IGJlMzJfdG9fY3B1cChwKTsKKwlpZiAodW5saWtlbHkoY291bnQgPj0geGRyLT5idWYtPnBhZ2VfbGVuIHx8IGNvdW50ID4gTkZTM19NQVhQQVRITEVOKSkKKwkJZ290byBvdXRfbmFtZXRvb2xvbmc7CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkoY291bnQgPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOworCisJeGRyX3JlYWRfcGFnZXMoeGRyLCBjb3VudCk7CisJeGRyX3Rlcm1pbmF0ZV9zdHJpbmcoeGRyLT5idWYsIGNvdW50KTsKKwlyZXR1cm4gMDsKKworb3V0X25hbWV0b29sb25nOgorCWRwcmludGsoIk5GUzogcmV0dXJuZWQgcGF0aG5hbWUgdG9vIGxvbmc6ICV1XG4iLCBjb3VudCk7CisJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CitvdXRfY2hlYXRpbmc6CisJZHByaW50aygiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcGF0aG5hbWUgcmVzdWx0OiAiCisJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGNvb2tpZTMKKyAqCisgKgl0eXBlZGVmIHVpbnQ2NCBjb29raWUzCisgKi8KK3N0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfY29va2llMyhfX2JlMzIgKnAsIHU2NCBjb29raWUpCit7CisJcmV0dXJuIHhkcl9lbmNvZGVfaHlwZXIocCwgY29va2llKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29va2llMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1NjQgKmNvb2tpZSkKK3sKKwlyZXR1cm4gZGVjb2RlX3VpbnQ2NCh4ZHIsIGNvb2tpZSk7Cit9CisKKy8qCisgKiBjb29raWV2ZXJmMworICoKKyAqCXR5cGVkZWYgb3BhcXVlIGNvb2tpZXZlcmYzW05GUzNfQ09PS0lFVkVSRlNJWkVdOworICovCitzdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX2Nvb2tpZXZlcmYzKF9fYmUzMiAqcCwgY29uc3QgX19iZTMyICp2ZXJpZmllcikKK3sKKwltZW1jcHkocCwgdmVyaWZpZXIsIE5GUzNfQ09PS0lFVkVSRlNJWkUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oTkZTM19DT09LSUVWRVJGU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Nvb2tpZXZlcmYzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIF9fYmUzMiAqdmVyaWZpZXIpCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTM19DT09LSUVWRVJGU0laRSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCW1lbWNweSh2ZXJpZmllciwgcCwgTkZTM19DT09LSUVWRVJGU0laRSk7CisJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogY3JlYXRldmVyZjMKKyAqCisgKgl0eXBlZGVmIG9wYXF1ZSBjcmVhdGV2ZXJmM1tORlMzX0NSRUFURVZFUkZTSVpFXTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2NyZWF0ZXZlcmYzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IF9fYmUzMiAqdmVyaWZpZXIpCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgTkZTM19DUkVBVEVWRVJGU0laRSk7CisJbWVtY3B5KHAsIHZlcmlmaWVyLCBORlMzX0NSRUFURVZFUkZTSVpFKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfd3JpdGV2ZXJmMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBfX2JlMzIgKnZlcmlmaWVyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIE5GUzNfV1JJVEVWRVJGU0laRSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCW1lbWNweSh2ZXJpZmllciwgcCwgTkZTM19XUklURVZFUkZTSVpFKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBzaXplMworICoKKyAqCXR5cGVkZWYgdWludDY0IHNpemUzOworICovCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX3NpemUzKF9fYmUzMiAqcCwgdTY0ICpzaXplKQoreworCXJldHVybiB4ZHJfZGVjb2RlX2h5cGVyKHAsIHNpemUpOworfQorCisvKgorICogbmZzc3RhdDMKKyAqCisgKgllbnVtIG5mc3N0YXQzIHsKKyAqCQlORlMzX09LID0gMCwKKyAqCQkuLi4KKyAqCX0KKyAqLworI2RlZmluZSBORlMzX09LCQlORlNfT0sKKworc3RhdGljIGludCBkZWNvZGVfbmZzc3RhdDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfc3RhdCAqc3RhdHVzKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwkqc3RhdHVzID0gYmUzMl90b19jcHVwKHApOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGZ0eXBlMworICoKKyAqCWVudW0gZnR5cGUzIHsKKyAqCQlORjNSRUcJPSAxLAorICoJCU5GM0RJUgk9IDIsCisgKgkJTkYzQkxLCT0gMywKKyAqCQlORjNDSFIJPSA0LAorICoJCU5GM0xOSwk9IDUsCisgKgkJTkYzU09DSwk9IDYsCisgKgkJTkYzRklGTwk9IDcKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9mdHlwZTMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyIHR5cGUpCit7CisJQlVHX09OKHR5cGUgPiBORjNGSUZPKTsKKwllbmNvZGVfdWludDMyKHhkciwgdHlwZSk7Cit9CisKK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfZnR5cGUzKF9fYmUzMiAqcCwgdW1vZGVfdCAqbW9kZSkKK3sKKwl1MzIgdHlwZTsKKworCXR5cGUgPSBiZTMyX3RvX2NwdXAocCsrKTsKIAlpZiAodHlwZSA+IE5GM0ZJRk8pCiAJCXR5cGUgPSBORjNOT047Ci0JZm1vZGUgPSBuZnNfdHlwZTJmbXRbdHlwZV07Ci0JZmF0dHItPm1vZGUgPSAobnRvaGwoKnArKykgJiB+U19JRk1UKSB8IGZtb2RlOwotCWZhdHRyLT5ubGluayA9IG50b2hsKCpwKyspOwotCWZhdHRyLT51aWQgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+Z2lkID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5zaXplKTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmR1Lm5mczMudXNlZCk7CisJKm1vZGUgPSBuZnNfdHlwZTJmbXRbdHlwZV07CisJcmV0dXJuIHA7Cit9CiAKLQkvKiBUdXJuIHJlbW90ZSBkZXZpY2UgaW5mbyBpbnRvIExpbnV4LXNwZWNpZmljIGRldl90ICovCi0JbWFqb3IgPSBudG9obCgqcCsrKTsKLQltaW5vciA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5yZGV2ID0gTUtERVYobWFqb3IsIG1pbm9yKTsKLQlpZiAoTUFKT1IoZmF0dHItPnJkZXYpICE9IG1ham9yIHx8IE1JTk9SKGZhdHRyLT5yZGV2KSAhPSBtaW5vcikKLQkJZmF0dHItPnJkZXYgPSAwOworLyoKKyAqIHNwZWNkYXRhMworICoKKyAqICAgICBzdHJ1Y3Qgc3BlY2RhdGEzIHsKKyAqICAgICAgICAgICAgIHVpbnQzMiAgc3BlY2RhdGExOworICogICAgICAgICAgICAgdWludDMyICBzcGVjZGF0YTI7CisgKiAgICAgfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3NwZWNkYXRhMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBkZXZfdCByZGV2KQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDgpOworCSpwKysgPSBjcHVfdG9fYmUzMihNQUpPUihyZGV2KSk7CisJKnAgPSBjcHVfdG9fYmUzMihNSU5PUihyZGV2KSk7Cit9CisKK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfc3BlY2RhdGEzKF9fYmUzMiAqcCwgZGV2X3QgKnJkZXYpCit7CisJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKworCW1ham9yID0gYmUzMl90b19jcHVwKHArKyk7CisJbWlub3IgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkqcmRldiA9IE1LREVWKG1ham9yLCBtaW5vcik7CisJaWYgKE1BSk9SKCpyZGV2KSAhPSBtYWpvciB8fCBNSU5PUigqcmRldikgIT0gbWlub3IpCisJCSpyZGV2ID0gMDsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIG5mc19maDMKKyAqCisgKglzdHJ1Y3QgbmZzX2ZoMyB7CisgKgkJb3BhcXVlICAgICAgIGRhdGE8TkZTM19GSFNJWkU+OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25mc19maDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCit7CisJX19iZTMyICpwOworCisJQlVHX09OKGZoLT5zaXplID4gTkZTM19GSFNJWkUpOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBmaC0+c2l6ZSk7CisJeGRyX2VuY29kZV9vcGFxdWUocCwgZmgtPmRhdGEsIGZoLT5zaXplKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfbmZzX2ZoMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwl1MzIgbGVuZ3RoOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlsZW5ndGggPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAodW5saWtlbHkobGVuZ3RoID4gTkZTM19GSFNJWkUpKQorCQlnb3RvIG91dF90b29iaWc7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbGVuZ3RoKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJZmgtPnNpemUgPSBsZW5ndGg7CisJbWVtY3B5KGZoLT5kYXRhLCBwLCBsZW5ndGgpOworCXJldHVybiAwOworb3V0X3Rvb2JpZzoKKwlkcHJpbnRrKCJORlM6IGZpbGUgaGFuZGxlIHNpemUgKCV1KSB0b28gYmlnXG4iLCBsZW5ndGgpOworCXJldHVybiAtRTJCSUc7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCB6ZXJvX25mc19maDMoc3RydWN0IG5mc19maCAqZmgpCit7CisJbWVtc2V0KGZoLCAwLCBzaXplb2YoKmZoKSk7Cit9CisKKy8qCisgKiBuZnN0aW1lMworICoKKyAqCXN0cnVjdCBuZnN0aW1lMyB7CisgKgkJdWludDMyCXNlY29uZHM7CisgKgkJdWludDMyCW5zZWNvbmRzOworICoJfTsKKyAqLworc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9uZnN0aW1lMyhfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJKnArKyA9IGNwdV90b19iZTMyKHRpbWVwLT50dl9zZWMpOworCSpwKysgPSBjcHVfdG9fYmUzMih0aW1lcC0+dHZfbnNlYyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfbmZzdGltZTMoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCXRpbWVwLT50dl9zZWMgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwl0aW1lcC0+dHZfbnNlYyA9IGJlMzJfdG9fY3B1cChwKyspOworCXJldHVybiBwOworfQorCisvKgorICogc2F0dHIzCisgKgorICoJZW51bSB0aW1lX2hvdyB7CisgKgkJRE9OVF9DSEFOR0UJCT0gMCwKKyAqCQlTRVRfVE9fU0VSVkVSX1RJTUUJPSAxLAorICoJCVNFVF9UT19DTElFTlRfVElNRQk9IDIKKyAqCX07CisgKgorICoJdW5pb24gc2V0X21vZGUzIHN3aXRjaCAoYm9vbCBzZXRfaXQpIHsKKyAqCWNhc2UgVFJVRToKKyAqCQltb2RlMwltb2RlOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKgl1bmlvbiBzZXRfdWlkMyBzd2l0Y2ggKGJvb2wgc2V0X2l0KSB7CisgKgljYXNlIFRSVUU6CisgKgkJdWlkMwl1aWQ7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXVuaW9uIHNldF9naWQzIHN3aXRjaCAoYm9vbCBzZXRfaXQpIHsKKyAqCWNhc2UgVFJVRToKKyAqCQlnaWQzCWdpZDsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJdW5pb24gc2V0X3NpemUzIHN3aXRjaCAoYm9vbCBzZXRfaXQpIHsKKyAqCWNhc2UgVFJVRToKKyAqCQlzaXplMwlzaXplOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKgl1bmlvbiBzZXRfYXRpbWUgc3dpdGNoICh0aW1lX2hvdyBzZXRfaXQpIHsKKyAqCWNhc2UgU0VUX1RPX0NMSUVOVF9USU1FOgorICoJCW5mc3RpbWUzCWF0aW1lOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKgl1bmlvbiBzZXRfbXRpbWUgc3dpdGNoICh0aW1lX2hvdyBzZXRfaXQpIHsKKyAqCWNhc2UgU0VUX1RPX0NMSUVOVF9USU1FOgorICoJCW5mc3RpbWUzICBtdGltZTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IHNhdHRyMyB7CisgKgkJc2V0X21vZGUzCW1vZGU7CisgKgkJc2V0X3VpZDMJdWlkOworICoJCXNldF9naWQzCWdpZDsKKyAqCQlzZXRfc2l6ZTMJc2l6ZTsKKyAqCQlzZXRfYXRpbWUJYXRpbWU7CisgKgkJc2V0X210aW1lCW10aW1lOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3NhdHRyMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJdTMyIG5ieXRlczsKKwlfX2JlMzIgKnA7CisKKwkvKgorCSAqIEluIG9yZGVyIHRvIG1ha2Ugb25seSBhIHNpbmdsZSB4ZHJfcmVzZXJ2ZV9zcGFjZSgpIGNhbGwsCisJICogcHJlLWNvbXB1dGUgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB0byBiZSByZXNlcnZlZC4KKwkgKiBTaXggYm9vbGVhbiB2YWx1ZXMsIG9uZSBmb3IgZWFjaCBzZXRfZm9vIGZpZWxkLCBhcmUgYWx3YXlzCisJICogcHJlc2VudCBpbiB0aGUgZW5jb2RlZCByZXN1bHQsIHNvIHN0YXJ0IHRoZXJlLgorCSAqLworCW5ieXRlcyA9IDYgKiA0OworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKwkJbmJ5dGVzICs9IDQ7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCW5ieXRlcyArPSA0OworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQorCQluYnl0ZXMgKz0gNDsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCW5ieXRlcyArPSA4OworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKQorCQluYnl0ZXMgKz0gODsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkKKwkJbmJ5dGVzICs9IDg7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgbmJ5dGVzKTsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGNwdV90b19iZTMyKGF0dHItPmlhX21vZGUgJiBTX0lBTExVR08pOworCX0gZWxzZQorCQkqcCsrID0geGRyX3plcm87CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGNwdV90b19iZTMyKGF0dHItPmlhX3VpZCk7CisJfSBlbHNlCisJCSpwKysgPSB4ZHJfemVybzsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCSpwKysgPSB4ZHJfb25lOworCQkqcCsrID0gY3B1X3RvX2JlMzIoYXR0ci0+aWFfZ2lkKTsKKwl9IGVsc2UKKwkJKnArKyA9IHhkcl96ZXJvOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCSpwKysgPSB4ZHJfb25lOworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAodTY0KWF0dHItPmlhX3NpemUpOworCX0gZWxzZQorCQkqcCsrID0geGRyX3plcm87CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkgeworCQkqcCsrID0geGRyX3R3bzsKKwkJcCA9IHhkcl9lbmNvZGVfbmZzdGltZTMocCwgJmF0dHItPmlhX2F0aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQkqcCsrID0geGRyX29uZTsKKwl9IGVsc2UKKwkJKnArKyA9IHhkcl96ZXJvOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpIHsKKwkJKnArKyA9IHhkcl90d287CisJCXhkcl9lbmNvZGVfbmZzdGltZTMocCwgJmF0dHItPmlhX210aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQkqcCA9IHhkcl9vbmU7CisJfSBlbHNlCisJCSpwID0geGRyX3plcm87Cit9CisKKy8qCisgKiBmYXR0cjMKKyAqCisgKglzdHJ1Y3QgZmF0dHIzIHsKKyAqCQlmdHlwZTMJCXR5cGU7CisgKgkJbW9kZTMJCW1vZGU7CisgKgkJdWludDMyCQlubGluazsKKyAqCQl1aWQzCQl1aWQ7CisgKgkJZ2lkMwkJZ2lkOworICoJCXNpemUzCQlzaXplOworICoJCXNpemUzCQl1c2VkOworICoJCXNwZWNkYXRhMwlyZGV2OworICoJCXVpbnQ2NAkJZnNpZDsKKyAqCQlmaWxlaWQzCQlmaWxlaWQ7CisgKgkJbmZzdGltZTMJYXRpbWU7CisgKgkJbmZzdGltZTMJbXRpbWU7CisgKgkJbmZzdGltZTMJY3RpbWU7CisgKgl9OworICovCitzdGF0aWMgaW50IGRlY29kZV9mYXR0cjMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJdW1vZGVfdCBmbW9kZTsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBORlMzX2ZhdHRyX3N6IDw8IDIpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKworCXAgPSB4ZHJfZGVjb2RlX2Z0eXBlMyhwLCAmZm1vZGUpOworCisJZmF0dHItPm1vZGUgPSAoYmUzMl90b19jcHVwKHArKykgJiB+U19JRk1UKSB8IGZtb2RlOworCWZhdHRyLT5ubGluayA9IGJlMzJfdG9fY3B1cChwKyspOworCWZhdHRyLT51aWQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+Z2lkID0gYmUzMl90b19jcHVwKHArKyk7CisKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmZmF0dHItPnNpemUpOworCXAgPSB4ZHJfZGVjb2RlX3NpemUzKHAsICZmYXR0ci0+ZHUubmZzMy51c2VkKTsKKwlwID0geGRyX2RlY29kZV9zcGVjZGF0YTMocCwgJmZhdHRyLT5yZGV2KTsKIAogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZnNpZC5tYWpvcik7CiAJZmF0dHItPmZzaWQubWlub3IgPSAwOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZmlsZWlkKTsKLQlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPmF0aW1lKTsKLQlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPm10aW1lKTsKLQlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPmN0aW1lKTsKIAotCS8qIFVwZGF0ZSB0aGUgbW9kZSBiaXRzICovCisJcCA9IHhkcl9kZWNvZGVfZmlsZWlkMyhwLCAmZmF0dHItPmZpbGVpZCk7CisJcCA9IHhkcl9kZWNvZGVfbmZzdGltZTMocCwgJmZhdHRyLT5hdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfbmZzdGltZTMocCwgJmZhdHRyLT5tdGltZSk7CisJeGRyX2RlY29kZV9uZnN0aW1lMyhwLCAmZmF0dHItPmN0aW1lKTsKKwogCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9WMzsKLQlyZXR1cm4gcDsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9lbmNvZGVfc2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCisvKgorICogcG9zdF9vcF9hdHRyCisgKgorICoJdW5pb24gcG9zdF9vcF9hdHRyIHN3aXRjaCAoYm9vbCBhdHRyaWJ1dGVzX2ZvbGxvdykgeworICoJY2FzZSBUUlVFOgorICoJCWZhdHRyMwlhdHRyaWJ1dGVzOworICoJY2FzZSBGQUxTRToKKyAqCQl2b2lkOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfcG9zdF9vcF9hdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgewotCQkqcCsrID0geGRyX29uZTsKLQkJKnArKyA9IGh0b25sKGF0dHItPmlhX21vZGUgJiBTX0lBTExVR08pOwotCX0gZWxzZSB7Ci0JCSpwKysgPSB4ZHJfemVybzsKLQl9Ci0JaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKLQkJKnArKyA9IHhkcl9vbmU7Ci0JCSpwKysgPSBodG9ubChhdHRyLT5pYV91aWQpOwotCX0gZWxzZSB7Ci0JCSpwKysgPSB4ZHJfemVybzsKLQl9Ci0JaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKLQkJKnArKyA9IHhkcl9vbmU7Ci0JCSpwKysgPSBodG9ubChhdHRyLT5pYV9naWQpOwotCX0gZWxzZSB7Ci0JCSpwKysgPSB4ZHJfemVybzsKLQl9Ci0JaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7Ci0JCSpwKysgPSB4ZHJfb25lOwotCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAoX191NjQpIGF0dHItPmlhX3NpemUpOwotCX0gZWxzZSB7Ci0JCSpwKysgPSB4ZHJfemVybzsKLQl9Ci0JaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRV9TRVQpIHsKLQkJKnArKyA9IHhkcl90d287Ci0JCXAgPSB4ZHJfZW5jb2RlX3RpbWUzKHAsICZhdHRyLT5pYV9hdGltZSk7Ci0JfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKLQkJKnArKyA9IHhkcl9vbmU7Ci0JfSBlbHNlIHsKLQkJKnArKyA9IHhkcl96ZXJvOwotCX0KLQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkgewotCQkqcCsrID0geGRyX3R3bzsKLQkJcCA9IHhkcl9lbmNvZGVfdGltZTMocCwgJmF0dHItPmlhX210aW1lKTsKLQl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgewotCQkqcCsrID0geGRyX29uZTsKLQl9IGVsc2UgewotCQkqcCsrID0geGRyX3plcm87Ci0JfQotCXJldHVybiBwOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAoKnAgIT0geGRyX3plcm8pCisJCXJldHVybiBkZWNvZGVfZmF0dHIzKHhkciwgZmF0dHIpOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2RlY29kZV93Y2NfYXR0cihfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorLyoKKyAqIHdjY19hdHRyCisgKglzdHJ1Y3Qgd2NjX2F0dHIgeworICoJCXNpemUzCQlzaXplOworICoJCW5mc3RpbWUzCW10aW1lOworICoJCW5mc3RpbWUzCWN0aW1lOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfd2NjX2F0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5wcmVfc2l6ZSk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5wcmVfbXRpbWUpOwotCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+cHJlX2N0aW1lKTsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBORlMzX3djY19hdHRyX3N6IDw8IDIpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwogCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9QUkVTSVpFCiAJCXwgTkZTX0FUVFJfRkFUVFJfUFJFTVRJTUUKIAkJfCBORlNfQVRUUl9GQVRUUl9QUkVDVElNRTsKLQlyZXR1cm4gcDsKKworCXAgPSB4ZHJfZGVjb2RlX3NpemUzKHAsICZmYXR0ci0+cHJlX3NpemUpOworCXAgPSB4ZHJfZGVjb2RlX25mc3RpbWUzKHAsICZmYXR0ci0+cHJlX210aW1lKTsKKwl4ZHJfZGVjb2RlX25mc3RpbWUzKHAsICZmYXR0ci0+cHJlX2N0aW1lKTsKKworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2RlY29kZV9wb3N0X29wX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKLXsKLQlpZiAoKnArKykKLQkJcCA9IHhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOwotCXJldHVybiBwOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cl9zdHJlYW0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCisvKgorICogcHJlX29wX2F0dHIKKyAqCXVuaW9uIHByZV9vcF9hdHRyIHN3aXRjaCAoYm9vbCBhdHRyaWJ1dGVzX2ZvbGxvdykgeworICoJY2FzZSBUUlVFOgorICoJCXdjY19hdHRyCWF0dHJpYnV0ZXM7CisgKgljYXNlIEZBTFNFOgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqIHdjY19kYXRhCisgKgorICoJc3RydWN0IHdjY19kYXRhIHsKKyAqCQlwcmVfb3BfYXR0cgliZWZvcmU7CisgKgkJcG9zdF9vcF9hdHRyCWFmdGVyOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfcHJlX29wX2F0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJX19iZTMyICpwOwogCiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JaWYgKG50b2hsKCpwKyspKSB7Ci0JCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDg0KTsKLQkJaWYgKHVubGlrZWx5KCFwKSkKLQkJCWdvdG8gb3V0X292ZXJmbG93OwotCQlwID0geGRyX2RlY29kZV9mYXR0cihwLCBmYXR0cik7Ci0JfQotCXJldHVybiBwOworCWlmICgqcCAhPSB4ZHJfemVybykKKwkJcmV0dXJuIGRlY29kZV93Y2NfYXR0cih4ZHIsIGZhdHRyKTsKKwlyZXR1cm4gMDsKIG91dF9vdmVyZmxvdzoKIAlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfcHJlX29wX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbnQgZGVjb2RlX3djY19kYXRhKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewotCWlmICgqcCsrKQotCQlyZXR1cm4geGRyX2RlY29kZV93Y2NfYXR0cihwLCBmYXR0cik7Ci0JcmV0dXJuIHA7Ci19CisJaW50IGVycm9yOwogCi0KLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfd2NjX2RhdGEoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKLXsKLQlwID0geGRyX2RlY29kZV9wcmVfb3BfYXR0cihwLCBmYXR0cik7Ci0JcmV0dXJuIHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKKwllcnJvciA9IGRlY29kZV9wcmVfb3BfYXR0cih4ZHIsIGZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCBmYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgotICogTkZTIGVuY29kZSBmdW5jdGlvbnMKKyAqIHBvc3Rfb3BfZmgzCisgKgorICoJdW5pb24gcG9zdF9vcF9maDMgc3dpdGNoIChib29sIGhhbmRsZV9mb2xsb3dzKSB7CisgKgljYXNlIFRSVUU6CisgKgkJbmZzX2ZoMyAgaGFuZGxlOworICoJY2FzZSBGQUxTRToKKyAqCQl2b2lkOworICoJfTsKICAqLwotCi0vKgotICogRW5jb2RlIGZpbGUgaGFuZGxlIGFyZ3VtZW50Ci0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCitzdGF0aWMgaW50IGRlY29kZV9wb3N0X29wX2ZoMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKIHsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGZoKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJX19iZTMyICpwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJaWYgKCpwICE9IHhkcl96ZXJvKQorCQlyZXR1cm4gZGVjb2RlX25mc19maDMoeGRyLCBmaCk7CisJemVyb19uZnNfZmgzKGZoKTsKIAlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CiB9CiAKIC8qCi0gKiBFbmNvZGUgU0VUQVRUUiBhcmd1bWVudHMKKyAqIGRpcm9wYXJnczMKKyAqCisgKglzdHJ1Y3QgZGlyb3BhcmdzMyB7CisgKgkJbmZzX2ZoMwkJZGlyOworICoJCWZpbGVuYW1lMwluYW1lOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfc2F0dHJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3NhdHRyYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIGVuY29kZV9kaXJvcGFyZ3MzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIGxlbmd0aCkKIHsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPmd1YXJkKTsKLQlpZiAoYXJncy0+Z3VhcmQpCi0JCXAgPSB4ZHJfZW5jb2RlX3RpbWUzKHAsICZhcmdzLT5ndWFyZHRpbWUpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGZoKTsKKwllbmNvZGVfZmlsZW5hbWUzKHhkciwgbmFtZSwgbGVuZ3RoKTsKK30KKworCisvKgorICogTkZTdjMgWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqCisgKiBORlN2MyBhcmd1bWVudCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDMuMyBvZiBSRkMgMTgxMzoKKyAqICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iLgorICovCisKKy8qCisgKiAzLjMuMSAgR0VUQVRUUjNhcmdzCisgKgorICoJc3RydWN0IEdFVEFUVFIzYXJncyB7CisgKgkJbmZzX2ZoMyAgb2JqZWN0OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX2dldGF0dHIzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCWVuY29kZV9uZnNfZmgzKHhkciwgZmgpOwogfQogCiAvKgotICogRW5jb2RlIGRpcmVjdG9yeSBvcHMgYXJndW1lbnQKKyAqIDMuMy4yICBTRVRBVFRSM2FyZ3MKKyAqCisgKgl1bmlvbiBzYXR0cmd1YXJkMyBzd2l0Y2ggKGJvb2wgY2hlY2spIHsKKyAqCWNhc2UgVFJVRToKKyAqCQluZnN0aW1lMyAgb2JqX2N0aW1lOworICoJY2FzZSBGQUxTRToKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKglzdHJ1Y3QgU0VUQVRUUjNhcmdzIHsKKyAqCQluZnNfZmgzCQlvYmplY3Q7CisgKgkJc2F0dHIzCQluZXdfYXR0cmlidXRlczsKKyAqCQlzYXR0cmd1YXJkMwlndWFyZDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfc2F0dHJndWFyZDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MgKmFyZ3MpCiB7Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19CisJX19iZTMyICpwOwogCi0vKgotICogRW5jb2RlIFJFTU9WRSBhcmd1bWVudAotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW1vdmVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLm5hbWUsIGFyZ3MtPm5hbWUubGVuKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgYWNjZXNzKCkgYXJndW1lbnQKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfYWNjZXNzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19hY2Nlc3NhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCSpwKysgPSBodG9ubChhcmdzLT5hY2Nlc3MpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEFyZ3VtZW50cyB0byBhIFJFQUQgY2FsbC4gU2luY2Ugd2UgcmVhZCBkYXRhIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UKLSAqIGNhY2hlLCB3ZSBhbHNvIHNldCB1cCB0aGUgcmVwbHkgaW92ZWMgaGVyZSBzbyB0aGF0IGlvdlsxXSBwb2ludHMKLSAqIGV4YWN0bHkgdG8gdGhlIHBhZ2Ugd2Ugd2FudCB0byBmZXRjaC4KLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKLXsKLQlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX2NyZWQtPmNyX2F1dGg7Ci0JdW5zaWduZWQgaW50IHJlcGxlbjsKLQl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7Ci0JKnArKyA9IGh0b25sKGNvdW50KTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0KLQkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KLQlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlMzX3JlYWRyZXNfc3opIDw8IDI7Ci0JeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sCi0JCQkgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgY291bnQpOwotCXJlcS0+cnFfcmN2X2J1Zi5mbGFncyB8PSBYRFJCVUZfUkVBRDsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIGFyZ3VtZW50cy4gU3BsaWNlIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBpb3ZlYy4KLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQotewotCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwotCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKLQkqcCsrID0gaHRvbmwoY291bnQpOwotCSpwKysgPSBodG9ubChhcmdzLT5zdGFibGUpOwotCSpwKysgPSBodG9ubChjb3VudCk7Ci0Jc25kYnVmLT5sZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+aGVhZCwgcCk7Ci0KLQkvKiBDb3B5IHRoZSBwYWdlIGFycmF5ICovCi0JeGRyX2VuY29kZV9wYWdlcyhzbmRidWYsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKLQlzbmRidWYtPmZsYWdzIHw9IFhEUkJVRl9XUklURTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBDUkVBVEUgYXJndW1lbnRzCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfY3JlYXRlYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwotCi0JKnArKyA9IGh0b25sKGFyZ3MtPmNyZWF0ZW1vZGUpOwotCWlmIChhcmdzLT5jcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgewotCQkqcCsrID0gYXJncy0+dmVyaWZpZXJbMF07Ci0JCSpwKysgPSBhcmdzLT52ZXJpZmllclsxXTsKLQl9IGVsc2UKLQkJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwotCi0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIE1LRElSIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9ta2RpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbWtkaXJhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Ci0JcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBTWU1MSU5LIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19zeW1saW5rYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+cGF0aGxlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogQ29weSB0aGUgcGFnZSAqLwotCXhkcl9lbmNvZGVfcGFnZXMoJnJlcS0+cnFfc25kX2J1ZiwgYXJncy0+cGFnZXMsIDAsIGFyZ3MtPnBhdGhsZW4pOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIE1LTk9EIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9ta25vZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPnR5cGUpOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQlpZiAoYXJncy0+dHlwZSA9PSBORjNDSFIgfHwgYXJncy0+dHlwZSA9PSBORjNCTEspIHsKLQkJKnArKyA9IGh0b25sKE1BSk9SKGFyZ3MtPnJkZXYpKTsKLQkJKnArKyA9IGh0b25sKE1JTk9SKGFyZ3MtPnJkZXYpKTsKLQl9Ci0KLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPm9sZF9kaXIpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm9sZF9uYW1lLT5uYW1lLCBhcmdzLT5vbGRfbmFtZS0+bGVuKTsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPm5ld19kaXIpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5ld19uYW1lLT5uYW1lLCBhcmdzLT5uZXdfbmFtZS0+bGVuKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgTElOSyBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbGlua2FyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+dG9maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9uYW1lLCBhcmdzLT50b2xlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIGFyZ3VtZW50cyB0byByZWFkZGlyIGNhbGwKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgKmFyZ3MpCi17Ci0Jc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwotCXVuc2lnbmVkIGludCByZXBsZW47Ci0JdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5jb29raWUpOwotCSpwKysgPSBhcmdzLT52ZXJmWzBdOwotCSpwKysgPSBhcmdzLT52ZXJmWzFdOwotCWlmIChhcmdzLT5wbHVzKSB7Ci0JCS8qIHJlYWRkaXJwbHVzOiBuZWVkIGRpcmNvdW50ICsgYnVmZmVyIHNpemUuCi0JCSAqIFdlIGp1c3QgbWFrZSBzdXJlIHdlIG1ha2UgZGlyY291bnQgYmlnIGVub3VnaCAqLwotCQkqcCsrID0gaHRvbmwoY291bnQgPj4gMyk7Ci0JfQotCSpwKysgPSBodG9ubChjb3VudCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTM19yZWFkZGlycmVzX3N6KSA8PCAyOwotCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgMCwgY291bnQpOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGVjb2RlIHRoZSByZXN1bHQgb2YgYSByZWFkZGlyIGNhbGwuCi0gKiBXZSBqdXN0IGNoZWNrIGZvciBzeW50YWN0aWNhbCBjb3JyZWN0bmVzcy4KLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVhZGRpcnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkZGlycmVzICpyZXMpCi17Ci0Jc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2U7Ci0Jc2l6ZV90IGhkcmxlbjsKLQl1MzIgcmVjdmQsIHBnbGVuOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQkvKiBEZWNvZGUgcG9zdF9vcF9hdHRycyAqLwotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmRpcl9hdHRyKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQkvKiBEZWNvZGUgdmVyaWZpZXIgY29va2llICovCi0JaWYgKHJlcy0+dmVyZikgewotCQlyZXMtPnZlcmZbMF0gPSAqcCsrOwotCQlyZXMtPnZlcmZbMV0gPSAqcCsrOworCWlmIChhcmdzLT5ndWFyZCkgeworCQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgOCk7CisJCSpwKysgPSB4ZHJfb25lOworCQl4ZHJfZW5jb2RlX25mc3RpbWUzKHAsICZhcmdzLT5ndWFyZHRpbWUpOwogCX0gZWxzZSB7Ci0JCXAgKz0gMjsKKwkJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJCSpwID0geGRyX3plcm87CiAJfQotCi0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKLQlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRERJUiByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCi0JCQkJImxlbmd0aCAlWnUgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKLQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRERJUiBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOwotCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKLQl9Ci0KLQlwZ2xlbiA9IHJjdmJ1Zi0+cGFnZV9sZW47Ci0JcmVjdmQgPSByY3ZidWYtPmxlbiAtIGhkcmxlbjsKLQlpZiAocGdsZW4gPiByZWN2ZCkKLQkJcGdsZW4gPSByZWN2ZDsKLQlwYWdlID0gcmN2YnVmLT5wYWdlczsKLQotCXJldHVybiBwZ2xlbjsKIH0KIAotX19iZTMyICoKLW5mczNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IHBsdXMpCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfc2V0YXR0cjNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczNfc2F0dHJhcmdzICphcmdzKQogewotCV9fYmUzMiAqcDsKLQlzdHJ1Y3QgbmZzX2VudHJ5IG9sZCA9ICplbnRyeTsKLQotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwotCWlmICh1bmxpa2VseSghcCkpCi0JCWdvdG8gb3V0X292ZXJmbG93OwotCWlmICghbnRvaGwoKnArKykpIHsKLQkJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7Ci0JCWlmICh1bmxpa2VseSghcCkpCi0JCQlnb3RvIG91dF9vdmVyZmxvdzsKLQkJaWYgKCFudG9obCgqcCsrKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwotCQllbnRyeS0+ZW9mID0gMTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVCQURDT09LSUUpOwotCX0KLQotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDEyKTsKLQlpZiAodW5saWtlbHkoIXApKQotCQlnb3RvIG91dF9vdmVyZmxvdzsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZW50cnktPmlubyk7Ci0JZW50cnktPmxlbiAgPSBudG9obCgqcCsrKTsKLQotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGVudHJ5LT5sZW4gKyA4KTsKLQlpZiAodW5saWtlbHkoIXApKQotCQlnb3RvIG91dF9vdmVyZmxvdzsKLQllbnRyeS0+bmFtZSA9IChjb25zdCBjaGFyICopIHA7Ci0JcCArPSBYRFJfUVVBRExFTihlbnRyeS0+bGVuKTsKLQllbnRyeS0+cHJldl9jb29raWUgPSBlbnRyeS0+Y29va2llOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZlbnRyeS0+Y29va2llKTsKLQotCWVudHJ5LT5kX3R5cGUgPSBEVF9VTktOT1dOOwotCWlmIChwbHVzKSB7Ci0JCWVudHJ5LT5mYXR0ci0+dmFsaWQgPSAwOwotCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHJfc3RyZWFtKHhkciwgZW50cnktPmZhdHRyKTsKLQkJaWYgKElTX0VSUihwKSkKLQkJCWdvdG8gb3V0X292ZXJmbG93X2V4aXQ7Ci0JCWVudHJ5LT5kX3R5cGUgPSBuZnNfdW1vZGVfdG9fZHR5cGUoZW50cnktPmZhdHRyLT5tb2RlKTsKLQkJLyogSW4gZmFjdCwgYSBwb3N0X29wX2ZoMzogKi8KLQkJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7Ci0JCWlmICh1bmxpa2VseSghcCkpCi0JCQlnb3RvIG91dF9vdmVyZmxvdzsKLQkJaWYgKCpwKyspIHsKLQkJCXAgPSB4ZHJfZGVjb2RlX2ZoYW5kbGVfc3RyZWFtKHhkciwgZW50cnktPmZoKTsKLQkJCWlmIChJU19FUlIocCkpCi0JCQkJZ290byBvdXRfb3ZlcmZsb3dfZXhpdDsKLQkJCS8qIFVnaCAtLSBzZXJ2ZXIgcmVwbHkgd2FzIHRydW5jYXRlZCAqLwotCQkJaWYgKHAgPT0gTlVMTCkgewotCQkJCWRwcmludGsoIk5GUzogRkggdHJ1bmNhdGVkXG4iKTsKLQkJCQkqZW50cnkgPSBvbGQ7Ci0JCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJbWVtc2V0KCh1OCopKGVudHJ5LT5maCksIDAsIHNpemVvZigqZW50cnktPmZoKSk7Ci0JfQotCi0JcCA9IHhkcl9pbmxpbmVfcGVlayh4ZHIsIDgpOwotCWlmIChwICE9IE5VTEwpCi0JCWVudHJ5LT5lb2YgPSAhcFswXSAmJiBwWzFdOwotCWVsc2UKLQkJZW50cnktPmVvZiA9IDA7Ci0KLQlyZXR1cm4gcDsKLQotb3V0X292ZXJmbG93OgotCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKLW91dF9vdmVyZmxvd19leGl0OgotCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCWVuY29kZV9zYXR0cjMoeGRyLCBhcmdzLT5zYXR0cik7CisJZW5jb2RlX3NhdHRyZ3VhcmQzKHhkciwgYXJncyk7CiB9CiAKIC8qCi0gKiBFbmNvZGUgQ09NTUlUIGFyZ3VtZW50cworICogMy4zLjMgIExPT0tVUDNhcmdzCisgKgorICoJc3RydWN0IExPT0tVUDNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzICB3aGF0OworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfY29tbWl0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19sb29rdXAzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MgKmFyZ3MpCiB7Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKK30KKworLyoKKyAqIDMuMy40ICBBQ0NFU1MzYXJncworICoKKyAqCXN0cnVjdCBBQ0NFU1MzYXJncyB7CisgKgkJbmZzX2ZoMwkJb2JqZWN0OworICoJCXVpbnQzMgkJYWNjZXNzOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2FjY2VzczNhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mczNfYWNjZXNzYXJncyAqYXJncykKK3sKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKwllbmNvZGVfdWludDMyKHhkciwgYXJncy0+YWNjZXNzKTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX2FjY2VzczNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnMzX2FjY2Vzc2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2FjY2VzczNhcmdzKHhkciwgYXJncyk7Cit9CisKKy8qCisgKiAzLjMuNSAgUkVBRExJTkszYXJncworICoKKyAqCXN0cnVjdCBSRUFETElOSzNhcmdzIHsKKyAqCQluZnNfZmgzCXN5bWxpbms7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfcmVhZGxpbmszYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mczNfcmVhZGxpbmthcmdzICphcmdzKQoreworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwKKwkJCQkJYXJncy0+cGdsZW4sIE5GUzNfcmVhZGxpbmtyZXNfc3opOworfQorCisvKgorICogMy4zLjYgIFJFQUQzYXJncworICoKKyAqCXN0cnVjdCBSRUFEM2FyZ3MgeworICoJCW5mc19maDMJCWZpbGU7CisgKgkJb2Zmc2V0MwkJb2Zmc2V0OworICoJCWNvdW50MwkJY291bnQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZDNhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4ICsgNCk7CiAJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKLQkqcCsrID0gaHRvbmwoYXJncy0+Y291bnQpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlYWQzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX3JlYWQzYXJncyh4ZHIsIGFyZ3MpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwKKwkJCQkJYXJncy0+Y291bnQsIE5GUzNfcmVhZHJlc19zeik7CisJcmVxLT5ycV9yY3ZfYnVmLmZsYWdzIHw9IFhEUkJVRl9SRUFEOworfQorCisvKgorICogMy4zLjcgIFdSSVRFM2FyZ3MKKyAqCisgKgllbnVtIHN0YWJsZV9ob3cgeworICoJCVVOU1RBQkxFICA9IDAsCisgKgkJREFUQV9TWU5DID0gMSwKKyAqCQlGSUxFX1NZTkMgPSAyCisgKgl9OworICoKKyAqCXN0cnVjdCBXUklURTNhcmdzIHsKKyAqCQluZnNfZmgzCQlmaWxlOworICoJCW9mZnNldDMJCW9mZnNldDsKKyAqCQljb3VudDMJCWNvdW50OworICoJCXN0YWJsZV9ob3cJc3RhYmxlOworICoJCW9wYXF1ZQkJZGF0YTw+OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3dyaXRlM2FyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCArIDQgKyA0ICsgNCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+Y291bnQpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5zdGFibGUpOworCSpwID0gY3B1X3RvX2JlMzIoYXJncy0+Y291bnQpOworCXhkcl93cml0ZV9wYWdlcyh4ZHIsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGFyZ3MtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3dyaXRlM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCWVuY29kZV93cml0ZTNhcmdzKHhkciwgYXJncyk7CisJeGRyLT5idWYtPmZsYWdzIHw9IFhEUkJVRl9XUklURTsKK30KKworLyoKKyAqIDMuMy44ICBDUkVBVEUzYXJncworICoKKyAqCWVudW0gY3JlYXRlbW9kZTMgeworICoJCVVOQ0hFQ0tFRCA9IDAsCisgKgkJR1VBUkRFRCAgID0gMSwKKyAqCQlFWENMVVNJVkUgPSAyCisgKgl9OworICoKKyAqCXVuaW9uIGNyZWF0ZWhvdzMgc3dpdGNoIChjcmVhdGVtb2RlMyBtb2RlKSB7CisgKgljYXNlIFVOQ0hFQ0tFRDoKKyAqCWNhc2UgR1VBUkRFRDoKKyAqCQlzYXR0cjMgICAgICAgb2JqX2F0dHJpYnV0ZXM7CisgKgljYXNlIEVYQ0xVU0lWRToKKyAqCQljcmVhdGV2ZXJmMyAgdmVyZjsKKyAqCX07CisgKgorICoJc3RydWN0IENSRUFURTNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzCXdoZXJlOworICoJCWNyZWF0ZWhvdzMJaG93OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2NyZWF0ZWhvdzMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX3VpbnQzMih4ZHIsIGFyZ3MtPmNyZWF0ZW1vZGUpOworCXN3aXRjaCAoYXJncy0+Y3JlYXRlbW9kZSkgeworCWNhc2UgTkZTM19DUkVBVEVfVU5DSEVDS0VEOgorCWNhc2UgTkZTM19DUkVBVEVfR1VBUkRFRDoKKwkJZW5jb2RlX3NhdHRyMyh4ZHIsIGFyZ3MtPnNhdHRyKTsKKwkJYnJlYWs7CisJY2FzZSBORlMzX0NSRUFURV9FWENMVVNJVkU6CisJCWVuY29kZV9jcmVhdGV2ZXJmMyh4ZHIsIGFyZ3MtPnZlcmlmaWVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfY3JlYXRlM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczNfY3JlYXRlYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzMyh4ZHIsIGFyZ3MtPmZoLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCWVuY29kZV9jcmVhdGVob3czKHhkciwgYXJncyk7Cit9CisKKy8qCisgKiAzLjMuOSAgTUtESVIzYXJncworICoKKyAqCXN0cnVjdCBNS0RJUjNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzCXdoZXJlOworICoJCXNhdHRyMwkJYXR0cmlidXRlczsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19ta2RpcjNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzM19ta2RpcmFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwllbmNvZGVfc2F0dHIzKHhkciwgYXJncy0+c2F0dHIpOworfQorCisvKgorICogMy4zLjEwICBTWU1MSU5LM2FyZ3MKKyAqCisgKglzdHJ1Y3Qgc3ltbGlua2RhdGEzIHsKKyAqCQlzYXR0cjMJCXN5bWxpbmtfYXR0cmlidXRlczsKKyAqCQluZnNwYXRoMwlzeW1saW5rX2RhdGE7CisgKgl9OworICoKKyAqCXN0cnVjdCBTWU1MSU5LM2FyZ3MgeworICoJCWRpcm9wYXJnczMJd2hlcmU7CisgKgkJc3ltbGlua2RhdGEzCXN5bWxpbms7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfc3ltbGlua2RhdGEzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczNfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX3NhdHRyMyh4ZHIsIGFyZ3MtPnNhdHRyKTsKKwllbmNvZGVfbmZzcGF0aDMoeGRyLCBhcmdzLT5wYWdlcywgYXJncy0+cGF0aGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19zeW1saW5rM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzM19zeW1saW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzMyh4ZHIsIGFyZ3MtPmZyb21maCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOworCWVuY29kZV9zeW1saW5rZGF0YTMoeGRyLCBhcmdzKTsKK30KKworLyoKKyAqIDMuMy4xMSAgTUtOT0QzYXJncworICoKKyAqCXN0cnVjdCBkZXZpY2VkYXRhMyB7CisgKgkJc2F0dHIzCQlkZXZfYXR0cmlidXRlczsKKyAqCQlzcGVjZGF0YTMJc3BlYzsKKyAqCX07CisgKgorICoJdW5pb24gbWtub2RkYXRhMyBzd2l0Y2ggKGZ0eXBlMyB0eXBlKSB7CisgKgljYXNlIE5GM0NIUjoKKyAqCWNhc2UgTkYzQkxLOgorICoJCWRldmljZWRhdGEzCWRldmljZTsKKyAqCWNhc2UgTkYzU09DSzoKKyAqCWNhc2UgTkYzRklGTzoKKyAqCQlzYXR0cjMJCXBpcGVfYXR0cmlidXRlczsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IE1LTk9EM2FyZ3MgeworICoJCWRpcm9wYXJnczMJd2hlcmU7CisgKgkJbWtub2RkYXRhMwl3aGF0OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2RldmljZWRhdGEzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQoreworCWVuY29kZV9zYXR0cjMoeGRyLCBhcmdzLT5zYXR0cik7CisJZW5jb2RlX3NwZWNkYXRhMyh4ZHIsIGFyZ3MtPnJkZXYpOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfbWtub2RkYXRhMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQoreworCWVuY29kZV9mdHlwZTMoeGRyLCBhcmdzLT50eXBlKTsKKwlzd2l0Y2ggKGFyZ3MtPnR5cGUpIHsKKwljYXNlIE5GM0NIUjoKKwljYXNlIE5GM0JMSzoKKwkJZW5jb2RlX2RldmljZWRhdGEzKHhkciwgYXJncyk7CisJCWJyZWFrOworCWNhc2UgTkYzU09DSzoKKwljYXNlIE5GM0ZJRk86CisJCWVuY29kZV9zYXR0cjMoeGRyLCBhcmdzLT5zYXR0cik7CisJCWJyZWFrOworCWNhc2UgTkYzUkVHOgorCWNhc2UgTkYzRElSOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19ta25vZDNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzM19ta25vZGFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwllbmNvZGVfbWtub2RkYXRhMyh4ZHIsIGFyZ3MpOworfQorCisvKgorICogMy4zLjEyICBSRU1PVkUzYXJncworICoKKyAqCXN0cnVjdCBSRU1PVkUzYXJncyB7CisgKgkJZGlyb3BhcmdzMyAgb2JqZWN0OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlbW92ZTNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzMyh4ZHIsIGFyZ3MtPmZoLCBhcmdzLT5uYW1lLm5hbWUsIGFyZ3MtPm5hbWUubGVuKTsKK30KKworLyoKKyAqIDMuMy4xNCAgUkVOQU1FM2FyZ3MKKyAqCisgKglzdHJ1Y3QgUkVOQU1FM2FyZ3MgeworICoJCWRpcm9wYXJnczMJZnJvbTsKKyAqCQlkaXJvcGFyZ3MzCXRvOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlbmFtZTNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgcXN0ciAqb2xkID0gYXJncy0+b2xkX25hbWU7CisJY29uc3Qgc3RydWN0IHFzdHIgKm5ldyA9IGFyZ3MtPm5ld19uYW1lOworCisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5vbGRfZGlyLCBvbGQtPm5hbWUsIG9sZC0+bGVuKTsKKwllbmNvZGVfZGlyb3BhcmdzMyh4ZHIsIGFyZ3MtPm5ld19kaXIsIG5ldy0+bmFtZSwgbmV3LT5sZW4pOworfQorCisvKgorICogMy4zLjE1ICBMSU5LM2FyZ3MKKyAqCisgKglzdHJ1Y3QgTElOSzNhcmdzIHsKKyAqCQluZnNfZmgzCQlmaWxlOworICoJCWRpcm9wYXJnczMJbGluazsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19saW5rM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzM19saW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZyb21maCk7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT50b2ZoLCBhcmdzLT50b25hbWUsIGFyZ3MtPnRvbGVuKTsKK30KKworLyoKKyAqIDMuMy4xNiAgUkVBRERJUjNhcmdzCisgKgorICoJc3RydWN0IFJFQURESVIzYXJncyB7CisgKgkJbmZzX2ZoMwkJZGlyOworICoJCWNvb2tpZTMJCWNvb2tpZTsKKyAqCQljb29raWV2ZXJmMwljb29raWV2ZXJmOworICoJCWNvdW50MwkJY291bnQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZGRpcjNhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4ICsgTkZTM19DT09LSUVWRVJGU0laRSArIDQpOworCXAgPSB4ZHJfZW5jb2RlX2Nvb2tpZTMocCwgYXJncy0+Y29va2llKTsKKwlwID0geGRyX2VuY29kZV9jb29raWV2ZXJmMyhwLCBhcmdzLT52ZXJmKTsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlYWRkaXIzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQoreworCWVuY29kZV9yZWFkZGlyM2FyZ3MoeGRyLCBhcmdzKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCAwLAorCQkJCWFyZ3MtPmNvdW50LCBORlMzX3JlYWRkaXJyZXNfc3opOworfQorCisvKgorICogMy4zLjE3ICBSRUFERElSUExVUzNhcmdzCisgKgorICoJc3RydWN0IFJFQURESVJQTFVTM2FyZ3MgeworICoJCW5mc19maDMJCWRpcjsKKyAqCQljb29raWUzCQljb29raWU7CisgKgkJY29va2lldmVyZjMJY29va2lldmVyZjsKKyAqCQljb3VudDMJCWRpcmNvdW50OworICoJCWNvdW50MwkJbWF4Y291bnQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZGRpcnBsdXMzYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwlfX2JlMzIgKnA7CisKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDggKyBORlMzX0NPT0tJRVZFUkZTSVpFICsgNCArIDQpOworCXAgPSB4ZHJfZW5jb2RlX2Nvb2tpZTMocCwgYXJncy0+Y29va2llKTsKKwlwID0geGRyX2VuY29kZV9jb29raWV2ZXJmMyhwLCBhcmdzLT52ZXJmKTsKKworCS8qCisJICogcmVhZGRpcnBsdXM6IG5lZWQgZGlyY291bnQgKyBidWZmZXIgc2l6ZS4KKwkgKiBXZSBqdXN0IG1ha2Ugc3VyZSB3ZSBtYWtlIGRpcmNvdW50IGJpZyBlbm91Z2gKKwkgKi8KKwkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+Y291bnQgPj4gMyk7CisKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlYWRkaXJwbHVzM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwllbmNvZGVfcmVhZGRpcnBsdXMzYXJncyh4ZHIsIGFyZ3MpOworCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIDAsCisJCQkJYXJncy0+Y291bnQsIE5GUzNfcmVhZGRpcnJlc19zeik7Cit9CisKKy8qCisgKiAzLjMuMjEgIENPTU1JVDNhcmdzCisgKgorICoJc3RydWN0IENPTU1JVDNhcmdzIHsKKyAqCQluZnNfZmgzCQlmaWxlOworICoJCW9mZnNldDMJCW9mZnNldDsKKyAqCQljb3VudDMJCWNvdW50OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2NvbW1pdDNhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4ICsgNCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX2NvbW1pdDNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCWVuY29kZV9jb21taXQzYXJncyh4ZHIsIGFyZ3MpOwogfQogCiAjaWZkZWYgQ09ORklHX05GU19WM19BQ0wKLS8qCi0gKiBFbmNvZGUgR0VUQUNMIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9nZXRhY2xhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCSAgICBzdHJ1Y3QgbmZzM19nZXRhY2xhcmdzICphcmdzKQorCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfZ2V0YWNsM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczNfZ2V0YWNsYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX2NyZWQtPmNyX2F1dGg7Ci0JdW5zaWduZWQgaW50IHJlcGxlbjsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCSpwKysgPSBodG9ubChhcmdzLT5tYXNrKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0KLQlpZiAoYXJncy0+bWFzayAmIChORlNfQUNMIHwgTkZTX0RGQUNMKSkgewotCQkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KLQkJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsKLQkJCSAgQUNMM19nZXRhY2xyZXNfc3opIDw8IDI7Ci0JCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgMCwKLQkJCQkgTkZTQUNMX01BWFBBR0VTIDw8IFBBR0VfU0hJRlQpOwotCX0KLQlyZXR1cm4gMDsKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKwllbmNvZGVfdWludDMyKHhkciwgYXJncy0+bWFzayk7CisJaWYgKGFyZ3MtPm1hc2sgJiAoTkZTX0FDTCB8IE5GU19ERkFDTCkpCisJCXByZXBhcmVfcmVwbHlfYnVmZmVyKHJlcSwgYXJncy0+cGFnZXMsIDAsCisJCQkJCU5GU0FDTF9NQVhQQUdFUyA8PCBQQUdFX1NISUZULAorCQkJCQlBQ0wzX2dldGFjbHJlc19zeik7CiB9CiAKLS8qCi0gKiBFbmNvZGUgU0VUQUNMIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9zZXRhY2xhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IG5mczNfc2V0YWNsYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19zZXRhY2wzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzM19zZXRhY2xhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfYnVmICpidWYgPSAmcmVxLT5ycV9zbmRfYnVmOwogCXVuc2lnbmVkIGludCBiYXNlOwotCWludCBlcnI7CisJaW50IGVycm9yOwogCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBORlNfRkgoYXJncy0+aW5vZGUpKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+bWFzayk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCWJhc2UgPSByZXEtPnJxX3NsZW47Ci0KKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIE5GU19GSChhcmdzLT5pbm9kZSkpOworCWVuY29kZV91aW50MzIoeGRyLCBhcmdzLT5tYXNrKTsKIAlpZiAoYXJncy0+bnBhZ2VzICE9IDApCi0JCXhkcl9lbmNvZGVfcGFnZXMoYnVmLCBhcmdzLT5wYWdlcywgMCwgYXJncy0+bGVuKTsKLQllbHNlCi0JCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLAotCQkJCXAgKyBYRFJfUVVBRExFTihhcmdzLT5sZW4pKTsKKwkJeGRyX3dyaXRlX3BhZ2VzKHhkciwgYXJncy0+cGFnZXMsIDAsIGFyZ3MtPmxlbik7CiAKLQllcnIgPSBuZnNhY2xfZW5jb2RlKGJ1ZiwgYmFzZSwgYXJncy0+aW5vZGUsCisJYmFzZSA9IHJlcS0+cnFfc2xlbjsKKwllcnJvciA9IG5mc2FjbF9lbmNvZGUoeGRyLT5idWYsIGJhc2UsIGFyZ3MtPmlub2RlLAogCQkJICAgIChhcmdzLT5tYXNrICYgTkZTX0FDTCkgPwogCQkJICAgIGFyZ3MtPmFjbF9hY2Nlc3MgOiBOVUxMLCAxLCAwKTsKLQlpZiAoZXJyID4gMCkKLQkJZXJyID0gbmZzYWNsX2VuY29kZShidWYsIGJhc2UgKyBlcnIsIGFyZ3MtPmlub2RlLAotCQkJCSAgICAoYXJncy0+bWFzayAmIE5GU19ERkFDTCkgPwotCQkJCSAgICBhcmdzLT5hY2xfZGVmYXVsdCA6IE5VTEwsIDEsCi0JCQkJICAgIE5GU19BQ0xfREVGQVVMVCk7Ci0JcmV0dXJuIChlcnIgPiAwKSA/IDAgOiBlcnI7CisJQlVHX09OKGVycm9yIDwgMCk7CisJZXJyb3IgPSBuZnNhY2xfZW5jb2RlKHhkci0+YnVmLCBiYXNlICsgZXJyb3IsIGFyZ3MtPmlub2RlLAorCQkJICAgIChhcmdzLT5tYXNrICYgTkZTX0RGQUNMKSA/CisJCQkgICAgYXJncy0+YWNsX2RlZmF1bHQgOiBOVUxMLCAxLAorCQkJICAgIE5GU19BQ0xfREVGQVVMVCk7CisJQlVHX09OKGVycm9yIDwgMCk7CiB9CisKICNlbmRpZiAgLyogQ09ORklHX05GU19WM19BQ0wgKi8KIAogLyoKLSAqIE5GUyBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICogTkZTdjMgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqCisgKiBORlN2MyByZXN1bHQgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAzLjMgb2YgUkZDIDE4MTM6CisgKiAiTkZTIFZlcnNpb24gMyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIi4KICAqLwogCiAvKgotICogRGVjb2RlIGF0dHJzdGF0IHJlcGx5LgorICogMy4zLjEgIEdFVEFUVFIzcmVzCisgKgorICoJc3RydWN0IEdFVEFUVFIzcmVzb2sgeworICoJCWZhdHRyMwkJb2JqX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXVuaW9uIEdFVEFUVFIzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJR0VUQVRUUjNyZXNvayAgcmVzb2s7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2dldGF0dHIzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzX2ZhdHRyICpyZXN1bHQpCiB7Ci0JaW50CXN0YXR1czsKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JeGRyX2RlY29kZV9mYXR0cihwLCBmYXR0cik7Ci0JcmV0dXJuIDA7CisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfZmF0dHIzKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKLSAqIERlY29kZSBzdGF0dXMrd2NjX2RhdGEgcmVwbHkKLSAqIFNBVFRSLCBSRU1PVkUsIFJNRElSCisgKiAzLjMuMiAgU0VUQVRUUjNyZXMKKyAqCisgKglzdHJ1Y3QgU0VUQVRUUjNyZXNvayB7CisgKgkJd2NjX2RhdGEgIG9ial93Y2M7CisgKgl9OworICoKKyAqCXN0cnVjdCBTRVRBVFRSM3Jlc2ZhaWwgeworICoJCXdjY19kYXRhICBvYmpfd2NjOworICoJfTsKKyAqCisgKgl1bmlvbiBTRVRBVFRSM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVNFVEFUVFIzcmVzb2sgICByZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJU0VUQVRUUjNyZXNmYWlsIHJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl93Y2NzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIGludCBuZnMzX3hkcl9kZWNfc2V0YXR0cjNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnNfZmF0dHIgKnJlc3VsdCkKIHsKLQlpbnQJc3RhdHVzOworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKIAotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQotCQlzdGF0dXMgPSBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXhkcl9kZWNvZGVfd2NjX2RhdGEocCwgZmF0dHIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlbW92ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlbW92ZXJlcyAqcmVzKQotewotCXJldHVybiBuZnMzX3hkcl93Y2NzdGF0KHJlcSwgcCwgcmVzLT5kaXJfYXR0cik7CisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9zdGF0dXM7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X3N0YXR1czoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKLSAqIERlY29kZSBMT09LVVAgcmVwbHkKKyAqIDMuMy4zICBMT09LVVAzcmVzCisgKgorICoJc3RydWN0IExPT0tVUDNyZXNvayB7CisgKgkJbmZzX2ZoMwkJb2JqZWN0OworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCQlwb3N0X29wX2F0dHIJZGlyX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXN0cnVjdCBMT09LVVAzcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCWRpcl9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBMT09LVVAzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJTE9PS1VQM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlMT09LVVAzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfbG9va3VwcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19sb29rdXAzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlc3VsdCkKIHsKLQlpbnQJc3RhdHVzOworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKIAotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKSB7Ci0JCXN0YXR1cyA9IG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JfSBlbHNlIHsKLQkJaWYgKCEocCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCByZXMtPmZoKSkpCi0JCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQkJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCX0KLQl4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmRpcl9hdHRyKTsKLQlyZXR1cm4gc3RhdHVzOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX25mc19maDMoeGRyLCByZXN1bHQtPmZoKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKLSAqIERlY29kZSBBQ0NFU1MgcmVwbHkKKyAqIDMuMy40ICBBQ0NFU1MzcmVzCisgKgorICoJc3RydWN0IEFDQ0VTUzNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJCXVpbnQzMgkJYWNjZXNzOworICoJfTsKKyAqCisgKglzdHJ1Y3QgQUNDRVNTM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gQUNDRVNTM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUFDQ0VTUzNyZXNvawlyZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJQUNDRVNTM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2FjY2Vzc3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19hY2Nlc3NyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2FjY2VzczNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzM19hY2Nlc3NyZXMgKnJlc3VsdCkKIHsKLQlpbnQJc3RhdHVzID0gbnRvaGwoKnArKyk7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOwogCi0JcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXJlcy0+YWNjZXNzID0gbnRvaGwoKnArKyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkbGlua2FyZ3MgKmFyZ3MpCi17Ci0Jc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwotCXVuc2lnbmVkIGludCByZXBsZW47Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0KLQkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KLQlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlMzX3JlYWRsaW5rcmVzX3N6KSA8PCAyOwotCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7Ci0JcmV0dXJuIDA7CisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfdWludDMyKHhkciwgJnJlc3VsdC0+YWNjZXNzKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKLSAqIERlY29kZSBSRUFETElOSyByZXBseQorICogMy4zLjUgIFJFQURMSU5LM3JlcworICoKKyAqCXN0cnVjdCBSRUFETElOSzNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCXN5bWxpbmtfYXR0cmlidXRlczsKKyAqCQluZnNwYXRoMwlkYXRhOworICoJfTsKKyAqCisgKglzdHJ1Y3QgUkVBRExJTkszcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCXN5bWxpbmtfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gUkVBRExJTkszcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJUkVBRExJTkszcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVJFQURMSU5LM3Jlc2ZhaWwgcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIGludCBuZnMzX3hkcl9kZWNfcmVhZGxpbmszcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnNfZmF0dHIgKnJlc3VsdCkKIHsKLQlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKLQlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0KTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfbmZzcGF0aDMoeGRyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworLyoKKyAqIDMuMy42ICBSRUFEM3JlcworICoKKyAqCXN0cnVjdCBSRUFEM3Jlc29rIHsKKyAqCQlwb3N0X29wX2F0dHIJZmlsZV9hdHRyaWJ1dGVzOworICoJCWNvdW50MwkJY291bnQ7CisgKgkJYm9vbAkJZW9mOworICoJCW9wYXF1ZQkJZGF0YTw+OworICoJfTsKKyAqCisgKglzdHJ1Y3QgUkVBRDNyZXNmYWlsIHsKKyAqCQlwb3N0X29wX2F0dHIJZmlsZV9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBSRUFEM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVJFQUQzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVJFQUQzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfcmVhZDNyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlc3VsdCkKK3sKKwl1MzIgZW9mLCBjb3VudCwgb2NvdW50LCByZWN2ZDsKIAlzaXplX3QgaGRybGVuOwotCXUzMiBsZW4sIHJlY3ZkOwotCWludAlzdGF0dXM7CisJX19iZTMyICpwOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwljb3VudCA9IGJlMzJfdG9fY3B1cChwKyspOworCWVvZiA9IGJlMzJfdG9fY3B1cChwKyspOworCW9jb3VudCA9IGJlMzJfdG9fY3B1cChwKyspOworCWlmICh1bmxpa2VseShvY291bnQgIT0gY291bnQpKQorCQlnb3RvIG91dF9taXNtYXRjaDsKKwloZHJsZW4gPSAodTggKil4ZHItPnAgLSAodTggKil4ZHItPmlvdi0+aW92X2Jhc2U7CisJcmVjdmQgPSB4ZHItPmJ1Zi0+bGVuIC0gaGRybGVuOworCWlmICh1bmxpa2VseShjb3VudCA+IHJlY3ZkKSkKKwkJZ290byBvdXRfY2hlYXRpbmc7CiAKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JLyogQ29udmVydCBsZW5ndGggb2Ygc3ltbGluayAqLwotCWxlbiA9IG50b2hsKCpwKyspOwotCWlmIChsZW4gPj0gcmN2YnVmLT5wYWdlX2xlbikgewotCQlkcHJpbnRrKCJuZnM6IHNlcnZlciByZXR1cm5lZCBnaWFudCBzeW1saW5rIVxuIik7Ci0JCXJldHVybiAtRU5BTUVUT09MT05HOwotCX0KLQotCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7Ci0JaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQURMSU5LIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKLQkJCQkibGVuZ3RoICVadSA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOwotCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFETElOSyBoZWFkZXIgaXMgc2hvcnQuICIKLQkJCSJpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKLQkJeGRyX3NoaWZ0X2J1ZihyY3ZidWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7Ci0JfQotCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKLQlpZiAocmVjdmQgPCBsZW4pIHsKLQkJZHByaW50aygiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZGxpbmsgcmVwbHk6ICIKLQkJCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgbGVuLCByZWN2ZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXhkcl90ZXJtaW5hdGVfc3RyaW5nKHJjdmJ1ZiwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlY29kZSBSRUFEIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCi17Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOwotCXNpemVfdCBoZHJsZW47Ci0JdTMyIGNvdW50LCBvY291bnQsIHJlY3ZkOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0KLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JLyogRGVjb2RlIHJlcGx5IGNvdW50IGFuZCBFT0YgZmxhZy4gTkZTdjMgaXMgc29tZXdoYXQgcmVkdW5kYW50Ci0JICogaW4gdGhhdCBpdCBwdXRzIHRoZSBjb3VudCBib3RoIGluIHRoZSByZXMgc3RydWN0IGFuZCBpbiB0aGUKLQkgKiBvcGFxdWUgZGF0YSBjb3VudC4gKi8KLQljb3VudCAgICA9IG50b2hsKCpwKyspOwotCXJlcy0+ZW9mID0gbnRvaGwoKnArKyk7Ci0Jb2NvdW50ICAgPSBudG9obCgqcCsrKTsKLQotCWlmIChvY291bnQgIT0gY291bnQpIHsKLQkJZHByaW50aygiTkZTOiBSRUFEIGNvdW50IGRvZXNuJ3QgbWF0Y2ggUlBDIG9wYXF1ZSBjb3VudC5cbiIpOwotCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQl9Ci0KLQloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOwotCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFEIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKLQkJCQkibGVuZ3RoICVadSA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOwotICAgICAgIAkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRCBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOwotCQl4ZHJfc2hpZnRfYnVmKCZyZXEtPnJxX3Jjdl9idWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7Ci0JfQotCi0JcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOwotCWlmIChjb3VudCA+IHJlY3ZkKSB7Ci0JCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVwbHk6ICIKLQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOwotCQljb3VudCA9IHJlY3ZkOwotCQlyZXMtPmVvZiA9IDA7Ci0JfQotCi0JaWYgKGNvdW50IDwgcmVzLT5jb3VudCkKLQkJcmVzLT5jb3VudCA9IGNvdW50OwotCitvdXQ6CisJeGRyX3JlYWRfcGFnZXMoeGRyLCBjb3VudCk7CisJcmVzdWx0LT5lb2YgPSBlb2Y7CisJcmVzdWx0LT5jb3VudCA9IGNvdW50OwogCXJldHVybiBjb3VudDsKK291dF9taXNtYXRjaDoKKwlkcHJpbnRrKCJORlM6IFJFQUQgY291bnQgZG9lc24ndCBtYXRjaCBsZW5ndGggb2Ygb3BhcXVlOiAiCisJCSJjb3VudCAldSAhPSBvY291bnQgJXVcbiIsIGNvdW50LCBvY291bnQpOworCXJldHVybiAtRUlPOworb3V0X2NoZWF0aW5nOgorCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVzdWx0OiAiCisJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBjb3VudCwgcmVjdmQpOworCWNvdW50ID0gcmVjdmQ7CisJZW9mID0gMDsKKwlnb3RvIG91dDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3JlYWQzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworCWVycm9yID0gZGVjb2RlX3JlYWQzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgV1JJVEUgcmVzcG9uc2UKKyAqIDMuMy43ICBXUklURTNyZXMKKyAqCisgKgllbnVtIHN0YWJsZV9ob3cgeworICoJCVVOU1RBQkxFICA9IDAsCisgKgkJREFUQV9TWU5DID0gMSwKKyAqCQlGSUxFX1NZTkMgPSAyCisgKgl9OworICoKKyAqCXN0cnVjdCBXUklURTNyZXNvayB7CisgKgkJd2NjX2RhdGEJZmlsZV93Y2M7CisgKgkJY291bnQzCQljb3VudDsKKyAqCQlzdGFibGVfaG93CWNvbW1pdHRlZDsKKyAqCQl3cml0ZXZlcmYzCXZlcmY7CisgKgl9OworICoKKyAqCXN0cnVjdCBXUklURTNyZXNmYWlsIHsKKyAqCQl3Y2NfZGF0YQlmaWxlX3djYzsKKyAqCX07CisgKgorICoJdW5pb24gV1JJVEUzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJV1JJVEUzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVdSSVRFM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3N0YXRpYyBpbnQgZGVjb2RlX3dyaXRlM3Jlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXN1bHQpCiB7Ci0JaW50CXN0YXR1czsKKwlfX2JlMzIgKnA7CiAKLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmZhdHRyKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCArIE5GUzNfV1JJVEVWRVJGU0laRSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCXJlc3VsdC0+Y291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPnZlcmYtPmNvbW1pdHRlZCA9IGJlMzJfdG9fY3B1cChwKyspOworCWlmICh1bmxpa2VseShyZXN1bHQtPnZlcmYtPmNvbW1pdHRlZCA+IE5GU19GSUxFX1NZTkMpKQorCQlnb3RvIG91dF9iYWR2YWx1ZTsKKwltZW1jcHkocmVzdWx0LT52ZXJmLT52ZXJpZmllciwgcCwgTkZTM19XUklURVZFUkZTSVpFKTsKKwlyZXR1cm4gcmVzdWx0LT5jb3VudDsKK291dF9iYWR2YWx1ZToKKwlkcHJpbnRrKCJORlM6IGJhZCBzdGFibGVfaG93IHZhbHVlOiAldVxuIiwgcmVzdWx0LT52ZXJmLT5jb21taXR0ZWQpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KIAotCWlmIChzdGF0dXMgIT0gMCkKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CitzdGF0aWMgaW50IG5mczNfeGRyX2RlY193cml0ZTNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOwogCi0JcmVzLT5jb3VudCA9IG50b2hsKCpwKyspOwotCXJlcy0+dmVyZi0+Y29tbWl0dGVkID0gKGVudW0gbmZzM19zdGFibGVfaG93KW50b2hsKCpwKyspOwotCXJlcy0+dmVyZi0+dmVyaWZpZXJbMF0gPSAqcCsrOwotCXJlcy0+dmVyZi0+dmVyaWZpZXJbMV0gPSAqcCsrOwotCi0JcmV0dXJuIHJlcy0+Y291bnQ7CisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworCWVycm9yID0gZGVjb2RlX3dyaXRlM3Jlc29rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIGEgQ1JFQVRFIHJlc3BvbnNlCisgKiAzLjMuOCAgQ1JFQVRFM3JlcworICoKKyAqCXN0cnVjdCBDUkVBVEUzcmVzb2sgeworICoJCXBvc3Rfb3BfZmgzCW9iajsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgkJd2NjX2RhdGEJZGlyX3djYzsKKyAqCX07CisgKgorICoJc3RydWN0IENSRUFURTNyZXNmYWlsIHsKKyAqCQl3Y2NfZGF0YQlkaXJfd2NjOworICoJfTsKKyAqCisgKgl1bmlvbiBDUkVBVEUzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJQ1JFQVRFM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlDUkVBVEUzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfY3JlYXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV9jcmVhdGUzcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzdWx0KQogewotCWludAlzdGF0dXM7CisJaW50IGVycm9yOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmICgqcCsrKSB7Ci0JCQlpZiAoIShwID0geGRyX2RlY29kZV9maGFuZGxlKHAsIHJlcy0+ZmgpKSkKLQkJCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQkJCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQkJfSBlbHNlIHsKLQkJCW1lbXNldChyZXMtPmZoLCAwLCBzaXplb2YoKnJlcy0+ZmgpKTsKLQkJCS8qIERvIGRlY29kZSBwb3N0X29wX2F0dHIgYnV0IHNldCBpdCB0byBOVUxMICovCi0JCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JCQlyZXMtPmZhdHRyLT52YWxpZCA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlzdGF0dXMgPSBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfZmgzKHhkciwgcmVzdWx0LT5maCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJLyogVGhlIHNlcnZlciBpc24ndCByZXF1aXJlZCB0byByZXR1cm4gYSBmaWxlIGhhbmRsZS4KKwkgKiBJZiBpdCBkaWRuJ3QsIGZvcmNlIHRoZSBjbGllbnQgdG8gcGVyZm9ybSBhIExPT0tVUAorCSAqIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCBmaWxlIGhhbmRsZSBhbmQgYXR0cmlidXRlCisJICogdmFsdWVzIGZvciB0aGUgbmV3IG9iamVjdC4gKi8KKwlpZiAocmVzdWx0LT5maC0+c2l6ZSA9PSAwKQorCQlyZXN1bHQtPmZhdHRyLT52YWxpZCA9IDA7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2NyZWF0ZTNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2NyZWF0ZTNyZXNvayh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworLyoKKyAqIDMuMy4xMiAgUkVNT1ZFM3JlcworICoKKyAqCXN0cnVjdCBSRU1PVkUzcmVzb2sgeworICoJCXdjY19kYXRhICAgIGRpcl93Y2M7CisgKgl9OworICoKKyAqCXN0cnVjdCBSRU1PVkUzcmVzZmFpbCB7CisgKgkJd2NjX2RhdGEgICAgZGlyX3djYzsKKyAqCX07CisgKgorICoJdW5pb24gUkVNT1ZFM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVJFTU9WRTNyZXNvayAgIHJlc29rOworICoJZGVmYXVsdDoKKyAqCQlSRU1PVkUzcmVzZmFpbCByZXNmYWlsOworICoJfTsKKyAqLworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfcmVtb3ZlM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnNfcmVtb3ZlcmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdC0+ZGlyX2F0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAzLjMuMTQgIFJFTkFNRTNyZXMKKyAqCisgKglzdHJ1Y3QgUkVOQU1FM3Jlc29rIHsKKyAqCQl3Y2NfZGF0YQlmcm9tZGlyX3djYzsKKyAqCQl3Y2NfZGF0YQl0b2Rpcl93Y2M7CisgKgl9OworICoKKyAqCXN0cnVjdCBSRU5BTUUzcmVzZmFpbCB7CisgKgkJd2NjX2RhdGEJZnJvbWRpcl93Y2M7CisgKgkJd2NjX2RhdGEJdG9kaXJfd2NjOworICoJfTsKKyAqCisgKgl1bmlvbiBSRU5BTUUzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJUkVOQU1FM3Jlc29rICAgcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVJFTkFNRTNyZXNmYWlsIHJlc2ZhaWw7CisgKgl9OworICovCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19yZW5hbWUzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mc19yZW5hbWVyZXMgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3djY19kYXRhKHhkciwgcmVzdWx0LT5vbGRfZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3djY19kYXRhKHhkciwgcmVzdWx0LT5uZXdfZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAzLjMuMTUgIExJTkszcmVzCisgKgorICoJc3RydWN0IExJTkszcmVzb2sgeworICoJCXBvc3Rfb3BfYXR0cglmaWxlX2F0dHJpYnV0ZXM7CisgKgkJd2NjX2RhdGEJbGlua2Rpcl93Y2M7CisgKgl9OworICoKKyAqCXN0cnVjdCBMSU5LM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglmaWxlX2F0dHJpYnV0ZXM7CisgKgkJd2NjX2RhdGEJbGlua2Rpcl93Y2M7CisgKgl9OworICoKKyAqCXVuaW9uIExJTkszcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJTElOSzNyZXNvawlyZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJTElOSzNyZXNmYWlsCXJlc2ZhaWw7CisgKgl9OworICovCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19saW5rM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mczNfbGlua3JlcyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisvKioKKyAqIG5mczNfZGVjb2RlX2RpcmVudCAtIERlY29kZSBhIHNpbmdsZSBORlN2MyBkaXJlY3RvcnkgZW50cnkgc3RvcmVkIGluCisgKgkJCXRoZSBsb2NhbCBwYWdlIGNhY2hlCisgKiBAeGRyOiBYRFIgc3RyZWFtIHdoZXJlIGVudHJ5IHJlc2lkZXMKKyAqIEBlbnRyeTogYnVmZmVyIHRvIGZpbGwgaW4gd2l0aCBlbnRyeSBkYXRhCisgKiBAcGx1czogYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgYSByZWFkZGlycGx1cyBlbnRyeQorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcworICogcmV0dXJuZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBkdXJpbmcgUkVBRERJUiByZXBseSBkZWNvZGluZywgYnV0CisgKiByYXRoZXIgd2hlbmV2ZXIgYW4gYXBwbGljYXRpb24gaW52b2tlcyB0aGUgZ2V0ZGVudHMoMikgc3lzdGVtIGNhbGwKKyAqIG9uIGEgZGlyZWN0b3J5IGFscmVhZHkgaW4gb3VyIGNhY2hlLgorICoKKyAqIDMuMy4xNiAgZW50cnkzCisgKgorICoJc3RydWN0IGVudHJ5MyB7CisgKgkJZmlsZWlkMwkJZmlsZWlkOworICoJCWZpbGVuYW1lMwluYW1lOworICoJCWNvb2tpZTMJCWNvb2tpZTsKKyAqCQlmaGFuZGxlMwlmaWxlaGFuZGxlOworICoJCXBvc3Rfb3BfYXR0cjMJYXR0cmlidXRlczsKKyAqCQllbnRyeTMJCSpuZXh0ZW50cnk7CisgKgl9OworICoKKyAqIDMuMy4xNyAgZW50cnlwbHVzMworICoJc3RydWN0IGVudHJ5cGx1czMgeworICoJCWZpbGVpZDMJCWZpbGVpZDsKKyAqCQlmaWxlbmFtZTMJbmFtZTsKKyAqCQljb29raWUzCQljb29raWU7CisgKgkJcG9zdF9vcF9hdHRyCW5hbWVfYXR0cmlidXRlczsKKyAqCQlwb3N0X29wX2ZoMwluYW1lX2hhbmRsZTsKKyAqCQllbnRyeXBsdXMzCSpuZXh0ZW50cnk7CisgKgl9OworICovCitpbnQgbmZzM19kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAorCQkgICAgICAgaW50IHBsdXMpCit7CisJc3RydWN0IG5mc19lbnRyeSBvbGQgPSAqZW50cnk7CisJX19iZTMyICpwOworCWludCBlcnJvcjsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAoKnAgPT0geGRyX3plcm8pIHsKKwkJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJZ290byBvdXRfb3ZlcmZsb3c7CisJCWlmICgqcCA9PSB4ZHJfemVybykKKwkJCXJldHVybiAtRUFHQUlOOworCQllbnRyeS0+ZW9mID0gMTsKKwkJcmV0dXJuIC1FQkFEQ09PS0lFOwogCX0KLQlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmRpcl9hdHRyKTsKLQlyZXR1cm4gc3RhdHVzOworCisJZXJyb3IgPSBkZWNvZGVfZmlsZWlkMyh4ZHIsICZlbnRyeS0+aW5vKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9pbmxpbmVfZmlsZW5hbWUzKHhkciwgJmVudHJ5LT5uYW1lLCAmZW50cnktPmxlbik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJcmV0dXJuIGVycm9yOworCisJZW50cnktPnByZXZfY29va2llID0gZW50cnktPmNvb2tpZTsKKwllcnJvciA9IGRlY29kZV9jb29raWUzKHhkciwgJmVudHJ5LT5jb29raWUpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCXJldHVybiBlcnJvcjsKKworCWVudHJ5LT5kX3R5cGUgPSBEVF9VTktOT1dOOworCisJaWYgKHBsdXMpIHsKKwkJZW50cnktPmZhdHRyLT52YWxpZCA9IDA7CisJCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIGVudHJ5LT5mYXR0cik7CisJCWlmICh1bmxpa2VseShlcnJvcikpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmIChlbnRyeS0+ZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjMpCisJCQllbnRyeS0+ZF90eXBlID0gbmZzX3Vtb2RlX3RvX2R0eXBlKGVudHJ5LT5mYXR0ci0+bW9kZSk7CisKKwkJLyogSW4gZmFjdCwgYSBwb3N0X29wX2ZoMzogKi8KKwkJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJZ290byBvdXRfb3ZlcmZsb3c7CisJCWlmICgqcCAhPSB4ZHJfemVybykgeworCQkJZXJyb3IgPSBkZWNvZGVfbmZzX2ZoMyh4ZHIsIGVudHJ5LT5maCk7CisJCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQkJaWYgKGVycm9yID09IC1FMkJJRykKKwkJCQkJZ290byBvdXRfdHJ1bmNhdGVkOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlCisJCQl6ZXJvX25mc19maDMoZW50cnktPmZoKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVBR0FJTjsKK291dF90cnVuY2F0ZWQ6CisJZHByaW50aygiTkZTOiBkaXJlY3RvcnkgZW50cnkgY29udGFpbnMgaW52YWxpZCBmaWxlIGhhbmRsZVxuIik7CisJKmVudHJ5ID0gb2xkOworCXJldHVybiAtRUFHQUlOOwogfQogCiAvKgotICogRGVjb2RlIFJFTkFNRSByZXBseQorICogMy4zLjE2ICBSRUFERElSM3JlcworICoKKyAqCXN0cnVjdCBkaXJsaXN0MyB7CisgKgkJZW50cnkzCQkqZW50cmllczsKKyAqCQlib29sCQllb2Y7CisgKgl9OworICoKKyAqCXN0cnVjdCBSRUFERElSM3Jlc29rIHsKKyAqCQlwb3N0X29wX2F0dHIJZGlyX2F0dHJpYnV0ZXM7CisgKgkJY29va2lldmVyZjMJY29va2lldmVyZjsKKyAqCQlkaXJsaXN0MwlyZXBseTsKKyAqCX07CisgKgorICoJc3RydWN0IFJFQURESVIzcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCWRpcl9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBSRUFERElSM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVJFQURESVIzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVJFQURESVIzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKKyAqCisgKiBSZWFkIHRoZSBkaXJlY3RvcnkgY29udGVudHMgaW50byB0aGUgcGFnZSBjYWNoZSwgYnV0IG90aGVyd2lzZQorICogZG9uJ3QgdG91Y2ggdGhlbS4gIFRoZSBhY3R1YWwgZGVjb2RpbmcgaXMgZG9uZSBieSBuZnMzX2RlY29kZV9lbnRyeSgpCisgKiBkdXJpbmcgc3Vic2VxdWVudCBuZnNfcmVhZGRpcigpIGNhbGxzLgogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW5hbWVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZW5hbWVyZXMgKnJlcykKK3N0YXRpYyBpbnQgZGVjb2RlX2Rpcmxpc3QzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JaW50CXN0YXR1czsKKwl1MzIgcmVjdmQsIHBnbGVuOworCXNpemVfdCBoZHJsZW47CiAKLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSAhPSAwKQotCQlzdGF0dXMgPSBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+b2xkX2ZhdHRyKTsKLQlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPm5ld19mYXR0cik7Ci0JcmV0dXJuIHN0YXR1czsKKwlwZ2xlbiA9IHhkci0+YnVmLT5wYWdlX2xlbjsKKwloZHJsZW4gPSAodTggKil4ZHItPnAgLSAodTggKil4ZHItPmlvdi0+aW92X2Jhc2U7CisJcmVjdmQgPSB4ZHItPmJ1Zi0+bGVuIC0gaGRybGVuOworCWlmICh1bmxpa2VseShwZ2xlbiA+IHJlY3ZkKSkKKwkJZ290byBvdXRfY2hlYXRpbmc7CitvdXQ6CisJeGRyX3JlYWRfcGFnZXMoeGRyLCBwZ2xlbik7CisJcmV0dXJuIHBnbGVuOworb3V0X2NoZWF0aW5nOgorCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWRkaXIgcmVzdWx0OiAiCisJCSJwZ2xlbiAldSA+IHJlY3ZkICV1XG4iLCBwZ2xlbiwgcmVjdmQpOworCXBnbGVuID0gcmVjdmQ7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlYWRkaXIzcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzM19yZWFkZGlycmVzICpyZXN1bHQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJLyogWFhYOiBkbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHJlc3VsdC0+dmVyZiAhPSBOVUxMID8gKi8KKwllcnJvciA9IGRlY29kZV9jb29raWV2ZXJmMyh4ZHIsIHJlc3VsdC0+dmVyZik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfZGlybGlzdDMoeGRyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3JlYWRkaXIzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzM19yZWFkZGlycmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfcmVhZGRpcjNyZXNvayh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgTElOSyByZXBseQorICogMy4zLjE4ICBGU1NUQVQzcmVzCisgKgorICoJc3RydWN0IEZTU1RBVDNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJCXNpemUzCQl0Ynl0ZXM7CisgKgkJc2l6ZTMJCWZieXRlczsKKyAqCQlzaXplMwkJYWJ5dGVzOworICoJCXNpemUzCQl0ZmlsZXM7CisgKgkJc2l6ZTMJCWZmaWxlczsKKyAqCQlzaXplMwkJYWZpbGVzOworICoJCXVpbnQzMgkJaW52YXJzZWM7CisgKgl9OworICoKKyAqCXN0cnVjdCBGU1NUQVQzcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBGU1NUQVQzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJRlNTVEFUM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlGU1NUQVQzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19saW5rcmVzICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV9mc3N0YXQzcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzdWx0KQogewotCWludAlzdGF0dXM7CisJX19iZTMyICpwOwogCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkgIT0gMCkKLQkJc3RhdHVzID0gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5kaXJfYXR0cik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqIERlY29kZSBGU1NUQVQgcmVwbHkKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfZnNzdGF0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZnNzdGF0ICpyZXMpCi17Ci0JaW50CQlzdGF0dXM7Ci0KLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+dGJ5dGVzKTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5mYnl0ZXMpOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPmFieXRlcyk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+dGZpbGVzKTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5mZmlsZXMpOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPmFmaWxlcyk7Ci0KKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA4ICogNiArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT50Ynl0ZXMpOworCXAgPSB4ZHJfZGVjb2RlX3NpemUzKHAsICZyZXN1bHQtPmZieXRlcyk7CisJcCA9IHhkcl9kZWNvZGVfc2l6ZTMocCwgJnJlc3VsdC0+YWJ5dGVzKTsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT50ZmlsZXMpOworCXAgPSB4ZHJfZGVjb2RlX3NpemUzKHAsICZyZXN1bHQtPmZmaWxlcyk7CisJeGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT5hZmlsZXMpOwogCS8qIGlnbm9yZSBpbnZhcnNlYyAqLwogCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfZnNzdGF0M3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnNfZnNzdGF0ICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKKwllcnJvciA9IGRlY29kZV9mc3N0YXQzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgRlNJTkZPIHJlcGx5CisgKiAzLjMuMTkgIEZTSU5GTzNyZXMKKyAqCisgKglzdHJ1Y3QgRlNJTkZPM3Jlc29rIHsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgkJdWludDMyCQlydG1heDsKKyAqCQl1aW50MzIJCXJ0cHJlZjsKKyAqCQl1aW50MzIJCXJ0bXVsdDsKKyAqCQl1aW50MzIJCXd0bWF4OworICoJCXVpbnQzMgkJd3RwcmVmOworICoJCXVpbnQzMgkJd3RtdWx0OworICoJCXVpbnQzMgkJZHRwcmVmOworICoJCXNpemUzCQltYXhmaWxlc2l6ZTsKKyAqCQluZnN0aW1lMwl0aW1lX2RlbHRhOworICoJCXVpbnQzMgkJcHJvcGVydGllczsKKyAqCX07CisgKgorICoJc3RydWN0IEZTSU5GTzNyZXNmYWlsIHsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXVuaW9uIEZTSU5GTzNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlGU0lORk8zcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCUZTSU5GTzNyZXNmYWlsCXJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9mc2luZm9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKnJlcykKK3N0YXRpYyBpbnQgZGVjb2RlX2ZzaW5mbzNyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBuZnNfZnNpbmZvICpyZXN1bHQpCiB7Ci0JaW50CQlzdGF0dXM7CisJX19iZTMyICpwOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0KLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQotCXJlcy0+cnRtYXggID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5ydHByZWYgPSBudG9obCgqcCsrKTsKLQlyZXMtPnJ0bXVsdCA9IG50b2hsKCpwKyspOwotCXJlcy0+d3RtYXggID0gbnRvaGwoKnArKyk7Ci0JcmVzLT53dHByZWYgPSBudG9obCgqcCsrKTsKLQlyZXMtPnd0bXVsdCA9IG50b2hsKCpwKyspOwotCXJlcy0+ZHRwcmVmID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+bWF4ZmlsZXNpemUpOwotCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZyZXMtPnRpbWVfZGVsdGEpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKiA3ICsgOCArIDggKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJcmVzdWx0LT5ydG1heCAgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPnJ0cHJlZiA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+cnRtdWx0ID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT53dG1heCAgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPnd0cHJlZiA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+d3RtdWx0ID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5kdHByZWYgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT5tYXhmaWxlc2l6ZSk7CisJeGRyX2RlY29kZV9uZnN0aW1lMyhwLCAmcmVzdWx0LT50aW1lX2RlbHRhKTsKIAogCS8qIGlnbm9yZSBwcm9wZXJ0aWVzICovCi0JcmVzLT5sZWFzZV90aW1lID0gMDsKKwlyZXN1bHQtPmxlYXNlX3RpbWUgPSAwOwogCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfZnNpbmZvM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnNfZnNpbmZvICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKKwllcnJvciA9IGRlY29kZV9mc2luZm8zcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgUEFUSENPTkYgcmVwbHkKKyAqIDMuMy4yMCAgUEFUSENPTkYzcmVzCisgKgorICoJc3RydWN0IFBBVEhDT05GM3Jlc29rIHsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgkJdWludDMyCQlsaW5rbWF4OworICoJCXVpbnQzMgkJbmFtZV9tYXg7CisgKgkJYm9vbAkJbm9fdHJ1bmM7CisgKgkJYm9vbAkJY2hvd25fcmVzdHJpY3RlZDsKKyAqCQlib29sCQljYXNlX2luc2Vuc2l0aXZlOworICoJCWJvb2wJCWNhc2VfcHJlc2VydmluZzsKKyAqCX07CisgKgorICoJc3RydWN0IFBBVEhDT05GM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gUEFUSENPTkYzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJUEFUSENPTkYzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVBBVEhDT05GM3Jlc2ZhaWwgcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3BhdGhjb25mcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnJlcykKK3N0YXRpYyBpbnQgZGVjb2RlX3BhdGhjb25mM3Jlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnJlc3VsdCkKIHsKLQlpbnQJCXN0YXR1czsKKwlfX2JlMzIgKnA7CiAKLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXJlcy0+bWF4X2xpbmsgPSBudG9obCgqcCsrKTsKLQlyZXMtPm1heF9uYW1lbGVuID0gbnRvaGwoKnArKyk7Ci0KKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICogNik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCXJlc3VsdC0+bWF4X2xpbmsgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPm1heF9uYW1lbGVuID0gYmUzMl90b19jcHVwKHApOwogCS8qIGlnbm9yZSByZW1haW5pbmcgZmllbGRzICovCiAJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19wYXRoY29uZjNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgc3RydWN0IG5mc19wYXRoY29uZiAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9zdGF0dXM7CisJZXJyb3IgPSBkZWNvZGVfcGF0aGNvbmYzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgQ09NTUlUIHJlcGx5CisgKiAzLjMuMjEgIENPTU1JVDNyZXMKKyAqCisgKglzdHJ1Y3QgQ09NTUlUM3Jlc29rIHsKKyAqCQl3Y2NfZGF0YQlmaWxlX3djYzsKKyAqCQl3cml0ZXZlcmYzCXZlcmY7CisgKgl9OworICoKKyAqCXN0cnVjdCBDT01NSVQzcmVzZmFpbCB7CisgKgkJd2NjX2RhdGEJZmlsZV93Y2M7CisgKgl9OworICoKKyAqCXVuaW9uIENPTU1JVDNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlDT01NSVQzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCUNPTU1JVDNyZXNmYWlsCXJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9jb21taXRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnMzX3hkcl9kZWNfY29tbWl0M3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlc3VsdCkKIHsKLQlpbnQJCXN0YXR1czsKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CiAKLQlzdGF0dXMgPSBudG9obCgqcCsrKTsKLQlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmZhdHRyKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JcmVzLT52ZXJmLT52ZXJpZmllclswXSA9ICpwKys7Ci0JcmVzLT52ZXJmLT52ZXJpZmllclsxXSA9ICpwKys7Ci0JcmV0dXJuIDA7CisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworCWVycm9yID0gZGVjb2RlX3dyaXRldmVyZjMoeGRyLCByZXN1bHQtPnZlcmYtPnZlcmlmaWVyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAjaWZkZWYgQ09ORklHX05GU19WM19BQ0wKLS8qCi0gKiBEZWNvZGUgR0VUQUNMIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2dldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQkgICBzdHJ1Y3QgbmZzM19nZXRhY2xyZXMgKnJlcykKKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2dldGFjbDNyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIHN0cnVjdCBuZnMzX2dldGFjbHJlcyAqcmVzdWx0KQogewotCXN0cnVjdCB4ZHJfYnVmICpidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwotCWludCBzdGF0dXMgPSBudG9obCgqcCsrKTsKIAlzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsOwogCXVuc2lnbmVkIGludCAqYWNsY250OwotCWludCBlcnIsIGJhc2U7CisJc2l6ZV90IGhkcmxlbjsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQlyZXMtPm1hc2sgPSBudG9obCgqcCsrKTsKLQlpZiAocmVzLT5tYXNrICYgfihORlNfQUNMfE5GU19BQ0xDTlR8TkZTX0RGQUNMfE5GU19ERkFDTENOVCkpCi0JCXJldHVybiAtRUlOVkFMOwotCWJhc2UgPSAoY2hhciAqKXAgLSAoY2hhciAqKXJlcS0+cnFfcmN2X2J1Zi5oZWFkLT5pb3ZfYmFzZTsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV91aW50MzIoeGRyLCAmcmVzdWx0LT5tYXNrKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHJlc3VsdC0+bWFzayAmIH4oTkZTX0FDTHxORlNfQUNMQ05UfE5GU19ERkFDTHxORlNfREZBQ0xDTlQpKQorCQlnb3RvIG91dDsKIAotCWFjbCA9IChyZXMtPm1hc2sgJiBORlNfQUNMKSA/ICZyZXMtPmFjbF9hY2Nlc3MgOiBOVUxMOwotCWFjbGNudCA9IChyZXMtPm1hc2sgJiBORlNfQUNMQ05UKSA/ICZyZXMtPmFjbF9hY2Nlc3NfY291bnQgOiBOVUxMOwotCWVyciA9IG5mc2FjbF9kZWNvZGUoYnVmLCBiYXNlLCBhY2xjbnQsIGFjbCk7CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOwogCi0JYWNsID0gKHJlcy0+bWFzayAmIE5GU19ERkFDTCkgPyAmcmVzLT5hY2xfZGVmYXVsdCA6IE5VTEw7Ci0JYWNsY250ID0gKHJlcy0+bWFzayAmIE5GU19ERkFDTENOVCkgPyAmcmVzLT5hY2xfZGVmYXVsdF9jb3VudCA6IE5VTEw7Ci0JaWYgKGVyciA+IDApCi0JCWVyciA9IG5mc2FjbF9kZWNvZGUoYnVmLCBiYXNlICsgZXJyLCBhY2xjbnQsIGFjbCk7Ci0JcmV0dXJuIChlcnIgPiAwKSA/IDAgOiBlcnI7CisJYWNsID0gTlVMTDsKKwlpZiAocmVzdWx0LT5tYXNrICYgTkZTX0FDTCkKKwkJYWNsID0gJnJlc3VsdC0+YWNsX2FjY2VzczsKKwlhY2xjbnQgPSBOVUxMOworCWlmIChyZXN1bHQtPm1hc2sgJiBORlNfQUNMQ05UKQorCQlhY2xjbnQgPSAmcmVzdWx0LT5hY2xfYWNjZXNzX2NvdW50OworCWVycm9yID0gbmZzYWNsX2RlY29kZSh4ZHItPmJ1ZiwgaGRybGVuLCBhY2xjbnQsIGFjbCk7CisJaWYgKHVubGlrZWx5KGVycm9yIDw9IDApKQorCQlnb3RvIG91dDsKKworCWFjbCA9IE5VTEw7CisJaWYgKHJlc3VsdC0+bWFzayAmIE5GU19ERkFDTCkKKwkJYWNsID0gJnJlc3VsdC0+YWNsX2RlZmF1bHQ7CisJYWNsY250ID0gTlVMTDsKKwlpZiAocmVzdWx0LT5tYXNrICYgTkZTX0RGQUNMQ05UKQorCQlhY2xjbnQgPSAmcmVzdWx0LT5hY2xfZGVmYXVsdF9jb3VudDsKKwllcnJvciA9IG5mc2FjbF9kZWNvZGUoeGRyLT5idWYsIGhkcmxlbiArIGVycm9yLCBhY2xjbnQsIGFjbCk7CisJaWYgKHVubGlrZWx5KGVycm9yIDw9IDApKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKIH0KIAotLyoKLSAqIERlY29kZSBzZXRhY2wgcmVwbHkuCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3NldGFjbHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2dldGFjbDNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzM19nZXRhY2xyZXMgKnJlc3VsdCkKIHsKLQlpbnQgc3RhdHVzID0gbnRvaGwoKnArKyk7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOwogCi0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JeGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgZmF0dHIpOwotCXJldHVybiAwOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2dldGFjbDNyZXNvayh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3NldGFjbDNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzX2ZhdHRyICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKwogI2VuZGlmICAvKiBDT05GSUdfTkZTX1YzX0FDTCAqLwogCiAjZGVmaW5lIFBST0MocHJvYywgYXJndHlwZSwgcmVzdHlwZSwgdGltZXIpCQkJCVwKIFtORlMzUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCiAJLnBfcHJvYyAgICAgID0gTkZTM1BST0NfIyNwcm9jLAkJCQkJXAotCS5wX2VuY29kZSAgICA9IChreGRycHJvY190KSBuZnMzX3hkcl8jI2FyZ3R5cGUsCQkJXAotCS5wX2RlY29kZSAgICA9IChreGRycHJvY190KSBuZnMzX3hkcl8jI3Jlc3R5cGUsCQkJXAotCS5wX2FyZ2xlbiAgICA9IE5GUzNfIyNhcmd0eXBlIyNfc3osCQkJCVwKLQkucF9yZXBsZW4gICAgPSBORlMzXyMjcmVzdHlwZSMjX3N6LAkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJlcHJvY190KW5mczNfeGRyX2VuY18jI2FyZ3R5cGUjIzNhcmdzLAlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJkcHJvY190KW5mczNfeGRyX2RlY18jI3Jlc3R5cGUjIzNyZXMsCVwKKwkucF9hcmdsZW4gICAgPSBORlMzXyMjYXJndHlwZSMjYXJnc19zeiwJCQkJXAorCS5wX3JlcGxlbiAgICA9IE5GUzNfIyNyZXN0eXBlIyNyZXNfc3osCQkJCVwKIAkucF90aW1lciAgICAgPSB0aW1lciwJCQkJCQlcCiAJLnBfc3RhdGlkeCAgID0gTkZTM1BST0NfIyNwcm9jLAkJCQkJXAogCS5wX25hbWUgICAgICA9ICNwcm9jLAkJCQkJCVwKIAl9CiAKIHN0cnVjdCBycGNfcHJvY2luZm8JbmZzM19wcm9jZWR1cmVzW10gPSB7Ci0gIFBST0MoR0VUQVRUUiwJCWZoYW5kbGUsCWF0dHJzdGF0LCAxKSwKLSAgUFJPQyhTRVRBVFRSLCAJc2F0dHJhcmdzLAl3Y2NzdGF0LCAwKSwKLSAgUFJPQyhMT09LVVAsCQlkaXJvcGFyZ3MsCWxvb2t1cHJlcywgMiksCi0gIFBST0MoQUNDRVNTLAkJYWNjZXNzYXJncywJYWNjZXNzcmVzLCAxKSwKLSAgUFJPQyhSRUFETElOSywJcmVhZGxpbmthcmdzLAlyZWFkbGlua3JlcywgMyksCi0gIFBST0MoUkVBRCwJCXJlYWRhcmdzLAlyZWFkcmVzLCAzKSwKLSAgUFJPQyhXUklURSwJCXdyaXRlYXJncywJd3JpdGVyZXMsIDQpLAotICBQUk9DKENSRUFURSwJCWNyZWF0ZWFyZ3MsCWNyZWF0ZXJlcywgMCksCi0gIFBST0MoTUtESVIsCQlta2RpcmFyZ3MsCWNyZWF0ZXJlcywgMCksCi0gIFBST0MoU1lNTElOSywJCXN5bWxpbmthcmdzLAljcmVhdGVyZXMsIDApLAotICBQUk9DKE1LTk9ELAkJbWtub2RhcmdzLAljcmVhdGVyZXMsIDApLAotICBQUk9DKFJFTU9WRSwJCXJlbW92ZWFyZ3MsCXJlbW92ZXJlcywgMCksCi0gIFBST0MoUk1ESVIsCQlkaXJvcGFyZ3MsCXdjY3N0YXQsIDApLAotICBQUk9DKFJFTkFNRSwJCXJlbmFtZWFyZ3MsCXJlbmFtZXJlcywgMCksCi0gIFBST0MoTElOSywJCWxpbmthcmdzLAlsaW5rcmVzLCAwKSwKLSAgUFJPQyhSRUFERElSLAkJcmVhZGRpcmFyZ3MsCXJlYWRkaXJyZXMsIDMpLAotICBQUk9DKFJFQURESVJQTFVTLAlyZWFkZGlyYXJncywJcmVhZGRpcnJlcywgMyksCi0gIFBST0MoRlNTVEFULAkJZmhhbmRsZSwJZnNzdGF0cmVzLCAwKSwKLSAgUFJPQyhGU0lORk8sICAJZmhhbmRsZSwJZnNpbmZvcmVzLCAwKSwKLSAgUFJPQyhQQVRIQ09ORiwJZmhhbmRsZSwJcGF0aGNvbmZyZXMsIDApLAotICBQUk9DKENPTU1JVCwJCWNvbW1pdGFyZ3MsCWNvbW1pdHJlcywgNSksCisJUFJPQyhHRVRBVFRSLAkJZ2V0YXR0ciwJZ2V0YXR0ciwJMSksCisJUFJPQyhTRVRBVFRSLAkJc2V0YXR0ciwJc2V0YXR0ciwJMCksCisJUFJPQyhMT09LVVAsCQlsb29rdXAsCQlsb29rdXAsCQkyKSwKKwlQUk9DKEFDQ0VTUywJCWFjY2VzcywJCWFjY2VzcywJCTEpLAorCVBST0MoUkVBRExJTkssCQlyZWFkbGluaywJcmVhZGxpbmssCTMpLAorCVBST0MoUkVBRCwJCXJlYWQsCQlyZWFkLAkJMyksCisJUFJPQyhXUklURSwJCXdyaXRlLAkJd3JpdGUsCQk0KSwKKwlQUk9DKENSRUFURSwJCWNyZWF0ZSwJCWNyZWF0ZSwJCTApLAorCVBST0MoTUtESVIsCQlta2RpciwJCWNyZWF0ZSwJCTApLAorCVBST0MoU1lNTElOSywJCXN5bWxpbmssCWNyZWF0ZSwJCTApLAorCVBST0MoTUtOT0QsCQlta25vZCwJCWNyZWF0ZSwJCTApLAorCVBST0MoUkVNT1ZFLAkJcmVtb3ZlLAkJcmVtb3ZlLAkJMCksCisJUFJPQyhSTURJUiwJCWxvb2t1cCwJCXNldGF0dHIsCTApLAorCVBST0MoUkVOQU1FLAkJcmVuYW1lLAkJcmVuYW1lLAkJMCksCisJUFJPQyhMSU5LLAkJbGluaywJCWxpbmssCQkwKSwKKwlQUk9DKFJFQURESVIsCQlyZWFkZGlyLAlyZWFkZGlyLAkzKSwKKwlQUk9DKFJFQURESVJQTFVTLAlyZWFkZGlycGx1cywJcmVhZGRpciwJMyksCisJUFJPQyhGU1NUQVQsCQlnZXRhdHRyLAlmc3N0YXQsCQkwKSwKKwlQUk9DKEZTSU5GTywJCWdldGF0dHIsCWZzaW5mbywJCTApLAorCVBST0MoUEFUSENPTkYsCQlnZXRhdHRyLAlwYXRoY29uZiwJMCksCisJUFJPQyhDT01NSVQsCQljb21taXQsCQljb21taXQsCQk1KSwKIH07CiAKIHN0cnVjdCBycGNfdmVyc2lvbgkJbmZzX3ZlcnNpb24zID0gewpAQCAtMTE4NSw4ICsyNDY4LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mczNfYWNsX3Byb2NlZHVyZXNbXSA9IHsKIAlbQUNMUFJPQzNfR0VUQUNMXSA9IHsKIAkJLnBfcHJvYyA9IEFDTFBST0MzX0dFVEFDTCwKLQkJLnBfZW5jb2RlID0gKGt4ZHJwcm9jX3QpIG5mczNfeGRyX2dldGFjbGFyZ3MsCi0JCS5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnMzX3hkcl9nZXRhY2xyZXMsCisJCS5wX2VuY29kZSA9IChreGRyZXByb2NfdCluZnMzX3hkcl9lbmNfZ2V0YWNsM2FyZ3MsCisJCS5wX2RlY29kZSA9IChreGRyZHByb2NfdCluZnMzX3hkcl9kZWNfZ2V0YWNsM3JlcywKIAkJLnBfYXJnbGVuID0gQUNMM19nZXRhY2xhcmdzX3N6LAogCQkucF9yZXBsZW4gPSBBQ0wzX2dldGFjbHJlc19zeiwKIAkJLnBfdGltZXIgPSAxLApAQCAtMTE5NCw4ICsyNDc3LDggQEAKIAl9LAogCVtBQ0xQUk9DM19TRVRBQ0xdID0gewogCQkucF9wcm9jID0gQUNMUFJPQzNfU0VUQUNMLAotCQkucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfc2V0YWNsYXJncywKLQkJLnBfZGVjb2RlID0gKGt4ZHJwcm9jX3QpIG5mczNfeGRyX3NldGFjbHJlcywKKwkJLnBfZW5jb2RlID0gKGt4ZHJlcHJvY190KW5mczNfeGRyX2VuY19zZXRhY2wzYXJncywKKwkJLnBfZGVjb2RlID0gKGt4ZHJkcHJvY190KW5mczNfeGRyX2RlY19zZXRhY2wzcmVzLAogCQkucF9hcmdsZW4gPSBBQ0wzX3NldGFjbGFyZ3Nfc3osCiAJCS5wX3JlcGxlbiA9IEFDTDNfc2V0YWNscmVzX3N6LAogCQkucF90aW1lciA9IDAsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNF9mcy5oIGIvZnMvbmZzL25mczRfZnMuaAppbmRleCA5ZmE0OTYzLi43YTc0NzQwNyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRfZnMuaAorKysgYi9mcy9uZnMvbmZzNF9mcy5oCkBAIC00NCw2ICs0NCw3IEBACiAJTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsCiAJTkZTNENMTlRfUkVDTEFJTV9OT0dSQUNFLAogCU5GUzRDTE5UX0RFTEVHUkVUVVJOLAorCU5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwKIAlORlM0Q0xOVF9TRVNTSU9OX1JFU0VULAogCU5GUzRDTE5UX1JFQ0FMTF9TTE9ULAogfTsKQEAgLTEwOSw3ICsxMTAsNyBAQAogc3RydWN0IG5mczRfc3RhdGVfb3duZXIgewogCXN0cnVjdCBuZnNfdW5pcXVlX2lkIHNvX293bmVyX2lkOwogCXN0cnVjdCBuZnNfc2VydmVyICAgICpzb19zZXJ2ZXI7Ci0Jc3RydWN0IHJiX25vZGUJICAgICBzb19jbGllbnRfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZQkgICAgIHNvX3NlcnZlcl9ub2RlOwogCiAJc3RydWN0IHJwY19jcmVkCSAgICAgKnNvX2NyZWQ7CSAvKiBBc3NvY2lhdGVkIGNyZWQgKi8KIApAQCAtMjI3LDEyICsyMjgsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuZnM0X2RlbnRyeV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mczRfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAKLS8qIGlub2RlLmMgKi8KLWV4dGVybiBzc2l6ZV90IG5mczRfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKLWV4dGVybiBpbnQgbmZzNF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7Ci1leHRlcm4gc3NpemVfdCBuZnM0X2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKLQotCiAvKiBuZnM0cHJvYy5jICovCiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCB1MzIsIHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcnBjX2NyZWQgKiwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWRfcmVzICopOwogZXh0ZXJuIGludCBuZnM0X3Byb2Nfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKmFyZywgc3RydWN0IHJwY19jcmVkICopOwpAQCAtMjQxLDExICsyMzYsMTIgQEAKIGV4dGVybiBpbnQgbmZzNF9wcm9jX3JlbmV3KHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNF9pbml0X2NsaWVudGlkKHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNDFfaW5pdF9jbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7Ci1leHRlcm4gaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0KTsKK2V4dGVybiBpbnQgbmZzNF9kb19jbG9zZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBnZnBfdCBnZnBfbWFzaywgaW50IHdhaXQsIGJvb2wgcm9jKTsKIGV4dGVybiBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpOwogZXh0ZXJuIGludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKIAkJc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpmc19sb2NhdGlvbnMsIHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIG5mczRfcmVsZWFzZV9sb2Nrb3duZXIoY29uc3Qgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqbmZzNF94YXR0cl9oYW5kbGVyc1tdOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb24gKm5mczRfZ2V0X3Nlc3Npb24oY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKQEAgLTMzMSw3ICszMjcsNiBAQAogZXh0ZXJuIGNvbnN0IG5mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CiAKIC8qIG5mczR4ZHIuYyAqLwotZXh0ZXJuIF9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOwogCiBzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwppbmRleCAyZTkyZjBkLi4yM2Y5MzBjIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYworKysgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwpAQCAtODIsNyArODIsNyBAQAogewogCXN0cnVjdCBuZnM0X2ZpbGVfbGF5b3V0X2RzYWRkciAqZHNhZGRyOwogCWludCBzdGF0dXMgPSAtRUlOVkFMOwotCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsby0+aW5vZGUpOworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsby0+cGxoX2lub2RlKTsKIAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkvKiBmaW5kIGFuZCByZWZlcmVuY2UgdGhlIGRldmljZWlkICovCiAJZHNhZGRyID0gbmZzNF9mbF9maW5kX2dldF9kZXZpY2VpZChuZnNzLT5uZnNfY2xpZW50LCBpZCk7CiAJaWYgKGRzYWRkciA9PSBOVUxMKSB7Ci0JCWRzYWRkciA9IGdldF9kZXZpY2VfaW5mbyhsby0+aW5vZGUsIGlkKTsKKwkJZHNhZGRyID0gZ2V0X2RldmljZV9pbmZvKGxvLT5wbGhfaW5vZGUsIGlkKTsKIAkJaWYgKGRzYWRkciA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMjQzLDcgKzI0Myw3IEBACiBzdGF0aWMgdm9pZAogZmlsZWxheW91dF9mcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKm5mc3MgPSBORlNfU0VSVkVSKGxzZWctPmxheW91dC0+aW5vZGUpOworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsc2VnLT5wbHNfbGF5b3V0LT5wbGhfaW5vZGUpOwogCXN0cnVjdCBuZnM0X2ZpbGVsYXlvdXRfc2VnbWVudCAqZmwgPSBGSUxFTEFZT1VUX0xTRUcobHNlZyk7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggNDQzNWU1ZS4uOWQ5OTJiMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9iY194cHJ0Lmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogI2luY2x1ZGUgIm5mczRfZnMuaCIKICNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCkBAIC0zNTUsOSArMzU2LDkgQEAKIH0KIAogLyoKLSAqIFNpZ25hbCBzdGF0ZSBtYW5hZ2VyIHRocmVhZCBpZiBzZXNzaW9uIGlzIGRyYWluZWQKKyAqIFNpZ25hbCBzdGF0ZSBtYW5hZ2VyIHRocmVhZCBpZiBzZXNzaW9uIGZvcmUgY2hhbm5lbCBpcyBkcmFpbmVkCiAgKi8KLXN0YXRpYyB2b2lkIG5mczQxX2NoZWNrX2RyYWluX3Nlc3Npb25fY29tcGxldGUoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzKQorc3RhdGljIHZvaWQgbmZzNF9jaGVja19kcmFpbl9mY19jb21wbGV0ZShzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMpCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrOwogCkBAIC0zNzEsOCArMzcyLDIwIEBACiAJaWYgKHNlcy0+ZmNfc2xvdF90YWJsZS5oaWdoZXN0X3VzZWRfc2xvdGlkICE9IC0xKQogCQlyZXR1cm47CiAKLQlkcHJpbnRrKCIlcyBDT01QTEVURTogU2Vzc2lvbiBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JY29tcGxldGUoJnNlcy0+Y29tcGxldGUpOworCWRwcmludGsoIiVzIENPTVBMRVRFOiBTZXNzaW9uIEZvcmUgQ2hhbm5lbCBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7CisJY29tcGxldGUoJnNlcy0+ZmNfc2xvdF90YWJsZS5jb21wbGV0ZSk7Cit9CisKKy8qCisgKiBTaWduYWwgc3RhdGUgbWFuYWdlciB0aHJlYWQgaWYgc2Vzc2lvbiBiYWNrIGNoYW5uZWwgaXMgZHJhaW5lZAorICovCit2b2lkIG5mczRfY2hlY2tfZHJhaW5fYmNfY29tcGxldGUoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzKQoreworCWlmICghdGVzdF9iaXQoTkZTNF9TRVNTSU9OX0RSQUlOSU5HLCAmc2VzLT5zZXNzaW9uX3N0YXRlKSB8fAorCSAgICBzZXMtPmJjX3Nsb3RfdGFibGUuaGlnaGVzdF91c2VkX3Nsb3RpZCAhPSAtMSkKKwkJcmV0dXJuOworCWRwcmludGsoIiVzIENPTVBMRVRFOiBTZXNzaW9uIEJhY2sgQ2hhbm5lbCBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7CisJY29tcGxldGUoJnNlcy0+YmNfc2xvdF90YWJsZS5jb21wbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIG5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKQEAgLTM4OSw3ICs0MDIsNyBAQAogCiAJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCW5mczRfZnJlZV9zbG90KHRibCwgcmVzLT5zcl9zbG90KTsKLQluZnM0MV9jaGVja19kcmFpbl9zZXNzaW9uX2NvbXBsZXRlKHJlcy0+c3Jfc2Vzc2lvbik7CisJbmZzNF9jaGVja19kcmFpbl9mY19jb21wbGV0ZShyZXMtPnNyX3Nlc3Npb24pOwogCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCXJlcy0+c3Jfc2xvdCA9IE5VTEw7CiB9CkBAIC0xODI2LDYgKzE4MzksOCBAQAogCXN0cnVjdCBuZnNfY2xvc2VyZXMgcmVzOwogCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJYm9vbCByb2M7CisJdTMyIHJvY19iYXJyaWVyOwogfTsKIAogc3RhdGljIHZvaWQgbmZzNF9mcmVlX2Nsb3NlZGF0YSh2b2lkICpkYXRhKQpAQCAtMTgzMyw2ICsxODQ4LDggQEAKIAlzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKmNhbGxkYXRhID0gZGF0YTsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AgPSBjYWxsZGF0YS0+c3RhdGUtPm93bmVyOwogCisJaWYgKGNhbGxkYXRhLT5yb2MpCisJCXBuZnNfcm9jX3JlbGVhc2UoY2FsbGRhdGEtPnN0YXRlLT5pbm9kZSk7CiAJbmZzNF9wdXRfb3Blbl9zdGF0ZShjYWxsZGF0YS0+c3RhdGUpOwogCW5mc19mcmVlX3NlcWlkKGNhbGxkYXRhLT5hcmcuc2VxaWQpOwogCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKQEAgLTE4NjUsNiArMTg4Miw5IEBACiAJICovCiAJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKIAkJY2FzZSAwOgorCQkJaWYgKGNhbGxkYXRhLT5yb2MpCisJCQkJcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RhdGUtPmlub2RlLAorCQkJCQkJICAgICBjYWxsZGF0YS0+cm9jX2JhcnJpZXIpOwogCQkJbmZzX3NldF9vcGVuX3N0YXRlaWQoc3RhdGUsICZjYWxsZGF0YS0+cmVzLnN0YXRlaWQsIDApOwogCQkJcmVuZXdfbGVhc2Uoc2VydmVyLCBjYWxsZGF0YS0+dGltZXN0YW1wKTsKIAkJCW5mczRfY2xvc2VfY2xlYXJfc3RhdGVpZF9mbGFncyhzdGF0ZSwKQEAgLTE5MTcsOCArMTkzNywxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGNhbGxkYXRhLT5hcmcuZm1vZGUgPT0gMCkKKwlpZiAoY2FsbGRhdGEtPmFyZy5mbW9kZSA9PSAwKSB7CiAJCXRhc2stPnRrX21zZy5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DTE9TRV07CisJCWlmIChjYWxsZGF0YS0+cm9jICYmCisJCSAgICBwbmZzX3JvY19kcmFpbihjYWxsZGF0YS0+aW5vZGUsICZjYWxsZGF0YS0+cm9jX2JhcnJpZXIpKSB7CisJCQlycGNfc2xlZXBfb24oJk5GU19TRVJWRVIoY2FsbGRhdGEtPmlub2RlKS0+cm9jX3JwY3dhaXRxLAorCQkJCSAgICAgdGFzaywgTlVMTCk7CisJCQlyZXR1cm47CisJCX0KKwl9CiAKIAluZnNfZmF0dHJfaW5pdChjYWxsZGF0YS0+cmVzLmZhdHRyKTsKIAljYWxsZGF0YS0+dGltZXN0YW1wID0gamlmZmllczsKQEAgLTE5NDYsNyArMTk3Myw3IEBACiAgKgogICogTk9URTogQ2FsbGVyIG11c3QgYmUgaG9sZGluZyB0aGUgc3AtPnNvX293bmVyIHNlbWFwaG9yZSEKICAqLwotaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0KQoraW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0LCBib29sIHJvYykKIHsKIAlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihzdGF0ZS0+aW5vZGUpOwogCXN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqY2FsbGRhdGE7CkBAIC0xOTgxLDExICsyMDA4LDEyIEBACiAJY2FsbGRhdGEtPnJlcy5mYXR0ciA9ICZjYWxsZGF0YS0+ZmF0dHI7CiAJY2FsbGRhdGEtPnJlcy5zZXFpZCA9IGNhbGxkYXRhLT5hcmcuc2VxaWQ7CiAJY2FsbGRhdGEtPnJlcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJY2FsbGRhdGEtPnJvYyA9IHJvYzsKIAlwYXRoX2dldChwYXRoKTsKIAljYWxsZGF0YS0+cGF0aCA9ICpwYXRoOwogCi0JbXNnLnJwY19hcmdwID0gJmNhbGxkYXRhLT5hcmcsCi0JbXNnLnJwY19yZXNwID0gJmNhbGxkYXRhLT5yZXMsCisJbXNnLnJwY19hcmdwID0gJmNhbGxkYXRhLT5hcmc7CisJbXNnLnJwY19yZXNwID0gJmNhbGxkYXRhLT5yZXM7CiAJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBjYWxsZGF0YTsKIAl0YXNrID0gcnBjX3J1bl90YXNrKCZ0YXNrX3NldHVwX2RhdGEpOwogCWlmIChJU19FUlIodGFzaykpCkBAIC0xOTk4LDYgKzIwMjYsOCBAQAogb3V0X2ZyZWVfY2FsbGRhdGE6CiAJa2ZyZWUoY2FsbGRhdGEpOwogb3V0OgorCWlmIChyb2MpCisJCXBuZnNfcm9jX3JlbGVhc2Uoc3RhdGUtPmlub2RlKTsKIAluZnM0X3B1dF9vcGVuX3N0YXRlKHN0YXRlKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTI0ODYsNiArMjUxNiw3IEBACiAJCXBhdGggPSAmY3R4LT5wYXRoOwogCQlmbW9kZSA9IGN0eC0+bW9kZTsKIAl9CisJc2F0dHItPmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIHBhdGgsIGZtb2RlLCBmbGFncywgc2F0dHIsIGNyZWQpOwogCWRfZHJvcChkZW50cnkpOwogCWlmIChJU19FUlIoc3RhdGUpKSB7CkBAIC0yODE2LDYgKzI4NDcsOCBAQAogewogCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CiAJaW50IGVycjsKKworCXNhdHRyLT5pYV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJZG8gewogCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAogCQkJCV9uZnM0X3Byb2NfbWtkaXIoZGlyLCBkZW50cnksIHNhdHRyKSwKQEAgLTI5MTYsNiArMjk0OSw4IEBACiB7CiAJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKIAlpbnQgZXJyOworCisJc2F0dHItPmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAlkbyB7CiAJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCiAJCQkJX25mczRfcHJvY19ta25vZChkaXIsIGRlbnRyeSwgc2F0dHIsIHJkZXYpLApAQCAtMzQ3OCw2ICszNTEzLDcgQEAKIAlzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCBzZXRjbGllbnRpZCA9IHsKIAkJLnNjX3ZlcmlmaWVyID0gJnNjX3ZlcmlmaWVyLAogCQkuc2NfcHJvZyA9IHByb2dyYW0sCisJCS5zY19jYl9pZGVudCA9IGNscC0+Y2xfY2JfaWRlbnQsCiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU0VUQ0xJRU5USURdLApAQCAtMzUxNyw3ICszNTUzLDcgQEAKIAkJaWYgKHNpZ25hbGxlZCgpKQogCQkJYnJlYWs7CiAJCWlmIChsb29wKysgJiAxKQotCQkJc3NsZWVwKGNscC0+Y2xfbGVhc2VfdGltZSArIDEpOworCQkJc3NsZWVwKGNscC0+Y2xfbGVhc2VfdGltZSAvIEhaICsgMSk7CiAJCWVsc2UKIAkJCWlmICgrK2NscC0+Y2xfaWRfdW5pcXVpZmllciA9PSAwKQogCQkJCWJyZWFrOwpAQCAtMzY2Myw4ICszNjk5LDggQEAKIAlkYXRhLT5ycGNfc3RhdHVzID0gMDsKIAogCXRhc2tfc2V0dXBfZGF0YS5jYWxsYmFja19kYXRhID0gZGF0YTsKLQltc2cucnBjX2FyZ3AgPSAmZGF0YS0+YXJncywKLQltc2cucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmdzOworCW1zZy5ycGNfcmVzcCA9ICZkYXRhLT5yZXM7CiAJdGFzayA9IHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKIAlpZiAoSVNfRVJSKHRhc2spKQogCQlyZXR1cm4gUFRSX0VSUih0YXNrKTsKQEAgLTM3NDMsNiArMzc3OSw3IEBACiAJCWdvdG8gb3V0OwogCWxzcCA9IHJlcXVlc3QtPmZsX3UubmZzNF9mbC5vd25lcjsKIAlhcmcubG9ja19vd25lci5pZCA9IGxzcC0+bHNfaWQuaWQ7CisJYXJnLmxvY2tfb3duZXIuc19kZXYgPSBzZXJ2ZXItPnNfZGV2OwogCXN0YXR1cyA9IG5mczRfY2FsbF9zeW5jKHNlcnZlciwgJm1zZywgJmFyZywgJnJlcywgMSk7CiAJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAwOgpAQCAtMzkwOCw4ICszOTQ1LDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JbXNnLnJwY19hcmdwID0gJmRhdGEtPmFyZywKLQltc2cucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmc7CisJbXNnLnJwY19yZXNwID0gJmRhdGEtPnJlczsKIAl0YXNrX3NldHVwX2RhdGEuY2FsbGJhY2tfZGF0YSA9IGRhdGE7CiAJcmV0dXJuIHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKIH0KQEAgLTM5ODgsNiArNDAyNSw3IEBACiAJcC0+YXJnLmxvY2tfc3RhdGVpZCA9ICZsc3AtPmxzX3N0YXRlaWQ7CiAJcC0+YXJnLmxvY2tfb3duZXIuY2xpZW50aWQgPSBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2NsaWVudGlkOwogCXAtPmFyZy5sb2NrX293bmVyLmlkID0gbHNwLT5sc19pZC5pZDsKKwlwLT5hcmcubG9ja19vd25lci5zX2RldiA9IHNlcnZlci0+c19kZXY7CiAJcC0+cmVzLmxvY2tfc2VxaWQgPSBwLT5hcmcubG9ja19zZXFpZDsKIAlwLT5sc3AgPSBsc3A7CiAJcC0+c2VydmVyID0gc2VydmVyOwpAQCAtNDE0NSw4ICs0MTgzLDggQEAKIAkJCWRhdGEtPmFyZy5yZWNsYWltID0gTkZTX0xPQ0tfUkVDTEFJTTsKIAkJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX29wcyA9ICZuZnM0X3JlY292ZXJfbG9ja19vcHM7CiAJfQotCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmcsCi0JbXNnLnJwY19yZXNwID0gJmRhdGEtPnJlcywKKwltc2cucnBjX2FyZ3AgPSAmZGF0YS0+YXJnOworCW1zZy5ycGNfcmVzcCA9ICZkYXRhLT5yZXM7CiAJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBkYXRhOwogCXRhc2sgPSBycGNfcnVuX3Rhc2soJnRhc2tfc2V0dXBfZGF0YSk7CiAJaWYgKElTX0VSUih0YXNrKSkKQEAgLTQzOTIsNDggKzQ0MzAsNDMgQEAKIAkJcmV0dXJuOwogCWFyZ3MtPmxvY2tfb3duZXIuY2xpZW50aWQgPSBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2NsaWVudGlkOwogCWFyZ3MtPmxvY2tfb3duZXIuaWQgPSBsc3AtPmxzX2lkLmlkOworCWFyZ3MtPmxvY2tfb3duZXIuc19kZXYgPSBzZXJ2ZXItPnNfZGV2OwogCW1zZy5ycGNfYXJncCA9IGFyZ3M7CiAJcnBjX2NhbGxfYXN5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDAsICZuZnM0X3JlbGVhc2VfbG9ja293bmVyX29wcywgYXJncyk7CiB9CiAKICNkZWZpbmUgWEFUVFJfTkFNRV9ORlNWNF9BQ0wgInN5c3RlbS5uZnM0X2FjbCIKIAotaW50IG5mczRfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQorc3RhdGljIGludCBuZnM0X3hhdHRyX3NldF9uZnM0X2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sCisJCQkJICAgaW50IGZsYWdzLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChzdHJjbXAoa2V5LCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc3RyY21wKGtleSwgWEFUVFJfTkFNRV9ORlNWNF9BQ0wpICE9IDApCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCXJldHVybiBuZnM0X3Byb2Nfc2V0X2FjbChpbm9kZSwgYnVmLCBidWZsZW4pOworCXJldHVybiBuZnM0X3Byb2Nfc2V0X2FjbChkZW50cnktPmRfaW5vZGUsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotLyogVGhlIGdldHhhdHRyIG1hbiBwYWdlIHN1Z2dlc3RzIHJldHVybmluZyAtRU5PREFUQSBmb3IgdW5rbm93biBhdHRyaWJ1dGVzLAotICogYW5kIHRoYXQncyB3aGF0IHdlJ2xsIGRvIGZvciBlLmcuIHVzZXIgYXR0cmlidXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBzZXQuCi0gKiBCdXQgd2UnbGwgZm9sbG93IGV4dDIvZXh0MydzIGxlYWQgYnkgcmV0dXJuaW5nIC1FT1BOT1RTVVBQIGZvciB1bnN1cHBvcnRlZAotICogYXR0cmlidXRlcyBpbiBrZXJuZWwtbWFuYWdlZCBhdHRyaWJ1dGUgbmFtZXNwYWNlcy4gKi8KLXNzaXplX3QgbmZzNF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwgdm9pZCAqYnVmLAotCQlzaXplX3QgYnVmbGVuKQorc3RhdGljIGludCBuZnM0X3hhdHRyX2dldF9uZnM0X2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgICB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sIGludCB0eXBlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKHN0cmNtcChrZXksICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzdHJjbXAoa2V5LCBYQVRUUl9OQU1FX05GU1Y0X0FDTCkgIT0gMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JcmV0dXJuIG5mczRfcHJvY19nZXRfYWNsKGlub2RlLCBidWYsIGJ1Zmxlbik7CisJcmV0dXJuIG5mczRfcHJvY19nZXRfYWNsKGRlbnRyeS0+ZF9pbm9kZSwgYnVmLCBidWZsZW4pOwogfQogCi1zc2l6ZV90IG5mczRfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQorc3RhdGljIHNpemVfdCBuZnM0X3hhdHRyX2xpc3RfbmZzNF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpsaXN0LAorCQkJCSAgICAgICBzaXplX3QgbGlzdF9sZW4sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHNpemVfdCBuYW1lX2xlbiwgaW50IHR5cGUpCiB7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihYQVRUUl9OQU1FX05GU1Y0X0FDTCkgKyAxOworCXNpemVfdCBsZW4gPSBzaXplb2YoWEFUVFJfTkFNRV9ORlNWNF9BQ0wpOwogCiAJaWYgKCFuZnM0X3NlcnZlcl9zdXBwb3J0c19hY2xzKE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKSkpCiAJCXJldHVybiAwOwotCWlmIChidWYgJiYgYnVmbGVuIDwgbGVuKQotCQlyZXR1cm4gLUVSQU5HRTsKLQlpZiAoYnVmKQotCQltZW1jcHkoYnVmLCBYQVRUUl9OQU1FX05GU1Y0X0FDTCwgbGVuKTsKKworCWlmIChsaXN0ICYmIGxlbiA8PSBsaXN0X2xlbikKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX05BTUVfTkZTVjRfQUNMLCBsZW4pOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTQ0ODYsNiArNDUxOSwyNSBAQAogCiAjaWZkZWYgQ09ORklHX05GU19WNF8xCiAvKgorICogQ2hlY2sgdGhlIGV4Y2hhbmdlIGZsYWdzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIGludmFsaWQgZmxhZ3MsIGhhdmluZworICogYm90aCBQTkZTIGFuZCBOT05fUE5GUyBmbGFncyBzZXQsIGFuZCBub3QgaGF2aW5nIG9uZSBvZiBOT05fUE5GUywgUE5GUywgb3IKKyAqIERTIGZsYWdzIHNldC4KKyAqLworc3RhdGljIGludCBuZnM0X2NoZWNrX2NsX2V4Y2hhbmdlX2ZsYWdzKHUzMiBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiB+RVhDSEdJRDRfRkxBR19NQVNLX1IpCisJCWdvdG8gb3V0X2ludmFsOworCWlmICgoZmxhZ3MgJiBFWENIR0lENF9GTEFHX1VTRV9QTkZTX01EUykgJiYKKwkgICAgKGZsYWdzICYgRVhDSEdJRDRfRkxBR19VU0VfTk9OX1BORlMpKQorCQlnb3RvIG91dF9pbnZhbDsKKwlpZiAoIShmbGFncyAmIChFWENIR0lENF9GTEFHX01BU0tfUE5GUykpKQorCQlnb3RvIG91dF9pbnZhbDsKKwlyZXR1cm4gTkZTX09LOworb3V0X2ludmFsOgorCXJldHVybiAtTkZTNEVSUl9JTlZBTDsKK30KKworLyoKICAqIG5mczRfcHJvY19leGNoYW5nZV9pZCgpCiAgKgogICogU2luY2UgdGhlIGNsaWVudGlkIGhhcyBleHBpcmVkLCBhbGwgY29tcG91bmRzIHVzaW5nIHNlc3Npb25zCkBAIC00NDk4LDcgKzQ1NTAsNyBAQAogCW5mczRfdmVyaWZpZXIgdmVyaWZpZXI7CiAJc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX2FyZ3MgYXJncyA9IHsKIAkJLmNsaWVudCA9IGNscCwKLQkJLmZsYWdzID0gY2xwLT5jbF9leGNoYW5nZV9mbGFncywKKwkJLmZsYWdzID0gRVhDSEdJRDRfRkxBR19TVVBQX01PVkVEX1JFRkVSLAogCX07CiAJc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX3JlcyByZXMgPSB7CiAJCS5jbGllbnQgPSBjbHAsCkBAIC00NTE1LDkgKzQ1NjcsNiBAQAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCUJVR19PTihjbHAgPT0gTlVMTCk7CiAKLQkvKiBSZW1vdmUgc2VydmVyLW9ubHkgZmxhZ3MgKi8KLQlhcmdzLmZsYWdzICY9IH5FWENIR0lENF9GTEFHX0NPTkZJUk1FRF9SOwotCiAJcCA9ICh1MzIgKil2ZXJpZmllci5kYXRhOwogCSpwKysgPSBodG9ubCgodTMyKWNscC0+Y2xfYm9vdF90aW1lLnR2X3NlYyk7CiAJKnAgPSBodG9ubCgodTMyKWNscC0+Y2xfYm9vdF90aW1lLnR2X25zZWMpOwpAQCAtNDU0Myw2ICs0NTkyLDcgQEAKIAkJCWJyZWFrOwogCX0KIAorCXN0YXR1cyA9IG5mczRfY2hlY2tfY2xfZXhjaGFuZ2VfZmxhZ3MoY2xwLT5jbF9leGNoYW5nZV9mbGFncyk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cz0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00Nzc2LDE3ICs0ODI2LDE3IEBACiAJaWYgKCFzZXNzaW9uKQogCQlyZXR1cm4gTlVMTDsKIAotCWluaXRfY29tcGxldGlvbigmc2Vzc2lvbi0+Y29tcGxldGUpOwotCiAJdGJsID0gJnNlc3Npb24tPmZjX3Nsb3RfdGFibGU7CiAJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgIkZvcmVDaGFubmVsIFNsb3QgdGFibGUiKTsKKwlpbml0X2NvbXBsZXRpb24oJnRibC0+Y29tcGxldGUpOwogCiAJdGJsID0gJnNlc3Npb24tPmJjX3Nsb3RfdGFibGU7CiAJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgIkJhY2tDaGFubmVsIFNsb3QgdGFibGUiKTsKKwlpbml0X2NvbXBsZXRpb24oJnRibC0+Y29tcGxldGUpOwogCiAJc2Vzc2lvbi0+c2Vzc2lvbl9zdGF0ZSA9IDE8PE5GUzRfU0VTU0lPTl9JTklUSU5HOwogCkBAIC01MjgwLDEzICs1MzMwLDIzIEBACiBuZnM0X2xheW91dGdldF9wcmVwYXJlKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3AgPSBjYWxsZGF0YTsKLQlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxncC0+YXJncy5pbm9kZTsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm8pOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGxncC0+YXJncy5pbm9kZSk7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBOb3RlIHRoZSBpcyBhIHJhY2UgaGVyZSwgd2hlcmUgYSBDQl9MQVlPVVRSRUNBTEwgY2FuIGNvbWUgaW4KKwkgKiByaWdodCBub3cgY292ZXJpbmcgdGhlIExBWU9VVEdFVCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4KKwkgKiBIb3dldmVyLCB0aGF0IGlzIG5vdCBzbyBjYXRhc3Ryb3BoaWMsIGFuZCB0aGVyZSBzZWVtcworCSAqIHRvIGJlIG5vIHdheSB0byBwcmV2ZW50IGl0IGNvbXBsZXRlbHkuCisJICovCiAJaWYgKG5mczRfc2V0dXBfc2VxdWVuY2Uoc2VydmVyLCAmbGdwLT5hcmdzLnNlcV9hcmdzLAogCQkJCSZsZ3AtPnJlcy5zZXFfcmVzLCAwLCB0YXNrKSkKIAkJcmV0dXJuOworCWlmIChwbmZzX2Nob29zZV9sYXlvdXRnZXRfc3RhdGVpZCgmbGdwLT5hcmdzLnN0YXRlaWQsCisJCQkJCSAgTkZTX0kobGdwLT5hcmdzLmlub2RlKS0+bGF5b3V0LAorCQkJCQkgIGxncC0+YXJncy5jdHgtPnN0YXRlKSkgeworCQlycGNfZXhpdCh0YXNrLCBORlM0X09LKTsKKwkJcmV0dXJuOworCX0KIAlycGNfY2FsbF9zdGFydCh0YXNrKTsKIH0KIApAQCAtNTMxMyw3ICs1MzczLDYgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlsZ3AtPnN0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApAQCAtNTMyMiw3ICs1MzgxLDYgQEAKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCA9IGNhbGxkYXRhOwogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHV0X2xheW91dF9oZHIobGdwLT5hcmdzLmlub2RlKTsKIAlpZiAobGdwLT5yZXMubGF5b3V0LmJ1ZiAhPSBOVUxMKQogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxncC0+cmVzLmxheW91dC5idWYpOwogCXB1dF9uZnNfb3Blbl9jb250ZXh0KGxncC0+YXJncy5jdHgpOwpAQCAtNTM2NywxMyArNTQyNSwxMCBAQAogCWlmIChJU19FUlIodGFzaykpCiAJCXJldHVybiBQVFJfRVJSKHRhc2spOwogCXN0YXR1cyA9IG5mczRfd2FpdF9mb3JfY29tcGxldGlvbl9ycGNfdGFzayh0YXNrKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGxncC0+c3RhdHVzOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOwotb3V0OgorCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOwogCXJwY19wdXRfdGFzayh0YXNrKTsKIAlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTUwNCw5ICs1NTU5LDEwIEBACiAJLnBlcm1pc3Npb24JPSBuZnNfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG5mc19nZXRhdHRyLAogCS5zZXRhdHRyCT0gbmZzX3NldGF0dHIsCi0JLmdldHhhdHRyCT0gbmZzNF9nZXR4YXR0ciwKLQkuc2V0eGF0dHIJPSBuZnM0X3NldHhhdHRyLAotCS5saXN0eGF0dHIJPSBuZnM0X2xpc3R4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGdlbmVyaWNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogCiBjb25zdCBzdHJ1Y3QgbmZzX3JwY19vcHMgbmZzX3Y0X2NsaWVudG9wcyA9IHsKQEAgLTU1NTEsNiArNTYwNywxOCBAQAogCS5vcGVuX2NvbnRleHQJPSBuZnM0X2F0b21pY19vcGVuLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG5mczRfeGF0dHJfbmZzNF9hY2xfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfTkFNRV9ORlNWNF9BQ0wsCisJLmxpc3QJPSBuZnM0X3hhdHRyX2xpc3RfbmZzNF9hY2wsCisJLmdldAk9IG5mczRfeGF0dHJfZ2V0X25mczRfYWNsLAorCS5zZXQJPSBuZnM0X3hhdHRyX3NldF9uZnM0X2FjbCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpuZnM0X3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJm5mczRfeGF0dHJfbmZzNF9hY2xfaGFuZGxlciwKKwlOVUxMCit9OworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogIGMtYmFzaWMtb2Zmc2V0OiA4CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHJlbmV3ZC5jIGIvZnMvbmZzL25mczRyZW5ld2QuYwppbmRleCA3MmI2YzU4Li40MDIxNDNkIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHJlbmV3ZC5jCisrKyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKQEAgLTYzLDkgKzYzLDE0IEBACiAKIAlvcHMgPSBjbHAtPmNsX212b3BzLT5zdGF0ZV9yZW5ld2FsX29wczsKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQkvKiBBcmUgdGhlcmUgYW55IGFjdGl2ZSBzdXBlcmJsb2Nrcz8gKi8KLQlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlnb3RvIG91dDsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJbGVhc2UgPSBjbHAtPmNsX2xlYXNlX3RpbWU7CiAJbGFzdCA9IGNscC0+Y2xfbGFzdF9yZW5ld2FsOwpAQCAtNzUsNyArODAsNyBAQAogCQljcmVkID0gb3BzLT5nZXRfc3RhdGVfcmVuZXdhbF9jcmVkX2xvY2tlZChjbHApOwogCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAkJaWYgKGNyZWQgPT0gTlVMTCkgewotCQkJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsZWdhdGlvbnMpKSB7CisJCQlpZiAoIW5mc19kZWxlZ2F0aW9uc19wcmVzZW50KGNscCkpIHsKIAkJCQlzZXRfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwppbmRleCBmNTc1YTMxLi4yMzM2ZDUzIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzL25mczRzdGF0ZS5jCkBAIC0xMDUsMTQgKzEwNSwxNyBAQAogCQlwdXRfcnBjY3JlZChjcmVkKTsKIH0KIAotc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9yZW5ld19jcmVkX2xvY2tlZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQorc3RhdGljIHN0cnVjdCBycGNfY3JlZCAqCituZnM0X2dldF9yZW5ld19jcmVkX3NlcnZlcl9sb2NrZWQoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSBOVUxMOwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwotCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IE5VTEw7CiAKLQlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7IHBvcyAhPSBOVUxMOyBwb3MgPSByYl9uZXh0KHBvcykpIHsKLQkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19jbGllbnRfbm9kZSk7CisJZm9yIChwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOworCSAgICAgcG9zICE9IE5VTEw7CisJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCWlmIChsaXN0X2VtcHR5KCZzcC0+c29fc3RhdGVzKSkKIAkJCWNvbnRpbnVlOwogCQljcmVkID0gZ2V0X3JwY2NyZWQoc3AtPnNvX2NyZWQpOwpAQCAtMTIxLDYgKzEyNCwyOCBAQAogCXJldHVybiBjcmVkOwogfQogCisvKioKKyAqIG5mczRfZ2V0X3JlbmV3X2NyZWRfbG9ja2VkIC0gQWNxdWlyZSBjcmVkZW50aWFsIGZvciBhIHJlbmV3IG9wZXJhdGlvbgorICogQGNscDogY2xpZW50IHN0YXRlIGhhbmRsZQorICoKKyAqIFJldHVybnMgYW4gcnBjX2NyZWQgd2l0aCByZWZlcmVuY2UgY291bnQgYnVtcGVkLCBvciBOVUxMLgorICogQ2FsbGVyIG11c3QgaG9sZCBjbHAtPmNsX2xvY2suCisgKi8KK3N0cnVjdCBycGNfY3JlZCAqbmZzNF9nZXRfcmVuZXdfY3JlZF9sb2NrZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSBOVUxMOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspIHsKKwkJY3JlZCA9IG5mczRfZ2V0X3JlbmV3X2NyZWRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCQlpZiAoY3JlZCAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBjcmVkOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAKIHN0YXRpYyBpbnQgbmZzNDFfc2V0dXBfc3RhdGVfcmVuZXdhbChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQpAQCAtMTQyLDYgKzE2NywxMSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBCYWNrIGNoYW5uZWwgcmV0dXJucyBORlM0RVJSX0RFTEFZIGZvciBuZXcgcmVxdWVzdHMgd2hlbgorICogTkZTNF9TRVNTSU9OX0RSQUlOSU5HIGlzIHNldCBzbyB0aGVyZSBpcyBubyB3b3JrIHRvIGJlIGRvbmUgd2hlbiBkcmFpbmluZworICogaXMgZW5kZWQuCisgKi8KIHN0YXRpYyB2b2lkIG5mczRfZW5kX2RyYWluX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMgPSBjbHAtPmNsX3Nlc3Npb247CkBAIC0xNjUsMjIgKzE5NSwzMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBuZnM0X2JlZ2luX2RyYWluX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBpbnQgbmZzNF93YWl0X29uX3Nsb3RfdGJsKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCkKIHsKLQlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMgPSBjbHAtPmNsX3Nlc3Npb247Ci0Jc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsID0gJnNlcy0+ZmNfc2xvdF90YWJsZTsKLQogCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKLQlzZXRfYml0KE5GUzRfU0VTU0lPTl9EUkFJTklORywgJnNlcy0+c2Vzc2lvbl9zdGF0ZSk7CiAJaWYgKHRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCAhPSAtMSkgewotCQlJTklUX0NPTVBMRVRJT04oc2VzLT5jb21wbGV0ZSk7CisJCUlOSVRfQ09NUExFVElPTih0YmwtPmNvbXBsZXRlKTsKIAkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnNlcy0+Y29tcGxldGUpOworCQlyZXR1cm4gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ0YmwtPmNvbXBsZXRlKTsKIAl9CiAJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbmZzNF9iZWdpbl9kcmFpbl9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzID0gY2xwLT5jbF9zZXNzaW9uOworCWludCByZXQgPSAwOworCisJc2V0X2JpdChORlM0X1NFU1NJT05fRFJBSU5JTkcsICZzZXMtPnNlc3Npb25fc3RhdGUpOworCS8qIGJhY2sgY2hhbm5lbCAqLworCXJldCA9IG5mczRfd2FpdF9vbl9zbG90X3RibCgmc2VzLT5iY19zbG90X3RhYmxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qIGZvcmUgY2hhbm5lbCAqLworCXJldHVybiBuZnM0X3dhaXRfb25fc2xvdF90YmwoJnNlcy0+ZmNfc2xvdF90YWJsZSk7Cit9CisKIGludCBuZnM0MV9pbml0X2NsaWVudGlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKIAlpbnQgc3RhdHVzOwpAQCAtMTkyLDYgKzIzMiwxMiBAQAogCXN0YXR1cyA9IG5mczRfcHJvY19jcmVhdGVfc2Vzc2lvbihjbHApOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7CisJc3RhdHVzID0gbmZzNF9zZXRfY2FsbGJhY2tfc2Vzc2lvbmlkKGNscCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlc3Npb25pZCBub3Qgc2V0LiBObyBjYWxsYmFjayBzZXJ2aWNlXG4iKTsKKwkJbmZzX2NhbGxiYWNrX2Rvd24oMSk7CisJCXN0YXR1cyA9IDA7CisJfQogCW5mczQxX3NldHVwX3N0YXRlX3JlbmV3YWwoY2xwKTsKIAluZnNfbWFya19jbGllbnRfcmVhZHkoY2xwLCBORlNfQ1NfUkVBRFkpOwogb3V0OgpAQCAtMjEwLDI4ICsyNTYsNTYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCi1zdHJ1Y3QgcnBjX2NyZWQgKm5mczRfZ2V0X3NldGNsaWVudGlkX2NyZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgorbmZzNF9nZXRfc2V0Y2xpZW50aWRfY3JlZF9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OworCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IE5VTEw7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwOwogCXN0cnVjdCByYl9ub2RlICpwb3M7Ci0Jc3RydWN0IHJwY19jcmVkICpjcmVkOwogCiAJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCWNyZWQgPSBuZnM0X2dldF9tYWNoaW5lX2NyZWRfbG9ja2VkKGNscCk7Ci0JaWYgKGNyZWQgIT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JcG9zID0gcmJfZmlyc3QoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwlwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOwogCWlmIChwb3MgIT0gTlVMTCkgewotCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCWNyZWQgPSBnZXRfcnBjY3JlZChzcC0+c29fY3JlZCk7CiAJfQotb3V0OgogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJldHVybiBjcmVkOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfYWxsb2NfdW5pcXVlX2lkKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqbmV3LAotCQlfX3U2NCBtaW52YWwsIGludCBtYXhiaXRzKQorLyoqCisgKiBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkIC0gQWNxdWlyZSBjcmVkZW50aWFsIGZvciBhIHNldGNsaWVudGlkIG9wZXJhdGlvbgorICogQGNscDogY2xpZW50IHN0YXRlIGhhbmRsZQorICoKKyAqIFJldHVybnMgYW4gcnBjX2NyZWQgd2l0aCByZWZlcmVuY2UgY291bnQgYnVtcGVkLCBvciBOVUxMLgorICovCitzdHJ1Y3QgcnBjX2NyZWQgKm5mczRfZ2V0X3NldGNsaWVudGlkX2NyZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwljcmVkID0gbmZzNF9nZXRfbWFjaGluZV9jcmVkX2xvY2tlZChjbHApOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCWlmIChjcmVkICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKSB7CisJCWNyZWQgPSBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkX3NlcnZlcihzZXJ2ZXIpOworCQlpZiAoY3JlZCAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCitvdXQ6CisJcmV0dXJuIGNyZWQ7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19hbGxvY191bmlxdWVfaWRfbG9ja2VkKHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCSAgICAgICBzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqbmV3LAorCQkJCSAgICAgICBfX3U2NCBtaW52YWwsIGludCBtYXhiaXRzKQogewogCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudDsKIAlzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqcG9zOwpAQCAtMjg2LDE2ICszNjAsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKLW5mczRfZmluZF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCituZnM0X2ZpbmRfc3RhdGVfb3duZXJfbG9ja2VkKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZjbHAtPmNsX3N0YXRlX293bmVycy5yYl9ub2RlLAorCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZXJ2ZXItPnN0YXRlX293bmVycy5yYl9ub2RlLAogCQkgICAgICAgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCAqcmVzID0gTlVMTDsKIAogCXdoaWxlICgqcCAhPSBOVUxMKSB7CiAJCXBhcmVudCA9ICpwOwotCQlzcCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwkJc3AgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAKIAkJaWYgKHNlcnZlciA8IHNwLT5zb19zZXJ2ZXIpIHsKIAkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwpAQCAtMzE5LDI0ICszOTIsMTcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKLW5mczRfaW5zZXJ0X3N0YXRlX293bmVyKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZXcpCituZnM0X2luc2VydF9zdGF0ZV9vd25lcl9sb2NrZWQoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm5ldykKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmY2xwLT5jbF9zdGF0ZV9vd25lcnMucmJfbm9kZSwKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gbmV3LT5zb19zZXJ2ZXI7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnNlcnZlci0+c3RhdGVfb3duZXJzLnJiX25vZGUsCiAJCSAgICAgICAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CiAKIAl3aGlsZSAoKnAgIT0gTlVMTCkgewogCQlwYXJlbnQgPSAqcDsKLQkJc3AgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19jbGllbnRfbm9kZSk7CisJCXNwID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fc2VydmVyX25vZGUpOwogCi0JCWlmIChuZXctPnNvX3NlcnZlciA8IHNwLT5zb19zZXJ2ZXIpIHsKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKG5ldy0+c29fc2VydmVyID4gc3AtPnNvX3NlcnZlcikgewotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQkJY29udGludWU7Ci0JCX0KIAkJaWYgKG5ldy0+c29fY3JlZCA8IHNwLT5zb19jcmVkKQogCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CiAJCWVsc2UgaWYgKG5ldy0+c29fY3JlZCA+IHNwLT5zb19jcmVkKQpAQCAtMzQ2LDE4ICs0MTIsMjEgQEAKIAkJCXJldHVybiBzcDsKIAkJfQogCX0KLQluZnNfYWxsb2NfdW5pcXVlX2lkKCZjbHAtPmNsX29wZW5vd25lcl9pZCwgJm5ldy0+c29fb3duZXJfaWQsIDEsIDY0KTsKLQlyYl9saW5rX25vZGUoJm5ldy0+c29fY2xpZW50X25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXctPnNvX2NsaWVudF9ub2RlLCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOworCW5mc19hbGxvY191bmlxdWVfaWRfbG9ja2VkKCZzZXJ2ZXItPm9wZW5vd25lcl9pZCwKKwkJCQkJJm5ldy0+c29fb3duZXJfaWQsIDEsIDY0KTsKKwlyYl9saW5rX25vZGUoJm5ldy0+c29fc2VydmVyX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXctPnNvX3NlcnZlcl9ub2RlLCAmc2VydmVyLT5zdGF0ZV9vd25lcnMpOwogCXJldHVybiBuZXc7CiB9CiAKIHN0YXRpYyB2b2lkCi1uZnM0X3JlbW92ZV9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCituZnM0X3JlbW92ZV9zdGF0ZV9vd25lcl9sb2NrZWQoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQogewotCWlmICghUkJfRU1QVFlfTk9ERSgmc3AtPnNvX2NsaWVudF9ub2RlKSkKLQkJcmJfZXJhc2UoJnNwLT5zb19jbGllbnRfbm9kZSwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKLQluZnNfZnJlZV91bmlxdWVfaWQoJmNscC0+Y2xfb3Blbm93bmVyX2lkLCAmc3AtPnNvX293bmVyX2lkKTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gc3AtPnNvX3NlcnZlcjsKKworCWlmICghUkJfRU1QVFlfTk9ERSgmc3AtPnNvX3NlcnZlcl9ub2RlKSkKKwkJcmJfZXJhc2UoJnNwLT5zb19zZXJ2ZXJfbm9kZSwgJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwluZnNfZnJlZV91bmlxdWVfaWQoJnNlcnZlci0+b3Blbm93bmVyX2lkLCAmc3AtPnNvX293bmVyX2lkKTsKIH0KIAogLyoKQEAgLTM4NiwyMyArNDU1LDMyIEBACiBzdGF0aWMgdm9pZAogbmZzNF9kcm9wX3N0YXRlX293bmVyKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCkKIHsKLQlpZiAoIVJCX0VNUFRZX05PREUoJnNwLT5zb19jbGllbnRfbm9kZSkpIHsKLQkJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNwLT5zb19zZXJ2ZXItPm5mc19jbGllbnQ7CisJaWYgKCFSQl9FTVBUWV9OT0RFKCZzcC0+c29fc2VydmVyX25vZGUpKSB7CisJCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBzcC0+c29fc2VydmVyOworCQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCiAJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJcmJfZXJhc2UoJnNwLT5zb19jbGllbnRfbm9kZSwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKLQkJUkJfQ0xFQVJfTk9ERSgmc3AtPnNvX2NsaWVudF9ub2RlKTsKKwkJcmJfZXJhc2UoJnNwLT5zb19zZXJ2ZXJfbm9kZSwgJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwkJUkJfQ0xFQVJfTk9ERSgmc3AtPnNvX3NlcnZlcl9ub2RlKTsKIAkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJfQogfQogCi1zdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqbmZzNF9nZXRfc3RhdGVfb3duZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IHJwY19jcmVkICpjcmVkKQorLyoqCisgKiBuZnM0X2dldF9zdGF0ZV9vd25lciAtIExvb2sgdXAgYSBzdGF0ZSBvd25lciBnaXZlbiBhIGNyZWRlbnRpYWwKKyAqIEBzZXJ2ZXI6IG5mc19zZXJ2ZXIgdG8gc2VhcmNoCisgKiBAY3JlZDogUlBDIGNyZWRlbnRpYWwgdG8gbWF0Y2gKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpbnN0YW50aWF0ZWQgbmZzNF9zdGF0ZV9vd25lciBzdHJ1Y3QsIG9yIE5VTEwuCisgKi8KK3N0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZnM0X2dldF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCQkJCQkgICAgICBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCiB7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsICpuZXc7CiAKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0Jc3AgPSBuZnM0X2ZpbmRfc3RhdGVfb3duZXIoc2VydmVyLCBjcmVkKTsKKwlzcCA9IG5mczRfZmluZF9zdGF0ZV9vd25lcl9sb2NrZWQoc2VydmVyLCBjcmVkKTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoc3AgIT0gTlVMTCkKIAkJcmV0dXJuIHNwOwpAQCAtNDEyLDcgKzQ5MCw3IEBACiAJbmV3LT5zb19zZXJ2ZXIgPSBzZXJ2ZXI7CiAJbmV3LT5zb19jcmVkID0gY3JlZDsKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0Jc3AgPSBuZnM0X2luc2VydF9zdGF0ZV9vd25lcihjbHAsIG5ldyk7CisJc3AgPSBuZnM0X2luc2VydF9zdGF0ZV9vd25lcl9sb2NrZWQobmV3KTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoc3AgPT0gbmV3KQogCQlnZXRfcnBjY3JlZChjcmVkKTsKQEAgLTQyMyw2ICs1MDEsMTEgQEAKIAlyZXR1cm4gc3A7CiB9CiAKKy8qKgorICogbmZzNF9wdXRfc3RhdGVfb3duZXIgLSBSZWxlYXNlIGEgbmZzNF9zdGF0ZV9vd25lcgorICogQHNwOiBzdGF0ZSBvd25lciBkYXRhIHRvIHJlbGVhc2UKKyAqCisgKi8KIHZvaWQgbmZzNF9wdXRfc3RhdGVfb3duZXIoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzcC0+c29fc2VydmVyLT5uZnNfY2xpZW50OwpAQCAtNDMwLDcgKzUxMyw3IEBACiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJnNwLT5zb19jb3VudCwgJmNscC0+Y2xfbG9jaykpCiAJCXJldHVybjsKLQluZnM0X3JlbW92ZV9zdGF0ZV9vd25lcihjbHAsIHNwKTsKKwluZnM0X3JlbW92ZV9zdGF0ZV9vd25lcl9sb2NrZWQoc3ApOwogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJwY19kZXN0cm95X3dhaXRfcXVldWUoJnNwLT5zb19zZXF1ZW5jZS53YWl0KTsKIAlwdXRfcnBjY3JlZChjcmVkKTsKQEAgLTU4NSw4ICs2NjgsMTEgQEAKIAlpZiAoIWNhbGxfY2xvc2UpIHsKIAkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CiAJCW5mczRfcHV0X3N0YXRlX293bmVyKG93bmVyKTsKLQl9IGVsc2UKLQkJbmZzNF9kb19jbG9zZShwYXRoLCBzdGF0ZSwgZ2ZwX21hc2ssIHdhaXQpOworCX0gZWxzZSB7CisJCWJvb2wgcm9jID0gcG5mc19yb2Moc3RhdGUtPmlub2RlKTsKKworCQluZnM0X2RvX2Nsb3NlKHBhdGgsIHN0YXRlLCBnZnBfbWFzaywgd2FpdCwgcm9jKTsKKwl9CiB9CiAKIHZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQpAQCAtNjMzLDcgKzcxOSw4IEBACiBzdGF0aWMgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbmZzNF9hbGxvY19sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBmbF9vd25lciwgcGlkX3QgZmxfcGlkLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHN0YXRlLT5vd25lci0+c29fc2VydmVyLT5uZnNfY2xpZW50OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBzdGF0ZS0+b3duZXItPnNvX3NlcnZlcjsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCiAJbHNwID0ga3phbGxvYyhzaXplb2YoKmxzcCksIEdGUF9OT0ZTKTsKIAlpZiAobHNwID09IE5VTEwpCkBAIC02NTcsNyArNzQ0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQluZnNfYWxsb2NfdW5pcXVlX2lkKCZjbHAtPmNsX2xvY2tvd25lcl9pZCwgJmxzcC0+bHNfaWQsIDEsIDY0KTsKKwluZnNfYWxsb2NfdW5pcXVlX2lkX2xvY2tlZCgmc2VydmVyLT5sb2Nrb3duZXJfaWQsICZsc3AtPmxzX2lkLCAxLCA2NCk7CiAJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmxzcC0+bHNfbG9ja3MpOwogCXJldHVybiBsc3A7CkBAIC02NjUsMTAgKzc1MiwxMSBAQAogCiBzdGF0aWMgdm9pZCBuZnM0X2ZyZWVfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IGxzcC0+bHNfc3RhdGUtPm93bmVyLT5zb19zZXJ2ZXItPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IGxzcC0+bHNfc3RhdGUtPm93bmVyLT5zb19zZXJ2ZXI7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQluZnNfZnJlZV91bmlxdWVfaWQoJmNscC0+Y2xfbG9ja293bmVyX2lkLCAmbHNwLT5sc19pZCk7CisJbmZzX2ZyZWVfdW5pcXVlX2lkKCZzZXJ2ZXItPmxvY2tvd25lcl9pZCwgJmxzcC0+bHNfaWQpOwogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJwY19kZXN0cm95X3dhaXRfcXVldWUoJmxzcC0+bHNfc2VxdWVuY2Uud2FpdCk7CiAJa2ZyZWUobHNwKTsKQEAgLTExMTQsMTUgKzEyMDIsMTkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG5mczRfc3RhdGVfbWFya19yZWNsYWltX2hlbHBlcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQgKCptYXJrX3JlY2xhaW0pKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkpCitzdGF0aWMgdm9pZCBuZnM0X3Jlc2V0X3NlcWlkcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCWludCAoKm1hcmtfcmVjbGFpbSkoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKSkKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAotCS8qIFJlc2V0IGFsbCBzZXF1ZW5jZSBpZHMgdG8gemVybyAqLwotCWZvciAocG9zID0gcmJfZmlyc3QoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsgcG9zICE9IE5VTEw7IHBvcyA9IHJiX25leHQocG9zKSkgewotCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJZm9yIChwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOworCSAgICAgcG9zICE9IE5VTEw7CisJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCXNwLT5zb19zZXFpZC5mbGFncyA9IDA7CiAJCXNwaW5fbG9jaygmc3AtPnNvX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXRlLCAmc3AtPnNvX3N0YXRlcywgb3Blbl9zdGF0ZXMpIHsKQEAgLTExMzEsNiArMTIyMywxOCBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZzcC0+c29fbG9jayk7CiAJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9oZWxwZXIoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwlpbnQgKCptYXJrX3JlY2xhaW0pKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykKKwkJbmZzNF9yZXNldF9zZXFpZHMoc2VydmVyLCBtYXJrX3JlY2xhaW0pOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdm9pZCBuZnM0X3N0YXRlX3N0YXJ0X3JlY2xhaW1fcmVib290KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCkBAIC0xMTQ4LDI1ICsxMjUyLDQxIEBACiAJCSh2b2lkKW9wcy0+cmVjbGFpbV9jb21wbGV0ZShjbHApOwogfQogCi1zdGF0aWMgaW50IG5mczRfc3RhdGVfY2xlYXJfcmVjbGFpbV9yZWJvb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mczRfY2xlYXJfcmVjbGFpbV9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCi0JCXJldHVybiAwOwotCi0JZm9yIChwb3MgPSByYl9maXJzdCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOyBwb3MgIT0gTlVMTDsgcG9zID0gcmJfbmV4dChwb3MpKSB7Ci0JCXNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZzZXJ2ZXItPnN0YXRlX293bmVycyk7CisJICAgICBwb3MgIT0gTlVMTDsKKwkgICAgIHBvcyA9IHJiX25leHQocG9zKSkgeworCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX3NlcnZlcl9ub2RlKTsKIAkJc3Bpbl9sb2NrKCZzcC0+c29fbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RhdGUsICZzcC0+c29fc3RhdGVzLCBvcGVuX3N0YXRlcykgewotCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX1NUQVRFX1JFQ0xBSU1fUkVCT09ULCAmc3RhdGUtPmZsYWdzKSkKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19TVEFURV9SRUNMQUlNX1JFQk9PVCwKKwkJCQkJCSZzdGF0ZS0+ZmxhZ3MpKQogCQkJCWNvbnRpbnVlOwogCQkJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZShjbHAsIHN0YXRlKTsKIAkJfQogCQlzcGluX3VubG9jaygmc3AtPnNvX2xvY2spOwogCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworc3RhdGljIGludCBuZnM0X3N0YXRlX2NsZWFyX3JlY2xhaW1fcmVib290KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCisJCXJldHVybiAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKQorCQluZnM0X2NsZWFyX3JlY2xhaW1fc2VydmVyKHNlcnZlcik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAluZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChjbHApOwogCXJldHVybiAxOwpAQCAtMTIzOCwyNyArMTM1OCw0MCBAQAogCiBzdGF0aWMgaW50IG5mczRfZG9fcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wcykKIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCWludCBzdGF0dXMgPSAwOwogCiByZXN0YXJ0OgotCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7IHBvcyAhPSBOVUxMOyBwb3MgPSByYl9uZXh0KHBvcykpIHsKLQkJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOwotCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LCAmc3AtPnNvX2ZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlhdG9taWNfaW5jKCZzcC0+c29fY291bnQpOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX29wZW5fc3RhdGUoc3AsIG9wcyk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzZXRfYml0KG9wcy0+b3duZXJfZmxhZ19iaXQsICZzcC0+c29fZmxhZ3MpOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykgeworCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJCWZvciAocG9zID0gcmJfZmlyc3QoJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwkJICAgICBwb3MgIT0gTlVMTDsKKwkJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJCXNwID0gcmJfZW50cnkocG9zLAorCQkJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LAorCQkJCQkJCSZzcC0+c29fZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCQkJYXRvbWljX2luYygmc3AtPnNvX2NvdW50KTsKKwkJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9vcGVuX3N0YXRlKHNwLCBvcHMpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlzZXRfYml0KG9wcy0+b3duZXJfZmxhZ19iaXQsICZzcC0+c29fZmxhZ3MpOworCQkJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwkJCQlyZXR1cm4gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCQkJfQorCiAJCQluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7Ci0JCQlyZXR1cm4gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCQkJZ290byByZXN0YXJ0OwogCQl9Ci0JCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKLQkJZ290byByZXN0YXJ0OworCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggOWYxODI2Yi4uMmFiOGU1YyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC03MSw4ICs3MSw4IEBACiAvKiBsb2NrLG9wZW4gb3duZXIgaWQ6CiAgKiB3ZSBjdXJyZW50bHkgdXNlIHNpemUgMiAodTY0KSBvdXQgb2YgKE5GUzRfT1BBUVVFX0xJTUlUICA+PiAyKQogICovCi0jZGVmaW5lIG9wZW5fb3duZXJfaWRfbWF4c3oJKDEgKyA0KQotI2RlZmluZSBsb2NrX293bmVyX2lkX21heHN6CSgxICsgNCkKKyNkZWZpbmUgb3Blbl9vd25lcl9pZF9tYXhzegkoMSArIDEgKyA0KQorI2RlZmluZSBsb2NrX293bmVyX2lkX21heHN6CSgxICsgMSArIDQpCiAjZGVmaW5lIGRlY29kZV9sb2Nrb3duZXJfbWF4c3oJKDEgKyBYRFJfUVVBRExFTihJRE1BUF9OQU1FU1opKQogI2RlZmluZSBjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQogI2RlZmluZSBjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQpAQCAtMTA4OCwxMCArMTA4OCwxMSBAQAogewogCV9fYmUzMiAqcDsKIAotCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMjgpOworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMzIpOwogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxvd25lci0+Y2xpZW50aWQpOwotCSpwKysgPSBjcHVfdG9fYmUzMigxNik7CisJKnArKyA9IGNwdV90b19iZTMyKDIwKTsKIAlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgImxvY2sgaWQ6IiwgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGxvd25lci0+c19kZXYpOwogCXhkcl9lbmNvZGVfaHlwZXIocCwgbG93bmVyLT5pZCk7CiB9CiAKQEAgLTEyMTAsMTAgKzEyMTEsMTEgQEAKIAkqcCsrID0gY3B1X3RvX2JlMzIoT1BfT1BFTik7CiAJKnAgPSBjcHVfdG9fYmUzMihhcmctPnNlcWlkLT5zZXF1ZW5jZS0+Y291bnRlcik7CiAJZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+Zm1vZGUpOwotCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMjgpOworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMzIpOwogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZy0+Y2xpZW50aWQpOwotCSpwKysgPSBjcHVfdG9fYmUzMigxNik7CisJKnArKyA9IGNwdV90b19iZTMyKDIwKTsKIAlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgIm9wZW4gaWQ6IiwgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZy0+c2VydmVyLT5zX2Rldik7CiAJeGRyX2VuY29kZV9oeXBlcihwLCBhcmctPmlkKTsKIH0KIApAQCAtMTUxMCw3ICsxNTEyLDcgQEAKIAloZHItPnJlcGxlbiArPSBkZWNvZGVfcmVzdG9yZWZoX21heHN6OwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogZW5jb2RlX3NldGFjbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKQEAgLTE1MjEsMTQgKzE1MjMsMTIgQEAKIAlwID0gcmVzZXJ2ZV9zcGFjZSh4ZHIsIDIqNCk7CiAJKnArKyA9IGNwdV90b19iZTMyKDEpOwogCSpwID0gY3B1X3RvX2JlMzIoRkFUVFI0X1dPUkQwX0FDTCk7Ci0JaWYgKGFyZy0+YWNsX2xlbiAlIDQpCi0JCXJldHVybiAtRUlOVkFMOworCUJVR19PTihhcmctPmFjbF9sZW4gJSA0KTsKIAlwID0gcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOwogCSpwID0gY3B1X3RvX2JlMzIoYXJnLT5hY2xfbGVuKTsKIAl4ZHJfd3JpdGVfcGFnZXMoeGRyLCBhcmctPmFjbF9wYWdlcywgYXJnLT5hY2xfcGdiYXNlLCBhcmctPmFjbF9sZW4pOwogCWhkci0+bm9wcysrOwogCWhkci0+cmVwbGVuICs9IGRlY29kZV9zZXRhY2xfbWF4c3o7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNzg5LDcgKzE3ODksNiBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncywKIAkJICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCW5mczRfc3RhdGVpZCBzdGF0ZWlkOwogCV9fYmUzMiAqcDsKIAogCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgNDQgKyBORlM0X1NUQVRFSURfU0laRSk7CkBAIC0xODAwLDkgKzE3OTksNyBAQAogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPnJhbmdlLm9mZnNldCk7CiAJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+cmFuZ2UubGVuZ3RoKTsKIAlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5taW5sZW5ndGgpOwotCXBuZnNfZ2V0X2xheW91dF9zdGF0ZWlkKCZzdGF0ZWlkLCBORlNfSShhcmdzLT5pbm9kZSktPmxheW91dCwKLQkJCQlhcmdzLT5jdHgtPnN0YXRlKTsKLQlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgJnN0YXRlaWQuZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOworCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCAmYXJncy0+c3RhdGVpZC5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7CiAJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5tYXhjb3VudCk7CiAKIAlkcHJpbnRrKCIlczogMXN0IHR5cGU6MHgleCBpb21vZGU6JWQgb2ZmOiVsdSBsZW46JWx1IG1jOiVkXG4iLApAQCAtMTgzMywzOTMgKzE4MzAsMzYyIEBACiAvKgogICogRW5jb2RlIGFuIEFDQ0VTUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQljb25zdCBzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2FjY2VzcygmeGRyLCBhcmdzLT5hY2Nlc3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfYWNjZXNzKHhkciwgYXJncy0+YWNjZXNzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBMT09LVVAgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKLQllbmNvZGVfbG9va3VwKCZ4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5kaXJfZmgsICZoZHIpOworCWVuY29kZV9sb29rdXAoeGRyLCBhcmdzLT5uYW1lLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBMT09LVVBfUk9PVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9yb290X2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sb29rdXBfcm9vdF9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dHJvb3RmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIFJFTU9WRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbW92ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX3JlbW92ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZW1vdmUoJnhkciwgJmFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfcmVtb3ZlKHhkciwgJmFyZ3MtPm5hbWUsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIFJFTkFNRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX3JlbmFtZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+b2xkX2RpciwgJmhkcik7Ci0JZW5jb2RlX3NhdmVmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+bmV3X2RpciwgJmhkcik7Ci0JZW5jb2RlX3JlbmFtZSgmeGRyLCBhcmdzLT5vbGRfbmFtZSwgYXJncy0+bmV3X25hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPm9sZF9kaXIsICZoZHIpOworCWVuY29kZV9zYXZlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5uZXdfZGlyLCAmaGRyKTsKKwllbmNvZGVfcmVuYW1lKHhkciwgYXJncy0+b2xkX25hbWUsIGFyZ3MtPm5ld19uYW1lLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgTElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgsICZoZHIpOwotCWVuY29kZV9saW5rKCZ4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfc2F2ZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKKwllbmNvZGVfbGluayh4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9yZXN0b3JlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBDUkVBVEUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKLQllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9jcmVhdGUoJnhkciwgYXJncywgJmhkcik7Ci0JZW5jb2RlX2dldGZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX3NhdmVmaCh4ZHIsICZoZHIpOworCWVuY29kZV9jcmVhdGUoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgU1lNTElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICphcmdzKQogewotCXJldHVybiBuZnM0X3hkcl9lbmNfY3JlYXRlKHJlcSwgcCwgYXJncyk7CisJbmZzNF94ZHJfZW5jX2NyZWF0ZShyZXEsIHhkciwgYXJncyk7CiB9CiAKIC8qCiAgKiBFbmNvZGUgR0VUQVRUUiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBDTE9TRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2Nsb3NlKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfY2xvc2UoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX29wZW4oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX3NhdmVmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfb3BlbigmeGRyLCBhcmdzLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwotCWVuY29kZV9yZXN0b3JlZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9zYXZlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfb3Blbih4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9yZXN0b3JlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhbiBPUEVOX0NPTkZJUk0gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzICAgPSAwLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX29wZW5fY29uZmlybSgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX29wZW5fY29uZmlybSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIE9QRU4gcmVxdWVzdCB3aXRoIG5vIGF0dHJpYnV0ZXMuCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgc3RydWN0IG5mc19vcGVuYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9vcGVuKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfb3Blbih4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIE9QRU5fRE9XTkdSQURFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCXN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX29wZW5fZG93bmdyYWRlKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfb3Blbl9kb3duZ3JhZGUoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIExPQ0sgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja19hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2xvY2soc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9sb2NrKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9sb2NrKHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3RfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2xvY2t0X2FyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfbG9ja3QoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2t0KHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2xvY2t1X2FyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfbG9ja3UoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2t1KHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVsZWFzZV9sb2Nrb3duZXJfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWxlYXNlX2xvY2tvd25lcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJc3RydWN0IG5mc19yZWxlYXNlX2xvY2tvd25lcl9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IDAsCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3JlbGVhc2VfbG9ja293bmVyKCZ4ZHIsICZhcmdzLT5sb2NrX293bmVyLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoeGRyLCAmYXJncy0+bG9ja19vd25lciwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBSRUFETElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfcmVhZGxpbmsoJnhkciwgYXJncywgcmVxLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfcmVhZGxpbmsoeGRyLCBhcmdzLCByZXEsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCBoZHIucmVwbGVuIDw8IDIsIGFyZ3MtPnBhZ2VzLAogCQkJYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBSRUFERElSIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZWFkZGlyKCZ4ZHIsIGFyZ3MsIHJlcSwgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3JlYWRkaXIoeGRyLCBhcmdzLCByZXEsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCBoZHIucmVwbGVuIDw8IDIsIGFyZ3MtPnBhZ2VzLAogCQkJIGFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwpAQCAtMjIyNyw0MjggKzIxOTMsMzg3IEBACiAJCQlfX2Z1bmNfXywgaGRyLnJlcGxlbiA8PCAyLCBhcmdzLT5wYWdlcywKIAkJCWFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGEgUkVBRCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWFkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZWFkKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9yZWFkKHhkciwgYXJncywgJmhkcik7CiAKIAl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIGhkci5yZXBsZW4gPDwgMiwKIAkJCSBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5jb3VudCk7CiAJcmVxLT5ycV9yY3ZfYnVmLmZsYWdzIHw9IFhEUkJVRl9SRUFEOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIFNFVEFUVFIgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfc2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9zZXRhdHRyKCZ4ZHIsIGFyZ3MsIGFyZ3MtPnNlcnZlciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9zZXRhdHRyKHhkciwgYXJncywgYXJncy0+c2VydmVyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIEdFVEFDTCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJc3RydWN0IG5mc19nZXRhY2xhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX2dldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAl1aW50MzJfdCByZXBsZW47CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CiAJcmVwbGVuID0gaGRyLnJlcGxlbiArIG9wX2RlY29kZV9oZHJfbWF4c3ogKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiArIDE7Ci0JZW5jb2RlX2dldGF0dHJfdHdvKCZ4ZHIsIEZBVFRSNF9XT1JEMF9BQ0wsIDAsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIEZBVFRSNF9XT1JEMF9BQ0wsIDAsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwKIAkJYXJncy0+YWNsX3BhZ2VzLCBhcmdzLT5hY2xfcGdiYXNlLCBhcmdzLT5hY2xfbGVuKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIFdSSVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfd3JpdGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3dyaXRlKHhkciwgYXJncywgJmhkcik7CiAJcmVxLT5ycV9zbmRfYnVmLmZsYWdzIHw9IFhEUkJVRl9XUklURTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiAgYSBDT01NSVQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2NvbW1pdCgmeGRyLCBhcmdzLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2NvbW1pdCh4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRlNJTkZPIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZnNpbmZvKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIGEgUEFUSENPTkYgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZ2V0YXR0cl9vbmUoJnhkciwgYXJncy0+Yml0bWFza1swXSAmIG5mczRfcGF0aGNvbmZfYml0bWFwWzBdLAorCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX29uZSh4ZHIsIGFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3BhdGhjb25mX2JpdG1hcFswXSwKIAkJCSAgICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBTVEFURlMgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9nZXRhdHRyX3R3bygmeGRyLCBhcmdzLT5iaXRtYXNrWzBdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzBdLAorCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIGFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3N0YXRmc19iaXRtYXBbMF0sCiAJCQkgICBhcmdzLT5iaXRtYXNrWzFdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzFdLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEdFVEFUVFJfQklUTUFQIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJCQkgICAgc3RydWN0IG5mczRfc2VydmVyX2NhcHNfYXJnICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmhhbmRsZSwgJmhkcik7Ci0JZW5jb2RlX2dldGF0dHJfb25lKCZ4ZHIsIEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlN8CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maGFuZGxlLCAmaGRyKTsKKwllbmNvZGVfZ2V0YXR0cl9vbmUoeGRyLCBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTfAogCQkJICAgRkFUVFI0X1dPUkQwX0xJTktfU1VQUE9SVHwKIAkJCSAgIEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlR8CiAJCQkgICBGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFJFTkVXIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm5vcHMJPSAwLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9yZW5ldygmeGRyLCBjbHAsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9yZW5ldyh4ZHIsIGNscCwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNjKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0X3NldGNsaWVudGlkICpzYykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzCT0gMCwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2V0Y2xpZW50aWQoJnhkciwgc2MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXRjbGllbnRpZCh4ZHIsIHNjLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIGEgU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWRfcmVzICphcmcpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCQkgICAgIHN0cnVjdCBuZnM0X3NldGNsaWVudGlkX3JlcyAqYXJnKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm5vcHMJPSAwLAogCX07CiAJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUsIDAgfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkciwgYXJnLCAmaGRyKTsKLQllbmNvZGVfcHV0cm9vdGZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9mc2luZm8oJnhkciwgbGVhc2VfYml0bWFwLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2V0Y2xpZW50aWRfY29uZmlybSh4ZHIsIGFyZywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogREVMRUdSRVRVUk4gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maGFuZGxlLCAmaGRyKTsKLQllbmNvZGVfZGVsZWdyZXR1cm4oJnhkciwgYXJncy0+c3RhdGVpZCwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmhhbmRsZSwgJmhkcik7CisJZW5jb2RlX2RlbGVncmV0dXJuKHhkciwgYXJncy0+c3RhdGVpZCwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgRlNfTE9DQVRJT05TIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCXVpbnQzMl90IHJlcGxlbjsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7Ci0JZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX2xvb2t1cCh4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwogCXJlcGxlbiA9IGhkci5yZXBsZW47CS8qIGdldCB0aGUgYXR0cmlidXRlIGludG8gYXJncy0+cGFnZSAqLwotCWVuY29kZV9mc19sb2NhdGlvbnMoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2ZzX2xvY2F0aW9ucyh4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwgJmFyZ3MtPnBhZ2UsCiAJCQkwLCBQQUdFX1NJWkUpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAvKgogICogRVhDSEFOR0VfSUQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19leGNoYW5nZV9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICAgIHN0cnVjdCBuZnM0MV9leGNoYW5nZV9pZF9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2V4Y2hhbmdlX2lkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0MV9leGNoYW5nZV9pZF9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IGFyZ3MtPmNsaWVudC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2V4Y2hhbmdlX2lkKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9leGNoYW5nZV9pZCh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBDUkVBVEVfU0VTU0lPTiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICAgc3RydWN0IG5mczQxX2NyZWF0ZV9zZXNzaW9uX2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCXN0cnVjdCBuZnM0MV9jcmVhdGVfc2Vzc2lvbl9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IGFyZ3MtPmNsaWVudC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2NyZWF0ZV9zZXNzaW9uKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9jcmVhdGVfc2Vzc2lvbih4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBERVNUUk9ZX1NFU1NJT04gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZXN0cm95X3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAotCQkJCQlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCSBzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IHNlc3Npb24tPmNscC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2Rlc3Ryb3lfc2Vzc2lvbigmeGRyLCBzZXNzaW9uLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfZGVzdHJveV9zZXNzaW9uKHhkciwgc2Vzc2lvbiwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFNFUVVFTkNFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VxdWVuY2Uoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAotCQkJCSBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NlcXVlbmNlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBHRVRfTEVBU0VfVElNRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldF9sZWFzZV90aW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19nZXRfbGVhc2VfdGltZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPmxhX3NlcV9hcmdzKSwKIAl9OwogCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+bGFfc2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRyb290ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2ZzaW5mbygmeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5sYV9zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBSRUNMQUlNX0NPTVBMRVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVjbGFpbV9jb21wbGV0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICAgICBzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3JlY2xhaW1fY29tcGxldGUoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3JlY2xhaW1fY29tcGxldGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcmVjbGFpbV9jb21wbGV0ZSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIEdFVERFVklDRUlORk8gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICBzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VpbmZvX2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRkZXZpY2VpbmZvKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX2dldGRldmljZWluZm8oeGRyLCBhcmdzLCAmaGRyKTsKIAogCS8qIHNldCB1cCByZXBseSBrdmVjLiBTdWJ0cmFjdCBub3RpZmljYXRpb24gYml0bWFwIG1heCBzaXplICgyKQogCSAqIHNvIHRoYXQgbm90aWZpY2F0aW9uIGJpdG1hcCBpcyBwdXQgaW4geGRyX2J1ZiB0YWlsICovCkBAIC0yNjU3LDI3ICsyNTgyLDI0IEBACiAJCQkgYXJncy0+cGRldi0+cGdsZW4pOwogCiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiAgRW5jb2RlIExBWU9VVEdFVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xheW91dGdldChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sYXlvdXRnZXQoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgTkZTX0ZIKGFyZ3MtPmlub2RlKSwgJmhkcik7Ci0JZW5jb2RlX2xheW91dGdldCgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIE5GU19GSChhcmdzLT5pbm9kZSksICZoZHIpOworCWVuY29kZV9sYXlvdXRnZXQoeGRyLCBhcmdzLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIApAQCAtNDQ3NSw3ICs0Mzk3LDcgQEAKIAkJZ290byBvdXRfb3ZlcmZsb3c7CiAJZW9mID0gYmUzMl90b19jcHVwKHArKyk7CiAJY291bnQgPSBiZTMyX3RvX2NwdXAocCk7Ci0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKKwloZHJsZW4gPSAodTggKikgeGRyLT5wIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CiAJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOwogCWlmIChjb3VudCA+IHJlY3ZkKSB7CiAJCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVwbHk6ICIKQEAgLTUwMDAsNyArNDkyMiw3IEBACiAJCWdvdG8gb3V0X292ZXJmbG93OwogCWxlbiA9IGJlMzJfdG9fY3B1cChwKTsKIAlpZiAobGVuKSB7Ci0JCWludCBpOworCQl1aW50MzJfdCBpOwogCiAJCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKiBsZW4pOwogCQlpZiAodW5saWtlbHkoIXApKQpAQCAtNTA5MCwyNiArNTAxMiwyNiBAQAogLyoKICAqIERlY29kZSBPUEVOX0RPV05HUkFERSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTE4LDI2ICs1MDQwLDI1IEBACiAvKgogICogRGVjb2RlIEFDQ0VTUyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19hY2Nlc3Moc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9hY2Nlc3NyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2FjY2VzcygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9hY2Nlc3MoeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTQ2LDI2ICs1MDY3LDI4IEBACiAvKgogICogRGVjb2RlIExPT0tVUCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9sb29rdXAoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX2xvb2t1cCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsIHJlcy0+ZmgpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcgorCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyCiAJCQksIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTc0LDIzICs1MDk3LDI1IEBACiAvKgogICogRGVjb2RlIExPT0tVUF9ST09UIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9nZXRmaCgmeGRyLCByZXMtPmZoKSkgPT0gMCkKLQkJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTk5LDI0ICs1MTI0LDI1IEBACiAvKgogICogRGVjb2RlIFJFTU9WRSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlbW92ZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mc19yZW1vdmVyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3JlbW92ZSgmeGRyLCAmcmVzLT5jaW5mbykpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3JlbW92ZSh4ZHIsICZyZXMtPmNpbmZvKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTUyMjUsMzQgKzUxNTEsMzggQEAKIC8qCiAgKiBEZWNvZGUgUkVOQU1FIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX3JlbmFtZXJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZW5hbWUoJnhkciwgJnJlcy0+b2xkX2NpbmZvLCAmcmVzLT5uZXdfY2luZm8pKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9yZW5hbWUoeGRyLCAmcmVzLT5vbGRfY2luZm8sICZyZXMtPm5ld19jaW5mbyk7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CiAJLyogQ3VycmVudCBGSCBpcyB0YXJnZXQgZGlyZWN0b3J5ICovCi0JaWYgKGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPm5ld19mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+bmV3X2ZhdHRyLCByZXMtPnNlcnZlciwKIAkJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSkgIT0gMCkKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcmVzdG9yZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5vbGRfZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+b2xkX2ZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTI2MSwzNyArNTE5MSw0MSBAQAogLyoKICAqIERlY29kZSBMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9saW5rX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBzdHJ1Y3QgbmZzNF9saW5rX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9saW5rKCZ4ZHIsICZyZXMtPmNpbmZvKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfbGluayh4ZHIsICZyZXMtPmNpbmZvKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKIAkvKgogCSAqIE5vdGUgb3JkZXI6IE9QX0xJTksgbGVhdmVzIHRoZSBkaXJlY3RvcnkgYXMgdGhlIGN1cnJlbnQKIAkgKiAgICAgICAgICAgICBmaWxlaGFuZGxlLgogCSAqLwotCWlmIChkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3Jlc3RvcmVmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTMwMCwzMyArNTIzNCwzNyBAQAogLyoKICAqIERlY29kZSBDUkVBVEUgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfY3JlYXRlX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mczRfY3JlYXRlX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9jcmVhdGUoJnhkciwmcmVzLT5kaXJfY2luZm8pKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9jcmVhdGUoeGRyLCAmcmVzLT5kaXJfY2luZm8pOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsIHJlcy0+ZmgpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmIChkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3Jlc3RvcmVmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmRpcl9mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5kaXJfZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MzM1LDMxICs1MjczLDMxIEBACiAvKgogICogRGVjb2RlIFNZTUxJTksgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc3ltbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCiB7Ci0JcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHAsIHJlcyk7CisJcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHhkciwgcmVzKTsKIH0KIAogLyoKICAqIERlY29kZSBHRVRBVFRSIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnM0X2dldGF0dHJfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MzY4LDQ2ICs1MzA2LDQwIEBACiAvKgogICogRW5jb2RlIGFuIFNFVEFDTCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhY2xhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKLQlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9zZXRhY2woJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3NldGFjbCh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgU0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAorbmZzNF94ZHJfZGVjX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkgICAgc3RydWN0IG5mc19zZXRhY2xyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cih4ZHIpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NDE2LDI0ICs1MzQ4LDIyIEBACiAgKiBEZWNvZGUgR0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAorbmZzNF94ZHJfZGVjX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkgICAgc3RydWN0IG5mc19nZXRhY2xyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0YWNsKCZ4ZHIsIHJxc3RwLCAmcmVzLT5hY2xfbGVuKTsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0YWNsKHhkciwgcnFzdHAsICZyZXMtPmFjbF9sZW4pOwogCiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU0NDIsMjMgKzUzNzIsMjIgQEAKIC8qCiAgKiBEZWNvZGUgQ0xPU0UgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9jbG9zZSgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9jbG9zZSh4ZHIsIHJlcyk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKIAkvKgpAQCAtNTQ2Nyw3ICs1Mzk2LDcgQEAKIAkgKiAJYW4gRVNUQUxFIGVycm9yLiBTaG91bGRuJ3QgYmUgYSBwcm9ibGVtLAogCSAqIAl0aG91Z2gsIHNpbmNlIGZhdHRyLT52YWxpZCB3aWxsIHJlbWFpbiB1bnNldC4KIAkgKi8KLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU0NzYsMzYgKzU0MDUsMzUgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3NhdmVmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX29wZW4oeGRyLCByZXMpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmIChkZWNvZGVfZ2V0ZmgoJnhkciwgJnJlcy0+ZmgpICE9IDApCisJaWYgKGRlY29kZV9nZXRmaCh4ZHIsICZyZXMtPmZoKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+Zl9hdHRyLCByZXMtPnNlcnZlciwKKwlpZiAoZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoZGVjb2RlX3Jlc3RvcmVmaCgmeGRyKSAhPSAwKQorCWlmIChkZWNvZGVfcmVzdG9yZWZoKHhkcikgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01NTE0LDIwICs1NDQyLDIwIEBACiAvKgogICogRGVjb2RlIE9QRU5fQ09ORklSTSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfb3Blbl9jb25maXJtKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX29wZW5fY29uZmlybSh4ZHIsIHJlcyk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU1MzUsMjYgKzU0NjMsMjYgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX29wZW4oJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3Blbih4ZHIsIHJlcyk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+Zl9hdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZfYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU1NjMsMjYgKzU0OTEsMjYgQEAKIC8qCiAgKiBEZWNvZGUgU0VUQVRUUiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhdHRycmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cih4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTU5MSwyMyArNTUxOSwyMiBAQAogLyoKICAqIERlY29kZSBMT0NLIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2soc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2tfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBuZnNfbG9ja19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfbG9jaygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9sb2NrKHhkciwgcmVzKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTYxNSwyMyArNTU0MiwyMiBAQAogLyoKICAqIERlY29kZSBMT0NLVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3RfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19sb2NrdF9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfbG9ja3QoJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfbG9ja3QoeGRyLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NjM5LDYxICs1NTY1LDU4IEBACiAvKgogICogRGVjb2RlIExPQ0tVIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX2xvY2t1X3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9sb2NrdSgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9sb2NrdSh4ZHIsIHJlcyk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqZHVtbXkpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3JlbGVhc2VfbG9ja293bmVyKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoeGRyKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFJFQURMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJIHN0cnVjdCBuZnM0X3JlYWRsaW5rX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9yZWFkbGluaygmeGRyLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3JlYWRsaW5rKHhkciwgcnFzdHApOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NzAxLDIzICs1NjI0LDIyIEBACiAvKgogICogRGVjb2RlIFJFQURESVIgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5mczRfcmVhZGRpcl9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcmVhZGRpcigmeGRyLCBycXN0cCwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZGRpcih4ZHIsIHJxc3RwLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NzI1LDIzICs1NjQ3LDIyIEBACiAvKgogICogRGVjb2RlIFJlYWQgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcmVhZCgmeGRyLCBycXN0cCwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZCh4ZHIsIHJxc3RwLCByZXMpOwogCWlmICghc3RhdHVzKQogCQlzdGF0dXMgPSByZXMtPmNvdW50Owogb3V0OgpAQCAtNTc1MSwyNiArNTY3MiwyNSBAQAogLyoKICAqIERlY29kZSBXUklURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3dyaXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3dyaXRlKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX3dyaXRlKHhkciwgcmVzKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiAJaWYgKCFzdGF0dXMpCiAJCXN0YXR1cyA9IHJlcy0+Y291bnQ7CkBAIC01NzgxLDI2ICs1NzAxLDI1IEBACiAvKgogICogRGVjb2RlIENPTU1JVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbW1pdCgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9jb21taXQoeGRyLCByZXMpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTgwOSw4NSArNTcyOCw4MCBAQAogLyoKICAqIERlY29kZSBGU0lORk8gcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkgICAgICAgc3RydWN0IG5mczRfZnNpbmZvX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCByZXMtPmZzaW5mbyk7CisJCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oeGRyLCByZXMtPmZzaW5mbyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBQQVRIQ09ORiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJIHN0cnVjdCBuZnM0X3BhdGhjb25mX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3BhdGhjb25mKCZ4ZHIsIHJlcy0+cGF0aGNvbmYpOworCQlzdGF0dXMgPSBkZWNvZGVfcGF0aGNvbmYoeGRyLCByZXMtPnBhdGhjb25mKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFNUQVRGUyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N0YXRmcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCSAgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZnNfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOworCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc3RhdGZzKCZ4ZHIsIHJlcy0+ZnNzdGF0KTsKKwkJc3RhdHVzID0gZGVjb2RlX3N0YXRmcyh4ZHIsIHJlcy0+ZnNzdGF0KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIEdFVEFUVFJfQklUTUFQIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJlcSk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcnZlcl9jYXBzKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX3NlcnZlcl9jYXBzKHhkciwgcmVzKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTg5NSw3OSArNTgwOSw3NyBAQAogLyoKICAqIERlY29kZSBSRU5FVyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgIHZvaWQgKl9fdW51c2VkKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9yZW5ldygmeGRyKTsKKwkJc3RhdHVzID0gZGVjb2RlX3JlbmV3KHhkcik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBTRVRDTElFTlRJRCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRjbGllbnRpZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQlzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NldGNsaWVudGlkKCZ4ZHIsIHJlcyk7CisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZCh4ZHIsIHJlcyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBTRVRDTElFTlRJRF9DT05GSVJNIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCQkgICAgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCBmc2luZm8pOworCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKHhkciwgZnNpbmZvKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIERFTEVHUkVUVVJOIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0X2RlbGVncmV0dXJucmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZGVsZWdyZXR1cm4oJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX2RlbGVncmV0dXJuKHhkcik7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU5NzYsMjYgKzU4ODgsMjcgQEAKIC8qCiAgKiBEZWNvZGUgRlNfTE9DQVRJT05TIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2xvb2t1cCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfbG9va3VwKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JeGRyX2VudGVyX3BhZ2UoJnhkciwgUEFHRV9TSVpFKTsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgJnJlcy0+ZnNfbG9jYXRpb25zLT5mYXR0ciwKKwl4ZHJfZW50ZXJfcGFnZSh4ZHIsIFBBR0VfU0laRSk7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKHhkciwgJnJlcy0+ZnNfbG9jYXRpb25zLT5mYXR0ciwKIAkJCQkgcmVzLT5mc19sb2NhdGlvbnMtPnNlcnZlciwKIAkJCQkgIVJQQ19JU19BU1lOQyhyZXEtPnJxX3Rhc2spKTsKIG91dDoKQEAgLTYwMDYsMTI5ICs1OTE5LDEyMiBAQAogLyoKICAqIERlY29kZSBFWENIQU5HRV9JRCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19leGNoYW5nZV9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2V4Y2hhbmdlX2lkKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgIHZvaWQgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfZXhjaGFuZ2VfaWQoJnhkciwgcmVzKTsKKwkJc3RhdHVzID0gZGVjb2RlX2V4Y2hhbmdlX2lkKHhkciwgcmVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIENSRUFURV9TRVNTSU9OIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgICAgc3RydWN0IG5mczQxX2NyZWF0ZV9zZXNzaW9uX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9jcmVhdGVfc2Vzc2lvbigmeGRyLCByZXMpOworCQlzdGF0dXMgPSBkZWNvZGVfY3JlYXRlX3Nlc3Npb24oeGRyLCByZXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgREVTVFJPWV9TRVNTSU9OIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKLQkJCQkJdm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZXN0cm95X3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJdm9pZCAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9kZXN0cm95X3Nlc3Npb24oJnhkciwgZHVtbXkpOworCQlzdGF0dXMgPSBkZWNvZGVfZGVzdHJveV9zZXNzaW9uKHhkciwgcmVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFNFUVVFTkNFIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcXVlbmNlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2VxdWVuY2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsIHJlcywgcnFzdHApOworCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCByZXMsIHJxc3RwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIEdFVF9MRUFTRV9USU1FIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldF9sZWFzZV90aW1lKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0X2xlYXNlX3RpbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPmxyX3NlcV9yZXMsIHJxc3RwKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+bHJfc2VxX3JlcywgcnFzdHApOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKHhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oJnhkciwgcmVzLT5scl9mc2luZm8pOworCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKHhkciwgcmVzLT5scl9mc2luZm8pOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgUkVDTEFJTV9DT01QTEVURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWNsYWltX2NvbXBsZXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVjbGFpbV9jb21wbGV0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCQkgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkJIHN0cnVjdCBuZnM0MV9yZWNsYWltX2NvbXBsZXRlX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3JlY2xhaW1fY29tcGxldGUoJnhkciwgKHZvaWQgKilOVUxMKTsKKwkJc3RhdHVzID0gZGVjb2RlX3JlY2xhaW1fY29tcGxldGUoeGRyLCAodm9pZCAqKU5VTEwpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgR0VUREVWSU5GTyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0ZGV2aWNlaW5mbygmeGRyLCByZXMtPnBkZXYpOworCXN0YXR1cyA9IGRlY29kZV9nZXRkZXZpY2VpbmZvKHhkciwgcmVzLT5wZGV2KTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjEzNiwzMSArNjA0Miw0NCBAQAogLyoKICAqIERlY29kZSBMQVlPVVRHRVQgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGF5b3V0Z2V0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGF5b3V0Z2V0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCSAgc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9sYXlvdXRnZXQoJnhkciwgcnFzdHAsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX2xheW91dGdldCh4ZHIsIHJxc3RwLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKLV9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAotCQkJICAgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IHBsdXMpCisvKioKKyAqIG5mczRfZGVjb2RlX2RpcmVudCAtIERlY29kZSBhIHNpbmdsZSBORlN2NCBkaXJlY3RvcnkgZW50cnkgc3RvcmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jYWwgcGFnZSBjYWNoZS4KKyAqIEB4ZHI6IFhEUiBzdHJlYW0gd2hlcmUgZW50cnkgcmVzaWRlcworICogQGVudHJ5OiBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIGVudHJ5IGRhdGEKKyAqIEBwbHVzOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIHJlYWRkaXJwbHVzIGVudHJ5CisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbnZva2VkIGR1cmluZyBSRUFERElSIHJlcGx5IGRlY29kaW5nLCBidXQKKyAqIHJhdGhlciB3aGVuZXZlciBhbiBhcHBsaWNhdGlvbiBpbnZva2VzIHRoZSBnZXRkZW50cygyKSBzeXN0ZW0gY2FsbAorICogb24gYSBkaXJlY3RvcnkgYWxyZWFkeSBpbiBvdXIgY2FjaGUuCisgKi8KK2ludCBuZnM0X2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksCisJCSAgICAgICBpbnQgcGx1cykKIHsKIAl1aW50MzJfdCBiaXRtYXBbMl0gPSB7MH07CiAJdWludDMyX3QgbGVuOwpAQCAtNjE3Miw5ICs2MDkxLDkgQEAKIAkJaWYgKHVubGlrZWx5KCFwKSkKIAkJCWdvdG8gb3V0X292ZXJmbG93OwogCQlpZiAoIW50b2hsKCpwKyspKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJCQlyZXR1cm4gLUVBR0FJTjsKIAkJZW50cnktPmVvZiA9IDE7Ci0JCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKKwkJcmV0dXJuIC1FQkFEQ09PS0lFOwogCX0KIAogCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDEyKTsKQEAgLTYyMDMsNyArNjEyMiw4IEBACiAJaWYgKGRlY29kZV9hdHRyX2xlbmd0aCh4ZHIsICZsZW4sICZwKSA8IDApCiAJCWdvdG8gb3V0X292ZXJmbG93OwogCi0JaWYgKGRlY29kZV9nZXRmYXR0cl9hdHRycyh4ZHIsIGJpdG1hcCwgZW50cnktPmZhdHRyLCBlbnRyeS0+ZmgsIHNlcnZlciwgMSkgPCAwKQorCWlmIChkZWNvZGVfZ2V0ZmF0dHJfYXR0cnMoeGRyLCBiaXRtYXAsIGVudHJ5LT5mYXR0ciwgZW50cnktPmZoLAorCQkJCQllbnRyeS0+c2VydmVyLCAxKSA8IDApCiAJCWdvdG8gb3V0X292ZXJmbG93OwogCWlmIChlbnRyeS0+ZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKQogCQllbnRyeS0+aW5vID0gZW50cnktPmZhdHRyLT5maWxlaWQ7CkBAIC02MjE1LDE3ICs2MTM1LDExIEBACiAJaWYgKHZlcmlmeV9hdHRyX2xlbih4ZHIsIHAsIGxlbikgPCAwKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAotCXAgPSB4ZHJfaW5saW5lX3BlZWsoeGRyLCA4KTsKLQlpZiAocCAhPSBOVUxMKQotCQllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKLQllbHNlCi0JCWVudHJ5LT5lb2YgPSAwOwotCi0JcmV0dXJuIHA7CisJcmV0dXJuIDA7CiAKIG91dF9vdmVyZmxvdzoKIAlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJcmV0dXJuIC1FQUdBSU47CiB9CiAKIC8qCkBAIC02MzAxLDggKzYyMTUsOCBAQAogI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCVwKIFtORlNQUk9DNF9DTE5UXyMjcHJvY10gPSB7CQkJCQlcCiAJLnBfcHJvYyAgID0gTkZTUFJPQzRfQ09NUE9VTkQsCQkJCVwKLQkucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNhcmd0eXBlLAkJXAotCS5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnM0X3hkcl8jI3Jlc3R5cGUsCQlcCisJLnBfZW5jb2RlID0gKGt4ZHJlcHJvY190KW5mczRfeGRyXyMjYXJndHlwZSwJCVwKKwkucF9kZWNvZGUgPSAoa3hkcmRwcm9jX3QpbmZzNF94ZHJfIyNyZXN0eXBlLAkJXAogCS5wX2FyZ2xlbiA9IE5GUzRfIyNhcmd0eXBlIyNfc3osCQkJXAogCS5wX3JlcGxlbiA9IE5GUzRfIyNyZXN0eXBlIyNfc3osCQkJXAogCS5wX3N0YXRpZHggPSBORlNQUk9DNF9DTE5UXyMjcHJvYywJCQlcCkBAIC02MzEwLDUwICs2MjI0LDUwIEBACiB9CiAKIHN0cnVjdCBycGNfcHJvY2luZm8JbmZzNF9wcm9jZWR1cmVzW10gPSB7Ci0gIFBST0MoUkVBRCwJCWVuY19yZWFkLAlkZWNfcmVhZCksCi0gIFBST0MoV1JJVEUsCQllbmNfd3JpdGUsCWRlY193cml0ZSksCi0gIFBST0MoQ09NTUlULAkJZW5jX2NvbW1pdCwJZGVjX2NvbW1pdCksCi0gIFBST0MoT1BFTiwJCWVuY19vcGVuLAlkZWNfb3BlbiksCi0gIFBST0MoT1BFTl9DT05GSVJNLAllbmNfb3Blbl9jb25maXJtLAlkZWNfb3Blbl9jb25maXJtKSwKLSAgUFJPQyhPUEVOX05PQVRUUiwJZW5jX29wZW5fbm9hdHRyLAlkZWNfb3Blbl9ub2F0dHIpLAotICBQUk9DKE9QRU5fRE9XTkdSQURFLAllbmNfb3Blbl9kb3duZ3JhZGUsCWRlY19vcGVuX2Rvd25ncmFkZSksCi0gIFBST0MoQ0xPU0UsCQllbmNfY2xvc2UsCWRlY19jbG9zZSksCi0gIFBST0MoU0VUQVRUUiwJCWVuY19zZXRhdHRyLAlkZWNfc2V0YXR0ciksCi0gIFBST0MoRlNJTkZPLAkJZW5jX2ZzaW5mbywJZGVjX2ZzaW5mbyksCi0gIFBST0MoUkVORVcsCQllbmNfcmVuZXcsCWRlY19yZW5ldyksCi0gIFBST0MoU0VUQ0xJRU5USUQsCWVuY19zZXRjbGllbnRpZCwJZGVjX3NldGNsaWVudGlkKSwKLSAgUFJPQyhTRVRDTElFTlRJRF9DT05GSVJNLAllbmNfc2V0Y2xpZW50aWRfY29uZmlybSwJZGVjX3NldGNsaWVudGlkX2NvbmZpcm0pLAotICBQUk9DKExPQ0ssICAgICAgICAgICAgZW5jX2xvY2ssICAgICAgIGRlY19sb2NrKSwKLSAgUFJPQyhMT0NLVCwgICAgICAgICAgIGVuY19sb2NrdCwgICAgICBkZWNfbG9ja3QpLAotICBQUk9DKExPQ0tVLCAgICAgICAgICAgZW5jX2xvY2t1LCAgICAgIGRlY19sb2NrdSksCi0gIFBST0MoQUNDRVNTLAkJZW5jX2FjY2VzcywJZGVjX2FjY2VzcyksCi0gIFBST0MoR0VUQVRUUiwJCWVuY19nZXRhdHRyLAlkZWNfZ2V0YXR0ciksCi0gIFBST0MoTE9PS1VQLAkJZW5jX2xvb2t1cCwJZGVjX2xvb2t1cCksCi0gIFBST0MoTE9PS1VQX1JPT1QsCWVuY19sb29rdXBfcm9vdCwJZGVjX2xvb2t1cF9yb290KSwKLSAgUFJPQyhSRU1PVkUsCQllbmNfcmVtb3ZlLAlkZWNfcmVtb3ZlKSwKLSAgUFJPQyhSRU5BTUUsCQllbmNfcmVuYW1lLAlkZWNfcmVuYW1lKSwKLSAgUFJPQyhMSU5LLAkJZW5jX2xpbmssCWRlY19saW5rKSwKLSAgUFJPQyhTWU1MSU5LLAkJZW5jX3N5bWxpbmssCWRlY19zeW1saW5rKSwKLSAgUFJPQyhDUkVBVEUsCQllbmNfY3JlYXRlLAlkZWNfY3JlYXRlKSwKLSAgUFJPQyhQQVRIQ09ORiwJZW5jX3BhdGhjb25mLAlkZWNfcGF0aGNvbmYpLAotICBQUk9DKFNUQVRGUywJCWVuY19zdGF0ZnMsCWRlY19zdGF0ZnMpLAotICBQUk9DKFJFQURMSU5LLAllbmNfcmVhZGxpbmssCWRlY19yZWFkbGluayksCi0gIFBST0MoUkVBRERJUiwJCWVuY19yZWFkZGlyLAlkZWNfcmVhZGRpciksCi0gIFBST0MoU0VSVkVSX0NBUFMsCWVuY19zZXJ2ZXJfY2FwcywgZGVjX3NlcnZlcl9jYXBzKSwKLSAgUFJPQyhERUxFR1JFVFVSTiwJZW5jX2RlbGVncmV0dXJuLCBkZWNfZGVsZWdyZXR1cm4pLAotICBQUk9DKEdFVEFDTCwJCWVuY19nZXRhY2wsCWRlY19nZXRhY2wpLAotICBQUk9DKFNFVEFDTCwJCWVuY19zZXRhY2wsCWRlY19zZXRhY2wpLAotICBQUk9DKEZTX0xPQ0FUSU9OUywJZW5jX2ZzX2xvY2F0aW9ucywgZGVjX2ZzX2xvY2F0aW9ucyksCi0gIFBST0MoUkVMRUFTRV9MT0NLT1dORVIsIGVuY19yZWxlYXNlX2xvY2tvd25lciwgZGVjX3JlbGVhc2VfbG9ja293bmVyKSwKKwlQUk9DKFJFQUQsCQllbmNfcmVhZCwJCWRlY19yZWFkKSwKKwlQUk9DKFdSSVRFLAkJZW5jX3dyaXRlLAkJZGVjX3dyaXRlKSwKKwlQUk9DKENPTU1JVCwJCWVuY19jb21taXQsCQlkZWNfY29tbWl0KSwKKwlQUk9DKE9QRU4sCQllbmNfb3BlbiwJCWRlY19vcGVuKSwKKwlQUk9DKE9QRU5fQ09ORklSTSwJZW5jX29wZW5fY29uZmlybSwJZGVjX29wZW5fY29uZmlybSksCisJUFJPQyhPUEVOX05PQVRUUiwJZW5jX29wZW5fbm9hdHRyLAlkZWNfb3Blbl9ub2F0dHIpLAorCVBST0MoT1BFTl9ET1dOR1JBREUsCWVuY19vcGVuX2Rvd25ncmFkZSwJZGVjX29wZW5fZG93bmdyYWRlKSwKKwlQUk9DKENMT1NFLAkJZW5jX2Nsb3NlLAkJZGVjX2Nsb3NlKSwKKwlQUk9DKFNFVEFUVFIsCQllbmNfc2V0YXR0ciwJCWRlY19zZXRhdHRyKSwKKwlQUk9DKEZTSU5GTywJCWVuY19mc2luZm8sCQlkZWNfZnNpbmZvKSwKKwlQUk9DKFJFTkVXLAkJZW5jX3JlbmV3LAkJZGVjX3JlbmV3KSwKKwlQUk9DKFNFVENMSUVOVElELAllbmNfc2V0Y2xpZW50aWQsCWRlY19zZXRjbGllbnRpZCksCisJUFJPQyhTRVRDTElFTlRJRF9DT05GSVJNLCBlbmNfc2V0Y2xpZW50aWRfY29uZmlybSwgZGVjX3NldGNsaWVudGlkX2NvbmZpcm0pLAorCVBST0MoTE9DSywJCWVuY19sb2NrLAkJZGVjX2xvY2spLAorCVBST0MoTE9DS1QsCQllbmNfbG9ja3QsCQlkZWNfbG9ja3QpLAorCVBST0MoTE9DS1UsCQllbmNfbG9ja3UsCQlkZWNfbG9ja3UpLAorCVBST0MoQUNDRVNTLAkJZW5jX2FjY2VzcywJCWRlY19hY2Nlc3MpLAorCVBST0MoR0VUQVRUUiwJCWVuY19nZXRhdHRyLAkJZGVjX2dldGF0dHIpLAorCVBST0MoTE9PS1VQLAkJZW5jX2xvb2t1cCwJCWRlY19sb29rdXApLAorCVBST0MoTE9PS1VQX1JPT1QsCWVuY19sb29rdXBfcm9vdCwJZGVjX2xvb2t1cF9yb290KSwKKwlQUk9DKFJFTU9WRSwJCWVuY19yZW1vdmUsCQlkZWNfcmVtb3ZlKSwKKwlQUk9DKFJFTkFNRSwJCWVuY19yZW5hbWUsCQlkZWNfcmVuYW1lKSwKKwlQUk9DKExJTkssCQllbmNfbGluaywJCWRlY19saW5rKSwKKwlQUk9DKFNZTUxJTkssCQllbmNfc3ltbGluaywJCWRlY19zeW1saW5rKSwKKwlQUk9DKENSRUFURSwJCWVuY19jcmVhdGUsCQlkZWNfY3JlYXRlKSwKKwlQUk9DKFBBVEhDT05GLAkJZW5jX3BhdGhjb25mLAkJZGVjX3BhdGhjb25mKSwKKwlQUk9DKFNUQVRGUywJCWVuY19zdGF0ZnMsCQlkZWNfc3RhdGZzKSwKKwlQUk9DKFJFQURMSU5LLAkJZW5jX3JlYWRsaW5rLAkJZGVjX3JlYWRsaW5rKSwKKwlQUk9DKFJFQURESVIsCQllbmNfcmVhZGRpciwJCWRlY19yZWFkZGlyKSwKKwlQUk9DKFNFUlZFUl9DQVBTLAllbmNfc2VydmVyX2NhcHMsCWRlY19zZXJ2ZXJfY2FwcyksCisJUFJPQyhERUxFR1JFVFVSTiwJZW5jX2RlbGVncmV0dXJuLAlkZWNfZGVsZWdyZXR1cm4pLAorCVBST0MoR0VUQUNMLAkJZW5jX2dldGFjbCwJCWRlY19nZXRhY2wpLAorCVBST0MoU0VUQUNMLAkJZW5jX3NldGFjbCwJCWRlY19zZXRhY2wpLAorCVBST0MoRlNfTE9DQVRJT05TLAllbmNfZnNfbG9jYXRpb25zLAlkZWNfZnNfbG9jYXRpb25zKSwKKwlQUk9DKFJFTEVBU0VfTE9DS09XTkVSLAllbmNfcmVsZWFzZV9sb2Nrb3duZXIsCWRlY19yZWxlYXNlX2xvY2tvd25lciksCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCi0gIFBST0MoRVhDSEFOR0VfSUQsCWVuY19leGNoYW5nZV9pZCwJZGVjX2V4Y2hhbmdlX2lkKSwKLSAgUFJPQyhDUkVBVEVfU0VTU0lPTiwJZW5jX2NyZWF0ZV9zZXNzaW9uLAlkZWNfY3JlYXRlX3Nlc3Npb24pLAotICBQUk9DKERFU1RST1lfU0VTU0lPTiwJZW5jX2Rlc3Ryb3lfc2Vzc2lvbiwJZGVjX2Rlc3Ryb3lfc2Vzc2lvbiksCi0gIFBST0MoU0VRVUVOQ0UsCWVuY19zZXF1ZW5jZSwJZGVjX3NlcXVlbmNlKSwKLSAgUFJPQyhHRVRfTEVBU0VfVElNRSwJZW5jX2dldF9sZWFzZV90aW1lLAlkZWNfZ2V0X2xlYXNlX3RpbWUpLAotICBQUk9DKFJFQ0xBSU1fQ09NUExFVEUsIGVuY19yZWNsYWltX2NvbXBsZXRlLCAgZGVjX3JlY2xhaW1fY29tcGxldGUpLAotICBQUk9DKEdFVERFVklDRUlORk8sIGVuY19nZXRkZXZpY2VpbmZvLCBkZWNfZ2V0ZGV2aWNlaW5mbyksCi0gIFBST0MoTEFZT1VUR0VULCAgZW5jX2xheW91dGdldCwgICAgIGRlY19sYXlvdXRnZXQpLAorCVBST0MoRVhDSEFOR0VfSUQsCWVuY19leGNoYW5nZV9pZCwJZGVjX2V4Y2hhbmdlX2lkKSwKKwlQUk9DKENSRUFURV9TRVNTSU9OLAllbmNfY3JlYXRlX3Nlc3Npb24sCWRlY19jcmVhdGVfc2Vzc2lvbiksCisJUFJPQyhERVNUUk9ZX1NFU1NJT04sCWVuY19kZXN0cm95X3Nlc3Npb24sCWRlY19kZXN0cm95X3Nlc3Npb24pLAorCVBST0MoU0VRVUVOQ0UsCQllbmNfc2VxdWVuY2UsCQlkZWNfc2VxdWVuY2UpLAorCVBST0MoR0VUX0xFQVNFX1RJTUUsCWVuY19nZXRfbGVhc2VfdGltZSwJZGVjX2dldF9sZWFzZV90aW1lKSwKKwlQUk9DKFJFQ0xBSU1fQ09NUExFVEUsCWVuY19yZWNsYWltX2NvbXBsZXRlLAlkZWNfcmVjbGFpbV9jb21wbGV0ZSksCisJUFJPQyhHRVRERVZJQ0VJTkZPLAllbmNfZ2V0ZGV2aWNlaW5mbywJZGVjX2dldGRldmljZWluZm8pLAorCVBST0MoTEFZT1VUR0VULAkJZW5jX2xheW91dGdldCwJCWRlY19sYXlvdXRnZXQpLAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL3BhZ2VsaXN0LmMgYi9mcy9uZnMvcGFnZWxpc3QuYwppbmRleCBiNjg1MzZjLi5lMTE2NGUzIDEwMDY0NAotLS0gYS9mcy9uZnMvcGFnZWxpc3QuYworKysgYi9mcy9uZnMvcGFnZWxpc3QuYwpAQCAtMjYsMTIgKzI2LDkgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mc19wYWdlICoKIG5mc19wYWdlX2FsbG9jKHZvaWQpCiB7Ci0Jc3RydWN0IG5mc19wYWdlCSpwOwotCXAgPSBrbWVtX2NhY2hlX2FsbG9jKG5mc19wYWdlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHApIHsKLQkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXN0cnVjdCBuZnNfcGFnZQkqcCA9IGttZW1fY2FjaGVfemFsbG9jKG5mc19wYWdlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHApCiAJCUlOSVRfTElTVF9IRUFEKCZwLT53Yl9saXN0KTsKLQl9CiAJcmV0dXJuIHA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IGRiNzczNDIuLmJjNDA4OTcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMTc3LDEwNSArMTc3LDE0OSBAQAogICogcE5GUyBjbGllbnQgbGF5b3V0IGNhY2hlCiAgKi8KIAotc3RhdGljIHZvaWQKLWdldF9sYXlvdXRfaGRyX2xvY2tlZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKKy8qIE5lZWQgdG8gaG9sZCBpX2xvY2sgaWYgY2FsbGVyIGRvZXMgbm90IGFscmVhZHkgaG9sZCByZWZlcmVuY2UgKi8KK3ZvaWQKK2dldF9sYXlvdXRfaGRyKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQogewotCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPmlub2RlLT5pX2xvY2spOwotCWxvLT5yZWZjb3VudCsrOworCWF0b21pY19pbmMoJmxvLT5wbGhfcmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9sYXlvdXRfaGRyKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQoreworCWRwcmludGsoIiVzOiBmcmVlaW5nIGxheW91dCBjYWNoZSAlcFxuIiwgX19mdW5jX18sIGxvKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5wbGhfbGF5b3V0cykpOworCU5GU19JKGxvLT5wbGhfaW5vZGUpLT5sYXlvdXQgPSBOVUxMOworCWtmcmVlKGxvKTsKIH0KIAogc3RhdGljIHZvaWQKIHB1dF9sYXlvdXRfaGRyX2xvY2tlZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKIHsKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5pbm9kZS0+aV9sb2NrKTsKLQlCVUdfT04obG8tPnJlZmNvdW50ID09IDApOwotCi0JbG8tPnJlZmNvdW50LS07Ci0JaWYgKCFsby0+cmVmY291bnQpIHsKLQkJZHByaW50aygiJXM6IGZyZWVpbmcgbGF5b3V0IGNhY2hlICVwXG4iLCBfX2Z1bmNfXywgbG8pOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5sYXlvdXRzKSk7Ci0JCU5GU19JKGxvLT5pbm9kZSktPmxheW91dCA9IE5VTEw7Ci0JCWtmcmVlKGxvKTsKLQl9CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxvLT5wbGhfcmVmY291bnQpKQorCQlkZXN0cm95X2xheW91dF9oZHIobG8pOwogfQogCiB2b2lkCi1wdXRfbGF5b3V0X2hkcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQorcHV0X2xheW91dF9oZHIoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8pCiB7Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlwdXRfbGF5b3V0X2hkcl9sb2NrZWQoTkZTX0koaW5vZGUpLT5sYXlvdXQpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbG8tPnBsaF9pbm9kZTsKKworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZsby0+cGxoX3JlZmNvdW50LCAmaW5vZGUtPmlfbG9jaykpIHsKKwkJZGVzdHJveV9sYXlvdXRfaGRyKGxvKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0KIH0KIAogc3RhdGljIHZvaWQKIGluaXRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJmxzZWctPmZpX2xpc3QpOwotCWtyZWZfaW5pdCgmbHNlZy0+a3JlZik7Ci0JbHNlZy0+bGF5b3V0ID0gbG87CisJSU5JVF9MSVNUX0hFQUQoJmxzZWctPnBsc19saXN0KTsKKwlhdG9taWNfc2V0KCZsc2VnLT5wbHNfcmVmY291bnQsIDEpOworCXNtcF9tYigpOworCXNldF9iaXQoTkZTX0xTRUdfVkFMSUQsICZsc2VnLT5wbHNfZmxhZ3MpOworCWxzZWctPnBsc19sYXlvdXQgPSBsbzsKIH0KIAotLyogQ2FsbGVkIHdpdGhvdXQgaV9sb2NrIGhlbGQsIGFzIHRoZSBmcmVlX2xzZWcgY2FsbCBtYXkgc2xlZXAgKi8KLXN0YXRpYyB2b2lkCi1kZXN0cm95X2xzZWcoc3RydWN0IGtyZWYgKmtyZWYpCitzdGF0aWMgdm9pZCBmcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0Jc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPQotCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQsIGtyZWYpOwotCXN0cnVjdCBpbm9kZSAqaW5vID0gbHNlZy0+bGF5b3V0LT5pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxzZWctPnBsc19sYXlvdXQtPnBsaF9pbm9kZTsKIAotCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCU5GU19TRVJWRVIoaW5vKS0+cG5mc19jdXJyX2xkLT5mcmVlX2xzZWcobHNlZyk7Ci0JLyogTWF0Y2hlZCBieSBnZXRfbGF5b3V0X2hkcl9sb2NrZWQgaW4gcG5mc19pbnNlcnRfbGF5b3V0ICovCi0JcHV0X2xheW91dF9oZHIoaW5vKTsKKwkvKiBNYXRjaGVkIGJ5IGdldF9sYXlvdXRfaGRyIGluIHBuZnNfaW5zZXJ0X2xheW91dCAqLworCXB1dF9sYXlvdXRfaGRyKE5GU19JKGlubyktPmxheW91dCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1wdXRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZykKKy8qIFRoZSB1c2Ugb2YgdG1wX2xpc3QgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgcG5mc19jdXJyX2xkLT5mcmVlX2xzZWcKKyAqIGNvdWxkIHNsZWVwLCBzbyBtdXN0IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBsb2NrLgorICogUmV0dXJucyAxIGlmIG9iamVjdCB3YXMgcmVtb3ZlZCwgb3RoZXJ3aXNlIHJldHVybiAwLgorICovCitzdGF0aWMgaW50CitwdXRfbHNlZ19sb2NrZWQoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQogewotCWlmICghbHNlZykKLQkJcmV0dXJuOworCWRwcmludGsoIiVzOiBsc2VnICVwIHJlZiAlZCB2YWxpZCAlZFxuIiwgX19mdW5jX18sIGxzZWcsCisJCWF0b21pY19yZWFkKCZsc2VnLT5wbHNfcmVmY291bnQpLAorCQl0ZXN0X2JpdChORlNfTFNFR19WQUxJRCwgJmxzZWctPnBsc19mbGFncykpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZsc2VnLT5wbHNfcmVmY291bnQpKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vID0gbHNlZy0+cGxzX2xheW91dC0+cGxoX2lub2RlOwogCi0JZHByaW50aygiJXM6IGxzZWcgJXAgcmVmICVkXG4iLCBfX2Z1bmNfXywgbHNlZywKLQkJYXRvbWljX3JlYWQoJmxzZWctPmtyZWYucmVmY291bnQpKTsKLQlrcmVmX3B1dCgmbHNlZy0+a3JlZiwgZGVzdHJveV9sc2VnKTsKKwkJQlVHX09OKHRlc3RfYml0KE5GU19MU0VHX1ZBTElELCAmbHNlZy0+cGxzX2ZsYWdzKSk7CisJCWxpc3RfZGVsKCZsc2VnLT5wbHNfbGlzdCk7CisJCWlmIChsaXN0X2VtcHR5KCZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfc2VncykpIHsKKwkJCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisKKwkJCWNscCA9IE5GU19TRVJWRVIoaW5vKS0+bmZzX2NsaWVudDsKKwkJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJCS8qIExpc3QgZG9lcyBub3QgdGFrZSBhIHJlZmVyZW5jZSwgc28gbm8gbmVlZCBmb3IgcHV0IGhlcmUgKi8KKwkJCWxpc3RfZGVsX2luaXQoJmxzZWctPnBsc19sYXlvdXQtPnBsaF9sYXlvdXRzKTsKKwkJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQkJY2xlYXJfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfZmxhZ3MpOworCQl9CisJCXJwY193YWtlX3VwKCZORlNfU0VSVkVSKGlubyktPnJvY19ycGN3YWl0cSk7CisJCWxpc3RfYWRkKCZsc2VnLT5wbHNfbGlzdCwgdG1wX2xpc3QpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1wbmZzX2NsZWFyX2xzZWdfbGlzdChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QpCitzdGF0aWMgYm9vbAorc2hvdWxkX2ZyZWVfbHNlZyh1MzIgbHNlZ19pb21vZGUsIHUzMiByZWNhbGxfaW9tb2RlKQoreworCXJldHVybiAocmVjYWxsX2lvbW9kZSA9PSBJT01PREVfQU5ZIHx8CisJCWxzZWdfaW9tb2RlID09IHJlY2FsbF9pb21vZGUpOworfQorCisvKiBSZXR1cm5zIDEgaWYgbHNlZyBpcyByZW1vdmVkIGZyb20gbGlzdCwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbWFya19sc2VnX2ludmFsaWQoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQoreworCWludCBydiA9IDA7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19MU0VHX1ZBTElELCAmbHNlZy0+cGxzX2ZsYWdzKSkgeworCQkvKiBSZW1vdmUgdGhlIHJlZmVyZW5jZSBrZWVwaW5nIHRoZSBsc2VnIGluIHRoZQorCQkgKiBsaXN0LiAgSXQgd2lsbCBub3cgYmUgcmVtb3ZlZCB3aGVuIGFsbAorCQkgKiBvdXRzdGFuZGluZyBpbyBpcyBmaW5pc2hlZC4KKwkJICovCisJCXJ2ID0gcHV0X2xzZWdfbG9ja2VkKGxzZWcsIHRtcF9saXN0KTsKKwl9CisJcmV0dXJuIHJ2OworfQorCisvKiBSZXR1cm5zIGNvdW50IG9mIG51bWJlciBvZiBtYXRjaGluZyBpbnZhbGlkIGxzZWdzIHJlbWFpbmluZyBpbiBsaXN0CisgKiBhZnRlciBjYWxsLgorICovCitpbnQKK21hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0bXBfbGlzdCwKKwkJCSAgICB1MzIgaW9tb2RlKQogewogCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqbmV4dDsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOworCWludCBpbnZhbGlkID0gMCwgcmVtb3ZlZCA9IDA7CiAKIAlkcHJpbnRrKCIlczpCZWdpbiBsbyAlcFxuIiwgX19mdW5jX18sIGxvKTsKIAotCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPmlub2RlLT5pX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2VnLCBuZXh0LCAmbG8tPnNlZ3MsIGZpX2xpc3QpIHsKLQkJZHByaW50aygiJXM6IGZyZWVpbmcgbHNlZyAlcFxuIiwgX19mdW5jX18sIGxzZWcpOwotCQlsaXN0X21vdmUoJmxzZWctPmZpX2xpc3QsIHRtcF9saXN0KTsKLQl9Ci0JY2xwID0gTkZTX1NFUlZFUihsby0+aW5vZGUpLT5uZnNfY2xpZW50OwotCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkvKiBMaXN0IGRvZXMgbm90IHRha2UgYSByZWZlcmVuY2UsIHNvIG5vIG5lZWQgZm9yIHB1dCBoZXJlICovCi0JbGlzdF9kZWxfaW5pdCgmbG8tPmxheW91dHMpOwotCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCXdyaXRlX3NlcWxvY2soJmxvLT5zZXFsb2NrKTsKLQljbGVhcl9iaXQoTkZTX0xBWU9VVF9TVEFURUlEX1NFVCwgJmxvLT5zdGF0ZSk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZsby0+c2VxbG9jayk7Ci0KLQlkcHJpbnRrKCIlczpSZXR1cm5cbiIsIF9fZnVuY19fKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNlZywgbmV4dCwgJmxvLT5wbGhfc2VncywgcGxzX2xpc3QpCisJCWlmIChzaG91bGRfZnJlZV9sc2VnKGxzZWctPnBsc19yYW5nZS5pb21vZGUsIGlvbW9kZSkpIHsKKwkJCWRwcmludGsoIiVzOiBmcmVlaW5nIGxzZWcgJXAgaW9tb2RlICVkICIKKwkJCQkib2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHVcbiIsIF9fZnVuY19fLAorCQkJCWxzZWcsIGxzZWctPnBsc19yYW5nZS5pb21vZGUsIGxzZWctPnBsc19yYW5nZS5vZmZzZXQsCisJCQkJbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCk7CisJCQlpbnZhbGlkKys7CisJCQlyZW1vdmVkICs9IG1hcmtfbHNlZ19pbnZhbGlkKGxzZWcsIHRtcF9saXN0KTsKKwkJfQorCWRwcmludGsoIiVzOlJldHVybiAlaVxuIiwgX19mdW5jX18sIGludmFsaWQgLSByZW1vdmVkKTsKKwlyZXR1cm4gaW52YWxpZCAtIHJlbW92ZWQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1wbmZzX2ZyZWVfbHNlZ19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQordm9pZAorcG5mc19mcmVlX2xzZWdfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX21lKQogewotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnOworCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqdG1wOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KHRtcF9saXN0KSkgewotCQlsc2VnID0gbGlzdF9lbnRyeSh0bXBfbGlzdC0+bmV4dCwgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQsCi0JCQkJZmlfbGlzdCk7Ci0JCWRwcmludGsoIiVzIGNhbGxpbmcgcHV0X2xzZWcgb24gJXBcbiIsIF9fZnVuY19fLCBsc2VnKTsKLQkJbGlzdF9kZWwoJmxzZWctPmZpX2xpc3QpOwotCQlwdXRfbHNlZyhsc2VnKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNlZywgdG1wLCBmcmVlX21lLCBwbHNfbGlzdCkgeworCQlsaXN0X2RlbCgmbHNlZy0+cGxzX2xpc3QpOworCQlmcmVlX2xzZWcobHNlZyk7CiAJfQogfQogCkBAIC0yODgsNyArMzMyLDggQEAKIAlzcGluX2xvY2soJm5mc2ktPnZmc19pbm9kZS5pX2xvY2spOwogCWxvID0gbmZzaS0+bGF5b3V0OwogCWlmIChsbykgewotCQlwbmZzX2NsZWFyX2xzZWdfbGlzdChsbywgJnRtcF9saXN0KTsKKwkJc2V0X2JpdChORlNfTEFZT1VUX0RFU1RST1lFRCwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKTsKKwkJbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmdG1wX2xpc3QsIElPTU9ERV9BTlkpOwogCQkvKiBNYXRjaGVkIGJ5IHJlZmNvdW50IHNldCB0byAxIGluIGFsbG9jX2luaXRfbGF5b3V0X2hkciAqLwogCQlwdXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOwogCX0KQEAgLTMxMiw3NiArMzU3LDgwIEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcF9saXN0KSkgewogCQlsbyA9IGxpc3RfZW50cnkodG1wX2xpc3QubmV4dCwgc3RydWN0IHBuZnNfbGF5b3V0X2hkciwKLQkJCQlsYXlvdXRzKTsKKwkJCQlwbGhfbGF5b3V0cyk7CiAJCWRwcmludGsoIiVzIGZyZWVpbmcgbGF5b3V0IGZvciBpbm9kZSAlbHVcbiIsIF9fZnVuY19fLAotCQkJbG8tPmlub2RlLT5pX2lubyk7Ci0JCXBuZnNfZGVzdHJveV9sYXlvdXQoTkZTX0kobG8tPmlub2RlKSk7CisJCQlsby0+cGxoX2lub2RlLT5pX2lubyk7CisJCXBuZnNfZGVzdHJveV9sYXlvdXQoTkZTX0kobG8tPnBsaF9pbm9kZSkpOwogCX0KIH0KIAotLyogdXBkYXRlIGxvLT5zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50Ci0gKgotICogbG8tPnN0YXRlaWQgY291bGQgYmUgdGhlIG9wZW4gc3RhdGVpZCwgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHVzZSB3aGF0IGdpdmVuLgotICovCi1zdGF0aWMgdm9pZAotcG5mc19zZXRfbGF5b3V0X3N0YXRlaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQljb25zdCBuZnM0X3N0YXRlaWQgKm5ldykKLXsKLQluZnM0X3N0YXRlaWQgKm9sZCA9ICZsby0+c3RhdGVpZDsKLQlib29sIG92ZXJ3cml0ZSA9IGZhbHNlOwotCi0Jd3JpdGVfc2VxbG9jaygmbG8tPnNlcWxvY2spOwotCWlmICghdGVzdF9iaXQoTkZTX0xBWU9VVF9TVEFURUlEX1NFVCwgJmxvLT5zdGF0ZSkgfHwKLQkgICAgbWVtY21wKG9sZC0+c3RhdGVpZC5vdGhlciwgbmV3LT5zdGF0ZWlkLm90aGVyLCBzaXplb2YobmV3LT5zdGF0ZWlkLm90aGVyKSkpCi0JCW92ZXJ3cml0ZSA9IHRydWU7Ci0JZWxzZSB7Ci0JCXUzMiBvbGRzZXEsIG5ld3NlcTsKLQotCQlvbGRzZXEgPSBiZTMyX3RvX2NwdShvbGQtPnN0YXRlaWQuc2VxaWQpOwotCQluZXdzZXEgPSBiZTMyX3RvX2NwdShuZXctPnN0YXRlaWQuc2VxaWQpOwotCQlpZiAoKGludCkobmV3c2VxIC0gb2xkc2VxKSA+IDApCi0JCQlvdmVyd3JpdGUgPSB0cnVlOwotCX0KLQlpZiAob3ZlcndyaXRlKQotCQltZW1jcHkoJm9sZC0+c3RhdGVpZCwgJm5ldy0+c3RhdGVpZCwgc2l6ZW9mKG5ldy0+c3RhdGVpZCkpOwotCXdyaXRlX3NlcXVubG9jaygmbG8tPnNlcWxvY2spOwotfQotCi1zdGF0aWMgdm9pZAotcG5mc19sYXlvdXRfZnJvbV9vcGVuX3N0YXRlaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQkgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCi17Ci0JaW50IHNlcTsKLQotCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwotCXdyaXRlX3NlcWxvY2soJmxvLT5zZXFsb2NrKTsKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnN0YXRlLT5zZXFsb2NrKTsKLQkJbWVtY3B5KGxvLT5zdGF0ZWlkLmRhdGEsIHN0YXRlLT5zdGF0ZWlkLmRhdGEsCi0JCSAgICAgICBzaXplb2Yoc3RhdGUtPnN0YXRlaWQuZGF0YSkpOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnN0YXRlLT5zZXFsb2NrLCBzZXEpKTsKLQlzZXRfYml0KE5GU19MQVlPVVRfU1RBVEVJRF9TRVQsICZsby0+c3RhdGUpOwotCXdyaXRlX3NlcXVubG9jaygmbG8tPnNlcWxvY2spOwotCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOwotfQotCisvKiB1cGRhdGUgbG8tPnBsaF9zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50ICovCiB2b2lkCi1wbmZzX2dldF9sYXlvdXRfc3RhdGVpZChuZnM0X3N0YXRlaWQgKmRzdCwgc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQlzdHJ1Y3QgbmZzNF9zdGF0ZSAqb3Blbl9zdGF0ZSkKK3BuZnNfc2V0X2xheW91dF9zdGF0ZWlkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLCBjb25zdCBuZnM0X3N0YXRlaWQgKm5ldywKKwkJCWJvb2wgdXBkYXRlX2JhcnJpZXIpCiB7Ci0JaW50IHNlcTsKKwl1MzIgb2xkc2VxLCBuZXdzZXE7CisKKwlvbGRzZXEgPSBiZTMyX3RvX2NwdShsby0+cGxoX3N0YXRlaWQuc3RhdGVpZC5zZXFpZCk7CisJbmV3c2VxID0gYmUzMl90b19jcHUobmV3LT5zdGF0ZWlkLnNlcWlkKTsKKwlpZiAoKGludCkobmV3c2VxIC0gb2xkc2VxKSA+IDApIHsKKwkJbWVtY3B5KCZsby0+cGxoX3N0YXRlaWQsICZuZXctPnN0YXRlaWQsIHNpemVvZihuZXctPnN0YXRlaWQpKTsKKwkJaWYgKHVwZGF0ZV9iYXJyaWVyKSB7CisJCQl1MzIgbmV3X2JhcnJpZXIgPSBiZTMyX3RvX2NwdShuZXctPnN0YXRlaWQuc2VxaWQpOworCisJCQlpZiAoKGludCkobmV3X2JhcnJpZXIgLSBsby0+cGxoX2JhcnJpZXIpKQorCQkJCWxvLT5wbGhfYmFycmllciA9IG5ld19iYXJyaWVyOworCQl9IGVsc2UgeworCQkJLyogQmVjYXVzZSBvZiB3cmFwYXJvdW5kLCB3ZSB3YW50IHRvIGtlZXAgdGhlIGJhcnJpZXIKKwkJCSAqICJjbG9zZSIgdG8gdGhlIGN1cnJlbnQgc2VxaWRzLiAgSXQgbmVlZHMgdG8gYmUKKwkJCSAqIHdpdGhpbiAyKiozMSB0byBjb3VudCBhcyAiYmVoaW5kIiwgc28gaWYgaXQKKwkJCSAqIGdldHMgdG9vIG5lYXIgdGhhdCBsaW1pdCwgZ2l2ZSB1cyBhIGxpdGxlIGxlZXdheQorCQkJICogYW5kIGJyaW5nIGl0IHRvIHdpdGhpbiAyKiozMC4KKwkJCSAqIE5PVEUgLSBhbmQgeWVzLCB0aGlzIGlzIGFsbCB1bnNpZ25lZCBhcml0aG1ldGljLgorCQkJICovCisJCQlpZiAodW5saWtlbHkoKG5ld3NlcSAtIGxvLT5wbGhfYmFycmllcikgPiAoMyA8PCAyOSkpKQorCQkJCWxvLT5wbGhfYmFycmllciA9IG5ld3NlcSAtICgxIDw8IDMwKTsKKwkJfQorCX0KK30KKworLyogbGdldCBpcyBzZXQgdG8gMSBpZiBjYWxsZWQgZnJvbSBpbnNpZGUgc2VuZF9sYXlvdXRnZXQgY2FsbCBjaGFpbiAqLworc3RhdGljIGJvb2wKK3BuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsCisJCQlpbnQgbGdldCkKK3sKKwlpZiAoKHN0YXRlaWQpICYmCisJICAgIChpbnQpKGxvLT5wbGhfYmFycmllciAtIGJlMzJfdG9fY3B1KHN0YXRlaWQtPnN0YXRlaWQuc2VxaWQpKSA+PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gbG8tPnBsaF9ibG9ja19sZ2V0cyB8fAorCQl0ZXN0X2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncykgfHwKKwkJKGxpc3RfZW1wdHkoJmxvLT5wbGhfc2VncykgJiYKKwkJIChhdG9taWNfcmVhZCgmbG8tPnBsaF9vdXRzdGFuZGluZykgPiBsZ2V0KSk7Cit9CisKK2ludAorcG5mc19jaG9vc2VfbGF5b3V0Z2V0X3N0YXRlaWQobmZzNF9zdGF0ZWlkICpkc3QsIHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLAorCQkJICAgICAgc3RydWN0IG5mczRfc3RhdGUgKm9wZW5fc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJmxvLT5zZXFsb2NrKTsKLQkJaWYgKCF0ZXN0X2JpdChORlNfTEFZT1VUX1NUQVRFSURfU0VULCAmbG8tPnN0YXRlKSkgewotCQkJLyogVGhpcyB3aWxsIHRyaWdnZXIgcmV0cnkgb2YgdGhlIHJlYWQgKi8KLQkJCXBuZnNfbGF5b3V0X2Zyb21fb3Blbl9zdGF0ZWlkKGxvLCBvcGVuX3N0YXRlKTsKLQkJfSBlbHNlCi0JCQltZW1jcHkoZHN0LT5kYXRhLCBsby0+c3RhdGVpZC5kYXRhLAotCQkJICAgICAgIHNpemVvZihsby0+c3RhdGVpZC5kYXRhKSk7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbG8tPnNlcWxvY2ssIHNlcSkpOworCXNwaW5fbG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwlpZiAocG5mc19sYXlvdXRnZXRzX2Jsb2NrZWQobG8sIE5VTEwsIDEpKSB7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCWludCBzZXE7CisKKwkJZG8geworCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmb3Blbl9zdGF0ZS0+c2VxbG9jayk7CisJCQltZW1jcHkoZHN0LT5kYXRhLCBvcGVuX3N0YXRlLT5zdGF0ZWlkLmRhdGEsCisJCQkgICAgICAgc2l6ZW9mKG9wZW5fc3RhdGUtPnN0YXRlaWQuZGF0YSkpOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZvcGVuX3N0YXRlLT5zZXFsb2NrLCBzZXEpKTsKKwl9IGVsc2UKKwkJbWVtY3B5KGRzdC0+ZGF0YSwgbG8tPnBsaF9zdGF0ZWlkLmRhdGEsIHNpemVvZihsby0+cGxoX3N0YXRlaWQuZGF0YSkpOworCXNwaW5fdW5sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwogCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0zOTUsNyArNDQ0LDcgQEAKIAkgICBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAogCSAgIHUzMiBpb21vZGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm8gPSBsby0+aW5vZGU7CisJc3RydWN0IGlub2RlICppbm8gPSBsby0+cGxoX2lub2RlOwogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlubyk7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3A7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPSBOVUxMOwpAQCAtNDA0LDEwICs0NTMsOCBAQAogCiAJQlVHX09OKGN0eCA9PSBOVUxMKTsKIAlsZ3AgPSBremFsbG9jKHNpemVvZigqbGdwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxncCA9PSBOVUxMKSB7Ci0JCXB1dF9sYXlvdXRfaGRyKGxvLT5pbm9kZSk7CisJaWYgKGxncCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJbGdwLT5hcmdzLm1pbmxlbmd0aCA9IE5GUzRfTUFYX1VJTlQ2NDsKIAlsZ3AtPmFyZ3MubWF4Y291bnQgPSBQTkZTX0xBWU9VVF9NQVhTSVpFOwogCWxncC0+YXJncy5yYW5nZS5pb21vZGUgPSBpb21vZGU7CkBAIC00MjQsMTEgKzQ3MSw4OCBAQAogCW5mczRfcHJvY19sYXlvdXRnZXQobGdwKTsKIAlpZiAoIWxzZWcpIHsKIAkJLyogcmVtZW1iZXIgdGhhdCBMQVlPVVRHRVQgZmFpbGVkIGFuZCBzdXNwZW5kIHRyeWluZyAqLwotCQlzZXRfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZsby0+c3RhdGUpOworCQlzZXRfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZsby0+cGxoX2ZsYWdzKTsKIAl9CiAJcmV0dXJuIGxzZWc7CiB9CiAKK2Jvb2wgcG5mc19yb2Moc3RydWN0IGlub2RlICppbm8pCit7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsICp0bXA7CisJTElTVF9IRUFEKHRtcF9saXN0KTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKKwlsbyA9IE5GU19JKGlubyktPmxheW91dDsKKwlpZiAoIWxvIHx8ICF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0xBWU9VVF9ST0MsICZsby0+cGxoX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncykpCisJCWdvdG8gb3V0X25vbGF5b3V0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2VnLCB0bXAsICZsby0+cGxoX3NlZ3MsIHBsc19saXN0KQorCQlpZiAodGVzdF9iaXQoTkZTX0xTRUdfUk9DLCAmbHNlZy0+cGxzX2ZsYWdzKSkgeworCQkJbWFya19sc2VnX2ludmFsaWQobHNlZywgJnRtcF9saXN0KTsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCWlmICghZm91bmQpCisJCWdvdG8gb3V0X25vbGF5b3V0OworCWxvLT5wbGhfYmxvY2tfbGdldHMrKzsKKwlnZXRfbGF5b3V0X2hkcihsbyk7IC8qIG1hdGNoZWQgaW4gcG5mc19yb2NfcmVsZWFzZSAqLworCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJcG5mc19mcmVlX2xzZWdfbGlzdCgmdG1wX2xpc3QpOworCXJldHVybiB0cnVlOworCitvdXRfbm9sYXlvdXQ6CisJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgcG5mc19yb2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlubykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbzsKKworCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOworCWxvID0gTkZTX0koaW5vKS0+bGF5b3V0OworCWxvLT5wbGhfYmxvY2tfbGdldHMtLTsKKwlwdXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOworCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7Cit9CisKK3ZvaWQgcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RydWN0IGlub2RlICppbm8sIHUzMiBiYXJyaWVyKQoreworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvOworCisJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJbG8gPSBORlNfSShpbm8pLT5sYXlvdXQ7CisJaWYgKChpbnQpKGJhcnJpZXIgLSBsby0+cGxoX2JhcnJpZXIpID4gMCkKKwkJbG8tPnBsaF9iYXJyaWVyID0gYmFycmllcjsKKwlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOworfQorCitib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlubyk7CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWc7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsc2VnLCAmbmZzaS0+bGF5b3V0LT5wbGhfc2VncywgcGxzX2xpc3QpCisJCWlmICh0ZXN0X2JpdChORlNfTFNFR19ST0MsICZsc2VnLT5wbHNfZmxhZ3MpKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCWlmICghZm91bmQpIHsKKwkJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8gPSBuZnNpLT5sYXlvdXQ7CisJCXUzMiBjdXJyZW50X3NlcWlkID0gYmUzMl90b19jcHUobG8tPnBsaF9zdGF0ZWlkLnN0YXRlaWQuc2VxaWQpOworCisJCS8qIFNpbmNlIGNsb3NlIGRvZXMgbm90IHJldHVybiBhIGxheW91dCBzdGF0ZWlkIGZvciB1c2UgYXMKKwkJICogYSBiYXJyaWVyLCB3ZSBjaG9vc2UgdGhlIHdvcnN0LWNhc2UgYmFycmllci4KKwkJICovCisJCSpiYXJyaWVyID0gY3VycmVudF9zZXFpZCArIGF0b21pY19yZWFkKCZsby0+cGxoX291dHN0YW5kaW5nKTsKKwl9CisJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKIC8qCiAgKiBDb21wYXJlIHR3byBsYXlvdXQgc2VnbWVudHMgZm9yIHNvcnRpbmcgaW50byBsYXlvdXQgY2FjaGUuCiAgKiBXZSB3YW50IHRvIHByZWZlcmVudGlhbGx5IHJldHVybiBSVyBvdmVyIFJPIGxheW91dHMsIHNvIGVuc3VyZSB0aG9zZQpAQCAtNDUwLDM3ICs1NzQsMjkgQEAKIAogCWRwcmludGsoIiVzOkJlZ2luXG4iLCBfX2Z1bmNfXyk7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5pbm9kZS0+aV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmbG8tPnNlZ3MpKSB7Ci0JCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGxvLT5pbm9kZSktPm5mc19jbGllbnQ7Ci0KLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5sYXlvdXRzKSk7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvLT5sYXlvdXRzLCAmY2xwLT5jbF9sYXlvdXRzKTsKLQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkobHAsICZsby0+c2VncywgZmlfbGlzdCkgewotCQlpZiAoY21wX2xheW91dChscC0+cmFuZ2UuaW9tb2RlLCBsc2VnLT5yYW5nZS5pb21vZGUpID4gMCkKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShscCwgJmxvLT5wbGhfc2VncywgcGxzX2xpc3QpIHsKKwkJaWYgKGNtcF9sYXlvdXQobHAtPnBsc19yYW5nZS5pb21vZGUsIGxzZWctPnBsc19yYW5nZS5pb21vZGUpID4gMCkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5maV9saXN0LCAmbHAtPmZpX2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5wbHNfbGlzdCwgJmxwLT5wbHNfbGlzdCk7CiAJCWRwcmludGsoIiVzOiBpbnNlcnRlZCBsc2VnICVwICIKIAkJCSJpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHUgYmVmb3JlICIKIAkJCSJscCAlcCBpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHVcbiIsCi0JCQlfX2Z1bmNfXywgbHNlZywgbHNlZy0+cmFuZ2UuaW9tb2RlLAotCQkJbHNlZy0+cmFuZ2Uub2Zmc2V0LCBsc2VnLT5yYW5nZS5sZW5ndGgsCi0JCQlscCwgbHAtPnJhbmdlLmlvbW9kZSwgbHAtPnJhbmdlLm9mZnNldCwKLQkJCWxwLT5yYW5nZS5sZW5ndGgpOworCQkJX19mdW5jX18sIGxzZWcsIGxzZWctPnBsc19yYW5nZS5pb21vZGUsCisJCQlsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LCBsc2VnLT5wbHNfcmFuZ2UubGVuZ3RoLAorCQkJbHAsIGxwLT5wbHNfcmFuZ2UuaW9tb2RlLCBscC0+cGxzX3JhbmdlLm9mZnNldCwKKwkJCWxwLT5wbHNfcmFuZ2UubGVuZ3RoKTsKIAkJZm91bmQgPSAxOwogCQlicmVhazsKIAl9CiAJaWYgKCFmb3VuZCkgewotCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5maV9saXN0LCAmbG8tPnNlZ3MpOworCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5wbHNfbGlzdCwgJmxvLT5wbGhfc2Vncyk7CiAJCWRwcmludGsoIiVzOiBpbnNlcnRlZCBsc2VnICVwICIKIAkJCSJpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHUgYXQgdGFpbFxuIiwKLQkJCV9fZnVuY19fLCBsc2VnLCBsc2VnLT5yYW5nZS5pb21vZGUsCi0JCQlsc2VnLT5yYW5nZS5vZmZzZXQsIGxzZWctPnJhbmdlLmxlbmd0aCk7CisJCQlfX2Z1bmNfXywgbHNlZywgbHNlZy0+cGxzX3JhbmdlLmlvbW9kZSwKKwkJCWxzZWctPnBsc19yYW5nZS5vZmZzZXQsIGxzZWctPnBsc19yYW5nZS5sZW5ndGgpOwogCX0KLQlnZXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOworCWdldF9sYXlvdXRfaGRyKGxvKTsKIAogCWRwcmludGsoIiVzOlJldHVyblxuIiwgX19mdW5jX18pOwogfQpAQCAtNDkzLDExICs2MDksMTEgQEAKIAlsbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbmZzX2xheW91dF9oZHIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxvKQogCQlyZXR1cm4gTlVMTDsKLQlsby0+cmVmY291bnQgPSAxOwotCUlOSVRfTElTVF9IRUFEKCZsby0+bGF5b3V0cyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmxvLT5zZWdzKTsKLQlzZXFsb2NrX2luaXQoJmxvLT5zZXFsb2NrKTsKLQlsby0+aW5vZGUgPSBpbm87CisJYXRvbWljX3NldCgmbG8tPnBsaF9yZWZjb3VudCwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfbGF5b3V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfc2Vncyk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfYnVsa19yZWNhbGwpOworCWxvLT5wbGhfaW5vZGUgPSBpbm87CiAJcmV0dXJuIGxvOwogfQogCkBAIC01MTAsOSArNjI2LDEyIEBACiAJZHByaW50aygiJXMgQmVnaW4gaW5vPSVwIGxheW91dD0lcFxuIiwgX19mdW5jX18sIGlubywgbmZzaS0+bGF5b3V0KTsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmaW5vLT5pX2xvY2spOwotCWlmIChuZnNpLT5sYXlvdXQpCi0JCXJldHVybiBuZnNpLT5sYXlvdXQ7Ci0KKwlpZiAobmZzaS0+bGF5b3V0KSB7CisJCWlmICh0ZXN0X2JpdChORlNfTEFZT1VUX0RFU1RST1lFRCwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKSkKKwkJCXJldHVybiBOVUxMOworCQllbHNlCisJCQlyZXR1cm4gbmZzaS0+bGF5b3V0OworCX0KIAlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwogCW5ldyA9IGFsbG9jX2luaXRfbGF5b3V0X2hkcihpbm8pOwogCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOwpAQCAtNTM4LDMxICs2NTcsMzIgQEAKIHN0YXRpYyBpbnQKIGlzX21hdGNoaW5nX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsIHUzMiBpb21vZGUpCiB7Ci0JcmV0dXJuIChpb21vZGUgIT0gSU9NT0RFX1JXIHx8IGxzZWctPnJhbmdlLmlvbW9kZSA9PSBJT01PREVfUlcpOworCXJldHVybiAoaW9tb2RlICE9IElPTU9ERV9SVyB8fCBsc2VnLT5wbHNfcmFuZ2UuaW9tb2RlID09IElPTU9ERV9SVyk7CiB9CiAKIC8qCiAgKiBsb29rdXAgcmFuZ2UgaW4gbGF5b3V0CiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqCi1wbmZzX2hhc19sYXlvdXQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHUzMiBpb21vZGUpCitwbmZzX2ZpbmRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgdTMyIGlvbW9kZSkKIHsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywgKnJldCA9IE5VTEw7CiAKIAlkcHJpbnRrKCIlczpCZWdpblxuIiwgX19mdW5jX18pOwogCi0JYXNzZXJ0X3NwaW5fbG9ja2VkKCZsby0+aW5vZGUtPmlfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsc2VnLCAmbG8tPnNlZ3MsIGZpX2xpc3QpIHsKLQkJaWYgKGlzX21hdGNoaW5nX2xzZWcobHNlZywgaW9tb2RlKSkgeworCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzZWcsICZsby0+cGxoX3NlZ3MsIHBsc19saXN0KSB7CisJCWlmICh0ZXN0X2JpdChORlNfTFNFR19WQUxJRCwgJmxzZWctPnBsc19mbGFncykgJiYKKwkJICAgIGlzX21hdGNoaW5nX2xzZWcobHNlZywgaW9tb2RlKSkgewogCQkJcmV0ID0gbHNlZzsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChjbXBfbGF5b3V0KGlvbW9kZSwgbHNlZy0+cmFuZ2UuaW9tb2RlKSA+IDApCisJCWlmIChjbXBfbGF5b3V0KGlvbW9kZSwgbHNlZy0+cGxzX3JhbmdlLmlvbW9kZSkgPiAwKQogCQkJYnJlYWs7CiAJfQogCiAJZHByaW50aygiJXM6UmV0dXJuIGxzZWcgJXAgcmVmICVkXG4iLAotCQlfX2Z1bmNfXywgcmV0LCByZXQgPyBhdG9taWNfcmVhZCgmcmV0LT5rcmVmLnJlZmNvdW50KSA6IDApOworCQlfX2Z1bmNfXywgcmV0LCByZXQgPyBhdG9taWNfcmVhZCgmcmV0LT5wbHNfcmVmY291bnQpIDogMCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTc2LDYgKzY5Niw3IEBACiAJCSAgIGVudW0gcG5mc19pb21vZGUgaW9tb2RlKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm8pOworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlubyktPm5mc19jbGllbnQ7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPSBOVUxMOwogCkBAIC01ODgsMjUgKzcwOSw1MyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsYXlvdXQgZm9yIHRoZSBnaXZlbiByYW5nZSBhbHJlYWR5IGV4aXN0cyAqLwotCWxzZWcgPSBwbmZzX2hhc19sYXlvdXQobG8sIGlvbW9kZSk7Ci0JaWYgKGxzZWcpIHsKLQkJZHByaW50aygiJXM6IFVzaW5nIGNhY2hlZCBsc2VnICVwIGZvciBpb21vZGUgJWQpXG4iLAotCQkJX19mdW5jX18sIGxzZWcsIGlvbW9kZSk7CisJLyogRG8gd2UgZXZlbiBuZWVkIHRvIGJvdGhlciB3aXRoIHRoaXM/ICovCisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwgJmNscC0+Y2xfc3RhdGUpIHx8CisJICAgIHRlc3RfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKSkgeworCQlkcHJpbnRrKCIlcyBtYXRjaGVzIHJlY2FsbCwgdXNlIE1EU1xuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCi0JLyogaWYgTEFZT1VUR0VUIGFscmVhZHkgZmFpbGVkIG9uY2Ugd2UgZG9uJ3QgdHJ5IGFnYWluICovCi0JaWYgKHRlc3RfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZuZnNpLT5sYXlvdXQtPnN0YXRlKSkKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGxheW91dCBmb3IgdGhlIGdpdmVuIHJhbmdlIGFscmVhZHkgZXhpc3RzICovCisJbHNlZyA9IHBuZnNfZmluZF9sc2VnKGxvLCBpb21vZGUpOworCWlmIChsc2VnKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlnZXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOyAvKiBNYXRjaGVkIGluIG5mczRfbGF5b3V0Z2V0X3JlbGVhc2UgKi8KKwkvKiBpZiBMQVlPVVRHRVQgYWxyZWFkeSBmYWlsZWQgb25jZSB3ZSBkb24ndCB0cnkgYWdhaW4gKi8KKwlpZiAodGVzdF9iaXQobG9fZmFpbF9iaXQoaW9tb2RlKSwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKHBuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKGxvLCBOVUxMLCAwKSkKKwkJZ290byBvdXRfdW5sb2NrOworCWF0b21pY19pbmMoJmxvLT5wbGhfb3V0c3RhbmRpbmcpOworCisJZ2V0X2xheW91dF9oZHIobG8pOworCWlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCS8qIFRoZSBsbyBtdXN0IGJlIG9uIHRoZSBjbHAgbGlzdCBpZiB0aGVyZSBpcyBhbnkKKwkJICogY2hhbmNlIG9mIGEgQ0JfTEFZT1VUUkVDQUxMKEZJTEUpIGNvbWluZyBpbi4KKwkJICovCisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZsby0+cGxoX2xheW91dHMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmbG8tPnBsaF9sYXlvdXRzLCAmY2xwLT5jbF9sYXlvdXRzKTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJfQogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiAKIAlsc2VnID0gc2VuZF9sYXlvdXRnZXQobG8sIGN0eCwgaW9tb2RlKTsKKwlpZiAoIWxzZWcpIHsKKwkJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJCQlsaXN0X2RlbF9pbml0KCZsby0+cGxoX2xheW91dHMpOworCQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCQljbGVhcl9iaXQoTkZTX0xBWU9VVF9CVUxLX1JFQ0FMTCwgJmxvLT5wbGhfZmxhZ3MpOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJfQorCWF0b21pY19kZWMoJmxvLT5wbGhfb3V0c3RhbmRpbmcpOworCXB1dF9sYXlvdXRfaGRyKGxvKTsKIG91dDoKIAlkcHJpbnRrKCIlcyBlbmQsIHN0YXRlIDB4JWx4IGxzZWcgJXBcbiIsIF9fZnVuY19fLAotCQluZnNpLT5sYXlvdXQtPnN0YXRlLCBsc2VnKTsKKwkJbmZzaS0+bGF5b3V0LT5wbGhfZmxhZ3MsIGxzZWcpOwogCXJldHVybiBsc2VnOwogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwpAQCAtNjE5LDkgKzc2OCwyMSBAQAogCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobGdwLT5hcmdzLmlub2RlKS0+bGF5b3V0OwogCXN0cnVjdCBuZnM0X2xheW91dGdldF9yZXMgKnJlcyA9ICZsZ3AtPnJlczsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKLQlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxvLT5pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxvLT5wbGhfaW5vZGU7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vKS0+bmZzX2NsaWVudDsKIAlpbnQgc3RhdHVzID0gMDsKIAorCS8qIFZlcmlmeSB3ZSBnb3Qgd2hhdCB3ZSBhc2tlZCBmb3IuCisJICogTm90ZSB0aGF0IGJlY2F1c2UgdGhlIHhkciBwYXJzaW5nIG9ubHkgYWNjZXB0cyBhIHNpbmdsZQorCSAqIGVsZW1lbnQgYXJyYXksIHRoaXMgY2FuIGZhaWwgZXZlbiBpZiB0aGUgc2VydmVyIGlzIGJlaGF2aW5nCisJICogY29ycmVjdGx5LgorCSAqLworCWlmIChsZ3AtPmFyZ3MucmFuZ2UuaW9tb2RlID4gcmVzLT5yYW5nZS5pb21vZGUgfHwKKwkgICAgcmVzLT5yYW5nZS5vZmZzZXQgIT0gMCB8fAorCSAgICByZXMtPnJhbmdlLmxlbmd0aCAhPSBORlM0X01BWF9VSU5UNjQpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQogCS8qIEluamVjdCBsYXlvdXQgYmxvYiBpbnRvIEkvTyBkZXZpY2UgZHJpdmVyICovCiAJbHNlZyA9IE5GU19TRVJWRVIoaW5vKS0+cG5mc19jdXJyX2xkLT5hbGxvY19sc2VnKGxvLCByZXMpOwogCWlmICghbHNlZyB8fCBJU19FUlIobHNlZykpIHsKQEAgLTYzNSwxNiArNzk2LDM3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwgJmNscC0+Y2xfc3RhdGUpIHx8CisJICAgIHRlc3RfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKSkgeworCQlkcHJpbnRrKCIlcyBmb3JnZXQgcmVwbHkgZHVlIHRvIHJlY2FsbFxuIiwgX19mdW5jX18pOworCQlnb3RvIG91dF9mb3JnZXRfcmVwbHk7CisJfQorCisJaWYgKHBuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKGxvLCAmcmVzLT5zdGF0ZWlkLCAxKSkgeworCQlkcHJpbnRrKCIlcyBmb3JnZXQgcmVwbHkgZHVlIHRvIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2ZvcmdldF9yZXBseTsKKwl9CiAJaW5pdF9sc2VnKGxvLCBsc2VnKTsKLQlsc2VnLT5yYW5nZSA9IHJlcy0+cmFuZ2U7CisJbHNlZy0+cGxzX3JhbmdlID0gcmVzLT5yYW5nZTsKIAkqbGdwLT5sc2VncHAgPSBsc2VnOwogCXBuZnNfaW5zZXJ0X2xheW91dChsbywgbHNlZyk7CiAKKwlpZiAocmVzLT5yZXR1cm5fb25fY2xvc2UpIHsKKwkJc2V0X2JpdChORlNfTFNFR19ST0MsICZsc2VnLT5wbHNfZmxhZ3MpOworCQlzZXRfYml0KE5GU19MQVlPVVRfUk9DLCAmbG8tPnBsaF9mbGFncyk7CisJfQorCiAJLyogRG9uZSBwcm9jZXNzaW5nIGxheW91dGdldC4gU2V0IHRoZSBsYXlvdXQgc3RhdGVpZCAqLwotCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmcmVzLT5zdGF0ZWlkKTsKKwlwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChsbywgJnJlcy0+c3RhdGVpZCwgZmFsc2UpOwogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKKworb3V0X2ZvcmdldF9yZXBseToKKwlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOworCWxzZWctPnBsc19sYXlvdXQgPSBsbzsKKwlORlNfU0VSVkVSKGlubyktPnBuZnNfY3Vycl9sZC0+ZnJlZV9sc2VnKGxzZWcpOworCWdvdG8gb3V0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnMuaCBiL2ZzL25mcy9wbmZzLmgKaW5kZXggZTEyMzY3ZC4uZTI2MTJlYSAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnMuaAorKysgYi9mcy9uZnMvcG5mcy5oCkBAIC0zMCwxMSArMzAsMTcgQEAKICNpZm5kZWYgRlNfTkZTX1BORlNfSAogI2RlZmluZSBGU19ORlNfUE5GU19ICiAKK2VudW0geworCU5GU19MU0VHX1ZBTElEID0gMCwJLyogY2xlYXJlZCB3aGVuIGxzZWcgaXMgcmVjYWxsZWQvcmV0dXJuZWQgKi8KKwlORlNfTFNFR19ST0MsCQkvKiByb2MgYml0IHJlY2VpdmVkIGZyb20gc2VydmVyICovCit9OworCiBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmaV9saXN0OwotCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSByYW5nZTsKLQlzdHJ1Y3Qga3JlZiBrcmVmOwotCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxheW91dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBsc19saXN0OworCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSBwbHNfcmFuZ2U7CisJYXRvbWljX3QgcGxzX3JlZmNvdW50OworCXVuc2lnbmVkIGxvbmcgcGxzX2ZsYWdzOworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKnBsc19sYXlvdXQ7CiB9OwogCiAjaWZkZWYgQ09ORklHX05GU19WNF8xCkBAIC00NCw3ICs1MCw5IEBACiBlbnVtIHsKIAlORlNfTEFZT1VUX1JPX0ZBSUxFRCA9IDAsCS8qIGdldCBybyBsYXlvdXQgZmFpbGVkIHN0b3AgdHJ5aW5nICovCiAJTkZTX0xBWU9VVF9SV19GQUlMRUQsCQkvKiBnZXQgcncgbGF5b3V0IGZhaWxlZCBzdG9wIHRyeWluZyAqLwotCU5GU19MQVlPVVRfU1RBVEVJRF9TRVQsCQkvKiBoYXZlIGEgdmFsaWQgbGF5b3V0IHN0YXRlaWQgKi8KKwlORlNfTEFZT1VUX0JVTEtfUkVDQUxMLAkJLyogYnVsayByZWNhbGwgYWZmZWN0aW5nIGxheW91dCAqLworCU5GU19MQVlPVVRfUk9DLAkJCS8qIHNvbWUgbHNlZyBoYWQgcm9jIGJpdCBzZXQgKi8KKwlORlNfTEFZT1VUX0RFU1RST1lFRCwJCS8qIG5vIG5ldyB1c2Ugb2YgbGF5b3V0IGFsbG93ZWQgKi8KIH07CiAKIC8qIFBlci1sYXlvdXQgZHJpdmVyIHNwZWNpZmljIHJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmUgKi8KQEAgLTYwLDEzICs2OCwxNiBAQAogfTsKIAogc3RydWN0IHBuZnNfbGF5b3V0X2hkciB7Ci0JdW5zaWduZWQgbG9uZwkJcmVmY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsYXlvdXRzOyAgIC8qIG90aGVyIGNsaWVudCBsYXlvdXRzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzZWdzOyAgICAgIC8qIGxheW91dCBzZWdtZW50cyBsaXN0ICovCi0Jc2VxbG9ja190CQlzZXFsb2NrOyAgIC8qIFByb3RlY3RzIHRoZSBzdGF0ZWlkICovCi0JbmZzNF9zdGF0ZWlkCQlzdGF0ZWlkOwotCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWF0b21pY190CQlwbGhfcmVmY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZAlwbGhfbGF5b3V0czsgICAvKiBvdGhlciBjbGllbnQgbGF5b3V0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcGxoX2J1bGtfcmVjYWxsOyAvKiBjbG50IGxpc3Qgb2YgYnVsayByZWNhbGxzICovCisJc3RydWN0IGxpc3RfaGVhZAlwbGhfc2VnczsgICAgICAvKiBsYXlvdXQgc2VnbWVudHMgbGlzdCAqLworCW5mczRfc3RhdGVpZAkJcGxoX3N0YXRlaWQ7CisJYXRvbWljX3QJCXBsaF9vdXRzdGFuZGluZzsgLyogbnVtYmVyIG9mIFJQQ3Mgb3V0ICovCisJdW5zaWduZWQgbG9uZwkJcGxoX2Jsb2NrX2xnZXRzOyAvKiBibG9jayBMQVlPVVRHRVQgaWYgPjAgKi8KKwl1MzIJCQlwbGhfYmFycmllcjsgLyogaWdub3JlIGxvd2VyIHNlcWlkcyAqLworCXVuc2lnbmVkIGxvbmcJCXBsaF9mbGFnczsKKwlzdHJ1Y3QgaW5vZGUJCSpwbGhfaW5vZGU7CiB9OwogCiBzdHJ1Y3QgcG5mc19kZXZpY2UgewpAQCAtMTM0LDE3ICsxNDUsMzAgQEAKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2xheW91dGdldChzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCk7CiAKIC8qIHBuZnMuYyAqLwordm9pZCBnZXRfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbyk7CiBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqCiBwbmZzX3VwZGF0ZV9sYXlvdXQoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsCiAJCSAgIGVudW0gcG5mc19pb21vZGUgYWNjZXNzX3R5cGUpOwogdm9pZCBzZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKiwgdTMyIGlkKTsKIHZvaWQgdW5zZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiBpbnQgcG5mc19sYXlvdXRfcHJvY2VzcyhzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCk7Cit2b2lkIHBuZnNfZnJlZV9sc2VnX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QpOwogdm9pZCBwbmZzX2Rlc3Ryb3lfbGF5b3V0KHN0cnVjdCBuZnNfaW5vZGUgKik7CiB2b2lkIHBuZnNfZGVzdHJveV9hbGxfbGF5b3V0cyhzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKLXZvaWQgcHV0X2xheW91dF9oZHIoc3RydWN0IGlub2RlICppbm9kZSk7Ci12b2lkIHBuZnNfZ2V0X2xheW91dF9zdGF0ZWlkKG5mczRfc3RhdGVpZCAqZHN0LCBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKLQkJCSAgICAgc3RydWN0IG5mczRfc3RhdGUgKm9wZW5fc3RhdGUpOwordm9pZCBwdXRfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbyk7Cit2b2lkIHBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLAorCQkJICAgICBjb25zdCBuZnM0X3N0YXRlaWQgKm5ldywKKwkJCSAgICAgYm9vbCB1cGRhdGVfYmFycmllcik7CitpbnQgcG5mc19jaG9vc2VfbGF5b3V0Z2V0X3N0YXRlaWQobmZzNF9zdGF0ZWlkICpkc3QsCisJCQkJICBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQkgIHN0cnVjdCBuZnM0X3N0YXRlICpvcGVuX3N0YXRlKTsKK2ludCBtYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QsCisJCQkJdTMyIGlvbW9kZSk7Citib29sIHBuZnNfcm9jKHN0cnVjdCBpbm9kZSAqaW5vKTsKK3ZvaWQgcG5mc19yb2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlubyk7Cit2b2lkIHBuZnNfcm9jX3NldF9iYXJyaWVyKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgYmFycmllcik7Citib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpOwogCiAKIHN0YXRpYyBpbmxpbmUgaW50IGxvX2ZhaWxfYml0KHUzMiBpb21vZGUpCkBAIC0xNzYsNiArMjAwLDI4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbAorcG5mc19yb2Moc3RydWN0IGlub2RlICppbm8pCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BuZnNfcm9jX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm8pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RydWN0IGlub2RlICppbm8sIHUzMiBiYXJyaWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3BuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpCit7CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BuZnNfbGF5b3V0ZHJpdmVyKHN0cnVjdCBuZnNfc2VydmVyICpzLCB1MzIgaWQpCiB7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwppbmRleCA1OGU3Zjg0Li43N2Q1ZTIxIDEwMDY0NAotLS0gYS9mcy9uZnMvcHJvYy5jCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCWZhdHRyID0gbmZzX2FsbG9jX2ZhdHRyKCk7CiAJc3RhdHVzID0gLUVOT01FTTsKIAlpZiAoZmggPT0gTlVMTCB8fCBmYXR0ciA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZnJlZTsKIAogCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKIAluZnNfbWFya19mb3JfcmV2YWxpZGF0ZShkaXIpOwpAQCAtNDcxLDYgKzQ3MSw3IEBACiAJaWYgKHN0YXR1cyA9PSAwKQogCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCBmaCwgZmF0dHIpOwogCitvdXRfZnJlZToKIAluZnNfZnJlZV9mYXR0cihmYXR0cik7CiAJbmZzX2ZyZWVfZmhhbmRsZShmaCk7CiBvdXQ6CkBAIC03MzEsNyArNzMyLDcgQEAKIAkuc3RhdGZzCQk9IG5mc19wcm9jX3N0YXRmcywKIAkuZnNpbmZvCQk9IG5mc19wcm9jX2ZzaW5mbywKIAkucGF0aGNvbmYJPSBuZnNfcHJvY19wYXRoY29uZiwKLQkuZGVjb2RlX2RpcmVudAk9IG5mc19kZWNvZGVfZGlyZW50LAorCS5kZWNvZGVfZGlyZW50CT0gbmZzMl9kZWNvZGVfZGlyZW50LAogCS5yZWFkX3NldHVwCT0gbmZzX3Byb2NfcmVhZF9zZXR1cCwKIAkucmVhZF9kb25lCT0gbmZzX3JlYWRfZG9uZSwKIAkud3JpdGVfc2V0dXAJPSBuZnNfcHJvY193cml0ZV9zZXR1cCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggNDEwMDYzMC4uYjY4Yzg2MCAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTU5OCw3ICs1OTgsOSBAQAogCiAJaWYgKG5mc3MtPm1vdW50ZF92ZXJzaW9uIHx8IHNob3dkZWZhdWx0cykKIAkJc2VxX3ByaW50ZihtLCAiLG1vdW50dmVycz0ldSIsIG5mc3MtPm1vdW50ZF92ZXJzaW9uKTsKLQlpZiAobmZzcy0+bW91bnRkX3BvcnQgfHwgc2hvd2RlZmF1bHRzKQorCWlmICgobmZzcy0+bW91bnRkX3BvcnQgJiYKKwkJbmZzcy0+bW91bnRkX3BvcnQgIT0gKHVuc2lnbmVkIHNob3J0KU5GU19VTlNQRUNfUE9SVCkgfHwKKwkJc2hvd2RlZmF1bHRzKQogCQlzZXFfcHJpbnRmKG0sICIsbW91bnRwb3J0PSV1IiwgbmZzcy0+bW91bnRkX3BvcnQpOwogCiAJbmZzX3Nob3dfbW91bnRkX25ldGlkKG0sIG5mc3MsIHNob3dkZWZhdWx0cyk7CkBAIC0yMjAwLDYgKzIyMDIsNyBAQAogCiAJcy0+c19mbGFncyA9IHNiX21udGRhdGEtPm1udGZsYWdzOwogCXMtPnNfZnNfaW5mbyA9IHNlcnZlcjsKKwlzLT5zX2Rfb3AgPSBzZXJ2ZXItPm5mc19jbGllbnQtPnJwY19vcHMtPmRlbnRyeV9vcHM7CiAJcmV0ID0gc2V0X2Fub25fc3VwZXIocywgc2VydmVyKTsKIAlpZiAocmV0ID09IDApCiAJCXNlcnZlci0+c19kZXYgPSBzLT5zX2RldjsKQEAgLTI0OTQsNyArMjQ5NywxMyBAQAogCXNiLT5zX21heGJ5dGVzID0gb2xkX3NiLT5zX21heGJ5dGVzOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2ItPnNfb3AgPSBvbGRfc2ItPnNfb3A7Ci0gCW5mc19pbml0aWFsaXNlX3NiKHNiKTsKKwkvKgorCSAqIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwgZG8KKwkgKiBzbyBvdXJzZWx2ZXMgd2hlbiBuZWNlc3NhcnkuCisJICovCisJc2ItPnNfZmxhZ3MgIHw9IE1TX1BPU0lYQUNMOworCXNiLT5zX3hhdHRyICA9IG9sZF9zYi0+c194YXR0cjsKKwluZnNfaW5pdGlhbGlzZV9zYihzYik7CiB9CiAKIC8qCkBAIC0yNTA0LDYgKzI1MTMsMTIgQEAKIHsKIAlzYi0+c190aW1lX2dyYW4gPSAxOwogCXNiLT5zX29wID0gJm5mczRfc29wczsKKwkvKgorCSAqIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwgZG8KKwkgKiBzbyBvdXJzZWx2ZXMgd2hlbiBuZWNlc3NhcnkuCisJICovCisJc2ItPnNfZmxhZ3MgIHw9IE1TX1BPU0lYQUNMOworCXNiLT5zX3hhdHRyID0gbmZzNF94YXR0cl9oYW5kbGVyczsKIAluZnNfaW5pdGlhbGlzZV9zYihzYik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy91bmxpbmsuYyBiL2ZzL25mcy91bmxpbmsuYwppbmRleCA4ZmU5ZWI0Li5lMzEzYTUxIDEwMDY0NAotLS0gYS9mcy9uZnMvdW5saW5rLmMKKysrIGIvZnMvbmZzL3VubGluay5jCkBAIC00MjksNyArNDI5LDcgQEAKIAlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl0YXNrX3NldHVwX2RhdGEuY2FsbGJhY2tfZGF0YSA9IGRhdGEsCisJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBkYXRhOwogCiAJZGF0YS0+Y3JlZCA9IHJwY19sb29rdXBfY3JlZCgpOwogCWlmIChJU19FUlIoZGF0YS0+Y3JlZCkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzNF9hY2wuaCBiL2ZzL25mc2QvYWNsLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oCnJlbmFtZSB0byBmcy9uZnNkL2FjbC5oCmluZGV4IGM5YzA1YTcuLjM0ZTVjNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNF9hY2wuaAorKysgYi9mcy9uZnNkL2FjbC5oCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqICBpbmNsdWRlL2xpbnV4L25mczRfYWNsLmMKLSAqCiAgKiAgQ29tbW9uIE5GU3Y0IEFDTCBoYW5kbGluZyBkZWZpbml0aW9ucy4KICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9leHBvcnQuYyBiL2ZzL25mc2QvZXhwb3J0LmMKaW5kZXggYzBmY2I3YS4uOGIzMWU1ZiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9leHBvcnQuYworKysgYi9mcy9uZnNkL2V4cG9ydC5jCkBAIC0xLDQgKzEsMyBAQAotI2RlZmluZSBNU05GUwkvKiBIQUNLIEhBQ0sgKi8KIC8qCiAgKiBORlMgZXhwb3J0aW5nIGFuZCB2YWxpZGF0aW9uLgogICoKQEAgLTE0NDQsOSArMTQ0Myw2IEBACiAJeyBORlNFWFBfTk9TVUJUUkVFQ0hFQ0ssIHsibm9fc3VidHJlZV9jaGVjayIsICIifX0sCiAJeyBORlNFWFBfTk9BVVRITkxNLCB7Imluc2VjdXJlX2xvY2tzIiwgIiJ9fSwKIAl7IE5GU0VYUF9WNFJPT1QsIHsidjRyb290IiwgIiJ9fSwKLSNpZmRlZiBNU05GUwotCXsgTkZTRVhQX01TTkZTLCB7Im1zbmZzIiwgIiJ9fSwKLSNlbmRpZgogCXsgMCwgeyIiLCAiIn19CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2RfaWRtYXAuaCBiL2ZzL25mc2QvaWRtYXAuaApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2xpbnV4L25mc2RfaWRtYXAuaApyZW5hbWUgdG8gZnMvbmZzZC9pZG1hcC5oCmluZGV4IGQ0YTJhYzEuLjJmM2JlMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZF9pZG1hcC5oCisrKyBiL2ZzL25mc2QvaWRtYXAuaApAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiAgaW5jbHVkZS9saW51eC9uZnNkX2lkbWFwLmgKLSAqCiAgKiAgTWFwcGluZyBvZiBVSUQgdG8gbmFtZSBhbmQgdmljZSB2ZXJzYS4KICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCkBAIC01Niw4ICs1NCw4IEBACiB9CiAjZW5kaWYKIAotaW50IG5mc2RfbWFwX25hbWVfdG9fdWlkKHN0cnVjdCBzdmNfcnFzdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgX191MzIgKik7Ci1pbnQgbmZzZF9tYXBfbmFtZV90b19naWQoc3RydWN0IHN2Y19ycXN0ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBfX3UzMiAqKTsKK19fYmUzMiBuZnNkX21hcF9uYW1lX3RvX3VpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIF9fdTMyICopOworX19iZTMyIG5mc2RfbWFwX25hbWVfdG9fZ2lkKHN0cnVjdCBzdmNfcnFzdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgX191MzIgKik7CiBpbnQgbmZzZF9tYXBfdWlkX3RvX25hbWUoc3RydWN0IHN2Y19ycXN0ICosIF9fdTMyLCBjaGFyICopOwogaW50IG5mc2RfbWFwX2dpZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqLCBfX3UzMiwgY2hhciAqKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzcHJvYy5jIGIvZnMvbmZzZC9uZnMzcHJvYy5jCmluZGV4IDViN2UzMDIuLjIyNDdmYzkgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzM3Byb2MuYworKysgYi9mcy9uZnNkL25mczNwcm9jLmMKQEAgLTE1MSwxMCArMTUxLDEwIEBACiAJX19iZTMyCW5mc2VycjsKIAl1MzIJbWF4X2Jsb2Nrc2l6ZSA9IHN2Y19tYXhfcGF5bG9hZChycXN0cCk7CiAKLQlkcHJpbnRrKCJuZnNkOiBSRUFEKDMpICVzICVsdSBieXRlcyBhdCAlbHVcbiIsCisJZHByaW50aygibmZzZDogUkVBRCgzKSAlcyAlbHUgYnl0ZXMgYXQgJUx1XG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAogCQkJCSh1bnNpZ25lZCBsb25nKSBhcmdwLT5jb3VudCwKLQkJCQkodW5zaWduZWQgbG9uZykgYXJncC0+b2Zmc2V0KTsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBhcmdwLT5vZmZzZXQpOwogCiAJLyogT2J0YWluIGJ1ZmZlciBwb2ludGVyIGZvciBwYXlsb2FkLgogCSAqIDEgKHN0YXR1cykgKyAyMiAocG9zdF9vcF9hdHRyKSArIDEgKGNvdW50KSArIDEgKGVvZikKQEAgLTE5MSwxMCArMTkxLDEwIEBACiAJX19iZTMyCW5mc2VycjsKIAl1bnNpZ25lZCBsb25nIGNudCA9IGFyZ3AtPmxlbjsKIAotCWRwcmludGsoIm5mc2Q6IFdSSVRFKDMpICAgICVzICVkIGJ5dGVzIGF0ICVsZCVzXG4iLAorCWRwcmludGsoIm5mc2Q6IFdSSVRFKDMpICAgICVzICVkIGJ5dGVzIGF0ICVMdSVzXG4iLAogCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAogCQkJCWFyZ3AtPmxlbiwKLQkJCQkodW5zaWduZWQgbG9uZykgYXJncC0+b2Zmc2V0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGFyZ3AtPm9mZnNldCwKIAkJCQlhcmdwLT5zdGFibGU/ICIgc3RhYmxlIiA6ICIiKTsKIAogCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCBlNDgwNTI2Li5hZDg4ZjFjIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CisjaW5jbHVkZSAiYWNsLmgiCiAKIAogLyogbW9kZSBiaXQgdHJhbnNsYXRpb25zOiAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKaW5kZXggMTQzZGEyZS4uM2JlOTc1ZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYworKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC01MCwxMSArNTAsNiBAQAogCU5GU1BST0M0X0NMTlRfQ0JfU0VRVUVOQ0UsCiB9OwogCi1lbnVtIG5mc19jYl9vcG51bTQgewotCU9QX0NCX1JFQ0FMTCAgICAgICAgICAgID0gNCwKLQlPUF9DQl9TRVFVRU5DRSAgICAgICAgICA9IDExLAotfTsKLQogI2RlZmluZSBORlM0X01BWFRBR0xFTgkJMjAKIAogI2RlZmluZSBORlM0X2VuY19jYl9udWxsX3N6CQkwCkBAIC03OSw2MSArNzQsNiBAQAogCQkJCQljYl9zZXF1ZW5jZV9kZWNfc3ogKyAgICAgICAgICAgIFwKIAkJCQkJb3BfZGVjX3N6KQogCi0vKgotKiBHZW5lcmljIGVuY29kZSByb3V0aW5lcyBmcm9tIGZzL25mcy9uZnM0eGRyLmMKLSovCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfd3JpdGVtZW0oX19iZTMyICpwLCBjb25zdCB2b2lkICpwdHIsIGludCBuYnl0ZXMpCi17Ci0JaW50IHRtcCA9IFhEUl9RVUFETEVOKG5ieXRlcyk7Ci0JaWYgKCF0bXApCi0JCXJldHVybiBwOwotCXBbdG1wLTFdID0gMDsKLQltZW1jcHkocCwgcHRyLCBuYnl0ZXMpOwotCXJldHVybiBwICsgdG1wOwotfQotCi0jZGVmaW5lIFdSSVRFMzIobikgICAgICAgICAgICAgICAqcCsrID0gaHRvbmwobikKLSNkZWZpbmUgV1JJVEVNRU0ocHRyLG5ieXRlcykgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcCA9IHhkcl93cml0ZW1lbShwLCBwdHIsIG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotI2RlZmluZSBSRVNFUlZFX1NQQUNFKG5ieXRlcykgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoIXApIGRwcmludGsoIk5GU0Q6IFJFU0VSVkVfU1BBQ0UoJWQpIGZhaWxlZCBpbiBmdW5jdGlvbiAlc1xuIiwgKGludCkgKG5ieXRlcyksIF9fZnVuY19fKTsgXAotCUJVR19PTighcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotLyoKLSAqIEdlbmVyaWMgZGVjb2RlIHJvdXRpbmVzIGZyb20gZnMvbmZzL25mczR4ZHIuYwotICovCi0jZGVmaW5lIERFQ09ERV9UQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLW91dDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlyZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteGRyX2Vycm9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWRwcmludGsoIk5GU0Q6IHhkciBlcnJvciEgKCVzOiVkKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAotCXN0YXR1cyA9IC1FSU87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZ290byBvdXQKLQotI2RlZmluZSBSRUFEMzIoeCkgICAgICAgICAoeCkgPSBudG9obCgqcCsrKQotI2RlZmluZSBSRUFENjQoeCkgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgXAotCSh4KSA9ICh1NjQpbnRvaGwoKnArKykgPDwgMzI7ICAgICAgICAgICBcCi0JKHgpIHw9IG50b2hsKCpwKyspOyAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFJFQURUSU1FKHgpICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICBcCi0JcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoeC50dl9zZWMpID0gbnRvaGwoKnArKyk7ICAgICAgICAgICAgICAgXAotCSh4LnR2X25zZWMpID0gbnRvaGwoKnArKyk7ICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotI2RlZmluZSBSRUFEX0JVRihuYnl0ZXMpICBkbyB7IFwKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBuYnl0ZXMpOyBcCi0JaWYgKCFwKSB7IFwKLQkJZHByaW50aygiTkZTRDogJXM6IHJlcGx5IGJ1ZmZlciBvdmVyZmxvd2VkIGluIGxpbmUgJWQuXG4iLCBcCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOyBcCi0JCXJldHVybiAtRUlPOyBcCi0JfSBcCi19IHdoaWxlICgwKQotCiBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgewogCS8qIGFyZ3MgKi8KIAl1MzIJCWlkZW50OwkvKiBtaW5vcnZlcnNpb24gMCBvbmx5ICovCkBAIC0xNDQsMjk1ICs4NCw1MTMgQEAKIAlpbnQJCXN0YXR1czsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgewotaW50IHN0YXQ7Ci1pbnQgZXJybm87Ci19IG5mc19jYl9lcnJ0YmxbXSA9IHsKLQl7IE5GUzRfT0ssCQkwICAgICAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfUEVSTSwJCUVQRVJNICAgICAgICAgICB9LAotCXsgTkZTNEVSUl9OT0VOVCwJRU5PRU5UICAgICAgICAgIH0sCi0JeyBORlM0RVJSX0lPLAkJRUlPICAgICAgICAgICAgIH0sCi0JeyBORlM0RVJSX05YSU8sCQlFTlhJTyAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfQUNDRVNTLAlFQUNDRVMgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfRVhJU1QsCUVFWElTVCAgICAgICAgICB9LAotCXsgTkZTNEVSUl9YREVWLAkJRVhERVYgICAgICAgICAgIH0sCi0JeyBORlM0RVJSX05PVERJUiwJRU5PVERJUiAgICAgICAgIH0sCi0JeyBORlM0RVJSX0lTRElSLAlFSVNESVIgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfSU5WQUwsCUVJTlZBTCAgICAgICAgICB9LAotCXsgTkZTNEVSUl9GQklHLAkJRUZCSUcgICAgICAgICAgIH0sCi0JeyBORlM0RVJSX05PU1BDLAlFTk9TUEMgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfUk9GUywJCUVST0ZTICAgICAgICAgICB9LAotCXsgTkZTNEVSUl9NTElOSywJRU1MSU5LICAgICAgICAgIH0sCi0JeyBORlM0RVJSX05BTUVUT09MT05HLAlFTkFNRVRPT0xPTkcgICAgfSwKLQl7IE5GUzRFUlJfTk9URU1QVFksCUVOT1RFTVBUWSAgICAgICB9LAotCXsgTkZTNEVSUl9EUVVPVCwJRURRVU9UICAgICAgICAgIH0sCi0JeyBORlM0RVJSX1NUQUxFLAlFU1RBTEUgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfQkFESEFORExFLAlFQkFESEFORExFICAgICAgfSwKLQl7IE5GUzRFUlJfQkFEX0NPT0tJRSwJRUJBRENPT0tJRSAgICAgIH0sCi0JeyBORlM0RVJSX05PVFNVUFAsCUVOT1RTVVBQICAgICAgICB9LAotCXsgTkZTNEVSUl9UT09TTUFMTCwJRVRPT1NNQUxMICAgICAgIH0sCi0JeyBORlM0RVJSX1NFUlZFUkZBVUxULAlFU0VSVkVSRkFVTFQgICAgfSwKLQl7IE5GUzRFUlJfQkFEVFlQRSwJRUJBRFRZUEUgICAgICAgIH0sCi0JeyBORlM0RVJSX0xPQ0tFRCwJRUFHQUlOICAgICAgICAgIH0sCi0JeyBORlM0RVJSX1JFU09VUkNFLAlFUkVNT1RFSU8gICAgICAgfSwKLQl7IE5GUzRFUlJfU1lNTElOSywJRUxPT1AgICAgICAgICAgIH0sCi0JeyBORlM0RVJSX09QX0lMTEVHQUwsCUVPUE5PVFNVUFAgICAgICB9LAotCXsgTkZTNEVSUl9ERUFETE9DSywJRURFQURMSyAgICAgICAgIH0sCi0JeyAtMSwgICAgICAgICAgICAgICAgICAgRUlPICAgICAgICAgICAgIH0KLX07Ci0KLXN0YXRpYyBpbnQKLW5mc19jYl9zdGF0X3RvX2Vycm5vKGludCBzdGF0KQorLyoKKyAqIEhhbmRsZSBkZWNvZGUgYnVmZmVyIG92ZXJmbG93cyBvdXQtb2YtbGluZS4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfb3ZlcmZsb3dfbXNnKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgbmZzX2NiX2VycnRibFtpXS5zdGF0ICE9IC0xOyBpKyspIHsKLQkJaWYgKG5mc19jYl9lcnJ0YmxbaV0uc3RhdCA9PSBzdGF0KQotCQkJcmV0dXJuIG5mc19jYl9lcnJ0YmxbaV0uZXJybm87Ci0JfQotCS8qIElmIHdlIGNhbm5vdCB0cmFuc2xhdGUgdGhlIGVycm9yLCB0aGUgcmVjb3Zlcnkgcm91dGluZXMgc2hvdWxkCi0JKiBoYW5kbGUgaXQuCi0JKiBOb3RlOiByZW1haW5pbmcgTkZTdjQgZXJyb3IgY29kZXMgaGF2ZSB2YWx1ZXMgPiAxMDAwMCwgc28gc2hvdWxkCi0JKiBub3QgY29uZmxpY3Qgd2l0aCBuYXRpdmUgTGludXggZXJyb3IgY29kZXMuCi0JKi8KLQlyZXR1cm4gc3RhdDsKKwlkcHJpbnRrKCJORlM6ICVzIHByZW1hdHVyZWx5IGhpdCB0aGUgZW5kIG9mIG91ciByZWNlaXZlIGJ1ZmZlci4gIgorCQkiUmVtYWluaW5nIGJ1ZmZlciBsZW5ndGggaXMgJXR1IHdvcmRzLlxuIiwKKwkJZnVuYywgeGRyLT5lbmQgLSB4ZHItPnApOworfQorCitzdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX2VtcHR5X2FycmF5KF9fYmUzMiAqcCkKK3sKKwkqcCsrID0geGRyX3plcm87CisJcmV0dXJuIHA7CiB9CiAKIC8qCi0gKiBYRFIgZW5jb2RlCisgKiBFbmNvZGUvZGVjb2RlIE5GU3Y0IENCIGJhc2ljIGRhdGEgdHlwZXMKKyAqCisgKiBCYXNpYyBORlN2NCBjYWxsYmFjayBkYXRhIHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMTUgb2YgUkZDCisgKiAzNTMwOiAiTmV0d29yayBGaWxlIFN5c3RlbSAoTkZTKSB2ZXJzaW9uIDQgUHJvdG9jb2wiIGFuZCBzZWN0aW9uCisgKiAyMCBvZiBSRkMgNTY2MTogIk5ldHdvcmsgRmlsZSBTeXN0ZW0gKE5GUykgVmVyc2lvbiA0IE1pbm9yIFZlcnNpb24KKyAqIDEgUHJvdG9jb2wiCiAgKi8KIAotc3RhdGljIHZvaWQKLWVuY29kZV9zdGF0ZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0YXRlaWRfdCAqc2lkKQorLyoKKyAqCW5mc19jYl9vcG51bTQKKyAqCisgKgllbnVtIG5mc19jYl9vcG51bTQgeworICoJCU9QX0NCX0dFVEFUVFIJCT0gMywKKyAqCQkgIC4uLgorICoJfTsKKyAqLworZW51bSBuZnNfY2Jfb3BudW00IHsKKwlPUF9DQl9HRVRBVFRSCQkJPSAzLAorCU9QX0NCX1JFQ0FMTAkJCT0gNCwKKwlPUF9DQl9MQVlPVVRSRUNBTEwJCT0gNSwKKwlPUF9DQl9OT1RJRlkJCQk9IDYsCisJT1BfQ0JfUFVTSF9ERUxFRwkJPSA3LAorCU9QX0NCX1JFQ0FMTF9BTlkJCT0gOCwKKwlPUF9DQl9SRUNBTExBQkxFX09CSl9BVkFJTAk9IDksCisJT1BfQ0JfUkVDQUxMX1NMT1QJCT0gMTAsCisJT1BfQ0JfU0VRVUVOQ0UJCQk9IDExLAorCU9QX0NCX1dBTlRTX0NBTkNFTExFRAkJPSAxMiwKKwlPUF9DQl9OT1RJRllfTE9DSwkJPSAxMywKKwlPUF9DQl9OT1RJRllfREVWSUNFSUQJCT0gMTQsCisJT1BfQ0JfSUxMRUdBTAkJCT0gMTAwNDQKK307CisKK3N0YXRpYyB2b2lkIGVuY29kZV9uZnNfY2Jfb3BudW00KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX2NiX29wbnVtNCBvcCkKIHsKIAlfX2JlMzIgKnA7CiAKLQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKLQlXUklURTMyKHNpZC0+c2lfZ2VuZXJhdGlvbik7Ci0JV1JJVEVNRU0oJnNpZC0+c2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIob3ApOwogfQogCi1zdGF0aWMgdm9pZAotZW5jb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKKy8qCisgKiBuZnNfZmg0CisgKgorICoJdHlwZWRlZiBvcGFxdWUgbmZzX2ZoNDxORlM0X0ZIU0laRT47CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9uZnNfZmg0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBrbmZzZF9maCAqZmgpCit7CisJdTMyIGxlbmd0aCA9IGZoLT5maF9zaXplOworCV9fYmUzMiAqcDsKKworCUJVR19PTihsZW5ndGggPiBORlM0X0ZIU0laRSk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbmd0aCk7CisJeGRyX2VuY29kZV9vcGFxdWUocCwgJmZoLT5maF9iYXNlLCBsZW5ndGgpOworfQorCisvKgorICogc3RhdGVpZDQKKyAqCisgKglzdHJ1Y3Qgc3RhdGVpZDQgeworICoJCXVpbnQzMl90CXNlcWlkOworICoJCW9wYXF1ZQkJb3RoZXJbMTJdOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3N0YXRlaWQ0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0YXRlaWRfdCAqc2lkKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIE5GUzRfU1RBVEVJRF9TSVpFKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoc2lkLT5zaV9nZW5lcmF0aW9uKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCAmc2lkLT5zaV9vcGFxdWUsIE5GUzRfU1RBVEVJRF9PVEhFUl9TSVpFKTsKK30KKworLyoKKyAqIHNlc3Npb25pZDQKKyAqCisgKgl0eXBlZGVmIG9wYXF1ZSBzZXNzaW9uaWQ0W05GUzRfU0VTU0lPTklEX1NJWkVdOworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfc2Vzc2lvbmlkNChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnNlc3Npb24pCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7CisJeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgc2Vzc2lvbi0+c2Vfc2Vzc2lvbmlkLmRhdGEsCisJCQkJCU5GUzRfTUFYX1NFU1NJT05JRF9MRU4pOworfQorCisvKgorICogbmZzc3RhdDQKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHN0YXQ7CisJaW50IGVycm5vOworfSBuZnNfY2JfZXJydGJsW10gPSB7CisJeyBORlM0X09LLAkJMAkJfSwKKwl7IE5GUzRFUlJfUEVSTSwJCS1FUEVSTQkJfSwKKwl7IE5GUzRFUlJfTk9FTlQsCS1FTk9FTlQJCX0sCisJeyBORlM0RVJSX0lPLAkJLUVJTwkJfSwKKwl7IE5GUzRFUlJfTlhJTywJCS1FTlhJTwkJfSwKKwl7IE5GUzRFUlJfQUNDRVNTLAktRUFDQ0VTCQl9LAorCXsgTkZTNEVSUl9FWElTVCwJLUVFWElTVAkJfSwKKwl7IE5GUzRFUlJfWERFViwJCS1FWERFVgkJfSwKKwl7IE5GUzRFUlJfTk9URElSLAktRU5PVERJUgl9LAorCXsgTkZTNEVSUl9JU0RJUiwJLUVJU0RJUgkJfSwKKwl7IE5GUzRFUlJfSU5WQUwsCS1FSU5WQUwJCX0sCisJeyBORlM0RVJSX0ZCSUcsCQktRUZCSUcJCX0sCisJeyBORlM0RVJSX05PU1BDLAktRU5PU1BDCQl9LAorCXsgTkZTNEVSUl9ST0ZTLAkJLUVST0ZTCQl9LAorCXsgTkZTNEVSUl9NTElOSywJLUVNTElOSwkJfSwKKwl7IE5GUzRFUlJfTkFNRVRPT0xPTkcsCS1FTkFNRVRPT0xPTkcJfSwKKwl7IE5GUzRFUlJfTk9URU1QVFksCS1FTk9URU1QVFkJfSwKKwl7IE5GUzRFUlJfRFFVT1QsCS1FRFFVT1QJCX0sCisJeyBORlM0RVJSX1NUQUxFLAktRVNUQUxFCQl9LAorCXsgTkZTNEVSUl9CQURIQU5ETEUsCS1FQkFESEFORExFCX0sCisJeyBORlM0RVJSX0JBRF9DT09LSUUsCS1FQkFEQ09PS0lFCX0sCisJeyBORlM0RVJSX05PVFNVUFAsCS1FTk9UU1VQUAl9LAorCXsgTkZTNEVSUl9UT09TTUFMTCwJLUVUT09TTUFMTAl9LAorCXsgTkZTNEVSUl9TRVJWRVJGQVVMVCwJLUVTRVJWRVJGQVVMVAl9LAorCXsgTkZTNEVSUl9CQURUWVBFLAktRUJBRFRZUEUJfSwKKwl7IE5GUzRFUlJfTE9DS0VELAktRUFHQUlOCQl9LAorCXsgTkZTNEVSUl9SRVNPVVJDRSwJLUVSRU1PVEVJTwl9LAorCXsgTkZTNEVSUl9TWU1MSU5LLAktRUxPT1AJCX0sCisJeyBORlM0RVJSX09QX0lMTEVHQUwsCS1FT1BOT1RTVVBQCX0sCisJeyBORlM0RVJSX0RFQURMT0NLLAktRURFQURMSwl9LAorCXsgLTEsCQkJLUVJTwkJfQorfTsKKworLyoKKyAqIElmIHdlIGNhbm5vdCB0cmFuc2xhdGUgdGhlIGVycm9yLCB0aGUgcmVjb3Zlcnkgcm91dGluZXMgc2hvdWxkCisgKiBoYW5kbGUgaXQuCisgKgorICogTm90ZTogcmVtYWluaW5nIE5GU3Y0IGVycm9yIGNvZGVzIGhhdmUgdmFsdWVzID4gMTAwMDAsIHNvIHNob3VsZAorICogbm90IGNvbmZsaWN0IHdpdGggbmF0aXZlIExpbnV4IGVycm9yIGNvZGVzLgorICovCitzdGF0aWMgaW50IG5mc19jYl9zdGF0X3RvX2Vycm5vKGludCBzdGF0dXMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBuZnNfY2JfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgeworCQlpZiAobmZzX2NiX2VycnRibFtpXS5zdGF0ID09IHN0YXR1cykKKwkJCXJldHVybiBuZnNfY2JfZXJydGJsW2ldLmVycm5vOworCX0KKworCWRwcmludGsoIk5GU0Q6IFVucmVjb2duaXplZCBORlMgQ0Igc3RhdHVzIHZhbHVlOiAldVxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gLXN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfY2Jfb3Bfc3RhdHVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX29wbnVtNCBleHBlY3RlZCwKKwkJCSAgICAgICBlbnVtIG5mc3N0YXQ0ICpzdGF0dXMpCit7CisJX19iZTMyICpwOworCXUzMiBvcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJb3AgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAodW5saWtlbHkob3AgIT0gZXhwZWN0ZWQpKQorCQlnb3RvIG91dF91bmV4cGVjdGVkOworCSpzdGF0dXMgPSBiZTMyX3RvX2NwdXAocCk7CisJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworb3V0X3VuZXhwZWN0ZWQ6CisJZHByaW50aygiTkZTRDogQ2FsbGJhY2sgc2VydmVyIHJldHVybmVkIG9wZXJhdGlvbiAlZCBidXQgIgorCQkid2UgaXNzdWVkIGEgcmVxdWVzdCBmb3IgJWRcbiIsIG9wLCBleHBlY3RlZCk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBDQl9DT01QT1VORDRhcmdzCisgKgorICoJc3RydWN0IENCX0NPTVBPVU5ENGFyZ3MgeworICoJCXV0ZjhzdHJfY3MJdGFnOworICoJCXVpbnQzMl90CW1pbm9ydmVyc2lvbjsKKyAqCQl1aW50MzJfdAljYWxsYmFja19pZGVudDsKKyAqCQluZnNfY2JfYXJnb3A0CWFyZ2FycmF5PD47CisgKgl9OworKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jYl9jb21wb3VuZDRhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqIHA7CiAKLQlSRVNFUlZFX1NQQUNFKDE2KTsKLQlXUklURTMyKDApOyAgICAgICAgICAgIC8qIHRhZyBsZW5ndGggaXMgYWx3YXlzIDAgKi8KLQlXUklURTMyKGhkci0+bWlub3J2ZXJzaW9uKTsKLQlXUklURTMyKGhkci0+aWRlbnQpOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA0ICsgNCArIDQpOworCXAgPSB4ZHJfZW5jb2RlX2VtcHR5X2FycmF5KHApOwkJLyogZW1wdHkgdGFnICovCisJKnArKyA9IGNwdV90b19iZTMyKGhkci0+bWlub3J2ZXJzaW9uKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoaGRyLT5pZGVudCk7CisKIAloZHItPm5vcHNfcCA9IHA7Ci0JV1JJVEUzMihoZHItPm5vcHMpOworCSpwID0gY3B1X3RvX2JlMzIoaGRyLT5ub3BzKTsJCS8qIGFyZ2FycmF5IGVsZW1lbnQgY291bnQgKi8KIH0KIAorLyoKKyAqIFVwZGF0ZSBhcmdhcnJheSBlbGVtZW50IGNvdW50CisgKi8KIHN0YXRpYyB2b2lkIGVuY29kZV9jYl9ub3BzKHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQogewotCSpoZHItPm5vcHNfcCA9IGh0b25sKGhkci0+bm9wcyk7CisJQlVHX09OKGhkci0+bm9wcyA+IE5GUzRfTUFYX0JBQ0tfQ0hBTk5FTF9PUFMpOworCSpoZHItPm5vcHNfcCA9IGNwdV90b19iZTMyKGhkci0+bm9wcyk7CiB9CiAKLXN0YXRpYyB2b2lkCi1lbmNvZGVfY2JfcmVjYWxsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLAotCQlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKKy8qCisgKiBDQl9DT01QT1VORDRyZXMKKyAqCisgKglzdHJ1Y3QgQ0JfQ09NUE9VTkQ0cmVzIHsKKyAqCQluZnNzdGF0NAlzdGF0dXM7CisgKgkJdXRmOHN0cl9jcwl0YWc7CisgKgkJbmZzX2NiX3Jlc29wNAlyZXNhcnJheTw+OworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfY2JfY29tcG91bmQ0cmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKK3sKKwl1MzIgbGVuZ3RoOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJaGRyLT5zdGF0dXMgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkvKiBJZ25vcmUgdGhlIHRhZyAqLworCWxlbmd0aCA9IGJlMzJfdG9fY3B1cChwKyspOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGxlbmd0aCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwloZHItPm5vcHMgPSBiZTMyX3RvX2NwdXAocCk7CisJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogQ0JfUkVDQUxMNGFyZ3MKKyAqCisgKglzdHJ1Y3QgQ0JfUkVDQUxMNGFyZ3MgeworICoJCXN0YXRlaWQ0CXN0YXRlaWQ7CisgKgkJYm9vbAkJdHJ1bmNhdGU7CisgKgkJbmZzX2ZoNAkJZmg7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY2JfcmVjYWxsNGFyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLAorCQkJCSAgc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICpwOwotCWludCBsZW4gPSBkcC0+ZGxfZmguZmhfc2l6ZTsKIAotCVJFU0VSVkVfU1BBQ0UoNCk7Ci0JV1JJVEUzMihPUF9DQl9SRUNBTEwpOwotCWVuY29kZV9zdGF0ZWlkKHhkciwgJmRwLT5kbF9zdGF0ZWlkKTsKLQlSRVNFUlZFX1NQQUNFKDggKyAoWERSX1FVQURMRU4obGVuKSA8PCAyKSk7Ci0JV1JJVEUzMigwKTsgLyogdHJ1bmNhdGUgb3B0aW1pemF0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwotCVdSSVRFMzIobGVuKTsKLQlXUklURU1FTSgmZHAtPmRsX2ZoLmZoX2Jhc2UsIGxlbik7CisJZW5jb2RlX25mc19jYl9vcG51bTQoeGRyLCBPUF9DQl9SRUNBTEwpOworCWVuY29kZV9zdGF0ZWlkNCh4ZHIsICZkcC0+ZGxfc3RhdGVpZCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCsrID0geGRyX3plcm87CQkJLyogdHJ1bmNhdGUgKi8KKworCWVuY29kZV9uZnNfZmg0KHhkciwgJmRwLT5kbF9maCk7CisKIAloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIHZvaWQKLWVuY29kZV9jYl9zZXF1ZW5jZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiLAotCQkgICBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKKy8qCisgKiBDQl9TRVFVRU5DRTRhcmdzCisgKgorICoJc3RydWN0IENCX1NFUVVFTkNFNGFyZ3MgeworICoJCXNlc3Npb25pZDQJCWNzYV9zZXNzaW9uaWQ7CisgKgkJc2VxdWVuY2VpZDQJCWNzYV9zZXF1ZW5jZWlkOworICoJCXNsb3RpZDQJCQljc2Ffc2xvdGlkOworICoJCXNsb3RpZDQJCQljc2FfaGlnaGVzdF9zbG90aWQ7CisgKgkJYm9vbAkJCWNzYV9jYWNoZXRoaXM7CisgKgkJcmVmZXJyaW5nX2NhbGxfbGlzdDQJY3NhX3JlZmVycmluZ19jYWxsX2xpc3RzPD47CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY2Jfc2VxdWVuY2U0YXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiLAorCQkJCSAgICBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKIHsKKwlzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNiLT5jYl9jbHAtPmNsX2NiX3Nlc3Npb247CiAJX19iZTMyICpwOwotCXN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMgPSBjYi0+Y2JfY2xwLT5jbF9jYl9zZXNzaW9uOwogCiAJaWYgKGhkci0+bWlub3J2ZXJzaW9uID09IDApCiAJCXJldHVybjsKIAotCVJFU0VSVkVfU1BBQ0UoMSArIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4gKyAyMCk7CisJZW5jb2RlX25mc19jYl9vcG51bTQoeGRyLCBPUF9DQl9TRVFVRU5DRSk7CisJZW5jb2RlX3Nlc3Npb25pZDQoeGRyLCBzZXNzaW9uKTsKIAotCVdSSVRFMzIoT1BfQ0JfU0VRVUVOQ0UpOwotCVdSSVRFTUVNKHNlcy0+c2Vfc2Vzc2lvbmlkLmRhdGEsIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pOwotCVdSSVRFMzIoc2VzLT5zZV9jYl9zZXFfbnIpOwotCVdSSVRFMzIoMCk7CQkvKiBzbG90aWQsIGFsd2F5cyAwICovCi0JV1JJVEUzMigwKTsJCS8qIGhpZ2hlc3Qgc2xvdGlkIGFsd2F5cyAwICovCi0JV1JJVEUzMigwKTsJCS8qIGNhY2hldGhpcyBhbHdheXMgMCAqLwotCVdSSVRFMzIoMCk7IC8qIEZJWE1FOiBzdXBwb3J0IHJlZmVycmluZ19jYWxsX2xpc3RzICovCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0ICsgNCArIDQpOworCSpwKysgPSBjcHVfdG9fYmUzMihzZXNzaW9uLT5zZV9jYl9zZXFfbnIpOwkvKiBjc2Ffc2VxdWVuY2VpZCAqLworCSpwKysgPSB4ZHJfemVybzsJCQkvKiBjc2Ffc2xvdGlkICovCisJKnArKyA9IHhkcl96ZXJvOwkJCS8qIGNzYV9oaWdoZXN0X3Nsb3RpZCAqLworCSpwKysgPSB4ZHJfemVybzsJCQkvKiBjc2FfY2FjaGV0aGlzICovCisJeGRyX2VuY29kZV9lbXB0eV9hcnJheShwKTsJCS8qIGNzYV9yZWZlcnJpbmdfY2FsbF9saXN0cyAqLworCiAJaGRyLT5ub3BzKys7CiB9CiAKLXN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnApCi17Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRycywgKnhkciA9ICZ4ZHJzOwotCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHJzLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLSAgICAgICAgUkVTRVJWRV9TUEFDRSgwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmZzNF94ZHJfZW5jX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQlzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQotewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLQlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICphcmdzID0gY2ItPmNiX29wOwotCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHIgPSB7Ci0JCS5pZGVudCA9IGNiLT5jYl9jbHAtPmNsX2NiX2lkZW50LAotCQkubWlub3J2ZXJzaW9uID0gY2ItPmNiX21pbm9ydmVyc2lvbiwKLQl9OwotCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jYl9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2NiX3NlcXVlbmNlKCZ4ZHIsIGNiLCAmaGRyKTsKLQllbmNvZGVfY2JfcmVjYWxsKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9jYl9ub3BzKCZoZHIpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWRlY29kZV9jYl9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpewotICAgICAgICBfX2JlMzIgKnA7Ci0JdTMyIHRhZ2xlbjsKLQotICAgICAgICBSRUFEX0JVRig4KTsKLSAgICAgICAgUkVBRDMyKGhkci0+c3RhdHVzKTsKLQkvKiBXZSd2ZSBnb3Qgbm8gdXNlIGZvciB0aGUgdGFnOyBpZ25vcmUgaXQ6ICovCi0gICAgICAgIFJFQUQzMih0YWdsZW4pOwotICAgICAgICBSRUFEX0JVRih0YWdsZW4gKyA0KTsKLSAgICAgICAgcCArPSBYRFJfUVVBRExFTih0YWdsZW4pOwotICAgICAgICBSRUFEMzIoaGRyLT5ub3BzKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlY29kZV9jYl9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfb3BudW00IGV4cGVjdGVkKQotewotCV9fYmUzMiAqcDsKLQl1MzIgb3A7Ci0JaW50MzJfdCBuZnNlcnI7Ci0KLQlSRUFEX0JVRig4KTsKLQlSRUFEMzIob3ApOwotCWlmIChvcCAhPSBleHBlY3RlZCkgewotCQlkcHJpbnRrKCJORlNEOiBkZWNvZGVfY2Jfb3BfaGRyOiBDYWxsYmFjayBzZXJ2ZXIgcmV0dXJuZWQgIgotCQkgICAgICAgICAiIG9wZXJhdGlvbiAlZCBidXQgd2UgaXNzdWVkIGEgcmVxdWVzdCBmb3IgJWRcbiIsCi0JCSAgICAgICAgIG9wLCBleHBlY3RlZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlSRUFEMzIobmZzZXJyKTsKLQlpZiAobmZzZXJyICE9IE5GU19PSykKLQkJcmV0dXJuIC1uZnNfY2Jfc3RhdF90b19lcnJubyhuZnNlcnIpOwotCXJldHVybiAwOwotfQotCiAvKgorICogQ0JfU0VRVUVOQ0U0cmVzb2sKKyAqCisgKglzdHJ1Y3QgQ0JfU0VRVUVOQ0U0cmVzb2sgeworICoJCXNlc3Npb25pZDQJY3NyX3Nlc3Npb25pZDsKKyAqCQlzZXF1ZW5jZWlkNAljc3Jfc2VxdWVuY2VpZDsKKyAqCQlzbG90aWQ0CQljc3Jfc2xvdGlkOworICoJCXNsb3RpZDQJCWNzcl9oaWdoZXN0X3Nsb3RpZDsKKyAqCQlzbG90aWQ0CQljc3JfdGFyZ2V0X2hpZ2hlc3Rfc2xvdGlkOworICoJfTsKKyAqCisgKgl1bmlvbiBDQl9TRVFVRU5DRTRyZXMgc3dpdGNoIChuZnNzdGF0NCBjc3Jfc3RhdHVzKSB7CisgKgljYXNlIE5GUzRfT0s6CisgKgkJQ0JfU0VRVUVOQ0U0cmVzb2sJY3NyX3Jlc29rNDsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgogICogT3VyIGN1cnJlbnQgYmFjayBjaGFubmVsIGltcGxtZW50YXRpb24gc3VwcG9ydHMgYSBzaW5nbGUgYmFja2NoYW5uZWwKICAqIHdpdGggYSBzaW5nbGUgc2xvdC4KICAqLwotc3RhdGljIGludAotZGVjb2RlX2NiX3NlcXVlbmNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IsCi0JCSAgIHN0cnVjdCBycGNfcnFzdCAqcnFzdHApCitzdGF0aWMgaW50IGRlY29kZV9jYl9zZXF1ZW5jZTRyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQogewotCXN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMgPSBjYi0+Y2JfY2xwLT5jbF9jYl9zZXNzaW9uOworCXN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXNzaW9uID0gY2ItPmNiX2NscC0+Y2xfY2Jfc2Vzc2lvbjsKIAlzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgaWQ7CiAJaW50IHN0YXR1czsKLQl1MzIgZHVtbXk7CiAJX19iZTMyICpwOworCXUzMiBkdW1teTsKIAotCWlmIChjYi0+Y2JfbWlub3J2ZXJzaW9uID09IDApCi0JCXJldHVybiAwOwotCi0Jc3RhdHVzID0gZGVjb2RlX2NiX29wX2hkcih4ZHIsIE9QX0NCX1NFUVVFTkNFKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IC1FU0VSVkVSRkFVTFQ7CiAKIAkvKgogCSAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzIGZvciBzZXNzaW9uSUQsIHNsb3RJRCBvcgogCSAqIHNlcXVlbmNlIG51bWJlciwgdGhlIHNlcnZlciBpcyBsb29uZXkgdHVuZXMuCiAJICovCi0Jc3RhdHVzID0gLUVTRVJWRVJGQVVMVDsKLQotCVJFQURfQlVGKE5GUzRfTUFYX1NFU1NJT05JRF9MRU4gKyAxNik7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTiArIDQgKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CiAJbWVtY3B5KGlkLmRhdGEsIHAsIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pOworCWlmIChtZW1jbXAoaWQuZGF0YSwgc2Vzc2lvbi0+c2Vfc2Vzc2lvbmlkLmRhdGEsCisJCQkJCU5GUzRfTUFYX1NFU1NJT05JRF9MRU4pICE9IDApIHsKKwkJZHByaW50aygiTkZTOiAlcyBJbnZhbGlkIHNlc3Npb24gaWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQogCXAgKz0gWERSX1FVQURMRU4oTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7Ci0JaWYgKG1lbWNtcChpZC5kYXRhLCBzZXMtPnNlX3Nlc3Npb25pZC5kYXRhLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKSkgewotCQlkcHJpbnRrKCIlcyBJbnZhbGlkIHNlc3Npb24gaWRcbiIsIF9fZnVuY19fKTsKKworCWR1bW15ID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKGR1bW15ICE9IHNlc3Npb24tPnNlX2NiX3NlcV9ucikgeworCQlkcHJpbnRrKCJORlM6ICVzIEludmFsaWQgc2VxdWVuY2UgbnVtYmVyXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwogCX0KLQlSRUFEMzIoZHVtbXkpOwotCWlmIChkdW1teSAhPSBzZXMtPnNlX2NiX3NlcV9ucikgewotCQlkcHJpbnRrKCIlcyBJbnZhbGlkIHNlcXVlbmNlIG51bWJlclxuIiwgX19mdW5jX18pOwotCQlnb3RvIG91dDsKLQl9Ci0JUkVBRDMyKGR1bW15KTsgCS8qIHNsb3RpZCBtdXN0IGJlIDAgKi8KKworCWR1bW15ID0gYmUzMl90b19jcHVwKHArKyk7CiAJaWYgKGR1bW15ICE9IDApIHsKLQkJZHByaW50aygiJXMgSW52YWxpZCBzbG90aWRcbiIsIF9fZnVuY19fKTsKKwkJZHByaW50aygiTkZTOiAlcyBJbnZhbGlkIHNsb3RpZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dDsKIAl9Ci0JLyogRklYTUU6IHByb2Nlc3MgaGlnaGVzdCBzbG90aWQgYW5kIHRhcmdldCBoaWdoZXN0IHNsb3RpZCAqLworCisJLyoKKwkgKiBGSVhNRTogcHJvY2VzcyBoaWdoZXN0IHNsb3RpZCBhbmQgdGFyZ2V0IGhpZ2hlc3Qgc2xvdGlkCisJICovCiAJc3RhdHVzID0gMDsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkZWNvZGVfY2Jfc2VxdWVuY2U0cmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQoreworCWVudW0gbmZzc3RhdDQgbmZzZXJyOworCWludCBzdGF0dXM7CisKKwlpZiAoY2ItPmNiX21pbm9ydmVyc2lvbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCXN0YXR1cyA9IGRlY29kZV9jYl9vcF9zdGF0dXMoeGRyLCBPUF9DQl9TRVFVRU5DRSwgJm5mc2Vycik7CisJaWYgKHVubGlrZWx5KHN0YXR1cykpCisJCWdvdG8gb3V0OworCWlmICh1bmxpa2VseShuZnNlcnIgIT0gTkZTNF9PSykpCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJc3RhdHVzID0gZGVjb2RlX2NiX3NlcXVlbmNlNHJlc29rKHhkciwgY2IpOworb3V0OgorCXJldHVybiBzdGF0dXM7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX2NiX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworLyoKKyAqIE5GU3Y0LjAgYW5kIE5GU3Y0LjEgWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqCisgKiBORlN2NC4wIGNhbGxiYWNrIGFyZ3VtZW50IHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMTUgb2YgUkZDCisgKiAzNTMwOiAiTmV0d29yayBGaWxlIFN5c3RlbSAoTkZTKSB2ZXJzaW9uIDQgUHJvdG9jb2wiIGFuZCBzZWN0aW9uIDIwCisgKiBvZiBSRkMgNTY2MTogICJOZXR3b3JrIEZpbGUgU3lzdGVtIChORlMpIFZlcnNpb24gNCBNaW5vciBWZXJzaW9uIDEKKyAqIFByb3RvY29sIi4KKyAqLworCisvKgorICogTkI6IFdpdGhvdXQgdGhpcyB6ZXJvIHNwYWNlIHJlc2VydmF0aW9uLCBjYWxsYmFja3Mgb3ZlciBrcmI1cCBmYWlsCisgKi8KK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSB2b2lkICpfX3VudXNlZCkKK3sKKwl4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDApOworfQorCisvKgorICogMjAuMi4gT3BlcmF0aW9uIDQ6IENCX1JFQ0FMTCAtIFJlY2FsbCBhIERlbGVnYXRpb24KKyAqLworc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQoreworCWNvbnN0IHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmFyZ3MgPSBjYi0+Y2Jfb3A7CisJc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLmlkZW50ID0gY2ItPmNiX2NscC0+Y2xfY2JfaWRlbnQsCisJCS5taW5vcnZlcnNpb24gPSBjYi0+Y2JfbWlub3J2ZXJzaW9uLAorCX07CisKKwllbmNvZGVfY2JfY29tcG91bmQ0YXJncyh4ZHIsICZoZHIpOworCWVuY29kZV9jYl9zZXF1ZW5jZTRhcmdzKHhkciwgY2IsICZoZHIpOworCWVuY29kZV9jYl9yZWNhbGw0YXJncyh4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jYl9ub3BzKCZoZHIpOwogfQogCiAKLXN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnApCisvKgorICogTkZTdjQuMCBhbmQgTkZTdjQuMSBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICoKKyAqIE5GU3Y0LjAgY2FsbGJhY2sgcmVzdWx0IHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMTUgb2YgUkZDCisgKiAzNTMwOiAiTmV0d29yayBGaWxlIFN5c3RlbSAoTkZTKSB2ZXJzaW9uIDQgUHJvdG9jb2wiIGFuZCBzZWN0aW9uIDIwCisgKiBvZiBSRkMgNTY2MTogICJOZXR3b3JrIEZpbGUgU3lzdGVtIChORlMpIFZlcnNpb24gNCBNaW5vciBWZXJzaW9uIDEKKyAqIFByb3RvY29sIi4KKyAqLworCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXZvaWQgKl9fdW51c2VkKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1uZnM0X3hkcl9kZWNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKLQkJc3RydWN0IG5mc2Q0X2NhbGxiYWNrICpjYikKKy8qCisgKiAyMC4yLiBPcGVyYXRpb24gNDogQ0JfUkVDQUxMIC0gUmVjYWxsIGEgRGVsZWdhdGlvbgorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgaGRyOworCWVudW0gbmZzc3RhdDQgbmZzZXJyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY2JfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOwotCWlmIChzdGF0dXMpCisJc3RhdHVzID0gZGVjb2RlX2NiX2NvbXBvdW5kNHJlcyh4ZHIsICZoZHIpOworCWlmICh1bmxpa2VseShzdGF0dXMpKQogCQlnb3RvIG91dDsKLQlpZiAoY2IpIHsKLQkJc3RhdHVzID0gZGVjb2RlX2NiX3NlcXVlbmNlKCZ4ZHIsIGNiLCBycXN0cCk7Ci0JCWlmIChzdGF0dXMpCisKKwlpZiAoY2IgIT0gTlVMTCkgeworCQlzdGF0dXMgPSBkZWNvZGVfY2Jfc2VxdWVuY2U0cmVzKHhkciwgY2IpOworCQlpZiAodW5saWtlbHkoc3RhdHVzKSkKIAkJCWdvdG8gb3V0OwogCX0KLQlzdGF0dXMgPSBkZWNvZGVfY2Jfb3BfaGRyKCZ4ZHIsIE9QX0NCX1JFQ0FMTCk7CisKKwlzdGF0dXMgPSBkZWNvZGVfY2Jfb3Bfc3RhdHVzKHhkciwgT1BfQ0JfUkVDQUxMLCAmbmZzZXJyKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJZ290byBvdXQ7CisJaWYgKHVubGlrZWx5KG5mc2VyciAhPSBORlM0X09LKSkKKwkJZ290byBvdXRfZGVmYXVsdDsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19jYl9zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCiAgKiBSUEMgcHJvY2VkdXJlIHRhYmxlcwogICovCi0jZGVmaW5lIFBST0MocHJvYywgY2FsbCwgYXJndHlwZSwgcmVzdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1bTkZTUFJPQzRfQ0xOVF8jI3Byb2NdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgICAgICAgLnBfcHJvYyAgID0gTkZTUFJPQzRfQ0JfIyNjYWxsLAkJCQkJXAotICAgICAgICAucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNhcmd0eXBlLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAucF9kZWNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNyZXN0eXBlLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAucF9hcmdsZW4gPSBORlM0XyMjYXJndHlwZSMjX3N6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAucF9yZXBsZW4gPSBORlM0XyMjcmVzdHlwZSMjX3N6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAucF9zdGF0aWR4ID0gTkZTUFJPQzRfQ0JfIyNjYWxsLAkJCQlcCi0JLnBfbmFtZSAgID0gI3Byb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgUFJPQyhwcm9jLCBjYWxsLCBhcmd0eXBlLCByZXN0eXBlKQkJCQlcCitbTkZTUFJPQzRfQ0xOVF8jI3Byb2NdID0gewkJCQkJCVwKKwkucF9wcm9jICAgID0gTkZTUFJPQzRfQ0JfIyNjYWxsLAkJCQlcCisJLnBfZW5jb2RlICA9IChreGRyZXByb2NfdCluZnM0X3hkcl9lbmNfIyNhcmd0eXBlLAkJXAorCS5wX2RlY29kZSAgPSAoa3hkcmRwcm9jX3QpbmZzNF94ZHJfZGVjXyMjcmVzdHlwZSwJCVwKKwkucF9hcmdsZW4gID0gTkZTNF9lbmNfIyNhcmd0eXBlIyNfc3osCQkJCVwKKwkucF9yZXBsZW4gID0gTkZTNF9kZWNfIyNyZXN0eXBlIyNfc3osCQkJCVwKKwkucF9zdGF0aWR4ID0gTkZTUFJPQzRfQ0JfIyNjYWxsLAkJCQlcCisJLnBfbmFtZSAgICA9ICNwcm9jLAkJCQkJCVwKIH0KIAotc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gICAgIG5mczRfY2JfcHJvY2VkdXJlc1tdID0gewotICAgIFBST0MoQ0JfTlVMTCwgICAgICBOVUxMLCAgICAgZW5jX2NiX251bGwsICAgICBkZWNfY2JfbnVsbCksCi0gICAgUFJPQyhDQl9SRUNBTEwsICAgIENPTVBPVU5ELCAgIGVuY19jYl9yZWNhbGwsICAgICAgZGVjX2NiX3JlY2FsbCksCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBuZnM0X2NiX3Byb2NlZHVyZXNbXSA9IHsKKwlQUk9DKENCX05VTEwsCU5VTEwsCQljYl9udWxsLAljYl9udWxsKSwKKwlQUk9DKENCX1JFQ0FMTCwJQ09NUE9VTkQsCWNiX3JlY2FsbCwJY2JfcmVjYWxsKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gICAgICAgbmZzX2NiX3ZlcnNpb240ID0geworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiBuZnNfY2JfdmVyc2lvbjQgPSB7CiAvKgogICogTm90ZSBvbiB0aGUgY2FsbGJhY2sgcnBjIHByb2dyYW0gdmVyc2lvbiBudW1iZXI6IGRlc3BpdGUgbGFuZ3VhZ2UgaW4gcmZjCiAgKiA1NjYxIHNlY3Rpb24gMTguMzYuMyByZXF1aXJpbmcgc2VydmVycyB0byB1c2UgNCBpbiB0aGlzIGZpZWxkLCB0aGUKQEAgLTQ0MCwyOSArNTk4LDI5IEBACiAgKiBpbiBwcmFjdGljZSB0aGF0IGFwcGVhcnMgdG8gYmUgd2hhdCBpbXBsZW1lbnRhdGlvbnMgdXNlLiAgVGhlIHNlY3Rpb24KICAqIDE4LjM2LjMgbGFuZ3VhZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgZml4ZWQgaW4gYW4gZXJyYXR1bS4KICAqLwotICAgICAgICAubnVtYmVyICAgICAgICAgICAgICAgICA9IDEsCi0gICAgICAgIC5ucnByb2NzICAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShuZnM0X2NiX3Byb2NlZHVyZXMpLAotICAgICAgICAucHJvY3MgICAgICAgICAgICAgICAgICA9IG5mczRfY2JfcHJvY2VkdXJlcworCS5udW1iZXIJCQk9IDEsCisJLm5ycHJvY3MJCT0gQVJSQVlfU0laRShuZnM0X2NiX3Byb2NlZHVyZXMpLAorCS5wcm9jcwkJCT0gbmZzNF9jYl9wcm9jZWR1cmVzCiB9OwogCi1zdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbmZzX2NiX3ZlcnNpb25bXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKm5mc19jYl92ZXJzaW9uW10gPSB7CiAJJm5mc19jYl92ZXJzaW9uNCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0gY2JfcHJvZ3JhbTsKIAogc3RhdGljIHN0cnVjdCBycGNfc3RhdCBjYl9zdGF0cyA9IHsKLQkJLnByb2dyYW0JPSAmY2JfcHJvZ3JhbQorCS5wcm9ncmFtCQk9ICZjYl9wcm9ncmFtCiB9OwogCiAjZGVmaW5lIE5GUzRfQ0FMTEJBQ0sgMHg0MDAwMDAwMAogc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbSBjYl9wcm9ncmFtID0gewotCQkubmFtZSAJCT0gIm5mczRfY2IiLAotCQkubnVtYmVyCQk9IE5GUzRfQ0FMTEJBQ0ssCi0JCS5ucnZlcnMJCT0gQVJSQVlfU0laRShuZnNfY2JfdmVyc2lvbiksCi0JCS52ZXJzaW9uCT0gbmZzX2NiX3ZlcnNpb24sCi0JCS5zdGF0cwkJPSAmY2Jfc3RhdHMsCi0JCS5waXBlX2Rpcl9uYW1lICA9ICIvbmZzZDRfY2IiLAorCS5uYW1lCQkJPSAibmZzNF9jYiIsCisJLm51bWJlcgkJCT0gTkZTNF9DQUxMQkFDSywKKwkubnJ2ZXJzCQkJPSBBUlJBWV9TSVpFKG5mc19jYl92ZXJzaW9uKSwKKwkudmVyc2lvbgkJPSBuZnNfY2JfdmVyc2lvbiwKKwkuc3RhdHMJCQk9ICZjYl9zdGF0cywKKwkucGlwZV9kaXJfbmFtZQkJPSAiL25mc2Q0X2NiIiwKIH07CiAKIHN0YXRpYyBpbnQgbWF4X2NiX3RpbWUodm9pZCkKQEAgLTQ3MCwxMCArNjI4LDggQEAKIAlyZXR1cm4gbWF4KG5mc2Q0X2xlYXNlLzEwLCAodGltZV90KTEpICogSFo7CiB9CiAKLS8qIFJlZmVyZW5jZSBjb3VudGluZywgY2FsbGJhY2sgY2xlYW51cCwgZXRjLiwgYWxsIGxvb2sgcmFjeSBhcyBoZWNrLgotICogQW5kIHdoeSBpcyBjbF9jYl9zZXQgYW4gYXRvbWljPyAqLwogCi1pbnQgc2V0dXBfY2FsbGJhY2tfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9jYl9jb25uICpjb25uKQorc3RhdGljIGludCBzZXR1cF9jYWxsYmFja19jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X2NiX2Nvbm4gKmNvbm4sIHN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMpCiB7CiAJc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtcyA9IHsKIAkJLnRvX2luaXR2YWwJPSBtYXhfY2JfdGltZSgpLApAQCAtNDgzLDYgKzYzOSw3IEBACiAJCS5uZXQJCT0gJmluaXRfbmV0LAogCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNvbm4tPmNiX2FkZHIsCiAJCS5hZGRyc2l6ZQk9IGNvbm4tPmNiX2FkZHJsZW4sCisJCS5zYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNvbm4tPmNiX3NhZGRyLAogCQkudGltZW91dAk9ICZ0aW1lcGFybXMsCiAJCS5wcm9ncmFtCT0gJmNiX3Byb2dyYW0sCiAJCS52ZXJzaW9uCT0gMCwKQEAgLTQ5OSw2ICs2NTYsMTAgQEAKIAkJYXJncy5wcm90b2NvbCA9IFhQUlRfVFJBTlNQT1JUX1RDUDsKIAkJY2xwLT5jbF9jYl9pZGVudCA9IGNvbm4tPmNiX2lkZW50OwogCX0gZWxzZSB7CisJCWlmICghY29ubi0+Y2JfeHBydCkKKwkJCXJldHVybiAtRUlOVkFMOworCQljbHAtPmNsX2NiX2Nvbm4uY2JfeHBydCA9IGNvbm4tPmNiX3hwcnQ7CisJCWNscC0+Y2xfY2Jfc2Vzc2lvbiA9IHNlczsKIAkJYXJncy5iY194cHJ0ID0gY29ubi0+Y2JfeHBydDsKIAkJYXJncy5wcm9nbnVtYmVyID0gY2xwLT5jbF9jYl9zZXNzaW9uLT5zZV9jYl9wcm9nOwogCQlhcmdzLnByb3RvY29sID0gWFBSVF9UUkFOU1BPUlRfQkNfVENQOwpAQCAtNTIxLDE0ICs2ODIsMjAgQEAKIAkJKGludCljbHAtPmNsX25hbWUubGVuLCBjbHAtPmNsX25hbWUuZGF0YSwgcmVhc29uKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzZDRfbWFya19jYl9kb3duKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBpbnQgcmVhc29uKQoreworCWNscC0+Y2xfY2Jfc3RhdGUgPSBORlNENF9DQl9ET1dOOworCXdhcm5fbm9fY2FsbGJhY2tfcGF0aChjbHAsIHJlYXNvbik7Cit9CisKIHN0YXRpYyB2b2lkIG5mc2Q0X2NiX3Byb2JlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLCB2b2lkICpjYWxsZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IGNvbnRhaW5lcl9vZihjYWxsZGF0YSwgc3RydWN0IG5mczRfY2xpZW50LCBjbF9jYl9udWxsKTsKIAogCWlmICh0YXNrLT50a19zdGF0dXMpCi0JCXdhcm5fbm9fY2FsbGJhY2tfcGF0aChjbHAsIHRhc2stPnRrX3N0YXR1cyk7CisJCW5mc2Q0X21hcmtfY2JfZG93bihjbHAsIHRhc2stPnRrX3N0YXR1cyk7CiAJZWxzZQotCQlhdG9taWNfc2V0KCZjbHAtPmNsX2NiX3NldCwgMSk7CisJCWNscC0+Y2xfY2Jfc3RhdGUgPSBORlNENF9DQl9VUDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmZzZDRfY2JfcHJvYmVfb3BzID0gewpAQCAtNTUxLDYgKzcxOCwxMSBAQAogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNhbGxiYWNrX3dxOwogCitzdGF0aWMgdm9pZCBydW5fbmZzZDRfY2Ioc3RydWN0IG5mc2Q0X2NhbGxiYWNrICpjYikKK3sKKwlxdWV1ZV93b3JrKGNhbGxiYWNrX3dxLCAmY2ItPmNiX3dvcmspOworfQorCiBzdGF0aWMgdm9pZCBkb19wcm9iZV9jYWxsYmFjayhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2JfbnVsbDsKQEAgLTU2NSw3ICs3MzcsNyBAQAogCiAJY2ItPmNiX29wcyA9ICZuZnNkNF9jYl9wcm9iZV9vcHM7CiAKLQlxdWV1ZV93b3JrKGNhbGxiYWNrX3dxLCAmY2ItPmNiX3dvcmspOworCXJ1bl9uZnNkNF9jYihjYik7CiB9CiAKIC8qCkBAIC01NzQsMTQgKzc0NiwyMSBAQAogICovCiB2b2lkIG5mc2Q0X3Byb2JlX2NhbGxiYWNrKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQogeworCS8qIFhYWDogYXRvbWljaXR5PyAgQWxzbywgc2hvdWxkIHdlIGJlIHVzaW5nIGNsX2NiX2ZsYWdzPyAqLworCWNscC0+Y2xfY2Jfc3RhdGUgPSBORlNENF9DQl9VTktOT1dOOwogCXNldF9iaXQoTkZTRDRfQ0xJRU5UX0NCX1VQREFURSwgJmNscC0+Y2xfY2JfZmxhZ3MpOwogCWRvX3Byb2JlX2NhbGxiYWNrKGNscCk7CiB9CiAKK3ZvaWQgbmZzZDRfcHJvYmVfY2FsbGJhY2tfc3luYyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwluZnNkNF9wcm9iZV9jYWxsYmFjayhjbHApOworCWZsdXNoX3dvcmtxdWV1ZShjYWxsYmFja193cSk7Cit9CisKIHZvaWQgbmZzZDRfY2hhbmdlX2NhbGxiYWNrKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9jYl9jb25uICpjb25uKQogewotCUJVR19PTihhdG9taWNfcmVhZCgmY2xwLT5jbF9jYl9zZXQpKTsKLQorCWNscC0+Y2xfY2Jfc3RhdGUgPSBORlNENF9DQl9VTktOT1dOOwogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKIAltZW1jcHkoJmNscC0+Y2xfY2JfY29ubiwgY29ubiwgc2l6ZW9mKHN0cnVjdCBuZnM0X2NiX2Nvbm4pKTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKQEAgLTU5MiwyNCArNzcxLDE0IEBACiAgKiBJZiB0aGUgc2xvdCBpcyBhdmFpbGFibGUsIHRoZW4gbWFyayBpdCBidXN5LiAgT3RoZXJ3aXNlLCBzZXQgdGhlCiAgKiB0aHJlYWQgZm9yIHNsZWVwaW5nIG9uIHRoZSBjYWxsYmFjayBSUEMgd2FpdCBxdWV1ZS4KICAqLwotc3RhdGljIGludCBuZnNkNDFfY2Jfc2V0dXBfc2VxdWVuY2Uoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsCi0JCXN0cnVjdCBycGNfdGFzayAqdGFzaykKK3N0YXRpYyBib29sIG5mc2Q0MV9jYl9nZXRfc2xvdChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IHJwY190YXNrICp0YXNrKQogewotCXUzMiAqcHRyID0gKHUzMiAqKWNscC0+Y2xfY2Jfc2Vzc2lvbi0+c2Vfc2Vzc2lvbmlkLmRhdGE7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlkcHJpbnRrKCIlczogJXU6JXU6JXU6JXVcbiIsIF9fZnVuY19fLAotCQlwdHJbMF0sIHB0clsxXSwgcHRyWzJdLCBwdHJbM10pOwotCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmNscC0+Y2xfY2Jfc2xvdF9idXN5KSAhPSAwKSB7CiAJCXJwY19zbGVlcF9vbigmY2xwLT5jbF9jYl93YWl0cSwgdGFzaywgTlVMTCk7CiAJCWRwcmludGsoIiVzIHNsb3QgaXMgYnVzeVxuIiwgX19mdW5jX18pOwotCQlzdGF0dXMgPSAtRUFHQUlOOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLW91dDoKLQlkcHJpbnRrKCIlcyBzdGF0dXM9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC02MjIsMjAgKzc5MSwxOSBAQAogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gY29udGFpbmVyX29mKGNiLCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9yZWNhbGwpOwogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gZHAtPmRsX2NsaWVudDsKIAl1MzIgbWlub3J2ZXJzaW9uID0gY2xwLT5jbF9taW5vcnZlcnNpb247Ci0JaW50IHN0YXR1cyA9IDA7CiAKIAljYi0+Y2JfbWlub3J2ZXJzaW9uID0gbWlub3J2ZXJzaW9uOwogCWlmIChtaW5vcnZlcnNpb24pIHsKLQkJc3RhdHVzID0gbmZzZDQxX2NiX3NldHVwX3NlcXVlbmNlKGNscCwgdGFzayk7Ci0JCWlmIChzdGF0dXMpIHsKLQkJCWlmIChzdGF0dXMgIT0gLUVBR0FJTikgewotCQkJCS8qIHRlcm1pbmF0ZSBycGMgdGFzayAqLwotCQkJCXRhc2stPnRrX3N0YXR1cyA9IHN0YXR1czsKLQkJCQl0YXNrLT50a19hY3Rpb24gPSBOVUxMOwotCQkJfQorCQlpZiAoIW5mc2Q0MV9jYl9nZXRfc2xvdChjbHAsIHRhc2spKQogCQkJcmV0dXJuOwotCQl9CiAJfQorCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmY2ItPmNiX3Blcl9jbGllbnQpKSB7CisJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIG5vdCBhIHJlc3RhcnQgKi8KKwkJY2ItPmNiX2RvbmUgPSBmYWxzZTsKKwkJbGlzdF9hZGQoJmNiLT5jYl9wZXJfY2xpZW50LCAmY2xwLT5jbF9jYWxsYmFja3MpOworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlycGNfY2FsbF9zdGFydCh0YXNrKTsKIH0KIApAQCAtNjcxLDE1ICs4MzksMTggQEAKIAogCW5mc2Q0X2NiX2RvbmUodGFzaywgY2FsbGRhdGEpOwogCi0JaWYgKGN1cnJlbnRfcnBjX2NsaWVudCA9PSBOVUxMKSB7Ci0JCS8qIFdlJ3JlIHNodXR0aW5nIGRvd247IGdpdmUgdXAuICovCi0JCS8qIFhYWDogZXJyLCBvciBpcyBpdCBvayBqdXN0IHRvIGZhbGwgdGhyb3VnaAotCQkgKiBhbmQgcnBjX3Jlc3RhcnRfY2FsbD8gKi8KKwlpZiAoY3VycmVudF9ycGNfY2xpZW50ICE9IHRhc2stPnRrX2NsaWVudCkgeworCQkvKiBXZSdyZSBzaHV0dGluZyBkb3duIG9yIGNoYW5naW5nIGNsX2NiX2NsaWVudDsgbGVhdmUKKwkJICogaXQgdG8gbmZzZDRfcHJvY2Vzc19jYl91cGRhdGUgdG8gcmVzdGFydCB0aGUgY2FsbCBpZgorCQkgKiBuZWNlc3NhcnkuICovCiAJCXJldHVybjsKIAl9CiAKKwlpZiAoY2ItPmNiX2RvbmUpCisJCXJldHVybjsKIAlzd2l0Y2ggKHRhc2stPnRrX3N0YXR1cykgewogCWNhc2UgMDoKKwkJY2ItPmNiX2RvbmUgPSB0cnVlOwogCQlyZXR1cm47CiAJY2FzZSAtRUJBREhBTkRMRToKIAljYXNlIC1ORlM0RVJSX0JBRF9TVEFURUlEOgpAQCAtNjg4LDMyICs4NTksMzAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogTmV0d29yayBwYXJ0aXRpb24/ICovCi0JCWF0b21pY19zZXQoJmNscC0+Y2xfY2Jfc2V0LCAwKTsKLQkJd2Fybl9ub19jYWxsYmFja19wYXRoKGNscCwgdGFzay0+dGtfc3RhdHVzKTsKLQkJaWYgKGN1cnJlbnRfcnBjX2NsaWVudCAhPSB0YXNrLT50a19jbGllbnQpIHsKLQkJCS8qIHF1ZXVlIGEgY2FsbGJhY2sgb24gdGhlIG5ldyBjb25uZWN0aW9uOiAqLwotCQkJYXRvbWljX2luYygmZHAtPmRsX2NvdW50KTsKLQkJCW5mc2Q0X2NiX3JlY2FsbChkcCk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJbmZzZDRfbWFya19jYl9kb3duKGNscCwgdGFzay0+dGtfc3RhdHVzKTsKIAl9CiAJaWYgKGRwLT5kbF9yZXRyaWVzLS0pIHsKIAkJcnBjX2RlbGF5KHRhc2ssIDIqSFopOwogCQl0YXNrLT50a19zdGF0dXMgPSAwOwogCQlycGNfcmVzdGFydF9jYWxsX3ByZXBhcmUodGFzayk7CiAJCXJldHVybjsKLQl9IGVsc2UgewotCQlhdG9taWNfc2V0KCZjbHAtPmNsX2NiX3NldCwgMCk7Ci0JCXdhcm5fbm9fY2FsbGJhY2tfcGF0aChjbHAsIHRhc2stPnRrX3N0YXR1cyk7CiAJfQorCW5mc2Q0X21hcmtfY2JfZG93bihjbHAsIHRhc2stPnRrX3N0YXR1cyk7CisJY2ItPmNiX2RvbmUgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBuZnNkNF9jYl9yZWNhbGxfcmVsZWFzZSh2b2lkICpjYWxsZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiID0gY2FsbGRhdGE7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBjYi0+Y2JfY2xwOwogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gY29udGFpbmVyX29mKGNiLCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9yZWNhbGwpOwogCi0JbmZzNF9wdXRfZGVsZWdhdGlvbihkcCk7CisJaWYgKGNiLT5jYl9kb25lKSB7CisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJbGlzdF9kZWwoJmNiLT5jYl9wZXJfY2xpZW50KTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCW5mczRfcHV0X2RlbGVnYXRpb24oZHApOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmZzZDRfY2JfcmVjYWxsX29wcyA9IHsKQEAgLTc0OCwxNiArOTE3LDMzIEBACiAJZmx1c2hfd29ya3F1ZXVlKGNhbGxiYWNrX3dxKTsKIH0KIAotdm9pZCBuZnNkNF9yZWxlYXNlX2NiKHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCitzdGF0aWMgdm9pZCBuZnNkNF9yZWxlYXNlX2NiKHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCiB7CiAJaWYgKGNiLT5jYl9vcHMtPnJwY19yZWxlYXNlKQogCQljYi0+Y2Jfb3BzLT5ycGNfcmVsZWFzZShjYik7CiB9CiAKLXZvaWQgbmZzZDRfcHJvY2Vzc19jYl91cGRhdGUoc3RydWN0IG5mc2Q0X2NhbGxiYWNrICpjYikKKy8qIHJlcXVpcmVzIGNsX2xvY2s6ICovCitzdGF0aWMgc3RydWN0IG5mc2Q0X2Nvbm4gKiBfX25mc2Q0X2ZpbmRfYmFja2NoYW5uZWwoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnM7CisJc3RydWN0IG5mc2Q0X2Nvbm4gKmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZjbHAtPmNsX3Nlc3Npb25zLCBzZV9wZXJjbG50KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJnMtPnNlX2Nvbm5zLCBjbl9wZXJzZXNzaW9uKSB7CisJCQlpZiAoYy0+Y25fZmxhZ3MgJiBORlM0X0NERkM0X0JBQ0spCisJCQkJcmV0dXJuIGM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5mc2Q0X3Byb2Nlc3NfY2JfdXBkYXRlKHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCiB7CiAJc3RydWN0IG5mczRfY2JfY29ubiBjb25uOwogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gY2ItPmNiX2NscDsKKwlzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqc2VzID0gTlVMTDsKKwlzdHJ1Y3QgbmZzZDRfY29ubiAqYzsKIAlpbnQgZXJyOwogCiAJLyoKQEAgLTc2OCw2ICs5NTQsMTAgQEAKIAkJcnBjX3NodXRkb3duX2NsaWVudChjbHAtPmNsX2NiX2NsaWVudCk7CiAJCWNscC0+Y2xfY2JfY2xpZW50ID0gTlVMTDsKIAl9CisJaWYgKGNscC0+Y2xfY2JfY29ubi5jYl94cHJ0KSB7CisJCXN2Y194cHJ0X3B1dChjbHAtPmNsX2NiX2Nvbm4uY2JfeHBydCk7CisJCWNscC0+Y2xfY2JfY29ubi5jYl94cHJ0ID0gTlVMTDsKKwl9CiAJaWYgKHRlc3RfYml0KE5GU0Q0X0NMSUVOVF9LSUxMLCAmY2xwLT5jbF9jYl9mbGFncykpCiAJCXJldHVybjsKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CkBAIC03NzgsMTEgKzk2OCwyMiBAQAogCUJVR19PTighY2xwLT5jbF9jYl9mbGFncyk7CiAJY2xlYXJfYml0KE5GU0Q0X0NMSUVOVF9DQl9VUERBVEUsICZjbHAtPmNsX2NiX2ZsYWdzKTsKIAltZW1jcHkoJmNvbm4sICZjYi0+Y2JfY2xwLT5jbF9jYl9jb25uLCBzaXplb2Yoc3RydWN0IG5mczRfY2JfY29ubikpOworCWMgPSBfX25mc2Q0X2ZpbmRfYmFja2NoYW5uZWwoY2xwKTsKKwlpZiAoYykgeworCQlzdmNfeHBydF9nZXQoYy0+Y25feHBydCk7CisJCWNvbm4uY2JfeHBydCA9IGMtPmNuX3hwcnQ7CisJCXNlcyA9IGMtPmNuX3Nlc3Npb247CisJfQogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCi0JZXJyID0gc2V0dXBfY2FsbGJhY2tfY2xpZW50KGNscCwgJmNvbm4pOwotCWlmIChlcnIpCisJZXJyID0gc2V0dXBfY2FsbGJhY2tfY2xpZW50KGNscCwgJmNvbm4sIHNlcyk7CisJaWYgKGVycikgewogCQl3YXJuX25vX2NhbGxiYWNrX3BhdGgoY2xwLCBlcnIpOworCQlyZXR1cm47CisJfQorCS8qIFlheSwgdGhlIGNhbGxiYWNrIGNoYW5uZWwncyBiYWNrISBSZXN0YXJ0IGFueSBjYWxsYmFja3M6ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmNscC0+Y2xfY2FsbGJhY2tzLCBjYl9wZXJfY2xpZW50KQorCQlydW5fbmZzZDRfY2IoY2IpOwogfQogCiB2b2lkIG5mc2Q0X2RvX2NhbGxiYWNrX3JwYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCkBAIC04MDcsMTAgKzEwMDgsMTEgQEAKIHZvaWQgbmZzZDRfY2JfcmVjYWxsKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKQogewogCXN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IgPSAmZHAtPmRsX3JlY2FsbDsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IGRwLT5kbF9jbGllbnQ7CiAKIAlkcC0+ZGxfcmV0cmllcyA9IDE7CiAJY2ItPmNiX29wID0gZHA7Ci0JY2ItPmNiX2NscCA9IGRwLT5kbF9jbGllbnQ7CisJY2ItPmNiX2NscCA9IGNscDsKIAljYi0+Y2JfbXNnLnJwY19wcm9jID0gJm5mczRfY2JfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0NCX1JFQ0FMTF07CiAJY2ItPmNiX21zZy5ycGNfYXJncCA9IGNiOwogCWNiLT5jYl9tc2cucnBjX3Jlc3AgPSBjYjsKQEAgLTgxOSw1ICsxMDIxLDggQEAKIAljYi0+Y2Jfb3BzID0gJm5mc2Q0X2NiX3JlY2FsbF9vcHM7CiAJZHAtPmRsX3JldHJpZXMgPSAxOwogCi0JcXVldWVfd29yayhjYWxsYmFja193cSwgJmRwLT5kbF9yZWNhbGwuY2Jfd29yayk7CisJSU5JVF9MSVNUX0hFQUQoJmNiLT5jYl9wZXJfY2xpZW50KTsKKwljYi0+Y2JfZG9uZSA9IHRydWU7CisKKwlydW5fbmZzZDRfY2IoJmRwLT5kbF9yZWNhbGwpOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0aWRtYXAuYyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKaW5kZXggZjA2OTVlOC4uNmQyYzM5NyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0aWRtYXAuYworKysgYi9mcy9uZnNkL25mczRpZG1hcC5jCkBAIC0zMywxMCArMzMsMTEgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiaWRtYXAuaCIKKyNpbmNsdWRlICJuZnNkLmgiCiAKIC8qCiAgKiBDYWNoZSBlbnRyeQpAQCAtNTE0LDcgKzUxNSw3IEBACiAJcmV0dXJuIGNscC0+bmFtZTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIF9fYmUzMgogaWRtYXBfbmFtZV90b19pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgdTMyIG5hbWVsZW4sCiAJCXVpZF90ICppZCkKIHsKQEAgLTUyNCwxNSArNTI1LDE1IEBACiAJaW50IHJldDsKIAogCWlmIChuYW1lbGVuICsgMSA+IHNpemVvZihrZXkubmFtZSkpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gbmZzZXJyX2JhZG93bmVyOwogCW1lbWNweShrZXkubmFtZSwgbmFtZSwgbmFtZWxlbik7CiAJa2V5Lm5hbWVbbmFtZWxlbl0gPSAnXDAnOwogCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0X2F1dGhuYW1lKHJxc3RwKSwgc2l6ZW9mKGtleS5hdXRobmFtZSkpOwogCXJldCA9IGlkbWFwX2xvb2t1cChycXN0cCwgbmFtZXRvaWRfbG9va3VwLCAma2V5LCAmbmFtZXRvaWRfY2FjaGUsICZpdGVtKTsKIAlpZiAocmV0ID09IC1FTk9FTlQpCi0JCXJldCA9IC1FU1JDSDsgLyogbmZzZXJyX2JhZG5hbWUgKi8KKwkJcmV0dXJuIG5mc2Vycl9iYWRvd25lcjsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gbmZzZXJybm8ocmV0KTsKIAkqaWQgPSBpdGVtLT5pZDsKIAljYWNoZV9wdXQoJml0ZW0tPmgsICZuYW1ldG9pZF9jYWNoZSk7CiAJcmV0dXJuIDA7CkBAIC01NjAsMTQgKzU2MSwxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludAorX19iZTMyCiBuZnNkX21hcF9uYW1lX3RvX3VpZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKIAkJX191MzIgKmlkKQogewogCXJldHVybiBpZG1hcF9uYW1lX3RvX2lkKHJxc3RwLCBJRE1BUF9UWVBFX1VTRVIsIG5hbWUsIG5hbWVsZW4sIGlkKTsKIH0KIAotaW50CitfX2JlMzIKIG5mc2RfbWFwX25hbWVfdG9fZ2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAogCQlfX3UzMiAqaWQpCiB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggMGNkZmQwMi4uZGI1MjU0NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtNjA0LDkgKzYwNCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIF9fYmUzMgotbmZzZDRfbG9va3VwcChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKLQkgICAgICB2b2lkICphcmcpCitzdGF0aWMgX19iZTMyIG5mc2Q0X2RvX2xvb2t1cHAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmgpCiB7CiAJc3RydWN0IHN2Y19maCB0bXBfZmg7CiAJX19iZTMyIHJldDsKQEAgLTYxNSwxMyArNjEzLDE5IEBACiAJcmV0ID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAsICZ0bXBfZmgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JaWYgKHRtcF9maC5maF9kZW50cnkgPT0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeSkgeworCWlmICh0bXBfZmguZmhfZGVudHJ5ID09IGZoLT5maF9kZW50cnkpIHsKIAkJZmhfcHV0KCZ0bXBfZmgpOwogCQlyZXR1cm4gbmZzZXJyX25vZW50OwogCX0KIAlmaF9wdXQoJnRtcF9maCk7Ci0JcmV0dXJuIG5mc2RfbG9va3VwKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoLAotCQkJICAgIi4uIiwgMiwgJmNzdGF0ZS0+Y3VycmVudF9maCk7CisJcmV0dXJuIG5mc2RfbG9va3VwKHJxc3RwLCBmaCwgIi4uIiwgMiwgZmgpOworfQorCitzdGF0aWMgX19iZTMyCituZnNkNF9sb29rdXBwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gbmZzZDRfZG9fbG9va3VwcChycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCk7CiB9CiAKIHN0YXRpYyBfX2JlMzIKQEAgLTc2OSwxMCArNzczLDM2IEBACiAJfSBlbHNlCiAJCXNlY2luZm8tPnNpX2V4cCA9IGV4cDsKIAlkcHV0KGRlbnRyeSk7CisJaWYgKGNzdGF0ZS0+bWlub3J2ZXJzaW9uKQorCQkvKiBTZWUgcmZjIDU2NjEgc2VjdGlvbiAyLjYuMy4xLjEuOCAqLworCQlmaF9wdXQoJmNzdGF0ZS0+Y3VycmVudF9maCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIF9fYmUzMgorbmZzZDRfc2VjaW5mb19ub19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCSAgICAgIHN0cnVjdCBuZnNkNF9zZWNpbmZvX25vX25hbWUgKnNpbikKK3sKKwlfX2JlMzIgZXJyOworCisJc3dpdGNoIChzaW4tPnNpbl9zdHlsZSkgeworCWNhc2UgTkZTNF9TRUNJTkZPX1NUWUxFNF9DVVJSRU5UX0ZIOgorCQlicmVhazsKKwljYXNlIE5GUzRfU0VDSU5GT19TVFlMRTRfUEFSRU5UOgorCQllcnIgPSBuZnNkNF9kb19sb29rdXBwKHJxc3RwLCAmY3N0YXRlLT5jdXJyZW50X2ZoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBuZnNlcnJfaW52YWw7CisJfQorCWV4cF9nZXQoY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2V4cG9ydCk7CisJc2luLT5zaW5fZXhwID0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2V4cG9ydDsKKwlmaF9wdXQoJmNzdGF0ZS0+Y3VycmVudF9maCk7CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIF9fYmUzMgogbmZzZDRfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKIAkgICAgICBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKQEAgLTk3NCw4ICsxMDA0LDggQEAKICAqIEFsc28gbm90ZSwgZW5mb3JjZWQgZWxzZXdoZXJlOgogICoJLSBTRVFVRU5DRSBvdGhlciB0aGFuIGFzIGZpcnN0IG9wIHJlc3VsdHMgaW4KICAqCSAgTkZTNEVSUl9TRVFVRU5DRV9QT1MuIChFbmZvcmNlZCBpbiBuZnNkNF9zZXF1ZW5jZSgpLikKLSAqCS0gQklORF9DT05OX1RPX1NFU1NJT04gbXVzdCBiZSB0aGUgb25seSBvcCBpbiBpdHMgY29tcG91bmQKLSAqCSAgKFdpbGwgYmUgZW5mb3JjZWQgaW4gbmZzZDRfYmluZF9jb25uX3RvX3Nlc3Npb24oKS4pCisgKgktIEJJTkRfQ09OTl9UT19TRVNTSU9OIG11c3QgYmUgdGhlIG9ubHkgb3AgaW4gaXRzIGNvbXBvdW5kLgorICoJICAoRW5mb3JjZWQgaW4gbmZzZDRfYmluZF9jb25uX3RvX3Nlc3Npb24oKS4pCiAgKgktIERFU1RST1lfU0VTU0lPTiBtdXN0IGJlIHRoZSBmaW5hbCBvcGVyYXRpb24gaW4gYSBjb21wb3VuZCwgaWYKICAqCSAgc2Vzc2lvbmlkJ3MgaW4gU0VRVUVOQ0UgYW5kIERFU1RST1lfU0VTU0lPTiBhcmUgdGhlIHNhbWUuCiAgKgkgIChFbmZvcmNlZCBpbiBuZnNkNF9kZXN0cm95X3Nlc3Npb24oKS4pCkBAIC0xMTI2LDEwICsxMTU2LDYgQEAKIAogCQluZnNkNF9pbmNyZW1lbnRfb3Bfc3RhdHMob3AtPm9wbnVtKTsKIAl9Ci0JaWYgKCFycXN0cC0+cnFfdXNlZGVmZXJyYWwgJiYgc3RhdHVzID09IG5mc2Vycl9kcm9waXQpIHsKLQkJZHByaW50aygiJXMgRHJvcGl0IC0gc2VuZCBORlM0RVJSX0RFTEFZXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YXR1cyA9IG5mc2Vycl9qdWtlYm94OwotCX0KIAogCXJlc3AtPmNzdGF0ZS5zdGF0dXMgPSBzdGF0dXM7CiAJZmhfcHV0KCZyZXNwLT5jc3RhdGUuY3VycmVudF9maCk7CkBAIC0xMzAwLDYgKzEzMjYsMTEgQEAKIAkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZIIHwgQUxMT1dFRF9BU19GSVJTVF9PUCwKIAkJLm9wX25hbWUgPSAiT1BfRVhDSEFOR0VfSUQiLAogCX0sCisJW09QX0JJTkRfQ09OTl9UT19TRVNTSU9OXSA9IHsKKwkJLm9wX2Z1bmMgPSAobmZzZDRvcF9mdW5jKW5mc2Q0X2JpbmRfY29ubl90b19zZXNzaW9uLAorCQkub3BfZmxhZ3MgPSBBTExPV0VEX1dJVEhPVVRfRkggfCBBTExPV0VEX0FTX0ZJUlNUX09QLAorCQkub3BfbmFtZSA9ICJPUF9CSU5EX0NPTk5fVE9fU0VTU0lPTiIsCisJfSwKIAlbT1BfQ1JFQVRFX1NFU1NJT05dID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfY3JlYXRlX3Nlc3Npb24sCiAJCS5vcF9mbGFncyA9IEFMTE9XRURfV0lUSE9VVF9GSCB8IEFMTE9XRURfQVNfRklSU1RfT1AsCkBAIC0xMzIwLDYgKzEzNTEsMTAgQEAKIAkJLm9wX2ZsYWdzID0gQUxMT1dFRF9XSVRIT1VUX0ZILAogCQkub3BfbmFtZSA9ICJPUF9SRUNMQUlNX0NPTVBMRVRFIiwKIAl9LAorCVtPUF9TRUNJTkZPX05PX05BTUVdID0geworCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2VjaW5mb19ub19uYW1lLAorCQkub3BfbmFtZSA9ICJPUF9TRUNJTkZPX05PX05BTUUiLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbmZzZDRfb3BfbmFtZSh1bnNpZ25lZCBvcG51bSkKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwppbmRleCA3ZTI2Y2FhLi5mZmI1OWVmIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRyZWNvdmVyLmMKKysrIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCkBAIC0zMDIsNyArMzAyLDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0JLyogbm90ZTogd2UgY3VycmVudGx5IHVzZSB0aGlzIHBhdGggb25seSBmb3IgbWlub3J2ZXJzaW9uIDAgKi8KIAlpZiAobmZzNF9oYXNfcmVjbGFpbWVkX3N0YXRlKGNoaWxkLT5kX25hbWUubmFtZSwgZmFsc2UpKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggZmJkMThjMy4uZDk4ZDAyMSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0yMzAsNyArMjMwLDggQEAKIAlkcC0+ZGxfY2xpZW50ID0gY2xwOwogCWdldF9uZnM0X2ZpbGUoZnApOwogCWRwLT5kbF9maWxlID0gZnA7Ci0JbmZzNF9maWxlX2dldF9hY2Nlc3MoZnAsIE9fUkRPTkxZKTsKKwlkcC0+ZGxfdmZzX2ZpbGUgPSBmaW5kX3JlYWRhYmxlX2ZpbGUoZnApOworCWdldF9maWxlKGRwLT5kbF92ZnNfZmlsZSk7CiAJZHAtPmRsX2Zsb2NrID0gTlVMTDsKIAlkcC0+ZGxfdHlwZSA9IHR5cGU7CiAJZHAtPmRsX3N0YXRlaWQuc2lfYm9vdCA9IGJvb3RfdGltZTsKQEAgLTI1Miw2ICsyNTMsNyBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkcC0+ZGxfY291bnQpKSB7CiAJCWRwcmludGsoIk5GU0Q6IGZyZWVpbmcgZHAgJXBcbiIsZHApOwogCQlwdXRfbmZzNF9maWxlKGRwLT5kbF9maWxlKTsKKwkJZnB1dChkcC0+ZGxfdmZzX2ZpbGUpOwogCQlrbWVtX2NhY2hlX2ZyZWUoZGVsZWdfc2xhYiwgZHApOwogCQludW1fZGVsZWdhdGlvbnMtLTsKIAl9CkBAIC0yNjUsMTIgKzI2NywxMCBAQAogc3RhdGljIHZvaWQKIG5mczRfY2xvc2VfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCkKIHsKLQlzdHJ1Y3QgZmlsZSAqZmlscCA9IGZpbmRfcmVhZGFibGVfZmlsZShkcC0+ZGxfZmlsZSk7Ci0KIAlkcHJpbnRrKCJORlNEOiBjbG9zZV9kZWxlZ2F0aW9uIGRwICVwXG4iLGRwKTsKKwkvKiBYWFg6IGRvIHdlIGV2ZW4gbmVlZCB0aGlzIGNoZWNrPzogKi8KIAlpZiAoZHAtPmRsX2Zsb2NrKQotCQl2ZnNfc2V0bGVhc2UoZmlscCwgRl9VTkxDSywgJmRwLT5kbF9mbG9jayk7Ci0JbmZzNF9maWxlX3B1dF9hY2Nlc3MoZHAtPmRsX2ZpbGUsIE9fUkRPTkxZKTsKKwkJdmZzX3NldGxlYXNlKGRwLT5kbF92ZnNfZmlsZSwgRl9VTkxDSywgJmRwLT5kbF9mbG9jayk7CiB9CiAKIC8qIENhbGxlZCB1bmRlciB0aGUgc3RhdGUgbG9jay4gKi8KQEAgLTY0Miw2ICs2NDIsNyBAQAogCQlmcmVlX2Nvbm4oYyk7CiAJfQogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCW5mc2Q0X3Byb2JlX2NhbGxiYWNrKGNscCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZzZDRfY29ubiAqYWxsb2NfY29ubihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgZmxhZ3MpCkBAIC02NzksMTUgKzY4MCwxMiBAQAogCXJldHVybiByZWdpc3Rlcl94cHRfdXNlcihjb25uLT5jbl94cHJ0LCAmY29ubi0+Y25feHB0X3VzZXIpOwogfQogCi1zdGF0aWMgX19iZTMyIG5mc2Q0X25ld19jb25uKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMpCitzdGF0aWMgX19iZTMyIG5mc2Q0X25ld19jb25uKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMsIHUzMiBkaXIpCiB7CiAJc3RydWN0IG5mc2Q0X2Nvbm4gKmNvbm47Ci0JdTMyIGZsYWdzID0gTkZTNF9DREZDNF9GT1JFOwogCWludCByZXQ7CiAKLQlpZiAoc2VzLT5zZV9mbGFncyAmIFNFU1NJT040X0JBQ0tfQ0hBTikKLQkJZmxhZ3MgfD0gTkZTNF9DREZDNF9CQUNLOwotCWNvbm4gPSBhbGxvY19jb25uKHJxc3RwLCBmbGFncyk7CisJY29ubiA9IGFsbG9jX2Nvbm4ocnFzdHAsIGRpcik7CiAJaWYgKCFjb25uKQogCQlyZXR1cm4gbmZzZXJyX2p1a2Vib3g7CiAJbmZzZDRfaGFzaF9jb25uKGNvbm4sIHNlcyk7CkBAIC02OTgsNiArNjk2LDE3IEBACiAJcmV0dXJuIG5mc19vazsKIH0KIAorc3RhdGljIF9fYmUzMiBuZnNkNF9uZXdfY29ubl9mcm9tX2Nyc2VzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXMpCit7CisJdTMyIGRpciA9IE5GUzRfQ0RGQzRfRk9SRTsKKworCWlmIChzZXMtPnNlX2ZsYWdzICYgU0VTU0lPTjRfQkFDS19DSEFOKQorCQlkaXIgfD0gTkZTNF9DREZDNF9CQUNLOworCisJcmV0dXJuIG5mc2Q0X25ld19jb25uKHJxc3RwLCBzZXMsIGRpcik7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIHVuZGVyIGNsaWVudF9sb2NrICovCiBzdGF0aWMgdm9pZCBuZnNkNF9kZWxfY29ubnMoc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnMpCiB7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzLT5zZV9jbGllbnQ7CkBAIC03NDksNiArNzU4LDggQEAKIAkgKi8KIAlzbG90c2l6ZSA9IG5mc2Q0X3Nhbml0aXplX3Nsb3Rfc2l6ZShmY2hhbi0+bWF4cmVzcF9jYWNoZWQpOwogCW51bXNsb3RzID0gbmZzZDRfZ2V0X2RyY19tZW0oc2xvdHNpemUsIGZjaGFuLT5tYXhyZXFzKTsKKwlpZiAobnVtc2xvdHMgPCAxKQorCQlyZXR1cm4gTlVMTDsKIAogCW5ldyA9IGFsbG9jX3Nlc3Npb24oc2xvdHNpemUsIG51bXNsb3RzKTsKIAlpZiAoIW5ldykgewpAQCAtNzY5LDI1ICs3ODAsMzAgQEAKIAlpZHggPSBoYXNoX3Nlc3Npb25pZCgmbmV3LT5zZV9zZXNzaW9uaWQpOwogCXNwaW5fbG9jaygmY2xpZW50X2xvY2spOwogCWxpc3RfYWRkKCZuZXctPnNlX2hhc2gsICZzZXNzaW9uaWRfaGFzaHRibFtpZHhdKTsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJbGlzdF9hZGQoJm5ldy0+c2VfcGVyY2xudCwgJmNscC0+Y2xfc2Vzc2lvbnMpOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXNwaW5fdW5sb2NrKCZjbGllbnRfbG9jayk7CiAKLQlzdGF0dXMgPSBuZnNkNF9uZXdfY29ubihycXN0cCwgbmV3KTsKKwlzdGF0dXMgPSBuZnNkNF9uZXdfY29ubl9mcm9tX2Nyc2VzKHJxc3RwLCBuZXcpOwogCS8qIHdob29wczogYmVubnkgcG9pbnRzIG91dCwgc3RhdHVzIGlzIGlnbm9yZWQhIChlcnIsIG9yIGJvZ3VzKSAqLwogCWlmIChzdGF0dXMpIHsKIAkJZnJlZV9zZXNzaW9uKCZuZXctPnNlX3JlZik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoIWNscC0+Y2xfY2Jfc2Vzc2lvbiAmJiAoY3Nlcy0+ZmxhZ3MgJiBTRVNTSU9ONF9CQUNLX0NIQU4pKSB7CisJaWYgKGNzZXMtPmZsYWdzICYgU0VTU0lPTjRfQkFDS19DSEFOKSB7CiAJCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBzdmNfYWRkcihycXN0cCk7Ci0KLQkJY2xwLT5jbF9jYl9zZXNzaW9uID0gbmV3OwotCQljbHAtPmNsX2NiX2Nvbm4uY2JfeHBydCA9IHJxc3RwLT5ycV94cHJ0OwotCQlzdmNfeHBydF9nZXQocnFzdHAtPnJxX3hwcnQpOworCQkvKgorCQkgKiBUaGlzIGlzIGEgbGl0dGxlIHNpbGx5OyB3aXRoIHNlc3Npb25zIHRoZXJlJ3Mgbm8gcmVhbAorCQkgKiB1c2UgZm9yIHRoZSBjYWxsYmFjayBhZGRyZXNzLiAgVXNlIHRoZSBwZWVyIGFkZHJlc3MKKwkJICogYXMgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9yIG5vdywgYnV0IGNvbnNpZGVyIGZpeGluZworCQkgKiB0aGUgcnBjIGNsaWVudCBub3QgdG8gcmVxdWlyZSBhbiBhZGRyZXNzIGluIHRoZQorCQkgKiBmdXR1cmU6CisJCSAqLwogCQlycGNfY29weV9hZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xwLT5jbF9jYl9jb25uLmNiX2FkZHIsIHNhKTsKIAkJY2xwLT5jbF9jYl9jb25uLmNiX2FkZHJsZW4gPSBzdmNfYWRkcl9sZW4oc2EpOwotCQluZnNkNF9wcm9iZV9jYWxsYmFjayhjbHApOwogCX0KKwluZnNkNF9wcm9iZV9jYWxsYmFjayhjbHApOwogCXJldHVybiBuZXc7CiB9CiAKQEAgLTgxNyw3ICs4MzMsOSBAQAogdW5oYXNoX3Nlc3Npb24oc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnNlcykKIHsKIAlsaXN0X2RlbCgmc2VzLT5zZV9oYXNoKTsKKwlzcGluX2xvY2soJnNlcy0+c2VfY2xpZW50LT5jbF9sb2NrKTsKIAlsaXN0X2RlbCgmc2VzLT5zZV9wZXJjbG50KTsKKwlzcGluX3VubG9jaygmc2VzLT5zZV9jbGllbnQtPmNsX2xvY2spOwogfQogCiAvKiBtdXN0IGJlIGNhbGxlZCB1bmRlciB0aGUgY2xpZW50X2xvY2sgKi8KQEAgLTkyMyw4ICs5NDEsMTAgQEAKIAogCW1hcmtfY2xpZW50X2V4cGlyZWQoY2xwKTsKIAlsaXN0X2RlbCgmY2xwLT5jbF9scnUpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcywgJmNscC0+Y2xfc2Vzc2lvbnMsIHNlX3BlcmNsbnQpCiAJCWxpc3RfZGVsX2luaXQoJnNlcy0+c2VfaGFzaCk7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDUxLDEyICsxMDcxLDEzIEBACiAKIAltZW1jcHkoY2xwLT5jbF9yZWNkaXIsIHJlY2RpciwgSEVYRElSX0xFTik7CiAJYXRvbWljX3NldCgmY2xwLT5jbF9yZWZjb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmY2xwLT5jbF9jYl9zZXQsIDApOworCWNscC0+Y2xfY2Jfc3RhdGUgPSBORlNENF9DQl9VTktOT1dOOwogCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2lkaGFzaCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfc3RyaGFzaCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfb3Blbm93bmVycyk7CiAJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfZGVsZWdhdGlvbnMpOwogCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2xydSk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfY2FsbGJhY2tzKTsKIAlzcGluX2xvY2tfaW5pdCgmY2xwLT5jbF9sb2NrKTsKIAlJTklUX1dPUksoJmNscC0+Y2xfY2JfbnVsbC5jYl93b3JrLCBuZnNkNF9kb19jYWxsYmFja19ycGMpOwogCWNscC0+Y2xfdGltZSA9IGdldF9zZWNvbmRzKCk7CkBAIC0xMTMyLDU0ICsxMTUzLDU1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBSZXR1cm4gMSBpZmYgY2xwJ3MgY2xpZW50aWQgZXN0YWJsaXNobWVudCBtZXRob2QgbWF0Y2hlcyB0aGUgdXNlX2V4Y2hhbmdlX2lkCi0gKiBwYXJhbWV0ZXIuIE1hdGNoaW5nIGlzIGJhc2VkIG9uIHRoZSBmYWN0IHRoZSBhdCBsZWFzdCBvbmUgb2YgdGhlCi0gKiBFWENIR0lENF9GTEFHX1VTRV97Tk9OX1BORlMsUE5GU19NRFMsUE5GU19EU30gZmxhZ3MgbXVzdCBiZSBzZXQgZm9yIHY0LjEKLSAqCi0gKiBGSVhNRTogd2UgbmVlZCB0byB1bmlmeSB0aGUgY2xpZW50aWQgbmFtZXNwYWNlcyBmb3IgbmZzdjQueAotICogYW5kIGNvcnJlY3RseSBkZWFsIHdpdGggY2xpZW50IHVwZ3JhZGUvZG93bmdyYWRlIGluIEVYQ0hBTkdFX0lECi0gKiBhbmQgU0VUX0NMSUVOVElEeyxfQ09ORklSTX0KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLW1hdGNoX2NsaWVudGlkX2VzdGFibGlzaG1lbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIGJvb2wgdXNlX2V4Y2hhbmdlX2lkKQorc3RhdGljIGJvb2wgY2xwX3VzZWRfZXhjaGFuZ2VpZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKIHsKLQlib29sIGhhc19leGNoYW5nZV9mbGFncyA9IChjbHAtPmNsX2V4Y2hhbmdlX2ZsYWdzICE9IDApOwotCXJldHVybiB1c2VfZXhjaGFuZ2VfaWQgPT0gaGFzX2V4Y2hhbmdlX2ZsYWdzOwotfQorCXJldHVybiBjbHAtPmNsX2V4Y2hhbmdlX2ZsYWdzICE9IDA7Cit9IAogCiBzdGF0aWMgc3RydWN0IG5mczRfY2xpZW50ICoKLWZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIoY29uc3QgY2hhciAqZG5hbWUsIHVuc2lnbmVkIGludCBoYXNodmFsLAotCQkJICAgICBib29sIHVzZV9leGNoYW5nZV9pZCkKK2ZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIoY29uc3QgY2hhciAqZG5hbWUsIHVuc2lnbmVkIGludCBoYXNodmFsKQogewogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZjb25mX3N0cl9oYXNodGJsW2hhc2h2YWxdLCBjbF9zdHJoYXNoKSB7Ci0JCWlmIChzYW1lX25hbWUoY2xwLT5jbF9yZWNkaXIsIGRuYW1lKSAmJgotCQkgICAgbWF0Y2hfY2xpZW50aWRfZXN0YWJsaXNobWVudChjbHAsIHVzZV9leGNoYW5nZV9pZCkpCisJCWlmIChzYW1lX25hbWUoY2xwLT5jbF9yZWNkaXIsIGRuYW1lKSkKIAkJCXJldHVybiBjbHA7CiAJfQogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IG5mczRfY2xpZW50ICoKLWZpbmRfdW5jb25maXJtZWRfY2xpZW50X2J5X3N0cihjb25zdCBjaGFyICpkbmFtZSwgdW5zaWduZWQgaW50IGhhc2h2YWwsCi0JCQkgICAgICAgYm9vbCB1c2VfZXhjaGFuZ2VfaWQpCitmaW5kX3VuY29uZmlybWVkX2NsaWVudF9ieV9zdHIoY29uc3QgY2hhciAqZG5hbWUsIHVuc2lnbmVkIGludCBoYXNodmFsKQogewogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZ1bmNvbmZfc3RyX2hhc2h0YmxbaGFzaHZhbF0sIGNsX3N0cmhhc2gpIHsKLQkJaWYgKHNhbWVfbmFtZShjbHAtPmNsX3JlY2RpciwgZG5hbWUpICYmCi0JCSAgICBtYXRjaF9jbGllbnRpZF9lc3RhYmxpc2htZW50KGNscCwgdXNlX2V4Y2hhbmdlX2lkKSkKKwkJaWYgKHNhbWVfbmFtZShjbHAtPmNsX3JlY2RpciwgZG5hbWUpKQogCQkJcmV0dXJuIGNscDsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIHJwY19zdmNhZGRyMnNvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EsIHVuc2lnbmVkIHNob3J0IGZhbWlseSwgdW5pb24gc3ZjX2FkZHJfdSAqc3ZjYWRkcikKK3sKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIgPSBzdmNhZGRyLT5hZGRyOworCQlyZXR1cm47CisJY2FzZSBBRl9JTkVUNjoKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkciA9IHN2Y2FkZHItPmFkZHI2OworCQlyZXR1cm47CisJfQorfQorCiBzdGF0aWMgdm9pZAotZ2VuX2NhbGxiYWNrKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNlLCB1MzIgc2NvcGVpZCkKK2dlbl9jYWxsYmFjayhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkICpzZSwgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3QgbmZzNF9jYl9jb25uICpjb25uID0gJmNscC0+Y2xfY2JfY29ubjsKKwlzdHJ1Y3Qgc29ja2FkZHIJKnNhID0gc3ZjX2FkZHIocnFzdHApOworCXUzMiBzY29wZWlkID0gcnBjX2dldF9zY29wZV9pZChzYSk7CiAJdW5zaWduZWQgc2hvcnQgZXhwZWN0ZWRfZmFtaWx5OwogCiAJLyogQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGNwIGFuZCB0Y3A2IGZvciB0aGUgY2FsbGJhY2sgY2hhbm5lbCAqLwpAQCAtMTIwNSw2ICsxMjI3LDcgQEAKIAogCWNvbm4tPmNiX3Byb2cgPSBzZS0+c2VfY2FsbGJhY2tfcHJvZzsKIAljb25uLT5jYl9pZGVudCA9IHNlLT5zZV9jYWxsYmFja19pZGVudDsKKwlycGNfc3ZjYWRkcjJzb2NrYWRkcigoc3RydWN0IHNvY2thZGRyICopJmNvbm4tPmNiX3NhZGRyLCBleHBlY3RlZF9mYW1pbHksICZycXN0cC0+cnFfZGFkZHIpOwogCXJldHVybjsKIG91dF9lcnI6CiAJY29ubi0+Y2JfYWRkci5zc19mYW1pbHkgPSBBRl9VTlNQRUM7CkBAIC0xMzQ0LDcgKzEzNjcsNyBAQAogCWNhc2UgU1A0X05PTkU6CiAJCWJyZWFrOwogCWNhc2UgU1A0X1NTVjoKLQkJcmV0dXJuIG5mc2Vycl9lbmNyX2FsZ191bnN1cHA7CisJCXJldHVybiBuZnNlcnJfc2VydmVyZmF1bHQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CQkJCS8qIGNoZWNrZWQgYnkgeGRyIGNvZGUgKi8KIAljYXNlIFNQNF9NQUNIX0NSRUQ6CkBAIC0xMzYxLDggKzEzODQsMTIgQEAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAlzdGF0dXMgPSBuZnNfb2s7CiAKLQljb25mID0gZmluZF9jb25maXJtZWRfY2xpZW50X2J5X3N0cihkbmFtZSwgc3RyaGFzaHZhbCwgdHJ1ZSk7CisJY29uZiA9IGZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwpOwogCWlmIChjb25mKSB7CisJCWlmICghY2xwX3VzZWRfZXhjaGFuZ2VpZChjb25mKSkgeworCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7IC8qIFhYWDogPyAqLworCQkJZ290byBvdXQ7CisJCX0KIAkJaWYgKCFzYW1lX3ZlcmYoJnZlcmYsICZjb25mLT5jbF92ZXJpZmllcikpIHsKIAkJCS8qIDE4LjM1LjQgY2FzZSA4ICovCiAJCQlpZiAoZXhpZC0+ZmxhZ3MgJiBFWENIR0lENF9GTEFHX1VQRF9DT05GSVJNRURfUkVDX0EpIHsKQEAgLTE0MDMsNyArMTQzMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXVuY29uZiAgPSBmaW5kX3VuY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwsIHRydWUpOworCXVuY29uZiAgPSBmaW5kX3VuY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwpOwogCWlmICh1bmNvbmYpIHsKIAkJLyoKIAkJICogUG9zc2libGUgcmV0cnkgb3IgY2xpZW50IHJlc3RhcnQuICBQZXIgMTguMzUuNCBjYXNlIDQsCkBAIC0xNTYwLDYgKzE1ODcsOCBAQAogCXN0YXR1cyA9IG5mc19vazsKIAltZW1jcHkoY3Jfc2VzLT5zZXNzaW9uaWQuZGF0YSwgbmV3LT5zZV9zZXNzaW9uaWQuZGF0YSwKIAkgICAgICAgTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7CisJbWVtY3B5KCZjcl9zZXMtPmZvcmVfY2hhbm5lbCwgJm5ldy0+c2VfZmNoYW5uZWwsCisJCXNpemVvZihzdHJ1Y3QgbmZzZDRfY2hhbm5lbF9hdHRycykpOwogCWNzX3Nsb3QtPnNsX3NlcWlkKys7CiAJY3Jfc2VzLT5zZXFpZCA9IGNzX3Nsb3QtPnNsX3NlcWlkOwogCkBAIC0xNTgxLDYgKzE2MTAsNDUgQEAKIAlyZXR1cm4gYXJncC0+b3BjbnQgPT0gcmVzcC0+b3BjbnQ7CiB9CiAKK3N0YXRpYyBfX2JlMzIgbmZzZDRfbWFwX2JjdHNfZGlyKHUzMiAqZGlyKQoreworCXN3aXRjaCAoKmRpcikgeworCWNhc2UgTkZTNF9DREZDNF9GT1JFOgorCWNhc2UgTkZTNF9DREZDNF9CQUNLOgorCQlyZXR1cm4gbmZzX29rOworCWNhc2UgTkZTNF9DREZDNF9GT1JFX09SX0JPVEg6CisJY2FzZSBORlM0X0NERkM0X0JBQ0tfT1JfQk9USDoKKwkJKmRpciA9IE5GUzRfQ0RGQzRfQk9USDsKKwkJcmV0dXJuIG5mc19vazsKKwl9OworCXJldHVybiBuZnNlcnJfaW52YWw7Cit9CisKK19fYmUzMiBuZnNkNF9iaW5kX2Nvbm5fdG9fc2Vzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAorCQkgICAgIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAorCQkgICAgIHN0cnVjdCBuZnNkNF9iaW5kX2Nvbm5fdG9fc2Vzc2lvbiAqYmN0cykKK3sKKwlfX2JlMzIgc3RhdHVzOworCisJaWYgKCFuZnNkNF9sYXN0X2NvbXBvdW5kX29wKHJxc3RwKSkKKwkJcmV0dXJuIG5mc2Vycl9ub3Rfb25seV9vcDsKKwlzcGluX2xvY2soJmNsaWVudF9sb2NrKTsKKwljc3RhdGUtPnNlc3Npb24gPSBmaW5kX2luX3Nlc3Npb25pZF9oYXNodGJsKCZiY3RzLT5zZXNzaW9uaWQpOworCS8qIFNvcnRhIHdlaXJkOiB3ZSBvbmx5IG5lZWQgdGhlIHJlZmNudCdpbmcgYmVjYXVzZSBuZXdfY29ubiBhY3F1aXJlcworCSAqIGNsaWVudF9sb2NrIGlzZWxmOiAqLworCWlmIChjc3RhdGUtPnNlc3Npb24pIHsKKwkJbmZzZDRfZ2V0X3Nlc3Npb24oY3N0YXRlLT5zZXNzaW9uKTsKKwkJYXRvbWljX2luYygmY3N0YXRlLT5zZXNzaW9uLT5zZV9jbGllbnQtPmNsX3JlZmNvdW50KTsKKwl9CisJc3Bpbl91bmxvY2soJmNsaWVudF9sb2NrKTsKKwlpZiAoIWNzdGF0ZS0+c2Vzc2lvbikKKwkJcmV0dXJuIG5mc2Vycl9iYWRzZXNzaW9uOworCisJc3RhdHVzID0gbmZzZDRfbWFwX2JjdHNfZGlyKCZiY3RzLT5kaXIpOworCW5mc2Q0X25ld19jb25uKHJxc3RwLCBjc3RhdGUtPnNlc3Npb24sIGJjdHMtPmRpcik7CisJcmV0dXJuIG5mc19vazsKK30KKwogc3RhdGljIGJvb2wgbmZzZDRfY29tcG91bmRfaW5fc2Vzc2lvbihzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IG5mczRfc2Vzc2lvbmlkICpzaWQpCiB7CiAJaWYgKCFzZXNzaW9uKQpAQCAtMTYxOSw4ICsxNjg3LDcgQEAKIAlzcGluX3VubG9jaygmY2xpZW50X2xvY2spOwogCiAJbmZzNF9sb2NrX3N0YXRlKCk7Ci0JLyogd2FpdCBmb3IgY2FsbGJhY2tzICovCi0JbmZzZDRfc2h1dGRvd25fY2FsbGJhY2soc2VzLT5zZV9jbGllbnQpOworCW5mc2Q0X3Byb2JlX2NhbGxiYWNrX3N5bmMoc2VzLT5zZV9jbGllbnQpOwogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAKIAluZnNkNF9kZWxfY29ubnMoc2VzKTsKQEAgLTE3MzMsOCArMTgwMCwxMiBAQAogb3V0OgogCS8qIEhvbGQgYSBzZXNzaW9uIHJlZmVyZW5jZSB1bnRpbCBkb25lIHByb2Nlc3NpbmcgdGhlIGNvbXBvdW5kLiAqLwogCWlmIChjc3RhdGUtPnNlc3Npb24pIHsKKwkJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXNzaW9uLT5zZV9jbGllbnQ7CisKIAkJbmZzZDRfZ2V0X3Nlc3Npb24oY3N0YXRlLT5zZXNzaW9uKTsKLQkJYXRvbWljX2luYygmc2Vzc2lvbi0+c2VfY2xpZW50LT5jbF9yZWZjb3VudCk7CisJCWF0b21pY19pbmMoJmNscC0+Y2xfcmVmY291bnQpOworCQlpZiAoY2xwLT5jbF9jYl9zdGF0ZSA9PSBORlNENF9DQl9ET1dOKQorCQkJc2VxLT5zdGF0dXNfZmxhZ3MgfD0gU0VRNF9TVEFUVVNfQ0JfUEFUSF9ET1dOOwogCX0KIAlrZnJlZShjb25uKTsKIAlzcGluX3VubG9jaygmY2xpZW50X2xvY2spOwpAQCAtMTc3NSw3ICsxODQ2LDYgQEAKIG5mc2Q0X3NldGNsaWVudGlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqY3N0YXRlLAogCQkgIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2V0Y2xpZCkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHIJCSpzYSA9IHN2Y19hZGRyKHJxc3RwKTsKIAlzdHJ1Y3QgeGRyX25ldG9iaiAJY2xuYW1lID0geyAKIAkJLmxlbiA9IHNldGNsaWQtPnNlX25hbWVsZW4sCiAJCS5kYXRhID0gc2V0Y2xpZC0+c2VfbmFtZSwKQEAgLTE4MDEsMTAgKzE4NzEsMTIgQEAKIAlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoZG5hbWUpOwogCiAJbmZzNF9sb2NrX3N0YXRlKCk7Ci0JY29uZiA9IGZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwsIGZhbHNlKTsKKwljb25mID0gZmluZF9jb25maXJtZWRfY2xpZW50X2J5X3N0cihkbmFtZSwgc3RyaGFzaHZhbCk7CiAJaWYgKGNvbmYpIHsKIAkJLyogUkZDIDM1MzAgMTQuMi4zMyBDQVNFIDA6ICovCiAJCXN0YXR1cyA9IG5mc2Vycl9jbGlkX2ludXNlOworCQlpZiAoY2xwX3VzZWRfZXhjaGFuZ2VpZChjb25mKSkKKwkJCWdvdG8gb3V0OwogCQlpZiAoIXNhbWVfY3JlZHMoJmNvbmYtPmNsX2NyZWQsICZycXN0cC0+cnFfY3JlZCkpIHsKIAkJCWNoYXIgYWRkcl9zdHJbSU5FVDZfQUREUlNUUkxFTl07CiAJCQlycGNfbnRvcCgoc3RydWN0IHNvY2thZGRyICopICZjb25mLT5jbF9hZGRyLCBhZGRyX3N0ciwKQEAgLTE4MTksNyArMTg5MSw3IEBACiAJICogaGFzIGEgZGVzY3JpcHRpb24gb2YgU0VUQ0xJRU5USUQgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbnNpc3RpbmcKIAkgKiBvZiA1IGJ1bGxldCBwb2ludHMsIGxhYmVsZWQgYXMgQ0FTRTAgLSBDQVNFNCBiZWxvdy4KIAkgKi8KLQl1bmNvbmYgPSBmaW5kX3VuY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwsIGZhbHNlKTsKKwl1bmNvbmYgPSBmaW5kX3VuY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwpOwogCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKIAlpZiAoIWNvbmYpIHsKIAkJLyoKQEAgLTE4NzYsNyArMTk0OCw3IEBACiAJICogZm9yIGNvbnNpc3RlbnQgbWlub3J2ZXJzaW9uIHVzZSB0aHJvdWdob3V0OgogCSAqLwogCW5ldy0+Y2xfbWlub3J2ZXJzaW9uID0gMDsKLQlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkLCBycGNfZ2V0X3Njb3BlX2lkKHNhKSk7CisJZ2VuX2NhbGxiYWNrKG5ldywgc2V0Y2xpZCwgcnFzdHApOwogCWFkZF90b191bmNvbmZpcm1lZChuZXcsIHN0cmhhc2h2YWwpOwogCXNldGNsaWQtPnNlX2NsaWVudGlkLmNsX2Jvb3QgPSBuZXctPmNsX2NsaWVudGlkLmNsX2Jvb3Q7CiAJc2V0Y2xpZC0+c2VfY2xpZW50aWQuY2xfaWQgPSBuZXctPmNsX2NsaWVudGlkLmNsX2lkOwpAQCAtMTkzNSw3ICsyMDA3LDYgQEAKIAkJaWYgKCFzYW1lX2NyZWRzKCZjb25mLT5jbF9jcmVkLCAmdW5jb25mLT5jbF9jcmVkKSkKIAkJCXN0YXR1cyA9IG5mc2Vycl9jbGlkX2ludXNlOwogCQllbHNlIHsKLQkJCWF0b21pY19zZXQoJmNvbmYtPmNsX2NiX3NldCwgMCk7CiAJCQluZnNkNF9jaGFuZ2VfY2FsbGJhY2soY29uZiwgJnVuY29uZi0+Y2xfY2JfY29ubik7CiAJCQluZnNkNF9wcm9iZV9jYWxsYmFjayhjb25mKTsKIAkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKQEAgLTE5NjQsNyArMjAzNSw3IEBACiAJCQl1bnNpZ25lZCBpbnQgaGFzaCA9CiAJCQkJY2xpZW50c3RyX2hhc2h2YWwodW5jb25mLT5jbF9yZWNkaXIpOwogCQkJY29uZiA9IGZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIodW5jb25mLT5jbF9yZWNkaXIsCi0JCQkJCQkJICAgIGhhc2gsIGZhbHNlKTsKKwkJCQkJCQkgICAgaGFzaCk7CiAJCQlpZiAoY29uZikgewogCQkJCW5mc2Q0X3JlbW92ZV9jbGlkX2Rpcihjb25mKTsKIAkJCQlleHBpcmVfY2xpZW50KGNvbmYpOwpAQCAtMjMwMCw0MSArMjM3MSw2IEBACiAJbmZzZDRfY2JfcmVjYWxsKGRwKTsKIH0KIAotLyoKLSAqIFRoZSBmaWxlX2xvY2sgaXMgYmVpbmcgcmVhcGQuCi0gKgotICogQ2FsbGVkIGJ5IGxvY2tzX2ZyZWVfbG9jaygpIHdpdGggbG9ja19mbG9ja3MoKSBoZWxkLgotICovCi1zdGF0aWMKLXZvaWQgbmZzZF9yZWxlYXNlX2RlbGVnX2NiKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQotewotCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKilmbC0+Zmxfb3duZXI7Ci0KLQlkcHJpbnRrKCJORlNEIG5mc2RfcmVsZWFzZV9kZWxlZ19jYjogZmwgJXAgZHAgJXAgZGxfY291bnQgJWRcbiIsIGZsLGRwLCBhdG9taWNfcmVhZCgmZHAtPmRsX2NvdW50KSk7Ci0KLQlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9MRUFTRSkgfHwgIWRwKQotCQlyZXR1cm47Ci0JZHAtPmRsX2Zsb2NrID0gTlVMTDsKLX0KLQotLyoKLSAqIENhbGxlZCBmcm9tIHNldGxlYXNlKCkgd2l0aCBsb2NrX2Zsb2NrcygpIGhlbGQKLSAqLwotc3RhdGljCi1pbnQgbmZzZF9zYW1lX2NsaWVudF9kZWxlZ19jYihzdHJ1Y3QgZmlsZV9sb2NrICpvbmxpc3QsIHN0cnVjdCBmaWxlX2xvY2sgKnRyeSkKLXsKLQlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpvbmxpc3RkID0KLQkJKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKilvbmxpc3QtPmZsX293bmVyOwotCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKnRyeWQgPQotCQkoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKXRyeS0+Zmxfb3duZXI7Ci0KLQlpZiAob25saXN0LT5mbF9sbW9wcyAhPSB0cnktPmZsX2xtb3BzKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBvbmxpc3RkLT5kbF9jbGllbnQgPT0gdHJ5ZC0+ZGxfY2xpZW50OwotfQotCi0KIHN0YXRpYwogaW50IG5mc2RfY2hhbmdlX2RlbGVnX2NiKHN0cnVjdCBmaWxlX2xvY2sgKipvbmxpc3QsIGludCBhcmcpCiB7CkBAIC0yMzQ2LDggKzIzODIsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxvY2tfbWFuYWdlcl9vcGVyYXRpb25zIG5mc2RfbGVhc2VfbW5nX29wcyA9IHsKIAkuZmxfYnJlYWsgPSBuZnNkX2JyZWFrX2RlbGVnX2NiLAotCS5mbF9yZWxlYXNlX3ByaXZhdGUgPSBuZnNkX3JlbGVhc2VfZGVsZWdfY2IsCi0JLmZsX215bGVhc2UgPSBuZnNkX3NhbWVfY2xpZW50X2RlbGVnX2NiLAogCS5mbF9jaGFuZ2UgPSBuZnNkX2NoYW5nZV9kZWxlZ19jYiwKIH07CiAKQEAgLTI1MTQsOCArMjU0OCw2IEBACiAJaWYgKCFmcC0+ZmlfZmRzW29mbGFnXSkgewogCQlzdGF0dXMgPSBuZnNkX29wZW4ocnFzdHAsIGN1cl9maCwgU19JRlJFRywgYWNjZXNzLAogCQkJJmZwLT5maV9mZHNbb2ZsYWddKTsKLQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfZHJvcGl0KQotCQkJc3RhdHVzID0gbmZzZXJyX2p1a2Vib3g7CiAJCWlmIChzdGF0dXMpCiAJCQlyZXR1cm4gc3RhdHVzOwogCX0KQEAgLTI1OTYsNiArMjYyOCwxOSBAQAogCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX2NsaWVudC0+Y2xfZmlyc3RzdGF0ZSA9IDE7CiB9CiAKKy8qIFNob3VsZCB3ZSBnaXZlIG91dCByZWNhbGxhYmxlIHN0YXRlPzogKi8KK3N0YXRpYyBib29sIG5mc2Q0X2NiX2NoYW5uZWxfZ29vZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlpZiAoY2xwLT5jbF9jYl9zdGF0ZSA9PSBORlNENF9DQl9VUCkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgKiBJbiB0aGUgc2Vzc2lvbnMgY2FzZSwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byBlc3RhYmxpc2ggYQorCSAqIHNlcGFyYXRlIGNvbm5lY3Rpb24gZm9yIGNhbGxiYWNrcywgd2UgYXNzdW1lIGl0J3MgT0sKKwkgKiB1bnRpbCB3ZSBoZWFyIG90aGVyd2lzZToKKwkgKi8KKwlyZXR1cm4gY2xwLT5jbF9taW5vcnZlcnNpb24gJiYgY2xwLT5jbF9jYl9zdGF0ZSA9PSBORlNENF9DQl9VTktOT1dOOworfQorCiAvKgogICogQXR0ZW1wdCB0byBoYW5kIG91dCBhIGRlbGVnYXRpb24uCiAgKi8KQEAgLTI2MDQsMTAgKzI2NDksMTEgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBzdHAtPnN0X3N0YXRlb3duZXI7Ci0JaW50IGNiX3VwID0gYXRvbWljX3JlYWQoJnNvcC0+c29fY2xpZW50LT5jbF9jYl9zZXQpOworCWludCBjYl91cDsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKIAlpbnQgc3RhdHVzLCBmbGFnID0gMDsKIAorCWNiX3VwID0gbmZzZDRfY2JfY2hhbm5lbF9nb29kKHNvcC0+c29fY2xpZW50KTsKIAlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX05PTkU7CiAJb3Blbi0+b3BfcmVjYWxsID0gMDsKIAlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKQEAgLTI2NTUsNyArMjcwMSw3IEBACiAJZHAtPmRsX2Zsb2NrID0gZmw7CiAKIAkvKiB2ZnNfc2V0bGVhc2UgY2hlY2tzIHRvIHNlZSBpZiBkZWxlZ2F0aW9uIHNob3VsZCBiZSBoYW5kZWQgb3V0LgotCSAqIHRoZSBsb2NrX21hbmFnZXIgY2FsbGJhY2tzIGZsX215bGVhc2UgYW5kIGZsX2NoYW5nZSBhcmUgdXNlZAorCSAqIHRoZSBsb2NrX21hbmFnZXIgY2FsbGJhY2sgZmxfY2hhbmdlIGlzIHVzZWQKIAkgKi8KIAlpZiAoKHN0YXR1cyA9IHZmc19zZXRsZWFzZShmbC0+ZmxfZmlsZSwgZmwtPmZsX3R5cGUsICZmbCkpKSB7CiAJCWRwcmludGsoIk5GU0Q6IHNldGxlYXNlIGZhaWxlZCBbJWRdLCBubyBkZWxlZ2F0aW9uXG4iLCBzdGF0dXMpOwpAQCAtMjc5NCw3ICsyODQwLDcgQEAKIAlyZW5ld19jbGllbnQoY2xwKTsKIAlzdGF0dXMgPSBuZnNlcnJfY2JfcGF0aF9kb3duOwogCWlmICghbGlzdF9lbXB0eSgmY2xwLT5jbF9kZWxlZ2F0aW9ucykKLQkJCSYmICFhdG9taWNfcmVhZCgmY2xwLT5jbF9jYl9zZXQpKQorCQkJJiYgY2xwLT5jbF9jYl9zdGF0ZSAhPSBORlNENF9DQl9VUCkKIAkJZ290byBvdXQ7CiAJc3RhdHVzID0gbmZzX29rOwogb3V0OgpAQCAtMzA4MSw5ICszMTI3LDEwIEBACiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKIAkJcmVuZXdfY2xpZW50KGRwLT5kbF9jbGllbnQpOwotCQlpZiAoZmlscHApCisJCWlmIChmaWxwcCkgewogCQkJKmZpbHBwID0gZmluZF9yZWFkYWJsZV9maWxlKGRwLT5kbF9maWxlKTsKLQkJQlVHX09OKCEqZmlscHApOworCQkJQlVHX09OKCEqZmlscHApOworCQl9CiAJfSBlbHNlIHsgLyogb3BlbiBvciBsb2NrIHN0YXRlaWQgKi8KIAkJc3RwID0gZmluZF9zdGF0ZWlkKHN0YXRlaWQsIGZsYWdzKTsKIAkJaWYgKCFzdHApCkBAIC00MTA3LDcgKzQxNTQsNyBAQAogCXVuc2lnbmVkIGludCBzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwobmFtZSk7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CiAKLQljbHAgPSBmaW5kX2NvbmZpcm1lZF9jbGllbnRfYnlfc3RyKG5hbWUsIHN0cmhhc2h2YWwsIHVzZV9leGNoYW5nZV9pZCk7CisJY2xwID0gZmluZF9jb25maXJtZWRfY2xpZW50X2J5X3N0cihuYW1lLCBzdHJoYXNodmFsKTsKIAlyZXR1cm4gY2xwID8gMSA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggZjM1YTk0YS4uOTU2NjI5YiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTQ0LDEzICs0NCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2RfaWRtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgogCisjaW5jbHVkZSAiaWRtYXAuaCIKKyNpbmNsdWRlICJhY2wuaCIKICNpbmNsdWRlICJ4ZHI0LmgiCiAjaW5jbHVkZSAidmZzLmgiCiAKKwogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1hEUgogCiAvKgpAQCAtMjg4LDE3ICsyODksMTcgQEAKIAkJCWxlbiArPSBYRFJfUVVBRExFTihkdW1teTMyKSA8PCAyOwogCQkJUkVBRE1FTShidWYsIGR1bW15MzIpOwogCQkJYWNlLT53aG90eXBlID0gbmZzNF9hY2xfZ2V0X3dob3R5cGUoYnVmLCBkdW1teTMyKTsKLQkJCWhvc3RfZXJyID0gMDsKKwkJCXN0YXR1cyA9IG5mc19vazsKIAkJCWlmIChhY2UtPndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQogCQkJCWFjZS0+d2hvID0gMDsKIAkJCWVsc2UgaWYgKGFjZS0+ZmxhZyAmIE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVApCi0JCQkJaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwKKwkJCQlzdGF0dXMgPSBuZnNkX21hcF9uYW1lX3RvX2dpZChhcmdwLT5ycXN0cCwKIAkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS0+d2hvKTsKIAkJCWVsc2UKLQkJCQlob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLAorCQkJCXN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLAogCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLT53aG8pOwotCQkJaWYgKGhvc3RfZXJyKQotCQkJCWdvdG8gb3V0X25mc2VycjsKKwkJCWlmIChzdGF0dXMpCisJCQkJcmV0dXJuIHN0YXR1czsKIAkJfQogCX0gZWxzZQogCQkqYWNsID0gTlVMTDsKQEAgLTQyMCw2ICs0MjEsMjEgQEAKIAlERUNPREVfVEFJTDsKIH0KIAorc3RhdGljIF9fYmUzMiBuZnNkNF9kZWNvZGVfYmluZF9jb25uX3RvX3Nlc3Npb24oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2JpbmRfY29ubl90b19zZXNzaW9uICpiY3RzKQoreworCURFQ09ERV9IRUFEOworCXUzMiBkdW1teTsKKworCVJFQURfQlVGKE5GUzRfTUFYX1NFU1NJT05JRF9MRU4gKyA4KTsKKwlDT1BZTUVNKGJjdHMtPnNlc3Npb25pZC5kYXRhLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKTsKKwlSRUFEMzIoYmN0cy0+ZGlyKTsKKwkvKiBYWFg6IFBlcmhhcHMgVG9tIFR1Y2tlciBjb3VsZCBoZWxwIHVzIGZpZ3VyZSBvdXQgaG93IHdlCisJICogc2hvdWxkIGJlIHVzaW5nIGN0c2FfdXNlX2Nvbm5faW5fcmRtYV9tb2RlOiAqLworCVJFQUQzMihkdW1teSk7CisKKwlERUNPREVfVEFJTDsKK30KKwogc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2Nsb3NlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UpCiB7CkBAIC04NDcsNiArODYzLDE3IEBACiB9CiAKIHN0YXRpYyBfX2JlMzIKK25mc2Q0X2RlY29kZV9zZWNpbmZvX25vX25hbWUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwKKwkJICAgICBzdHJ1Y3QgbmZzZDRfc2VjaW5mb19ub19uYW1lICpzaW4pCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoc2luLT5zaW5fc3R5bGUpOworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgX19iZTMyCiBuZnNkNF9kZWNvZGVfc2V0YXR0cihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKIAlfX2JlMzIgc3RhdHVzOwpAQCAtMTAwNSw3ICsxMDMyLDcgQEAKIG5mc2Q0X2RlY29kZV9leGNoYW5nZV9pZChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAogCQkJIHN0cnVjdCBuZnNkNF9leGNoYW5nZV9pZCAqZXhpZCkKIHsKLQlpbnQgZHVtbXk7CisJaW50IGR1bW15LCB0bXA7CiAJREVDT0RFX0hFQUQ7CiAKIAlSRUFEX0JVRihORlM0X1ZFUklGSUVSX1NJWkUpOwpAQCAtMTA1MywxNSArMTA4MCwyMyBAQAogCiAJCS8qIHNzcF9oYXNoX2FsZ3M8PiAqLwogCQlSRUFEX0JVRig0KTsKLQkJUkVBRDMyKGR1bW15KTsKLQkJUkVBRF9CVUYoZHVtbXkpOwotCQlwICs9IFhEUl9RVUFETEVOKGR1bW15KTsKKwkJUkVBRDMyKHRtcCk7CisJCXdoaWxlICh0bXAtLSkgeworCQkJUkVBRF9CVUYoNCk7CisJCQlSRUFEMzIoZHVtbXkpOworCQkJUkVBRF9CVUYoZHVtbXkpOworCQkJcCArPSBYRFJfUVVBRExFTihkdW1teSk7CisJCX0KIAogCQkvKiBzc3BfZW5jcl9hbGdzPD4gKi8KIAkJUkVBRF9CVUYoNCk7Ci0JCVJFQUQzMihkdW1teSk7Ci0JCVJFQURfQlVGKGR1bW15KTsKLQkJcCArPSBYRFJfUVVBRExFTihkdW1teSk7CisJCVJFQUQzMih0bXApOworCQl3aGlsZSAodG1wLS0pIHsKKwkJCVJFQURfQlVGKDQpOworCQkJUkVBRDMyKGR1bW15KTsKKwkJCVJFQURfQlVGKGR1bW15KTsKKwkJCXAgKz0gWERSX1FVQURMRU4oZHVtbXkpOworCQl9CiAKIAkJLyogc3NwX3dpbmRvdyBhbmQgc3NwX251bV9nc3NfaGFuZGxlcyAqLwogCQlSRUFEX0JVRig4KTsKQEAgLTEzMzksNyArMTM3NCw3IEBACiAKIAkvKiBuZXcgb3BlcmF0aW9ucyBmb3IgTkZTdjQuMSAqLwogCVtPUF9CQUNLQ0hBTk5FTF9DVExdCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKLQlbT1BfQklORF9DT05OX1RPX1NFU1NJT05dPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9ub3RzdXBwLAorCVtPUF9CSU5EX0NPTk5fVE9fU0VTU0lPTl09IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX2JpbmRfY29ubl90b19zZXNzaW9uLAogCVtPUF9FWENIQU5HRV9JRF0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9leGNoYW5nZV9pZCwKIAlbT1BfQ1JFQVRFX1NFU1NJT05dCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfY3JlYXRlX3Nlc3Npb24sCiAJW09QX0RFU1RST1lfU0VTU0lPTl0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9kZXN0cm95X3Nlc3Npb24sCkBAIC0xMzUwLDcgKzEzODUsNyBAQAogCVtPUF9MQVlPVVRDT01NSVRdCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKIAlbT1BfTEFZT1VUR0VUXQkJPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9ub3RzdXBwLAogCVtPUF9MQVlPVVRSRVRVUk5dCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKLQlbT1BfU0VDSU5GT19OT19OQU1FXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCisJW09QX1NFQ0lORk9fTk9fTkFNRV0JPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9zZWNpbmZvX25vX25hbWUsCiAJW09QX1NFUVVFTkNFXQkJPSAobmZzZDRfZGVjKW5mc2Q0X2RlY29kZV9zZXF1ZW5jZSwKIAlbT1BfU0VUX1NTVl0JCT0gKG5mc2Q0X2RlYyluZnNkNF9kZWNvZGVfbm90c3VwcCwKIAlbT1BfVEVTVF9TVEFURUlEXQk9IChuZnNkNF9kZWMpbmZzZDRfZGVjb2RlX25vdHN1cHAsCkBAIC0yMzA5LDggKzIzNDQsNiBAQAogCWNhc2UgbmZzZXJyX3Jlc291cmNlOgogCQluZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CiAJCWdvdG8gZmFpbDsKLQljYXNlIG5mc2Vycl9kcm9waXQ6Ci0JCWdvdG8gZmFpbDsKIAljYXNlIG5mc2Vycl9ub2VudDoKIAkJZ290byBza2lwX2VudHJ5OwogCWRlZmF1bHQ6CkBAIC0yMzY1LDYgKzIzOTgsMjEgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCitzdGF0aWMgX19iZTMyIG5mc2Q0X2VuY29kZV9iaW5kX2Nvbm5fdG9fc2Vzc2lvbihzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsIHN0cnVjdCBuZnNkNF9iaW5kX2Nvbm5fdG9fc2Vzc2lvbiAqYmN0cykKK3sKKwlfX2JlMzIgKnA7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKE5GUzRfTUFYX1NFU1NJT05JRF9MRU4gKyA4KTsKKwkJV1JJVEVNRU0oYmN0cy0+c2Vzc2lvbmlkLmRhdGEsIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pOworCQlXUklURTMyKGJjdHMtPmRpcik7CisJCS8qIFhYWDogPyAqLworCQlXUklURTMyKDApOworCQlBREpVU1RfQVJHUygpOworCX0KKwlyZXR1cm4gbmZzZXJyOworfQorCiBzdGF0aWMgX19iZTMyCiBuZnNkNF9lbmNvZGVfY2xvc2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBfX2JlMzIgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY2xvc2UgKmNsb3NlKQogewpAQCAtMjgyNiwxMSArMjg3NCwxMCBAQAogfQogCiBzdGF0aWMgX19iZTMyCi1uZnNkNF9lbmNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsCi0JCSAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCituZnNkNF9kb19lbmNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsCisJCQkgX19iZTMyIG5mc2VycixzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQogewogCWludCBpID0gMDsKLQlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gc2VjaW5mby0+c2lfZXhwOwogCXUzMiBuZmxhdnM7CiAJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZmxhdnM7CiAJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyBkZWZfZmxhdnNbMl07CkBAIC0yODkyLDYgKzI5MzksMjAgQEAKIAlyZXR1cm4gbmZzZXJyOwogfQogCitzdGF0aWMgX19iZTMyCituZnNkNF9lbmNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsCisJCSAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCit7CisJcmV0dXJuIG5mc2Q0X2RvX2VuY29kZV9zZWNpbmZvKHJlc3AsIG5mc2Vyciwgc2VjaW5mby0+c2lfZXhwKTsKK30KKworc3RhdGljIF9fYmUzMgorbmZzZDRfZW5jb2RlX3NlY2luZm9fbm9fbmFtZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIF9fYmUzMiBuZnNlcnIsCisJCSAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm9fbm9fbmFtZSAqc2VjaW5mbykKK3sKKwlyZXR1cm4gbmZzZDRfZG9fZW5jb2RlX3NlY2luZm8ocmVzcCwgbmZzZXJyLCBzZWNpbmZvLT5zaW5fZXhwKTsKK30KKwogLyoKICAqIFRoZSBTRVRBVFRSIGVuY29kZSByb3V0aW5lIGlzIHNwZWNpYWwgLS0gaXQgYWx3YXlzIGVuY29kZXMgYSBiaXRtYXAsCiAgKiByZWdhcmRsZXNzIG9mIHRoZSBlcnJvciBzdGF0dXMuCkBAIC0zMDc2LDEzICszMTM3LDkgQEAKIAlXUklURTMyKHNlcS0+c2VxaWQpOwogCVdSSVRFMzIoc2VxLT5zbG90aWQpOwogCVdSSVRFMzIoc2VxLT5tYXhzbG90cyk7Ci0JLyoKLQkgKiBGSVhNRTogZm9yIG5vdzoKLQkgKiAgIHRhcmdldF9tYXhzbG90cyA9IG1heHNsb3RzCi0JICogICBzdGF0dXNfZmxhZ3MgPSAwCi0JICovCisJLyogRm9yIG5vdzogdGFyZ2V0X21heHNsb3RzID0gbWF4c2xvdHMgKi8KIAlXUklURTMyKHNlcS0+bWF4c2xvdHMpOwotCVdSSVRFMzIoMCk7CisJV1JJVEUzMihzZXEtPnN0YXR1c19mbGFncyk7CiAKIAlBREpVU1RfQVJHUygpOwogCXJlc3AtPmNzdGF0ZS5kYXRhcCA9IHA7IC8qIERSQyBjYWNoZSBkYXRhIHBvaW50ZXIgKi8KQEAgLTMxNDMsNyArMzIwMCw3IEBACiAKIAkvKiBORlN2NC4xIG9wZXJhdGlvbnMgKi8KIAlbT1BfQkFDS0NIQU5ORUxfQ1RMXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCi0JW09QX0JJTkRfQ09OTl9UT19TRVNTSU9OXSA9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCisJW09QX0JJTkRfQ09OTl9UT19TRVNTSU9OXSA9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX2JpbmRfY29ubl90b19zZXNzaW9uLAogCVtPUF9FWENIQU5HRV9JRF0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9leGNoYW5nZV9pZCwKIAlbT1BfQ1JFQVRFX1NFU1NJT05dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfY3JlYXRlX3Nlc3Npb24sCiAJW09QX0RFU1RST1lfU0VTU0lPTl0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9kZXN0cm95X3Nlc3Npb24sCkBAIC0zMTU0LDcgKzMyMTEsNyBAQAogCVtPUF9MQVlPVVRDT01NSVRdCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfTEFZT1VUR0VUXQkJPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9ub29wLAogCVtPUF9MQVlPVVRSRVRVUk5dCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKLQlbT1BfU0VDSU5GT19OT19OQU1FXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCisJW09QX1NFQ0lORk9fTk9fTkFNRV0JPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9zZWNpbmZvX25vX25hbWUsCiAJW09QX1NFUVVFTkNFXQkJPSAobmZzZDRfZW5jKW5mc2Q0X2VuY29kZV9zZXF1ZW5jZSwKIAlbT1BfU0VUX1NTVl0JCT0gKG5mc2Q0X2VuYyluZnNkNF9lbmNvZGVfbm9vcCwKIAlbT1BfVEVTVF9TVEFURUlEXQk9IChuZnNkNF9lbmMpbmZzZDRfZW5jb2RlX25vb3AsCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYwppbmRleCA0NTE0ZWJiLi4zM2IzZTJiIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2N0bC5jCisrKyBiL2ZzL25mc2QvbmZzY3RsLmMKQEAgLTgsMTIgKzgsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAKKyNpbmNsdWRlICJpZG1hcC5oIgogI2luY2x1ZGUgIm5mc2QuaCIKICNpbmNsdWRlICJjYWNoZS5oIgogCkBAIC0xMjcsNiArMTI3LDcgQEAKIAogc3RhdGljIHNzaXplX3QgbmZzY3RsX3RyYW5zYWN0aW9uX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKIHsKKyNpZmRlZiBDT05GSUdfTkZTRF9ERVBSRUNBVEVECiAJc3RhdGljIGludCB3YXJuZWQ7CiAJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZVswXSA9PSAnLicgJiYgIXdhcm5lZCkgewogCQlwcmludGsoS0VSTl9JTkZPCkBAIC0xMzUsNiArMTM2LDcgQEAKIAkJICAgICAgIGN1cnJlbnQtPmNvbW0sIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXdhcm5lZCA9IDE7CiAJfQorI2VuZGlmCiAJaWYgKCEgZmlsZS0+cHJpdmF0ZV9kYXRhKSB7CiAJCS8qIEFuIGF0dGVtcHQgdG8gcmVhZCBhIHRyYW5zYWN0aW9uIGZpbGUgd2l0aG91dCB3cml0aW5nCiAJCSAqIGNhdXNlcyBhIDAtYnl0ZSB3cml0ZSBzbyB0aGF0IHRoZSBmaWxlIGNhbiByZXR1cm4KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzZC5oIGIvZnMvbmZzZC9uZnNkLmgKaW5kZXggNmI2NDFjZi4uN2VjZmEyNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNkLmgKKysrIGIvZnMvbmZzZC9uZnNkLmgKQEAgLTE1OCw2ICsxNTgsNyBAQAogI2RlZmluZQluZnNlcnJfYXR0cm5vdHN1cHAJY3B1X3RvX2JlMzIoTkZTRVJSX0FUVFJOT1RTVVBQKQogI2RlZmluZQluZnNlcnJfYmFkX3hkcgkJY3B1X3RvX2JlMzIoTkZTRVJSX0JBRF9YRFIpCiAjZGVmaW5lCW5mc2Vycl9vcGVubW9kZQkJY3B1X3RvX2JlMzIoTkZTRVJSX09QRU5NT0RFKQorI2RlZmluZQluZnNlcnJfYmFkb3duZXIJCWNwdV90b19iZTMyKE5GU0VSUl9CQURPV05FUikKICNkZWZpbmUJbmZzZXJyX2xvY2tzX2hlbGQJY3B1X3RvX2JlMzIoTkZTRVJSX0xPQ0tTX0hFTEQpCiAjZGVmaW5lCW5mc2Vycl9vcF9pbGxlZ2FsCWNwdV90b19iZTMyKE5GU0VSUl9PUF9JTExFR0FMKQogI2RlZmluZQluZnNlcnJfZ3JhY2UJCWNwdV90b19iZTMyKE5GU0VSUl9HUkFDRSkKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKaW5kZXggMDhlMTcyNi4uZTE1ZGM0NSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnNwcm9jLmMKQEAgLTczNSw5ICs3MzUsOSBAQAogCQl7IG5mc2Vycl9zdGFsZSwgLUVTVEFMRSB9LAogCQl7IG5mc2Vycl9qdWtlYm94LCAtRVRJTUVET1VUIH0sCiAJCXsgbmZzZXJyX2p1a2Vib3gsIC1FUkVTVEFSVFNZUyB9LAotCQl7IG5mc2Vycl9kcm9waXQsIC1FQUdBSU4gfSwKLQkJeyBuZnNlcnJfZHJvcGl0LCAtRU5PTUVNIH0sCi0JCXsgbmZzZXJyX2JhZG5hbWUsIC1FU1JDSCB9LAorCQl7IG5mc2Vycl9qdWtlYm94LCAtRUFHQUlOIH0sCisJCXsgbmZzZXJyX2p1a2Vib3gsIC1FV09VTERCTE9DSyB9LAorCQl7IG5mc2Vycl9qdWtlYm94LCAtRU5PTUVNIH0sCiAJCXsgbmZzZXJyX2lvLCAtRVRYVEJTWSB9LAogCQl7IG5mc2Vycl9ub3RzdXBwLCAtRU9QTk9UU1VQUCB9LAogCQl7IG5mc2Vycl90b29zbWFsbCwgLUVUT09TTUFMTCB9LApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNzdmMuYyBiL2ZzL25mc2QvbmZzc3ZjLmMKaW5kZXggMmJhZTFkOC4uMTg3NDNjNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNzdmMuYworKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC02MDgsNyArNjA4LDcgQEAKIAkvKiBOb3cgY2FsbCB0aGUgcHJvY2VkdXJlIGhhbmRsZXIsIGFuZCBlbmNvZGUgTkZTIHN0YXR1cy4gKi8KIAluZnNlcnIgPSBwcm9jLT5wY19mdW5jKHJxc3RwLCBycXN0cC0+cnFfYXJncCwgcnFzdHAtPnJxX3Jlc3ApOwogCW5mc2VyciA9IG1hcF9uZXdfZXJyb3JzKHJxc3RwLT5ycV92ZXJzLCBuZnNlcnIpOwotCWlmIChuZnNlcnIgPT0gbmZzZXJyX2Ryb3BpdCkgeworCWlmIChuZnNlcnIgPT0gbmZzZXJyX2Ryb3BpdCB8fCBycXN0cC0+cnFfZHJvcG1lKSB7CiAJCWRwcmludGsoIm5mc2Q6IERyb3BwaW5nIHJlcXVlc3Q7IG1heSBiZSByZXZpc2l0ZWQgbGF0ZXJcbiIpOwogCQluZnNkX2NhY2hlX3VwZGF0ZShycXN0cCwgUkNfTk9DQUNIRSwgTlVMTCk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9zdGF0ZS5oIGIvZnMvbmZzZC9zdGF0ZS5oCmluZGV4IDM5YWRjMjcuLjMwNzQ2NTYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2Qvc3RhdGUuaAorKysgYi9mcy9uZnNkL3N0YXRlLmgKQEAgLTY4LDEwICs2OCwxMiBAQAogc3RydWN0IG5mc2Q0X2NhbGxiYWNrIHsKIAl2b2lkICpjYl9vcDsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNiX2NscDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNiX3Blcl9jbGllbnQ7CiAJdTMyIGNiX21pbm9ydmVyc2lvbjsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgY2JfbXNnOwogCWNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKmNiX29wczsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2Jfd29yazsKKwlib29sIGNiX2RvbmU7CiB9OwogCiBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uIHsKQEAgLTgxLDYgKzgzLDcgQEAKIAlhdG9taWNfdAkJZGxfY291bnQ7ICAgICAgIC8qIHJlZiBjb3VudCAqLwogCXN0cnVjdCBuZnM0X2NsaWVudAkqZGxfY2xpZW50OwogCXN0cnVjdCBuZnM0X2ZpbGUJKmRsX2ZpbGU7CisJc3RydWN0IGZpbGUJCSpkbF92ZnNfZmlsZTsKIAlzdHJ1Y3QgZmlsZV9sb2NrCSpkbF9mbG9jazsKIAl1MzIJCQlkbF90eXBlOwogCXRpbWVfdAkJCWRsX3RpbWU7CkBAIC05NSw2ICs5OCw3IEBACiBzdHJ1Y3QgbmZzNF9jYl9jb25uIHsKIAkvKiBTRVRDTElFTlRJRCBpbmZvICovCiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJY2JfYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQljYl9zYWRkcjsKIAlzaXplX3QJCQljYl9hZGRybGVuOwogCXUzMiAgICAgICAgICAgICAgICAgICAgIGNiX3Byb2c7IC8qIHVzZWQgb25seSBpbiA0LjAgY2FzZTsKIAkJCQkJICAgIHBlci1zZXNzaW9uIG90aGVyd2lzZSAqLwpAQCAtMTQ2LDYgKzE1MCwxMSBAQAogCXUzMgkJCQlnaWQ7CiB9OwogCitzdHJ1Y3QgbmZzZDRfYmluZF9jb25uX3RvX3Nlc3Npb24geworCXN0cnVjdCBuZnM0X3Nlc3Npb25pZAkJc2Vzc2lvbmlkOworCXUzMgkJCQlkaXI7Cit9OworCiAvKiBUaGUgc2luZ2xlIHNsb3QgY2xpZW50aWQgY2FjaGUgc3RydWN0dXJlICovCiBzdHJ1Y3QgbmZzZDRfY2xpZF9zbG90IHsKIAl1MzIJCQkJc2xfc2VxaWQ7CkBAIC0yMzUsOSArMjQ0LDEzIEBACiAJdW5zaWduZWQgbG9uZwkJY2xfY2JfZmxhZ3M7CiAJc3RydWN0IHJwY19jbG50CQkqY2xfY2JfY2xpZW50OwogCXUzMgkJCWNsX2NiX2lkZW50OwotCWF0b21pY190CQljbF9jYl9zZXQ7CisjZGVmaW5lIE5GU0Q0X0NCX1VQCQkwCisjZGVmaW5lIE5GU0Q0X0NCX1VOS05PV04JMQorI2RlZmluZSBORlNENF9DQl9ET1dOCQkyCisJaW50CQkJY2xfY2Jfc3RhdGU7CiAJc3RydWN0IG5mc2Q0X2NhbGxiYWNrCWNsX2NiX251bGw7CiAJc3RydWN0IG5mc2Q0X3Nlc3Npb24JKmNsX2NiX3Nlc3Npb247CisJc3RydWN0IGxpc3RfaGVhZAljbF9jYWxsYmFja3M7IC8qIGxpc3Qgb2YgaW4tcHJvZ3Jlc3MgY2FsbGJhY2tzICovCiAKIAkvKiBmb3IgYWxsIGNsaWVudCBpbmZvcm1hdGlvbiB0aGF0IGNhbGxiYWNrIGNvZGUgbWlnaHQgbmVlZDogKi8KIAlzcGlubG9ja190CQljbF9sb2NrOwpAQCAtNDU0LDYgKzQ2Nyw3IEBACiBleHRlcm4gdm9pZCBuZnM0X2ZyZWVfc3RhdGVvd25lcihzdHJ1Y3Qga3JlZiAqa3JlZik7CiBleHRlcm4gaW50IHNldF9jYWxsYmFja19jcmVkKHZvaWQpOwogZXh0ZXJuIHZvaWQgbmZzZDRfcHJvYmVfY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHApOworZXh0ZXJuIHZvaWQgbmZzZDRfcHJvYmVfY2FsbGJhY2tfc3luYyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7CiBleHRlcm4gdm9pZCBuZnNkNF9jaGFuZ2VfY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X2NiX2Nvbm4gKik7CiBleHRlcm4gdm9pZCBuZnNkNF9kb19jYWxsYmFja19ycGMoc3RydWN0IHdvcmtfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgbmZzZDRfY2JfcmVjYWxsKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IDNhMzU5MDIuLmEzYzdmNzAgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtMSw0ICsxLDMgQEAKLSNkZWZpbmUgTVNORlMJLyogSEFDSyBIQUNLICovCiAvKgogICogRmlsZSBvcGVyYXRpb25zIHVzZWQgYnkgbmZzZC4gU29tZSBvZiB0aGVzZSBoYXZlIGJlZW4gcmlwcGVkIGZyb20KICAqIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgZXhwb3J0ZWQsIG90aGVycwpAQCAtMzUsOCArMzQsOCBAQAogI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCiAKICNpZmRlZiBDT05GSUdfTkZTRF9WNAotI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgorI2luY2x1ZGUgImFjbC5oIgorI2luY2x1ZGUgImlkbWFwLmgiCiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjQgKi8KIAogI2luY2x1ZGUgIm5mc2QuaCIKQEAgLTI3Myw2ICsyNzIsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG5mc2RfYnJlYWtfbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOworCXJldHVybiBicmVha19sZWFzZShpbm9kZSwgT19XUk9OTFkgfCBPX05PTkJMT0NLKTsKK30KKwogLyoKICAqIENvbW1pdCBtZXRhZGF0YSBjaGFuZ2VzIHRvIHN0YWJsZSBzdG9yYWdlLgogICovCkBAIC0zNzUsMTYgKzM4MSw2IEBACiAJCQkJZ290byBvdXQ7CiAJCX0KIAotCQkvKgotCQkgKiBJZiB3ZSBhcmUgY2hhbmdpbmcgdGhlIHNpemUgb2YgdGhlIGZpbGUsIHRoZW4KLQkJICogd2UgbmVlZCB0byBicmVhayBhbGwgbGVhc2VzLgotCQkgKi8KLQkJaG9zdF9lcnIgPSBicmVha19sZWFzZShpbm9kZSwgT19XUk9OTFkgfCBPX05PTkJMT0NLKTsKLQkJaWYgKGhvc3RfZXJyID09IC1FV09VTERCTE9DSykKLQkJCWhvc3RfZXJyID0gLUVUSU1FRE9VVDsKLQkJaWYgKGhvc3RfZXJyKSAvKiBFTk9NRU0gb3IgRVdPVUxEQkxPQ0sgKi8KLQkJCWdvdG8gb3V0X25mc2VycjsKLQogCQlob3N0X2VyciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOwogCQlpZiAoaG9zdF9lcnIpCiAJCQlnb3RvIG91dF9uZnNlcnI7CkBAIC00MjUsNyArNDIxLDExIEBACiAKIAllcnIgPSBuZnNlcnJfbm90c3luYzsKIAlpZiAoIWNoZWNrX2d1YXJkIHx8IGd1YXJkdGltZSA9PSBpbm9kZS0+aV9jdGltZS50dl9zZWMpIHsKKwkJaG9zdF9lcnIgPSBuZnNkX2JyZWFrX2xlYXNlKGlub2RlKTsKKwkJaWYgKGhvc3RfZXJyKQorCQkJZ290byBvdXRfbmZzZXJyOwogCQlmaF9sb2NrKGZocCk7CisKIAkJaG9zdF9lcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgaWFwKTsKIAkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCQlmaF91bmxvY2soZmhwKTsKQEAgLTc1Miw4ICs3NTIsNiBAQAogCSAqLwogCWlmICghKGFjY2VzcyAmIE5GU0RfTUFZX05PVF9CUkVBS19MRUFTRSkpCiAJCWhvc3RfZXJyID0gYnJlYWtfbGVhc2UoaW5vZGUsIE9fTk9OQkxPQ0sgfCAoKGFjY2VzcyAmIE5GU0RfTUFZX1dSSVRFKSA/IE9fV1JPTkxZIDogMCkpOwotCWlmIChob3N0X2VyciA9PSAtRVdPVUxEQkxPQ0spCi0JCWhvc3RfZXJyID0gLUVUSU1FRE9VVDsKIAlpZiAoaG9zdF9lcnIpIC8qIE5PTUVNIG9yIFdPVUxEQkxPQ0sgKi8KIAkJZ290byBvdXRfbmZzZXJyOwogCkBAIC04NDUsMTEgKzg0Myw2IEBACiAJc3RydWN0IHBhZ2UgKipwcCA9IHJxc3RwLT5ycV9yZXNwYWdlcyArIHJxc3RwLT5ycV9yZXN1c2VkOwogCXN0cnVjdCBwYWdlICpwYWdlID0gYnVmLT5wYWdlOwogCXNpemVfdCBzaXplOwotCWludCByZXQ7Ci0KLQlyZXQgPSBidWYtPm9wcy0+Y29uZmlybShwaXBlLCBidWYpOwotCWlmICh1bmxpa2VseShyZXQpKQotCQlyZXR1cm4gcmV0OwogCiAJc2l6ZSA9IHNkLT5sZW47CiAKQEAgLTg3OSwxNSArODcyLDYgQEAKIAlyZXR1cm4gX19zcGxpY2VfZnJvbV9waXBlKHBpcGUsIHNkLCBuZnNkX3NwbGljZV9hY3Rvcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHN2Y19tc25mcyhzdHJ1Y3Qgc3ZjX2ZoICpmZmhwKQotewotI2lmZGVmIE1TTkZTCi0JcmV0dXJuIChmZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQogc3RhdGljIF9fYmUzMgogbmZzZF92ZnNfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBmaWxlICpmaWxlLAogICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwgdW5zaWduZWQgbG9uZyAqY291bnQpCkBAIC05MDAsOSArODg0LDYgQEAKIAllcnIgPSBuZnNlcnJfcGVybTsKIAlpbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKLQlpZiAoc3ZjX21zbmZzKGZocCkgJiYgIWxvY2tfbWF5X3JlYWQoaW5vZGUsIG9mZnNldCwgKmNvdW50KSkKLQkJZ290byBvdXQ7Ci0KIAlpZiAoZmlsZS0+Zl9vcC0+c3BsaWNlX3JlYWQgJiYgcnFzdHAtPnJxX3NwbGljZV9vaykgewogCQlzdHJ1Y3Qgc3BsaWNlX2Rlc2Mgc2QgPSB7CiAJCQkubGVuCQk9IDAsCkBAIC05MjcsNyArOTA4LDYgQEAKIAkJZnNub3RpZnlfYWNjZXNzKGZpbGUpOwogCX0gZWxzZSAKIAkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwotb3V0OgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk5MiwxNCArOTcyLDYgQEAKIAlpbnQJCQlzdGFibGUgPSAqc3RhYmxlcDsKIAlpbnQJCQl1c2Vfd2dhdGhlcjsKIAotI2lmZGVmIE1TTkZTCi0JZXJyID0gbmZzZXJyX3Blcm07Ci0KLQlpZiAoKGZocC0+ZmhfZXhwb3J0LT5leF9mbGFncyAmIE5GU0VYUF9NU05GUykgJiYKLQkJKCFsb2NrX21heV93cml0ZShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLCBvZmZzZXQsICpjbnQpKSkKLQkJZ290byBvdXQ7Ci0jZW5kaWYKLQogCWRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJZXhwICAgPSBmaHAtPmZoX2V4cG9ydDsKQEAgLTEwNTAsNyArMTAyMiw2IEBACiAJCWVyciA9IDA7CiAJZWxzZQogCQllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7Ci1vdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTY3MCw2ICsxNjQxLDEyIEBACiAJCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKIAkJZ290byBvdXRfZHB1dDsKIAl9CisJZXJyID0gbmZzZXJyX25vZW50OworCWlmICghZG9sZC0+ZF9pbm9kZSkKKwkJZ290byBvdXRfZHJvcF93cml0ZTsKKwlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UoZG9sZC0+ZF9pbm9kZSk7CisJaWYgKGhvc3RfZXJyKQorCQlnb3RvIG91dF9kcm9wX3dyaXRlOwogCWhvc3RfZXJyID0gdmZzX2xpbmsoZG9sZCwgZGlycCwgZG5ldyk7CiAJaWYgKCFob3N0X2VycikgewogCQllcnIgPSBuZnNlcnJubyhjb21taXRfbWV0YWRhdGEoZmZocCkpOwpAQCAtMTY4MSw2ICsxNjU4LDcgQEAKIAkJZWxzZQogCQkJZXJyID0gbmZzZXJybm8oaG9zdF9lcnIpOwogCX0KK291dF9kcm9wX3dyaXRlOgogCW1udF9kcm9wX3dyaXRlKHRmaHAtPmZoX2V4cG9ydC0+ZXhfcGF0aC5tbnQpOwogb3V0X2RwdXQ6CiAJZHB1dChkbmV3KTsKQEAgLTE3NTUsMTIgKzE3MzMsNiBAQAogCWlmIChuZGVudHJ5ID09IHRyYXApCiAJCWdvdG8gb3V0X2RwdXRfbmV3OwogCi0JaWYgKHN2Y19tc25mcyhmZmhwKSAmJgotCQkoKG9kZW50cnktPmRfY291bnQgPiAxKSB8fCAobmRlbnRyeS0+ZF9jb3VudCA+IDEpKSkgewotCQkJaG9zdF9lcnIgPSAtRVBFUk07Ci0JCQlnb3RvIG91dF9kcHV0X25ldzsKLQl9Ci0KIAlob3N0X2VyciA9IC1FWERFVjsKIAlpZiAoZmZocC0+ZmhfZXhwb3J0LT5leF9wYXRoLm1udCAhPSB0ZmhwLT5maF9leHBvcnQtPmV4X3BhdGgubW50KQogCQlnb3RvIG91dF9kcHV0X25ldzsKQEAgLTE3NjgsMTUgKzE3NDAsMTcgQEAKIAlpZiAoaG9zdF9lcnIpCiAJCWdvdG8gb3V0X2RwdXRfbmV3OwogCisJaG9zdF9lcnIgPSBuZnNkX2JyZWFrX2xlYXNlKG9kZW50cnktPmRfaW5vZGUpOworCWlmIChob3N0X2VycikKKwkJZ290byBvdXRfZHJvcF93cml0ZTsKIAlob3N0X2VyciA9IHZmc19yZW5hbWUoZmRpciwgb2RlbnRyeSwgdGRpciwgbmRlbnRyeSk7CiAJaWYgKCFob3N0X2VycikgewogCQlob3N0X2VyciA9IGNvbW1pdF9tZXRhZGF0YSh0ZmhwKTsKIAkJaWYgKCFob3N0X2VycikKIAkJCWhvc3RfZXJyID0gY29tbWl0X21ldGFkYXRhKGZmaHApOwogCX0KLQorb3V0X2Ryb3Bfd3JpdGU6CiAJbW50X2Ryb3Bfd3JpdGUoZmZocC0+ZmhfZXhwb3J0LT5leF9wYXRoLm1udCk7Ci0KICBvdXRfZHB1dF9uZXc6CiAJZHB1dChuZGVudHJ5KTsKICBvdXRfZHB1dF9vbGQ6CkBAIC0xODM5LDE4ICsxODEzLDE0IEBACiAJaWYgKGhvc3RfZXJyKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKLQlpZiAodHlwZSAhPSBTX0lGRElSKSB7IC8qIEl0J3MgVU5MSU5LICovCi0jaWZkZWYgTVNORlMKLQkJaWYgKChmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCi0JCQkocmRlbnRyeS0+ZF9jb3VudCA+IDEpKSB7Ci0JCQlob3N0X2VyciA9IC1FUEVSTTsKLQkJfSBlbHNlCi0jZW5kaWYKKwlob3N0X2VyciA9IG5mc2RfYnJlYWtfbGVhc2UocmRlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKGhvc3RfZXJyKQorCQlnb3RvIG91dF9wdXQ7CisJaWYgKHR5cGUgIT0gU19JRkRJUikKIAkJaG9zdF9lcnIgPSB2ZnNfdW5saW5rKGRpcnAsIHJkZW50cnkpOwotCX0gZWxzZSB7IC8qIEl0J3MgUk1ESVIgKi8KKwllbHNlCiAJCWhvc3RfZXJyID0gdmZzX3JtZGlyKGRpcnAsIHJkZW50cnkpOwotCX0KLQorb3V0X3B1dDoKIAlkcHV0KHJkZW50cnkpOwogCiAJaWYgKCFob3N0X2VycikKZGlmZiAtLWdpdCBhL2ZzL25mc2QveGRyNC5oIGIvZnMvbmZzZC94ZHI0LmgKaW5kZXggNjBmY2UzZC4uMzY2NDAxZSAxMDA2NDQKLS0tIGEvZnMvbmZzZC94ZHI0LmgKKysrIGIvZnMvbmZzZC94ZHI0LmgKQEAgLTMxMSw2ICszMTEsMTEgQEAKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqc2lfZXhwOwkJCS8qIHJlc3BvbnNlICovCiB9OwogCitzdHJ1Y3QgbmZzZDRfc2VjaW5mb19ub19uYW1lIHsKKwl1MzIgc2luX3N0eWxlOwkJCQkJLyogcmVxdWVzdCAqLworCXN0cnVjdCBzdmNfZXhwb3J0ICpzaW5fZXhwOwkJCS8qIHJlc3BvbnNlICovCit9OworCiBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciB7CiAJc3RhdGVpZF90CXNhX3N0YXRlaWQ7ICAgICAgICAgLyogcmVxdWVzdCAqLwogCXUzMgkJc2FfYm12YWxbM107ICAgICAgICAvKiByZXF1ZXN0ICovCkBAIC0zNzMsOCArMzc4LDggQEAKIAl1MzIJCQljYWNoZXRoaXM7CQkvKiByZXF1ZXN0ICovCiAjaWYgMAogCXUzMgkJCXRhcmdldF9tYXhzbG90czsJLyogcmVzcG9uc2UgKi8KLQl1MzIJCQlzdGF0dXNfZmxhZ3M7CQkvKiByZXNwb25zZSAqLwogI2VuZGlmIC8qIG5vdCB5ZXQgKi8KKwl1MzIJCQlzdGF0dXNfZmxhZ3M7CQkvKiByZXNwb25zZSAqLwogfTsKIAogc3RydWN0IG5mc2Q0X2Rlc3Ryb3lfc2Vzc2lvbiB7CkBAIC00MjIsNiArNDI3LDcgQEAKIAogCQkvKiBORlN2NC4xICovCiAJCXN0cnVjdCBuZnNkNF9leGNoYW5nZV9pZAlleGNoYW5nZV9pZDsKKwkJc3RydWN0IG5mc2Q0X2JpbmRfY29ubl90b19zZXNzaW9uIGJpbmRfY29ubl90b19zZXNzaW9uOwogCQlzdHJ1Y3QgbmZzZDRfY3JlYXRlX3Nlc3Npb24JY3JlYXRlX3Nlc3Npb247CiAJCXN0cnVjdCBuZnNkNF9kZXN0cm95X3Nlc3Npb24JZGVzdHJveV9zZXNzaW9uOwogCQlzdHJ1Y3QgbmZzZDRfc2VxdWVuY2UJCXNlcXVlbmNlOwpAQCAtNTE4LDYgKzUyNCw3IEBACiAJCXN0cnVjdCBuZnNkNF9zZXF1ZW5jZSAqc2VxKTsKIGV4dGVybiBfX2JlMzIgbmZzZDRfZXhjaGFuZ2VfaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJc3RydWN0IG5mc2Q0X2NvbXBvdW5kX3N0YXRlICosIHN0cnVjdCBuZnNkNF9leGNoYW5nZV9pZCAqKTsKK2V4dGVybiBfX2JlMzIgbmZzZDRfYmluZF9jb25uX3RvX3Nlc3Npb24oc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBuZnNkNF9jb21wb3VuZF9zdGF0ZSAqLCBzdHJ1Y3QgbmZzZDRfYmluZF9jb25uX3RvX3Nlc3Npb24gKik7CiBleHRlcm4gX19iZTMyIG5mc2Q0X2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBzdmNfcnFzdCAqLAogCQlzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKiwKIAkJc3RydWN0IG5mc2Q0X2NyZWF0ZV9zZXNzaW9uICopOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2JtYXAuYyBiL2ZzL25pbGZzMi9ibWFwLmMKaW5kZXggOGI3ODJiMC4uM2VlNjdjNiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2JtYXAuYworKysgYi9mcy9uaWxmczIvYm1hcC5jCkBAIC0zNSw3ICszNSwyMCBAQAogCiBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2JtYXBfZ2V0X2RhdChjb25zdCBzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCkKIHsKLQlyZXR1cm4gbmlsZnNfZGF0X2lub2RlKE5JTEZTX0lfTklMRlMoYm1hcC0+Yl9pbm9kZSkpOworCXJldHVybiBOSUxGU19JX05JTEZTKGJtYXAtPmJfaW5vZGUpLT5uc19kYXQ7Cit9CisKK3N0YXRpYyBpbnQgbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKHN0cnVjdCBuaWxmc19ibWFwICpibWFwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZm5hbWUsIGludCBlcnIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGJtYXAtPmJfaW5vZGU7CisKKwlpZiAoZXJyID09IC1FSU5WQUwpIHsKKwkJbmlsZnNfZXJyb3IoaW5vZGUtPmlfc2IsIGZuYW1lLAorCQkJICAgICJicm9rZW4gYm1hcCAoaW5vZGUgbnVtYmVyPSVsdSlcbiIsIGlub2RlLT5pX2lubyk7CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtNjYsOCArNzksMTAgQEAKIAogCWRvd25fcmVhZCgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfbG9va3VwKGJtYXAsIGtleSwgbGV2ZWwsIHB0cnApOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBvdXQ7CisJfQogCWlmIChOSUxGU19CTUFQX1VTRV9WQk4oYm1hcCkpIHsKIAkJcmV0ID0gbmlsZnNfZGF0X3RyYW5zbGF0ZShuaWxmc19ibWFwX2dldF9kYXQoYm1hcCksICpwdHJwLAogCQkJCQkgICZibG9ja25yKTsKQEAgLTg4LDcgKzEwMyw4IEBACiAJZG93bl9yZWFkKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gYm1hcC0+Yl9vcHMtPmJvcF9sb29rdXBfY29udGlnKGJtYXAsIGtleSwgcHRycCwgbWF4YmxvY2tzKTsKIAl1cF9yZWFkKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYm1hcF9kb19pbnNlcnQoc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAsIF9fdTY0IGtleSwgX191NjQgcHRyKQpAQCAtMTQ0LDcgKzE2MCw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IG5pbGZzX2JtYXBfZG9faW5zZXJ0KGJtYXAsIGtleSwgcmVjKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2JtYXBfZG9fZGVsZXRlKHN0cnVjdCBuaWxmc19ibWFwICpibWFwLCBfX3U2NCBrZXkpCkBAIC0xODAsOSArMTk3LDEyIEBACiAKIAlkb3duX3JlYWQoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX2xhc3Rfa2V5KGJtYXAsICZsYXN0a2V5KTsKLQlpZiAoIXJldCkKLQkJKmtleSA9IGxhc3RrZXk7CiAJdXBfcmVhZCgmYm1hcC0+Yl9zZW0pOworCisJaWYgKHJldCA8IDApCisJCXJldCA9IG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKKwllbHNlCisJCSprZXkgPSBsYXN0a2V5OwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxMCw3ICsyMzAsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBuaWxmc19ibWFwX2RvX2RlbGV0ZShibWFwLCBrZXkpOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYm1hcF9kb190cnVuY2F0ZShzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwgdW5zaWduZWQgbG9uZyBrZXkpCkBAIC0yNjEsNyArMjgyLDggQEAKIAlkb3duX3dyaXRlKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gbmlsZnNfYm1hcF9kb190cnVuY2F0ZShibWFwLCBrZXkpOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIC8qKgpAQCAtMzAwLDcgKzMyMiw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfcHJvcGFnYXRlKGJtYXAsIGJoKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKQEAgLTM0NCw3ICszNjcsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX2Fzc2lnbihibWFwLCBiaCwgYmxvY2tuciwgYmluZm8pOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIC8qKgpAQCAtMzczLDcgKzM5Nyw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfbWFyayhibWFwLCBrZXksIGxldmVsKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9idG5vZGUuYyBiL2ZzL25pbGZzMi9idG5vZGUuYwppbmRleCA1MTE1ODE0Yy4uMzg4ZTllOCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2J0bm9kZS5jCisrKyBiL2ZzL25pbGZzMi9idG5vZGUuYwpAQCAtMTA0LDggKzEwNCw3IEBACiAJaWYgKHBibG9ja25yID09IDApIHsKIAkJcGJsb2NrbnIgPSBibG9ja25yOwogCQlpZiAoaW5vZGUtPmlfaW5vICE9IE5JTEZTX0RBVF9JTk8pIHsKLQkJCXN0cnVjdCBpbm9kZSAqZGF0ID0KLQkJCQluaWxmc19kYXRfaW5vZGUoTklMRlNfSV9OSUxGUyhpbm9kZSkpOworCQkJc3RydWN0IGlub2RlICpkYXQgPSBOSUxGU19JX05JTEZTKGlub2RlKS0+bnNfZGF0OwogCiAJCQkvKiBibG9ja25yIGlzIGEgdmlydHVhbCBibG9jayBudW1iZXIgKi8KIAkJCWVyciA9IG5pbGZzX2RhdF90cmFuc2xhdGUoZGF0LCBibG9ja25yLCAmcGJsb2NrbnIpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2Rpci5jIGIvZnMvbmlsZnMyL2Rpci5jCmluZGV4IGNiMDAzYzguLjlkNDU3NzMgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9kaXIuYworKysgYi9mcy9uaWxmczIvZGlyLmMKQEAgLTkxLDcgKzkxLDYgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IG1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGRpci0+aV9zYik7CiAJbG9mZl90IHBvcyA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgZnJvbTsKIAl1bnNpZ25lZCBsZW4gPSB0byAtIGZyb207CiAJdW5zaWduZWQgbnJfZGlydHksIGNvcGllZDsKQEAgLTEwMyw3ICsxMDIsNyBAQAogCQlpX3NpemVfd3JpdGUoZGlyLCBwb3MgKyBjb3BpZWQpOwogCWlmIChJU19ESVJTWU5DKGRpcikpCiAJCW5pbGZzX3NldF90cmFuc2FjdGlvbl9mbGFnKE5JTEZTX1RJX1NZTkMpOwotCWVyciA9IG5pbGZzX3NldF9maWxlX2RpcnR5KHNiaSwgZGlyLCBucl9kaXJ0eSk7CisJZXJyID0gbmlsZnNfc2V0X2ZpbGVfZGlydHkoZGlyLCBucl9kaXJ0eSk7CiAJV0FSTl9PTihlcnIpOyAvKiBkbyBub3QgaGFwcGVuICovCiAJdW5sb2NrX3BhZ2UocGFnZSk7CiB9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZmlsZS5jIGIvZnMvbmlsZnMyL2ZpbGUuYwppbmRleCBjOWEzMGQ3Li4yZjU2MGM5IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZmlsZS5jCisrKyBiL2ZzL25pbGZzMi9maWxlLmMKQEAgLTE1NSw2ICsxNTUsNyBAQAogCS50cnVuY2F0ZQk9IG5pbGZzX3RydW5jYXRlLAogCS5zZXRhdHRyCT0gbmlsZnNfc2V0YXR0ciwKIAkucGVybWlzc2lvbiAgICAgPSBuaWxmc19wZXJtaXNzaW9uLAorCS5maWVtYXAJCT0gbmlsZnNfZmllbWFwLAogfTsKIAogLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pZmlsZS5jIGIvZnMvbmlsZnMyL2lmaWxlLmMKaW5kZXggOWY4YTJkYS4uYmZjNzNkMyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lmaWxlLmMKKysrIGIvZnMvbmlsZnMyL2lmaWxlLmMKQEAgLTE0OSwxNCArMTQ5LDkgQEAKIAl9CiAKIAllcnIgPSBuaWxmc19wYWxsb2NfZ2V0X2VudHJ5X2Jsb2NrKGlmaWxlLCBpbm8sIDAsIG91dF9iaCk7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJaWYgKGVyciA9PSAtRUlOVkFMKQotCQkJbmlsZnNfZXJyb3Ioc2IsIF9fZnVuY19fLCAiaWZpbGUgaXMgYnJva2VuIik7Ci0JCWVsc2UKLQkJCW5pbGZzX3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJCSAgICAgICJ1bmFibGUgdG8gcmVhZCBpbm9kZTogJWx1IiwKLQkJCQkgICAgICAodW5zaWduZWQgbG9uZykgaW5vKTsKLQl9CisJaWYgKHVubGlrZWx5KGVycikpCisJCW5pbGZzX3dhcm5pbmcoc2IsIF9fZnVuY19fLCAidW5hYmxlIHRvIHJlYWQgaW5vZGU6ICVsdSIsCisJCQkgICAgICAodW5zaWduZWQgbG9uZykgaW5vKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaW5vZGUuYyBiL2ZzL25pbGZzMi9pbm9kZS5jCmluZGV4IDc3YjQ4YzguLjJmZDQ0MGQgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pbm9kZS5jCisrKyBiL2ZzL25pbGZzMi9pbm9kZS5jCkBAIC01OCw3ICs1OCw3IEBACiAJc3RydWN0IG5pbGZzX2lub2RlX2luZm8gKmlpID0gTklMRlNfSShpbm9kZSk7CiAJX191NjQgYmxrbnVtID0gMDsKIAlpbnQgZXJyID0gMCwgcmV0OwotCXN0cnVjdCBpbm9kZSAqZGF0ID0gbmlsZnNfZGF0X2lub2RlKE5JTEZTX0lfTklMRlMoaW5vZGUpKTsKKwlzdHJ1Y3QgaW5vZGUgKmRhdCA9IE5JTEZTX0lfTklMRlMoaW5vZGUpLT5uc19kYXQ7CiAJdW5zaWduZWQgbWF4YmxvY2tzID0gYmhfcmVzdWx0LT5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAogCWRvd25fcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CkBAIC05NiwxMSArOTYsNiBAQAogCQkJCSAgICAgICBpbm9kZS0+aV9pbm8sCiAJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxrb2ZmKTsKIAkJCQllcnIgPSAwOwotCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVJTlZBTCkgewotCQkJCW5pbGZzX2Vycm9yKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKLQkJCQkJICAgICJicm9rZW4gYm1hcCAoaW5vZGU9JWx1KVxuIiwKLQkJCQkJICAgIGlub2RlLT5pX2lubyk7Ci0JCQkJZXJyID0gLUVJTzsKIAkJCX0KIAkJCW5pbGZzX3RyYW5zYWN0aW9uX2Fib3J0KGlub2RlLT5pX3NiKTsKIAkJCWdvdG8gb3V0OwpAQCAtMTA5LDYgKzEwNCw3IEBACiAJCW5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChpbm9kZS0+aV9zYik7IC8qIG5ldmVyIGZhaWxzICovCiAJCS8qIEVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkZXRhaWxlZCAqLwogCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQlzZXRfYnVmZmVyX2RlbGF5KGJoX3Jlc3VsdCk7CiAJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCAwKTsgLyogZGJuIG11c3QgYmUgY2hhbmdlZAogCQkJCQkJICAgICAgdG8gcHJvcGVyIHZhbHVlICovCiAJfSBlbHNlIGlmIChyZXQgPT0gLUVOT0VOVCkgewpAQCAtMTg1LDEwICsxODEsOSBAQAogCiAJaWYgKHJldCkgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQkJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGlub2RlLT5pX3NiKTsKIAkJdW5zaWduZWQgbnJfZGlydHkgPSAxIDw8IChQQUdFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CiAKLQkJbmlsZnNfc2V0X2ZpbGVfZGlydHkoc2JpLCBpbm9kZSwgbnJfZGlydHkpOworCQluaWxmc19zZXRfZmlsZV9kaXJ0eShpbm9kZSwgbnJfZGlydHkpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjI5LDcgKzIyNCw3IEBACiAJCQkJCQkgIHN0YXJ0ICsgY29waWVkKTsKIAljb3BpZWQgPSBnZW5lcmljX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwb3MsIGxlbiwgY29waWVkLCBwYWdlLAogCQkJCSAgIGZzZGF0YSk7Ci0JbmlsZnNfc2V0X2ZpbGVfZGlydHkoTklMRlNfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwgbnJfZGlydHkpOworCW5pbGZzX3NldF9maWxlX2RpcnR5KGlub2RlLCBucl9kaXJ0eSk7CiAJZXJyID0gbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KGlub2RlLT5pX3NiKTsKIAlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7CiB9CkBAIC00MjUsMTMgKzQyMCwxMiBAQAogCQkJICAgICAgc3RydWN0IG5pbGZzX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5vLAogCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0Ioc2IpOwotCXN0cnVjdCBpbm9kZSAqZGF0ID0gbmlsZnNfZGF0X2lub2RlKHNiaS0+c19uaWxmcyk7CisJc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMgPSBOSUxGU19TQihzYiktPnNfbmlsZnM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgbmlsZnNfaW5vZGUgKnJhd19pbm9kZTsKIAlpbnQgZXJyOwogCi0JZG93bl9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCisJZG93bl9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CiAJZXJyID0gbmlsZnNfaWZpbGVfZ2V0X2lub2RlX2Jsb2NrKHJvb3QtPmlmaWxlLCBpbm8sICZiaCk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gYmFkX2lub2RlOwpAQCAtNDYxLDcgKzQ1NSw3IEBACiAJfQogCW5pbGZzX2lmaWxlX3VubWFwX2lub2RlKHJvb3QtPmlmaWxlLCBpbm8sIGJoKTsKIAlicmVsc2UoYmgpOwotCXVwX3JlYWQoJk5JTEZTX01EVChkYXQpLT5taV9zZW0pOwkvKiBYWFggKi8KKwl1cF9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CiAJbmlsZnNfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKIAlyZXR1cm4gMDsKIApAQCAtNDcwLDcgKzQ2NCw3IEBACiAJYnJlbHNlKGJoKTsKIAogIGJhZF9pbm9kZToKLQl1cF9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsJLyogWFhYICovCisJdXBfcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTYyOSw3ICs2MjMsNyBAQAogCiAJaWYgKCF0ZXN0X2JpdChOSUxGU19JX0JNQVAsICZpaS0+aV9zdGF0ZSkpCiAJCXJldHVybjsKLSByZXBlYXQ6CityZXBlYXQ6CiAJcmV0ID0gbmlsZnNfYm1hcF9sYXN0X2tleShpaS0+aV9ibWFwLCAmYik7CiAJaWYgKHJldCA9PSAtRU5PRU5UKQogCQlyZXR1cm47CkBAIC02NDYsMTQgKzY0MCwxMCBAQAogCQkgICAgIG5pbGZzX2JtYXBfdHJ1bmNhdGUoaWktPmlfYm1hcCwgYikgPT0gMCkpCiAJCWdvdG8gcmVwZWF0OwogCi0gZmFpbGVkOgotCWlmIChyZXQgPT0gLUVJTlZBTCkKLQkJbmlsZnNfZXJyb3IoaWktPnZmc19pbm9kZS5pX3NiLCBfX2Z1bmNfXywKLQkJCSAgICAiYm1hcCBpcyBicm9rZW4gKGlubz0lbHUpIiwgaWktPnZmc19pbm9kZS5pX2lubyk7Ci0JZWxzZQotCQluaWxmc193YXJuaW5nKGlpLT52ZnNfaW5vZGUuaV9zYiwgX19mdW5jX18sCi0JCQkgICAgICAiZmFpbGVkIHRvIHRydW5jYXRlIGJtYXAgKGlubz0lbHUsIGVycj0lZCkiLAotCQkJICAgICAgaWktPnZmc19pbm9kZS5pX2lubywgcmV0KTsKK2ZhaWxlZDoKKwluaWxmc193YXJuaW5nKGlpLT52ZnNfaW5vZGUuaV9zYiwgX19mdW5jX18sCisJCSAgICAgICJmYWlsZWQgdG8gdHJ1bmNhdGUgYm1hcCAoaW5vPSVsdSwgZXJyPSVkKSIsCisJCSAgICAgIGlpLT52ZnNfaW5vZGUuaV9pbm8sIHJldCk7CiB9CiAKIHZvaWQgbmlsZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTY4Miw3ICs2NzIsNyBAQAogCQluaWxmc19zZXRfdHJhbnNhY3Rpb25fZmxhZyhOSUxGU19USV9TWU5DKTsKIAogCW5pbGZzX21hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCW5pbGZzX3NldF9maWxlX2RpcnR5KE5JTEZTX1NCKHNiKSwgaW5vZGUsIDApOworCW5pbGZzX3NldF9maWxlX2RpcnR5KGlub2RlLCAwKTsKIAluaWxmc190cmFuc2FjdGlvbl9jb21taXQoc2IpOwogCS8qIE1heSBjb25zdHJ1Y3QgYSBsb2dpY2FsIHNlZ21lbnQgYW5kIG1heSBmYWlsIGluIHN5bmMgbW9kZS4KIAkgICBCdXQgdHJ1bmNhdGUgaGFzIG5vIHJldHVybiB2YWx1ZS4gKi8KQEAgLTgwMCw5ICs3OTAsOSBAQAogCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGZsYWdzLCBOVUxMKTsKIH0KIAotaW50IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCkKK2ludCBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCkKIHsKKwlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBuaWxmc19pbm9kZV9pbmZvICppaSA9IE5JTEZTX0koaW5vZGUpOwogCWludCBlcnI7CiAKQEAgLTg0Myw5ICs4MzMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBuaWxmc19zZXRfZmlsZV9kaXJ0eShzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJIHVuc2lnbmVkIG5yX2RpcnR5KQoraW50IG5pbGZzX3NldF9maWxlX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIG5yX2RpcnR5KQogeworCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG5pbGZzX2lub2RlX2luZm8gKmlpID0gTklMRlNfSShpbm9kZSk7CiAKIAlhdG9taWNfYWRkKG5yX2RpcnR5LCAmc2JpLT5zX25pbGZzLT5uc19uZGlydHlibGtzKTsKQEAgLTg3OCwxMSArODY4LDEwIEBACiAKIGludCBuaWxmc19tYXJrX2lub2RlX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmliaDsKIAlpbnQgZXJyOwogCi0JZXJyID0gbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzYmksIGlub2RlLCAmaWJoKTsKKwllcnIgPSBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKGlub2RlLCAmaWJoKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQluaWxmc193YXJuaW5nKGlub2RlLT5pX3NiLCBfX2Z1bmNfXywKIAkJCSAgICAgICJmYWlsZWQgdG8gcmVnZXQgaW5vZGUgYmxvY2suXG4iKTsKQEAgLTkyNCwzICs5MTMsMTM0IEBACiAJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KGlub2RlLT5pX3NiKTsgLyogbmV2ZXIgZmFpbHMgKi8KIH0KKworaW50IG5pbGZzX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAorCQkgX191NjQgc3RhcnQsIF9fdTY0IGxlbikKK3sKKwlzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcyA9IE5JTEZTX0lfTklMRlMoaW5vZGUpOworCV9fdTY0IGxvZ2ljYWwgPSAwLCBwaHlzID0gMCwgc2l6ZSA9IDA7CisJX191MzIgZmxhZ3MgPSAwOworCWxvZmZfdCBpc2l6ZTsKKwlzZWN0b3JfdCBibGtvZmYsIGVuZF9ibGtvZmY7CisJc2VjdG9yX3QgZGVsYWxsb2NfYmxrb2ZmOworCXVuc2lnbmVkIGxvbmcgZGVsYWxsb2NfYmxrbGVuOworCXVuc2lnbmVkIGludCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwlpbnQgcmV0LCBuOworCisJcmV0ID0gZmllbWFwX2NoZWNrX2ZsYWdzKGZpZWluZm8sIEZJRU1BUF9GTEFHX1NZTkMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWJsa29mZiA9IHN0YXJ0ID4+IGJsa2JpdHM7CisJZW5kX2Jsa29mZiA9IChzdGFydCArIGxlbiAtIDEpID4+IGJsa2JpdHM7CisKKwlkZWxhbGxvY19ibGtsZW4gPSBuaWxmc19maW5kX3VuY29tbWl0dGVkX2V4dGVudChpbm9kZSwgYmxrb2ZmLAorCQkJCQkJCSZkZWxhbGxvY19ibGtvZmYpOworCisJZG8geworCQlfX3U2NCBibGtwaHk7CisJCXVuc2lnbmVkIGludCBtYXhibG9ja3M7CisKKwkJaWYgKGRlbGFsbG9jX2Jsa2xlbiAmJiBibGtvZmYgPT0gZGVsYWxsb2NfYmxrb2ZmKSB7CisJCQlpZiAoc2l6ZSkgeworCQkJCS8qIEVuZCBvZiB0aGUgY3VycmVudCBleHRlbnQgKi8KKwkJCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudCgKKwkJCQkJZmllaW5mbywgbG9naWNhbCwgcGh5cywgc2l6ZSwgZmxhZ3MpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGJsa29mZiA+IGVuZF9ibGtvZmYpCisJCQkJYnJlYWs7CisKKwkJCWZsYWdzID0gRklFTUFQX0VYVEVOVF9NRVJHRUQgfCBGSUVNQVBfRVhURU5UX0RFTEFMTE9DOworCQkJbG9naWNhbCA9IGJsa29mZiA8PCBibGtiaXRzOworCQkJcGh5cyA9IDA7CisJCQlzaXplID0gZGVsYWxsb2NfYmxrbGVuIDw8IGJsa2JpdHM7CisKKwkJCWJsa29mZiA9IGRlbGFsbG9jX2Jsa29mZiArIGRlbGFsbG9jX2Jsa2xlbjsKKwkJCWRlbGFsbG9jX2Jsa2xlbiA9IG5pbGZzX2ZpbmRfdW5jb21taXR0ZWRfZXh0ZW50KAorCQkJCWlub2RlLCBibGtvZmYsICZkZWxhbGxvY19ibGtvZmYpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHdlIGxvb2sgdXAgc28gYXMKKwkJICogbm90IHRvIGdldCBpbnRvIHRoZSBuZXh0IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCisJCSAqLworCQltYXhibG9ja3MgPSBJTlRfTUFYOworCQlpZiAoZGVsYWxsb2NfYmxrbGVuKQorCQkJbWF4YmxvY2tzID0gbWluX3Qoc2VjdG9yX3QsIGRlbGFsbG9jX2Jsa29mZiAtIGJsa29mZiwKKwkJCQkJICBtYXhibG9ja3MpOworCQlibGtwaHkgPSAwOworCisJCWRvd25fcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOworCQluID0gbmlsZnNfYm1hcF9sb29rdXBfY29udGlnKAorCQkJTklMRlNfSShpbm9kZSktPmlfYm1hcCwgYmxrb2ZmLCAmYmxrcGh5LCBtYXhibG9ja3MpOworCQl1cF9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CisKKwkJaWYgKG4gPCAwKSB7CisJCQlpbnQgcGFzdF9lb2Y7CisKKwkJCWlmICh1bmxpa2VseShuICE9IC1FTk9FTlQpKQorCQkJCWJyZWFrOyAvKiBlcnJvciAqLworCisJCQkvKiBIT0xFICovCisJCQlibGtvZmYrKzsKKwkJCXBhc3RfZW9mID0gKChibGtvZmYgPDwgYmxrYml0cykgPj0gaXNpemUpOworCisJCQlpZiAoc2l6ZSkgeworCQkJCS8qIEVuZCBvZiB0aGUgY3VycmVudCBleHRlbnQgKi8KKworCQkJCWlmIChwYXN0X2VvZikKKwkJCQkJZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9MQVNUOworCisJCQkJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoCisJCQkJCWZpZWluZm8sIGxvZ2ljYWwsIHBoeXMsIHNpemUsIGZsYWdzKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCQlzaXplID0gMDsKKwkJCX0KKwkJCWlmIChibGtvZmYgPiBlbmRfYmxrb2ZmIHx8IHBhc3RfZW9mKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKHNpemUpIHsKKwkJCQlpZiAocGh5cyAmJiBibGtwaHkgPDwgYmxrYml0cyA9PSBwaHlzICsgc2l6ZSkgeworCQkJCQkvKiBUaGUgY3VycmVudCBleHRlbnQgZ29lcyBvbiAqLworCQkJCQlzaXplICs9IG4gPDwgYmxrYml0czsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgZXh0ZW50ICovCisJCQkJCXJldCA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KAorCQkJCQkJZmllaW5mbywgbG9naWNhbCwgcGh5cywgc2l6ZSwKKwkJCQkJCWZsYWdzKTsKKwkJCQkJaWYgKHJldCB8fCBibGtvZmYgPiBlbmRfYmxrb2ZmKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJLyogU3RhcnQgYW5vdGhlciBleHRlbnQgKi8KKwkJCQkJZmxhZ3MgPSBGSUVNQVBfRVhURU5UX01FUkdFRDsKKwkJCQkJbG9naWNhbCA9IGJsa29mZiA8PCBibGtiaXRzOworCQkJCQlwaHlzID0gYmxrcGh5IDw8IGJsa2JpdHM7CisJCQkJCXNpemUgPSBuIDw8IGJsa2JpdHM7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTdGFydCBhIG5ldyBleHRlbnQgKi8KKwkJCQlmbGFncyA9IEZJRU1BUF9FWFRFTlRfTUVSR0VEOworCQkJCWxvZ2ljYWwgPSBibGtvZmYgPDwgYmxrYml0czsKKwkJCQlwaHlzID0gYmxrcGh5IDw8IGJsa2JpdHM7CisJCQkJc2l6ZSA9IG4gPDwgYmxrYml0czsKKwkJCX0KKwkJCWJsa29mZiArPSBuOworCQl9CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKHRydWUpOworCisJLyogSWYgcmV0IGlzIDEgdGhlbiB3ZSBqdXN0IGhpdCB0aGUgZW5kIG9mIHRoZSBleHRlbnQgYXJyYXkgKi8KKwlpZiAocmV0ID09IDEpCisJCXJldCA9IDA7CisKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lvY3RsLmMgYi9mcy9uaWxmczIvaW9jdGwuYwppbmRleCBiMTg1ZTkzLi40OTY3Mzg5IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaW9jdGwuYworKysgYi9mcy9uaWxmczIvaW9jdGwuYwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJaW50IHJldDsKIAogCWRvd25fcmVhZCgmbmlsZnMtPm5zX3NlZ2N0b3Jfc2VtKTsKLQlyZXQgPSBuaWxmc19kYXRfZ2V0X3ZpbmZvKG5pbGZzX2RhdF9pbm9kZShuaWxmcyksIGJ1Ziwgc2l6ZSwgbm1lbWJzKTsKKwlyZXQgPSBuaWxmc19kYXRfZ2V0X3ZpbmZvKG5pbGZzLT5uc19kYXQsIGJ1Ziwgc2l6ZSwgbm1lbWJzKTsKIAl1cF9yZWFkKCZuaWxmcy0+bnNfc2VnY3Rvcl9zZW0pOwogCXJldHVybiByZXQ7CiB9CkBAIC0yNDIsOCArMjQyLDcgQEAKIG5pbGZzX2lvY3RsX2RvX2dldF9iZGVzY3Moc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpwb3NwLCBpbnQgZmxhZ3MsCiAJCQkgIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYnMpCiB7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUobmlsZnMpOwotCXN0cnVjdCBuaWxmc19ibWFwICpibWFwID0gTklMRlNfSShkYXQpLT5pX2JtYXA7CisJc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAgPSBOSUxGU19JKG5pbGZzLT5uc19kYXQpLT5pX2JtYXA7CiAJc3RydWN0IG5pbGZzX2JkZXNjICpiZGVzY3MgPSBidWY7CiAJaW50IHJldCwgaTsKIApAQCAtNDIxLDcgKzQyMCw3IEBACiAJc2l6ZV90IG5tZW1icyA9IGFyZ3YtPnZfbm1lbWJzOwogCWludCByZXQ7CiAKLQlyZXQgPSBuaWxmc19kYXRfZnJlZXYobmlsZnNfZGF0X2lub2RlKG5pbGZzKSwgYnVmLCBubWVtYnMpOworCXJldCA9IG5pbGZzX2RhdF9mcmVldihuaWxmcy0+bnNfZGF0LCBidWYsIG5tZW1icyk7CiAKIAlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogbm1lbWJzOwogfQpAQCAtNDMwLDggKzQyOSw3IEBACiAJCQkJCSBzdHJ1Y3QgbmlsZnNfYXJndiAqYXJndiwgdm9pZCAqYnVmKQogewogCXNpemVfdCBubWVtYnMgPSBhcmd2LT52X25tZW1iczsKLQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IG5pbGZzX2RhdF9pbm9kZShuaWxmcyk7Ci0Jc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAgPSBOSUxGU19JKGRhdCktPmlfYm1hcDsKKwlzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCA9IE5JTEZTX0kobmlsZnMtPm5zX2RhdCktPmlfYm1hcDsKIAlzdHJ1Y3QgbmlsZnNfYmRlc2MgKmJkZXNjcyA9IGJ1ZjsKIAlpbnQgcmV0LCBpOwogCkBAIC00NTAsNyArNDQ4LDcgQEAKIAkJCS8qIHNraXAgZGVhZCBibG9jayAqLwogCQkJY29udGludWU7CiAJCWlmIChiZGVzY3NbaV0uYmRfbGV2ZWwgPT0gMCkgewotCQkJcmV0ID0gbmlsZnNfbWR0X21hcmtfYmxvY2tfZGlydHkoZGF0LAorCQkJcmV0ID0gbmlsZnNfbWR0X21hcmtfYmxvY2tfZGlydHkobmlsZnMtPm5zX2RhdCwKIAkJCQkJCQkgYmRlc2NzW2ldLmJkX29mZnNldCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCVdBUk5fT04ocmV0ID09IC1FTk9FTlQpOwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL21kdC5jIGIvZnMvbmlsZnMyL21kdC5jCmluZGV4IDM5YTViODQuLjZhMGUyYTEgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9tZHQuYworKysgYi9mcy9uaWxmczIvbWR0LmMKQEAgLTIzNyw4ICsyMzcsNiBAQAogICoKICAqICUtRU5PRU5UIC0gdGhlIHNwZWNpZmllZCBibG9jayBkb2VzIG5vdCBleGlzdCAoaG9sZSBibG9jaykKICAqCi0gKiAlLUVJTlZBTCAtIGJtYXAgaXMgYnJva2VuLiAodGhlIGNhbGxlciBzaG91bGQgY2FsbCBuaWxmc19lcnJvcigpKQotICoKICAqICUtRVJPRlMgLSBSZWFkIG9ubHkgZmlsZXN5c3RlbSAoZm9yIGNyZWF0ZSBtb2RlKQogICovCiBpbnQgbmlsZnNfbWR0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsa29mZiwgaW50IGNyZWF0ZSwKQEAgLTI3Myw4ICsyNzEsNiBAQAogICogJS1FTk9NRU0gLSBJbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZS4KICAqCiAgKiAlLUVJTyAtIEkvTyBlcnJvcgotICoKLSAqICUtRUlOVkFMIC0gYm1hcCBpcyBicm9rZW4uICh0aGUgY2FsbGVyIHNob3VsZCBjYWxsIG5pbGZzX2Vycm9yKCkpCiAgKi8KIGludCBuaWxmc19tZHRfZGVsZXRlX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxvY2spCiB7CkBAIC0zNTAsOCArMzQ2LDYgQEAKICAqICUtRUlPIC0gSS9PIGVycm9yCiAgKgogICogJS1FTk9FTlQgLSB0aGUgc3BlY2lmaWVkIGJsb2NrIGRvZXMgbm90IGV4aXN0IChob2xlIGJsb2NrKQotICoKLSAqICUtRUlOVkFMIC0gYm1hcCBpcyBicm9rZW4uICh0aGUgY2FsbGVyIHNob3VsZCBjYWxsIG5pbGZzX2Vycm9yKCkpCiAgKi8KIGludCBuaWxmc19tZHRfbWFya19ibG9ja19kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGJsb2NrKQogewpAQCAtNDk5LDMxICs0OTMsMjkgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX2Zyb3plbjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7Ci0JaW50IHJldCA9IC1FTk9NRU07CiAKIAlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKCZzaGFkb3ctPmZyb3plbl9kYXRhLCBiaC0+Yl9wYWdlLT5pbmRleCk7CiAJaWYgKCFwYWdlKQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKIAkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgMSA8PCBibGtiaXRzLCAwKTsKIAogCWJoX2Zyb3plbiA9IG5pbGZzX3BhZ2VfZ2V0X250aF9ibG9jayhwYWdlLCBiaF9vZmZzZXQoYmgpID4+IGJsa2JpdHMpOwotCWlmIChiaF9mcm96ZW4pIHsKLQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhfZnJvemVuKSkKLQkJCW5pbGZzX2NvcHlfYnVmZmVyKGJoX2Zyb3plbiwgYmgpOwotCQlpZiAobGlzdF9lbXB0eSgmYmhfZnJvemVuLT5iX2Fzc29jX2J1ZmZlcnMpKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZiaF9mcm96ZW4tPmJfYXNzb2NfYnVmZmVycywKLQkJCQkgICAgICAmc2hhZG93LT5mcm96ZW5fYnVmZmVycyk7Ci0JCQlzZXRfYnVmZmVyX25pbGZzX3JlZGlyZWN0ZWQoYmgpOwotCQl9IGVsc2UgewotCQkJYnJlbHNlKGJoX2Zyb3plbik7IC8qIGFscmVhZHkgZnJvemVuICovCi0JCX0KLQkJcmV0ID0gMDsKKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoX2Zyb3plbikpCisJCW5pbGZzX2NvcHlfYnVmZmVyKGJoX2Zyb3plbiwgYmgpOworCWlmIChsaXN0X2VtcHR5KCZiaF9mcm96ZW4tPmJfYXNzb2NfYnVmZmVycykpIHsKKwkJbGlzdF9hZGRfdGFpbCgmYmhfZnJvemVuLT5iX2Fzc29jX2J1ZmZlcnMsCisJCQkgICAgICAmc2hhZG93LT5mcm96ZW5fYnVmZmVycyk7CisJCXNldF9idWZmZXJfbmlsZnNfcmVkaXJlY3RlZChiaCk7CisJfSBlbHNlIHsKKwkJYnJlbHNlKGJoX2Zyb3plbik7IC8qIGFscmVhZHkgZnJvemVuICovCiAJfQorCiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBidWZmZXJfaGVhZCAqCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbmFtZWkuYyBiL2ZzL25pbGZzMi9uYW1laS5jCmluZGV4IDZlOTU1N2UuLjk4MDM0MjcgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9uYW1laS5jCisrKyBiL2ZzL25pbGZzMi9uYW1laS5jCkBAIC01NzcsNiArNTc3LDcgQEAKIAkucmVuYW1lCQk9IG5pbGZzX3JlbmFtZSwKIAkuc2V0YXR0cgk9IG5pbGZzX3NldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBuaWxmc19wZXJtaXNzaW9uLAorCS5maWVtYXAJCT0gbmlsZnNfZmllbWFwLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmlsZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL25pbGZzLmggYi9mcy9uaWxmczIvbmlsZnMuaAppbmRleCAwY2E5ODgyLi43NzdlOGZkIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvbmlsZnMuaAorKysgYi9mcy9uaWxmczIvbmlsZnMuaApAQCAtMTkwLDExICsxOTAsNiBAQAogCXJldHVybiBuaWxmc190ZXN0X3RyYW5zYWN0aW9uX2ZsYWcoTklMRlNfVElfV1JJVEVSKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2RhdF9pbm9kZShjb25zdCBzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcykKLXsKLQlyZXR1cm4gbmlsZnMtPm5zX2RhdDsKLX0KLQogLyoKICAqIGZ1bmN0aW9uIHByb3RvdHlwZQogICovCkBAIC0yNTcsMTMgKzI1MiwxMyBAQAogZXh0ZXJuIHZvaWQgbmlsZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBuaWxmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogaW50IG5pbGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gaW50IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc3RydWN0IG5pbGZzX3NiX2luZm8gKiwgc3RydWN0IGlub2RlICosCi0JCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworaW50IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoKTsKIGV4dGVybiBpbnQgbmlsZnNfaW5vZGVfZGlydHkoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIGludCBuaWxmc19zZXRfZmlsZV9kaXJ0eShzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgaW5vZGUgKiwKLQkJCQl1bnNpZ25lZCk7CitpbnQgbmlsZnNfc2V0X2ZpbGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbnJfZGlydHkpOwogZXh0ZXJuIGludCBuaWxmc19tYXJrX2lub2RlX2RpcnR5KHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiB2b2lkIG5pbGZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2ludCBuaWxmc19maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJIF9fdTY0IHN0YXJ0LCBfX3U2NCBsZW4pOwogCiAvKiBzdXBlci5jICovCiBleHRlcm4gc3RydWN0IGlub2RlICpuaWxmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvcGFnZS5jIGIvZnMvbmlsZnMyL3BhZ2UuYwppbmRleCBhNmMzYzJlOC4uMGM0MzI0MSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3BhZ2UuYworKysgYi9mcy9uaWxmczIvcGFnZS5jCkBAIC00OTEsNyArNDkxLDcgQEAKIAl9CiAJcmV0dXJuIG5jOwogfQotIAorCiB2b2lkIG5pbGZzX21hcHBpbmdfaW5pdF9vbmNlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQogewogCW1lbXNldChtYXBwaW5nLCAwLCBzaXplb2YoKm1hcHBpbmcpKTsKQEAgLTU0NiwzICs1NDYsODcgQEAKIAl9CiAJcmV0dXJuIFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKTsKIH0KKworLyoqCisgKiBuaWxmc19maW5kX3VuY29tbWl0dGVkX2V4dGVudCAtIGZpbmQgZXh0ZW50IG9mIHVuY29tbWl0dGVkIGRhdGEKKyAqIEBpbm9kZTogaW5vZGUKKyAqIEBzdGFydF9ibGs6IHN0YXJ0IGJsb2NrIG9mZnNldCAoaW4pCisgKiBAYmxrb2ZmOiBzdGFydCBvZmZzZXQgb2YgdGhlIGZvdW5kIGV4dGVudCAob3V0KQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgYW4gZXh0ZW50IG9mIGJ1ZmZlcnMgbWFya2VkICJkZWxheWVkIiB3aGljaAorICogc3RhcnRzIGZyb20gYSBibG9jayBvZmZzZXQgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gQHN0YXJ0X2Jsay4gIElmCisgKiBzdWNoIGFuIGV4dGVudCB3YXMgZm91bmQsIHRoaXMgd2lsbCBzdG9yZSB0aGUgc3RhcnQgb2Zmc2V0IGluCisgKiBAYmxrb2ZmIGFuZCByZXR1cm4gaXRzIGxlbmd0aCBpbiBibG9ja3MuICBPdGhlcndpc2UsIHplcm8gaXMKKyAqIHJldHVybmVkLgorICovCit1bnNpZ25lZCBsb25nIG5pbGZzX2ZpbmRfdW5jb21taXR0ZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzZWN0b3JfdCBzdGFydF9ibGssCisJCQkJCSAgICBzZWN0b3JfdCAqYmxrb2ZmKQoreworCXVuc2lnbmVkIGludCBpOworCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgaW50IG5ibG9ja3NfaW5fcGFnZTsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7CisJc2VjdG9yX3QgYjsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpbmRleCA9IHN0YXJ0X2JsayA+PiAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCW5ibG9ja3NfaW5fcGFnZSA9IDFVIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCityZXBlYXQ6CisJcHZlYy5uciA9IGZpbmRfZ2V0X3BhZ2VzX2NvbnRpZyhpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCwgUEFHRVZFQ19TSVpFLAorCQkJCQlwdmVjLnBhZ2VzKTsKKwlpZiAocHZlYy5uciA9PSAwKQorCQlyZXR1cm4gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA+IDAgJiYgcHZlYy5wYWdlc1swXS0+aW5kZXggPiBpbmRleCkKKwkJZ290byBvdXQ7CisKKwliID0gcHZlYy5wYWdlc1swXS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwlpID0gMDsKKwlkbyB7CisJCXBhZ2UgPSBwdmVjLnBhZ2VzW2ldOworCisJCWxvY2tfcGFnZShwYWdlKTsKKwkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCisJCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQlkbyB7CisJCQkJaWYgKGIgPCBzdGFydF9ibGspCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQkJCWlmIChsZW5ndGggPT0gMCkKKwkJCQkJCSpibGtvZmYgPSBiOworCQkJCQlsZW5ndGgrKzsKKwkJCQl9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKwkJCQkJZ290byBvdXRfbG9ja2VkOworCQkJCX0KKwkJCX0gd2hpbGUgKCsrYiwgYmggPSBiaC0+Yl90aGlzX3BhZ2UsIGJoICE9IGhlYWQpOworCQl9IGVsc2UgeworCQkJaWYgKGxlbmd0aCA+IDApCisJCQkJZ290byBvdXRfbG9ja2VkOworCisJCQliICs9IG5ibG9ja3NfaW5fcGFnZTsKKwkJfQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKworCX0gd2hpbGUgKCsraSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpKTsKKworCWluZGV4ID0gcGFnZS0+aW5kZXggKyAxOworCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJY29uZF9yZXNjaGVkKCk7CisJZ290byByZXBlYXQ7CisKK291dF9sb2NrZWQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CitvdXQ6CisJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwlyZXR1cm4gbGVuZ3RoOworfQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3BhZ2UuaCBiL2ZzL25pbGZzMi9wYWdlLmgKaW5kZXggZmI5ZThhOC4uNjIyZGYyNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3BhZ2UuaAorKysgYi9mcy9uaWxmczIvcGFnZS5oCkBAIC02Niw2ICs2Niw5IEBACiAJCQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpLAogCQkJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyk7CiB1bnNpZ25lZCBuaWxmc19wYWdlX2NvdW50X2NsZWFuX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK3Vuc2lnbmVkIGxvbmcgbmlsZnNfZmluZF91bmNvbW1pdHRlZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHNlY3Rvcl90IHN0YXJ0X2JsaywKKwkJCQkJICAgIHNlY3Rvcl90ICpibGtvZmYpOwogCiAjZGVmaW5lIE5JTEZTX1BBR0VfQlVHKHBhZ2UsIG0sIGEuLi4pIFwKIAlkbyB7IG5pbGZzX3BhZ2VfYnVnKHBhZ2UpOyBCVUcoKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9yZWNvdmVyeS5jIGIvZnMvbmlsZnMyL3JlY292ZXJ5LmMKaW5kZXggNWQyNzExYzIuLjNkZmNkM2IgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9yZWNvdmVyeS5jCisrKyBiL2ZzL25pbGZzMi9yZWNvdmVyeS5jCkBAIC01MzUsNyArNTM1LDcgQEAKIAkJaWYgKHVubGlrZWx5KGVycikpCiAJCQlnb3RvIGZhaWxlZF9wYWdlOwogCi0JCWVyciA9IG5pbGZzX3NldF9maWxlX2RpcnR5KHNiaSwgaW5vZGUsIDEpOworCQllcnIgPSBuaWxmc19zZXRfZmlsZV9kaXJ0eShpbm9kZSwgMSk7CiAJCWlmICh1bmxpa2VseShlcnIpKQogCQkJZ290byBmYWlsZWRfcGFnZTsKIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NiLmggYi9mcy9uaWxmczIvc2IuaAppbmRleCAzNWEwNzE1Li43YTE3NzE1IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc2IuaAorKysgYi9mcy9uaWxmczIvc2IuaApAQCAtMjcsMTQgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKLS8qCi0gKiBNb3VudCBvcHRpb25zCi0gKi8KLXN0cnVjdCBuaWxmc19tb3VudF9vcHRpb25zIHsKLQl1bnNpZ25lZCBsb25nIG1vdW50X29wdDsKLQlfX3U2NCBzbmFwc2hvdF9jbm87Ci19OwotCiBzdHJ1Y3QgdGhlX25pbGZzOwogc3RydWN0IG5pbGZzX3NjX2luZm87CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zZWdtZW50LmMgYi9mcy9uaWxmczIvc2VnbWVudC5jCmluZGV4IDY4N2QwOTAuLjU1ZWJhZTUgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9zZWdtZW50LmMKKysrIGIvZnMvbmlsZnMyL3NlZ21lbnQuYwpAQCAtNTA0LDE3ICs1MDQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbmlsZnNfaGFuZGxlX2JtYXBfZXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqZm5hbWUsCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlpZiAoZXJyID09IC1FSU5WQUwpIHsKLQkJbmlsZnNfZXJyb3Ioc2IsIGZuYW1lLCAiYnJva2VuIGJtYXAgKGlub2RlPSVsdSlcbiIsCi0JCQkgICAgaW5vZGUtPmlfaW5vKTsKLQkJZXJyID0gLUVJTzsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQogLyoKICAqIENhbGxiYWNrIGZ1bmN0aW9ucyB0aGF0IGVudW1lcmF0ZSwgbWFyaywgYW5kIGNvbGxlY3QgZGlydHkgYmxvY2tzCiAgKi8KQEAgLTUyNCw5ICs1MTMsOCBAQAogCWludCBlcnI7CiAKIAllcnIgPSBuaWxmc19ibWFwX3Byb3BhZ2F0ZShOSUxGU19JKGlub2RlKS0+aV9ibWFwLCBiaCk7Ci0JaWYgKHVubGlrZWx5KGVyciA8IDApKQotCQlyZXR1cm4gbmlsZnNfaGFuZGxlX2JtYXBfZXJyb3IoZXJyLCBfX2Z1bmNfXywgaW5vZGUsCi0JCQkJCSAgICAgICBzY2ktPnNjX3N1cGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IG5pbGZzX3NlZ2N0b3JfYWRkX2ZpbGVfYmxvY2soc2NpLCBiaCwgaW5vZGUsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgbmlsZnNfYmluZm9fdikpOwpAQCAtNTM5LDEzICs1MjcsNyBAQAogCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbnQgZXJyOwotCi0JZXJyID0gbmlsZnNfYm1hcF9wcm9wYWdhdGUoTklMRlNfSShpbm9kZSktPmlfYm1hcCwgYmgpOwotCWlmICh1bmxpa2VseShlcnIgPCAwKSkKLQkJcmV0dXJuIG5pbGZzX2hhbmRsZV9ibWFwX2Vycm9yKGVyciwgX19mdW5jX18sIGlub2RlLAotCQkJCQkgICAgICAgc2NpLT5zY19zdXBlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG5pbGZzX2JtYXBfcHJvcGFnYXRlKE5JTEZTX0koaW5vZGUpLT5pX2JtYXAsIGJoKTsKIH0KIAogc3RhdGljIGludCBuaWxmc19jb2xsZWN0X2ZpbGVfYm1hcChzdHJ1Y3QgbmlsZnNfc2NfaW5mbyAqc2NpLApAQCAtNTg4LDkgKzU3MCw4IEBACiAJaW50IGVycjsKIAogCWVyciA9IG5pbGZzX2JtYXBfcHJvcGFnYXRlKE5JTEZTX0koaW5vZGUpLT5pX2JtYXAsIGJoKTsKLQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCi0JCXJldHVybiBuaWxmc19oYW5kbGVfYm1hcF9lcnJvcihlcnIsIF9fZnVuY19fLCBpbm9kZSwKLQkJCQkJICAgICAgIHNjaS0+c2Nfc3VwZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gbmlsZnNfc2VnY3Rvcl9hZGRfZmlsZV9ibG9jayhzY2ksIGJoLCBpbm9kZSwgc2l6ZW9mKF9fbGU2NCkpOwogCWlmICghZXJyKQpAQCAtNzc2LDkgKzc1Nyw4IEBACiAJCXJldCsrOwogCWlmIChuaWxmc19tZHRfZmV0Y2hfZGlydHkobmlsZnMtPm5zX3N1ZmlsZSkpCiAJCXJldCsrOwotCWlmIChyZXQgfHwgbmlsZnNfZG9pbmdfZ2MoKSkKLQkJaWYgKG5pbGZzX21kdF9mZXRjaF9kaXJ0eShuaWxmc19kYXRfaW5vZGUobmlsZnMpKSkKLQkJCXJldCsrOworCWlmICgocmV0IHx8IG5pbGZzX2RvaW5nX2djKCkpICYmIG5pbGZzX21kdF9mZXRjaF9kaXJ0eShuaWxmcy0+bnNfZGF0KSkKKwkJcmV0Kys7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODE0LDcgKzc5NCw3IEBACiAJbmlsZnNfbWR0X2NsZWFyX2RpcnR5KHNjaS0+c2Nfcm9vdC0+aWZpbGUpOwogCW5pbGZzX21kdF9jbGVhcl9kaXJ0eShuaWxmcy0+bnNfY3BmaWxlKTsKIAluaWxmc19tZHRfY2xlYXJfZGlydHkobmlsZnMtPm5zX3N1ZmlsZSk7Ci0JbmlsZnNfbWR0X2NsZWFyX2RpcnR5KG5pbGZzX2RhdF9pbm9kZShuaWxmcykpOworCW5pbGZzX21kdF9jbGVhcl9kaXJ0eShuaWxmcy0+bnNfZGF0KTsKIH0KIAogc3RhdGljIGludCBuaWxmc19zZWdjdG9yX2NyZWF0ZV9jaGVja3BvaW50KHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2kpCkBAIC05MjMsNyArOTAzLDcgQEAKIAkJCSAgICAgIG5pbGZzLT5uc19ub25nY19jdGltZSA6IHNjaS0+c2Nfc2VnX2N0aW1lKTsKIAlyYXdfc3ItPnNyX2ZsYWdzID0gMDsKIAotCW5pbGZzX3dyaXRlX2lub2RlX2NvbW1vbihuaWxmc19kYXRfaW5vZGUobmlsZnMpLCAodm9pZCAqKXJhd19zciArCisJbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKG5pbGZzLT5uc19kYXQsICh2b2lkICopcmF3X3NyICsKIAkJCQkgTklMRlNfU1JfREFUX09GRlNFVChpc3opLCAxKTsKIAluaWxmc193cml0ZV9pbm9kZV9jb21tb24obmlsZnMtPm5zX2NwZmlsZSwgKHZvaWQgKilyYXdfc3IgKwogCQkJCSBOSUxGU19TUl9DUEZJTEVfT0ZGU0VUKGlzeiksIDEpOwpAQCAtMTE3OSw3ICsxMTU5LDcgQEAKIAkJc2NpLT5zY19zdGFnZS5zY250Kys7ICAvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIE5JTEZTX1NUX0RBVDoKICBkYXRfc3RhZ2U6Ci0JCWVyciA9IG5pbGZzX3NlZ2N0b3Jfc2Nhbl9maWxlKHNjaSwgbmlsZnNfZGF0X2lub2RlKG5pbGZzKSwKKwkJZXJyID0gbmlsZnNfc2VnY3Rvcl9zY2FuX2ZpbGUoc2NpLCBuaWxmcy0+bnNfZGF0LAogCQkJCQkgICAgICAmbmlsZnNfc2NfZGF0X29wcyk7CiAJCWlmICh1bmxpa2VseShlcnIpKQogCQkJYnJlYWs7CkBAIC0xNTYzLDcgKzE1NDMsNiBAQAogCXJldHVybiAwOwogCiAgZmFpbGVkX2JtYXA6Ci0JZXJyID0gbmlsZnNfaGFuZGxlX2JtYXBfZXJyb3IoZXJyLCBfX2Z1bmNfXywgaW5vZGUsIHNjaS0+c2Nfc3VwZXIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3ODMsNiArMTc2Miw3IEBACiAJCQkJaWYgKCFlcnIpIHsKIAkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CiAJCQkJCWNsZWFyX2J1ZmZlcl9uaWxmc192b2xhdGlsZShiaCk7CiAJCQkJfQogCQkJCWJyZWxzZShiaCk7IC8qIGZvciBiX2Fzc29jX2J1ZmZlcnMgKi8KQEAgLTE5MDksNiArMTg4OSw3IEBACiAJCQkJICAgIGJfYXNzb2NfYnVmZmVycykgewogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKIAkJCWNsZWFyX2J1ZmZlcl9uaWxmc192b2xhdGlsZShiaCk7CiAJCQljbGVhcl9idWZmZXJfbmlsZnNfcmVkaXJlY3RlZChiaCk7CiAJCQlpZiAoYmggPT0gc2VnYnVmLT5zYl9zdXBlcl9yb290KSB7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc3VwZXIuYyBiL2ZzL25pbGZzMi9zdXBlci5jCmluZGV4IGUyZGNjOWMuLjA5OTRmNmE3IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvc3VwZXIuYworKysgYi9mcy9uaWxmczIvc3VwZXIuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlICJuaWxmcy5oIgpAQCAtMTExLDEyICsxMTAsMTcgQEAKIAkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihzYik7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9DUklUICJOSUxGUyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJOSUxGUyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIAogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewpAQCAtMTM2LDEzICsxNDAsMTcgQEAKIHZvaWQgbmlsZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKIAkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJOSUxGUyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIk5JTEZTIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAlcFZcbiIsCisJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKQEAgLTEwMTAsMTEgKzEwMTgsMTEgQEAKIAlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0Ioc2IpOwogCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gc2JpLT5zX25pbGZzOwogCXVuc2lnbmVkIGxvbmcgb2xkX3NiX2ZsYWdzOwotCXN0cnVjdCBuaWxmc19tb3VudF9vcHRpb25zIG9sZF9vcHRzOworCXVuc2lnbmVkIGxvbmcgb2xkX21vdW50X29wdDsKIAlpbnQgZXJyOwogCiAJb2xkX3NiX2ZsYWdzID0gc2ItPnNfZmxhZ3M7Ci0Jb2xkX29wdHMubW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKKwlvbGRfbW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKIAogCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgMSkpIHsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTEwODMsNyArMTA5MSw3IEBACiAKICByZXN0b3JlX29wdHM6CiAJc2ItPnNfZmxhZ3MgPSBvbGRfc2JfZmxhZ3M7Ci0Jc2JpLT5zX21vdW50X29wdCA9IG9sZF9vcHRzLm1vdW50X29wdDsKKwlzYmktPnNfbW91bnRfb3B0ID0gb2xkX21vdW50X29wdDsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMTU1LDE0ICsxMTYzLDE0IEBACiB7CiAJc3RydWN0IG5pbGZzX3N1cGVyX2RhdGEgc2Q7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzOwotCWZtb2RlX3QgbW9kZSA9IEZNT0RFX1JFQUQ7CisJZm1vZGVfdCBtb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX0VYQ0w7CiAJc3RydWN0IGRlbnRyeSAqcm9vdF9kZW50cnk7CiAJaW50IGVyciwgc19uZXcgPSBmYWxzZTsKIAogCWlmICghKGZsYWdzICYgTVNfUkRPTkxZKSkKIAkJbW9kZSB8PSBGTU9ERV9XUklURTsKIAotCXNkLmJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldl9uYW1lLCBtb2RlLCBmc190eXBlKTsKKwlzZC5iZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKGRldl9uYW1lLCBtb2RlLCBmc190eXBlKTsKIAlpZiAoSVNfRVJSKHNkLmJkZXYpKQogCQlyZXR1cm4gRVJSX0NBU1Qoc2QuYmRldik7CiAKQEAgLTEyNDEsNyArMTI0OSw3IEBACiAJfQogCiAJaWYgKCFzX25ldykKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoc2QuYmRldiwgbW9kZSk7CisJCWJsa2Rldl9wdXQoc2QuYmRldiwgbW9kZSk7CiAKIAlyZXR1cm4gcm9vdF9kZW50cnk7CiAKQEAgLTEyNTAsNyArMTI1OCw3IEBACiAKICBmYWlsZWQ6CiAJaWYgKCFzX25ldykKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoc2QuYmRldiwgbW9kZSk7CisJCWJsa2Rldl9wdXQoc2QuYmRldiwgbW9kZSk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5jIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCmluZGV4IDAyNTRiZTIuLmFkNGFjNjAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYworKysgYi9mcy9uaWxmczIvdGhlX25pbGZzLmMKQEAgLTMyOSw3ICszMjksNiBAQAogCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOwogCiAgc2tpcF9yZWNvdmVyeToKLQlzZXRfbmlsZnNfbG9hZGVkKG5pbGZzKTsKIAluaWxmc19jbGVhcl9yZWNvdmVyeV9pbmZvKCZyaSk7CiAJc2JpLT5zX3N1cGVyLT5zX2ZsYWdzID0gc19mbGFnczsKIAlyZXR1cm4gMDsKQEAgLTY1MSwxMiArNjUwLDExIEBACiAKIGludCBuaWxmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc2VjdG9yX3QgKm5ibG9ja3MpCiB7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUobmlsZnMpOwogCXVuc2lnbmVkIGxvbmcgbmNsZWFuc2VnczsKIAotCWRvd25fcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCWRvd25fcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCW5jbGVhbnNlZ3MgPSBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3MobmlsZnMtPm5zX3N1ZmlsZSk7Ci0JdXBfcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCXVwX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKIAkqbmJsb2NrcyA9IChzZWN0b3JfdCluY2xlYW5zZWdzICogbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuaCBiL2ZzL25pbGZzMi90aGVfbmlsZnMuaAppbmRleCA2OTIyNmUxLi5mZDg1ZTRjIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmgKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5oCkBAIC0zNiw4ICszNiw2IEBACiAvKiB0aGVfbmlsZnMgc3RydWN0ICovCiBlbnVtIHsKIAlUSEVfTklMRlNfSU5JVCA9IDAsICAgICAvKiBJbmZvcm1hdGlvbiBmcm9tIHN1cGVyX2Jsb2NrIGlzIHNldCAqLwotCVRIRV9OSUxGU19MT0FERUQsICAgICAgIC8qIFJvbGwtYmFjay9yb2xsLWZvcndhcmQgaGFzIGRvbmUgYW5kCi0JCQkJICAgdGhlIGxhdGVzdCBjaGVja3BvaW50IHdhcyBsb2FkZWQgKi8KIAlUSEVfTklMRlNfRElTQ09OVElOVUVELAkvKiAnbmV4dCcgcG9pbnRlciBjaGFpbiBoYXMgYnJva2VuICovCiAJVEhFX05JTEZTX0dDX1JVTk5JTkcsCS8qIGdjIHByb2Nlc3MgaXMgcnVubmluZyAqLwogCVRIRV9OSUxGU19TQl9ESVJUWSwJLyogc3VwZXIgYmxvY2sgaXMgZGlydHkgKi8KQEAgLTE3OCw3ICsxNzYsNiBAQAogfQogCiBUSEVfTklMRlNfRk5TKElOSVQsIGluaXQpCi1USEVfTklMRlNfRk5TKExPQURFRCwgbG9hZGVkKQogVEhFX05JTEZTX0ZOUyhESVNDT05USU5VRUQsIGRpc2NvbnRpbnVlZCkKIFRIRV9OSUxGU19GTlMoR0NfUlVOTklORywgZ2NfcnVubmluZykKIFRIRV9OSUxGU19GTlMoU0JfRElSVFksIHNiX2RpcnR5KQpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L0tjb25maWcgYi9mcy9ub3RpZnkvZmFub3RpZnkvS2NvbmZpZwppbmRleCAzYWMzNmI3Yi4uN2RjZWZmMCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2Zhbm90aWZ5L0tjb25maWcKKysrIGIvZnMvbm90aWZ5L2Zhbm90aWZ5L0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAJLS0taGVscC0tLQogCSAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGZhbm90aWZ5IHN1cG9ydC4gIGZhbm90aWZ5IGlzIGEgZmlsZSBhY2Nlc3MKIAkgICBub3RpZmljYXRpb24gc3lzdGVtIHdoaWNoIGRpZmZlcnMgZnJvbSBpbm90aWZ5IGluIHRoYXQgaXQgc2VuZHMKLQkgICBhbmQgb3BlbiBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHVzZXJzcGFjZSBsaXN0ZW5lciBhbG9uZyB3aXRoCisJICAgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHVzZXJzcGFjZSBsaXN0ZW5lciBhbG9uZyB3aXRoCiAJICAgdGhlIGV2ZW50LgogCiAJICAgSWYgdW5zdXJlLCBzYXkgWS4KZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCmluZGV4IDU4YjZiZTkuLjRmZjAyOGYgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvTWFrZWZpbGUKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAkgICAgIGluZGV4Lm8gaW5vZGUubyBtZnQubyBtc3QubyBuYW1laS5vIHJ1bmxpc3QubyBzdXBlci5vIHN5c2N0bC5vIFwKIAkgICAgIHVuaXN0ci5vIHVwY2FzZS5vCiAKLUVYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjI5XCIKK0VYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjMwXCIKIAogaWZlcSAoJChDT05GSUdfTlRGU19ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9mcy9udGZzL2ZpbGUuYyBiL2ZzL250ZnMvZmlsZS5jCmluZGV4IDExM2ViZDkuLmY0YjEwNTcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZmlsZS5jCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGZpbGUuYyAtIE5URlMga2VybmVsIGZpbGUgb3BlcmF0aW9ucy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDExIEFudG9uIEFsdGFwYXJtYWtvdiBhbmQgVHV4ZXJhIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCkBAIC0xMzgwLDE1ICsxMzgwLDE0IEBACiAgKiBwYWdlcyAob3V0IHRvIG9mZnNldCArIGJ5dGVzKSwgdG8gZW11bGF0ZSBudGZzX2NvcHlfZnJvbV91c2VyKCkncwogICogc2luZ2xlLXNlZ21lbnQgYmVoYXZpb3VyLgogICoKLSAqIFdlIGNhbGwgdGhlIHNhbWUgaGVscGVyIChfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoKSkgYm90aAotICogd2hlbiBhdG9taWMgYW5kIHdoZW4gbm90IGF0b21pYy4gIFRoaXMgaXMgb2sgYmVjYXVzZQotICogX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKCkgY2FsbHMgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpCi0gKiBhbmQgaXQgaXMgb2sgdG8gY2FsbCB0aGlzIHdoZW4gbm9uLWF0b21pYy4KLSAqIEluZmFjdCwgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBhbmQKKyAqIFdlIGNhbGwgdGhlIHNhbWUgaGVscGVyIChfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoKSkgYm90aCB3aGVuCisgKiBhdG9taWMgYW5kIHdoZW4gbm90IGF0b21pYy4gIFRoaXMgaXMgb2sgYmVjYXVzZSBpdCBjYWxscworICogX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpIGFuZCBpdCBpcyBvayB0byBjYWxsIHRoaXMgd2hlbiBub24tYXRvbWljLiAgSW4KKyAqIGZhY3QsIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgYW5kCiAgKiBfX2NvcHlfZnJvbV91c2VyKCkgaXMgdGhhdCB0aGUgbGF0dGVyIGNhbGxzIG1pZ2h0X3NsZWVwKCkgYW5kIHRoZSBmb3JtZXIKLSAqIHNob3VsZCBub3QgemVybyB0aGUgdGFpbCBvZiB0aGUgYnVmZmVyIG9uIGVycm9yLiAgQW5kIG9uIG1hbnkKLSAqIGFyY2hpdGVjdHVyZXMgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpIGlzIGp1c3QgZGVmaW5lZCB0bwotICogX19jb3B5X2Zyb21fdXNlcigpIHNvIGl0IG1ha2VzIG5vIGRpZmZlcmVuY2UgYXQgYWxsIG9uIHRob3NlIGFyY2hpdGVjdHVyZXMuCisgKiBzaG91bGQgbm90IHplcm8gdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlciBvbiBlcnJvci4gIEFuZCBvbiBtYW55IGFyY2hpdGVjdHVyZXMKKyAqIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBpcyBqdXN0IGRlZmluZWQgdG8gX19jb3B5X2Zyb21fdXNlcigpIHNvIGl0CisgKiBtYWtlcyBubyBkaWZmZXJlbmNlIGF0IGFsbCBvbiB0aG9zZSBhcmNoaXRlY3R1cmVzLgogICovCiBzdGF0aWMgaW5saW5lIHNpemVfdCBudGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKHN0cnVjdCBwYWdlICoqcGFnZXMsCiAJCXVuc2lnbmVkIG5yX3BhZ2VzLCB1bnNpZ25lZCBvZnMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqKmlvdiwKQEAgLTE0MDksMjggKzE0MDgsMjggQEAKIAkJaWYgKHVubGlrZWx5KGNvcGllZCAhPSBsZW4pKSB7CiAJCQkvKiBEbyBpdCB0aGUgc2xvdyB3YXkuICovCiAJCQlhZGRyID0ga21hcCgqcGFnZXMpOwotCQkJY29waWVkID0gX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGFkZHIgKyBvZnMsCi0JCQkJCSppb3YsICppb3Zfb2ZzLCBsZW4pOwotCQkJLyoKLQkJCSAqIFplcm8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBsaWtlIF9fY29weV9mcm9tX3VzZXIoKS4KLQkJCSAqLwotCQkJbWVtc2V0KGFkZHIgKyBvZnMgKyBjb3BpZWQsIDAsIGxlbiAtIGNvcGllZCk7Ci0JCQlrdW5tYXAoKnBhZ2VzKTsKKwkJCWNvcGllZCA9IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhhZGRyICsKKwkJCQkJb2ZzLCAqaW92LCAqaW92X29mcywgbGVuKTsKIAkJCWlmICh1bmxpa2VseShjb3BpZWQgIT0gbGVuKSkKIAkJCQlnb3RvIGVycl9vdXQ7CisJCQlrdW5tYXAoKnBhZ2VzKTsKIAkJfQogCQl0b3RhbCArPSBsZW47CisJCW50ZnNfc2V0X25leHRfaW92ZWMoaW92LCBpb3Zfb2ZzLCBsZW4pOwogCQlieXRlcyAtPSBsZW47CiAJCWlmICghYnl0ZXMpCiAJCQlicmVhazsKLQkJbnRmc19zZXRfbmV4dF9pb3ZlYyhpb3YsIGlvdl9vZnMsIGxlbik7CiAJCW9mcyA9IDA7CiAJfSB3aGlsZSAoKytwYWdlcyA8IGxhc3RfcGFnZSk7CiBvdXQ6CiAJcmV0dXJuIHRvdGFsOwogZXJyX291dDoKLQl0b3RhbCArPSBjb3BpZWQ7CisJQlVHX09OKGNvcGllZCA+IGxlbik7CiAJLyogWmVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlcigpLiAqLworCW1lbXNldChhZGRyICsgb2ZzICsgY29waWVkLCAwLCBsZW4gLSBjb3BpZWQpOworCWt1bm1hcCgqcGFnZXMpOworCXRvdGFsICs9IGNvcGllZDsKKwludGZzX3NldF9uZXh0X2lvdmVjKGlvdiwgaW92X29mcywgY29waWVkKTsKIAl3aGlsZSAoKytwYWdlcyA8IGxhc3RfcGFnZSkgewogCQlieXRlcyAtPSBsZW47CiAJCWlmICghYnl0ZXMpCmRpZmYgLS1naXQgYS9mcy9udGZzL3N1cGVyLmMgYi9mcy9udGZzL3N1cGVyLmMKaW5kZXggYTMwZWNhY2MuLjI5MDk5YTAgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogc3VwZXIuYyAtIE5URlMga2VybmVsIHN1cGVyIGJsb2NrIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAxMSBBbnRvbiBBbHRhcGFybWFrb3YgYW5kIFR1eGVyYSBJbmMuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEsMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMTkzLDggKzMxOTMsOCBAQAogCW50ZnNfc3lzY3RsKDApOwogfQogCi1NT0RVTEVfQVVUSE9SKCJBbnRvbiBBbHRhcGFybWFrb3YgPGFpYTIxQGNhbnRhYi5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5URlMgMS4yLzMueCBkcml2ZXIgLSBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBBbnRvbiBBbHRhcGFybWFrb3YiKTsKK01PRFVMRV9BVVRIT1IoIkFudG9uIEFsdGFwYXJtYWtvdiA8YW50b25AdHV4ZXJhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlRGUyAxLjIvMy54IGRyaXZlciAtIENvcHlyaWdodCAoYykgMjAwMS0yMDExIEFudG9uIEFsdGFwYXJtYWtvdiBhbmQgVHV4ZXJhIEluYy4iKTsKIE1PRFVMRV9WRVJTSU9OKE5URlNfVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL0tjb25maWcgYi9mcy9vY2ZzMi9LY29uZmlnCmluZGV4IDBkODQwNjYuLmFiMTUyYzAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL0tjb25maWcKKysrIGIvZnMvb2NmczIvS2NvbmZpZwpAQCAtNTEsNyArNTEsNyBAQAogCiBjb25maWcgT0NGUzJfRlNfU1RBVFMKIAlib29sICJPQ0ZTMiBzdGF0aXN0aWNzIgotCWRlcGVuZHMgb24gT0NGUzJfRlMKKwlkZXBlbmRzIG9uIE9DRlMyX0ZTICYmIERFQlVHX0ZTCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWxsb3dzIHNvbWUgZnMgc3RhdGlzdGljcyB0byBiZSBjYXB0dXJlZC4gRW5hYmxpbmcKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDU5MmZhZTUuLmU0OTg0ZTIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNTY1LDcgKzU2NSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0Yyk7CiBzdGF0aWMgaW50IG9jZnMyX2NhY2hlX2V4dGVudF9ibG9ja19mcmVlKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAogCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwogc3RhdGljIHZvaWQgb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKGhhbmRsZV90ICpoYW5kbGUsCkBAIC01ODU4LDYgKzU4NTcsNyBAQAogCiAJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHRsX2JoKTsKIAorCW9zYi0+dHJ1bmNhdGVkX2NsdXN0ZXJzICs9IG51bV9jbHVzdGVyczsKIGJhaWw6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU5MjksNiArNTkyOSw4IEBACiAJCWktLTsKIAl9CiAKKwlvc2ItPnRydW5jYXRlZF9jbHVzdGVycyA9IDA7CisKIGJhaWw6CiAJbWxvZ19leGl0KHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTcxMzksNjQgKzcxNDEsNiBAQAogfQogCiAvKgotICogRXhwZWN0cyB0aGUgaW5vZGUgdG8gYWxyZWFkeSBiZSBsb2NrZWQuCi0gKi8KLWludCBvY2ZzMl9wcmVwYXJlX3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAotCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCAqKnRjKQotewotCWludCBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IG5ld19pX2NsdXN0ZXJzOwotCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCA9IE5VTEw7Ci0KLQltbG9nX2VudHJ5X3ZvaWQoKTsKLQotCSp0YyA9IE5VTEw7Ci0KLQluZXdfaV9jbHVzdGVycyA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLAotCQkJCQkJICBpX3NpemVfcmVhZChpbm9kZSkpOwotCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKLQotCW1sb2coMCwgImZlLT5pX2NsdXN0ZXJzID0gJXUsIG5ld19pX2NsdXN0ZXJzID0gJXUsIGZlLT5pX3NpemUgPSIKLQkgICAgICIlbGx1XG4iLCBsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycyksIG5ld19pX2NsdXN0ZXJzLAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShmZS0+aV9zaXplKSk7Ci0KLQkqdGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfdHJ1bmNhdGVfY29udGV4dCksIEdGUF9LRVJORUwpOwotCWlmICghKCp0YykpIHsKLQkJc3RhdHVzID0gLUVOT01FTTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIGJhaWw7Ci0JfQotCW9jZnMyX2luaXRfZGVhbGxvY19jdHh0KCYoKnRjKS0+dGNfZGVhbGxvYyk7Ci0KLQlpZiAoZmUtPmlkMi5pX2xpc3QubF90cmVlX2RlcHRoKSB7Ci0JCXN0YXR1cyA9IG9jZnMyX3JlYWRfZXh0ZW50X2Jsb2NrKElOT0RFX0NBQ0hFKGlub2RlKSwKLQkJCQkJCSBsZTY0X3RvX2NwdShmZS0+aV9sYXN0X2ViX2JsayksCi0JCQkJCQkgJmxhc3RfZWJfYmgpOwotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0JCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOwotCX0KLQotCSgqdGMpLT50Y19sYXN0X2ViX2JoID0gbGFzdF9lYl9iaDsKLQotCXN0YXR1cyA9IDA7Ci1iYWlsOgotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWlmICgqdGMpCi0JCQlvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoKnRjKTsKLQkJKnRjID0gTlVMTDsKLQl9Ci0JbWxvZ19leGl0X3ZvaWQoKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKgogICogJ3N0YXJ0JyBpcyBpbmNsdXNpdmUsICdlbmQnIGlzIG5vdC4KICAqLwogaW50IG9jZnMyX3RydW5jYXRlX2lubGluZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLApAQCAtNzI3MCwxOCArNzIxNCwzIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLQotc3RhdGljIHZvaWQgb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YykKLXsKLQkvKgotCSAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbXBsZXRpbmcgZGVhbGxvY2F0aW9uCi0JICogYmVmb3JlIGZyZWVpbmcgdGhlIGNvbnRleHQuCi0JICovCi0JaWYgKHRjLT50Y19kZWFsbG9jLmNfZmlyc3Rfc3ViYWxsb2NhdG9yICE9IE5VTEwpCi0JCW1sb2coTUxfTk9USUNFLAotCQkgICAgICJUcnVuY2F0ZSBjb21wbGV0aW9uIGhhcyBub24tZW1wdHkgZGVhbGxvYyBjb250ZXh0XG4iKTsKLQotCWJyZWxzZSh0Yy0+dGNfbGFzdF9lYl9iaCk7Ci0KLQlrZnJlZSh0Yyk7Ci19CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCA1NTc2MmI1Li4zYmQwOGEwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTIyOCwxMCArMjI4LDYgQEAKIAogaW50IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJICB1NjQgcmFuZ2Vfc3RhcnQsIHU2NCByYW5nZV9lbmQpOwotaW50IG9jZnMyX3ByZXBhcmVfdHJ1bmNhdGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICoqdGMpOwogaW50IG9jZnMyX2NvbW1pdF90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggMGQ3YzU1NC4uMWZiYjBlMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtMTYzMCw2ICsxNjMwLDQzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFRyeSB0byBmbHVzaCB0cnVuY2F0ZSBsb2dzIGlmIHdlIGNhbiBmcmVlIGVub3VnaCBjbHVzdGVycyBmcm9tIGl0LgorICogQXMgZm9yIHJldHVybiB2YWx1ZSwgIjwgMCIgbWVhbnMgZXJyb3IsICIwIiBubyBzcGFjZSBhbmQgIjEiIG1lYW5zCisgKiB3ZSBoYXZlIGZyZWVkIGVub3VnaCBzcGFjZXMgYW5kIGxldCB0aGUgY2FsbGVyIHRyeSB0byBhbGxvY2F0ZSBhZ2Fpbi4KKyAqLworc3RhdGljIGludCBvY2ZzMl90cnlfdG9fZnJlZV90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCQkJCSAgdW5zaWduZWQgaW50IG5lZWRlZCkKK3sKKwl0aWRfdCB0YXJnZXQ7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IHRydW5jYXRlZF9jbHVzdGVyczsKKworCW11dGV4X2xvY2soJm9zYi0+b3NiX3RsX2lub2RlLT5pX211dGV4KTsKKwl0cnVuY2F0ZWRfY2x1c3RlcnMgPSBvc2ItPnRydW5jYXRlZF9jbHVzdGVyczsKKwltdXRleF91bmxvY2soJm9zYi0+b3NiX3RsX2lub2RlLT5pX211dGV4KTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB3ZSBjYW4gc3VjY2VlZCBpbiBhbGxvY2F0aW5nIGlmIHdlIGZyZWUKKwkgKiB0aGUgdHJ1bmNhdGUgbG9nLgorCSAqLworCWlmICh0cnVuY2F0ZWRfY2x1c3RlcnMgPCBuZWVkZWQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KG9zYi0+am91cm5hbC0+al9qb3VybmFsLCAmdGFyZ2V0KSkgeworCQlqYmQyX2xvZ193YWl0X2NvbW1pdChvc2ItPmpvdXJuYWwtPmpfam91cm5hbCwgdGFyZ2V0KTsKKwkJcmV0ID0gMTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogaW50IG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCkBAIC0xNjM3LDcgKzE2NzQsNyBAQAogCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBzdHJ1Y3QgcGFnZSAqbW1hcF9wYWdlKQogewogCWludCByZXQsIGNsdXN0ZXJfb2ZfcGFnZXMsIGNyZWRpdHMgPSBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUzsKLQl1bnNpZ25lZCBpbnQgY2x1c3RlcnNfdG9fYWxsb2MsIGV4dGVudHNfdG9fc3BsaXQ7CisJdW5zaWduZWQgaW50IGNsdXN0ZXJzX3RvX2FsbG9jLCBleHRlbnRzX3RvX3NwbGl0LCBjbHVzdGVyc19uZWVkID0gMDsKIAlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2M7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CkBAIC0xNjQ2LDcgKzE2ODMsOSBAQAogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjID0gTlVMTDsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfdHJlZSBldDsKKwlpbnQgdHJ5X2ZyZWUgPSAxLCByZXQxOwogCit0cnlfYWdhaW46CiAJcmV0ID0gb2NmczJfYWxsb2Nfd3JpdGVfY3R4dCgmd2MsIG9zYiwgcG9zLCBsZW4sIGRpX2JoKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTE2ODEsNiArMTcyMCw3IEBACiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChyZXQgPT0gMSkgeworCQljbHVzdGVyc19uZWVkID0gd2MtPndfY2xlbjsKIAkJcmV0ID0gb2NmczJfcmVmY291bnRfY293KGlub2RlLCBmaWxwLCBkaV9iaCwKIAkJCQkJIHdjLT53X2Nwb3MsIHdjLT53X2NsZW4sIFVJTlRfTUFYKTsKIAkJaWYgKHJldCkgewpAQCAtMTY5NSw2ICsxNzM1LDcgQEAKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9CisJY2x1c3RlcnNfbmVlZCArPSBjbHVzdGVyc190b19hbGxvYzsKIAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKil3Yy0+d19kaV9iaC0+Yl9kYXRhOwogCkBAIC0xODE3LDYgKzE4NTgsMjIgQEAKIAkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwogCWlmIChtZXRhX2FjKQogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlpZiAocmV0ID09IC1FTk9TUEMgJiYgdHJ5X2ZyZWUpIHsKKwkJLyoKKwkJICogVHJ5IHRvIGZyZWUgc29tZSB0cnVuY2F0ZSBsb2cgc28gdGhhdCB3ZSBjYW4gaGF2ZSBlbm91Z2gKKwkJICogY2x1c3RlcnMgdG8gYWxsb2NhdGUuCisJCSAqLworCQl0cnlfZnJlZSA9IDA7CisKKwkJcmV0MSA9IG9jZnMyX3RyeV90b19mcmVlX3RydW5jYXRlX2xvZyhvc2IsIGNsdXN0ZXJzX25lZWQpOworCQlpZiAocmV0MSA9PSAxKQorCQkJZ290byB0cnlfYWdhaW47CisKKwkJaWYgKHJldDEgPCAwKQorCQkJbWxvZ19lcnJubyhyZXQxKTsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwppbmRleCA5ZTNkNDViLi5iMTA4ZTg2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKQEAgLTgyLDYgKzgyLDcgQEAKICNkZWZpbmUgTzJIQl9EQl9UWVBFX1JFR0lPTl9MSVZFTk9ERVMJNAogI2RlZmluZSBPMkhCX0RCX1RZUEVfUkVHSU9OX05VTUJFUgk1CiAjZGVmaW5lIE8ySEJfREJfVFlQRV9SRUdJT05fRUxBUFNFRF9USU1FCTYKKyNkZWZpbmUgTzJIQl9EQl9UWVBFX1JFR0lPTl9QSU5ORUQJNwogc3RydWN0IG8yaGJfZGVidWdfYnVmIHsKIAlpbnQgZGJfdHlwZTsKIAlpbnQgZGJfc2l6ZTsKQEAgLTEwMSw2ICsxMDIsNyBAQAogI2RlZmluZSBPMkhCX0RFQlVHX0ZBSUxFRFJFR0lPTlMJImZhaWxlZF9yZWdpb25zIgogI2RlZmluZSBPMkhCX0RFQlVHX1JFR0lPTl9OVU1CRVIJIm51bSIKICNkZWZpbmUgTzJIQl9ERUJVR19SRUdJT05fRUxBUFNFRF9USU1FCSJlbGFwc2VkX3RpbWVfaW5fbXMiCisjZGVmaW5lIE8ySEJfREVCVUdfUkVHSU9OX1BJTk5FRAkicGlubmVkIgogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbzJoYl9kZWJ1Z19kaXI7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbzJoYl9kZWJ1Z19saXZlbm9kZXM7CkBAIC0xMzIsNiArMTM0LDMzIEBACiB1bnNpZ25lZCBpbnQgbzJoYl9kZWFkX3RocmVzaG9sZCA9IE8ySEJfREVGQVVMVF9ERUFEX1RIUkVTSE9MRDsKIHVuc2lnbmVkIGludCBvMmhiX2hlYXJ0YmVhdF9tb2RlID0gTzJIQl9IRUFSVEJFQVRfTE9DQUw7CiAKKy8qCisgKiBvMmhiX2RlcGVuZGVudF91c2VycyB0cmFja3MgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIGNhbGxiYWNrcyB0aGF0IGRlcGVuZAorICogb24gaGVhcnRiZWF0LiBvMm5ldCBhbmQgbzJkbG0gYXJlIHR3byBlbnRpdGllcyB0aGF0IHJlZ2lzdGVyIHRoaXMgY2FsbGJhY2suCisgKiBIb3dldmVyIG9ubHkgbzJkbG0gZGVwZW5kcyBvbiB0aGUgaGVhcnRiZWF0LiBJdCBkb2VzIG5vdCB3YW50IHRoZSBoZWFydGJlYXQKKyAqIHRvIHN0b3Agd2hpbGUgYSBkbG0gZG9tYWluIGlzIHN0aWxsIGFjdGl2ZS4KKyAqLwordW5zaWduZWQgaW50IG8yaGJfZGVwZW5kZW50X3VzZXJzOworCisvKgorICogSW4gZ2xvYmFsIGhlYXJ0YmVhdCBtb2RlLCBhbGwgcmVnaW9ucyBhcmUgcGlubmVkIGlmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZQorICogZGVwZW5kZW50IHVzZXJzIGFuZCB0aGUgcXVvcnVtIHJlZ2lvbiBjb3VudCBpcyA8PSBPMkhCX1BJTl9DVVRfT0ZGLiBBbGwKKyAqIHJlZ2lvbnMgYXJlIHVucGlubmVkIGlmIHRoZSByZWdpb24gY291bnQgZXhjZWVkcyB0aGUgY3V0IG9mZiBvciB0aGUgbnVtYmVyCisgKiBvZiBkZXBlbmRlbnQgdXNlcnMgZmFsbHMgdG8gemVyby4KKyAqLworI2RlZmluZSBPMkhCX1BJTl9DVVRfT0ZGCQkzCisKKy8qCisgKiBJbiBsb2NhbCBoZWFydGJlYXQgbW9kZSwgd2UgYXNzdW1lIHRoZSBkbG0gZG9tYWluIG5hbWUgdG8gYmUgdGhlIHNhbWUgYXMKKyAqIHJlZ2lvbiB1dWlkLiBUaGlzIGlzIHRydWUgZm9yIGRvbWFpbnMgY3JlYXRlZCBmb3IgdGhlIGZpbGUgc3lzdGVtIGJ1dCBub3QKKyAqIG5lY2Vzc2FyaWx5IHRydWUgZm9yIHVzZXJkbG0gZG9tYWlucy4gVGhpcyBpcyBhIGtub3duIGxpbWl0YXRpb24uCisgKgorICogSW4gZ2xvYmFsIGhlYXJ0YmVhdCBtb2RlLCB3ZSBwaW4vdW5waW4gYWxsIG8yaGIgcmVnaW9ucy4gVGhpcyBzb2x1dGlvbgorICogd29ya3MgZm9yIGJvdGggZmlsZSBzeXN0ZW0gYW5kIHVzZXJkbG0gZG9tYWlucy4KKyAqLworc3RhdGljIGludCBvMmhiX3JlZ2lvbl9waW4oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpOworc3RhdGljIHZvaWQgbzJoYl9yZWdpb25fdW5waW4oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpOworCiAvKiBPbmx5IHNldHMgYSBuZXcgdGhyZXNob2xkIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgcmVnaW9ucy4KICAqCiAgKiBObyBsb2NraW5nIG9yIG90aGVyd2lzZSBpbnRlcmVzdGluZyBjb2RlIGlzIHJlcXVpcmVkIGZvciByZWFkaW5nCkBAIC0xODYsNyArMjE1LDkgQEAKIAlzdHJ1Y3QgY29uZmlnX2l0ZW0JaHJfaXRlbTsKIAogCXN0cnVjdCBsaXN0X2hlYWQJaHJfYWxsX2l0ZW07Ci0JdW5zaWduZWQJCWhyX3VuY2xlYW5fc3RvcDoxOworCXVuc2lnbmVkCQlocl91bmNsZWFuX3N0b3A6MSwKKwkJCQlocl9pdGVtX3Bpbm5lZDoxLAorCQkJCWhyX2l0ZW1fZHJvcHBlZDoxOwogCiAJLyogcHJvdGVjdGVkIGJ5IHRoZSBocl9jYWxsYmFja19zZW0gKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgCSpocl90YXNrOwpAQCAtMjEyLDkgKzI0MywxMSBAQAogCXN0cnVjdCBkZW50cnkJCSpocl9kZWJ1Z19saXZlbm9kZXM7CiAJc3RydWN0IGRlbnRyeQkJKmhyX2RlYnVnX3JlZ251bTsKIAlzdHJ1Y3QgZGVudHJ5CQkqaHJfZGVidWdfZWxhcHNlZF90aW1lOworCXN0cnVjdCBkZW50cnkJCSpocl9kZWJ1Z19waW5uZWQ7CiAJc3RydWN0IG8yaGJfZGVidWdfYnVmCSpocl9kYl9saXZlbm9kZXM7CiAJc3RydWN0IG8yaGJfZGVidWdfYnVmCSpocl9kYl9yZWdudW07CiAJc3RydWN0IG8yaGJfZGVidWdfYnVmCSpocl9kYl9lbGFwc2VkX3RpbWU7CisJc3RydWN0IG8yaGJfZGVidWdfYnVmCSpocl9kYl9waW5uZWQ7CiAKIAkvKiBsZXQgdGhlIHBlcnNvbiBzZXR0aW5nIHVwIGhiIHdhaXQgZm9yIGl0IHRvIHJldHVybiB1bnRpbCBpdAogCSAqIGhhcyByZWFjaGVkIGEgJ3N0ZWFkeScgc3RhdGUuICBUaGlzIHdpbGwgYmUgZml4ZWQgd2hlbiB3ZSBoYXZlCkBAIC03MDEsNiArNzM0LDE0IEBACiAJICAgICAgIGNvbmZpZ19pdGVtX25hbWUoJnJlZy0+aHJfaXRlbSkpOwogCiAJc2V0X2JpdChyZWctPmhyX3JlZ2lvbl9udW0sIG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXApOworCisJLyoKKwkgKiBJZiBnbG9iYWwgaGVhcnRiZWF0IGFjdGl2ZSwgdW5waW4gYWxsIHJlZ2lvbnMgaWYgdGhlCisJICogcmVnaW9uIGNvdW50ID4gQ1VUX09GRgorCSAqLworCWlmIChvMmhiX3BvcF9jb3VudCgmbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCwKKwkJCSAgIE8yTk1fTUFYX1JFR0lPTlMpID4gTzJIQl9QSU5fQ1VUX09GRikKKwkJbzJoYl9yZWdpb25fdW5waW4oTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgbzJoYl9jaGVja19zbG90KHN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnLApAQCAtMTA0MSw2ICsxMDgyLDkgQEAKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKIAorCS8qIFBpbiBub2RlICovCisJbzJubV9kZXBlbmRfdGhpc19ub2RlKCk7CisKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhcmVnLT5ocl91bmNsZWFuX3N0b3ApIHsKIAkJLyogV2UgdHJhY2sgdGhlIHRpbWUgc3BlbnQgaW5zaWRlCiAJCSAqIG8yaGJfZG9fZGlza19oZWFydGJlYXQgc28gdGhhdCB3ZSBhdm9pZCBtb3JlIHRoYW4KQEAgLTEwOTAsNiArMTEzNCw5IEBACiAJCW1sb2dfZXJybm8ocmV0KTsKIAl9CiAKKwkvKiBVbnBpbiBub2RlICovCisJbzJubV91bmRlcGVuZF90aGlzX25vZGUoKTsKKwogCW1sb2coTUxfSEVBUlRCRUFUfE1MX0tUSFJFQUQsICJoYiB0aHJlYWQgZXhpdGluZ1xuIik7CiAKIAlyZXR1cm4gMDsKQEAgLTExNDIsNiArMTE4OSwxMiBAQAogCQkJCQkJIHJlZy0+aHJfbGFzdF90aW1lb3V0X3N0YXJ0KSk7CiAJCWdvdG8gZG9uZTsKIAorCWNhc2UgTzJIQl9EQl9UWVBFX1JFR0lPTl9QSU5ORUQ6CisJCXJlZyA9IChzdHJ1Y3QgbzJoYl9yZWdpb24gKilkYi0+ZGJfZGF0YTsKKwkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgUEFHRV9TSVpFIC0gb3V0LCAiJXVcbiIsCisJCQkJISFyZWctPmhyX2l0ZW1fcGlubmVkKTsKKwkJZ290byBkb25lOworCiAJZGVmYXVsdDoKIAkJZ290byBkb25lOwogCX0KQEAgLTEzMTUsNiArMTM2OCw4IEBACiAJbWVtc2V0KG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXAsIDAsIHNpemVvZihvMmhiX3F1b3J1bV9yZWdpb25fYml0bWFwKSk7CiAJbWVtc2V0KG8yaGJfZmFpbGVkX3JlZ2lvbl9iaXRtYXAsIDAsIHNpemVvZihvMmhiX2ZhaWxlZF9yZWdpb25fYml0bWFwKSk7CiAKKwlvMmhiX2RlcGVuZGVudF91c2VycyA9IDA7CisKIAlyZXR1cm4gbzJoYl9kZWJ1Z19pbml0KCk7CiB9CiAKQEAgLTEzODQsNiArMTQzOSw3IEBACiAJZGVidWdmc19yZW1vdmUocmVnLT5ocl9kZWJ1Z19saXZlbm9kZXMpOwogCWRlYnVnZnNfcmVtb3ZlKHJlZy0+aHJfZGVidWdfcmVnbnVtKTsKIAlkZWJ1Z2ZzX3JlbW92ZShyZWctPmhyX2RlYnVnX2VsYXBzZWRfdGltZSk7CisJZGVidWdmc19yZW1vdmUocmVnLT5ocl9kZWJ1Z19waW5uZWQpOwogCWRlYnVnZnNfcmVtb3ZlKHJlZy0+aHJfZGVidWdfZGlyKTsKIAogCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOwpAQCAtMTY3Myw3ICsxNzI5LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyZWctPmhyX2JkZXYgPSBJX0JERVYoZmlscC0+Zl9tYXBwaW5nLT5ob3N0KTsKLQlyZXQgPSBibGtkZXZfZ2V0KHJlZy0+aHJfYmRldiwgRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKTsKKwlyZXQgPSBibGtkZXZfZ2V0KHJlZy0+aHJfYmRldiwgRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFELCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCXJlZy0+aHJfYmRldiA9IE5VTEw7CiAJCWdvdG8gb3V0OwpAQCAtMTk0OCw2ICsyMDA0LDE4IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKKwlyZWctPmhyX2RlYnVnX3Bpbm5lZCA9CisJCQlvMmhiX2RlYnVnX2NyZWF0ZShPMkhCX0RFQlVHX1JFR0lPTl9QSU5ORUQsCisJCQkJCSAgcmVnLT5ocl9kZWJ1Z19kaXIsCisJCQkJCSAgJihyZWctPmhyX2RiX3Bpbm5lZCksCisJCQkJCSAgc2l6ZW9mKCoocmVnLT5ocl9kYl9waW5uZWQpKSwKKwkJCQkJICBPMkhCX0RCX1RZUEVfUkVHSU9OX1BJTk5FRCwKKwkJCQkJICAwLCAwLCByZWcpOworCWlmICghcmVnLT5ocl9kZWJ1Z19waW5uZWQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIGJhaWw7CisJfQorCiAJcmV0ID0gMDsKIGJhaWw6CiAJcmV0dXJuIHJldDsKQEAgLTIwMDIsMTUgKzIwNzAsMjAgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmhiX3Rhc2s7CiAJc3RydWN0IG8yaGJfcmVnaW9uICpyZWcgPSB0b19vMmhiX3JlZ2lvbihpdGVtKTsKKwlpbnQgcXVvcnVtX3JlZ2lvbiA9IDA7CiAKIAkvKiBzdG9wIHRoZSB0aHJlYWQgd2hlbiB0aGUgdXNlciByZW1vdmVzIHRoZSByZWdpb24gZGlyICovCiAJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiAJaWYgKG8yaGJfZ2xvYmFsX2hlYXJ0YmVhdF9hY3RpdmUoKSkgewogCQljbGVhcl9iaXQocmVnLT5ocl9yZWdpb25fbnVtLCBvMmhiX3JlZ2lvbl9iaXRtYXApOwogCQljbGVhcl9iaXQocmVnLT5ocl9yZWdpb25fbnVtLCBvMmhiX2xpdmVfcmVnaW9uX2JpdG1hcCk7CisJCWlmICh0ZXN0X2JpdChyZWctPmhyX3JlZ2lvbl9udW0sIG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXApKQorCQkJcXVvcnVtX3JlZ2lvbiA9IDE7CisJCWNsZWFyX2JpdChyZWctPmhyX3JlZ2lvbl9udW0sIG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXApOwogCX0KIAloYl90YXNrID0gcmVnLT5ocl90YXNrOwogCXJlZy0+aHJfdGFzayA9IE5VTEw7CisJcmVnLT5ocl9pdGVtX2Ryb3BwZWQgPSAxOwogCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiAKIAlpZiAoaGJfdGFzaykKQEAgLTIwMjgsNyArMjEwMSwyNyBAQAogCWlmIChvMmhiX2dsb2JhbF9oZWFydGJlYXRfYWN0aXZlKCkpCiAJCXByaW50ayhLRVJOX05PVElDRSAibzJoYjogSGVhcnRiZWF0IHN0b3BwZWQgb24gcmVnaW9uICVzXG4iLAogCQkgICAgICAgY29uZmlnX2l0ZW1fbmFtZSgmcmVnLT5ocl9pdGVtKSk7CisKIAljb25maWdfaXRlbV9wdXQoaXRlbSk7CisKKwlpZiAoIW8yaGJfZ2xvYmFsX2hlYXJ0YmVhdF9hY3RpdmUoKSB8fCAhcXVvcnVtX3JlZ2lvbikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBnbG9iYWwgaGVhcnRiZWF0IGFjdGl2ZSBhbmQgdGhlcmUgYXJlIGRlcGVuZGVudCB1c2VycywKKwkgKiBwaW4gYWxsIHJlZ2lvbnMgaWYgcXVvcnVtIHJlZ2lvbiBjb3VudCA8PSBDVVRfT0ZGCisJICovCisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAoIW8yaGJfZGVwZW5kZW50X3VzZXJzKQorCQlnb3RvIHVubG9jazsKKworCWlmIChvMmhiX3BvcF9jb3VudCgmbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCwKKwkJCSAgIE8yTk1fTUFYX1JFR0lPTlMpIDw9IE8ySEJfUElOX0NVVF9PRkYpCisJCW8yaGJfcmVnaW9uX3BpbihOVUxMKTsKKwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiB9CiAKIHN0cnVjdCBvMmhiX2hlYXJ0YmVhdF9ncm91cF9hdHRyaWJ1dGUgewpAQCAtMjIxNCw2MyArMjMwNywxMzggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG8yaGJfc2V0dXBfY2FsbGJhY2spOwogCi1zdGF0aWMgc3RydWN0IG8yaGJfcmVnaW9uICpvMmhiX2ZpbmRfcmVnaW9uKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQorLyoKKyAqIEluIGxvY2FsIGhlYXJ0YmVhdCBtb2RlLCByZWdpb25fdXVpZCBwYXNzZWQgbWF0Y2hlcyB0aGUgZGxtIGRvbWFpbiBuYW1lLgorICogSW4gZ2xvYmFsIGhlYXJ0YmVhdCBtb2RlLCByZWdpb25fdXVpZCBwYXNzZWQgaXMgTlVMTC4KKyAqCisgKiBJbiBsb2NhbCwgd2Ugb25seSBwaW4gdGhlIG1hdGNoaW5nIHJlZ2lvbi4gSW4gZ2xvYmFsIHdlIHBpbiBhbGwgdGhlIGFjdGl2ZQorICogcmVnaW9ucy4KKyAqLworc3RhdGljIGludCBvMmhiX3JlZ2lvbl9waW4oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCiB7Ci0Jc3RydWN0IG8yaGJfcmVnaW9uICpwLCAqcmVnID0gTlVMTDsKKwlpbnQgcmV0ID0gMCwgZm91bmQgPSAwOworCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnOworCWNoYXIgKnV1aWQ7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJm8yaGJfbGl2ZV9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm8yaGJfYWxsX3JlZ2lvbnMsIGhyX2FsbF9pdGVtKSB7Ci0JCWlmICghc3RyY21wKHJlZ2lvbl91dWlkLCBjb25maWdfaXRlbV9uYW1lKCZwLT5ocl9pdGVtKSkpIHsKLQkJCXJlZyA9IHA7Ci0JCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZywgJm8yaGJfYWxsX3JlZ2lvbnMsIGhyX2FsbF9pdGVtKSB7CisJCXV1aWQgPSBjb25maWdfaXRlbV9uYW1lKCZyZWctPmhyX2l0ZW0pOworCisJCS8qIGxvY2FsIGhlYXJ0YmVhdCAqLworCQlpZiAocmVnaW9uX3V1aWQpIHsKKwkJCWlmIChzdHJjbXAocmVnaW9uX3V1aWQsIHV1aWQpKQorCQkJCWNvbnRpbnVlOworCQkJZm91bmQgPSAxOwogCQl9CisKKwkJaWYgKHJlZy0+aHJfaXRlbV9waW5uZWQgfHwgcmVnLT5ocl9pdGVtX2Ryb3BwZWQpCisJCQlnb3RvIHNraXBfcGluOworCisJCS8qIElnbm9yZSBFTk9FTlQgb25seSBmb3IgbG9jYWwgaGIgKHVzZXJkbG0gZG9tYWluKSAqLworCQlyZXQgPSBvMm5tX2RlcGVuZF9pdGVtKCZyZWctPmhyX2l0ZW0pOworCQlpZiAoIXJldCkgeworCQkJbWxvZyhNTF9DTFVTVEVSLCAiUGluIHJlZ2lvbiAlc1xuIiwgdXVpZCk7CisJCQlyZWctPmhyX2l0ZW1fcGlubmVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXQgPT0gLUVOT0VOVCAmJiBmb3VuZCkKKwkJCQlyZXQgPSAwOworCQkJZWxzZSB7CisJCQkJbWxvZyhNTF9FUlJPUiwgIlBpbiByZWdpb24gJXMgZmFpbHMgd2l0aCAlZFxuIiwKKwkJCQkgICAgIHV1aWQsIHJldCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KK3NraXBfcGluOgorCQlpZiAoZm91bmQpCisJCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gcmVnOwotfQotCi1zdGF0aWMgaW50IG8yaGJfcmVnaW9uX2dldChjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZzsKLQotCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOwotCi0JcmVnID0gbzJoYl9maW5kX3JlZ2lvbihyZWdpb25fdXVpZCk7Ci0JaWYgKCFyZWcpCi0JCXJldCA9IC1FTk9FTlQ7Ci0Jc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKLQotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gbzJubV9kZXBlbmRfdGhpc19ub2RlKCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBvMm5tX2RlcGVuZF9pdGVtKCZyZWctPmhyX2l0ZW0pOwotCWlmIChyZXQpCi0JCW8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKCk7Ci0KLW91dDoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBvMmhiX3JlZ2lvbl9wdXQoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCisvKgorICogSW4gbG9jYWwgaGVhcnRiZWF0IG1vZGUsIHJlZ2lvbl91dWlkIHBhc3NlZCBtYXRjaGVzIHRoZSBkbG0gZG9tYWluIG5hbWUuCisgKiBJbiBnbG9iYWwgaGVhcnRiZWF0IG1vZGUsIHJlZ2lvbl91dWlkIHBhc3NlZCBpcyBOVUxMLgorICoKKyAqIEluIGxvY2FsLCB3ZSBvbmx5IHVucGluIHRoZSBtYXRjaGluZyByZWdpb24uIEluIGdsb2JhbCB3ZSB1bnBpbiBhbGwgdGhlCisgKiBhY3RpdmUgcmVnaW9ucy4KKyAqLworc3RhdGljIHZvaWQgbzJoYl9yZWdpb25fdW5waW4oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCiB7CiAJc3RydWN0IG8yaGJfcmVnaW9uICpyZWc7CisJY2hhciAqdXVpZDsKKwlpbnQgZm91bmQgPSAwOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZvMmhiX2xpdmVfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZywgJm8yaGJfYWxsX3JlZ2lvbnMsIGhyX2FsbF9pdGVtKSB7CisJCXV1aWQgPSBjb25maWdfaXRlbV9uYW1lKCZyZWctPmhyX2l0ZW0pOworCQlpZiAocmVnaW9uX3V1aWQpIHsKKwkJCWlmIChzdHJjbXAocmVnaW9uX3V1aWQsIHV1aWQpKQorCQkJCWNvbnRpbnVlOworCQkJZm91bmQgPSAxOworCQl9CisKKwkJaWYgKHJlZy0+aHJfaXRlbV9waW5uZWQpIHsKKwkJCW1sb2coTUxfQ0xVU1RFUiwgIlVucGluIHJlZ2lvbiAlc1xuIiwgdXVpZCk7CisJCQlvMm5tX3VuZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7CisJCQlyZWctPmhyX2l0ZW1fcGlubmVkID0gMDsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbzJoYl9yZWdpb25faW5jX3VzZXIoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJaW50IHJldCA9IDA7CiAKIAlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKIAotCXJlZyA9IG8yaGJfZmluZF9yZWdpb24ocmVnaW9uX3V1aWQpOwotCi0Jc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKLQotCWlmIChyZWcpIHsKLQkJbzJubV91bmRlcGVuZF9pdGVtKCZyZWctPmhyX2l0ZW0pOwotCQlvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSgpOworCS8qIGxvY2FsIGhlYXJ0YmVhdCAqLworCWlmICghbzJoYl9nbG9iYWxfaGVhcnRiZWF0X2FjdGl2ZSgpKSB7CisJICAgIHJldCA9IG8yaGJfcmVnaW9uX3BpbihyZWdpb25fdXVpZCk7CisJICAgIGdvdG8gdW5sb2NrOwogCX0KKworCS8qCisJICogaWYgZ2xvYmFsIGhlYXJ0YmVhdCBhY3RpdmUgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVudCB1c2VyLAorCSAqIHBpbiBhbGwgcmVnaW9ucyBpZiBxdW9ydW0gcmVnaW9uIGNvdW50IDw9IENVVF9PRkYKKwkgKi8KKwlvMmhiX2RlcGVuZGVudF91c2VycysrOworCWlmIChvMmhiX2RlcGVuZGVudF91c2VycyA+IDEpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKG8yaGJfcG9wX2NvdW50KCZvMmhiX3F1b3J1bV9yZWdpb25fYml0bWFwLAorCQkJICAgTzJOTV9NQVhfUkVHSU9OUykgPD0gTzJIQl9QSU5fQ1VUX09GRikKKwkJcmV0ID0gbzJoYl9yZWdpb25fcGluKE5VTEwpOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG8yaGJfcmVnaW9uX2RlY191c2VyKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQoreworCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOworCisJLyogbG9jYWwgaGVhcnRiZWF0ICovCisJaWYgKCFvMmhiX2dsb2JhbF9oZWFydGJlYXRfYWN0aXZlKCkpIHsKKwkgICAgbzJoYl9yZWdpb25fdW5waW4ocmVnaW9uX3V1aWQpOworCSAgICBnb3RvIHVubG9jazsKKwl9CisKKwkvKgorCSAqIGlmIGdsb2JhbCBoZWFydGJlYXQgYWN0aXZlIGFuZCB0aGVyZSBhcmUgbm8gZGVwZW5kZW50IHVzZXJzLAorCSAqIHVucGluIGFsbCBxdW9ydW0gcmVnaW9ucworCSAqLworCW8yaGJfZGVwZW5kZW50X3VzZXJzLS07CisJaWYgKCFvMmhiX2RlcGVuZGVudF91c2VycykKKwkJbzJoYl9yZWdpb25fdW5waW4oTlVMTCk7CisKK3VubG9jazoKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOwogfQogCiBpbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKQEAgLTIyOTEsOSArMjQ1OSwxMSBAQAogCX0KIAogCWlmIChyZWdpb25fdXVpZCkgewotCQlyZXQgPSBvMmhiX3JlZ2lvbl9nZXQocmVnaW9uX3V1aWQpOwotCQlpZiAocmV0KQorCQlyZXQgPSBvMmhiX3JlZ2lvbl9pbmNfdXNlcihyZWdpb25fdXVpZCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJZG93bl93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwpAQCAtMjMxMSw3ICsyNDgxLDcgQEAKIAl1cF93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwogCXJldCA9IDA7CiBvdXQ6Ci0JbWxvZyhNTF9IRUFSVEJFQVQsICJyZXR1cm5pbmcgJWQgb24gYmVoYWxmIG9mICVwIGZvciBmdW5jcyAlcFxuIiwKKwltbG9nKE1MX0NMVVNURVIsICJyZXR1cm5pbmcgJWQgb24gYmVoYWxmIG9mICVwIGZvciBmdW5jcyAlcFxuIiwKIAkgICAgIHJldCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBoYyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzMjIsNyArMjQ5Miw3IEBACiB7CiAJQlVHX09OKGhjLT5oY19tYWdpYyAhPSBPMkhCX0NCX01BR0lDKTsKIAotCW1sb2coTUxfSEVBUlRCRUFULCAib24gYmVoYWxmIG9mICVwIGZvciBmdW5jcyAlcFxuIiwKKwltbG9nKE1MX0NMVVNURVIsICJvbiBiZWhhbGYgb2YgJXAgZm9yIGZ1bmNzICVwXG4iLAogCSAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBoYyk7CiAKIAkvKiBYWFggQ2FuIHRoaXMgaGFwcGVuIF93aXRoXyBhIHJlZ2lvbiByZWZlcmVuY2U/ICovCkBAIC0yMzMwLDcgKzI1MDAsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAocmVnaW9uX3V1aWQpCi0JCW8yaGJfcmVnaW9uX3B1dChyZWdpb25fdXVpZCk7CisJCW8yaGJfcmVnaW9uX2RlY191c2VyKHJlZ2lvbl91dWlkKTsKIAogCWRvd25fd3JpdGUoJm8yaGJfY2FsbGJhY2tfc2VtKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9uZXRkZWJ1Zy5jIGIvZnMvb2NmczIvY2x1c3Rlci9uZXRkZWJ1Zy5jCmluZGV4IGEzZjE1MGUuLjNhNTgzNTkwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL25ldGRlYnVnLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9uZXRkZWJ1Zy5jCkBAIC00NiwxMCArNDYsMTUgQEAKICNkZWZpbmUgTzJORVRfREVCVUdfRElSCQkibzJuZXQiCiAjZGVmaW5lIFNDX0RFQlVHX05BTUUJCSJzb2NrX2NvbnRhaW5lcnMiCiAjZGVmaW5lIE5TVF9ERUJVR19OQU1FCQkic2VuZF90cmFja2luZyIKKyNkZWZpbmUgU1RBVFNfREVCVUdfTkFNRQkic3RhdHMiCisKKyNkZWZpbmUgU0hPV19TT0NLX0NPTlRBSU5FUlMJMAorI2RlZmluZSBTSE9XX1NPQ0tfU1RBVFMJCTEKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKm8ybmV0X2RlbnRyeTsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzY19kZW50cnk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnN0X2RlbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzdGF0c19kZW50cnk7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobzJuZXRfZGVidWdfbG9jayk7CiAKQEAgLTEyMywzNyArMTI4LDQyIEBACiBzdGF0aWMgaW50IG5zdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0LCAqZHVtbXlfbnN0ID0gc2VxLT5wcml2YXRlOworCWt0aW1lX3Qgbm93OworCXM2NCBzb2NrLCBzZW5kLCBzdGF0dXM7CiAKIAlzcGluX2xvY2soJm8ybmV0X2RlYnVnX2xvY2spOwogCW5zdCA9IG5leHRfbnN0KGR1bW15X25zdCk7CisJaWYgKCFuc3QpCisJCWdvdG8gb3V0OwogCi0JaWYgKG5zdCAhPSBOVUxMKSB7Ci0JCS8qIGdldF90YXNrX2NvbW0gaXNuJ3QgZXhwb3J0ZWQuICBvaCB3ZWxsLiAqLwotCQlzZXFfcHJpbnRmKHNlcSwgIiVwOlxuIgotCQkJICAgIiAgcGlkOiAgICAgICAgICAlbHVcbiIKLQkJCSAgICIgIHRnaWQ6ICAgICAgICAgJWx1XG4iCi0JCQkgICAiICBwcm9jZXNzIG5hbWU6ICVzXG4iCi0JCQkgICAiICBub2RlOiAgICAgICAgICV1XG4iCi0JCQkgICAiICBzYzogICAgICAgICAgICVwXG4iCi0JCQkgICAiICBtZXNzYWdlIGlkOiAgICVkXG4iCi0JCQkgICAiICBtZXNzYWdlIHR5cGU6ICV1XG4iCi0JCQkgICAiICBtZXNzYWdlIGtleTogIDB4JTA4eFxuIgotCQkJICAgIiAgc29jayBhY3F1aXJ5OiAlbHUuJWxkXG4iCi0JCQkgICAiICBzZW5kIHN0YXJ0OiAgICVsdS4lbGRcbiIKLQkJCSAgICIgIHdhaXQgc3RhcnQ6ICAgJWx1LiVsZFxuIiwKLQkJCSAgIG5zdCwgKHVuc2lnbmVkIGxvbmcpbnN0LT5zdF90YXNrLT5waWQsCi0JCQkgICAodW5zaWduZWQgbG9uZyluc3QtPnN0X3Rhc2stPnRnaWQsCi0JCQkgICBuc3QtPnN0X3Rhc2stPmNvbW0sIG5zdC0+c3Rfbm9kZSwKLQkJCSAgIG5zdC0+c3Rfc2MsIG5zdC0+c3RfaWQsIG5zdC0+c3RfbXNnX3R5cGUsCi0JCQkgICBuc3QtPnN0X21zZ19rZXksCi0JCQkgICBuc3QtPnN0X3NvY2tfdGltZS50dl9zZWMsCi0JCQkgICAobG9uZyluc3QtPnN0X3NvY2tfdGltZS50dl91c2VjLAotCQkJICAgbnN0LT5zdF9zZW5kX3RpbWUudHZfc2VjLAotCQkJICAgKGxvbmcpbnN0LT5zdF9zZW5kX3RpbWUudHZfdXNlYywKLQkJCSAgIG5zdC0+c3Rfc3RhdHVzX3RpbWUudHZfc2VjLAotCQkJICAgKGxvbmcpbnN0LT5zdF9zdGF0dXNfdGltZS50dl91c2VjKTsKLQl9CisJbm93ID0ga3RpbWVfZ2V0KCk7CisJc29jayA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yihub3csIG5zdC0+c3Rfc29ja190aW1lKSk7CisJc2VuZCA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yihub3csIG5zdC0+c3Rfc2VuZF90aW1lKSk7CisJc3RhdHVzID0ga3RpbWVfdG9fdXMoa3RpbWVfc3ViKG5vdywgbnN0LT5zdF9zdGF0dXNfdGltZSkpOwogCisJLyogZ2V0X3Rhc2tfY29tbSBpc24ndCBleHBvcnRlZC4gIG9oIHdlbGwuICovCisJc2VxX3ByaW50ZihzZXEsICIlcDpcbiIKKwkJICAgIiAgcGlkOiAgICAgICAgICAlbHVcbiIKKwkJICAgIiAgdGdpZDogICAgICAgICAlbHVcbiIKKwkJICAgIiAgcHJvY2VzcyBuYW1lOiAlc1xuIgorCQkgICAiICBub2RlOiAgICAgICAgICV1XG4iCisJCSAgICIgIHNjOiAgICAgICAgICAgJXBcbiIKKwkJICAgIiAgbWVzc2FnZSBpZDogICAlZFxuIgorCQkgICAiICBtZXNzYWdlIHR5cGU6ICV1XG4iCisJCSAgICIgIG1lc3NhZ2Uga2V5OiAgMHglMDh4XG4iCisJCSAgICIgIHNvY2sgYWNxdWlyeTogJWxsZCB1c2VjcyBhZ29cbiIKKwkJICAgIiAgc2VuZCBzdGFydDogICAlbGxkIHVzZWNzIGFnb1xuIgorCQkgICAiICB3YWl0IHN0YXJ0OiAgICVsbGQgdXNlY3MgYWdvXG4iLAorCQkgICBuc3QsICh1bnNpZ25lZCBsb25nKXRhc2tfcGlkX25yKG5zdC0+c3RfdGFzayksCisJCSAgICh1bnNpZ25lZCBsb25nKW5zdC0+c3RfdGFzay0+dGdpZCwKKwkJICAgbnN0LT5zdF90YXNrLT5jb21tLCBuc3QtPnN0X25vZGUsCisJCSAgIG5zdC0+c3Rfc2MsIG5zdC0+c3RfaWQsIG5zdC0+c3RfbXNnX3R5cGUsCisJCSAgIG5zdC0+c3RfbXNnX2tleSwKKwkJICAgKGxvbmcgbG9uZylzb2NrLAorCQkgICAobG9uZyBsb25nKXNlbmQsCisJCSAgIChsb25nIGxvbmcpc3RhdHVzKTsKKworb3V0OgogCXNwaW5fdW5sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMjI4LDYgKzIzOCwxMSBAQAogCXNwaW5fdW5sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIH0KIAorc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgeworCWludCBkYmdfY3R4dDsKKwlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKmRiZ19zb2NrOworfTsKKwogc3RhdGljIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lcgogCQkJKm5leHRfc2Moc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzY19zdGFydCkKIHsKQEAgLTI1Myw3ICsyNjgsOCBAQAogCiBzdGF0aWMgdm9pZCAqc2Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjLCAqZHVtbXlfc2MgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgKnNkID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpkdW1teV9zYyA9IHNkLT5kYmdfc29jazsKIAogCXNwaW5fbG9jaygmbzJuZXRfZGVidWdfbG9jayk7CiAJc2MgPSBuZXh0X3NjKGR1bW15X3NjKTsKQEAgLTI2NCw3ICsyODAsOCBAQAogCiBzdGF0aWMgdm9pZCAqc2Nfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpkdW1teV9zYyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyAqc2QgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYywgKmR1bW15X3NjID0gc2QtPmRiZ19zb2NrOwogCiAJc3Bpbl9sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIAlzYyA9IG5leHRfc2MoZHVtbXlfc2MpOwpAQCAtMjc2LDY1ICsyOTMsMTA3IEBACiAJcmV0dXJuIHNjOyAvKiB1bnVzZWQsIGp1c3QgbmVlZHMgdG8gYmUgbnVsbCB3aGVuIGRvbmUgKi8KIH0KIAotI2RlZmluZSBUVl9TRUNfVVNFQyhUVikgVFYudHZfc2VjLCAobG9uZylUVi50dl91c2VjCisjaWZkZWYgQ09ORklHX09DRlMyX0ZTX1NUQVRTCisjIGRlZmluZSBzY19zZW5kX2NvdW50KF9zKQkJKChfcyktPnNjX3NlbmRfY291bnQpCisjIGRlZmluZSBzY19yZWN2X2NvdW50KF9zKQkJKChfcyktPnNjX3JlY3ZfY291bnQpCisjIGRlZmluZSBzY190dl9hY3F1aXJ5X3RvdGFsX25zKF9zKQkoa3RpbWVfdG9fbnMoKF9zKS0+c2NfdHZfYWNxdWlyeV90b3RhbCkpCisjIGRlZmluZSBzY190dl9zZW5kX3RvdGFsX25zKF9zKQkoa3RpbWVfdG9fbnMoKF9zKS0+c2NfdHZfc2VuZF90b3RhbCkpCisjIGRlZmluZSBzY190dl9zdGF0dXNfdG90YWxfbnMoX3MpCShrdGltZV90b19ucygoX3MpLT5zY190dl9zdGF0dXNfdG90YWwpKQorIyBkZWZpbmUgc2NfdHZfcHJvY2Vzc190b3RhbF9ucyhfcykJKGt0aW1lX3RvX25zKChfcyktPnNjX3R2X3Byb2Nlc3NfdG90YWwpKQorI2Vsc2UKKyMgZGVmaW5lIHNjX3NlbmRfY291bnQoX3MpCQkoMFUpCisjIGRlZmluZSBzY19yZWN2X2NvdW50KF9zKQkJKDBVKQorIyBkZWZpbmUgc2NfdHZfYWNxdWlyeV90b3RhbF9ucyhfcykJKDBMTCkKKyMgZGVmaW5lIHNjX3R2X3NlbmRfdG90YWxfbnMoX3MpCSgwTEwpCisjIGRlZmluZSBzY190dl9zdGF0dXNfdG90YWxfbnMoX3MpCSgwTEwpCisjIGRlZmluZSBzY190dl9wcm9jZXNzX3RvdGFsX25zKF9zKQkoMExMKQorI2VuZGlmCisKKy8qIFNvIHRoYXQgZGVidWdmcy5vY2ZzMiBjYW4gZGV0ZXJtaW5lIHdoaWNoIGZvcm1hdCBpcyBiZWluZyB1c2VkICovCisjZGVmaW5lIE8yTkVUX1NUQVRTX1NUUl9WRVJTSU9OCQkxCitzdGF0aWMgdm9pZCBzY19zaG93X3NvY2tfc3RhdHMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkgICAgICAgc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlpZiAoIXNjKQorCQlyZXR1cm47CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVkLCV1LCVsdSwlbGxkLCVsbGQsJWxsZCwlbHUsJWxsZFxuIiwgTzJORVRfU1RBVFNfU1RSX1ZFUlNJT04sCisJCSAgIHNjLT5zY19ub2RlLT5uZF9udW0sICh1bnNpZ25lZCBsb25nKXNjX3NlbmRfY291bnQoc2MpLAorCQkgICAobG9uZyBsb25nKXNjX3R2X2FjcXVpcnlfdG90YWxfbnMoc2MpLAorCQkgICAobG9uZyBsb25nKXNjX3R2X3NlbmRfdG90YWxfbnMoc2MpLAorCQkgICAobG9uZyBsb25nKXNjX3R2X3N0YXR1c190b3RhbF9ucyhzYyksCisJCSAgICh1bnNpZ25lZCBsb25nKXNjX3JlY3ZfY291bnQoc2MpLAorCQkgICAobG9uZyBsb25nKXNjX3R2X3Byb2Nlc3NfdG90YWxfbnMoc2MpKTsKK30KKworc3RhdGljIHZvaWQgc2Nfc2hvd19zb2NrX2NvbnRhaW5lcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkgICBzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBOVUxMOworCV9fYmUzMiBzYWRkciA9IDAsIGRhZGRyID0gMDsKKwlfX2JlMTYgc3BvcnQgPSAwLCBkcG9ydCA9IDA7CisKKwlpZiAoIXNjKQorCQlyZXR1cm47CisKKwlpZiAoc2MtPnNjX3NvY2spIHsKKwkJaW5ldCA9IGluZXRfc2soc2MtPnNjX3NvY2stPnNrKTsKKwkJLyogdGhlIHN0YWNrJ3Mgc3RydWN0cyBhcmVuJ3Qgc3BhcnNlIGVuZGlhbiBjbGVhbiAqLworCQlzYWRkciA9IChfX2ZvcmNlIF9fYmUzMilpbmV0LT5pbmV0X3NhZGRyOworCQlkYWRkciA9IChfX2ZvcmNlIF9fYmUzMilpbmV0LT5pbmV0X2RhZGRyOworCQlzcG9ydCA9IChfX2ZvcmNlIF9fYmUxNilpbmV0LT5pbmV0X3Nwb3J0OworCQlkcG9ydCA9IChfX2ZvcmNlIF9fYmUxNilpbmV0LT5pbmV0X2Rwb3J0OworCX0KKworCS8qIFhYWCBzaWdoLCBpbmV0LT4gZG9lc24ndCBoYXZlIHNwYXJzZSBhbm5vdGF0aW9uIHNvIGFueQorCSAqIHVzZSBvZiBpdCBoZXJlIGdlbmVyYXRlcyBhIHdhcm5pbmcgd2l0aCAtV2JpdHdpc2UgKi8KKwlzZXFfcHJpbnRmKHNlcSwgIiVwOlxuIgorCQkgICAiICBrcmVmczogICAgICAgICAgICVkXG4iCisJCSAgICIgIHNvY2s6ICAgICAgICAgICAgJXBJNDoldSAtPiAiCisJCQkJICAgICAgIiVwSTQ6JXVcbiIKKwkJICAgIiAgcmVtb3RlIG5vZGU6ICAgICAlc1xuIgorCQkgICAiICBwYWdlIG9mZjogICAgICAgICV6dVxuIgorCQkgICAiICBoYW5kc2hha2Ugb2s6ICAgICV1XG4iCisJCSAgICIgIHRpbWVyOiAgICAgICAgICAgJWxsZCB1c2Vjc1xuIgorCQkgICAiICBkYXRhIHJlYWR5OiAgICAgICVsbGQgdXNlY3NcbiIKKwkJICAgIiAgYWR2YW5jZSBzdGFydDogICAlbGxkIHVzZWNzXG4iCisJCSAgICIgIGFkdmFuY2Ugc3RvcDogICAgJWxsZCB1c2Vjc1xuIgorCQkgICAiICBmdW5jIHN0YXJ0OiAgICAgICVsbGQgdXNlY3NcbiIKKwkJICAgIiAgZnVuYyBzdG9wOiAgICAgICAlbGxkIHVzZWNzXG4iCisJCSAgICIgIGZ1bmMga2V5OiAgICAgICAgMHglMDh4XG4iCisJCSAgICIgIGZ1bmMgdHlwZTogICAgICAgJXVcbiIsCisJCSAgIHNjLAorCQkgICBhdG9taWNfcmVhZCgmc2MtPnNjX2tyZWYucmVmY291bnQpLAorCQkgICAmc2FkZHIsIGluZXQgPyBudG9ocyhzcG9ydCkgOiAwLAorCQkgICAmZGFkZHIsIGluZXQgPyBudG9ocyhkcG9ydCkgOiAwLAorCQkgICBzYy0+c2Nfbm9kZS0+bmRfbmFtZSwKKwkJICAgc2MtPnNjX3BhZ2Vfb2ZmLAorCQkgICBzYy0+c2NfaGFuZHNoYWtlX29rLAorCQkgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl90aW1lciksCisJCSAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2RhdGFfcmVhZHkpLAorCQkgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9hZHZhbmNlX3N0YXJ0KSwKKwkJICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfYWR2YW5jZV9zdG9wKSwKKwkJICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfZnVuY19zdGFydCksCisJCSAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2Z1bmNfc3RvcCksCisJCSAgIHNjLT5zY19tc2dfa2V5LAorCQkgICBzYy0+c2NfbXNnX3R5cGUpOworfQogCiBzdGF0aWMgaW50IHNjX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpkdW1teV9zYyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyAqc2QgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYywgKmR1bW15X3NjID0gc2QtPmRiZ19zb2NrOwogCiAJc3Bpbl9sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIAlzYyA9IG5leHRfc2MoZHVtbXlfc2MpOwogCi0JaWYgKHNjICE9IE5VTEwpIHsKLQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IE5VTEw7Ci0KLQkJX19iZTMyIHNhZGRyID0gMCwgZGFkZHIgPSAwOwotCQlfX2JlMTYgc3BvcnQgPSAwLCBkcG9ydCA9IDA7Ci0KLQkJaWYgKHNjLT5zY19zb2NrKSB7Ci0JCQlpbmV0ID0gaW5ldF9zayhzYy0+c2Nfc29jay0+c2spOwotCQkJLyogdGhlIHN0YWNrJ3Mgc3RydWN0cyBhcmVuJ3Qgc3BhcnNlIGVuZGlhbiBjbGVhbiAqLwotCQkJc2FkZHIgPSAoX19mb3JjZSBfX2JlMzIpaW5ldC0+aW5ldF9zYWRkcjsKLQkJCWRhZGRyID0gKF9fZm9yY2UgX19iZTMyKWluZXQtPmluZXRfZGFkZHI7Ci0JCQlzcG9ydCA9IChfX2ZvcmNlIF9fYmUxNilpbmV0LT5pbmV0X3Nwb3J0OwotCQkJZHBvcnQgPSAoX19mb3JjZSBfX2JlMTYpaW5ldC0+aW5ldF9kcG9ydDsKLQkJfQotCi0JCS8qIFhYWCBzaWdoLCBpbmV0LT4gZG9lc24ndCBoYXZlIHNwYXJzZSBhbm5vdGF0aW9uIHNvIGFueQotCQkgKiB1c2Ugb2YgaXQgaGVyZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIHdpdGggLVdiaXR3aXNlICovCi0JCXNlcV9wcmludGYoc2VxLCAiJXA6XG4iCi0JCQkgICAiICBrcmVmczogICAgICAgICAgICVkXG4iCi0JCQkgICAiICBzb2NrOiAgICAgICAgICAgICVwSTQ6JXUgLT4gIgotCQkJCQkgICAgICAiJXBJNDoldVxuIgotCQkJICAgIiAgcmVtb3RlIG5vZGU6ICAgICAlc1xuIgotCQkJICAgIiAgcGFnZSBvZmY6ICAgICAgICAlenVcbiIKLQkJCSAgICIgIGhhbmRzaGFrZSBvazogICAgJXVcbiIKLQkJCSAgICIgIHRpbWVyOiAgICAgICAgICAgJWx1LiVsZFxuIgotCQkJICAgIiAgZGF0YSByZWFkeTogICAgICAlbHUuJWxkXG4iCi0JCQkgICAiICBhZHZhbmNlIHN0YXJ0OiAgICVsdS4lbGRcbiIKLQkJCSAgICIgIGFkdmFuY2Ugc3RvcDogICAgJWx1LiVsZFxuIgotCQkJICAgIiAgZnVuYyBzdGFydDogICAgICAlbHUuJWxkXG4iCi0JCQkgICAiICBmdW5jIHN0b3A6ICAgICAgICVsdS4lbGRcbiIKLQkJCSAgICIgIGZ1bmMga2V5OiAgICAgICAgJXVcbiIKLQkJCSAgICIgIGZ1bmMgdHlwZTogICAgICAgJXVcbiIsCi0JCQkgICBzYywKLQkJCSAgIGF0b21pY19yZWFkKCZzYy0+c2Nfa3JlZi5yZWZjb3VudCksCi0JCQkgICAmc2FkZHIsIGluZXQgPyBudG9ocyhzcG9ydCkgOiAwLAotCQkJICAgJmRhZGRyLCBpbmV0ID8gbnRvaHMoZHBvcnQpIDogMCwKLQkJCSAgIHNjLT5zY19ub2RlLT5uZF9uYW1lLAotCQkJICAgc2MtPnNjX3BhZ2Vfb2ZmLAotCQkJICAgc2MtPnNjX2hhbmRzaGFrZV9vaywKLQkJCSAgIFRWX1NFQ19VU0VDKHNjLT5zY190dl90aW1lciksCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfZGF0YV9yZWFkeSksCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfYWR2YW5jZV9zdGFydCksCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfYWR2YW5jZV9zdG9wKSwKLQkJCSAgIFRWX1NFQ19VU0VDKHNjLT5zY190dl9mdW5jX3N0YXJ0KSwKLQkJCSAgIFRWX1NFQ19VU0VDKHNjLT5zY190dl9mdW5jX3N0b3ApLAotCQkJICAgc2MtPnNjX21zZ19rZXksCi0JCQkgICBzYy0+c2NfbXNnX3R5cGUpOworCWlmIChzYykgeworCQlpZiAoc2QtPmRiZ19jdHh0ID09IFNIT1dfU09DS19DT05UQUlORVJTKQorCQkJc2Nfc2hvd19zb2NrX2NvbnRhaW5lcihzZXEsIHNjKTsKKwkJZWxzZQorCQkJc2Nfc2hvd19zb2NrX3N0YXRzKHNlcSwgc2MpOwogCX0KIAotCiAJc3Bpbl91bmxvY2soJm8ybmV0X2RlYnVnX2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0zNTEsNyArNDEwLDcgQEAKIAkuc2hvdyA9IHNjX3NlcV9zaG93LAogfTsKIAotc3RhdGljIGludCBzY19mb3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgc2NfY29tbW9uX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBvMm5ldF9zb2NrX2RlYnVnICpzZCkKIHsKIAlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKmR1bW15X3NjOwogCXN0cnVjdCBzZXFfZmlsZSAqc2VxOwpAQCAtMzY5LDcgKzQyOCw4IEBACiAJCWdvdG8gb3V0OwogCiAJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNlcS0+cHJpdmF0ZSA9IGR1bW15X3NjOworCXNlcS0+cHJpdmF0ZSA9IHNkOworCXNkLT5kYmdfc29jayA9IGR1bW15X3NjOwogCW8ybmV0X2RlYnVnX2FkZF9zYyhkdW1teV9zYyk7CiAKIAlkdW1teV9zYyA9IE5VTEw7CkBAIC0zODIsMTIgKzQ0Miw0OCBAQAogc3RhdGljIGludCBzY19mb3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKmR1bW15X3NjID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBvMm5ldF9zb2NrX2RlYnVnICpzZCA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKmR1bW15X3NjID0gc2QtPmRiZ19zb2NrOwogCiAJbzJuZXRfZGVidWdfZGVsX3NjKGR1bW15X3NjKTsKIAlyZXR1cm4gc2VxX3JlbGVhc2VfcHJpdmF0ZShpbm9kZSwgZmlsZSk7CiB9CiAKK3N0YXRpYyBpbnQgc3RhdHNfZm9wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgKnNkOworCisJc2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyksIEdGUF9LRVJORUwpOworCWlmIChzZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNkLT5kYmdfY3R4dCA9IFNIT1dfU09DS19TVEFUUzsKKwlzZC0+ZGJnX3NvY2sgPSBOVUxMOworCisJcmV0dXJuIHNjX2NvbW1vbl9vcGVuKGZpbGUsIHNkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RhdHNfc2VxX2ZvcHMgPSB7CisJLm9wZW4gPSBzdGF0c19mb3Bfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzY19mb3BfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgc2NfZm9wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgKnNkOworCisJc2QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyksIEdGUF9LRVJORUwpOworCWlmIChzZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNkLT5kYmdfY3R4dCA9IFNIT1dfU09DS19DT05UQUlORVJTOworCXNkLT5kYmdfc29jayA9IE5VTEw7CisKKwlyZXR1cm4gc2NfY29tbW9uX29wZW4oZmlsZSwgc2QpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY19zZXFfZm9wcyA9IHsKIAkub3BlbiA9IHNjX2ZvcF9vcGVuLAogCS5yZWFkID0gc2VxX3JlYWQsCkBAIC00MTksMjUgKzUxNSwyOSBAQAogCQlnb3RvIGJhaWw7CiAJfQogCisJc3RhdHNfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShTVEFUU19ERUJVR19OQU1FLCBTX0lGUkVHfFNfSVJVU1IsCisJCQkJCSAgIG8ybmV0X2RlbnRyeSwgTlVMTCwKKwkJCQkJICAgJnN0YXRzX3NlcV9mb3BzKTsKKwlpZiAoIXN0YXRzX2RlbnRyeSkgeworCQltbG9nX2Vycm5vKC1FTk9NRU0pOworCQlnb3RvIGJhaWw7CisJfQorCiAJcmV0dXJuIDA7CiBiYWlsOgotCWlmIChzY19kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKHNjX2RlbnRyeSk7Ci0JaWYgKG5zdF9kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKG5zdF9kZW50cnkpOwotCWlmIChvMm5ldF9kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKG8ybmV0X2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUoc3RhdHNfZGVudHJ5KTsKKwlkZWJ1Z2ZzX3JlbW92ZShzY19kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKG5zdF9kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKG8ybmV0X2RlbnRyeSk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHZvaWQgbzJuZXRfZGVidWdmc19leGl0KHZvaWQpCiB7Ci0JaWYgKHNjX2RlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUoc2NfZGVudHJ5KTsKLQlpZiAobnN0X2RlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUobnN0X2RlbnRyeSk7Ci0JaWYgKG8ybmV0X2RlbnRyeSkKLQkJZGVidWdmc19yZW1vdmUobzJuZXRfZGVudHJ5KTsKKwlkZWJ1Z2ZzX3JlbW92ZShzdGF0c19kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKHNjX2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUobnN0X2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUobzJuZXRfZGVudHJ5KTsKIH0KIAogI2VuZGlmCS8qIENPTkZJR19ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKaW5kZXggOWFhNDI2ZS4uM2IxMWNiMSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3AuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCkBAIC0xNTMsNjMgKzE1MywxMTQgQEAKIAluc3QtPnN0X25vZGUgPSBub2RlOwogfQogCi1zdGF0aWMgdm9pZCBvMm5ldF9zZXRfbnN0X3NvY2tfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQotewotCWRvX2dldHRpbWVvZmRheSgmbnN0LT5zdF9zb2NrX3RpbWUpOwotfQotCi1zdGF0aWMgdm9pZCBvMm5ldF9zZXRfbnN0X3NlbmRfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQotewotCWRvX2dldHRpbWVvZmRheSgmbnN0LT5zdF9zZW5kX3RpbWUpOwotfQotCi1zdGF0aWMgdm9pZCBvMm5ldF9zZXRfbnN0X3N0YXR1c190aW1lKHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nICpuc3QpCi17Ci0JZG9fZ2V0dGltZW9mZGF5KCZuc3QtPnN0X3N0YXR1c190aW1lKTsKLX0KLQotc3RhdGljIHZvaWQgbzJuZXRfc2V0X25zdF9zb2NrX2NvbnRhaW5lcihzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0LAotCQkJCQkgc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKLXsKLQluc3QtPnN0X3NjID0gc2M7Ci19Ci0KLXN0YXRpYyB2b2lkIG8ybmV0X3NldF9uc3RfbXNnX2lkKHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nICpuc3QsIHUzMiBtc2dfaWQpCi17Ci0JbnN0LT5zdF9pZCA9IG1zZ19pZDsKLX0KLQotI2Vsc2UgIC8qIENPTkZJR19ERUJVR19GUyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfaW5pdF9uc3Qoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwgdTMyIG1zZ3R5cGUsCi0JCQkJICB1MzIgbXNna2V5LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHU4IG5vZGUpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfbnN0X3NvY2tfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQogeworCW5zdC0+c3Rfc29ja190aW1lID0ga3RpbWVfZ2V0KCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfbnN0X3NlbmRfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQogeworCW5zdC0+c3Rfc2VuZF90aW1lID0ga3RpbWVfZ2V0KCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfbnN0X3N0YXR1c190aW1lKHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nICpuc3QpCiB7CisJbnN0LT5zdF9zdGF0dXNfdGltZSA9IGt0aW1lX2dldCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X25zdF9zb2NrX2NvbnRhaW5lcihzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0LAogCQkJCQkJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKIHsKKwluc3QtPnN0X3NjID0gc2M7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfbnN0X21zZ19pZChzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0LAogCQkJCQl1MzIgbXNnX2lkKQogeworCW5zdC0+c3RfaWQgPSBtc2dfaWQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfc29ja190aW1lcihzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl90aW1lciA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X2RhdGFfcmVhZHlfdGltZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl9kYXRhX3JlYWR5ID0ga3RpbWVfZ2V0KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfYWR2YW5jZV9zdGFydF90aW1lKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCit7CisJc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X3NldF9hZHZhbmNlX3N0b3BfdGltZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl9hZHZhbmNlX3N0b3AgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X3NldF9mdW5jX3N0YXJ0X3RpbWUoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfZnVuY19zdGFydCA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X2Z1bmNfc3RvcF90aW1lKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCit7CisJc2MtPnNjX3R2X2Z1bmNfc3RvcCA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMga3RpbWVfdCBvMm5ldF9nZXRfZnVuY19ydW5fdGltZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXJldHVybiBrdGltZV9zdWIoc2MtPnNjX3R2X2Z1bmNfc3RvcCwgc2MtPnNjX3R2X2Z1bmNfc3RhcnQpOworfQorI2Vsc2UgIC8qIENPTkZJR19ERUJVR19GUyAqLworIyBkZWZpbmUgbzJuZXRfaW5pdF9uc3QoYSwgYiwgYywgZCwgZSkKKyMgZGVmaW5lIG8ybmV0X3NldF9uc3Rfc29ja190aW1lKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfbnN0X3NlbmRfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfc2V0X25zdF9zdGF0dXNfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfc2V0X25zdF9zb2NrX2NvbnRhaW5lcihhLCBiKQorIyBkZWZpbmUgbzJuZXRfc2V0X25zdF9tc2dfaWQoYSwgYikKKyMgZGVmaW5lIG8ybmV0X3NldF9zb2NrX3RpbWVyKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfZGF0YV9yZWFkeV90aW1lKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfYWR2YW5jZV9zdGFydF90aW1lKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfYWR2YW5jZV9zdG9wX3RpbWUoYSkKKyMgZGVmaW5lIG8ybmV0X3NldF9mdW5jX3N0YXJ0X3RpbWUoYSkKKyMgZGVmaW5lIG8ybmV0X3NldF9mdW5jX3N0b3BfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfZ2V0X2Z1bmNfcnVuX3RpbWUoYSkJCShrdGltZV90KTAKICNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KIAorI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19TVEFUUworc3RhdGljIHZvaWQgbzJuZXRfdXBkYXRlX3NlbmRfc3RhdHMoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwKKwkJCQkgICAgc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfc3RhdHVzX3RvdGFsID0ga3RpbWVfYWRkKHNjLT5zY190dl9zdGF0dXNfdG90YWwsCisJCQkJCSAgIGt0aW1lX3N1YihrdGltZV9nZXQoKSwKKwkJCQkJCSAgICAgbnN0LT5zdF9zdGF0dXNfdGltZSkpOworCXNjLT5zY190dl9zZW5kX3RvdGFsID0ga3RpbWVfYWRkKHNjLT5zY190dl9zZW5kX3RvdGFsLAorCQkJCQkga3RpbWVfc3ViKG5zdC0+c3Rfc3RhdHVzX3RpbWUsCisJCQkJCQkgICBuc3QtPnN0X3NlbmRfdGltZSkpOworCXNjLT5zY190dl9hY3F1aXJ5X3RvdGFsID0ga3RpbWVfYWRkKHNjLT5zY190dl9hY3F1aXJ5X3RvdGFsLAorCQkJCQkgICAga3RpbWVfc3ViKG5zdC0+c3Rfc2VuZF90aW1lLAorCQkJCQkJICAgICAgbnN0LT5zdF9zb2NrX3RpbWUpKTsKKwlzYy0+c2Nfc2VuZF9jb3VudCsrOworfQorCitzdGF0aWMgdm9pZCBvMm5ldF91cGRhdGVfcmVjdl9zdGF0cyhzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl9wcm9jZXNzX3RvdGFsID0ga3RpbWVfYWRkKHNjLT5zY190dl9wcm9jZXNzX3RvdGFsLAorCQkJCQkgICAgbzJuZXRfZ2V0X2Z1bmNfcnVuX3RpbWUoc2MpKTsKKwlzYy0+c2NfcmVjdl9jb3VudCsrOworfQorCisjZWxzZQorCisjIGRlZmluZSBvMm5ldF91cGRhdGVfc2VuZF9zdGF0cyhhLCBiKQorCisjIGRlZmluZSBvMm5ldF91cGRhdGVfcmVjdl9zdGF0cyhzYykKKworI2VuZGlmIC8qIENPTkZJR19PQ0ZTMl9GU19TVEFUUyAqLworCiBzdGF0aWMgaW5saW5lIGludCBvMm5ldF9yZWNvbm5lY3RfZGVsYXkodm9pZCkKIHsKIAlyZXR1cm4gbzJubV9zaW5nbGVfY2x1c3Rlci0+Y2xfcmVjb25uZWN0X2RlbGF5X21zOwpAQCAtMzU1LDYgKzQwNiw3IEBACiAJCXNjLT5zY19zb2NrID0gTlVMTDsKIAl9CiAKKwlvMm5tX3VuZGVwZW5kX2l0ZW0oJnNjLT5zY19ub2RlLT5uZF9pdGVtKTsKIAlvMm5tX25vZGVfcHV0KHNjLT5zY19ub2RlKTsKIAlzYy0+c2Nfbm9kZSA9IE5VTEw7CiAKQEAgLTM3Niw2ICs0MjgsNyBAQAogewogCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpyZXQgPSBOVUxMOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gMDsKIAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0ZTKTsKIAlzYyA9IGt6YWxsb2Moc2l6ZW9mKCpzYyksIEdGUF9OT0ZTKTsKQEAgLTM4Niw2ICs0MzksMTMgQEAKIAlvMm5tX25vZGVfZ2V0KG5vZGUpOwogCXNjLT5zY19ub2RlID0gbm9kZTsKIAorCS8qIHBpbiB0aGUgbm9kZSBpdGVtIG9mIHRoZSByZW1vdGUgbm9kZSAqLworCXN0YXR1cyA9IG8ybm1fZGVwZW5kX2l0ZW0oJm5vZGUtPm5kX2l0ZW0pOworCWlmIChzdGF0dXMpIHsKKwkJbWxvZ19lcnJubyhzdGF0dXMpOworCQlvMm5tX25vZGVfcHV0KG5vZGUpOworCQlnb3RvIG91dDsKKwl9CiAJSU5JVF9XT1JLKCZzYy0+c2NfY29ubmVjdF93b3JrLCBvMm5ldF9zY19jb25uZWN0X2NvbXBsZXRlZCk7CiAJSU5JVF9XT1JLKCZzYy0+c2Nfcnhfd29yaywgbzJuZXRfcnhfdW50aWxfZW1wdHkpOwogCUlOSVRfV09SSygmc2MtPnNjX3NodXRkb3duX3dvcmssIG8ybmV0X3NodXRkb3duX3NjKTsKQEAgLTU0Niw3ICs2MDYsNyBAQAogCWlmIChzay0+c2tfdXNlcl9kYXRhKSB7CiAJCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MgPSBzay0+c2tfdXNlcl9kYXRhOwogCQlzY2xvZyhzYywgImRhdGFfcmVhZHkgaGl0XG4iKTsKLQkJZG9fZ2V0dGltZW9mZGF5KCZzYy0+c2NfdHZfZGF0YV9yZWFkeSk7CisJCW8ybmV0X3NldF9kYXRhX3JlYWR5X3RpbWUoc2MpOwogCQlvMm5ldF9zY19xdWV1ZV93b3JrKHNjLCAmc2MtPnNjX3J4X3dvcmspOwogCQlyZWFkeSA9IHNjLT5zY19kYXRhX3JlYWR5OwogCX0gZWxzZSB7CkBAIC0xMDcwLDYgKzExMzAsOCBAQAogCW8ybmV0X3NldF9uc3Rfc3RhdHVzX3RpbWUoJm5zdCk7CiAJd2FpdF9ldmVudChuc3cubnNfd3EsIG8ybmV0X25zd19jb21wbGV0ZWQobm4sICZuc3cpKTsKIAorCW8ybmV0X3VwZGF0ZV9zZW5kX3N0YXRzKCZuc3QsIHNjKTsKKwogCS8qIE5vdGUgdGhhdCB3ZSBhdm9pZCBvdmVyd3JpdGluZyB0aGUgY2FsbGVycyBzdGF0dXMgcmV0dXJuCiAJICogdmFyaWFibGUgaWYgYSBzeXN0ZW0gZXJyb3Igd2FzIHJlcG9ydGVkIG9uIHRoZSBvdGhlcgogCSAqIHNpZGUuIENhbGxlcnMgYmV3YXJlLiAqLwpAQCAtMTE4MywxMyArMTI0NSwxNSBAQAogCWlmIChzeXNlcnIgIT0gTzJORVRfRVJSX05PTkUpCiAJCWdvdG8gb3V0X3Jlc3BvbmQ7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJnNjLT5zY190dl9mdW5jX3N0YXJ0KTsKKwlvMm5ldF9zZXRfZnVuY19zdGFydF90aW1lKHNjKTsKIAlzYy0+c2NfbXNnX2tleSA9IGJlMzJfdG9fY3B1KGhkci0+a2V5KTsKIAlzYy0+c2NfbXNnX3R5cGUgPSBiZTE2X3RvX2NwdShoZHItPm1zZ190eXBlKTsKIAloYW5kbGVyX3N0YXR1cyA9IChubWgtPm5oX2Z1bmMpKGhkciwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9tc2cpICsKIAkJCQkJICAgICBiZTE2X3RvX2NwdShoZHItPmRhdGFfbGVuKSwKIAkJCQkJbm1oLT5uaF9mdW5jX2RhdGEsICZyZXRfZGF0YSk7Ci0JZG9fZ2V0dGltZW9mZGF5KCZzYy0+c2NfdHZfZnVuY19zdG9wKTsKKwlvMm5ldF9zZXRfZnVuY19zdG9wX3RpbWUoc2MpOworCisJbzJuZXRfdXBkYXRlX3JlY3Zfc3RhdHMoc2MpOwogCiBvdXRfcmVzcG9uZDoKIAkvKiB0aGlzIGRlc3Ryb3lzIHRoZSBoZHIsIHNvIGRvbid0IHVzZSBpdCBhZnRlciB0aGlzICovCkBAIC0xMzAwLDcgKzEzNjQsNyBAQAogCXNpemVfdCBkYXRhbGVuOwogCiAJc2Nsb2coc2MsICJyZWNlaXZpbmdcbiIpOwotCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQpOworCW8ybmV0X3NldF9hZHZhbmNlX3N0YXJ0X3RpbWUoc2MpOwogCiAJaWYgKHVubGlrZWx5KHNjLT5zY19oYW5kc2hha2Vfb2sgPT0gMCkpIHsKIAkJaWYoc2MtPnNjX3BhZ2Vfb2ZmIDwgc2l6ZW9mKHN0cnVjdCBvMm5ldF9oYW5kc2hha2UpKSB7CkBAIC0xMzc1LDcgKzE0MzksNyBAQAogCiBvdXQ6CiAJc2Nsb2coc2MsICJyZXQgPSAlZFxuIiwgcmV0KTsKLQlkb19nZXR0aW1lb2ZkYXkoJnNjLT5zY190dl9hZHZhbmNlX3N0b3ApOworCW8ybmV0X3NldF9hZHZhbmNlX3N0b3BfdGltZShzYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ3NSwyNyArMTUzOSwyOCBAQAogewogCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MgPSAoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICopZGF0YTsKIAlzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4gPSBvMm5ldF9ubl9mcm9tX251bShzYy0+c2Nfbm9kZS0+bmRfbnVtKTsKLQlzdHJ1Y3QgdGltZXZhbCBub3c7CiAKLQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJa3RpbWVfdCBub3cgPSBrdGltZV9nZXQoKTsKKyNlbmRpZgogCiAJcHJpbnRrKEtFUk5fTk9USUNFICJvMm5ldDogY29ubmVjdGlvbiB0byAiIFNDX05PREVGX0ZNVCAiIGhhcyBiZWVuIGlkbGUgZm9yICV1LiV1ICIKIAkgICAgICJzZWNvbmRzLCBzaHV0dGluZyBpdCBkb3duLlxuIiwgU0NfTk9ERUZfQVJHUyhzYyksCiAJCSAgICAgbzJuZXRfaWRsZV90aW1lb3V0KCkgLyAxMDAwLAogCQkgICAgIG8ybmV0X2lkbGVfdGltZW91dCgpICUgMTAwMCk7Ci0JbWxvZyhNTF9OT1RJQ0UsICJoZXJlIGFyZSBzb21lIHRpbWVzIHRoYXQgbWlnaHQgaGVscCBkZWJ1ZyB0aGUgIgotCSAgICAgInNpdHVhdGlvbjogKHRtciAlbGQuJWxkIG5vdyAlbGQuJWxkIGRyICVsZC4lbGQgYWR2ICIKLQkgICAgICIlbGQuJWxkOiVsZC4lbGQgZnVuYyAoJTA4eDoldSkgJWxkLiVsZDolbGQuJWxkKVxuIiwKLQkgICAgIHNjLT5zY190dl90aW1lci50dl9zZWMsIChsb25nKSBzYy0+c2NfdHZfdGltZXIudHZfdXNlYywKLQkgICAgIG5vdy50dl9zZWMsIChsb25nKSBub3cudHZfdXNlYywKLQkgICAgIHNjLT5zY190dl9kYXRhX3JlYWR5LnR2X3NlYywgKGxvbmcpIHNjLT5zY190dl9kYXRhX3JlYWR5LnR2X3VzZWMsCi0JICAgICBzYy0+c2NfdHZfYWR2YW5jZV9zdGFydC50dl9zZWMsCi0JICAgICAobG9uZykgc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQudHZfdXNlYywKLQkgICAgIHNjLT5zY190dl9hZHZhbmNlX3N0b3AudHZfc2VjLAotCSAgICAgKGxvbmcpIHNjLT5zY190dl9hZHZhbmNlX3N0b3AudHZfdXNlYywKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCW1sb2coTUxfTk9USUNFLCAiSGVyZSBhcmUgc29tZSB0aW1lcyB0aGF0IG1pZ2h0IGhlbHAgZGVidWcgdGhlICIKKwkgICAgICJzaXR1YXRpb246IChUaW1lcjogJWxsZCwgTm93ICVsbGQsIERhdGFSZWFkeSAlbGxkLCBBZHZhbmNlICVsbGQtJWxsZCwgIgorCSAgICAgIktleSAweCUwOHgsIEZ1bmMgJXUsIEZ1bmNUaW1lICVsbGQtJWxsZClcbiIsCisJICAgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl90aW1lciksIChsb25nIGxvbmcpa3RpbWVfdG9fdXMobm93KSwKKwkgICAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2RhdGFfcmVhZHkpLAorCSAgICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfYWR2YW5jZV9zdGFydCksCisJICAgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9hZHZhbmNlX3N0b3ApLAogCSAgICAgc2MtPnNjX21zZ19rZXksIHNjLT5zY19tc2dfdHlwZSwKLQkgICAgIHNjLT5zY190dl9mdW5jX3N0YXJ0LnR2X3NlYywgKGxvbmcpIHNjLT5zY190dl9mdW5jX3N0YXJ0LnR2X3VzZWMsCi0JICAgICBzYy0+c2NfdHZfZnVuY19zdG9wLnR2X3NlYywgKGxvbmcpIHNjLT5zY190dl9mdW5jX3N0b3AudHZfdXNlYyk7CisJICAgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9mdW5jX3N0YXJ0KSwKKwkgICAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2Z1bmNfc3RvcCkpOworI2VuZGlmCiAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIG5uX3RpbWVvdXQgc28gdGhhdCB0aGUgbmV4dCBjb25uZWN0aW9uIGF0dGVtcHQKQEAgLTE1MTEsNyArMTU3Niw3IEBACiAJbzJuZXRfc2NfY2FuY2VsX2RlbGF5ZWRfd29yayhzYywgJnNjLT5zY19rZWVwYWxpdmVfd29yayk7CiAJbzJuZXRfc2NfcXVldWVfZGVsYXllZF93b3JrKHNjLCAmc2MtPnNjX2tlZXBhbGl2ZV93b3JrLAogCQkgICAgICBtc2Vjc190b19qaWZmaWVzKG8ybmV0X2tlZXBhbGl2ZV9kZWxheSgpKSk7Ci0JZG9fZ2V0dGltZW9mZGF5KCZzYy0+c2NfdHZfdGltZXIpOworCW8ybmV0X3NldF9zb2NrX3RpbWVyKHNjKTsKIAltb2RfdGltZXIoJnNjLT5zY19pZGxlX3RpbWVvdXQsCiAJICAgICAgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG8ybmV0X2lkbGVfdGltZW91dCgpKSk7CiB9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oIGIvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaAppbmRleCAxNWZkYmRmLi40Y2JjYjY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKQEAgLTE2NiwxOCArMTY2LDI3IEBACiAJLyogb3JpZ2luYWwgaGFuZGxlcnMgZm9yIHRoZSBzb2NrZXRzICovCiAJdm9pZAkJCSgqc2Nfc3RhdGVfY2hhbmdlKShzdHJ1Y3Qgc29jayAqc2spOwogCXZvaWQJCQkoKnNjX2RhdGFfcmVhZHkpKHN0cnVjdCBzb2NrICpzaywgaW50IGJ5dGVzKTsKLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBzY19uZXRfZGVidWdfaXRlbTsKLSNlbmRpZgotCXN0cnVjdCB0aW1ldmFsIAkJc2NfdHZfdGltZXI7Ci0Jc3RydWN0IHRpbWV2YWwgCQlzY190dl9kYXRhX3JlYWR5OwotCXN0cnVjdCB0aW1ldmFsIAkJc2NfdHZfYWR2YW5jZV9zdGFydDsKLQlzdHJ1Y3QgdGltZXZhbCAJCXNjX3R2X2FkdmFuY2Vfc3RvcDsKLQlzdHJ1Y3QgdGltZXZhbCAJCXNjX3R2X2Z1bmNfc3RhcnQ7Ci0Jc3RydWN0IHRpbWV2YWwgCQlzY190dl9mdW5jX3N0b3A7CisKIAl1MzIJCQlzY19tc2dfa2V5OwogCXUxNgkJCXNjX21zZ190eXBlOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgc2NfbmV0X2RlYnVnX2l0ZW07CisJa3RpbWVfdAkJCXNjX3R2X3RpbWVyOworCWt0aW1lX3QJCQlzY190dl9kYXRhX3JlYWR5OworCWt0aW1lX3QJCQlzY190dl9hZHZhbmNlX3N0YXJ0OworCWt0aW1lX3QJCQlzY190dl9hZHZhbmNlX3N0b3A7CisJa3RpbWVfdAkJCXNjX3R2X2Z1bmNfc3RhcnQ7CisJa3RpbWVfdAkJCXNjX3R2X2Z1bmNfc3RvcDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19TVEFUUworCWt0aW1lX3QJCQlzY190dl9hY3F1aXJ5X3RvdGFsOworCWt0aW1lX3QJCQlzY190dl9zZW5kX3RvdGFsOworCWt0aW1lX3QJCQlzY190dl9zdGF0dXNfdG90YWw7CisJdTMyCQkJc2Nfc2VuZF9jb3VudDsKKwl1MzIJCQlzY19yZWN2X2NvdW50OworCWt0aW1lX3QJCQlzY190dl9wcm9jZXNzX3RvdGFsOworI2VuZGlmCiAJc3RydWN0IG11dGV4CQlzY19zZW5kX2xvY2s7CiB9OwogCkBAIC0yMjAsOSArMjI5LDkgQEAKIAl1MzIJCQkJc3RfbXNnX3R5cGU7CiAJdTMyCQkJCXN0X21zZ19rZXk7CiAJdTgJCQkJc3Rfbm9kZTsKLQlzdHJ1Y3QgdGltZXZhbAkJCXN0X3NvY2tfdGltZTsKLQlzdHJ1Y3QgdGltZXZhbAkJCXN0X3NlbmRfdGltZTsKLQlzdHJ1Y3QgdGltZXZhbAkJCXN0X3N0YXR1c190aW1lOworCWt0aW1lX3QJCQkJc3Rfc29ja190aW1lOworCWt0aW1lX3QJCQkJc3Rfc2VuZF90aW1lOworCWt0aW1lX3QJCQkJc3Rfc3RhdHVzX3RpbWU7CiB9OwogI2Vsc2UKIHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1hc3QuYyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwppbmRleCBmNDQ5OTkxLi4zYTNlZDRiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWFzdC5jCkBAIC05MCwxOSArOTAsMjkgQEAKIAogdm9pZCBfX2RsbV9xdWV1ZV9hc3Qoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkbG1fbG9jayAqbG9jaykKIHsKLQltbG9nX2VudHJ5X3ZvaWQoKTsKKwlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAogCUJVR19PTighZGxtKTsKIAlCVUdfT04oIWxvY2spOwogCisJcmVzID0gbG9jay0+bG9ja3JlczsKKwogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5hc3RfbG9jayk7CisKIAlpZiAoIWxpc3RfZW1wdHkoJmxvY2stPmFzdF9saXN0KSkgewotCQltbG9nKE1MX0VSUk9SLCAiYXN0IGxpc3Qgbm90IGVtcHR5ISEgIHBlbmRpbmc9JWQsIG5ld2xldmVsPSVkXG4iLAorCQltbG9nKE1MX0VSUk9SLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsICIKKwkJICAgICAiQVNUIGxpc3Qgbm90IGVtcHR5LCBwZW5kaW5nICVkLCBuZXdsZXZlbCAlZFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAogCQkgICAgIGxvY2stPmFzdF9wZW5kaW5nLCBsb2NrLT5tbC50eXBlKTsKIAkJQlVHKCk7CiAJfQogCWlmIChsb2NrLT5hc3RfcGVuZGluZykKLQkJbWxvZygwLCAibG9jayBoYXMgYW4gYXN0IGdldHRpbmcgZmx1c2hlZCByaWdodCBub3dcbiIpOworCQltbG9nKDAsICIlczogcmVzICUuKnMsIGxvY2sgJXU6JWxsdSwgQVNUIGdldHRpbmcgZmx1c2hlZFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpKTsKIAogCS8qIHB1dHRpbmcgbG9jayBvbiBsaXN0LCBhZGQgYSByZWYgKi8KIAlkbG1fbG9ja19nZXQobG9jayk7CkBAIC0xMTAsOSArMTIwLDEwIEBACiAKIAkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyBhc3Qgb2Jzb2xldGVzIHRoZSBiYXN0ICovCiAJaWYgKGRsbV9zaG91bGRfY2FuY2VsX2Jhc3QoZGxtLCBsb2NrKSkgewotCQlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcyA9IGxvY2stPmxvY2tyZXM7Ci0JCW1sb2coMCwgIiVzOiBjYW5jZWxsaW5nIGJhc3QgZm9yICUuKnNcbiIsCi0JCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIENhbmNlbGxpbmcgQkFTVFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpKTsKIAkJbG9jay0+YmFzdF9wZW5kaW5nID0gMDsKIAkJbGlzdF9kZWxfaW5pdCgmbG9jay0+YmFzdF9saXN0KTsKIAkJbG9jay0+bWwuaGlnaGVzdF9ibG9ja2VkID0gTEtNX0lWTU9ERTsKQEAgLTEzNCw4ICsxNDUsNiBAQAogCiB2b2lkIGRsbV9xdWV1ZV9hc3Qoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkbG1fbG9jayAqbG9jaykKIHsKLQltbG9nX2VudHJ5X3ZvaWQoKTsKLQogCUJVR19PTighZGxtKTsKIAlCVUdfT04oIWxvY2spOwogCkBAIC0xNDcsMTUgKzE1NiwyMSBAQAogCiB2b2lkIF9fZGxtX3F1ZXVlX2Jhc3Qoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkbG1fbG9jayAqbG9jaykKIHsKLQltbG9nX2VudHJ5X3ZvaWQoKTsKKwlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAogCUJVR19PTighZGxtKTsKIAlCVUdfT04oIWxvY2spOworCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPmFzdF9sb2NrKTsKIAorCXJlcyA9IGxvY2stPmxvY2tyZXM7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmxvY2stPmJhc3RfbGlzdCkpOwogCWlmIChsb2NrLT5iYXN0X3BlbmRpbmcpCi0JCW1sb2coMCwgImxvY2sgaGFzIGEgYmFzdCBnZXR0aW5nIGZsdXNoZWQgcmlnaHQgbm93XG4iKTsKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIEJBU1QgZ2V0dGluZyBmbHVzaGVkXG4iLAorCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSkpOwogCiAJLyogcHV0dGluZyBsb2NrIG9uIGxpc3QsIGFkZCBhIHJlZiAqLwogCWRsbV9sb2NrX2dldChsb2NrKTsKQEAgLTE2Nyw4ICsxODIsNiBAQAogCiB2b2lkIGRsbV9xdWV1ZV9iYXN0KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGxtX2xvY2sgKmxvY2spCiB7Ci0JbWxvZ19lbnRyeV92b2lkKCk7Ci0KIAlCVUdfT04oIWRsbSk7CiAJQlVHX09OKCFsb2NrKTsKIApAQCAtMjEzLDcgKzIyNiwxMCBAQAogCWRsbV9hc3Rsb2NrZnVuY190ICpmbjsKIAlzdHJ1Y3QgZGxtX2xvY2tzdGF0dXMgKmxrc2I7CiAKLQltbG9nX2VudHJ5X3ZvaWQoKTsKKwltbG9nKDAsICIlczogcmVzICUuKnMsIGxvY2sgJXU6JWxsdSwgTG9jYWwgQVNUXG4iLCBkbG0tPm5hbWUsCisJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSkpOwogCiAJbGtzYiA9IGxvY2stPmxrc2I7CiAJZm4gPSBsb2NrLT5hc3Q7CkBAIC0yMzEsNyArMjQ3LDEwIEBACiAJc3RydWN0IGRsbV9sb2Nrc3RhdHVzICpsa3NiOwogCWludCBsa3NiZmxhZ3M7CiAKLQltbG9nX2VudHJ5X3ZvaWQoKTsKKwltbG9nKDAsICIlczogcmVzICUuKnMsIGxvY2sgJXU6JWxsdSwgUmVtb3RlIEFTVFxuIiwgZGxtLT5uYW1lLAorCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpKTsKIAogCWxrc2IgPSBsb2NrLT5sa3NiOwogCUJVR19PTihsb2NrLT5tbC5ub2RlID09IGRsbS0+bm9kZV9udW0pOwpAQCAtMjUwLDkgKzI2OSwxNCBAQAogewogCWRsbV9iYXN0bG9ja2Z1bmNfdCAqZm4gPSBsb2NrLT5iYXN0OwogCi0JbWxvZ19lbnRyeV92b2lkKCk7CiAJQlVHX09OKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSk7CiAKKwltbG9nKDAsICIlczogcmVzICUuKnMsIGxvY2sgJXU6JWxsdSwgTG9jYWwgQkFTVCwgYmxvY2tlZCAlZFxuIiwKKwkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCSAgICAgYmxvY2tlZF90eXBlKTsKKwogCSgqZm4pKGxvY2stPmFzdGRhdGEsIGJsb2NrZWRfdHlwZSk7CiB9CiAKQEAgLTMzMiw3ICszNTYsOCBAQAogCS8qIGNhbm5vdCBnZXQgYSBwcm94eSBhc3QgbWVzc2FnZSBpZiB0aGlzIG5vZGUgb3ducyBpdCAqLwogCUJVR19PTihyZXMtPm93bmVyID09IGRsbS0+bm9kZV9udW0pOwogCi0JbWxvZygwLCAibG9ja3JlcyAlLipzXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKKwltbG9nKDAsICIlczogcmVzICUuKnNcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJICAgICByZXMtPmxvY2tuYW1lLm5hbWUpOwogCiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAlpZiAocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19SRUNPVkVSSU5HKSB7CkBAIC0zODIsOCArNDA3LDEyIEBACiAJaWYgKHBhc3QtPnR5cGUgPT0gRExNX0FTVCkgewogCQkvKiBkbyBub3QgYWx0ZXIgbG9jayByZWZjb3VudC4gIHN3aXRjaGluZyBsaXN0cy4gKi8KIAkJbGlzdF9tb3ZlX3RhaWwoJmxvY2stPmxpc3QsICZyZXMtPmdyYW50ZWQpOwotCQltbG9nKDAsICJhc3Q6IEFkZGluZyB0byBncmFudGVkIGxpc3QuLi4gdHlwZT0lZCwgIgotCQkgICAgICJjb252ZXJ0X3R5cGU9JWRcbiIsIGxvY2stPm1sLnR5cGUsIGxvY2stPm1sLmNvbnZlcnRfdHlwZSk7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgbG9jayAldTolbGx1LCBHcmFudGVkIHR5cGUgJWQgPT4gJWRcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShjb29raWUpKSwKKwkJICAgICBsb2NrLT5tbC50eXBlLCBsb2NrLT5tbC5jb252ZXJ0X3R5cGUpOworCiAJCWlmIChsb2NrLT5tbC5jb252ZXJ0X3R5cGUgIT0gTEtNX0lWTU9ERSkgewogCQkJbG9jay0+bWwudHlwZSA9IGxvY2stPm1sLmNvbnZlcnRfdHlwZTsKIAkJCWxvY2stPm1sLmNvbnZlcnRfdHlwZSA9IExLTV9JVk1PREU7CkBAIC00MjYsOSArNDU1LDkgQEAKIAlzaXplX3QgdmVjbGVuID0gMTsKIAlpbnQgc3RhdHVzOwogCi0JbWxvZ19lbnRyeSgicmVzICUuKnMsIHRvPSV1LCB0eXBlPSVkLCBibG9ja2VkX3R5cGU9JWRcbiIsCi0JCSAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIGxvY2stPm1sLm5vZGUsCi0JCSAgIG1zZ190eXBlLCBibG9ja2VkX3R5cGUpOworCW1sb2coMCwgIiVzOiByZXMgJS4qcywgdG8gJXUsIHR5cGUgJWQsIGJsb2NrZWRfdHlwZSAlZFxuIiwgZGxtLT5uYW1lLAorCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwgbG9jay0+bWwubm9kZSwgbXNnX3R5cGUsCisJICAgICBibG9ja2VkX3R5cGUpOwogCiAJbWVtc2V0KCZwYXN0LCAwLCBzaXplb2Yoc3RydWN0IGRsbV9wcm94eV9hc3QpKTsKIAlwYXN0Lm5vZGVfaWR4ID0gZGxtLT5ub2RlX251bTsKQEAgLTQ0MSw3ICs0NzAsNiBAQAogCXZlY1swXS5pb3ZfbGVuID0gc2l6ZW9mKHN0cnVjdCBkbG1fcHJveHlfYXN0KTsKIAl2ZWNbMF0uaW92X2Jhc2UgPSAmcGFzdDsKIAlpZiAoZmxhZ3MgJiBETE1fTEtTQl9HRVRfTFZCKSB7Ci0JCW1sb2coMCwgInJldHVybmluZyByZXF1ZXN0ZWQgTFZCIGRhdGFcbiIpOwogCQliZTMyX2FkZF9jcHUoJnBhc3QuZmxhZ3MsIExLTV9HRVRfTFZCKTsKIAkJdmVjWzFdLmlvdl9sZW4gPSBETE1fTFZCX0xFTjsKIAkJdmVjWzFdLmlvdl9iYXNlID0gbG9jay0+bGtzYi0+bHZiOwpAQCAtNDUxLDggKzQ3OSw4IEBACiAJcmV0ID0gbzJuZXRfc2VuZF9tZXNzYWdlX3ZlYyhETE1fUFJPWFlfQVNUX01TRywgZGxtLT5rZXksIHZlYywgdmVjbGVuLAogCQkJCSAgICAgbG9jay0+bWwubm9kZSwgJnN0YXR1cyk7CiAJaWYgKHJldCA8IDApCi0JCW1sb2coTUxfRVJST1IsICJFcnJvciAlZCB3aGVuIHNlbmRpbmcgbWVzc2FnZSAldSAoa2V5IDB4JXgpIHRvICIKLQkJICAgICAibm9kZSAldVxuIiwgcmV0LCBETE1fUFJPWFlfQVNUX01TRywgZGxtLT5rZXksCisJCW1sb2coTUxfRVJST1IsICIlczogcmVzICUuKnMsIGVycm9yICVkIHNlbmQgQVNUIHRvIG5vZGUgJXVcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCByZXQsCiAJCSAgICAgbG9jay0+bWwubm9kZSk7CiAJZWxzZSB7CiAJCWlmIChzdGF0dXMgPT0gRExNX1JFQ09WRVJJTkcpIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaCBiL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaAppbmRleCBiMzZkMGJmLi40YmRmN2JhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKKysrIGIvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCkBAIC01MCwxMCArNTAsMTAgQEAKICNkZWZpbmUgZGxtX2xvY2tpZF9oYXNoKF9uLCBfbCkgZnVsbF9uYW1lX2hhc2goX24sIF9sKQogCiBlbnVtIGRsbV9tbGVfdHlwZSB7Ci0JRExNX01MRV9CTE9DSywKLQlETE1fTUxFX01BU1RFUiwKLQlETE1fTUxFX01JR1JBVElPTiwKLQlETE1fTUxFX05VTV9UWVBFUworCURMTV9NTEVfQkxPQ0sgPSAwLAorCURMTV9NTEVfTUFTVEVSID0gMSwKKwlETE1fTUxFX01JR1JBVElPTiA9IDIsCisJRExNX01MRV9OVU1fVFlQRVMgPSAzLAogfTsKIAogc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSB7CkBAIC04Miw4ICs4Miw4IEBACiAKIGVudW0gZGxtX2FzdF90eXBlIHsKIAlETE1fQVNUID0gMCwKLQlETE1fQkFTVCwKLQlETE1fQVNUVU5MT0NLCisJRExNX0JBU1QgPSAxLAorCURMTV9BU1RVTkxPQ0sgPSAyLAogfTsKIAogCkBAIC0xMTksOSArMTE5LDkgQEAKIAogZW51bSBkbG1fY3R4dF9zdGF0ZSB7CiAJRExNX0NUWFRfTkVXID0gMCwKLQlETE1fQ1RYVF9KT0lORUQsCi0JRExNX0NUWFRfSU5fU0hVVERPV04sCi0JRExNX0NUWFRfTEVBVklORywKKwlETE1fQ1RYVF9KT0lORUQgPSAxLAorCURMTV9DVFhUX0lOX1NIVVRET1dOID0gMiwKKwlETE1fQ1RYVF9MRUFWSU5HID0gMywKIH07CiAKIHN0cnVjdCBkbG1fY3R4dApAQCAtMzg4LDggKzM4OCw4IEBACiAKIGVudW0gZGxtX2xvY2tyZXNfbGlzdCB7CiAJRExNX0dSQU5URURfTElTVCA9IDAsCi0JRExNX0NPTlZFUlRJTkdfTElTVCwKLQlETE1fQkxPQ0tFRF9MSVNUCisJRExNX0NPTlZFUlRJTkdfTElTVCA9IDEsCisJRExNX0JMT0NLRURfTElTVCA9IDIsCiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBkbG1fbHZiX2lzX2VtcHR5KGNoYXIgKmx2YikKQEAgLTQyNywyNyArNDI3LDI3IEBACiAKIAogZW51bSB7Ci0JRExNX01BU1RFUl9SRVFVRVNUX01TRyAgICA9IDUwMCwKLQlETE1fVU5VU0VEX01TRzEsICAgICAgICAgLyogNTAxICovCi0JRExNX0FTU0VSVF9NQVNURVJfTVNHLAkgLyogNTAyICovCi0JRExNX0NSRUFURV9MT0NLX01TRywJIC8qIDUwMyAqLwotCURMTV9DT05WRVJUX0xPQ0tfTVNHLAkgLyogNTA0ICovCi0JRExNX1BST1hZX0FTVF9NU0csCSAvKiA1MDUgKi8KLQlETE1fVU5MT0NLX0xPQ0tfTVNHLAkgLyogNTA2ICovCi0JRExNX0RFUkVGX0xPQ0tSRVNfTVNHLAkgLyogNTA3ICovCi0JRExNX01JR1JBVEVfUkVRVUVTVF9NU0csIC8qIDUwOCAqLwotCURMTV9NSUdfTE9DS1JFU19NU0csIAkgLyogNTA5ICovCi0JRExNX1FVRVJZX0pPSU5fTVNHLAkgLyogNTEwICovCi0JRExNX0FTU0VSVF9KT0lORURfTVNHLAkgLyogNTExICovCi0JRExNX0NBTkNFTF9KT0lOX01TRywJIC8qIDUxMiAqLwotCURMTV9FWElUX0RPTUFJTl9NU0csCSAvKiA1MTMgKi8KLQlETE1fTUFTVEVSX1JFUVVFUllfTVNHLAkgLyogNTE0ICovCi0JRExNX0xPQ0tfUkVRVUVTVF9NU0csCSAvKiA1MTUgKi8KLQlETE1fUkVDT19EQVRBX0RPTkVfTVNHLAkgLyogNTE2ICovCi0JRExNX0JFR0lOX1JFQ09fTVNHLAkgLyogNTE3ICovCi0JRExNX0ZJTkFMSVpFX1JFQ09fTVNHLAkgLyogNTE4ICovCi0JRExNX1FVRVJZX1JFR0lPTiwJIC8qIDUxOSAqLwotCURMTV9RVUVSWV9OT0RFSU5GTywJIC8qIDUyMCAqLworCURMTV9NQVNURVJfUkVRVUVTVF9NU0cJCT0gNTAwLAorCURMTV9VTlVTRURfTVNHMQkJCT0gNTAxLAorCURMTV9BU1NFUlRfTUFTVEVSX01TRwkJPSA1MDIsCisJRExNX0NSRUFURV9MT0NLX01TRwkJPSA1MDMsCisJRExNX0NPTlZFUlRfTE9DS19NU0cJCT0gNTA0LAorCURMTV9QUk9YWV9BU1RfTVNHCQk9IDUwNSwKKwlETE1fVU5MT0NLX0xPQ0tfTVNHCQk9IDUwNiwKKwlETE1fREVSRUZfTE9DS1JFU19NU0cJCT0gNTA3LAorCURMTV9NSUdSQVRFX1JFUVVFU1RfTVNHCQk9IDUwOCwKKwlETE1fTUlHX0xPQ0tSRVNfTVNHCQk9IDUwOSwKKwlETE1fUVVFUllfSk9JTl9NU0cJCT0gNTEwLAorCURMTV9BU1NFUlRfSk9JTkVEX01TRwkJPSA1MTEsCisJRExNX0NBTkNFTF9KT0lOX01TRwkJPSA1MTIsCisJRExNX0VYSVRfRE9NQUlOX01TRwkJPSA1MTMsCisJRExNX01BU1RFUl9SRVFVRVJZX01TRwkJPSA1MTQsCisJRExNX0xPQ0tfUkVRVUVTVF9NU0cJCT0gNTE1LAorCURMTV9SRUNPX0RBVEFfRE9ORV9NU0cJCT0gNTE2LAorCURMTV9CRUdJTl9SRUNPX01TRwkJPSA1MTcsCisJRExNX0ZJTkFMSVpFX1JFQ09fTVNHCQk9IDUxOCwKKwlETE1fUVVFUllfUkVHSU9OCQk9IDUxOSwKKwlETE1fUVVFUllfTk9ERUlORk8JCT0gNTIwLAogfTsKIAogc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YQpAQCAtNDYwLDE5ICs0NjAsMTkgQEAKIGVudW0gewogCURMTV9SRUNPX05PREVfREFUQV9ERUFEID0gLTEsCiAJRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQgPSAwLAotCURMTV9SRUNPX05PREVfREFUQV9SRVFVRVNUSU5HLAotCURMTV9SRUNPX05PREVfREFUQV9SRVFVRVNURUQsCi0JRExNX1JFQ09fTk9ERV9EQVRBX1JFQ0VJVklORywKLQlETE1fUkVDT19OT0RFX0RBVEFfRE9ORSwKLQlETE1fUkVDT19OT0RFX0RBVEFfRklOQUxJWkVfU0VOVCwKKwlETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVElORyA9IDEsCisJRExNX1JFQ09fTk9ERV9EQVRBX1JFUVVFU1RFRCA9IDIsCisJRExNX1JFQ09fTk9ERV9EQVRBX1JFQ0VJVklORyA9IDMsCisJRExNX1JFQ09fTk9ERV9EQVRBX0RPTkUgPSA0LAorCURMTV9SRUNPX05PREVfREFUQV9GSU5BTElaRV9TRU5UID0gNSwKIH07CiAKIAogZW51bSB7CiAJRExNX01BU1RFUl9SRVNQX05PID0gMCwKLQlETE1fTUFTVEVSX1JFU1BfWUVTLAotCURMTV9NQVNURVJfUkVTUF9NQVlCRSwKLQlETE1fTUFTVEVSX1JFU1BfRVJST1IKKwlETE1fTUFTVEVSX1JFU1BfWUVTID0gMSwKKwlETE1fTUFTVEVSX1JFU1BfTUFZQkUgPSAyLAorCURMTV9NQVNURVJfUkVTUF9FUlJPUiA9IDMsCiB9OwogCiAKQEAgLTY0OSw5ICs2NDksOSBAQAogI2RlZmluZSBETE1fTU9EX0tFWSAoMHg2NjZjNjE3MikKIGVudW0gZGxtX3F1ZXJ5X2pvaW5fcmVzcG9uc2VfY29kZSB7CiAJSk9JTl9ESVNBTExPVyA9IDAsCi0JSk9JTl9PSywKLQlKT0lOX09LX05PX01BUCwKLQlKT0lOX1BST1RPQ09MX01JU01BVENILAorCUpPSU5fT0sgPSAxLAorCUpPSU5fT0tfTk9fTUFQID0gMiwKKwlKT0lOX1BST1RPQ09MX01JU01BVENIID0gMywKIH07CiAKIHN0cnVjdCBkbG1fcXVlcnlfam9pbl9wYWNrZXQgewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYwppbmRleCAyNzJlYzg2Li4wNGEzMmJlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuYwpAQCAtMzcwLDkyICszNzAsNDYgQEAKIAlrcmVmX2dldCgmZGMtPmRlYnVnX3JlZmNudCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfYnVmZmVyICpkZWJ1Z19idWZmZXJfYWxsb2NhdGUodm9pZCkKK3N0YXRpYyBpbnQgZGVidWdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYiA9IE5VTEw7Ci0KLQlkYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWJ1Z19idWZmZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRiKQotCQlnb3RvIGJhaWw7Ci0KLQlkYi0+bGVuID0gUEFHRV9TSVpFOwotCWRiLT5idWYgPSBrbWFsbG9jKGRiLT5sZW4sIEdGUF9LRVJORUwpOwotCWlmICghZGItPmJ1ZikKLQkJZ290byBiYWlsOwotCi0JcmV0dXJuIGRiOwotYmFpbDoKLQlrZnJlZShkYik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX2J1ZmZlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCSBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIGRiLT5idWYsIGRiLT5sZW4pOwotfQotCi1zdGF0aWMgbG9mZl90IGRlYnVnX2J1ZmZlcl9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVuY2UpCi17Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JbG9mZl90IG5ldyA9IC0xOwotCi0Jc3dpdGNoICh3aGVuY2UpIHsKLQljYXNlIDA6Ci0JCW5ldyA9IG9mZjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQluZXcgPSBmaWxlLT5mX3BvcyArIG9mZjsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKG5ldyA8IDAgfHwgbmV3ID4gZGItPmxlbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gKGZpbGUtPmZfcG9zID0gbmV3KTsKLX0KLQotc3RhdGljIGludCBkZWJ1Z19idWZmZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChkYikKLQkJa2ZyZWUoZGItPmJ1Zik7Ci0Ja2ZyZWUoZGIpOwotCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWZpbGUtPnByaXZhdGVfZGF0YSk7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkgICAgICAgaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSk7Cit9CiAvKiBlbmQgLSB1dGlsIGZ1bmNzICovCiAKIC8qIGJlZ2luIC0gcHVyZ2UgbGlzdCBmdW5jcyAqLwotc3RhdGljIGludCBkZWJ1Z19wdXJnZWxpc3RfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiKQorc3RhdGljIGludCBkZWJ1Z19wdXJnZWxpc3RfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAlpbnQgb3V0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHRvdGFsID0gMDsKIAotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJEdW1waW5nIFB1cmdlbGlzdCBmb3IgRG9tYWluOiAlc1xuIiwgZGxtLT5uYW1lKTsKIAogCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZkbG0tPnB1cmdlX2xpc3QsIHB1cmdlKSB7CiAJCSsrdG90YWw7Ci0JCWlmIChkYi0+bGVuIC0gb3V0IDwgMTAwKQorCQlpZiAobGVuIC0gb3V0IDwgMTAwKQogCQkJY29udGludWU7CiAJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJCW91dCArPSBzdHJpbmdpZnlfbG9ja25hbWUocmVzLT5sb2NrbmFtZS5uYW1lLAogCQkJCQkgIHJlcy0+bG9ja25hbWUubGVuLAotCQkJCQkgIGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQpOwotCQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlx0JWxkXG4iLAorCQkJCQkgIGJ1ZiArIG91dCwgbGVuIC0gb3V0KTsKKwkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiXHQlbGRcbiIsCiAJCQkJKGppZmZpZXMgLSByZXMtPmxhc3RfdXNlZCkvSFopOwogCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKIAotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAotCQkJIlRvdGFsIG9uIGxpc3Q6ICVsZFxuIiwgdG90YWwpOworCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIlRvdGFsIG9uIGxpc3Q6ICVsZFxuIiwgdG90YWwpOwogCiAJcmV0dXJuIG91dDsKIH0KQEAgLTQ2MywxNSArNDE3LDE1IEBACiBzdGF0aWMgaW50IGRlYnVnX3B1cmdlbGlzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYjsKKwljaGFyICpidWYgPSBOVUxMOwogCi0JZGIgPSBkZWJ1Z19idWZmZXJfYWxsb2NhdGUoKTsKLQlpZiAoIWRiKQorCWJ1ZiA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfTk9GUyk7CisJaWYgKCFidWYpCiAJCWdvdG8gYmFpbDsKIAotCWRiLT5sZW4gPSBkZWJ1Z19wdXJnZWxpc3RfcHJpbnQoZGxtLCBkYik7CisJaV9zaXplX3dyaXRlKGlub2RlLCBkZWJ1Z19wdXJnZWxpc3RfcHJpbnQoZGxtLCBidWYsIFBBR0VfU0laRSAtIDEpKTsKIAotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRiOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ1ZjsKIAogCXJldHVybiAwOwogYmFpbDoKQEAgLTQ4MCwxNCArNDM0LDE0IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3B1cmdlbGlzdF9mb3BzID0gewogCS5vcGVuID0JCWRlYnVnX3B1cmdlbGlzdF9vcGVuLAotCS5yZWxlYXNlID0JZGVidWdfYnVmZmVyX3JlbGVhc2UsCi0JLnJlYWQgPQkJZGVidWdfYnVmZmVyX3JlYWQsCi0JLmxsc2VlayA9CWRlYnVnX2J1ZmZlcl9sbHNlZWssCisJLnJlbGVhc2UgPQlkZWJ1Z19yZWxlYXNlLAorCS5yZWFkID0JCWRlYnVnX3JlYWQsCisJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogLyogZW5kIC0gcHVyZ2UgbGlzdCBmdW5jcyAqLwogCiAvKiBiZWdpbiAtIGRlYnVnIG1sZSBmdW5jcyAqLwotc3RhdGljIGludCBkZWJ1Z19tbGVfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiKQorc3RhdGljIGludCBkZWJ1Z19tbGVfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGU7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKQEAgLTQ5NSw3ICs0NDksNyBAQAogCWludCBpLCBvdXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAwLCBsb25nZXN0ID0gMCwgYnVja2V0X2NvdW50ID0gMDsKIAotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJEdW1waW5nIE1MRXMgZm9yIERvbWFpbjogJXNcbiIsIGRsbS0+bmFtZSk7CiAKIAlzcGluX2xvY2soJmRsbS0+bWFzdGVyX2xvY2spOwpAQCAtNTA2LDE2ICs0NjAsMTYgQEAKIAkJCQkJICBtYXN0ZXJfaGFzaF9ub2RlKTsKIAkJCSsrdG90YWw7CiAJCQkrK2J1Y2tldF9jb3VudDsKLQkJCWlmIChkYi0+bGVuIC0gb3V0IDwgMjAwKQorCQkJaWYgKGxlbiAtIG91dCA8IDIwMCkKIAkJCQljb250aW51ZTsKLQkJCW91dCArPSBkdW1wX21sZShtbGUsIGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQpOworCQkJb3V0ICs9IGR1bXBfbWxlKG1sZSwgYnVmICsgb3V0LCBsZW4gLSBvdXQpOwogCQl9CiAJCWxvbmdlc3QgPSBtYXgobG9uZ2VzdCwgYnVja2V0X2NvdW50KTsKIAkJYnVja2V0X2NvdW50ID0gMDsKIAl9CiAJc3Bpbl91bmxvY2soJmRsbS0+bWFzdGVyX2xvY2spOwogCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIlRvdGFsOiAlbGQsIExvbmdlc3Q6ICVsZFxuIiwgdG90YWwsIGxvbmdlc3QpOwogCXJldHVybiBvdXQ7CiB9CkBAIC01MjMsMTUgKzQ3NywxNSBAQAogc3RhdGljIGludCBkZWJ1Z19tbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGI7CisJY2hhciAqYnVmID0gTlVMTDsKIAotCWRiID0gZGVidWdfYnVmZmVyX2FsbG9jYXRlKCk7Ci0JaWYgKCFkYikKKwlidWYgPSAoY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX05PRlMpOworCWlmICghYnVmKQogCQlnb3RvIGJhaWw7CiAKLQlkYi0+bGVuID0gZGVidWdfbWxlX3ByaW50KGRsbSwgZGIpOworCWlfc2l6ZV93cml0ZShpbm9kZSwgZGVidWdfbWxlX3ByaW50KGRsbSwgYnVmLCBQQUdFX1NJWkUgLSAxKSk7CiAKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBidWY7CiAKIAlyZXR1cm4gMDsKIGJhaWw6CkBAIC01NDAsOSArNDk0LDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfbWxlX2ZvcHMgPSB7CiAJLm9wZW4gPQkJZGVidWdfbWxlX29wZW4sCi0JLnJlbGVhc2UgPQlkZWJ1Z19idWZmZXJfcmVsZWFzZSwKLQkucmVhZCA9CQlkZWJ1Z19idWZmZXJfcmVhZCwKLQkubGxzZWVrID0JZGVidWdfYnVmZmVyX2xsc2VlaywKKwkucmVsZWFzZSA9CWRlYnVnX3JlbGVhc2UsCisJLnJlYWQgPQkJZGVidWdfcmVhZCwKKwkubGxzZWVrID0JZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKIC8qIGVuZCAtIGRlYnVnIG1sZSBmdW5jcyAqLwpAQCAtNzU3LDcgKzcxMSw3IEBACiAvKiBlbmQgLSBkZWJ1ZyBsb2NrcmVzIGZ1bmNzICovCiAKIC8qIGJlZ2luIC0gZGVidWcgc3RhdGUgZnVuY3MgKi8KLXN0YXRpYyBpbnQgZGVidWdfc3RhdGVfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiKQorc3RhdGljIGludCBkZWJ1Z19zdGF0ZV9wcmludChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgY2hhciAqYnVmLCBpbnQgbGVuKQogewogCWludCBvdXQgPSAwOwogCXN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEgKm5vZGU7CkBAIC03ODEsMzUgKzczNSwzNSBAQAogCX0KIAogCS8qIERvbWFpbjogeHh4eHh4eHh4eCAgS2V5OiAweGRmYmFjNzY5ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIkRvbWFpbjogJXMgIEtleTogMHglMDh4ICBQcm90b2NvbDogJWQuJWRcbiIsCiAJCQlkbG0tPm5hbWUsIGRsbS0+a2V5LCBkbG0tPmRsbV9sb2NraW5nX3Byb3RvLnB2X21ham9yLAogCQkJZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9taW5vcik7CiAKIAkvKiBUaHJlYWQgUGlkOiB4eHggIE5vZGU6IHh4eCAgU3RhdGU6IHh4eHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIlRocmVhZCBQaWQ6ICVkICBOb2RlOiAlZCAgU3RhdGU6ICVzXG4iLAotCQkJZGxtLT5kbG1fdGhyZWFkX3Rhc2stPnBpZCwgZGxtLT5ub2RlX251bSwgc3RhdGUpOworCQkJdGFza19waWRfbnIoZGxtLT5kbG1fdGhyZWFkX3Rhc2spLCBkbG0tPm5vZGVfbnVtLCBzdGF0ZSk7CiAKIAkvKiBOdW1iZXIgb2YgSm9pbnM6IHh4eCAgSm9pbmluZyBOb2RlOiB4eHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiTnVtYmVyIG9mIEpvaW5zOiAlZCAgSm9pbmluZyBOb2RlOiAlZFxuIiwKIAkJCWRsbS0+bnVtX2pvaW5zLCBkbG0tPmpvaW5pbmdfbm9kZSk7CiAKIAkvKiBEb21haW4gTWFwOiB4eCB4eCB4eCAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiRG9tYWluIE1hcDogIik7CisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiRG9tYWluIE1hcDogIik7CiAJb3V0ICs9IHN0cmluZ2lmeV9ub2RlbWFwKGRsbS0+ZG9tYWluX21hcCwgTzJOTV9NQVhfTk9ERVMsCi0JCQkJIGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQpOwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiXG4iKTsKKwkJCQkgYnVmICsgb3V0LCBsZW4gLSBvdXQpOworCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIlxuIik7CiAKIAkvKiBMaXZlIE1hcDogeHggeHggeHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIkxpdmUgTWFwOiAiKTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJMaXZlIE1hcDogIik7CiAJb3V0ICs9IHN0cmluZ2lmeV9ub2RlbWFwKGRsbS0+bGl2ZV9ub2Rlc19tYXAsIE8yTk1fTUFYX05PREVTLAotCQkJCSBkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0KTsKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlxuIik7CisJCQkJIGJ1ZiArIG91dCwgbGVuIC0gb3V0KTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJcbiIpOwogCiAJLyogTG9jayBSZXNvdXJjZXM6IHh4eCAoeHh4KSAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJMb2NrIFJlc291cmNlczogJWQgKCVkKVxuIiwKIAkJCWF0b21pY19yZWFkKCZkbG0tPnJlc19jdXJfY291bnQpLAogCQkJYXRvbWljX3JlYWQoJmRsbS0+cmVzX3RvdF9jb3VudCkpOwpAQCAtODIxLDI5ICs3NzUsMjkgQEAKIAkJY3VyX21sZXMgKz0gYXRvbWljX3JlYWQoJmRsbS0+bWxlX2N1cl9jb3VudFtpXSk7CiAKIAkvKiBNTEVzOiB4eHggKHh4eCkgKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiTUxFczogJWQgKCVkKVxuIiwgY3VyX21sZXMsIHRvdF9tbGVzKTsKIAogCS8qICBCbG9ja2luZzogeHh4ICh4eHgpICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIiAgQmxvY2tpbmc6ICVkICglZClcbiIsCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5tbGVfY3VyX2NvdW50W0RMTV9NTEVfQkxPQ0tdKSwKIAkJCWF0b21pY19yZWFkKCZkbG0tPm1sZV90b3RfY291bnRbRExNX01MRV9CTE9DS10pKTsKIAogCS8qICBNYXN0ZXJ5OiB4eHggKHh4eCkgKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiICBNYXN0ZXJ5OiAlZCAoJWQpXG4iLAogCQkJYXRvbWljX3JlYWQoJmRsbS0+bWxlX2N1cl9jb3VudFtETE1fTUxFX01BU1RFUl0pLAogCQkJYXRvbWljX3JlYWQoJmRsbS0+bWxlX3RvdF9jb3VudFtETE1fTUxFX01BU1RFUl0pKTsKIAogCS8qICBNaWdyYXRpb246IHh4eCAoeHh4KSAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSIgIE1pZ3JhdGlvbjogJWQgKCVkKVxuIiwKIAkJCWF0b21pY19yZWFkKCZkbG0tPm1sZV9jdXJfY291bnRbRExNX01MRV9NSUdSQVRJT05dKSwKIAkJCWF0b21pY19yZWFkKCZkbG0tPm1sZV90b3RfY291bnRbRExNX01MRV9NSUdSQVRJT05dKSk7CiAKIAkvKiBMaXN0czogRGlydHk9RW1wdHkgIFB1cmdlPUluVXNlICBQZW5kaW5nQVNUcz1FbXB0eSAgLi4uICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIkxpc3RzOiBEaXJ0eT0lcyAgUHVyZ2U9JXMgIFBlbmRpbmdBU1RzPSVzICAiCiAJCQkiUGVuZGluZ0JBU1RzPSVzXG4iLAogCQkJKGxpc3RfZW1wdHkoJmRsbS0+ZGlydHlfbGlzdCkgPyAiRW1wdHkiIDogIkluVXNlIiksCkBAIC04NTIsMTIgKzgwNiwxMiBAQAogCQkJKGxpc3RfZW1wdHkoJmRsbS0+cGVuZGluZ19iYXN0cykgPyAiRW1wdHkiIDogIkluVXNlIikpOwogCiAJLyogUHVyZ2UgQ291bnQ6IHh4eCAgUmVmczogeHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIlB1cmdlIENvdW50OiAlZCAgUmVmczogJWRcbiIsIGRsbS0+cHVyZ2VfY291bnQsCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5kbG1fcmVmcy5yZWZjb3VudCkpOwogCiAJLyogRGVhZCBOb2RlOiB4eHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiRGVhZCBOb2RlOiAlZFxuIiwgZGxtLT5yZWNvLmRlYWRfbm9kZSk7CiAKIAkvKiBXaGF0IGFib3V0IERMTV9SRUNPX1NUQVRFX0ZJTkFMSVpFPyAqLwpAQCAtODY3LDE5ICs4MjEsMTkgQEAKIAkJc3RhdGUgPSAiSU5BQ1RJVkUiOwogCiAJLyogUmVjb3ZlcnkgUGlkOiB4eHh4ICBNYXN0ZXI6IHh4eCAgU3RhdGU6IHh4eHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiUmVjb3ZlcnkgUGlkOiAlZCAgTWFzdGVyOiAlZCAgU3RhdGU6ICVzXG4iLAotCQkJZGxtLT5kbG1fcmVjb190aHJlYWRfdGFzay0+cGlkLAorCQkJdGFza19waWRfbnIoZGxtLT5kbG1fcmVjb190aHJlYWRfdGFzayksCiAJCQlkbG0tPnJlY28ubmV3X21hc3Rlciwgc3RhdGUpOwogCiAJLyogUmVjb3ZlcnkgTWFwOiB4eCB4eCAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiUmVjb3ZlcnkgTWFwOiAiKTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJSZWNvdmVyeSBNYXA6ICIpOwogCW91dCArPSBzdHJpbmdpZnlfbm9kZW1hcChkbG0tPnJlY292ZXJ5X21hcCwgTzJOTV9NQVhfTk9ERVMsCi0JCQkJIGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQpOwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiXG4iKTsKKwkJCQkgYnVmICsgb3V0LCBsZW4gLSBvdXQpOworCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIlxuIik7CiAKIAkvKiBSZWNvdmVyeSBOb2RlIFN0YXRlOiAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiUmVjb3ZlcnkgTm9kZSBTdGF0ZTpcbiIpOworCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIlJlY292ZXJ5IE5vZGUgU3RhdGU6XG4iKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCXN3aXRjaCAobm9kZS0+c3RhdGUpIHsKIAkJY2FzZSBETE1fUkVDT19OT0RFX0RBVEFfSU5JVDoKQEAgLTkwNyw3ICs4NjEsNyBAQAogCQkJc3RhdGUgPSAiQkFEIjsKIAkJCWJyZWFrOwogCQl9Ci0JCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LCAiXHQldSAtICVzXG4iLAorCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJcdCV1IC0gJXNcbiIsCiAJCQkJbm9kZS0+bm9kZV9udW0sIHN0YXRlKTsKIAl9CiAKQEAgLTkxOSwxNSArODczLDE1IEBACiBzdGF0aWMgaW50IGRlYnVnX3N0YXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG0gPSBpbm9kZS0+aV9wcml2YXRlOwotCXN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiID0gTlVMTDsKKwljaGFyICpidWYgPSBOVUxMOwogCi0JZGIgPSBkZWJ1Z19idWZmZXJfYWxsb2NhdGUoKTsKLQlpZiAoIWRiKQorCWJ1ZiA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfTk9GUyk7CisJaWYgKCFidWYpCiAJCWdvdG8gYmFpbDsKIAotCWRiLT5sZW4gPSBkZWJ1Z19zdGF0ZV9wcmludChkbG0sIGRiKTsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGRlYnVnX3N0YXRlX3ByaW50KGRsbSwgYnVmLCBQQUdFX1NJWkUgLSAxKSk7CiAKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBidWY7CiAKIAlyZXR1cm4gMDsKIGJhaWw6CkBAIC05MzYsOSArODkwLDkgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfc3RhdGVfZm9wcyA9IHsKIAkub3BlbiA9CQlkZWJ1Z19zdGF0ZV9vcGVuLAotCS5yZWxlYXNlID0JZGVidWdfYnVmZmVyX3JlbGVhc2UsCi0JLnJlYWQgPQkJZGVidWdfYnVmZmVyX3JlYWQsCi0JLmxsc2VlayA9CWRlYnVnX2J1ZmZlcl9sbHNlZWssCisJLnJlbGVhc2UgPQlkZWJ1Z19yZWxlYXNlLAorCS5yZWFkID0JCWRlYnVnX3JlYWQsCisJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogLyogZW5kICAtIGRlYnVnIHN0YXRlIGZ1bmNzICovCiAKQEAgLTEwMDIsMTQgKzk1NiwxMCBAQAogCXN0cnVjdCBkbG1fZGVidWdfY3R4dCAqZGMgPSBkbG0tPmRsbV9kZWJ1Z19jdHh0OwogCiAJaWYgKGRjKSB7Ci0JCWlmIChkYy0+ZGVidWdfcHVyZ2VsaXN0X2RlbnRyeSkKLQkJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19wdXJnZWxpc3RfZGVudHJ5KTsKLQkJaWYgKGRjLT5kZWJ1Z19tbGVfZGVudHJ5KQotCQkJZGVidWdmc19yZW1vdmUoZGMtPmRlYnVnX21sZV9kZW50cnkpOwotCQlpZiAoZGMtPmRlYnVnX2xvY2tyZXNfZGVudHJ5KQotCQkJZGVidWdmc19yZW1vdmUoZGMtPmRlYnVnX2xvY2tyZXNfZGVudHJ5KTsKLQkJaWYgKGRjLT5kZWJ1Z19zdGF0ZV9kZW50cnkpCi0JCQlkZWJ1Z2ZzX3JlbW92ZShkYy0+ZGVidWdfc3RhdGVfZGVudHJ5KTsKKwkJZGVidWdmc19yZW1vdmUoZGMtPmRlYnVnX3B1cmdlbGlzdF9kZW50cnkpOworCQlkZWJ1Z2ZzX3JlbW92ZShkYy0+ZGVidWdfbWxlX2RlbnRyeSk7CisJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19sb2NrcmVzX2RlbnRyeSk7CisJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19zdGF0ZV9kZW50cnkpOwogCQlkbG1fZGVidWdfcHV0KGRjKTsKIAl9CiB9CkBAIC0xMDQwLDggKzk5MCw3IEBACiAKIHZvaWQgZGxtX2Rlc3Ryb3lfZGVidWdmc19zdWJyb290KHN0cnVjdCBkbG1fY3R4dCAqZGxtKQogewotCWlmIChkbG0tPmRsbV9kZWJ1Z2ZzX3N1YnJvb3QpCi0JCWRlYnVnZnNfcmVtb3ZlKGRsbS0+ZGxtX2RlYnVnZnNfc3Vicm9vdCk7CisJZGVidWdmc19yZW1vdmUoZGxtLT5kbG1fZGVidWdmc19zdWJyb290KTsKIH0KIAogLyogZGVidWdmcyByb290ICovCkBAIC0xMDU3LDcgKzEwMDYsNiBAQAogCiB2b2lkIGRsbV9kZXN0cm95X2RlYnVnZnNfcm9vdCh2b2lkKQogewotCWlmIChkbG1fZGVidWdmc19yb290KQotCQlkZWJ1Z2ZzX3JlbW92ZShkbG1fZGVidWdmc19yb290KTsKKwlkZWJ1Z2ZzX3JlbW92ZShkbG1fZGVidWdmc19yb290KTsKIH0KICNlbmRpZgkvKiBDT05GSUdfREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5oIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmgKaW5kZXggOGM2ODZkMi4uMWYyN2M0OCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmgKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmgKQEAgLTM3LDExICszNyw2IEBACiAJc3RydWN0IGRlbnRyeSAqZGVidWdfcHVyZ2VsaXN0X2RlbnRyeTsKIH07CiAKLXN0cnVjdCBkZWJ1Z19idWZmZXIgewotCWludCBsZW47Ci0JY2hhciAqYnVmOwotfTsKLQogc3RydWN0IGRlYnVnX2xvY2tyZXMgewogCWludCBkbF9sZW47CiAJY2hhciAqZGxfYnVmOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCmluZGV4IGNjMmFhYTkuLjdlMzhhMDcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKQEAgLTQ2MCw4ICs0NjAsNiBAQAogCQl9CiAJCWNvbmRfcmVzY2hlZF9sb2NrKCZkbG0tPnNwaW5sb2NrKTsKIAkJbnVtICs9IG47Ci0JCW1sb2coMCwgIiVzOiB0b3VjaGVkICVkIGxvY2tyZXNlcyBpbiBidWNrZXQgJWQgIgotCQkgICAgICIodG90PSVkKVxuIiwgZGxtLT5uYW1lLCBuLCBpLCBudW0pOwogCX0KIAlzcGluX3VubG9jaygmZGxtLT5zcGlubG9jayk7CiAJd2FrZV91cCgmZGxtLT5kbG1fdGhyZWFkX3dxKTsKQEAgLTE2NjEsOCArMTY1OSw4IEBACiAKIHN0YXRpYyB2b2lkIGRsbV91bnJlZ2lzdGVyX2RvbWFpbl9oYW5kbGVycyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX3VwKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhkbG0tPm5hbWUsICZkbG0tPmRsbV9oYl91cCk7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKGRsbS0+bmFtZSwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCW8ybmV0X3VucmVnaXN0ZXJfaGFuZGxlcl9saXN0KCZkbG0tPmRsbV9kb21haW5faGFuZGxlcnMpOwogfQogCkBAIC0xNjc0LDEzICsxNjcyLDEzIEBACiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl9kb3duLCBPMkhCX05PREVfRE9XTl9DQiwKIAkJCSAgICBkbG1faGJfbm9kZV9kb3duX2NiLCBkbG0sIERMTV9IQl9OT0RFX0RPV05fUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKGRsbS0+bmFtZSwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gYmFpbDsKIAogCW8yaGJfc2V0dXBfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX3VwLCBPMkhCX05PREVfVVBfQ0IsCiAJCQkgICAgZGxtX2hiX25vZGVfdXBfY2IsIGRsbSwgRExNX0hCX05PREVfVVBfUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl91cCk7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhkbG0tPm5hbWUsICZkbG0tPmRsbV9oYl91cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBiYWlsOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jIGIvZnMvb2NmczIvZGxtL2RsbWxvY2suYwppbmRleCA2OWNmMzY5Li43MDA5MjkyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1sb2NrLmMKQEAgLTEwNiw2ICsxMDYsOSBAQAogCiAJCWlmICghZGxtX2xvY2tfY29tcGF0aWJsZSh0bXBsb2NrLT5tbC50eXBlLCBsb2NrLT5tbC50eXBlKSkKIAkJCXJldHVybiAwOworCQlpZiAoIWRsbV9sb2NrX2NvbXBhdGlibGUodG1wbG9jay0+bWwuY29udmVydF90eXBlLAorCQkJCQkgbG9jay0+bWwudHlwZSkpCisJCQlyZXR1cm4gMDsKIAl9CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYyBiL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYwppbmRleCAyMjExYWNmLi4xZDZkMWQyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCkBAIC0xMjIsMTUgKzEyMiwxMyBAQAogdm9pZCBfX2RsbV9sb2NrcmVzX2NhbGNfdXNhZ2Uoc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQltbG9nX2VudHJ5KCIlLipzXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKLQogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5zcGlubG9jayk7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKIAogCWlmIChfX2RsbV9sb2NrcmVzX3VudXNlZChyZXMpKXsKIAkJaWYgKGxpc3RfZW1wdHkoJnJlcy0+cHVyZ2UpKSB7Ci0JCQltbG9nKDAsICJwdXR0aW5nIGxvY2tyZXMgJS4qczolcCBvbnRvIHB1cmdlIGxpc3RcbiIsCi0JCQkgICAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIHJlcyk7CisJCQltbG9nKDAsICIlczogQWRkaW5nIHJlcyAlLipzIHRvIHB1cmdlIGxpc3RcbiIsCisJCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAKIAkJCXJlcy0+bGFzdF91c2VkID0gamlmZmllczsKIAkJCWRsbV9sb2NrcmVzX2dldChyZXMpOwpAQCAtMTM4LDggKzEzNiw4IEBACiAJCQlkbG0tPnB1cmdlX2NvdW50Kys7CiAJCX0KIAl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZyZXMtPnB1cmdlKSkgewotCQltbG9nKDAsICJyZW1vdmluZyBsb2NrcmVzICUuKnM6JXAgZnJvbSBwdXJnZSBsaXN0LCBvd25lcj0ldVxuIiwKLQkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCByZXMsIHJlcy0+b3duZXIpOworCQltbG9nKDAsICIlczogUmVtb3ZpbmcgcmVzICUuKnMgZnJvbSBwdXJnZSBsaXN0XG4iLAorCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAKIAkJbGlzdF9kZWxfaW5pdCgmcmVzLT5wdXJnZSk7CiAJCWRsbV9sb2NrcmVzX3B1dChyZXMpOwpAQCAtMTUwLDcgKzE0OCw2IEBACiB2b2lkIGRsbV9sb2NrcmVzX2NhbGNfdXNhZ2Uoc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7Ci0JbWxvZ19lbnRyeSgiJS4qc1xuIiwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJc3Bpbl9sb2NrKCZkbG0tPnNwaW5sb2NrKTsKIAlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCkBAIC0xNzEsOSArMTY4LDggQEAKIAogCW1hc3RlciA9IChyZXMtPm93bmVyID09IGRsbS0+bm9kZV9udW0pOwogCi0KLQltbG9nKDAsICJwdXJnaW5nIGxvY2tyZXMgJS4qcywgbWFzdGVyID0gJWRcbiIsIHJlcy0+bG9ja25hbWUubGVuLAotCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lLCBtYXN0ZXIpOworCW1sb2coMCwgIiVzOiBQdXJnaW5nIHJlcyAlLipzLCBtYXN0ZXIgJWRcbiIsIGRsbS0+bmFtZSwKKwkgICAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIG1hc3Rlcik7CiAKIAlpZiAoIW1hc3RlcikgewogCQlyZXMtPnN0YXRlIHw9IERMTV9MT0NLX1JFU19EUk9QUElOR19SRUY7CkBAIC0xODksMjcgKzE4NSwyNSBAQAogCQkvKiBjbGVhciBvdXIgYml0IGZyb20gdGhlIG1hc3RlcidzIHJlZm1hcCwgaWdub3JlIGVycm9ycyAqLwogCQlyZXQgPSBkbG1fZHJvcF9sb2NrcmVzX3JlZihkbG0sIHJlcyk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7CisJCQltbG9nKE1MX0VSUk9SLCAiJXM6IGRlcmVmICUuKnMgZmFpbGVkICVkXG4iLCBkbG0tPm5hbWUsCisJCQkgICAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIHJldCk7CiAJCQlpZiAoIWRsbV9pc19ob3N0X2Rvd24ocmV0KSkKIAkJCQlCVUcoKTsKIAkJfQotCQltbG9nKDAsICIlczolLipzOiBkbG1fZGVyZWZfbG9ja3JlcyByZXR1cm5lZCAlZFxuIiwKLQkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIHJldCk7CiAJCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7CiAJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZyZXMtPnB1cmdlKSkgewotCQltbG9nKDAsICJyZW1vdmluZyBsb2NrcmVzICUuKnM6JXAgZnJvbSBwdXJnZWxpc3QsICIKLQkJICAgICAibWFzdGVyID0gJWRcbiIsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCi0JCSAgICAgcmVzLCBtYXN0ZXIpOworCQltbG9nKDAsICIlczogUmVtb3ZpbmcgcmVzICUuKnMgZnJvbSBwdXJnZWxpc3QsIG1hc3RlciAlZFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIG1hc3Rlcik7CiAJCWxpc3RfZGVsX2luaXQoJnJlcy0+cHVyZ2UpOwogCQlkbG1fbG9ja3Jlc19wdXQocmVzKTsKIAkJZGxtLT5wdXJnZV9jb3VudC0tOwogCX0KIAogCWlmICghX19kbG1fbG9ja3Jlc191bnVzZWQocmVzKSkgewotCQltbG9nKE1MX0VSUk9SLCAiZm91bmQgbG9ja3JlcyAlczolLipzOiBpbiB1c2UgYWZ0ZXIgZGVyZWZcbiIsCisJCW1sb2coTUxfRVJST1IsICIlczogcmVzICUuKnMgaW4gdXNlIGFmdGVyIGRlcmVmXG4iLAogCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJCV9fZGxtX3ByaW50X29uZV9sb2NrX3Jlc291cmNlKHJlcyk7CiAJCUJVRygpOwpAQCAtMjY2LDEwICsyNjAsMTAgQEAKIAkJdW51c2VkID0gX19kbG1fbG9ja3Jlc191bnVzZWQobG9ja3Jlcyk7CiAJCWlmICghdW51c2VkIHx8CiAJCSAgICAobG9ja3Jlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfTUlHUkFUSU5HKSkgewotCQkJbWxvZygwLCAibG9ja3JlcyAlczolLipzOiBpcyBpbiB1c2Ugb3IgIgotCQkJICAgICAiYmVpbmcgcmVtYXN0ZXJlZCwgdXNlZCAlZCwgc3RhdGUgJWRcbiIsCi0JCQkgICAgIGRsbS0+bmFtZSwgbG9ja3Jlcy0+bG9ja25hbWUubGVuLAotCQkJICAgICBsb2NrcmVzLT5sb2NrbmFtZS5uYW1lLCAhdW51c2VkLCBsb2NrcmVzLT5zdGF0ZSk7CisJCQltbG9nKDAsICIlczogcmVzICUuKnMgaXMgaW4gdXNlIG9yIGJlaW5nIHJlbWFzdGVyZWQsICIKKwkJCSAgICAgInVzZWQgJWQsIHN0YXRlICVkXG4iLCBkbG0tPm5hbWUsCisJCQkgICAgIGxvY2tyZXMtPmxvY2tuYW1lLmxlbiwgbG9ja3Jlcy0+bG9ja25hbWUubmFtZSwKKwkJCSAgICAgIXVudXNlZCwgbG9ja3Jlcy0+c3RhdGUpOwogCQkJbGlzdF9tb3ZlX3RhaWwoJmRsbS0+cHVyZ2VfbGlzdCwgJmxvY2tyZXMtPnB1cmdlKTsKIAkJCXNwaW5fdW5sb2NrKCZsb2NrcmVzLT5zcGlubG9jayk7CiAJCQljb250aW51ZTsKQEAgLTI5NiwxNSArMjkwLDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgY2FuX2dyYW50ID0gMTsKIAotCS8vbWxvZygwLCAicmVzLT5sb2NrbmFtZS5sZW49JWRcbiIsIHJlcy0+bG9ja25hbWUubGVuKTsKLQkvL21sb2coMCwgInJlcy0+bG9ja25hbWUubmFtZT0lcFxuIiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKLQkvL21sb2coMCwgInNodWZmbGUgcmVzICUuKnNcbiIsIHJlcy0+bG9ja25hbWUubGVuLAotCS8vCSAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKLQotCS8qIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbG9ja3JlcworCS8qCisJICogQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBsb2NrcmVzCiAJICogc3BpbmxvY2ssIGFuZCBiZWNhdXNlIHdlIGtub3cgdGhhdCBpdCBpcyBub3QgbWlncmF0aW5nLwogCSAqIHJlY292ZXJpbmcvaW4tcHJvZ3Jlc3MsIGl0IGlzIGZpbmUgdG8gcmVzZXJ2ZSBhc3RzIGFuZAotCSAqIGJhc3RzIHJpZ2h0IGJlZm9yZSBxdWV1ZWluZyB0aGVtIGFsbCB0aHJvdWdob3V0ICovCisJICogYmFzdHMgcmlnaHQgYmVmb3JlIHF1ZXVlaW5nIHRoZW0gYWxsIHRocm91Z2hvdXQKKwkgKi8KIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+YXN0X2xvY2spOwogCWFzc2VydF9zcGluX2xvY2tlZCgmcmVzLT5zcGlubG9jayk7CiAJQlVHX09OKChyZXMtPnN0YXRlICYgKERMTV9MT0NLX1JFU19NSUdSQVRJTkd8CkBAIC0zMTQsMTMgKzMwNSwxMyBAQAogY29udmVydGluZzoKIAlpZiAobGlzdF9lbXB0eSgmcmVzLT5jb252ZXJ0aW5nKSkKIAkJZ290byBibG9ja2VkOwotCW1sb2coMCwgInJlcyAlLipzIGhhcyBsb2NrcyBvbiBhIGNvbnZlcnQgcXVldWVcbiIsIHJlcy0+bG9ja25hbWUubGVuLAotCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKKwltbG9nKDAsICIlczogcmVzICUuKnMgaGFzIGxvY2tzIG9uIHRoZSBjb252ZXJ0IHF1ZXVlXG4iLCBkbG0tPm5hbWUsCisJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAogCXRhcmdldCA9IGxpc3RfZW50cnkocmVzLT5jb252ZXJ0aW5nLm5leHQsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CiAJaWYgKHRhcmdldC0+bWwuY29udmVydF90eXBlID09IExLTV9JVk1PREUpIHsKLQkJbWxvZyhNTF9FUlJPUiwgIiUuKnM6IGNvbnZlcnRpbmcgYSBsb2NrIHdpdGggbm8gIgotCQkgICAgICJjb252ZXJ0X3R5cGUhXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKKwkJbWxvZyhNTF9FUlJPUiwgIiVzOiByZXMgJS4qcyBjb252ZXJ0aW5nIGxvY2sgdG8gaW52YWxpZCBtb2RlXG4iLAorCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJCUJVRygpOwogCX0KIAloZWFkID0gJnJlcy0+Z3JhbnRlZDsKQEAgLTM2NSw5ICszNTYsMTIgQEAKIAkJc3Bpbl9sb2NrKCZ0YXJnZXQtPnNwaW5sb2NrKTsKIAkJQlVHX09OKHRhcmdldC0+bWwuaGlnaGVzdF9ibG9ja2VkICE9IExLTV9JVk1PREUpOwogCi0JCW1sb2coMCwgImNhbGxpbmcgYXN0IGZvciBjb252ZXJ0aW5nIGxvY2s6ICUuKnMsIGhhdmU6ICVkLCAiCi0JCSAgICAgImdyYW50aW5nOiAlZCwgbm9kZTogJXVcbiIsIHJlcy0+bG9ja25hbWUubGVuLAotCQkgICAgIHJlcy0+bG9ja25hbWUubmFtZSwgdGFyZ2V0LT5tbC50eXBlLAorCQltbG9nKDAsICIlczogcmVzICUuKnMsIEFTVCBmb3IgQ29udmVydGluZyBsb2NrICV1OiVsbHUsIHR5cGUgIgorCQkgICAgICIlZCA9PiAlZCwgbm9kZSAldVxuIiwgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwKKwkJICAgICByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KHRhcmdldC0+bWwuY29va2llKSksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUodGFyZ2V0LT5tbC5jb29raWUpKSwKKwkJICAgICB0YXJnZXQtPm1sLnR5cGUsCiAJCSAgICAgdGFyZ2V0LT5tbC5jb252ZXJ0X3R5cGUsIHRhcmdldC0+bWwubm9kZSk7CiAKIAkJdGFyZ2V0LT5tbC50eXBlID0gdGFyZ2V0LT5tbC5jb252ZXJ0X3R5cGU7CkBAIC00MjgsMTEgKzQyMiwxNCBAQAogCQlzcGluX2xvY2soJnRhcmdldC0+c3BpbmxvY2spOwogCQlCVUdfT04odGFyZ2V0LT5tbC5oaWdoZXN0X2Jsb2NrZWQgIT0gTEtNX0lWTU9ERSk7CiAKLQkJbWxvZygwLCAiY2FsbGluZyBhc3QgZm9yIGJsb2NrZWQgbG9jazogJS4qcywgZ3JhbnRpbmc6ICVkLCAiCi0JCSAgICAgIm5vZGU6ICV1XG4iLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQltbG9nKDAsICIlczogcmVzICUuKnMsIEFTVCBmb3IgQmxvY2tlZCBsb2NrICV1OiVsbHUsIHR5cGUgJWQsICIKKwkJICAgICAibm9kZSAldVxuIiwgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwKKwkJICAgICByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KHRhcmdldC0+bWwuY29va2llKSksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUodGFyZ2V0LT5tbC5jb29raWUpKSwKIAkJICAgICB0YXJnZXQtPm1sLnR5cGUsIHRhcmdldC0+bWwubm9kZSk7CiAKLQkJLy8gdGFyZ2V0LT5tbC50eXBlIGlzIGFscmVhZHkgY29ycmVjdAorCQkvKiB0YXJnZXQtPm1sLnR5cGUgaXMgYWxyZWFkeSBjb3JyZWN0ICovCiAJCWxpc3RfbW92ZV90YWlsKCZ0YXJnZXQtPmxpc3QsICZyZXMtPmdyYW50ZWQpOwogCiAJCUJVR19PTighdGFyZ2V0LT5sa3NiKTsKQEAgLTQ1Myw3ICs0NTAsNiBAQAogLyogbXVzdCBoYXZlIE5PIGxvY2tzIHdoZW4gY2FsbGluZyB0aGlzIHdpdGggcmVzICE9TlVMTCAqICovCiB2b2lkIGRsbV9raWNrX3RocmVhZChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7Ci0JbWxvZ19lbnRyeSgiZGxtPSVwLCByZXM9JXBcbiIsIGRsbSwgcmVzKTsKIAlpZiAocmVzKSB7CiAJCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7CiAJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CkBAIC00NjYsOCArNDYyLDYgQEAKIAogdm9pZCBfX2RsbV9kaXJ0eV9sb2NrcmVzKHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQltbG9nX2VudHJ5KCJkbG09JXAsIHJlcz0lcFxuIiwgZGxtLCByZXMpOwotCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPnNwaW5sb2NrKTsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCkBAIC00ODQsMTMgKzQ3OCwxNiBAQAogCQkJcmVzLT5zdGF0ZSB8PSBETE1fTE9DS19SRVNfRElSVFk7CiAJCX0KIAl9CisKKwltbG9nKDAsICIlczogcmVzICUuKnNcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJICAgICByZXMtPmxvY2tuYW1lLm5hbWUpOwogfQogCiAKIC8qIExhdW5jaCB0aGUgTk0gdGhyZWFkIGZvciB0aGUgbW91bnRlZCB2b2x1bWUgKi8KIGludCBkbG1fbGF1bmNoX3RocmVhZChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKLQltbG9nKDAsICJzdGFydGluZyBkbG0gdGhyZWFkLi4uXG4iKTsKKwltbG9nKDAsICJTdGFydGluZyBkbG1fdGhyZWFkLi4uXG4iKTsKIAogCWRsbS0+ZGxtX3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oZGxtX3RocmVhZCwgZGxtLCAiZGxtX3RocmVhZCIpOwogCWlmIChJU19FUlIoZGxtLT5kbG1fdGhyZWFkX3Rhc2spKSB7CkBAIC01MDUsNyArNTAyLDcgQEAKIHZvaWQgZGxtX2NvbXBsZXRlX3RocmVhZChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKIAlpZiAoZGxtLT5kbG1fdGhyZWFkX3Rhc2spIHsKLQkJbWxvZyhNTF9LVEhSRUFELCAid2FpdGluZyBmb3IgZGxtIHRocmVhZCB0byBleGl0XG4iKTsKKwkJbWxvZyhNTF9LVEhSRUFELCAiV2FpdGluZyBmb3IgZGxtIHRocmVhZCB0byBleGl0XG4iKTsKIAkJa3RocmVhZF9zdG9wKGRsbS0+ZGxtX3RocmVhZF90YXNrKTsKIAkJZGxtLT5kbG1fdGhyZWFkX3Rhc2sgPSBOVUxMOwogCX0KQEAgLTUzNiw3ICs1MzMsMTIgQEAKIAkJLyogZ2V0IGFuIGV4dHJhIHJlZiBvbiBsb2NrICovCiAJCWRsbV9sb2NrX2dldChsb2NrKTsKIAkJcmVzID0gbG9jay0+bG9ja3JlczsKLQkJbWxvZygwLCAiZGVsaXZlcmluZyBhbiBhc3QgZm9yIHRoaXMgbG9ja3Jlc1xuIik7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgRmx1c2ggQVNUIGZvciBsb2NrICV1OiVsbHUsIHR5cGUgJWQsICIKKwkJICAgICAibm9kZSAldVxuIiwgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwKKwkJICAgICByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGxvY2stPm1sLnR5cGUsIGxvY2stPm1sLm5vZGUpOwogCiAJCUJVR19PTighbG9jay0+YXN0X3BlbmRpbmcpOwogCkBAIC01NTcsOSArNTU5LDkgQEAKIAkJLyogcG9zc2libGUgdGhhdCBhbm90aGVyIGFzdCB3YXMgcXVldWVkIHdoaWxlCiAJCSAqIHdlIHdlcmUgZGVsaXZlcmluZyB0aGUgbGFzdCBvbmUgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT5hc3RfbGlzdCkpIHsKLQkJCW1sb2coMCwgImFoYSBhbm90aGVyIGFzdCBnb3QgcXVldWVkIHdoaWxlICIKLQkJCSAgICAgIndlIHdlcmUgZmluaXNoaW5nIHRoZSBsYXN0IG9uZS4gIHdpbGwgIgotCQkJICAgICAia2VlcCB0aGUgYXN0X3BlbmRpbmcgZmxhZyBzZXQuXG4iKTsKKwkJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgQVNUIHF1ZXVlZCB3aGlsZSBmbHVzaGluZyBsYXN0ICIKKwkJCSAgICAgIm9uZVxuIiwgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwKKwkJCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAkJfSBlbHNlCiAJCQlsb2NrLT5hc3RfcGVuZGluZyA9IDA7CiAKQEAgLTU5MCw4ICs1OTIsMTIgQEAKIAkJZGxtX2xvY2tfcHV0KGxvY2spOwogCQlzcGluX3VubG9jaygmZGxtLT5hc3RfbG9jayk7CiAKLQkJbWxvZygwLCAiZGVsaXZlcmluZyBhIGJhc3QgZm9yIHRoaXMgbG9ja3JlcyAiCi0JCSAgICAgIihibG9ja2VkID0gJWRcbiIsIGhpKTsKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBGbHVzaCBCQVNUIGZvciBsb2NrICV1OiVsbHUsICIKKwkJICAgICAiYmxvY2tlZCAlZCwgbm9kZSAldVxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGhpLCBsb2NrLT5tbC5ub2RlKTsKIAogCQlpZiAobG9jay0+bWwubm9kZSAhPSBkbG0tPm5vZGVfbnVtKSB7CiAJCQlyZXQgPSBkbG1fc2VuZF9wcm94eV9iYXN0KGRsbSwgcmVzLCBsb2NrLCBoaSk7CkBAIC02MDUsOSArNjExLDkgQEAKIAkJLyogcG9zc2libGUgdGhhdCBhbm90aGVyIGJhc3Qgd2FzIHF1ZXVlZCB3aGlsZQogCQkgKiB3ZSB3ZXJlIGRlbGl2ZXJpbmcgdGhlIGxhc3Qgb25lICovCiAJCWlmICghbGlzdF9lbXB0eSgmbG9jay0+YmFzdF9saXN0KSkgewotCQkJbWxvZygwLCAiYWhhIGFub3RoZXIgYmFzdCBnb3QgcXVldWVkIHdoaWxlICIKLQkJCSAgICAgIndlIHdlcmUgZmluaXNoaW5nIHRoZSBsYXN0IG9uZS4gIHdpbGwgIgotCQkJICAgICAia2VlcCB0aGUgYmFzdF9wZW5kaW5nIGZsYWcgc2V0LlxuIik7CisJCQltbG9nKDAsICIlczogcmVzICUuKnMsIEJBU1QgcXVldWVkIHdoaWxlIGZsdXNoaW5nIGxhc3QgIgorCQkJICAgICAib25lXG4iLCBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLAorCQkJICAgICByZXMtPmxvY2tuYW1lLm5hbWUpOwogCQl9IGVsc2UKIAkJCWxvY2stPmJhc3RfcGVuZGluZyA9IDA7CiAKQEAgLTY3NSwxMSArNjgxLDEyIEBACiAJCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCQkJaWYgKHJlcy0+b3duZXIgIT0gZGxtLT5ub2RlX251bSkgewogCQkJCV9fZGxtX3ByaW50X29uZV9sb2NrX3Jlc291cmNlKHJlcyk7Ci0JCQkJbWxvZyhNTF9FUlJPUiwgImlucHJvZzolcywgbWlnOiVzLCByZWNvOiVzLCBkaXJ0eTolc1xuIiwKLQkJCQkgICAgIHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfSU5fUFJPR1JFU1MgPyAieWVzIiA6ICJubyIsCi0JCQkJICAgICByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX01JR1JBVElORyA/ICJ5ZXMiIDogIm5vIiwKLQkJCQkgICAgIHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfUkVDT1ZFUklORyA/ICJ5ZXMiIDogIm5vIiwKLQkJCQkgICAgIHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfRElSVFkgPyAieWVzIiA6ICJubyIpOworCQkJCW1sb2coTUxfRVJST1IsICIlczogaW5wcm9nICVkLCBtaWcgJWQsIHJlY28gJWQsIgorCQkJCSAgICAgIiBkaXJ0eSAlZFxuIiwgZGxtLT5uYW1lLAorCQkJCSAgICAgISEocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19JTl9QUk9HUkVTUyksCisJCQkJICAgICAhIShyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX01JR1JBVElORyksCisJCQkJICAgICAhIShyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX1JFQ09WRVJJTkcpLAorCQkJCSAgICAgISEocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19ESVJUWSkpOwogCQkJfQogCQkJQlVHX09OKHJlcy0+b3duZXIgIT0gZGxtLT5ub2RlX251bSk7CiAKQEAgLTY5Myw4ICs3MDAsOCBAQAogCQkJCXJlcy0+c3RhdGUgJj0gfkRMTV9MT0NLX1JFU19ESVJUWTsKIAkJCQlzcGluX3VubG9jaygmcmVzLT5zcGlubG9jayk7CiAJCQkJc3Bpbl91bmxvY2soJmRsbS0+YXN0X2xvY2spOwotCQkJCW1sb2coMCwgImRlbGF5aW5nIGxpc3Qgc2h1ZmZsaW5nIGZvciBpbi0iCi0JCQkJICAgICAicHJvZ3Jlc3MgbG9ja3JlcyAlLipzLCBzdGF0ZT0lZFxuIiwKKwkJCQltbG9nKDAsICIlczogcmVzICUuKnMsIGlucHJvZ3Jlc3MsIGRlbGF5IGxpc3QgIgorCQkJCSAgICAgInNodWZmbGUsIHN0YXRlICVkXG4iLCBkbG0tPm5hbWUsCiAJCQkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAogCQkJCSAgICAgcmVzLT5zdGF0ZSk7CiAJCQkJZGVsYXkgPSAxOwpAQCAtNzA2LDEwICs3MTMsNiBAQAogCQkJICogc3BpbmxvY2sgYW5kIGRvIE5PVCBoYXZlIHRoZSBkbG0gbG9jay4KIAkJCSAqIHNhZmUgdG8gcmVzZXJ2ZS9xdWV1ZSBhc3RzIGFuZCBydW4gdGhlIGxpc3RzLiAqLwogCi0JCQltbG9nKDAsICJjYWxsaW5nIGRsbV9zaHVmZmxlX2xpc3RzIHdpdGggZGxtPSVzLCAiCi0JCQkgICAgICJyZXM9JS4qc1xuIiwgZGxtLT5uYW1lLAotCQkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKLQogCQkJLyogY2FsbGVkIHdoaWxlIGhvbGRpbmcgbG9ja3JlcyBsb2NrICovCiAJCQlkbG1fc2h1ZmZsZV9saXN0cyhkbG0sIHJlcyk7CiAJCQlyZXMtPnN0YXRlICY9IH5ETE1fTE9DS19SRVNfRElSVFk7CkBAIC03MzMsNyArNzM2LDggQEAKIAkJCS8qIHVubGlrZWx5LCBidXQgd2UgbWF5IG5lZWQgdG8gZ2l2ZSB0aW1lIHRvCiAJCQkgKiBvdGhlciB0YXNrcyAqLwogCQkJaWYgKCEtLW4pIHsKLQkJCQltbG9nKDAsICJ0aHJvdHRsaW5nIGRsbV90aHJlYWRcbiIpOworCQkJCW1sb2coMCwgIiVzOiBUaHJvdHRsaW5nIGRsbSB0aHJlYWRcbiIsCisJCQkJICAgICBkbG0tPm5hbWUpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHBvcnQuYyBiL2ZzL29jZnMyL2V4cG9ydC5jCmluZGV4IDZhZGFmYTUuLjVkYmMzMDYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4cG9ydC5jCisrKyBiL2ZzL29jZnMyL2V4cG9ydC5jCkBAIC0xMzcsOSArMTM3LDcgQEAKIAl9CiAKIAlyZXN1bHQgPSBkX29idGFpbl9hbGlhcyhpbm9kZSk7Ci0JaWYgKCFJU19FUlIocmVzdWx0KSkKLQkJZF9zZXRfZF9vcChyZXN1bHQsICZvY2ZzMl9kZW50cnlfb3BzKTsKLQllbHNlCisJaWYgKElTX0VSUihyZXN1bHQpKQogCQltbG9nX2Vycm5vKFBUUl9FUlIocmVzdWx0KSk7CiAKIGJhaWw6CkBAIC0xNzUsOCArMTczLDYgQEAKIAl9CiAKIAlwYXJlbnQgPSBkX29idGFpbl9hbGlhcyhvY2ZzMl9pZ2V0KE9DRlMyX1NCKGRpci0+aV9zYiksIGJsa25vLCAwLCAwKSk7Ci0JaWYgKCFJU19FUlIocGFyZW50KSkKLQkJZF9zZXRfZF9vcChwYXJlbnQsICZvY2ZzMl9kZW50cnlfb3BzKTsKIAogYmFpbF91bmxvY2s6CiAJb2NmczJfaW5vZGVfdW5sb2NrKGRpciwgMCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggYmRhZGJhZTAuLjYzZTNmY2EgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTE5OTUsNiArMTk5NSw3IEBACiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3Ygc3I7CiAJaW50IGNoYW5nZV9zaXplID0gMTsKKwlpbnQgY21kID0gT0NGUzJfSU9DX1JFU1ZTUDY0OwogCiAJaWYgKCFvY2ZzMl93cml0ZXNfdW53cml0dGVuX2V4dGVudHMob3NiKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMjAwNSwxMiArMjAwNiwxNSBAQAogCWlmIChtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkKIAkJY2hhbmdlX3NpemUgPSAwOwogCisJaWYgKG1vZGUgJiBGQUxMT0NfRkxfUFVOQ0hfSE9MRSkKKwkJY21kID0gT0NGUzJfSU9DX1VOUkVTVlNQNjQ7CisKIAlzci5sX3doZW5jZSA9IDA7CiAJc3IubF9zdGFydCA9IChzNjQpb2Zmc2V0OwogCXNyLmxfbGVuID0gKHM2NClsZW47CiAKLQlyZXR1cm4gX19vY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShOVUxMLCBpbm9kZSwgb2Zmc2V0LAotCQkJCQkgT0NGUzJfSU9DX1JFU1ZTUDY0LCAmc3IsIGNoYW5nZV9zaXplKTsKKwlyZXR1cm4gX19vY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShOVUxMLCBpbm9kZSwgb2Zmc2V0LCBjbWQsICZzciwKKwkJCQkJIGNoYW5nZV9zaXplKTsKIH0KIAogaW50IG9jZnMyX2NoZWNrX3JhbmdlX2Zvcl9yZWZjb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvaW5vZGUuYyBiL2ZzL29jZnMyL2lub2RlLmMKaW5kZXggZjkzNWZkNi4uNDA2OGM2YyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvaW5vZGUuYworKysgYi9mcy9vY2ZzMi9pbm9kZS5jCkBAIC00MzQsNyArNDM0LDcgQEAKIAkgKiAjMSBhbmQgIzIgY2FuIGJlIHNpbXBseSBzb2x2ZWQgYnkgbmV2ZXIgdGFraW5nIHRoZSBsb2NrCiAJICogaGVyZSBmb3Igc3lzdGVtIGZpbGVzICh3aGljaCBhcmUgdGhlIG9ubHkgdHlwZSB3ZSByZWFkCiAJICogZHVyaW5nIG1vdW50KS4gSXQncyBhIGhlYXZpZXIgYXBwcm9hY2gsIGJ1dCBvdXIgbWFpbgotCSAqIGNvbmNlcm4gaXMgdXNlci1hY2Nlc2libGUgZmlsZXMgYW55d2F5LgorCSAqIGNvbmNlcm4gaXMgdXNlci1hY2Nlc3NpYmxlIGZpbGVzIGFueXdheS4KIAkgKgogCSAqICMzIHdvcmtzIGl0c2VsZiBvdXQgYmVjYXVzZSB3ZSdsbCBldmVudHVhbGx5IHRha2UgdGhlCiAJICogY2x1c3RlciBsb2NrIGJlZm9yZSB0cnVzdGluZyBhbnl0aGluZyBhbnl3YXkuCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCBkMTRjYWQ2Li44NDlmYjRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTE0Nyw3ICsxNDcsNiBAQAogCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CiAKIGJhaWxfYWRkOgotCWRfc2V0X2Rfb3AoZGVudHJ5LCAmb2NmczJfZGVudHJ5X29wcyk7CiAJcmV0ID0gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAKIAlpZiAoaW5vZGUpIHsKQEAgLTQxNSw3ICs0MTQsNiBAQAogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gbGVhdmU7CiAJfQotCWRfc2V0X2Rfb3AoZGVudHJ5LCAmb2NmczJfZGVudHJ5X29wcyk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlLAogCQkJCSBPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIHBhcmVudF9mZV9iaCwKQEAgLTc0Myw3ICs3NDEsNiBAQAogCX0KIAogCWlob2xkKGlub2RlKTsKLQlkX3NldF9kX29wKGRlbnRyeSwgJm9jZnMyX2RlbnRyeV9vcHMpOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAKIG91dF9jb21taXQ6CkBAIC0xMDE3LDggKzEwMTQsMTEgQEAKIAkJICogQW4gZXJyb3IgcmV0dXJuIG11c3QgbWVhbiB0aGF0IG5vIGNsdXN0ZXIgbG9ja3MKIAkJICogd2VyZSBoZWxkIG9uIGZ1bmN0aW9uIGV4aXQuCiAJCSAqLwotCQlpZiAob2kxLT5pcF9ibGtubyAhPSBvaTItPmlwX2Jsa25vKQorCQlpZiAob2kxLT5pcF9ibGtubyAhPSBvaTItPmlwX2Jsa25vKSB7CiAJCQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUyLCAxKTsKKwkJCWJyZWxzZSgqYmgyKTsKKwkJCSpiaDIgPSBOVUxMOworCQl9CiAKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpAQCAtMTc5NCw3ICsxNzk0LDYgQEAKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIGJhaWw7CiAJfQotCWRfc2V0X2Rfb3AoZGVudHJ5LCAmb2NmczJfZGVudHJ5X29wcyk7CiAKIAlzdGF0dXMgPSBvY2ZzMl9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlLAogCQkJCSBsZTY0X3RvX2NwdShmZS0+aV9ibGtubyksIHBhcmVudF9mZV9iaCwKQEAgLTI0NTksNyArMjQ1OCw2IEBACiAJCWdvdG8gb3V0X2NvbW1pdDsKIAl9CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgJm9jZnMyX2RlbnRyeV9vcHMpOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJc3RhdHVzID0gMDsKIG91dF9jb21taXQ6CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9vY2ZzMi5oIGIvZnMvb2NmczIvb2NmczIuaAppbmRleCA3MGRkM2IxLi41MWNkNjg5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9vY2ZzMi5oCisrKyBiL2ZzL29jZnMyL29jZnMyLmgKQEAgLTQyMCw2ICs0MjAsMTEgQEAKIAlzdHJ1Y3QgaW5vZGUJCQkqb3NiX3RsX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZAkJKm9zYl90bF9iaDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCQlvc2JfdHJ1bmNhdGVfbG9nX3dxOworCS8qCisJICogSG93IG1hbnkgY2x1c3RlcnMgaW4gb3VyIHRydW5jYXRlIGxvZy4KKwkgKiBJdCBtdXN0IGJlIHByb3RlY3RlZCBieSBvc2JfdGxfaW5vZGUtPmlfbXV0ZXguCisJICovCisJdW5zaWduZWQgaW50IHRydW5jYXRlZF9jbHVzdGVyczsKIAogCXN0cnVjdCBvY2ZzMl9ub2RlX21hcAkJb3NiX3JlY292ZXJpbmdfb3JwaGFuX2RpcnM7CiAJdW5zaWduZWQgaW50CQkJKm9zYl9vcnBoYW5fd2lwZXM7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5jIGIvZnMvb2NmczIvc3ViYWxsb2MuYwppbmRleCA1ZmVkNjBkLi43MTk5OGQ0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5jCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKQEAgLTE5MTYsNyArMTkxNiw3IEBACiAJaWYgKHJlcy0+c3JfYmdfYmxrbm8pIHsKIAkJLyogQXR0ZW1wdCB0byBzaG9ydC1jaXJjdWl0IHRoZSB1c3VhbCBzZWFyY2ggbWVjaGFuaXNtCiAJCSAqIGJ5IGp1bXBpbmcgc3RyYWlnaHQgdG8gdGhlIG1vc3QgcmVjZW50bHkgdXNlZAotCQkgKiBhbGxvY2F0aW9uIGdyb3VwLiBUaGlzIGhlbHBzIHVzIG1hbnRhaW4gc29tZQorCQkgKiBhbGxvY2F0aW9uIGdyb3VwLiBUaGlzIGhlbHBzIHVzIG1haW50YWluIHNvbWUKIAkJICogY29udGlndW91c25lc3MgYWNyb3NzIGFsbG9jYXRpb25zLiAqLwogCQlzdGF0dXMgPSBvY2ZzMl9zZWFyY2hfb25lX2dyb3VwKGFjLCBoYW5kbGUsIGJpdHNfd2FudGVkLAogCQkJCQkJbWluX2JpdHMsIHJlcywgJmJpdHNfbGVmdCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCAxN2ZmNDZmLi4wNmQxZjc0IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTIwOTcsNiArMjA5Nyw3IEBACiAKIAlzYi0+c19mc19pbmZvID0gb3NiOwogCXNiLT5zX29wID0gJm9jZnMyX3NvcHM7CisJc2ItPnNfZF9vcCA9ICZvY2ZzMl9kZW50cnlfb3BzOwogCXNiLT5zX2V4cG9ydF9vcCA9ICZvY2ZzMl9leHBvcnRfb3BzOwogCXNiLT5zX3Fjb3AgPSAmb2NmczJfcXVvdGFjdGxfb3BzOwogCXNiLT5kcV9vcCA9ICZvY2ZzMl9xdW90YV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDQxOTdiOWUuLjViNmVmN2UgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTIyMyw3ICsyMjMsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBSZXR1cm4gZXJyb3IgaWYgbW9kZSBpcyBub3Qgc3VwcG9ydGVkICovCi0JaWYgKG1vZGUgJiYgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpCisJaWYgKG1vZGUgJiB+KEZBTExPQ19GTF9LRUVQX1NJWkUgfCBGQUxMT0NfRkxfUFVOQ0hfSE9MRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIFB1bmNoIGhvbGUgbXVzdCBoYXZlIGtlZXAgc2l6ZSBzZXQgKi8KKwlpZiAoKG1vZGUgJiBGQUxMT0NfRkxfUFVOQ0hfSE9MRSkgJiYKKwkgICAgIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCAwYThiMGFkLi45YzIxMTE5IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0yMzcsNiArMjM3LDEzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxsdVxuIiwodW5zaWduZWQgbG9uZyBsb25nKXAtPm5yX3NlY3RzKTsKIH0KIAorc3NpemVfdCBwYXJ0X3JvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwID0gZGV2X3RvX3BhcnQoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcC0+cG9saWN5ID8gMSA6IDApOworfQorCiBzc2l6ZV90IHBhcnRfYWxpZ25tZW50X29mZnNldF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMzEyLDYgKzMxOSw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIocGFydGl0aW9uLCBTX0lSVUdPLCBwYXJ0X3BhcnRpdGlvbl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzdGFydCwgU19JUlVHTywgcGFydF9zdGFydF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzaXplLCBTX0lSVUdPLCBwYXJ0X3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocm8sIFNfSVJVR08sIHBhcnRfcm9fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYWxpZ25tZW50X29mZnNldCwgU19JUlVHTywgcGFydF9hbGlnbm1lbnRfb2Zmc2V0X3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGRpc2NhcmRfYWxpZ25tZW50LCBTX0lSVUdPLCBwYXJ0X2Rpc2NhcmRfYWxpZ25tZW50X3Nob3csCiAJCSAgIE5VTEwpOwpAQCAtMzI2LDYgKzMzNCw3IEBACiAJJmRldl9hdHRyX3BhcnRpdGlvbi5hdHRyLAogCSZkZXZfYXR0cl9zdGFydC5hdHRyLAogCSZkZXZfYXR0cl9zaXplLmF0dHIsCisJJmRldl9hdHRyX3JvLmF0dHIsCiAJJmRldl9hdHRyX2FsaWdubWVudF9vZmZzZXQuYXR0ciwKIAkmZGV2X2F0dHJfZGlzY2FyZF9hbGlnbm1lbnQuYXR0ciwKIAkmZGV2X2F0dHJfc3RhdC5hdHRyLApAQCAtMzcyLDYgKzM4MSwxMSBAQAogCXB1dF9kZXZpY2UocGFydF90b19kZXYocGFydCkpOwogfQogCit2b2lkIF9fZGVsZXRlX3BhcnRpdGlvbihzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCWNhbGxfcmN1KCZwYXJ0LT5yY3VfaGVhZCwgZGVsZXRlX3BhcnRpdGlvbl9yY3VfY2IpOworfQorCiB2b2lkIGRlbGV0ZV9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0bm8pCiB7CiAJc3RydWN0IGRpc2tfcGFydF90YmwgKnB0YmwgPSBkaXNrLT5wYXJ0X3RibDsKQEAgLTM5MCw3ICs0MDQsNyBAQAogCWtvYmplY3RfcHV0KHBhcnQtPmhvbGRlcl9kaXIpOwogCWRldmljZV9kZWwocGFydF90b19kZXYocGFydCkpOwogCi0JY2FsbF9yY3UoJnBhcnQtPnJjdV9oZWFkLCBkZWxldGVfcGFydGl0aW9uX3JjdV9jYik7CisJaGRfc3RydWN0X3B1dChwYXJ0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgd2hvbGVfZGlza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTQ4OSw2ICs1MDMsNyBAQAogCWlmICghZGV2X2dldF91ZXZlbnRfc3VwcHJlc3MoZGRldikpCiAJCWtvYmplY3RfdWV2ZW50KCZwZGV2LT5rb2JqLCBLT0JKX0FERCk7CiAKKwloZF9yZWZfaW5pdChwKTsKIAlyZXR1cm4gcDsKIAogb3V0X2ZyZWVfaW5mbzoKQEAgLTUwNyw2NSArNTIyLDYgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi0vKiBOb3QgZXhwb3J0ZWQsIGhlbHBlciB0byBhZGRfZGlzaygpLiAqLwotdm9pZCByZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQotewotCXN0cnVjdCBkZXZpY2UgKmRkZXYgPSBkaXNrX3RvX2RldihkaXNrKTsKLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwotCXN0cnVjdCBkaXNrX3BhcnRfaXRlciBwaXRlcjsKLQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwotCWludCBlcnI7Ci0KLQlkZGV2LT5wYXJlbnQgPSBkaXNrLT5kcml2ZXJmc19kZXY7Ci0KLQlkZXZfc2V0X25hbWUoZGRldiwgZGlzay0+ZGlza19uYW1lKTsKLQotCS8qIGRlbGF5IHVldmVudHMsIHVudGlsIHdlIHNjYW5uZWQgcGFydGl0aW9uIHRhYmxlICovCi0JZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZGRldiwgMSk7Ci0KLQlpZiAoZGV2aWNlX2FkZChkZGV2KSkKLQkJcmV0dXJuOwotCWlmICghc3lzZnNfZGVwcmVjYXRlZCkgewotCQllcnIgPSBzeXNmc19jcmVhdGVfbGluayhibG9ja19kZXByLCAmZGRldi0+a29iaiwKLQkJCQkJa29iamVjdF9uYW1lKCZkZGV2LT5rb2JqKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldmljZV9kZWwoZGRldik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZGlzay0+cGFydDAuaG9sZGVyX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImhvbGRlcnMiLCAmZGRldi0+a29iaik7Ci0JZGlzay0+c2xhdmVfZGlyID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic2xhdmVzIiwgJmRkZXYtPmtvYmopOwotCi0JLyogTm8gbWlub3JzIHRvIHVzZSBmb3IgcGFydGl0aW9ucyAqLwotCWlmICghZGlza19wYXJ0aXRpb25hYmxlKGRpc2spKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiBObyBzdWNoIGRldmljZSAoZS5nLiwgbWVkaWEgd2VyZSBqdXN0IHJlbW92ZWQpICovCi0JaWYgKCFnZXRfY2FwYWNpdHkoZGlzaykpCi0JCWdvdG8gZXhpdDsKLQotCWJkZXYgPSBiZGdldF9kaXNrKGRpc2ssIDApOwotCWlmICghYmRldikKLQkJZ290byBleGl0OwotCi0JYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAxOwotCWVyciA9IGJsa2Rldl9nZXQoYmRldiwgRk1PREVfUkVBRCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXhpdDsKLQlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUQpOwotCi1leGl0OgotCS8qIGFubm91bmNlIGRpc2sgYWZ0ZXIgcG9zc2libGUgcGFydGl0aW9ucyBhcmUgY3JlYXRlZCAqLwotCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGRkZXYsIDApOwotCWtvYmplY3RfdWV2ZW50KCZkZGV2LT5rb2JqLCBLT0JKX0FERCk7Ci0KLQkvKiBhbm5vdW5jZSBwb3NzaWJsZSBwYXJ0aXRpb25zICovCi0JZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIDApOwotCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpCi0JCWtvYmplY3RfdWV2ZW50KCZwYXJ0X3RvX2RldihwYXJ0KS0+a29iaiwgS09CSl9BREQpOwotCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKLX0KLQogc3RhdGljIGJvb2wgZGlza191bmxvY2tfbmF0aXZlX2NhcGFjaXR5KHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewogCWNvbnN0IHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyAqYmRvcHMgPSBkaXNrLT5mb3BzOwpAQCAtNzI4LDMzICs2ODQsMyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKHJlYWRfZGV2X3NlY3Rvcik7Ci0KLXZvaWQgZGVsX2dlbmRpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCi17Ci0Jc3RydWN0IGRpc2tfcGFydF9pdGVyIHBpdGVyOwotCXN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQ7Ci0KLQkvKiBpbnZhbGlkYXRlIHN0dWZmICovCi0JZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssCi0JCQkgICAgIERJU0tfUElURVJfSU5DTF9FTVBUWSB8IERJU0tfUElURVJfUkVWRVJTRSk7Ci0Jd2hpbGUgKChwYXJ0ID0gZGlza19wYXJ0X2l0ZXJfbmV4dCgmcGl0ZXIpKSkgewotCQlpbnZhbGlkYXRlX3BhcnRpdGlvbihkaXNrLCBwYXJ0LT5wYXJ0bm8pOwotCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHBhcnQtPnBhcnRubyk7Ci0JfQotCWRpc2tfcGFydF9pdGVyX2V4aXQoJnBpdGVyKTsKLQotCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIDApOwotCWJsa19mcmVlX2RldnQoZGlza190b19kZXYoZGlzayktPmRldnQpOwotCXNldF9jYXBhY2l0eShkaXNrLCAwKTsKLQlkaXNrLT5mbGFncyAmPSB+R0VOSERfRkxfVVA7Ci0JdW5saW5rX2dlbmRpc2soZGlzayk7Ci0JcGFydF9zdGF0X3NldF9hbGwoJmRpc2stPnBhcnQwLCAwKTsKLQlkaXNrLT5wYXJ0MC5zdGFtcCA9IDA7Ci0KLQlrb2JqZWN0X3B1dChkaXNrLT5wYXJ0MC5ob2xkZXJfZGlyKTsKLQlrb2JqZWN0X3B1dChkaXNrLT5zbGF2ZV9kaXIpOwotCWRpc2stPmRyaXZlcmZzX2RldiA9IE5VTEw7Ci0JaWYgKCFzeXNmc19kZXByZWNhdGVkKQotCQlzeXNmc19yZW1vdmVfbGluayhibG9ja19kZXByLCBkZXZfbmFtZShkaXNrX3RvX2RldihkaXNrKSkpOwotCWRldmljZV9kZWwoZGlza190b19kZXYoZGlzaykpOwotfQpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IDY4ZjFmOGUuLmUyZTk1ZmIgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGRvX3dha2V1cCkgewotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJnBpcGUtPndhaXQpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgmcGlwZS0+d2FpdCwgUE9MTE9VVCk7CiAgCQkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY193cml0ZXJzLCBTSUdJTywgUE9MTF9PVVQpOwogCQl9CiAJCXBpcGVfd2FpdChwaXBlKTsKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCiAJLyogU2lnbmFsIHdyaXRlcnMgYXN5bmNocm9ub3VzbHkgdGhhdCB0aGVyZSBpcyBtb3JlIHJvb20uICovCiAJaWYgKGRvX3dha2V1cCkgewotCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygmcGlwZS0+d2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoJnBpcGUtPndhaXQsIFBPTExPVVQpOwogCQlraWxsX2Zhc3luYygmcGlwZS0+ZmFzeW5jX3dyaXRlcnMsIFNJR0lPLCBQT0xMX09VVCk7CiAJfQogCWlmIChyZXQgPiAwKQpAQCAtNjEyLDcgKzYxMiw3IEBACiAJCQlicmVhazsKIAkJfQogCQlpZiAoZG9fd2FrZXVwKSB7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygmcGlwZS0+d2FpdCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luY19wb2xsKCZwaXBlLT53YWl0LCBQT0xMSU4pOwogCQkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY19yZWFkZXJzLCBTSUdJTywgUE9MTF9JTik7CiAJCQlkb193YWtldXAgPSAwOwogCQl9CkBAIC02MjMsNyArNjIzLDcgQEAKIG91dDoKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAlpZiAoZG9fd2FrZXVwKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCZwaXBlLT53YWl0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgmcGlwZS0+d2FpdCwgUE9MTElOKTsKIAkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY19yZWFkZXJzLCBTSUdJTywgUE9MTF9JTik7CiAJfQogCWlmIChyZXQgPiAwKQpAQCAtNzE1LDcgKzcxNSw3IEBACiAJaWYgKCFwaXBlLT5yZWFkZXJzICYmICFwaXBlLT53cml0ZXJzKSB7CiAJCWZyZWVfcGlwZV9pbmZvKGlub2RlKTsKIAl9IGVsc2UgewotCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygmcGlwZS0+d2FpdCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoJnBpcGUtPndhaXQsIFBPTExJTiB8IFBPTExPVVQpOwogCQlraWxsX2Zhc3luYygmcGlwZS0+ZmFzeW5jX3JlYWRlcnMsIFNJR0lPLCBQT0xMX0lOKTsKIAkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY193cml0ZXJzLCBTSUdJTywgUE9MTF9PVVQpOwogCX0KQEAgLTEwMDQsNyArMTAwNCw2IEBACiAJCWdvdG8gZXJyX2lub2RlOwogCXBhdGgubW50ID0gbW50Z2V0KHBpcGVfbW50KTsKIAotCWRfc2V0X2Rfb3AocGF0aC5kZW50cnksICZwaXBlZnNfZGVudHJ5X29wZXJhdGlvbnMpOwogCWRfaW5zdGFudGlhdGUocGF0aC5kZW50cnksIGlub2RlKTsKIAogCWVyciA9IC1FTkZJTEU7CkBAIC0xMjY2LDcgKzEyNjUsOCBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnBpcGVmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAkJCSBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewotCXJldHVybiBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgInBpcGU6IiwgJnBpcGVmc19vcHMsIFBJUEVGU19NQUdJQyk7CisJcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAicGlwZToiLCAmcGlwZWZzX29wcywKKwkJCSZwaXBlZnNfZGVudHJ5X29wZXJhdGlvbnMsIFBJUEVGU19NQUdJQyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBwaXBlX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9wcm9jL01ha2VmaWxlIGIvZnMvcHJvYy9NYWtlZmlsZQppbmRleCAyODhhNDllMC4uZGY0MzRjNSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9NYWtlZmlsZQorKysgYi9mcy9wcm9jL01ha2VmaWxlCkBAIC0xMCwxMiArMTAsMTIgQEAKIHByb2MteSAgICAgICArPSBpbm9kZS5vIHJvb3QubyBiYXNlLm8gZ2VuZXJpYy5vIGFycmF5Lm8gXAogCQlwcm9jX3R0eS5vCiBwcm9jLXkJKz0gY21kbGluZS5vCitwcm9jLXkJKz0gY29uc29sZXMubwogcHJvYy15CSs9IGNwdWluZm8ubwogcHJvYy15CSs9IGRldmljZXMubwogcHJvYy15CSs9IGludGVycnVwdHMubwogcHJvYy15CSs9IGxvYWRhdmcubwogcHJvYy15CSs9IG1lbWluZm8ubwotcHJvYy15CSs9IHByb2NfY29uc29sZS5vCiBwcm9jLXkJKz0gc3RhdC5vCiBwcm9jLXkJKz0gdXB0aW1lLm8KIHByb2MteQkrPSB2ZXJzaW9uLm8KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCBmZmY2NTcyLi5kZjJiNzAzIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC05NSw3ICs5NSw3IEBACiAKIAlnZXRfdGFza19jb21tKHRjb21tLCBwKTsKIAotCXNlcV9wcmludGYobSwgIk5hbWU6XHQiKTsKKwlzZXFfcHV0cyhtLCAiTmFtZTpcdCIpOwogCWVuZCA9IG0tPmJ1ZiArIG0tPnNpemU7CiAJYnVmID0gbS0+YnVmICsgbS0+Y291bnQ7CiAJbmFtZSA9IHRjb21tOwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCWJ1ZisrOwogCX0KIAltLT5jb3VudCA9IGJ1ZiAtIG0tPmJ1ZjsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOworCXNlcV9wdXRjKG0sICdcbicpOwogfQogCiAvKgpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCXNlcV9wcmludGYobSwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sIGcpKTsKIAlwdXRfY3JlZChjcmVkKTsKIAotCXNlcV9wcmludGYobSwgIlxuIik7CisJc2VxX3B1dGMobSwgJ1xuJyk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlbmRlcl9zaWdzZXRfdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKmhlYWRlciwKQEAgLTIxNiw3ICsyMTYsNyBAQAogewogCWludCBpOwogCi0Jc2VxX3ByaW50ZihtLCAiJXMiLCBoZWFkZXIpOworCXNlcV9wdXRzKG0sIGhlYWRlcik7CiAKIAlpID0gX05TSUc7CiAJZG8gewpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCXNlcV9wcmludGYobSwgIiV4IiwgeCk7CiAJfSB3aGlsZSAoaSA+PSA0KTsKIAotCXNlcV9wcmludGYobSwgIlxuIik7CisJc2VxX3B1dGMobSwgJ1xuJyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbGxlY3Rfc2lnaWduX3NpZ2NhdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc2lnc2V0X3QgKmlnbiwKQEAgLTI5MSwxMiArMjkxLDEyIEBACiB7CiAJdW5zaWduZWQgX19jYXBpOwogCi0Jc2VxX3ByaW50ZihtLCAiJXMiLCBoZWFkZXIpOworCXNlcV9wdXRzKG0sIGhlYWRlcik7CiAJQ0FQX0ZPUl9FQUNIX1UzMihfX2NhcGkpIHsKIAkJc2VxX3ByaW50ZihtLCAiJTA4eCIsCiAJCQkgICBhLT5jYXBbKF9LRVJORUxfQ0FQQUJJTElUWV9VMzJTLTEpIC0gX19jYXBpXSk7CiAJfQotCXNlcV9wcmludGYobSwgIlxuIik7CisJc2VxX3B1dGMobSwgJ1xuJyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2NhcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTMyOSwxMiArMzI5LDEyIEBACiAKIHN0YXRpYyB2b2lkIHRhc2tfY3B1c19hbGxvd2VkKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXNlcV9wcmludGYobSwgIkNwdXNfYWxsb3dlZDpcdCIpOworCXNlcV9wdXRzKG0sICJDcHVzX2FsbG93ZWQ6XHQiKTsKIAlzZXFfY3B1bWFzayhtLCAmdGFzay0+Y3B1c19hbGxvd2VkKTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCXNlcV9wcmludGYobSwgIkNwdXNfYWxsb3dlZF9saXN0Olx0Iik7CisJc2VxX3B1dGMobSwgJ1xuJyk7CisJc2VxX3B1dHMobSwgIkNwdXNfYWxsb3dlZF9saXN0Olx0Iik7CiAJc2VxX2NwdW1hc2tfbGlzdChtLCAmdGFzay0+Y3B1c19hbGxvd2VkKTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOworCXNlcV9wdXRjKG0sICdcbicpOwogfQogCiBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLApAQCAtNTM1LDE1ICs1MzUsMTUgQEAKIGludCBwcm9jX3BpZF9zdGF0bShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKIAkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWludCBzaXplID0gMCwgcmVzaWRlbnQgPSAwLCBzaGFyZWQgPSAwLCB0ZXh0ID0gMCwgbGliID0gMCwgZGF0YSA9IDA7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMCwgcmVzaWRlbnQgPSAwLCBzaGFyZWQgPSAwLCB0ZXh0ID0gMCwgZGF0YSA9IDA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKIAogCWlmIChtbSkgewogCQlzaXplID0gdGFza19zdGF0bShtbSwgJnNoYXJlZCwgJnRleHQsICZkYXRhLCAmcmVzaWRlbnQpOwogCQltbXB1dChtbSk7CiAJfQotCXNlcV9wcmludGYobSwgIiVkICVkICVkICVkICVkICVkICVkXG4iLAotCQkJc2l6ZSwgcmVzaWRlbnQsIHNoYXJlZCwgdGV4dCwgbGliLCBkYXRhLCAwKTsKKwlzZXFfcHJpbnRmKG0sICIlbHUgJWx1ICVsdSAlbHUgMCAlbHUgMFxuIiwKKwkJCXNpemUsIHJlc2lkZW50LCBzaGFyZWQsIHRleHQsIGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IGIyMDk2MmMuLjlkMDk2ZTggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0zNzMsMjYgKzM3MywyMCBAQAogCQlyZXR1cm4gLUVTUkNIOwogCXNlcV9wdXRzKG0sICJMYXRlbmN5IFRvcCB2ZXJzaW9uIDogdjAuMVxuIik7CiAJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJaWYgKHRhc2stPmxhdGVuY3lfcmVjb3JkW2ldLmJhY2t0cmFjZVswXSkgeworCQlzdHJ1Y3QgbGF0ZW5jeV9yZWNvcmQgKmxyID0gJnRhc2stPmxhdGVuY3lfcmVjb3JkW2ldOworCQlpZiAobHItPmJhY2t0cmFjZVswXSkgewogCQkJaW50IHE7Ci0JCQlzZXFfcHJpbnRmKG0sICIlaSAlbGkgJWxpICIsCi0JCQkJdGFzay0+bGF0ZW5jeV9yZWNvcmRbaV0uY291bnQsCi0JCQkJdGFzay0+bGF0ZW5jeV9yZWNvcmRbaV0udGltZSwKLQkJCQl0YXNrLT5sYXRlbmN5X3JlY29yZFtpXS5tYXgpOworCQkJc2VxX3ByaW50ZihtLCAiJWkgJWxpICVsaSIsCisJCQkJICAgbHItPmNvdW50LCBsci0+dGltZSwgbHItPm1heCk7CiAJCQlmb3IgKHEgPSAwOyBxIDwgTFRfQkFDS1RSQUNFREVQVEg7IHErKykgewotCQkJCWNoYXIgc3ltW0tTWU1fU1lNQk9MX0xFTl07Ci0JCQkJY2hhciAqYzsKLQkJCQlpZiAoIXRhc2stPmxhdGVuY3lfcmVjb3JkW2ldLmJhY2t0cmFjZVtxXSkKKwkJCQl1bnNpZ25lZCBsb25nIGJ0ID0gbHItPmJhY2t0cmFjZVtxXTsKKwkJCQlpZiAoIWJ0KQogCQkJCQlicmVhazsKLQkJCQlpZiAodGFzay0+bGF0ZW5jeV9yZWNvcmRbaV0uYmFja3RyYWNlW3FdID09IFVMT05HX01BWCkKKwkJCQlpZiAoYnQgPT0gVUxPTkdfTUFYKQogCQkJCQlicmVhazsKLQkJCQlzcHJpbnRfc3ltYm9sKHN5bSwgdGFzay0+bGF0ZW5jeV9yZWNvcmRbaV0uYmFja3RyYWNlW3FdKTsKLQkJCQljID0gc3RyY2hyKHN5bSwgJysnKTsKLQkJCQlpZiAoYykKLQkJCQkJKmMgPSAwOwotCQkJCXNlcV9wcmludGYobSwgIiVzICIsIHN5bSk7CisJCQkJc2VxX3ByaW50ZihtLCAiICVwcyIsICh2b2lkICopYnQpOwogCQkJfQotCQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwkJCXNlcV9wdXRjKG0sICdcbicpOwogCQl9CiAKIAl9CkBAIC03NTEsMTQgKzc0NSw3IEBACiAKIHN0YXRpYyBpbnQgcHJvY19zaW5nbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlpbnQgcmV0OwotCXJldCA9IHNpbmdsZV9vcGVuKGZpbHAsIHByb2Nfc2luZ2xlX3Nob3csIE5VTEwpOwotCWlmICghcmV0KSB7Ci0JCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQotCQltLT5wcml2YXRlID0gaW5vZGU7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbHAsIHByb2Nfc2luZ2xlX3Nob3csIGlub2RlKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zaW5nbGVfZmlsZV9vcGVyYXRpb25zID0gewpAQCAtMTE2NCw3ICsxMTUxLDcgQEAKIAkJZ290byBlcnJfdGFza19sb2NrOwogCX0KIAotCWlmIChvb21fc2NvcmVfYWRqIDwgdGFzay0+c2lnbmFsLT5vb21fc2NvcmVfYWRqICYmCisJaWYgKG9vbV9zY29yZV9hZGogPCB0YXNrLT5zaWduYWwtPm9vbV9zY29yZV9hZGpfbWluICYmCiAJCQkhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkgewogCQllcnIgPSAtRUFDQ0VTOwogCQlnb3RvIGVycl9zaWdoYW5kOwpAQCAtMTE3Nyw2ICsxMTY0LDggQEAKIAkJCWF0b21pY19kZWMoJnRhc2stPm1tLT5vb21fZGlzYWJsZV9jb3VudCk7CiAJfQogCXRhc2stPnNpZ25hbC0+b29tX3Njb3JlX2FkaiA9IG9vbV9zY29yZV9hZGo7CisJaWYgKGhhc19jYXBhYmlsaXR5X25vYXVkaXQoY3VycmVudCwgQ0FQX1NZU19SRVNPVVJDRSkpCisJCXRhc2stPnNpZ25hbC0+b29tX3Njb3JlX2Fkal9taW4gPSBvb21fc2NvcmVfYWRqOwogCS8qCiAJICogU2NhbGUgL3Byb2MvcGlkL29vbV9hZGogYXBwcm9wcmlhdGVseSBlbnN1cmluZyB0aGF0IE9PTV9ESVNBQkxFIGlzCiAJICogYWx3YXlzIGF0dGFpbmFibGUuCkBAIC0xMzg2LDE1ICsxMzc1LDcgQEAKIAogc3RhdGljIGludCBzY2hlZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBzaW5nbGVfb3BlbihmaWxwLCBzY2hlZF9zaG93LCBOVUxMKTsKLQlpZiAoIXJldCkgewotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0KLQkJbS0+cHJpdmF0ZSA9IGlub2RlOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBzaW5nbGVfb3BlbihmaWxwLCBzY2hlZF9zaG93LCBpbm9kZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGlkX3NjaGVkX29wZXJhdGlvbnMgPSB7CkBAIC0xNTMwLDE1ICsxNTExLDcgQEAKIAogc3RhdGljIGludCBjb21tX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHNpbmdsZV9vcGVuKGZpbHAsIGNvbW1fc2hvdywgTlVMTCk7Ci0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICptID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JCW0tPnByaXZhdGUgPSBpbm9kZTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgY29tbV9zaG93LCBpbm9kZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcGlkX3NldF9jb21tX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfY29uc29sZS5jIGIvZnMvcHJvYy9jb25zb2xlcy5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGZzL3Byb2MvcHJvY19jb25zb2xlLmMKcmVuYW1lIHRvIGZzL3Byb2MvY29uc29sZXMuYwppbmRleCA4YTcwNzYwLi5lYWZjMjJhIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfY29uc29sZS5jCisrKyBiL2ZzL3Byb2MvY29uc29sZXMuYwpAQCAtMTA2LDkgKzEwNiw5IEBACiAJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfcHJvY19jb25zb2xlcyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcHJvY19jb25zb2xlc19pbml0KHZvaWQpCiB7CiAJcHJvY19jcmVhdGUoImNvbnNvbGVzIiwgMCwgTlVMTCwgJnByb2NfY29uc29sZXNfb3BlcmF0aW9ucyk7CiAJcmV0dXJuIDA7CiB9Ci1tb2R1bGVfaW5pdChyZWdpc3Rlcl9wcm9jX2NvbnNvbGVzKTsKK21vZHVsZV9pbml0KHByb2NfY29uc29sZXNfaW5pdCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2RldmljZXMuYyBiL2ZzL3Byb2MvZGV2aWNlcy5jCmluZGV4IDU5ZWU3ZGEuLmIxNDM0NzEgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZGV2aWNlcy5jCisrKyBiL2ZzL3Byb2MvZGV2aWNlcy5jCkBAIC05LDE0ICs5LDE0IEBACiAKIAlpZiAoaSA8IENIUkRFVl9NQUpPUl9IQVNIX1NJWkUpIHsKIAkJaWYgKGkgPT0gMCkKLQkJCXNlcV9wcmludGYoZiwgIkNoYXJhY3RlciBkZXZpY2VzOlxuIik7CisJCQlzZXFfcHV0cyhmLCAiQ2hhcmFjdGVyIGRldmljZXM6XG4iKTsKIAkJY2hyZGV2X3Nob3coZiwgaSk7CiAJfQogI2lmZGVmIENPTkZJR19CTE9DSwogCWVsc2UgewogCQlpIC09IENIUkRFVl9NQUpPUl9IQVNIX1NJWkU7CiAJCWlmIChpID09IDApCi0JCQlzZXFfcHJpbnRmKGYsICJcbkJsb2NrIGRldmljZXM6XG4iKTsKKwkJCXNlcV9wdXRzKGYsICJcbkJsb2NrIGRldmljZXM6XG4iKTsKIAkJYmxrZGV2X3Nob3coZiwgaSk7CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IGY3NjZiZTIuLjAxZTA3ZjIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC00MjUsMTMgKzQyNSwxMCBAQAogCQlpZiAoZGUtPm5hbWVsZW4gIT0gZGVudHJ5LT5kX25hbWUubGVuKQogCQkJY29udGludWU7CiAJCWlmICghbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbikpIHsKLQkJCXVuc2lnbmVkIGludCBpbm87Ci0KLQkJCWlubyA9IGRlLT5sb3dfaW5vOwogCQkJcGRlX2dldChkZSk7CiAJCQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CiAJCQllcnJvciA9IC1FSU5WQUw7Ci0JCQlpbm9kZSA9IHByb2NfZ2V0X2lub2RlKGRpci0+aV9zYiwgaW5vLCBkZSk7CisJCQlpbm9kZSA9IHByb2NfZ2V0X2lub2RlKGRpci0+aV9zYiwgZGUpOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAJfQpAQCAtNzY4LDEyICs3NjUsNyBAQAogCiBzdGF0aWMgdm9pZCBmcmVlX3Byb2NfZW50cnkoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKIHsKLQl1bnNpZ25lZCBpbnQgaW5vID0gZGUtPmxvd19pbm87Ci0KLQlpZiAoaW5vIDwgUFJPQ19EWU5BTUlDX0ZJUlNUKQotCQlyZXR1cm47Ci0KLQlyZWxlYXNlX2lub2RlX251bWJlcihpbm8pOworCXJlbGVhc2VfaW5vZGVfbnVtYmVyKGRlLT5sb3dfaW5vKTsKIAogCWlmIChTX0lTTE5LKGRlLT5tb2RlKSkKIAkJa2ZyZWUoZGUtPmRhdGEpOwpAQCAtODM0LDEyICs4MjYsOSBAQAogCiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbik7CiAKLQkJZ290byBjb250aW51ZV9yZW1vdmluZzsKKwkJc3Bpbl9sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOwogCi1jb250aW51ZV9yZW1vdmluZzoKLQlzcGluX2xvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZGUtPnBkZV9vcGVuZXJzKSkgewogCQlzdHJ1Y3QgcGRlX29wZW5lciAqcGRlbzsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IDZiY2I5MjYuLjE3NmNlNGMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTQxNiwxMiArNDE2LDExIEBACiB9OwogI2VuZGlmCiAKLXN0cnVjdCBpbm9kZSAqcHJvY19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubywKLQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQorc3RydWN0IGlub2RlICpwcm9jX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlOwogCi0JaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBkZS0+bG93X2lubyk7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKQEAgLTQ3MSw3ICs0NzAsNyBAQAogCXMtPnNfdGltZV9ncmFuID0gMTsKIAkKIAlwZGVfZ2V0KCZwcm9jX3Jvb3QpOwotCXJvb3RfaW5vZGUgPSBwcm9jX2dldF9pbm9kZShzLCBQUk9DX1JPT1RfSU5PLCAmcHJvY19yb290KTsKKwlyb290X2lub2RlID0gcHJvY19nZXRfaW5vZGUocywgJnByb2Nfcm9vdCk7CiAJaWYgKCFyb290X2lub2RlKQogCQlnb3RvIG91dF9ub19yb290OwogCXJvb3RfaW5vZGUtPmlfdWlkID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW50ZXJuYWwuaCBiL2ZzL3Byb2MvaW50ZXJuYWwuaAppbmRleCAxZjI0YTNlLi45YWQ1NjFkIDEwMDY0NAotLS0gYS9mcy9wcm9jL2ludGVybmFsLmgKKysrIGIvZnMvcHJvYy9pbnRlcm5hbC5oCkBAIC05Niw3ICs5Niw4IEBACiBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3BpZF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKik7CiBpbnQgcHJvY19waWRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICopOwotaW50IHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7Cit1bnNpZ25lZCBsb25nIHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqLAorCXVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7CiB2b2lkIHRhc2tfbWVtKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgbW1fc3RydWN0ICopOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlX2dldChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSkKQEAgLTEwOCw3ICsxMDksNyBAQAogCiBleHRlcm4gc3RydWN0IHZmc21vdW50ICpwcm9jX21udDsKIGludCBwcm9jX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotc3RydWN0IGlub2RlICpwcm9jX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKik7CitzdHJ1Y3QgaW5vZGUgKnByb2NfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKik7CiAKIC8qCiAgKiBUaGVzZSBhcmUgZ2VuZXJpYyAvcHJvYyByb3V0aW5lcyB0aGF0IHVzZSB0aGUgaW50ZXJuYWwKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuYwppbmRleCA2ZjM3YzM5Li5kMjQ1Y2IyIDEwMDY0NAotLS0gYS9mcy9wcm9jL2tjb3JlLmMKKysrIGIvZnMvcHJvYy9rY29yZS5jCkBAIC01NTgsNyArNTU4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfa2NvcmVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZAkJPSByZWFkX2tjb3JlLAogCS5vcGVuCQk9IG9wZW5fa2NvcmUsCi0JLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCiB9OwogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCmRpZmYgLS1naXQgYS9mcy9wcm9jL21lbWluZm8uYyBiL2ZzL3Byb2MvbWVtaW5mby5jCmluZGV4IGE2NTIzOWMuLmVkMjU3ZDEgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbWVtaW5mby5jCisrKyBiL2ZzL3Byb2MvbWVtaW5mby5jCkBAIC0xMDEsNiArMTAxLDkgQEAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKIAkJIkhhcmR3YXJlQ29ycnVwdGVkOiAlNWx1IGtCXG4iCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwkJIkFub25IdWdlUGFnZXM6ICAlOGx1IGtCXG4iCisjZW5kaWYKIAkJLAogCQlLKGkudG90YWxyYW0pLAogCQlLKGkuZnJlZXJhbSksCkBAIC0xMjgsNyArMTMxLDEyIEBACiAJCUsoaS5mcmVlc3dhcCksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkpLAogCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX1dSSVRFQkFDSykpLAotCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0FOT05fUEFHRVMpKSwKKwkJSyhnbG9iYWxfcGFnZV9zdGF0ZShOUl9BTk9OX1BBR0VTKQorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCQkgICsgZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQU5PTl9UUkFOU1BBUkVOVF9IVUdFUEFHRVMpICoKKwkJICBIUEFHRV9QTURfTlIKKyNlbmRpZgorCQkgICksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9NQVBQRUQpKSwKIAkJSyhnbG9iYWxfcGFnZV9zdGF0ZShOUl9TSE1FTSkpLAogCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfUkVDTEFJTUFCTEUpICsKQEAgLTE1MSw2ICsxNTksMTAgQEAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKIAkJLGF0b21pY19sb25nX3JlYWQoJm1jZV9iYWRfcGFnZXMpIDw8IChQQUdFX1NISUZUIC0gMTApCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwkJLEsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQU5PTl9UUkFOU1BBUkVOVF9IVUdFUEFHRVMpICoKKwkJICAgSFBBR0VfUE1EX05SKQorI2VuZGlmCiAJCSk7CiAKIAlodWdldGxiX3JlcG9ydF9tZW1pbmZvKG0pOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wYWdlLmMgYi9mcy9wcm9jL3BhZ2UuYwppbmRleCAzYjhiNDU2Ni4uNmQ4ZTZhOSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wYWdlLmMKKysrIGIvZnMvcHJvYy9wYWdlLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAkJCXBwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAkJZWxzZQogCQkJcHBhZ2UgPSBOVUxMOwotCQlpZiAoIXBwYWdlKQorCQlpZiAoIXBwYWdlIHx8IFBhZ2VTbGFiKHBwYWdlKSkKIAkJCXBjb3VudCA9IDA7CiAJCWVsc2UKIAkJCXBjb3VudCA9IHBhZ2VfbWFwY291bnQocHBhZ2UpOwpAQCAtMTE2LDE1ICsxMTYsMTcgQEAKIAlpZiAoUGFnZUh1Z2UocGFnZSkpCiAJCXUgfD0gMSA8PCBLUEZfSFVHRTsKIAorCS8qCisJICogQ2F2ZWF0cyBvbiBoaWdoIG9yZGVyIHBhZ2VzOiBwYWdlLT5fY291bnQgd2lsbCBvbmx5IGJlIHNldAorCSAqIC0xIG9uIHRoZSBoZWFkIHBhZ2U7IFNMVUIvU0xRQiBkbyB0aGUgc2FtZSBmb3IgUEdfc2xhYjsKKwkgKiBTTE9CIHdvbid0IHNldCBQR19zbGFiIGF0IGFsbCBvbiBjb21wb3VuZCBwYWdlcy4KKwkgKi8KKwlpZiAoUGFnZUJ1ZGR5KHBhZ2UpKQorCQl1IHw9IDEgPDwgS1BGX0JVRERZOworCiAJdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX0xPQ0tFRCwJUEdfbG9ja2VkKTsKIAotCS8qCi0JICogQ2F2ZWF0cyBvbiBoaWdoIG9yZGVyIHBhZ2VzOgotCSAqIFBHX2J1ZGR5IHdpbGwgb25seSBiZSBzZXQgb24gdGhlIGhlYWQgcGFnZTsgU0xVQi9TTFFCIGRvIHRoZSBzYW1lCi0JICogZm9yIFBHX3NsYWI7IFNMT0Igd29uJ3Qgc2V0IFBHX3NsYWIgYXQgYWxsIG9uIGNvbXBvdW5kIHBhZ2VzLgotCSAqLwogCXUgfD0ga3BmX2NvcHlfYml0KGssIEtQRl9TTEFCLAkJUEdfc2xhYik7Ci0JdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX0JVRERZLAkJUEdfYnVkZHkpOwogCiAJdSB8PSBrcGZfY29weV9iaXQoaywgS1BGX0VSUk9SLAkJUEdfZXJyb3IpOwogCXUgfD0ga3BmX2NvcHlfYml0KGssIEtQRl9ESVJUWSwJCVBHX2RpcnR5KTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY190dHkuYyBiL2ZzL3Byb2MvcHJvY190dHkuYwppbmRleCA4M2FkY2M4Li5jYjc2MWYwIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfdHR5LmMKKysrIGIvZnMvcHJvYy9wcm9jX3R0eS5jCkBAIC0zNiwyNyArMzYsMjcgQEAKIAl9CiAJc3dpdGNoIChwLT50eXBlKSB7CiAJY2FzZSBUVFlfRFJJVkVSX1RZUEVfU1lTVEVNOgotCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW0iKTsKKwkJc2VxX3B1dHMobSwgInN5c3RlbSIpOwogCQlpZiAocC0+c3VidHlwZSA9PSBTWVNURU1fVFlQRV9UVFkpCi0JCQlzZXFfcHJpbnRmKG0sICI6L2Rldi90dHkiKTsKKwkJCXNlcV9wdXRzKG0sICI6L2Rldi90dHkiKTsKIAkJZWxzZSBpZiAocC0+c3VidHlwZSA9PSBTWVNURU1fVFlQRV9TWVNDT05TKQotCQkJc2VxX3ByaW50ZihtLCAiOmNvbnNvbGUiKTsKKwkJCXNlcV9wdXRzKG0sICI6Y29uc29sZSIpOwogCQllbHNlIGlmIChwLT5zdWJ0eXBlID09IFNZU1RFTV9UWVBFX0NPTlNPTEUpCi0JCQlzZXFfcHJpbnRmKG0sICI6dnRtYXN0ZXIiKTsKKwkJCXNlcV9wdXRzKG0sICI6dnRtYXN0ZXIiKTsKIAkJYnJlYWs7CiAJY2FzZSBUVFlfRFJJVkVSX1RZUEVfQ09OU09MRToKLQkJc2VxX3ByaW50ZihtLCAiY29uc29sZSIpOworCQlzZXFfcHV0cyhtLCAiY29uc29sZSIpOwogCQlicmVhazsKIAljYXNlIFRUWV9EUklWRVJfVFlQRV9TRVJJQUw6Ci0JCXNlcV9wcmludGYobSwgInNlcmlhbCIpOworCQlzZXFfcHV0cyhtLCAic2VyaWFsIik7CiAJCWJyZWFrOwogCWNhc2UgVFRZX0RSSVZFUl9UWVBFX1BUWToKIAkJaWYgKHAtPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQotCQkJc2VxX3ByaW50ZihtLCAicHR5Om1hc3RlciIpOworCQkJc2VxX3B1dHMobSwgInB0eTptYXN0ZXIiKTsKIAkJZWxzZSBpZiAocC0+c3VidHlwZSA9PSBQVFlfVFlQRV9TTEFWRSkKLQkJCXNlcV9wcmludGYobSwgInB0eTpzbGF2ZSIpOworCQkJc2VxX3B1dHMobSwgInB0eTpzbGF2ZSIpOwogCQllbHNlCi0JCQlzZXFfcHJpbnRmKG0sICJwdHkiKTsKKwkJCXNlcV9wdXRzKG0sICJwdHkiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc2VxX3ByaW50ZihtLCAidHlwZTolZC4lZCIsIHAtPnR5cGUsIHAtPnN1YnR5cGUpOwpAQCAtNzQsMTkgKzc0LDE5IEBACiAJCS8qIHBzZXVkby1kcml2ZXJzIGZpcnN0ICovCiAJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi90dHkiLCAidHR5Iik7CiAJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgVFRZQVVYX01BSk9SLCAwKTsKLQkJc2VxX3ByaW50ZihtLCAic3lzdGVtOi9kZXYvdHR5XG4iKTsKKwkJc2VxX3B1dHMobSwgInN5c3RlbTovZGV2L3R0eVxuIik7CiAJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi9jb25zb2xlIiwgImNvbnNvbGUiKTsKIAkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlBVVhfTUFKT1IsIDEpOwotCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW06Y29uc29sZVxuIik7CisJCXNlcV9wdXRzKG0sICJzeXN0ZW06Y29uc29sZVxuIik7CiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCiAJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi9wdG14IiwgInB0bXgiKTsKIAkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlBVVhfTUFKT1IsIDIpOwotCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW1cbiIpOworCQlzZXFfcHV0cyhtLCAic3lzdGVtXG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19WVAogCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAvZGV2LyUtOHMgIiwgIi9kZXYvdmMvMCIsICJ2Yy8wIik7CiAJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgVFRZX01BSk9SLCAwKTsKLQkJc2VxX3ByaW50ZihtLCAic3lzdGVtOnZ0bWFzdGVyXG4iKTsKKwkJc2VxX3B1dHMobSwgInN5c3RlbTp2dG1hc3RlclxuIik7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvc29mdGlycXMuYyBiL2ZzL3Byb2Mvc29mdGlycXMuYwppbmRleCAzNzk5NDczLi42MjYwNGJlIDEwMDY0NAotLS0gYS9mcy9wcm9jL3NvZnRpcnFzLmMKKysrIGIvZnMvcHJvYy9zb2Z0aXJxcy5jCkBAIC0xMCwxNiArMTAsMTYgQEAKIHsKIAlpbnQgaSwgajsKIAotCXNlcV9wcmludGYocCwgIiAgICAgICAgICAgICAgICAgICAgIik7CisJc2VxX3B1dHMocCwgIiAgICAgICAgICAgICAgICAgICAgIik7CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCiAJCXNlcV9wcmludGYocCwgIkNQVSUtOGQiLCBpKTsKLQlzZXFfcHJpbnRmKHAsICJcbiIpOworCXNlcV9wdXRjKHAsICdcbicpOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX1NPRlRJUlFTOyBpKyspIHsKIAkJc2VxX3ByaW50ZihwLCAiJTEyczoiLCBzb2Z0aXJxX3RvX25hbWVbaV0pOwogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikKIAkJCXNlcV9wcmludGYocCwgIiAlMTB1Iiwga3N0YXRfc29mdGlycXNfY3B1KGksIGopKTsKLQkJc2VxX3ByaW50ZihwLCAiXG4iKTsKKwkJc2VxX3B1dGMocCwgJ1xuJyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9zdGF0LmMgYi9mcy9wcm9jL3N0YXQuYwppbmRleCBlMTVhMTljLi4xY2ZmYTJiIDEwMDY0NAotLS0gYS9mcy9wcm9jL3N0YXQuYworKysgYi9mcy9wcm9jL3N0YXQuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTlJfU09GVElSUVM7IGkrKykKIAkJc2VxX3ByaW50ZihwLCAiICV1IiwgcGVyX3NvZnRpcnFfc3Vtc1tpXSk7Ci0Jc2VxX3ByaW50ZihwLCAiXG4iKTsKKwlzZXFfcHV0YyhwLCAnXG4nKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IGMxMjZjODMuLjYwYjkxNDggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbW11LmMKQEAgLTY2LDggKzY2LDkgQEAKIAlyZXR1cm4gUEFHRV9TSVpFICogbW0tPnRvdGFsX3ZtOwogfQogCi1pbnQgdGFza19zdGF0bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50ICpzaGFyZWQsIGludCAqdGV4dCwKLQkgICAgICAgaW50ICpkYXRhLCBpbnQgKnJlc2lkZW50KQordW5zaWduZWQgbG9uZyB0YXNrX3N0YXRtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJIHVuc2lnbmVkIGxvbmcgKnNoYXJlZCwgdW5zaWduZWQgbG9uZyAqdGV4dCwKKwkJCSB1bnNpZ25lZCBsb25nICpkYXRhLCB1bnNpZ25lZCBsb25nICpyZXNpZGVudCkKIHsKIAkqc2hhcmVkID0gZ2V0X21tX2NvdW50ZXIobW0sIE1NX0ZJTEVQQUdFUyk7CiAJKnRleHQgPSAoUEFHRV9BTElHTihtbS0+ZW5kX2NvZGUpIC0gKG1tLT5zdGFydF9jb2RlICYgUEFHRV9NQVNLKSkKQEAgLTQxNyw3ICs0MTgsOCBAQAogCQkgICAiQW5vbnltb3VzOiAgICAgICU4bHUga0JcbiIKIAkJICAgIlN3YXA6ICAgICAgICAgICAlOGx1IGtCXG4iCiAJCSAgICJLZXJuZWxQYWdlU2l6ZTogJThsdSBrQlxuIgotCQkgICAiTU1VUGFnZVNpemU6ICAgICU4bHUga0JcbiIsCisJCSAgICJNTVVQYWdlU2l6ZTogICAgJThsdSBrQlxuIgorCQkgICAiTG9ja2VkOiAgICAgICAgICU4bHUga0JcbiIsCiAJCSAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IDEwLAogCQkgICBtc3MucmVzaWRlbnQgPj4gMTAsCiAJCSAgICh1bnNpZ25lZCBsb25nKShtc3MucHNzID4+ICgxMCArIFBTU19TSElGVCkpLApAQCAtNDI5LDcgKzQzMSw5IEBACiAJCSAgIG1zcy5hbm9ueW1vdXMgPj4gMTAsCiAJCSAgIG1zcy5zd2FwID4+IDEwLAogCQkgICB2bWFfa2VybmVsX3BhZ2VzaXplKHZtYSkgPj4gMTAsCi0JCSAgIHZtYV9tbXVfcGFnZXNpemUodm1hKSA+PiAxMCk7CisJCSAgIHZtYV9tbXVfcGFnZXNpemUodm1hKSA+PiAxMCwKKwkJICAgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpID8KKwkJCSh1bnNpZ25lZCBsb25nKShtc3MucHNzID4+ICgxMCArIFBTU19TSElGVCkpIDogMCk7CiAKIAlpZiAobS0+Y291bnQgPCBtLT5zaXplKSAgLyogdm1hIGlzIGNvcGllZCBzdWNjZXNzZnVsbHkgKi8KIAkJbS0+dmVyc2lvbiA9ICh2bWEgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKSA/IHZtYS0+dm1fc3RhcnQgOiAwOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX25vbW11LmMgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwppbmRleCBjYjYzMDZlLi5iNTM1ZDNlIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbm9tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwpAQCAtOTIsMTMgKzkyLDE0IEBACiAJcmV0dXJuIHZzaXplOwogfQogCi1pbnQgdGFza19zdGF0bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50ICpzaGFyZWQsIGludCAqdGV4dCwKLQkgICAgICAgaW50ICpkYXRhLCBpbnQgKnJlc2lkZW50KQordW5zaWduZWQgbG9uZyB0YXNrX3N0YXRtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJIHVuc2lnbmVkIGxvbmcgKnNoYXJlZCwgdW5zaWduZWQgbG9uZyAqdGV4dCwKKwkJCSB1bnNpZ25lZCBsb25nICpkYXRhLCB1bnNpZ25lZCBsb25nICpyZXNpZGVudCkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlzdHJ1Y3Qgdm1fcmVnaW9uICpyZWdpb247CiAJc3RydWN0IHJiX25vZGUgKnA7Ci0JaW50IHNpemUgPSBrb2Jqc2l6ZShtbSk7CisJdW5zaWduZWQgbG9uZyBzaXplID0ga29ianNpemUobW0pOwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCWZvciAocCA9IHJiX2ZpcnN0KCZtbS0+bW1fcmIpOyBwOyBwID0gcmJfbmV4dChwKSkgewpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMGZlZDQxZS4uODRiZWNkMyAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYworKysgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMzMsMTYgKzEzMywyMCBAQAogRVhQT1JUX1NZTUJPTChkcV9kYXRhX2xvY2spOwogCiB2b2lkIF9fcXVvdGFfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuYywKLQkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcmdzOwotCiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQl2YV9saXN0IGFyZ3M7CisJCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCiAJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiUXVvdGEgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLAotCQkgICAgICAgc2ItPnNfaWQsIGZ1bmMpOwotCQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JCXByaW50aygiXG4iKTsKKworCQl2YWYuZm10ID0gZm10OworCQl2YWYudmEgPSAmYXJnczsKKworCQlwcmludGsoS0VSTl9FUlIgIlF1b3RhIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXBWXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGZ1bmMsICZ2YWYpOworCiAJCXZhX2VuZChhcmdzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9xdW90YS9xdW90YV90cmVlLmMgYi9mcy9xdW90YS9xdW90YV90cmVlLmMKaW5kZXggOWU0ODg3NC4uZTQxYzFiZWNmIDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YV90cmVlLmMKKysrIGIvZnMvcXVvdGEvcXVvdGFfdHJlZS5jCkBAIC00NjgsOCArNDY4LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gcmVhZF9ibGsoaW5mbywgKmJsaywgYnVmKTsKIAlpZiAocmV0IDwgMCkgewotCQlxdW90YV9lcnJvcihkcXVvdC0+ZHFfc2IsICJDYW4ndCByZWFkIHF1b3RhIGRhdGEgIgotCQkJICAgICJibG9jayAldSIsIGJsayk7CisJCXF1b3RhX2Vycm9yKGRxdW90LT5kcV9zYiwgIkNhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldSIsCisJCQkgICAgKmJsayk7CiAJCWdvdG8gb3V0X2J1ZjsKIAl9CiAJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOwpAQCAtNDkzLDggKzQ5Myw5IEBACiAJCX0gZWxzZSB7CiAJCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgKmJsaywgYnVmKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXF1b3RhX2Vycm9yKGRxdW90LT5kcV9zYiwgIkNhbid0IHdyaXRlIHF1b3RhICIKLQkJCQkJICAgICJ0cmVlIGJsb2NrICV1IiwgYmxrKTsKKwkJCQlxdW90YV9lcnJvcihkcXVvdC0+ZHFfc2IsCisJCQkJCSAgICAiQ2FuJ3Qgd3JpdGUgcXVvdGEgdHJlZSBibG9jayAldSIsCisJCQkJCSAgICAqYmxrKTsKIAkJfQogCX0KIG91dF9idWY6CmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggNWQ0MzFiYS4uNTUyMGY4YSAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMzAsMTggKzMwLDkgQEAKIAogRVhQT1JUX1NZTUJPTChnZW5lcmljX3JvX2ZvcHMpOwogCi1zdGF0aWMgaW50Ci1fX25lZ2F0aXZlX2Zwb3NfY2hlY2soc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbmxpbmUgaW50IHVuc2lnbmVkX29mZnNldHMoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JLyoKLQkgKiBwb3Mgb3IgcG9zK2NvdW50IGlzIG5lZ2F0aXZlIGhlcmUsIGNoZWNrIG92ZXJmbG93LgotCSAqIHRvbyBiaWcgImNvdW50IiB3aWxsIGJlIGNhdWdodCBpbiByd192ZXJpZnlfYXJlYSgpLgotCSAqLwotCWlmICgocG9zIDwgMCkgJiYgKHBvcyArIGNvdW50IDwgcG9zKSkKLQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1VOU0lHTkVEX09GRlNFVCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1VOU0lHTkVEX09GRlNFVDsKIH0KIAogLyoqCkBAIC03NSw3ICs2Niw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChvZmZzZXQgPCAwICYmIF9fbmVnYXRpdmVfZnBvc19jaGVjayhmaWxlLCBvZmZzZXQsIDApKQorCWlmIChvZmZzZXQgPCAwICYmICF1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUyLDcgKzE0Myw3IEBACiAJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CiAJfQogCXJldHZhbCA9IC1FSU5WQUw7Ci0JaWYgKG9mZnNldCA+PSAwIHx8ICFfX25lZ2F0aXZlX2Zwb3NfY2hlY2soZmlsZSwgb2Zmc2V0LCAwKSkgeworCWlmIChvZmZzZXQgPj0gMCB8fCB1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKSB7CiAJCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKIAkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OwogCQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKQEAgLTI1Miw5ICsyNDMsMTMgQEAKIAlpZiAodW5saWtlbHkoKHNzaXplX3QpIGNvdW50IDwgMCkpCiAJCXJldHVybiByZXR2YWw7CiAJcG9zID0gKnBwb3M7Ci0JaWYgKHVubGlrZWx5KChwb3MgPCAwKSB8fCAobG9mZl90KSAocG9zICsgY291bnQpIDwgMCkpIHsKLQkJcmV0dmFsID0gX19uZWdhdGl2ZV9mcG9zX2NoZWNrKGZpbGUsIHBvcywgY291bnQpOwotCQlpZiAocmV0dmFsKQorCWlmICh1bmxpa2VseShwb3MgPCAwKSkgeworCQlpZiAoIXVuc2lnbmVkX29mZnNldHMoZmlsZSkpCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAoY291bnQgPj0gLXBvcykgLyogYm90aCB2YWx1ZXMgYXJlIGluIDAuLkxMT05HX01BWCAqLworCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJfSBlbHNlIGlmICh1bmxpa2VseSgobG9mZl90KSAocG9zICsgY291bnQpIDwgMCkpIHsKKwkJaWYgKCF1bnNpZ25lZF9vZmZzZXRzKGZpbGUpKQogCQkJcmV0dXJuIHJldHZhbDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCBkMzFiY2UxLi4zZWVhODU5IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC0yNTUxLDggKzI1NTEsNiBAQAogCXJlc3VsdCA9IDA7CiAKIAlpZiAoam91cm5hbC0+al9kZXZfYmQgIT0gTlVMTCkgewotCQlpZiAoam91cm5hbC0+al9kZXZfYmQtPmJkX2RldiAhPSBzdXBlci0+c19kZXYpCi0JCQliZF9yZWxlYXNlKGpvdXJuYWwtPmpfZGV2X2JkKTsKIAkJcmVzdWx0ID0gYmxrZGV2X3B1dChqb3VybmFsLT5qX2Rldl9iZCwgam91cm5hbC0+al9kZXZfbW9kZSk7CiAJCWpvdXJuYWwtPmpfZGV2X2JkID0gTlVMTDsKIAl9CkBAIC0yNTcwLDcgKzI1NjgsNyBAQAogewogCWludCByZXN1bHQ7CiAJZGV2X3QgamRldjsKLQlmbW9kZV90IGJsa2Rldl9tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWZtb2RlX3QgYmxrZGV2X21vZGUgPSBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAogCXJlc3VsdCA9IDA7CkBAIC0yNTg0LDcgKzI1ODIsMTAgQEAKIAogCS8qIHRoZXJlIGlzIG5vICJqZGV2IiBvcHRpb24gYW5kIGpvdXJuYWwgaXMgb24gc2VwYXJhdGUgZGV2aWNlICovCiAJaWYgKCghamRldl9uYW1lIHx8ICFqZGV2X25hbWVbMF0pKSB7Ci0JCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9ieV9kZXZudW0oamRldiwgYmxrZGV2X21vZGUpOworCQlpZiAoamRldiA9PSBzdXBlci0+c19kZXYpCisJCQlibGtkZXZfbW9kZSAmPSB+Rk1PREVfRVhDTDsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBibGtkZXZfZ2V0X2J5X2RldihqZGV2LCBibGtkZXZfbW9kZSwKKwkJCQkJCSAgICAgIGpvdXJuYWwpOwogCQlqb3VybmFsLT5qX2Rldl9tb2RlID0gYmxrZGV2X21vZGU7CiAJCWlmIChJU19FUlIoam91cm5hbC0+al9kZXZfYmQpKSB7CiAJCQlyZXN1bHQgPSBQVFJfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKTsKQEAgLTI1OTMsMjIgKzI1OTQsMTQgQEAKIAkJCQkJICJjYW5ub3QgaW5pdCBqb3VybmFsIGRldmljZSAnJXMnOiAlaSIsCiAJCQkJCSBfX2JkZXZuYW1lKGpkZXYsIGIpLCByZXN1bHQpOwogCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIGlmIChqZGV2ICE9IHN1cGVyLT5zX2RldikgewotCQkJcmVzdWx0ID0gYmRfY2xhaW0oam91cm5hbC0+al9kZXZfYmQsIGpvdXJuYWwpOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCWJsa2Rldl9wdXQoam91cm5hbC0+al9kZXZfYmQsIGJsa2Rldl9tb2RlKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCisJCX0gZWxzZSBpZiAoamRldiAhPSBzdXBlci0+c19kZXYpCiAJCQlzZXRfYmxvY2tzaXplKGpvdXJuYWwtPmpfZGV2X2JkLCBzdXBlci0+c19ibG9ja3NpemUpOwotCQl9CiAKIAkJcmV0dXJuIDA7CiAJfQogCiAJam91cm5hbC0+al9kZXZfbW9kZSA9IGJsa2Rldl9tb2RlOwotCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShqZGV2X25hbWUsCi0JCQkJCQlibGtkZXZfbW9kZSwgam91cm5hbCk7CisJam91cm5hbC0+al9kZXZfYmQgPSBibGtkZXZfZ2V0X2J5X3BhdGgoamRldl9uYW1lLCBibGtkZXZfbW9kZSwgam91cm5hbCk7CiAJaWYgKElTX0VSUihqb3VybmFsLT5qX2Rldl9iZCkpIHsKIAkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9iZCk7CiAJCWpvdXJuYWwtPmpfZGV2X2JkID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jIGIvZnMvcmVpc2VyZnMvcHJpbnRzLmMKaW5kZXggYWRiYzZmNS4uNDVkZTk4YiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvcHJpbnRzLmMKKysrIGIvZnMvcmVpc2VyZnMvcHJpbnRzLmMKQEAgLTU4NiwxMyArNTg2LDEzIEBACiAJdmFfbGlzdCBhcmdzOwogCWludCBtb2RlLCBmaXJzdCwgbGFzdDsKIAotCXZhX3N0YXJ0KGFyZ3MsIGJoKTsKLQogCWlmICghYmgpIHsKIAkJcHJpbnRrKCJwcmludF9ibG9jazogYnVmZmVyIGlzIE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCisJdmFfc3RhcnQoYXJncywgYmgpOworCiAJbW9kZSA9IHZhX2FyZyhhcmdzLCBpbnQpOwogCWZpcnN0ID0gdmFfYXJnKGFyZ3MsIGludCk7CiAJbGFzdCA9IHZhX2FyZyhhcmdzLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZnMvc2VsZWN0LmMgYi9mcy9zZWxlY3QuYwppbmRleCBiN2IxMGFhLi5lNTY1NjBkIDEwMDY0NAotLS0gYS9mcy9zZWxlY3QuYworKysgYi9mcy9zZWxlY3QuYwpAQCAtMzA2LDYgKzMwNiw4IEBACiAJCXJ0cy50dl9zZWMgPSBydHMudHZfbnNlYyA9IDA7CiAKIAlpZiAodGltZXZhbCkgeworCQlpZiAoc2l6ZW9mKHJ0dikgPiBzaXplb2YocnR2LnR2X3NlYykgKyBzaXplb2YocnR2LnR2X3VzZWMpKQorCQkJbWVtc2V0KCZydHYsIDAsIHNpemVvZihydHYpKTsKIAkJcnR2LnR2X3NlYyA9IHJ0cy50dl9zZWM7CiAJCXJ0di50dl91c2VjID0gcnRzLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDOwogCmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IGNlMmYwMjUuLjUwYTVkOTc4IDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtNjgyLDE5ICs2ODIsMTQgQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT51LmZpbGU7CiAJbG9mZl90IHBvcyA9IHNkLT5wb3M7Ci0JaW50IHJldCwgbW9yZTsKKwlpbnQgbW9yZTsKIAotCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7Ci0JaWYgKCFyZXQpIHsKLQkJbW9yZSA9IChzZC0+ZmxhZ3MgJiBTUExJQ0VfRl9NT1JFKSB8fCBzZC0+bGVuIDwgc2QtPnRvdGFsX2xlbjsKLQkJaWYgKGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+c2VuZHBhZ2UpCi0JCQlyZXQgPSBmaWxlLT5mX29wLT5zZW5kcGFnZShmaWxlLCBidWYtPnBhZ2UsIGJ1Zi0+b2Zmc2V0LAotCQkJCQkJICAgc2QtPmxlbiwgJnBvcywgbW9yZSk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU5WQUw7Ci0JfQorCWlmICghbGlrZWx5KGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+c2VuZHBhZ2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQ7CisJbW9yZSA9IChzZC0+ZmxhZ3MgJiBTUExJQ0VfRl9NT1JFKSB8fCBzZC0+bGVuIDwgc2QtPnRvdGFsX2xlbjsKKwlyZXR1cm4gZmlsZS0+Zl9vcC0+c2VuZHBhZ2UoZmlsZSwgYnVmLT5wYWdlLCBidWYtPm9mZnNldCwKKwkJCQkgICAgc2QtPmxlbiwgJnBvcywgbW9yZSk7CiB9CiAKIC8qCkBAIC03MjcsMTMgKzcyMiw2IEBACiAJdm9pZCAqZnNkYXRhOwogCWludCByZXQ7CiAKLQkvKgotCSAqIG1ha2Ugc3VyZSB0aGUgZGF0YSBpbiB0aGlzIGJ1ZmZlciBpcyB1cHRvZGF0ZQotCSAqLwotCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7Ci0JaWYgKHVubGlrZWx5KHJldCkpCi0JCXJldHVybiByZXQ7Ci0KIAlvZmZzZXQgPSBzZC0+cG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAogCXRoaXNfbGVuID0gc2QtPmxlbjsKQEAgLTgwNSwxMiArNzkzLDE3IEBACiAJCWlmIChzZC0+bGVuID4gc2QtPnRvdGFsX2xlbikKIAkJCXNkLT5sZW4gPSBzZC0+dG90YWxfbGVuOwogCi0JCXJldCA9IGFjdG9yKHBpcGUsIGJ1Ziwgc2QpOwotCQlpZiAocmV0IDw9IDApIHsKKwkJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJCWlmIChyZXQgPT0gLUVOT0RBVEEpCiAJCQkJcmV0ID0gMDsKIAkJCXJldHVybiByZXQ7CiAJCX0KKworCQlyZXQgPSBhY3RvcihwaXBlLCBidWYsIHNkKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldDsKKwogCQlidWYtPm9mZnNldCArPSByZXQ7CiAJCWJ1Zi0+bGVuIC09IHJldDsKIApAQCAtMTA0NCwxMCArMTAzNyw2IEBACiAJaW50IHJldDsKIAl2b2lkICpkYXRhOwogCi0JcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJZGF0YSA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAwKTsKIAlyZXQgPSBrZXJuZWxfd3JpdGUoc2QtPnUuZmlsZSwgZGF0YSArIGJ1Zi0+b2Zmc2V0LCBzZC0+bGVuLCBzZC0+cG9zKTsKIAlidWYtPm9wcy0+dW5tYXAocGlwZSwgYnVmLCBkYXRhKTsKQEAgLTE0OTUsMTAgKzE0ODQsNiBAQAogCWNoYXIgKnNyYzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJcmV0dXJuIHJldDsKLQogCS8qCiAJICogU2VlIGlmIHdlIGNhbiB1c2UgdGhlIGF0b21pYyBtYXBzLCBieSBwcmVmYXVsdGluZyBpbiB0aGUKIAkgKiBwYWdlcyBhbmQgZG9pbmcgYW4gYXRvbWljIGNvcHkKZGlmZiAtLWdpdCBhL2ZzL3N1cGVyLmMgYi9mcy9zdXBlci5jCmluZGV4IDgyM2UwNjEuLjRmNmEzNTcgMTAwNjQ0Ci0tLSBhL2ZzL3N1cGVyLmMKKysrIGIvZnMvc3VwZXIuYwpAQCAtNzY3LDEzICs3NjcsMTMgQEAKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKLQlmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEOworCWZtb2RlX3QgbW9kZSA9IEZNT0RFX1JFQUQgfCBGTU9ERV9FWENMOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIShmbGFncyAmIE1TX1JET05MWSkpCiAJCW1vZGUgfD0gRk1PREVfV1JJVEU7CiAKLQliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShkZXZfbmFtZSwgbW9kZSwgZnNfdHlwZSk7CisJYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChkZXZfbmFtZSwgbW9kZSwgZnNfdHlwZSk7CiAJaWYgKElTX0VSUihiZGV2KSkKIAkJcmV0dXJuIEVSUl9DQVNUKGJkZXYpOwogCkBAIC04MDIsMTMgKzgwMiwxMyBAQAogCiAJCS8qCiAJCSAqIHNfdW1vdW50IG5lc3RzIGluc2lkZSBiZF9tdXRleCBkdXJpbmcKLQkJICogX19pbnZhbGlkYXRlX2RldmljZSgpLiAgY2xvc2VfYmRldl9leGNsdXNpdmUoKQotCQkgKiBhY3F1aXJlcyBiZF9tdXRleCBhbmQgY2FuJ3QgYmUgY2FsbGVkIHVuZGVyCi0JCSAqIHNfdW1vdW50LiAgRHJvcCBzX3Vtb3VudCB0ZW1wb3JhcmlseS4gIFRoaXMgaXMgc2FmZQotCQkgKiBhcyB3ZSdyZSBob2xkaW5nIGFuIGFjdGl2ZSByZWZlcmVuY2UuCisJCSAqIF9faW52YWxpZGF0ZV9kZXZpY2UoKS4gIGJsa2Rldl9wdXQoKSBhY3F1aXJlcworCQkgKiBiZF9tdXRleCBhbmQgY2FuJ3QgYmUgY2FsbGVkIHVuZGVyIHNfdW1vdW50LiAgRHJvcAorCQkgKiBzX3Vtb3VudCB0ZW1wb3JhcmlseS4gIFRoaXMgaXMgc2FmZSBhcyB3ZSdyZQorCQkgKiBob2xkaW5nIGFuIGFjdGl2ZSByZWZlcmVuY2UuCiAJCSAqLwogCQl1cF93cml0ZSgmcy0+c191bW91bnQpOwotCQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCBtb2RlKTsKKwkJYmxrZGV2X3B1dChiZGV2LCBtb2RlKTsKIAkJZG93bl93cml0ZSgmcy0+c191bW91bnQpOwogCX0gZWxzZSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKQEAgLTgzMiw3ICs4MzIsNyBAQAogZXJyb3JfczoKIAllcnJvciA9IFBUUl9FUlIocyk7CiBlcnJvcl9iZGV2OgotCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGJkZXYsIG1vZGUpOworCWJsa2Rldl9wdXQoYmRldiwgbW9kZSk7CiBlcnJvcjoKIAlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiB9CkBAIC04NjMsNyArODYzLDggQEAKIAliZGV2LT5iZF9zdXBlciA9IE5VTEw7CiAJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzYik7CiAJc3luY19ibG9ja2RldihiZGV2KTsKLQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCBtb2RlKTsKKwlXQVJOX09OX09OQ0UoIShtb2RlICYgRk1PREVfRVhDTCkpOworCWJsa2Rldl9wdXQoYmRldiwgbW9kZSB8IEZNT0RFX0VYQ0wpOwogfQogCiBFWFBPUlRfU1lNQk9MKGtpbGxfYmxvY2tfc3VwZXIpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggNDQyZjM0Zi4uYzg3NjlkYzIgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2dyb3VwLmMKKysrIGIvZnMvc3lzZnMvZ3JvdXAuYwpAQCAtMTY1LDEwICsxNjUsNyBAQAogCXN0cnVjdCBhdHRyaWJ1dGUgKmNvbnN0ICphdHRyOwogCWludCBpOwogCi0JaWYgKGdycCkKLQkJZGlyX3NkID0gc3lzZnNfZ2V0X2RpcmVudChrb2JqLT5zZCwgTlVMTCwgZ3JwLT5uYW1lKTsKLQllbHNlCi0JCWRpcl9zZCA9IHN5c2ZzX2dldChrb2JqLT5zZCk7CisJZGlyX3NkID0gc3lzZnNfZ2V0X2RpcmVudChrb2JqLT5zZCwgTlVMTCwgZ3JwLT5uYW1lKTsKIAlpZiAoIWRpcl9zZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTE5NSwxMCArMTkyLDcgQEAKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpkaXJfc2Q7CiAJc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgKmF0dHI7CiAKLQlpZiAoZ3JwKQotCQlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwotCWVsc2UKLQkJZGlyX3NkID0gc3lzZnNfZ2V0KGtvYmotPnNkKTsKKwlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwogCWlmIChkaXJfc2QpIHsKIAkJZm9yIChhdHRyID0gZ3JwLT5hdHRyczsgKmF0dHI7ICsrYXR0cikKIAkJCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShkaXJfc2QsIE5VTEwsICgqYXR0ciktPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvaW5vZGUuYyBiL2ZzL3N5c2ZzL2lub2RlLmMKaW5kZXggMzBhYzI3My4uMGExMmViOCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvaW5vZGUuYworKysgYi9mcy9zeXNmcy9pbm9kZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlICJzeXNmcy5oIgpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3lzZnMuaCBiL2ZzL3N5c2ZzL3N5c2ZzLmgKaW5kZXggZmZhYWE4MS4uM2QyOGFmMzEgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL3N5c2ZzLmgKKysrIGIvZnMvc3lzZnMvc3lzZnMuaApAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3RfbnMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiBzdHJ1Y3Qgc3lzZnNfb3Blbl9kaXJlbnQ7CmRpZmYgLS1naXQgYS9mcy9zeXN2L25hbWVpLmMgYi9mcy9zeXN2L25hbWVpLmMKaW5kZXggYjVlNjhkYS4uYjQyN2IxMiAxMDA2NDQKLS0tIGEvZnMvc3lzdi9uYW1laS5jCisrKyBiL2ZzL3N5c3YvbmFtZWkuYwpAQCAtNDgsNyArNDgsNiBAQAogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKIAlpbm9fdCBpbm87CiAKLQlkX3NldF9kX29wKGRlbnRyeSwgZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3ApOwogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBTWVNWX05BTUVMRU4pCiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCWlubyA9IHN5c3ZfaW5vZGVfYnlfbmFtZShkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zdXBlci5jIGIvZnMvc3lzdi9zdXBlci5jCmluZGV4IDc2NzEyYWUuLmY2MGMxOTYgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3Yvc3VwZXIuYworKysgYi9mcy9zeXN2L3N1cGVyLmMKQEAgLTMzMiw2ICszMzIsMTAgQEAKIAlzYi0+c19tYWdpYyA9IFNZU1ZfTUFHSUNfQkFTRSArIHNiaS0+c190eXBlOwogCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLwogCXNiLT5zX29wID0gJnN5c3Zfc29wczsKKwlpZiAoc2JpLT5zX2ZvcmNlZF9ybykKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCWlmIChzYmktPnNfdHJ1bmNhdGUpCisJCXNiLT5zX2Rfb3AgPSAmc3lzdl9kZW50cnlfb3BlcmF0aW9uczsKIAlyb290X2lub2RlID0gc3lzdl9pZ2V0KHNiLCBTWVNWX1JPT1RfSU5PKTsKIAlpZiAoSVNfRVJSKHJvb3RfaW5vZGUpKSB7CiAJCXByaW50aygiU3lzViBGUzogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKQEAgLTM0MywxMCArMzQ3LDYgQEAKIAkJcHJpbnRrKCJTeXNWIEZTOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChzYmktPnNfZm9yY2VkX3JvKQotCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0JaWYgKHNiaS0+c190cnVuY2F0ZSkKLQkJZF9zZXRfZF9vcChzYi0+c19yb290LCAmc3lzdl9kZW50cnlfb3BlcmF0aW9ucyk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3VkZi9LY29uZmlnIGIvZnMvdWRmL0tjb25maWcKaW5kZXggZjhkZWYzYy4uMGUwZTk5YiAxMDA2NDQKLS0tIGEvZnMvdWRmL0tjb25maWcKKysrIGIvZnMvdWRmL0tjb25maWcKQEAgLTEsNiArMSw1IEBACiBjb25maWcgVURGX0ZTCiAJdHJpc3RhdGUgIlVERiBmaWxlIHN5c3RlbSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQktMICMgbmVlZHMgc2VyaW91cyB3b3JrIHRvIHJlbW92ZQogCXNlbGVjdCBDUkNfSVRVX1QKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBuZXcgZmlsZSBzeXN0ZW0gdXNlZCBvbiBzb21lIENELVJPTXMgYW5kIERWRHMuIFNheSBZIGlmCmRpZmYgLS1naXQgYS9mcy91ZGYvYmFsbG9jLmMgYi9mcy91ZGYvYmFsbG9jLmMKaW5kZXggYjYwOGVmYS4uMzA2ZWUzOSAxMDA2NDQKLS0tIGEvZnMvdWRmL2JhbGxvYy5jCisrKyBiL2ZzL3VkZi9iYWxsb2MuYwpAQCAtMTU3LDEwICsxNTcsOSBAQAogCQkJCXVkZl9kZWJ1ZygiYml0ICVsZCBhbHJlYWR5IHNldFxuIiwgYml0ICsgaSk7CiAJCQkJdWRmX2RlYnVnKCJieXRlPSUyeFxuIiwKIAkJCQkJKChjaGFyICopYmgtPmJfZGF0YSlbKGJpdCArIGkpID4+IDNdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdWRmX2FkZF9mcmVlX3NwYWNlKHNiLCBzYmktPnNfcGFydGl0aW9uLCAxKTsKIAkJCX0KIAkJfQorCQl1ZGZfYWRkX2ZyZWVfc3BhY2Uoc2IsIHNiaS0+c19wYXJ0aXRpb24sIGNvdW50KTsKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCQlpZiAob3ZlcmZsb3cpIHsKIAkJCWJsb2NrICs9IGNvdW50OwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2Rpci5jIGIvZnMvdWRmL2Rpci5jCmluZGV4IDUxNTUyYmYuLmViOGJmZTIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9kaXIuYworKysgYi9mcy91ZGYvZGlyLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAogI2luY2x1ZGUgInVkZl9pLmgiCkBAIC0xOTAsMTggKzE4OSwxNCBAQAogCXN0cnVjdCBpbm9kZSAqZGlyID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmVzdWx0OwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWlmIChmaWxwLT5mX3BvcyA9PSAwKSB7CiAJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmaWxwLT5mX3BvcywgZGlyLT5pX2lubywgRFRfRElSKSA8IDApIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWZpbHAtPmZfcG9zKys7CiAJfQogCiAJcmVzdWx0ID0gZG9fdWRmX3JlYWRkaXIoZGlyLCBmaWxwLCBmaWxsZGlyLCBkaXJlbnQpOwotCXVubG9ja19rZXJuZWwoKTsKICAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggNjZiOWU3ZS4uODljNzg0OCAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbXNldCAqLwogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CkBAIC0xMTQsNiArMTEzLDcgQEAKIAlzaXplX3QgY291bnQgPSBpb2NiLT5raV9sZWZ0OwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKKwlkb3duX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CiAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCiAJCQlwb3MgPSBpbm9kZS0+aV9zaXplOwpAQCAtMTI2LDYgKzEyNiw3IEBACiAJCQl1ZGZfZXhwYW5kX2ZpbGVfYWRpbmljYihpbm9kZSwgcG9zICsgY291bnQsICZlcnIpOwogCQkJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CiAJCQkJdWRmX2RlYnVnKCJ1ZGZfZXhwYW5kX2FkaW5pY2I6IGVycj0lZFxuIiwgZXJyKTsKKwkJCQl1cF93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xMzUsNiArMTM2LDcgQEAKIAkJCQlpaW5mby0+aV9sZW5BbGxvYyA9IGlub2RlLT5pX3NpemU7CiAJCX0KIAl9CisJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAogCXJldHZhbCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwcG9zKTsKIAlpZiAocmV0dmFsID4gMCkKQEAgLTE0OSw4ICsxNTEsNiBAQAogCWxvbmcgb2xkX2Jsb2NrLCBuZXdfYmxvY2s7CiAJaW50IHJlc3VsdCA9IC1FSU5WQUw7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJaWYgKGZpbGVfcGVybWlzc2lvbihmaWxwLCBNQVlfUkVBRCkgIT0gMCkgewogCQl1ZGZfZGVidWcoIm5vIHBlcm1pc3Npb24gdG8gYWNjZXNzIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKIAkJcmVzdWx0ID0gLUVQRVJNOwpAQCAtMTk2LDcgKzE5Niw2IEBACiAJfQogCiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIwNCwxMCArMjAzLDEwIEBACiB7CiAJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CiAJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQkJbG9ja19rZXJuZWwoKTsKKwkJZG93bl93cml0ZSgmVURGX0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAkJdWRmX2Rpc2NhcmRfcHJlYWxsb2MoaW5vZGUpOwogCQl1ZGZfdHJ1bmNhdGVfdGFpbF9leHRlbnQoaW5vZGUpOwotCQl1bmxvY2tfa2VybmVsKCk7CisJCXVwX3dyaXRlKCZVREZfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy91ZGYvaWFsbG9jLmMgYi9mcy91ZGYvaWFsbG9jLmMKaW5kZXggNzVkOTMwNC4uNmZiN2UwYSAxMDA2NDQKLS0tIGEvZnMvdWRmL2lhbGxvYy5jCisrKyBiL2ZzL3VkZi9pYWxsb2MuYwpAQCAtOTIsMjggKzkyLDE5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJaWYgKHNiaS0+c19sdmlkX2JoKSB7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZCA9Ci0JCQkoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICopCi0JCQlzYmktPnNfbHZpZF9iaC0+Yl9kYXRhOwotCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKmx2aWRpdSA9Ci0JCQkJCQkJdWRmX3NiX2x2aWRpdShzYmkpOwotCQlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7Ci0JCXVpbnQ2NF90IHVuaXF1ZUlEOwotCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKQotCQkJCShsdmlkLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOworCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKmx2aWRpdTsKKworCQlpaW5mby0+aV91bmlxdWUgPSBsdmlkX2dldF91bmlxdWVfaWQoc2IpOworCQltdXRleF9sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOworCQlsdmlkaXUgPSB1ZGZfc2JfbHZpZGl1KHNiaSk7CiAJCWlmIChTX0lTRElSKG1vZGUpKQogCQkJbGUzMl9hZGRfY3B1KCZsdmlkaXUtPm51bURpcnMsIDEpOwogCQllbHNlCiAJCQlsZTMyX2FkZF9jcHUoJmx2aWRpdS0+bnVtRmlsZXMsIDEpOwotCQlpaW5mby0+aV91bmlxdWUgPSB1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKLQkJaWYgKCEoKyt1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKSkKLQkJCXVuaXF1ZUlEICs9IDE2OwotCQlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKIAkJdWRmX3VwZGF0ZWRfbHZpZChzYik7CisJCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwogCiAJaW5vZGVfaW5pdF9vd25lcihpbm9kZSwgZGlyLCBtb2RlKTsKIApkaWZmIC0tZ2l0IGEvZnMvdWRmL2lub2RlLmMgYi9mcy91ZGYvaW5vZGUuYwppbmRleCBmYzQ4ZjM3Li5jNmEyZTc4IDEwMDY0NAotLS0gYS9mcy91ZGYvaW5vZGUuYworKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtMzEsNyArMzEsNiBAQAogCiAjaW5jbHVkZSAidWRmZGVjbC5oIgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KQEAgLTUxLDYgKzUwLDcgQEAKIHN0YXRpYyBtb2RlX3QgdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoc3RydWN0IGZpbGVFbnRyeSAqKTsKIHN0YXRpYyBpbnQgdWRmX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHVkZl9maWxsX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgaW50IHVkZl9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2dldGJsayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIGludCAqLAogCQkJCQlzZWN0b3JfdCAqLCBpbnQgKik7CkBAIC03OSw5ICs3OSw3IEBACiAJCXdhbnRfZGVsZXRlID0gMTsKIAkJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJCXVkZl90cnVuY2F0ZShpbm9kZSk7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCXVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIElTX1NZTkMoaW5vZGUpKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCX0KIAlpbnZhbGlkYXRlX2lub2RlX2J1ZmZlcnMoaW5vZGUpOwogCWVuZF93cml0ZWJhY2soaW5vZGUpOwpAQCAtOTcsOSArOTUsNyBAQAogCWtmcmVlKGlpbmZvLT5pX2V4dC5pX2RhdGEpOwogCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBOVUxMOwogCWlmICh3YW50X2RlbGV0ZSkgewotCQlsb2NrX2tlcm5lbCgpOwogCQl1ZGZfZnJlZV9pbm9kZShpbm9kZSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAl9CiB9CiAKQEAgLTMwMiwxMCArMjk4LDkgQEAKIAllcnIgPSAtRUlPOwogCW5ldyA9IDA7CiAJYmggPSBOVUxMOwotCi0JbG9ja19rZXJuZWwoKTsKLQogCWlpbmZvID0gVURGX0koaW5vZGUpOworCisJZG93bl93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCWlmIChibG9jayA9PSBpaW5mby0+aV9uZXh0X2FsbG9jX2Jsb2NrICsgMSkgewogCQlpaW5mby0+aV9uZXh0X2FsbG9jX2Jsb2NrKys7CiAJCWlpbmZvLT5pX25leHRfYWxsb2NfZ29hbCsrOwpAQCAtMzI0LDcgKzMxOSw3IEBACiAJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIHBoeXMpOwogCiBhYm9ydDoKLQl1bmxvY2tfa2VybmVsKCk7CisJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMDIyLDE2ICsxMDE3LDE2IEBACiAJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKIAkJcmV0dXJuOwogCi0JbG9ja19rZXJuZWwoKTsKIAlpaW5mbyA9IFVERl9JKGlub2RlKTsKIAlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKKwkJZG93bl93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCQlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDwKIAkJCQkodWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCiAJCQkJIGlub2RlLT5pX3NpemUpKSB7CiAJCQl1ZGZfZXhwYW5kX2ZpbGVfYWRpbmljYihpbm9kZSwgaW5vZGUtPmlfc2l6ZSwgJmVycik7CiAJCQlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJCQlpbm9kZS0+aV9zaXplID0gaWluZm8tPmlfbGVuQWxsb2M7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJCQkJcmV0dXJuOwogCQkJfSBlbHNlCiAJCQkJdWRmX3RydW5jYXRlX2V4dGVudHMoaW5vZGUpOwpAQCAtMTA0MiwxMCArMTAzNywxMyBAQAogCQkJCW9mZnNldCAtIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkpOwogCQkJaWluZm8tPmlfbGVuQWxsb2MgPSBpbm9kZS0+aV9zaXplOwogCQl9CisJCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJfSBlbHNlIHsKIAkJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplLAogCQkJCSAgICB1ZGZfZ2V0X2Jsb2NrKTsKKwkJZG93bl93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7CisJCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJfQogCiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CkBAIC0xMDUzLDcgKzEwNTEsNiBAQAogCQl1ZGZfc3luY19pbm9kZShpbm9kZSk7CiAJZWxzZQogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fdWRmX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTEyMDIsNiArMTE5OSw3IEBACiAJCXJldHVybjsKIAl9CiAKKwlyZWFkX2xvY2soJnNiaS0+c19jcmVkX2xvY2spOwogCWlub2RlLT5pX3VpZCA9IGxlMzJfdG9fY3B1KGZlLT51aWQpOwogCWlmIChpbm9kZS0+aV91aWQgPT0gLTEgfHwKIAkgICAgVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VJRF9JR05PUkUpIHx8CkBAIC0xMjE0LDEzICsxMjEyLDYgQEAKIAkgICAgVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX0dJRF9TRVQpKQogCQlpbm9kZS0+aV9naWQgPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2dpZDsKIAotCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOwotCWlmICghaW5vZGUtPmlfbmxpbmspCi0JCWlub2RlLT5pX25saW5rID0gMTsKLQotCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOwotCWlpbmZvLT5pX2xlbkV4dGVudHMgPSBpbm9kZS0+aV9zaXplOwotCiAJaWYgKGZlLT5pY2JUYWcuZmlsZVR5cGUgIT0gSUNCVEFHX0ZJTEVfVFlQRV9ESVJFQ1RPUlkgJiYKIAkJCXNiaS0+c19mbW9kZSAhPSBVREZfSU5WQUxJRF9NT0RFKQogCQlpbm9kZS0+aV9tb2RlID0gc2JpLT5zX2Ztb2RlOwpAQCAtMTIzMCw2ICsxMjIxLDE0IEBACiAJZWxzZQogCQlpbm9kZS0+aV9tb2RlID0gdWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoZmUpOwogCWlub2RlLT5pX21vZGUgJj0gfnNiaS0+c191bWFzazsKKwlyZWFkX3VubG9jaygmc2JpLT5zX2NyZWRfbG9jayk7CisKKwlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KGZlLT5maWxlTGlua0NvdW50KTsKKwlpZiAoIWlub2RlLT5pX25saW5rKQorCQlpbm9kZS0+aV9ubGluayA9IDE7CisKKwlpbm9kZS0+aV9zaXplID0gbGU2NF90b19jcHUoZmUtPmluZm9ybWF0aW9uTGVuZ3RoKTsKKwlpaW5mby0+aV9sZW5FeHRlbnRzID0gaW5vZGUtPmlfc2l6ZTsKIAogCWlmIChpaW5mby0+aV9lZmUgPT0gMCkgewogCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PApAQCAtMTM3MywxNiArMTM3MiwxMCBAQAogCiBpbnQgdWRmX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewotCWludCByZXQ7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IHVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB1ZGZfdXBkYXRlX2lub2RlKGlub2RlLCB3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCk7CiB9CiAKLWludCB1ZGZfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGludCB1ZGZfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXJldHVybiB1ZGZfdXBkYXRlX2lub2RlKGlub2RlLCAxKTsKIH0KQEAgLTIwNDgsNyArMjA0MSw3IEBACiAJc3RydWN0IGV4dGVudF9wb3NpdGlvbiBlcG9zID0ge307CiAJaW50IHJldDsKIAotCWxvY2tfa2VybmVsKCk7CisJZG93bl9yZWFkKCZVREZfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCiAJaWYgKGlub2RlX2JtYXAoaW5vZGUsIGJsb2NrLCAmZXBvcywgJmVsb2MsICZlbGVuLCAmb2Zmc2V0KSA9PQogCQkJCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQpAQCAtMjA1Niw3ICsyMDQ5LDcgQEAKIAllbHNlCiAJCXJldCA9IDA7CiAKLQl1bmxvY2tfa2VybmVsKCk7CisJdXBfcmVhZCgmVURGX0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAlicmVsc2UoZXBvcy5iaCk7CiAKIAlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1ZBUkNPTlYpKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL25hbWVpLmMgYi9mcy91ZGYvbmFtZWkuYwppbmRleCA2ZDhkYzAyLi4yYmUwZjllIDEwMDY0NAotLS0gYS9mcy91ZGYvbmFtZWkuYworKysgYi9mcy91ZGYvbmFtZWkuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjLWl0dS10Lmg+CkBAIC0yMjgsMTAgKzIyNyw4IEBACiAJCX0KIAogCQlpZiAoKGNmaS0+ZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfUEFSRU5UKSAmJgotCQkgICAgaXNkb3Rkb3QpIHsKLQkJCWJyZWxzZShlcG9zLmJoKTsKLQkJCXJldHVybiBmaTsKLQkJfQorCQkgICAgaXNkb3Rkb3QpCisJCQlnb3RvIG91dF9vazsKIAogCQlpZiAoIWxmaSkKIAkJCWNvbnRpbnVlOwpAQCAtMjYzLDcgKzI2MCw2IEBACiAJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IFVERl9OQU1FX0xFTiAtIDIpCiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCi0JbG9ja19rZXJuZWwoKTsKICNpZmRlZiBVREZfUkVDT1ZFUlkKIAkvKiB0ZW1wb3Jhcnkgc2hvcnRoYW5kIGZvciBzcGVjaWZ5aW5nIGZpbGVzIGJ5IGlub2RlIG51bWJlciAqLwogCWlmICghc3RybmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLkI9IiwgMykpIHsKQEAgLTI3NSw3ICsyNzEsNiBAQAogCQl9OwogCQlpbm9kZSA9IHVkZl9pZ2V0KGRpci0+aV9zYiwgbGIpOwogCQlpZiAoIWlub2RlKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAkJfQogCX0gZWxzZQpAQCAtMjkxLDExICsyODYsOSBAQAogCQlsb2MgPSBsZWxiX3RvX2NwdShjZmkuaWNiLmV4dExvY2F0aW9uKTsKIAkJaW5vZGUgPSB1ZGZfaWdldChkaXItPmlfc2IsICZsb2MpOwogCQlpZiAoIWlub2RlKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIAkJfQogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CkBAIC00NzYsMTUgKzQ2OSwxOSBAQAogCQkJCWZfcG9zID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cywgMSwgZXJyKTsKIAkJaWYgKCFmaWJoLT5lYmgpCiAJCQlnb3RvIG91dF9lcnI7CisJCS8qIEV4dGVudHMgY291bGQgaGF2ZSBiZWVuIG1lcmdlZCwgaW52YWxpZGF0ZSBvdXIgcG9zaXRpb24gKi8KKwkJYnJlbHNlKGVwb3MuYmgpOworCQllcG9zLmJoID0gTlVMTDsKKwkJZXBvcy5ibG9jayA9IGRpbmZvLT5pX2xvY2F0aW9uOworCQllcG9zLm9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChkaXIpOwogCiAJCWlmICghZmliaC0+c29mZnNldCkgewotCQkJaWYgKHVkZl9uZXh0X2FleHQoZGlyLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSA9PQotCQkJICAgIChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgewotCQkJCWJsb2NrID0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoKGVsZW4gLSAxKSA+PgorCQkJLyogRmluZCB0aGUgZnJlc2hseSBhbGxvY2F0ZWQgYmxvY2sgKi8KKwkJCXdoaWxlICh1ZGZfbmV4dF9hZXh0KGRpciwgJmVwb3MsICZlbG9jLCAmZWxlbiwgMSkgPT0KKwkJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCQkJOworCQkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+CiAJCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQl9IGVsc2UKLQkJCQlibG9jaysrOwotCiAJCQlicmVsc2UoZmliaC0+c2JoKTsKIAkJCWZpYmgtPnNiaCA9IGZpYmgtPmViaDsKIAkJCWZpID0gKHN0cnVjdCBmaWxlSWRlbnREZXNjICopKGZpYmgtPnNiaC0+Yl9kYXRhKTsKQEAgLTU2MiwxMCArNTU5LDggQEAKIAlpbnQgZXJyOwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIG1vZGUsICZlcnIpOwogCWlmICghaW5vZGUpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNTgzLDcgKzU3OCw2IEBACiAJCWlub2RlLT5pX25saW5rLS07CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CkBAIC01OTYsNyArNTkwLDYgQEAKIAlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCiAJCWJyZWxzZShmaWJoLmViaCk7CiAJYnJlbHNlKGZpYmguc2JoKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAogCXJldHVybiAwOwpAQCAtNjE0LDcgKzYwNyw2IEBACiAJaWYgKCFvbGRfdmFsaWRfZGV2KHJkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2tfa2VybmVsKCk7CiAJZXJyID0gLUVJTzsKIAlpbm9kZSA9IHVkZl9uZXdfaW5vZGUoZGlyLCBtb2RlLCAmZXJyKTsKIAlpZiAoIWlub2RlKQpAQCAtNjI3LDcgKzYxOSw2IEBACiAJCWlub2RlLT5pX25saW5rLS07CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CkBAIC02NDYsNyArNjM3LDYgQEAKIAllcnIgPSAwOwogCiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTY1OSw3ICs2NDksNiBAQAogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqZGluZm8gPSBVREZfSShkaXIpOwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKLQlsb2NrX2tlcm5lbCgpOwogCWVyciA9IC1FTUxJTks7CiAJaWYgKGRpci0+aV9ubGluayA+PSAoMjU2IDw8IHNpemVvZihkaXItPmlfbmxpbmspKSAtIDEpCiAJCWdvdG8gb3V0OwpAQCAtNzEyLDcgKzcwMSw2IEBACiAJZXJyID0gMDsKIAogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC03OTQsNyArNzgyLDYgQEAKIAlzdHJ1Y3Qga2VybmVsX2xiX2FkZHIgdGxvYzsKIAogCXJldHZhbCA9IC1FTk9FTlQ7Ci0JbG9ja19rZXJuZWwoKTsKIAlmaSA9IHVkZl9maW5kX2VudHJ5KGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmZmliaCwgJmNmaSk7CiAJaWYgKCFmaSkKIAkJZ290byBvdXQ7CkBAIC04MjYsNyArODEzLDYgQEAKIAlicmVsc2UoZmliaC5zYmgpOwogCiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTg0MCw3ICs4MjYsNiBAQAogCXN0cnVjdCBrZXJuZWxfbGJfYWRkciB0bG9jOwogCiAJcmV0dmFsID0gLUVOT0VOVDsKLQlsb2NrX2tlcm5lbCgpOwogCWZpID0gdWRmX2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZmaWJoLCAmY2ZpKTsKIAlpZiAoIWZpKQogCQlnb3RvIG91dDsKQEAgLTg3MCw3ICs4NTUsNiBAQAogCWJyZWxzZShmaWJoLnNiaCk7CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtODkwLDIxICs4NzQsMjEgQEAKIAlpbnQgYmxvY2s7CiAJdW5zaWduZWQgY2hhciAqbmFtZSA9IE5VTEw7CiAJaW50IG5hbWVsZW47Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIFNfSUZMTksgfCBTX0lSV1hVR08sICZlcnIpOwogCWlmICghaW5vZGUpCiAJCWdvdG8gb3V0OwogCisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJZG93bl93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCW5hbWUgPSBrbWFsbG9jKFVERl9OQU1FX0xFTiwgR0ZQX05PRlMpOwogCWlmICghbmFtZSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9ub19lbnRyeTsKIAl9CiAKLQlpaW5mbyA9IFVERl9JKGlub2RlKTsKIAlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9zeW1saW5rX2FvcHM7CiAJaW5vZGUtPmlfb3AgPSAmdWRmX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIApAQCAtOTEyLDcgKzg5Niw3IEBACiAJCXN0cnVjdCBrZXJuZWxfbGJfYWRkciBlbG9jOwogCQl1aW50MzJfdCBic2l6ZTsKIAotCQlibG9jayA9IHVkZl9uZXdfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLAorCQlibG9jayA9IHVkZl9uZXdfYmxvY2soc2IsIGlub2RlLAogCQkJCWlpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKIAkJCQlpaW5mby0+aV9sb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0sICZlcnIpOwogCQlpZiAoIWJsb2NrKQpAQCAtOTIzLDE3ICs5MDcsMTcgQEAKIAkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBibG9jazsKIAkJZWxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQogCQkJCWlpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKLQkJYnNpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWJzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCQlpaW5mby0+aV9sZW5FeHRlbnRzID0gYnNpemU7CiAJCXVkZl9hZGRfYWV4dChpbm9kZSwgJmVwb3MsICZlbG9jLCBic2l6ZSwgMCk7CiAJCWJyZWxzZShlcG9zLmJoKTsKIAotCQlibG9jayA9IHVkZl9nZXRfcGJsb2NrKGlub2RlLT5pX3NiLCBibG9jaywKKwkJYmxvY2sgPSB1ZGZfZ2V0X3BibG9jayhzYiwgYmxvY2ssCiAJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAogCQkJCTApOwotCQllcG9zLmJoID0gdWRmX3RnZXRibGsoaW5vZGUtPmlfc2IsIGJsb2NrKTsKKwkJZXBvcy5iaCA9IHVkZl90Z2V0YmxrKHNiLCBibG9jayk7CiAJCWxvY2tfYnVmZmVyKGVwb3MuYmgpOwotCQltZW1zZXQoZXBvcy5iaC0+Yl9kYXRhLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQltZW1zZXQoZXBvcy5iaC0+Yl9kYXRhLCAweDAwLCBic2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZXBvcy5iaCk7CiAJCXVubG9ja19idWZmZXIoZXBvcy5iaCk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGVwb3MuYmgsIGlub2RlKTsKQEAgLTk0MSw3ICs5MjUsNyBAQAogCX0gZWxzZQogCQllYSA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKyBpaW5mby0+aV9sZW5FQXR0cjsKIAotCWVvZmZzZXQgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpOworCWVvZmZzZXQgPSBzYi0+c19ibG9ja3NpemUgLSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpOwogCXBjID0gKHN0cnVjdCBwYXRoQ29tcG9uZW50ICopZWE7CiAKIAlpZiAoKnN5bW5hbWUgPT0gJy8nKSB7CkBAIC05ODEsNyArOTY1LDcgQEAKIAkJfQogCiAJCWlmIChwYy0+Y29tcG9uZW50VHlwZSA9PSA1KSB7Ci0JCQluYW1lbGVuID0gdWRmX3B1dF9maWxlbmFtZShpbm9kZS0+aV9zYiwgY29tcHN0YXJ0LCBuYW1lLAorCQkJbmFtZWxlbiA9IHVkZl9wdXRfZmlsZW5hbWUoc2IsIGNvbXBzdGFydCwgbmFtZSwKIAkJCQkJCSAgIHN5bW5hbWUgLSBjb21wc3RhcnQpOwogCQkJaWYgKCFuYW1lbGVuKQogCQkJCWdvdG8gb3V0X25vX2VudHJ5OwpAQCAtMTAxNSwyNyArOTk5LDE2IEBACiAJZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycik7CiAJaWYgKCFmaSkKIAkJZ290byBvdXRfbm9fZW50cnk7Ci0JY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoc2ItPnNfYmxvY2tzaXplKTsKIAljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoaWluZm8tPmlfbG9jYXRpb24pOwotCWJoID0gVURGX1NCKGlub2RlLT5pX3NiKS0+c19sdmlkX2JoOwotCWlmIChiaCkgewotCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQgPQotCQkJCShzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOwotCQlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7Ci0JCXVpbnQ2NF90IHVuaXF1ZUlEOwotCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKQotCQkJCWx2aWQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZTsKLQkJdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CisJaWYgKFVERl9TQihpbm9kZS0+aV9zYiktPnNfbHZpZF9iaCkgewogCQkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KLQkJCWNwdV90b19sZTMyKHVuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOwotCQlpZiAoISgrK3VuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpKQotCQkJdW5pcXVlSUQgKz0gMTY7Ci0JCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOwotCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQljcHVfdG9fbGUzMihsdmlkX2dldF91bmlxdWVfaWQoc2IpKTsKIAl9CiAJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKIAlpZiAoVURGX0koZGlyKS0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKIAkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQogCQlicmVsc2UoZmliaC5lYmgpOwogCWJyZWxzZShmaWJoLnNiaCk7CkBAIC0xMDQ0LDEwICsxMDE3LDEwIEBACiAKIG91dDoKIAlrZnJlZShuYW1lKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycjsKIAogb3V0X25vX2VudHJ5OgorCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogCWdvdG8gb3V0OwpAQCAtMTA2MCwzNiArMTAzMywyMCBAQAogCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CiAJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqZmk7CiAJaW50IGVycjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JbG9ja19rZXJuZWwoKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gKDI1NiA8PCBzaXplb2YoaW5vZGUtPmlfbmxpbmspKSAtIDEpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVNTElOSzsKIAl9CiAKIAlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKSB7Ci0JCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSShpbm9kZSktPmlfbG9jYXRpb24pOwotCWJoID0gVURGX1NCKGlub2RlLT5pX3NiKS0+c19sdmlkX2JoOwotCWlmIChiaCkgewotCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQgPQotCQkJCShzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOwotCQlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7Ci0JCXVpbnQ2NF90IHVuaXF1ZUlEOwotCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKQotCQkJCShsdmlkLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOwotCQl1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKKwlpZiAoVURGX1NCKGlub2RlLT5pX3NiKS0+c19sdmlkX2JoKSB7CiAJCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQotCQkJY3B1X3RvX2xlMzIodW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7Ci0JCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCi0JCQl1bmlxdWVJRCArPSAxNjsKLQkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWNwdV90b19sZTMyKGx2aWRfZ2V0X3VuaXF1ZV9pZChpbm9kZS0+aV9zYikpOwogCX0KIAl1ZGZfd3JpdGVfZmkoZGlyLCAmY2ZpLCBmaSwgJmZpYmgsIE5VTEwsIE5VTEwpOwogCWlmIChVREZfSShkaXIpLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQpAQCAtMTEwMyw3ICsxMDYwLDYgQEAKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlpaG9sZChpbm9kZSk7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMjQsNyArMTA4MCw2IEBACiAJc3RydWN0IGtlcm5lbF9sYl9hZGRyIHRsb2M7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICpvbGRfaWluZm8gPSBVREZfSShvbGRfaW5vZGUpOwogCi0JbG9ja19rZXJuZWwoKTsKIAlvZmkgPSB1ZGZfZmluZF9lbnRyeShvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLCAmb2ZpYmgsICZvY2ZpKTsKIAlpZiAob2ZpKSB7CiAJCWlmIChvZmliaC5zYmggIT0gb2ZpYmguZWJoKQpAQCAtMTI0OCw3ICsxMjAzLDYgQEAKIAkJCWJyZWxzZShuZmliaC5lYmgpOwogCQlicmVsc2UobmZpYmguc2JoKTsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEyNjEsNyArMTIxNSw2IEBACiAJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpOwogCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlmICghdWRmX2ZpbmRfZW50cnkoY2hpbGQtPmRfaW5vZGUsICZkb3Rkb3QsICZmaWJoLCAmY2ZpKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCkBAIC0xMjczLDExICsxMjI2LDkgQEAKIAlpbm9kZSA9IHVkZl9pZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCAmdGxvYyk7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXRfdW5sb2NrOwotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiBkX29idGFpbl9hbGlhcyhpbm9kZSk7CiBvdXRfdW5sb2NrOgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvdWRmL3BhcnRpdGlvbi5jIGIvZnMvdWRmL3BhcnRpdGlvbi5jCmluZGV4IDc0NWViMjAuLmE3MTA5MGUgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9wYXJ0aXRpb24uYworKysgYi9mcy91ZGYvcGFydGl0aW9uLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogdWludDMyX3QgdWRmX2dldF9wYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssCiAJCQl1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKQEAgLTE1OSw3ICsxNjAsOSBAQAogCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKIAl1MTYgcmVhbGxvY2F0aW9uVGFibGVMZW47CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgcmV0ID0gMDsKIAorCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19wYXJ0aXRpb25zOyBpKyspIHsKIAkJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwID0gJnNiaS0+c19wYXJ0bWFwc1tpXTsKIAkJaWYgKG9sZF9ibG9jayA+IG1hcC0+c19wYXJ0aXRpb25fcm9vdCAmJgpAQCAtMTc1LDggKzE3OCwxMCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCWlmICghc3QpCi0JCQkJcmV0dXJuIDE7CisJCQlpZiAoIXN0KSB7CisJCQkJcmV0ID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAogCQkJcmVhbGxvY2F0aW9uVGFibGVMZW4gPQogCQkJCQlsZTE2X3RvX2NwdShzdC0+cmVhbGxvY2F0aW9uVGFibGVMZW4pOwpAQCAtMjA3LDE0ICsyMTIsMTYgQEAKIAkJCQkJCSAgICAgKChvbGRfYmxvY2sgLQogCQkJCQkJCW1hcC0+c19wYXJ0aXRpb25fcm9vdCkgJgogCQkJCQkJICAgICAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKLQkJCQkJcmV0dXJuIDA7CisJCQkJCXJldCA9IDA7CisJCQkJCWdvdG8gb3V0OwogCQkJCX0gZWxzZSBpZiAob3JpZ0xvYyA9PSBwYWNrZXQpIHsKIAkJCQkJKm5ld19ibG9jayA9IGxlMzJfdG9fY3B1KAogCQkJCQkJCWVudHJ5LT5tYXBwZWRMb2NhdGlvbikgKwogCQkJCQkJICAgICAoKG9sZF9ibG9jayAtCiAJCQkJCQkJbWFwLT5zX3BhcnRpdGlvbl9yb290KSAmCiAJCQkJCQkgICAgIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOwotCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBvdXQ7CiAJCQkJfSBlbHNlIGlmIChvcmlnTG9jID4gcGFja2V0KQogCQkJCQlicmVhazsKIAkJCX0KQEAgLTI1MSwyMCArMjU4LDI0IEBACiAJCQkJCSAgICAgIHN0LT5tYXBFbnRyeVtrXS5tYXBwZWRMb2NhdGlvbikgKwogCQkJCQkoKG9sZF9ibG9jayAtIG1hcC0+c19wYXJ0aXRpb25fcm9vdCkgJgogCQkJCQkgKHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKSk7Ci0JCQkJcmV0dXJuIDA7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAotCQkJcmV0dXJuIDE7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CiAJCX0gLyogaWYgb2xkX2Jsb2NrICovCiAJfQogCiAJaWYgKGkgPT0gc2JpLT5zX3BhcnRpdGlvbnMpIHsKIAkJLyogb3V0c2lkZSBvZiBwYXJ0aXRpb25zICovCiAJCS8qIGZvciBub3csIGZhaWwgPSkgKi8KLQkJcmV0dXJuIDE7CisJCXJldCA9IDE7CiAJfQogCi0JcmV0dXJuIDA7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1aW50MzJfdCB1ZGZfdHJ5X3JlYWRfbWV0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1aW50MzJfdCBibG9jaywKZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKaW5kZXggYjUzOWQ1My4uN2IyN2IwNiAxMDA2NDQKLS0tIGEvZnMvdWRmL3N1cGVyLmMKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KICNpbmNsdWRlIDxsaW51eC9ubHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgpAQCAtMTM1LDYgKzEzNCw3IEBACiAJZWktPmlfbmV4dF9hbGxvY19ibG9jayA9IDA7CiAJZWktPmlfbmV4dF9hbGxvY19nb2FsID0gMDsKIAllaS0+aV9zdHJhdDQwOTYgPSAwOworCWluaXRfcndzZW0oJmVpLT5pX2RhdGFfc2VtKTsKIAogCXJldHVybiAmZWktPnZmc19pbm9kZTsKIH0KQEAgLTU3NCwxMyArNTc0LDE0IEBACiAJaWYgKCF1ZGZfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmdW9wdCwgdHJ1ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19rZXJuZWwoKTsKKwl3cml0ZV9sb2NrKCZzYmktPnNfY3JlZF9sb2NrKTsKIAlzYmktPnNfZmxhZ3MgPSB1b3B0LmZsYWdzOwogCXNiaS0+c191aWQgICA9IHVvcHQudWlkOwogCXNiaS0+c19naWQgICA9IHVvcHQuZ2lkOwogCXNiaS0+c191bWFzayA9IHVvcHQudW1hc2s7CiAJc2JpLT5zX2Ztb2RlID0gdW9wdC5mbW9kZTsKIAlzYmktPnNfZG1vZGUgPSB1b3B0LmRtb2RlOworCXdyaXRlX3VubG9jaygmc2JpLT5zX2NyZWRfbG9jayk7CiAKIAlpZiAoc2JpLT5zX2x2aWRfYmgpIHsKIAkJaW50IHdyaXRlX3JldiA9IGxlMTZfdG9fY3B1KHVkZl9zYl9sdmlkaXUoc2JpKS0+bWluVURGV3JpdGVSZXYpOwpAQCAtNTk3LDcgKzU5OCw2IEBACiAJCXVkZl9vcGVuX2x2aWQoc2IpOwogCiBvdXRfdW5sb2NrOgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTk2Niw5ICs5NjYsOSBAQAogCQkoc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIG5yX2dyb3Vwcyk7CiAKIAlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCi0JCWJpdG1hcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWJpdG1hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJZWxzZQotCQliaXRtYXAgPSB2bWFsbG9jKHNpemUpOyAvKiBUT0RPOiBnZXQgcmlkIG9mIHZtYWxsb2MgKi8KKwkJYml0bWFwID0gdnphbGxvYyhzaXplKTsgLyogVE9ETzogZ2V0IHJpZCBvZiB2emFsbG9jICovCiAKIAlpZiAoYml0bWFwID09IE5VTEwpIHsKIAkJdWRmX2Vycm9yKHNiLCBfX2Z1bmNfXywKQEAgLTk3Nyw3ICs5NzcsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltZW1zZXQoYml0bWFwLCAweDAwLCBzaXplKTsKIAliaXRtYXAtPnNfYmxvY2tfYml0bWFwID0gKHN0cnVjdCBidWZmZXJfaGVhZCAqKikoYml0bWFwICsgMSk7CiAJYml0bWFwLT5zX25yX2dyb3VwcyA9IG5yX2dyb3VwczsKIAlyZXR1cm4gYml0bWFwOwpAQCAtMTc4MSw2ICsxNzgwLDggQEAKIAogCWlmICghYmgpCiAJCXJldHVybjsKKworCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJbHZpZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOwogCWx2aWRpdSA9IHVkZl9zYl9sdmlkaXUoc2JpKTsKIApAQCAtMTc5Nyw2ICsxNzk4LDcgQEAKIAlsdmlkLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSgmbHZpZC0+ZGVzY1RhZyk7CiAJbWFya19idWZmZXJfZGlydHkoYmgpOwogCXNiaS0+c19sdmlkX2RpcnR5ID0gMDsKKwltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHVkZl9jbG9zZV9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC0xODA5LDYgKzE4MTEsNyBAQAogCWlmICghYmgpCiAJCXJldHVybjsKIAorCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJbHZpZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOwogCWx2aWRpdSA9IHVkZl9zYl9sdmlkaXUoc2JpKTsKIAlsdmlkaXUtPmltcElkZW50LmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7CkBAIC0xODI5LDYgKzE4MzIsMzQgQEAKIAlsdmlkLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSgmbHZpZC0+ZGVzY1RhZyk7CiAJbWFya19idWZmZXJfZGlydHkoYmgpOwogCXNiaS0+c19sdmlkX2RpcnR5ID0gMDsKKwltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7Cit9CisKK3U2NCBsdmlkX2dldF91bmlxdWVfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQ7CisJc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICpsdmhkOworCXU2NCB1bmlxdWVJRDsKKwl1NjQgcmV0OworCisJYmggPSBzYmktPnNfbHZpZF9iaDsKKwlpZiAoIWJoKQorCQlyZXR1cm4gMDsKKworCWx2aWQgPSAoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICopYmgtPmJfZGF0YTsKKwlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKWx2aWQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZTsKKworCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJcmV0ID0gdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CisJaWYgKCEoKyt1bmlxdWVJRCAmIDB4RkZGRkZGRkYpKQorCQl1bmlxdWVJRCArPSAxNjsKKwlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKKwltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgdWRmX3NiX2ZyZWVfYml0bWFwKHN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXApCkBAIC0xODg2LDggKzE5MTcsNiBAQAogCXN0cnVjdCBrZXJuZWxfbGJfYWRkciByb290ZGlyLCBmaWxlc2V0OwogCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCXVvcHQuZmxhZ3MgPSAoMSA8PCBVREZfRkxBR19VU0VfQURfSU5fSUNCKSB8ICgxIDw8IFVERl9GTEFHX1NUUklDVCk7CiAJdW9wdC51aWQgPSAtMTsKIAl1b3B0LmdpZCA9IC0xOwpAQCAtMTg5NiwxMCArMTkyNSw4IEBACiAJdW9wdC5kbW9kZSA9IFVERl9JTlZBTElEX01PREU7CiAKIAlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWRmX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNiaSkgewotCQl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAKQEAgLTE5MzYsNiArMTk2Myw3IEBACiAJc2JpLT5zX2Ztb2RlID0gdW9wdC5mbW9kZTsKIAlzYmktPnNfZG1vZGUgPSB1b3B0LmRtb2RlOwogCXNiaS0+c19ubHNfbWFwID0gdW9wdC5ubHNfbWFwOworCXJ3bG9ja19pbml0KCZzYmktPnNfY3JlZF9sb2NrKTsKIAogCWlmICh1b3B0LnNlc3Npb24gPT0gMHhGRkZGRkZGRikKIAkJc2JpLT5zX3Nlc3Npb24gPSB1ZGZfZ2V0X2xhc3Rfc2Vzc2lvbihzYik7CkBAIC0yMDQ1LDcgKzIwNzMsNiBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIAogZXJyb3Jfb3V0OgpAQCAtMjA2Niw3ICsyMDkzLDYgQEAKIAlrZnJlZShzYmkpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCi0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0yMTA1LDggKzIxMzEsNiBAQAogCiAJc2JpID0gVURGX1NCKHNiKTsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpZiAoc2JpLT5zX3ZhdF9pbm9kZSkKIAkJaXB1dChzYmktPnNfdmF0X2lub2RlKTsKIAlpZiAoc2JpLT5zX3BhcnRpdGlvbnMpCkBAIC0yMTIyLDggKzIxNDYsNiBAQAogCWtmcmVlKHNiaS0+c19wYXJ0bWFwcyk7CiAJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Ci0KLQl1bmxvY2tfa2VybmVsKCk7CiB9CiAKIHN0YXRpYyBpbnQgdWRmX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCkBAIC0yMTg2LDggKzIyMDgsNiBAQAogCXVpbnQxNl90IGlkZW50OwogCXN0cnVjdCBzcGFjZUJpdG1hcERlc2MgKmJtOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBiaXRtYXAtPnNfZXh0UG9zaXRpb247CiAJbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9TQihzYiktPnNfcGFydGl0aW9uOwogCWJoID0gdWRmX3JlYWRfcHRhZ2dlZChzYiwgJmxvYywgMCwgJmlkZW50KTsKQEAgLTIyMjQsMTAgKzIyNDQsNyBAQAogCQl9CiAJfQogCWJyZWxzZShiaCk7Ci0KIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7Ci0KIAlyZXR1cm4gYWNjdW07CiB9CiAKQEAgLTIyNDAsOCArMjI1Nyw3IEBACiAJaW50OF90IGV0eXBlOwogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvczsKIAotCWxvY2tfa2VybmVsKCk7Ci0KKwltdXRleF9sb2NrKCZVREZfU0Ioc2IpLT5zX2FsbG9jX211dGV4KTsKIAllcG9zLmJsb2NrID0gVURGX0kodGFibGUpLT5pX2xvY2F0aW9uOwogCWVwb3Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSk7CiAJZXBvcy5iaCA9IE5VTEw7CkBAIC0yMjUwLDggKzIyNjYsNyBAQAogCQlhY2N1bSArPSAoZWxlbiA+PiB0YWJsZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CiAKIAlicmVsc2UoZXBvcy5iaCk7Ci0KLQl1bmxvY2tfa2VybmVsKCk7CisJbXV0ZXhfdW5sb2NrKCZVREZfU0Ioc2IpLT5zX2FsbG9jX211dGV4KTsKIAogCXJldHVybiBhY2N1bTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3VkZi9zeW1saW5rLmMgYi9mcy91ZGYvc3ltbGluay5jCmluZGV4IDE2MDY0NzguLmIxZDQ0ODggMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9zeW1saW5rLmMKKysrIGIvZnMvdWRmL3N5bWxpbmsuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSAidWRmX2kuaCIKIApAQCAtNzgsMTMgKzc3LDE2IEBACiAJaW50IGVyciA9IC1FSU87CiAJdW5zaWduZWQgY2hhciAqcCA9IGttYXAocGFnZSk7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKKwl1aW50MzJfdCBwb3M7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlpbmZvID0gVURGX0koaW5vZGUpOworCXBvcyA9IHVkZl9ibG9ja19tYXAoaW5vZGUsIDApOworCisJZG93bl9yZWFkKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CiAJCXN5bWxpbmsgPSBpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHI7CiAJfSBlbHNlIHsKLQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgdWRmX2Jsb2NrX21hcChpbm9kZSwgMCkpOworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBwb3MpOwogCiAJCWlmICghYmgpCiAJCQlnb3RvIG91dDsKQEAgLTk1LDE0ICs5NywxNCBAQAogCXVkZl9wY190b19jaGFyKGlub2RlLT5pX3NiLCBzeW1saW5rLCBpbm9kZS0+aV9zaXplLCBwKTsKIAlicmVsc2UoYmgpOwogCi0JdW5sb2NrX2tlcm5lbCgpOworCXVwX3JlYWQoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJa3VubWFwKHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiAwOwogCiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOworCXVwX3JlYWQoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlTZXRQYWdlRXJyb3IocGFnZSk7CiAJa3VubWFwKHBhZ2UpOwogCXVubG9ja19wYWdlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZl9pLmggYi9mcy91ZGYvdWRmX2kuaAppbmRleCBlNThkMWRlLi5kMWJkMzFlIDEwMDY0NAotLS0gYS9mcy91ZGYvdWRmX2kuaAorKysgYi9mcy91ZGYvdWRmX2kuaApAQCAtMSw2ICsxLDE4IEBACiAjaWZuZGVmIF9VREZfSV9ICiAjZGVmaW5lIF9VREZfSV9ICiAKKy8qCisgKiBUaGUgaV9kYXRhX3NlbSBhbmQgaV9tdXRleCBzZXJ2ZSBmb3IgcHJvdGVjdGlvbiBvZiBhbGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKiBvZiBhIHJlZ3VsYXIgZmlsZXMgYW5kIHN5bWxpbmtzLiBUaGlzIGluY2x1ZGVzIGFsbCBleHRlbnRzIGJlbG9uZ2luZyB0bworICogdGhlIGZpbGUvc3ltbGluaywgYSBmYWN0IHdoZXRoZXIgZGF0YSBhcmUgaW4taW5vZGUgb3IgaW4gZXh0ZXJuYWwgZGF0YQorICogYmxvY2tzLCBwcmVhbGxvY2F0aW9uLCBnb2FsIGJsb2NrIGluZm9ybWF0aW9uLi4uIFdoZW4gZXh0ZW50cyBhcmUgcmVhZCwKKyAqIGlfbXV0ZXggb3IgaV9kYXRhX3NlbSBtdXN0IGJlIGhlbGQgKGZvciByZWFkaW5nIGlzIGVub3VnaCBpbiBjYXNlIG9mCisgKiBpX2RhdGFfc2VtKS4gV2hlbiBleHRlbnRzIGFyZSBjaGFuZ2VkLCBpX2RhdGFfc2VtIG11c3QgYmUgaGVsZCBmb3Igd3JpdGluZworICogYW5kIGFsc28gaV9tdXRleCBtdXN0IGJlIGhlbGQuCisgKgorICogRm9yIGRpcmVjdG9yaWVzIGlfbXV0ZXggaXMgdXNlZCBmb3IgYWxsIHRoZSBuZWNlc3NhcnkgcHJvdGVjdGlvbi4KKyAqLworCiBzdHJ1Y3QgdWRmX2lub2RlX2luZm8gewogCXN0cnVjdCB0aW1lc3BlYwkJaV9jcnRpbWU7CiAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBpbm9kZSAqLwpAQCAtMjEsNiArMzMsNyBAQAogCQlzdHJ1Y3QgbG9uZ19hZAkJKmlfbGFkOwogCQlfX3U4CQkqaV9kYXRhOwogCX0gaV9leHQ7CisJc3RydWN0IHJ3X3NlbWFwaG9yZQlpX2RhdGFfc2VtOwogCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CiB9OwogCmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX3NiLmggYi9mcy91ZGYvdWRmX3NiLmgKaW5kZXggZDExM2I3Mi4uNDg1OGMxOSAxMDA2NDQKLS0tIGEvZnMvdWRmL3VkZl9zYi5oCisrKyBiL2ZzL3VkZi91ZGZfc2IuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19MSU5VWF9VREZfU0JfSAogCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogLyogU2luY2UgVURGIDIuMDEgaXMgSVNPIDEzMzQ2IGJhc2VkLi4uICovCiAjZGVmaW5lIFVERl9TVVBFUl9NQUdJQwkJCTB4MTUwMTMzNDYKQEAgLTEyOCw2ICsxMjksOCBAQAogCXVpZF90CQkJc191aWQ7CiAJbW9kZV90CQkJc19mbW9kZTsKIAltb2RlX3QJCQlzX2Rtb2RlOworCS8qIExvY2sgcHJvdGVjdGluZyBjb25zaXN0ZW5jeSBvZiBhYm92ZSBwZXJtaXNzaW9uIHNldHRpbmdzICovCisJcndsb2NrX3QJCXNfY3JlZF9sb2NrOwogCiAJLyogUm9vdCBJbmZvICovCiAJc3RydWN0IHRpbWVzcGVjCQlzX3JlY29yZF90aW1lOwpAQCAtMTM5LDcgKzE0Miw3IEBACiAJX191MTYJCQlzX3VkZnJldjsKIAogCS8qIE1pc2NlbGxhbmVvdXMgZmxhZ3MgKi8KLQlfX3UzMgkJCXNfZmxhZ3M7CisJdW5zaWduZWQgbG9uZwkJc19mbGFnczsKIAogCS8qIEVuY29kaW5nIGluZm8gKi8KIAlzdHJ1Y3QgbmxzX3RhYmxlCSpzX25sc19tYXA7CkBAIC0xNjEsOCArMTY0LDE5IEBACiAKIGludCB1ZGZfY29tcHV0ZV9ucl9ncm91cHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIHBhcnRpdGlvbik7CiAKLSNkZWZpbmUgVURGX1FVRVJZX0ZMQUcoWCxZKQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzICYgKCAxIDw8IChZKSApICkKLSNkZWZpbmUgVURGX1NFVF9GTEFHKFgsWSkJCQkoIFVERl9TQihYKS0+c19mbGFncyB8PSAoIDEgPDwgKFkpICkgKQotI2RlZmluZSBVREZfQ0xFQVJfRkxBRyhYLFkpCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgJj0gfiggMSA8PCAoWSkgKSApCitzdGF0aWMgaW5saW5lIGludCBVREZfUVVFUllfRkxBRyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZykKK3sKKwlyZXR1cm4gdGVzdF9iaXQoZmxhZywgJlVERl9TQihzYiktPnNfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgVURGX1NFVF9GTEFHKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmbGFnKQoreworCXNldF9iaXQoZmxhZywgJlVERl9TQihzYiktPnNfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgVURGX0NMRUFSX0ZMQUcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWcpCit7CisJY2xlYXJfYml0KGZsYWcsICZVREZfU0Ioc2IpLT5zX2ZsYWdzKTsKK30KIAogI2VuZGlmIC8qIF9fTElOVVhfVURGX1NCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZkZWNsLmggYi9mcy91ZGYvdWRmZGVjbC5oCmluZGV4IDY5OTVhYjEuLmViYTQ4MjAgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZkZWNsLmgKKysrIGIvZnMvdWRmL3VkZmRlY2wuaApAQCAtMTExLDYgKzExMSw4IEBACiB9OwogCiAvKiBzdXBlci5jICovCisKK19fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSkKIGV4dGVybiB2b2lkIHVkZl93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCB1ZGZfdXBkYXRlZF9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMjMsNiArMTI1LDcgQEAKIAlzYi0+c19kaXJ0ID0gMTsKIAlVREZfU0Ioc2IpLT5zX2x2aWRfZGlydHkgPSAxOwogfQorZXh0ZXJuIHU2NCBsdmlkX2dldF91bmlxdWVfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIC8qIG5hbWVpLmMgKi8KIGV4dGVybiBpbnQgdWRmX3dyaXRlX2ZpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlSWRlbnREZXNjICosCkBAIC0xMzMsNyArMTM2LDYgQEAKIGV4dGVybiBsb25nIHVkZl9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogLyogaW5vZGUuYyAqLwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqdWRmX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrZXJuZWxfbGJfYWRkciAqKTsKLWV4dGVybiBpbnQgdWRmX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgdWRmX2V4cGFuZF9maWxlX2FkaW5pY2Ioc3RydWN0IGlub2RlICosIGludCwgaW50ICopOwogZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqdWRmX2V4cGFuZF9kaXJfYWRpbmljYihzdHJ1Y3QgaW5vZGUgKiwgaW50ICosIGludCAqKTsKIGV4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVkZl9icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQsIGludCAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvc3YuaCBiL2ZzL3hmcy9saW51eC0yLjYvc3YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYzdjMy4uMDAwMDAwMAotLS0gYS9mcy94ZnMvbGludXgtMi42L3N2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fWEZTX1NVUFBPUlRfU1ZfSF9fCi0jZGVmaW5lIF9fWEZTX1NVUFBPUlRfU1ZfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0vKgotICogU3luY2hyb25pc2F0aW9uIHZhcmlhYmxlcy4KLSAqCi0gKiAoUGFyYW1ldGVycyAicHJpIiwgInN2ZiIgYW5kICJydHMiIGFyZSBub3QgaW1wbGVtZW50ZWQpCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc3ZfcyB7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGVyczsKLX0gc3ZfdDsKLQotc3RhdGljIGlubGluZSB2b2lkIF9zdl93YWl0KHN2X3QgKnN2LCBzcGlubG9ja190ICpsb2NrKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZzdi0+d2FpdGVycywgJndhaXQpOwotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNwaW5fdW5sb2NrKGxvY2spOwotCi0Jc2NoZWR1bGUoKTsKLQotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdi0+d2FpdGVycywgJndhaXQpOwotfQotCi0jZGVmaW5lIHN2X2luaXQoc3YsZmxhZyxuYW1lKSBcCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHN2KS0+d2FpdGVycykKLSNkZWZpbmUgc3ZfZGVzdHJveShzdikgXAotCS8qTk9USElORyovCi0jZGVmaW5lIHN2X3dhaXQoc3YsIHByaSwgbG9jaywgcykgXAotCV9zdl93YWl0KHN2LCBsb2NrKQotI2RlZmluZSBzdl9zaWduYWwoc3YpIFwKLQl3YWtlX3VwKCYoc3YpLT53YWl0ZXJzKQotI2RlZmluZSBzdl9icm9hZGNhc3Qoc3YpIFwKLQl3YWtlX3VwX2FsbCgmKHN2KS0+d2FpdGVycykKLQotI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfU1ZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKaW5kZXggNjkxZjYxMi4uZWM3YmJiNSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpAQCAtMzgsMTUgKzM4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAKLS8qCi0gKiBUeXBlcyBvZiBJL08gZm9yIGJtYXAgY2x1c3RlcmluZyBhbmQgSS9PIGNvbXBsZXRpb24gdHJhY2tpbmcuCi0gKi8KLWVudW0gewotCUlPX1JFQUQsCS8qIG1hcHBpbmcgZm9yIGEgcmVhZCAqLwotCUlPX0RFTEFZLAkvKiBtYXBwaW5nIGNvdmVycyBkZWxhbGxvYyByZWdpb24gKi8KLQlJT19VTldSSVRURU4sCS8qIG1hcHBpbmcgY292ZXJzIGFsbG9jYXRlZCBidXQgdW5pbml0aWFsaXplZCBkYXRhICovCi0JSU9fTkVXCQkvKiBqdXN0IGFsbG9jYXRlZCAqLwotfTsKIAogLyoKICAqIFByaW1lIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgc2luY2UgYWRkcmVzcyBpcyB1c2VkIGFzIHRoZSBrZXkuCkBAIC0xODIsOSArMTczLDYgQEAKIAl4ZnNfaW5vZGVfdAkJKmlwID0gWEZTX0koaW9lbmQtPmlvX2lub2RlKTsKIAl4ZnNfZnNpemVfdAkJaXNpemU7CiAKLQlBU1NFUlQoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRyk7Ci0JQVNTRVJUKGlvZW5kLT5pb190eXBlICE9IElPX1JFQUQpOwotCiAJaWYgKHVubGlrZWx5KGlvZW5kLT5pb19lcnJvcikpCiAJCXJldHVybiAwOwogCkBAIC0yNDQsMTAgKzIzMiw4IEBACiAJICogV2UgbWlnaHQgaGF2ZSB0byB1cGRhdGUgdGhlIG9uLWRpc2sgZmlsZSBzaXplIGFmdGVyIGV4dGVuZGluZwogCSAqIHdyaXRlcy4KIAkgKi8KLQlpZiAoaW9lbmQtPmlvX3R5cGUgIT0gSU9fUkVBRCkgewotCQllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpb2VuZCk7Ci0JCUFTU0VSVCghZXJyb3IgfHwgZXJyb3IgPT0gRUFHQUlOKTsKLQl9CisJZXJyb3IgPSB4ZnNfc2V0ZmlsZXNpemUoaW9lbmQpOworCUFTU0VSVCghZXJyb3IgfHwgZXJyb3IgPT0gRUFHQUlOKTsKIAogCS8qCiAJICogSWYgd2UgZGlkbid0IGNvbXBsZXRlIHByb2Nlc3Npbmcgb2YgdGhlIGlvZW5kLCByZXF1ZXVlIGl0IHRvIHRoZQpAQCAtMzE4LDE0ICszMDQsNjMgQEAKIHhmc19tYXBfYmxvY2tzKAogCXN0cnVjdCBpbm9kZQkJKmlub2RlLAogCWxvZmZfdAkJCW9mZnNldCwKLQlzc2l6ZV90CQkJY291bnQsCiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJKmltYXAsCi0JaW50CQkJZmxhZ3MpCisJaW50CQkJdHlwZSwKKwlpbnQJCQlub25ibG9ja2luZykKIHsKLQlpbnQJCQlubWFwcyA9IDE7Ci0JaW50CQkJbmV3ID0gMDsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXNzaXplX3QJCQljb3VudCA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiLCBlbmRfZnNiOworCWludAkJCWVycm9yID0gMDsKKwlpbnQJCQlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9FTlRJUkU7CisJaW50CQkJbmltYXBzID0gMTsKIAotCXJldHVybiAteGZzX2lvbWFwKFhGU19JKGlub2RlKSwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIGltYXAsICZubWFwcywgJm5ldyk7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOworCisJaWYgKHR5cGUgPT0gSU9fVU5XUklUVEVOKQorCQlibWFwaV9mbGFncyB8PSBYRlNfQk1BUElfSUdTVEFURTsKKworCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX1NIQVJFRCkpIHsKKwkJaWYgKG5vbmJsb2NraW5nKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUFHQUlOKTsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwl9CisKKwlBU1NFUlQoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgfHwKKwkgICAgICAgKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpOworCUFTU0VSVChvZmZzZXQgPD0gbXAtPm1fbWF4aW9mZnNldCk7CisKKwlpZiAob2Zmc2V0ICsgY291bnQgPiBtcC0+bV9tYXhpb2Zmc2V0KQorCQljb3VudCA9IG1wLT5tX21heGlvZmZzZXQgLSBvZmZzZXQ7CisJZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClvZmZzZXQgKyBjb3VudCk7CisJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJICBibWFwaV9mbGFncywgIE5VTEwsIDAsIGltYXAsICZuaW1hcHMsIE5VTEwpOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1YRlNfRVJST1IoZXJyb3IpOworCisJaWYgKHR5cGUgPT0gSU9fREVMQUxMT0MgJiYKKwkgICAgKCFuaW1hcHMgfHwgaXNudWxsc3RhcnRibG9jayhpbWFwLT5icl9zdGFydGJsb2NrKSkpIHsKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoaXAsIG9mZnNldCwgY291bnQsIGltYXApOworCQlpZiAoIWVycm9yKQorCQkJdHJhY2VfeGZzX21hcF9ibG9ja3NfYWxsb2MoaXAsIG9mZnNldCwgY291bnQsIHR5cGUsIGltYXApOworCQlyZXR1cm4gLVhGU19FUlJPUihlcnJvcik7CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAodHlwZSA9PSBJT19VTldSSVRURU4pIHsKKwkJQVNTRVJUKG5pbWFwcyk7CisJCUFTU0VSVChpbWFwLT5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKTsKKwkJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwl9CisjZW5kaWYKKwlpZiAobmltYXBzKQorCQl0cmFjZV94ZnNfbWFwX2Jsb2Nrc19mb3VuZChpcCwgb2Zmc2V0LCBjb3VudCwgdHlwZSwgaW1hcCk7CisJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTM4MCwyNiArNDE1LDE4IEBACiAKIAlzdWJtaXRfYmlvKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMID8KIAkJICAgV1JJVEVfU1lOQ19QTFVHIDogV1JJVEUsIGJpbyk7Ci0JQVNTRVJUKCFiaW9fZmxhZ2dlZChiaW8sIEJJT19FT1BOT1RTVVBQKSk7Ci0JYmlvX3B1dChiaW8pOwogfQogCiBTVEFUSUMgc3RydWN0IGJpbyAqCiB4ZnNfYWxsb2NfaW9lbmRfYmlvKAogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgpCiB7Ci0Jc3RydWN0IGJpbwkJKmJpbzsKIAlpbnQJCQludmVjcyA9IGJpb19nZXRfbnJfdmVjcyhiaC0+Yl9iZGV2KTsKLQotCWRvIHsKLQkJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBudmVjcyk7Ci0JCW52ZWNzID4+PSAxOwotCX0gd2hpbGUgKCFiaW8pOworCXN0cnVjdCBiaW8JCSpiaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG52ZWNzKTsKIAogCUFTU0VSVChiaW8tPmJpX3ByaXZhdGUgPT0gTlVMTCk7CiAJYmlvLT5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CiAJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKLQliaW9fZ2V0KGJpbyk7CiAJcmV0dXJuIGJpbzsKIH0KIApAQCAtNDcwLDkgKzQ5Nyw4IEBACiAJLyogUGFzcyAxIC0gc3RhcnQgd3JpdGViYWNrICovCiAJZG8gewogCQluZXh0ID0gaW9lbmQtPmlvX2xpc3Q7Ci0JCWZvciAoYmggPSBpb2VuZC0+aW9fYnVmZmVyX2hlYWQ7IGJoOyBiaCA9IGJoLT5iX3ByaXZhdGUpIHsKKwkJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gYmgtPmJfcHJpdmF0ZSkKIAkJCXhmc19zdGFydF9idWZmZXJfd3JpdGViYWNrKGJoKTsKLQkJfQogCX0gd2hpbGUgKChpb2VuZCA9IG5leHQpICE9IE5VTEwpOwogCiAJLyogUGFzcyAyIC0gc3VibWl0IEkvTyAqLwpAQCAtNjAwLDExNyArNjI2LDEzIEBACiAJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOwogCUFTU0VSVChpbWFwLT5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyk7CiAKLQlsb2NrX2J1ZmZlcihiaCk7CiAJeGZzX21hcF9idWZmZXIoaW5vZGUsIGJoLCBpbWFwLCBvZmZzZXQpOwotCWJoLT5iX2JkZXYgPSB4ZnNfZmluZF9iZGV2X2Zvcl9pbm9kZShpbm9kZSk7CiAJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwogCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CiAJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CiB9CiAKIC8qCi0gKiBMb29rIGZvciBhIHBhZ2UgYXQgaW5kZXggdGhhdCBpcyBzdWl0YWJsZSBmb3IgY2x1c3RlcmluZy4KLSAqLwotU1RBVElDIHVuc2lnbmVkIGludAoteGZzX3Byb2JlX3BhZ2UoCi0Jc3RydWN0IHBhZ2UJCSpwYWdlLAotCXVuc2lnbmVkIGludAkJcGdfb2Zmc2V0KQotewotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwotCWludAkJCXJldCA9IDA7Ci0KLQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQYWdlRGlydHkocGFnZSkpCi0JCXJldHVybiAwOwotCWlmICghcGFnZS0+bWFwcGluZykKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQlyZXR1cm4gMDsKLQotCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLQlkbyB7Ci0JCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKLQkJCWJyZWFrOwotCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKQotCQkJYnJlYWs7Ci0JCXJldCArPSBiaC0+Yl9zaXplOwotCQlpZiAocmV0ID49IHBnX29mZnNldCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1TVEFUSUMgc2l6ZV90Ci14ZnNfcHJvYmVfY2x1c3RlcigKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKLQlzdHJ1Y3QgcGFnZQkJKnN0YXJ0cGFnZSwKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCkKLXsKLQlzdHJ1Y3QgcGFnZXZlYwkJcHZlYzsKLQlwZ29mZl90CQkJdGluZGV4LCB0bGFzdCwgdGxvZmY7Ci0Jc2l6ZV90CQkJdG90YWwgPSAwOwotCWludAkJCWRvbmUgPSAwLCBpOwotCi0JLyogRmlyc3Qgc3VtIGZvcndhcmRzIGluIHRoaXMgcGFnZSAqLwotCWRvIHsKLQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpIHx8ICFidWZmZXJfbWFwcGVkKGJoKSkKLQkJCXJldHVybiB0b3RhbDsKLQkJdG90YWwgKz0gYmgtPmJfc2l6ZTsKLQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwotCi0JLyogaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBzdW0gZm9yd2FyZHMgaW4gZm9sbG93aW5nIHBhZ2VzICovCi0JdGxhc3QgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQl0aW5kZXggPSBzdGFydHBhZ2UtPmluZGV4ICsgMTsKLQotCS8qIFBydW5lIHRoaXMgYmFjayB0byBhdm9pZCBwYXRob2xvZ2ljYWwgYmVoYXZpb3IgKi8KLQl0bG9mZiA9IG1pbih0bGFzdCwgc3RhcnRwYWdlLT5pbmRleCArIDY0KTsKLQotCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0Jd2hpbGUgKCFkb25lICYmIHRpbmRleCA8PSB0bG9mZikgewotCQl1bnNpZ25lZCBsZW4gPSBtaW5fdChwZ29mZl90LCBQQUdFVkVDX1NJWkUsIHRsYXN0IC0gdGluZGV4ICsgMSk7Ci0KLQkJaWYgKCFwYWdldmVjX2xvb2t1cCgmcHZlYywgaW5vZGUtPmlfbWFwcGluZywgdGluZGV4LCBsZW4pKQotCQkJYnJlYWs7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKLQkJCXNpemVfdCBwZ19vZmZzZXQsIHBnX2xlbiA9IDA7Ci0KLQkJCWlmICh0aW5kZXggPT0gdGxhc3QpIHsKLQkJCQlwZ19vZmZzZXQgPQotCQkJCSAgICBpX3NpemVfcmVhZChpbm9kZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JCQkJaWYgKCFwZ19vZmZzZXQpIHsKLQkJCQkJZG9uZSA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXBnX29mZnNldCA9IFBBR0VfQ0FDSEVfU0laRTsKLQotCQkJaWYgKHBhZ2UtPmluZGV4ID09IHRpbmRleCAmJiB0cnlsb2NrX3BhZ2UocGFnZSkpIHsKLQkJCQlwZ19sZW4gPSB4ZnNfcHJvYmVfcGFnZShwYWdlLCBwZ19vZmZzZXQpOwotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJfQotCi0JCQlpZiAoIXBnX2xlbikgewotCQkJCWRvbmUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQl0b3RhbCArPSBwZ19sZW47Ci0JCQl0aW5kZXgrKzsKLQkJfQotCi0JCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQotCXJldHVybiB0b3RhbDsKLX0KLQotLyoKICAqIFRlc3QgaWYgYSBnaXZlbiBwYWdlIGlzIHN1aXRhYmxlIGZvciB3cml0aW5nIGFzIHBhcnQgb2YgYW4gdW53cml0dGVuCiAgKiBvciBkZWxheWVkIGFsbG9jYXRlIGV4dGVudC4KICAqLwpAQCAtNzMxLDkgKzY1Myw5IEBACiAJCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpCiAJCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IElPX1VOV1JJVFRFTik7CiAJCQllbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKQotCQkJCWFjY2VwdGFibGUgPSAodHlwZSA9PSBJT19ERUxBWSk7CisJCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IElPX0RFTEFMTE9DKTsKIAkJCWVsc2UgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX21hcHBlZChiaCkpCi0JCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IElPX05FVyk7CisJCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IElPX09WRVJXUklURSk7CiAJCQllbHNlCiAJCQkJYnJlYWs7CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CkBAIC03NTgsOCArNjgwLDcgQEAKIAlsb2ZmX3QJCQl0aW5kZXgsCiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJKmltYXAsCiAJeGZzX2lvZW5kX3QJCSoqaW9lbmRwLAotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAotCWludAkJCWFsbF9iaCkKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKIAl4ZnNfb2ZmX3QJCWVuZF9vZmZzZXQ7CkBAIC04MTQsMzcgKzczNSwzMCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSkgeworCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSB8fAorCQkgICAgYnVmZmVyX21hcHBlZChiaCkpIHsKIAkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKIAkJCQl0eXBlID0gSU9fVU5XUklUVEVOOworCQkJZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkKKwkJCQl0eXBlID0gSU9fREVMQUxMT0M7CiAJCQllbHNlCi0JCQkJdHlwZSA9IElPX0RFTEFZOworCQkJCXR5cGUgPSBJT19PVkVSV1JJVEU7CiAKIAkJCWlmICgheGZzX2ltYXBfdmFsaWQoaW5vZGUsIGltYXAsIG9mZnNldCkpIHsKIAkJCQlkb25lID0gMTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOwotCQkJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKLQotCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCBpbWFwLCBvZmZzZXQpOworCQkJbG9ja19idWZmZXIoYmgpOworCQkJaWYgKHR5cGUgIT0gSU9fT1ZFUldSSVRFKQorCQkJCXhmc19tYXBfYXRfb2Zmc2V0KGlub2RlLCBiaCwgaW1hcCwgb2Zmc2V0KTsKIAkJCXhmc19hZGRfdG9faW9lbmQoaW5vZGUsIGJoLCBvZmZzZXQsIHR5cGUsCiAJCQkJCSBpb2VuZHAsIGRvbmUpOwogCiAJCQlwYWdlX2RpcnR5LS07CiAJCQljb3VudCsrOwogCQl9IGVsc2UgewotCQkJdHlwZSA9IElPX05FVzsKLQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBhbGxfYmgpIHsKLQkJCQlsb2NrX2J1ZmZlcihiaCk7Ci0JCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwKLQkJCQkJCXR5cGUsIGlvZW5kcCwgZG9uZSk7Ci0JCQkJY291bnQrKzsKLQkJCQlwYWdlX2RpcnR5LS07Ci0JCQl9IGVsc2UgewotCQkJCWRvbmUgPSAxOwotCQkJfQorCQkJZG9uZSA9IDE7CiAJCX0KIAl9IHdoaWxlIChvZmZzZXQgKz0gbGVuLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwogCkBAIC04NzYsNyArNzkwLDYgQEAKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCwKIAl4ZnNfaW9lbmRfdAkJKippb2VuZHAsCiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCi0JaW50CQkJYWxsX2JoLAogCXBnb2ZmX3QJCQl0bGFzdCkKIHsKIAlzdHJ1Y3QgcGFnZXZlYwkJcHZlYzsKQEAgLTg5MSw3ICs4MDQsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CiAJCQlkb25lID0geGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcHZlYy5wYWdlc1tpXSwgdGluZGV4KyssCi0JCQkJCWltYXAsIGlvZW5kcCwgd2JjLCBhbGxfYmgpOworCQkJCQlpbWFwLCBpb2VuZHAsIHdiYyk7CiAJCQlpZiAoZG9uZSkKIAkJCQlicmVhazsKIAkJfQpAQCAtOTM1LDcgKzg0OCw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKmhlYWQ7CiAJbG9mZl90CQkJb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CiAKLQlpZiAoIXhmc19pc19kZWxheWVkX3BhZ2UocGFnZSwgSU9fREVMQVkpKQorCWlmICgheGZzX2lzX2RlbGF5ZWRfcGFnZShwYWdlLCBJT19ERUxBTExPQykpCiAJCWdvdG8gb3V0X2ludmFsaWRhdGU7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCkBAIC0xMDAyLDEwICs5MTUsMTAgQEAKIAl1bnNpZ25lZCBpbnQJCXR5cGU7CiAJX191aW50NjRfdCAgICAgICAgICAgICAgZW5kX29mZnNldDsKIAlwZ29mZl90ICAgICAgICAgICAgICAgICBlbmRfaW5kZXgsIGxhc3RfaW5kZXg7Ci0Jc3NpemVfdAkJCXNpemUsIGxlbjsKLQlpbnQJCQlmbGFncywgZXJyLCBpbWFwX3ZhbGlkID0gMCwgdXB0b2RhdGUgPSAxOworCXNzaXplX3QJCQlsZW47CisJaW50CQkJZXJyLCBpbWFwX3ZhbGlkID0gMCwgdXB0b2RhdGUgPSAxOwogCWludAkJCWNvdW50ID0gMDsKLQlpbnQJCQlhbGxfYmggPSAwOworCWludAkJCW5vbmJsb2NraW5nID0gMDsKIAogCXRyYWNlX3hmc193cml0ZXBhZ2UoaW5vZGUsIHBhZ2UsIDApOwogCkBAIC0xMDU2LDEwICs5NjksMTQgQEAKIAogCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAlvZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKTsKLQlmbGFncyA9IEJNQVBJX1JFQUQ7Ci0JdHlwZSA9IElPX05FVzsKKwl0eXBlID0gSU9fT1ZFUldSSVRFOworCisJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJiB3YmMtPm5vbmJsb2NraW5nKQorCQlub25ibG9ja2luZyA9IDE7CiAKIAlkbyB7CisJCWludCBuZXdfaW9lbmQgPSAwOworCiAJCWlmIChvZmZzZXQgPj0gZW5kX29mZnNldCkKIAkJCWJyZWFrOwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCkBAIC0xMDc2LDkwICs5OTMsNTQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKGltYXBfdmFsaWQpCi0JCQlpbWFwX3ZhbGlkID0geGZzX2ltYXBfdmFsaWQoaW5vZGUsICZpbWFwLCBvZmZzZXQpOwotCi0JCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQlpbnQgbmV3X2lvZW5kID0gMDsKLQotCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYSByZWFkLW9ubHkgaW9tYXAKLQkJCSAqLwotCQkJaWYgKGZsYWdzID09IEJNQVBJX1JFQUQpCi0JCQkJaW1hcF92YWxpZCA9IDA7Ci0KLQkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgeworCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpIHsKKwkJCWlmICh0eXBlICE9IElPX1VOV1JJVFRFTikgewogCQkJCXR5cGUgPSBJT19VTldSSVRURU47Ci0JCQkJZmxhZ3MgPSBCTUFQSV9XUklURSB8IEJNQVBJX0lHTlNUQVRFOwotCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7Ci0JCQkJdHlwZSA9IElPX0RFTEFZOwotCQkJCWZsYWdzID0gQk1BUElfQUxMT0NBVEU7Ci0KLQkJCQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKQotCQkJCQlmbGFncyB8PSBCTUFQSV9UUllMT0NLOworCQkJCWltYXBfdmFsaWQgPSAwOwogCQkJfQotCi0JCQlpZiAoIWltYXBfdmFsaWQpIHsKLQkJCQkvKgotCQkJCSAqIElmIHdlIGRpZG4ndCBoYXZlIGEgdmFsaWQgbWFwcGluZyB0aGVuIHdlCi0JCQkJICogbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBwdXQgdGhlIG5ldyBtYXBwaW5nCi0JCQkJICogaW4gYSBuZXcgaW9lbmQgc3RydWN0dXJlLiBUaGlzIG5lZWRzIHRvIGJlCi0JCQkJICogZG9uZSB0byBlbnN1cmUgdGhhdCB0aGUgaW9lbmRzIGNvcnJlY3RseQotCQkJCSAqIHJlZmxlY3QgdGhlIGJsb2NrIG1hcHBpbmdzIGF0IGlvIGNvbXBsZXRpb24KLQkJCQkgKiBmb3IgdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uLgotCQkJCSAqLwotCQkJCW5ld19pb2VuZCA9IDE7Ci0JCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgbGVuLAotCQkJCQkJJmltYXAsIGZsYWdzKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWltYXBfdmFsaWQgPSB4ZnNfaW1hcF92YWxpZChpbm9kZSwgJmltYXAsCi0JCQkJCQkJICAgIG9mZnNldCk7Ci0JCQl9Ci0JCQlpZiAoaW1hcF92YWxpZCkgewotCQkJCXhmc19tYXBfYXRfb2Zmc2V0KGlub2RlLCBiaCwgJmltYXAsIG9mZnNldCk7Ci0JCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwKLQkJCQkJCSAmaW9lbmQsIG5ld19pb2VuZCk7Ci0JCQkJY291bnQrKzsKKwkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQlpZiAodHlwZSAhPSBJT19ERUxBTExPQykgeworCQkJCXR5cGUgPSBJT19ERUxBTExPQzsKKwkJCQlpbWFwX3ZhbGlkID0gMDsKIAkJCX0KIAkJfSBlbHNlIGlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JCQkvKgotCQkJICogd2UgZ290IGhlcmUgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIGFscmVhZHkgbWFwcGVkLgotCQkJICogVGhhdCBtZWFucyBpdCBtdXN0IGFscmVhZHkgaGF2ZSBleHRlbnRzIGFsbG9jYXRlZAotCQkJICogdW5kZXJuZWF0aCBpdC4gTWFwIHRoZSBleHRlbnQgYnkgcmVhZGluZyBpdC4KLQkJCSAqLwotCQkJaWYgKCFpbWFwX3ZhbGlkIHx8IGZsYWdzICE9IEJNQVBJX1JFQUQpIHsKLQkJCQlmbGFncyA9IEJNQVBJX1JFQUQ7Ci0JCQkJc2l6ZSA9IHhmc19wcm9iZV9jbHVzdGVyKGlub2RlLCBwYWdlLCBiaCwgaGVhZCk7Ci0JCQkJZXJyID0geGZzX21hcF9ibG9ja3MoaW5vZGUsIG9mZnNldCwgc2l6ZSwKLQkJCQkJCSZpbWFwLCBmbGFncyk7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlpbWFwX3ZhbGlkID0geGZzX2ltYXBfdmFsaWQoaW5vZGUsICZpbWFwLAotCQkJCQkJCSAgICBvZmZzZXQpOwotCQkJfQotCi0JCQkvKgotCQkJICogV2Ugc2V0IHRoZSB0eXBlIHRvIElPX05FVyBpbiBjYXNlIHdlIGFyZSBkb2luZyBhCi0JCQkgKiBzbWFsbCB3cml0ZSBhdCBFT0YgdGhhdCBpcyBleHRlbmRpbmcgdGhlIGZpbGUgYnV0Ci0JCQkgKiB3aXRob3V0IG5lZWRpbmcgYW4gYWxsb2NhdGlvbi4gV2UgbmVlZCB0byB1cGRhdGUgdGhlCi0JCQkgKiBmaWxlIHNpemUgb24gSS9PIGNvbXBsZXRpb24gaW4gdGhpcyBjYXNlIHNvIGl0IGlzCi0JCQkgKiB0aGUgc2FtZSBjYXNlIGFzIGhhdmluZyBqdXN0IGFsbG9jYXRlZCBhIG5ldyBleHRlbnQKLQkJCSAqIHRoYXQgd2UgYXJlIHdyaXRpbmcgaW50byBmb3IgdGhlIGZpcnN0IHRpbWUuCi0JCQkgKi8KLQkJCXR5cGUgPSBJT19ORVc7Ci0JCQlpZiAodHJ5bG9ja19idWZmZXIoYmgpKSB7Ci0JCQkJaWYgKGltYXBfdmFsaWQpCi0JCQkJCWFsbF9iaCA9IDE7Ci0JCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwKLQkJCQkJCSZpb2VuZCwgIWltYXBfdmFsaWQpOwotCQkJCWNvdW50Kys7Ci0JCQl9IGVsc2UgeworCQkJaWYgKHR5cGUgIT0gSU9fT1ZFUldSSVRFKSB7CisJCQkJdHlwZSA9IElPX09WRVJXUklURTsKIAkJCQlpbWFwX3ZhbGlkID0gMDsKIAkJCX0KLQkJfSBlbHNlIGlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCUFTU0VSVChidWZmZXJfbWFwcGVkKGJoKSk7Ci0JCQlpbWFwX3ZhbGlkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQlBU1NFUlQoYnVmZmVyX21hcHBlZChiaCkpOworCQkJCWltYXBfdmFsaWQgPSAwOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaW1hcF92YWxpZCkKKwkJCWltYXBfdmFsaWQgPSB4ZnNfaW1hcF92YWxpZChpbm9kZSwgJmltYXAsIG9mZnNldCk7CisJCWlmICghaW1hcF92YWxpZCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGRpZG4ndCBoYXZlIGEgdmFsaWQgbWFwcGluZyB0aGVuIHdlIG5lZWQgdG8KKwkJCSAqIHB1dCB0aGUgbmV3IG1hcHBpbmcgaW50byBhIHNlcGFyYXRlIGlvZW5kIHN0cnVjdHVyZS4KKwkJCSAqIFRoaXMgZW5zdXJlcyBub24tY29udGlndW91cyBleHRlbnRzIGFsd2F5cyBoYXZlCisJCQkgKiBzZXBhcmF0ZSBpb2VuZHMsIHdoaWNoIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQKKwkJCSAqIGZvciB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24gYXQgSS9PIGNvbXBsZXRpb24KKwkJCSAqIHRpbWUuCisJCQkgKi8KKwkJCW5ld19pb2VuZCA9IDE7CisJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCAmaW1hcCwgdHlwZSwKKwkJCQkJICAgICBub25ibG9ja2luZyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpbWFwX3ZhbGlkID0geGZzX2ltYXBfdmFsaWQoaW5vZGUsICZpbWFwLCBvZmZzZXQpOworCQl9CisJCWlmIChpbWFwX3ZhbGlkKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlpZiAodHlwZSAhPSBJT19PVkVSV1JJVEUpCisJCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCAmaW1hcCwgb2Zmc2V0KTsKKwkJCXhmc19hZGRfdG9faW9lbmQoaW5vZGUsIGJoLCBvZmZzZXQsIHR5cGUsICZpb2VuZCwKKwkJCQkJIG5ld19pb2VuZCk7CisJCQljb3VudCsrOwogCQl9CiAKIAkJaWYgKCFpb2hlYWQpCkBAIC0xMTg4LDcgKzEwNjksNyBAQAogCQkJZW5kX2luZGV4ID0gbGFzdF9pbmRleDsKIAogCQl4ZnNfY2x1c3Rlcl93cml0ZShpbm9kZSwgcGFnZS0+aW5kZXggKyAxLCAmaW1hcCwgJmlvZW5kLAotCQkJCQl3YmMsIGFsbF9iaCwgZW5kX2luZGV4KTsKKwkJCQkgIHdiYywgZW5kX2luZGV4KTsKIAl9CiAKIAlpZiAoaW9oZWFkKQpAQCAtMTI1NywxMyArMTEzOCwxOSBAQAogCWludAkJCWNyZWF0ZSwKIAlpbnQJCQlkaXJlY3QpCiB7Ci0JaW50CQkJZmxhZ3MgPSBjcmVhdGUgPyBCTUFQSV9XUklURSA6IEJNQVBJX1JFQUQ7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiLCBlbmRfZnNiOworCWludAkJCWVycm9yID0gMDsKKwlpbnQJCQlsb2NrbW9kZSA9IDA7CiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJaW1hcDsKKwlpbnQJCQluaW1hcHMgPSAxOwogCXhmc19vZmZfdAkJb2Zmc2V0OwogCXNzaXplX3QJCQlzaXplOwotCWludAkJCW5pbWFwID0gMTsKIAlpbnQJCQluZXcgPSAwOwotCWludAkJCWVycm9yOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwogCiAJb2Zmc2V0ID0gKHhmc19vZmZfdClpYmxvY2sgPDwgaW5vZGUtPmlfYmxrYml0czsKIAlBU1NFUlQoYmhfcmVzdWx0LT5iX3NpemUgPj0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cykpOwpAQCAtMTI3MiwxNSArMTE1OSw0NSBAQAogCWlmICghY3JlYXRlICYmIGRpcmVjdCAmJiBvZmZzZXQgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQogCQlyZXR1cm4gMDsKIAotCWlmIChkaXJlY3QgJiYgY3JlYXRlKQotCQlmbGFncyB8PSBCTUFQSV9ESVJFQ1Q7CisJaWYgKGNyZWF0ZSkgeworCQlsb2NrbW9kZSA9IFhGU19JTE9DS19FWENMOworCQl4ZnNfaWxvY2soaXAsIGxvY2ttb2RlKTsKKwl9IGVsc2UgeworCQlsb2NrbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKKwl9CiAKLQllcnJvciA9IHhmc19pb21hcChYRlNfSShpbm9kZSksIG9mZnNldCwgc2l6ZSwgZmxhZ3MsICZpbWFwLCAmbmltYXAsCi0JCQkgICZuZXcpOworCUFTU0VSVChvZmZzZXQgPD0gbXAtPm1fbWF4aW9mZnNldCk7CisJaWYgKG9mZnNldCArIHNpemUgPiBtcC0+bV9tYXhpb2Zmc2V0KQorCQlzaXplID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKKwllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIHNpemUpOworCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCisJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsIGVuZF9mc2IgLSBvZmZzZXRfZnNiLAorCQkJICBYRlNfQk1BUElfRU5USVJFLCAgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwpOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIC1lcnJvcjsKLQlpZiAobmltYXAgPT0gMCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChjcmVhdGUgJiYKKwkgICAgKCFuaW1hcHMgfHwKKwkgICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0sgfHwKKwkgICAgICBpbWFwLmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSkpIHsKKwkJaWYgKGRpcmVjdCkgeworCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KGlwLCBvZmZzZXQsIHNpemUsCisJCQkJCQkgICAgICAgJmltYXAsIG5pbWFwcyk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kZWxheShpcCwgb2Zmc2V0LCBzaXplLCAmaW1hcCk7CisJCX0KKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXRyYWNlX3hmc19nZXRfYmxvY2tzX2FsbG9jKGlwLCBvZmZzZXQsIHNpemUsIDAsICZpbWFwKTsKKwl9IGVsc2UgaWYgKG5pbWFwcykgeworCQl0cmFjZV94ZnNfZ2V0X2Jsb2Nrc19mb3VuZChpcCwgb2Zmc2V0LCBzaXplLCAwLCAmaW1hcCk7CisJfSBlbHNlIHsKKwkJdHJhY2VfeGZzX2dldF9ibG9ja3Nfbm90Zm91bmQoaXAsIG9mZnNldCwgc2l6ZSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKIAogCWlmIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKIAkgICAgaW1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgewpAQCAtMTM0Nyw2ICsxMjY0LDEwIEBACiAJfQogCiAJcmV0dXJuIDA7CisKK291dF91bmxvY2s6CisJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKKwlyZXR1cm4gLWVycm9yOwogfQogCiBpbnQKQEAgLTE0MzQsNyArMTM1NSw3IEBACiAJc3NpemVfdAkJCXJldDsKIAogCWlmIChydyAmIFdSSVRFKSB7Ci0JCWlvY2ItPnByaXZhdGUgPSB4ZnNfYWxsb2NfaW9lbmQoaW5vZGUsIElPX05FVyk7CisJCWlvY2ItPnByaXZhdGUgPSB4ZnNfYWxsb2NfaW9lbmQoaW5vZGUsIElPX0RJUkVDVCk7CiAKIAkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBiZGV2LCBpb3YsCiAJCQkJCSAgICBvZmZzZXQsIG5yX3NlZ3MsCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKaW5kZXggYzUwNTdmYi4uNzFmNzIxZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaApAQCAtMjMsNiArMjMsMjIgQEAKIGV4dGVybiBtZW1wb29sX3QgKnhmc19pb2VuZF9wb29sOwogCiAvKgorICogVHlwZXMgb2YgSS9PIGZvciBibWFwIGNsdXN0ZXJpbmcgYW5kIEkvTyBjb21wbGV0aW9uIHRyYWNraW5nLgorICovCitlbnVtIHsKKwlJT19ESVJFQ1QgPSAwLAkvKiBzcGVjaWFsIGNhc2UgZm9yIGRpcmVjdCBJL08gaW9lbmRzICovCisJSU9fREVMQUxMT0MsCS8qIG1hcHBpbmcgY292ZXJzIGRlbGFsbG9jIHJlZ2lvbiAqLworCUlPX1VOV1JJVFRFTiwJLyogbWFwcGluZyBjb3ZlcnMgYWxsb2NhdGVkIGJ1dCB1bmluaXRpYWxpemVkIGRhdGEgKi8KKwlJT19PVkVSV1JJVEUsCS8qIG1hcHBpbmcgY292ZXJzIGFscmVhZHkgYWxsb2NhdGVkIGV4dGVudCAqLworfTsKKworI2RlZmluZSBYRlNfSU9fVFlQRVMgXAorCXsgMCwJCQkiIiB9LCBcCisJeyBJT19ERUxBTExPQywJCSJkZWxhbGxvYyIgfSwgXAorCXsgSU9fVU5XUklUVEVOLAkJInVud3JpdHRlbiIgfSwgXAorCXsgSU9fT1ZFUldSSVRFLAkJIm92ZXJ3cml0ZSIgfQorCisvKgogICogeGZzX2lvZW5kIHN0cnVjdCBtYW5hZ2VzIGxhcmdlIGV4dGVudCB3cml0ZXMgZm9yIFhGUy4KICAqIEl0IGNhbiBtYW5hZ2Ugc2V2ZXJhbCBtdWx0aS1wYWdlIGJpbydzIGF0IG9uY2UuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggNGM1ZGViNi4uOTJmMWYyYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTQ0LDEyICs0NCw3IEBACiAKIHN0YXRpYyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOwogU1RBVElDIGludCB4ZnNidWZkKHZvaWQgKik7Ci1TVEFUSUMgaW50IHhmc2J1ZmRfd2FrZXVwKHN0cnVjdCBzaHJpbmtlciAqLCBpbnQsIGdmcF90KTsKIFNUQVRJQyB2b2lkIHhmc19idWZfZGVsd3JpX3F1ZXVlKHhmc19idWZfdCAqLCBpbnQpOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciB4ZnNfYnVmX3NoYWtlID0gewotCS5zaHJpbmsgPSB4ZnNidWZkX3dha2V1cCwKLQkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAotfTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNsb2dkX3dvcmtxdWV1ZTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CkBAIC0xNjgsOCArMTYzLDc5IEBACiB9CiAKIC8qCi0gKglJbnRlcm5hbCB4ZnNfYnVmX3Qgb2JqZWN0IG1hbmlwdWxhdGlvbgorICogeGZzX2J1Zl9scnVfYWRkIC0gYWRkIGEgYnVmZmVyIHRvIHRoZSBMUlUuCisgKgorICogVGhlIExSVSB0YWtlcyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBzbyB0aGF0IGl0IHdpbGwgb25seSBiZSBmcmVlZAorICogb25jZSB0aGUgc2hyaW5rZXIgdGFrZXMgdGhlIGJ1ZmZlciBvZmYgdGhlIExSVS4KICAqLworU1RBVElDIHZvaWQKK3hmc19idWZfbHJ1X2FkZCgKKwlzdHJ1Y3QgeGZzX2J1ZgkqYnApCit7CisJc3RydWN0IHhmc19idWZ0YXJnICpidHAgPSBicC0+Yl90YXJnZXQ7CisKKwlzcGluX2xvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZicC0+Yl9scnUpKSB7CisJCWF0b21pY19pbmMoJmJwLT5iX2hvbGQpOworCQlsaXN0X2FkZF90YWlsKCZicC0+Yl9scnUsICZidHAtPmJ0X2xydSk7CisJCWJ0cC0+YnRfbHJ1X25yKys7CisJfQorCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKK30KKworLyoKKyAqIHhmc19idWZfbHJ1X2RlbCAtIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIHRoZSBMUlUKKyAqCisgKiBUaGUgdW5sb2NrZWQgY2hlY2sgaXMgc2FmZSBoZXJlIGJlY2F1c2UgaXQgb25seSBvY2N1cnMgd2hlbiB0aGVyZSBhcmUgbm90CisgKiBiX2xydV9yZWYgY291bnRzIGxlZnQgb24gdGhlIGlub2RlIHVuZGVyIHRoZSBwYWctPnBhZ19idWZfbG9jay4gaXQgaXMgdGhlcmUKKyAqIHRvIG9wdGltaXNlIHRoZSBzaHJpbmtlciByZW1vdmluZyB0aGUgYnVmZmVyIGZyb20gdGhlIExSVSBhbmQgY2FsbGluZworICogeGZzX2J1Zl9mcmVlKCkuIGkuZS4gaXQgcmVtb3ZlcyBhbiB1bm5lY2Nlc3Nhcnkgcm91bmQgdHJpcCBvbiB0aGUKKyAqIGJ0X2xydV9sb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9scnVfZGVsKAorCXN0cnVjdCB4ZnNfYnVmCSpicCkKK3sKKwlzdHJ1Y3QgeGZzX2J1ZnRhcmcgKmJ0cCA9IGJwLT5iX3RhcmdldDsKKworCWlmIChsaXN0X2VtcHR5KCZicC0+Yl9scnUpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmYnAtPmJfbHJ1KSkgeworCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9scnUpOworCQlidHAtPmJ0X2xydV9uci0tOworCX0KKwlzcGluX3VubG9jaygmYnRwLT5idF9scnVfbG9jayk7Cit9CisKKy8qCisgKiBXaGVuIHdlIG1hcmsgYSBidWZmZXIgc3RhbGUsIHdlIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIExSVSBhbmQgY2xlYXIgdGhlCisgKiBiX2xydV9yZWYgY291bnQgc28gdGhhdCB0aGUgYnVmZmVyIGlzIGZyZWVkIGltbWVkaWF0ZWx5IHdoZW4gdGhlIGJ1ZmZlcgorICogcmVmZXJlbmNlIGNvdW50IGZhbGxzIHRvIHplcm8uIElmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBvbiB0aGUgTFJVLCB3ZSBuZWVkCisgKiB0byByZW1vdmUgdGhlIHJlZmVyZW5jZSB0aGF0IExSVSBob2xkcyBvbiB0aGUgYnVmZmVyLgorICoKKyAqIFRoaXMgcHJldmVudHMgYnVpbGQtdXAgb2Ygc3RhbGUgYnVmZmVycyBvbiB0aGUgTFJVLgorICovCit2b2lkCit4ZnNfYnVmX3N0YWxlKAorCXN0cnVjdCB4ZnNfYnVmCSpicCkKK3sKKwlicC0+Yl9mbGFncyB8PSBYQkZfU1RBTEU7CisJYXRvbWljX3NldCgmKGJwKS0+Yl9scnVfcmVmLCAwKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmJwLT5iX2xydSkpIHsKKwkJc3RydWN0IHhmc19idWZ0YXJnICpidHAgPSBicC0+Yl90YXJnZXQ7CisKKwkJc3Bpbl9sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZicC0+Yl9scnUpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9scnUpOworCQkJYnRwLT5idF9scnVfbnItLTsKKwkJCWF0b21pY19kZWMoJmJwLT5iX2hvbGQpOworCQl9CisJCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKwl9CisJQVNTRVJUKGF0b21pY19yZWFkKCZicC0+Yl9ob2xkKSA+PSAxKTsKK30KIAogU1RBVElDIHZvaWQKIF94ZnNfYnVmX2luaXRpYWxpemUoCkBAIC0xODYsNyArMjUyLDkgQEAKIAogCW1lbXNldChicCwgMCwgc2l6ZW9mKHhmc19idWZfdCkpOwogCWF0b21pY19zZXQoJmJwLT5iX2hvbGQsIDEpOworCWF0b21pY19zZXQoJmJwLT5iX2xydV9yZWYsIDEpOwogCWluaXRfY29tcGxldGlvbigmYnAtPmJfaW93YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmYnAtPmJfbHJ1KTsKIAlJTklUX0xJU1RfSEVBRCgmYnAtPmJfbGlzdCk7CiAJUkJfQ0xFQVJfTk9ERSgmYnAtPmJfcmJub2RlKTsKIAlzZW1hX2luaXQoJmJwLT5iX3NlbWEsIDApOyAvKiBoZWxkLCBubyB3YWl0ZXJzICovCkBAIC0yNjIsNiArMzMwLDggQEAKIHsKIAl0cmFjZV94ZnNfYnVmX2ZyZWUoYnAsIF9SRVRfSVBfKTsKIAorCUFTU0VSVChsaXN0X2VtcHR5KCZicC0+Yl9scnUpKTsKKwogCWlmIChicC0+Yl9mbGFncyAmIChfWEJGX1BBR0VfQ0FDSEV8X1hCRl9QQUdFUykpIHsKIAkJdWludAkJaTsKIApAQCAtMzM3LDcgKzQwNyw2IEBACiAJCQkJCV9fZnVuY19fLCBnZnBfbWFzayk7CiAKIAkJCVhGU19TVEFUU19JTkMoeGJfcGFnZV9yZXRyaWVzKTsKLQkJCXhmc2J1ZmRfd2FrZXVwKE5VTEwsIDAsIGdmcF9tYXNrKTsKIAkJCWNvbmdlc3Rpb25fd2FpdChCTEtfUldfQVNZTkMsIEhaLzUwKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTgyOCw2ICs4OTcsNyBAQAogCiAJaWYgKCFwYWcpIHsKIAkJQVNTRVJUKCFicC0+Yl9yZWxzZSk7CisJCUFTU0VSVChsaXN0X2VtcHR5KCZicC0+Yl9scnUpKTsKIAkJQVNTRVJUKFJCX0VNUFRZX05PREUoJmJwLT5iX3Jibm9kZSkpOwogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmJfaG9sZCkpCiAJCQl4ZnNfYnVmX2ZyZWUoYnApOwpAQCAtODM1LDEzICs5MDUsMTkgQEAKIAl9CiAKIAlBU1NFUlQoIVJCX0VNUFRZX05PREUoJmJwLT5iX3Jibm9kZSkpOworCiAJQVNTRVJUKGF0b21pY19yZWFkKCZicC0+Yl9ob2xkKSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZicC0+Yl9ob2xkLCAmcGFnLT5wYWdfYnVmX2xvY2spKSB7CiAJCWlmIChicC0+Yl9yZWxzZSkgewogCQkJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CiAJCQlzcGluX3VubG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOwogCQkJYnAtPmJfcmVsc2UoYnApOworCQl9IGVsc2UgaWYgKCEoYnAtPmJfZmxhZ3MgJiBYQkZfU1RBTEUpICYmCisJCQkgICBhdG9taWNfcmVhZCgmYnAtPmJfbHJ1X3JlZikpIHsKKwkJCXhmc19idWZfbHJ1X2FkZChicCk7CisJCQlzcGluX3VubG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOwogCQl9IGVsc2UgeworCQkJeGZzX2J1Zl9scnVfZGVsKGJwKTsKIAkJCUFTU0VSVCghKGJwLT5iX2ZsYWdzICYgKFhCRl9ERUxXUkl8X1hCRl9ERUxXUklfUSkpKTsKIAkJCXJiX2VyYXNlKCZicC0+Yl9yYm5vZGUsICZwYWctPnBhZ19idWZfdHJlZSk7CiAJCQlzcGluX3VubG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOwpAQCAtMTQzOCw1MSArMTUxNCw4NCBAQAogICovCiAKIC8qCi0gKglXYWl0IGZvciBhbnkgYnVmcyB3aXRoIGNhbGxiYWNrcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgYnV0Ci0gKgloYXZlIG5vdCB5ZXQgcmV0dXJuZWQuLi4gd2FsayB0aGUgaGFzaCBsaXN0IGZvciB0aGUgdGFyZ2V0LgorICogV2FpdCBmb3IgYW55IGJ1ZnMgd2l0aCBjYWxsYmFja3MgdGhhdCBoYXZlIGJlZW4gc3VibWl0dGVkIGJ1dCBoYXZlIG5vdCB5ZXQKKyAqIHJldHVybmVkLiBUaGVzZSBidWZmZXJzIHdpbGwgaGF2ZSBhbiBlbGV2YXRlZCBob2xkIGNvdW50LCBzbyB3YWl0IG9uIHRob3NlCisgKiB3aGlsZSBmcmVlaW5nIGFsbCB0aGUgYnVmZmVycyBvbmx5IGhlbGQgYnkgdGhlIExSVS4KICAqLwogdm9pZAogeGZzX3dhaXRfYnVmdGFyZygKIAlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmJ0cCkKIHsKLQlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWc7Ci0JdWludAkJCWk7CisJc3RydWN0IHhmc19idWYJCSpicDsKIAotCWZvciAoaSA9IDA7IGkgPCBidHAtPmJ0X21vdW50LT5tX3NiLnNiX2FnY291bnQ7IGkrKykgewotCQlwYWcgPSB4ZnNfcGVyYWdfZ2V0KGJ0cC0+YnRfbW91bnQsIGkpOwotCQlzcGluX2xvY2soJnBhZy0+cGFnX2J1Zl9sb2NrKTsKLQkJd2hpbGUgKHJiX2ZpcnN0KCZwYWctPnBhZ19idWZfdHJlZSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19idWZfbG9jayk7CityZXN0YXJ0OgorCXNwaW5fbG9jaygmYnRwLT5idF9scnVfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZidHAtPmJ0X2xydSkpIHsKKwkJYnAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZidHAtPmJ0X2xydSwgc3RydWN0IHhmc19idWYsIGJfbHJ1KTsKKwkJaWYgKGF0b21pY19yZWFkKCZicC0+Yl9ob2xkKSA+IDEpIHsKKwkJCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKIAkJCWRlbGF5KDEwMCk7Ci0JCQlzcGluX2xvY2soJnBhZy0+cGFnX2J1Zl9sb2NrKTsKKwkJCWdvdG8gcmVzdGFydDsKIAkJfQotCQlzcGluX3VubG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOwotCQl4ZnNfcGVyYWdfcHV0KHBhZyk7CisJCS8qCisJCSAqIGNsZWFyIHRoZSBMUlUgcmVmZXJlbmNlIGNvdW50IHNvIHRoZSBidWZlciBkb2Vzbid0IGdldAorCQkgKiBpZ25vcmVkIGluIHhmc19idWZfcmVsZSgpLgorCQkgKi8KKwkJYXRvbWljX3NldCgmYnAtPmJfbHJ1X3JlZiwgMCk7CisJCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKwkJeGZzX2J1Zl9yZWxlKGJwKTsKKwkJc3Bpbl9sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKIAl9CisJc3Bpbl91bmxvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOwogfQogCi0vKgotICoJYnVmdGFyZyBsaXN0IGZvciBkZWx3cml0ZSBxdWV1ZSBwcm9jZXNzaW5nCi0gKi8KLXN0YXRpYyBMSVNUX0hFQUQoeGZzX2J1ZnRhcmdfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHhmc19idWZ0YXJnX2xvY2spOwotCi1TVEFUSUMgdm9pZAoteGZzX3JlZ2lzdGVyX2J1ZnRhcmcoCi0JeGZzX2J1ZnRhcmdfdCAgICAgICAgICAgKmJ0cCkKK2ludAoreGZzX2J1ZnRhcmdfc2hyaW5rKAorCXN0cnVjdCBzaHJpbmtlcgkJKnNocmluaywKKwlpbnQJCQlucl90b19zY2FuLAorCWdmcF90CQkJbWFzaykKIHsKLQlzcGluX2xvY2soJnhmc19idWZ0YXJnX2xvY2spOwotCWxpc3RfYWRkKCZidHAtPmJ0X2xpc3QsICZ4ZnNfYnVmdGFyZ19saXN0KTsKLQlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Ci19CisJc3RydWN0IHhmc19idWZ0YXJnCSpidHAgPSBjb250YWluZXJfb2Yoc2hyaW5rLAorCQkJCQlzdHJ1Y3QgeGZzX2J1ZnRhcmcsIGJ0X3Nocmlua2VyKTsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOworCUxJU1RfSEVBRChkaXNwb3NlKTsKIAotU1RBVElDIHZvaWQKLXhmc191bnJlZ2lzdGVyX2J1ZnRhcmcoCi0JeGZzX2J1ZnRhcmdfdCAgICAgICAgICAgKmJ0cCkKLXsKLQlzcGluX2xvY2soJnhmc19idWZ0YXJnX2xvY2spOwotCWxpc3RfZGVsKCZidHAtPmJ0X2xpc3QpOwotCXNwaW5fdW5sb2NrKCZ4ZnNfYnVmdGFyZ19sb2NrKTsKKwlpZiAoIW5yX3RvX3NjYW4pCisJCXJldHVybiBidHAtPmJ0X2xydV9ucjsKKworCXNwaW5fbG9jaygmYnRwLT5idF9scnVfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZidHAtPmJ0X2xydSkpIHsKKwkJaWYgKG5yX3RvX3NjYW4tLSA8PSAwKQorCQkJYnJlYWs7CisKKwkJYnAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZidHAtPmJ0X2xydSwgc3RydWN0IHhmc19idWYsIGJfbHJ1KTsKKworCQkvKgorCQkgKiBEZWNyZW1lbnQgdGhlIGJfbHJ1X3JlZiBjb3VudCB1bmxlc3MgdGhlIHZhbHVlIGlzIGFscmVhZHkKKwkJICogemVyby4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgemVybywgd2UgbmVlZCB0byByZWNsYWltIHRoZQorCQkgKiBidWZmZXIsIG90aGVyd2lzZSBpdCBnZXRzIGFub3RoZXIgdHJpcCB0aHJvdWdoIHRoZSBMUlUuCisJCSAqLworCQlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZicC0+Yl9scnVfcmVmLCAtMSwgMCkpIHsKKwkJCWxpc3RfbW92ZV90YWlsKCZicC0+Yl9scnUsICZidHAtPmJ0X2xydSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIExSVSBub3cgdG8gYXZvaWQgbmVlZGluZyBhbm90aGVyCisJCSAqIGxvY2sgcm91bmQgdHJpcCBpbnNpZGUgeGZzX2J1Zl9yZWxlKCkuCisJCSAqLworCQlsaXN0X21vdmUoJmJwLT5iX2xydSwgJmRpc3Bvc2UpOworCQlidHAtPmJ0X2xydV9uci0tOworCX0KKwlzcGluX3VubG9jaygmYnRwLT5idF9scnVfbG9jayk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRpc3Bvc2UpKSB7CisJCWJwID0gbGlzdF9maXJzdF9lbnRyeSgmZGlzcG9zZSwgc3RydWN0IHhmc19idWYsIGJfbHJ1KTsKKwkJbGlzdF9kZWxfaW5pdCgmYnAtPmJfbHJ1KTsKKwkJeGZzX2J1Zl9yZWxlKGJwKTsKKwl9CisKKwlyZXR1cm4gYnRwLT5idF9scnVfbnI7CiB9CiAKIHZvaWQKQEAgLTE0OTAsMTcgKzE1OTksMTQgQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmJ0cCkKIHsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZidHAtPmJ0X3Nocmlua2VyKTsKKwogCXhmc19mbHVzaF9idWZ0YXJnKGJ0cCwgMSk7CiAJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0JBUlJJRVIpCiAJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2goYnRwKTsKIAlpcHV0KGJ0cC0+YnRfbWFwcGluZy0+aG9zdCk7CiAKLQkvKiBVbnJlZ2lzdGVyIHRoZSBidWZ0YXJnIGZpcnN0IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEKLQkgKiB3YWtldXAgZmluZGluZyBhIG5vbi1leGlzdGVudCB0YXNrCi0JICovCi0JeGZzX3VucmVnaXN0ZXJfYnVmdGFyZyhidHApOwogCWt0aHJlYWRfc3RvcChidHAtPmJ0X3Rhc2spOwotCiAJa21lbV9mcmVlKGJ0cCk7CiB9CiAKQEAgLTE1OTcsMjAgKzE3MDMsMTMgQEAKIAl4ZnNfYnVmdGFyZ190CQkqYnRwLAogCWNvbnN0IGNoYXIJCSpmc25hbWUpCiB7Ci0JaW50CWVycm9yID0gMDsKLQotCUlOSVRfTElTVF9IRUFEKCZidHAtPmJ0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZidHAtPmJ0X2RlbHdyaXRlX3F1ZXVlKTsKIAlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9kZWx3cml0ZV9sb2NrKTsKIAlidHAtPmJ0X2ZsYWdzID0gMDsKIAlidHAtPmJ0X3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNidWZkLCBidHAsICJ4ZnNidWZkLyVzIiwgZnNuYW1lKTsKLQlpZiAoSVNfRVJSKGJ0cC0+YnRfdGFzaykpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKGJ0cC0+YnRfdGFzayk7Ci0JCWdvdG8gb3V0X2Vycm9yOwotCX0KLQl4ZnNfcmVnaXN0ZXJfYnVmdGFyZyhidHApOwotb3V0X2Vycm9yOgotCXJldHVybiBlcnJvcjsKKwlpZiAoSVNfRVJSKGJ0cC0+YnRfdGFzaykpCisJCXJldHVybiBQVFJfRVJSKGJ0cC0+YnRfdGFzayk7CisJcmV0dXJuIDA7CiB9CiAKIHhmc19idWZ0YXJnX3QgKgpAQCAtMTYyNywxMiArMTcyNiwxNyBAQAogCWJ0cC0+YnRfbW91bnQgPSBtcDsKIAlidHAtPmJ0X2RldiA9ICBiZGV2LT5iZF9kZXY7CiAJYnRwLT5idF9iZGV2ID0gYmRldjsKKwlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9scnUpOworCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2xydV9sb2NrKTsKIAlpZiAoeGZzX3NldHNpemVfYnVmdGFyZ19lYXJseShidHAsIGJkZXYpKQogCQlnb3RvIGVycm9yOwogCWlmICh4ZnNfbWFwcGluZ19idWZ0YXJnKGJ0cCwgYmRldikpCiAJCWdvdG8gZXJyb3I7CiAJaWYgKHhmc19hbGxvY19kZWx3cml0ZV9xdWV1ZShidHAsIGZzbmFtZSkpCiAJCWdvdG8gZXJyb3I7CisJYnRwLT5idF9zaHJpbmtlci5zaHJpbmsgPSB4ZnNfYnVmdGFyZ19zaHJpbms7CisJYnRwLT5idF9zaHJpbmtlci5zZWVrcyA9IERFRkFVTFRfU0VFS1M7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmJ0cC0+YnRfc2hyaW5rZXIpOwogCXJldHVybiBidHA7CiAKIGVycm9yOgpAQCAtMTczNywyNyArMTg0MSw2IEBACiAJZmx1c2hfd29ya3F1ZXVlKHF1ZXVlKTsKIH0KIAotU1RBVElDIGludAoteGZzYnVmZF93YWtldXAoCi0Jc3RydWN0IHNocmlua2VyCQkqc2hyaW5rLAotCWludAkJCXByaW9yaXR5LAotCWdmcF90CQkJbWFzaykKLXsKLQl4ZnNfYnVmdGFyZ190CQkqYnRwOwotCi0Jc3Bpbl9sb2NrKCZ4ZnNfYnVmdGFyZ19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cCwgJnhmc19idWZ0YXJnX2xpc3QsIGJ0X2xpc3QpIHsKLQkJaWYgKHRlc3RfYml0KFhCVF9GT1JDRV9TTEVFUCwgJmJ0cC0+YnRfZmxhZ3MpKQotCQkJY29udGludWU7Ci0JCWlmIChsaXN0X2VtcHR5KCZidHAtPmJ0X2RlbHdyaXRlX3F1ZXVlKSkKLQkJCWNvbnRpbnVlOwotCQlzZXRfYml0KFhCVF9GT1JDRV9GTFVTSCwgJmJ0cC0+YnRfZmxhZ3MpOwotCQl3YWtlX3VwX3Byb2Nlc3MoYnRwLT5idF90YXNrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnhmc19idWZ0YXJnX2xvY2spOwotCXJldHVybiAwOwotfQotCiAvKgogICogTW92ZSBhcyBtYW55IGJ1ZmZlcnMgYXMgc3BlY2lmaWVkIHRvIHRoZSBzdXBwbGllZCBsaXN0CiAgKiBpZGljYXRpbmcgaWYgd2Ugc2tpcHBlZCBhbnkgYnVmZmVycyB0byBwcmV2ZW50IGRlYWRsb2Nrcy4KQEAgLTE5NTIsNyArMjAzNSw2IEBACiAJaWYgKCF4ZnNjb252ZXJ0ZF93b3JrcXVldWUpCiAJCWdvdG8gb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJnhmc19idWZfc2hha2UpOwogCXJldHVybiAwOwogCiAgb3V0X2Rlc3Ryb3lfeGZzZGF0YWRfd29ya3F1ZXVlOgpAQCAtMTk2OCw3ICsyMDUwLDYgQEAKIHZvaWQKIHhmc19idWZfdGVybWluYXRlKHZvaWQpCiB7Ci0JdW5yZWdpc3Rlcl9zaHJpbmtlcigmeGZzX2J1Zl9zaGFrZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzY29udmVydGRfd29ya3F1ZXVlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNkYXRhZF93b3JrcXVldWUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2xvZ2Rfd29ya3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKaW5kZXggMzgzYTNmMy4uYTc2YzI0MiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKQEAgLTEyOCwxMCArMTI4LDE1IEBACiAKIAkvKiBwZXIgZGV2aWNlIGRlbHdyaSBxdWV1ZSAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqYnRfdGFzazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlidF9kZWx3cml0ZV9xdWV1ZTsKIAlzcGlubG9ja190CQlidF9kZWx3cml0ZV9sb2NrOwogCXVuc2lnbmVkIGxvbmcJCWJ0X2ZsYWdzOworCisJLyogTFJVIGNvbnRyb2wgc3RydWN0dXJlcyAqLworCXN0cnVjdCBzaHJpbmtlcgkJYnRfc2hyaW5rZXI7CisJc3RydWN0IGxpc3RfaGVhZAlidF9scnU7CisJc3BpbmxvY2tfdAkJYnRfbHJ1X2xvY2s7CisJdW5zaWduZWQgaW50CQlidF9scnVfbnI7CiB9IHhmc19idWZ0YXJnX3Q7CiAKIC8qCkBAIC0xNjQsOSArMTY5LDExIEBACiAJeGZzX29mZl90CQliX2ZpbGVfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSAqLwogCXNpemVfdAkJCWJfYnVmZmVyX2xlbmd0aDsvKiBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAqLwogCWF0b21pY190CQliX2hvbGQ7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlhdG9taWNfdAkJYl9scnVfcmVmOwkvKiBscnUgcmVjbGFpbSByZWYgY291bnQgKi8KIAl4ZnNfYnVmX2ZsYWdzX3QJCWJfZmxhZ3M7CS8qIHN0YXR1cyBmbGFncyAqLwogCXN0cnVjdCBzZW1hcGhvcmUJYl9zZW1hOwkJLyogc2VtYXBob3JlIGZvciBsb2NrYWJsZXMgKi8KIAorCXN0cnVjdCBsaXN0X2hlYWQJYl9scnU7CQkvKiBscnUgbGlzdCAqLwogCXdhaXRfcXVldWVfaGVhZF90CWJfd2FpdGVyczsJLyogdW5waW4gd2FpdGVycyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJYl9saXN0OwogCXN0cnVjdCB4ZnNfcGVyYWcJKmJfcGFnOwkJLyogY29udGFpbnMgcmJ0cmVlIHJvb3QgKi8KQEAgLTI2NCw3ICsyNzEsOCBAQAogI2RlZmluZSBYRlNfQlVGX1pFUk9GTEFHUyhicCkJKChicCktPmJfZmxhZ3MgJj0gXAogCQl+KFhCRl9SRUFEfFhCRl9XUklURXxYQkZfQVNZTkN8WEJGX0RFTFdSSXxYQkZfT1JERVJFRCkpCiAKLSNkZWZpbmUgWEZTX0JVRl9TVEFMRShicCkJKChicCktPmJfZmxhZ3MgfD0gWEJGX1NUQUxFKQordm9pZCB4ZnNfYnVmX3N0YWxlKHN0cnVjdCB4ZnNfYnVmICpicCk7CisjZGVmaW5lIFhGU19CVUZfU1RBTEUoYnApCXhmc19idWZfc3RhbGUoYnApOwogI2RlZmluZSBYRlNfQlVGX1VOU1RBTEUoYnApCSgoYnApLT5iX2ZsYWdzICY9IH5YQkZfU1RBTEUpCiAjZGVmaW5lIFhGU19CVUZfSVNTVEFMRShicCkJKChicCktPmJfZmxhZ3MgJiBYQkZfU1RBTEUpCiAjZGVmaW5lIFhGU19CVUZfU1VQRVJfU1RBTEUoYnApCWRvIHsJCQkJXApAQCAtMzI4LDkgKzMzNiwxNSBAQAogI2RlZmluZSBYRlNfQlVGX1NJWkUoYnApCQkoKGJwKS0+Yl9idWZmZXJfbGVuZ3RoKQogI2RlZmluZSBYRlNfQlVGX1NFVF9TSVpFKGJwLCBjbnQpCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGggPSAoY250KSkKIAotI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIHR5cGUsIHJlZikJZG8geyB9IHdoaWxlICgwKQorc3RhdGljIGlubGluZSB2b2lkCit4ZnNfYnVmX3NldF9yZWYoCisJc3RydWN0IHhmc19idWYJKmJwLAorCWludAkJbHJ1X3JlZikKK3sKKwlhdG9taWNfc2V0KCZicC0+Yl9scnVfcmVmLCBscnVfcmVmKTsKK30KKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCXhmc19idWZfc2V0X3JlZihicCwgcmVmKQogI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRShicCwgdHlwZSkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgWEZTX0JVRl9TRVRfUkVGKGJwLCByZWYpCQlkbyB7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgWEZTX0JVRl9JU1BJTk5FRChicCkJYXRvbWljX3JlYWQoJigoYnApLT5iX3Bpbl9jb3VudCkpCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKaW5kZXggMzc2NGQ3NC4uZmMwMTE0ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKQEAgLTcwLDggKzcwLDE2IEBACiAJZWxzZQogCQlmaWxlaWRfdHlwZSA9IEZJTEVJRF9JTk8zMl9HRU5fUEFSRU5UOwogCi0JLyogZmlsZXN5c3RlbSBtYXkgY29udGFpbiA2NGJpdCBpbm9kZSBudW1iZXJzICovCi0JaWYgKCEoWEZTX00oaW5vZGUtPmlfc2IpLT5tX2ZsYWdzICYgWEZTX01PVU5UX1NNQUxMX0lOVU1TKSkKKwkvKgorCSAqIElmIHRoZSB0aGUgZmlsZXN5c3RlbSBtYXkgY29udGFpbiA2NGJpdCBpbm9kZSBudW1iZXJzLCB3ZSBuZWVkCisJICogdG8gdXNlIGxhcmdlciBmaWxlIGhhbmRsZXMgdGhhdCBjYW4gcmVwcmVzZW50IHRoZW0uCisJICoKKwkgKiBXaGlsZSB3ZSBvbmx5IGFsbG9jYXRlIGlub2RlcyB0aGF0IGRvIG5vdCBmaXQgaW50byAzMiBiaXRzIGFueQorCSAqIGxhcmdlIGVub3VnaCBmaWxlc3lzdGVtIG1heSBjb250YWluIHRoZW0sIHRodXMgdGhlIHNsaWdodGx5CisJICogY29uZnVzaW5nIGxvb2tpbmcgY29uZGl0aW9uYWwgYmVsb3cuCisJICovCisJaWYgKCEoWEZTX00oaW5vZGUtPmlfc2IpLT5tX2ZsYWdzICYgWEZTX01PVU5UX1NNQUxMX0lOVU1TKSB8fAorCSAgICAoWEZTX00oaW5vZGUtPmlfc2IpLT5tX2ZsYWdzICYgWEZTX01PVU5UXzMyQklUSU5PREVTKSkKIAkJZmlsZWlkX3R5cGUgfD0gWEZTX0ZJTEVJRF9UWVBFXzY0RkxBRzsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKaW5kZXggOTRkNWZkNi4uZGE1NDQwMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpAQCAtNTE2LDYgKzUxNiw3IEBACiAJbG9mZl90CQluZXdfc2l6ZSA9IDA7CiAJeGZzX2Zsb2NrNjRfdAliZjsKIAl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSShpbm9kZSk7CisJaW50CQljbWQgPSBYRlNfSU9DX1JFU1ZTUDsKIAogCS8qIHByZWFsbG9jYXRpb24gb24gZGlyZWN0b3JpZXMgbm90IHlldCBzdXBwb3J0ZWQgKi8KIAllcnJvciA9IC1FTk9ERVY7CkBAIC01MjgsNiArNTI5LDkgQEAKIAogCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKIAorCWlmIChtb2RlICYgRkFMTE9DX0ZMX1BVTkNIX0hPTEUpCisJCWNtZCA9IFhGU19JT0NfVU5SRVNWU1A7CisKIAkvKiBjaGVjayB0aGUgbmV3IGlub2RlIHNpemUgaXMgdmFsaWQgYmVmb3JlIGFsbG9jYXRpbmcgKi8KIAlpZiAoIShtb2RlICYgRkFMTE9DX0ZMX0tFRVBfU0laRSkgJiYKIAkgICAgb2Zmc2V0ICsgbGVuID4gaV9zaXplX3JlYWQoaW5vZGUpKSB7CkBAIC01MzcsOCArNTQxLDcgQEAKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQllcnJvciA9IC14ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoaXAsIFhGU19JT0NfUkVTVlNQLCAmYmYsCi0JCQkJICAgICAgIDAsIFhGU19BVFRSX05PTE9DSyk7CisJZXJyb3IgPSAteGZzX2NoYW5nZV9maWxlX3NwYWNlKGlwLCBjbWQsICZiZiwgMCwgWEZTX0FUVFJfTk9MT0NLKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKaW5kZXggMjE0ZGRkNy4uMDk2NDk0OSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCkBAIC0zNyw3ICszNyw2IEBACiAKICNpbmNsdWRlIDxrbWVtLmg+CiAjaW5jbHVkZSA8bXJsb2NrLmg+Ci0jaW5jbHVkZSA8c3YuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxzdXBwb3J0L2RlYnVnLmg+CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCAwNjRmOTY0Li5iZDA3ZjczIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTYwNiw3ICs2MDYsOCBAQAogewogCWludAkJCWVycm9yID0gMDsKIAotCSpiZGV2cCA9IG9wZW5fYmRldl9leGNsdXNpdmUobmFtZSwgRk1PREVfUkVBRHxGTU9ERV9XUklURSwgbXApOworCSpiZGV2cCA9IGJsa2Rldl9nZXRfYnlfcGF0aChuYW1lLCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFfEZNT0RFX0VYQ0wsCisJCQkJICAgIG1wKTsKIAlpZiAoSVNfRVJSKCpiZGV2cCkpIHsKIAkJZXJyb3IgPSBQVFJfRVJSKCpiZGV2cCk7CiAJCXByaW50aygiWEZTOiBJbnZhbGlkIGRldmljZSBbJXNdLCBlcnJvcj0lZFxuIiwgbmFtZSwgZXJyb3IpOwpAQCAtNjIwLDcgKzYyMSw3IEBACiAJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldikKIHsKIAlpZiAoYmRldikKLQkJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJCWJsa2Rldl9wdXQoYmRldiwgRk1PREVfUkVBRHxGTU9ERV9XUklURXxGTU9ERV9FWENMKTsKIH0KIAogLyoKQEAgLTgzNCw4ICs4MzUsMTEgQEAKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCiAJeGZzX2xzbl90CQl0aHJlc2hvbGRfbHNuKQogewotCWFpbHAtPnhhX3RhcmdldCA9IHRocmVzaG9sZF9sc247Ci0Jd2FrZV91cF9wcm9jZXNzKGFpbHAtPnhhX3Rhc2spOworCS8qIG9ubHkgZXZlciBtb3ZlIHRoZSB0YXJnZXQgZm9yd2FyZHMgKi8KKwlpZiAoWEZTX0xTTl9DTVAodGhyZXNob2xkX2xzbiwgYWlscC0+eGFfdGFyZ2V0KSA+IDApIHsKKwkJYWlscC0+eGFfdGFyZ2V0ID0gdGhyZXNob2xkX2xzbjsKKwkJd2FrZV91cF9wcm9jZXNzKGFpbHAtPnhhX3Rhc2spOworCX0KIH0KIAogU1RBVElDIGludApAQCAtODQ3LDggKzg1MSwxNyBAQAogCWxvbmcJCXRvdXQgPSAwOyAvKiBtaWxsaXNlY29uZHMgKi8KIAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0b3V0ID8KLQkJCQltc2Vjc190b19qaWZmaWVzKHRvdXQpIDogTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCQkvKgorCQkgKiBmb3Igc2hvcnQgc2xlZXBzIGluZGljYXRpbmcgY29uZ2VzdGlvbiwgZG9uJ3QgYWxsb3cgdXMgdG8KKwkJICogZ2V0IHdva2VuIGVhcmx5LiBPdGhlcndpc2UgYWxsIHdlIGRvIGlzIGJhbmcgb24gdGhlIEFJTCBsb2NrCisJCSAqIHdpdGhvdXQgbWFraW5nIHByb2dyZXNzLgorCQkgKi8KKwkJaWYgKHRvdXQgJiYgdG91dCA8PSAyMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19LSUxMQUJMRSk7CisJCWVsc2UKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCh0b3V0ID8KKwkJCQkgbXNlY3NfdG9famlmZmllcyh0b3V0KSA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKIAogCQkvKiBzd3N1c3AgKi8KIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpAQCAtOTM1LDcgKzk0OCw3IEBACiAgKiBTbGFiIG9iamVjdCBjcmVhdGlvbiBpbml0aWFsaXNhdGlvbiBmb3IgdGhlIFhGUyBpbm9kZS4KICAqIFRoaXMgY292ZXJzIG9ubHkgdGhlIGlkZW1wb3RlbnQgZmllbGRzIGluIHRoZSBYRlMgaW5vZGU7CiAgKiBhbGwgb3RoZXIgZmllbGRzIG5lZWQgdG8gYmUgaW5pdGlhbGlzZWQgb24gYWxsb2NhdGlvbgotICogZnJvbSB0aGUgc2xhYi4gVGhpcyBhdm9pZHMgdGhlIG5lZWQgdG8gcmVwZWF0ZWRseSBpbnRpYWxpc2UKKyAqIGZyb20gdGhlIHNsYWIuIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIHJlcGVhdGVkbHkgaW5pdGlhbGlzZQogICogZmllbGRzIGluIHRoZSB4ZnMgaW5vZGUgdGhhdCBsZWZ0IGluIHRoZSBpbml0aWFsaXNlIHN0YXRlCiAgKiB3aGVuIGZyZWVpbmcgdGhlIGlub2RlLgogICovCkBAIC0xMTE4LDYgKzExMzEsOCBAQAogCSAqLwogCUFTU0VSVCghcndzZW1faXNfbG9ja2VkKCZpcC0+aV9pb2xvY2subXJfbG9jaykpOwogCW1ybG9ja19pbml0KCZpcC0+aV9pb2xvY2ssIE1STE9DS19CQVJSSUVSLCAieGZzaW8iLCBpcC0+aV9pbm8pOworCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKCZpcC0+aV9pb2xvY2subXJfbG9jaywKKwkJCSZ4ZnNfaW9sb2NrX3JlY2xhaW1hYmxlLCAieGZzX2lvbG9ja19yZWNsYWltYWJsZSIpOwogCiAJeGZzX2luYWN0aXZlKGlwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYwppbmRleCBhZmIwZDdjLi5hMDI0ODBkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCkBAIC01MywxNCArNTMsMzAgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IFZGU19JKGlwKTsKIAorCUFTU0VSVChyY3VfcmVhZF9sb2NrX2hlbGQoKSk7CisKKwkvKgorCSAqIGNoZWNrIGZvciBzdGFsZSBSQ1UgZnJlZWQgaW5vZGUKKwkgKgorCSAqIElmIHRoZSBpbm9kZSBoYXMgYmVlbiByZWFsbG9jYXRlZCwgaXQgZG9lc24ndCBtYXR0ZXIgaWYgaXQncyBub3QgaW4KKwkgKiB0aGUgQUcgd2UgYXJlIHdhbGtpbmcgLSB3ZSBhcmUgd2Fsa2luZyBmb3Igd3JpdGViYWNrLCBzbyBpZiBpdAorCSAqIHBhc3NlcyBhbGwgdGhlICJ2YWxpZCBpbm9kZSIgY2hlY2tzIGFuZCBpcyBkaXJ0eSwgdGhlbiB3ZSdsbCB3cml0ZQorCSAqIGl0IGJhY2sgYW55d2F5LiAgSWYgaXQgaGFzIGJlZW4gcmVhbGxvY2F0ZWQgYW5kIHN0aWxsIGJlaW5nCisJICogaW5pdGlhbGlzZWQsIHRoZSBYRlNfSU5FVyBjaGVjayBiZWxvdyB3aWxsIGNhdGNoIGl0LgorCSAqLworCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJaWYgKCFpcC0+aV9pbm8pCisJCWdvdG8gb3V0X3VubG9ja19ub2VudDsKKworCS8qIGF2b2lkIG5ldyBvciByZWNsYWltYWJsZSBpbm9kZXMuIExlYXZlIGZvciByZWNsYWltIGNvZGUgdG8gZmx1c2ggKi8KKwlpZiAoX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JTkVXIHwgWEZTX0lSRUNMQUlNQUJMRSB8IFhGU19JUkVDTEFJTSkpCisJCWdvdG8gb3V0X3VubG9ja19ub2VudDsKKwlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisKIAkvKiBub3RoaW5nIHRvIHN5bmMgZHVyaW5nIHNodXRkb3duICovCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQogCQlyZXR1cm4gRUZTQ09SUlVQVEVEOwogCi0JLyogYXZvaWQgbmV3IG9yIHJlY2xhaW1hYmxlIGlub2Rlcy4gTGVhdmUgZm9yIHJlY2xhaW0gY29kZSB0byBmbHVzaCAqLwotCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JTkVXIHwgWEZTX0lSRUNMQUlNQUJMRSB8IFhGU19JUkVDTEFJTSkpCi0JCXJldHVybiBFTk9FTlQ7Ci0KIAkvKiBJZiB3ZSBjYW4ndCBncmFiIHRoZSBpbm9kZSwgaXQgbXVzdCBvbiBpdCdzIHdheSB0byByZWNsYWltLiAqLwogCWlmICghaWdyYWIoaW5vZGUpKQogCQlyZXR1cm4gRU5PRU5UOwpAQCAtNzIsNiArODgsMTAgQEAKIAogCS8qIGlub2RlIGlzIHZhbGlkICovCiAJcmV0dXJuIDA7CisKK291dF91bmxvY2tfbm9lbnQ6CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCXJldHVybiBFTk9FTlQ7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTk4LDEyICsxMTgsMTIgQEAKIAkJaW50CQllcnJvciA9IDA7CiAJCWludAkJaTsKIAotCQlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJcmN1X3JlYWRfbG9jaygpOwogCQlucl9mb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJnBhZy0+cGFnX2ljaV9yb290LAogCQkJCQkodm9pZCAqKiliYXRjaCwgZmlyc3RfaW5kZXgsCiAJCQkJCVhGU19MT09LVVBfQkFUQ0gpOwogCQlpZiAoIW5yX2ZvdW5kKSB7Ci0JCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMTgsMTggKzEzOCwyNiBAQAogCQkJCWJhdGNoW2ldID0gTlVMTDsKIAogCQkJLyoKLQkJCSAqIFVwZGF0ZSB0aGUgaW5kZXggZm9yIHRoZSBuZXh0IGxvb2t1cC4gQ2F0Y2ggb3ZlcmZsb3dzCi0JCQkgKiBpbnRvIHRoZSBuZXh0IEFHIHJhbmdlIHdoaWNoIGNhbiBvY2N1ciBpZiB3ZSBoYXZlIGlub2RlcwotCQkJICogaW4gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIEFHIGFuZCB3ZSBhcmUgY3VycmVudGx5Ci0JCQkgKiBwb2ludGluZyB0byB0aGUgbGFzdCBpbm9kZS4KKwkJCSAqIFVwZGF0ZSB0aGUgaW5kZXggZm9yIHRoZSBuZXh0IGxvb2t1cC4gQ2F0Y2gKKwkJCSAqIG92ZXJmbG93cyBpbnRvIHRoZSBuZXh0IEFHIHJhbmdlIHdoaWNoIGNhbiBvY2N1ciBpZgorCQkJICogd2UgaGF2ZSBpbm9kZXMgaW4gdGhlIGxhc3QgYmxvY2sgb2YgdGhlIEFHIGFuZCB3ZQorCQkJICogYXJlIGN1cnJlbnRseSBwb2ludGluZyB0byB0aGUgbGFzdCBpbm9kZS4KKwkJCSAqCisJCQkgKiBCZWNhdXNlIHdlIG1heSBzZWUgaW5vZGVzIHRoYXQgYXJlIGZyb20gdGhlIHdyb25nIEFHCisJCQkgKiBkdWUgdG8gUkNVIGZyZWVpbmcgYW5kIHJlYWxsb2NhdGlvbiwgb25seSB1cGRhdGUgdGhlCisJCQkgKiBpbmRleCBpZiBpdCBsaWVzIGluIHRoaXMgQUcuIEl0IHdhcyBhIHJhY2UgdGhhdCBsZWFkCisJCQkgKiB1cyB0byBzZWUgdGhpcyBpbm9kZSwgc28gYW5vdGhlciBsb29rdXAgZnJvbSB0aGUKKwkJCSAqIHNhbWUgaW5kZXggd2lsbCBub3QgZmluZCBpdCBhZ2Fpbi4KIAkJCSAqLworCQkJaWYgKFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKSAhPSBwYWctPnBhZ19hZ25vKQorCQkJCWNvbnRpbnVlOwogCQkJZmlyc3RfaW5kZXggPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8gKyAxKTsKIAkJCWlmIChmaXJzdF9pbmRleCA8IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubykpCiAJCQkJZG9uZSA9IDE7CiAJCX0KIAogCQkvKiB1bmxvY2sgbm93IHdlJ3ZlIGdyYWJiZWQgdGhlIGlub2Rlcy4gKi8KLQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKIAkJCWlmICghYmF0Y2hbaV0pCkBAIC01OTIsMTIgKzYyMCwxMiBAQAogCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZzsKIAogCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKSk7Ci0Jd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXNwaW5fbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJX194ZnNfaW5vZGVfc2V0X3JlY2xhaW1fdGFnKHBhZywgaXApOwogCV9feGZzX2lmbGFnc19zZXQoaXAsIFhGU19JUkVDTEFJTUFCTEUpOwogCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlzcGluX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCXhmc19wZXJhZ19wdXQocGFnKTsKIH0KIApAQCAtNjM5LDkgKzY2NywxNCBAQAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAogCWludAkJCWZsYWdzKQogeworCUFTU0VSVChyY3VfcmVhZF9sb2NrX2hlbGQoKSk7CisKKwkvKiBxdWljayBjaGVjayBmb3Igc3RhbGUgUkNVIGZyZWVkIGlub2RlICovCisJaWYgKCFpcC0+aV9pbm8pCisJCXJldHVybiAxOwogCiAJLyoKLQkgKiBkbyBzb21lIHVubG9ja2VkIGNoZWNrcyBmaXJzdCB0byBhdm9pZCB1bm5lY2NlYXJ5IGxvY2sgdHJhZmZpYy4KKwkgKiBkbyBzb21lIHVubG9ja2VkIGNoZWNrcyBmaXJzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBsb2NrIHRyYWZmaWMuCiAJICogVGhlIGZpcnN0IGlzIGEgZmx1c2ggbG9jayBjaGVjaywgdGhlIHNlY29uZCBpcyBhIGFscmVhZHkgaW4gcmVjbGFpbQogCSAqIGNoZWNrLiBPbmx5IGRvIHRoZXNlIGNoZWNrcyBpZiB3ZSBhcmUgbm90IGdvaW5nIHRvIGJsb2NrIG9uIGxvY2tzLgogCSAqLwpAQCAtNjU0LDExICs2ODcsMTYgQEAKIAkgKiBUaGUgcmFkaXggdHJlZSBsb2NrIGhlcmUgcHJvdGVjdHMgYSB0aHJlYWQgaW4geGZzX2lnZXQgZnJvbSByYWNpbmcKIAkgKiB3aXRoIHVzIHN0YXJ0aW5nIHJlY2xhaW0gb24gdGhlIGlub2RlLiAgT25jZSB3ZSBoYXZlIHRoZQogCSAqIFhGU19JUkVDTEFJTSBmbGFnIHNldCBpdCB3aWxsIG5vdCB0b3VjaCB1cy4KKwkgKgorCSAqIER1ZSB0byBSQ1UgbG9va3VwLCB3ZSBtYXkgZmluZCBpbm9kZXMgdGhhdCBoYXZlIGJlZW4gZnJlZWQgYW5kIG9ubHkKKwkgKiBoYXZlIFhGU19JUkVDTEFJTSBzZXQuICBJbmRlZWQsIHdlIG1heSBzZWUgcmVhbGxvY2F0ZWQgaW5vZGVzIHRoYXQKKwkgKiBhcmVuJ3QgY2FuZGlkYXRlcyBmb3IgcmVjbGFpbSBhdCBhbGwsIHNvIHdlIG11c3QgY2hlY2sgdGhlCisJICogWEZTX0lSRUNMQUlNQUJMRSBpcyBzZXQgZmlyc3QgYmVmb3JlIHByb2NlZWRpbmcgdG8gcmVjbGFpbS4KIAkgKi8KIAlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCUFTU0VSVF9BTFdBWVMoX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpKTsKLQlpZiAoX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTSkpIHsKLQkJLyogaWdub3JlIGFzIGl0IGlzIGFscmVhZHkgdW5kZXIgcmVjbGFpbSAqLworCWlmICghX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTUFCTEUpIHx8CisJICAgIF9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU0pKSB7CisJCS8qIG5vdCBhIHJlY2xhaW0gY2FuZGlkYXRlLiAqLwogCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CiAJCXJldHVybiAxOwogCX0KQEAgLTc5NSwxMiArODMzLDEyIEBACiAJICogYWRkZWQgdG8gdGhlIHRyZWUgYXNzZXJ0IHRoYXQgaXQncyBiZWVuIHRoZXJlIGJlZm9yZSB0byBjYXRjaAogCSAqIHByb2JsZW1zIHdpdGggdGhlIGlub2RlIGxpZmUgdGltZSBlYXJseSBvbi4KIAkgKi8KLQl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJaWYgKCFyYWRpeF90cmVlX2RlbGV0ZSgmcGFnLT5wYWdfaWNpX3Jvb3QsCiAJCQkJWEZTX0lOT19UT19BR0lOTyhpcC0+aV9tb3VudCwgaXAtPmlfaW5vKSkpCiAJCUFTU0VSVCgwKTsKIAlfX3hmc19pbm9kZV9jbGVhcl9yZWNsYWltKHBhZywgaXApOwotCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAKIAkvKgogCSAqIEhlcmUgd2UgZG8gYW4gKGFsbW9zdCkgc3B1cmlvdXMgaW5vZGUgbG9jayBpbiBvcmRlciB0byBjb29yZGluYXRlCkBAIC04NjQsMTQgKzkwMiwxNCBAQAogCQkJc3RydWN0IHhmc19pbm9kZSAqYmF0Y2hbWEZTX0xPT0tVUF9CQVRDSF07CiAJCQlpbnQJaTsKIAotCQkJd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZygKIAkJCQkJJnBhZy0+cGFnX2ljaV9yb290LAogCQkJCQkodm9pZCAqKiliYXRjaCwgZmlyc3RfaW5kZXgsCiAJCQkJCVhGU19MT09LVVBfQkFUQ0gsCiAJCQkJCVhGU19JQ0lfUkVDTEFJTV9UQUcpOwogCQkJaWYgKCFucl9mb3VuZCkgewotCQkJCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC04OTEsMTQgKzkyOSwyNCBAQAogCQkJCSAqIG9jY3VyIGlmIHdlIGhhdmUgaW5vZGVzIGluIHRoZSBsYXN0IGJsb2NrIG9mCiAJCQkJICogdGhlIEFHIGFuZCB3ZSBhcmUgY3VycmVudGx5IHBvaW50aW5nIHRvIHRoZQogCQkJCSAqIGxhc3QgaW5vZGUuCisJCQkJICoKKwkJCQkgKiBCZWNhdXNlIHdlIG1heSBzZWUgaW5vZGVzIHRoYXQgYXJlIGZyb20gdGhlCisJCQkJICogd3JvbmcgQUcgZHVlIHRvIFJDVSBmcmVlaW5nIGFuZAorCQkJCSAqIHJlYWxsb2NhdGlvbiwgb25seSB1cGRhdGUgdGhlIGluZGV4IGlmIGl0CisJCQkJICogbGllcyBpbiB0aGlzIEFHLiBJdCB3YXMgYSByYWNlIHRoYXQgbGVhZCB1cworCQkJCSAqIHRvIHNlZSB0aGlzIGlub2RlLCBzbyBhbm90aGVyIGxvb2t1cCBmcm9tCisJCQkJICogdGhlIHNhbWUgaW5kZXggd2lsbCBub3QgZmluZCBpdCBhZ2Fpbi4KIAkJCQkgKi8KKwkJCQlpZiAoWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pICE9CisJCQkJCQkJCXBhZy0+cGFnX2Fnbm8pCisJCQkJCWNvbnRpbnVlOwogCQkJCWZpcnN0X2luZGV4ID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vICsgMSk7CiAJCQkJaWYgKGZpcnN0X2luZGV4IDwgWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKSkKIAkJCQkJZG9uZSA9IDE7CiAJCQl9CiAKIAkJCS8qIHVubG9jayBub3cgd2UndmUgZ3JhYmJlZCB0aGUgaW5vZGVzLiAqLwotCQkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQkJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKIAkJCQlpZiAoIWJhdGNoW2ldKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3RyYWNlLmgKaW5kZXggYWNlZjJlOS4uNjQ3YWYyYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oCkBAIC03NjYsOCArNzY2LDggQEAKIAkJX19maWVsZChpbnQsIGN1cnJfcmVzKQogCQlfX2ZpZWxkKGludCwgdW5pdF9yZXMpCiAJCV9fZmllbGQodW5zaWduZWQgaW50LCBmbGFncykKLQkJX19maWVsZCh2b2lkICosIHJlc2VydmVfaGVhZHEpCi0JCV9fZmllbGQodm9pZCAqLCB3cml0ZV9oZWFkcSkKKwkJX19maWVsZChpbnQsIHJlc2VydmVxKQorCQlfX2ZpZWxkKGludCwgd3JpdGVxKQogCQlfX2ZpZWxkKGludCwgZ3JhbnRfcmVzZXJ2ZV9jeWNsZSkKIAkJX19maWVsZChpbnQsIGdyYW50X3Jlc2VydmVfYnl0ZXMpCiAJCV9fZmllbGQoaW50LCBncmFudF93cml0ZV9jeWNsZSkKQEAgLTc4NCwxOSArNzg0LDIxIEBACiAJCV9fZW50cnktPmN1cnJfcmVzID0gdGljLT50X2N1cnJfcmVzOwogCQlfX2VudHJ5LT51bml0X3JlcyA9IHRpYy0+dF91bml0X3JlczsKIAkJX19lbnRyeS0+ZmxhZ3MgPSB0aWMtPnRfZmxhZ3M7Ci0JCV9fZW50cnktPnJlc2VydmVfaGVhZHEgPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcTsKLQkJX19lbnRyeS0+d3JpdGVfaGVhZHEgPSBsb2ctPmxfd3JpdGVfaGVhZHE7Ci0JCV9fZW50cnktPmdyYW50X3Jlc2VydmVfY3ljbGUgPSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZTsKLQkJX19lbnRyeS0+Z3JhbnRfcmVzZXJ2ZV9ieXRlcyA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzOwotCQlfX2VudHJ5LT5ncmFudF93cml0ZV9jeWNsZSA9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZTsKLQkJX19lbnRyeS0+Z3JhbnRfd3JpdGVfYnl0ZXMgPSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXM7CisJCV9fZW50cnktPnJlc2VydmVxID0gbGlzdF9lbXB0eSgmbG9nLT5sX3Jlc2VydmVxKTsKKwkJX19lbnRyeS0+d3JpdGVxID0gbGlzdF9lbXB0eSgmbG9nLT5sX3dyaXRlcSk7CisJCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZCgmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCwKKwkJCQkmX19lbnRyeS0+Z3JhbnRfcmVzZXJ2ZV9jeWNsZSwKKwkJCQkmX19lbnRyeS0+Z3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CisJCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZCgmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsCisJCQkJJl9fZW50cnktPmdyYW50X3dyaXRlX2N5Y2xlLAorCQkJCSZfX2VudHJ5LT5ncmFudF93cml0ZV9ieXRlcyk7CiAJCV9fZW50cnktPmN1cnJfY3ljbGUgPSBsb2ctPmxfY3Vycl9jeWNsZTsKIAkJX19lbnRyeS0+Y3Vycl9ibG9jayA9IGxvZy0+bF9jdXJyX2Jsb2NrOwotCQlfX2VudHJ5LT50YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKKwkJX19lbnRyeS0+dGFpbF9sc24gPSBhdG9taWM2NF9yZWFkKCZsb2ctPmxfdGFpbF9sc24pOwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgdHlwZSAlcyB0X29jbnQgJXUgdF9jbnQgJXUgdF9jdXJyX3JlcyAldSAiCi0JCSAgInRfdW5pdF9yZXMgJXUgdF9mbGFncyAlcyByZXNlcnZlX2hlYWRxIDB4JXAgIgotCQkgICJ3cml0ZV9oZWFkcSAweCVwIGdyYW50X3Jlc2VydmVfY3ljbGUgJWQgIgorCQkgICJ0X3VuaXRfcmVzICV1IHRfZmxhZ3MgJXMgcmVzZXJ2ZXEgJXMgIgorCQkgICJ3cml0ZXEgJXMgZ3JhbnRfcmVzZXJ2ZV9jeWNsZSAlZCAiCiAJCSAgImdyYW50X3Jlc2VydmVfYnl0ZXMgJWQgZ3JhbnRfd3JpdGVfY3ljbGUgJWQgIgogCQkgICJncmFudF93cml0ZV9ieXRlcyAlZCBjdXJyX2N5Y2xlICVkIGN1cnJfYmxvY2sgJWQgIgogCQkgICJ0YWlsX2N5Y2xlICVkIHRhaWxfYmxvY2sgJWQiLApAQCAtODA3LDggKzgwOSw4IEBACiAJCSAgX19lbnRyeS0+Y3Vycl9yZXMsCiAJCSAgX19lbnRyeS0+dW5pdF9yZXMsCiAJCSAgX19wcmludF9mbGFncyhfX2VudHJ5LT5mbGFncywgInwiLCBYTE9HX1RJQ19GTEFHUyksCi0JCSAgX19lbnRyeS0+cmVzZXJ2ZV9oZWFkcSwKLQkJICBfX2VudHJ5LT53cml0ZV9oZWFkcSwKKwkJICBfX2VudHJ5LT5yZXNlcnZlcSA/ICJlbXB0eSIgOiAiYWN0aXZlIiwKKwkJICBfX2VudHJ5LT53cml0ZXEgPyAiZW1wdHkiIDogImFjdGl2ZSIsCiAJCSAgX19lbnRyeS0+Z3JhbnRfcmVzZXJ2ZV9jeWNsZSwKIAkJICBfX2VudHJ5LT5ncmFudF9yZXNlcnZlX2J5dGVzLAogCQkgIF9fZW50cnktPmdyYW50X3dyaXRlX2N5Y2xlLApAQCAtODM1LDYgKzgzNyw3IEBACiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF93YWtlMSk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF9zbGVlcDIpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfZ3JhbnRfd2FrZTIpOworREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfZ3JhbnRfd2FrZV91cCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX2VudGVyKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZXhpdCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX2Vycm9yKTsKQEAgLTg0Miw2ICs4NDUsNyBAQAogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV93YWtlMSk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX3NsZWVwMik7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX3dha2UyKTsKK0RFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZV91cCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3Jlc2VydmVfZW50ZXIpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF9yZXNlcnZlX2V4aXQpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF9yZXNlcnZlX3N1Yik7CkBAIC05MzUsMTAgKzkzOSwxMCBAQAogREVGSU5FX1BBR0VfRVZFTlQoeGZzX3JlbGVhc2VwYWdlKTsKIERFRklORV9QQUdFX0VWRU5UKHhmc19pbnZhbGlkYXRlcGFnZSk7CiAKLURFQ0xBUkVfRVZFTlRfQ0xBU1MoeGZzX2lvbWFwX2NsYXNzLAorREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfaW1hcF9jbGFzcywKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2lub2RlICppcCwgeGZzX29mZl90IG9mZnNldCwgc3NpemVfdCBjb3VudCwKLQkJIGludCBmbGFncywgc3RydWN0IHhmc19ibWJ0X2lyZWMgKmlyZWMpLAotCVRQX0FSR1MoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBpcmVjKSwKKwkJIGludCB0eXBlLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqaXJlYyksCisJVFBfQVJHUyhpcCwgb2Zmc2V0LCBjb3VudCwgdHlwZSwgaXJlYyksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZChkZXZfdCwgZGV2KQogCQlfX2ZpZWxkKHhmc19pbm9fdCwgaW5vKQpAQCAtOTQ2LDcgKzk1MCw3IEBACiAJCV9fZmllbGQobG9mZl90LCBuZXdfc2l6ZSkKIAkJX19maWVsZChsb2ZmX3QsIG9mZnNldCkKIAkJX19maWVsZChzaXplX3QsIGNvdW50KQotCQlfX2ZpZWxkKGludCwgZmxhZ3MpCisJCV9fZmllbGQoaW50LCB0eXBlKQogCQlfX2ZpZWxkKHhmc19maWxlb2ZmX3QsIHN0YXJ0b2ZmKQogCQlfX2ZpZWxkKHhmc19mc2Jsb2NrX3QsIHN0YXJ0YmxvY2spCiAJCV9fZmllbGQoeGZzX2ZpbGJsa3NfdCwgYmxvY2tjb3VudCkKQEAgLTk1OCwxMyArOTYyLDEzIEBACiAJCV9fZW50cnktPm5ld19zaXplID0gaXAtPmlfbmV3X3NpemU7CiAJCV9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKIAkJX19lbnRyeS0+Y291bnQgPSBjb3VudDsKLQkJX19lbnRyeS0+ZmxhZ3MgPSBmbGFnczsKKwkJX19lbnRyeS0+dHlwZSA9IHR5cGU7CiAJCV9fZW50cnktPnN0YXJ0b2ZmID0gaXJlYyA/IGlyZWMtPmJyX3N0YXJ0b2ZmIDogMDsKIAkJX19lbnRyeS0+c3RhcnRibG9jayA9IGlyZWMgPyBpcmVjLT5icl9zdGFydGJsb2NrIDogMDsKIAkJX19lbnRyeS0+YmxvY2tjb3VudCA9IGlyZWMgPyBpcmVjLT5icl9ibG9ja2NvdW50IDogMDsKIAkpLAogCVRQX3ByaW50aygiZGV2ICVkOiVkIGlubyAweCVsbHggc2l6ZSAweCVsbHggbmV3X3NpemUgMHglbGx4ICIKLQkJICAib2Zmc2V0IDB4JWxseCBjb3VudCAlemQgZmxhZ3MgJXMgIgorCQkgICJvZmZzZXQgMHglbGx4IGNvdW50ICV6ZCB0eXBlICVzICIKIAkJICAic3RhcnRvZmYgMHglbGx4IHN0YXJ0YmxvY2sgJWxsZCBibG9ja2NvdW50IDB4JWxseCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICBfX2VudHJ5LT5pbm8sCkBAIC05NzIsMjAgKzk3NiwyMSBAQAogCQkgIF9fZW50cnktPm5ld19zaXplLAogCQkgIF9fZW50cnktPm9mZnNldCwKIAkJICBfX2VudHJ5LT5jb3VudCwKLQkJICBfX3ByaW50X2ZsYWdzKF9fZW50cnktPmZsYWdzLCAifCIsIEJNQVBJX0ZMQUdTKSwKKwkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPnR5cGUsIFhGU19JT19UWVBFUyksCiAJCSAgX19lbnRyeS0+c3RhcnRvZmYsCiAJCSAgKF9faW50NjRfdClfX2VudHJ5LT5zdGFydGJsb2NrLAogCQkgIF9fZW50cnktPmJsb2NrY291bnQpCiApCiAKICNkZWZpbmUgREVGSU5FX0lPTUFQX0VWRU5UKG5hbWUpCVwKLURFRklORV9FVkVOVCh4ZnNfaW9tYXBfY2xhc3MsIG5hbWUsCVwKK0RFRklORV9FVkVOVCh4ZnNfaW1hcF9jbGFzcywgbmFtZSwJXAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfb2ZmX3Qgb2Zmc2V0LCBzc2l6ZV90IGNvdW50LAlcCi0JCSBpbnQgZmxhZ3MsIHN0cnVjdCB4ZnNfYm1idF9pcmVjICppcmVjKSwJCVwKLQlUUF9BUkdTKGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywgaXJlYykpCi1ERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2lvbWFwX2VudGVyKTsKLURFRklORV9JT01BUF9FVkVOVCh4ZnNfaW9tYXBfZm91bmQpOwotREVGSU5FX0lPTUFQX0VWRU5UKHhmc19pb21hcF9hbGxvYyk7CisJCSBpbnQgdHlwZSwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKmlyZWMpLAkJXAorCVRQX0FSR1MoaXAsIG9mZnNldCwgY291bnQsIHR5cGUsIGlyZWMpKQorREVGSU5FX0lPTUFQX0VWRU5UKHhmc19tYXBfYmxvY2tzX2ZvdW5kKTsKK0RFRklORV9JT01BUF9FVkVOVCh4ZnNfbWFwX2Jsb2Nrc19hbGxvYyk7CitERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2dldF9ibG9ja3NfZm91bmQpOworREVGSU5FX0lPTUFQX0VWRU5UKHhmc19nZXRfYmxvY2tzX2FsbG9jKTsKIAogREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfc2ltcGxlX2lvX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfb2ZmX3Qgb2Zmc2V0LCBzc2l6ZV90IGNvdW50KSwKQEAgLTEwMjIsNiArMTAyNyw3IEBACiAJVFBfQVJHUyhpcCwgb2Zmc2V0LCBjb3VudCkpCiBERUZJTkVfU0lNUExFX0lPX0VWRU5UKHhmc19kZWxhbGxvY19lbm9zcGMpOwogREVGSU5FX1NJTVBMRV9JT19FVkVOVCh4ZnNfdW53cml0dGVuX2NvbnZlcnQpOworREVGSU5FX1NJTVBMRV9JT19FVkVOVCh4ZnNfZ2V0X2Jsb2Nrc19ub3Rmb3VuZCk7CiAKIAogVFJBQ0VfRVZFTlQoeGZzX2l0cnVuY2F0ZV9zdGFydCwKQEAgLTE0MjAsNiArMTQyNiw3IEBACiAJVFBfUFJPVE8oc3RydWN0IHhmc19hbGxvY19hcmcgKmFyZ3MpLCBcCiAJVFBfQVJHUyhhcmdzKSkKIERFRklORV9BTExPQ19FVkVOVCh4ZnNfYWxsb2NfZXhhY3RfZG9uZSk7CitERUZJTkVfQUxMT0NfRVZFTlQoeGZzX2FsbG9jX2V4YWN0X25vdGZvdW5kKTsKIERFRklORV9BTExPQ19FVkVOVCh4ZnNfYWxsb2NfZXhhY3RfZXJyb3IpOwogREVGSU5FX0FMTE9DX0VWRU5UKHhmc19hbGxvY19uZWFyX25vbWlubGVmdCk7CiBERUZJTkVfQUxMT0NfRVZFTlQoeGZzX2FsbG9jX25lYXJfZmlyc3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCmluZGV4IGZhZjhlMWEuLmQyMmFhMzEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYworKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKQEAgLTE0OSw3ICsxNDksNiBAQAogCUFTU0VSVChsaXN0X2VtcHR5KCZkcXAtPnFfZnJlZWxpc3QpKTsKIAogCW11dGV4X2Rlc3Ryb3koJmRxcC0+cV9xbG9jayk7Ci0Jc3ZfZGVzdHJveSgmZHFwLT5xX3BpbndhaXQpOwogCWttZW1fem9uZV9mcmVlKHhmc19HcW0tPnFtX2Rxem9uZSwgZHFwKTsKIAogCWF0b21pY19kZWMoJnhmc19HcW0tPnFtX3RvdGFsZHF1b3RzKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWcuaCBiL2ZzL3hmcy94ZnNfYWcuaAppbmRleCA2M2M3YTFhLi41ODYzMmNjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FnLmgKKysrIGIvZnMveGZzL3hmc19hZy5oCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogCWF0b21pY190ICAgICAgICBwYWdmX2ZzdHJtczsgICAgLyogIyBvZiBmaWxlc3RyZWFtcyBhY3RpdmUgaW4gdGhpcyBBRyAqLwogCi0Jcndsb2NrX3QJcGFnX2ljaV9sb2NrOwkvKiBpbmNvcmUgaW5vZGUgbG9jayAqLworCXNwaW5sb2NrX3QJcGFnX2ljaV9sb2NrOwkvKiBpbmNvcmUgaW5vZGUgY2FjaGUgbG9jayAqLwogCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgcGFnX2ljaV9yb290OwkvKiBpbmNvcmUgaW5vZGUgY2FjaGUgcm9vdCAqLwogCWludAkJcGFnX2ljaV9yZWNsYWltYWJsZTsJLyogcmVjbGFpbWFibGUgaW5vZGVzICovCiAJc3RydWN0IG11dGV4CXBhZ19pY2lfcmVjbGFpbV9sb2NrOwkvKiBzZXJpYWxpc2F0aW9uIHBvaW50ICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmMgYi9mcy94ZnMveGZzX2FsbG9jLmMKaW5kZXggMTEyYWJjNC4uZmE4NzIzZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwpAQCAtNTc3LDYxICs1NzcsNTggQEAKIAl4ZnNfZXh0bGVuX3QJcmxlbjsJLyogbGVuZ3RoIG9mIHJldHVybmVkIGV4dGVudCAqLwogCiAJQVNTRVJUKGFyZ3MtPmFsaWdubWVudCA9PSAxKTsKKwogCS8qCiAJICogQWxsb2NhdGUvaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LW51bWJlciBmcmVlc3BhY2UgYnRyZWUuCiAJICovCiAJYm5vX2N1ciA9IHhmc19hbGxvY2J0X2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKLQkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTyk7CisJCQkJCSAgYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTyk7CisKIAkvKgogCSAqIExvb2t1cCBibm8gYW5kIG1pbmxlbiBpbiB0aGUgYnRyZWUgKG1pbmxlbiBpcyBpcnJlbGV2YW50LCByZWFsbHkpLgogCSAqIExvb2sgZm9yIHRoZSBjbG9zZXN0IGZyZWUgYmxvY2sgPD0gYm5vLCBpdCBtdXN0IGNvbnRhaW4gYm5vCiAJICogaWYgYW55IGZyZWUgYmxvY2sgZG9lcy4KIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9sZShibm9fY3VyLCBhcmdzLT5hZ2JubywgYXJncy0+bWlubGVuLCAmaSkpKQorCWVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9sZShibm9fY3VyLCBhcmdzLT5hZ2JubywgYXJncy0+bWlubGVuLCAmaSk7CisJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMDsKLQlpZiAoIWkpIHsKLQkJLyoKLQkJICogRGlkbid0IGZpbmQgaXQsIHJldHVybiBudWxsLgotCQkgKi8KLQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFpKQorCQlnb3RvIG5vdF9mb3VuZDsKKwogCS8qCiAJICogR3JhYiB0aGUgZnJlZXNwYWNlIHJlY29yZC4KIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJmZibm8sICZmbGVuLCAmaSkpKQorCWVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJmZibm8sICZmbGVuLCAmaSk7CisJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMDsKIAlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CiAJQVNTRVJUKGZibm8gPD0gYXJncy0+YWdibm8pOwogCW1pbmVuZCA9IGFyZ3MtPmFnYm5vICsgYXJncy0+bWlubGVuOwogCW1heGVuZCA9IGFyZ3MtPmFnYm5vICsgYXJncy0+bWF4bGVuOwogCWZlbmQgPSBmYm5vICsgZmxlbjsKKwogCS8qCiAJICogR2l2ZSB1cCBpZiB0aGUgZnJlZXNwYWNlIGlzbid0IGxvbmcgZW5vdWdoIGZvciB0aGUgbWluaW11bSByZXF1ZXN0LgogCSAqLwotCWlmIChmZW5kIDwgbWluZW5kKSB7Ci0JCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmIChmZW5kIDwgbWluZW5kKQorCQlnb3RvIG5vdF9mb3VuZDsKKwogCS8qCiAJICogRW5kIG9mIGV4dGVudCB3aWxsIGJlIHNtYWxsZXIgb2YgdGhlIGZyZWVzcGFjZSBlbmQgYW5kIHRoZQogCSAqIG1heGltYWwgcmVxdWVzdGVkIGVuZC4KLQkgKi8KLQllbmQgPSBYRlNfQUdCTE9DS19NSU4oZmVuZCwgbWF4ZW5kKTsKLQkvKgorCSAqCiAJICogRml4IHRoZSBsZW5ndGggYWNjb3JkaW5nIHRvIG1vZCBhbmQgcHJvZCBpZiBnaXZlbi4KIAkgKi8KKwllbmQgPSBYRlNfQUdCTE9DS19NSU4oZmVuZCwgbWF4ZW5kKTsKIAlhcmdzLT5sZW4gPSBlbmQgLSBhcmdzLT5hZ2JubzsKIAl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKLQlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgewotCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkKKwkJZ290byBub3RfZm91bmQ7CisKIAlybGVuID0gYXJncy0+bGVuOwogCUFTU0VSVChhcmdzLT5hZ2JubyArIHJsZW4gPD0gZmVuZCk7CiAJZW5kID0gYXJncy0+YWdibm8gKyBybGVuOworCiAJLyoKIAkgKiBXZSBhcmUgYWxsb2NhdGluZyBhZ2JubyBmb3IgcmxlbiBbYWdibm8gLi4gZW5kXQogCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgpAQCAtNjQwLDE2ICs2MzcsMjUgQEAKIAkJYXJncy0+YWdubywgWEZTX0JUTlVNX0NOVCk7CiAJQVNTRVJUKGFyZ3MtPmFnYm5vICsgYXJncy0+bGVuIDw9CiAJCWJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoKSk7Ci0JaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyLCBmYm5vLCBmbGVuLAotCQkJYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwgWEZTQV9GSVhVUF9CTk9fT0spKSkgeworCWVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sIGFyZ3MtPmFnYm5vLAorCQkJCSAgICAgIGFyZ3MtPmxlbiwgWEZTQV9GSVhVUF9CTk9fT0spOworCWlmIChlcnJvcikgewogCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfRVJST1IpOwogCQlnb3RvIGVycm9yMDsKIAl9CisKIAl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CiAJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOwogCi0JdHJhY2VfeGZzX2FsbG9jX2V4YWN0X2RvbmUoYXJncyk7CiAJYXJncy0+d2FzZnJvbWZsID0gMDsKKwl0cmFjZV94ZnNfYWxsb2NfZXhhY3RfZG9uZShhcmdzKTsKKwlyZXR1cm4gMDsKKworbm90X2ZvdW5kOgorCS8qIERpZG4ndCBmaW5kIGl0LCByZXR1cm4gbnVsbC4gKi8KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwl0cmFjZV94ZnNfYWxsb2NfZXhhY3Rfbm90Zm91bmQoYXJncyk7CiAJcmV0dXJuIDA7CiAKIGVycm9yMDoKQEAgLTY1OSw2ICs2NjUsOTUgQEAKIH0KIAogLyoKKyAqIFNlYXJjaCB0aGUgYnRyZWUgaW4gYSBnaXZlbiBkaXJlY3Rpb24gdmlhIHRoZSBzZWFyY2ggY3Vyc29yIGFuZCBjb21wYXJlCisgKiB0aGUgcmVjb3JkcyBmb3VuZCBhZ2FpbnN0IHRoZSBnb29kIGV4dGVudCB3ZSd2ZSBhbHJlYWR5IGZvdW5kLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NfZmluZF9iZXN0X2V4dGVudCgKKwlzdHJ1Y3QgeGZzX2FsbG9jX2FyZwkqYXJncywJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqKmdjdXIsCS8qIGdvb2QgY3Vyc29yICovCisJc3RydWN0IHhmc19idHJlZV9jdXIJKipzY3VyLAkvKiBzZWFyY2hpbmcgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJZ2RpZmYsCS8qIGRpZmZlcmVuY2UgZm9yIHNlYXJjaCBjb21wYXJpc29uICovCisJeGZzX2FnYmxvY2tfdAkJKnNibm8sCS8qIGV4dGVudCBmb3VuZCBieSBzZWFyY2ggKi8KKwl4ZnNfZXh0bGVuX3QJCSpzbGVuLAorCXhmc19leHRsZW5fdAkJKnNsZW5hLAkvKiBhbGlnbmVkIGxlbmd0aCAqLworCWludAkJCWRpcikJLyogMCA9IHNlYXJjaCByaWdodCwgMSA9IHNlYXJjaCBsZWZ0ICovCit7CisJeGZzX2FnYmxvY2tfdAkJYm5vOworCXhmc19hZ2Jsb2NrX3QJCW5ldzsKKwl4ZnNfYWdibG9ja190CQlzZGlmZjsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlpOworCisJLyogVGhlIGdvb2QgZXh0ZW50IGlzIHBlcmZlY3QsIG5vIG5lZWQgdG8gIHNlYXJjaC4gKi8KKwlpZiAoIWdkaWZmKQorCQlnb3RvIG91dF91c2VfZ29vZDsKKworCS8qCisJICogTG9vayB1bnRpbCB3ZSBmaW5kIGEgYmV0dGVyIG9uZSwgcnVuIG91dCBvZiBzcGFjZSBvciBydW4gb2ZmIHRoZSBlbmQuCisJICovCisJZG8geworCQllcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKCpzY3VyLCBzYm5vLCBzbGVuLCAmaSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQoKnNibm8sICpzbGVuLCBhcmdzLT5hbGlnbm1lbnQsCisJCQkJCSAgYXJncy0+bWlubGVuLCAmYm5vLCBzbGVuYSk7CisKKwkJLyoKKwkJICogVGhlIGdvb2QgZXh0ZW50IGlzIGNsb3NlciB0aGFuIHRoaXMgb25lLgorCQkgKi8KKwkJaWYgKCFkaXIpIHsKKwkJCWlmIChibm8gPj0gYXJncy0+YWdibm8gKyBnZGlmZikKKwkJCQlnb3RvIG91dF91c2VfZ29vZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChibm8gPD0gYXJncy0+YWdibm8gLSBnZGlmZikKKwkJCQlnb3RvIG91dF91c2VfZ29vZDsKKwkJfQorCisJCS8qCisJCSAqIFNhbWUgZGlzdGFuY2UsIGNvbXBhcmUgbGVuZ3RoIGFuZCBwaWNrIHRoZSBiZXN0LgorCQkgKi8KKwkJaWYgKCpzbGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKKwkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKCpzbGVuYSwgYXJncy0+bWF4bGVuKTsKKwkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOworCisJCQlzZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKKwkJCQkJCSAgICAgICBhcmdzLT5hbGlnbm1lbnQsICpzYm5vLAorCQkJCQkJICAgICAgICpzbGVuLCAmbmV3KTsKKworCQkJLyoKKwkJCSAqIENob29zZSBjbG9zZXIgc2l6ZSBhbmQgaW52YWxpZGF0ZSBvdGhlciBjdXJzb3IuCisJCQkgKi8KKwkJCWlmIChzZGlmZiA8IGdkaWZmKQorCQkJCWdvdG8gb3V0X3VzZV9zZWFyY2g7CisJCQlnb3RvIG91dF91c2VfZ29vZDsKKwkJfQorCisJCWlmICghZGlyKQorCQkJZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KCpzY3VyLCAwLCAmaSk7CisJCWVsc2UKKwkJCWVycm9yID0geGZzX2J0cmVlX2RlY3JlbWVudCgqc2N1ciwgMCwgJmkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9IHdoaWxlIChpKTsKKworb3V0X3VzZV9nb29kOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKCpzY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJKnNjdXIgPSBOVUxMOworCXJldHVybiAwOworCitvdXRfdXNlX3NlYXJjaDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcigqZ2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCSpnY3VyID0gTlVMTDsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCS8qIGNhbGxlciBpbnZhbGlkYXRlcyBjdXJzb3JzICovCisJcmV0dXJuIGVycm9yOworfQorCisvKgogICogQWxsb2NhdGUgYSB2YXJpYWJsZSBleHRlbnQgbmVhciBibm8gaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgYWduby4KICAqIEV4dGVudCdzIGxlbmd0aCAocmV0dXJuZWQgaW4gbGVuKSB3aWxsIGJlIGJldHdlZW4gbWlubGVuIGFuZCBtYXhsZW4sCiAgKiBhbmQgb2YgdGhlIGZvcm0gayAqIHByb2QgKyBtb2QgdW5sZXNzIHRoZXJlJ3Mgbm90aGluZyB0aGF0IGxhcmdlLgpAQCAtOTI1LDIwMyArMTAyMCw0NSBAQAogCQkJfQogCQl9CiAJfSB3aGlsZSAoYm5vX2N1cl9sdCB8fCBibm9fY3VyX2d0KTsKKwogCS8qCiAJICogR290IGJvdGggY3Vyc29ycyBzdGlsbCBhY3RpdmUsIG5lZWQgdG8gZmluZCBiZXR0ZXIgZW50cnkuCiAJICovCiAJaWYgKGJub19jdXJfbHQgJiYgYm5vX2N1cl9ndCkgewotCQkvKgotCQkgKiBMZWZ0IHNpZGUgaXMgbG9uZyBlbm91Z2gsIGxvb2sgZm9yIGEgcmlnaHQgc2lkZSBlbnRyeS4KLQkJICovCiAJCWlmIChsdGxlbmEgPj0gYXJncy0+bWlubGVuKSB7CiAJCQkvKgotCQkJICogRml4IHVwIHRoZSBsZW5ndGguCisJCQkgKiBMZWZ0IHNpZGUgaXMgZ29vZCwgbG9vayBmb3IgYSByaWdodCBzaWRlIGVudHJ5LgogCQkJICovCiAJCQlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTihsdGxlbmEsIGFyZ3MtPm1heGxlbik7CiAJCQl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKLQkJCXJsZW4gPSBhcmdzLT5sZW47Ci0JCQlsdGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBybGVuLAorCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAogCQkJCWFyZ3MtPmFsaWdubWVudCwgbHRibm8sIGx0bGVuLCAmbHRuZXcpOworCisJCQllcnJvciA9IHhmc19hbGxvY19maW5kX2Jlc3RfZXh0ZW50KGFyZ3MsCisJCQkJCQkmYm5vX2N1cl9sdCwgJmJub19jdXJfZ3QsCisJCQkJCQlsdGRpZmYsICZndGJubywgJmd0bGVuLCAmZ3RsZW5hLAorCQkJCQkJMCAvKiBzZWFyY2ggcmlnaHQgKi8pOworCQl9IGVsc2UgeworCQkJQVNTRVJUKGd0bGVuYSA+PSBhcmdzLT5taW5sZW4pOworCiAJCQkvKgotCQkJICogTm90IHBlcmZlY3QuCi0JCQkgKi8KLQkJCWlmIChsdGRpZmYpIHsKLQkJCQkvKgotCQkJCSAqIExvb2sgdW50aWwgd2UgZmluZCBhIGJldHRlciBvbmUsIHJ1biBvdXQgb2YKLQkJCQkgKiBzcGFjZSwgb3IgcnVuIG9mZiB0aGUgZW5kLgotCQkJCSAqLwotCQkJCXdoaWxlIChibm9fY3VyX2x0ICYmIGJub19jdXJfZ3QpIHsKLQkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKAotCQkJCQkJCWJub19jdXJfZ3QsICZndGJubywKLQkJCQkJCQkmZ3RsZW4sICZpKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQkJCQl4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGd0Ym5vLCBndGxlbiwKLQkJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAotCQkJCQkJJmd0Ym5vYSwgJmd0bGVuYSk7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSBsZWZ0IG9uZSBpcyBjbGVhcmx5IGJldHRlci4KLQkJCQkJICovCi0JCQkJCWlmIChndGJub2EgPj0gYXJncy0+YWdibm8gKyBsdGRpZmYpIHsKLQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAotCQkJCQkJCWJub19jdXJfZ3QsCi0JCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCQkJYm5vX2N1cl9ndCA9IE5VTEw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBJZiB3ZSByZWFjaCBhIGJpZyBlbm91Z2ggZW50cnksCi0JCQkJCSAqIGNvbXBhcmUgdGhlIHR3byBhbmQgcGljayB0aGUgYmVzdC4KLQkJCQkJICovCi0JCQkJCWlmIChndGxlbmEgPj0gYXJncy0+bWlubGVuKSB7Ci0JCQkJCQlhcmdzLT5sZW4gPQotCQkJCQkJCVhGU19FWFRMRU5fTUlOKGd0bGVuYSwKLQkJCQkJCQkJYXJncy0+bWF4bGVuKTsKLQkJCQkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwotCQkJCQkJcmxlbiA9IGFyZ3MtPmxlbjsKLQkJCQkJCWd0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoCi0JCQkJCQkJYXJncy0+YWdibm8sIHJsZW4sCi0JCQkJCQkJYXJncy0+YWxpZ25tZW50LAotCQkJCQkJCWd0Ym5vLCBndGxlbiwgJmd0bmV3KTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBSaWdodCBzaWRlIGlzIGJldHRlci4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKGd0ZGlmZiA8IGx0ZGlmZikgewotCQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAotCQkJCQkJCQlibm9fY3VyX2x0LAotCQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7Ci0JCQkJCQl9Ci0JCQkJCQkvKgotCQkJCQkJICogTGVmdCBzaWRlIGlzIGJldHRlci4KLQkJCQkJCSAqLwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJCWJub19jdXJfZ3QsCi0JCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIEZlbGwgb2ZmIHRoZSByaWdodCBlbmQuCi0JCQkJCSAqLwotCQkJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudCgKLQkJCQkJCQlibm9fY3VyX2d0LCAwLCAmaSkpKQotCQkJCQkJZ290byBlcnJvcjA7Ci0JCQkJCWlmICghaSkgewotCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJYm5vX2N1cl9ndCwKLQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIFRoZSBsZWZ0IHNpZGUgaXMgcGVyZmVjdCwgdHJhc2ggdGhlIHJpZ2h0IHNpZGUuCi0JCQkgKi8KLQkJCWVsc2UgewotCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfZ3QsCi0JCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKLQkJCX0KLQkJfQotCQkvKgotCQkgKiBJdCdzIHRoZSByaWdodCBzaWRlIHRoYXQgd2FzIGZvdW5kIGZpcnN0LCBsb29rIGxlZnQuCi0JCSAqLwotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBGaXggdXAgdGhlIGxlbmd0aC4KKwkJCSAqIFJpZ2h0IHNpZGUgaXMgZ29vZCwgbG9vayBmb3IgYSBsZWZ0IHNpZGUgZW50cnkuCiAJCQkgKi8KIAkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGd0bGVuYSwgYXJncy0+bWF4bGVuKTsKIAkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwotCQkJcmxlbiA9IGFyZ3MtPmxlbjsKLQkJCWd0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIHJsZW4sCisJCQlndGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4sCiAJCQkJYXJncy0+YWxpZ25tZW50LCBndGJubywgZ3RsZW4sICZndG5ldyk7Ci0JCQkvKgotCQkJICogUmlnaHQgc2lkZSBlbnRyeSBpc24ndCBwZXJmZWN0LgotCQkJICovCi0JCQlpZiAoZ3RkaWZmKSB7Ci0JCQkJLyoKLQkJCQkgKiBMb29rIHVudGlsIHdlIGZpbmQgYSBiZXR0ZXIgb25lLCBydW4gb3V0IG9mCi0JCQkJICogc3BhY2UsIG9yIHJ1biBvZmYgdGhlIGVuZC4KLQkJCQkgKi8KLQkJCQl3aGlsZSAoYm5vX2N1cl9sdCAmJiBibm9fY3VyX2d0KSB7Ci0JCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYygKLQkJCQkJCQlibm9fY3VyX2x0LCAmbHRibm8sCi0JCQkJCQkJJmx0bGVuLCAmaSkpKQotCQkJCQkJZ290byBlcnJvcjA7Ci0JCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKLQkJCQkJeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZChsdGJubywgbHRsZW4sCi0JCQkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPm1pbmxlbiwKLQkJCQkJCSZsdGJub2EsICZsdGxlbmEpOwotCQkJCQkvKgotCQkJCQkgKiBUaGUgcmlnaHQgb25lIGlzIGNsZWFybHkgYmV0dGVyLgotCQkJCQkgKi8KLQkJCQkJaWYgKGx0Ym5vYSA8PSBhcmdzLT5hZ2JubyAtIGd0ZGlmZikgewotCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJYm5vX2N1cl9sdCwKLQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJCQlibm9fY3VyX2x0ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHdlIHJlYWNoIGEgYmlnIGVub3VnaCBlbnRyeSwKLQkJCQkJICogY29tcGFyZSB0aGUgdHdvIGFuZCBwaWNrIHRoZSBiZXN0LgotCQkJCQkgKi8KLQkJCQkJaWYgKGx0bGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKLQkJCQkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKAotCQkJCQkJCWx0bGVuYSwgYXJncy0+bWF4bGVuKTsKLQkJCQkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwotCQkJCQkJcmxlbiA9IGFyZ3MtPmxlbjsKLQkJCQkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoCi0JCQkJCQkJYXJncy0+YWdibm8sIHJsZW4sCi0JCQkJCQkJYXJncy0+YWxpZ25tZW50LAotCQkJCQkJCWx0Ym5vLCBsdGxlbiwgJmx0bmV3KTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBMZWZ0IHNpZGUgaXMgYmV0dGVyLgotCQkJCQkJICovCi0JCQkJCQlpZiAobHRkaWZmIDwgZ3RkaWZmKSB7Ci0JCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJCWJub19jdXJfZ3QsCi0JCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKLQkJCQkJCX0KLQkJCQkJCS8qCi0JCQkJCQkgKiBSaWdodCBzaWRlIGlzIGJldHRlci4KLQkJCQkJCSAqLwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJCWJub19jdXJfbHQsCi0JCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCQlibm9fY3VyX2x0ID0gTlVMTDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIEZlbGwgb2ZmIHRoZSBsZWZ0IGVuZC4KLQkJCQkJICovCi0JCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KAotCQkJCQkJCWJub19jdXJfbHQsIDAsICZpKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQkJaWYgKCFpKSB7Ci0JCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LAotCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCWJub19jdXJfbHQgPSBOVUxMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogVGhlIHJpZ2h0IHNpZGUgaXMgcGVyZmVjdCwgdHJhc2ggdGhlIGxlZnQgc2lkZS4KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwKLQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCWJub19jdXJfbHQgPSBOVUxMOwotCQkJfQorCisJCQllcnJvciA9IHhmc19hbGxvY19maW5kX2Jlc3RfZXh0ZW50KGFyZ3MsCisJCQkJCQkmYm5vX2N1cl9ndCwgJmJub19jdXJfbHQsCisJCQkJCQlndGRpZmYsICZsdGJubywgJmx0bGVuLCAmbHRsZW5hLAorCQkJCQkJMSAvKiBzZWFyY2ggbGVmdCAqLyk7CiAJCX0KKworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKIAl9CisKIAkvKgogCSAqIElmIHdlIGNvdWxkbid0IGdldCBhbnl0aGluZywgZ2l2ZSB1cC4KIAkgKi8KQEAgLTExMzAsNiArMTA2Nyw3IEBACiAJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CiAJCXJldHVybiAwOwogCX0KKwogCS8qCiAJICogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHNlbGVjdGVkIGEgZnJlZXNwYWNlIGVudHJ5LCBlaXRoZXIgdG8gdGhlCiAJICogbGVmdCBvciB0byB0aGUgcmlnaHQuICBJZiBpdCdzIG9uIHRoZSByaWdodCwgY29weSBhbGwgdGhlCkBAIC0xMTQ2LDYgKzEwODQsNyBAQAogCQlqID0gMTsKIAl9IGVsc2UKIAkJaiA9IDA7CisKIAkvKgogCSAqIEZpeCB1cCB0aGUgbGVuZ3RoIGFuZCBjb21wdXRlIHRoZSB1c2VmdWwgYWRkcmVzcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IGE2Y2ZmOGUuLjcxZTkwZGMyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKQEAgLTYzNyw3ICs2MzcsNyBAQAogCSAqIEl0IGRpZG4ndCBhbGwgZml0LCBzbyB3ZSBoYXZlIHRvIHNvcnQgZXZlcnl0aGluZyBvbiBoYXNodmFsLgogCSAqLwogCXNic2l6ZSA9IHNmLT5oZHIuY291bnQgKiBzaXplb2YoKnNidWYpOwotCXNicCA9IHNidWYgPSBrbWVtX2FsbG9jKHNic2l6ZSwgS01fU0xFRVApOworCXNicCA9IHNidWYgPSBrbWVtX2FsbG9jKHNic2l6ZSwgS01fU0xFRVAgfCBLTV9OT0ZTKTsKIAogCS8qCiAJICogU2NhbiB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoZSByZXN0IG9mIHRoZSBlbnRyaWVzLCBzdG9yaW5nCkBAIC0yMzg2LDcgKzIzODYsNyBAQAogCQkJCWFyZ3MuZHAgPSBjb250ZXh0LT5kcDsKIAkJCQlhcmdzLndoaWNoZm9yayA9IFhGU19BVFRSX0ZPUks7CiAJCQkJYXJncy52YWx1ZWxlbiA9IHZhbHVlbGVuOwotCQkJCWFyZ3MudmFsdWUgPSBrbWVtX2FsbG9jKHZhbHVlbGVuLCBLTV9TTEVFUCk7CisJCQkJYXJncy52YWx1ZSA9IGttZW1fYWxsb2ModmFsdWVsZW4sIEtNX1NMRUVQIHwgS01fTk9GUyk7CiAJCQkJYXJncy5ybXRibGtubyA9IGJlMzJfdG9fY3B1KG5hbWVfcm10LT52YWx1ZWJsayk7CiAJCQkJYXJncy5ybXRibGtjbnQgPSBYRlNfQl9UT19GU0IoYXJncy5kcC0+aV9tb3VudCwgdmFsdWVsZW4pOwogCQkJCXJldHZhbCA9IHhmc19hdHRyX3JtdHZhbF9nZXQoJmFyZ3MpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5jIGIvZnMveGZzL3hmc19idHJlZS5jCmluZGV4IDA0ZjljY2EuLjJmOWU5N2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2J0cmVlLmMKQEAgLTYzNCw5ICs2MzQsOCBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCUFTU0VSVCghYnAgfHwgIVhGU19CVUZfR0VURVJST1IoYnApKTsKLQlpZiAoYnAgIT0gTlVMTCkgeworCWlmIChicCkKIAkJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX01BUCwgcmVmdmFsKTsKLQl9CiAJKmJwcCA9IGJwOwogCXJldHVybiAwOwogfQpAQCAtOTQ0LDEzICs5NDMsMTMgQEAKIAlzd2l0Y2ggKGN1ci0+YmNfYnRudW0pIHsKIAljYXNlIFhGU19CVE5VTV9CTk86CiAJY2FzZSBYRlNfQlROVU1fQ05UOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19NQVAsIFhGU19BTExPQ19CVFJFRV9SRUYpOworCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCBYRlNfQUxMT0NfQlRSRUVfUkVGKTsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQlROVU1fSU5POgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19JTk9NQVAsIFhGU19JTk9fQlRSRUVfUkVGKTsKKwkJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0lOT01BUCwgWEZTX0lOT19CVFJFRV9SRUYpOwogCQlicmVhazsKIAljYXNlIFhGU19CVE5VTV9CTUFQOgotCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoKmJwcCwgQl9GU19NQVAsIFhGU19CTUFQX0JUUkVFX1JFRik7CisJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19NQVAsIFhGU19CTUFQX0JUUkVFX1JFRik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCAyNjg2ZDBkLi5lZDJiNjVmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC0xNDIsNyArMTQyLDcgQEAKICNlbmRpZgogCiBTVEFUSUMgdm9pZAl4ZnNfYnVmX2Vycm9yX3JlbHNlKHhmc19idWZfdCAqYnApOwotU1RBVElDIHZvaWQJeGZzX2J1Zl9kb19jYWxsYmFja3MoeGZzX2J1Zl90ICpicCwgeGZzX2xvZ19pdGVtX3QgKmxpcCk7CitTVEFUSUMgdm9pZAl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhzdHJ1Y3QgeGZzX2J1ZiAqYnApOwogCiAvKgogICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgbG9nIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZQpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJCSAqIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCQkgKi8KIAkJaWYgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRV9JTk9ERSkgewotCQkJeGZzX2J1Zl9kb19jYWxsYmFja3MoYnAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCk7CisJCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCk7CiAJCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOwogCQkJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOwogCQl9IGVsc2UgewpAQCAtOTE4LDE1ICs5MTgsMjYgQEAKIAlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKTsKIH0KIAorLyoKKyAqIFdlIGNhbiBoYXZlIG1hbnkgY2FsbGJhY2tzIG9uIGEgYnVmZmVyLiBSdW5uaW5nIHRoZSBjYWxsYmFja3MgaW5kaXZpZHVhbGx5CisgKiBjYW4gY2F1c2UgYSBsb3Qgb2YgY29udGVudGlvbiBvbiB0aGUgQUlMIGxvY2ssIHNvIHdlIGFsbG93IGZvciBhIHNpbmdsZQorICogY2FsbGJhY2sgdG8gYmUgYWJsZSB0byBzY2FuIHRoZSByZW1haW5pbmcgbGlwLT5saV9iaW9fbGlzdCBmb3Igb3RoZXIgaXRlbXMKKyAqIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGNhbGxiYWNrIHRvIGJlIHByb2Nlc3NlZCBpbiB0aGUgZmlyc3QgY2FsbC4KKyAqCisgKiBBcyBhIHJlc3VsdCwgdGhlIGxvb3Agd2Fsa2luZyB0aGUgY2FsbGJhY2sgbGlzdCBiZWxvdyB3aWxsIGFsc28gbW9kaWZ5IHRoZQorICogbGlzdC4gaXQgcmVtb3ZlcyB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBsaXN0IGFuZCB0aGVuIHJ1bnMgdGhlIGNhbGxiYWNrLgorICogVGhlIGxvb3AgdGhlbiByZXN0YXJ0cyBmcm9tIHRoZSBuZXcgaGVhZCBvZiB0aGUgbGlzdC4gVGhpcyBhbGxvd3MgdGhlCisgKiBjYWxsYmFjayB0byBzY2FuIGFuZCBtb2RpZnkgdGhlIGxpc3QgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciBhbmQgd2UgZG9uJ3QKKyAqIGhhdmUgdG8gY2FyZSBhYm91dCBtYWludGFpbmluZyBhIG5leHQgaXRlbSBwb2ludGVyLgorICovCiBTVEFUSUMgdm9pZAogeGZzX2J1Zl9kb19jYWxsYmFja3MoCi0JeGZzX2J1Zl90CSpicCwKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQorCXN0cnVjdCB4ZnNfYnVmCQkqYnApCiB7Ci0JeGZzX2xvZ19pdGVtX3QJKm5saXA7CisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwOwogCi0Jd2hpbGUgKGxpcCAhPSBOVUxMKSB7Ci0JCW5saXAgPSBsaXAtPmxpX2Jpb19saXN0OworCXdoaWxlICgobGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopKSAhPSBOVUxMKSB7CisJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbGlwLT5saV9iaW9fbGlzdCk7CiAJCUFTU0VSVChsaXAtPmxpX2NiICE9IE5VTEwpOwogCQkvKgogCQkgKiBDbGVhciB0aGUgbmV4dCBwb2ludGVyIHNvIHdlIGRvbid0IGhhdmUgYW55CkBAIC05MzYsNyArOTQ3LDYgQEAKIAkJICovCiAJCWxpcC0+bGlfYmlvX2xpc3QgPSBOVUxMOwogCQlsaXAtPmxpX2NiKGJwLCBsaXApOwotCQlsaXAgPSBubGlwOwogCX0KIH0KIApAQCAtOTcwLDcgKzk4MCw3IEBACiAJCQlBU1NFUlQoWEZTX0JVRl9UQVJHRVQoYnApID09IG1wLT5tX2RkZXZfdGFyZ3ApOwogCQkJWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7CiAJCQl0cmFjZV94ZnNfYnVmX2l0ZW1faW9kb25lKGJwLCBfUkVUX0lQXyk7Ci0JCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwkJCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwKTsKIAkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CiAJCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CiAJCQl4ZnNfYnVmX2lvZW5kKGJwLCAwKTsKQEAgLTEwMjksNyArMTAzOSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCk7CiAJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKIAlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CiAJeGZzX2J1Zl9pb2VuZChicCwgMCk7CkBAIC0xMDYzLDcgKzEwNzMsNyBAQAogCSAqIFdlIGhhdmUgdG8gdW5waW4gdGhlIHBpbm5lZCBidWZmZXJzIHNvIGRvIHRoZQogCSAqIGNhbGxiYWNrcy4KIAkgKi8KLQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCk7CiAJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKIAlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CiAJWEZTX0JVRl9TRVRfQlJFTFNFX0ZVTkMoYnAsTlVMTCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmggYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKaW5kZXggMGUyZWQ0My4uYjZlY2QyMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWZfaXRlbS5oCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaApAQCAtMTA1LDE3ICsxMDUsNiBAQAogCXhmc19idWZfbG9nX2Zvcm1hdF90CWJsaV9mb3JtYXQ7CS8qIGluLWxvZyBoZWFkZXIgKi8KIH0geGZzX2J1Zl9sb2dfaXRlbV90OwogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBkdXJpbmcgcmVjb3ZlcnkgdG8gcmVjb3JkIHRoZSBidWYgbG9nCi0gKiBpdGVtcyB3aGljaCBoYXZlIGJlZW4gY2FuY2VsZWQgYW5kIHNob3VsZCBub3QgYmUgcmVwbGF5ZWQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHhmc19idWZfY2FuY2VsIHsKLQl4ZnNfZGFkZHJfdAkJYmNfYmxrbm87Ci0JdWludAkJCWJjX2xlbjsKLQlpbnQJCQliY19yZWZjb3VudDsKLQlzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwJKmJjX25leHQ7Ci19IHhmc19idWZfY2FuY2VsX3Q7Ci0KIHZvaWQJeGZzX2J1Zl9pdGVtX2luaXQoc3RydWN0IHhmc19idWYgKiwgc3RydWN0IHhmc19tb3VudCAqKTsKIHZvaWQJeGZzX2J1Zl9pdGVtX3JlbHNlKHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAl4ZnNfYnVmX2l0ZW1fbG9nKHhmc19idWZfbG9nX2l0ZW1fdCAqLCB1aW50LCB1aW50KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCmluZGV4IGE1NWU2ODcuLjc1ZjJlZjYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtNDgsNiArNDgsMjggQEAKIH0KIAogLyoKKyAqIEZyZWVpbmcgdGhlIGVmaSByZXF1aXJlcyB0aGF0IHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIGFscmVhZHkKKyAqIGJlZW4gcGxhY2VkIHRoZXJlLiBIb3dldmVyLCB0aGUgRUZJIG1heSBub3QgeWV0IGhhdmUgYmVlbiBwbGFjZWQgaW4gdGhlIEFJTAorICogd2hlbiBjYWxsZWQgYnkgeGZzX2VmaV9yZWxlYXNlKCkgZnJvbSBFRkQgcHJvY2Vzc2luZyBkdWUgdG8gdGhlIG9yZGVyaW5nIG9mCisgKiBjb21taXR0ZWQgdnMgdW5waW4gb3BlcmF0aW9ucyBpbiBidWxrIGluc2VydCBvcGVyYXRpb25zLiBIZW5jZSB0aGUKKyAqIHRlc3RfYW5kX2NsZWFyX2JpdChYRlNfRUZJX0NPTU1JVFRFRCkgdG8gZW5zdXJlIG9ubHkgdGhlIGxhc3QgY2FsbGVyIGZyZWVzCisgKiB0aGUgRUZJLgorICovCitTVEFUSUMgdm9pZAorX194ZnNfZWZpX3JlbGVhc2UoCisJc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0JKmVmaXApCit7CisJc3RydWN0IHhmc19haWwJCSphaWxwID0gZWZpcC0+ZWZpX2l0ZW0ubGlfYWlscDsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFhGU19FRklfQ09NTUlUVEVELCAmZWZpcC0+ZWZpX2ZsYWdzKSkgeworCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgJmVmaXAtPmVmaV9pdGVtKTsKKwkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7CisJfQorfQorCisvKgogICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIGVmaSBpdGVtLgogICogV2Ugb25seSBuZWVkIDEgaW92ZWMgZm9yIGFuIGVmaSBpdGVtLiAgSXQganVzdCBsb2dzIHRoZSBlZmlfbG9nX2Zvcm1hdAogICogc3RydWN0dXJlLgpAQCAtNzQsNyArOTYsOCBAQAogCXN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSplZmlwID0gRUZJX0lURU0obGlwKTsKIAl1aW50CQkJc2l6ZTsKIAotCUFTU0VSVChlZmlwLT5lZmlfbmV4dF9leHRlbnQgPT0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMpOworCUFTU0VSVChhdG9taWNfcmVhZCgmZWZpcC0+ZWZpX25leHRfZXh0ZW50KSA9PQorCQkJCWVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKIAogCWVmaXAtPmVmaV9mb3JtYXQuZWZpX3R5cGUgPSBYRlNfTElfRUZJOwogCkBAIC05OSwxMCArMTIyLDEyIEBACiB9CiAKIC8qCi0gKiBXaGlsZSBFRklzIGNhbm5vdCByZWFsbHkgYmUgcGlubmVkLCB0aGUgdW5waW4gb3BlcmF0aW9uIGlzIHRoZQotICogbGFzdCBwbGFjZSBhdCB3aGljaCB0aGUgRUZJIGlzIG1hbmlwdWxhdGVkIGR1cmluZyBhIHRyYW5zYWN0aW9uLgotICogSGVyZSB3ZSBjb29yZGluYXRlIHdpdGggeGZzX2VmaV9jYW5jZWwoKSB0byBkZXRlcm1pbmUgd2hvIGdldHMgdG8KLSAqIGZyZWUgdGhlIEVGSS4KKyAqIFdoaWxlIEVGSXMgY2Fubm90IHJlYWxseSBiZSBwaW5uZWQsIHRoZSB1bnBpbiBvcGVyYXRpb24gaXMgdGhlIGxhc3QgcGxhY2UgYXQKKyAqIHdoaWNoIHRoZSBFRkkgaXMgbWFuaXB1bGF0ZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24uICBJZiB3ZSBhcmUgYmVpbmcgYXNrZWQgdG8KKyAqIHJlbW92ZSB0aGUgRUZJIGl0J3MgYmVjYXVzZSB0aGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGFuZCBieQorICogZGVmaW5pdGlvbiB0aGF0IG1lYW5zIHRoZSBFRkkgY2Fubm90IGJlIGluIHRoZSBBSUwgc28gcmVtb3ZlIGl0IGZyb20gdGhlCisgKiB0cmFuc2FjdGlvbiBhbmQgZnJlZSBpdC4gIE90aGVyd2lzZSBjb29yZGluYXRlIHdpdGggeGZzX2VmaV9yZWxlYXNlKCkgKHZpYQorICogWEZTX0VGSV9DT01NSVRURUQpIHRvIGRldGVybWluZSB3aG8gZ2V0cyB0byBmcmVlIHRoZSBFRkkuCiAgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZWZpX2l0ZW1fdW5waW4oCkBAIC0xMTAsMjAgKzEzNSwxNCBAQAogCWludAkJCXJlbW92ZSkKIHsKIAlzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqZWZpcCA9IEVGSV9JVEVNKGxpcCk7Ci0Jc3RydWN0IHhmc19haWwJCSphaWxwID0gbGlwLT5saV9haWxwOwogCi0Jc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9DQU5DRUxFRCkgewotCQlpZiAocmVtb3ZlKQotCQkJeGZzX3RyYW5zX2RlbF9pdGVtKGxpcCk7Ci0KLQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCi0JCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJaWYgKHJlbW92ZSkgeworCQlBU1NFUlQoIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpOworCQl4ZnNfdHJhbnNfZGVsX2l0ZW0obGlwKTsKIAkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7Ci0JfSBlbHNlIHsKLQkJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOwotCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJCXJldHVybjsKIAl9CisJX194ZnNfZWZpX3JlbGVhc2UoZWZpcCk7CiB9CiAKIC8qCkBAIC0xNTIsMTYgKzE3MSwyMCBAQAogfQogCiAvKgotICogVGhlIEVGSSBpcyBsb2dnZWQgb25seSBvbmNlIGFuZCBjYW5ub3QgYmUgbW92ZWQgaW4gdGhlIGxvZywgc28KLSAqIHNpbXBseSByZXR1cm4gdGhlIGxzbiBhdCB3aGljaCBpdCdzIGJlZW4gbG9nZ2VkLiAgVGhlIGNhbmNlbGVkCi0gKiBmbGFnIGlzIG5vdCBwYWlkIGFueSBhdHRlbnRpb24gaGVyZS4gIENoZWNraW5nIGZvciB0aGF0IGlzIGRlbGF5ZWQKLSAqIHVudGlsIHRoZSBFRkkgaXMgdW5waW5uZWQuCisgKiBUaGUgRUZJIGlzIGxvZ2dlZCBvbmx5IG9uY2UgYW5kIGNhbm5vdCBiZSBtb3ZlZCBpbiB0aGUgbG9nLCBzbyBzaW1wbHkgcmV0dXJuCisgKiB0aGUgbHNuIGF0IHdoaWNoIGl0J3MgYmVlbiBsb2dnZWQuICBGb3IgYnVsayB0cmFuc2FjdGlvbiBjb21taXR0ZWQKKyAqIHByb2Nlc3NpbmcsIHRoZSBFRkkgbWF5IGJlIHByb2Nlc3NlZCBidXQgbm90IHlldCB1bnBpbm5lZCBwcmlvciB0byB0aGUgRUZECisgKiBiZWluZyBwcm9jZXNzZWQuIFNldCB0aGUgWEZTX0VGSV9DT01NSVRURUQgZmxhZyBzbyB0aGlzIGNhc2UgY2FuIGJlIGRldGVjdGVkCisgKiB3aGVuIHByb2Nlc3NpbmcgdGhlIEVGRC4KICAqLwogU1RBVElDIHhmc19sc25fdAogeGZzX2VmaV9pdGVtX2NvbW1pdHRlZCgKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCiAJeGZzX2xzbl90CQlsc24pCiB7CisJc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0JKmVmaXAgPSBFRklfSVRFTShsaXApOworCisJc2V0X2JpdChYRlNfRUZJX0NPTU1JVFRFRCwgJmVmaXAtPmVmaV9mbGFncyk7CiAJcmV0dXJuIGxzbjsKIH0KIApAQCAtMjMwLDYgKzI1Myw3IEBACiAJeGZzX2xvZ19pdGVtX2luaXQobXAsICZlZmlwLT5lZmlfaXRlbSwgWEZTX0xJX0VGSSwgJnhmc19lZmlfaXRlbV9vcHMpOwogCWVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzID0gbmV4dGVudHM7CiAJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfaWQgPSAoX19wc2ludF90KSh2b2lkKillZmlwOworCWF0b21pY19zZXQoJmVmaXAtPmVmaV9uZXh0X2V4dGVudCwgMCk7CiAKIAlyZXR1cm4gZWZpcDsKIH0KQEAgLTI4OSwzNyArMzEzLDE4IEBACiB9CiAKIC8qCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZWZkIGl0ZW0gY29kZSBiZWxvdyB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8KLSAqIHRoZSBnaXZlbiBlZmkgaXRlbS4gIEVhY2ggZWZkIGNhbGxzIHRoaXMgd2l0aCB0aGUgbnVtYmVyIG9mCi0gKiBleHRlbnRzIHRoYXQgaXQgaGFzIGxvZ2dlZCwgYW5kIHdoZW4gdGhlIHN1bSBvZiB0aGVzZSByZWFjaGVzCi0gKiB0aGUgdG90YWwgbnVtYmVyIG9mIGV4dGVudHMgbG9nZ2VkIGJ5IHRoaXMgZWZpIGl0ZW0gd2UgY2FuIGZyZWUKLSAqIHRoZSBlZmkgaXRlbS4KLSAqCi0gKiBGcmVlaW5nIHRoZSBlZmkgaXRlbSByZXF1aXJlcyB0aGF0IHdlIHJlbW92ZSBpdCBmcm9tIHRoZSBBSUwuCi0gKiBXZSdsbCB1c2UgdGhlIEFJTCBsb2NrIHRvIHByb3RlY3Qgb3VyIGNvdW50ZXJzIGFzIHdlbGwgYXMKLSAqIHRoZSByZW1vdmFsIGZyb20gdGhlIEFJTC4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlZmQgaXRlbSBjb2RlIGJlbG93IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4KKyAqIGVmaSBpdGVtLiAgRWFjaCBlZmQgY2FsbHMgdGhpcyB3aXRoIHRoZSBudW1iZXIgb2YgZXh0ZW50cyB0aGF0IGl0IGhhcworICogbG9nZ2VkLCBhbmQgd2hlbiB0aGUgc3VtIG9mIHRoZXNlIHJlYWNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiBleHRlbnRzIGxvZ2dlZAorICogYnkgdGhpcyBlZmkgaXRlbSB3ZSBjYW4gZnJlZSB0aGUgZWZpIGl0ZW0uCiAgKi8KIHZvaWQKIHhmc19lZmlfcmVsZWFzZSh4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCiAJCXVpbnQJCQluZXh0ZW50cykKIHsKLQlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBlZmlwLT5lZmlfaXRlbS5saV9haWxwOwotCWludAkJCWV4dGVudHNfbGVmdDsKLQotCUFTU0VSVChlZmlwLT5lZmlfbmV4dF9leHRlbnQgPiAwKTsKLQlBU1NFUlQoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9DT01NSVRURUQpOwotCi0Jc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID49IG5leHRlbnRzKTsKLQllZmlwLT5lZmlfbmV4dF9leHRlbnQgLT0gbmV4dGVudHM7Ci0JZXh0ZW50c19sZWZ0ID0gZWZpcC0+ZWZpX25leHRfZXh0ZW50OwotCWlmIChleHRlbnRzX2xlZnQgPT0gMCkgewotCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KLQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCk7Ci0JCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQl9CisJQVNTRVJUKGF0b21pY19yZWFkKCZlZmlwLT5lZmlfbmV4dF9leHRlbnQpID49IG5leHRlbnRzKTsKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdChuZXh0ZW50cywgJmVmaXAtPmVmaV9uZXh0X2V4dGVudCkpCisJCV9feGZzX2VmaV9yZWxlYXNlKGVmaXApOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtICpFRkRfSVRFTShzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXApCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uaAppbmRleCAwZDIyYzU2Li4zNzVmNjhlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oCisrKyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmgKQEAgLTExMSwxMSArMTExLDEwIEBACiAjZGVmaW5lCVhGU19FRklfTUFYX0ZBU1RfRVhURU5UUwkxNgogCiAvKgotICogRGVmaW5lIEVGSSBmbGFncy4KKyAqIERlZmluZSBFRkkgZmxhZyBiaXRzLiBNYW5pcHVsYXRlZCBieSBzZXQvY2xlYXIvdGVzdF9iaXQgb3BlcmF0b3JzLgogICovCi0jZGVmaW5lCVhGU19FRklfUkVDT1ZFUkVECTB4MQotI2RlZmluZQlYRlNfRUZJX0NPTU1JVFRFRAkweDIKLSNkZWZpbmUJWEZTX0VGSV9DQU5DRUxFRAkweDQKKyNkZWZpbmUJWEZTX0VGSV9SRUNPVkVSRUQJMQorI2RlZmluZQlYRlNfRUZJX0NPTU1JVFRFRAkyCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSAiZXh0ZW50IGZyZWUgaW50ZW50aW9uIiBsb2cgaXRlbS4gIEl0IGlzIHVzZWQKQEAgLTEyNSw4ICsxMjQsOCBAQAogICovCiB0eXBlZGVmIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtIHsKIAl4ZnNfbG9nX2l0ZW1fdAkJZWZpX2l0ZW07Ci0JdWludAkJCWVmaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLwotCXVpbnQJCQllZmlfbmV4dF9leHRlbnQ7CisJYXRvbWljX3QJCWVmaV9uZXh0X2V4dGVudDsKKwl1bnNpZ25lZCBsb25nCQllZmlfZmxhZ3M7CS8qIG1pc2MgZmxhZ3MgKi8KIAl4ZnNfZWZpX2xvZ19mb3JtYXRfdAllZmlfZm9ybWF0OwogfSB4ZnNfZWZpX2xvZ19pdGVtX3Q7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwppbmRleCBhN2MxMTZlLi5mNTZkMzBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmMKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC0zNzQsNiArMzc0LDcgQEAKIAkJbXAtPm1fbWF4aWNvdW50ID0gaWNvdW50IDw8IG1wLT5tX3NiLnNiX2lub3BibG9nOwogCX0gZWxzZQogCQltcC0+bV9tYXhpY291bnQgPSAwOworCXhmc19zZXRfbG93X3NwYWNlX3RocmVzaG9sZHMobXApOwogCiAJLyogdXBkYXRlIHNlY29uZGFyeSBzdXBlcmJsb2Nrcy4gKi8KIAlmb3IgKGFnbm8gPSAxOyBhZ25vIDwgbmFnY291bnQ7IGFnbm8rKykgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pZ2V0LmMgYi9mcy94ZnMveGZzX2lnZXQuYwppbmRleCBkN2RlNWEzLi5jYjliNmQxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lnZXQuYworKysgYi9mcy94ZnMveGZzX2lnZXQuYwpAQCAtNDMsNiArNDMsMTcgQEAKIAogCiAvKgorICogRGVmaW5lIHhmcyBpbm9kZSBpb2xvY2sgbG9ja2RlcCBjbGFzc2VzLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFsbCBhY3RpdmUKKyAqIGlub2RlcyBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBmb3IgbG9ja2RlcCBwdXJwb3NlcywgaW5jbHVkaW5nIGlub2RlcyB0aGF0CisgKiBhcmUgcmVjeWNsZWQgdGhyb3VnaCB0aGUgWEZTX0lSRUNMQUlNQUJMRSBzdGF0ZS4gVGhpcyBpcyB0aGUgdGhlIG9ubHkgd2F5IHRvCisgKiBndWFyYW50ZWUgdGhlIGxvY2tzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGxvY2sKKyAqIGluaXRpYWxpc2F0aW9uIHNpdGXRlS4gQWxzbywgZGVmaW5lIGEgcmVjbGFpbWFibGUgaW5vZGUgY2xhc3Mgc28gaXQgaXMKKyAqIG9idmlvdXMgaW4gbG9ja2RlcCByZXBvcnRzIHdoaWNoIGNsYXNzIHRoZSByZXBvcnQgaXMgYWdhaW5zdC4KKyAqLworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSB4ZnNfaW9sb2NrX2FjdGl2ZTsKK3N0cnVjdCBsb2NrX2NsYXNzX2tleSB4ZnNfaW9sb2NrX3JlY2xhaW1hYmxlOworCisvKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYW4geGZzX2lub2RlLgogICovCiBTVEFUSUMgc3RydWN0IHhmc19pbm9kZSAqCkBAIC02OSw4ICs4MCwxMSBAQAogCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApOwogCUFTU0VSVCghc3Bpbl9pc19sb2NrZWQoJmlwLT5pX2ZsYWdzX2xvY2spKTsKIAlBU1NFUlQoY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkpOworCUFTU0VSVChpcC0+aV9pbm8gPT0gMCk7CiAKIAltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKKwlsb2NrZGVwX3NldF9jbGFzc19hbmRfbmFtZSgmaXAtPmlfaW9sb2NrLm1yX2xvY2ssCisJCQkmeGZzX2lvbG9ja19hY3RpdmUsICJ4ZnNfaW9sb2NrX2FjdGl2ZSIpOwogCiAJLyogaW5pdGlhbGlzZSB0aGUgeGZzIGlub2RlICovCiAJaXAtPmlfaW5vID0gaW5vOwpAQCAtODUsOSArOTksNiBAQAogCWlwLT5pX3NpemUgPSAwOwogCWlwLT5pX25ld19zaXplID0gMDsKIAotCS8qIHByZXZlbnQgYW55b25lIGZyb20gdXNpbmcgdGhpcyB5ZXQgKi8KLQlWRlNfSShpcCktPmlfc3RhdGUgPSBJX05FVzsKLQogCXJldHVybiBpcDsKIH0KIApAQCAtMTQ1LDcgKzE1NiwxOCBAQAogCUFTU0VSVCghc3Bpbl9pc19sb2NrZWQoJmlwLT5pX2ZsYWdzX2xvY2spKTsKIAlBU1NFUlQoY29tcGxldGlvbl9kb25lKCZpcC0+aV9mbHVzaCkpOwogCi0JY2FsbF9yY3UoJmlwLT5pX3Zub2RlLmlfcmN1LCB4ZnNfaW5vZGVfZnJlZV9jYWxsYmFjayk7CisJLyoKKwkgKiBCZWNhdXNlIHdlIHVzZSBSQ1UgZnJlZWluZyB3ZSBuZWVkIHRvIGVuc3VyZSB0aGUgaW5vZGUgYWx3YXlzCisJICogYXBwZWFycyB0byBiZSByZWNsYWltZWQgd2l0aCBhbiBpbnZhbGlkIGlub2RlIG51bWJlciB3aGVuIGluIHRoZQorCSAqIGZyZWUgc3RhdGUuIFRoZSBpcC0+aV9mbGFnc19sb2NrIHByb3ZpZGVzIHRoZSBiYXJyaWVyIGFnYWluc3QgbG9va3VwCisJICogcmFjZXMuCisJICovCisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpcC0+aV9mbGFncyA9IFhGU19JUkVDTEFJTTsKKwlpcC0+aV9pbm8gPSAwOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKworCWNhbGxfcmN1KCZWRlNfSShpcCktPmlfcmN1LCB4ZnNfaW5vZGVfZnJlZV9jYWxsYmFjayk7CiB9CiAKIC8qCkBAIC0xNTUsMTQgKzE3NywyOSBAQAogeGZzX2lnZXRfY2FjaGVfaGl0KAogCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZywKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwl4ZnNfaW5vX3QJCWlubywKIAlpbnQJCQlmbGFncywKLQlpbnQJCQlsb2NrX2ZsYWdzKSBfX3JlbGVhc2VzKHBhZy0+cGFnX2ljaV9sb2NrKQorCWludAkJCWxvY2tfZmxhZ3MpIF9fcmVsZWFzZXMoUkNVKQogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gVkZTX0koaXApOwogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CiAJaW50CQkJZXJyb3I7CiAKKwkvKgorCSAqIGNoZWNrIGZvciByZS11c2Ugb2YgYW4gaW5vZGUgd2l0aGluIGFuIFJDVSBncmFjZSBwZXJpb2QgZHVlIHRvIHRoZQorCSAqIHJhZGl4IHRyZWUgbm9kZXMgbm90IGJlaW5nIHVwZGF0ZWQgeWV0LiBXZSBtb25pdG9yIGZvciB0aGlzIGJ5CisJICogc2V0dGluZyB0aGUgaW5vZGUgbnVtYmVyIHRvIHplcm8gYmVmb3JlIGZyZWVpbmcgdGhlIGlub2RlIHN0cnVjdHVyZS4KKwkgKiBJZiB0aGUgaW5vZGUgaGFzIGJlZW4gcmVhbGxvY2F0ZWQgYW5kIHNldCB1cCwgdGhlbiB0aGUgaW5vZGUgbnVtYmVyCisJICogd2lsbCBub3QgbWF0Y2gsIHNvIGNoZWNrIGZvciB0aGF0LCB0b28uCisJICovCiAJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpZiAoaXAtPmlfaW5vICE9IGlubykgeworCQl0cmFjZV94ZnNfaWdldF9za2lwKGlwKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19pZ19mcmVjeWNsZSk7CisJCWVycm9yID0gRUFHQUlOOworCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKIAogCS8qCiAJICogSWYgd2UgYXJlIHJhY2luZyB3aXRoIGFub3RoZXIgY2FjaGUgaGl0IHRoYXQgaXMgY3VycmVudGx5CkBAIC0yMDUsNyArMjQyLDcgQEAKIAkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lSRUNMQUlNOwogCiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJZXJyb3IgPSAtaW5vZGVfaW5pdF9hbHdheXMobXAtPm1fc3VwZXIsIGlub2RlKTsKIAkJaWYgKGVycm9yKSB7CkBAIC0yMTMsNyArMjUwLDcgQEAKIAkJCSAqIFJlLWluaXRpYWxpemluZyB0aGUgaW5vZGUgZmFpbGVkLCBhbmQgd2UgYXJlIGluIGRlZXAKIAkJCSAqIHRyb3VibGUuICBUcnkgdG8gcmUtYWRkIGl0IHRvIHRoZSByZWNsYWltIGxpc3QuCiAJCQkgKi8KLQkJCXJlYWRfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAogCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JTkVXOwpAQCAtMjIzLDE0ICsyNjAsMjAgQEAKIAkJCWdvdG8gb3V0X2Vycm9yOwogCQl9CiAKLQkJd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJaXAtPmlfZmxhZ3MgJj0gfihYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNKTsKIAkJaXAtPmlfZmxhZ3MgfD0gWEZTX0lORVc7CiAJCV9feGZzX2lub2RlX2NsZWFyX3JlY2xhaW1fdGFnKG1wLCBwYWcsIGlwKTsKIAkJaW5vZGUtPmlfc3RhdGUgPSBJX05FVzsKKworCQlBU1NFUlQoIXJ3c2VtX2lzX2xvY2tlZCgmaXAtPmlfaW9sb2NrLm1yX2xvY2spKTsKKwkJbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7CisJCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKCZpcC0+aV9pb2xvY2subXJfbG9jaywKKwkJCQkmeGZzX2lvbG9ja19hY3RpdmUsICJ4ZnNfaW9sb2NrX2FjdGl2ZSIpOworCiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKLQkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJfSBlbHNlIHsKIAkJLyogSWYgdGhlIFZGUyBpbm9kZSBpcyBiZWluZyB0b3JuIGRvd24sIHBhdXNlIGFuZCB0cnkgYWdhaW4uICovCiAJCWlmICghaWdyYWIoaW5vZGUpKSB7CkBAIC0yNDEsNyArMjg0LDcgQEAKIAogCQkvKiBXZSd2ZSBnb3QgYSBsaXZlIG9uZS4gKi8KIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJdHJhY2VfeGZzX2lnZXRfaGl0KGlwKTsKIAl9CiAKQEAgLTI1NSw3ICsyOTgsNyBAQAogCiBvdXRfZXJyb3I6CiAJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zMDgsNyArMzUxLDcgQEAKIAkJCUJVRygpOwogCX0KIAotCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAogCS8qIGluc2VydCB0aGUgbmV3IGlub2RlICovCiAJZXJyb3IgPSByYWRpeF90cmVlX2luc2VydCgmcGFnLT5wYWdfaWNpX3Jvb3QsIGFnaW5vLCBpcCk7CkBAIC0zMjMsMTQgKzM2NiwxNCBAQAogCWlwLT5pX3VkcXVvdCA9IGlwLT5pX2dkcXVvdCA9IE5VTEw7CiAJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JTkVXKTsKIAotCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwogCiAJKmlwcCA9IGlwOwogCXJldHVybiAwOwogCiBvdXRfcHJlbG9hZF9lbmQ6Ci0Jd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CiAJaWYgKGxvY2tfZmxhZ3MpCiAJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKQEAgLTM3Nyw3ICs0MjAsNyBAQAogCXhmc19hZ2lub190CWFnaW5vOwogCiAJLyogcmVqZWN0IGlub2RlIG51bWJlcnMgb3V0c2lkZSBleGlzdGluZyBBR3MgKi8KLQlpZiAoWEZTX0lOT19UT19BR05PKG1wLCBpbm8pID49IG1wLT5tX3NiLnNiX2FnY291bnQpCisJaWYgKCFpbm8gfHwgWEZTX0lOT19UT19BR05PKG1wLCBpbm8pID49IG1wLT5tX3NiLnNiX2FnY291bnQpCiAJCXJldHVybiBFSU5WQUw7CiAKIAkvKiBnZXQgdGhlIHBlcmFnIHN0cnVjdHVyZSBhbmQgZW5zdXJlIHRoYXQgaXQncyBpbm9kZSBjYXBhYmxlICovCkBAIC0zODYsMTUgKzQyOSwxNSBAQAogCiBhZ2FpbjoKIAllcnJvciA9IDA7Ci0JcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCWlwID0gcmFkaXhfdHJlZV9sb29rdXAoJnBhZy0+cGFnX2ljaV9yb290LCBhZ2lubyk7CiAKIAlpZiAoaXApIHsKLQkJZXJyb3IgPSB4ZnNfaWdldF9jYWNoZV9oaXQocGFnLCBpcCwgZmxhZ3MsIGxvY2tfZmxhZ3MpOworCQllcnJvciA9IHhmc19pZ2V0X2NhY2hlX2hpdChwYWcsIGlwLCBpbm8sIGZsYWdzLCBsb2NrX2ZsYWdzKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfZXJyb3Jfb3JfYWdhaW47CiAJfSBlbHNlIHsKLQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCVhGU19TVEFUU19JTkMoeHNfaWdfbWlzc2VkKTsKIAogCQllcnJvciA9IHhmc19pZ2V0X2NhY2hlX21pc3MobXAsIHBhZywgdHAsIGlubywgJmlwLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IDEwOGM3YTAuLmJlN2NmNjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCSAqIGFyb3VuZCBmb3IgYSB3aGlsZS4gIFRoaXMgaGVscHMgdG8ga2VlcCByZWNlbnRseSBhY2Nlc3NlZAogCSAqIG1ldGEtZGF0YSBpbi1jb3JlIGxvbmdlci4KIAkgKi8KLQlYRlNfQlVGX1NFVF9SRUYoYnAsIFhGU19JTk9fUkVGKTsKKwl4ZnNfYnVmX3NldF9yZWYoYnAsIFhGU19JTk9fUkVGKTsKIAogCS8qCiAJICogVXNlIHhmc190cmFuc19icmVsc2UoKSB0byByZWxlYXNlIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUKQEAgLTIwMDAsMTcgKzIwMDAsMzMgQEAKIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBuaW5vZGVzOyBpKyspIHsKIHJldHJ5OgotCQkJcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQlpcCA9IHJhZGl4X3RyZWVfbG9va3VwKCZwYWctPnBhZ19pY2lfcm9vdCwKIAkJCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgKGludW0gKyBpKSkpOwogCi0JCQkvKiBJbm9kZSBub3QgaW4gbWVtb3J5IG9yIHN0YWxlLCBub3RoaW5nIHRvIGRvICovCi0JCQlpZiAoIWlwIHx8IHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lTVEFMRSkpIHsKLQkJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJLyogSW5vZGUgbm90IGluIG1lbW9yeSwgbm90aGluZyB0byBkbyAqLworCQkJaWYgKCFpcCkgeworCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQkvKgorCQkJICogYmVjYXVzZSB0aGlzIGlzIGFuIFJDVSBwcm90ZWN0ZWQgbG9va3VwLCB3ZSBjb3VsZAorCQkJICogZmluZCBhIHJlY2VudGx5IGZyZWVkIG9yIGV2ZW4gcmVhbGxvY2F0ZWQgaW5vZGUKKwkJCSAqIGR1cmluZyB0aGUgbG9va3VwLiBXZSBuZWVkIHRvIGNoZWNrIHVuZGVyIHRoZQorCQkJICogaV9mbGFnc19sb2NrIGZvciBhIHZhbGlkIGlub2RlIGhlcmUuIFNraXAgaXQgaWYgaXQKKwkJCSAqIGlzIG5vdCB2YWxpZCwgdGhlIHdyb25nIGlub2RlIG9yIHN0YWxlLgorCQkJICovCisJCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQkJaWYgKGlwLT5pX2lubyAhPSBpbnVtICsgaSB8fAorCQkJICAgIF9feGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVNUQUxFKSkgeworCQkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKworCQkJLyoKIAkJCSAqIERvbid0IHRyeSB0byBsb2NrL3VubG9jayB0aGUgY3VycmVudCBpbm9kZSwgYnV0IHdlCiAJCQkgKiBfY2Fubm90XyBza2lwIHRoZSBvdGhlciBpbm9kZXMgdGhhdCB3ZSBkaWQgbm90IGZpbmQKIAkJCSAqIGluIHRoZSBsaXN0IGF0dGFjaGVkIHRvIHRoZSBidWZmZXIgYW5kIGFyZSBub3QKQEAgLTIwMTksMTEgKzIwMzUsMTEgQEAKIAkJCSAqLwogCQkJaWYgKGlwICE9IGZyZWVfaXAgJiYKIAkJCSAgICAheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpKSB7Ci0JCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCQlkZWxheSgxKTsKIAkJCQlnb3RvIHJldHJ5OwogCQkJfQotCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCQl4ZnNfaWZsb2NrKGlwKTsKIAkJCXhmc19pZmxhZ3Nfc2V0KGlwLCBYRlNfSVNUQUxFKTsKQEAgLTI2MjksNyArMjY0NSw3IEBACiAKIAltYXNrID0gfigoKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKSkgLSAxKTsKIAlmaXJzdF9pbmRleCA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubykgJiBtYXNrOwotCXJlYWRfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAkvKiByZWFsbHkgbmVlZCBhIGdhbmcgbG9va3VwIHJhbmdlIGNhbGwgaGVyZSAqLwogCW5yX2ZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmcGFnLT5wYWdfaWNpX3Jvb3QsICh2b2lkKiopaWxpc3QsCiAJCQkJCWZpcnN0X2luZGV4LCBpbm9kZXNfcGVyX2NsdXN0ZXIpOwpAQCAtMjY0MCw5ICsyNjU2LDIxIEBACiAJCWlxID0gaWxpc3RbaV07CiAJCWlmIChpcSA9PSBpcCkKIAkJCWNvbnRpbnVlOwotCQkvKiBpZiB0aGUgaW5vZGUgbGllcyBvdXRzaWRlIHRoaXMgY2x1c3Rlciwgd2UncmUgZG9uZS4gKi8KLQkJaWYgKChYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcS0+aV9pbm8pICYgbWFzaykgIT0gZmlyc3RfaW5kZXgpCi0JCQlicmVhazsKKworCQkvKgorCQkgKiBiZWNhdXNlIHRoaXMgaXMgYW4gUkNVIHByb3RlY3RlZCBsb29rdXAsIHdlIGNvdWxkIGZpbmQgYQorCQkgKiByZWNlbnRseSBmcmVlZCBvciBldmVuIHJlYWxsb2NhdGVkIGlub2RlIGR1cmluZyB0aGUgbG9va3VwLgorCQkgKiBXZSBuZWVkIHRvIGNoZWNrIHVuZGVyIHRoZSBpX2ZsYWdzX2xvY2sgZm9yIGEgdmFsaWQgaW5vZGUKKwkJICogaGVyZS4gU2tpcCBpdCBpZiBpdCBpcyBub3QgdmFsaWQgb3IgdGhlIHdyb25nIGlub2RlLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJaWYgKCFpcC0+aV9pbm8gfHwKKwkJICAgIChYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcS0+aV9pbm8pICYgbWFzaykgIT0gZmlyc3RfaW5kZXgpIHsKKwkJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwogCQkvKgogCQkgKiBEbyBhbiB1bi1wcm90ZWN0ZWQgY2hlY2sgdG8gc2VlIGlmIHRoZSBpbm9kZSBpcyBkaXJ0eSBhbmQKIAkJICogaXMgYSBjYW5kaWRhdGUgZm9yIGZsdXNoaW5nLiAgVGhlc2UgY2hlY2tzIHdpbGwgYmUgcmVwZWF0ZWQKQEAgLTI2OTIsNyArMjcyMCw3IEBACiAJfQogCiBvdXRfZnJlZToKLQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCWttZW1fZnJlZShpbGlzdCk7CiBvdXRfcHV0OgogCXhmc19wZXJhZ19wdXQocGFnKTsKQEAgLTI3MDQsNyArMjczMiw3IEBACiAJICogQ29ycnVwdGlvbiBkZXRlY3RlZCBpbiB0aGUgY2x1c3RlcmluZyBsb29wLiAgSW52YWxpZGF0ZSB0aGUKIAkgKiBpbm9kZSBidWZmZXIgYW5kIHNodXQgZG93biB0aGUgZmlsZXN5c3RlbS4KIAkgKi8KLQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCS8qCiAJICogQ2xlYW4gdXAgdGhlIGJ1ZmZlci4gIElmIGl0IHdhcyBCX0RFTFdSSSwganVzdCByZWxlYXNlIGl0IC0tCiAJICogYnJlbHNlIGNhbiBoYW5kbGUgaXQgd2l0aCBubyBwcm9ibGVtcy4gIElmIG5vdCwgc2h1dCBkb3duIHRoZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5oIGIvZnMveGZzL3hmc19pbm9kZS5oCmluZGV4IGZiMmNhMmUuLjVjOTVmYTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuaAorKysgYi9mcy94ZnMveGZzX2lub2RlLmgKQEAgLTM3NiwxMiArMzc2LDEzIEBACiAvKgogICogSW4tY29yZSBpbm9kZSBmbGFncy4KICAqLwotI2RlZmluZSBYRlNfSVJFQ0xBSU0gICAgMHgwMDAxICAvKiB3ZSBoYXZlIHN0YXJ0ZWQgcmVjbGFpbWluZyB0aGlzIGlub2RlICAgICovCi0jZGVmaW5lIFhGU19JU1RBTEUJMHgwMDAyCS8qIGlub2RlIGhhcyBiZWVuIHN0YWxlZCAqLwotI2RlZmluZSBYRlNfSVJFQ0xBSU1BQkxFIDB4MDAwNCAvKiBpbm9kZSBjYW4gYmUgcmVjbGFpbWVkICovCi0jZGVmaW5lIFhGU19JTkVXCTB4MDAwOAkvKiBpbm9kZSBoYXMganVzdCBiZWVuIGFsbG9jYXRlZCAqLwotI2RlZmluZSBYRlNfSUZJTEVTVFJFQU0JMHgwMDEwCS8qIGlub2RlIGlzIGluIGEgZmlsZXN0cmVhbSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgWEZTX0lUUlVOQ0FURUQJMHgwMDIwCS8qIHRydW5jYXRlZCBkb3duIHNvIGZsdXNoLW9uLWNsb3NlICovCisjZGVmaW5lIFhGU19JUkVDTEFJTQkJMHgwMDAxICAvKiBzdGFydGVkIHJlY2xhaW1pbmcgdGhpcyBpbm9kZSAqLworI2RlZmluZSBYRlNfSVNUQUxFCQkweDAwMDIJLyogaW5vZGUgaGFzIGJlZW4gc3RhbGVkICovCisjZGVmaW5lIFhGU19JUkVDTEFJTUFCTEUJMHgwMDA0CS8qIGlub2RlIGNhbiBiZSByZWNsYWltZWQgKi8KKyNkZWZpbmUgWEZTX0lORVcJCTB4MDAwOAkvKiBpbm9kZSBoYXMganVzdCBiZWVuIGFsbG9jYXRlZCAqLworI2RlZmluZSBYRlNfSUZJTEVTVFJFQU0JCTB4MDAxMAkvKiBpbm9kZSBpcyBpbiBhIGZpbGVzdHJlYW0gZGlyZWN0b3J5ICovCisjZGVmaW5lIFhGU19JVFJVTkNBVEVECQkweDAwMjAJLyogdHJ1bmNhdGVkIGRvd24gc28gZmx1c2gtb24tY2xvc2UgKi8KKyNkZWZpbmUgWEZTX0lESVJUWV9SRUxFQVNFCTB4MDA0MAkvKiBkaXJ0eSByZWxlYXNlIGFscmVhZHkgc2VlbiAqLwogCiAvKgogICogRmxhZ3MgZm9yIGlub2RlIGxvY2tpbmcuCkBAIC00MzgsNiArNDM5LDggQEAKICNkZWZpbmUgWEZTX0lPTE9DS19ERVAoZmxhZ3MpCSgoKGZsYWdzKSAmIFhGU19JT0xPQ0tfREVQX01BU0spID4+IFhGU19JT0xPQ0tfU0hJRlQpCiAjZGVmaW5lIFhGU19JTE9DS19ERVAoZmxhZ3MpCSgoKGZsYWdzKSAmIFhGU19JTE9DS19ERVBfTUFTSykgPj4gWEZTX0lMT0NLX1NISUZUKQogCitleHRlcm4gc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHhmc19pb2xvY2tfcmVjbGFpbWFibGU7CisKIC8qCiAgKiBGbGFncyBmb3IgeGZzX2l0cnVuY2F0ZV9zdGFydCgpLgogICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCmluZGV4IDdjOGQzMGMuLmZkNGYzOTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCkBAIC04NDIsMTUgKzg0Miw2NCBAQAogICogZmx1c2hlZCB0byBkaXNrLiAgSXQgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBpbm9kZSBpdGVtCiAgKiBmcm9tIHRoZSBBSUwgaWYgaXQgaGFzIG5vdCBiZWVuIHJlLWxvZ2dlZCwgYW5kIHVubG9ja2luZyB0aGUgaW5vZGUncwogICogZmx1c2ggbG9jay4KKyAqCisgKiBUbyByZWR1Y2UgQUlMIGxvY2sgdHJhZmZpYyBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3ZSBzY2FuIHRoZSBidWZmZXIgbG9nIGl0ZW0KKyAqIGxpc3QgZm9yIG90aGVyIGlub2RlcyB0aGF0IHdpbGwgcnVuIHRoaXMgZnVuY3Rpb24uIFdlIHJlbW92ZSB0aGVtIGZyb20gdGhlCisgKiBidWZmZXIgbGlzdCBzbyB3ZSBjYW4gcHJvY2VzcyBhbGwgdGhlIGlub2RlIElPIGNvbXBsZXRpb25zIGluIG9uZSBBSUwgbG9jaworICogdHJhdmVyc2FsLgogICovCiB2b2lkCiB4ZnNfaWZsdXNoX2RvbmUoCiAJc3RydWN0IHhmc19idWYJCSpicCwKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCiB7Ci0Jc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSAqaWlwID0gSU5PREVfSVRFTShsaXApOwotCXhmc19pbm9kZV90CQkqaXAgPSBpaXAtPmlsaV9pbm9kZTsKKwlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXA7CisJc3RydWN0IHhmc19sb2dfaXRlbQkqYmxpcDsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpuZXh0OworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKnByZXY7CiAJc3RydWN0IHhmc19haWwJCSphaWxwID0gbGlwLT5saV9haWxwOworCWludAkJCW5lZWRfYWlsID0gMDsKKworCS8qCisJICogU2NhbiB0aGUgYnVmZmVyIElPIGNvbXBsZXRpb25zIGZvciBvdGhlciBpbm9kZXMgYmVpbmcgY29tcGxldGVkIGFuZAorCSAqIGF0dGFjaCB0aGVtIHRvIHRoZSBjdXJyZW50IGlub2RlIGxvZyBpdGVtLgorCSAqLworCWJsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJcHJldiA9IE5VTEw7CisJd2hpbGUgKGJsaXAgIT0gTlVMTCkgeworCQlpZiAobGlwLT5saV9jYiAhPSB4ZnNfaWZsdXNoX2RvbmUpIHsKKwkJCXByZXYgPSBibGlwOworCQkJYmxpcCA9IGJsaXAtPmxpX2Jpb19saXN0OworCQkJY29udGludWU7CisJCX0KKworCQkvKiByZW1vdmUgZnJvbSBsaXN0ICovCisJCW5leHQgPSBibGlwLT5saV9iaW9fbGlzdDsKKwkJaWYgKCFwcmV2KSB7CisJCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIG5leHQpOworCQl9IGVsc2UgeworCQkJcHJldi0+bGlfYmlvX2xpc3QgPSBuZXh0OworCQl9CisKKwkJLyogYWRkIHRvIGN1cnJlbnQgbGlzdCAqLworCQlibGlwLT5saV9iaW9fbGlzdCA9IGxpcC0+bGlfYmlvX2xpc3Q7CisJCWxpcC0+bGlfYmlvX2xpc3QgPSBibGlwOworCisJCS8qCisJCSAqIHdoaWxlIHdlIGhhdmUgdGhlIGl0ZW0sIGRvIHRoZSB1bmxvY2tlZCBjaGVjayBmb3IgbmVlZGluZworCQkgKiB0aGUgQUlMIGxvY2suCisJCSAqLworCQlpaXAgPSBJTk9ERV9JVEVNKGJsaXApOworCQlpZiAoaWlwLT5pbGlfbG9nZ2VkICYmIGJsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pCisJCQluZWVkX2FpbCsrOworCisJCWJsaXAgPSBuZXh0OworCX0KKworCS8qIG1ha2Ugc3VyZSB3ZSBjYXB0dXJlIHRoZSBzdGF0ZSBvZiB0aGUgaW5pdGlhbCBpbm9kZS4gKi8KKwlpaXAgPSBJTk9ERV9JVEVNKGxpcCk7CisJaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJiBsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pCisJCW5lZWRfYWlsKys7CiAKIAkvKgogCSAqIFdlIG9ubHkgd2FudCB0byBwdWxsIHRoZSBpdGVtIGZyb20gdGhlIEFJTCBpZiBpdCBpcwpAQCAtODYxLDI4ICs5MTAsMzcgQEAKIAkgKiB0aGUgbG9jayBzaW5jZSBpdCdzIGNoZWFwZXIsIGFuZCB0aGVuIHdlIHJlY2hlY2sgd2hpbGUKIAkgKiBob2xkaW5nIHRoZSBsb2NrIGJlZm9yZSByZW1vdmluZyB0aGUgaW5vZGUgZnJvbSB0aGUgQUlMLgogCSAqLwotCWlmIChpaXAtPmlsaV9sb2dnZWQgJiYgbGlwLT5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB7CisJaWYgKG5lZWRfYWlsKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxvZ19pdGVtc1tuZWVkX2FpbF07CisJCWludCBpID0gMDsKIAkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJaWYgKGxpcC0+bGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikgewotCQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCi0JCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCQlmb3IgKGJsaXAgPSBsaXA7IGJsaXA7IGJsaXAgPSBibGlwLT5saV9iaW9fbGlzdCkgeworCQkJaWlwID0gSU5PREVfSVRFTShibGlwKTsKKwkJCWlmIChpaXAtPmlsaV9sb2dnZWQgJiYKKwkJCSAgICBibGlwLT5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB7CisJCQkJbG9nX2l0ZW1zW2krK10gPSBibGlwOworCQkJfQorCQkJQVNTRVJUKGkgPD0gbmVlZF9haWwpOwogCQl9CisJCS8qIHhmc190cmFuc19haWxfZGVsZXRlX2J1bGsoKSBkcm9wcyB0aGUgQUlMIGxvY2suICovCisJCXhmc190cmFuc19haWxfZGVsZXRlX2J1bGsoYWlscCwgbG9nX2l0ZW1zLCBpKTsKIAl9CiAKLQlpaXAtPmlsaV9sb2dnZWQgPSAwOwogCiAJLyoKLQkgKiBDbGVhciB0aGUgaWxpX2xhc3RfZmllbGRzIGJpdHMgbm93IHRoYXQgd2Uga25vdyB0aGF0IHRoZQotCSAqIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGVtIGlzIHNhZmVseSBvbiBkaXNrLgorCSAqIGNsZWFuIHVwIGFuZCB1bmxvY2sgdGhlIGZsdXNoIGxvY2sgbm93IHdlIGFyZSBkb25lLiBXZSBjYW4gY2xlYXIgdGhlCisJICogaWxpX2xhc3RfZmllbGRzIGJpdHMgbm93IHRoYXQgd2Uga25vdyB0aGF0IHRoZSBkYXRhIGNvcnJlc3BvbmRpbmcgdG8KKwkgKiB0aGVtIGlzIHNhZmVseSBvbiBkaXNrLgogCSAqLwotCWlpcC0+aWxpX2xhc3RfZmllbGRzID0gMDsKKwlmb3IgKGJsaXAgPSBsaXA7IGJsaXA7IGJsaXAgPSBuZXh0KSB7CisJCW5leHQgPSBibGlwLT5saV9iaW9fbGlzdDsKKwkJYmxpcC0+bGlfYmlvX2xpc3QgPSBOVUxMOwogCi0JLyoKLQkgKiBSZWxlYXNlIHRoZSBpbm9kZSdzIGZsdXNoIGxvY2sgc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0LgotCSAqLwotCXhmc19pZnVubG9jayhpcCk7CisJCWlpcCA9IElOT0RFX0lURU0oYmxpcCk7CisJCWlpcC0+aWxpX2xvZ2dlZCA9IDA7CisJCWlpcC0+aWxpX2xhc3RfZmllbGRzID0gMDsKKwkJeGZzX2lmdW5sb2NrKGlpcC0+aWxpX2lub2RlKTsKKwl9CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmMgYi9mcy94ZnMveGZzX2lvbWFwLmMKaW5kZXggMjA1NzYxNC4uNTU1ODJiZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5jCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwpAQCAtNDcsMTI3ICs0Nyw4IEBACiAKICNkZWZpbmUgWEZTX1dSSVRFSU9fQUxJR04obXAsb2ZmKQkoKChvZmYpID4+IG1wLT5tX3dyaXRlaW9fbG9nKSBcCiAJCQkJCQk8PCBtcC0+bV93cml0ZWlvX2xvZykKLSNkZWZpbmUgWEZTX1NUUkFUX1dSSVRFX0lNQVBTCTIKICNkZWZpbmUgWEZTX1dSSVRFX0lNQVBTCQlYRlNfQk1BUF9NQVhfTk1BUAogCi1TVEFUSUMgaW50IHhmc19pb21hcF93cml0ZV9kaXJlY3Qoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKLQkJCQkgIGludCwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwotU1RBVElDIGludCB4ZnNfaW9tYXBfd3JpdGVfZGVsYXkoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwgaW50LAotCQkJCSBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKik7Ci1TVEFUSUMgaW50IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAotCQkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqKTsKLQotaW50Ci14ZnNfaW9tYXAoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCi0JeGZzX29mZl90CQlvZmZzZXQsCi0Jc3NpemVfdAkJCWNvdW50LAotCWludAkJCWZsYWdzLAotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSppbWFwLAotCWludAkJCSpuaW1hcHMsCi0JaW50CQkJKm5ldykKLXsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwotCXhmc19maWxlb2ZmX3QJCW9mZnNldF9mc2IsIGVuZF9mc2I7Ci0JaW50CQkJZXJyb3IgPSAwOwotCWludAkJCWxvY2ttb2RlID0gMDsKLQlpbnQJCQlibWFwaV9mbGFncyA9IDA7Ci0KLQlBU1NFUlQoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRyk7Ci0KLQkqbmV3ID0gMDsKLQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwotCi0JdHJhY2VfeGZzX2lvbWFwX2VudGVyKGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywgTlVMTCk7Ci0KLQlzd2l0Y2ggKGZsYWdzICYgKEJNQVBJX1JFQUQgfCBCTUFQSV9XUklURSB8IEJNQVBJX0FMTE9DQVRFKSkgewotCWNhc2UgQk1BUElfUkVBRDoKLQkJbG9ja21vZGUgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChpcCk7Ci0JCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKLQkJYnJlYWs7Ci0JY2FzZSBCTUFQSV9XUklURToKLQkJbG9ja21vZGUgPSBYRlNfSUxPQ0tfRVhDTDsKLQkJaWYgKGZsYWdzICYgQk1BUElfSUdOU1RBVEUpCi0JCQlibWFwaV9mbGFncyB8PSBYRlNfQk1BUElfSUdTVEFURXxYRlNfQk1BUElfRU5USVJFOwotCQl4ZnNfaWxvY2soaXAsIGxvY2ttb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBCTUFQSV9BTExPQ0FURToKLQkJbG9ja21vZGUgPSBYRlNfSUxPQ0tfU0hBUkVEOwotCQlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9FTlRJUkU7Ci0KLQkJLyogQXR0ZW1wdCBub24tYmxvY2tpbmcgbG9jayAqLwotCQlpZiAoZmxhZ3MgJiBCTUFQSV9UUllMT0NLKSB7Ci0JCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIGxvY2ttb2RlKSkKLQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVBR0FJTik7Ci0JCX0gZWxzZSB7Ci0JCQl4ZnNfaWxvY2soaXAsIGxvY2ttb2RlKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0KLQlBU1NFUlQob2Zmc2V0IDw9IG1wLT5tX21heGlvZmZzZXQpOwotCWlmICgoeGZzX2ZzaXplX3Qpb2Zmc2V0ICsgY291bnQgPiBtcC0+bV9tYXhpb2Zmc2V0KQotCQljb3VudCA9IG1wLT5tX21heGlvZmZzZXQgLSBvZmZzZXQ7Ci0JZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClvZmZzZXQgKyBjb3VudCk7Ci0Jb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7Ci0KLQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwKLQkJCSh4ZnNfZmlsYmxrc190KShlbmRfZnNiIC0gb2Zmc2V0X2ZzYiksCi0JCQlibWFwaV9mbGFncywgIE5VTEwsIDAsIGltYXAsCi0JCQluaW1hcHMsIE5VTEwpOwotCi0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQotCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfV1JJVEV8Qk1BUElfQUxMT0NBVEUpKSB7Ci0JY2FzZSBCTUFQSV9XUklURToKLQkJLyogSWYgd2UgZm91bmQgYW4gZXh0ZW50LCByZXR1cm4gaXQgKi8KLQkJaWYgKCpuaW1hcHMgJiYKLQkJICAgIChpbWFwLT5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSAmJgotCQkgICAgKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkgewotCQkJdHJhY2VfeGZzX2lvbWFwX2ZvdW5kKGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywgaW1hcCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChmbGFncyAmIEJNQVBJX0RJUkVDVCkgewotCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywKLQkJCQkJCSAgICAgICBpbWFwLCBuaW1hcHMpOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGVsYXkoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLAotCQkJCQkJICAgICAgaW1hcCwgbmltYXBzKTsKLQkJfQotCQlpZiAoIWVycm9yKSB7Ci0JCQl0cmFjZV94ZnNfaW9tYXBfYWxsb2MoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBpbWFwKTsKLQkJfQotCQkqbmV3ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBCTUFQSV9BTExPQ0FURToKLQkJLyogSWYgd2UgZm91bmQgYW4gZXh0ZW50LCByZXR1cm4gaXQgKi8KLQkJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKLQkJbG9ja21vZGUgPSAwOwotCi0JCWlmICgqbmltYXBzICYmICFpc251bGxzdGFydGJsb2NrKGltYXAtPmJyX3N0YXJ0YmxvY2spKSB7Ci0JCQl0cmFjZV94ZnNfaW9tYXBfZm91bmQoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBpbWFwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoaXAsIG9mZnNldCwgY291bnQsCi0JCQkJCQkgaW1hcCwgbmltYXBzKTsKLQkJYnJlYWs7Ci0JfQotCi0JQVNTRVJUKCpuaW1hcHMgPD0gMSk7Ci0KLW91dDoKLQlpZiAobG9ja21vZGUpCi0JCXhmc19pdW5sb2NrKGlwLCBsb2NrbW9kZSk7Ci0JcmV0dXJuIFhGU19FUlJPUihlcnJvcik7Ci19Ci0KIFNUQVRJQyBpbnQKIHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IoCiAJeGZzX21vdW50X3QJKm1wLApAQCAtMjM2LDE0ICsxMTcsMTMgQEAKIAlyZXR1cm4gRUZTQ09SUlVQVEVEOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19pb21hcF93cml0ZV9kaXJlY3QoCiAJeGZzX2lub2RlX3QJKmlwLAogCXhmc19vZmZfdAlvZmZzZXQsCiAJc2l6ZV90CQljb3VudCwKLQlpbnQJCWZsYWdzLAogCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKLQlpbnQJCSpubWFwcykKKwlpbnQJCW5tYXBzKQogewogCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKQEAgLTI3OSw3ICsxNTksNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yX291dDsKIAl9IGVsc2UgewotCQlpZiAoKm5tYXBzICYmIChpbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkKKwkJaWYgKG5tYXBzICYmIChpbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkKIAkJCWxhc3RfZnNiID0gTUlOKGxhc3RfZnNiLCAoeGZzX2ZpbGVvZmZfdCkKIAkJCQkJaW1hcC0+YnJfYmxvY2tjb3VudCArCiAJCQkJCWltYXAtPmJyX3N0YXJ0b2ZmKTsKQEAgLTMzMSw3ICsyMTEsNyBAQAogCXhmc190cmFuc19pam9pbih0cCwgaXApOwogCiAJYm1hcGlfZmxhZyA9IFhGU19CTUFQSV9XUklURTsKLQlpZiAoKGZsYWdzICYgQk1BUElfRElSRUNUKSAmJiAob2Zmc2V0IDwgaXAtPmlfc2l6ZSB8fCBleHRzeikpCisJaWYgKG9mZnNldCA8IGlwLT5pX3NpemUgfHwgZXh0c3opCiAJCWJtYXBpX2ZsYWcgfD0gWEZTX0JNQVBJX1BSRUFMTE9DOwogCiAJLyoKQEAgLTM3MCw3ICsyNTAsNiBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKLQkqbm1hcHMgPSAxOwogCXJldHVybiAwOwogCiBlcnJvcjA6CS8qIENhbmNlbCBibWFwLCB1bmxvY2sgaW5vZGUsIHVucmVzZXJ2ZSBxdW90YSBibG9ja3MsIGNhbmNlbCB0cmFucyAqLwpAQCAtMzc5LDcgKzI1OCw2IEBACiAKIGVycm9yMToJLyogSnVzdCBjYW5jZWwgdHJhbnNhY3Rpb24gKi8KIAl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKLQkqbm1hcHMgPSAwOwkvKiBub3RoaW5nIHNldC11cCBoZXJlICovCiAKIGVycm9yX291dDoKIAlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKQEAgLTM4OSw2ICsyNjcsOSBAQAogICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoZW4gZXh0ZW5kIHRoZQogICogYWxsb2NhdGlvbiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUgaW9zaXplLiAgV2UgY2xlYW4gdXAgYW55IGV4dHJhCiAgKiBzcGFjZSBsZWZ0IG92ZXIgd2hlbiB0aGUgZmlsZSBpcyBjbG9zZWQgaW4geGZzX2luYWN0aXZlKCkuCisgKgorICogSWYgd2UgZmluZCB3ZSBhbHJlYWR5IGhhdmUgZGVsYWxsb2MgcHJlYWxsb2NhdGlvbiBiZXlvbmQgRU9GLCBkb24ndCBkbyBtb3JlCisgKiBwcmVhbGxvY2F0aW9uIGFzIGl0IGl0IG5vdCBuZWVkZWQuCiAgKi8KIFNUQVRJQyBpbnQKIHhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZSgKQEAgLTM5Niw3ICsyNzcsNiBAQAogCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCi0JaW50CQlpb2ZsYWcsCiAJeGZzX2JtYnRfaXJlY190ICppbWFwLAogCWludAkJbmltYXBzLAogCWludAkJKnByZWFsbG9jKQpAQCAtNDA1LDYgKzI4NSw3IEBACiAJeGZzX2ZpbGJsa3NfdCAgIGNvdW50X2ZzYjsKIAl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CiAJaW50CQluLCBlcnJvciwgaW1hcHM7CisJaW50CQlmb3VuZF9kZWxhbGxvYyA9IDA7CiAKIAkqcHJlYWxsb2MgPSAwOwogCWlmICgob2Zmc2V0ICsgY291bnQpIDw9IGlwLT5pX3NpemUpCkBAIC00MjksMjAgKzMxMCw2NiBAQAogCQkJCXJldHVybiAwOwogCQkJc3RhcnRfZnNiICs9IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKIAkJCWNvdW50X2ZzYiAtPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7CisKKwkJCWlmIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKQorCQkJCWZvdW5kX2RlbGFsbG9jID0gMTsKIAkJfQogCX0KLQkqcHJlYWxsb2MgPSAxOworCWlmICghZm91bmRfZGVsYWxsb2MpCisJCSpwcmVhbGxvYyA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKLVNUQVRJQyBpbnQKKy8qCisgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdXNlciBzcGVjaWZpZWQgcHJlYWxsb2NhdGlvbiBzaXplLCBkeW5hbWljYWxseSBpbmNyZWFzZQorICogdGhlIHByZWFsbG9jYXRpb24gc2l6ZSBhcyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBncm93cy4gQ2FwIHRoZSBtYXhpbXVtIHNpemUKKyAqIGF0IGEgc2luZ2xlIGV4dGVudCBvciBsZXNzIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG5lYXIgZnVsbC4gVGhlIGNsb3NlciB0aGUKKyAqIGZpbGVzeXN0ZW0gaXMgdG8gZnVsbCwgdGhlIHNtYWxsZXIgdGhlIG1heGltdW0gcHJlYWxvY2F0aW9uLgorICovCitTVEFUSUMgeGZzX2ZzYmxvY2tfdAoreGZzX2lvbWFwX3ByZWFsbG9jX3NpemUoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJc3RydWN0IHhmc19pbm9kZQkqaXApCit7CisJeGZzX2ZzYmxvY2tfdAkJYWxsb2NfYmxvY2tzID0gMDsKKworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RGTFRfSU9TSVpFKSkgeworCQlpbnQgc2hpZnQgPSAwOworCQlpbnQ2NF90IGZyZWVzcDsKKworCQlhbGxvY19ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIGlwLT5pX3NpemUpOworCQlhbGxvY19ibG9ja3MgPSBYRlNfRklMRU9GRl9NSU4oTUFYRVhUTEVOLAorCQkJCQlyb3VuZGRvd25fcG93X29mX3R3byhhbGxvY19ibG9ja3MpKTsKKworCQl4ZnNfaWNzYl9zeW5jX2NvdW50ZXJzKG1wLCBYRlNfSUNTQl9MQVpZX0NPVU5UKTsKKwkJZnJlZXNwID0gbXAtPm1fc2Iuc2JfZmRibG9ja3M7CisJCWlmIChmcmVlc3AgPCBtcC0+bV9sb3dfc3BhY2VbWEZTX0xPV1NQXzVfUENOVF0pIHsKKwkJCXNoaWZ0ID0gMjsKKwkJCWlmIChmcmVlc3AgPCBtcC0+bV9sb3dfc3BhY2VbWEZTX0xPV1NQXzRfUENOVF0pCisJCQkJc2hpZnQrKzsKKwkJCWlmIChmcmVlc3AgPCBtcC0+bV9sb3dfc3BhY2VbWEZTX0xPV1NQXzNfUENOVF0pCisJCQkJc2hpZnQrKzsKKwkJCWlmIChmcmVlc3AgPCBtcC0+bV9sb3dfc3BhY2VbWEZTX0xPV1NQXzJfUENOVF0pCisJCQkJc2hpZnQrKzsKKwkJCWlmIChmcmVlc3AgPCBtcC0+bV9sb3dfc3BhY2VbWEZTX0xPV1NQXzFfUENOVF0pCisJCQkJc2hpZnQrKzsKKwkJfQorCQlpZiAoc2hpZnQpCisJCQlhbGxvY19ibG9ja3MgPj49IHNoaWZ0OworCX0KKworCWlmIChhbGxvY19ibG9ja3MgPCBtcC0+bV93cml0ZWlvX2Jsb2NrcykKKwkJYWxsb2NfYmxvY2tzID0gbXAtPm1fd3JpdGVpb19ibG9ja3M7CisKKwlyZXR1cm4gYWxsb2NfYmxvY2tzOworfQorCitpbnQKIHhmc19pb21hcF93cml0ZV9kZWxheSgKIAl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwKIAlzaXplX3QJCWNvdW50LAotCWludAkJaW9mbGFnLAotCXhmc19ibWJ0X2lyZWNfdCAqcmV0X2ltYXAsCi0JaW50CQkqbm1hcHMpCisJeGZzX2JtYnRfaXJlY190ICpyZXRfaW1hcCkKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKIAl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7CkBAIC00NjksMTYgKzM5NiwxOSBAQAogCWV4dHN6ID0geGZzX2dldF9leHRzel9oaW50KGlwKTsKIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAorCiAJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUobXAsIGlwLCBvZmZzZXQsIGNvdW50LAotCQkJCWlvZmxhZywgaW1hcCwgWEZTX1dSSVRFX0lNQVBTLCAmcHJlYWxsb2MpOworCQkJCWltYXAsIFhGU19XUklURV9JTUFQUywgJnByZWFsbG9jKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAogcmV0cnk6CiAJaWYgKHByZWFsbG9jKSB7CisJCXhmc19mc2Jsb2NrX3QJYWxsb2NfYmxvY2tzID0geGZzX2lvbWFwX3ByZWFsbG9jX3NpemUobXAsIGlwKTsKKwogCQlhbGlnbmVkX29mZnNldCA9IFhGU19XUklURUlPX0FMSUdOKG1wLCAob2Zmc2V0ICsgY291bnQgLSAxKSk7CiAJCWlvYWxpZ24gPSBYRlNfQl9UT19GU0JUKG1wLCBhbGlnbmVkX29mZnNldCk7Ci0JCWxhc3RfZnNiID0gaW9hbGlnbiArIG1wLT5tX3dyaXRlaW9fYmxvY2tzOworCQlsYXN0X2ZzYiA9IGlvYWxpZ24gKyBhbGxvY19ibG9ja3M7CiAJfSBlbHNlIHsKIAkJbGFzdF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICgoeGZzX3Vmc2l6ZV90KShvZmZzZXQgKyBjb3VudCkpKTsKIAl9CkBAIC00OTYsMjIgKzQyNiwzMSBAQAogCQkJICBYRlNfQk1BUElfREVMQVkgfCBYRlNfQk1BUElfV1JJVEUgfAogCQkJICBYRlNfQk1BUElfRU5USVJFLCAmZmlyc3RibG9jaywgMSwgaW1hcCwKIAkJCSAgJm5pbWFwcywgTlVMTCk7Ci0JaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKQorCXN3aXRjaCAoZXJyb3IpIHsKKwljYXNlIDA6CisJY2FzZSBFTk9TUEM6CisJY2FzZSBFRFFVT1Q6CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCX0KIAogCS8qCi0JICogSWYgYm1hcGkgcmV0dXJuZWQgdXMgbm90aGluZywgYW5kIGlmIHdlIGRpZG4ndCBnZXQgYmFjayBFRFFVT1QsCi0JICogdGhlbiB3ZSBtdXN0IGhhdmUgcnVuIG91dCBvZiBzcGFjZSAtIGZsdXNoIGFsbCBvdGhlciBpbm9kZXMgd2l0aAotCSAqIGRlbGFsbG9jIGJsb2NrcyBhbmQgcmV0cnkgd2l0aG91dCBFT0YgcHJlYWxsb2NhdGlvbi4KKwkgKiBJZiBibWFwaSByZXR1cm5lZCB1cyBub3RoaW5nLCB3ZSBnb3QgZWl0aGVyIEVOT1NQQyBvciBFRFFVT1QuICBGb3IKKwkgKiBFTk9TUEMsICogZmx1c2ggYWxsIG90aGVyIGlub2RlcyB3aXRoIGRlbGFsbG9jIGJsb2NrcyB0byBmcmVlIHVwCisJICogc29tZSBvZiB0aGUgZXhjZXNzIHJlc2VydmVkIG1ldGFkYXRhIHNwYWNlLiBGb3IgYm90aCBjYXNlcywgcmV0cnkKKwkgKiB3aXRob3V0IEVPRiBwcmVhbGxvY2F0aW9uLgogCSAqLwogCWlmIChuaW1hcHMgPT0gMCkgewogCQl0cmFjZV94ZnNfZGVsYWxsb2NfZW5vc3BjKGlwLCBvZmZzZXQsIGNvdW50KTsKIAkJaWYgKGZsdXNoZWQpCi0JCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yID8gZXJyb3IgOiBFTk9TUEMpOwogCi0JCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCXhmc19mbHVzaF9pbm9kZXMoaXApOwotCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKGVycm9yID09IEVOT1NQQykgeworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc19mbHVzaF9pbm9kZXMoaXApOworCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCX0KIAogCQlmbHVzaGVkID0gMTsKIAkJZXJyb3IgPSAwOwpAQCAtNTIzLDggKzQ2Miw2IEBACiAJCXJldHVybiB4ZnNfY21uX2Vycl9mc2Jsb2NrX3plcm8oaXAsICZpbWFwWzBdKTsKIAogCSpyZXRfaW1hcCA9IGltYXBbMF07Ci0JKm5tYXBzID0gMTsKLQogCXJldHVybiAwOwogfQogCkBAIC01MzgsMTMgKzQ3NSwxMiBAQAogICogV2Ugbm8gbG9uZ2VyIGJvdGhlciB0byBsb29rIGF0IHRoZSBpbmNvbWluZyBtYXAgLSBhbGwgd2UgaGF2ZSB0bwogICogZ3VhcmFudGVlIGlzIHRoYXQgd2hhdGV2ZXIgd2UgYWxsb2NhdGUgZmlsbHMgdGhlIHJlcXVpcmVkIHJhbmdlLgogICovCi1TVEFUSUMgaW50CitpbnQKIHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSgKIAl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwKIAlzaXplX3QJCWNvdW50LAotCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKLQlpbnQJCSpyZXRtYXApCisJeGZzX2JtYnRfaXJlY190ICppbWFwKQogewogCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYiwgbGFzdF9ibG9jazsKQEAgLTU1Nyw4ICs0OTMsNiBAQAogCWludAkJZXJyb3IgPSAwOwogCWludAkJbnJlczsKIAotCSpyZXRtYXAgPSAwOwotCiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSB0aGVyZS4KIAkgKi8KQEAgLTY4MCw3ICs2MTQsNiBAQAogCQlpZiAoKG9mZnNldF9mc2IgPj0gaW1hcC0+YnJfc3RhcnRvZmYpICYmCiAJCSAgICAob2Zmc2V0X2ZzYiA8IChpbWFwLT5icl9zdGFydG9mZiArCiAJCQkJICAgaW1hcC0+YnJfYmxvY2tjb3VudCkpKSB7Ci0JCQkqcmV0bWFwID0gMTsKIAkJCVhGU19TVEFUU19JTkMoeHNfeHN0cmF0X3F1aWNrKTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmggYi9mcy94ZnMveGZzX2lvbWFwLmgKaW5kZXggNzc0OGE0My4uODA2MTU3NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5oCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuaApAQCAtMTgsMzAgKzE4LDE1IEBACiAjaWZuZGVmIF9fWEZTX0lPTUFQX0hfXwogI2RlZmluZSBfX1hGU19JT01BUF9IX18KIAotLyogYmFzZSBleHRlbnQgbWFuaXB1bGF0aW9uIGNhbGxzICovCi0jZGVmaW5lIEJNQVBJX1JFQUQJKDEgPDwgMCkJLyogcmVhZCBleHRlbnRzICovCi0jZGVmaW5lIEJNQVBJX1dSSVRFCSgxIDw8IDEpCS8qIGNyZWF0ZSBleHRlbnRzICovCi0jZGVmaW5lIEJNQVBJX0FMTE9DQVRFCSgxIDw8IDIpCS8qIGRlbGF5ZWQgYWxsb2NhdGUgdG8gcmVhbCBleHRlbnRzICovCi0KLS8qIG1vZGlmaWVycyAqLwotI2RlZmluZSBCTUFQSV9JR05TVEFURQkoMSA8PCA0KQkvKiBpZ25vcmUgdW53cml0dGVuIHN0YXRlIG9uIHJlYWQgKi8KLSNkZWZpbmUgQk1BUElfRElSRUNUCSgxIDw8IDUpCS8qIGRpcmVjdCBpbnN0ZWFkIG9mIGJ1ZmZlcmVkIHdyaXRlICovCi0jZGVmaW5lIEJNQVBJX01NQQkoMSA8PCA2KQkvKiBhbGxvY2F0ZSBmb3IgbW1hcCB3cml0ZSAqLwotI2RlZmluZSBCTUFQSV9UUllMT0NLCSgxIDw8IDcpCS8qIG5vbi1ibG9ja2luZyByZXF1ZXN0ICovCi0KLSNkZWZpbmUgQk1BUElfRkxBR1MgXAotCXsgQk1BUElfUkVBRCwJCSJSRUFEIiB9LCBcCi0JeyBCTUFQSV9XUklURSwJCSJXUklURSIgfSwgXAotCXsgQk1BUElfQUxMT0NBVEUsCSJBTExPQ0FURSIgfSwgXAotCXsgQk1BUElfSUdOU1RBVEUsCSJJR05TVEFURSIgfSwgXAotCXsgQk1BUElfRElSRUNULAkJIkRJUkVDVCIgfSwgXAotCXsgQk1BUElfVFJZTE9DSywJIlRSWUxPQ0siIH0KLQogc3RydWN0IHhmc19pbm9kZTsKIHN0cnVjdCB4ZnNfYm1idF9pcmVjOwogCi1leHRlcm4gaW50IHhmc19pb21hcChzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc3NpemVfdCwgaW50LAotCQkgICAgIHN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqLCBpbnQgKik7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9kaXJlY3Qoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKKwkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCk7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9kZWxheShzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKik7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKik7CiBleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCk7CiAKICNlbmRpZiAvKiBfX1hGU19JT01BUF9IX18qLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuYyBiL2ZzL3hmcy94ZnNfbG9nLmMKaW5kZXggY2VlNGFiOS4uMGJmMjRiMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2cuYworKysgYi9mcy94ZnMveGZzX2xvZy5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJCQkJeGZzX2J1ZnRhcmdfdAkqbG9nX3RhcmdldCwKIAkJCQl4ZnNfZGFkZHJfdAlibGtfb2Zmc2V0LAogCQkJCWludAkJbnVtX2JibGtzKTsKLVNUQVRJQyBpbnQJIHhsb2dfc3BhY2VfbGVmdCh4bG9nX3QgKmxvZywgaW50IGN5Y2xlLCBpbnQgYnl0ZXMpOworU1RBVElDIGludAkgeGxvZ19zcGFjZV9sZWZ0KHN0cnVjdCBsb2cgKmxvZywgYXRvbWljNjRfdCAqaGVhZCk7CiBTVEFUSUMgaW50CSB4bG9nX3N5bmMoeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZyk7CiBTVEFUSUMgdm9pZAkgeGxvZ19kZWFsbG9jX2xvZyh4bG9nX3QgKmxvZyk7CiAKQEAgLTcwLDcgKzcwLDcgQEAKIC8qIGxvY2FsIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGdyYW50IGhlYWQgKi8KIFNUQVRJQyBpbnQgIHhsb2dfZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkJKmxvZywKIAkJCQkgeGxvZ190aWNrZXRfdAkqeHRpYyk7Ci1TVEFUSUMgdm9pZCB4bG9nX2dyYW50X3B1c2hfYWlsKHhmc19tb3VudF90CSptcCwKK1NUQVRJQyB2b2lkIHhsb2dfZ3JhbnRfcHVzaF9haWwoc3RydWN0IGxvZwkqbG9nLAogCQkJCWludAkJbmVlZF9ieXRlcyk7CiBTVEFUSUMgdm9pZCB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UoeGxvZ190CSAqbG9nLAogCQkJCQkgICB4bG9nX3RpY2tldF90ICp0aWNrZXQpOwpAQCAtODEsOTggKzgxLDczIEBACiAKICNpZiBkZWZpbmVkKERFQlVHKQogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZGVzdF9wdHIoeGxvZ190ICpsb2csIGNoYXIgKnB0cik7Ci1TVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKHhsb2dfdCAqbG9nLCBpbnQgZXF1YWxzKTsKK1NUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X2dyYW50X3RhaWwoc3RydWN0IGxvZyAqbG9nKTsKIFNUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X2ljbG9nKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2csCiAJCQkJICBpbnQgY291bnQsIGJvb2xlYW5fdCBzeW5jaW5nKTsKIFNUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X3RhaWxfbHNuKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2csCiAJCQkJICAgICB4ZnNfbHNuX3QgdGFpbF9sc24pOwogI2Vsc2UKICNkZWZpbmUgeGxvZ192ZXJpZnlfZGVzdF9wdHIoYSxiKQotI2RlZmluZSB4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGEsYikKKyNkZWZpbmUgeGxvZ192ZXJpZnlfZ3JhbnRfdGFpbChhKQogI2RlZmluZSB4bG9nX3ZlcmlmeV9pY2xvZyhhLGIsYyxkKQogI2RlZmluZSB4bG9nX3ZlcmlmeV90YWlsX2xzbihhLGIsYykKICNlbmRpZgogCiBTVEFUSUMgaW50CXhsb2dfaWNsb2dzX2VtcHR5KHhsb2dfdCAqbG9nKTsKIAotCiBzdGF0aWMgdm9pZAoteGxvZ19pbnNfdGlja2V0cShzdHJ1Y3QgeGxvZ190aWNrZXQgKipxcCwgc3RydWN0IHhsb2dfdGlja2V0ICp0aWMpCit4bG9nX2dyYW50X3N1Yl9zcGFjZSgKKwlzdHJ1Y3QgbG9nCSpsb2csCisJYXRvbWljNjRfdAkqaGVhZCwKKwlpbnQJCWJ5dGVzKQogewotCWlmICgqcXApIHsKLQkJdGljLT50X25leHQJICAgID0gKCpxcCk7Ci0JCXRpYy0+dF9wcmV2CSAgICA9ICgqcXApLT50X3ByZXY7Ci0JCSgqcXApLT50X3ByZXYtPnRfbmV4dCA9IHRpYzsKLQkJKCpxcCktPnRfcHJldgkgICAgPSB0aWM7Ci0JfSBlbHNlIHsKLQkJdGljLT50X3ByZXYgPSB0aWMtPnRfbmV4dCA9IHRpYzsKLQkJKnFwID0gdGljOwotCX0KKwlpbnQ2NF90CWhlYWRfdmFsID0gYXRvbWljNjRfcmVhZChoZWFkKTsKKwlpbnQ2NF90IG5ldywgb2xkOwogCi0JdGljLT50X2ZsYWdzIHw9IFhMT0dfVElDX0lOX1E7CisJZG8geworCQlpbnQJY3ljbGUsIHNwYWNlOworCisJCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZF92YWwoaGVhZF92YWwsICZjeWNsZSwgJnNwYWNlKTsKKworCQlzcGFjZSAtPSBieXRlczsKKwkJaWYgKHNwYWNlIDwgMCkgeworCQkJc3BhY2UgKz0gbG9nLT5sX2xvZ3NpemU7CisJCQljeWNsZS0tOworCQl9CisKKwkJb2xkID0gaGVhZF92YWw7CisJCW5ldyA9IHhsb2dfYXNzaWduX2dyYW50X2hlYWRfdmFsKGN5Y2xlLCBzcGFjZSk7CisJCWhlYWRfdmFsID0gYXRvbWljNjRfY21weGNoZyhoZWFkLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAoaGVhZF92YWwgIT0gb2xkKTsKIH0KIAogc3RhdGljIHZvaWQKLXhsb2dfZGVsX3RpY2tldHEoc3RydWN0IHhsb2dfdGlja2V0ICoqcXAsIHN0cnVjdCB4bG9nX3RpY2tldCAqdGljKQoreGxvZ19ncmFudF9hZGRfc3BhY2UoCisJc3RydWN0IGxvZwkqbG9nLAorCWF0b21pYzY0X3QJKmhlYWQsCisJaW50CQlieXRlcykKIHsKLQlpZiAodGljID09IHRpYy0+dF9uZXh0KSB7Ci0JCSpxcCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJKnFwID0gdGljLT50X25leHQ7Ci0JCXRpYy0+dF9uZXh0LT50X3ByZXYgPSB0aWMtPnRfcHJldjsKLQkJdGljLT50X3ByZXYtPnRfbmV4dCA9IHRpYy0+dF9uZXh0OwotCX0KKwlpbnQ2NF90CWhlYWRfdmFsID0gYXRvbWljNjRfcmVhZChoZWFkKTsKKwlpbnQ2NF90IG5ldywgb2xkOwogCi0JdGljLT50X25leHQgPSB0aWMtPnRfcHJldiA9IE5VTEw7Ci0JdGljLT50X2ZsYWdzICY9IH5YTE9HX1RJQ19JTl9ROwotfQorCWRvIHsKKwkJaW50CQl0bXA7CisJCWludAkJY3ljbGUsIHNwYWNlOwogCi1zdGF0aWMgdm9pZAoteGxvZ19ncmFudF9zdWJfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMpCi17Ci0JbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzIC09IGJ5dGVzOwotCWlmIChsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPCAwKSB7Ci0JCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyArPSBsb2ctPmxfbG9nc2l6ZTsKLQkJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlLS07Ci0JfQorCQl4bG9nX2NyYWNrX2dyYW50X2hlYWRfdmFsKGhlYWRfdmFsLCAmY3ljbGUsICZzcGFjZSk7CiAKLQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSBieXRlczsKLQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA8IDApIHsKLQkJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gbG9nLT5sX2xvZ3NpemU7Ci0JCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLS07Ci0JfQorCQl0bXAgPSBsb2ctPmxfbG9nc2l6ZSAtIHNwYWNlOworCQlpZiAodG1wID4gYnl0ZXMpCisJCQlzcGFjZSArPSBieXRlczsKKwkJZWxzZSB7CisJCQlzcGFjZSA9IGJ5dGVzIC0gdG1wOworCQkJY3ljbGUrKzsKKwkJfQogCi19Ci0KLXN0YXRpYyB2b2lkCi14bG9nX2dyYW50X2FkZF9zcGFjZV93cml0ZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKLXsKLQlpbnQgdG1wID0gbG9nLT5sX2xvZ3NpemUgLSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXM7Ci0JaWYgKHRtcCA+IGJ5dGVzKQotCQlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gYnl0ZXM7Ci0JZWxzZSB7Ci0JCWxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSsrOwotCQlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPSBieXRlcyAtIHRtcDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi14bG9nX2dyYW50X2FkZF9zcGFjZV9yZXNlcnZlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzKQotewotCWludCB0bXAgPSBsb2ctPmxfbG9nc2l6ZSAtIGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzOwotCWlmICh0bXAgPiBieXRlcykKLQkJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgKz0gYnl0ZXM7Ci0JZWxzZSB7Ci0JCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlKys7Ci0JCWxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID0gYnl0ZXMgLSB0bXA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXhsb2dfZ3JhbnRfYWRkX3NwYWNlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzKQotewotCXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3dyaXRlKGxvZywgYnl0ZXMpOwotCXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3Jlc2VydmUobG9nLCBieXRlcyk7CisJCW9sZCA9IGhlYWRfdmFsOworCQluZXcgPSB4bG9nX2Fzc2lnbl9ncmFudF9oZWFkX3ZhbChjeWNsZSwgc3BhY2UpOworCQloZWFkX3ZhbCA9IGF0b21pYzY0X2NtcHhjaGcoaGVhZCwgb2xkLCBuZXcpOworCX0gd2hpbGUgKGhlYWRfdmFsICE9IG9sZCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNTUsNyArMzMwLDcgQEAKIAogCQl0cmFjZV94ZnNfbG9nX3Jlc2VydmUobG9nLCBpbnRlcm5hbF90aWNrZXQpOwogCi0JCXhsb2dfZ3JhbnRfcHVzaF9haWwobXAsIGludGVybmFsX3RpY2tldC0+dF91bml0X3Jlcyk7CisJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLCBpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMpOwogCQlyZXR2YWwgPSB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKGxvZywgaW50ZXJuYWxfdGlja2V0KTsKIAl9IGVsc2UgewogCQkvKiBtYXkgc2xlZXAgaWYgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHRpY2tldHMgKi8KQEAgLTM2OSw3ICszNDQsNyBAQAogCiAJCXRyYWNlX3hmc19sb2dfcmVzZXJ2ZShsb2csIGludGVybmFsX3RpY2tldCk7CiAKLQkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csCiAJCQkJICAgIChpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMgKgogCQkJCSAgICAgaW50ZXJuYWxfdGlja2V0LT50X2NudCkpOwogCQlyZXR2YWwgPSB4bG9nX2dyYW50X2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CkBAIC01ODQsOCArNTU5LDggQEAKIAkJaWYgKCEoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFIHx8CiAJCSAgICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0RJUlRZKSkgewogCQkJaWYgKCFYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKSB7Ci0JCQkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsIFBNRU0sCi0JCQkJCSZsb2ctPmxfaWNsb2dsb2NrLCBzKTsKKwkJCQl4bG9nX3dhaXQoJmljbG9nLT5pY19mb3JjZV93YWl0LAorCQkJCQkJCSZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJCX0gZWxzZSB7CiAJCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJfQpAQCAtNjI1LDggKzYwMCw4IEBACiAJCQl8fCBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWQogCQkJfHwgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfSU9FUlJPUikgKSB7CiAKLQkJCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwgUE1FTSwKLQkJCQkJJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkJCXhsb2dfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsCisJCQkJCQkJJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl9IGVsc2UgewogCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl9CkBAIC03MDMsNTUgKzY3OCw0NiBAQAogewogCXhsb2dfdGlja2V0X3QJKnRpYzsKIAl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7Ci0JaW50CQluZWVkX2J5dGVzLCBmcmVlX2J5dGVzLCBjeWNsZSwgYnl0ZXM7CisJaW50CQluZWVkX2J5dGVzLCBmcmVlX2J5dGVzOwogCiAJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCiAJCXJldHVybjsKIAotCWlmICh0YWlsX2xzbiA9PSAwKSB7Ci0JCS8qIG5lZWRlZCBzaW5jZSBzeW5jX2xzbiBpcyA2NCBiaXRzICovCi0JCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7Ci0JCXRhaWxfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247Ci0JCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKLQl9CisJaWYgKHRhaWxfbHNuID09IDApCisJCXRhaWxfbHNuID0gYXRvbWljNjRfcmVhZCgmbG9nLT5sX2xhc3Rfc3luY19sc24pOwogCi0Jc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJLyogdGFpbF9sc24gPT0gMSBpbXBsaWVzIHRoYXQgd2Ugd2VyZW4ndCBwYXNzZWQgYSB2YWxpZCB2YWx1ZS4gICovCisJaWYgKHRhaWxfbHNuICE9IDEpCisJCWF0b21pYzY0X3NldCgmbG9nLT5sX3RhaWxfbHNuLCB0YWlsX2xzbik7CiAKLQkvKiBBbHNvIGFuIGludmFsaWQgbHNuLiAgMSBpbXBsaWVzIHRoYXQgd2UgYXJlbid0IHBhc3NpbmcgaW4gYSB2YWxpZAotCSAqIHRhaWxfbHNuLgotCSAqLwotCWlmICh0YWlsX2xzbiAhPSAxKSB7Ci0JCWxvZy0+bF90YWlsX2xzbiA9IHRhaWxfbHNuOwotCX0KLQotCWlmICgodGljID0gbG9nLT5sX3dyaXRlX2hlYWRxKSkgeworCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfd3JpdGVxKSkgewogI2lmZGVmIERFQlVHCiAJCWlmIChsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkKIAkJCXBhbmljKCJSZWNvdmVyeSBwcm9ibGVtIik7CiAjZW5kaWYKLQkJY3ljbGUgPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGU7Ci0JCWJ5dGVzID0gbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzOwotCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgY3ljbGUsIGJ5dGVzKTsKLQkJZG8geworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKKwkJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGljLCAmbG9nLT5sX3dyaXRlcSwgdF9xdWV1ZSkgewogCQkJQVNTRVJUKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKIAogCQkJaWYgKGZyZWVfYnl0ZXMgPCB0aWMtPnRfdW5pdF9yZXMgJiYgdGFpbF9sc24gIT0gMSkKIAkJCQlicmVhazsKIAkJCXRhaWxfbHNuID0gMDsKIAkJCWZyZWVfYnl0ZXMgLT0gdGljLT50X3VuaXRfcmVzOwotCQkJc3Zfc2lnbmFsKCZ0aWMtPnRfd2FpdCk7Ci0JCQl0aWMgPSB0aWMtPnRfbmV4dDsKLQkJfSB3aGlsZSAodGljICE9IGxvZy0+bF93cml0ZV9oZWFkcSk7CisJCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZV91cChsb2csIHRpYyk7CisJCQl3YWtlX3VwKCZ0aWMtPnRfd2FpdCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKIAl9Ci0JaWYgKCh0aWMgPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSkpIHsKKworCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfcmVzZXJ2ZXEpKSB7CiAjaWZkZWYgREVCVUcKIAkJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQogCQkJcGFuaWMoIlJlY292ZXJ5IHByb2JsZW0iKTsKICNlbmRpZgotCQljeWNsZSA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlOwotCQlieXRlcyA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzOwotCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgY3ljbGUsIGJ5dGVzKTsKLQkJZG8geworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpYywgJmxvZy0+bF9yZXNlcnZlcSwgdF9xdWV1ZSkgewogCQkJaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKQogCQkJCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXMqdGljLT50X2NudDsKIAkJCWVsc2UKQEAgLTc2MCwxMiArNzI2LDEyIEBACiAJCQkJYnJlYWs7CiAJCQl0YWlsX2xzbiA9IDA7CiAJCQlmcmVlX2J5dGVzIC09IG5lZWRfYnl0ZXM7Ci0JCQlzdl9zaWduYWwoJnRpYy0+dF93YWl0KTsKLQkJCXRpYyA9IHRpYy0+dF9uZXh0OwotCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpOworCQkJdHJhY2VfeGZzX2xvZ19ncmFudF93YWtlX3VwKGxvZywgdGljKTsKKwkJCXdha2VfdXAoJnRpYy0+dF93YWl0KTsKKwkJfQorCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci19CS8qIHhmc19sb2dfbW92ZV90YWlsICovCit9CiAKIC8qCiAgKiBEZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGdvbmUgdG8gZGlzawpAQCAtODMxLDIzICs3OTcsMTkgQEAKICAqIFdlIG1heSBiZSBob2xkaW5nIHRoZSBsb2cgaWNsb2cgbG9jayB1cG9uIGVudGVyaW5nIHRoaXMgcm91dGluZS4KICAqLwogeGZzX2xzbl90Ci14bG9nX2Fzc2lnbl90YWlsX2xzbih4ZnNfbW91bnRfdCAqbXApCit4bG9nX2Fzc2lnbl90YWlsX2xzbigKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKIHsKLQl4ZnNfbHNuX3QgdGFpbF9sc247Ci0JeGxvZ190CSAgKmxvZyA9IG1wLT5tX2xvZzsKKwl4ZnNfbHNuX3QJCXRhaWxfbHNuOworCXN0cnVjdCBsb2cJCSpsb2cgPSBtcC0+bV9sb2c7CiAKIAl0YWlsX2xzbiA9IHhmc190cmFuc19haWxfdGFpbChtcC0+bV9haWwpOwotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCWlmICh0YWlsX2xzbiAhPSAwKSB7Ci0JCWxvZy0+bF90YWlsX2xzbiA9IHRhaWxfbHNuOwotCX0gZWxzZSB7Ci0JCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247Ci0JfQotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJaWYgKCF0YWlsX2xzbikKKwkJdGFpbF9sc24gPSBhdG9taWM2NF9yZWFkKCZsb2ctPmxfbGFzdF9zeW5jX2xzbik7CiAKKwlhdG9taWM2NF9zZXQoJmxvZy0+bF90YWlsX2xzbiwgdGFpbF9sc24pOwogCXJldHVybiB0YWlsX2xzbjsKLX0JLyogeGxvZ19hc3NpZ25fdGFpbF9sc24gKi8KLQorfQogCiAvKgogICogUmV0dXJuIHRoZSBzcGFjZSBpbiB0aGUgbG9nIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkLiAgVGhlIGhlYWQKQEAgLTg2NCwyMSArODI2LDI2IEBACiAgKiByZXN1bHQgaXMgdGhhdCB3ZSByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvZyBhcyB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQuCiAgKi8KIFNUQVRJQyBpbnQKLXhsb2dfc3BhY2VfbGVmdCh4bG9nX3QgKmxvZywgaW50IGN5Y2xlLCBpbnQgYnl0ZXMpCit4bG9nX3NwYWNlX2xlZnQoCisJc3RydWN0IGxvZwkqbG9nLAorCWF0b21pYzY0X3QJKmhlYWQpCiB7Ci0JaW50IGZyZWVfYnl0ZXM7Ci0JaW50IHRhaWxfYnl0ZXM7Ci0JaW50IHRhaWxfY3ljbGU7CisJaW50CQlmcmVlX2J5dGVzOworCWludAkJdGFpbF9ieXRlczsKKwlpbnQJCXRhaWxfY3ljbGU7CisJaW50CQloZWFkX2N5Y2xlOworCWludAkJaGVhZF9ieXRlczsKIAotCXRhaWxfYnl0ZXMgPSBCQlRPQihCTE9DS19MU04obG9nLT5sX3RhaWxfbHNuKSk7Ci0JdGFpbF9jeWNsZSA9IENZQ0xFX0xTTihsb2ctPmxfdGFpbF9sc24pOwotCWlmICgodGFpbF9jeWNsZSA9PSBjeWNsZSkgJiYgKGJ5dGVzID49IHRhaWxfYnl0ZXMpKSB7Ci0JCWZyZWVfYnl0ZXMgPSBsb2ctPmxfbG9nc2l6ZSAtIChieXRlcyAtIHRhaWxfYnl0ZXMpOwotCX0gZWxzZSBpZiAoKHRhaWxfY3ljbGUgKyAxKSA8IGN5Y2xlKSB7CisJeGxvZ19jcmFja19ncmFudF9oZWFkKGhlYWQsICZoZWFkX2N5Y2xlLCAmaGVhZF9ieXRlcyk7CisJeGxvZ19jcmFja19hdG9taWNfbHNuKCZsb2ctPmxfdGFpbF9sc24sICZ0YWlsX2N5Y2xlLCAmdGFpbF9ieXRlcyk7CisJdGFpbF9ieXRlcyA9IEJCVE9CKHRhaWxfYnl0ZXMpOworCWlmICh0YWlsX2N5Y2xlID09IGhlYWRfY3ljbGUgJiYgaGVhZF9ieXRlcyA+PSB0YWlsX2J5dGVzKQorCQlmcmVlX2J5dGVzID0gbG9nLT5sX2xvZ3NpemUgLSAoaGVhZF9ieXRlcyAtIHRhaWxfYnl0ZXMpOworCWVsc2UgaWYgKHRhaWxfY3ljbGUgKyAxIDwgaGVhZF9jeWNsZSkKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICh0YWlsX2N5Y2xlIDwgY3ljbGUpIHsKLQkJQVNTRVJUKHRhaWxfY3ljbGUgPT0gKGN5Y2xlIC0gMSkpOwotCQlmcmVlX2J5dGVzID0gdGFpbF9ieXRlcyAtIGJ5dGVzOworCWVsc2UgaWYgKHRhaWxfY3ljbGUgPCBoZWFkX2N5Y2xlKSB7CisJCUFTU0VSVCh0YWlsX2N5Y2xlID09IChoZWFkX2N5Y2xlIC0gMSkpOworCQlmcmVlX2J5dGVzID0gdGFpbF9ieXRlcyAtIGhlYWRfYnl0ZXM7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogVGhlIHJlc2VydmF0aW9uIGhlYWQgaXMgYmVoaW5kIHRoZSB0YWlsLgpAQCAtODg5LDEyICs4NTYsMTIgQEAKIAkJCSJ4bG9nX3NwYWNlX2xlZnQ6IGhlYWQgYmVoaW5kIHRhaWxcbiIKIAkJCSIgIHRhaWxfY3ljbGUgPSAlZCwgdGFpbF9ieXRlcyA9ICVkXG4iCiAJCQkiICBHSCAgIGN5Y2xlID0gJWQsIEdIICAgYnl0ZXMgPSAlZCIsCi0JCQl0YWlsX2N5Y2xlLCB0YWlsX2J5dGVzLCBjeWNsZSwgYnl0ZXMpOworCQkJdGFpbF9jeWNsZSwgdGFpbF9ieXRlcywgaGVhZF9jeWNsZSwgaGVhZF9ieXRlcyk7CiAJCUFTU0VSVCgwKTsKIAkJZnJlZV9ieXRlcyA9IGxvZy0+bF9sb2dzaXplOwogCX0KIAlyZXR1cm4gZnJlZV9ieXRlczsKLX0JLyogeGxvZ19zcGFjZV9sZWZ0ICovCit9CiAKIAogLyoKQEAgLTEwNDcsMTIgKzEwMTQsMTYgQEAKIAlsb2ctPmxfZmxhZ3MJICAgfD0gWExPR19BQ1RJVkVfUkVDT1ZFUlk7CiAKIAlsb2ctPmxfcHJldl9ibG9jayAgPSAtMTsKLQlsb2ctPmxfdGFpbF9sc24JICAgPSB4bG9nX2Fzc2lnbl9sc24oMSwgMCk7CiAJLyogbG9nLT5sX3RhaWxfbHNuID0gMHgxMDAwMDAwMDBMTDsgY3ljbGUgPSAxOyBjdXJyZW50IGJsb2NrID0gMCAqLwotCWxvZy0+bF9sYXN0X3N5bmNfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworCXhsb2dfYXNzaWduX2F0b21pY19sc24oJmxvZy0+bF90YWlsX2xzbiwgMSwgMCk7CisJeGxvZ19hc3NpZ25fYXRvbWljX2xzbigmbG9nLT5sX2xhc3Rfc3luY19sc24sIDEsIDApOwogCWxvZy0+bF9jdXJyX2N5Y2xlICA9IDE7CSAgICAvKiAwIGlzIGJhZCBzaW5jZSB0aGlzIGlzIGluaXRpYWwgdmFsdWUgKi8KLQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSA9IDE7Ci0JbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlID0gMTsKKwl4bG9nX2Fzc2lnbl9ncmFudF9oZWFkKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLCAxLCAwKTsKKwl4bG9nX2Fzc2lnbl9ncmFudF9oZWFkKCZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgMSwgMCk7CisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+bF9yZXNlcnZlcSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+bF93cml0ZXEpOworCXNwaW5fbG9ja19pbml0KCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwogCiAJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJaWYgKHhmc19zYl92ZXJzaW9uX2hhc3NlY3RvcigmbXAtPm1fc2IpKSB7CkBAIC0xMDk0LDggKzEwNjUsNyBAQAogCWxvZy0+bF94YnVmID0gYnA7CiAKIAlzcGluX2xvY2tfaW5pdCgmbG9nLT5sX2ljbG9nbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmxvZy0+bF9ncmFudF9sb2NrKTsKLQlzdl9pbml0KCZsb2ctPmxfZmx1c2hfd2FpdCwgMCwgImZsdXNoX3dhaXQiKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsb2ctPmxfZmx1c2hfd2FpdCk7CiAKIAkvKiBsb2cgcmVjb3JkIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiBCQlNJWkU7IHNlZSB4bG9nX3JlY19oZWFkZXJfdCAqLwogCUFTU0VSVCgoWEZTX0JVRl9TSVpFKGJwKSAmIEJCTUFTSykgPT0gMCk7CkBAIC0xMTUxLDggKzExMjEsOCBAQAogCiAJCUFTU0VSVChYRlNfQlVGX0lTQlVTWShpY2xvZy0+aWNfYnApKTsKIAkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoaWNsb2ctPmljX2JwKSA8PSAwKTsKLQkJc3ZfaW5pdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsIFNWX0RFRkFVTFQsICJpY2xvZy1mb3JjZSIpOwotCQlzdl9pbml0KCZpY2xvZy0+aWNfd3JpdGVfd2FpdCwgU1ZfREVGQVVMVCwgImljbG9nLXdyaXRlIik7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmljbG9nLT5pY19mb3JjZV93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaWNsb2ctPmljX3dyaXRlX3dhaXQpOwogCiAJCWljbG9ncCA9ICZpY2xvZy0+aWNfbmV4dDsKIAl9CkBAIC0xMTY3LDE1ICsxMTM3LDExIEBACiBvdXRfZnJlZV9pY2xvZzoKIAlmb3IgKGljbG9nID0gbG9nLT5sX2ljbG9nOyBpY2xvZzsgaWNsb2cgPSBwcmV2X2ljbG9nKSB7CiAJCXByZXZfaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKLQkJaWYgKGljbG9nLT5pY19icCkgewotCQkJc3ZfZGVzdHJveSgmaWNsb2ctPmljX2ZvcmNlX3dhaXQpOwotCQkJc3ZfZGVzdHJveSgmaWNsb2ctPmljX3dyaXRlX3dhaXQpOworCQlpZiAoaWNsb2ctPmljX2JwKQogCQkJeGZzX2J1Zl9mcmVlKGljbG9nLT5pY19icCk7Ci0JCX0KIAkJa21lbV9mcmVlKGljbG9nKTsKIAl9CiAJc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2ljbG9nbG9jayk7Ci0Jc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2dyYW50X2xvY2spOwogCXhmc19idWZfZnJlZShsb2ctPmxfeGJ1Zik7CiBvdXRfZnJlZV9sb2c6CiAJa21lbV9mcmVlKGxvZyk7CkBAIC0xMjIzLDYxICsxMTg5LDYwIEBACiAgKiB3YXRlciBtYXJrLiAgSW4gdGhpcyBtYW5uZXIsIHdlIHdvdWxkIGJlIGNyZWF0aW5nIGEgbG93IHdhdGVyIG1hcmsuCiAgKi8KIFNUQVRJQyB2b2lkCi14bG9nX2dyYW50X3B1c2hfYWlsKHhmc19tb3VudF90CSptcCwKLQkJICAgIGludAkJbmVlZF9ieXRlcykKK3hsb2dfZ3JhbnRfcHVzaF9haWwoCisJc3RydWN0IGxvZwkqbG9nLAorCWludAkJbmVlZF9ieXRlcykKIHsKLSAgICB4bG9nX3QJKmxvZyA9IG1wLT5tX2xvZzsJLyogcG9pbnRlciB0byB0aGUgbG9nICovCi0gICAgeGZzX2xzbl90CXRhaWxfbHNuOwkJLyogbHNuIG9mIHRoZSBsb2cgdGFpbCAqLwotICAgIHhmc19sc25fdAl0aHJlc2hvbGRfbHNuID0gMDsJLyogbHNuIHdlJ2QgbGlrZSB0byBiZSBhdCAqLwotICAgIGludAkJZnJlZV9ibG9ja3M7CQkvKiBmcmVlIGJsb2NrcyBsZWZ0IHRvIHdyaXRlIHRvICovCi0gICAgaW50CQlmcmVlX2J5dGVzOwkJLyogZnJlZSBieXRlcyBsZWZ0IHRvIHdyaXRlIHRvICovCi0gICAgaW50CQl0aHJlc2hvbGRfYmxvY2s7CS8qIGJsb2NrIGluIGxzbiB3ZSdkIGxpa2UgdG8gYmUgYXQgKi8KLSAgICBpbnQJCXRocmVzaG9sZF9jeWNsZTsJLyogbHNuIGN5Y2xlIHdlJ2QgbGlrZSB0byBiZSBhdCAqLwotICAgIGludAkJZnJlZV90aHJlc2hvbGQ7CisJeGZzX2xzbl90CXRocmVzaG9sZF9sc24gPSAwOworCXhmc19sc25fdAlsYXN0X3N5bmNfbHNuOworCWludAkJZnJlZV9ibG9ja3M7CisJaW50CQlmcmVlX2J5dGVzOworCWludAkJdGhyZXNob2xkX2Jsb2NrOworCWludAkJdGhyZXNob2xkX2N5Y2xlOworCWludAkJZnJlZV90aHJlc2hvbGQ7CiAKLSAgICBBU1NFUlQoQlRPQkIobmVlZF9ieXRlcykgPCBsb2ctPmxfbG9nQkJzaXplKTsKKwlBU1NFUlQoQlRPQkIobmVlZF9ieXRlcykgPCBsb2ctPmxfbG9nQkJzaXplKTsKIAotICAgIHNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotICAgIGZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLAotCQkJCSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSwKLQkJCQkgbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMpOwotICAgIHRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwotICAgIGZyZWVfYmxvY2tzID0gQlRPQkJUKGZyZWVfYnl0ZXMpOworCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCk7CisJZnJlZV9ibG9ja3MgPSBCVE9CQlQoZnJlZV9ieXRlcyk7CiAKLSAgICAvKgotICAgICAqIFNldCB0aGUgdGhyZXNob2xkIGZvciB0aGUgbWluaW11bSBudW1iZXIgb2YgZnJlZSBibG9ja3MgaW4gdGhlCi0gICAgICogbG9nIHRvIHRoZSBtYXhpbXVtIG9mIHdoYXQgdGhlIGNhbGxlciBuZWVkcywgb25lIHF1YXJ0ZXIgb2YgdGhlCi0gICAgICogbG9nLCBhbmQgMjU2IGJsb2Nrcy4KLSAgICAgKi8KLSAgICBmcmVlX3RocmVzaG9sZCA9IEJUT0JCKG5lZWRfYnl0ZXMpOwotICAgIGZyZWVfdGhyZXNob2xkID0gTUFYKGZyZWVfdGhyZXNob2xkLCAobG9nLT5sX2xvZ0JCc2l6ZSA+PiAyKSk7Ci0gICAgZnJlZV90aHJlc2hvbGQgPSBNQVgoZnJlZV90aHJlc2hvbGQsIDI1Nik7Ci0gICAgaWYgKGZyZWVfYmxvY2tzIDwgZnJlZV90aHJlc2hvbGQpIHsKLQl0aHJlc2hvbGRfYmxvY2sgPSBCTE9DS19MU04odGFpbF9sc24pICsgZnJlZV90aHJlc2hvbGQ7Ci0JdGhyZXNob2xkX2N5Y2xlID0gQ1lDTEVfTFNOKHRhaWxfbHNuKTsKLQlpZiAodGhyZXNob2xkX2Jsb2NrID49IGxvZy0+bF9sb2dCQnNpemUpIHsKLQkgICAgdGhyZXNob2xkX2Jsb2NrIC09IGxvZy0+bF9sb2dCQnNpemU7Ci0JICAgIHRocmVzaG9sZF9jeWNsZSArPSAxOwotCX0KLQl0aHJlc2hvbGRfbHNuID0geGxvZ19hc3NpZ25fbHNuKHRocmVzaG9sZF9jeWNsZSwgdGhyZXNob2xkX2Jsb2NrKTsKLQotCS8qIERvbid0IHBhc3MgaW4gYW4gbHNuIGdyZWF0ZXIgdGhhbiB0aGUgbHNuIG9mIHRoZSBsYXN0Ci0JICogbG9nIHJlY29yZCBrbm93biB0byBiZSBvbiBkaXNrLgorCS8qCisJICogU2V0IHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiB0aGUKKwkgKiBsb2cgdG8gdGhlIG1heGltdW0gb2Ygd2hhdCB0aGUgY2FsbGVyIG5lZWRzLCBvbmUgcXVhcnRlciBvZiB0aGUKKwkgKiBsb2csIGFuZCAyNTYgYmxvY2tzLgogCSAqLwotCWlmIChYRlNfTFNOX0NNUCh0aHJlc2hvbGRfbHNuLCBsb2ctPmxfbGFzdF9zeW5jX2xzbikgPiAwKQotCSAgICB0aHJlc2hvbGRfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247Ci0gICAgfQotICAgIHNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJZnJlZV90aHJlc2hvbGQgPSBCVE9CQihuZWVkX2J5dGVzKTsKKwlmcmVlX3RocmVzaG9sZCA9IE1BWChmcmVlX3RocmVzaG9sZCwgKGxvZy0+bF9sb2dCQnNpemUgPj4gMikpOworCWZyZWVfdGhyZXNob2xkID0gTUFYKGZyZWVfdGhyZXNob2xkLCAyNTYpOworCWlmIChmcmVlX2Jsb2NrcyA+PSBmcmVlX3RocmVzaG9sZCkKKwkJcmV0dXJuOwogCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIHRyYW5zYWN0aW9uIGxheWVyIHRvIGtpY2sgdGhlIGRpcnR5IGJ1ZmZlcnMgb3V0IHRvCi0gICAgICogZGlzayBhc3luY2hyb25vdXNseS4gTm8gcG9pbnQgaW4gdHJ5aW5nIHRvIGRvIHRoaXMgaWYKLSAgICAgKiB0aGUgZmlsZXN5c3RlbSBpcyBzaHV0dGluZyBkb3duLgotICAgICAqLwotICAgIGlmICh0aHJlc2hvbGRfbHNuICYmCi0JIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCi0JICAgIHhmc190cmFuc19haWxfcHVzaChsb2ctPmxfYWlscCwgdGhyZXNob2xkX2xzbik7Ci19CS8qIHhsb2dfZ3JhbnRfcHVzaF9haWwgKi8KKwl4bG9nX2NyYWNrX2F0b21pY19sc24oJmxvZy0+bF90YWlsX2xzbiwgJnRocmVzaG9sZF9jeWNsZSwKKwkJCQkJCSZ0aHJlc2hvbGRfYmxvY2spOworCXRocmVzaG9sZF9ibG9jayArPSBmcmVlX3RocmVzaG9sZDsKKwlpZiAodGhyZXNob2xkX2Jsb2NrID49IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJdGhyZXNob2xkX2Jsb2NrIC09IGxvZy0+bF9sb2dCQnNpemU7CisJCXRocmVzaG9sZF9jeWNsZSArPSAxOworCX0KKwl0aHJlc2hvbGRfbHNuID0geGxvZ19hc3NpZ25fbHNuKHRocmVzaG9sZF9jeWNsZSwKKwkJCQkJdGhyZXNob2xkX2Jsb2NrKTsKKwkvKgorCSAqIERvbid0IHBhc3MgaW4gYW4gbHNuIGdyZWF0ZXIgdGhhbiB0aGUgbHNuIG9mIHRoZSBsYXN0CisJICogbG9nIHJlY29yZCBrbm93biB0byBiZSBvbiBkaXNrLiBVc2UgYSBzbmFwc2hvdCBvZiB0aGUgbGFzdCBzeW5jIGxzbgorCSAqIHNvIHRoYXQgaXQgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiB0aGUgY29tcGFyZSBhbmQgdGhlIHNldC4KKwkgKi8KKwlsYXN0X3N5bmNfbHNuID0gYXRvbWljNjRfcmVhZCgmbG9nLT5sX2xhc3Rfc3luY19sc24pOworCWlmIChYRlNfTFNOX0NNUCh0aHJlc2hvbGRfbHNuLCBsYXN0X3N5bmNfbHNuKSA+IDApCisJCXRocmVzaG9sZF9sc24gPSBsYXN0X3N5bmNfbHNuOworCisJLyoKKwkgKiBHZXQgdGhlIHRyYW5zYWN0aW9uIGxheWVyIHRvIGtpY2sgdGhlIGRpcnR5IGJ1ZmZlcnMgb3V0IHRvCisJICogZGlzayBhc3luY2hyb25vdXNseS4gTm8gcG9pbnQgaW4gdHJ5aW5nIHRvIGRvIHRoaXMgaWYKKwkgKiB0aGUgZmlsZXN5c3RlbSBpcyBzaHV0dGluZyBkb3duLgorCSAqLworCWlmICghWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkJeGZzX3RyYW5zX2FpbF9wdXNoKGxvZy0+bF9haWxwLCB0aHJlc2hvbGRfbHNuKTsKK30KIAogLyoKICAqIFRoZSBiZHN0cmF0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsb2cgYnVmcy4gVGhpcyBnaXZlcyB1cyBhIGNlbnRyYWwKQEAgLTEzNzIsOSArMTMzNyw4IEBACiAJCSByb3VuZG9mZiA8IEJCVE9CKDEpKSk7CiAKIAkvKiBtb3ZlIGdyYW50IGhlYWRzIGJ5IHJvdW5kb2ZmIGluIHN5bmMgKi8KLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csIHJvdW5kb2ZmKTsKLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsIHJvdW5kb2ZmKTsKKwl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgcm91bmRvZmYpOwogCiAJLyogcHV0IGN5Y2xlIG51bWJlciBpbiBldmVyeSBibG9jayAqLwogCXhsb2dfcGFja19kYXRhKGxvZywgaWNsb2csIHJvdW5kb2ZmKTsgCkBAIC0xNDg5LDE1ICsxNDUzLDEyIEBACiAKIAlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKIAlmb3IgKGk9MDsgaTxsb2ctPmxfaWNsb2dfYnVmczsgaSsrKSB7Ci0JCXN2X2Rlc3Ryb3koJmljbG9nLT5pY19mb3JjZV93YWl0KTsKLQkJc3ZfZGVzdHJveSgmaWNsb2ctPmljX3dyaXRlX3dhaXQpOwogCQl4ZnNfYnVmX2ZyZWUoaWNsb2ctPmljX2JwKTsKIAkJbmV4dF9pY2xvZyA9IGljbG9nLT5pY19uZXh0OwogCQlrbWVtX2ZyZWUoaWNsb2cpOwogCQlpY2xvZyA9IG5leHRfaWNsb2c7CiAJfQogCXNwaW5sb2NrX2Rlc3Ryb3koJmxvZy0+bF9pY2xvZ2xvY2spOwotCXNwaW5sb2NrX2Rlc3Ryb3koJmxvZy0+bF9ncmFudF9sb2NrKTsKIAogCXhmc19idWZfZnJlZShsb2ctPmxfeGJ1Zik7CiAJbG9nLT5sX21wLT5tX2xvZyA9IE5VTEw7CkBAIC0yMjMyLDcgKzIxOTMsNyBAQAogCQkJCWxvd2VzdF9sc24gPSB4bG9nX2dldF9sb3dlc3RfbHNuKGxvZyk7CiAJCQkJaWYgKGxvd2VzdF9sc24gJiYKIAkJCQkgICAgWEZTX0xTTl9DTVAobG93ZXN0X2xzbiwKLQkJCQkgICAgCQliZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSkgPCAwKSB7CisJCQkJCQliZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSkgPCAwKSB7CiAJCQkJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CiAJCQkJCWNvbnRpbnVlOyAvKiBMZWF2ZSB0aGlzIGljbG9nIGZvcgogCQkJCQkJICAgKiBhbm90aGVyIHRocmVhZCAqLwpAQCAtMjI0MCwyMyArMjIwMSwyMSBAQAogCiAJCQkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9DQUxMQkFDSzsKIAotCQkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAotCQkJCS8qIGxfbGFzdF9zeW5jX2xzbiBmaWVsZCBwcm90ZWN0ZWQgYnkKLQkJCQkgKiBsX2dyYW50X2xvY2suIERvbid0IHdvcnJ5IGFib3V0IGljbG9nJ3MgbHNuLgotCQkJCSAqIE5vIG9uZSBlbHNlIGNhbiBiZSBoZXJlIGV4Y2VwdCB1cy4KKwkJCQkvKgorCQkJCSAqIHVwZGF0ZSB0aGUgbGFzdF9zeW5jX2xzbiBiZWZvcmUgd2UgZHJvcCB0aGUKKwkJCQkgKiBpY2xvZ2xvY2sgdG8gZW5zdXJlIHdlIGFyZSB0aGUgb25seSBvbmUgdGhhdAorCQkJCSAqIGNhbiB1cGRhdGUgaXQuCiAJCQkJICovCi0JCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JCQkJQVNTRVJUKFhGU19MU05fQ01QKGxvZy0+bF9sYXN0X3N5bmNfbHNuLAotCQkJCSAgICAgICBiZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSkgPD0gMCk7Ci0JCQkJbG9nLT5sX2xhc3Rfc3luY19sc24gPQotCQkJCQliZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKTsKLQkJCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCQkJCUFTU0VSVChYRlNfTFNOX0NNUChhdG9taWM2NF9yZWFkKCZsb2ctPmxfbGFzdF9zeW5jX2xzbiksCisJCQkJCWJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKSA8PSAwKTsKKwkJCQlhdG9taWM2NF9zZXQoJmxvZy0+bF9sYXN0X3N5bmNfbHNuLAorCQkJCQliZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSk7CiAKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOworCQkJfSBlbHNlCiAJCQkJaW9lcnJvcnMrKzsKLQkJCX0KKworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCQkvKgogCQkJICogS2VlcCBwcm9jZXNzaW5nIGVudHJpZXMgaW4gdGhlIGNhbGxiYWNrIGxpc3QgdW50aWwKQEAgLTIyOTcsNyArMjI1Niw3IEBACiAJCQl4bG9nX3N0YXRlX2NsZWFuX2xvZyhsb2cpOwogCiAJCQkvKiB3YWtlIHVwIHRocmVhZHMgd2FpdGluZyBpbiB4ZnNfbG9nX2ZvcmNlKCkgKi8KLQkJCXN2X2Jyb2FkY2FzdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQpOworCQkJd2FrZV91cF9hbGwoJmljbG9nLT5pY19mb3JjZV93YWl0KTsKIAogCQkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKIAkJfSB3aGlsZSAoZmlyc3RfaWNsb2cgIT0gaWNsb2cpOwpAQCAtMjM0NCw3ICsyMzAzLDcgQEAKIAlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAlpZiAod2FrZSkKLQkJc3ZfYnJvYWRjYXN0KCZsb2ctPmxfZmx1c2hfd2FpdCk7CisJCXdha2VfdXBfYWxsKCZsb2ctPmxfZmx1c2hfd2FpdCk7CiB9CiAKIApAQCAtMjM5NSw3ICsyMzU0LDcgQEAKIAkgKiBpY2xvZyBidWZmZXIsIHdlIHdha2UgdGhlbSBhbGwsIG9uZSB3aWxsIGdldCB0byBkbyB0aGUKIAkgKiBJL08sIHRoZSBvdGhlcnMgZ2V0IHRvIHdhaXQgZm9yIHRoZSByZXN1bHQuCiAJICovCi0Jc3ZfYnJvYWRjYXN0KCZpY2xvZy0+aWNfd3JpdGVfd2FpdCk7CisJd2FrZV91cF9hbGwoJmljbG9nLT5pY193cml0ZV93YWl0KTsKIAlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJeGxvZ19zdGF0ZV9kb19jYWxsYmFjayhsb2csIGFib3J0ZWQsIGljbG9nKTsJLyogYWxzbyBjbGVhbnMgbG9nICovCiB9CS8qIHhsb2dfc3RhdGVfZG9uZV9zeW5jaW5nICovCkBAIC0yNDQ0LDcgKzI0MDMsNyBAQAogCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19ub2ljbG9ncyk7CiAKIAkJLyogV2FpdCBmb3IgbG9nIHdyaXRlcyB0byBoYXZlIGZsdXNoZWQgKi8KLQkJc3Zfd2FpdCgmbG9nLT5sX2ZsdXNoX3dhaXQsIDAsICZsb2ctPmxfaWNsb2dsb2NrLCAwKTsKKwkJeGxvZ193YWl0KCZsb2ctPmxfZmx1c2hfd2FpdCwgJmxvZy0+bF9pY2xvZ2xvY2spOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCkBAIC0yNTI3LDYgKzI0ODYsMTggQEAKICAqCiAgKiBPbmNlIGEgdGlja2V0IGdldHMgcHV0IG9udG8gdGhlIHJlc2VydmVxLCBpdCB3aWxsIG9ubHkgcmV0dXJuIGFmdGVyCiAgKiB0aGUgbmVlZGVkIHJlc2VydmF0aW9uIGlzIHNhdGlzZmllZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHN0cnVjdHVyZWQgc28gdGhhdCBpdCBoYXMgYSBsb2NrIGZyZWUgZmFzdCBwYXRoLiBUaGlzIGlzCisgKiBuZWNlc3NhcnkgYmVjYXVzZSBldmVyeSBuZXcgdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb24gd2lsbCBjb21lIHRocm91Z2ggdGhpcworICogcGF0aC4gSGVuY2UgYW55IGxvY2sgd2lsbCBiZSBnbG9iYWxseSBob3QgaWYgd2UgdGFrZSBpdCB1bmNvbmRpdGlvbmFsbHkgb24KKyAqIGV2ZXJ5IHBhc3MuCisgKgorICogQXMgdGlja2V0cyBhcmUgb25seSBldmVyIG1vdmVkIG9uIGFuZCBvZmYgdGhlIHJlc2VydmVxIHVuZGVyIHRoZQorICogbF9ncmFudF9yZXNlcnZlX2xvY2ssIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoYXQgbG9jayBpZiB3ZSBhcmUgZ29pbmcKKyAqIHRvIGFkZCB0aGUgdGlja2V0IHRvIHRoZSBxdWV1ZSBhbmQgc2xlZXAuIFdlIGNhbiBhdm9pZCB0YWtpbmcgdGhlIGxvY2sgaWYgdGhlCisgKiB0aWNrZXQgd2FzIG5ldmVyIGFkZGVkIHRvIHRoZSByZXNlcnZlcSBiZWNhdXNlIHRoZSB0X3F1ZXVlIGxpc3QgaGVhZCB3aWxsIGJlCisgKiBlbXB0eSBhbmQgd2UgaG9sZCB0aGUgb25seSByZWZlcmVuY2UgdG8gaXQgc28gaXQgY2FuIHNhZmVseSBiZSBjaGVja2VkCisgKiB1bmxvY2tlZC4KICAqLwogU1RBVElDIGludAogeGxvZ19ncmFudF9sb2dfc3BhY2UoeGxvZ190CSAgICpsb2csCkBAIC0yNTM0LDI0ICsyNTA1LDI3IEBACiB7CiAJaW50CQkgZnJlZV9ieXRlczsKIAlpbnQJCSBuZWVkX2J5dGVzOwotI2lmZGVmIERFQlVHCi0JeGZzX2xzbl90CSB0YWlsX2xzbjsKLSNlbmRpZgotCiAKICNpZmRlZiBERUJVRwogCWlmIChsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkKIAkJcGFuaWMoImdyYW50IFJlY292ZXJ5IHByb2JsZW0iKTsKICNlbmRpZgogCi0JLyogSXMgdGhlcmUgc3BhY2Ugb3IgZG8gd2UgbmVlZCB0byBzbGVlcD8gKi8KLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQogCXRyYWNlX3hmc19sb2dfZ3JhbnRfZW50ZXIobG9nLCB0aWMpOwogCisJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKKwlpZiAodGljLT50X2ZsYWdzICYgWEZTX0xPR19QRVJNX1JFU0VSVikKKwkJbmVlZF9ieXRlcyAqPSB0aWMtPnRfb2NudDsKKwogCS8qIHNvbWV0aGluZyBpcyBhbHJlYWR5IHNsZWVwaW5nOyBpbnNlcnQgbmV3IHRyYW5zYWN0aW9uIGF0IGVuZCAqLwotCWlmIChsb2ctPmxfcmVzZXJ2ZV9oZWFkcSkgewotCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwlpZiAoIWxpc3RfZW1wdHlfY2FyZWZ1bCgmbG9nLT5sX3Jlc2VydmVxKSkgeworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCQkvKiByZWNoZWNrIHRoZSBxdWV1ZSBub3cgd2UgYXJlIGxvY2tlZCAqLworCQlpZiAobGlzdF9lbXB0eSgmbG9nLT5sX3Jlc2VydmVxKSkgeworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCQkJZ290byByZWRvOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnRpYy0+dF9xdWV1ZSwgJmxvZy0+bF9yZXNlcnZlcSk7CiAKIAkJdHJhY2VfeGZzX2xvZ19ncmFudF9zbGVlcDEobG9nLCB0aWMpOwogCkBAIC0yNTYzLDcyICsyNTM3LDU3IEBACiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAogCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKLQkJc3Zfd2FpdCgmdGljLT50X3dhaXQsIFBJTk9EfFBMVFdBSVQsICZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7CisJCXhsb2dfd2FpdCgmdGljLT50X3dhaXQsICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwogCQkvKgogCQkgKiBJZiB3ZSBnb3QgYW4gZXJyb3IsIGFuZCB0aGUgZmlsZXN5c3RlbSBpcyBzaHV0dGluZyBkb3duLAogCQkgKiB3ZSdsbCBjYXRjaCBpdCBkb3duIGJlbG93LiBTbyBqdXN0IGNvbnRpbnVlLi4uCiAJCSAqLwogCQl0cmFjZV94ZnNfbG9nX2dyYW50X3dha2UxKGxvZywgdGljKTsKLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJfQotCWlmICh0aWMtPnRfZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQotCQluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzKnRpYy0+dF9vY250OwotCWVsc2UKLQkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKIAogcmVkbzoKIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gZXJyb3JfcmV0dXJuX3VubG9ja2VkOwogCi0JZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csIGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLAotCQkJCSAgICAgbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMpOworCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCk7CiAJaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7Ci0JCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKLQkJCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmdGljLT50X3F1ZXVlKSkKKwkJCWxpc3RfYWRkX3RhaWwoJnRpYy0+dF9xdWV1ZSwgJmxvZy0+bF9yZXNlcnZlcSk7CiAKIAkJdHJhY2VfeGZzX2xvZ19ncmFudF9zbGVlcDIobG9nLCB0aWMpOwogCi0JCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCBuZWVkX2J5dGVzKTsKLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0KLQkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7Ci0JCXN2X3dhaXQoJnRpYy0+dF93YWl0LCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOwotCi0JCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCi0JCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZTIobG9nLCB0aWMpOworCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywgbmVlZF9ieXRlcyk7CiAKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXhsb2dfd2FpdCgmdGljLT50X3dhaXQsICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKworCQl0cmFjZV94ZnNfbG9nX2dyYW50X3dha2UyKGxvZywgdGljKTsKIAkJZ290byByZWRvOwotCX0gZWxzZSBpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKLQkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKSB7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwl9CiAKIAkvKiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlICovCi0JeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCBuZWVkX2J5dGVzKTsKLSNpZmRlZiBERUJVRwotCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwotCS8qCi0JICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBncmFudCB3cml0ZSBoZWFkIGRpZG4ndCBqdXN0IG92ZXIgbGFwIHRoZQotCSAqIHRhaWwuICBJZiB0aGUgY3ljbGVzIGFyZSB0aGUgc2FtZSwgd2UgY2FuJ3QgYmUgb3ZlcmxhcHBpbmcuCi0JICogT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhhdCB0aGUgY3ljbGVzIGRpZmZlciBieSBleGFjdGx5IG9uZSBhbmQKLQkgKiBjaGVjayB0aGUgYnl0ZSBjb3VudC4KLQkgKi8KLQlpZiAoQ1lDTEVfTFNOKHRhaWxfbHNuKSAhPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUpIHsKLQkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZS0xID09IENZQ0xFX0xTTih0YWlsX2xzbikpOwotCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzIDw9IEJCVE9CKEJMT0NLX0xTTih0YWlsX2xzbikpKTsKLQl9Ci0jZW5kaWYKKwl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLCBuZWVkX2J5dGVzKTsKKwl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgbmVlZF9ieXRlcyk7CiAJdHJhY2VfeGZzX2xvZ19ncmFudF9leGl0KGxvZywgdGljKTsKLQl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF90YWlsKGxvZyk7CiAJcmV0dXJuIDA7CiAKLSBlcnJvcl9yZXR1cm46Ci0JaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCXhsb2dfZGVsX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwotCitlcnJvcl9yZXR1cm5fdW5sb2NrZWQ6CisJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKK2Vycm9yX3JldHVybjoKKwlsaXN0X2RlbF9pbml0KCZ0aWMtPnRfcXVldWUpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKIAl0cmFjZV94ZnNfbG9nX2dyYW50X2Vycm9yKGxvZywgdGljKTsKIAogCS8qCkBAIC0yNjM4LDcgKzI1OTcsNiBAQAogCSAqLwogCXRpYy0+dF9jdXJyX3JlcyA9IDA7CiAJdGljLT50X2NudCA9IDA7IC8qIHVuZ3JhbnQgd2lsbCBnaXZlIGJhY2sgdW5pdF9yZXMgKiB0X2NudC4gKi8KLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIH0JLyogeGxvZ19ncmFudF9sb2dfc3BhY2UgKi8KIApAQCAtMjY0NiwxNyArMjYwNCwxNCBAQAogLyoKICAqIFJlcGxlbmlzaCB0aGUgYnl0ZSByZXNlcnZhdGlvbiByZXF1aXJlZCBieSBtb3ZpbmcgdGhlIGdyYW50IHdyaXRlIGhlYWQuCiAgKgotICoKKyAqIFNpbWlsYXIgdG8geGxvZ19ncmFudF9sb2dfc3BhY2UsIHRoZSBmdW5jdGlvbiBpcyBzdHJ1Y3R1cmVkIHRvIGhhdmUgYSBsb2NrCisgKiBmcmVlIGZhc3QgcGF0aC4KICAqLwogU1RBVElDIGludAogeGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZSh4bG9nX3QJICAgKmxvZywKIAkJCSAgICAgeGxvZ190aWNrZXRfdCAqdGljKQogewogCWludAkJZnJlZV9ieXRlcywgbmVlZF9ieXRlczsKLQl4bG9nX3RpY2tldF90CSpudGljOwotI2lmZGVmIERFQlVHCi0JeGZzX2xzbl90CXRhaWxfbHNuOwotI2VuZGlmCiAKIAl0aWMtPnRfY3Vycl9yZXMgPSB0aWMtPnRfdW5pdF9yZXM7CiAJeGxvZ190aWNfcmVzZXRfcmVzKHRpYyk7CkBAIC0yNjY5LDEyICsyNjI0LDkgQEAKIAkJcGFuaWMoInJlZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOwogI2VuZGlmCiAKLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQogCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9lbnRlcihsb2csIHRpYyk7Ci0KIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gZXJyb3JfcmV0dXJuX3VubG9ja2VkOwogCiAJLyogSWYgdGhlcmUgYXJlIG90aGVyIHdhaXRlcnMgb24gdGhlIHF1ZXVlIHRoZW4gZ2l2ZSB0aGVtIGEKIAkgKiBjaGFuY2UgYXQgbG9nc3BhY2UgYmVmb3JlIHVzLiBXYWtlIHVwIHRoZSBmaXJzdCB3YWl0ZXJzLApAQCAtMjY4Myw5MiArMjYzNSw3NiBAQAogCSAqIHRoaXMgdHJhbnNhY3Rpb24uCiAJICovCiAJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKLQlpZiAoKG50aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7Ci0JCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUsCi0JCQkJCSAgICAgbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKLQkJZG8geworCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfd3JpdGVxKSkgeworCQlzdHJ1Y3QgeGxvZ190aWNrZXQgKm50aWM7CisKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CisJCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50aWMsICZsb2ctPmxfd3JpdGVxLCB0X3F1ZXVlKSB7CiAJCQlBU1NFUlQobnRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKIAogCQkJaWYgKGZyZWVfYnl0ZXMgPCBudGljLT50X3VuaXRfcmVzKQogCQkJCWJyZWFrOwogCQkJZnJlZV9ieXRlcyAtPSBudGljLT50X3VuaXRfcmVzOwotCQkJc3Zfc2lnbmFsKCZudGljLT50X3dhaXQpOwotCQkJbnRpYyA9IG50aWMtPnRfbmV4dDsKLQkJfSB3aGlsZSAobnRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpOworCQkJd2FrZV91cCgmbnRpYy0+dF93YWl0KTsKKwkJfQogCi0JCWlmIChudGljICE9IGxvZy0+bF93cml0ZV9oZWFkcSkgewotCQkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQotCQkJCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKLQorCQlpZiAobnRpYyAhPSBsaXN0X2ZpcnN0X2VudHJ5KCZsb2ctPmxfd3JpdGVxLAorCQkJCQkJc3RydWN0IHhsb2dfdGlja2V0LCB0X3F1ZXVlKSkgeworCQkJaWYgKGxpc3RfZW1wdHkoJnRpYy0+dF9xdWV1ZSkpCisJCQkJbGlzdF9hZGRfdGFpbCgmdGljLT50X3F1ZXVlLCAmbG9nLT5sX3dyaXRlcSk7CiAJCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXAxKGxvZywgdGljKTsKIAotCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQkJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCBuZWVkX2J5dGVzKTsKLQkJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csIG5lZWRfYnl0ZXMpOwogCiAJCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKLQkJCXN2X3dhaXQoJnRpYy0+dF93YWl0LCBQSU5PRHxQTFRXQUlULAotCQkJCSZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7Ci0KLQkJCS8qIElmIHdlJ3JlIHNodXR0aW5nIGRvd24sIHRoaXMgdGljIGlzIGFscmVhZHkKLQkJCSAqIG9mZiB0aGUgcXVldWUgKi8KLQkJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCQkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCi0JCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KKwkJCXhsb2dfd2FpdCgmdGljLT50X3dhaXQsICZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CiAJCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZTEobG9nLCB0aWMpOwotCQl9CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKIAl9CiAKIHJlZG86CiAJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOworCQlnb3RvIGVycm9yX3JldHVybl91bmxvY2tlZDsKIAotCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUsCi0JCQkJICAgICBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOworCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQpOwogCWlmIChmcmVlX2J5dGVzIDwgbmVlZF9ieXRlcykgewotCQlpZiAoKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpID09IDApCi0JCQl4bG9nX2luc190aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7Ci0JCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCBuZWVkX2J5dGVzKTsKLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmdGljLT50X3F1ZXVlKSkKKwkJCWxpc3RfYWRkX3RhaWwoJnRpYy0+dF9xdWV1ZSwgJmxvZy0+bF93cml0ZXEpOwogCi0JCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXAyKGxvZywgdGljKTsKLQotCQlzdl93YWl0KCZ0aWMtPnRfd2FpdCwgUElOT0R8UExUV0FJVCwgJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKLQotCQkvKiBJZiB3ZSdyZSBzaHV0dGluZyBkb3duLCB0aGlzIHRpYyBpcyBhbHJlYWR5IG9mZiB0aGUgcXVldWUgKi8KLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQogCQkJZ290byBlcnJvcl9yZXR1cm47CiAKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csIG5lZWRfYnl0ZXMpOworCisJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOworCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXAyKGxvZywgdGljKTsKKwkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKKwogCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZTIobG9nLCB0aWMpOwogCQlnb3RvIHJlZG87Ci0JfSBlbHNlIGlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQotCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKSB7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZ0aWMtPnRfcXVldWUpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCX0KIAogCS8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KLQl4bG9nX2dyYW50X2FkZF9zcGFjZV93cml0ZShsb2csIG5lZWRfYnl0ZXMpOwotI2lmZGVmIERFQlVHCi0JdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247Ci0JaWYgKENZQ0xFX0xTTih0YWlsX2xzbikgIT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKSB7Ci0JCUFTU0VSVChsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUtMSA9PSBDWUNMRV9MU04odGFpbF9sc24pKTsKLQkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA8PSBCQlRPQihCTE9DS19MU04odGFpbF9sc24pKSk7Ci0JfQotI2VuZGlmCi0KKwl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgbmVlZF9ieXRlcyk7CiAJdHJhY2VfeGZzX2xvZ19yZWdyYW50X3dyaXRlX2V4aXQobG9nLCB0aWMpOwotCi0JeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJeGxvZ192ZXJpZnlfZ3JhbnRfdGFpbChsb2cpOwogCXJldHVybiAwOwogCiAKKyBlcnJvcl9yZXR1cm5fdW5sb2NrZWQ6CisJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CiAgZXJyb3JfcmV0dXJuOgotCWlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQotCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKLQorCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKIAl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZXJyb3IobG9nLCB0aWMpOwogCiAJLyoKQEAgLTI3NzgsNyArMjcxNCw2IEBACiAJICovCiAJdGljLT50X2N1cnJfcmVzID0gMDsKIAl0aWMtPnRfY250ID0gMDsgLyogdW5ncmFudCB3aWxsIGdpdmUgYmFjayB1bml0X3JlcyAqIHRfY250LiAqLwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogfQkvKiB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlICovCiAKQEAgLTI3OTksMjcgKzI3MzQsMjQgQEAKIAlpZiAodGlja2V0LT50X2NudCA+IDApCiAJCXRpY2tldC0+dF9jbnQtLTsKIAotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X2N1cnJfcmVzKTsKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLAorCQkJCQl0aWNrZXQtPnRfY3Vycl9yZXMpOworCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLAorCQkJCQl0aWNrZXQtPnRfY3Vycl9yZXMpOwogCXRpY2tldC0+dF9jdXJyX3JlcyA9IHRpY2tldC0+dF91bml0X3JlczsKIAl4bG9nX3RpY19yZXNldF9yZXModGlja2V0KTsKIAogCXRyYWNlX3hmc19sb2dfcmVncmFudF9yZXNlcnZlX3N1Yihsb2csIHRpY2tldCk7CiAKLQl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7Ci0KIAkvKiBqdXN0IHJldHVybiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgb2YgdGhlIHByZS1yZXNlcnZlZCBzcGFjZSAqLwotCWlmICh0aWNrZXQtPnRfY250ID4gMCkgewotCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCWlmICh0aWNrZXQtPnRfY250ID4gMCkKIAkJcmV0dXJuOwotCX0KIAotCXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3Jlc2VydmUobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMpOworCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsCisJCQkJCXRpY2tldC0+dF91bml0X3Jlcyk7CiAKIAl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfcmVzZXJ2ZV9leGl0KGxvZywgdGlja2V0KTsKIAotCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAwKTsKLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXRpY2tldC0+dF9jdXJyX3JlcyA9IHRpY2tldC0+dF91bml0X3JlczsKIAl4bG9nX3RpY19yZXNldF9yZXModGlja2V0KTsKIH0JLyogeGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlICovCkBAIC0yODQzLDI4ICsyNzc1LDI5IEBACiB4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkgICAgICpsb2csCiAJCSAgICAgICB4bG9nX3RpY2tldF90ICp0aWNrZXQpCiB7CisJaW50CWJ5dGVzOworCiAJaWYgKHRpY2tldC0+dF9jbnQgPiAwKQogCQl0aWNrZXQtPnRfY250LS07CiAKLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAl0cmFjZV94ZnNfbG9nX3VuZ3JhbnRfZW50ZXIobG9nLCB0aWNrZXQpOwotCi0JeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMpOwotCiAJdHJhY2VfeGZzX2xvZ191bmdyYW50X3N1Yihsb2csIHRpY2tldCk7CiAKLQkvKiBJZiB0aGlzIGlzIGEgcGVybWFuZW50IHJlc2VydmF0aW9uIHRpY2tldCwgd2UgbWF5IGJlIGFibGUgdG8gZnJlZQorCS8qCisJICogSWYgdGhpcyBpcyBhIHBlcm1hbmVudCByZXNlcnZhdGlvbiB0aWNrZXQsIHdlIG1heSBiZSBhYmxlIHRvIGZyZWUKIAkgKiB1cCBtb3JlIHNwYWNlIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY291bnQuCiAJICovCisJYnl0ZXMgPSB0aWNrZXQtPnRfY3Vycl9yZXM7CiAJaWYgKHRpY2tldC0+dF9jbnQgPiAwKSB7CiAJCUFTU0VSVCh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVik7Ci0JCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKnRpY2tldC0+dF9jbnQpOworCQlieXRlcyArPSB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudDsKIAl9CiAKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLCBieXRlcyk7CisJeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsIGJ5dGVzKTsKKwogCXRyYWNlX3hmc19sb2dfdW5ncmFudF9leGl0KGxvZywgdGlja2V0KTsKIAotCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXhmc19sb2dfbW92ZV90YWlsKGxvZy0+bF9tcCwgMSk7CiB9CS8qIHhsb2dfdW5ncmFudF9sb2dfc3BhY2UgKi8KIApAQCAtMjkwMSwxMSArMjgzNCwxMSBAQAogCiAJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1dBTlRfU1lOQykgewogCQkvKiB1cGRhdGUgdGFpbCBiZWZvcmUgd3JpdGluZyB0byBpY2xvZyAqLwotCQl4bG9nX2Fzc2lnbl90YWlsX2xzbihsb2ctPmxfbXApOworCQl4ZnNfbHNuX3QgdGFpbF9sc24gPSB4bG9nX2Fzc2lnbl90YWlsX2xzbihsb2ctPmxfbXApOwogCQlzeW5jKys7CiAJCWljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfU1lOQ0lORzsKLQkJaWNsb2ctPmljX2hlYWRlci5oX3RhaWxfbHNuID0gY3B1X3RvX2JlNjQobG9nLT5sX3RhaWxfbHNuKTsKLQkJeGxvZ192ZXJpZnlfdGFpbF9sc24obG9nLCBpY2xvZywgbG9nLT5sX3RhaWxfbHNuKTsKKwkJaWNsb2ctPmljX2hlYWRlci5oX3RhaWxfbHNuID0gY3B1X3RvX2JlNjQodGFpbF9sc24pOworCQl4bG9nX3ZlcmlmeV90YWlsX2xzbihsb2csIGljbG9nLCB0YWlsX2xzbik7CiAJCS8qIGN5Y2xlIGluY3JlbWVudGVkIHdoZW4gaW5jcmVtZW50aW5nIGN1cnJfYmxvY2sgKi8KIAl9CiAJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwpAQCAtMzA4OCw3ICszMDIxLDcgQEAKIAkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAkJfQogCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7Ci0JCXN2X3dhaXQoJmljbG9nLT5pY19mb3JjZV93YWl0LCBQSU5PRCwgJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQl4bG9nX3dhaXQoJmljbG9nLT5pY19mb3JjZV93YWl0LCAmbG9nLT5sX2ljbG9nbG9jayk7CiAJCS8qCiAJCSAqIE5vIG5lZWQgdG8gZ3JhYiB0aGUgbG9nIGxvY2sgaGVyZSBzaW5jZSB3ZSdyZQogCQkgKiBvbmx5IGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiBFSU8KQEAgLTMyMDYsOCArMzEzOSw4IEBACiAKIAkJCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7CiAKLQkJCQlzdl93YWl0KCZpY2xvZy0+aWNfcHJldi0+aWNfd3JpdGVfd2FpdCwKLQkJCQkJUFNXUCwgJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkJCXhsb2dfd2FpdCgmaWNsb2ctPmljX3ByZXYtPmljX3dyaXRlX3dhaXQsCisJCQkJCQkJJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJCWlmIChsb2dfZmx1c2hlZCkKIAkJCQkJKmxvZ19mbHVzaGVkID0gMTsKIAkJCQlhbHJlYWR5X3NsZXB0ID0gMTsKQEAgLTMyMzUsNyArMzE2OCw3IEBACiAJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCQkJfQogCQkJWEZTX1NUQVRTX0lOQyh4c19sb2dfZm9yY2Vfc2xlZXApOwotCQkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsIFBTV1AsICZsb2ctPmxfaWNsb2dsb2NrLCBzKTsKKwkJCXhsb2dfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsICZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJCS8qCiAJCQkgKiBObyBuZWVkIHRvIGdyYWIgdGhlIGxvZyBsb2NrIGhlcmUgc2luY2Ugd2UncmUKIAkJCSAqIG9ubHkgZGVjaWRpbmcgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIEVJTwpAQCAtMzMxMCwxMCArMzI0Myw4IEBACiAJeGxvZ190aWNrZXRfdAkqdGlja2V0KQogewogCUFTU0VSVChhdG9taWNfcmVhZCgmdGlja2V0LT50X3JlZikgPiAwKTsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdGlja2V0LT50X3JlZikpIHsKLQkJc3ZfZGVzdHJveSgmdGlja2V0LT50X3dhaXQpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0aWNrZXQtPnRfcmVmKSkKIAkJa21lbV96b25lX2ZyZWUoeGZzX2xvZ190aWNrZXRfem9uZSwgdGlja2V0KTsKLQl9CiB9CiAKIHhsb2dfdGlja2V0X3QgKgpAQCAtMzQzNSw2ICszMzY2LDcgQEAKICAgICAgICAgfQogCiAJYXRvbWljX3NldCgmdGljLT50X3JlZiwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJnRpYy0+dF9xdWV1ZSk7CiAJdGljLT50X3VuaXRfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2N1cnJfcmVzCQk9IHVuaXRfYnl0ZXM7CiAJdGljLT50X2NudAkJPSBjbnQ7CkBAIC0zNDQ1LDcgKzMzNzcsNyBAQAogCXRpYy0+dF90cmFuc190eXBlCT0gMDsKIAlpZiAoeGZsYWdzICYgWEZTX0xPR19QRVJNX1JFU0VSVikKIAkJdGljLT50X2ZsYWdzIHw9IFhMT0dfVElDX1BFUk1fUkVTRVJWOwotCXN2X2luaXQoJnRpYy0+dF93YWl0LCBTVl9ERUZBVUxULCAibG9ndGljayIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRpYy0+dF93YWl0KTsKIAogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWMpOwogCkBAIC0zNDg0LDE4ICszNDE2LDI1IEBACiB9CiAKIFNUQVRJQyB2b2lkCi14bG9nX3ZlcmlmeV9ncmFudF9oZWFkKHhsb2dfdCAqbG9nLCBpbnQgZXF1YWxzKQoreGxvZ192ZXJpZnlfZ3JhbnRfdGFpbCgKKwlzdHJ1Y3QgbG9nCSpsb2cpCiB7Ci0gICAgaWYgKGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID09IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgewotCWlmIChlcXVhbHMpCi0JICAgIEFTU0VSVChsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA+PSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOwotCWVsc2UKLQkgICAgQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID4gbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKLSAgICB9IGVsc2UgewotCUFTU0VSVChsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0xID09IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSk7Ci0JQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA+PSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7Ci0gICAgfQotfQkvKiB4bG9nX3ZlcmlmeV9ncmFudF9oZWFkICovCisJaW50CQl0YWlsX2N5Y2xlLCB0YWlsX2Jsb2NrczsKKwlpbnQJCWN5Y2xlLCBzcGFjZTsKKworCS8qCisJICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBncmFudCB3cml0ZSBoZWFkIGRpZG4ndCBqdXN0IG92ZXIgbGFwIHRoZQorCSAqIHRhaWwuICBJZiB0aGUgY3ljbGVzIGFyZSB0aGUgc2FtZSwgd2UgY2FuJ3QgYmUgb3ZlcmxhcHBpbmcuCisJICogT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhhdCB0aGUgY3ljbGVzIGRpZmZlciBieSBleGFjdGx5IG9uZSBhbmQKKwkgKiBjaGVjayB0aGUgYnl0ZSBjb3VudC4KKwkgKi8KKwl4bG9nX2NyYWNrX2dyYW50X2hlYWQoJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCAmY3ljbGUsICZzcGFjZSk7CisJeGxvZ19jcmFja19hdG9taWNfbHNuKCZsb2ctPmxfdGFpbF9sc24sICZ0YWlsX2N5Y2xlLCAmdGFpbF9ibG9ja3MpOworCWlmICh0YWlsX2N5Y2xlICE9IGN5Y2xlKSB7CisJCUFTU0VSVChjeWNsZSAtIDEgPT0gdGFpbF9jeWNsZSk7CisJCUFTU0VSVChzcGFjZSA8PSBCQlRPQih0YWlsX2Jsb2NrcykpOworCX0KK30KIAogLyogY2hlY2sgaWYgaXQgd2lsbCBmaXQgKi8KIFNUQVRJQyB2b2lkCkBAIC0zNzE2LDEyICszNjU1LDEwIEBACiAJCXhsb2dfY2lsX2ZvcmNlKGxvZyk7CiAKIAkvKgotCSAqIFdlIG11c3QgaG9sZCBib3RoIHRoZSBHUkFOVCBsb2NrIGFuZCB0aGUgTE9HIGxvY2ssCi0JICogYmVmb3JlIHdlIG1hcmsgdGhlIGZpbGVzeXN0ZW0gU0hVVERPV04gYW5kIHdha2UKLQkgKiBldmVyeWJvZHkgdXAgdG8gdGVsbCB0aGUgYmFkIG5ld3MuCisJICogbWFyayB0aGUgZmlsZXN5c3RlbSBhbmQgdGhlIGFzIGluIGEgc2h1dGRvd24gc3RhdGUgYW5kIHdha2UKKwkgKiBldmVyeWJvZHkgdXAgdG8gdGVsbCB0aGVtIHRoZSBiYWQgbmV3cy4KIAkgKi8KIAlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9GU19TSFVURE9XTjsKIAlpZiAobXAtPm1fc2JfYnApCiAJCVhGU19CVUZfRE9ORShtcC0+bV9zYl9icCk7CkBAIC0zNzQyLDI3ICszNjc5LDIxIEBACiAJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJLyoKLQkgKiBXZSBkb24ndCB3YW50IGFueWJvZHkgd2FpdGluZyBmb3IgbG9nIHJlc2VydmF0aW9ucwotCSAqIGFmdGVyIHRoaXMuIFRoYXQgbWVhbnMgd2UgaGF2ZSB0byB3YWtlIHVwIGV2ZXJ5Ym9keQotCSAqIHF1ZXVlZCB1cCBvbiByZXNlcnZlX2hlYWRxIGFzIHdlbGwgYXMgd3JpdGVfaGVhZHEuCi0JICogSW4gYWRkaXRpb24sIHdlIG1ha2Ugc3VyZSBpbiB4bG9nX3tyZX1ncmFudF9sb2dfc3BhY2UKLQkgKiB0aGF0IHdlIGRvbid0IGVucXVldWUgYW55dGhpbmcgb25jZSB0aGUgU0hVVERPV04gZmxhZwotCSAqIGlzIHNldCwgYW5kIHRoaXMgYWN0aW9uIGlzIHByb3RlY3RlZCBieSB0aGUgR1JBTlRMT0NLLgorCSAqIFdlIGRvbid0IHdhbnQgYW55Ym9keSB3YWl0aW5nIGZvciBsb2cgcmVzZXJ2YXRpb25zIGFmdGVyIHRoaXMuIFRoYXQKKwkgKiBtZWFucyB3ZSBoYXZlIHRvIHdha2UgdXAgZXZlcnlib2R5IHF1ZXVlZCB1cCBvbiByZXNlcnZlcSBhcyB3ZWxsIGFzCisJICogd3JpdGVxLiAgSW4gYWRkaXRpb24sIHdlIG1ha2Ugc3VyZSBpbiB4bG9nX3tyZX1ncmFudF9sb2dfc3BhY2UgdGhhdAorCSAqIHdlIGRvbid0IGVucXVldWUgYW55dGhpbmcgb25jZSB0aGUgU0hVVERPV04gZmxhZyBpcyBzZXQsIGFuZCB0aGlzCisJICogYWN0aW9uIGlzIHByb3RlY3RlZCBieSB0aGUgZ3JhbnQgbG9ja3MuCiAJICovCi0JaWYgKCh0aWMgPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSkpIHsKLQkJZG8gewotCQkJc3Zfc2lnbmFsKCZ0aWMtPnRfd2FpdCk7Ci0JCQl0aWMgPSB0aWMtPnRfbmV4dDsKLQkJfSB3aGlsZSAodGljICE9IGxvZy0+bF9yZXNlcnZlX2hlYWRxKTsKLQl9CisJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpYywgJmxvZy0+bF9yZXNlcnZlcSwgdF9xdWV1ZSkKKwkJd2FrZV91cCgmdGljLT50X3dhaXQpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKIAotCWlmICgodGljID0gbG9nLT5sX3dyaXRlX2hlYWRxKSkgewotCQlkbyB7Ci0JCQlzdl9zaWduYWwoJnRpYy0+dF93YWl0KTsKLQkJCXRpYyA9IHRpYy0+dF9uZXh0OwotCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpYywgJmxvZy0+bF93cml0ZXEsIHRfcXVldWUpCisJCXdha2VfdXAoJnRpYy0+dF93YWl0KTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwogCiAJaWYgKCEobG9nLT5sX2ljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikpIHsKIAkJQVNTRVJUKCFsb2dlcnJvcik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCmluZGV4IDIzZDZjZWIuLjlkYzgxMjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MSw3ICs2MSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmNpbC0+eGNfY29tbWl0dGluZyk7CiAJc3Bpbl9sb2NrX2luaXQoJmNpbC0+eGNfY2lsX2xvY2spOwogCWluaXRfcndzZW0oJmNpbC0+eGNfY3R4X2xvY2spOwotCXN2X2luaXQoJmNpbC0+eGNfY29tbWl0X3dhaXQsIFNWX0RFRkFVTFQsICJjaWx3YWl0Iik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2lsLT54Y19jb21taXRfd2FpdCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmY3R4LT5jb21taXR0aW5nKTsKIAlJTklUX0xJU1RfSEVBRCgmY3R4LT5idXN5X2V4dGVudHMpOwpAQCAtMzYxLDE1ICszNjEsMTAgQEAKIAlpbnQJYWJvcnQpCiB7CiAJc3RydWN0IHhmc19jaWxfY3R4CSpjdHggPSBhcmdzOwotCXN0cnVjdCB4ZnNfbG9nX3ZlYwkqbHY7Ci0JaW50CQkJYWJvcnRmbGFnID0gYWJvcnQgPyBYRlNfTElfQUJPUlRFRCA6IDA7CiAJc3RydWN0IHhmc19idXN5X2V4dGVudAkqYnVzeXAsICpuOwogCi0JLyogdW5waW4gYWxsIHRoZSBsb2cgaXRlbXMgKi8KLQlmb3IgKGx2ID0gY3R4LT5sdl9jaGFpbjsgbHY7IGx2ID0gbHYtPmx2X25leHQgKSB7Ci0JCXhmc190cmFuc19pdGVtX2NvbW1pdHRlZChsdi0+bHZfaXRlbSwgY3R4LT5zdGFydF9sc24sCi0JCQkJCQkJYWJvcnRmbGFnKTsKLQl9CisJeGZzX3RyYW5zX2NvbW1pdHRlZF9idWxrKGN0eC0+Y2lsLT54Y19sb2ctPmxfYWlscCwgY3R4LT5sdl9jaGFpbiwKKwkJCQkJY3R4LT5zdGFydF9sc24sIGFib3J0KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidXN5cCwgbiwgJmN0eC0+YnVzeV9leHRlbnRzLCBsaXN0KQogCQl4ZnNfYWxsb2NfYnVzeV9jbGVhcihjdHgtPmNpbC0+eGNfbG9nLT5sX21wLCBidXN5cCk7CkBAIC01NjgsNyArNTYzLDcgQEAKIAkJCSAqIEl0IGlzIHN0aWxsIGJlaW5nIHB1c2hlZCEgV2FpdCBmb3IgdGhlIHB1c2ggdG8KIAkJCSAqIGNvbXBsZXRlLCB0aGVuIHN0YXJ0IGFnYWluIGZyb20gdGhlIGJlZ2lubmluZy4KIAkJCSAqLwotCQkJc3Zfd2FpdCgmY2lsLT54Y19jb21taXRfd2FpdCwgMCwgJmNpbC0+eGNfY2lsX2xvY2ssIDApOworCQkJeGxvZ193YWl0KCZjaWwtPnhjX2NvbW1pdF93YWl0LCAmY2lsLT54Y19jaWxfbG9jayk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAl9CkBAIC01OTIsNyArNTg3LDcgQEAKIAkgKi8KIAlzcGluX2xvY2soJmNpbC0+eGNfY2lsX2xvY2spOwogCWN0eC0+Y29tbWl0X2xzbiA9IGNvbW1pdF9sc247Ci0Jc3ZfYnJvYWRjYXN0KCZjaWwtPnhjX2NvbW1pdF93YWl0KTsKKwl3YWtlX3VwX2FsbCgmY2lsLT54Y19jb21taXRfd2FpdCk7CiAJc3Bpbl91bmxvY2soJmNpbC0+eGNfY2lsX2xvY2spOwogCiAJLyogcmVsZWFzZSB0aGUgaG91bmRzISAqLwpAQCAtNzU3LDcgKzc1Miw3IEBACiAJCQkgKiBJdCBpcyBzdGlsbCBiZWluZyBwdXNoZWQhIFdhaXQgZm9yIHRoZSBwdXNoIHRvCiAJCQkgKiBjb21wbGV0ZSwgdGhlbiBzdGFydCBhZ2FpbiBmcm9tIHRoZSBiZWdpbm5pbmcuCiAJCQkgKi8KLQkJCXN2X3dhaXQoJmNpbC0+eGNfY29tbWl0X3dhaXQsIDAsICZjaWwtPnhjX2NpbF9sb2NrLCAwKTsKKwkJCXhsb2dfd2FpdCgmY2lsLT54Y19jb21taXRfd2FpdCwgJmNpbC0+eGNfY2lsX2xvY2spOwogCQkJZ290byByZXN0YXJ0OwogCQl9CiAJCWlmIChjdHgtPnNlcXVlbmNlICE9IHNlcXVlbmNlKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCmluZGV4IGVkY2RmZTAuLmQ1ZjhiZTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTIxLDcgKzIxLDYgQEAKIHN0cnVjdCB4ZnNfYnVmOwogc3RydWN0IGxvZzsKIHN0cnVjdCB4bG9nX3RpY2tldDsKLXN0cnVjdCB4ZnNfYnVmX2NhbmNlbDsKIHN0cnVjdCB4ZnNfbW91bnQ7CiAKIC8qCkBAIC01NCw3ICs1Myw2IEBACiAJQlRPQkIoWExPR19NQVhfSUNMT0dTIDw8ICh4ZnNfc2JfdmVyc2lvbl9oYXNsb2d2MigmbG9nLT5sX21wLT5tX3NiKSA/IFwKIAkgWExPR19NQVhfUkVDT1JEX0JTSElGVCA6IFhMT0dfQklHX1JFQ09SRF9CU0hJRlQpKQogCi0KIHN0YXRpYyBpbmxpbmUgeGZzX2xzbl90IHhsb2dfYXNzaWduX2xzbih1aW50IGN5Y2xlLCB1aW50IGJsb2NrKQogewogCXJldHVybiAoKHhmc19sc25fdCljeWNsZSA8PCAzMikgfCBibG9jazsKQEAgLTEzMywxMiArMTMxLDEwIEBACiAgKi8KICNkZWZpbmUgWExPR19USUNfSU5JVEVECQkweDEJLyogaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KICNkZWZpbmUgWExPR19USUNfUEVSTV9SRVNFUlYJMHgyCS8qIHBlcm1hbmVudCByZXNlcnZhdGlvbiAqLwotI2RlZmluZSBYTE9HX1RJQ19JTl9RCQkweDQKIAogI2RlZmluZSBYTE9HX1RJQ19GTEFHUyBcCiAJeyBYTE9HX1RJQ19JTklURUQsCSJYTE9HX1RJQ19JTklURUQiIH0sIFwKLQl7IFhMT0dfVElDX1BFUk1fUkVTRVJWLAkiWExPR19USUNfUEVSTV9SRVNFUlYiIH0sIFwKLQl7IFhMT0dfVElDX0lOX1EsCSJYTE9HX1RJQ19JTl9RIiB9CisJeyBYTE9HX1RJQ19QRVJNX1JFU0VSViwJIlhMT0dfVElDX1BFUk1fUkVTRVJWIiB9CiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKQEAgLTI0NCw5ICsyNDAsOCBAQAogfSB4bG9nX3Jlc190OwogCiB0eXBlZGVmIHN0cnVjdCB4bG9nX3RpY2tldCB7Ci0Jc3ZfdAkJICAgdF93YWl0OwkgLyogdGlja2V0IHdhaXQgcXVldWUgICAgICAgICAgICA6IDIwICovCi0Jc3RydWN0IHhsb2dfdGlja2V0ICp0X25leHQ7CSAvKgkJCSAgICAgICAgIDo0fDggKi8KLQlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfcHJldjsJIC8qCQkJCSA6NHw4ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgIHRfd2FpdDsJIC8qIHRpY2tldCB3YWl0IHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCAgIHRfcXVldWU7CSAvKiByZXNlcnZlL3dyaXRlIHF1ZXVlICovCiAJeGxvZ190aWRfdAkgICB0X3RpZDsJIC8qIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIJIDogNCAgKi8KIAlhdG9taWNfdAkgICB0X3JlZjsJIC8qIHRpY2tldCByZWZlcmVuY2UgY291bnQgICAgICAgOiA0ICAqLwogCWludAkJICAgdF9jdXJyX3JlczsJIC8qIGN1cnJlbnQgcmVzZXJ2YXRpb24gaW4gYnl0ZXMgOiA0ICAqLwpAQCAtMzUzLDggKzM0OCw4IEBACiAgKiBhbmQgbW92ZSBldmVyeXRoaW5nIGVsc2Ugb3V0IHRvIHN1YnNlcXVlbnQgY2FjaGVsaW5lcy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgeGxvZ19pbl9jb3JlIHsKLQlzdl90CQkJaWNfZm9yY2Vfd2FpdDsKLQlzdl90CQkJaWNfd3JpdGVfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlpY19mb3JjZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CWljX3dyaXRlX3dhaXQ7CiAJc3RydWN0IHhsb2dfaW5fY29yZQkqaWNfbmV4dDsKIAlzdHJ1Y3QgeGxvZ19pbl9jb3JlCSppY19wcmV2OwogCXN0cnVjdCB4ZnNfYnVmCQkqaWNfYnA7CkBAIC00MjEsNyArNDE2LDcgQEAKIAlzdHJ1Y3QgeGZzX2NpbF9jdHgJKnhjX2N0eDsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXhjX2N0eF9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJeGNfY29tbWl0dGluZzsKLQlzdl90CQkJeGNfY29tbWl0X3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJeGNfY29tbWl0X3dhaXQ7CiAJeGZzX2xzbl90CQl4Y19jdXJyZW50X3NlcXVlbmNlOwogfTsKIApAQCAtNDkxLDcgKzQ4Niw3IEBACiAJc3RydWN0IHhmc19idWZ0YXJnCSpsX3Rhcmc7ICAgICAgICAvKiBidWZ0YXJnIG9mIGxvZyAqLwogCXVpbnQJCQlsX2ZsYWdzOwogCXVpbnQJCQlsX3F1b3Rhb2Zmc19mbGFnOyAvKiBYRlNfRFFfKiwgZm9yIFFVT1RBT0ZGcyAqLwotCXN0cnVjdCB4ZnNfYnVmX2NhbmNlbAkqKmxfYnVmX2NhbmNlbF90YWJsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpsX2J1Zl9jYW5jZWxfdGFibGU7CiAJaW50CQkJbF9pY2xvZ19oc2l6ZTsgIC8qIHNpemUgb2YgaWNsb2cgaGVhZGVyICovCiAJaW50CQkJbF9pY2xvZ19oZWFkczsgIC8qICMgb2YgaWNsb2cgaGVhZGVyIHNlY3RvcnMgKi8KIAl1aW50CQkJbF9zZWN0QkJzaXplOyAgIC8qIHNlY3RvciBzaXplIGluIEJCcyAoMl5uKSAqLwpAQCAtNTAzLDI5ICs0OTgsNDAgQEAKIAlpbnQJCQlsX2xvZ0JCc2l6ZTsgICAgLyogc2l6ZSBvZiBsb2cgaW4gQkIgY2h1bmtzICovCiAKIAkvKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGZpZWxkcyBhcmUgY2hhbmdlZCB3aGlsZSBob2xkaW5nIGljbG9nbG9jayAqLwotCXN2X3QJCQlsX2ZsdXNoX3dhaXQgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlsX2ZsdXNoX3dhaXQgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAkJCQkJCS8qIHdhaXRpbmcgZm9yIGljbG9nIGZsdXNoICovCiAJaW50CQkJbF9jb3ZlcmVkX3N0YXRlOy8qIHN0YXRlIG9mICJjb3ZlcmluZyBkaXNrCiAJCQkJCQkgKiBsb2cgZW50cmllcyIgKi8KIAl4bG9nX2luX2NvcmVfdAkJKmxfaWNsb2c7ICAgICAgIC8qIGhlYWQgbG9nIHF1ZXVlCSovCiAJc3BpbmxvY2tfdAkJbF9pY2xvZ2xvY2s7ICAgIC8qIGdyYWIgdG8gY2hhbmdlIGljbG9nIHN0YXRlICovCi0JeGZzX2xzbl90CQlsX3RhaWxfbHNuOyAgICAgLyogbHNuIG9mIDFzdCBMUiB3aXRoIHVuZmx1c2hlZAotCQkJCQkJICogYnVmZmVycyAqLwotCXhmc19sc25fdAkJbF9sYXN0X3N5bmNfbHNuOy8qIGxzbiBvZiBsYXN0IExSIG9uIGRpc2sgKi8KIAlpbnQJCQlsX2N1cnJfY3ljbGU7ICAgLyogQ3ljbGUgbnVtYmVyIG9mIGxvZyB3cml0ZXMgKi8KIAlpbnQJCQlsX3ByZXZfY3ljbGU7ICAgLyogQ3ljbGUgbnVtYmVyIGJlZm9yZSBsYXN0CiAJCQkJCQkgKiBibG9jayBpbmNyZW1lbnQgKi8KIAlpbnQJCQlsX2N1cnJfYmxvY2s7ICAgLyogY3VycmVudCBsb2dpY2FsIGxvZyBibG9jayAqLwogCWludAkJCWxfcHJldl9ibG9jazsgICAvKiBwcmV2aW91cyBsb2dpY2FsIGxvZyBibG9jayAqLwogCi0JLyogVGhlIGZvbGxvd2luZyBibG9jayBvZiBmaWVsZHMgYXJlIGNoYW5nZWQgd2hpbGUgaG9sZGluZyBncmFudF9sb2NrICovCi0Jc3BpbmxvY2tfdAkJbF9ncmFudF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci0JeGxvZ190aWNrZXRfdAkJKmxfcmVzZXJ2ZV9oZWFkcTsKLQl4bG9nX3RpY2tldF90CQkqbF93cml0ZV9oZWFkcTsKLQlpbnQJCQlsX2dyYW50X3Jlc2VydmVfY3ljbGU7Ci0JaW50CQkJbF9ncmFudF9yZXNlcnZlX2J5dGVzOwotCWludAkJCWxfZ3JhbnRfd3JpdGVfY3ljbGU7Ci0JaW50CQkJbF9ncmFudF93cml0ZV9ieXRlczsKKwkvKgorCSAqIGxfbGFzdF9zeW5jX2xzbiBhbmQgbF90YWlsX2xzbiBhcmUgYXRvbWljcyBzbyB0aGV5IGNhbiBiZSBzZXQgYW5kCisJICogcmVhZCB3aXRob3V0IG5lZWRpbmcgdG8gaG9sZCBzcGVjaWZpYyBsb2Nrcy4gVG8gYXZvaWQgb3BlcmF0aW9ucworCSAqIGNvbnRlbmRpbmcgd2l0aCBvdGhlciBob3Qgb2JqZWN0cywgcGxhY2UgZWFjaCBvZiB0aGVtIG9uIGEgc2VwYXJhdGUKKwkgKiBjYWNoZWxpbmUuCisJICovCisJLyogbHNuIG9mIGxhc3QgTFIgb24gZGlzayAqLworCWF0b21pYzY0X3QJCWxfbGFzdF9zeW5jX2xzbiBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCS8qIGxzbiBvZiAxc3QgTFIgd2l0aCB1bmZsdXNoZWQgKiBidWZmZXJzICovCisJYXRvbWljNjRfdAkJbF90YWlsX2xzbiBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCisJLyoKKwkgKiB0aWNrZXQgZ3JhbnQgbG9ja3MsIHF1ZXVlcyBhbmQgYWNjb3VudGluZyBoYXZlIHRoZWlyIG93biBjYWNobGluZXMKKwkgKiBhcyB0aGVzZSBhcmUgcXVpdGUgaG90IGFuZCBjYW4gYmUgb3BlcmF0ZWQgb24gY29uY3VycmVudGx5LgorCSAqLworCXNwaW5sb2NrX3QJCWxfZ3JhbnRfcmVzZXJ2ZV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3RydWN0IGxpc3RfaGVhZAlsX3Jlc2VydmVxOworCWF0b21pYzY0X3QJCWxfZ3JhbnRfcmVzZXJ2ZV9oZWFkOworCisJc3BpbmxvY2tfdAkJbF9ncmFudF93cml0ZV9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJc3RydWN0IGxpc3RfaGVhZAlsX3dyaXRlcTsKKwlhdG9taWM2NF90CQlsX2dyYW50X3dyaXRlX2hlYWQ7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGZpZWxkIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmc7IG5lZWQgdG8gaG9sZCBpY2xvZ2xvY2sgKi8KICNpZmRlZiBERUJVRwpAQCAtNTM0LDYgKzU0MCw5IEBACiAKIH0geGxvZ190OwogCisjZGVmaW5lIFhMT0dfQlVGX0NBTkNFTF9CVUNLRVQobG9nLCBibGtubykgXAorCSgobG9nKS0+bF9idWZfY2FuY2VsX3RhYmxlICsgKChfX3VpbnQ2NF90KWJsa25vICUgWExPR19CQ19UQUJMRV9TSVpFKSkKKwogI2RlZmluZSBYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpCSgobG9nKS0+bF9mbGFncyAmIFhMT0dfSU9fRVJST1IpCiAKIC8qIGNvbW1vbiByb3V0aW5lcyAqLwpAQCAtNTYyLDYgKzU3MSw2MSBAQAogCQkJCXhsb2dfaW5fY29yZV90ICoqY29tbWl0X2ljbG9nLCB1aW50IGZsYWdzKTsKIAogLyoKKyAqIFdoZW4gd2UgY3JhY2sgYW4gYXRvbWljIExTTiwgd2Ugc2FtcGxlIGl0IGZpcnN0IHNvIHRoYXQgdGhlIHZhbHVlIHdpbGwgbm90CisgKiBjaGFuZ2Ugd2hpbGUgd2UgYXJlIGNyYWNraW5nIGl0IGludG8gdGhlIGNvbXBvbmVudCB2YWx1ZXMuIFRoaXMgbWVhbnMgd2UKKyAqIHdpbGwgYWx3YXlzIGdldCBjb25zaXN0ZW50IGNvbXBvbmVudCB2YWx1ZXMgdG8gd29yayBmcm9tLiBUaGlzIHNob3VsZCBhbHdheXMKKyAqIGJlIHVzZWQgdG8gc21hcGxlIGFuZCBjcmFjayBMU05zIHRhaHQgYXJlIHN0b3JlZCBhbmQgdXBkYXRlZCBpbiBhdG9taWMKKyAqIHZhcmlhYmxlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2NyYWNrX2F0b21pY19sc24oYXRvbWljNjRfdCAqbHNuLCB1aW50ICpjeWNsZSwgdWludCAqYmxvY2spCit7CisJeGZzX2xzbl90IHZhbCA9IGF0b21pYzY0X3JlYWQobHNuKTsKKworCSpjeWNsZSA9IENZQ0xFX0xTTih2YWwpOworCSpibG9jayA9IEJMT0NLX0xTTih2YWwpOworfQorCisvKgorICogQ2FsY3VsYXRlIGFuZCBhc3NpZ24gYSB2YWx1ZSB0byBhbiBhdG9taWMgTFNOIHZhcmlhYmxlIGZyb20gY29tcG9uZW50IHBpZWNlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2Fzc2lnbl9hdG9taWNfbHNuKGF0b21pYzY0X3QgKmxzbiwgdWludCBjeWNsZSwgdWludCBibG9jaykKK3sKKwlhdG9taWM2NF9zZXQobHNuLCB4bG9nX2Fzc2lnbl9sc24oY3ljbGUsIGJsb2NrKSk7Cit9CisKKy8qCisgKiBXaGVuIHdlIGNyYWNrIHRoZSBncmFudCBoZWFkLCB3ZSBzYW1wbGUgaXQgZmlyc3Qgc28gdGhhdCB0aGUgdmFsdWUgd2lsbCBub3QKKyAqIGNoYW5nZSB3aGlsZSB3ZSBhcmUgY3JhY2tpbmcgaXQgaW50byB0aGUgY29tcG9uZW50IHZhbHVlcy4gVGhpcyBtZWFucyB3ZQorICogd2lsbCBhbHdheXMgZ2V0IGNvbnNpc3RlbnQgY29tcG9uZW50IHZhbHVlcyB0byB3b3JrIGZyb20uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoreGxvZ19jcmFja19ncmFudF9oZWFkX3ZhbChpbnQ2NF90IHZhbCwgaW50ICpjeWNsZSwgaW50ICpzcGFjZSkKK3sKKwkqY3ljbGUgPSB2YWwgPj4gMzI7CisJKnNwYWNlID0gdmFsICYgMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2NyYWNrX2dyYW50X2hlYWQoYXRvbWljNjRfdCAqaGVhZCwgaW50ICpjeWNsZSwgaW50ICpzcGFjZSkKK3sKKwl4bG9nX2NyYWNrX2dyYW50X2hlYWRfdmFsKGF0b21pYzY0X3JlYWQoaGVhZCksIGN5Y2xlLCBzcGFjZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdAoreGxvZ19hc3NpZ25fZ3JhbnRfaGVhZF92YWwoaW50IGN5Y2xlLCBpbnQgc3BhY2UpCit7CisJcmV0dXJuICgoaW50NjRfdCljeWNsZSA8PCAzMikgfCBzcGFjZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2Fzc2lnbl9ncmFudF9oZWFkKGF0b21pYzY0X3QgKmhlYWQsIGludCBjeWNsZSwgaW50IHNwYWNlKQoreworCWF0b21pYzY0X3NldChoZWFkLCB4bG9nX2Fzc2lnbl9ncmFudF9oZWFkX3ZhbChjeWNsZSwgc3BhY2UpKTsKK30KKworLyoKICAqIENvbW1pdHRlZCBJdGVtIExpc3QgaW50ZXJmYWNlcwogICovCiBpbnQJeGxvZ19jaWxfaW5pdChzdHJ1Y3QgbG9nICpsb2cpOwpAQCAtNTg1LDYgKzY0OSwyMSBAQAogICovCiAjZGVmaW5lIFhMT0dfVU5NT1VOVF9SRUNfVFlQRQkoLTFVKQogCisvKgorICogV3JhcHBlciBmdW5jdGlvbiBmb3Igd2FpdGluZyBvbiBhIHdhaXQgcXVldWUgc2VyaWFsaXNlZCBhZ2FpbnN0IHdha2V1cHMKKyAqIGJ5IGEgc3BpbmxvY2suIFRoaXMgbWF0Y2hlcyB0aGUgc2VtYW50aWNzIG9mIGFsbCB0aGUgd2FpdCBxdWV1ZXMgdXNlZCBpbiB0aGUKKyAqIGxvZyBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgeGxvZ193YWl0KHdhaXRfcXVldWVfaGVhZF90ICp3cSwgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSh3cSwgJndhaXQpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNwaW5fdW5sb2NrKGxvY2spOworCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUod3EsICZ3YWl0KTsKK30KICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfX1hGU19MT0dfUFJJVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCA5NjZkM2Y5Li4yMDRkOGU1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC01Myw2ICs1MywxNyBAQAogI2VuZGlmCiAKIC8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyByZWNvdmVyeSB0byByZWNvcmQgdGhlIGJ1ZiBsb2cgaXRlbXMgd2hpY2gKKyAqIGhhdmUgYmVlbiBjYW5jZWxlZCBhbmQgc2hvdWxkIG5vdCBiZSByZXBsYXllZC4KKyAqLworc3RydWN0IHhmc19idWZfY2FuY2VsIHsKKwl4ZnNfZGFkZHJfdAkJYmNfYmxrbm87CisJdWludAkJCWJjX2xlbjsKKwlpbnQJCQliY19yZWZjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJjX2xpc3Q7Cit9OworCisvKgogICogU2VjdG9yIGFsaWduZWQgYnVmZmVyIHJvdXRpbmVzIGZvciBidWZmZXIgY3JlYXRlL3JlYWQvd3JpdGUvYWNjZXNzCiAgKi8KIApAQCAtOTI1LDEyICs5MzYsMTIgQEAKIAlsb2ctPmxfY3Vycl9jeWNsZSA9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX2N5Y2xlKTsKIAlpZiAoZm91bmQgPT0gMikKIAkJbG9nLT5sX2N1cnJfY3ljbGUrKzsKLQlsb2ctPmxfdGFpbF9sc24gPSBiZTY0X3RvX2NwdShyaGVhZC0+aF90YWlsX2xzbik7Ci0JbG9nLT5sX2xhc3Rfc3luY19sc24gPSBiZTY0X3RvX2NwdShyaGVhZC0+aF9sc24pOwotCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7Ci0JbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPSBCQlRPQihsb2ctPmxfY3Vycl9ibG9jayk7Ci0JbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7Ci0JbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzID0gQkJUT0IobG9nLT5sX2N1cnJfYmxvY2spOworCWF0b21pYzY0X3NldCgmbG9nLT5sX3RhaWxfbHNuLCBiZTY0X3RvX2NwdShyaGVhZC0+aF90YWlsX2xzbikpOworCWF0b21pYzY0X3NldCgmbG9nLT5sX2xhc3Rfc3luY19sc24sIGJlNjRfdG9fY3B1KHJoZWFkLT5oX2xzbikpOworCXhsb2dfYXNzaWduX2dyYW50X2hlYWQoJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsIGxvZy0+bF9jdXJyX2N5Y2xlLAorCQkJCQlCQlRPQihsb2ctPmxfY3Vycl9ibG9jaykpOworCXhsb2dfYXNzaWduX2dyYW50X2hlYWQoJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCBsb2ctPmxfY3Vycl9jeWNsZSwKKwkJCQkJQkJUT0IobG9nLT5sX2N1cnJfYmxvY2spKTsKIAogCS8qCiAJICogTG9vayBmb3IgdW5tb3VudCByZWNvcmQuICBJZiB3ZSBmaW5kIGl0LCB0aGVuIHdlIGtub3cgdGhlcmUKQEAgLTk2MCw3ICs5NzEsNyBAQAogCX0KIAlhZnRlcl91bW91bnRfYmxrID0gKGkgKyBoYmxrcyArIChpbnQpCiAJCUJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpKSAlIGxvZy0+bF9sb2dCQnNpemU7Ci0JdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247CisJdGFpbF9sc24gPSBhdG9taWM2NF9yZWFkKCZsb2ctPmxfdGFpbF9sc24pOwogCWlmICgqaGVhZF9ibGsgPT0gYWZ0ZXJfdW1vdW50X2JsayAmJgogCSAgICBiZTMyX3RvX2NwdShyaGVhZC0+aF9udW1fbG9nb3BzKSA9PSAxKSB7CiAJCXVtb3VudF9kYXRhX2JsayA9IChpICsgaGJsa3MpICUgbG9nLT5sX2xvZ0JCc2l6ZTsKQEAgLTk3NSwxMiArOTg2LDEwIEBACiAJCQkgKiBsb2cgcmVjb3JkcyB3aWxsIHBvaW50IHJlY292ZXJ5IHRvIGFmdGVyIHRoZQogCQkJICogY3VycmVudCB1bm1vdW50IHJlY29yZC4KIAkJCSAqLwotCQkJbG9nLT5sX3RhaWxfbHNuID0KLQkJCQl4bG9nX2Fzc2lnbl9sc24obG9nLT5sX2N1cnJfY3ljbGUsCi0JCQkJCQlhZnRlcl91bW91bnRfYmxrKTsKLQkJCWxvZy0+bF9sYXN0X3N5bmNfbHNuID0KLQkJCQl4bG9nX2Fzc2lnbl9sc24obG9nLT5sX2N1cnJfY3ljbGUsCi0JCQkJCQlhZnRlcl91bW91bnRfYmxrKTsKKwkJCXhsb2dfYXNzaWduX2F0b21pY19sc24oJmxvZy0+bF90YWlsX2xzbiwKKwkJCQkJbG9nLT5sX2N1cnJfY3ljbGUsIGFmdGVyX3Vtb3VudF9ibGspOworCQkJeGxvZ19hc3NpZ25fYXRvbWljX2xzbigmbG9nLT5sX2xhc3Rfc3luY19sc24sCisJCQkJCWxvZy0+bF9jdXJyX2N5Y2xlLCBhZnRlcl91bW91bnRfYmxrKTsKIAkJCSp0YWlsX2JsayA9IGFmdGVyX3Vtb3VudF9ibGs7CiAKIAkJCS8qCkBAIC0xNjA1LDgyICsxNjE0LDQ1IEBACiAgKiByZWNvcmQgaW4gdGhlIHRhYmxlIHRvIHRlbGwgdXMgaG93IG1hbnkgdGltZXMgd2UgZXhwZWN0IHRvIHNlZSB0aGlzCiAgKiByZWNvcmQgZHVyaW5nIHRoZSBzZWNvbmQgcGFzcy4KICAqLwotU1RBVElDIHZvaWQKLXhsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzczEoCi0JeGxvZ190CQkJKmxvZywKLQl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfYnVmZmVyX3Bhc3MxKAorCXN0cnVjdCBsb2cJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKIHsKLQl4ZnNfYnVmX2NhbmNlbF90CSpiY3A7Ci0JeGZzX2J1Zl9jYW5jZWxfdAkqbmV4dHA7Ci0JeGZzX2J1Zl9jYW5jZWxfdAkqcHJldnA7Ci0JeGZzX2J1Zl9jYW5jZWxfdAkqKmJ1Y2tldDsKLQl4ZnNfZGFkZHJfdAkJYmxrbm8gPSAwOwotCXVpbnQJCQlsZW4gPSAwOwotCXVzaG9ydAkJCWZsYWdzID0gMDsKLQotCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7Ci0JY2FzZSBYRlNfTElfQlVGOgotCQlibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87Ci0JCWxlbiA9IGJ1Zl9mLT5ibGZfbGVuOwotCQlmbGFncyA9IGJ1Zl9mLT5ibGZfZmxhZ3M7Ci0JCWJyZWFrOwotCX0KKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCXN0cnVjdCBsaXN0X2hlYWQJKmJ1Y2tldDsKKwlzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwJKmJjcDsKIAogCS8qCiAJICogSWYgdGhpcyBpc24ndCBhIGNhbmNlbCBidWZmZXIgaXRlbSwgdGhlbiBqdXN0IHJldHVybi4KIAkgKi8KLQlpZiAoIShmbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSkgeworCWlmICghKGJ1Zl9mLT5ibGZfZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCkpIHsKIAkJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9ub3RfY2FuY2VsKGxvZywgYnVmX2YpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qCi0JICogSW5zZXJ0IGFuIHhmc19idWZfY2FuY2VsIHJlY29yZCBpbnRvIHRoZSBoYXNoIHRhYmxlIG9mCi0JICogdGhlbS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gaWRlbnRpY2FsIHJlY29yZCwgYnVtcAotCSAqIGl0cyByZWZlcmVuY2UgY291bnQuCisJICogSW5zZXJ0IGFuIHhmc19idWZfY2FuY2VsIHJlY29yZCBpbnRvIHRoZSBoYXNoIHRhYmxlIG9mIHRoZW0uCisJICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBpZGVudGljYWwgcmVjb3JkLCBidW1wIGl0cyByZWZlcmVuY2UgY291bnQuCiAJICovCi0JYnVja2V0ID0gJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlWyhfX3VpbnQ2NF90KWJsa25vICUKLQkJCQkJICBYTE9HX0JDX1RBQkxFX1NJWkVdOwotCS8qCi0JICogSWYgdGhlIGhhc2ggYnVja2V0IGlzIGVtcHR5IHRoZW4ganVzdCBpbnNlcnQgYSBuZXcgcmVjb3JkIGludG8KLQkgKiB0aGUgYnVja2V0LgotCSAqLwotCWlmICgqYnVja2V0ID09IE5VTEwpIHsKLQkJYmNwID0gKHhmc19idWZfY2FuY2VsX3QgKilrbWVtX2FsbG9jKHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KSwKLQkJCQkJCSAgICAgS01fU0xFRVApOwotCQliY3AtPmJjX2Jsa25vID0gYmxrbm87Ci0JCWJjcC0+YmNfbGVuID0gbGVuOwotCQliY3AtPmJjX3JlZmNvdW50ID0gMTsKLQkJYmNwLT5iY19uZXh0ID0gTlVMTDsKLQkJKmJ1Y2tldCA9IGJjcDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogVGhlIGhhc2ggYnVja2V0IGlzIG5vdCBlbXB0eSwgc28gc2VhcmNoIGZvciBkdXBsaWNhdGVzIG9mIG91cgotCSAqIHJlY29yZC4gIElmIHdlIGZpbmQgb25lIHRoZW0ganVzdCBidW1wIGl0cyByZWZjb3VudC4gIElmIG5vdAotCSAqIHRoZW4gYWRkIHVzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJldnAgPSBOVUxMOwotCW5leHRwID0gKmJ1Y2tldDsKLQl3aGlsZSAobmV4dHAgIT0gTlVMTCkgewotCQlpZiAobmV4dHAtPmJjX2Jsa25vID09IGJsa25vICYmIG5leHRwLT5iY19sZW4gPT0gbGVuKSB7Ci0JCQluZXh0cC0+YmNfcmVmY291bnQrKzsKKwlidWNrZXQgPSBYTE9HX0JVRl9DQU5DRUxfQlVDS0VUKGxvZywgYnVmX2YtPmJsZl9ibGtubyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiY3AsIGJ1Y2tldCwgYmNfbGlzdCkgeworCQlpZiAoYmNwLT5iY19ibGtubyA9PSBidWZfZi0+YmxmX2Jsa25vICYmCisJCSAgICBiY3AtPmJjX2xlbiA9PSBidWZfZi0+YmxmX2xlbikgeworCQkJYmNwLT5iY19yZWZjb3VudCsrOwogCQkJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9jYW5jZWxfcmVmX2luYyhsb2csIGJ1Zl9mKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCQl9Ci0JCXByZXZwID0gbmV4dHA7Ci0JCW5leHRwID0gbmV4dHAtPmJjX25leHQ7CiAJfQotCUFTU0VSVChwcmV2cCAhPSBOVUxMKTsKLQliY3AgPSAoeGZzX2J1Zl9jYW5jZWxfdCAqKWttZW1fYWxsb2Moc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QpLAotCQkJCQkgICAgIEtNX1NMRUVQKTsKLQliY3AtPmJjX2Jsa25vID0gYmxrbm87Ci0JYmNwLT5iY19sZW4gPSBsZW47CisKKwliY3AgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwpLCBLTV9TTEVFUCk7CisJYmNwLT5iY19ibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87CisJYmNwLT5iY19sZW4gPSBidWZfZi0+YmxmX2xlbjsKIAliY3AtPmJjX3JlZmNvdW50ID0gMTsKLQliY3AtPmJjX25leHQgPSBOVUxMOwotCXByZXZwLT5iY19uZXh0ID0gYmNwOworCWxpc3RfYWRkX3RhaWwoJmJjcC0+YmNfbGlzdCwgYnVja2V0KTsKKwogCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfY2FuY2VsX2FkZChsb2csIGJ1Zl9mKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE2OTgsMTQgKzE2NzAsMTMgQEAKICAqLwogU1RBVElDIGludAogeGxvZ19jaGVja19idWZmZXJfY2FuY2VsbGVkKAotCXhsb2dfdAkJCSpsb2csCisJc3RydWN0IGxvZwkJKmxvZywKIAl4ZnNfZGFkZHJfdAkJYmxrbm8sCiAJdWludAkJCWxlbiwKIAl1c2hvcnQJCQlmbGFncykKIHsKLQl4ZnNfYnVmX2NhbmNlbF90CSpiY3A7Ci0JeGZzX2J1Zl9jYW5jZWxfdAkqcHJldnA7Ci0JeGZzX2J1Zl9jYW5jZWxfdAkqKmJ1Y2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpidWNrZXQ7CisJc3RydWN0IHhmc19idWZfY2FuY2VsCSpiY3A7CiAKIAlpZiAobG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUgPT0gTlVMTCkgewogCQkvKgpAQCAtMTcxNiwxMjggKzE2ODcsNzAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JYnVja2V0ID0gJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlWyhfX3VpbnQ2NF90KWJsa25vICUKLQkJCQkJICBYTE9HX0JDX1RBQkxFX1NJWkVdOwotCWJjcCA9ICpidWNrZXQ7Ci0JaWYgKGJjcCA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHRhYmxlIGJ1aWx0Ci0JCSAqIGluIHBhc3Mgb25lLCBzbyB0aGlzIGJ1ZmZlciBoYXMgbm90IGJlZW4gY2FuY2VsbGVkLgotCQkgKi8KLQkJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCkpOwotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFNlYXJjaCBmb3IgYW4gZW50cnkgaW4gdGhlICBjYW5jZWwgdGFibGUgdGhhdCBtYXRjaGVzIG91ciBidWZmZXIuCisJICovCisJYnVja2V0ID0gWExPR19CVUZfQ0FOQ0VMX0JVQ0tFVChsb2csIGJsa25vKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJjcCwgYnVja2V0LCBiY19saXN0KSB7CisJCWlmIChiY3AtPmJjX2Jsa25vID09IGJsa25vICYmIGJjcC0+YmNfbGVuID09IGxlbikKKwkJCWdvdG8gZm91bmQ7CiAJfQogCiAJLyoKLQkgKiBTZWFyY2ggZm9yIGFuIGVudHJ5IGluIHRoZSBidWZmZXIgY2FuY2VsIHRhYmxlIHRoYXQKLQkgKiBtYXRjaGVzIG91ciBidWZmZXIuCi0JICovCi0JcHJldnAgPSBOVUxMOwotCXdoaWxlIChiY3AgIT0gTlVMTCkgewotCQlpZiAoYmNwLT5iY19ibGtubyA9PSBibGtubyAmJiBiY3AtPmJjX2xlbiA9PSBsZW4pIHsKLQkJCS8qCi0JCQkgKiBXZSd2ZSBnbyBhIG1hdGNoLCBzbyByZXR1cm4gMSBzbyB0aGF0IHRoZQotCQkJICogcmVjb3Zlcnkgb2YgdGhpcyBidWZmZXIgaXMgY2FuY2VsbGVkLgotCQkJICogSWYgdGhpcyBidWZmZXIgaXMgYWN0dWFsbHkgYSBidWZmZXIgY2FuY2VsCi0JCQkgKiBsb2cgaXRlbSwgdGhlbiBkZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9uIHRoZQotCQkJICogb25lIGluIHRoZSB0YWJsZSBhbmQgcmVtb3ZlIGl0IGlmIHRoaXMgaXMgdGhlCi0JCQkgKiBsYXN0IHJlZmVyZW5jZS4KLQkJCSAqLwotCQkJaWYgKGZsYWdzICYgWEZTX0JMRl9DQU5DRUwpIHsKLQkJCQliY3AtPmJjX3JlZmNvdW50LS07Ci0JCQkJaWYgKGJjcC0+YmNfcmVmY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldnAgPT0gTlVMTCkgewotCQkJCQkJKmJ1Y2tldCA9IGJjcC0+YmNfbmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXZwLT5iY19uZXh0ID0gYmNwLT5iY19uZXh0OwotCQkJCQl9Ci0JCQkJCWttZW1fZnJlZShiY3ApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAxOwotCQl9Ci0JCXByZXZwID0gYmNwOwotCQliY3AgPSBiY3AtPmJjX25leHQ7Ci0JfQotCS8qCi0JICogV2UgZGlkbid0IGZpbmQgYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSB0YWJsZSwgc28KLQkgKiByZXR1cm4gMCBzbyB0aGF0IHRoZSBidWZmZXIgaXMgTk9UIGNhbmNlbGxlZC4KKwkgKiBXZSBkaWRuJ3QgZmluZCBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHRhYmxlLCBzbyByZXR1cm4gMCBzbworCSAqIHRoYXQgdGhlIGJ1ZmZlciBpcyBOT1QgY2FuY2VsbGVkLgogCSAqLwogCUFTU0VSVCghKGZsYWdzICYgWEZTX0JMRl9DQU5DRUwpKTsKIAlyZXR1cm4gMDsKLX0KIAotU1RBVElDIGludAoteGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl9wYXNzMigKLQl4bG9nX3QJCQkqbG9nLAotCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKLXsKLQl4ZnNfZGFkZHJfdAkJYmxrbm8gPSAwOwotCXVzaG9ydAkJCWZsYWdzID0gMDsKLQl1aW50CQkJbGVuID0gMDsKLQotCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7Ci0JY2FzZSBYRlNfTElfQlVGOgotCQlibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87Ci0JCWZsYWdzID0gYnVmX2YtPmJsZl9mbGFnczsKLQkJbGVuID0gYnVmX2YtPmJsZl9sZW47Ci0JCWJyZWFrOworZm91bmQ6CisJLyoKKwkgKiBXZSd2ZSBnbyBhIG1hdGNoLCBzbyByZXR1cm4gMSBzbyB0aGF0IHRoZSByZWNvdmVyeSBvZiB0aGlzIGJ1ZmZlcgorCSAqIGlzIGNhbmNlbGxlZC4gIElmIHRoaXMgYnVmZmVyIGlzIGFjdHVhbGx5IGEgYnVmZmVyIGNhbmNlbCBsb2cKKwkgKiBpdGVtLCB0aGVuIGRlY3JlbWVudCB0aGUgcmVmY291bnQgb24gdGhlIG9uZSBpbiB0aGUgdGFibGUgYW5kCisJICogcmVtb3ZlIGl0IGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLgorCSAqLworCWlmIChmbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSB7CisJCWlmICgtLWJjcC0+YmNfcmVmY291bnQgPT0gMCkgeworCQkJbGlzdF9kZWwoJmJjcC0+YmNfbGlzdCk7CisJCQlrbWVtX2ZyZWUoYmNwKTsKKwkJfQogCX0KLQotCXJldHVybiB4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQobG9nLCBibGtubywgbGVuLCBmbGFncyk7CisJcmV0dXJuIDE7CiB9CiAKIC8qCi0gKiBQZXJmb3JtIHJlY292ZXJ5IGZvciBhIGJ1ZmZlciBmdWxsIG9mIGlub2Rlcy4gIEluIHRoZXNlIGJ1ZmZlcnMsCi0gKiB0aGUgb25seSBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWNvdmVyZWQgaXMgdGhhdCB3aGljaCBjb3JyZXNwb25kcwotICogdG8gdGhlIGRpX25leHRfdW5saW5rZWQgcG9pbnRlcnMgaW4gdGhlIG9uIGRpc2sgaW5vZGUgc3RydWN0dXJlcy4KLSAqIFRoZSByZXN0IG9mIHRoZSBkYXRhIGZvciB0aGUgaW5vZGVzIGlzIGFsd2F5cyBsb2dnZWQgdGhyb3VnaCB0aGUKLSAqIGlub2RlcyB0aGVtc2VsdmVzIHJhdGhlciB0aGFuIHRoZSBpbm9kZSBidWZmZXIgYW5kIGlzIHJlY292ZXJlZAotICogaW4geGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKCkuCisgKiBQZXJmb3JtIHJlY292ZXJ5IGZvciBhIGJ1ZmZlciBmdWxsIG9mIGlub2Rlcy4gIEluIHRoZXNlIGJ1ZmZlcnMsIHRoZSBvbmx5CisgKiBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWNvdmVyZWQgaXMgdGhhdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUKKyAqIGRpX25leHRfdW5saW5rZWQgcG9pbnRlcnMgaW4gdGhlIG9uIGRpc2sgaW5vZGUgc3RydWN0dXJlcy4gIFRoZSByZXN0IG9mIHRoZQorICogZGF0YSBmb3IgdGhlIGlub2RlcyBpcyBhbHdheXMgbG9nZ2VkIHRocm91Z2ggdGhlIGlub2RlcyB0aGVtc2VsdmVzIHJhdGhlcgorICogdGhhbiB0aGUgaW5vZGUgYnVmZmVyIGFuZCBpcyByZWNvdmVyZWQgaW4geGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKCkuCiAgKgotICogVGhlIG9ubHkgdGltZSB3aGVuIGJ1ZmZlcnMgZnVsbCBvZiBpbm9kZXMgYXJlIGZ1bGx5IHJlY292ZXJlZCBpcwotICogd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb2YgbmV3bHkgYWxsb2NhdGVkIGlub2Rlcy4gIEluIHRoaXMgY2FzZQotICogdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBtYXJrZWQgYXMgYW4gaW5vZGUgYnVmZmVyIGFuZCBzbyB3aWxsIGJlCi0gKiBzZW50IHRvIHhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKCkgYmVsb3cgZHVyaW5nIHJlY292ZXJ5LgorICogVGhlIG9ubHkgdGltZSB3aGVuIGJ1ZmZlcnMgZnVsbCBvZiBpbm9kZXMgYXJlIGZ1bGx5IHJlY292ZXJlZCBpcyB3aGVuIHRoZQorICogYnVmZmVyIGlzIGZ1bGwgb2YgbmV3bHkgYWxsb2NhdGVkIGlub2Rlcy4gIEluIHRoaXMgY2FzZSB0aGUgYnVmZmVyIHdpbGwKKyAqIG5vdCBiZSBtYXJrZWQgYXMgYW4gaW5vZGUgYnVmZmVyIGFuZCBzbyB3aWxsIGJlIHNlbnQgdG8KKyAqIHhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKCkgYmVsb3cgZHVyaW5nIHJlY292ZXJ5LgogICovCiBTVEFUSUMgaW50CiB4bG9nX3JlY292ZXJfZG9faW5vZGVfYnVmZmVyKAotCXhmc19tb3VudF90CQkqbXAsCisJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKLQl4ZnNfYnVmX3QJCSpicCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAogCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKIHsKIAlpbnQJCQlpOwotCWludAkJCWl0ZW1faW5kZXg7Ci0JaW50CQkJYml0OwotCWludAkJCW5iaXRzOwotCWludAkJCXJlZ19idWZfb2Zmc2V0OwotCWludAkJCXJlZ19idWZfYnl0ZXM7CisJaW50CQkJaXRlbV9pbmRleCA9IDA7CisJaW50CQkJYml0ID0gMDsKKwlpbnQJCQluYml0cyA9IDA7CisJaW50CQkJcmVnX2J1Zl9vZmZzZXQgPSAwOworCWludAkJCXJlZ19idWZfYnl0ZXMgPSAwOwogCWludAkJCW5leHRfdW5saW5rZWRfb2Zmc2V0OwogCWludAkJCWlub2Rlc19wZXJfYnVmOwogCXhmc19hZ2lub190CQkqbG9nZ2VkX25leHRwOwogCXhmc19hZ2lub190CQkqYnVmZmVyX25leHRwOwotCXVuc2lnbmVkIGludAkJKmRhdGFfbWFwID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCW1hcF9zaXplID0gMDsKIAogCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfaW5vZGVfYnVmKG1wLT5tX2xvZywgYnVmX2YpOwogCi0Jc3dpdGNoIChidWZfZi0+YmxmX3R5cGUpIHsKLQljYXNlIFhGU19MSV9CVUY6Ci0JCWRhdGFfbWFwID0gYnVmX2YtPmJsZl9kYXRhX21hcDsKLQkJbWFwX3NpemUgPSBidWZfZi0+YmxmX21hcF9zaXplOwotCQlicmVhazsKLQl9Ci0JLyoKLQkgKiBTZXQgdGhlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHJlZ2lvbiB0bwotCSAqIDAgc28gdGhhdCB3ZSdsbCBpbml0aWFsaXplIHRoZW0gb24gdGhlIGZpcnN0IHBhc3MgdGhyb3VnaAotCSAqIHRoZSBsb29wLgotCSAqLwotCXJlZ19idWZfb2Zmc2V0ID0gMDsKLQlyZWdfYnVmX2J5dGVzID0gMDsKLQliaXQgPSAwOwotCW5iaXRzID0gMDsKLQlpdGVtX2luZGV4ID0gMDsKIAlpbm9kZXNfcGVyX2J1ZiA9IFhGU19CVUZfQ09VTlQoYnApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nOwogCWZvciAoaSA9IDA7IGkgPCBpbm9kZXNfcGVyX2J1ZjsgaSsrKSB7CiAJCW5leHRfdW5saW5rZWRfb2Zmc2V0ID0gKGkgKiBtcC0+bV9zYi5zYl9pbm9kZXNpemUpICsKQEAgLTE4NTIsMTggKzE3NjUsMTggQEAKIAkJCSAqIHRoZSBjdXJyZW50IGRpX25leHRfdW5saW5rZWQgZmllbGQuCiAJCQkgKi8KIAkJCWJpdCArPSBuYml0czsKLQkJCWJpdCA9IHhmc19uZXh0X2JpdChkYXRhX21hcCwgbWFwX3NpemUsIGJpdCk7CisJCQliaXQgPSB4ZnNfbmV4dF9iaXQoYnVmX2YtPmJsZl9kYXRhX21hcCwKKwkJCQkJICAgYnVmX2YtPmJsZl9tYXBfc2l6ZSwgYml0KTsKIAogCQkJLyoKIAkJCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIGxvZ2dlZCByZWdpb25zIGluIHRoZQogCQkJICogYnVmZmVyLCB0aGVuIHdlJ3JlIGRvbmUuCiAJCQkgKi8KLQkJCWlmIChiaXQgPT0gLTEpIHsKKwkJCWlmIChiaXQgPT0gLTEpCiAJCQkJcmV0dXJuIDA7Ci0JCQl9CiAKLQkJCW5iaXRzID0geGZzX2NvbnRpZ19iaXRzKGRhdGFfbWFwLCBtYXBfc2l6ZSwKLQkJCQkJCQkgYml0KTsKKwkJCW5iaXRzID0geGZzX2NvbnRpZ19iaXRzKGJ1Zl9mLT5ibGZfZGF0YV9tYXAsCisJCQkJCQlidWZfZi0+YmxmX21hcF9zaXplLCBiaXQpOwogCQkJQVNTRVJUKG5iaXRzID4gMCk7CiAJCQlyZWdfYnVmX29mZnNldCA9IGJpdCA8PCBYRlNfQkxGX1NISUZUOwogCQkJcmVnX2J1Zl9ieXRlcyA9IG5iaXRzIDw8IFhGU19CTEZfU0hJRlQ7CkBAIC0xODc1LDkgKzE3ODgsOCBAQAogCQkgKiBkaV9uZXh0X3VubGlua2VkIGZpZWxkLCB0aGVuIG1vdmUgb24gdG8gdGhlIG5leHQKIAkJICogZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4KIAkJICovCi0JCWlmIChuZXh0X3VubGlua2VkX29mZnNldCA8IHJlZ19idWZfb2Zmc2V0KSB7CisJCWlmIChuZXh0X3VubGlua2VkX29mZnNldCA8IHJlZ19idWZfb2Zmc2V0KQogCQkJY29udGludWU7Ci0JCX0KIAogCQlBU1NFUlQoaXRlbS0+cmlfYnVmW2l0ZW1faW5kZXhdLmlfYWRkciAhPSBOVUxMKTsKIAkJQVNTRVJUKChpdGVtLT5yaV9idWZbaXRlbV9pbmRleF0uaV9sZW4gJSBYRlNfQkxGX0NIVU5LKSA9PSAwKTsKQEAgLTE5MTMsMzYgKzE4MjUsMjkgQEAKICAqIGdpdmVuIGJ1ZmZlci4gIFRoZSBiaXRtYXAgaW4gdGhlIGJ1ZiBsb2cgZm9ybWF0IHN0cnVjdHVyZSBpbmRpY2F0ZXMKICAqIHdoZXJlIHRvIHBsYWNlIHRoZSBsb2dnZWQgZGF0YS4KICAqLwotLypBUkdTVVNFRCovCiBTVEFUSUMgdm9pZAogeGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIoCiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKLQl4ZnNfYnVmX3QJCSpicCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAogCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKIHsKIAlpbnQJCQlpOwogCWludAkJCWJpdDsKIAlpbnQJCQluYml0czsKLQl1bnNpZ25lZCBpbnQJCSpkYXRhX21hcCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50CQltYXBfc2l6ZSA9IDA7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CiAKIAl0cmFjZV94ZnNfbG9nX3JlY292ZXJfYnVmX3JlZ19idWYobXAtPm1fbG9nLCBidWZfZik7CiAKLQlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgewotCWNhc2UgWEZTX0xJX0JVRjoKLQkJZGF0YV9tYXAgPSBidWZfZi0+YmxmX2RhdGFfbWFwOwotCQltYXBfc2l6ZSA9IGJ1Zl9mLT5ibGZfbWFwX3NpemU7Ci0JCWJyZWFrOwotCX0KIAliaXQgPSAwOwogCWkgPSAxOyAgLyogMCBpcyB0aGUgYnVmIGZvcm1hdCBzdHJ1Y3R1cmUgKi8KIAl3aGlsZSAoMSkgewotCQliaXQgPSB4ZnNfbmV4dF9iaXQoZGF0YV9tYXAsIG1hcF9zaXplLCBiaXQpOworCQliaXQgPSB4ZnNfbmV4dF9iaXQoYnVmX2YtPmJsZl9kYXRhX21hcCwKKwkJCQkgICBidWZfZi0+YmxmX21hcF9zaXplLCBiaXQpOwogCQlpZiAoYml0ID09IC0xKQogCQkJYnJlYWs7Ci0JCW5iaXRzID0geGZzX2NvbnRpZ19iaXRzKGRhdGFfbWFwLCBtYXBfc2l6ZSwgYml0KTsKKwkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoYnVmX2YtPmJsZl9kYXRhX21hcCwKKwkJCQkJYnVmX2YtPmJsZl9tYXBfc2l6ZSwgYml0KTsKIAkJQVNTRVJUKG5iaXRzID4gMCk7CiAJCUFTU0VSVChpdGVtLT5yaV9idWZbaV0uaV9hZGRyICE9IE5VTEwpOwogCQlBU1NFUlQoaXRlbS0+cmlfYnVmW2ldLmlfbGVuICUgWEZTX0JMRl9DSFVOSyA9PSAwKTsKQEAgLTIxNzYsNzcgKzIwODEsNDYgQEAKICAqIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0YWJsZSBvZiBjYW5jZWwgcmVjb3Jkcy4KICAqLwogU1RBVElDIGludAoteGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl90cmFucygKK3hsb2dfcmVjb3Zlcl9idWZmZXJfcGFzczIoCiAJeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCWludAkJCXBhc3MpCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKIHsKIAl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwotCXhmc19tb3VudF90CQkqbXA7CisJeGZzX21vdW50X3QJCSptcCA9IGxvZy0+bF9tcDsKIAl4ZnNfYnVmX3QJCSpicDsKIAlpbnQJCQllcnJvcjsKLQlpbnQJCQljYW5jZWw7Ci0JeGZzX2RhZGRyX3QJCWJsa25vOwotCWludAkJCWxlbjsKLQl1c2hvcnQJCQlmbGFnczsKIAl1aW50CQkJYnVmX2ZsYWdzOwogCi0JaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7Ci0JCS8qCi0JCSAqIEluIHRoaXMgcGFzcyB3ZSdyZSBvbmx5IGxvb2tpbmcgZm9yIGJ1ZiBpdGVtcwotCQkgKiB3aXRoIHRoZSBYRlNfQkxGX0NBTkNFTCBiaXQgc2V0LgotCQkgKi8KLQkJeGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl9wYXNzMShsb2csIGJ1Zl9mKTsKKwkvKgorCSAqIEluIHRoaXMgcGFzcyB3ZSBvbmx5IHdhbnQgdG8gcmVjb3ZlciBhbGwgdGhlIGJ1ZmZlcnMgd2hpY2ggaGF2ZQorCSAqIG5vdCBiZWVuIGNhbmNlbGxlZCBhbmQgYXJlIG5vdCBjYW5jZWxsYXRpb24gYnVmZmVycyB0aGVtc2VsdmVzLgorCSAqLworCWlmICh4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQobG9nLCBidWZfZi0+YmxmX2Jsa25vLAorCQkJYnVmX2YtPmJsZl9sZW4sIGJ1Zl9mLT5ibGZfZmxhZ3MpKSB7CisJCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfY2FuY2VsKGxvZywgYnVmX2YpOwogCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBJbiB0aGlzIHBhc3Mgd2Ugd2FudCB0byByZWNvdmVyIGFsbCB0aGUgYnVmZmVycwotCQkgKiB3aGljaCBoYXZlIG5vdCBiZWVuIGNhbmNlbGxlZCBhbmQgYXJlIG5vdAotCQkgKiBjYW5jZWxsYXRpb24gYnVmZmVycyB0aGVtc2VsdmVzLiAgVGhlIHJvdXRpbmUKLQkJICogd2UgY2FsbCBoZXJlIHdpbGwgdGVsbCB1cyB3aGV0aGVyIG9yIG5vdCB0bwotCQkgKiBjb250aW51ZSB3aXRoIHRoZSByZXBsYXkgb2YgdGhpcyBidWZmZXIuCi0JCSAqLwotCQljYW5jZWwgPSB4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MyKGxvZywgYnVmX2YpOwotCQlpZiAoY2FuY2VsKSB7Ci0JCQl0cmFjZV94ZnNfbG9nX3JlY292ZXJfYnVmX2NhbmNlbChsb2csIGJ1Zl9mKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfcmVjb3Zlcihsb2csIGJ1Zl9mKTsKLQlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgewotCWNhc2UgWEZTX0xJX0JVRjoKLQkJYmxrbm8gPSBidWZfZi0+YmxmX2Jsa25vOwotCQlsZW4gPSBidWZfZi0+YmxmX2xlbjsKLQkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbG9nLT5sX21wLAotCQkJInhmc19sb2dfcmVjb3ZlcjogdW5rbm93biBidWZmZXIgdHlwZSAweCV4LCBsb2dkZXYgJXMiLAotCQkJYnVmX2YtPmJsZl90eXBlLCBsb2ctPmxfbXAtPm1fbG9nbmFtZSA/Ci0JCQlsb2ctPmxfbXAtPm1fbG9nbmFtZSA6ICJpbnRlcm5hbCIpOwotCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zIiwKLQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKLQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogCX0KIAotCW1wID0gbG9nLT5sX21wOworCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfcmVjb3Zlcihsb2csIGJ1Zl9mKTsKKwogCWJ1Zl9mbGFncyA9IFhCRl9MT0NLOwotCWlmICghKGZsYWdzICYgWEZTX0JMRl9JTk9ERV9CVUYpKQorCWlmICghKGJ1Zl9mLT5ibGZfZmxhZ3MgJiBYRlNfQkxGX0lOT0RFX0JVRikpCiAJCWJ1Zl9mbGFncyB8PSBYQkZfTUFQUEVEOwogCi0JYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgYmxrbm8sIGxlbiwgYnVmX2ZsYWdzKTsKKwlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBidWZfZi0+YmxmX2Jsa25vLCBidWZfZi0+YmxmX2xlbiwKKwkJCSAgYnVmX2ZsYWdzKTsKIAlpZiAoWEZTX0JVRl9JU0VSUk9SKGJwKSkgewotCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2RvLi4ocmVhZCMxKSIsIGxvZy0+bF9tcCwKLQkJCQkgIGJwLCBibGtubyk7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzEpIiwgbXAsCisJCQkJICBicCwgYnVmX2YtPmJsZl9ibGtubyk7CiAJCWVycm9yID0gWEZTX0JVRl9HRVRFUlJPUihicCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJZXJyb3IgPSAwOwotCWlmIChmbGFncyAmIFhGU19CTEZfSU5PREVfQlVGKSB7CisJaWYgKGJ1Zl9mLT5ibGZfZmxhZ3MgJiBYRlNfQkxGX0lOT0RFX0JVRikgewogCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19pbm9kZV9idWZmZXIobXAsIGl0ZW0sIGJwLCBidWZfZik7Ci0JfSBlbHNlIGlmIChmbGFncyAmCisJfSBlbHNlIGlmIChidWZfZi0+YmxmX2ZsYWdzICYKIAkJICAoWEZTX0JMRl9VRFFVT1RfQlVGfFhGU19CTEZfUERRVU9UX0JVRnxYRlNfQkxGX0dEUVVPVF9CVUYpKSB7CiAJCXhsb2dfcmVjb3Zlcl9kb19kcXVvdF9idWZmZXIobXAsIGxvZywgaXRlbSwgYnAsIGJ1Zl9mKTsKIAl9IGVsc2UgewpAQCAtMjI4NiwxNiArMjE2MCwxNCBAQAogfQogCiBTVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoCit4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoCiAJeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCWludAkJCXBhc3MpCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKIHsKIAl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90CSppbl9mOwotCXhmc19tb3VudF90CQkqbXA7CisJeGZzX21vdW50X3QJCSptcCA9IGxvZy0+bF9tcDsKIAl4ZnNfYnVmX3QJCSpicDsKIAl4ZnNfZGlub2RlX3QJCSpkaXA7Ci0JeGZzX2lub190CQlpbm87CiAJaW50CQkJbGVuOwogCXhmc19jYWRkcl90CQlzcmM7CiAJeGZzX2NhZGRyX3QJCWRlc3Q7CkBAIC0yMzA1LDEwICsyMTc3LDYgQEAKIAl4ZnNfaWNkaW5vZGVfdAkJKmRpY3A7CiAJaW50CQkJbmVlZF9mcmVlID0gMDsKIAotCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KIAlpZiAoaXRlbS0+cmlfYnVmWzBdLmlfbGVuID09IHNpemVvZih4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90KSkgewogCQlpbl9mID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKIAl9IGVsc2UgewpAQCAtMjMxOCw4ICsyMTg2LDYgQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcjsKIAl9Ci0JaW5vID0gaW5fZi0+aWxmX2lubzsKLQltcCA9IGxvZy0+bF9tcDsKIAogCS8qCiAJICogSW5vZGUgYnVmZmVycyBjYW4gYmUgZnJlZWQsIGxvb2sgb3V0IGZvciBpdCwKQEAgLTIzNTQsOCArMjIyMCw4IEBACiAJCXhmc19idWZfcmVsc2UoYnApOwogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBtYWdpYyBudW1iZXIsIGRpbm8gcHRyID0gMHglcCwgZGlubyBicCA9IDB4JXAsIGlubyA9ICVMZCIsCi0JCQlkaXAsIGJwLCBpbm8pOwotCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoMSkiLAorCQkJZGlwLCBicCwgaW5fZi0+aWxmX2lubyk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMigxKSIsCiAJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKIAkJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJCWdvdG8gZXJyb3I7CkBAIC0yMzY1LDggKzIyMzEsOCBAQAogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAogCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBpbm8gJUxkIiwKLQkJCWl0ZW0sIGlubyk7Ci0JCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygyKSIsCisJCQlpdGVtLCBpbl9mLT5pbGZfaW5vKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKDIpIiwKIAkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOwogCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAkJZ290byBlcnJvcjsKQEAgLTIzOTQsMTIgKzIyNjAsMTIgQEAKIAlpZiAodW5saWtlbHkoKGRpY3AtPmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpKSB7CiAJCWlmICgoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpICYmCiAJCSAgICAoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSkgewotCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygzKSIsCisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKDMpIiwKIAkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKIAkJCXhmc19idWZfcmVsc2UoYnApOwogCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAogCQkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIHJlZ3VsYXIgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBpbm8gcHRyID0gMHglcCwgaW5vIGJwID0gMHglcCwgaW5vICVMZCIsCi0JCQkJaXRlbSwgZGlwLCBicCwgaW5vKTsKKwkJCQlpdGVtLCBkaXAsIGJwLCBpbl9mLT5pbGZfaW5vKTsKIAkJCWVycm9yID0gRUZTQ09SUlVQVEVEOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtMjQwNyw0MCArMjI3Myw0MCBAQAogCQlpZiAoKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSAmJgogCQkgICAgKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgJiYKIAkJICAgIChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpKSB7Ci0JCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDQpIiwKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoNCkiLAogCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKIAkJCXhmc19idWZfcmVsc2UoYnApOwogCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAogCQkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGRpciBpbm9kZSBsb2cgcmVjb3JkLCByZWMgcHRyIDB4JXAsIGlubyBwdHIgPSAweCVwLCBpbm8gYnAgPSAweCVwLCBpbm8gJUxkIiwKLQkJCQlpdGVtLCBkaXAsIGJwLCBpbm8pOworCQkJCWl0ZW0sIGRpcCwgYnAsIGluX2YtPmlsZl9pbm8pOwogCQkJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJfQogCWlmICh1bmxpa2VseShkaWNwLT5kaV9uZXh0ZW50cyArIGRpY3AtPmRpX2FuZXh0ZW50cyA+IGRpY3AtPmRpX25ibG9ja3MpKXsKLQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucyg1KSIsCisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoNSkiLAogCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOwogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAogCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbG9nIHJlY29yZCwgcmVjIHB0ciAweCVwLCBkaW5vIHB0ciAweCVwLCBkaW5vIGJwIDB4JXAsIGlubyAlTGQsIHRvdGFsIGV4dGVudHMgPSAlZCwgbmJsb2NrcyA9ICVMZCIsCi0JCQlpdGVtLCBkaXAsIGJwLCBpbm8sCisJCQlpdGVtLCBkaXAsIGJwLCBpbl9mLT5pbGZfaW5vLAogCQkJZGljcC0+ZGlfbmV4dGVudHMgKyBkaWNwLT5kaV9hbmV4dGVudHMsCiAJCQlkaWNwLT5kaV9uYmxvY2tzKTsKIAkJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWlmICh1bmxpa2VseShkaWNwLT5kaV9mb3Jrb2ZmID4gbXAtPm1fc2Iuc2JfaW5vZGVzaXplKSkgewotCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDYpIiwKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMig2KSIsCiAJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBsb2cgcmVjIHB0ciAweCVwLCBkaW5vIHB0ciAweCVwLCBkaW5vIGJwIDB4JXAsIGlubyAlTGQsIGZvcmtvZmYgMHgleCIsCi0JCQlpdGVtLCBkaXAsIGJwLCBpbm8sIGRpY3AtPmRpX2ZvcmtvZmYpOworCQkJaXRlbSwgZGlwLCBicCwgaW5fZi0+aWxmX2lubywgZGljcC0+ZGlfZm9ya29mZik7CiAJCWVycm9yID0gRUZTQ09SUlVQVEVEOwogCQlnb3RvIGVycm9yOwogCX0KIAlpZiAodW5saWtlbHkoaXRlbS0+cmlfYnVmWzFdLmlfbGVuID4gc2l6ZW9mKHN0cnVjdCB4ZnNfaWNkaW5vZGUpKSkgewotCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDcpIiwKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMig3KSIsCiAJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCkBAIC0yNTMyLDcgKzIzOTgsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCXhsb2dfd2FybigiWEZTOiB4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnM6IEludmFsaWQgZmxhZyIpOworCQkJeGxvZ193YXJuKCJYRlM6IHhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMjogSW52YWxpZCBmbGFnIik7CiAJCQlBU1NFUlQoMCk7CiAJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJCWVycm9yID0gRUlPOwpAQCAtMjU1NiwxOCArMjQyMiwxMSBAQAogICogb2YgdGhhdCB0eXBlLgogICovCiBTVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9fcXVvdGFvZmZfdHJhbnMoCit4bG9nX3JlY292ZXJfcXVvdGFvZmZfcGFzczEoCiAJeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCWludAkJCXBhc3MpCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKIHsKLQl4ZnNfcW9mZl9sb2dmb3JtYXRfdAkqcW9mZl9mOwotCi0JaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MyKSB7Ci0JCXJldHVybiAoMCk7Ci0JfQotCi0JcW9mZl9mID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKwl4ZnNfcW9mZl9sb2dmb3JtYXRfdAkqcW9mZl9mID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKIAlBU1NFUlQocW9mZl9mKTsKIAogCS8qCkBAIC0yNTg4LDIyICsyNDQ3LDE3IEBACiAgKiBSZWNvdmVyIGEgZHF1b3QgcmVjb3JkCiAgKi8KIFNUQVRJQyBpbnQKLXhsb2dfcmVjb3Zlcl9kb19kcXVvdF90cmFucygKK3hsb2dfcmVjb3Zlcl9kcXVvdF9wYXNzMigKIAl4bG9nX3QJCQkqbG9nLAotCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCi0JaW50CQkJcGFzcykKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQogewotCXhmc19tb3VudF90CQkqbXA7CisJeGZzX21vdW50X3QJCSptcCA9IGxvZy0+bF9tcDsKIAl4ZnNfYnVmX3QJCSpicDsKIAlzdHJ1Y3QgeGZzX2Rpc2tfZHF1b3QJKmRkcSwgKnJlY2RkcTsKIAlpbnQJCQllcnJvcjsKIAl4ZnNfZHFfbG9nZm9ybWF0X3QJKmRxX2Y7CiAJdWludAkJCXR5cGU7CiAKLQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCW1wID0gbG9nLT5sX21wOwogCiAJLyoKIAkgKiBGaWxlc3lzdGVtcyBhcmUgcmVxdWlyZWQgdG8gc2VuZCBpbiBxdW90YSBmbGFncyBhdCBtb3VudCB0aW1lLgpAQCAtMjY0Nyw3ICsyNTAxLDcgQEAKIAlpZiAoKGVycm9yID0geGZzX3FtX2RxY2hlY2socmVjZGRxLAogCQkJICAgZHFfZi0+cWxmX2lkLAogCQkJICAgMCwgWEZTX1FNT1BUX0RPV0FSTiwKLQkJCSAgICJ4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMgKGxvZyBjb3B5KSIpKSkgeworCQkJICAgInhsb2dfcmVjb3Zlcl9kcXVvdF9wYXNzMiAobG9nIGNvcHkpIikpKSB7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAl9CiAJQVNTRVJUKGRxX2YtPnFsZl9sZW4gPT0gMSk7CkBAIC0yNjcwLDcgKzI1MjQsNyBAQAogCSAqIG1pbmltYWwgaW5pdGlhbGl6YXRpb24gdGhlbi4KIAkgKi8KIAlpZiAoeGZzX3FtX2RxY2hlY2soZGRxLCBkcV9mLT5xbGZfaWQsIDAsIFhGU19RTU9QVF9ET1dBUk4sCi0JCQkgICAieGxvZ19yZWNvdmVyX2RvX2RxdW90X3RyYW5zIikpIHsKKwkJCSAgICJ4bG9nX3JlY292ZXJfZHF1b3RfcGFzczIiKSkgewogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCX0KQEAgLTI2OTMsMzggKzI1NDcsMzEgQEAKICAqIExTTi4KICAqLwogU1RBVElDIGludAoteGxvZ19yZWNvdmVyX2RvX2VmaV90cmFucygKK3hsb2dfcmVjb3Zlcl9lZmlfcGFzczIoCiAJeGxvZ190CQkJKmxvZywKIAl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCXhmc19sc25fdAkJbHNuLAotCWludAkJCXBhc3MpCisJeGZzX2xzbl90CQlsc24pCiB7CiAJaW50CQkJZXJyb3I7Ci0JeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfbW91bnRfdAkJKm1wID0gbG9nLT5sX21wOwogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKIAl4ZnNfZWZpX2xvZ19mb3JtYXRfdAkqZWZpX2Zvcm1hdHA7CiAKLQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJZWZpX2Zvcm1hdHAgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCi0JbXAgPSBsb2ctPmxfbXA7CiAJZWZpcCA9IHhmc19lZmlfaW5pdChtcCwgZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50cyk7CiAJaWYgKChlcnJvciA9IHhmc19lZmlfY29weV9mb3JtYXQoJihpdGVtLT5yaV9idWZbMF0pLAogCQkJCQkgJihlZmlwLT5lZmlfZm9ybWF0KSkpKSB7CiAJCXhmc19lZmlfaXRlbV9mcmVlKGVmaXApOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCWVmaXAtPmVmaV9uZXh0X2V4dGVudCA9IGVmaV9mb3JtYXRwLT5lZmlfbmV4dGVudHM7Ci0JZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOworCWF0b21pY19zZXQoJmVmaXAtPmVmaV9uZXh0X2V4dGVudCwgZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50cyk7CiAKIAlzcGluX2xvY2soJmxvZy0+bF9haWxwLT54YV9sb2NrKTsKIAkvKgogCSAqIHhmc190cmFuc19haWxfdXBkYXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCSAqLwotCXhmc190cmFuc19haWxfdXBkYXRlKGxvZy0+bF9haWxwLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBsc24pOworCXhmc190cmFuc19haWxfdXBkYXRlKGxvZy0+bF9haWxwLCAmZWZpcC0+ZWZpX2l0ZW0sIGxzbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MzcsMTEgKzI1ODQsMTAgQEAKICAqIGVmZCBmb3JtYXQgc3RydWN0dXJlLiAgSWYgd2UgZmluZCBpdCwgd2UgcmVtb3ZlIHRoZSBlZmkgZnJvbSB0aGUKICAqIEFJTCBhbmQgZnJlZSBpdC4KICAqLwotU1RBVElDIHZvaWQKLXhsb2dfcmVjb3Zlcl9kb19lZmRfdHJhbnMoCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZWZkX3Bhc3MyKAogCXhsb2dfdAkJCSpsb2csCi0JeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKLQlpbnQJCQlwYXNzKQorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0pCiB7CiAJeGZzX2VmZF9sb2dfZm9ybWF0X3QJKmVmZF9mb3JtYXRwOwogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCA9IE5VTEw7CkBAIC0yNzUwLDEwICsyNTk2LDYgQEAKIAlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJY3VyOwogCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGxvZy0+bF9haWxwOwogCi0JaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7Ci0JCXJldHVybjsKLQl9Ci0KIAllZmRfZm9ybWF0cCA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CiAJQVNTRVJUKChpdGVtLT5yaV9idWZbMF0uaV9sZW4gPT0gKHNpemVvZih4ZnNfZWZkX2xvZ19mb3JtYXRfMzJfdCkgKwogCQkoKGVmZF9mb3JtYXRwLT5lZmRfbmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50XzMyX3QpKSkpIHx8CkBAIC0yNzg1LDYyICsyNjI3LDYgQEAKIAl9CiAJeGZzX3RyYW5zX2FpbF9jdXJzb3JfZG9uZShhaWxwLCAmY3VyKTsKIAlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIHRoZSB0cmFuc2FjdGlvbgotICoKLSAqIElmIHRoZSB0cmFuc2FjdGlvbiBtb2RpZmllcyBhIGJ1ZmZlciBvciBpbm9kZSwgZG8gaXQgbm93LiAgT3RoZXJ3aXNlLAotICogRUZJcyBhbmQgRUZEcyBnZXQgcXVldWVkIHVwIGJ5IGFkZGluZyBlbnRyaWVzIGludG8gdGhlIEFJTCBmb3IgdGhlbS4KLSAqLwotU1RBVElDIGludAoteGxvZ19yZWNvdmVyX2RvX3RyYW5zKAotCXhsb2dfdAkJCSpsb2csCi0JeGxvZ19yZWNvdmVyX3QJCSp0cmFucywKLQlpbnQJCQlwYXNzKQotewotCWludAkJCWVycm9yID0gMDsKLQl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtOwotCi0JZXJyb3IgPSB4bG9nX3JlY292ZXJfcmVvcmRlcl90cmFucyhsb2csIHRyYW5zLCBwYXNzKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlbSwgJnRyYW5zLT5yX2l0ZW1xLCByaV9saXN0KSB7Ci0JCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9pdGVtX3JlY292ZXIobG9nLCB0cmFucywgaXRlbSwgcGFzcyk7Ci0JCXN3aXRjaCAoSVRFTV9UWVBFKGl0ZW0pKSB7Ci0JCWNhc2UgWEZTX0xJX0JVRjoKLQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl90cmFucyhsb2csIGl0ZW0sIHBhc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWEZTX0xJX0lOT0RFOgotCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMobG9nLCBpdGVtLCBwYXNzKTsKLQkJCWJyZWFrOwotCQljYXNlIFhGU19MSV9FRkk6Ci0JCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19lZmlfdHJhbnMobG9nLCBpdGVtLAotCQkJCQkJCSAgdHJhbnMtPnJfbHNuLCBwYXNzKTsKLQkJCWJyZWFrOwotCQljYXNlIFhGU19MSV9FRkQ6Ci0JCQl4bG9nX3JlY292ZXJfZG9fZWZkX3RyYW5zKGxvZywgaXRlbSwgcGFzcyk7Ci0JCQllcnJvciA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBYRlNfTElfRFFVT1Q6Ci0JCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19kcXVvdF90cmFucyhsb2csIGl0ZW0sIHBhc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWEZTX0xJX1FVT1RBT0ZGOgotCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9fcXVvdGFvZmZfdHJhbnMobG9nLCBpdGVtLAotCQkJCQkJCSAgICAgICBwYXNzKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJeGxvZ193YXJuKAotCSJYRlM6IGludmFsaWQgaXRlbSB0eXBlICglZCkgeGxvZ19yZWNvdmVyX2RvX3RyYW5zIiwgSVRFTV9UWVBFKGl0ZW0pKTsKLQkJCUFTU0VSVCgwKTsKLQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NTIsNyArMjYzOCw3IEBACiAgKi8KIFNUQVRJQyB2b2lkCiB4bG9nX3JlY292ZXJfZnJlZV90cmFucygKLQl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQorCXN0cnVjdCB4bG9nX3JlY292ZXIJKnRyYW5zKQogewogCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sICpuOwogCWludAkJCWk7CkBAIC0yODcxLDE3ICsyNjU3LDk1IEBACiB9CiAKIFNUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9jb21taXRfcGFzczEoCisJc3RydWN0IGxvZwkJKmxvZywKKwlzdHJ1Y3QgeGxvZ19yZWNvdmVyCSp0cmFucywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQoreworCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9pdGVtX3JlY292ZXIobG9nLCB0cmFucywgaXRlbSwgWExPR19SRUNPVkVSX1BBU1MxKTsKKworCXN3aXRjaCAoSVRFTV9UWVBFKGl0ZW0pKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2J1ZmZlcl9wYXNzMShsb2csIGl0ZW0pOworCWNhc2UgWEZTX0xJX1FVT1RBT0ZGOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX3F1b3Rhb2ZmX3Bhc3MxKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfSU5PREU6CisJY2FzZSBYRlNfTElfRUZJOgorCWNhc2UgWEZTX0xJX0VGRDoKKwljYXNlIFhGU19MSV9EUVVPVDoKKwkJLyogbm90aGluZyB0byBkbyBpbiBwYXNzIDEgKi8KKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJeGxvZ193YXJuKAorCSJYRlM6IGludmFsaWQgaXRlbSB0eXBlICglZCkgeGxvZ19yZWNvdmVyX2NvbW1pdF9wYXNzMSIsCisJCQlJVEVNX1RZUEUoaXRlbSkpOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9jb21taXRfcGFzczIoCisJc3RydWN0IGxvZwkJKmxvZywKKwlzdHJ1Y3QgeGxvZ19yZWNvdmVyCSp0cmFucywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQoreworCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9pdGVtX3JlY292ZXIobG9nLCB0cmFucywgaXRlbSwgWExPR19SRUNPVkVSX1BBU1MyKTsKKworCXN3aXRjaCAoSVRFTV9UWVBFKGl0ZW0pKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2J1ZmZlcl9wYXNzMihsb2csIGl0ZW0pOworCWNhc2UgWEZTX0xJX0lOT0RFOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfRUZJOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2VmaV9wYXNzMihsb2csIGl0ZW0sIHRyYW5zLT5yX2xzbik7CisJY2FzZSBYRlNfTElfRUZEOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2VmZF9wYXNzMihsb2csIGl0ZW0pOworCWNhc2UgWEZTX0xJX0RRVU9UOgorCQlyZXR1cm4geGxvZ19yZWNvdmVyX2RxdW90X3Bhc3MyKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfUVVPVEFPRkY6CisJCS8qIG5vdGhpbmcgdG8gZG8gaW4gcGFzczIgKi8KKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJeGxvZ193YXJuKAorCSJYRlM6IGludmFsaWQgaXRlbSB0eXBlICglZCkgeGxvZ19yZWNvdmVyX2NvbW1pdF9wYXNzMiIsCisJCQlJVEVNX1RZUEUoaXRlbSkpOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIHRoZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBJZiB0aGUgdHJhbnNhY3Rpb24gbW9kaWZpZXMgYSBidWZmZXIgb3IgaW5vZGUsIGRvIGl0IG5vdy4gIE90aGVyd2lzZSwKKyAqIEVGSXMgYW5kIEVGRHMgZ2V0IHF1ZXVlZCB1cCBieSBhZGRpbmcgZW50cmllcyBpbnRvIHRoZSBBSUwgZm9yIHRoZW0uCisgKi8KK1NUQVRJQyBpbnQKIHhsb2dfcmVjb3Zlcl9jb21taXRfdHJhbnMoCi0JeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAorCXN0cnVjdCBsb2cJCSpsb2csCisJc3RydWN0IHhsb2dfcmVjb3ZlcgkqdHJhbnMsCiAJaW50CQkJcGFzcykKIHsKLQlpbnQJCQllcnJvcjsKKwlpbnQJCQllcnJvciA9IDA7CisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbTsKIAogCWhsaXN0X2RlbCgmdHJhbnMtPnJfbGlzdCk7Ci0JaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl9kb190cmFucyhsb2csIHRyYW5zLCBwYXNzKSkpCisKKwllcnJvciA9IHhsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpOworCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwotCXhsb2dfcmVjb3Zlcl9mcmVlX3RyYW5zKHRyYW5zKTsJCQkvKiBubyBlcnJvciAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdHJhbnMtPnJfaXRlbXEsIHJpX2xpc3QpIHsKKwkJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKQorCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfY29tbWl0X3Bhc3MxKGxvZywgdHJhbnMsIGl0ZW0pOworCQllbHNlCisJCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9jb21taXRfcGFzczIobG9nLCB0cmFucywgaXRlbSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwl4bG9nX3JlY292ZXJfZnJlZV90cmFucyh0cmFucyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMTEsNyArMjg3NSw3IEBACiAJeGZzX2V4dGVudF90CQkqZXh0cDsKIAl4ZnNfZnNibG9ja190CQlzdGFydGJsb2NrX2ZzYjsKIAotCUFTU0VSVCghKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfUkVDT1ZFUkVEKSk7CisJQVNTRVJUKCF0ZXN0X2JpdChYRlNfRUZJX1JFQ09WRVJFRCwgJmVmaXAtPmVmaV9mbGFncykpOwogCiAJLyoKIAkgKiBGaXJzdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGV4dGVudHMgZGVzY3JpYmVkIGJ5IHRoZQpAQCAtMzA1MCw3ICsyOTE0LDcgQEAKIAkJCQkJIGV4dHAtPmV4dF9sZW4pOwogCX0KIAotCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX1JFQ09WRVJFRDsKKwlzZXRfYml0KFhGU19FRklfUkVDT1ZFUkVELCAmZWZpcC0+ZWZpX2ZsYWdzKTsKIAllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDApOwogCXJldHVybiBlcnJvcjsKIApAQCAtMzEwNyw3ICsyOTcxLDcgQEAKIAkJICogU2tpcCBFRklzIHRoYXQgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQuCiAJCSAqLwogCQllZmlwID0gKHhmc19lZmlfbG9nX2l0ZW1fdCAqKWxpcDsKLQkJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfUkVDT1ZFUkVEKSB7CisJCWlmICh0ZXN0X2JpdChYRlNfRUZJX1JFQ09WRVJFRCwgJmVmaXAtPmVmaV9mbGFncykpIHsKIAkJCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX25leHQoYWlscCwgJmN1cik7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzcyNCw3ICszNTg4LDcgQEAKIAl4ZnNfZGFkZHJfdAloZWFkX2JsaywKIAl4ZnNfZGFkZHJfdAl0YWlsX2JsaykKIHsKLQlpbnQJCWVycm9yOworCWludAkJZXJyb3IsIGk7CiAKIAlBU1NFUlQoaGVhZF9ibGsgIT0gdGFpbF9ibGspOwogCkBAIC0zNzMyLDEwICszNTk2LDEyIEBACiAJICogRmlyc3QgZG8gYSBwYXNzIHRvIGZpbmQgYWxsIG9mIHRoZSBjYW5jZWxsZWQgYnVmIGxvZyBpdGVtcy4KIAkgKiBTdG9yZSB0aGVtIGluIHRoZSBidWZfY2FuY2VsX3RhYmxlIGZvciB1c2UgaW4gdGhlIHNlY29uZCBwYXNzLgogCSAqLwotCWxvZy0+bF9idWZfY2FuY2VsX3RhYmxlID0KLQkJKHhmc19idWZfY2FuY2VsX3QgKiopa21lbV96YWxsb2MoWExPR19CQ19UQUJMRV9TSVpFICoKLQkJCQkJCSBzaXplb2YoeGZzX2J1Zl9jYW5jZWxfdCopLAorCWxvZy0+bF9idWZfY2FuY2VsX3RhYmxlID0ga21lbV96YWxsb2MoWExPR19CQ19UQUJMRV9TSVpFICoKKwkJCQkJCSBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCiAJCQkJCQkgS01fU0xFRVApOworCWZvciAoaSA9IDA7IGkgPCBYTE9HX0JDX1RBQkxFX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlW2ldKTsKKwogCWVycm9yID0geGxvZ19kb19yZWNvdmVyeV9wYXNzKGxvZywgaGVhZF9ibGssIHRhaWxfYmxrLAogCQkJCSAgICAgIFhMT0dfUkVDT1ZFUl9QQVNTMSk7CiAJaWYgKGVycm9yICE9IDApIHsKQEAgLTM3NTQsNyArMzYyMCw3IEBACiAJCWludAlpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBYTE9HX0JDX1RBQkxFX1NJWkU7IGkrKykKLQkJCUFTU0VSVChsb2ctPmxfYnVmX2NhbmNlbF90YWJsZVtpXSA9PSBOVUxMKTsKKwkJCUFTU0VSVChsaXN0X2VtcHR5KCZsb2ctPmxfYnVmX2NhbmNlbF90YWJsZVtpXSkpOwogCX0KICNlbmRpZgkvKiBERUJVRyAqLwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggMTllOWRmYS4uZDQ0N2FlZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAJCQlnb3RvIG91dF91bndpbmQ7CiAJCXBhZy0+cGFnX2Fnbm8gPSBpbmRleDsKIAkJcGFnLT5wYWdfbW91bnQgPSBtcDsKLQkJcndsb2NrX2luaXQoJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJbXV0ZXhfaW5pdCgmcGFnLT5wYWdfaWNpX3JlY2xhaW1fbG9jayk7CiAJCUlOSVRfUkFESVhfVFJFRSgmcGFnLT5wYWdfaWNpX3Jvb3QsIEdGUF9BVE9NSUMpOwogCQlzcGluX2xvY2tfaW5pdCgmcGFnLT5wYWdfYnVmX2xvY2spOwpAQCAtOTc1LDYgKzk3NSwyNCBAQAogfQogCiAvKgorICogcHJlY2FsY3VsYXRlIHRoZSBsb3cgc3BhY2UgdGhyZXNob2xkcyBmb3IgZHluYW1pYyBzcGVjdWxhdGl2ZSBwcmVhbGxvY2F0aW9uLgorICovCit2b2lkCit4ZnNfc2V0X2xvd19zcGFjZV90aHJlc2hvbGRzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFhGU19MT1dTUF9NQVg7IGkrKykgeworCQlfX3VpbnQ2NF90IHNwYWNlID0gbXAtPm1fc2Iuc2JfZGJsb2NrczsKKworCQlkb19kaXYoc3BhY2UsIDEwMCk7CisJCW1wLT5tX2xvd19zcGFjZVtpXSA9IHNwYWNlICogKGkgKyAxKTsKKwl9Cit9CisKKworLyoKICAqIFNldCB3aGV0aGVyIHdlJ3JlIHVzaW5nIGlub2RlIGFsaWdubWVudC4KICAqLwogU1RBVElDIHZvaWQKQEAgLTExOTYsNiArMTIxNCw5IEBACiAJICovCiAJeGZzX3NldF9yd19zaXplcyhtcCk7CiAKKwkvKiBzZXQgdGhlIGxvdyBzcGFjZSB0aHJlc2hvbGRzIGZvciBkeW5hbWljIHByZWFsbG9jYXRpb24gKi8KKwl4ZnNfc2V0X2xvd19zcGFjZV90aHJlc2hvbGRzKG1wKTsKKwogCS8qCiAJICogU2V0IHRoZSBpbm9kZSBjbHVzdGVyIHNpemUuCiAJICogVGhpcyBtYXkgc3RpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmlsZSBzeXN0ZW0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCA1ODYxYjQ5Li5hNjJlODk3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC0xMDMsNiArMTAzLDE2IEBACiAJeGZzX21vZF9pbmNvcmVfc2IobXAsIGZpZWxkLCBkZWx0YSwgcnN2ZCkKICNlbmRpZgogCisvKiBkeW5hbWljIHByZWFsbG9jYXRpb24gZnJlZSBzcGFjZSB0aHJlc2hvbGRzLCA1JSBkb3duIHRvIDElICovCitlbnVtIHsKKwlYRlNfTE9XU1BfMV9QQ05UID0gMCwKKwlYRlNfTE9XU1BfMl9QQ05ULAorCVhGU19MT1dTUF8zX1BDTlQsCisJWEZTX0xPV1NQXzRfUENOVCwKKwlYRlNfTE9XU1BfNV9QQ05ULAorCVhGU19MT1dTUF9NQVgsCit9OworCiB0eXBlZGVmIHN0cnVjdCB4ZnNfbW91bnQgewogCXN0cnVjdCBzdXBlcl9ibG9jawkqbV9zdXBlcjsKIAl4ZnNfdGlkX3QJCW1fdGlkOwkJLyogbmV4dCB1bnVzZWQgdGlkIGZvciBmcyAqLwpAQCAtMjAyLDYgKzIxMiw4IEBACiAJX19pbnQ2NF90CQltX3VwZGF0ZV9mbGFnczsJLyogc2IgZmxhZ3Mgd2UgbmVlZCB0byB1cGRhdGUKIAkJCQkJCSAgIG9uIHRoZSBuZXh0IHJlbW91bnQscncgKi8KIAlzdHJ1Y3Qgc2hyaW5rZXIJCW1faW5vZGVfc2hyaW5rOwkvKiBpbm9kZSByZWNsYWltIHNocmlua2VyICovCisJaW50NjRfdAkJCW1fbG93X3NwYWNlW1hGU19MT1dTUF9NQVhdOworCQkJCQkJLyogbG93IGZyZWUgc3BhY2UgdGhyZXNob2xkcyAqLwogfSB4ZnNfbW91bnRfdDsKIAogLyoKQEAgLTM3OSw2ICszOTEsOCBAQAogCiBleHRlcm4gaW50CXhmc19kZXZfaXNfcmVhZF9vbmx5KHN0cnVjdCB4ZnNfbW91bnQgKiwgY2hhciAqKTsKIAorZXh0ZXJuIHZvaWQJeGZzX3NldF9sb3dfc3BhY2VfdGhyZXNob2xkcyhzdHJ1Y3QgeGZzX21vdW50ICopOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiBleHRlcm4gdm9pZAl4ZnNfbW9kX3NiKHN0cnVjdCB4ZnNfdHJhbnMgKiwgX19pbnQ2NF90KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCBmNmQ5NTZiLi5mODBhMDY3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogICogdGhleSBjb3VsZCBiZSBpbW1lZGlhdGVseSBmbHVzaGVkIGFuZCB3ZSdkIGhhdmUgdG8gcmFjZSB3aXRoIHRoZSBmbHVzaGVyCiAgKiB0cnlpbmcgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgYXMgd2UgYWRkIGl0LgogICovCi12b2lkCitzdGF0aWMgdm9pZAogeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKAogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWNvbW1pdF9sc24sCkBAIC0xNDI1LDYgKzE0MjUsODMgQEAKIAl4ZnNfdHJhbnNfZnJlZSh0cCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2xvZ19pdGVtX2JhdGNoX2luc2VydCgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqKmxvZ19pdGVtcywKKwlpbnQJCQlucl9pdGVtcywKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24pCit7CisJaW50CWk7CisKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCS8qIHhmc190cmFuc19haWxfdXBkYXRlX2J1bGsgZHJvcHMgYWlscC0+eGFfbG9jayAqLworCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoYWlscCwgbG9nX2l0ZW1zLCBucl9pdGVtcywgY29tbWl0X2xzbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXRlbXM7IGkrKykKKwkJSU9QX1VOUElOKGxvZ19pdGVtc1tpXSwgMCk7Cit9CisKKy8qCisgKiBCdWxrIG9wZXJhdGlvbiB2ZXJzaW9uIG9mIHhmc190cmFuc19jb21taXR0ZWQgdGhhdCB0YWtlcyBhIGxvZyB2ZWN0b3Igb2YKKyAqIGl0ZW1zIHRvIGluc2VydCBpbnRvIHRoZSBBSUwuIFRoaXMgdXNlcyBidWxrIEFJTCBpbnNlcnRpb24gdGVjaG5pcXVlcyB0bworICogbWluaW1pc2UgbG9jayB0cmFmZmljLgorICovCit2b2lkCit4ZnNfdHJhbnNfY29tbWl0dGVkX2J1bGsoCisJc3RydWN0IHhmc19haWwJCSphaWxwLAorCXN0cnVjdCB4ZnNfbG9nX3ZlYwkqbG9nX3ZlY3RvciwKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24sCisJaW50CQkJYWJvcnRlZCkKK3sKKyNkZWZpbmUgTE9HX0lURU1fQkFUQ0hfU0laRQkzMgorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxvZ19pdGVtc1tMT0dfSVRFTV9CQVRDSF9TSVpFXTsKKwlzdHJ1Y3QgeGZzX2xvZ192ZWMJKmx2OworCWludAkJCWkgPSAwOworCisJLyogdW5waW4gYWxsIHRoZSBsb2cgaXRlbXMgKi8KKwlmb3IgKGx2ID0gbG9nX3ZlY3RvcjsgbHY7IGx2ID0gbHYtPmx2X25leHQgKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCA9IGx2LT5sdl9pdGVtOworCQl4ZnNfbHNuX3QJCWl0ZW1fbHNuOworCisJCWlmIChhYm9ydGVkKQorCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKKwkJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgY29tbWl0X2xzbik7CisKKwkJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gd2FzIGZyZWVkICovCisJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgKHhmc19sc25fdCktMSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpdGVtX2xzbiAhPSBjb21taXRfbHNuKSB7CisKKwkJCS8qCisJCQkgKiBOb3QgYSBidWxrIHVwZGF0ZSBvcHRpb24gZHVlIHRvIHVudXN1YWwgaXRlbV9sc24uCisJCQkgKiBQdXNoIGludG8gQUlMIGltbWVkaWF0ZWx5LCByZWNoZWNraW5nIHRoZSBsc24gb25jZQorCQkJICogd2UgaGF2ZSB0aGUgYWlsIGxvY2suIFRoZW4gdW5waW4gdGhlIGl0ZW0uCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJCQlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sIGxpcC0+bGlfbHNuKSA+IDApCisJCQkJeGZzX3RyYW5zX2FpbF91cGRhdGUoYWlscCwgbGlwLCBpdGVtX2xzbik7CisJCQllbHNlCisJCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCQkJSU9QX1VOUElOKGxpcCwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEl0ZW0gaXMgYSBjYW5kaWRhdGUgZm9yIGJ1bGsgQUlMIGluc2VydC4gICovCisJCWxvZ19pdGVtc1tpKytdID0gbHYtPmx2X2l0ZW07CisJCWlmIChpID49IExPR19JVEVNX0JBVENIX1NJWkUpIHsKKwkJCXhmc19sb2dfaXRlbV9iYXRjaF9pbnNlcnQoYWlscCwgbG9nX2l0ZW1zLAorCQkJCQlMT0dfSVRFTV9CQVRDSF9TSVpFLCBjb21taXRfbHNuKTsKKwkJCWkgPSAwOworCQl9CisJfQorCisJLyogbWFrZSBzdXJlIHdlIGluc2VydCB0aGUgcmVtYWluZGVyISAqLworCWlmIChpKQorCQl4ZnNfbG9nX2l0ZW1fYmF0Y2hfaW5zZXJ0KGFpbHAsIGxvZ19pdGVtcywgaSwgY29tbWl0X2xzbik7Cit9CisKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aGUgdHJhbnNfY29tbWl0IGNvZGUgd2hlbiB3ZSBub3RpY2UgdGhhdAogICogdGhlIGZpbGVzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGZvcmNlZCBzaHV0ZG93bi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCAyNDYyODZiLi5jMjA0MmI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC0yOTQsOCArMjk0LDggQEAKICNkZWZpbmUJWEZTX0FMTE9DX0JUUkVFX1JFRgkyCiAjZGVmaW5lCVhGU19CTUFQX0JUUkVFX1JFRgkyCiAjZGVmaW5lCVhGU19ESVJfQlRSRUVfUkVGCTIKKyNkZWZpbmUJWEZTX0lOT19SRUYJCTIKICNkZWZpbmUJWEZTX0FUVFJfQlRSRUVfUkVGCTEKLSNkZWZpbmUJWEZTX0lOT19SRUYJCTEKICNkZWZpbmUJWEZTX0RRVU9UX1JFRgkJMQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19haWwuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKaW5kZXggZGM5MDY5NS4uYzViYmJjNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0yOCw4ICsyOCw4IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAotU1RBVElDIHZvaWQgeGZzX2FpbF9pbnNlcnQoc3RydWN0IHhmc19haWwgKiwgeGZzX2xvZ19pdGVtX3QgKik7Ci1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX2RlbGV0ZShzdHJ1Y3QgeGZzX2FpbCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB2b2lkIHhmc19haWxfc3BsaWNlKHN0cnVjdCB4ZnNfYWlsICosIHN0cnVjdCBsaXN0X2hlYWQgKiwgeGZzX2xzbl90KTsKK1NUQVRJQyB2b2lkIHhmc19haWxfZGVsZXRlKHN0cnVjdCB4ZnNfYWlsICosIHhmc19sb2dfaXRlbV90ICopOwogU1RBVElDIHhmc19sb2dfaXRlbV90ICogeGZzX2FpbF9taW4oc3RydWN0IHhmc19haWwgKik7CiBTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX25leHQoc3RydWN0IHhmc19haWwgKiwgeGZzX2xvZ19pdGVtX3QgKik7CiAKQEAgLTQ0OSwxMjkgKzQ0OSwxNTIgQEAKIAkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIDEpOwogfQkvKiB4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbSAqLwogCi0KIC8qCi0gKiBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBBSUwgd2l0aCB0aGUgbmV3Ci0gKiBsc24uICBJZiBpdCBpcyBub3QgeWV0IGluIHRoZSBBSUwsIGFkZCBpdC4gIE90aGVyd2lzZSwgbW92ZQotICogaXQgdG8gaXRzIG5ldyBwb3NpdGlvbiBieSByZW1vdmluZyBpdCBhbmQgcmUtYWRkaW5nIGl0LgorICogeGZzX3RyYW5zX2FpbF91cGRhdGUgLSBidWxrIEFJTCBpbnNlcnRpb24gb3BlcmF0aW9uLgogICoKLSAqIFdha2V1cCBhbnlvbmUgd2l0aCBhbiBsc24gbGVzcyB0aGFuIHRoZSBpdGVtJ3MgbHNuLiAgSWYgdGhlIGl0ZW0KLSAqIHdlIG1vdmUgaW4gdGhlIEFJTCBpcyB0aGUgbWluaW11bSBvbmUsIHVwZGF0ZSB0aGUgdGFpbCBsc24gaW4gdGhlCi0gKiBsb2cgbWFuYWdlci4KKyAqIEB4ZnNfdHJhbnNfYWlsX3VwZGF0ZSB0YWtlcyBhbiBhcnJheSBvZiBsb2cgaXRlbXMgdGhhdCBhbGwgbmVlZCB0byBiZQorICogcG9zaXRpb25lZCBhdCB0aGUgc2FtZSBMU04gaW4gdGhlIEFJTC4gSWYgYW4gaXRlbSBpcyBub3QgaW4gdGhlIEFJTCwgaXQgd2lsbAorICogYmUgYWRkZWQuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgcmVwb3NpdGlvbmVkICBieSByZW1vdmluZyBpdCBhbmQgcmUtYWRkaW5nCisgKiBpdCB0byB0aGUgQUlMLiBJZiB3ZSBtb3ZlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBBSUwsIHVwZGF0ZSB0aGUgbG9nIHRhaWwgdG8KKyAqIG1hdGNoIHRoZSBuZXcgbWluaW11bSBMU04gaW4gdGhlIEFJTC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawotICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgQUlMIGxvY2sgb25jZSB0byBleGVjdXRlIHRoZSB1cGRhdGUgb3BlcmF0aW9ucyBvbgorICogYWxsIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXksIGFuZCBhcyBzdWNoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTAorICogbG9jayBoZWxkLiBBcyBhIHJlc3VsdCwgb25jZSB3ZSBoYXZlIHRoZSBBSUwgbG9jaywgd2UgbmVlZCB0byBjaGVjayBlYWNoIGxvZworICogaXRlbSBMU04gdG8gY29uZmlybSBpdCBuZWVkcyB0byBiZSBtb3ZlZCBmb3J3YXJkIGluIHRoZSBBSUwuCisgKgorICogVG8gb3B0aW1pc2UgdGhlIGluc2VydCBvcGVyYXRpb24sIHdlIGRlbGV0ZSBhbGwgdGhlIGl0ZW1zIGZyb20gdGhlIEFJTCBpbgorICogdGhlIGZpcnN0IHBhc3MsIG1vdmluZyB0aGVtIGludG8gYSB0ZW1wb3JhcnkgbGlzdCwgdGhlbiBzcGxpY2UgdGhlIHRlbXBvcmFyeQorICogbGlzdCBpbnRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBBSUwuIFRoaXMgYXZvaWRzIG5lZWRpbmcgdG8gZG8gYW4KKyAqIGluc2VydCBvcGVyYXRpb24gb24gZXZlcnkgaXRlbS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jayBpcyBkcm9wcGVkCisgKiBiZWZvcmUgcmV0dXJuaW5nLgogICovCiB2b2lkCi14ZnNfdHJhbnNfYWlsX3VwZGF0ZSgKLQlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwLAotCXhmc19sc25fdAlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKK3hmc190cmFuc19haWxfdXBkYXRlX2J1bGsoCisJc3RydWN0IHhmc19haWwJCSphaWxwLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKipsb2dfaXRlbXMsCisJaW50CQkJbnJfaXRlbXMsCisJeGZzX2xzbl90CQlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKIHsKLQl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXAgPSBOVUxMOwotCXhmc19sb2dfaXRlbV90CQkqbWxpcDsJLyogcHRyIHRvIG1pbmltdW0gbGlwICovCisJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwogCXhmc19sc25fdAkJdGFpbF9sc247CisJaW50CQkJbWxpcF9jaGFuZ2VkID0gMDsKKwlpbnQJCQlpOworCUxJU1RfSEVBRCh0bXApOwogCiAJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOwogCi0JaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCWRsaXAgPSB4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwotCQlBU1NFUlQoZGxpcCA9PSBsaXApOwotCQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcihhaWxwLCBkbGlwKTsKLQl9IGVsc2UgewotCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9JTl9BSUw7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBucl9pdGVtczsgaSsrKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCA9IGxvZ19pdGVtc1tpXTsKKwkJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CisJCQkvKiBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byBtb3ZlIHRoZSBpdGVtICovCisJCQlpZiAoWEZTX0xTTl9DTVAobHNuLCBsaXAtPmxpX2xzbikgPD0gMCkKKwkJCQljb250aW51ZTsKIAotCWxpcC0+bGlfbHNuID0gbHNuOwotCXhmc19haWxfaW5zZXJ0KGFpbHAsIGxpcCk7Ci0KLQlpZiAobWxpcCA9PSBkbGlwKSB7Ci0JCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJLyoKLQkJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzCi0JCSAqIGRyb3BwZWQsIHNvIHdlIG11c3QgZ2V0IGEgY29weSBvZiBsaV9sc24gYmVmb3JlIHdlIGRvCi0JCSAqIHNvLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBvbiAzMi1iaXQgcGxhdGZvcm1zCi0JCSAqIHdoZXJlIGFjY2Vzc2luZyBhbmQgdXBkYXRpbmcgNjQtYml0IHZhbHVlcyBsaWtlIGxpX2xzbgotCQkgKiBpcyBub3QgYXRvbWljLgotCQkgKi8KLQkJdGFpbF9sc24gPSBtbGlwLT5saV9sc247Ci0JCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7Ci0JfQotCi0KLX0JLyogeGZzX3RyYW5zX3VwZGF0ZV9haWwgKi8KLQotLyoKLSAqIERlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBBSUwuICBJdCBtdXN0IGFscmVhZHkgYmUgaW4KLSAqIHRoZSBBSUwuCi0gKgotICogV2FrZXVwIGFueW9uZSB3aXRoIGFuIGxzbiBsZXNzIHRoYW4gaXRlbSdzIGxzbi4gICAgSWYgdGhlIGl0ZW0KLSAqIHdlIGRlbGV0ZSBpbiB0aGUgQUlMIGlzIHRoZSBtaW5pbXVtIG9uZSwgdXBkYXRlIHRoZSB0YWlsIGxzbiBpbiB0aGUKLSAqIGxvZyBtYW5hZ2VyLgotICoKLSAqIENsZWFyIHRoZSBJTl9BSUwgZmxhZyBmcm9tIHRoZSBpdGVtLCByZXNldCBpdHMgbHNuIHRvIDAsIGFuZAotICogYnVtcCB0aGUgQUlMJ3MgZ2VuZXJhdGlvbiBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlCi0gKiBoYXMgY2hhbmdlZC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawotICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgotICovCi12b2lkCi14ZnNfdHJhbnNfYWlsX2RlbGV0ZSgKLQlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spCi17Ci0JeGZzX2xvZ19pdGVtX3QJCSpkbGlwOwotCXhmc19sb2dfaXRlbV90CQkqbWxpcDsKLQl4ZnNfbHNuX3QJCXRhaWxfbHNuOwotCi0JaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJZGxpcCA9IHhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7Ci0JCUFTU0VSVChkbGlwID09IGxpcCk7Ci0JCXhmc190cmFuc19haWxfY3Vyc29yX2NsZWFyKGFpbHAsIGRsaXApOwotCi0KLQkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKLQkJbGlwLT5saV9sc24gPSAwOwotCi0JCWlmIChtbGlwID09IGRsaXApIHsKLQkJCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJCS8qCi0JCQkgKiBJdCBpcyBub3Qgc2FmZSB0byBhY2Nlc3MgbWxpcCBhZnRlciB0aGUgQUlMIGxvY2sKLQkJCSAqIGlzIGRyb3BwZWQsIHNvIHdlIG11c3QgZ2V0IGEgY29weSBvZiBsaV9sc24KLQkJCSAqIGJlZm9yZSB3ZSBkbyBzby4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQKLQkJCSAqIG9uIDMyLWJpdCBwbGF0Zm9ybXMgd2hlcmUgYWNjZXNzaW5nIGFuZCB1cGRhdGluZwotCQkJICogNjQtYml0IHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLgotCQkJICovCi0JCQl0YWlsX2xzbiA9IG1saXAgPyBtbGlwLT5saV9sc24gOiAwOwotCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwotCQkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKKwkJCXhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJCQlpZiAobWxpcCA9PSBsaXApCisJCQkJbWxpcF9jaGFuZ2VkID0gMTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0lOX0FJTDsKIAkJfQorCQlsaXAtPmxpX2xzbiA9IGxzbjsKKwkJbGlzdF9hZGQoJmxpcC0+bGlfYWlsLCAmdG1wKTsKIAl9Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBmaWxlIHN5c3RlbSBpcyBub3QgYmVpbmcgc2h1dGRvd24sIHdlIGFyZSBpbgotCQkgKiBzZXJpb3VzIHRyb3VibGUgaWYgd2UgZ2V0IHRvIHRoaXMgc3RhZ2UuCi0JCSAqLwotCQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGFpbHAtPnhhX21vdW50OwogCisJeGZzX2FpbF9zcGxpY2UoYWlscCwgJnRtcCwgbHNuKTsKKworCWlmICghbWxpcF9jaGFuZ2VkKSB7CiAJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCi0JCSIlczogYXR0ZW1wdGluZyB0byBkZWxldGUgYSBsb2cgaXRlbSB0aGF0IGlzIG5vdCBpbiB0aGUgQUlMIiwKLQkJCQkJX19mdW5jX18pOwotCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBTSFVURE9XTl9DT1JSVVBUX0lOQ09SRSk7Ci0JCX0KKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzIGRyb3BwZWQsIHNvIHdlCisJICogbXVzdCBnZXQgYSBjb3B5IG9mIGxpX2xzbiBiZWZvcmUgd2UgZG8gc28uICBUaGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgb24gMzItYml0IHBsYXRmb3JtcyB3aGVyZSBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIDY0LWJpdAorCSAqIHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLgorCSAqLworCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwl0YWlsX2xzbiA9IG1saXAtPmxpX2xzbjsKKwlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKIH0KIAorLyoKKyAqIHhmc190cmFuc19haWxfZGVsZXRlX2J1bGsgLSByZW1vdmUgbXVsdGlwbGUgbG9nIGl0ZW1zIGZyb20gdGhlIEFJTAorICoKKyAqIEB4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrIHRha2VzIGFuIGFycmF5IG9mIGxvZyBpdGVtcyB0aGF0IGFsbCBuZWVkIHRvCisgKiByZW1vdmVkIGZyb20gdGhlIEFJTC4gVGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhlIEFJTCBsb2NrLCBhbmQgZG9uZQorICogYWxsIHRoZSBjaGVja3MgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgaXRlbXMgcGFzc2VkIGluIHZpYSBAbG9nX2l0ZW1zIGFyZQorICogcmVhZHkgZm9yIGRlbGV0aW9uLiBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoYXQgdGhlIGl0ZW1zIGFyZSBpbiB0aGUgQUlMLgorICoKKyAqIEZvciBlYWNoIGxvZyBpdGVtIHRvIGJlIHJlbW92ZWQsIHVubGluayBpdCAgZnJvbSB0aGUgQUlMLCBjbGVhciB0aGUgSU5fQUlMCisgKiBmbGFnIGZyb20gdGhlIGl0ZW0gYW5kIHJlc2V0IHRoZSBpdGVtJ3MgbHNuIHRvIDAuIElmIHdlIHJlbW92ZSB0aGUgZmlyc3QKKyAqIGl0ZW0gaW4gdGhlIEFJTCwgdXBkYXRlIHRoZSBsb2cgdGFpbCB0byBtYXRjaCB0aGUgbmV3IG1pbmltdW0gTFNOIGluIHRoZQorICogQUlMLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZHJvcCB0aGUgQUlMIGxvY2sgdW50aWwgYWxsIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20KKyAqIHRoZSBBSUwgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBsb2NrIHRyYWZmaWMgb24gdGhlIEFJTC4gVGhpcyBkb2VzIG5vdAorICogZ3JlYXRseSBpbmNyZWFzZSB0aGUgQUlMIGhvbGQgdGltZSwgYnV0IGRvZXMgc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlIGFtb3VudAorICogb2YgdHJhZmZpYyBvbiB0aGUgbG9jaywgZXNwZWNpYWxseSBkdXJpbmcgSU8gY29tcGxldGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jayBpcyBkcm9wcGVkCisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICovCit2b2lkCit4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrKAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSoqbG9nX2l0ZW1zLAorCWludAkJCW5yX2l0ZW1zKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spCit7CisJeGZzX2xvZ19pdGVtX3QJCSptbGlwOworCXhmc19sc25fdAkJdGFpbF9sc247CisJaW50CQkJbWxpcF9jaGFuZ2VkID0gMDsKKwlpbnQJCQlpOwogCisJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOworCisJZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zOyBpKyspIHsKKwkJc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwID0gbG9nX2l0ZW1zW2ldOworCQlpZiAoIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKKwkJCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gYWlscC0+eGFfbW91bnQ7CisKKwkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCQl4ZnNfY21uX2VycihYRlNfUFRBR19BSUxERUxFVEUsIENFX0FMRVJULCBtcCwKKwkJIiVzOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGxvZyBpdGVtIHRoYXQgaXMgbm90IGluIHRoZSBBSUwiLAorCQkJCQkJX19mdW5jX18pOworCQkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgU0hVVERPV05fQ09SUlVQVF9JTkNPUkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJeGZzX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKKwkJbGlwLT5saV9sc24gPSAwOworCQlpZiAobWxpcCA9PSBsaXApCisJCQltbGlwX2NoYW5nZWQgPSAxOworCX0KKworCWlmICghbWxpcF9jaGFuZ2VkKSB7CisJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzIGRyb3BwZWQsIHNvIHdlCisJICogbXVzdCBnZXQgYSBjb3B5IG9mIGxpX2xzbiBiZWZvcmUgd2UgZG8gc28uICBUaGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgb24gMzItYml0IHBsYXRmb3JtcyB3aGVyZSBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIDY0LWJpdAorCSAqIHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLiBJdCBpcyBwb3NzaWJsZSB3ZSd2ZSBlbXB0aWVkIHRoZQorCSAqIEFJTCBoZXJlLCBzbyBpZiB0aGF0IGlzIHRoZSBjYXNlLCBwYXNzIGFuIExTTiBvZiAwIHRvIHRoZSB0YWlsIG1vdmUuCisJICovCisJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOworCXRhaWxfbHNuID0gbWxpcCA/IG1saXAtPmxpX2xzbiA6IDA7CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCXhmc19sb2dfbW92ZV90YWlsKGFpbHAtPnhhX21vdW50LCB0YWlsX2xzbik7Cit9CiAKIC8qCiAgKiBUaGUgYWN0aXZlIGl0ZW0gbGlzdCAoQUlMKSBpcyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBsb2cKQEAgLTYyMywxNiArNjQ2LDEzIEBACiB9CiAKIC8qCi0gKiBJbnNlcnQgdGhlIGdpdmVuIGxvZyBpdGVtIGludG8gdGhlIEFJTC4KLSAqIFdlIGFsbW9zdCBhbHdheXMgaW5zZXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIG9uIGluc2VydHMKLSAqIHdlIHNlYXJjaCBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QgdG8gZmluZCB3aGVyZSB0aGUKLSAqIG5ldyBpdGVtIGJlbG9uZ3MuCisgKiBzcGxpY2UgdGhlIGxvZyBpdGVtIGxpc3QgaW50byB0aGUgQUlMIGF0IHRoZSBnaXZlbiBMU04uCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfYWlsX2luc2VydCgKK3hmc19haWxfc3BsaWNlKAogCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAotCXhmc19sb2dfaXRlbV90CSpsaXApCi0vKiBBUkdTVVNFRCAqLworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJeGZzX2xzbl90CWxzbikKIHsKIAl4ZnNfbG9nX2l0ZW1fdAkqbmV4dF9saXA7CiAKQEAgLTY0MCwzOSArNjYwLDMzIEBACiAJICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIGp1c3QgaW5zZXJ0IHRoZSBpdGVtLgogCSAqLwogCWlmIChsaXN0X2VtcHR5KCZhaWxwLT54YV9haWwpKSB7Ci0JCWxpc3RfYWRkKCZsaXAtPmxpX2FpbCwgJmFpbHAtPnhhX2FpbCk7CisJCWxpc3Rfc3BsaWNlKGxpc3QsICZhaWxwLT54YV9haWwpOwogCQlyZXR1cm47CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKG5leHRfbGlwLCAmYWlscC0+eGFfYWlsLCBsaV9haWwpIHsKLQkJaWYgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA8PSAwKQorCQlpZiAoWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbHNuKSA8PSAwKQogCQkJYnJlYWs7CiAJfQogCiAJQVNTRVJUKCgmbmV4dF9saXAtPmxpX2FpbCA9PSAmYWlscC0+eGFfYWlsKSB8fAotCSAgICAgICAoWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pIDw9IDApKTsKKwkgICAgICAgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxzbikgPD0gMCkpOwogCi0JbGlzdF9hZGQoJmxpcC0+bGlfYWlsLCAmbmV4dF9saXAtPmxpX2FpbCk7Ci0KLQl4ZnNfYWlsX2NoZWNrKGFpbHAsIGxpcCk7CisJbGlzdF9zcGxpY2VfaW5pdChsaXN0LCAmbmV4dF9saXAtPmxpX2FpbCk7CiAJcmV0dXJuOwogfQogCiAvKgogICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIEFJTC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGl0ZW0uCiAgKi8KLS8qQVJHU1VTRUQqLwotU1RBVElDIHhmc19sb2dfaXRlbV90ICoKK1NUQVRJQyB2b2lkCiB4ZnNfYWlsX2RlbGV0ZSgKIAlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKIAl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQotLyogQVJHU1VTRUQgKi8KIHsKIAl4ZnNfYWlsX2NoZWNrKGFpbHAsIGxpcCk7Ci0KIAlsaXN0X2RlbCgmbGlwLT5saV9haWwpOwotCi0JcmV0dXJuIGxpcDsKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcihhaWxwLCBsaXApOwogfQogCiAvKgpAQCAtNjgyLDcgKzY5Niw2IEBACiBTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgogeGZzX2FpbF9taW4oCiAJc3RydWN0IHhmc19haWwJKmFpbHApCi0vKiBBUkdTVVNFRCAqLwogewogCWlmIChsaXN0X2VtcHR5KCZhaWxwLT54YV9haWwpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTY5OSw3ICs3MTIsNiBAQAogeGZzX2FpbF9uZXh0KAogCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAogCXhmc19sb2dfaXRlbV90CSpsaXApCi0vKiBBUkdTVVNFRCAqLwogewogCWlmIChsaXAtPmxpX2FpbC5uZXh0ID09ICZhaWxwLT54YV9haWwpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwppbmRleCBmNzgzZDVlLi5mNzU5MGY1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwpAQCAtNjksMTIgKzY5LDE2IEBACiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwogCWVmaXAtPmVmaV9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOwogCi0JbmV4dF9leHRlbnQgPSBlZmlwLT5lZmlfbmV4dF9leHRlbnQ7CisJLyoKKwkgKiBhdG9taWNfaW5jX3JldHVybiBnaXZlcyB1cyB0aGUgdmFsdWUgYWZ0ZXIgdGhlIGluY3JlbWVudDsKKwkgKiB3ZSB3YW50IHRvIHVzZSBpdCBhcyBhbiBhcnJheSBpbmRleCBzbyB3ZSBuZWVkIHRvIHN1YnRyYWN0IDEgZnJvbQorCSAqIGl0LgorCSAqLworCW5leHRfZXh0ZW50ID0gYXRvbWljX2luY19yZXR1cm4oJmVmaXAtPmVmaV9uZXh0X2V4dGVudCkgLSAxOwogCUFTU0VSVChuZXh0X2V4dGVudCA8IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKIAlleHRwID0gJihlZmlwLT5lZmlfZm9ybWF0LmVmaV9leHRlbnRzW25leHRfZXh0ZW50XSk7CiAJZXh0cC0+ZXh0X3N0YXJ0ID0gc3RhcnRfYmxvY2s7CiAJZXh0cC0+ZXh0X2xlbiA9IGV4dF9sZW47Ci0JZWZpcC0+ZWZpX25leHRfZXh0ZW50Kys7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19wcml2LmggYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAppbmRleCA2MmRhODZjLi4zNTE2MmMyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaApAQCAtMjIsMTUgKzIyLDE3IEBACiBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2M7CiBzdHJ1Y3QgeGZzX21vdW50Owogc3RydWN0IHhmc190cmFuczsKK3N0cnVjdCB4ZnNfYWlsOworc3RydWN0IHhmc19sb2dfdmVjOwogCiB2b2lkCXhmc190cmFuc19hZGRfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CiB2b2lkCXhmc190cmFuc19kZWxfaXRlbShzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwogdm9pZAl4ZnNfdHJhbnNfZnJlZV9pdGVtcyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgeGZzX2xzbl90IGNvbW1pdF9sc24sCiAJCQkJaW50IGZsYWdzKTsKLXZvaWQJeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCwKLQkJCQl4ZnNfbHNuX3QgY29tbWl0X2xzbiwgaW50IGFib3J0ZWQpOwogdm9pZAl4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2Rfc2Ioc3RydWN0IHhmc190cmFucyAqdHApOwogCit2b2lkCXhmc190cmFuc19jb21taXR0ZWRfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwgc3RydWN0IHhmc19sb2dfdmVjICpsdiwKKwkJCQl4ZnNfbHNuX3QgY29tbWl0X2xzbiwgaW50IGFib3J0ZWQpOwogLyoKICAqIEFJTCB0cmF2ZXJzYWwgY3Vyc29yLgogICoKQEAgLTczLDEyICs3NSwyOSBAQAogLyoKICAqIEZyb20geGZzX3RyYW5zX2FpbC5jCiAgKi8KLXZvaWQJCQl4ZnNfdHJhbnNfYWlsX3VwZGF0ZShzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKLQkJCQkJc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwLCB4ZnNfbHNuX3QgbHNuKQotCQkJCQlfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spOwotdm9pZAkJCXhmc190cmFuc19haWxfZGVsZXRlKHN0cnVjdCB4ZnNfYWlsICphaWxwLAotCQkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXApCi0JCQkJCV9fcmVsZWFzZXMoYWlscC0+eGFfbG9jayk7Cit2b2lkCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoc3RydWN0IHhmc19haWwgKmFpbHAsCisJCQkJc3RydWN0IHhmc19sb2dfaXRlbSAqKmxvZ19pdGVtcywgaW50IG5yX2l0ZW1zLAorCQkJCXhmc19sc25fdCBsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jayk7CitzdGF0aWMgaW5saW5lIHZvaWQKK3hmc190cmFuc19haWxfdXBkYXRlKAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKK3sKKwl4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKGFpbHAsICZsaXAsIDEsIGxzbik7Cit9CisKK3ZvaWQJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKKwkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICoqbG9nX2l0ZW1zLCBpbnQgbnJfaXRlbXMpCisJCQkJX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX3RyYW5zX2FpbF9kZWxldGUoCisJc3RydWN0IHhmc19haWwJKmFpbHAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCkgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKQoreworCXhmc190cmFuc19haWxfZGVsZXRlX2J1bGsoYWlscCwgJmxpcCwgMSk7Cit9CisKIHZvaWQJCQl4ZnNfdHJhbnNfYWlsX3B1c2goc3RydWN0IHhmc19haWwgKiwgeGZzX2xzbl90KTsKIHZvaWQJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShzdHJ1Y3QgeGZzX2FpbCAqLAogCQkJCQl4ZnNfbG9nX2l0ZW1fdCAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCA4ZTRhNjNjNC4uZDhlNmY4YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtOTY0LDI5ICs5NjQsNDggQEAKIAkJCXhmc19mbHVzaF9wYWdlcyhpcCwgMCwgLTEsIFhCRl9BU1lOQywgRklfTk9ORSk7CiAJfQogCi0JaWYgKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCkgewotCQlpZiAoKCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSAmJgotCQkgICAgICgoaXAtPmlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQoVkZTX0koaXApKSA+IDAgfHwKLQkJICAgICAgIGlwLT5pX2RlbGF5ZWRfYmxrcyA+IDApKSAmJgotCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKLQkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJgotCQkJCShYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19BUFBFTkQpKSkpIHsKKwlpZiAoaXAtPmlfZC5kaV9ubGluayA9PSAwKQorCQlyZXR1cm4gMDsKIAotCQkJLyoKLQkJCSAqIElmIHdlIGNhbid0IGdldCB0aGUgaW9sb2NrIGp1c3Qgc2tpcCB0cnVuY2F0aW5nCi0JCQkgKiB0aGUgYmxvY2tzIHBhc3QgRU9GIGJlY2F1c2Ugd2UgY291bGQgZGVhZGxvY2sKLQkJCSAqIHdpdGggdGhlIG1tYXBfc2VtIG90aGVyd2lzZS4gIFdlJ2xsIGdldCBhbm90aGVyCi0JCQkgKiBjaGFuY2UgdG8gZHJvcCB0aGVtIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIHRvCi0JCQkgKiB0aGUgaW5vZGUgaXMgZHJvcHBlZCwgc28gd2UnbGwgbmV2ZXIgbGVhayBibG9ja3MKLQkJCSAqIHBlcm1hbmVudGx5LgotCQkJICovCi0JCQllcnJvciA9IHhmc19mcmVlX2VvZmJsb2NrcyhtcCwgaXAsCi0JCQkJCQkgICBYRlNfRlJFRV9FT0ZfVFJZTE9DSyk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJcmV0dXJuIGVycm9yOwotCQl9CisJaWYgKCgoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgJiYKKwkgICAgICgoaXAtPmlfc2l6ZSA+IDApIHx8IChWTl9DQUNIRUQoVkZTX0koaXApKSA+IDAgfHwKKwkgICAgICAgaXAtPmlfZGVsYXllZF9ibGtzID4gMCkpICYmCisJICAgICAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSkgICYmCisJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfQVBQRU5EKSkpKSB7CisKKwkJLyoKKwkJICogSWYgd2UgY2FuJ3QgZ2V0IHRoZSBpb2xvY2sganVzdCBza2lwIHRydW5jYXRpbmcgdGhlIGJsb2NrcworCQkgKiBwYXN0IEVPRiBiZWNhdXNlIHdlIGNvdWxkIGRlYWRsb2NrIHdpdGggdGhlIG1tYXBfc2VtCisJCSAqIG90aGVyd2lzZS4gIFdlJ2xsIGdldCBhbm90aGVyIGNoYW5jZSB0byBkcm9wIHRoZW0gb25jZSB0aGUKKwkJICogbGFzdCByZWZlcmVuY2UgdG8gdGhlIGlub2RlIGlzIGRyb3BwZWQsIHNvIHdlJ2xsIG5ldmVyIGxlYWsKKwkJICogYmxvY2tzIHBlcm1hbmVudGx5LgorCQkgKgorCQkgKiBGdXJ0aGVyLCBjaGVjayBpZiB0aGUgaW5vZGUgaXMgYmVpbmcgb3BlbmVkLCB3cml0dGVuIGFuZAorCQkgKiBjbG9zZWQgZnJlcXVlbnRseSBhbmQgd2UgaGF2ZSBkZWxheWVkIGFsbG9jYXRpb24gYmxvY2tzCisJCSAqIG91c3RhbmRpbmcgKGUuZy4gc3RyZWFtaW5nIHdyaXRlcyBmcm9tIHRoZSBORlMgc2VydmVyKSwKKwkJICogdHJ1bmNhdGluZyB0aGUgYmxvY2tzIHBhc3QgRU9GIHdpbGwgY2F1c2UgZnJhZ21lbnRhdGlvbiB0bworCQkgKiBvY2N1ci4KKwkJICoKKwkJICogSW4gdGhpcyBjYXNlIGRvbid0IGRvIHRoZSB0cnVuY2F0aW9uLCBlaXRoZXIsIGJ1dCB3ZSBoYXZlIHRvCisJCSAqIGJlIGNhcmVmdWwgaG93IHdlIGRldGVjdCB0aGlzIGNhc2UuIEJsb2NrcyBiZXlvbmQgRU9GIHNob3cKKwkJICogdXAgYXMgaV9kZWxheWVkX2Jsa3MgZXZlbiB3aGVuIHRoZSBpbm9kZSBpcyBjbGVhbiwgc28gd2UKKwkJICogbmVlZCB0byB0cnVuY2F0ZSB0aGVtIGF3YXkgZmlyc3QgYmVmb3JlIGNoZWNraW5nIGZvciBhIGRpcnR5CisJCSAqIHJlbGVhc2UuIEhlbmNlIG9uIHRoZSBmaXJzdCBkaXJ0eSBjbG9zZSB3ZSB3aWxsIHN0aWxsIHJlbW92ZQorCQkgKiB0aGUgc3BlY3VsYXRpdmUgYWxsb2NhdGlvbiwgYnV0IGFmdGVyIHRoYXQgd2Ugd2lsbCBsZWF2ZSBpdAorCQkgKiBpbiBwbGFjZS4KKwkJICovCisJCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JRElSVFlfUkVMRUFTRSkpCisJCQlyZXR1cm4gMDsKKworCQllcnJvciA9IHhmc19mcmVlX2VvZmJsb2NrcyhtcCwgaXAsCisJCQkJCSAgIFhGU19GUkVFX0VPRl9UUllMT0NLKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCS8qIGRlbGFsbG9jIGJsb2NrcyBhZnRlciB0cnVuY2F0aW9uIG1lYW5zIGl0IHJlYWxseSBpcyBkaXJ0eSAqLworCQlpZiAoaXAtPmlfZGVsYXllZF9ibGtzKQorCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JRElSVFlfUkVMRUFTRSk7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggMzU5ZWYxMS4uNzhjYTQyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTE0OCw5ICsxNDgsNyBAQAogCXUzMiBzdXByaXNlX3JlbW92YWxfb2s6MTsKIAl1MzIgcG93ZXJfbWFuYWdlYWJsZToxOwogCXUzMiBwZXJmb3JtYW5jZV9tYW5hZ2VhYmxlOjE7Ci0JdTMyIHdha2VfY2FwYWJsZToxOwkvKiBXYWtldXAoX1BSVykgc3VwcG9ydGVkPyAqLwotCXUzMiBmb3JjZV9wb3dlcl9zdGF0ZToxOwotCXUzMiByZXNlcnZlZDoyMjsKKwl1MzIgcmVzZXJ2ZWQ6MjQ7CiB9OwogCiAvKiBGaWxlIFN5c3RlbSAqLwpAQCAtMjQyLDIwICsyNDAsMTQgQEAKIHN0cnVjdCBhY3BpX2RldmljZV93YWtldXBfZmxhZ3MgewogCXU4IHZhbGlkOjE7CQkvKiBDYW4gc3VjY2Vzc2Z1bGx5IGVuYWJsZSB3YWtldXA/ICovCiAJdTggcnVuX3dha2U6MTsJCS8qIFJ1bi1XYWtlIEdQRSBkZXZpY2VzICovCi0JdTggYWx3YXlzX2VuYWJsZWQ6MTsJLyogUnVuLXdha2UgZGV2aWNlcyB0aGF0IGFyZSBhbHdheXMgZW5hYmxlZCAqLwogCXU4IG5vdGlmaWVyX3ByZXNlbnQ6MTsgIC8qIFdha2UtdXAgbm90aWZ5IGhhbmRsZXIgaGFzIGJlZW4gaW5zdGFsbGVkICovCiB9OwogCi1zdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwX3N0YXRlIHsKLQl1OCBlbmFibGVkOjE7Ci19OwotCiBzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwIHsKIAlhY3BpX2hhbmRsZSBncGVfZGV2aWNlOwogCXU2NCBncGVfbnVtYmVyOwogCXU2NCBzbGVlcF9zdGF0ZTsKIAlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCByZXNvdXJjZXM7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX3dha2V1cF9zdGF0ZSBzdGF0ZTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2FrZXVwX2ZsYWdzIGZsYWdzOwogCWludCBwcmVwYXJlX2NvdW50OwogCWludCBydW5fd2FrZV9jb3VudDsKQEAgLTMyOCw4ICszMjAsOCBAQAogYWNwaV9zdGF0dXMgYWNwaV9idXNfZ2V0X3N0YXR1c19oYW5kbGUoYWNwaV9oYW5kbGUgaGFuZGxlLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKnN0YSk7CiBpbnQgYWNwaV9idXNfZ2V0X3N0YXR1cyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1pbnQgYWNwaV9idXNfZ2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50ICpzdGF0ZSk7CiBpbnQgYWNwaV9idXNfc2V0X3Bvd2VyKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHN0YXRlKTsKK2ludCBhY3BpX2J1c191cGRhdGVfcG93ZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnN0YXRlX3ApOwogYm9vbCBhY3BpX2J1c19wb3dlcl9tYW5hZ2VhYmxlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiBib29sIGFjcGlfYnVzX2Nhbl93YWtldXAoYWNwaV9oYW5kbGUgaGFuZGxlKTsKICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DX0VWRU5UCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggNTNiN2NmZC4uMjQxYjhhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDcsNyArNDcsNyBAQAogCiAvKiBDdXJyZW50IEFDUElDQSBzdWJzeXN0ZW0gdmVyc2lvbiBpbiBZWVlZTU1ERCBmb3JtYXQgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxMDEwMTMKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTAxMjA5CiAKICNpbmNsdWRlICJhY3R5cGVzLmgiCiAjaW5jbHVkZSAiYWN0YmwuaCIKQEAgLTIyOSw2ICsyMjksMTAgQEAKIGFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbik7CiAKIGFjcGlfc3RhdHVzCithY3BpX2luc3RhbGxfZ2xvYmFsX2V2ZW50X2hhbmRsZXIoQUNQSV9HQkxfRVZFTlRfSEFORExFUiBoYW5kbGVyLAorCQkJCSB2b2lkICpjb250ZXh0KTsKKworYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBhY3BpX2V2ZW50LAogCQkJCSBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCk7CiAKQEAgLTI1OCwxMSArMjYyLDExIEBACiBhY3BpX3N0YXR1cwogYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCiAJCQkgdTMyIGdwZV9udW1iZXIsCi0JCQkgdTMyIHR5cGUsIGFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzLCB2b2lkICpjb250ZXh0KTsKKwkJCSB1MzIgdHlwZSwgYWNwaV9ncGVfaGFuZGxlciBhZGRyZXNzLCB2b2lkICpjb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCi0JCQl1MzIgZ3BlX251bWJlciwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MpOworCQkJdTMyIGdwZV9udW1iZXIsIGFjcGlfZ3BlX2hhbmRsZXIgYWRkcmVzcyk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMgYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgaGFuZGxlcik7CkBAIC0yOTIsMTEgKzI5NiwxMyBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyKTsKIAotYWNwaV9zdGF0dXMgYWNwaV9ncGVfY2FuX3dha2UoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpOwotCiBhY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlcik7CiAKLWFjcGlfc3RhdHVzIGFjcGlfZ3BlX3dha2V1cChhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggYWN0aW9uKTsKK2FjcGlfc3RhdHVzCithY3BpX3NldHVwX2dwZV9mb3Jfd2FrZShhY3BpX2hhbmRsZSBwYXJlbnRfZGV2aWNlLAorCQkJYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpOworCithY3BpX3N0YXR1cyBhY3BpX3NldF9ncGVfd2FrZV9tYXNrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1OCBhY3Rpb24pOwogCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfZ3BlX3N0YXR1cyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLApAQCAtMzE1LDcgKzMyMSw3IEBACiAKIGFjcGlfc3RhdHVzIGFjcGlfcmVtb3ZlX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlKTsKIAotYWNwaV9zdGF0dXMgYWNwaV91cGRhdGVfZ3Blcyh2b2lkKTsKK2FjcGlfc3RhdHVzIGFjcGlfdXBkYXRlX2FsbF9ncGVzKHZvaWQpOwogCiAvKgogICogUmVzb3VyY2UgaW50ZXJmYWNlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMS5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCmluZGV4IGM2MzdiNzUuLmNkNzdhYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKQEAgLTExOSw3ICsxMTksNyBAQAogc3RydWN0IGFjcGlfdGFibGVfYmVydCB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCiAJdTMyIHJlZ2lvbl9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgYm9vdCBlcnJvciByZWdpb24gKi8KLQl1NjQgYWRkcmVzczsJCS8qIFBoeXNpY2FsIGFkZHJlc3NzIG9mIHRoZSBlcnJvciByZWdpb24gKi8KKwl1NjQgYWRkcmVzczsJCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGVycm9yIHJlZ2lvbiAqLwogfTsKIAogLyogQm9vdCBFcnJvciBSZWdpb24gKG5vdCBhIHN1YnRhYmxlLCBwb2ludGVkIHRvIGJ5IEFkZHJlc3MgZmllbGQgYWJvdmUpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAppbmRleCAyYjEzNGI2Li45MzlhNDMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKQEAgLTY1NiwzMyArNjU2LDM0IEBACiAjZGVmaW5lIEFDUElfR1BFX01BWCAgICAgICAgICAgICAgICAgICAgMHhGRgogI2RlZmluZSBBQ1BJX05VTV9HUEUgICAgICAgICAgICAgICAgICAgIDI1NgogCi0vKiBBY3Rpb25zIGZvciBhY3BpX2dwZV93YWtldXAsIGFjcGlfaHdfbG93X3NldF9ncGUgKi8KKy8qIEFjdGlvbnMgZm9yIGFjcGlfc2V0X2dwZV93YWtlX21hc2ssIGFjcGlfaHdfbG93X3NldF9ncGUgKi8KIAogI2RlZmluZSBBQ1BJX0dQRV9FTkFCTEUgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQUNQSV9HUEVfRElTQUJMRSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfR1BFX0NPTkRfRU5BQkxFICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX0dQRV9DT05ESVRJT05BTF9FTkFCTEUgICAgIDIKIAogLyoKICAqIEdQRSBpbmZvIGZsYWdzIC0gUGVyIEdQRQotICogKy0tLS0tLS0rLS0tKy0rLSsKLSAqIHwgIDc6NCAgfDM6MnwxfDB8Ci0gKiArLS0tLS0tLSstLS0rLSstKwotICogICAgIHwgICAgIHwgIHwgfAotICogICAgIHwgICAgIHwgIHwgKy0tLSBJbnRlcnJ1cHQgdHlwZTogZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQKLSAqICAgICB8ICAgICB8ICArLS0tLS0gR1BFIGNhbiB3YWtlIHRoZSBzeXN0ZW0KLSAqICAgICB8ICAgICArLS0tLS0tLS0gVHlwZSBvZiBkaXNwYXRjaDp0byBtZXRob2QsIGhhbmRsZXIsIG9yIG5vbmUKLSAqICAgICArLS0tLS0tLS0tLS0tLS0gPFJlc2VydmVkPgorICogKy0tLS0tLS0rLSstKy0tLSsKKyAqIHwgIDc6NCAgfDN8MnwxOjB8CisgKiArLS0tLS0tLSstKy0rLS0tKworICogICAgIHwgICAgfCB8ICB8CisgKiAgICAgfCAgICB8IHwgICstLSBUeXBlIG9mIGRpc3BhdGNoOnRvIG1ldGhvZCwgaGFuZGxlciwgbm90aWZ5LCBvciBub25lCisgKiAgICAgfCAgICB8ICstLS0tLSBJbnRlcnJ1cHQgdHlwZTogZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQKKyAqICAgICB8ICAgICstLS0tLS0tIElzIGEgV2FrZSBHUEUKKyAqICAgICArLS0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KICAqLwotI2RlZmluZSBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0sgICAgICAgICh1OCkgMHgwMQotI2RlZmluZSBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQgICAgICAgICh1OCkgMHgwMQorI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9OT05FICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QgICAgICAgICh1OCkgMHgwMQorI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSICAgICAgICh1OCkgMHgwMgorI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9OT1RJRlkgICAgICAgICh1OCkgMHgwMworI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLICAgICAgICAgICh1OCkgMHgwMworCisjZGVmaW5lIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCAgICAgICAgKHU4KSAweDA0CiAjZGVmaW5lIEFDUElfR1BFX0VER0VfVFJJR0dFUkVEICAgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSyAgICAgICAgKHU4KSAweDA0CiAKLSNkZWZpbmUgQUNQSV9HUEVfQ0FOX1dBS0UJCSh1OCkgMHgwMgotCi0jZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX01BU0sgICAgICAgICAgKHU4KSAweDBDCi0jZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIgICAgICAgKHU4KSAweDA0Ci0jZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCAgICAgICAgKHU4KSAweDA4Ci0jZGVmaW5lIEFDUElfR1BFX0RJU1BBVENIX05PVF9VU0VEICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfR1BFX0NBTl9XQUtFICAgICAgICAgICAgICAgKHU4KSAweDA4CiAKIC8qCiAgKiBGbGFncyBmb3IgR1BFIGFuZCBMb2NrIGludGVyZmFjZXMKQEAgLTg5NCw5ICs4OTUsMjAgQEAKIC8qCiAgKiBWYXJpb3VzIGhhbmRsZXJzIGFuZCBjYWxsYmFjayBwcm9jZWR1cmVzCiAgKi8KK3R5cGVkZWYKK3ZvaWQgKCpBQ1BJX0dCTF9FVkVOVF9IQU5ETEVSKSAodTMyIGV2ZW50X3R5cGUsCisJCQkgICAgICAgYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJICAgICAgIHUzMiBldmVudF9udW1iZXIsIHZvaWQgKmNvbnRleHQpOworCisjZGVmaW5lIEFDUElfRVZFTlRfVFlQRV9HUEUgICAgICAgICAwCisjZGVmaW5lIEFDUElfRVZFTlRfVFlQRV9GSVhFRCAgICAgICAxCisKIHR5cGVkZWYgdTMyKCphY3BpX2V2ZW50X2hhbmRsZXIpICh2b2lkICpjb250ZXh0KTsKIAogdHlwZWRlZgordTMyICgqYWNwaV9ncGVfaGFuZGxlcikgKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB2b2lkICpjb250ZXh0KTsKKwordHlwZWRlZgogdm9pZCAoKmFjcGlfbm90aWZ5X2hhbmRsZXIpIChhY3BpX2hhbmRsZSBkZXZpY2UsIHUzMiB2YWx1ZSwgdm9pZCAqY29udGV4dCk7CiAKIHR5cGVkZWYKQEAgLTk1MSw2ICs5NjMsMTAgQEAKICNkZWZpbmUgQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQgICAgICAweDAwCiAjZGVmaW5lIEFDUElfSU5URVJSVVBUX0hBTkRMRUQgICAgICAgICAgMHgwMQogCisvKiBHUEUgaGFuZGxlciByZXR1cm4gdmFsdWVzICovCisKKyNkZWZpbmUgQUNQSV9SRUVOQUJMRV9HUEUgICAgICAgICAgICAgICAweDgwCisKIC8qIExlbmd0aCBvZiAzMi1iaXQgRUlTQUlEIHZhbHVlcyB3aGVuIGNvbnZlcnRlZCBiYWNrIHRvIGEgc3RyaW5nICovCiAKICNkZWZpbmUgQUNQSV9FSVNBSURfU1RSSU5HX1NJWkUgICAgICAgICA4CS8qIEluY2x1ZGVzIG51bGwgdGVybWluYXRvciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FwZWkuaCBiL2luY2x1ZGUvYWNwaS9hcGVpLmgKaW5kZXggYjMzNjUwMi4uYzRkYmIxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FwZWkuaAorKysgYi9pbmNsdWRlL2FjcGkvYXBlaS5oCkBAIC0xOSw2ICsxOSwxMiBAQAogZXh0ZXJuIGludCBoZXN0X2Rpc2FibGU7CiBleHRlcm4gaW50IGVyc3RfZGlzYWJsZTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX0FQRUkKK3ZvaWQgX19pbml0IGFjcGlfaGVzdF9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2hlc3RfaW5pdCh2b2lkKSB7IHJldHVybjsgfQorI2VuZGlmCisKIHR5cGVkZWYgaW50ICgqYXBlaV9oZXN0X2Z1bmNfdCkoc3RydWN0IGFjcGlfaGVzdF9oZWFkZXIgKmhlc3RfaGRyLCB2b2lkICpkYXRhKTsKIGludCBhcGVpX2hlc3RfcGFyc2UoYXBlaV9oZXN0X2Z1bmNfdCBmdW5jLCB2b2lkICpkYXRhKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDFiNjIxMDIuLjU1MTkyYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTMyNCw2ICszMjQsMTIgQEAKIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZ19pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwogZXh0ZXJuIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAogCQkJCQkgaW50IHN0YXRlLCBib29sIGZvcmNlKTsKKy8qCisgKiBSZWV2YWx1YXRlIHdoZXRoZXIgdGhlIFQtc3RhdGUgaXMgaW52YWxpZCBhZnRlciBvbmUgY3B1IGlzCisgKiBvbmxpbmVkL29mZmxpbmVkLiBJbiBzdWNoIGNhc2UgdGhlIGZsYWdzLnRocm90dGxpbmcgd2lsbCBiZSB1cGRhdGVkLgorICovCitleHRlcm4gdm9pZCBhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24pOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzOwogZXh0ZXJuIHZvaWQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19pbml0KHZvaWQpOwogLyogaW4gcHJvY2Vzc29yX2lkbGUuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oCmluZGV4IDM1NzdjYTEuLjQ2NDRjOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2lvLmgKQEAgLTIxMSw2ICsyMTEsMzYgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc2woKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc3coKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlvdXRzbCgodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCW91dHN3KCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlc2IoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisJb3V0c2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX0lPTUFQCiAjZGVmaW5lIGlvcmVhZDgoYWRkcikJCXJlYWRiKGFkZHIpCiAjZGVmaW5lIGlvcmVhZDE2KGFkZHIpCQlyZWFkdyhhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCmluZGV4IDNkYTllMjcuLjc4N2FiYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmgKQEAgLTQ1LDYgKzQ1LDkgQEAKICNkZWZpbmUgTUFEVl9NRVJHRUFCTEUgICAxMgkJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KICNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMwkJLyogS1NNIG1heSBub3QgbWVyZ2UgaWRlbnRpY2FsIHBhZ2VzICovCiAKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAkJLyogV29ydGggYmFja2luZyB3aXRoIGh1Z2VwYWdlcyAqLworI2RlZmluZSBNQURWX05PSFVHRVBBR0UJMTUJCS8qIE5vdCB3b3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisKIC8qIGNvbXBhdGliaWxpdHkgZmxhZ3MgKi8KICNkZWZpbmUgTUFQX0ZJTEUJMAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCmluZGV4IDZmM2M2YWUuLmYxZWRkZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCkBAIC01LDY3ICs1LDEwOCBAQAogI2lmZGVmIENPTkZJR19NTVUKIAogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX1NFVF9BQ0NFU1NfRkxBR1MKLS8qCi0gKiBMYXJnZWx5IHNhbWUgYXMgYWJvdmUsIGJ1dCBvbmx5IHNldHMgdGhlIGFjY2VzcyBmbGFncyAoZGlydHksCi0gKiBhY2Nlc3NlZCwgYW5kIHdyaXRhYmxlKS4gRnVydGhlcm1vcmUsIHdlIGtub3cgaXQgYWx3YXlzIGdldHMgc2V0Ci0gKiB0byBhICJtb3JlIHBlcm1pc3NpdmUiIHNldHRpbmcsIHdoaWNoIGFsbG93cyBtb3N0IGFyY2hpdGVjdHVyZXMKLSAqIHRvIG9wdGltaXplIHRoaXMuIFdlIHJldHVybiB3aGV0aGVyIHRoZSBQVEUgYWN0dWFsbHkgY2hhbmdlZCwgd2hpY2gKLSAqIGluIHR1cm4gaW5zdHJ1Y3RzIHRoZSBjYWxsZXIgdG8gZG8gdGhpbmdzIGxpa2UgdXBkYXRlX19tbXVfY2FjaGUuCi0gKiBUaGlzIHVzZWQgdG8gYmUgZG9uZSBpbiB0aGUgY2FsbGVyLCBidXQgc3BhcmMgbmVlZHMgbWlub3IgZmF1bHRzIHRvCi0gKiBmb3JjZSB0aGF0IGNhbGwgb24gc3VuNGMgc28gd2UgY2hhbmdlZCB0aGlzIG1hY3JvIHNsaWdodGx5Ci0gKi8KLSNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSwgX19kaXJ0eSkgXAotKHsJCQkJCQkJCQkgIFwKLQlpbnQgX19jaGFuZ2VkID0gIXB0ZV9zYW1lKCooX19wdGVwKSwgX19lbnRyeSk7CQkJICBcCi0JaWYgKF9fY2hhbmdlZCkgewkJCQkJCSAgXAotCQlzZXRfcHRlX2F0KChfX3ZtYSktPnZtX21tLCAoX19hZGRyZXNzKSwgX19wdGVwLCBfX2VudHJ5KTsgXAotCQlmbHVzaF90bGJfcGFnZShfX3ZtYSwgX19hZGRyZXNzKTsJCQkgIFwKLQl9CQkJCQkJCQkgIFwKLQlfX2NoYW5nZWQ7CQkJCQkJCSAgXAotfSkKK2V4dGVybiBpbnQgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLAorCQkJCSBwdGVfdCBlbnRyeSwgaW50IGRpcnR5KTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfU0VUX0FDQ0VTU19GTEFHUworZXh0ZXJuIGludCBwbWRwX3NldF9hY2Nlc3NfZmxhZ3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZHAsCisJCQkJIHBtZF90IGVudHJ5LCBpbnQgZGlydHkpOwogI2VuZGlmCiAKICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKLSh7CQkJCQkJCQkJXAotCXB0ZV90IF9fcHRlID0gKihfX3B0ZXApOwkJCQkJXAotCWludCByID0gMTsJCQkJCQkJXAotCWlmICghcHRlX3lvdW5nKF9fcHRlKSkJCQkJCQlcCi0JCXIgPSAwOwkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlzZXRfcHRlX2F0KChfX3ZtYSktPnZtX21tLCAoX19hZGRyZXNzKSwJCQlcCi0JCQkgICAoX19wdGVwKSwgcHRlX21rb2xkKF9fcHRlKSk7CQkJXAotCXI7CQkJCQkJCQlcCi19KQorc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkJICAgIHB0ZV90ICpwdGVwKQoreworCXB0ZV90IHB0ZSA9ICpwdGVwOworCWludCByID0gMTsKKwlpZiAoIXB0ZV95b3VuZyhwdGUpKQorCQlyID0gMDsKKwllbHNlCisJCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkcmVzcywgcHRlcCwgcHRlX21rb2xkKHB0ZSkpOworCXJldHVybiByOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUE1EUF9URVNUX0FORF9DTEVBUl9ZT1VORworI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorc3RhdGljIGlubGluZSBpbnQgcG1kcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkJICAgIHBtZF90ICpwbWRwKQoreworCXBtZF90IHBtZCA9ICpwbWRwOworCWludCByID0gMTsKKwlpZiAoIXBtZF95b3VuZyhwbWQpKQorCQlyID0gMDsKKwllbHNlCisJCXNldF9wbWRfYXQodm1hLT52bV9tbSwgYWRkcmVzcywgcG1kcCwgcG1kX21rb2xkKHBtZCkpOworCXJldHVybiByOworfQorI2Vsc2UgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCitzdGF0aWMgaW5saW5lIGludCBwbWRwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCQkgICAgcG1kX3QgKnBtZHApCit7CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAjZW5kaWYKIAogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX1lPVU5HX0ZMVVNICi0jZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9feW91bmc7CQkJCQkJCVwKLQlfX3lvdW5nID0gcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApOwlcCi0JaWYgKF9feW91bmcpCQkJCQkJCVwKLQkJZmx1c2hfdGxiX3BhZ2UoX192bWEsIF9fYWRkcmVzcyk7CQkJXAotCV9feW91bmc7CQkJCQkJCVwKLX0pCitpbnQgcHRlcF9jbGVhcl9mbHVzaF95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUE1EUF9DTEVBUl9ZT1VOR19GTFVTSAoraW50IHBtZHBfY2xlYXJfZmx1c2hfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKTsKICNlbmRpZgogCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgotI2RlZmluZSBwdGVwX2dldF9hbmRfY2xlYXIoX19tbSwgX19hZGRyZXNzLCBfX3B0ZXApCQkJXAotKHsJCQkJCQkJCQlcCi0JcHRlX3QgX19wdGUgPSAqKF9fcHRlcCk7CQkJCQlcCi0JcHRlX2NsZWFyKChfX21tKSwgKF9fYWRkcmVzcyksIChfX3B0ZXApKTsJCQlcCi0JX19wdGU7CQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCSAgICAgICBwdGVfdCAqcHRlcCkKK3sKKwlwdGVfdCBwdGUgPSAqcHRlcDsKKwlwdGVfY2xlYXIobW0sIGFkZHJlc3MsIHB0ZXApOworCXJldHVybiBwdGU7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9QTURQX0dFVF9BTkRfQ0xFQVIKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKK3N0YXRpYyBpbmxpbmUgcG1kX3QgcG1kcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIHBtZF90ICpwbWRwKQoreworCXBtZF90IHBtZCA9ICpwbWRwOworCXBtZF9jbGVhcihtbSwgYWRkcmVzcywgcG1kcCk7CisJcmV0dXJuIHBtZDsKIH0pCisjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KK3N0YXRpYyBpbmxpbmUgcG1kX3QgcG1kcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJICAgICAgIHBtZF90ICpwbWRwKQoreworCUJVRygpOworCXJldHVybiBfX3BtZCgwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KICNlbmRpZgogCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUl9GVUxMCi0jZGVmaW5lIHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKF9fbW0sIF9fYWRkcmVzcywgX19wdGVwLCBfX2Z1bGwpCVwKLSh7CQkJCQkJCQkJXAotCXB0ZV90IF9fcHRlOwkJCQkJCQlcCi0JX19wdGUgPSBwdGVwX2dldF9hbmRfY2xlYXIoKF9fbW0pLCAoX19hZGRyZXNzKSwgKF9fcHRlcCkpOwlcCi0JX19wdGU7CQkJCQkJCQlcCi19KQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXJfZnVsbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsCisJCQkJCSAgICBpbnQgZnVsbCkKK3sKKwlwdGVfdCBwdGU7CisJcHRlID0gcHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyZXNzLCBwdGVwKTsKKwlyZXR1cm4gcHRlOworfQogI2VuZGlmCiAKIC8qCkBAIC03NCwyMCArMTE1LDI1IEBACiAgKiBub3QgcHJlc2VudCwgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYW4gYWRkcmVzcyBzcGFjZSBkZXN0cnVjdGlvbi4KICAqLwogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVfQ0xFQVJfTk9UX1BSRVNFTlRfRlVMTAotI2RlZmluZSBwdGVfY2xlYXJfbm90X3ByZXNlbnRfZnVsbChfX21tLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19mdWxsKQlcCi1kbyB7CQkJCQkJCQkJXAotCXB0ZV9jbGVhcigoX19tbSksIChfX2FkZHJlc3MpLCAoX19wdGVwKSk7CQkJXAotfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2xlYXJfbm90X3ByZXNlbnRfZnVsbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJCQkgICAgICBwdGVfdCAqcHRlcCwKKwkJCQkJICAgICAgaW50IGZ1bGwpCit7CisJcHRlX2NsZWFyKG1tLCBhZGRyZXNzLCBwdGVwKTsKK30KICNlbmRpZgogCiAjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaChfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApCQkJXAotKHsJCQkJCQkJCQlcCi0JcHRlX3QgX19wdGU7CQkJCQkJCVwKLQlfX3B0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcigoX192bWEpLT52bV9tbSwgX19hZGRyZXNzLCBfX3B0ZXApOwlcCi0JZmx1c2hfdGxiX3BhZ2UoX192bWEsIF9fYWRkcmVzcyk7CQkJCVwKLQlfX3B0ZTsJCQkJCQkJCVwKLX0pCitleHRlcm4gcHRlX3QgcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICAgIHB0ZV90ICpwdGVwKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfQ0xFQVJfRkxVU0gKK2V4dGVybiBwbWRfdCBwbWRwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgICAgcG1kX3QgKnBtZHApOwogI2VuZGlmCiAKICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCkBAIC05OSw4ICsxNDUsNDkgQEAKIH0KICNlbmRpZgogCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfU0VUX1dSUFJPVEVDVAorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorc3RhdGljIGlubGluZSB2b2lkIHBtZHBfc2V0X3dycHJvdGVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQoreworCXBtZF90IG9sZF9wbWQgPSAqcG1kcDsKKwlzZXRfcG1kX2F0KG1tLCBhZGRyZXNzLCBwbWRwLCBwbWRfd3Jwcm90ZWN0KG9sZF9wbWQpKTsKK30KKyNlbHNlIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworc3RhdGljIGlubGluZSB2b2lkIHBtZHBfc2V0X3dycHJvdGVjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQoreworCUJVRygpOworfQorI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUE1EUF9TUExJVFRJTkdfRkxVU0gKK2V4dGVybiBwbWRfdCBwbWRwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgICAgcG1kX3QgKnBtZHApOworI2VuZGlmCisKICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFX1NBTUUKLSNkZWZpbmUgcHRlX3NhbWUoQSxCKQkocHRlX3ZhbChBKSA9PSBwdGVfdmFsKEIpKQorc3RhdGljIGlubGluZSBpbnQgcHRlX3NhbWUocHRlX3QgcHRlX2EsIHB0ZV90IHB0ZV9iKQoreworCXJldHVybiBwdGVfdmFsKHB0ZV9hKSA9PSBwdGVfdmFsKHB0ZV9iKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRF9TQU1FCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCitzdGF0aWMgaW5saW5lIGludCBwbWRfc2FtZShwbWRfdCBwbWRfYSwgcG1kX3QgcG1kX2IpCit7CisJcmV0dXJuIHBtZF92YWwocG1kX2EpID09IHBtZF92YWwocG1kX2IpOworfQorI2Vsc2UgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCitzdGF0aWMgaW5saW5lIGludCBwbWRfc2FtZShwbWRfdCBwbWRfYSwgcG1kX3QgcG1kX2IpCit7CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCiAjZW5kaWYKIAogI2lmbmRlZiBfX0hBVkVfQVJDSF9QQUdFX1RFU1RfRElSVFkKQEAgLTM0OCw2ICs0MzUsMjQgQEAKIAkJCQl1bnNpZ25lZCBsb25nIHNpemUpOwogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCitzdGF0aWMgaW5saW5lIGludCBwbWRfdHJhbnNfaHVnZShwbWRfdCBwbWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbWRfdHJhbnNfc3BsaXR0aW5nKHBtZF90IHBtZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNpZm5kZWYgX19IQVZFX0FSQ0hfUE1EX1dSSVRFCitzdGF0aWMgaW5saW5lIGludCBwbWRfd3JpdGUocG1kX3QgcG1kKQoreworCUJVRygpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIF9fSEFWRV9BUkNIX1BNRF9XUklURSAqLworI2VuZGlmCisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfQVNNX0dFTkVSSUNfUEdUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggYmQ2OWQ3OS4uNjg2NDkzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtNjcsNyArNjcsOCBAQAogICogQWxpZ24gdG8gYSAzMiBieXRlIGJvdW5kYXJ5IGVxdWFsIHRvIHRoZQogICogYWxpZ25tZW50IGdjYyA0LjUgdXNlcyBmb3IgYSBzdHJ1Y3QKICAqLwotI2RlZmluZSBTVFJVQ1RfQUxJR04oKSAuID0gQUxJR04oMzIpCisjZGVmaW5lIFNUUlVDVF9BTElHTk1FTlQgMzIKKyNkZWZpbmUgU1RSVUNUX0FMSUdOKCkgLiA9IEFMSUdOKFNUUlVDVF9BTElHTk1FTlQpCiAKIC8qIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBkZXRlcm1pbmUgaWYgdGhlIGluaXQvZXhpdCBzZWN0aW9ucwogICogYXJlIGhhbmRsZWQgYXMgdGV4dC9kYXRhIG9yIHRoZXkgY2FuIGJlIGRpc2NhcmRlZCAod2hpY2gKQEAgLTE0Niw2ICsxNDcsMTMgQEAKICNkZWZpbmUgVFJBQ0VfU1lTQ0FMTFMoKQogI2VuZGlmCiAKKworI2RlZmluZSBLRVJORUxfRFRCKCkJCQkJCQkJXAorCVNUUlVDVF9BTElHTigpOwkJCQkJCQlcCisJVk1MSU5VWF9TWU1CT0woX19kdGJfc3RhcnQpID0gLjsJCQkJXAorCSooLmR0Yi5pbml0LnJvZGF0YSkJCQkJCQlcCisJVk1MSU5VWF9TWU1CT0woX19kdGJfZW5kKSA9IC47CisKIC8qIC5kYXRhIHNlY3Rpb24gKi8KICNkZWZpbmUgREFUQV9EQVRBCQkJCQkJCVwKIAkqKC5kYXRhKQkJCQkJCQlcCkBAIC0xOTIsNyArMjAwLDggQEAKIAogI2RlZmluZSBSRUFEX01PU1RMWV9EQVRBKGFsaWduKQkJCQkJCVwKIAkuID0gQUxJR04oYWxpZ24pOwkJCQkJCVwKLQkqKC5kYXRhLi5yZWFkX21vc3RseSkKKwkqKC5kYXRhLi5yZWFkX21vc3RseSkJCQkJCQlcCisJLiA9IEFMSUdOKGFsaWduKTsKIAogI2RlZmluZSBDQUNIRUxJTkVfQUxJR05FRF9EQVRBKGFsaWduKQkJCQkJXAogCS4gPSBBTElHTihhbGlnbik7CQkJCQkJXApAQCAtNDY4LDcgKzQ3Nyw4IEBACiAJTUNPVU5UX1JFQygpCQkJCQkJCVwKIAlERVZfRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKIAlDUFVfRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKLQlNRU1fRElTQ0FSRChpbml0LnJvZGF0YSkKKwlNRU1fRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKKwlLRVJORUxfRFRCKCkKIAogI2RlZmluZSBJTklUX1RFWFQJCQkJCQkJXAogCSooLmluaXQudGV4dCkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vaWZfYWxnLmggYi9pbmNsdWRlL2NyeXB0by9pZl9hbGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgxM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jcnlwdG8vaWZfYWxnLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGlmX2FsZzogVXNlci1zcGFjZSBhbGdvcml0aG0gaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVE9fSUZfQUxHX0gKKyNkZWZpbmUgX0NSWVBUT19JRl9BTEdfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYWxnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjZGVmaW5lIEFMR19NQVhfUEFHRVMJCQkxNgorCitzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3Q7CisKK3N0cnVjdCBhbGdfc29jayB7CisJLyogc3RydWN0IHNvY2sgbXVzdCBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIHN0cnVjdCBhbGdfc29jayAqLworCXN0cnVjdCBzb2NrIHNrOworCisJc3RydWN0IHNvY2sgKnBhcmVudDsKKworCWNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSAqdHlwZTsKKwl2b2lkICpwcml2YXRlOworfTsKKworc3RydWN0IGFmX2FsZ19jb21wbGV0aW9uIHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCWludCBlcnI7Cit9OworCitzdHJ1Y3QgYWZfYWxnX2NvbnRyb2wgeworCXN0cnVjdCBhZl9hbGdfaXYgKml2OworCWludCBvcDsKK307CisKK3N0cnVjdCBhZl9hbGdfdHlwZSB7CisJdm9pZCAqKCpiaW5kKShjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spOworCXZvaWQgKCpyZWxlYXNlKSh2b2lkICpwcml2YXRlKTsKKwlpbnQgKCpzZXRrZXkpKHZvaWQgKnByaXZhdGUsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOworCWludCAoKmFjY2VwdCkodm9pZCAqcHJpdmF0ZSwgc3RydWN0IHNvY2sgKnNrKTsKKworCXN0cnVjdCBwcm90b19vcHMgKm9wczsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwljaGFyIG5hbWVbMTRdOworfTsKKworc3RydWN0IGFmX2FsZ19zZ2wgeworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1tBTEdfTUFYX1BBR0VTXTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbQUxHX01BWF9QQUdFU107Cit9OworCitpbnQgYWZfYWxnX3JlZ2lzdGVyX3R5cGUoY29uc3Qgc3RydWN0IGFmX2FsZ190eXBlICp0eXBlKTsKK2ludCBhZl9hbGdfdW5yZWdpc3Rlcl90eXBlKGNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSAqdHlwZSk7CisKK2ludCBhZl9hbGdfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKK2ludCBhZl9hbGdfYWNjZXB0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2tldCAqbmV3c29jayk7CisKK2ludCBhZl9hbGdfbWFrZV9zZyhzdHJ1Y3QgYWZfYWxnX3NnbCAqc2dsLCB2b2lkIF9fdXNlciAqYWRkciwgaW50IGxlbiwKKwkJICAgaW50IHdyaXRlKTsKK3ZvaWQgYWZfYWxnX2ZyZWVfc2coc3RydWN0IGFmX2FsZ19zZ2wgKnNnbCk7CisKK2ludCBhZl9hbGdfY21zZ19zZW5kKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IGFmX2FsZ19jb250cm9sICpjb24pOworCitpbnQgYWZfYWxnX3dhaXRfZm9yX2NvbXBsZXRpb24oaW50IGVyciwgc3RydWN0IGFmX2FsZ19jb21wbGV0aW9uICpjb21wbGV0aW9uKTsKK3ZvaWQgYWZfYWxnX2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWxnX3NvY2sgKmFsZ19zayhzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIChzdHJ1Y3QgYWxnX3NvY2sgKilzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFmX2FsZ19yZWxlYXNlX3BhcmVudChzdHJ1Y3Qgc29jayAqc2spCit7CisJc29ja19wdXQoYWxnX3NrKHNrKS0+cGFyZW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFmX2FsZ19pbml0X2NvbXBsZXRpb24oc3RydWN0IGFmX2FsZ19jb21wbGV0aW9uICpjb21wbGV0aW9uKQoreworCWluaXRfY29tcGxldGlvbigmY29tcGxldGlvbi0+Y29tcGxldGlvbik7Cit9CisKKyNlbmRpZgkvKiBfQ1JZUFRPX0lGX0FMR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmggYi9pbmNsdWRlL2NyeXB0by9wYWRsb2NrLmgKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCnJlbmFtZSB0byBpbmNsdWRlL2NyeXB0by9wYWRsb2NrLmgKaW5kZXggYjcyOGU0NS4uZDJjZmEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCisrKyBiL2luY2x1ZGUvY3J5cHRvL3BhZGxvY2suaApAQCAtMTUsOSArMTUsMTUgQEAKIAogI2RlZmluZSBQQURMT0NLX0FMSUdOTUVOVCAxNgogCi0jZGVmaW5lIFBGWAkicGFkbG9jazogIgorI2RlZmluZSBQRlgJS0JVSUxEX01PRE5BTUUgIjogIgogCiAjZGVmaW5lIFBBRExPQ0tfQ1JBX1BSSU9SSVRZCTMwMAogI2RlZmluZSBQQURMT0NLX0NPTVBPU0lURV9QUklPUklUWSA0MDAKIAorI2lmZGVmIENPTkZJR182NEJJVAorI2RlZmluZSBTVEFDS19BTElHTiAxNgorI2Vsc2UKKyNkZWZpbmUgU1RBQ0tfQUxJR04gNAorI2VuZGlmCisKICNlbmRpZgkvKiBfQ1JZUFRPX1BBRExPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vc2NhdHRlcndhbGsuaCBiL2luY2x1ZGUvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKaW5kZXggODMzZDIwOC4uNGZkOTVhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vc2NhdHRlcndhbGsuaAorKysgYi9pbmNsdWRlL2NyeXB0by9zY2F0dGVyd2Fsay5oCkBAIC02OCw2ICs2OCwyMSBAQAogCXJldHVybiAoKytzZyktPmxlbmd0aCA/IHNnIDogKHZvaWQgKilzZ19wYWdlKHNnKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNjYXR0ZXJ3YWxrX2NyeXB0b19jaGFpbihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmhlYWQsCisJCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCQkgICAgaW50IGNoYWluLCBpbnQgbnVtKQoreworCWlmIChjaGFpbikgeworCQloZWFkLT5sZW5ndGggKz0gc2ctPmxlbmd0aDsKKwkJc2cgPSBzY2F0dGVyd2Fsa19zZ19uZXh0KHNnKTsKKwl9CisKKwlpZiAoc2cpCisJCXNjYXR0ZXJ3YWxrX3NnX2NoYWluKGhlYWQsIG51bSwgc2cpOworCWVsc2UKKwkJc2dfbWFya19lbmQoaGVhZCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzY2F0dGVyd2Fsa19zYW1lYnVmKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGtfaW4sCiAJCQkJCQlzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrX291dCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybVAuaCBiL2luY2x1ZGUvZHJtL2RybVAuaAppbmRleCAyNzRlYWFhLi5hNDY5NGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1QLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtUC5oCkBAIC02ODMsNiArNjgzLDIxIEBACiAJdm9pZCAqZHJpdmVyX3ByaXY7IC8qKjwgUHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIGRyaXZlciB0byB1c2UgKi8KIH07CiAKKy8qIFNpemUgb2YgcmluZ2J1ZmZlciBmb3IgdmJsYW5rIHRpbWVzdGFtcHMuIEp1c3QgZG91YmxlLWJ1ZmZlcgorICogaW4gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworI2RlZmluZSBEUk1fVkJMQU5LVElNRV9SQlNJWkUgMgorCisvKiBGbGFncyBhbmQgcmV0dXJuIGNvZGVzIGZvciBnZXRfdmJsYW5rX3RpbWVzdGFtcCgpIGRyaXZlciBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSAxCisjZGVmaW5lIERSTV9WQkxBTktUSU1FX1NDQU5PVVRQT1NfTUVUSE9EICgxIDw8IDApCisjZGVmaW5lIERSTV9WQkxBTktUSU1FX0lOVkJMICAgICAgICAgICAgICgxIDw8IDEpCisKKy8qIGdldF9zY2Fub3V0X3Bvc2l0aW9uKCkgcmV0dXJuIGZsYWdzICovCisjZGVmaW5lIERSTV9TQ0FOT1VUUE9TX1ZBTElEICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBEUk1fU0NBTk9VVFBPU19JTlZCTCAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEUgICAgICgxIDw8IDIpCisKIC8qKgogICogRFJNIGRyaXZlciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCB0aGUgY29tbW9uIGNvZGUgZm9yCiAgKiBhIGZhbWlseSBvZiBjYXJkcy4gVGhlcmUgd2lsbCBvbmUgZHJtX2RldmljZSBmb3IgZWFjaCBjYXJkIHByZXNlbnQKQEAgLTc2MCw2ICs3NzUsNjggQEAKIAkgKi8KIAlpbnQgKCpkZXZpY2VfaXNfYWdwKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKKwkvKioKKwkgKiBDYWxsZWQgYnkgdmJsYW5rIHRpbWVzdGFtcGluZyBjb2RlLgorCSAqCisJICogUmV0dXJuIHRoZSBjdXJyZW50IGRpc3BsYXkgc2Nhbm91dCBwb3NpdGlvbiBmcm9tIGEgY3J0Yy4KKwkgKgorCSAqIFxwYXJhbSBkZXYgIERSTSBkZXZpY2UuCisJICogXHBhcmFtIGNydGMgSWQgb2YgdGhlIGNydGMgdG8gcXVlcnkuCisJICogXHBhcmFtICp2cG9zIFRhcmdldCBsb2NhdGlvbiBmb3IgY3VycmVudCB2ZXJ0aWNhbCBzY2Fub3V0IHBvc2l0aW9uLgorCSAqIFxwYXJhbSAqaHBvcyBUYXJnZXQgbG9jYXRpb24gZm9yIGN1cnJlbnQgaG9yaXpvbnRhbCBzY2Fub3V0IHBvc2l0aW9uLgorCSAqCisJICogUmV0dXJucyB2cG9zIGFzIGEgcG9zaXRpdmUgbnVtYmVyIHdoaWxlIGluIGFjdGl2ZSBzY2Fub3V0IGFyZWEuCisJICogUmV0dXJucyB2cG9zIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGluc2lkZSB2YmxhbmssIGNvdW50aW5nIHRoZSBudW1iZXIKKwkgKiBvZiBzY2FubGluZXMgdG8gZ28gdW50aWwgZW5kIG9mIHZibGFuaywgZS5nLiwgLTEgbWVhbnMgIm9uZSBzY2FubGluZQorCSAqIHVudGlsIHN0YXJ0IG9mIGFjdGl2ZSBzY2Fub3V0IC8gZW5kIG9mIHZibGFuay4iCisJICoKKwkgKiBccmV0dXJuIEZsYWdzLCBvcidlZCB0b2dldGhlciBhcyBmb2xsb3dzOgorCSAqCisJICogRFJNX1NDQU5PVVRQT1NfVkFMSUQgPSBRdWVyeSBzdWNjZXNzZnVsbC4KKwkgKiBEUk1fU0NBTk9VVFBPU19JTlZCTCA9IEluc2lkZSB2YmxhbmsuCisJICogRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEUgPSBSZXR1cm5lZCBwb3NpdGlvbiBpcyBhY2N1cmF0ZS4gQSBsYWNrIG9mCisJICogdGhpcyBmbGFnIG1lYW5zIHRoYXQgcmV0dXJuZWQgcG9zaXRpb24gbWF5IGJlIG9mZnNldCBieSBhIGNvbnN0YW50CisJICogYnV0IHVua25vd24gc21hbGwgbnVtYmVyIG9mIHNjYW5saW5lcyB3cnQuIHJlYWwgc2Nhbm91dCBwb3NpdGlvbi4KKwkgKgorCSAqLworCWludCAoKmdldF9zY2Fub3V0X3Bvc2l0aW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CisKKwkvKioKKwkgKiBDYWxsZWQgYnkgXGMgZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcC4gU2hvdWxkIHJldHVybiBhIHByZWNpc2UKKwkgKiB0aW1lc3RhbXAgd2hlbiB0aGUgbW9zdCByZWNlbnQgVkJMQU5LIGludGVydmFsIGVuZGVkIG9yIHdpbGwgZW5kLgorCSAqCisJICogU3BlY2lmaWNhbGx5LCB0aGUgdGltZXN0YW1wIGluIEB2YmxhbmtfdGltZSBzaG91bGQgY29ycmVzcG9uZCBhcworCSAqIGNsb3NlbHkgYXMgcG9zc2libGUgdG8gdGhlIHRpbWUgd2hlbiB0aGUgZmlyc3QgdmlkZW8gc2NhbmxpbmUgb2YKKwkgKiB0aGUgdmlkZW8gZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiBWQkxBTksgd2lsbCBzdGFydCBzY2FubmluZyBvdXQsCisJICogdGhlIHRpbWUgaW1tbWVkaWF0ZWx5IGFmdGVyIGVuZCBvZiB0aGUgVkJMQU5LIGludGVydmFsLiBJZiB0aGUKKwkgKiBAY3J0YyBpcyBjdXJyZW50bHkgaW5zaWRlIFZCTEFOSywgdGhpcyB3aWxsIGJlIGEgdGltZSBpbiB0aGUgZnV0dXJlLgorCSAqIElmIHRoZSBAY3J0YyBpcyBjdXJyZW50bHkgc2Nhbm5pbmcgb3V0IGEgZnJhbWUsIHRoaXMgd2lsbCBiZSB0aGUKKwkgKiBwYXN0IHN0YXJ0IHRpbWUgb2YgdGhlIGN1cnJlbnQgc2Nhbm91dC4gVGhpcyBpcyBtZWFudCB0byBhZGhlcmUKKwkgKiB0byB0aGUgT3Blbk1MIE9NTF9zeW5jX2NvbnRyb2wgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb24uCisJICoKKwkgKiBccGFyYW0gZGV2IGRldiBEUk0gZGV2aWNlIGhhbmRsZS4KKwkgKiBccGFyYW0gY3J0YyBjcnRjIGZvciB3aGljaCB0aW1lc3RhbXAgc2hvdWxkIGJlIHJldHVybmVkLgorCSAqIFxwYXJhbSAqbWF4X2Vycm9yIE1heGltdW0gYWxsb3dhYmxlIHRpbWVzdGFtcCBlcnJvciBpbiBuYW5vc2Vjb25kcy4KKwkgKiAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBzaG91bGQgc3RyaXZlIHRvIHByb3ZpZGUgdGltZXN0YW1wCisJICogICAgICAgICAgICAgICAgICAgd2l0aCBhbiBlcnJvciBvZiBhdCBtb3N0ICptYXhfZXJyb3IgbmFub3NlY29uZHMuCisJICogICAgICAgICAgICAgICAgICAgUmV0dXJucyB0cnVlIHVwcGVyIGJvdW5kIG9uIGVycm9yIGZvciB0aW1lc3RhbXAuCisJICogXHBhcmFtICp2YmxhbmtfdGltZSBUYXJnZXQgbG9jYXRpb24gZm9yIHJldHVybmVkIHZibGFuayB0aW1lc3RhbXAuCisJICogXHBhcmFtIGZsYWdzIDAgPSBEZWZhdWx0cywgbm8gc3BlY2lhbCB0cmVhdG1lbnQgbmVlZGVkLgorCSAqIFxwYXJhbSAgICAgICBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRID0gRnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdmJsYW5rCisJICoJICAgICAgICBpcnEgaGFuZGxlci4gU29tZSBkcml2ZXJzIG5lZWQgdG8gYXBwbHkgc29tZSB3b3JrYXJvdW5kcworCSAqICAgICAgICAgICAgICBmb3IgZ3B1LXNwZWNpZmljIHZibGFuayBpcnEgcXVpcmtzIGlmIGZsYWcgaXMgc2V0LgorCSAqCisJICogXHJldHVybnMKKwkgKiBaZXJvIGlmIHRpbWVzdGFtcGluZyBpc24ndCBzdXBwb3J0ZWQgaW4gY3VycmVudCBkaXNwbGF5IG1vZGUgb3IgYQorCSAqIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLiBBIHBvc2l0aXZlIHN0YXR1cyBjb2RlIG9uIHN1Y2Nlc3MsCisJICogd2hpY2ggZGVzY3JpYmVzIGhvdyB0aGUgdmJsYW5rX3RpbWUgdGltZXN0YW1wIHdhcyBjb21wdXRlZC4KKwkgKi8KKwlpbnQgKCpnZXRfdmJsYW5rX3RpbWVzdGFtcCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICAgaW50ICptYXhfZXJyb3IsCisJCQkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCisJCQkJICAgICB1bnNpZ25lZCBmbGFncyk7CisKIAkvKiB0aGVzZSBoYXZlIHRvIGJlIGZpbGxlZCBpbiAqLwogCiAJaXJxcmV0dXJuX3QoKmlycV9oYW5kbGVyKSAoRFJNX0lSUV9BUkdTKTsKQEAgLTk4Myw2ICsxMDYwLDggQEAKIAogCXdhaXRfcXVldWVfaGVhZF90ICp2YmxfcXVldWU7ICAgLyoqPCBWQkxBTksgd2FpdCBxdWV1ZSAqLwogCWF0b21pY190ICpfdmJsYW5rX2NvdW50OyAgICAgICAgLyoqPCBudW1iZXIgb2YgVkJMQU5LIGludGVycnVwdHMgKGRyaXZlciBtdXN0IGFsbG9jIHRoZSByaWdodCBudW1iZXIgb2YgY291bnRlcnMpICovCisJc3RydWN0IHRpbWV2YWwgKl92YmxhbmtfdGltZTsgICAvKio8IHRpbWVzdGFtcCBvZiBjdXJyZW50IHZibGFua19jb3VudCAoZHJpdmVycyBtdXN0IGFsbG9jIHJpZ2h0IG51bWJlciBvZiBmaWVsZHMpICovCisJc3BpbmxvY2tfdCB2YmxhbmtfdGltZV9sb2NrOyAgICAvKio8IFByb3RlY3RzIHZibGFuayBjb3VudCBhbmQgdGltZSB1cGRhdGVzIGR1cmluZyB2YmxhbmsgZW5hYmxlL2Rpc2FibGUgKi8KIAlzcGlubG9ja190IHZibF9sb2NrOwogCWF0b21pY190ICp2YmxhbmtfcmVmY291bnQ7ICAgICAgLyogbnVtYmVyIG9mIHVzZXJzIG9mIHZibGFuayBpbnRlcnJ1cHRzcGVyIGNydGMgKi8KIAl1MzIgKmxhc3RfdmJsYW5rOyAgICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBieSBkZXYtPnZibF9sb2NrLCB1c2VkICovCkBAIC0xMDQxLDEyICsxMTIwLDE0IEBACiAJLypAeyAqLwogCXNwaW5sb2NrX3Qgb2JqZWN0X25hbWVfbG9jazsKIAlzdHJ1Y3QgaWRyIG9iamVjdF9uYW1lX2lkcjsKLQl1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnM7ICAgIC8qIGRvbWFpbnMgcGVuZGluZyBpbnZhbGlkYXRpb24gKi8KLQl1aW50MzJfdCBmbHVzaF9kb21haW5zOyAgICAgICAgIC8qIGRvbWFpbnMgcGVuZGluZyBmbHVzaCAqLwogCS8qQH0gKi8KLQorCWludCBzd2l0Y2hfcG93ZXJfc3RhdGU7CiB9OwogCisjZGVmaW5lIERSTV9TV0lUQ0hfUE9XRVJfT04gMAorI2RlZmluZSBEUk1fU1dJVENIX1BPV0VSX09GRiAxCisjZGVmaW5lIERSTV9TV0lUQ0hfUE9XRVJfQ0hBTkdJTkcgMgorCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIGludCBmZWF0dXJlKQogewpAQCAtMTI4NCwxMSArMTM2NSwyMiBAQAogCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxwKTsKIGV4dGVybiBpbnQgZHJtX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqdmJsX3NlcSk7CiBleHRlcm4gdTMyIGRybV92YmxhbmtfY291bnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOworZXh0ZXJuIHUzMiBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua3RpbWUpOwogZXh0ZXJuIHZvaWQgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIGludCBkcm1fdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX29mZihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdTMyIGRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdHZibGFuaywgdW5zaWduZWQgZmxhZ3MpOworZXh0ZXJuIGludCBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgaW50IGNydGMsIGludCAqbWF4X2Vycm9yLAorCQkJCQkJIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKKwkJCQkJCSB1bnNpZ25lZCBmbGFncywKKwkJCQkJCSBzdHJ1Y3QgZHJtX2NydGMgKnJlZmNydGMpOworZXh0ZXJuIHZvaWQgZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOworCiAvKiBNb2Rlc2V0dGluZyBzdXBwb3J0ICovCiBleHRlcm4gdm9pZCBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKQEAgLTEzMjEsNyArMTQxMyw2IEBACiBleHRlcm4gaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7Ci1leHRlcm4gdm9pZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIAkJCQkvKiBTdHViIHN1cHBvcnQgKGRybV9zdHViLmgpICovCiBleHRlcm4gaW50IGRybV9zZXRtYXN0ZXJfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTEzNDAsNiArMTQzMSw5IEBACiBleHRlcm4gaW50IGRybV9wdXRfbWlub3Ioc3RydWN0IGRybV9taW5vciAqKm1pbm9yKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX2RlYnVnOwogCitleHRlcm4gdW5zaWduZWQgaW50IGRybV92Ymxhbmtfb2ZmZGVsYXk7CitleHRlcm4gdW5zaWduZWQgaW50IGRybV90aW1lc3RhbXBfcHJlY2lzaW9uOworCiBleHRlcm4gc3RydWN0IGNsYXNzICpkcm1fY2xhc3M7CiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcm1fcHJvY19yb290OwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmRybV9kZWJ1Z2ZzX3Jvb3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaAppbmRleCAwMjlhYTY4Li5hY2Q3ZmFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKQEAgLTM1MSw4ICszNTEsMTQgQEAKIAogCWJvb2wgZW5hYmxlZDsKIAorCS8qIFJlcXVlc3RlZCBtb2RlIGZyb20gbW9kZXNldHRpbmcuICovCiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbW9kZTsKIAorCS8qIFByb2dyYW1tZWQgbW9kZSBpbiBodywgYWZ0ZXIgYWRqdXN0bWVudHMgZm9yIGVuY29kZXJzLAorCSAqIGNydGMsIHBhbmVsIHNjYWxpbmcgZXRjLiBOZWVkZWQgZm9yIHRpbWVzdGFtcGluZyBldGMuCisJICovCisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgaHdtb2RlOworCiAJaW50IHgsIHk7CiAJY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzICpmdW5jczsKIApAQCAtMzYwLDYgKzM2Niw5IEBACiAJdWludDMyX3QgZ2FtbWFfc2l6ZTsKIAl1aW50MTZfdCAqZ2FtbWFfc3RvcmU7CiAKKwkvKiBDb25zdGFudHMgbmVlZGVkIGZvciBwcmVjaXNlIHZibGFuayBhbmQgc3dhcCB0aW1lc3RhbXBpbmcuICovCisJczY0IGZyYW1lZHVyX25zLCBsaW5lZHVyX25zLCBwaXhlbGR1cl9uczsKKwogCS8qIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGhlbHBlciAqLwogCXZvaWQgKmhlbHBlcl9wcml2YXRlOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaCBiL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAppbmRleCBmMjJlN2ZlLi5hYWMyN2JkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCkBAIC0xMjEsOSArMTIxLDYgQEAKIHZvaWQgZHJtX2ZiX2hlbHBlcl9yZXN0b3JlKHZvaWQpOwogdm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyLAogCQkJICAgIHVpbnQzMl90IGZiX3dpZHRoLCB1aW50MzJfdCBmYl9oZWlnaHQpOwotdm9pZCBkcm1fZmJfaGVscGVyX2ZpbGxfZml4KHN0cnVjdCBmYl9pbmZvICppbmZvLCB1aW50MzJfdCBwaXRjaCwKLQkJCSAgICB1aW50MzJfdCBkZXB0aCk7Ci0KIGludCBkcm1fZmJfaGVscGVyX3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAogYm9vbCBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fbW0uaCBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCmluZGV4IGJmMDE1MzEuLmUzOTE3NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9tbS5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9tbS5oCkBAIC02MiwxMSArNjIsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHVudXNlZF9ub2RlczsKIAlpbnQgbnVtX3VudXNlZDsKIAlzcGlubG9ja190IHVudXNlZF9sb2NrOworCXVuc2lnbmVkIGludCBzY2FuX2NoZWNrX3JhbmdlIDogMTsKIAl1bnNpZ25lZCBzY2FuX2FsaWdubWVudDsKIAl1bnNpZ25lZCBsb25nIHNjYW5fc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHNjYW5faGl0X3N0YXJ0OwogCXVuc2lnbmVkIHNjYW5faGl0X3NpemU7CiAJdW5zaWduZWQgc2Nhbm5lZF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2Nhbl9lbmQ7CiB9OwogCiAvKgpAQCAtMTQ1LDYgKzE0OCwxMCBAQAogCiB2b2lkIGRybV9tbV9pbml0X3NjYW4oc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgYWxpZ25tZW50KTsKK3ZvaWQgZHJtX21tX2luaXRfc2Nhbl93aXRoX3JhbmdlKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgdW5zaWduZWQgbG9uZyBlbmQpOwogaW50IGRybV9tbV9zY2FuX2FkZF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUpOwogaW50IGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmggYi9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKaW5kZXggODgzYzFkNC4uZmUyOWFlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaApAQCAtMTQyLDYgKzE0Miw0MiBAQAogCXsweDEwMDIsIDB4NWU0YywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjQxMHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDVlNGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY0MTB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg1ZTRmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNDEwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzIxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzIzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzI1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzI3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzM4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjczOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQ1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc2NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc2NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc2NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzY3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2Nzc5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC00MTksNiArNDU1LDEwIEBACiAJezB4MTAwMiwgMHg5NzEzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTcxNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzg4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTcxNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SUzg4MHxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTgwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9QQUxNfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5ODAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1BBTE18UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk4MDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUEFMTXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTgwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9QQUxNfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezAsIDAsIDB9CiAKICNkZWZpbmUgcjEyOF9QQ0lfSURTIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmggYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCmluZGV4IGEyNzc2ZTIuLjAwMzlmMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaApAQCAtMjg5LDYgKzI4OSw3IEBACiAjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0JMVAkJIDExCiAjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX1JFTEFYRURfRkVOQ0lORwkgMTIKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQ09IRVJFTlRfUklOR1MJIDEzCisjZGVmaW5lIEk5MTVfUEFSQU1fSEFTX0VYRUNfQ09OU1RBTlRTCSAxNAogCiB0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV9nZXRwYXJhbSB7CiAJaW50IHBhcmFtOwpAQCAtNjM1LDYgKzYzNiwxNyBAQAogI2RlZmluZSBJOTE1X0VYRUNfUkVOREVSICAgICAgICAgICAgICAgICAoMTw8MCkKICNkZWZpbmUgSTkxNV9FWEVDX0JTRCAgICAgICAgICAgICAgICAgICAgKDI8PDApCiAjZGVmaW5lIEk5MTVfRVhFQ19CTFQgICAgICAgICAgICAgICAgICAgICgzPDwwKQorCisvKiBVc2VkIGZvciBzd2l0Y2hpbmcgdGhlIGNvbnN0YW50cyBhZGRyZXNzaW5nIG1vZGUgb24gZ2VuNCsgUkVOREVSIHJpbmcuCisgKiBHZW42KyBvbmx5IHN1cHBvcnRzIHJlbGF0aXZlIGFkZHJlc3NpbmcgdG8gZHluYW1pYyBzdGF0ZSAoZGVmYXVsdCkgYW5kCisgKiBhYnNvbHV0ZSBhZGRyZXNzaW5nLgorICoKKyAqIFRoZXNlIGZsYWdzIGFyZSBpZ25vcmVkIGZvciB0aGUgQlNEIGFuZCBCTFQgcmluZ3MuCisgKi8KKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19NQVNLIAkoMzw8NikKKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19SRUxfR0VORVJBTCAoMDw8NikgLyogZGVmYXVsdCAqLworI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX0FCU09MVVRFIAkoMTw8NikKKyNkZWZpbmUgSTkxNV9FWEVDX0NPTlNUQU5UU19SRUxfU1VSRkFDRSAoMjw8NikgLyogZ2VuNC81IG9ubHkgKi8KIAlfX3U2NCBmbGFnczsKIAlfX3U2NCByc3ZkMTsKIAlfX3U2NCByc3ZkMjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oIGIvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKaW5kZXggZDNjODE5NDYuLjllMzQzYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oCisrKyBiL2luY2x1ZGUvZHJtL2ludGVsLWd0dC5oCkBAIC0yLDE3ICsyLDQwIEBACiAKICNpZm5kZWYgX0RSTV9JTlRFTF9HVFRfSAogI2RlZmluZQlfRFJNX0lOVEVMX0dUVF9ICi1zdHJ1Y3QgaW50ZWxfZ3R0IHsKLQkvKiBOdW1iZXIgb2Ygc3RvbGVuIGd0dCBlbnRyaWVzIGF0IHRoZSBiZWdpbm5pbmcuICovCi0JdW5zaWduZWQgaW50IGd0dF9zdG9sZW5fZW50cmllczsKKworY29uc3Qgc3RydWN0IGludGVsX2d0dCB7CisJLyogU2l6ZSBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGdyYXBoaWNzIGJ5IHRoZSBCSU9TICovCisJdW5zaWduZWQgaW50IHN0b2xlbl9zaXplOwogCS8qIFRvdGFsIG51bWJlciBvZiBndHQgZW50cmllcy4gKi8KIAl1bnNpZ25lZCBpbnQgZ3R0X3RvdGFsX2VudHJpZXM7CiAJLyogUGFydCBvZiB0aGUgZ3R0IHRoYXQgaXMgbWFwcGFibGUgYnkgdGhlIGNwdSwgZm9yIHRob3NlIGNoaXBzIHdoZXJlCiAJICogdGhpcyBpcyBub3QgdGhlIGZ1bGwgZ3R0LiAqLwogCXVuc2lnbmVkIGludCBndHRfbWFwcGFibGVfZW50cmllczsKLX07CisJLyogV2hldGhlciBpOTE1IG5lZWRzIHRvIHVzZSB0aGUgZG1hciBhcGlzIG9yIG5vdC4gKi8KKwl1bnNpZ25lZCBpbnQgbmVlZHNfZG1hciA6IDE7Cit9ICppbnRlbF9ndHRfZ2V0KHZvaWQpOwogCi1zdHJ1Y3QgaW50ZWxfZ3R0ICppbnRlbF9ndHRfZ2V0KHZvaWQpOwordm9pZCBpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCh2b2lkKTsKK3ZvaWQgaW50ZWxfZ3R0X3VubWFwX21lbW9yeShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2xpc3QsIGludCBudW1fc2cpOwordm9pZCBpbnRlbF9ndHRfY2xlYXJfcmFuZ2UodW5zaWduZWQgaW50IGZpcnN0X2VudHJ5LCB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXMpOworaW50IGludGVsX2d0dF9tYXBfbWVtb3J5KHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBudW1fZW50cmllcywKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKipzZ19saXN0LCBpbnQgKm51bV9zZyk7Cit2b2lkIGludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2xpc3QsCisJCQkJIHVuc2lnbmVkIGludCBzZ19sZW4sCisJCQkJIHVuc2lnbmVkIGludCBwZ19zdGFydCwKKwkJCQkgdW5zaWduZWQgaW50IGZsYWdzKTsKK3ZvaWQgaW50ZWxfZ3R0X2luc2VydF9wYWdlcyh1bnNpZ25lZCBpbnQgZmlyc3RfZW50cnksIHVuc2lnbmVkIGludCBudW1fZW50cmllcywKKwkJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKiBTcGVjaWFsIGd0dCBtZW1vcnkgdHlwZXMgKi8KKyNkZWZpbmUgQUdQX0RDQUNIRV9NRU1PUlkJMQorI2RlZmluZSBBR1BfUEhZU19NRU1PUlkJCTIKKworLyogTmV3IGNhY2hpbmcgYXR0cmlidXRlcyBmb3IgZ2VuNi9zYW5keWJyaWRnZSAqLworI2RlZmluZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZX0xMQ19NTEMgKEFHUF9VU0VSX1RZUEVTICsgMikKKyNkZWZpbmUgQUdQX1VTRVJfVU5DQUNIRURfTUVNT1JZIChBR1BfVVNFUl9UWVBFUyArIDQpCisKKy8qIGZsYWcgZm9yIEdGRFQgdHlwZSAqLworI2RlZmluZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZX0dGRFQgKDEgPDwgMykKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmggYi9pbmNsdWRlL2RybS9ub3V2ZWF1X2RybS5oCmluZGV4IGJjNTU5MGIuLmUyY2ZlODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaApAQCAtNzEsMTYgKzcxLDE0IEBACiAjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fUENJX1ZFTkRPUiAgICAgIDMKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfREVWSUNFICAgICAgNAogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0JVU19UWVBFICAgICAgICA1Ci0jZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfUEhZU0lDQUwgICAgIDYKLSNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfUEhZU0lDQUwgICAgNwogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1NJWkUgICAgICAgICA4CiAjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQUdQX1NJWkUgICAgICAgIDkKLSNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfUEhZU0lDQUwgICAgMTAKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9DSElQU0VUX0lEICAgICAgMTEKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9WTV9WUkFNX0JBU0UgICAgMTIKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9HUkFQSF9VTklUUyAgICAgMTMKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QVElNRVJfVElNRSAgICAgMTQKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfQk9fVVNBR0UgICAgMTUKKyNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9IQVNfUEFHRUZMSVAgICAgMTYKIHN0cnVjdCBkcm1fbm91dmVhdV9nZXRwYXJhbSB7CiAJdWludDY0X3QgcGFyYW07CiAJdWludDY0X3QgdmFsdWU7CkBAIC0xNzEsNyArMTY5LDYgQEAKIH07CiAKICNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9XQUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfTk9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgTk9VVkVBVV9HRU1fQ1BVX1BSRVBfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKIHN0cnVjdCBkcm1fbm91dmVhdV9nZW1fY3B1X3ByZXAgewogCXVpbnQzMl90IGhhbmRsZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaCBiL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaAppbmRleCAxMGY4YjUzLi5lOTVhODZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKKysrIGIvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCkBAIC05MDYsNiArOTA2LDcgQEAKICNkZWZpbmUgUkFERU9OX0lORk9fQUNDRUxfV09SS0lORzIJMHgwNQogI2RlZmluZSBSQURFT05fSU5GT19USUxJTkdfQ09ORklHCTB4MDYKICNkZWZpbmUgUkFERU9OX0lORk9fV0FOVF9IWVBFUloJCTB4MDcKKyNkZWZpbmUgUkFERU9OX0lORk9fV0FOVF9DTUFTSwkJMHgwOCAvKiBnZXQgYWNjZXNzIHRvIENNQVNLIG9uIHIzMDAgKi8KIAogc3RydWN0IGRybV9yYWRlb25faW5mbyB7CiAJdWludDMyX3QJCXJlcXVlc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaAppbmRleCBiZWFmYzE1Li41MDg1MmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmgKQEAgLTc0LDYgKzc0LDggQEAKICAqIEBpc19pb21lbToJCWlzIHRoaXMgaW8gbWVtb3J5ID8KICAqIEBzaXplOgkJc2l6ZSBpbiBieXRlCiAgKiBAb2Zmc2V0OgkJb2Zmc2V0IGZyb20gdGhlIGJhc2UgYWRkcmVzcworICogQGlvX3Jlc2VydmVkX3ZtOiAgICAgVGhlIFZNIHN5c3RlbSBoYXMgYSByZWZjb3VudCBpbiBAaW9fcmVzZXJ2ZWRfY291bnQKKyAqIEBpb19yZXNlcnZlZF9jb3VudDogIFJlZmNvdW50aW5nIHRoZSBudW1iZXJzIG9mIGNhbGxlcnMgdG8gdHRtX21lbV9pb19yZXNlcnZlCiAgKgogICogU3RydWN0dXJlIGluZGljYXRpbmcgdGhlIGJ1cyBwbGFjZW1lbnQgb2YgYW4gb2JqZWN0LgogICovCkBAIC04Myw3ICs4NSw4IEBACiAJdW5zaWduZWQgbG9uZwlzaXplOwogCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwogCWJvb2wJCWlzX2lvbWVtOwotCWJvb2wJCWlvX3Jlc2VydmVkOworCWJvb2wJCWlvX3Jlc2VydmVkX3ZtOworCXVpbnQ2NF90ICAgICAgICBpb19yZXNlcnZlZF9jb3VudDsKIH07CiAKIApAQCAtMTU0LDcgKzE1Nyw2IEBACiAgKiBrZWVwcyBvbmUgcmVmY291bnQuIFdoZW4gdGhpcyByZWZjb3VudCByZWFjaGVzIHplcm8sCiAgKiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4KICAqIEBldmVudF9xdWV1ZTogUXVldWUgZm9yIHByb2Nlc3NlcyB3YWl0aW5nIG9uIGJ1ZmZlciBvYmplY3Qgc3RhdHVzIGNoYW5nZS4KLSAqIEBsb2NrOiBzcGlubG9jayBwcm90ZWN0aW5nIG1vc3RseSBzeW5jaHJvbml6YXRpb24gbWVtYmVycy4KICAqIEBtZW06IHN0cnVjdHVyZSBkZXNjcmliaW5nIGN1cnJlbnQgcGxhY2VtZW50LgogICogQHBlcnNpc3RhbnRfc3dhcF9zdG9yYWdlOiBVc3VhbGx5IHRoZSBzd2FwIHN0b3JhZ2UgaXMgZGVsZXRlZCBmb3IgYnVmZmVycwogICogcGlubmVkIGluIHBoeXNpY2FsIG1lbW9yeS4gSWYgdGhpcyBiZWhhdmlvdXIgaXMgbm90IGRlc2lyZWQsIHRoaXMgbWVtYmVyCkBAIC0yMTMsNyArMjE1LDYgQEAKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBrcmVmIGxpc3Rfa3JlZjsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF9xdWV1ZTsKLQlzcGlubG9ja190IGxvY2s7CiAKIAkvKioKIAkgKiBNZW1iZXJzIHByb3RlY3RlZCBieSB0aGUgYm86OnJlc2VydmVkIGxvY2suCkBAIC0yMzcsNiArMjM4LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxydTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRkZXN0cm95OwogCXN0cnVjdCBsaXN0X2hlYWQgc3dhcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlvX3Jlc2VydmVfbHJ1OwogCXVpbnQzMl90IHZhbF9zZXE7CiAJYm9vbCBzZXFfdmFsaWQ7CiAKQEAgLTI0OCwxMCArMjUwLDEwIEBACiAJYXRvbWljX3QgcmVzZXJ2ZWQ7CiAKIAkvKioKLQkgKiBNZW1iZXJzIHByb3RlY3RlZCBieSB0aGUgYm86OmxvY2sKKwkgKiBNZW1iZXJzIHByb3RlY3RlZCBieSBzdHJ1Y3QgYnVmZmVyX29iamVjdF9kZXZpY2U6OmZlbmNlX2xvY2sKIAkgKiBJbiBhZGRpdGlvbiwgc2V0dGluZyBzeW5jX29iaiB0byBhbnl0aGluZyBlbHNlCiAJICogdGhhbiBOVUxMIHJlcXVpcmVzIGJvOjpyZXNlcnZlZCB0byBiZSBoZWxkLiBUaGlzIGFsbG93cyBmb3IKLQkgKiBjaGVja2luZyBOVUxMIHdoaWxlIHJlc2VydmVkIGJ1dCBub3QgaG9sZGluZyBibzo6bG9jay4KKwkgKiBjaGVja2luZyBOVUxMIHdoaWxlIHJlc2VydmVkIGJ1dCBub3QgaG9sZGluZyB0aGUgbWVudGlvbmVkIGxvY2suCiAJICovCiAKIAl2b2lkICpzeW5jX29ial9hcmc7CkBAIC0zNjQsNiArMzY2LDQ0IEBACiAgKi8KIGV4dGVybiB2b2lkIHR0bV9ib191bnJlZihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKipibyk7CiAKKworLyoqCisgKiB0dG1fYm9fbGlzdF9yZWZfc3ViCisgKgorICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdC4KKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiByZWZlcmVuY2VzIHdpdGggd2hpY2ggdG8gZGVjcmVhc2UgQGJvOjpsaXN0X2tyZWY7CisgKiBAbmV2ZXJfZnJlZTogVGhlIHJlZmNvdW50IHNob3VsZCBub3QgcmVhY2ggemVybyB3aXRoIHRoaXMgb3BlcmF0aW9uLgorICoKKyAqIFJlbGVhc2UgQGNvdW50IGxydSBsaXN0IHJlZmVyZW5jZXMgdG8gdGhpcyBidWZmZXIgb2JqZWN0LgorICovCitleHRlcm4gdm9pZCB0dG1fYm9fbGlzdF9yZWZfc3ViKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGludCBjb3VudCwKKwkJCQlib29sIG5ldmVyX2ZyZWUpOworCisvKioKKyAqIHR0bV9ib19hZGRfdG9fbHJ1CisgKgorICogQGJvOiBUaGUgYnVmZmVyIG9iamVjdC4KKyAqCisgKiBBZGQgdGhpcyBibyB0byB0aGUgcmVsZXZhbnQgbWVtIHR5cGUgbHJ1IGFuZCwgaWYgaXQncyBiYWNrZWQgYnkKKyAqIHN5c3RlbSBwYWdlcyAodHRtcykgdG8gdGhlIHN3YXAgbGlzdC4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzdHJ1Y3QgdHRtX2JvX2dsb2JhbDo6bHJ1X2xvY2sgaGVsZCwgYW5kCisgKiBpcyB0eXBpY2FsbHkgY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIHVucmVzZXJ2aW5nIGEgYm8uCisgKi8KK2V4dGVybiB2b2lkIHR0bV9ib19hZGRfdG9fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworCisvKioKKyAqIHR0bV9ib19kZWxfZnJvbV9scnUKKyAqCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0LgorICoKKyAqIFJlbW92ZSB0aGlzIGJvIGZyb20gYWxsIGxydSBsaXN0cyB1c2VkIHRvIGxvb2t1cCBhbmQgcmVzZXJ2ZSBhbiBvYmplY3QuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc3RydWN0IHR0bV9ib19nbG9iYWw6OmxydV9sb2NrIGhlbGQsCisgKiBhbmQgaXMgdXN1YWxseSBjYWxsZWQganVzdCBpbW1lZGlhdGVseSBhZnRlciB0aGUgYm8gaGFzIGJlZW4gcmVzZXJ2ZWQgdG8KKyAqIGF2b2lkIHJlY3Vyc2l2ZSByZXNlcnZhdGlvbiBmcm9tIGxydSBsaXN0cy4KKyAqLworZXh0ZXJuIGludCB0dG1fYm9fZGVsX2Zyb21fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworCisKIC8qKgogICogdHRtX2JvX2xvY2tfZGVsYXllZF93b3JrcXVldWUKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaAppbmRleCA4ZTBjODQ4Li4xZGE4YWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKQEAgLTE3OSwzMCArMTc5LDYgQEAKICNkZWZpbmUgVFRNX01FTVRZUEVfRkxBR19NQVBQQUJMRSAgICAgICgxIDw8IDEpCS8qIE1lbW9yeSBtYXBwYWJsZSAqLwogI2RlZmluZSBUVE1fTUVNVFlQRV9GTEFHX0NNQSAgICAgICAgICAgKDEgPDwgMykJLyogQ2FuJ3QgbWFwIGFwZXJ0dXJlICovCiAKLS8qKgotICogc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyCi0gKgotICogQGhhc190eXBlOiBUaGUgbWVtb3J5IHR5cGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gKiBAdXNlX3R5cGU6IFRoZSBtZW1vcnkgdHlwZSBpcyBlbmFibGVkLgotICogQGZsYWdzOiBUVE1fTUVNVFlQRV9YWCBmbGFncyBpZGVudGlmeWluZyB0aGUgdHJhaXRzIG9mIHRoZSBtZW1vcnkKLSAqIG1hbmFnZWQgYnkgdGhpcyBtZW1vcnkgdHlwZS4KLSAqIEBncHVfb2Zmc2V0OiBJZiB1c2VkLCB0aGUgR1BVIG9mZnNldCBvZiB0aGUgZmlyc3QgbWFuYWdlZCBwYWdlIG9mCi0gKiBmaXhlZCBtZW1vcnkgb3IgdGhlIGZpcnN0IG1hbmFnZWQgbG9jYXRpb24gaW4gYW4gYXBlcnR1cmUuCi0gKiBAc2l6ZTogU2l6ZSBvZiB0aGUgbWFuYWdlZCByZWdpb24uCi0gKiBAYXZhaWxhYmxlX2NhY2hpbmc6IEEgbWFzayBvZiBhdmFpbGFibGUgY2FjaGluZyB0eXBlcywgVFRNX1BMX0ZMQUdfWFgsCi0gKiBhcyBkZWZpbmVkIGluIHR0bV9wbGFjZW1lbnRfY29tbW9uLmgKLSAqIEBkZWZhdWx0X2NhY2hpbmc6IFRoZSBkZWZhdWx0IGNhY2hpbmcgcG9saWN5IHVzZWQgZm9yIGEgYnVmZmVyIG9iamVjdAotICogcGxhY2VkIGluIHRoaXMgbWVtb3J5IHR5cGUgaWYgdGhlIHVzZXIgZG9lc24ndCBwcm92aWRlIG9uZS4KLSAqIEBtYW5hZ2VyOiBUaGUgcmFuZ2UgbWFuYWdlciB1c2VkIGZvciB0aGlzIG1lbW9yeSB0eXBlLiBGSVhNRTogSWYgdGhlIGFwZXJ0dXJlCi0gKiBoYXMgYSBwYWdlIHNpemUgZGlmZmVyZW50IGZyb20gdGhlIHVuZGVybHlpbmcgc3lzdGVtLCB0aGUgZ3JhbnVsYXJpdHkKLSAqIG9mIHRoaXMgbWFuYWdlciBzaG91bGQgdGFrZSBjYXJlIG9mIHRoaXMuIEJ1dCB0aGUgcmFuZ2UgYWxsb2NhdGluZyBjb2RlCi0gKiBpbiB0dG1fYm8uYyBuZWVkcyB0byBiZSBtb2RpZmllZCBmb3IgdGhpcy4KLSAqIEBscnU6IFRoZSBscnUgbGlzdCBmb3IgdGhpcyBtZW1vcnkgdHlwZS4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBtYW5hZ2UgbWVtb3J5IHR5cGVzIGZvciBhIGRldmljZS4KLSAqIEl0J3Mgc2V0IHVwIGJ5IHRoZSB0dG1fYm9fZHJpdmVyOjppbml0X21lbV90eXBlIG1ldGhvZC4KLSAqLwotCiBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXI7CiAKIHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcl9mdW5jIHsKQEAgLTI4Nyw2ICsyNjMsMzYgQEAKIAl2b2lkICgqZGVidWcpKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLCBjb25zdCBjaGFyICpwcmVmaXgpOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIKKyAqCisgKiBAaGFzX3R5cGU6IFRoZSBtZW1vcnkgdHlwZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAqIEB1c2VfdHlwZTogVGhlIG1lbW9yeSB0eXBlIGlzIGVuYWJsZWQuCisgKiBAZmxhZ3M6IFRUTV9NRU1UWVBFX1hYIGZsYWdzIGlkZW50aWZ5aW5nIHRoZSB0cmFpdHMgb2YgdGhlIG1lbW9yeQorICogbWFuYWdlZCBieSB0aGlzIG1lbW9yeSB0eXBlLgorICogQGdwdV9vZmZzZXQ6IElmIHVzZWQsIHRoZSBHUFUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBtYW5hZ2VkIHBhZ2Ugb2YKKyAqIGZpeGVkIG1lbW9yeSBvciB0aGUgZmlyc3QgbWFuYWdlZCBsb2NhdGlvbiBpbiBhbiBhcGVydHVyZS4KKyAqIEBzaXplOiBTaXplIG9mIHRoZSBtYW5hZ2VkIHJlZ2lvbi4KKyAqIEBhdmFpbGFibGVfY2FjaGluZzogQSBtYXNrIG9mIGF2YWlsYWJsZSBjYWNoaW5nIHR5cGVzLCBUVE1fUExfRkxBR19YWCwKKyAqIGFzIGRlZmluZWQgaW4gdHRtX3BsYWNlbWVudF9jb21tb24uaAorICogQGRlZmF1bHRfY2FjaGluZzogVGhlIGRlZmF1bHQgY2FjaGluZyBwb2xpY3kgdXNlZCBmb3IgYSBidWZmZXIgb2JqZWN0CisgKiBwbGFjZWQgaW4gdGhpcyBtZW1vcnkgdHlwZSBpZiB0aGUgdXNlciBkb2Vzbid0IHByb3ZpZGUgb25lLgorICogQGZ1bmM6IHN0cnVjdHVyZSBwb2ludGVyIGltcGxlbWVudGluZyB0aGUgcmFuZ2UgbWFuYWdlci4gU2VlIGFib3ZlCisgKiBAcHJpdjogRHJpdmVyIHByaXZhdGUgY2xvc3VyZSBmb3IgQGZ1bmMuCisgKiBAaW9fcmVzZXJ2ZV9tdXRleDogTXV0ZXggb3B0aW9uYWxseSBwcm90ZWN0aW5nIHNoYXJlZCBpb19yZXNlcnZlIHN0cnVjdHVyZXMKKyAqIEB1c2VfaW9fcmVzZXJ2ZV9scnU6IFVzZSBhbiBscnUgbGlzdCB0byB0cnkgdG8gdW5yZXNlcnZlIGlvX21lbV9yZWdpb25zCisgKiByZXNlcnZlZCBieSB0aGUgVFRNIHZtIHN5c3RlbS4KKyAqIEBpb19yZXNlcnZlX2xydTogT3B0aW9uYWwgbHJ1IGxpc3QgZm9yIHVucmVzZXJ2aW5nIGlvIG1lbSByZWdpb25zLgorICogQGlvX3Jlc2VydmVfZmFzdHBhdGg6IE9ubHkgdXNlIGJkZXY6OmRyaXZlcjo6aW9fbWVtX3Jlc2VydmUgdG8gb2J0YWluCisgKiBzdGF0aWMgaW5mb3JtYXRpb24uIGJkZXY6OmRyaXZlcjo6aW9fbWVtX2ZyZWUgaXMgbmV2ZXIgdXNlZC4KKyAqIEBscnU6IFRoZSBscnUgbGlzdCBmb3IgdGhpcyBtZW1vcnkgdHlwZS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBtYW5hZ2UgbWVtb3J5IHR5cGVzIGZvciBhIGRldmljZS4KKyAqIEl0J3Mgc2V0IHVwIGJ5IHRoZSB0dG1fYm9fZHJpdmVyOjppbml0X21lbV90eXBlIG1ldGhvZC4KKyAqLworCisKKwogc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyIHsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldjsKIApAQCAtMzAzLDYgKzMwOSwxNSBAQAogCXVpbnQzMl90IGRlZmF1bHRfY2FjaGluZzsKIAljb25zdCBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXJfZnVuYyAqZnVuYzsKIAl2b2lkICpwcml2OworCXN0cnVjdCBtdXRleCBpb19yZXNlcnZlX211dGV4OworCWJvb2wgdXNlX2lvX3Jlc2VydmVfbHJ1OworCWJvb2wgaW9fcmVzZXJ2ZV9mYXN0cGF0aDsKKworCS8qCisJICogUHJvdGVjdGVkIGJ5IEBpb19yZXNlcnZlX211dGV4OgorCSAqLworCisJc3RydWN0IGxpc3RfaGVhZCBpb19yZXNlcnZlX2xydTsKIAogCS8qCiAJICogUHJvdGVjdGVkIGJ5IHRoZSBnbG9iYWwtPmxydV9sb2NrLgpAQCAtNTEwLDkgKzUyNSwxMiBAQAogICoKICAqIEBkcml2ZXI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2JvX2RyaXZlciBzdHJ1Y3Qgc2V0dXAgYnkgdGhlIGRyaXZlci4KICAqIEBtYW46IEFuIGFycmF5IG9mIG1lbV90eXBlX21hbmFnZXJzLgorICogQGZlbmNlX2xvY2s6IFByb3RlY3RzIHRoZSBzeW5jaHJvbml6aW5nIG1lbWJlcnMgb24gKmFsbCogYm9zIGJlbG9uZ2luZworICogdG8gdGhpcyBkZXZpY2UuCiAgKiBAYWRkcl9zcGFjZV9tbTogUmFuZ2UgbWFuYWdlciBmb3IgdGhlIGRldmljZSBhZGRyZXNzIHNwYWNlLgogICogbHJ1X2xvY2s6IFNwaW5sb2NrIHRoYXQgcHJvdGVjdHMgdGhlIGJ1ZmZlcitkZXZpY2UgbHJ1IGxpc3RzIGFuZAogICogZGRlc3Ryb3kgbGlzdHMuCisgKiBAdmFsX3NlcTogQ3VycmVudCB2YWxpZGF0aW9uIHNlcXVlbmNlLgogICogQG5pY2VfbW9kZTogVHJ5IG5pY2VseSB0byB3YWl0IGZvciBidWZmZXIgaWRsZSB3aGVuIGNsZWFuaW5nIGEgbWFuYWdlci4KICAqIElmIGEgR1BVIGxvY2t1cCBoYXMgYmVlbiBkZXRlY3RlZCwgdGhpcyBpcyBmb3JjZWQgdG8gMC4KICAqIEBkZXZfbWFwcGluZzogQSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWRkcmVzc19zcGFjZSByZXByZXNlbnRpbmcgdGhlCkBAIC01MzEsNiArNTQ5LDcgQEAKIAlzdHJ1Y3QgdHRtX2JvX2RyaXZlciAqZHJpdmVyOwogCXJ3bG9ja190IHZtX2xvY2s7CiAJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyIG1hbltUVE1fTlVNX01FTV9UWVBFU107CisJc3BpbmxvY2tfdCBmZW5jZV9sb2NrOwogCS8qCiAJICogUHJvdGVjdGVkIGJ5IHRoZSB2bSBsb2NrLgogCSAqLwpAQCAtNTQxLDYgKzU2MCw3IEBACiAJICogUHJvdGVjdGVkIGJ5IHRoZSBnbG9iYWw6bHJ1IGxvY2suCiAJICovCiAJc3RydWN0IGxpc3RfaGVhZCBkZGVzdHJveTsKKwl1aW50MzJfdCB2YWxfc2VxOwogCiAJLyoKIAkgKiBQcm90ZWN0ZWQgYnkgbG9hZCAvIGZpcnN0b3BlbiAvIGxhc3RjbG9zZSAvdW5sb2FkIHN5bmMuCkBAIC03NTMsMzEgKzc3Myw2IEBACiAKIGV4dGVybiBpbnQgdHRtX2JvX3dhaXRfY3B1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sIGJvb2wgbm9fd2FpdCk7CiAKLS8qKgotICogdHRtX2JvX3BjaV9vZmZzZXQgLSBHZXQgdGhlIFBDSSBvZmZzZXQgZm9yIHRoZSBidWZmZXIgb2JqZWN0IG1lbW9yeS4KLSAqCi0gKiBAYm8gUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdC4KLSAqIEBidXNfYmFzZSBPbiByZXR1cm4gdGhlIGJhc2Ugb2YgdGhlIFBDSSByZWdpb24KLSAqIEBidXNfb2Zmc2V0IE9uIHJldHVybiB0aGUgYnl0ZSBvZmZzZXQgaW50byB0aGUgUENJIHJlZ2lvbgotICogQGJ1c19zaXplIE9uIHJldHVybiB0aGUgYnl0ZSBzaXplIG9mIHRoZSBidWZmZXIgb2JqZWN0IG9yIHplcm8gaWYKLSAqIHRoZSBidWZmZXIgb2JqZWN0IG1lbW9yeSBpcyBub3QgYWNjZXNzaWJsZSB0aHJvdWdoIGEgUENJIHJlZ2lvbi4KLSAqCi0gKiBSZXR1cm5zOgotICogLUVJTlZBTCBpZiB0aGUgYnVmZmVyIG9iamVjdCBpcyBjdXJyZW50bHkgbm90IG1hcHBhYmxlLgotICogMCBvdGhlcndpc2UuCi0gKi8KLQotZXh0ZXJuIGludCB0dG1fYm9fcGNpX29mZnNldChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCSAgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJ1c19iYXNlLAotCQkJICAgICB1bnNpZ25lZCBsb25nICpidXNfb2Zmc2V0LAotCQkJICAgICB1bnNpZ25lZCBsb25nICpidXNfc2l6ZSk7Ci0KLWV4dGVybiBpbnQgdHRtX21lbV9pb19yZXNlcnZlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAotCQkJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKTsKLWV4dGVybiB2b2lkIHR0bV9tZW1faW9fZnJlZShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKLQkJCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSk7Ci0KIGV4dGVybiB2b2lkIHR0bV9ib19nbG9iYWxfcmVsZWFzZShzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZik7CiBleHRlcm4gaW50IHR0bV9ib19nbG9iYWxfaW5pdChzdHJ1Y3QgZHJtX2dsb2JhbF9yZWZlcmVuY2UgKnJlZik7CiAKQEAgLTgxMCw2ICs4MDUsMjIgQEAKIGV4dGVybiB2b2lkIHR0bV9ib191bm1hcF92aXJ0dWFsKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOwogCiAvKioKKyAqIHR0bV9ib191bm1hcF92aXJ0dWFsCisgKgorICogQGJvOiB0ZWFyIGRvd24gdGhlIHZpcnR1YWwgbWFwcGluZ3MgZm9yIHRoaXMgQk8KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgdGFrZSB0dG1fbWVtX2lvX2xvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgdHRtX2JvX3VubWFwX3ZpcnR1YWxfbG9ja2VkKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworCitleHRlcm4gaW50IHR0bV9tZW1faW9fcmVzZXJ2ZV92bShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKK2V4dGVybiB2b2lkIHR0bV9tZW1faW9fZnJlZV92bShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKK2V4dGVybiBpbnQgdHRtX21lbV9pb19sb2NrKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLAorCQkJICAgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKK2V4dGVybiB2b2lkIHR0bV9tZW1faW9fdW5sb2NrKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuKTsKKworCisvKioKICAqIHR0bV9ib19yZXNlcnZlOgogICoKICAqIEBibzogQSBwb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LgpAQCAtODU5LDExICs4NzAsNDQgQEAKICAqIHRyeSBhZ2Fpbi4gKG9ubHkgaWYgdXNlX3NlcXVlbmNlID09IDEpLgogICogLUVSRVNUQVJUU1lTOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5CiAgKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCisgKiAtRUJVU1k6IFRoZSBmdW5jdGlvbiBuZWVkZWQgdG8gc2xlZXAsIGJ1dCBAbm9fd2FpdCB3YXMgdHJ1ZQorICogLUVERUFETEs6IEJvIGFscmVhZHkgcmVzZXJ2ZWQgdXNpbmcgQHNlcXVlbmNlLiBUaGlzIGVycm9yIGNvZGUgd2lsbCBvbmx5CisgKiBiZSByZXR1cm5lZCBpZiBAdXNlX3NlcXVlbmNlIGlzIHNldCB0byB0cnVlLgogICovCiBleHRlcm4gaW50IHR0bV9ib19yZXNlcnZlKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCiAJCQkgIGJvb2wgaW50ZXJydXB0aWJsZSwKIAkJCSAgYm9vbCBub193YWl0LCBib29sIHVzZV9zZXF1ZW5jZSwgdWludDMyX3Qgc2VxdWVuY2UpOwogCisKKy8qKgorICogdHRtX2JvX3Jlc2VydmVfbG9ja2VkOgorICoKKyAqIEBibzogQSBwb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LgorICogQGludGVycnVwdGlibGU6IFNsZWVwIGludGVycnVwdGlibGUgaWYgd2FpdGluZy4KKyAqIEBub193YWl0OiBEb24ndCBzbGVlcCB3aGlsZSB0cnlpbmcgdG8gcmVzZXJ2ZSwgcmF0aGVyIHJldHVybiAtRUJVU1kuCisgKiBAdXNlX3NlcXVlbmNlOiBJZiBAYm8gaXMgYWxyZWFkeSByZXNlcnZlZCwgT25seSBzbGVlcCB3YWl0aW5nIGZvcgorICogaXQgdG8gYmVjb21lIHVucmVzZXJ2ZWQgaWYgQHNlcXVlbmNlIDwgKEBibyktPnNlcXVlbmNlLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggc3RydWN0IHR0bV9ib19nbG9iYWw6OmxydV9sb2NrIGhlbGQsCisgKiBhbmQgd2lsbCBub3QgcmVtb3ZlIHJlc2VydmVkIGJ1ZmZlcnMgZnJvbSB0aGUgbHJ1IGxpc3RzLgorICogVGhlIGZ1bmN0aW9uIG1heSByZWxlYXNlIHRoZSBMUlUgc3BpbmxvY2sgaWYgaXQgbmVlZHMgdG8gc2xlZXAuCisgKiBPdGhlcndpc2UgaWRlbnRpY2FsIHRvIHR0bV9ib19yZXNlcnZlLgorICoKKyAqIFJldHVybnM6CisgKiAtRUFHQUlOOiBUaGUgcmVzZXJ2YXRpb24gbWF5IGNhdXNlIGEgZGVhZGxvY2suCisgKiBSZWxlYXNlIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zLCB3YWl0IGZvciBAYm8gdG8gYmVjb21lIHVucmVzZXJ2ZWQgYW5kCisgKiB0cnkgYWdhaW4uIChvbmx5IGlmIHVzZV9zZXF1ZW5jZSA9PSAxKS4KKyAqIC1FUkVTVEFSVFNZUzogQSB3YWl0IGZvciB0aGUgYnVmZmVyIHRvIGJlY29tZSB1bnJlc2VydmVkIHdhcyBpbnRlcnJ1cHRlZCBieQorICogYSBzaWduYWwuIFJlbGVhc2UgYWxsIGJ1ZmZlciByZXNlcnZhdGlvbnMgYW5kIHJldHVybiB0byB1c2VyLXNwYWNlLgorICogLUVCVVNZOiBUaGUgZnVuY3Rpb24gbmVlZGVkIHRvIHNsZWVwLCBidXQgQG5vX3dhaXQgd2FzIHRydWUKKyAqIC1FREVBRExLOiBCbyBhbHJlYWR5IHJlc2VydmVkIHVzaW5nIEBzZXF1ZW5jZS4gVGhpcyBlcnJvciBjb2RlIHdpbGwgb25seQorICogYmUgcmV0dXJuZWQgaWYgQHVzZV9zZXF1ZW5jZSBpcyBzZXQgdG8gdHJ1ZS4KKyAqLworZXh0ZXJuIGludCB0dG1fYm9fcmVzZXJ2ZV9sb2NrZWQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKKwkJCQkgYm9vbCBpbnRlcnJ1cHRpYmxlLAorCQkJCSBib29sIG5vX3dhaXQsIGJvb2wgdXNlX3NlcXVlbmNlLAorCQkJCSB1aW50MzJfdCBzZXF1ZW5jZSk7CisKIC8qKgogICogdHRtX2JvX3VucmVzZXJ2ZQogICoKQEAgLTg3NCw2ICs5MTgsMTYgQEAKIGV4dGVybiB2b2lkIHR0bV9ib191bnJlc2VydmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CiAKIC8qKgorICogdHRtX2JvX3VucmVzZXJ2ZV9sb2NrZWQKKyAqCisgKiBAYm86IEEgcG9pbnRlciB0byBhIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdC4KKyAqCisgKiBVbnJlc2VydmUgYSBwcmV2aW91cyByZXNlcnZhdGlvbiBvZiBAYm8uCisgKiBOZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBzdHJ1Y3QgdHRtX2JvX2dsb2JhbDo6bHJ1X2xvY2sgaGVsZC4KKyAqLworZXh0ZXJuIHZvaWQgdHRtX2JvX3VucmVzZXJ2ZV9sb2NrZWQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CisKKy8qKgogICogdHRtX2JvX3dhaXRfdW5yZXNlcnZlZAogICoKICAqIEBibzogQSBwb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9leGVjYnVmX3V0aWwuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmgKaW5kZXggY2QyYzQ3NS4uMjZjYzdmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9leGVjYnVmX3V0aWwuaAorKysgYi9pbmNsdWRlL2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5oCkBAIC00MSw3ICs0MSwxMCBAQAogICogQGJvOiAgICAgICAgICAgICByZWZjb3VudGVkIGJ1ZmZlciBvYmplY3QgcG9pbnRlci4KICAqIEBuZXdfc3luY19vYmpfYXJnOiBOZXcgc3luY19vYmpfYXJnIGZvciBAYm8sIHRvIGJlIHVzZWQgb25jZQogICogYWRkaW5nIGEgbmV3IHN5bmMgb2JqZWN0LgotICogQHJlc2VydmllZDogICAgICBJbmRpY2F0ZXMgd2hldGhlciBAYm8gaGFzIGJlZW4gcmVzZXJ2ZWQgZm9yIHZhbGlkYXRpb24uCisgKiBAcmVzZXJ2ZWQ6ICAgICAgIEluZGljYXRlcyB3aGV0aGVyIEBibyBoYXMgYmVlbiByZXNlcnZlZCBmb3IgdmFsaWRhdGlvbi4KKyAqIEByZW1vdmVkOiAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgQGJvIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBscnUgbGlzdHMuCisgKiBAcHV0X2NvdW50OiAgICAgIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIG9uIGJvOjpsaXN0X2tyZWYuCisgKiBAb2xkX3N5bmNfb2JqOiAgIFBvaW50ZXIgdG8gYSBzeW5jIG9iamVjdCBhYm91dCB0byBiZSB1bnJlZmVyZW5jZWQKICAqLwogCiBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciB7CkBAIC00OSw2ICs1Miw5IEBACiAJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibzsKIAl2b2lkICpuZXdfc3luY19vYmpfYXJnOwogCWJvb2wgcmVzZXJ2ZWQ7CisJYm9vbCByZW1vdmVkOworCWludCBwdXRfY291bnQ7CisJdm9pZCAqb2xkX3N5bmNfb2JqOwogfTsKIAogLyoqCkBAIC02Niw3ICs3Miw2IEBACiAgKiBmdW5jdGlvbiB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzCiAgKgogICogQGxpc3Q6ICAgIHRocmVhZCBwcml2YXRlIGxpc3Qgb2YgdHRtX3ZhbGlkYXRlX2J1ZmZlciBzdHJ1Y3RzLgotICogQHZhbF9zZXE6IEEgdW5pcXVlIHNlcXVlbmNlIG51bWJlci4KICAqCiAgKiBUcmllcyB0byByZXNlcnZlIGJvcyBwb2ludGVkIHRvIGJ5IHRoZSBsaXN0IGVudHJpZXMgZm9yIHZhbGlkYXRpb24uCiAgKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLCBhbGwgYnVmZmVycyBhcmUgbWFya2VkIGFzICJ1bmZlbmNlZCIsCkBAIC04OCw3ICs5Myw3IEBACiAgKiBoYXMgZmFpbGVkLgogICovCiAKLWV4dGVybiBpbnQgdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCB1aW50MzJfdCB2YWxfc2VxKTsKK2V4dGVybiBpbnQgdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKIAogLyoqCiAgKiBmdW5jdGlvbiB0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleXMvZW5jcnlwdGVkLXR5cGUuaCBiL2luY2x1ZGUva2V5cy9lbmNyeXB0ZWQtdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODU1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2tleXMvZW5jcnlwdGVkLXR5cGUuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBNaW1pIFpvaGFyIDx6b2hhckB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0tFWVNfRU5DUllQVEVEX1RZUEVfSAorI2RlZmluZSBfS0VZU19FTkNSWVBURURfVFlQRV9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCitzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCWNoYXIgKm1hc3Rlcl9kZXNjOwkvKiBkYXRhYmxvYjogbWFzdGVyIGtleSBuYW1lICovCisJY2hhciAqZGF0YWxlbjsJCS8qIGRhdGFibG9iOiBkZWNyeXB0ZWQga2V5IGxlbmd0aCAqLworCXU4ICppdjsJCQkvKiBkYXRhYmxvYjogaXYgKi8KKwl1OCAqZW5jcnlwdGVkX2RhdGE7CS8qIGRhdGFibG9iOiBlbmNyeXB0ZWQgZGF0YSAqLworCXVuc2lnbmVkIHNob3J0IGRhdGFibG9iX2xlbjsJLyogbGVuZ3RoIG9mIGRhdGFibG9iICovCisJdW5zaWduZWQgc2hvcnQgZGVjcnlwdGVkX2RhdGFsZW47CS8qIGRlY3J5cHRlZCBkYXRhIGxlbmd0aCAqLworCXU4IGRlY3J5cHRlZF9kYXRhWzBdOwkvKiBkZWNyeXB0ZWQgZGF0YSArICBkYXRhYmxvYiArIGhtYWMgKi8KK307CisKK2V4dGVybiBzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfZW5jcnlwdGVkOworCisjZW5kaWYgLyogX0tFWVNfRU5DUllQVEVEX1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rZXlzL3RydXN0ZWQtdHlwZS5oIGIvaW5jbHVkZS9rZXlzL3RydXN0ZWQtdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjgyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2tleXMvdHJ1c3RlZC10eXBlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBJQk0gQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogRGF2aWQgU2FmZm9yZCA8c2FmZm9yZEB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0tFWVNfVFJVU1RFRF9UWVBFX0gKKyNkZWZpbmUgX0tFWVNfVFJVU1RFRF9UWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKKyNkZWZpbmUgTUlOX0tFWV9TSVpFCQkJMzIKKyNkZWZpbmUgTUFYX0tFWV9TSVpFCQkJMTI4CisjZGVmaW5lIE1BWF9CTE9CX1NJWkUJCQkzMjAKKworc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgeworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJdW5zaWduZWQgaW50IGtleV9sZW47CisJdW5zaWduZWQgaW50IGJsb2JfbGVuOworCXVuc2lnbmVkIGNoYXIgbWlncmF0YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGtleVtNQVhfS0VZX1NJWkUgKyAxXTsKKwl1bnNpZ25lZCBjaGFyIGJsb2JbTUFYX0JMT0JfU0laRV07Cit9OworCitleHRlcm4gc3RydWN0IGtleV90eXBlIGtleV90eXBlX3RydXN0ZWQ7CisKKyNlbmRpZiAvKiBfS0VZU19UUlVTVEVEX1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCBhMzU0YzE5Li4yMjk2ZDhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMjAsMTUgKzIwLDE4IEBACiBvYmpoZHIteSArPSB2ZXJzaW9uLmgKIAogaWZuZXEgKCQod2lsZGNhcmQgJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvaW5jbHVkZS9hc20vYS5vdXQuaCBcCi0JCSAgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpL2Eub3V0LmgpLCkKKwkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkvYS5vdXQuaCBcCisJCSAgJChJTlNUQUxMX0hEUl9QQVRIKS9pbmNsdWRlL2FzbS0qL2Eub3V0LmgpLCkKIGhlYWRlci15ICs9IGEub3V0LmgKIGVuZGlmCiBpZm5lcSAoJCh3aWxkY2FyZCAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2FzbS9rdm0uaCBcCi0JCSAgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpL2t2bS5oKSwpCisJCSAgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpL2t2bS5oIFwKKwkJICAkKElOU1RBTExfSERSX1BBVEgpL2luY2x1ZGUvYXNtLSova3ZtLmgpLCkKIGhlYWRlci15ICs9IGt2bS5oCiBlbmRpZgogaWZuZXEgKCQod2lsZGNhcmQgJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvaW5jbHVkZS9hc20va3ZtX3BhcmEuaCBcCi0JCSAgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpL2t2bV9wYXJhLmgpLCkKKwkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtX3BhcmEuaCBcCisJCSAgJChJTlNUQUxMX0hEUl9QQVRIKS9pbmNsdWRlL2FzbS0qL2t2bV9wYXJhLmgpLCkKIGhlYWRlci15ICs9IGt2bV9wYXJhLmgKIGVuZGlmCiAKQEAgLTE1NSw2ICsxNTgsNyBAQAogaGVhZGVyLXkgKz0gaWYuaAogaGVhZGVyLXkgKz0gaWZfYWRkci5oCiBoZWFkZXIteSArPSBpZl9hZGRybGFiZWwuaAoraGVhZGVyLXkgKz0gaWZfYWxnLmgKIGhlYWRlci15ICs9IGlmX2FyY25ldC5oCiBoZWFkZXIteSArPSBpZl9hcnAuaAogaGVhZGVyLXkgKz0gaWZfYm9uZGluZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDY3YzkxYjQuLmViMTc2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0zNTIsNCArMzUyLDE0IEBACiAJcmV0dXJuIC0xOwogfQogI2VuZGlmCS8qICFDT05GSUdfQUNQSSAqLworCisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKK2ludCBzdXNwZW5kX252c19yZWdpc3Rlcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHN1c3BlbmRfbnZzX3JlZ2lzdGVyKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNlbmRpZgkvKl9MSU5VWF9BQ1BJX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oIGIvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCmluZGV4IDA5ZWE0YTEuLmVhZjZjZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKQEAgLTEwMiwxMCArMTAyLDggQEAKIGV4dGVybiBpbnQgYWdwX2NvcHlfaW5mbyhzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIHN0cnVjdCBhZ3Bfa2Vybl9pbmZvICopOwogZXh0ZXJuIGludCBhZ3BfYmluZF9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKiwgb2ZmX3QpOwogZXh0ZXJuIGludCBhZ3BfdW5iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqKTsKLWV4dGVybiBpbnQgYWdwX3JlYmluZF9tZW1vcnkodm9pZCk7CiBleHRlcm4gdm9pZCBhZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgdTMyKTsKIGV4dGVybiBzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICphZ3BfYmFja2VuZF9hY3F1aXJlKHN0cnVjdCBwY2lfZGV2ICopOwogZXh0ZXJuIHZvaWQgYWdwX2JhY2tlbmRfcmVsZWFzZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOwotZXh0ZXJuIHZvaWQgYWdwX2ZsdXNoX2NoaXBzZXQoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKIAogI2VuZGlmCQkJCS8qIF9BR1BfQkFDS0VORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggOGI1YzA2Mi4uMzU5ZGYwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtMzcyLDYgKzM3Miw3IEBACiBzdHJ1Y3QgYXVkaXRfY29udGV4dDsKIHN0cnVjdCBpbm9kZTsKIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtczsKK3N0cnVjdCBwYXRoOwogc3RydWN0IGxpbnV4X2JpbnBybTsKIHN0cnVjdCBtcV9hdHRyOwogc3RydWN0IG1xc3RhdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKaW5kZXggNjRhNzExNC4uYzNkNjUxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKQEAgLTI1LDcgKzI1LDcgQEAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50cyB0aGF0IGFyZSB1c2VkIHdoZW4gbG9hZGluZyBiaW5hcmllcy4KICAqLwotc3RydWN0IGxpbnV4X2JpbnBybXsKK3N0cnVjdCBsaW51eF9iaW5wcm0gewogCWNoYXIgYnVmW0JJTlBSTV9CVUZfU0laRV07CiAjaWZkZWYgQ09ORklHX01NVQogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwpAQCAtOTMsNyArOTMsNiBAQAogCWludCAoKmxvYWRfc2hsaWIpKHN0cnVjdCBmaWxlICopOwogCWludCAoKmNvcmVfZHVtcCkoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSk7CiAJdW5zaWduZWQgbG9uZyBtaW5fY29yZWR1bXA7CS8qIG1pbmltYWwgZHVtcCBzaXplICovCi0JaW50IGhhc3Zkc287CiB9OwogCiBleHRlcm4gaW50IF9fcmVnaXN0ZXJfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKmZtdCwgaW50IGluc2VydCk7CkBAIC0xMTMsNyArMTEyLDcgQEAKIAogZXh0ZXJuIGludCBwcmVwYXJlX2JpbnBybShzdHJ1Y3QgbGludXhfYmlucHJtICopOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgcmVtb3ZlX2FyZ196ZXJvKHN0cnVjdCBsaW51eF9iaW5wcm0gKik7Ci1leHRlcm4gaW50IHNlYXJjaF9iaW5hcnlfaGFuZGxlcihzdHJ1Y3QgbGludXhfYmlucHJtICosc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gaW50IHNlYXJjaF9iaW5hcnlfaGFuZGxlcihzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIGludCBmbHVzaF9vbGRfZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSk7CiBleHRlcm4gdm9pZCBzZXR1cF9uZXdfZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDM2YWI0MmMuLjRkMThmZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTE1LDYgKzExNSw3IEBACiAJdm9pZCAqZWxldmF0b3JfcHJpdmF0ZTM7CiAKIAlzdHJ1Y3QgZ2VuZGlzayAqcnFfZGlzazsKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKICNpZmRlZiBDT05GSUdfQkxLX0NHUk9VUAogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF90aW1lX25zOwpAQCAtNjQ2LDcgKzY0Nyw2IEBACiAKIGV4dGVybiBpbnQgYmxrX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIGV4dGVybiB2b2lkIGJsa191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKLWV4dGVybiB2b2lkIHJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRldik7CiBleHRlcm4gdm9pZCBnZW5lcmljX21ha2VfcmVxdWVzdChzdHJ1Y3QgYmlvICpiaW8pOwogZXh0ZXJuIHZvaWQgYmxrX3JxX2luaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSk7CiBleHRlcm4gdm9pZCBibGtfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKik7CkBAIC0xMjU2LDYgKzEyNTYsOSBAQAogCWludCAoKmNvbXBhdF9pb2N0bCkgKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgZm1vZGVfdCwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogCWludCAoKmRpcmVjdF9hY2Nlc3MpIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LAogCQkJCQkJdm9pZCAqKiwgdW5zaWduZWQgbG9uZyAqKTsKKwl1bnNpZ25lZCBpbnQgKCpjaGVja19ldmVudHMpIChzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2xlYXJpbmcpOworCS8qIC0+bWVkaWFfY2hhbmdlZCgpIGlzIERFUFJFQ0FURUQsIHVzZSAtPmNoZWNrX2V2ZW50cygpIGluc3RlYWQgKi8KIAlpbnQgKCptZWRpYV9jaGFuZ2VkKSAoc3RydWN0IGdlbmRpc2sgKik7CiAJdm9pZCAoKnVubG9ja19uYXRpdmVfY2FwYWNpdHkpIChzdHJ1Y3QgZ2VuZGlzayAqKTsKIAlpbnQgKCpyZXZhbGlkYXRlX2Rpc2spIChzdHJ1Y3QgZ2VuZGlzayAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggOTAwMTJiOS4uZmIxNmEzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTI0Niw3ICsyNDYsNiBAQAogLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VjdXJlIGF0dGVudGlvbiBrZXkgKi8KIC8qIEFsbG93IGFkbWluaXN0cmF0aW9uIG9mIHRoZSByYW5kb20gZGV2aWNlICovCiAvKiBBbGxvdyBleGFtaW5hdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBkaXNrIHF1b3RhcyAqLwotLyogQWxsb3cgY29uZmlndXJpbmcgdGhlIGtlcm5lbCdzIHN5c2xvZyAocHJpbnRrIGJlaGF2aW91cikgKi8KIC8qIEFsbG93IHNldHRpbmcgdGhlIGRvbWFpbm5hbWUgKi8KIC8qIEFsbG93IHNldHRpbmcgdGhlIGhvc3RuYW1lICovCiAvKiBBbGxvdyBjYWxsaW5nIGJkZmx1c2goKSAqLwpAQCAtMzUyLDcgKzM1MSwxMSBAQAogCiAjZGVmaW5lIENBUF9NQUNfQURNSU4gICAgICAgIDMzCiAKLSNkZWZpbmUgQ0FQX0xBU1RfQ0FQICAgICAgICAgQ0FQX01BQ19BRE1JTgorLyogQWxsb3cgY29uZmlndXJpbmcgdGhlIGtlcm5lbCdzIHN5c2xvZyAocHJpbnRrIGJlaGF2aW91cikgKi8KKworI2RlZmluZSBDQVBfU1lTTE9HICAgICAgICAgICAzNAorCisjZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9TWVNMT0cKIAogI2RlZmluZSBjYXBfdmFsaWQoeCkgKCh4KSA+PSAwICYmICh4KSA8PSBDQVBfTEFTVF9DQVApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2Rldi5oIGIvaW5jbHVkZS9saW51eC9jZGV2LmgKaW5kZXggZjM4OWUzMS4uZmI0NTkxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9jZGV2LmgKQEAgLTI4LDggKzI4LDYgQEAKIAogdm9pZCBjZGV2X2RlbChzdHJ1Y3QgY2RldiAqKTsKIAotaW50IGNkZXZfaW5kZXgoc3RydWN0IGlub2RlICppbm9kZSk7Ci0KIHZvaWQgY2RfZm9yZ2V0KHN0cnVjdCBpbm9kZSAqKTsKIAogZXh0ZXJuIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvIGRpcmVjdGx5X21hcHBhYmxlX2NkZXZfYmRpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZHJvbS5oIGIvaW5jbHVkZS9saW51eC9jZHJvbS5oCmluZGV4IDc4ZTkwNDcuLjM1ZWFlNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2Ryb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKQEAgLTk0Niw2ICs5NDYsOCBAQAogLyogZGV2aWNlLXJlbGF0ZWQgc3RvcmFnZSAqLwogCXVuc2lnbmVkIGludCBvcHRpb25zCTogMzA7CS8qIG9wdGlvbnMgZmxhZ3MgKi8KIAl1bnNpZ25lZCBtY19mbGFncwk6IDI7CS8qIG1lZGlhIGNoYW5nZSBidWZmZXIgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgdmZzX2V2ZW50czsJLyogY2FjaGVkIGV2ZW50cyBmb3IgdmZzIHBhdGggKi8KKwl1bnNpZ25lZCBpbnQgaW9jdGxfZXZlbnRzOwkvKiBjYWNoZWQgZXZlbnRzIGZvciBpb2N0bCBwYXRoICovCiAgICAgCWludCB1c2VfY291bnQ7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHRpbWVzIGRldmljZSBvcGVuZWQgKi8KICAgICAJY2hhciBuYW1lWzIwXTsgICAgICAgICAgICAgICAgICAvKiBuYW1lIG9mIHRoZSBkZXZpY2UgdHlwZSAqLwogLyogcGVyLWRldmljZSBmbGFncyAqLwpAQCAtOTY1LDYgKzk2Nyw4IEBACiAJaW50ICgqb3BlbikgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOwogCXZvaWQgKCpyZWxlYXNlKSAoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICopOwogCWludCAoKmRyaXZlX3N0YXR1cykgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCBpbnQpOworCXVuc2lnbmVkIGludCAoKmNoZWNrX2V2ZW50cykgKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjbGVhcmluZywgaW50IHNsb3QpOwogCWludCAoKm1lZGlhX2NoYW5nZWQpIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKIAlpbnQgKCp0cmF5X21vdmUpIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKIAlpbnQgKCpsb2NrX2Rvb3IpIChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKiwgaW50KTsKQEAgLTk5Myw2ICs5OTcsOCBAQAogZXh0ZXJuIHZvaWQgY2Ryb21fcmVsZWFzZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgZm1vZGVfdCBtb2RlKTsKIGV4dGVybiBpbnQgY2Ryb21faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCSAgICAgICBmbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgY2Ryb21fY2hlY2tfZXZlbnRzKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2xlYXJpbmcpOwogZXh0ZXJuIGludCBjZHJvbV9tZWRpYV9jaGFuZ2VkKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqKTsKIAogZXh0ZXJuIGludCByZWdpc3Rlcl9jZHJvbShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvY2VwaF9mcy5oIGIvaW5jbHVkZS9saW51eC9jZXBoL2NlcGhfZnMuaAppbmRleCBjM2M3NGFlLi4wOWRjYzBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NlcGgvY2VwaF9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9jZXBoX2ZzLmgKQEAgLTQzLDYgKzQzLDEwIEBACiAjZGVmaW5lIENFUEhfRkVBVFVSRV9OT1NSQ0FERFIgICAgICAoMTw8MSkKICNkZWZpbmUgQ0VQSF9GRUFUVVJFX01PTkNMT0NLQ0hFQ0sgICgxPDwyKQogI2RlZmluZSBDRVBIX0ZFQVRVUkVfRkxPQ0sgICAgICAgICAgKDE8PDMpCisjZGVmaW5lIENFUEhfRkVBVFVSRV9TVUJTQ1JJQkUyICAgICAoMTw8NCkKKyNkZWZpbmUgQ0VQSF9GRUFUVVJFX01PTk5BTUVTICAgICAgICgxPDw1KQorI2RlZmluZSBDRVBIX0ZFQVRVUkVfUkVDT05ORUNUX1NFUSAgKDE8PDYpCisjZGVmaW5lIENFUEhfRkVBVFVSRV9ESVJMQVlPVVRIQVNIICAoMTw8NykKIAogCiAvKgpAQCAtNTUsMTAgKzU5LDEwIEBACiAJX19sZTMyIGZsX3N0cmlwZV9jb3VudDsgICAgLyogb3ZlciB0aGlzIG1hbnkgb2JqZWN0cyAqLwogCV9fbGUzMiBmbF9vYmplY3Rfc2l6ZTsgICAgIC8qIHVudGlsIG9iamVjdHMgYXJlIHRoaXMgYmlnLCB0aGVuIG1vdmUgdG8KIAkJCQkgICAgICBuZXcgb2JqZWN0cyAqLwotCV9fbGUzMiBmbF9jYXNfaGFzaDsgICAgICAgIC8qIDAgPSBub25lOyAxID0gc2hhMjU2ICovCisJX19sZTMyIGZsX2Nhc19oYXNoOyAgICAgICAgLyogVU5VU0VELiAgMCA9IG5vbmU7IDEgPSBzaGEyNTYgKi8KIAogCS8qIHBnIC0+IGRpc2sgbGF5b3V0ICovCi0JX19sZTMyIGZsX29iamVjdF9zdHJpcGVfdW5pdDsgIC8qIGZvciBwZXItb2JqZWN0IHBhcml0eSwgaWYgYW55ICovCisJX19sZTMyIGZsX29iamVjdF9zdHJpcGVfdW5pdDsgIC8qIFVOVVNFRC4gIGZvciBwZXItb2JqZWN0IHBhcml0eSwgaWYgYW55ICovCiAKIAkvKiBvYmplY3QgLT4gcGcgbGF5b3V0ICovCiAJX19sZTMyIGZsX3BnX3ByZWZlcnJlZDsgLyogcHJlZmVycmVkIHByaW1hcnkgZm9yIHBnICgtMSBmb3Igbm9uZSkgKi8KQEAgLTY5LDYgKzczLDEyIEBACiAKIGludCBjZXBoX2ZpbGVfbGF5b3V0X2lzX3ZhbGlkKGNvbnN0IHN0cnVjdCBjZXBoX2ZpbGVfbGF5b3V0ICpsYXlvdXQpOwogCitzdHJ1Y3QgY2VwaF9kaXJfbGF5b3V0IHsKKwlfX3U4ICAgZGxfZGlyX2hhc2g7ICAgLyogc2VlIGNlcGhfaGFzaC5oIGZvciBpZHMgKi8KKwlfX3U4ICAgZGxfdW51c2VkMTsKKwlfX3UxNiAgZGxfdW51c2VkMjsKKwlfX3UzMiAgZGxfdW51c2VkMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBjcnlwdG8gYWxnb3JpdGhtcyAqLwogI2RlZmluZSBDRVBIX0NSWVBUT19OT05FIDB4MApAQCAtNDU3LDcgKzQ2Nyw3IEBACiAJc3RydWN0IGNlcGhfdGltZXNwZWMgcmN0aW1lOwogCXN0cnVjdCBjZXBoX2ZyYWdfdHJlZV9oZWFkIGZyYWd0cmVlOyAgLyogKG11c3QgYmUgYXQgZW5kIG9mIHN0cnVjdCkgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotLyogZm9sbG93ZWQgYnkgZnJhZyBhcnJheSwgdGhlbiBzeW1saW5rIHN0cmluZywgdGhlbiB4YXR0ciBibG9iICovCisvKiBmb2xsb3dlZCBieSBmcmFnIGFycmF5LCBzeW1saW5rIHN0cmluZywgZGlyIGxheW91dCwgeGF0dHIgYmxvYiAqLwogCiAvKiByZXBseV9sZWFzZSBmb2xsb3dzIGRuYW1lLCBhbmQgcmVwbHlfaW5vZGUgKi8KIHN0cnVjdCBjZXBoX21kc19yZXBseV9sZWFzZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2NlcGgvbWVzc2VuZ2VyLmgKaW5kZXggYTEwOGI0Mi4uYzMwMTFiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZXBoL21lc3Nlbmdlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY2VwaC9tZXNzZW5nZXIuaApAQCAtMTEwLDE3ICsxMTAsMTIgQEAKIAogLyoKICAqIGNlcGhfY29ubmVjdGlvbiBzdGF0ZSBiaXQgZmxhZ3MKLSAqCi0gKiBRVUVVRUQgYW5kIEJVU1kgYXJlIHVzZWQgdG9nZXRoZXIgdG8gZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZQotICogdGhyZWFkIGlzIGN1cnJlbnRseSBvcGVuaW5nLCByZWFkaW5nIG9yIHdyaXRpbmcgZGF0YSB0byB0aGUgc29ja2V0LgogICovCiAjZGVmaW5lIExPU1NZVFggICAgICAgICAwICAvKiB3ZSBjYW4gY2xvc2UgY2hhbm5lbCBvciBkcm9wIG1lc3NhZ2VzIG9uIGVycm9ycyAqLwogI2RlZmluZSBDT05ORUNUSU5HCTEKICNkZWZpbmUgTkVHT1RJQVRJTkcJMgogI2RlZmluZSBLRUVQQUxJVkVfUEVORElORyAgICAgIDMKICNkZWZpbmUgV1JJVEVfUEVORElORwk0ICAvKiB3ZSBoYXZlIGRhdGEgcmVhZHkgdG8gc2VuZCAqLwotI2RlZmluZSBRVUVVRUQgICAgICAgICAgNSAgLyogdGhlcmUgaXMgd29yayBxdWV1ZWQgb24gdGhpcyBjb25uZWN0aW9uICovCi0jZGVmaW5lIEJVU1kgICAgICAgICAgICA2ICAvKiB3b3JrIGlzIGJlaW5nIGRvbmUgKi8KICNkZWZpbmUgU1RBTkRCWQkJOCAgLyogbm8gb3V0Z29pbmcgbWVzc2FnZXMsIHNvY2tldCBjbG9zZWQuICB3ZSBrZWVwCiAJCQkgICAgKiB0aGUgY2VwaF9jb25uZWN0aW9uIGFyb3VuZCB0byBtYWludGFpbiBzaGFyZWQKIAkJCSAgICAqIHN0YXRlIHdpdGggdGhlIHBlZXIuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaAppbmRleCBlZDRiYTExLi5jZTEwNGUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKQEAgLTU2NCw3ICs1NjQsNyBAQAogLyoKICAqIFRvIGl0ZXJhdGUgYWNyb3NzIHRoZSB0YXNrcyBpbiBhIGNncm91cDoKICAqCi0gKiAxKSBjYWxsIGNncm91cF9pdGVyX3N0YXJ0IHRvIGludGlhbGl6ZSBhbiBpdGVyYXRvcgorICogMSkgY2FsbCBjZ3JvdXBfaXRlcl9zdGFydCB0byBpbml0aWFsaXplIGFuIGl0ZXJhdG9yCiAgKgogICogMikgY2FsbCBjZ3JvdXBfaXRlcl9uZXh0KCkgdG8gcmV0cmlldmUgbWVtYmVyIHRhc2tzIHVudGlsIGl0CiAgKiAgICByZXR1cm5zIE5VTEwgb3IgdW50aWwgeW91IHdhbnQgdG8gZW5kIHRoZSBpdGVyYXRpb24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGFjdGlvbi5oIGIvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKaW5kZXggNWFjNTE1NS4uZGZhMmVkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmgKQEAgLTExLDYgKzExLDkgQEAKIC8qIFRoZSBmdWxsIHpvbmUgd2FzIGNvbXBhY3RlZCAqLwogI2RlZmluZSBDT01QQUNUX0NPTVBMRVRFCTMKIAorI2RlZmluZSBDT01QQUNUX01PREVfRElSRUNUX1JFQ0xBSU0JMAorI2RlZmluZSBDT01QQUNUX01PREVfS1NXQVBECQkxCisKICNpZmRlZiBDT05GSUdfQ09NUEFDVElPTgogZXh0ZXJuIGludCBzeXNjdGxfY29tcGFjdF9tZW1vcnk7CiBleHRlcm4gaW50IHN5c2N0bF9jb21wYWN0aW9uX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKQEAgLTIxLDcgKzI0LDEyIEBACiAKIGV4dGVybiBpbnQgZnJhZ21lbnRhdGlvbl9pbmRleChzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgaW50IG9yZGVyKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19jb21wYWN0X3BhZ2VzKHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCi0JCQlpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrLCBub2RlbWFza190ICptYXNrKTsKKwkJCWludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2ssIG5vZGVtYXNrX3QgKm1hc2ssCisJCQlib29sIHN5bmMpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29tcGFjdGlvbl9zdWl0YWJsZShzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvbXBhY3Rfem9uZV9vcmRlcihzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyLAorCQkJCQlnZnBfdCBnZnBfbWFzaywgYm9vbCBzeW5jLAorCQkJCQlpbnQgY29tcGFjdF9tb2RlKTsKIAogLyogRG8gbm90IHNraXAgY29tcGFjdGlvbiBtb3JlIHRoYW4gNjQgdGltZXMgKi8KICNkZWZpbmUgQ09NUEFDVF9NQVhfREVGRVJfU0hJRlQgNgpAQCAtNTQsNyArNjIsMjAgQEAKIAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0cnlfdG9fY29tcGFjdF9wYWdlcyhzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LAotCQkJaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaywgbm9kZW1hc2tfdCAqbm9kZW1hc2spCisJCQlpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrLCBub2RlbWFza190ICpub2RlbWFzaywKKwkJCWJvb2wgc3luYykKK3sKKwlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvbXBhY3Rpb25fc3VpdGFibGUoc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlcikKK3sKKwlyZXR1cm4gQ09NUEFDVF9TS0lQUEVEOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29tcGFjdF96b25lX29yZGVyKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIsCisJCQkJCSAgICAgICBnZnBfdCBnZnBfbWFzaywgYm9vbCBzeW5jLAorCQkJCQkgICAgICAgaW50IGNvbXBhY3RfbW9kZSkKIHsKIAlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3Blci5oIGIvaW5jbHVkZS9saW51eC9jcGVyLmgKaW5kZXggYmY5NzJmOC4uMzEwNGFhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcGVyLmgKQEAgLTM5LDEwICszOSwxMiBAQAogICogU2V2ZXJpdHkgZGlmaW5pdGlvbiBmb3IgZXJyb3Jfc2V2ZXJpdHkgaW4gc3RydWN0IGNwZXJfcmVjb3JkX2hlYWRlcgogICogYW5kIHNlY3Rpb25fc2V2ZXJpdHkgaW4gc3RydWN0IGNwZXJfc2VjdGlvbl9kZXNjcmlwdG9yCiAgKi8KLSNkZWZpbmUgQ1BFUl9TRVZfUkVDT1ZFUkFCTEUJCQkweDAKLSNkZWZpbmUgQ1BFUl9TRVZfRkFUQUwJCQkJMHgxCi0jZGVmaW5lIENQRVJfU0VWX0NPUlJFQ1RFRAkJCTB4MgotI2RlZmluZSBDUEVSX1NFVl9JTkZPUk1BVElPTkFMCQkJMHgzCitlbnVtIHsKKwlDUEVSX1NFVl9SRUNPVkVSQUJMRSwKKwlDUEVSX1NFVl9GQVRBTCwKKwlDUEVSX1NFVl9DT1JSRUNURUQsCisJQ1BFUl9TRVZfSU5GT1JNQVRJT05BTCwKK307CiAKIC8qCiAgKiBWYWxpZGF0aW9uIGJpdHMgZGlmaW5pdGlvbiBmb3IgdmFsaWRhdGlvbl9iaXRzIGluIHN0cnVjdApAQCAtMjAxLDYgKzIwMyw0NyBAQAogCVVVSURfTEUoMHgwMzZGODRFMSwgMHg3RjM3LCAweDQyOGMsIDB4QTcsIDB4OUUsIDB4NTcsIDB4NUYsCVwKIAkJMHhERiwgMHhBQSwgMHg4NCwgMHhFQykKIAorI2RlZmluZSBDUEVSX1BST0NfVkFMSURfVFlQRQkJCTB4MDAwMQorI2RlZmluZSBDUEVSX1BST0NfVkFMSURfSVNBCQkJMHgwMDAyCisjZGVmaW5lIENQRVJfUFJPQ19WQUxJRF9FUlJPUl9UWVBFCQkweDAwMDQKKyNkZWZpbmUgQ1BFUl9QUk9DX1ZBTElEX09QRVJBVElPTgkJMHgwMDA4CisjZGVmaW5lIENQRVJfUFJPQ19WQUxJRF9GTEFHUwkJCTB4MDAxMAorI2RlZmluZSBDUEVSX1BST0NfVkFMSURfTEVWRUwJCQkweDAwMjAKKyNkZWZpbmUgQ1BFUl9QUk9DX1ZBTElEX1ZFUlNJT04JCQkweDAwNDAKKyNkZWZpbmUgQ1BFUl9QUk9DX1ZBTElEX0JSQU5EX0lORk8JCTB4MDA4MAorI2RlZmluZSBDUEVSX1BST0NfVkFMSURfSUQJCQkweDAxMDAKKyNkZWZpbmUgQ1BFUl9QUk9DX1ZBTElEX1RBUkdFVF9BRERSRVNTCQkweDAyMDAKKyNkZWZpbmUgQ1BFUl9QUk9DX1ZBTElEX1JFUVVFU1RPUl9JRAkJMHgwNDAwCisjZGVmaW5lIENQRVJfUFJPQ19WQUxJRF9SRVNQT05ERVJfSUQJCTB4MDgwMAorI2RlZmluZSBDUEVSX1BST0NfVkFMSURfSVAJCQkweDEwMDAKKworI2RlZmluZSBDUEVSX01FTV9WQUxJRF9FUlJPUl9TVEFUVVMJCTB4MDAwMQorI2RlZmluZSBDUEVSX01FTV9WQUxJRF9QSFlTSUNBTF9BRERSRVNTCQkweDAwMDIKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfUEhZU0lDQUxfQUREUkVTU19NQVNLCTB4MDAwNAorI2RlZmluZSBDUEVSX01FTV9WQUxJRF9OT0RFCQkJMHgwMDA4CisjZGVmaW5lIENQRVJfTUVNX1ZBTElEX0NBUkQJCQkweDAwMTAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfTU9EVUxFCQkJMHgwMDIwCisjZGVmaW5lIENQRVJfTUVNX1ZBTElEX0JBTksJCQkweDAwNDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfREVWSUNFCQkJMHgwMDgwCisjZGVmaW5lIENQRVJfTUVNX1ZBTElEX1JPVwkJCTB4MDEwMAorI2RlZmluZSBDUEVSX01FTV9WQUxJRF9DT0xVTU4JCQkweDAyMDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfQklUX1BPU0lUSU9OCQkweDA0MDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfUkVRVUVTVE9SX0lECQkweDA4MDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfUkVTUE9OREVSX0lECQkweDEwMDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfVEFSR0VUX0lECQkweDIwMDAKKyNkZWZpbmUgQ1BFUl9NRU1fVkFMSURfRVJST1JfVFlQRQkJMHg0MDAwCisKKyNkZWZpbmUgQ1BFUl9QQ0lFX1ZBTElEX1BPUlRfVFlQRQkJMHgwMDAxCisjZGVmaW5lIENQRVJfUENJRV9WQUxJRF9WRVJTSU9OCQkJMHgwMDAyCisjZGVmaW5lIENQRVJfUENJRV9WQUxJRF9DT01NQU5EX1NUQVRVUwkJMHgwMDA0CisjZGVmaW5lIENQRVJfUENJRV9WQUxJRF9ERVZJQ0VfSUQJCTB4MDAwOAorI2RlZmluZSBDUEVSX1BDSUVfVkFMSURfU0VSSUFMX05VTUJFUgkJMHgwMDEwCisjZGVmaW5lIENQRVJfUENJRV9WQUxJRF9CUklER0VfQ09OVFJPTF9TVEFUVVMJMHgwMDIwCisjZGVmaW5lIENQRVJfUENJRV9WQUxJRF9DQVBBQklMSVRZCQkweDAwNDAKKyNkZWZpbmUgQ1BFUl9QQ0lFX1ZBTElEX0FFUl9JTkZPCQkweDAwODAKKworI2RlZmluZSBDUEVSX1BDSUVfU0xPVF9TSElGVAkJCTMKKwogLyoKICAqIEFsbCB0YWJsZXMgYW5kIHN0cnVjdHMgbXVzdCBiZSBieXRlLXBhY2tlZCB0byBtYXRjaCBDUEVSCiAgKiBzcGVjaWZpY2F0aW9uLCBzaW5jZSB0aGUgdGFibGVzIGFyZSBwcm92aWRlZCBieSB0aGUgc3lzdGVtIEJJT1MKQEAgLTMwNiw2ICszNDksNDEgQEAKIAlfX3U4CWVycm9yX3R5cGU7CiB9OwogCitzdHJ1Y3QgY3Blcl9zZWNfcGNpZSB7CisJX191NjQJCXZhbGlkYXRpb25fYml0czsKKwlfX3UzMgkJcG9ydF90eXBlOworCXN0cnVjdCB7CisJCV9fdTgJbWlub3I7CisJCV9fdTgJbWFqb3I7CisJCV9fdTgJcmVzZXJ2ZWRbMl07CisJfQkJdmVyc2lvbjsKKwlfX3UxNgkJY29tbWFuZDsKKwlfX3UxNgkJc3RhdHVzOworCV9fdTMyCQlyZXNlcnZlZDsKKwlzdHJ1Y3QgeworCQlfX3UxNgl2ZW5kb3JfaWQ7CisJCV9fdTE2CWRldmljZV9pZDsKKwkJX191OAljbGFzc19jb2RlWzNdOworCQlfX3U4CWZ1bmN0aW9uOworCQlfX3U4CWRldmljZTsKKwkJX191MTYJc2VnbWVudDsKKwkJX191OAlidXM7CisJCV9fdTgJc2Vjb25kYXJ5X2J1czsKKwkJX191MTYJc2xvdDsKKwkJX191OAlyZXNlcnZlZDsKKwl9CQlkZXZpY2VfaWQ7CisJc3RydWN0IHsKKwkJX191MzIJbG93ZXI7CisJCV9fdTMyCXVwcGVyOworCX0JCXNlcmlhbF9udW1iZXI7CisJc3RydWN0IHsKKwkJX191MTYJc2Vjb25kYXJ5X3N0YXR1czsKKwkJX191MTYJY29udHJvbDsKKwl9CQlicmlkZ2U7CisJX191OAljYXBhYmlsaXR5WzYwXTsKKwlfX3U4CWFlcl9pbmZvWzk2XTsKK307CisKIC8qIFJlc2V0IHRvIGRlZmF1bHQgcGFja2luZyAqLwogI3ByYWdtYSBwYWNrKCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmggYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAppbmRleCAxYmU0MTZiLi4zNjcxOWVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaApAQCAtNDcsMTMgKzQ3LDcgQEAKIAogLyogSWRsZSBTdGF0ZSBGbGFncyAqLwogI2RlZmluZSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRAkoMHgwMSkgLyogaXMgcmVzaWRlbmN5IHRpbWUgbWVhc3VyYWJsZT8gKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX0NIRUNLX0JNCSgweDAyKSAvKiBCTSBhY3Rpdml0eSB3aWxsIGV4aXQgc3RhdGUgKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX1BPTEwJKDB4MTApIC8qIG5vIGxhdGVuY3ksIG5vIHNhdmluZ3MgKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX1NIQUxMT1cJKDB4MjApIC8qIGxvdyBsYXRlbmN5LCBtaW5pbWFsIHNhdmluZ3MgKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX0JBTEFOQ0VECSgweDQwKSAvKiBtZWRpdW0gbGF0ZW5jeSwgbW9kZXJhdGUgc2F2aW5ncyAqLwotI2RlZmluZSBDUFVJRExFX0ZMQUdfREVFUAkoMHg4MCkgLyogaGlnaCBsYXRlbmN5LCBsYXJnZSBzYXZpbmdzICovCiAjZGVmaW5lIENQVUlETEVfRkxBR19JR05PUkUJKDB4MTAwKSAvKiBpZ25vcmUgZHVyaW5nIHRoaXMgaWRsZSBwZXJpb2QgKi8KLSNkZWZpbmUgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVEICgweDIwMCkgLyogdGxiIHdpbGwgYmUgZmx1c2hlZCAqLwogCiAjZGVmaW5lIENQVUlETEVfRFJJVkVSX0ZMQUdTX01BU0sgKDB4RkZGRjAwMDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3JhbWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2NyYW1mc19mcy5oCmluZGV4IDZmYzJiZWQuLjBlN2JmMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3JhbWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcmFtZnNfZnMuaApAQCAtODQsOSArODQsMTEgQEAKIAkJCQl8IENSQU1GU19GTEFHX1dST05HX1NJR05BVFVSRSBcCiAJCQkJfCBDUkFNRlNfRkxBR19TSElGVEVEX1JPT1RfT0ZGU0VUICkKIAorI2lmZGVmIF9fS0VSTkVMX18KIC8qIFVuY29tcHJlc3Npb24gaW50ZXJmYWNlcyB0byB0aGUgdW5kZXJseWluZyB6bGliICovCiBpbnQgY3JhbWZzX3VuY29tcHJlc3NfYmxvY2sodm9pZCAqZHN0LCBpbnQgZHN0bGVuLCB2b2lkICpzcmMsIGludCBzcmNsZW4pOwogaW50IGNyYW1mc191bmNvbXByZXNzX2luaXQodm9pZCk7CiB2b2lkIGNyYW1mc191bmNvbXByZXNzX2V4aXQodm9pZCk7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3M1NTM1LmggYi9pbmNsdWRlL2xpbnV4L2NzNTUzNS5oCmluZGV4IGQ1YTFkNDguLjZmZTIxMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3M1NTM1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jczU1MzUuaApAQCAtMTAzLDE0ICsxMDMsMjAgQEAKICNkZWZpbmUgR1BJT19QT1NJVElWRV9FREdFX1NUUwkweDQ4CiAjZGVmaW5lIEdQSU9fTkVHQVRJVkVfRURHRV9TVFMJMHg0QwogCisjZGVmaW5lIEdQSU9fRkxUUjdfQU1PVU5UCTB4RDgKKwogI2RlZmluZSBHUElPX01BUF9YCQkweEUwCiAjZGVmaW5lIEdQSU9fTUFQX1kJCTB4RTQKICNkZWZpbmUgR1BJT19NQVBfWgkJMHhFOAogI2RlZmluZSBHUElPX01BUF9XCQkweEVDCiAKKyNkZWZpbmUgR1BJT19GRTdfU0VMCQkweEY3CisKIHZvaWQgY3M1NTM1X2dwaW9fc2V0KHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgaW50IHJlZyk7CiB2b2lkIGNzNTUzNV9ncGlvX2NsZWFyKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgaW50IHJlZyk7CiBpbnQgY3M1NTM1X2dwaW9faXNzZXQodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcmVnKTsKK2ludCBjczU1MzVfZ3Bpb19zZXRfaXJxKHVuc2lnbmVkIGdyb3VwLCB1bnNpZ25lZCBpcnEpOwordm9pZCBjczU1MzVfZ3Bpb19zZXR1cF9ldmVudCh1bnNpZ25lZCBvZmZzZXQsIGludCBwYWlyLCBpbnQgcG1lKTsKIAogLyogTUZHUFRzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCmluZGV4IGJkMDc3NTguLjU5ZmNkMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaApAQCAtMzA3LDcgKzMwNyw3IEBACiAgKiBfX2RfcmN1X3RvX3JlZmNvdW50IC0gdGFrZSBhIHJlZmNvdW50IG9uIGRlbnRyeSBpZiBzZXF1ZW5jZSBjaGVjayBpcyBvawogICogQGRlbnRyeTogZGVudHJ5IHRvIHRha2UgYSByZWYgb24KICAqIEBzZXE6IHNlcWNvdW50IHRvIHZlcmlmeSBhZ2FpbnN0Ci0gKiBAUmV0dXJuczogMCBvbiBmYWlsdXJlLCBlbHNlIDEuCisgKiBSZXR1cm5zOiAwIG9uIGZhaWx1cmUsIGVsc2UgMS4KICAqCiAgKiBfX2RfcmN1X3RvX3JlZmNvdW50IG9wZXJhdGVzIG9uIGEgZGVudHJ5LHNlcSBwYWlyIHRoYXQgd2FzIHJldHVybmVkCiAgKiBieSBfX2RfbG9va3VwX3JjdSwgdG8gZ2V0IGEgcmVmZXJlbmNlIG9uIGFuIHJjdS13YWxrIGRlbnRyeS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNvb2tpZXMuaCBiL2luY2x1ZGUvbGludXgvZGNvb2tpZXMuaAppbmRleCAyNGM4MDZmLi41YWMzYmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Rjb29raWVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY29va2llcy5oCkBAIC0xMywxMCArMTMsMTAgQEAKICNpZmRlZiBDT05GSUdfUFJPRklMSU5HCiAgCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGF0aC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAgCiBzdHJ1Y3QgZGNvb2tpZV91c2VyOworc3RydWN0IHBhdGg7CiAgCiAvKioKICAqIGRjb29raWVfcmVnaXN0ZXIgLSByZWdpc3RlciBhIHVzZXIgb2YgZGNvb2tpZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVjb21wcmVzcy9pbmZsYXRlLmggYi9pbmNsdWRlL2xpbnV4L2RlY29tcHJlc3MvaW5mbGF0ZS5oCmluZGV4IGY5YjA2Y2MuLjhjMGFlZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGVjb21wcmVzcy9pbmZsYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWNvbXByZXNzL2luZmxhdGUuaApAQCAtMSw5ICsxLDYgQEAKICNpZm5kZWYgSU5GTEFURV9ICiAjZGVmaW5lIElORkxBVEVfSAogCi0vKiBPdGhlciBob3VzZWtlZXBpbmcgY29uc3RhbnRzICovCi0jZGVmaW5lIElOQlVGU0laIDQwOTYKLQogaW50IGd1bnppcCh1bnNpZ25lZCBjaGFyICppbmJ1ZiwgaW50IGxlbiwKIAkgICBpbnQoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBpbnQpLAogCSAgIGludCgqZmx1c2gpKHZvaWQqLCB1bnNpZ25lZCBpbnQpLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWNvbXByZXNzL21tLmggYi9pbmNsdWRlL2xpbnV4L2RlY29tcHJlc3MvbW0uaAppbmRleCBhZDVlYzFkLi40Y2I3MmI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlY29tcHJlc3MvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2RlY29tcHJlc3MvbW0uaApAQCAtNjEsOCArNjEsNiBAQAogI2RlZmluZSBsYXJnZV9tYWxsb2MoYSkgbWFsbG9jKGEpCiAjZGVmaW5lIGxhcmdlX2ZyZWUoYSkgZnJlZShhKQogCi0jZGVmaW5lIHNldF9lcnJvcl9mbih4KQotCiAjZGVmaW5lIElOSVQKIAogI2Vsc2UgLyogU1RBVElDICovCkBAIC03Miw2ICs3MCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAvKiBVc2UgZGVmaW5lcyByYXRoZXIgdGhhbiBzdGF0aWMgaW5saW5lIGluIG9yZGVyIHRvIGF2b2lkIHNwdXJpb3VzCkBAIC04NCw5ICs4Myw2IEBACiAjZGVmaW5lIGxhcmdlX21hbGxvYyhhKSB2bWFsbG9jKGEpCiAjZGVmaW5lIGxhcmdlX2ZyZWUoYSkgdmZyZWUoYSkKIAotc3RhdGljIHZvaWQoKmVycm9yKShjaGFyICptKTsKLSNkZWZpbmUgc2V0X2Vycm9yX2ZuKHgpIGVycm9yID0geDsKLQogI2RlZmluZSBJTklUIF9faW5pdAogI2RlZmluZSBTVEFUSUMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWNvbXByZXNzL3VueHouaCBiL2luY2x1ZGUvbGludXgvZGVjb21wcmVzcy91bnh6LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3MjhmYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZGVjb21wcmVzcy91bnh6LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIFdyYXBwZXIgZm9yIGRlY29tcHJlc3NpbmcgWFotY29tcHJlc3NlZCBrZXJuZWwsIGluaXRyYW1mcywgYW5kIGluaXRyZAorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIERFQ09NUFJFU1NfVU5YWl9ICisjZGVmaW5lIERFQ09NUFJFU1NfVU5YWl9ICisKK2ludCB1bnh6KHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5fc2l6ZSwKKwkgaW50ICgqZmlsbCkodm9pZCAqZGVzdCwgdW5zaWduZWQgaW50IHNpemUpLAorCSBpbnQgKCpmbHVzaCkodm9pZCAqc3JjLCB1bnNpZ25lZCBpbnQgc2l6ZSksCisJIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICppbl91c2VkLAorCSB2b2lkICgqZXJyb3IpKGNoYXIgKngpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IDI5NzAwMjIuLjI3MjQ5NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0xOTMsNiArMTkzLDEzIEBACiAJY2hhciAqZXJyb3I7CiB9OwogCisvKiBFYWNoIHRhcmdldCBjYW4gbGluayBvbmUgb2YgdGhlc2UgaW50byB0aGUgdGFibGUgKi8KK3N0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50ICgqY29uZ2VzdGVkX2ZuKSAoc3RydWN0IGRtX3RhcmdldF9jYWxsYmFja3MgKiwgaW50KTsKKwl2b2lkICgqdW5wbHVnX2ZuKShzdHJ1Y3QgZG1fdGFyZ2V0X2NhbGxiYWNrcyAqKTsKK307CisKIGludCBkbV9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIHZvaWQgZG1fdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIApAQCAtMjY5LDYgKzI3NiwxMSBAQAogCQkJc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgY2hhciAqcGFyYW1zKTsKIAogLyoKKyAqIFRhcmdldF9jdHIgc2hvdWxkIGNhbGwgdGhpcyBpZiBpdCBuZWVkcyB0byBhZGQgYW55IGNhbGxiYWNrcy4KKyAqLwordm9pZCBkbV90YWJsZV9hZGRfdGFyZ2V0X2NhbGxiYWNrcyhzdHJ1Y3QgZG1fdGFibGUgKnQsIHN0cnVjdCBkbV90YXJnZXRfY2FsbGJhY2tzICpjYik7CisKKy8qCiAgKiBGaW5hbGx5IGNhbGwgdGhpcyB0byBtYWtlIHRoZSB0YWJsZSByZWFkeSBmb3IgdXNlLgogICovCiBpbnQgZG1fdGFibGVfY29tcGxldGUoc3RydWN0IGRtX3RhYmxlICp0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGRkNDg5NTMuLjFiZjVjZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMzAsOSArMzAsOCBAQAogc3RydWN0IGRldmljZV9kcml2ZXI7CiBzdHJ1Y3QgZHJpdmVyX3ByaXZhdGU7CiBzdHJ1Y3QgY2xhc3M7Ci1zdHJ1Y3QgY2xhc3NfcHJpdmF0ZTsKK3N0cnVjdCBzdWJzeXNfcHJpdmF0ZTsKIHN0cnVjdCBidXNfdHlwZTsKLXN0cnVjdCBidXNfdHlwZV9wcml2YXRlOwogc3RydWN0IGRldmljZV9ub2RlOwogCiBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSB7CkBAIC02NSw3ICs2NCw3IEBACiAKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAKLQlzdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZSAqcDsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnA7CiB9OwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBidXNfcmVnaXN0ZXIoc3RydWN0IGJ1c190eXBlICpidXMpOwpAQCAtMTk3LDYgKzE5Niw3IEBACiAKIAlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlCQkqY2xhc3NfYXR0cnM7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUJCSpkZXZfYXR0cnM7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUJCSpkZXZfYmluX2F0dHJzOwogCXN0cnVjdCBrb2JqZWN0CQkJKmRldl9rb2JqOwogCiAJaW50ICgqZGV2X3VldmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAKLQlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqcDsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnA7CiB9OwogCiBzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgewpAQCAtNTA4LDEzICs1MDgsMTMgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+cG93ZXIuc3RhdHVzID09IERQTV9PTikKKwlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKIAkJZGV2LT5wb3dlci5hc3luY19zdXNwZW5kID0gdHJ1ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9kaXNhYmxlX2FzeW5jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pCisJaWYgKCFkZXYtPnBvd2VyLmluX3N1c3BlbmQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKaW5kZXggNDllYWIzNi4uNzhiYmY0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApAQCAtNDQsNyArNDQsNyBAQAogICogUmVtb3ZlIGEgZGV2aWNlLCBkZXN0cm95IGFueSB0YWJsZXMuCiAgKgogICogRE1fREVWX1JFTkFNRToKLSAqIFJlbmFtZSBhIGRldmljZS4KKyAqIFJlbmFtZSBhIGRldmljZSBvciBzZXQgaXRzIHV1aWQgaWYgbm9uZSB3YXMgcHJldmlvdXNseSBzdXBwbGllZC4KICAqCiAgKiBETV9TVVNQRU5EOgogICogVGhpcyBwZXJmb3JtcyBib3RoIHN1c3BlbmQgYW5kIHJlc3VtZSwgZGVwZW5kaW5nIHdoaWNoIGZsYWcgaXMKQEAgLTI2Nyw5ICsyNjcsOSBAQAogI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgc3RydWN0IGRtX2lvY3RsKQogCiAjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAotI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTE4Ci0jZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCi0jZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAxMC0wNi0yOSkiCisjZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMTkKKyNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTEKKyNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTAxLTA3KSIKIAogLyogU3RhdHVzIGJpdHMgKi8KICNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KQEAgLTMyMiw0ICszMjIsMTAgQEAKICAqLwogI2RlZmluZSBETV9VRVZFTlRfR0VORVJBVEVEX0ZMQUcJKDEgPDwgMTMpIC8qIE91dCAqLwogCisvKgorICogSWYgc2V0LCByZW5hbWUgY2hhbmdlcyB0aGUgdXVpZCBub3QgdGhlIG5hbWUuICBPbmx5IHBlcm1pdHRlZAorICogaWYgbm8gdXVpZCB3YXMgcHJldmlvdXNseSBzdXBwbGllZDogYW4gZXhpc3RpbmcgdXVpZCBjYW5ub3QgYmUgY2hhbmdlZC4KKyAqLworI2RlZmluZSBETV9VVUlEX0ZMQUcJCQkoMSA8PCAxNCkgLyogSW4gKi8KKwogI2VuZGlmCQkJCS8qIF9MSU5VWF9ETV9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWxvZy11c2Vyc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCmluZGV4IDBjM2MzYTIuLmVlYWNlN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0tbG9nLXVzZXJzcGFjZS5oCkBAIC0zNzAsNiArMzcwLDE2IEBACiAjZGVmaW5lIERNX1VMT0dfUkVRVUVTVF9UWVBFKHJlcXVlc3RfdHlwZSkgXAogCShETV9VTE9HX1JFUVVFU1RfTUFTSyAmIChyZXF1ZXN0X3R5cGUpKQogCisvKgorICogRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gaXMgaW5jcmVtZW50ZWQgd2hlbiB0aGVyZSBpcyBhCisgKiBjaGFuZ2UgdG8gdGhlIHdheSBpbmZvcm1hdGlvbiBpcyBwYXNzZWQgYmV0d2VlbiBrZXJuZWwKKyAqIGFuZCB1c2Vyc3BhY2UuICBUaGlzIGNvdWxkIGJlIGEgc3RydWN0dXJlIGNoYW5nZSBvZgorICogZG1fdWxvZ19yZXF1ZXN0IG9yIGEgY2hhbmdlIGluIHRoZSB3YXkgcmVxdWVzdHMgYXJlCisgKiBpc3N1ZWQvaGFuZGxlZC4gIENoYW5nZXMgYXJlIG91dGxpbmVkIGhlcmU6CisgKgl2ZXJzaW9uIDE6ICBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKi8KKyNkZWZpbmUgRE1fVUxPR19SRVFVRVNUX1ZFUlNJT04gMQorCiBzdHJ1Y3QgZG1fdWxvZ19yZXF1ZXN0IHsKIAkvKgogCSAqIFRoZSBsb2NhbCB1bmlxdWUgaWRlbnRpZmllciAobHVpZCkgYW5kIHRoZSB1bml2ZXJzYWxseSB1bmlxdWUKQEAgLTM4Myw4ICszOTMsOSBAQAogCSAqLwogCXVpbnQ2NF90IGx1aWQ7CiAJY2hhciB1dWlkW0RNX1VVSURfTEVOXTsKLQljaGFyIHBhZGRpbmdbN107ICAgICAgICAvKiBQYWRkaW5nIGJlY2F1c2UgRE1fVVVJRF9MRU4gPSAxMjkgKi8KKwljaGFyIHBhZGRpbmdbM107ICAgICAgICAvKiBQYWRkaW5nIGJlY2F1c2UgRE1fVVVJRF9MRU4gPSAxMjkgKi8KIAorCXVpbnQzMl90IHZlcnNpb247ICAgICAgIC8qIFNlZSBETV9VTE9HX1JFUVVFU1RfVkVSU0lPTiAqLwogCWludDMyX3QgZXJyb3I7ICAgICAgICAgIC8qIFVzZWQgdG8gcmVwb3J0IGJhY2sgcHJvY2Vzc2luZyBlcnJvcnMgKi8KIAogCXVpbnQzMl90IHNlcTsgICAgICAgICAgIC8qIFNlcXVlbmNlIG51bWJlciBmb3IgcmVxdWVzdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9keW5hbWljX2RlYnVnLmggYi9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaAppbmRleCBhOTBiMzg5Li4xYzcwMDI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaApAQCAtNDQsMzQgKzQ0LDI0IEBACiBleHRlcm4gaW50IGRkZWJ1Z19yZW1vdmVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKIAogI2RlZmluZSBkeW5hbWljX3ByX2RlYnVnKGZtdCwgLi4uKSBkbyB7CQkJCQlcCi0JX19sYWJlbF9fIGRvX3ByaW50azsJCQkJCQlcCi0JX19sYWJlbF9fIG91dDsJCQkJCQkJXAogCXN0YXRpYyBzdHJ1Y3QgX2RkZWJ1ZyBkZXNjcmlwdG9yCQkJCVwKIAlfX3VzZWQJCQkJCQkJCVwKIAlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3ZlcmJvc2UiKSwgYWxpZ25lZCg4KSkpID0JCVwKIAl7IEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXywgX19GSUxFX18sIGZtdCwgX19MSU5FX18sCQlcCiAJCV9EUFJJTlRLX0ZMQUdTX0RFRkFVTFQgfTsJCQkJXAotCUpVTVBfTEFCRUwoJmRlc2NyaXB0b3IuZW5hYmxlZCwgZG9fcHJpbnRrKTsJCQlcCi0JZ290byBvdXQ7CQkJCQkJCVwKLWRvX3ByaW50azoJCQkJCQkJCVwKLQlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwJIyNfX1ZBX0FSR1NfXyk7CQkJXAotb3V0Ogk7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGRlc2NyaXB0b3IuZW5hYmxlZCkpCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksCSMjX19WQV9BUkdTX18pOwkJXAogCX0gd2hpbGUgKDApCiAKIAogI2RlZmluZSBkeW5hbWljX2Rldl9kYmcoZGV2LCBmbXQsIC4uLikgZG8gewkJCQlcCi0JX19sYWJlbF9fIGRvX3ByaW50azsJCQkJCQlcCi0JX19sYWJlbF9fIG91dDsJCQkJCQkJXAogCXN0YXRpYyBzdHJ1Y3QgX2RkZWJ1ZyBkZXNjcmlwdG9yCQkJCVwKIAlfX3VzZWQJCQkJCQkJCVwKIAlfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3ZlcmJvc2UiKSwgYWxpZ25lZCg4KSkpID0JCVwKIAl7IEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXywgX19GSUxFX18sIGZtdCwgX19MSU5FX18sCQlcCiAJCV9EUFJJTlRLX0ZMQUdTX0RFRkFVTFQgfTsJCQkJXAotCUpVTVBfTEFCRUwoJmRlc2NyaXB0b3IuZW5hYmxlZCwgZG9fcHJpbnRrKTsJCQlcCi0JZ290byBvdXQ7CQkJCQkJCVwKLWRvX3ByaW50azoJCQkJCQkJCVwKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgZm10LCAjI19fVkFfQVJHU19fKTsJCVwKLW91dDoJOwkJCQkJCQkJXAorCWlmICh1bmxpa2VseShkZXNjcmlwdG9yLmVuYWJsZWQpKQkJCQlcCisJCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCBmbXQsICMjX19WQV9BUkdTX18pOwlcCiAJfSB3aGlsZSAoMCkKIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggNmNlMWJjYS4uNjU5OTBlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTcyNCwyMSArNzI0LDMwIEBACiAJCQkJCSB+RVhUM19ESVJfUk9VTkQpCiAjZGVmaW5lIEVYVDNfTUFYX1JFQ19MRU4JCSgoMTw8MTYpLTEpCiAKKy8qCisgKiBUZXN0cyBhZ2FpbnN0IE1BWF9SRUNfTEVOIGV0YyB3ZXJlIHB1dCBpbiBwbGFjZSBmb3IgNjRrIGJsb2NrCisgKiBzaXplczsgaWYgdGhhdCBpcyBub3QgcG9zc2libGUgb24gdGhpcyBhcmNoLCB3ZSBjYW4gc2tpcAorICogdGhvc2UgdGVzdHMgYW5kIHNwZWVkIHRoaW5ncyB1cC4KKyAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBleHQzX3JlY19sZW5fZnJvbV9kaXNrKF9fbGUxNiBkbGVuKQogewogCXVuc2lnbmVkIGxlbiA9IGxlMTZfdG9fY3B1KGRsZW4pOwogCisjaWYgKFBBR0VfQ0FDSEVfU0laRSA+PSA2NTUzNikKIAlpZiAobGVuID09IEVYVDNfTUFYX1JFQ19MRU4pCiAJCXJldHVybiAxIDw8IDE2OworI2VuZGlmCiAJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGlubGluZSBfX2xlMTYgZXh0M19yZWNfbGVuX3RvX2Rpc2sodW5zaWduZWQgbGVuKQogeworI2lmIChQQUdFX0NBQ0hFX1NJWkUgPj0gNjU1MzYpCiAJaWYgKGxlbiA9PSAoMSA8PCAxNikpCiAJCXJldHVybiBjcHVfdG9fbGUxNihFWFQzX01BWF9SRUNfTEVOKTsKIAllbHNlIGlmIChsZW4gPiAoMSA8PCAxNikpCiAJCUJVRygpOworI2VuZGlmCiAJcmV0dXJuIGNwdV90b19sZTE2KGxlbik7CiB9CiAKQEAgLTg1Niw2ICs4NjUsNyBAQAogZXh0ZXJuIGludCBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpOwogZXh0ZXJuIHZvaWQgZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZXh0M19yc3Zfd2luZG93X2FkZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpOworZXh0ZXJuIGludCBleHQzX3RyaW1fZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzdHJpbV9yYW5nZSAqcmFuZ2UpOwogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBleHQzX2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvZmFsbG9jLmgKaW5kZXggM2MxNTUxMC4uNzNlMGI2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZhbGxvYy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfRkFMTE9DX0hfCiAKICNkZWZpbmUgRkFMTE9DX0ZMX0tFRVBfU0laRQkweDAxIC8qIGRlZmF1bHQgaXMgZXh0ZW5kIHNpemUgKi8KKyNkZWZpbmUgRkFMTE9DX0ZMX1BVTkNIX0hPTEUJMHgwMiAvKiBkZS1hbGxvY2F0ZXMgcmFuZ2UgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maXJld2lyZS1jZGV2LmggYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaAppbmRleCA2OGM2NDJkLi41OWVhNDA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLWNkZXYuaApAQCAtMjczLDcgKzI3Myw3IEBACiAgKiBAY2xvc3VyZToJU2VlICZmd19jZGV2X2V2ZW50X2NvbW1vbjsKICAqCQlzZXQgYnkgJUZXX0NERVZfQ1JFQVRFX0lTT19DT05URVhUIGlvY3RsCiAgKiBAdHlwZToJJUZXX0NERVZfRVZFTlRfSVNPX0lOVEVSUlVQVF9NVUxUSUNIQU5ORUwKLSAqIEBjb21wbGV0ZWQ6CU9mZnNldCBpbnRvIHRoZSByZWNlaXZlIGJ1ZmZlcjsgZGF0YSBiZWZvcmUgdGhpcyBvZmZlc3QgaXMgdmFsaWQKKyAqIEBjb21wbGV0ZWQ6CU9mZnNldCBpbnRvIHRoZSByZWNlaXZlIGJ1ZmZlcjsgZGF0YSBiZWZvcmUgdGhpcyBvZmZzZXQgaXMgdmFsaWQKICAqCiAgKiBUaGlzIGV2ZW50IGlzIHNlbnQgaW4gbXVsdGljaGFubmVsIGNvbnRleHRzIChjb250ZXh0IHR5cGUKICAqICVGV19DREVWX0lTT19DT05URVhUX1JFQ0VJVkVfTVVMVElDSEFOTkVMKSBmb3IgJmZ3X2NkZXZfaXNvX3BhY2tldCBidWZmZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlyZXdpcmUuaCBiL2luY2x1ZGUvbGludXgvZmlyZXdpcmUuaAppbmRleCAxY2Q2MzdlLi45YTNmNWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJld2lyZS5oCkBAIC0zMDIsOSArMzAyLDkgQEAKIHN0cnVjdCBmd190cmFuc2FjdGlvbiB7CiAJaW50IG5vZGVfaWQ7IC8qIFRoZSBnZW5lcmF0aW9uIGlzIGltcGxpZWQ7IGl0IGlzIGFsd2F5cyB0aGUgY3VycmVudC4gKi8KIAlpbnQgdGxhYmVsOwotCWludCB0aW1lc3RhbXA7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCXN0cnVjdCBmd19jYXJkICpjYXJkOworCWJvb2wgaXNfc3BsaXRfdHJhbnNhY3Rpb247CiAJc3RydWN0IHRpbWVyX2xpc3Qgc3BsaXRfdGltZW91dF90aW1lcjsKIAogCXN0cnVjdCBmd19wYWNrZXQgcGFja2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9maXJtd2FyZS1tYXAuaCBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUtbWFwLmgKaW5kZXggYzZkY2MxZC4uNDNmZTUyZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUtbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9maXJtd2FyZS1tYXAuaApAQCAtMTcsNyArMTcsNiBAQAogI2RlZmluZSBfTElOVVhfRklSTVdBUkVfTUFQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAKIC8qCiAgKiBwcm92aWRlIGEgZHVtbXkgaW50ZXJmYWNlIGlmIENPTkZJR19GSVJNV0FSRV9NRU1NQVAgaXMgZGlzYWJsZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmxleF9hcnJheS5oIGIvaW5jbHVkZS9saW51eC9mbGV4X2FycmF5LmgKaW5kZXggNjMxYjc3Zi4uNzBlNGVmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mbGV4X2FycmF5LmgKKysrIGIvaW5jbHVkZS9saW51eC9mbGV4X2FycmF5LmgKQEAgLTcxLDcgKzcxLDcgQEAKIGludCBmbGV4X2FycmF5X3NocmluayhzdHJ1Y3QgZmxleF9hcnJheSAqZmEpOwogCiAjZGVmaW5lIGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgbnIsIHNyYywgZ2ZwKSBcCi0JZmxleF9hcnJheV9wdXQoZmEsIG5yLCAmKHZvaWQgKikoc3JjKSwgZ2ZwKQorCWZsZXhfYXJyYXlfcHV0KGZhLCBuciwgKHZvaWQgKikmKHNyYyksIGdmcCkKIAogdm9pZCAqZmxleF9hcnJheV9nZXRfcHRyKHN0cnVjdCBmbGV4X2FycmF5ICpmYSwgdW5zaWduZWQgaW50IGVsZW1lbnRfbnIpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggYmFmM2U1NS4uZWQ2ZWU0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMzgyLDcgKzM4Miw2IEBACiAjaW5jbHVkZSA8bGludXgvcGF0aC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgpAQCAtNDAyLDYgKzQwMSw3IEBACiBzdHJ1Y3QgaW92ZWM7CiBzdHJ1Y3QgbmFtZWlkYXRhOwogc3RydWN0IGtpb2NiOworc3RydWN0IGtvYmplY3Q7CiBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvOwogc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Owogc3RydWN0IGtzdGF0ZnM7CkBAIC02NjQsOCArNjY0LDkgQEAKIAl2b2lkICoJCQliZF9jbGFpbWluZzsKIAl2b2lkICoJCQliZF9ob2xkZXI7CiAJaW50CQkJYmRfaG9sZGVyczsKKwlib29sCQkJYmRfd3JpdGVfaG9sZGVyOwogI2lmZGVmIENPTkZJR19TWVNGUwotCXN0cnVjdCBsaXN0X2hlYWQJYmRfaG9sZGVyX2xpc3Q7CisJc3RydWN0IGdlbmRpc2sgKgliZF9ob2xkZXJfZGlzazsJLyogZm9yIHN5c2ZzIHNsYXZlIGxpbmtuZyAqLwogI2VuZGlmCiAJc3RydWN0IGJsb2NrX2RldmljZSAqCWJkX2NvbnRhaW5zOwogCXVuc2lnbmVkCQliZF9ibG9ja19zaXplOwpAQCAtMTA2NSw3ICsxMDY2LDYgQEAKIAlpbnQgKCpmbF9ncmFudCkoc3RydWN0IGZpbGVfbG9jayAqLCBzdHJ1Y3QgZmlsZV9sb2NrICosIGludCk7CiAJdm9pZCAoKmZsX3JlbGVhc2VfcHJpdmF0ZSkoc3RydWN0IGZpbGVfbG9jayAqKTsKIAl2b2lkICgqZmxfYnJlYWspKHN0cnVjdCBmaWxlX2xvY2sgKik7Ci0JaW50ICgqZmxfbXlsZWFzZSkoc3RydWN0IGZpbGVfbG9jayAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwogCWludCAoKmZsX2NoYW5nZSkoc3RydWN0IGZpbGVfbG9jayAqKiwgaW50KTsKIH07CiAKQEAgLTE0MjMsNiArMTQyMyw3IEBACiAJICogZ2VuZXJpY19zaG93X29wdGlvbnMoKQogCSAqLwogCWNoYXIgX19yY3UgKnNfb3B0aW9uczsKKwljb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgKnNfZF9vcDsgLyogZGVmYXVsdCBkX29wIGZvciBkZW50cmllcyAqLwogfTsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X2ZzX3RpbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CkBAIC0xODM0LDcgKzE4MzUsOSBAQAogCQkJaW50ICgqc2V0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAogCQkJdm9pZCAqZGF0YSk7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqbW91bnRfcHNldWRvKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICosIGNoYXIgKiwKLQljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3BzLCB1bnNpZ25lZCBsb25nKTsKKwljb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3BzLAorCWNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyAqZG9wcywKKwl1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB2b2lkIHNpbXBsZV9zZXRfbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNiX21hcmtfZGlydHkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTIwMTYsNyArMjAxOSw2IEBACiBleHRlcm4gdm9pZCBiZF9zZXRfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGxvZmZfdCBzaXplKTsKIGV4dGVybiB2b2lkIGJkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGJkcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKik7Ci1leHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9ieV9kZXZudW0oZGV2X3QsIGZtb2RlX3QpOwogZXh0ZXJuIHZvaWQgaW52YWxpZGF0ZV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKik7CiBleHRlcm4gaW50IHN5bmNfYmxvY2tkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CiBleHRlcm4gc3RydWN0IHN1cGVyX2Jsb2NrICpmcmVlemVfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOwpAQCAtMjA0NywxNiArMjA0OSwyMCBAQAogZXh0ZXJuIGludCBpb2N0bF9ieV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBibGtkZXZfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqLCBmbW9kZV90LCB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gbG9uZyBjb21wYXRfYmxrZGV2X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBpbnQgYmxrZGV2X2dldChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGZtb2RlX3QpOwotZXh0ZXJuIGludCBibGtkZXZfcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKiwgZm1vZGVfdCk7Ci1leHRlcm4gaW50IGJkX2NsYWltKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGJkX3JlbGVhc2Uoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKK2V4dGVybiBpbnQgYmxrZGV2X2dldChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsIHZvaWQgKmhvbGRlcik7CitleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqYmxrZGV2X2dldF9ieV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwKKwkJCQkJICAgICAgIHZvaWQgKmhvbGRlcik7CitleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqYmxrZGV2X2dldF9ieV9kZXYoZGV2X3QgZGV2LCBmbW9kZV90IG1vZGUsCisJCQkJCSAgICAgIHZvaWQgKmhvbGRlcik7CitleHRlcm4gaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKTsKICNpZmRlZiBDT05GSUdfU1lTRlMKLWV4dGVybiBpbnQgYmRfY2xhaW1fYnlfZGlzayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHZvaWQgKiwgc3RydWN0IGdlbmRpc2sgKik7Ci1leHRlcm4gdm9pZCBiZF9yZWxlYXNlX2Zyb21fZGlzayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHN0cnVjdCBnZW5kaXNrICopOworZXh0ZXJuIGludCBiZF9saW5rX2Rpc2tfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKICNlbHNlCi0jZGVmaW5lIGJkX2NsYWltX2J5X2Rpc2soYmRldiwgaG9sZGVyLCBkaXNrKQliZF9jbGFpbShiZGV2LCBob2xkZXIpCi0jZGVmaW5lIGJkX3JlbGVhc2VfZnJvbV9kaXNrKGJkZXYsIGRpc2spCWJkX3JlbGVhc2UoYmRldikKK3N0YXRpYyBpbmxpbmUgaW50IGJkX2xpbmtfZGlza19ob2xkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogI2VuZGlmCiAKQEAgLTIwOTIsOCArMjA5OCw2IEBACiBleHRlcm4gY29uc3QgY2hhciAqX19iZGV2bmFtZShkZXZfdCwgY2hhciAqYnVmZmVyKTsKIGV4dGVybiBjb25zdCBjaGFyICpiZGV2bmFtZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjaGFyICpidWZmZXIpOwogZXh0ZXJuIHN0cnVjdCBibG9ja19kZXZpY2UgKmxvb2t1cF9iZGV2KGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqb3Blbl9iZGV2X2V4Y2x1c2l2ZShjb25zdCBjaGFyICosIGZtb2RlX3QsIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBjbG9zZV9iZGV2X2V4Y2x1c2l2ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGZtb2RlX3QpOwogZXh0ZXJuIHZvaWQgYmxrZGV2X3Nob3coc3RydWN0IHNlcV9maWxlICosb2ZmX3QpOwogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXNlLmggYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaAppbmRleCBjM2M1NzhlLi5kNDY0ZGU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtNDEsNiArNDEsMTIgQEAKICAqIDcuMTUKICAqICAtIGFkZCBzdG9yZSBub3RpZnkKICAqICAtIGFkZCByZXRyaWV2ZSBub3RpZnkKKyAqCisgKiA3LjE2CisgKiAgLSBhZGQgQkFUQ0hfRk9SR0VUIHJlcXVlc3QKKyAqICAtIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEIHNoYWxsIG5vdyByZXR1cm4gd2l0aCBhcnJheSBvZiAnc3RydWN0CisgKiAgICBmdXNlX2lvY3RsX2lvdmVjJyBpbnN0ZWFkIG9mIGFtYmlndW91cyAnc3RydWN0IGlvdmVjJworICogIC0gYWRkIEZVU0VfSU9DVExfMzJCSVQgZmxhZwogICovCiAKICNpZm5kZWYgX0xJTlVYX0ZVU0VfSApAQCAtNzIsNyArNzgsNyBAQAogI2RlZmluZSBGVVNFX0tFUk5FTF9WRVJTSU9OIDcKIAogLyoqIE1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCi0jZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMTUKKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiAxNgogCiAvKiogVGhlIG5vZGUgSUQgb2YgdGhlIHJvb3QgaW5vZGUgKi8KICNkZWZpbmUgRlVTRV9ST09UX0lEIDEKQEAgLTIwMCwxMiArMjA2LDE0IEBACiAgKiBGVVNFX0lPQ1RMX0NPTVBBVDogMzJiaXQgY29tcGF0IGlvY3RsIG9uIDY0Yml0IG1hY2hpbmUKICAqIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEOiBub3QgcmVzdHJpY3RlZCB0byB3ZWxsLWZvcm1lZCBpb2N0bHMsIHJldHJ5IGFsbG93ZWQKICAqIEZVU0VfSU9DVExfUkVUUlk6IHJldHJ5IHdpdGggbmV3IGlvdmVjcworICogRlVTRV9JT0NUTF8zMkJJVDogMzJiaXQgaW9jdGwKICAqCiAgKiBGVVNFX0lPQ1RMX01BWF9JT1Y6IG1heGltdW0gb2YgaW5faW92ZWNzICsgb3V0X2lvdmVjcwogICovCiAjZGVmaW5lIEZVU0VfSU9DVExfQ09NUEFUCSgxIDw8IDApCiAjZGVmaW5lIEZVU0VfSU9DVExfVU5SRVNUUklDVEVECSgxIDw8IDEpCiAjZGVmaW5lIEZVU0VfSU9DVExfUkVUUlkJKDEgPDwgMikKKyNkZWZpbmUgRlVTRV9JT0NUTF8zMkJJVAkoMSA8PCAzKQogCiAjZGVmaW5lIEZVU0VfSU9DVExfTUFYX0lPVgkyNTYKIApAQCAtMjU2LDYgKzI2NCw3IEBACiAJRlVTRV9JT0NUTCAgICAgICAgID0gMzksCiAJRlVTRV9QT0xMICAgICAgICAgID0gNDAsCiAJRlVTRV9OT1RJRllfUkVQTFkgID0gNDEsCisJRlVTRV9CQVRDSF9GT1JHRVQgID0gNDIsCiAKIAkvKiBDVVNFIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIAlDVVNFX0lOSVQgICAgICAgICAgPSA0MDk2LApAQCAtMjkwLDYgKzI5OSwxNiBAQAogCV9fdTY0CW5sb29rdXA7CiB9OwogCitzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lIHsKKwlfX3U2NAlub2RlaWQ7CisJX191NjQJbmxvb2t1cDsKK307CisKK3N0cnVjdCBmdXNlX2JhdGNoX2ZvcmdldF9pbiB7CisJX191MzIJY291bnQ7CisJX191MzIJZHVtbXk7Cit9OworCiBzdHJ1Y3QgZnVzZV9nZXRhdHRyX2luIHsKIAlfX3UzMglnZXRhdHRyX2ZsYWdzOwogCV9fdTMyCWR1bW15OwpAQCAtNTEwLDYgKzUyOSwxMSBAQAogCV9fdTMyCW91dF9zaXplOwogfTsKIAorc3RydWN0IGZ1c2VfaW9jdGxfaW92ZWMgeworCV9fdTY0CWJhc2U7CisJX191NjQJbGVuOworfTsKKwogc3RydWN0IGZ1c2VfaW9jdGxfb3V0IHsKIAlfX3MzMglyZXN1bHQ7CiAJX191MzIJZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggN2E3YjljMS4uYzBkNWY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtMTE1LDYgKzExNSw3IEBACiAjZWxzZQogCXN0cnVjdCBkaXNrX3N0YXRzIGRrc3RhdHM7CiAjZW5kaWYKKwlhdG9taWNfdCByZWY7CiAJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOwogfTsKIApAQCAtMTI3LDYgKzEyOCwxMSBAQAogI2RlZmluZSBHRU5IRF9GTF9FWFRfREVWVAkJCTY0IC8qIGFsbG93IGV4dGVuZGVkIGRldnQgKi8KICNkZWZpbmUgR0VOSERfRkxfTkFUSVZFX0NBUEFDSVRZCQkxMjgKIAorZW51bSB7CisJRElTS19FVkVOVF9NRURJQV9DSEFOR0UJCQk9IDEgPDwgMCwgLyogbWVkaWEgY2hhbmdlZCAqLworCURJU0tfRVZFTlRfRUpFQ1RfUkVRVUVTVAkJPSAxIDw8IDEsIC8qIGVqZWN0IHJlcXVlc3RlZCAqLworfTsKKwogI2RlZmluZSBCTEtfU0NTSV9NQVhfQ01EUwkoMjU2KQogI2RlZmluZSBCTEtfU0NTSV9DTURfUEVSX0xPTkcJKEJMS19TQ1NJX01BWF9DTURTIC8gKHNpemVvZihsb25nKSAqIDgpKQogCkBAIC0xNDMsNiArMTQ5LDggQEAKIAlzdHJ1Y3QgaGRfc3RydWN0IF9fcmN1ICpwYXJ0W107CiB9OwogCitzdHJ1Y3QgZGlza19ldmVudHM7CisKIHN0cnVjdCBnZW5kaXNrIHsKIAkvKiBtYWpvciwgZmlyc3RfbWlub3IgYW5kIG1pbm9ycyBhcmUgaW5wdXQgcGFyYW1ldGVycyBvbmx5LAogCSAqIGRvbid0IHVzZSBkaXJlY3RseS4gIFVzZSBkaXNrX2RldnQoKSBhbmQgZGlza19tYXhfcGFydHMoKS4KQEAgLTE1NCw2ICsxNjIsMTAgQEAKIAogCWNoYXIgZGlza19uYW1lW0RJU0tfTkFNRV9MRU5dOwkvKiBuYW1lIG9mIG1ham9yIGRyaXZlciAqLwogCWNoYXIgKigqZGV2bm9kZSkoc3RydWN0IGdlbmRpc2sgKmdkLCBtb2RlX3QgKm1vZGUpOworCisJdW5zaWduZWQgaW50IGV2ZW50czsJCS8qIHN1cHBvcnRlZCBldmVudHMgKi8KKwl1bnNpZ25lZCBpbnQgYXN5bmNfZXZlbnRzOwkvKiBhc3luYyBldmVudHMsIHN1YnNldCBvZiBhbGwgKi8KKwogCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHBhcnRpdGlvbnMgaW5kZXhlZCBieSBwYXJ0bm8uCiAJICogUHJvdGVjdGVkIHdpdGggbWF0Y2hpbmcgYmRldiBsb2NrIGJ1dCBzdGF0IGFuZCBvdGhlcgogCSAqIG5vbi1jcml0aWNhbCBhY2Nlc3NlcyB1c2UgUkNVLiAgQWx3YXlzIGFjY2VzcyB0aHJvdWdoCkBAIC0xNzEsOSArMTgzLDggQEAKIAlzdHJ1Y3Qga29iamVjdCAqc2xhdmVfZGlyOwogCiAJc3RydWN0IHRpbWVyX3JhbmRfc3RhdGUgKnJhbmRvbTsKLQogCWF0b21pY190IHN5bmNfaW87CQkvKiBSQUlEICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGFzeW5jX25vdGlmeTsKKwlzdHJ1Y3QgZGlza19ldmVudHMgKmV2OwogI2lmZGVmICBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkKIAlzdHJ1Y3QgYmxrX2ludGVncml0eSAqaW50ZWdyaXR5OwogI2VuZGlmCkBAIC0zOTUsNyArNDA2LDYgQEAKIC8qIGJsb2NrL2dlbmhkLmMgKi8KIGV4dGVybiB2b2lkIGFkZF9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIGV4dGVybiB2b2lkIGRlbF9nZW5kaXNrKHN0cnVjdCBnZW5kaXNrICpncCk7Ci1leHRlcm4gdm9pZCB1bmxpbmtfZ2VuZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZ3ApOwogZXh0ZXJuIHN0cnVjdCBnZW5kaXNrICpnZXRfZ2VuZGlzayhkZXZfdCBkZXYsIGludCAqcGFydG5vKTsKIGV4dGVybiBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGdldF9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgcGFydG5vKTsKIApAQCAtNDA3LDYgKzQxNywxMSBAQAogCXJldHVybiBkaXNrLT5wYXJ0MC5wb2xpY3k7CiB9CiAKK2V4dGVybiB2b2lkIGRpc2tfYmxvY2tfZXZlbnRzKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKK2V4dGVybiB2b2lkIGRpc2tfdW5ibG9ja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOworZXh0ZXJuIHZvaWQgZGlza19jaGVja19ldmVudHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOworZXh0ZXJuIHVuc2lnbmVkIGludCBkaXNrX2NsZWFyX2V2ZW50cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgdW5zaWduZWQgaW50IG1hc2spOworCiAvKiBkcml2ZXJzL2NoYXIvcmFuZG9tLmMgKi8KIGV4dGVybiB2b2lkIGFkZF9kaXNrX3JhbmRvbW5lc3Moc3RydWN0IGdlbmRpc2sgKmRpc2spOwogZXh0ZXJuIHZvaWQgcmFuZF9pbml0aWFsaXplX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spOwpAQCAtNTgzLDYgKzU5OCw3IEBACiAJCQkJCQkgICAgIHNlY3Rvcl90IGxlbiwgaW50IGZsYWdzLAogCQkJCQkJICAgICBzdHJ1Y3QgcGFydGl0aW9uX21ldGFfaW5mbwogCQkJCQkJICAgICAgICppbmZvKTsKK2V4dGVybiB2b2lkIF9fZGVsZXRlX3BhcnRpdGlvbihzdHJ1Y3QgaGRfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgZGVsZXRlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgcHJpbnRrX2FsbF9wYXJ0aXRpb25zKHZvaWQpOwogCkBAIC02MTEsNiArNjI3LDI5IEBACiAJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogI2VuZGlmIC8qIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVCAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgaGRfcmVmX2luaXQoc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKK3sKKwlhdG9taWNfc2V0KCZwYXJ0LT5yZWYsIDEpOworCXNtcF9tYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRfc3RydWN0X2dldChzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCWF0b21pY19pbmMoJnBhcnQtPnJlZik7CisJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhkX3N0cnVjdF90cnlfZ2V0KHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCit7CisJcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJnBhcnQtPnJlZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZF9zdHJ1Y3RfcHV0KHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBhcnQtPnJlZikpCisJCV9fZGVsZXRlX3BhcnRpdGlvbihwYXJ0KTsKK30KKwogI2Vsc2UgLyogQ09ORklHX0JMT0NLICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmludGtfYWxsX3BhcnRpdGlvbnModm9pZCkgeyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCBmNTRhZGZjLi5hM2IxNDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNlbHNlCiAjZGVmaW5lIF9fX0dGUF9OT1RSQUNLCQkwCiAjZW5kaWYKKyNkZWZpbmUgX19fR0ZQX05PX0tTV0FQRAkweDQwMDAwMHUKIAogLyoKICAqIEdGUCBiaXRtYXNrcy4uCkBAIC04MSwxMyArODIsMTUgQEAKICNkZWZpbmUgX19HRlBfUkVDTEFJTUFCTEUgKChfX2ZvcmNlIGdmcF90KV9fX0dGUF9SRUNMQUlNQUJMRSkgLyogUGFnZSBpcyByZWNsYWltYWJsZSAqLwogI2RlZmluZSBfX0dGUF9OT1RSQUNLCSgoX19mb3JjZSBnZnBfdClfX19HRlBfTk9UUkFDSykgIC8qIERvbid0IHRyYWNrIHdpdGgga21lbWNoZWNrICovCiAKKyNkZWZpbmUgX19HRlBfTk9fS1NXQVBECSgoX19mb3JjZSBnZnBfdClfX19HRlBfTk9fS1NXQVBEKQorCiAvKgogICogVGhpcyBtYXkgc2VlbSByZWR1bmRhbnQsIGJ1dCBpdCdzIGEgd2F5IG9mIGFubm90YXRpbmcgZmFsc2UgcG9zaXRpdmVzIHZzLgogICogYWxsb2NhdGlvbnMgdGhhdCBzaW1wbHkgY2Fubm90IGJlIHN1cHBvcnRlZCAoZS5nLiBwYWdlIHRhYmxlcykuCiAgKi8KICNkZWZpbmUgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRSAoX19HRlBfTk9UUkFDSykKIAotI2RlZmluZSBfX0dGUF9CSVRTX1NISUZUIDIyCS8qIFJvb20gZm9yIDIyIF9fR0ZQX0ZPTyBiaXRzICovCisjZGVmaW5lIF9fR0ZQX0JJVFNfU0hJRlQgMjMJLyogUm9vbSBmb3IgMjMgX19HRlBfRk9PIGJpdHMgKi8KICNkZWZpbmUgX19HRlBfQklUU19NQVNLICgoX19mb3JjZSBnZnBfdCkoKDEgPDwgX19HRlBfQklUU19TSElGVCkgLSAxKSkKIAogLyogVGhpcyBlcXVhbHMgMCwgYnV0IHVzZSBjb25zdGFudHMgaW4gY2FzZSB0aGV5IGV2ZXIgY2hhbmdlICovCkBAIC0xMDYsNiArMTA5LDkgQEAKIAkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAogCQkJCSBfX0dGUF9NT1ZBQkxFKQogI2RlZmluZSBHRlBfSU9GUwkoX19HRlBfSU8gfCBfX0dGUF9GUykKKyNkZWZpbmUgR0ZQX1RSQU5TSFVHRQkoR0ZQX0hJR0hVU0VSX01PVkFCTEUgfCBfX0dGUF9DT01QIHwgXAorCQkJIF9fR0ZQX05PTUVNQUxMT0MgfCBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOIHwgXAorCQkJIF9fR0ZQX05PX0tTV0FQRCkKIAogI2lmZGVmIENPTkZJR19OVU1BCiAjZGVmaW5lIEdGUF9USElTTk9ERQkoX19HRlBfVEhJU05PREUgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZKQpAQCAtMzI1LDE0ICszMzEsMTcgQEAKIHsKIAlyZXR1cm4gYWxsb2NfcGFnZXNfY3VycmVudChnZnBfbWFzaywgb3JkZXIpOwogfQotZXh0ZXJuIHN0cnVjdCBwYWdlICphbGxvY19wYWdlX3ZtYShnZnBfdCBnZnBfbWFzaywKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqYWxsb2NfcGFnZXNfdm1hKGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIsCiAJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKICNlbHNlCiAjZGVmaW5lIGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBvcmRlcikgXAogCQlhbGxvY19wYWdlc19ub2RlKG51bWFfbm9kZV9pZCgpLCBnZnBfbWFzaywgb3JkZXIpCi0jZGVmaW5lIGFsbG9jX3BhZ2Vfdm1hKGdmcF9tYXNrLCB2bWEsIGFkZHIpIGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCAwKQorI2RlZmluZSBhbGxvY19wYWdlc192bWEoZ2ZwX21hc2ssIG9yZGVyLCB2bWEsIGFkZHIpCVwKKwlhbGxvY19wYWdlcyhnZnBfbWFzaywgb3JkZXIpCiAjZW5kaWYKICNkZWZpbmUgYWxsb2NfcGFnZShnZnBfbWFzaykgYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIDApCisjZGVmaW5lIGFsbG9jX3BhZ2Vfdm1hKGdmcF9tYXNrLCB2bWEsIGFkZHIpCVwKKwlhbGxvY19wYWdlc192bWEoZ2ZwX21hc2ssIDAsIHZtYSwgYWRkcikKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19nZXRfZnJlZV9wYWdlcyhnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF96ZXJvZWRfcGFnZShnZnBfdCBnZnBfbWFzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW8taTJjbXV4LmggYi9pbmNsdWRlL2xpbnV4L2dwaW8taTJjbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMzNiYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpby1pMmNtdXguaApAQCAtMCwwICsxLDM4IEBACisvKgorICogZ3Bpby1pMmNtdXggaW50ZXJmYWNlIHRvIHBsYXRmb3JtIGNvZGUKKyAqCisgKiBQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9HUElPX0kyQ01VWF9ICisjZGVmaW5lIF9MSU5VWF9HUElPX0kyQ01VWF9ICisKKy8qIE1VWCBoYXMgbm8gc3BlY2lmaWMgaWRsZSBtb2RlICovCisjZGVmaW5lIEdQSU9fSTJDTVVYX05PX0lETEUJKCh1bnNpZ25lZCktMSkKKworLyoqCisgKiBzdHJ1Y3QgZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSAtIFBsYXRmb3JtLWRlcGVuZGVudCBkYXRhIGZvciBncGlvLWkyY211eAorICogQHBhcmVudDogUGFyZW50IEkyQyBidXMgYWRhcHRlciBudW1iZXIKKyAqIEBiYXNlX25yOiBCYXNlIEkyQyBidXMgbnVtYmVyIHRvIG51bWJlciBhZGFwdGVycyBmcm9tIG9yIHplcm8gZm9yIGR5bmFtaWMKKyAqIEB2YWx1ZXM6IEFycmF5IG9mIGJpdG1hc2tzIG9mIEdQSU8gc2V0dGluZ3MgKGxvdy9oaWdoKSBmb3IgZWFjaAorICoJcG9zaXRpb24KKyAqIEBuX3ZhbHVlczogTnVtYmVyIG9mIG11bHRpcGxleGVyIHBvc2l0aW9ucyAoYnVzc2VzIHRvIGluc3RhbnRpYXRlKQorICogQGdwaW9zOiBBcnJheSBvZiBHUElPIG51bWJlcnMgdXNlZCB0byBjb250cm9sIE1VWAorICogQG5fZ3Bpb3M6IE51bWJlciBvZiBHUElPcyB1c2VkIHRvIGNvbnRyb2wgTVVYCisgKiBAaWRsZTogQml0bWFzayB0byB3cml0ZSB0byBNVVggd2hlbiBpZGxlIG9yIEdQSU9fSTJDTVVYX05PX0lETEUgaWYgbm90IHVzZWQKKyAqLworc3RydWN0IGdwaW9faTJjbXV4X3BsYXRmb3JtX2RhdGEgeworCWludCBwYXJlbnQ7CisJaW50IGJhc2VfbnI7CisJY29uc3QgdW5zaWduZWQgKnZhbHVlczsKKwlpbnQgbl92YWx1ZXM7CisJY29uc3QgdW5zaWduZWQgKmdwaW9zOworCWludCBuX2dwaW9zOworCXVuc2lnbmVkIGlkbGU7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0dQSU9fSTJDTVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKaW5kZXggZTQxZjdkZC4uMzI3MjBiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiBzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGdwaW87CiBzdHJ1Y3QgZ3Bpb19jaGlwOwogCiAvKgpAQCAtMzQsNiArMzUsMTcgQEAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZ3Bpb19yZXF1ZXN0X29uZSh1bnNpZ25lZCBncGlvLAorCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19yZXF1ZXN0X2FycmF5KHN0cnVjdCBncGlvICphcnJheSwgc2l6ZV90IG51bSkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQogewogCW1pZ2h0X3NsZWVwKCk7CkBAIC00Miw2ICs1NCwxNCBAQAogCVdBUk5fT04oMSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2ZyZWVfYXJyYXkoc3RydWN0IGdwaW8gKmFycmF5LCBzaXplX3QgbnVtKQoreworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBHUElPIGNhbiBuZXZlciBoYXZlIGJlZW4gcmVxdWVzdGVkICovCisJV0FSTl9PTigxKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IGJiMGY1NmYuLmQ5MWMyNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtNDAyLDcgKzQwMiw3IEBACiAJX191MTYgZHBhZDsJCQkvKiBkcGFkIGlucHV0IGNvZGUgKi8KIH07CiAKLSNkZWZpbmUgSElEX01BWF9GSUVMRFMgNjQKKyNkZWZpbmUgSElEX01BWF9GSUVMRFMgMTI4CiAKIHN0cnVjdCBoaWRfcmVwb3J0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC01OTMsNiArNTkzLDcgQEAKICAqIEByZXBvcnRfZml4dXA6IGNhbGxlZCBiZWZvcmUgcmVwb3J0IGRlc2NyaXB0b3IgcGFyc2luZyAoTlVMTCBtZWFucyBub3ApCiAgKiBAaW5wdXRfbWFwcGluZzogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBiZWZvcmUgbWFwcGluZyBhbiB1c2FnZQogICogQGlucHV0X21hcHBlZDogaW52b2tlZCBvbiBpbnB1dCByZWdpc3RlcmluZyBhZnRlciBtYXBwaW5nIGFuIHVzYWdlCisgKiBAZmVhdHVyZV9tYXBwaW5nOiBpbnZva2VkIG9uIGZlYXR1cmUgcmVnaXN0ZXJpbmcKICAqIEBzdXNwZW5kOiBpbnZva2VkIG9uIHN1c3BlbmQgKE5VTEwgbWVhbnMgbm9wKQogICogQHJlc3VtZTogaW52b2tlZCBvbiByZXN1bWUgaWYgZGV2aWNlIHdhcyBub3QgcmVzZXQgKE5VTEwgbWVhbnMgbm9wKQogICogQHJlc2V0X3Jlc3VtZTogaW52b2tlZCBvbiByZXN1bWUgaWYgZGV2aWNlIHdhcyByZXNldCAoTlVMTCBtZWFucyBub3ApCkBAIC02MzYsNiArNjM3LDkgQEAKIAlpbnQgKCppbnB1dF9tYXBwZWQpKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAogCQkJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIHVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KTsKKwl2b2lkICgqZmVhdHVyZV9tYXBwaW5nKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJCXN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKKwkJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKTsKICNpZmRlZiBDT05GSUdfUE0KIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpOwpAQCAtODIwLDYgKzgyNCw0OSBAQAogCWhkZXYtPmxsX2RyaXZlci0+c3RvcChoZGV2KTsKIH0KIAorLyoqCisgKiBoaWRfaHdfb3BlbiAtIHNpZ25hbCB1bmRlcmxheWluZyBIVyB0byBzdGFydCBkZWxpdmVyaW5nIGV2ZW50cworICoKKyAqIEBoZGV2OiBoaWQgZGV2aWNlCisgKgorICogVGVsbCB1bmRlcmx5aW5nIEhXIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgZXZlbnRzIGZyb20gdGhlIGRldmljZS4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBzb21ldGltZSBhZnRlciBzdWNjZXNzZnVsIGNhbGwKKyAqIHRvIGhpZF9oaXdfc3RhcnQoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGhpZF9od19vcGVuKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXJldHVybiBoZGV2LT5sbF9kcml2ZXItPm9wZW4oaGRldik7Cit9CisKKy8qKgorICogaGlkX2h3X2Nsb3NlIC0gc2lnbmFsIHVuZGVybGF5aW5nIEhXIHRvIHN0b3AgZGVsaXZlcmluZyBldmVudHMKKyAqCisgKiBAaGRldjogaGlkIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoYXQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBldmVudHMKKyAqIGZyb20gdGhpcyBkZXZpY2UgYW55bW9yZS4gRGVsaXZlcnkgb2YgZXZlbnRzIG1heSBvciBtYXkgbm90IHN0b3AsCisgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB1c2VycyBzdGlsbCBvdXRzdGFuZGluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZF9od19jbG9zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwloZGV2LT5sbF9kcml2ZXItPmNsb3NlKGhkZXYpOworfQorCisvKioKKyAqIGhpZF9od19wb3dlciAtIHJlcXVlc3RzIHVuZGVybHlpbmcgSFcgdG8gZ28gaW50byBnaXZlbiBwb3dlciBtb2RlCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqIEBsZXZlbDogcmVxdWVzdGVkIHBvd2VyIGxldmVsIChvbmUgb2YgJVBNX0hJTlRfKiBkZWZpbmVzKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgdW5kZXJseWluZyBoYXJkd2FyZSB0byBlbnRlciByZXF1ZXN0ZWQgcG93ZXIKKyAqIG1vZGUuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaGlkX2h3X3Bvd2VyKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIGhkZXYtPmxsX2RyaXZlci0+cG93ZXIgPyBoZGV2LT5sbF9kcml2ZXItPnBvd2VyKGhkZXYsIGxldmVsKSA6IDA7Cit9CisKIHZvaWQgaGlkX3JlcG9ydF9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgaW50IHR5cGUsIHU4ICpkYXRhLCBpbnQgc2l6ZSwKIAkJaW50IGludGVycnVwdCk7CiAKQEAgLTgzOCwxMiArODg1LDMyIEBACiAjZGVmaW5lIGhpZF9waWRmZl9pbml0IE5VTEwKICNlbmRpZgogCi0jZGVmaW5lIGRiZ19oaWQoZm9ybWF0LCBhcmcuLi4pIGlmIChoaWRfZGVidWcpIFwKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICxcCi0JCQkJX19GSUxFX18gLCAjIyBhcmcpCi0jZGVmaW5lIGVycl9oaWQoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCi0JCV9fRklMRV9fICwgIyMgYXJnKQotI2VuZGlmIC8qIEhJRF9GRiAqLworI2RlZmluZSBkYmdfaGlkKGZvcm1hdCwgYXJnLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGhpZF9kZWJ1ZykJCQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgIyNhcmcpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGhpZF9wcmludGsobGV2ZWwsIGhpZCwgZm10LCBhcmcuLi4pCQlcCisJZGV2X3ByaW50ayhsZXZlbCwgJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9lbWVyZyhoaWQsIGZtdCwgYXJnLi4uKQkJCVwKKwlkZXZfZW1lcmcoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9jcml0KGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9jcml0KCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfYWxlcnQoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2FsZXJ0KCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfZXJyKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9lcnIoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9ub3RpY2UoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X25vdGljZSgmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX3dhcm4oaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X3dhcm4oJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9pbmZvKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9pbmZvKCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfZGJnKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9kYmcoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDMzMDU4NmYuLmYzNzZkZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhCiAgKgkJCXRpbWVyIHRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KICAqIEBhY3RpdmU6CQlyZWQgYmxhY2sgdHJlZSByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgdGltZXJzCi0gKiBAZmlyc3Q6CQlwb2ludGVyIHRvIHRoZSB0aW1lciBub2RlIHdoaWNoIGV4cGlyZXMgZmlyc3QKICAqIEByZXNvbHV0aW9uOgkJdGhlIHJlc29sdXRpb24gb2YgdGhlIGNsb2NrLCBpbiBuYW5vc2Vjb25kcwogICogQGdldF90aW1lOgkJZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgY2xvY2sKICAqIEBzb2Z0aXJxX3RpbWU6CXRoZSB0aW1lIHdoZW4gcnVubmluZyB0aGUgaHJ0aW1lciBxdWV1ZSBpbiB0aGUgc29mdGlycQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdlX21tLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTZjOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9odWdlX21tLmgKQEAgLTAsMCArMSwxNzkgQEAKKyNpZm5kZWYgX0xJTlVYX0hVR0VfTU1fSAorI2RlZmluZSBfTElOVVhfSFVHRV9NTV9ICisKK2V4dGVybiBpbnQgZG9faHVnZV9wbWRfYW5vbnltb3VzX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGNvcHlfaHVnZV9wbWQoc3RydWN0IG1tX3N0cnVjdCAqZHN0X21tLCBzdHJ1Y3QgbW1fc3RydWN0ICpzcmNfbW0sCisJCQkgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworZXh0ZXJuIGludCBkb19odWdlX3BtZF93cF9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWQsCisJCQkgICAgICAgcG1kX3Qgb3JpZ19wbWQpOworZXh0ZXJuIHBndGFibGVfdCBnZXRfcG1kX2h1Z2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqZm9sbG93X3RyYW5zX2h1Z2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJICBwbWRfdCAqcG1kLAorCQkJCQkgIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IHphcF9odWdlX3BtZChzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLAorCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQlwbWRfdCAqcG1kKTsKK2V4dGVybiBpbnQgbWluY29yZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCisJCQl1bnNpZ25lZCBjaGFyICp2ZWMpOworZXh0ZXJuIGludCBjaGFuZ2VfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCisJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHBncHJvdF90IG5ld3Byb3QpOworCitlbnVtIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWcgeworCVRSQU5TUEFSRU5UX0hVR0VQQUdFX0ZMQUcsCisJVFJBTlNQQVJFTlRfSFVHRVBBR0VfUkVRX01BRFZfRkxBRywKKwlUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfRkxBRywKKwlUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfUkVRX01BRFZfRkxBRywKKwlUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfS0hVR0VQQUdFRF9GTEFHLAorI2lmZGVmIENPTkZJR19ERUJVR19WTQorCVRSQU5TUEFSRU5UX0hVR0VQQUdFX0RFQlVHX0NPV19GTEFHLAorI2VuZGlmCit9OworCitlbnVtIHBhZ2VfY2hlY2tfYWRkcmVzc19wbWRfZmxhZyB7CisJUEFHRV9DSEVDS19BRERSRVNTX1BNRF9GTEFHLAorCVBBR0VfQ0hFQ0tfQUREUkVTU19QTURfTk9UU1BMSVRUSU5HX0ZMQUcsCisJUEFHRV9DSEVDS19BRERSRVNTX1BNRF9TUExJVFRJTkdfRkxBRywKK307CitleHRlcm4gcG1kX3QgKnBhZ2VfY2hlY2tfYWRkcmVzc19wbWQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgIGVudW0gcGFnZV9jaGVja19hZGRyZXNzX3BtZF9mbGFnIGZsYWcpOworCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisjZGVmaW5lIEhQQUdFX1BNRF9TSElGVCBIUEFHRV9TSElGVAorI2RlZmluZSBIUEFHRV9QTURfTUFTSyBIUEFHRV9NQVNLCisjZGVmaW5lIEhQQUdFX1BNRF9TSVpFIEhQQUdFX1NJWkUKKworI2RlZmluZSB0cmFuc3BhcmVudF9odWdlcGFnZV9lbmFibGVkKF9fdm1hKQkJCQlcCisJKCh0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyAmCQkJCQlcCisJICAoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRykgfHwJCQkJXAorCSAgKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzICYJCQkJCVwKKwkgICAoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfUkVRX01BRFZfRkxBRykgJiYJCQlcCisJICAgKChfX3ZtYSktPnZtX2ZsYWdzICYgVk1fSFVHRVBBR0UpKSkgJiYJCQlcCisJICEoKF9fdm1hKS0+dm1fZmxhZ3MgJiBWTV9OT0hVR0VQQUdFKSkKKyNkZWZpbmUgdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZGVmcmFnKF9fdm1hKQkJCQlcCisJKCh0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyAmCQkJCQlcCisJICAoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX0ZMQUcpKSB8fAkJCVwKKwkgKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzICYJCQkJCVwKKwkgICgxPDxUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfUkVRX01BRFZfRkxBRykgJiYJCVwKKwkgIChfX3ZtYSktPnZtX2ZsYWdzICYgVk1fSFVHRVBBR0UpKQorI2lmZGVmIENPTkZJR19ERUJVR19WTQorI2RlZmluZSB0cmFuc3BhcmVudF9odWdlcGFnZV9kZWJ1Z19jb3coKQkJCQlcCisJKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzICYJCQkJCVwKKwkgKDE8PFRSQU5TUEFSRU5UX0hVR0VQQUdFX0RFQlVHX0NPV19GTEFHKSkKKyNlbHNlIC8qIENPTkZJR19ERUJVR19WTSAqLworI2RlZmluZSB0cmFuc3BhcmVudF9odWdlcGFnZV9kZWJ1Z19jb3coKSAwCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX1ZNICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzOworZXh0ZXJuIGludCBjb3B5X3B0ZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSwKKwkJCSAgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLAorCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gaW50IGhhbmRsZV9wdGVfZmF1bHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgICBwdGVfdCAqcHRlLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBzcGxpdF9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgX19zcGxpdF9odWdlX3BhZ2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKTsKKyNkZWZpbmUgc3BsaXRfaHVnZV9wYWdlX3BtZChfX21tLCBfX3BtZCkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJcG1kX3QgKl9fX19wbWQgPSAoX19wbWQpOwkJCQlcCisJCWlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZSgqX19fX3BtZCkpKQkJCVwKKwkJCV9fc3BsaXRfaHVnZV9wYWdlX3BtZChfX21tLCBfX19fcG1kKTsJCVwKKwl9ICB3aGlsZSAoMCkKKyNkZWZpbmUgd2FpdF9zcGxpdF9odWdlX3BhZ2UoX19hbm9uX3ZtYSwgX19wbWQpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXBtZF90ICpfX19fcG1kID0gKF9fcG1kKTsJCQkJXAorCQlzcGluX3VubG9ja193YWl0KCYoX19hbm9uX3ZtYSktPnJvb3QtPmxvY2spOwkJXAorCQkvKgkJCQkJCQlcCisJCSAqIHNwaW5fdW5sb2NrX3dhaXQoKSBpcyBqdXN0IGEgbG9vcCBpbiBDIGFuZCBzbyB0aGUJXAorCQkgKiBDUFUgY2FuIHJlb3JkZXIgYW55dGhpbmcgYXJvdW5kIGl0LgkJCVwKKwkJICovCQkJCQkJCVwKKwkJc21wX21iKCk7CQkJCQkJXAorCQlCVUdfT04ocG1kX3RyYW5zX3NwbGl0dGluZygqX19fX3BtZCkgfHwJCQlcCisJCSAgICAgICBwbWRfdHJhbnNfaHVnZSgqX19fX3BtZCkpOwkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIUEFHRV9QTURfT1JERVIgKEhQQUdFX1BNRF9TSElGVC1QQUdFX1NISUZUKQorI2RlZmluZSBIUEFHRV9QTURfTlIgKDE8PEhQQUdFX1BNRF9PUkRFUikKKyNpZiBIUEFHRV9QTURfT1JERVIgPiBNQVhfT1JERVIKKyNlcnJvciAiaHVnZXBhZ2VzIGNhbid0IGJlIGFsbG9jYXRlZCBieSB0aGUgYnVkZHkgYWxsb2NhdG9yIgorI2VuZGlmCitleHRlcm4gaW50IGh1Z2VwYWdlX21hZHZpc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqdm1fZmxhZ3MsIGludCBhZHZpY2UpOworZXh0ZXJuIHZvaWQgX192bWFfYWRqdXN0X3RyYW5zX2h1Z2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJCSAgICBsb25nIGFkanVzdF9uZXh0KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bWFfYWRqdXN0X3RyYW5zX2h1Z2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgdW5zaWduZWQgbG9uZyBlbmQsCisJCQkJCSBsb25nIGFkanVzdF9uZXh0KQoreworCWlmICghdm1hLT5hbm9uX3ZtYSB8fCB2bWEtPnZtX29wcyB8fCB2bWEtPnZtX2ZpbGUpCisJCXJldHVybjsKKwlfX3ZtYV9hZGp1c3RfdHJhbnNfaHVnZSh2bWEsIHN0YXJ0LCBlbmQsIGFkanVzdF9uZXh0KTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGhwYWdlX25yX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmICh1bmxpa2VseShQYWdlVHJhbnNIdWdlKHBhZ2UpKSkKKwkJcmV0dXJuIEhQQUdFX1BNRF9OUjsKKwlyZXR1cm4gMTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmNvbXBvdW5kX3RyYW5zX2hlYWQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKFBhZ2VUYWlsKHBhZ2UpKSB7CisJCXN0cnVjdCBwYWdlICpoZWFkOworCQloZWFkID0gcGFnZS0+Zmlyc3RfcGFnZTsKKwkJc21wX3JtYigpOworCQkvKgorCQkgKiBoZWFkIG1heSBiZSBhIGRhbmdsaW5nIHBvaW50ZXIuCisJCSAqIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IGNsZWFycyBQYWdlVGFpbCBiZWZvcmUKKwkJICogb3ZlcndyaXRpbmcgZmlyc3RfcGFnZSwgc28gaWYgUGFnZVRhaWwgaXMgc3RpbGwKKwkJICogdGhlcmUgaXQgbWVhbnMgdGhlIGhlYWQgcG9pbnRlciBpc24ndCBkYW5nbGluZy4KKwkJICovCisJCWlmIChQYWdlVGFpbChwYWdlKSkKKwkJCXJldHVybiBoZWFkOworCX0KKwlyZXR1cm4gcGFnZTsKK30KKyNlbHNlIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworI2RlZmluZSBIUEFHRV9QTURfU0hJRlQgKHsgQlVHKCk7IDA7IH0pCisjZGVmaW5lIEhQQUdFX1BNRF9NQVNLICh7IEJVRygpOyAwOyB9KQorI2RlZmluZSBIUEFHRV9QTURfU0laRSAoeyBCVUcoKTsgMDsgfSkKKworI2RlZmluZSBocGFnZV9ucl9wYWdlcyh4KSAxCisKKyNkZWZpbmUgdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZW5hYmxlZChfX3ZtYSkgMAorCisjZGVmaW5lIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzIDBVTAorc3RhdGljIGlubGluZSBpbnQgc3BsaXRfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorI2RlZmluZSBzcGxpdF9odWdlX3BhZ2VfcG1kKF9fbW0sIF9fcG1kKQlcCisJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB3YWl0X3NwbGl0X2h1Z2VfcGFnZShfX2Fub25fdm1hLCBfX3BtZCkJXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgY29tcG91bmRfdHJhbnNfaGVhZChwYWdlKSBjb21wb3VuZF9oZWFkKHBhZ2UpCitzdGF0aWMgaW5saW5lIGludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnZtX2ZsYWdzLCBpbnQgYWR2aWNlKQoreworCUJVRygpOworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHZtYV9hZGp1c3RfdHJhbnNfaHVnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCSB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQkJIGxvbmcgYWRqdXN0X25leHQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCisKKyNlbmRpZiAvKiBfTElOVVhfSFVHRV9NTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvaW5jbHVkZS9saW51eC9pMmMuaAppbmRleCA1NmNmZTIzLi45MDM1NzZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTU3LDkgKzU3LDEwIEBACiAgKiB0cmFuc21pdCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGhvdXQgaW50ZXJydXB0aW9uLgogICogQGNvdW50IG11c3QgYmUgYmUgbGVzcyB0aGFuIDY0ayBzaW5jZSBtc2cubGVuIGlzIHUxNi4KICAqLwotZXh0ZXJuIGludCBpMmNfbWFzdGVyX3NlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqYnVmLAorZXh0ZXJuIGludCBpMmNfbWFzdGVyX3NlbmQoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqYnVmLAogCQkJICAgaW50IGNvdW50KTsKLWV4dGVybiBpbnQgaTJjX21hc3Rlcl9yZWN2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgaTJjX21hc3Rlcl9yZWN2KGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNoYXIgKmJ1ZiwKKwkJCSAgIGludCBjb3VudCk7CiAKIC8qIFRyYW5zZmVyIG51bSBtZXNzYWdlcy4KICAqLwpAQCAtNzgsMjMgKzc5LDI1IEBACiAvKiBOb3cgZm9sbG93IHRoZSAnbmljZScgYWNjZXNzIHJvdXRpbmVzLiBUaGVzZSBhbHNvIGRvY3VtZW50IHRoZSBjYWxsaW5nCiAgICBjb252ZW50aW9ucyBvZiBpMmNfc21idXNfeGZlci4gKi8KIAotZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCB2YWx1ZSk7Ci1leHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKTsKLWV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ieXRlKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfYnl0ZShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCB2YWx1ZSk7CitleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICB1OCBjb21tYW5kKTsKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgICAgdTggY29tbWFuZCwgdTggdmFsdWUpOwotZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCk7Ci1leHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgIHU4IGNvbW1hbmQpOworZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1MTYgdmFsdWUpOwogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgKi8KLWV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICB1OCBjb21tYW5kLCB1OCAqdmFsdWVzKTsKLWV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkgICAgICB1OCBjb21tYW5kLCB1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpOwogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMgKi8KLWV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkJIHU4IGNvbW1hbmQsIHU4IGxlbmd0aCwgdTggKnZhbHVlcyk7Ci1leHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkJICB1OCBjb21tYW5kLCB1OCBsZW5ndGgsCiAJCQkJCSAgY29uc3QgdTggKnZhbHVlcyk7CiAjZW5kaWYgLyogSTJDICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9kczYyMC5oIGIvaW5jbHVkZS9saW51eC9pMmMvZHM2MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZiYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pMmMvZHM2MjAuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9MSU5VWF9EUzYyMF9ICisjZGVmaW5lIF9MSU5VWF9EUzYyMF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisvKiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgRFM2MjAgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGVybW9zdGF0ICovCisKK3N0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhIHsKKwkvKgorCSAqICBUaGVybW9zdGF0IG91dHB1dCBwaW4gUE8gbW9kZToKKwkgKiAgMCA9IGFsd2F5cyBsb3cgKGRlZmF1bHQpCisJICogIDEgPSBQT19MT1cKKwkgKiAgMiA9IFBPX0hJR0gKKwkgKgorCSAqIChzZWUgRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMCkKKwkgKi8KKwlpbnQgcG9tb2RlOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9EUzYyMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2FsZy5oIGIvaW5jbHVkZS9saW51eC9pZl9hbGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlhY2NlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pZl9hbGcuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogaWZfYWxnOiBVc2VyLXNwYWNlIGFsZ29yaXRobSBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX0FMR19ICisjZGVmaW5lIF9MSU5VWF9JRl9BTEdfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNvY2thZGRyX2FsZyB7CisJX191MTYJc2FsZ19mYW1pbHk7CisJX191OAlzYWxnX3R5cGVbMTRdOworCV9fdTMyCXNhbGdfZmVhdDsKKwlfX3UzMglzYWxnX21hc2s7CisJX191OAlzYWxnX25hbWVbNjRdOworfTsKKworc3RydWN0IGFmX2FsZ19pdiB7CisJX191MzIJaXZsZW47CisJX191OAlpdlswXTsKK307CisKKy8qIFNvY2tldCBvcHRpb25zICovCisjZGVmaW5lIEFMR19TRVRfS0VZCQkJMQorI2RlZmluZSBBTEdfU0VUX0lWCQkJMgorI2RlZmluZSBBTEdfU0VUX09QCQkJMworCisvKiBPcGVyYXRpb25zICovCisjZGVmaW5lIEFMR19PUF9ERUNSWVBUCQkJMAorI2RlZmluZSBBTEdfT1BfRU5DUllQVAkJCTEKKworI2VuZGlmCS8qIF9MSU5VWF9JRl9BTEdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4IGM0ZTlkOTEuLmU0MjgzODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTgwMiw2ICs4MDIsNyBAQAogI2RlZmluZSBTV19DQU1FUkFfTEVOU19DT1ZFUgkweDA5ICAvKiBzZXQgPSBsZW5zIGNvdmVyZWQgKi8KICNkZWZpbmUgU1dfS0VZUEFEX1NMSURFCQkweDBhICAvKiBzZXQgPSBrZXlwYWQgc2xpZGUgb3V0ICovCiAjZGVmaW5lIFNXX0ZST05UX1BST1hJTUlUWQkweDBiICAvKiBzZXQgPSBmcm9udCBwcm94aW1pdHkgc2Vuc29yIGFjdGl2ZSAqLworI2RlZmluZSBTV19ST1RBVEVfTE9DSwkJMHgwYyAgLyogc2V0ID0gcm90YXRlIGxvY2tlZC9kaXNhYmxlZCAqLwogI2RlZmluZSBTV19NQVgJCQkweDBmCiAjZGVmaW5lIFNXX0NOVAkJCShTV19NQVgrMSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC9hczUwMTEuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQvYXM1MDExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmZmQwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5wdXQvYXM1MDExLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBfQVM1MDExX0gKKyNkZWZpbmUgX0FTNTAxMV9ICisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgRmFiaWVuIE1hcnRlYXUgPGZhYmllbi5tYXJ0ZWF1QGFybWFkZXVzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKK3N0cnVjdCBhczUwMTFfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50IGJ1dHRvbl9ncGlvOworCXVuc2lnbmVkIGludCBheGlzX2lycTsgLyogaXJxIG51bWJlciAqLworCXVuc2lnbmVkIGxvbmcgYXhpc19pcnFmbGFnczsKKwljaGFyIHhwLCB4bjsgLyogdGhyZXNob2xkIGZvciB4IGF4aXMgKi8KKwljaGFyIHlwLCB5bjsgLyogdGhyZXNob2xkIGZvciB5IGF4aXMgKi8KK307CisKKyNlbmRpZiAvKiBfQVM1MDExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZWwtZ3R0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVsLWd0dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDE5YWIyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvaW50ZWwtZ3R0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29tbW9uIEludGVsIEFHUEdBUlQgYW5kIEdUVCBkZWZpbml0aW9ucy4KLSAqLwotI2lmbmRlZiBfSU5URUxfR1RUX0gKLSNkZWZpbmUgX0lOVEVMX0dUVF9ICi0KLSNpbmNsdWRlIDxsaW51eC9hZ3BfYmFja2VuZC5oPgotCi0vKiBUaGlzIGlzIGZvciBJbnRlbCBvbmx5IEdUVCBjb250cm9scy4KLSAqCi0gKiBTYW5keWJyaWRnZTogQUdQX1VTRVJfQ0FDSEVEX01FTU9SWSBkZWZhdWx0IHRvIExMQyBvbmx5Ci0gKi8KLQotI2RlZmluZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZX0xMQ19NTEMgKEFHUF9VU0VSX1RZUEVTICsgMikKLSNkZWZpbmUgQUdQX1VTRVJfVU5DQUNIRURfTUVNT1JZIChBR1BfVVNFUl9UWVBFUyArIDQpCi0KLS8qIGZsYWcgZm9yIEdGRFQgdHlwZSAqLwotI2RlZmluZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZX0dGRFQgKDEgPDwgMykKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWkuaCBiL2luY2x1ZGUvbGludXgvaXBtaS5oCmluZGV4IDY1YWFlMzQuLjA0NWYyZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBtaS5oCkBAIC00NTQsNiArNDU0LDQ0IEBACiAvKiBWYWxpZGF0ZSB0aGF0IHRoZSBnaXZlbiBJUE1JIGFkZHJlc3MgaXMgdmFsaWQuICovCiBpbnQgaXBtaV92YWxpZGF0ZV9hZGRyKHN0cnVjdCBpcG1pX2FkZHIgKmFkZHIsIGludCBsZW4pOwogCisvKgorICogSG93IGRpZCB0aGUgSVBNSSBkcml2ZXIgZmluZCBvdXQgYWJvdXQgdGhlIGRldmljZT8KKyAqLworZW51bSBpcG1pX2FkZHJfc3JjIHsKKwlTSV9JTlZBTElEID0gMCwgU0lfSE9UTU9ELCBTSV9IQVJEQ09ERUQsIFNJX1NQTUksIFNJX0FDUEksIFNJX1NNQklPUywKKwlTSV9QQ0ksCVNJX0RFVklDRVRSRUUsIFNJX0RFRkFVTFQKK307CisKK3VuaW9uIGlwbWlfc21pX2luZm9fdW5pb24geworCS8qCisJICogdGhlIGFjcGlfaW5mbyBlbGVtZW50IGlzIGRlZmluZWQgZm9yIHRoZSBTSV9BQ1BJCisJICogYWRkcmVzcyB0eXBlCisJICovCisJc3RydWN0IHsKKwkJdm9pZCAqYWNwaV9oYW5kbGU7CisJfSBhY3BpX2luZm87Cit9OworCitzdHJ1Y3QgaXBtaV9zbWlfaW5mbyB7CisJZW51bSBpcG1pX2FkZHJfc3JjIGFkZHJfc3JjOworCisJLyoKKwkgKiBCYXNlIGRldmljZSBmb3IgdGhlIGludGVyZmFjZS4gIERvbid0IGZvcmdldCB0byBwdXQgdGhpcyB3aGVuCisJICogeW91IGFyZSBkb25lLgorCSAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qCisJICogVGhlIGFkZHJfaW5mbyBwcm92aWRlcyBtb3JlIGRldGFpbGVkIGluZm8gZm9yIHNvbWUgSVBNSQorCSAqIGRldmljZXMsIGRlcGVuZGluZyBvbiB0aGUgYWRkcl9zcmMuICBDdXJyZW50bHkgb25seSBTSV9BQ1BJCisJICogaW5mbyBpcyBwcm92aWRlZC4KKwkgKi8KKwl1bmlvbiBpcG1pX3NtaV9pbmZvX3VuaW9uIGFkZHJfaW5mbzsKK307CisKKy8qIFRoaXMgaXMgdG8gZ2V0IHRoZSBwcml2YXRlIGluZm8gb2YgaXBtaV9zbWlfdCAqLworZXh0ZXJuIGludCBpcG1pX2dldF9zbWlfaW5mbyhpbnQgaWZfbnVtLCBzdHJ1Y3QgaXBtaV9zbWlfaW5mbyAqZGF0YSk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oIGIvaW5jbHVkZS9saW51eC9pcG1pX3NtaS5oCmluZGV4IDRiNDgzMTguLjkwNjU5MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaV9zbWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwbWlfc21pLmgKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CiAKIC8qIFRoaXMgZmlsZXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgZm9yIElQTUkgc3lzdGVtIG1hbmFnZW1lbnQgaW50ZXJmYWNlCiAgICBkcml2ZXJzIHRvIGJpbmQgaW50byB0aGUgSVBNSSBtZXNzYWdlIGhhbmRsZXIuICovCkBAIC04Niw2ICs4NywxMyBAQAogCWludCAoKnN0YXJ0X3Byb2Nlc3NpbmcpKHZvaWQgICAgICAgKnNlbmRfaW5mbywKIAkJCQlpcG1pX3NtaV90IG5ld19pbnRmKTsKIAorCS8qCisJICogR2V0IHRoZSBkZXRhaWxlZCBwcml2YXRlIGluZm8gb2YgdGhlIGxvdyBsZXZlbCBpbnRlcmZhY2UgYW5kIHN0b3JlCisJICogaXQgaW50byB0aGUgc3RydWN0dXJlIG9mIGlwbWlfc21pX2RhdGEuIEZvciBleGFtcGxlOiB0aGUKKwkgKiBBQ1BJIGRldmljZSBoYW5kbGUgd2lsbCBiZSByZXR1cm5lZCBmb3IgdGhlIHBucF9hY3BpIElQTUkgZGV2aWNlLgorCSAqLworCWludCAoKmdldF9zbWlfaW5mbykodm9pZCAqc2VuZF9pbmZvLCBzdHJ1Y3QgaXBtaV9zbWlfaW5mbyAqZGF0YSk7CisKIAkvKiBDYWxsZWQgdG8gZW5xdWV1ZSBhbiBTTUkgbWVzc2FnZSB0byBiZSBzZW50LiAgVGhpcwogCSAgIG9wZXJhdGlvbiBpcyBub3QgYWxsb3dlZCB0byBmYWlsLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCBpdAogCSAgIHNob3VsZCByZXBvcnQgYmFjayB0aGUgZXJyb3IgaW4gYSByZWNlaXZlZCBtZXNzYWdlLiAgSXQgbWF5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWRlc2MuaCBiL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCmluZGV4IDk3OWM2OGMuLjZhNjRjNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oCkBAIC01Nyw3ICs1Nyw3IEBACiAjZW5kaWYKIAogCXN0cnVjdCB0aW1lcl9yYW5kX3N0YXRlICp0aW1lcl9yYW5kX3N0YXRlOwotCXVuc2lnbmVkIGludAkJKmtzdGF0X2lycXM7CisJdW5zaWduZWQgaW50IF9fcGVyY3B1CSprc3RhdF9pcnFzOwogCWlycV9mbG93X2hhbmRsZXJfdAloYW5kbGVfaXJxOwogCXN0cnVjdCBpcnFhY3Rpb24JKmFjdGlvbjsJLyogSVJRIGFjdGlvbiBsaXN0ICovCiAJdW5zaWduZWQgaW50CQlzdGF0dXM7CQkvKiBJUlEgc3RhdHVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IDJhZTg2YWEuLjI3ZTc5YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC05NCw3ICs5NCw3IEBACiAgKgogICogVGhpcyBpcyBhbiBvcGFxdWUgZGF0YXR5cGUuCiAgKiovCi10eXBlZGVmIHN0cnVjdCBoYW5kbGVfcwkJaGFuZGxlX3Q7CS8qIEF0b21pYyBvcGVyYXRpb24gdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgamJkMl9qb3VybmFsX2hhbmRsZSBoYW5kbGVfdDsJLyogQXRvbWljIG9wZXJhdGlvbiB0eXBlICovCiAKIAogLyoqCkBAIC00MTYsNyArNDE2LDcgQEAKICAqIGluIHNvIGl0IGNhbiBiZSBmaXhlZCBsYXRlci4KICAqLwogCi1zdHJ1Y3QgaGFuZGxlX3MKK3N0cnVjdCBqYmQyX2pvdXJuYWxfaGFuZGxlCiB7CiAJLyogV2hpY2ggY29tcG91bmQgdHJhbnNhY3Rpb24gaXMgdGhpcyB1cGRhdGUgYSBwYXJ0IG9mPyAqLwogCXRyYW5zYWN0aW9uX3QJCSpoX3RyYW5zYWN0aW9uOwpAQCAtMTE1OCw2ICsxMTU4LDIyIEBACiAJa21lbV9jYWNoZV9mcmVlKGpiZDJfaGFuZGxlX2NhY2hlLCBoYW5kbGUpOwogfQogCisvKgorICogamJkMl9pbm9kZSBtYW5hZ2VtZW50IChvcHRpb25hbCwgZm9yIHRob3NlIGZpbGUgc3lzdGVtcyB0aGF0IHdhbnQgdG8gdXNlCisgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgamJkMl9pbm9kZSBzdHJ1Y3R1cmVzKQorICovCitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfaW5vZGVfY2FjaGU7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpiZDJfaW5vZGUgKmpiZDJfYWxsb2NfaW5vZGUoZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGpiZDJfaW5vZGVfY2FjaGUsIGdmcF9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqYmQyX2ZyZWVfaW5vZGUoc3RydWN0IGpiZDJfaW5vZGUgKmppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoamJkMl9pbm9kZV9jYWNoZSwgamlub2RlKTsKK30KKwogLyogUHJpbWFyeSByZXZva2Ugc3VwcG9ydCAqLwogI2RlZmluZSBKT1VSTkFMX1JFVk9LRV9ERUZBVUxUX0hBU0ggMjU2CiBleHRlcm4gaW50CSAgIGpiZDJfam91cm5hbF9pbml0X3Jldm9rZShqb3VybmFsX3QgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGI2ZGU5YTYuLjVhOWQ5MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNTYsNiArNTYsOCBAQAogCiAjZGVmaW5lIEZJRUxEX1NJWkVPRih0LCBmKSAoc2l6ZW9mKCgodCopMCktPmYpKQogI2RlZmluZSBESVZfUk9VTkRfVVAobixkKSAoKChuKSArIChkKSAtIDEpIC8gKGQpKQorCisvKiBUaGUgYGNvbnN0JyBpbiByb3VuZHVwKCkgcHJldmVudHMgZ2NjLTMuMyBmcm9tIGNhbGxpbmcgX19kaXZkaTMgKi8KICNkZWZpbmUgcm91bmR1cCh4LCB5KSAoCQkJCQlcCiB7CQkJCQkJCVwKIAljb25zdCB0eXBlb2YoeSkgX195ID0geTsJCQlcCkBAIC0xNDEsOSArMTQzLDIyIEBACiAKICNkZWZpbmUgbWlnaHRfc2xlZXBfaWYoY29uZCkgZG8geyBpZiAoY29uZCkgbWlnaHRfc2xlZXAoKTsgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBhYnMoeCkgKHsJCQkJXAotCQlsb25nIF9feCA9ICh4KTsJCQlcCi0JCShfX3ggPCAwKSA/IC1fX3ggOiBfX3g7CQlcCisvKgorICogYWJzKCkgaGFuZGxlcyB1bnNpZ25lZCBhbmQgc2lnbmVkIGxvbmdzLCBpbnRzLCBzaG9ydHMgYW5kIGNoYXJzLiAgRm9yIGFsbAorICogaW5wdXQgdHlwZXMgYWJzKCkgcmV0dXJucyBhIHNpZ25lZCBsb25nLgorICogYWJzKCkgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciA2NC1iaXQgdHlwZXMgKHM2NCwgdTY0LCBsb25nIGxvbmcpIC0gdXNlIGFiczY0KCkKKyAqIGZvciB0aG9zZS4KKyAqLworI2RlZmluZSBhYnMoeCkgKHsJCQkJCQlcCisJCWxvbmcgcmV0OwkJCQkJXAorCQlpZiAoc2l6ZW9mKHgpID09IHNpemVvZihsb25nKSkgewkJXAorCQkJbG9uZyBfX3ggPSAoeCk7CQkJCVwKKwkJCXJldCA9IChfX3ggPCAwKSA/IC1fX3ggOiBfX3g7CQlcCisJCX0gZWxzZSB7CQkJCQlcCisJCQlpbnQgX194ID0gKHgpOwkJCQlcCisJCQlyZXQgPSAoX194IDwgMCkgPyAtX194IDogX194OwkJXAorCQl9CQkJCQkJXAorCQlyZXQ7CQkJCQkJXAogCX0pCiAKICNkZWZpbmUgYWJzNjQoeCkgKHsJCQkJXApAQCAtMjYzLDYgKzI3OCw3IEBACiB9CiAKIGV4dGVybiBpbnQgaGV4X3RvX2JpbihjaGFyIGNoKTsKK2V4dGVybiB2b2lkIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpOwogCiAvKgogICogR2VuZXJhbCB0cmFjaW5nIHJlbGF0ZWQgdXRpbGl0eSBmdW5jdGlvbnMgLSB0cmFjZV9wcmludGsoKSwKQEAgLTU4NCw2ICs2MDAsMTMgQEAKICNkZWZpbmUgTlVNQV9CVUlMRCAwCiAjZW5kaWYKIAorLyogVGhpcyBoZWxwcyB1cyBhdm9pZCAjaWZkZWYgQ09ORklHX0NPTVBBQ1RJT04gKi8KKyNpZmRlZiBDT05GSUdfQ09NUEFDVElPTgorI2RlZmluZSBDT01QQUNUSU9OX0JVSUxEIDEKKyNlbHNlCisjZGVmaW5lIENPTVBBQ1RJT05fQlVJTEQgMAorI2VuZGlmCisKIC8qIFJlYnVpbGQgZXZlcnl0aGluZyBvbiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQgKi8KICNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKICMgZGVmaW5lIFJFQlVJTERfRFVFX1RPX0ZUUkFDRV9NQ09VTlRfUkVDT1JECmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKaW5kZXggNDRlODNiYS4uMGNjZTJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaApAQCAtNDYsMTYgKzQ2LDE0IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG5yX2NvbnRleHRfc3dpdGNoZXModm9pZCk7CiAKICNpZm5kZWYgQ09ORklHX0dFTkVSSUNfSEFSRElSUVMKLSNkZWZpbmUga3N0YXRfaXJxc190aGlzX2NwdShpcnEpIFwKLQkodGhpc19jcHVfcmVhZChrc3RhdC5pcnFzW2lycV0pCiAKIHN0cnVjdCBpcnFfZGVzYzsKIAogc3RhdGljIGlubGluZSB2b2lkIGtzdGF0X2luY3JfaXJxc190aGlzX2NwdSh1bnNpZ25lZCBpbnQgaXJxLAogCQkJCQkgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCWtzdGF0X3RoaXNfY3B1LmlycXNbaXJxXSsrOwotCWtzdGF0X3RoaXNfY3B1LmlycXNfc3VtKys7CisJX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc1tpcnFdKTsKKwlfX3RoaXNfY3B1X2luYyhrc3RhdC5pcnFzX3N1bSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpCkBAIC02NSwxNyArNjMsMTggQEAKICNlbHNlCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiBleHRlcm4gdW5zaWduZWQgaW50IGtzdGF0X2lycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpOwotI2RlZmluZSBrc3RhdF9pcnFzX3RoaXNfY3B1KERFU0MpIFwKLQkoKERFU0MpLT5rc3RhdF9pcnFzW3NtcF9wcm9jZXNzb3JfaWQoKV0pCi0jZGVmaW5lIGtzdGF0X2luY3JfaXJxc190aGlzX2NwdShpcnFubywgREVTQykgZG8ge1wKLQkoKERFU0MpLT5rc3RhdF9pcnFzW3NtcF9wcm9jZXNzb3JfaWQoKV0rKyk7XAotCWtzdGF0X3RoaXNfY3B1LmlycXNfc3VtKys7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycW5vLCBERVNDKQkJXAorZG8gewkJCQkJCQlcCisJX190aGlzX2NwdV9pbmMoKihERVNDKS0+a3N0YXRfaXJxcyk7CQlcCisJX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc19zdW0pOwkJCVwKK30gd2hpbGUgKDApCiAKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHZvaWQga3N0YXRfaW5jcl9zb2Z0aXJxc190aGlzX2NwdSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWtzdGF0X3RoaXNfY3B1LnNvZnRpcnFzW2lycV0rKzsKKwlfX3RoaXNfY3B1X2luYyhrc3RhdC5zb2Z0aXJxc1tpcnFdKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQga3N0YXRfc29mdGlycXNfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2todWdlcGFnZWQuaCBiL2luY2x1ZGUvbGludXgva2h1Z2VwYWdlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzk0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2todWdlcGFnZWQuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9MSU5VWF9LSFVHRVBBR0VEX0gKKyNkZWZpbmUgX0xJTlVYX0tIVUdFUEFHRURfSAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4gLyogTU1GX1ZNX0hVR0VQQUdFICovCisKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKK2V4dGVybiBpbnQgX19raHVnZXBhZ2VkX2VudGVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiBpbnQga2h1Z2VwYWdlZF9lbnRlcl92bWFfbWVyZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisjZGVmaW5lIGtodWdlcGFnZWRfZW5hYmxlZCgpCQkJCQkgICAgICAgXAorCSh0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyAmCQkJCSAgICAgICBcCisJICgoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRykgfAkJICAgICAgIFwKKwkgICgxPDxUUkFOU1BBUkVOVF9IVUdFUEFHRV9SRVFfTUFEVl9GTEFHKSkpCisjZGVmaW5lIGtodWdlcGFnZWRfYWx3YXlzKCkJCQkJXAorCSh0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyAmCQkJXAorCSAoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRykpCisjZGVmaW5lIGtodWdlcGFnZWRfcmVxX21hZHYoKQkJCQkJXAorCSh0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyAmCQkJCVwKKwkgKDE8PFRSQU5TUEFSRU5UX0hVR0VQQUdFX1JFUV9NQURWX0ZMQUcpKQorI2RlZmluZSBraHVnZXBhZ2VkX2RlZnJhZygpCQkJCQlcCisJKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzICYJCQkJXAorCSAoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX0tIVUdFUEFHRURfRkxBRykpCisKK3N0YXRpYyBpbmxpbmUgaW50IGtodWdlcGFnZWRfZm9yayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0pCit7CisJaWYgKHRlc3RfYml0KE1NRl9WTV9IVUdFUEFHRSwgJm9sZG1tLT5mbGFncykpCisJCXJldHVybiBfX2todWdlcGFnZWRfZW50ZXIobW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmICh0ZXN0X2JpdChNTUZfVk1fSFVHRVBBR0UsICZtbS0+ZmxhZ3MpKQorCQlfX2todWdlcGFnZWRfZXhpdChtbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGtodWdlcGFnZWRfZW50ZXIoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaWYgKCF0ZXN0X2JpdChNTUZfVk1fSFVHRVBBR0UsICZ2bWEtPnZtX21tLT5mbGFncykpCisJCWlmICgoa2h1Z2VwYWdlZF9hbHdheXMoKSB8fAorCQkgICAgIChraHVnZXBhZ2VkX3JlcV9tYWR2KCkgJiYKKwkJICAgICAgdm1hLT52bV9mbGFncyAmIFZNX0hVR0VQQUdFKSkgJiYKKwkJICAgICEodm1hLT52bV9mbGFncyAmIFZNX05PSFVHRVBBR0UpKQorCQkJaWYgKF9fa2h1Z2VwYWdlZF9lbnRlcih2bWEtPnZtX21tKSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworc3RhdGljIGlubGluZSBpbnQga2h1Z2VwYWdlZF9mb3JrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBraHVnZXBhZ2VkX2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBraHVnZXBhZ2VkX2VudGVyKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQga2h1Z2VwYWdlZF9lbnRlcl92bWFfbWVyZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCisKKyNlbmRpZiAvKiBfTElOVVhfS0hVR0VQQUdFRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ttc2dfZHVtcC5oIGIvaW5jbHVkZS9saW51eC9rbXNnX2R1bXAuaAppbmRleCAyNGI0NDE0Li4yYTBkN2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ttc2dfZHVtcC5oCisrKyBiL2luY2x1ZGUvbGludXgva21zZ19kdW1wLmgKQEAgLTE4LDYgKzE4LDEwIEBACiAJS01TR19EVU1QX09PUFMsCiAJS01TR19EVU1QX1BBTklDLAogCUtNU0dfRFVNUF9LRVhFQywKKwlLTVNHX0RVTVBfUkVTVEFSVCwKKwlLTVNHX0RVTVBfSEFMVCwKKwlLTVNHX0RVTVBfUE9XRVJPRkYsCisJS01TR19EVU1QX0VNRVJHLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tyZWYuaCBiL2luY2x1ZGUvbGludXgva3JlZi5oCmluZGV4IDZjYzM4ZmMuLmQ0YTYyYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3JlZi5oCisrKyBiL2luY2x1ZGUvbGludXgva3JlZi5oCkBAIC0yNCw1ICsyNCw3IEBACiB2b2lkIGtyZWZfaW5pdChzdHJ1Y3Qga3JlZiAqa3JlZik7CiB2b2lkIGtyZWZfZ2V0KHN0cnVjdCBrcmVmICprcmVmKTsKIGludCBrcmVmX3B1dChzdHJ1Y3Qga3JlZiAqa3JlZiwgdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3Qga3JlZiAqa3JlZikpOworaW50IGtyZWZfc3ViKHN0cnVjdCBrcmVmICprcmVmLCB1bnNpZ25lZCBpbnQgY291bnQsCisJICAgICB2b2lkICgqcmVsZWFzZSkgKHN0cnVjdCBrcmVmICprcmVmKSk7CiAKICNlbmRpZiAvKiBfS1JFRl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggOTE5YWU1My4uZWEyZGMxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC01NDAsNiArNTQwLDcgQEAKICNlbmRpZgogI2RlZmluZSBLVk1fQ0FQX1BQQ19HRVRfUFZJTkZPIDU3CiAjZGVmaW5lIEtWTV9DQVBfUFBDX0lSUV9MRVZFTCA1OAorI2RlZmluZSBLVk1fQ0FQX0FTWU5DX1BGIDU5CiAKICNpZmRlZiBLVk1fQ0FQX0lSUV9ST1VUSU5HCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCBhMDU1NzQyLi5iNTAyMWRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogCiAjaW5jbHVkZSA8bGludXgva3ZtLmg+CkBAIC00MCw2ICs0Miw3IEBACiAjZGVmaW5lIEtWTV9SRVFfS0lDSyAgICAgICAgICAgICAgIDkKICNkZWZpbmUgS1ZNX1JFUV9ERUFDVElWQVRFX0ZQVSAgICAxMAogI2RlZmluZSBLVk1fUkVRX0VWRU5UICAgICAgICAgICAgIDExCisjZGVmaW5lIEtWTV9SRVFfQVBGX0hBTFQgICAgICAgICAgMTIKIAogI2RlZmluZSBLVk1fVVNFUlNQQUNFX0lSUV9TT1VSQ0VfSUQJMAogCkBAIC03NCw2ICs3NywyNyBAQAogaW50IGt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKIAkJCSAgICAgIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogCisjaWZkZWYgQ09ORklHX0tWTV9BU1lOQ19QRgorc3RydWN0IGt2bV9hc3luY19wZiB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCWd2YV90IGd2YTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJc3RydWN0IGt2bV9hcmNoX2FzeW5jX3BmIGFyY2g7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJYm9vbCBkb25lOworfTsKKwordm9pZCBrdm1fY2xlYXJfYXN5bmNfcGZfY29tcGxldGlvbl9xdWV1ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fY2hlY2tfYXN5bmNfcGZfY29tcGxldGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworaW50IGt2bV9zZXR1cF9hc3luY19wZihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGd2YV90IGd2YSwgZ2ZuX3QgZ2ZuLAorCQkgICAgICAgc3RydWN0IGt2bV9hcmNoX2FzeW5jX3BmICphcmNoKTsKK2ludCBrdm1fYXN5bmNfcGZfd2FrZXVwX2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworI2VuZGlmCisKIHN0cnVjdCBrdm1fdmNwdSB7CiAJc3RydWN0IGt2bSAqa3ZtOwogI2lmZGVmIENPTkZJR19QUkVFTVBUX05PVElGSUVSUwpAQCAtMTA0LDYgKzEyOCwxNSBAQAogCWdwYV90IG1taW9fcGh5c19hZGRyOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfS1ZNX0FTWU5DX1BGCisJc3RydWN0IHsKKwkJdTMyIHF1ZXVlZDsKKwkJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwkJc3RydWN0IGxpc3RfaGVhZCBkb25lOworCQlzcGlubG9ja190IGxvY2s7CisJfSBhc3luY19wZjsKKyNlbmRpZgorCiAJc3RydWN0IGt2bV92Y3B1X2FyY2ggYXJjaDsKIH07CiAKQEAgLTExMywxNiArMTQ2LDE5IEBACiAgKi8KICNkZWZpbmUgS1ZNX01FTV9NQVhfTlJfUEFHRVMgKCgxVUwgPDwgMzEpIC0gMSkKIAorc3RydWN0IGt2bV9scGFnZV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIHJtYXBfcGRlOworCWludCB3cml0ZV9jb3VudDsKK307CisKIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgewogCWdmbl90IGJhc2VfZ2ZuOwogCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyAqcm1hcDsKIAl1bnNpZ25lZCBsb25nICpkaXJ0eV9iaXRtYXA7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBybWFwX3BkZTsKLQkJaW50IHdyaXRlX2NvdW50OwotCX0gKmxwYWdlX2luZm9bS1ZNX05SX1BBR0VfU0laRVMgLSAxXTsKKwl1bnNpZ25lZCBsb25nICpkaXJ0eV9iaXRtYXBfaGVhZDsKKwlzdHJ1Y3Qga3ZtX2xwYWdlX2luZm8gKmxwYWdlX2luZm9bS1ZNX05SX1BBR0VfU0laRVMgLSAxXTsKIAl1bnNpZ25lZCBsb25nIHVzZXJzcGFjZV9hZGRyOwogCWludCB1c2VyX2FsbG9jOwogCWludCBpZDsKQEAgLTE2OSw2ICsyMDUsNyBAQAogCiBzdHJ1Y3Qga3ZtX21lbXNsb3RzIHsKIAlpbnQgbm1lbXNsb3RzOworCXU2NCBnZW5lcmF0aW9uOwogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgbWVtc2xvdHNbS1ZNX01FTU9SWV9TTE9UUyArCiAJCQkJCUtWTV9QUklWQVRFX01FTV9TTE9UU107CiB9OwpAQCAtMjA2LDYgKzI0MywxMCBAQAogCiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwogI2lmZGVmIENPTkZJR19IQVZFX0tWTV9JUlFDSElQCisJLyoKKwkgKiBVcGRhdGUgc2lkZSBpcyBwcm90ZWN0ZWQgYnkgaXJxX2xvY2sgYW5kLAorCSAqIGlmIGNvbmZpZ3VyZWQsIGlycWZkcy5sb2NrLgorCSAqLwogCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfdGFibGUgX19yY3UgKmlycV9yb3V0aW5nOwogCXN0cnVjdCBobGlzdF9oZWFkIG1hc2tfbm90aWZpZXJfbGlzdDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBpcnFfYWNrX25vdGlmaWVyX2xpc3Q7CkBAIC0yMTYsNiArMjU3LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1tdV9ub3RpZmllcl9zZXE7CiAJbG9uZyBtbXVfbm90aWZpZXJfY291bnQ7CiAjZW5kaWYKKwlsb25nIHRsYnNfZGlydHk7CiB9OwogCiAvKiBUaGUgZ3Vlc3QgZGlkIHNvbWV0aGluZyB3ZSBkb24ndCBzdXBwb3J0LiAqLwpAQCAtMzAyLDcgKzM0NCwxMSBAQAogCiBwZm5fdCBodmFfdG9fcGZuX2F0b21pYyhzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CiBwZm5fdCBnZm5fdG9fcGZuX2F0b21pYyhzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CitwZm5fdCBnZm5fdG9fcGZuX2FzeW5jKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBib29sICphc3luYywKKwkJICAgICAgIGJvb2wgd3JpdGVfZmF1bHQsIGJvb2wgKndyaXRhYmxlKTsKIHBmbl90IGdmbl90b19wZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pOworcGZuX3QgZ2ZuX3RvX3Bmbl9wcm90KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBib29sIHdyaXRlX2ZhdWx0LAorCQkgICAgICBib29sICp3cml0YWJsZSk7CiBwZm5fdCBnZm5fdG9fcGZuX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCQkJIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIGdmbl90IGdmbik7CiBpbnQgbWVtc2xvdF9pZChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CkBAIC0zMjEsMTggKzM2NywyNSBAQAogCQkJIGludCBvZmZzZXQsIGludCBsZW4pOwogaW50IGt2bV93cml0ZV9ndWVzdChzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGdwYSwgY29uc3Qgdm9pZCAqZGF0YSwKIAkJICAgIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2ludCBrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGdmbl90b19odmFfY2FjaGUgKmdoYywKKwkJCSAgIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2ludCBrdm1fZ2ZuX3RvX2h2YV9jYWNoZV9pbml0KHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGdmbl90b19odmFfY2FjaGUgKmdoYywKKwkJCSAgICAgIGdwYV90IGdwYSk7CiBpbnQga3ZtX2NsZWFyX2d1ZXN0X3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGludCBvZmZzZXQsIGludCBsZW4pOwogaW50IGt2bV9jbGVhcl9ndWVzdChzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGdwYSwgdW5zaWduZWQgbG9uZyBsZW4pOwogc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqZ2ZuX3RvX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pOwogaW50IGt2bV9pc192aXNpYmxlX2dmbihzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CiB1bnNpZ25lZCBsb25nIGt2bV9ob3N0X3BhZ2Vfc2l6ZShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7CiB2b2lkIG1hcmtfcGFnZV9kaXJ0eShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbik7Cit2b2lkIG1hcmtfcGFnZV9kaXJ0eV9pbl9zbG90KHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCwKKwkJCSAgICAgZ2ZuX3QgZ2ZuKTsKIAogdm9pZCBrdm1fdmNwdV9ibG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fdmNwdV9vbl9zcGluKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9yZXNjaGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9sb2FkX2d1ZXN0X2ZwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fcHV0X2d1ZXN0X2ZwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCiB2b2lkIGt2bV9mbHVzaF9yZW1vdGVfdGxicyhzdHJ1Y3Qga3ZtICprdm0pOwogdm9pZCBrdm1fcmVsb2FkX3JlbW90ZV9tbXVzKHN0cnVjdCBrdm0gKmt2bSk7CiAKQEAgLTM5OCw3ICs0NTEsMTkgQEAKIAogdm9pZCBrdm1fZnJlZV9waHlzbWVtKHN0cnVjdCBrdm0gKmt2bSk7CiAKLXN0cnVjdCAga3ZtICprdm1fYXJjaF9jcmVhdGVfdm0odm9pZCk7CisjaWZuZGVmIF9fS1ZNX0hBVkVfQVJDSF9WTV9BTExPQworc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtICprdm1fYXJjaF9hbGxvY192bSh2b2lkKQoreworCXJldHVybiBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtKSwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrdm1fYXJjaF9mcmVlX3ZtKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlrZnJlZShrdm0pOworfQorI2VuZGlmCisKK2ludCBrdm1fYXJjaF9pbml0X3ZtKHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKTsKIHZvaWQga3ZtX2ZyZWVfYWxsX2Fzc2lnbmVkX2RldmljZXMoc3RydWN0IGt2bSAqa3ZtKTsKIHZvaWQga3ZtX2FyY2hfc3luY19ldmVudHMoc3RydWN0IGt2bSAqa3ZtKTsKQEAgLTQxNCwxNiArNDc5LDggQEAKIAl2b2lkICgqaXJxX2Fja2VkKShzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW4pOwogfTsKIAotI2RlZmluZSBLVk1fQVNTSUdORURfTVNJWF9QRU5ESU5HCQkweDEKLXN0cnVjdCBrdm1fZ3Vlc3RfbXNpeF9lbnRyeSB7Ci0JdTMyIHZlY3RvcjsKLQl1MTYgZW50cnk7Ci0JdTE2IGZsYWdzOwotfTsKLQogc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsIHsKIAlzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgYWNrX25vdGlmaWVyOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBpbnRlcnJ1cHRfd29yazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGFzc2lnbmVkX2Rldl9pZDsKIAlpbnQgaG9zdF9zZWducjsKQEAgLTQzNCwxMyArNDkxLDE0IEBACiAJYm9vbCBob3N0X2lycV9kaXNhYmxlZDsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqaG9zdF9tc2l4X2VudHJpZXM7CiAJaW50IGd1ZXN0X2lycTsKLQlzdHJ1Y3Qga3ZtX2d1ZXN0X21zaXhfZW50cnkgKmd1ZXN0X21zaXhfZW50cmllczsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqZ3Vlc3RfbXNpeF9lbnRyaWVzOwogCXVuc2lnbmVkIGxvbmcgaXJxX3JlcXVlc3RlZF90eXBlOwogCWludCBpcnFfc291cmNlX2lkOwogCWludCBmbGFnczsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXN0cnVjdCBrdm0gKmt2bTsKLQlzcGlubG9ja190IGFzc2lnbmVkX2Rldl9sb2NrOworCXNwaW5sb2NrX3QgaW50eF9sb2NrOworCWNoYXIgaXJxX25hbWVbMzJdOwogfTsKIAogc3RydWN0IGt2bV9pcnFfbWFza19ub3RpZmllciB7CkBAIC00NjIsNiArNTIwLDggQEAKIAkJCQkgICB1bnNpZ25lZCBsb25nICpkZWxpdmVyX2JpdG1hc2spOwogI2VuZGlmCiBpbnQga3ZtX3NldF9pcnEoc3RydWN0IGt2bSAqa3ZtLCBpbnQgaXJxX3NvdXJjZV9pZCwgdTMyIGlycSwgaW50IGxldmVsKTsKK2ludCBrdm1fc2V0X21zaShzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFfcm91dGluZ19lbnRyeSAqaXJxX2VudHJ5LCBzdHJ1Y3Qga3ZtICprdm0sCisJCWludCBpcnFfc291cmNlX2lkLCBpbnQgbGV2ZWwpOwogdm9pZCBrdm1fbm90aWZ5X2Fja2VkX2lycShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGlycWNoaXAsIHVuc2lnbmVkIHBpbik7CiB2b2lkIGt2bV9yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICBzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW4pOwpAQCAtNjAzLDE3ICs2NjMsMjggQEAKIHZvaWQga3ZtX2V2ZW50ZmRfaW5pdChzdHJ1Y3Qga3ZtICprdm0pOwogaW50IGt2bV9pcnFmZChzdHJ1Y3Qga3ZtICprdm0sIGludCBmZCwgaW50IGdzaSwgaW50IGZsYWdzKTsKIHZvaWQga3ZtX2lycWZkX3JlbGVhc2Uoc3RydWN0IGt2bSAqa3ZtKTsKK3ZvaWQga3ZtX2lycV9yb3V0aW5nX3VwZGF0ZShzdHJ1Y3Qga3ZtICosIHN0cnVjdCBrdm1faXJxX3JvdXRpbmdfdGFibGUgKik7CiBpbnQga3ZtX2lvZXZlbnRmZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1faW9ldmVudGZkICphcmdzKTsKIAogI2Vsc2UKIAogc3RhdGljIGlubGluZSB2b2lkIGt2bV9ldmVudGZkX2luaXQoc3RydWN0IGt2bSAqa3ZtKSB7fQorCiBzdGF0aWMgaW5saW5lIGludCBrdm1faXJxZmQoc3RydWN0IGt2bSAqa3ZtLCBpbnQgZmQsIGludCBnc2ksIGludCBmbGFncykKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGt2bV9pcnFmZF9yZWxlYXNlKHN0cnVjdCBrdm0gKmt2bSkge30KKworI2lmZGVmIENPTkZJR19IQVZFX0tWTV9JUlFDSElQCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lycV9yb3V0aW5nX3VwZGF0ZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJCSAgc3RydWN0IGt2bV9pcnFfcm91dGluZ190YWJsZSAqaXJxX3J0KQoreworCXJjdV9hc3NpZ25fcG9pbnRlcihrdm0tPmlycV9yb3V0aW5nLCBpcnFfcnQpOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50IGt2bV9pb2V2ZW50ZmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2lvZXZlbnRmZCAqYXJncykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2t2bV90eXBlcy5oCmluZGV4IDdhYzBkNGVlLi5mYTdjYzcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX3R5cGVzLmgKQEAgLTY3LDQgKzY3LDExIEBACiAJdTMyIGRlc3RfaWQ7CiB9OwogCitzdHJ1Y3QgZ2ZuX3RvX2h2YV9jYWNoZSB7CisJdTY0IGdlbmVyYXRpb247CisJZ3BhX3QgZ3BhOworCXVuc2lnbmVkIGxvbmcgaHZhOworCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7Cit9OworCiAjZW5kaWYgLyogX19LVk1fVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMtbHA1NTIxLmggYi9pbmNsdWRlL2xpbnV4L2xlZHMtbHA1NTIxLmgKaW5kZXggMzgzNjhkNy4uZmQ1NDhkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLWxwNTUyMS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy1scDU1MjEuaApAQCAtNDIsNiArNDIsNyBAQAogCWludAkoKnNldHVwX3Jlc291cmNlcykodm9pZCk7CiAJdm9pZAkoKnJlbGVhc2VfcmVzb3VyY2VzKSh2b2lkKTsKIAl2b2lkCSgqZW5hYmxlKShib29sIHN0YXRlKTsKKwljb25zdCBjaGFyICpsYWJlbDsKIH07CiAKICNlbmRpZiAvKiBfX0xJTlVYX0xQNTUyMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMtbHA1NTIzLmggYi9pbmNsdWRlL2xpbnV4L2xlZHMtbHA1NTIzLmgKaW5kZXggNzk2NzQ3Ni4uMjY5NDI4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLWxwNTUyMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy1scDU1MjMuaApAQCAtNDIsNiArNDIsNyBAQAogCWludAkoKnNldHVwX3Jlc291cmNlcykodm9pZCk7CiAJdm9pZAkoKnJlbGVhc2VfcmVzb3VyY2VzKSh2b2lkKTsKIAl2b2lkCSgqZW5hYmxlKShib29sIHN0YXRlKTsKKwljb25zdAljaGFyICpsYWJlbDsKIH07CiAKICNlbmRpZiAvKiBfX0xJTlVYX0xQNTUyM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBkOTQ3YjEyLi5jOWM1ZDdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTk5Niw4ICs5OTYsNyBAQAogZXh0ZXJuIGludCBhdGFfc2FzX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfc2FzX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3Nhc19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBhdGFfcG9ydCAqKTsKLWV4dGVybiBpbnQgYXRhX3Nhc19xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAotCQkJICAgIHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIGludCBhdGFfc2FzX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3ZhbGlkKHN0cnVjdCBhdGFfbGluayAqbGluayk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcmVnLCB1MzIgKnZhbCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyIHZhbCk7CkBAIC0xMDQwLDggKzEwMzksNyBAQAogCQkJCQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTE2ICppZCk7CiBleHRlcm4gdm9pZCBhdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gaW50IGF0YV9xY19jb21wbGV0ZV9tdWx0aXBsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgcWNfYWN0aXZlKTsKLWV4dGVybiB2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IGF0YV9zdGRfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJICAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saXN0X2JsLmggYi9pbmNsdWRlL2xpbnV4L2xpc3RfYmwuaAppbmRleCA5ZWU5N2U3Li41YmFkMTdkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saXN0X2JsLmgKKysrIGIvaW5jbHVkZS9saW51eC9saXN0X2JsLmgKQEAgLTYyLDcgKzYyLDggQEAKIAkJCQkJc3RydWN0IGhsaXN0X2JsX25vZGUgKm4pCiB7CiAJTElTVF9CTF9CVUdfT04oKHVuc2lnbmVkIGxvbmcpbiAmIExJU1RfQkxfTE9DS01BU0spOwotCUxJU1RfQkxfQlVHX09OKCEoKHVuc2lnbmVkIGxvbmcpaC0+Zmlyc3QgJiBMSVNUX0JMX0xPQ0tNQVNLKSk7CisJTElTVF9CTF9CVUdfT04oKCh1bnNpZ25lZCBsb25nKWgtPmZpcnN0ICYgTElTVF9CTF9MT0NLTUFTSykgIT0KKwkJCQkJCQlMSVNUX0JMX0xPQ0tNQVNLKTsKIAloLT5maXJzdCA9IChzdHJ1Y3QgaGxpc3RfYmxfbm9kZSAqKSgodW5zaWduZWQgbG9uZyluIHwgTElTVF9CTF9MT0NLTUFTSyk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvZGVidWcuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvZGVidWcuaAppbmRleCAzNGIyYjdmLi4yNTdkMzc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2RlYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9kZWJ1Zy5oCkBAIC00NCwxNCArNDQsNCBAQAogI2RlZmluZSBOTE1EQkdfWERSCQkweDAxMDAKICNkZWZpbmUgTkxNREJHX0FMTAkJMHg3ZmZmCiAKLQotLyoKLSAqIFN1cHBvcnQgZm9yIHByaW50aW5nIE5MTSBjb29raWVzIGluIGRwcmludGsoKQotICovCi0jaWZkZWYgUlBDX0RFQlVHCi1zdHJ1Y3QgbmxtX2Nvb2tpZTsKLS8qIENhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBCS0wgaGVsZCAoaXQgdXNlcyBhIHN0YXRpYyBidWZmZXIpICovCi1leHRlcm4gY29uc3QgY2hhciAqbmxtZGJnX2Nvb2tpZTJhKGNvbnN0IHN0cnVjdCBubG1fY29va2llICopOwotI2VuZGlmCi0KICNlbmRpZiAvKiBMSU5VWF9MT0NLRF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmggYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKaW5kZXggMmRlZTA1ZS4uZmY5YWJmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaApAQCAtMjAyLDkgKzIwMiw5IEBACiAgKiBMb2NrZCBjbGllbnQgZnVuY3Rpb25zCiAgKi8KIHN0cnVjdCBubG1fcnFzdCAqIG5sbV9hbGxvY19jYWxsKHN0cnVjdCBubG1faG9zdCAqaG9zdCk7Ci12b2lkCQkgIG5sbV9yZWxlYXNlX2NhbGwoc3RydWN0IG5sbV9ycXN0ICopOwogaW50CQkgIG5sbV9hc3luY19jYWxsKHN0cnVjdCBubG1fcnFzdCAqLCB1MzIsIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKik7CiBpbnQJCSAgbmxtX2FzeW5jX3JlcGx5KHN0cnVjdCBubG1fcnFzdCAqLCB1MzIsIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgKik7Cit2b2lkCQkgIG5sbWNsbnRfcmVsZWFzZV9jYWxsKHN0cnVjdCBubG1fcnFzdCAqKTsKIHN0cnVjdCBubG1fd2FpdCAqIG5sbWNsbnRfcHJlcGFyZV9ibG9jayhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKIHZvaWQJCSAgbmxtY2xudF9maW5pc2hfYmxvY2soc3RydWN0IG5sbV93YWl0ICpibG9jayk7CiBpbnQJCSAgbmxtY2xudF9ibG9jayhzdHJ1Y3QgbmxtX3dhaXQgKmJsb2NrLCBzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgbG9uZyB0aW1lb3V0KTsKQEAgLTIyMywxMyArMjIzLDE0IEBACiAJCQkJCWNvbnN0IHUzMiB2ZXJzaW9uLAogCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKIAkJCQkJaW50IG5vcmVzdnBvcnQpOwordm9pZAkJICBubG1jbG50X3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiBzdHJ1Y3QgbmxtX2hvc3QgICpubG1zdmNfbG9va3VwX2hvc3QoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKIAkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCiAJCQkJCWNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pOwordm9pZAkJICBubG1zdmNfcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHN0cnVjdCBycGNfY2xudCAqIG5sbV9iaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogdm9pZAkJICBubG1fcmViaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogc3RydWN0IG5sbV9ob3N0ICogbmxtX2dldF9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKLXZvaWQJCSAgbmxtX3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9zaHV0ZG93bl9ob3N0cyh2b2lkKTsKIHZvaWQJCSAgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IG5sbV9yZWJvb3QgKik7CiAKQEAgLTI2Nyw2ICsyNjgsNyBAQAogdm9pZAkJICBubG1zdmNfdHJhdmVyc2VfYmxvY2tzKHN0cnVjdCBubG1faG9zdCAqLCBzdHJ1Y3QgbmxtX2ZpbGUgKiwKIAkJCQkJbmxtX2hvc3RfbWF0Y2hfZm5fdCBtYXRjaCk7CiB2b2lkCQkgIG5sbXN2Y19ncmFudF9yZXBseShzdHJ1Y3QgbmxtX2Nvb2tpZSAqLCBfX2JlMzIpOwordm9pZAkJICBubG1zdmNfcmVsZWFzZV9jYWxsKHN0cnVjdCBubG1fcnFzdCAqKTsKIAogLyoKICAqIEZpbGUgaGFuZGxpbmcgZm9yIHRoZSBzZXJ2ZXIgcGVyc29uYWxpdHkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWJjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9tYmNhY2hlLmgKaW5kZXggNTRjYmJhYy4uNTUyNWQzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tYmNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tYmNhY2hlLmgKQEAgLTE4LDYgKzE4LDE3IEBACiAJfSBlX2luZGV4OwogfTsKIAorc3RydWN0IG1iX2NhY2hlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljX2NhY2hlX2xpc3Q7CisJY29uc3QgY2hhcgkJCSpjX25hbWU7CisJYXRvbWljX3QJCQljX2VudHJ5X2NvdW50OworCWludAkJCQljX21heF9lbnRyaWVzOworCWludAkJCQljX2J1Y2tldF9iaXRzOworCXN0cnVjdCBrbWVtX2NhY2hlCQkqY19lbnRyeV9jYWNoZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkqY19ibG9ja19oYXNoOworCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2luZGV4X2hhc2g7Cit9OworCiAvKiBGdW5jdGlvbnMgb24gY2FjaGVzICovCiAKIHN0cnVjdCBtYl9jYWNoZSAqbWJfY2FjaGVfY3JlYXRlKGNvbnN0IGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggMTU5YTA3NjIuLjZhNTc2ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCkBAIC0yNSw2ICsyNSwxMSBAQAogc3RydWN0IHBhZ2U7CiBzdHJ1Y3QgbW1fc3RydWN0OwogCisvKiBTdGF0cyB0aGF0IGNhbiBiZSB1cGRhdGVkIGJ5IGtlcm5lbC4gKi8KK2VudW0gbWVtX2Nncm91cF9wYWdlX3N0YXRfaXRlbSB7CisJTUVNQ0dfTlJfRklMRV9NQVBQRUQsIC8qICMgb2YgcGFnZXMgY2hhcmdlZCBhcyBmaWxlIHJzcyAqLworfTsKKwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZHN0LAogCQkJCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsCkBAIC05Myw3ICs5OCw3IEBACiBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLAogCXN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cik7CiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKLQlzdHJ1Y3QgcGFnZSAqb2xkcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpOworCXN0cnVjdCBwYWdlICpvbGRwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgYm9vbCBtaWdyYXRpb25fb2spOwogCiAvKgogICogRm9yIG1lbW9yeSByZWNsYWltLgpAQCAtMTIxLDcgKzEyNiwyMiBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV9maWxlX21hcHBlZChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHZhbCk7Cit2b2lkIG1lbV9jZ3JvdXBfdXBkYXRlX3BhZ2Vfc3RhdChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgZW51bSBtZW1fY2dyb3VwX3BhZ2Vfc3RhdF9pdGVtIGlkeCwKKwkJCQkgaW50IHZhbCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2luY19wYWdlX3N0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgICBlbnVtIG1lbV9jZ3JvdXBfcGFnZV9zdGF0X2l0ZW0gaWR4KQoreworCW1lbV9jZ3JvdXBfdXBkYXRlX3BhZ2Vfc3RhdChwYWdlLCBpZHgsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9kZWNfcGFnZV9zdGF0KHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgICAgZW51bSBtZW1fY2dyb3VwX3BhZ2Vfc3RhdF9pdGVtIGlkeCkKK3sKKwltZW1fY2dyb3VwX3VwZGF0ZV9wYWdlX3N0YXQocGFnZSwgaWR4LCAtMSk7Cit9CisKIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zb2Z0X2xpbWl0X3JlY2xhaW0oc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwKIAkJCQkJCWdmcF90IGdmcF9tYXNrKTsKIHU2NCBtZW1fY2dyb3VwX2dldF9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKQEAgLTIzMSw4ICsyNTEsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0JCQkJCXN0cnVjdCBwYWdlICpvbGRwYWdlLAotCQkJCQlzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKKwkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlLCBib29sIG1pZ3JhdGlvbl9vaykKIHsKIH0KIApAQCAtMjkzLDggKzMxMiwxMyBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF91cGRhdGVfZmlsZV9tYXBwZWQoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJCQkJaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2luY19wYWdlX3N0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCSAgICBlbnVtIG1lbV9jZ3JvdXBfcGFnZV9zdGF0X2l0ZW0gaWR4KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9kZWNfcGFnZV9zdGF0KHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgICAgZW51bSBtZW1fY2dyb3VwX3BhZ2Vfc3RhdF9pdGVtIGlkeCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCmluZGV4IDMxYzIzN2EuLjI0Mzc2ZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKQEAgLTEzLDEyICsxMywxNiBAQAogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVRwogCiAvKgotICogVHlwZXMgZm9yIGZyZWUgYm9vdG1lbS4KLSAqIFRoZSBub3JtYWwgc21hbGxlc3QgbWFwY291bnQgaXMgLTEuIEhlcmUgaXMgc21hbGxlciB2YWx1ZSB0aGFuIGl0LgorICogVHlwZXMgZm9yIGZyZWUgYm9vdG1lbSBzdG9yZWQgaW4gcGFnZS0+bHJ1Lm5leHQuIFRoZXNlIGhhdmUgdG8gYmUgaW4KKyAqIHNvbWUgcmFuZG9tIHJhbmdlIGluIHVuc2lnbmVkIGxvbmcgc3BhY2UgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICAqLwotI2RlZmluZSBTRUNUSU9OX0lORk8JCSgtMSAtIDEpCi0jZGVmaW5lIE1JWF9TRUNUSU9OX0lORk8JKC0xIC0gMikKLSNkZWZpbmUgTk9ERV9JTkZPCQkoLTEgLSAzKQorZW51bSB7CisJTUVNT1JZX0hPVFBMVUdfTUlOX0JPT1RNRU1fVFlQRSA9IDEyLAorCVNFQ1RJT05fSU5GTyA9IE1FTU9SWV9IT1RQTFVHX01JTl9CT09UTUVNX1RZUEUsCisJTUlYX1NFQ1RJT05fSU5GTywKKwlOT0RFX0lORk8sCisJTUVNT1JZX0hPVFBMVUdfTUFYX0JPT1RNRU1fVFlQRSA9IE5PREVfSU5GTywKK307CiAKIC8qCiAgKiBwZ2RhdCByZXNpemluZyBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FiODUwMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKaW5kZXggZDYzYjYwNS4uMzdmNTZiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKQEAgLTc0LDMyICs3NCwzNyBAQAogI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9GCTM3CiAjZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX1IJMzgKICNkZWZpbmUgQUI4NTAwX0lOVF9HUF9TV19BRENfQ09OVl9FTkQJMzkKLSNkZWZpbmUgQUI4NTAwX0lOVF9CVEVNUF9MT1cJCTcyCi0jZGVmaW5lIEFCODUwMF9JTlRfQlRFTVBfTE9XX01FRElVTQk3MwotI2RlZmluZSBBQjg1MDBfSU5UX0JURU1QX01FRElVTV9ISUdICTc0Ci0jZGVmaW5lIEFCODUwMF9JTlRfQlRFTVBfSElHSAkJNzUKLSNkZWZpbmUgQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0sJODEKLSNkZWZpbmUgQUI4NTAwX0lOVF9JRF9XQUtFVVBfUgkJODIKLSNkZWZpbmUgQUI4NTAwX0lOVF9JRF9ERVRfUjFSCQk4NAotI2RlZmluZSBBQjg1MDBfSU5UX0lEX0RFVF9SMlIJCTg1Ci0jZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1IzUgkJODYKLSNkZWZpbmUgQUI4NTAwX0lOVF9JRF9ERVRfUjRSCQk4NwotI2RlZmluZSBBQjg1MDBfSU5UX0lEX1dBS0VVUF9GCQk4OAotI2RlZmluZSBBQjg1MDBfSU5UX0lEX0RFVF9SMUYJCTkwCi0jZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1IyRgkJOTEKLSNkZWZpbmUgQUI4NTAwX0lOVF9JRF9ERVRfUjNGCQk5MgotI2RlZmluZSBBQjg1MDBfSU5UX0lEX0RFVF9SNEYJCTkzCi0jZGVmaW5lIEFCODUwMF9JTlRfVVNCX0NIR19ERVRfRE9ORQk5NAotI2RlZmluZSBBQjg1MDBfSU5UX1VTQl9DSF9USF9QUk9UX0YJOTYKLSNkZWZpbmUgQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPUF9SCTk3Ci0jZGVmaW5lIEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9QX0YJOTgKLSNkZWZpbmUgQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfUgk5OQotI2RlZmluZSBBQjg1MDBfSU5UX1VTQl9DSEFSR0VSX05PVF9PS0YJMTAzCisjZGVmaW5lIEFCODUwMF9JTlRfQURQX1NPVVJDRV9FUlJPUgk3MgorI2RlZmluZSBBQjg1MDBfSU5UX0FEUF9TSU5LX0VSUk9SCTczCisjZGVmaW5lIEFCODUwMF9JTlRfQURQX1BST0JFX1BMVUcJNzQKKyNkZWZpbmUgQUI4NTAwX0lOVF9BRFBfUFJPQkVfVU5QTFVHCTc1CisjZGVmaW5lIEFCODUwMF9JTlRfQURQX1NFTlNFX09GRgk3NgorI2RlZmluZSBBQjg1MDBfSU5UX1VTQl9QSFlfUE9XRVJfRVJSCTc4CisjZGVmaW5lIEFCODUwMF9JTlRfVVNCX0xJTktfU1RBVFVTCTc5CisjZGVmaW5lIEFCODUwMF9JTlRfQlRFTVBfTE9XCQk4MAorI2RlZmluZSBBQjg1MDBfSU5UX0JURU1QX0xPV19NRURJVU0JODEKKyNkZWZpbmUgQUI4NTAwX0lOVF9CVEVNUF9NRURJVU1fSElHSAk4MgorI2RlZmluZSBBQjg1MDBfSU5UX0JURU1QX0hJR0gJCTgzCisjZGVmaW5lIEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LCTg5CisjZGVmaW5lIEFCODUwMF9JTlRfSURfV0FLRVVQX1IJCTkwCisjZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1IxUgkJOTIKKyNkZWZpbmUgQUI4NTAwX0lOVF9JRF9ERVRfUjJSCQk5MworI2RlZmluZSBBQjg1MDBfSU5UX0lEX0RFVF9SM1IJCTk0CisjZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1I0UgkJOTUKKyNkZWZpbmUgQUI4NTAwX0lOVF9JRF9XQUtFVVBfRgkJOTYKKyNkZWZpbmUgQUI4NTAwX0lOVF9JRF9ERVRfUjFGCQk5OAorI2RlZmluZSBBQjg1MDBfSU5UX0lEX0RFVF9SMkYJCTk5CisjZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1IzRgkJMTAwCisjZGVmaW5lIEFCODUwMF9JTlRfSURfREVUX1I0RgkJMTAxCisjZGVmaW5lIEFCODUwMF9JTlRfVVNCX0NIR19ERVRfRE9ORQkxMDIKKyNkZWZpbmUgQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPVF9GCTEwNAorI2RlZmluZSBBQjg1MDBfSU5UX1VTQl9DSF9USF9QUk9UX1IgICAgMTA1CisjZGVmaW5lIEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX0YgICAxMDYKKyNkZWZpbmUgQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfUgkxMDcKKyNkZWZpbmUgQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGCTExMQogCi0jZGVmaW5lIEFCODUwMF9OUl9JUlFTCQkJMTA0Ci0jZGVmaW5lIEFCODUwMF9OVU1fSVJRX1JFR1MJCTEzCi0KLSNkZWZpbmUgQUI4NTAwX05VTV9SRUdVTEFUT1JTICAgMTUKKyNkZWZpbmUgQUI4NTAwX05SX0lSUVMJCQkxMTIKKyNkZWZpbmUgQUI4NTAwX05VTV9JUlFfUkVHUwkJMTQKIAogLyoqCiAgKiBzdHJ1Y3QgYWI4NTAwIC0gYWI4NTAwIGludGVybmFsIHN0cnVjdHVyZQpAQCAtMTQ1LDcgKzE1MCw4IEBACiBzdHJ1Y3QgYWI4NTAwX3BsYXRmb3JtX2RhdGEgewogCWludCBpcnFfYmFzZTsKIAl2b2lkICgqaW5pdCkgKHN0cnVjdCBhYjg1MDAgKik7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnJlZ3VsYXRvcltBQjg1MDBfTlVNX1JFR1VMQVRPUlNdOworCWludCBudW1fcmVndWxhdG9yOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWd1bGF0b3I7CiB9OwogCiBleHRlcm4gaW50IF9fZGV2aW5pdCBhYjg1MDBfaW5pdChzdHJ1Y3QgYWI4NTAwICphYjg1MDApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvY29yZS5oCmluZGV4IGNiOTNkODAuLjgzNTk5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9jb3JlLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAlzaXplX3QJCQlkYXRhX3NpemU7CiAKIAkvKgotCSAqIFRoaXMgcmVzb3VyY2VzIGNhbiBiZSBzcGVjaWZpZWQgcmVsYXRpZXZseSB0byB0aGUgcGFyZW50IGRldmljZS4KKwkgKiBUaGlzIHJlc291cmNlcyBjYW4gYmUgc3BlY2lmaWVkIHJlbGF0aXZlbHkgdG8gdGhlIHBhcmVudCBkZXZpY2UuCiAJICogRm9yIGFjY2Vzc2luZyBkZXZpY2UgeW91IHNob3VsZCB1c2UgcmVzb3VyY2VzIGZyb20gZGV2aWNlCiAJICovCiAJaW50CQkJbnVtX3Jlc291cmNlczsKQEAgLTQ3LDYgKzQ3LDEyIEBACiAKIAkvKiBkb24ndCBjaGVjayBmb3IgcmVzb3VyY2UgY29uZmxpY3RzICovCiAJYm9vbAkJCWlnbm9yZV9yZXNvdXJjZV9jb25mbGljdHM7CisKKwkvKgorCSAqIERpc2FibGUgcnVudGltZSBQTSBjYWxsYmFja3MgZm9yIHRoaXMgc3ViZGV2aWNlIC0gc2VlCisJICogcG1fcnVudGltZV9ub19jYWxsYmFja3MoKS4KKwkgKi8KKwlib29sCQkJcG1fcnVudGltZV9ub19jYWxsYmFja3M7CiB9OwogCiBleHRlcm4gaW50IG1mZF9hZGRfZGV2aWNlcyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBpZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTgtcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC1wcml2YXRlLmgKaW5kZXggNzM2M2RlYS4uZWZmYTVkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC1wcml2YXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC1wcml2YXRlLmgKQEAgLTE1OSwxMCArMTU5LDEyIEBACiAJdTggaXJxX21hc2tzX2N1cltNQVg4OTk4X05VTV9JUlFfUkVHU107CiAJdTggaXJxX21hc2tzX2NhY2hlW01BWDg5OThfTlVNX0lSUV9SRUdTXTsKIAlpbnQgdHlwZTsKKwlib29sIHdha2V1cDsKIH07CiAKIGludCBtYXg4OTk4X2lycV9pbml0KHN0cnVjdCBtYXg4OTk4X2RldiAqbWF4ODk5OCk7CiB2b2lkIG1heDg5OThfaXJxX2V4aXQoc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4KTsKK2ludCBtYXg4OTk4X2lycV9yZXN1bWUoc3RydWN0IG1heDg5OThfZGV2ICptYXg4OTk4KTsKIAogZXh0ZXJuIGludCBtYXg4OTk4X3JlYWRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsIHU4IHJlZywgdTggKmRlc3QpOwogZXh0ZXJuIGludCBtYXg4OTk4X2J1bGtfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLCB1OCByZWcsIGludCBjb3VudCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaCBiL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaAppbmRleCBmOGM5Zjg4Li42MWRhYTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC5oCkBAIC03MCwyNCArNzAsNDMgQEAKICAqIEBudW1fcmVndWxhdG9yczogbnVtYmVyIG9mIHJlZ3VsdG9ycyB1c2VkCiAgKiBAaXJxX2Jhc2U6IGJhc2UgSVJRIG51bWJlciBmb3IgbWF4ODk5OCwgcmVxdWlyZWQgZm9yIElSUXMKICAqIEBvbm86IHBvd2VyIG9ub2ZmIElSUSBudW1iZXIgZm9yIG1heDg5OTgKLSAqIEBidWNrMV9tYXhfdm9sdGFnZTE6IEJVQ0sxIG1heGltdW0gYWxvd2VkIHZvbHRhZ2UgcmVnaXN0ZXIgMQotICogQGJ1Y2sxX21heF92b2x0YWdlMjogQlVDSzEgbWF4aW11bSBhbG93ZWQgdm9sdGFnZSByZWdpc3RlciAyCi0gKiBAYnVjazJfbWF4X3ZvbHRhZ2U6IEJVQ0syIG1heGltdW0gYWxvd2VkIHZvbHRhZ2UKKyAqIEBidWNrX3ZvbHRhZ2VfbG9jazogRG8gTk9UIGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgc2l4CisgKiAgIHJlZ2lzdGVycyBzZXQgYnkgYnVjaz9fdm9sdGFnZT8uIFRoZSB2b2x0YWdlIG9mIEJVQ0sxLzIgY2Fubm90CisgKiAgIGJlIG90aGVyIHRoYW4gdGhlIHByZXNldCB2YWx1ZXMuCisgKiBAYnVjazFfdm9sdGFnZTE6IEJVQ0sxIERWUyBtb2RlIDEgdm9sdGFnZSByZWdpc3RlcgorICogQGJ1Y2sxX3ZvbHRhZ2UyOiBCVUNLMSBEVlMgbW9kZSAyIHZvbHRhZ2UgcmVnaXN0ZXIKKyAqIEBidWNrMV92b2x0YWdlMzogQlVDSzEgRFZTIG1vZGUgMyB2b2x0YWdlIHJlZ2lzdGVyCisgKiBAYnVjazFfdm9sdGFnZTQ6IEJVQ0sxIERWUyBtb2RlIDQgdm9sdGFnZSByZWdpc3RlcgorICogQGJ1Y2syX3ZvbHRhZ2UxOiBCVUNLMiBEVlMgbW9kZSAxIHZvbHRhZ2UgcmVnaXN0ZXIKKyAqIEBidWNrMl92b2x0YWdlMjogQlVDSzIgRFZTIG1vZGUgMiB2b2x0YWdlIHJlZ2lzdGVyCiAgKiBAYnVjazFfc2V0MTogQlVDSzEgZ3BpbyBwaW4gMSB0byBzZXQgb3V0cHV0IHZvbHRhZ2UKICAqIEBidWNrMV9zZXQyOiBCVUNLMSBncGlvIHBpbiAyIHRvIHNldCBvdXRwdXQgdm9sdGFnZQorICogQGJ1Y2sxX2RlZmF1bHRfaWR4OiBEZWZhdWx0IGZvciBCVUNLMSBncGlvIHBpbiAxLCAyCiAgKiBAYnVjazJfc2V0MzogQlVDSzIgZ3BpbyBwaW4gdG8gc2V0IG91dHB1dCB2b2x0YWdlCisgKiBAYnVjazJfZGVmYXVsdF9pZHg6IERlZmF1bHQgZm9yIEJVQ0syIGdwaW8gcGluLgorICogQHdha2V1cDogQWxsb3cgdG8gd2FrZSB1cCBmcm9tIHN1c3BlbmQKKyAqIEBydGNfZGVsYXk6IExQMzk3NCBSVEMgY2hpcCBidWcgdGhhdCByZXF1aXJlcyBkZWxheSBhZnRlciBhIHJlZ2lzdGVyCisgKiB3cml0ZSBiZWZvcmUgcmVhZGluZyBpdC4KICAqLwogc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IG1heDg5OThfcmVndWxhdG9yX2RhdGEJKnJlZ3VsYXRvcnM7CiAJaW50CQkJCW51bV9yZWd1bGF0b3JzOwogCWludAkJCQlpcnFfYmFzZTsKIAlpbnQJCQkJb25vOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazFfbWF4X3ZvbHRhZ2UxOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazFfbWF4X3ZvbHRhZ2UyOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVjazJfbWF4X3ZvbHRhZ2U7CisJYm9vbAkJCQlidWNrX3ZvbHRhZ2VfbG9jazsKKwlpbnQJCQkJYnVjazFfdm9sdGFnZTE7CisJaW50CQkJCWJ1Y2sxX3ZvbHRhZ2UyOworCWludAkJCQlidWNrMV92b2x0YWdlMzsKKwlpbnQJCQkJYnVjazFfdm9sdGFnZTQ7CisJaW50CQkJCWJ1Y2syX3ZvbHRhZ2UxOworCWludAkJCQlidWNrMl92b2x0YWdlMjsKIAlpbnQJCQkJYnVjazFfc2V0MTsKIAlpbnQJCQkJYnVjazFfc2V0MjsKKwlpbnQJCQkJYnVjazFfZGVmYXVsdF9pZHg7CiAJaW50CQkJCWJ1Y2syX3NldDM7CisJaW50CQkJCWJ1Y2syX2RlZmF1bHRfaWR4OworCWJvb2wJCQkJd2FrZXVwOworCWJvb2wJCQkJcnRjX2RlbGF5OwogfTsKIAogI2VuZGlmIC8qICBfX0xJTlVYX01GRF9NQVg4OTk4X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaCBiL2luY2x1ZGUvbGludXgvbWZkL21jMTM3ODMuaAppbmRleCBiNGM3NDFlLi43ZDBmM2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzNzgzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWMxMzc4My5oCkBAIC0xLDQgKzEsNSBAQAogLyoKKyAqIENvcHlyaWdodCAyMDEwIFlvbmcgU2hlbiA8eW9uZy5zaGVuQGxpbmFyby5vcmc+CiAgKiBDb3B5cmlnaHQgMjAwOS0yMDEwIFBlbmd1dHJvbml4CiAgKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgogICoKQEAgLTEyMiwzOSArMTIzLDM5IEBACiAJCXVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgKnNhbXBsZSk7CiAKIAotI2RlZmluZQlNQzEzNzgzX1NXX1NXMUEJCTAKLSNkZWZpbmUJTUMxMzc4M19TV19TVzFCCQkxCi0jZGVmaW5lCU1DMTM3ODNfU1dfU1cyQQkJMgotI2RlZmluZQlNQzEzNzgzX1NXX1NXMkIJCTMKLSNkZWZpbmUJTUMxMzc4M19TV19TVzMJCTQKLSNkZWZpbmUJTUMxMzc4M19TV19QTEwJCTUKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1ZBVURJTwk2Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WSU9ISQk3Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WSU9MTwk4Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WRElHCTkKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1ZHRU4JMTAKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1ZSRkRJRwkxMQotI2RlZmluZQlNQzEzNzgzX1JFR1VfVlJGUkVGCTEyCi0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WUkZDUAkxMwotI2RlZmluZQlNQzEzNzgzX1JFR1VfVlNJTQkxNAotI2RlZmluZQlNQzEzNzgzX1JFR1VfVkVTSU0JMTUKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1ZDQU0JMTYKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1ZSRkJHCTE3Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WVklCCTE4Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WUkYxCTE5Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WUkYyCTIwCi0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WTU1DMQkyMQotI2RlZmluZQlNQzEzNzgzX1JFR1VfVk1NQzIJMjIKLSNkZWZpbmUJTUMxMzc4M19SRUdVX0dQTzEJMjMKLSNkZWZpbmUJTUMxMzc4M19SRUdVX0dQTzIJMjQKLSNkZWZpbmUJTUMxMzc4M19SRUdVX0dQTzMJMjUKLSNkZWZpbmUJTUMxMzc4M19SRUdVX0dQTzQJMjYKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1YxCQkyNwotI2RlZmluZQlNQzEzNzgzX1JFR1VfVjIJCTI4Ci0jZGVmaW5lCU1DMTM3ODNfUkVHVV9WMwkJMjkKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1Y0CQkzMAotI2RlZmluZQlNQzEzNzgzX1JFR1VfUFdHVDFTUEkJMzEKLSNkZWZpbmUJTUMxMzc4M19SRUdVX1BXR1QyU1BJCTMyCisjZGVmaW5lCU1DMTM3ODNfUkVHX1NXMUEJCTAKKyNkZWZpbmUJTUMxMzc4M19SRUdfU1cxQgkJMQorI2RlZmluZQlNQzEzNzgzX1JFR19TVzJBCQkyCisjZGVmaW5lCU1DMTM3ODNfUkVHX1NXMkIJCTMKKyNkZWZpbmUJTUMxMzc4M19SRUdfU1czCQk0CisjZGVmaW5lCU1DMTM3ODNfUkVHX1BMTAkJNQorI2RlZmluZQlNQzEzNzgzX1JFR19WQVVESU8JNgorI2RlZmluZQlNQzEzNzgzX1JFR19WSU9ISQk3CisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZJT0xPCTgKKyNkZWZpbmUJTUMxMzc4M19SRUdfVkRJRwk5CisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZHRU4JMTAKKyNkZWZpbmUJTUMxMzc4M19SRUdfVlJGRElHCTExCisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZSRlJFRgkxMgorI2RlZmluZQlNQzEzNzgzX1JFR19WUkZDUAkxMworI2RlZmluZQlNQzEzNzgzX1JFR19WU0lNCTE0CisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZFU0lNCTE1CisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZDQU0JMTYKKyNkZWZpbmUJTUMxMzc4M19SRUdfVlJGQkcJMTcKKyNkZWZpbmUJTUMxMzc4M19SRUdfVlZJQgkxOAorI2RlZmluZQlNQzEzNzgzX1JFR19WUkYxCTE5CisjZGVmaW5lCU1DMTM3ODNfUkVHX1ZSRjIJMjAKKyNkZWZpbmUJTUMxMzc4M19SRUdfVk1NQzEJMjEKKyNkZWZpbmUJTUMxMzc4M19SRUdfVk1NQzIJMjIKKyNkZWZpbmUJTUMxMzc4M19SRUdfR1BPMQkyMworI2RlZmluZQlNQzEzNzgzX1JFR19HUE8yCTI0CisjZGVmaW5lCU1DMTM3ODNfUkVHX0dQTzMJMjUKKyNkZWZpbmUJTUMxMzc4M19SRUdfR1BPNAkyNgorI2RlZmluZQlNQzEzNzgzX1JFR19WMQkJMjcKKyNkZWZpbmUJTUMxMzc4M19SRUdfVjIJCTI4CisjZGVmaW5lCU1DMTM3ODNfUkVHX1YzCQkyOQorI2RlZmluZQlNQzEzNzgzX1JFR19WNAkJMzAKKyNkZWZpbmUJTUMxMzc4M19SRUdfUFdHVDFTUEkJMzEKKyNkZWZpbmUJTUMxMzc4M19SRUdfUFdHVDJTUEkJMzIKIAogI2RlZmluZSBNQzEzNzgzX0lSUV9BRENET05FCU1DMTNYWFhfSVJRX0FEQ0RPTkUKICNkZWZpbmUgTUMxMzc4M19JUlFfQURDQklTRE9ORQlNQzEzWFhYX0lSUV9BRENCSVNET05FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYzEzODkyLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYzEzODkyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwZjJiZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21jMTM4OTIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgWW9uZyBTaGVuIDx5b25nLnNoZW5AbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfTUMxMzg5Ml9ICisjZGVmaW5lIF9fTElOVVhfTUZEX01DMTM4OTJfSAorCisjaW5jbHVkZSA8bGludXgvbWZkL21jMTN4eHguaD4KKworI2RlZmluZSBNQzEzODkyX1NXMQkJMAorI2RlZmluZSBNQzEzODkyX1NXMgkJMQorI2RlZmluZSBNQzEzODkyX1NXMwkJMgorI2RlZmluZSBNQzEzODkyX1NXNAkJMworI2RlZmluZSBNQzEzODkyX1NXQlNUCTQKKyNkZWZpbmUgTUMxMzg5Ml9WSU9ISQk1CisjZGVmaW5lIE1DMTM4OTJfVlBMTAk2CisjZGVmaW5lIE1DMTM4OTJfVkRJRwk3CisjZGVmaW5lIE1DMTM4OTJfVlNECTgKKyNkZWZpbmUgTUMxMzg5Ml9WVVNCMgk5CisjZGVmaW5lIE1DMTM4OTJfVlZJREVPCTEwCisjZGVmaW5lIE1DMTM4OTJfVkFVRElPCTExCisjZGVmaW5lIE1DMTM4OTJfVkNBTQkxMgorI2RlZmluZSBNQzEzODkyX1ZHRU4xCTEzCisjZGVmaW5lIE1DMTM4OTJfVkdFTjIJMTQKKyNkZWZpbmUgTUMxMzg5Ml9WR0VOMwkxNQorI2RlZmluZSBNQzEzODkyX1ZVU0IJMTYKKyNkZWZpbmUgTUMxMzg5Ml9HUE8xCTE3CisjZGVmaW5lIE1DMTM4OTJfR1BPMgkxOAorI2RlZmluZSBNQzEzODkyX0dQTzMJMTkKKyNkZWZpbmUgTUMxMzg5Ml9HUE80CTIwCisjZGVmaW5lIE1DMTM4OTJfUFdHVDFTUEkJMjEKKyNkZWZpbmUgTUMxMzg5Ml9QV0dUMlNQSQkyMgorI2RlZmluZSBNQzEzODkyX1ZDT0lOQ0VMTAkyMworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaCBiL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaAppbmRleCAwODVmMDQxLi44ZTcwMzEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC90bWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oCkBAIC01Nyw2ICs1NywxMCBAQAogICogaXMgY29uZmlndXJlZCBpbiA0LWJpdCBtb2RlLgogICovCiAjZGVmaW5lIFRNSU9fTU1DX0JMS1NaXzJCWVRFUwkJKDEgPDwgMSkKKy8qCisgKiBTb21lIGNvbnRyb2xsZXJzIGNhbiBzdXBwb3J0IFNESU8gSVJRIHNpZ25hbGxpbmcuCisgKi8KKyNkZWZpbmUgVE1JT19NTUNfU0RJT19JUlEJCSgxIDw8IDIpCiAKIGludCB0bWlvX2NvcmVfbW1jX2VuYWJsZSh2b2lkIF9faW9tZW0gKmNuZiwgaW50IHNoaWZ0LCB1bnNpZ25lZCBsb25nIGJhc2UpOwogaW50IHRtaW9fY29yZV9tbWNfcmVzdW1lKHZvaWQgX19pb21lbSAqY25mLCBpbnQgc2hpZnQsIHVuc2lnbmVkIGxvbmcgYmFzZSk7CkBAIC02Niw2ICs3MCw3IEBACiBzdHJ1Y3QgdG1pb19tbWNfZG1hIHsKIAl2b2lkICpjaGFuX3ByaXZfdHg7CiAJdm9pZCAqY2hhbl9wcml2X3J4OworCWludCBhbGlnbm1lbnRfc2hpZnQ7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKaW5kZXggYTEyMzljNC4uOTAzMjgwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlXTTgzMjAgPSAweDgzMjAsCiAJV004MzIxID0gMHg4MzIxLAogCVdNODMyNSA9IDB4ODMyNSwKKwlXTTgzMjYgPSAweDgzMjYsCiB9OwogCiBzdHJ1Y3Qgd204MzF4IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvY29yZS5oCmluZGV4IGRlNzliYWUuLjNmZDM2ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L2NvcmUuaApAQCAtMTcsNiArMTcsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCitlbnVtIHdtODk5NF90eXBlIHsKKwlXTTg5OTQgPSAwLAorCVdNODk1OCA9IDEsCit9OworCiBzdHJ1Y3QgcmVndWxhdG9yX2RldjsKIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhOwogCkBAIC00OCw2ICs1Myw4IEBACiAJc3RydWN0IG11dGV4IGlvX2xvY2s7CiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwogCisJZW51bSB3bTg5OTRfdHlwZSB0eXBlOworCiAJc3RydWN0IGRldmljZSAqZGV2OwogCWludCAoKnJlYWRfZGV2KShzdHJ1Y3Qgd204OTk0ICp3bTg5OTQsIHVuc2lnbmVkIHNob3J0IHJlZywKIAkJCWludCBieXRlcywgdm9pZCAqZGVzdCk7CkBAIC02OCw2ICs3NSw3IEBACiAJdTE2IGdwaW9fcmVnc1tXTTg5OTRfTlVNX0dQSU9fUkVHU107CiAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGJ2ZGQ7CisJaW50IG51bV9zdXBwbGllczsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXM7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvcGRhdGEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9wZGF0YS5oCmluZGV4IGFkZDhhMWIuLjllYWIyNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9wZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9wZGF0YS5oCkBAIC0zMCw2ICszMCw4IEBACiAKICNkZWZpbmUgV004OTk0X0RSQ19SRUdTIDUKICNkZWZpbmUgV004OTk0X0VRX1JFR1MgIDIwCisjZGVmaW5lIFdNODk1OF9NQkNfQ1VUT0ZGX1JFR1MgMjAKKyNkZWZpbmUgV004OTU4X01CQ19DT0VGRl9SRUdTICA0OAogCiAvKioKICAqIERSQyBjb25maWd1cmF0aW9ucyBhcmUgc3BlY2lmaWVkIHdpdGggYSBsYWJlbCBhbmQgYSBzZXQgb2YgcmVnaXN0ZXIKQEAgLTU5LDYgKzYxLDE4IEBACiAgICAgICAgIHUxNiByZWdzW1dNODk5NF9FUV9SRUdTXTsKIH07CiAKKy8qKgorICogTXVsdGliYW5kIGNvbXByZXNzb3IgY29uZmlndXJhdGlvbnMgYXJlIHNwZWNpZmllZCB3aXRoIGEgbGFiZWwgYW5kCisgKiB0d28gc2V0cyBvZiB2YWx1ZXMgdG8gd3JpdGUuICBDb25maWd1cmF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUKKyAqIGdlbmVyYXRlZCB1c2luZyB0aGUgbXVsdGliYW5kIGNvbXByZXNzb3IgY29uZmlndXJhdGlvbiBwYW5lbCBpbgorICogV0lTQ0UgLSBzZWUgaHR0cDovL3d3dy53b2xmc29ubWljcm8uY29tL3dpc2NlLworICovCitzdHJ1Y3Qgd204OTU4X21iY19jZmcgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTE2IGN1dG9mZl9yZWdzW1dNODk1OF9NQkNfQ1VUT0ZGX1JFR1NdOworCXUxNiBjb2VmZl9yZWdzW1dNODk1OF9NQkNfQ09FRkZfUkVHU107Cit9OworCiBzdHJ1Y3Qgd204OTk0X3BkYXRhIHsKIAlpbnQgZ3Bpb19iYXNlOwogCkBAIC03OCw2ICs5Miw5IEBACiAgICAgICAgIGludCBudW1fcmV0dW5lX21vYmlsZV9jZmdzOwogICAgICAgICBzdHJ1Y3Qgd204OTk0X3JldHVuZV9tb2JpbGVfY2ZnICpyZXR1bmVfbW9iaWxlX2NmZ3M7CiAKKwlpbnQgbnVtX21iY19jZmdzOworCXN0cnVjdCB3bTg5NThfbWJjX2NmZyAqbWJjX2NmZ3M7CisKICAgICAgICAgLyogTElORU9VVCBjYW4gYmUgZGlmZmVyZW50aWFsIG9yIHNpbmdsZSBlbmRlZCAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgbGluZW91dDFfZGlmZjoxOwogICAgICAgICB1bnNpZ25lZCBpbnQgbGluZW91dDJfZGlmZjoxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3JlZ2lzdGVycy5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204OTk0L3JlZ2lzdGVycy5oCmluZGV4IDk2N2Y2MmYuLmJlMDcyZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTg5OTQvcmVnaXN0ZXJzLmgKQEAgLTY0LDEyICs2NCwxNiBAQAogI2RlZmluZSBXTTg5OTRfTERPXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQgogI2RlZmluZSBXTTg5OTRfTERPXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQwogI2RlZmluZSBXTTg5OTRfQ0hBUkdFX1BVTVBfMSAgICAgICAgICAgICAgICAgICAgMHg0QworI2RlZmluZSBXTTg5NThfQ0hBUkdFX1BVTVBfMiAgICAgICAgICAgICAgICAgICAgMHg0RAogI2RlZmluZSBXTTg5OTRfQ0xBU1NfV18xICAgICAgICAgICAgICAgICAgICAgICAgMHg1MQogI2RlZmluZSBXTTg5OTRfRENfU0VSVk9fMSAgICAgICAgICAgICAgICAgICAgICAgMHg1NAogI2RlZmluZSBXTTg5OTRfRENfU0VSVk9fMiAgICAgICAgICAgICAgICAgICAgICAgMHg1NQogI2RlZmluZSBXTTg5OTRfRENfU0VSVk9fNCAgICAgICAgICAgICAgICAgICAgICAgMHg1NwogI2RlZmluZSBXTTg5OTRfRENfU0VSVk9fUkVBREJBQ0sgICAgICAgICAgICAgICAgMHg1OAogI2RlZmluZSBXTTg5OTRfQU5BTE9HVUVfSFBfMSAgICAgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBXTTg5NThfTUlDX0RFVEVDVF8xICAgICAgICAgICAgICAgICAgICAgMHhEMAorI2RlZmluZSBXTTg5NThfTUlDX0RFVEVDVF8yICAgICAgICAgICAgICAgICAgICAgMHhEMQorI2RlZmluZSBXTTg5NThfTUlDX0RFVEVDVF8zICAgICAgICAgICAgICAgICAgICAgMHhEMgogI2RlZmluZSBXTTg5OTRfQ0hJUF9SRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgMHgxMDAKICNkZWZpbmUgV004OTk0X0NPTlRST0xfSU5URVJGQUNFICAgICAgICAgICAgICAgIDB4MTAxCiAjZGVmaW5lIFdNODk5NF9XUklURV9TRVFVRU5DRVJfQ1RSTF8xICAgICAgICAgICAweDExMApAQCAtMTA5LDYgKzExMywxMCBAQAogI2RlZmluZSBXTTg5OTRfQUlGMkRBQ19MUkNMSyAgICAgICAgICAgICAgICAgICAgMHgzMTUKICNkZWZpbmUgV004OTk0X0FJRjJEQUNfREFUQSAgICAgICAgICAgICAgICAgICAgIDB4MzE2CiAjZGVmaW5lIFdNODk5NF9BSUYyQURDX0RBVEEgICAgICAgICAgICAgICAgICAgICAweDMxNworI2RlZmluZSBXTTg5NThfQUlGM19DT05UUk9MXzEgICAgICAgICAgICAgICAgICAgMHgzMjAKKyNkZWZpbmUgV004OTU4X0FJRjNfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgIDB4MzIxCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0RBVEEgICAgICAgICAgICAgICAgICAgICAweDMyMgorI2RlZmluZSBXTTg5NThfQUlGM0FEQ19EQVRBICAgICAgICAgICAgICAgICAgICAgMHgzMjMKICNkZWZpbmUgV004OTk0X0FJRjFfQURDMV9MRUZUX1ZPTFVNRSAgICAgICAgICAgIDB4NDAwCiAjZGVmaW5lIFdNODk5NF9BSUYxX0FEQzFfUklHSFRfVk9MVU1FICAgICAgICAgICAweDQwMQogI2RlZmluZSBXTTg5OTRfQUlGMV9EQUMxX0xFRlRfVk9MVU1FICAgICAgICAgICAgMHg0MDIKQEAgLTI0Miw2ICsyNTAsODMgQEAKICNkZWZpbmUgV004OTk0X0lOVEVSUlVQVF9TVEFUVVNfMl9NQVNLICAgICAgICAgIDB4NzM5CiAjZGVmaW5lIFdNODk5NF9JTlRFUlJVUFRfQ09OVFJPTCAgICAgICAgICAgICAgICAweDc0MAogI2RlZmluZSBXTTg5OTRfSVJRX0RFQk9VTkNFICAgICAgICAgICAgICAgICAgICAgMHg3NDgKKyNkZWZpbmUgV004OTU4X0RTUDJfUFJPR1JBTSAgICAgICAgICAgICAgICAgICAgIDB4OTAwCisjZGVmaW5lIFdNODk1OF9EU1AyX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDkwMQorI2RlZmluZSBXTTg5NThfRFNQMl9NQUdJQ05VTSAgICAgICAgICAgICAgICAgICAgMHhBMDAKKyNkZWZpbmUgV004OTU4X0RTUDJfUkVMRUFTRVlFQVIgICAgICAgICAgICAgICAgIDB4QTAxCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VNT05USERBWSAgICAgICAgICAgICAweEEwMgorI2RlZmluZSBXTTg5NThfRFNQMl9SRUxFQVNFVElNRSAgICAgICAgICAgICAgICAgMHhBMDMKKyNkZWZpbmUgV004OTU4X0RTUDJfVkVSTUFKTUlOICAgICAgICAgICAgICAgICAgIDB4QTA0CisjZGVmaW5lIFdNODk1OF9EU1AyX1ZFUkJVSUxEICAgICAgICAgICAgICAgICAgICAweEEwNQorI2RlZmluZSBXTTg5NThfRFNQMl9FWEVDQ09OVFJPTCAgICAgICAgICAgICAgICAgMHhBMEQKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfTE9XRVJfQ1VUT0ZGX0MxXzEgICAgIDB4MjIwMAorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9MT1dFUl9DVVRPRkZfQzFfMiAgICAgMHgyMjAxCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX0xPV0VSX0NVVE9GRl9DMl8xICAgICAweDIyMDIKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfTE9XRVJfQ1VUT0ZGX0MyXzIgICAgIDB4MjIwMworI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9MT1dFUl9DVVRPRkZfQzNfMSAgICAgMHgyMjA0CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX0xPV0VSX0NVVE9GRl9DM18yICAgICAweDIyMDUKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfVVBQRVJfQ1VUT0ZGX0MyXzEgICAgIDB4MjIwNgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9VUFBFUl9DVVRPRkZfQzJfMiAgICAgMHgyMjA3CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX1VQUEVSX0NVVE9GRl9DM18xICAgICAweDIyMDgKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfVVBQRVJfQ1VUT0ZGX0MzXzIgICAgIDB4MjIwOQorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9VUFBFUl9DVVRPRkZfQzFfMSAgICAgMHgyMjBBCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX1VQUEVSX0NVVE9GRl9DMV8yICAgICAweDIyMEIKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfVVBQRVJfQ1VUT0ZGX0MxXzEgICAgIDB4MjIwQworI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9VUFBFUl9DVVRPRkZfQzFfMiAgICAgMHgyMjBECisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX1VQUEVSX0NVVE9GRl9DMl8xICAgICAweDIyMEUKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfVVBQRVJfQ1VUT0ZGX0MyXzIgICAgIDB4MjIwRgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9VUFBFUl9DVVRPRkZfQzNfMSAgICAgMHgyMjEwCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX1VQUEVSX0NVVE9GRl9DM18yICAgICAweDIyMTEKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfTE9XRVJfQ1VUT0ZGXzEgICAgICAgIDB4MjIxMgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9MT1dFUl9DVVRPRkZfMiAgICAgICAgMHgyMjEzCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX0tfMSAgICAgICAgICAgICAgICAgICAweDI0MDAKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfS18yICAgICAgICAgICAgICAgICAgIDB4MjQwMQorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9OMV8xICAgICAgICAgICAgICAgICAgMHgyNDAyCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX04xXzIgICAgICAgICAgICAgICAgICAweDI0MDMKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfTjJfMSAgICAgICAgICAgICAgICAgIDB4MjQwNAorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9OMl8yICAgICAgICAgICAgICAgICAgMHgyNDA1CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX04zXzEgICAgICAgICAgICAgICAgICAweDI0MDYKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfTjNfMiAgICAgICAgICAgICAgICAgIDB4MjQwNworI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9ONF8xICAgICAgICAgICAgICAgICAgMHgyNDA4CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX040XzIgICAgICAgICAgICAgICAgICAweDI0MDkKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfTjVfMSAgICAgICAgICAgICAgICAgIDB4MjQwQQorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9ONV8yICAgICAgICAgICAgICAgICAgMHgyNDBCCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX1gxXzEgICAgICAgICAgICAgICAgICAweDI0MEMKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfWDFfMiAgICAgICAgICAgICAgICAgIDB4MjQwRAorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9YMl8xICAgICAgICAgICAgICAgICAgMHgyNDBFCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX1gyXzIgICAgICAgICAgICAgICAgICAweDI0MEYKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfWDNfMSAgICAgICAgICAgICAgICAgIDB4MjQxMAorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9YM18yICAgICAgICAgICAgICAgICAgMHgyNDExCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX0FUVEFDS18xICAgICAgICAgICAgICAweDI0MTIKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzFfQVRUQUNLXzIgICAgICAgICAgICAgIDB4MjQxMworI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMV9ERUNBWV8xICAgICAgICAgICAgICAgMHgyNDE0CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8xX0RFQ0FZXzIgICAgICAgICAgICAgICAweDI0MTUKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfS18xICAgICAgICAgICAgICAgICAgIDB4MjQxNgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9LXzIgICAgICAgICAgICAgICAgICAgMHgyNDE3CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX04xXzEgICAgICAgICAgICAgICAgICAweDI0MTgKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfTjFfMiAgICAgICAgICAgICAgICAgIDB4MjQxOQorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9OMl8xICAgICAgICAgICAgICAgICAgMHgyNDFBCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX04yXzIgICAgICAgICAgICAgICAgICAweDI0MUIKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfTjNfMSAgICAgICAgICAgICAgICAgIDB4MjQxQworI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9OM18yICAgICAgICAgICAgICAgICAgMHgyNDFECisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX040XzEgICAgICAgICAgICAgICAgICAweDI0MUUKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfTjRfMiAgICAgICAgICAgICAgICAgIDB4MjQxRgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9ONV8xICAgICAgICAgICAgICAgICAgMHgyNDIwCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX041XzIgICAgICAgICAgICAgICAgICAweDI0MjEKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfWDFfMSAgICAgICAgICAgICAgICAgIDB4MjQyMgorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9YMV8yICAgICAgICAgICAgICAgICAgMHgyNDIzCisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX1gyXzEgICAgICAgICAgICAgICAgICAweDI0MjQKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfWDJfMiAgICAgICAgICAgICAgICAgIDB4MjQyNQorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9YM18xICAgICAgICAgICAgICAgICAgMHgyNDI2CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX1gzXzIgICAgICAgICAgICAgICAgICAweDI0MjcKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfQVRUQUNLXzEgICAgICAgICAgICAgIDB4MjQyOAorI2RlZmluZSBXTTg5NThfTUJDX0JBTkRfMl9BVFRBQ0tfMiAgICAgICAgICAgICAgMHgyNDI5CisjZGVmaW5lIFdNODk1OF9NQkNfQkFORF8yX0RFQ0FZXzEgICAgICAgICAgICAgICAweDI0MkEKKyNkZWZpbmUgV004OTU4X01CQ19CQU5EXzJfREVDQVlfMiAgICAgICAgICAgICAgIDB4MjQyQgorI2RlZmluZSBXTTg5NThfTUJDX0IyX1BHMl8xICAgICAgICAgICAgICAgICAgICAgMHgyNDJDCisjZGVmaW5lIFdNODk1OF9NQkNfQjJfUEcyXzIgICAgICAgICAgICAgICAgICAgICAweDI0MkQKKyNkZWZpbmUgV004OTU4X01CQ19CMV9QRzJfMSAgICAgICAgICAgICAgICAgICAgIDB4MjQyRQorI2RlZmluZSBXTTg5NThfTUJDX0IxX1BHMl8yICAgICAgICAgICAgICAgICAgICAgMHgyNDJGCiAjZGVmaW5lIFdNODk5NF9XUklURV9TRVFVRU5DRVJfMCAgICAgICAgICAgICAgICAweDMwMDAKICNkZWZpbmUgV004OTk0X1dSSVRFX1NFUVVFTkNFUl8xICAgICAgICAgICAgICAgIDB4MzAwMQogI2RlZmluZSBXTTg5OTRfV1JJVEVfU0VRVUVOQ0VSXzIgICAgICAgICAgICAgICAgMHgzMDAyCkBAIC05OTIsNiArMTA3NywxMiBAQAogLyoKICAqIFI2ICgweDA2KSAtIFBvd2VyIE1hbmFnZW1lbnQgKDYpCiAgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDYwMCAgLyogQUlGM0FEQ19TUkMgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgOSAgLyogQUlGM0FEQ19TUkMgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGM0FEQ19TUkMgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjJEQUNfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDE4MCAgLyogQUlGMkRBQ19TUkMgLSBbODo3XSAqLworI2RlZmluZSBXTTg5NThfQUlGMkRBQ19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICA3ICAvKiBBSUYyREFDX1NSQyAtIFs4OjddICovCisjZGVmaW5lIFdNODk1OF9BSUYyREFDX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjJEQUNfU1JDIC0gWzg6N10gKi8KICNkZWZpbmUgV004OTk0X0FJRjNfVFJJICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19UUkkgKi8KICNkZWZpbmUgV004OTk0X0FJRjNfVFJJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogQUlGM19UUkkgKi8KICNkZWZpbmUgV004OTk0X0FJRjNfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQUlGM19UUkkgKi8KQEAgLTE4MzYsNiArMTkyNywxNCBAQAogI2RlZmluZSBXTTg5OTRfQ1BfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDUF9FTkEgKi8KIAogLyoKKyAqIFI3NyAoMHg0RCkgLSBDaGFyZ2UgUHVtcCAoMikKKyAqLworI2RlZmluZSBXTTg5NThfQ1BfRElTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDUF9ESVNDSCAqLworI2RlZmluZSBXTTg5NThfQ1BfRElTQ0hfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDUF9ESVNDSCAqLworI2RlZmluZSBXTTg5NThfQ1BfRElTQ0hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBDUF9ESVNDSCAqLworI2RlZmluZSBXTTg5NThfQ1BfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDUF9ESVNDSCAqLworCisvKgogICogUjgxICgweDUxKSAtIENsYXNzIFcgKDEpCiAgKi8KICNkZWZpbmUgV004OTk0X0NQX0RZTl9TUkNfU0VMX01BU0sgICAgICAgICAgICAgIDB4MDMwMCAgLyogQ1BfRFlOX1NSQ19TRUwgLSBbOTo4XSAqLwpAQCAtMTk1Miw2ICsyMDUxLDQ2IEBACiAjZGVmaW5lIFdNODk5NF9IUE9VVDFSX0RMWV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEhQT1VUMVJfRExZICovCiAKIC8qCisgKiBSMjA4ICgweEQwKSAtIE1pYyBEZXRlY3QgMQorICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0JJQVNfU1RBUlRUSU1FX01BU0sgICAgICAgICAweEYwMDAgIC8qIE1JQ0RfQklBU19TVEFSVFRJTUUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0JJQVNfU1RBUlRUSU1FX1NISUZUICAgICAgICAgICAgMTIgIC8qIE1JQ0RfQklBU19TVEFSVFRJTUUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0JJQVNfU1RBUlRUSU1FX1dJRFRIICAgICAgICAgICAgIDQgIC8qIE1JQ0RfQklBU19TVEFSVFRJTUUgLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAweDBGMDAgIC8qIE1JQ0RfUkFURSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5NThfTUlDRF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBNSUNEX1JBVEUgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTUlDRF9SQVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0RCVElNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0RfREJUSU1FICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0RCVElNRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0RfREJUSU1FICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0RCVElNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfREJUSU1FICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0RCVElNRV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfREJUSU1FICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0RfRU5BICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1JQ0RfRU5BICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0RfRU5BICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfRU5BICovCisKKy8qCisgKiBSMjA5ICgweEQxKSAtIE1pYyBEZXRlY3QgMgorICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9TRUxfTUFTSyAgICAgICAgICAgICAgICAweDAwRkYgIC8qIE1JQ0RfTFZMX1NFTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAgIC8qIE1JQ0RfTFZMX1NFTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgIDggIC8qIE1JQ0RfTFZMX1NFTCAtIFs3OjBdICovCisKKy8qCisgKiBSMjEwICgweEQyKSAtIE1pYyBEZXRlY3QgMworICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDA3RkMgIC8qIE1JQ0RfTFZMIC0gWzEwOjJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1JQ0RfTFZMIC0gWzEwOjJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDkgIC8qIE1JQ0RfTFZMIC0gWzEwOjJdICovCisjZGVmaW5lIFdNODk1OF9NSUNEX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfVkFMSURfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5NThfTUlDRF9WQUxJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNSUNEX1ZBTElEICovCisjZGVmaW5lIFdNODk1OF9NSUNEX1ZBTElEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfU1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDRF9TVFMgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfU1RTX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTUlDRF9TVFMgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUlDRF9TVFMgKi8KKyNkZWZpbmUgV004OTU4X01JQ0RfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTUlDRF9TVFMgKi8KKworLyoKICAqIFIyNTYgKDB4MTAwKSAtIENoaXAgUmV2aXNpb24KICAqLwogI2RlZmluZSBXTTg5OTRfQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBDSElQX1JFViAtIFszOjBdICovCkBAIC0yMDY5LDYgKzIyMDgsMTQgQEAKIC8qCiAgKiBSNTIwICgweDIwOCkgLSBDbG9ja2luZyAoMSkKICAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19FTkEgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEU1AyQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBEU1AyQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBEU1AyQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1AyQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19TUkMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBEU1AyQ0xLX1NSQyAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBEU1AyQ0xLX1NSQyAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEyICAvKiBEU1AyQ0xLX1NSQyAqLworI2RlZmluZSBXTTg5NThfRFNQMkNMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1AyQ0xLX1NSQyAqLwogI2RlZmluZSBXTTg5OTRfVE9DTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBUT0NMS19FTkEgKi8KICNkZWZpbmUgV004OTk0X1RPQ0xLX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogVE9DTEtfRU5BICovCiAjZGVmaW5lIFdNODk5NF9UT0NMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIFRPQ0xLX0VOQSAqLwpAQCAtMjU1Myw2ICsyNzAwLDYzIEBACiAjZGVmaW5lIFdNODk5NF9BSUYyQURDUl9EQVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEgIC8qIEFJRjJBRENSX0RBVF9JTlYgKi8KIAogLyoKKyAqIFI4MDAgKDB4MzIwKSAtIEFJRjMgQ29udHJvbCAoMSkKKyAqLworI2RlZmluZSBXTTg5NThfQUlGM19MUkNMS19JTlYgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYzX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM19MUkNMS19JTlZfTUFTSyAgICAgICAgICAgICAgMHgwMDgwICAvKiBBSUYzX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM19MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICA3ICAvKiBBSUYzX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM19MUkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAxICAvKiBBSUYzX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM19XTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBBSUYzX1dMIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTU4X0FJRjNfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogQUlGM19XTCAtIFs2OjVdICovCisjZGVmaW5lIFdNODk1OF9BSUYzX1dMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5NThfQUlGM19GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDE4ICAvKiBBSUYzX0ZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk1OF9BSUYzX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFJRjNfRk1UIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTU4X0FJRjNfRk1UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGM19GTVQgLSBbNDozXSAqLworCisvKgorICogUjgwMSAoMHgzMjEpIC0gQUlGMyBDb250cm9sICgyKQorICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0JPT1NUX01BU0sgICAgICAgICAgICAgICAweDBDMDAgIC8qIEFJRjNEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0JPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgMTAgIC8qIEFJRjNEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgIDIgIC8qIEFJRjNEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0NPTVAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFJRjNEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5NThfQUlGM0RBQ19DT01QX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBBSUYzREFDX0NPTVAgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNEQUNfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgNCAgLyogQUlGM0RBQ19DT01QICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5NThfQUlGM0RBQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBSUYzREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0NPTVBNT0RFX01BU0sgICAgICAgICAgICAweDAwMDggIC8qIEFJRjNEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNEQUNfQ09NUE1PREVfU0hJRlQgICAgICAgICAgICAgICAgMyAgLyogQUlGM0RBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5NThfQUlGM0RBQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYzREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk1OF9BSUYzQURDX0NPTVAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFJRjNBRENfQ09NUCAqLworI2RlZmluZSBXTTg5NThfQUlGM0FEQ19DT01QX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBBSUYzQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgMiAgLyogQUlGM0FEQ19DT01QICovCisjZGVmaW5lIFdNODk1OF9BSUYzQURDX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNBRENfQ09NUCAqLworI2RlZmluZSBXTTg5NThfQUlGM0FEQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBBSUYzQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk1OF9BSUYzQURDX0NPTVBNT0RFX01BU0sgICAgICAgICAgICAweDAwMDIgIC8qIEFJRjNBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfQ09NUE1PREVfU0hJRlQgICAgICAgICAgICAgICAgMSAgLyogQUlGM0FEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5NThfQUlGM0FEQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxICAvKiBBSUYzQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk1OF9BSUYzX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjNfTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNfTE9PUEJBQ0tfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGM19MT09QQkFDSyAqLworI2RlZmluZSBXTTg5NThfQUlGM19MT09QQkFDS19TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBBSUYzX0xPT1BCQUNLICovCisjZGVmaW5lIFdNODk1OF9BSUYzX0xPT1BCQUNLX1dJRFRIICAgICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNfTE9PUEJBQ0sgKi8KKworLyoKKyAqIFI4MDIgKDB4MzIyKSAtIEFJRjNEQUMgRGF0YQorICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0RBVF9JTlYgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjNEQUNfREFUX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM0RBQ19EQVRfSU5WX01BU0sgICAgICAgICAgICAgMHgwMDAxICAvKiBBSUYzREFDX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNEQUNfREFUX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgMCAgLyogQUlGM0RBQ19EQVRfSU5WICovCisjZGVmaW5lIFdNODk1OF9BSUYzREFDX0RBVF9JTlZfV0lEVEggICAgICAgICAgICAgICAgIDEgIC8qIEFJRjNEQUNfREFUX0lOViAqLworCisvKgorICogUjgwMyAoMHgzMjMpIC0gQUlGM0FEQyBEYXRhCisgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfREFUX0lOViAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQUlGM0FEQ19EQVRfSU5WICovCisjZGVmaW5lIFdNODk1OF9BSUYzQURDX0RBVF9JTlZfTUFTSyAgICAgICAgICAgICAweDAwMDEgIC8qIEFJRjNBRENfREFUX0lOViAqLworI2RlZmluZSBXTTg5NThfQUlGM0FEQ19EQVRfSU5WX1NISUZUICAgICAgICAgICAgICAgICAwICAvKiBBSUYzQURDX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTU4X0FJRjNBRENfREFUX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgMSAgLyogQUlGM0FEQ19EQVRfSU5WICovCisKKy8qCiAgKiBSMTAyNCAoMHg0MDApIC0gQUlGMSBBREMxIExlZnQgVm9sdW1lCiAgKi8KICNkZWZpbmUgV004OTk0X0FJRjFBREMxX1ZVICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogQUlGMUFEQzFfVlUgKi8KQEAgLTQyODksNCArNDQ5MywxMDIgQEAKICNkZWZpbmUgV004OTk0X1RFTVBfU0hVVF9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgMCAgLyogVEVNUF9TSFVUX0RCICovCiAjZGVmaW5lIFdNODk5NF9URU1QX1NIVVRfREJfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIFRFTVBfU0hVVF9EQiAqLwogCisvKgorICogUjIzMDQgKDB4OTAwKSAtIERTUDJfUHJvZ3JhbQorICovCisjZGVmaW5lIFdNODk1OF9EU1AyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERTUDJfRU5BICovCisjZGVmaW5lIFdNODk1OF9EU1AyX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIERTUDJfRU5BICovCisjZGVmaW5lIFdNODk1OF9EU1AyX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfRU5BICovCisjZGVmaW5lIFdNODk1OF9EU1AyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUDJfRU5BICovCisKKy8qCisgKiBSMjMwNSAoMHg5MDEpIC0gRFNQMl9Db25maWcKKyAqLworI2RlZmluZSBXTTg5NThfTUJDX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDMwICAvKiBNQkNfU0VMIC0gWzU6NF0gKi8KKyNkZWZpbmUgV004OTU4X01CQ19TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogTUJDX1NFTCAtIFs1OjRdICovCisjZGVmaW5lIFdNODk1OF9NQkNfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1CQ19TRUwgLSBbNTo0XSAqLworI2RlZmluZSBXTTg5NThfTUJDX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQkNfRU5BICovCisjZGVmaW5lIFdNODk1OF9NQkNfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE1CQ19FTkEgKi8KKyNkZWZpbmUgV004OTU4X01CQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTUJDX0VOQSAqLworI2RlZmluZSBXTTg5NThfTUJDX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBNQkNfRU5BICovCisKKy8qCisgKiBSMjU2MCAoMHhBMDApIC0gRFNQMl9NYWdpY051bQorICovCisjZGVmaW5lIFdNODk1OF9EU1AyX01BR0lDX05VTV9NQVNLICAgICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfTUFHSUNfTlVNIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX01BR0lDX05VTV9TSElGVCAgICAgICAgICAgICAgICAgIDAgIC8qIERTUDJfTUFHSUNfTlVNIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX01BR0lDX05VTV9XSURUSCAgICAgICAgICAgICAgICAgMTYgIC8qIERTUDJfTUFHSUNfTlVNIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjU2MSAoMHhBMDEpIC0gRFNQMl9SZWxlYXNlWWVhcgorICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfWUVBUl9NQVNLICAgICAgICAgICAweEZGRkYgIC8qIERTUDJfUkVMRUFTRV9ZRUFSIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfWUVBUl9TSElGVCAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUkVMRUFTRV9ZRUFSIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfWUVBUl9XSURUSCAgICAgICAgICAgICAgMTYgIC8qIERTUDJfUkVMRUFTRV9ZRUFSIC0gWzE1OjBdICovCisKKy8qCisgKiBSMjU2MiAoMHhBMDIpIC0gRFNQMl9SZWxlYXNlTW9udGhEYXkKKyAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SRUxFQVNFX01PTlRIX01BU0sgICAgICAgICAgMHhGRjAwICAvKiBEU1AyX1JFTEVBU0VfTU9OVEggLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfUkVMRUFTRV9NT05USF9TSElGVCAgICAgICAgICAgICAgOCAgLyogRFNQMl9SRUxFQVNFX01PTlRIIC0gWzE1OjhdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfTU9OVEhfV0lEVEggICAgICAgICAgICAgIDggIC8qIERTUDJfUkVMRUFTRV9NT05USCAtIFsxNTo4XSAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SRUxFQVNFX0RBWV9NQVNLICAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX1JFTEVBU0VfREFZIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfUkVMRUFTRV9EQVlfU0hJRlQgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9SRUxFQVNFX0RBWSAtIFs3OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfREFZX1dJRFRIICAgICAgICAgICAgICAgIDggIC8qIERTUDJfUkVMRUFTRV9EQVkgLSBbNzowXSAqLworCisvKgorICogUjI1NjMgKDB4QTAzKSAtIERTUDJfUmVsZWFzZVRpbWUKKyAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SRUxFQVNFX0hPVVJTX01BU0sgICAgICAgICAgMHhGRjAwICAvKiBEU1AyX1JFTEVBU0VfSE9VUlMgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfUkVMRUFTRV9IT1VSU19TSElGVCAgICAgICAgICAgICAgOCAgLyogRFNQMl9SRUxFQVNFX0hPVVJTIC0gWzE1OjhdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfSE9VUlNfV0lEVEggICAgICAgICAgICAgIDggIC8qIERTUDJfUkVMRUFTRV9IT1VSUyAtIFsxNTo4XSAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SRUxFQVNFX01JTlNfTUFTSyAgICAgICAgICAgMHgwMEZGICAvKiBEU1AyX1JFTEVBU0VfTUlOUyAtIFs3OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JFTEVBU0VfTUlOU19TSElGVCAgICAgICAgICAgICAgIDAgIC8qIERTUDJfUkVMRUFTRV9NSU5TIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfUkVMRUFTRV9NSU5TX1dJRFRIICAgICAgICAgICAgICAgOCAgLyogRFNQMl9SRUxFQVNFX01JTlMgLSBbNzowXSAqLworCisvKgorICogUjI1NjQgKDB4QTA0KSAtIERTUDJfVmVyTWFqTWluCisgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfTUFKT1JfVkVSX01BU0sgICAgICAgICAgICAgIDB4RkYwMCAgLyogRFNQMl9NQUpPUl9WRVIgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfTUFKT1JfVkVSX1NISUZUICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9NQUpPUl9WRVIgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfTUFKT1JfVkVSX1dJRFRIICAgICAgICAgICAgICAgICAgOCAgLyogRFNQMl9NQUpPUl9WRVIgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfTUlOT1JfVkVSX01BU0sgICAgICAgICAgICAgIDB4MDBGRiAgLyogRFNQMl9NSU5PUl9WRVIgLSBbNzowXSAqLworI2RlZmluZSBXTTg5NThfRFNQMl9NSU5PUl9WRVJfU0hJRlQgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX01JTk9SX1ZFUiAtIFs3OjBdICovCisjZGVmaW5lIFdNODk1OF9EU1AyX01JTk9SX1ZFUl9XSURUSCAgICAgICAgICAgICAgICAgIDggIC8qIERTUDJfTUlOT1JfVkVSIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNTY1ICgweEEwNSkgLSBEU1AyX1ZlckJ1aWxkCisgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfQlVJTERfVkVSX01BU0sgICAgICAgICAgICAgIDB4RkZGRiAgLyogRFNQMl9CVUlMRF9WRVIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfQlVJTERfVkVSX1NISUZUICAgICAgICAgICAgICAgICAgMCAgLyogRFNQMl9CVUlMRF9WRVIgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfQlVJTERfVkVSX1dJRFRIICAgICAgICAgICAgICAgICAxNiAgLyogRFNQMl9CVUlMRF9WRVIgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIyNTczICgweEEwRCkgLSBEU1AyX0V4ZWNDb250cm9sCisgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUEMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogRFNQMl9TVE9QQyAqLworI2RlZmluZSBXTTg5NThfRFNQMl9TVE9QQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiBEU1AyX1NUT1BDICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1NUT1BDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIERTUDJfU1RPUEMgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUENfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQMl9TVE9QQyAqLworI2RlZmluZSBXTTg5NThfRFNQMl9TVE9QUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBEU1AyX1NUT1BTICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1NUT1BTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIERTUDJfU1RPUFMgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNCAgLyogRFNQMl9TVE9QUyAqLworI2RlZmluZSBXTTg5NThfRFNQMl9TVE9QU19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1AyX1NUT1BTICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1NUT1BJICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIERTUDJfU1RPUEkgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUElfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogRFNQMl9TVE9QSSAqLworI2RlZmluZSBXTTg5NThfRFNQMl9TVE9QSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAzICAvKiBEU1AyX1NUT1BJICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1NUT1BJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUDJfU1RPUEkgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRFNQMl9TVE9QICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1NUT1BfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIERTUDJfU1RPUCAqLworI2RlZmluZSBXTTg5NThfRFNQMl9TVE9QX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBEU1AyX1NUT1AgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfU1RPUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQMl9TVE9QICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JVTlIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIERTUDJfUlVOUiAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SVU5SX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBEU1AyX1JVTlIgKi8KKyNkZWZpbmUgV004OTU4X0RTUDJfUlVOUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRFNQMl9SVU5SICovCisjZGVmaW5lIFdNODk1OF9EU1AyX1JVTlJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERTUDJfUlVOUiAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1AyX1JVTiAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SVU5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBEU1AyX1JVTiAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SVU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBEU1AyX1JVTiAqLworI2RlZmluZSBXTTg5NThfRFNQMl9SVU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBEU1AyX1JVTiAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKaW5kZXggMDg1NTI3Zi4uZTM5YWVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taWdyYXRlLmgKQEAgLTEzLDkgKzEzLDExIEBACiBleHRlcm4gaW50IG1pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAogCQkJc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAotCQkJdW5zaWduZWQgbG9uZyBwcml2YXRlLCBpbnQgb2ZmbGluaW5nKTsKKwkJCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgYm9vbCBvZmZsaW5pbmcsCisJCQlib29sIHN5bmMpOwogZXh0ZXJuIGludCBtaWdyYXRlX2h1Z2VfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAotCQkJdW5zaWduZWQgbG9uZyBwcml2YXRlLCBpbnQgb2ZmbGluaW5nKTsKKwkJCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgYm9vbCBvZmZsaW5pbmcsCisJCQlib29sIHN5bmMpOwogCiBleHRlcm4gaW50IGZhaWxfbWlncmF0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosCiAJCQlzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKQEAgLTMzLDkgKzM1LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKSB7fQogc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsLCBuZXdfcGFnZV90IHgsCi0JCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50IG9mZmxpbmluZykgeyByZXR1cm4gLUVOT1NZUzsgfQorCQl1bnNpZ25lZCBsb25nIHByaXZhdGUsIGJvb2wgb2ZmbGluaW5nLAorCQlib29sIHN5bmMpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIHN0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfaHVnZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsLCBuZXdfcGFnZV90IHgsCi0JCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50IG9mZmxpbmluZykgeyByZXR1cm4gLUVOT1NZUzsgfQorCQl1bnNpZ25lZCBsb25nIHByaXZhdGUsIGJvb2wgb2ZmbGluaW5nLAorCQlib29sIHN5bmMpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIAogc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wcmVwKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIHN0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfcHJlcF9sb2NhbCh2b2lkKSB7IHJldHVybiAtRU5PU1lTOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggNzIxZjQ1MS4uOTU2YTM1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KIAogc3RydWN0IG1lbXBvbGljeTsKIHN0cnVjdCBhbm9uX3ZtYTsKQEAgLTgyLDYgKzgzLDcgQEAKICNkZWZpbmUgVk1fR1JPV1NVUAkweDAwMDAwMjAwCiAjZWxzZQogI2RlZmluZSBWTV9HUk9XU1VQCTB4MDAwMDAwMDAKKyNkZWZpbmUgVk1fTk9IVUdFUEFHRQkweDAwMDAwMjAwCS8qIE1BRFZfTk9IVUdFUEFHRSBtYXJrZWQgdGhpcyB2bWEgKi8KICNlbmRpZgogI2RlZmluZSBWTV9QRk5NQVAJMHgwMDAwMDQwMAkvKiBQYWdlLXJhbmdlcyBtYW5hZ2VkIHdpdGhvdXQgInN0cnVjdCBwYWdlIiwganVzdCBwdXJlIFBGTiAqLwogI2RlZmluZSBWTV9ERU5ZV1JJVEUJMHgwMDAwMDgwMAkvKiBFVFhUQlNZIG9uIHdyaXRlIGF0dGVtcHRzLi4gKi8KQEAgLTEwMSw3ICsxMDMsMTEgQEAKICNkZWZpbmUgVk1fTk9SRVNFUlZFCTB4MDAyMDAwMDAJLyogc2hvdWxkIHRoZSBWTSBzdXBwcmVzcyBhY2NvdW50aW5nICovCiAjZGVmaW5lIFZNX0hVR0VUTEIJMHgwMDQwMDAwMAkvKiBIdWdlIFRMQiBQYWdlIFZNICovCiAjZGVmaW5lIFZNX05PTkxJTkVBUgkweDAwODAwMDAwCS8qIElzIG5vbi1saW5lYXIgKHJlbWFwX2ZpbGVfcGFnZXMpICovCisjaWZuZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQogI2RlZmluZSBWTV9NQVBQRURfQ09QWQkweDAxMDAwMDAwCS8qIFQgaWYgbWFwcGVkIGNvcHkgb2YgZGF0YSAobm9tbXUgbW1hcCkgKi8KKyNlbHNlCisjZGVmaW5lIFZNX0hVR0VQQUdFCTB4MDEwMDAwMDAJLyogTUFEVl9IVUdFUEFHRSBtYXJrZWQgdGhpcyB2bWEgKi8KKyNlbmRpZgogI2RlZmluZSBWTV9JTlNFUlRQQUdFCTB4MDIwMDAwMDAJLyogVGhlIHZtYSBoYXMgaGFkICJ2bV9pbnNlcnRfcGFnZSgpIiBkb25lIG9uIGl0ICovCiAjZGVmaW5lIFZNX0FMV0FZU0RVTVAJMHgwNDAwMDAwMAkvKiBBbHdheXMgaW5jbHVkZSBpbiBjb3JlIGR1bXBzICovCiAKQEAgLTI0Miw2ICsyNDgsNyBAQAogICogZmlsZXMgd2hpY2ggbmVlZCBpdCAoMTE5IG9mIHRoZW0pCiAgKi8KICNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZV9tbS5oPgogCiAvKgogICogTWV0aG9kcyB0byBtb2RpZnkgdGhlIHBhZ2UgdXNhZ2UgY291bnQuCkBAIC0zMDUsNiArMzEyLDM5IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSB2b2lkIGNvbXBvdW5kX2xvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJYml0X3NwaW5fbG9jayhQR19jb21wb3VuZF9sb2NrLCAmcGFnZS0+ZmxhZ3MpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wb3VuZF91bmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJYml0X3NwaW5fdW5sb2NrKFBHX2NvbXBvdW5kX2xvY2ssICZwYWdlLT5mbGFncyk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGZsYWdzKTsKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY29tcG91bmRfbG9jayhwYWdlKTsKKyNlbmRpZgorCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCWNvbXBvdW5kX3VubG9jayhwYWdlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqY29tcG91bmRfaGVhZChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAodW5saWtlbHkoUGFnZVRhaWwocGFnZSkpKQpAQCAtMzE5LDkgKzM1OSwyOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcGFnZSA9IGNvbXBvdW5kX2hlYWQocGFnZSk7Ci0JVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5fY291bnQpID09IDApOworCS8qCisJICogR2V0dGluZyBhIG5vcm1hbCBwYWdlIG9yIHRoZSBoZWFkIG9mIGEgY29tcG91bmQgcGFnZQorCSAqIHJlcXVpcmVzIHRvIGFscmVhZHkgaGF2ZSBhbiBlbGV2YXRlZCBwYWdlLT5fY291bnQuIE9ubHkgaWYKKwkgKiB3ZSdyZSBnZXR0aW5nIGEgdGFpbCBwYWdlLCB0aGUgZWxldmF0ZWQgcGFnZS0+X2NvdW50IGlzCisJICogcmVxdWlyZWQgb25seSBpbiB0aGUgaGVhZCBwYWdlLCBzbyBmb3IgdGFpbCBwYWdlcyB0aGUKKwkgKiBidWdjaGVjayBvbmx5IHZlcmlmaWVzIHRoYXQgdGhlIHBhZ2UtPl9jb3VudCBpc24ndAorCSAqIG5lZ2F0aXZlLgorCSAqLworCVZNX0JVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSA8ICFQYWdlVGFpbChwYWdlKSk7CiAJYXRvbWljX2luYygmcGFnZS0+X2NvdW50KTsKKwkvKgorCSAqIEdldHRpbmcgYSB0YWlsIHBhZ2Ugd2lsbCBlbGV2YXRlIGJvdGggdGhlIGhlYWQgYW5kIHRhaWwKKwkgKiBwYWdlLT5fY291bnQocykuCisJICovCisJaWYgKHVubGlrZWx5KFBhZ2VUYWlsKHBhZ2UpKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIHNhZmUgb25seSBiZWNhdXNlCisJCSAqIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IGNhbid0IHJ1biB1bmRlcgorCQkgKiBnZXRfcGFnZSgpLgorCQkgKi8KKwkJVk1fQlVHX09OKGF0b21pY19yZWFkKCZwYWdlLT5maXJzdF9wYWdlLT5fY291bnQpIDw9IDApOworCQlhdG9taWNfaW5jKCZwYWdlLT5maXJzdF9wYWdlLT5fY291bnQpOworCX0KIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqdmlydF90b19oZWFkX3BhZ2UoY29uc3Qgdm9pZCAqeCkKQEAgLTMzOSw2ICszOTksMjcgQEAKIAlhdG9taWNfc2V0KCZwYWdlLT5fY291bnQsIDEpOwogfQogCisvKgorICogUGFnZUJ1ZGR5KCkgaW5kaWNhdGUgdGhhdCB0aGUgcGFnZSBpcyBmcmVlIGFuZCBpbiB0aGUgYnVkZHkgc3lzdGVtCisgKiAoc2VlIG1tL3BhZ2VfYWxsb2MuYykuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VCdWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgPT0gLTI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX1NldFBhZ2VCdWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgIT0gLTEpOworCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgLTIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19DbGVhclBhZ2VCdWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9CVUdfT04oIVBhZ2VCdWRkeShwYWdlKSk7CisJYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCAtMSk7Cit9CisKIHZvaWQgcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogdm9pZCBwdXRfcGFnZXNfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcyk7CiAKQEAgLTM3MCwxMiArNDUxLDM5IEBACiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKXBhZ2VbMV0ubHJ1LnByZXY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBvdW5kX3RyYW5zX29yZGVyKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFQYWdlSGVhZChwYWdlKSkKKwkJcmV0dXJuIDA7CisKKwlmbGFncyA9IGNvbXBvdW5kX2xvY2tfaXJxc2F2ZShwYWdlKTsKKwlvcmRlciA9IGNvbXBvdW5kX29yZGVyKHBhZ2UpOworCWNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHBhZ2UsIGZsYWdzKTsKKwlyZXR1cm4gb3JkZXI7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY29tcG91bmRfb3JkZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb3JkZXIpCiB7CiAJcGFnZVsxXS5scnUucHJldiA9ICh2b2lkICopb3JkZXI7CiB9CiAKIC8qCisgKiBEbyBwdGVfbWt3cml0ZSwgYnV0IG9ubHkgaWYgdGhlIHZtYSBzYXlzIFZNX1dSSVRFLiAgV2UgZG8gdGhpcyB3aGVuCisgKiBzZXJ2aWNpbmcgZmF1bHRzIGZvciB3cml0ZSBhY2Nlc3MuICBJbiB0aGUgbm9ybWFsIGNhc2UsIGRvIGFsd2F5cyB3YW50CisgKiBwdGVfbWt3cml0ZS4gIEJ1dCBnZXRfdXNlcl9wYWdlcyBjYW4gY2F1c2Ugd3JpdGUgZmF1bHRzIGZvciBtYXBwaW5ncworICogdGhhdCBkbyBub3QgaGF2ZSB3cml0aW5nIGVuYWJsZWQsIHdoZW4gdXNlZCBieSBhY2Nlc3NfcHJvY2Vzc192bS4KKyAqLworc3RhdGljIGlubGluZSBwdGVfdCBtYXliZV9ta3dyaXRlKHB0ZV90IHB0ZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaWYgKGxpa2VseSh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOworCXJldHVybiBwdGU7Cit9CisKKy8qCiAgKiBNdWx0aXBsZSBwcm9jZXNzZXMgbWF5ICJzZWUiIHRoZSBzYW1lIHBhZ2UuIEUuZy4gZm9yIHVudG91Y2hlZAogICogbWFwcGluZ3Mgb2YgL2Rldi9udWxsLCBhbGwgcHJvY2Vzc2VzIHNlZSB0aGUgc2FtZSBwYWdlIGZ1bGwgb2YKICAqIHplcm9lcywgYW5kIHRleHQgcGFnZXMgb2YgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgaGF2ZQpAQCAtNjU3LDcgKzc2NSw3IEBACiAJVk1fQlVHX09OKFBhZ2VTbGFiKHBhZ2UpKTsKIAlpZiAodW5saWtlbHkoUGFnZVN3YXBDYWNoZShwYWdlKSkpCiAJCW1hcHBpbmcgPSAmc3dhcHBlcl9zcGFjZTsKLQllbHNlIGlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZyltYXBwaW5nICYgUEFHRV9NQVBQSU5HX0FOT04pKQorCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKW1hcHBpbmcgJiBQQUdFX01BUFBJTkdfQU5PTikKIAkJbWFwcGluZyA9IE5VTEw7CiAJcmV0dXJuIG1hcHBpbmc7CiB9CkBAIC0xMDY0LDcgKzExNzIsOCBAQAogaW50IF9fcG1kX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogI2VuZGlmCiAKLWludCBfX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKK2ludCBfX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiBpbnQgX19wdGVfYWxsb2Nfa2VybmVsKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiAKIC8qCkBAIC0xMTMzLDE2ICsxMjQyLDE4IEBACiAJcHRlX3VubWFwKHB0ZSk7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgYWRkcmVzcykJCQlcCi0JKCh1bmxpa2VseSghcG1kX3ByZXNlbnQoKihwbWQpKSkgJiYgX19wdGVfYWxsb2MobW0sIHBtZCwgYWRkcmVzcykpPyBcCi0JCU5VTEw6IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcykpCisjZGVmaW5lIHB0ZV9hbGxvY19tYXAobW0sIHZtYSwgcG1kLCBhZGRyZXNzKQkJCQlcCisJKCh1bmxpa2VseShwbWRfbm9uZSgqKHBtZCkpKSAmJiBfX3B0ZV9hbGxvYyhtbSwgdm1hLAlcCisJCQkJCQkJcG1kLCBhZGRyZXNzKSk/CVwKKwkgTlVMTDogcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKSkKIAogI2RlZmluZSBwdGVfYWxsb2NfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgcHRscCkJXAotCSgodW5saWtlbHkoIXBtZF9wcmVzZW50KCoocG1kKSkpICYmIF9fcHRlX2FsbG9jKG1tLCBwbWQsIGFkZHJlc3MpKT8gXAorCSgodW5saWtlbHkocG1kX25vbmUoKihwbWQpKSkgJiYgX19wdGVfYWxsb2MobW0sIE5VTEwsCVwKKwkJCQkJCQlwbWQsIGFkZHJlc3MpKT8JXAogCQlOVUxMOiBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsIHB0bHApKQogCiAjZGVmaW5lIHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyZXNzKQkJCVwKLQkoKHVubGlrZWx5KCFwbWRfcHJlc2VudCgqKHBtZCkpKSAmJiBfX3B0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyZXNzKSk/IFwKKwkoKHVubGlrZWx5KHBtZF9ub25lKCoocG1kKSkpICYmIF9fcHRlX2FsbG9jX2tlcm5lbChwbWQsIGFkZHJlc3MpKT8gXAogCQlOVUxMOiBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpKQogCiBleHRlcm4gdm9pZCBmcmVlX2FyZWFfaW5pdCh1bnNpZ25lZCBsb25nICogem9uZXNfc2l6ZSk7CkBAIC0xNDE1LDYgKzE1MjYsOCBAQAogI2RlZmluZSBGT0xMX0dFVAkweDA0CS8qIGRvIGdldF9wYWdlIG9uIHBhZ2UgKi8KICNkZWZpbmUgRk9MTF9EVU1QCTB4MDgJLyogZ2l2ZSBlcnJvciBvbiBob2xlIGlmIGl0IHdvdWxkIGJlIHplcm8gKi8KICNkZWZpbmUgRk9MTF9GT1JDRQkweDEwCS8qIGdldF91c2VyX3BhZ2VzIHJlYWQvd3JpdGUgdy9vIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgRk9MTF9NTE9DSwkweDQwCS8qIG1hcmsgcGFnZSBhcyBtbG9ja2VkICovCisjZGVmaW5lIEZPTExfU1BMSVQJMHg4MAkvKiBkb24ndCByZXR1cm4gdHJhbnNodWdlIHBhZ2VzLCBzcGxpdCB0aGVtICovCiAKIHR5cGVkZWYgaW50ICgqcHRlX2ZuX3QpKHB0ZV90ICpwdGUsIHBndGFibGVfdCB0b2tlbiwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJdm9pZCAqZGF0YSk7CkBAIC0xNTE4LDUgKzE2MzEsMTQgQEAKIAogZXh0ZXJuIHZvaWQgZHVtcF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSB8fCBkZWZpbmVkKENPTkZJR19IVUdFVExCRlMpCitleHRlcm4gdm9pZCBjbGVhcl9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgIHVuc2lnbmVkIGludCBwYWdlc19wZXJfaHVnZV9wYWdlKTsKK2V4dGVybiB2b2lkIGNvcHlfdXNlcl9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYywKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGludCBwYWdlc19wZXJfaHVnZV9wYWdlKTsKKyNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgfHwgQ09ORklHX0hVR0VUTEJGUyAqLworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9NTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oIGIvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAppbmRleCA4ODM1Yjg3Li44ZjdkMjQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIExJTlVYX01NX0lOTElORV9ICiAjZGVmaW5lIExJTlVYX01NX0lOTElORV9ICiAKKyNpbmNsdWRlIDxsaW51eC9odWdlX21tLmg+CisKIC8qKgogICogcGFnZV9pc19maWxlX2NhY2hlIC0gc2hvdWxkIHRoZSBwYWdlIGJlIG9uIGEgZmlsZSBMUlUgb3IgYW5vbiBMUlU/CiAgKiBAcGFnZTogdGhlIHBhZ2UgdG8gdGVzdApAQCAtMjAsMTggKzIyLDI1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAorX19hZGRfcGFnZV90b19scnVfbGlzdChzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbCwKKwkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJbGlzdF9hZGQoJnBhZ2UtPmxydSwgaGVhZCk7CisJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCwgaHBhZ2VfbnJfcGFnZXMocGFnZSkpOworCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIGwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIGFkZF9wYWdlX3RvX2xydV9saXN0KHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBsKQogewotCWxpc3RfYWRkKCZwYWdlLT5scnUsICZ6b25lLT5scnVbbF0ubGlzdCk7Ci0JX19pbmNfem9uZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOwotCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIGwpOworCV9fYWRkX3BhZ2VfdG9fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbCwgJnpvbmUtPmxydVtsXS5saXN0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBkZWxfcGFnZV9mcm9tX2xydV9saXN0KHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBsKQogewogCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCV9fZGVjX3pvbmVfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsKTsKKwlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfTFJVX0JBU0UgKyBsLCAtaHBhZ2VfbnJfcGFnZXMocGFnZSkpOwogCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIGwpOwogfQogCkBAIC02Niw3ICs3NSw3IEBACiAJCQlsICs9IExSVV9BQ1RJVkU7CiAJCX0KIAl9Ci0JX19kZWNfem9uZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOworCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwsIC1ocGFnZV9ucl9wYWdlcyhwYWdlKSk7CiAJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgbCk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAppbmRleCBiYjcyODhhLi4yNmJjNGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCkBAIC0zMTAsNiArMzEwLDkgQEAKICNpZmRlZiBDT05GSUdfTU1VX05PVElGSUVSCiAJc3RydWN0IG1tdV9ub3RpZmllcl9tbSAqbW11X25vdGlmaWVyX21tOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJcGd0YWJsZV90IHBtZF9odWdlX3B0ZTsgLyogcHJvdGVjdGVkIGJ5IHBhZ2VfdGFibGVfbG9jayAqLworI2VuZGlmCiAJLyogSG93IG1hbnkgdGFza3Mgc2hhcmluZyB0aGlzIG1tIGFyZSBPT01fRElTQUJMRSAqLwogCWF0b21pY190IG9vbV9kaXNhYmxlX2NvdW50OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oIGIvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiMDI2MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIGRyaXZlcgorICogIChCYXNlZCBvbiBOWFAgZHJpdmVyIGZvciBscGMgMzF4eCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTlhQIFNlbWljb25kdWN0b3JzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX01NQ19EV19NTUNfSF8KKyNkZWZpbmUgX0xJTlVYX01NQ19EV19NTUNfSF8KKworI2RlZmluZSBNQVhfTUNJX1NMT1RTCTIKKworZW51bSBkd19tY2lfc3RhdGUgeworCVNUQVRFX0lETEUgPSAwLAorCVNUQVRFX1NFTkRJTkdfQ01ELAorCVNUQVRFX1NFTkRJTkdfREFUQSwKKwlTVEFURV9EQVRBX0JVU1ksCisJU1RBVEVfU0VORElOR19TVE9QLAorCVNUQVRFX0RBVEFfRVJST1IsCit9OworCitlbnVtIHsKKwlFVkVOVF9DTURfQ09NUExFVEUgPSAwLAorCUVWRU5UX1hGRVJfQ09NUExFVEUsCisJRVZFTlRfREFUQV9DT01QTEVURSwKKwlFVkVOVF9EQVRBX0VSUk9SLAorCUVWRU5UX1hGRVJfRVJST1IKK307CisKK3N0cnVjdCBtbWNfZGF0YTsKKworLyoqCisgKiBzdHJ1Y3QgZHdfbWNpIC0gTU1DIGNvbnRyb2xsZXIgc3RhdGUgc2hhcmVkIGJldHdlZW4gYWxsIHNsb3RzCisgKiBAbG9jazogU3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgcXVldWUgYW5kIGFzc29jaWF0ZWQgZGF0YS4KKyAqIEByZWdzOiBQb2ludGVyIHRvIE1NSU8gcmVnaXN0ZXJzLgorICogQHNnOiBTY2F0dGVybGlzdCBlbnRyeSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIGJ5IFBJTyBjb2RlLCBpZiBhbnkuCisgKiBAcGlvX29mZnNldDogT2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgc2NhdHRlcmxpc3QgZW50cnkuCisgKiBAY3VyX3Nsb3Q6IFRoZSBzbG90IHdoaWNoIGlzIGN1cnJlbnRseSB1c2luZyB0aGUgY29udHJvbGxlci4KKyAqIEBtcnE6IFRoZSByZXF1ZXN0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgb24gQGN1cl9zbG90LAorICoJb3IgTlVMTCBpZiB0aGUgY29udHJvbGxlciBpcyBpZGxlLgorICogQGNtZDogVGhlIGNvbW1hbmQgY3VycmVudGx5IGJlaW5nIHNlbnQgdG8gdGhlIGNhcmQsIG9yIE5VTEwuCisgKiBAZGF0YTogVGhlIGRhdGEgY3VycmVudGx5IGJlaW5nIHRyYW5zZmVycmVkLCBvciBOVUxMIGlmIG5vIGRhdGEKKyAqCXRyYW5zZmVyIGlzIGluIHByb2dyZXNzLgorICogQHVzZV9kbWE6IFdoZXRoZXIgRE1BIGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQgb3Igbm90LgorICogQHNnX2RtYTogQnVzIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlci4KKyAqIEBzZ19jcHU6IFZpcnR1YWwgYWRkcmVzcyBvZiBETUEgYnVmZmVyLgorICogQGRtYV9vcHM6IFBvaW50ZXIgdG8gcGxhdGZvcm0tc3BlY2lmaWMgRE1BIGNhbGxiYWNrcy4KKyAqIEBjbWRfc3RhdHVzOiBTbmFwc2hvdCBvZiBTUiB0YWtlbiB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIGN1cnJlbnQKKyAqCWNvbW1hbmQuIE9ubHkgdmFsaWQgd2hlbiBFVkVOVF9DTURfQ09NUExFVEUgaXMgcGVuZGluZy4KKyAqIEBkYXRhX3N0YXR1czogU25hcHNob3Qgb2YgU1IgdGFrZW4gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50CisgKglkYXRhIHRyYW5zZmVyLiBPbmx5IHZhbGlkIHdoZW4gRVZFTlRfREFUQV9DT01QTEVURSBvcgorICoJRVZFTlRfREFUQV9FUlJPUiBpcyBwZW5kaW5nLgorICogQHN0b3BfY21kcjogVmFsdWUgdG8gYmUgbG9hZGVkIGludG8gQ01EUiB3aGVuIHRoZSBzdG9wIGNvbW1hbmQgaXMKKyAqCXRvIGJlIHNlbnQuCisgKiBAZGlyX3N0YXR1czogRGlyZWN0aW9uIG9mIGN1cnJlbnQgdHJhbnNmZXIuCisgKiBAdGFza2xldDogVGFza2xldCBydW5uaW5nIHRoZSByZXF1ZXN0IHN0YXRlIG1hY2hpbmUuCisgKiBAY2FyZF90YXNrbGV0OiBUYXNrbGV0IGhhbmRsaW5nIGNhcmQgZGV0ZWN0LgorICogQHBlbmRpbmdfZXZlbnRzOiBCaXRtYXNrIG9mIGV2ZW50cyBmbGFnZ2VkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICoJdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrbGV0LgorICogQGNvbXBsZXRlZF9ldmVudHM6IEJpdG1hc2sgb2YgZXZlbnRzIHdoaWNoIHRoZSBzdGF0ZSBtYWNoaW5lIGhhcworICoJcHJvY2Vzc2VkLgorICogQHN0YXRlOiBUYXNrbGV0IHN0YXRlLgorICogQHF1ZXVlOiBMaXN0IG9mIHNsb3RzIHdhaXRpbmcgZm9yIGFjY2VzcyB0byB0aGUgY29udHJvbGxlci4KKyAqIEBidXNfaHo6IFRoZSByYXRlIG9mIEBtY2sgaW4gSHouIFRoaXMgZm9ybXMgdGhlIGJhc2lzIGZvciBNTUMgYnVzCisgKglyYXRlIGFuZCB0aW1lb3V0IGNhbGN1bGF0aW9ucy4KKyAqIEBjdXJyZW50X3NwZWVkOiBDb25maWd1cmVkIHJhdGUgb2YgdGhlIGNvbnRyb2xsZXIuCisgKiBAbnVtX3Nsb3RzOiBOdW1iZXIgb2Ygc2xvdHMgYXZhaWxhYmxlLgorICogQHBkZXY6IFBsYXRmb3JtIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIE1NQyBjb250cm9sbGVyLgorICogQHBkYXRhOiBQbGF0Zm9ybSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgTU1DIGNvbnRyb2xsZXIuCisgKiBAc2xvdDogU2xvdHMgc2hhcmluZyB0aGlzIE1NQyBjb250cm9sbGVyLgorICogQGRhdGFfc2hpZnQ6IGxvZzIgb2YgRklGTyBpdGVtIHNpemUuCisgKiBAcHVzaF9kYXRhOiBQb2ludGVyIHRvIEZJRk8gcHVzaCBmdW5jdGlvbi4KKyAqIEBwdWxsX2RhdGE6IFBvaW50ZXIgdG8gRklGTyBwdWxsIGZ1bmN0aW9uLgorICogQHF1aXJrczogU2V0IG9mIHF1aXJrcyB0aGF0IGFwcGx5IHRvIHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBJUC4KKyAqCisgKiBMb2NraW5nCisgKiA9PT09PT09CisgKgorICogQGxvY2sgaXMgYSBzb2Z0aXJxLXNhZmUgc3BpbmxvY2sgcHJvdGVjdGluZyBAcXVldWUgYXMgd2VsbCBhcworICogQGN1cl9zbG90LCBAbXJxIGFuZCBAc3RhdGUuIFRoZXNlIG11c3QgYWx3YXlzIGJlIHVwZGF0ZWQKKyAqIGF0IHRoZSBzYW1lIHRpbWUgd2hpbGUgaG9sZGluZyBAbG9jay4KKyAqCisgKiBUaGUgQG1ycSBmaWVsZCBvZiBzdHJ1Y3QgZHdfbWNpX3Nsb3QgaXMgYWxzbyBwcm90ZWN0ZWQgYnkgQGxvY2ssCisgKiBhbmQgbXVzdCBhbHdheXMgYmUgd3JpdHRlbiBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBzbG90IGlzIGFkZGVkIHRvCisgKiBAcXVldWUuCisgKgorICogQHBlbmRpbmdfZXZlbnRzIGFuZCBAY29tcGxldGVkX2V2ZW50cyBhcmUgYWNjZXNzZWQgdXNpbmcgYXRvbWljIGJpdAorICogb3BlcmF0aW9ucywgc28gdGhleSBkb24ndCBuZWVkIGFueSBsb2NraW5nLgorICoKKyAqIE5vbmUgb2YgdGhlIGZpZWxkcyB0b3VjaGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBuZWVkIGFueQorICogbG9ja2luZy4gSG93ZXZlciwgb3JkZXJpbmcgaXMgaW1wb3J0YW50OiBCZWZvcmUgRVZFTlRfREFUQV9FUlJPUiBvcgorICogRVZFTlRfREFUQV9DT01QTEVURSBpcyBzZXQgaW4gQHBlbmRpbmdfZXZlbnRzLCBhbGwgZGF0YS1yZWxhdGVkCisgKiBpbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgYW5kIEBkYXRhX3N0YXR1cyB1cGRhdGVkIHdpdGggYQorICogc25hcHNob3Qgb2YgU1IuIFNpbWlsYXJseSwgYmVmb3JlIEVWRU5UX0NNRF9DT01QTEVURSBpcyBzZXQsIHRoZQorICogQ01EUkRZIGludGVydXB0IG11c3QgYmUgZGlzYWJsZWQgYW5kIEBjbWRfc3RhdHVzIHVwZGF0ZWQgd2l0aCBhCisgKiBzbmFwc2hvdCBvZiBTUiwgYW5kIGJlZm9yZSBFVkVOVF9YRkVSX0NPTVBMRVRFIGNhbiBiZSBzZXQsIHRoZQorICogYnl0ZXNfeGZlcmVkIGZpZWxkIG9mIEBkYXRhIG11c3QgYmUgd3JpdHRlbi4gVGhpcyBpcyBlbnN1cmVkIGJ5CisgKiB1c2luZyBiYXJyaWVycy4KKyAqLworc3RydWN0IGR3X21jaSB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZzsKKwl1bnNpZ25lZCBpbnQJCXBpb19vZmZzZXQ7CisKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QJKmN1cl9zbG90OworCXN0cnVjdCBtbWNfcmVxdWVzdAkqbXJxOworCXN0cnVjdCBtbWNfY29tbWFuZAkqY21kOworCXN0cnVjdCBtbWNfZGF0YQkJKmRhdGE7CisKKwkvKiBETUEgaW50ZXJmYWNlIG1lbWJlcnMqLworCWludAkJCXVzZV9kbWE7CisKKwlkbWFfYWRkcl90CQlzZ19kbWE7CisJdm9pZAkJCSpzZ19jcHU7CisJc3RydWN0IGR3X21jaV9kbWFfb3BzCSpkbWFfb3BzOworI2lmZGVmIENPTkZJR19NTUNfRFdfSURNQUMKKwl1bnNpZ25lZCBpbnQJCXJpbmdfc2l6ZTsKKyNlbHNlCisJc3RydWN0IGR3X21jaV9kbWFfZGF0YQkqZG1hX2RhdGE7CisjZW5kaWYKKwl1MzIJCQljbWRfc3RhdHVzOworCXUzMgkJCWRhdGFfc3RhdHVzOworCXUzMgkJCXN0b3BfY21kcjsKKwl1MzIJCQlkaXJfc3RhdHVzOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAljYXJkX3Rhc2tsZXQ7CisJdW5zaWduZWQgbG9uZwkJcGVuZGluZ19ldmVudHM7CisJdW5zaWduZWQgbG9uZwkJY29tcGxldGVkX2V2ZW50czsKKwllbnVtIGR3X21jaV9zdGF0ZQlzdGF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlOworCisJdTMyCQkJYnVzX2h6OworCXUzMgkJCWN1cnJlbnRfc3BlZWQ7CisJdTMyCQkJbnVtX3Nsb3RzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGR3X21jaV9ib2FyZAkqcGRhdGE7CisJc3RydWN0IGR3X21jaV9zbG90CSpzbG90W01BWF9NQ0lfU0xPVFNdOworCisJLyogRklGTyBwdXNoIGFuZCBwdWxsICovCisJaW50CQkJZGF0YV9zaGlmdDsKKwl2b2lkICgqcHVzaF9kYXRhKShzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpOworCXZvaWQgKCpwdWxsX2RhdGEpKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCk7CisKKwkvKiBXb3JrYXJvdW5kIGZsYWdzICovCisJdTMyCQkJcXVpcmtzOworfTsKKworLyogRE1BIG9wcyBmb3IgSW50ZXJuYWwvRXh0ZXJuYWwgRE1BQyBpbnRlcmZhY2UgKi8KK3N0cnVjdCBkd19tY2lfZG1hX29wcyB7CisJLyogRE1BIE9wcyAqLworCWludCAoKmluaXQpKHN0cnVjdCBkd19tY2kgKmhvc3QpOworCXZvaWQgKCpzdGFydCkoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHNnX2xlbik7CisJdm9pZCAoKmNvbXBsZXRlKShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKKwl2b2lkICgqc3RvcCkoc3RydWN0IGR3X21jaSAqaG9zdCk7CisJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBkd19tY2kgKmhvc3QpOworCXZvaWQgKCpleGl0KShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKK307CisKKy8qIElQIFF1aXJrcy9mbGFncy4gKi8KKy8qIE5vIHNwZWNpYWwgcXVpcmtzIG9yIGZsYWdzIHRvIGNhdGVyIGZvciAqLworI2RlZmluZSBEV19NQ0lfUVVJUktfTk9ORQkJMAorLyogRFRPIGZpeCBmb3IgY29tbWFuZCB0cmFuc21pc3Npb24gd2l0aCBJRE1BQyBjb25maWd1cmVkICovCisjZGVmaW5lIERXX01DSV9RVUlSS19JRE1BQ19EVE8JCTEKKy8qIGRlbGF5IG5lZWRlZCBiZXR3ZWVuIHJldHJpZXMgb24gc29tZSAyLjExYSBpbXBsZW1lbnRhdGlvbnMgKi8KKyNkZWZpbmUgRFdfTUNJX1FVSVJLX1JFVFJZX0RFTEFZCTIKKy8qIEhpZ2ggU3BlZWQgQ2FwYWJsZSAtIFN1cHBvcnRzIEhTIGNhcmRzICh1cHRvIDUwTUh6KSAqLworI2RlZmluZSBEV19NQ0lfUVVJUktfSElHSFNQRUVECQk0CisKKworc3RydWN0IGRtYV9wZGF0YTsKKworc3RydWN0IGJsb2NrX3NldHRpbmdzIHsKKwl1bnNpZ25lZCBzaG9ydAltYXhfc2VnczsJLyogc2VlIGJsa19xdWV1ZV9tYXhfc2VnbWVudHMgKi8KKwl1bnNpZ25lZCBpbnQJbWF4X2Jsa19zaXplOwkvKiBtYXhpbXVtIHNpemUgb2Ygb25lIG1tYyBibG9jayAqLworCXVuc2lnbmVkIGludAltYXhfYmxrX2NvdW50OwkvKiBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgaW4gb25lIHJlcSovCisJdW5zaWduZWQgaW50CW1heF9yZXFfc2l6ZTsJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gb25lIHJlcSovCisJdW5zaWduZWQgaW50CW1heF9zZWdfc2l6ZTsJLyogc2VlIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplICovCit9OworCisvKiBCb2FyZCBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3QgZHdfbWNpX2JvYXJkIHsKKwl1MzIgbnVtX3Nsb3RzOworCisJdTMyIHF1aXJrczsgLyogV29ya2Fyb3VuZCAvIFF1aXJrIGZsYWdzICovCisJdW5zaWduZWQgaW50IGJ1c19oejsgLyogQnVzIHNwZWVkICovCisKKwkvKiBkZWxheSBpbiBtUyBiZWZvcmUgZGV0ZWN0aW5nIGNhcmRzIGFmdGVyIGludGVycnVwdCAqLworCXUzMiBkZXRlY3RfZGVsYXlfbXM7CisKKwlpbnQgKCppbml0KSh1MzIgc2xvdF9pZCwgaXJxX2hhbmRsZXJfdCAsIHZvaWQgKik7CisJaW50ICgqZ2V0X3JvKSh1MzIgc2xvdF9pZCk7CisJaW50ICgqZ2V0X2NkKSh1MzIgc2xvdF9pZCk7CisJaW50ICgqZ2V0X29jcikodTMyIHNsb3RfaWQpOworCWludCAoKmdldF9idXNfd2QpKHUzMiBzbG90X2lkKTsKKwkvKgorCSAqIEVuYWJsZSBwb3dlciB0byBzZWxlY3RlZCBzbG90IGFuZCBzZXQgdm9sdGFnZSB0byBkZXNpcmVkIGxldmVsLgorCSAqIFZvbHRhZ2UgbGV2ZWxzIGFyZSBzcGVjaWZpZWQgdXNpbmcgTU1DX1ZERF94eHggZGVmaW5lcyBkZWZpbmVkCisJICogaW4gbGludXgvbW1jL2hvc3QuaCBmaWxlLgorCSAqLworCXZvaWQgKCpzZXRwb3dlcikodTMyIHNsb3RfaWQsIHUzMiB2b2x0KTsKKwl2b2lkICgqZXhpdCkodTMyIHNsb3RfaWQpOworCXZvaWQgKCpzZWxlY3Rfc2xvdCkodTMyIHNsb3RfaWQpOworCisJc3RydWN0IGR3X21jaV9kbWFfb3BzICpkbWFfb3BzOworCXN0cnVjdCBkbWFfcGRhdGEgKmRhdGE7CisJc3RydWN0IGJsb2NrX3NldHRpbmdzICpibGtfc2V0dGluZ3M7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX01NQ19EV19NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCAzMGY2ZmFkLi5iY2I3OTNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC0xMzEsNiArMTMxLDkgQEAKIAl1bnNpZ25lZCBpbnQJCWZfbWF4OwogCXVuc2lnbmVkIGludAkJZl9pbml0OwogCXUzMgkJCW9jcl9hdmFpbDsKKwl1MzIJCQlvY3JfYXZhaWxfc2RpbzsJLyogU0RJTy1zcGVjaWZpYyBPQ1IgKi8KKwl1MzIJCQlvY3JfYXZhaWxfc2Q7CS8qIFNELXNwZWNpZmljIE9DUiAqLworCXUzMgkJCW9jcl9hdmFpbF9tbWM7CS8qIE1NQy1zcGVjaWZpYyBPQ1IgKi8KIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJcG1fbm90aWZ5OwogCiAjZGVmaW5lIE1NQ19WRERfMTY1XzE5NQkJMHgwMDAwMDA4MAkvKiBWREQgdm9sdGFnZSAxLjY1IC0gMS45NSAqLwpAQCAtMTY5LDkgKzE3MiwyMCBAQAogI2RlZmluZSBNTUNfQ0FQXzFfMlZfRERSCSgxIDw8IDEyKQkvKiBjYW4gc3VwcG9ydCAqLwogCQkJCQkJLyogRERSIG1vZGUgYXQgMS4yViAqLwogI2RlZmluZSBNTUNfQ0FQX1BPV0VSX09GRl9DQVJECSgxIDw8IDEzKQkvKiBDYW4gcG93ZXIgb2ZmIGFmdGVyIGJvb3QgKi8KKyNkZWZpbmUgTU1DX0NBUF9CVVNfV0lEVEhfVEVTVAkoMSA8PCAxNCkJLyogQ01EMTQvQ01EMTkgYnVzIHdpZHRoIG9rICovCiAKIAltbWNfcG1fZmxhZ190CQlwbV9jYXBzOwkvKiBzdXBwb3J0ZWQgcG0gZmVhdHVyZXMgKi8KIAorI2lmZGVmIENPTkZJR19NTUNfQ0xLR0FURQorCWludAkJCWNsa19yZXF1ZXN0czsJLyogaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJCWNsa19kZWxheTsJLyogbnVtYmVyIG9mIE1DSSBjbGsgaG9sZCBjeWNsZXMgKi8KKwlib29sCQkJY2xrX2dhdGVkOwkvKiBjbG9jayBnYXRlZCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAljbGtfZ2F0ZV93b3JrOyAvKiBkZWxheWVkIGNsb2NrIGdhdGUgKi8KKwl1bnNpZ25lZCBpbnQJCWNsa19vbGQ7CS8qIG9sZCBjbG9jayB2YWx1ZSBjYWNoZSAqLworCXNwaW5sb2NrX3QJCWNsa19sb2NrOwkvKiBsb2NrIGZvciBjbGsgZmllbGRzICovCisJc3RydWN0IG11dGV4CQljbGtfZ2F0ZV9tdXRleDsJLyogbXV0ZXggZm9yIGNsb2NrIGdhdGluZyAqLworI2VuZGlmCisKIAkvKiBob3N0IHNwZWNpZmljIGJsb2NrIGRhdGEgKi8KIAl1bnNpZ25lZCBpbnQJCW1heF9zZWdfc2l6ZTsJLyogc2VlIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplICovCiAJdW5zaWduZWQgc2hvcnQJCW1heF9zZWdzOwkvKiBzZWUgYmxrX3F1ZXVlX21heF9zZWdtZW50cyAqLwpAQCAtMzA3LDUgKzMyMSwxMCBAQAogCXJldHVybiAhKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX05PTlJFTU9WQUJMRSkgJiYgbW1jX2Fzc3VtZV9yZW1vdmFibGU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tY19jYXJkX2lzX3Bvd2VyZWRfcmVzdW1lZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJcmV0dXJuIGhvc3QtPnBtX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVI7Cit9CisKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL21tYy5oCmluZGV4IDk1NmZiZDg3Li42MTIzMDFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaApAQCAtNDAsNyArNDAsOSBAQAogI2RlZmluZSBNTUNfUkVBRF9EQVRfVU5USUxfU1RPUCAgMTEgICAvKiBhZHRjIFszMTowXSBkYWRyICAgICAgICBSMSAgKi8KICNkZWZpbmUgTU1DX1NUT1BfVFJBTlNNSVNTSU9OICAgIDEyICAgLyogYWMgICAgICAgICAgICAgICAgICAgICAgUjFiICovCiAjZGVmaW5lIE1NQ19TRU5EX1NUQVRVUyAgICAgICAgICAxMyAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgIFIxICAqLworI2RlZmluZSBNTUNfQlVTX1RFU1RfUiAgICAgICAgICAgMTQgICAvKiBhZHRjICAgICAgICAgICAgICAgICAgICBSMSAgKi8KICNkZWZpbmUgTU1DX0dPX0lOQUNUSVZFX1NUQVRFICAgIDE1ICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgICAgICovCisjZGVmaW5lIE1NQ19CVVNfVEVTVF9XICAgICAgICAgICAxOSAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxICAqLwogI2RlZmluZSBNTUNfU1BJX1JFQURfT0NSICAgICAgICAgNTggICAvKiBzcGkgICAgICAgICAgICAgICAgICBzcGlfUjMgKi8KICNkZWZpbmUgTU1DX1NQSV9DUkNfT05fT0ZGICAgICAgIDU5ICAgLyogc3BpICBbMDowXSBmbGFnICAgICAgc3BpX1IxICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCmluZGV4IDFmZGM2NzMuLjgzYmQ5ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaApAQCAtODMsNiArODMsOCBAQAogI2RlZmluZSBTREhDSV9RVUlSS19NVUxUSUJMT0NLX1JFQURfQUNNRDEyCQkoMTw8MjgpCiAvKiBDb250cm9sbGVyIGRvZXNuJ3QgaGF2ZSBISVNQRCBiaXQgZmllbGQgaW4gSEktU1BFRUQgU0QgY2FyZCAqLwogI2RlZmluZSBTREhDSV9RVUlSS19OT19ISVNQRF9CSVQJCQkoMTw8MjkpCisvKiBDb250cm9sbGVyIHRyZWF0cyBBRE1BIGRlc2NyaXB0b3JzIHdpdGggbGVuZ3RoIDAwMDBoIGluY29ycmVjdGx5ICovCisjZGVmaW5lIFNESENJX1FVSVJLX0JST0tFTl9BRE1BX1pFUk9MRU5fREVTQwkJKDE8PDMwKQogCiAJaW50IGlycTsJCS8qIERldmljZSBJUlEgKi8KIAl2b2lkIF9faW9tZW0gKmlvYWRkcjsJLyogTWFwcGVkIGFkZHJlc3MgKi8KQEAgLTEzOSw2ICsxNDEsMTAgQEAKIAogCXVuc2lnbmVkIGludCBjYXBzOwkvKiBBbHRlcm5hdGl2ZSBjYXBhYmlsaXRpZXMgKi8KIAorCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9zZGlvOwkvKiBPQ1IgYml0IG1hc2tzICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgb2NyX2F2YWlsX3NkOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9tbWM7CisKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKICNlbmRpZiAvKiBfX1NESENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21tY2lmLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zaF9tbWNpZi5oCmluZGV4IDQ0ZmM1MzQuLmJmMTczNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NoX21tY2lmLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2hfbW1jaWYuaApAQCAtMTA0LDYgKzEwNCw5IEBACiAKICNkZWZpbmUgU0hfTU1DSUZfQkJTIDUxMiAvKiBib290IGJsb2NrIHNpemUgKi8KIAorZW51bSB7IE1NQ0lGX1BST0dSRVNTX0VOVEVSLCBNTUNJRl9QUk9HUkVTU19JTklULAorICAgICAgIE1NQ0lGX1BST0dSRVNTX0xPQUQsIE1NQ0lGX1BST0dSRVNTX0RPTkUgfTsKKwogc3RhdGljIGlubGluZSB2b2lkIHNoX21tY2lmX2Jvb3RfY21kX3NlbmQodm9pZCBfX2lvbWVtICpiYXNlLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTE2Niw2ICsxNjksMTcgQEAKIAl1bnNpZ25lZCBsb25nIGs7CiAJaW50IHJldCA9IDA7CiAKKwkvKiBJbiBkYXRhIHRyYW5zZmVyIG1vZGU6IFNldCBjbG9jayB0byBCdXMgY2xvY2svNCAoYWJvdXQgMjBNaHopICovCisJc2hfbW1jaWZfd3JpdGVsKGJhc2UsIE1NQ0lGX0NFX0NMS19DVFJMLAorCQkJQ0xLX0VOQUJMRSB8IENMS0RJVl80IHwgU1JTUFRPXzI1NiB8CisJCQlTUkJTWVRPXzI5IHwgU1JXRFRPXzI5IHwgU0NDU1RPXzI5KTsKKworCS8qIENNRDkgLSBHZXQgQ1NEICovCisJc2hfbW1jaWZfYm9vdF9jbWQoYmFzZSwgMHgwOTgwNjAwMCwgMHgwMDAxMDAwMCk7CisKKwkvKiBDTUQ3IC0gU2VsZWN0IHRoZSBjYXJkICovCisJc2hfbW1jaWZfYm9vdF9jbWQoYmFzZSwgMHgwNzQwMDAwMCwgMHgwMDAxMDAwMCk7CisKIAkvKiBDTUQxNiAtIFNldCB0aGUgYmxvY2sgc2l6ZSAqLwogCXNoX21tY2lmX2Jvb3RfY21kKGJhc2UsIDB4MTA0MDAwMDAsIFNIX01NQ0lGX0JCUyk7CiAKQEAgLTIwOSwyNyArMjIzLDQgQEAKIAlzaF9tbWNpZl9ib290X2NtZChiYXNlLCAweDAzNDAwMDQwLCAweDAwMDEwMDAwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNoX21tY2lmX2Jvb3Rfc2x1cnAodm9pZCBfX2lvbWVtICpiYXNlLAotCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbm9fYnl0ZXMpCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQkvKiBJbiBkYXRhIHRyYW5zZmVyIG1vZGU6IFNldCBjbG9jayB0byBCdXMgY2xvY2svNCAoYWJvdXQgMjBNaHopICovCi0Jc2hfbW1jaWZfd3JpdGVsKGJhc2UsIE1NQ0lGX0NFX0NMS19DVFJMLAotCQkJQ0xLX0VOQUJMRSB8IENMS0RJVl80IHwgU1JTUFRPXzI1NiB8Ci0JCQlTUkJTWVRPXzI5IHwgU1JXRFRPXzI5IHwgU0NDU1RPXzI5KTsKLQotCS8qIENNRDkgLSBHZXQgQ1NEICovCi0Jc2hfbW1jaWZfYm9vdF9jbWQoYmFzZSwgMHgwOTgwNjAwMCwgMHgwMDAxMDAwMCk7Ci0KLQkvKiBDTUQ3IC0gU2VsZWN0IHRoZSBjYXJkICovCi0Jc2hfbW1jaWZfYm9vdF9jbWQoYmFzZSwgMHgwNzQwMDAwMCwgMHgwMDAxMDAwMCk7Ci0KLQl0bXAgPSBub19ieXRlcyAvIFNIX01NQ0lGX0JCUzsKLQl0bXAgKz0gKG5vX2J5dGVzICUgU0hfTU1DSUZfQkJTKSA/IDEgOiAwOwotCi0Jc2hfbW1jaWZfYm9vdF9kb19yZWFkKGJhc2UsIDUxMiwgdG1wLCBidWYpOwotfQotCiAjZW5kaWYgLyogX19TSF9NTUNJRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW11X25vdGlmaWVyLmggYi9pbmNsdWRlL2xpbnV4L21tdV9ub3RpZmllci5oCmluZGV4IDQzZGNmYmQuLmNjMmU3ZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW11X25vdGlmaWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXVfbm90aWZpZXIuaApAQCAtNjIsNiArNjIsMTYgQEAKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIAogCS8qCisJICogdGVzdF95b3VuZyBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIHlvdW5nL2FjY2Vzc2VkIGJpdGZsYWcgaW4KKwkgKiB0aGUgc2Vjb25kYXJ5IHB0ZS4gVGhpcyBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIHBhZ2UgaXMKKwkgKiBmcmVxdWVudGx5IHVzZWQgd2l0aG91dCBhY3R1YWxseSBjbGVhcmluZyB0aGUgZmxhZyBvciB0ZWFyaW5nCisJICogZG93biB0aGUgc2Vjb25kYXJ5IG1hcHBpbmcgb24gdGhlIHBhZ2UuCisJICovCisJaW50ICgqdGVzdF95b3VuZykoc3RydWN0IG1tdV9ub3RpZmllciAqbW4sCisJCQkgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOworCisJLyoKIAkgKiBjaGFuZ2VfcHRlIGlzIGNhbGxlZCBpbiBjYXNlcyB0aGF0IHB0ZSBtYXBwaW5nIHRvIHBhZ2UgaXMgY2hhbmdlZDoKIAkgKiBmb3IgZXhhbXBsZSwgd2hlbiBrc20gcmVtYXBzIHB0ZSB0byBwb2ludCB0byBhIG5ldyBzaGFyZWQgcGFnZS4KIAkgKi8KQEAgLTE2Myw2ICsxNzMsOCBAQAogZXh0ZXJuIHZvaWQgX19tbXVfbm90aWZpZXJfcmVsZWFzZShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gaW50IF9fbW11X25vdGlmaWVyX2NsZWFyX2ZsdXNoX3lvdW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CitleHRlcm4gaW50IF9fbW11X25vdGlmaWVyX3Rlc3RfeW91bmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogZXh0ZXJuIHZvaWQgX19tbXVfbm90aWZpZXJfY2hhbmdlX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSk7CiBleHRlcm4gdm9pZCBfX21tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sCkBAIC0xODYsNiArMTk4LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1tdV9ub3RpZmllcl90ZXN0X3lvdW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlpZiAobW1faGFzX25vdGlmaWVycyhtbSkpCisJCXJldHVybiBfX21tdV9ub3RpZmllcl90ZXN0X3lvdW5nKG1tLCBhZGRyZXNzKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIG1tdV9ub3RpZmllcl9jaGFuZ2VfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSkKIHsKQEAgLTI0Myw2ICsyNjMsMzIgQEAKIAlfX3B0ZTsJCQkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgcG1kcF9jbGVhcl9mbHVzaF9ub3RpZnkoX192bWEsIF9fYWRkcmVzcywgX19wbWRwKQkJXAorKHsJCQkJCQkJCQlcCisJcG1kX3QgX19wbWQ7CQkJCQkJCVwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKl9fX3ZtYSA9IF9fdm1hOwkJCQlcCisJdW5zaWduZWQgbG9uZyBfX19hZGRyZXNzID0gX19hZGRyZXNzOwkJCQlcCisJVk1fQlVHX09OKF9fYWRkcmVzcyAmIH5IUEFHRV9QTURfTUFTSyk7CQkJCVwKKwltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChfX192bWEtPnZtX21tLCBfX19hZGRyZXNzLAlcCisJCQkJCSAgICAoX19hZGRyZXNzKStIUEFHRV9QTURfU0laRSk7XAorCV9fcG1kID0gcG1kcF9jbGVhcl9mbHVzaChfX192bWEsIF9fX2FkZHJlc3MsIF9fcG1kcCk7CQlcCisJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKF9fX3ZtYS0+dm1fbW0sIF9fX2FkZHJlc3MsCVwKKwkJCQkJICAoX19hZGRyZXNzKStIUEFHRV9QTURfU0laRSk7CVwKKwlfX3BtZDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgcG1kcF9zcGxpdHRpbmdfZmx1c2hfbm90aWZ5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcG1kcCkJCVwKKyh7CQkJCQkJCQkJXAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19fdm1hID0gX192bWE7CQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fX2FkZHJlc3MgPSBfX2FkZHJlc3M7CQkJCVwKKwlWTV9CVUdfT04oX19hZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsJCQkJXAorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KF9fX3ZtYS0+dm1fbW0sIF9fX2FkZHJlc3MsCVwKKwkJCQkJICAgIChfX2FkZHJlc3MpK0hQQUdFX1BNRF9TSVpFKTtcCisJcG1kcF9zcGxpdHRpbmdfZmx1c2goX19fdm1hLCBfX19hZGRyZXNzLCBfX3BtZHApOwkJXAorCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChfX192bWEtPnZtX21tLCBfX19hZGRyZXNzLAlcCisJCQkJCSAgKF9fYWRkcmVzcykrSFBBR0VfUE1EX1NJWkUpOwlcCit9KQorCiAjZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfeW91bmdfbm90aWZ5KF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCkJCVwKICh7CQkJCQkJCQkJXAogCWludCBfX3lvdW5nOwkJCQkJCQlcCkBAIC0yNTQsNiArMzAwLDE3IEBACiAJX195b3VuZzsJCQkJCQkJXAogfSkKIAorI2RlZmluZSBwbWRwX2NsZWFyX2ZsdXNoX3lvdW5nX25vdGlmeShfX3ZtYSwgX19hZGRyZXNzLCBfX3BtZHApCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX195b3VuZzsJCQkJCQkJXAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqX19fdm1hID0gX192bWE7CQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fX2FkZHJlc3MgPSBfX2FkZHJlc3M7CQkJCVwKKwlfX3lvdW5nID0gcG1kcF9jbGVhcl9mbHVzaF95b3VuZyhfX192bWEsIF9fX2FkZHJlc3MsIF9fcG1kcCk7CVwKKwlfX3lvdW5nIHw9IG1tdV9ub3RpZmllcl9jbGVhcl9mbHVzaF95b3VuZyhfX192bWEtPnZtX21tLAlcCisJCQkJCQkgIF9fX2FkZHJlc3MpOwkJXAorCV9feW91bmc7CQkJCQkJCVwKK30pCisKICNkZWZpbmUgc2V0X3B0ZV9hdF9ub3RpZnkoX19tbSwgX19hZGRyZXNzLCBfX3B0ZXAsIF9fcHRlKQkJXAogKHsJCQkJCQkJCQlcCiAJc3RydWN0IG1tX3N0cnVjdCAqX19fbW0gPSBfX21tOwkJCQkJXApAQCAtMjc2LDYgKzMzMywxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtbXVfbm90aWZpZXJfdGVzdF95b3VuZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbXVfbm90aWZpZXJfY2hhbmdlX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCBwdGUpCiB7CkBAIC0zMDUsNyArMzY4LDEwIEBACiB9CiAKICNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkgcHRlcF9jbGVhcl9mbHVzaF95b3VuZworI2RlZmluZSBwbWRwX2NsZWFyX2ZsdXNoX3lvdW5nX25vdGlmeSBwbWRwX2NsZWFyX2ZsdXNoX3lvdW5nCiAjZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5IHB0ZXBfY2xlYXJfZmx1c2gKKyNkZWZpbmUgcG1kcF9jbGVhcl9mbHVzaF9ub3RpZnkgcG1kcF9jbGVhcl9mbHVzaAorI2RlZmluZSBwbWRwX3NwbGl0dGluZ19mbHVzaF9ub3RpZnkgcG1kcF9zcGxpdHRpbmdfZmx1c2gKICNkZWZpbmUgc2V0X3B0ZV9hdF9ub3RpZnkgc2V0X3B0ZV9hdAogCiAjZW5kaWYgLyogQ09ORklHX01NVV9OT1RJRklFUiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggMzljMjRlYi4uMDJlY2IwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC0xMTQsNiArMTE0LDcgQEAKIAlOVU1BX0xPQ0FMLAkJLyogYWxsb2NhdGlvbiBmcm9tIGxvY2FsIG5vZGUgKi8KIAlOVU1BX09USEVSLAkJLyogYWxsb2NhdGlvbiBmcm9tIG90aGVyIG5vZGUgKi8KICNlbmRpZgorCU5SX0FOT05fVFJBTlNQQVJFTlRfSFVHRVBBR0VTLAogCU5SX1ZNX1pPTkVfU1RBVF9JVEVNUyB9OwogCiAvKgpAQCAtNDU4LDEyICs0NTksNiBAQAogCXJldHVybiB0ZXN0X2JpdChaT05FX09PTV9MT0NLRUQsICZ6b25lLT5mbGFncyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfU01QCi11bnNpZ25lZCBsb25nIHpvbmVfbnJfZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7Ci0jZWxzZQotI2RlZmluZSB6b25lX25yX2ZyZWVfcGFnZXMoem9uZSkgem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCiAvKgogICogVGhlICJwcmlvcml0eSIgb2YgVk0gc2Nhbm5pbmcgaXMgaG93IG11Y2ggb2YgdGhlIHF1ZXVlcyB3ZSB3aWxsIHNjYW4gaW4gb25lCiAgKiBnby4gQSB2YWx1ZSBvZiAxMiBmb3IgREVGX1BSSU9SSVRZIGltcGxpZXMgdGhhdCB3ZSB3aWxsIHNjYW4gMS80MDk2dGggb2YgdGhlCkBAIC02NDUsNiArNjQwLDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBrc3dhcGRfd2FpdDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtzd2FwZDsKIAlpbnQga3N3YXBkX21heF9vcmRlcjsKKwllbnVtIHpvbmVfdHlwZSBjbGFzc3pvbmVfaWR4OwogfSBwZ19kYXRhX3Q7CiAKICNkZWZpbmUgbm9kZV9wcmVzZW50X3BhZ2VzKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3ByZXNlbnRfcGFnZXMpCkBAIC02NjAsOCArNjU2LDEwIEBACiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggem9uZWxpc3RzX211dGV4Owogdm9pZCBidWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmRhdGEpOwotdm9pZCB3YWtldXBfa3N3YXBkKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIpOwotaW50IHpvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyaywKK3ZvaWQgd2FrZXVwX2tzd2FwZChzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyLCBlbnVtIHpvbmVfdHlwZSBjbGFzc3pvbmVfaWR4KTsKK2Jvb2wgem9uZV93YXRlcm1hcmtfb2soc3RydWN0IHpvbmUgKnosIGludCBvcmRlciwgdW5zaWduZWQgbG9uZyBtYXJrLAorCQlpbnQgY2xhc3N6b25lX2lkeCwgaW50IGFsbG9jX2ZsYWdzKTsKK2Jvb2wgem9uZV93YXRlcm1hcmtfb2tfc2FmZShzdHJ1Y3Qgem9uZSAqeiwgaW50IG9yZGVyLCB1bnNpZ25lZCBsb25nIG1hcmssCiAJCWludCBjbGFzc3pvbmVfaWR4LCBpbnQgYWxsb2NfZmxhZ3MpOwogZW51bSBtZW1tYXBfY29udGV4dCB7CiAJTUVNTUFQX0VBUkxZLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKaW5kZXggMWMyN2YyMC4uZTEzZWVmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC0xNDMsMTA0ICsxNDMsNCBAQAogI2RlZmluZSBOQ1BfTUFYUEFUSExFTiAyNTUKICNkZWZpbmUgTkNQX01BWE5BTUVMRU4gMTQKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2luY2x1ZGUgPGxpbnV4L25jcF9mc19pLmg+Ci0jaW5jbHVkZSA8bGludXgvbmNwX2ZzX3NiLmg+Ci0KLS8qIGRlZmluZSBiZWNhdXNlIGl0IGlzIGVhc3kgdG8gY2hhbmdlIFBSSU5USyB0byB7Kn1QUklOVEsgKi8KLSNkZWZpbmUgUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgZm9ybWF0ICwgIyMgYXJncykKLQotI3VuZGVmIE5DUEZTX1BBUkFOT0lBCi0jaWZkZWYgTkNQRlNfUEFSQU5PSUEKLSNkZWZpbmUgUFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFBSSU5USyhmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgUFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmbmRlZiBERUJVR19OQ1AKLSNkZWZpbmUgREVCVUdfTkNQIDAKLSNlbmRpZgotI2lmIERFQlVHX05DUCA+IDAKLSNkZWZpbmUgRFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFBSSU5USyhmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLSNpZiBERUJVR19OQ1AgPiAxCi0jZGVmaW5lIEREUFJJTlRLKGZvcm1hdCwgYXJncy4uLikgUFJJTlRLKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBERFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBOQ1BfTUFYX1JQQ19USU1FT1VUICg2KkhaKQotCi0KLXN0cnVjdCBuY3BfZW50cnlfaW5mbyB7Ci0Jc3RydWN0IG53X2luZm9fc3RydWN0CWk7Ci0JaW5vX3QJCQlpbm87Ci0JaW50CQkJb3BlbmVkOwotCWludAkJCWFjY2VzczsKLQl1bnNpZ25lZCBpbnQJCXZvbHVtZTsKLQlfX3U4CQkJZmlsZV9oYW5kbGVbNl07Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuY3Bfc2VydmVyICpOQ1BfU0JQKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JcmV0dXJuIHNiLT5zX2ZzX2luZm87Ci19Ci0KLSNkZWZpbmUgTkNQX1NFUlZFUihpbm9kZSkJTkNQX1NCUCgoaW5vZGUpLT5pX3NiKQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmNwX2lub2RlX2luZm8gKk5DUF9GSU5GTyhjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBuY3BfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKLX0KLQotLyogbGludXgvZnMvbmNwZnMvaW5vZGUuYyAqLwotaW50IG5jcF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwotc3RydWN0IGlub2RlICpuY3BfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICopOwotdm9pZCBuY3BfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKik7Ci12b2lkIG5jcF91cGRhdGVfaW5vZGUyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKik7Ci0KLS8qIGxpbnV4L2ZzL25jcGZzL2Rpci5jICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2Rpcl9vcGVyYXRpb25zOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9uczsKLWludCBuY3BfY29ubl9sb2dnZWRfaW4oc3RydWN0IHN1cGVyX2Jsb2NrICopOwotaW50IG5jcF9kYXRlX2RvczJ1bml4KF9fbGUxNiB0aW1lLCBfX2xlMTYgZGF0ZSk7Ci12b2lkIG5jcF9kYXRlX3VuaXgyZG9zKGludCB1bml4X2RhdGUsIF9fbGUxNiAqIHRpbWUsIF9fbGUxNiAqIGRhdGUpOwotCi0vKiBsaW51eC9mcy9uY3Bmcy9pb2N0bC5jICovCi1sb25nIG5jcF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotbG9uZyBuY3BfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci0KLS8qIGxpbnV4L2ZzL25jcGZzL3NvY2suYyAqLwotaW50IG5jcF9yZXF1ZXN0MihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgZnVuY3Rpb24sCi0Jdm9pZCogcmVwbHksIGludCBtYXhfcmVwbHlfc2l6ZSk7Ci1zdGF0aWMgaW5saW5lIGludCBuY3BfcmVxdWVzdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgZnVuY3Rpb24pIHsKLQlyZXR1cm4gbmNwX3JlcXVlc3QyKHNlcnZlciwgZnVuY3Rpb24sIHNlcnZlci0+cGFja2V0LCBzZXJ2ZXItPnBhY2tldF9zaXplKTsKLX0KLWludCBuY3BfY29ubmVjdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKTsKLWludCBuY3BfZGlzY29ubmVjdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKTsKLXZvaWQgbmNwX2xvY2tfc2VydmVyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpOwotdm9pZCBuY3BfdW5sb2NrX3NlcnZlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKTsKLQotLyogbGludXgvZnMvbmNwZnMvc3ltbGluay5jICovCi0jaWYgZGVmaW5lZChDT05GSUdfTkNQRlNfRVhUUkFTKSB8fCBkZWZpbmVkKENPTkZJR19OQ1BGU19ORlNfTlMpCi1leHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBuY3Bfc3ltbGlua19hb3BzOwotaW50IG5jcF9zeW1saW5rKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBkZW50cnkqLCBjb25zdCBjaGFyKik7Ci0jZW5kaWYKLQotLyogbGludXgvZnMvbmNwZnMvZmlsZS5jICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5jcF9maWxlX29wZXJhdGlvbnM7Ci1pbnQgbmNwX21ha2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLQotLyogbGludXgvZnMvbmNwZnMvbW1hcC5jICovCi1pbnQgbmNwX21tYXAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwotCi0vKiBsaW51eC9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMgKi8KLWludCBuY3BfbWFrZV9jbG9zZWQoc3RydWN0IGlub2RlICopOwotCi0jZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYJCQkJLyogX0xJTlVYX05DUF9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oIGIvaW5jbHVkZS9saW51eC9uY3BfbW91bnQuaAppbmRleCBhMmI1NDllLi5kZmNiZWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25jcF9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmNwX21vdW50LmgKQEAgLTY4LDI2ICs2OCw0IEBACiAKICNkZWZpbmUgTkNQX01PVU5UX1ZFUlNJT05fVjUJKDUpCS8qIFRleHQgb25seSAqLwogCi0jaWZkZWYgX19LRVJORUxfXwotCi1zdHJ1Y3QgbmNwX21vdW50X2RhdGFfa2VybmVsIHsKLQl1bnNpZ25lZCBsb25nICAgIGZsYWdzOwkJLyogTkNQX01PVU5UXyogZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQJIGludF9mbGFnczsJLyogaW50ZXJuYWwgZmxhZ3MgKi8KLSNkZWZpbmUgTkNQX0lNT1VOVF9MT0dHRURJTl9QT1NTSUJMRQkweDAwMDEKLQlfX2tlcm5lbF91aWQzMl90IG1vdW50ZWRfdWlkOwkvKiBXaG8gbWF5IHVtb3VudCgpIHRoaXMgZmlsZXN5c3RlbT8gKi8KLQlzdHJ1Y3QgcGlkICAgICAgKndkb2dfcGlkOwkvKiBXaG8gY2FyZXMgZm9yIG91ciB3YXRjaGRvZyBwYWNrZXRzPyAqLwotCXVuc2lnbmVkIGludCAgICAgbmNwX2ZkOwkvKiBUaGUgc29ja2V0IHRvIHRoZSBuY3AgcG9ydCAqLwotCXVuc2lnbmVkIGludCAgICAgdGltZV9vdXQ7CS8qIEhvdyBsb25nIHNob3VsZCBJIHdhaXQgYWZ0ZXIKLQkJCQkJICAgc2VuZGluZyBhIE5DUCByZXF1ZXN0PyAqLwotCXVuc2lnbmVkIGludCAgICAgcmV0cnlfY291bnQ7CS8qIEFuZCBob3cgb2Z0ZW4gc2hvdWxkIEkgcmV0cnk/ICovCi0JdW5zaWduZWQgY2hhcgkgbW91bnRlZF92b2xbTkNQX1ZPTE5BTUVfTEVOICsgMV07Ci0JX19rZXJuZWxfdWlkMzJfdCB1aWQ7Ci0JX19rZXJuZWxfZ2lkMzJfdCBnaWQ7Ci0JX19rZXJuZWxfbW9kZV90ICBmaWxlX21vZGU7Ci0JX19rZXJuZWxfbW9kZV90ICBkaXJfbW9kZTsKLQlpbnQJCSBpbmZvX2ZkOwotfTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mYy9wbjU0NC5oIGIvaW5jbHVkZS9saW51eC9uZmMvcG41NDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI4NTIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZmMvcG41NDQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogRHJpdmVyIGluY2x1ZGUgZm9yIHRoZSBQTjU0NCBORkMgY2hpcC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOiBKYXJpIFZhbmhhbGEgPGV4dC1qYXJpLnZhbmhhbGFAbm9raWEuY29tPgorICogQ29udGFjdDogTWF0dGkgQWFsdG9lbm4gPG1hdHRpLmouYWFsdG9uZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9QTjU0NF9IXworI2RlZmluZSBfUE41NDRfSF8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjZGVmaW5lIFBONTQ0X0RSSVZFUl9OQU1FCSJwbjU0NCIKKyNkZWZpbmUgUE41NDRfTUFYV0lORE9XX1NJWkUJNworI2RlZmluZSBQTjU0NF9XSU5ET1dfU0laRQk0CisjZGVmaW5lIFBONTQ0X1JFVFJJRVMJCTEwCisjZGVmaW5lIFBONTQ0X01BWF9JMkNfVFJBTlNGRVIJMHgwNDAwCisjZGVmaW5lIFBONTQ0X01TR19NQVhfU0laRQkweDIxIC8qIGF0IG5vcm1hbCBIQ0kgbW9kZSAqLworCisvKiBpb2N0bCAqLworI2RlZmluZSBQTjU0NF9DSEFSX0JBU0UJCSdQJworI2RlZmluZSBQTjU0NF9JT1IobnVtLCBkdHlwZSkJX0lPUihQTjU0NF9DSEFSX0JBU0UsIG51bSwgZHR5cGUpCisjZGVmaW5lIFBONTQ0X0lPVyhudW0sIGR0eXBlKQlfSU9XKFBONTQ0X0NIQVJfQkFTRSwgbnVtLCBkdHlwZSkKKyNkZWZpbmUgUE41NDRfR0VUX0ZXX01PREUJUE41NDRfSU9XKDEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUE41NDRfU0VUX0ZXX01PREUJUE41NDRfSU9XKDIsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUE41NDRfR0VUX0RFQlVHCQlQTjU0NF9JT1coMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBQTjU0NF9TRVRfREVCVUcJCVBONTQ0X0lPVyg0LCB1bnNpZ25lZCBpbnQpCisKKy8qIFRpbWluZyByZXN0cmljdGlvbnMgKG1zKSAqLworI2RlZmluZSBQTjU0NF9SRVNFVFZFTl9USU1FCTMwIC8qIDcgKi8KKyNkZWZpbmUgUE41NDRfUFZERFZFTl9USU1FCTAKKyNkZWZpbmUgUE41NDRfVkJBVFZFTl9USU1FCTAKKyNkZWZpbmUgUE41NDRfR1BJTzRWRU5fVElNRQkwCisjZGVmaW5lIFBONTQ0X1dBS0VVUF9BQ0sJNQorI2RlZmluZSBQTjU0NF9XQUtFVVBfR1VBUkQJKFBONTQ0X1dBS0VVUF9BQ0sgKyAxKQorI2RlZmluZSBQTjU0NF9JTkFDVElWSVRZX1RJTUUJMTAwMAorI2RlZmluZSBQTjU0NF9JTlRFUkZSQU1FX0RFTEFZCTIwMCAvKiB1cyAqLworI2RlZmluZSBQTjU0NF9CQVVEUkFURV9DSEFOR0UJMTUwIC8qIHVzICovCisKKy8qIERlYnVnIGJpdHMgKi8KKyNkZWZpbmUgUE41NDRfREVCVUdfQlVGCQkweDAxCisjZGVmaW5lIFBONTQ0X0RFQlVHX1JFQUQJMHgwMgorI2RlZmluZSBQTjU0NF9ERUJVR19XUklURQkweDA0CisjZGVmaW5lIFBONTQ0X0RFQlVHX0lSUQkJMHgwOAorI2RlZmluZSBQTjU0NF9ERUJVR19DQUxMUwkweDEwCisjZGVmaW5lIFBONTQ0X0RFQlVHX01PREUJMHgyMAorCisvKiBOb3JtYWwgKEhDSSkgbW9kZSAqLworI2RlZmluZSBQTjU0NF9MTENfSENJX09WRVJIRUFECTMgLyogaGVhZGVyICsgY3JjICh0byBsZW5ndGgpICovCisjZGVmaW5lIFBONTQ0X0xMQ19NSU5fU0laRQkoMSArIFBONTQ0X0xMQ19IQ0lfT1ZFUkhFQUQpIC8qIGxlbmd0aCArICovCisjZGVmaW5lIFBONTQ0X0xMQ19NQVhfREFUQQkoUE41NDRfTVNHX01BWF9TSVpFIC0gMikKKyNkZWZpbmUgUE41NDRfTExDX01BWF9IQ0lfU0laRQkoUE41NDRfTExDX01BWF9EQVRBIC0gMikKKworc3RydWN0IHBuNTQ0X2xsY19wYWNrZXQgeworCXVuc2lnbmVkIGNoYXIgbGVuZ3RoOyAvKiBvZiByZXN0IG9mIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgaGVhZGVyOworCXVuc2lnbmVkIGNoYXIgZGF0YVtQTjU0NF9MTENfTUFYX0RBVEFdOyAvKiBpbmNsdWRlcyBjcmMtY2NpdHQgKi8KK307CisKKy8qIEZpcm13YXJlIHVwZ3JhZGUgbW9kZSAqLworI2RlZmluZSBQTjU0NF9GV19IRUFERVJfU0laRQkzCisvKiBtYXggZncgdHJhbnNmZXIgaXMgMTAyNGJ5dGVzLCBidXQgSTJDIGxpbWl0cyBpdCB0byAweEMwICovCisjZGVmaW5lIFBONTQ0X01BWF9GV19EQVRBCShQTjU0NF9NQVhfSTJDX1RSQU5TRkVSIC0gUE41NDRfRldfSEVBREVSX1NJWkUpCisKK3N0cnVjdCBwbjU0NF9md19wYWNrZXQgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsgLyogc3RhdHVzIGluIGFuc3dlciAqLworCXVuc2lnbmVkIGNoYXIgbGVuZ3RoWzJdOyAvKiBiaWctZW5kaWFuIG9yZGVyIChtc2YpICovCisJdW5zaWduZWQgY2hhciBkYXRhW1BONTQ0X01BWF9GV19EQVRBXTsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBib2FyZCBjb25maWcgKi8KK3N0cnVjdCBwbjU0NF9uZmNfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqcmVxdWVzdF9yZXNvdXJjZXMpIChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKwl2b2lkICgqZnJlZV9yZXNvdXJjZXMpICh2b2lkKTsKKwl2b2lkICgqZW5hYmxlKSAoaW50IGZ3KTsKKwlpbnQgKCp0ZXN0KSAodm9pZCk7CisJdm9pZCAoKmRpc2FibGUpICh2b2lkKTsKK307CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX1BONTQ0X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczMuaCBiL2luY2x1ZGUvbGludXgvbmZzMy5oCmluZGV4IGFjMzM4MDYuLjZjY2ZlM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzMy5oCkBAIC0xMSw2ICsxMSw5IEBACiAjZGVmaW5lIE5GUzNfTUFYR1JPVVBTCQkxNgogI2RlZmluZSBORlMzX0ZIU0laRQkJNjQKICNkZWZpbmUgTkZTM19DT09LSUVTSVpFCQk0CisjZGVmaW5lIE5GUzNfQ1JFQVRFVkVSRlNJWkUJOAorI2RlZmluZSBORlMzX0NPT0tJRVZFUkZTSVpFCTgKKyNkZWZpbmUgTkZTM19XUklURVZFUkZTSVpFCTgKICNkZWZpbmUgTkZTM19GSUZPX0RFVgkJKC0xKQogI2RlZmluZSBORlMzTU9ERV9GTVQJCTAxNzAwMDAKICNkZWZpbmUgTkZTM01PREVfRElSCQkwMDQwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczQuaCBiL2luY2x1ZGUvbGludXgvbmZzNC5oCmluZGV4IDQ5MjViMjIuLjEzNDcxNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzNC5oCkBAIC02NSw2ICs2NSw5IEBACiAKICNkZWZpbmUgTkZTNF9DREZDNF9GT1JFCTB4MQogI2RlZmluZSBORlM0X0NERkM0X0JBQ0sgMHgyCisjZGVmaW5lIE5GUzRfQ0RGQzRfQk9USCAweDMKKyNkZWZpbmUgTkZTNF9DREZDNF9GT1JFX09SX0JPVEggMHgzCisjZGVmaW5lIE5GUzRfQ0RGQzRfQkFDS19PUl9CT1RIIDB4NwogCiAjZGVmaW5lIE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FCTAKICNkZWZpbmUgTkZTNF9TRVRfVE9fQ0xJRU5UX1RJTUUJMQpAQCAtMTExLDkgKzExNCwxMyBAQAogCiAjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfU1VQUF9NT1ZFRF9SRUZFUgkJMHgwMDAwMDAwMQogI2RlZmluZSBFWENIR0lENF9GTEFHX1NVUFBfTU9WRURfTUlHUgkJMHgwMDAwMDAwMgorI2RlZmluZSBFWENIR0lENF9GTEFHX0JJTkRfUFJJTkNfU1RBVEVJRAkweDAwMDAwMTAwCisKICNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfTk9OX1BORlMJCTB4MDAwMTAwMDAKICNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19NRFMJCTB4MDAwMjAwMDAKICNkZWZpbmUgRVhDSEdJRDRfRkxBR19VU0VfUE5GU19EUwkJMHgwMDA0MDAwMAorI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfUE5GUwkJCTB4MDAwNzAwMDAKKwogI2RlZmluZSBFWENIR0lENF9GTEFHX1VQRF9DT05GSVJNRURfUkVDX0EJMHg0MDAwMDAwMAogI2RlZmluZSBFWENIR0lENF9GTEFHX0NPTkZJUk1FRF9SCQkweDgwMDAwMDAwCiAvKgpAQCAtMTIxLDggKzEyOCw4IEBACiAgKiB0aGV5J3JlIHNldCBpbiB0aGUgYXJndW1lbnQgb3IgcmVzcG9uc2UsIGhhdmUgc2VwYXJhdGUKICAqIGludmFsaWQgZmxhZyBtYXNrcyBmb3IgYXJnIChfQSkgYW5kIHJlc3AgKF9SKS4KICAqLwotI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfQQkJCTB4NDAwNzAwMDMKLSNkZWZpbmUgRVhDSEdJRDRfRkxBR19NQVNLX1IJCQkweDgwMDcwMDAzCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19BCQkJMHg0MDA3MDEwMworI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfUgkJCTB4ODAwNzAxMDMKIAogI2RlZmluZSBTRVE0X1NUQVRVU19DQl9QQVRIX0RPV04JCTB4MDAwMDAwMDEKICNkZWZpbmUgU0VRNF9TVEFUVVNfQ0JfR1NTX0NPTlRFWFRTX0VYUElSSU5HCTB4MDAwMDAwMDIKQEAgLTEzNiw2ICsxNDMsOSBAQAogI2RlZmluZSBTRVE0X1NUQVRVU19DQl9QQVRIX0RPV05fU0VTU0lPTgkweDAwMDAwMjAwCiAjZGVmaW5lIFNFUTRfU1RBVFVTX0JBQ0tDSEFOTkVMX0ZBVUxUCQkweDAwMDAwNDAwCiAKKyNkZWZpbmUgTkZTNF9TRUNJTkZPX1NUWUxFNF9DVVJSRU5UX0ZICTAKKyNkZWZpbmUgTkZTNF9TRUNJTkZPX1NUWUxFNF9QQVJFTlQJMQorCiAjZGVmaW5lIE5GUzRfTUFYX1VJTlQ2NAkofih1NjQpMCkKIAogLyogQW4gTkZTNCBzZXNzaW9ucyBzZXJ2ZXIgbXVzdCBzdXBwb3J0IGF0IGxlYXN0IE5GUzRfTUFYX09QUyBvcGVyYXRpb25zLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNDUyZDk2NC4uYjE5NzU2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC00NywxMSArNDcsNiBAQAogCXU2NAkJCWNsX2NsaWVudGlkOwkvKiBjb25zdGFudCAqLwogCXVuc2lnbmVkIGxvbmcJCWNsX3N0YXRlOwogCi0Jc3RydWN0IHJiX3Jvb3QJCWNsX29wZW5vd25lcl9pZDsKLQlzdHJ1Y3QgcmJfcm9vdAkJY2xfbG9ja293bmVyX2lkOwotCi0Jc3RydWN0IGxpc3RfaGVhZAljbF9kZWxlZ2F0aW9uczsKLQlzdHJ1Y3QgcmJfcm9vdAkJY2xfc3RhdGVfb3duZXJzOwogCXNwaW5sb2NrX3QJCWNsX2xvY2s7CiAKIAl1bnNpZ25lZCBsb25nCQljbF9sZWFzZV90aW1lOwpAQCAtNzEsNiArNjYsNyBAQAogCSAqLwogCWNoYXIJCQljbF9pcGFkZHJbNDhdOwogCXVuc2lnbmVkIGNoYXIJCWNsX2lkX3VuaXF1aWZpZXI7CisJdTMyCQkJY2xfY2JfaWRlbnQ7CS8qIHY0LjAgY2FsbGJhY2sgaWRlbnRpZmllciAqLwogCWNvbnN0IHN0cnVjdCBuZnM0X21pbm9yX3ZlcnNpb25fb3BzICpjbF9tdm9wczsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKQEAgLTE0OCw3ICsxNDQsMTQgQEAKIAkJCQkJCSAgIHRoYXQgYXJlIHN1cHBvcnRlZCBvbiB0aGlzCiAJCQkJCQkgICBmaWxlc3lzdGVtICovCiAJc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgICpwbmZzX2N1cnJfbGQ7IC8qIEFjdGl2ZSBsYXlvdXQgZHJpdmVyICovCisJc3RydWN0IHJwY193YWl0X3F1ZXVlCXJvY19ycGN3YWl0cTsKKworCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgbmZzX2NsaWVudC0+Y2xfbG9jayAqLworCXN0cnVjdCByYl9yb290CQlzdGF0ZV9vd25lcnM7CisJc3RydWN0IHJiX3Jvb3QJCW9wZW5vd25lcl9pZDsKKwlzdHJ1Y3QgcmJfcm9vdAkJbG9ja293bmVyX2lkOwogI2VuZGlmCisJc3RydWN0IGxpc3RfaGVhZAlkZWxlZ2F0aW9uczsKIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiAKIAlhdG9taWNfdCBhY3RpdmU7IC8qIEtlZXAgdHJhY2Ugb2YgYW55IGFjdGl2aXR5IHRvIHRoaXMgc2VydmVyICovCkBAIC0xOTYsNiArMTk5LDcgQEAKIAkJCQkJCSAqIG9wIGZvciBkeW5hbWljIHJlc2l6aW5nICovCiAJaW50CQl0YXJnZXRfbWF4X3Nsb3RzOwkvKiBTZXQgYnkgQ0JfUkVDQUxMX1NMT1QgYXMKIAkJCQkJCSAqIHRoZSBuZXcgbWF4X3Nsb3RzICovCisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBzbG90X2lkeChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNwKQpAQCAtMjEyLDcgKzIxNiw2IEBACiAJdW5zaWduZWQgbG9uZwkJCXNlc3Npb25fc3RhdGU7CiAJdTMyCQkJCWhhc2hfYWxnOwogCXUzMgkJCQlzc3ZfbGVuOwotCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKIAogCS8qIFRoZSBmb3JlIGFuZCBiYWNrIGNoYW5uZWwgKi8KIAlzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzCWZjX2F0dHJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA4MGYwNzE5Li5iMDA2ODU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMjA4LDYgKzIwOCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OwogCXN0cnVjdCBuZnM0X3NlcXVlbmNlX2FyZ3Mgc2VxX2FyZ3M7CisJbmZzNF9zdGF0ZWlkIHN0YXRlaWQ7CiB9OwogCiBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfcmVzIHsKQEAgLTIyMyw3ICsyMjQsNiBAQAogCXN0cnVjdCBuZnM0X2xheW91dGdldF9hcmdzIGFyZ3M7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyByZXM7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKipsc2VncHA7Ci0JaW50IHN0YXR1czsKIH07CiAKIHN0cnVjdCBuZnM0X2dldGRldmljZWluZm9fYXJncyB7CkBAIC0zMTcsNiArMzE3LDcgQEAKIHN0cnVjdCBuZnNfbG93bmVyIHsKIAlfX3U2NAkJCWNsaWVudGlkOwogCV9fdTY0CQkJaWQ7CisJZGV2X3QJCQlzX2RldjsKIH07CiAKIHN0cnVjdCBuZnNfbG9ja19hcmdzIHsKQEAgLTQ4NCw2ICs0ODUsNyBAQAogCXN0cnVjdCBuZnNfZmggKgkJZmg7CiAJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyOwogCXVuc2lnbmVkIGNoYXIJCWRfdHlwZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqCXNlcnZlcjsKIH07CiAKIC8qCkBAIC0xMDg5LDcgKzEwOTEsNyBAQAogCWludAkoKnBhdGhjb25mKSAoc3RydWN0IG5mc19zZXJ2ZXIgKiwgc3RydWN0IG5mc19maCAqLAogCQkJICAgICBzdHJ1Y3QgbmZzX3BhdGhjb25mICopOwogCWludAkoKnNldF9jYXBhYmlsaXRpZXMpKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBuZnNfZmggKik7Ci0JX19iZTMyICooKmRlY29kZV9kaXJlbnQpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50IHBsdXMpOworCWludAkoKmRlY29kZV9kaXJlbnQpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIAl2b2lkCSgqcmVhZF9zZXR1cCkgICAoc3RydWN0IG5mc19yZWFkX2RhdGEgKiwgc3RydWN0IHJwY19tZXNzYWdlICopOwogCWludAkoKnJlYWRfZG9uZSkgIChzdHJ1Y3QgcnBjX3Rhc2sgKiwgc3RydWN0IG5mc19yZWFkX2RhdGEgKik7CiAJdm9pZAkoKndyaXRlX3NldHVwKSAgKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqLCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmggYi9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKaW5kZXggOGFlNzhhNi4uYmQzMTYxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBORlNFWFBfTk9ISURFCQkweDAyMDAKICNkZWZpbmUgTkZTRVhQX05PU1VCVFJFRUNIRUNLCTB4MDQwMAogI2RlZmluZQlORlNFWFBfTk9BVVRITkxNCTB4MDgwMAkJLyogRG9uJ3QgYXV0aGVudGljYXRlIE5MTSByZXF1ZXN0cyAtIGp1c3QgdHJ1c3QgKi8KLSNkZWZpbmUgTkZTRVhQX01TTkZTCQkweDEwMDAJLyogZG8gc2lsbHkgdGhpbmdzIHRoYXQgTVMgY2xpZW50cyBleHBlY3QgKi8KKyNkZWZpbmUgTkZTRVhQX01TTkZTCQkweDEwMDAJLyogZG8gc2lsbHkgdGhpbmdzIHRoYXQgTVMgY2xpZW50cyBleHBlY3Q7IG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgTkZTRVhQX0ZTSUQJCTB4MjAwMAogI2RlZmluZQlORlNFWFBfQ1JPU1NNT1VOVAkweDQwMDAKICNkZWZpbmUJTkZTRVhQX05PQUNMCQkweDgwMDAJLyogcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIEFDTCByZWxhdGVkIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9hZGRyZXNzLmggYi9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaAppbmRleCA4YWVhMDZmLi4yZmVkYTZlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9hZGRyZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9hZGRyZXNzLmgKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAotZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCB1MzIgKmFkZHIpOworZXh0ZXJuIHU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBfX2JlMzIgKmFkZHIpOwogZXh0ZXJuIGludCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCiAJCQkJICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqb2ZfaW9tYXAoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsIGludCBpbmRleCk7CkBAIC0yMSw3ICsyMSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiBjb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywKK2V4dGVybiBjb25zdCBfX2JlMzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywKIAkJCSAgICAgICB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpOwogZXh0ZXJuIGludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKIAkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOwpAQCAtMzIsNyArMzIsNyBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIGNvbnN0IHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAorc3RhdGljIGlubGluZSBjb25zdCBfX2JlMzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKIAkJaW50IGJhcl9ubywgdTY0ICpzaXplLCB1bnNpZ25lZCBpbnQgKmZsYWdzKQogewogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9mZHQuaCBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKaW5kZXggN2JiZjViMy4uMGVmMjJhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9mZHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCkBAIC01OCw2ICs1OCwyMyBAQAogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRUUkVFKQorCitzdHJ1Y3QgZGV2aWNlX25vZGU7CisKKy8qIEZvciBzY2FubmluZyBhbiBhcmJpdHJhcnkgZGV2aWNlLXRyZWUgYXQgYW55IHRpbWUgKi8KK2V4dGVybiBjaGFyICpvZl9mZHRfZ2V0X3N0cmluZyhzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsIHUzMiBvZmZzZXQpOworZXh0ZXJuIHZvaWQgKm9mX2ZkdF9nZXRfcHJvcGVydHkoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpibG9iLAorCQkJCSB1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpOworZXh0ZXJuIGludCBvZl9mZHRfaXNfY29tcGF0aWJsZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkJdW5zaWduZWQgbG9uZyBub2RlLAorCQkJCWNvbnN0IGNoYXIgKmNvbXBhdCk7CitleHRlcm4gaW50IG9mX2ZkdF9tYXRjaChzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsIHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCWNvbnN0IGNoYXIgKipjb21wYXQpOworZXh0ZXJuIHZvaWQgb2ZfZmR0X3VuZmxhdHRlbl90cmVlKHVuc2lnbmVkIGxvbmcgKmJsb2IsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICoqbXlub2Rlcyk7CisKIC8qIFRCRDogVGVtcG9yYXJ5IGV4cG9ydCBvZiBmZHQgZ2xvYmFscyAtIHJlbW92ZSB3aGVuIGNvZGUgZnVsbHkgbWVyZ2VkICovCiBleHRlcm4gaW50IF9faW5pdGRhdGEgZHRfcm9vdF9hZGRyX2NlbGxzOwogZXh0ZXJuIGludCBfX2luaXRkYXRhIGR0X3Jvb3Rfc2l6ZV9jZWxsczsKQEAgLTcxLDYgKzg4LDcgQEAKIGV4dGVybiB2b2lkICpvZl9nZXRfZmxhdF9kdF9wcm9wKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CiBleHRlcm4gaW50IG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZSh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBvZl9mbGF0X2R0X21hdGNoKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqKm1hdGNoZXMpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb2ZfZ2V0X2ZsYXRfZHRfcm9vdCh2b2lkKTsKIAogZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqdW5hbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX25ldC5oIGIvaW5jbHVkZS9saW51eC9vZl9uZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEzMDgxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vZl9uZXQuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogT0YgaGVscGVycyBmb3IgbmV0d29yayBkZXZpY2VzLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqLworCisjaWZuZGVmIF9fTElOVVhfT0ZfTkVUX0gKKyNkZWZpbmUgX19MSU5VWF9PRl9ORVRfSAorCisjaWZkZWYgQ09ORklHX09GX05FVAorI2luY2x1ZGUgPGxpbnV4L29mLmg+CitleHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0xJTlVYX09GX05FVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IDVmMzhjNDYuLjBkYjgwMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC00OCw5ICs0OCw2IEBACiAgKiBzdHJ1Y3QgcGFnZSAodGhlc2UgYml0cyB3aXRoIGluZm9ybWF0aW9uKSBhcmUgYWx3YXlzIG1hcHBlZCBpbnRvIGtlcm5lbAogICogYWRkcmVzcyBzcGFjZS4uLgogICoKLSAqIFBHX2J1ZGR5IGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYWdlIGlzIGZyZWUgYW5kIGluIHRoZSBidWRkeSBzeXN0ZW0KLSAqIChzZWUgbW0vcGFnZV9hbGxvYy5jKS4KLSAqCiAgKiBQR19od3BvaXNvbiBpbmRpY2F0ZXMgdGhhdCBhIHBhZ2UgZ290IGNvcnJ1cHRlZCBpbiBoYXJkd2FyZSBhbmQgY29udGFpbnMKICAqIGRhdGEgd2l0aCBpbmNvcnJlY3QgRUNDIGJpdHMgdGhhdCB0cmlnZ2VyZWQgYSBtYWNoaW5lIGNoZWNrLiBBY2Nlc3NpbmcgaXMKICAqIG5vdCBzYWZlIHNpbmNlIGl0IG1heSBjYXVzZSBhbm90aGVyIG1hY2hpbmUgY2hlY2suIERvbid0IHRvdWNoIQpAQCAtOTYsNyArOTMsNiBAQAogCVBHX3N3YXBjYWNoZSwJCS8qIFN3YXAgcGFnZTogc3dwX2VudHJ5X3QgaW4gcHJpdmF0ZSAqLwogCVBHX21hcHBlZHRvZGlzaywJLyogSGFzIGJsb2NrcyBhbGxvY2F0ZWQgb24tZGlzayAqLwogCVBHX3JlY2xhaW0sCQkvKiBUbyBiZSByZWNsYWltZWQgYXNhcCAqLwotCVBHX2J1ZGR5LAkJLyogUGFnZSBpcyBmcmVlLCBvbiBidWRkeSBsaXN0cyAqLwogCVBHX3N3YXBiYWNrZWQsCQkvKiBQYWdlIGlzIGJhY2tlZCBieSBSQU0vc3dhcCAqLwogCVBHX3VuZXZpY3RhYmxlLAkJLyogUGFnZSBpcyAidW5ldmljdGFibGUiICAqLwogI2lmZGVmIENPTkZJR19NTVUKQEAgLTEwOCw2ICsxMDQsOSBAQAogI2lmZGVmIENPTkZJR19NRU1PUllfRkFJTFVSRQogCVBHX2h3cG9pc29uLAkJLyogaGFyZHdhcmUgcG9pc29uZWQgcGFnZS4gRG9uJ3QgdG91Y2ggKi8KICNlbmRpZgorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCVBHX2NvbXBvdW5kX2xvY2ssCisjZW5kaWYKIAlfX05SX1BBR0VGTEFHUywKIAogCS8qIEZpbGVzeXN0ZW1zICovCkBAIC0xOTgsNyArMTk3LDcgQEAKIHN0cnVjdCBwYWdlOwkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCiAKIFRFU1RQQUdFRkxBRyhMb2NrZWQsIGxvY2tlZCkgVEVTVFNFVEZMQUcoTG9ja2VkLCBsb2NrZWQpCi1QQUdFRkxBRyhFcnJvciwgZXJyb3IpCitQQUdFRkxBRyhFcnJvciwgZXJyb3IpIFRFU1RDTEVBUkZMQUcoRXJyb3IsIGVycm9yKQogUEFHRUZMQUcoUmVmZXJlbmNlZCwgcmVmZXJlbmNlZCkgVEVTVENMRUFSRkxBRyhSZWZlcmVuY2VkLCByZWZlcmVuY2VkKQogUEFHRUZMQUcoRGlydHksIGRpcnR5KSBURVNUU0NGTEFHKERpcnR5LCBkaXJ0eSkgX19DTEVBUlBBR0VGTEFHKERpcnR5LCBkaXJ0eSkKIFBBR0VGTEFHKExSVSwgbHJ1KSBfX0NMRUFSUEFHRUZMQUcoTFJVLCBscnUpCkBAIC0yMzAsNyArMjI5LDYgQEAKICAqIHJpc2t5OiB0aGV5IGJ5cGFzcyBwYWdlIGFjY291bnRpbmcuCiAgKi8KIFRFU1RQQUdFRkxBRyhXcml0ZWJhY2ssIHdyaXRlYmFjaykgVEVTVFNDRkxBRyhXcml0ZWJhY2ssIHdyaXRlYmFjaykKLV9fUEFHRUZMQUcoQnVkZHksIGJ1ZGR5KQogUEFHRUZMQUcoTWFwcGVkVG9EaXNrLCBtYXBwZWR0b2Rpc2spCiAKIC8qIFBHX3JlYWRhaGVhZCBpcyBvbmx5IHVzZWQgZm9yIGZpbGUgcmVhZHM7IFBHX3JlY2xhaW0gaXMgb25seSBmb3Igd3JpdGVzICovCkBAIC0zNDQsNyArMzQyLDcgQEAKICAqIHRlc3RzIGNhbiBiZSB1c2VkIGluIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBwYXRocy4gUGFnZUNvbXBvdW5kIGlzCiAgKiBnZW5lcmFsbHkgbm90IHVzZWQgaW4gaG90IGNvZGUgcGF0aHMuCiAgKi8KLV9fUEFHRUZMQUcoSGVhZCwgaGVhZCkKK19fUEFHRUZMQUcoSGVhZCwgaGVhZCkgQ0xFQVJQQUdFRkxBRyhIZWFkLCBoZWFkKQogX19QQUdFRkxBRyhUYWlsLCB0YWlsKQogCiBzdGF0aWMgaW5saW5lIGludCBQYWdlQ29tcG91bmQoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0zNTIsNiArMzUwLDEzIEBACiAJcmV0dXJuIHBhZ2UtPmZsYWdzICYgKCgxTCA8PCBQR19oZWFkKSB8ICgxTCA8PCBQR190YWlsKSk7CiAKIH0KKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKK3N0YXRpYyBpbmxpbmUgdm9pZCBDbGVhclBhZ2VDb21wb3VuZChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlCVUdfT04oIVBhZ2VIZWFkKHBhZ2UpKTsKKwlDbGVhclBhZ2VIZWFkKHBhZ2UpOworfQorI2VuZGlmCiAjZWxzZQogLyoKICAqIFJlZHVjZSBwYWdlIGZsYWcgdXNlIGFzIG11Y2ggYXMgcG9zc2libGUgYnkgb3ZlcmxhcHBpbmcKQEAgLTM4OSwxNCArMzk0LDYxIEBACiAJcGFnZS0+ZmxhZ3MgJj0gflBHX2hlYWRfdGFpbF9tYXNrOwogfQogCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCitzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXJQYWdlQ29tcG91bmQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQlVHX09OKChwYWdlLT5mbGFncyAmIFBHX2hlYWRfdGFpbF9tYXNrKSAhPSAoMSA8PCBQR19jb21wb3VuZCkpOworCWNsZWFyX2JpdChQR19jb21wb3VuZCwgJnBhZ2UtPmZsYWdzKTsKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogIVBBR0VGTEFHU19FWFRFTkRFRCAqLwogCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisvKgorICogUGFnZUh1Z2UoKSBvbmx5IHJldHVybnMgdHJ1ZSBmb3IgaHVnZXRsYmZzIHBhZ2VzLCBidXQgbm90IGZvcgorICogbm9ybWFsIG9yIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMuCisgKgorICogUGFnZVRyYW5zSHVnZSgpIHJldHVybnMgdHJ1ZSBmb3IgYm90aCB0cmFuc3BhcmVudCBodWdlIGFuZAorICogaHVnZXRsYmZzIHBhZ2VzLCBidXQgbm90IG5vcm1hbCBwYWdlcy4gUGFnZVRyYW5zSHVnZSgpIGNhbiBvbmx5IGJlCisgKiBjYWxsZWQgb25seSBpbiB0aGUgY29yZSBWTSBwYXRocyB3aGVyZSBodWdldGxiZnMgcGFnZXMgY2FuJ3QgZXhpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VUcmFuc0h1Z2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJVk1fQlVHX09OKFBhZ2VUYWlsKHBhZ2UpKTsKKwlyZXR1cm4gUGFnZUhlYWQocGFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VUcmFuc0NvbXBvdW5kKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBQYWdlQ29tcG91bmQocGFnZSk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VUcmFuc0h1Z2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VUcmFuc0NvbXBvdW5kKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTU1VCiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJKDEgPDwgUEdfbWxvY2tlZCkKICNlbHNlCiAjZGVmaW5lIF9fUEdfTUxPQ0tFRAkJMAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKyNkZWZpbmUgX19QR19DT01QT1VORF9MT0NLCQkoMSA8PCBQR19jb21wb3VuZF9sb2NrKQorI2Vsc2UKKyNkZWZpbmUgX19QR19DT01QT1VORF9MT0NLCQkwCisjZW5kaWYKKwogLyoKICAqIEZsYWdzIGNoZWNrZWQgd2hlbiBhIHBhZ2UgaXMgZnJlZWQuICBQYWdlcyBiZWluZyBmcmVlZCBzaG91bGQgbm90IGhhdmUKICAqIHRoZXNlIGZsYWdzIHNldC4gIEl0IHRoZXkgYXJlLCB0aGVyZSBpcyBhIHByb2JsZW0uCkBAIC00MDQsOSArNDU2LDEwIEBACiAjZGVmaW5lIFBBR0VfRkxBR1NfQ0hFQ0tfQVRfRlJFRSBcCiAJKDEgPDwgUEdfbHJ1CSB8IDEgPDwgUEdfbG9ja2VkICAgIHwgXAogCSAxIDw8IFBHX3ByaXZhdGUgfCAxIDw8IFBHX3ByaXZhdGVfMiB8IFwKLQkgMSA8PCBQR19idWRkeQkgfCAxIDw8IFBHX3dyaXRlYmFjayB8IDEgPDwgUEdfcmVzZXJ2ZWQgfCBcCisJIDEgPDwgUEdfd3JpdGViYWNrIHwgMSA8PCBQR19yZXNlcnZlZCB8IFwKIAkgMSA8PCBQR19zbGFiCSB8IDEgPDwgUEdfc3dhcGNhY2hlIHwgMSA8PCBQR19hY3RpdmUgfCBcCi0JIDEgPDwgUEdfdW5ldmljdGFibGUgfCBfX1BHX01MT0NLRUQgfCBfX1BHX0hXUE9JU09OKQorCSAxIDw8IFBHX3VuZXZpY3RhYmxlIHwgX19QR19NTE9DS0VEIHwgX19QR19IV1BPSVNPTiB8IFwKKwkgX19QR19DT01QT1VORF9MT0NLKQogCiAvKgogICogRmxhZ3MgY2hlY2tlZCB3aGVuIGEgcGFnZSBpcyBwcmVwcGVkIGZvciByZXR1cm4gYnkgdGhlIHBhZ2UgYWxsb2NhdG9yLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oIGIvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oCmluZGV4IGIwMjE5NWQuLjZkNmNiN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZV9jZ3JvdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmgKQEAgLTM1LDEyICszNSwxNSBAQAogCiBlbnVtIHsKIAkvKiBmbGFncyBmb3IgbWVtX2Nncm91cCAqLwotCVBDR19MT0NLLCAgLyogcGFnZSBjZ3JvdXAgaXMgbG9ja2VkICovCisJUENHX0xPQ0ssICAvKiBMb2NrIGZvciBwYy0+bWVtX2Nncm91cCBhbmQgZm9sbG93aW5nIGJpdHMuICovCiAJUENHX0NBQ0hFLCAvKiBjaGFyZ2VkIGFzIGNhY2hlICovCiAJUENHX1VTRUQsIC8qIHRoaXMgb2JqZWN0IGlzIGluIHVzZS4gKi8KLQlQQ0dfQUNDVF9MUlUsIC8qIHBhZ2UgaGFzIGJlZW4gYWNjb3VudGVkIGZvciAqLwotCVBDR19GSUxFX01BUFBFRCwgLyogcGFnZSBpcyBhY2NvdW50ZWQgYXMgIm1hcHBlZCIgKi8KIAlQQ0dfTUlHUkFUSU9OLCAvKiB1bmRlciBwYWdlIG1pZ3JhdGlvbiAqLworCS8qIGZsYWdzIGZvciBtZW1fY2dyb3VwIGFuZCBmaWxlIGFuZCBJL08gc3RhdHVzICovCisJUENHX01PVkVfTE9DSywgLyogRm9yIHJhY2UgYmV0d2VlbiBtb3ZlX2FjY291bnQgdi5zLiBmb2xsb3dpbmcgYml0cyAqLworCVBDR19GSUxFX01BUFBFRCwgLyogcGFnZSBpcyBhY2NvdW50ZWQgYXMgIm1hcHBlZCIgKi8KKwkvKiBObyBsb2NrIGluIHBhZ2VfY2dyb3VwICovCisJUENHX0FDQ1RfTFJVLCAvKiBwYWdlIGhhcyBiZWVuIGFjY291bnRlZCBmb3IgKHVuZGVyIGxydV9sb2NrKSAqLwogfTsKIAogI2RlZmluZSBURVNUUENHRkxBRyh1bmFtZSwgbG5hbWUpCQkJXApAQCAtOTQsNiArOTcsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGxvY2tfcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKIHsKKwkvKgorCSAqIERvbid0IHRha2UgdGhpcyBsb2NrIGluIElSUSBjb250ZXh0LgorCSAqIFRoaXMgbG9jayBpcyBmb3IgcGMtPm1lbV9jZ3JvdXAsIFVTRUQsIENBQ0hFLCBNSUdSQVRJT04KKwkgKi8KIAliaXRfc3Bpbl9sb2NrKFBDR19MT0NLLCAmcGMtPmZsYWdzKTsKIH0KIApAQCAtMTA3LDYgKzExNCwyNCBAQAogCXJldHVybiBiaXRfc3Bpbl9pc19sb2NrZWQoUENHX0xPQ0ssICZwYy0+ZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV9sb2NrX3BhZ2VfY2dyb3VwKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCisJdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJLyoKKwkgKiBXZSBrbm93IHVwZGF0ZXMgdG8gcGMtPmZsYWdzIG9mIHBhZ2UgY2FjaGUncyBzdGF0cyBhcmUgZnJvbSBib3RoIG9mCisJICogdXN1YWwgY29udGV4dCBvciBJUlEgY29udGV4dC4gRGlzYWJsZSBJUlEgdG8gYXZvaWQgZGVhZGxvY2suCisJICovCisJbG9jYWxfaXJxX3NhdmUoKmZsYWdzKTsKKwliaXRfc3Bpbl9sb2NrKFBDR19NT1ZFX0xPQ0ssICZwYy0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZV91bmxvY2tfcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwl1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwliaXRfc3Bpbl91bmxvY2soUENHX01PVkVfTE9DSywgJnBjLT5mbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoKmZsYWdzKTsKK30KKwogI2Vsc2UgLyogQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIgKi8KIHN0cnVjdCBwYWdlX2Nncm91cDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlbWFwLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaAppbmRleCAyZDFmZmUzLi45YzY2ZTk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBtYXBwaW5nX3VuZXZpY3RhYmxlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQogewotCWlmIChsaWtlbHkobWFwcGluZykpCisJaWYgKG1hcHBpbmcpCiAJCXJldHVybiB0ZXN0X2JpdChBU19VTkVWSUNUQUJMRSwgJm1hcHBpbmctPmZsYWdzKTsKIAlyZXR1cm4gISFtYXBwaW5nOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oIGIvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCmluZGV4IGM4YjY0NzMuLjQ3OWQ5YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKQEAgLTQwLDQgKzQwLDEwIEBACiB7IHJldHVybiBOVUxMOyB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BQ1BJX0FQRUkKK2V4dGVybiBib29sIGFlcl9hY3BpX2Zpcm13YXJlX2ZpcnN0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBhZXJfYWNwaV9maXJtd2FyZV9maXJzdCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKICNlbmRpZgkvKiBfUENJX0FDUElfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWFzcG0uaCBiL2luY2x1ZGUvbGludXgvcGNpLWFzcG0uaAppbmRleCA5MWJhMGIzLi5jZTY4MTA1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2ktYXNwbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLWFzcG0uaApAQCAtMjcsNiArMjcsNyBAQAogZXh0ZXJuIHZvaWQgcGNpZV9hc3BtX2V4aXRfbGlua19zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiBleHRlcm4gdm9pZCBwY2llX2FzcG1fcG1fc3RhdGVfY2hhbmdlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9kaXNhYmxlX2xpbmtfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBzdGF0ZSk7CitleHRlcm4gdm9pZCBwY2llX2NsZWFyX2FzcG0odm9pZCk7CiBleHRlcm4gdm9pZCBwY2llX25vX2FzcG0odm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHBjaWVfYXNwbV9pbml0X2xpbmtfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC00MSw3ICs0Miw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2Rpc2FibGVfbGlua19zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHN0YXRlKQogewogfQotCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpZV9jbGVhcl9hc3BtKHZvaWQpCit7Cit9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpZV9ub19hc3BtKHZvaWQpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCA3NDU0NDA4Li45ZTY3ZGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTgwNiw3ICs4MDYsNyBAQAogCiAvKiBQb3dlciBtYW5hZ2VtZW50IHJlbGF0ZWQgcm91dGluZXMgKi8KIGludCBwY2lfc2F2ZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWludCBwY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3ZvaWQgcGNpX3Jlc3RvcmVfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgX19wY2lfY29tcGxldGVfcG93ZXJfdHJhbnNpdGlvbihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CiBpbnQgcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CiBwY2lfcG93ZXJfdCBwY2lfY2hvb3NlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CkBAIC04MjAsNyArODIwLDYgQEAKIGludCBwY2lfYmFja19mcm9tX3NsZWVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogYm9vbCBwY2lfZGV2X3J1bl93YWtlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogYm9vbCBwY2lfY2hlY2tfcG1lX3N0YXR1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLXZvaWQgcGNpX3dha2V1cF9ldmVudChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpX3BtZV93YWtldXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiBzdGF0aWMgaW5saW5lIGludCBwY2lfZW5hYmxlX3dha2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUsCkBAIC05OTQsNiArOTkzLDkgQEAKIGV4dGVybiBpbnQgcGNpX21zaV9lbmFibGVkKHZvaWQpOwogI2VuZGlmCiAKK2V4dGVybiBib29sIHBjaWVfcG9ydHNfZGlzYWJsZWQ7CitleHRlcm4gYm9vbCBwY2llX3BvcnRzX2F1dG87CisKICNpZm5kZWYgQ09ORklHX1BDSUVBU1BNCiBzdGF0aWMgaW5saW5lIGludCBwY2llX2FzcG1fZW5hYmxlZCh2b2lkKQogewpAQCAtMTAwMyw2ICsxMDA1LDE0IEBACiBleHRlcm4gaW50IHBjaWVfYXNwbV9lbmFibGVkKHZvaWQpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENJRUFFUgordm9pZCBwY2lfbm9fYWVyKHZvaWQpOworYm9vbCBwY2lfYWVyX2F2YWlsYWJsZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX25vX2Flcih2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBwY2lfYWVyX2F2YWlsYWJsZSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKICNpZm5kZWYgQ09ORklHX1BDSUVfRUNSQwogc3RhdGljIGlubGluZSB2b2lkIHBjaWVfc2V0X2VjcmNfY2hlY2tpbmcoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKQEAgLTExNjgsMTAgKzExNzgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwY2lfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXJldHVybiAwOwotfQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7IH0KIAogc3RhdGljIGlubGluZSBpbnQgcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggY2I4NDVjMTYuLjNhZGIwNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC01MTgsNiArNTE4LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTFIX05CX01JU0MJMHgxMzAzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzExSF9OQl9MSU5LCTB4MTMwNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfTUlTQwkweDE2MDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ05CMTdIX0YzCTB4MTcwMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRQkJMHgyMDAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFX0hPTUUJMHgyMDAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX1NDU0kJCTB4MjAyMApAQCAtMTY1MCw2ICsxNjUxLDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjgzNgkJMHg2ODM2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjgxMgkJMHg2ODcyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfNjkzMwkJMHg2OTMzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfODEyMAkJMHg4MTIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfODIyMAkJMHg4MjIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfODIyMQkJMHg4MjIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfODMyMAkJMHg4MzIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTzJfODMyMQkJMHg4MzIxCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF8zREZYCQkweDEyMWEKICNkZWZpbmUgUENJX0RFVklDRV9JRF8zREZYX1ZPT0RPTwkweDAwMDEKQEAgLTIzNjMsNiArMjM2OSwxMCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NECTB4MjM4MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyAweDIzODIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NUwkweDIzODMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4NV9NUwkweDIzODgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9TRAkweDIzOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QgMHgyMzkyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOTBfTVMJMHgyMzkzCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LT1JFTklYCQkweDE5ODIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9LT1JFTklYX0pFVENBUkRGMAkweDE2MDAKQEAgLTI0NjgsNyArMjQ3OCw4IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQ09VR0FSUE9JTlRfTFBDX01JTgkweDFjNDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9DT1VHQVJQT0lOVF9MUENfTUFYCTB4MWM1ZgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BBVFNCVVJHX1NNQlVTCTB4MWQyMgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BBVFNCVVJHX0xQQwkweDFkNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QQVRTQlVSR19MUENfMAkweDFkNDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9QQVRTQlVSR19MUENfMQkweDFkNDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzAJMHgyNDEwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8xCTB4MjQxMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMwkweDI0MTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAppbmRleCBhZjgzMDc2Li41YjdlNmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0zMDksNiArMzA5LDE0IEBACiAjZGVmaW5lIFBDSV9NU0lYX1BCQQkJOAogI2RlZmluZSAgUENJX01TSVhfRkxBR1NfQklSTUFTSwkoNyA8PCAwKQogCisvKiBNU0ktWCBlbnRyeSdzIGZvcm1hdCAqLworI2RlZmluZSBQQ0lfTVNJWF9FTlRSWV9TSVpFCQkxNgorI2RlZmluZSAgUENJX01TSVhfRU5UUllfTE9XRVJfQUREUgkwCisjZGVmaW5lICBQQ0lfTVNJWF9FTlRSWV9VUFBFUl9BRERSCTQKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX0RBVEEJCTgKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMCTEyCisjZGVmaW5lICAgUENJX01TSVhfRU5UUllfQ1RSTF9NQVNLQklUCTEKKwogLyogQ29tcGFjdFBDSSBIb3Rzd2FwIFJlZ2lzdGVyICovCiAKICNkZWZpbmUgUENJX0NIU1dQX0NTUgkJMgkvKiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KQEAgLTQ5Niw2ICs1MDQsOCBAQAogI2RlZmluZSAgUENJX0VYUF9SVENUTF9DUlNTVkUJMHgxMAkvKiBDUlMgU29mdHdhcmUgVmlzaWJpbGl0eSBFbmFibGUgKi8KICNkZWZpbmUgUENJX0VYUF9SVENBUAkJMzAJLyogUm9vdCBDYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgUENJX0VYUF9SVFNUQQkJMzIJLyogUm9vdCBTdGF0dXMgKi8KKyNkZWZpbmUgUENJX0VYUF9SVFNUQV9QTUUJMHgxMDAwMCAvKiBQTUUgc3RhdHVzICovCisjZGVmaW5lIFBDSV9FWFBfUlRTVEFfUEVORElORwkweDIwMDAwIC8qIFBNRSBwZW5kaW5nICovCiAjZGVmaW5lIFBDSV9FWFBfREVWQ0FQMgkJMzYJLyogRGV2aWNlIENhcGFiaWxpdGllcyAyICovCiAjZGVmaW5lICBQQ0lfRVhQX0RFVkNBUDJfQVJJCTB4MjAJLyogQWx0ZXJuYXRpdmUgUm91dGluZy1JRCAqLwogI2RlZmluZSBQQ0lfRVhQX0RFVkNUTDIJCTQwCS8qIERldmljZSBDb250cm9sIDIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmggYi9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCmluZGV4IGJiMjdkN2UuLjc3MjU3YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaApAQCAtMzAsNiArMzAsNyBAQAogICoJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAtIGEgbGludXgga2VybmVsIHBpcGUKICAqCUB3YWl0OiByZWFkZXIvd3JpdGVyIHdhaXQgcG9pbnQgaW4gY2FzZSBvZiBlbXB0eS9mdWxsIHBpcGUKICAqCUBucmJ1ZnM6IHRoZSBudW1iZXIgb2Ygbm9uLWVtcHR5IHBpcGUgYnVmZmVycyBpbiB0aGlzIHBpcGUKKyAqCUBidWZmZXJzOiB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyAoc2hvdWxkIGJlIGEgcG93ZXIgb2YgMikKICAqCUBjdXJidWY6IHRoZSBjdXJyZW50IHBpcGUgYnVmZmVyIGVudHJ5CiAgKglAdG1wX3BhZ2U6IGNhY2hlZCByZWxlYXNlZCBwYWdlCiAgKglAcmVhZGVyczogbnVtYmVyIG9mIGN1cnJlbnQgcmVhZGVycyBvZiB0aGlzIHBpcGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA0MGYzZjQ1Li5kZDljN2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0zNjcsNDUgKzM2Nyw2IEBACiAJCQkJCXsgLmV2ZW50ID0gUE1fRVZFTlRfQVVUT19SRVNVTUUsIH0pCiAKIC8qKgotICogRGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGVzCi0gKgotICogVGhlc2Ugc3RhdGUgbGFiZWxzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFBNIGNvcmUgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQKLSAqIHN0YXR1cyBvZiBhIGRldmljZSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBNIGNvcmUgb3BlcmF0aW9ucy4KLSAqCi0gKiBEUE1fT04JCURldmljZSBpcyByZWdhcmRlZCBhcyBvcGVyYXRpb25hbC4gIFNldCB0aGlzIHdheQotICoJCQlpbml0aWFsbHkgYW5kIHdoZW4gLT5jb21wbGV0ZSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCQkJQWxzbyBzZXQgd2hlbiAtPnByZXBhcmUoKSBmYWlscy4KLSAqCi0gKiBEUE1fUFJFUEFSSU5HCURldmljZSBpcyBnb2luZyB0byBiZSBwcmVwYXJlZCBmb3IgYSBQTSB0cmFuc2l0aW9uLiAgU2V0Ci0gKgkJCXdoZW4gLT5wcmVwYXJlKCkgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLgotICoKLSAqIERQTV9SRVNVTUlORwkJRGV2aWNlIGlzIGdvaW5nIHRvIGJlIHJlc3VtZWQuICBTZXQgd2hlbiAtPnJlc3VtZSgpLAotICoJCQktPnRoYXcoKSwgb3IgLT5yZXN0b3JlKCkgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLgotICoKLSAqIERQTV9TVVNQRU5ESU5HCURldmljZSBoYXMgYmVlbiBwcmVwYXJlZCBmb3IgYSBwb3dlciB0cmFuc2l0aW9uLiAgU2V0Ci0gKgkJCXdoZW4gLT5wcmVwYXJlKCkgaGFzIGp1c3Qgc3VjY2VlZGVkLgotICoKLSAqIERQTV9PRkYJCURldmljZSBpcyByZWdhcmRlZCBhcyBpbmFjdGl2ZS4gIFNldCBpbW1lZGlhdGVseSBhZnRlcgotICoJCQktPnN1c3BlbmQoKSwgLT5mcmVlemUoKSwgb3IgLT5wb3dlcm9mZigpIGhhcyBzdWNjZWVkZWQuCi0gKgkJCUFsc28gc2V0IHdoZW4gLT5yZXN1bWUoKV9ub2lycSwgLT50aGF3X25vaXJxKCksIG9yCi0gKgkJCS0+cmVzdG9yZV9ub2lycSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBEUE1fT0ZGX0lSUQkJRGV2aWNlIGlzIGluIGEgImRlZXAgc2xlZXAiLiAgU2V0IGltbWVkaWF0ZWx5IGFmdGVyCi0gKgkJCS0+c3VzcGVuZF9ub2lycSgpLCAtPmZyZWV6ZV9ub2lycSgpLCBvcgotICoJCQktPnBvd2Vyb2ZmX25vaXJxKCkgaGFzIGp1c3Qgc3VjY2VlZGVkLgotICovCi0KLWVudW0gZHBtX3N0YXRlIHsKLQlEUE1fSU5WQUxJRCwKLQlEUE1fT04sCi0JRFBNX1BSRVBBUklORywKLQlEUE1fUkVTVU1JTkcsCi0JRFBNX1NVU1BFTkRJTkcsCi0JRFBNX09GRiwKLQlEUE1fT0ZGX0lSUSwKLX07Ci0KLS8qKgogICogRGV2aWNlIHJ1bi10aW1lIHBvd2VyIG1hbmFnZW1lbnQgc3RhdHVzLgogICoKICAqIFRoZXNlIHN0YXR1cyBsYWJlbHMgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUE0gY29yZSB0byBpbmRpY2F0ZSB0aGUKQEAgLTQ2Myw4ICs0MjQsOCBAQAogc3RydWN0IGRldl9wbV9pbmZvIHsKIAlwbV9tZXNzYWdlX3QJCXBvd2VyX3N0YXRlOwogCXVuc2lnbmVkIGludAkJY2FuX3dha2V1cDoxOwotCXVuc2lnbmVkCQlhc3luY19zdXNwZW5kOjE7Ci0JZW51bSBkcG1fc3RhdGUJCXN0YXR1czsJCS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCisJdW5zaWduZWQgaW50CQlhc3luY19zdXNwZW5kOjE7CisJdW5zaWduZWQgaW50CQlpbl9zdXNwZW5kOjE7CS8qIE93bmVkIGJ5IHRoZSBQTSBjb3JlICovCiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwpAQCAtNDg2LDYgKzQ0Nyw3IEBACiAJdW5zaWduZWQgaW50CQlydW5fd2FrZToxOwogCXVuc2lnbmVkIGludAkJcnVudGltZV9hdXRvOjE7CiAJdW5zaWduZWQgaW50CQlub19jYWxsYmFja3M6MTsKKwl1bnNpZ25lZCBpbnQJCWlycV9zYWZlOjE7CiAJdW5zaWduZWQgaW50CQl1c2VfYXV0b3N1c3BlbmQ6MTsKIAl1bnNpZ25lZCBpbnQJCXRpbWVyX2F1dG9zdXNwZW5kczoxOwogCWVudW0gcnBtX3JlcXVlc3QJcmVxdWVzdDsKQEAgLTYxMCw0ICs1NzIsMTEgQEAKICNkZWZpbmUgUE1fQVBNCTEKICNkZWZpbmUgUE1fQUNQSQkyCiAKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiAjZW5kaWYgLyogX0xJTlVYX1BNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oIGIvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKaW5kZXggZDE5ZjFjYy4uZDM0ZjA2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbV9ydW50aW1lLmgKQEAgLTQwLDYgKzQwLDcgQEAKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcG1fcnVudGltZV9ub19jYWxsYmFja3Moc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHBtX3J1bnRpbWVfaXJxX3NhZmUoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIF9fcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHVzZSk7CiBleHRlcm4gdm9pZCBwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBkZWxheSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBwbV9ydW50aW1lX2F1dG9zdXNwZW5kX2V4cGlyYXRpb24oc3RydWN0IGRldmljZSAqZGV2KTsKQEAgLTgxLDYgKzgyLDExIEBACiAJCSYmICFkZXYtPnBvd2VyLmRpc2FibGVfZGVwdGg7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBwbV9ydW50aW1lX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAhZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJQUNDRVNTX09OQ0UoZGV2LT5wb3dlci5sYXN0X2J1c3kpID0gamlmZmllczsKQEAgLTExOSwxMSArMTI1LDEzIEBACiBzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX3J1bl93YWtlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gZmFsc2U7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZpY2Vfc2V0X3J1bl93YWtlKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpIHt9CiBzdGF0aWMgaW5saW5lIGJvb2wgcG1fcnVudGltZV9zdXNwZW5kZWQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSBib29sIHBtX3J1bnRpbWVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBtX2dlbmVyaWNfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX2lycV9zYWZlKHN0cnVjdCBkZXZpY2UgKmRldikge30KIAogc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3RydWN0IGRldmljZSAqZGV2KSB7fQogc3RhdGljIGlubGluZSB2b2lkIF9fcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTk2LDYgKzIwNCwxMSBAQAogCXJldHVybiBfX3BtX3J1bnRpbWVfaWRsZShkZXYsIFJQTV9HRVRfUFVUKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcG1fcnVudGltZV9wdXRfc3luY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gX19wbV9ydW50aW1lX3N1c3BlbmQoZGV2LCBSUE1fR0VUX1BVVCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBtX3J1bnRpbWVfcHV0X3N5bmNfYXV0b3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBfX3BtX3J1bnRpbWVfc3VzcGVuZChkZXYsIFJQTV9HRVRfUFVUIHwgUlBNX0FVVE8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb2xsLmggYi9pbmNsdWRlL2xpbnV4L3BvbGwuaAppbmRleCA1NmU3NmFmLi4xYTJjY2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BvbGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BvbGwuaApAQCAtNTcsNyArNTcsNyBAQAogfTsKIAogLyoKLSAqIFN0cnVjdHVyZXMgYW5kIGhlbHBlcnMgZm9yIHN5c19wb2xsL3N5c19wb2xsCisgKiBTdHJ1Y3R1cmVzIGFuZCBoZWxwZXJzIGZvciBzZWxlY3QvcG9sbCBzeXNjYWxsCiAgKi8KIHN0cnVjdCBwb2xsX3dxdWV1ZXMgewogCXBvbGxfdGFibGUgcHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2dwaW8tY2hhcmdlci5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9ncGlvLWNoYXJnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFkZmUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9ncGlvLWNoYXJnZXIuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1BPV0VSX0dQSU9fQ0hBUkdFUl9IX18KKyNkZWZpbmUgX19MSU5VWF9QT1dFUl9HUElPX0NIQVJHRVJfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBncGlvX2NoYXJnZXJfcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtX2RhdGEgZm9yIGdwaW9fY2hhcmdlciBkZXZpY2VzCisgKiBAbmFtZToJCU5hbWUgZm9yIHRoZSBjaGFyZ2VycyBwb3dlcl9zdXBwbHkgZGV2aWNlCisgKiBAdHlwZToJCVR5cGUgb2YgdGhlIGNoYXJnZXIKKyAqIEBncGlvOgkJR1BJTyB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBjaGFyZ2VycyBzdGF0dXMKKyAqIEBncGlvX2FjdGl2ZV9sb3c6CVNob3VsZCBiZSBzZXQgdG8gMSBpZiB0aGUgR1BJTyBpcyBhY3RpdmUgbG93IG90aGVyd2lzZSAwCisgKiBAc3VwcGxpZWRfdG86CUFycmF5IG9mIGJhdHRlcnkgbmFtZXMgdG8gd2hpY2ggdGhpcyBjaGFyZ2VycyBzdXBwbGllcyBwb3dlcgorICogQG51bV9zdXBwbGljYW50czoJTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHN1cHBsaWVkX3RvIGFycmF5CisgKi8KK3N0cnVjdCBncGlvX2NoYXJnZXJfcGxhdGZvcm1fZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwllbnVtIHBvd2VyX3N1cHBseV90eXBlIHR5cGU7CisKKwlpbnQgZ3BpbzsKKwlpbnQgZ3Bpb19hY3RpdmVfbG93OworCisJY2hhciAqKnN1cHBsaWVkX3RvOworCXNpemVfdCBudW1fc3VwcGxpY2FudHM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5NWRlYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBGdWVsIGdhdWdlIGRyaXZlciBmb3IgTWF4aW0gMTcwNDIgLyA4OTY2IC8gODk5NworICogIE5vdGUgdGhhdCBNYXhpbSA4OTY2IGFuZCA4OTk3IGFyZSBtZmQgYW5kIHRoaXMgaXMgaXRzIHN1YmRldmljZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19NQVgxNzA0Ml9CQVRURVJZX0hfCisjZGVmaW5lIF9fTUFYMTcwNDJfQkFUVEVSWV9IXworCitzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSB7CisJYm9vbCBlbmFibGVfY3VycmVudF9zZW5zZTsKK307CisKKyNlbmRpZiAvKiBfX01BWDE3MDQyX0JBVFRFUllfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHBzLmggYi9pbmNsdWRlL2xpbnV4L3Bwcy5oCmluZGV4IDAxOTRhYjAuLmE5YmIxZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHBzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcHMuaApAQCAtMTE0LDExICsxMTQsMTggQEAKIAlzdHJ1Y3QgcHBzX2t0aW1lIHRpbWVvdXQ7CiB9OwogCitzdHJ1Y3QgcHBzX2JpbmRfYXJncyB7CisJaW50IHRzZm9ybWF0OwkvKiBmb3JtYXQgb2YgdGltZSBzdGFtcHMgKi8KKwlpbnQgZWRnZTsJLyogc2VsZWN0ZWQgZXZlbnQgdHlwZSAqLworCWludCBjb25zdW1lcjsJLyogc2VsZWN0ZWQga2VybmVsIGNvbnN1bWVyICovCit9OworCiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KIAogI2RlZmluZSBQUFNfR0VUUEFSQU1TCQlfSU9SKCdwJywgMHhhMSwgc3RydWN0IHBwc19rcGFyYW1zICopCiAjZGVmaW5lIFBQU19TRVRQQVJBTVMJCV9JT1coJ3AnLCAweGEyLCBzdHJ1Y3QgcHBzX2twYXJhbXMgKikKICNkZWZpbmUgUFBTX0dFVENBUAkJX0lPUigncCcsIDB4YTMsIGludCAqKQogI2RlZmluZSBQUFNfRkVUQ0gJCV9JT1dSKCdwJywgMHhhNCwgc3RydWN0IHBwc19mZGF0YSAqKQorI2RlZmluZSBQUFNfS0NfQklORAkJX0lPVygncCcsIDB4YTUsIHN0cnVjdCBwcHNfYmluZF9hcmdzICopCiAKICNlbmRpZiAvKiBfUFBTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bwc19rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgvcHBzX2tlcm5lbC5oCmluZGV4IGUwYTE5M2YuLjk0MDQ4NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHBzX2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHBzX2tlcm5lbC5oCkBAIC0xOCw2ICsxOCw5IEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpZm5kZWYgTElOVVhfUFBTX0tFUk5FTF9ICisjZGVmaW5lIExJTlVYX1BQU19LRVJORUxfSAorCiAjaW5jbHVkZSA8bGludXgvcHBzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CkBAIC0yOCwxOCArMzEsMjggQEAKICAqIEdsb2JhbCBkZWZpbmVzCiAgKi8KIAorc3RydWN0IHBwc19kZXZpY2U7CisKIC8qIFRoZSBzcGVjaWZpYyBQUFMgc291cmNlIGluZm8gKi8KIHN0cnVjdCBwcHNfc291cmNlX2luZm8gewogCWNoYXIgbmFtZVtQUFNfTUFYX05BTUVfTEVOXTsJCS8qIHNpbWJvbGljIG5hbWUgKi8KIAljaGFyIHBhdGhbUFBTX01BWF9OQU1FX0xFTl07CQkvKiBwYXRoIG9mIGNvbm5lY3RlZCBkZXZpY2UgKi8KIAlpbnQgbW9kZTsJCQkJLyogUFBTJ3MgYWxsb3dlZCBtb2RlICovCiAKLQl2b2lkICgqZWNobykoaW50IHNvdXJjZSwgaW50IGV2ZW50LCB2b2lkICpkYXRhKTsgLyogUFBTIGVjaG8gZnVuY3Rpb24gKi8KKwl2b2lkICgqZWNobykoc3RydWN0IHBwc19kZXZpY2UgKnBwcywKKwkJCWludCBldmVudCwgdm9pZCAqZGF0YSk7CS8qIFBQUyBlY2hvIGZ1bmN0aW9uICovCiAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9OwogCitzdHJ1Y3QgcHBzX2V2ZW50X3RpbWUgeworI2lmZGVmIENPTkZJR19OVFBfUFBTCisJc3RydWN0IHRpbWVzcGVjIHRzX3JhdzsKKyNlbmRpZiAvKiBDT05GSUdfTlRQX1BQUyAqLworCXN0cnVjdCB0aW1lc3BlYyB0c19yZWFsOworfTsKKwogLyogVGhlIG1haW4gc3RydWN0ICovCiBzdHJ1Y3QgcHBzX2RldmljZSB7CiAJc3RydWN0IHBwc19zb3VyY2VfaW5mbyBpbmZvOwkJLyogUFNTIHNvdXJjZSBpbmZvICovCkBAIC01MiwzOCArNjUsNTYgQEAKIAlzdHJ1Y3QgcHBzX2t0aW1lIGNsZWFyX3R1OwogCWludCBjdXJyZW50X21vZGU7CQkJLyogUFBTIG1vZGUgYXQgZXZlbnQgdGltZSAqLwogCi0JaW50IGdvOwkJCQkJLyogUFBTIGV2ZW50IGlzIGFycml2ZWQ/ICovCisJdW5zaWduZWQgaW50IGxhc3RfZXY7CQkJLyogbGFzdCBQUFMgZXZlbnQgaWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsJCS8qIFBQUyBldmVudCBxdWV1ZSAqLwogCiAJdW5zaWduZWQgaW50IGlkOwkJCS8qIFBQUyBzb3VyY2UgdW5pcXVlIElEICovCiAJc3RydWN0IGNkZXYgY2RldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IGRldm5vOwogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsJLyogZmFzeW5jIG1ldGhvZCAqLwogCXNwaW5sb2NrX3QgbG9jazsKLQotCWF0b21pY190IHVzYWdlOwkJCQkvKiB1c2FnZSBjb3VudCAqLwogfTsKIAogLyoKICAqIEdsb2JhbCB2YXJpYWJsZXMKICAqLwogCi1leHRlcm4gc3BpbmxvY2tfdCBwcHNfaWRyX2xvY2s7Ci1leHRlcm4gc3RydWN0IGlkciBwcHNfaWRyOwotZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBwcHNfaXJxX3RzW107Ci0KIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBwcHNfYXR0cnNbXTsKIAogLyoKICAqIEV4cG9ydGVkIGZ1bmN0aW9ucwogICovCiAKLXN0cnVjdCBwcHNfZGV2aWNlICpwcHNfZ2V0X3NvdXJjZShpbnQgc291cmNlKTsKLWV4dGVybiB2b2lkIHBwc19wdXRfc291cmNlKHN0cnVjdCBwcHNfZGV2aWNlICpwcHMpOwotZXh0ZXJuIGludCBwcHNfcmVnaXN0ZXJfc291cmNlKHN0cnVjdCBwcHNfc291cmNlX2luZm8gKmluZm8sCi0JCQkJaW50IGRlZmF1bHRfcGFyYW1zKTsKLWV4dGVybiB2b2lkIHBwc191bnJlZ2lzdGVyX3NvdXJjZShpbnQgc291cmNlKTsKK2V4dGVybiBzdHJ1Y3QgcHBzX2RldmljZSAqcHBzX3JlZ2lzdGVyX3NvdXJjZSgKKwkJc3RydWN0IHBwc19zb3VyY2VfaW5mbyAqaW5mbywgaW50IGRlZmF1bHRfcGFyYW1zKTsKK2V4dGVybiB2b2lkIHBwc191bnJlZ2lzdGVyX3NvdXJjZShzdHJ1Y3QgcHBzX2RldmljZSAqcHBzKTsKIGV4dGVybiBpbnQgcHBzX3JlZ2lzdGVyX2NkZXYoc3RydWN0IHBwc19kZXZpY2UgKnBwcyk7CiBleHRlcm4gdm9pZCBwcHNfdW5yZWdpc3Rlcl9jZGV2KHN0cnVjdCBwcHNfZGV2aWNlICpwcHMpOwotZXh0ZXJuIHZvaWQgcHBzX2V2ZW50KGludCBzb3VyY2UsIHN0cnVjdCBwcHNfa3RpbWUgKnRzLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgcHBzX2V2ZW50KHN0cnVjdCBwcHNfZGV2aWNlICpwcHMsCisJCXN0cnVjdCBwcHNfZXZlbnRfdGltZSAqdHMsIGludCBldmVudCwgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lc3BlY190b19wcHNfa3RpbWUoc3RydWN0IHBwc19rdGltZSAqa3QsCisJCXN0cnVjdCB0aW1lc3BlYyB0cykKK3sKKwlrdC0+c2VjID0gdHMudHZfc2VjOworCWt0LT5uc2VjID0gdHMudHZfbnNlYzsKK30KKworI2lmZGVmIENPTkZJR19OVFBfUFBTCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfZ2V0X3RzKHN0cnVjdCBwcHNfZXZlbnRfdGltZSAqdHMpCit7CisJZ2V0bnN0aW1lX3Jhd19hbmRfcmVhbCgmdHMtPnRzX3JhdywgJnRzLT50c19yZWFsKTsKK30KKworI2Vsc2UgLyogQ09ORklHX05UUF9QUFMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHBwc19nZXRfdHMoc3RydWN0IHBwc19ldmVudF90aW1lICp0cykKK3sKKwlnZXRuc3RpbWVvZmRheSgmdHMtPnRzX3JlYWwpOworfQorCisjZW5kaWYgLyogQ09ORklHX05UUF9QUFMgKi8KKworI2VuZGlmIC8qIExJTlVYX1BQU19LRVJORUxfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByaW50ay5oIGIvaW5jbHVkZS9saW51eC9wcmludGsuaAppbmRleCBiNzcyY2E1Li5lZTA0OGU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByaW50ay5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJpbnRrLmgKQEAgLTQsMTQgKzQsMTQgQEAKIGV4dGVybiBjb25zdCBjaGFyIGxpbnV4X2Jhbm5lcltdOwogZXh0ZXJuIGNvbnN0IGNoYXIgbGludXhfcHJvY19iYW5uZXJbXTsKIAotI2RlZmluZQlLRVJOX0VNRVJHCSI8MD4iCS8qIHN5c3RlbSBpcyB1bnVzYWJsZQkJCSovCi0jZGVmaW5lCUtFUk5fQUxFUlQJIjwxPiIJLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkJKi8KLSNkZWZpbmUJS0VSTl9DUklUCSI8Mj4iCS8qIGNyaXRpY2FsIGNvbmRpdGlvbnMJCQkqLwotI2RlZmluZQlLRVJOX0VSUgkiPDM+IgkvKiBlcnJvciBjb25kaXRpb25zCQkJKi8KLSNkZWZpbmUJS0VSTl9XQVJOSU5HCSI8ND4iCS8qIHdhcm5pbmcgY29uZGl0aW9ucwkJCSovCi0jZGVmaW5lCUtFUk5fTk9USUNFCSI8NT4iCS8qIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uCSovCi0jZGVmaW5lCUtFUk5fSU5GTwkiPDY+IgkvKiBpbmZvcm1hdGlvbmFsCQkJKi8KLSNkZWZpbmUJS0VSTl9ERUJVRwkiPDc+IgkvKiBkZWJ1Zy1sZXZlbCBtZXNzYWdlcwkJCSovCisjZGVmaW5lIEtFUk5fRU1FUkcJIjwwPiIJLyogc3lzdGVtIGlzIHVudXNhYmxlCQkJKi8KKyNkZWZpbmUgS0VSTl9BTEVSVAkiPDE+IgkvKiBhY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseQkqLworI2RlZmluZSBLRVJOX0NSSVQJIjwyPiIJLyogY3JpdGljYWwgY29uZGl0aW9ucwkJCSovCisjZGVmaW5lIEtFUk5fRVJSCSI8Mz4iCS8qIGVycm9yIGNvbmRpdGlvbnMJCQkqLworI2RlZmluZSBLRVJOX1dBUk5JTkcJIjw0PiIJLyogd2FybmluZyBjb25kaXRpb25zCQkJKi8KKyNkZWZpbmUgS0VSTl9OT1RJQ0UJIjw1PiIJLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24JKi8KKyNkZWZpbmUgS0VSTl9JTkZPCSI8Nj4iCS8qIGluZm9ybWF0aW9uYWwJCQkqLworI2RlZmluZSBLRVJOX0RFQlVHCSI8Nz4iCS8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzCQkJKi8KIAogLyogVXNlIHRoZSBkZWZhdWx0IGtlcm5lbCBsb2dsZXZlbCAqLwogI2RlZmluZSBLRVJOX0RFRkFVTFQJIjxkPiIKQEAgLTIwLDcgKzIwLDcgQEAKICAqIGxpbmUgdGhhdCBoYWQgbm8gZW5jbG9zaW5nIFxuKS4gT25seSB0byBiZSB1c2VkIGJ5IGNvcmUvYXJjaCBjb2RlCiAgKiBkdXJpbmcgZWFybHkgYm9vdHVwIChhIGNvbnRpbnVlZCBsaW5lIGlzIG5vdCBTTVAtc2FmZSBvdGhlcndpc2UpLgogICovCi0jZGVmaW5lCUtFUk5fQ09OVAkiPGM+IgorI2RlZmluZSBLRVJOX0NPTlQJIjxjPiIKIAogZXh0ZXJuIGludCBjb25zb2xlX3ByaW50a1tdOwogCkBAIC0yOSw2ICsyOSwxNyBAQAogI2RlZmluZSBtaW5pbXVtX2NvbnNvbGVfbG9nbGV2ZWwgKGNvbnNvbGVfcHJpbnRrWzJdKQogI2RlZmluZSBkZWZhdWx0X2NvbnNvbGVfbG9nbGV2ZWwgKGNvbnNvbGVfcHJpbnRrWzNdKQogCitzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9zaWxlbnQodm9pZCkKK3sKKwljb25zb2xlX2xvZ2xldmVsID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnNvbGVfdmVyYm9zZSh2b2lkKQoreworCWlmIChjb25zb2xlX2xvZ2xldmVsKQorCQljb25zb2xlX2xvZ2xldmVsID0gMTU7Cit9CisKIHN0cnVjdCB2YV9mb3JtYXQgewogCWNvbnN0IGNoYXIgKmZtdDsKIAl2YV9saXN0ICp2YTsKQEAgLTY1LDExICs3NiwyNyBAQAogICovCiAjZGVmaW5lIEhXX0VSUgkJIltIYXJkd2FyZSBFcnJvcl06ICIKIAorLyoKKyAqIER1bW15IHByaW50ayBmb3IgZGlzYWJsZWQgZGVidWdnaW5nIHN0YXRlbWVudHMgdG8gdXNlIHdoaWxzdCBtYWludGFpbmluZworICogZ2NjJ3MgZm9ybWF0IGFuZCBzaWRlLWVmZmVjdCBjaGVja2luZy4KKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKK2ludCBub19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQordm9pZCBlYXJseV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitleHRlcm4gaW50IHByaW50a19uZWVkc19jcHUoaW50IGNwdSk7CitleHRlcm4gdm9pZCBwcmludGtfdGljayh2b2lkKTsKKwogI2lmZGVmIENPTkZJR19QUklOVEsKLWFzbWxpbmthZ2UgaW50IHZwcmludGsoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAwKSkpOwotYXNtbGlua2FnZSBpbnQgcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkgX19jb2xkOworYXNtbGlua2FnZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDApKSkKK2ludCB2cHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKK2FzbWxpbmthZ2UgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIF9fY29sZAoraW50IHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIC8qCiAgKiBQbGVhc2UgZG9uJ3QgdXNlIHByaW50a19yYXRlbGltaXQoKSwgYmVjYXVzZSBpdCBzaGFyZXMgcmF0ZWxpbWl0aW5nIHN0YXRlCkBAIC04Myw5OSArMTEwLDU2IEBACiAKIGV4dGVybiBpbnQgcHJpbnRrX2RlbGF5X21zZWM7CiBleHRlcm4gaW50IGRtZXNnX3Jlc3RyaWN0OwotCi0vKgotICogUHJpbnQgYSBvbmUtdGltZSBtZXNzYWdlIChhbmFsb2dvdXMgdG8gV0FSTl9PTkNFKCkgZXQgYWwpOgotICovCi0jZGVmaW5lIHByaW50a19vbmNlKHguLi4pICh7CQkJXAotCXN0YXRpYyBib29sIF9fcHJpbnRfb25jZTsJCVwKLQkJCQkJCVwKLQlpZiAoIV9fcHJpbnRfb25jZSkgewkJCVwKLQkJX19wcmludF9vbmNlID0gdHJ1ZTsJCVwKLQkJcHJpbnRrKHgpOwkJCVwKLQl9CQkJCQlcCi19KQorZXh0ZXJuIGludCBrcHRyX3Jlc3RyaWN0OwogCiB2b2lkIGxvZ19idWZfa2V4ZWNfc2V0dXAodm9pZCk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgdnByaW50ayhjb25zdCBjaGFyICpzLCB2YV9saXN0IGFyZ3MpCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAwKSkpOwotc3RhdGljIGlubGluZSBpbnQgdnByaW50ayhjb25zdCBjaGFyICpzLCB2YV9saXN0IGFyZ3MpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHByaW50ayhjb25zdCBjaGFyICpzLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwotc3RhdGljIGlubGluZSBpbnQgX19jb2xkIHByaW50ayhjb25zdCBjaGFyICpzLCAuLi4pIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHByaW50a19yYXRlbGltaXQodm9pZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBib29sIHByaW50a190aW1lZF9yYXRlbGltaXQodW5zaWduZWQgbG9uZyAqY2FsbGVyX2ppZmZpZXMsIFwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWxfbXNlYykJXAotCQl7IHJldHVybiBmYWxzZTsgfQotCi0vKiBObyBlZmZlY3QsIGJ1dCB3ZSBzdGlsbCBnZXQgdHlwZSBjaGVja2luZyBldmVuIGluIHRoZSAhUFJJTlRLIGNhc2U6ICovCi0jZGVmaW5lIHByaW50a19vbmNlKHguLi4pIHByaW50ayh4KQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDApKSkKK2ludCB2cHJpbnRrKGNvbnN0IGNoYXIgKnMsIHZhX2xpc3QgYXJncykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIF9fY29sZAoraW50IHByaW50ayhjb25zdCBjaGFyICpzLCAuLi4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBwcmludGtfcmF0ZWxpbWl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wgcHJpbnRrX3RpbWVkX3JhdGVsaW1pdCh1bnNpZ25lZCBsb25nICpjYWxsZXJfamlmZmllcywKKwkJCQkJICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWxfbXNlYykKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2dfYnVmX2tleGVjX3NldHVwKHZvaWQpCiB7CiB9CiAjZW5kaWYKIAotLyoKLSAqIER1bW15IHByaW50ayBmb3IgZGlzYWJsZWQgZGVidWdnaW5nIHN0YXRlbWVudHMgdG8gdXNlIHdoaWxzdCBtYWludGFpbmluZwotICogZ2NjJ3MgZm9ybWF0IGFuZCBzaWRlLWVmZmVjdCBjaGVja2luZy4KLSAqLwotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKLWludCBub19wcmludGsoY29uc3QgY2hhciAqcywgLi4uKSB7IHJldHVybiAwOyB9Ci0KLWV4dGVybiBpbnQgcHJpbnRrX25lZWRzX2NwdShpbnQgY3B1KTsKLWV4dGVybiB2b2lkIHByaW50a190aWNrKHZvaWQpOwotCi1leHRlcm4gdm9pZCBhc21saW5rYWdlIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKLQllYXJseV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9zaWxlbnQodm9pZCkKLXsKLQljb25zb2xlX2xvZ2xldmVsID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNvbnNvbGVfdmVyYm9zZSh2b2lkKQotewotCWlmIChjb25zb2xlX2xvZ2xldmVsKQotCQljb25zb2xlX2xvZ2xldmVsID0gMTU7Ci19Ci0KIGV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCkgX19jb2xkOwogCi1lbnVtIHsKLQlEVU1QX1BSRUZJWF9OT05FLAotCURVTVBfUFJFRklYX0FERFJFU1MsCi0JRFVNUF9QUkVGSVhfT0ZGU0VUCi19OwotZXh0ZXJuIHZvaWQgaGV4X2R1bXBfdG9fYnVmZmVyKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKLQkJCQlpbnQgcm93c2l6ZSwgaW50IGdyb3Vwc2l6ZSwKLQkJCQljaGFyICpsaW5lYnVmLCBzaXplX3QgbGluZWJ1ZmxlbiwgYm9vbCBhc2NpaSk7Ci1leHRlcm4gdm9pZCBwcmludF9oZXhfZHVtcChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqcHJlZml4X3N0ciwKLQkJCQlpbnQgcHJlZml4X3R5cGUsIGludCByb3dzaXplLCBpbnQgZ3JvdXBzaXplLAotCQkJCWNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBhc2NpaSk7Ci1leHRlcm4gdm9pZCBwcmludF9oZXhfZHVtcF9ieXRlcyhjb25zdCBjaGFyICpwcmVmaXhfc3RyLCBpbnQgcHJlZml4X3R5cGUsCi0JCQljb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwotCiAjaWZuZGVmIHByX2ZtdAogI2RlZmluZSBwcl9mbXQoZm10KSBmbXQKICNlbmRpZgogCiAjZGVmaW5lIHByX2VtZXJnKGZtdCwgLi4uKSBcCi0gICAgICAgIHByaW50ayhLRVJOX0VNRVJHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorCXByaW50ayhLRVJOX0VNRVJHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBwcl9hbGVydChmbXQsIC4uLikgXAotICAgICAgICBwcmludGsoS0VSTl9BTEVSVCBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKKwlwcmludGsoS0VSTl9BTEVSVCBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgcHJfY3JpdChmbXQsIC4uLikgXAotICAgICAgICBwcmludGsoS0VSTl9DUklUIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorCXByaW50ayhLRVJOX0NSSVQgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIHByX2VycihmbXQsIC4uLikgXAotICAgICAgICBwcmludGsoS0VSTl9FUlIgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisJcHJpbnRrKEtFUk5fRVJSIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBwcl93YXJuaW5nKGZtdCwgLi4uKSBcCi0gICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisJcHJpbnRrKEtFUk5fV0FSTklORyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgcHJfd2FybiBwcl93YXJuaW5nCiAjZGVmaW5lIHByX25vdGljZShmbXQsIC4uLikgXAotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisJcHJpbnRrKEtFUk5fTk9USUNFIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBwcl9pbmZvKGZtdCwgLi4uKSBcCi0gICAgICAgIHByaW50ayhLRVJOX0lORk8gcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisJcHJpbnRrKEtFUk5fSU5GTyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgcHJfY29udChmbXQsIC4uLikgXAogCXByaW50ayhLRVJOX0NPTlQgZm10LCAjI19fVkFfQVJHU19fKQogCkBAIC0xODUsNyArMTY5LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNlbHNlCiAjZGVmaW5lIHByX2RldmVsKGZtdCwgLi4uKSBcCi0JKHsgaWYgKDApIHByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKTsgMDsgfSkKKwlub19wcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKICNlbmRpZgogCiAvKiBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkcml2ZXIsIHBsZWFzZSB1c2UgZGV2X2RiZyBpbnN0ZWFkICovCkBAIC0xOTgsNyArMTgyLDUxIEBACiAJZHluYW1pY19wcl9kZWJ1ZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQogI2RlZmluZSBwcl9kZWJ1ZyhmbXQsIC4uLikgXAotCSh7IGlmICgwKSBwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXyk7IDA7IH0pCisJbm9fcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisjZW5kaWYKKworLyoKKyAqIFByaW50IGEgb25lLXRpbWUgbWVzc2FnZSAoYW5hbG9nb3VzIHRvIFdBUk5fT05DRSgpIGV0IGFsKToKKyAqLworCisjaWZkZWYgQ09ORklHX1BSSU5USworI2RlZmluZSBwcmludGtfb25jZShmbXQsIC4uLikJCQlcCisoewkJCQkJCVwKKwlzdGF0aWMgYm9vbCBfX3ByaW50X29uY2U7CQlcCisJCQkJCQlcCisJaWYgKCFfX3ByaW50X29uY2UpIHsJCQlcCisJCV9fcHJpbnRfb25jZSA9IHRydWU7CQlcCisJCXByaW50ayhmbXQsICMjX19WQV9BUkdTX18pOwlcCisJfQkJCQkJXAorfSkKKyNlbHNlCisjZGVmaW5lIHByaW50a19vbmNlKGZtdCwgLi4uKQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQorI2VuZGlmCisKKyNkZWZpbmUgcHJfZW1lcmdfb25jZShmbXQsIC4uLikJCQkJCVwKKwlwcmludGtfb25jZShLRVJOX0VNRVJHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcl9hbGVydF9vbmNlKGZtdCwgLi4uKQkJCQkJXAorCXByaW50a19vbmNlKEtFUk5fQUxFUlQgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHByX2NyaXRfb25jZShmbXQsIC4uLikJCQkJCVwKKwlwcmludGtfb25jZShLRVJOX0NSSVQgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIHByX2Vycl9vbmNlKGZtdCwgLi4uKQkJCQkJXAorCXByaW50a19vbmNlKEtFUk5fRVJSIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcl93YXJuX29uY2UoZm10LCAuLi4pCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcl9ub3RpY2Vfb25jZShmbXQsIC4uLikJCQkJXAorCXByaW50a19vbmNlKEtFUk5fTk9USUNFIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcl9pbmZvX29uY2UoZm10LCAuLi4pCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9JTkZPIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcl9jb250X29uY2UoZm10LCAuLi4pCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9DT05UIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorLyogSWYgeW91IGFyZSB3cml0aW5nIGEgZHJpdmVyLCBwbGVhc2UgdXNlIGRldl9kYmcgaW5zdGVhZCAqLworI2lmIGRlZmluZWQoREVCVUcpCisjZGVmaW5lIHByX2RlYnVnX29uY2UoZm10LCAuLi4pCQkJCQlcCisJcHJpbnRrX29uY2UoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIHByX2RlYnVnX29uY2UoZm10LCAuLi4pCQkJCQlcCisJbm9fcHJpbnRrKEtFUk5fREVCVUcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCiAjZW5kaWYKIAogLyoKQEAgLTIwNiw3ICsyMzQsOCBAQAogICogbm8gbG9jYWwgcmF0ZWxpbWl0X3N0YXRlIHVzZWQgaW4gdGhlICFQUklOVEsgY2FzZQogICovCiAjaWZkZWYgQ09ORklHX1BSSU5USwotI2RlZmluZSBwcmludGtfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pICAoewkJCQlcCisjZGVmaW5lIHByaW50a19yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKKyh7CQkJCQkJCQkJXAogCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKF9ycywJCQkJXAogCQkJCSAgICAgIERFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAlcCiAJCQkJICAgICAgREVGQVVMVF9SQVRFTElNSVRfQlVSU1QpOwkJXApAQCAtMjE1LDM0ICsyNDQsNTkgQEAKIAkJcHJpbnRrKGZtdCwgIyNfX1ZBX0FSR1NfXyk7CQkJCVwKIH0pCiAjZWxzZQotLyogTm8gZWZmZWN0LCBidXQgd2Ugc3RpbGwgZ2V0IHR5cGUgY2hlY2tpbmcgZXZlbiBpbiB0aGUgIVBSSU5USyBjYXNlOiAqLwotI2RlZmluZSBwcmludGtfcmF0ZWxpbWl0ZWQgcHJpbnRrCisjZGVmaW5lIHByaW50a19yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKKwlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCiAKLSNkZWZpbmUgcHJfZW1lcmdfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pIFwKKyNkZWZpbmUgcHJfZW1lcmdfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pCQkJCQlcCiAJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRU1FUkcgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIHByX2FsZXJ0X3JhdGVsaW1pdGVkKGZtdCwgLi4uKSBcCisjZGVmaW5lIHByX2FsZXJ0X3JhdGVsaW1pdGVkKGZtdCwgLi4uKQkJCQkJXAogCXByaW50a19yYXRlbGltaXRlZChLRVJOX0FMRVJUIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBwcl9jcml0X3JhdGVsaW1pdGVkKGZtdCwgLi4uKSBcCisjZGVmaW5lIHByX2NyaXRfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pCQkJCQlcCiAJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fQ1JJVCBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgcHJfZXJyX3JhdGVsaW1pdGVkKGZtdCwgLi4uKSBcCisjZGVmaW5lIHByX2Vycl9yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKIAlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9FUlIgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIHByX3dhcm5pbmdfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pIFwKKyNkZWZpbmUgcHJfd2Fybl9yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKIAlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBwcl93YXJuX3JhdGVsaW1pdGVkIHByX3dhcm5pbmdfcmF0ZWxpbWl0ZWQKLSNkZWZpbmUgcHJfbm90aWNlX3JhdGVsaW1pdGVkKGZtdCwgLi4uKSBcCisjZGVmaW5lIHByX25vdGljZV9yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKIAlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9OT1RJQ0UgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIHByX2luZm9fcmF0ZWxpbWl0ZWQoZm10LCAuLi4pIFwKKyNkZWZpbmUgcHJfaW5mb19yYXRlbGltaXRlZChmbXQsIC4uLikJCQkJCVwKIAlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogLyogbm8gcHJfY29udF9yYXRlbGltaXRlZCwgZG9uJ3QgZG8gdGhhdC4uLiAqLwogLyogSWYgeW91IGFyZSB3cml0aW5nIGEgZHJpdmVyLCBwbGVhc2UgdXNlIGRldl9kYmcgaW5zdGVhZCAqLwogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIHByX2RlYnVnX3JhdGVsaW1pdGVkKGZtdCwgLi4uKSBcCisjZGVmaW5lIHByX2RlYnVnX3JhdGVsaW1pdGVkKGZtdCwgLi4uKQkJCQkJXAogCXByaW50a19yYXRlbGltaXRlZChLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQogI2Vsc2UKICNkZWZpbmUgcHJfZGVidWdfcmF0ZWxpbWl0ZWQoZm10LCAuLi4pIFwKLQkoeyBpZiAoMCkgcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fREVCVUcgcHJfZm10KGZtdCksIFwKLQkJCQkgICAgICMjX19WQV9BUkdTX18pOyAwOyB9KQorCW5vX3ByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2VuZGlmCisKK2VudW0geworCURVTVBfUFJFRklYX05PTkUsCisJRFVNUF9QUkVGSVhfQUREUkVTUywKKwlEVU1QX1BSRUZJWF9PRkZTRVQKK307CitleHRlcm4gdm9pZCBoZXhfZHVtcF90b19idWZmZXIoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCQkJICAgICAgIGludCByb3dzaXplLCBpbnQgZ3JvdXBzaXplLAorCQkJICAgICAgIGNoYXIgKmxpbmVidWYsIHNpemVfdCBsaW5lYnVmbGVuLCBib29sIGFzY2lpKTsKKyNpZmRlZiBDT05GSUdfUFJJTlRLCitleHRlcm4gdm9pZCBwcmludF9oZXhfZHVtcChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqcHJlZml4X3N0ciwKKwkJCSAgIGludCBwcmVmaXhfdHlwZSwgaW50IHJvd3NpemUsIGludCBncm91cHNpemUsCisJCQkgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGJvb2wgYXNjaWkpOworZXh0ZXJuIHZvaWQgcHJpbnRfaGV4X2R1bXBfYnl0ZXMoY29uc3QgY2hhciAqcHJlZml4X3N0ciwgaW50IHByZWZpeF90eXBlLAorCQkJCSBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9oZXhfZHVtcChjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqcHJlZml4X3N0ciwKKwkJCQkgIGludCBwcmVmaXhfdHlwZSwgaW50IHJvd3NpemUsIGludCBncm91cHNpemUsCisJCQkJICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGJvb2wgYXNjaWkpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfaGV4X2R1bXBfYnl0ZXMoY29uc3QgY2hhciAqcHJlZml4X3N0ciwgaW50IHByZWZpeF90eXBlLAorCQkJCQljb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7Cit9CisKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaCBiL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaAppbmRleCBkMWE5MTkzLi4yMjNiMTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCkBAIC0zMSw4ICszMSw5IEBACiAjZGVmaW5lIHF1b3RhX2Vycm9yKHNiLCBmbXQsIGFyZ3MuLi4pIFwKIAlfX3F1b3RhX2Vycm9yKChzYiksIF9fZnVuY19fLCBmbXQgLCAjIyBhcmdzKQogCi1leHRlcm4gdm9pZCBfX3F1b3RhX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmMsCi0JCQkgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCit2b2lkIF9fcXVvdGFfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuYywKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKgogICogZGVjbGFyYXRpb24gb2YgcXVvdGFfZnVuY3Rpb24gY2FsbHMgaW4ga2VybmVsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAppbmRleCBhYjJiYWE1Li4yMzI0MWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaApAQCAtMTQ2LDYgKzE0NiwyMiBAQAogfQogCiAvKioKKyAqIHJhZGl4X3RyZWVfZGVyZWZfc2xvdF9wcm90ZWN0ZWQJLSBkZXJlZmVyZW5jZSBhIHNsb3Qgd2l0aG91dCBSQ1UgbG9jayBidXQgd2l0aCB0cmVlIGxvY2sgaGVsZAorICogQHBzbG90Oglwb2ludGVyIHRvIHNsb3QsIHJldHVybmVkIGJ5IHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QKKyAqIFJldHVybnM6CWl0ZW0gdGhhdCB3YXMgc3RvcmVkIGluIHRoYXQgc2xvdCB3aXRoIGFueSBkaXJlY3QgcG9pbnRlciBmbGFnCisgKgkJcmVtb3ZlZC4KKyAqCisgKiBTaW1pbGFyIHRvIHJhZGl4X3RyZWVfZGVyZWZfc2xvdCBidXQgb25seSB1c2VkIGR1cmluZyBtaWdyYXRpb24gd2hlbiBhIHBhZ2VzCisgKiBtYXBwaW5nIGlzIGJlaW5nIG1vdmVkLiBUaGUgY2FsbGVyIGRvZXMgbm90IGhvbGQgdGhlIFJDVSByZWFkIGxvY2sgYnV0IGl0CisgKiBtdXN0IGhvbGQgdGhlIHRyZWUgbG9jayB0byBwcmV2ZW50IHBhcmFsbGVsIHVwZGF0ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZCh2b2lkICoqcHNsb3QsCisJCQkJCQkJc3BpbmxvY2tfdCAqdHJlZWxvY2spCit7CisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoKnBzbG90LCBsb2NrZGVwX2lzX2hlbGQodHJlZWxvY2spKTsKK30KKworLyoqCiAgKiByYWRpeF90cmVlX2RlcmVmX3JldHJ5CS0gY2hlY2sgcmFkaXhfdHJlZV9kZXJlZl9zbG90CiAgKiBAYXJnOglwb2ludGVyIHJldHVybmVkIGJ5IHJhZGl4X3RyZWVfZGVyZWZfc2xvdAogICogUmV0dXJuczoJMCBpZiByZXRyeSBpcyBub3QgcmVxdWlyZWQsIG90aGVyd2lzZSByZXRyeSBpcyByZXF1aXJlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaCBiL2luY2x1ZGUvbGludXgvcmFyX3JlZ2lzdGVyLmgKaW5kZXggZmZhODA1Ny4uNWM2MTE4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Jhcl9yZWdpc3Rlci5oCkBAIC0zNCwxMSArMzQsMjcgQEAKIAogc3RydWN0IHJhcl9kZXZpY2U7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19SQVJfUkVHSVNURVIpCiBpbnQgcmVnaXN0ZXJfcmFyKGludCBudW0sCiAJCWludCAoKmNhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpLCB1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCB1bnJlZ2lzdGVyX3JhcihpbnQgbnVtKTsKIGludCByYXJfZ2V0X2FkZHJlc3MoaW50IHJhcl9pbmRleCwgZG1hX2FkZHJfdCAqc3RhcnQsIGRtYV9hZGRyX3QgKmVuZCk7CiBpbnQgcmFyX2xvY2soaW50IHJhcl9pbmRleCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9yYXIoaW50IG51bSkgIHsgfQorZXh0ZXJuIGludCByYXJfbG9jayhpbnQgcmFyX2luZGV4KSB7IHJldHVybiAtRUlPOyB9CisKK2V4dGVybiBpbmxpbmUgaW50IHJlZ2lzdGVyX3JhcihpbnQgbnVtLAorCQlpbnQgKCpjYWxsYmFjaykodW5zaWduZWQgbG9uZyBkYXRhKSwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXJldHVybiAtRU5PREVWOworfQorCitleHRlcm4gaW50IHJhcl9nZXRfYWRkcmVzcyhpbnQgcmFyX2luZGV4LCBkbWFfYWRkcl90ICpzdGFydCwgZG1hX2FkZHJfdCAqZW5kKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCS8qIFJBUl9SRUdJU1RFUiAqLwogCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAgLyogX1JBUl9SRUdJU1RFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdWxpc3RfYmwuaCBiL2luY2x1ZGUvbGludXgvcmN1bGlzdF9ibC5oCmluZGV4IGI4NzJiNDkuLmNmMTI0NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1bGlzdF9ibC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1bGlzdF9ibC5oCkBAIC0xMSw3ICsxMSw4IEBACiAJCQkJCXN0cnVjdCBobGlzdF9ibF9ub2RlICpuKQogewogCUxJU1RfQkxfQlVHX09OKCh1bnNpZ25lZCBsb25nKW4gJiBMSVNUX0JMX0xPQ0tNQVNLKTsKLQlMSVNUX0JMX0JVR19PTighKCh1bnNpZ25lZCBsb25nKWgtPmZpcnN0ICYgTElTVF9CTF9MT0NLTUFTSykpOworCUxJU1RfQkxfQlVHX09OKCgodW5zaWduZWQgbG9uZyloLT5maXJzdCAmIExJU1RfQkxfTE9DS01BU0spICE9CisJCQkJCQkJTElTVF9CTF9MT0NLTUFTSyk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKGgtPmZpcnN0LAogCQkoc3RydWN0IGhsaXN0X2JsX25vZGUgKikoKHVuc2lnbmVkIGxvbmcpbiB8IExJU1RfQkxfTE9DS01BU0spKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2FiODUwMC5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvYWI4NTAwLmgKaW5kZXggZjUwOTg3Ny4uNmEyMTBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvYWI4NTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvYWI4NTAwLmgKQEAgLTExLDE1ICsxMSwxNyBAQAogI2RlZmluZSBfX0xJTlVYX01GRF9BQjg1MDBfUkVHVUxBVE9SX0gKIAogLyogQUI4NTAwIHJlZ3VsYXRvcnMgKi8KLSNkZWZpbmUgQUI4NTAwX0xET19BVVgxICAgICAgICAgMAotI2RlZmluZSBBQjg1MDBfTERPX0FVWDIgICAgICAgICAxCi0jZGVmaW5lIEFCODUwMF9MRE9fQVVYMyAgICAgICAgIDIKLSNkZWZpbmUgQUI4NTAwX0xET19JTlRDT1JFICAgICAgMwotI2RlZmluZSBBQjg1MDBfTERPX1RWT1VUICAgICAgICA0Ci0jZGVmaW5lIEFCODUwMF9MRE9fQVVESU8JNQotI2RlZmluZSBBQjg1MDBfTERPX0FOQU1JQzEgICAgICA2Ci0jZGVmaW5lIEFCODUwMF9MRE9fQU5BTUlDMiAgICAgIDcKLSNkZWZpbmUgQUI4NTAwX0xET19ETUlDICAgICAgICAgOAotI2RlZmluZSBBQjg1MDBfTERPX0FOQSAgICAgICAgICA5Ci0KK2VudW0gYWI4NTAwX3JlZ3VsYXRvcl9pZCB7CisJQUI4NTAwX0xET19BVVgxLAorCUFCODUwMF9MRE9fQVVYMiwKKwlBQjg1MDBfTERPX0FVWDMsCisJQUI4NTAwX0xET19JTlRDT1JFLAorCUFCODUwMF9MRE9fVFZPVVQsCisJQUI4NTAwX0xET19BVURJTywKKwlBQjg1MDBfTERPX0FOQU1JQzEsCisJQUI4NTAwX0xET19BTkFNSUMyLAorCUFCODUwMF9MRE9fRE1JQywKKwlBQjg1MDBfTERPX0FOQSwKKwlBQjg1MDBfTlVNX1JFR1VMQVRPUlMsCit9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAppbmRleCBlYmQ3NDcyLi43OTU0ZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKQEAgLTE1NCw2ICsxNTQsNyBAQAogCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpOwogaW50IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IsIGludCBtaW5fdVYsIGludCBtYXhfdVYpOwogaW50IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpOworaW50IHJlZ3VsYXRvcl9zeW5jX3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKTsKIGludCByZWd1bGF0b3Jfc2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAogCQkJICAgICAgIGludCBtaW5fdUEsIGludCBtYXhfdUEpOwogaW50IHJlZ3VsYXRvcl9nZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCA1OTJjZDdjLi5iOGVkMTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtNDIsNyArNDIsMTEgQEAKICAqCiAgKiBAc2V0X3ZvbHRhZ2U6IFNldCB0aGUgdm9sdGFnZSBmb3IgdGhlIHJlZ3VsYXRvciB3aXRoaW4gdGhlIHJhbmdlIHNwZWNpZmllZC4KICAqICAgICAgICAgICAgICAgVGhlIGRyaXZlciBzaG91bGQgc2VsZWN0IHRoZSB2b2x0YWdlIGNsb3Nlc3QgdG8gbWluX3VWLgorICogQHNldF92b2x0YWdlX3NlbDogU2V0IHRoZSB2b2x0YWdlIGZvciB0aGUgcmVndWxhdG9yIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLgogICogQGdldF92b2x0YWdlOiBSZXR1cm4gdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3IuCisgKiBAZ2V0X3ZvbHRhZ2Vfc2VsOiBSZXR1cm4gdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZvbHRhZ2Ugc2VsZWN0b3IgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgcmVndWxhdG9yLgogICogQGxpc3Rfdm9sdGFnZTogUmV0dXJuIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHZvbHRhZ2VzLCBpbiBtaWNyb3ZvbHRzOyB6ZXJvCiAgKglpZiB0aGUgc2VsZWN0b3IgaW5kaWNhdGVzIGEgdm9sdGFnZSB0aGF0IGlzIHVudXNhYmxlIG9uIHRoaXMgc3lzdGVtOwogICoJb3IgbmVnYXRpdmUgZXJybm8uICBTZWxlY3RvcnMgcmFuZ2UgZnJvbSB6ZXJvIHRvIG9uZSBsZXNzIHRoYW4KQEAgLTc5LDggKzgzLDExIEBACiAJaW50ICgqbGlzdF92b2x0YWdlKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgdW5zaWduZWQgc2VsZWN0b3IpOwogCiAJLyogZ2V0L3NldCByZWd1bGF0b3Igdm9sdGFnZSAqLwotCWludCAoKnNldF92b2x0YWdlKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgaW50IG1pbl91ViwgaW50IG1heF91Vik7CisJaW50ICgqc2V0X3ZvbHRhZ2UpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLCBpbnQgbWluX3VWLCBpbnQgbWF4X3VWLAorCQkJICAgIHVuc2lnbmVkICpzZWxlY3Rvcik7CisJaW50ICgqc2V0X3ZvbHRhZ2Vfc2VsKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgdW5zaWduZWQgc2VsZWN0b3IpOwogCWludCAoKmdldF92b2x0YWdlKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKik7CisJaW50ICgqZ2V0X3ZvbHRhZ2Vfc2VsKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKik7CiAKIAkvKiBnZXQvc2V0IHJlZ3VsYXRvciBjdXJyZW50ICAqLwogCWludCAoKnNldF9jdXJyZW50X2xpbWl0KSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwKQEAgLTE2OCw5ICsxNzUsOSBAQAogICovCiBzdHJ1Y3QgcmVndWxhdG9yX2RldiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOwotCWludCB1c2VfY291bnQ7Ci0JaW50IG9wZW5fY291bnQ7CiAJaW50IGV4Y2x1c2l2ZTsKKwl1MzIgdXNlX2NvdW50OworCXUzMiBvcGVuX2NvdW50OwogCiAJLyogbGlzdHMgd2UgYmVsb25nIHRvICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBsaXN0IG9mIGFsbCByZWd1bGF0b3JzICovCkBAIC0xODgsMTAgKzE5NSwxNCBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHk7CS8qIGZvciB0cmVlICovCiAKIAl2b2lkICpyZWdfZGF0YTsJCS8qIHJlZ3VsYXRvcl9kZXYgZGF0YSAqLworCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGRlbnRyeSAqZGVidWdmczsKKyNlbmRpZgogfTsKIAogc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJlZ3VsYXRvcl9yZWdpc3RlcihzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKnJlZ3VsYXRvcl9kZXNjLAotCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRfZGF0YSwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGEsCiAJdm9pZCAqZHJpdmVyX2RhdGEpOwogdm9pZCByZWd1bGF0b3JfdW5yZWdpc3RlcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvLmggYi9pbmNsdWRlL2xpbnV4L3Jpby5oCmluZGV4IDBiZWQ5NDEuLmZmNjgxZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW8uaApAQCAtNjYsMTQgKzY2LDYyIEBACiAKICNkZWZpbmUgUklPX1BXX01TR19TSVpFCQk2NAogCisvKgorICogQSBjb21wb25lbnQgdGFnIHZhbHVlIChzdG9yZWQgaW4gdGhlIGNvbXBvbmVudCB0YWcgQ1NSKSBpcyB1c2VkIGFzIGRldmljZSdzCisgKiB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBkdXJpbmcgZW51bWVyYXRpb24uIEJlc2lkZXMgYmVpbmcgdXNlZCBmb3IKKyAqIGlkZW50aWZ5aW5nIHN3aXRjaGVzICh3aGljaCBkbyBub3QgaGF2ZSBkZXZpY2UgSUQgcmVnaXN0ZXIpLCBpdCBhbHNvIGlzIHVzZWQKKyAqIGJ5IGVycm9yIG1hbmFnZW1lbnQgbm90aWZpY2F0aW9uIGFuZCB0aGVyZWZvcmUgaGFzIHRvIGJlIGFzc2lnbmVkCisgKiB0byBlbmRwb2ludHMgYXMgd2VsbC4KKyAqLworI2RlZmluZSBSSU9fQ1RBR19SRVNSVkQJMHhmZmZlMDAwMCAvKiBSZXNlcnZlZCAqLworI2RlZmluZSBSSU9fQ1RBR19VREVWSUQJMHgwMDAxZmZmZiAvKiBVbmlxdWUgZGV2aWNlIGlkZW50aWZpZXIgKi8KKwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSByaW9fYnVzX3R5cGU7CiBleHRlcm4gc3RydWN0IGRldmljZSByaW9fYnVzOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcmlvX2RldmljZXM7CS8qIGxpc3Qgb2YgYWxsIGRldmljZXMgKi8KIAogc3RydWN0IHJpb19tcG9ydDsKK3N0cnVjdCByaW9fZGV2OwogdW5pb24gcmlvX3B3X21zZzsKIAogLyoqCisgKiBzdHJ1Y3QgcmlvX3N3aXRjaCAtIFJJTyBzd2l0Y2ggaW5mbworICogQG5vZGU6IE5vZGUgaW4gZ2xvYmFsIGxpc3Qgb2Ygc3dpdGNoZXMKKyAqIEBzd2l0Y2hpZDogU3dpdGNoIElEIHRoYXQgaXMgdW5pcXVlIGFjcm9zcyBhIG5ldHdvcmsKKyAqIEByb3V0ZV90YWJsZTogQ29weSBvZiBzd2l0Y2ggcm91dGluZyB0YWJsZQorICogQHBvcnRfb2s6IFN0YXR1cyBvZiBlYWNoIHBvcnQgKG9uZSBiaXQgcGVyIHBvcnQpIC0gT0s9MSBvciBVTklOSVQ9MAorICogQGFkZF9lbnRyeTogQ2FsbGJhY2sgZm9yIHN3aXRjaC1zcGVjaWZpYyByb3V0ZSBhZGQgZnVuY3Rpb24KKyAqIEBnZXRfZW50cnk6IENhbGxiYWNrIGZvciBzd2l0Y2gtc3BlY2lmaWMgcm91dGUgZ2V0IGZ1bmN0aW9uCisgKiBAY2xyX3RhYmxlOiBDYWxsYmFjayBmb3Igc3dpdGNoLXNwZWNpZmljIGNsZWFyIHJvdXRlIHRhYmxlIGZ1bmN0aW9uCisgKiBAc2V0X2RvbWFpbjogQ2FsbGJhY2sgZm9yIHN3aXRjaC1zcGVjaWZpYyBkb21haW4gc2V0dGluZyBmdW5jdGlvbgorICogQGdldF9kb21haW46IENhbGxiYWNrIGZvciBzd2l0Y2gtc3BlY2lmaWMgZG9tYWluIGdldCBmdW5jdGlvbgorICogQGVtX2luaXQ6IENhbGxiYWNrIGZvciBzd2l0Y2gtc3BlY2lmaWMgZXJyb3IgbWFuYWdlbWVudCBpbml0IGZ1bmN0aW9uCisgKiBAZW1faGFuZGxlOiBDYWxsYmFjayBmb3Igc3dpdGNoLXNwZWNpZmljIGVycm9yIG1hbmFnZW1lbnQgaGFuZGxlciBmdW5jdGlvbgorICogQHN3X3N5c2ZzOiBDYWxsYmFjayB0aGF0IGluaXRpYWxpemVzIHN3aXRjaC1zcGVjaWZpYyBzeXNmcyBhdHRyaWJ1dGVzCisgKiBAbmV4dGRldjogQXJyYXkgb2YgcGVyLXBvcnQgcG9pbnRlcnMgdG8gdGhlIG5leHQgYXR0YWNoZWQgZGV2aWNlCisgKi8KK3N0cnVjdCByaW9fc3dpdGNoIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJdTE2IHN3aXRjaGlkOworCXU4ICpyb3V0ZV90YWJsZTsKKwl1MzIgcG9ydF9vazsKKwlpbnQgKCphZGRfZW50cnkpIChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgdTE2IGRlc3RpZCwgdTggaG9wY291bnQsCisJCQkgIHUxNiB0YWJsZSwgdTE2IHJvdXRlX2Rlc3RpZCwgdTggcm91dGVfcG9ydCk7CisJaW50ICgqZ2V0X2VudHJ5KSAoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHUxNiBkZXN0aWQsIHU4IGhvcGNvdW50LAorCQkJICB1MTYgdGFibGUsIHUxNiByb3V0ZV9kZXN0aWQsIHU4ICpyb3V0ZV9wb3J0KTsKKwlpbnQgKCpjbHJfdGFibGUpIChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgdTE2IGRlc3RpZCwgdTggaG9wY291bnQsCisJCQkgIHUxNiB0YWJsZSk7CisJaW50ICgqc2V0X2RvbWFpbikgKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB1MTYgZGVzdGlkLCB1OCBob3Bjb3VudCwKKwkJCSAgIHU4IHN3X2RvbWFpbik7CisJaW50ICgqZ2V0X2RvbWFpbikgKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB1MTYgZGVzdGlkLCB1OCBob3Bjb3VudCwKKwkJCSAgIHU4ICpzd19kb21haW4pOworCWludCAoKmVtX2luaXQpIChzdHJ1Y3QgcmlvX2RldiAqZGV2KTsKKwlpbnQgKCplbV9oYW5kbGUpIChzdHJ1Y3QgcmlvX2RldiAqZGV2LCB1OCBzd3BvcnQpOworCWludCAoKnN3X3N5c2ZzKSAoc3RydWN0IHJpb19kZXYgKmRldiwgaW50IGNyZWF0ZSk7CisJc3RydWN0IHJpb19kZXYgKm5leHRkZXZbMF07Cit9OworCisvKioKICAqIHN0cnVjdCByaW9fZGV2IC0gUklPIGRldmljZSBpbmZvCiAgKiBAZ2xvYmFsX2xpc3Q6IE5vZGUgaW4gbGlzdCBvZiBhbGwgUklPIGRldmljZXMKICAqIEBuZXRfbGlzdDogTm9kZSBpbiBsaXN0IG9mIFJJTyBkZXZpY2VzIGluIGEgbmV0d29yawpAQCAtOTMsMTMgKzE0MSwxNCBAQAogICogQHBoeXNfZWZwdHI6IFJJTyBkZXZpY2UgZXh0ZW5kZWQgZmVhdHVyZXMgcG9pbnRlcgogICogQGVtX2VmcHRyOiBSSU8gRXJyb3IgTWFuYWdlbWVudCBmZWF0dXJlcyBwb2ludGVyCiAgKiBAZG1hX21hc2s6IE1hc2sgb2YgYml0cyBvZiBSSU8gYWRkcmVzcyB0aGlzIGRldmljZSBpbXBsZW1lbnRzCi0gKiBAcnN3aXRjaDogUG9pbnRlciB0byAmc3RydWN0IHJpb19zd2l0Y2ggaWYgdmFsaWQgZm9yIHRoaXMgZGV2aWNlCiAgKiBAZHJpdmVyOiBEcml2ZXIgY2xhaW1pbmcgdGhpcyBkZXZpY2UKICAqIEBkZXY6IERldmljZSBtb2RlbCBkZXZpY2UKICAqIEByaW9yZXM6IFJJTyByZXNvdXJjZXMgdGhpcyBkZXZpY2Ugb3ducwogICogQHB3Y2JhY2s6IHBvcnQtd3JpdGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoaXMgZGV2aWNlCi0gKiBAZGVzdGlkOiBOZXR3b3JrIGRlc3RpbmF0aW9uIElECisgKiBAZGVzdGlkOiBOZXR3b3JrIGRlc3RpbmF0aW9uIElEIChvciBhc3NvY2lhdGVkIGRlc3RpZCBmb3Igc3dpdGNoKQorICogQGhvcGNvdW50OiBIb3Bjb3VudCB0byB0aGlzIGRldmljZQogICogQHByZXY6IFByZXZpb3VzIFJJTyBkZXZpY2UgY29ubmVjdGVkIHRvIHRoZSBjdXJyZW50IG9uZQorICogQHJzd2l0Y2g6IHN0cnVjdCByaW9fc3dpdGNoIChpZiB2YWxpZCBmb3IgdGhpcyBkZXZpY2UpCiAgKi8KIHN0cnVjdCByaW9fZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbF9saXN0OwkvKiBub2RlIGluIGxpc3Qgb2YgYWxsIFJJTyBkZXZpY2VzICovCkBAIC0xMjAsMTggKzE2OSwyMCBAQAogCXUzMiBwaHlzX2VmcHRyOwogCXUzMiBlbV9lZnB0cjsKIAl1NjQgZG1hX21hc2s7Ci0Jc3RydWN0IHJpb19zd2l0Y2ggKnJzd2l0Y2g7CS8qIFJJTyBzd2l0Y2ggaW5mbyAqLwogCXN0cnVjdCByaW9fZHJpdmVyICpkcml2ZXI7CS8qIFJJTyBkcml2ZXIgY2xhaW1pbmcgdGhpcyBkZXZpY2UgKi8KIAlzdHJ1Y3QgZGV2aWNlIGRldjsJLyogTERNIGRldmljZSBzdHJ1Y3R1cmUgKi8KIAlzdHJ1Y3QgcmVzb3VyY2UgcmlvcmVzW1JJT19NQVhfREVWX1JFU09VUkNFU107CiAJaW50ICgqcHdjYmFjaykgKHN0cnVjdCByaW9fZGV2ICpyZGV2LCB1bmlvbiByaW9fcHdfbXNnICptc2csIGludCBzdGVwKTsKIAl1MTYgZGVzdGlkOworCXU4IGhvcGNvdW50OwogCXN0cnVjdCByaW9fZGV2ICpwcmV2OworCXN0cnVjdCByaW9fc3dpdGNoIHJzd2l0Y2hbMF07CS8qIFJJTyBzd2l0Y2ggaW5mbyAqLwogfTsKIAogI2RlZmluZSByaW9fZGV2X2cobikgbGlzdF9lbnRyeShuLCBzdHJ1Y3QgcmlvX2RldiwgZ2xvYmFsX2xpc3QpCiAjZGVmaW5lIHJpb19kZXZfZihuKSBsaXN0X2VudHJ5KG4sIHN0cnVjdCByaW9fZGV2LCBuZXRfbGlzdCkKICNkZWZpbmUJdG9fcmlvX2RldihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHJpb19kZXYsIGRldikKKyNkZWZpbmUgc3dfdG9fcmlvX2RldihuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHJpb19kZXYsIHJzd2l0Y2hbMF0pCiAKIC8qKgogICogc3RydWN0IHJpb19tc2cgLSBSSU8gbWVzc2FnZSBldmVudApAQCAtMjI0LDQ5ICsyNzUsNiBAQAogI2RlZmluZSBSSU9fU1dfU1lTRlNfQ1JFQVRFCTEJLyogQ3JlYXRlIHN3aXRjaCBhdHRyaWJ1dGVzICovCiAjZGVmaW5lIFJJT19TV19TWVNGU19SRU1PVkUJMAkvKiBSZW1vdmUgc3dpdGNoIGF0dHJpYnV0ZXMgKi8KIAotLyoqCi0gKiBzdHJ1Y3QgcmlvX3N3aXRjaCAtIFJJTyBzd2l0Y2ggaW5mbwotICogQG5vZGU6IE5vZGUgaW4gZ2xvYmFsIGxpc3Qgb2Ygc3dpdGNoZXMKLSAqIEByZGV2OiBBc3NvY2lhdGVkIFJJTyBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAc3dpdGNoaWQ6IFN3aXRjaCBJRCB0aGF0IGlzIHVuaXF1ZSBhY3Jvc3MgYSBuZXR3b3JrCi0gKiBAaG9wY291bnQ6IEhvcGNvdW50IHRvIHRoaXMgc3dpdGNoCi0gKiBAZGVzdGlkOiBBc3NvY2lhdGVkIGRlc3RpZCBpbiB0aGUgcGF0aAotICogQHJvdXRlX3RhYmxlOiBDb3B5IG9mIHN3aXRjaCByb3V0aW5nIHRhYmxlCi0gKiBAcG9ydF9vazogU3RhdHVzIG9mIGVhY2ggcG9ydCAob25lIGJpdCBwZXIgcG9ydCkgLSBPSz0xIG9yIFVOSU5JVD0wCi0gKiBAYWRkX2VudHJ5OiBDYWxsYmFjayBmb3Igc3dpdGNoLXNwZWNpZmljIHJvdXRlIGFkZCBmdW5jdGlvbgotICogQGdldF9lbnRyeTogQ2FsbGJhY2sgZm9yIHN3aXRjaC1zcGVjaWZpYyByb3V0ZSBnZXQgZnVuY3Rpb24KLSAqIEBjbHJfdGFibGU6IENhbGxiYWNrIGZvciBzd2l0Y2gtc3BlY2lmaWMgY2xlYXIgcm91dGUgdGFibGUgZnVuY3Rpb24KLSAqIEBzZXRfZG9tYWluOiBDYWxsYmFjayBmb3Igc3dpdGNoLXNwZWNpZmljIGRvbWFpbiBzZXR0aW5nIGZ1bmN0aW9uCi0gKiBAZ2V0X2RvbWFpbjogQ2FsbGJhY2sgZm9yIHN3aXRjaC1zcGVjaWZpYyBkb21haW4gZ2V0IGZ1bmN0aW9uCi0gKiBAZW1faW5pdDogQ2FsbGJhY2sgZm9yIHN3aXRjaC1zcGVjaWZpYyBlcnJvciBtYW5hZ2VtZW50IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi0gKiBAZW1faGFuZGxlOiBDYWxsYmFjayBmb3Igc3dpdGNoLXNwZWNpZmljIGVycm9yIG1hbmFnZW1lbnQgaGFuZGxlciBmdW5jdGlvbgotICogQHN3X3N5c2ZzOiBDYWxsYmFjayB0aGF0IGluaXRpYWxpemVzIHN3aXRjaC1zcGVjaWZpYyBzeXNmcyBhdHRyaWJ1dGVzCi0gKiBAbmV4dGRldjogQXJyYXkgb2YgcGVyLXBvcnQgcG9pbnRlcnMgdG8gdGhlIG5leHQgYXR0YWNoZWQgZGV2aWNlCi0gKi8KLXN0cnVjdCByaW9fc3dpdGNoIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci0Jc3RydWN0IHJpb19kZXYgKnJkZXY7Ci0JdTE2IHN3aXRjaGlkOwotCXUxNiBob3Bjb3VudDsKLQl1MTYgZGVzdGlkOwotCXU4ICpyb3V0ZV90YWJsZTsKLQl1MzIgcG9ydF9vazsKLQlpbnQgKCphZGRfZW50cnkpIChzdHJ1Y3QgcmlvX21wb3J0ICogbXBvcnQsIHUxNiBkZXN0aWQsIHU4IGhvcGNvdW50LAotCQkJICB1MTYgdGFibGUsIHUxNiByb3V0ZV9kZXN0aWQsIHU4IHJvdXRlX3BvcnQpOwotCWludCAoKmdldF9lbnRyeSkgKHN0cnVjdCByaW9fbXBvcnQgKiBtcG9ydCwgdTE2IGRlc3RpZCwgdTggaG9wY291bnQsCi0JCQkgIHUxNiB0YWJsZSwgdTE2IHJvdXRlX2Rlc3RpZCwgdTggKiByb3V0ZV9wb3J0KTsKLQlpbnQgKCpjbHJfdGFibGUpIChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgdTE2IGRlc3RpZCwgdTggaG9wY291bnQsCi0JCQkgIHUxNiB0YWJsZSk7Ci0JaW50ICgqc2V0X2RvbWFpbikgKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB1MTYgZGVzdGlkLCB1OCBob3Bjb3VudCwKLQkJCSAgIHU4IHN3X2RvbWFpbik7Ci0JaW50ICgqZ2V0X2RvbWFpbikgKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB1MTYgZGVzdGlkLCB1OCBob3Bjb3VudCwKLQkJCSAgIHU4ICpzd19kb21haW4pOwotCWludCAoKmVtX2luaXQpIChzdHJ1Y3QgcmlvX2RldiAqZGV2KTsKLQlpbnQgKCplbV9oYW5kbGUpIChzdHJ1Y3QgcmlvX2RldiAqZGV2LCB1OCBzd3BvcnQpOwotCWludCAoKnN3X3N5c2ZzKSAoc3RydWN0IHJpb19kZXYgKmRldiwgaW50IGNyZWF0ZSk7Ci0Jc3RydWN0IHJpb19kZXYgKm5leHRkZXZbMF07Ci19OwotCiAvKiBMb3ctbGV2ZWwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCByb3V0aW5lcyAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmlvX2Rydi5oIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKaW5kZXggZWRjNTVkYS4uZTA5ZTU2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKQEAgLTE1MCwxNiArMTUwLDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IHJpb19yZWFkX2NvbmZpZ18zMihzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTMyIG9mZnNldCwKIAkJCQkgICAgIHUzMiAqIGRhdGEpCiB7Ci0JdTggaG9wY291bnQgPSAweGZmOwotCXUxNiBkZXN0aWQgPSByZGV2LT5kZXN0aWQ7Ci0KLQlpZiAocmRldi0+cnN3aXRjaCkgewotCQlkZXN0aWQgPSByZGV2LT5yc3dpdGNoLT5kZXN0aWQ7Ci0JCWhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7Ci0JfQotCi0JcmV0dXJuIHJpb19tcG9ydF9yZWFkX2NvbmZpZ18zMihyZGV2LT5uZXQtPmhwb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCQlvZmZzZXQsIGRhdGEpOworCXJldHVybiByaW9fbXBvcnRfcmVhZF9jb25maWdfMzIocmRldi0+bmV0LT5ocG9ydCwgcmRldi0+ZGVzdGlkLAorCQkJCQlyZGV2LT5ob3Bjb3VudCwgb2Zmc2V0LCBkYXRhKTsKIH07CiAKIC8qKgpAQCAtMTc0LDE2ICsxNjYsOCBAQAogc3RhdGljIGlubGluZSBpbnQgcmlvX3dyaXRlX2NvbmZpZ18zMihzdHJ1Y3QgcmlvX2RldiAqcmRldiwgdTMyIG9mZnNldCwKIAkJCQkgICAgICB1MzIgZGF0YSkKIHsKLQl1OCBob3Bjb3VudCA9IDB4ZmY7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPmRlc3RpZDsKLQotCWlmIChyZGV2LT5yc3dpdGNoKSB7Ci0JCWRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQkJaG9wY291bnQgPSByZGV2LT5yc3dpdGNoLT5ob3Bjb3VudDsKLQl9Ci0KLQlyZXR1cm4gcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihyZGV2LT5uZXQtPmhwb3J0LCBkZXN0aWQsIGhvcGNvdW50LAotCQkJCQkgb2Zmc2V0LCBkYXRhKTsKKwlyZXR1cm4gcmlvX21wb3J0X3dyaXRlX2NvbmZpZ18zMihyZGV2LT5uZXQtPmhwb3J0LCByZGV2LT5kZXN0aWQsCisJCQkJCSByZGV2LT5ob3Bjb3VudCwgb2Zmc2V0LCBkYXRhKTsKIH07CiAKIC8qKgpAQCAtMTk4LDE2ICsxODIsOCBAQAogc3RhdGljIGlubGluZSBpbnQgcmlvX3JlYWRfY29uZmlnXzE2KHN0cnVjdCByaW9fZGV2ICpyZGV2LCB1MzIgb2Zmc2V0LAogCQkJCSAgICAgdTE2ICogZGF0YSkKIHsKLQl1OCBob3Bjb3VudCA9IDB4ZmY7Ci0JdTE2IGRlc3RpZCA9IHJkZXYtPmRlc3RpZDsKLQotCWlmIChyZGV2LT5yc3dpdGNoKSB7Ci0JCWRlc3RpZCA9IHJkZXYtPnJzd2l0Y2gtPmRlc3RpZDsKLQkJaG9wY291bnQgPSByZGV2LT5yc3dpdGNoLT5ob3Bjb3VudDsKLQl9Ci0KLQlyZXR1cm4gcmlvX21wb3J0X3JlYWRfY29uZmlnXzE2KHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJCW9mZnNldCwgZGF0YSk7CisJcmV0dXJuIHJpb19tcG9ydF9yZWFkX2NvbmZpZ18xNihyZGV2LT5uZXQtPmhwb3J0LCByZGV2LT5kZXN0aWQsCisJCQkJCXJkZXYtPmhvcGNvdW50LCBvZmZzZXQsIGRhdGEpOwogfTsKIAogLyoqCkBAIC0yMjIsMTYgKzE5OCw4IEBACiBzdGF0aWMgaW5saW5lIGludCByaW9fd3JpdGVfY29uZmlnXzE2KHN0cnVjdCByaW9fZGV2ICpyZGV2LCB1MzIgb2Zmc2V0LAogCQkJCSAgICAgIHUxNiBkYXRhKQogewotCXU4IGhvcGNvdW50ID0gMHhmZjsKLQl1MTYgZGVzdGlkID0gcmRldi0+ZGVzdGlkOwotCi0JaWYgKHJkZXYtPnJzd2l0Y2gpIHsKLQkJZGVzdGlkID0gcmRldi0+cnN3aXRjaC0+ZGVzdGlkOwotCQlob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwotCX0KLQotCXJldHVybiByaW9fbXBvcnRfd3JpdGVfY29uZmlnXzE2KHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJCSBvZmZzZXQsIGRhdGEpOworCXJldHVybiByaW9fbXBvcnRfd3JpdGVfY29uZmlnXzE2KHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPmRlc3RpZCwKKwkJCQkJIHJkZXYtPmhvcGNvdW50LCBvZmZzZXQsIGRhdGEpOwogfTsKIAogLyoqCkBAIC0yNDUsMTYgKzIxMyw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHJpb19yZWFkX2NvbmZpZ184KHN0cnVjdCByaW9fZGV2ICpyZGV2LCB1MzIgb2Zmc2V0LCB1OCAqIGRhdGEpCiB7Ci0JdTggaG9wY291bnQgPSAweGZmOwotCXUxNiBkZXN0aWQgPSByZGV2LT5kZXN0aWQ7Ci0KLQlpZiAocmRldi0+cnN3aXRjaCkgewotCQlkZXN0aWQgPSByZGV2LT5yc3dpdGNoLT5kZXN0aWQ7Ci0JCWhvcGNvdW50ID0gcmRldi0+cnN3aXRjaC0+aG9wY291bnQ7Ci0JfQotCi0JcmV0dXJuIHJpb19tcG9ydF9yZWFkX2NvbmZpZ184KHJkZXYtPm5ldC0+aHBvcnQsIGRlc3RpZCwgaG9wY291bnQsCi0JCQkJICAgICAgIG9mZnNldCwgZGF0YSk7CisJcmV0dXJuIHJpb19tcG9ydF9yZWFkX2NvbmZpZ184KHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPmRlc3RpZCwKKwkJCQkgICAgICAgcmRldi0+aG9wY291bnQsIG9mZnNldCwgZGF0YSk7CiB9OwogCiAvKioKQEAgLTI2OCwxNiArMjI4LDggQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgcmlvX3dyaXRlX2NvbmZpZ184KHN0cnVjdCByaW9fZGV2ICpyZGV2LCB1MzIgb2Zmc2V0LCB1OCBkYXRhKQogewotCXU4IGhvcGNvdW50ID0gMHhmZjsKLQl1MTYgZGVzdGlkID0gcmRldi0+ZGVzdGlkOwotCi0JaWYgKHJkZXYtPnJzd2l0Y2gpIHsKLQkJZGVzdGlkID0gcmRldi0+cnN3aXRjaC0+ZGVzdGlkOwotCQlob3Bjb3VudCA9IHJkZXYtPnJzd2l0Y2gtPmhvcGNvdW50OwotCX0KLQotCXJldHVybiByaW9fbXBvcnRfd3JpdGVfY29uZmlnXzgocmRldi0+bmV0LT5ocG9ydCwgZGVzdGlkLCBob3Bjb3VudCwKLQkJCQkJb2Zmc2V0LCBkYXRhKTsKKwlyZXR1cm4gcmlvX21wb3J0X3dyaXRlX2NvbmZpZ184KHJkZXYtPm5ldC0+aHBvcnQsIHJkZXYtPmRlc3RpZCwKKwkJCQkJcmRldi0+aG9wY291bnQsIG9mZnNldCwgZGF0YSk7CiB9OwogCiBleHRlcm4gaW50IHJpb19tcG9ydF9zZW5kX2Rvb3JiZWxsKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB1MTYgZGVzdGlkLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yaW9faWRzLmggYi9pbmNsdWRlL2xpbnV4L3Jpb19pZHMuaAppbmRleCBlZTdiNmFkLi43NDEwZDMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Jpb19pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Jpb19pZHMuaApAQCAtMzYsNSArMzYsNyBAQAogI2RlZmluZSBSSU9fRElEX0lEVENQUzEwUQkJMHgwMzVlCiAjZGVmaW5lIFJJT19ESURfSURUQ1BTMTg0OAkJMHgwMzc0CiAjZGVmaW5lIFJJT19ESURfSURUQ1BTMTYxNgkJMHgwMzc5CisjZGVmaW5lIFJJT19ESURfSURUVlBTMTYxNgkJMHgwMzc3CisjZGVmaW5lIFJJT19ESURfSURUU1BTMTYxNgkJMHgwMzc4CiAKICNlbmRpZgkJCQkvKiBMSU5VWF9SSU9fSURTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggYmI4M2MwZC4uZTlmZDA0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTE5OCw2ICsxOTgsOCBAQAogfTsKICNkZWZpbmUgVFRVX0FDVElPTih4KSAoKHgpICYgVFRVX0FDVElPTl9NQVNLKQogCitib29sIGlzX3ZtYV90ZW1wb3Jhcnlfc3RhY2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCiBpbnQgdHJ5X3RvX3VubWFwKHN0cnVjdCBwYWdlICosIGVudW0gdHR1X2ZsYWdzIGZsYWdzKTsKIGludCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBwYWdlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLAogCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBlbnVtIHR0dV9mbGFncyBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3JvbWZzX2ZzLmgKaW5kZXggYzQ5MGZiYy4uNWY1N2Y5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yb21mc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcm9tZnNfZnMuaApAQCAtMSw2ICsxLDkgQEAKICNpZm5kZWYgX19MSU5VWF9ST01GU19GU19ICiAjZGVmaW5lIF9fTElOVVhfUk9NRlNfRlNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCiAvKiBUaGUgYmFzaWMgc3RydWN0dXJlcyBvZiB0aGUgcm9tZnMgZmlsZXN5c3RlbSAqLwogCiAjZGVmaW5lIFJPTUJTSVpFIEJMT0NLX1NJWkUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjLmggYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCmluZGV4IDE0ZGJjODMuLjNjOTk1YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtMTA3LDEyICsxMDcsMTcgQEAKIGV4dGVybiBpbnQgcnRjX3ZhbGlkX3RtKHN0cnVjdCBydGNfdGltZSAqdG0pOwogZXh0ZXJuIGludCBydGNfdG1fdG9fdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtLCB1bnNpZ25lZCBsb25nICp0aW1lKTsKIGV4dGVybiB2b2lkIHJ0Y190aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgc3RydWN0IHJ0Y190aW1lICp0bSk7CitrdGltZV90IHJ0Y190bV90b19rdGltZShzdHJ1Y3QgcnRjX3RpbWUgdG0pOworc3RydWN0IHJ0Y190aW1lIHJ0Y19rdGltZV90b190bShrdGltZV90IGt0KTsKKwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXJxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiBleHRlcm4gc3RydWN0IGNsYXNzICpydGNfY2xhc3M7CiAKQEAgLTE1MSw3ICsxNTYsMTkgQEAKIH07CiAKICNkZWZpbmUgUlRDX0RFVklDRV9OQU1FX1NJWkUgMjAKLXN0cnVjdCBydGNfdGFzazsKK3R5cGVkZWYgc3RydWN0IHJ0Y190YXNrIHsKKwl2b2lkICgqZnVuYykodm9pZCAqcHJpdmF0ZV9kYXRhKTsKKwl2b2lkICpwcml2YXRlX2RhdGE7Cit9IHJ0Y190YXNrX3Q7CisKKworc3RydWN0IHJ0Y190aW1lciB7CisJc3RydWN0IHJ0Y190YXNrCXRhc2s7CisJc3RydWN0IHRpbWVycXVldWVfbm9kZSBub2RlOworCWt0aW1lX3QgcGVyaW9kOworCWludCBlbmFibGVkOworfTsKKwogCiAvKiBmbGFncyAqLwogI2RlZmluZSBSVENfREVWX0JVU1kgMApAQCAtMTc5LDE2ICsxOTYsMTMgQEAKIAlzcGlubG9ja190IGlycV90YXNrX2xvY2s7CiAJaW50IGlycV9mcmVxOwogCWludCBtYXhfdXNlcl9mcmVxOwotI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdWllX3Rhc2s7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdWllX3RpbWVyOwotCS8qIFRob3NlIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHJ0Yy0+aXJxX2xvY2sgKi8KLQl1bnNpZ25lZCBpbnQgb2xkc2VjczsKLQl1bnNpZ25lZCBpbnQgdWllX2lycV9hY3RpdmU6MTsKLQl1bnNpZ25lZCBpbnQgc3RvcF91aWVfcG9sbGluZzoxOwotCXVuc2lnbmVkIGludCB1aWVfdGFza19hY3RpdmU6MTsKLQl1bnNpZ25lZCBpbnQgdWllX3RpbWVyX2FjdGl2ZToxOwotI2VuZGlmCisKKwlzdHJ1Y3QgdGltZXJxdWV1ZV9oZWFkIHRpbWVycXVldWU7CisJc3RydWN0IHJ0Y190aW1lciBhaWVfdGltZXI7CisJc3RydWN0IHJ0Y190aW1lciB1aWVfcnRjdGltZXI7CisJc3RydWN0IGhydGltZXIgcGllX3RpbWVyOyAvKiBzdWIgc2Vjb25kIGV4cCwgc28gbmVlZHMgaHJ0aW1lciAqLworCWludCBwaWVfZW5hYmxlZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxd29yazsKIH07CiAjZGVmaW5lIHRvX3J0Y19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBydGNfZGV2aWNlLCBkZXYpCiAKQEAgLTIyNCwxNSArMjM4LDIyIEBACiBleHRlcm4gaW50IHJ0Y19kZXZfdXBkYXRlX2lycV9lbmFibGVfZW11bChzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLAogCQkJCQkJdW5zaWduZWQgaW50IGVuYWJsZWQpOwogCi10eXBlZGVmIHN0cnVjdCBydGNfdGFzayB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKnByaXZhdGVfZGF0YSk7Ci0Jdm9pZCAqcHJpdmF0ZV9kYXRhOwotfSBydGNfdGFza190Owordm9pZCBydGNfYWllX3VwZGF0ZV9pcnEodm9pZCAqcHJpdmF0ZSk7Cit2b2lkIHJ0Y191aWVfdXBkYXRlX2lycSh2b2lkICpwcml2YXRlKTsKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IHJ0Y19waWVfdXBkYXRlX2lycShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogCiBpbnQgcnRjX3JlZ2lzdGVyKHJ0Y190YXNrX3QgKnRhc2spOwogaW50IHJ0Y191bnJlZ2lzdGVyKHJ0Y190YXNrX3QgKnRhc2spOwogaW50IHJ0Y19jb250cm9sKHJ0Y190YXNrX3QgKnQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAordm9pZCBydGNfdGltZXJfZW5xdWV1ZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lcik7Cit2b2lkIHJ0Y190aW1lcl9yZW1vdmUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciAqdGltZXIpOwordm9pZCBydGNfdGltZXJfaW5pdChzdHJ1Y3QgcnRjX3RpbWVyICp0aW1lciwgdm9pZCAoKmYpKHZvaWQqIHApLCB2b2lkKiBkYXRhKTsKK2ludCBydGNfdGltZXJfc3RhcnQoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciogdGltZXIsCisJCQlrdGltZV90IGV4cGlyZXMsIGt0aW1lX3QgcGVyaW9kKTsKK2ludCBydGNfdGltZXJfY2FuY2VsKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIqIHRpbWVyKTsKK3ZvaWQgcnRjX3RpbWVyX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogc3RhdGljIGlubGluZSBib29sIGlzX2xlYXBfeWVhcih1bnNpZ25lZCBpbnQgeWVhcikKIHsKIAlyZXR1cm4gKCEoeWVhciAlIDQpICYmICh5ZWFyICUgMTAwKSkgfHwgISh5ZWFyICUgNDAwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvczNjX2FkY19iYXR0ZXJ5LmggYi9pbmNsdWRlL2xpbnV4L3MzY19hZGNfYmF0dGVyeS5oCmluZGV4IGRiY2UyMmYuLmZiZTU4YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvczNjX2FkY19iYXR0ZXJ5LmgKKysrIGIvaW5jbHVkZS9saW51eC9zM2NfYWRjX2JhdHRlcnkuaApAQCAtMTQsNiArMTQsNyBAQAogCXZvaWQgKCpkaXNhYmxlX2NoYXJnZXIpKHZvaWQpOwogCiAJaW50IGdwaW9fY2hhcmdlX2ZpbmlzaGVkOworCWludCBncGlvX2ludmVydGVkOwogCiAJY29uc3Qgc3RydWN0IHMzY19hZGNfYmF0X3RocmVzaCAqbHV0X25vYWM7CiAJdW5zaWduZWQgaW50IGx1dF9ub2FjX2NudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAzNDFhY2JiYy4uZDc0N2Y5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMjEsNyArMjEsOCBAQAogI2RlZmluZSBDTE9ORV9ERVRBQ0hFRAkJMHgwMDQwMDAwMAkvKiBVbnVzZWQsIGlnbm9yZWQgKi8KICNkZWZpbmUgQ0xPTkVfVU5UUkFDRUQJCTB4MDA4MDAwMDAJLyogc2V0IGlmIHRoZSB0cmFjaW5nIHByb2Nlc3MgY2FuJ3QgZm9yY2UgQ0xPTkVfUFRSQUNFIG9uIHRoaXMgY2xvbmUgKi8KICNkZWZpbmUgQ0xPTkVfQ0hJTERfU0VUVElECTB4MDEwMDAwMDAJLyogc2V0IHRoZSBUSUQgaW4gdGhlIGNoaWxkICovCi0jZGVmaW5lIENMT05FX1NUT1BQRUQJCTB4MDIwMDAwMDAJLyogU3RhcnQgaW4gc3RvcHBlZCBzdGF0ZSAqLworLyogMHgwMjAwMDAwMCB3YXMgcHJldmlvdXNseSB0aGUgdW51c2VkIENMT05FX1NUT1BQRUQgKFN0YXJ0IGluIHN0b3BwZWQgc3RhdGUpCisgICBhbmQgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmUtdXNlLiAqLwogI2RlZmluZSBDTE9ORV9ORVdVVFMJCTB4MDQwMDAwMDAJLyogTmV3IHV0c25hbWUgZ3JvdXA/ICovCiAjZGVmaW5lIENMT05FX05FV0lQQwkJMHgwODAwMDAwMAkvKiBOZXcgaXBjcyAqLwogI2RlZmluZSBDTE9ORV9ORVdVU0VSCQkweDEwMDAwMDAwCS8qIE5ldyB1c2VyIG5hbWVzcGFjZSAqLwpAQCAtNzAsNyArNzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9waWQuaD4KQEAgLTg4LDcgKzg4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGF0ZW5jeXRvcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KIApAQCAtNDM1LDYgKzQzNCw3IEBACiAjZW5kaWYKIAkJCQkJLyogbGVhdmUgcm9vbSBmb3IgbW9yZSBkdW1wIGZsYWdzICovCiAjZGVmaW5lIE1NRl9WTV9NRVJHRUFCTEUJMTYJLyogS1NNIG1heSBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKyNkZWZpbmUgTU1GX1ZNX0hVR0VQQUdFCQkxNwkvKiBzZXQgd2hlbiBWTV9IVUdFUEFHRSBpcyBzZXQgb24gdm1hICovCiAKICNkZWZpbmUgTU1GX0lOSVRfTUFTSwkJKE1NRl9EVU1QQUJMRV9NQVNLIHwgTU1GX0RVTVBfRklMVEVSX01BU0spCiAKQEAgLTYzNSw2ICs2MzUsOCBAQAogCiAJaW50IG9vbV9hZGo7CQkvKiBPT00ga2lsbCBzY29yZSBhZGp1c3RtZW50IChiaXQgc2hpZnQpICovCiAJaW50IG9vbV9zY29yZV9hZGo7CS8qIE9PTSBraWxsIHNjb3JlIGFkanVzdG1lbnQgKi8KKwlpbnQgb29tX3Njb3JlX2Fkal9taW47CS8qIE9PTSBraWxsIHNjb3JlIGFkanVzdG1lbnQgbWluaW11bSB2YWx1ZS4KKwkJCQkgKiBPbmx5IHNldHRhYmxlIGJ5IENBUF9TWVNfUkVTT1VSQ0UuICovCiAKIAlzdHJ1Y3QgbXV0ZXggY3JlZF9ndWFyZF9tdXRleDsJLyogZ3VhcmQgYWdhaW5zdCBmb3JlaWduIGluZmx1ZW5jZXMgb24KIAkJCQkJICogY3JlZGVudGlhbCBjYWxjdWxhdGlvbnMKQEAgLTY4NSw3ICs2ODcsNyBAQAogCWF0b21pY190IGZhbm90aWZ5X2xpc3RlbmVyczsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FUE9MTAotCWF0b21pY190IGVwb2xsX3dhdGNoZXM7CS8qIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjdXJyZW50bHkgd2F0Y2hlZCAqLworCWF0b21pY19sb25nX3QgZXBvbGxfd2F0Y2hlczsgLyogVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGN1cnJlbnRseSB3YXRjaGVkICovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUE9TSVhfTVFVRVVFCiAJLyogcHJvdGVjdGVkIGJ5IG1xX2xvY2sJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaCBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAppbmRleCAxYWM0MjQ3NS4uYzY0MmJiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMTA1OCw4ICsxMDU4LDcgQEAKICAqCUBjcmVkIHBvaW50cyB0byB0aGUgY3JlZGVudGlhbHMgdG8gcHJvdmlkZSB0aGUgY29udGV4dCBhZ2FpbnN0IHdoaWNoIHRvCiAgKglldmFsdWF0ZSB0aGUgc2VjdXJpdHkgZGF0YSBvbiB0aGUga2V5LgogICoJQHBlcm0gZGVzY3JpYmVzIHRoZSBjb21iaW5hdGlvbiBvZiBwZXJtaXNzaW9ucyByZXF1aXJlZCBvZiB0aGlzIGtleS4KLSAqCVJldHVybiAxIGlmIHBlcm1pc3Npb24gZ3JhbnRlZCwgMCBpZiBwZXJtaXNzaW9uIGRlbmllZCBhbmQgLXZlIGl0IHRoZQotICoJbm9ybWFsIHBlcm1pc3Npb25zIG1vZGVsIHNob3VsZCBiZSBlZmZlY3RlZC4KKyAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCwgLXZlIGVycm9yIG90aGVyd2lzZS4KICAqIEBrZXlfZ2V0c2VjdXJpdHk6CiAgKglHZXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBjb250ZXh0IGF0dGFjaGVkIHRvIGEga2V5CiAgKglmb3IgdGhlIHB1cnBvc2VzIG9mIGhvbm91cmluZyBLRVlDVExfR0VUU0VDVVJJVFkuICBUaGlzIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggYTIzZmEyOS4uNzU4YzViMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMjEyLDYgKzIxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bwc19rZXJuZWwuaD4KIAogc3RydWN0IHVhcnRfcG9ydDsKIHN0cnVjdCBzZXJpYWxfc3RydWN0OwpAQCAtNTI4LDEwICs1MjksMTAgQEAKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSB1cG9ydC0+c3RhdGU7CiAJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnN0YXRlLT5wb3J0OwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZihwb3J0LT50dHkpOwotCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgcHBzX2V2ZW50X3RpbWUgdHM7CiAKIAlpZiAobGQgJiYgbGQtPm9wcy0+ZGNkX2NoYW5nZSkKLQkJZ2V0bnN0aW1lb2ZkYXkoJnRzKTsKKwkJcHBzX2dldF90cygmdHMpOwogCiAJdXBvcnQtPmljb3VudC5kY2QrKzsKICNpZmRlZiBDT05GSUdfSEFSRF9QUFMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKaW5kZXggYmFlZDIxMi4uMTYzMGQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKQEAgLTgsNiArOCwyMyBAQAogICogR2VuZXJpYyBoZWFkZXIgZm9yIFN1cGVySCBTQ0koRikgKHVzZWQgYnkgc2gvc2g2NC9oODMwMCBhbmQgcmVsYXRlZCBwYXJ0cykKICAqLwogCitlbnVtIHsKKwlTQ0JSUl9BTEdPXzEsCQkvKiAoKGNsayArIDE2ICogYnBzKSAvICgxNiAqIGJwcykgLSAxKSAqLworCVNDQlJSX0FMR09fMiwJCS8qICgoY2xrICsgMTYgKiBicHMpIC8gKDMyICogYnBzKSAtIDEpICovCisJU0NCUlJfQUxHT18zLAkJLyogKCgoY2xrICogMikgKyAxNiAqIGJwcykgLyAoMTYgKiBicHMpIC0gMSkgKi8KKwlTQ0JSUl9BTEdPXzQsCQkvKiAoKChjbGsgKiAyKSArIDE2ICogYnBzKSAvICgzMiAqIGJwcykgLSAxKSAqLworCVNDQlJSX0FMR09fNSwJCS8qICgoKGNsayAqIDEwMDAgLyAzMikgLyBicHMpIC0gMSkgKi8KK307CisKKyNkZWZpbmUgU0NTQ1JfVElFCSgxIDw8IDcpCisjZGVmaW5lIFNDU0NSX1JJRQkoMSA8PCA2KQorI2RlZmluZSBTQ1NDUl9URQkoMSA8PCA1KQorI2RlZmluZSBTQ1NDUl9SRQkoMSA8PCA0KQorI2RlZmluZSBTQ1NDUl9SRUlFCSgxIDw8IDMpCS8qIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBhcnRzICovCisjZGVmaW5lIFNDU0NSX1RPSUUJKDEgPDwgMikJLyogbm90IHN1cHBvcnRlZCBieSBhbGwgcGFydHMgKi8KKyNkZWZpbmUgU0NTQ1JfQ0tFMQkoMSA8PCAxKQorI2RlZmluZSBTQ1NDUl9DS0UwCSgxIDw8IDApCisKIC8qIE9mZnNldHMgaW50byB0aGUgc2NpX3BvcnQtPmlycXMgYXJyYXkgKi8KIGVudW0gewogCVNDSXhfRVJJX0lSUSwKQEAgLTI5LDcgKzQ2LDEyIEBACiAJdW5zaWduZWQgaW50CXR5cGU7CQkJLyogU0NJIC8gU0NJRiAvIElSREEgKi8KIAl1cGZfdAkJZmxhZ3M7CQkJLyogVVBGXyogZmxhZ3MgKi8KIAljaGFyCQkqY2xrOwkJCS8qIGNsb2NrIHN0cmluZyAqLworCisJdW5zaWduZWQgaW50CXNjYnJyX2FsZ29faWQ7CQkvKiBTQ0JSUiBjYWxjdWxhdGlvbiBhbGdvICovCisJdW5zaWduZWQgaW50CXNjc2NyOwkJCS8qIFNDU0NSIGluaXRpYWxpemF0aW9uICovCisKIAlzdHJ1Y3QgZGV2aWNlCSpkbWFfZGV2OworCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TSF9TQ0lfRE1BCiAJdW5zaWduZWQgaW50IGRtYV9zbGF2ZV90eDsKIAl1bnNpZ25lZCBpbnQgZG1hX3NsYXZlX3J4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDc5MWE1MDIuLjgzMjAzYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTEzOCwxMSArMTM4LDEyIEBACiB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHNpemVfdCBzaXplLAorCQkJCSAgICBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gc2l6ZV90IHNsYWJfYnVmZmVyX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKK2ttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZV90IHNpemUsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwogfQpAQCAtMTc5LDEwICsxODAsNyBAQAogI2VuZGlmCiAJCQljYWNoZXAgPSBtYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwOwogCi0JCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShjYWNoZXAsIGZsYWdzKTsKLQotCQl0cmFjZV9rbWFsbG9jKF9USElTX0lQXywgcmV0LAotCQkJICAgICAgc2l6ZSwgc2xhYl9idWZmZXJfc2l6ZShjYWNoZXApLCBmbGFncyk7CisJCXJldCA9IGttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZSwgY2FjaGVwLCBmbGFncyk7CiAKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xOTQsMTQgKzE5MiwxNiBAQAogZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAotCQkJCQkgICBnZnBfdCBmbGFncywKLQkJCQkJICAgaW50IG5vZGVpZCk7CitleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHNpemVfdCBzaXplLAorCQkJCQkgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCQkJIGdmcF90IGZsYWdzLAorCQkJCQkgaW50IG5vZGVpZCk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCi0JCQkgICAgICBnZnBfdCBmbGFncywKLQkJCSAgICAgIGludCBub2RlaWQpCitrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc2l6ZV90IHNpemUsCisJCQkgICAgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCSAgICBnZnBfdCBmbGFncywKKwkJCSAgICBpbnQgbm9kZWlkKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKIH0KQEAgLTIxMCw3ICsyMTAsNiBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwotCXZvaWQgKnJldDsKIAogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CkBAIC0yMzQsMTMgKzIzMyw3IEBACiAjZW5kaWYKIAkJCWNhY2hlcCA9IG1hbGxvY19zaXplc1tpXS5jc19jYWNoZXA7CiAKLQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UoY2FjaGVwLCBmbGFncywgbm9kZSk7Ci0KLQkJdHJhY2Vfa21hbGxvY19ub2RlKF9USElTX0lQXywgcmV0LAotCQkJCSAgIHNpemUsIHNsYWJfYnVmZmVyX3NpemUoY2FjaGVwKSwKLQkJCQkgICBmbGFncywgbm9kZSk7Ci0KLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzaXplLCBjYWNoZXAsIGZsYWdzLCBub2RlKTsKIAl9CiAJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCBlNGY1ZWQxLi44YjZlOGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMCw5ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKIGVudW0gc3RhdF9pdGVtIHsKIAlBTExPQ19GQVNUUEFUSCwJCS8qIEFsbG9jYXRpb24gZnJvbSBjcHUgc2xhYiAqLwpAQCAtMjE2LDMxICsyMTUsNDAgQEAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwogdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitrbWFsbG9jX29yZGVyKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgdW5zaWduZWQgaW50IG9yZGVyKQoreworCXZvaWQgKnJldCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MgfCBfX0dGUF9DT01QLCBvcmRlcik7CisJa21lbWxlYWtfYWxsb2MocmV0LCBzaXplLCAxLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKwogI2lmZGVmIENPTkZJR19UUkFDSU5HCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncyk7CitleHRlcm4gdm9pZCAqCitrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKmttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwogI2Vsc2UKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCi1rbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzKQora21lbV9jYWNoZV9hbGxvY190cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MsIHNpemVfdCBzaXplKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKHMsIGdmcGZsYWdzKTsKIH0KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK2ttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJcmV0dXJuIGttYWxsb2Nfb3JkZXIoc2l6ZSwgZmxhZ3MsIG9yZGVyKTsKK30KICNlbmRpZgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttYWxsb2NfbGFyZ2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewogCXVuc2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQl2b2lkICpyZXQgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGZsYWdzIHwgX19HRlBfQ09NUCwgb3JkZXIpOwotCi0Ja21lbWxlYWtfYWxsb2MocmV0LCBzaXplLCAxLCBmbGFncyk7Ci0JdHJhY2Vfa21hbGxvYyhfVEhJU19JUF8sIHJldCwgc2l6ZSwgUEFHRV9TSVpFIDw8IG9yZGVyLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBrbWFsbG9jX29yZGVyX3RyYWNlKHNpemUsIGZsYWdzLCBvcmRlcik7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7Ci0Jdm9pZCAqcmV0OwotCiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWlmIChzaXplID4gU0xVQl9NQVhfU0laRSkKIAkJCXJldHVybiBrbWFsbG9jX2xhcmdlKHNpemUsIGZsYWdzKTsKQEAgLTI1MSwxMSArMjU5LDcgQEAKIAkJCWlmICghcykKIAkJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKIAotCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHMsIGZsYWdzKTsKLQotCQkJdHJhY2Vfa21hbGxvYyhfVEhJU19JUF8sIHJldCwgc2l6ZSwgcy0+c2l6ZSwgZmxhZ3MpOwotCi0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2NfdHJhY2UocywgZmxhZ3MsIHNpemUpOwogCQl9CiAJfQogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwpAQCAtMjY2LDE0ICsyNzAsMTQgQEAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQkJCSAgIGdmcF90IGdmcGZsYWdzLAotCQkJCQkgICBpbnQgbm9kZSk7CisJCQkJCSAgIGludCBub2RlLCBzaXplX3Qgc2l6ZSk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAora21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQkJICAgICAgZ2ZwX3QgZ2ZwZmxhZ3MsCi0JCQkgICAgICBpbnQgbm9kZSkKKwkJCSAgICAgIGludCBub2RlLCBzaXplX3Qgc2l6ZSkKIHsKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKHMsIGdmcGZsYWdzLCBub2RlKTsKIH0KQEAgLTI4MSw4ICsyODUsNiBAQAogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewotCXZvaWQgKnJldDsKLQogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSAmJgogCQlzaXplIDw9IFNMVUJfTUFYX1NJWkUgJiYgIShmbGFncyAmIFNMVUJfRE1BKSkgewogCQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBrbWFsbG9jX3NsYWIoc2l6ZSk7CkBAIC0yOTAsMTIgKzI5Miw3IEBACiAJCWlmICghcykKIAkJCXJldHVybiBaRVJPX1NJWkVfUFRSOwogCi0JCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHMsIGZsYWdzLCBub2RlKTsKLQotCQl0cmFjZV9rbWFsbG9jX25vZGUoX1RISVNfSVBfLCByZXQsCi0JCQkJICAgc2l6ZSwgcy0+c2l6ZSwgZmxhZ3MsIG5vZGUpOwotCi0JCXJldHVybiByZXQ7CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2UocywgZmxhZ3MsIG5vZGUsIHNpemUpOwogCX0KIAlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaCBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKaW5kZXggNWY2NWYxNC4uZWRiYjFkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCkBAIC0xOTEsNyArMTkxLDggQEAKICNkZWZpbmUgQUZfUEhPTkVUCTM1CS8qIFBob25ldCBzb2NrZXRzCQkqLwogI2RlZmluZSBBRl9JRUVFODAyMTU0CTM2CS8qIElFRUU4MDIxNTQgc29ja2V0cwkJKi8KICNkZWZpbmUgQUZfQ0FJRgkJMzcJLyogQ0FJRiBzb2NrZXRzCQkJKi8KLSNkZWZpbmUgQUZfTUFYCQkzOAkvKiBGb3Igbm93Li4gKi8KKyNkZWZpbmUgQUZfQUxHCQkzOAkvKiBBbGdvcml0aG0gc29ja2V0cwkJKi8KKyNkZWZpbmUgQUZfTUFYCQkzOQkvKiBGb3Igbm93Li4gKi8KIAogLyogUHJvdG9jb2wgZmFtaWxpZXMsIHNhbWUgYXMgYWRkcmVzcyBmYW1pbGllcy4gKi8KICNkZWZpbmUgUEZfVU5TUEVDCUFGX1VOU1BFQwpAQCAtMjMyLDYgKzIzMyw3IEBACiAjZGVmaW5lIFBGX1BIT05FVAlBRl9QSE9ORVQKICNkZWZpbmUgUEZfSUVFRTgwMjE1NAlBRl9JRUVFODAyMTU0CiAjZGVmaW5lIFBGX0NBSUYJCUFGX0NBSUYKKyNkZWZpbmUgUEZfQUxHCQlBRl9BTEcKICNkZWZpbmUgUEZfTUFYCQlBRl9NQVgKIAogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KQEAgLTMwNSw2ICszMDcsNyBAQAogI2RlZmluZSBTT0xfUkRTCQkyNzYKICNkZWZpbmUgU09MX0lVQ1YJMjc3CiAjZGVmaW5lIFNPTF9DQUlGCTI3OAorI2RlZmluZSBTT0xfQUxHCQkyNzkKIAogLyogSVBYIG9wdGlvbnMgKi8KICNkZWZpbmUgSVBYX1RZUEUJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb255cGkuaCBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKaW5kZXggNGY5NWMxYS4uMGU2ZGMzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb255cGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCkBAIC0xMTIsNiArMTEyLDcgQEAKICNkZWZpbmUgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRAkJNzAKICNkZWZpbmUgU09OWVBJX0VWRU5UX0JSSUdIVE5FU1NfUFJFU1NFRAkJNzEKICNkZWZpbmUgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQJCTcyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9WRU5ET1JfUFJFU1NFRAkJNzMKIAogLyogZ2V0L3NldCBicmlnaHRuZXNzICovCiAjZGVmaW5lIFNPTllQSV9JT0NHQlJUCQlfSU9SKCd2JywgMCwgX191OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2F1dGguaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2F1dGguaAppbmRleCBiMjAyNDc1Li44NTIxMDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9hdXRoLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvYXV0aC5oCkBAIC0xMTAsOSArMTEwLDkgQEAKIAlfX2JlMzIgKgkJKCpjcm1hcnNoYWwpKHN0cnVjdCBycGNfdGFzayAqLCBfX2JlMzIgKik7CiAJaW50CQkJKCpjcnJlZnJlc2gpKHN0cnVjdCBycGNfdGFzayAqKTsKIAlfX2JlMzIgKgkJKCpjcnZhbGlkYXRlKShzdHJ1Y3QgcnBjX3Rhc2sgKiwgX19iZTMyICopOwotCWludAkJCSgqY3J3cmFwX3JlcSkoc3RydWN0IHJwY190YXNrICosIGt4ZHJwcm9jX3QsCisJaW50CQkJKCpjcndyYXBfcmVxKShzdHJ1Y3QgcnBjX3Rhc2sgKiwga3hkcmVwcm9jX3QsCiAJCQkJCQl2b2lkICosIF9fYmUzMiAqLCB2b2lkICopOwotCWludAkJCSgqY3J1bndyYXBfcmVzcCkoc3RydWN0IHJwY190YXNrICosIGt4ZHJwcm9jX3QsCisJaW50CQkJKCpjcnVud3JhcF9yZXNwKShzdHJ1Y3QgcnBjX3Rhc2sgKiwga3hkcmRwcm9jX3QsCiAJCQkJCQl2b2lkICosIF9fYmUzMiAqLCB2b2lkICopOwogfTsKIApAQCAtMTM5LDggKzEzOSw4IEBACiB2b2lkCQkJcHV0X3JwY2NyZWQoc3RydWN0IHJwY19jcmVkICopOwogX19iZTMyICoJCXJwY2F1dGhfbWFyc2hjcmVkKHN0cnVjdCBycGNfdGFzayAqLCBfX2JlMzIgKik7CiBfX2JlMzIgKgkJcnBjYXV0aF9jaGVja3ZlcmYoc3RydWN0IHJwY190YXNrICosIF9fYmUzMiAqKTsKLWludAkJCXJwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGVuY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKTsKLWludAkJCXJwY2F1dGhfdW53cmFwX3Jlc3Aoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGRlY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKTsKK2ludAkJCXJwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRyZXByb2NfdCBlbmNvZGUsIHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaik7CitpbnQJCQlycGNhdXRoX3Vud3JhcF9yZXNwKHN0cnVjdCBycGNfdGFzayAqdGFzaywga3hkcmRwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpkYXRhLCB2b2lkICpvYmopOwogaW50CQkJcnBjYXV0aF9yZWZyZXNoY3JlZChzdHJ1Y3QgcnBjX3Rhc2sgKik7CiB2b2lkCQkJcnBjYXV0aF9pbnZhbGNyZWQoc3RydWN0IHJwY190YXNrICopOwogaW50CQkJcnBjYXV0aF91cHRvZGF0ZWNyZWQoc3RydWN0IHJwY190YXNrICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvYmNfeHBydC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvYmNfeHBydC5oCmluZGV4IDdjOTEyNjAuLmM1MGI0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2JjX3hwcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9iY194cHJ0LmgKQEAgLTQzLDEwICs0MywxOCBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBzdmNfaXNfYmFja2NoYW5uZWwoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKLQlpZiAocnFzdHAtPnJxX3NlcnZlci0+YmNfeHBydCkKKwlpZiAocnFzdHAtPnJxX3NlcnZlci0+c3ZfYmNfeHBydCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqYmNfeHBydF9zaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlpZiAoc3ZjX2lzX2JhY2tjaGFubmVsKHJxc3RwKSkKKwkJcmV0dXJuIChzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgKikKKwkJCXJxc3RwLT5ycV9zZXJ2ZXItPnN2X2JjX3hwcnQtPnhwdF9iY19zaWQ7CisJcmV0dXJuIE5VTEw7Cit9CisKICNlbHNlIC8qIENPTkZJR19ORlNfVjRfMSAqLwogc3RhdGljIGlubGluZSBpbnQgeHBydF9zZXR1cF9iYWNrY2hhbm5lbChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsCiAJCQkJCSB1bnNpZ25lZCBpbnQgbWluX3JlcXMpCkBAIC01OSw2ICs2NywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqYmNfeHBydF9zaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHhwcnRfZnJlZV9iY19yZXF1ZXN0KHN0cnVjdCBycGNfcnFzdCAqcmVxKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKaW5kZXggNjk1MGM5OC4uNzg5OGVhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaWZuZGVmIF9MSU5VWF9TVU5SUENfQ0FDSEVfSF8KICNkZWZpbmUgX0xJTlVYX1NVTlJQQ19DQUNIRV9IXwogCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpAQCAtMjU1LDEwICsyNTYsMTMgQEAKIAlyZXR1cm4gcnYgLSBib290LnR2X3NlYzsKIH0KIAorI2lmZGVmIENPTkZJR19ORlNEX0RFUFJFQ0FURUQKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdW5ycGNfaW52YWxpZGF0ZShzdHJ1Y3QgY2FjaGVfaGVhZCAqaCwKIAkJCQkgICAgIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCkKIHsKIAloLT5leHBpcnlfdGltZSA9IHNlY29uZHNfc2luY2VfYm9vdCgpIC0gMTsKIAlkZXRhaWwtPm5leHRjaGVjayA9IHNlY29uZHNfc2luY2VfYm9vdCgpOwogfQorI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KKwogI2VuZGlmIC8qICBfTElOVVhfU1VOUlBDX0NBQ0hFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKaW5kZXggYTVhNTVmMi4uZWY5NDc2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaApAQCAtODksOCArODksOCBAQAogICovCiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIHsKIAl1MzIJCQlwX3Byb2M7CQkvKiBSUEMgcHJvY2VkdXJlIG51bWJlciAqLwotCWt4ZHJwcm9jX3QJCXBfZW5jb2RlOwkvKiBYRFIgZW5jb2RlIGZ1bmN0aW9uICovCi0Ja3hkcnByb2NfdAkJcF9kZWNvZGU7CS8qIFhEUiBkZWNvZGUgZnVuY3Rpb24gKi8KKwlreGRyZXByb2NfdAkJcF9lbmNvZGU7CS8qIFhEUiBlbmNvZGUgZnVuY3Rpb24gKi8KKwlreGRyZHByb2NfdAkJcF9kZWNvZGU7CS8qIFhEUiBkZWNvZGUgZnVuY3Rpb24gKi8KIAl1bnNpZ25lZCBpbnQJCXBfYXJnbGVuOwkvKiBhcmd1bWVudCBoZHIgbGVuZ3RoICh1MzIpICovCiAJdW5zaWduZWQgaW50CQlwX3JlcGxlbjsJLyogcmVwbHkgaGRyIGxlbmd0aCAodTMyKSAqLwogCXVuc2lnbmVkIGludAkJcF9jb3VudDsJLyogY2FsbCBjb3VudCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCA1YTMwODViLi5lYTI5MzMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtOTksNyArOTksNyBAQAogCXNwaW5sb2NrX3QJCXN2X2NiX2xvY2s7CS8qIHByb3RlY3RzIHRoZSBzdmNfY2JfbGlzdCAqLwogCXdhaXRfcXVldWVfaGVhZF90CXN2X2NiX3dhaXRxOwkvKiBzbGVlcCBoZXJlIGlmIHRoZXJlIGFyZSBubwogCQkJCQkJICogZW50cmllcyBpbiB0aGUgc3ZjX2NiX2xpc3QgKi8KLQlzdHJ1Y3Qgc3ZjX3hwcnQJCSpiY194cHJ0OworCXN0cnVjdCBzdmNfeHBydAkJKnN2X2JjX3hwcnQ7CS8qIGNhbGxiYWNrIG9uIGZvcmUgY2hhbm5lbCAqLwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogfTsKIApAQCAtMjY5LDYgKzI2OSw3IEBACiAJc3RydWN0IGNhY2hlX3JlcQlycV9jaGFuZGxlOwkvKiBoYW5kbGUgcGFzc2VkIHRvIGNhY2hlcyBmb3IgCiAJCQkJCQkgKiByZXF1ZXN0IGRlbGF5aW5nIAogCQkJCQkJICovCisJYm9vbAkJCXJxX2Ryb3BtZTsKIAkvKiBDYXRlcmluZyB0byBuZnNkICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfY2xpZW50OwkvKiBSUEMgcGVlciBpbmZvICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfZ3NzY2xpZW50OwkvKiAiZ3NzLyItc3R5bGUgcGVlciBpbmZvICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3hwcnQuaAppbmRleCBhZWEwZDQzOC4uMDU5ODc3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjX3hwcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oCkBAIC02Myw3ICs2Myw2IEBACiAjZGVmaW5lIFhQVF9MSVNURU5FUgkxMQkJLyogbGlzdGVuaW5nIGVuZHBvaW50ICovCiAjZGVmaW5lIFhQVF9DQUNIRV9BVVRICTEyCQkvKiBjYWNoZSBhdXRoIGluZm8gKi8KIAotCXN0cnVjdCBzdmNfcG9vbAkJKnhwdF9wb29sOwkvKiBjdXJyZW50IHBvb2wgaWZmIHF1ZXVlZCAqLwogCXN0cnVjdCBzdmNfc2VydgkJKnhwdF9zZXJ2ZXI7CS8qIHNlcnZpY2UgZm9yIHRyYW5zcG9ydCAqLwogCWF0b21pY190ICAgIAkgICAgCXhwdF9yZXNlcnZlZDsJLyogc3BhY2Ugb24gb3V0cSB0aGF0IGlzIHJzdmQgKi8KIAlzdHJ1Y3QgbXV0ZXgJCXhwdF9tdXRleDsJLyogdG8gc2VyaWFsaXplIHNlbmRpbmcgZGF0YSAqLwpAQCAtNzgsOCArNzcsMTAgQEAKIAlzaXplX3QJCQl4cHRfcmVtb3RlbGVuOwkvKiBsZW5ndGggb2YgYWRkcmVzcyAqLwogCXN0cnVjdCBycGNfd2FpdF9xdWV1ZQl4cHRfYmNfcGVuZGluZzsJLyogYmFja2NoYW5uZWwgd2FpdCBxdWV1ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJeHB0X3VzZXJzOwkvKiBjYWxsYmFja3Mgb24gZnJlZSAqLworCXZvaWQJCQkqeHB0X2JjX3NpZDsJLyogYmFjayBjaGFubmVsIHNlc3Npb24gSUQgKi8KIAogCXN0cnVjdCBuZXQJCSp4cHRfbmV0OworCXN0cnVjdCBycGNfeHBydAkJKnhwdF9iY194cHJ0OwkvKiBORlN2NC4xIGJhY2tjaGFubmVsICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl94cHRfdXNlcihzdHJ1Y3Qgc3ZjX3hwcnQgKnhwdCwgc3RydWN0IHN2Y194cHRfdXNlciAqdSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y3NvY2suaAppbmRleCAxYjM1M2E3Li4wNGRiYTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNzb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3Zjc29jay5oCkBAIC0yOCw3ICsyOCw2IEBACiAJLyogcHJpdmF0ZSBUQ1AgcGFydCAqLwogCXUzMgkJCXNrX3JlY2xlbjsJLyogbGVuZ3RoIG9mIHJlY29yZCAqLwogCXUzMgkJCXNrX3RjcGxlbjsJLyogY3VycmVudCByZWFkIGxlbmd0aCAqLwotCXN0cnVjdCBycGNfeHBydAkJKnNrX2JjX3hwcnQ7CS8qIE5GU3Y0LjEgYmFja2NoYW5uZWwgeHBydCAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKaW5kZXggNDk4YWI5My4uZmM4NGI3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKQEAgLTMzLDggKzMzLDggQEAKIH07CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBnZW5lcmljIFhEUiBmdW5jdGlvbi4gcnFzdHAgaXMgZWl0aGVyIGEgcnBjX3Jxc3QgKGNsaWVudAotICogc2lkZSkgb3Igc3ZjX3Jxc3QgcG9pbnRlciAoc2VydmVyIHNpZGUpLgorICogVGhpcyBpcyB0aGUgbGVnYWN5IGdlbmVyaWMgWERSIGZ1bmN0aW9uLiBycXN0cCBpcyBlaXRoZXIgYSBycGNfcnFzdAorICogKGNsaWVudCBzaWRlKSBvciBzdmNfcnFzdCBwb2ludGVyIChzZXJ2ZXIgc2lkZSkuCiAgKiBFbmNvZGUgZnVuY3Rpb25zIGFsd2F5cyBhc3N1bWUgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyLgogICovCiB0eXBlZGVmIGludAkoKmt4ZHJwcm9jX3QpKHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaik7CkBAIC0yMDEsMTQgKzIwMSwyMiBAQAogCiAJX19iZTMyICplbmQ7CQkvKiBlbmQgb2YgYXZhaWxhYmxlIGJ1ZmZlciBzcGFjZSAqLwogCXN0cnVjdCBrdmVjICppb3Y7CS8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQga3ZlYyAqLworCXN0cnVjdCBrdmVjIHNjcmF0Y2g7CS8qIFNjcmF0Y2ggYnVmZmVyICovCisJc3RydWN0IHBhZ2UgKipwYWdlX3B0cjsJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBwYWdlICovCiB9OwogCisvKgorICogVGhlc2UgYXJlIHRoZSB4ZHJfc3RyZWFtIHN0eWxlIGdlbmVyaWMgWERSIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkCSgqa3hkcmVwcm9jX3QpKHZvaWQgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICpvYmopOwordHlwZWRlZiBpbnQJKCpreGRyZHByb2NfdCkodm9pZCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKm9iaik7CisKIGV4dGVybiB2b2lkIHhkcl9pbml0X2VuY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBfX2JlMzIgKnApOwogZXh0ZXJuIF9fYmUzMiAqeGRyX3Jlc2VydmVfc3BhY2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcyk7CiBleHRlcm4gdm9pZCB4ZHJfd3JpdGVfcGFnZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgeGRyX2luaXRfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCB4ZHJfYnVmICpidWYsIF9fYmUzMiAqcCk7Ci1leHRlcm4gX19iZTMyICp4ZHJfaW5saW5lX3BlZWsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcyk7CitleHRlcm4gdm9pZCB4ZHJfc2V0X3NjcmF0Y2hfYnVmZmVyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiBleHRlcm4gX19iZTMyICp4ZHJfaW5saW5lX2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzaXplX3QgbmJ5dGVzKTsKIGV4dGVybiB2b2lkIHhkcl9yZWFkX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgeGRyX2VudGVyX3BhZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94cHJ0LmgKaW5kZXggODlkMTBkMi4uYmVmMGY1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveHBydC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3hwcnQuaApAQCAtMzIxLDYgKzMyMSw3IEBACiAjZGVmaW5lIFhQUlRfQ0xPU0lORwkJKDYpCiAjZGVmaW5lIFhQUlRfQ09OTkVDVElPTl9BQk9SVAkoNykKICNkZWZpbmUgWFBSVF9DT05ORUNUSU9OX0NMT1NFCSg4KQorI2RlZmluZSBYUFJUX0lOSVRJQUxJWkVECSg5KQogCiBzdGF0aWMgaW5saW5lIHZvaWQgeHBydF9zZXRfY29ubmVjdGVkKHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKaW5kZXggMjY2OTc1MS4uNWE4OWUzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKQEAgLTEyMiw3ICsxMjIsNyBAQAogICogc3VzcGVuZF9zZXRfb3BzIC0gc2V0IHBsYXRmb3JtIGRlcGVuZGVudCBzdXNwZW5kIG9wZXJhdGlvbnMKICAqIEBvcHM6IFRoZSBuZXcgc3VzcGVuZCBvcGVyYXRpb25zIHRvIHNldC4KICAqLwotZXh0ZXJuIHZvaWQgc3VzcGVuZF9zZXRfb3BzKHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyAqb3BzKTsKK2V4dGVybiB2b2lkIHN1c3BlbmRfc2V0X29wcyhjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgKm9wcyk7CiBleHRlcm4gaW50IHN1c3BlbmRfdmFsaWRfb25seV9tZW0oc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAogLyoqCkBAIC0xNDcsNyArMTQ3LDcgQEAKICNlbHNlIC8qICFDT05GSUdfU1VTUEVORCAqLwogI2RlZmluZSBzdXNwZW5kX3ZhbGlkX29ubHlfbWVtCU5VTEwKIAotc3RhdGljIGlubGluZSB2b2lkIHN1c3BlbmRfc2V0X29wcyhzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgKm9wcykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXNwZW5kX3NldF9vcHMoY29uc3Qgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzICpvcHMpIHt9CiBzdGF0aWMgaW5saW5lIGludCBwbV9zdXNwZW5kKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkgeyByZXR1cm4gLUVOT1NZUzsgfQogI2VuZGlmIC8qICFDT05GSUdfU1VTUEVORCAqLwogCkBAIC0yNDUsNyArMjQ1LDcgQEAKIGV4dGVybiB2b2lkIHN3c3VzcF91bnNldF9wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfc2FmZV9wYWdlKGdmcF90IGdmcF9tYXNrKTsKIAotZXh0ZXJuIHZvaWQgaGliZXJuYXRpb25fc2V0X29wcyhzdHJ1Y3QgcGxhdGZvcm1faGliZXJuYXRpb25fb3BzICpvcHMpOworZXh0ZXJuIHZvaWQgaGliZXJuYXRpb25fc2V0X29wcyhjb25zdCBzdHJ1Y3QgcGxhdGZvcm1faGliZXJuYXRpb25fb3BzICpvcHMpOwogZXh0ZXJuIGludCBoaWJlcm5hdGUodm9pZCk7CiBleHRlcm4gYm9vbCBzeXN0ZW1fZW50ZXJpbmdfaGliZXJuYXRpb24odm9pZCk7CiAjZWxzZSAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KQEAgLTI1MywyOCArMjUzLDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc3dzdXNwX3NldF9wYWdlX2ZyZWUoc3RydWN0IHBhZ2UgKnApIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgc3dzdXNwX3Vuc2V0X3BhZ2VfZnJlZShzdHJ1Y3QgcGFnZSAqcCkge30KIAotc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyAqb3BzKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoY29uc3Qgc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSBpbnQgaGliZXJuYXRlKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIHN0YXRpYyBpbmxpbmUgYm9vbCBzeXN0ZW1fZW50ZXJpbmdfaGliZXJuYXRpb24odm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KIAotI2lmZGVmIENPTkZJR19TVVNQRU5EX05WUwotZXh0ZXJuIGludCBzdXNwZW5kX252c19yZWdpc3Rlcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIGludCBzdXNwZW5kX252c19hbGxvYyh2b2lkKTsKLWV4dGVybiB2b2lkIHN1c3BlbmRfbnZzX2ZyZWUodm9pZCk7Ci1leHRlcm4gdm9pZCBzdXNwZW5kX252c19zYXZlKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3VzcGVuZF9udnNfcmVzdG9yZSh2b2lkKTsKLSNlbHNlIC8qIENPTkZJR19TVVNQRU5EX05WUyAqLwotc3RhdGljIGlubGluZSBpbnQgc3VzcGVuZF9udnNfcmVnaXN0ZXIodW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBzdXNwZW5kX252c19hbGxvYyh2b2lkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZF9udnNfZnJlZSh2b2lkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHN1c3BlbmRfbnZzX3NhdmUodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdXNwZW5kX252c19yZXN0b3JlKHZvaWQpIHt9Ci0jZW5kaWYgLyogQ09ORklHX1NVU1BFTkRfTlZTICovCi0KICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHZvaWQgc2F2ZV9wcm9jZXNzb3Jfc3RhdGUodm9pZCk7CiB2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpOwpAQCAtMjkyLDcgKzI3NSw3IEBACiAvKiBkcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgKi8KIGV4dGVybiBib29sIGV2ZW50c19jaGVja19lbmFibGVkOwogCi1leHRlcm4gYm9vbCBwbV9jaGVja193YWtldXBfZXZlbnRzKHZvaWQpOworZXh0ZXJuIGJvb2wgcG1fd2FrZXVwX3BlbmRpbmcodm9pZCk7CiBleHRlcm4gYm9vbCBwbV9nZXRfd2FrZXVwX2NvdW50KHVuc2lnbmVkIGludCAqY291bnQpOwogZXh0ZXJuIGJvb2wgcG1fc2F2ZV93YWtldXBfY291bnQodW5zaWduZWQgaW50IGNvdW50KTsKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KQEAgLTMwOSw3ICsyOTIsNyBAQAogCiAjZGVmaW5lIHBtX25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBib29sIHBtX2NoZWNrX3dha2V1cF9ldmVudHModm9pZCkgeyByZXR1cm4gdHJ1ZTsgfQorc3RhdGljIGlubGluZSBib29sIHBtX3dha2V1cF9wZW5kaW5nKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAjZW5kaWYgLyogIUNPTkZJR19QTV9TTEVFUCAqLwogCiBleHRlcm4gc3RydWN0IG11dGV4IHBtX211dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBlYmE1M2U3Li40ZDU1OTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjA4LDYgKzIwOCw4IEBACiAvKiBsaW51eC9tbS9zd2FwLmMgKi8KIGV4dGVybiB2b2lkIF9fbHJ1X2NhY2hlX2FkZChzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7CiBleHRlcm4gdm9pZCBscnVfY2FjaGVfYWRkX2xydShzdHJ1Y3QgcGFnZSAqLCBlbnVtIGxydV9saXN0IGxydSk7CitleHRlcm4gdm9pZCBscnVfYWRkX3BhZ2VfdGFpbChzdHJ1Y3Qgem9uZSogem9uZSwKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZV90YWlsKTsKIGV4dGVybiB2b2lkIGFjdGl2YXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBtYXJrX3BhZ2VfYWNjZXNzZWQoc3RydWN0IHBhZ2UgKik7CiBleHRlcm4gdm9pZCBscnVfYWRkX2RyYWluKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aGVybWFsLmggYi9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaAppbmRleCAxZGU4YjllYi4uODY1MTU1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aGVybWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC90aGVybWFsLmgKQEAgLTc3LDcgKzc3LDcgQEAKIAljaGFyIHR5cGVbVEhFUk1BTF9OQU1FX0xFTkdUSF07CiAJc3RydWN0IGRldmljZSBkZXZpY2U7CiAJdm9pZCAqZGV2ZGF0YTsKLQlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgKm9wczsKKwljb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgKm9wczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiB9OwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlpbnQgbGFzdF90ZW1wZXJhdHVyZTsKIAlib29sIHBhc3NpdmU7CiAJdW5zaWduZWQgaW50IGZvcmNlZF9wYXNzaXZlOwotCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyAqb3BzOwogCXN0cnVjdCBsaXN0X2hlYWQgY29vbGluZ19kZXZpY2VzOwogCXN0cnVjdCBpZHIgaWRyOwogCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBwcm90ZWN0IGNvb2xpbmcgZGV2aWNlcyBsaXN0ICovCkBAIC0xMjcsMTMgKzEyNyw0MSBAQAogCXN0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgdGVtcF9jcml0OwkvKiBod21vbiBzeXMgYXR0ciAqLwogI2VuZGlmCiB9OworLyogQWRkaW5nIGV2ZW50IG5vdGlmaWNhdGlvbiBzdXBwb3J0IGVsZW1lbnRzICovCisjZGVmaW5lIFRIRVJNQUxfR0VOTF9GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAidGhlcm1hbF9ldmVudCIKKyNkZWZpbmUgVEhFUk1BTF9HRU5MX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVEhFUk1BTF9HRU5MX01DQVNUX0dST1VQX05BTUUgICAgICAgICAgICJ0aGVybWFsX21jX2dyb3VwIgorCitlbnVtIGV2ZW50cyB7CisJVEhFUk1BTF9BVVgwLAorCVRIRVJNQUxfQVVYMSwKKwlUSEVSTUFMX0NSSVRJQ0FMLAorCVRIRVJNQUxfREVWX0ZBVUxULAorfTsKKworc3RydWN0IHRoZXJtYWxfZ2VubF9ldmVudCB7CisJdTMyIG9yaWc7CisJZW51bSBldmVudHMgZXZlbnQ7Cit9OworLyogYXR0cmlidXRlcyBvZiB0aGVybWFsX2dlbmxfZmFtaWx5ICovCitlbnVtIHsKKwlUSEVSTUFMX0dFTkxfQVRUUl9VTlNQRUMsCisJVEhFUk1BTF9HRU5MX0FUVFJfRVZFTlQsCisJX19USEVSTUFMX0dFTkxfQVRUUl9NQVgsCit9OworI2RlZmluZSBUSEVSTUFMX0dFTkxfQVRUUl9NQVggKF9fVEhFUk1BTF9HRU5MX0FUVFJfTUFYIC0gMSkKKworLyogY29tbWFuZHMgc3VwcG9ydGVkIGJ5IHRoZSB0aGVybWFsX2dlbmxfZmFtaWx5ICovCitlbnVtIHsKKwlUSEVSTUFMX0dFTkxfQ01EX1VOU1BFQywKKwlUSEVSTUFMX0dFTkxfQ01EX0VWRU5ULAorCV9fVEhFUk1BTF9HRU5MX0NNRF9NQVgsCit9OworI2RlZmluZSBUSEVSTUFMX0dFTkxfQ01EX01BWCAoX19USEVSTUFMX0dFTkxfQ01EX01BWCAtIDEpCiAKIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsX3pvbmVfZGV2aWNlX3JlZ2lzdGVyKGNoYXIgKiwgaW50LCB2b2lkICosCi0JCQkJCQkJIHN0cnVjdAotCQkJCQkJCSB0aGVybWFsX3pvbmVfZGV2aWNlX29wcwotCQkJCQkJCSAqLCBpbnQgdGMxLCBpbnQgdGMyLAotCQkJCQkJCSBpbnQgcGFzc2l2ZV9mcmVxLAotCQkJCQkJCSBpbnQgcG9sbGluZ19mcmVxKTsKKwkJY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzICosIGludCB0YzEsIGludCB0YzIsCisJCWludCBwYXNzaXZlX2ZyZXEsIGludCBwb2xsaW5nX2ZyZXEpOwogdm9pZCB0aGVybWFsX3pvbmVfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKik7CiAKIGludCB0aGVybWFsX3pvbmVfYmluZF9jb29saW5nX2RldmljZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqLCBpbnQsCkBAIC0xNDIsOSArMTcwLDggQEAKIAkJCQkgICAgICAgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKik7CiB2b2lkIHRoZXJtYWxfem9uZV9kZXZpY2VfdXBkYXRlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICopOwogc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKnRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoY2hhciAqLCB2b2lkICosCi0JCQkJCQkJICAgICAgIHN0cnVjdAotCQkJCQkJCSAgICAgICB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcwotCQkJCQkJCSAgICAgICAqKTsKKwkJY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICopOwogdm9pZCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKik7CitleHRlcm4gaW50IGdlbmVyYXRlX25ldGxpbmtfZXZlbnQodTMyIG9yaWcsIGVudW0gZXZlbnRzIGV2ZW50KTsKIAogI2VuZGlmIC8qIF9fVEhFUk1BTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZS5oIGIvaW5jbHVkZS9saW51eC90aW1lLmgKaW5kZXggOWYxNWFjNy4uMWU2ZDNiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lLmgKQEAgLTE1OCw2ICsxNTgsOCBAQAogZXh0ZXJuIGludCBkb19nZXRpdGltZXIoaW50IHdoaWNoLCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSk7CiBleHRlcm4gdm9pZCBnZXRuc3RpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KTsKIGV4dGVybiB2b2lkIGdldHJhd21vbm90b25pYyhzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiB2b2lkIGdldG5zdGltZV9yYXdfYW5kX3JlYWwoc3RydWN0IHRpbWVzcGVjICp0c19yYXcsCisJCXN0cnVjdCB0aW1lc3BlYyAqdHNfcmVhbCk7CiBleHRlcm4gdm9pZCBnZXRib290dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKIGV4dGVybiB2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXguaCBiL2luY2x1ZGUvbGludXgvdGltZXguaAppbmRleCAzMmQ4NTJmLi5kMjM5OTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1leC5oCkBAIC0yNjgsNiArMjY4LDcgQEAKIGV4dGVybiB2b2lkIHNlY29uZF9vdmVyZmxvdyh2b2lkKTsKIGV4dGVybiB2b2lkIHVwZGF0ZV9udHBfb25lX3RpY2sodm9pZCk7CiBleHRlcm4gaW50IGRvX2FkanRpbWV4KHN0cnVjdCB0aW1leCAqKTsKK2V4dGVybiB2b2lkIGhhcmRwcHMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICosIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKTsKIAogaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Rvc2hpYmEuaCBiL2luY2x1ZGUvbGludXgvdG9zaGliYS5oCmluZGV4IDZhN2M0ZWQuLjc3MmRlZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9zaGliYS5oCisrKyBiL2luY2x1ZGUvbGludXgvdG9zaGliYS5oCkBAIC0zMyw2ICszMyw4IEBACiAJdW5zaWduZWQgaW50IGVkaSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiB9IFNNTVJlZ2lzdGVyczsKIAorI2lmZGVmIF9fS0VSTkVMX18KIGludCB0b3NoX3NtbShTTU1SZWdpc3RlcnMgKnJlZ3MpOworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RwbS5oIGIvaW5jbHVkZS9saW51eC90cG0uaAppbmRleCBhYzVkMWMxLi5mZGM3MThhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RwbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHBtLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAogZXh0ZXJuIGludCB0cG1fcGNyX3JlYWQodTMyIGNoaXBfbnVtLCBpbnQgcGNyX2lkeCwgdTggKnJlc19idWYpOwogZXh0ZXJuIGludCB0cG1fcGNyX2V4dGVuZCh1MzIgY2hpcF9udW0sIGludCBwY3JfaWR4LCBjb25zdCB1OCAqaGFzaCk7CitleHRlcm4gaW50IHRwbV9zZW5kKHUzMiBjaGlwX251bSwgdm9pZCAqY21kLCBzaXplX3QgYnVmbGVuKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB0cG1fcGNyX3JlYWQodTMyIGNoaXBfbnVtLCBpbnQgcGNyX2lkeCwgdTggKnJlc19idWYpIHsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTM4LDUgKzM5LDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IHRwbV9wY3JfZXh0ZW5kKHUzMiBjaGlwX251bSwgaW50IHBjcl9pZHgsIGNvbnN0IHU4ICpoYXNoKSB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CitzdGF0aWMgaW5saW5lIGludCB0cG1fc2VuZCh1MzIgY2hpcF9udW0sIHZvaWQgKmNtZCwgc2l6ZV90IGJ1ZmxlbikgeworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHBtX2NvbW1hbmQuaCBiL2luY2x1ZGUvbGludXgvdHBtX2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc1MTJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90cG1fY29tbWFuZC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX19MSU5VWF9UUE1fQ09NTUFORF9IX18KKyNkZWZpbmUgX19MSU5VWF9UUE1fQ09NTUFORF9IX18KKworLyoKKyAqIFRQTSBDb21tYW5kIGNvbnN0YW50cyBmcm9tIHNwZWNpZmljYXRpb25zIGF0CisgKiBodHRwOi8vd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmcKKyAqLworCisvKiBDb21tYW5kIFRBR1MgKi8KKyNkZWZpbmUgVFBNX1RBR19SUVVfQ09NTUFORCAgICAgICAgICAgICAxOTMKKyNkZWZpbmUgVFBNX1RBR19SUVVfQVVUSDFfQ09NTUFORCAgICAgICAxOTQKKyNkZWZpbmUgVFBNX1RBR19SUVVfQVVUSDJfQ09NTUFORCAgICAgICAxOTUKKyNkZWZpbmUgVFBNX1RBR19SU1BfQ09NTUFORCAgICAgICAgICAgICAxOTYKKyNkZWZpbmUgVFBNX1RBR19SU1BfQVVUSDFfQ09NTUFORCAgICAgICAxOTcKKyNkZWZpbmUgVFBNX1RBR19SU1BfQVVUSDJfQ09NTUFORCAgICAgICAxOTgKKworLyogQ29tbWFuZCBPcmRpbmFscyAqLworI2RlZmluZSBUUE1fT1JEX0dFVFJBTkRPTSAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFRQTV9PUkRfT1NBUCAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVFBNX09SRF9PSUFQICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBUUE1fT1JEX1NFQUwgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFRQTV9PUkRfVU5TRUFMICAgICAgICAgICAgICAgICAgMjQKKworLyogT3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFNSS0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBUUE1fTk9OQ0VfU0laRSAgICAgICAgICAgICAgICAgIDIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZXBvaW50LmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAppbmRleCBkM2U0Zjg3Li5jNjgxNDYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaApAQCAtMzIsNyArMzIsNyBAQAogCWludCBzdGF0ZTsJCQkvKiBTdGF0ZS4gKi8KIAl2b2lkICgqcmVnZnVuYykodm9pZCk7CiAJdm9pZCAoKnVucmVnZnVuYykodm9pZCk7Ci0Jc3RydWN0IHRyYWNlcG9pbnRfZnVuYyAqZnVuY3M7CisJc3RydWN0IHRyYWNlcG9pbnRfZnVuYyBfX3JjdSAqZnVuY3M7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CQkvKgogCQkJCQkgKiBBbGlnbmVkIG9uIDMyIGJ5dGVzIGJlY2F1c2UgaXQgaXMKIAkJCQkJICogZ2xvYmFsbHkgdmlzaWJsZSBhbmQgZ2NjIGhhcHBpbHkKQEAgLTMyNiw3ICszMjYsNyBAQAogICoJCW1lbWNweShfX2VudHJ5LT5wcmV2X2NvbW0sIHByZXYtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogICoJCV9fZW50cnktPm5leHRfcGlkCT0gbmV4dC0+cGlkOwogICoJCV9fZW50cnktPm5leHRfcHJpbwk9IG5leHQtPnByaW87Ci0gKgkpCisgKgkpLAogICoKICAqCSoKICAqCSogRm9ybWF0dGVkIG91dHB1dCBvZiBhIHRyYWNlIHJlY29yZCB2aWEgVFBfcHJpbnRrKCkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAppbmRleCA1MjZkNjZmLi5mZjdkYzA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKQEAgLTEwMSwxNCArMTAxLDE1IEBACiAgKglhbnkgcGVuZGluZyBkcml2ZXIgSS9PIGlzIGNvbXBsZXRlZC4KICAqCiAgKiB2b2lkICgqZGNkX2NoYW5nZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IHN0YXR1cywKLSAqIAkJCXN0cnVjdCB0aW1lc3BlYyAqdHMpCisgKgkJCXN0cnVjdCBwcHNfZXZlbnRfdGltZSAqdHMpCiAgKgogICoJVGVsbHMgdGhlIGRpc2NpcGxpbmUgdGhhdCB0aGUgRENEIHBpbiBoYXMgY2hhbmdlZCBpdHMgc3RhdHVzIGFuZAotICoJdGhlIHJlbGF0aXZlIHRpbWVzdGFtcC4gUG9pbnRlciB0cyBjYW4gYmUgTlVMTC4KKyAqCXRoZSByZWxhdGl2ZSB0aW1lc3RhbXAuIFBvaW50ZXIgdHMgY2Fubm90IGJlIE5VTEwuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bwc19rZXJuZWwuaD4KIAogc3RydWN0IHR0eV9sZGlzY19vcHMgewogCWludAltYWdpYzsKQEAgLTE0Myw3ICsxNDQsNyBAQAogCQkJICAgICAgIGNoYXIgKmZwLCBpbnQgY291bnQpOwogCXZvaWQJKCp3cml0ZV93YWtldXApKHN0cnVjdCB0dHlfc3RydWN0ICopOwogCXZvaWQJKCpkY2RfY2hhbmdlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJc3RydWN0IHRpbWVzcGVjICopOworCQkJCXN0cnVjdCBwcHNfZXZlbnRfdGltZSAqKTsKIAogCXN0cnVjdCAgbW9kdWxlICpvd25lcjsKIAkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaCBiL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaAppbmRleCBmYTI2MWEwLi44ZGE4YzRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3U2NF9zdGF0c19zeW5jLmgKKysrIGIvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oCkBAIC02NywyMSArNjcsMjEgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQgaW5saW5lIHU2NF9zdGF0c191cGRhdGVfYmVnaW4oc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCiB7CiAjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZzeW5jcC0+c2VxKTsKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgdTY0X3N0YXRzX3VwZGF0ZV9lbmQoc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB1NjRfc3RhdHNfdXBkYXRlX2VuZChzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQogewogI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKIAl3cml0ZV9zZXFjb3VudF9lbmQoJnN5bmNwLT5zZXEpOwogI2VuZGlmCiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIHU2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdTY0X3N0YXRzX2ZldGNoX2JlZ2luKGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCiB7CiAjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCXJldHVybiByZWFkX3NlcWNvdW50X2JlZ2luKCZzeW5jcC0+c2VxKTsKQEAgLTkzLDcgKzkzLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgYm9vbCBpbmxpbmUgdTY0X3N0YXRzX2ZldGNoX3JldHJ5KGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3AsCitzdGF0aWMgaW5saW5lIGJvb2wgdTY0X3N0YXRzX2ZldGNoX3JldHJ5KGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3AsCiAJCQkJCSB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7CiAjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQpAQCAtMTEyLDcgKzExMiw3IEBACiAgKiAtIFVQIDMyYml0IG11c3QgZGlzYWJsZSBCSC4KICAqIC0gNjRiaXQgaGF2ZSBubyBwcm9ibGVtIGF0b21pY2FsbHkgcmVhZGluZyB1NjQgdmFsdWVzLCBpcnEgc2FmZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5fYmgoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKIHsKICNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCiAJcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGJvb2wgaW5saW5lIHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaChjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAorc3RhdGljIGlubGluZSBib29sIHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaChjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAogCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQogewogI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdW5hbGlnbmVkL3BhY2tlZF9zdHJ1Y3QuaCBiL2luY2x1ZGUvbGludXgvdW5hbGlnbmVkL3BhY2tlZF9zdHJ1Y3QuaAppbmRleCBjOWE2YWJkLi5jMGQ4MTdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VuYWxpZ25lZC9wYWNrZWRfc3RydWN0LmgKKysrIGIvaW5jbHVkZS9saW51eC91bmFsaWduZWQvcGFja2VkX3N0cnVjdC5oCkBAIC0zLDkgKzMsOSBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKLXN0cnVjdCBfX3VuYV91MTYgeyB1MTYgeDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLXN0cnVjdCBfX3VuYV91MzIgeyB1MzIgeDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLXN0cnVjdCBfX3VuYV91NjQgeyB1NjQgeDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK3N0cnVjdCBfX3VuYV91MTYgeyB1MTYgeDsgfSBfX3BhY2tlZDsKK3N0cnVjdCBfX3VuYV91MzIgeyB1MzIgeDsgfSBfX3BhY2tlZDsKK3N0cnVjdCBfX3VuYV91NjQgeyB1NjQgeDsgfSBfX3BhY2tlZDsKIAogc3RhdGljIGlubGluZSB1MTYgX19nZXRfdW5hbGlnbmVkX2NwdTE2KGNvbnN0IHZvaWQgKnApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKaW5kZXggODE3ODE1Ni4uZmFmNDY3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0jZGVmaW5lIFVJREhBU0hfQklUUwkoQ09ORklHX0JBU0VfU01BTEwgPyAzIDogOCkKKyNkZWZpbmUgVUlESEFTSF9CSVRTCShDT05GSUdfQkFTRV9TTUFMTCA/IDMgOiA3KQogI2RlZmluZSBVSURIQVNIX1NaCSgxIDw8IFVJREhBU0hfQklUUykKIAogc3RydWN0IHVzZXJfbmFtZXNwYWNlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmdhX3N3aXRjaGVyb28uaCBiL2luY2x1ZGUvbGludXgvdmdhX3N3aXRjaGVyb28uaAppbmRleCBhZTlhYjEzLi40YjlhN2Y1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZnYV9zd2l0Y2hlcm9vLmgKKysrIGIvaW5jbHVkZS9saW51eC92Z2Ffc3dpdGNoZXJvby5oCkBAIC0zMyw2ICszMyw3IEBACiB2b2lkIHZnYV9zd2l0Y2hlcm9vX3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCSAgIHZvaWQgKCpzZXRfZ3B1X3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHZnYV9zd2l0Y2hlcm9vX3N0YXRlKSwKKwkJCQkgICB2b2lkICgqcmVwcm9iZSkoc3RydWN0IHBjaV9kZXYgKmRldiksCiAJCQkJICAgYm9vbCAoKmNhbl9zd2l0Y2gpKHN0cnVjdCBwY2lfZGV2ICpkZXYpKTsKIAogdm9pZCB2Z2Ffc3dpdGNoZXJvb19jbGllbnRfZmJfc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCkBAIC00OCw2ICs0OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmdhX3N3aXRjaGVyb29fdW5yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjaV9kZXYgKmRldikge30KIHN0YXRpYyBpbmxpbmUgaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgIHZvaWQgKCpzZXRfZ3B1X3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHZnYV9zd2l0Y2hlcm9vX3N0YXRlKSwKKwkJCQkJICB2b2lkICgqcmVwcm9iZSkoc3RydWN0IHBjaV9kZXYgKmRldiksCiAJCQkJCSAgYm9vbCAoKmNhbl9zd2l0Y2gpKHN0cnVjdCBwY2lfZGV2ICpkZXYpKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdmdhX3N3aXRjaGVyb29fY2xpZW50X2ZiX3NldChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykge30KIHN0YXRpYyBpbmxpbmUgaW50IHZnYV9zd2l0Y2hlcm9vX3JlZ2lzdGVyX2hhbmRsZXIoc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2hhbmRsZXIgKmhhbmRsZXIpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKaW5kZXggNDRiNTRmNi4uNGVkNmZjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKQEAgLTU5LDggKzU5LDkgQEAKIGV4dGVybiB2b2lkICp2bWFsbG9jXzMyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCAqdm1hbGxvY18zMl91c2VyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCAqX192bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpOwotZXh0ZXJuIHZvaWQgKl9fdm1hbGxvY19hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIGdmcF90IGdmcF9tYXNrLAotCQkJCXBncHJvdF90IHByb3QpOworZXh0ZXJuIHZvaWQgKl9fdm1hbGxvY19ub2RlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBnZnBfdCBnZnBfbWFzaywKKwkJCXBncHJvdF90IHByb3QsIGludCBub2RlLCB2b2lkICpjYWxsZXIpOwogZXh0ZXJuIHZvaWQgdmZyZWUoY29uc3Qgdm9pZCAqYWRkcik7CiAKIGV4dGVybiB2b2lkICp2bWFwKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTkwLDkgKzkxLDYgQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJCQkJCXZvaWQgKmNhbGxlcik7Ci1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqZ2V0X3ZtX2FyZWFfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IG5vZGUsCi0JCQkJCSAgZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKnJlbW92ZV92bV9hcmVhKGNvbnN0IHZvaWQgKmFkZHIpOwogCiBleHRlcm4gaW50IG1hcF92bV9hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIHBncHJvdF90IHByb3QsCkBAIC0xMjAsNyArMTE4LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiBzdHJ1Y3Qgdm1fc3RydWN0ICoqcGNwdV9nZXRfdm1fYXJlYXMoY29uc3QgdW5zaWduZWQgbG9uZyAqb2Zmc2V0cywKIAkJCQkgICAgIGNvbnN0IHNpemVfdCAqc2l6ZXMsIGludCBucl92bXMsCi0JCQkJICAgICBzaXplX3QgYWxpZ24sIGdmcF90IGdmcF9tYXNrKTsKKwkJCQkgICAgIHNpemVfdCBhbGlnbik7CiAKIHZvaWQgcGNwdV9mcmVlX3ZtX2FyZWFzKHN0cnVjdCB2bV9zdHJ1Y3QgKip2bXMsIGludCBucl92bXMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaAppbmRleCBlYWFlYTM3Li44MzNlNjc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKQEAgLTI1NCw2ICsyNTQsMTEgQEAKIGV4dGVybiB2b2lkIF9fZGVjX3pvbmVfc3RhdGUoc3RydWN0IHpvbmUgKiwgZW51bSB6b25lX3N0YXRfaXRlbSk7CiAKIHZvaWQgcmVmcmVzaF9jcHVfdm1fc3RhdHMoaW50KTsKKworaW50IGNhbGN1bGF0ZV9wcmVzc3VyZV90aHJlc2hvbGQoc3RydWN0IHpvbmUgKnpvbmUpOworaW50IGNhbGN1bGF0ZV9ub3JtYWxfdGhyZXNob2xkKHN0cnVjdCB6b25lICp6b25lKTsKK3ZvaWQgc2V0X3BnZGF0X3BlcmNwdV90aHJlc2hvbGQocGdfZGF0YV90ICpwZ2RhdCwKKwkJCQlpbnQgKCpjYWxjdWxhdGVfcHJlc3N1cmUpKHN0cnVjdCB6b25lICopKTsKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIAogLyoKQEAgLTI5OCw2ICszMDMsOCBAQAogI2RlZmluZSBkZWNfem9uZV9wYWdlX3N0YXRlIF9fZGVjX3pvbmVfcGFnZV9zdGF0ZQogI2RlZmluZSBtb2Rfem9uZV9wYWdlX3N0YXRlIF9fbW9kX3pvbmVfcGFnZV9zdGF0ZQogCisjZGVmaW5lIHNldF9wZ2RhdF9wZXJjcHVfdGhyZXNob2xkKHBnZGF0LCBjYWxsYmFjaykgeyB9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWZyZXNoX2NwdV92bV9zdGF0cyhpbnQgY3B1KSB7IH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3hhdHRyLmggYi9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKaW5kZXggZjFlNWJkZS4uZTYxMzFlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC94YXR0ci5oCisrKyBiL2luY2x1ZGUvbGludXgveGF0dHIuaApAQCAtNDAsOSArNDAsMTMgQEAKICNkZWZpbmUgWEFUVFJfU01BQ0tfU1VGRklYICJTTUFDSzY0IgogI2RlZmluZSBYQVRUUl9TTUFDS19JUElOICJTTUFDSzY0SVBJTiIKICNkZWZpbmUgWEFUVFJfU01BQ0tfSVBPVVQgIlNNQUNLNjRJUE9VVCIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfRVhFQyAiU01BQ0s2NEVYRUMiCisjZGVmaW5lIFhBVFRSX1NNQUNLX1RSQU5TTVVURSAiU01BQ0s2NFRSQU5TTVVURSIKICNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDSyBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfU1VGRklYCiAjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUElOCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUElOCiAjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUE9VVAlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfSVBPVVQKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0VYRUMJWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0VYRUMKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS1RSQU5TTVVURSBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfVFJBTlNNVVRFCiAKICNkZWZpbmUgWEFUVFJfQ0FQU19TVUZGSVggImNhcGFiaWxpdHkiCiAjZGVmaW5lIFhBVFRSX05BTUVfQ0FQUyBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfQ0FQU19TVUZGSVgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveHouaCBiL2luY2x1ZGUvbGludXgveHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNmZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC94ei5oCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogWFogZGVjb21wcmVzc29yCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX0gKKyNkZWZpbmUgWFpfSAorCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyMJaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbHNlCisjCWluY2x1ZGUgPHN0ZGRlZi5oPgorIwlpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKiBJbiBMaW51eCwgdGhpcyBpcyB1c2VkIHRvIG1ha2UgZXh0ZXJuIGZ1bmN0aW9ucyBzdGF0aWMgd2hlbiBuZWVkZWQuICovCisjaWZuZGVmIFhaX0VYVEVSTgorIwlkZWZpbmUgWFpfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKy8qKgorICogZW51bSB4el9tb2RlIC0gT3BlcmF0aW9uIG1vZGUKKyAqCisgKiBAWFpfU0lOR0xFOiAgICAgICAgICAgICAgU2luZ2xlLWNhbGwgbW9kZS4gVGhpcyB1c2VzIGxlc3MgUkFNIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIG11bHRpLWNhbGwgbW9kZXMsIGJlY2F1c2UgdGhlIExaTUEyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSBkb2Vzbid0IG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgZGVjb2RlciBzdGF0ZS4gQWxsIHJlcXVpcmVkIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgYXQgaW5pdGlhbGl6YXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28geHpfZGVjX3J1bigpIGNhbm5vdCByZXR1cm4gWFpfTUVNX0VSUk9SLgorICogQFhaX1BSRUFMTE9DOiAgICAgICAgICAgIE11bHRpLWNhbGwgbW9kZSB3aXRoIHByZWFsbG9jYXRlZCBMWk1BMgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgYnVmZmVyLiBBbGwgZGF0YSBzdHJ1Y3R1cmVzIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiwgc28geHpfZGVjX3J1bigpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IHJldHVybiBYWl9NRU1fRVJST1IuCisgKiBAWFpfRFlOQUxMT0M6ICAgICAgICAgICAgTXVsdGktY2FsbCBtb2RlLiBUaGUgTFpNQTIgZGljdGlvbmFyeSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBvbmNlIHRoZSByZXF1aXJlZCBzaXplIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkIGZyb20gdGhlIHN0cmVhbSBoZWFkZXJzLiBJZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIGZhaWxzLCB4el9kZWNfcnVuKCkgd2lsbCByZXR1cm4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9NRU1fRVJST1IuCisgKgorICogSXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIHN1cHBvcnQgb25seSBmb3IgYSBzdWJzZXQgb2YgdGhlIGFib3ZlCisgKiBtb2RlcyBhdCBjb21waWxlIHRpbWUgYnkgZGVmaW5pbmcgWFpfREVDX1NJTkdMRSwgWFpfREVDX1BSRUFMTE9DLAorICogb3IgWFpfREVDX0RZTkFMTE9DLiBUaGUgeHpfZGVjIGtlcm5lbCBtb2R1bGUgaXMgYWx3YXlzIGNvbXBpbGVkCisgKiB3aXRoIHN1cHBvcnQgZm9yIGFsbCBvcGVyYXRpb24gbW9kZXMsIGJ1dCB0aGUgcHJlYm9vdCBjb2RlIG1heQorICogYmUgYnVpbHQgd2l0aCBmZXdlciBmZWF0dXJlcyB0byBtaW5pbWl6ZSBjb2RlIHNpemUuCisgKi8KK2VudW0geHpfbW9kZSB7CisJWFpfU0lOR0xFLAorCVhaX1BSRUFMTE9DLAorCVhaX0RZTkFMTE9DCit9OworCisvKioKKyAqIGVudW0geHpfcmV0IC0gUmV0dXJuIGNvZGVzCisgKiBAWFpfT0s6ICAgICAgICAgICAgICAgICAgRXZlcnl0aGluZyBpcyBPSyBzbyBmYXIuIE1vcmUgaW5wdXQgb3IgbW9yZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzcGFjZSBpcyByZXF1aXJlZCB0byBjb250aW51ZS4gVGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlIGlzIHBvc3NpYmxlIG9ubHkgaW4gbXVsdGktY2FsbCBtb2RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKFhaX1BSRUFMTE9DIG9yIFhaX0RZTkFMTE9DKS4KKyAqIEBYWl9TVFJFQU1fRU5EOiAgICAgICAgICBPcGVyYXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgorICogQFhaX1VOU1VQUE9SVEVEX0NIRUNLOiAgIEludGVncml0eSBjaGVjayB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIERlY29kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3RpbGwgcG9zc2libGUgaW4gbXVsdGktY2FsbCBtb2RlIGJ5IHNpbXBseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgeHpfZGVjX3J1bigpIGFnYWluLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHJldHVybiB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9ERUNfQU5ZX0NIRUNLIHdhcyBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbm90IHVzZWQgaW4gdGhlIGtlcm5lbC4gVW5zdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayB0eXBlcyByZXR1cm4gWFpfT1BUSU9OU19FUlJPUiBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX0RFQ19BTllfQ0hFQ0sgd2FzIG5vdCBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUuCisgKiBAWFpfTUVNX0VSUk9SOiAgICAgICAgICAgQWxsb2NhdGluZyBtZW1vcnkgZmFpbGVkLiBUaGlzIHJldHVybiBjb2RlIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgb25seSBpZiB0aGUgZGVjb2RlciB3YXMgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFhaX0RZTkFMTE9DLiBUaGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHdhcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWVkIHRvIGJlIGFsbG9jYXRlZCB3YXMgbm8gbW9yZSB0aGFuIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvIHh6X2RlY19pbml0KCkuCisgKiBAWFpfTUVNTElNSVRfRVJST1I6ICAgICAgQSBiaWdnZXIgTFpNQTIgZGljdGlvbmFyeSB3b3VsZCBiZSBuZWVkZWQgdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgYnkgdGhlIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgeHpfZGVjX2luaXQoKS4gVGhpcyByZXR1cm4gdmFsdWUgaXMgcG9zc2libGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGluIG11bHRpLWNhbGwgbW9kZSAoWFpfUFJFQUxMT0Mgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9EWU5BTExPQyk7IHRoZSBzaW5nbGUtY2FsbCBtb2RlIChYWl9TSU5HTEUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlcyB0aGUgZGljdF9tYXggYXJndW1lbnQuCisgKiBAWFpfRk9STUFUX0VSUk9SOiAgICAgICAgRmlsZSBmb3JtYXQgd2FzIG5vdCByZWNvZ25pemVkICh3cm9uZyBtYWdpYworICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKS4KKyAqIEBYWl9PUFRJT05TX0VSUk9SOiAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gb3B0aW9ucy4gSW4gdGhlIGRlY29kZXIgdGhpcyBtZWFucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGhlYWRlciBDUkMzMiBtYXRjaGVzLCBidXQgdGhlIGhlYWRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBzcGVjaWZpZXMgc29tZXRoaW5nIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydC4KKyAqIEBYWl9EQVRBX0VSUk9SOiAgICAgICAgICBDb21wcmVzc2VkIGRhdGEgaXMgY29ycnVwdC4KKyAqIEBYWl9CVUZfRVJST1I6ICAgICAgICAgICBDYW5ub3QgbWFrZSBhbnkgcHJvZ3Jlc3MuIERldGFpbHMgYXJlIHNsaWdodGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGJldHdlZW4gbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOyBtb3JlIGluZm9ybWF0aW9uIGJlbG93LgorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIHdoZW4gdHdvIGNvbnNlY3V0aXZlIGNhbGxzCisgKiB0byBYWiBjb2RlIGNhbm5vdCBjb25zdW1lIGFueSBpbnB1dCBhbmQgY2Fubm90IHByb2R1Y2UgYW55IG5ldyBvdXRwdXQuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBubyBuZXcgaW5wdXQgYXZhaWxhYmxlLCBvciB0aGUgb3V0cHV0IGJ1ZmZlcgorICogaXMgZnVsbCB3aGlsZSBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ5dGUgaXMgc3RpbGwgcGVuZGluZy4gQXNzdW1pbmcgeW91cgorICogY29kZSBpcyBub3QgYnVnZ3ksIHlvdSBjYW4gZ2V0IHRoaXMgZXJyb3Igb25seSB3aGVuIGRlY29kaW5nIGEgY29tcHJlc3NlZAorICogc3RyZWFtIHRoYXQgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZSBjb3JydXB0LgorICoKKyAqIEluIHNpbmdsZS1jYWxsIG1vZGUsIFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIG91dHB1dCBidWZmZXIKKyAqIGlzIHRvbyBzbWFsbCBvciB0aGUgY29tcHJlc3NlZCBpbnB1dCBpcyBjb3JydXB0IGluIGEgd2F5IHRoYXQgbWFrZXMgdGhlCisgKiBkZWNvZGVyIHByb2R1Y2UgbW9yZSBvdXRwdXQgdGhhbiB0aGUgY2FsbGVyIGV4cGVjdGVkLiBXaGVuIGl0IGlzCisgKiAocmVsYXRpdmVseSkgY2xlYXIgdGhhdCB0aGUgY29tcHJlc3NlZCBpbnB1dCBpcyB0cnVuY2F0ZWQsIFhaX0RBVEFfRVJST1IKKyAqIGlzIHVzZWQgaW5zdGVhZCBvZiBYWl9CVUZfRVJST1IuCisgKi8KK2VudW0geHpfcmV0IHsKKwlYWl9PSywKKwlYWl9TVFJFQU1fRU5ELAorCVhaX1VOU1VQUE9SVEVEX0NIRUNLLAorCVhaX01FTV9FUlJPUiwKKwlYWl9NRU1MSU1JVF9FUlJPUiwKKwlYWl9GT1JNQVRfRVJST1IsCisJWFpfT1BUSU9OU19FUlJPUiwKKwlYWl9EQVRBX0VSUk9SLAorCVhaX0JVRl9FUlJPUgorfTsKKworLyoqCisgKiBzdHJ1Y3QgeHpfYnVmIC0gUGFzc2luZyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdG8gWFogY29kZQorICogQGluOiAgICAgICAgIEJlZ2lubmluZyBvZiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIG1heSBiZSBOVUxMIGlmIGFuZCBvbmx5CisgKiAgICAgICAgICAgICAgaWYgaW5fcG9zIGlzIGVxdWFsIHRvIGluX3NpemUuCisgKiBAaW5fcG9zOiAgICAgQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIG11c3Qgbm90IGV4Y2VlZAorICogICAgICAgICAgICAgIGluX3NpemUuCisgKiBAaW5fc2l6ZTogICAgU2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKiBAb3V0OiAgICAgICAgQmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIG1heSBiZSBOVUxMIGlmIGFuZCBvbmx5CisgKiAgICAgICAgICAgICAgaWYgb3V0X3BvcyBpcyBlcXVhbCB0byBvdXRfc2l6ZS4KKyAqIEBvdXRfcG9zOiAgICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIG11c3Qgbm90IGV4Y2VlZAorICogICAgICAgICAgICAgIG91dF9zaXplLgorICogQG91dF9zaXplOiAgIFNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIKKyAqCisgKiBPbmx5IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBmcm9tIG91dFtvdXRfcG9zXSBvbndhcmQsIGFuZAorICogdGhlIHZhcmlhYmxlcyBpbl9wb3MgYW5kIG91dF9wb3MgYXJlIG1vZGlmaWVkIGJ5IHRoZSBYWiBjb2RlLgorICovCitzdHJ1Y3QgeHpfYnVmIHsKKwljb25zdCB1aW50OF90ICppbjsKKwlzaXplX3QgaW5fcG9zOworCXNpemVfdCBpbl9zaXplOworCisJdWludDhfdCAqb3V0OworCXNpemVfdCBvdXRfcG9zOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qKgorICogc3RydWN0IHh6X2RlYyAtIE9wYXF1ZSB0eXBlIHRvIGhvbGQgdGhlIFhaIGRlY29kZXIgc3RhdGUKKyAqLworc3RydWN0IHh6X2RlYzsKKworLyoqCisgKiB4el9kZWNfaW5pdCgpIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBYWiBkZWNvZGVyIHN0YXRlCisgKiBAbW9kZTogICAgICAgT3BlcmF0aW9uIG1vZGUKKyAqIEBkaWN0X21heDogICBNYXhpbXVtIHNpemUgb2YgdGhlIExaTUEyIGRpY3Rpb25hcnkgKGhpc3RvcnkgYnVmZmVyKSBmb3IKKyAqICAgICAgICAgICAgICBtdWx0aS1jYWxsIGRlY29kaW5nLiBUaGlzIGlzIGlnbm9yZWQgaW4gc2luZ2xlLWNhbGwgbW9kZQorICogICAgICAgICAgICAgIChtb2RlID09IFhaX1NJTkdMRSkuIExaTUEyIGRpY3Rpb25hcnkgaXMgYWx3YXlzIDJebiBieXRlcworICogICAgICAgICAgICAgIG9yIDJebiArIDJeKG4tMSkgYnl0ZXMgKHRoZSBsYXR0ZXIgc2l6ZXMgYXJlIGxlc3MgY29tbW9uCisgKiAgICAgICAgICAgICAgaW4gcHJhY3RpY2UpLCBzbyBvdGhlciB2YWx1ZXMgZm9yIGRpY3RfbWF4IGRvbid0IG1ha2Ugc2Vuc2UuCisgKiAgICAgICAgICAgICAgSW4gdGhlIGtlcm5lbCwgZGljdGlvbmFyeSBzaXplcyBvZiA2NCBLaUIsIDEyOCBLaUIsIDI1NiBLaUIsCisgKiAgICAgICAgICAgICAgNTEyIEtpQiwgYW5kIDEgTWlCIGFyZSBwcm9iYWJseSB0aGUgb25seSByZWFzb25hYmxlIHZhbHVlcywKKyAqICAgICAgICAgICAgICBleGNlcHQgZm9yIGtlcm5lbCBhbmQgaW5pdHJhbWZzIGltYWdlcyB3aGVyZSBhIGJpZ2dlcgorICogICAgICAgICAgICAgIGRpY3Rpb25hcnkgY2FuIGJlIGZpbmUgYW5kIHVzZWZ1bC4KKyAqCisgKiBTaW5nbGUtY2FsbCBtb2RlIChYWl9TSU5HTEUpOiB4el9kZWNfcnVuKCkgZGVjb2RlcyB0aGUgd2hvbGUgc3RyZWFtIGF0CisgKiBvbmNlLiBUaGUgY2FsbGVyIG11c3QgcHJvdmlkZSBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIHRoZSBkZWNvZGluZyB3aWxsCisgKiBmYWlsLiBUaGUgb3V0cHV0IHNwYWNlIGlzIHVzZWQgYXMgdGhlIGRpY3Rpb25hcnkgYnVmZmVyLCB3aGljaCBpcyB3aHkKKyAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWxsb2NhdGUgdGhlIGRpY3Rpb25hcnkgYXMgcGFydCBvZiB0aGUgZGVjb2RlcidzCisgKiBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBCZWNhdXNlIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHVzZWQgYXMgdGhlIHdvcmtzcGFjZSwgc3RyZWFtcyBlbmNvZGVkIHVzaW5nCisgKiBhIGJpZyBkaWN0aW9uYXJ5IGFyZSBub3QgYSBwcm9ibGVtIGluIHNpbmdsZS1jYWxsIG1vZGUuIEl0IGlzIGVub3VnaCB0aGF0CisgKiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGFjdHVhbCB1bmNvbXByZXNzZWQgZGF0YTsgaXQKKyAqIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIGRpY3Rpb25hcnkgc2l6ZSBzdG9yZWQgaW4gdGhlIHN0cmVhbSBoZWFkZXJzLgorICoKKyAqIE11bHRpLWNhbGwgbW9kZSB3aXRoIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IChYWl9QUkVBTExPQyk6IGRpY3RfbWF4IGJ5dGVzCisgKiBvZiBtZW1vcnkgaXMgcHJlYWxsb2NhdGVkIGZvciB0aGUgTFpNQTIgZGljdGlvbmFyeS4gVGhpcyB3YXkgdGhlcmUgaXMgbm8KKyAqIHJpc2sgdGhhdCB4el9kZWNfcnVuKCkgY291bGQgcnVuIG91dCBvZiBtZW1vcnksIHNpbmNlIHh6X2RlY19ydW4oKSB3aWxsCisgKiBuZXZlciBhbGxvY2F0ZSBhbnkgbWVtb3J5LiBJbnN0ZWFkLCBpZiB0aGUgcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgaXMgdG9vCisgKiBzbWFsbCBmb3IgZGVjb2RpbmcgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSwgeHpfZGVjX3J1bigpIHdpbGwgcmV0dXJuCisgKiBYWl9NRU1MSU1JVF9FUlJPUi4gVGh1cywgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgd2hhdCBraW5kIG9mIGRhdGEgd2lsbCBiZQorICogZGVjb2RlZCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUgZGljdGlvbmFyeS4KKyAqCisgKiBNdWx0aS1jYWxsIG1vZGUgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGljdGlvbmFyeSAoWFpfRFlOQUxMT0MpOgorICogZGljdF9tYXggc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGljdGlvbmFyeSBzaXplIHRoYXQgeHpfZGVjX3J1bigpCisgKiBtYXkgYWxsb2NhdGUgb25jZSBpdCBoYXMgcGFyc2VkIHRoZSBkaWN0aW9uYXJ5IHNpemUgZnJvbSB0aGUgc3RyZWFtCisgKiBoZWFkZXJzLiBUaGlzIHdheSBleGNlc3NpdmUgYWxsb2NhdGlvbnMgY2FuIGJlIGF2b2lkZWQgd2hpbGUgc3RpbGwKKyAqIGxpbWl0aW5nIHRoZSBtYXhpbXVtIG1lbW9yeSB1c2FnZSB0byBhIHNhbmUgdmFsdWUgdG8gcHJldmVudCBydW5uaW5nIHRoZQorICogc3lzdGVtIG91dCBvZiBtZW1vcnkgd2hlbiBkZWNvbXByZXNzaW5nIHN0cmVhbXMgZnJvbSB1bnRydXN0ZWQgc291cmNlcy4KKyAqCisgKiBPbiBzdWNjZXNzLCB4el9kZWNfaW5pdCgpIHJldHVybnMgYSBwb2ludGVyIHRvIHN0cnVjdCB4el9kZWMsIHdoaWNoIGlzCisgKiByZWFkeSB0byBiZSB1c2VkIHdpdGggeHpfZGVjX3J1bigpLiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywKKyAqIHh6X2RlY19pbml0KCkgcmV0dXJucyBOVUxMLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlYyAqeHpfZGVjX2luaXQoZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoqCisgKiB4el9kZWNfcnVuKCkgLSBSdW4gdGhlIFhaIGRlY29kZXIKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpCisgKiBAYjogICAgICAgICAgSW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisgKgorICogVGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgZGVwZW5kIG9uIGJ1aWxkIG9wdGlvbnMgYW5kIG9wZXJhdGlvbiBtb2RlLgorICogU2VlIGVudW0geHpfcmV0IGZvciBkZXRhaWxzLgorICoKKyAqIE5vdGUgdGhhdCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gc2luZ2xlLWNhbGwgbW9kZSAocmV0dXJuIHZhbHVlIGlzIG5vdAorICogWFpfU1RSRUFNX0VORCksIGItPmluX3BvcyBhbmQgYi0+b3V0X3BvcyBhcmUgbm90IG1vZGlmaWVkIGFuZCB0aGUKKyAqIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGZyb20gYi0+b3V0W2ItPm91dF9wb3NdIG9ud2FyZCBhcmUKKyAqIHVuZGVmaW5lZC4gVGhpcyBpcyB0cnVlIGV2ZW4gYWZ0ZXIgWFpfQlVGX0VSUk9SLCBiZWNhdXNlIHdpdGggc29tZSBmaWx0ZXIKKyAqIGNoYWlucywgdGhlcmUgbWF5IGJlIGEgc2Vjb25kIHBhc3Mgb3ZlciB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIHRoaXMgcGFzcworICogY2Fubm90IGJlIHByb3Blcmx5IGRvbmUgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgdHJ1bmNhdGVkLiBUaHVzLCB5b3UKKyAqIGNhbm5vdCBnaXZlIHRoZSBzaW5nbGUtY2FsbCBkZWNvZGVyIGEgdG9vIHNtYWxsIGJ1ZmZlciBhbmQgdGhlbiBleHBlY3QgdG8KKyAqIGdldCB0aGF0IGFtb3VudCB2YWxpZCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLiBZb3UgbXVzdCB1c2UKKyAqIHRoZSBtdWx0aS1jYWxsIGRlY29kZXIgaWYgeW91IGRvbid0IHdhbnQgdG8gdW5jb21wcmVzcyB0aGUgd2hvbGUgc3RyZWFtLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX3J1bihzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyoqCisgKiB4el9kZWNfcmVzZXQoKSAtIFJlc2V0IGFuIGFscmVhZHkgYWxsb2NhdGVkIGRlY29kZXIgc3RhdGUKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXNldCB0aGUgbXVsdGktY2FsbCBkZWNvZGVyIHN0YXRlIHdpdGhvdXQKKyAqIGZyZWVpbmcgYW5kIHJlYWxsb2NhdGluZyBtZW1vcnkgd2l0aCB4el9kZWNfZW5kKCkgYW5kIHh6X2RlY19pbml0KCkuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgeHpfZGVjX3Jlc2V0KCkgaXMgYWx3YXlzIGNhbGxlZCBpbiB0aGUgYmVnaW5uaW5nIG9mCisgKiB4el9kZWNfcnVuKCkuIFRodXMsIGV4cGxpY2l0IGNhbGwgdG8geHpfZGVjX3Jlc2V0KCkgaXMgdXNlZnVsIG9ubHkgaW4KKyAqIG11bHRpLWNhbGwgbW9kZS4KKyAqLworWFpfRVhURVJOIHZvaWQgeHpfZGVjX3Jlc2V0KHN0cnVjdCB4el9kZWMgKnMpOworCisvKioKKyAqIHh6X2RlY19lbmQoKSAtIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBkZWNvZGVyIHN0YXRlCisgKiBAczogICAgICAgICAgRGVjb2RlciBzdGF0ZSBhbGxvY2F0ZWQgdXNpbmcgeHpfZGVjX2luaXQoKS4gSWYgcyBpcyBOVUxMLAorICogICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorICovCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpOworCisvKgorICogU3RhbmRhbG9uZSBidWlsZCAodXNlcnNwYWNlIGJ1aWxkIG9yIGluLWtlcm5lbCBidWlsZCBmb3IgYm9vdCB0aW1lIHVzZSkKKyAqIG5lZWRzIGEgQ1JDMzIgaW1wbGVtZW50YXRpb24uIEZvciBub3JtYWwgaW4ta2VybmVsIHVzZSwga2VybmVsJ3Mgb3duCisgKiBDUkMzMiBtb2R1bGUgaXMgdXNlZCBpbnN0ZWFkLCBhbmQgdXNlcnMgb2YgdGhpcyBtb2R1bGUgZG9uJ3QgbmVlZCB0bworICogY2FyZSBhYm91dCB0aGUgZnVuY3Rpb25zIGJlbG93LgorICovCisjaWZuZGVmIFhaX0lOVEVSTkFMX0NSQzMyCisjCWlmZGVmIF9fS0VSTkVMX18KKyMJCWRlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAwCisjCWVsc2UKKyMJCWRlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAxCisjCWVuZGlmCisjZW5kaWYKKworI2lmIFhaX0lOVEVSTkFMX0NSQzMyCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHh6XyogZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZQorICogdGhlIENSQzMyIGxvb2t1cCB0YWJsZS4KKyAqLworWFpfRVhURVJOIHZvaWQgeHpfY3JjMzJfaW5pdCh2b2lkKTsKKworLyoKKyAqIFVwZGF0ZSBDUkMzMiB2YWx1ZSB1c2luZyB0aGUgcG9seW5vbWlhbCBmcm9tIElFRUUtODAyLjMuIFRvIHN0YXJ0IGEgbmV3CisgKiBjYWxjdWxhdGlvbiwgdGhlIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgemVyby4gVG8gY29udGludWUgdGhlIGNhbGN1bGF0aW9uLAorICogdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4KKyAqLworWFpfRVhURVJOIHVpbnQzMl90IHh6X2NyYzMyKGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGNyYyk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3Zwc3MuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cHNzLmgKaW5kZXggYzU5Y2MwMi4uYjU4NjQ5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3Zwc3MuaAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBzcy5oCkBAIC00NCw3ICs0NCw3IEBACiAJc2hvcnQgcHBsZW47CiB9OwogCi0vKiBVc2VkIGZvciBlbmFibGUvZGlhYmxlIFZQU1MgQ2xvY2sgKi8KKy8qIFVzZWQgZm9yIGVuYWJsZS9kaXNhYmxlIFZQU1MgQ2xvY2sgKi8KIGVudW0gdnBzc19jbG9ja19zZWwgewogCS8qIERNMzU1L0RNMzY1ICovCiAJVlBTU19DQ0RDX0NMT0NLLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91c2VyLmggYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAppbmRleCAyYjI3NjljLi4yYTEyOGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VzZXIuaApAQCAtOTksOCArOTksOCBAQAogI2RlZmluZSBTQ1RQX1NPQ0tPUFRfUEVFTE9GRgkxMDIJLyogcGVlbCBvZmYgYXNzb2NpYXRpb24uICovCiAvKiBPcHRpb25zIDEwNC0xMDYgYXJlIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQuIERvIG5vdCB1c2UgdGhpcyBzcGFjZSAqLwogI2RlZmluZSBTQ1RQX1NPQ0tPUFRfQ09OTkVDVFhfT0xECTEwNwkvKiBDT05ORUNUWCBvbGQgcmVxdWVzdHMuICovCi0jZGVmaW5lIFNDVFBfR0VUX1BFRVJfQUREUlMJMTA4CQkvKiBHZXQgYWxsIHBlZXIgYWRkcmVzc3MuICovCi0jZGVmaW5lIFNDVFBfR0VUX0xPQ0FMX0FERFJTCTEwOQkJLyogR2V0IGFsbCBsb2NhbCBhZGRyZXNzcy4gKi8KKyNkZWZpbmUgU0NUUF9HRVRfUEVFUl9BRERSUwkxMDgJCS8qIEdldCBhbGwgcGVlciBhZGRyZXNzLiAqLworI2RlZmluZSBTQ1RQX0dFVF9MT0NBTF9BRERSUwkxMDkJCS8qIEdldCBhbGwgbG9jYWwgYWRkcmVzcy4gKi8KICNkZWZpbmUgU0NUUF9TT0NLT1BUX0NPTk5FQ1RYCTExMAkJLyogQ09OTkVDVFggcmVxdWVzdHMuICovCiAjZGVmaW5lIFNDVFBfU09DS09QVF9DT05ORUNUWDMJMTExCS8qIENPTk5FQ1RYIHJlcXVlc3RzICh1cGRhdGVkKSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmMvZmNfZmNwLmggYi9pbmNsdWRlL3Njc2kvZmMvZmNfZmNwLmgKaW5kZXggOGU5YjIyMi4uOGExNDNjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjL2ZjX2ZjcC5oCisrKyBiL2luY2x1ZGUvc2NzaS9mYy9mY19mY3AuaApAQCAtNDYsNyArNDYsNyBAQAogICovCiBzdHJ1Y3QgZmNwX2NtbmQgewogCV9fdTgJCWZjX2x1bls4XTsJLyogbG9naWNhbCB1bml0IG51bWJlciAqLwotCV9fdTgJCWZjX2NtZHJlZjsJLyogY29tbW1hbmQgcmVmZXJlbmNlIG51bWJlciAqLworCV9fdTgJCWZjX2NtZHJlZjsJLyogY29tbWFuZCByZWZlcmVuY2UgbnVtYmVyICovCiAJX191OAkJZmNfcHJpX3RhOwkvKiBwcmlvcml0eSBhbmQgdGFzayBhdHRyaWJ1dGUgKi8KIAlfX3U4CQlmY190bV9mbGFnczsJLyogdGFzayBtYW5hZ2VtZW50IGZsYWdzICovCiAJX191OAkJZmNfZmxhZ3M7CS8qIGFkZGl0aW9uYWwgbGVuICYgZmxhZ3MgKi8KQEAgLTU4LDcgKzU4LDcgQEAKIAogc3RydWN0IGZjcF9jbW5kMzIgewogCV9fdTgJCWZjX2x1bls4XTsJLyogbG9naWNhbCB1bml0IG51bWJlciAqLwotCV9fdTgJCWZjX2NtZHJlZjsJLyogY29tbW1hbmQgcmVmZXJlbmNlIG51bWJlciAqLworCV9fdTgJCWZjX2NtZHJlZjsJLyogY29tbWFuZCByZWZlcmVuY2UgbnVtYmVyICovCiAJX191OAkJZmNfcHJpX3RhOwkvKiBwcmlvcml0eSBhbmQgdGFzayBhdHRyaWJ1dGUgKi8KIAlfX3U4CQlmY190bV9mbGFnczsJLyogdGFzayBtYW5hZ2VtZW50IGZsYWdzICovCiAJX191OAkJZmNfZmxhZ3M7CS8qIGFkZGl0aW9uYWwgbGVuICYgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaS5oCmluZGV4IDE2NTFmZWYxLi42NDhkMjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogI2RlZmluZSBVTk1BUAkJICAgICAgMHg0MgogI2RlZmluZSBSRUFEX1RPQyAgICAgICAgICAgICAgMHg0MwogI2RlZmluZSBSRUFEX0hFQURFUiAgICAgICAgICAgMHg0NAorI2RlZmluZSBHRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTiAweDRhCiAjZGVmaW5lIExPR19TRUxFQ1QgICAgICAgICAgICAweDRjCiAjZGVmaW5lIExPR19TRU5TRSAgICAgICAgICAgICAweDRkCiAjZGVmaW5lIFhEV1JJVEVSRUFEXzEwICAgICAgICAweDUzCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FsYzU2MjMuaCBiL2luY2x1ZGUvc291bmQvYWxjNTYyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMmM5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL2FsYzU2MjMuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIF9JTkNMVURFX1NPVU5EX0FMQzU2MjNfSAorI2RlZmluZSBfSU5DTFVERV9TT1VORF9BTEM1NjIzX0gKK3N0cnVjdCBhbGM1NjIzX3BsYXRmb3JtX2RhdGEgeworCS8qIGNvbmZpZ3VyZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBMaW5lb3V0L1NwZWFrZXIgQW1wcyBWbWlkIHJhdGlvIGNvbnRyb2wgICovCisJLyogZW5hYmxlL2Rpc2FibGUgYWRjL2RhYyBoaWdoIHBhc3MgZmlsdGVycyAqLworCXVuc2lnbmVkIGludCBhZGRfY3RybDsKKwkvKiBjb25maWd1cmUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogb3V0cHV0IHRvIGVuYWJsZSB3aGVuIGphY2sgaXMgbG93ICAgICAgICAqLworCS8qIG91dHB1dCB0byBlbmFibGUgd2hlbiBqYWNrIGlzIGhpZ2ggICAgICAgKi8KKwkvKiBqYWNrIGRldGVjdCAoZ3Bpby9uYy9qYWNrIGRldGVjdCBbMTJdICAgICovCisJdW5zaWduZWQgaW50IGphY2tfZGV0X2N0cmw7Cit9OworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYXNvdW5kLmggYi9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCmluZGV4IGExODAzZWMuLjVkNjA3NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hc291bmQuaApAQCAtMjU5LDYgKzI1OSw3IEBACiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYCTB4MDAxMDAwMDAJLyogb25seSBoYWxmIGR1cGxleCAqLwogI2RlZmluZSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVgJMHgwMDIwMDAwMAkvKiBwbGF5YmFjayBhbmQgY2FwdHVyZSBzdHJlYW0gYXJlIHNvbWV3aGF0IGNvcnJlbGF0ZWQgKi8KICNkZWZpbmUgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVAkweDAwNDAwMDAwCS8qIHBjbSBzdXBwb3J0IHNvbWUga2luZCBvZiBzeW5jIGdvICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAJMHgwMDgwMDAwMAkvKiBwZXJpb2Qgd2FrZXVwIGNhbiBiZSBkaXNhYmxlZCAqLwogI2RlZmluZSBTTkRSVl9QQ01fSU5GT19GSUZPX0lOX0ZSQU1FUwkweDgwMDAwMDAwCS8qIGludGVybmFsIGtlcm5lbCBmbGFnIC0gRklGTyBzaXplIGlzIGluIGZyYW1lcyAqLwogCiB0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9zdGF0ZV90OwpAQCAtMzM0LDYgKzMzNSw4IEBACiAjZGVmaW5lCVNORFJWX1BDTV9IV19QQVJBTV9MQVNUX0lOVEVSVkFMCVNORFJWX1BDTV9IV19QQVJBTV9USUNLX1RJTUUKIAogI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX05PUkVTQU1QTEUJKDE8PDApCS8qIGF2b2lkIHJhdGUgcmVzYW1wbGluZyAqLworI2RlZmluZSBTTkRSVl9QQ01fSFdfUEFSQU1TX0VYUE9SVF9CVUZGRVIJKDE8PDEpCS8qIGV4cG9ydCBidWZmZXIgKi8KKyNkZWZpbmUgU05EUlZfUENNX0hXX1BBUkFNU19OT19QRVJJT0RfV0FLRVVQCSgxPDwyKQkvKiBkaXNhYmxlIHBlcmlvZCB3YWtldXBzICovCiAKIHN0cnVjdCBzbmRfaW50ZXJ2YWwgewogCXVuc2lnbmVkIGludCBtaW4sIG1heDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29udHJvbC5oIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKaW5kZXggMTEyMzc0ZC4uNzcxNWU2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKQEAgLTE2MCwxMiArMTYwLDE0IEBACiB9CiAKIC8qCi0gKiBGcmVxdWVudGx5IHVzZWQgY29udHJvbCBjYWxsYmFja3MKKyAqIEZyZXF1ZW50bHkgdXNlZCBjb250cm9sIGNhbGxiYWNrcy9oZWxwZXJzCiAgKi8KIGludCBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CiBpbnQgc25kX2N0bF9ib29sZWFuX3N0ZXJlb19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOworaW50IHNuZF9jdGxfZW51bV9pbmZvKHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaXRlbXMsIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10pOwogCiAvKgogICogdmlydHVhbCBtYXN0ZXIgY29udHJvbApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9oZHNwLmggYi9pbmNsdWRlL3NvdW5kL2hkc3AuaAppbmRleCBkOThhNzhkLi4wOTA5YTM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2hkc3AuaAorKysgYi9pbmNsdWRlL3NvdW5kL2hkc3AuaApAQCAtMjgsNiArMjgsNyBAQAogCU11bHRpZmFjZSwKIAlIOTY1MiwKIAlIOTYzMiwKKwlSUE0sCiAJVW5kZWZpbmVkLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9taW5vcnMuaCBiL2luY2x1ZGUvc291bmQvbWlub3JzLmgKaW5kZXggYTgxNzk4YS4uOGY3NjQyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9taW5vcnMuaAorKysgYi9pbmNsdWRlL3NvdW5kL21pbm9ycy5oCkBAIC0zMSw4ICszMSw4IEBACiAvKiB0aGVzZSBtaW5vcnMgY2FuIHN0aWxsIGJlIHVzZWQgZm9yIGF1dG9sb2FkaW5nIGRldmljZXMgKC9kZXYvYWxvYWQqKSAqLwogI2RlZmluZSBTTkRSVl9NSU5PUl9DT05UUk9MCQkwCS8qIDAgKi8KICNkZWZpbmUgU05EUlZfTUlOT1JfR0xPQkFMCQkxCS8qIDEgKi8KLSNkZWZpbmUgU05EUlZfTUlOT1JfU0VRVUVOQ0VSCQkoU05EUlZfTUlOT1JfR0xPQkFMICsgMCAqIDMyKQotI2RlZmluZSBTTkRSVl9NSU5PUl9USU1FUgkJKFNORFJWX01JTk9SX0dMT0JBTCArIDEgKiAzMikKKyNkZWZpbmUgU05EUlZfTUlOT1JfU0VRVUVOQ0VSCQkxCS8qIFNORFJWX01JTk9SX0dMT0JBTCArIDAgKiAzMiAqLworI2RlZmluZSBTTkRSVl9NSU5PUl9USU1FUgkJMzMJLyogU05EUlZfTUlOT1JfR0xPQkFMICsgMSAqIDMyICovCiAKICNpZm5kZWYgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUwogCQkJCQkJLyogMiAtIDMgKHJlc2VydmVkKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggZGZkOWI3Ni4uZTczMWY4ZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtMjk3LDYgKzI5Nyw3IEBACiAJdW5zaWduZWQgaW50IGluZm87CiAJdW5zaWduZWQgaW50IHJhdGVfbnVtOwogCXVuc2lnbmVkIGludCByYXRlX2RlbjsKKwl1bnNpZ25lZCBpbnQgbm9fcGVyaW9kX3dha2V1cDogMTsKIAogCS8qIC0tIFNXIHBhcmFtcyAtLSAqLwogCWludCB0c3RhbXBfbW9kZTsJCS8qIG1tYXAgdGltZXN0YW1wIGlzIHVwZGF0ZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRhaS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmgKaW5kZXggZTdiNjgwMi4uMWJhZmU5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFpLmgKQEAgLTE2LDggKzE2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotCiBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW07CiAKIC8qCkBAIC0yMDUsNyArMjAzLDcgQEAKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKTsKIAogCS8qIG9wcyAqLwotCXN0cnVjdCBzbmRfc29jX2RhaV9vcHMgKm9wczsKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzICpvcHM7CiAKIAkvKiBEQUkgY2FwYWJpbGl0aWVzICovCiAJc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSBjYXB0dXJlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oIGIvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCmluZGV4IDhmZDNiNDEuLjgwMzE3NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogLyogd2lkZ2V0IGhhcyBubyBQTSByZWdpc3RlciBiaXQgKi8KICNkZWZpbmUgU05EX1NPQ19OT1BNCS0xCkBAIC03Miw2ICs3MSwxMCBAQAogCSB3Y29udHJvbHMsIHduY29udHJvbHMpIFwKIHsJLmlkID0gc25kX3NvY19kYXBtX3BnYSwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAogCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IHduY29udHJvbHN9CisjZGVmaW5lIFNORF9TT0NfREFQTV9PVVRfRFJWKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsXAorCSB3Y29udHJvbHMsIHduY29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX291dF9kcnYsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSB3bmNvbnRyb2xzfQogI2RlZmluZSBTTkRfU09DX0RBUE1fTUlYRVIod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgXAogCSB3Y29udHJvbHMsIHduY29udHJvbHMpXAogewkuaWQgPSBzbmRfc29jX2RhcG1fbWl4ZXIsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKQEAgLTkwLDYgKzkzLDkgQEAKICNkZWZpbmUgU05EX1NPQ19EQVBNX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKIHsJLmlkID0gc25kX3NvY19kYXBtX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXAogCS5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCAubnVtX2tjb250cm9scyA9IDF9CisjZGVmaW5lIFNORF9TT0NfREFQTV9WSVJUX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX3ZpcnRfbXV4LCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCisJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMX0KICNkZWZpbmUgU05EX1NPQ19EQVBNX1ZBTFVFX01VWCh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMpIFwKIHsJLmlkID0gc25kX3NvY19kYXBtX3ZhbHVlX211eCwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIFwKIAkuc2hpZnQgPSB3c2hpZnQsIC5pbnZlcnQgPSB3aW52ZXJ0LCAua2NvbnRyb2xzID0gd2NvbnRyb2xzLCBcCkBAIC0xMTYsNiArMTIyLDExIEBACiB7CS5pZCA9IHNuZF9zb2NfZGFwbV9wZ2EsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKIAkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSB3bmNvbnRyb2xzLCBcCiAJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CisjZGVmaW5lIFNORF9TT0NfREFQTV9PVVRfRFJWX0Uod25hbWUsIHdyZWcsIHdzaGlmdCwgd2ludmVydCwgd2NvbnRyb2xzLCBcCisJd25jb250cm9scywgd2V2ZW50LCB3ZmxhZ3MpIFwKK3sJLmlkID0gc25kX3NvY19kYXBtX291dF9kcnYsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSB3bmNvbnRyb2xzLCBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CiAjZGVmaW5lIFNORF9TT0NfREFQTV9NSVhFUl9FKHduYW1lLCB3cmVnLCB3c2hpZnQsIHdpbnZlcnQsIHdjb250cm9scywgXAogCXduY29udHJvbHMsIHdldmVudCwgd2ZsYWdzKSBcCiB7CS5pZCA9IHNuZF9zb2NfZGFwbV9taXhlciwgLm5hbWUgPSB3bmFtZSwgLnJlZyA9IHdyZWcsIC5zaGlmdCA9IHdzaGlmdCwgXApAQCAtMTQwLDYgKzE1MSwxMSBAQAogewkuaWQgPSBzbmRfc29jX2RhcG1fbXV4LCAubmFtZSA9IHduYW1lLCAucmVnID0gd3JlZywgLnNoaWZ0ID0gd3NoaWZ0LCBcCiAJLmludmVydCA9IHdpbnZlcnQsIC5rY29udHJvbHMgPSB3Y29udHJvbHMsIC5udW1fa2NvbnRyb2xzID0gMSwgXAogCS5ldmVudCA9IHdldmVudCwgLmV2ZW50X2ZsYWdzID0gd2ZsYWdzfQorI2RlZmluZSBTTkRfU09DX0RBUE1fVklSVF9NVVhfRSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKKwl3ZXZlbnQsIHdmbGFncykgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fdmlydF9tdXgsIC5uYW1lID0gd25hbWUsIC5yZWcgPSB3cmVnLCAuc2hpZnQgPSB3c2hpZnQsIFwKKwkuaW52ZXJ0ID0gd2ludmVydCwgLmtjb250cm9scyA9IHdjb250cm9scywgLm51bV9rY29udHJvbHMgPSAxLCBcCisJLmV2ZW50ID0gd2V2ZW50LCAuZXZlbnRfZmxhZ3MgPSB3ZmxhZ3N9CiAKIC8qIFNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWJvdmUgbWFjcm9zLCBhc3N1bWluZyB3bmNvbnRyb2xzID0gQVJSQVlfU0laRSh3Y29udHJvbHMpICovCiAjZGVmaW5lIFNPQ19QR0FfRV9BUlJBWSh3bmFtZSwgd3JlZywgd3NoaWZ0LCB3aW52ZXJ0LCB3Y29udHJvbHMsIFwKQEAgLTIxOSwxMyArMjM1LDYgQEAKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAogCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdywgXAogCS5wcml2YXRlX3ZhbHVlID0gIFNPQ19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQpIH0KLSNkZWZpbmUgU09DX0RBUE1fRE9VQkxFKHhuYW1lLCByZWcsIHNoaWZ0X2xlZnQsIHNoaWZ0X3JpZ2h0LCBtYXgsIGludmVydCwgXAotCXBvd2VyKSBcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAotIAkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF92b2xzdywgLnB1dCA9IHNuZF9zb2NfZGFwbV9wdXRfdm9sc3csIFwKLSAJLnByaXZhdGVfdmFsdWUgPSAocmVnKSB8ICgoc2hpZnRfbGVmdCkgPDwgOCkgfCAoKHNoaWZ0X3JpZ2h0KSA8PCAxMikgfFwKLQkJKChtYXgpIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkgfQogI2RlZmluZSBTT0NfREFQTV9TSU5HTEVfVExWKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXgsIGludmVydCwgdGx2X2FycmF5KSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCiAJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKQEAgLTIzMywxNSArMjQyLDYgQEAKIAkudGx2LnAgPSAodGx2X2FycmF5KSwgXAogCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdywgXAogCS5wcml2YXRlX3ZhbHVlID0gIFNPQ19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQpIH0KLSNkZWZpbmUgU09DX0RBUE1fRE9VQkxFX1RMVih4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWF4LCBpbnZlcnQsIFwKLQlwb3dlciwgdGx2X2FycmF5KSBcCi17CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCi0JLnRsdi5wID0gKHRsdl9hcnJheSksIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgXAotCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZvbHN3LCAucHV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdywgXAotCS5wcml2YXRlX3ZhbHVlID0gKHJlZykgfCAoKHNoaWZ0X2xlZnQpIDw8IDgpIHwgKChzaGlmdF9yaWdodCkgPDwgMTIpIHxcCi0JCSgobWF4KSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KICNkZWZpbmUgU09DX0RBUE1fRU5VTSh4bmFtZSwgeGVudW0pIFwKIHsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKIAkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXApAQCAtMjk3LDYgKzI5Nyw3IEBACiBzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGg7CiBzdHJ1Y3Qgc25kX3NvY19kYXBtX3BpbjsKIHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGU7CitzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQ7CiAKIGludCBkYXBtX3JlZ19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7CkBAIC0zMjQsMTYgKzMyNSwxNiBAQAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVuY29udHJvbCk7CiBpbnQgc25kX3NvY19kYXBtX3B1dF9waW5fc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVuY29udHJvbCk7Ci1pbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKK2ludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQpOwotaW50IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAoraW50IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCiAJaW50IG51bSk7CiAKIC8qIGRhcG0gcGF0aCBzZXR1cCAqLwotaW50IHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotdm9pZCBzbmRfc29jX2RhcG1fZnJlZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotaW50IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKK2ludCBzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKK3ZvaWQgc25kX3NvY19kYXBtX2ZyZWUoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKK2ludCBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkgICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqcm91dGUsIGludCBudW0pOwogCiAvKiBkYXBtIGV2ZW50cyAqLwpAQCAtMzQzLDI3ICszNDQsMzMgQEAKIAogLyogZGFwbSBzeXMgZnMgLSB1c2VkIGJ5IHRoZSBjb3JlICovCiBpbnQgc25kX3NvY19kYXBtX3N5c19hZGQoc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgc25kX3NvY19kYXBtX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCBzbmRfc29jX2RhcG1fZGVidWdmc19pbml0KHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSk7CiAKIC8qIGRhcG0gYXVkaW8gcGluIGNvbnRyb2wgYW5kIHN0YXR1cyAqLwotaW50IHNuZF9zb2NfZGFwbV9lbmFibGVfcGluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqcGluKTsKLWludCBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpwaW4pOwotaW50IHNuZF9zb2NfZGFwbV9uY19waW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpwaW4pOwotaW50IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBpbik7Ci1pbnQgc25kX3NvY19kYXBtX3N5bmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLWludCBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCitpbnQgc25kX3NvY19kYXBtX2VuYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJICAgIGNvbnN0IGNoYXIgKnBpbik7CitpbnQgc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCSAgICAgY29uc3QgY2hhciAqcGluKTsKK2ludCBzbmRfc29jX2RhcG1fbmNfcGluKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwgY29uc3QgY2hhciAqcGluKTsKK2ludCBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJCWNvbnN0IGNoYXIgKnBpbik7CitpbnQgc25kX3NvY19kYXBtX3N5bmMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKTsKK2ludCBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJICBjb25zdCBjaGFyICpwaW4pOwotaW50IHNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBpbik7CitpbnQgc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCQljb25zdCBjaGFyICpwaW4pOwogCiAvKiBkYXBtIHdpZGdldCB0eXBlcyAqLwogZW51bSBzbmRfc29jX2RhcG1fdHlwZSB7CiAJc25kX3NvY19kYXBtX2lucHV0ID0gMCwJCS8qIGlucHV0IHBpbiAqLwogCXNuZF9zb2NfZGFwbV9vdXRwdXQsCQkvKiBvdXRwdXQgcGluICovCiAJc25kX3NvY19kYXBtX211eCwJCQkvKiBzZWxlY3RzIDEgYW5hbG9nIHNpZ25hbCBmcm9tIG1hbnkgaW5wdXRzICovCisJc25kX3NvY19kYXBtX3ZpcnRfbXV4LAkJCS8qIHZpcnR1YWwgdmVyc2lvbiBvZiBzbmRfc29jX2RhcG1fbXV4ICovCiAJc25kX3NvY19kYXBtX3ZhbHVlX211eCwJCQkvKiBzZWxlY3RzIDEgYW5hbG9nIHNpZ25hbCBmcm9tIG1hbnkgaW5wdXRzICovCiAJc25kX3NvY19kYXBtX21peGVyLAkJCS8qIG1peGVzIHNldmVyYWwgYW5hbG9nIHNpZ25hbHMgdG9nZXRoZXIgKi8KIAlzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsLAkJLyogbWl4ZXIgd2l0aCBuYW1lZCBjb250cm9scyAqLwogCXNuZF9zb2NfZGFwbV9wZ2EsCQkJLyogcHJvZ3JhbW1hYmxlIGdhaW4vYXR0ZW51YXRpb24gKHZvbHVtZSkgKi8KKwlzbmRfc29jX2RhcG1fb3V0X2RydiwJCQkvKiBvdXRwdXQgZHJpdmVyICovCiAJc25kX3NvY19kYXBtX2FkYywJCQkvKiBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXIgKi8KIAlzbmRfc29jX2RhcG1fZGFjLAkJCS8qIGRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRlciAqLwogCXNuZF9zb2NfZGFwbV9taWNiaWFzLAkJLyogbWljcm9waG9uZSBiaWFzIChwb3dlcikgKi8KQEAgLTQyNSw2ICs0MzIsNyBAQAogCWNoYXIgKnNuYW1lOwkvKiBzdHJlYW0gbmFtZSAqLwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOwogCiAJLyogZGFwbSBjb250cm9sICovCiAJc2hvcnQgcmVnOwkJCQkJCS8qIG5lZ2F0aXZlIHJlZyA9IG5vIGRpcmVjdCBkYXBtICovCkBAIC00NjEsNCArNDY5LDM1IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwb3dlcl9saXN0OwogfTsKIAorc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgeworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQ7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJaW50IHJlZzsKKwlpbnQgbWFzazsKKwlpbnQgdmFsOworfTsKKworLyogREFQTSBjb250ZXh0ICovCitzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgeworCWludCBuX3dpZGdldHM7IC8qIG51bWJlciBvZiB3aWRnZXRzIGluIHRoaXMgY29udGV4dCAqLworCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGJpYXNfbGV2ZWw7CisJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgc3VzcGVuZF9iaWFzX2xldmVsOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCXVuc2lnbmVkIGludCBpZGxlX2JpYXNfb2ZmOjE7IC8qIFVzZSBCSUFTX09GRiBpbnN0ZWFkIG9mIFNUQU5EQlkgKi8KKworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGU7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7IC8qIGZyb20gcGFyZW50IC0gZm9yIGRlYnVnICovCisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOyAvKiBwYXJlbnQgY29kZWMgKi8KKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOyAvKiBwYXJlbnQgY2FyZCAqLworCisJLyogdXNlZCBkdXJpbmcgREFQTSB1cGRhdGVzICovCisJaW50IGRldl9wb3dlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RhcG07CisjZW5kaWYKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggNWMzYmNlOC4uNzQ5MjFmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC0yMjIsMTAgKzIyMiw4IEBACiAKIHN0cnVjdCBzbmRfamFjazsKIHN0cnVjdCBzbmRfc29jX2NhcmQ7Ci1zdHJ1Y3Qgc25kX3NvY19kZXZpY2U7CiBzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtOwogc3RydWN0IHNuZF9zb2Nfb3BzOwotc3RydWN0IHNuZF9zb2NfZGFpX21vZGU7CiBzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZTsKIHN0cnVjdCBzbmRfc29jX2RhaTsKIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXI7CkBAIC0yMzUsOSArMjMzLDEwIEBACiBzdHJ1Y3Qgc25kX3NvY19jb2RlYzsKIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlcjsKIHN0cnVjdCBzb2NfZW51bTsKLXN0cnVjdCBzbmRfc29jX2FjOTdfb3BzOwogc3RydWN0IHNuZF9zb2NfamFjazsKIHN0cnVjdCBzbmRfc29jX2phY2tfcGluOworc3RydWN0IHNuZF9zb2NfY2FjaGVfb3BzOworI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpZmRlZiBDT05GSUdfR1BJT0xJQgogc3RydWN0IHNuZF9zb2NfamFja19ncGlvOwpAQCAtMjUzLDE3ICsyNTIsMzAgQEAKIAlTTkRfU09DX1NQSSwKIH07CiAKK2VudW0gc25kX3NvY19jb21wcmVzc190eXBlIHsKKwlTTkRfU09DX0ZMQVRfQ09NUFJFU1NJT04gPSAxLAorCVNORF9TT0NfTFpPX0NPTVBSRVNTSU9OLAorCVNORF9TT0NfUkJUUkVFX0NPTVBSRVNTSU9OCit9OworCiBpbnQgc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciAqcGxhdGZvcm1fZHJ2KTsKIHZvaWQgc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKHN0cnVjdCBkZXZpY2UgKmRldik7CiBpbnQgc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciAqY29kZWNfZHJ2LAorCQljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydiwKIAkJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydiwgaW50IG51bV9kYWkpOwogdm9pZCBzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoc3RydWN0IGRldmljZSAqZGV2KTsKIGludCBzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHJlZyk7CiBpbnQgc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJICAgICAgIGludCBhZGRyX2JpdHMsIGludCBkYXRhX2JpdHMsCiAJCQkgICAgICAgZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sKTsKK2ludCBzbmRfc29jX2NhY2hlX3N5bmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2ludCBzbmRfc29jX2NhY2hlX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2ludCBzbmRfc29jX2NhY2hlX2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK2ludCBzbmRfc29jX2NhY2hlX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSk7CitpbnQgc25kX3NvY19jYWNoZV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJICAgICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCAqdmFsdWUpOwogCiAvKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byBnZXQgY2xvY2sgcmF0ZXMgZnJvbSB2YXJpb3VzIHRoaW5ncyAqLwogaW50IHNuZF9zb2NfY2FsY19mcmFtZV9zaXplKGludCBzYW1wbGVfc2l6ZSwgaW50IGNoYW5uZWxzLCBpbnQgdGRtX3Nsb3RzKTsKQEAgLTQyMCwyMyArNDMyLDM3IEBACiAJaW50ICgqdHJpZ2dlcikoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICosIGludCk7CiB9OwogCisvKiBTb0MgY2FjaGUgb3BzICovCitzdHJ1Y3Qgc25kX3NvY19jYWNoZV9vcHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJZW51bSBzbmRfc29jX2NvbXByZXNzX3R5cGUgaWQ7CisJaW50ICgqaW5pdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKwlpbnQgKCpleGl0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworCWludCAoKnJlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJdW5zaWduZWQgaW50ICp2YWx1ZSk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJdW5zaWduZWQgaW50IHZhbHVlKTsKKwlpbnQgKCpzeW5jKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworfTsKKwogLyogU29DIEF1ZGlvIENvZGVjIGRldmljZSAqLwogc3RydWN0IHNuZF9zb2NfY29kZWMgewogCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbmFtZV9wcmVmaXg7CiAJaW50IGlkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmRyaXZlcjsKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmRyaXZlcjsKIAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNhcmRfbGlzdDsKIAlpbnQgbnVtX2RhaTsKKwllbnVtIHNuZF9zb2NfY29tcHJlc3NfdHlwZSBjb21wcmVzc190eXBlOwogCiAJLyogcnVudGltZSAqLwogCXN0cnVjdCBzbmRfYWM5NyAqYWM5NzsgIC8qIGZvciBhZC1ob2MgYWM5NyBkZXZpY2VzICovCiAJdW5zaWduZWQgaW50IGFjdGl2ZTsKLQl1bnNpZ25lZCBpbnQgaWRsZV9iaWFzX29mZjoxOyAvKiBVc2UgQklBU19PRkYgaW5zdGVhZCBvZiBTVEFOREJZICovCiAJdW5zaWduZWQgaW50IGNhY2hlX29ubHk6MTsgIC8qIFN1cHByZXNzIHdyaXRlcyB0byBoYXJkd2FyZSAqLwogCXVuc2lnbmVkIGludCBjYWNoZV9zeW5jOjE7IC8qIENhY2hlIG5lZWRzIHRvIGJlIHN5bmNlZCB0byBoYXJkd2FyZSAqLwogCXVuc2lnbmVkIGludCBzdXNwZW5kZWQ6MTsgLyogQ29kZWMgaXMgaW4gc3VzcGVuZCBQTSBzdGF0ZSAqLwpAQCAtNDQ0LDI1ICs0NzAsMjUgQEAKIAl1bnNpZ25lZCBpbnQgYWM5N19yZWdpc3RlcmVkOjE7IC8qIENvZGVjIGhhcyBiZWVuIEFDOTcgcmVnaXN0ZXJlZCAqLwogCXVuc2lnbmVkIGludCBhYzk3X2NyZWF0ZWQ6MTsgLyogQ29kZWMgaGFzIGJlZW4gY3JlYXRlZCBieSBTb0MgKi8KIAl1bnNpZ25lZCBpbnQgc3lzZnNfcmVnaXN0ZXJlZDoxOyAvKiBjb2RlYyBoYXMgYmVlbiBzeXNmcyByZWdpc3RlcmVkICovCisJdW5zaWduZWQgaW50IGNhY2hlX2luaXQ6MTsgLyogY29kZWMgY2FjaGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KIAogCS8qIGNvZGVjIElPICovCiAJdm9pZCAqY29udHJvbF9kYXRhOyAvKiBjb2RlYyBjb250cm9sIChpMmMvM3dpcmUpIGRhdGEgKi8KIAlod193cml0ZV90IGh3X3dyaXRlOwogCXVuc2lnbmVkIGludCAoKmh3X3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHVuc2lnbmVkIGludCk7CisJdW5zaWduZWQgaW50ICgqcmVhZCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50KTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogCXZvaWQgKnJlZ19jYWNoZTsKKwljb25zdCB2b2lkICpyZWdfZGVmX2NvcHk7CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfY2FjaGVfb3BzICpjYWNoZV9vcHM7CisJc3RydWN0IG11dGV4IGNhY2hlX3J3X211dGV4OwogCiAJLyogZGFwbSAqLwotCXUzMiBwb3BfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fd2lkZ2V0czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fcGF0aHM7Ci0JZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgYmlhc19sZXZlbDsKLQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBzdXNwZW5kX2JpYXNfbGV2ZWw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0IGRhcG07CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NvZGVjX3Jvb3Q7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yZWc7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc19wb3BfdGltZTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RhcG07CiAjZW5kaWYKIH07CkBAIC00ODgsNiArNTE0LDcgQEAKIAlzaG9ydCByZWdfY2FjaGVfc3RlcDsKIAlzaG9ydCByZWdfd29yZF9zaXplOwogCWNvbnN0IHZvaWQgKnJlZ19jYWNoZV9kZWZhdWx0OworCWVudW0gc25kX3NvY19jb21wcmVzc190eXBlIGNvbXByZXNzX3R5cGU7CiAKIAkvKiBjb2RlYyBiaWFzIGxldmVsICovCiAJaW50ICgqc2V0X2JpYXNfbGV2ZWwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCkBAIC01NTQsNiArNTgxLDMwIEBACiAJc3RydWN0IHNuZF9zb2Nfb3BzICpvcHM7CiB9OwogCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mIHsKKwljb25zdCBjaGFyICpkZXZfbmFtZTsKKworCS8qCisJICogb3B0aW9uYWwgbWFwIG9mIGtjb250cm9sLCB3aWRnZXQgYW5kIHBhdGggbmFtZSBwcmVmaXhlcyB0aGF0IGFyZQorCSAqIGFzc29jaWF0ZWQgcGVyIGRldmljZQorCSAqLworCWNvbnN0IGNoYXIgKm5hbWVfcHJlZml4OworCisJLyoKKwkgKiBzZXQgdGhpcyB0byB0aGUgZGVzaXJlZCBjb21wcmVzc2lvbiB0eXBlIGlmIHlvdSB3YW50IHRvCisJICogb3ZlcnJpZGUgdGhlIG9uZSBzdXBwbGllZCBpbiBjb2RlYy0+ZHJpdmVyLT5jb21wcmVzc190eXBlCisJICovCisJZW51bSBzbmRfc29jX2NvbXByZXNzX3R5cGUgY29tcHJlc3NfdHlwZTsKK307CisKK3N0cnVjdCBzbmRfc29jX2F1eF9kZXYgeworCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBDb2RlYyBuYW1lICovCisJY29uc3QgY2hhciAqY29kZWNfbmFtZTsJCS8qIGZvciBtdWx0aS1jb2RlYyAqLworCisJLyogY29kZWMvbWFjaGluZSBzcGVjaWZpYyBpbml0IC0gZS5nLiBhZGQgbWFjaGluZSBjb250cm9scyAqLworCWludCAoKmluaXQpKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSk7Cit9OworCiAvKiBTb0MgY2FyZCAqLwogc3RydWN0IHNuZF9zb2NfY2FyZCB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTU3OSw2ICs2MzAsOCBAQAogCS8qIGNhbGxiYWNrcyAqLwogCWludCAoKnNldF9iaWFzX2xldmVsKShzdHJ1Y3Qgc25kX3NvY19jYXJkICosCiAJCQkgICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCk7CisJaW50ICgqc2V0X2JpYXNfbGV2ZWxfcG9zdCkoc3RydWN0IHNuZF9zb2NfY2FyZCAqLAorCQkJCSAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKTsKIAogCWxvbmcgcG1kb3duX3RpbWU7CiAKQEAgLTU4OCwxMiArNjQxLDM1IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKIAlpbnQgbnVtX3J0ZDsKIAorCS8qIG9wdGlvbmFsIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICpjb2RlY19jb25mOworCWludCBudW1fY29uZmlnczsKKworCS8qCisJICogb3B0aW9uYWwgYXV4aWxpYXJ5IGRldmljZXMgc3VjaCBhcyBhbXBsaWZpZXJzIG9yIGNvZGVjcyB3aXRoIERBSQorCSAqIGxpbmsgdW51c2VkCisJICovCisJc3RydWN0IHNuZF9zb2NfYXV4X2RldiAqYXV4X2RldjsKKwlpbnQgbnVtX2F1eF9kZXZzOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGRfYXV4OworCWludCBudW1fYXV4X3J0ZDsKKwogCXN0cnVjdCB3b3JrX3N0cnVjdCBkZWZlcnJlZF9yZXN1bWVfd29yazsKIAogCS8qIGxpc3RzIG9mIHByb2JlZCBkZXZpY2VzIGJlbG9uZ2luZyB0byB0aGlzIGNhcmQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvZGVjX2Rldl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgcGxhdGZvcm1fZGV2X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBkYWlfZGV2X2xpc3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHdpZGdldHM7CisJc3RydWN0IGxpc3RfaGVhZCBwYXRoczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhcG1fbGlzdDsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY2FyZF9yb290OworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG9wX3RpbWU7CisjZW5kaWYKKwl1MzIgcG9wX3RpbWU7CiB9OwogCiAvKiBTb0MgbWFjaGluZSBEQUkgY29uZmlndXJhdGlvbiwgZ2x1ZXMgYSBjb2RlYyBhbmQgY3B1IERBSSB0b2dldGhlciAqLwpAQCAtNjM5LDE3ICs3MTUsOSBAQAogfTsKIAogLyogY29kZWMgSU8gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb2NfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCXVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGNvZGVjLT5kcml2ZXItPnJlYWQoY29kZWMsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9zb2Nfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlyZXR1cm4gY29kZWMtPmRyaXZlci0+d3JpdGUoY29kZWMsIHJlZywgdmFsKTsKLX0KK3Vuc2lnbmVkIGludCBzbmRfc29jX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnKTsKK3Vuc2lnbmVkIGludCBzbmRfc29jX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpOwogCiAvKiBkZXZpY2UgZHJpdmVyIGRhdGEgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaCBiL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmgKaW5kZXggYjBiNGViMi4uZGEzOWIyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaAorKysgYi9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCkBAIC0yMSw2ICsyMSwxNiBAQAogI3VuZGVmIENSRUFURV9UUkFDRV9QT0lOVFMKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorLyoKKyAqIG1vZHVsZS5oIGluY2x1ZGVzIHRyYWNlcG9pbnRzLCBhbmQgYmVjYXVzZSBmdHJhY2UuaAorICogcHVsbHMgaW4gbW9kdWxlLmg6CisgKiAgdHJhY2UvZnRyYWNlLmggLT4gbGludXgvZnRyYWNlX2V2ZW50LmggLT4gbGludXgvcGVyZl9ldmVudC5oIC0+CisgKiAgbGludXgvZnRyYWNlLmggLT4gbGludXgvbW9kdWxlLmgKKyAqIHdlIG11c3QgaW5jbHVkZSBtb2R1bGUuaCBoZXJlIGJlZm9yZSB3ZSBwbGF5IHdpdGggYW55IG9mCisgKiB0aGUgVFJBQ0VfRVZFTlQoKSBtYWNyb3MsIG90aGVyd2lzZSB0aGUgdHJhY2Vwb2ludHMgaW5jbHVkZWQKKyAqIGJ5IG1vZHVsZS5oIG1heSBicmVhayB0aGUgYnVpbGQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI3VuZGVmIFRSQUNFX0VWRU5UCiAjZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9hc29jLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9hc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Fzb2MuaApAQCAtMCwwICsxLDIzNSBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gYXNvYworCisjaWYgIWRlZmluZWQoX1RSQUNFX0FTT0NfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0FTT0NfSAorCisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBzbmRfc29jX2phY2s7CitzdHJ1Y3Qgc25kX3NvY19jb2RlYzsKK3N0cnVjdCBzbmRfc29jX2NhcmQ7CitzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldDsKKworLyoKKyAqIExvZyByZWdpc3RlciBldmVudHMKKyAqLworREVDTEFSRV9FVkVOVF9DTEFTUyhzbmRfc29jX3JlZywKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhjb2RlYywgcmVnLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCQljb2RlYy0+bmFtZQkpCisJCV9fZmllbGQoCWludCwJCWlkCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJcmVnCQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJdmFsCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgY29kZWMtPm5hbWUpOworCQlfX2VudHJ5LT5pZCA9IGNvZGVjLT5pZDsKKwkJX19lbnRyeS0+cmVnID0gcmVnOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygiY29kZWM9JXMuJWQgcmVnPSV4IHZhbD0leCIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICAoaW50KV9fZW50cnktPmlkLCAodW5zaWduZWQgaW50KV9fZW50cnktPnJlZywKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChzbmRfc29jX3JlZywgc25kX3NvY19yZWdfd3JpdGUsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCSB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1MoY29kZWMsIHJlZywgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19yZWcsIHNuZF9zb2NfcmVnX3JlYWQsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCSB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1MoY29kZWMsIHJlZywgdmFsKQorCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKHNuZF9zb2NfY2FyZCwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsIGludCB2YWwpLAorCisJVFBfQVJHUyhjYXJkLCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCQljYXJkLT5uYW1lCSkKKwkJX19maWVsZCgJaW50LAkJdmFsCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgY2FyZC0+bmFtZSk7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCisJVFBfcHJpbnRrKCJjYXJkPSVzIHZhbD0lZCIsIF9fZ2V0X3N0cihuYW1lKSwgKGludClfX2VudHJ5LT52YWwpCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19jYXJkLCBzbmRfc29jX2JpYXNfbGV2ZWxfc3RhcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLCBpbnQgdmFsKSwKKworCVRQX0FSR1MoY2FyZCwgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19jYXJkLCBzbmRfc29jX2JpYXNfbGV2ZWxfZG9uZSwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsIGludCB2YWwpLAorCisJVFBfQVJHUyhjYXJkLCB2YWwpCisKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moc25kX3NvY19kYXBtX2Jhc2ljLAorCisJVFBfUFJPVE8oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCksCisKKwlUUF9BUkdTKGNhcmQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCWNhcmQtPm5hbWUJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIGNhcmQtPm5hbWUpOworCSksCisKKwlUUF9wcmludGsoImNhcmQ9JXMiLCBfX2dldF9zdHIobmFtZSkpCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19kYXBtX2Jhc2ljLCBzbmRfc29jX2RhcG1fc3RhcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKSwKKworCVRQX0FSR1MoY2FyZCkKKworKTsKKworREVGSU5FX0VWRU5UKHNuZF9zb2NfZGFwbV9iYXNpYywgc25kX3NvY19kYXBtX2RvbmUsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKSwKKworCVRQX0FSR1MoY2FyZCkKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhzbmRfc29jX2RhcG1fd2lkZ2V0LAorCisJVFBfUFJPVE8oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCB2YWwpLAorCisJVFBfQVJHUyh3LCB2YWwpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCXctPm5hbWUJCSkKKwkJX19maWVsZCgJaW50LAl2YWwJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCB3LT5uYW1lKTsKKwkJX19lbnRyeS0+dmFsID0gdmFsOworCSksCisKKwlUUF9wcmludGsoIndpZGdldD0lcyB2YWw9JWQiLCBfX2dldF9zdHIobmFtZSksCisJCSAgKGludClfX2VudHJ5LT52YWwpCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19kYXBtX3dpZGdldCwgc25kX3NvY19kYXBtX3dpZGdldF9wb3dlciwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgdmFsKSwKKworCVRQX0FSR1ModywgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19kYXBtX3dpZGdldCwgc25kX3NvY19kYXBtX3dpZGdldF9ldmVudF9zdGFydCwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LCBpbnQgdmFsKSwKKworCVRQX0FSR1ModywgdmFsKQorCispOworCitERUZJTkVfRVZFTlQoc25kX3NvY19kYXBtX3dpZGdldCwgc25kX3NvY19kYXBtX3dpZGdldF9ldmVudF9kb25lLAorCisJVFBfUFJPVE8oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCB2YWwpLAorCisJVFBfQVJHUyh3LCB2YWwpCisKKyk7CisKK1RSQUNFX0VWRU5UKHNuZF9zb2NfamFja19pcnEsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lKSwKKworCVRQX0FSR1MobmFtZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZygJbmFtZSwJbmFtZQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIG5hbWUpOworCSksCisKKwlUUF9wcmludGsoIiVzIiwgX19nZXRfc3RyKG5hbWUpKQorKTsKKworVFJBQ0VfRVZFTlQoc25kX3NvY19qYWNrX3JlcG9ydCwKKworCVRQX1BST1RPKHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIGludCBtYXNrLCBpbnQgdmFsKSwKKworCVRQX0FSR1MoamFjaywgbWFzaywgdmFsKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAkJamFjay0+amFjay0+bmFtZQkpCisJCV9fZmllbGQoCWludCwJCW1hc2sJCQkpCisJCV9fZmllbGQoCWludCwJCXZhbAkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBqYWNrLT5qYWNrLT5uYW1lKTsKKwkJX19lbnRyeS0+bWFzayA9IG1hc2s7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCisJVFBfcHJpbnRrKCJqYWNrPSVzICV4LyV4IiwgX19nZXRfc3RyKG5hbWUpLCAoaW50KV9fZW50cnktPnZhbCwKKwkJICAoaW50KV9fZW50cnktPm1hc2spCispOworCitUUkFDRV9FVkVOVChzbmRfc29jX2phY2tfbm90aWZ5LAorCisJVFBfUFJPVE8oc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywgaW50IHZhbCksCisKKwlUUF9BUkdTKGphY2ssIHZhbCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZygJbmFtZSwJCWphY2stPmphY2stPm5hbWUJKQorCQlfX2ZpZWxkKAlpbnQsCQl2YWwJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgamFjay0+amFjay0+bmFtZSk7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCisJVFBfcHJpbnRrKCJqYWNrPSVzICV4IiwgX19nZXRfc3RyKG5hbWUpLCAoaW50KV9fZW50cnktPnZhbCkKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfQVNPQ19IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKaW5kZXggZDhjZTI3OC4uYWJhNDIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCkBAIC0yMDYsMTUgKzIwNiwxNiBAQAogICogYmxvY2tfYmlvX2NvbXBsZXRlIC0gY29tcGxldGVkIGFsbCB3b3JrIG9uIHRoZSBibG9jayBvcGVyYXRpb24KICAqIEBxOiBxdWV1ZSBob2xkaW5nIHRoZSBibG9jayBvcGVyYXRpb24KICAqIEBiaW86IGJsb2NrIG9wZXJhdGlvbiBjb21wbGV0ZWQKKyAqIEBlcnJvcjogaW8gZXJyb3IgdmFsdWUKICAqCiAgKiBUaGlzIHRyYWNlcG9pbnQgaW5kaWNhdGVzIHRoZXJlIGlzIG5vIGZ1cnRoZXIgd29yayB0byBkbyBvbiB0aGlzCiAgKiBibG9jayBJTyBvcGVyYXRpb24gQGJpby4KICAqLwogVFJBQ0VfRVZFTlQoYmxvY2tfYmlvX2NvbXBsZXRlLAogCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKSwKIAotCVRQX0FSR1MocSwgYmlvKSwKKwlUUF9BUkdTKHEsIGJpbywgZXJyb3IpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCggZGV2X3QsCQlkZXYJCSkKQEAgLTIyOCw2ICsyMjksNyBAQAogCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CiAJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKIAkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCV9fZW50cnktPmVycm9yCQk9IGVycm9yOwogCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CiAJKSwKIApAQCAtNDg2LDE2ICs0ODgsMTYgQEAKICk7CiAKIC8qKgotICogYmxvY2tfcmVtYXAgLSBtYXAgcmVxdWVzdCBmb3IgYSBwYXJ0aXRpb24gdG8gdGhlIHJhdyBkZXZpY2UKKyAqIGJsb2NrX2Jpb19yZW1hcCAtIG1hcCByZXF1ZXN0IGZvciBhIGxvZ2ljYWwgZGV2aWNlIHRvIHRoZSByYXcgZGV2aWNlCiAgKiBAcTogcXVldWUgaG9sZGluZyB0aGUgb3BlcmF0aW9uCiAgKiBAYmlvOiByZXZpc2VkIG9wZXJhdGlvbgogICogQGRldjogZGV2aWNlIGZvciB0aGUgb3BlcmF0aW9uCiAgKiBAZnJvbTogb3JpZ2luYWwgc2VjdG9yIGZvciB0aGUgb3BlcmF0aW9uCiAgKgotICogQW4gb3BlcmF0aW9uIGZvciBhIHBhcnRpdGlvbiBvbiBhIGJsb2NrIGRldmljZSBoYXMgYmVlbiBtYXBwZWQgdG8gdGhlCisgKiBBbiBvcGVyYXRpb24gZm9yIGEgbG9naWNhbCBkZXZpY2UgaGFzIGJlZW4gbWFwcGVkIHRvIHRoZQogICogcmF3IGJsb2NrIGRldmljZS4KICAqLwotVFJBQ0VfRVZFTlQoYmxvY2tfcmVtYXAsCitUUkFDRV9FVkVOVChibG9ja19iaW9fcmVtYXAsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBkZXZfdCBkZXYsCiAJCSBzZWN0b3JfdCBmcm9tKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NvbXBhY3Rpb24uaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NvbXBhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODhiY2RkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvY29tcGFjdGlvbi5oCkBAIC0wLDAgKzEsNzQgQEAKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGNvbXBhY3Rpb24KKworI2lmICFkZWZpbmVkKF9UUkFDRV9DT01QQUNUSU9OX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9DT01QQUNUSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgImdmcGZsYWdzLmgiCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MobW1fY29tcGFjdGlvbl9pc29sYXRlX3RlbXBsYXRlLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBucl9zY2FubmVkLAorCQl1bnNpZ25lZCBsb25nIG5yX3Rha2VuKSwKKworCVRQX0FSR1MobnJfc2Nhbm5lZCwgbnJfdGFrZW4pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9zY2FubmVkKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG5yX3Rha2VuKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bnJfc2Nhbm5lZCA9IG5yX3NjYW5uZWQ7CisJCV9fZW50cnktPm5yX3Rha2VuID0gbnJfdGFrZW47CisJKSwKKworCVRQX3ByaW50aygibnJfc2Nhbm5lZD0lbHUgbnJfdGFrZW49JWx1IiwKKwkJX19lbnRyeS0+bnJfc2Nhbm5lZCwKKwkJX19lbnRyeS0+bnJfdGFrZW4pCispOworCitERUZJTkVfRVZFTlQobW1fY29tcGFjdGlvbl9pc29sYXRlX3RlbXBsYXRlLCBtbV9jb21wYWN0aW9uX2lzb2xhdGVfbWlncmF0ZXBhZ2VzLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBucl9zY2FubmVkLAorCQl1bnNpZ25lZCBsb25nIG5yX3Rha2VuKSwKKworCVRQX0FSR1MobnJfc2Nhbm5lZCwgbnJfdGFrZW4pCispOworCitERUZJTkVfRVZFTlQobW1fY29tcGFjdGlvbl9pc29sYXRlX3RlbXBsYXRlLCBtbV9jb21wYWN0aW9uX2lzb2xhdGVfZnJlZXBhZ2VzLAorCVRQX1BST1RPKHVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZCwKKwkJdW5zaWduZWQgbG9uZyBucl90YWtlbiksCisKKwlUUF9BUkdTKG5yX3NjYW5uZWQsIG5yX3Rha2VuKQorKTsKKworVFJBQ0VfRVZFTlQobW1fY29tcGFjdGlvbl9taWdyYXRlcGFnZXMsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIG5yX21pZ3JhdGVkLAorCQl1bnNpZ25lZCBsb25nIG5yX2ZhaWxlZCksCisKKwlUUF9BUkdTKG5yX21pZ3JhdGVkLCBucl9mYWlsZWQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9taWdyYXRlZCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9mYWlsZWQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5ucl9taWdyYXRlZCA9IG5yX21pZ3JhdGVkOworCQlfX2VudHJ5LT5ucl9mYWlsZWQgPSBucl9mYWlsZWQ7CisJKSwKKworCVRQX3ByaW50aygibnJfbWlncmF0ZWQ9JWx1IG5yX2ZhaWxlZD0lbHUiLAorCQlfX2VudHJ5LT5ucl9taWdyYXRlZCwKKwkJX19lbnRyeS0+bnJfZmFpbGVkKQorKTsKKworCisjZW5kaWYgLyogX1RSQUNFX0NPTVBBQ1RJT05fSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2t2bS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMva3ZtLmgKaW5kZXggNmRkM2E1MS4uNDZlM2NkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMva3ZtLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMva3ZtLmgKQEAgLTYsNiArNiwzNiBAQAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0ga3ZtCiAKKyNkZWZpbmUgRVJTTih4KSB7IEtWTV9FWElUXyMjeCwgIktWTV9FWElUXyIgI3ggfQorCisjZGVmaW5lIGt2bV90cmFjZV9leGl0X3JlYXNvbgkJCQkJCVwKKwlFUlNOKFVOS05PV04pLCBFUlNOKEVYQ0VQVElPTiksIEVSU04oSU8pLCBFUlNOKEhZUEVSQ0FMTCksCVwKKwlFUlNOKERFQlVHKSwgRVJTTihITFQpLCBFUlNOKE1NSU8pLCBFUlNOKElSUV9XSU5ET1dfT1BFTiksCVwKKwlFUlNOKFNIVVRET1dOKSwgRVJTTihGQUlMX0VOVFJZKSwgRVJTTihJTlRSKSwgRVJTTihTRVRfVFBSKSwJXAorCUVSU04oVFBSX0FDQ0VTUyksIEVSU04oUzM5MF9TSUVJQyksIEVSU04oUzM5MF9SRVNFVCksIEVSU04oRENSKSxcCisJRVJTTihOTUkpLCBFUlNOKElOVEVSTkFMX0VSUk9SKSwgRVJTTihPU0kpCisKK1RSQUNFX0VWRU5UKGt2bV91c2Vyc3BhY2VfZXhpdCwKKwkgICAgVFBfUFJPVE8oX191MzIgcmVhc29uLCBpbnQgZXJybm8pLAorCSAgICBUUF9BUkdTKHJlYXNvbiwgZXJybm8pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJX191MzIsCQlyZWFzb24JCSkKKwkJX19maWVsZCgJaW50LAkJZXJybm8JCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnJlYXNvbgkJPSByZWFzb247CisJCV9fZW50cnktPmVycm5vCQk9IGVycm5vOworCSksCisKKwlUUF9wcmludGsoInJlYXNvbiAlcyAoJWQpIiwKKwkJICBfX2VudHJ5LT5lcnJubyA8IDAgPworCQkgIChfX2VudHJ5LT5lcnJubyA9PSAtRUlOVFIgPyAicmVzdGFydCIgOiAiZXJyb3IiKSA6CisJCSAgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5yZWFzb24sIGt2bV90cmFjZV9leGl0X3JlYXNvbiksCisJCSAgX19lbnRyeS0+ZXJybm8gPCAwID8gLV9fZW50cnktPmVycm5vIDogX19lbnRyeS0+cmVhc29uKQorKTsKKwogI2lmIGRlZmluZWQoX19LVk1fSEFWRV9JT0FQSUMpCiBUUkFDRV9FVkVOVChrdm1fc2V0X2lycSwKIAlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgZ3NpLCBpbnQgbGV2ZWwsIGludCBpcnFfc291cmNlX2lkKSwKQEAgLTE4NSw2ICsyMTUsOTcgQEAKIAkJICBfX2VudHJ5LT5yZWZlcmVuY2VkID8gIllPVU5HIiA6ICJPTEQiKQogKTsKIAorI2lmZGVmIENPTkZJR19LVk1fQVNZTkNfUEYKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moa3ZtX2FzeW5jX2dldF9wYWdlX2NsYXNzLAorCisJVFBfUFJPVE8odTY0IGd2YSwgdTY0IGdmbiksCisKKwlUUF9BUkdTKGd2YSwgZ2ZuKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoX191NjQsIGd2YSkKKwkJX19maWVsZCh1NjQsIGdmbikKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmd2YSA9IGd2YTsKKwkJX19lbnRyeS0+Z2ZuID0gZ2ZuOworCSksCisKKwlUUF9wcmludGsoImd2YSA9ICUjbGx4LCBnZm4gPSAlI2xseCIsIF9fZW50cnktPmd2YSwgX19lbnRyeS0+Z2ZuKQorKTsKKworREVGSU5FX0VWRU5UKGt2bV9hc3luY19nZXRfcGFnZV9jbGFzcywga3ZtX3RyeV9hc3luY19nZXRfcGFnZSwKKworCVRQX1BST1RPKHU2NCBndmEsIHU2NCBnZm4pLAorCisJVFBfQVJHUyhndmEsIGdmbikKKyk7CisKK0RFRklORV9FVkVOVChrdm1fYXN5bmNfZ2V0X3BhZ2VfY2xhc3MsIGt2bV9hc3luY19wZl9kb3VibGVmYXVsdCwKKworCVRQX1BST1RPKHU2NCBndmEsIHU2NCBnZm4pLAorCisJVFBfQVJHUyhndmEsIGdmbikKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1Moa3ZtX2FzeW5jX3BmX25vcHJlc2VudF9yZWFkeSwKKworCVRQX1BST1RPKHU2NCB0b2tlbiwgdTY0IGd2YSksCisKKwlUUF9BUkdTKHRva2VuLCBndmEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChfX3U2NCwgdG9rZW4pCisJCV9fZmllbGQoX191NjQsIGd2YSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnRva2VuID0gdG9rZW47CisJCV9fZW50cnktPmd2YSA9IGd2YTsKKwkpLAorCisJVFBfcHJpbnRrKCJ0b2tlbiAlI2xseCBndmEgJSNsbHgiLCBfX2VudHJ5LT50b2tlbiwgX19lbnRyeS0+Z3ZhKQorCispOworCitERUZJTkVfRVZFTlQoa3ZtX2FzeW5jX3BmX25vcHJlc2VudF9yZWFkeSwga3ZtX2FzeW5jX3BmX25vdF9wcmVzZW50LAorCisJVFBfUFJPVE8odTY0IHRva2VuLCB1NjQgZ3ZhKSwKKworCVRQX0FSR1ModG9rZW4sIGd2YSkKKyk7CisKK0RFRklORV9FVkVOVChrdm1fYXN5bmNfcGZfbm9wcmVzZW50X3JlYWR5LCBrdm1fYXN5bmNfcGZfcmVhZHksCisKKwlUUF9QUk9UTyh1NjQgdG9rZW4sIHU2NCBndmEpLAorCisJVFBfQVJHUyh0b2tlbiwgZ3ZhKQorKTsKKworVFJBQ0VfRVZFTlQoCisJa3ZtX2FzeW5jX3BmX2NvbXBsZXRlZCwKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgZ3ZhKSwKKwlUUF9BUkdTKGFkZHJlc3MsIHBhZ2UsIGd2YSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGFkZHJlc3MpCisJCV9fZmllbGQocGZuX3QsIHBmbikKKwkJX19maWVsZCh1NjQsIGd2YSkKKwkJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5hZGRyZXNzID0gYWRkcmVzczsKKwkJX19lbnRyeS0+cGZuID0gcGFnZSA/IHBhZ2VfdG9fcGZuKHBhZ2UpIDogMDsKKwkJX19lbnRyeS0+Z3ZhID0gZ3ZhOworCQkpLAorCisJVFBfcHJpbnRrKCJndmEgJSNsbHggYWRkcmVzcyAlI2x4IHBmbiAlI2xseCIsICBfX2VudHJ5LT5ndmEsCisJCSAgX19lbnRyeS0+YWRkcmVzcywgX19lbnRyeS0+cGZuKQorKTsKKworI2VuZGlmCisKICNlbmRpZiAvKiBfVFJBQ0VfS1ZNX01BSU5fSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3JlZ3VsYXRvci5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcmVndWxhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1MDJhNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3JlZ3VsYXRvci5oCkBAIC0wLDAgKzEsMTQxIEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSByZWd1bGF0b3IKKworI2lmICFkZWZpbmVkKF9UUkFDRV9SRUdVTEFUT1JfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1JFR1VMQVRPUl9ICisKKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworLyoKKyAqIEV2ZW50cyB3aGljaCBqdXN0IGxvZyB0aGVtc2VsdmVzIGFuZCB0aGUgcmVndWxhdG9yIG5hbWUgZm9yIGVuYWJsZS9kaXNhYmxlCisgKiB0eXBlIHRyYWNraW5nLgorICovCitERUNMQVJFX0VWRU5UX0NMQVNTKHJlZ3VsYXRvcl9iYXNpYywKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUpLAorCisJVFBfQVJHUyhuYW1lKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAluYW1lCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBuYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCJuYW1lPSVzIiwgX19nZXRfc3RyKG5hbWUpKQorCispOworCitERUZJTkVfRVZFTlQocmVndWxhdG9yX2Jhc2ljLCByZWd1bGF0b3JfZW5hYmxlLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSksCisKKwlUUF9BUkdTKG5hbWUpCisKKyk7CisKK0RFRklORV9FVkVOVChyZWd1bGF0b3JfYmFzaWMsIHJlZ3VsYXRvcl9lbmFibGVfZGVsYXksCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lKSwKKworCVRQX0FSR1MobmFtZSkKKworKTsKKworREVGSU5FX0VWRU5UKHJlZ3VsYXRvcl9iYXNpYywgcmVndWxhdG9yX2VuYWJsZV9jb21wbGV0ZSwKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUpLAorCisJVFBfQVJHUyhuYW1lKQorCispOworCitERUZJTkVfRVZFTlQocmVndWxhdG9yX2Jhc2ljLCByZWd1bGF0b3JfZGlzYWJsZSwKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUpLAorCisJVFBfQVJHUyhuYW1lKQorCispOworCitERUZJTkVfRVZFTlQocmVndWxhdG9yX2Jhc2ljLCByZWd1bGF0b3JfZGlzYWJsZV9jb21wbGV0ZSwKKworCVRQX1BST1RPKGNvbnN0IGNoYXIgKm5hbWUpLAorCisJVFBfQVJHUyhuYW1lKQorCispOworCisvKgorICogRXZlbnRzIHRoYXQgdGFrZSBhIHJhbmdlIG9mIG51bWVyaWNhbCB2YWx1ZXMsIG1vc3RseSBmb3Igdm9sdGFnZXMKKyAqIGFuZCBzbyBvbi4KKyAqLworREVDTEFSRV9FVkVOVF9DTEFTUyhyZWd1bGF0b3JfcmFuZ2UsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSwKKworCVRQX0FSR1MobmFtZSwgbWluLCBtYXgpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCQluYW1lCQkpCisJCV9fZmllbGQoICAgICAgICBpbnQsICAgICAgICAgICAgbWluICAgICAgICAgICAgICkKKwkJX19maWVsZCggICAgICAgIGludCwgICAgICAgICAgICBtYXggICAgICAgICAgICAgKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG5hbWUsIG5hbWUpOworCQlfX2VudHJ5LT5taW4gID0gbWluOworCQlfX2VudHJ5LT5tYXggID0gbWF4OworCSksCisKKwlUUF9wcmludGsoIm5hbWU9JXMgKCVkLSVkKSIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICAoaW50KV9fZW50cnktPm1pbiwgKGludClfX2VudHJ5LT5tYXgpCispOworCitERUZJTkVfRVZFTlQocmVndWxhdG9yX3JhbmdlLCByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSwKKworCVRQX0FSR1MobmFtZSwgbWluLCBtYXgpCisKKyk7CisKKworLyoKKyAqIEV2ZW50cyB0aGF0IHRha2UgYSBzaW5nbGUgdmFsdWUsIG1vc3RseSBmb3IgcmVhZGJhY2sgYW5kIHJlZmNvdW50cy4KKyAqLworREVDTEFSRV9FVkVOVF9DTEFTUyhyZWd1bGF0b3JfdmFsdWUsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1MobmFtZSwgdmFsKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAkJbmFtZQkJKQorCQlfX2ZpZWxkKCAgICAgICAgdW5zaWduZWQgaW50LCAgIHZhbCAgICAgICAgICAgICApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgbmFtZSk7CisJCV9fZW50cnktPnZhbCAgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygibmFtZT0lcywgdmFsPSV1IiwgX19nZXRfc3RyKG5hbWUpLAorCQkgIChpbnQpX19lbnRyeS0+dmFsKQorKTsKKworREVGSU5FX0VWRU5UKHJlZ3VsYXRvcl92YWx1ZSwgcmVndWxhdG9yX3NldF92b2x0YWdlX2NvbXBsZXRlLAorCisJVFBfUFJPVE8oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHZhbHVlKSwKKworCVRQX0FSR1MobmFtZSwgdmFsdWUpCisKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfUE9XRVJfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NrYi5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmgKaW5kZXggNzVjZTlkNS4uZjEwMjkzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmgKQEAgLTI1LDkgKzI1LDcgQEAKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlfX2VudHJ5LT5za2JhZGRyID0gc2tiOwotCQlpZiAoc2tiKSB7Ci0JCQlfX2VudHJ5LT5wcm90b2NvbCA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOwotCQl9CisJCV9fZW50cnktPnByb3RvY29sID0gbnRvaHMoc2tiLT5wcm90b2NvbCk7CiAJCV9fZW50cnktPmxvY2F0aW9uID0gbG9jYXRpb247CiAJKSwKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCBjMjU1ZmNjLi5lYTQyMmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtMjUsMTMgKzI1LDEzIEBACiAKICNkZWZpbmUgdHJhY2VfcmVjbGFpbV9mbGFncyhwYWdlLCBzeW5jKSAoIFwKIAkocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpID8gUkVDTEFJTV9XQl9GSUxFIDogUkVDTEFJTV9XQl9BTk9OKSB8IFwKLQkoc3luYyA9PSBMVU1QWV9NT0RFX1NZTkMgPyBSRUNMQUlNX1dCX1NZTkMgOiBSRUNMQUlNX1dCX0FTWU5DKSAgIFwKKwkoc3luYyAmIFJFQ0xBSU1fTU9ERV9TWU5DID8gUkVDTEFJTV9XQl9TWU5DIDogUkVDTEFJTV9XQl9BU1lOQykgICBcCiAJKQogCiAjZGVmaW5lIHRyYWNlX3Nocmlua19mbGFncyhmaWxlLCBzeW5jKSAoIFwKLQkoc3luYyA9PSBMVU1QWV9NT0RFX1NZTkMgPyBSRUNMQUlNX1dCX01JWEVEIDogXAorCShzeW5jICYgUkVDTEFJTV9NT0RFX1NZTkMgPyBSRUNMQUlNX1dCX01JWEVEIDogXAogCQkJKGZpbGUgPyBSRUNMQUlNX1dCX0ZJTEUgOiBSRUNMQUlNX1dCX0FOT04pKSB8ICBcCi0JKHN5bmMgPT0gTFVNUFlfTU9ERV9TWU5DID8gUkVDTEFJTV9XQl9TWU5DIDogUkVDTEFJTV9XQl9BU1lOQykgXAorCShzeW5jICYgUkVDTEFJTV9NT0RFX1NZTkMgPyBSRUNMQUlNX1dCX1NZTkMgOiBSRUNMQUlNX1dCX0FTWU5DKSBcCiAJKQogCiBUUkFDRV9FVkVOVChtbV92bXNjYW5fa3N3YXBkX3NsZWVwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvd3JpdGViYWNrLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy93cml0ZWJhY2suaAppbmRleCA4OWEyYjJkLi40ZTI0OWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy93cml0ZWJhY2suaApAQCAtODEsNiArODEsNyBAQAogCVRQX0FSR1MoYmRpKSkKIAogREVGSU5FX1dSSVRFQkFDS19FVkVOVCh3cml0ZWJhY2tfbm93b3JrKTsKK0RFRklORV9XUklURUJBQ0tfRVZFTlQod3JpdGViYWNrX3dha2VfYmFja2dyb3VuZCk7CiBERUZJTkVfV1JJVEVCQUNLX0VWRU5UKHdyaXRlYmFja193YWtlX3RocmVhZCk7CiBERUZJTkVfV1JJVEVCQUNLX0VWRU5UKHdyaXRlYmFja193YWtlX2Zvcmtlcl90aHJlYWQpOwogREVGSU5FX1dSSVRFQkFDS19FVkVOVCh3cml0ZWJhY2tfYmRpX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dudGRldi5oIGIvaW5jbHVkZS94ZW4vZ250ZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyM2Y0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUveGVuL2dudGRldi5oCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbnRkZXYuaAorICogCisgKiBJbnRlcmZhY2UgdG8gL2Rldi94ZW4vZ250ZGV2LgorICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIEQgRyBNdXJyYXkKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc291cmNlIGZpbGUgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwKKyAqIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUFVCTElDX0dOVERFVl9IX18KKyNkZWZpbmUgX19MSU5VWF9QVUJMSUNfR05UREVWX0hfXworCitzdHJ1Y3QgaW9jdGxfZ250ZGV2X2dyYW50X3JlZiB7CisJLyogVGhlIGRvbWFpbiBJRCBvZiB0aGUgZ3JhbnQgdG8gYmUgbWFwcGVkLiAqLworCXVpbnQzMl90IGRvbWlkOworCS8qIFRoZSBncmFudCByZWZlcmVuY2Ugb2YgdGhlIGdyYW50IHRvIGJlIG1hcHBlZC4gKi8KKwl1aW50MzJfdCByZWY7Cit9OworCisvKgorICogSW5zZXJ0cyB0aGUgZ3JhbnQgcmVmZXJlbmNlcyBpbnRvIHRoZSBtYXBwaW5nIHRhYmxlIG9mIGFuIGluc3RhbmNlCisgKiBvZiBnbnRkZXYuIE4uQi4gVGhpcyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBtYXBwaW5nLCB3aGljaCBpcyBkZWZlcnJlZAorICogdW50aWwgbW1hcCgpIGlzIGNhbGxlZCB3aXRoIEBpbmRleCBhcyB0aGUgb2Zmc2V0LgorICovCisjZGVmaW5lIElPQ1RMX0dOVERFVl9NQVBfR1JBTlRfUkVGIFwKK19JT0MoX0lPQ19OT05FLCAnRycsIDAsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZ250ZGV2X21hcF9ncmFudF9yZWYpKQorc3RydWN0IGlvY3RsX2dudGRldl9tYXBfZ3JhbnRfcmVmIHsKKwkvKiBJTiBwYXJhbWV0ZXJzICovCisJLyogVGhlIG51bWJlciBvZiBncmFudHMgdG8gYmUgbWFwcGVkLiAqLworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IHBhZDsKKwkvKiBPVVQgcGFyYW1ldGVycyAqLworCS8qIFRoZSBvZmZzZXQgdG8gYmUgdXNlZCBvbiBhIHN1YnNlcXVlbnQgY2FsbCB0byBtbWFwKCkuICovCisJdWludDY0X3QgaW5kZXg7CisJLyogVmFyaWFibGUgSU4gcGFyYW1ldGVyLiAqLworCS8qIEFycmF5IG9mIGdyYW50IHJlZmVyZW5jZXMsIG9mIHNpemUgQGNvdW50LiAqLworCXN0cnVjdCBpb2N0bF9nbnRkZXZfZ3JhbnRfcmVmIHJlZnNbMV07Cit9OworCisvKgorICogUmVtb3ZlcyB0aGUgZ3JhbnQgcmVmZXJlbmNlcyBmcm9tIHRoZSBtYXBwaW5nIHRhYmxlIG9mIGFuIGluc3RhbmNlIG9mCisgKiBvZiBnbnRkZXYuIE4uQi4gbXVubWFwKCkgbXVzdCBiZSBjYWxsZWQgb24gdGhlIHJlbGV2YW50IHZpcnR1YWwgYWRkcmVzcyhlcykKKyAqIGJlZm9yZSB0aGlzIGlvY3RsIGlzIGNhbGxlZCwgb3IgYW4gZXJyb3Igd2lsbCByZXN1bHQuCisgKi8KKyNkZWZpbmUgSU9DVExfR05UREVWX1VOTUFQX0dSQU5UX1JFRiBcCitfSU9DKF9JT0NfTk9ORSwgJ0cnLCAxLCBzaXplb2Yoc3RydWN0IGlvY3RsX2dudGRldl91bm1hcF9ncmFudF9yZWYpKQorc3RydWN0IGlvY3RsX2dudGRldl91bm1hcF9ncmFudF9yZWYgeworCS8qIElOIHBhcmFtZXRlcnMgKi8KKwkvKiBUaGUgb2Zmc2V0IHdhcyByZXR1cm5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBtYXAgb3BlcmF0aW9uLiAqLworCXVpbnQ2NF90IGluZGV4OworCS8qIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gYmUgdW5tYXBwZWQuICovCisJdWludDMyX3QgY291bnQ7CisJdWludDMyX3QgcGFkOworfTsKKworLyoKKyAqIFJldHVybnMgdGhlIG9mZnNldCBpbiB0aGUgZHJpdmVyJ3MgYWRkcmVzcyBzcGFjZSB0aGF0IGNvcnJlc3BvbmRzCisgKiB0byBAdmFkZHIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhIG11bm1hcCgpLCBmb2xsb3dlZCBieSBhbgorICogVU5NQVBfR1JBTlRfUkVGIGlvY3RsLCB3aGVyZSBubyBzdGF0ZSBhYm91dCB0aGUgb2Zmc2V0IGlzIHJldGFpbmVkIGJ5CisgKiB0aGUgY2FsbGVyLiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSBhcworICogQHZhZGRyIGlzIHJldHVybmVkIGluIEBjb3VudC4KKyAqCisgKiBOLkIuIFdoZXJlIG1vcmUgdGhhbiBvbmUgcGFnZSBoYXMgYmVlbiBtYXBwZWQgaW50byBhIGNvbnRpZ3VvdXMgcmFuZ2UsIHRoZQorICogICAgICBzdXBwbGllZCBAdmFkZHIgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2U7IG90aGVyd2lzZQorICogICAgICBhbiBlcnJvciB3aWxsIHJlc3VsdC4gSXQgaXMgb25seSBwb3NzaWJsZSB0byBtdW5tYXAoKSB0aGUgZW50aXJlCisgKiAgICAgIGNvbnRpZ3VvdXNseS1hbGxvY2F0ZWQgcmFuZ2UgYXQgb25jZSwgYW5kIG5vdCBhbnkgc3VicmFuZ2UgdGhlcmVvZi4KKyAqLworI2RlZmluZSBJT0NUTF9HTlRERVZfR0VUX09GRlNFVF9GT1JfVkFERFIgXAorX0lPQyhfSU9DX05PTkUsICdHJywgMiwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9nbnRkZXZfZ2V0X29mZnNldF9mb3JfdmFkZHIpKQorc3RydWN0IGlvY3RsX2dudGRldl9nZXRfb2Zmc2V0X2Zvcl92YWRkciB7CisJLyogSU4gcGFyYW1ldGVycyAqLworCS8qIFRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1hcHBlZCBwYWdlIGluIGEgcmFuZ2UuICovCisJdWludDY0X3QgdmFkZHI7CisJLyogT1VUIHBhcmFtZXRlcnMgKi8KKwkvKiBUaGUgb2Zmc2V0IHRoYXQgd2FzIHVzZWQgaW4gdGhlIGluaXRpYWwgbW1hcCgpIG9wZXJhdGlvbi4gKi8KKwl1aW50NjRfdCBvZmZzZXQ7CisJLyogVGhlIG51bWJlciBvZiBwYWdlcyBtYXBwZWQgaW4gdGhlIFZNIGFyZWEgdGhhdCBiZWdpbnMgYXQgQHZhZGRyLiAqLworCXVpbnQzMl90IGNvdW50OworCXVpbnQzMl90IHBhZDsKK307CisKKy8qCisgKiBTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBncmFudHMgdGhhdCBtYXkgbWFwcGVkIGF0IG9uY2UgYnkgdGhpcyBnbnRkZXYKKyAqIGluc3RhbmNlLgorICoKKyAqIE4uQi4gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGlvY3RsIGlzIHBlcmZvcm1lZCBvbiB0aGUgZGV2aWNlLgorICovCisjZGVmaW5lIElPQ1RMX0dOVERFVl9TRVRfTUFYX0dSQU5UUyBcCitfSU9DKF9JT0NfTk9ORSwgJ0cnLCAzLCBzaXplb2Yoc3RydWN0IGlvY3RsX2dudGRldl9zZXRfbWF4X2dyYW50cykpCitzdHJ1Y3QgaW9jdGxfZ250ZGV2X3NldF9tYXhfZ3JhbnRzIHsKKwkvKiBJTiBwYXJhbWV0ZXIgKi8KKwkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZ3JhbnRzIHRoYXQgbWF5IGJlIG1hcHBlZCBhdCBvbmNlLiAqLworCXVpbnQzMl90IGNvdW50OworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfUFVCTElDX0dOVERFVl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmggYi9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5oCmluZGV4IDlhNzMxNzAuLmIxZmFiNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2dyYW50X3RhYmxlLmgKKysrIGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaApAQCAtMzcsMTAgKzM3LDE2IEBACiAjaWZuZGVmIF9fQVNNX0dOVFRBQl9IX18KICNkZWZpbmUgX19BU01fR05UVEFCX0hfXwogCi0jaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9ncmFudF90YWJsZS5oPgorCisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9ncmFudF90YWJsZS5oPgogCisjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CisKIC8qIE5SX0dSQU5UX0ZSQU1FUyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGF0IGNvbmZpZ3VyZWQgaW4gWGVuICovCiAjZGVmaW5lIE5SX0dSQU5UX0ZSQU1FUyA0CiAKQEAgLTEwNyw2ICsxMTMsMzcgQEAKIHZvaWQgZ250dGFiX2dyYW50X2ZvcmVpZ25fdHJhbnNmZXJfcmVmKGdyYW50X3JlZl90LCBkb21pZF90IGRvbWlkLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ250dGFiX3NldF9tYXBfb3Aoc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmICptYXAsIHBoeXNfYWRkcl90IGFkZHIsCisJCSAgdWludDMyX3QgZmxhZ3MsIGdyYW50X3JlZl90IHJlZiwgZG9taWRfdCBkb21pZCkKK3sKKwlpZiAoZmxhZ3MgJiBHTlRNQVBfY29udGFpbnNfcHRlKQorCQltYXAtPmhvc3RfYWRkciA9IGFkZHI7CisJZWxzZSBpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCisJCW1hcC0+aG9zdF9hZGRyID0gX19wYShhZGRyKTsKKwllbHNlCisJCW1hcC0+aG9zdF9hZGRyID0gYWRkcjsKKworCW1hcC0+ZmxhZ3MgPSBmbGFnczsKKwltYXAtPnJlZiA9IHJlZjsKKwltYXAtPmRvbSA9IGRvbWlkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dudHRhYl9zZXRfdW5tYXBfb3Aoc3RydWN0IGdudHRhYl91bm1hcF9ncmFudF9yZWYgKnVubWFwLCBwaHlzX2FkZHJfdCBhZGRyLAorCQkgICAgdWludDMyX3QgZmxhZ3MsIGdyYW50X2hhbmRsZV90IGhhbmRsZSkKK3sKKwlpZiAoZmxhZ3MgJiBHTlRNQVBfY29udGFpbnNfcHRlKQorCQl1bm1hcC0+aG9zdF9hZGRyID0gYWRkcjsKKwllbHNlIGlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKKwkJdW5tYXAtPmhvc3RfYWRkciA9IF9fcGEoYWRkcik7CisJZWxzZQorCQl1bm1hcC0+aG9zdF9hZGRyID0gYWRkcjsKKworCXVubWFwLT5oYW5kbGUgPSBoYW5kbGU7CisJdW5tYXAtPmRldl9idXNfYWRkciA9IDA7Cit9CisKIGludCBhcmNoX2dudHRhYl9tYXBfc2hhcmVkKHVuc2lnbmVkIGxvbmcgKmZyYW1lcywgdW5zaWduZWQgbG9uZyBucl9nZnJhbWVzLAogCQkJICAgdW5zaWduZWQgbG9uZyBtYXhfbnJfZ2ZyYW1lcywKIAkJCSAgIHN0cnVjdCBncmFudF9lbnRyeSAqKl9fc2hhcmVkKTsKQEAgLTExOCw0ICsxNTUsOSBAQAogCiAjZGVmaW5lIGdudHRhYl9tYXBfdmFkZHIobWFwKSAoKHZvaWQgKikobWFwLmhvc3RfdmlydF9hZGRyKSkKIAoraW50IGdudHRhYl9tYXBfcmVmcyhzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgKm1hcF9vcHMsCisJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgY291bnQpOworaW50IGdudHRhYl91bm1hcF9yZWZzKHN0cnVjdCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmICp1bm1hcF9vcHMsCisJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBjb3VudCk7CisKICNlbmRpZiAvKiBfX0FTTV9HTlRUQUJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IDQzZTJkN2QuLjdhMWQxNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC05NCw3ICs5NCw3IEBACiAJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KTsKIAlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludCAoKnJlc3VtZSkoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7Ci0JaW50ICgqdWV2ZW50KShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqLCBjaGFyICoqLCBpbnQsIGNoYXIgKiwgaW50KTsKKwlpbnQgKCp1ZXZlbnQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICosIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogCWludCAoKnJlYWRfb3RoZXJlbmRfZGV0YWlscykoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7CiAJaW50ICgqaXNfcmVhZHkpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDhkZmQwOTQuLjRmNmNkYmYgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTEzMCwxMyArMTMwLDE2IEBACiBjb25maWcgSEFWRV9LRVJORUxfTFpNQQogCWJvb2wKIAorY29uZmlnIEhBVkVfS0VSTkVMX1haCisJYm9vbAorCiBjb25maWcgSEFWRV9LRVJORUxfTFpPCiAJYm9vbAogCiBjaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBjb21wcmVzc2lvbiBtb2RlIgogCWRlZmF1bHQgS0VSTkVMX0daSVAKLQlkZXBlbmRzIG9uIEhBVkVfS0VSTkVMX0daSVAgfHwgSEFWRV9LRVJORUxfQlpJUDIgfHwgSEFWRV9LRVJORUxfTFpNQSB8fCBIQVZFX0tFUk5FTF9MWk8KKwlkZXBlbmRzIG9uIEhBVkVfS0VSTkVMX0daSVAgfHwgSEFWRV9LRVJORUxfQlpJUDIgfHwgSEFWRV9LRVJORUxfTFpNQSB8fCBIQVZFX0tFUk5FTF9YWiB8fCBIQVZFX0tFUk5FTF9MWk8KIAloZWxwCiAJICBUaGUgbGludXgga2VybmVsIGlzIGEga2luZCBvZiBzZWxmLWV4dHJhY3RpbmcgZXhlY3V0YWJsZS4KIAkgIFNldmVyYWwgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhcmUgYXZhaWxhYmxlLCB3aGljaCBkaWZmZXIKQEAgLTE4MSw2ICsxODQsMjEgQEAKIAkgIHR3by4gQ29tcHJlc3Npb24gaXMgc2xvd2VzdC4JVGhlIGtlcm5lbCBzaXplIGlzIGFib3V0IDMzJQogCSAgc21hbGxlciB3aXRoIExaTUEgaW4gY29tcGFyaXNvbiB0byBnemlwLgogCitjb25maWcgS0VSTkVMX1haCisJYm9vbCAiWFoiCisJZGVwZW5kcyBvbiBIQVZFX0tFUk5FTF9YWgorCWhlbHAKKwkgIFhaIHVzZXMgdGhlIExaTUEyIGFsZ29yaXRobSBhbmQgaW5zdHJ1Y3Rpb24gc2V0IHNwZWNpZmljCisJICBCQ0ogZmlsdGVycyB3aGljaCBjYW4gaW1wcm92ZSBjb21wcmVzc2lvbiByYXRpbyBvZiBleGVjdXRhYmxlCisJICBjb2RlLiBUaGUgc2l6ZSBvZiB0aGUga2VybmVsIGlzIGFib3V0IDMwJSBzbWFsbGVyIHdpdGggWFogaW4KKwkgIGNvbXBhcmlzb24gdG8gZ3ppcC4gT24gYXJjaGl0ZWN0dXJlcyBmb3Igd2hpY2ggdGhlcmUgaXMgYSBCQ0oKKwkgIGZpbHRlciAoaTM4NiwgeDg2XzY0LCBBUk0sIElBLTY0LCBQb3dlclBDLCBhbmQgU1BBUkMpLCBYWgorCSAgd2lsbCBjcmVhdGUgYSBmZXcgcGVyY2VudCBzbWFsbGVyIGtlcm5lbCB0aGFuIHBsYWluIExaTUEuCisKKwkgIFRoZSBzcGVlZCBpcyBhYm91dCB0aGUgc2FtZSBhcyB3aXRoIExaTUE6IFRoZSBkZWNvbXByZXNzaW9uCisJICBzcGVlZCBvZiBYWiBpcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIGJ6aXAyIGJ1dCB3b3JzZSB0aGFuIGd6aXAKKwkgIGFuZCBMWk8uIENvbXByZXNzaW9uIGlzIHNsb3cuCisKIGNvbmZpZyBLRVJORUxfTFpPCiAJYm9vbCAiTFpPIgogCWRlcGVuZHMgb24gSEFWRV9LRVJORUxfTFpPCkBAIC02NzMsNyArNjkxLDcgQEAKIAloZWxwCiAJICBNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlciBTd2FwIEV4dGVuc2lvbiBjb21lcyB3aXRoIGl0cyBwcmljZSBpbgogCSAgYSBiaWdnZXIgbWVtb3J5IGNvbnN1bXB0aW9uLiBHZW5lcmFsIHB1cnBvc2UgZGlzdHJpYnV0aW9uIGtlcm5lbHMKLQkgIHdoaWNoIHdhbnQgdG8gZW5hYmxlIHRoZSBmZWF1dHJlIGJ1dCBrZWVwIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQKKwkgIHdoaWNoIHdhbnQgdG8gZW5hYmxlIHRoZSBmZWF0dXJlIGJ1dCBrZWVwIGl0IGRpc2FibGVkIGJ5IGRlZmF1bHQKIAkgIGFuZCBsZXQgdGhlIHVzZXIgZW5hYmxlIGl0IGJ5IHN3YXBhY2NvdW50IGJvb3QgY29tbWFuZCBsaW5lCiAJICBwYXJhbWV0ZXIgc2hvdWxkIGhhdmUgdGhpcyBvcHRpb24gdW5zZWxlY3RlZC4KIAkgIEZvciB0aG9zZSB3aG8gd2FudCB0byBoYXZlIHRoZSBmZWF0dXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBzaG91bGQKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCAwYjVmZjA4Li4zNTNkM2ZlIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC00Myw3ICs0Myw3IEBACiBvYmotJChDT05GSUdfREVCVUdfUlRfTVVURVhFUykgKz0gcnRtdXRleC1kZWJ1Zy5vCiBvYmotJChDT05GSUdfUlRfTVVURVhfVEVTVEVSKSArPSBydG11dGV4LXRlc3Rlci5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JU0FfRE1BKSArPSBkbWEubwotb2JqLSQoQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTKSArPSBzbXAubworb2JqLSQoQ09ORklHX1NNUCkgKz0gc21wLm8KIGlmbmVxICgkKENPTkZJR19TTVApLHkpCiBvYmoteSArPSB1cC5vCiBlbmRpZgpAQCAtMTAwLDYgKzEwMCw3IEBACiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2UvCiBvYmotJChDT05GSUdfWDg2X0RTKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19SSU5HX0JVRkZFUikgKz0gdHJhY2UvCitvYmotJChDT05GSUdfVFJBQ0VQT0lOVFMpICs9IHRyYWNlLwogb2JqLSQoQ09ORklHX1NNUCkgKz0gc2NoZWRfY3B1cHJpLm8KIG9iai0kKENPTkZJR19JUlFfV09SSykgKz0gaXJxX3dvcmsubwogb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKSArPSBwZXJmX2V2ZW50Lm8KQEAgLTEyMSw3ICsxMjIsNyBAQAogIyBjb25maWdfZGF0YS5oIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIGlrY29uZmlnLmggYnV0IGd6aXBwZWQuCiAjIEluZm8gZnJvbSBjb25maWdfZGF0YSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gL3Byb2MvY29uZmlnKgogdGFyZ2V0cyArPSBjb25maWdfZGF0YS5negotJChvYmopL2NvbmZpZ19kYXRhLmd6OiAuY29uZmlnIEZPUkNFCiskKG9iaikvY29uZmlnX2RhdGEuZ3o6ICQoS0NPTkZJR19DT05GSUcpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIAogcXVpZXRfY21kX2lrY29uZmlnZ3ogPSBJS0NGRyAgICRACmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuYyBiL2tlcm5lbC9hdWRpdC5jCmluZGV4IDc3NzcwYTAuLmU0OTU2MjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5jCisrKyBiL2tlcm5lbC9hdWRpdC5jCkBAIC00MDAsNyArNDAwLDcgQEAKIAlpZiAoZXJyIDwgMCkgewogCQlCVUdfT04oZXJyICE9IC1FQ09OTlJFRlVTRUQpOyAvKiBTaG91bGRuJ3QgaGFwcGVuICovCiAJCXByaW50ayhLRVJOX0VSUiAiYXVkaXQ6ICpOTyogZGFlbW9uIGF0IGF1ZGl0X3BpZD0lZFxuIiwgYXVkaXRfcGlkKTsKLQkJYXVkaXRfbG9nX2xvc3QoImF1ZGl0ZCBkaXNzYXBlYXJlZFxuIik7CisJCWF1ZGl0X2xvZ19sb3N0KCJhdWRpdGQgZGlzYXBwZWFyZWRcbiIpOwogCQlhdWRpdF9waWQgPSAwOwogCQkvKiB3ZSBtaWdodCBnZXQgbHVja3kgYW5kIGdldCB0aGlzIGluIHRoZSBuZXh0IGF1ZGl0ZCAqLwogCQlhdWRpdF9ob2xkX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDUxY2RkYzEuLmIyNGQ3MDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTc2Myw5ICs3NjMsOCBAQAogICogLT4gY2dyb3VwX21rZGlyLgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjZ3JvdXBfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CiBzdGF0aWMgaW50IGNncm91cF9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2dyb3VwX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogc3RhdGljIGludCBjZ3JvdXBfcm1kaXIoc3RydWN0IGlub2RlICp1bnVzZWRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogc3RhdGljIGludCBjZ3JvdXBfcG9wdWxhdGVfZGlyKHN0cnVjdCBjZ3JvdXAgKmNncnApOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNncm91cF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTg2Miw2ICs4NjEsMTEgQEAKIAlpcHV0KGlub2RlKTsKIH0KIAorc3RhdGljIGludCBjZ3JvdXBfZGVsZXRlKGNvbnN0IHN0cnVjdCBkZW50cnkgKmQpCit7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyB2b2lkIHJlbW92ZV9kaXIoc3RydWN0IGRlbnRyeSAqZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0KGQtPmRfcGFyZW50KTsKQEAgLTkxMiw3ICs5MTYsNyBAQAogCiAJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKIAlzcGluX2xvY2soJnBhcmVudC0+ZF9sb2NrKTsKLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX2xvY2tfbmVzdGVkKCZkZW50cnktPmRfbG9jaywgREVOVFJZX0RfTE9DS19ORVNURUQpOwogCWxpc3RfZGVsX2luaXQoJmRlbnRyeS0+ZF91LmRfY2hpbGQpOwogCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJc3Bpbl91bmxvY2soJnBhcmVudC0+ZF9sb2NrKTsKQEAgLTE0NTEsNiArMTQ1NSwxMSBAQAogCiBzdGF0aWMgaW50IGNncm91cF9nZXRfcm9vdGRpcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY2dyb3VwX2RvcHMgPSB7CisJCS5kX2lwdXQgPSBjZ3JvdXBfZGlwdXQsCisJCS5kX2RlbGV0ZSA9IGNncm91cF9kZWxldGUsCisJfTsKKwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPQogCQljZ3JvdXBfbmV3X2lub2RlKFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1IsIHNiKTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CkBAIC0xNDY4LDYgKzE0NzcsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc2ItPnNfcm9vdCA9IGRlbnRyeTsKKwkvKiBmb3IgZXZlcnl0aGluZyBlbHNlIHdlIHdhbnQgLT5kX29wIHNldCAqLworCXNiLT5zX2Rfb3AgPSAmY2dyb3VwX2RvcHM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOTcsNiArMjIwOCwxNCBAQAogCS5yZW5hbWUgPSBjZ3JvdXBfcmVuYW1lLAogfTsKIAorc3RhdGljIHN0cnVjdCBkZW50cnkgKmNncm91cF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwlkX2FkZChkZW50cnksIE5VTEwpOworCXJldHVybiBOVUxMOworfQorCiAvKgogICogQ2hlY2sgaWYgYSBmaWxlIGlzIGEgY29udHJvbCBmaWxlCiAgKi8KQEAgLTIyMDcsMjYgKzIyMjYsNiBAQAogCXJldHVybiBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIH0KIAotc3RhdGljIGludCBjZ3JvdXBfZGVsZXRlX2RlbnRyeShjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjZ3JvdXBfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNncm91cF9kZW50cnlfb3BlcmF0aW9ucyA9IHsKLQkJLmRfZGVsZXRlID0gY2dyb3VwX2RlbGV0ZV9kZW50cnksCi0JCS5kX2lwdXQgPSBjZ3JvdXBfZGlwdXQsCi0JfTsKLQotCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBOQU1FX01BWCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Ci0JZF9zZXRfZF9vcChkZW50cnksICZjZ3JvdXBfZGVudHJ5X29wZXJhdGlvbnMpOwotCWRfYWRkKGRlbnRyeSwgTlVMTCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQgY2dyb3VwX2NyZWF0ZV9maWxlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgbW9kZV90IG1vZGUsCiAJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYwppbmRleCBhNmU3Mjk3Li5iZDNlOGUyIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jCkBAIC0yOTE0LDcgKzI5MTQsNyBAQAogCX0KIH0KIAotLyogSW50aWFsaXplIGtkYl9wcmludGYsIGJyZWFrcG9pbnQgdGFibGVzIGFuZCBrZGIgc3RhdGUgKi8KKy8qIEluaXRpYWxpemUga2RiX3ByaW50ZiwgYnJlYWtwb2ludCB0YWJsZXMgYW5kIGtkYiBzdGF0ZSAqLwogdm9pZCBfX2luaXQga2RiX2luaXQoaW50IGx2bCkKIHsKIAlzdGF0aWMgaW50IGtkYl9pbml0X2x2bCA9IEtEQl9OT1RfSU5JVElBTElaRUQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCA4OWM3NDg2Li5mOWE0NWViIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTk5NCw2ICs5OTQsMTUgQEAKIAlleGl0X2ZzKHRzayk7CiAJY2hlY2tfc3RhY2tfdXNhZ2UoKTsKIAlleGl0X3RocmVhZCgpOworCisJLyoKKwkgKiBGbHVzaCBpbmhlcml0ZWQgY291bnRlcnMgdG8gdGhlIHBhcmVudCAtIGJlZm9yZSB0aGUgcGFyZW50CisJICogZ2V0cyB3b2tlbiB1cCBieSBjaGlsZC1leGl0IG5vdGlmaWNhdGlvbnMuCisJICoKKwkgKiBiZWNhdXNlIG9mIGNncm91cCBtb2RlLCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2dyb3VwX2V4aXQoKQorCSAqLworCXBlcmZfZXZlbnRfZXhpdF90YXNrKHRzayk7CisKIAljZ3JvdXBfZXhpdCh0c2ssIDEpOwogCiAJaWYgKGdyb3VwX2RlYWQpCkBAIC0xMDA3LDExICsxMDE2LDYgQEAKIAkgKiBGSVhNRTogZG8gdGhhdCBvbmx5IHdoZW4gbmVlZGVkLCB1c2luZyBzY2hlZF9leGl0IHRyYWNlcG9pbnQKIAkgKi8KIAlmbHVzaF9wdHJhY2VfaHdfYnJlYWtwb2ludCh0c2spOwotCS8qCi0JICogRmx1c2ggaW5oZXJpdGVkIGNvdW50ZXJzIHRvIHRoZSBwYXJlbnQgLSBiZWZvcmUgdGhlIHBhcmVudAotCSAqIGdldHMgd29rZW4gdXAgYnkgY2hpbGQtZXhpdCBub3RpZmljYXRpb25zLgotCSAqLwotCXBlcmZfZXZlbnRfZXhpdF90YXNrKHRzayk7CiAKIAlleGl0X25vdGlmeSh0c2ssIGdyb3VwX2RlYWQpOwogI2lmZGVmIENPTkZJR19OVU1BCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCBkOWI0NGYyLi4yNWU0MjkxIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb3NpeC10aW1lcnMuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLXJldHVybi1ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L29vbS5oPgorI2luY2x1ZGUgPGxpbnV4L2todWdlcGFnZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KQEAgLTMzMCw2ICszMzEsOSBAQAogCXJldHZhbCA9IGtzbV9mb3JrKG1tLCBvbGRtbSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXQ7CisJcmV0dmFsID0ga2h1Z2VwYWdlZF9mb3JrKG1tLCBvbGRtbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CiAKIAlwcmV2ID0gTlVMTDsKIAlmb3IgKG1wbnQgPSBvbGRtbS0+bW1hcDsgbXBudDsgbXBudCA9IG1wbnQtPnZtX25leHQpIHsKQEAgLTUyOSw2ICs1MzMsOSBAQAogCW1tX2ZyZWVfcGdkKG1tKTsKIAlkZXN0cm95X2NvbnRleHQobW0pOwogCW1tdV9ub3RpZmllcl9tbV9kZXN0cm95KG1tKTsKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlWTV9CVUdfT04obW0tPnBtZF9odWdlX3B0ZSk7CisjZW5kaWYKIAlmcmVlX21tKG1tKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fbW1kcm9wKTsKQEAgLTU0Myw2ICs1NTAsNyBAQAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtbS0+bW1fdXNlcnMpKSB7CiAJCWV4aXRfYWlvKG1tKTsKIAkJa3NtX2V4aXQobW0pOworCQlraHVnZXBhZ2VkX2V4aXQobW0pOyAvKiBtdXN0IHJ1biBiZWZvcmUgZXhpdF9tbWFwICovCiAJCWV4aXRfbW1hcChtbSk7CiAJCXNldF9tbV9leGVfZmlsZShtbSwgTlVMTCk7CiAJCWlmICghbGlzdF9lbXB0eSgmbW0tPm1tbGlzdCkpIHsKQEAgLTY2OSw2ICs2NzcsMTAgQEAKIAltbS0+dG9rZW5fcHJpb3JpdHkgPSAwOwogCW1tLT5sYXN0X2ludGVydmFsID0gMDsKIAorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCW1tLT5wbWRfaHVnZV9wdGUgPSBOVUxMOworI2VuZGlmCisKIAlpZiAoIW1tX2luaXQobW0sIHRzaykpCiAJCWdvdG8gZmFpbF9ub21lbTsKIApAQCAtOTEwLDYgKzkyMiw3IEBACiAKIAlzaWctPm9vbV9hZGogPSBjdXJyZW50LT5zaWduYWwtPm9vbV9hZGo7CiAJc2lnLT5vb21fc2NvcmVfYWRqID0gY3VycmVudC0+c2lnbmFsLT5vb21fc2NvcmVfYWRqOworCXNpZy0+b29tX3Njb3JlX2Fkal9taW4gPSBjdXJyZW50LT5zaWduYWwtPm9vbV9zY29yZV9hZGpfbWluOwogCiAJbXV0ZXhfaW5pdCgmc2lnLT5jcmVkX2d1YXJkX211dGV4KTsKIApAQCAtMTQxMCwyMyArMTQyMyw2IEBACiAJfQogCiAJLyoKLQkgKiBXZSBob3BlIHRvIHJlY3ljbGUgdGhlc2UgZmxhZ3MgYWZ0ZXIgMi42LjI2Ci0JICovCi0JaWYgKHVubGlrZWx5KGNsb25lX2ZsYWdzICYgQ0xPTkVfU1RPUFBFRCkpIHsKLQkJc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGNvdW50ID0gMTAwOwotCi0JCWlmIChjb3VudCA+IDAgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCQljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07Ci0KLQkJCWNvdW50LS07Ci0JCQlwcmludGsoS0VSTl9JTkZPICJmb3JrKCk6IHByb2Nlc3MgYCVzJyB1c2VkIGRlcHJlY2F0ZWQgIgotCQkJCQkiY2xvbmUgZmxhZ3MgMHglbHhcbiIsCi0JCQkJZ2V0X3Rhc2tfY29tbShjb21tLCBjdXJyZW50KSwKLQkJCQljbG9uZV9mbGFncyAmIENMT05FX1NUT1BQRUQpOwotCQl9Ci0JfQotCi0JLyoKIAkgKiBXaGVuIGNhbGxlZCBmcm9tIGtlcm5lbF90aHJlYWQsIGRvbid0IGRvIHVzZXIgdHJhY2luZyBzdHVmZi4KIAkgKi8KIAlpZiAobGlrZWx5KHVzZXJfbW9kZShyZWdzKSkpCkBAIC0xNDY0LDE2ICsxNDYwLDcgQEAKIAkJICovCiAJCXAtPmZsYWdzICY9IH5QRl9TVEFSVElORzsKIAotCQlpZiAodW5saWtlbHkoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TVE9QUEVEKSkgewotCQkJLyoKLQkJCSAqIFdlJ2xsIHN0YXJ0IHVwIHdpdGggYW4gaW1tZWRpYXRlIFNJR1NUT1AuCi0JCQkgKi8KLQkJCXNpZ2FkZHNldCgmcC0+cGVuZGluZy5zaWduYWwsIFNJR1NUT1ApOwotCQkJc2V0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfU0lHUEVORElORyk7Ci0JCQlfX3NldF90YXNrX3N0YXRlKHAsIFRBU0tfU1RPUFBFRCk7Ci0JCX0gZWxzZSB7Ci0JCQl3YWtlX3VwX25ld190YXNrKHAsIGNsb25lX2ZsYWdzKTsKLQkJfQorCQl3YWtlX3VwX25ld190YXNrKHAsIGNsb25lX2ZsYWdzKTsKIAogCQl0cmFjZWhvb2tfcmVwb3J0X2Nsb25lX2NvbXBsZXRlKHRyYWNlLCByZWdzLAogCQkJCQkJY2xvbmVfZmxhZ3MsIG5yLCBwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mcmVlemVyLmMgYi9rZXJuZWwvZnJlZXplci5jCmluZGV4IGJkMWQ0MmIuLjY2ZWNkMmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mcmVlemVyLmMKKysrIGIva2VybmVsL2ZyZWV6ZXIuYwpAQCAtMTA0LDggKzEwNCwxMyBAQAogCX0KIAogCWlmIChzaG91bGRfc2VuZF9zaWduYWwocCkpIHsKLQkJaWYgKCFzaWduYWxfcGVuZGluZyhwKSkKLQkJCWZha2Vfc2lnbmFsX3dha2VfdXAocCk7CisJCWZha2Vfc2lnbmFsX3dha2VfdXAocCk7CisJCS8qCisJCSAqIGZha2Vfc2lnbmFsX3dha2VfdXAoKSBnb2VzIHRocm91Z2ggcCdzIHNjaGVkdWxlcgorCQkgKiBsb2NrIGFuZCBndWFyYW50ZWVzIHRoYXQgVEFTS19TVE9QUEVEL1RSQUNFRCAtPgorCQkgKiBUQVNLX1JVTk5JTkcgdHJhbnNpdGlvbiBjYW4ndCByYWNlIHdpdGggdGFzayBzdGF0ZQorCQkgKiB0ZXN0aW5nIGluIHRyeV90b19mcmVlemVfdGFza3MoKS4KKwkJICovCiAJfSBlbHNlIGlmIChzaWdfb25seSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggMzAxOWI5Mi4uNTIwNzU2MyAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXVhZGRyOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwYWdlX2hlYWQ7CiAJaW50IGVycjsKIAogCS8qCkBAIC0yNjUsMTEgKzI2NSw0NiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JcGFnZSA9IGNvbXBvdW5kX2hlYWQocGFnZSk7Ci0JbG9ja19wYWdlKHBhZ2UpOwotCWlmICghcGFnZS0+bWFwcGluZykgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlwYWdlX2hlYWQgPSBwYWdlOworCWlmICh1bmxpa2VseShQYWdlVGFpbChwYWdlKSkpIHsKIAkJcHV0X3BhZ2UocGFnZSk7CisJCS8qIHNlcmlhbGl6ZSBhZ2FpbnN0IF9fc3BsaXRfaHVnZV9wYWdlX3NwbGl0dGluZygpICovCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmIChsaWtlbHkoX19nZXRfdXNlcl9wYWdlc19mYXN0KGFkZHJlc3MsIDEsIDEsICZwYWdlKSA9PSAxKSkgeworCQkJcGFnZV9oZWFkID0gY29tcG91bmRfaGVhZChwYWdlKTsKKwkJCS8qCisJCQkgKiBwYWdlX2hlYWQgaXMgdmFsaWQgcG9pbnRlciBidXQgd2UgbXVzdCBwaW4KKwkJCSAqIGl0IGJlZm9yZSB0YWtpbmcgdGhlIFBHX2xvY2sgYW5kL29yCisJCQkgKiBQR19jb21wb3VuZF9sb2NrLiBUaGUgbW9tZW50IHdlIHJlLWVuYWJsZQorCQkJICogaXJxcyBfX3NwbGl0X2h1Z2VfcGFnZV9zcGxpdHRpbmcoKSBjYW4KKwkJCSAqIHJldHVybiBhbmQgdGhlIGhlYWQgcGFnZSBjYW4gYmUgZnJlZWQgZnJvbQorCQkJICogdW5kZXIgdXMuIFdlIGNhbid0IHRha2UgdGhlIFBHX2xvY2sgYW5kL29yCisJCQkgKiBQR19jb21wb3VuZF9sb2NrIG9uIGEgcGFnZSB0aGF0IGNvdWxkIGJlCisJCQkgKiBmcmVlZCBmcm9tIHVuZGVyIHVzLgorCQkJICovCisJCQlpZiAocGFnZSAhPSBwYWdlX2hlYWQpIHsKKwkJCQlnZXRfcGFnZShwYWdlX2hlYWQpOworCQkJCXB1dF9wYWdlKHBhZ2UpOworCQkJfQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQl9IGVsc2UgeworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKyNlbHNlCisJcGFnZV9oZWFkID0gY29tcG91bmRfaGVhZChwYWdlKTsKKwlpZiAocGFnZSAhPSBwYWdlX2hlYWQpIHsKKwkJZ2V0X3BhZ2UocGFnZV9oZWFkKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfQorI2VuZGlmCisKKwlsb2NrX3BhZ2UocGFnZV9oZWFkKTsKKwlpZiAoIXBhZ2VfaGVhZC0+bWFwcGluZykgeworCQl1bmxvY2tfcGFnZShwYWdlX2hlYWQpOworCQlwdXRfcGFnZShwYWdlX2hlYWQpOwogCQlnb3RvIGFnYWluOwogCX0KIApAQCAtMjgwLDIwICszMTUsMjAgQEAKIAkgKiBpdCdzIGEgcmVhZC1vbmx5IGhhbmRsZSwgaXQncyBleHBlY3RlZCB0aGF0IGZ1dGV4ZXMgYXR0YWNoIHRvCiAJICogdGhlIG9iamVjdCBub3QgdGhlIHBhcnRpY3VsYXIgcHJvY2Vzcy4KIAkgKi8KLQlpZiAoUGFnZUFub24ocGFnZSkpIHsKKwlpZiAoUGFnZUFub24ocGFnZV9oZWFkKSkgewogCQlrZXktPmJvdGgub2Zmc2V0IHw9IEZVVF9PRkZfTU1TSEFSRUQ7IC8qIHJlZiB0YWtlbiBvbiBtbSAqLwogCQlrZXktPnByaXZhdGUubW0gPSBtbTsKIAkJa2V5LT5wcml2YXRlLmFkZHJlc3MgPSBhZGRyZXNzOwogCX0gZWxzZSB7CiAJCWtleS0+Ym90aC5vZmZzZXQgfD0gRlVUX09GRl9JTk9ERTsgLyogaW5vZGUtYmFzZWQga2V5ICovCi0JCWtleS0+c2hhcmVkLmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLQkJa2V5LT5zaGFyZWQucGdvZmYgPSBwYWdlLT5pbmRleDsKKwkJa2V5LT5zaGFyZWQuaW5vZGUgPSBwYWdlX2hlYWQtPm1hcHBpbmctPmhvc3Q7CisJCWtleS0+c2hhcmVkLnBnb2ZmID0gcGFnZV9oZWFkLT5pbmRleDsKIAl9CiAKIAlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIAotCXVubG9ja19wYWdlKHBhZ2UpOwotCXB1dF9wYWdlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2VfaGVhZCk7CisJcHV0X3BhZ2UocGFnZV9oZWFkKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2hydGltZXIuYyBiL2tlcm5lbC9ocnRpbWVyLmMKaW5kZXggNDVkYTJiNi4uMGM4ZDdjMCAxMDA2NDQKLS0tIGEva2VybmVsL2hydGltZXIuYworKysgYi9rZXJuZWwvaHJ0aW1lci5jCkBAIC0xNzQ1LDcgKzE3NDUsNyBAQAogCX0KIAogCS8qCi0JICogQSBOVUxMIHBhcmFtZXRlciBtZWFucyAiaW5pZmludGUiCisJICogQSBOVUxMIHBhcmFtZXRlciBtZWFucyAiaW5maW5pdGUiCiAJICovCiAJaWYgKCFleHBpcmVzKSB7CiAJCXNjaGVkdWxlKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2lycWRlc2MuYyBiL2tlcm5lbC9pcnEvaXJxZGVzYy5jCmluZGV4IDk5ODhkMDMuLjI4MmYyMDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jCisrKyBiL2tlcm5lbC9pcnEvaXJxZGVzYy5jCkBAIC03Miw2ICs3Miw4IEBACiAKIHN0YXRpYyB2b2lkIGRlc2Nfc2V0X2RlZmF1bHRzKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCiB7CisJaW50IGNwdTsKKwogCWRlc2MtPmlycV9kYXRhLmlycSA9IGlycTsKIAlkZXNjLT5pcnFfZGF0YS5jaGlwID0gJm5vX2lycV9jaGlwOwogCWRlc2MtPmlycV9kYXRhLmNoaXBfZGF0YSA9IE5VTEw7CkBAIC04Myw3ICs4NSw4IEBACiAJZGVzYy0+aXJxX2NvdW50ID0gMDsKIAlkZXNjLT5pcnFzX3VuaGFuZGxlZCA9IDA7CiAJZGVzYy0+bmFtZSA9IE5VTEw7Ci0JbWVtc2V0KGRlc2MtPmtzdGF0X2lycXMsIDAsIG5yX2NwdV9pZHMgKiBzaXplb2YoKihkZXNjLT5rc3RhdF9pcnFzKSkpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCSpwZXJfY3B1X3B0cihkZXNjLT5rc3RhdF9pcnFzLCBjcHUpID0gMDsKIAlkZXNjX3NtcF9pbml0KGRlc2MsIG5vZGUpOwogfQogCkBAIC0xMzMsOCArMTM2LDcgQEAKIAlpZiAoIWRlc2MpCiAJCXJldHVybiBOVUxMOwogCS8qIGFsbG9jYXRlIGJhc2VkIG9uIG5yX2NwdV9pZHMgKi8KLQlkZXNjLT5rc3RhdF9pcnFzID0ga3phbGxvY19ub2RlKG5yX2NwdV9pZHMgKiBzaXplb2YoKmRlc2MtPmtzdGF0X2lycXMpLAotCQkJCQkgZ2ZwLCBub2RlKTsKKwlkZXNjLT5rc3RhdF9pcnFzID0gYWxsb2NfcGVyY3B1KHVuc2lnbmVkIGludCk7CiAJaWYgKCFkZXNjLT5rc3RhdF9pcnFzKQogCQlnb3RvIGVycl9kZXNjOwogCkBAIC0xNDksNyArMTUxLDcgQEAKIAlyZXR1cm4gZGVzYzsKIAogZXJyX2tzdGF0OgotCWtmcmVlKGRlc2MtPmtzdGF0X2lycXMpOworCWZyZWVfcGVyY3B1KGRlc2MtPmtzdGF0X2lycXMpOwogZXJyX2Rlc2M6CiAJa2ZyZWUoZGVzYyk7CiAJcmV0dXJuIE5VTEw7CkBAIC0xNjYsNyArMTY4LDcgQEAKIAltdXRleF91bmxvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAKIAlmcmVlX21hc2tzKGRlc2MpOwotCWtmcmVlKGRlc2MtPmtzdGF0X2lycXMpOworCWZyZWVfcGVyY3B1KGRlc2MtPmtzdGF0X2lycXMpOwogCWtmcmVlKGRlc2MpOwogfQogCkBAIC0yMzQsNyArMjM2LDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGtzdGF0X2lycXNfYWxsW05SX0lSUVNdW05SX0NQVVNdOwogaW50IF9faW5pdCBlYXJseV9pcnFfaW5pdCh2b2lkKQogewogCWludCBjb3VudCwgaSwgbm9kZSA9IGZpcnN0X29ubGluZV9ub2RlOwpAQCAtMjUwLDcgKzI1MSw4IEBACiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJZGVzY1tpXS5pcnFfZGF0YS5pcnEgPSBpOwogCQlkZXNjW2ldLmlycV9kYXRhLmNoaXAgPSAmbm9faXJxX2NoaXA7Ci0JCWRlc2NbaV0ua3N0YXRfaXJxcyA9IGtzdGF0X2lycXNfYWxsW2ldOworCQkvKiBUT0RPIDogZG8gdGhpcyBhbGxvY2F0aW9uIG9uLWRlbWFuZCAuLi4gKi8KKwkJZGVzY1tpXS5rc3RhdF9pcnFzID0gYWxsb2NfcGVyY3B1KHVuc2lnbmVkIGludCk7CiAJCWFsbG9jX21hc2tzKGRlc2MgKyBpLCBHRlBfS0VSTkVMLCBub2RlKTsKIAkJZGVzY19zbXBfaW5pdChkZXNjICsgaSwgbm9kZSk7CiAJCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjW2ldLmxvY2ssICZpcnFfZGVzY19sb2NrX2NsYXNzKTsKQEAgLTI3NSw2ICsyNzcsMjIgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYWxsb2NfZGVzY3ModW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgY250LCBpbnQgbm9kZSkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19LU1RBVF9JUlFTX09OREVNQU5EKQorCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlkZXNjID0gaXJxX3RvX2Rlc2Moc3RhcnQgKyBpKTsKKwkJaWYgKGRlc2MgJiYgIWRlc2MtPmtzdGF0X2lycXMpIHsKKwkJCXVuc2lnbmVkIGludCBfX3BlcmNwdSAqc3RhdHMgPSBhbGxvY19wZXJjcHUodW5zaWduZWQgaW50KTsKKworCQkJaWYgKCFzdGF0cykKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoY21weGNoZygmZGVzYy0+a3N0YXRfaXJxcywgTlVMTCwgc3RhdHMpICE9IE5VTEwpCisJCQkJZnJlZV9wZXJjcHUoc3RhdHMpOworCQl9CisJfQorI2VuZGlmCiAJcmV0dXJuIHN0YXJ0OwogfQogI2VuZGlmIC8qICFDT05GSUdfU1BBUlNFX0lSUSAqLwpAQCAtMzkxLDcgKzQwOSw5IEBACiB1bnNpZ25lZCBpbnQga3N0YXRfaXJxc19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCXJldHVybiBkZXNjID8gZGVzYy0+a3N0YXRfaXJxc1tjcHVdIDogMDsKKworCXJldHVybiBkZXNjICYmIGRlc2MtPmtzdGF0X2lycXMgPworCQkJKnBlcl9jcHVfcHRyKGRlc2MtPmtzdGF0X2lycXMsIGNwdSkgOiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfSEFSRElSUVMKQEAgLTQwMSwxMCArNDIxLDEwIEBACiAJaW50IGNwdTsKIAlpbnQgc3VtID0gMDsKIAotCWlmICghZGVzYykKKwlpZiAoIWRlc2MgfHwgIWRlc2MtPmtzdGF0X2lycXMpCiAJCXJldHVybiAwOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCXN1bSArPSBkZXNjLT5rc3RhdF9pcnFzW2NwdV07CisJCXN1bSArPSAqcGVyX2NwdV9wdHIoZGVzYy0+a3N0YXRfaXJxcywgY3B1KTsKIAlyZXR1cm4gc3VtOwogfQogI2VuZGlmIC8qIENPTkZJR19HRU5FUklDX0hBUkRJUlFTICovCmRpZmYgLS1naXQgYS9rZXJuZWwva2V4ZWMuYyBiL2tlcm5lbC9rZXhlYy5jCmluZGV4IGI1NTA0NWIuLmVjMTliOTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZXhlYy5jCisrKyBiL2tlcm5lbC9rZXhlYy5jCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkgKiBqdXN0IHZlcmlmaWVzIGl0IGlzIGFuIGFkZHJlc3Mgd2UgY2FuIHVzZS4KIAkgKgogCSAqIFNpbmNlIHRoZSBrZXJuZWwgZG9lcyBldmVyeXRoaW5nIGluIHBhZ2Ugc2l6ZSBjaHVua3MgZW5zdXJlCi0JICogdGhlIGRlc3RpbmF0aW9uIGFkZHJlc2VzIGFyZSBwYWdlIGFsaWduZWQuICBUb28gbWFueQorCSAqIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIHBhZ2UgYWxpZ25lZC4gIFRvbyBtYW55CiAJICogc3BlY2lhbCBjYXNlcyBjcm9wIG9mIHdoZW4gd2UgZG9uJ3QgZG8gdGhpcy4gIFRoZSBtb3N0CiAJICogaW5zaWRpb3VzIGlzIGdldHRpbmcgb3ZlcmxhcHBpbmcgZGVzdGluYXRpb24gYWRkcmVzc2VzCiAJICogc2ltcGx5IGJlY2F1c2UgYWRkcmVzc2VzIGFyZSBjaGFuZ2VkIHRvIHBhZ2Ugc2l6ZQpkaWZmIC0tZ2l0IGEva2VybmVsL2xhdGVuY3l0b3AuYyBiL2tlcm5lbC9sYXRlbmN5dG9wLmMKaW5kZXggMTcxMTBhNC4uZWU3NGIzNSAxMDA2NDQKLS0tIGEva2VybmVsL2xhdGVuY3l0b3AuYworKysgYi9rZXJuZWwvbGF0ZW5jeXRvcC5jCkBAIC0yNDEsMjQgKzI0MSwxOSBAQAogCXNlcV9wdXRzKG0sICJMYXRlbmN5IFRvcCB2ZXJzaW9uIDogdjAuMVxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYTFI7IGkrKykgewotCQlpZiAobGF0ZW5jeV9yZWNvcmRbaV0uYmFja3RyYWNlWzBdKSB7CisJCXN0cnVjdCBsYXRlbmN5X3JlY29yZCAqbHIgPSAmbGF0ZW5jeV9yZWNvcmRbaV07CisKKwkJaWYgKGxyLT5iYWNrdHJhY2VbMF0pIHsKIAkJCWludCBxOwotCQkJc2VxX3ByaW50ZihtLCAiJWkgJWx1ICVsdSAiLAotCQkJCWxhdGVuY3lfcmVjb3JkW2ldLmNvdW50LAotCQkJCWxhdGVuY3lfcmVjb3JkW2ldLnRpbWUsCi0JCQkJbGF0ZW5jeV9yZWNvcmRbaV0ubWF4KTsKKwkJCXNlcV9wcmludGYobSwgIiVpICVsdSAlbHUiLAorCQkJCSAgIGxyLT5jb3VudCwgbHItPnRpbWUsIGxyLT5tYXgpOwogCQkJZm9yIChxID0gMDsgcSA8IExUX0JBQ0tUUkFDRURFUFRIOyBxKyspIHsKLQkJCQljaGFyIHN5bVtLU1lNX1NZTUJPTF9MRU5dOwotCQkJCWNoYXIgKmM7Ci0JCQkJaWYgKCFsYXRlbmN5X3JlY29yZFtpXS5iYWNrdHJhY2VbcV0pCisJCQkJdW5zaWduZWQgbG9uZyBidCA9IGxyLT5iYWNrdHJhY2VbcV07CisJCQkJaWYgKCFidCkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGxhdGVuY3lfcmVjb3JkW2ldLmJhY2t0cmFjZVtxXSA9PSBVTE9OR19NQVgpCisJCQkJaWYgKGJ0ID09IFVMT05HX01BWCkKIAkJCQkJYnJlYWs7Ci0JCQkJc3ByaW50X3N5bWJvbChzeW0sIGxhdGVuY3lfcmVjb3JkW2ldLmJhY2t0cmFjZVtxXSk7Ci0JCQkJYyA9IHN0cmNocihzeW0sICcrJyk7Ci0JCQkJaWYgKGMpCi0JCQkJCSpjID0gMDsKLQkJCQlzZXFfcHJpbnRmKG0sICIlcyAiLCBzeW0pOworCQkJCXNlcV9wcmludGYobSwgIiAlcHMiLCAodm9pZCAqKWJ0KTsKIAkJCX0KIAkJCXNlcV9wcmludGYobSwgIlxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYW5pYy5jIGIva2VybmVsL3BhbmljLmMKaW5kZXggNGMxM2IxYS4uOTkxYmI4NyAxMDA2NDQKLS0tIGEva2VybmVsL3BhbmljLmMKKysrIGIva2VybmVsL3BhbmljLmMKQEAgLTM0LDYgKzM0LDcgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGF1c2Vfb25fb29wc19sb2NrKTsKIAogaW50IHBhbmljX3RpbWVvdXQ7CitFWFBPUlRfU1lNQk9MX0dQTChwYW5pY190aW1lb3V0KTsKIAogQVRPTUlDX05PVElGSUVSX0hFQUQocGFuaWNfbm90aWZpZXJfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDExODQ3YmYuLjA1ZWJlODQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMzgsNiArMzgsMTIgQEAKIAogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCitlbnVtIGV2ZW50X3R5cGVfdCB7CisJRVZFTlRfRkxFWElCTEUgPSAweDEsCisJRVZFTlRfUElOTkVEID0gMHgyLAorCUVWRU5UX0FMTCA9IEVWRU5UX0ZMRVhJQkxFIHwgRVZFTlRfUElOTkVELAorfTsKKwogYXRvbWljX3QgcGVyZl90YXNrX2V2ZW50cyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGF0b21pY190IG5yX21tYXBfZXZlbnRzIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgYXRvbWljX3QgbnJfY29tbV9ldmVudHMgX19yZWFkX21vc3RseTsKQEAgLTY1LDYgKzcxLDEyIEBACiAKIHN0YXRpYyBhdG9taWM2NF90IHBlcmZfZXZlbnRfaWQ7CiAKK3N0YXRpYyB2b2lkIGNwdV9jdHhfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJCQkgICAgICBlbnVtIGV2ZW50X3R5cGVfdCBldmVudF90eXBlKTsKKworc3RhdGljIHZvaWQgY3B1X2N0eF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCQkJICAgICBlbnVtIGV2ZW50X3R5cGVfdCBldmVudF90eXBlKTsKKwogdm9pZCBfX3dlYWsgcGVyZl9ldmVudF9wcmludF9kZWJ1Zyh2b2lkKQl7IH0KIAogZXh0ZXJuIF9fd2VhayBjb25zdCBjaGFyICpwZXJmX3BtdV9uYW1lKHZvaWQpCkBAIC03Miw2ICs4NCwxMSBAQAogCXJldHVybiAicG11IjsKIH0KIAorc3RhdGljIGlubGluZSB1NjQgcGVyZl9jbG9jayh2b2lkKQoreworCXJldHVybiBsb2NhbF9jbG9jaygpOworfQorCiB2b2lkIHBlcmZfcG11X2Rpc2FibGUoc3RydWN0IHBtdSAqcG11KQogewogCWludCAqY291bnQgPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfZGlzYWJsZV9jb3VudCk7CkBAIC0yNDAsMTEgKzI1Nyw2IEBACiAJcHV0X2N0eChjdHgpOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBwZXJmX2Nsb2NrKHZvaWQpCi17Ci0JcmV0dXJuIGxvY2FsX2Nsb2NrKCk7Ci19Ci0KIC8qCiAgKiBVcGRhdGUgdGhlIHJlY29yZCBvZiB0aGUgY3VycmVudCB0aW1lIGluIGEgY29udGV4dC4KICAqLwpAQCAtMjU2LDYgKzI2OCwxMiBAQAogCWN0eC0+dGltZXN0YW1wID0gbm93OwogfQogCitzdGF0aWMgdTY0IHBlcmZfZXZlbnRfdGltZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gZXZlbnQtPmN0eDsKKwlyZXR1cm4gY3R4ID8gY3R4LT50aW1lIDogMDsKK30KKwogLyoKICAqIFVwZGF0ZSB0aGUgdG90YWxfdGltZV9lbmFibGVkIGFuZCB0b3RhbF90aW1lX3J1bm5pbmcgZmllbGRzIGZvciBhIGV2ZW50LgogICovCkBAIC0yNjksNyArMjg3LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGN0eC0+aXNfYWN0aXZlKQotCQlydW5fZW5kID0gY3R4LT50aW1lOworCQlydW5fZW5kID0gcGVyZl9ldmVudF90aW1lKGV2ZW50KTsKIAllbHNlCiAJCXJ1bl9lbmQgPSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CiAKQEAgLTI3OCw3ICsyOTYsNyBAQAogCWlmIChldmVudC0+c3RhdGUgPT0gUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSkKIAkJcnVuX2VuZCA9IGV2ZW50LT50c3RhbXBfc3RvcHBlZDsKIAllbHNlCi0JCXJ1bl9lbmQgPSBjdHgtPnRpbWU7CisJCXJ1bl9lbmQgPSBwZXJmX2V2ZW50X3RpbWUoZXZlbnQpOwogCiAJZXZlbnQtPnRvdGFsX3RpbWVfcnVubmluZyA9IHJ1bl9lbmQgLSBldmVudC0+dHN0YW1wX3J1bm5pbmc7CiB9CkBAIC01MzQsNiArNTUyLDcgQEAKIAkJICBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAogCQkgIHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCkKIHsKKwl1NjQgdHN0YW1wID0gcGVyZl9ldmVudF90aW1lKGV2ZW50KTsKIAl1NjQgZGVsdGE7CiAJLyoKIAkgKiBBbiBldmVudCB3aGljaCBjb3VsZCBub3QgYmUgYWN0aXZhdGVkIGJlY2F1c2Ugb2YKQEAgLTU0NSw3ICs1NjQsNyBAQAogCSAgICAmJiAhZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkgewogCQlkZWx0YSA9IGN0eC0+dGltZSAtIGV2ZW50LT50c3RhbXBfc3RvcHBlZDsKIAkJZXZlbnQtPnRzdGFtcF9ydW5uaW5nICs9IGRlbHRhOwotCQlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSBjdHgtPnRpbWU7CisJCWV2ZW50LT50c3RhbXBfc3RvcHBlZCA9IHRzdGFtcDsKIAl9CiAKIAlpZiAoZXZlbnQtPnN0YXRlICE9IFBFUkZfRVZFTlRfU1RBVEVfQUNUSVZFKQpAQCAtNTU2LDcgKzU3NSw3IEBACiAJCWV2ZW50LT5wZW5kaW5nX2Rpc2FibGUgPSAwOwogCQlldmVudC0+c3RhdGUgPSBQRVJGX0VWRU5UX1NUQVRFX09GRjsKIAl9Ci0JZXZlbnQtPnRzdGFtcF9zdG9wcGVkID0gY3R4LT50aW1lOworCWV2ZW50LT50c3RhbXBfc3RvcHBlZCA9IHRzdGFtcDsKIAlldmVudC0+cG11LT5kZWwoZXZlbnQsIDApOwogCWV2ZW50LT5vbmNwdSA9IC0xOwogCkBAIC03NjgsNiArNzg3LDggQEAKIAkJIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCiAJCSBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CisJdTY0IHRzdGFtcCA9IHBlcmZfZXZlbnRfdGltZShldmVudCk7CisKIAlpZiAoZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQogCQlyZXR1cm4gMDsKIApAQCAtNzg0LDkgKzgwNSw5IEBACiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCWV2ZW50LT50c3RhbXBfcnVubmluZyArPSBjdHgtPnRpbWUgLSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CisJZXZlbnQtPnRzdGFtcF9ydW5uaW5nICs9IHRzdGFtcCAtIGV2ZW50LT50c3RhbXBfc3RvcHBlZDsKIAotCWV2ZW50LT5zaGFkb3dfY3R4X3RpbWUgPSBjdHgtPnRpbWUgLSBjdHgtPnRpbWVzdGFtcDsKKwlldmVudC0+c2hhZG93X2N0eF90aW1lID0gdHN0YW1wIC0gY3R4LT50aW1lc3RhbXA7CiAKIAlpZiAoIWlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkKIAkJY3B1Y3R4LT5hY3RpdmVfb25jcHUrKzsKQEAgLTg5OCwxMSArOTE5LDEzIEBACiBzdGF0aWMgdm9pZCBhZGRfZXZlbnRfdG9fY3R4KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CisJdTY0IHRzdGFtcCA9IHBlcmZfZXZlbnRfdGltZShldmVudCk7CisKIAlsaXN0X2FkZF9ldmVudChldmVudCwgY3R4KTsKIAlwZXJmX2dyb3VwX2F0dGFjaChldmVudCk7Ci0JZXZlbnQtPnRzdGFtcF9lbmFibGVkID0gY3R4LT50aW1lOwotCWV2ZW50LT50c3RhbXBfcnVubmluZyA9IGN0eC0+dGltZTsKLQlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSBjdHgtPnRpbWU7CisJZXZlbnQtPnRzdGFtcF9lbmFibGVkID0gdHN0YW1wOworCWV2ZW50LT50c3RhbXBfcnVubmluZyA9IHRzdGFtcDsKKwlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSB0c3RhbXA7CiB9CiAKIC8qCkBAIC05MzcsNyArOTYwLDcgQEAKIAogCWFkZF9ldmVudF90b19jdHgoZXZlbnQsIGN0eCk7CiAKLQlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCWdvdG8gdW5sb2NrOwogCiAJLyoKQEAgLTEwNDIsMTQgKzEwNjUsMTMgQEAKIAkJCQkJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4KQogewogCXN0cnVjdCBwZXJmX2V2ZW50ICpzdWI7CisJdTY0IHRzdGFtcCA9IHBlcmZfZXZlbnRfdGltZShldmVudCk7CiAKIAlldmVudC0+c3RhdGUgPSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFOwotCWV2ZW50LT50c3RhbXBfZW5hYmxlZCA9IGN0eC0+dGltZSAtIGV2ZW50LT50b3RhbF90aW1lX2VuYWJsZWQ7CisJZXZlbnQtPnRzdGFtcF9lbmFibGVkID0gdHN0YW1wIC0gZXZlbnQtPnRvdGFsX3RpbWVfZW5hYmxlZDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YiwgJmV2ZW50LT5zaWJsaW5nX2xpc3QsIGdyb3VwX2VudHJ5KSB7Ci0JCWlmIChzdWItPnN0YXRlID49IFBFUkZfRVZFTlRfU1RBVEVfSU5BQ1RJVkUpIHsKLQkJCXN1Yi0+dHN0YW1wX2VuYWJsZWQgPQotCQkJCWN0eC0+dGltZSAtIHN1Yi0+dG90YWxfdGltZV9lbmFibGVkOwotCQl9CisJCWlmIChzdWItPnN0YXRlID49IFBFUkZfRVZFTlRfU1RBVEVfSU5BQ1RJVkUpCisJCQlzdWItPnRzdGFtcF9lbmFibGVkID0gdHN0YW1wIC0gc3ViLT50b3RhbF90aW1lX2VuYWJsZWQ7CiAJfQogfQogCkBAIC0xMDgyLDcgKzExMDQsNyBAQAogCQlnb3RvIHVubG9jazsKIAlfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKGV2ZW50LCBjdHgpOwogCi0JaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKQogCQlnb3RvIHVubG9jazsKIAogCS8qCkBAIC0xMTkzLDEyICsxMjE1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotZW51bSBldmVudF90eXBlX3QgewotCUVWRU5UX0ZMRVhJQkxFID0gMHgxLAotCUVWRU5UX1BJTk5FRCA9IDB4MiwKLQlFVkVOVF9BTEwgPSBFVkVOVF9GTEVYSUJMRSB8IEVWRU5UX1BJTk5FRCwKLX07Ci0KIHN0YXRpYyB2b2lkIGN0eF9zY2hlZF9vdXQoc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LAogCQkJICBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAogCQkJICBlbnVtIGV2ZW50X3R5cGVfdCBldmVudF90eXBlKQpAQCAtMTQzNSw3ICsxNDUxLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmY3R4LT5waW5uZWRfZ3JvdXBzLCBncm91cF9lbnRyeSkgewogCQlpZiAoZXZlbnQtPnN0YXRlIDw9IFBFUkZfRVZFTlRfU1RBVEVfT0ZGKQogCQkJY29udGludWU7Ci0JCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZ3JvdXBfY2FuX2dvX29uKGV2ZW50LCBjcHVjdHgsIDEpKQpAQCAtMTQ2Nyw3ICsxNDgzLDcgQEAKIAkJICogTGlzdGVuIHRvIHRoZSAnY3B1JyBzY2hlZHVsaW5nIGZpbHRlciBjb25zdHJhaW50CiAJCSAqIG9mIGV2ZW50czoKIAkJICovCi0JCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZ3JvdXBfY2FuX2dvX29uKGV2ZW50LCBjcHVjdHgsIGNhbl9hZGRfaHcpKSB7CkBAIC0xNjk0LDcgKzE3MTAsNyBAQAogCQlpZiAoZXZlbnQtPnN0YXRlICE9IFBFUkZfRVZFTlRfU1RBVEVfQUNUSVZFKQogCQkJY29udGludWU7CiAKLQkJaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCWlmICghZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkKIAkJCWNvbnRpbnVlOwogCiAJCWh3YyA9ICZldmVudC0+aHc7CkBAIC0zODkzLDcgKzM5MDksNyBAQAogCWlmIChldmVudC0+c3RhdGUgPCBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKQogCQlyZXR1cm4gMDsKIAotCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCWlmICghZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZXZlbnQtPmF0dHIuY29tbSB8fCBldmVudC0+YXR0ci5tbWFwIHx8CkBAIC00MDMwLDcgKzQwNDYsNyBAQAogCWlmIChldmVudC0+c3RhdGUgPCBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKQogCQlyZXR1cm4gMDsKIAotCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCWlmICghZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZXZlbnQtPmF0dHIuY29tbSkKQEAgLTQxNzgsNyArNDE5NCw3IEBACiAJaWYgKGV2ZW50LT5zdGF0ZSA8IFBFUkZfRVZFTlRfU1RBVEVfSU5BQ1RJVkUpCiAJCXJldHVybiAwOwogCi0JaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKQogCQlyZXR1cm4gMDsKIAogCWlmICgoIWV4ZWN1dGFibGUgJiYgZXZlbnQtPmF0dHIubW1hcF9kYXRhKSB8fApAQCAtNDY0OCw3ICs0NjY0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBlcmZfc3dldmVudF9nZXRfcmVjdXJzaW9uX2NvbnRleHQpOwogCi12b2lkIGlubGluZSBwZXJmX3N3ZXZlbnRfcHV0X3JlY3Vyc2lvbl9jb250ZXh0KGludCByY3R4KQoraW5saW5lIHZvaWQgcGVyZl9zd2V2ZW50X3B1dF9yZWN1cnNpb25fY29udGV4dChpbnQgcmN0eCkKIHsKIAlzdHJ1Y3Qgc3dldmVudF9odGFibGUgKnN3aGFzaCA9ICZfX2dldF9jcHVfdmFyKHN3ZXZlbnRfaHRhYmxlKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCBhNWFmZjNlLi4yNjU3Mjk5IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtMTAwLDEzICsxMDAsOSBAQAogCWRlcGVuZHMgb24gUE1fQURWQU5DRURfREVCVUcKIAlkZWZhdWx0IG4KIAotY29uZmlnIFNVU1BFTkRfTlZTCi0gICAgICAgYm9vbAotCiBjb25maWcgU1VTUEVORAogCWJvb2wgIlN1c3BlbmQgdG8gUkFNIGFuZCBzdGFuZGJ5IgogCWRlcGVuZHMgb24gUE0gJiYgQVJDSF9TVVNQRU5EX1BPU1NJQkxFCi0Jc2VsZWN0IFNVU1BFTkRfTlZTIGlmIEhBU19JT01FTQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIEFsbG93IHRoZSBzeXN0ZW0gdG8gZW50ZXIgc2xlZXAgc3RhdGVzIGluIHdoaWNoIG1haW4gbWVtb3J5IGlzCkBAIC0xNDAsNyArMTM2LDYgQEAKIAlkZXBlbmRzIG9uIFBNICYmIFNXQVAgJiYgQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRQogCXNlbGVjdCBMWk9fQ09NUFJFU1MKIAlzZWxlY3QgTFpPX0RFQ09NUFJFU1MKLQlzZWxlY3QgU1VTUEVORF9OVlMgaWYgSEFTX0lPTUVNCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBzdXNwZW5kIHRvIGRpc2sgKFNURCkgZnVuY3Rpb25hbGl0eSwgd2hpY2ggaXMgdXN1YWxseQogCSAgY2FsbGVkICJoaWJlcm5hdGlvbiIgaW4gdXNlciBpbnRlcmZhY2VzLiAgU1REIGNoZWNrcG9pbnRzIHRoZQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCmluZGV4IGY5MDYzYzYuLmMzNTBlMTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZQorKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKQEAgLTEsNyArMSw0IEBACi0KLWlmZXEgKCQoQ09ORklHX1BNX0RFQlVHKSx5KQotRVhUUkFfQ0ZMQUdTCSs9CS1EREVCVUcKLWVuZGlmCitjY2ZsYWdzLSQoQ09ORklHX1BNX0RFQlVHKQk6PQktRERFQlVHCiAKIG9iai0kKENPTkZJR19QTSkJCSs9IG1haW4ubwogb2JqLSQoQ09ORklHX1BNX1NMRUVQKQkJKz0gY29uc29sZS5vCkBAIC0xMCw2ICs3LDUgQEAKIG9iai0kKENPTkZJR19QTV9URVNUX1NVU1BFTkQpCSs9IHN1c3BlbmRfdGVzdC5vCiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IGhpYmVybmF0ZS5vIHNuYXBzaG90Lm8gc3dhcC5vIHVzZXIubyBcCiAJCQkJICAgYmxvY2tfaW8ubwotb2JqLSQoQ09ORklHX1NVU1BFTkRfTlZTKQkrPSBudnMubwogCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHBvd2Vyb2ZmLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCAwNDhkMGI1Li4xODMyYmQyIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKKysrIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC01MSwxOCArNTEsMTggQEAKIAogc3RhdGljIGludCBoaWJlcm5hdGlvbl9tb2RlID0gSElCRVJOQVRJT05fU0hVVERPV047CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1faGliZXJuYXRpb25fb3BzICpoaWJlcm5hdGlvbl9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyAqaGliZXJuYXRpb25fb3BzOwogCiAvKioKICAqIGhpYmVybmF0aW9uX3NldF9vcHMgLSBzZXQgdGhlIGdsb2JhbCBoaWJlcm5hdGUgb3BlcmF0aW9ucwogICogQG9wczogdGhlIGhpYmVybmF0aW9uIG9wZXJhdGlvbnMgdG8gdXNlIGluIHN1YnNlcXVlbnQgaGliZXJuYXRpb24gdHJhbnNpdGlvbnMKICAqLwogCi12b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyAqb3BzKQordm9pZCBoaWJlcm5hdGlvbl9zZXRfb3BzKGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgKm9wcykKIHsKIAlpZiAob3BzICYmICEob3BzLT5iZWdpbiAmJiBvcHMtPmVuZCAmJiAgb3BzLT5wcmVfc25hcHNob3QKIAkgICAgJiYgb3BzLT5wcmVwYXJlICYmIG9wcy0+ZmluaXNoICYmIG9wcy0+ZW50ZXIgJiYgb3BzLT5wcmVfcmVzdG9yZQotCSAgICAmJiBvcHMtPnJlc3RvcmVfY2xlYW51cCkpIHsKKwkgICAgJiYgb3BzLT5yZXN0b3JlX2NsZWFudXAgJiYgb3BzLT5sZWF2ZSkpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI3OCw3ICsyNzgsNyBAQAogCQlnb3RvIEVuYWJsZV9pcnFzOwogCX0KIAotCWlmIChoaWJlcm5hdGlvbl90ZXN0KFRFU1RfQ09SRSkgfHwgIXBtX2NoZWNrX3dha2V1cF9ldmVudHMoKSkKKwlpZiAoaGliZXJuYXRpb25fdGVzdChURVNUX0NPUkUpIHx8IHBtX3dha2V1cF9wZW5kaW5nKCkpCiAJCWdvdG8gUG93ZXJfdXA7CiAKIAlpbl9zdXNwZW5kID0gMTsKQEAgLTUxNiw3ICs1MTYsNyBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlzeXNkZXZfc3VzcGVuZChQTVNHX0hJQkVSTkFURSk7Ci0JaWYgKCFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpIHsKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQllcnJvciA9IC1FQUdBSU47CiAJCWdvdG8gUG93ZXJfdXA7CiAJfQpAQCAtNjQ3LDYgKzY0Nyw3IEBACiAJCXN3c3VzcF9mcmVlKCk7CiAJCWlmICghZXJyb3IpCiAJCQlwb3dlcl9kb3duKCk7CisJCWluX3N1c3BlbmQgPSAwOwogCQlwbV9yZXN0b3JlX2dmcF9tYXNrKCk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIlBNOiBJbWFnZSByZXN0b3JlZCBzdWNjZXNzZnVsbHkuXG4iKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCmluZGV4IGU1MGI0YzEuLmQ2ZDJhMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtNjQsNiArNjQsMTIgQEAKIAkJCSAqIHBlcnR1cmIgYSB0YXNrIGluIFRBU0tfU1RPUFBFRCBvciBUQVNLX1RSQUNFRC4KIAkJCSAqIEl0IGlzICJmcm96ZW4gZW5vdWdoIi4gIElmIHRoZSB0YXNrIGRvZXMgd2FrZQogCQkJICogdXAsIGl0IHdpbGwgaW1tZWRpYXRlbHkgY2FsbCB0cnlfdG9fZnJlZXplLgorCQkJICoKKwkJCSAqIEJlY2F1c2UgZnJlZXplX3Rhc2soKSBnb2VzIHRocm91Z2ggcCdzCisJCQkgKiBzY2hlZHVsZXIgbG9jayBhZnRlciBzZXR0aW5nIFRJRl9GUkVFWkUsIGl0J3MKKwkJCSAqIGd1YXJhbnRlZWQgdGhhdCBlaXRoZXIgd2Ugc2VlIFRBU0tfUlVOTklORyBvcgorCQkJICogdHJ5X3RvX3N0b3AoKSBhZnRlciBzY2hlZHVsZSgpIGluIHB0cmFjZS9zaWduYWwKKwkJCSAqIHN0b3Agc2VlcyBUSUZfRlJFRVpFLgogCQkJICovCiAJCQlpZiAoIXRhc2tfaXNfc3RvcHBlZF9vcl90cmFjZWQocCkgJiYKIAkJCSAgICAhZnJlZXplcl9zaG91bGRfc2tpcChwKSkKQEAgLTc5LDcgKzg1LDcgQEAKIAkJaWYgKCF0b2RvIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpKQogCQkJYnJlYWs7CiAKLQkJaWYgKCFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpIHsKKwkJaWYgKHBtX3dha2V1cF9wZW5kaW5nKCkpIHsKIAkJCXdha2V1cCA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKaW5kZXggMDMxZDVlMy4uZGU2Zjg2YiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCkBAIC0zMSwxMyArMzEsMTMgQEAKIAlbUE1fU1VTUEVORF9NRU1dCT0gIm1lbSIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzICpzdXNwZW5kX29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgKnN1c3BlbmRfb3BzOwogCiAvKioKICAqCXN1c3BlbmRfc2V0X29wcyAtIFNldCB0aGUgZ2xvYmFsIHN1c3BlbmQgbWV0aG9kIHRhYmxlLgogICoJQG9wczoJUG9pbnRlciB0byBvcHMgc3RydWN0dXJlLgogICovCi12b2lkIHN1c3BlbmRfc2V0X29wcyhzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgKm9wcykKK3ZvaWQgc3VzcGVuZF9zZXRfb3BzKGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyAqb3BzKQogewogCW11dGV4X2xvY2soJnBtX211dGV4KTsKIAlzdXNwZW5kX29wcyA9IG9wczsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAJZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChQTVNHX1NVU1BFTkQpOwogCWlmICghZXJyb3IpIHsKLQkJaWYgKCFzdXNwZW5kX3Rlc3QoVEVTVF9DT1JFKSAmJiBwbV9jaGVja193YWtldXBfZXZlbnRzKCkpIHsKKwkJaWYgKCEoc3VzcGVuZF90ZXN0KFRFU1RfQ09SRSkgfHwgcG1fd2FrZXVwX3BlbmRpbmcoKSkpIHsKIAkJCWVycm9yID0gc3VzcGVuZF9vcHMtPmVudGVyKHN0YXRlKTsKIAkJCWV2ZW50c19jaGVja19lbmFibGVkID0gZmFsc2U7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd2FwLmMgYi9rZXJuZWwvcG93ZXIvc3dhcC5jCmluZGV4IDhjN2U0ODMuLjdjOTdjM2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zd2FwLmMKKysrIGIva2VybmVsL3Bvd2VyL3N3YXAuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCXJldHVybiByZXM7CiAKIAlyb290X3N3YXAgPSByZXM7Ci0JcmVzID0gYmxrZGV2X2dldChoaWJfcmVzdW1lX2JkZXYsIEZNT0RFX1dSSVRFKTsKKwlyZXMgPSBibGtkZXZfZ2V0KGhpYl9yZXN1bWVfYmRldiwgRk1PREVfV1JJVEUsIE5VTEwpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKQEAgLTg4OCw3ICs4ODgsNyBAQAogLyoqCiAgKglzd3N1c3BfcmVhZCAtIHJlYWQgdGhlIGhpYmVybmF0aW9uIGltYWdlLgogICoJQGZsYWdzX3A6IGZsYWdzIHBhc3NlZCBieSB0aGUgImZyb3plbiIga2VybmVsIGluIHRoZSBpbWFnZSBoZWFkZXIgc2hvdWxkCi0gKgkJICBiZSB3cml0dGVuIGludG8gdGhpcyBtZW1lb3J5IGxvY2F0aW9uCisgKgkJICBiZSB3cml0dGVuIGludG8gdGhpcyBtZW1vcnkgbG9jYXRpb24KICAqLwogCiBpbnQgc3dzdXNwX3JlYWQodW5zaWduZWQgaW50ICpmbGFnc19wKQpAQCAtOTMwLDcgKzkzMCw4IEBACiB7CiAJaW50IGVycm9yOwogCi0JaGliX3Jlc3VtZV9iZGV2ID0gb3Blbl9ieV9kZXZudW0oc3dzdXNwX3Jlc3VtZV9kZXZpY2UsIEZNT0RFX1JFQUQpOworCWhpYl9yZXN1bWVfYmRldiA9IGJsa2Rldl9nZXRfYnlfZGV2KHN3c3VzcF9yZXN1bWVfZGV2aWNlLAorCQkJCQkgICAgRk1PREVfUkVBRCwgTlVMTCk7CiAJaWYgKCFJU19FUlIoaGliX3Jlc3VtZV9iZGV2KSkgewogCQlzZXRfYmxvY2tzaXplKGhpYl9yZXN1bWVfYmRldiwgUEFHRV9TSVpFKTsKIAkJY2xlYXJfcGFnZShzd3N1c3BfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCA0NjQyYTVjLi41M2Q5YTllIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzbG9nLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0yNzMsMTIgKzI3NCwxMiBAQAogCSAqIGF0IG9wZW4gdGltZS4KIAkgKi8KIAlpZiAodHlwZSA9PSBTWVNMT0dfQUNUSU9OX09QRU4gfHwgIWZyb21fZmlsZSkgewotCQlpZiAoZG1lc2dfcmVzdHJpY3QgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZG1lc2dfcmVzdHJpY3QgJiYgIWNhcGFibGUoQ0FQX1NZU0xPRykpCisJCQlnb3RvIHdhcm47IC8qIHN3aXRjaCB0byByZXR1cm4gLUVQRVJNIGFmdGVyIDIuNi4zOSAqLwogCQlpZiAoKHR5cGUgIT0gU1lTTE9HX0FDVElPTl9SRUFEX0FMTCAmJgogCQkgICAgIHR5cGUgIT0gU1lTTE9HX0FDVElPTl9TSVpFX0JVRkZFUikgJiYKLQkJICAgICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJICAgICFjYXBhYmxlKENBUF9TWVNMT0cpKQorCQkJZ290byB3YXJuOyAvKiBzd2l0Y2ggdG8gcmV0dXJuIC1FUEVSTSBhZnRlciAyLjYuMzkgKi8KIAl9CiAKIAllcnJvciA9IHNlY3VyaXR5X3N5c2xvZyh0eXBlKTsKQEAgLTQyMiw2ICs0MjMsMTIgQEAKIAl9CiBvdXQ6CiAJcmV0dXJuIGVycm9yOword2FybjoKKwkvKiByZW1vdmUgYWZ0ZXIgMi42LjM5ICovCisJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCVdBUk5fT05DRSgxLCAiQXR0ZW1wdCB0byBhY2Nlc3Mgc3lzbG9nIHdpdGggQ0FQX1NZU19BRE1JTiAiCisJCSAgImJ1dCBubyBDQVBfU1lTTE9HIChkZXByZWNhdGVkIGFuZCBkZW5pZWQpLlxuIik7CisJcmV0dXJuIC1FUEVSTTsKIH0KIAogU1lTQ0FMTF9ERUZJTkUzKHN5c2xvZywgaW50LCB0eXBlLCBjaGFyIF9fdXNlciAqLCBidWYsIGludCwgbGVuKQpAQCAtMTQ5Niw3ICsxNTAzLDcgQEAKIAkvKiBEb24ndCBhbGxvdyByZWdpc3RlcmluZyBtdWx0aXBsZSB0aW1lcyAqLwogCWlmICghZHVtcGVyLT5yZWdpc3RlcmVkKSB7CiAJCWR1bXBlci0+cmVnaXN0ZXJlZCA9IDE7Ci0JCWxpc3RfYWRkX3RhaWwoJmR1bXBlci0+bGlzdCwgJmR1bXBfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWxfcmN1KCZkdW1wZXItPmxpc3QsICZkdW1wX2xpc3QpOwogCQllcnIgPSAwOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdW1wX2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtMTUyMCwyOSArMTUyNywxNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkdW1wX2xpc3RfbG9jaywgZmxhZ3MpOwogCWlmIChkdW1wZXItPnJlZ2lzdGVyZWQpIHsKIAkJZHVtcGVyLT5yZWdpc3RlcmVkID0gMDsKLQkJbGlzdF9kZWwoJmR1bXBlci0+bGlzdCk7CisJCWxpc3RfZGVsX3JjdSgmZHVtcGVyLT5saXN0KTsKIAkJZXJyID0gMDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHVtcF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrbXNnX2R1bXBfdW5yZWdpc3Rlcik7CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga21zZ19yZWFzb25zW10gPSB7Ci0JW0tNU0dfRFVNUF9PT1BTXQk9ICJvb3BzIiwKLQlbS01TR19EVU1QX1BBTklDXQk9ICJwYW5pYyIsCi0JW0tNU0dfRFVNUF9LRVhFQ10JPSAia2V4ZWMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmttc2dfdG9fc3RyKGVudW0ga21zZ19kdW1wX3JlYXNvbiByZWFzb24pCi17Ci0JaWYgKHJlYXNvbiA+PSBBUlJBWV9TSVpFKGttc2dfcmVhc29ucykgfHwgcmVhc29uIDwgMCkKLQkJcmV0dXJuICJ1bmtub3duIjsKLQotCXJldHVybiBrbXNnX3JlYXNvbnNbcmVhc29uXTsKLX0KLQogLyoqCiAgKiBrbXNnX2R1bXAgLSBkdW1wIGtlcm5lbCBsb2cgdG8ga2VybmVsIG1lc3NhZ2UgZHVtcGVycy4KICAqIEByZWFzb246IHRoZSByZWFzb24gKG9vcHMsIHBhbmljIGV0YykgZm9yIGR1bXBpbmcKQEAgLTE1ODEsMTMgKzE1NzUsOSBAQAogCQlsMiA9IGNoYXJzOwogCX0KIAotCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJmR1bXBfbGlzdF9sb2NrLCBmbGFncykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkdW1wX2ttc2c6IGR1bXAgbGlzdCBsb2NrIGlzIGhlbGQgZHVyaW5nICVzLCBza2lwcGluZyBkdW1wXG4iLAotCQkJCWttc2dfdG9fc3RyKHJlYXNvbikpOwotCQlyZXR1cm47Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZHVtcGVyLCAmZHVtcF9saXN0LCBsaXN0KQorCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkdW1wZXIsICZkdW1wX2xpc3QsIGxpc3QpCiAJCWR1bXBlci0+ZHVtcChkdW1wZXIsIHJlYXNvbiwgczEsIGwxLCBzMiwgbDIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR1bXBfbGlzdF9sb2NrLCBmbGFncyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggYTBlYjA5NC4uZWEzZTVlZiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTI1MDUsNyArMjUwNSw3IEBACiAgKiB0cnlfdG9fd2FrZV91cF9sb2NhbCAtIHRyeSB0byB3YWtlIHVwIGEgbG9jYWwgdGFzayB3aXRoIHJxIGxvY2sgaGVsZAogICogQHA6IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKICAqCi0gKiBQdXQgQHAgb24gdGhlIHJ1bi1xdWV1ZSBpZiBpdCdzIG5vdCBhbHJlZHkgdGhlcmUuICBUaGUgY2FsbGVyIG11c3QKKyAqIFB1dCBAcCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuICBUaGUgY2FsbGVyIG11c3QKICAqIGVuc3VyZSB0aGF0IHRoaXNfcnEoKSBpcyBsb2NrZWQsIEBwIGlzIGJvdW5kIHRvIHRoaXNfcnEoKSBhbmQgbm90CiAgKiB0aGUgY3VycmVudCB0YXNrLiAgdGhpc19ycSgpIHN0YXlzIGxvY2tlZCBvdmVyIGludm9jYXRpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zbXAuYyBiL2tlcm5lbC9zbXAuYwppbmRleCAxMmVkOGIwLi40ZWMzMGUwIDEwMDY0NAotLS0gYS9rZXJuZWwvc21wLmMKKysrIGIva2VybmVsL3NtcC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKKyNpZmRlZiBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMKIHN0YXRpYyBzdHJ1Y3QgewogCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CiAJcmF3X3NwaW5sb2NrX3QJCWxvY2s7CkBAIC01MjksMyArNTMwLDIxIEBACiB7CiAJcmF3X3NwaW5fdW5sb2NrX2lycSgmY2FsbF9mdW5jdGlvbi5sb2NrKTsKIH0KKyNlbmRpZiAvKiBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyAqLworCisvKgorICogQ2FsbCBhIGZ1bmN0aW9uIG9uIGFsbCBwcm9jZXNzb3JzCisgKi8KK2ludCBvbl9lYWNoX2NwdSh2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCXJldCA9IHNtcF9jYWxsX2Z1bmN0aW9uKGZ1bmMsIGluZm8sIHdhaXQpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZnVuYyhpbmZvKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChvbl9lYWNoX2NwdSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCAwODIzNzc4Li42OGViNWVmIDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTg4NSwyNSArODg1LDYgQEAKIH0KIGVhcmx5X2luaXRjYWxsKHNwYXduX2tzb2Z0aXJxZCk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0vKgotICogQ2FsbCBhIGZ1bmN0aW9uIG9uIGFsbCBwcm9jZXNzb3JzCi0gKi8KLWludCBvbl9lYWNoX2NwdSh2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLCBpbnQgd2FpdCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByZWVtcHRfZGlzYWJsZSgpOwotCXJldCA9IHNtcF9jYWxsX2Z1bmN0aW9uKGZ1bmMsIGluZm8sIHdhaXQpOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JZnVuYyhpbmZvKTsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChvbl9lYWNoX2NwdSk7Ci0jZW5kaWYKLQogLyoKICAqIFsgVGhlc2UgX193ZWFrIGFsaWFzZXMgYXJlIGtlcHQgaW4gYSBzZXBhcmF0ZSBjb21waWxhdGlvbiB1bml0LCBzbyB0aGF0CiAgKiAgIEdDQyBkb2VzIG5vdCBpbmxpbmUgdGhlbSBpbmNvcnJlY3RseS4gXQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDI3NDVkY2QuLjMxYjcxYTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTQzLDYgKzQzLDggQEAKICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0yODUsNiArMjg3LDcgQEAKICAqLwogdm9pZCBlbWVyZ2VuY3lfcmVzdGFydCh2b2lkKQogeworCWttc2dfZHVtcChLTVNHX0RVTVBfRU1FUkcpOwogCW1hY2hpbmVfZW1lcmdlbmN5X3Jlc3RhcnQoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtZXJnZW5jeV9yZXN0YXJ0KTsKQEAgLTMxMiw2ICszMTUsNyBAQAogCQlwcmludGsoS0VSTl9FTUVSRyAiUmVzdGFydGluZyBzeXN0ZW0uXG4iKTsKIAllbHNlCiAJCXByaW50ayhLRVJOX0VNRVJHICJSZXN0YXJ0aW5nIHN5c3RlbSB3aXRoIGNvbW1hbmQgJyVzJy5cbiIsIGNtZCk7CisJa21zZ19kdW1wKEtNU0dfRFVNUF9SRVNUQVJUKTsKIAltYWNoaW5lX3Jlc3RhcnQoY21kKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9yZXN0YXJ0KTsKQEAgLTMzMyw2ICszMzcsNyBAQAogCWtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKFNZU1RFTV9IQUxUKTsKIAlzeXNkZXZfc2h1dGRvd24oKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIGhhbHRlZC5cbiIpOworCWttc2dfZHVtcChLTVNHX0RVTVBfSEFMVCk7CiAJbWFjaGluZV9oYWx0KCk7CiB9CiAKQEAgLTM1MSw2ICszNTYsNyBAQAogCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7CiAJc3lzZGV2X3NodXRkb3duKCk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIlBvd2VyIGRvd24uXG4iKTsKKwlrbXNnX2R1bXAoS01TR19EVU1QX1BPV0VST0ZGKTsKIAltYWNoaW5lX3Bvd2VyX29mZigpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX3Bvd2VyX29mZik7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggYWU1Y2JiMS4uYmM4NmJiMyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtMjQ1LDEwICsyNDYsNiBAQAogCQkubW9kZQkJPSAwNTU1LAogCQkuY2hpbGQJCT0gZGV2X3RhYmxlLAogCX0sCi0vKgotICogTk9URTogZG8gbm90IGFkZCBuZXcgZW50cmllcyB0byB0aGlzIHRhYmxlIHVubGVzcyB5b3UgaGF2ZSByZWFkCi0gKiBEb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKLSAqLwogCXsgfQogfTsKIApAQCAtNzEwLDYgKzcwNywxNSBAQAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCQkuZXh0cmEyCQk9ICZvbmUsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJrcHRyX3Jlc3RyaWN0IiwKKwkJLmRhdGEJCT0gJmtwdHJfcmVzdHJpY3QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAmemVybywKKwkJLmV4dHJhMgkJPSAmdHdvLAorCX0sCiAjZW5kaWYKIAl7CiAJCS5wcm9jbmFtZQk9ICJuZ3JvdXBzX21heCIsCkBAIC05NjIsMTAgKzk2OCw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCX0sCiAjZW5kaWYKLS8qCi0gKiBOT1RFOiBkbyBub3QgYWRkIG5ldyBlbnRyaWVzIHRvIHRoaXMgdGFibGUgdW5sZXNzIHlvdSBoYXZlIHJlYWQKLSAqIERvY3VtZW50YXRpb24vc3lzY3RsL2N0bF91bm51bWJlcmVkLnR4dAotICovCiAJeyB9CiB9OwogCkBAIC0xMzI2LDExICsxMzI4LDYgQEAKIAkJLmV4dHJhMgkJPSAmb25lLAogCX0sCiAjZW5kaWYKLQotLyoKLSAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAotICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Ci0gKi8KIAl7IH0KIH07CiAKQEAgLTE0ODYsMTAgKzE0ODMsNiBAQAogCQkucHJvY19oYW5kbGVyCT0gJnBpcGVfcHJvY19mbiwKIAkJLmV4dHJhMQkJPSAmcGlwZV9taW5fc2l6ZSwKIAl9LAotLyoKLSAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAotICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Ci0gKi8KIAl7IH0KIH07CiAKQEAgLTI4OTksNyArMjg5Miw3IEBACiAJfQogfQogCi0jZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworI2Vsc2UgLyogQ09ORklHX1BST0NfU1lTQ1RMICovCiAKIGludCBwcm9jX2Rvc3RyaW5nKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCkBAIC0yOTUxLDcgKzI5NDQsNyBAQAogfQogCiAKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworI2VuZGlmIC8qIENPTkZJR19QUk9DX1NZU0NUTCAqLwogCiAvKgogICogTm8gc2Vuc2UgcHV0dGluZyB0aGlzIGFmdGVyIGVhY2ggc3ltYm9sIGRlZmluaXRpb24sIHR3aWNlLApkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bF9iaW5hcnkuYyBiL2tlcm5lbC9zeXNjdGxfYmluYXJ5LmMKaW5kZXggNGIyNTQ1YS4uYjg3NWJlZCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bF9iaW5hcnkuYworKysgYi9rZXJuZWwvc3lzY3RsX2JpbmFyeS5jCkBAIC0xMTkyLDcgKzExOTIsNyBAQAogCiAJCWJ1ZltyZXN1bHRdID0gJ1wwJzsKIAotCQkvKiBDb252ZXJ0IHRoZSBkZWNuZXQgYWRkcmVzc3MgdG8gYmluYXJ5ICovCisJCS8qIENvbnZlcnQgdGhlIGRlY25ldCBhZGRyZXNzIHRvIGJpbmFyeSAqLwogCQlyZXN1bHQgPSAtRUlPOwogCQlub2RlcCA9IHN0cmNocihidWYsICcuJykgKyAxOwogCQlpZiAoIW5vZGVwKQpkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IDY5NjkxZWIuLjM5NzFjNmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfSUE2NAorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiAhZGVmaW5lZChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUykKICNkZWZpbmUgVEFTS1NUQVRTX05FRURTX1BBRERJTkcgMQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGJhOWIzMzguLjMyMTc0MzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAgKiBBdm9pZCB1bm5lY2Vzc2FyeSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zIGluIHRoZQogICogdHdvIG1vc3QgY29tbW9uIEhaIGNhc2VzOgogICovCi11bnNpZ25lZCBpbnQgaW5saW5lIGppZmZpZXNfdG9fbXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQoraW5saW5lIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaikKIHsKICNpZiBIWiA8PSBNU0VDX1BFUl9TRUMgJiYgIShNU0VDX1BFUl9TRUMgJSBIWikKIAlyZXR1cm4gKE1TRUNfUEVSX1NFQyAvIEhaKSAqIGo7CkBAIC0yNTQsNyArMjU0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woamlmZmllc190b19tc2Vjcyk7CiAKLXVuc2lnbmVkIGludCBpbmxpbmUgamlmZmllc190b191c2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCitpbmxpbmUgdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQogewogI2lmIEhaIDw9IFVTRUNfUEVSX1NFQyAmJiAhKFVTRUNfUEVSX1NFQyAlIEhaKQogCXJldHVybiAoVVNFQ19QRVJfU0VDIC8gSFopICogajsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGRmMTQwY2QuLmM1MGEwMzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtNjc5LDcgKzY3OSw3IEBACiBpbnQgX19jbG9ja3NvdXJjZV9yZWdpc3Rlcl9zY2FsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCB1MzIgc2NhbGUsIHUzMiBmcmVxKQogewogCi0JLyogSW50aWFsaXplIG11bHQvc2hpZnQgYW5kIG1heF9pZGxlX25zICovCisJLyogSW5pdGlhbGl6ZSBtdWx0L3NoaWZ0IGFuZCBtYXhfaWRsZV9ucyAqLwogCV9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9zY2FsZShjcywgc2NhbGUsIGZyZXEpOwogCiAJLyogQWRkIGNsb2Nrc291cmNlIHRvIHRoZSBjbGNva3NvdXJjZSBsaXN0ICovCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9udHAuYyBiL2tlcm5lbC90aW1lL250cC5jCmluZGV4IGQyMzIxODkuLjVjMDAyNDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL250cC5jCisrKyBiL2tlcm5lbC90aW1lL250cC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogLyoKICAqIE5UUCB0aW1la2VlcGluZyB2YXJpYWJsZXM6CkBAIC03NCw2ICs3NSwxNjIgQEAKIC8qIGNvbnN0YW50IChib290LXBhcmFtIGNvbmZpZ3VyYWJsZSkgTlRQIHRpY2sgYWRqdXN0bWVudCAodXBzY2FsZWQpCSovCiBzdGF0aWMgczY0CQkJbnRwX3RpY2tfYWRqOwogCisjaWZkZWYgQ09ORklHX05UUF9QUFMKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSB1c2VkIHdoZW4gYSBwdWxzZS1wZXItc2Vjb25kIChQUFMpIHNpZ25hbAorICogaXMgYXZhaWxhYmxlLiBUaGV5IGVzdGFibGlzaCB0aGUgZW5naW5lZXJpbmcgcGFyYW1ldGVycyBvZiB0aGUgY2xvY2sKKyAqIGRpc2NpcGxpbmUgbG9vcCB3aGVuIGNvbnRyb2xsZWQgYnkgdGhlIFBQUyBzaWduYWwuCisgKi8KKyNkZWZpbmUgUFBTX1ZBTElECTEwCS8qIFBQUyBzaWduYWwgd2F0Y2hkb2cgbWF4IChzKSAqLworI2RlZmluZSBQUFNfUE9QQ09STgk0CS8qIHBvcGNvcm4gc3Bpa2UgdGhyZXNob2xkIChzaGlmdCkgKi8KKyNkZWZpbmUgUFBTX0lOVE1JTgkyCS8qIG1pbiBmcmVxIGludGVydmFsIChzKSAoc2hpZnQpICovCisjZGVmaW5lIFBQU19JTlRNQVgJOAkvKiBtYXggZnJlcSBpbnRlcnZhbCAocykgKHNoaWZ0KSAqLworI2RlZmluZSBQUFNfSU5UQ09VTlQJNAkvKiBudW1iZXIgb2YgY29uc2VjdXRpdmUgZ29vZCBpbnRlcnZhbHMgdG8KKwkJCQkgICBpbmNyZWFzZSBwcHNfc2hpZnQgb3IgY29uc2VjdXRpdmUgYmFkCisJCQkJICAgaW50ZXJ2YWxzIHRvIGRlY3JlYXNlIGl0ICovCisjZGVmaW5lIFBQU19NQVhXQU5ERVIJMTAwMDAwCS8qIG1heCBQUFMgZnJlcSB3YW5kZXIgKG5zL3MpICovCisKK3N0YXRpYyBpbnQgcHBzX3ZhbGlkOwkJLyogc2lnbmFsIHdhdGNoZG9nIGNvdW50ZXIgKi8KK3N0YXRpYyBsb25nIHBwc190ZlszXTsJCS8qIHBoYXNlIG1lZGlhbiBmaWx0ZXIgKi8KK3N0YXRpYyBsb25nIHBwc19qaXR0ZXI7CQkvKiBjdXJyZW50IGppdHRlciAobnMpICovCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHBwc19mYmFzZTsgLyogYmVnaW5uaW5nIG9mIHRoZSBsYXN0IGZyZXEgaW50ZXJ2YWwgKi8KK3N0YXRpYyBpbnQgcHBzX3NoaWZ0OwkJLyogY3VycmVudCBpbnRlcnZhbCBkdXJhdGlvbiAocykgKHNoaWZ0KSAqLworc3RhdGljIGludCBwcHNfaW50Y250OwkJLyogaW50ZXJ2YWwgY291bnRlciAqLworc3RhdGljIHM2NCBwcHNfZnJlcTsJCS8qIGZyZXF1ZW5jeSBvZmZzZXQgKHNjYWxlZCBucy9zKSAqLworc3RhdGljIGxvbmcgcHBzX3N0YWJpbDsJCS8qIGN1cnJlbnQgc3RhYmlsaXR5IChzY2FsZWQgbnMvcykgKi8KKworLyoKKyAqIFBQUyBzaWduYWwgcXVhbGl0eSBtb25pdG9ycworICovCitzdGF0aWMgbG9uZyBwcHNfY2FsY250OwkJLyogY2FsaWJyYXRpb24gaW50ZXJ2YWxzICovCitzdGF0aWMgbG9uZyBwcHNfaml0Y250OwkJLyogaml0dGVyIGxpbWl0IGV4Y2VlZGVkICovCitzdGF0aWMgbG9uZyBwcHNfc3RiY250OwkJLyogc3RhYmlsaXR5IGxpbWl0IGV4Y2VlZGVkICovCitzdGF0aWMgbG9uZyBwcHNfZXJyY250OwkJLyogY2FsaWJyYXRpb24gZXJyb3JzICovCisKKworLyogUFBTIGtlcm5lbCBjb25zdW1lciBjb21wZW5zYXRlcyB0aGUgd2hvbGUgcGhhc2UgZXJyb3IgaW1tZWRpYXRlbHkuCisgKiBPdGhlcndpc2UsIHJlZHVjZSB0aGUgb2Zmc2V0IGJ5IGEgZml4ZWQgZmFjdG9yIHRpbWVzIHRoZSB0aW1lIGNvbnN0YW50LgorICovCitzdGF0aWMgaW5saW5lIHM2NCBudHBfb2Zmc2V0X2NodW5rKHM2NCBvZmZzZXQpCit7CisJaWYgKHRpbWVfc3RhdHVzICYgU1RBX1BQU1RJTUUgJiYgdGltZV9zdGF0dXMgJiBTVEFfUFBTU0lHTkFMKQorCQlyZXR1cm4gb2Zmc2V0OworCWVsc2UKKwkJcmV0dXJuIHNoaWZ0X3JpZ2h0KG9mZnNldCwgU0hJRlRfUExMICsgdGltZV9jb25zdGFudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfcmVzZXRfZnJlcV9pbnRlcnZhbCh2b2lkKQoreworCS8qIHRoZSBQUFMgY2FsaWJyYXRpb24gaW50ZXJ2YWwgbWF5IGVuZAorCSAgIHN1cnByaXNpbmdseSBlYXJseSAqLworCXBwc19zaGlmdCA9IFBQU19JTlRNSU47CisJcHBzX2ludGNudCA9IDA7Cit9CisKKy8qKgorICogcHBzX2NsZWFyIC0gQ2xlYXJzIHRoZSBQUFMgc3RhdGUgdmFyaWFibGVzCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyBhIHdyaXRlIG9uIHRoZSB4dGltZV9sb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfY2xlYXIodm9pZCkKK3sKKwlwcHNfcmVzZXRfZnJlcV9pbnRlcnZhbCgpOworCXBwc190ZlswXSA9IDA7CisJcHBzX3RmWzFdID0gMDsKKwlwcHNfdGZbMl0gPSAwOworCXBwc19mYmFzZS50dl9zZWMgPSBwcHNfZmJhc2UudHZfbnNlYyA9IDA7CisJcHBzX2ZyZXEgPSAwOworfQorCisvKiBEZWNyZWFzZSBwcHNfdmFsaWQgdG8gaW5kaWNhdGUgdGhhdCBhbm90aGVyIHNlY29uZCBoYXMgcGFzc2VkIHNpbmNlCisgKiB0aGUgbGFzdCBQUFMgc2lnbmFsLiBXaGVuIGl0IHJlYWNoZXMgMCwgaW5kaWNhdGUgdGhhdCBQUFMgc2lnbmFsIGlzCisgKiBtaXNzaW5nLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgYSB3cml0ZSBvbiB0aGUgeHRpbWVfbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHBzX2RlY192YWxpZCh2b2lkKQoreworCWlmIChwcHNfdmFsaWQgPiAwKQorCQlwcHNfdmFsaWQtLTsKKwllbHNlIHsKKwkJdGltZV9zdGF0dXMgJj0gfihTVEFfUFBTU0lHTkFMIHwgU1RBX1BQU0pJVFRFUiB8CisJCQkJIFNUQV9QUFNXQU5ERVIgfCBTVEFfUFBTRVJST1IpOworCQlwcHNfY2xlYXIoKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfc2V0X2ZyZXEoczY0IGZyZXEpCit7CisJcHBzX2ZyZXEgPSBmcmVxOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19lcnJvcl9zdGF0dXMoaW50IHN0YXR1cykKK3sKKwlyZXR1cm4gKHRpbWVfc3RhdHVzICYgKFNUQV9VTlNZTkN8U1RBX0NMT0NLRVJSKSkKKwkJLyogUFBTIHNpZ25hbCBsb3N0IHdoZW4gZWl0aGVyIFBQUyB0aW1lIG9yCisJCSAqIFBQUyBmcmVxdWVuY3kgc3luY2hyb25pemF0aW9uIHJlcXVlc3RlZAorCQkgKi8KKwkJfHwgKCh0aW1lX3N0YXR1cyAmIChTVEFfUFBTRlJFUXxTVEFfUFBTVElNRSkpCisJCQkmJiAhKHRpbWVfc3RhdHVzICYgU1RBX1BQU1NJR05BTCkpCisJCS8qIFBQUyBqaXR0ZXIgZXhjZWVkZWQgd2hlbgorCQkgKiBQUFMgdGltZSBzeW5jaHJvbml6YXRpb24gcmVxdWVzdGVkICovCisJCXx8ICgodGltZV9zdGF0dXMgJiAoU1RBX1BQU1RJTUV8U1RBX1BQU0pJVFRFUikpCisJCQk9PSAoU1RBX1BQU1RJTUV8U1RBX1BQU0pJVFRFUikpCisJCS8qIFBQUyB3YW5kZXIgZXhjZWVkZWQgb3IgY2FsaWJyYXRpb24gZXJyb3Igd2hlbgorCQkgKiBQUFMgZnJlcXVlbmN5IHN5bmNocm9uaXphdGlvbiByZXF1ZXN0ZWQKKwkJICovCisJCXx8ICgodGltZV9zdGF0dXMgJiBTVEFfUFBTRlJFUSkKKwkJCSYmICh0aW1lX3N0YXR1cyAmIChTVEFfUFBTV0FOREVSfFNUQV9QUFNFUlJPUikpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBwc19maWxsX3RpbWV4KHN0cnVjdCB0aW1leCAqdHhjKQoreworCXR4Yy0+cHBzZnJlcQkgICA9IHNoaWZ0X3JpZ2h0KChwcHNfZnJlcSA+PiBQUE1fU0NBTEVfSU5WX1NISUZUKSAqCisJCQkJCSBQUE1fU0NBTEVfSU5WLCBOVFBfU0NBTEVfU0hJRlQpOworCXR4Yy0+aml0dGVyCSAgID0gcHBzX2ppdHRlcjsKKwlpZiAoISh0aW1lX3N0YXR1cyAmIFNUQV9OQU5PKSkKKwkJdHhjLT5qaXR0ZXIgLz0gTlNFQ19QRVJfVVNFQzsKKwl0eGMtPnNoaWZ0CSAgID0gcHBzX3NoaWZ0OworCXR4Yy0+c3RhYmlsCSAgID0gcHBzX3N0YWJpbDsKKwl0eGMtPmppdGNudAkgICA9IHBwc19qaXRjbnQ7CisJdHhjLT5jYWxjbnQJICAgPSBwcHNfY2FsY250OworCXR4Yy0+ZXJyY250CSAgID0gcHBzX2VycmNudDsKKwl0eGMtPnN0YmNudAkgICA9IHBwc19zdGJjbnQ7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfTlRQX1BQUyAqLworCitzdGF0aWMgaW5saW5lIHM2NCBudHBfb2Zmc2V0X2NodW5rKHM2NCBvZmZzZXQpCit7CisJcmV0dXJuIHNoaWZ0X3JpZ2h0KG9mZnNldCwgU0hJRlRfUExMICsgdGltZV9jb25zdGFudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfcmVzZXRfZnJlcV9pbnRlcnZhbCh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHBwc19jbGVhcih2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHBwc19kZWNfdmFsaWQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfc2V0X2ZyZXEoczY0IGZyZXEpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Vycm9yX3N0YXR1cyhpbnQgc3RhdHVzKQoreworCXJldHVybiBzdGF0dXMgJiAoU1RBX1VOU1lOQ3xTVEFfQ0xPQ0tFUlIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHBzX2ZpbGxfdGltZXgoc3RydWN0IHRpbWV4ICp0eGMpCit7CisJLyogUFBTIGlzIG5vdCBpbXBsZW1lbnRlZCwgc28gdGhlc2UgYXJlIHplcm8gKi8KKwl0eGMtPnBwc2ZyZXEJICAgPSAwOworCXR4Yy0+aml0dGVyCSAgID0gMDsKKwl0eGMtPnNoaWZ0CSAgID0gMDsKKwl0eGMtPnN0YWJpbAkgICA9IDA7CisJdHhjLT5qaXRjbnQJICAgPSAwOworCXR4Yy0+Y2FsY250CSAgID0gMDsKKwl0eGMtPmVycmNudAkgICA9IDA7CisJdHhjLT5zdGJjbnQJICAgPSAwOworfQorCisjZW5kaWYgLyogQ09ORklHX05UUF9QUFMgKi8KKwogLyoKICAqIE5UUCBtZXRob2RzOgogICovCkBAIC0xODUsNiArMzQyLDkgQEAKIAogCXRpY2tfbGVuZ3RoCT0gdGlja19sZW5ndGhfYmFzZTsKIAl0aW1lX29mZnNldAk9IDA7CisKKwkvKiBDbGVhciBQUFMgc3RhdGUgdmFyaWFibGVzICovCisJcHBzX2NsZWFyKCk7CiB9CiAKIC8qCkBAIC0yNTAsMTYgKzQxMCwxNiBAQAogCQl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOwogCX0KIAotCS8qCi0JICogQ29tcHV0ZSB0aGUgcGhhc2UgYWRqdXN0bWVudCBmb3IgdGhlIG5leHQgc2Vjb25kLiBUaGUgb2Zmc2V0IGlzCi0JICogcmVkdWNlZCBieSBhIGZpeGVkIGZhY3RvciB0aW1lcyB0aGUgdGltZSBjb25zdGFudC4KLQkgKi8KKwkvKiBDb21wdXRlIHRoZSBwaGFzZSBhZGp1c3RtZW50IGZvciB0aGUgbmV4dCBzZWNvbmQgKi8KIAl0aWNrX2xlbmd0aAkgPSB0aWNrX2xlbmd0aF9iYXNlOwogCi0JZGVsdGEJCSA9IHNoaWZ0X3JpZ2h0KHRpbWVfb2Zmc2V0LCBTSElGVF9QTEwgKyB0aW1lX2NvbnN0YW50KTsKKwlkZWx0YQkJID0gbnRwX29mZnNldF9jaHVuayh0aW1lX29mZnNldCk7CiAJdGltZV9vZmZzZXQJLT0gZGVsdGE7CiAJdGlja19sZW5ndGgJKz0gZGVsdGE7CiAKKwkvKiBDaGVjayBQUFMgc2lnbmFsICovCisJcHBzX2RlY192YWxpZCgpOworCiAJaWYgKCF0aW1lX2FkanVzdCkKIAkJcmV0dXJuOwogCkBAIC0zNjksNiArNTI5LDggQEAKIAlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1BMTCkgJiYgISh0eGMtPnN0YXR1cyAmIFNUQV9QTEwpKSB7CiAJCXRpbWVfc3RhdGUgPSBUSU1FX09LOwogCQl0aW1lX3N0YXR1cyA9IFNUQV9VTlNZTkM7CisJCS8qIHJlc3RhcnQgUFBTIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbiAqLworCQlwcHNfcmVzZXRfZnJlcV9pbnRlcnZhbCgpOwogCX0KIAogCS8qCkBAIC00MTgsNiArNTgwLDggQEAKIAkJdGltZV9mcmVxID0gdHhjLT5mcmVxICogUFBNX1NDQUxFOwogCQl0aW1lX2ZyZXEgPSBtaW4odGltZV9mcmVxLCBNQVhGUkVRX1NDQUxFRCk7CiAJCXRpbWVfZnJlcSA9IG1heCh0aW1lX2ZyZXEsIC1NQVhGUkVRX1NDQUxFRCk7CisJCS8qIHVwZGF0ZSBwcHNfZnJlcSAqLworCQlwcHNfc2V0X2ZyZXEodGltZV9mcmVxKTsKIAl9CiAKIAlpZiAodHhjLT5tb2RlcyAmIEFESl9NQVhFUlJPUikKQEAgLTUwOCw3ICs2NzIsOCBAQAogCX0KIAogCXJlc3VsdCA9IHRpbWVfc3RhdGU7CS8qIG1vc3RseSBgVElNRV9PSycgKi8KLQlpZiAodGltZV9zdGF0dXMgJiAoU1RBX1VOU1lOQ3xTVEFfQ0xPQ0tFUlIpKQorCS8qIGNoZWNrIGZvciBlcnJvcnMgKi8KKwlpZiAoaXNfZXJyb3Jfc3RhdHVzKHRpbWVfc3RhdHVzKSkKIAkJcmVzdWx0ID0gVElNRV9FUlJPUjsKIAogCXR4Yy0+ZnJlcQkgICA9IHNoaWZ0X3JpZ2h0KCh0aW1lX2ZyZXEgPj4gUFBNX1NDQUxFX0lOVl9TSElGVCkgKgpAQCAtNTIyLDE1ICs2ODcsOCBAQAogCXR4Yy0+dGljawkgICA9IHRpY2tfdXNlYzsKIAl0eGMtPnRhaQkgICA9IHRpbWVfdGFpOwogCi0JLyogUFBTIGlzIG5vdCBpbXBsZW1lbnRlZCwgc28gdGhlc2UgYXJlIHplcm8gKi8KLQl0eGMtPnBwc2ZyZXEJICAgPSAwOwotCXR4Yy0+aml0dGVyCSAgID0gMDsKLQl0eGMtPnNoaWZ0CSAgID0gMDsKLQl0eGMtPnN0YWJpbAkgICA9IDA7Ci0JdHhjLT5qaXRjbnQJICAgPSAwOwotCXR4Yy0+Y2FsY250CSAgID0gMDsKLQl0eGMtPmVycmNudAkgICA9IDA7Ci0JdHhjLT5zdGJjbnQJICAgPSAwOworCS8qIGZpbGwgUFBTIHN0YXR1cyBmaWVsZHMgKi8KKwlwcHNfZmlsbF90aW1leCh0eGMpOwogCiAJd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7CiAKQEAgLTU0NCw2ICs3MDIsMjQzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorI2lmZGVmCUNPTkZJR19OVFBfUFBTCisKKy8qIGFjdHVhbGx5IHN0cnVjdCBwcHNfbm9ybXRpbWUgaXMgZ29vZCBvbGQgc3RydWN0IHRpbWVzcGVjLCBidXQgaXQgaXMKKyAqIHNlbWFudGljYWxseSBkaWZmZXJlbnQgKGFuZCBpdCBpcyB0aGUgcmVhc29uIHdoeSBpdCB3YXMgaW52ZW50ZWQpOgorICogcHBzX25vcm10aW1lLm5zZWMgaGFzIGEgcmFuZ2Ugb2YgKCAtTlNFQ19QRVJfU0VDIC8gMiwgTlNFQ19QRVJfU0VDIC8gMiBdCisgKiB3aGlsZSB0aW1lc3BlYy50dl9uc2VjIGhhcyBhIHJhbmdlIG9mIFswLCBOU0VDX1BFUl9TRUMpICovCitzdHJ1Y3QgcHBzX25vcm10aW1lIHsKKwlfX2tlcm5lbF90aW1lX3QJc2VjOwkvKiBzZWNvbmRzICovCisJbG9uZwkJbnNlYzsJLyogbmFub3NlY29uZHMgKi8KK307CisKKy8qIG5vcm1hbGl6ZSB0aGUgdGltZXN0YW1wIHNvIHRoYXQgbnNlYyBpcyBpbiB0aGUKKyAgICggLU5TRUNfUEVSX1NFQyAvIDIsIE5TRUNfUEVSX1NFQyAvIDIgXSBpbnRlcnZhbCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBzX25vcm10aW1lIHBwc19ub3JtYWxpemVfdHMoc3RydWN0IHRpbWVzcGVjIHRzKQoreworCXN0cnVjdCBwcHNfbm9ybXRpbWUgbm9ybSA9IHsKKwkJLnNlYyA9IHRzLnR2X3NlYywKKwkJLm5zZWMgPSB0cy50dl9uc2VjCisJfTsKKworCWlmIChub3JtLm5zZWMgPiAoTlNFQ19QRVJfU0VDID4+IDEpKSB7CisJCW5vcm0ubnNlYyAtPSBOU0VDX1BFUl9TRUM7CisJCW5vcm0uc2VjKys7CisJfQorCisJcmV0dXJuIG5vcm07Cit9CisKKy8qIGdldCBjdXJyZW50IHBoYXNlIGNvcnJlY3Rpb24gYW5kIGppdHRlciAqLworc3RhdGljIGlubGluZSBsb25nIHBwc19waGFzZV9maWx0ZXJfZ2V0KGxvbmcgKmppdHRlcikKK3sKKwkqaml0dGVyID0gcHBzX3RmWzBdIC0gcHBzX3RmWzFdOworCWlmICgqaml0dGVyIDwgMCkKKwkJKmppdHRlciA9IC0qaml0dGVyOworCisJLyogVE9ETzogdGVzdCB2YXJpb3VzIGZpbHRlcnMgKi8KKwlyZXR1cm4gcHBzX3RmWzBdOworfQorCisvKiBhZGQgdGhlIHNhbXBsZSB0byB0aGUgcGhhc2UgZmlsdGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHBzX3BoYXNlX2ZpbHRlcl9hZGQobG9uZyBlcnIpCit7CisJcHBzX3RmWzJdID0gcHBzX3RmWzFdOworCXBwc190ZlsxXSA9IHBwc190ZlswXTsKKwlwcHNfdGZbMF0gPSBlcnI7Cit9CisKKy8qIGRlY3JlYXNlIGZyZXF1ZW5jeSBjYWxpYnJhdGlvbiBpbnRlcnZhbCBsZW5ndGguCisgKiBJdCBpcyBoYWx2ZWQgYWZ0ZXIgZm91ciBjb25zZWN1dGl2ZSB1bnN0YWJsZSBpbnRlcnZhbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfZGVjX2ZyZXFfaW50ZXJ2YWwodm9pZCkKK3sKKwlpZiAoLS1wcHNfaW50Y250IDw9IC1QUFNfSU5UQ09VTlQpIHsKKwkJcHBzX2ludGNudCA9IC1QUFNfSU5UQ09VTlQ7CisJCWlmIChwcHNfc2hpZnQgPiBQUFNfSU5UTUlOKSB7CisJCQlwcHNfc2hpZnQtLTsKKwkJCXBwc19pbnRjbnQgPSAwOworCQl9CisJfQorfQorCisvKiBpbmNyZWFzZSBmcmVxdWVuY3kgY2FsaWJyYXRpb24gaW50ZXJ2YWwgbGVuZ3RoLgorICogSXQgaXMgZG91YmxlZCBhZnRlciBmb3VyIGNvbnNlY3V0aXZlIHN0YWJsZSBpbnRlcnZhbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcHNfaW5jX2ZyZXFfaW50ZXJ2YWwodm9pZCkKK3sKKwlpZiAoKytwcHNfaW50Y250ID49IFBQU19JTlRDT1VOVCkgeworCQlwcHNfaW50Y250ID0gUFBTX0lOVENPVU5UOworCQlpZiAocHBzX3NoaWZ0IDwgUFBTX0lOVE1BWCkgeworCQkJcHBzX3NoaWZ0Kys7CisJCQlwcHNfaW50Y250ID0gMDsKKwkJfQorCX0KK30KKworLyogdXBkYXRlIGNsb2NrIGZyZXF1ZW5jeSBiYXNlZCBvbiBNT05PVE9OSUNfUkFXIGNsb2NrIFBQUyBzaWduYWwKKyAqIHRpbWVzdGFtcHMKKyAqCisgKiBBdCB0aGUgZW5kIG9mIHRoZSBjYWxpYnJhdGlvbiBpbnRlcnZhbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICogZmlyc3QgYW5kIGxhc3QgTU9OT1RPTklDX1JBVyBjbG9jayB0aW1lc3RhbXBzIGRpdmlkZWQgYnkgdGhlIGxlbmd0aAorICogb2YgdGhlIGludGVydmFsIGJlY29tZXMgdGhlIGZyZXF1ZW5jeSB1cGRhdGUuIElmIHRoZSBpbnRlcnZhbCB3YXMKKyAqIHRvbyBsb25nLCB0aGUgZGF0YSBhcmUgZGlzY2FyZGVkLgorICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IGZyZXF1ZW5jeSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBsb25nIGhhcmRwcHNfdXBkYXRlX2ZyZXEoc3RydWN0IHBwc19ub3JtdGltZSBmcmVxX25vcm0pCit7CisJbG9uZyBkZWx0YSwgZGVsdGFfbW9kOworCXM2NCBmdGVtcDsKKworCS8qIGNoZWNrIGlmIHRoZSBmcmVxdWVuY3kgaW50ZXJ2YWwgd2FzIHRvbyBsb25nICovCisJaWYgKGZyZXFfbm9ybS5zZWMgPiAoMiA8PCBwcHNfc2hpZnQpKSB7CisJCXRpbWVfc3RhdHVzIHw9IFNUQV9QUFNFUlJPUjsKKwkJcHBzX2VycmNudCsrOworCQlwcHNfZGVjX2ZyZXFfaW50ZXJ2YWwoKTsKKwkJcHJfZXJyKCJoYXJkcHBzOiBQUFNFUlJPUjogaW50ZXJ2YWwgdG9vIGxvbmcgLSAlbGQgc1xuIiwKKwkJCQlmcmVxX25vcm0uc2VjKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaGVyZSB0aGUgcmF3IGZyZXF1ZW5jeSBvZmZzZXQgYW5kIHdhbmRlciAoc3RhYmlsaXR5KSBpcworCSAqIGNhbGN1bGF0ZWQuIElmIHRoZSB3YW5kZXIgaXMgbGVzcyB0aGFuIHRoZSB3YW5kZXIgdGhyZXNob2xkCisJICogdGhlIGludGVydmFsIGlzIGluY3JlYXNlZDsgb3RoZXJ3aXNlIGl0IGlzIGRlY3JlYXNlZC4KKwkgKi8KKwlmdGVtcCA9IGRpdl9zNjQoKChzNjQpKC1mcmVxX25vcm0ubnNlYykpIDw8IE5UUF9TQ0FMRV9TSElGVCwKKwkJCWZyZXFfbm9ybS5zZWMpOworCWRlbHRhID0gc2hpZnRfcmlnaHQoZnRlbXAgLSBwcHNfZnJlcSwgTlRQX1NDQUxFX1NISUZUKTsKKwlwcHNfZnJlcSA9IGZ0ZW1wOworCWlmIChkZWx0YSA+IFBQU19NQVhXQU5ERVIgfHwgZGVsdGEgPCAtUFBTX01BWFdBTkRFUikgeworCQlwcl93YXJuaW5nKCJoYXJkcHBzOiBQUFNXQU5ERVI6IGNoYW5nZT0lbGRcbiIsIGRlbHRhKTsKKwkJdGltZV9zdGF0dXMgfD0gU1RBX1BQU1dBTkRFUjsKKwkJcHBzX3N0YmNudCsrOworCQlwcHNfZGVjX2ZyZXFfaW50ZXJ2YWwoKTsKKwl9IGVsc2UgewkvKiBnb29kIHNhbXBsZSAqLworCQlwcHNfaW5jX2ZyZXFfaW50ZXJ2YWwoKTsKKwl9CisKKwkvKiB0aGUgc3RhYmlsaXR5IG1ldHJpYyBpcyBjYWxjdWxhdGVkIGFzIHRoZSBhdmVyYWdlIG9mIHJlY2VudAorCSAqIGZyZXF1ZW5jeSBjaGFuZ2VzLCBidXQgaXMgdXNlZCBvbmx5IGZvciBwZXJmb3JtYW5jZQorCSAqIG1vbml0b3JpbmcKKwkgKi8KKwlkZWx0YV9tb2QgPSBkZWx0YTsKKwlpZiAoZGVsdGFfbW9kIDwgMCkKKwkJZGVsdGFfbW9kID0gLWRlbHRhX21vZDsKKwlwcHNfc3RhYmlsICs9IChkaXZfczY0KCgoczY0KWRlbHRhX21vZCkgPDwKKwkJCQkoTlRQX1NDQUxFX1NISUZUIC0gU0hJRlRfVVNFQyksCisJCQkJTlNFQ19QRVJfVVNFQykgLSBwcHNfc3RhYmlsKSA+PiBQUFNfSU5UTUlOOworCisJLyogaWYgZW5hYmxlZCwgdGhlIHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgaXMgdXBkYXRlZCAqLworCWlmICgodGltZV9zdGF0dXMgJiBTVEFfUFBTRlJFUSkgIT0gMCAmJgorCSAgICAodGltZV9zdGF0dXMgJiBTVEFfRlJFUUhPTEQpID09IDApIHsKKwkJdGltZV9mcmVxID0gcHBzX2ZyZXE7CisJCW50cF91cGRhdGVfZnJlcXVlbmN5KCk7CisJfQorCisJcmV0dXJuIGRlbHRhOworfQorCisvKiBjb3JyZWN0IFJFQUxUSU1FIGNsb2NrIHBoYXNlIGVycm9yIGFnYWluc3QgUFBTIHNpZ25hbCAqLworc3RhdGljIHZvaWQgaGFyZHBwc191cGRhdGVfcGhhc2UobG9uZyBlcnJvcikKK3sKKwlsb25nIGNvcnJlY3Rpb24gPSAtZXJyb3I7CisJbG9uZyBqaXR0ZXI7CisKKwkvKiBhZGQgdGhlIHNhbXBsZSB0byB0aGUgbWVkaWFuIGZpbHRlciAqLworCXBwc19waGFzZV9maWx0ZXJfYWRkKGNvcnJlY3Rpb24pOworCWNvcnJlY3Rpb24gPSBwcHNfcGhhc2VfZmlsdGVyX2dldCgmaml0dGVyKTsKKworCS8qIE5vbWluYWwgaml0dGVyIGlzIGR1ZSB0byBQUFMgc2lnbmFsIG5vaXNlLiBJZiBpdCBleGNlZWRzIHRoZQorCSAqIHRocmVzaG9sZCwgdGhlIHNhbXBsZSBpcyBkaXNjYXJkZWQ7IG90aGVyd2lzZSwgaWYgc28gZW5hYmxlZCwKKwkgKiB0aGUgdGltZSBvZmZzZXQgaXMgdXBkYXRlZC4KKwkgKi8KKwlpZiAoaml0dGVyID4gKHBwc19qaXR0ZXIgPDwgUFBTX1BPUENPUk4pKSB7CisJCXByX3dhcm5pbmcoImhhcmRwcHM6IFBQU0pJVFRFUjogaml0dGVyPSVsZCwgbGltaXQ9JWxkXG4iLAorCQkgICAgICAgaml0dGVyLCAocHBzX2ppdHRlciA8PCBQUFNfUE9QQ09STikpOworCQl0aW1lX3N0YXR1cyB8PSBTVEFfUFBTSklUVEVSOworCQlwcHNfaml0Y250Kys7CisJfSBlbHNlIGlmICh0aW1lX3N0YXR1cyAmIFNUQV9QUFNUSU1FKSB7CisJCS8qIGNvcnJlY3QgdGhlIHRpbWUgdXNpbmcgdGhlIHBoYXNlIG9mZnNldCAqLworCQl0aW1lX29mZnNldCA9IGRpdl9zNjQoKChzNjQpY29ycmVjdGlvbikgPDwgTlRQX1NDQUxFX1NISUZULAorCQkJCU5UUF9JTlRFUlZBTF9GUkVRKTsKKwkJLyogY2FuY2VsIHJ1bm5pbmcgYWRqdGltZSgpICovCisJCXRpbWVfYWRqdXN0ID0gMDsKKwl9CisJLyogdXBkYXRlIGppdHRlciAqLworCXBwc19qaXR0ZXIgKz0gKGppdHRlciAtIHBwc19qaXR0ZXIpID4+IFBQU19JTlRNSU47Cit9CisKKy8qCisgKiBoYXJkcHBzKCkgLSBkaXNjaXBsaW5lIENQVSBjbG9jayBvc2NpbGxhdG9yIHRvIGV4dGVybmFsIFBQUyBzaWduYWwKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGF0IGVhY2ggUFBTIHNpZ25hbCBhcnJpdmFsIGluIG9yZGVyIHRvCisgKiBkaXNjaXBsaW5lIHRoZSBDUFUgY2xvY2sgb3NjaWxsYXRvciB0byB0aGUgUFBTIHNpZ25hbC4gSXQgdGFrZXMgdHdvCisgKiBwYXJhbWV0ZXJzOiBSRUFMVElNRSBhbmQgTU9OT1RPTklDX1JBVyBjbG9jayB0aW1lc3RhbXBzLiBUaGUgZm9ybWVyCisgKiBpcyB1c2VkIHRvIGNvcnJlY3QgY2xvY2sgcGhhc2UgZXJyb3IgYW5kIHRoZSBsYXR0ZXIgaXMgdXNlZCB0bworICogY29ycmVjdCB0aGUgZnJlcXVlbmN5LgorICoKKyAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBEYXZpZCBNaWxscydzIHJlZmVyZW5jZSBuYW5va2VybmVsCisgKiBpbXBsZW1lbnRhdGlvbi4gSXQgd2FzIG1vc3RseSByZXdyaXR0ZW4gYnV0IGtlZXBzIHRoZSBzYW1lIGlkZWEuCisgKi8KK3ZvaWQgaGFyZHBwcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnBoYXNlX3RzLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJhd190cykKK3sKKwlzdHJ1Y3QgcHBzX25vcm10aW1lIHB0c19ub3JtLCBmcmVxX25vcm07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXB0c19ub3JtID0gcHBzX25vcm1hbGl6ZV90cygqcGhhc2VfdHMpOworCisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisKKwkvKiBjbGVhciB0aGUgZXJyb3IgYml0cywgdGhleSB3aWxsIGJlIHNldCBhZ2FpbiBpZiBuZWVkZWQgKi8KKwl0aW1lX3N0YXR1cyAmPSB+KFNUQV9QUFNKSVRURVIgfCBTVEFfUFBTV0FOREVSIHwgU1RBX1BQU0VSUk9SKTsKKworCS8qIGluZGljYXRlIHNpZ25hbCBwcmVzZW5jZSAqLworCXRpbWVfc3RhdHVzIHw9IFNUQV9QUFNTSUdOQUw7CisJcHBzX3ZhbGlkID0gUFBTX1ZBTElEOworCisJLyogd2hlbiBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLAorCSAqIGp1c3Qgc3RhcnQgdGhlIGZyZXF1ZW5jeSBpbnRlcnZhbCAqLworCWlmICh1bmxpa2VseShwcHNfZmJhc2UudHZfc2VjID09IDApKSB7CisJCXBwc19mYmFzZSA9ICpyYXdfdHM7CisJCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBvaywgbm93IHdlIGhhdmUgYSBiYXNlIGZvciBmcmVxdWVuY3kgY2FsY3VsYXRpb24gKi8KKwlmcmVxX25vcm0gPSBwcHNfbm9ybWFsaXplX3RzKHRpbWVzcGVjX3N1YigqcmF3X3RzLCBwcHNfZmJhc2UpKTsKKworCS8qIGNoZWNrIHRoYXQgdGhlIHNpZ25hbCBpcyBpbiB0aGUgcmFuZ2UKKwkgKiBbMXMgLSBNQVhGUkVRIHVzLCAxcyArIE1BWEZSRVEgdXNdLCBvdGhlcndpc2UgcmVqZWN0IGl0ICovCisJaWYgKChmcmVxX25vcm0uc2VjID09IDApIHx8CisJCQkoZnJlcV9ub3JtLm5zZWMgPiBNQVhGUkVRICogZnJlcV9ub3JtLnNlYykgfHwKKwkJCShmcmVxX25vcm0ubnNlYyA8IC1NQVhGUkVRICogZnJlcV9ub3JtLnNlYykpIHsKKwkJdGltZV9zdGF0dXMgfD0gU1RBX1BQU0pJVFRFUjsKKwkJLyogcmVzdGFydCB0aGUgZnJlcXVlbmN5IGNhbGlicmF0aW9uIGludGVydmFsICovCisJCXBwc19mYmFzZSA9ICpyYXdfdHM7CisJCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXByX2VycigiaGFyZHBwczogUFBTSklUVEVSOiBiYWQgcHVsc2VcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc2lnbmFsIGlzIG9rICovCisKKwkvKiBjaGVjayBpZiB0aGUgY3VycmVudCBmcmVxdWVuY3kgaW50ZXJ2YWwgaXMgZmluaXNoZWQgKi8KKwlpZiAoZnJlcV9ub3JtLnNlYyA+PSAoMSA8PCBwcHNfc2hpZnQpKSB7CisJCXBwc19jYWxjbnQrKzsKKwkJLyogcmVzdGFydCB0aGUgZnJlcXVlbmN5IGNhbGlicmF0aW9uIGludGVydmFsICovCisJCXBwc19mYmFzZSA9ICpyYXdfdHM7CisJCWhhcmRwcHNfdXBkYXRlX2ZyZXEoZnJlcV9ub3JtKTsKKwl9CisKKwloYXJkcHBzX3VwZGF0ZV9waGFzZShwdHNfbm9ybS5uc2VjKTsKKworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGhhcmRwcHMpOworCisjZW5kaWYJLyogQ09ORklHX05UUF9QUFMgKi8KKwogc3RhdGljIGludCBfX2luaXQgbnRwX3RpY2tfYWRqX3NldHVwKGNoYXIgKnN0cikKIHsKIAludHBfdGlja19hZGogPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCA1YmI4NmRhLi41NTM2YWFmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTI4OCw2ICsyODgsNDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt0aW1lX2dldF90cyk7CiAKKyNpZmRlZiBDT05GSUdfTlRQX1BQUworCisvKioKKyAqIGdldG5zdGltZV9yYXdfYW5kX3JlYWwgLSBnZXQgZGF5IGFuZCByYXcgbW9ub3RvbmljIHRpbWUgaW4gdGltZXNwZWMgZm9ybWF0CisgKiBAdHNfcmF3Oglwb2ludGVyIHRvIHRoZSB0aW1lc3BlYyB0byBiZSBzZXQgdG8gcmF3IG1vbm90b25pYyB0aW1lCisgKiBAdHNfcmVhbDoJcG9pbnRlciB0byB0aGUgdGltZXNwZWMgdG8gYmUgc2V0IHRvIHRoZSB0aW1lIG9mIGRheQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgYm90aCB0aGUgdGltZSBvZiBkYXkgYW5kIHJhdyBtb25vdG9uaWMgdGltZSBhdCB0aGUKKyAqIHNhbWUgdGltZSBhdG9taWNhbGx5IGFuZCBzdG9yZXMgdGhlIHJlc3VsdGluZyB0aW1lc3RhbXBzIGluIHRpbWVzcGVjCisgKiBmb3JtYXQuCisgKi8KK3ZvaWQgZ2V0bnN0aW1lX3Jhd19hbmRfcmVhbChzdHJ1Y3QgdGltZXNwZWMgKnRzX3Jhdywgc3RydWN0IHRpbWVzcGVjICp0c19yZWFsKQoreworCXVuc2lnbmVkIGxvbmcgc2VxOworCXM2NCBuc2Vjc19yYXcsIG5zZWNzX3JlYWw7CisKKwlXQVJOX09OX09OQ0UodGltZWtlZXBpbmdfc3VzcGVuZGVkKTsKKworCWRvIHsKKwkJdTMyIGFyY2hfb2Zmc2V0OworCisJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCisJCSp0c19yYXcgPSByYXdfdGltZTsKKwkJKnRzX3JlYWwgPSB4dGltZTsKKworCQluc2Vjc19yYXcgPSB0aW1la2VlcGluZ19nZXRfbnNfcmF3KCk7CisJCW5zZWNzX3JlYWwgPSB0aW1la2VlcGluZ19nZXRfbnMoKTsKKworCQkvKiBJZiBhcmNoIHJlcXVpcmVzLCBhZGQgaW4gZ2V0dGltZW9mZnNldCgpICovCisJCWFyY2hfb2Zmc2V0ID0gYXJjaF9nZXR0aW1lb2Zmc2V0KCk7CisJCW5zZWNzX3JhdyArPSBhcmNoX29mZnNldDsKKwkJbnNlY3NfcmVhbCArPSBhcmNoX29mZnNldDsKKworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJdGltZXNwZWNfYWRkX25zKHRzX3JhdywgbnNlY3NfcmF3KTsKKwl0aW1lc3BlY19hZGRfbnModHNfcmVhbCwgbnNlY3NfcmVhbCk7Cit9CitFWFBPUlRfU1lNQk9MKGdldG5zdGltZV9yYXdfYW5kX3JlYWwpOworCisjZW5kaWYgLyogQ09ORklHX05UUF9QUFMgKi8KKwogLyoqCiAgKiBkb19nZXR0aW1lb2ZkYXkgLSBSZXR1cm5zIHRoZSB0aW1lIG9mIGRheSBpbiBhIHRpbWV2YWwKICAqIEB0djoJCXBvaW50ZXIgdG8gdGhlIHRpbWV2YWwgdG8gYmUgc2V0CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKaW5kZXggNTNmMzM4MS4uNzYxYzUxMCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL01ha2VmaWxlCisrKyBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQpAQCAtNTIsNyArNTIsNyBAQAogZW5kaWYKIG9iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHNfZmlsdGVyLm8KIG9iai0kKENPTkZJR19LUFJPQkVfRVZFTlQpICs9IHRyYWNlX2twcm9iZS5vCi1vYmotJChDT05GSUdfRVZFTlRfVFJBQ0lORykgKz0gcG93ZXItdHJhY2VzLm8KK29iai0kKENPTkZJR19UUkFDRVBPSU5UUykgKz0gcG93ZXItdHJhY2VzLm8KIGlmZXEgKCQoQ09ORklHX1RSQUNJTkcpLHkpCiBvYmotJChDT05GSUdfS0dEQl9LREIpICs9IHRyYWNlX2tkYi5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwppbmRleCA3YjhlYzAyLi4xNTM1NjJkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwpAQCAtNzU4LDUzICs3NTgsNTggQEAKICAqIEBxOgkJcXVldWUgdGhlIGlvIGlzIGZvcgogICogQGJpbzoJdGhlIHNvdXJjZSBiaW8KICAqIEB3aGF0Ogl0aGUgYWN0aW9uCisgKiBAZXJyb3I6CWVycm9yLCBpZiBhbnkKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgICBSZWNvcmRzIGFuIGFjdGlvbiBhZ2FpbnN0IGEgYmlvLiBXaWxsIGxvZyB0aGUgYmlvIG9mZnNldCArIHNpemUuCiAgKgogICoqLwogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKLQkJCQkgICAgIHUzMiB3aGF0KQorCQkJICAgICAgdTMyIHdoYXQsIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpidCA9IHEtPmJsa190cmFjZTsKIAogCWlmIChsaWtlbHkoIWJ0KSkKIAkJcmV0dXJuOwogCisJaWYgKCFlcnJvciAmJiAhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpKQorCQllcnJvciA9IEVJTzsKKwogCV9fYmxrX2FkZF90cmFjZShidCwgYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSwgYmlvLT5iaV9ydywgd2hhdCwKLQkJCSFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSksIDAsIE5VTEwpOworCQkJZXJyb3IsIDAsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX2Jpb19ib3VuY2Uodm9pZCAqaWdub3JlLAogCQkJCSAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9CT1VOQ0UpOworCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX0JPVU5DRSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfYmlvX2NvbXBsZXRlKHZvaWQgKmlnbm9yZSwKLQkJCQkgICAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKKwkJCQkgICAgICAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJCQkgICAgICAgaW50IGVycm9yKQogewotCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX0NPTVBMRVRFKTsKKwlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9DT01QTEVURSwgZXJyb3IpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX2Jpb19iYWNrbWVyZ2Uodm9pZCAqaWdub3JlLAogCQkJCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkJc3RydWN0IGJpbyAqYmlvKQogewotCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX0JBQ0tNRVJHRSk7CisJYmxrX2FkZF90cmFjZV9iaW8ocSwgYmlvLCBCTEtfVEFfQkFDS01FUkdFLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9iaW9fZnJvbnRtZXJnZSh2b2lkICppZ25vcmUsCiAJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkJIHN0cnVjdCBiaW8gKmJpbykKIHsKLQlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9GUk9OVE1FUkdFKTsKKwlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9GUk9OVE1FUkdFLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9iaW9fcXVldWUodm9pZCAqaWdub3JlLAogCQkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewotCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX1FVRVVFKTsKKwlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9RVUVVRSwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfZ2V0cnEodm9pZCAqaWdub3JlLApAQCAtODEyLDcgKzgxNyw3IEBACiAJCQkJc3RydWN0IGJpbyAqYmlvLCBpbnQgcncpCiB7CiAJaWYgKGJpbykKLQkJYmxrX2FkZF90cmFjZV9iaW8ocSwgYmlvLCBCTEtfVEFfR0VUUlEpOworCQlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9HRVRSUSwgMCk7CiAJZWxzZSB7CiAJCXN0cnVjdCBibGtfdHJhY2UgKmJ0ID0gcS0+YmxrX3RyYWNlOwogCkBAIC04MjcsNyArODMyLDcgQEAKIAkJCQkgIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KQogewogCWlmIChiaW8pCi0JCWJsa19hZGRfdHJhY2VfYmlvKHEsIGJpbywgQkxLX1RBX1NMRUVQUlEpOworCQlibGtfYWRkX3RyYWNlX2JpbyhxLCBiaW8sIEJMS19UQV9TTEVFUFJRLCAwKTsKIAllbHNlIHsKIAkJc3RydWN0IGJsa190cmFjZSAqYnQgPSBxLT5ibGtfdHJhY2U7CiAKQEAgLTg4Nyw3ICs4OTIsNyBAQAogfQogCiAvKioKLSAqIGJsa19hZGRfdHJhY2VfcmVtYXAgLSBBZGQgYSB0cmFjZSBmb3IgYSByZW1hcCBvcGVyYXRpb24KKyAqIGJsa19hZGRfdHJhY2VfYmlvX3JlbWFwIC0gQWRkIGEgdHJhY2UgZm9yIGEgYmlvLXJlbWFwIG9wZXJhdGlvbgogICogQGlnbm9yZToJdHJhY2UgY2FsbGJhY2sgZGF0YSBwYXJhbWV0ZXIgKG5vdCB1c2VkKQogICogQHE6CQlxdWV1ZSB0aGUgaW8gaXMgZm9yCiAgKiBAYmlvOgl0aGUgc291cmNlIGJpbwpAQCAtODk5LDkgKzkwNCw5IEBACiAgKiAgICAgaXQgc3BhbnMgYSBzdHJpcGUgKG9yIHNpbWlsYXIpLiBBZGQgYSB0cmFjZSBmb3IgdGhhdCBhY3Rpb24uCiAgKgogICoqLwotc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9yZW1hcCh2b2lkICppZ25vcmUsCi0JCQkJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKLQkJCQlkZXZfdCBkZXYsIHNlY3Rvcl90IGZyb20pCitzdGF0aWMgdm9pZCBibGtfYWRkX3RyYWNlX2Jpb19yZW1hcCh2b2lkICppZ25vcmUsCisJCQkJICAgIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkJICAgIGRldl90IGRldiwgc2VjdG9yX3QgZnJvbSkKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpidCA9IHEtPmJsa190cmFjZTsKIAlzdHJ1Y3QgYmxrX2lvX3RyYWNlX3JlbWFwIHI7CkBAIC0xMDE2LDcgKzEwMjEsNyBAQAogCVdBUk5fT04ocmV0KTsKIAlyZXQgPSByZWdpc3Rlcl90cmFjZV9ibG9ja19zcGxpdChibGtfYWRkX3RyYWNlX3NwbGl0LCBOVUxMKTsKIAlXQVJOX09OKHJldCk7Ci0JcmV0ID0gcmVnaXN0ZXJfdHJhY2VfYmxvY2tfcmVtYXAoYmxrX2FkZF90cmFjZV9yZW1hcCwgTlVMTCk7CisJcmV0ID0gcmVnaXN0ZXJfdHJhY2VfYmxvY2tfYmlvX3JlbWFwKGJsa19hZGRfdHJhY2VfYmlvX3JlbWFwLCBOVUxMKTsKIAlXQVJOX09OKHJldCk7CiAJcmV0ID0gcmVnaXN0ZXJfdHJhY2VfYmxvY2tfcnFfcmVtYXAoYmxrX2FkZF90cmFjZV9ycV9yZW1hcCwgTlVMTCk7CiAJV0FSTl9PTihyZXQpOwpAQCAtMTAyNSw3ICsxMDMwLDcgQEAKIHN0YXRpYyB2b2lkIGJsa191bnJlZ2lzdGVyX3RyYWNlcG9pbnRzKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl90cmFjZV9ibG9ja19ycV9yZW1hcChibGtfYWRkX3RyYWNlX3JxX3JlbWFwLCBOVUxMKTsKLQl1bnJlZ2lzdGVyX3RyYWNlX2Jsb2NrX3JlbWFwKGJsa19hZGRfdHJhY2VfcmVtYXAsIE5VTEwpOworCXVucmVnaXN0ZXJfdHJhY2VfYmxvY2tfYmlvX3JlbWFwKGJsa19hZGRfdHJhY2VfYmlvX3JlbWFwLCBOVUxMKTsKIAl1bnJlZ2lzdGVyX3RyYWNlX2Jsb2NrX3NwbGl0KGJsa19hZGRfdHJhY2Vfc3BsaXQsIE5VTEwpOwogCXVucmVnaXN0ZXJfdHJhY2VfYmxvY2tfdW5wbHVnX2lvKGJsa19hZGRfdHJhY2VfdW5wbHVnX2lvLCBOVUxMKTsKIAl1bnJlZ2lzdGVyX3RyYWNlX2Jsb2NrX3VucGx1Z190aW1lcihibGtfYWRkX3RyYWNlX3VucGx1Z190aW1lciwgTlVMTCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuYyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCmluZGV4IGY4Y2Y5NTkuLmRjNTNlY2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCkBAIC0xMzEzLDEyICsxMzEzLDEwIEBACiAKIAlfX3RoaXNfY3B1X2luYyh1c2VyX3N0YWNrX2NvdW50KTsKIAotCi0KIAlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9VU0VSX1NUQUNLLAogCQkJCQkgIHNpemVvZigqZW50cnkpLCBmbGFncywgcGMpOwogCWlmICghZXZlbnQpCi0JCXJldHVybjsKKwkJZ290byBvdXRfZHJvcF9jb3VudDsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCiAJZW50cnktPnRnaWQJCT0gY3VycmVudC0+dGdpZDsKQEAgLTEzMzMsOCArMTMzMSw4IEBACiAJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgYnVmZmVyLCBldmVudCkpCiAJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7CiAKKyBvdXRfZHJvcF9jb3VudDoKIAlfX3RoaXNfY3B1X2RlYyh1c2VyX3N0YWNrX2NvdW50KTsKLQogIG91dDoKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKaW5kZXggZTNkZmVjYS4uNmNmMjIzNyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCkBAIC01Myw3ICs1Myw3IEBACiAgKi8KIAogLyoKLSAqIEZ1bmN0aW9uIHRyYWNlIGVudHJ5IC0gZnVuY3Rpb24gYWRkcmVzcyBhbmQgcGFyZW50IGZ1bmN0aW9uIGFkZHJlczoKKyAqIEZ1bmN0aW9uIHRyYWNlIGVudHJ5IC0gZnVuY3Rpb24gYWRkcmVzcyBhbmQgcGFyZW50IGZ1bmN0aW9uIGFkZHJlc3M6CiAgKi8KIEZUUkFDRV9FTlRSWShmdW5jdGlvbiwgZnRyYWNlX2VudHJ5LAogCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCmluZGV4IDI1OTE1ODMuLjlkYTI4OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KIAorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp1c2VyX25zX2NhY2hlcCBfX3JlYWRfbW9zdGx5OworCiAvKgogICogQ3JlYXRlIGEgbmV3IHVzZXIgbmFtZXNwYWNlLCBkZXJpdmluZyB0aGUgY3JlYXRvciBmcm9tIHRoZSB1c2VyIGluIHRoZQogICogcGFzc2VkIGNyZWRlbnRpYWxzLCBhbmQgcmVwbGFjaW5nIHRoYXQgdXNlciB3aXRoIHRoZSBuZXcgcm9vdCB1c2VyIGZvciB0aGUKQEAgLTI2LDcgKzI4LDcgQEAKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnJvb3RfdXNlcjsKIAlpbnQgbjsKIAotCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzZXJfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CisJbnMgPSBrbWVtX2NhY2hlX2FsbG9jKHVzZXJfbnNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5zKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzgsNyArNDAsNyBAQAogCS8qIEFsbG9jIG5ldyByb290IHVzZXIuICAqLwogCXJvb3RfdXNlciA9IGFsbG9jX3VpZChucywgMCk7CiAJaWYgKCFyb290X3VzZXIpIHsKLQkJa2ZyZWUobnMpOworCQlrbWVtX2NhY2hlX2ZyZWUodXNlcl9uc19jYWNoZXAsIG5zKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC03MSw3ICs3Myw3IEBACiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UsIGRlc3Ryb3llcik7CiAJZnJlZV91aWQobnMtPmNyZWF0b3IpOwotCWtmcmVlKG5zKTsKKwlrbWVtX2NhY2hlX2ZyZWUodXNlcl9uc19jYWNoZXAsIG5zKTsKIH0KIAogdm9pZCBmcmVlX3VzZXJfbnMoc3RydWN0IGtyZWYgKmtyZWYpCkBAIC0xMjYsMyArMTI4LDEwIEBACiAJLyogTm8gdXNlZnVsIHJlbGF0aW9uc2hpcCBzbyBubyBtYXBwaW5nICovCiAJcmV0dXJuIG92ZXJmbG93Z2lkOwogfQorCitzdGF0aWMgX19pbml0IGludCB1c2VyX25hbWVzcGFjZXNfaW5pdCh2b2lkKQoreworCXVzZXJfbnNfY2FjaGVwID0gS01FTV9DQUNIRSh1c2VyX25hbWVzcGFjZSwgU0xBQl9QQU5JQyk7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh1c2VyX25hbWVzcGFjZXNfaW5pdCk7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDMxMTZhYTYuLjBlZTY3ZTAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC0xMDYsNiArMTA2LDggQEAKIGNvbmZpZyBMWk9fREVDT01QUkVTUwogCXRyaXN0YXRlCiAKK3NvdXJjZSAibGliL3h6L0tjb25maWciCisKICMKICMgVGhlc2UgYWxsIHByb3ZpZGUgYSBjb21tb24gaW50ZXJmYWNlIChoZW5jZSB0aGUgYXBwYXJlbnQgZHVwbGljYXRpb24gd2l0aAogIyBaTElCX0lORkxBVEU7IERFQ09NUFJFU1NfR1pJUCBpcyBqdXN0IGEgd3JhcHBlci4pCkBAIC0xMjAsNiArMTIyLDEwIEBACiBjb25maWcgREVDT01QUkVTU19MWk1BCiAJdHJpc3RhdGUKIAorY29uZmlnIERFQ09NUFJFU1NfWFoKKwlzZWxlY3QgWFpfREVDCisJdHJpc3RhdGUKKwogY29uZmlnIERFQ09NUFJFU1NfTFpPCiAJc2VsZWN0IExaT19ERUNPTVBSRVNTCiAJdHJpc3RhdGUKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCBkN2I2ZTMwYS4uY2JiNzc0ZiAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogCSBpZHIubyBpbnRfc3FydC5vIGV4dGFibGUubyBwcmlvX3RyZWUubyBcCiAJIHNoYTEubyBpcnFfcmVncy5vIHJlY2lwcm9jYWxfZGl2Lm8gYXJndl9zcGxpdC5vIFwKIAkgcHJvcG9ydGlvbnMubyBwcmlvX2hlYXAubyByYXRlbGltaXQubyBzaG93X21lbS5vIFwKLQkgaXNfc2luZ2xlX3RocmVhZGVkLm8gcGxpc3QubyBkZWNvbXByZXNzLm8gZmxleF9hcnJheS5vCisJIGlzX3NpbmdsZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5vCiAKIGxpYi0kKENPTkZJR19NTVUpICs9IGlvcmVtYXAubwogbGliLSQoQ09ORklHX1NNUCkgKz0gY3B1bWFzay5vCkBAIC0yMSw3ICsyMSw3IEBACiAKIG9iai15ICs9IGJjZC5vIGRpdjY0Lm8gc29ydC5vIHBhcnNlci5vIGhhbGZtZDQubyBkZWJ1Z19sb2Nrcy5vIHJhbmRvbTMyLm8gXAogCSBidXN0X3NwaW5sb2Nrcy5vIGhleGR1bXAubyBrYXNwcmludGYubyBiaXRtYXAubyBzY2F0dGVybGlzdC5vIFwKLQkgc3RyaW5nX2hlbHBlcnMubyBnY2QubyBsY20ubyBsaXN0X3NvcnQubyB1dWlkLm8KKwkgc3RyaW5nX2hlbHBlcnMubyBnY2QubyBsY20ubyBsaXN0X3NvcnQubyB1dWlkLm8gZmxleF9hcnJheS5vCiAKIGlmZXEgKCQoQ09ORklHX0RFQlVHX0tPQkpFQ1QpLHkpCiBDRkxBR1Nfa29iamVjdC5vICs9IC1EREVCVUcKQEAgLTY5LDExICs2OSwxMyBAQAogb2JqLSQoQ09ORklHX1JFRURfU09MT01PTikgKz0gcmVlZF9zb2xvbW9uLwogb2JqLSQoQ09ORklHX0xaT19DT01QUkVTUykgKz0gbHpvLwogb2JqLSQoQ09ORklHX0xaT19ERUNPTVBSRVNTKSArPSBsem8vCitvYmotJChDT05GSUdfWFpfREVDKSArPSB4ei8KIG9iai0kKENPTkZJR19SQUlENl9QUSkgKz0gcmFpZDYvCiAKIGxpYi0kKENPTkZJR19ERUNPTVBSRVNTX0daSVApICs9IGRlY29tcHJlc3NfaW5mbGF0ZS5vCiBsaWItJChDT05GSUdfREVDT01QUkVTU19CWklQMikgKz0gZGVjb21wcmVzc19idW56aXAyLm8KIGxpYi0kKENPTkZJR19ERUNPTVBSRVNTX0xaTUEpICs9IGRlY29tcHJlc3NfdW5sem1hLm8KK2xpYi0kKENPTkZJR19ERUNPTVBSRVNTX1haKSArPSBkZWNvbXByZXNzX3VueHoubwogbGliLSQoQ09ORklHX0RFQ09NUFJFU1NfTFpPKSArPSBkZWNvbXByZXNzX3VubHpvLm8KIAogb2JqLSQoQ09ORklHX1RFWFRTRUFSQ0gpICs9IHRleHRzZWFyY2gubwpkaWZmIC0tZ2l0IGEvbGliL2RlY29tcHJlc3MuYyBiL2xpYi9kZWNvbXByZXNzLmMKaW5kZXggYTc2MDY4MS4uM2Q3NjZiN2YgMTAwNjQ0Ci0tLSBhL2xpYi9kZWNvbXByZXNzLmMKKysrIGIvbGliL2RlY29tcHJlc3MuYwpAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvYnVuemlwMi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvdW5sem1hLmg+CisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy91bnh6Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9pbmZsYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy91bmx6by5oPgogCkBAIC0yMyw2ICsyNCw5IEBACiAjaWZuZGVmIENPTkZJR19ERUNPTVBSRVNTX0xaTUEKICMgZGVmaW5lIHVubHptYSBOVUxMCiAjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0RFQ09NUFJFU1NfWFoKKyMgZGVmaW5lIHVueHogTlVMTAorI2VuZGlmCiAjaWZuZGVmIENPTkZJR19ERUNPTVBSRVNTX0xaTwogIyBkZWZpbmUgdW5sem8gTlVMTAogI2VuZGlmCkBAIC0zNiw2ICs0MCw3IEBACiAJeyB7MDM3LCAwMjM2fSwgImd6aXAiLCBndW56aXAgfSwKIAl7IHsweDQyLCAweDVhfSwgImJ6aXAyIiwgYnVuemlwMiB9LAogCXsgezB4NWQsIDB4MDB9LCAibHptYSIsIHVubHptYSB9LAorCXsgezB4ZmQsIDB4Mzd9LCAieHoiLCB1bnh6IH0sCiAJeyB7MHg4OSwgMHg0Y30sICJsem8iLCB1bmx6byB9LAogCXsgezAsIDB9LCBOVUxMLCBOVUxMIH0KIH07CmRpZmYgLS1naXQgYS9saWIvZGVjb21wcmVzc19idW56aXAyLmMgYi9saWIvZGVjb21wcmVzc19idW56aXAyLmMKaW5kZXggODFjOGJiMS4uYTdiODBjMSAxMDA2NDQKLS0tIGEvbGliL2RlY29tcHJlc3NfYnVuemlwMi5jCisrKyBiL2xpYi9kZWNvbXByZXNzX2J1bnppcDIuYwpAQCAtNDksNyArNDksNiBAQAogI2RlZmluZSBQUkVCT09UCiAjZWxzZQogI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvYnVuemlwMi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNlbmRpZiAvKiBTVEFUSUMgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4KQEAgLTY4MiwxMyArNjgxLDEyIEBACiAJCQlpbnQoKmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgaW50KSwKIAkJCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwKIAkJCWludCAqcG9zLAotCQkJdm9pZCgqZXJyb3JfZm4pKGNoYXIgKngpKQorCQkJdm9pZCgqZXJyb3IpKGNoYXIgKngpKQogewogCXN0cnVjdCBidW56aXBfZGF0YSAqYmQ7CiAJaW50IGkgPSAtMTsKIAl1bnNpZ25lZCBjaGFyICppbmJ1ZjsKIAotCXNldF9lcnJvcl9mbihlcnJvcl9mbik7CiAJaWYgKGZsdXNoKQogCQlvdXRidWYgPSBtYWxsb2MoQlpJUDJfSU9CVUZfU0laRSk7CiAKQEAgLTc1MSw4ICs3NDksOCBAQAogCQkJaW50KCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGludCksCiAJCQl1bnNpZ25lZCBjaGFyICpvdXRidWYsCiAJCQlpbnQgKnBvcywKLQkJCXZvaWQoKmVycm9yX2ZuKShjaGFyICp4KSkKKwkJCXZvaWQoKmVycm9yKShjaGFyICp4KSkKIHsKLQlyZXR1cm4gYnVuemlwMihidWYsIGxlbiAtIDQsIGZpbGwsIGZsdXNoLCBvdXRidWYsIHBvcywgZXJyb3JfZm4pOworCXJldHVybiBidW56aXAyKGJ1ZiwgbGVuIC0gNCwgZmlsbCwgZmx1c2gsIG91dGJ1ZiwgcG9zLCBlcnJvcik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9kZWNvbXByZXNzX2luZmxhdGUuYyBiL2xpYi9kZWNvbXByZXNzX2luZmxhdGUuYwppbmRleCBmYzY4NmM3Li4xOWZmODllIDEwMDY0NAotLS0gYS9saWIvZGVjb21wcmVzc19pbmZsYXRlLmMKKysrIGIvbGliL2RlY29tcHJlc3NfaW5mbGF0ZS5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZmxhdGUuaCIKIAogI2luY2x1ZGUgInpsaWJfaW5mbGF0ZS9pbmZ1dGlsLmgiCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjZW5kaWYgLyogU1RBVElDICovCiAKQEAgLTI3LDcgKzI2LDcgQEAKIAogI2RlZmluZSBHWklQX0lPQlVGX1NJWkUgKDE2KjEwMjQpCiAKLXN0YXRpYyBpbnQgbm9maWxsKHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbnQgSU5JVCBub2ZpbGwodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiAtMTsKIH0KQEAgLTM4LDEzICszNywxMiBAQAogCQkgICAgICAgaW50KCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGludCksCiAJCSAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRfYnVmLAogCQkgICAgICAgaW50ICpwb3MsCi0JCSAgICAgICB2b2lkKCplcnJvcl9mbikoY2hhciAqeCkpIHsKKwkJICAgICAgIHZvaWQoKmVycm9yKShjaGFyICp4KSkgewogCXU4ICp6YnVmOwogCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJtOwogCWludCByYzsKIAlzaXplX3Qgb3V0X2xlbjsKIAotCXNldF9lcnJvcl9mbihlcnJvcl9mbik7CiAJcmMgPSAtMTsKIAlpZiAoZmx1c2gpIHsKIAkJb3V0X2xlbiA9IDB4ODAwMDsgLyogMzIgSyAqLwpAQCAtMTAwLDEzICs5OCwyMiBAQAogCSAqIHBvc3NpYmxlIGFzY2l6IGZpbGVuYW1lKQogCSAqLwogCXN0cm0tPm5leHRfaW4gPSB6YnVmICsgMTA7CisJc3RybS0+YXZhaWxfaW4gPSBsZW4gLSAxMDsKIAkvKiBza2lwIG92ZXIgYXNjaXogZmlsZW5hbWUgKi8KIAlpZiAoemJ1ZlszXSAmIDB4OCkgewotCQl3aGlsZSAoc3RybS0+bmV4dF9pblswXSkKLQkJCXN0cm0tPm5leHRfaW4rKzsKLQkJc3RybS0+bmV4dF9pbisrOworCQlkbyB7CisJCQkvKgorCQkJICogSWYgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgZml0IGludG8gdGhlIGJ1ZmZlciwKKwkJCSAqIHRoZSBmaWxlIGlzIHZlcnkgcHJvYmFibHkgY29ycnVwdC4gRG9uJ3QgdHJ5CisJCQkgKiB0byByZWFkIG1vcmUgZGF0YS4KKwkJCSAqLworCQkJaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKKwkJCQllcnJvcigiaGVhZGVyIGVycm9yIik7CisJCQkJZ290byBndW56aXBfNTsKKwkJCX0KKwkJCS0tc3RybS0+YXZhaWxfaW47CisJCX0gd2hpbGUgKCpzdHJtLT5uZXh0X2luKyspOwogCX0KLQlzdHJtLT5hdmFpbF9pbiA9IGxlbiAtIChzdHJtLT5uZXh0X2luIC0gemJ1Zik7CiAKIAlzdHJtLT5uZXh0X291dCA9IG91dF9idWY7CiAJc3RybS0+YXZhaWxfb3V0ID0gb3V0X2xlbjsKZGlmZiAtLWdpdCBhL2xpYi9kZWNvbXByZXNzX3VubHptYS5jIGIvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKaW5kZXggY2E4MmZkZS4uNDc2YzY1YSAxMDA2NDQKLS0tIGEvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKKysrIGIvbGliL2RlY29tcHJlc3NfdW5sem1hLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNkZWZpbmUgUFJFQk9PVAogI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHptYS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNlbmRpZiAvKiBTVEFUSUMgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4KQEAgLTc0LDYgKzczLDcgQEAKIAl1aW50MzJfdCBjb2RlOwogCXVpbnQzMl90IHJhbmdlOwogCXVpbnQzMl90IGJvdW5kOworCXZvaWQgKCplcnJvcikoY2hhciAqKTsKIH07CiAKIApAQCAtODIsNyArODIsNyBAQAogI2RlZmluZSBSQ19NT0RFTF9UT1RBTF9CSVRTIDExCiAKIAotc3RhdGljIGludCBub2ZpbGwodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIGludCBJTklUIG5vZmlsbCh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJcmV0dXJuIC0xOwogfQpAQCAtOTIsNyArOTIsNyBAQAogewogCXJjLT5idWZmZXJfc2l6ZSA9IHJjLT5maWxsKChjaGFyICopcmMtPmJ1ZmZlciwgTFpNQV9JT0JVRl9TSVpFKTsKIAlpZiAocmMtPmJ1ZmZlcl9zaXplIDw9IDApCi0JCWVycm9yKCJ1bmV4cGVjdGVkIEVPRiIpOworCQlyYy0+ZXJyb3IoInVuZXhwZWN0ZWQgRU9GIik7CiAJcmMtPnB0ciA9IHJjLT5idWZmZXI7CiAJcmMtPmJ1ZmZlcl9lbmQgPSByYy0+YnVmZmVyICsgcmMtPmJ1ZmZlcl9zaXplOwogfQpAQCAtMTI3LDEyICsxMjcsNiBAQAogfQogCiAKLS8qIENhbGxlZCBvbmNlLiBUT0RPOiBiYl9tYXliZV9mcmVlKCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBJTklUIHJjX2ZyZWUoc3RydWN0IHJjICpyYykKLXsKLQlmcmVlKHJjLT5idWZmZXIpOwotfQotCiAvKiBDYWxsZWQgdHdpY2UsIGJ1dCBvbmUgY2FsbHNpdGUgaXMgaW4gaW5saW5lJ2QgcmNfaXNfYml0XzBfaGVscGVyKCkgKi8KIHN0YXRpYyB2b2lkIElOSVQgcmNfZG9fbm9ybWFsaXplKHN0cnVjdCByYyAqcmMpCiB7CkBAIC0xNjksNyArMTYzLDcgQEAKIAlyYy0+cmFuZ2UgPSByYy0+Ym91bmQ7CiAJKnAgKz0gKCgxIDw8IFJDX01PREVMX1RPVEFMX0JJVFMpIC0gKnApID4+IFJDX01PVkVfQklUUzsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCByY191cGRhdGVfYml0XzEoc3RydWN0IHJjICpyYywgdWludDE2X3QgKnApCitzdGF0aWMgaW5saW5lIHZvaWQgSU5JVCByY191cGRhdGVfYml0XzEoc3RydWN0IHJjICpyYywgdWludDE2X3QgKnApCiB7CiAJcmMtPnJhbmdlIC09IHJjLT5ib3VuZDsKIAlyYy0+Y29kZSAtPSByYy0+Ym91bmQ7CkBAIC0zMTksMzIgKzMxMywzOCBAQAogCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBJTklUIHdyaXRlX2J5dGUoc3RydWN0IHdyaXRlciAqd3IsIHVpbnQ4X3QgYnl0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IElOSVQgd3JpdGVfYnl0ZShzdHJ1Y3Qgd3JpdGVyICp3ciwgdWludDhfdCBieXRlKQogewogCXdyLT5idWZmZXJbd3ItPmJ1ZmZlcl9wb3MrK10gPSB3ci0+cHJldmlvdXNfYnl0ZSA9IGJ5dGU7CiAJaWYgKHdyLT5mbHVzaCAmJiB3ci0+YnVmZmVyX3BvcyA9PSB3ci0+aGVhZGVyLT5kaWN0X3NpemUpIHsKIAkJd3ItPmJ1ZmZlcl9wb3MgPSAwOwogCQl3ci0+Z2xvYmFsX3BvcyArPSB3ci0+aGVhZGVyLT5kaWN0X3NpemU7Ci0JCXdyLT5mbHVzaCgoY2hhciAqKXdyLT5idWZmZXIsIHdyLT5oZWFkZXItPmRpY3Rfc2l6ZSk7CisJCWlmICh3ci0+Zmx1c2goKGNoYXIgKil3ci0+YnVmZmVyLCB3ci0+aGVhZGVyLT5kaWN0X3NpemUpCisJCQkJIT0gd3ItPmhlYWRlci0+ZGljdF9zaXplKQorCQkJcmV0dXJuIC0xOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIHZvaWQgSU5JVCBjb3B5X2J5dGUoc3RydWN0IHdyaXRlciAqd3IsIHVpbnQzMl90IG9mZnMpCitzdGF0aWMgaW5saW5lIGludCBJTklUIGNvcHlfYnl0ZShzdHJ1Y3Qgd3JpdGVyICp3ciwgdWludDMyX3Qgb2ZmcykKIHsKLQl3cml0ZV9ieXRlKHdyLCBwZWVrX29sZF9ieXRlKHdyLCBvZmZzKSk7CisJcmV0dXJuIHdyaXRlX2J5dGUod3IsIHBlZWtfb2xkX2J5dGUod3IsIG9mZnMpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIElOSVQgY29weV9ieXRlcyhzdHJ1Y3Qgd3JpdGVyICp3ciwKK3N0YXRpYyBpbmxpbmUgaW50IElOSVQgY29weV9ieXRlcyhzdHJ1Y3Qgd3JpdGVyICp3ciwKIAkJCQkJIHVpbnQzMl90IHJlcDAsIGludCBsZW4pCiB7CiAJZG8gewotCQljb3B5X2J5dGUod3IsIHJlcDApOworCQlpZiAoY29weV9ieXRlKHdyLCByZXAwKSkKKwkJCXJldHVybiAtMTsKIAkJbGVuLS07CiAJfSB3aGlsZSAobGVuICE9IDAgJiYgd3ItPmJ1ZmZlcl9wb3MgPCB3ci0+aGVhZGVyLT5kc3Rfc2l6ZSk7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSU5JVCBwcm9jZXNzX2JpdDAoc3RydWN0IHdyaXRlciAqd3IsIHN0cnVjdCByYyAqcmMsCitzdGF0aWMgaW5saW5lIGludCBJTklUIHByb2Nlc3NfYml0MChzdHJ1Y3Qgd3JpdGVyICp3ciwgc3RydWN0IHJjICpyYywKIAkJCQkgICAgIHN0cnVjdCBjc3RhdGUgKmNzdCwgdWludDE2X3QgKnAsCiAJCQkJICAgICBpbnQgcG9zX3N0YXRlLCB1aW50MTZfdCAqcHJvYiwKIAkJCQkgICAgIGludCBsYywgdWludDMyX3QgbGl0ZXJhbF9wb3NfbWFzaykgewpAQCAtMzc4LDE2ICszNzgsMTcgQEAKIAkJdWludDE2X3QgKnByb2JfbGl0ID0gcHJvYiArIG1pOwogCQlyY19nZXRfYml0KHJjLCBwcm9iX2xpdCwgJm1pKTsKIAl9Ci0Jd3JpdGVfYnl0ZSh3ciwgbWkpOwogCWlmIChjc3QtPnN0YXRlIDwgNCkKIAkJY3N0LT5zdGF0ZSA9IDA7CiAJZWxzZSBpZiAoY3N0LT5zdGF0ZSA8IDEwKQogCQljc3QtPnN0YXRlIC09IDM7CiAJZWxzZQogCQljc3QtPnN0YXRlIC09IDY7CisKKwlyZXR1cm4gd3JpdGVfYnl0ZSh3ciwgbWkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgSU5JVCBwcm9jZXNzX2JpdDEoc3RydWN0IHdyaXRlciAqd3IsIHN0cnVjdCByYyAqcmMsCitzdGF0aWMgaW5saW5lIGludCBJTklUIHByb2Nlc3NfYml0MShzdHJ1Y3Qgd3JpdGVyICp3ciwgc3RydWN0IHJjICpyYywKIAkJCQkJICAgIHN0cnVjdCBjc3RhdGUgKmNzdCwgdWludDE2X3QgKnAsCiAJCQkJCSAgICBpbnQgcG9zX3N0YXRlLCB1aW50MTZfdCAqcHJvYikgewogICBpbnQgb2Zmc2V0OwpAQCAtNDE4LDggKzQxOSw3IEBACiAKIAkJCQljc3QtPnN0YXRlID0gY3N0LT5zdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPwogCQkJCQk5IDogMTE7Ci0JCQkJY29weV9ieXRlKHdyLCBjc3QtPnJlcDApOwotCQkJCXJldHVybjsKKwkJCQlyZXR1cm4gY29weV9ieXRlKHdyLCBjc3QtPnJlcDApOwogCQkJfSBlbHNlIHsKIAkJCQlyY191cGRhdGVfYml0XzEocmMsIHByb2IpOwogCQkJfQpAQCAtNTIxLDEyICs1MjEsMTUgQEAKIAkJfSBlbHNlCiAJCQljc3QtPnJlcDAgPSBwb3Nfc2xvdDsKIAkJaWYgKCsrKGNzdC0+cmVwMCkgPT0gMCkKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOworCQlpZiAoY3N0LT5yZXAwID4gd3ItPmhlYWRlci0+ZGljdF9zaXplCisJCQkJfHwgY3N0LT5yZXAwID4gZ2V0X3Bvcyh3cikpCisJCQlyZXR1cm4gLTE7CiAJfQogCiAJbGVuICs9IExaTUFfTUFUQ0hfTUlOX0xFTjsKIAotCWNvcHlfYnl0ZXMod3IsIGNzdC0+cmVwMCwgbGVuKTsKKwlyZXR1cm4gY29weV9ieXRlcyh3ciwgY3N0LT5yZXAwLCBsZW4pOwogfQogCiAKQEAgLTUzNiw3ICs1MzksNyBAQAogCQkJICAgICAgaW50KCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGludCksCiAJCQkgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsCiAJCQkgICAgICBpbnQgKnBvc3AsCi0JCQkgICAgICB2b2lkKCplcnJvcl9mbikoY2hhciAqeCkKKwkJCSAgICAgIHZvaWQoKmVycm9yKShjaGFyICp4KQogCSkKIHsKIAlzdHJ1Y3QgbHptYV9oZWFkZXIgaGVhZGVyOwpAQCAtNTUyLDcgKzU1NSw3IEBACiAJdW5zaWduZWQgY2hhciAqaW5idWY7CiAJaW50IHJldCA9IC0xOwogCi0Jc2V0X2Vycm9yX2ZuKGVycm9yX2ZuKTsKKwlyYy5lcnJvciA9IGVycm9yOwogCiAJaWYgKGJ1ZikKIAkJaW5idWYgPSBidWY7CkBAIC01ODAsOCArNTgzLDEwIEBACiAJCSgodW5zaWduZWQgY2hhciAqKSZoZWFkZXIpW2ldID0gKnJjLnB0cisrOwogCX0KIAotCWlmIChoZWFkZXIucG9zID49ICg5ICogNSAqIDUpKQorCWlmIChoZWFkZXIucG9zID49ICg5ICogNSAqIDUpKSB7CiAJCWVycm9yKCJiYWQgaGVhZGVyIik7CisJCWdvdG8gZXhpdF8xOworCX0KIAogCW1pID0gMDsKIAlsYyA9IGhlYWRlci5wb3M7CkBAIC02MjcsMjEgKzYzMiwyOSBAQAogCQlpbnQgcG9zX3N0YXRlID0JZ2V0X3Bvcygmd3IpICYgcG9zX3N0YXRlX21hc2s7CiAJCXVpbnQxNl90ICpwcm9iID0gcCArIExaTUFfSVNfTUFUQ0ggKwogCQkJKGNzdC5zdGF0ZSA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpICsgcG9zX3N0YXRlOwotCQlpZiAocmNfaXNfYml0XzAoJnJjLCBwcm9iKSkKLQkJCXByb2Nlc3NfYml0MCgmd3IsICZyYywgJmNzdCwgcCwgcG9zX3N0YXRlLCBwcm9iLAotCQkJCSAgICAgbGMsIGxpdGVyYWxfcG9zX21hc2spOwotCQllbHNlIHsKLQkJCXByb2Nlc3NfYml0MSgmd3IsICZyYywgJmNzdCwgcCwgcG9zX3N0YXRlLCBwcm9iKTsKKwkJaWYgKHJjX2lzX2JpdF8wKCZyYywgcHJvYikpIHsKKwkJCWlmIChwcm9jZXNzX2JpdDAoJndyLCAmcmMsICZjc3QsIHAsIHBvc19zdGF0ZSwgcHJvYiwKKwkJCQkJbGMsIGxpdGVyYWxfcG9zX21hc2spKSB7CisJCQkJZXJyb3IoIkxaTUEgZGF0YSBpcyBjb3JydXB0Iik7CisJCQkJZ290byBleGl0XzM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocHJvY2Vzc19iaXQxKCZ3ciwgJnJjLCAmY3N0LCBwLCBwb3Nfc3RhdGUsIHByb2IpKSB7CisJCQkJZXJyb3IoIkxaTUEgZGF0YSBpcyBjb3JydXB0Iik7CisJCQkJZ290byBleGl0XzM7CisJCQl9CiAJCQlpZiAoY3N0LnJlcDAgPT0gMCkKIAkJCQlicmVhazsKIAkJfQorCQlpZiAocmMuYnVmZmVyX3NpemUgPD0gMCkKKwkJCWdvdG8gZXhpdF8zOwogCX0KIAogCWlmIChwb3NwKQogCQkqcG9zcCA9IHJjLnB0ci1yYy5idWZmZXI7Ci0JaWYgKHdyLmZsdXNoKQotCQl3ci5mbHVzaCh3ci5idWZmZXIsIHdyLmJ1ZmZlcl9wb3MpOwotCXJldCA9IDA7CisJaWYgKCF3ci5mbHVzaCB8fCB3ci5mbHVzaCh3ci5idWZmZXIsIHdyLmJ1ZmZlcl9wb3MpID09IHdyLmJ1ZmZlcl9wb3MpCisJCXJldCA9IDA7CitleGl0XzM6CiAJbGFyZ2VfZnJlZShwKTsKIGV4aXRfMjoKIAlpZiAoIW91dHB1dCkKQEAgLTY1OSw5ICs2NzIsOSBAQAogCQkJICAgICAgaW50KCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGludCksCiAJCQkgICAgICB1bnNpZ25lZCBjaGFyICpvdXRwdXQsCiAJCQkgICAgICBpbnQgKnBvc3AsCi0JCQkgICAgICB2b2lkKCplcnJvcl9mbikoY2hhciAqeCkKKwkJCSAgICAgIHZvaWQoKmVycm9yKShjaGFyICp4KQogCSkKIHsKLQlyZXR1cm4gdW5sem1hKGJ1ZiwgaW5fbGVuIC0gNCwgZmlsbCwgZmx1c2gsIG91dHB1dCwgcG9zcCwgZXJyb3JfZm4pOworCXJldHVybiB1bmx6bWEoYnVmLCBpbl9sZW4gLSA0LCBmaWxsLCBmbHVzaCwgb3V0cHV0LCBwb3NwLCBlcnJvcik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9kZWNvbXByZXNzX3VubHpvLmMgYi9saWIvZGVjb21wcmVzc191bmx6by5jCmluZGV4IGJjYjNhNGIuLjVhN2EyYWQgMTAwNjQ0Ci0tLSBhL2xpYi9kZWNvbXByZXNzX3VubHpvLmMKKysrIGIvbGliL2RlY29tcHJlc3NfdW5sem8uYwpAQCAtMzMsNyArMzMsNiBAQAogI2lmZGVmIFNUQVRJQwogI2luY2x1ZGUgImx6by9sem8xeF9kZWNvbXByZXNzLmMiCiAjZWxzZQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHpvLmg+CiAjZW5kaWYKIApAQCAtNDksMTQgKzQ4LDI1IEBACiAKICNkZWZpbmUgTFpPX0JMT0NLX1NJWkUgICAgICAgICgyNTYqMTAyNGwpCiAjZGVmaW5lIEhFQURFUl9IQVNfRklMVEVSICAgICAgMHgwMDAwMDgwMEwKKyNkZWZpbmUgSEVBREVSX1NJWkVfTUlOICAgICAgICg5ICsgNyAgICAgKyA0ICsgOCAgICAgKyAxICAgICAgICsgNCkKKyNkZWZpbmUgSEVBREVSX1NJWkVfTUFYICAgICAgICg5ICsgNyArIDEgKyA4ICsgOCArIDQgKyAxICsgMjU1ICsgNCkKIAotU1RBVElDIGlubGluZSBpbnQgSU5JVCBwYXJzZV9oZWFkZXIodTggKmlucHV0LCB1OCAqc2tpcCkKK1NUQVRJQyBpbmxpbmUgaW50IElOSVQgcGFyc2VfaGVhZGVyKHU4ICppbnB1dCwgaW50ICpza2lwLCBpbnQgaW5fbGVuKQogewogCWludCBsOwogCXU4ICpwYXJzZSA9IGlucHV0OworCXU4ICplbmQgPSBpbnB1dCArIGluX2xlbjsKIAl1OCBsZXZlbCA9IDA7CiAJdTE2IHZlcnNpb247CiAKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlcmUncyBlbm91Z2ggaW5wdXQgdG8gcG9zc2libHkgaGF2ZSBhIHZhbGlkIGhlYWRlci4KKwkgKiBUaGVuIGl0IGlzIHBvc3NpYmxlIHRvIHBhcnNlIHNldmVyYWwgZmllbGRzIHVudGlsIHRoZSBtaW5pbXVtCisJICogc2l6ZSBtYXkgaGF2ZSBiZWVuIHVzZWQuCisJICovCisJaWYgKGluX2xlbiA8IEhFQURFUl9TSVpFX01JTikKKwkJcmV0dXJuIDA7CisKIAkvKiByZWFkIG1hZ2ljOiA5IGZpcnN0IGJpdHMgKi8KIAlmb3IgKGwgPSAwOyBsIDwgOTsgbCsrKSB7CiAJCWlmICgqcGFyc2UrKyAhPSBsem9wX21hZ2ljW2xdKQpAQCAtNzQsNiArODQsMTUgQEAKIAllbHNlCiAJCXBhcnNlICs9IDQ7IC8qIGZsYWdzICovCiAKKwkvKgorCSAqIEF0IGxlYXN0IG1vZGUsIG10aW1lX2xvdywgZmlsZW5hbWUgbGVuZ3RoLCBhbmQgY2hlY2tzdW0gbXVzdAorCSAqIGJlIGxlZnQgdG8gYmUgcGFyc2VkLiBJZiBhbHNvIG10aW1lX2hpZ2ggaXMgcHJlc2VudCwgaXQncyBPSworCSAqIGJlY2F1c2UgdGhlIG5leHQgaW5wdXQgYnVmZmVyIGNoZWNrIGlzIGFmdGVyIHJlYWRpbmcgdGhlCisJICogZmlsZW5hbWUgbGVuZ3RoLgorCSAqLworCWlmIChlbmQgLSBwYXJzZSA8IDggKyAxICsgNCkKKwkJcmV0dXJuIDA7CisKIAkvKiBza2lwIG1vZGUgYW5kIG10aW1lX2xvdyAqLwogCXBhcnNlICs9IDg7CiAJaWYgKHZlcnNpb24gPj0gMHgwOTQwKQpAQCAtODEsNiArMTAwLDggQEAKIAogCWwgPSAqcGFyc2UrKzsKIAkvKiBkb24ndCBjYXJlIGFib3V0IHRoZSBmaWxlIG5hbWUsIGFuZCBza2lwIGNoZWNrc3VtICovCisJaWYgKGVuZCAtIHBhcnNlIDwgbCArIDQpCisJCXJldHVybiAwOwogCXBhcnNlICs9IGwgKyA0OwogCiAJKnNraXAgPSBwYXJzZSAtIGlucHV0OwpAQCAtOTEsMTYgKzExMiwxNSBAQAogCQkJCWludCAoKmZpbGwpICh2b2lkICosIHVuc2lnbmVkIGludCksCiAJCQkJaW50ICgqZmx1c2gpICh2b2lkICosIHVuc2lnbmVkIGludCksCiAJCQkJdTggKm91dHB1dCwgaW50ICpwb3NwLAotCQkJCXZvaWQgKCplcnJvcl9mbikgKGNoYXIgKngpKQorCQkJCXZvaWQgKCplcnJvcikgKGNoYXIgKngpKQogewotCXU4IHNraXAgPSAwLCByID0gMDsKKwl1OCByID0gMDsKKwlpbnQgc2tpcCA9IDA7CiAJdTMyIHNyY19sZW4sIGRzdF9sZW47CiAJc2l6ZV90IHRtcDsKIAl1OCAqaW5fYnVmLCAqaW5fYnVmX3NhdmUsICpvdXRfYnVmOwogCWludCByZXQgPSAtMTsKIAotCXNldF9lcnJvcl9mbihlcnJvcl9mbik7Ci0KIAlpZiAob3V0cHV0KSB7CiAJCW91dF9idWYgPSBvdXRwdXQ7CiAJfSBlbHNlIGlmICghZmx1c2gpIHsKQEAgLTExOSw4ICsxMzksOCBAQAogCQlnb3RvIGV4aXRfMTsKIAl9IGVsc2UgaWYgKGlucHV0KSB7CiAJCWluX2J1ZiA9IGlucHV0OwotCX0gZWxzZSBpZiAoIWZpbGwgfHwgIXBvc3ApIHsKLQkJZXJyb3IoIk5VTEwgaW5wdXQgcG9pbnRlciBhbmQgbWlzc2luZyBwb3NpdGlvbiBwb2ludGVyIG9yIGZpbGwgZnVuY3Rpb24iKTsKKwl9IGVsc2UgaWYgKCFmaWxsKSB7CisJCWVycm9yKCJOVUxMIGlucHV0IHBvaW50ZXIgYW5kIG1pc3NpbmcgZmlsbCBmdW5jdGlvbiIpOwogCQlnb3RvIGV4aXRfMTsKIAl9IGVsc2UgewogCQlpbl9idWYgPSBtYWxsb2MobHpvMXhfd29yc3RfY29tcHJlc3MoTFpPX0JMT0NLX1NJWkUpKTsKQEAgLTEzNCwyMiArMTU0LDQ3IEBACiAJaWYgKHBvc3ApCiAJCSpwb3NwID0gMDsKIAotCWlmIChmaWxsKQotCQlmaWxsKGluX2J1ZiwgbHpvMXhfd29yc3RfY29tcHJlc3MoTFpPX0JMT0NLX1NJWkUpKTsKKwlpZiAoZmlsbCkgeworCQkvKgorCQkgKiBTdGFydCBmcm9tIGluX2J1ZiArIEhFQURFUl9TSVpFX01BWCB0byBtYWtlIGl0IHBvc3NpYmxlCisJCSAqIHRvIHVzZSBtZW1jcHkoKSB0byBjb3B5IHRoZSB1bnVzZWQgZGF0YSB0byB0aGUgYmVnaW5uaW5nCisJCSAqIG9mIHRoZSBidWZmZXIuIFRoaXMgd2F5IG1lbW1vdmUoKSBpc24ndCBuZWVkZWQgd2hpY2gKKwkJICogaXMgbWlzc2luZyBmcm9tIHByZS1ib290IGVudmlyb25tZW50cyBvZiBtb3N0IGFyY2hzLgorCQkgKi8KKwkJaW5fYnVmICs9IEhFQURFUl9TSVpFX01BWDsKKwkJaW5fbGVuID0gZmlsbChpbl9idWYsIEhFQURFUl9TSVpFX01BWCk7CisJfQogCi0JaWYgKCFwYXJzZV9oZWFkZXIoaW5wdXQsICZza2lwKSkgeworCWlmICghcGFyc2VfaGVhZGVyKGluX2J1ZiwgJnNraXAsIGluX2xlbikpIHsKIAkJZXJyb3IoImludmFsaWQgaGVhZGVyIik7CiAJCWdvdG8gZXhpdF8yOwogCX0KIAlpbl9idWYgKz0gc2tpcDsKKwlpbl9sZW4gLT0gc2tpcDsKKworCWlmIChmaWxsKSB7CisJCS8qIE1vdmUgdGhlIHVudXNlZCBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gKi8KKwkJbWVtY3B5KGluX2J1Zl9zYXZlLCBpbl9idWYsIGluX2xlbik7CisJCWluX2J1ZiA9IGluX2J1Zl9zYXZlOworCX0KIAogCWlmIChwb3NwKQogCQkqcG9zcCA9IHNraXA7CiAKIAlmb3IgKDs7KSB7CiAJCS8qIHJlYWQgdW5jb21wcmVzc2VkIGJsb2NrIHNpemUgKi8KKwkJaWYgKGZpbGwgJiYgaW5fbGVuIDwgNCkgeworCQkJc2tpcCA9IGZpbGwoaW5fYnVmICsgaW5fbGVuLCA0IC0gaW5fbGVuKTsKKwkJCWlmIChza2lwID4gMCkKKwkJCQlpbl9sZW4gKz0gc2tpcDsKKwkJfQorCQlpZiAoaW5fbGVuIDwgNCkgeworCQkJZXJyb3IoImZpbGUgY29ycnVwdGVkIik7CisJCQlnb3RvIGV4aXRfMjsKKwkJfQogCQlkc3RfbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGluX2J1Zik7CiAJCWluX2J1ZiArPSA0OworCQlpbl9sZW4gLT0gNDsKIAogCQkvKiBleGl0IGlmIGxhc3QgYmxvY2sgKi8KIAkJaWYgKGRzdF9sZW4gPT0gMCkgewpAQCAtMTY0LDggKzIwOSwxOCBAQAogCQl9CiAKIAkJLyogcmVhZCBjb21wcmVzc2VkIGJsb2NrIHNpemUsIGFuZCBza2lwIGJsb2NrIGNoZWNrc3VtIGluZm8gKi8KKwkJaWYgKGZpbGwgJiYgaW5fbGVuIDwgOCkgeworCQkJc2tpcCA9IGZpbGwoaW5fYnVmICsgaW5fbGVuLCA4IC0gaW5fbGVuKTsKKwkJCWlmIChza2lwID4gMCkKKwkJCQlpbl9sZW4gKz0gc2tpcDsKKwkJfQorCQlpZiAoaW5fbGVuIDwgOCkgeworCQkJZXJyb3IoImZpbGUgY29ycnVwdGVkIik7CisJCQlnb3RvIGV4aXRfMjsKKwkJfQogCQlzcmNfbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGluX2J1Zik7CiAJCWluX2J1ZiArPSA4OworCQlpbl9sZW4gLT0gODsKIAogCQlpZiAoc3JjX2xlbiA8PSAwIHx8IHNyY19sZW4gPiBkc3RfbGVuKSB7CiAJCQllcnJvcigiZmlsZSBjb3JydXB0ZWQiKTsKQEAgLTE3Myw2ICsyMjgsMTUgQEAKIAkJfQogCiAJCS8qIGRlY29tcHJlc3MgKi8KKwkJaWYgKGZpbGwgJiYgaW5fbGVuIDwgc3JjX2xlbikgeworCQkJc2tpcCA9IGZpbGwoaW5fYnVmICsgaW5fbGVuLCBzcmNfbGVuIC0gaW5fbGVuKTsKKwkJCWlmIChza2lwID4gMCkKKwkJCQlpbl9sZW4gKz0gc2tpcDsKKwkJfQorCQlpZiAoaW5fbGVuIDwgc3JjX2xlbikgeworCQkJZXJyb3IoImZpbGUgY29ycnVwdGVkIik7CisJCQlnb3RvIGV4aXRfMjsKKwkJfQogCQl0bXAgPSBkc3RfbGVuOwogCiAJCS8qIFdoZW4gdGhlIGlucHV0IGRhdGEgaXMgbm90IGNvbXByZXNzZWQgYXQgYWxsLApAQCAtMTkwLDE3ICsyNTQsMjYgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChmbHVzaCkKLQkJCWZsdXNoKG91dF9idWYsIGRzdF9sZW4pOworCQlpZiAoZmx1c2ggJiYgZmx1c2gob3V0X2J1ZiwgZHN0X2xlbikgIT0gZHN0X2xlbikKKwkJCWdvdG8gZXhpdF8yOwogCQlpZiAob3V0cHV0KQogCQkJb3V0X2J1ZiArPSBkc3RfbGVuOwogCQlpZiAocG9zcCkKIAkJCSpwb3NwICs9IHNyY19sZW4gKyAxMjsKKworCQlpbl9idWYgKz0gc3JjX2xlbjsKKwkJaW5fbGVuIC09IHNyY19sZW47CiAJCWlmIChmaWxsKSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgaGFwcGVucyB0byBzdGlsbCBiZSB1bnVzZWQgZGF0YSBsZWZ0IGluCisJCQkgKiBpbl9idWYsIG1vdmUgaXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLgorCQkJICogVXNlIGEgbG9vcCB0byBhdm9pZCBtZW1tb3ZlKCkgZGVwZW5kZW5jeS4KKwkJCSAqLworCQkJaWYgKGluX2xlbiA+IDApCisJCQkJZm9yIChza2lwID0gMDsgc2tpcCA8IGluX2xlbjsgKytza2lwKQorCQkJCQlpbl9idWZfc2F2ZVtza2lwXSA9IGluX2J1Zltza2lwXTsKIAkJCWluX2J1ZiA9IGluX2J1Zl9zYXZlOwotCQkJZmlsbChpbl9idWYsIGx6bzF4X3dvcnN0X2NvbXByZXNzKExaT19CTE9DS19TSVpFKSk7Ci0JCX0gZWxzZQotCQkJaW5fYnVmICs9IHNyY19sZW47CisJCX0KIAl9CiAKIAlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvbGliL2RlY29tcHJlc3NfdW54ei5jIGIvbGliL2RlY29tcHJlc3NfdW54ei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlY2QyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVjb21wcmVzc191bnh6LmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBXcmFwcGVyIGZvciBkZWNvbXByZXNzaW5nIFhaLWNvbXByZXNzZWQga2VybmVsLCBpbml0cmFtZnMsIGFuZCBpbml0cmQKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIEltcG9ydGFudCBub3RlcyBhYm91dCBpbi1wbGFjZSBkZWNvbXByZXNzaW9uCisgKgorICogQXQgbGVhc3Qgb24geDg2LCB0aGUga2VybmVsIGlzIGRlY29tcHJlc3NlZCBpbiBwbGFjZTogdGhlIGNvbXByZXNzZWQgZGF0YQorICogaXMgcGxhY2VkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIsIGFuZCB0aGUgZGVjb21wcmVzc29yIG92ZXJ3cml0ZXMKKyAqIG1vc3Qgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4gVGhlcmUgbXVzdCBiZSBlbm91Z2ggc2FmZXR5IG1hcmdpbiB0bworICogZ3VhcmFudGVlIHRoYXQgdGhlIHdyaXRlIHBvc2l0aW9uIGlzIGFsd2F5cyBiZWhpbmQgdGhlIHJlYWQgcG9zaXRpb24uCisgKgorICogVGhlIHNhZmV0eSBtYXJnaW4gZm9yIFhaIHdpdGggTFpNQTIgb3IgQkNKK0xaTUEyIGlzIGNhbGN1bGF0ZWQgYmVsb3cuCisgKiBOb3RlIHRoYXQgdGhlIG1hcmdpbiB3aXRoIFhaIGlzIGJpZ2dlciB0aGFuIHdpdGggRGVmbGF0ZSAoZ3ppcCkhCisgKgorICogVGhlIHdvcnN0IGNhc2UgZm9yIGluLXBsYWNlIGRlY29tcHJlc3Npb24gaXMgdGhhdCB0aGUgYmVnaW5uaW5nIG9mCisgKiB0aGUgZmlsZSBpcyBjb21wcmVzc2VkIGV4dHJlbWVseSB3ZWxsLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaXMKKyAqIHVuY29tcHJlc3NpYmxlLiBUaHVzLCB3ZSBtdXN0IGxvb2sgZm9yIHdvcnN0LWNhc2UgZXhwYW5zaW9uIHdoZW4gdGhlCisgKiBjb21wcmVzc29yIGlzIGVuY29kaW5nIHVuY29tcHJlc3NpYmxlIGRhdGEuCisgKgorICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgLnh6IGZpbGUgaW4gY2FzZSBvZiBhIGNvbXByZXNlZCBrZXJuZWwgaXMgYXMgZm9sbG93cy4KKyAqIFNpemVzIChhcyBieXRlcykgb2YgdGhlIGZpZWxkcyBhcmUgaW4gcGFyZW50aGVzaXMuCisgKgorICogICAgU3RyZWFtIEhlYWRlciAoMTIpCisgKiAgICBCbG9jayBIZWFkZXI6CisgKiAgICAgIEJsb2NrIEhlYWRlciAoOC0xMikKKyAqICAgICAgQ29tcHJlc3NlZCBEYXRhIChOKQorICogICAgICBCbG9jayBQYWRkaW5nICgwLTMpCisgKiAgICAgIENSQzMyICg0KQorICogICAgSW5kZXggKDgtMjApCisgKiAgICBTdHJlYW0gRm9vdGVyICgxMikKKyAqCisgKiBOb3JtYWxseSB0aGVyZSBpcyBleGFjdGx5IG9uZSBCbG9jaywgYnV0IGxldCdzIGFzc3VtZSB0aGF0IHRoZXJlIGFyZQorICogMi00IEJsb2NrcyBqdXN0IGluIGNhc2UuIEJlY2F1c2UgU3RyZWFtIEhlYWRlciBhbmQgYWxzbyBCbG9jayBIZWFkZXIKKyAqIG9mIHRoZSBmaXJzdCBCbG9jayBkb24ndCBtYWtlIHRoZSBkZWNvbXByZXNzb3IgcHJvZHVjZSBhbnkgdW5jb21wcmVzc2VkCisgKiBkYXRhLCB3ZSBjYW4gaWdub3JlIHRoZW0gZnJvbSBvdXIgY2FsY3VsYXRpb25zLiBCbG9jayBIZWFkZXJzIG9mIHBvc3NpYmxlCisgKiBhZGRpdGlvbmFsIEJsb2NrcyBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBzdGlsbC4gV2l0aCB0aGVzZQorICogYXNzdW1wdGlvbnMsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlIHRvdGFsIGhlYWRlciBvdmVyaGVhZCBpcworICogbGVzcyB0aGFuIDEyOCBieXRlcy4KKyAqCisgKiBDb21wcmVzc2VkIERhdGEgY29udGFpbnMgTFpNQTIgb3IgQkNKK0xaTUEyIGVuY29kZWQgZGF0YS4gU2luY2UgQkNKCisgKiBkb2Vzbid0IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSwgaXQgaXMgZW5vdWdoIHRvIGNhbGN1bGF0ZSB0aGUKKyAqIHNhZmV0eSBtYXJnaW4gZm9yIExaTUEyLgorICoKKyAqIExaTUEyIHN0b3JlcyB0aGUgZGF0YSBpbiBjaHVua3MuIEVhY2ggY2h1bmsgaGFzIGEgaGVhZGVyIHdob3NlIHNpemUgaXMKKyAqIGEgbWF4aW11bSBvZiA2IGJ5dGVzLCBidXQgdG8gZ2V0IHJvdW5kIDJebiBudW1iZXJzLCBsZXQncyBhc3N1bWUgdGhhdAorICogdGhlIG1heGltdW0gY2h1bmsgaGVhZGVyIHNpemUgaXMgOCBieXRlcy4gQWZ0ZXIgdGhlIGNodW5rIGhlYWRlciwgdGhlcmUKKyAqIG1heSBiZSB1cCB0byA2NCBLaUIgb2YgYWN0dWFsIHBheWxvYWQgaW4gdGhlIGNodW5rLiBPZnRlbiB0aGUgcGF5bG9hZCBpcworICogcXVpdGUgYSBiaXQgc21hbGxlciB0aG91Z2g7IHRvIGJlIHNhZmUsIGxldCdzIGFzc3VtZSB0aGF0IGFuIGF2ZXJhZ2UKKyAqIGNodW5rIGhhcyBvbmx5IDMyIEtpQiBvZiBwYXlsb2FkLgorICoKKyAqIFRoZSBtYXhpbXVtIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBwYXlsb2FkIGlzIDIgTWlCLiBUaGUgbWluaW11bQorICogdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgaW4gcHJhY3RpY2UgbmV2ZXIgbGVzcyB0aGFuIHRoZQorICogcGF5bG9hZCBzaXplIGl0c2VsZi4gVGhlIExaTUEyIGZvcm1hdCB3b3VsZCBhbGxvdyB1bmNvbXByZXNzZWQgc2l6ZQorICogdG8gYmUgbGVzcyB0aGFuIHRoZSBwYXlsb2FkIHNpemUsIGJ1dCBubyBzYW5lIGNvbXByZXNzb3IgY3JlYXRlcyBzdWNoCisgKiBmaWxlcy4gTFpNQTIgc3VwcG9ydHMgc3RvcmluZyB1bmNvbXByZXNzaWJsZSBkYXRhIGluIHVuY29tcHJlc3NlZCBmb3JtLAorICogc28gdGhlcmUncyBuZXZlciBhIG5lZWQgdG8gY3JlYXRlIHBheWxvYWRzIHdob3NlIHVuY29tcHJlc3NlZCBzaXplIGlzCisgKiBzbWFsbGVyIHRoYW4gdGhlIGNvbXByZXNzZWQgc2l6ZS4KKyAqCisgKiBUaGUgYXNzdW1wdGlvbiwgdGhhdCB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgbmV2ZXIKKyAqIHNtYWxsZXIgdGhhbiB0aGUgcGF5bG9hZCBpdHNlbGYsIGlzIHZhbGlkIG9ubHkgd2hlbiB0YWxraW5nIGFib3V0CisgKiB0aGUgcGF5bG9hZCBhcyBhIHdob2xlLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYXlsb2FkIGhhcyBwYXJ0cyB3aGVyZQorICogdGhlIGRlY29tcHJlc3NvciBjb25zdW1lcyBtb3JlIGlucHV0IHRoYW4gaXQgcHJvZHVjZXMgb3V0cHV0LiBDYWxjdWxhdGluZworICogdGhlIHdvcnN0IGNhc2UgZm9yIHRoaXMgd291bGQgYmUgdHJpY2t5LiBJbnN0ZWFkIG9mIHRyeWluZyB0byBkbyB0aGF0LAorICogbGV0J3Mgc2ltcGx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWNvbXByZXNzb3IgbmV2ZXIgb3ZlcndyaXRlcyBhbnkgYnl0ZXMKKyAqIG9mIHRoZSBwYXlsb2FkIHdoaWNoIGl0IGlzIGN1cnJlbnRseSByZWFkaW5nLgorICoKKyAqIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIHNhZmV0eSBtYXJnaW4uIFdlIG5lZWQKKyAqICAgLSAxMjggYnl0ZXMgZm9yIHRoZSAueHogZmlsZSBmb3JtYXQgaGVhZGVyczsKKyAqICAgLSA4IGJ5dGVzIHBlciBldmVyeSAzMiBLaUIgb2YgdW5jb21wcmVzc2VkIHNpemUgKG9uZSBMWk1BMiBjaHVuayBoZWFkZXIKKyAqICAgICBwZXIgY2h1bmssIGVhY2ggY2h1bmsgaGF2aW5nIGF2ZXJhZ2UgcGF5bG9hZCBzaXplIG9mIDMyIEtpQik7IGFuZAorICogICAtIDY0IEtpQiAoYmlnZ2VzdCBwb3NzaWJsZSBMWk1BMiBjaHVuayBwYXlsb2FkIHNpemUpIHRvIG1ha2Ugc3VyZSB0aGF0CisgKiAgICAgdGhlIGRlY29tcHJlc3NvciBuZXZlciBvdmVyd3JpdGVzIGFueXRoaW5nIGZyb20gdGhlIExaTUEyIGNodW5rCisgKiAgICAgcGF5bG9hZCBpdCBpcyBjdXJyZW50bHkgcmVhZGluZy4KKyAqCisgKiBXZSBnZXQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICoKKyAqICAgIHNhZmV0eV9tYXJnaW4gPSAxMjggKyB1bmNvbXByZXNzZWRfc2l6ZSAqIDggLyAzMjc2OCArIDY1NTM2CisgKiAgICAgICAgICAgICAgICAgID0gMTI4ICsgKHVuY29tcHJlc3NlZF9zaXplID4+IDEyKSArIDY1NTM2CisgKgorICogRm9yIGNvbXBhcmlzaW9uLCBhY2NvcmRpbmcgdG8gYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYywgdGhlCisgKiBlcXVpdmFsZW50IGZvcm11bGEgZm9yIERlZmxhdGUgaXMgdGhpczoKKyAqCisgKiAgICBzYWZldHlfbWFyZ2luID0gMTggKyAodW5jb21wcmVzc2VkX3NpemUgPj4gMTIpICsgMzI3NjgKKyAqCisgKiBUaHVzLCB3aGVuIHVwZGF0aW5nIERlZmxhdGUtb25seSBpbi1wbGFjZSBrZXJuZWwgZGVjb21wcmVzc29yIHRvCisgKiBzdXBwb3J0IFhaLCB0aGUgZml4ZWQgb3ZlcmhlYWQgaGFzIHRvIGJlIGluY3JlYXNlZCBmcm9tIDE4KzMyNzY4IGJ5dGVzCisgKiB0byAxMjgrNjU1MzYgYnl0ZXMuCisgKi8KKworLyoKKyAqIFNUQVRJQyBpcyBkZWZpbmVkIHRvICJzdGF0aWMiIGlmIHdlIGFyZSBiZWluZyBidWlsdCBmb3Iga2VybmVsCisgKiBkZWNvbXByZXNzaW9uIChwcmUtYm9vdCBjb2RlKS4gPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4gd2lsbCBkZWZpbmUKKyAqIFNUQVRJQyB0byBlbXB0eSBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBkZWZpbmVkLiBTaW5jZSB3ZSB3aWxsIG5lZWQgdG8KKyAqIGtub3cgbGF0ZXIgaWYgd2UgYXJlIGJlaW5nIHVzZWQgZm9yIGtlcm5lbCBkZWNvbXByZXNzaW9uLCB3ZSBkZWZpbmUKKyAqIFhaX1BSRUJPT1QgaGVyZS4KKyAqLworI2lmZGVmIFNUQVRJQworIwlkZWZpbmUgWFpfUFJFQk9PVAorI2VuZGlmCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL21tLmg+CisjZW5kaWYKKyNkZWZpbmUgWFpfRVhURVJOIFNUQVRJQworCisjaWZuZGVmIFhaX1BSRUJPT1QKKyMJaW5jbHVkZSA8bGludXgvc2xhYi5oPgorIwlpbmNsdWRlIDxsaW51eC94ei5oPgorI2Vsc2UKKy8qCisgKiBVc2UgdGhlIGludGVybmFsIENSQzMyIGNvZGUgaW5zdGVhZCBvZiBrZXJuZWwncyBDUkMzMiBtb2R1bGUsIHdoaWNoCisgKiBpcyBub3QgYXZhaWxhYmxlIGluIGVhcmx5IHBoYXNlIG9mIGJvb3RpbmcuCisgKi8KKyNkZWZpbmUgWFpfSU5URVJOQUxfQ1JDMzIgMQorCisvKgorICogRm9yIGJvb3QgdGltZSB1c2UsIHdlIGVuYWJsZSBvbmx5IHRoZSBCQ0ogZmlsdGVyIG9mIHRoZSBjdXJyZW50CisgKiBhcmNoaXRlY3R1cmUgb3Igbm9uZSBpZiBubyBCQ0ogZmlsdGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGFyY2hpdGVjdHVyZS4KKyAqLworI2lmZGVmIENPTkZJR19YODYKKyMJZGVmaW5lIFhaX0RFQ19YODYKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QUEMKKyMJZGVmaW5lIFhaX0RFQ19QT1dFUlBDCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJNCisjCWRlZmluZSBYWl9ERUNfQVJNCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSUE2NAorIwlkZWZpbmUgWFpfREVDX0lBNjQKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TUEFSQworIwlkZWZpbmUgWFpfREVDX1NQQVJDCisjZW5kaWYKKworLyoKKyAqIFRoaXMgd2lsbCBnZXQgdGhlIGJhc2ljIGhlYWRlcnMgc28gdGhhdCBtZW1lcSgpIGFuZCBvdGhlcnMKKyAqIGNhbiBiZSBkZWZpbmVkLgorICovCisjaW5jbHVkZSAieHoveHpfcHJpdmF0ZS5oIgorCisvKgorICogUmVwbGFjZSB0aGUgbm9ybWFsIGFsbG9jYXRpb24gZnVuY3Rpb25zIHdpdGggdGhlIHZlcnNpb25zIGZyb20KKyAqIDxsaW51eC9kZWNvbXByZXNzL21tLmg+LiB2ZnJlZSgpIG5lZWRzIHRvIHN1cHBvcnQgdmZyZWUoTlVMTCkKKyAqIHdoZW4gWFpfRFlOQUxMT0MgaXMgdXNlZCwgYnV0IHRoZSBwcmUtYm9vdCBmcmVlKCkgZG9lc24ndCBzdXBwb3J0IGl0LgorICogV29ya2Fyb3VuZCBpdCBoZXJlIGJlY2F1c2UgdGhlIG90aGVyIGRlY29tcHJlc3NvcnMgZG9uJ3QgbmVlZCBpdC4KKyAqLworI3VuZGVmIGttYWxsb2MKKyN1bmRlZiBrZnJlZQorI3VuZGVmIHZtYWxsb2MKKyN1bmRlZiB2ZnJlZQorI2RlZmluZSBrbWFsbG9jKHNpemUsIGZsYWdzKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUga2ZyZWUocHRyKSBmcmVlKHB0cikKKyNkZWZpbmUgdm1hbGxvYyhzaXplKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgdmZyZWUocHRyKSBkbyB7IGlmIChwdHIgIT0gTlVMTCkgZnJlZShwdHIpOyB9IHdoaWxlICgwKQorCisvKgorICogRklYTUU6IE5vdCBhbGwgYmFzaWMgbWVtb3J5IGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgaW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljCisgKiBmaWxlcyAoeWV0KS4gV2UgZGVmaW5lIG91ciBvd24gdmVyc2lvbnMgaGVyZSBmb3Igbm93LCBidXQgdGhpcyBzaG91bGQgYmUKKyAqIG9ubHkgYSB0ZW1wb3Jhcnkgc29sdXRpb24uCisgKgorICogbWVtZXEgYW5kIG1lbXplcm8gYXJlIG5vdCB1c2VkIG11Y2ggYW5kIGFueSByZW1vdGVseSBzYW5lIGltcGxlbWVudGF0aW9uCisgKiBpcyBmYXN0IGVub3VnaC4gbWVtY3B5L21lbW1vdmUgc3BlZWQgbWF0dGVycyBpbiBtdWx0aS1jYWxsIG1vZGUsIGJ1dAorICogdGhlIGtlcm5lbCBpbWFnZSBpcyBkZWNvbXByZXNzZWQgaW4gc2luZ2xlLWNhbGwgbW9kZSwgaW4gd2hpY2ggb25seQorICogbWVtY3B5IHNwZWVkIGNhbiBtYXR0ZXIgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBsb3Qgb2YgdW5jb21wcmVzc2libGUgZGF0YQorICogKExaTUEyIHN0b3JlcyB1bmNvbXByZXNzaWJsZSBjaHVua3MgaW4gdW5jb21wcmVzc2VkIGZvcm0pLiBUaHVzLCB0aGUKKyAqIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQganVzdCBiZSBrZXB0IHNtYWxsOyBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aAorICogb3B0aW1pemluZyBmb3Igc3BlZWQuCisgKi8KKworI2lmbmRlZiBtZW1lcQorc3RhdGljIGJvb2wgbWVtZXEoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgc2l6ZV90IHNpemUpCit7CisJY29uc3QgdWludDhfdCAqeCA9IGE7CisJY29uc3QgdWludDhfdCAqeSA9IGI7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorCQlpZiAoeFtpXSAhPSB5W2ldKQorCQkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworI2lmbmRlZiBtZW16ZXJvCitzdGF0aWMgdm9pZCBtZW16ZXJvKHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdWludDhfdCAqYiA9IGJ1ZjsKKwl1aW50OF90ICplID0gYiArIHNpemU7CisKKwl3aGlsZSAoYiAhPSBlKQorCQkqYisrID0gJ1wwJzsKK30KKyNlbmRpZgorCisjaWZuZGVmIG1lbW1vdmUKKy8qIE5vdCBzdGF0aWMgdG8gYXZvaWQgYSBjb25mbGljdCB3aXRoIHRoZSBwcm90b3R5cGUgaW4gdGhlIExpbnV4IGhlYWRlcnMuICovCit2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNpemUpCit7CisJdWludDhfdCAqZCA9IGRlc3Q7CisJY29uc3QgdWludDhfdCAqcyA9IHNyYzsKKwlzaXplX3QgaTsKKworCWlmIChkIDwgcykgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorCQkJZFtpXSA9IHNbaV07CisJfSBlbHNlIGlmIChkID4gcykgeworCQlpID0gc2l6ZTsKKwkJd2hpbGUgKGktLSA+IDApCisJCQlkW2ldID0gc1tpXTsKKwl9CisKKwlyZXR1cm4gZGVzdDsKK30KKyNlbmRpZgorCisvKgorICogU2luY2Ugd2UgbmVlZCBtZW1tb3ZlIGFueXdheSwgd291bGQgdXNlIGl0IGFzIG1lbWNweSB0b28uCisgKiBDb21tZW50ZWQgb3V0IGZvciBub3cgdG8gYXZvaWQgYnJlYWtpbmcgdGhpbmdzLgorICovCisvKgorI2lmbmRlZiBtZW1jcHkKKyMJZGVmaW5lIG1lbWNweSBtZW1tb3ZlCisjZW5kaWYKKyovCisKKyNpbmNsdWRlICJ4ei94el9jcmMzMi5jIgorI2luY2x1ZGUgInh6L3h6X2RlY19zdHJlYW0uYyIKKyNpbmNsdWRlICJ4ei94el9kZWNfbHptYTIuYyIKKyNpbmNsdWRlICJ4ei94el9kZWNfYmNqLmMiCisKKyNlbmRpZiAvKiBYWl9QUkVCT09UICovCisKKy8qIFNpemUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBpbiBtdWx0aS1jYWxsIG1vZGUgKi8KKyNkZWZpbmUgWFpfSU9CVUZfU0laRSA0MDk2CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIEFQSSBkZWZpbmVkIGluIDxsaW51eC9kZWNvbXByZXNzL2dlbmVyaWMuaD4uCisgKgorICogVGhpcyB3cmFwcGVyIHdpbGwgYXV0b21hdGljYWxseSBjaG9vc2Ugc2luZ2xlLWNhbGwgb3IgbXVsdGktY2FsbCBtb2RlCisgKiBvZiB0aGUgbmF0aXZlIFhaIGRlY29kZXIgQVBJLiBUaGUgc2luZ2xlLWNhbGwgbW9kZSBjYW4gYmUgdXNlZCBvbmx5IHdoZW4KKyAqIGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBhdmFpbGFibGUgYXMgYSBzaW5nbGUgY2h1bmssIGkuZS4gd2hlbgorICogZmlsbCgpIGFuZCBmbHVzaCgpIHdvbid0IGJlIHVzZWQuCisgKi8KK1NUQVRJQyBpbnQgSU5JVCB1bnh6KHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5fc2l6ZSwKKwkJICAgICBpbnQgKCpmaWxsKSh2b2lkICpkZXN0LCB1bnNpZ25lZCBpbnQgc2l6ZSksCisJCSAgICAgaW50ICgqZmx1c2gpKHZvaWQgKnNyYywgdW5zaWduZWQgaW50IHNpemUpLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICppbl91c2VkLAorCQkgICAgIHZvaWQgKCplcnJvcikoY2hhciAqeCkpCit7CisJc3RydWN0IHh6X2J1ZiBiOworCXN0cnVjdCB4el9kZWMgKnM7CisJZW51bSB4el9yZXQgcmV0OworCWJvb2wgbXVzdF9mcmVlX2luID0gZmFsc2U7CisKKyNpZiBYWl9JTlRFUk5BTF9DUkMzMgorCXh6X2NyYzMyX2luaXQoKTsKKyNlbmRpZgorCisJaWYgKGluX3VzZWQgIT0gTlVMTCkKKwkJKmluX3VzZWQgPSAwOworCisJaWYgKGZpbGwgPT0gTlVMTCAmJiBmbHVzaCA9PSBOVUxMKQorCQlzID0geHpfZGVjX2luaXQoWFpfU0lOR0xFLCAwKTsKKwllbHNlCisJCXMgPSB4el9kZWNfaW5pdChYWl9EWU5BTExPQywgKHVpbnQzMl90KS0xKTsKKworCWlmIChzID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2Nfc3RhdGU7CisKKwlpZiAoZmx1c2ggPT0gTlVMTCkgeworCQliLm91dCA9IG91dDsKKwkJYi5vdXRfc2l6ZSA9IChzaXplX3QpLTE7CisJfSBlbHNlIHsKKwkJYi5vdXRfc2l6ZSA9IFhaX0lPQlVGX1NJWkU7CisJCWIub3V0ID0gbWFsbG9jKFhaX0lPQlVGX1NJWkUpOworCQlpZiAoYi5vdXQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfYWxsb2Nfb3V0OworCX0KKworCWlmIChpbiA9PSBOVUxMKSB7CisJCW11c3RfZnJlZV9pbiA9IHRydWU7CisJCWluID0gbWFsbG9jKFhaX0lPQlVGX1NJWkUpOworCQlpZiAoaW4gPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfYWxsb2NfaW47CisJfQorCisJYi5pbiA9IGluOworCWIuaW5fcG9zID0gMDsKKwliLmluX3NpemUgPSBpbl9zaXplOworCWIub3V0X3BvcyA9IDA7CisKKwlpZiAoZmlsbCA9PSBOVUxMICYmIGZsdXNoID09IE5VTEwpIHsKKwkJcmV0ID0geHpfZGVjX3J1bihzLCAmYik7CisJfSBlbHNlIHsKKwkJZG8geworCQkJaWYgKGIuaW5fcG9zID09IGIuaW5fc2l6ZSAmJiBmaWxsICE9IE5VTEwpIHsKKwkJCQlpZiAoaW5fdXNlZCAhPSBOVUxMKQorCQkJCQkqaW5fdXNlZCArPSBiLmluX3BvczsKKworCQkJCWIuaW5fcG9zID0gMDsKKworCQkJCWluX3NpemUgPSBmaWxsKGluLCBYWl9JT0JVRl9TSVpFKTsKKwkJCQlpZiAoaW5fc2l6ZSA8IDApIHsKKwkJCQkJLyoKKwkJCQkJICogVGhpcyBpc24ndCBhbiBvcHRpbWFsIGVycm9yIGNvZGUKKwkJCQkJICogYnV0IGl0IHByb2JhYmx5IGlzbid0IHdvcnRoIG1ha2luZworCQkJCQkgKiBhIG5ldyBvbmUgZWl0aGVyLgorCQkJCQkgKi8KKwkJCQkJcmV0ID0gWFpfQlVGX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQliLmluX3NpemUgPSBpbl9zaXplOworCQkJfQorCisJCQlyZXQgPSB4el9kZWNfcnVuKHMsICZiKTsKKworCQkJaWYgKGZsdXNoICE9IE5VTEwgJiYgKGIub3V0X3BvcyA9PSBiLm91dF9zaXplCisJCQkJCXx8IChyZXQgIT0gWFpfT0sgJiYgYi5vdXRfcG9zID4gMCkpKSB7CisJCQkJLyoKKwkJCQkgKiBTZXR0aW5nIHJldCBoZXJlIG1heSBoaWRlIGFuIGVycm9yCisJCQkJICogcmV0dXJuZWQgYnkgeHpfZGVjX3J1bigpLCBidXQgcHJvYmFibHkKKwkJCQkgKiBpdCdzIG5vdCB0b28gYmFkLgorCQkJCSAqLworCQkJCWlmIChmbHVzaChiLm91dCwgYi5vdXRfcG9zKSAhPSAoaW50KWIub3V0X3BvcykKKwkJCQkJcmV0ID0gWFpfQlVGX0VSUk9SOworCisJCQkJYi5vdXRfcG9zID0gMDsKKwkJCX0KKwkJfSB3aGlsZSAocmV0ID09IFhaX09LKTsKKworCQlpZiAobXVzdF9mcmVlX2luKQorCQkJZnJlZShpbik7CisKKwkJaWYgKGZsdXNoICE9IE5VTEwpCisJCQlmcmVlKGIub3V0KTsKKwl9CisKKwlpZiAoaW5fdXNlZCAhPSBOVUxMKQorCQkqaW5fdXNlZCArPSBiLmluX3BvczsKKworCXh6X2RlY19lbmQocyk7CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgWFpfU1RSRUFNX0VORDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFhaX01FTV9FUlJPUjoKKwkJLyogVGhpcyBjYW4gb2NjdXIgb25seSBpbiBtdWx0aS1jYWxsIG1vZGUuICovCisJCWVycm9yKCJYWiBkZWNvbXByZXNzb3IgcmFuIG91dCBvZiBtZW1vcnkiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0ZPUk1BVF9FUlJPUjoKKwkJZXJyb3IoIklucHV0IGlzIG5vdCBpbiB0aGUgWFogZm9ybWF0ICh3cm9uZyBtYWdpYyBieXRlcykiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX09QVElPTlNfRVJST1I6CisJCWVycm9yKCJJbnB1dCB3YXMgZW5jb2RlZCB3aXRoIHNldHRpbmdzIHRoYXQgYXJlIG5vdCAiCisJCQkJInN1cHBvcnRlZCBieSB0aGlzIFhaIGRlY29kZXIiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0RBVEFfRVJST1I6CisJY2FzZSBYWl9CVUZfRVJST1I6CisJCWVycm9yKCJYWi1jb21wcmVzc2VkIGRhdGEgaXMgY29ycnVwdCIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycm9yKCJCdWcgaW4gdGhlIFhaIGRlY29tcHJlc3NvciIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLTE7CisKK2Vycm9yX2FsbG9jX2luOgorCWlmIChmbHVzaCAhPSBOVUxMKQorCQlmcmVlKGIub3V0KTsKKworZXJyb3JfYWxsb2Nfb3V0OgorCXh6X2RlY19lbmQocyk7CisKK2Vycm9yX2FsbG9jX3N0YXRlOgorCWVycm9yKCJYWiBkZWNvbXByZXNzb3IgcmFuIG91dCBvZiBtZW1vcnkiKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzIHRvIGRlY29tcHJlc3MKKyAqIHRoZSBrZXJuZWwgaW1hZ2UuCisgKi8KKyNkZWZpbmUgZGVjb21wcmVzcyB1bnh6CmRpZmYgLS1naXQgYS9saWIvZHluYW1pY19kZWJ1Zy5jIGIvbGliL2R5bmFtaWNfZGVidWcuYwppbmRleCAzMDk0MzE4Li5iMzM1YWNiIDEwMDY0NAotLS0gYS9saWIvZHluYW1pY19kZWJ1Zy5jCisrKyBiL2xpYi9keW5hbWljX2RlYnVnLmMKQEAgLTE0MSwxMSArMTQxLDEwIEBACiAJCQllbHNlIGlmICghZHAtPmZsYWdzKQogCQkJCWR0LT5udW1fZW5hYmxlZCsrOwogCQkJZHAtPmZsYWdzID0gbmV3ZmxhZ3M7Ci0JCQlpZiAobmV3ZmxhZ3MpIHsKLQkJCQlqdW1wX2xhYmVsX2VuYWJsZSgmZHAtPmVuYWJsZWQpOwotCQkJfSBlbHNlIHsKLQkJCQlqdW1wX2xhYmVsX2Rpc2FibGUoJmRwLT5lbmFibGVkKTsKLQkJCX0KKwkJCWlmIChuZXdmbGFncykKKwkJCQlkcC0+ZW5hYmxlZCA9IDE7CisJCQllbHNlCisJCQkJZHAtPmVuYWJsZWQgPSAwOwogCQkJaWYgKHZlcmJvc2UpCiAJCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkiZGRlYnVnOiBjaGFuZ2VkICVzOiVkIFslc10lcyAlc1xuIiwKZGlmZiAtLWdpdCBhL2xpYi9mbGV4X2FycmF5LmMgYi9saWIvZmxleF9hcnJheS5jCmluZGV4IDc3YTZmZWEuLmMwZWE0MGIgMTAwNjQ0Ci0tLSBhL2xpYi9mbGV4X2FycmF5LmMKKysrIGIvbGliL2ZsZXhfYXJyYXkuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZsZXhfYXJyYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgewogCWNoYXIgZWxlbWVudHNbRkxFWF9BUlJBWV9QQVJUX1NJWkVdOwpAQCAtMTAzLDYgKzEwNCw3IEBACiAJCQkJCQlGTEVYX0FSUkFZX0JBU0VfQllURVNfTEVGVCk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9hbGxvYyk7CiAKIHN0YXRpYyBpbnQgZmFfZWxlbWVudF90b19wYXJ0X25yKHN0cnVjdCBmbGV4X2FycmF5ICpmYSwKIAkJCQkJdW5zaWduZWQgaW50IGVsZW1lbnRfbnIpCkBAIC0xMjYsMTIgKzEyOCwxNCBAQAogCWZvciAocGFydF9uciA9IDA7IHBhcnRfbnIgPCBGTEVYX0FSUkFZX05SX0JBU0VfUFRSUzsgcGFydF9ucisrKQogCQlrZnJlZShmYS0+cGFydHNbcGFydF9ucl0pOwogfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X2ZyZWVfcGFydHMpOwogCiB2b2lkIGZsZXhfYXJyYXlfZnJlZShzdHJ1Y3QgZmxleF9hcnJheSAqZmEpCiB7CiAJZmxleF9hcnJheV9mcmVlX3BhcnRzKGZhKTsKIAlrZnJlZShmYSk7CiB9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfZnJlZSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5kZXhfaW5zaWRlX3BhcnQoc3RydWN0IGZsZXhfYXJyYXkgKmZhLAogCQkJCQl1bnNpZ25lZCBpbnQgZWxlbWVudF9ucikKQEAgLTE5Niw2ICsyMDAsNyBAQAogCW1lbWNweShkc3QsIHNyYywgZmEtPmVsZW1lbnRfc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfcHV0KTsKIAogLyoqCiAgKiBmbGV4X2FycmF5X2NsZWFyIC0gY2xlYXIgZWxlbWVudCBpbiBhcnJheSBhdCBAZWxlbWVudF9ucgpAQCAtMjIzLDYgKzIyOCw3IEBACiAJbWVtc2V0KGRzdCwgRkxFWF9BUlJBWV9GUkVFLCBmYS0+ZWxlbWVudF9zaXplKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9jbGVhcik7CiAKIC8qKgogICogZmxleF9hcnJheV9wcmVhbGxvYyAtIGd1YXJhbnRlZSB0aGF0IGFycmF5IHNwYWNlIGV4aXN0cwpAQCAtMjU5LDYgKzI2NSw3IEBACiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X3ByZWFsbG9jKTsKIAogLyoqCiAgKiBmbGV4X2FycmF5X2dldCAtIHB1bGwgZGF0YSBiYWNrIG91dCBvZiB0aGUgYXJyYXkKQEAgLTI4OCw2ICsyOTUsNyBAQAogCX0KIAlyZXR1cm4gJnBhcnQtPmVsZW1lbnRzW2luZGV4X2luc2lkZV9wYXJ0KGZhLCBlbGVtZW50X25yKV07CiB9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfZ2V0KTsKIAogLyoqCiAgKiBmbGV4X2FycmF5X2dldF9wdHIgLSBwdWxsIGEgcHRyIGJhY2sgb3V0IG9mIHRoZSBhcnJheQpAQCAtMzA4LDYgKzMxNiw3IEBACiAKIAlyZXR1cm4gKnRtcDsKIH0KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9nZXRfcHRyKTsKIAogc3RhdGljIGludCBwYXJ0X2lzX2ZyZWUoc3RydWN0IGZsZXhfYXJyYXlfcGFydCAqcGFydCkKIHsKQEAgLTM0OCwzICszNTcsNCBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X3Nocmluayk7CmRpZmYgLS1naXQgYS9saWIvaGV4ZHVtcC5jIGIvbGliL2hleGR1bXAuYwppbmRleCA1ZDdhNDgwLi5mNWZlNmJhIDEwMDY0NAotLS0gYS9saWIvaGV4ZHVtcC5jCisrKyBiL2xpYi9oZXhkdW1wLmMKQEAgLTM0LDYgKzM0LDIyIEBACiBFWFBPUlRfU1lNQk9MKGhleF90b19iaW4pOwogCiAvKioKKyAqIGhleDJiaW4gLSBjb252ZXJ0IGFuIGFzY2lpIGhleGFkZWNpbWFsIHN0cmluZyB0byBpdHMgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKiBAZHN0OiBiaW5hcnkgcmVzdWx0CisgKiBAc3JjOiBhc2NpaSBoZXhhZGVjaW1hbCBzdHJpbmcKKyAqIEBjb3VudDogcmVzdWx0IGxlbmd0aAorICovCit2b2lkIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpCit7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJKmRzdCA9IGhleF90b19iaW4oKnNyYysrKSA8PCA0OworCQkqZHN0ICs9IGhleF90b19iaW4oKnNyYysrKTsKKwkJZHN0Kys7CisJfQorfQorRVhQT1JUX1NZTUJPTChoZXgyYmluKTsKKworLyoqCiAgKiBoZXhfZHVtcF90b19idWZmZXIgLSBjb252ZXJ0IGEgYmxvYiBvZiBkYXRhIHRvICJoZXggQVNDSUkiIGluIG1lbW9yeQogICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKICAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgpAQCAtMTM4LDYgKzE1NCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGhleF9kdW1wX3RvX2J1ZmZlcik7CiAKKyNpZmRlZiBDT05GSUdfUFJJTlRLCiAvKioKICAqIHByaW50X2hleF9kdW1wIC0gcHJpbnQgYSB0ZXh0IGhleCBkdW1wIHRvIHN5c2xvZyBmb3IgYSBiaW5hcnkgYmxvYiBvZiBkYXRhCiAgKiBAbGV2ZWw6IGtlcm5lbCBsb2cgbGV2ZWwgKGUuZy4gS0VSTl9ERUJVRykKQEAgLTIyMiwzICsyMzksNCBAQAogCQkgICAgICAgYnVmLCBsZW4sIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTChwcmludF9oZXhfZHVtcF9ieXRlcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9pb3JlbWFwLmMgYi9saWIvaW9yZW1hcC5jCmluZGV4IDU3MzBlY2QuLmRhNGUyYWQgMTAwNjQ0Ci0tLSBhL2xpYi9pb3JlbWFwLmMKKysrIGIvbGliL2lvcmVtYXAuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKQEAgLTkwLDMgKzkxLDQgQEAKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpb3JlbWFwX3BhZ2VfcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvbGliL2tyZWYuYyBiL2xpYi9rcmVmLmMKaW5kZXggZDNkMjI3YS4uM2VmYjg4MiAxMDA2NDQKLS0tIGEvbGliL2tyZWYuYworKysgYi9saWIva3JlZi5jCkBAIC02Miw2ICs2MiwzNiBAQAogCXJldHVybiAwOwogfQogCisKKy8qKgorICoga3JlZl9zdWIgLSBzdWJ0cmFjdCBhIG51bWJlciBvZiByZWZjb3VudHMgZm9yIG9iamVjdC4KKyAqIEBrcmVmOiBvYmplY3QuCisgKiBAY291bnQ6IE51bWJlciBvZiByZWNvdW50cyB0byBzdWJ0cmFjdC4KKyAqIEByZWxlYXNlOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2xlYW4gdXAgdGhlIG9iamVjdCB3aGVuIHRoZQorICoJICAgICBsYXN0IHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkLgorICoJICAgICBUaGlzIHBvaW50ZXIgaXMgcmVxdWlyZWQsIGFuZCBpdCBpcyBub3QgYWNjZXB0YWJsZSB0byBwYXNzIGtmcmVlCisgKgkgICAgIGluIGFzIHRoaXMgZnVuY3Rpb24uCisgKgorICogU3VidHJhY3QgQGNvdW50IGZyb20gdGhlIHJlZmNvdW50LCBhbmQgaWYgMCwgY2FsbCByZWxlYXNlKCkuCisgKiBSZXR1cm4gMSBpZiB0aGUgb2JqZWN0IHdhcyByZW1vdmVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICBCZXdhcmUsIGlmIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgMCwgeW91IHN0aWxsIGNhbiBub3QgY291bnQgb24gdGhlIGtyZWYgZnJvbSByZW1haW5pbmcgaW4KKyAqIG1lbW9yeS4gIE9ubHkgdXNlIHRoZSByZXR1cm4gdmFsdWUgaWYgeW91IHdhbnQgdG8gc2VlIGlmIHRoZSBrcmVmIGlzIG5vdworICogZ29uZSwgbm90IHByZXNlbnQuCisgKi8KK2ludCBrcmVmX3N1YihzdHJ1Y3Qga3JlZiAqa3JlZiwgdW5zaWduZWQgaW50IGNvdW50LAorCSAgICAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICprcmVmKSkKK3sKKwlXQVJOX09OKHJlbGVhc2UgPT0gTlVMTCk7CisJV0FSTl9PTihyZWxlYXNlID09ICh2b2lkICgqKShzdHJ1Y3Qga3JlZiAqKSlrZnJlZSk7CisKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdCgoaW50KSBjb3VudCwgJmtyZWYtPnJlZmNvdW50KSkgeworCQlyZWxlYXNlKGtyZWYpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIEVYUE9SVF9TWU1CT0woa3JlZl9pbml0KTsKIEVYUE9SVF9TWU1CT0woa3JlZl9nZXQpOwogRVhQT1JUX1NZTUJPTChrcmVmX3B1dCk7CitFWFBPUlRfU1lNQk9MKGtyZWZfc3ViKTsKZGlmZiAtLWdpdCBhL2xpYi9ubGF0dHIuYyBiL2xpYi9ubGF0dHIuYwppbmRleCAwMGU4YTAyLi41MDIxY2JjIDEwMDY0NAotLS0gYS9saWIvbmxhdHRyLmMKKysrIGIvbGliL25sYXR0ci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKICAqIEBwb2xpY3k6IHZhbGlkYXRpb24gcG9saWN5CiAgKgogICogUGFyc2VzIGEgc3RyZWFtIG9mIGF0dHJpYnV0ZXMgYW5kIHN0b3JlcyBhIHBvaW50ZXIgdG8gZWFjaCBhdHRyaWJ1dGUgaW4KLSAqIHRoZSB0YiBhcnJheSBhY2Nlc3NhYmxlIHZpYSB0aGUgYXR0cmlidXRlIHR5cGUuIEF0dHJpYnV0ZXMgd2l0aCBhIHR5cGUKKyAqIHRoZSB0YiBhcnJheSBhY2Nlc3NpYmxlIHZpYSB0aGUgYXR0cmlidXRlIHR5cGUuIEF0dHJpYnV0ZXMgd2l0aCBhIHR5cGUKICAqIGV4Y2VlZGluZyBtYXh0eXBlIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAqIHJlYXNvbnMuIHBvbGljeSBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgbm8gdmFsaWRhdGlvbiBpcyByZXF1aXJlZC4KICAqCmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCA3YzA2ZWU1Li5jNDdiYmUxIDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyBjaGFyICppb190bGJfc3RhcnQsICppb190bGJfZW5kOwogCiAvKgotICogVGhlIG51bWJlciBvZiBJTyBUTEIgYmxvY2tzIChpbiBncm91cHMgb2YgNjQpIGJldHdlZWVuIGlvX3RsYl9zdGFydCBhbmQKKyAqIFRoZSBudW1iZXIgb2YgSU8gVExCIGJsb2NrcyAoaW4gZ3JvdXBzIG9mIDY0KSBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQKICAqIGlvX3RsYl9lbmQuICBUaGlzIGlzIGNvbW1hbmQgbGluZSBhZGp1c3RhYmxlIHZpYSBzZXR1cF9pb190bGJfbnBhZ2VzLgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpb190bGJfbnNsYWJzOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBjMTUwZDNkLi5kMzAyM2RmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtOTM2LDYgKzkzNiw4IEBACiAJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgdXVpZCwgc3BlYyk7CiB9CiAKK2ludCBrcHRyX3Jlc3RyaWN0ID0gMTsKKwogLyoKICAqIFNob3cgYSAnJXAnIHRoaW5nLiAgQSBrZXJuZWwgZXh0ZW5zaW9uIGlzIHRoYXQgdGhlICclcCcgaXMgZm9sbG93ZWQKICAqIGJ5IGFuIGV4dHJhIHNldCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0aGF0IGFyZSBleHRlbmRlZCBmb3JtYXQKQEAgLTk3OSw2ICs5ODEsNyBAQAogICogICAgICAgSW1wbGVtZW50cyBhICJyZWN1cnNpdmUgdnNucHJpbnRmIi4KICAqICAgICAgIERvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQogICogICAgICAgY29ycmVjdG5lc3Mgb2YgdGhlIGZvcm1hdCBzdHJpbmcgYW5kIHZhX2xpc3QgYXJndW1lbnRzLgorICogLSAnSycgRm9yIGEga2VybmVsIHBvaW50ZXIgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdW5wcml2aWxlZ2VkIHVzZXJzCiAgKgogICogTm90ZTogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAnUycgYW5kICdGJyBpcyB0aGF0IG9uIGlhNjQgYW5kIHBwYzY0CiAgKiBmdW5jdGlvbiBwb2ludGVycyBhcmUgcmVhbGx5IGZ1bmN0aW9uIGRlc2NyaXB0b3JzLCB3aGljaCBjb250YWluIGEKQEAgLTEwMzUsNiArMTAzOCwyNSBAQAogCQlyZXR1cm4gYnVmICsgdnNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAogCQkJCSAgICAgICAoKHN0cnVjdCB2YV9mb3JtYXQgKilwdHIpLT5mbXQsCiAJCQkJICAgICAgICooKChzdHJ1Y3QgdmFfZm9ybWF0ICopcHRyKS0+dmEpKTsKKwljYXNlICdLJzoKKwkJLyoKKwkJICogJXBLIGNhbm5vdCBiZSB1c2VkIGluIElSUSBjb250ZXh0IGJlY2F1c2UgaXRzIHRlc3QKKwkJICogZm9yIENBUF9TWVNMT0cgd291bGQgYmUgbWVhbmluZ2xlc3MuCisJCSAqLworCQlpZiAoaW5faXJxKCkgfHwgaW5fc2VydmluZ19zb2Z0aXJxKCkgfHwgaW5fbm1pKCkpIHsKKwkJCWlmIChzcGVjLmZpZWxkX3dpZHRoID09IC0xKQorCQkJCXNwZWMuZmllbGRfd2lkdGggPSAyICogc2l6ZW9mKHZvaWQgKik7CisJCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCAicEstZXJyb3IiLCBzcGVjKTsKKwkJfSBlbHNlIGlmICgoa3B0cl9yZXN0cmljdCA9PSAwKSB8fAorCQkJIChrcHRyX3Jlc3RyaWN0ID09IDEgJiYKKwkJCSAgaGFzX2NhcGFiaWxpdHlfbm9hdWRpdChjdXJyZW50LCBDQVBfU1lTTE9HKSkpCisJCQlicmVhazsKKworCQlpZiAoc3BlYy5maWVsZF93aWR0aCA9PSAtMSkgeworCQkJc3BlYy5maWVsZF93aWR0aCA9IDIgKiBzaXplb2Yodm9pZCAqKTsKKwkJCXNwZWMuZmxhZ3MgfD0gWkVST1BBRDsKKwkJfQorCQlyZXR1cm4gbnVtYmVyKGJ1ZiwgZW5kLCAwLCBzcGVjKTsKIAl9CiAJc3BlYy5mbGFncyB8PSBTTUFMTDsKIAlpZiAoc3BlYy5maWVsZF93aWR0aCA9PSAtMSkgewpAQCAtMTQ1MSw3ICsxNDczLDcgQEAKICAqIEBhcmdzOiBBcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCiAgKgogICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggaGF2ZSBiZWVuIHdyaXR0ZW4gaW50bwotICogdGhlIEBidWYgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJy4gSWYgQHNpemUgaXMgPD0gMCB0aGUgZnVuY3Rpb24KKyAqIHRoZSBAYnVmIG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcuIElmIEBzaXplIGlzID09IDAgdGhlIGZ1bmN0aW9uCiAgKiByZXR1cm5zIDAuCiAgKgogICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSB2YV9saXN0LgpAQCAtMTQ2NSw3ICsxNDg3LDExIEBACiAKIAlpID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZSwgZm10LCBhcmdzKTsKIAotCXJldHVybiAoaSA+PSBzaXplKSA/IChzaXplIC0gMSkgOiBpOworCWlmIChsaWtlbHkoaSA8IHNpemUpKQorCQlyZXR1cm4gaTsKKwlpZiAoc2l6ZSAhPSAwKQorCQlyZXR1cm4gc2l6ZSAtIDE7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHZzY25wcmludGYpOwogCkBAIC0xNTEzLDE0ICsxNTM5LDEwIEBACiAJaW50IGk7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCWkgPSB2c25wcmludGYoYnVmLCBzaXplLCBmbXQsIGFyZ3MpOworCWkgPSB2c2NucHJpbnRmKGJ1Ziwgc2l6ZSwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CiAKLQlpZiAobGlrZWx5KGkgPCBzaXplKSkKLQkJcmV0dXJuIGk7Ci0JaWYgKHNpemUgIT0gMCkKLQkJcmV0dXJuIHNpemUgLSAxOwotCXJldHVybiAwOworCXJldHVybiBpOwogfQogRVhQT1JUX1NZTUJPTChzY25wcmludGYpOwogCmRpZmYgLS1naXQgYS9saWIveHovS2NvbmZpZyBiL2xpYi94ei9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjZlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveHovS2NvbmZpZwpAQCAtMCwwICsxLDU5IEBACitjb25maWcgWFpfREVDCisJdHJpc3RhdGUgIlhaIGRlY29tcHJlc3Npb24gc3VwcG9ydCIKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBMWk1BMiBjb21wcmVzc2lvbiBhbGdvcml0aG0gYW5kIEJDSiBmaWx0ZXJzIGFyZSBzdXBwb3J0ZWQgdXNpbmcKKwkgIHRoZSAueHogZmlsZSBmb3JtYXQgYXMgdGhlIGNvbnRhaW5lci4gRm9yIGludGVncml0eSBjaGVja2luZywKKwkgIENSQzMyIGlzIHN1cHBvcnRlZC4gU2VlIERvY3VtZW50YXRpb24veHoudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgWFpfREVDX1g4NgorCWJvb2wgIng4NiBCQ0ogZmlsdGVyIGRlY29kZXIiIGlmIEVNQkVEREVECisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBYWl9ERUMKKwlzZWxlY3QgWFpfREVDX0JDSgorCitjb25maWcgWFpfREVDX1BPV0VSUEMKKwlib29sICJQb3dlclBDIEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFhaX0RFQworCXNlbGVjdCBYWl9ERUNfQkNKCisKK2NvbmZpZyBYWl9ERUNfSUE2NAorCWJvb2wgIklBLTY0IEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFhaX0RFQworCXNlbGVjdCBYWl9ERUNfQkNKCisKK2NvbmZpZyBYWl9ERUNfQVJNCisJYm9vbCAiQVJNIEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFhaX0RFQworCXNlbGVjdCBYWl9ERUNfQkNKCisKK2NvbmZpZyBYWl9ERUNfQVJNVEhVTUIKKwlib29sICJBUk0tVGh1bWIgQkNKIGZpbHRlciBkZWNvZGVyIiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gWFpfREVDCisJc2VsZWN0IFhaX0RFQ19CQ0oKKworY29uZmlnIFhaX0RFQ19TUEFSQworCWJvb2wgIlNQQVJDIEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFhaX0RFQworCXNlbGVjdCBYWl9ERUNfQkNKCisKK2NvbmZpZyBYWl9ERUNfQkNKCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgWFpfREVDX1RFU1QKKwl0cmlzdGF0ZSAiWFogZGVjb21wcmVzc29yIHRlc3RlciIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFhaX0RFQworCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHBhc3NpbmcgLnh6IGZpbGVzIHRvIHRoZSBpbi1rZXJuZWwgWFogZGVjb2RlciB2aWEKKwkgIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZS4gSXQgY2FsY3VsYXRlcyBDUkMzMiBvZiB0aGUgZGVjb21wcmVzc2VkCisJICBkYXRhIGFuZCB3cml0ZXMgZGlhZ25vc3RpY3MgdG8gdGhlIHN5c3RlbSBsb2cuCisKKwkgIFVubGVzcyB5b3UgYXJlIGRldmVsb3BpbmcgdGhlIFhaIGRlY29kZXIsIHlvdSBkb24ndCBuZWVkIHRoaXMKKwkgIGFuZCBzaG91bGQgc2F5IE4uCmRpZmYgLS1naXQgYS9saWIveHovTWFrZWZpbGUgYi9saWIveHovTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmYTc2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94ei9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19YWl9ERUMpICs9IHh6X2RlYy5vCit4el9kZWMteSA6PSB4el9kZWNfc3ltcy5vIHh6X2RlY19zdHJlYW0ubyB4el9kZWNfbHptYTIubworeHpfZGVjLSQoQ09ORklHX1haX0RFQ19CQ0opICs9IHh6X2RlY19iY2oubworCitvYmotJChDT05GSUdfWFpfREVDX1RFU1QpICs9IHh6X2RlY190ZXN0Lm8KZGlmZiAtLWdpdCBhL2xpYi94ei94el9jcmMzMi5jIGIvbGliL3h6L3h6X2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MzJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94ei94el9jcmMzMi5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDUkMzMiB1c2luZyB0aGUgcG9seW5vbWlhbCBmcm9tIElFRUUtODAyLjMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKy8qCisgKiBUaGlzIGlzIG5vdCB0aGUgZmFzdGVzdCBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IGlzIHByZXR0eSBjb21wYWN0LgorICogVGhlIGZhc3Rlc3QgdmVyc2lvbnMgb2YgeHpfY3JjMzIoKSBvbiBtb2Rlcm4gQ1BVcyB3aXRob3V0IGhhcmR3YXJlCisgKiBhY2NlbGVyYXRlZCBDUkMgaW5zdHJ1Y3Rpb24gYXJlIDMtNSB0aW1lcyBhcyBmYXN0IGFzIHRoaXMgdmVyc2lvbiwKKyAqIGJ1dCB0aGV5IGFyZSBiaWdnZXIgYW5kIHVzZSBtb3JlIG1lbW9yeSBmb3IgdGhlIGxvb2t1cCB0YWJsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorCisvKgorICogU1RBVElDX1JXX0RBVEEgaXMgdXNlZCBpbiB0aGUgcHJlLWJvb3QgZW52aXJvbm1lbnQgb24gc29tZSBhcmNoaXRlY3R1cmVzLgorICogU2VlIDxsaW51eC9kZWNvbXByZXNzL21tLmg+IGZvciBkZXRhaWxzLgorICovCisjaWZuZGVmIFNUQVRJQ19SV19EQVRBCisjCWRlZmluZSBTVEFUSUNfUldfREFUQSBzdGF0aWMKKyNlbmRpZgorCitTVEFUSUNfUldfREFUQSB1aW50MzJfdCB4el9jcmMzMl90YWJsZVsyNTZdOworCitYWl9FWFRFUk4gdm9pZCB4el9jcmMzMl9pbml0KHZvaWQpCit7CisJY29uc3QgdWludDMyX3QgcG9seSA9IDB4RURCODgzMjA7CisKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IGo7CisJdWludDMyX3QgcjsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlyID0gaTsKKwkJZm9yIChqID0gMDsgaiA8IDg7ICsraikKKwkJCXIgPSAociA+PiAxKSBeIChwb2x5ICYgfigociAmIDEpIC0gMSkpOworCisJCXh6X2NyYzMyX3RhYmxlW2ldID0gcjsKKwl9CisKKwlyZXR1cm47Cit9CisKK1haX0VYVEVSTiB1aW50MzJfdCB4el9jcmMzMihjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLCB1aW50MzJfdCBjcmMpCit7CisJY3JjID0gfmNyYzsKKworCXdoaWxlIChzaXplICE9IDApIHsKKwkJY3JjID0geHpfY3JjMzJfdGFibGVbKmJ1ZisrIF4gKGNyYyAmIDB4RkYpXSBeIChjcmMgPj4gOCk7CisJCS0tc2l6ZTsKKwl9CisKKwlyZXR1cm4gfmNyYzsKK30KZGlmZiAtLWdpdCBhL2xpYi94ei94el9kZWNfYmNqLmMgYi9saWIveHoveHpfZGVjX2Jjai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWUyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveHoveHpfZGVjX2Jjai5jCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXIgZGVjb2RlcnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBpbnNpZGUgdGhpcyBpZmRlZi4gSXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlIG1vcmUKKyAqIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyB3aXRob3V0IHN1cHBvcnQgZm9yIGFueSBCQ0ogZmlsdGVycy4KKyAqLworI2lmZGVmIFhaX0RFQ19CQ0oKKworc3RydWN0IHh6X2RlY19iY2ogeworCS8qIFR5cGUgb2YgdGhlIEJDSiBmaWx0ZXIgYmVpbmcgdXNlZCAqLworCWVudW0geworCQlCQ0pfWDg2ID0gNCwgICAgICAgIC8qIHg4NiBvciB4ODYtNjQgKi8KKwkJQkNKX1BPV0VSUEMgPSA1LCAgICAvKiBCaWcgZW5kaWFuIG9ubHkgKi8KKwkJQkNKX0lBNjQgPSA2LCAgICAgICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiAqLworCQlCQ0pfQVJNID0gNywgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfQVJNVEhVTUIgPSA4LCAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfU1BBUkMgPSA5ICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJfSB0eXBlOworCisJLyoKKwkgKiBSZXR1cm4gdmFsdWUgb2YgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gV2UgbmVlZCB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhbGwgdGhlIG5leHQKKwkgKiBmaWx0ZXIgYW55bW9yZSBvbmNlIGl0IGhhcyByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorCSAqLworCWVudW0geHpfcmV0IHJldDsKKworCS8qIFRydWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiBzaW5nbGUtY2FsbCBtb2RlLiAqLworCWJvb2wgc2luZ2xlX2NhbGw7CisKKwkvKgorCSAqIEFic29sdXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZAorCSAqIGRhdGEgKGluIGEgc2luZ2xlIC54eiBCbG9jaykuIFdlIGNhcmUgb25seSBhYm91dCB0aGUgbG93ZXN0IDMyCisJICogYml0cyBzbyB0aGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB1aW50NjRfdCBldmVuIHdpdGggYmlnIGZpbGVzLgorCSAqLworCXVpbnQzMl90IHBvczsKKworCS8qIHg4NiBmaWx0ZXIgc3RhdGUgKi8KKwl1aW50MzJfdCB4ODZfcHJldl9tYXNrOworCisJLyogVGVtcG9yYXJ5IHNwYWNlIHRvIGhvbGQgdGhlIHZhcmlhYmxlcyBmcm9tIHN0cnVjdCB4el9idWYgKi8KKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworCisJc3RydWN0IHsKKwkJLyogQW1vdW50IG9mIGFscmVhZHkgZmlsdGVyZWQgZGF0YSBpbiB0aGUgYmVnaW5uaW5nIG9mIGJ1ZiAqLworCQlzaXplX3QgZmlsdGVyZWQ7CisKKwkJLyogVG90YWwgYW1vdW50IG9mIGRhdGEgY3VycmVudGx5IHN0b3JlZCBpbiBidWYgICovCisJCXNpemVfdCBzaXplOworCisJCS8qCisJCSAqIEJ1ZmZlciB0byBob2xkIGEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEuIFRoaXMKKwkJICogbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIEFsaWdubWVudCArIDIgKiBMb29rLWFoZWFkOgorCQkgKgorCQkgKiBUeXBlICAgICAgICAgQWxpZ25tZW50ICAgTG9vay1haGVhZAorCQkgKiB4ODYgICAgICAgICAgICAgIDEgICAgICAgICAgIDQKKwkJICogUG93ZXJQQyAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqIElBLTY0ICAgICAgICAgICAxNiAgICAgICAgICAgMAorCQkgKiBBUk0gICAgICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogQVJNLVRodW1iICAgICAgICAyICAgICAgICAgICAyCisJCSAqIFNQQVJDICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKi8KKwkJdWludDhfdCBidWZbMTZdOworCX0gdGVtcDsKK307CisKKyNpZmRlZiBYWl9ERUNfWDg2CisvKgorICogVGhpcyBpcyB1c2VkIHRvIHRlc3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBhIG1lbW9yeSBhZGRyZXNzCisgKiBpbiBhbiB4ODYgaW5zdHJ1Y3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJjal94ODZfdGVzdF9tc2J5dGUodWludDhfdCBiKQoreworCXJldHVybiBiID09IDB4MDAgfHwgYiA9PSAweEZGOworfQorCitzdGF0aWMgc2l6ZV90IGJjal94ODYoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGJvb2wgbWFza190b19hbGxvd2VkX3N0YXR1c1s4XQorCQk9IHsgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UgfTsKKworCXN0YXRpYyBjb25zdCB1aW50OF90IG1hc2tfdG9fYml0X251bVs4XSA9IHsgMCwgMSwgMiwgMiwgMywgMywgMywgMyB9OworCisJc2l6ZV90IGk7CisJc2l6ZV90IHByZXZfcG9zID0gKHNpemVfdCktMTsKKwl1aW50MzJfdCBwcmV2X21hc2sgPSBzLT54ODZfcHJldl9tYXNrOworCXVpbnQzMl90IHNyYzsKKwl1aW50MzJfdCBkZXN0OworCXVpbnQzMl90IGo7CisJdWludDhfdCBiOworCisJaWYgKHNpemUgPD0gNCkKKwkJcmV0dXJuIDA7CisKKwlzaXplIC09IDQ7CisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworCQlpZiAoKGJ1ZltpXSAmIDB4RkUpICE9IDB4RTgpCisJCQljb250aW51ZTsKKworCQlwcmV2X3BvcyA9IGkgLSBwcmV2X3BvczsKKwkJaWYgKHByZXZfcG9zID4gMykgeworCQkJcHJldl9tYXNrID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSkpICYgNzsKKwkJCWlmIChwcmV2X21hc2sgIT0gMCkgeworCQkJCWIgPSBidWZbaSArIDQgLSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXV07CisJCQkJaWYgKCFtYXNrX3RvX2FsbG93ZWRfc3RhdHVzW3ByZXZfbWFza10KKwkJCQkJCXx8IGJjal94ODZfdGVzdF9tc2J5dGUoYikpIHsKKwkJCQkJcHJldl9wb3MgPSBpOworCQkJCQlwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IDEpIHwgMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHJldl9wb3MgPSBpOworCisJCWlmIChiY2pfeDg2X3Rlc3RfbXNieXRlKGJ1ZltpICsgNF0pKSB7CisJCQlzcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoYnVmICsgaSArIDEpOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlkZXN0ID0gc3JjIC0gKHMtPnBvcyArICh1aW50MzJfdClpICsgNSk7CisJCQkJaWYgKHByZXZfbWFzayA9PSAwKQorCQkJCQlicmVhazsKKworCQkJCWogPSBtYXNrX3RvX2JpdF9udW1bcHJldl9tYXNrXSAqIDg7CisJCQkJYiA9ICh1aW50OF90KShkZXN0ID4+ICgyNCAtIGopKTsKKwkJCQlpZiAoIWJjal94ODZfdGVzdF9tc2J5dGUoYikpCisJCQkJCWJyZWFrOworCisJCQkJc3JjID0gZGVzdCBeICgoKHVpbnQzMl90KTEgPDwgKDMyIC0gaikpIC0gMSk7CisJCQl9CisKKwkJCWRlc3QgJj0gMHgwMUZGRkZGRjsKKwkJCWRlc3QgfD0gKHVpbnQzMl90KTAgLSAoZGVzdCAmIDB4MDEwMDAwMDApOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKGRlc3QsIGJ1ZiArIGkgKyAxKTsKKwkJCWkgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgMSkgfCAxOworCQl9CisJfQorCisJcHJldl9wb3MgPSBpIC0gcHJldl9wb3M7CisJcy0+eDg2X3ByZXZfbWFzayA9IHByZXZfcG9zID4gMyA/IDAgOiBwcmV2X21hc2sgPDwgKHByZXZfcG9zIC0gMSk7CisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QT1dFUlBDCitzdGF0aWMgc2l6ZV90IGJjal9wb3dlcnBjKHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGluc3RyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWluc3RyID0gZ2V0X3VuYWxpZ25lZF9iZTMyKGJ1ZiArIGkpOworCQlpZiAoKGluc3RyICYgMHhGQzAwMDAwMykgPT0gMHg0ODAwMDAwMSkgeworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIC09IHMtPnBvcyArICh1aW50MzJfdClpOworCQkJaW5zdHIgJj0gMHgwM0ZGRkZGQzsKKwkJCWluc3RyIHw9IDB4NDgwMDAwMDE7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19JQTY0CitzdGF0aWMgc2l6ZV90IGJjal9pYTY0KHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCB1aW50OF90IGJyYW5jaF90YWJsZVszMl0gPSB7CisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTQsIDQsIDYsIDYsIDAsIDAsIDcsIDcsCisJCTQsIDQsIDAsIDAsIDQsIDQsIDAsIDAKKwl9OworCisJLyoKKwkgKiBUaGUgbG9jYWwgdmFyaWFibGVzIHRha2UgYSBsaXR0bGUgYml0IHN0YWNrIHNwYWNlLCBidXQgaXQncyBsZXNzCisJICogdGhhbiB3aGF0IExaTUEyIGRlY29kZXIgdGFrZXMsIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWR1Y2UKKwkgKiBzdGFjayB1c2FnZSBoZXJlIHdpdGhvdXQgZG9pbmcgdGhhdCBmb3IgdGhlIExaTUEyIGRlY29kZXIgdG9vLgorCSAqLworCisJLyogTG9vcCBjb3VudGVycyAqLworCXNpemVfdCBpOworCXNpemVfdCBqOworCisJLyogSW5zdHJ1Y3Rpb24gc2xvdCAoMCwgMSwgb3IgMikgaW4gdGhlIDEyOC1iaXQgaW5zdHJ1Y3Rpb24gd29yZCAqLworCXVpbnQzMl90IHNsb3Q7CisKKwkvKiBCaXR3aXNlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW5kaWNhdGVkIGJ5IHNsb3QgKi8KKwl1aW50MzJfdCBiaXRfcG9zOworCisJLyogYml0X3BvcyBzcGxpdCBpbnRvIGJ5dGUgYW5kIGJpdCBwYXJ0cyAqLworCXVpbnQzMl90IGJ5dGVfcG9zOworCXVpbnQzMl90IGJpdF9yZXM7CisKKwkvKiBBZGRyZXNzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKwl1aW50MzJfdCBhZGRyOworCisJLyogTWFzayB1c2VkIHRvIGRldGVjdCB3aGljaCBpbnN0cnVjdGlvbnMgdG8gY29udmVydCAqLworCXVpbnQzMl90IG1hc2s7CisKKwkvKiA0MS1iaXQgaW5zdHJ1Y3Rpb24gc3RvcmVkIHNvbWV3aGVyZSBpbiB0aGUgbG93ZXN0IDQ4IGJpdHMgKi8KKwl1aW50NjRfdCBpbnN0cjsKKworCS8qIEluc3RydWN0aW9uIG5vcm1hbGl6ZWQgd2l0aCBiaXRfcmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uICovCisJdWludDY0X3Qgbm9ybTsKKworCWZvciAoaSA9IDA7IGkgKyAxNiA8PSBzaXplOyBpICs9IDE2KSB7CisJCW1hc2sgPSBicmFuY2hfdGFibGVbYnVmW2ldICYgMHgxRl07CisJCWZvciAoc2xvdCA9IDAsIGJpdF9wb3MgPSA1OyBzbG90IDwgMzsgKytzbG90LCBiaXRfcG9zICs9IDQxKSB7CisJCQlpZiAoKChtYXNrID4+IHNsb3QpICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJYnl0ZV9wb3MgPSBiaXRfcG9zID4+IDM7CisJCQliaXRfcmVzID0gYml0X3BvcyAmIDc7CisJCQlpbnN0ciA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgKytqKQorCQkJCWluc3RyIHw9ICh1aW50NjRfdCkoYnVmW2kgKyBqICsgYnl0ZV9wb3NdKQorCQkJCQkJPDwgKDggKiBqKTsKKworCQkJbm9ybSA9IGluc3RyID4+IGJpdF9yZXM7CisKKwkJCWlmICgoKG5vcm0gPj4gMzcpICYgMHgwRikgPT0gMHgwNQorCQkJCQkmJiAoKG5vcm0gPj4gOSkgJiAweDA3KSA9PSAwKSB7CisJCQkJYWRkciA9IChub3JtID4+IDEzKSAmIDB4MEZGRkZGOworCQkJCWFkZHIgfD0gKCh1aW50MzJfdCkobm9ybSA+PiAzNikgJiAxKSA8PCAyMDsKKwkJCQlhZGRyIDw8PSA0OworCQkJCWFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQkJYWRkciA+Pj0gNDsKKworCQkJCW5vcm0gJj0gfigodWludDY0X3QpMHg4RkZGRkYgPDwgMTMpOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgwRkZGRkYpIDw8IDEzOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgxMDAwMDApCisJCQkJCQk8PCAoMzYgLSAyMCk7CisKKwkJCQlpbnN0ciAmPSAoMSA8PCBiaXRfcmVzKSAtIDE7CisJCQkJaW5zdHIgfD0gbm9ybSA8PCBiaXRfcmVzOworCisJCQkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkJCQkJYnVmW2kgKyBqICsgYnl0ZV9wb3NdCisJCQkJCQk9ICh1aW50OF90KShpbnN0ciA+PiAoOCAqIGopKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNCitzdGF0aWMgc2l6ZV90IGJjal9hcm0oc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgYWRkcjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpZiAoYnVmW2kgKyAzXSA9PSAweEVCKSB7CisJCQlhZGRyID0gKHVpbnQzMl90KWJ1ZltpXSB8ICgodWludDMyX3QpYnVmW2kgKyAxXSA8PCA4KQorCQkJCQl8ICgodWludDMyX3QpYnVmW2kgKyAyXSA8PCAxNik7CisJCQlhZGRyIDw8PSAyOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDg7CisJCQlhZGRyID4+PSAyOworCQkJYnVmW2ldID0gKHVpbnQ4X3QpYWRkcjsKKwkJCWJ1ZltpICsgMV0gPSAodWludDhfdCkoYWRkciA+PiA4KTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdCkoYWRkciA+PiAxNik7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCitzdGF0aWMgc2l6ZV90IGJjal9hcm10aHVtYihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBhZGRyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSAyKSB7CisJCWlmICgoYnVmW2kgKyAxXSAmIDB4RjgpID09IDB4RjAKKwkJCQkmJiAoYnVmW2kgKyAzXSAmIDB4RjgpID09IDB4RjgpIHsKKwkJCWFkZHIgPSAoKCh1aW50MzJfdClidWZbaSArIDFdICYgMHgwNykgPDwgMTkpCisJCQkJCXwgKCh1aW50MzJfdClidWZbaV0gPDwgMTEpCisJCQkJCXwgKCgodWludDMyX3QpYnVmW2kgKyAzXSAmIDB4MDcpIDw8IDgpCisJCQkJCXwgKHVpbnQzMl90KWJ1ZltpICsgMl07CisJCQlhZGRyIDw8PSAxOworCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaSArIDQ7CisJCQlhZGRyID4+PSAxOworCQkJYnVmW2kgKyAxXSA9ICh1aW50OF90KSgweEYwIHwgKChhZGRyID4+IDE5KSAmIDB4MDcpKTsKKwkJCWJ1ZltpXSA9ICh1aW50OF90KShhZGRyID4+IDExKTsKKwkJCWJ1ZltpICsgM10gPSAodWludDhfdCkoMHhGOCB8ICgoYWRkciA+PiA4KSAmIDB4MDcpKTsKKwkJCWJ1ZltpICsgMl0gPSAodWludDhfdClhZGRyOworCQkJaSArPSAyOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19TUEFSQworc3RhdGljIHNpemVfdCBiY2pfc3BhcmMoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaW5zdHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaW5zdHIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmICsgaSk7CisJCWlmICgoaW5zdHIgPj4gMjIpID09IDB4MTAwIHx8IChpbnN0ciA+PiAyMikgPT0gMHgxRkYpIHsKKwkJCWluc3RyIDw8PSAyOworCQkJaW5zdHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQlpbnN0ciA+Pj0gMjsKKwkJCWluc3RyID0gKCh1aW50MzJfdCkweDQwMDAwMDAwIC0gKGluc3RyICYgMHg0MDAwMDApKQorCQkJCQl8IDB4NDAwMDAwMDAgfCAoaW5zdHIgJiAweDNGRkZGRik7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworLyoKKyAqIEFwcGx5IHRoZSBzZWxlY3RlZCBCQ0ogZmlsdGVyLiBVcGRhdGUgKnBvcyBhbmQgcy0+cG9zIHRvIG1hdGNoIHRoZSBhbW91bnQKKyAqIG9mIGRhdGEgdGhhdCBnb3QgZmlsdGVyZWQuCisgKgorICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHN3aXRjaCBzdGF0ZW1lbnQgdG8gYXZvaWQgdXNpbmcgZnVuY3Rpb24KKyAqIHBvaW50ZXJzLCB3aGljaCBjb3VsZCBiZSBwcm9ibGVtYXRpYyBpbiB0aGUga2VybmVsIGJvb3QgY29kZSwgd2hpY2ggbXVzdAorICogYXZvaWQgcG9pbnRlcnMgdG8gc3RhdGljIGRhdGEgKGF0IGxlYXN0IG9uIHg4NikuCisgKi8KK3N0YXRpYyB2b2lkIGJjal9hcHBseShzdHJ1Y3QgeHpfZGVjX2JjaiAqcywKKwkJICAgICAgdWludDhfdCAqYnVmLCBzaXplX3QgKnBvcywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGZpbHRlcmVkOworCisJYnVmICs9ICpwb3M7CisJc2l6ZSAtPSAqcG9zOworCisJc3dpdGNoIChzLT50eXBlKSB7CisjaWZkZWYgWFpfREVDX1g4NgorCWNhc2UgQkNKX1g4NjoKKwkJZmlsdGVyZWQgPSBiY2pfeDg2KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorCQlmaWx0ZXJlZCA9IGJjal9wb3dlcnBjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorCQlmaWx0ZXJlZCA9IGJjal9pYTY0KHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKwkJZmlsdGVyZWQgPSBiY2pfYXJtKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisJY2FzZSBCQ0pfQVJNVEhVTUI6CisJCWZpbHRlcmVkID0gYmNqX2FybXRodW1iKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisJCWZpbHRlcmVkID0gYmNqX3NwYXJjKHMsIGJ1Ziwgc2l6ZSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJLyogTmV2ZXIgcmVhY2hlZCBidXQgc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncy4gKi8KKwkJZmlsdGVyZWQgPSAwOworCQlicmVhazsKKwl9CisKKwkqcG9zICs9IGZpbHRlcmVkOworCXMtPnBvcyArPSBmaWx0ZXJlZDsKK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKiBNb3ZlIHRoZSByZW1haW5pbmcgbWl4dHVyZSBvZiBwb3NzaWJseSBmaWx0ZXJlZCBhbmQgdW5maWx0ZXJlZAorICogZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRlbXAuCisgKi8KK3N0YXRpYyB2b2lkIGJjal9mbHVzaChzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplOworCisJY29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBzLT50ZW1wLmZpbHRlcmVkLCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLmJ1ZiwgY29weV9zaXplKTsKKwliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKworCXMtPnRlbXAuZmlsdGVyZWQgLT0gY29weV9zaXplOworCXMtPnRlbXAuc2l6ZSAtPSBjb3B5X3NpemU7CisJbWVtbW92ZShzLT50ZW1wLmJ1Ziwgcy0+dGVtcC5idWYgKyBjb3B5X3NpemUsIHMtPnRlbXAuc2l6ZSk7Cit9CisKKy8qCisgKiBUaGUgQkNKIGZpbHRlciBmdW5jdGlvbnMgYXJlIHByaW1pdGl2ZSBpbiBzZW5zZSB0aGF0IHRoZXkgcHJvY2VzcyB0aGUKKyAqIGRhdGEgaW4gY2h1bmtzIG9mIDEtMTYgYnl0ZXMuIFRvIGhpZGUgdGhpcyBpc3N1ZSwgdGhpcyBmdW5jdGlvbiBkb2VzCisgKiBzb21lIGJ1ZmZlcmluZy4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcnVuKHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQkJCSAgICAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsCisJCQkJICAgICBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBvdXRfc3RhcnQ7CisKKwkvKgorCSAqIEZsdXNoIHBlbmRpbmcgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBSZXR1cm4KKwkgKiBpbW1lZGlhdGVsbHkgaWYgd2UgY291bGRuJ3QgZmx1c2ggZXZlcnl0aGluZywgb3IgaWYgdGhlIG5leHQKKwkgKiBmaWx0ZXIgaW4gdGhlIGNoYWluIGhhZCBhbHJlYWR5IHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisJICovCisJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKSB7CisJCWJjal9mbHVzaChzLCBiKTsKKwkJaWYgKHMtPnRlbXAuZmlsdGVyZWQgPiAwKQorCQkJcmV0dXJuIFhaX09LOworCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBtb3JlIG91dHB1dCBzcGFjZSB0aGFuIHdoYXQgaXMgY3VycmVudGx5IHBlbmRpbmcgaW4KKwkgKiB0ZW1wLCBjb3B5IHRoZSB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisJICogYW5kIHRyeSB0byBmaWxsIHRoZSBvdXRwdXQgYnVmZmVyIGJ5IGRlY29kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZQorCSAqIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gQXBwbHkgdGhlIEJDSiBmaWx0ZXIgb24gdGhlIG5ldyBkYXRhCisJICogaW4gdGhlIG91dHB1dCBidWZmZXIuIElmIGV2ZXJ5dGhpbmcgY2Fubm90IGJlIGZpbHRlcmVkLCBjb3B5IGl0CisJICogdG8gdGVtcCBhbmQgcmV3aW5kIHRoZSBvdXRwdXQgYnVmZmVyIHBvc2l0aW9uIGFjY29yZGluZ2x5LgorCSAqLworCWlmIChzLT50ZW1wLnNpemUgPCBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpIHsKKwkJb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKwkJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBzLT50ZW1wLnNpemUpOworCQliLT5vdXRfcG9zICs9IHMtPnRlbXAuc2l6ZTsKKworCQlzLT5yZXQgPSB4el9kZWNfbHptYTJfcnVuKGx6bWEyLCBiKTsKKwkJaWYgKHMtPnJldCAhPSBYWl9TVFJFQU1fRU5ECisJCQkJJiYgKHMtPnJldCAhPSBYWl9PSyB8fCBzLT5zaW5nbGVfY2FsbCkpCisJCQlyZXR1cm4gcy0+cmV0OworCisJCWJjal9hcHBseShzLCBiLT5vdXQsICZvdXRfc3RhcnQsIGItPm91dF9wb3MpOworCisJCS8qCisJCSAqIEFzIGFuIGV4Y2VwdGlvbiwgaWYgdGhlIG5leHQgZmlsdGVyIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsCisJCSAqIHdlIGNhbiBkbyB0aGF0IHRvbywgc2luY2UgdGhlIGxhc3QgZmV3IGJ5dGVzIHRoYXQgcmVtYWluCisJCSAqIHVuZmlsdGVyZWQgYXJlIG1lYW50IHRvIHJlbWFpbiB1bmZpbHRlcmVkLgorCQkgKi8KKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKwkJcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvcyAtIG91dF9zdGFydDsKKwkJYi0+b3V0X3BvcyAtPSBzLT50ZW1wLnNpemU7CisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5zaXplKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgdW5maWx0ZXJlZCBkYXRhIGluIHRlbXAsIHRyeSB0byBmaWxsIGJ5IGRlY29kaW5nIG1vcmUKKwkgKiBkYXRhIGZyb20gdGhlIG5leHQgZmlsdGVyLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0ZW1wLiBUaGVuIHdlCisJICogaG9wZWZ1bGx5IGNhbiBmaWxsIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlciBieSBjb3B5aW5nIGZpbHRlcmVkCisJICogZGF0YSBmcm9tIHRlbXAuIEEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEgbWF5IGJlIGxlZnQKKwkgKiBpbiB0ZW1wOyBpdCB3aWxsIGJlIHRha2VuIGNhcmUgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWlmIChzLT50ZW1wLnNpemUgPiAwKSB7CisJCS8qIE1ha2UgYi0+b3V0eyxfcG9zLF9zaXplfSB0ZW1wb3JhcmlseSBwb2ludCB0byBzLT50ZW1wLiAqLworCQlzLT5vdXQgPSBiLT5vdXQ7CisJCXMtPm91dF9wb3MgPSBiLT5vdXRfcG9zOworCQlzLT5vdXRfc2l6ZSA9IGItPm91dF9zaXplOworCQliLT5vdXQgPSBzLT50ZW1wLmJ1ZjsKKwkJYi0+b3V0X3BvcyA9IHMtPnRlbXAuc2l6ZTsKKwkJYi0+b3V0X3NpemUgPSBzaXplb2Yocy0+dGVtcC5idWYpOworCisJCXMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCisJCXMtPnRlbXAuc2l6ZSA9IGItPm91dF9wb3M7CisJCWItPm91dCA9IHMtPm91dDsKKwkJYi0+b3V0X3BvcyA9IHMtPm91dF9wb3M7CisJCWItPm91dF9zaXplID0gcy0+b3V0X3NpemU7CisKKwkJaWYgKHMtPnJldCAhPSBYWl9PSyAmJiBzLT5yZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBzLT5yZXQ7CisKKwkJYmNqX2FwcGx5KHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5maWx0ZXJlZCwgcy0+dGVtcC5zaXplKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbmV4dCBmaWx0ZXIgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwgd2UgbWFyayB0aGF0CisJCSAqIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQsIHNpbmNlIHRoZSBsYXN0IHVuZmlsdGVyZWQgYnl0ZXMKKwkJICogb2YgdGhlIHN0cmVhbSBhcmUgbWVhbnQgdG8gYmUgbGVmdCBhcyBpcy4KKwkJICovCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXMtPnRlbXAuZmlsdGVyZWQgPSBzLT50ZW1wLnNpemU7CisKKwkJYmNqX2ZsdXNoKHMsIGIpOworCQlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApCisJCQlyZXR1cm4gWFpfT0s7CisJfQorCisJcmV0dXJuIHMtPnJldDsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfYmNqICp4el9kZWNfYmNqX2NyZWF0ZShib29sIHNpbmdsZV9jYWxsKQoreworCXN0cnVjdCB4el9kZWNfYmNqICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyAhPSBOVUxMKQorCQlzLT5zaW5nbGVfY2FsbCA9IHNpbmdsZV9jYWxsOworCisJcmV0dXJuIHM7Cit9CisKK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfYmNqX3Jlc2V0KHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKyNpZmRlZiBYWl9ERUNfWDg2CisJY2FzZSBCQ0pfWDg2OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorCWNhc2UgQkNKX0FSTVRIVU1COgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisjZW5kaWYKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbnN1cHBvcnRlZCBGaWx0ZXIgSUQgKi8KKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorCisJcy0+dHlwZSA9IGlkOworCXMtPnJldCA9IFhaX09LOworCXMtPnBvcyA9IDA7CisJcy0+eDg2X3ByZXZfbWFzayA9IDA7CisJcy0+dGVtcC5maWx0ZXJlZCA9IDA7CisJcy0+dGVtcC5zaXplID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIveHoveHpfZGVjX2x6bWEyLmMgYi9saWIveHoveHpfZGVjX2x6bWEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1ZmE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94ei94el9kZWNfbHptYTIuYwpAQCAtMCwwICsxLDExNzEgQEAKKy8qCisgKiBMWk1BMiBkZWNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInh6X2x6bWEyLmgiCisKKy8qCisgKiBSYW5nZSBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGVhdHMgdGhlIGZpcnN0IGZpdmUgYnl0ZXMgb2YgZWFjaCBMWk1BIGNodW5rLgorICovCisjZGVmaW5lIFJDX0lOSVRfQllURVMgNQorCisvKgorICogTWluaW11bSBudW1iZXIgb2YgdXNhYmxlIGlucHV0IGJ1ZmZlciB0byBzYWZlbHkgZGVjb2RlIG9uZSBMWk1BIHN5bWJvbC4KKyAqIFRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgd2UgZGVjb2RlIDIyIGJpdHMgdXNpbmcgcHJvYmFiaWxpdGllcyBhbmQgMjYKKyAqIGRpcmVjdCBiaXRzLiBUaGlzIG1heSBkZWNvZGUgYXQgbWF4aW11bSBvZiAyMCBieXRlcyBvZiBpbnB1dC4gSG93ZXZlciwKKyAqIGx6bWFfbWFpbigpIGRvZXMgYW4gZXh0cmEgbm9ybWFsaXphdGlvbiBiZWZvcmUgcmV0dXJuaW5nLCB0aHVzIHdlCisgKiBuZWVkIHRvIHB1dCAyMSBoZXJlLgorICovCisjZGVmaW5lIExaTUFfSU5fUkVRVUlSRUQgMjEKKworLyoKKyAqIERpY3Rpb25hcnkgKGhpc3RvcnkgYnVmZmVyKQorICoKKyAqIFRoZXNlIGFyZSBhbHdheXMgdHJ1ZToKKyAqICAgIHN0YXJ0IDw9IHBvcyA8PSBmdWxsIDw9IGVuZAorICogICAgcG9zIDw9IGxpbWl0IDw9IGVuZAorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgYWxzbyB0aGVzZSBhcmUgdHJ1ZToKKyAqICAgIGVuZCA9PSBzaXplCisgKiAgICBzaXplIDw9IHNpemVfbWF4CisgKiAgICBhbGxvY2F0ZWQgPD0gc2l6ZQorICoKKyAqIE1vc3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBzaXplX3QgdG8gc3VwcG9ydCBzaW5nbGUtY2FsbCBtb2RlLAorICogaW4gd2hpY2ggdGhlIGRpY3Rpb25hcnkgdmFyaWFibGVzIGFkZHJlc3MgdGhlIGFjdHVhbCBvdXRwdXQKKyAqIGJ1ZmZlciBkaXJlY3RseS4KKyAqLworc3RydWN0IGRpY3Rpb25hcnkgeworCS8qIEJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBidWZmZXIgKi8KKwl1aW50OF90ICpidWY7CisKKwkvKiBPbGQgcG9zaXRpb24gaW4gYnVmIChiZWZvcmUgZGVjb2RpbmcgbW9yZSBkYXRhKSAqLworCXNpemVfdCBzdGFydDsKKworCS8qIFBvc2l0aW9uIGluIGJ1ZiAqLworCXNpemVfdCBwb3M7CisKKwkvKgorCSAqIEhvdyBmdWxsIGRpY3Rpb25hcnkgaXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QgY29ycnVwdCBpbnB1dCB0aGF0CisJICogd291bGQgcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKwkgKi8KKwlzaXplX3QgZnVsbDsKKworCS8qIFdyaXRlIGxpbWl0OyB3ZSBkb24ndCB3cml0ZSB0byBidWZbbGltaXRdIG9yIGxhdGVyIGJ5dGVzLiAqLworCXNpemVfdCBsaW1pdDsKKworCS8qCisJICogRW5kIG9mIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4gSW4gbXVsdGktY2FsbCBtb2RlLCB0aGlzIGlzCisJICogdGhlIHNhbWUgYXMgdGhlIGRpY3Rpb25hcnkgc2l6ZS4gSW4gc2luZ2xlLWNhbGwgbW9kZSwgdGhpcworCSAqIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKwkgKi8KKwlzaXplX3QgZW5kOworCisJLyoKKwkgKiBTaXplIG9mIHRoZSBkaWN0aW9uYXJ5IGFzIHNwZWNpZmllZCBpbiBCbG9jayBIZWFkZXIuIFRoaXMgaXMgdXNlZAorCSAqIHRvZ2V0aGVyIHdpdGggImZ1bGwiIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQgd291bGQgbWFrZSB1cworCSAqIHJlYWQgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0uCisJICovCisJdWludDMyX3Qgc2l6ZTsKKworCS8qCisJICogTWF4aW11bSBhbGxvd2VkIGRpY3Rpb25hcnkgc2l6ZSBpbiBtdWx0aS1jYWxsIG1vZGUuCisJICogVGhpcyBpcyBpZ25vcmVkIGluIHNpbmdsZS1jYWxsIG1vZGUuCisJICovCisJdWludDMyX3Qgc2l6ZV9tYXg7CisKKwkvKgorCSAqIEFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IGFsbG9jYXRlZCBmb3IgdGhlIGRpY3Rpb25hcnkuCisJICogVGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBYWl9EWU5BTExPQy4gKFdpdGggWFpfUFJFQUxMT0MsCisJICogc2l6ZV9tYXggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBhbGxvY2F0ZWQgc2l6ZS4pCisJICovCisJdWludDMyX3QgYWxsb2NhdGVkOworCisJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwllbnVtIHh6X21vZGUgbW9kZTsKK307CisKKy8qIFJhbmdlIGRlY29kZXIgKi8KK3N0cnVjdCByY19kZWMgeworCXVpbnQzMl90IHJhbmdlOworCXVpbnQzMl90IGNvZGU7CisKKwkvKgorCSAqIE51bWJlciBvZiBpbml0aWFsaXppbmcgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHJlYWQKKwkgKiBieSByY19yZWFkX2luaXQoKS4KKwkgKi8KKwl1aW50MzJfdCBpbml0X2J5dGVzX2xlZnQ7CisKKwkvKgorCSAqIEJ1ZmZlciBmcm9tIHdoaWNoIHdlIHJlYWQgb3VyIGlucHV0LiBJdCBjYW4gYmUgZWl0aGVyCisJICogdGVtcC5idWYgb3IgdGhlIGNhbGxlci1wcm92aWRlZCBpbnB1dCBidWZmZXIuCisJICovCisJY29uc3QgdWludDhfdCAqaW47CisJc2l6ZV90IGluX3BvczsKKwlzaXplX3QgaW5fbGltaXQ7Cit9OworCisvKiBQcm9iYWJpbGl0aWVzIGZvciBhIGxlbmd0aCBkZWNvZGVyLiAqLworc3RydWN0IGx6bWFfbGVuX2RlYyB7CisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDEwICovCisJdWludDE2X3QgY2hvaWNlOworCisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDE4ICovCisJdWludDE2X3QgY2hvaWNlMjsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMi05ICovCisJdWludDE2X3QgbG93W1BPU19TVEFURVNfTUFYXVtMRU5fTE9XX1NZTUJPTFNdOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxMC0xNyAqLworCXVpbnQxNl90IG1pZFtQT1NfU1RBVEVTX01BWF1bTEVOX01JRF9TWU1CT0xTXTsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMTgtMjczICovCisJdWludDE2X3QgaGlnaFtMRU5fSElHSF9TWU1CT0xTXTsKK307CisKK3N0cnVjdCBsem1hX2RlYyB7CisJLyogRGlzdGFuY2VzIG9mIGxhdGVzdCBmb3VyIG1hdGNoZXMgKi8KKwl1aW50MzJfdCByZXAwOworCXVpbnQzMl90IHJlcDE7CisJdWludDMyX3QgcmVwMjsKKwl1aW50MzJfdCByZXAzOworCisJLyogVHlwZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgc2VlbiBMWk1BIHN5bWJvbHMgKi8KKwllbnVtIGx6bWFfc3RhdGUgc3RhdGU7CisKKwkvKgorCSAqIExlbmd0aCBvZiBhIG1hdGNoLiBUaGlzIGlzIHVwZGF0ZWQgc28gdGhhdCBkaWN0X3JlcGVhdCBjYW4KKwkgKiBiZSBjYWxsZWQgYWdhaW4gdG8gZmluaXNoIHJlcGVhdGluZyB0aGUgd2hvbGUgbWF0Y2guCisJICovCisJdWludDMyX3QgbGVuOworCisJLyoKKwkgKiBMWk1BIHByb3BlcnRpZXMgb3IgcmVsYXRlZCBiaXQgbWFza3MgKG51bWJlciBvZiBsaXRlcmFsCisJICogY29udGV4dCBiaXRzLCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIgb2YgbGl0ZXJhbAorCSAqIHBvc2l0aW9uIGJpdHMsIGFuZCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIKKwkgKiBwb3NpdGlvbiBiaXRzKQorCSAqLworCXVpbnQzMl90IGxjOworCXVpbnQzMl90IGxpdGVyYWxfcG9zX21hc2s7IC8qICgxIDw8IGxwKSAtIDEgKi8KKwl1aW50MzJfdCBwb3NfbWFzazsgICAgICAgICAvKiAoMSA8PCBwYikgLSAxICovCisKKwkvKiBJZiAxLCBpdCdzIGEgbWF0Y2guIE90aGVyd2lzZSBpdCdzIGEgc2luZ2xlIDgtYml0IGxpdGVyYWwuICovCisJdWludDE2X3QgaXNfbWF0Y2hbU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisKKwkvKiBJZiAxLCBpdCdzIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgcmVwMCAuLiByZXAzLiAqLworCXVpbnQxNl90IGlzX3JlcFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDAuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDEuCisJICovCisJdWludDE2X3QgaXNfcmVwMFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDEuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDIuCisJICovCisJdWludDE2X3QgaXNfcmVwMVtTVEFURVNdOworCisJLyogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAyLiBPdGhlcndpc2UgaXQgaXMgcmVwMy4gKi8KKwl1aW50MTZfdCBpc19yZXAyW1NUQVRFU107CisKKwkvKgorCSAqIElmIDEsIHRoZSByZXBlYXRlZCBtYXRjaCBoYXMgbGVuZ3RoIG9mIG9uZSBieXRlLiBPdGhlcndpc2UKKwkgKiB0aGUgbGVuZ3RoIGlzIGRlY29kZWQgZnJvbSByZXBfbGVuX2RlY29kZXIuCisJICovCisJdWludDE2X3QgaXNfcmVwMF9sb25nW1NUQVRFU11bUE9TX1NUQVRFU19NQVhdOworCisJLyoKKwkgKiBQcm9iYWJpbGl0eSB0cmVlIGZvciB0aGUgaGlnaGVzdCB0d28gYml0cyBvZiB0aGUgbWF0Y2gKKwkgKiBkaXN0YW5jZS4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBwcm9iYWJpbGl0eSB0cmVlIGZvciBtYXRjaAorCSAqIGxlbmd0aHMgb2YgMiAoaS5lLiBNQVRDSF9MRU5fTUlOKSwgMywgNCwgYW5kIFs1LCAyNzNdLgorCSAqLworCXVpbnQxNl90IGRpc3Rfc2xvdFtESVNUX1NUQVRFU11bRElTVF9TTE9UU107CisKKwkvKgorCSAqIFByb2JpbGl0eSB0cmVlcyBmb3IgYWRkaXRpb25hbCBiaXRzIGZvciBtYXRjaCBkaXN0YW5jZQorCSAqIHdoZW4gdGhlIGRpc3RhbmNlIGlzIGluIHRoZSByYW5nZSBbNCwgMTI3XS4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X3NwZWNpYWxbRlVMTF9ESVNUQU5DRVMgLSBESVNUX01PREVMX0VORF07CisKKwkvKgorCSAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBsb3dlc3QgZm91ciBiaXRzIG9mIGEgbWF0Y2gKKwkgKiBkaXN0YW5jZSB0aGF0IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAxMjguCisJICovCisJdWludDE2X3QgZGlzdF9hbGlnbltBTElHTl9TSVpFXTsKKworCS8qIExlbmd0aCBvZiBhIG5vcm1hbCBtYXRjaCAqLworCXN0cnVjdCBsem1hX2xlbl9kZWMgbWF0Y2hfbGVuX2RlYzsKKworCS8qIExlbmd0aCBvZiBhIHJlcGVhdGVkIG1hdGNoICovCisJc3RydWN0IGx6bWFfbGVuX2RlYyByZXBfbGVuX2RlYzsKKworCS8qIFByb2JhYmlsaXRpZXMgb2YgbGl0ZXJhbHMgKi8KKwl1aW50MTZfdCBsaXRlcmFsW0xJVEVSQUxfQ09ERVJTX01BWF1bTElURVJBTF9DT0RFUl9TSVpFXTsKK307CisKK3N0cnVjdCBsem1hMl9kZWMgeworCS8qIFBvc2l0aW9uIGluIHh6X2RlY19sem1hMl9ydW4oKS4gKi8KKwllbnVtIGx6bWEyX3NlcSB7CisJCVNFUV9DT05UUk9MLAorCQlTRVFfVU5DT01QUkVTU0VEXzEsCisJCVNFUV9VTkNPTVBSRVNTRURfMiwKKwkJU0VRX0NPTVBSRVNTRURfMCwKKwkJU0VRX0NPTVBSRVNTRURfMSwKKwkJU0VRX1BST1BFUlRJRVMsCisJCVNFUV9MWk1BX1BSRVBBUkUsCisJCVNFUV9MWk1BX1JVTiwKKwkJU0VRX0NPUFkKKwl9IHNlcXVlbmNlOworCisJLyogTmV4dCBwb3NpdGlvbiBhZnRlciBkZWNvZGluZyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjaHVuay4gKi8KKwllbnVtIGx6bWEyX3NlcSBuZXh0X3NlcXVlbmNlOworCisJLyogVW5jb21wcmVzc2VkIHNpemUgb2YgTFpNQSBjaHVuayAoMiBNaUIgYXQgbWF4aW11bSkgKi8KKwl1aW50MzJfdCB1bmNvbXByZXNzZWQ7CisKKwkvKgorCSAqIENvbXByZXNzZWQgc2l6ZSBvZiBMWk1BIGNodW5rIG9yIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkCisJICogc2l6ZSBvZiB1bmNvbXByZXNzZWQgY2h1bmsgKDY0IEtpQiBhdCBtYXhpbXVtKQorCSAqLworCXVpbnQzMl90IGNvbXByZXNzZWQ7CisKKwkvKgorCSAqIFRydWUgaWYgZGljdGlvbmFyeSByZXNldCBpcyBuZWVkZWQuIFRoaXMgaXMgZmFsc2UgYmVmb3JlCisJICogdGhlIGZpcnN0IGNodW5rIChMWk1BIG9yIHVuY29tcHJlc3NlZCkuCisJICovCisJYm9vbCBuZWVkX2RpY3RfcmVzZXQ7CisKKwkvKgorCSAqIFRydWUgaWYgbmV3IExaTUEgcHJvcGVydGllcyBhcmUgbmVlZGVkLiBUaGlzIGlzIGZhbHNlCisJICogYmVmb3JlIHRoZSBmaXJzdCBMWk1BIGNodW5rLgorCSAqLworCWJvb2wgbmVlZF9wcm9wczsKK307CisKK3N0cnVjdCB4el9kZWNfbHptYTIgeworCS8qCisJICogVGhlIG9yZGVyIGJlbG93IGlzIGltcG9ydGFudCBvbiB4ODYgdG8gcmVkdWNlIGNvZGUgc2l6ZSBhbmQKKwkgKiBpdCBzaG91bGRuJ3QgaHVydCBvbiBvdGhlciBwbGF0Zm9ybXMuIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kCisJICogaW5jbHVkaW5nIGx6bWEucG9zX21hc2sgYXJlIGluIHRoZSBmaXJzdCAxMjggYnl0ZXMgb24geDg2LTMyLAorCSAqIHdoaWNoIGFsbG93cyB1c2luZyBzbWFsbGVyIGluc3RydWN0aW9ucyB0byBhY2Nlc3MgdGhvc2UKKwkgKiB2YXJpYWJsZXMuIE9uIHg4Ni02NCwgZmV3ZXIgdmFyaWFibGVzIGZpdCBpbnRvIHRoZSBmaXJzdCAxMjgKKwkgKiBieXRlcywgYnV0IHRoaXMgaXMgc3RpbGwgdGhlIGJlc3Qgb3JkZXIgd2l0aG91dCBzYWNyaWZpY2luZworCSAqIHRoZSByZWFkYWJpbGl0eSBieSBzcGxpdHRpbmcgdGhlIHN0cnVjdHVyZXMuCisJICovCisJc3RydWN0IHJjX2RlYyByYzsKKwlzdHJ1Y3QgZGljdGlvbmFyeSBkaWN0OworCXN0cnVjdCBsem1hMl9kZWMgbHptYTI7CisJc3RydWN0IGx6bWFfZGVjIGx6bWE7CisKKwkvKgorCSAqIFRlbXBvcmFyeSBidWZmZXIgd2hpY2ggaG9sZHMgc21hbGwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGJldHdlZW4KKwkgKiBkZWNvZGVyIGNhbGxzLiBTZWUgbHptYTJfbHptYSgpIGZvciBkZXRhaWxzLgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQzMl90IHNpemU7CisJCXVpbnQ4X3QgYnVmWzMgKiBMWk1BX0lOX1JFUVVJUkVEXTsKKwl9IHRlbXA7Cit9OworCisvKioqKioqKioqKioqKioKKyAqIERpY3Rpb25hcnkgKgorICoqKioqKioqKioqKioqLworCisvKgorICogUmVzZXQgdGhlIGRpY3Rpb25hcnkgc3RhdGUuIFdoZW4gaW4gc2luZ2xlLWNhbGwgbW9kZSwgc2V0IHVwIHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBkaWN0aW9uYXJ5IHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgZGljdF9yZXNldChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlpZiAoREVDX0lTX1NJTkdMRShkaWN0LT5tb2RlKSkgeworCQlkaWN0LT5idWYgPSBiLT5vdXQgKyBiLT5vdXRfcG9zOworCQlkaWN0LT5lbmQgPSBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3M7CisJfQorCisJZGljdC0+c3RhcnQgPSAwOworCWRpY3QtPnBvcyA9IDA7CisJZGljdC0+bGltaXQgPSAwOworCWRpY3QtPmZ1bGwgPSAwOworfQorCisvKiBTZXQgZGljdGlvbmFyeSB3cml0ZSBsaW1pdCAqLworc3RhdGljIHZvaWQgZGljdF9saW1pdChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc2l6ZV90IG91dF9tYXgpCit7CisJaWYgKGRpY3QtPmVuZCAtIGRpY3QtPnBvcyA8PSBvdXRfbWF4KQorCQlkaWN0LT5saW1pdCA9IGRpY3QtPmVuZDsKKwllbHNlCisJCWRpY3QtPmxpbWl0ID0gZGljdC0+cG9zICsgb3V0X21heDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGJ5dGUgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgZGljdGlvbmFyeS4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkaWN0X2hhc19zcGFjZShjb25zdCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCkKK3sKKwlyZXR1cm4gZGljdC0+cG9zIDwgZGljdC0+bGltaXQ7Cit9CisKKy8qCisgKiBHZXQgYSBieXRlIGZyb20gdGhlIGRpY3Rpb25hcnkgYXQgdGhlIGdpdmVuIGRpc3RhbmNlLiBUaGUgZGlzdGFuY2UgaXMKKyAqIGFzc3VtZWQgdG8gdmFsaWQsIG9yIGFzIGEgc3BlY2lhbCBjYXNlLCB6ZXJvIHdoZW4gdGhlIGRpY3Rpb25hcnkgaXMKKyAqIHN0aWxsIGVtcHR5LiBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWVkZWQgZm9yIHNpbmdsZS1jYWxsIGRlY29kaW5nIHRvCisgKiBhdm9pZCB3cml0aW5nIGEgJ1wwJyB0byB0aGUgZW5kIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZGljdF9nZXQoY29uc3Qgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90IGRpc3QpCit7CisJc2l6ZV90IG9mZnNldCA9IGRpY3QtPnBvcyAtIGRpc3QgLSAxOworCisJaWYgKGRpc3QgPj0gZGljdC0+cG9zKQorCQlvZmZzZXQgKz0gZGljdC0+ZW5kOworCisJcmV0dXJuIGRpY3QtPmZ1bGwgPiAwID8gZGljdC0+YnVmW29mZnNldF0gOiAwOworfQorCisvKgorICogUHV0IG9uZSBieXRlIGludG8gdGhlIGRpY3Rpb25hcnkuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWN0X3B1dChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgdWludDhfdCBieXRlKQoreworCWRpY3QtPmJ1ZltkaWN0LT5wb3MrK10gPSBieXRlOworCisJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCWRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7Cit9CisKKy8qCisgKiBSZXBlYXQgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRpc3RhbmNlLiBJZiB0aGUgZGlzdGFuY2UgaXMKKyAqIGludmFsaWQsIGZhbHNlIGlzIHJldHVybmVkLiBPbiBzdWNjZXNzLCB0cnVlIGlzIHJldHVybmVkIGFuZCAqbGVuIGlzCisgKiB1cGRhdGVkIHRvIGluZGljYXRlIGhvdyBtYW55IGJ5dGVzIHdlcmUgbGVmdCB0byBiZSByZXBlYXRlZC4KKyAqLworc3RhdGljIGJvb2wgZGljdF9yZXBlYXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90ICpsZW4sIHVpbnQzMl90IGRpc3QpCit7CisJc2l6ZV90IGJhY2s7CisJdWludDMyX3QgbGVmdDsKKworCWlmIChkaXN0ID49IGRpY3QtPmZ1bGwgfHwgZGlzdCA+PSBkaWN0LT5zaXplKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsZWZ0ID0gbWluX3Qoc2l6ZV90LCBkaWN0LT5saW1pdCAtIGRpY3QtPnBvcywgKmxlbik7CisJKmxlbiAtPSBsZWZ0OworCisJYmFjayA9IGRpY3QtPnBvcyAtIGRpc3QgLSAxOworCWlmIChkaXN0ID49IGRpY3QtPnBvcykKKwkJYmFjayArPSBkaWN0LT5lbmQ7CisKKwlkbyB7CisJCWRpY3QtPmJ1ZltkaWN0LT5wb3MrK10gPSBkaWN0LT5idWZbYmFjaysrXTsKKwkJaWYgKGJhY2sgPT0gZGljdC0+ZW5kKQorCQkJYmFjayA9IDA7CisJfSB3aGlsZSAoLS1sZWZ0ID4gMCk7CisKKwlpZiAoZGljdC0+ZnVsbCA8IGRpY3QtPnBvcykKKwkJZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKKworCXJldHVybiB0cnVlOworfQorCisvKiBDb3B5IHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGZyb20gaW5wdXQgdG8gZGljdGlvbmFyeSBhbmQgb3V0cHV0IGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBkaWN0X3VuY29tcHJlc3NlZChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYiwKKwkJCSAgICAgIHVpbnQzMl90ICpsZWZ0KQoreworCXNpemVfdCBjb3B5X3NpemU7CisKKwl3aGlsZSAoKmxlZnQgPiAwICYmIGItPmluX3BvcyA8IGItPmluX3NpemUKKwkJCSYmIGItPm91dF9wb3MgPCBiLT5vdXRfc2l6ZSkgeworCQljb3B5X3NpemUgPSBtaW4oYi0+aW5fc2l6ZSAtIGItPmluX3BvcywKKwkJCQliLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCQlpZiAoY29weV9zaXplID4gZGljdC0+ZW5kIC0gZGljdC0+cG9zKQorCQkJY29weV9zaXplID0gZGljdC0+ZW5kIC0gZGljdC0+cG9zOworCQlpZiAoY29weV9zaXplID4gKmxlZnQpCisJCQljb3B5X3NpemUgPSAqbGVmdDsKKworCQkqbGVmdCAtPSBjb3B5X3NpemU7CisKKwkJbWVtY3B5KGRpY3QtPmJ1ZiArIGRpY3QtPnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisJCWRpY3QtPnBvcyArPSBjb3B5X3NpemU7CisKKwkJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworCisJCWlmIChERUNfSVNfTVVMVEkoZGljdC0+bW9kZSkpIHsKKwkJCWlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorCQkJCWRpY3QtPnBvcyA9IDA7CisKKwkJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBiLT5pbiArIGItPmluX3BvcywKKwkJCQkJY29weV9zaXplKTsKKwkJfQorCisJCWRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCisJCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCQliLT5pbl9wb3MgKz0gY29weV9zaXplOworCX0KK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8gYi0+b3V0LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBzcGFjZSBpbiBiLT5vdXQuIFRoaXMgaXMgZ3VhcmFudGVlZCBiZWNhdXNlIGNhbGxlciB1c2VzIGRpY3RfbGltaXQoKQorICogYmVmb3JlIGRlY29kaW5nIGRhdGEgaW50byB0aGUgZGljdGlvbmFyeS4KKyAqLworc3RhdGljIHVpbnQzMl90IGRpY3RfZmx1c2goc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGNvcHlfc2l6ZSA9IGRpY3QtPnBvcyAtIGRpY3QtPnN0YXJ0OworCisJaWYgKERFQ19JU19NVUxUSShkaWN0LT5tb2RlKSkgeworCQlpZiAoZGljdC0+cG9zID09IGRpY3QtPmVuZCkKKwkJCWRpY3QtPnBvcyA9IDA7CisKKwkJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIGRpY3QtPmJ1ZiArIGRpY3QtPnN0YXJ0LAorCQkJCWNvcHlfc2l6ZSk7CisJfQorCisJZGljdC0+c3RhcnQgPSBkaWN0LT5wb3M7CisJYi0+b3V0X3BvcyArPSBjb3B5X3NpemU7CisJcmV0dXJuIGNvcHlfc2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqCisgKiBSYW5nZSBkZWNvZGVyICoKKyAqKioqKioqKioqKioqKioqKi8KKworLyogUmVzZXQgdGhlIHJhbmdlIGRlY29kZXIuICovCitzdGF0aWMgdm9pZCByY19yZXNldChzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyYy0+cmFuZ2UgPSAodWludDMyX3QpLTE7CisJcmMtPmNvZGUgPSAwOworCXJjLT5pbml0X2J5dGVzX2xlZnQgPSBSQ19JTklUX0JZVEVTOworfQorCisvKgorICogUmVhZCB0aGUgZmlyc3QgZml2ZSBpbml0aWFsIGJ5dGVzIGludG8gcmMtPmNvZGUgaWYgdGhleSBoYXZlbid0IGJlZW4KKyAqIHJlYWQgYWxyZWFkeS4gKFllcywgdGhlIGZpcnN0IGJ5dGUgZ2V0cyBjb21wbGV0ZWx5IGlnbm9yZWQuKQorICovCitzdGF0aWMgYm9vbCByY19yZWFkX2luaXQoc3RydWN0IHJjX2RlYyAqcmMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJd2hpbGUgKHJjLT5pbml0X2J5dGVzX2xlZnQgPiAwKSB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSArIGItPmluW2ItPmluX3BvcysrXTsKKwkJLS1yYy0+aW5pdF9ieXRlc19sZWZ0OworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgbm90IGJlIGVub3VnaCBpbnB1dCBmb3IgdGhlIG5leHQgZGVjb2RpbmcgbG9vcC4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByY19saW1pdF9leGNlZWRlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyZXR1cm4gcmMtPmluX3BvcyA+IHJjLT5pbl9saW1pdDsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIChmcm9tIHBvaW50IG9mIHZpZXcgb2YgcmFuZ2UgZGVjb2RlcikgdGhhdAorICogd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIExaTUEgY2h1bmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByY19pc19maW5pc2hlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyZXR1cm4gcmMtPmNvZGUgPT0gMDsKK30KKworLyogUmVhZCB0aGUgbmV4dCBpbnB1dCBieXRlIGlmIG5lZWRlZC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCByY19ub3JtYWxpemUoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8IFJDX1RPUF9WQUxVRSkgeworCQlyYy0+cmFuZ2UgPDw9IFJDX1NISUZUX0JJVFM7CisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IFJDX1NISUZUX0JJVFMpICsgcmMtPmluW3JjLT5pbl9wb3MrK107CisJfQorfQorCisvKgorICogRGVjb2RlIG9uZSBiaXQuIEluIHNvbWUgdmVyc2lvbnMsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc3BsaXR0ZWQgaW4gdGhyZWUKKyAqIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBjb21waWxlciBpcyBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIG1vcmUgZWFzaWx5IGF2b2lkCisgKiBhbiBleHRyYSBicmFuY2guIEluIHRoaXMgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMWk1BIGRlY29kZXIsIHRoaXMKKyAqIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2QgaWRlYSAodGVzdGVkIHdpdGggR0NDIDMuMy42LCAzLjQuNiwgYW5kIDQuMy4zCisgKiBvbiB4ODYpLiBVc2luZyBhIG5vbi1zcGxpdHRlZCB2ZXJzaW9uIHJlc3VsdHMgaW4gbmljZXIgbG9va2luZyBjb2RlIHRvby4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgcmV0dXJuIGFuIGludC4gRG8gbm90IG1ha2UgaXQgcmV0dXJuIGEgYm9vbCBvciB0aGUgc3BlZWQKKyAqIG9mIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBHQ0MgMy54IGRlY3JlYXNlcyAxMC0xNSAlLiAoR0NDIDQuMyBkb2Vzbid0IGNhcmUsCisgKiBhbmQgaXQgZ2VuZXJhdGVzIDEwLTIwICUgZmFzdGVyIGNvZGUgdGhhbiBHQ0MgMy54IGZyb20gdGhpcyBmaWxlIGFueXdheS4pCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJjX2JpdChzdHJ1Y3QgcmNfZGVjICpyYywgdWludDE2X3QgKnByb2IpCit7CisJdWludDMyX3QgYm91bmQ7CisJaW50IGJpdDsKKworCXJjX25vcm1hbGl6ZShyYyk7CisJYm91bmQgPSAocmMtPnJhbmdlID4+IFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTKSAqICpwcm9iOworCWlmIChyYy0+Y29kZSA8IGJvdW5kKSB7CisJCXJjLT5yYW5nZSA9IGJvdW5kOworCQkqcHJvYiArPSAoUkNfQklUX01PREVMX1RPVEFMIC0gKnByb2IpID4+IFJDX01PVkVfQklUUzsKKwkJYml0ID0gMDsKKwl9IGVsc2UgeworCQlyYy0+cmFuZ2UgLT0gYm91bmQ7CisJCXJjLT5jb2RlIC09IGJvdW5kOworCQkqcHJvYiAtPSAqcHJvYiA+PiBSQ19NT1ZFX0JJVFM7CisJCWJpdCA9IDE7CisJfQorCisJcmV0dXJuIGJpdDsKK30KKworLyogRGVjb2RlIGEgYml0dHJlZSBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdWludDMyX3QgcmNfYml0dHJlZShzdHJ1Y3QgcmNfZGVjICpyYywKKwkJCQkJICAgdWludDE2X3QgKnByb2JzLCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBzeW1ib2wgPSAxOworCisJZG8geworCQlpZiAocmNfYml0KHJjLCAmcHJvYnNbc3ltYm9sXSkpCisJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJZWxzZQorCQkJc3ltYm9sIDw8PSAxOworCX0gd2hpbGUgKHN5bWJvbCA8IGxpbWl0KTsKKworCXJldHVybiBzeW1ib2w7Cit9CisKKy8qIERlY29kZSBhIGJpdHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJjX2JpdHRyZWVfcmV2ZXJzZShzdHJ1Y3QgcmNfZGVjICpyYywKKwkJCQkJICAgICAgIHVpbnQxNl90ICpwcm9icywKKwkJCQkJICAgICAgIHVpbnQzMl90ICpkZXN0LCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBzeW1ib2wgPSAxOworCXVpbnQzMl90IGkgPSAwOworCisJZG8geworCQlpZiAocmNfYml0KHJjLCAmcHJvYnNbc3ltYm9sXSkpIHsKKwkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworCQkJKmRlc3QgKz0gMSA8PCBpOworCQl9IGVsc2UgeworCQkJc3ltYm9sIDw8PSAxOworCQl9CisJfSB3aGlsZSAoKytpIDwgbGltaXQpOworfQorCisvKiBEZWNvZGUgZGlyZWN0IGJpdHMgKGZpeGVkIGZpZnR5LWZpZnR5IHByb2JhYmlsaXR5KSAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX2RpcmVjdChzdHJ1Y3QgcmNfZGVjICpyYywgdWludDMyX3QgKmRlc3QsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IG1hc2s7CisKKwlkbyB7CisJCXJjX25vcm1hbGl6ZShyYyk7CisJCXJjLT5yYW5nZSA+Pj0gMTsKKwkJcmMtPmNvZGUgLT0gcmMtPnJhbmdlOworCQltYXNrID0gKHVpbnQzMl90KTAgLSAocmMtPmNvZGUgPj4gMzEpOworCQlyYy0+Y29kZSArPSByYy0+cmFuZ2UgJiBtYXNrOworCQkqZGVzdCA9ICgqZGVzdCA8PCAxKSArIChtYXNrICsgMSk7CisJfSB3aGlsZSAoLS1saW1pdCA+IDApOworfQorCisvKioqKioqKioKKyAqIExaTUEgKgorICoqKioqKioqLworCisvKiBHZXQgcG9pbnRlciB0byBsaXRlcmFsIGNvZGVyIHByb2JhYmlsaXR5IGFycmF5LiAqLworc3RhdGljIHVpbnQxNl90ICpsem1hX2xpdGVyYWxfcHJvYnMoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MzJfdCBwcmV2X2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgMCk7CisJdWludDMyX3QgbG93ID0gcHJldl9ieXRlID4+ICg4IC0gcy0+bHptYS5sYyk7CisJdWludDMyX3QgaGlnaCA9IChzLT5kaWN0LnBvcyAmIHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzaykgPDwgcy0+bHptYS5sYzsKKwlyZXR1cm4gcy0+bHptYS5saXRlcmFsW2xvdyArIGhpZ2hdOworfQorCisvKiBEZWNvZGUgYSBsaXRlcmFsIChvbmUgOC1iaXQgYnl0ZSkgKi8KK3N0YXRpYyB2b2lkIGx6bWFfbGl0ZXJhbChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBzeW1ib2w7CisJdWludDMyX3QgbWF0Y2hfYnl0ZTsKKwl1aW50MzJfdCBtYXRjaF9iaXQ7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGk7CisKKwlwcm9icyA9IGx6bWFfbGl0ZXJhbF9wcm9icyhzKTsKKworCWlmIChsem1hX3N0YXRlX2lzX2xpdGVyYWwocy0+bHptYS5zdGF0ZSkpIHsKKwkJc3ltYm9sID0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCAweDEwMCk7CisJfSBlbHNlIHsKKwkJc3ltYm9sID0gMTsKKwkJbWF0Y2hfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCBzLT5sem1hLnJlcDApIDw8IDE7CisJCW9mZnNldCA9IDB4MTAwOworCisJCWRvIHsKKwkJCW1hdGNoX2JpdCA9IG1hdGNoX2J5dGUgJiBvZmZzZXQ7CisJCQltYXRjaF9ieXRlIDw8PSAxOworCQkJaSA9IG9mZnNldCArIG1hdGNoX2JpdCArIHN5bWJvbDsKKworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZwcm9ic1tpXSkpIHsKKwkJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJCQlvZmZzZXQgJj0gbWF0Y2hfYml0OworCQkJfSBlbHNlIHsKKwkJCQlzeW1ib2wgPDw9IDE7CisJCQkJb2Zmc2V0ICY9IH5tYXRjaF9iaXQ7CisJCQl9CisJCX0gd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsKKwl9CisKKwlkaWN0X3B1dCgmcy0+ZGljdCwgKHVpbnQ4X3Qpc3ltYm9sKTsKKwlsem1hX3N0YXRlX2xpdGVyYWwoJnMtPmx6bWEuc3RhdGUpOworfQorCisvKiBEZWNvZGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaW50byBzLT5sem1hLmxlbi4gKi8KK3N0YXRpYyB2b2lkIGx6bWFfbGVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCBsem1hX2xlbl9kZWMgKmwsCisJCSAgICAgdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBsaW1pdDsKKworCWlmICghcmNfYml0KCZzLT5yYywgJmwtPmNob2ljZSkpIHsKKwkJcHJvYnMgPSBsLT5sb3dbcG9zX3N0YXRlXTsKKwkJbGltaXQgPSBMRU5fTE9XX1NZTUJPTFM7CisJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTjsKKwl9IGVsc2UgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UyKSkgeworCQkJcHJvYnMgPSBsLT5taWRbcG9zX3N0YXRlXTsKKwkJCWxpbWl0ID0gTEVOX01JRF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTOworCQl9IGVsc2UgeworCQkJcHJvYnMgPSBsLT5oaWdoOworCQkJbGltaXQgPSBMRU5fSElHSF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTCisJCQkJCSsgTEVOX01JRF9TWU1CT0xTOworCQl9CisJfQorCisJcy0+bHptYS5sZW4gKz0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCBsaW1pdCkgLSBsaW1pdDsKK30KKworLyogRGVjb2RlIGEgbWF0Y2guIFRoZSBkaXN0YW5jZSB3aWxsIGJlIHN0b3JlZCBpbiBzLT5sem1hLnJlcDAuICovCitzdGF0aWMgdm9pZCBsem1hX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgZGlzdF9zbG90OworCXVpbnQzMl90IGxpbWl0OworCisJbHptYV9zdGF0ZV9tYXRjaCgmcy0+bHptYS5zdGF0ZSk7CisKKwlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKworCWx6bWFfbGVuKHMsICZzLT5sem1hLm1hdGNoX2xlbl9kZWMsIHBvc19zdGF0ZSk7CisKKwlwcm9icyA9IHMtPmx6bWEuZGlzdF9zbG90W2x6bWFfZ2V0X2Rpc3Rfc3RhdGUocy0+bHptYS5sZW4pXTsKKwlkaXN0X3Nsb3QgPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIERJU1RfU0xPVFMpIC0gRElTVF9TTE9UUzsKKworCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX1NUQVJUKSB7CisJCXMtPmx6bWEucmVwMCA9IGRpc3Rfc2xvdDsKKwl9IGVsc2UgeworCQlsaW1pdCA9IChkaXN0X3Nsb3QgPj4gMSkgLSAxOworCQlzLT5sem1hLnJlcDAgPSAyICsgKGRpc3Rfc2xvdCAmIDEpOworCisJCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX0VORCkgeworCQkJcy0+bHptYS5yZXAwIDw8PSBsaW1pdDsKKwkJCXByb2JzID0gcy0+bHptYS5kaXN0X3NwZWNpYWwgKyBzLT5sem1hLnJlcDAKKwkJCQkJLSBkaXN0X3Nsb3QgLSAxOworCQkJcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcHJvYnMsCisJCQkJCSZzLT5sem1hLnJlcDAsIGxpbWl0KTsKKwkJfSBlbHNlIHsKKwkJCXJjX2RpcmVjdCgmcy0+cmMsICZzLT5sem1hLnJlcDAsIGxpbWl0IC0gQUxJR05fQklUUyk7CisJCQlzLT5sem1hLnJlcDAgPDw9IEFMSUdOX0JJVFM7CisJCQlyY19iaXR0cmVlX3JldmVyc2UoJnMtPnJjLCBzLT5sem1hLmRpc3RfYWxpZ24sCisJCQkJCSZzLT5sem1hLnJlcDAsIEFMSUdOX0JJVFMpOworCQl9CisJfQorfQorCisvKgorICogRGVjb2RlIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgdGhlIGZvdXIgbW9zdCByZWNlbnRseQorICogc2VlbiBtYXRjaGVzLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLgorICovCitzdGF0aWMgdm9pZCBsem1hX3JlcF9tYXRjaChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50MzJfdCBwb3Nfc3RhdGUpCit7CisJdWludDMyX3QgdG1wOworCisJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAwW3MtPmx6bWEuc3RhdGVdKSkgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDBfbG9uZ1sKKwkJCQlzLT5sem1hLnN0YXRlXVtwb3Nfc3RhdGVdKSkgeworCQkJbHptYV9zdGF0ZV9zaG9ydF9yZXAoJnMtPmx6bWEuc3RhdGUpOworCQkJcy0+bHptYS5sZW4gPSAxOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAxW3MtPmx6bWEuc3RhdGVdKSkgeworCQkJdG1wID0gcy0+bHptYS5yZXAxOworCQl9IGVsc2UgeworCQkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAyW3MtPmx6bWEuc3RhdGVdKSkgeworCQkJCXRtcCA9IHMtPmx6bWEucmVwMjsKKwkJCX0gZWxzZSB7CisJCQkJdG1wID0gcy0+bHptYS5yZXAzOworCQkJCXMtPmx6bWEucmVwMyA9IHMtPmx6bWEucmVwMjsKKwkJCX0KKworCQkJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCQl9CisKKwkJcy0+bHptYS5yZXAxID0gcy0+bHptYS5yZXAwOworCQlzLT5sem1hLnJlcDAgPSB0bXA7CisJfQorCisJbHptYV9zdGF0ZV9sb25nX3JlcCgmcy0+bHptYS5zdGF0ZSk7CisJbHptYV9sZW4ocywgJnMtPmx6bWEucmVwX2xlbl9kZWMsIHBvc19zdGF0ZSk7Cit9CisKKy8qIExaTUEgZGVjb2RlciBjb3JlICovCitzdGF0aWMgYm9vbCBsem1hX21haW4oc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MzJfdCBwb3Nfc3RhdGU7CisKKwkvKgorCSAqIElmIHRoZSBkaWN0aW9uYXJ5IHdhcyByZWFjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgY2FsbCwgdHJ5IHRvCisJICogZmluaXNoIHRoZSBwb3NzaWJseSBwZW5kaW5nIHJlcGVhdCBpbiB0aGUgZGljdGlvbmFyeS4KKwkgKi8KKwlpZiAoZGljdF9oYXNfc3BhY2UoJnMtPmRpY3QpICYmIHMtPmx6bWEubGVuID4gMCkKKwkJZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKTsKKworCS8qCisJICogRGVjb2RlIG1vcmUgTFpNQSBzeW1ib2xzLiBPbmUgaXRlcmF0aW9uIG1heSBjb25zdW1lIHVwIHRvCisJICogTFpNQV9JTl9SRVFVSVJFRCAtIDEgYnl0ZXMuCisJICovCisJd2hpbGUgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiAhcmNfbGltaXRfZXhjZWVkZWQoJnMtPnJjKSkgeworCQlwb3Nfc3RhdGUgPSBzLT5kaWN0LnBvcyAmIHMtPmx6bWEucG9zX21hc2s7CisKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19tYXRjaFsKKwkJCQlzLT5sem1hLnN0YXRlXVtwb3Nfc3RhdGVdKSkgeworCQkJbHptYV9saXRlcmFsKHMpOworCQl9IGVsc2UgeworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcFtzLT5sem1hLnN0YXRlXSkpCisJCQkJbHptYV9yZXBfbWF0Y2gocywgcG9zX3N0YXRlKTsKKwkJCWVsc2UKKwkJCQlsem1hX21hdGNoKHMsIHBvc19zdGF0ZSk7CisKKwkJCWlmICghZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhdmluZyB0aGUgcmFuZ2UgZGVjb2RlciBhbHdheXMgbm9ybWFsaXplZCB3aGVuIHdlIGFyZSBvdXRzaWRlCisJICogdGhpcyBmdW5jdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBlbmQgb2YgdGhlIGNodW5rLgorCSAqLworCXJjX25vcm1hbGl6ZSgmcy0+cmMpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgTFpNQSBkZWNvZGVyIGFuZCByYW5nZSBkZWNvZGVyIHN0YXRlLiBEaWN0aW9uYXJ5IGlzIG5vcmUgcmVzZXQKKyAqIGhlcmUsIGJlY2F1c2UgTFpNQSBzdGF0ZSBtYXkgYmUgcmVzZXQgd2l0aG91dCByZXNldHRpbmcgdGhlIGRpY3Rpb25hcnkuCisgKi8KK3N0YXRpYyB2b2lkIGx6bWFfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJc2l6ZV90IGk7CisKKwlzLT5sem1hLnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKwlzLT5sem1hLnJlcDAgPSAwOworCXMtPmx6bWEucmVwMSA9IDA7CisJcy0+bHptYS5yZXAyID0gMDsKKwlzLT5sem1hLnJlcDMgPSAwOworCisJLyoKKwkgKiBBbGwgcHJvYmFiaWxpdGllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWUuIFRoaXMgaGFjaworCSAqIG1ha2VzIHRoZSBjb2RlIHNtYWxsZXIgYnkgYXZvaWRpbmcgYSBzZXBhcmF0ZSBsb29wIGZvciBlYWNoCisJICogcHJvYmFiaWxpdHkgYXJyYXkuCisJICoKKwkgKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBzbyB0aGF0IG9ubHkgdGhhdCBwYXJ0IG9mIGxpdGVyYWwKKwkgKiBwcm9iYWJpbGl0aWVzIHRoYXQgYXJlIGFjdHVhbGx5IHJlcXVpcmVkLiBJbiB0aGUgY29tbW9uIGNhc2UKKwkgKiB3ZSB3b3VsZCB3cml0ZSAxMiBLaUIgbGVzcy4KKwkgKi8KKwlwcm9icyA9IHMtPmx6bWEuaXNfbWF0Y2hbMF07CisJZm9yIChpID0gMDsgaSA8IFBST0JTX1RPVEFMOyArK2kpCisJCXByb2JzW2ldID0gUkNfQklUX01PREVMX1RPVEFMIC8gMjsKKworCXJjX3Jlc2V0KCZzLT5yYyk7Cit9CisKKy8qCisgKiBEZWNvZGUgYW5kIHZhbGlkYXRlIExaTUEgcHJvcGVydGllcyAobGMvbHAvcGIpIGFuZCBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcworICogZnJvbSB0aGUgZGVjb2RlZCBscCBhbmQgcGIgdmFsdWVzLiBPbiBzdWNjZXNzLCB0aGUgTFpNQSBkZWNvZGVyIHN0YXRlIGlzCisgKiByZXNldCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGJvb2wgbHptYV9wcm9wcyhzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50OF90IHByb3BzKQoreworCWlmIChwcm9wcyA+ICg0ICogNSArIDQpICogOSArIDgpCisJCXJldHVybiBmYWxzZTsKKworCXMtPmx6bWEucG9zX21hc2sgPSAwOworCXdoaWxlIChwcm9wcyA+PSA5ICogNSkgeworCQlwcm9wcyAtPSA5ICogNTsKKwkJKytzLT5sem1hLnBvc19tYXNrOworCX0KKworCXMtPmx6bWEucG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLnBvc19tYXNrKSAtIDE7CisKKwlzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPSAwOworCXdoaWxlIChwcm9wcyA+PSA5KSB7CisJCXByb3BzIC09IDk7CisJCSsrcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrOworCX0KKworCXMtPmx6bWEubGMgPSBwcm9wczsKKworCWlmIChzLT5sem1hLmxjICsgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID4gNCkKKwkJcmV0dXJuIGZhbHNlOworCisJcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID0gKDEgPDwgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrKSAtIDE7CisKKwlsem1hX3Jlc2V0KHMpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioKKyAqIExaTUEyICoKKyAqKioqKioqKiovCisKKy8qCisgKiBUaGUgTFpNQSBkZWNvZGVyIGFzc3VtZXMgdGhhdCBpZiB0aGUgaW5wdXQgbGltaXQgKHMtPnJjLmluX2xpbWl0KSBoYXNuJ3QKKyAqIGJlZW4gZXhjZWVkZWQsIGl0IGlzIHNhZmUgdG8gcmVhZCB1cCB0byBMWk1BX0lOX1JFUVVJUkVEIGJ5dGVzLiBUaGlzCisgKiB3cmFwcGVyIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgbWFraW5nIHRoZSBMWk1BIGRlY29kZXIncyBhc3N1bXB0aW9uIHNhZmUuCisgKgorICogQXMgbG9uZyBhcyB0aGVyZSBpcyBwbGVudHkgb2YgaW5wdXQgbGVmdCB0byBiZSBkZWNvZGVkIGluIHRoZSBjdXJyZW50IExaTUEKKyAqIGNodW5rLCB3ZSBkZWNvZGUgZGlyZWN0bHkgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGlucHV0IGJ1ZmZlciB1bnRpbAorICogdGhlcmUncyBMWk1BX0lOX1JFUVVJUkVEIGJ5dGVzIGxlZnQuIFRob3NlIHJlbWFpbmluZyBieXRlcyBhcmUgY29waWVkIGludG8KKyAqIHMtPnRlbXAuYnVmLCB3aGljaCAoaG9wZWZ1bGx5KSBnZXRzIGZpbGxlZCBvbiB0aGUgbmV4dCBjYWxsIHRvIHRoaXMKKyAqIGZ1bmN0aW9uLiBXZSBkZWNvZGUgYSBmZXcgYnl0ZXMgZnJvbSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBzbyB0aGF0IHdlIGNhbgorICogY29udGludWUgZGVjb2RpbmcgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGlucHV0IGJ1ZmZlciBhZ2Fpbi4KKyAqLworc3RhdGljIGJvb2wgbHptYTJfbHptYShzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl9hdmFpbDsKKwl1aW50MzJfdCB0bXA7CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKHMtPnRlbXAuc2l6ZSA+IDAgfHwgcy0+bHptYTIuY29tcHJlc3NlZCA9PSAwKSB7CisJCXRtcCA9IDIgKiBMWk1BX0lOX1JFUVVJUkVEIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gcy0+bHptYTIuY29tcHJlc3NlZCAtIHMtPnRlbXAuc2l6ZSkKKwkJCXRtcCA9IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemU7CisJCWlmICh0bXAgPiBpbl9hdmFpbCkKKwkJCXRtcCA9IGluX2F2YWlsOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSwgYi0+aW4gKyBiLT5pbl9wb3MsIHRtcCk7CisKKwkJaWYgKHMtPnRlbXAuc2l6ZSArIHRtcCA9PSBzLT5sem1hMi5jb21wcmVzc2VkKSB7CisJCQltZW16ZXJvKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplICsgdG1wLAorCQkJCQlzaXplb2Yocy0+dGVtcC5idWYpCisJCQkJCQktIHMtPnRlbXAuc2l6ZSAtIHRtcCk7CisJCQlzLT5yYy5pbl9saW1pdCA9IHMtPnRlbXAuc2l6ZSArIHRtcDsKKwkJfSBlbHNlIGlmIChzLT50ZW1wLnNpemUgKyB0bXAgPCBMWk1BX0lOX1JFUVVJUkVEKSB7CisJCQlzLT50ZW1wLnNpemUgKz0gdG1wOworCQkJYi0+aW5fcG9zICs9IHRtcDsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXAgLSBMWk1BX0lOX1JFUVVJUkVEOworCQl9CisKKwkJcy0+cmMuaW4gPSBzLT50ZW1wLmJ1ZjsKKwkJcy0+cmMuaW5fcG9zID0gMDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSB8fCBzLT5yYy5pbl9wb3MgPiBzLT50ZW1wLnNpemUgKyB0bXApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcy0+bHptYTIuY29tcHJlc3NlZCAtPSBzLT5yYy5pbl9wb3M7CisKKwkJaWYgKHMtPnJjLmluX3BvcyA8IHMtPnRlbXAuc2l6ZSkgeworCQkJcy0+dGVtcC5zaXplIC09IHMtPnJjLmluX3BvczsKKwkJCW1lbW1vdmUocy0+dGVtcC5idWYsIHMtPnRlbXAuYnVmICsgcy0+cmMuaW5fcG9zLAorCQkJCQlzLT50ZW1wLnNpemUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQliLT5pbl9wb3MgKz0gcy0+cmMuaW5fcG9zIC0gcy0+dGVtcC5zaXplOworCQlzLT50ZW1wLnNpemUgPSAwOworCX0KKworCWluX2F2YWlsID0gYi0+aW5fc2l6ZSAtIGItPmluX3BvczsKKwlpZiAoaW5fYXZhaWwgPj0gTFpNQV9JTl9SRVFVSVJFRCkgeworCQlzLT5yYy5pbiA9IGItPmluOworCQlzLT5yYy5pbl9wb3MgPSBiLT5pbl9wb3M7CisKKwkJaWYgKGluX2F2YWlsID49IHMtPmx6bWEyLmNvbXByZXNzZWQgKyBMWk1BX0lOX1JFUVVJUkVEKQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9wb3MgKyBzLT5sem1hMi5jb21wcmVzc2VkOworCQllbHNlCisJCQlzLT5yYy5pbl9saW1pdCA9IGItPmluX3NpemUgLSBMWk1BX0lOX1JFUVVJUkVEOworCisJCWlmICghbHptYV9tYWluKHMpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWluX2F2YWlsID0gcy0+cmMuaW5fcG9zIC0gYi0+aW5fcG9zOworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gaW5fYXZhaWw7CisJCWItPmluX3BvcyA9IHMtPnJjLmluX3BvczsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJaW5fYXZhaWwgPSBzLT5sem1hMi5jb21wcmVzc2VkOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+aW4gKyBiLT5pbl9wb3MsIGluX2F2YWlsKTsKKwkJcy0+dGVtcC5zaXplID0gaW5fYXZhaWw7CisJCWItPmluX3BvcyArPSBpbl9hdmFpbDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFRha2UgY2FyZSBvZiB0aGUgTFpNQTIgY29udHJvbCBsYXllciwgYW5kIGZvcndhcmQgdGhlIGpvYiBvZiBhY3R1YWwgTFpNQQorICogZGVjb2Rpbmcgb3IgY29weWluZyBvZiB1bmNvbXByZXNzZWQgY2h1bmtzIHRvIG90aGVyIGZ1bmN0aW9ucy4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19sem1hMl9ydW4oc3RydWN0IHh6X2RlY19sem1hMiAqcywKKwkJCQkgICAgICAgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl1aW50MzJfdCB0bXA7CisKKwl3aGlsZSAoYi0+aW5fcG9zIDwgYi0+aW5fc2l6ZSB8fCBzLT5sem1hMi5zZXF1ZW5jZSA9PSBTRVFfTFpNQV9SVU4pIHsKKwkJc3dpdGNoIChzLT5sem1hMi5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9DT05UUk9MOgorCQkJLyoKKwkJCSAqIExaTUEyIGNvbnRyb2wgYnl0ZQorCQkJICoKKwkJCSAqIEV4YWN0IHZhbHVlczoKKwkJCSAqICAgMHgwMCAgIEVuZCBtYXJrZXIKKwkJCSAqICAgMHgwMSAgIERpY3Rpb25hcnkgcmVzZXQgZm9sbG93ZWQgYnkKKwkJCSAqICAgICAgICAgIGFuIHVuY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweDAyICAgVW5jb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICoKKwkJCSAqIEhpZ2hlc3QgdGhyZWUgYml0cyAocy0+Y29udHJvbCAmIDB4RTApOgorCQkJICogICAweEUwICAgRGljdGlvbmFyeSByZXNldCwgbmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlCisJCQkgKiAgICAgICAgICByZXNldCwgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rCisJCQkgKiAgIDB4QzAgICBOZXcgcHJvcGVydGllcyBhbmQgc3RhdGUgcmVzZXQsIGZvbGxvd2VkCisJCQkgKiAgICAgICAgICBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vIGRpY3Rpb25hcnkKKwkJCSAqICAgICAgICAgIHJlc2V0KQorCQkJICogICAweEEwICAgU3RhdGUgcmVzZXQgdXNpbmcgb2xkIHByb3BlcnRpZXMsCisJCQkgKiAgICAgICAgICBmb2xsb3dlZCBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vCisJCQkgKiAgICAgICAgICBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICogICAweDgwICAgTFpNQSBjaHVuayAobm8gZGljdGlvbmFyeSBvciBzdGF0ZSByZXNldCkKKwkJCSAqCisJCQkgKiBGb3IgTFpNQSBjb21wcmVzc2VkIGNodW5rcywgdGhlIGxvd2VzdCBmaXZlIGJpdHMKKwkJCSAqIChzLT5jb250cm9sICYgMUYpIGFyZSB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZQorCQkJICogdW5jb21wcmVzc2VkIHNpemUgKGJpdHMgMTYtMjApLgorCQkJICoKKwkJCSAqIEEgbmV3IExaTUEyIHN0cmVhbSBtdXN0IGJlZ2luIHdpdGggYSBkaWN0aW9uYXJ5CisJCQkgKiByZXNldC4gVGhlIGZpcnN0IExaTUEgY2h1bmsgbXVzdCBzZXQgbmV3CisJCQkgKiBwcm9wZXJ0aWVzIGFuZCByZXNldCB0aGUgTFpNQSBzdGF0ZS4KKwkJCSAqCisJCQkgKiBWYWx1ZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBkZXNjcmliZWQgYWJvdmUKKwkJCSAqIGFyZSBpbnZhbGlkIGFuZCB3ZSByZXR1cm4gWFpfREFUQV9FUlJPUi4KKwkJCSAqLworCQkJdG1wID0gYi0+aW5bYi0+aW5fcG9zKytdOworCisJCQlpZiAodG1wID49IDB4RTAgfHwgdG1wID09IDB4MDEpIHsKKwkJCQlzLT5sem1hMi5uZWVkX3Byb3BzID0gdHJ1ZTsKKwkJCQlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSBmYWxzZTsKKwkJCQlkaWN0X3Jlc2V0KCZzLT5kaWN0LCBiKTsKKwkJCX0gZWxzZSBpZiAocy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0KSB7CisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCWlmICh0bXAgPj0gMHg4MCkgeworCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCA9ICh0bXAgJiAweDFGKSA8PCAxNjsKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMTsKKworCQkJCWlmICh0bXAgPj0gMHhDMCkgeworCQkJCQkvKgorCQkJCQkgKiBXaGVuIHRoZXJlIGFyZSBuZXcgcHJvcGVydGllcywKKwkJCQkJICogc3RhdGUgcmVzZXQgaXMgZG9uZSBhdAorCQkJCQkgKiBTRVFfUFJPUEVSVElFUy4KKwkJCQkJICovCisJCQkJCXMtPmx6bWEyLm5lZWRfcHJvcHMgPSBmYWxzZTsKKwkJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZQorCQkJCQkJCT0gU0VRX1BST1BFUlRJRVM7CisKKwkJCQl9IGVsc2UgaWYgKHMtPmx6bWEyLm5lZWRfcHJvcHMpIHsKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQl9IGVsc2UgeworCQkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlCisJCQkJCQkJPSBTRVFfTFpNQV9QUkVQQVJFOworCQkJCQlpZiAodG1wID49IDB4QTApCisJCQkJCQlsem1hX3Jlc2V0KHMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRtcCA9PSAweDAwKQorCQkJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKworCQkJCWlmICh0bXAgPiAweDAyKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMDsKKwkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlID0gU0VRX0NPUFk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1VOQ09NUFJFU1NFRF8xOgorCQkJcy0+bHptYTIudW5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX1VOQ09NUFJFU1NFRF8yOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfVU5DT01QUkVTU0VEXzI6CisJCQlzLT5sem1hMi51bmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT01QUkVTU0VEXzA6CisJCQlzLT5sem1hMi5jb21wcmVzc2VkCisJCQkJCT0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSA8PCA4OworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8xOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09NUFJFU1NFRF8xOgorCQkJcy0+bHptYTIuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdICsgMTsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gcy0+bHptYTIubmV4dF9zZXF1ZW5jZTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1BST1BFUlRJRVM6CisJCQlpZiAoIWx6bWFfcHJvcHMocywgYi0+aW5bYi0+aW5fcG9zKytdKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfTFpNQV9QUkVQQVJFOworCisJCWNhc2UgU0VRX0xaTUFfUFJFUEFSRToKKwkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkIDwgUkNfSU5JVF9CWVRFUykKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJaWYgKCFyY19yZWFkX2luaXQoJnMtPnJjLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gUkNfSU5JVF9CWVRFUzsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUlVOOworCisJCWNhc2UgU0VRX0xaTUFfUlVOOgorCQkJLyoKKwkJCSAqIFNldCBkaWN0aW9uYXJ5IGxpbWl0IHRvIGluZGljYXRlIGhvdyBtdWNoIHdlIHdhbnQKKwkJCSAqIHRvIGJlIGVuY29kZWQgYXQgbWF4aW11bS4gRGVjb2RlIG5ldyBkYXRhIGludG8gdGhlCisJCQkgKiBkaWN0aW9uYXJ5LiBGbHVzaCB0aGUgbmV3IGRhdGEgZnJvbSBkaWN0aW9uYXJ5IHRvCisJCQkgKiBiLT5vdXQuIENoZWNrIGlmIHdlIGZpbmlzaGVkIGRlY29kaW5nIHRoaXMgY2h1bmsuCisJCQkgKiBJbiBjYXNlIHRoZSBkaWN0aW9uYXJ5IGdvdCBmdWxsIGJ1dCB3ZSBkaWRuJ3QgZmlsbAorCQkJICogdGhlIG91dHB1dCBidWZmZXIgeWV0LCB3ZSBtYXkgcnVuIHRoaXMgbG9vcAorCQkJICogbXVsdGlwbGUgdGltZXMgd2l0aG91dCBjaGFuZ2luZyBzLT5sem1hMi5zZXF1ZW5jZS4KKwkJCSAqLworCQkJZGljdF9saW1pdCgmcy0+ZGljdCwgbWluX3Qoc2l6ZV90LAorCQkJCQliLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MsCisJCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCkpOworCQkJaWYgKCFsem1hMl9sem1hKHMsIGIpKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5sem1hMi51bmNvbXByZXNzZWQgLT0gZGljdF9mbHVzaCgmcy0+ZGljdCwgYik7CisKKwkJCWlmIChzLT5sem1hMi51bmNvbXByZXNzZWQgPT0gMCkgeworCQkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkID4gMCB8fCBzLT5sem1hLmxlbiA+IDAKKwkJCQkJCXx8ICFyY19pc19maW5pc2hlZCgmcy0+cmMpKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCXJjX3Jlc2V0KCZzLT5yYyk7CisJCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKworCQkJfSBlbHNlIGlmIChiLT5vdXRfcG9zID09IGItPm91dF9zaXplCisJCQkJCXx8IChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZQorCQkJCQkJJiYgcy0+dGVtcC5zaXplCisJCQkJCQk8IHMtPmx6bWEyLmNvbXByZXNzZWQpKSB7CisJCQkJcmV0dXJuIFhaX09LOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNFUV9DT1BZOgorCQkJZGljdF91bmNvbXByZXNzZWQoJnMtPmRpY3QsIGIsICZzLT5sem1hMi5jb21wcmVzc2VkKTsKKwkJCWlmIChzLT5sem1hMi5jb21wcmVzc2VkID4gMCkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBYWl9PSzsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfbHptYTIgKnh6X2RlY19sem1hMl9jcmVhdGUoZW51bSB4el9tb2RlIG1vZGUsCisJCQkJCQkgICB1aW50MzJfdCBkaWN0X21heCkKK3sKKwlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPmRpY3QubW9kZSA9IG1vZGU7CisJcy0+ZGljdC5zaXplX21heCA9IGRpY3RfbWF4OworCisJaWYgKERFQ19JU19QUkVBTExPQyhtb2RlKSkgeworCQlzLT5kaWN0LmJ1ZiA9IHZtYWxsb2MoZGljdF9tYXgpOworCQlpZiAocy0+ZGljdC5idWYgPT0gTlVMTCkgeworCQkJa2ZyZWUocyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSBpZiAoREVDX0lTX0RZTkFMTE9DKG1vZGUpKSB7CisJCXMtPmRpY3QuYnVmID0gTlVMTDsKKwkJcy0+ZGljdC5hbGxvY2F0ZWQgPSAwOworCX0KKworCXJldHVybiBzOworfQorCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3Jlc2V0KHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisJLyogVGhpcyBsaW1pdHMgZGljdGlvbmFyeSBzaXplIHRvIDMgR2lCIHRvIGtlZXAgcGFyc2luZyBzaW1wbGVyLiAqLworCWlmIChwcm9wcyA+IDM5KQorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCXMtPmRpY3Quc2l6ZSA9IDIgKyAocHJvcHMgJiAxKTsKKwlzLT5kaWN0LnNpemUgPDw9IChwcm9wcyA+PiAxKSArIDExOworCisJaWYgKERFQ19JU19NVUxUSShzLT5kaWN0Lm1vZGUpKSB7CisJCWlmIChzLT5kaWN0LnNpemUgPiBzLT5kaWN0LnNpemVfbWF4KQorCQkJcmV0dXJuIFhaX01FTUxJTUlUX0VSUk9SOworCisJCXMtPmRpY3QuZW5kID0gcy0+ZGljdC5zaXplOworCisJCWlmIChERUNfSVNfRFlOQUxMT0Mocy0+ZGljdC5tb2RlKSkgeworCQkJaWYgKHMtPmRpY3QuYWxsb2NhdGVkIDwgcy0+ZGljdC5zaXplKSB7CisJCQkJdmZyZWUocy0+ZGljdC5idWYpOworCQkJCXMtPmRpY3QuYnVmID0gdm1hbGxvYyhzLT5kaWN0LnNpemUpOworCQkJCWlmIChzLT5kaWN0LmJ1ZiA9PSBOVUxMKSB7CisJCQkJCXMtPmRpY3QuYWxsb2NhdGVkID0gMDsKKwkJCQkJcmV0dXJuIFhaX01FTV9FUlJPUjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlzLT5sem1hLmxlbiA9IDA7CisKKwlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworCXMtPmx6bWEyLm5lZWRfZGljdF9yZXNldCA9IHRydWU7CisKKwlzLT50ZW1wLnNpemUgPSAwOworCisJcmV0dXJuIFhaX09LOworfQorCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJaWYgKERFQ19JU19NVUxUSShzLT5kaWN0Lm1vZGUpKQorCQl2ZnJlZShzLT5kaWN0LmJ1Zik7CisKKwlrZnJlZShzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi94ei94el9kZWNfc3RyZWFtLmMgYi9saWIveHoveHpfZGVjX3N0cmVhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODA5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveHoveHpfZGVjX3N0cmVhbS5jCkBAIC0wLDAgKzEsODIxIEBACisvKgorICogLnh6IFN0cmVhbSBkZWNvZGVyCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisjaW5jbHVkZSAieHpfc3RyZWFtLmgiCisKKy8qIEhhc2ggdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQgKi8KK3N0cnVjdCB4el9kZWNfaGFzaCB7CisJdmxpX3R5cGUgdW5wYWRkZWQ7CisJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCXVpbnQzMl90IGNyYzMyOworfTsKKworc3RydWN0IHh6X2RlYyB7CisJLyogUG9zaXRpb24gaW4gZGVjX21haW4oKSAqLworCWVudW0geworCQlTRVFfU1RSRUFNX0hFQURFUiwKKwkJU0VRX0JMT0NLX1NUQVJULAorCQlTRVFfQkxPQ0tfSEVBREVSLAorCQlTRVFfQkxPQ0tfVU5DT01QUkVTUywKKwkJU0VRX0JMT0NLX1BBRERJTkcsCisJCVNFUV9CTE9DS19DSEVDSywKKwkJU0VRX0lOREVYLAorCQlTRVFfSU5ERVhfUEFERElORywKKwkJU0VRX0lOREVYX0NSQzMyLAorCQlTRVFfU1RSRUFNX0ZPT1RFUgorCX0gc2VxdWVuY2U7CisKKwkvKiBQb3NpdGlvbiBpbiB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYW5kIENoZWNrIGZpZWxkcyAqLworCXVpbnQzMl90IHBvczsKKworCS8qIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGRlY29kZWQgYnkgZGVjX3ZsaSgpICovCisJdmxpX3R5cGUgdmxpOworCisJLyogU2F2ZWQgaW5fcG9zIGFuZCBvdXRfcG9zICovCisJc2l6ZV90IGluX3N0YXJ0OworCXNpemVfdCBvdXRfc3RhcnQ7CisKKwkvKiBDUkMzMiB2YWx1ZSBpbiBCbG9jayBvciBJbmRleCAqLworCXVpbnQzMl90IGNyYzMyOworCisJLyogVHlwZSBvZiB0aGUgaW50ZWdyaXR5IGNoZWNrIGNhbGN1bGF0ZWQgZnJvbSB1bmNvbXByZXNzZWQgZGF0YSAqLworCWVudW0geHpfY2hlY2sgY2hlY2tfdHlwZTsKKworCS8qIE9wZXJhdGlvbiBtb2RlICovCisJZW51bSB4el9tb2RlIG1vZGU7CisKKwkvKgorCSAqIFRydWUgaWYgdGhlIG5leHQgY2FsbCB0byB4el9kZWNfcnVuKCkgaXMgYWxsb3dlZCB0byByZXR1cm4KKwkgKiBYWl9CVUZfRVJST1IuCisJICovCisJYm9vbCBhbGxvd19idWZfZXJyb3I7CisKKwkvKiBJbmZvcm1hdGlvbiBzdG9yZWQgaW4gQmxvY2sgSGVhZGVyICovCisJc3RydWN0IHsKKwkJLyoKKwkJICogVmFsdWUgc3RvcmVkIGluIHRoZSBDb21wcmVzc2VkIFNpemUgZmllbGQsIG9yCisJCSAqIFZMSV9VTktOT1dOIGlmIENvbXByZXNzZWQgU2l6ZSBpcyBub3QgcHJlc2VudC4KKwkJICovCisJCXZsaV90eXBlIGNvbXByZXNzZWQ7CisKKwkJLyoKKwkJICogVmFsdWUgc3RvcmVkIGluIHRoZSBVbmNvbXByZXNzZWQgU2l6ZSBmaWVsZCwgb3IKKwkJICogVkxJX1VOS05PV04gaWYgVW5jb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisJCSAqLworCQl2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKwkJLyogU2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyIGZpZWxkICovCisJCXVpbnQzMl90IHNpemU7CisJfSBibG9ja19oZWFkZXI7CisKKwkvKiBJbmZvcm1hdGlvbiBjb2xsZWN0ZWQgd2hlbiBkZWNvZGluZyBCbG9ja3MgKi8KKwlzdHJ1Y3QgeworCQkvKiBPYnNlcnZlZCBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKwkJdmxpX3R5cGUgY29tcHJlc3NlZDsKKworCQkvKiBPYnNlcnZlZCB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgY3VycmVudCBCbG9jayAqLworCQl2bGlfdHlwZSB1bmNvbXByZXNzZWQ7CisKKwkJLyogTnVtYmVyIG9mIEJsb2NrcyBkZWNvZGVkIHNvIGZhciAqLworCQl2bGlfdHlwZSBjb3VudDsKKworCQkvKgorCQkgKiBIYXNoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgQmxvY2sgc2l6ZXMuIFRoaXMgaXMgdXNlZCB0bworCQkgKiB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuCisJCSAqLworCQlzdHJ1Y3QgeHpfZGVjX2hhc2ggaGFzaDsKKwl9IGJsb2NrOworCisJLyogVmFyaWFibGVzIG5lZWRlZCB3aGVuIHZlcmlmeWluZyB0aGUgSW5kZXggZmllbGQgKi8KKwlzdHJ1Y3QgeworCQkvKiBQb3NpdGlvbiBpbiBkZWNfaW5kZXgoKSAqLworCQllbnVtIHsKKwkJCVNFUV9JTkRFWF9DT1VOVCwKKwkJCVNFUV9JTkRFWF9VTlBBRERFRCwKKwkJCVNFUV9JTkRFWF9VTkNPTVBSRVNTRUQKKwkJfSBzZXF1ZW5jZTsKKworCQkvKiBTaXplIG9mIHRoZSBJbmRleCBpbiBieXRlcyAqLworCQl2bGlfdHlwZSBzaXplOworCisJCS8qIE51bWJlciBvZiBSZWNvcmRzIChtYXRjaGVzIGJsb2NrLmNvdW50IGluIHZhbGlkIGZpbGVzKSAqLworCQl2bGlfdHlwZSBjb3VudDsKKworCQkvKgorCQkgKiBIYXNoIGNhbGN1bGF0ZWQgZnJvbSB0aGUgUmVjb3JkcyAobWF0Y2hlcyBibG9jay5oYXNoIGluCisJCSAqIHZhbGlkIGZpbGVzKS4KKwkJICovCisJCXN0cnVjdCB4el9kZWNfaGFzaCBoYXNoOworCX0gaW5kZXg7CisKKwkvKgorCSAqIFRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIHRvIGhvbGQgU3RyZWFtIEhlYWRlciwgQmxvY2sgSGVhZGVyLAorCSAqIGFuZCBTdHJlYW0gRm9vdGVyLiBUaGUgQmxvY2sgSGVhZGVyIGlzIHRoZSBiaWdnZXN0ICgxIEtpQikKKwkgKiBzbyB3ZSByZXNlcnZlIHNwYWNlIGFjY29yZGluZyB0byB0aGF0LiBidWZbXSBoYXMgdG8gYmUgYWxpZ25lZAorCSAqIHRvIGEgbXVsdGlwbGUgb2YgZm91ciBieXRlczsgdGhlIHNpemVfdCB2YXJpYWJsZXMgYmVmb3JlIGl0CisJICogc2hvdWxkIGd1YXJhbnRlZSB0aGlzLgorCSAqLworCXN0cnVjdCB7CisJCXNpemVfdCBwb3M7CisJCXNpemVfdCBzaXplOworCQl1aW50OF90IGJ1ZlsxMDI0XTsKKwl9IHRlbXA7CisKKwlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMjsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlzdHJ1Y3QgeHpfZGVjX2JjaiAqYmNqOworCWJvb2wgYmNqX2FjdGl2ZTsKKyNlbmRpZgorfTsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKy8qIFNpemVzIG9mIHRoZSBDaGVjayBmaWVsZCB3aXRoIGRpZmZlcmVudCBDaGVjayBJRHMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGNoZWNrX3NpemVzWzE2XSA9IHsKKwkwLAorCTQsIDQsIDQsCisJOCwgOCwgOCwKKwkxNiwgMTYsIDE2LAorCTMyLCAzMiwgMzIsCisJNjQsIDY0LCA2NAorfTsKKyNlbmRpZgorCisvKgorICogRmlsbCBzLT50ZW1wIGJ5IGNvcHlpbmcgZGF0YSBzdGFydGluZyBmcm9tIGItPmluW2ItPmluX3Bvc10uIENhbGxlcgorICogbXVzdCBoYXZlIHNldCBzLT50ZW1wLnBvcyB0byBpbmRpY2F0ZSBob3cgbXVjaCBkYXRhIHdlIGFyZSBzdXBwb3NlZAorICogdG8gY29weSBpbnRvIHMtPnRlbXAuYnVmLiBSZXR1cm4gdHJ1ZSBvbmNlIHMtPnRlbXAucG9zIGhhcyByZWFjaGVkCisgKiBzLT50ZW1wLnNpemUuCisgKi8KK3N0YXRpYyBib29sIGZpbGxfdGVtcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemUgPSBtaW5fdChzaXplX3QsCisJCQliLT5pbl9zaXplIC0gYi0+aW5fcG9zLCBzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyk7CisKKwltZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisJYi0+aW5fcG9zICs9IGNvcHlfc2l6ZTsKKwlzLT50ZW1wLnBvcyArPSBjb3B5X3NpemU7CisKKwlpZiAocy0+dGVtcC5wb3MgPT0gcy0+dGVtcC5zaXplKSB7CisJCXMtPnRlbXAucG9zID0gMDsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKiBEZWNvZGUgYSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciAobGl0dGxlLWVuZGlhbiBiYXNlLTEyOCBlbmNvZGluZykgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfdmxpKHN0cnVjdCB4el9kZWMgKnMsIGNvbnN0IHVpbnQ4X3QgKmluLAorCQkJICAgc2l6ZV90ICppbl9wb3MsIHNpemVfdCBpbl9zaXplKQoreworCXVpbnQ4X3QgYnl0ZTsKKworCWlmIChzLT5wb3MgPT0gMCkKKwkJcy0+dmxpID0gMDsKKworCXdoaWxlICgqaW5fcG9zIDwgaW5fc2l6ZSkgeworCQlieXRlID0gaW5bKmluX3Bvc107CisJCSsrKmluX3BvczsKKworCQlzLT52bGkgfD0gKHZsaV90eXBlKShieXRlICYgMHg3RikgPDwgcy0+cG9zOworCisJCWlmICgoYnl0ZSAmIDB4ODApID09IDApIHsKKwkJCS8qIERvbid0IGFsbG93IG5vbi1taW5pbWFsIGVuY29kaW5ncy4gKi8KKwkJCWlmIChieXRlID09IDAgJiYgcy0+cG9zICE9IDApCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPnBvcyA9IDA7CisJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKwkJfQorCisJCXMtPnBvcyArPSA3OworCQlpZiAocy0+cG9zID09IDcgKiBWTElfQllURVNfTUFYKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJfQorCisJcmV0dXJuIFhaX09LOworfQorCisvKgorICogRGVjb2RlIHRoZSBDb21wcmVzc2VkIERhdGEgZmllbGQgZnJvbSBhIEJsb2NrLiBVcGRhdGUgYW5kIHZhbGlkYXRlCisgKiB0aGUgb2JzZXJ2ZWQgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIG9mIHRoZSBCbG9jayBzbyB0aGF0CisgKiB0aGV5IGRvbid0IGV4Y2VlZCB0aGUgdmFsdWVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyCisgKiAodmFsaWRhdGlvbiBhc3N1bWVzIHRoYXQgbm8gaW50ZWdlciBvdmVyZmxvdyBvY2N1cnMsIHNpbmNlIHZsaV90eXBlCisgKiBpcyBub3JtYWxseSB1aW50NjRfdCkuIFVwZGF0ZSB0aGUgQ1JDMzIgaWYgcHJlc2VuY2Ugb2YgdGhlIENSQzMyCisgKiBmaWVsZCB3YXMgaW5kaWNhdGVkIGluIFN0cmVhbSBIZWFkZXIuCisgKgorICogT25jZSB0aGUgZGVjb2RpbmcgaXMgZmluaXNoZWQsIHZhbGlkYXRlIHRoYXQgdGhlIG9ic2VydmVkIHNpemVzIG1hdGNoCisgKiB0aGUgc2l6ZXMgcG9zc2libHkgc3RvcmVkIGluIHRoZSBCbG9jayBIZWFkZXIuIFVwZGF0ZSB0aGUgaGFzaCBhbmQKKyAqIEJsb2NrIGNvdW50LCB3aGljaCBhcmUgbGF0ZXIgdXNlZCB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfYmxvY2soc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwlzLT5pbl9zdGFydCA9IGItPmluX3BvczsKKwlzLT5vdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCisjaWZkZWYgWFpfREVDX0JDSgorCWlmIChzLT5iY2pfYWN0aXZlKQorCQlyZXQgPSB4el9kZWNfYmNqX3J1bihzLT5iY2osIHMtPmx6bWEyLCBiKTsKKwllbHNlCisjZW5kaWYKKwkJcmV0ID0geHpfZGVjX2x6bWEyX3J1bihzLT5sem1hMiwgYik7CisKKwlzLT5ibG9jay5jb21wcmVzc2VkICs9IGItPmluX3BvcyAtIHMtPmluX3N0YXJ0OworCXMtPmJsb2NrLnVuY29tcHJlc3NlZCArPSBiLT5vdXRfcG9zIC0gcy0+b3V0X3N0YXJ0OworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlcGFyYXRlbHkgY2hlY2sgZm9yIFZMSV9VTktOT1dOLCBzaW5jZQorCSAqIHRoZSBvYnNlcnZlZCBzaXplcyBhcmUgYWx3YXlzIHNtYWxsZXIgdGhhbiBWTElfVU5LTk9XTi4KKwkgKi8KKwlpZiAocy0+YmxvY2suY29tcHJlc3NlZCA+IHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkCisJCQl8fCBzLT5ibG9jay51bmNvbXByZXNzZWQKKwkJCQk+IHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpCisJCXMtPmNyYzMyID0geHpfY3JjMzIoYi0+b3V0ICsgcy0+b3V0X3N0YXJ0LAorCQkJCWItPm91dF9wb3MgLSBzLT5vdXRfc3RhcnQsIHMtPmNyYzMyKTsKKworCWlmIChyZXQgPT0gWFpfU1RSRUFNX0VORCkgeworCQlpZiAocy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgIT0gVkxJX1VOS05PV04KKwkJCQkmJiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorCQkJCQkhPSBzLT5ibG9jay5jb21wcmVzc2VkKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJaWYgKHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgIT0gVkxJX1VOS05PV04KKwkJCQkmJiBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkCisJCQkJCSE9IHMtPmJsb2NrLnVuY29tcHJlc3NlZCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gcy0+YmxvY2tfaGVhZGVyLnNpemUKKwkJCQkrIHMtPmJsb2NrLmNvbXByZXNzZWQ7CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gY2hlY2tfc2l6ZXNbcy0+Y2hlY2tfdHlwZV07CisjZWxzZQorCQlpZiAocy0+Y2hlY2tfdHlwZSA9PSBYWl9DSEVDS19DUkMzMikKKwkJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gNDsKKyNlbmRpZgorCisJCXMtPmJsb2NrLmhhc2gudW5jb21wcmVzc2VkICs9IHMtPmJsb2NrLnVuY29tcHJlc3NlZDsKKwkJcy0+YmxvY2suaGFzaC5jcmMzMiA9IHh6X2NyYzMyKAorCQkJCShjb25zdCB1aW50OF90ICopJnMtPmJsb2NrLmhhc2gsCisJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpLCBzLT5ibG9jay5oYXNoLmNyYzMyKTsKKworCQkrK3MtPmJsb2NrLmNvdW50OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFVwZGF0ZSB0aGUgSW5kZXggc2l6ZSBhbmQgdGhlIENSQzMyIHZhbHVlLiAqLworc3RhdGljIHZvaWQgaW5kZXhfdXBkYXRlKHN0cnVjdCB4el9kZWMgKnMsIGNvbnN0IHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGluX3VzZWQgPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5pbmRleC5zaXplICs9IGluX3VzZWQ7CisJcy0+Y3JjMzIgPSB4el9jcmMzMihiLT5pbiArIHMtPmluX3N0YXJ0LCBpbl91c2VkLCBzLT5jcmMzMik7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIE51bWJlciBvZiBSZWNvcmRzLCBVbnBhZGRlZCBTaXplLCBhbmQgVW5jb21wcmVzc2VkIFNpemUKKyAqIGZpZWxkcyBmcm9tIHRoZSBJbmRleCBmaWVsZC4gVGhhdCBpcywgSW5kZXggUGFkZGluZyBhbmQgQ1JDMzIgYXJlIG5vdAorICogZGVjb2RlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgY2FuIHJldHVybiBYWl9PSyAobW9yZSBpbnB1dCBuZWVkZWQpLCBYWl9TVFJFQU1fRU5EIChldmVyeXRoaW5nCisgKiBzdWNjZXNzZnVsbHkgZGVjb2RlZCksIG9yIFhaX0RBVEFfRVJST1IgKGlucHV0IGlzIGNvcnJ1cHQpLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX2luZGV4KHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJZG8geworCQlyZXQgPSBkZWNfdmxpKHMsIGItPmluLCAmYi0+aW5fcG9zLCBiLT5pbl9zaXplKTsKKwkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKSB7CisJCQlpbmRleF91cGRhdGUocywgYik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc3dpdGNoIChzLT5pbmRleC5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9JTkRFWF9DT1VOVDoKKwkJCXMtPmluZGV4LmNvdW50ID0gcy0+dmxpOworCisJCQkvKgorCQkJICogVmFsaWRhdGUgdGhhdCB0aGUgTnVtYmVyIG9mIFJlY29yZHMgZmllbGQKKwkJCSAqIGluZGljYXRlcyB0aGUgc2FtZSBudW1iZXIgb2YgUmVjb3JkcyBhcworCQkJICogdGhlcmUgd2VyZSBCbG9ja3MgaW4gdGhlIFN0cmVhbS4KKwkJCSAqLworCQkJaWYgKHMtPmluZGV4LmNvdW50ICE9IHMtPmJsb2NrLmNvdW50KQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTlBBRERFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0lOREVYX1VOUEFEREVEOgorCQkJcy0+aW5kZXguaGFzaC51bnBhZGRlZCArPSBzLT52bGk7CisJCQlzLT5pbmRleC5zZXF1ZW5jZSA9IFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQ7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9JTkRFWF9VTkNPTVBSRVNTRUQ6CisJCQlzLT5pbmRleC5oYXNoLnVuY29tcHJlc3NlZCArPSBzLT52bGk7CisJCQlzLT5pbmRleC5oYXNoLmNyYzMyID0geHpfY3JjMzIoCisJCQkJCShjb25zdCB1aW50OF90ICopJnMtPmluZGV4Lmhhc2gsCisJCQkJCXNpemVvZihzLT5pbmRleC5oYXNoKSwKKwkJCQkJcy0+aW5kZXguaGFzaC5jcmMzMik7CisJCQktLXMtPmluZGV4LmNvdW50OworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5QQURERUQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHMtPmluZGV4LmNvdW50ID4gMCk7CisKKwlyZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworLyoKKyAqIFZhbGlkYXRlIHRoYXQgdGhlIG5leHQgZm91ciBpbnB1dCBieXRlcyBtYXRjaCB0aGUgdmFsdWUgb2Ygcy0+Y3JjMzIuCisgKiBzLT5wb3MgbXVzdCBiZSB6ZXJvIHdoZW4gc3RhcnRpbmcgdG8gdmFsaWRhdGUgdGhlIGZpcnN0IGJ5dGUuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBjcmMzMl92YWxpZGF0ZShzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWRvIHsKKwkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJcmV0dXJuIFhaX09LOworCisJCWlmICgoKHMtPmNyYzMyID4+IHMtPnBvcykgJiAweEZGKSAhPSBiLT5pbltiLT5pbl9wb3MrK10pCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5wb3MgKz0gODsKKworCX0gd2hpbGUgKHMtPnBvcyA8IDMyKTsKKworCXMtPmNyYzMyID0gMDsKKwlzLT5wb3MgPSAwOworCisJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisvKgorICogU2tpcCBvdmVyIHRoZSBDaGVjayBmaWVsZCB3aGVuIHRoZSBDaGVjayBJRCBpcyBub3Qgc3VwcG9ydGVkLgorICogUmV0dXJucyB0cnVlIG9uY2UgdGhlIHdob2xlIENoZWNrIGZpZWxkIGhhcyBiZWVuIHNraXBwZWQgb3Zlci4KKyAqLworc3RhdGljIGJvb2wgY2hlY2tfc2tpcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXdoaWxlIChzLT5wb3MgPCBjaGVja19zaXplc1tzLT5jaGVja190eXBlXSkgeworCQlpZiAoYi0+aW5fcG9zID09IGItPmluX3NpemUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJKytiLT5pbl9wb3M7CisJCSsrcy0+cG9zOworCX0KKworCXMtPnBvcyA9IDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBIZWFkZXIgZmllbGQgKHRoZSBmaXJzdCAxMiBieXRlcyBvZiB0aGUgLnh6IFN0cmVhbSkuICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3N0cmVhbV9oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlpZiAoIW1lbWVxKHMtPnRlbXAuYnVmLCBIRUFERVJfTUFHSUMsIEhFQURFUl9NQUdJQ19TSVpFKSkKKwkJcmV0dXJuIFhaX0ZPUk1BVF9FUlJPUjsKKworCWlmICh4el9jcmMzMihzLT50ZW1wLmJ1ZiArIEhFQURFUl9NQUdJQ19TSVpFLCAyLCAwKQorCQkJIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyBIRUFERVJfTUFHSUNfU0laRSArIDIpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT50ZW1wLmJ1ZltIRUFERVJfTUFHSUNfU0laRV0gIT0gMCkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKgorCSAqIE9mIGludGVncml0eSBjaGVja3MsIHdlIHN1cHBvcnQgb25seSBub25lIChDaGVjayBJRCA9IDApIGFuZAorCSAqIENSQzMyIChDaGVjayBJRCA9IDEpLiBIb3dldmVyLCBpZiBYWl9ERUNfQU5ZX0NIRUNLIGlzIGRlZmluZWQsCisJICogd2Ugd2lsbCBhY2NlcHQgb3RoZXIgY2hlY2sgdHlwZXMgdG9vLCBidXQgdGhlbiB0aGUgY2hlY2sgd29uJ3QKKwkgKiBiZSB2ZXJpZmllZCBhbmQgYSB3YXJuaW5nIChYWl9VTlNVUFBPUlRFRF9DSEVDSykgd2lsbCBiZSBnaXZlbi4KKwkgKi8KKwlzLT5jaGVja190eXBlID0gcy0+dGVtcC5idWZbSEVBREVSX01BR0lDX1NJWkUgKyAxXTsKKworI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwlpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX01BWCkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX0NSQzMyKQorCQlyZXR1cm4gWFpfVU5TVVBQT1JURURfQ0hFQ0s7CisjZWxzZQorCWlmIChzLT5jaGVja190eXBlID4gWFpfQ0hFQ0tfQ1JDMzIpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworI2VuZGlmCisKKwlyZXR1cm4gWFpfT0s7Cit9CisKKy8qIERlY29kZSB0aGUgU3RyZWFtIEZvb3RlciBmaWVsZCAodGhlIGxhc3QgMTIgYnl0ZXMgb2YgdGhlIC54eiBTdHJlYW0pICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3N0cmVhbV9mb290ZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlpZiAoIW1lbWVxKHMtPnRlbXAuYnVmICsgMTAsIEZPT1RFUl9NQUdJQywgRk9PVEVSX01BR0lDX1NJWkUpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmICh4el9jcmMzMihzLT50ZW1wLmJ1ZiArIDQsIDYsIDApICE9IGdldF9sZTMyKHMtPnRlbXAuYnVmKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkvKgorCSAqIFZhbGlkYXRlIEJhY2t3YXJkIFNpemUuIE5vdGUgdGhhdCB3ZSBuZXZlciBhZGRlZCB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBJbmRleCBDUkMzMiBmaWVsZCB0byBzLT5pbmRleC5zaXplLCB0aHVzIHdlIHVzZSBzLT5pbmRleC5zaXplIC8gNAorCSAqIGluc3RlYWQgb2Ygcy0+aW5kZXguc2l6ZSAvIDQgLSAxLgorCSAqLworCWlmICgocy0+aW5kZXguc2l6ZSA+PiAyKSAhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZiArIDQpKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT50ZW1wLmJ1Zls4XSAhPSAwIHx8IHMtPnRlbXAuYnVmWzldICE9IHMtPmNoZWNrX3R5cGUpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyoKKwkgKiBVc2UgWFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFhaX09LIHRvIGJlIG1vcmUgY29udmVuaWVudAorCSAqIGZvciB0aGUgY2FsbGVyLgorCSAqLworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisvKiBEZWNvZGUgdGhlIEJsb2NrIEhlYWRlciBhbmQgaW5pdGlhbGl6ZSB0aGUgZmlsdGVyIGNoYWluLiAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19ibG9ja19oZWFkZXIoc3RydWN0IHh6X2RlYyAqcykKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBDUkMzMi4gV2Uga25vdyB0aGF0IHRoZSB0ZW1wIGJ1ZmZlciBpcyBhdCBsZWFzdAorCSAqIGVpZ2h0IGJ5dGVzIHNvIHRoaXMgaXMgc2FmZS4KKwkgKi8KKwlzLT50ZW1wLnNpemUgLT0gNDsKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSwgMCkKKwkJCSE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDI7CisKKwkvKgorCSAqIENhdGNoIHVuc3VwcG9ydGVkIEJsb2NrIEZsYWdzLiBXZSBzdXBwb3J0IG9ubHkgb25lIG9yIHR3byBmaWx0ZXJzCisJICogaW4gdGhlIGNoYWluLCBzbyB3ZSBjYXRjaCB0aGF0IHdpdGggdGhlIHNhbWUgdGVzdC4KKwkgKi8KKyNpZmRlZiBYWl9ERUNfQkNKCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRSkKKyNlbHNlCisJaWYgKHMtPnRlbXAuYnVmWzFdICYgMHgzRikKKyNlbmRpZgorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCS8qIENvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4NDApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCQkhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBzLT52bGk7CisJfSBlbHNlIHsKKwkJcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKwkvKiBVbmNvbXByZXNzZWQgU2l6ZSAqLworCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4ODApIHsKKwkJaWYgKGRlY192bGkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLnBvcywgcy0+dGVtcC5zaXplKQorCQkJCSE9IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gcy0+dmxpOworCX0gZWxzZSB7CisJCXMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgPSBWTElfVU5LTk9XTjsKKwl9CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJLyogSWYgdGhlcmUgYXJlIHR3byBmaWx0ZXJzLCB0aGUgZmlyc3Qgb25lIG11c3QgYmUgYSBCQ0ogZmlsdGVyLiAqLworCXMtPmJjal9hY3RpdmUgPSBzLT50ZW1wLmJ1ZlsxXSAmIDB4MDE7CisJaWYgKHMtPmJjal9hY3RpdmUpIHsKKwkJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMikKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJCXJldCA9IHh6X2RlY19iY2pfcmVzZXQocy0+YmNqLCBzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSk7CisJCWlmIChyZXQgIT0gWFpfT0spCisJCQlyZXR1cm4gcmV0OworCisJCS8qCisJCSAqIFdlIGRvbid0IHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldCwKKwkJICogc28gU2l6ZSBvZiBQcm9wZXJ0aWVzIG11c3QgYmUgemVyby4KKwkJICovCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorI2VuZGlmCisKKwkvKiBWYWxpZCBGaWx0ZXIgRmxhZ3MgYWx3YXlzIHRha2UgYXQgbGVhc3QgdHdvIGJ5dGVzLiAqLworCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDIpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyogRmlsdGVyIElEID0gTFpNQTIgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgyMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBTaXplIG9mIFByb3BlcnRpZXMgPSAxLWJ5dGUgRmlsdGVyIFByb3BlcnRpZXMgKi8KKwlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBGaWx0ZXIgUHJvcGVydGllcyBjb250YWlucyBMWk1BMiBkaWN0aW9uYXJ5IHNpemUuICovCisJaWYgKHMtPnRlbXAuc2l6ZSAtIHMtPnRlbXAucG9zIDwgMSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlyZXQgPSB4el9kZWNfbHptYTJfcmVzZXQocy0+bHptYTIsIHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdKTsKKwlpZiAocmV0ICE9IFhaX09LKQorCQlyZXR1cm4gcmV0OworCisJLyogVGhlIHJlc3QgbXVzdCBiZSBIZWFkZXIgUGFkZGluZy4gKi8KKwl3aGlsZSAocy0+dGVtcC5wb3MgPCBzLT50ZW1wLnNpemUpCisJCWlmIChzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSAhPSAweDAwKQorCQkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlzLT50ZW1wLnBvcyA9IDA7CisJcy0+YmxvY2suY29tcHJlc3NlZCA9IDA7CisJcy0+YmxvY2sudW5jb21wcmVzc2VkID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworc3RhdGljIGVudW0geHpfcmV0IGRlY19tYWluKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJLyoKKwkgKiBTdG9yZSB0aGUgc3RhcnQgcG9zaXRpb24gZm9yIHRoZSBjYXNlIHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUKKwkgKiBvZiB0aGUgSW5kZXggZmllbGQuCisJICovCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlzd2l0Y2ggKHMtPnNlcXVlbmNlKSB7CisJCWNhc2UgU0VRX1NUUkVBTV9IRUFERVI6CisJCQkvKgorCQkJICogU3RyZWFtIEhlYWRlciBpcyBjb3BpZWQgdG8gcy0+dGVtcCwgYW5kIHRoZW4KKwkJCSAqIGRlY29kZWQgZnJvbSB0aGVyZS4gVGhpcyB3YXkgaWYgdGhlIGNhbGxlcgorCQkJICogZ2l2ZXMgdXMgb25seSBsaXR0bGUgaW5wdXQgYXQgYSB0aW1lLCB3ZSBjYW4KKwkJCSAqIHN0aWxsIGtlZXAgdGhlIFN0cmVhbSBIZWFkZXIgZGVjb2RpbmcgY29kZQorCQkJICogc2ltcGxlLiBTaW1pbGFyIGFwcHJvYWNoIGlzIHVzZWQgaW4gbWFueSBwbGFjZXMKKwkJCSAqIGluIHRoaXMgZmlsZS4KKwkJCSAqLworCQkJaWYgKCFmaWxsX3RlbXAocywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQkvKgorCQkJICogSWYgZGVjX3N0cmVhbV9oZWFkZXIoKSByZXR1cm5zCisJCQkgKiBYWl9VTlNVUFBPUlRFRF9DSEVDSywgaXQgaXMgc3RpbGwgcG9zc2libGUKKwkJCSAqIHRvIGNvbnRpbnVlIGRlY29kaW5nIGlmIHdvcmtpbmcgaW4gbXVsdGktY2FsbAorCQkJICogbW9kZS4gVGh1cywgdXBkYXRlIHMtPnNlcXVlbmNlIGJlZm9yZSBjYWxsaW5nCisJCQkgKiBkZWNfc3RyZWFtX2hlYWRlcigpLgorCQkJICovCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19TVEFSVDsKKworCQkJcmV0ID0gZGVjX3N0cmVhbV9oZWFkZXIocyk7CisJCQlpZiAocmV0ICE9IFhaX09LKQorCQkJCXJldHVybiByZXQ7CisKKwkJY2FzZSBTRVFfQkxPQ0tfU1RBUlQ6CisJCQkvKiBXZSBuZWVkIG9uZSBieXRlIG9mIGlucHV0IHRvIGNvbnRpbnVlLiAqLworCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJLyogU2VlIGlmIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoYi0+aW5bYi0+aW5fcG9zXSA9PSAwKSB7CisJCQkJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3MrKzsKKwkJCQlzLT5zZXF1ZW5jZSA9IFNFUV9JTkRFWDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgQmxvY2sgSGVhZGVyIGFuZAorCQkJICogcHJlcGFyZSB0byBkZWNvZGUgaXQuCisJCQkgKi8KKwkJCXMtPmJsb2NrX2hlYWRlci5zaXplCisJCQkJPSAoKHVpbnQzMl90KWItPmluW2ItPmluX3Bvc10gKyAxKSAqIDQ7CisKKwkJCXMtPnRlbXAuc2l6ZSA9IHMtPmJsb2NrX2hlYWRlci5zaXplOworCQkJcy0+dGVtcC5wb3MgPSAwOworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfSEVBREVSOworCisJCWNhc2UgU0VRX0JMT0NLX0hFQURFUjoKKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcmV0ID0gZGVjX2Jsb2NrX2hlYWRlcihzKTsKKwkJCWlmIChyZXQgIT0gWFpfT0spCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfVU5DT01QUkVTUzsKKworCQljYXNlIFNFUV9CTE9DS19VTkNPTVBSRVNTOgorCQkJcmV0ID0gZGVjX2Jsb2NrKHMsIGIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1BBRERJTkc7CisKKwkJY2FzZSBTRVFfQkxPQ0tfUEFERElORzoKKwkJCS8qCisJCQkgKiBTaXplIG9mIENvbXByZXNzZWQgRGF0YSArIEJsb2NrIFBhZGRpbmcKKwkJCSAqIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLiBXZSBkb24ndCBuZWVkCisJCQkgKiBzLT5ibG9jay5jb21wcmVzc2VkIGZvciBhbnl0aGluZyBlbHNlCisJCQkgKiBhbnltb3JlLCBzbyB3ZSB1c2UgaXQgaGVyZSB0byB0ZXN0IHRoZSBzaXplCisJCQkgKiBvZiB0aGUgQmxvY2sgUGFkZGluZyBmaWVsZC4KKwkJCSAqLworCQkJd2hpbGUgKHMtPmJsb2NrLmNvbXByZXNzZWQgJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCQlpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQkJKytzLT5ibG9jay5jb21wcmVzc2VkOworCQkJfQorCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19DSEVDSzsKKworCQljYXNlIFNFUV9CTE9DS19DSEVDSzoKKwkJCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKSB7CisJCQkJcmV0ID0gY3JjMzJfdmFsaWRhdGUocywgYik7CisJCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorI2lmZGVmIFhaX0RFQ19BTllfQ0hFQ0sKKwkJCWVsc2UgaWYgKCFjaGVja19za2lwKHMsIGIpKSB7CisJCQkJcmV0dXJuIFhaX09LOworCQkJfQorI2VuZGlmCisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1NUQVJUOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVg6CisJCQlyZXQgPSBkZWNfaW5kZXgocywgYik7CisJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfUEFERElORzsKKworCQljYXNlIFNFUV9JTkRFWF9QQURESU5HOgorCQkJd2hpbGUgKChzLT5pbmRleC5zaXplICsgKGItPmluX3BvcyAtIHMtPmluX3N0YXJ0KSkKKwkJCQkJJiAzKSB7CisJCQkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKSB7CisJCQkJCWluZGV4X3VwZGF0ZShzLCBiKTsKKwkJCQkJcmV0dXJuIFhaX09LOworCQkJCX0KKworCQkJCWlmIChiLT5pbltiLT5pbl9wb3MrK10gIT0gMCkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCS8qIEZpbmlzaCB0aGUgQ1JDMzIgdmFsdWUgYW5kIEluZGV4IHNpemUuICovCisJCQlpbmRleF91cGRhdGUocywgYik7CisKKwkJCS8qIENvbXBhcmUgdGhlIGhhc2hlcyB0byB2YWxpZGF0ZSB0aGUgSW5kZXggZmllbGQuICovCisJCQlpZiAoIW1lbWVxKCZzLT5ibG9jay5oYXNoLCAmcy0+aW5kZXguaGFzaCwKKwkJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVhfQ1JDMzI7CisKKwkJY2FzZSBTRVFfSU5ERVhfQ1JDMzI6CisJCQlyZXQgPSBjcmMzMl92YWxpZGF0ZShzLCBiKTsKKwkJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzLT50ZW1wLnNpemUgPSBTVFJFQU1fSEVBREVSX1NJWkU7CisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9TVFJFQU1fRk9PVEVSOworCisJCWNhc2UgU0VRX1NUUkVBTV9GT09URVI6CisJCQlpZiAoIWZpbGxfdGVtcChzLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXJldHVybiBkZWNfc3RyZWFtX2Zvb3RlcihzKTsKKwkJfQorCX0KKworCS8qIE5ldmVyIHJlYWNoZWQgKi8KK30KKworLyoKKyAqIHh6X2RlY19ydW4oKSBpcyBhIHdyYXBwZXIgZm9yIGRlY19tYWluKCkgdG8gaGFuZGxlIHNvbWUgc3BlY2lhbCBjYXNlcyBpbgorICogbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwgZGVjb2RpbmcuCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCB3ZSBtdXN0IHJldHVybiBYWl9CVUZfRVJST1Igd2hlbiBpdCBzZWVtcyBjbGVhciB0aGF0IHdlCisgKiBhcmUgbm90IGdvaW5nIHRvIG1ha2UgYW55IHByb2dyZXNzIGFueW1vcmUuIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgY2FsbGVyCisgKiBmcm9tIGNhbGxpbmcgdXMgaW5maW5pdGVseSB3aGVuIHRoZSBpbnB1dCBmaWxlIGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UKKyAqIGNvcnJ1cHQuIFNpbmNlIHpsaWItc3R5bGUgQVBJIGFsbG93cyB0aGF0IHRoZSBjYWxsZXIgZmlsbHMgdGhlIGlucHV0IGJ1ZmZlcgorICogb25seSB3aGVuIHRoZSBkZWNvZGVyIGRvZXNuJ3QgcHJvZHVjZSBhbnkgbmV3IG91dHB1dCwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsCisgKiB0byBhdm9pZCByZXR1cm5pbmcgWFpfQlVGX0VSUk9SIHRvbyBlYXNpbHk6IFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5CisgKiBhZnRlciB0aGUgc2Vjb25kIGNvbnNlY3V0aXZlIGNhbGwgdG8geHpfZGVjX3J1bigpIHRoYXQgbWFrZXMgbm8gcHJvZ3Jlc3MuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgaWYgd2UgY291bGRuJ3QgZGVjb2RlIGV2ZXJ5dGhpbmcgYW5kIG5vIGVycm9yCisgKiBvY2N1cnJlZCwgZWl0aGVyIHRoZSBpbnB1dCBpcyB0cnVuY2F0ZWQgb3IgdGhlIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICogU2luY2Ugd2Uga25vdyB0aGF0IHRoZSBsYXN0IGlucHV0IGJ5dGUgbmV2ZXIgcHJvZHVjZXMgYW55IG91dHB1dCwgd2Uga25vdworICogdGhhdCBpZiBhbGwgdGhlIGlucHV0IHdhcyBjb25zdW1lZCBhbmQgZGVjb2Rpbmcgd2Fzbid0IGZpbmlzaGVkLCB0aGUgZmlsZQorICogbXVzdCBiZSBjb3JydXB0LiBPdGhlcndpc2UgdGhlIG91dHB1dCBidWZmZXIgaGFzIHRvIGJlIHRvbyBzbWFsbCBvciB0aGUKKyAqIGZpbGUgaXMgY29ycnVwdCBpbiBhIHdheSB0aGF0IGRlY29kaW5nIGl0IHByb2R1Y2VzIHRvbyBiaWcgb3V0cHV0LgorICoKKyAqIElmIHNpbmdsZS1jYWxsIGRlY29kaW5nIGZhaWxzLCB3ZSByZXNldCBiLT5pbl9wb3MgYW5kIGItPm91dF9wb3MgYmFjayB0bworICogdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiBUaGlzIGlzIGJlY2F1c2Ugd2l0aCBzb21lIGZpbHRlciBjaGFpbnMgdGhlcmUgd29uJ3QKKyAqIGJlIGFueSB2YWxpZCB1bmNvbXByZXNzZWQgZGF0YSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB1bmxlc3MgdGhlIGRlY29kaW5nCisgKiBhY3R1YWxseSBzdWNjZWVkcyAodGhhdCdzIHRoZSBwcmljZSB0byBwYXkgb2YgdXNpbmcgdGhlIG91dHB1dCBidWZmZXIgYXMKKyAqIHRoZSB3b3Jrc3BhY2UpLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX3J1bihzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl9zdGFydDsKKwlzaXplX3Qgb3V0X3N0YXJ0OworCWVudW0geHpfcmV0IHJldDsKKworCWlmIChERUNfSVNfU0lOR0xFKHMtPm1vZGUpKQorCQl4el9kZWNfcmVzZXQocyk7CisKKwlpbl9zdGFydCA9IGItPmluX3BvczsKKwlvdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCXJldCA9IGRlY19tYWluKHMsIGIpOworCisJaWYgKERFQ19JU19TSU5HTEUocy0+bW9kZSkpIHsKKwkJaWYgKHJldCA9PSBYWl9PSykKKwkJCXJldCA9IGItPmluX3BvcyA9PSBiLT5pbl9zaXplCisJCQkJCT8gWFpfREFUQV9FUlJPUiA6IFhaX0JVRl9FUlJPUjsKKworCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpIHsKKwkJCWItPmluX3BvcyA9IGluX3N0YXJ0OworCQkJYi0+b3V0X3BvcyA9IG91dF9zdGFydDsKKwkJfQorCisJfSBlbHNlIGlmIChyZXQgPT0gWFpfT0sgJiYgaW5fc3RhcnQgPT0gYi0+aW5fcG9zCisJCQkmJiBvdXRfc3RhcnQgPT0gYi0+b3V0X3BvcykgeworCQlpZiAocy0+YWxsb3dfYnVmX2Vycm9yKQorCQkJcmV0ID0gWFpfQlVGX0VSUk9SOworCisJCXMtPmFsbG93X2J1Zl9lcnJvciA9IHRydWU7CisJfSBlbHNlIHsKKwkJcy0+YWxsb3dfYnVmX2Vycm9yID0gZmFsc2U7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWMgKnh6X2RlY19pbml0KGVudW0geHpfbW9kZSBtb2RlLCB1aW50MzJfdCBkaWN0X21heCkKK3sKKwlzdHJ1Y3QgeHpfZGVjICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPm1vZGUgPSBtb2RlOworCisjaWZkZWYgWFpfREVDX0JDSgorCXMtPmJjaiA9IHh6X2RlY19iY2pfY3JlYXRlKERFQ19JU19TSU5HTEUobW9kZSkpOworCWlmIChzLT5iY2ogPT0gTlVMTCkKKwkJZ290byBlcnJvcl9iY2o7CisjZW5kaWYKKworCXMtPmx6bWEyID0geHpfZGVjX2x6bWEyX2NyZWF0ZShtb2RlLCBkaWN0X21heCk7CisJaWYgKHMtPmx6bWEyID09IE5VTEwpCisJCWdvdG8gZXJyb3JfbHptYTI7CisKKwl4el9kZWNfcmVzZXQocyk7CisJcmV0dXJuIHM7CisKK2Vycm9yX2x6bWEyOgorI2lmZGVmIFhaX0RFQ19CQ0oKKwl4el9kZWNfYmNqX2VuZChzLT5iY2opOworZXJyb3JfYmNqOgorI2VuZGlmCisJa2ZyZWUocyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK1haX0VYVEVSTiB2b2lkIHh6X2RlY19yZXNldChzdHJ1Y3QgeHpfZGVjICpzKQoreworCXMtPnNlcXVlbmNlID0gU0VRX1NUUkVBTV9IRUFERVI7CisJcy0+YWxsb3dfYnVmX2Vycm9yID0gZmFsc2U7CisJcy0+cG9zID0gMDsKKwlzLT5jcmMzMiA9IDA7CisJbWVtemVybygmcy0+YmxvY2ssIHNpemVvZihzLT5ibG9jaykpOworCW1lbXplcm8oJnMtPmluZGV4LCBzaXplb2Yocy0+aW5kZXgpKTsKKwlzLT50ZW1wLnBvcyA9IDA7CisJcy0+dGVtcC5zaXplID0gU1RSRUFNX0hFQURFUl9TSVpFOworfQorCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfZW5kKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKHMgIT0gTlVMTCkgeworCQl4el9kZWNfbHptYTJfZW5kKHMtPmx6bWEyKTsKKyNpZmRlZiBYWl9ERUNfQkNKCisJCXh6X2RlY19iY2pfZW5kKHMtPmJjaik7CisjZW5kaWYKKwkJa2ZyZWUocyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL3h6L3h6X2RlY19zeW1zLmMgYi9saWIveHoveHpfZGVjX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmViM2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3h6L3h6X2RlY19zeW1zLmMKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFhaIGRlY29kZXIgbW9kdWxlIGluZm9ybWF0aW9uCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC94ei5oPgorCitFWFBPUlRfU1lNQk9MKHh6X2RlY19pbml0KTsKK0VYUE9SVF9TWU1CT0woeHpfZGVjX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woeHpfZGVjX3J1bik7CitFWFBPUlRfU1lNQk9MKHh6X2RlY19lbmQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhaIGRlY29tcHJlc3NvciIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0FVVEhPUigiTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+IGFuZCBJZ29yIFBhdmxvdiIpOworCisvKgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBidXQgaW4gTGludXggaXQncyBzaW1wbGVzdCB0byBqdXN0CisgKiBzYXkgaXQncyBHUEwgYW5kIGNvbnNpZGVyIHRoZSBhdXRob3JzIGFzIHRoZSBjb3B5cmlnaHQgaG9sZGVycy4KKyAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL3h6L3h6X2RlY190ZXN0LmMgYi9saWIveHoveHpfZGVjX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTI4YTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3h6L3h6X2RlY190ZXN0LmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBYWiBkZWNvZGVyIHRlc3RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC94ei5oPgorCisvKiBNYXhpbXVtIHN1cHBvcnRlZCBkaWN0aW9uYXJ5IHNpemUgKi8KKyNkZWZpbmUgRElDVF9NQVggKDEgPDwgMjApCisKKy8qIERldmljZSBuYW1lIHRvIHBhc3MgdG8gcmVnaXN0ZXJfY2hyZGV2KCkuICovCisjZGVmaW5lIERFVklDRV9OQU1FICJ4el9kZWNfdGVzdCIKKworLyogRHluYW1pY2FsbHkgYWxsb2NhdGVkIGRldmljZSBtYWpvciBudW1iZXIgKi8KK3N0YXRpYyBpbnQgZGV2aWNlX21ham9yOworCisvKgorICogV2UgcmV1c2UgdGhlIHNhbWUgZGVjb2RlciBzdGF0ZSwgYW5kIHRodXMgY2FuIGRlY29kZSBvbmx5IG9uZQorICogZmlsZSBhdCBhIHRpbWUuCisgKi8KK3N0YXRpYyBib29sIGRldmljZV9pc19vcGVuOworCisvKiBYWiBkZWNvZGVyIHN0YXRlICovCitzdGF0aWMgc3RydWN0IHh6X2RlYyAqc3RhdGU7CisKKy8qCisgKiBSZXR1cm4gdmFsdWUgb2YgeHpfZGVjX3J1bigpLiBXZSBuZWVkIHRvIGF2b2lkIGNhbGxpbmcgeHpfZGVjX3J1bigpIGFmdGVyCisgKiBpdCBoYXMgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwgc28gd2UgbWFrZSB0aGlzIHN0YXRpYy4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IHJldDsKKworLyoKKyAqIElucHV0IGFuZCBvdXRwdXQgYnVmZmVycy4gVGhlIGlucHV0IGJ1ZmZlciBpcyB1c2VkIGFzIGEgdGVtcG9yYXJ5IHNhZmUKKyAqIHBsYWNlIGZvciB0aGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgdXNlcnNwYWNlLgorICovCitzdGF0aWMgdWludDhfdCBidWZmZXJfaW5bMTAyNF07CitzdGF0aWMgdWludDhfdCBidWZmZXJfb3V0WzEwMjRdOworCisvKgorICogU3RydWN0dXJlIHRvIHBhc3MgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0byB0aGUgWFogZGVjb2Rlci4KKyAqIEEgZmV3IG9mIHRoZSBmaWVsZHMgYXJlIG5ldmVyIG1vZGlmaWVkIHNvIHdlIGluaXRpYWxpemUgdGhlbSBoZXJlLgorICovCitzdGF0aWMgc3RydWN0IHh6X2J1ZiBidWZmZXJzID0geworCS5pbiA9IGJ1ZmZlcl9pbiwKKwkub3V0ID0gYnVmZmVyX291dCwKKwkub3V0X3NpemUgPSBzaXplb2YoYnVmZmVyX291dCkKK307CisKKy8qCisgKiBDUkMzMiBvZiB1bmNvbXByZXNzZWQgZGF0YS4gVGhpcyBpcyB1c2VkIHRvIGdpdmUgdGhlIHVzZXIgYSBzaW1wbGUgd2F5CisgKiB0byBjaGVjayB0aGF0IHRoZSBkZWNvZGVyIHByb2R1Y2VzIGNvcnJlY3Qgb3V0cHV0LgorICovCitzdGF0aWMgdWludDMyX3QgY3JjOworCitzdGF0aWMgaW50IHh6X2RlY190ZXN0X29wZW4oc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlpZiAoZGV2aWNlX2lzX29wZW4pCisJCXJldHVybiAtRUJVU1k7CisKKwlkZXZpY2VfaXNfb3BlbiA9IHRydWU7CisKKwl4el9kZWNfcmVzZXQoc3RhdGUpOworCXJldCA9IFhaX09LOworCWNyYyA9IDB4RkZGRkZGRkY7CisKKwlidWZmZXJzLmluX3BvcyA9IDA7CisJYnVmZmVycy5pbl9zaXplID0gMDsKKwlidWZmZXJzLm91dF9wb3MgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBvcGVuZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHh6X2RlY190ZXN0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKK3sKKwlkZXZpY2VfaXNfb3BlbiA9IGZhbHNlOworCisJaWYgKHJldCA9PSBYWl9PSykKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBpbnB1dCB3YXMgdHJ1bmNhdGVkXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogY2xvc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSB0aGUgZGF0YSBnaXZlbiB0byB1cyBmcm9tIHRoZSB1c2Vyc3BhY2UuIENSQzMyIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAqIGRhdGEgaXMgY2FsY3VsYXRlZCBhbmQgaXMgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIHN1Y2Nlc3NmdWwgZGVjb2RpbmcuIFRoZQorICogdW5jb21wcmVzc2VkIGRhdGEgaXNuJ3Qgc3RvcmVkIGFueXdoZXJlIGZvciBmdXJ0aGVyIHVzZS4KKyAqCisgKiBUaGUgLnh6IGZpbGUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIFN0cmVhbSBhbmQgbm8gU3RyZWFtIFBhZGRpbmcuIFRoZSBkYXRhCisgKiBhZnRlciB0aGUgZmlyc3QgU3RyZWFtIGlzIGNvbnNpZGVyZWQgdG8gYmUgZ2FyYmFnZS4KKyAqLworc3RhdGljIHNzaXplX3QgeHpfZGVjX3Rlc3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlzaXplX3QgcmVtYWluaW5nOworCisJaWYgKHJldCAhPSBYWl9PSykgeworCQlpZiAoc2l6ZSA+IDApCisJCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6ICV6dSBieXRlcyBvZiAiCisJCQkJCSJnYXJiYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGVcbiIsCisJCQkJCXNpemUpOworCisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogZGVjb2RpbmcgJXp1IGJ5dGVzIG9mIGlucHV0XG4iLAorCQkJc2l6ZSk7CisKKwlyZW1haW5pbmcgPSBzaXplOworCXdoaWxlICgocmVtYWluaW5nID4gMCB8fCBidWZmZXJzLm91dF9wb3MgPT0gYnVmZmVycy5vdXRfc2l6ZSkKKwkJCSYmIHJldCA9PSBYWl9PSykgeworCQlpZiAoYnVmZmVycy5pbl9wb3MgPT0gYnVmZmVycy5pbl9zaXplKSB7CisJCQlidWZmZXJzLmluX3BvcyA9IDA7CisJCQlidWZmZXJzLmluX3NpemUgPSBtaW4ocmVtYWluaW5nLCBzaXplb2YoYnVmZmVyX2luKSk7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyX2luLCBidWYsIGJ1ZmZlcnMuaW5fc2l6ZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWJ1ZiArPSBidWZmZXJzLmluX3NpemU7CisJCQlyZW1haW5pbmcgLT0gYnVmZmVycy5pbl9zaXplOworCQl9CisKKwkJYnVmZmVycy5vdXRfcG9zID0gMDsKKwkJcmV0ID0geHpfZGVjX3J1bihzdGF0ZSwgJmJ1ZmZlcnMpOworCQljcmMgPSBjcmMzMihjcmMsIGJ1ZmZlcl9vdXQsIGJ1ZmZlcnMub3V0X3Bvcyk7CisJfQorCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIFhaX09LOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX09LXG4iKTsKKwkJcmV0dXJuIHNpemU7CisKKwljYXNlIFhaX1NUUkVBTV9FTkQ6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfU1RSRUFNX0VORCwgIgorCQkJCSJDUkMzMiA9IDB4JTA4WFxuIiwgfmNyYyk7CisJCXJldHVybiBzaXplIC0gcmVtYWluaW5nIC0gKGJ1ZmZlcnMuaW5fc2l6ZSAtIGJ1ZmZlcnMuaW5fcG9zKTsKKworCWNhc2UgWFpfTUVNTElNSVRfRVJST1I6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfTUVNTElNSVRfRVJST1JcbiIpOworCQlicmVhazsKKworCWNhc2UgWFpfRk9STUFUX0VSUk9SOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX0ZPUk1BVF9FUlJPUlxuIik7CisJCWJyZWFrOworCisJY2FzZSBYWl9PUFRJT05TX0VSUk9SOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX09QVElPTlNfRVJST1JcbiIpOworCQlicmVhazsKKworCWNhc2UgWFpfREFUQV9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9EQVRBX0VSUk9SXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0JVRl9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9CVUZfRVJST1JcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogQnVnIGRldGVjdGVkIVxuIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlPOworfQorCisvKiBBbGxvY2F0ZSB0aGUgWFogZGVjb2RlciBzdGF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGNoYXJhY3RlciBkZXZpY2UuICovCitzdGF0aWMgaW50IF9faW5pdCB4el9kZWNfdGVzdF9pbml0KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsZW9wcyA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vcGVuID0gJnh6X2RlY190ZXN0X29wZW4sCisJCS5yZWxlYXNlID0gJnh6X2RlY190ZXN0X3JlbGVhc2UsCisJCS53cml0ZSA9ICZ4el9kZWNfdGVzdF93cml0ZQorCX07CisKKwlzdGF0ZSA9IHh6X2RlY19pbml0KFhaX1BSRUFMTE9DLCBESUNUX01BWCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2aWNlX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIERFVklDRV9OQU1FLCAmZmlsZW9wcyk7CisJaWYgKGRldmljZV9tYWpvciA8IDApIHsKKwkJeHpfZGVjX2VuZChzdGF0ZSk7CisJCXJldHVybiBkZXZpY2VfbWFqb3I7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBtb2R1bGUgbG9hZGVkXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IENyZWF0ZSBhIGRldmljZSBub2RlIHdpdGggIgorCQkJIidta25vZCAiIERFVklDRV9OQU1FICIgYyAlZCAwJyBhbmQgd3JpdGUgLnh6IGZpbGVzICIKKwkJCSJ0byBpdC5cbiIsIGRldmljZV9tYWpvcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4el9kZWNfdGVzdF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYoZGV2aWNlX21ham9yLCBERVZJQ0VfTkFNRSk7CisJeHpfZGVjX2VuZChzdGF0ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBtb2R1bGUgdW5sb2FkZWRcbiIpOworfQorCittb2R1bGVfaW5pdCh4el9kZWNfdGVzdF9pbml0KTsKK21vZHVsZV9leGl0KHh6X2RlY190ZXN0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhaIGRlY29tcHJlc3NvciB0ZXN0ZXIiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9BVVRIT1IoIkxhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPiIpOworCisvKgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBidXQgaW4gTGludXggaXQncyBzaW1wbGVzdCB0byBqdXN0CisgKiBzYXkgaXQncyBHUEwgYW5kIGNvbnNpZGVyIHRoZSBhdXRob3JzIGFzIHRoZSBjb3B5cmlnaHQgaG9sZGVycy4KKyAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL3h6L3h6X2x6bWEyLmggYi9saWIveHoveHpfbHptYTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFkNjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3h6L3h6X2x6bWEyLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBMWk1BMiBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2lmbmRlZiBYWl9MWk1BMl9ICisjZGVmaW5lIFhaX0xaTUEyX0gKKworLyogUmFuZ2UgY29kZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFJDX1NISUZUX0JJVFMgOAorI2RlZmluZSBSQ19UT1BfQklUUyAyNAorI2RlZmluZSBSQ19UT1BfVkFMVUUgKDEgPDwgUkNfVE9QX0JJVFMpCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTIDExCisjZGVmaW5lIFJDX0JJVF9NT0RFTF9UT1RBTCAoMSA8PCBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUykKKyNkZWZpbmUgUkNfTU9WRV9CSVRTIDUKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHBvc2l0aW9uIHN0YXRlcy4gQSBwb3NpdGlvbiBzdGF0ZSBpcyB0aGUgbG93ZXN0IHBiCisgKiBudW1iZXIgb2YgYml0cyBvZiB0aGUgY3VycmVudCB1bmNvbXByZXNzZWQgb2Zmc2V0LiBJbiBzb21lIHBsYWNlcyB0aGVyZQorICogYXJlIGRpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgZm9yIGRpZmZlcmVudCBwb3NpdGlvbiBzdGF0ZXMuCisgKi8KKyNkZWZpbmUgUE9TX1NUQVRFU19NQVggKDEgPDwgNCkKKworLyoKKyAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIHRyYWNrIHdoaWNoIExaTUEgc3ltYm9scyBoYXZlIG9jY3VycmVkIG1vc3QgcmVjZW50bHkKKyAqIGFuZCBpbiB3aGljaCBvcmRlci4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByZWRpY3QgdGhlIG5leHQgc3ltYm9sLgorICoKKyAqIFN5bWJvbHM6CisgKiAgLSBMaXRlcmFsOiBPbmUgOC1iaXQgYnl0ZQorICogIC0gTWF0Y2g6IFJlcGVhdCBhIGNodW5rIG9mIGRhdGEgYXQgc29tZSBkaXN0YW5jZQorICogIC0gTG9uZyByZXBlYXQ6IE11bHRpLWJ5dGUgbWF0Y2ggYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKiAgLSBTaG9ydCByZXBlYXQ6IE9uZS1ieXRlIHJlcGVhdCBhdCBhIHJlY2VudGx5IHNlZW4gZGlzdGFuY2UKKyAqCisgKiBUaGUgc3ltYm9sIG5hbWVzIGFyZSBpbiBmcm9tIFNUQVRFX29sZGVzdF9vbGRlcl9wcmV2aW91cy4gUkVQIG1lYW5zCisgKiBlaXRoZXIgc2hvcnQgb3IgbG9uZyByZXBlYXRlZCBtYXRjaCwgYW5kIE5PTkxJVCBtZWFucyBhbnkgbm9uLWxpdGVyYWwuCisgKi8KK2VudW0gbHptYV9zdGF0ZSB7CisJU1RBVEVfTElUX0xJVCwKKwlTVEFURV9NQVRDSF9MSVRfTElULAorCVNUQVRFX1JFUF9MSVRfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElULAorCVNUQVRFX1JFUF9MSVQsCisJU1RBVEVfU0hPUlRSRVBfTElULAorCVNUQVRFX0xJVF9NQVRDSCwKKwlTVEFURV9MSVRfTE9OR1JFUCwKKwlTVEFURV9MSVRfU0hPUlRSRVAsCisJU1RBVEVfTk9OTElUX01BVENILAorCVNUQVRFX05PTkxJVF9SRVAKK307CisKKy8qIFRvdGFsIG51bWJlciBvZiBzdGF0ZXMgKi8KKyNkZWZpbmUgU1RBVEVTIDEyCisKKy8qIFRoZSBsb3dlc3QgNyBzdGF0ZXMgaW5kaWNhdGUgdGhhdCB0aGUgcHJldmlvdXMgc3RhdGUgd2FzIGEgbGl0ZXJhbC4gKi8KKyNkZWZpbmUgTElUX1NUQVRFUyA3CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgbGl0ZXJhbC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsem1hX3N0YXRlX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAoKnN0YXRlIDw9IFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQpCisJCSpzdGF0ZSA9IFNUQVRFX0xJVF9MSVQ7CisJZWxzZSBpZiAoKnN0YXRlIDw9IFNUQVRFX0xJVF9TSE9SVFJFUCkKKwkJKnN0YXRlIC09IDM7CisJZWxzZQorCQkqc3RhdGUgLT0gNjsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN5bWJvbCB3YXMgYSBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsem1hX3N0YXRlX21hdGNoKGVudW0gbHptYV9zdGF0ZSAqc3RhdGUpCit7CisJKnN0YXRlID0gKnN0YXRlIDwgTElUX1NUQVRFUyA/IFNUQVRFX0xJVF9NQVRDSCA6IFNUQVRFX05PTkxJVF9NQVRDSDsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN0YXRlIHdhcyBhIGxvbmcgcmVwZWF0ZWQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9sb25nX3JlcChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfTE9OR1JFUCA6IFNUQVRFX05PTkxJVF9SRVA7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgc2hvcnQgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9zaG9ydF9yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX1NIT1JUUkVQIDogU1RBVEVfTk9OTElUX1JFUDsKK30KKworLyogVGVzdCBpZiB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIGJvb2wgbHptYV9zdGF0ZV9pc19saXRlcmFsKGVudW0gbHptYV9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUgPCBMSVRfU1RBVEVTOworfQorCisvKiBFYWNoIGxpdGVyYWwgY29kZXIgaXMgZGl2aWRlZCBpbiB0aHJlZSBzZWN0aW9uczoKKyAqICAgLSAweDAwMS0weDBGRjogV2l0aG91dCBtYXRjaCBieXRlCisgKiAgIC0gMHgxMDEtMHgxRkY6IFdpdGggbWF0Y2ggYnl0ZTsgbWF0Y2ggYml0IGlzIDAKKyAqICAgLSAweDIwMS0weDJGRjogV2l0aCBtYXRjaCBieXRlOyBtYXRjaCBiaXQgaXMgMQorICoKKyAqIE1hdGNoIGJ5dGUgaXMgdXNlZCB3aGVuIHRoZSBwcmV2aW91cyBMWk1BIHN5bWJvbCB3YXMgc29tZXRoaW5nIGVsc2UgdGhhbgorICogYSBsaXRlcmFsICh0aGF0IGlzLCBpdCB3YXMgc29tZSBraW5kIG9mIG1hdGNoKS4KKyAqLworI2RlZmluZSBMSVRFUkFMX0NPREVSX1NJWkUgMHgzMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgbGl0ZXJhbCBjb2RlcnMgKi8KKyNkZWZpbmUgTElURVJBTF9DT0RFUlNfTUFYICgxIDw8IDQpCisKKy8qIE1pbmltdW0gbGVuZ3RoIG9mIGEgbWF0Y2ggaXMgdHdvIGJ5dGVzLiAqLworI2RlZmluZSBNQVRDSF9MRU5fTUlOIDIKKworLyogTWF0Y2ggbGVuZ3RoIGlzIGVuY29kZWQgd2l0aCA0LCA1LCBvciAxMCBiaXRzLgorICoKKyAqIExlbmd0aCAgIEJpdHMKKyAqICAyLTkgICAgICA0ID0gQ2hvaWNlPTAgKyAzIGJpdHMKKyAqIDEwLTE3ICAgICA1ID0gQ2hvaWNlPTEgKyBDaG9pY2UyPTAgKyAzIGJpdHMKKyAqIDE4LTI3MyAgIDEwID0gQ2hvaWNlPTEgKyBDaG9pY2UyPTEgKyA4IGJpdHMKKyAqLworI2RlZmluZSBMRU5fTE9XX0JJVFMgMworI2RlZmluZSBMRU5fTE9XX1NZTUJPTFMgKDEgPDwgTEVOX0xPV19CSVRTKQorI2RlZmluZSBMRU5fTUlEX0JJVFMgMworI2RlZmluZSBMRU5fTUlEX1NZTUJPTFMgKDEgPDwgTEVOX01JRF9CSVRTKQorI2RlZmluZSBMRU5fSElHSF9CSVRTIDgKKyNkZWZpbmUgTEVOX0hJR0hfU1lNQk9MUyAoMSA8PCBMRU5fSElHSF9CSVRTKQorI2RlZmluZSBMRU5fU1lNQk9MUyAoTEVOX0xPV19TWU1CT0xTICsgTEVOX01JRF9TWU1CT0xTICsgTEVOX0hJR0hfU1lNQk9MUykKKworLyoKKyAqIE1heGltdW0gbGVuZ3RoIG9mIGEgbWF0Y2ggaXMgMjczIHdoaWNoIGlzIGEgcmVzdWx0IG9mIHRoZSBlbmNvZGluZworICogZGVzY3JpYmVkIGFib3ZlLgorICovCisjZGVmaW5lIE1BVENIX0xFTl9NQVggKE1BVENIX0xFTl9NSU4gKyBMRU5fU1lNQk9MUyAtIDEpCisKKy8qCisgKiBEaWZmZXJlbnQgc2V0cyBvZiBwcm9iYWJpbGl0aWVzIGFyZSB1c2VkIGZvciBtYXRjaCBkaXN0YW5jZXMgdGhhdCBoYXZlCisgKiB2ZXJ5IHNob3J0IG1hdGNoIGxlbmd0aDogTGVuZ3RocyBvZiAyLCAzLCBhbmQgNCBieXRlcyBoYXZlIGEgc2VwYXJhdGUKKyAqIHNldCBvZiBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIGxlbmd0aC4gVGhlIG1hdGNoZXMgd2l0aCBsb25nZXIgbGVuZ3RoCisgKiB1c2UgYSBzaGFyZWQgc2V0IG9mIHByb2JhYmlsaXRpZXMuCisgKi8KKyNkZWZpbmUgRElTVF9TVEFURVMgNAorCisvKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgYXBwcm9wcmlhdGUgcHJvYmFiaWxpdHkgYXJyYXkgZm9yIGRlY29kaW5nCisgKiB0aGUgZGlzdGFuY2Ugc2xvdC4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBsem1hX2dldF9kaXN0X3N0YXRlKHVpbnQzMl90IGxlbikKK3sKKwlyZXR1cm4gbGVuIDwgRElTVF9TVEFURVMgKyBNQVRDSF9MRU5fTUlOCisJCQk/IGxlbiAtIE1BVENIX0xFTl9NSU4gOiBESVNUX1NUQVRFUyAtIDE7Cit9CisKKy8qCisgKiBUaGUgaGlnaGVzdCB0d28gYml0cyBvZiBhIDMyLWJpdCBtYXRjaCBkaXN0YW5jZSBhcmUgZW5jb2RlZCB1c2luZyBzaXggYml0cy4KKyAqIFRoaXMgc2l4LWJpdCB2YWx1ZSBpcyBjYWxsZWQgYSBkaXN0YW5jZSBzbG90LiBUaGlzIHdheSBlbmNvZGluZyBhIDMyLWJpdAorICogdmFsdWUgdGFrZXMgNi0zNiBiaXRzLCBsYXJnZXIgdmFsdWVzIHRha2luZyBtb3JlIGJpdHMuCisgKi8KKyNkZWZpbmUgRElTVF9TTE9UX0JJVFMgNgorI2RlZmluZSBESVNUX1NMT1RTICgxIDw8IERJU1RfU0xPVF9CSVRTKQorCisvKiBNYXRjaCBkaXN0YW5jZXMgdXAgdG8gMTI3IGFyZSBmdWxseSBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuIFNpbmNlCisgKiB0aGUgaGlnaGVzdCB0d28gYml0cyAoZGlzdGFuY2Ugc2xvdCkgYXJlIGFsd2F5cyBlbmNvZGVkIHVzaW5nIHNpeCBiaXRzLAorICogdGhlIGRpc3RhbmNlcyAwLTMgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBiaXRzIHRvIGVuY29kZSwgc2luY2UgdGhlCisgKiBkaXN0YW5jZSBzbG90IGl0c2VsZiBpcyB0aGUgc2FtZSBhcyB0aGUgYWN0dWFsIGRpc3RhbmNlLiBESVNUX01PREVMX1NUQVJUCisgKiBpbmRpY2F0ZXMgdGhlIGZpcnN0IGRpc3RhbmNlIHNsb3Qgd2hlcmUgYXQgbGVhc3Qgb25lIGFkZGl0aW9uYWwgYml0IGlzCisgKiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgRElTVF9NT0RFTF9TVEFSVCA0CisKKy8qCisgKiBNYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNyBhcmUgZW5jb2RlZCBpbiB0aHJlZSBwaWVjZXM6CisgKiAgIC0gZGlzdGFuY2Ugc2xvdDogdGhlIGhpZ2hlc3QgdHdvIGJpdHMKKyAqICAgLSBkaXJlY3QgYml0czogMi0yNiBiaXRzIGJlbG93IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gYWxpZ25tZW50IGJpdHM6IGZvdXIgbG93ZXN0IGJpdHMKKyAqCisgKiBEaXJlY3QgYml0cyBkb24ndCB1c2UgYW55IHByb2JhYmlsaXRpZXMuCisgKgorICogVGhlIGRpc3RhbmNlIHNsb3QgdmFsdWUgb2YgMTQgaXMgZm9yIGRpc3RhbmNlcyAxMjgtMTkxLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfRU5EIDE0CisKKy8qIERpc3RhbmNlIHNsb3RzIHRoYXQgaW5kaWNhdGUgYSBkaXN0YW5jZSA8PSAxMjcuICovCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTX0JJVFMgKERJU1RfTU9ERUxfRU5EIC8gMikKKyNkZWZpbmUgRlVMTF9ESVNUQU5DRVMgKDEgPDwgRlVMTF9ESVNUQU5DRVNfQklUUykKKworLyoKKyAqIEZvciBtYXRjaCBkaXN0YW5jZXMgZ3JlYXRlciB0aGFuIDEyNywgb25seSB0aGUgaGlnaGVzdCB0d28gYml0cyBhbmQgdGhlCisgKiBsb3dlc3QgZm91ciBiaXRzIChhbGlnbm1lbnQpIGlzIGVuY29kZWQgdXNpbmcgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBBTElHTl9CSVRTIDQKKyNkZWZpbmUgQUxJR05fU0laRSAoMSA8PCBBTElHTl9CSVRTKQorI2RlZmluZSBBTElHTl9NQVNLIChBTElHTl9TSVpFIC0gMSkKKworLyogVG90YWwgbnVtYmVyIG9mIGFsbCBwcm9iYWJpbGl0eSB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgUFJPQlNfVE9UQUwgKDE4NDYgKyBMSVRFUkFMX0NPREVSU19NQVggKiBMSVRFUkFMX0NPREVSX1NJWkUpCisKKy8qCisgKiBMWk1BIHJlbWVtYmVycyB0aGUgZm91ciBtb3N0IHJlY2VudCBtYXRjaCBkaXN0YW5jZXMuIFJldXNpbmcgdGhlc2UKKyAqIGRpc3RhbmNlcyB0ZW5kcyB0byB0YWtlIGxlc3Mgc3BhY2UgdGhhbiByZS1lbmNvZGluZyB0aGUgYWN0dWFsCisgKiBkaXN0YW5jZSB2YWx1ZS4KKyAqLworI2RlZmluZSBSRVBTIDQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIveHoveHpfcHJpdmF0ZS5oIGIvbGliL3h6L3h6X3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU2MzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3h6L3h6X3ByaXZhdGUuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfUFJJVkFURV9ICisjZGVmaW5lIFhaX1BSSVZBVEVfSAorCisjaWZkZWYgX19LRVJORUxfXworIwlpbmNsdWRlIDxsaW51eC94ei5oPgorIwlpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjCWluY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKwkvKiBYWl9QUkVCT09UIG1heSBiZSBkZWZpbmVkIG9ubHkgdmlhIGRlY29tcHJlc3NfdW54ei5jLiAqLworIwlpZm5kZWYgWFpfUFJFQk9PVAorIwkJaW5jbHVkZSA8bGludXgvc2xhYi5oPgorIwkJaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorIwkJaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjCQlpZmRlZiBDT05GSUdfWFpfREVDX1g4NgorIwkJCWRlZmluZSBYWl9ERUNfWDg2CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19QT1dFUlBDCisjCQkJZGVmaW5lIFhaX0RFQ19QT1dFUlBDCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19JQTY0CisjCQkJZGVmaW5lIFhaX0RFQ19JQTY0CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19BUk0KKyMJCQlkZWZpbmUgWFpfREVDX0FSTQorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfQVJNVEhVTUIKKyMJCQlkZWZpbmUgWFpfREVDX0FSTVRIVU1CCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19TUEFSQworIwkJCWRlZmluZSBYWl9ERUNfU1BBUkMKKyMJCWVuZGlmCisjCQlkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorIwkJZGVmaW5lIG1lbXplcm8oYnVmLCBzaXplKSBtZW1zZXQoYnVmLCAwLCBzaXplKQorIwllbmRpZgorIwlkZWZpbmUgZ2V0X2xlMzIocCkgbGUzMl90b19jcHVwKChjb25zdCB1aW50MzJfdCAqKShwKSkKKyNlbHNlCisJLyoKKwkgKiBGb3IgdXNlcnNwYWNlIGJ1aWxkcywgdXNlIGEgc2VwYXJhdGUgaGVhZGVyIHRvIGRlZmluZSB0aGUgcmVxdWlyZWQKKwkgKiBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gYWRhcHQgdGhlIGNvZGUgaW50bworCSAqIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGF2b2lkcyBjbHV0dGVyIGluIHRoZSBMaW51eCBrZXJuZWwgdHJlZS4KKwkgKi8KKyMJaW5jbHVkZSAieHpfY29uZmlnLmgiCisjZW5kaWYKKworLyogSWYgbm8gc3BlY2lmaWMgZGVjb2RpbmcgbW9kZSBpcyByZXF1ZXN0ZWQsIGVuYWJsZSBzdXBwb3J0IGZvciBhbGwgbW9kZXMuICovCisjaWYgIWRlZmluZWQoWFpfREVDX1NJTkdMRSkgJiYgIWRlZmluZWQoWFpfREVDX1BSRUFMTE9DKSBcCisJCSYmICFkZWZpbmVkKFhaX0RFQ19EWU5BTExPQykKKyMJZGVmaW5lIFhaX0RFQ19TSU5HTEUKKyMJZGVmaW5lIFhaX0RFQ19QUkVBTExPQworIwlkZWZpbmUgWFpfREVDX0RZTkFMTE9DCisjZW5kaWYKKworLyoKKyAqIFRoZSBERUNfSVNfZm9vKG1vZGUpIG1hY3JvcyBhcmUgdXNlZCBpbiAiaWYiIHN0YXRlbWVudHMuIElmIG9ubHkgc29tZQorICogb2YgdGhlIHN1cHBvcnRlZCBtb2RlcyBhcmUgZW5hYmxlZCwgdGhlc2UgbWFjcm9zIHdpbGwgZXZhbHVhdGUgdG8gdHJ1ZSBvcgorICogZmFsc2UgYXQgY29tcGlsZSB0aW1lIGFuZCB0aHVzIGFsbG93IHRoZSBjb21waWxlciB0byBvbWl0IHVubmVlZGVkIGNvZGUuCisgKi8KKyNpZmRlZiBYWl9ERUNfU0lOR0xFCisjCWRlZmluZSBERUNfSVNfU0lOR0xFKG1vZGUpICgobW9kZSkgPT0gWFpfU0lOR0xFKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19TSU5HTEUobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfUFJFQUxMT0MKKyMJZGVmaW5lIERFQ19JU19QUkVBTExPQyhtb2RlKSAoKG1vZGUpID09IFhaX1BSRUFMTE9DKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19QUkVBTExPQyhtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19EWU5BTExPQworIwlkZWZpbmUgREVDX0lTX0RZTkFMTE9DKG1vZGUpICgobW9kZSkgPT0gWFpfRFlOQUxMT0MpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX0RZTkFMTE9DKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWFpfREVDX1NJTkdMRSkKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAodHJ1ZSkKKyNlbGlmIGRlZmluZWQoWFpfREVDX1BSRUFMTE9DKSB8fCBkZWZpbmVkKFhaX0RFQ19EWU5BTExPQykKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAoKG1vZGUpICE9IFhaX1NJTkdMRSkKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfTVVMVEkobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKy8qCisgKiBJZiBhbnkgb2YgdGhlIEJDSiBmaWx0ZXIgZGVjb2RlcnMgYXJlIHdhbnRlZCwgZGVmaW5lIFhaX0RFQ19CQ0ouCisgKiBYWl9ERUNfQkNKIGlzIHVzZWQgdG8gZW5hYmxlIGdlbmVyaWMgc3VwcG9ydCBmb3IgQkNKIGRlY29kZXJzLgorICovCisjaWZuZGVmIFhaX0RFQ19CQ0oKKyMJaWYgZGVmaW5lZChYWl9ERUNfWDg2KSB8fCBkZWZpbmVkKFhaX0RFQ19QT1dFUlBDKSBcCisJCQl8fCBkZWZpbmVkKFhaX0RFQ19JQTY0KSB8fCBkZWZpbmVkKFhaX0RFQ19BUk0pIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX0FSTSkgfHwgZGVmaW5lZChYWl9ERUNfQVJNVEhVTUIpIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX1NQQVJDKQorIwkJZGVmaW5lIFhaX0RFQ19CQ0oKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBMWk1BMiBkZWNvZGVyLiB4el9kZWNfbHptYTJfcmVzZXQoKSBtdXN0IGJlIHVzZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHh6X2RlY19sem1hMl9ydW4oKS4KKyAqLworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfbHptYTIgKnh6X2RlY19sem1hMl9jcmVhdGUoZW51bSB4el9tb2RlIG1vZGUsCisJCQkJCQkgICB1aW50MzJfdCBkaWN0X21heCk7CisKKy8qCisgKiBEZWNvZGUgdGhlIExaTUEyIHByb3BlcnRpZXMgKG9uZSBieXRlKSBhbmQgcmVzZXQgdGhlIGRlY29kZXIuIFJldHVybgorICogWFpfT0sgb24gc3VjY2VzcywgWFpfTUVNTElNSVRfRVJST1IgaWYgdGhlIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IGlzIG5vdAorICogYmlnIGVub3VnaCwgYW5kIFhaX09QVElPTlNfRVJST1IgaWYgcHJvcHMgaW5kaWNhdGVzIHNvbWV0aGluZyB0aGF0IHRoaXMKKyAqIGRlY29kZXIgZG9lc24ndCBzdXBwb3J0LgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3Jlc2V0KHN0cnVjdCB4el9kZWNfbHptYTIgKnMsCisJCQkJCSB1aW50OF90IHByb3BzKTsKKworLyogRGVjb2RlIHJhdyBMWk1BMiBzdHJlYW0gZnJvbSBiLT5pbiB0byBiLT5vdXQuICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3J1bihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLAorCQkJCSAgICAgICBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIExaTUEyIGRlY29kZXIuICovCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpOworCisjaWZkZWYgWFpfREVDX0JDSgorLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgQkNKIGRlY29kZXJzLiB4el9kZWNfYmNqX3Jlc2V0KCkgbXVzdCBiZSB1c2VkIGJlZm9yZQorICogY2FsbGluZyB4el9kZWNfYmNqX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKnh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpOworCisvKgorICogRGVjb2RlIHRoZSBGaWx0ZXIgSUQgb2YgYSBCQ0ogZmlsdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAqIHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldHMsIHNvIG5vIGRlY29kaW5nIG9mIEZpbHRlciBQcm9wZXJ0aWVzCisgKiBpcyBuZWVkZWQuIFJldHVybnMgWFpfT0sgaWYgdGhlIGdpdmVuIEZpbHRlciBJRCBpcyBzdXBwb3J0ZWQuCisgKiBPdGhlcndpc2UgWFpfT1BUSU9OU19FUlJPUiBpcyByZXR1cm5lZC4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcmVzZXQoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpOworCisvKgorICogRGVjb2RlIHJhdyBCQ0ogKyBMWk1BMiBzdHJlYW0uIFRoaXMgbXVzdCBiZSB1c2VkIG9ubHkgaWYgdGhlcmUgYWN0dWFsbHkgaXMKKyAqIGEgQkNKIGZpbHRlciBpbiB0aGUgY2hhaW4uIElmIHRoZSBjaGFpbiBoYXMgb25seSBMWk1BMiwgeHpfZGVjX2x6bWEyX3J1bigpCisgKiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcnVuKHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQkJCSAgICAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsCisJCQkJICAgICBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIEJDSiBmaWx0ZXJzLiAqLworI2RlZmluZSB4el9kZWNfYmNqX2VuZChzKSBrZnJlZShzKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3h6L3h6X3N0cmVhbS5oIGIvbGliL3h6L3h6X3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2I1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveHoveHpfc3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBoYW5kbGluZyB0aGUgLnh6IGZpbGUgZm9ybWF0CisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfU1RSRUFNX0gKKyNkZWZpbmUgWFpfU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIVhaX0lOVEVSTkFMX0NSQzMyCisjCWluY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjCXVuZGVmIGNyYzMyCisjCWRlZmluZSB4el9jcmMzMihidWYsIHNpemUsIGNyYykgXAorCQkofmNyYzMyX2xlKH4odWludDMyX3QpKGNyYyksIGJ1Ziwgc2l6ZSkpCisjZW5kaWYKKworLyoKKyAqIFNlZSB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQKKyAqIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRhaW5lciBmb3JtYXQuCisgKi8KKworI2RlZmluZSBTVFJFQU1fSEVBREVSX1NJWkUgMTIKKworI2RlZmluZSBIRUFERVJfTUFHSUMgIlwzNzU3elhaIgorI2RlZmluZSBIRUFERVJfTUFHSUNfU0laRSA2CisKKyNkZWZpbmUgRk9PVEVSX01BR0lDICJZWiIKKyNkZWZpbmUgRk9PVEVSX01BR0lDX1NJWkUgMgorCisvKgorICogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgY2FuIGhvbGQgYSA2My1iaXQgdW5zaWduZWQgaW50ZWdlciBvciBhIHNwZWNpYWwKKyAqIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAqCisgKiBFeHBlcmltZW50YWw6IHZsaV90eXBlIGNhbiBiZSBkZWZpbmVkIHRvIHVpbnQzMl90IHRvIHNhdmUgYSBmZXcgYnl0ZXMKKyAqIGluIGNvZGUgc2l6ZSAobm8gZWZmZWN0IG9uIHNwZWVkKS4gRG9pbmcgc28gbGltaXRzIHRoZSB1bmNvbXByZXNzZWQgYW5kCisgKiBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgdG8gbGVzcyB0aGFuIDI1NiBNaUIgYW5kIG1heSBhbHNvIHdlYWtlbgorICogZXJyb3IgZGV0ZWN0aW9uIHNsaWdodGx5LgorICovCit0eXBlZGVmIHVpbnQ2NF90IHZsaV90eXBlOworCisjZGVmaW5lIFZMSV9NQVggKCh2bGlfdHlwZSktMSAvIDIpCisjZGVmaW5lIFZMSV9VTktOT1dOICgodmxpX3R5cGUpLTEpCisKKy8qIE1heGltdW0gZW5jb2RlZCBzaXplIG9mIGEgVkxJICovCisjZGVmaW5lIFZMSV9CWVRFU19NQVggKHNpemVvZih2bGlfdHlwZSkgKiA4IC8gNykKKworLyogSW50ZWdyaXR5IENoZWNrIHR5cGVzICovCitlbnVtIHh6X2NoZWNrIHsKKwlYWl9DSEVDS19OT05FID0gMCwKKwlYWl9DSEVDS19DUkMzMiA9IDEsCisJWFpfQ0hFQ0tfQ1JDNjQgPSA0LAorCVhaX0NIRUNLX1NIQTI1NiA9IDEwCit9OworCisvKiBNYXhpbXVtIHBvc3NpYmxlIENoZWNrIElEICovCisjZGVmaW5lIFhaX0NIRUNLX01BWCAxNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21tL0tjb25maWcgYi9tbS9LY29uZmlnCmluZGV4IGMyYzhhNGEuLjNhZDQ4M2IgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtMzAyLDYgKzMwMiw0NCBAQAogCiAJICBTZWUgRG9jdW1lbnRhdGlvbi9ub21tdS1tbWFwLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorY29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFCisJYm9vbCAiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4NiAmJiBNTVUKKwlzZWxlY3QgQ09NUEFDVElPTgorCWhlbHAKKwkgIFRyYW5zcGFyZW50IEh1Z2VwYWdlcyBhbGxvd3MgdGhlIGtlcm5lbCB0byB1c2UgaHVnZSBwYWdlcyBhbmQKKwkgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS4KKwkgIFRoaXMgZmVhdHVyZSBjYW4gaW1wcm92ZSBjb21wdXRpbmcgcGVyZm9ybWFuY2UgdG8gY2VydGFpbgorCSAgYXBwbGljYXRpb25zIGJ5IHNwZWVkaW5nIHVwIHBhZ2UgZmF1bHRzIGR1cmluZyBtZW1vcnkKKwkgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmcKKwkgIHVwIHRoZSBwYWdldGFibGUgd2Fsa2luZy4KKworCSAgSWYgbWVtb3J5IGNvbnN0cmFpbmVkIG9uIGVtYmVkZGVkLCB5b3UgbWF5IHdhbnQgdG8gc2F5IE4uCisKK2Nob2ljZQorCXByb21wdCAiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCBzeXNmcyBkZWZhdWx0cyIKKwlkZXBlbmRzIG9uIFRSQU5TUEFSRU5UX0hVR0VQQUdFCisJZGVmYXVsdCBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVMKKwloZWxwCisJICBTZWxlY3RzIHRoZSBzeXNmcyBkZWZhdWx0cyBmb3IgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydC4KKworCWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVMKKwkJYm9vbCAiYWx3YXlzIgorCWhlbHAKKwkgIEVuYWJsaW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlIGFsd2F5cywgY2FuIGluY3JlYXNlIHRoZQorCSAgbWVtb3J5IGZvb3RwcmludCBvZiBhcHBsaWNhdGlvbnMgd2l0aG91dCBhIGd1YXJhbnRlZWQKKwkgIGJlbmVmaXQgYnV0IGl0IHdpbGwgd29yayBhdXRvbWF0aWNhbGx5IGZvciBhbGwgYXBwbGljYXRpb25zLgorCisJY29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0UKKwkJYm9vbCAibWFkdmlzZSIKKwloZWxwCisJICBFbmFibGluZyBUcmFuc3BhcmVudCBIdWdlcGFnZSBtYWR2aXNlLCB3aWxsIG9ubHkgcHJvdmlkZSBhCisJICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBiZW5lZml0IHRvIHRoZSBhcHBsaWNhdGlvbnMgdXNpbmcKKwkgIG1hZHZpc2UoTUFEVl9IVUdFUEFHRSkgYnV0IGl0IHdvbid0IHJpc2sgdG8gaW5jcmVhc2UgdGhlCisJICBtZW1vcnkgZm9vdHByaW50IG9mIGFwcGxpY2F0aW9ucyB3aXRob3V0IGEgZ3VhcmFudGVlZAorCSAgYmVuZWZpdC4KK2VuZGNob2ljZQorCiAjCiAjIFVQIGFuZCBub21tdSBhcmNocyB1c2Uga20gYmFzZWQgcGVyY3B1IGFsbG9jYXRvcgogIwpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCBmNzNmNzVhLi4yYjFiNTc1IDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtNSw3ICs1LDcgQEAKIG1tdS15CQkJOj0gbm9tbXUubwogbW11LSQoQ09ORklHX01NVSkJOj0gZnJlbWFwLm8gaGlnaG1lbS5vIG1hZHZpc2UubyBtZW1vcnkubyBtaW5jb3JlLm8gXAogCQkJICAgbWxvY2subyBtbWFwLm8gbXByb3RlY3QubyBtcmVtYXAubyBtc3luYy5vIHJtYXAubyBcCi0JCQkgICB2bWFsbG9jLm8gcGFnZXdhbGsubworCQkJICAgdm1hbGxvYy5vIHBhZ2V3YWxrLm8gcGd0YWJsZS1nZW5lcmljLm8KIAogb2JqLXkJCQk6PSBib290bWVtLm8gZmlsZW1hcC5vIG1lbXBvb2wubyBvb21fa2lsbC5vIGZhZHZpc2UubyBcCiAJCQkgICBtYWNjZXNzLm8gcGFnZV9hbGxvYy5vIHBhZ2Utd3JpdGViYWNrLm8gXApAQCAtMzcsNiArMzcsNyBAQAogb2JqLSQoQ09ORklHX0ZTX1hJUCkgKz0gZmlsZW1hcF94aXAubwogb2JqLSQoQ09ORklHX01JR1JBVElPTikgKz0gbWlncmF0ZS5vCiBvYmotJChDT05GSUdfUVVJQ0tMSVNUKSArPSBxdWlja2xpc3Qubworb2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vCiBvYmotJChDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUikgKz0gbWVtY29udHJvbC5vIHBhZ2VfY2dyb3VwLm8KIG9iai0kKENPTkZJR19NRU1PUllfRkFJTFVSRSkgKz0gbWVtb3J5LWZhaWx1cmUubwogb2JqLSQoQ09ORklHX0hXUE9JU09OX0lOSkVDVCkgKz0gaHdwb2lzb24taW5qZWN0Lm8KZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uYwppbmRleCAxYTg4OTRlLi42ZDU5MmEwIDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKKysrIGIvbW0vY29tcGFjdGlvbi5jCkBAIC0xNiw2ICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvY29tcGFjdGlvbi5oPgorCiAvKgogICogY29tcGFjdF9jb250cm9sIGlzIHVzZWQgdG8gdHJhY2sgcGFnZXMgYmVpbmcgbWlncmF0ZWQgYW5kIHRoZSBmcmVlIHBhZ2VzCiAgKiB0aGV5IGFyZSBiZWluZyBtaWdyYXRlZCB0byBkdXJpbmcgbWVtb3J5IGNvbXBhY3Rpb24uIFRoZSBmcmVlX3BmbiBzdGFydHMKQEAgLTMwLDYgKzMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIG5yX21pZ3JhdGVwYWdlczsJLyogTnVtYmVyIG9mIHBhZ2VzIHRvIG1pZ3JhdGUgKi8KIAl1bnNpZ25lZCBsb25nIGZyZWVfcGZuOwkJLyogaXNvbGF0ZV9mcmVlcGFnZXMgc2VhcmNoIGJhc2UgKi8KIAl1bnNpZ25lZCBsb25nIG1pZ3JhdGVfcGZuOwkvKiBpc29sYXRlX21pZ3JhdGVwYWdlcyBzZWFyY2ggYmFzZSAqLworCWJvb2wgc3luYzsJCQkvKiBTeW5jaHJvbm91cyBtaWdyYXRpb24gKi8KIAogCS8qIEFjY291bnQgZm9yIGlzb2xhdGVkIGFub24gYW5kIGZpbGUgcGFnZXMgKi8KIAl1bnNpZ25lZCBsb25nIG5yX2Fub247CkBAIC0zOCw2ICs0Miw4IEBACiAJdW5zaWduZWQgaW50IG9yZGVyOwkJLyogb3JkZXIgYSBkaXJlY3QgY29tcGFjdG9yIG5lZWRzICovCiAJaW50IG1pZ3JhdGV0eXBlOwkJLyogTU9WQUJMRSwgUkVDTEFJTUFCTEUgZXRjICovCiAJc3RydWN0IHpvbmUgKnpvbmU7CisKKwlpbnQgY29tcGFjdF9tb2RlOwogfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVsZWFzZV9mcmVlcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqZnJlZWxpc3QpCkBAIC02MCw3ICs2Niw3IEBACiAJCQkJc3RydWN0IGxpc3RfaGVhZCAqZnJlZWxpc3QpCiB7CiAJdW5zaWduZWQgbG9uZyB6b25lX2VuZF9wZm4sIGVuZF9wZm47Ci0JaW50IHRvdGFsX2lzb2xhdGVkID0gMDsKKwlpbnQgbnJfc2Nhbm5lZCA9IDAsIHRvdGFsX2lzb2xhdGVkID0gMDsKIAlzdHJ1Y3QgcGFnZSAqY3Vyc29yOwogCiAJLyogR2V0IHRoZSBsYXN0IFBGTiB3ZSBzaG91bGQgc2NhbiBmb3IgZnJlZSBwYWdlcyBhdCAqLwpAQCAtODEsNiArODcsNyBAQAogCiAJCWlmICghcGZuX3ZhbGlkX3dpdGhpbihibG9ja3BmbikpCiAJCQljb250aW51ZTsKKwkJbnJfc2Nhbm5lZCsrOwogCiAJCWlmICghUGFnZUJ1ZGR5KHBhZ2UpKQogCQkJY29udGludWU7CkBAIC0xMDAsNiArMTA3LDcgQEAKIAkJfQogCX0KIAorCXRyYWNlX21tX2NvbXBhY3Rpb25faXNvbGF0ZV9mcmVlcGFnZXMobnJfc2Nhbm5lZCwgdG90YWxfaXNvbGF0ZWQpOwogCXJldHVybiB0b3RhbF9pc29sYXRlZDsKIH0KIApAQCAtMjM0LDYgKzI0Miw4IEBACiAJCQkJCXN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKQogewogCXVuc2lnbmVkIGxvbmcgbG93X3BmbiwgZW5kX3BmbjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFnZWJsb2NrX25yID0gMCwgcGFnZWJsb2NrX25yOworCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZCA9IDAsIG5yX2lzb2xhdGVkID0gMDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICptaWdyYXRlbGlzdCA9ICZjYy0+bWlncmF0ZXBhZ2VzOwogCiAJLyogRG8gbm90IHNjYW4gb3V0c2lkZSB6b25lIGJvdW5kYXJpZXMgKi8KQEAgLTI2NiwyMCArMjc2LDUxIEBACiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCQlpZiAoIXBmbl92YWxpZF93aXRoaW4obG93X3BmbikpCiAJCQljb250aW51ZTsKKwkJbnJfc2Nhbm5lZCsrOwogCiAJCS8qIEdldCB0aGUgcGFnZSBhbmQgc2tpcCBpZiBmcmVlICovCiAJCXBhZ2UgPSBwZm5fdG9fcGFnZShsb3dfcGZuKTsKIAkJaWYgKFBhZ2VCdWRkeShwYWdlKSkKIAkJCWNvbnRpbnVlOwogCisJCS8qCisJCSAqIEZvciBhc3luYyBtaWdyYXRpb24sIGFsc28gb25seSBzY2FuIGluIE1PVkFCTEUgYmxvY2tzLiBBc3luYworCQkgKiBtaWdyYXRpb24gaXMgb3B0aW1pc3RpYyB0byBzZWUgaWYgdGhlIG1pbmltdW0gYW1vdW50IG9mIHdvcmsKKwkJICogc2F0aXNmaWVzIHRoZSBhbGxvY2F0aW9uCisJCSAqLworCQlwYWdlYmxvY2tfbnIgPSBsb3dfcGZuID4+IHBhZ2VibG9ja19vcmRlcjsKKwkJaWYgKCFjYy0+c3luYyAmJiBsYXN0X3BhZ2VibG9ja19uciAhPSBwYWdlYmxvY2tfbnIgJiYKKwkJCQlnZXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UpICE9IE1JR1JBVEVfTU9WQUJMRSkgeworCQkJbG93X3BmbiArPSBwYWdlYmxvY2tfbnJfcGFnZXM7CisJCQlsb3dfcGZuID0gQUxJR04obG93X3BmbiwgcGFnZWJsb2NrX25yX3BhZ2VzKSAtIDE7CisJCQlsYXN0X3BhZ2VibG9ja19uciA9IHBhZ2VibG9ja19ucjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFQYWdlTFJVKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogUGFnZUxSVSBpcyBzZXQsIGFuZCBscnVfbG9jayBleGNsdWRlcyBpc29sYXRpb24sCisJCSAqIHNwbGl0dGluZyBhbmQgY29sbGFwc2luZyAoY29sbGFwc2luZyBoYXMgYWxyZWFkeQorCQkgKiBoYXBwZW5lZCBpZiBQYWdlTFJVIGlzIHNldCkuCisJCSAqLworCQlpZiAoUGFnZVRyYW5zSHVnZShwYWdlKSkgeworCQkJbG93X3BmbiArPSAoMSA8PCBjb21wb3VuZF9vcmRlcihwYWdlKSkgLSAxOworCQkJY29udGludWU7CisJCX0KKwogCQkvKiBUcnkgaXNvbGF0ZSB0aGUgcGFnZSAqLwogCQlpZiAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIElTT0xBVEVfQk9USCwgMCkgIT0gMCkKIAkJCWNvbnRpbnVlOwogCisJCVZNX0JVR19PTihQYWdlVHJhbnNDb21wb3VuZChwYWdlKSk7CisKIAkJLyogU3VjY2Vzc2Z1bGx5IGlzb2xhdGVkICovCiAJCWRlbF9wYWdlX2Zyb21fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgcGFnZV9scnUocGFnZSkpOwogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCBtaWdyYXRlbGlzdCk7CiAJCWNjLT5ucl9taWdyYXRlcGFnZXMrKzsKKwkJbnJfaXNvbGF0ZWQrKzsKIAogCQkvKiBBdm9pZCBpc29sYXRpbmcgdG9vIG11Y2ggKi8KIAkJaWYgKGNjLT5ucl9taWdyYXRlcGFnZXMgPT0gQ09NUEFDVF9DTFVTVEVSX01BWCkKQEAgLTI5MSw2ICszMzIsOCBAQAogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCWNjLT5taWdyYXRlX3BmbiA9IGxvd19wZm47CiAKKwl0cmFjZV9tbV9jb21wYWN0aW9uX2lzb2xhdGVfbWlncmF0ZXBhZ2VzKG5yX3NjYW5uZWQsIG5yX2lzb2xhdGVkKTsKKwogCXJldHVybiBjYy0+bnJfbWlncmF0ZXBhZ2VzOwogfQogCkBAIC0zNDEsMTAgKzM4NCwxMCBAQAogfQogCiBzdGF0aWMgaW50IGNvbXBhY3RfZmluaXNoZWQoc3RydWN0IHpvbmUgKnpvbmUsCi0JCQkJCQlzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKKwkJCSAgICBzdHJ1Y3QgY29tcGFjdF9jb250cm9sICpjYykKIHsKIAl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0JdW5zaWduZWQgbG9uZyB3YXRlcm1hcmsgPSBsb3dfd21hcmtfcGFnZXMoem9uZSkgKyAoMSA8PCBjYy0+b3JkZXIpOworCXVuc2lnbmVkIGxvbmcgd2F0ZXJtYXJrOwogCiAJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQlyZXR1cm4gQ09NUEFDVF9QQVJUSUFMOwpAQCAtMzU0LDEyICszOTcsMjcgQEAKIAkJcmV0dXJuIENPTVBBQ1RfQ09NUExFVEU7CiAKIAkvKiBDb21wYWN0aW9uIHJ1biBpcyBub3QgZmluaXNoZWQgaWYgdGhlIHdhdGVybWFyayBpcyBub3QgbWV0ICovCisJaWYgKGNjLT5jb21wYWN0X21vZGUgIT0gQ09NUEFDVF9NT0RFX0tTV0FQRCkKKwkJd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpOworCWVsc2UKKwkJd2F0ZXJtYXJrID0gaGlnaF93bWFya19wYWdlcyh6b25lKTsKKwl3YXRlcm1hcmsgKz0gKDEgPDwgY2MtPm9yZGVyKTsKKwogCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgY2MtPm9yZGVyLCB3YXRlcm1hcmssIDAsIDApKQogCQlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKIAogCWlmIChjYy0+b3JkZXIgPT0gLTEpCiAJCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOwogCisJLyoKKwkgKiBHZW5lcmF0aW5nIG9ubHkgb25lIHBhZ2Ugb2YgdGhlIHJpZ2h0IG9yZGVyIGlzIG5vdCBlbm91Z2gKKwkgKiBmb3Iga3N3YXBkLCB3ZSBtdXN0IGNvbnRpbnVlIHVudGlsIHdlJ3JlIGFib3ZlIHRoZSBoaWdoCisJICogd2F0ZXJtYXJrIGFzIGEgcG9vbCBmb3IgaGlnaCBvcmRlciBHRlBfQVRPTUlDIGFsbG9jYXRpb25zCisJICogdG9vLgorCSAqLworCWlmIChjYy0+Y29tcGFjdF9tb2RlID09IENPTVBBQ1RfTU9ERV9LU1dBUEQpCisJCXJldHVybiBDT01QQUNUX0NPTlRJTlVFOworCiAJLyogRGlyZWN0IGNvbXBhY3RvcjogSXMgYSBzdWl0YWJsZSBwYWdlIGZyZWU/ICovCiAJZm9yIChvcmRlciA9IGNjLT5vcmRlcjsgb3JkZXIgPCBNQVhfT1JERVI7IG9yZGVyKyspIHsKIAkJLyogSm9iIGRvbmUgaWYgcGFnZSBpcyBmcmVlIG9mIHRoZSByaWdodCBtaWdyYXRldHlwZSAqLwpAQCAtMzc0LDEwICs0MzIsNjIgQEAKIAlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKIH0KIAorLyoKKyAqIGNvbXBhY3Rpb25fc3VpdGFibGU6IElzIHRoaXMgc3VpdGFibGUgdG8gcnVuIGNvbXBhY3Rpb24gb24gdGhpcyB6b25lIG5vdz8KKyAqIFJldHVybnMKKyAqICAgQ09NUEFDVF9TS0lQUEVEICAtIElmIHRoZXJlIGFyZSB0b28gZmV3IGZyZWUgcGFnZXMgZm9yIGNvbXBhY3Rpb24KKyAqICAgQ09NUEFDVF9QQVJUSUFMICAtIElmIHRoZSBhbGxvY2F0aW9uIHdvdWxkIHN1Y2NlZWQgd2l0aG91dCBjb21wYWN0aW9uCisgKiAgIENPTVBBQ1RfQ09OVElOVUUgLSBJZiBjb21wYWN0aW9uIHNob3VsZCBydW4gbm93CisgKi8KK3Vuc2lnbmVkIGxvbmcgY29tcGFjdGlvbl9zdWl0YWJsZShzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG9yZGVyKQoreworCWludCBmcmFnaW5kZXg7CisJdW5zaWduZWQgbG9uZyB3YXRlcm1hcms7CisKKwkvKgorCSAqIFdhdGVybWFya3MgZm9yIG9yZGVyLTAgbXVzdCBiZSBtZXQgZm9yIGNvbXBhY3Rpb24uIE5vdGUgdGhlIDJVTC4KKwkgKiBUaGlzIGlzIGJlY2F1c2UgZHVyaW5nIG1pZ3JhdGlvbiwgY29waWVzIG9mIHBhZ2VzIG5lZWQgdG8gYmUKKwkgKiBhbGxvY2F0ZWQgYW5kIGZvciBhIHNob3J0IHRpbWUsIHRoZSBmb290cHJpbnQgaXMgaGlnaGVyCisJICovCisJd2F0ZXJtYXJrID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpICsgKDJVTCA8PCBvcmRlcik7CisJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCAwLCB3YXRlcm1hcmssIDAsIDApKQorCQlyZXR1cm4gQ09NUEFDVF9TS0lQUEVEOworCisJLyoKKwkgKiBmcmFnbWVudGF0aW9uIGluZGV4IGRldGVybWluZXMgaWYgYWxsb2NhdGlvbiBmYWlsdXJlcyBhcmUgZHVlIHRvCisJICogbG93IG1lbW9yeSBvciBleHRlcm5hbCBmcmFnbWVudGF0aW9uCisJICoKKwkgKiBpbmRleCBvZiAtMSBpbXBsaWVzIGFsbG9jYXRpb25zIG1pZ2h0IHN1Y2NlZWQgZGVwZW5kaW5nb24gd2F0ZXJtYXJrcworCSAqIGluZGV4IHRvd2FyZHMgMCBpbXBsaWVzIGZhaWx1cmUgaXMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5CisJICogaW5kZXggdG93YXJkcyAxMDAwIGltcGxpZXMgZmFpbHVyZSBpcyBkdWUgdG8gZnJhZ21lbnRhdGlvbgorCSAqCisJICogT25seSBjb21wYWN0IGlmIGEgZmFpbHVyZSB3b3VsZCBiZSBkdWUgdG8gZnJhZ21lbnRhdGlvbi4KKwkgKi8KKwlmcmFnaW5kZXggPSBmcmFnbWVudGF0aW9uX2luZGV4KHpvbmUsIG9yZGVyKTsKKwlpZiAoZnJhZ2luZGV4ID49IDAgJiYgZnJhZ2luZGV4IDw9IHN5c2N0bF9leHRmcmFnX3RocmVzaG9sZCkKKwkJcmV0dXJuIENPTVBBQ1RfU0tJUFBFRDsKKworCWlmIChmcmFnaW5kZXggPT0gLTEgJiYgem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsIHdhdGVybWFyaywgMCwgMCkpCisJCXJldHVybiBDT01QQUNUX1BBUlRJQUw7CisKKwlyZXR1cm4gQ09NUEFDVF9DT05USU5VRTsKK30KKwogc3RhdGljIGludCBjb21wYWN0X3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBjb21wYWN0X2NvbnRyb2wgKmNjKQogewogCWludCByZXQ7CiAKKwlyZXQgPSBjb21wYWN0aW9uX3N1aXRhYmxlKHpvbmUsIGNjLT5vcmRlcik7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIENPTVBBQ1RfUEFSVElBTDoKKwljYXNlIENPTVBBQ1RfU0tJUFBFRDoKKwkJLyogQ29tcGFjdGlvbiBpcyBsaWtlbHkgdG8gZmFpbCAqLworCQlyZXR1cm4gcmV0OworCWNhc2UgQ09NUEFDVF9DT05USU5VRToKKwkJLyogRmFsbCB0aHJvdWdoIHRvIGNvbXBhY3Rpb24gKi8KKwkJOworCX0KKwogCS8qIFNldHVwIHRvIG1vdmUgYWxsIG1vdmFibGUgcGFnZXMgdG8gdGhlIGVuZCBvZiB0aGUgem9uZSAqLwogCWNjLT5taWdyYXRlX3BmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOwogCWNjLT5mcmVlX3BmbiA9IGNjLT5taWdyYXRlX3BmbiArIHpvbmUtPnNwYW5uZWRfcGFnZXM7CkBAIC0zOTMsNyArNTAzLDggQEAKIAogCQlucl9taWdyYXRlID0gY2MtPm5yX21pZ3JhdGVwYWdlczsKIAkJbWlncmF0ZV9wYWdlcygmY2MtPm1pZ3JhdGVwYWdlcywgY29tcGFjdGlvbl9hbGxvYywKLQkJCQkJCSh1bnNpZ25lZCBsb25nKWNjLCAwKTsKKwkJCQkodW5zaWduZWQgbG9uZyljYywgZmFsc2UsCisJCQkJY2MtPnN5bmMpOwogCQl1cGRhdGVfbnJfbGlzdHBhZ2VzKGNjKTsKIAkJbnJfcmVtYWluaW5nID0gY2MtPm5yX21pZ3JhdGVwYWdlczsKIApAQCAtNDAxLDYgKzUxMiw4IEBACiAJCWNvdW50X3ZtX2V2ZW50cyhDT01QQUNUUEFHRVMsIG5yX21pZ3JhdGUgLSBucl9yZW1haW5pbmcpOwogCQlpZiAobnJfcmVtYWluaW5nKQogCQkJY291bnRfdm1fZXZlbnRzKENPTVBBQ1RQQUdFRkFJTEVELCBucl9yZW1haW5pbmcpOworCQl0cmFjZV9tbV9jb21wYWN0aW9uX21pZ3JhdGVwYWdlcyhucl9taWdyYXRlIC0gbnJfcmVtYWluaW5nLAorCQkJCQkJbnJfcmVtYWluaW5nKTsKIAogCQkvKiBSZWxlYXNlIExSVSBwYWdlcyBub3QgbWlncmF0ZWQgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZjYy0+bWlncmF0ZXBhZ2VzKSkgewpAQCAtNDE3LDggKzUzMCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbXBhY3Rfem9uZV9vcmRlcihzdHJ1Y3Qgem9uZSAqem9uZSwKLQkJCQkJCWludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2spCit1bnNpZ25lZCBsb25nIGNvbXBhY3Rfem9uZV9vcmRlcihzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkgaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaywKKwkJCQkgYm9vbCBzeW5jLAorCQkJCSBpbnQgY29tcGFjdF9tb2RlKQogewogCXN0cnVjdCBjb21wYWN0X2NvbnRyb2wgY2MgPSB7CiAJCS5ucl9mcmVlcGFnZXMgPSAwLApAQCAtNDI2LDYgKzU0MSw4IEBACiAJCS5vcmRlciA9IG9yZGVyLAogCQkubWlncmF0ZXR5cGUgPSBhbGxvY2ZsYWdzX3RvX21pZ3JhdGV0eXBlKGdmcF9tYXNrKSwKIAkJLnpvbmUgPSB6b25lLAorCQkuc3luYyA9IHN5bmMsCisJCS5jb21wYWN0X21vZGUgPSBjb21wYWN0X21vZGUsCiAJfTsKIAlJTklUX0xJU1RfSEVBRCgmY2MuZnJlZXBhZ2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmY2MubWlncmF0ZXBhZ2VzKTsKQEAgLTQ0MSwxNiArNTU4LDE3IEBACiAgKiBAb3JkZXI6IFRoZSBvcmRlciBvZiB0aGUgY3VycmVudCBhbGxvY2F0aW9uCiAgKiBAZ2ZwX21hc2s6IFRoZSBHRlAgbWFzayBvZiB0aGUgY3VycmVudCBhbGxvY2F0aW9uCiAgKiBAbm9kZW1hc2s6IFRoZSBhbGxvd2VkIG5vZGVzIHRvIGFsbG9jYXRlIGZyb20KKyAqIEBzeW5jOiBXaGV0aGVyIG1pZ3JhdGlvbiBpcyBzeW5jaHJvbm91cyBvciBub3QKICAqCiAgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBkaXJlY3QgcGFnZSBjb21wYWN0aW9uLgogICovCiB1bnNpZ25lZCBsb25nIHRyeV90b19jb21wYWN0X3BhZ2VzKHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCi0JCQlpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrLCBub2RlbWFza190ICpub2RlbWFzaykKKwkJCWludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2ssIG5vZGVtYXNrX3QgKm5vZGVtYXNrLAorCQkJYm9vbCBzeW5jKQogewogCWVudW0gem9uZV90eXBlIGhpZ2hfem9uZWlkeCA9IGdmcF96b25lKGdmcF9tYXNrKTsKIAlpbnQgbWF5X2VudGVyX2ZzID0gZ2ZwX21hc2sgJiBfX0dGUF9GUzsKIAlpbnQgbWF5X3BlcmZvcm1faW8gPSBnZnBfbWFzayAmIF9fR0ZQX0lPOwotCXVuc2lnbmVkIGxvbmcgd2F0ZXJtYXJrOwogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCWludCByYyA9IENPTVBBQ1RfU0tJUFBFRDsKQEAgLTQ2MCw3ICs1NzgsNyBAQAogCSAqIG1hZGUgYmVjYXVzZSBhbiBhc3N1bXB0aW9uIGlzIG1hZGUgdGhhdCB0aGUgcGFnZSBhbGxvY2F0b3IgY2FuIHNhdGlzZnkKIAkgKiB0aGUgImNoZWFwZXIiIG9yZGVycyB3aXRob3V0IHRha2luZyBzcGVjaWFsIHN0ZXBzCiAJICovCi0JaWYgKG9yZGVyIDw9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSIHx8ICFtYXlfZW50ZXJfZnMgfHwgIW1heV9wZXJmb3JtX2lvKQorCWlmICghb3JkZXIgfHwgIW1heV9lbnRlcl9mcyB8fCAhbWF5X3BlcmZvcm1faW8pCiAJCXJldHVybiByYzsKIAogCWNvdW50X3ZtX2V2ZW50KENPTVBBQ1RTVEFMTCk7CkBAIC00NjgsNDMgKzU4NiwxNCBAQAogCS8qIENvbXBhY3QgZWFjaCB6b25lIGluIHRoZSBsaXN0ICovCiAJZm9yX2VhY2hfem9uZV96b25lbGlzdF9ub2RlbWFzayh6b25lLCB6LCB6b25lbGlzdCwgaGlnaF96b25laWR4LAogCQkJCQkJCQlub2RlbWFzaykgewotCQlpbnQgZnJhZ2luZGV4OwogCQlpbnQgc3RhdHVzOwogCi0JCS8qCi0JCSAqIFdhdGVybWFya3MgZm9yIG9yZGVyLTAgbXVzdCBiZSBtZXQgZm9yIGNvbXBhY3Rpb24uIE5vdGUKLQkJICogdGhlIDJVTC4gVGhpcyBpcyBiZWNhdXNlIGR1cmluZyBtaWdyYXRpb24sIGNvcGllcyBvZgotCQkgKiBwYWdlcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBhbmQgZm9yIGEgc2hvcnQgdGltZSwgdGhlCi0JCSAqIGZvb3RwcmludCBpcyBoaWdoZXIKLQkJICovCi0JCXdhdGVybWFyayA9IGxvd193bWFya19wYWdlcyh6b25lKSArICgyVUwgPDwgb3JkZXIpOwotCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIDAsIHdhdGVybWFyaywgMCwgMCkpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiBmcmFnbWVudGF0aW9uIGluZGV4IGRldGVybWluZXMgaWYgYWxsb2NhdGlvbiBmYWlsdXJlcyBhcmUKLQkJICogZHVlIHRvIGxvdyBtZW1vcnkgb3IgZXh0ZXJuYWwgZnJhZ21lbnRhdGlvbgotCQkgKgotCQkgKiBpbmRleCBvZiAtMSBpbXBsaWVzIGFsbG9jYXRpb25zIG1pZ2h0IHN1Y2NlZWQgZGVwZW5kaW5nCi0JCSAqIAlvbiB3YXRlcm1hcmtzCi0JCSAqIGluZGV4IHRvd2FyZHMgMCBpbXBsaWVzIGZhaWx1cmUgaXMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5Ci0JCSAqIGluZGV4IHRvd2FyZHMgMTAwMCBpbXBsaWVzIGZhaWx1cmUgaXMgZHVlIHRvIGZyYWdtZW50YXRpb24KLQkJICoKLQkJICogT25seSBjb21wYWN0IGlmIGEgZmFpbHVyZSB3b3VsZCBiZSBkdWUgdG8gZnJhZ21lbnRhdGlvbi4KLQkJICovCi0JCWZyYWdpbmRleCA9IGZyYWdtZW50YXRpb25faW5kZXgoem9uZSwgb3JkZXIpOwotCQlpZiAoZnJhZ2luZGV4ID49IDAgJiYgZnJhZ2luZGV4IDw9IHN5c2N0bF9leHRmcmFnX3RocmVzaG9sZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChmcmFnaW5kZXggPT0gLTEgJiYgem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsIHdhdGVybWFyaywgMCwgMCkpIHsKLQkJCXJjID0gQ09NUEFDVF9QQVJUSUFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdGF0dXMgPSBjb21wYWN0X3pvbmVfb3JkZXIoem9uZSwgb3JkZXIsIGdmcF9tYXNrKTsKKwkJc3RhdHVzID0gY29tcGFjdF96b25lX29yZGVyKHpvbmUsIG9yZGVyLCBnZnBfbWFzaywgc3luYywKKwkJCQkJICAgIENPTVBBQ1RfTU9ERV9ESVJFQ1RfUkVDTEFJTSk7CiAJCXJjID0gbWF4KHN0YXR1cywgcmMpOwogCi0JCWlmICh6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgd2F0ZXJtYXJrLCAwLCAwKSkKKwkJLyogSWYgYSBub3JtYWwgYWxsb2NhdGlvbiB3b3VsZCBzdWNjZWVkLCBzdG9wIGNvbXBhY3RpbmcgKi8KKwkJaWYgKHpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCBsb3dfd21hcmtfcGFnZXMoem9uZSksIDAsIDApKQogCQkJYnJlYWs7CiAJfQogCkBAIC01MzEsNiArNjIwLDcgQEAKIAkJCS5ucl9mcmVlcGFnZXMgPSAwLAogCQkJLm5yX21pZ3JhdGVwYWdlcyA9IDAsCiAJCQkub3JkZXIgPSAtMSwKKwkJCS5jb21wYWN0X21vZGUgPSBDT01QQUNUX01PREVfRElSRUNUX1JFQ0xBSU0sCiAJCX07CiAKIAkJem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1t6b25laWRdOwpkaWZmIC0tZ2l0IGEvbW0vZG1hcG9vbC5jIGIvbW0vZG1hcG9vbC5jCmluZGV4IDRkZjJkZTcuLjAzYmYzYmIgMTAwNjQ0Ci0tLSBhL21tL2RtYXBvb2wuYworKysgYi9tbS9kbWFwb29sLmMKQEAgLTMyNCw3ICszMjQsNyBAQAogCQlpZiAobWVtX2ZsYWdzICYgX19HRlBfV0FJVCkgewogCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKLQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJX19hZGRfd2FpdF9xdWV1ZSgmcG9vbC0+d2FpdHEsICZ3YWl0KTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIApAQCAtMzU1LDIwICszNTUsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBkbWFfcGFnZSAqcG9vbF9maW5kX3BhZ2Uoc3RydWN0IGRtYV9wb29sICpwb29sLCBkbWFfYWRkcl90IGRtYSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfcGFnZSAqcGFnZTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmcG9vbC0+cGFnZV9saXN0LCBwYWdlX2xpc3QpIHsKIAkJaWYgKGRtYSA8IHBhZ2UtPmRtYSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZG1hIDwgKHBhZ2UtPmRtYSArIHBvb2wtPmFsbG9jYXRpb24pKQotCQkJZ290byBkb25lOworCQkJcmV0dXJuIHBhZ2U7CiAJfQotCXBhZ2UgPSBOVUxMOwotIGRvbmU6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBwYWdlOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTM4Niw4ICszODEsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwogCXBhZ2UgPSBwb29sX2ZpbmRfcGFnZShwb29sLCBkbWEpOwogCWlmICghcGFnZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CiAJCWlmIChwb29sLT5kZXYpCiAJCQlkZXZfZXJyKHBvb2wtPmRldiwKIAkJCQkiZG1hX3Bvb2xfZnJlZSAlcywgJXAvJWx4IChiYWQgZG1hKVxuIiwKQEAgLTQwMSw2ICszOTgsNyBAQAogCW9mZnNldCA9IHZhZGRyIC0gcGFnZS0+dmFkZHI7CiAjaWZkZWYJRE1BUE9PTF9ERUJVRwogCWlmICgoZG1hIC0gcGFnZS0+ZG1hKSAhPSBvZmZzZXQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwogCQlpZiAocG9vbC0+ZGV2KQogCQkJZGV2X2Vycihwb29sLT5kZXYsCiAJCQkJImRtYV9wb29sX2ZyZWUgJXMsICVwIChiYWQgdmFkZHIpLyVMeFxuIiwKQEAgLTQxOCw2ICs0MTYsNyBAQAogCQkJCWNoYWluID0gKihpbnQgKikocGFnZS0+dmFkZHIgKyBjaGFpbik7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CiAJCQlpZiAocG9vbC0+ZGV2KQogCQkJCWRldl9lcnIocG9vbC0+ZGV2LCAiZG1hX3Bvb2xfZnJlZSAlcywgZG1hICVMeCAiCiAJCQkJCSJhbHJlYWR5IGZyZWVcbiIsIHBvb2wtPm5hbWUsCkBAIC00MzIsNyArNDMxLDYgQEAKIAltZW1zZXQodmFkZHIsIFBPT0xfUE9JU09OX0ZSRUVELCBwb29sLT5zaXplKTsKICNlbmRpZgogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIAlwYWdlLT5pbl91c2UtLTsKIAkqKGludCAqKXZhZGRyID0gcGFnZS0+b2Zmc2V0OwogCXBhZ2UtPm9mZnNldCA9IG9mZnNldDsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBjYTM4OTM5Li44M2E0NWQzIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQkJCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCQlpZiAoVGVzdENsZWFyUGFnZUVycm9yKHBhZ2UpKQogCQkJCXJldCA9IC1FSU87CiAJCX0KIAkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKQEAgLTgzNyw5ICs4MzcsNiBAQAogCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKIAkJCWdvdG8gcmVzdGFydDsKIAotCQlpZiAocGFnZS0+bWFwcGluZyA9PSBOVUxMIHx8IHBhZ2UtPmluZGV4ICE9IGluZGV4KQotCQkJYnJlYWs7Ci0KIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKIAkJCWdvdG8gcmVwZWF0OwogCkBAIC04NDksNiArODQ2LDE2IEBACiAJCQlnb3RvIHJlcGVhdDsKIAkJfQogCisJCS8qCisJCSAqIG11c3QgY2hlY2sgbWFwcGluZyBhbmQgaW5kZXggYWZ0ZXIgdGFraW5nIHRoZSByZWYuCisJCSAqIG90aGVyd2lzZSB3ZSBjYW4gZ2V0IGJvdGggZmFsc2UgcG9zaXRpdmVzIGFuZCBmYWxzZQorCQkgKiBuZWdhdGl2ZXMsIHdoaWNoIGlzIGp1c3QgY29uZnVzaW5nIHRvIHRoZSBjYWxsZXIuCisJCSAqLworCQlpZiAocGFnZS0+bWFwcGluZyA9PSBOVUxMIHx8IHBhZ2UtPmluZGV4ICE9IGluZGV4KSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlicmVhazsKKwkJfQorCiAJCXBhZ2VzW3JldF0gPSBwYWdlOwogCQlyZXQrKzsKIAkJaW5kZXgrKzsKQEAgLTIyMjAsNyArMjIyNyw3IEBACiAJCWdmcF9ub3RtYXNrID0gX19HRlBfRlM7CiByZXBlYXQ6CiAJcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGluZGV4KTsKLQlpZiAobGlrZWx5KHBhZ2UpKQorCWlmIChwYWdlKQogCQlyZXR1cm4gcGFnZTsKIAogCXBhZ2UgPSBfX3BhZ2VfY2FjaGVfYWxsb2MobWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSAmIH5nZnBfbm90bWFzayk7CmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDRjOWMyCi0tLSAvZGV2L251bGwKKysrIGIvbW0vaHVnZV9tZW1vcnkuYwpAQCAtMCwwICsxLDIzNDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBSZWQgSGF0LCBJbmMuCisgKgorICogIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gU2VlCisgKiAgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2h1Z2VwYWdlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIEJ5IGRlZmF1bHQgdHJhbnNwYXJlbnQgaHVnZXBhZ2Ugc3VwcG9ydCBpcyBlbmFibGVkIGZvciBhbGwgbWFwcGluZ3MKKyAqIGFuZCBraHVnZXBhZ2VkIHNjYW5zIGFsbCBtYXBwaW5ncy4gRGVmcmFnIGlzIG9ubHkgaW52b2tlZCBieQorICoga2h1Z2VwYWdlZCBodWdlcGFnZSBhbGxvY2F0aW9ucyBhbmQgYnkgcGFnZSBmYXVsdHMgaW5zaWRlCisgKiBNQURWX0hVR0VQQUdFIHJlZ2lvbnMgdG8gYXZvaWQgdGhlIHJpc2sgb2Ygc2xvd2luZyBkb3duIHNob3J0IGxpdmVkCisgKiBhbGxvY2F0aW9ucy4KKyAqLwordW5zaWduZWQgbG9uZyB0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyBfX3JlYWRfbW9zdGx5ID0KKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTCisJKDE8PFRSQU5TUEFSRU5UX0hVR0VQQUdFX0ZMQUcpfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0UKKwkoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfUkVRX01BRFZfRkxBRyl8CisjZW5kaWYKKwkoMTw8VFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX0ZMQUcpfAorCSgxPDxUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfS0hVR0VQQUdFRF9GTEFHKTsKKworLyogZGVmYXVsdCBzY2FuIDgqNTEyIHB0ZSAob3Igdm1hcykgZXZlcnkgMzAgc2Vjb25kICovCitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfcGFnZXNfdG9fc2NhbiBfX3JlYWRfbW9zdGx5ID0gSFBBR0VfUE1EX05SKjg7CitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfcGFnZXNfY29sbGFwc2VkOworc3RhdGljIHVuc2lnbmVkIGludCBraHVnZXBhZ2VkX2Z1bGxfc2NhbnM7CitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfc2Nhbl9zbGVlcF9taWxsaXNlY3MgX19yZWFkX21vc3RseSA9IDEwMDAwOworLyogZHVyaW5nIGZyYWdtZW50YXRpb24gcG9sbCB0aGUgaHVnZXBhZ2UgYWxsb2NhdG9yIG9uY2UgZXZlcnkgbWludXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfYWxsb2Nfc2xlZXBfbWlsbGlzZWNzIF9fcmVhZF9tb3N0bHkgPSA2MDAwMDsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtodWdlcGFnZWRfdGhyZWFkIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgREVGSU5FX01VVEVYKGtodWdlcGFnZWRfbXV0ZXgpOworc3RhdGljIERFRklORV9TUElOTE9DSyhraHVnZXBhZ2VkX21tX2xvY2spOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWdlcGFnZWRfd2FpdCk7CisvKgorICogZGVmYXVsdCBjb2xsYXBzZSBodWdlcGFnZXMgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHB0ZSBtYXBwZWQgbGlrZQorICogaXQgd291bGQgaGF2ZSBoYXBwZW5lZCBpZiB0aGUgdm1hIHdhcyBsYXJnZSBlbm91Z2ggZHVyaW5nIHBhZ2UKKyAqIGZhdWx0LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZSBfX3JlYWRfbW9zdGx5ID0gSFBBR0VfUE1EX05SLTE7CisKK3N0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKTsKK3N0YXRpYyBpbnQgbW1fc2xvdHNfaGFzaF9pbml0KHZvaWQpOworc3RhdGljIGludCBraHVnZXBhZ2VkX3NsYWJfaW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGtodWdlcGFnZWRfc2xhYl9mcmVlKHZvaWQpOworCisjZGVmaW5lIE1NX1NMT1RTX0hBU0hfSEVBRFMgMTAyNAorc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICptbV9zbG90c19oYXNoIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1tX3Nsb3RfY2FjaGUgX19yZWFkX21vc3RseTsKKworLyoqCisgKiBzdHJ1Y3QgbW1fc2xvdCAtIGhhc2ggbG9va3VwIGZyb20gbW0gdG8gbW1fc2xvdAorICogQGhhc2g6IGhhc2ggY29sbGlzaW9uIGxpc3QKKyAqIEBtbV9ub2RlOiBraHVnZXBhZ2VkIHNjYW4gbGlzdCBoZWFkZWQgaW4ga2h1Z2VwYWdlZF9zY2FuLm1tX2hlYWQKKyAqIEBtbTogdGhlIG1tIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyB2YWxpZCBmb3IKKyAqLworc3RydWN0IG1tX3Nsb3QgeworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2g7CisJc3RydWN0IGxpc3RfaGVhZCBtbV9ub2RlOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworfTsKKworLyoqCisgKiBzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIC0gY3Vyc29yIGZvciBzY2FubmluZworICogQG1tX2hlYWQ6IHRoZSBoZWFkIG9mIHRoZSBtbSBsaXN0IHRvIHNjYW4KKyAqIEBtbV9zbG90OiB0aGUgY3VycmVudCBtbV9zbG90IHdlIGFyZSBzY2FubmluZworICogQGFkZHJlc3M6IHRoZSBuZXh0IGFkZHJlc3MgaW5zaWRlIHRoYXQgdG8gYmUgc2Nhbm5lZAorICoKKyAqIFRoZXJlIGlzIG9ubHkgdGhlIG9uZSBraHVnZXBhZ2VkX3NjYW4gaW5zdGFuY2Ugb2YgdGhpcyBjdXJzb3Igc3RydWN0dXJlLgorICovCitzdHJ1Y3Qga2h1Z2VwYWdlZF9zY2FuIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1tX2hlYWQ7CisJc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3Q7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworfSBraHVnZXBhZ2VkX3NjYW4gPSB7CisJLm1tX2hlYWQgPSBMSVNUX0hFQURfSU5JVChraHVnZXBhZ2VkX3NjYW4ubW1faGVhZCksCit9OworCisKK3N0YXRpYyBpbnQgc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlcyh2b2lkKQoreworCXN0cnVjdCB6b25lICp6b25lOworCWludCBucl96b25lcyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWNvbW1lbmRlZF9taW47CisJZXh0ZXJuIGludCBtaW5fZnJlZV9rYnl0ZXM7CisKKwlpZiAoIXRlc3RfYml0KFRSQU5TUEFSRU5UX0hVR0VQQUdFX0ZMQUcsCisJCSAgICAgICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncykgJiYKKwkgICAgIXRlc3RfYml0KFRSQU5TUEFSRU5UX0hVR0VQQUdFX1JFUV9NQURWX0ZMQUcsCisJCSAgICAgICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncykpCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfcG9wdWxhdGVkX3pvbmUoem9uZSkKKwkJbnJfem9uZXMrKzsKKworCS8qIE1ha2Ugc3VyZSBhdCBsZWFzdCAyIGh1Z2VwYWdlcyBhcmUgZnJlZSBmb3IgTUlHUkFURV9SRVNFUlZFICovCisJcmVjb21tZW5kZWRfbWluID0gcGFnZWJsb2NrX25yX3BhZ2VzICogbnJfem9uZXMgKiAyOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBvbiBhdmVyYWdlIGF0IGxlYXN0IHR3byBwYWdlYmxvY2tzIGFyZSBhbG1vc3QgZnJlZQorCSAqIG9mIGFub3RoZXIgdHlwZSwgb25lIGZvciBhIG1pZ3JhdGV0eXBlIHRvIGZhbGwgYmFjayB0byBhbmQgYQorCSAqIHNlY29uZCB0byBhdm9pZCBzdWJzZXF1ZW50IGZhbGxiYWNrcyBvZiBvdGhlciB0eXBlcyBUaGVyZSBhcmUgMworCSAqIE1JR1JBVEVfVFlQRVMgd2UgY2FyZSBhYm91dC4KKwkgKi8KKwlyZWNvbW1lbmRlZF9taW4gKz0gcGFnZWJsb2NrX25yX3BhZ2VzICogbnJfem9uZXMgKgorCQkJICAgTUlHUkFURV9QQ1BUWVBFUyAqIE1JR1JBVEVfUENQVFlQRVM7CisKKwkvKiBkb24ndCBldmVyIGFsbG93IHRvIHJlc2VydmUgbW9yZSB0aGFuIDUlIG9mIHRoZSBsb3dtZW0gKi8KKwlyZWNvbW1lbmRlZF9taW4gPSBtaW4ocmVjb21tZW5kZWRfbWluLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgLyAyMCk7CisJcmVjb21tZW5kZWRfbWluIDw8PSAoUEFHRV9TSElGVC0xMCk7CisKKwlpZiAocmVjb21tZW5kZWRfbWluID4gbWluX2ZyZWVfa2J5dGVzKQorCQltaW5fZnJlZV9rYnl0ZXMgPSByZWNvbW1lbmRlZF9taW47CisJc2V0dXBfcGVyX3pvbmVfd21hcmtzKCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHNldF9yZWNvbW1lbmRlZF9taW5fZnJlZV9rYnl0ZXMpOworCitzdGF0aWMgaW50IHN0YXJ0X2todWdlcGFnZWQodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAoa2h1Z2VwYWdlZF9lbmFibGVkKCkpIHsKKwkJaW50IHdha2V1cDsKKwkJaWYgKHVubGlrZWx5KCFtbV9zbG90X2NhY2hlIHx8ICFtbV9zbG90c19oYXNoKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW11dGV4X2xvY2soJmtodWdlcGFnZWRfbXV0ZXgpOworCQlpZiAoIWtodWdlcGFnZWRfdGhyZWFkKQorCQkJa2h1Z2VwYWdlZF90aHJlYWQgPSBrdGhyZWFkX3J1bihraHVnZXBhZ2VkLCBOVUxMLAorCQkJCQkJCSJraHVnZXBhZ2VkIik7CisJCWlmICh1bmxpa2VseShJU19FUlIoa2h1Z2VwYWdlZF90aHJlYWQpKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImtodWdlcGFnZWQ6IGt0aHJlYWRfcnVuKGtodWdlcGFnZWQpIGZhaWxlZFxuIik7CisJCQllcnIgPSBQVFJfRVJSKGtodWdlcGFnZWRfdGhyZWFkKTsKKwkJCWtodWdlcGFnZWRfdGhyZWFkID0gTlVMTDsKKwkJfQorCQl3YWtldXAgPSAhbGlzdF9lbXB0eSgma2h1Z2VwYWdlZF9zY2FuLm1tX2hlYWQpOworCQltdXRleF91bmxvY2soJmtodWdlcGFnZWRfbXV0ZXgpOworCQlpZiAod2FrZXVwKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZraHVnZXBhZ2VkX3dhaXQpOworCisJCXNldF9yZWNvbW1lbmRlZF9taW5fZnJlZV9rYnl0ZXMoKTsKKwl9IGVsc2UKKwkJLyogd2FrZXVwIHRvIGV4aXQgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZraHVnZXBhZ2VkX3dhaXQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworc3RhdGljIHNzaXplX3QgZG91YmxlX2ZsYWdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJCQllbnVtIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWcgZW5hYmxlZCwKKwkJCQllbnVtIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWcgcmVxX21hZHYpCit7CisJaWYgKHRlc3RfYml0KGVuYWJsZWQsICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncykpIHsKKwkJVk1fQlVHX09OKHRlc3RfYml0KHJlcV9tYWR2LCAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpKTsKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiW2Fsd2F5c10gbWFkdmlzZSBuZXZlclxuIik7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChyZXFfbWFkdiwgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiYWx3YXlzIFttYWR2aXNlXSBuZXZlclxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJhbHdheXMgbWFkdmlzZSBbbmV2ZXJdXG4iKTsKK30KK3N0YXRpYyBzc2l6ZV90IGRvdWJsZV9mbGFnX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSBlbnVtIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWcgZW5hYmxlZCwKKwkJCQkgZW51bSB0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFnIHJlcV9tYWR2KQoreworCWlmICghbWVtY21wKCJhbHdheXMiLCBidWYsCisJCSAgICBtaW4oc2l6ZW9mKCJhbHdheXMiKS0xLCBjb3VudCkpKSB7CisJCXNldF9iaXQoZW5hYmxlZCwgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwkJY2xlYXJfYml0KHJlcV9tYWR2LCAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpOworCX0gZWxzZSBpZiAoIW1lbWNtcCgibWFkdmlzZSIsIGJ1ZiwKKwkJCSAgIG1pbihzaXplb2YoIm1hZHZpc2UiKS0xLCBjb3VudCkpKSB7CisJCWNsZWFyX2JpdChlbmFibGVkLCAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpOworCQlzZXRfYml0KHJlcV9tYWR2LCAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpOworCX0gZWxzZSBpZiAoIW1lbWNtcCgibmV2ZXIiLCBidWYsCisJCQkgICBtaW4oc2l6ZW9mKCJuZXZlciIpLTEsIGNvdW50KSkpIHsKKwkJY2xlYXJfYml0KGVuYWJsZWQsICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyk7CisJCWNsZWFyX2JpdChyZXFfbWFkdiwgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZWRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gZG91YmxlX2ZsYWdfc2hvdyhrb2JqLCBhdHRyLCBidWYsCisJCQkJVFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRywKKwkJCQlUUkFOU1BBUkVOVF9IVUdFUEFHRV9SRVFfTUFEVl9GTEFHKTsKK30KK3N0YXRpYyBzc2l6ZV90IGVuYWJsZWRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3NpemVfdCByZXQ7CisKKwlyZXQgPSBkb3VibGVfZmxhZ19zdG9yZShrb2JqLCBhdHRyLCBidWYsIGNvdW50LAorCQkJCVRSQU5TUEFSRU5UX0hVR0VQQUdFX0ZMQUcsCisJCQkJVFJBTlNQQVJFTlRfSFVHRVBBR0VfUkVRX01BRFZfRkxBRyk7CisKKwlpZiAocmV0ID4gMCkgeworCQlpbnQgZXJyID0gc3RhcnRfa2h1Z2VwYWdlZCgpOworCQlpZiAoZXJyKQorCQkJcmV0ID0gZXJyOworCX0KKworCWlmIChyZXQgPiAwICYmCisJICAgICh0ZXN0X2JpdChUUkFOU1BBUkVOVF9IVUdFUEFHRV9GTEFHLAorCQkgICAgICAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpIHx8CisJICAgICB0ZXN0X2JpdChUUkFOU1BBUkVOVF9IVUdFUEFHRV9SRVFfTUFEVl9GTEFHLAorCQkgICAgICAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpKSkKKwkJc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlcygpOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgZW5hYmxlZF9hdHRyID0KKwlfX0FUVFIoZW5hYmxlZCwgMDY0NCwgZW5hYmxlZF9zaG93LCBlbmFibGVkX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3Qgc2luZ2xlX2ZsYWdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJCQllbnVtIHRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWcgZmxhZykKK3sKKwlpZiAodGVzdF9iaXQoZmxhZywgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiW3llc10gbm9cbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAieWVzIFtub11cbiIpOworfQorc3RhdGljIHNzaXplX3Qgc2luZ2xlX2ZsYWdfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJIGVudW0gdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZyBmbGFnKQoreworCWlmICghbWVtY21wKCJ5ZXMiLCBidWYsCisJCSAgICBtaW4oc2l6ZW9mKCJ5ZXMiKS0xLCBjb3VudCkpKSB7CisJCXNldF9iaXQoZmxhZywgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwl9IGVsc2UgaWYgKCFtZW1jbXAoIm5vIiwgYnVmLAorCQkJICAgbWluKHNpemVvZigibm8iKS0xLCBjb3VudCkpKSB7CisJCWNsZWFyX2JpdChmbGFnLCAmdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MpOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIEN1cnJlbnRseSBkZWZyYWcgb25seSBkaXNhYmxlcyBfX0dGUF9OT1dBSVQgZm9yIGFsbG9jYXRpb24uIEEgYmxpbmQKKyAqIF9fR0ZQX1JFUEVBVCBpcyB0b28gYWdncmVzc2l2ZSwgaXQncyBuZXZlciB3b3J0aCBzd2FwcGluZyB0b25zIG9mCisgKiBtZW1vcnkganVzdCB0byBhbGxvY2F0ZSBvbmUgbW9yZSBodWdlcGFnZS4KKyAqLworc3RhdGljIHNzaXplX3QgZGVmcmFnX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gZG91YmxlX2ZsYWdfc2hvdyhrb2JqLCBhdHRyLCBidWYsCisJCQkJVFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX0ZMQUcsCisJCQkJVFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX1JFUV9NQURWX0ZMQUcpOworfQorc3RhdGljIHNzaXplX3QgZGVmcmFnX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gZG91YmxlX2ZsYWdfc3RvcmUoa29iaiwgYXR0ciwgYnVmLCBjb3VudCwKKwkJCQkgVFJBTlNQQVJFTlRfSFVHRVBBR0VfREVGUkFHX0ZMQUcsCisJCQkJIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0RFRlJBR19SRVFfTUFEVl9GTEFHKTsKK30KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgZGVmcmFnX2F0dHIgPQorCV9fQVRUUihkZWZyYWcsIDA2NDQsIGRlZnJhZ19zaG93LCBkZWZyYWdfc3RvcmUpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19jb3dfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2luZ2xlX2ZsYWdfc2hvdyhrb2JqLCBhdHRyLCBidWYsCisJCQkJVFJBTlNQQVJFTlRfSFVHRVBBR0VfREVCVUdfQ09XX0ZMQUcpOworfQorc3RhdGljIHNzaXplX3QgZGVidWdfY293X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc2luZ2xlX2ZsYWdfc3RvcmUoa29iaiwgYXR0ciwgYnVmLCBjb3VudCwKKwkJCQkgVFJBTlNQQVJFTlRfSFVHRVBBR0VfREVCVUdfQ09XX0ZMQUcpOworfQorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBkZWJ1Z19jb3dfYXR0ciA9CisJX19BVFRSKGRlYnVnX2NvdywgMDY0NCwgZGVidWdfY293X3Nob3csIGRlYnVnX2Nvd19zdG9yZSk7CisjZW5kaWYgLyogQ09ORklHX0RFQlVHX1ZNICovCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpodWdlcGFnZV9hdHRyW10gPSB7CisJJmVuYWJsZWRfYXR0ci5hdHRyLAorCSZkZWZyYWdfYXR0ci5hdHRyLAorI2lmZGVmIENPTkZJR19ERUJVR19WTQorCSZkZWJ1Z19jb3dfYXR0ci5hdHRyLAorI2VuZGlmCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGh1Z2VwYWdlX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gaHVnZXBhZ2VfYXR0ciwKK307CisKK3N0YXRpYyBzc2l6ZV90IHNjYW5fc2xlZXBfbWlsbGlzZWNzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGtodWdlcGFnZWRfc2Nhbl9zbGVlcF9taWxsaXNlY3MpOworfQorCitzdGF0aWMgc3NpemVfdCBzY2FuX3NsZWVwX21pbGxpc2Vjc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBtc2VjczsKKwlpbnQgZXJyOworCisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJm1zZWNzKTsKKwlpZiAoZXJyIHx8IG1zZWNzID4gVUlOVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJa2h1Z2VwYWdlZF9zY2FuX3NsZWVwX21pbGxpc2VjcyA9IG1zZWNzOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma2h1Z2VwYWdlZF93YWl0KTsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgc2Nhbl9zbGVlcF9taWxsaXNlY3NfYXR0ciA9CisJX19BVFRSKHNjYW5fc2xlZXBfbWlsbGlzZWNzLCAwNjQ0LCBzY2FuX3NsZWVwX21pbGxpc2Vjc19zaG93LAorCSAgICAgICBzY2FuX3NsZWVwX21pbGxpc2Vjc19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFsbG9jX3NsZWVwX21pbGxpc2Vjc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGtodWdlcGFnZWRfYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWxsb2Nfc2xlZXBfbWlsbGlzZWNzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgbXNlY3M7CisJaW50IGVycjsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZtc2Vjcyk7CisJaWYgKGVyciB8fCBtc2VjcyA+IFVJTlRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtodWdlcGFnZWRfYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gbXNlY3M7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZraHVnZXBhZ2VkX3dhaXQpOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBhbGxvY19zbGVlcF9taWxsaXNlY3NfYXR0ciA9CisJX19BVFRSKGFsbG9jX3NsZWVwX21pbGxpc2VjcywgMDY0NCwgYWxsb2Nfc2xlZXBfbWlsbGlzZWNzX3Nob3csCisJICAgICAgIGFsbG9jX3NsZWVwX21pbGxpc2Vjc19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IHBhZ2VzX3RvX3NjYW5fc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwga2h1Z2VwYWdlZF9wYWdlc190b19zY2FuKTsKK30KK3N0YXRpYyBzc2l6ZV90IHBhZ2VzX3RvX3NjYW5fc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBwYWdlczsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZwYWdlcyk7CisJaWYgKGVyciB8fCAhcGFnZXMgfHwgcGFnZXMgPiBVSU5UX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlraHVnZXBhZ2VkX3BhZ2VzX3RvX3NjYW4gPSBwYWdlczsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgcGFnZXNfdG9fc2Nhbl9hdHRyID0KKwlfX0FUVFIocGFnZXNfdG9fc2NhbiwgMDY0NCwgcGFnZXNfdG9fc2Nhbl9zaG93LAorCSAgICAgICBwYWdlc190b19zY2FuX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgcGFnZXNfY29sbGFwc2VkX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBraHVnZXBhZ2VkX3BhZ2VzX2NvbGxhcHNlZCk7Cit9CitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHBhZ2VzX2NvbGxhcHNlZF9hdHRyID0KKwlfX0FUVFJfUk8ocGFnZXNfY29sbGFwc2VkKTsKKworc3RhdGljIHNzaXplX3QgZnVsbF9zY2Fuc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGtodWdlcGFnZWRfZnVsbF9zY2Fucyk7Cit9CitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGZ1bGxfc2NhbnNfYXR0ciA9CisJX19BVFRSX1JPKGZ1bGxfc2NhbnMpOworCitzdGF0aWMgc3NpemVfdCBraHVnZXBhZ2VkX2RlZnJhZ19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzaW5nbGVfZmxhZ19zaG93KGtvYmosIGF0dHIsIGJ1ZiwKKwkJCQlUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfS0hVR0VQQUdFRF9GTEFHKTsKK30KK3N0YXRpYyBzc2l6ZV90IGtodWdlcGFnZWRfZGVmcmFnX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzaW5nbGVfZmxhZ19zdG9yZShrb2JqLCBhdHRyLCBidWYsIGNvdW50LAorCQkJCSBUUkFOU1BBUkVOVF9IVUdFUEFHRV9ERUZSQUdfS0hVR0VQQUdFRF9GTEFHKTsKK30KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUga2h1Z2VwYWdlZF9kZWZyYWdfYXR0ciA9CisJX19BVFRSKGRlZnJhZywgMDY0NCwga2h1Z2VwYWdlZF9kZWZyYWdfc2hvdywKKwkgICAgICAga2h1Z2VwYWdlZF9kZWZyYWdfc3RvcmUpOworCisvKgorICogbWF4X3B0ZXNfbm9uZSBjb250cm9scyBpZiBraHVnZXBhZ2VkIHNob3VsZCBjb2xsYXBzZSBodWdlcGFnZXMgb3ZlcgorICogYW55IHVubWFwcGVkIHB0ZXMgaW4gdHVybiBwb3RlbnRpYWxseSBpbmNyZWFzaW5nIHRoZSBtZW1vcnkKKyAqIGZvb3RwcmludCBvZiB0aGUgdm1hcy4gV2hlbiBtYXhfcHRlc19ub25lIGlzIDAga2h1Z2VwYWdlZCB3aWxsIG5vdAorICogcmVkdWNlIHRoZSBhdmFpbGFibGUgZnJlZSBtZW1vcnkgaW4gdGhlIHN5c3RlbSBhcyBpdAorICogcnVucy4gSW5jcmVhc2luZyBtYXhfcHRlc19ub25lIHdpbGwgaW5zdGVhZCBwb3RlbnRpYWxseSByZWR1Y2UgdGhlCisgKiBmcmVlIG1lbW9yeSBpbiB0aGUgc3lzdGVtIGR1cmluZyB0aGUga2h1Z2VwYWdlZCBzY2FuLgorICovCitzdGF0aWMgc3NpemVfdCBraHVnZXBhZ2VkX21heF9wdGVzX25vbmVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBraHVnZXBhZ2VkX21heF9wdGVzX25vbmUpOworfQorc3RhdGljIHNzaXplX3Qga2h1Z2VwYWdlZF9tYXhfcHRlc19ub25lX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBtYXhfcHRlc19ub25lOworCisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJm1heF9wdGVzX25vbmUpOworCWlmIChlcnIgfHwgbWF4X3B0ZXNfbm9uZSA+IEhQQUdFX1BNRF9OUi0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZSA9IG1heF9wdGVzX25vbmU7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZV9hdHRyID0KKwlfX0FUVFIobWF4X3B0ZXNfbm9uZSwgMDY0NCwga2h1Z2VwYWdlZF9tYXhfcHRlc19ub25lX3Nob3csCisJICAgICAgIGtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZV9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpraHVnZXBhZ2VkX2F0dHJbXSA9IHsKKwkma2h1Z2VwYWdlZF9kZWZyYWdfYXR0ci5hdHRyLAorCSZraHVnZXBhZ2VkX21heF9wdGVzX25vbmVfYXR0ci5hdHRyLAorCSZwYWdlc190b19zY2FuX2F0dHIuYXR0ciwKKwkmcGFnZXNfY29sbGFwc2VkX2F0dHIuYXR0ciwKKwkmZnVsbF9zY2Fuc19hdHRyLmF0dHIsCisJJnNjYW5fc2xlZXBfbWlsbGlzZWNzX2F0dHIuYXR0ciwKKwkmYWxsb2Nfc2xlZXBfbWlsbGlzZWNzX2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAga2h1Z2VwYWdlZF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGtodWdlcGFnZWRfYXR0ciwKKwkubmFtZSA9ICJraHVnZXBhZ2VkIiwKK307CisjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovCisKK3N0YXRpYyBpbnQgX19pbml0IGh1Z2VwYWdlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworI2lmZGVmIENPTkZJR19TWVNGUworCXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaHVnZXBhZ2Vfa29iajsKKyNlbmRpZgorCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWhhc190cmFuc3BhcmVudF9odWdlcGFnZSgpKSB7CisJCXRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisjaWZkZWYgQ09ORklHX1NZU0ZTCisJZXJyID0gLUVOT01FTTsKKwlodWdlcGFnZV9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgidHJhbnNwYXJlbnRfaHVnZXBhZ2UiLCBtbV9rb2JqKTsKKwlpZiAodW5saWtlbHkoIWh1Z2VwYWdlX2tvYmopKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHVnZXBhZ2U6IGZhaWxlZCBrb2JqZWN0IGNyZWF0ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cChodWdlcGFnZV9rb2JqLCAmaHVnZXBhZ2VfYXR0cl9ncm91cCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImh1Z2VwYWdlOiBmYWlsZWQgcmVnaXN0ZXIgaHVnZWFnZSBncm91cFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cChodWdlcGFnZV9rb2JqLCAma2h1Z2VwYWdlZF9hdHRyX2dyb3VwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHVnZXBhZ2U6IGZhaWxlZCByZWdpc3RlciBodWdlYWdlIGdyb3VwXG4iKTsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisKKwllcnIgPSBraHVnZXBhZ2VkX3NsYWJfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gbW1fc2xvdHNfaGFzaF9pbml0KCk7CisJaWYgKGVycikgeworCQlraHVnZXBhZ2VkX3NsYWJfZnJlZSgpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEJ5IGRlZmF1bHQgZGlzYWJsZSB0cmFuc3BhcmVudCBodWdlcGFnZXMgb24gc21hbGxlciBzeXN0ZW1zLAorCSAqIHdoZXJlIHRoZSBleHRyYSBtZW1vcnkgdXNlZCBjb3VsZCBodXJ0IG1vcmUgdGhhbiBUTEIgb3ZlcmhlYWQKKwkgKiBpcyBsaWtlbHkgdG8gc2F2ZS4gIFRoZSBhZG1pbiBjYW4gc3RpbGwgZW5hYmxlIGl0IHRocm91Z2ggL3N5cy4KKwkgKi8KKwlpZiAodG90YWxyYW1fcGFnZXMgPCAoNTEyIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSkKKwkJdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZmxhZ3MgPSAwOworCisJc3RhcnRfa2h1Z2VwYWdlZCgpOworCisJc2V0X3JlY29tbWVuZGVkX21pbl9mcmVlX2tieXRlcygpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGh1Z2VwYWdlX2luaXQpCisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3RyYW5zcGFyZW50X2h1Z2VwYWdlKGNoYXIgKnN0cikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoIXN0cikKKwkJZ290byBvdXQ7CisJaWYgKCFzdHJjbXAoc3RyLCAiYWx3YXlzIikpIHsKKwkJc2V0X2JpdChUUkFOU1BBUkVOVF9IVUdFUEFHRV9GTEFHLAorCQkJJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwkJY2xlYXJfYml0KFRSQU5TUEFSRU5UX0hVR0VQQUdFX1JFUV9NQURWX0ZMQUcsCisJCQkgICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyk7CisJCXJldCA9IDE7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm1hZHZpc2UiKSkgeworCQljbGVhcl9iaXQoVFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRywKKwkJCSAgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwkJc2V0X2JpdChUUkFOU1BBUkVOVF9IVUdFUEFHRV9SRVFfTUFEVl9GTEFHLAorCQkJJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAibmV2ZXIiKSkgeworCQljbGVhcl9iaXQoVFJBTlNQQVJFTlRfSFVHRVBBR0VfRkxBRywKKwkJCSAgJnRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzKTsKKwkJY2xlYXJfYml0KFRSQU5TUEFSRU5UX0hVR0VQQUdFX1JFUV9NQURWX0ZMQUcsCisJCQkgICZ0cmFuc3BhcmVudF9odWdlcGFnZV9mbGFncyk7CisJCXJldCA9IDE7CisJfQorb3V0OgorCWlmICghcmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAidHJhbnNwYXJlbnRfaHVnZXBhZ2U9IGNhbm5vdCBwYXJzZSwgaWdub3JlZFxuIik7CisJcmV0dXJuIHJldDsKK30KK19fc2V0dXAoInRyYW5zcGFyZW50X2h1Z2VwYWdlPSIsIHNldHVwX3RyYW5zcGFyZW50X2h1Z2VwYWdlKTsKKworc3RhdGljIHZvaWQgcHJlcGFyZV9wbWRfaHVnZV9wdGUocGd0YWJsZV90IHBndGFibGUsCisJCQkJIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWFzc2VydF9zcGluX2xvY2tlZCgmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKwkvKiBGSUZPICovCisJaWYgKCFtbS0+cG1kX2h1Z2VfcHRlKQorCQlJTklUX0xJU1RfSEVBRCgmcGd0YWJsZS0+bHJ1KTsKKwllbHNlCisJCWxpc3RfYWRkKCZwZ3RhYmxlLT5scnUsICZtbS0+cG1kX2h1Z2VfcHRlLT5scnUpOworCW1tLT5wbWRfaHVnZV9wdGUgPSBwZ3RhYmxlOworfQorCitzdGF0aWMgaW5saW5lIHBtZF90IG1heWJlX3BtZF9ta3dyaXRlKHBtZF90IHBtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaWYgKGxpa2VseSh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQlwbWQgPSBwbWRfbWt3cml0ZShwbWQpOworCXJldHVybiBwbWQ7Cit9CisKK3N0YXRpYyBpbnQgX19kb19odWdlX3BtZF9hbm9ueW1vdXNfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSAwOworCXBndGFibGVfdCBwZ3RhYmxlOworCisJVk1fQlVHX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOworCXBndGFibGUgPSBwdGVfYWxsb2Nfb25lKG1tLCBoYWRkcik7CisJaWYgKHVubGlrZWx5KCFwZ3RhYmxlKSkgeworCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCX0KKworCWNsZWFyX2h1Z2VfcGFnZShwYWdlLCBoYWRkciwgSFBBR0VfUE1EX05SKTsKKwlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJaWYgKHVubGlrZWx5KCFwbWRfbm9uZSgqcG1kKSkpIHsKKwkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlwdGVfZnJlZShtbSwgcGd0YWJsZSk7CisJfSBlbHNlIHsKKwkJcG1kX3QgZW50cnk7CisJCWVudHJ5ID0gbWtfcG1kKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJZW50cnkgPSBtYXliZV9wbWRfbWt3cml0ZShwbWRfbWtkaXJ0eShlbnRyeSksIHZtYSk7CisJCWVudHJ5ID0gcG1kX21raHVnZShlbnRyeSk7CisJCS8qCisJCSAqIFRoZSBzcGlubG9ja2luZyB0byB0YWtlIHRoZSBscnVfbG9jayBpbnNpZGUKKwkJICogcGFnZV9hZGRfbmV3X2Fub25fcm1hcCgpIGFjdHMgYXMgYSBmdWxsIG1lbW9yeQorCQkgKiBiYXJyaWVyIHRvIGJlIHN1cmUgY2xlYXJfaHVnZV9wYWdlIHdyaXRlcyBiZWNvbWUKKwkJICogdmlzaWJsZSBhZnRlciB0aGUgc2V0X3BtZF9hdCgpIHdyaXRlLgorCQkgKi8KKwkJcGFnZV9hZGRfbmV3X2Fub25fcm1hcChwYWdlLCB2bWEsIGhhZGRyKTsKKwkJc2V0X3BtZF9hdChtbSwgaGFkZHIsIHBtZCwgZW50cnkpOworCQlwcmVwYXJlX3BtZF9odWdlX3B0ZShwZ3RhYmxlLCBtbSk7CisJCWFkZF9tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMsIEhQQUdFX1BNRF9OUik7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGdmcF90IGFsbG9jX2h1Z2VwYWdlX2dmcG1hc2soaW50IGRlZnJhZykKK3sKKwlyZXR1cm4gR0ZQX1RSQU5TSFVHRSAmIH4oZGVmcmFnID8gMCA6IF9fR0ZQX1dBSVQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICphbGxvY19odWdlcGFnZV92bWEoaW50IGRlZnJhZywKKwkJCQkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaGFkZHIpCit7CisJcmV0dXJuIGFsbG9jX3BhZ2VzX3ZtYShhbGxvY19odWdlcGFnZV9nZnBtYXNrKGRlZnJhZyksCisJCQkgICAgICAgSFBBR0VfUE1EX09SREVSLCB2bWEsIGhhZGRyKTsKK30KKworI2lmbmRlZiBDT05GSUdfTlVNQQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqYWxsb2NfaHVnZXBhZ2UoaW50IGRlZnJhZykKK3sKKwlyZXR1cm4gYWxsb2NfcGFnZXMoYWxsb2NfaHVnZXBhZ2VfZ2ZwbWFzayhkZWZyYWcpLAorCQkJICAgSFBBR0VfUE1EX09SREVSKTsKK30KKyNlbmRpZgorCitpbnQgZG9faHVnZV9wbWRfYW5vbnltb3VzX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBoYWRkciA9IGFkZHJlc3MgJiBIUEFHRV9QTURfTUFTSzsKKwlwdGVfdCAqcHRlOworCisJaWYgKGhhZGRyID49IHZtYS0+dm1fc3RhcnQgJiYgaGFkZHIgKyBIUEFHRV9QTURfU0laRSA8PSB2bWEtPnZtX2VuZCkgeworCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKKwkJCXJldHVybiBWTV9GQVVMVF9PT007CisJCWlmICh1bmxpa2VseShraHVnZXBhZ2VkX2VudGVyKHZtYSkpKQorCQkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKKwkJcGFnZSA9IGFsbG9jX2h1Z2VwYWdlX3ZtYSh0cmFuc3BhcmVudF9odWdlcGFnZV9kZWZyYWcodm1hKSwKKwkJCQkJICB2bWEsIGhhZGRyKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJCWdvdG8gb3V0OworCQlpZiAodW5saWtlbHkobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpKSB7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0dXJuIF9fZG9faHVnZV9wbWRfYW5vbnltb3VzX3BhZ2UobW0sIHZtYSwgaGFkZHIsIHBtZCwgcGFnZSk7CisJfQorb3V0OgorCS8qCisJICogVXNlIF9fcHRlX2FsbG9jIGluc3RlYWQgb2YgcHRlX2FsbG9jX21hcCwgYmVjYXVzZSB3ZSBjYW4ndAorCSAqIHJ1biBwdGVfb2Zmc2V0X21hcCBvbiB0aGUgcG1kLCBpZiBhbiBodWdlIHBtZCBjb3VsZAorCSAqIG1hdGVyaWFsaXplIGZyb20gdW5kZXIgdXMgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCisJICovCisJaWYgKHVubGlrZWx5KF9fcHRlX2FsbG9jKG1tLCB2bWEsIHBtZCwgYWRkcmVzcykpKQorCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCS8qIGlmIGFuIGh1Z2UgcG1kIG1hdGVyaWFsaXplZCBmcm9tIHVuZGVyIHVzIGp1c3QgcmV0cnkgbGF0ZXIgKi8KKwlpZiAodW5saWtlbHkocG1kX3RyYW5zX2h1Z2UoKnBtZCkpKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIEEgcmVndWxhciBwbWQgaXMgZXN0YWJsaXNoZWQgYW5kIGl0IGNhbid0IG1vcnBoIGludG8gYSBodWdlIHBtZAorCSAqIGZyb20gdW5kZXIgdXMgYW55bW9yZSBhdCB0aGlzIHBvaW50IGJlY2F1c2Ugd2UgaG9sZCB0aGUgbW1hcF9zZW0KKwkgKiByZWFkIG1vZGUgYW5kIGtodWdlcGFnZWQgdGFrZXMgaXQgaW4gd3JpdGUgbW9kZS4gU28gbm93IGl0J3MKKwkgKiBzYWZlIHRvIHJ1biBwdGVfb2Zmc2V0X21hcCgpLgorCSAqLworCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcyk7CisJcmV0dXJuIGhhbmRsZV9wdGVfZmF1bHQobW0sIHZtYSwgYWRkcmVzcywgcHRlLCBwbWQsIGZsYWdzKTsKK30KKworaW50IGNvcHlfaHVnZV9wbWQoc3RydWN0IG1tX3N0cnVjdCAqZHN0X21tLCBzdHJ1Y3QgbW1fc3RydWN0ICpzcmNfbW0sCisJCSAgcG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHBhZ2UgKnNyY19wYWdlOworCXBtZF90IHBtZDsKKwlwZ3RhYmxlX3QgcGd0YWJsZTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVOT01FTTsKKwlwZ3RhYmxlID0gcHRlX2FsbG9jX29uZShkc3RfbW0sIGFkZHIpOworCWlmICh1bmxpa2VseSghcGd0YWJsZSkpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrKCZkc3RfbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJc3Bpbl9sb2NrX25lc3RlZCgmc3JjX21tLT5wYWdlX3RhYmxlX2xvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCXJldCA9IC1FQUdBSU47CisJcG1kID0gKnNyY19wbWQ7CisJaWYgKHVubGlrZWx5KCFwbWRfdHJhbnNfaHVnZShwbWQpKSkgeworCQlwdGVfZnJlZShkc3RfbW0sIHBndGFibGUpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCWlmICh1bmxpa2VseShwbWRfdHJhbnNfc3BsaXR0aW5nKHBtZCkpKSB7CisJCS8qIHNwbGl0IGh1Z2UgcGFnZSBydW5uaW5nIGZyb20gdW5kZXIgdXMgKi8KKwkJc3Bpbl91bmxvY2soJnNyY19tbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRzdF9tbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJcHRlX2ZyZWUoZHN0X21tLCBwZ3RhYmxlKTsKKworCQl3YWl0X3NwbGl0X2h1Z2VfcGFnZSh2bWEtPmFub25fdm1hLCBzcmNfcG1kKTsgLyogc3JjX3ZtYSAqLworCQlnb3RvIG91dDsKKwl9CisJc3JjX3BhZ2UgPSBwbWRfcGFnZShwbWQpOworCVZNX0JVR19PTighUGFnZUhlYWQoc3JjX3BhZ2UpKTsKKwlnZXRfcGFnZShzcmNfcGFnZSk7CisJcGFnZV9kdXBfcm1hcChzcmNfcGFnZSk7CisJYWRkX21tX2NvdW50ZXIoZHN0X21tLCBNTV9BTk9OUEFHRVMsIEhQQUdFX1BNRF9OUik7CisKKwlwbWRwX3NldF93cnByb3RlY3Qoc3JjX21tLCBhZGRyLCBzcmNfcG1kKTsKKwlwbWQgPSBwbWRfbWtvbGQocG1kX3dycHJvdGVjdChwbWQpKTsKKwlzZXRfcG1kX2F0KGRzdF9tbSwgYWRkciwgZHN0X3BtZCwgcG1kKTsKKwlwcmVwYXJlX3BtZF9odWdlX3B0ZShwZ3RhYmxlLCBkc3RfbW0pOworCisJcmV0ID0gMDsKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnNyY19tbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlzcGluX3VubG9jaygmZHN0X21tLT5wYWdlX3RhYmxlX2xvY2spOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIG5vICJhZGRyZXNzIiBhcmd1bWVudCBzbyBkZXN0cm95cyBwYWdlIGNvbG9yaW5nIG9mIHNvbWUgYXJjaCAqLworcGd0YWJsZV90IGdldF9wbWRfaHVnZV9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcGd0YWJsZV90IHBndGFibGU7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCisJLyogRklGTyAqLworCXBndGFibGUgPSBtbS0+cG1kX2h1Z2VfcHRlOworCWlmIChsaXN0X2VtcHR5KCZwZ3RhYmxlLT5scnUpKQorCQltbS0+cG1kX2h1Z2VfcHRlID0gTlVMTDsKKwllbHNlIHsKKwkJbW0tPnBtZF9odWdlX3B0ZSA9IGxpc3RfZW50cnkocGd0YWJsZS0+bHJ1Lm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbCgmcGd0YWJsZS0+bHJ1KTsKKwl9CisJcmV0dXJuIHBndGFibGU7Cit9CisKK3N0YXRpYyBpbnQgZG9faHVnZV9wbWRfd3BfcGFnZV9mYWxsYmFjayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkJcG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQsCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQl1bnNpZ25lZCBsb25nIGhhZGRyKQoreworCXBndGFibGVfdCBwZ3RhYmxlOworCXBtZF90IF9wbWQ7CisJaW50IHJldCA9IDAsIGk7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKworCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBIUEFHRV9QTURfTlIsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXBhZ2VzKSkgeworCQlyZXQgfD0gVk1fRkFVTFRfT09NOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSFBBR0VfUE1EX05SOyBpKyspIHsKKwkJcGFnZXNbaV0gPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwKKwkJCQkJICB2bWEsIGFkZHJlc3MpOworCQlpZiAodW5saWtlbHkoIXBhZ2VzW2ldIHx8CisJCQkgICAgIG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UocGFnZXNbaV0sIG1tLAorCQkJCQkJICAgICAgIEdGUF9LRVJORUwpKSkgeworCQkJaWYgKHBhZ2VzW2ldKQorCQkJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKKwkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3RhcnQoKTsKKwkJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlc1tpXSk7CisJCQkJcHV0X3BhZ2UocGFnZXNbaV0pOworCQkJfQorCQkJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKKwkJCWtmcmVlKHBhZ2VzKTsKKwkJCXJldCB8PSBWTV9GQVVMVF9PT007CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBIUEFHRV9QTURfTlI7IGkrKykgeworCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZXNbaV0sIHBhZ2UgKyBpLAorCQkJCSAgIGhhZGRyICsgUEFHRV9TSElGVCppLCB2bWEpOworCQlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJaWYgKHVubGlrZWx5KCFwbWRfc2FtZSgqcG1kLCBvcmlnX3BtZCkpKQorCQlnb3RvIG91dF9mcmVlX3BhZ2VzOworCVZNX0JVR19PTighUGFnZUhlYWQocGFnZSkpOworCisJcG1kcF9jbGVhcl9mbHVzaF9ub3RpZnkodm1hLCBoYWRkciwgcG1kKTsKKwkvKiBsZWF2ZSBwbWQgZW1wdHkgdW50aWwgcHRlIGlzIGZpbGxlZCAqLworCisJcGd0YWJsZSA9IGdldF9wbWRfaHVnZV9wdGUobW0pOworCXBtZF9wb3B1bGF0ZShtbSwgJl9wbWQsIHBndGFibGUpOworCisJZm9yIChpID0gMDsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrLCBoYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJcHRlX3QgKnB0ZSwgZW50cnk7CisJCWVudHJ5ID0gbWtfcHRlKHBhZ2VzW2ldLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRyeSksIHZtYSk7CisJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAocGFnZXNbaV0sIHZtYSwgaGFkZHIpOworCQlwdGUgPSBwdGVfb2Zmc2V0X21hcCgmX3BtZCwgaGFkZHIpOworCQlWTV9CVUdfT04oIXB0ZV9ub25lKCpwdGUpKTsKKwkJc2V0X3B0ZV9hdChtbSwgaGFkZHIsIHB0ZSwgZW50cnkpOworCQlwdGVfdW5tYXAocHRlKTsKKwl9CisJa2ZyZWUocGFnZXMpOworCisJbW0tPm5yX3B0ZXMrKzsKKwlzbXBfd21iKCk7IC8qIG1ha2UgcHRlIHZpc2libGUgYmVmb3JlIHBtZCAqLworCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTsKKwlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCXJldCB8PSBWTV9GQVVMVF9XUklURTsKKwlwdXRfcGFnZShwYWdlKTsKKworb3V0OgorCXJldHVybiByZXQ7CisKK291dF9mcmVlX3BhZ2VzOgorCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwltZW1fY2dyb3VwX3VuY2hhcmdlX3N0YXJ0KCk7CisJZm9yIChpID0gMDsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlc1tpXSk7CisJCXB1dF9wYWdlKHBhZ2VzW2ldKTsKKwl9CisJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKKwlrZnJlZShwYWdlcyk7CisJZ290byBvdXQ7Cit9CisKK2ludCBkb19odWdlX3BtZF93cF9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZCwgcG1kX3Qgb3JpZ19wbWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpuZXdfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGhhZGRyOworCisJVk1fQlVHX09OKCF2bWEtPmFub25fdm1hKTsKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWlmICh1bmxpa2VseSghcG1kX3NhbWUoKnBtZCwgb3JpZ19wbWQpKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcGFnZSA9IHBtZF9wYWdlKG9yaWdfcG1kKTsKKwlWTV9CVUdfT04oIVBhZ2VDb21wb3VuZChwYWdlKSB8fCAhUGFnZUhlYWQocGFnZSkpOworCWhhZGRyID0gYWRkcmVzcyAmIEhQQUdFX1BNRF9NQVNLOworCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpID09IDEpIHsKKwkJcG1kX3QgZW50cnk7CisJCWVudHJ5ID0gcG1kX21reW91bmcob3JpZ19wbWQpOworCQllbnRyeSA9IG1heWJlX3BtZF9ta3dyaXRlKHBtZF9ta2RpcnR5KGVudHJ5KSwgdm1hKTsKKwkJaWYgKHBtZHBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGhhZGRyLCBwbWQsIGVudHJ5LCAgMSkpCisJCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOworCQlyZXQgfD0gVk1fRkFVTFRfV1JJVEU7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJZ2V0X3BhZ2UocGFnZSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCisJaWYgKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2VuYWJsZWQodm1hKSAmJgorCSAgICAhdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZGVidWdfY293KCkpCisJCW5ld19wYWdlID0gYWxsb2NfaHVnZXBhZ2Vfdm1hKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2RlZnJhZyh2bWEpLAorCQkJCQkgICAgICB2bWEsIGhhZGRyKTsKKwllbHNlCisJCW5ld19wYWdlID0gTlVMTDsKKworCWlmICh1bmxpa2VseSghbmV3X3BhZ2UpKSB7CisJCXJldCA9IGRvX2h1Z2VfcG1kX3dwX3BhZ2VfZmFsbGJhY2sobW0sIHZtYSwgYWRkcmVzcywKKwkJCQkJCSAgIHBtZCwgb3JpZ19wbWQsIHBhZ2UsIGhhZGRyKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKG5ld19wYWdlLCBtbSwgR0ZQX0tFUk5FTCkpKSB7CisJCXB1dF9wYWdlKG5ld19wYWdlKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCXJldCB8PSBWTV9GQVVMVF9PT007CisJCWdvdG8gb3V0OworCX0KKworCWNvcHlfdXNlcl9odWdlX3BhZ2UobmV3X3BhZ2UsIHBhZ2UsIGhhZGRyLCB2bWEsIEhQQUdFX1BNRF9OUik7CisJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlwdXRfcGFnZShwYWdlKTsKKwlpZiAodW5saWtlbHkoIXBtZF9zYW1lKCpwbWQsIG9yaWdfcG1kKSkpIHsKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKG5ld19wYWdlKTsKKwkJcHV0X3BhZ2UobmV3X3BhZ2UpOworCX0gZWxzZSB7CisJCXBtZF90IGVudHJ5OworCQlWTV9CVUdfT04oIVBhZ2VIZWFkKHBhZ2UpKTsKKwkJZW50cnkgPSBta19wbWQobmV3X3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJZW50cnkgPSBtYXliZV9wbWRfbWt3cml0ZShwbWRfbWtkaXJ0eShlbnRyeSksIHZtYSk7CisJCWVudHJ5ID0gcG1kX21raHVnZShlbnRyeSk7CisJCXBtZHBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgaGFkZHIsIHBtZCk7CisJCXBhZ2VfYWRkX25ld19hbm9uX3JtYXAobmV3X3BhZ2UsIHZtYSwgaGFkZHIpOworCQlzZXRfcG1kX2F0KG1tLCBoYWRkciwgcG1kLCBlbnRyeSk7CisJCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBlbnRyeSk7CisJCXBhZ2VfcmVtb3ZlX3JtYXAocGFnZSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlyZXQgfD0gVk1fRkFVTFRfV1JJVEU7CisJfQorb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBhZ2UgKmZvbGxvd190cmFuc19odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgcG1kX3QgKnBtZCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCWlmIChmbGFncyAmIEZPTExfV1JJVEUgJiYgIXBtZF93cml0ZSgqcG1kKSkKKwkJZ290byBvdXQ7CisKKwlwYWdlID0gcG1kX3BhZ2UoKnBtZCk7CisJVk1fQlVHX09OKCFQYWdlSGVhZChwYWdlKSk7CisJaWYgKGZsYWdzICYgRk9MTF9UT1VDSCkgeworCQlwbWRfdCBfcG1kOworCQkvKgorCQkgKiBXZSBzaG91bGQgc2V0IHRoZSBkaXJ0eSBiaXQgb25seSBmb3IgRk9MTF9XUklURSBidXQKKwkJICogZm9yIG5vdyB0aGUgZGlydHkgYml0IGluIHRoZSBwbWQgaXMgbWVhbmluZ2xlc3MuCisJCSAqIEFuZCBpZiB0aGUgZGlydHkgYml0IHdpbGwgYmVjb21lIG1lYW5pbmdmdWwgYW5kCisJCSAqIHdlJ2xsIG9ubHkgc2V0IGl0IHdpdGggRk9MTF9XUklURSwgYW4gYXRvbWljCisJCSAqIHNldF9iaXQgd2lsbCBiZSByZXF1aXJlZCBvbiB0aGUgcG1kIHRvIHNldCB0aGUKKwkJICogeW91bmcgYml0LCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHNldF9wbWRfYXQuCisJCSAqLworCQlfcG1kID0gcG1kX21reW91bmcocG1kX21rZGlydHkoKnBtZCkpOworCQlzZXRfcG1kX2F0KG1tLCBhZGRyICYgSFBBR0VfUE1EX01BU0ssIHBtZCwgX3BtZCk7CisJfQorCXBhZ2UgKz0gKGFkZHIgJiB+SFBBR0VfUE1EX01BU0spID4+IFBBR0VfU0hJRlQ7CisJVk1fQlVHX09OKCFQYWdlQ29tcG91bmQocGFnZSkpOworCWlmIChmbGFncyAmIEZPTExfR0VUKQorCQlnZXRfcGFnZShwYWdlKTsKKworb3V0OgorCXJldHVybiBwYWdlOworfQorCitpbnQgemFwX2h1Z2VfcG1kKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgcG1kX3QgKnBtZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmdGxiLT5tbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlpZiAobGlrZWx5KHBtZF90cmFuc19odWdlKCpwbWQpKSkgeworCQlpZiAodW5saWtlbHkocG1kX3RyYW5zX3NwbGl0dGluZygqcG1kKSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZ0bGItPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJd2FpdF9zcGxpdF9odWdlX3BhZ2Uodm1hLT5hbm9uX3ZtYSwKKwkJCQkJICAgICBwbWQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCQlwZ3RhYmxlX3QgcGd0YWJsZTsKKwkJCXBndGFibGUgPSBnZXRfcG1kX2h1Z2VfcHRlKHRsYi0+bW0pOworCQkJcGFnZSA9IHBtZF9wYWdlKCpwbWQpOworCQkJcG1kX2NsZWFyKHBtZCk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHBhZ2UpOworCQkJVk1fQlVHX09OKHBhZ2VfbWFwY291bnQocGFnZSkgPCAwKTsKKwkJCWFkZF9tbV9jb3VudGVyKHRsYi0+bW0sIE1NX0FOT05QQUdFUywgLUhQQUdFX1BNRF9OUik7CisJCQlWTV9CVUdfT04oIVBhZ2VIZWFkKHBhZ2UpKTsKKwkJCXNwaW5fdW5sb2NrKCZ0bGItPm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJdGxiX3JlbW92ZV9wYWdlKHRsYiwgcGFnZSk7CisJCQlwdGVfZnJlZSh0bGItPm1tLCBwZ3RhYmxlKTsKKwkJCXJldCA9IDE7CisJCX0KKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2soJnRsYi0+bW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWluY29yZV9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJdW5zaWduZWQgY2hhciAqdmVjKQoreworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrKCZ2bWEtPnZtX21tLT5wYWdlX3RhYmxlX2xvY2spOworCWlmIChsaWtlbHkocG1kX3RyYW5zX2h1Z2UoKnBtZCkpKSB7CisJCXJldCA9ICFwbWRfdHJhbnNfc3BsaXR0aW5nKCpwbWQpOworCQlzcGluX3VubG9jaygmdm1hLT52bV9tbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJaWYgKHVubGlrZWx5KCFyZXQpKQorCQkJd2FpdF9zcGxpdF9odWdlX3BhZ2Uodm1hLT5hbm9uX3ZtYSwgcG1kKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogQWxsIGxvZ2ljYWwgcGFnZXMgaW4gdGhlIHJhbmdlIGFyZSBwcmVzZW50CisJCQkgKiBpZiBiYWNrZWQgYnkgYSBodWdlIHBhZ2UuCisJCQkgKi8KKwkJCW1lbXNldCh2ZWMsIDEsIChlbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUKTsKKwkJfQorCX0gZWxzZQorCQlzcGluX3VubG9jaygmdm1hLT52bV9tbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBjaGFuZ2VfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCisJCXVuc2lnbmVkIGxvbmcgYWRkciwgcGdwcm90X3QgbmV3cHJvdCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCWlmIChsaWtlbHkocG1kX3RyYW5zX2h1Z2UoKnBtZCkpKSB7CisJCWlmICh1bmxpa2VseShwbWRfdHJhbnNfc3BsaXR0aW5nKCpwbWQpKSkgeworCQkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJd2FpdF9zcGxpdF9odWdlX3BhZ2Uodm1hLT5hbm9uX3ZtYSwgcG1kKTsKKwkJfSBlbHNlIHsKKwkJCXBtZF90IGVudHJ5OworCisJCQllbnRyeSA9IHBtZHBfZ2V0X2FuZF9jbGVhcihtbSwgYWRkciwgcG1kKTsKKwkJCWVudHJ5ID0gcG1kX21vZGlmeShlbnRyeSwgbmV3cHJvdCk7CisJCQlzZXRfcG1kX2F0KG1tLCBhZGRyLCBwbWQsIGVudHJ5KTsKKwkJCXNwaW5fdW5sb2NrKCZ2bWEtPnZtX21tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkciwgYWRkciArIEhQQUdFX1BNRF9TSVpFKTsKKwkJCXJldCA9IDE7CisJCX0KKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2soJnZtYS0+dm1fbW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitwbWRfdCAqcGFnZV9jaGVja19hZGRyZXNzX3BtZChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgICAgZW51bSBwYWdlX2NoZWNrX2FkZHJlc3NfcG1kX2ZsYWcgZmxhZykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZCwgKnJldCA9IE5VTEw7CisKKwlpZiAoYWRkcmVzcyAmIH5IUEFHRV9QTURfTUFTSykKKwkJZ290byBvdXQ7CisKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKKwlpZiAoIXBnZF9wcmVzZW50KCpwZ2QpKQorCQlnb3RvIG91dDsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwlpZiAoIXB1ZF9wcmVzZW50KCpwdWQpKQorCQlnb3RvIG91dDsKKworCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpCisJCWdvdG8gb3V0OworCWlmIChwbWRfcGFnZSgqcG1kKSAhPSBwYWdlKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIHNwbGl0X3ZtYSgpIG1heSBjcmVhdGUgdGVtcG9yYXJ5IGFsaWFzZWQgbWFwcGluZ3MuIFRoZXJlIGlzCisJICogbm8gcmlzayBhcyBsb25nIGFzIGFsbCBodWdlIHBtZCBhcmUgZm91bmQgYW5kIGhhdmUgdGhlaXIKKwkgKiBzcGxpdHRpbmcgYml0IHNldCBiZWZvcmUgX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQKKwkgKiBydW5zLiBGaW5kaW5nIHRoZSBzYW1lIGh1Z2UgcG1kIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUKKwkgKiBzYW1lIHJtYXAgd2FsayBpcyBub3QgYSBwcm9ibGVtLgorCSAqLworCWlmIChmbGFnID09IFBBR0VfQ0hFQ0tfQUREUkVTU19QTURfTk9UU1BMSVRUSU5HX0ZMQUcgJiYKKwkgICAgcG1kX3RyYW5zX3NwbGl0dGluZygqcG1kKSkKKwkJZ290byBvdXQ7CisJaWYgKHBtZF90cmFuc19odWdlKCpwbWQpKSB7CisJCVZNX0JVR19PTihmbGFnID09IFBBR0VfQ0hFQ0tfQUREUkVTU19QTURfU1BMSVRUSU5HX0ZMQUcgJiYKKwkJCSAgIXBtZF90cmFuc19zcGxpdHRpbmcoKnBtZCkpOworCQlyZXQgPSBwbWQ7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19zcGxpdF9odWdlX3BhZ2Vfc3BsaXR0aW5nKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKwlwbWRfdCAqcG1kOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlwbWQgPSBwYWdlX2NoZWNrX2FkZHJlc3NfcG1kKHBhZ2UsIG1tLCBhZGRyZXNzLAorCQkJCSAgICAgUEFHRV9DSEVDS19BRERSRVNTX1BNRF9OT1RTUExJVFRJTkdfRkxBRyk7CisJaWYgKHBtZCkgeworCQkvKgorCQkgKiBXZSBjYW4ndCB0ZW1wb3JhcmlseSBzZXQgdGhlIHBtZCB0byBudWxsIGluIG9yZGVyCisJCSAqIHRvIHNwbGl0IGl0LCB0aGUgcG1kIG11c3QgcmVtYWluIG1hcmtlZCBodWdlIGF0IGFsbAorCQkgKiB0aW1lcyBvciB0aGUgVk0gd29uJ3QgdGFrZSB0aGUgcG1kX3RyYW5zX2h1Z2UgcGF0aHMKKwkJICogYW5kIGl0IHdvbid0IHdhaXQgb24gdGhlIGFub25fdm1hLT5yb290LT5sb2NrIHRvCisJCSAqIHNlcmlhbGl6ZSBhZ2FpbnN0IHNwbGl0X2h1Z2VfcGFnZSouCisJCSAqLworCQlwbWRwX3NwbGl0dGluZ19mbHVzaF9ub3RpZnkodm1hLCBhZGRyZXNzLCBwbWQpOworCQlyZXQgPSAxOworCX0KKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGhlYWRfaW5kZXggPSBwYWdlLT5pbmRleDsKKwlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKKwlpbnQgem9uZXN0YXQ7CisKKwkvKiBwcmV2ZW50IFBhZ2VMUlUgdG8gZ28gYXdheSBmcm9tIHVuZGVyIHVzLCBhbmQgZnJlZXplIGxydSBzdGF0cyAqLworCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKKwljb21wb3VuZF9sb2NrKHBhZ2UpOworCisJZm9yIChpID0gMTsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlX3RhaWwgPSBwYWdlICsgaTsKKworCQkvKiB0YWlsX3BhZ2UtPl9jb3VudCBjYW5ub3QgY2hhbmdlICovCisJCWF0b21pY19zdWIoYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSwgJnBhZ2UtPl9jb3VudCk7CisJCUJVR19PTihwYWdlX2NvdW50KHBhZ2UpIDw9IDApOworCQlhdG9taWNfYWRkKHBhZ2VfbWFwY291bnQocGFnZSkgKyAxLCAmcGFnZV90YWlsLT5fY291bnQpOworCQlCVUdfT04oYXRvbWljX3JlYWQoJnBhZ2VfdGFpbC0+X2NvdW50KSA8PSAwKTsKKworCQkvKiBhZnRlciBjbGVhcmluZyBQYWdlVGFpbCB0aGUgZ3VwIHJlZmNvdW50IGNhbiBiZSByZWxlYXNlZCAqLworCQlzbXBfbWIoKTsKKworCQlwYWdlX3RhaWwtPmZsYWdzICY9IH5QQUdFX0ZMQUdTX0NIRUNLX0FUX1BSRVA7CisJCXBhZ2VfdGFpbC0+ZmxhZ3MgfD0gKHBhZ2UtPmZsYWdzICYKKwkJCQkgICAgICgoMUwgPDwgUEdfcmVmZXJlbmNlZCkgfAorCQkJCSAgICAgICgxTCA8PCBQR19zd2FwYmFja2VkKSB8CisJCQkJICAgICAgKDFMIDw8IFBHX21sb2NrZWQpIHwKKwkJCQkgICAgICAoMUwgPDwgUEdfdXB0b2RhdGUpKSk7CisJCXBhZ2VfdGFpbC0+ZmxhZ3MgfD0gKDFMIDw8IFBHX2RpcnR5KTsKKworCQkvKgorCQkgKiAxKSBjbGVhciBQYWdlVGFpbCBiZWZvcmUgb3ZlcndyaXRpbmcgZmlyc3RfcGFnZQorCQkgKiAyKSBjbGVhciBQYWdlVGFpbCBiZWZvcmUgY2xlYXJpbmcgUGFnZUhlYWQgZm9yIFZNX0JVR19PTgorCQkgKi8KKwkJc21wX3dtYigpOworCisJCS8qCisJCSAqIF9fc3BsaXRfaHVnZV9wYWdlX3NwbGl0dGluZygpIGFscmVhZHkgc2V0IHRoZQorCQkgKiBzcGxpdHRpbmcgYml0IGluIGFsbCBwbWQgdGhhdCBjb3VsZCBtYXAgdGhpcworCQkgKiBodWdlcGFnZSwgdGhhdCB3aWxsIGVuc3VyZSBubyBDUFUgY2FuIGFsdGVyIHRoZQorCQkgKiBtYXBjb3VudCBvbiB0aGUgaGVhZCBwYWdlLiBUaGUgbWFwY291bnQgaXMgb25seQorCQkgKiBhY2NvdW50ZWQgaW4gdGhlIGhlYWQgcGFnZSBhbmQgaXQgaGFzIHRvIGJlCisJCSAqIHRyYW5zZmVycmVkIHRvIGFsbCB0YWlsIHBhZ2VzIGluIHRoZSBiZWxvdyBjb2RlLiBTbworCQkgKiBmb3IgdGhpcyBjb2RlIHRvIGJlIHNhZmUsIHRoZSBzcGxpdCB0aGUgbWFwY291bnQKKwkJICogY2FuJ3QgY2hhbmdlLiBCdXQgdGhhdCBkb2Vzbid0IG1lYW4gdXNlcmxhbmQgY2FuJ3QKKwkJICoga2VlcCBjaGFuZ2luZyBhbmQgcmVhZGluZyB0aGUgcGFnZSBjb250ZW50cyB3aGlsZQorCQkgKiB3ZSB0cmFuc2ZlciB0aGUgbWFwY291bnQsIHNvIHRoZSBwbWQgc3BsaXR0aW5nCisJCSAqIHN0YXR1cyBpcyBhY2hpZXZlZCBzZXR0aW5nIGEgcmVzZXJ2ZWQgYml0IGluIHRoZQorCQkgKiBwbWQsIG5vdCBieSBjbGVhcmluZyB0aGUgcHJlc2VudCBiaXQuCisJCSovCisJCUJVR19PTihwYWdlX21hcGNvdW50KHBhZ2VfdGFpbCkpOworCQlwYWdlX3RhaWwtPl9tYXBjb3VudCA9IHBhZ2UtPl9tYXBjb3VudDsKKworCQlCVUdfT04ocGFnZV90YWlsLT5tYXBwaW5nKTsKKwkJcGFnZV90YWlsLT5tYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKworCQlwYWdlX3RhaWwtPmluZGV4ID0gKytoZWFkX2luZGV4OworCisJCUJVR19PTighUGFnZUFub24ocGFnZV90YWlsKSk7CisJCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2VfdGFpbCkpOworCQlCVUdfT04oIVBhZ2VEaXJ0eShwYWdlX3RhaWwpKTsKKwkJQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlX3RhaWwpKTsKKworCQlscnVfYWRkX3BhZ2VfdGFpbCh6b25lLCBwYWdlLCBwYWdlX3RhaWwpOworCX0KKworCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9BTk9OX1RSQU5TUEFSRU5UX0hVR0VQQUdFUyk7CisJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FOT05fUEFHRVMsIEhQQUdFX1BNRF9OUik7CisKKwkvKgorCSAqIEEgaHVnZXBhZ2UgY291bnRzIGZvciBIUEFHRV9QTURfTlIgcGFnZXMgb24gdGhlIExSVSBzdGF0aXN0aWNzLAorCSAqIHNvIGFkanVzdCB0aG9zZSBhcHByb3ByaWF0ZWx5IGlmIHRoaXMgcGFnZSBpcyBvbiB0aGUgTFJVLgorCSAqLworCWlmIChQYWdlTFJVKHBhZ2UpKSB7CisJCXpvbmVzdGF0ID0gTlJfTFJVX0JBU0UgKyBwYWdlX2xydShwYWdlKTsKKwkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIHpvbmVzdGF0LCAtKEhQQUdFX1BNRF9OUi0xKSk7CisJfQorCisJQ2xlYXJQYWdlQ29tcG91bmQocGFnZSk7CisJY29tcG91bmRfdW5sb2NrKHBhZ2UpOworCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOworCisJZm9yIChpID0gMTsgaSA8IEhQQUdFX1BNRF9OUjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlX3RhaWwgPSBwYWdlICsgaTsKKwkJQlVHX09OKHBhZ2VfY291bnQocGFnZV90YWlsKSA8PSAwKTsKKwkJLyoKKwkJICogVGFpbCBwYWdlcyBtYXkgYmUgZnJlZWQgaWYgdGhlcmUgd2Fzbid0IGFueSBtYXBwaW5nCisJCSAqIGxpa2UgaWYgYWRkX3RvX3N3YXAoKSBpcyBydW5uaW5nIG9uIGEgbHJ1IHBhZ2UgdGhhdAorCQkgKiBoYWQgaXRzIG1hcHBpbmcgemFwcGVkLiBBbmQgZnJlZWluZyB0aGVzZSBwYWdlcworCQkgKiByZXF1aXJlcyB0YWtpbmcgdGhlIGxydV9sb2NrIHNvIHdlIGRvIHRoZSBwdXRfcGFnZQorCQkgKiBvZiB0aGUgdGFpbCBwYWdlcyBhZnRlciB0aGUgc3BsaXQgaXMgY29tcGxldGUuCisJCSAqLworCQlwdXRfcGFnZShwYWdlX3RhaWwpOworCX0KKworCS8qCisJICogT25seSB0aGUgaGVhZCBwYWdlIChub3cgYmVjb21lIGEgcmVndWxhciBwYWdlKSBpcyByZXF1aXJlZAorCSAqIHRvIGJlIHBpbm5lZCBieSB0aGUgY2FsbGVyLgorCSAqLworCUJVR19PTihwYWdlX2NvdW50KHBhZ2UpIDw9IDApOworfQorCitzdGF0aWMgaW50IF9fc3BsaXRfaHVnZV9wYWdlX21hcChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJcG1kX3QgKnBtZCwgX3BtZDsKKwlpbnQgcmV0ID0gMCwgaTsKKwlwZ3RhYmxlX3QgcGd0YWJsZTsKKwl1bnNpZ25lZCBsb25nIGhhZGRyOworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlwbWQgPSBwYWdlX2NoZWNrX2FkZHJlc3NfcG1kKHBhZ2UsIG1tLCBhZGRyZXNzLAorCQkJCSAgICAgUEFHRV9DSEVDS19BRERSRVNTX1BNRF9TUExJVFRJTkdfRkxBRyk7CisJaWYgKHBtZCkgeworCQlwZ3RhYmxlID0gZ2V0X3BtZF9odWdlX3B0ZShtbSk7CisJCXBtZF9wb3B1bGF0ZShtbSwgJl9wbWQsIHBndGFibGUpOworCisJCWZvciAoaSA9IDAsIGhhZGRyID0gYWRkcmVzczsgaSA8IEhQQUdFX1BNRF9OUjsKKwkJICAgICBpKyssIGhhZGRyICs9IFBBR0VfU0laRSkgeworCQkJcHRlX3QgKnB0ZSwgZW50cnk7CisJCQlCVUdfT04oUGFnZUNvbXBvdW5kKHBhZ2UraSkpOworCQkJZW50cnkgPSBta19wdGUocGFnZSArIGksIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRyeSksIHZtYSk7CisJCQlpZiAoIXBtZF93cml0ZSgqcG1kKSkKKwkJCQllbnRyeSA9IHB0ZV93cnByb3RlY3QoZW50cnkpOworCQkJZWxzZQorCQkJCUJVR19PTihwYWdlX21hcGNvdW50KHBhZ2UpICE9IDEpOworCQkJaWYgKCFwbWRfeW91bmcoKnBtZCkpCisJCQkJZW50cnkgPSBwdGVfbWtvbGQoZW50cnkpOworCQkJcHRlID0gcHRlX29mZnNldF9tYXAoJl9wbWQsIGhhZGRyKTsKKwkJCUJVR19PTighcHRlX25vbmUoKnB0ZSkpOworCQkJc2V0X3B0ZV9hdChtbSwgaGFkZHIsIHB0ZSwgZW50cnkpOworCQkJcHRlX3VubWFwKHB0ZSk7CisJCX0KKworCQltbS0+bnJfcHRlcysrOworCQlzbXBfd21iKCk7IC8qIG1ha2UgcHRlIHZpc2libGUgYmVmb3JlIHBtZCAqLworCQkvKgorCQkgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQKKwkJICogdXNlcmxhbmQgaGFzIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlCisJCSAqIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZQorCQkgKiBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZSB2ZXJzaW9uCisJCSAqIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkCisJCSAqIGlmIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyCisJCSAqIGEgc21hbGwgcGFnZSBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIKKwkJICogd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZAorCQkgKiBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJ3QgbGlrZSB0aGF0LiBTZWUKKwkJICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS91cy9Qcm9jZXNzb3JfVGVjaERvY3MvNDEzMjIucGRmLAorCQkgKiBFcnJhdHVtIDM4MyBvbiBwYWdlIDkzLiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMKKwkJICogYWxzbyB3YXJucyB0aGF0IGl0J3Mgb25seSBzYWZlIGlmIHRoZSBwZXJtaXNzaW9uCisJCSAqIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW4KKwkJICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UKKwkJICogaGVyZSkuIEJ1dCBpdCBpcyBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cKKwkJICogc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZSBzYW1lIHZpcnR1YWwKKwkJICogYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2YKKwkJICogZG9pbmcgInBtZF9wb3B1bGF0ZSgpOyBmbHVzaF90bGJfcmFuZ2UoKTsiIHdlIGZpcnN0CisJCSAqIG1hcmsgdGhlIGN1cnJlbnQgcG1kIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZQorCQkgKiBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZSBhbmQgcG1kX3RyYW5zX3NwbGl0dGluZworCQkgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlCisJCSAqIHNwbGl0IGlzIGNvbXBsZXRlIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlCisJCSAqIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlIG5vbi1odWdlIHZlcnNpb24KKwkJICogb2YgdGhlIHBtZCBlbnRyeSB3aXRoIHBtZF9wb3B1bGF0ZS4KKwkJICovCisJCXNldF9wbWRfYXQobW0sIGFkZHJlc3MsIHBtZCwgcG1kX21rbm90cHJlc2VudCgqcG1kKSk7CisJCWZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSk7CisJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTsKKwkJcmV0ID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBhbm9uX3ZtYS0+cm9vdC0+bG9jayBob2xkICovCitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgIHN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEpCit7CisJaW50IG1hcGNvdW50LCBtYXBjb3VudDI7CisJc3RydWN0IGFub25fdm1hX2NoYWluICphdmM7CisKKwlCVUdfT04oIVBhZ2VIZWFkKHBhZ2UpKTsKKwlCVUdfT04oUGFnZVRhaWwocGFnZSkpOworCisJbWFwY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXZjLCAmYW5vbl92bWEtPmhlYWQsIHNhbWVfYW5vbl92bWEpIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBhdmMtPnZtYTsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gdm1hX2FkZHJlc3MocGFnZSwgdm1hKTsKKwkJQlVHX09OKGlzX3ZtYV90ZW1wb3Jhcnlfc3RhY2sodm1hKSk7CisJCWlmIChhZGRyID09IC1FRkFVTFQpCisJCQljb250aW51ZTsKKwkJbWFwY291bnQgKz0gX19zcGxpdF9odWdlX3BhZ2Vfc3BsaXR0aW5nKHBhZ2UsIHZtYSwgYWRkcik7CisJfQorCS8qCisJICogSXQgaXMgY3JpdGljYWwgdGhhdCBuZXcgdm1hcyBhcmUgYWRkZWQgdG8gdGhlIHRhaWwgb2YgdGhlCisJICogYW5vbl92bWEgbGlzdC4gVGhpcyBndWFyYW50ZXMgdGhhdCBpZiBjb3B5X2h1Z2VfcG1kKCkgcnVucworCSAqIGFuZCBlc3RhYmxpc2hlcyBhIGNoaWxkIHBtZCBiZWZvcmUKKwkgKiBfX3NwbGl0X2h1Z2VfcGFnZV9zcGxpdHRpbmcoKSBmcmVlemVzIHRoZSBwYXJlbnQgcG1kIChzbyBpZgorCSAqIHdlIGZhaWwgdG8gcHJldmVudCBjb3B5X2h1Z2VfcG1kKCkgZnJvbSBydW5uaW5nIHVudGlsIHRoZQorCSAqIHdob2xlIF9fc3BsaXRfaHVnZV9wYWdlKCkgaXMgY29tcGxldGUpLCB3ZSB3aWxsIHN0aWxsIHNlZQorCSAqIHRoZSBuZXdseSBlc3RhYmxpc2hlZCBwbWQgb2YgdGhlIGNoaWxkIGxhdGVyIGR1cmluZyB0aGUKKwkgKiB3YWxrLCB0byBiZSBhYmxlIHRvIHNldCBpdCBhcyBwbWRfdHJhbnNfc3BsaXR0aW5nIHRvby4KKwkgKi8KKwlpZiAobWFwY291bnQgIT0gcGFnZV9tYXBjb3VudChwYWdlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJtYXBjb3VudCAlZCBwYWdlX21hcGNvdW50ICVkXG4iLAorCQkgICAgICAgbWFwY291bnQsIHBhZ2VfbWFwY291bnQocGFnZSkpOworCUJVR19PTihtYXBjb3VudCAhPSBwYWdlX21hcGNvdW50KHBhZ2UpKTsKKworCV9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50KHBhZ2UpOworCisJbWFwY291bnQyID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF2YywgJmFub25fdm1hLT5oZWFkLCBzYW1lX2Fub25fdm1hKSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gYXZjLT52bWE7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZtYV9hZGRyZXNzKHBhZ2UsIHZtYSk7CisJCUJVR19PTihpc192bWFfdGVtcG9yYXJ5X3N0YWNrKHZtYSkpOworCQlpZiAoYWRkciA9PSAtRUZBVUxUKQorCQkJY29udGludWU7CisJCW1hcGNvdW50MiArPSBfX3NwbGl0X2h1Z2VfcGFnZV9tYXAocGFnZSwgdm1hLCBhZGRyKTsKKwl9CisJaWYgKG1hcGNvdW50ICE9IG1hcGNvdW50MikKKwkJcHJpbnRrKEtFUk5fRVJSICJtYXBjb3VudCAlZCBtYXBjb3VudDIgJWQgcGFnZV9tYXBjb3VudCAlZFxuIiwKKwkJICAgICAgIG1hcGNvdW50LCBtYXBjb3VudDIsIHBhZ2VfbWFwY291bnQocGFnZSkpOworCUJVR19PTihtYXBjb3VudCAhPSBtYXBjb3VudDIpOworfQorCitpbnQgc3BsaXRfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWE7CisJaW50IHJldCA9IDE7CisKKwlCVUdfT04oIVBhZ2VBbm9uKHBhZ2UpKTsKKwlhbm9uX3ZtYSA9IHBhZ2VfbG9ja19hbm9uX3ZtYShwYWdlKTsKKwlpZiAoIWFub25fdm1hKQorCQlnb3RvIG91dDsKKwlyZXQgPSAwOworCWlmICghUGFnZUNvbXBvdW5kKHBhZ2UpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlCVUdfT04oIVBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKKwlfX3NwbGl0X2h1Z2VfcGFnZShwYWdlLCBhbm9uX3ZtYSk7CisKKwlCVUdfT04oUGFnZUNvbXBvdW5kKHBhZ2UpKTsKK291dF91bmxvY2s6CisJcGFnZV91bmxvY2tfYW5vbl92bWEoYW5vbl92bWEpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBodWdlcGFnZV9tYWR2aXNlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnZtX2ZsYWdzLCBpbnQgYWR2aWNlKQoreworCXN3aXRjaCAoYWR2aWNlKSB7CisJY2FzZSBNQURWX0hVR0VQQUdFOgorCQkvKgorCQkgKiBCZSBzb21ld2hhdCBvdmVyLXByb3RlY3RpdmUgbGlrZSBLU00gZm9yIG5vdyEKKwkJICovCisJCWlmICgqdm1fZmxhZ3MgJiAoVk1fSFVHRVBBR0UgfAorCQkJCSBWTV9TSEFSRUQgICB8IFZNX01BWVNIQVJFICAgfAorCQkJCSBWTV9QRk5NQVAgICB8IFZNX0lPICAgICAgfCBWTV9ET05URVhQQU5EIHwKKwkJCQkgVk1fUkVTRVJWRUQgfCBWTV9IVUdFVExCIHwgVk1fSU5TRVJUUEFHRSB8CisJCQkJIFZNX01JWEVETUFQIHwgVk1fU0FPKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqdm1fZmxhZ3MgJj0gflZNX05PSFVHRVBBR0U7CisJCSp2bV9mbGFncyB8PSBWTV9IVUdFUEFHRTsKKwkJLyoKKwkJICogSWYgdGhlIHZtYSBiZWNvbWUgZ29vZCBmb3Iga2h1Z2VwYWdlZCB0byBzY2FuLAorCQkgKiByZWdpc3RlciBpdCBoZXJlIHdpdGhvdXQgd2FpdGluZyBhIHBhZ2UgZmF1bHQgdGhhdAorCQkgKiBtYXkgbm90IGhhcHBlbiBhbnkgdGltZSBzb29uLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGtodWdlcGFnZWRfZW50ZXJfdm1hX21lcmdlKHZtYSkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWJyZWFrOworCWNhc2UgTUFEVl9OT0hVR0VQQUdFOgorCQkvKgorCQkgKiBCZSBzb21ld2hhdCBvdmVyLXByb3RlY3RpdmUgbGlrZSBLU00gZm9yIG5vdyEKKwkJICovCisJCWlmICgqdm1fZmxhZ3MgJiAoVk1fTk9IVUdFUEFHRSB8CisJCQkJIFZNX1NIQVJFRCAgIHwgVk1fTUFZU0hBUkUgICB8CisJCQkJIFZNX1BGTk1BUCAgIHwgVk1fSU8gICAgICB8IFZNX0RPTlRFWFBBTkQgfAorCQkJCSBWTV9SRVNFUlZFRCB8IFZNX0hVR0VUTEIgfCBWTV9JTlNFUlRQQUdFIHwKKwkJCQkgVk1fTUlYRURNQVAgfCBWTV9TQU8pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSp2bV9mbGFncyAmPSB+Vk1fSFVHRVBBR0U7CisJCSp2bV9mbGFncyB8PSBWTV9OT0hVR0VQQUdFOworCQkvKgorCQkgKiBTZXR0aW5nIFZNX05PSFVHRVBBR0Ugd2lsbCBwcmV2ZW50IGtodWdlcGFnZWQgZnJvbSBzY2FubmluZworCQkgKiB0aGlzIHZtYSBldmVuIGlmIHdlIGxlYXZlIHRoZSBtbSByZWdpc3RlcmVkIGluIGtodWdlcGFnZWQgaWYKKwkJICogaXQgZ290IHJlZ2lzdGVyZWQgYmVmb3JlIFZNX05PSFVHRVBBR0Ugd2FzIHNldC4KKwkJICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBraHVnZXBhZ2VkX3NsYWJfaW5pdCh2b2lkKQoreworCW1tX3Nsb3RfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgia2h1Z2VwYWdlZF9tbV9zbG90IiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IG1tX3Nsb3QpLAorCQkJCQkgIF9fYWxpZ25vZl9fKHN0cnVjdCBtbV9zbG90KSwgMCwgTlVMTCk7CisJaWYgKCFtbV9zbG90X2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQga2h1Z2VwYWdlZF9zbGFiX2ZyZWUodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobW1fc2xvdF9jYWNoZSk7CisJbW1fc2xvdF9jYWNoZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1tX3Nsb3QgKmFsbG9jX21tX3Nsb3Qodm9pZCkKK3sKKwlpZiAoIW1tX3Nsb3RfY2FjaGUpCS8qIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MobW1fc2xvdF9jYWNoZSwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX21tX3Nsb3Qoc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3QpCit7CisJa21lbV9jYWNoZV9mcmVlKG1tX3Nsb3RfY2FjaGUsIG1tX3Nsb3QpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtbV9zbG90c19oYXNoX2luaXQodm9pZCkKK3sKKwltbV9zbG90c19oYXNoID0ga3phbGxvYyhNTV9TTE9UU19IQVNIX0hFQURTICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1tX3Nsb3RzX2hhc2gpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgX19pbml0IG1tX3Nsb3RzX2hhc2hfZnJlZSh2b2lkKQoreworCWtmcmVlKG1tX3Nsb3RzX2hhc2gpOworCW1tX3Nsb3RzX2hhc2ggPSBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbW1fc2xvdCAqZ2V0X21tX3Nsb3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3Q7CisJc3RydWN0IGhsaXN0X2hlYWQgKmJ1Y2tldDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCWJ1Y2tldCA9ICZtbV9zbG90c19oYXNoWygodW5zaWduZWQgbG9uZyltbSAvIHNpemVvZihzdHJ1Y3QgbW1fc3RydWN0KSkKKwkJCQklIE1NX1NMT1RTX0hBU0hfSEVBRFNdOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG1tX3Nsb3QsIG5vZGUsIGJ1Y2tldCwgaGFzaCkgeworCQlpZiAobW0gPT0gbW1fc2xvdC0+bW0pCisJCQlyZXR1cm4gbW1fc2xvdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF90b19tbV9zbG90c19oYXNoKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgICBzdHJ1Y3QgbW1fc2xvdCAqbW1fc2xvdCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OworCisJYnVja2V0ID0gJm1tX3Nsb3RzX2hhc2hbKCh1bnNpZ25lZCBsb25nKW1tIC8gc2l6ZW9mKHN0cnVjdCBtbV9zdHJ1Y3QpKQorCQkJCSUgTU1fU0xPVFNfSEFTSF9IRUFEU107CisJbW1fc2xvdC0+bW0gPSBtbTsKKwlobGlzdF9hZGRfaGVhZCgmbW1fc2xvdC0+aGFzaCwgYnVja2V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQga2h1Z2VwYWdlZF90ZXN0X2V4aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID09IDA7Cit9CisKK2ludCBfX2todWdlcGFnZWRfZW50ZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3Q7CisJaW50IHdha2V1cDsKKworCW1tX3Nsb3QgPSBhbGxvY19tbV9zbG90KCk7CisJaWYgKCFtbV9zbG90KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIF9fa2h1Z2VwYWdlZF9leGl0KCkgbXVzdCBub3QgcnVuIGZyb20gdW5kZXIgdXMgKi8KKwlWTV9CVUdfT04oa2h1Z2VwYWdlZF90ZXN0X2V4aXQobW0pKTsKKwlpZiAodW5saWtlbHkodGVzdF9hbmRfc2V0X2JpdChNTUZfVk1fSFVHRVBBR0UsICZtbS0+ZmxhZ3MpKSkgeworCQlmcmVlX21tX3Nsb3QobW1fc2xvdCk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKwlpbnNlcnRfdG9fbW1fc2xvdHNfaGFzaChtbSwgbW1fc2xvdCk7CisJLyoKKwkgKiBJbnNlcnQganVzdCBiZWhpbmQgdGhlIHNjYW5uaW5nIGN1cnNvciwgdG8gbGV0IHRoZSBhcmVhIHNldHRsZQorCSAqIGRvd24gYSBsaXR0bGUuCisJICovCisJd2FrZXVwID0gbGlzdF9lbXB0eSgma2h1Z2VwYWdlZF9zY2FuLm1tX2hlYWQpOworCWxpc3RfYWRkX3RhaWwoJm1tX3Nsb3QtPm1tX25vZGUsICZraHVnZXBhZ2VkX3NjYW4ubW1faGVhZCk7CisJc3Bpbl91bmxvY2soJmtodWdlcGFnZWRfbW1fbG9jayk7CisKKwlhdG9taWNfaW5jKCZtbS0+bW1fY291bnQpOworCWlmICh3YWtldXApCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma2h1Z2VwYWdlZF93YWl0KTsKKworCXJldHVybiAwOworfQorCitpbnQga2h1Z2VwYWdlZF9lbnRlcl92bWFfbWVyZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgbG9uZyBoc3RhcnQsIGhlbmQ7CisJaWYgKCF2bWEtPmFub25fdm1hKQorCQkvKgorCQkgKiBOb3QgeWV0IGZhdWx0ZWQgaW4gc28gd2Ugd2lsbCByZWdpc3RlciBsYXRlciBpbiB0aGUKKwkJICogcGFnZSBmYXVsdCBpZiBuZWVkZWQuCisJCSAqLworCQlyZXR1cm4gMDsKKwlpZiAodm1hLT52bV9maWxlIHx8IHZtYS0+dm1fb3BzKQorCQkvKiBraHVnZXBhZ2VkIG5vdCB5ZXQgd29ya2luZyBvbiBmaWxlIG9yIHNwZWNpYWwgbWFwcGluZ3MgKi8KKwkJcmV0dXJuIDA7CisJVk1fQlVHX09OKGlzX2xpbmVhcl9wZm5fbWFwcGluZyh2bWEpIHx8IGlzX3Bmbl9tYXBwaW5nKHZtYSkpOworCWhzdGFydCA9ICh2bWEtPnZtX3N0YXJ0ICsgfkhQQUdFX1BNRF9NQVNLKSAmIEhQQUdFX1BNRF9NQVNLOworCWhlbmQgPSB2bWEtPnZtX2VuZCAmIEhQQUdFX1BNRF9NQVNLOworCWlmIChoc3RhcnQgPCBoZW5kKQorCQlyZXR1cm4ga2h1Z2VwYWdlZF9lbnRlcih2bWEpOworCXJldHVybiAwOworfQorCit2b2lkIF9fa2h1Z2VwYWdlZF9leGl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBtbV9zbG90ICptbV9zbG90OworCWludCBmcmVlID0gMDsKKworCXNwaW5fbG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKwltbV9zbG90ID0gZ2V0X21tX3Nsb3QobW0pOworCWlmIChtbV9zbG90ICYmIGtodWdlcGFnZWRfc2Nhbi5tbV9zbG90ICE9IG1tX3Nsb3QpIHsKKwkJaGxpc3RfZGVsKCZtbV9zbG90LT5oYXNoKTsKKwkJbGlzdF9kZWwoJm1tX3Nsb3QtPm1tX25vZGUpOworCQlmcmVlID0gMTsKKwl9CisKKwlpZiAoZnJlZSkgeworCQlzcGluX3VubG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKwkJY2xlYXJfYml0KE1NRl9WTV9IVUdFUEFHRSwgJm1tLT5mbGFncyk7CisJCWZyZWVfbW1fc2xvdChtbV9zbG90KTsKKwkJbW1kcm9wKG1tKTsKKwl9IGVsc2UgaWYgKG1tX3Nsb3QpIHsKKwkJc3Bpbl91bmxvY2soJmtodWdlcGFnZWRfbW1fbG9jayk7CisJCS8qCisJCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGFnYWluc3QKKwkJICoga2h1Z2VwYWdlZF90ZXN0X2V4aXQoKSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBydW4KKwkJICogdW5kZXIgbW1hcCBzZW0gcmVhZCBtb2RlKS4gU3RvcCBoZXJlIChhZnRlciB3ZQorCQkgKiByZXR1cm4gYWxsIHBhZ2V0YWJsZXMgd2lsbCBiZSBkZXN0cm95ZWQpIHVudGlsCisJCSAqIGtodWdlcGFnZWQgaGFzIGZpbmlzaGVkIHdvcmtpbmcgb24gdGhlIHBhZ2V0YWJsZXMKKwkJICogdW5kZXIgdGhlIG1tYXBfc2VtLgorCQkgKi8KKwkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCS8qIDAgc3RhbmRzIGZvciBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkgPT0gZmFsc2UgKi8KKwlkZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0lTT0xBVEVEX0FOT04gKyAwKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwdXRiYWNrX2xydV9wYWdlKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3B0ZV9wYWdlcyhwdGVfdCAqcHRlLCBwdGVfdCAqX3B0ZSkKK3sKKwl3aGlsZSAoLS1fcHRlID49IHB0ZSkgeworCQlwdGVfdCBwdGV2YWwgPSAqX3B0ZTsKKwkJaWYgKCFwdGVfbm9uZShwdGV2YWwpKQorCQkJcmVsZWFzZV9wdGVfcGFnZShwdGVfcGFnZShwdGV2YWwpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYWxsX3B0ZV9wYWdlcyhwdGVfdCAqcHRlKQoreworCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgcHRlICsgSFBBR0VfUE1EX05SKTsKK30KKworc3RhdGljIGludCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkJCXB0ZV90ICpwdGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcHRlX3QgKl9wdGU7CisJaW50IHJlZmVyZW5jZWQgPSAwLCBpc29sYXRlZCA9IDAsIG5vbmUgPSAwOworCWZvciAoX3B0ZSA9IHB0ZTsgX3B0ZSA8IHB0ZStIUEFHRV9QTURfTlI7CisJICAgICBfcHRlKyssIGFkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CisJCXB0ZV90IHB0ZXZhbCA9ICpfcHRlOworCQlpZiAocHRlX25vbmUocHRldmFsKSkgeworCQkJaWYgKCsrbm9uZSA8PSBraHVnZXBhZ2VkX21heF9wdGVzX25vbmUpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSB8fCAhcHRlX3dyaXRlKHB0ZXZhbCkpIHsKKwkJCXJlbGVhc2VfcHRlX3BhZ2VzKHB0ZSwgX3B0ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyZXNzLCBwdGV2YWwpOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCQlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJVk1fQlVHX09OKFBhZ2VDb21wb3VuZChwYWdlKSk7CisJCUJVR19PTighUGFnZUFub24ocGFnZSkpOworCQlWTV9CVUdfT04oIVBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKKworCQkvKiBjYW5ub3QgdXNlIG1hcGNvdW50OiBjYW4ndCBjb2xsYXBzZSBpZiB0aGVyZSdzIGEgZ3VwIHBpbiAqLworCQlpZiAocGFnZV9jb3VudChwYWdlKSAhPSAxKSB7CisJCQlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyoKKwkJICogV2UgY2FuIGRvIGl0IGJlZm9yZSBpc29sYXRlX2xydV9wYWdlIGJlY2F1c2UgdGhlCisJCSAqIHBhZ2UgY2FuJ3QgYmUgZnJlZWQgZnJvbSB1bmRlciB1cy4gTk9URTogUEdfbG9jaworCQkgKiBpcyBuZWVkZWQgdG8gc2VyaWFsaXplIGFnYWluc3Qgc3BsaXRfaHVnZV9wYWdlCisJCSAqIHdoZW4gaW52b2tlZCBmcm9tIHRoZSBWTS4KKwkJICovCisJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCQlyZWxlYXNlX3B0ZV9wYWdlcyhwdGUsIF9wdGUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyoKKwkJICogSXNvbGF0ZSB0aGUgcGFnZSB0byBhdm9pZCBjb2xsYXBzaW5nIGFuIGh1Z2VwYWdlCisJCSAqIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIFZNLgorCQkgKi8KKwkJaWYgKGlzb2xhdGVfbHJ1X3BhZ2UocGFnZSkpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmVsZWFzZV9wdGVfcGFnZXMocHRlLCBfcHRlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIDAgc3RhbmRzIGZvciBwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkgPT0gZmFsc2UgKi8KKwkJaW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9JU09MQVRFRF9BTk9OICsgMCk7CisJCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJCVZNX0JVR19PTihQYWdlTFJVKHBhZ2UpKTsKKworCQkvKiBJZiB0aGVyZSBpcyBubyBtYXBwZWQgcHRlIHlvdW5nIGRvbid0IGNvbGxhcHNlIHRoZSBwYWdlICovCisJCWlmIChwdGVfeW91bmcocHRldmFsKSB8fCBQYWdlUmVmZXJlbmNlZChwYWdlKSB8fAorCQkgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLT52bV9tbSwgYWRkcmVzcykpCisJCQlyZWZlcmVuY2VkID0gMTsKKwl9CisJaWYgKHVubGlrZWx5KCFyZWZlcmVuY2VkKSkKKwkJcmVsZWFzZV9hbGxfcHRlX3BhZ2VzKHB0ZSk7CisJZWxzZQorCQlpc29sYXRlZCA9IDE7CitvdXQ6CisJcmV0dXJuIGlzb2xhdGVkOworfQorCitzdGF0aWMgdm9pZCBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9jb3B5KHB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCQkgICAgICBzcGlubG9ja190ICpwdGwpCit7CisJcHRlX3QgKl9wdGU7CisJZm9yIChfcHRlID0gcHRlOyBfcHRlIDwgcHRlK0hQQUdFX1BNRF9OUjsgX3B0ZSsrKSB7CisJCXB0ZV90IHB0ZXZhbCA9ICpfcHRlOworCQlzdHJ1Y3QgcGFnZSAqc3JjX3BhZ2U7CisKKwkJaWYgKHB0ZV9ub25lKHB0ZXZhbCkpIHsKKwkJCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgYWRkcmVzcyk7CisJCQlhZGRfbW1fY291bnRlcih2bWEtPnZtX21tLCBNTV9BTk9OUEFHRVMsIDEpOworCQl9IGVsc2UgeworCQkJc3JjX3BhZ2UgPSBwdGVfcGFnZShwdGV2YWwpOworCQkJY29weV91c2VyX2hpZ2hwYWdlKHBhZ2UsIHNyY19wYWdlLCBhZGRyZXNzLCB2bWEpOworCQkJVk1fQlVHX09OKHBhZ2VfbWFwY291bnQoc3JjX3BhZ2UpICE9IDEpOworCQkJVk1fQlVHX09OKHBhZ2VfY291bnQoc3JjX3BhZ2UpICE9IDIpOworCQkJcmVsZWFzZV9wdGVfcGFnZShzcmNfcGFnZSk7CisJCQkvKgorCQkJICogcHRsIG1vc3RseSB1bm5lY2Vzc2FyeSwgYnV0IHByZWVtcHQgaGFzIHRvCisJCQkgKiBiZSBkaXNhYmxlZCB0byB1cGRhdGUgdGhlIHBlci1jcHUgc3RhdHMKKwkJCSAqIGluc2lkZSBwYWdlX3JlbW92ZV9ybWFwKCkuCisJCQkgKi8KKwkJCXNwaW5fbG9jayhwdGwpOworCQkJLyoKKwkJCSAqIHBhcmF2aXJ0IGNhbGxzIGluc2lkZSBwdGVfY2xlYXIgaGVyZSBhcmUKKwkJCSAqIHN1cGVyZmx1b3VzLgorCQkJICovCisJCQlwdGVfY2xlYXIodm1hLT52bV9tbSwgYWRkcmVzcywgX3B0ZSk7CisJCQlwYWdlX3JlbW92ZV9ybWFwKHNyY19wYWdlKTsKKwkJCXNwaW5fdW5sb2NrKHB0bCk7CisJCQlmcmVlX3BhZ2VfYW5kX3N3YXBfY2FjaGUoc3JjX3BhZ2UpOworCQl9CisKKwkJYWRkcmVzcyArPSBQQUdFX1NJWkU7CisJCXBhZ2UrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkgICAgICAgc3RydWN0IHBhZ2UgKipocGFnZSwKKwkJCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZCwgX3BtZDsKKwlwdGVfdCAqcHRlOworCXBndGFibGVfdCBwZ3RhYmxlOworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKwlzcGlubG9ja190ICpwdGw7CisJaW50IGlzb2xhdGVkOworCXVuc2lnbmVkIGxvbmcgaHN0YXJ0LCBoZW5kOworCisJVk1fQlVHX09OKGFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spOworI2lmbmRlZiBDT05GSUdfTlVNQQorCVZNX0JVR19PTighKmhwYWdlKTsKKwluZXdfcGFnZSA9ICpocGFnZTsKKyNlbHNlCisJVk1fQlVHX09OKCpocGFnZSk7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgcGFnZSB3aGlsZSB0aGUgdm1hIGlzIHN0aWxsIHZhbGlkIGFuZCB1bmRlcgorCSAqIHRoZSBtbWFwX3NlbSByZWFkIG1vZGUgc28gdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRpb24KKwkgKiBsYXRlciB3aGVuIHdlIHRha2UgdGhlIG1tYXBfc2VtIGluIHdyaXRlIG1vZGUuIFRoaXMgaXMgbW9yZQorCSAqIGZyaWVuZGx5IGJlaGF2aW9yIChPVE9IIGl0IG1heSBhY3R1YWxseSBoaWRlIGJ1Z3MpIHRvCisJICogZmlsZXN5c3RlbXMgaW4gdXNlcmxhbmQgd2l0aCBkYWVtb25zIGFsbG9jYXRpbmcgbWVtb3J5IGluCisJICogdGhlIHVzZXJsYW5kIEkvTyBwYXRocy4gIEFsbG9jYXRpbmcgbWVtb3J5IHdpdGggdGhlCisJICogbW1hcF9zZW0gaW4gcmVhZCBtb2RlIGlzIGdvb2QgaWRlYSBhbHNvIHRvIGFsbG93IGdyZWF0ZXIKKwkgKiBzY2FsYWJpbGl0eS4KKwkgKi8KKwluZXdfcGFnZSA9IGFsbG9jX2h1Z2VwYWdlX3ZtYShraHVnZXBhZ2VkX2RlZnJhZygpLCB2bWEsIGFkZHJlc3MpOworCWlmICh1bmxpa2VseSghbmV3X3BhZ2UpKSB7CisJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCSpocGFnZSA9IEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAodW5saWtlbHkobWVtX2Nncm91cF9uZXdwYWdlX2NoYXJnZShuZXdfcGFnZSwgbW0sIEdGUF9LRVJORUwpKSkgeworCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCQlwdXRfcGFnZShuZXdfcGFnZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBhZnRlciBhbGxvY2F0aW5nIHRoZSBodWdlcGFnZSB1cGdyYWRlIHRvIG1tYXBfc2VtIHdyaXRlIG1vZGUgKi8KKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJLyoKKwkgKiBQcmV2ZW50IGFsbCBhY2Nlc3MgdG8gcGFnZXRhYmxlcyB3aXRoIHRoZSBleGNlcHRpb24gb2YKKwkgKiBndXBfZmFzdCBsYXRlciBoYW5sZGVkIGJ5IHRoZSBwdGVwX2NsZWFyX2ZsdXNoIGFuZCB0aGUgVk0KKwkgKiBoYW5kbGVkIGJ5IHRoZSBhbm9uX3ZtYSBsb2NrICsgUEdfbG9jay4KKwkgKi8KKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCWlmICh1bmxpa2VseShraHVnZXBhZ2VkX3Rlc3RfZXhpdChtbSkpKQorCQlnb3RvIG91dDsKKworCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyZXNzKTsKKwloc3RhcnQgPSAodm1hLT52bV9zdGFydCArIH5IUEFHRV9QTURfTUFTSykgJiBIUEFHRV9QTURfTUFTSzsKKwloZW5kID0gdm1hLT52bV9lbmQgJiBIUEFHRV9QTURfTUFTSzsKKwlpZiAoYWRkcmVzcyA8IGhzdGFydCB8fCBhZGRyZXNzICsgSFBBR0VfUE1EX1NJWkUgPiBoZW5kKQorCQlnb3RvIG91dDsKKworCWlmICgoISh2bWEtPnZtX2ZsYWdzICYgVk1fSFVHRVBBR0UpICYmICFraHVnZXBhZ2VkX2Fsd2F5cygpKSB8fAorCSAgICAodm1hLT52bV9mbGFncyAmIFZNX05PSFVHRVBBR0UpKQorCQlnb3RvIG91dDsKKworCS8qIFZNX1BGTk1BUCB2bWFzIG1heSBoYXZlIHZtX29wcyBudWxsIGJ1dCB2bV9maWxlIHNldCAqLworCWlmICghdm1hLT5hbm9uX3ZtYSB8fCB2bWEtPnZtX29wcyB8fCB2bWEtPnZtX2ZpbGUpCisJCWdvdG8gb3V0OworCVZNX0JVR19PTihpc19saW5lYXJfcGZuX21hcHBpbmcodm1hKSB8fCBpc19wZm5fbWFwcGluZyh2bWEpKTsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOworCWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisJCWdvdG8gb3V0OworCisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCWlmICghcHVkX3ByZXNlbnQoKnB1ZCkpCisJCWdvdG8gb3V0OworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCS8qIHBtZCBjYW4ndCBnbyBhd2F5IG9yIGJlY29tZSBodWdlIHVuZGVyIHVzICovCisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSB8fCBwbWRfdHJhbnNfaHVnZSgqcG1kKSkKKwkJZ290byBvdXQ7CisKKwlhbm9uX3ZtYV9sb2NrKHZtYS0+YW5vbl92bWEpOworCisJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKTsKKwlwdGwgPSBwdGVfbG9ja3B0cihtbSwgcG1kKTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7IC8qIHByb2JhYmx5IHVubmVjZXNzYXJ5ICovCisJLyoKKwkgKiBBZnRlciB0aGlzIGd1cF9mYXN0IGNhbid0IHJ1biBhbnltb3JlLiBUaGlzIGFsc28gcmVtb3ZlcworCSAqIGFueSBodWdlIFRMQiBlbnRyeSBmcm9tIHRoZSBDUFUgc28gd2Ugd29uJ3QgYWxsb3cKKwkgKiBodWdlIGFuZCBzbWFsbCBUTEIgZW50cmllcyBmb3IgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzCisJICogdG8gYXZvaWQgdGhlIHJpc2sgb2YgQ1BVIGJ1Z3MgaW4gdGhhdCBhcmVhLgorCSAqLworCV9wbWQgPSBwbWRwX2NsZWFyX2ZsdXNoX25vdGlmeSh2bWEsIGFkZHJlc3MsIHBtZCk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCisJc3Bpbl9sb2NrKHB0bCk7CisJaXNvbGF0ZWQgPSBfX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlKHZtYSwgYWRkcmVzcywgcHRlKTsKKwlzcGluX3VubG9jayhwdGwpOworCXB0ZV91bm1hcChwdGUpOworCisJaWYgKHVubGlrZWx5KCFpc29sYXRlZCkpIHsKKwkJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJQlVHX09OKCFwbWRfbm9uZSgqcG1kKSk7CisJCXNldF9wbWRfYXQobW0sIGFkZHJlc3MsIHBtZCwgX3BtZCk7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJYW5vbl92bWFfdW5sb2NrKHZtYS0+YW5vbl92bWEpOworCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UobmV3X3BhZ2UpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEFsbCBwYWdlcyBhcmUgaXNvbGF0ZWQgYW5kIGxvY2tlZCBzbyBhbm9uX3ZtYSBybWFwCisJICogY2FuJ3QgcnVuIGFueW1vcmUuCisJICovCisJYW5vbl92bWFfdW5sb2NrKHZtYS0+YW5vbl92bWEpOworCisJX19jb2xsYXBzZV9odWdlX3BhZ2VfY29weShwdGUsIG5ld19wYWdlLCB2bWEsIGFkZHJlc3MsIHB0bCk7CisJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOworCXBndGFibGUgPSBwbWRfcGd0YWJsZShfcG1kKTsKKwlWTV9CVUdfT04ocGFnZV9jb3VudChwZ3RhYmxlKSAhPSAxKTsKKwlWTV9CVUdfT04ocGFnZV9tYXBjb3VudChwZ3RhYmxlKSAhPSAwKTsKKworCV9wbWQgPSBta19wbWQobmV3X3BhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKKwlfcG1kID0gbWF5YmVfcG1kX21rd3JpdGUocG1kX21rZGlydHkoX3BtZCksIHZtYSk7CisJX3BtZCA9IHBtZF9ta2h1Z2UoX3BtZCk7CisKKwkvKgorCSAqIHNwaW5fbG9jaygpIGJlbG93IGlzIG5vdCB0aGUgZXF1aXZhbGVudCBvZiBzbXBfd21iKCksIHNvCisJICogdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGNvcHlfaHVnZV9wYWdlIHdyaXRlcyB0byBiZWNvbWUKKwkgKiB2aXNpYmxlIGFmdGVyIHRoZSBzZXRfcG1kX2F0KCkgd3JpdGUuCisJICovCisJc21wX3dtYigpOworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlCVUdfT04oIXBtZF9ub25lKCpwbWQpKTsKKwlwYWdlX2FkZF9uZXdfYW5vbl9ybWFwKG5ld19wYWdlLCB2bWEsIGFkZHJlc3MpOworCXNldF9wbWRfYXQobW0sIGFkZHJlc3MsIHBtZCwgX3BtZCk7CisJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIGVudHJ5KTsKKwlwcmVwYXJlX3BtZF9odWdlX3B0ZShwZ3RhYmxlLCBtbSk7CisJbW0tPm5yX3B0ZXMtLTsKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisKKyNpZm5kZWYgQ09ORklHX05VTUEKKwkqaHBhZ2UgPSBOVUxMOworI2VuZGlmCisJa2h1Z2VwYWdlZF9wYWdlc19jb2xsYXBzZWQrKzsKK291dF91cF93cml0ZToKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm47CisKK291dDoKKyNpZmRlZiBDT05GSUdfTlVNQQorCXB1dF9wYWdlKG5ld19wYWdlKTsKKyNlbmRpZgorCWdvdG8gb3V0X3VwX3dyaXRlOworfQorCitzdGF0aWMgaW50IGtodWdlcGFnZWRfc2Nhbl9wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJICAgICAgIHN0cnVjdCBwYWdlICoqaHBhZ2UpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZSwgKl9wdGU7CisJaW50IHJldCA9IDAsIHJlZmVyZW5jZWQgPSAwLCBub25lID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIF9hZGRyZXNzOworCXNwaW5sb2NrX3QgKnB0bDsKKworCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOworCWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisJCWdvdG8gb3V0OworCisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCWlmICghcHVkX3ByZXNlbnQoKnB1ZCkpCisJCWdvdG8gb3V0OworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCWlmICghcG1kX3ByZXNlbnQoKnBtZCkgfHwgcG1kX3RyYW5zX2h1Z2UoKnBtZCkpCisJCWdvdG8gb3V0OworCisJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmcHRsKTsKKwlmb3IgKF9hZGRyZXNzID0gYWRkcmVzcywgX3B0ZSA9IHB0ZTsgX3B0ZSA8IHB0ZStIUEFHRV9QTURfTlI7CisJICAgICBfcHRlKyssIF9hZGRyZXNzICs9IFBBR0VfU0laRSkgeworCQlwdGVfdCBwdGV2YWwgPSAqX3B0ZTsKKwkJaWYgKHB0ZV9ub25lKHB0ZXZhbCkpIHsKKwkJCWlmICgrK25vbmUgPD0ga2h1Z2VwYWdlZF9tYXhfcHRlc19ub25lKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWdvdG8gb3V0X3VubWFwOworCQl9CisJCWlmICghcHRlX3ByZXNlbnQocHRldmFsKSB8fCAhcHRlX3dyaXRlKHB0ZXZhbCkpCisJCQlnb3RvIG91dF91bm1hcDsKKwkJcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgX2FkZHJlc3MsIHB0ZXZhbCk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlnb3RvIG91dF91bm1hcDsKKwkJVk1fQlVHX09OKFBhZ2VDb21wb3VuZChwYWdlKSk7CisJCWlmICghUGFnZUxSVShwYWdlKSB8fCBQYWdlTG9ja2VkKHBhZ2UpIHx8ICFQYWdlQW5vbihwYWdlKSkKKwkJCWdvdG8gb3V0X3VubWFwOworCQkvKiBjYW5ub3QgdXNlIG1hcGNvdW50OiBjYW4ndCBjb2xsYXBzZSBpZiB0aGVyZSdzIGEgZ3VwIHBpbiAqLworCQlpZiAocGFnZV9jb3VudChwYWdlKSAhPSAxKQorCQkJZ290byBvdXRfdW5tYXA7CisJCWlmIChwdGVfeW91bmcocHRldmFsKSB8fCBQYWdlUmVmZXJlbmNlZChwYWdlKSB8fAorCQkgICAgbW11X25vdGlmaWVyX3Rlc3RfeW91bmcodm1hLT52bV9tbSwgYWRkcmVzcykpCisJCQlyZWZlcmVuY2VkID0gMTsKKwl9CisJaWYgKHJlZmVyZW5jZWQpCisJCXJldCA9IDE7CitvdXRfdW5tYXA6CisJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CisJaWYgKHJldCkKKwkJLyogY29sbGFwc2VfaHVnZV9wYWdlIHdpbGwgcmV0dXJuIHdpdGggdGhlIG1tYXBfc2VtIHJlbGVhc2VkICovCisJCWNvbGxhcHNlX2h1Z2VfcGFnZShtbSwgYWRkcmVzcywgaHBhZ2UsIHZtYSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29sbGVjdF9tbV9zbG90KHN0cnVjdCBtbV9zbG90ICptbV9zbG90KQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gbW1fc2xvdC0+bW07CisKKwlWTV9CVUdfT04oIXNwaW5faXNfbG9ja2VkKCZraHVnZXBhZ2VkX21tX2xvY2spKTsKKworCWlmIChraHVnZXBhZ2VkX3Rlc3RfZXhpdChtbSkpIHsKKwkJLyogZnJlZSBtbV9zbG90ICovCisJCWhsaXN0X2RlbCgmbW1fc2xvdC0+aGFzaCk7CisJCWxpc3RfZGVsKCZtbV9zbG90LT5tbV9ub2RlKTsKKworCQkvKgorCQkgKiBOb3Qgc3RyaWN0bHkgbmVlZGVkIGJlY2F1c2UgdGhlIG1tIGV4aXRlZCBhbHJlYWR5LgorCQkgKgorCQkgKiBjbGVhcl9iaXQoTU1GX1ZNX0hVR0VQQUdFLCAmbW0tPmZsYWdzKTsKKwkJICovCisKKwkJLyoga2h1Z2VwYWdlZF9tbV9sb2NrIGFjdHVhbGx5IG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBiZWxvdyAqLworCQlmcmVlX21tX3Nsb3QobW1fc2xvdCk7CisJCW1tZHJvcChtbSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGtodWdlcGFnZWRfc2Nhbl9tbV9zbG90KHVuc2lnbmVkIGludCBwYWdlcywKKwkJCQkJICAgIHN0cnVjdCBwYWdlICoqaHBhZ2UpCit7CisJc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3Q7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJaW50IHByb2dyZXNzID0gMDsKKworCVZNX0JVR19PTighcGFnZXMpOworCVZNX0JVR19PTighc3Bpbl9pc19sb2NrZWQoJmtodWdlcGFnZWRfbW1fbG9jaykpOworCisJaWYgKGtodWdlcGFnZWRfc2Nhbi5tbV9zbG90KQorCQltbV9zbG90ID0ga2h1Z2VwYWdlZF9zY2FuLm1tX3Nsb3Q7CisJZWxzZSB7CisJCW1tX3Nsb3QgPSBsaXN0X2VudHJ5KGtodWdlcGFnZWRfc2Nhbi5tbV9oZWFkLm5leHQsCisJCQkJICAgICBzdHJ1Y3QgbW1fc2xvdCwgbW1fbm9kZSk7CisJCWtodWdlcGFnZWRfc2Nhbi5hZGRyZXNzID0gMDsKKwkJa2h1Z2VwYWdlZF9zY2FuLm1tX3Nsb3QgPSBtbV9zbG90OworCX0KKwlzcGluX3VubG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKworCW1tID0gbW1fc2xvdC0+bW07CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWlmICh1bmxpa2VseShraHVnZXBhZ2VkX3Rlc3RfZXhpdChtbSkpKQorCQl2bWEgPSBOVUxMOworCWVsc2UKKwkJdm1hID0gZmluZF92bWEobW0sIGtodWdlcGFnZWRfc2Nhbi5hZGRyZXNzKTsKKworCXByb2dyZXNzKys7CisJZm9yICg7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisJCXVuc2lnbmVkIGxvbmcgaHN0YXJ0LCBoZW5kOworCisJCWNvbmRfcmVzY2hlZCgpOworCQlpZiAodW5saWtlbHkoa2h1Z2VwYWdlZF90ZXN0X2V4aXQobW0pKSkgeworCQkJcHJvZ3Jlc3MrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCghKHZtYS0+dm1fZmxhZ3MgJiBWTV9IVUdFUEFHRSkgJiYKKwkJICAgICAha2h1Z2VwYWdlZF9hbHdheXMoKSkgfHwKKwkJICAgICh2bWEtPnZtX2ZsYWdzICYgVk1fTk9IVUdFUEFHRSkpIHsKKwkJCXByb2dyZXNzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFZNX1BGTk1BUCB2bWFzIG1heSBoYXZlIHZtX29wcyBudWxsIGJ1dCB2bV9maWxlIHNldCAqLworCQlpZiAoIXZtYS0+YW5vbl92bWEgfHwgdm1hLT52bV9vcHMgfHwgdm1hLT52bV9maWxlKSB7CisJCQlraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyA9IHZtYS0+dm1fZW5kOworCQkJcHJvZ3Jlc3MrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCVZNX0JVR19PTihpc19saW5lYXJfcGZuX21hcHBpbmcodm1hKSB8fCBpc19wZm5fbWFwcGluZyh2bWEpKTsKKworCQloc3RhcnQgPSAodm1hLT52bV9zdGFydCArIH5IUEFHRV9QTURfTUFTSykgJiBIUEFHRV9QTURfTUFTSzsKKwkJaGVuZCA9IHZtYS0+dm1fZW5kICYgSFBBR0VfUE1EX01BU0s7CisJCWlmIChoc3RhcnQgPj0gaGVuZCkgeworCQkJcHJvZ3Jlc3MrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyA8IGhzdGFydCkKKwkJCWtodWdlcGFnZWRfc2Nhbi5hZGRyZXNzID0gaHN0YXJ0OworCQlpZiAoa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MgPiBoZW5kKSB7CisJCQlraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyA9IGhlbmQgKyBIUEFHRV9QTURfU0laRTsKKwkJCXByb2dyZXNzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlCVUdfT04oa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spOworCisJCXdoaWxlIChraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyA8IGhlbmQpIHsKKwkJCWludCByZXQ7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWlmICh1bmxpa2VseShraHVnZXBhZ2VkX3Rlc3RfZXhpdChtbSkpKQorCQkJCWdvdG8gYnJlYWtvdXRlcmxvb3A7CisKKwkJCVZNX0JVR19PTihraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyA8IGhzdGFydCB8fAorCQkJCSAga2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSA+CisJCQkJICBoZW5kKTsKKwkJCXJldCA9IGtodWdlcGFnZWRfc2Nhbl9wbWQobW0sIHZtYSwKKwkJCQkJCSAga2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MsCisJCQkJCQkgIGhwYWdlKTsKKwkJCS8qIG1vdmUgdG8gbmV4dCBhZGRyZXNzICovCisJCQlraHVnZXBhZ2VkX3NjYW4uYWRkcmVzcyArPSBIUEFHRV9QTURfU0laRTsKKwkJCXByb2dyZXNzICs9IEhQQUdFX1BNRF9OUjsKKwkJCWlmIChyZXQpCisJCQkJLyogd2UgcmVsZWFzZWQgbW1hcF9zZW0gc28gYnJlYWsgbG9vcCAqLworCQkJCWdvdG8gYnJlYWtvdXRlcmxvb3BfbW1hcF9zZW07CisJCQlpZiAocHJvZ3Jlc3MgPj0gcGFnZXMpCisJCQkJZ290byBicmVha291dGVybG9vcDsKKwkJfQorCX0KK2JyZWFrb3V0ZXJsb29wOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7IC8qIGV4aXRfbW1hcCB3aWxsIGRlc3Ryb3kgcHRlcyBhZnRlciB0aGlzICovCiticmVha291dGVybG9vcF9tbWFwX3NlbToKKworCXNwaW5fbG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKwlCVUdfT04oa2h1Z2VwYWdlZF9zY2FuLm1tX3Nsb3QgIT0gbW1fc2xvdCk7CisJLyoKKwkgKiBSZWxlYXNlIHRoZSBjdXJyZW50IG1tX3Nsb3QgaWYgdGhpcyBtbSBpcyBhYm91dCB0byBkaWUsIG9yCisJICogaWYgd2Ugc2Nhbm5lZCBhbGwgdm1hcyBvZiB0aGlzIG1tLgorCSAqLworCWlmIChraHVnZXBhZ2VkX3Rlc3RfZXhpdChtbSkgfHwgIXZtYSkgeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCBpZiBtbV91c2VycyBpcyByZWFjaGluZyB6ZXJvIHdoaWxlCisJCSAqIGtodWdlcGFnZWQgcnVucyBoZXJlLCBraHVnZXBhZ2VkX2V4aXQgd2lsbCBmaW5kCisJCSAqIG1tX3Nsb3Qgbm90IHBvaW50aW5nIHRvIHRoZSBleGl0aW5nIG1tLgorCQkgKi8KKwkJaWYgKG1tX3Nsb3QtPm1tX25vZGUubmV4dCAhPSAma2h1Z2VwYWdlZF9zY2FuLm1tX2hlYWQpIHsKKwkJCWtodWdlcGFnZWRfc2Nhbi5tbV9zbG90ID0gbGlzdF9lbnRyeSgKKwkJCQltbV9zbG90LT5tbV9ub2RlLm5leHQsCisJCQkJc3RydWN0IG1tX3Nsb3QsIG1tX25vZGUpOworCQkJa2h1Z2VwYWdlZF9zY2FuLmFkZHJlc3MgPSAwOworCQl9IGVsc2UgeworCQkJa2h1Z2VwYWdlZF9zY2FuLm1tX3Nsb3QgPSBOVUxMOworCQkJa2h1Z2VwYWdlZF9mdWxsX3NjYW5zKys7CisJCX0KKworCQljb2xsZWN0X21tX3Nsb3QobW1fc2xvdCk7CisJfQorCisJcmV0dXJuIHByb2dyZXNzOworfQorCitzdGF0aWMgaW50IGtodWdlcGFnZWRfaGFzX3dvcmsodm9pZCkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmtodWdlcGFnZWRfc2Nhbi5tbV9oZWFkKSAmJgorCQlraHVnZXBhZ2VkX2VuYWJsZWQoKTsKK30KKworc3RhdGljIGludCBraHVnZXBhZ2VkX3dhaXRfZXZlbnQodm9pZCkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmtodWdlcGFnZWRfc2Nhbi5tbV9oZWFkKSB8fAorCQkha2h1Z2VwYWdlZF9lbmFibGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIGtodWdlcGFnZWRfZG9fc2NhbihzdHJ1Y3QgcGFnZSAqKmhwYWdlKQoreworCXVuc2lnbmVkIGludCBwcm9ncmVzcyA9IDAsIHBhc3NfdGhyb3VnaF9oZWFkID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZXMgPSBraHVnZXBhZ2VkX3BhZ2VzX3RvX3NjYW47CisKKwliYXJyaWVyKCk7IC8qIHdyaXRlIGtodWdlcGFnZWRfcGFnZXNfdG9fc2NhbiB0byBsb2NhbCBzdGFjayAqLworCisJd2hpbGUgKHByb2dyZXNzIDwgcGFnZXMpIHsKKwkJY29uZF9yZXNjaGVkKCk7CisKKyNpZm5kZWYgQ09ORklHX05VTUEKKwkJaWYgKCEqaHBhZ2UpIHsKKwkJCSpocGFnZSA9IGFsbG9jX2h1Z2VwYWdlKGtodWdlcGFnZWRfZGVmcmFnKCkpOworCQkJaWYgKHVubGlrZWx5KCEqaHBhZ2UpKQorCQkJCWJyZWFrOworCQl9CisjZWxzZQorCQlpZiAoSVNfRVJSKCpocGFnZSkpCisJCQlicmVhazsKKyNlbmRpZgorCisJCWlmICh1bmxpa2VseShrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgZnJlZXppbmcoY3VycmVudCkpKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOworCQlpZiAoIWtodWdlcGFnZWRfc2Nhbi5tbV9zbG90KQorCQkJcGFzc190aHJvdWdoX2hlYWQrKzsKKwkJaWYgKGtodWdlcGFnZWRfaGFzX3dvcmsoKSAmJgorCQkgICAgcGFzc190aHJvdWdoX2hlYWQgPCAyKQorCQkJcHJvZ3Jlc3MgKz0ga2h1Z2VwYWdlZF9zY2FuX21tX3Nsb3QocGFnZXMgLSBwcm9ncmVzcywKKwkJCQkJCQkgICAgaHBhZ2UpOworCQllbHNlCisJCQlwcm9ncmVzcyA9IHBhZ2VzOworCQlzcGluX3VubG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGtodWdlcGFnZWRfYWxsb2Nfc2xlZXAodm9pZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlhZGRfd2FpdF9xdWV1ZSgma2h1Z2VwYWdlZF93YWl0LCAmd2FpdCk7CisJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAorCQltc2Vjc190b19qaWZmaWVzKAorCQkJa2h1Z2VwYWdlZF9hbGxvY19zbGVlcF9taWxsaXNlY3MpKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgma2h1Z2VwYWdlZF93YWl0LCAmd2FpdCk7Cit9CisKKyNpZm5kZWYgQ09ORklHX05VTUEKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqa2h1Z2VwYWdlZF9hbGxvY19odWdlcGFnZSh2b2lkKQoreworCXN0cnVjdCBwYWdlICpocGFnZTsKKworCWRvIHsKKwkJaHBhZ2UgPSBhbGxvY19odWdlcGFnZShraHVnZXBhZ2VkX2RlZnJhZygpKTsKKwkJaWYgKCFocGFnZSkKKwkJCWtodWdlcGFnZWRfYWxsb2Nfc2xlZXAoKTsKKwl9IHdoaWxlICh1bmxpa2VseSghaHBhZ2UpICYmCisJCSBsaWtlbHkoa2h1Z2VwYWdlZF9lbmFibGVkKCkpKTsKKwlyZXR1cm4gaHBhZ2U7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga2h1Z2VwYWdlZF9sb29wKHZvaWQpCit7CisJc3RydWN0IHBhZ2UgKmhwYWdlOworCisjaWZkZWYgQ09ORklHX05VTUEKKwlocGFnZSA9IE5VTEw7CisjZW5kaWYKKwl3aGlsZSAobGlrZWx5KGtodWdlcGFnZWRfZW5hYmxlZCgpKSkgeworI2lmbmRlZiBDT05GSUdfTlVNQQorCQlocGFnZSA9IGtodWdlcGFnZWRfYWxsb2NfaHVnZXBhZ2UoKTsKKwkJaWYgKHVubGlrZWx5KCFocGFnZSkpCisJCQlicmVhazsKKyNlbHNlCisJCWlmIChJU19FUlIoaHBhZ2UpKSB7CisJCQlraHVnZXBhZ2VkX2FsbG9jX3NsZWVwKCk7CisJCQlocGFnZSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCisJCWtodWdlcGFnZWRfZG9fc2NhbigmaHBhZ2UpOworI2lmbmRlZiBDT05GSUdfTlVNQQorCQlpZiAoaHBhZ2UpCisJCQlwdXRfcGFnZShocGFnZSk7CisjZW5kaWYKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCQlpZiAodW5saWtlbHkoa3RocmVhZF9zaG91bGRfc3RvcCgpKSkKKwkJCWJyZWFrOworCQlpZiAoa2h1Z2VwYWdlZF9oYXNfd29yaygpKSB7CisJCQlERUZJTkVfV0FJVCh3YWl0KTsKKwkJCWlmICgha2h1Z2VwYWdlZF9zY2FuX3NsZWVwX21pbGxpc2VjcykKKwkJCQljb250aW51ZTsKKwkJCWFkZF93YWl0X3F1ZXVlKCZraHVnZXBhZ2VkX3dhaXQsICZ3YWl0KTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgKKwkJCQltc2Vjc190b19qaWZmaWVzKAorCQkJCQlraHVnZXBhZ2VkX3NjYW5fc2xlZXBfbWlsbGlzZWNzKSk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2h1Z2VwYWdlZF93YWl0LCAmd2FpdCk7CisJCX0gZWxzZSBpZiAoa2h1Z2VwYWdlZF9lbmFibGVkKCkpCisJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZShraHVnZXBhZ2VkX3dhaXQsCisJCQkJCSAgICAga2h1Z2VwYWdlZF93YWl0X2V2ZW50KCkpOworCX0KK30KKworc3RhdGljIGludCBraHVnZXBhZ2VkKHZvaWQgKm5vbmUpCit7CisJc3RydWN0IG1tX3Nsb3QgKm1tX3Nsb3Q7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxOSk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCBzdGFydF9raHVnZXBhZ2VkKCkgKi8KKwltdXRleF9sb2NrKCZraHVnZXBhZ2VkX211dGV4KTsKKworCWZvciAoOzspIHsKKwkJbXV0ZXhfdW5sb2NrKCZraHVnZXBhZ2VkX211dGV4KTsKKwkJQlVHX09OKGtodWdlcGFnZWRfdGhyZWFkICE9IGN1cnJlbnQpOworCQlraHVnZXBhZ2VkX2xvb3AoKTsKKwkJQlVHX09OKGtodWdlcGFnZWRfdGhyZWFkICE9IGN1cnJlbnQpOworCisJCW11dGV4X2xvY2soJmtodWdlcGFnZWRfbXV0ZXgpOworCQlpZiAoIWtodWdlcGFnZWRfZW5hYmxlZCgpKQorCQkJYnJlYWs7CisJCWlmICh1bmxpa2VseShrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl9sb2NrKCZraHVnZXBhZ2VkX21tX2xvY2spOworCW1tX3Nsb3QgPSBraHVnZXBhZ2VkX3NjYW4ubW1fc2xvdDsKKwlraHVnZXBhZ2VkX3NjYW4ubW1fc2xvdCA9IE5VTEw7CisJaWYgKG1tX3Nsb3QpCisJCWNvbGxlY3RfbW1fc2xvdChtbV9zbG90KTsKKwlzcGluX3VubG9jaygma2h1Z2VwYWdlZF9tbV9sb2NrKTsKKworCWtodWdlcGFnZWRfdGhyZWFkID0gTlVMTDsKKwltdXRleF91bmxvY2soJmtodWdlcGFnZWRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19zcGxpdF9odWdlX3BhZ2VfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlpZiAodW5saWtlbHkoIXBtZF90cmFuc19odWdlKCpwbWQpKSkgeworCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJCXJldHVybjsKKwl9CisJcGFnZSA9IHBtZF9wYWdlKCpwbWQpOworCVZNX0JVR19PTighcGFnZV9jb3VudChwYWdlKSk7CisJZ2V0X3BhZ2UocGFnZSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCisJc3BsaXRfaHVnZV9wYWdlKHBhZ2UpOworCisJcHV0X3BhZ2UocGFnZSk7CisJQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTsKK30KKworc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wYWdlX2FkZHJlc3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKworCVZNX0JVR19PTighKGFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spKTsKKworCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOworCWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisJCXJldHVybjsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwlpZiAoIXB1ZF9wcmVzZW50KCpwdWQpKQorCQlyZXR1cm47CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKKwkJcmV0dXJuOworCS8qCisJICogQ2FsbGVyIGhvbGRzIHRoZSBtbWFwX3NlbSB3cml0ZSBtb2RlLCBzbyBhIGh1Z2UgcG1kIGNhbm5vdAorCSAqIG1hdGVyaWFsaXplIGZyb20gdW5kZXIgdXMuCisJICovCisJc3BsaXRfaHVnZV9wYWdlX3BtZChtbSwgcG1kKTsKK30KKwordm9pZCBfX3ZtYV9hZGp1c3RfdHJhbnNfaHVnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQsCisJCQkgICAgIGxvbmcgYWRqdXN0X25leHQpCit7CisJLyoKKwkgKiBJZiB0aGUgbmV3IHN0YXJ0IGFkZHJlc3MgaXNuJ3QgaHBhZ2UgYWxpZ25lZCBhbmQgaXQgY291bGQKKwkgKiBwcmV2aW91c2x5IGNvbnRhaW4gYW4gaHVnZXBhZ2U6IGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQKKwkgKiBhbiBodWdlIHBtZC4KKwkgKi8KKwlpZiAoc3RhcnQgJiB+SFBBR0VfUE1EX01BU0sgJiYKKwkgICAgKHN0YXJ0ICYgSFBBR0VfUE1EX01BU0spID49IHZtYS0+dm1fc3RhcnQgJiYKKwkgICAgKHN0YXJ0ICYgSFBBR0VfUE1EX01BU0spICsgSFBBR0VfUE1EX1NJWkUgPD0gdm1hLT52bV9lbmQpCisJCXNwbGl0X2h1Z2VfcGFnZV9hZGRyZXNzKHZtYS0+dm1fbW0sIHN0YXJ0KTsKKworCS8qCisJICogSWYgdGhlIG5ldyBlbmQgYWRkcmVzcyBpc24ndCBocGFnZSBhbGlnbmVkIGFuZCBpdCBjb3VsZAorCSAqIHByZXZpb3VzbHkgY29udGFpbiBhbiBodWdlcGFnZTogY2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdAorCSAqIGFuIGh1Z2UgcG1kLgorCSAqLworCWlmIChlbmQgJiB+SFBBR0VfUE1EX01BU0sgJiYKKwkgICAgKGVuZCAmIEhQQUdFX1BNRF9NQVNLKSA+PSB2bWEtPnZtX3N0YXJ0ICYmCisJICAgIChlbmQgJiBIUEFHRV9QTURfTUFTSykgKyBIUEFHRV9QTURfU0laRSA8PSB2bWEtPnZtX2VuZCkKKwkJc3BsaXRfaHVnZV9wYWdlX2FkZHJlc3Modm1hLT52bV9tbSwgZW5kKTsKKworCS8qCisJICogSWYgd2UncmUgYWxzbyB1cGRhdGluZyB0aGUgdm1hLT52bV9uZXh0LT52bV9zdGFydCwgaWYgdGhlIG5ldworCSAqIHZtX25leHQtPnZtX3N0YXJ0IGlzbid0IHBhZ2UgYWxpZ25lZCBhbmQgaXQgY291bGQgcHJldmlvdXNseQorCSAqIGNvbnRhaW4gYW4gaHVnZXBhZ2U6IGNoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgYW4gaHVnZSBwbWQuCisJICovCisJaWYgKGFkanVzdF9uZXh0ID4gMCkgeworCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm5leHQgPSB2bWEtPnZtX25leHQ7CisJCXVuc2lnbmVkIGxvbmcgbnN0YXJ0ID0gbmV4dC0+dm1fc3RhcnQ7CisJCW5zdGFydCArPSBhZGp1c3RfbmV4dCA8PCBQQUdFX1NISUZUOworCQlpZiAobnN0YXJ0ICYgfkhQQUdFX1BNRF9NQVNLICYmCisJCSAgICAobnN0YXJ0ICYgSFBBR0VfUE1EX01BU0spID49IG5leHQtPnZtX3N0YXJ0ICYmCisJCSAgICAobnN0YXJ0ICYgSFBBR0VfUE1EX01BU0spICsgSFBBR0VfUE1EX1NJWkUgPD0gbmV4dC0+dm1fZW5kKQorCQkJc3BsaXRfaHVnZV9wYWdlX2FkZHJlc3MobmV4dC0+dm1fbW0sIG5zdGFydCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDg1ODU1MjQuLmJiMGI3YzEgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTM5NCw3MSArMzk0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfZ2lnYW50aWNfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzeikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcGFnZSAqcCA9IHBhZ2U7Ci0KLQltaWdodF9zbGVlcCgpOwotCWZvciAoaSA9IDA7IGkgPCBzei9QQUdFX1NJWkU7IGkrKywgcCA9IG1lbV9tYXBfbmV4dChwLCBwYWdlLCBpKSkgewotCQljb25kX3Jlc2NoZWQoKTsKLQkJY2xlYXJfdXNlcl9oaWdocGFnZShwLCBhZGRyICsgaSAqIFBBR0VfU0laRSk7Ci0JfQotfQotc3RhdGljIHZvaWQgY2xlYXJfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHN6KQotewotCWludCBpOwotCi0JaWYgKHVubGlrZWx5KHN6L1BBR0VfU0laRSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKLQkJY2xlYXJfZ2lnYW50aWNfcGFnZShwYWdlLCBhZGRyLCBzeik7Ci0JCXJldHVybjsKLQl9Ci0KLQltaWdodF9zbGVlcCgpOwotCWZvciAoaSA9IDA7IGkgPCBzei9QQUdFX1NJWkU7IGkrKykgewotCQljb25kX3Jlc2NoZWQoKTsKLQkJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlICsgaSwgYWRkciArIGkgKiBQQUdFX1NJWkUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY29weV91c2VyX2dpZ2FudGljX3BhZ2Uoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKLQlzdHJ1Y3QgcGFnZSAqZHN0X2Jhc2UgPSBkc3Q7Ci0Jc3RydWN0IHBhZ2UgKnNyY19iYXNlID0gc3JjOwotCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCk7ICkgewotCQljb25kX3Jlc2NoZWQoKTsKLQkJY29weV91c2VyX2hpZ2hwYWdlKGRzdCwgc3JjLCBhZGRyICsgaSpQQUdFX1NJWkUsIHZtYSk7Ci0KLQkJaSsrOwotCQlkc3QgPSBtZW1fbWFwX25leHQoZHN0LCBkc3RfYmFzZSwgaSk7Ci0JCXNyYyA9IG1lbV9tYXBfbmV4dChzcmMsIHNyY19iYXNlLCBpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfdXNlcl9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKmRzdCwgc3RydWN0IHBhZ2UgKnNyYywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV92bWEodm1hKTsKLQotCWlmICh1bmxpa2VseShwYWdlc19wZXJfaHVnZV9wYWdlKGgpID4gTUFYX09SREVSX05SX1BBR0VTKSkgewotCQljb3B5X3VzZXJfZ2lnYW50aWNfcGFnZShkc3QsIHNyYywgYWRkciwgdm1hKTsKLQkJcmV0dXJuOwotCX0KLQotCW1pZ2h0X3NsZWVwKCk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCk7IGkrKykgewotCQljb25kX3Jlc2NoZWQoKTsKLQkJY29weV91c2VyX2hpZ2hwYWdlKGRzdCArIGksIHNyYyArIGksIGFkZHIgKyBpKlBBR0VfU0laRSwgdm1hKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIGNvcHlfZ2lnYW50aWNfcGFnZShzdHJ1Y3QgcGFnZSAqZHN0LCBzdHJ1Y3QgcGFnZSAqc3JjKQogewogCWludCBpOwpAQCAtMTQyOCw2ICsxMzYzLDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgbnJfaHVnZV9wYWdlcyk7CiB9CisKIHN0YXRpYyBzc2l6ZV90IG5yX2h1Z2VwYWdlc19zdG9yZV9jb21tb24oYm9vbCBvYmV5X21lbXBvbGljeSwKIAkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCkBAIC0xNDQwLDkgKzEzNzYsMTQgQEAKIAogCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZjb3VudCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJaCA9IGtvYmpfdG9faHN0YXRlKGtvYmosICZuaWQpOworCWlmIChoLT5vcmRlciA+PSBNQVhfT1JERVIpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKG5pZCA9PSBOVU1BX05PX05PREUpIHsKIAkJLyoKIAkJICogZ2xvYmFsIGhzdGF0ZSBhdHRyaWJ1dGUKQEAgLTE0NjgsNiArMTQwOSw5IEBACiAJCU5PREVNQVNLX0ZSRUUobm9kZXNfYWxsb3dlZCk7CiAKIAlyZXR1cm4gbGVuOworb3V0OgorCU5PREVNQVNLX0ZSRUUobm9kZXNfYWxsb3dlZCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNzaXplX3QgbnJfaHVnZXBhZ2VzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC0xNTEwLDYgKzE0NTQsNyBAQAogCXN0cnVjdCBoc3RhdGUgKmggPSBrb2JqX3RvX2hzdGF0ZShrb2JqLCBOVUxMKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGgtPm5yX292ZXJjb21taXRfaHVnZV9wYWdlcyk7CiB9CisKIHN0YXRpYyBzc2l6ZV90IG5yX292ZXJjb21taXRfaHVnZXBhZ2VzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewpAQCAtMTUxNyw5ICsxNDYyLDEyIEBACiAJdW5zaWduZWQgbG9uZyBpbnB1dDsKIAlzdHJ1Y3QgaHN0YXRlICpoID0ga29ial90b19oc3RhdGUoa29iaiwgTlVMTCk7CiAKKwlpZiAoaC0+b3JkZXIgPj0gTUFYX09SREVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZpbnB1dCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIDA7CisJCXJldHVybiBlcnI7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CiAJaC0+bnJfb3ZlcmNvbW1pdF9odWdlX3BhZ2VzID0gaW5wdXQ7CkBAIC0xOTIyLDEzICsxODcwLDE5IEBACiB7CiAJc3RydWN0IGhzdGF0ZSAqaCA9ICZkZWZhdWx0X2hzdGF0ZTsKIAl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgcmV0OwogCiAJaWYgKCF3cml0ZSkKIAkJdG1wID0gaC0+bWF4X2h1Z2VfcGFnZXM7CiAKKwlpZiAod3JpdGUgJiYgaC0+b3JkZXIgPj0gTUFYX09SREVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXRhYmxlLT5kYXRhID0gJnRtcDsKIAl0YWJsZS0+bWF4bGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCXByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJcmV0ID0gcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAogCWlmICh3cml0ZSkgewogCQlOT0RFTUFTS19BTExPQyhub2RlbWFza190LCBub2Rlc19hbGxvd2VkLApAQCAtMTk0Myw4ICsxODk3LDggQEAKIAkJaWYgKG5vZGVzX2FsbG93ZWQgIT0gJm5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKQogCQkJTk9ERU1BU0tfRlJFRShub2Rlc19hbGxvd2VkKTsKIAl9Ci0KLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgaHVnZXRsYl9zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLApAQCAtMTk4MiwyMSArMTkzNiwyNyBAQAogewogCXN0cnVjdCBoc3RhdGUgKmggPSAmZGVmYXVsdF9oc3RhdGU7CiAJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHJldDsKIAogCWlmICghd3JpdGUpCiAJCXRtcCA9IGgtPm5yX292ZXJjb21taXRfaHVnZV9wYWdlczsKIAorCWlmICh3cml0ZSAmJiBoLT5vcmRlciA+PSBNQVhfT1JERVIpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGFibGUtPmRhdGEgPSAmdG1wOwogCXRhYmxlLT5tYXhsZW4gPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JcHJvY19kb3Vsb25ndmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJaWYgKHdyaXRlKSB7CiAJCXNwaW5fbG9jaygmaHVnZXRsYl9sb2NrKTsKIAkJaC0+bnJfb3ZlcmNvbW1pdF9odWdlX3BhZ2VzID0gdG1wOwogCQlzcGluX3VubG9jaygmaHVnZXRsYl9sb2NrKTsKIAl9Ci0KLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwpAQCAtMjQ1NCw3ICsyNDE0LDggQEAKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIAl9CiAKLQljb3B5X3VzZXJfaHVnZV9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hKTsKKwljb3B5X3VzZXJfaHVnZV9wYWdlKG5ld19wYWdlLCBvbGRfcGFnZSwgYWRkcmVzcywgdm1hLAorCQkJICAgIHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCkpOwogCV9fU2V0UGFnZVVwdG9kYXRlKG5ld19wYWdlKTsKIAogCS8qCkBAIC0yNTU4LDcgKzI1MTksNyBAQAogCQkJcmV0ID0gLVBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQljbGVhcl9odWdlX3BhZ2UocGFnZSwgYWRkcmVzcywgaHVnZV9wYWdlX3NpemUoaCkpOworCQljbGVhcl9odWdlX3BhZ2UocGFnZSwgYWRkcmVzcywgcGFnZXNfcGVyX2h1Z2VfcGFnZShoKSk7CiAJCV9fU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCiAJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZU0hBUkUpIHsKZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IGRlZGIwYWYuLjRjOTg2MzAgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKKysrIGIvbW0vaW50ZXJuYWwuaApAQCAtMzksNiArMzksMTUgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaGlnaGVzdF9tZW1tYXBfcGZuOwogCisjaWZkZWYgQ09ORklHX1NNUAorZXh0ZXJuIGludCBwdXRiYWNrX2FjdGl2ZV9scnVfcGFnZShzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHB1dGJhY2tfYWN0aXZlX2xydV9wYWdlKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKgogICogaW4gbW0vdm1zY2FuLmM6CiAgKi8KQEAgLTEzNCw2ICsxNDMsMTAgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZtYV9hZGRyZXNzKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisjZW5kaWYKICNlbHNlIC8qICFDT05GSUdfTU1VICovCiBzdGF0aWMgaW5saW5lIGludCBpc19tbG9ja2VkX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnYsIHN0cnVjdCBwYWdlICpwKQogewpAQCAtMjQzLDcgKzI1Niw4IEBACiAKIGludCBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgZm9sbF9mbGFncywKLQkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFzKTsKKwkJICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFzLAorCQkgICAgIGludCAqbm9uYmxvY2tpbmcpOwogCiAjZGVmaW5lIFpPTkVfUkVDTEFJTV9OT1NDQU4JLTIKICNkZWZpbmUgWk9ORV9SRUNMQUlNX0ZVTEwJLTEKZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmMKaW5kZXggNDNiYzg5My4uYzJiMmE5NCAxMDA2NDQKLS0tIGEvbW0va3NtLmMKKysrIGIvbW0va3NtLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgva3NtLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC00MTEsNiArNDEyLDIwIEBACiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwYWdlICpwYWdlX3RyYW5zX2NvbXBvdW5kX2Fub24oc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKFBhZ2VUcmFuc0NvbXBvdW5kKHBhZ2UpKSB7CisJCXN0cnVjdCBwYWdlICpoZWFkID0gY29tcG91bmRfdHJhbnNfaGVhZChwYWdlKTsKKwkJLyoKKwkJICogaGVhZCBtYXkgYWN0dWFsbHkgYmUgc3BsaXR0ZWQgYW5kIGZyZWVkIGZyb20gdW5kZXIKKwkJICogdXMgYnV0IGl0J3Mgb2sgaGVyZS4KKwkJICovCisJCWlmIChQYWdlQW5vbihoZWFkKSkKKwkJCXJldHVybiBoZWFkOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlICpnZXRfbWVyZ2VhYmxlX3BhZ2Uoc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gcm1hcF9pdGVtLT5tbTsKQEAgLTQzMCw3ICs0NDUsNyBAQAogCXBhZ2UgPSBmb2xsb3dfcGFnZSh2bWEsIGFkZHIsIEZPTExfR0VUKTsKIAlpZiAoSVNfRVJSX09SX05VTEwocGFnZSkpCiAJCWdvdG8gb3V0OwotCWlmIChQYWdlQW5vbihwYWdlKSkgeworCWlmIChQYWdlQW5vbihwYWdlKSB8fCBwYWdlX3RyYW5zX2NvbXBvdW5kX2Fub24ocGFnZSkpIHsKIAkJZmx1c2hfYW5vbl9wYWdlKHZtYSwgcGFnZSwgYWRkcik7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCX0gZWxzZSB7CkBAIC03MDgsNiArNzIzLDcgQEAKIAlpZiAoYWRkciA9PSAtRUZBVUxUKQogCQlnb3RvIG91dDsKIAorCUJVR19PTihQYWdlVHJhbnNDb21wb3VuZChwYWdlKSk7CiAJcHRlcCA9IHBhZ2VfY2hlY2tfYWRkcmVzcyhwYWdlLCBtbSwgYWRkciwgJnB0bCwgMCk7CiAJaWYgKCFwdGVwKQogCQlnb3RvIG91dDsKQEAgLTc4Myw2ICs3OTksNyBAQAogCQlnb3RvIG91dDsKIAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKKwlCVUdfT04ocG1kX3RyYW5zX2h1Z2UoKnBtZCkpOwogCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCiAJCWdvdG8gb3V0OwogCkBAIC04MDAsNiArODE3LDggQEAKIAlzZXRfcHRlX2F0X25vdGlmeShtbSwgYWRkciwgcHRlcCwgbWtfcHRlKGtwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCkpOwogCiAJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKKwlpZiAoIXBhZ2VfbWFwcGVkKHBhZ2UpKQorCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCXB1dF9wYWdlKHBhZ2UpOwogCiAJcHRlX3VubWFwX3VubG9jayhwdGVwLCBwdGwpOwpAQCAtODA4LDYgKzgyNywzMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uX3NwbGl0KHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwYWdlICp0cmFuc2h1Z2VfaGVhZCA9IHBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbihwYWdlKTsKKwlpZiAodHJhbnNodWdlX2hlYWQpIHsKKwkJLyogR2V0IHRoZSByZWZlcmVuY2Ugb24gdGhlIGhlYWQgdG8gc3BsaXQgaXQuICovCisJCWlmIChnZXRfcGFnZV91bmxlc3NfemVybyh0cmFuc2h1Z2VfaGVhZCkpIHsKKwkJCS8qCisJCQkgKiBSZWNoZWNrIHdlIGdvdCB0aGUgcmVmZXJlbmNlIHdoaWxlIHRoZSBoZWFkCisJCQkgKiB3YXMgc3RpbGwgYW5vbnltb3VzLgorCQkJICovCisJCQlpZiAoUGFnZUFub24odHJhbnNodWdlX2hlYWQpKQorCQkJCXJldCA9IHNwbGl0X2h1Z2VfcGFnZSh0cmFuc2h1Z2VfaGVhZCk7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBSZXRyeSBsYXRlciBpZiBzcGxpdF9odWdlX3BhZ2UgcnVuCisJCQkJICogZnJvbSB1bmRlciB1cy4KKwkJCQkgKi8KKwkJCQlyZXQgPSAxOworCQkJcHV0X3BhZ2UodHJhbnNodWdlX2hlYWQpOworCQl9IGVsc2UKKwkJCS8qIFJldHJ5IGxhdGVyIGlmIHNwbGl0X2h1Z2VfcGFnZSBydW4gZnJvbSB1bmRlciB1cy4gKi8KKwkJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiB0cnlfdG9fbWVyZ2Vfb25lX3BhZ2UgLSB0YWtlIHR3byBwYWdlcyBhbmQgbWVyZ2UgdGhlbSBpbnRvIG9uZQogICogQHZtYTogdGhlIHZtYSB0aGF0IGhvbGRzIHRoZSBwdGUgcG9pbnRpbmcgdG8gcGFnZQpAQCAtODI4LDYgKzg3NCw5IEBACiAKIAlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fTUVSR0VBQkxFKSkKIAkJZ290byBvdXQ7CisJaWYgKFBhZ2VUcmFuc0NvbXBvdW5kKHBhZ2UpICYmIHBhZ2VfdHJhbnNfY29tcG91bmRfYW5vbl9zcGxpdChwYWdlKSkKKwkJZ290byBvdXQ7CisJQlVHX09OKFBhZ2VUcmFuc0NvbXBvdW5kKHBhZ2UpKTsKIAlpZiAoIVBhZ2VBbm9uKHBhZ2UpKQogCQlnb3RvIG91dDsKIApAQCAtMTI0Nyw2ICsxMjk2LDE4IEBACiAKIAlzbG90ID0ga3NtX3NjYW4ubW1fc2xvdDsKIAlpZiAoc2xvdCA9PSAma3NtX21tX2hlYWQpIHsKKwkJLyoKKwkJICogQSBudW1iZXIgb2YgcGFnZXMgY2FuIGhhbmcgYXJvdW5kIGluZGVmaW5pdGVseSBvbiBwZXItY3B1CisJCSAqIHBhZ2V2ZWNzLCByYWlzZWQgcGFnZSBjb3VudCBwcmV2ZW50aW5nIHdyaXRlX3Byb3RlY3RfcGFnZQorCQkgKiBmcm9tIG1lcmdpbmcgdGhlbS4gIFRob3VnaCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgbXVjaCwKKwkJICogaXQgaXMgcHV6emxpbmcgdG8gc2VlIHNvbWUgc3R1Y2sgaW4gcGFnZXNfdm9sYXRpbGUgdW50aWwKKwkJICogb3RoZXIgYWN0aXZpdHkgam9zdGxlcyB0aGVtIG91dCwgYW5kIHRoZXkgYWxzbyBwcmV2ZW50ZWQKKwkJICogTFRQJ3MgS1NNIHRlc3QgZnJvbSBzdWNjZWVkaW5nIGRldGVybWluaXN0aWNhbGx5OyBzbyBkcmFpbgorCQkgKiB0aGVtIGhlcmUgKGhlcmUgcmF0aGVyIHRoYW4gb24gZW50cnkgdG8ga3NtX2RvX3NjYW4oKSwKKwkJICogc28gd2UgZG9uJ3QgSVBJIHRvbyBvZnRlbiB3aGVuIHBhZ2VzX3RvX3NjYW4gaXMgc2V0IGxvdykuCisJCSAqLworCQlscnVfYWRkX2RyYWluX2FsbCgpOworCiAJCXJvb3RfdW5zdGFibGVfdHJlZSA9IFJCX1JPT1Q7CiAKIAkJc3Bpbl9sb2NrKCZrc21fbW1saXN0X2xvY2spOwpAQCAtMTI3Nyw3ICsxMzM4LDEzIEBACiAJCQlpZiAoa3NtX3Rlc3RfZXhpdChtbSkpCiAJCQkJYnJlYWs7CiAJCQkqcGFnZSA9IGZvbGxvd19wYWdlKHZtYSwga3NtX3NjYW4uYWRkcmVzcywgRk9MTF9HRVQpOwotCQkJaWYgKCFJU19FUlJfT1JfTlVMTCgqcGFnZSkgJiYgUGFnZUFub24oKnBhZ2UpKSB7CisJCQlpZiAoSVNfRVJSX09SX05VTEwoKnBhZ2UpKSB7CisJCQkJa3NtX3NjYW4uYWRkcmVzcyArPSBQQUdFX1NJWkU7CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoUGFnZUFub24oKnBhZ2UpIHx8CisJCQkgICAgcGFnZV90cmFuc19jb21wb3VuZF9hbm9uKCpwYWdlKSkgewogCQkJCWZsdXNoX2Fub25fcGFnZSh2bWEsICpwYWdlLCBrc21fc2Nhbi5hZGRyZXNzKTsKIAkJCQlmbHVzaF9kY2FjaGVfcGFnZSgqcGFnZSk7CiAJCQkJcm1hcF9pdGVtID0gZ2V0X25leHRfcm1hcF9pdGVtKHNsb3QsCkBAIC0xMjkxLDggKzEzNTgsNyBAQAogCQkJCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJCQkJcmV0dXJuIHJtYXBfaXRlbTsKIAkJCX0KLQkJCWlmICghSVNfRVJSX09SX05VTEwoKnBhZ2UpKQotCQkJCXB1dF9wYWdlKCpwYWdlKTsKKwkJCXB1dF9wYWdlKCpwYWdlKTsKIAkJCWtzbV9zY2FuLmFkZHJlc3MgKz0gUEFHRV9TSVpFOwogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KQEAgLTEzNTIsNyArMTQxOCw3IEBACiAJc3RydWN0IHJtYXBfaXRlbSAqcm1hcF9pdGVtOwogCXN0cnVjdCBwYWdlICp1bmluaXRpYWxpemVkX3ZhcihwYWdlKTsKIAotCXdoaWxlIChzY2FuX25wYWdlcy0tKSB7CisJd2hpbGUgKHNjYW5fbnBhZ2VzLS0gJiYgbGlrZWx5KCFmcmVlemluZyhjdXJyZW50KSkpIHsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCXJtYXBfaXRlbSA9IHNjYW5fZ2V0X25leHRfcm1hcF9pdGVtKCZwYWdlKTsKIAkJaWYgKCFybWFwX2l0ZW0pCkBAIC0xMzcwLDYgKzE0MzYsNyBAQAogCiBzdGF0aWMgaW50IGtzbV9zY2FuX3RocmVhZCh2b2lkICpub3RoaW5nKQogeworCXNldF9mcmVlemFibGUoKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDUpOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKQEAgLTEzNzgsMTEgKzE0NDUsMTMgQEAKIAkJCWtzbV9kb19zY2FuKGtzbV90aHJlYWRfcGFnZXNfdG9fc2Nhbik7CiAJCW11dGV4X3VubG9jaygma3NtX3RocmVhZF9tdXRleCk7CiAKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCiAJCWlmIChrc21kX3Nob3VsZF9ydW4oKSkgewogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoa3NtX3RocmVhZF9zbGVlcF9taWxsaXNlY3MpKTsKIAkJfSBlbHNlIHsKLQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShrc21fdGhyZWFkX3dhaXQsCisJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZShrc21fdGhyZWFkX3dhaXQsCiAJCQkJa3NtZF9zaG91bGRfcnVuKCkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCAzMTk1MjhiLi4yMjIxNDkxIDEwMDY0NAotLS0gYS9tbS9tYWR2aXNlLmMKKysrIGIvbW0vbWFkdmlzZS5jCkBAIC03MSw2ICs3MSwxMiBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAkJYnJlYWs7CisJY2FzZSBNQURWX0hVR0VQQUdFOgorCWNhc2UgTUFEVl9OT0hVR0VQQUdFOgorCQllcnJvciA9IGh1Z2VwYWdlX21hZHZpc2Uodm1hLCAmbmV3X2ZsYWdzLCBiZWhhdmlvcik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlicmVhazsKIAl9CiAKIAlpZiAobmV3X2ZsYWdzID09IHZtYS0+dm1fZmxhZ3MpIHsKQEAgLTI4Myw2ICsyODksMTAgQEAKIAljYXNlIE1BRFZfTUVSR0VBQkxFOgogCWNhc2UgTUFEVl9VTk1FUkdFQUJMRToKICNlbmRpZgorI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCWNhc2UgTUFEVl9IVUdFUEFHRToKKwljYXNlIE1BRFZfTk9IVUdFUEFHRToKKyNlbmRpZgogCQlyZXR1cm4gMTsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggMDBiYjhhNi4uOGFiODQxMCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMjkyLDcgKzI5Miw2IEBACiAJdW5zaWduZWQgbG9uZyBtb3ZlZF9jaGFyZ2U7CiAJdW5zaWduZWQgbG9uZyBtb3ZlZF9zd2FwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbW92aW5nX3Rhc2s7CS8qIGEgdGFzayBtb3ZpbmcgY2hhcmdlcyAqLwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwkJLyogYSB3YWl0cSBmb3Igb3RoZXIgY29udGV4dCAqLwogfSBtYyA9IHsKIAkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG1jLmxvY2spLApAQCAtODIxLDcgKzgyMCw2IEBACiAJCXJldHVybjsKIAlWTV9CVUdfT04obGlzdF9lbXB0eSgmcGMtPmxydSkpOwogCWxpc3RfZGVsX2luaXQoJnBjLT5scnUpOwotCXJldHVybjsKIH0KIAogdm9pZCBtZW1fY2dyb3VwX2RlbF9scnUoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xMDg3LDcgKzEwODUsNyBAQAogCQljYXNlIDA6CiAJCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgZHN0KTsKIAkJCW1lbV9jZ3JvdXBfZGVsX2xydShwYWdlKTsKLQkJCW5yX3Rha2VuKys7CisJCQlucl90YWtlbiArPSBocGFnZV9ucl9wYWdlcyhwYWdlKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FQlVTWToKIAkJCS8qIHdlIGRvbid0IGFmZmVjdCBnbG9iYWwgTFJVIGJ1dCByb3RhdGUgaW4gb3VyIExSVSAqLwpAQCAtMTMxMiw4ICsxMzEwLDkgQEAKIAl1NjQgbGltaXQ7CiAJdTY0IG1lbXN3OwogCi0JbGltaXQgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPnJlcywgUkVTX0xJTUlUKSArCi0JCQl0b3RhbF9zd2FwX3BhZ2VzOworCWxpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CisJbGltaXQgKz0gdG90YWxfc3dhcF9wYWdlcyA8PCBQQUdFX1NISUZUOworCiAJbWVtc3cgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfTElNSVQpOwogCS8qCiAJICogSWYgbWVtc3cgaXMgZmluaXRlIGFuZCBsaW1pdHMgdGhlIGFtb3VudCBvZiBzd2FwIHNwYWNlIGF2YWlsYWJsZQpAQCAtMTYwMCwxMSArMTU5OSwxMyBAQAogICogcG9zc2liaWxpdHkgb2YgcmFjZSBjb25kaXRpb24uIElmIHRoZXJlIGlzLCB3ZSB0YWtlIGEgbG9jay4KICAqLwogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3VwZGF0ZV9maWxlX3N0YXQoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpZHgsIGludCB2YWwpCit2b2lkIG1lbV9jZ3JvdXBfdXBkYXRlX3BhZ2Vfc3RhdChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgZW51bSBtZW1fY2dyb3VwX3BhZ2Vfc3RhdF9pdGVtIGlkeCwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJYm9vbCBuZWVkX3VubG9jayA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KCFwYykpCiAJCXJldHVybjsKQEAgLTE2MTYsMzcgKzE2MTcsMzQgQEAKIAkvKiBwYy0+bWVtX2Nncm91cCBpcyB1bnN0YWJsZSA/ICovCiAJaWYgKHVubGlrZWx5KG1lbV9jZ3JvdXBfc3RlYWxlZChtZW0pKSkgewogCQkvKiB0YWtlIGEgbG9jayBhZ2FpbnN0IHRvIGFjY2VzcyBwYy0+bWVtX2Nncm91cCAqLwotCQlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKKwkJbW92ZV9sb2NrX3BhZ2VfY2dyb3VwKHBjLCAmZmxhZ3MpOwogCQluZWVkX3VubG9jayA9IHRydWU7CiAJCW1lbSA9IHBjLT5tZW1fY2dyb3VwOwogCQlpZiAoIW1lbSB8fCAhUGFnZUNncm91cFVzZWQocGMpKQogCQkJZ290byBvdXQ7CiAJfQogCi0JdGhpc19jcHVfYWRkKG1lbS0+c3RhdC0+Y291bnRbaWR4XSwgdmFsKTsKLQogCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQ6CisJY2FzZSBNRU1DR19OUl9GSUxFX01BUFBFRDoKIAkJaWYgKHZhbCA+IDApCiAJCQlTZXRQYWdlQ2dyb3VwRmlsZU1hcHBlZChwYyk7CiAJCWVsc2UgaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKIAkJCUNsZWFyUGFnZUNncm91cEZpbGVNYXBwZWQocGMpOworCQlpZHggPSBNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRUQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KIAorCXRoaXNfY3B1X2FkZChtZW0tPnN0YXQtPmNvdW50W2lkeF0sIHZhbCk7CisKIG91dDoKIAlpZiAodW5saWtlbHkobmVlZF91bmxvY2spKQotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCQltb3ZlX3VubG9ja19wYWdlX2Nncm91cChwYywgJmZsYWdzKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm47CiB9Ci0KLXZvaWQgbWVtX2Nncm91cF91cGRhdGVfZmlsZV9tYXBwZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB2YWwpCi17Ci0JbWVtX2Nncm91cF91cGRhdGVfZmlsZV9zdGF0KHBhZ2UsIE1FTV9DR1JPVVBfU1RBVF9GSUxFX01BUFBFRCwgdmFsKTsKLX0KK0VYUE9SVF9TWU1CT0wobWVtX2Nncm91cF91cGRhdGVfcGFnZV9zdGF0KTsKIAogLyoKICAqIHNpemUgb2YgZmlyc3QgY2hhcmdlIHRyaWFsLiAiMzIiIGNvbWVzIGZyb20gdm1zY2FuLmMncyBtYWdpYyB2YWx1ZS4KQEAgLTE4ODcsMTIgKzE4ODUsMTQgQEAKICAqIG9vbS1raWxsZXIgY2FuIGJlIGludm9rZWQuCiAgKi8KIHN0YXRpYyBpbnQgX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCWdmcF90IGdmcF9tYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKm1lbWNnLCBib29sIG9vbSkKKwkJCQkgICBnZnBfdCBnZnBfbWFzaywKKwkJCQkgICBzdHJ1Y3QgbWVtX2Nncm91cCAqKm1lbWNnLCBib29sIG9vbSwKKwkJCQkgICBpbnQgcGFnZV9zaXplKQogewogCWludCBucl9vb21fcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCWludCByZXQ7Ci0JaW50IGNzaXplID0gQ0hBUkdFX1NJWkU7CisJaW50IGNzaXplID0gbWF4KENIQVJHRV9TSVpFLCAodW5zaWduZWQgbG9uZykgcGFnZV9zaXplKTsKIAogCS8qCiAJICogVW5saWtlIGdsb3ZhbC12bSdzIE9PTS1raWxsLCB3ZSdyZSBub3QgaW4gbWVtb3J5IHNob3J0YWdlCkBAIC0xOTE3LDcgKzE5MTcsNyBAQAogCQlWTV9CVUdfT04oY3NzX2lzX3JlbW92ZWQoJm1lbS0+Y3NzKSk7CiAJCWlmIChtZW1fY2dyb3VwX2lzX3Jvb3QobWVtKSkKIAkJCWdvdG8gZG9uZTsKLQkJaWYgKGNvbnN1bWVfc3RvY2sobWVtKSkKKwkJaWYgKHBhZ2Vfc2l6ZSA9PSBQQUdFX1NJWkUgJiYgY29uc3VtZV9zdG9jayhtZW0pKQogCQkJZ290byBkb25lOwogCQljc3NfZ2V0KCZtZW0tPmNzcyk7CiAJfSBlbHNlIHsKQEAgLTE5NDAsNyArMTk0MCw3IEBACiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQlpZiAoY29uc3VtZV9zdG9jayhtZW0pKSB7CisJCWlmIChwYWdlX3NpemUgPT0gUEFHRV9TSVpFICYmIGNvbnN1bWVfc3RvY2sobWVtKSkgewogCQkJLyoKIAkJCSAqIEl0IHNlZW1zIGRhZ2Vyb3VzIHRvIGFjY2VzcyBtZW1jZyB3aXRob3V0IGNzc19nZXQoKS4KIAkJCSAqIEJ1dCBjb25zaWRlcmluZyBob3cgY29uc3VtZV9zdG9rIHdvcmtzLCBpdCdzIG5vdApAQCAtMTk4MSw3ICsxOTgxLDcgQEAKIAkJY2FzZSBDSEFSR0VfT0s6CiAJCQlicmVhazsKIAkJY2FzZSBDSEFSR0VfUkVUUlk6IC8qIG5vdCBpbiBPT00gc2l0dWF0aW9uIGJ1dCByZXRyeSAqLwotCQkJY3NpemUgPSBQQUdFX1NJWkU7CisJCQljc2l6ZSA9IHBhZ2Vfc2l6ZTsKIAkJCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAkJCW1lbSA9IE5VTEw7CiAJCQlnb3RvIGFnYWluOwpAQCAtMjAwMiw4ICsyMDAyLDggQEAKIAkJfQogCX0gd2hpbGUgKHJldCAhPSBDSEFSR0VfT0spOwogCi0JaWYgKGNzaXplID4gUEFHRV9TSVpFKQotCQlyZWZpbGxfc3RvY2sobWVtLCBjc2l6ZSAtIFBBR0VfU0laRSk7CisJaWYgKGNzaXplID4gcGFnZV9zaXplKQorCQlyZWZpbGxfc3RvY2sobWVtLCBjc2l6ZSAtIHBhZ2Vfc2l6ZSk7CiAJY3NzX3B1dCgmbWVtLT5jc3MpOwogZG9uZToKIAkqbWVtY2cgPSBtZW07CkBAIC0yMDMxLDkgKzIwMzEsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJICAgICBpbnQgcGFnZV9zaXplKQogewotCV9fbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbSwgMSk7CisJX19tZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UobWVtLCBwYWdlX3NpemUgPj4gUEFHRV9TSElGVCk7CiB9CiAKIC8qCkBAIC0yMDg3LDIyICsyMDg4LDEwIEBACiAgKiBjb21taXQgYSBjaGFyZ2UgZ290IGJ5IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKCkgYW5kIG1ha2VzIHBhZ2VfY2dyb3VwIHRvIGJlCiAgKiBVU0VEIHN0YXRlLiBJZiBhbHJlYWR5IFVTRUQsIHVuY2hhcmdlIGFuZCByZXR1cm4uCiAgKi8KLQotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKLQkJCQkgICAgIHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCi0JCQkJICAgICBlbnVtIGNoYXJnZV90eXBlIGN0eXBlKQorc3RhdGljIHZvaWQgX19fX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCQkgc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwkJCQkJIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7Ci0JLyogdHJ5X2NoYXJnZSgpIGNhbiByZXR1cm4gTlVMTCB0byAqbWVtY2csIHRha2luZyBjYXJlIG9mIGl0LiAqLwotCWlmICghbWVtKQotCQlyZXR1cm47Ci0KLQlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQlpZiAodW5saWtlbHkoUGFnZUNncm91cFVzZWQocGMpKSkgewotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UobWVtKTsKLQkJcmV0dXJuOwotCX0KLQogCXBjLT5tZW1fY2dyb3VwID0gbWVtOwogCS8qCiAJICogV2UgYWNjZXNzIGEgcGFnZV9jZ3JvdXAgYXN5bmNocm9ub3VzbHkgd2l0aG91dCBsb2NrX3BhZ2VfY2dyb3VwKCkuCkBAIC0yMTI3LDYgKzIxMTYsMzMgQEAKIAl9CiAKIAltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgcGMsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCSAgICAgICBzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAorCQkJCSAgICAgICBlbnVtIGNoYXJnZV90eXBlIGN0eXBlLAorCQkJCSAgICAgICBpbnQgcGFnZV9zaXplKQoreworCWludCBpOworCWludCBjb3VudCA9IHBhZ2Vfc2l6ZSA+PiBQQUdFX1NISUZUOworCisJLyogdHJ5X2NoYXJnZSgpIGNhbiByZXR1cm4gTlVMTCB0byAqbWVtY2csIHRha2luZyBjYXJlIG9mIGl0LiAqLworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKKwlpZiAodW5saWtlbHkoUGFnZUNncm91cFVzZWQocGMpKSkgeworCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UobWVtLCBwYWdlX3NpemUpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiB3ZSBkb24ndCBuZWVkIHBhZ2VfY2dyb3VwX2xvY2sgYWJvdXQgdGFpbCBwYWdlcywgYmVjYXNlIHRoZXkgYXJlIG5vdAorCSAqIGFjY2Vzc2VkIGJ5IGFueSBvdGhlciBjb250ZXh0IGF0IHRoaXMgcG9pbnQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCV9fX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtLCBwYyArIGksIGN0eXBlKTsKIAogCXVubG9ja19wYWdlX2Nncm91cChwYyk7CiAJLyoKQEAgLTIxNzMsNyArMjE4OSw3IEBACiAJbWVtX2Nncm91cF9jaGFyZ2Vfc3RhdGlzdGljcyhmcm9tLCBwYywgZmFsc2UpOwogCWlmICh1bmNoYXJnZSkKIAkJLyogVGhpcyBpcyBub3QgImNhbmNlbCIsIGJ1dCBjYW5jZWxfY2hhcmdlIGRvZXMgYWxsIHdlIG5lZWQuICovCi0JCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShmcm9tKTsKKwkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKGZyb20sIFBBR0VfU0laRSk7CiAKIAkvKiBjYWxsZXIgc2hvdWxkIGhhdmUgZG9uZSBjc3NfZ2V0ICovCiAJcGMtPm1lbV9jZ3JvdXAgPSB0bzsKQEAgLTIxOTUsOSArMjIxMSwxMyBAQAogCQlzdHJ1Y3QgbWVtX2Nncm91cCAqZnJvbSwgc3RydWN0IG1lbV9jZ3JvdXAgKnRvLCBib29sIHVuY2hhcmdlKQogewogCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKIAlpZiAoUGFnZUNncm91cFVzZWQocGMpICYmIHBjLT5tZW1fY2dyb3VwID09IGZyb20pIHsKKwkJbW92ZV9sb2NrX3BhZ2VfY2dyb3VwKHBjLCAmZmxhZ3MpOwogCQlfX21lbV9jZ3JvdXBfbW92ZV9hY2NvdW50KHBjLCBmcm9tLCB0bywgdW5jaGFyZ2UpOworCQltb3ZlX3VubG9ja19wYWdlX2Nncm91cChwYywgJmZsYWdzKTsKIAkJcmV0ID0gMDsKIAl9CiAJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKQEAgLTIyMzQsMTMgKzIyNTQsMTQgQEAKIAkJZ290byBwdXQ7CiAKIAlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChwY2cpOwotCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIGdmcF9tYXNrLCAmcGFyZW50LCBmYWxzZSk7CisJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgZ2ZwX21hc2ssICZwYXJlbnQsIGZhbHNlLAorCQkJCSAgICAgIFBBR0VfU0laRSk7CiAJaWYgKHJldCB8fCAhcGFyZW50KQogCQlnb3RvIHB1dF9iYWNrOwogCiAJcmV0ID0gbWVtX2Nncm91cF9tb3ZlX2FjY291bnQocGMsIGNoaWxkLCBwYXJlbnQsIHRydWUpOwogCWlmIChyZXQpCi0JCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShwYXJlbnQpOworCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2UocGFyZW50LCBQQUdFX1NJWkUpOwogcHV0X2JhY2s6CiAJcHV0YmFja19scnVfcGFnZShwYWdlKTsKIHB1dDoKQEAgLTIyNjEsNiArMjI4MiwxMiBAQAogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CiAJaW50IHJldDsKKwlpbnQgcGFnZV9zaXplID0gUEFHRV9TSVpFOworCisJaWYgKFBhZ2VUcmFuc0h1Z2UocGFnZSkpIHsKKwkJcGFnZV9zaXplIDw8PSBjb21wb3VuZF9vcmRlcihwYWdlKTsKKwkJVk1fQlVHX09OKCFQYWdlVHJhbnNIdWdlKHBhZ2UpKTsKKwl9CiAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAkvKiBjYW4gaGFwcGVuIGF0IGJvb3QgKi8KQEAgLTIyNjgsMTEgKzIyOTUsMTEgQEAKIAkJcmV0dXJuIDA7CiAJcHJlZmV0Y2h3KHBjKTsKIAotCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBnZnBfbWFzaywgJm1lbSwgdHJ1ZSk7CisJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIGdmcF9tYXNrLCAmbWVtLCB0cnVlLCBwYWdlX3NpemUpOwogCWlmIChyZXQgfHwgIW1lbSkKIAkJcmV0dXJuIHJldDsKIAotCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbSwgcGMsIGN0eXBlKTsKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBjLCBjdHlwZSwgcGFnZV9zaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI4MSw4ICsyMzA4LDYgQEAKIHsKIAlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKLQlpZiAoUGFnZUNvbXBvdW5kKHBhZ2UpKQotCQlyZXR1cm4gMDsKIAkvKgogCSAqIElmIGFscmVhZHkgbWFwcGVkLCB3ZSBkb24ndCBoYXZlIHRvIGFjY291bnQuCiAJICogSWYgcGFnZSBjYWNoZSwgcGFnZS0+bWFwcGluZyBoYXMgYWRkcmVzc19zcGFjZS4KQEAgLTIzODgsMTMgKzI0MTMsMTMgQEAKIAlpZiAoIW1lbSkKIAkJZ290byBjaGFyZ2VfY3VyX21tOwogCSpwdHIgPSBtZW07Ci0JcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgbWFzaywgcHRyLCB0cnVlKTsKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBtYXNrLCBwdHIsIHRydWUsIFBBR0VfU0laRSk7CiAJY3NzX3B1dCgmbWVtLT5jc3MpOwogCXJldHVybiByZXQ7CiBjaGFyZ2VfY3VyX21tOgogCWlmICh1bmxpa2VseSghbW0pKQogCQltbSA9ICZpbml0X21tOwotCXJldHVybiBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShtbSwgbWFzaywgcHRyLCB0cnVlKTsKKwlyZXR1cm4gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UobW0sIG1hc2ssIHB0ciwgdHJ1ZSwgUEFHRV9TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTI0MTAsNyArMjQzNSw3IEBACiAJY2dyb3VwX2V4Y2x1ZGVfcm1kaXIoJnB0ci0+Y3NzKTsKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKIAltZW1fY2dyb3VwX2xydV9kZWxfYmVmb3JlX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7Ci0JX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UocHRyLCBwYywgY3R5cGUpOworCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKHB0ciwgcGMsIGN0eXBlLCBQQUdFX1NJWkUpOwogCW1lbV9jZ3JvdXBfbHJ1X2FkZF9hZnRlcl9jb21taXRfc3dhcGNhY2hlKHBhZ2UpOwogCS8qCiAJICogTm93IHN3YXAgaXMgb24tbWVtb3J5LiBUaGlzIG1lYW5zIHRoaXMgcGFnZSBtYXkgYmUKQEAgLTI0NTksMTEgKzI0ODQsMTIgQEAKIAkJcmV0dXJuOwogCWlmICghbWVtKQogCQlyZXR1cm47Ci0JbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbSk7CisJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG1lbSwgUEFHRV9TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQKLV9fZG9fdW5jaGFyZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgY29uc3QgZW51bSBjaGFyZ2VfdHlwZSBjdHlwZSkKK19fZG9fdW5jaGFyZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgY29uc3QgZW51bSBjaGFyZ2VfdHlwZSBjdHlwZSwKKwkgICAgICBpbnQgcGFnZV9zaXplKQogewogCXN0cnVjdCBtZW1jZ19iYXRjaF9pbmZvICpiYXRjaCA9IE5VTEw7CiAJYm9vbCB1bmNoYXJnZV9tZW1zdyA9IHRydWU7CkBAIC0yNDkwLDYgKzI1MTYsOSBAQAogCWlmICghYmF0Y2gtPmRvX2JhdGNoIHx8IHRlc3RfdGhyZWFkX2ZsYWcoVElGX01FTURJRSkpCiAJCWdvdG8gZGlyZWN0X3VuY2hhcmdlOwogCisJaWYgKHBhZ2Vfc2l6ZSAhPSBQQUdFX1NJWkUpCisJCWdvdG8gZGlyZWN0X3VuY2hhcmdlOworCiAJLyoKIAkgKiBJbiB0eXBpY2FsIGNhc2UsIGJhdGNoLT5tZW1jZyA9PSBtZW0uIFRoaXMgbWVhbnMgd2UgY2FuCiAJICogbWVyZ2UgYSBzZXJpZXMgb2YgdW5jaGFyZ2VzIHRvIGFuIHVuY2hhcmdlIG9mIHJlc19jb3VudGVyLgpAQCAtMjUwMyw5ICsyNTMyLDkgQEAKIAkJYmF0Y2gtPm1lbXN3X2J5dGVzICs9IFBBR0VfU0laRTsKIAlyZXR1cm47CiBkaXJlY3RfdW5jaGFyZ2U6Ci0JcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOworCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgcGFnZV9zaXplKTsKIAlpZiAodW5jaGFyZ2VfbWVtc3cpCi0JCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgcGFnZV9zaXplKTsKIAlpZiAodW5saWtlbHkoYmF0Y2gtPm1lbWNnICE9IG1lbSkpCiAJCW1lbWNnX29vbV9yZWNvdmVyKG1lbSk7CiAJcmV0dXJuOwpAQCAtMjUxNyw4ICsyNTQ2LDExIEBACiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKgogX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBjaGFyZ2VfdHlwZSBjdHlwZSkKIHsKKwlpbnQgaTsKKwlpbnQgY291bnQ7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlpbnQgcGFnZV9zaXplID0gUEFHRV9TSVpFOwogCiAJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNTI2LDYgKzI1NTgsMTIgQEAKIAlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlpZiAoUGFnZVRyYW5zSHVnZShwYWdlKSkgeworCQlwYWdlX3NpemUgPDw9IGNvbXBvdW5kX29yZGVyKHBhZ2UpOworCQlWTV9CVUdfT04oIVBhZ2VUcmFuc0h1Z2UocGFnZSkpOworCX0KKworCWNvdW50ID0gcGFnZV9zaXplID4+IFBBR0VfU0hJRlQ7CiAJLyoKIAkgKiBDaGVjayBpZiBvdXIgcGFnZV9jZ3JvdXAgaXMgdmFsaWQKIAkgKi8KQEAgLTI1NTgsNyArMjU5Niw4IEBACiAJCWJyZWFrOwogCX0KIAotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBwYywgZmFsc2UpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgcGMgKyBpLCBmYWxzZSk7CiAKIAlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKIAkvKgpAQCAtMjU3OSw3ICsyNjE4LDcgQEAKIAkJbWVtX2Nncm91cF9nZXQobWVtKTsKIAl9CiAJaWYgKCFtZW1fY2dyb3VwX2lzX3Jvb3QobWVtKSkKLQkJX19kb191bmNoYXJnZShtZW0sIGN0eXBlKTsKKwkJX19kb191bmNoYXJnZShtZW0sIGN0eXBlLCBwYWdlX3NpemUpOwogCiAJcmV0dXJuIG1lbTsKIApAQCAtMjc3NCw2ICsyODEzLDcgQEAKIAllbnVtIGNoYXJnZV90eXBlIGN0eXBlOwogCWludCByZXQgPSAwOwogCisJVk1fQlVHX09OKFBhZ2VUcmFuc0h1Z2UocGFnZSkpOwogCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCiAJCXJldHVybiAwOwogCkBAIC0yODIzLDcgKzI4NjMsNyBAQAogCQlyZXR1cm4gMDsKIAogCSpwdHIgPSBtZW07Ci0JcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgR0ZQX0tFUk5FTCwgcHRyLCBmYWxzZSk7CisJcmV0ID0gX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoTlVMTCwgR0ZQX0tFUk5FTCwgcHRyLCBmYWxzZSwgUEFHRV9TSVpFKTsKIAljc3NfcHV0KCZtZW0tPmNzcyk7LyogZHJvcCBleHRyYSByZWZjbnQgKi8KIAlpZiAocmV0IHx8ICpwdHIgPT0gTlVMTCkgewogCQlpZiAoUGFnZUFub24ocGFnZSkpIHsKQEAgLTI4NTAsMTMgKzI4OTAsMTMgQEAKIAkJY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFOwogCWVsc2UKIAkJY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NITUVNOwotCV9fbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG1lbSwgcGMsIGN0eXBlKTsKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBjLCBjdHlwZSwgUEFHRV9TSVpFKTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiByZW1vdmUgcmVkdW5kYW50IGNoYXJnZSBpZiBtaWdyYXRpb24gZmFpbGVkKi8KIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCi0Jc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKQorCXN0cnVjdCBwYWdlICpvbGRwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgYm9vbCBtaWdyYXRpb25fb2spCiB7CiAJc3RydWN0IHBhZ2UgKnVzZWQsICp1bnVzZWQ7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKQEAgLTI4NjUsOCArMjkwNSw3IEBACiAJCXJldHVybjsKIAkvKiBibG9ja3Mgcm1kaXIoKSAqLwogCWNncm91cF9leGNsdWRlX3JtZGlyKCZtZW0tPmNzcyk7Ci0JLyogYXQgbWlncmF0aW9uIHN1Y2Nlc3MsIG9sZHBhZ2UtPm1hcHBpbmcgaXMgTlVMTC4gKi8KLQlpZiAob2xkcGFnZS0+bWFwcGluZykgeworCWlmICghbWlncmF0aW9uX29rKSB7CiAJCXVzZWQgPSBvbGRwYWdlOwogCQl1bnVzZWQgPSBuZXdwYWdlOwogCX0gZWxzZSB7CkBAIC00MTc2LDEzICs0MjE1LDExIEBACiAJICovCiAJaWYgKCFub2RlX3N0YXRlKG5vZGUsIE5fTk9STUFMX01FTU9SWSkpCiAJCXRtcCA9IC0xOwotCXBuID0ga21hbGxvY19ub2RlKHNpemVvZigqcG4pLCBHRlBfS0VSTkVMLCB0bXApOworCXBuID0ga3phbGxvY19ub2RlKHNpemVvZigqcG4pLCBHRlBfS0VSTkVMLCB0bXApOwogCWlmICghcG4pCiAJCXJldHVybiAxOwogCiAJbWVtLT5pbmZvLm5vZGVpbmZvW25vZGVdID0gcG47Ci0JbWVtc2V0KHBuLCAwLCBzaXplb2YoKnBuKSk7Ci0KIAlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKIAkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOwogCQlmb3JfZWFjaF9scnUobCkKQEAgLTQyMDYsMTQgKzQyNDMsMTMgQEAKIAogCS8qIENhbiBiZSB2ZXJ5IGJpZyBpZiBNQVhfTlVNTk9ERVMgaXMgdmVyeSBiaWcgKi8KIAlpZiAoc2l6ZSA8IFBBR0VfU0laRSkKLQkJbWVtID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJbWVtID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAllbHNlCi0JCW1lbSA9IHZtYWxsb2Moc2l6ZSk7CisJCW1lbSA9IHZ6YWxsb2Moc2l6ZSk7CiAKIAlpZiAoIW1lbSkKIAkJcmV0dXJuIE5VTEw7CiAKLQltZW1zZXQobWVtLCAwLCBzaXplKTsKIAltZW0tPnN0YXQgPSBhbGxvY19wZXJjcHUoc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUpOwogCWlmICghbWVtLT5zdGF0KQogCQlnb3RvIG91dF9mcmVlOwpAQCAtNDQ2MSw3ICs0NDk3LDggQEAKIAkJCWJhdGNoX2NvdW50ID0gUFJFQ0hBUkdFX0NPVU5UX0FUX09OQ0U7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJfQotCQlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBHRlBfS0VSTkVMLCAmbWVtLCBmYWxzZSk7CisJCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIEdGUF9LRVJORUwsICZtZW0sIGZhbHNlLAorCQkJCQkgICAgICBQQUdFX1NJWkUpOwogCQlpZiAocmV0IHx8ICFtZW0pCiAJCQkvKiBtZW1fY2dyb3VwX2NsZWFyX21jKCkgd2lsbCBkbyB1bmNoYXJnZSBsYXRlciAqLwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC00NjIzLDYgKzQ2NjAsNyBAQAogCXB0ZV90ICpwdGU7CiAJc3BpbmxvY2tfdCAqcHRsOwogCisJVk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTsKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtYS0+dm1fbW0sIHBtZCwgYWRkciwgJnB0bCk7CiAJZm9yICg7IGFkZHIgIT0gZW5kOyBwdGUrKywgYWRkciArPSBQQUdFX1NJWkUpCiAJCWlmIChpc190YXJnZXRfcHRlX2Zvcl9tYyh2bWEsIGFkZHIsICpwdGUsIE5VTEwpKQpAQCAtNDYzOCw3ICs0Njc2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHByZWNoYXJnZTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAotCS8qIFdlJ3ZlIGFscmVhZHkgaGVsZCB0aGUgbW1hcF9zZW0gKi8KKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKIAkJc3RydWN0IG1tX3dhbGsgbWVtX2Nncm91cF9jb3VudF9wcmVjaGFyZ2Vfd2FsayA9IHsKIAkJCS5wbWRfZW50cnkgPSBtZW1fY2dyb3VwX2NvdW50X3ByZWNoYXJnZV9wdGVfcmFuZ2UsCkBAIC00NjUwLDYgKzQ2ODgsNyBAQAogCQl3YWxrX3BhZ2VfcmFuZ2Uodm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsCiAJCQkJCSZtZW1fY2dyb3VwX2NvdW50X3ByZWNoYXJnZV93YWxrKTsKIAl9CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAogCXByZWNoYXJnZSA9IG1jLnByZWNoYXJnZTsKIAltYy5wcmVjaGFyZ2UgPSAwOwpAQCAtNDY1OSwxMCArNDY5OCwxNSBAQAogCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcHJlY2hhcmdlX21jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCXJldHVybiBtZW1fY2dyb3VwX2RvX3ByZWNoYXJnZShtZW1fY2dyb3VwX2NvdW50X3ByZWNoYXJnZShtbSkpOworCXVuc2lnbmVkIGxvbmcgcHJlY2hhcmdlID0gbWVtX2Nncm91cF9jb3VudF9wcmVjaGFyZ2UobW0pOworCisJVk1fQlVHX09OKG1jLm1vdmluZ190YXNrKTsKKwltYy5tb3ZpbmdfdGFzayA9IGN1cnJlbnQ7CisJcmV0dXJuIG1lbV9jZ3JvdXBfZG9fcHJlY2hhcmdlKHByZWNoYXJnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY2xlYXJfbWModm9pZCkKKy8qIGNhbmNlbHMgYWxsIGV4dHJhIGNoYXJnZXMgb24gbWMuZnJvbSBhbmQgbWMudG8sIGFuZCB3YWtlcyB1cCBhbGwgd2FpdGVycy4gKi8KK3N0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9jbGVhcl9tYyh2b2lkKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICpmcm9tID0gbWMuZnJvbTsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqdG8gPSBtYy50bzsKQEAgLTQ2OTcsMjMgKzQ3NDEsMjggQEAKIAkJCQkJCVBBR0VfU0laRSAqIG1jLm1vdmVkX3N3YXApOwogCQl9CiAJCS8qIHdlJ3ZlIGFscmVhZHkgZG9uZSBtZW1fY2dyb3VwX2dldChtYy50bykgKi8KLQogCQltYy5tb3ZlZF9zd2FwID0gMDsKIAl9Ci0JaWYgKG1jLm1tKSB7Ci0JCXVwX3JlYWQoJm1jLm1tLT5tbWFwX3NlbSk7Ci0JCW1tcHV0KG1jLm1tKTsKLQl9CisJbWVtY2dfb29tX3JlY292ZXIoZnJvbSk7CisJbWVtY2dfb29tX3JlY292ZXIodG8pOworCXdha2VfdXBfYWxsKCZtYy53YWl0cSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY2xlYXJfbWModm9pZCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqZnJvbSA9IG1jLmZyb207CisKKwkvKgorCSAqIHdlIG11c3QgY2xlYXIgbW92aW5nX3Rhc2sgYmVmb3JlIHdha2luZyB1cCB3YWl0ZXJzIGF0IHRoZSBlbmQgb2YKKwkgKiB0YXNrIG1pZ3JhdGlvbi4KKwkgKi8KKwltYy5tb3ZpbmdfdGFzayA9IE5VTEw7CisJX19tZW1fY2dyb3VwX2NsZWFyX21jKCk7CiAJc3Bpbl9sb2NrKCZtYy5sb2NrKTsKIAltYy5mcm9tID0gTlVMTDsKIAltYy50byA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJm1jLmxvY2spOwotCW1jLm1vdmluZ190YXNrID0gTlVMTDsKLQltYy5tbSA9IE5VTEw7CiAJbWVtX2Nncm91cF9lbmRfbW92ZShmcm9tKTsKLQltZW1jZ19vb21fcmVjb3Zlcihmcm9tKTsKLQltZW1jZ19vb21fcmVjb3Zlcih0byk7Ci0Jd2FrZV91cF9hbGwoJm1jLndhaXRxKTsKIH0KIAogc3RhdGljIGludCBtZW1fY2dyb3VwX2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLApAQCAtNDczNSwzOCArNDc4NCwyMyBAQAogCQkJcmV0dXJuIDA7CiAJCS8qIFdlIG1vdmUgY2hhcmdlcyBvbmx5IHdoZW4gd2UgbW92ZSBhIG93bmVyIG9mIHRoZSBtbSAqLwogCQlpZiAobW0tPm93bmVyID09IHApIHsKLQkJCS8qCi0JCQkgKiBXZSBkbyBhbGwgdGhlIG1vdmUgY2hhcmdlIHdvcmtzIHVuZGVyIG9uZSBtbWFwX3NlbSB0bwotCQkJICogYXZvaWQgZGVhZGxvY2sgd2l0aCBkb3duX3dyaXRlKCZtbWFwX3NlbSkKLQkJCSAqIC0+IHRyeV9jaGFyZ2UoKSAtPiBpZiAobWMubW92aW5nX3Rhc2spIC0+IHNsZWVwLgotCQkJICovCi0JCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0KIAkJCVZNX0JVR19PTihtYy5mcm9tKTsKIAkJCVZNX0JVR19PTihtYy50byk7CiAJCQlWTV9CVUdfT04obWMucHJlY2hhcmdlKTsKIAkJCVZNX0JVR19PTihtYy5tb3ZlZF9jaGFyZ2UpOwogCQkJVk1fQlVHX09OKG1jLm1vdmVkX3N3YXApOwotCQkJVk1fQlVHX09OKG1jLm1vdmluZ190YXNrKTsKLQkJCVZNX0JVR19PTihtYy5tbSk7Ci0KIAkJCW1lbV9jZ3JvdXBfc3RhcnRfbW92ZShmcm9tKTsKIAkJCXNwaW5fbG9jaygmbWMubG9jayk7CiAJCQltYy5mcm9tID0gZnJvbTsKIAkJCW1jLnRvID0gbWVtOwotCQkJbWMucHJlY2hhcmdlID0gMDsKLQkJCW1jLm1vdmVkX2NoYXJnZSA9IDA7Ci0JCQltYy5tb3ZlZF9zd2FwID0gMDsKIAkJCXNwaW5fdW5sb2NrKCZtYy5sb2NrKTsKLQkJCW1jLm1vdmluZ190YXNrID0gY3VycmVudDsKLQkJCW1jLm1tID0gbW07CisJCQkvKiBXZSBzZXQgbWMubW92aW5nX3Rhc2sgbGF0ZXIgKi8KIAogCQkJcmV0ID0gbWVtX2Nncm91cF9wcmVjaGFyZ2VfbWMobW0pOwogCQkJaWYgKHJldCkKIAkJCQltZW1fY2dyb3VwX2NsZWFyX21jKCk7Ci0JCQkvKiBXZSBjYWxsIHVwX3JlYWQoKSBhbmQgbW1wdXQoKSBpbiBjbGVhcl9tYygpLiAqLwotCQl9IGVsc2UKLQkJCW1tcHV0KG1tKTsKKwkJfQorCQltbXB1dChtbSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC00Nzg5LDYgKzQ4MjMsNyBAQAogCXNwaW5sb2NrX3QgKnB0bDsKIAogcmV0cnk6CisJVk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTsKIAlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKHZtYS0+dm1fbW0sIHBtZCwgYWRkciwgJnB0bCk7CiAJZm9yICg7IGFkZHIgIT0gZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgewogCQlwdGVfdCBwdGVudCA9ICoocHRlKyspOwpAQCAtNDg1NCw3ICs0ODg5LDE5IEBACiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAlscnVfYWRkX2RyYWluX2FsbCgpOwotCS8qIFdlJ3ZlIGFscmVhZHkgaGVsZCB0aGUgbW1hcF9zZW0gKi8KK3JldHJ5OgorCWlmICh1bmxpa2VseSghZG93bl9yZWFkX3RyeWxvY2soJm1tLT5tbWFwX3NlbSkpKSB7CisJCS8qCisJCSAqIFNvbWVvbmUgd2hvIGFyZSBob2xkaW5nIHRoZSBtbWFwX3NlbSBtaWdodCBiZSB3YWl0aW5nIGluCisJCSAqIHdhaXRxLiBTbyB3ZSBjYW5jZWwgYWxsIGV4dHJhIGNoYXJnZXMsIHdha2UgdXAgYWxsIHdhaXRlcnMsCisJCSAqIGFuZCByZXRyeS4gQmVjYXVzZSB3ZSBjYW5jZWwgcHJlY2hhcmdlcywgd2UgbWlnaHQgbm90IGJlIGFibGUKKwkJICogdG8gbW92ZSBlbm91Z2ggY2hhcmdlcywgYnV0IG1vdmluZyBjaGFyZ2UgaXMgYSBiZXN0LWVmZm9ydAorCQkgKiBmZWF0dXJlIGFueXdheSwgc28gaXQgd291bGRuJ3QgYmUgYSBiaWcgcHJvYmxlbS4KKwkJICovCisJCV9fbWVtX2Nncm91cF9jbGVhcl9tYygpOworCQljb25kX3Jlc2NoZWQoKTsKKwkJZ290byByZXRyeTsKKwl9CiAJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKIAkJaW50IHJldDsKIAkJc3RydWN0IG1tX3dhbGsgbWVtX2Nncm91cF9tb3ZlX2NoYXJnZV93YWxrID0gewpAQCAtNDg3Myw2ICs0OTIwLDcgQEAKIAkJCSAqLwogCQkJYnJlYWs7CiAJfQorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbW92ZV90YXNrKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKQEAgLTQ4ODEsMTEgKzQ5MjksMTcgQEAKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJCQkJYm9vbCB0aHJlYWRncm91cCkKIHsKLQlpZiAoIW1jLm1tKQorCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJaWYgKCFtYy50bykKIAkJLyogbm8gbmVlZCB0byBtb3ZlIGNoYXJnZSAqLwogCQlyZXR1cm47CiAKLQltZW1fY2dyb3VwX21vdmVfY2hhcmdlKG1jLm1tKTsKKwltbSA9IGdldF90YXNrX21tKHApOworCWlmIChtbSkgeworCQltZW1fY2dyb3VwX21vdmVfY2hhcmdlKG1tKTsKKwkJbW1wdXQobW0pOworCX0KIAltZW1fY2dyb3VwX2NsZWFyX21jKCk7CiB9CiAjZWxzZQkvKiAhQ09ORklHX01NVSAqLwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LWZhaWx1cmUuYyBiL21tL21lbW9yeS1mYWlsdXJlLmMKaW5kZXggNDZhYjJjMC4uNTQ4ZmJkNyAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LWZhaWx1cmUuYworKysgYi9tbS9tZW1vcnktZmFpbHVyZS5jCkBAIC0yMDMsNyArMjAzLDcgQEAKICNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCiAJc2kuc2lfdHJhcG5vID0gdHJhcG5vOwogI2VuZGlmCi0Jc2kuc2lfYWRkcl9sc2IgPSBjb21wb3VuZF9vcmRlcihjb21wb3VuZF9oZWFkKHBhZ2UpKSArIFBBR0VfU0hJRlQ7CisJc2kuc2lfYWRkcl9sc2IgPSBjb21wb3VuZF90cmFuc19vcmRlcihjb21wb3VuZF9oZWFkKHBhZ2UpKSArIFBBR0VfU0hJRlQ7CiAJLyoKIAkgKiBEb24ndCB1c2UgZm9yY2UgaGVyZSwgaXQncyBjb252ZW5pZW50IGlmIHRoZSBzaWduYWwKIAkgKiBjYW4gYmUgdGVtcG9yYXJpbHkgYmxvY2tlZC4KQEAgLTM4Niw2ICszODYsOCBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBhbm9uX3ZtYSAqYXY7CiAKKwlpZiAoIVBhZ2VIdWdlKHBhZ2UpICYmIHVubGlrZWx5KHNwbGl0X2h1Z2VfcGFnZShwYWdlKSkpCisJCXJldHVybjsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCWF2ID0gcGFnZV9sb2NrX2Fub25fdm1hKHBhZ2UpOwogCWlmIChhdiA9PSBOVUxMKQkvKiBOb3QgYWN0dWFsbHkgbWFwcGVkIGFueW1vcmUgKi8KQEAgLTkyOCw3ICs5MzAsNyBAQAogc3RhdGljIHZvaWQgc2V0X3BhZ2VfaHdwb2lzb25faHVnZV9wYWdlKHN0cnVjdCBwYWdlICpocGFnZSkKIHsKIAlpbnQgaTsKLQlpbnQgbnJfcGFnZXMgPSAxIDw8IGNvbXBvdW5kX29yZGVyKGhwYWdlKTsKKwlpbnQgbnJfcGFnZXMgPSAxIDw8IGNvbXBvdW5kX3RyYW5zX29yZGVyKGhwYWdlKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKIAkJU2V0UGFnZUhXUG9pc29uKGhwYWdlICsgaSk7CiB9CkBAIC05MzYsNyArOTM4LDcgQEAKIHN0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfaHdwb2lzb25faHVnZV9wYWdlKHN0cnVjdCBwYWdlICpocGFnZSkKIHsKIAlpbnQgaTsKLQlpbnQgbnJfcGFnZXMgPSAxIDw8IGNvbXBvdW5kX29yZGVyKGhwYWdlKTsKKwlpbnQgbnJfcGFnZXMgPSAxIDw8IGNvbXBvdW5kX3RyYW5zX29yZGVyKGhwYWdlKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKIAkJQ2xlYXJQYWdlSFdQb2lzb24oaHBhZ2UgKyBpKTsKIH0KQEAgLTk2Niw3ICs5NjgsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlucl9wYWdlcyA9IDEgPDwgY29tcG91bmRfb3JkZXIoaHBhZ2UpOworCW5yX3BhZ2VzID0gMSA8PCBjb21wb3VuZF90cmFuc19vcmRlcihocGFnZSk7CiAJYXRvbWljX2xvbmdfYWRkKG5yX3BhZ2VzLCAmbWNlX2JhZF9wYWdlcyk7CiAKIAkvKgpAQCAtMTE2NCw3ICsxMTY2LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbnJfcGFnZXMgPSAxIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpOworCW5yX3BhZ2VzID0gMSA8PCBjb21wb3VuZF90cmFuc19vcmRlcihwYWdlKTsKIAogCWlmICghZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpIHsKIAkJLyoKQEAgLTEyOTAsOSArMTI5MiwxMCBAQAogCS8qIEtlZXAgcGFnZSBjb3VudCB0byBpbmRpY2F0ZSBhIGdpdmVuIGh1Z2VwYWdlIGlzIGlzb2xhdGVkLiAqLwogCiAJbGlzdF9hZGQoJmhwYWdlLT5scnUsICZwYWdlbGlzdCk7Ci0JcmV0ID0gbWlncmF0ZV9odWdlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X3BhZ2UsIE1QT0xfTUZfTU9WRV9BTEwsIDApOworCXJldCA9IG1pZ3JhdGVfaHVnZV9wYWdlcygmcGFnZWxpc3QsIG5ld19wYWdlLCBNUE9MX01GX01PVkVfQUxMLCAwLAorCQkJCXRydWUpOwogCWlmIChyZXQpIHsKLQkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7CisJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7CiAJCXByX2RlYnVnKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IG1pZ3JhdGlvbiBmYWlsZWQgJWQsIHR5cGUgJWx4XG4iLAogCQkJIHBmbiwgcmV0LCBwYWdlLT5mbGFncyk7CiAJCWlmIChyZXQgPiAwKQpAQCAtMTMwMSw3ICsxMzA0LDcgQEAKIAl9CiBkb25lOgogCWlmICghUGFnZUhXUG9pc29uKGhwYWdlKSkKLQkJYXRvbWljX2xvbmdfYWRkKDEgPDwgY29tcG91bmRfb3JkZXIoaHBhZ2UpLCAmbWNlX2JhZF9wYWdlcyk7CisJCWF0b21pY19sb25nX2FkZCgxIDw8IGNvbXBvdW5kX3RyYW5zX29yZGVyKGhwYWdlKSwgJm1jZV9iYWRfcGFnZXMpOwogCXNldF9wYWdlX2h3cG9pc29uX2h1Z2VfcGFnZShocGFnZSk7CiAJZGVxdWV1ZV9od3BvaXNvbmVkX2h1Z2VfcGFnZShocGFnZSk7CiAJLyoga2VlcCBlbGV2YXRlZCBwYWdlIGNvdW50IGZvciBiYWQgcGFnZSAqLwpAQCAtMTQxMyw3ICsxNDE2LDggQEAKIAkJTElTVF9IRUFEKHBhZ2VsaXN0KTsKIAogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmcGFnZWxpc3QpOwotCQlyZXQgPSBtaWdyYXRlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X3BhZ2UsIE1QT0xfTUZfTU9WRV9BTEwsIDApOworCQlyZXQgPSBtaWdyYXRlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X3BhZ2UsIE1QT0xfTUZfTU9WRV9BTEwsCisJCQkJCQkJCTAsIHRydWUpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9pbmZvKCJzb2Z0IG9mZmxpbmU6ICUjbHg6IG1pZ3JhdGlvbiBmYWlsZWQgJWQsIHR5cGUgJWx4XG4iLAogCQkJCXBmbiwgcmV0LCBwYWdlLT5mbGFncyk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDAyZTQ4YWEuLjMxMjUwZmEgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC0zOTQsOSArMzk0LDExIEBACiAJfQogfQogCi1pbnQgX19wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK2ludCBfX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlwZ3RhYmxlX3QgbmV3ID0gcHRlX2FsbG9jX29uZShtbSwgYWRkcmVzcyk7CisJaW50IHdhaXRfc3BsaXRfaHVnZV9wYWdlOwogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDE2LDE0ICs0MTgsMTggQEAKIAlzbXBfd21iKCk7IC8qIENvdWxkIGJlIHNtcF93bWJfX3h4eChiZWZvcmV8YWZ0ZXIpX3NwaW5fbG9jayAqLwogCiAJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CS8qIEhhcyBhbm90aGVyIHBvcHVsYXRlZCBpdCA/ICovCisJd2FpdF9zcGxpdF9odWdlX3BhZ2UgPSAwOworCWlmIChsaWtlbHkocG1kX25vbmUoKnBtZCkpKSB7CS8qIEhhcyBhbm90aGVyIHBvcHVsYXRlZCBpdCA/ICovCiAJCW1tLT5ucl9wdGVzKys7CiAJCXBtZF9wb3B1bGF0ZShtbSwgcG1kLCBuZXcpOwogCQluZXcgPSBOVUxMOwotCX0KKwl9IGVsc2UgaWYgKHVubGlrZWx5KHBtZF90cmFuc19zcGxpdHRpbmcoKnBtZCkpKQorCQl3YWl0X3NwbGl0X2h1Z2VfcGFnZSA9IDE7CiAJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwogCWlmIChuZXcpCiAJCXB0ZV9mcmVlKG1tLCBuZXcpOworCWlmICh3YWl0X3NwbGl0X2h1Z2VfcGFnZSkKKwkJd2FpdF9zcGxpdF9odWdlX3BhZ2Uodm1hLT5hbm9uX3ZtYSwgcG1kKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDM2LDEwICs0NDIsMTEgQEAKIAlzbXBfd21iKCk7IC8qIFNlZSBjb21tZW50IGluIF9fcHRlX2FsbG9jICovCiAKIAlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKLQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CS8qIEhhcyBhbm90aGVyIHBvcHVsYXRlZCBpdCA/ICovCisJaWYgKGxpa2VseShwbWRfbm9uZSgqcG1kKSkpIHsJLyogSGFzIGFub3RoZXIgcG9wdWxhdGVkIGl0ID8gKi8KIAkJcG1kX3BvcHVsYXRlX2tlcm5lbCgmaW5pdF9tbSwgcG1kLCBuZXcpOwogCQluZXcgPSBOVUxMOwotCX0KKwl9IGVsc2UKKwkJVk1fQlVHX09OKHBtZF90cmFuc19zcGxpdHRpbmcoKnBtZCkpOwogCXNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CiAJaWYgKG5ldykKIAkJcHRlX2ZyZWVfa2VybmVsKCZpbml0X21tLCBuZXcpOwpAQCAtNzE5LDkgKzcyNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY29weV9wdGVfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqZHN0X21tLCBzdHJ1Y3QgbW1fc3RydWN0ICpzcmNfbW0sCi0JCXBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCitpbnQgY29weV9wdGVfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqZHN0X21tLCBzdHJ1Y3QgbW1fc3RydWN0ICpzcmNfbW0sCisJCSAgIHBtZF90ICpkc3RfcG1kLCBwbWRfdCAqc3JjX3BtZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJcHRlX3QgKm9yaWdfc3JjX3B0ZSwgKm9yaWdfZHN0X3B0ZTsKIAlwdGVfdCAqc3JjX3B0ZSwgKmRzdF9wdGU7CkBAIC03OTUsNiArODAyLDE3IEBACiAJc3JjX3BtZCA9IHBtZF9vZmZzZXQoc3JjX3B1ZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwbWRfdHJhbnNfaHVnZSgqc3JjX3BtZCkpIHsKKwkJCWludCBlcnI7CisJCQlWTV9CVUdfT04obmV4dC1hZGRyICE9IEhQQUdFX1BNRF9TSVpFKTsKKwkJCWVyciA9IGNvcHlfaHVnZV9wbWQoZHN0X21tLCBzcmNfbW0sCisJCQkJCSAgICBkc3RfcG1kLCBzcmNfcG1kLCBhZGRyLCB2bWEpOworCQkJaWYgKGVyciA9PSAtRU5PTUVNKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKCFlcnIpCisJCQkJY29udGludWU7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJfQogCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHNyY19wbWQpKQogCQkJY29udGludWU7CiAJCWlmIChjb3B5X3B0ZV9yYW5nZShkc3RfbW0sIHNyY19tbSwgZHN0X3BtZCwgc3JjX3BtZCwKQEAgLTk5Nyw2ICsxMDE1LDE2IEBACiAJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOwogCWRvIHsKIAkJbmV4dCA9IHBtZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCQlpZiAocG1kX3RyYW5zX2h1Z2UoKnBtZCkpIHsKKwkJCWlmIChuZXh0LWFkZHIgIT0gSFBBR0VfUE1EX1NJWkUpIHsKKwkJCQlWTV9CVUdfT04oIXJ3c2VtX2lzX2xvY2tlZCgmdGxiLT5tbS0+bW1hcF9zZW0pKTsKKwkJCQlzcGxpdF9odWdlX3BhZ2VfcG1kKHZtYS0+dm1fbW0sIHBtZCk7CisJCQl9IGVsc2UgaWYgKHphcF9odWdlX3BtZCh0bGIsIHZtYSwgcG1kKSkgeworCQkJCSgqemFwX3dvcmspLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJfQogCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpIHsKIAkJCSgqemFwX3dvcmspLS07CiAJCQljb250aW51ZTsKQEAgLTEyNjIsNyArMTI5MCw3IEBACiAJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOwogCWlmIChwdWRfbm9uZSgqcHVkKSkKIAkJZ290byBub19wYWdlX3RhYmxlOwotCWlmIChwdWRfaHVnZSgqcHVkKSkgeworCWlmIChwdWRfaHVnZSgqcHVkKSAmJiB2bWEtPnZtX2ZsYWdzICYgVk1fSFVHRVRMQikgewogCQlCVUdfT04oZmxhZ3MgJiBGT0xMX0dFVCk7CiAJCXBhZ2UgPSBmb2xsb3dfaHVnZV9wdWQobW0sIGFkZHJlc3MsIHB1ZCwgZmxhZ3MgJiBGT0xMX1dSSVRFKTsKIAkJZ290byBvdXQ7CkBAIC0xMjczLDExICsxMzAxLDMyIEBACiAJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOwogCWlmIChwbWRfbm9uZSgqcG1kKSkKIAkJZ290byBub19wYWdlX3RhYmxlOwotCWlmIChwbWRfaHVnZSgqcG1kKSkgeworCWlmIChwbWRfaHVnZSgqcG1kKSAmJiB2bWEtPnZtX2ZsYWdzICYgVk1fSFVHRVRMQikgewogCQlCVUdfT04oZmxhZ3MgJiBGT0xMX0dFVCk7CiAJCXBhZ2UgPSBmb2xsb3dfaHVnZV9wbWQobW0sIGFkZHJlc3MsIHBtZCwgZmxhZ3MgJiBGT0xMX1dSSVRFKTsKIAkJZ290byBvdXQ7CiAJfQorCWlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSkgeworCQlpZiAoZmxhZ3MgJiBGT0xMX1NQTElUKSB7CisJCQlzcGxpdF9odWdlX3BhZ2VfcG1kKG1tLCBwbWQpOworCQkJZ290byBzcGxpdF9mYWxsdGhyb3VnaDsKKwkJfQorCQlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQlpZiAobGlrZWx5KHBtZF90cmFuc19odWdlKCpwbWQpKSkgeworCQkJaWYgKHVubGlrZWx5KHBtZF90cmFuc19zcGxpdHRpbmcoKnBtZCkpKSB7CisJCQkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkJCXdhaXRfc3BsaXRfaHVnZV9wYWdlKHZtYS0+YW5vbl92bWEsIHBtZCk7CisJCQl9IGVsc2UgeworCQkJCXBhZ2UgPSBmb2xsb3dfdHJhbnNfaHVnZV9wbWQobW0sIGFkZHJlc3MsCisJCQkJCQkJICAgICBwbWQsIGZsYWdzKTsKKwkJCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwl9CitzcGxpdF9mYWxsdGhyb3VnaDoKIAlpZiAodW5saWtlbHkocG1kX2JhZCgqcG1kKSkpCiAJCWdvdG8gbm9fcGFnZV90YWJsZTsKIApAQCAtMTMxMCw2ICsxMzU5LDI4IEBACiAJCSAqLwogCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJfQorCWlmIChmbGFncyAmIEZPTExfTUxPQ0spIHsKKwkJLyoKKwkJICogVGhlIHByZWxpbWluYXJ5IG1hcHBpbmcgY2hlY2sgaXMgbWFpbmx5IHRvIGF2b2lkIHRoZQorCQkgKiBwb2ludGxlc3Mgb3ZlcmhlYWQgb2YgbG9ja19wYWdlIG9uIHRoZSBaRVJPX1BBR0UKKwkJICogd2hpY2ggbWlnaHQgYm91bmNlIHZlcnkgYmFkbHkgaWYgdGhlcmUgaXMgY29udGVudGlvbi4KKwkJICoKKwkJICogSWYgdGhlIHBhZ2UgaXMgYWxyZWFkeSBsb2NrZWQsIHdlIGRvbid0IG5lZWQgdG8KKwkJICogaGFuZGxlIGl0IG5vdyAtIHZtc2NhbiB3aWxsIGhhbmRsZSBpdCBsYXRlciBpZiBhbmQKKwkJICogd2hlbiBpdCBhdHRlbXB0cyB0byByZWNsYWltIHRoZSBwYWdlLgorCQkgKi8KKwkJaWYgKHBhZ2UtPm1hcHBpbmcgJiYgdHJ5bG9ja19wYWdlKHBhZ2UpKSB7CisJCQlscnVfYWRkX2RyYWluKCk7ICAvKiBwdXNoIGNhY2hlZCBwYWdlcyB0byBMUlUgKi8KKwkJCS8qCisJCQkgKiBCZWNhdXNlIHdlIGxvY2sgcGFnZSBoZXJlIGFuZCBtaWdyYXRpb24gaXMKKwkJCSAqIGJsb2NrZWQgYnkgdGhlIHB0ZSdzIHBhZ2UgcmVmZXJlbmNlLCB3ZSBuZWVkCisJCQkgKiBvbmx5IGNoZWNrIGZvciBmaWxlLWNhY2hlIHBhZ2UgdHJ1bmNhdGlvbi4KKwkJCSAqLworCQkJaWYgKHBhZ2UtPm1hcHBpbmcpCisJCQkJbWxvY2tfdm1hX3BhZ2UocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJfQorCX0KIHVubG9jazoKIAlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7CiBvdXQ6CkBAIC0xMzQxLDcgKzE0MTIsOCBAQAogCiBpbnQgX19nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgaW50IG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX2ZsYWdzLAotCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXMpCisJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcywKKwkJICAgICBpbnQgKm5vbmJsb2NraW5nKQogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgdm1fZmxhZ3M7CkBAIC0xMzg2LDYgKzE0NTgsNyBAQAogCQkJcG1kID0gcG1kX29mZnNldChwdWQsIHBnKTsKIAkJCWlmIChwbWRfbm9uZSgqcG1kKSkKIAkJCQlyZXR1cm4gaSA/IDogLUVGQVVMVDsKKwkJCVZNX0JVR19PTihwbWRfdHJhbnNfaHVnZSgqcG1kKSk7CiAJCQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIHBnKTsKIAkJCWlmIChwdGVfbm9uZSgqcHRlKSkgewogCQkJCXB0ZV91bm1hcChwdGUpOwpAQCAtMTQ0MSwxMCArMTUxNCwxNSBAQAogCQkJY29uZF9yZXNjaGVkKCk7CiAJCQl3aGlsZSAoIShwYWdlID0gZm9sbG93X3BhZ2Uodm1hLCBzdGFydCwgZm9sbF9mbGFncykpKSB7CiAJCQkJaW50IHJldDsKKwkJCQl1bnNpZ25lZCBpbnQgZmF1bHRfZmxhZ3MgPSAwOworCisJCQkJaWYgKGZvbGxfZmxhZ3MgJiBGT0xMX1dSSVRFKQorCQkJCQlmYXVsdF9mbGFncyB8PSBGQVVMVF9GTEFHX1dSSVRFOworCQkJCWlmIChub25ibG9ja2luZykKKwkJCQkJZmF1bHRfZmxhZ3MgfD0gRkFVTFRfRkxBR19BTExPV19SRVRSWTsKIAogCQkJCXJldCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBzdGFydCwKLQkJCQkJKGZvbGxfZmxhZ3MgJiBGT0xMX1dSSVRFKSA/Ci0JCQkJCUZBVUxUX0ZMQUdfV1JJVEUgOiAwKTsKKwkJCQkJCQlmYXVsdF9mbGFncyk7CiAKIAkJCQlpZiAocmV0ICYgVk1fRkFVTFRfRVJST1IpIHsKIAkJCQkJaWYgKHJldCAmIFZNX0ZBVUxUX09PTSkKQEAgLTE0NjAsNiArMTUzOCwxMSBAQAogCQkJCWVsc2UKIAkJCQkJdHNrLT5taW5fZmx0Kys7CiAKKwkJCQlpZiAocmV0ICYgVk1fRkFVTFRfUkVUUlkpIHsKKwkJCQkJKm5vbmJsb2NraW5nID0gMDsKKwkJCQkJcmV0dXJuIGk7CisJCQkJfQorCiAJCQkJLyoKIAkJCQkgKiBUaGUgVk1fRkFVTFRfV1JJVEUgYml0IHRlbGxzIHVzIHRoYXQKIAkJCQkgKiBkb193cF9wYWdlIGhhcyBicm9rZW4gQ09XIHdoZW4gbmVjZXNzYXJ5LApAQCAtMTU1OSw3ICsxNjQyLDggQEAKIAlpZiAoZm9yY2UpCiAJCWZsYWdzIHw9IEZPTExfRk9SQ0U7CiAKLQlyZXR1cm4gX19nZXRfdXNlcl9wYWdlcyh0c2ssIG1tLCBzdGFydCwgbnJfcGFnZXMsIGZsYWdzLCBwYWdlcywgdm1hcyk7CisJcmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXModHNrLCBtbSwgc3RhcnQsIG5yX3BhZ2VzLCBmbGFncywgcGFnZXMsIHZtYXMsCisJCQkJTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTsKIApAQCAtMTU4NCw3ICsxNjY4LDggQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCWlmIChfX2dldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBhZGRyLCAxLAotCQkJRk9MTF9GT1JDRSB8IEZPTExfRFVNUCB8IEZPTExfR0VULCAmcGFnZSwgJnZtYSkgPCAxKQorCQkJICAgICBGT0xMX0ZPUkNFIHwgRk9MTF9EVU1QIHwgRk9MTF9HRVQsICZwYWdlLCAmdm1hLAorCQkJICAgICBOVUxMKSA8IDEpCiAJCXJldHVybiBOVUxMOwogCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCBhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSk7CiAJcmV0dXJuIHBhZ2U7CkBAIC0xNTk4LDggKzE2ODMsMTAgQEAKIAlwdWRfdCAqIHB1ZCA9IHB1ZF9hbGxvYyhtbSwgcGdkLCBhZGRyKTsKIAlpZiAocHVkKSB7CiAJCXBtZF90ICogcG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpOwotCQlpZiAocG1kKQorCQlpZiAocG1kKSB7CisJCQlWTV9CVUdfT04ocG1kX3RyYW5zX2h1Z2UoKnBtZCkpOwogCQkJcmV0dXJuIHB0ZV9hbGxvY19tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBwdGwpOworCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMTgxOCw2ICsxOTA1LDcgQEAKIAlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcik7CiAJaWYgKCFwbWQpCiAJCXJldHVybiAtRU5PTUVNOworCVZNX0JVR19PTihwbWRfdHJhbnNfaHVnZSgqcG1kKSk7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChyZW1hcF9wdGVfcmFuZ2UobW0sIHBtZCwgYWRkciwgbmV4dCwKQEAgLTIwNDgsMTkgKzIxMzYsNiBAQAogCXJldHVybiBzYW1lOwogfQogCi0vKgotICogRG8gcHRlX21rd3JpdGUsIGJ1dCBvbmx5IGlmIHRoZSB2bWEgc2F5cyBWTV9XUklURS4gIFdlIGRvIHRoaXMgd2hlbgotICogc2VydmljaW5nIGZhdWx0cyBmb3Igd3JpdGUgYWNjZXNzLiAgSW4gdGhlIG5vcm1hbCBjYXNlLCBkbyBhbHdheXMgd2FudAotICogcHRlX21rd3JpdGUuICBCdXQgZ2V0X3VzZXJfcGFnZXMgY2FuIGNhdXNlIHdyaXRlIGZhdWx0cyBmb3IgbWFwcGluZ3MKLSAqIHRoYXQgZG8gbm90IGhhdmUgd3JpdGluZyBlbmFibGVkLCB3aGVuIHVzZWQgYnkgYWNjZXNzX3Byb2Nlc3Nfdm0uCi0gKi8KLXN0YXRpYyBpbmxpbmUgcHRlX3QgbWF5YmVfbWt3cml0ZShwdGVfdCBwdGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWlmIChsaWtlbHkodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKLQkJcHRlID0gcHRlX21rd3JpdGUocHRlKTsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgY293X3VzZXJfcGFnZShzdHJ1Y3QgcGFnZSAqZHN0LCBzdHJ1Y3QgcGFnZSAqc3JjLCB1bnNpZ25lZCBsb25nIHZhLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAkvKgpAQCAtMjExMiw3ICsyMTg3LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqb2xkX3BhZ2UsICpuZXdfcGFnZTsKIAlwdGVfdCBlbnRyeTsKLQlpbnQgcmV1c2UgPSAwLCByZXQgPSAwOworCWludCByZXQgPSAwOwogCWludCBwYWdlX21rd3JpdGUgPSAwOwogCXN0cnVjdCBwYWdlICpkaXJ0eV9wYWdlID0gTlVMTDsKIApAQCAtMjE0OSwxNCArMjIyNCwxNiBAQAogCQkJfQogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKIAkJfQotCQlyZXVzZSA9IHJldXNlX3N3YXBfcGFnZShvbGRfcGFnZSk7Ci0JCWlmIChyZXVzZSkKKwkJaWYgKHJldXNlX3N3YXBfcGFnZShvbGRfcGFnZSkpIHsKIAkJCS8qCiAJCQkgKiBUaGUgcGFnZSBpcyBhbGwgb3Vycy4gIE1vdmUgaXQgdG8gb3VyIGFub25fdm1hIHNvCiAJCQkgKiB0aGUgcm1hcCBjb2RlIHdpbGwgbm90IHNlYXJjaCBvdXIgcGFyZW50IG9yIHNpYmxpbmdzLgogCQkJICogUHJvdGVjdGVkIGFnYWluc3QgdGhlIHJtYXAgY29kZSBieSB0aGUgcGFnZSBsb2NrLgogCQkJICovCiAJCQlwYWdlX21vdmVfYW5vbl9ybWFwKG9sZF9wYWdlLCB2bWEsIGFkZHJlc3MpOworCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQkJZ290byByZXVzZTsKKwkJfQogCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CiAJfSBlbHNlIGlmICh1bmxpa2VseSgodm1hLT52bV9mbGFncyAmIChWTV9XUklURXxWTV9TSEFSRUQpKSA9PQogCQkJCQkoVk1fV1JJVEV8Vk1fU0hBUkVEKSkpIHsKQEAgLTIyMjAsMTggKzIyOTcsNTIgQEAKIAkJfQogCQlkaXJ0eV9wYWdlID0gb2xkX3BhZ2U7CiAJCWdldF9wYWdlKGRpcnR5X3BhZ2UpOwotCQlyZXVzZSA9IDE7Ci0JfQogCi0JaWYgKHJldXNlKSB7CiByZXVzZToKIAkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4ob3JpZ19wdGUpKTsKIAkJZW50cnkgPSBwdGVfbWt5b3VuZyhvcmlnX3B0ZSk7CiAJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRyeSksIHZtYSk7CiAJCWlmIChwdGVwX3NldF9hY2Nlc3NfZmxhZ3Modm1hLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBlbnRyeSwxKSkKIAkJCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBwYWdlX3RhYmxlKTsKKwkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwogCQlyZXQgfD0gVk1fRkFVTFRfV1JJVEU7Ci0JCWdvdG8gdW5sb2NrOworCisJCWlmICghZGlydHlfcGFnZSkKKwkJCXJldHVybiByZXQ7CisKKwkJLyoKKwkJICogWWVzLCBWaXJnaW5pYSwgdGhpcyBpcyBhY3R1YWxseSByZXF1aXJlZCB0byBwcmV2ZW50IGEgcmFjZQorCQkgKiB3aXRoIGNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKCkgZnJvbSBjbGVhcmluZyB0aGUgcGFnZSBkaXJ0eQorCQkgKiBiaXQgYWZ0ZXIgaXQgY2xlYXIgYWxsIGRpcnR5IHB0ZXMsIGJ1dCBiZWZvcmUgYSByYWNpbmcKKwkJICogZG9fd3BfcGFnZSBpbnN0YWxscyBhIGRpcnR5IHB0ZS4KKwkJICoKKwkJICogZG9fbm9fcGFnZSBpcyBwcm90ZWN0ZWQgc2ltaWxhcmx5LgorCQkgKi8KKwkJaWYgKCFwYWdlX21rd3JpdGUpIHsKKwkJCXdhaXRfb25fcGFnZV9sb2NrZWQoZGlydHlfcGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eV9iYWxhbmNlKGRpcnR5X3BhZ2UsIHBhZ2VfbWt3cml0ZSk7CisJCX0KKwkJcHV0X3BhZ2UoZGlydHlfcGFnZSk7CisJCWlmIChwYWdlX21rd3JpdGUpIHsKKwkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlydHlfcGFnZS0+bWFwcGluZzsKKworCQkJc2V0X3BhZ2VfZGlydHkoZGlydHlfcGFnZSk7CisJCQl1bmxvY2tfcGFnZShkaXJ0eV9wYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaXJ0eV9wYWdlKTsKKwkJCWlmIChtYXBwaW5nKQl7CisJCQkJLyoKKwkJCQkgKiBTb21lIGRldmljZSBkcml2ZXJzIGRvIG5vdCBzZXQgcGFnZS5tYXBwaW5nCisJCQkJICogYnV0IHN0aWxsIGRpcnR5IHRoZWlyIHBhZ2VzCisJCQkJICovCisJCQkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChtYXBwaW5nKTsKKwkJCX0KKwkJfQorCisJCS8qIGZpbGVfdXBkYXRlX3RpbWUgb3V0c2lkZSBwYWdlX2xvY2sgKi8KKwkJaWYgKHZtYS0+dm1fZmlsZSkKKwkJCWZpbGVfdXBkYXRlX3RpbWUodm1hLT52bV9maWxlKTsKKworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qCkBAIC0yMzM3LDM5ICsyNDQ4LDYgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKIHVubG9jazoKIAlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7Ci0JaWYgKGRpcnR5X3BhZ2UpIHsKLQkJLyoKLQkJICogWWVzLCBWaXJnaW5pYSwgdGhpcyBpcyBhY3R1YWxseSByZXF1aXJlZCB0byBwcmV2ZW50IGEgcmFjZQotCQkgKiB3aXRoIGNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKCkgZnJvbSBjbGVhcmluZyB0aGUgcGFnZSBkaXJ0eQotCQkgKiBiaXQgYWZ0ZXIgaXQgY2xlYXIgYWxsIGRpcnR5IHB0ZXMsIGJ1dCBiZWZvcmUgYSByYWNpbmcKLQkJICogZG9fd3BfcGFnZSBpbnN0YWxscyBhIGRpcnR5IHB0ZS4KLQkJICoKLQkJICogZG9fbm9fcGFnZSBpcyBwcm90ZWN0ZWQgc2ltaWxhcmx5LgotCQkgKi8KLQkJaWYgKCFwYWdlX21rd3JpdGUpIHsKLQkJCXdhaXRfb25fcGFnZV9sb2NrZWQoZGlydHlfcGFnZSk7Ci0JCQlzZXRfcGFnZV9kaXJ0eV9iYWxhbmNlKGRpcnR5X3BhZ2UsIHBhZ2VfbWt3cml0ZSk7Ci0JCX0KLQkJcHV0X3BhZ2UoZGlydHlfcGFnZSk7Ci0JCWlmIChwYWdlX21rd3JpdGUpIHsKLQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlydHlfcGFnZS0+bWFwcGluZzsKLQotCQkJc2V0X3BhZ2VfZGlydHkoZGlydHlfcGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShkaXJ0eV9wYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaXJ0eV9wYWdlKTsKLQkJCWlmIChtYXBwaW5nKQl7Ci0JCQkJLyoKLQkJCQkgKiBTb21lIGRldmljZSBkcml2ZXJzIGRvIG5vdCBzZXQgcGFnZS5tYXBwaW5nCi0JCQkJICogYnV0IHN0aWxsIGRpcnR5IHRoZWlyIHBhZ2VzCi0JCQkJICovCi0JCQkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChtYXBwaW5nKTsKLQkJCX0KLQkJfQotCi0JCS8qIGZpbGVfdXBkYXRlX3RpbWUgb3V0c2lkZSBwYWdlX2xvY2sgKi8KLQkJaWYgKHZtYS0+dm1fZmlsZSkKLQkJCWZpbGVfdXBkYXRlX3RpbWUodm1hLT52bV9maWxlKTsKLQl9CiAJcmV0dXJuIHJldDsKIG9vbV9mcmVlX25ldzoKIAlwYWdlX2NhY2hlX3JlbGVhc2UobmV3X3BhZ2UpOwpAQCAtMzE0Nyw5ICszMjI1LDkgQEAKICAqIGJ1dCBhbGxvdyBjb25jdXJyZW50IGZhdWx0cyksIGFuZCBwdGUgbWFwcGVkIGJ1dCBub3QgeWV0IGxvY2tlZC4KICAqIFdlIHJldHVybiB3aXRoIG1tYXBfc2VtIHN0aWxsIGhlbGQsIGJ1dCBwdGUgdW5tYXBwZWQgYW5kIHVubG9ja2VkLgogICovCi1zdGF0aWMgaW5saW5lIGludCBoYW5kbGVfcHRlX2ZhdWx0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAotCQlwdGVfdCAqcHRlLCBwbWRfdCAqcG1kLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitpbnQgaGFuZGxlX3B0ZV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkgICAgIHB0ZV90ICpwdGUsIHBtZF90ICpwbWQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlwdGVfdCBlbnRyeTsKIAlzcGlubG9ja190ICpwdGw7CkBAIC0zMjI4LDkgKzMzMDYsNDAgQEAKIAlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcmVzcyk7CiAJaWYgKCFwbWQpCiAJCXJldHVybiBWTV9GQVVMVF9PT007Ci0JcHRlID0gcHRlX2FsbG9jX21hcChtbSwgcG1kLCBhZGRyZXNzKTsKLQlpZiAoIXB0ZSkKKwlpZiAocG1kX25vbmUoKnBtZCkgJiYgdHJhbnNwYXJlbnRfaHVnZXBhZ2VfZW5hYmxlZCh2bWEpKSB7CisJCWlmICghdm1hLT52bV9vcHMpCisJCQlyZXR1cm4gZG9faHVnZV9wbWRfYW5vbnltb3VzX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywKKwkJCQkJCQkgIHBtZCwgZmxhZ3MpOworCX0gZWxzZSB7CisJCXBtZF90IG9yaWdfcG1kID0gKnBtZDsKKwkJYmFycmllcigpOworCQlpZiAocG1kX3RyYW5zX2h1Z2Uob3JpZ19wbWQpKSB7CisJCQlpZiAoZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFICYmCisJCQkgICAgIXBtZF93cml0ZShvcmlnX3BtZCkgJiYKKwkJCSAgICAhcG1kX3RyYW5zX3NwbGl0dGluZyhvcmlnX3BtZCkpCisJCQkJcmV0dXJuIGRvX2h1Z2VfcG1kX3dwX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywKKwkJCQkJCQkgICBwbWQsIG9yaWdfcG1kKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBVc2UgX19wdGVfYWxsb2MgaW5zdGVhZCBvZiBwdGVfYWxsb2NfbWFwLCBiZWNhdXNlIHdlIGNhbid0CisJICogcnVuIHB0ZV9vZmZzZXRfbWFwIG9uIHRoZSBwbWQsIGlmIGFuIGh1Z2UgcG1kIGNvdWxkCisJICogbWF0ZXJpYWxpemUgZnJvbSB1bmRlciB1cyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZC4KKwkgKi8KKwlpZiAodW5saWtlbHkoX19wdGVfYWxsb2MobW0sIHZtYSwgcG1kLCBhZGRyZXNzKSkpCiAJCXJldHVybiBWTV9GQVVMVF9PT007CisJLyogaWYgYW4gaHVnZSBwbWQgbWF0ZXJpYWxpemVkIGZyb20gdW5kZXIgdXMganVzdCByZXRyeSBsYXRlciAqLworCWlmICh1bmxpa2VseShwbWRfdHJhbnNfaHVnZSgqcG1kKSkpCisJCXJldHVybiAwOworCS8qCisJICogQSByZWd1bGFyIHBtZCBpcyBlc3RhYmxpc2hlZCBhbmQgaXQgY2FuJ3QgbW9ycGggaW50byBhIGh1Z2UgcG1kCisJICogZnJvbSB1bmRlciB1cyBhbnltb3JlIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSBob2xkIHRoZSBtbWFwX3NlbQorCSAqIHJlYWQgbW9kZSBhbmQga2h1Z2VwYWdlZCB0YWtlcyBpdCBpbiB3cml0ZSBtb2RlLiBTbyBub3cgaXQncworCSAqIHNhZmUgdG8gcnVuIHB0ZV9vZmZzZXRfbWFwKCkuCisJICovCisJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKTsKIAogCXJldHVybiBoYW5kbGVfcHRlX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIHB0ZSwgcG1kLCBmbGFncyk7CiB9CkBAIC0zMjk2LDcgKzM0MDUsMTIgQEAKIAl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgYWRkcik7CiAJaWYgKCF2bWEpCiAJCXJldHVybiAtRU5PTUVNOwotCXdyaXRlID0gKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgIT0gMDsKKwkvKgorCSAqIFdlIHdhbnQgdG8gdG91Y2ggd3JpdGFibGUgbWFwcGluZ3Mgd2l0aCBhIHdyaXRlIGZhdWx0IGluIG9yZGVyCisJICogdG8gYnJlYWsgQ09XLCBleGNlcHQgZm9yIHNoYXJlZCBtYXBwaW5ncyBiZWNhdXNlIHRoZXNlIGRvbid0IENPVworCSAqIGFuZCB3ZSB3b3VsZCBub3Qgd2FudCB0byBkaXJ0eSB0aGVtIGZvciBub3RoaW5nLgorCSAqLworCXdyaXRlID0gKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEUgfCBWTV9TSEFSRUQpKSA9PSBWTV9XUklURTsKIAlCVUdfT04oYWRkciA+PSBlbmQpOwogCUJVR19PTihlbmQgPiB2bWEtPnZtX2VuZCk7CiAJbGVuID0gRElWX1JPVU5EX1VQKGVuZCwgUEFHRV9TSVpFKSAtIGFkZHIvUEFHRV9TSVpFOwpAQCAtMzM2OCw2ICszNDgyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CisJVk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTsKIAlpZiAocG1kX25vbmUoKnBtZCkgfHwgdW5saWtlbHkocG1kX2JhZCgqcG1kKSkpCiAJCWdvdG8gb3V0OwogCkBAIC0zNjA4LDMgKzM3MjMsNzQgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWlnaHRfZmF1bHQpOwogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgfHwgZGVmaW5lZChDT05GSUdfSFVHRVRMQkZTKQorc3RhdGljIHZvaWQgY2xlYXJfZ2lnYW50aWNfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9odWdlX3BhZ2UpCit7CisJaW50IGk7CisJc3RydWN0IHBhZ2UgKnAgPSBwYWdlOworCisJbWlnaHRfc2xlZXAoKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNfcGVyX2h1Z2VfcGFnZTsKKwkgICAgIGkrKywgcCA9IG1lbV9tYXBfbmV4dChwLCBwYWdlLCBpKSkgeworCQljb25kX3Jlc2NoZWQoKTsKKwkJY2xlYXJfdXNlcl9oaWdocGFnZShwLCBhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJfQorfQordm9pZCBjbGVhcl9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgcGFnZXNfcGVyX2h1Z2VfcGFnZSkKK3sKKwlpbnQgaTsKKworCWlmICh1bmxpa2VseShwYWdlc19wZXJfaHVnZV9wYWdlID4gTUFYX09SREVSX05SX1BBR0VTKSkgeworCQljbGVhcl9naWdhbnRpY19wYWdlKHBhZ2UsIGFkZHIsIHBhZ2VzX3Blcl9odWdlX3BhZ2UpOworCQlyZXR1cm47CisJfQorCisJbWlnaHRfc2xlZXAoKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXNfcGVyX2h1Z2VfcGFnZTsgaSsrKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQljbGVhcl91c2VyX2hpZ2hwYWdlKHBhZ2UgKyBpLCBhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X3VzZXJfZ2lnYW50aWNfcGFnZShzdHJ1Y3QgcGFnZSAqZHN0LCBzdHJ1Y3QgcGFnZSAqc3JjLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcGFnZXNfcGVyX2h1Z2VfcGFnZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGFnZSAqZHN0X2Jhc2UgPSBkc3Q7CisJc3RydWN0IHBhZ2UgKnNyY19iYXNlID0gc3JjOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzX3Blcl9odWdlX3BhZ2U7ICkgeworCQljb25kX3Jlc2NoZWQoKTsKKwkJY29weV91c2VyX2hpZ2hwYWdlKGRzdCwgc3JjLCBhZGRyICsgaSpQQUdFX1NJWkUsIHZtYSk7CisKKwkJaSsrOworCQlkc3QgPSBtZW1fbWFwX25leHQoZHN0LCBkc3RfYmFzZSwgaSk7CisJCXNyYyA9IG1lbV9tYXBfbmV4dChzcmMsIHNyY19iYXNlLCBpKTsKKwl9Cit9CisKK3ZvaWQgY29weV91c2VyX2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqZHN0LCBzdHJ1Y3QgcGFnZSAqc3JjLAorCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9odWdlX3BhZ2UpCit7CisJaW50IGk7CisKKwlpZiAodW5saWtlbHkocGFnZXNfcGVyX2h1Z2VfcGFnZSA+IE1BWF9PUkRFUl9OUl9QQUdFUykpIHsKKwkJY29weV91c2VyX2dpZ2FudGljX3BhZ2UoZHN0LCBzcmMsIGFkZHIsIHZtYSwKKwkJCQkJcGFnZXNfcGVyX2h1Z2VfcGFnZSk7CisJCXJldHVybjsKKwl9CisKKwltaWdodF9zbGVlcCgpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlc19wZXJfaHVnZV9wYWdlOyBpKyspIHsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWNvcHlfdXNlcl9oaWdocGFnZShkc3QgKyBpLCBzcmMgKyBpLCBhZGRyICsgaSpQQUdFX1NJWkUsIHZtYSk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSB8fCBDT05GSUdfSFVHRVRMQkZTICovCmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwppbmRleCAyYzY1MjNhLi5lOTJmMDQ3IDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTgyLDkgKzgyLDEwIEBACiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFCiAjaWZuZGVmIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUAotc3RhdGljIHZvaWQgZ2V0X3BhZ2VfYm9vdG1lbSh1bnNpZ25lZCBsb25nIGluZm8sICBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHR5cGUpCitzdGF0aWMgdm9pZCBnZXRfcGFnZV9ib290bWVtKHVuc2lnbmVkIGxvbmcgaW5mbywgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHR5cGUpCiB7Ci0JYXRvbWljX3NldCgmcGFnZS0+X21hcGNvdW50LCB0eXBlKTsKKwlwYWdlLT5scnUubmV4dCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopIHR5cGU7CiAJU2V0UGFnZVByaXZhdGUocGFnZSk7CiAJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCBpbmZvKTsKIAlhdG9taWNfaW5jKCZwYWdlLT5fY291bnQpOwpAQCAtOTQsMTUgKzk1LDE2IEBACiAgKiBzbyB1c2UgX19yZWYgdG8gdGVsbCBtb2Rwb3N0IG5vdCB0byBnZW5lcmF0ZSBhIHdhcm5pbmcgKi8KIHZvaWQgX19yZWYgcHV0X3BhZ2VfYm9vdG1lbShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpbnQgdHlwZTsKKwl1bnNpZ25lZCBsb25nIHR5cGU7CiAKLQl0eXBlID0gYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCk7Ci0JQlVHX09OKHR5cGUgPj0gLTEpOworCXR5cGUgPSAodW5zaWduZWQgbG9uZykgcGFnZS0+bHJ1Lm5leHQ7CisJQlVHX09OKHR5cGUgPCBNRU1PUllfSE9UUExVR19NSU5fQk9PVE1FTV9UWVBFIHx8CisJICAgICAgIHR5cGUgPiBNRU1PUllfSE9UUExVR19NQVhfQk9PVE1FTV9UWVBFKTsKIAogCWlmIChhdG9taWNfZGVjX3JldHVybigmcGFnZS0+X2NvdW50KSA9PSAxKSB7CiAJCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CiAJCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7Ci0JCXJlc2V0X3BhZ2VfbWFwY291bnQocGFnZSk7CisJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5scnUpOwogCQlfX2ZyZWVfcGFnZXNfYm9vdG1lbShwYWdlLCAwKTsKIAl9CiAKQEAgLTczMyw3ICs3MzUsOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJLyogdGhpcyBmdW5jdGlvbiByZXR1cm5zICMgb2YgZmFpbGVkIHBhZ2VzICovCi0JCXJldCA9IG1pZ3JhdGVfcGFnZXMoJnNvdXJjZSwgaG90cmVtb3ZlX21pZ3JhdGVfYWxsb2MsIDAsIDEpOworCQlyZXQgPSBtaWdyYXRlX3BhZ2VzKCZzb3VyY2UsIGhvdHJlbW92ZV9taWdyYXRlX2FsbG9jLCAwLAorCQkJCQkJCQl0cnVlLCB0cnVlKTsKIAkJaWYgKHJldCkKIAkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZzb3VyY2UpOwogCX0KZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggMTFmZjI2MC4uMzY4ZmM5ZCAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTUxNCw2ICs1MTQsNyBAQAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAlkbyB7CiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJc3BsaXRfaHVnZV9wYWdlX3BtZCh2bWEtPnZtX21tLCBwbWQpOwogCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCiAJCQljb250aW51ZTsKIAkJaWYgKGNoZWNrX3B0ZV9yYW5nZSh2bWEsIHBtZCwgYWRkciwgbmV4dCwgbm9kZXMsCkBAIC05MzUsNyArOTM2LDggQEAKIAkJcmV0dXJuIFBUUl9FUlIodm1hKTsKIAogCWlmICghbGlzdF9lbXB0eSgmcGFnZWxpc3QpKSB7Ci0JCWVyciA9IG1pZ3JhdGVfcGFnZXMoJnBhZ2VsaXN0LCBuZXdfbm9kZV9wYWdlLCBkZXN0LCAwKTsKKwkJZXJyID0gbWlncmF0ZV9wYWdlcygmcGFnZWxpc3QsIG5ld19ub2RlX3BhZ2UsIGRlc3QsCisJCQkJCQkJCWZhbHNlLCB0cnVlKTsKIAkJaWYgKGVycikKIAkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7CiAJfQpAQCAtMTE1NSw3ICsxMTU3LDggQEAKIAogCQlpZiAoIWxpc3RfZW1wdHkoJnBhZ2VsaXN0KSkgewogCQkJbnJfZmFpbGVkID0gbWlncmF0ZV9wYWdlcygmcGFnZWxpc3QsIG5ld192bWFfcGFnZSwKLQkJCQkJCSh1bnNpZ25lZCBsb25nKXZtYSwgMCk7CisJCQkJCQkodW5zaWduZWQgbG9uZyl2bWEsCisJCQkJCQlmYWxzZSwgdHJ1ZSk7CiAJCQlpZiAobnJfZmFpbGVkKQogCQkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7CiAJCX0KQEAgLTEzMDgsMTYgKzEzMTEsMTMgQEAKIAogCS8qIEZpbmQgdGhlIG1tX3N0cnVjdCAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCXRhc2sgPSBwaWQgPyBmaW5kX3Rhc2tfYnlfdnBpZChwaWQpIDogY3VycmVudDsKIAlpZiAoIXRhc2spIHsKLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJZXJyID0gLUVTUkNIOwogCQlnb3RvIG91dDsKIAl9CiAJbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAllcnIgPSAtRUlOVkFMOwpAQCAtMTc5Niw3ICsxNzk2LDcgQEAKIH0KIAogLyoqCi0gKiAJYWxsb2NfcGFnZV92bWEJLSBBbGxvY2F0ZSBhIHBhZ2UgZm9yIGEgVk1BLgorICogCWFsbG9jX3BhZ2VzX3ZtYQktIEFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEuCiAgKgogICogCUBnZnA6CiAgKiAgICAgICVHRlBfVVNFUiAgICB1c2VyIGFsbG9jYXRpb24uCkBAIC0xODA1LDYgKzE4MDUsNyBAQAogICogICAgICAlR0ZQX0ZTICAgICAgYWxsb2NhdGlvbiBzaG91bGQgbm90IGNhbGwgYmFjayBpbnRvIGEgZmlsZSBzeXN0ZW0uCiAgKiAgICAgICVHRlBfQVRPTUlDICBkb24ndCBzbGVlcC4KICAqCisgKglAb3JkZXI6T3JkZXIgb2YgdGhlIEdGUCBhbGxvY2F0aW9uLgogICogCUB2bWE6ICBQb2ludGVyIHRvIFZNQSBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUuCiAgKglAYWRkcjogVmlydHVhbCBBZGRyZXNzIG9mIHRoZSBhbGxvY2F0aW9uLiBNdXN0IGJlIGluc2lkZSB0aGUgVk1BLgogICoKQEAgLTE4MTgsNyArMTgxOSw4IEBACiAgKglTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIG1tX3NlbSBvZiB0aGUgdm1hIGhvbGQuCiAgKi8KIHN0cnVjdCBwYWdlICoKLWFsbG9jX3BhZ2Vfdm1hKGdmcF90IGdmcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK2FsbG9jX3BhZ2VzX3ZtYShnZnBfdCBnZnAsIGludCBvcmRlciwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2wgPSBnZXRfdm1hX3BvbGljeShjdXJyZW50LCB2bWEsIGFkZHIpOwogCXN0cnVjdCB6b25lbGlzdCAqemw7CkBAIC0xODMwLDcgKzE4MzIsNyBAQAogCiAJCW5pZCA9IGludGVybGVhdmVfbmlkKHBvbCwgdm1hLCBhZGRyLCBQQUdFX1NISUZUKTsKIAkJbXBvbF9jb25kX3B1dChwb2wpOwotCQlwYWdlID0gYWxsb2NfcGFnZV9pbnRlcmxlYXZlKGdmcCwgMCwgbmlkKTsKKwkJcGFnZSA9IGFsbG9jX3BhZ2VfaW50ZXJsZWF2ZShnZnAsIG9yZGVyLCBuaWQpOwogCQlwdXRfbWVtc19hbGxvd2VkKCk7CiAJCXJldHVybiBwYWdlOwogCX0KQEAgLTE4MzksNyArMTg0MSw3IEBACiAJCS8qCiAJCSAqIHNsb3cgcGF0aDogcmVmIGNvdW50ZWQgc2hhcmVkIHBvbGljeQogCQkgKi8KLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSAgX19hbGxvY19wYWdlc19ub2RlbWFzayhnZnAsIDAsCisJCXN0cnVjdCBwYWdlICpwYWdlID0gIF9fYWxsb2NfcGFnZXNfbm9kZW1hc2soZ2ZwLCBvcmRlciwKIAkJCQkJCXpsLCBwb2xpY3lfbm9kZW1hc2soZ2ZwLCBwb2wpKTsKIAkJX19tcG9sX3B1dChwb2wpOwogCQlwdXRfbWVtc19hbGxvd2VkKCk7CkBAIC0xODQ4LDcgKzE4NTAsOCBAQAogCS8qCiAJICogZmFzdCBwYXRoOiAgZGVmYXVsdCBvciB0YXNrIHBvbGljeQogCSAqLwotCXBhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vZGVtYXNrKGdmcCwgMCwgemwsIHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCkpOworCXBhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vZGVtYXNrKGdmcCwgb3JkZXIsIHpsLAorCQkJCSAgICAgIHBvbGljeV9ub2RlbWFzayhnZnAsIHBvbCkpOwogCXB1dF9tZW1zX2FsbG93ZWQoKTsKIAlyZXR1cm4gcGFnZTsKIH0KZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCA2YWU4YTY2Li40NmZlOGNjIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC0xMTMsNiArMTEzLDggQEAKIAkJCWdvdG8gb3V0OwogCiAJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKKwkJaWYgKHBtZF90cmFuc19odWdlKCpwbWQpKQorCQkJZ290byBvdXQ7CiAJCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCiAJCQlnb3RvIG91dDsKIApAQCAtMjQ2LDcgKzI0OCw3IEBACiAKIAlleHBlY3RlZF9jb3VudCA9IDIgKyBwYWdlX2hhc19wcml2YXRlKHBhZ2UpOwogCWlmIChwYWdlX2NvdW50KHBhZ2UpICE9IGV4cGVjdGVkX2NvdW50IHx8Ci0JCQkoc3RydWN0IHBhZ2UgKilyYWRpeF90cmVlX2RlcmVmX3Nsb3QocHNsb3QpICE9IHBhZ2UpIHsKKwkJcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZChwc2xvdCwgJm1hcHBpbmctPnRyZWVfbG9jaykgIT0gcGFnZSkgewogCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTMxOCw3ICszMjAsNyBAQAogCiAJZXhwZWN0ZWRfY291bnQgPSAyICsgcGFnZV9oYXNfcHJpdmF0ZShwYWdlKTsKIAlpZiAocGFnZV9jb3VudChwYWdlKSAhPSBleHBlY3RlZF9jb3VudCB8fAotCSAgICAoc3RydWN0IHBhZ2UgKilyYWRpeF90cmVlX2RlcmVmX3Nsb3QocHNsb3QpICE9IHBhZ2UpIHsKKwkJcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZChwc2xvdCwgJm1hcHBpbmctPnRyZWVfbG9jaykgIT0gcGFnZSkgewogCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTYxNCwxMyArNjE2LDEyIEBACiAgKiB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHBhZ2UgaW4gbmV3cGFnZS4KICAqLwogc3RhdGljIGludCB1bm1hcF9hbmRfbW92ZShuZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLAotCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBmb3JjZSwgaW50IG9mZmxpbmluZykKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgZm9yY2UsIGJvb2wgb2ZmbGluaW5nLCBib29sIHN5bmMpCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgKnJlc3VsdCA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UgPSBnZXRfbmV3X3BhZ2UocGFnZSwgcHJpdmF0ZSwgJnJlc3VsdCk7CiAJaW50IHJlbWFwX3N3YXBjYWNoZSA9IDE7Ci0JaW50IHJjdV9sb2NrZWQgPSAwOwogCWludCBjaGFyZ2UgPSAwOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwpAQCAtNjMyLDYgKzYzMyw5IEBACiAJCS8qIHBhZ2Ugd2FzIGZyZWVkIGZyb20gdW5kZXIgdXMuIFNvIHdlIGFyZSBkb25lLiAqLwogCQlnb3RvIG1vdmVfbmV3cGFnZTsKIAl9CisJaWYgKHVubGlrZWx5KFBhZ2VUcmFuc0h1Z2UocGFnZSkpKQorCQlpZiAodW5saWtlbHkoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKSkKKwkJCWdvdG8gbW92ZV9uZXdwYWdlOwogCiAJLyogcHJlcGFyZSBjZ3JvdXAganVzdCByZXR1cm5zIDAgb3IgLUVOT01FTSAqLwogCXJjID0gLUVBR0FJTjsKQEAgLTYzOSw2ICs2NDMsMjMgQEAKIAlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkgewogCQlpZiAoIWZvcmNlKQogCQkJZ290byBtb3ZlX25ld3BhZ2U7CisKKwkJLyoKKwkJICogSXQncyBub3Qgc2FmZSBmb3IgZGlyZWN0IGNvbXBhY3Rpb24gdG8gY2FsbCBsb2NrX3BhZ2UuCisJCSAqIEZvciBleGFtcGxlLCBkdXJpbmcgcGFnZSByZWFkYWhlYWQgcGFnZXMgYXJlIGFkZGVkIGxvY2tlZAorCQkgKiB0byB0aGUgTFJVLiBMYXRlciwgd2hlbiB0aGUgSU8gY29tcGxldGVzIHRoZSBwYWdlcyBhcmUKKwkJICogbWFya2VkIHVwdG9kYXRlIGFuZCB1bmxvY2tlZC4gSG93ZXZlciwgdGhlIHF1ZXVlaW5nCisJCSAqIGNvdWxkIGJlIG1lcmdpbmcgbXVsdGlwbGUgcGFnZXMgZm9yIG9uZSBiaW8gKGUuZy4KKwkJICogbXBhZ2VfcmVhZHBhZ2VzKS4gSWYgYW4gYWxsb2NhdGlvbiBoYXBwZW5zIGZvciB0aGUKKwkJICogc2Vjb25kIG9yIHRoaXJkIHBhZ2UsIHRoZSBwcm9jZXNzIGNhbiBlbmQgdXAgbG9ja2luZworCQkgKiB0aGUgc2FtZSBwYWdlIHR3aWNlIGFuZCBkZWFkbG9ja2luZy4gUmF0aGVyIHRoYW4KKwkJICogdHJ5aW5nIHRvIGJlIGNsZXZlciBhYm91dCB3aGF0IHBhZ2VzIGNhbiBiZSBsb2NrZWQsCisJCSAqIGF2b2lkIHRoZSB1c2Ugb2YgbG9ja19wYWdlIGZvciBkaXJlY3QgY29tcGFjdGlvbgorCQkgKiBhbHRvZ2V0aGVyLgorCQkgKi8KKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCisJCQlnb3RvIG1vdmVfbmV3cGFnZTsKKwogCQlsb2NrX3BhZ2UocGFnZSk7CiAJfQogCkBAIC02NjUsMjcgKzY4NiwzMyBAQAogCUJVR19PTihjaGFyZ2UpOwogCiAJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKLQkJaWYgKCFmb3JjZSkKKwkJaWYgKCFmb3JjZSB8fCAhc3luYykKIAkJCWdvdG8gdW5jaGFyZ2U7CiAJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CiAJfQogCS8qCiAJICogQnkgdHJ5X3RvX3VubWFwKCksIHBhZ2UtPm1hcGNvdW50IGdvZXMgZG93biB0byAwIGhlcmUuIEluIHRoaXMgY2FzZSwKIAkgKiB3ZSBjYW5ub3Qgbm90aWNlIHRoYXQgYW5vbl92bWEgaXMgZnJlZWQgd2hpbGUgd2UgbWlncmF0ZXMgYSBwYWdlLgotCSAqIFRoaXMgcmN1X3JlYWRfbG9jaygpIGRlbGF5cyBmcmVlaW5nIGFub25fdm1hIHBvaW50ZXIgdW50aWwgdGhlIGVuZAorCSAqIFRoaXMgZ2V0X2Fub25fdm1hKCkgZGVsYXlzIGZyZWVpbmcgYW5vbl92bWEgcG9pbnRlciB1bnRpbCB0aGUgZW5kCiAJICogb2YgbWlncmF0aW9uLiBGaWxlIGNhY2hlIHBhZ2VzIGFyZSBubyBwcm9ibGVtIGJlY2F1c2Ugb2YgcGFnZV9sb2NrKCkKIAkgKiBGaWxlIENhY2hlcyBtYXkgdXNlIHdyaXRlX3BhZ2UoKSBvciBsb2NrX3BhZ2UoKSBpbiBtaWdyYXRpb24sIHRoZW4sCiAJICoganVzdCBjYXJlIEFub24gcGFnZSBoZXJlLgogCSAqLwogCWlmIChQYWdlQW5vbihwYWdlKSkgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXJjdV9sb2NrZWQgPSAxOwotCi0JCS8qIERldGVybWluZSBob3cgdG8gc2FmZWx5IHVzZSBhbm9uX3ZtYSAqLwotCQlpZiAoIXBhZ2VfbWFwcGVkKHBhZ2UpKSB7Ci0JCQlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJZ290byByY3VfdW5sb2NrOwotCisJCS8qCisJCSAqIE9ubHkgcGFnZV9sb2NrX2Fub25fdm1hKCkgdW5kZXJzdGFuZHMgdGhlIHN1YnRsZXRpZXMgb2YKKwkJICogZ2V0dGluZyBhIGhvbGQgb24gYW4gYW5vbl92bWEgZnJvbSBvdXRzaWRlIG9uZSBvZiBpdHMgbW1zLgorCQkgKi8KKwkJYW5vbl92bWEgPSBwYWdlX2xvY2tfYW5vbl92bWEocGFnZSk7CisJCWlmIChhbm9uX3ZtYSkgeworCQkJLyoKKwkJCSAqIFRha2UgYSByZWZlcmVuY2UgY291bnQgb24gdGhlIGFub25fdm1hIGlmIHRoZQorCQkJICogcGFnZSBpcyBtYXBwZWQgc28gdGhhdCBpdCBpcyBndWFyYW50ZWVkIHRvCisJCQkgKiBleGlzdCB3aGVuIHRoZSBwYWdlIGlzIHJlbWFwcGVkIGxhdGVyCisJCQkgKi8KKwkJCWdldF9hbm9uX3ZtYShhbm9uX3ZtYSk7CisJCQlwYWdlX3VubG9ja19hbm9uX3ZtYShhbm9uX3ZtYSk7CisJCX0gZWxzZSBpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkgewogCQkJLyoKIAkJCSAqIFdlIGNhbm5vdCBiZSBzdXJlIHRoYXQgdGhlIGFub25fdm1hIG9mIGFuIHVubWFwcGVkCiAJCQkgKiBzd2FwY2FjaGUgcGFnZSBpcyBzYWZlIHRvIHVzZSBiZWNhdXNlIHdlIGRvbid0CkBAIC03MDAsMTMgKzcyNyw3IEBACiAJCQkgKi8KIAkJCXJlbWFwX3N3YXBjYWNoZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGFrZSBhIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgYW5vbl92bWEgaWYgdGhlCi0JCQkgKiBwYWdlIGlzIG1hcHBlZCBzbyB0aGF0IGl0IGlzIGd1YXJhbnRlZWQgdG8KLQkJCSAqIGV4aXN0IHdoZW4gdGhlIHBhZ2UgaXMgcmVtYXBwZWQgbGF0ZXIKLQkJCSAqLwotCQkJYW5vbl92bWEgPSBwYWdlX2Fub25fdm1hKHBhZ2UpOwotCQkJZ2V0X2Fub25fdm1hKGFub25fdm1hKTsKKwkJCWdvdG8gdW5jaGFyZ2U7CiAJCX0KIAl9CiAKQEAgLTcyMywxNiArNzQ0LDEwIEBACiAJICogZnJlZSB0aGUgbWV0YWRhdGEsIHNvIHRoZSBwYWdlIGNhbiBiZSBmcmVlZC4KIAkgKi8KIAlpZiAoIXBhZ2UtPm1hcHBpbmcpIHsKLQkJaWYgKCFQYWdlQW5vbihwYWdlKSAmJiBwYWdlX2hhc19wcml2YXRlKHBhZ2UpKSB7Ci0JCQkvKgotCQkJICogR28gZGlyZWN0IHRvIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBoZXJlIGJlY2F1c2UKLQkJCSAqIGEpIHRoYXQncyB3aGF0IHRyeV90b19yZWxlYXNlX3BhZ2UoKSB3b3VsZCBkbyBhbnl3YXkKLQkJCSAqIGIpIHdlIG1heSBiZSB1bmRlciByY3VfcmVhZF9sb2NrKCkgaGVyZSwgc28gd2UgY2FuJ3QKLQkJCSAqICAgIHVzZSBHRlBfS0VSTkVMIHdoaWNoIGlzIHdoYXQgdHJ5X3RvX3JlbGVhc2VfcGFnZSgpCi0JCQkgKiAgICBuZWVkcyB0byBiZSBlZmZlY3RpdmUuCi0JCQkgKi8KKwkJVk1fQlVHX09OKFBhZ2VBbm9uKHBhZ2UpKTsKKwkJaWYgKHBhZ2VfaGFzX3ByaXZhdGUocGFnZSkpIHsKIAkJCXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Ci0JCQlnb3RvIHJjdV91bmxvY2s7CisJCQlnb3RvIHVuY2hhcmdlOwogCQl9CiAJCWdvdG8gc2tpcF91bm1hcDsKIAl9CkBAIC03NDYsMTcgKzc2MSwxNCBAQAogCiAJaWYgKHJjICYmIHJlbWFwX3N3YXBjYWNoZSkKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIHBhZ2UpOwotcmN1X3VubG9jazoKIAogCS8qIERyb3AgYW4gYW5vbl92bWEgcmVmZXJlbmNlIGlmIHdlIHRvb2sgb25lICovCiAJaWYgKGFub25fdm1hKQogCQlkcm9wX2Fub25fdm1hKGFub25fdm1hKTsKIAotCWlmIChyY3VfbG9ja2VkKQotCQlyY3VfcmVhZF91bmxvY2soKTsKIHVuY2hhcmdlOgogCWlmICghY2hhcmdlKQotCQltZW1fY2dyb3VwX2VuZF9taWdyYXRpb24obWVtLCBwYWdlLCBuZXdwYWdlKTsKKwkJbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKG1lbSwgcGFnZSwgbmV3cGFnZSwgcmMgPT0gMCk7CiB1bmxvY2s6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKQEAgLTgxMCwxMiArODIyLDExIEBACiAgKi8KIHN0YXRpYyBpbnQgdW5tYXBfYW5kX21vdmVfaHVnZV9wYWdlKG5ld19wYWdlX3QgZ2V0X25ld19wYWdlLAogCQkJCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgc3RydWN0IHBhZ2UgKmhwYWdlLAotCQkJCWludCBmb3JjZSwgaW50IG9mZmxpbmluZykKKwkJCQlpbnQgZm9yY2UsIGJvb2wgb2ZmbGluaW5nLCBib29sIHN5bmMpCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgKnJlc3VsdCA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKm5ld19ocGFnZSA9IGdldF9uZXdfcGFnZShocGFnZSwgcHJpdmF0ZSwgJnJlc3VsdCk7Ci0JaW50IHJjdV9sb2NrZWQgPSAwOwogCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSBOVUxMOwogCiAJaWYgKCFuZXdfaHBhZ2UpCkBAIC04MjQsMTggKzgzNSwxNiBAQAogCXJjID0gLUVBR0FJTjsKIAogCWlmICghdHJ5bG9ja19wYWdlKGhwYWdlKSkgewotCQlpZiAoIWZvcmNlKQorCQlpZiAoIWZvcmNlIHx8ICFzeW5jKQogCQkJZ290byBvdXQ7CiAJCWxvY2tfcGFnZShocGFnZSk7CiAJfQogCiAJaWYgKFBhZ2VBbm9uKGhwYWdlKSkgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXJjdV9sb2NrZWQgPSAxOwotCi0JCWlmIChwYWdlX21hcHBlZChocGFnZSkpIHsKLQkJCWFub25fdm1hID0gcGFnZV9hbm9uX3ZtYShocGFnZSk7Ci0JCQlhdG9taWNfaW5jKCZhbm9uX3ZtYS0+ZXh0ZXJuYWxfcmVmY291bnQpOworCQlhbm9uX3ZtYSA9IHBhZ2VfbG9ja19hbm9uX3ZtYShocGFnZSk7CisJCWlmIChhbm9uX3ZtYSkgeworCQkJZ2V0X2Fub25fdm1hKGFub25fdm1hKTsKKwkJCXBhZ2VfdW5sb2NrX2Fub25fdm1hKGFub25fdm1hKTsKIAkJfQogCX0KIApAQCAtODQ3LDE2ICs4NTYsOCBAQAogCWlmIChyYykKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKGhwYWdlLCBocGFnZSk7CiAKLQlpZiAoYW5vbl92bWEgJiYgYXRvbWljX2RlY19hbmRfbG9jaygmYW5vbl92bWEtPmV4dGVybmFsX3JlZmNvdW50LAotCQkJCQkgICAgJmFub25fdm1hLT5sb2NrKSkgewotCQlpbnQgZW1wdHkgPSBsaXN0X2VtcHR5KCZhbm9uX3ZtYS0+aGVhZCk7Ci0JCXNwaW5fdW5sb2NrKCZhbm9uX3ZtYS0+bG9jayk7Ci0JCWlmIChlbXB0eSkKLQkJCWFub25fdm1hX2ZyZWUoYW5vbl92bWEpOwotCX0KLQotCWlmIChyY3VfbG9ja2VkKQotCQlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoYW5vbl92bWEpCisJCWRyb3BfYW5vbl92bWEoYW5vbl92bWEpOwogb3V0OgogCXVubG9ja19wYWdlKGhwYWdlKTsKIApAQCAtODkyLDcgKzg5Myw4IEBACiAgKiBSZXR1cm46IE51bWJlciBvZiBwYWdlcyBub3QgbWlncmF0ZWQgb3IgZXJyb3IgY29kZS4KICAqLwogaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqZnJvbSwKLQkJbmV3X3BhZ2VfdCBnZXRfbmV3X3BhZ2UsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50IG9mZmxpbmluZykKKwkJbmV3X3BhZ2VfdCBnZXRfbmV3X3BhZ2UsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgYm9vbCBvZmZsaW5pbmcsCisJCWJvb2wgc3luYykKIHsKIAlpbnQgcmV0cnkgPSAxOwogCWludCBucl9mYWlsZWQgPSAwOwpAQCAtOTEyLDcgKzkxNCw4IEBACiAJCQljb25kX3Jlc2NoZWQoKTsKIAogCQkJcmMgPSB1bm1hcF9hbmRfbW92ZShnZXRfbmV3X3BhZ2UsIHByaXZhdGUsCi0JCQkJCQlwYWdlLCBwYXNzID4gMiwgb2ZmbGluaW5nKTsKKwkJCQkJCXBhZ2UsIHBhc3MgPiAyLCBvZmZsaW5pbmcsCisJCQkJCQlzeW5jKTsKIAogCQkJc3dpdGNoKHJjKSB7CiAJCQljYXNlIC1FTk9NRU06CkBAIC05NDEsNyArOTQ0LDggQEAKIH0KIAogaW50IG1pZ3JhdGVfaHVnZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpmcm9tLAotCQluZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLCBpbnQgb2ZmbGluaW5nKQorCQluZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlLCBib29sIG9mZmxpbmluZywKKwkJYm9vbCBzeW5jKQogewogCWludCByZXRyeSA9IDE7CiAJaW50IG5yX2ZhaWxlZCA9IDA7CkBAIC05NTcsNyArOTYxLDggQEAKIAkJCWNvbmRfcmVzY2hlZCgpOwogCiAJCQlyYyA9IHVubWFwX2FuZF9tb3ZlX2h1Z2VfcGFnZShnZXRfbmV3X3BhZ2UsCi0JCQkJCXByaXZhdGUsIHBhZ2UsIHBhc3MgPiAyLCBvZmZsaW5pbmcpOworCQkJCQlwcml2YXRlLCBwYWdlLCBwYXNzID4gMiwgb2ZmbGluaW5nLAorCQkJCQlzeW5jKTsKIAogCQkJc3dpdGNoKHJjKSB7CiAJCQljYXNlIC1FTk9NRU06CkBAIC0xMDQyLDcgKzEwNDcsNyBAQAogCQlpZiAoIXZtYSB8fCBwcC0+YWRkciA8IHZtYS0+dm1fc3RhcnQgfHwgIXZtYV9taWdyYXRhYmxlKHZtYSkpCiAJCQlnb3RvIHNldF9zdGF0dXM7CiAKLQkJcGFnZSA9IGZvbGxvd19wYWdlKHZtYSwgcHAtPmFkZHIsIEZPTExfR0VUKTsKKwkJcGFnZSA9IGZvbGxvd19wYWdlKHZtYSwgcHAtPmFkZHIsIEZPTExfR0VUfEZPTExfU1BMSVQpOwogCiAJCWVyciA9IFBUUl9FUlIocGFnZSk7CiAJCWlmIChJU19FUlIocGFnZSkpCkBAIC0xMDkwLDcgKzEwOTUsNyBAQAogCWVyciA9IDA7CiAJaWYgKCFsaXN0X2VtcHR5KCZwYWdlbGlzdCkpIHsKIAkJZXJyID0gbWlncmF0ZV9wYWdlcygmcGFnZWxpc3QsIG5ld19wYWdlX25vZGUsCi0JCQkJKHVuc2lnbmVkIGxvbmcpcG0sIDApOworCQkJCSh1bnNpZ25lZCBsb25nKXBtLCAwLCB0cnVlKTsKIAkJaWYgKGVycikKIAkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbWluY29yZS5jIGIvbW0vbWluY29yZS5jCmluZGV4IDlhYzQyZGMuLmE0ZTZiOWQgMTAwNjQ0Ci0tLSBhL21tL21pbmNvcmUuYworKysgYi9tbS9taW5jb3JlLmMKQEAgLTE1NCw2ICsxNTQsMTMgQEAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSkgeworCQkJaWYgKG1pbmNvcmVfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHIsIG5leHQsIHZlYykpIHsKKwkJCQl2ZWMgKz0gKG5leHQgLSBhZGRyKSA+PiBQQUdFX1NISUZUOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCX0KIAkJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQogCQkJbWluY29yZV91bm1hcHBlZF9yYW5nZSh2bWEsIGFkZHIsIG5leHQsIHZlYyk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IGI3MDkxOWMuLjEzZTgxZWUgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtMTU1LDEzICsxNTUsMTIgQEAKICAqIHZtYS0+dm1fbW0tPm1tYXBfc2VtIG11c3QgYmUgaGVsZCBmb3IgYXQgbGVhc3QgcmVhZC4KICAqLwogc3RhdGljIGxvbmcgX19tbG9ja192bWFfcGFnZXNfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQorCQkJCSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQkgICAgaW50ICpub25ibG9ja2luZykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnQ7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2VzWzE2XTsgLyogMTYgZ2l2ZXMgYSByZWFzb25hYmxlIGJhdGNoICovCiAJaW50IG5yX3BhZ2VzID0gKGVuZCAtIHN0YXJ0KSAvIFBBR0VfU0laRTsKLQlpbnQgcmV0ID0gMDsKIAlpbnQgZ3VwX2ZsYWdzOwogCiAJVk1fQlVHX09OKHN0YXJ0ICYgflBBR0VfTUFTSyk7CkBAIC0xNzAsNzMgKzE2OSwyNiBAQAogCVZNX0JVR19PTihlbmQgICA+IHZtYS0+dm1fZW5kKTsKIAlWTV9CVUdfT04oIXJ3c2VtX2lzX2xvY2tlZCgmbW0tPm1tYXBfc2VtKSk7CiAKLQlndXBfZmxhZ3MgPSBGT0xMX1RPVUNIIHwgRk9MTF9HRVQ7Ci0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkKKwlndXBfZmxhZ3MgPSBGT0xMX1RPVUNIOworCS8qCisJICogV2Ugd2FudCB0byB0b3VjaCB3cml0YWJsZSBtYXBwaW5ncyB3aXRoIGEgd3JpdGUgZmF1bHQgaW4gb3JkZXIKKwkgKiB0byBicmVhayBDT1csIGV4Y2VwdCBmb3Igc2hhcmVkIG1hcHBpbmdzIGJlY2F1c2UgdGhlc2UgZG9uJ3QgQ09XCisJICogYW5kIHdlIHdvdWxkIG5vdCB3YW50IHRvIGRpcnR5IHRoZW0gZm9yIG5vdGhpbmcuCisJICovCisJaWYgKCh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFIHwgVk1fU0hBUkVEKSkgPT0gVk1fV1JJVEUpCiAJCWd1cF9mbGFncyB8PSBGT0xMX1dSSVRFOwogCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpCisJCWd1cF9mbGFncyB8PSBGT0xMX01MT0NLOworCiAJLyogV2UgZG9uJ3QgdHJ5IHRvIGFjY2VzcyB0aGUgZ3VhcmQgcGFnZSBvZiBhIHN0YWNrIHZtYSAqLwogCWlmIChzdGFja19ndWFyZF9wYWdlKHZtYSwgc3RhcnQpKSB7CiAJCWFkZHIgKz0gUEFHRV9TSVpFOwogCQlucl9wYWdlcy0tOwogCX0KIAotCXdoaWxlIChucl9wYWdlcyA+IDApIHsKLQkJaW50IGk7Ci0KLQkJY29uZF9yZXNjaGVkKCk7Ci0KLQkJLyoKLQkJICogZ2V0X3VzZXJfcGFnZXMgbWFrZXMgcGFnZXMgcHJlc2VudCBpZiB3ZSBhcmUKLQkJICogc2V0dGluZyBtbG9jay4gYW5kIHRoaXMgZXh0cmEgcmVmZXJlbmNlIGNvdW50IHdpbGwKLQkJICogZGlzYWJsZSBtaWdyYXRpb24gb2YgdGhpcyBwYWdlLiAgSG93ZXZlciwgcGFnZSBtYXkKLQkJICogc3RpbGwgYmUgdHJ1bmNhdGVkIG91dCBmcm9tIHVuZGVyIHVzLgotCQkgKi8KLQkJcmV0ID0gX19nZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkciwKLQkJCQltaW5fdChpbnQsIG5yX3BhZ2VzLCBBUlJBWV9TSVpFKHBhZ2VzKSksCi0JCQkJZ3VwX2ZsYWdzLCBwYWdlcywgTlVMTCk7Ci0JCS8qCi0JCSAqIFRoaXMgY2FuIGhhcHBlbiBmb3IsIGUuZy4sIFZNX05PTkxJTkVBUiByZWdpb25zIGJlZm9yZQotCQkgKiBhIHBhZ2UgaGFzIGJlZW4gYWxsb2NhdGVkIGFuZCBtYXBwZWQgYXQgYSBnaXZlbiBvZmZzZXQsCi0JCSAqIG9yIGZvciBhZGRyZXNzZXMgdGhhdCBtYXAgYmV5b25kIGVuZCBvZiBhIGZpbGUuCi0JCSAqIFdlJ2xsIG1sb2NrIHRoZSBwYWdlcyBpZi93aGVuIHRoZXkgZ2V0IGZhdWx0ZWQgaW4uCi0JCSAqLwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCi0JCWxydV9hZGRfZHJhaW4oKTsJLyogcHVzaCBjYWNoZWQgcGFnZXMgdG8gTFJVICovCi0KLQkJZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW2ldOwotCi0JCQlpZiAocGFnZS0+bWFwcGluZykgewotCQkJCS8qCi0JCQkJICogVGhhdCBwcmVsaW1pbmFyeSBjaGVjayBpcyBtYWlubHkgdG8gYXZvaWQKLQkJCQkgKiB0aGUgcG9pbnRsZXNzIG92ZXJoZWFkIG9mIGxvY2tfcGFnZSBvbiB0aGUKLQkJCQkgKiBaRVJPX1BBR0U6IHdoaWNoIG1pZ2h0IGJvdW5jZSB2ZXJ5IGJhZGx5IGlmCi0JCQkJICogdGhlcmUgaXMgY29udGVudGlvbi4gIEhvd2V2ZXIsIHdlJ3JlIHN0aWxsCi0JCQkJICogZGlydHlpbmcgaXRzIGNhY2hlbGluZSB3aXRoIGdldC9wdXRfcGFnZToKLQkJCQkgKiB3ZSdsbCBhZGQgYW5vdGhlciBfX2dldF91c2VyX3BhZ2VzIGZsYWcgdG8KLQkJCQkgKiBhdm9pZCBpdCBpZiB0aGF0IGNhc2UgdHVybnMgb3V0IHRvIG1hdHRlci4KLQkJCQkgKi8KLQkJCQlsb2NrX3BhZ2UocGFnZSk7Ci0JCQkJLyoKLQkJCQkgKiBCZWNhdXNlIHdlIGxvY2sgcGFnZSBoZXJlIGFuZCBtaWdyYXRpb24gaXMKLQkJCQkgKiBibG9ja2VkIGJ5IHRoZSBlbGV2YXRlZCByZWZlcmVuY2UsIHdlIG5lZWQKLQkJCQkgKiBvbmx5IGNoZWNrIGZvciBmaWxlLWNhY2hlIHBhZ2UgdHJ1bmNhdGlvbi4KLQkJCQkgKi8KLQkJCQlpZiAocGFnZS0+bWFwcGluZykKLQkJCQkJbWxvY2tfdm1hX3BhZ2UocGFnZSk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQl9Ci0JCQlwdXRfcGFnZShwYWdlKTsJLyogcmVmIGZyb20gZ2V0X3VzZXJfcGFnZXMoKSAqLwotCQl9Ci0KLQkJYWRkciArPSByZXQgKiBQQUdFX1NJWkU7Ci0JCW5yX3BhZ2VzIC09IHJldDsKLQkJcmV0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwkvKiAwIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgKi8KKwlyZXR1cm4gX19nZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkciwgbnJfcGFnZXMsIGd1cF9mbGFncywKKwkJCQlOVUxMLCBOVUxMLCBub25ibG9ja2luZyk7CiB9CiAKIC8qCkBAIC0yODAsNyArMjMyLDcgQEAKIAkJCWlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpIHx8CiAJCQl2bWEgPT0gZ2V0X2dhdGVfdm1hKGN1cnJlbnQpKSkgewogCi0JCV9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7CisJCV9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCwgTlVMTCk7CiAKIAkJLyogSGlkZSBlcnJvcnMgZnJvbSBtbWFwKCkgYW5kIG90aGVyIGNhbGxlcnMgKi8KIAkJcmV0dXJuIDA7CkBAIC0zNzIsMTggKzMyNCwxMCBAQAogCWludCByZXQgPSAwOwogCWludCBsb2NrID0gbmV3ZmxhZ3MgJiBWTV9MT0NLRUQ7CiAKLQlpZiAobmV3ZmxhZ3MgPT0gdm1hLT52bV9mbGFncyB8fAotCQkJKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9QRk5NQVApKSkKKwlpZiAobmV3ZmxhZ3MgPT0gdm1hLT52bV9mbGFncyB8fCAodm1hLT52bV9mbGFncyAmIFZNX1NQRUNJQUwpIHx8CisJICAgIGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpIHx8IHZtYSA9PSBnZXRfZ2F0ZV92bWEoY3VycmVudCkpCiAJCWdvdG8gb3V0OwkvKiBkb24ndCBzZXQgVk1fTE9DS0VELCAgZG9uJ3QgY291bnQgKi8KIAotCWlmICgodm1hLT52bV9mbGFncyAmIChWTV9ET05URVhQQU5EIHwgVk1fUkVTRVJWRUQpKSB8fAotCQkJaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkgfHwKLQkJCXZtYSA9PSBnZXRfZ2F0ZV92bWEoY3VycmVudCkpIHsKLQkJaWYgKGxvY2spCi0JCQltYWtlX3BhZ2VzX3ByZXNlbnQoc3RhcnQsIGVuZCk7Ci0JCWdvdG8gb3V0OwkvKiBkb24ndCBzZXQgVk1fTE9DS0VELCAgZG9uJ3QgY291bnQgKi8KLQl9Ci0KIAlwZ29mZiA9IHZtYS0+dm1fcGdvZmYgKyAoKHN0YXJ0IC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7CiAJKnByZXYgPSB2bWFfbWVyZ2UobW0sICpwcmV2LCBzdGFydCwgZW5kLCBuZXdmbGFncywgdm1hLT5hbm9uX3ZtYSwKIAkJCSAgdm1hLT52bV9maWxlLCBwZ29mZiwgdm1hX3BvbGljeSh2bWEpKTsKQEAgLTQxOSwxNCArMzYzLDEwIEBACiAJICogc2V0IFZNX0xPQ0tFRCwgX19tbG9ja192bWFfcGFnZXNfcmFuZ2Ugd2lsbCBicmluZyBpdCBiYWNrLgogCSAqLwogCi0JaWYgKGxvY2spIHsKKwlpZiAobG9jaykKIAkJdm1hLT52bV9mbGFncyA9IG5ld2ZsYWdzOwotCQlyZXQgPSBfX21sb2NrX3ZtYV9wYWdlc19yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldCA9IF9fbWxvY2tfcG9zaXhfZXJyb3JfcmV0dXJuKHJldCk7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCW11bmxvY2tfdm1hX3BhZ2VzX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7Ci0JfQogCiBvdXQ6CiAJKnByZXYgPSB2bWE7CkBAIC00MzksNyArMzc5LDggQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsICogcHJldjsKIAlpbnQgZXJyb3I7CiAKLQlsZW4gPSBQQUdFX0FMSUdOKGxlbik7CisJVk1fQlVHX09OKHN0YXJ0ICYgflBBR0VfTUFTSyk7CisJVk1fQlVHX09OKGxlbiAhPSBQQUdFX0FMSUdOKGxlbikpOwogCWVuZCA9IHN0YXJ0ICsgbGVuOwogCWlmIChlbmQgPCBzdGFydCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00ODIsNiArNDIzLDYyIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitzdGF0aWMgaW50IGRvX21sb2NrX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sIGludCBpZ25vcmVfZXJyb3JzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJdW5zaWduZWQgbG9uZyBlbmQsIG5zdGFydCwgbmVuZDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CisJaW50IGxvY2tlZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwlWTV9CVUdfT04oc3RhcnQgJiB+UEFHRV9NQVNLKTsKKwlWTV9CVUdfT04obGVuICE9IFBBR0VfQUxJR04obGVuKSk7CisJZW5kID0gc3RhcnQgKyBsZW47CisKKwlmb3IgKG5zdGFydCA9IHN0YXJ0OyBuc3RhcnQgPCBlbmQ7IG5zdGFydCA9IG5lbmQpIHsKKwkJLyoKKwkJICogV2Ugd2FudCB0byBmYXVsdCBpbiBwYWdlcyBmb3IgW25zdGFydDsgZW5kKSBhZGRyZXNzIHJhbmdlLgorCQkgKiBGaW5kIGZpcnN0IGNvcnJlc3BvbmRpbmcgVk1BLgorCQkgKi8KKwkJaWYgKCFsb2NrZWQpIHsKKwkJCWxvY2tlZCA9IDE7CisJCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCQl2bWEgPSBmaW5kX3ZtYShtbSwgbnN0YXJ0KTsKKwkJfSBlbHNlIGlmIChuc3RhcnQgPj0gdm1hLT52bV9lbmQpCisJCQl2bWEgPSB2bWEtPnZtX25leHQ7CisJCWlmICghdm1hIHx8IHZtYS0+dm1fc3RhcnQgPj0gZW5kKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFNldCBbbnN0YXJ0OyBuZW5kKSB0byBpbnRlcnNlY3Rpb24gb2YgZGVzaXJlZCBhZGRyZXNzCisJCSAqIHJhbmdlIHdpdGggdGhlIGZpcnN0IFZNQS4gQWxzbywgc2tpcCB1bmRlc2lyYWJsZSBWTUEgdHlwZXMuCisJCSAqLworCQluZW5kID0gbWluKGVuZCwgdm1hLT52bV9lbmQpOworCQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9JTyB8IFZNX1BGTk1BUCkpCisJCQljb250aW51ZTsKKwkJaWYgKG5zdGFydCA8IHZtYS0+dm1fc3RhcnQpCisJCQluc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCQkvKgorCQkgKiBOb3cgZmF1bHQgaW4gYSByYW5nZSBvZiBwYWdlcy4gX19tbG9ja192bWFfcGFnZXNfcmFuZ2UoKQorCQkgKiBkb3VibGUgY2hlY2tzIHRoZSB2bWEgZmxhZ3MsIHNvIHRoYXQgaXQgd29uJ3QgbWxvY2sgcGFnZXMKKwkJICogaWYgdGhlIHZtYSB3YXMgYWxyZWFkeSBtdW5sb2NrZWQuCisJCSAqLworCQlyZXQgPSBfX21sb2NrX3ZtYV9wYWdlc19yYW5nZSh2bWEsIG5zdGFydCwgbmVuZCwgJmxvY2tlZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoaWdub3JlX2Vycm9ycykgeworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CS8qIGNvbnRpbnVlIGF0IG5leHQgVk1BICovCisJCQl9CisJCQlyZXQgPSBfX21sb2NrX3Bvc2l4X2Vycm9yX3JldHVybihyZXQpOworCQkJYnJlYWs7CisJCX0KKwkJbmVuZCA9IG5zdGFydCArIHJldCAqIFBBR0VfU0laRTsKKwkJcmV0ID0gMDsKKwl9CisJaWYgKGxvY2tlZCkKKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OwkvKiAwIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgKi8KK30KKwogU1lTQ0FMTF9ERUZJTkUyKG1sb2NrLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBsb2NrZWQ7CkBAIC01MDcsNiArNTA0LDggQEAKIAlpZiAoKGxvY2tlZCA8PSBsb2NrX2xpbWl0KSB8fCBjYXBhYmxlKENBUF9JUENfTE9DSykpCiAJCWVycm9yID0gZG9fbWxvY2soc3RhcnQsIGxlbiwgMSk7CiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBkb19tbG9ja19wYWdlcyhzdGFydCwgbGVuLCAwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTU3MSw2ICs1NzAsMTAgQEAKIAkgICAgY2FwYWJsZShDQVBfSVBDX0xPQ0spKQogCQlyZXQgPSBkb19tbG9ja2FsbChmbGFncyk7CiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJaWYgKCFyZXQgJiYgKGZsYWdzICYgTUNMX0NVUlJFTlQpKSB7CisJCS8qIElnbm9yZSBlcnJvcnMgKi8KKwkJZG9fbWxvY2tfcGFnZXMoMCwgVEFTS19TSVpFLCAxKTsKKwl9CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCA1MGE0YWEwLi4yZWM4ZWI1IDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgva2h1Z2VwYWdlZC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjUzLDcgKzI1NCwxNSBAQAogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUX0JSSwotCW1pbl9icmsgPSBtbS0+ZW5kX2NvZGU7CisJLyoKKwkgKiBDT05GSUdfQ09NUEFUX0JSSyBjYW4gc3RpbGwgYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nCisJICogcmFuZG9taXplX3ZhX3NwYWNlIHRvIDIsIHdoaWNoIHdpbGwgc3RpbGwgY2F1c2UgbW0tPnN0YXJ0X2JyaworCSAqIHRvIGJlIGFyYml0cmFyaWx5IHNoaWZ0ZWQKKwkgKi8KKwlpZiAobW0tPnN0YXJ0X2JyayA+IFBBR0VfQUxJR04obW0tPmVuZF9kYXRhKSkKKwkJbWluX2JyayA9IG1tLT5zdGFydF9icms7CisJZWxzZQorCQltaW5fYnJrID0gbW0tPmVuZF9kYXRhOwogI2Vsc2UKIAltaW5fYnJrID0gbW0tPnN0YXJ0X2JyazsKICNlbmRpZgpAQCAtNTg4LDYgKzU5Nyw4IEBACiAJCX0KIAl9CiAKKwl2bWFfYWRqdXN0X3RyYW5zX2h1Z2Uodm1hLCBzdGFydCwgZW5kLCBhZGp1c3RfbmV4dCk7CisKIAkvKgogCSAqIFdoZW4gY2hhbmdpbmcgb25seSB2bWEtPnZtX2VuZCwgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYW5vbl92bWEKIAkgKiBsb2NrLiBUaGlzIGlzIGEgZmFpcmx5IHJhcmUgY2FzZSBieSBpdHNlbGYsIGJ1dCB0aGUgYW5vbl92bWEKQEAgLTgxNSw2ICs4MjYsNyBAQAogCQkJCWVuZCwgcHJldi0+dm1fcGdvZmYsIE5VTEwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIE5VTEw7CisJCWtodWdlcGFnZWRfZW50ZXJfdm1hX21lcmdlKHByZXYpOwogCQlyZXR1cm4gcHJldjsKIAl9CiAKQEAgLTgzMyw2ICs4NDUsNyBAQAogCQkJCW5leHQtPnZtX3Bnb2ZmIC0gcGdsZW4sIE5VTEwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIE5VTEw7CisJCWtodWdlcGFnZWRfZW50ZXJfdm1hX21lcmdlKGFyZWEpOwogCQlyZXR1cm4gYXJlYTsKIAl9CiAKQEAgLTE3NjEsNiArMTc3NCw3IEBACiAJCX0KIAl9CiAJdm1hX3VubG9ja19hbm9uX3ZtYSh2bWEpOworCWtodWdlcGFnZWRfZW50ZXJfdm1hX21lcmdlKHZtYSk7CiAJcmV0dXJuIGVycm9yOwogfQogI2VuZGlmIC8qIENPTkZJR19TVEFDS19HUk9XU1VQIHx8IENPTkZJR19JQTY0ICovCkBAIC0xODA4LDYgKzE4MjIsNyBAQAogCQl9CiAJfQogCXZtYV91bmxvY2tfYW5vbl92bWEodm1hKTsKKwlraHVnZXBhZ2VkX2VudGVyX3ZtYV9tZXJnZSh2bWEpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vbW11X25vdGlmaWVyLmMgYi9tbS9tbXVfbm90aWZpZXIuYwppbmRleCA0Mzg5NTFkLi44ZDAzMmRlIDEwMDY0NAotLS0gYS9tbS9tbXVfbm90aWZpZXIuYworKysgYi9tbS9tbXVfbm90aWZpZXIuYwpAQCAtMTAwLDYgKzEwMCwyNiBAQAogCXJldHVybiB5b3VuZzsKIH0KIAoraW50IF9fbW11X25vdGlmaWVyX3Rlc3RfeW91bmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc3RydWN0IG1tdV9ub3RpZmllciAqbW47CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJaW50IHlvdW5nID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobW4sIG4sICZtbS0+bW11X25vdGlmaWVyX21tLT5saXN0LCBobGlzdCkgeworCQlpZiAobW4tPm9wcy0+dGVzdF95b3VuZykgeworCQkJeW91bmcgPSBtbi0+b3BzLT50ZXN0X3lvdW5nKG1uLCBtbSwgYWRkcmVzcyk7CisJCQlpZiAoeW91bmcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4geW91bmc7Cit9CisKIHZvaWQgX19tbXVfbm90aWZpZXJfY2hhbmdlX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgICAgIHB0ZV90IHB0ZSkKIHsKZGlmZiAtLWdpdCBhL21tL21tem9uZS5jIGIvbW0vbW16b25lLmMKaW5kZXggZTM1YmZiOC4uZjViN2QxNyAxMDA2NDQKLS0tIGEvbW0vbW16b25lLmMKKysrIGIvbW0vbW16b25lLmMKQEAgLTg3LDI0ICs4NywzIEBACiAJcmV0dXJuIDE7CiB9CiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfSEFTX0hPTEVTX01FTU9SWU1PREVMICovCi0KLSNpZmRlZiBDT05GSUdfU01QCi0vKiBDYWxsZWQgd2hlbiBhIG1vcmUgYWNjdXJhdGUgdmlldyBvZiBOUl9GUkVFX1BBR0VTIGlzIG5lZWRlZCAqLwotdW5zaWduZWQgbG9uZyB6b25lX25yX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpCi17Ci0JdW5zaWduZWQgbG9uZyBucl9mcmVlX3BhZ2VzID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpOwotCi0JLyoKLQkgKiBXaGlsZSBrc3dhcGQgaXMgYXdha2UsIGl0IGlzIGNvbnNpZGVyZWQgdGhlIHpvbmUgaXMgdW5kZXIgc29tZQotCSAqIG1lbW9yeSBwcmVzc3VyZS4gVW5kZXIgcHJlc3N1cmUsIHRoZXJlIGlzIGEgcmlzayB0aGF0Ci0JICogcGVyLWNwdS1jb3VudGVyLWRyaWZ0IHdpbGwgYWxsb3cgdGhlIG1pbiB3YXRlcm1hcmsgdG8gYmUgYnJlYWNoZWQKLQkgKiBwb3RlbnRpYWxseSBjYXVzaW5nIGEgbGl2ZS1sb2NrLiBXaGlsZSBrc3dhcGQgaXMgYXdha2UgYW5kCi0JICogZnJlZSBwYWdlcyBhcmUgbG93LCBnZXQgYSBiZXR0ZXIgZXN0aW1hdGUgZm9yIGZyZWUgcGFnZXMKLQkgKi8KLQlpZiAobnJfZnJlZV9wYWdlcyA8IHpvbmUtPnBlcmNwdV9kcmlmdF9tYXJrICYmCi0JCQkhd2FpdHF1ZXVlX2FjdGl2ZSgmem9uZS0+em9uZV9wZ2RhdC0+a3N3YXBkX3dhaXQpKQotCQlyZXR1cm4gem9uZV9wYWdlX3N0YXRlX3NuYXBzaG90KHpvbmUsIE5SX0ZSRUVfUEFHRVMpOwotCi0JcmV0dXJuIG5yX2ZyZWVfcGFnZXM7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwpkaWZmIC0tZ2l0IGEvbW0vbXByb3RlY3QuYyBiL21tL21wcm90ZWN0LmMKaW5kZXggNGM1MTMzOC4uNWE2ODhhMiAxMDA2NDQKLS0tIGEvbW0vbXByb3RlY3QuYworKysgYi9tbS9tcHJvdGVjdC5jCkBAIC03OCw3ICs3OCw3IEBACiAJcHRlX3VubWFwX3VubG9jayhwdGUgLSAxLCBwdGwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX3BtZF9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHVkX3QgKnB1ZCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfcG1kX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwdWRfdCAqcHVkLAogCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ3Byb3RfdCBuZXdwcm90LAogCQlpbnQgZGlydHlfYWNjb3VudGFibGUpCiB7CkBAIC04OCwxMyArODgsMjEgQEAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSkgeworCQkJaWYgKG5leHQgLSBhZGRyICE9IEhQQUdFX1BNRF9TSVpFKQorCQkJCXNwbGl0X2h1Z2VfcGFnZV9wbWQodm1hLT52bV9tbSwgcG1kKTsKKwkJCWVsc2UgaWYgKGNoYW5nZV9odWdlX3BtZCh2bWEsIHBtZCwgYWRkciwgbmV3cHJvdCkpCisJCQkJY29udGludWU7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJfQogCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCiAJCQljb250aW51ZTsKLQkJY2hhbmdlX3B0ZV9yYW5nZShtbSwgcG1kLCBhZGRyLCBuZXh0LCBuZXdwcm90LCBkaXJ0eV9hY2NvdW50YWJsZSk7CisJCWNoYW5nZV9wdGVfcmFuZ2Uodm1hLT52bV9tbSwgcG1kLCBhZGRyLCBuZXh0LCBuZXdwcm90LAorCQkJCSBkaXJ0eV9hY2NvdW50YWJsZSk7CiAJfSB3aGlsZSAocG1kKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfcHVkX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkLAorc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9wdWRfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBnZF90ICpwZ2QsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsIHBncHJvdF90IG5ld3Byb3QsCiAJCWludCBkaXJ0eV9hY2NvdW50YWJsZSkKIHsKQEAgLTEwNiw3ICsxMTQsOCBAQAogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKIAkJCWNvbnRpbnVlOwotCQljaGFuZ2VfcG1kX3JhbmdlKG1tLCBwdWQsIGFkZHIsIG5leHQsIG5ld3Byb3QsIGRpcnR5X2FjY291bnRhYmxlKTsKKwkJY2hhbmdlX3BtZF9yYW5nZSh2bWEsIHB1ZCwgYWRkciwgbmV4dCwgbmV3cHJvdCwKKwkJCQkgZGlydHlfYWNjb3VudGFibGUpOwogCX0gd2hpbGUgKHB1ZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogfQogCkBAIC0xMjYsNyArMTM1LDggQEAKIAkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCQlpZiAocGdkX25vbmVfb3JfY2xlYXJfYmFkKHBnZCkpCiAJCQljb250aW51ZTsKLQkJY2hhbmdlX3B1ZF9yYW5nZShtbSwgcGdkLCBhZGRyLCBuZXh0LCBuZXdwcm90LCBkaXJ0eV9hY2NvdW50YWJsZSk7CisJCWNoYW5nZV9wdWRfcmFuZ2Uodm1hLCBwZ2QsIGFkZHIsIG5leHQsIG5ld3Byb3QsCisJCQkJIGRpcnR5X2FjY291bnRhYmxlKTsKIAl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlmbHVzaF90bGJfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKTsKIH0KZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmMKaW5kZXggNTYzZmJkZC4uOTkyNWI2MyAxMDA2NDQKLS0tIGEvbW0vbXJlbWFwLmMKKysrIGIvbW0vbXJlbWFwLmMKQEAgLTQxLDEzICs0MSwxNSBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKKwlzcGxpdF9odWdlX3BhZ2VfcG1kKG1tLCBwbWQpOwogCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gcG1kOwogfQogCi1zdGF0aWMgcG1kX3QgKmFsbG9jX25ld19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBwbWRfdCAqYWxsb2NfbmV3X3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKQEAgLTYyLDcgKzY0LDggQEAKIAlpZiAoIXBtZCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpICYmIF9fcHRlX2FsbG9jKG1tLCBwbWQsIGFkZHIpKQorCVZNX0JVR19PTihwbWRfdHJhbnNfaHVnZSgqcG1kKSk7CisJaWYgKHBtZF9ub25lKCpwbWQpICYmIF9fcHRlX2FsbG9jKG1tLCB2bWEsIHBtZCwgYWRkcikpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHBtZDsKQEAgLTE0Nyw3ICsxNTAsNyBAQAogCQlvbGRfcG1kID0gZ2V0X29sZF9wbWQodm1hLT52bV9tbSwgb2xkX2FkZHIpOwogCQlpZiAoIW9sZF9wbWQpCiAJCQljb250aW51ZTsKLQkJbmV3X3BtZCA9IGFsbG9jX25ld19wbWQodm1hLT52bV9tbSwgbmV3X2FkZHIpOworCQluZXdfcG1kID0gYWxsb2NfbmV3X3BtZCh2bWEtPnZtX21tLCB2bWEsIG5ld19hZGRyKTsKIAkJaWYgKCFuZXdfcG1kKQogCQkJYnJlYWs7CiAJCW5leHQgPSAobmV3X2FkZHIgKyBQTURfU0laRSkgJiBQTURfTUFTSzsKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IGVmNDA0NWQuLmY1OWUxNDIgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMTI3LDcgKzEyNyw4IEBACiAKIGludCBfX2dldF91c2VyX3BhZ2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgbnJfcGFnZXMsIHVuc2lnbmVkIGludCBmb2xsX2ZsYWdzLAotCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKnZtYXMpCisJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqdm1hcywKKwkJICAgICBpbnQgKnJldHJ5KQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgdm1fZmxhZ3M7CkBAIC0xODUsNyArMTg2LDggQEAKIAlpZiAoZm9yY2UpCiAJCWZsYWdzIHw9IEZPTExfRk9SQ0U7CiAKLQlyZXR1cm4gX19nZXRfdXNlcl9wYWdlcyh0c2ssIG1tLCBzdGFydCwgbnJfcGFnZXMsIGZsYWdzLCBwYWdlcywgdm1hcyk7CisJcmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXModHNrLCBtbSwgc3RhcnQsIG5yX3BhZ2VzLCBmbGFncywgcGFnZXMsIHZtYXMsCisJCQkJTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKGdldF91c2VyX3BhZ2VzKTsKIApkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggYjRlZGZlNy4uMmNiMDFmNiAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC00MDQsMTUgKzQwNCwxOCBAQAogICogLSB2bS5kaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICBvciAgdm0uZGlydHlfYmFja2dyb3VuZF9ieXRlcwogICogLSB2bS5kaXJ0eV9yYXRpbyAgICAgICAgICAgICBvciAgdm0uZGlydHlfYnl0ZXMKICAqIFRoZSBkaXJ0eSBsaW1pdHMgd2lsbCBiZSBsaWZ0ZWQgYnkgMS80IGZvciBQRl9MRVNTX1RIUk9UVExFIChpZS4gbmZzZCkgYW5kCi0gKiBydW50aW1lIHRhc2tzLgorICogcmVhbC10aW1lIHRhc2tzLgogICovCiB2b2lkIGdsb2JhbF9kaXJ0eV9saW1pdHModW5zaWduZWQgbG9uZyAqcGJhY2tncm91bmQsIHVuc2lnbmVkIGxvbmcgKnBkaXJ0eSkKIHsKIAl1bnNpZ25lZCBsb25nIGJhY2tncm91bmQ7CiAJdW5zaWduZWQgbG9uZyBkaXJ0eTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsYWJsZV9tZW1vcnkgPSBkZXRlcm1pbmVfZGlydHlhYmxlX21lbW9yeSgpOworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoYXZhaWxhYmxlX21lbW9yeSk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAKKwlpZiAoIXZtX2RpcnR5X2J5dGVzIHx8ICFkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzKQorCQlhdmFpbGFibGVfbWVtb3J5ID0gZGV0ZXJtaW5lX2RpcnR5YWJsZV9tZW1vcnkoKTsKKwogCWlmICh2bV9kaXJ0eV9ieXRlcykKIAkJZGlydHkgPSBESVZfUk9VTkRfVVAodm1fZGlydHlfYnl0ZXMsIFBBR0VfU0laRSk7CiAJZWxzZQpAQCAtMTEwMyw3ICsxMTA2LDcgQEAKIGludCBfX3NldF9wYWdlX2RpcnR5X25vX3dyaXRlYmFjayhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpZiAoIVBhZ2VEaXJ0eShwYWdlKSkKLQkJU2V0UGFnZURpcnR5KHBhZ2UpOworCQlyZXR1cm4gIVRlc3RTZXRQYWdlRGlydHkocGFnZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCBmZjdlMTU4Li45MGMxNDM5IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0zNTcsNiArMzU3LDcgQEAKIAl9CiB9CiAKKy8qIHVwZGF0ZSBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBpZiB5b3UgY2hhbmdlIHRoaXMgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgZGVzdHJveV9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9yZGVyKQogewogCWludCBpOwpAQCAtNDI2LDE4ICs0MjcsMTAgQEAKICAqCiAgKiBBc3N1bXB0aW9uOiAqX21lbV9tYXAgaXMgY29udGlndW91cyBhdCBsZWFzdCB1cCB0byBNQVhfT1JERVIKICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCi1fX3BhZ2VfZmluZF9idWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50IG9yZGVyKQotewotCXVuc2lnbmVkIGxvbmcgYnVkZHlfaWR4ID0gcGFnZV9pZHggXiAoMSA8PCBvcmRlcik7Ci0KLQlyZXR1cm4gcGFnZSArIChidWRkeV9pZHggLSBwYWdlX2lkeCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotX19maW5kX2NvbWJpbmVkX2luZGV4KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCBvcmRlcikKK19fZmluZF9idWRkeV9pbmRleCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgb3JkZXIpCiB7Ci0JcmV0dXJuIChwYWdlX2lkeCAmIH4oMSA8PCBvcmRlcikpOworCXJldHVybiBwYWdlX2lkeCBeICgxIDw8IG9yZGVyKTsKIH0KIAogLyoKQEAgLTQ0OCw4ICs0NDEsOCBAQAogICogKGMpIGEgcGFnZSBhbmQgaXRzIGJ1ZGR5IGhhdmUgdGhlIHNhbWUgb3JkZXIgJiYKICAqIChkKSBhIHBhZ2UgYW5kIGl0cyBidWRkeSBhcmUgaW4gdGhlIHNhbWUgem9uZS4KICAqCi0gKiBGb3IgcmVjb3JkaW5nIHdoZXRoZXIgYSBwYWdlIGlzIGluIHRoZSBidWRkeSBzeXN0ZW0sIHdlIHVzZSBQR19idWRkeS4KLSAqIFNldHRpbmcsIGNsZWFyaW5nLCBhbmQgdGVzdGluZyBQR19idWRkeSBpcyBzZXJpYWxpemVkIGJ5IHpvbmUtPmxvY2suCisgKiBGb3IgcmVjb3JkaW5nIHdoZXRoZXIgYSBwYWdlIGlzIGluIHRoZSBidWRkeSBzeXN0ZW0sIHdlIHNldCAtPl9tYXBjb3VudCAtMi4KKyAqIFNldHRpbmcsIGNsZWFyaW5nLCBhbmQgdGVzdGluZyBfbWFwY291bnQgLTIgaXMgc2VyaWFsaXplZCBieSB6b25lLT5sb2NrLgogICoKICAqIEZvciByZWNvcmRpbmcgcGFnZSdzIG9yZGVyLCB3ZSB1c2UgcGFnZV9wcml2YXRlKHBhZ2UpLgogICovCkBAIC00ODIsNyArNDc1LDcgQEAKICAqIGFzIG5lY2Vzc2FyeSwgcGx1cyBzb21lIGFjY291bnRpbmcgbmVlZGVkIHRvIHBsYXkgbmljZWx5IHdpdGggb3RoZXIKICAqIHBhcnRzIG9mIHRoZSBWTSBzeXN0ZW0uCiAgKiBBdCBlYWNoIGxldmVsLCB3ZSBrZWVwIGEgbGlzdCBvZiBwYWdlcywgd2hpY2ggYXJlIGhlYWRzIG9mIGNvbnRpbnVvdXMKLSAqIGZyZWUgcGFnZXMgb2YgbGVuZ3RoIG9mICgxIDw8IG9yZGVyKSBhbmQgbWFya2VkIHdpdGggUEdfYnVkZHkuIFBhZ2UncworICogZnJlZSBwYWdlcyBvZiBsZW5ndGggb2YgKDEgPDwgb3JkZXIpIGFuZCBtYXJrZWQgd2l0aCBfbWFwY291bnQgLTIuIFBhZ2UncwogICogb3JkZXIgaXMgcmVjb3JkZWQgaW4gcGFnZV9wcml2YXRlKHBhZ2UpIGZpZWxkLgogICogU28gd2hlbiB3ZSBhcmUgYWxsb2NhdGluZyBvciBmcmVlaW5nIG9uZSwgd2UgY2FuIGRlcml2ZSB0aGUgc3RhdGUgb2YgdGhlCiAgKiBvdGhlci4gIFRoYXQgaXMsIGlmIHdlIGFsbG9jYXRlIGEgc21hbGwgYmxvY2ssIGFuZCBib3RoIHdlcmUgICAKQEAgLTQ5OSw2ICs0OTIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHg7CiAJdW5zaWduZWQgbG9uZyBjb21iaW5lZF9pZHg7CisJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihidWRkeV9pZHgpOwogCXN0cnVjdCBwYWdlICpidWRkeTsKIAogCWlmICh1bmxpa2VseShQYWdlQ29tcG91bmQocGFnZSkpKQpAQCAtNTEzLDcgKzUwNyw4IEBACiAJVk1fQlVHX09OKGJhZF9yYW5nZSh6b25lLCBwYWdlKSk7CiAKIAl3aGlsZSAob3JkZXIgPCBNQVhfT1JERVItMSkgewotCQlidWRkeSA9IF9fcGFnZV9maW5kX2J1ZGR5KHBhZ2UsIHBhZ2VfaWR4LCBvcmRlcik7CisJCWJ1ZGR5X2lkeCA9IF9fZmluZF9idWRkeV9pbmRleChwYWdlX2lkeCwgb3JkZXIpOworCQlidWRkeSA9IHBhZ2UgKyAoYnVkZHlfaWR4IC0gcGFnZV9pZHgpOwogCQlpZiAoIXBhZ2VfaXNfYnVkZHkocGFnZSwgYnVkZHksIG9yZGVyKSkKIAkJCWJyZWFrOwogCkBAIC01MjEsNyArNTE2LDcgQEAKIAkJbGlzdF9kZWwoJmJ1ZGR5LT5scnUpOwogCQl6b25lLT5mcmVlX2FyZWFbb3JkZXJdLm5yX2ZyZWUtLTsKIAkJcm12X3BhZ2Vfb3JkZXIoYnVkZHkpOwotCQljb21iaW5lZF9pZHggPSBfX2ZpbmRfY29tYmluZWRfaW5kZXgocGFnZV9pZHgsIG9yZGVyKTsKKwkJY29tYmluZWRfaWR4ID0gYnVkZHlfaWR4ICYgcGFnZV9pZHg7CiAJCXBhZ2UgPSBwYWdlICsgKGNvbWJpbmVkX2lkeCAtIHBhZ2VfaWR4KTsKIAkJcGFnZV9pZHggPSBjb21iaW5lZF9pZHg7CiAJCW9yZGVyKys7CkBAIC01MzgsOSArNTMzLDEwIEBACiAJICovCiAJaWYgKChvcmRlciA8IE1BWF9PUkRFUi0yKSAmJiBwZm5fdmFsaWRfd2l0aGluKHBhZ2VfdG9fcGZuKGJ1ZGR5KSkpIHsKIAkJc3RydWN0IHBhZ2UgKmhpZ2hlcl9wYWdlLCAqaGlnaGVyX2J1ZGR5OwotCQljb21iaW5lZF9pZHggPSBfX2ZpbmRfY29tYmluZWRfaW5kZXgocGFnZV9pZHgsIG9yZGVyKTsKLQkJaGlnaGVyX3BhZ2UgPSBwYWdlICsgY29tYmluZWRfaWR4IC0gcGFnZV9pZHg7Ci0JCWhpZ2hlcl9idWRkeSA9IF9fcGFnZV9maW5kX2J1ZGR5KGhpZ2hlcl9wYWdlLCBjb21iaW5lZF9pZHgsIG9yZGVyICsgMSk7CisJCWNvbWJpbmVkX2lkeCA9IGJ1ZGR5X2lkeCAmIHBhZ2VfaWR4OworCQloaWdoZXJfcGFnZSA9IHBhZ2UgKyAoY29tYmluZWRfaWR4IC0gcGFnZV9pZHgpOworCQlidWRkeV9pZHggPSBfX2ZpbmRfYnVkZHlfaW5kZXgoY29tYmluZWRfaWR4LCBvcmRlciArIDEpOworCQloaWdoZXJfYnVkZHkgPSBwYWdlICsgKGJ1ZGR5X2lkeCAtIGNvbWJpbmVkX2lkeCk7CiAJCWlmIChwYWdlX2lzX2J1ZGR5KGhpZ2hlcl9wYWdlLCBoaWdoZXJfYnVkZHksIG9yZGVyICsgMSkpIHsKIAkJCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxydSwKIAkJCQkmem9uZS0+ZnJlZV9hcmVhW29yZGVyXS5mcmVlX2xpc3RbbWlncmF0ZXR5cGVdKTsKQEAgLTY1MSwxMyArNjQ3LDEwIEBACiAJdHJhY2VfbW1fcGFnZV9mcmVlX2RpcmVjdChwYWdlLCBvcmRlcik7CiAJa21lbWNoZWNrX2ZyZWVfc2hhZG93KHBhZ2UsIG9yZGVyKTsKIAotCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBvcmRlcik7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGcgPSBwYWdlICsgaTsKLQotCQlpZiAoUGFnZUFub24ocGcpKQotCQkJcGctPm1hcHBpbmcgPSBOVUxMOwotCQliYWQgKz0gZnJlZV9wYWdlc19jaGVjayhwZyk7Ci0JfQorCWlmIChQYWdlQW5vbihwYWdlKSkKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8ICgxIDw8IG9yZGVyKTsgaSsrKQorCQliYWQgKz0gZnJlZV9wYWdlc19jaGVjayhwYWdlICsgaSk7CiAJaWYgKGJhZCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC0xNDYwLDI0ICsxNDUzLDI0IEBACiAjZW5kaWYgLyogQ09ORklHX0ZBSUxfUEFHRV9BTExPQyAqLwogCiAvKgotICogUmV0dXJuIDEgaWYgZnJlZSBwYWdlcyBhcmUgYWJvdmUgJ21hcmsnLiBUaGlzIHRha2VzIGludG8gYWNjb3VudCB0aGUgb3JkZXIKKyAqIFJldHVybiB0cnVlIGlmIGZyZWUgcGFnZXMgYXJlIGFib3ZlICdtYXJrJy4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIG9yZGVyCiAgKiBvZiB0aGUgYWxsb2NhdGlvbi4KICAqLwotaW50IHpvbmVfd2F0ZXJtYXJrX29rKHN0cnVjdCB6b25lICp6LCBpbnQgb3JkZXIsIHVuc2lnbmVkIGxvbmcgbWFyaywKLQkJICAgICAgaW50IGNsYXNzem9uZV9pZHgsIGludCBhbGxvY19mbGFncykKK3N0YXRpYyBib29sIF9fem9uZV93YXRlcm1hcmtfb2soc3RydWN0IHpvbmUgKnosIGludCBvcmRlciwgdW5zaWduZWQgbG9uZyBtYXJrLAorCQkgICAgICBpbnQgY2xhc3N6b25lX2lkeCwgaW50IGFsbG9jX2ZsYWdzLCBsb25nIGZyZWVfcGFnZXMpCiB7CiAJLyogZnJlZV9wYWdlcyBteSBnbyBuZWdhdGl2ZSAtIHRoYXQncyBPSyAqLwogCWxvbmcgbWluID0gbWFyazsKLQlsb25nIGZyZWVfcGFnZXMgPSB6b25lX25yX2ZyZWVfcGFnZXMoeikgLSAoMSA8PCBvcmRlcikgKyAxOwogCWludCBvOwogCisJZnJlZV9wYWdlcyAtPSAoMSA8PCBvcmRlcikgKyAxOwogCWlmIChhbGxvY19mbGFncyAmIEFMTE9DX0hJR0gpCiAJCW1pbiAtPSBtaW4gLyAyOwogCWlmIChhbGxvY19mbGFncyAmIEFMTE9DX0hBUkRFUikKIAkJbWluIC09IG1pbiAvIDQ7CiAKIAlpZiAoZnJlZV9wYWdlcyA8PSBtaW4gKyB6LT5sb3dtZW1fcmVzZXJ2ZVtjbGFzc3pvbmVfaWR4XSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAlmb3IgKG8gPSAwOyBvIDwgb3JkZXI7IG8rKykgewogCQkvKiBBdCB0aGUgbmV4dCBvcmRlciwgdGhpcyBvcmRlcidzIHBhZ2VzIGJlY29tZSB1bmF2YWlsYWJsZSAqLwogCQlmcmVlX3BhZ2VzIC09IHotPmZyZWVfYXJlYVtvXS5ucl9mcmVlIDw8IG87CkBAIC0xNDg2LDkgKzE0NzksMjggQEAKIAkJbWluID4+PSAxOwogCiAJCWlmIChmcmVlX3BhZ2VzIDw9IG1pbikKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIGZhbHNlOwogCX0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB6b25lX3dhdGVybWFya19vayhzdHJ1Y3Qgem9uZSAqeiwgaW50IG9yZGVyLCB1bnNpZ25lZCBsb25nIG1hcmssCisJCSAgICAgIGludCBjbGFzc3pvbmVfaWR4LCBpbnQgYWxsb2NfZmxhZ3MpCit7CisJcmV0dXJuIF9fem9uZV93YXRlcm1hcmtfb2soeiwgb3JkZXIsIG1hcmssIGNsYXNzem9uZV9pZHgsIGFsbG9jX2ZsYWdzLAorCQkJCQl6b25lX3BhZ2Vfc3RhdGUoeiwgTlJfRlJFRV9QQUdFUykpOworfQorCitib29sIHpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoc3RydWN0IHpvbmUgKnosIGludCBvcmRlciwgdW5zaWduZWQgbG9uZyBtYXJrLAorCQkgICAgICBpbnQgY2xhc3N6b25lX2lkeCwgaW50IGFsbG9jX2ZsYWdzKQoreworCWxvbmcgZnJlZV9wYWdlcyA9IHpvbmVfcGFnZV9zdGF0ZSh6LCBOUl9GUkVFX1BBR0VTKTsKKworCWlmICh6LT5wZXJjcHVfZHJpZnRfbWFyayAmJiBmcmVlX3BhZ2VzIDwgei0+cGVyY3B1X2RyaWZ0X21hcmspCisJCWZyZWVfcGFnZXMgPSB6b25lX3BhZ2Vfc3RhdGVfc25hcHNob3QoeiwgTlJfRlJFRV9QQUdFUyk7CisKKwlyZXR1cm4gX196b25lX3dhdGVybWFya19vayh6LCBvcmRlciwgbWFyaywgY2xhc3N6b25lX2lkeCwgYWxsb2NfZmxhZ3MsCisJCQkJCQkJCWZyZWVfcGFnZXMpOwogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTE3OTMsMTUgKzE4MDUsMTggQEAKIF9fYWxsb2NfcGFnZXNfZGlyZWN0X2NvbXBhY3QoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKIAlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBlbnVtIHpvbmVfdHlwZSBoaWdoX3pvbmVpZHgsCiAJbm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBhbGxvY19mbGFncywgc3RydWN0IHpvbmUgKnByZWZlcnJlZF96b25lLAotCWludCBtaWdyYXRldHlwZSwgdW5zaWduZWQgbG9uZyAqZGlkX3NvbWVfcHJvZ3Jlc3MpCisJaW50IG1pZ3JhdGV0eXBlLCB1bnNpZ25lZCBsb25nICpkaWRfc29tZV9wcm9ncmVzcywKKwlib29sIHN5bmNfbWlncmF0aW9uKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJaWYgKCFvcmRlciB8fCBjb21wYWN0aW9uX2RlZmVycmVkKHByZWZlcnJlZF96b25lKSkKIAkJcmV0dXJuIE5VTEw7CiAKKwljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKIAkqZGlkX3NvbWVfcHJvZ3Jlc3MgPSB0cnlfdG9fY29tcGFjdF9wYWdlcyh6b25lbGlzdCwgb3JkZXIsIGdmcF9tYXNrLAotCQkJCQkJCQlub2RlbWFzayk7CisJCQkJCQlub2RlbWFzaywgc3luY19taWdyYXRpb24pOworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9NRU1BTExPQzsKIAlpZiAoKmRpZF9zb21lX3Byb2dyZXNzICE9IENPTVBBQ1RfU0tJUFBFRCkgewogCiAJCS8qIFBhZ2UgbWlncmF0aW9uIGZyZWVzIHRvIHRoZSBQQ1AgbGlzdHMgYnV0IHdlIHdhbnQgbWVyZ2luZyAqLwpAQCAtMTgzNyw3ICsxODUyLDggQEAKIF9fYWxsb2NfcGFnZXNfZGlyZWN0X2NvbXBhY3QoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKIAlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBlbnVtIHpvbmVfdHlwZSBoaWdoX3pvbmVpZHgsCiAJbm9kZW1hc2tfdCAqbm9kZW1hc2ssIGludCBhbGxvY19mbGFncywgc3RydWN0IHpvbmUgKnByZWZlcnJlZF96b25lLAotCWludCBtaWdyYXRldHlwZSwgdW5zaWduZWQgbG9uZyAqZGlkX3NvbWVfcHJvZ3Jlc3MpCisJaW50IG1pZ3JhdGV0eXBlLCB1bnNpZ25lZCBsb25nICpkaWRfc29tZV9wcm9ncmVzcywKKwlib29sIHN5bmNfbWlncmF0aW9uKQogewogCXJldHVybiBOVUxMOwogfQpAQCAtMTg1MiwyMyArMTg2OCwyMiBAQAogewogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSByZWNsYWltX3N0YXRlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IGN1cnJlbnQ7CiAJYm9vbCBkcmFpbmVkID0gZmFsc2U7CiAKIAljb25kX3Jlc2NoZWQoKTsKIAogCS8qIFdlIG5vdyBnbyBpbnRvIHN5bmNocm9ub3VzIHJlY2xhaW0gKi8KIAljcHVzZXRfbWVtb3J5X3ByZXNzdXJlX2J1bXAoKTsKLQlwLT5mbGFncyB8PSBQRl9NRU1BTExPQzsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKIAlsb2NrZGVwX3NldF9jdXJyZW50X3JlY2xhaW1fc3RhdGUoZ2ZwX21hc2spOwogCXJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWIgPSAwOwotCXAtPnJlY2xhaW1fc3RhdGUgPSAmcmVjbGFpbV9zdGF0ZTsKKwljdXJyZW50LT5yZWNsYWltX3N0YXRlID0gJnJlY2xhaW1fc3RhdGU7CiAKIAkqZGlkX3NvbWVfcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9wYWdlcyh6b25lbGlzdCwgb3JkZXIsIGdmcF9tYXNrLCBub2RlbWFzayk7CiAKLQlwLT5yZWNsYWltX3N0YXRlID0gTlVMTDsKKwljdXJyZW50LT5yZWNsYWltX3N0YXRlID0gTlVMTDsKIAlsb2NrZGVwX2NsZWFyX2N1cnJlbnRfcmVjbGFpbV9zdGF0ZSgpOwotCXAtPmZsYWdzICY9IH5QRl9NRU1BTExPQzsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfTUVNQUxMT0M7CiAKIAljb25kX3Jlc2NoZWQoKTsKIApAQCAtMTkyMCwxOSArMTkzNSwxOSBAQAogCiBzdGF0aWMgaW5saW5lCiB2b2lkIHdha2VfYWxsX2tzd2FwZCh1bnNpZ25lZCBpbnQgb3JkZXIsIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCi0JCQkJCQllbnVtIHpvbmVfdHlwZSBoaWdoX3pvbmVpZHgpCisJCQkJCQllbnVtIHpvbmVfdHlwZSBoaWdoX3pvbmVpZHgsCisJCQkJCQllbnVtIHpvbmVfdHlwZSBjbGFzc3pvbmVfaWR4KQogewogCXN0cnVjdCB6b25lcmVmICp6OwogCXN0cnVjdCB6b25lICp6b25lOwogCiAJZm9yX2VhY2hfem9uZV96b25lbGlzdCh6b25lLCB6LCB6b25lbGlzdCwgaGlnaF96b25laWR4KQotCQl3YWtldXBfa3N3YXBkKHpvbmUsIG9yZGVyKTsKKwkJd2FrZXVwX2tzd2FwZCh6b25lLCBvcmRlciwgY2xhc3N6b25lX2lkeCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBnZnBfdG9fYWxsb2NfZmxhZ3MoZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKIAlpbnQgYWxsb2NfZmxhZ3MgPSBBTExPQ19XTUFSS19NSU4gfCBBTExPQ19DUFVTRVQ7CiAJY29uc3QgZ2ZwX3Qgd2FpdCA9IGdmcF9tYXNrICYgX19HRlBfV0FJVDsKIApAQCAtMTk0OCwxOCArMTk2MywyMyBAQAogCWFsbG9jX2ZsYWdzIHw9IChfX2ZvcmNlIGludCkgKGdmcF9tYXNrICYgX19HRlBfSElHSCk7CiAKIAlpZiAoIXdhaXQpIHsKLQkJYWxsb2NfZmxhZ3MgfD0gQUxMT0NfSEFSREVSOworCQkvKgorCQkgKiBOb3Qgd29ydGggdHJ5aW5nIHRvIGFsbG9jYXRlIGhhcmRlciBmb3IKKwkJICogX19HRlBfTk9NRU1BTExPQyBldmVuIGlmIGl0IGNhbid0IHNjaGVkdWxlLgorCQkgKi8KKwkJaWYgICghKGdmcF9tYXNrICYgX19HRlBfTk9NRU1BTExPQykpCisJCQlhbGxvY19mbGFncyB8PSBBTExPQ19IQVJERVI7CiAJCS8qCiAJCSAqIElnbm9yZSBjcHVzZXQgaWYgR0ZQX0FUT01JQyAoIXdhaXQpIHJhdGhlciB0aGFuIGZhaWwgYWxsb2MuCiAJCSAqIFNlZSBhbHNvIGNwdXNldF96b25lX2FsbG93ZWQoKSBjb21tZW50IGluIGtlcm5lbC9jcHVzZXQuYy4KIAkJICovCiAJCWFsbG9jX2ZsYWdzICY9IH5BTExPQ19DUFVTRVQ7Ci0JfSBlbHNlIGlmICh1bmxpa2VseShydF90YXNrKHApKSAmJiAhaW5faW50ZXJydXB0KCkpCisJfSBlbHNlIGlmICh1bmxpa2VseShydF90YXNrKGN1cnJlbnQpKSAmJiAhaW5faW50ZXJydXB0KCkpCiAJCWFsbG9jX2ZsYWdzIHw9IEFMTE9DX0hBUkRFUjsKIAogCWlmIChsaWtlbHkoIShnZnBfbWFzayAmIF9fR0ZQX05PTUVNQUxMT0MpKSkgewogCQlpZiAoIWluX2ludGVycnVwdCgpICYmCi0JCSAgICAoKHAtPmZsYWdzICYgUEZfTUVNQUxMT0MpIHx8CisJCSAgICAoKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpIHx8CiAJCSAgICAgdW5saWtlbHkodGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSkpKQogCQkJYWxsb2NfZmxhZ3MgfD0gQUxMT0NfTk9fV0FURVJNQVJLUzsKIAl9CkBAIC0xOTc4LDcgKzE5OTgsNyBAQAogCWludCBhbGxvY19mbGFnczsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzX3JlY2xhaW1lZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBkaWRfc29tZV9wcm9ncmVzczsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBjdXJyZW50OworCWJvb2wgc3luY19taWdyYXRpb24gPSBmYWxzZTsKIAogCS8qCiAJICogSW4gdGhlIHNsb3dwYXRoLCB3ZSBzYW5pdHkgY2hlY2sgb3JkZXIgdG8gYXZvaWQgZXZlciB0cnlpbmcgdG8KQEAgLTIwMDMsNyArMjAyMyw5IEBACiAJCWdvdG8gbm9wYWdlOwogCiByZXN0YXJ0OgotCXdha2VfYWxsX2tzd2FwZChvcmRlciwgem9uZWxpc3QsIGhpZ2hfem9uZWlkeCk7CisJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9OT19LU1dBUEQpKQorCQl3YWtlX2FsbF9rc3dhcGQob3JkZXIsIHpvbmVsaXN0LCBoaWdoX3pvbmVpZHgsCisJCQkJCQl6b25lX2lkeChwcmVmZXJyZWRfem9uZSkpOwogCiAJLyoKIAkgKiBPSywgd2UncmUgYmVsb3cgdGhlIGtzd2FwZCB3YXRlcm1hcmsgYW5kIGhhdmUga2lja2VkIGJhY2tncm91bmQKQEAgLTIwMzQsMjEgKzIwNTYsMjYgQEAKIAkJZ290byBub3BhZ2U7CiAKIAkvKiBBdm9pZCByZWN1cnNpb24gb2YgZGlyZWN0IHJlY2xhaW0gKi8KLQlpZiAocC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKIAkJZ290byBub3BhZ2U7CiAKIAkvKiBBdm9pZCBhbGxvY2F0aW9ucyB3aXRoIG5vIHdhdGVybWFya3MgZnJvbSBsb29waW5nIGVuZGxlc3NseSAqLwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9NRU1ESUUpICYmICEoZ2ZwX21hc2sgJiBfX0dGUF9OT0ZBSUwpKQogCQlnb3RvIG5vcGFnZTsKIAotCS8qIFRyeSBkaXJlY3QgY29tcGFjdGlvbiAqLworCS8qCisJICogVHJ5IGRpcmVjdCBjb21wYWN0aW9uLiBUaGUgZmlyc3QgcGFzcyBpcyBhc3luY2hyb25vdXMuIFN1YnNlcXVlbnQKKwkgKiBhdHRlbXB0cyBhZnRlciBkaXJlY3QgcmVjbGFpbSBhcmUgc3luY2hyb25vdXMKKwkgKi8KIAlwYWdlID0gX19hbGxvY19wYWdlc19kaXJlY3RfY29tcGFjdChnZnBfbWFzaywgb3JkZXIsCiAJCQkJCXpvbmVsaXN0LCBoaWdoX3pvbmVpZHgsCiAJCQkJCW5vZGVtYXNrLAogCQkJCQlhbGxvY19mbGFncywgcHJlZmVycmVkX3pvbmUsCi0JCQkJCW1pZ3JhdGV0eXBlLCAmZGlkX3NvbWVfcHJvZ3Jlc3MpOworCQkJCQltaWdyYXRldHlwZSwgJmRpZF9zb21lX3Byb2dyZXNzLAorCQkJCQlzeW5jX21pZ3JhdGlvbik7CiAJaWYgKHBhZ2UpCiAJCWdvdG8gZ290X3BnOworCXN5bmNfbWlncmF0aW9uID0gdHJ1ZTsKIAogCS8qIFRyeSBkaXJlY3QgcmVjbGFpbSBhbmQgdGhlbiBhbGxvY2F0aW5nICovCiAJcGFnZSA9IF9fYWxsb2NfcGFnZXNfZGlyZWN0X3JlY2xhaW0oZ2ZwX21hc2ssIG9yZGVyLApAQCAtMjEwMiwxMyArMjEyOSwyNyBAQAogCQkvKiBXYWl0IGZvciBzb21lIHdyaXRlIHJlcXVlc3RzIHRvIGNvbXBsZXRlIHRoZW4gcmV0cnkgKi8KIAkJd2FpdF9pZmZfY29uZ2VzdGVkKHByZWZlcnJlZF96b25lLCBCTEtfUldfQVNZTkMsIEhaLzUwKTsKIAkJZ290byByZWJhbGFuY2U7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSGlnaC1vcmRlciBhbGxvY2F0aW9ucyBkbyBub3QgbmVjZXNzYXJpbHkgbG9vcCBhZnRlcgorCQkgKiBkaXJlY3QgcmVjbGFpbSBhbmQgcmVjbGFpbS9jb21wYWN0aW9uIGRlcGVuZHMgb24gY29tcGFjdGlvbgorCQkgKiBiZWluZyBjYWxsZWQgYWZ0ZXIgcmVjbGFpbSBzbyBjYWxsIGRpcmVjdGx5IGlmIG5lY2Vzc2FyeQorCQkgKi8KKwkJcGFnZSA9IF9fYWxsb2NfcGFnZXNfZGlyZWN0X2NvbXBhY3QoZ2ZwX21hc2ssIG9yZGVyLAorCQkJCQl6b25lbGlzdCwgaGlnaF96b25laWR4LAorCQkJCQlub2RlbWFzaywKKwkJCQkJYWxsb2NfZmxhZ3MsIHByZWZlcnJlZF96b25lLAorCQkJCQltaWdyYXRldHlwZSwgJmRpZF9zb21lX3Byb2dyZXNzLAorCQkJCQlzeW5jX21pZ3JhdGlvbik7CisJCWlmIChwYWdlKQorCQkJZ290byBnb3RfcGc7CiAJfQogCiBub3BhZ2U6CiAJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9OT1dBUk4pICYmIHByaW50a19yYXRlbGltaXQoKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcGFnZSBhbGxvY2F0aW9uIGZhaWx1cmUuIgogCQkJIiBvcmRlcjolZCwgbW9kZToweCV4XG4iLAotCQkJcC0+Y29tbSwgb3JkZXIsIGdmcF9tYXNrKTsKKwkJCWN1cnJlbnQtPmNvbW0sIG9yZGVyLCBnZnBfbWFzayk7CiAJCWR1bXBfc3RhY2soKTsKIAkJc2hvd19tZW0oKTsKIAl9CkBAIC0yNDQyLDcgKzI0ODMsNyBAQAogCQkJIiBhbGxfdW5yZWNsYWltYWJsZT8gJXMiCiAJCQkiXG4iLAogCQkJem9uZS0+bmFtZSwKLQkJCUsoem9uZV9ucl9mcmVlX3BhZ2VzKHpvbmUpKSwKKwkJCUsoem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpKSwKIAkJCUsobWluX3dtYXJrX3BhZ2VzKHpvbmUpKSwKIAkJCUsobG93X3dtYXJrX3BhZ2VzKHpvbmUpKSwKIAkJCUsoaGlnaF93bWFya19wYWdlcyh6b25lKSksCkBAIC0yNTg1LDkgKzI2MjYsMTYgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbnVtYV96b25lbGlzdF9vcmRlcihjaGFyICpzKQogewotCWlmIChzKQotCQlyZXR1cm4gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKHMpOwotCXJldHVybiAwOworCWludCByZXQ7CisKKwlpZiAoIXMpCisJCXJldHVybiAwOworCisJcmV0ID0gX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKHMpOworCWlmIChyZXQgPT0gMCkKKwkJc3RybGNweShudW1hX3pvbmVsaXN0X29yZGVyLCBzLCBOVU1BX1pPTkVMSVNUX09SREVSX0xFTik7CisKKwlyZXR1cm4gcmV0OwogfQogZWFybHlfcGFyYW0oIm51bWFfem9uZWxpc3Rfb3JkZXIiLCBzZXR1cF9udW1hX3pvbmVsaXN0X29yZGVyKTsKIApAQCAtNDAxNCw3ICs0MDYyLDcgQEAKIAkJem9uZS0+cGFnZWJsb2NrX2ZsYWdzID0gYWxsb2NfYm9vdG1lbV9ub2RlKHBnZGF0LCB1c2VtYXBzaXplKTsKIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBpbmxpbmUgc2V0dXBfdXNlbWFwKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfdXNlbWFwKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiAJCQkJc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgem9uZXNpemUpIHt9CiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTSAqLwogCkBAIC01NTE3LDcgKzU1NjUsNiBAQAogCXsxVUwgPDwgUEdfc3dhcGNhY2hlLAkJInN3YXBjYWNoZSIJfSwKIAl7MVVMIDw8IFBHX21hcHBlZHRvZGlzaywJIm1hcHBlZHRvZGlzayIJfSwKIAl7MVVMIDw8IFBHX3JlY2xhaW0sCQkicmVjbGFpbSIJfSwKLQl7MVVMIDw8IFBHX2J1ZGR5LAkJImJ1ZGR5IgkJfSwKIAl7MVVMIDw8IFBHX3N3YXBiYWNrZWQsCQkic3dhcGJhY2tlZCIJfSwKIAl7MVVMIDw8IFBHX3VuZXZpY3RhYmxlLAkJInVuZXZpY3RhYmxlIgl9LAogI2lmZGVmIENPTkZJR19NTVUKQEAgLTU1NjUsNyArNTYxMiw3IEBACiB7CiAJcHJpbnRrKEtFUk5fQUxFUlQKIAkgICAgICAgInBhZ2U6JXAgY291bnQ6JWQgbWFwY291bnQ6JWQgbWFwcGluZzolcCBpbmRleDolI2x4XG4iLAotCQlwYWdlLCBwYWdlX2NvdW50KHBhZ2UpLCBwYWdlX21hcGNvdW50KHBhZ2UpLAorCQlwYWdlLCBhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSwgcGFnZV9tYXBjb3VudChwYWdlKSwKIAkJcGFnZS0+bWFwcGluZywgcGFnZS0+aW5kZXgpOwogCWR1bXBfcGFnZV9mbGFncyhwYWdlLT5mbGFncyk7CiB9CmRpZmYgLS1naXQgYS9tbS9wYWdld2Fsay5jIGIvbW0vcGFnZXdhbGsuYwppbmRleCAzOGNjNThiLi43Y2ZhNmFlIDEwMDY0NAotLS0gYS9tbS9wYWdld2Fsay5jCisrKyBiL21tL3BhZ2V3YWxrLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCXNwbGl0X2h1Z2VfcGFnZV9wbWQod2Fsay0+bW0sIHBtZCk7CiAJCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkgewogCQkJaWYgKHdhbGstPnB0ZV9ob2xlKQogCQkJCWVyciA9IHdhbGstPnB0ZV9ob2xlKGFkZHIsIG5leHQsIHdhbGspOwpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LXZtLmMgYi9tbS9wZXJjcHUtdm0uYwppbmRleCA3ZDljMWQwLi5lYTUzNDk2IDEwMDY0NAotLS0gYS9tbS9wZXJjcHUtdm0uYworKysgYi9tbS9wZXJjcHUtdm0uYwpAQCAtNDIxLDcgKzQyMSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJdm1zID0gcGNwdV9nZXRfdm1fYXJlYXMocGNwdV9ncm91cF9vZmZzZXRzLCBwY3B1X2dyb3VwX3NpemVzLAotCQkJCXBjcHVfbnJfZ3JvdXBzLCBwY3B1X2F0b21fc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQkJcGNwdV9ucl9ncm91cHMsIHBjcHVfYXRvbV9zaXplKTsKIAlpZiAoIXZtcykgewogCQlwY3B1X2ZyZWVfY2h1bmsoY2h1bmspOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL21tL3BlcmNwdS5jIGIvbW0vcGVyY3B1LmMKaW5kZXggM2RkNDk4NC4uM2Y5MzAwMSAxMDA2NDQKLS0tIGEvbW0vcGVyY3B1LmMKKysrIGIvbW0vcGVyY3B1LmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCiAvKgogICogKFVuKXBvcHVsYXRlZCBwYWdlIHJlZ2lvbiBpdGVyYXRvcnMuICBJdGVyYXRlIG92ZXIgKHVuKXBvcHVsYXRlZAotICogcGFnZSByZWdpb25zIGJldHdlbiBAc3RhcnQgYW5kIEBlbmQgaW4gQGNodW5rLiAgQHJzIGFuZCBAcmUgc2hvdWxkCisgKiBwYWdlIHJlZ2lvbnMgYmV0d2VlbiBAc3RhcnQgYW5kIEBlbmQgaW4gQGNodW5rLiAgQHJzIGFuZCBAcmUgc2hvdWxkCiAgKiBiZSBpbnRlZ2VyIHZhcmlhYmxlcyBhbmQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgYW5kIGVuZCBwYWdlIGluZGV4IG9mCiAgKiB0aGUgY3VycmVudCByZWdpb24uCiAgKi8KZGlmZiAtLWdpdCBhL21tL3BndGFibGUtZ2VuZXJpYy5jIGIvbW0vcGd0YWJsZS1nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzMDU0OAotLS0gL2Rldi9udWxsCisrKyBiL21tL3BndGFibGUtZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogIG1tL3BndGFibGUtZ2VuZXJpYy5jCisgKgorICogIEdlbmVyaWMgcGd0YWJsZSBtZXRob2RzIGRlY2xhcmVkIGluIGFzbS1nZW5lcmljL3BndGFibGUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCisvKgorICogT25seSBzZXRzIHRoZSBhY2Nlc3MgZmxhZ3MgKGRpcnR5LCBhY2Nlc3NlZCwgYW5kCisgKiB3cml0YWJsZSkuIEZ1cnRoZXJtb3JlLCB3ZSBrbm93IGl0IGFsd2F5cyBnZXRzIHNldCB0byBhICJtb3JlCisgKiBwZXJtaXNzaXZlIiBzZXR0aW5nLCB3aGljaCBhbGxvd3MgbW9zdCBhcmNoaXRlY3R1cmVzIHRvIG9wdGltaXplCisgKiB0aGlzLiBXZSByZXR1cm4gd2hldGhlciB0aGUgUFRFIGFjdHVhbGx5IGNoYW5nZWQsIHdoaWNoIGluIHR1cm4KKyAqIGluc3RydWN0cyB0aGUgY2FsbGVyIHRvIGRvIHRoaW5ncyBsaWtlIHVwZGF0ZV9fbW11X2NhY2hlLiAgVGhpcworICogdXNlZCB0byBiZSBkb25lIGluIHRoZSBjYWxsZXIsIGJ1dCBzcGFyYyBuZWVkcyBtaW5vciBmYXVsdHMgdG8KKyAqIGZvcmNlIHRoYXQgY2FsbCBvbiBzdW40YyBzbyB3ZSBjaGFuZ2VkIHRoaXMgbWFjcm8gc2xpZ2h0bHkKKyAqLworaW50IHB0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwKKwkJCSAgcHRlX3QgZW50cnksIGludCBkaXJ0eSkKK3sKKwlpbnQgY2hhbmdlZCA9ICFwdGVfc2FtZSgqcHRlcCwgZW50cnkpOworCWlmIChjaGFuZ2VkKSB7CisJCXNldF9wdGVfYXQodm1hLT52bV9tbSwgYWRkcmVzcywgcHRlcCwgZW50cnkpOworCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOworCX0KKwlyZXR1cm4gY2hhbmdlZDsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfU0VUX0FDQ0VTU19GTEFHUworaW50IHBtZHBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCwKKwkJCSAgcG1kX3QgZW50cnksIGludCBkaXJ0eSkKK3sKKyNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlpbnQgY2hhbmdlZCA9ICFwbWRfc2FtZSgqcG1kcCwgZW50cnkpOworCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKKwlpZiAoY2hhbmdlZCkgeworCQlzZXRfcG1kX2F0KHZtYS0+dm1fbW0sIGFkZHJlc3MsIHBtZHAsIGVudHJ5KTsKKwkJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIEhQQUdFX1BNRF9TSVpFKTsKKwl9CisJcmV0dXJuIGNoYW5nZWQ7CisjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KKwlCVUcoKTsKKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfWU9VTkdfRkxVU0gKK2ludCBwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3sKKwlpbnQgeW91bmc7CisJeW91bmcgPSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlcCk7CisJaWYgKHlvdW5nKQorCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOworCXJldHVybiB5b3VuZzsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfQ0xFQVJfWU9VTkdfRkxVU0gKK2ludCBwbWRwX2NsZWFyX2ZsdXNoX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCkKK3sKKwlpbnQgeW91bmc7CisjaWZuZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCUJVRygpOworI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKKwl5b3VuZyA9IHBtZHBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyZXNzLCBwbWRwKTsKKwlpZiAoeW91bmcpCisJCWZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSk7CisJcmV0dXJuIHlvdW5nOworfQorI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9GTFVTSAorcHRlX3QgcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkgICAgICAgcHRlX3QgKnB0ZXApCit7CisJcHRlX3QgcHRlOworCXB0ZSA9IHB0ZXBfZ2V0X2FuZF9jbGVhcigodm1hKS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXApOworCWZsdXNoX3RsYl9wYWdlKHZtYSwgYWRkcmVzcyk7CisJcmV0dXJuIHB0ZTsKK30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1BNRFBfQ0xFQVJfRkxVU0gKK3BtZF90IHBtZHBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJICAgICAgIHBtZF90ICpwbWRwKQoreworCXBtZF90IHBtZDsKKyNpZm5kZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJQlVHKCk7CisjZW5kaWYgLyogQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFICovCisJVk1fQlVHX09OKGFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spOworCXBtZCA9IHBtZHBfZ2V0X2FuZF9jbGVhcih2bWEtPnZtX21tLCBhZGRyZXNzLCBwbWRwKTsKKwlmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBhZGRyZXNzICsgSFBBR0VfUE1EX1NJWkUpOworCXJldHVybiBwbWQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9QTURQX1NQTElUVElOR19GTFVTSAorcG1kX3QgcG1kcF9zcGxpdHRpbmdfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJCSAgIHBtZF90ICpwbWRwKQoreworI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQorCXBtZF90IHBtZCA9IHBtZF9ta3NwbGl0dGluZygqcG1kcCk7CisJVk1fQlVHX09OKGFkZHJlc3MgJiB+SFBBR0VfUE1EX01BU0spOworCXNldF9wbWRfYXQodm1hLT52bV9tbSwgYWRkcmVzcywgcG1kcCwgcG1kKTsKKwkvKiB0bGIgZmx1c2ggb25seSB0byBzZXJpYWxpemUgYWdhaW5zdCBndXAtZmFzdCAqLworCWZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSk7CisjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KKwlCVUcoKTsKKyNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jCmluZGV4IDFhOGJmNzZiLi5mMjFmNGExIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC05NCw3ICs5NCw3IEBACiAgKiBhbm9ueW1vdXMgcGFnZXMgbWFwcGVkIGludG8gaXQgd2l0aCB0aGF0IGFub25fdm1hLgogICoKICAqIFRoZSBjb21tb24gY2FzZSB3aWxsIGJlIHRoYXQgd2UgYWxyZWFkeSBoYXZlIG9uZSwgYnV0IGlmCi0gKiBpZiBub3Qgd2UgZWl0aGVyIG5lZWQgdG8gZmluZCBhbiBhZGphY2VudCBtYXBwaW5nIHRoYXQgd2UKKyAqIG5vdCB3ZSBlaXRoZXIgbmVlZCB0byBmaW5kIGFuIGFkamFjZW50IG1hcHBpbmcgdGhhdCB3ZQogICogY2FuIHJlLXVzZSB0aGUgYW5vbl92bWEgZnJvbSAodmVyeSBjb21tb24gd2hlbiB0aGUgb25seQogICogcmVhc29uIGZvciBzcGxpdHRpbmcgYSB2bWEgaGFzIGJlZW4gbXByb3RlY3QoKSksIG9yIHdlCiAgKiBhbGxvY2F0ZSBhIG5ldyBvbmUuCkBAIC0xNzcsNiArMTc3LDEwIEBACiAJbGlzdF9hZGQoJmF2Yy0+c2FtZV92bWEsICZ2bWEtPmFub25fdm1hX2NoYWluKTsKIAogCWFub25fdm1hX2xvY2soYW5vbl92bWEpOworCS8qCisJICogSXQncyBjcml0aWNhbCB0byBhZGQgbmV3IHZtYXMgdG8gdGhlIHRhaWwgb2YgdGhlIGFub25fdm1hLAorCSAqIHNlZSBjb21tZW50IGluIGh1Z2VfbWVtb3J5LmM6X19zcGxpdF9odWdlX3BhZ2UoKS4KKwkgKi8KIAlsaXN0X2FkZF90YWlsKCZhdmMtPnNhbWVfYW5vbl92bWEsICZhbm9uX3ZtYS0+aGVhZCk7CiAJYW5vbl92bWFfdW5sb2NrKGFub25fdm1hKTsKIH0KQEAgLTM2MCw3ICszNjQsNyBAQAogICogUmV0dXJucyB2aXJ0dWFsIGFkZHJlc3Mgb3IgLUVGQVVMVCBpZiBwYWdlJ3MgaW5kZXgvb2Zmc2V0IGlzIG5vdAogICogd2l0aGluIHRoZSByYW5nZSBtYXBwZWQgdGhlIEB2bWEuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworaW5saW5lIHVuc2lnbmVkIGxvbmcKIHZtYV9hZGRyZXNzKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlwZ29mZl90IHBnb2ZmID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBQQUdFX1NISUZUKTsKQEAgLTQzNSw2ICs0MzksOCBAQAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKIAlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKQogCQlyZXR1cm4gTlVMTDsKKwlpZiAocG1kX3RyYW5zX2h1Z2UoKnBtZCkpCisJCXJldHVybiBOVUxMOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKTsKIAkvKiBNYWtlIGEgcXVpY2sgY2hlY2sgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2sgKi8KQEAgLTQ4OSwzNSArNDk1LDE3IEBACiAJCQl1bnNpZ25lZCBsb25nICp2bV9mbGFncykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07Ci0JcHRlX3QgKnB0ZTsKLQlzcGlubG9ja190ICpwdGw7CiAJaW50IHJlZmVyZW5jZWQgPSAwOwogCi0JcHRlID0gcGFnZV9jaGVja19hZGRyZXNzKHBhZ2UsIG1tLCBhZGRyZXNzLCAmcHRsLCAwKTsKLQlpZiAoIXB0ZSkKLQkJZ290byBvdXQ7Ci0KIAkvKgogCSAqIERvbid0IHdhbnQgdG8gZWxldmF0ZSByZWZlcmVuY2VkIGZvciBtbG9ja2VkIHBhZ2UgdGhhdCBnZXRzIHRoaXMgZmFyLAogCSAqIGluIG9yZGVyIHRoYXQgaXQgcHJvZ3Jlc3NlcyB0byB0cnlfdG9fdW5tYXAgYW5kIGlzIG1vdmVkIHRvIHRoZQogCSAqIHVuZXZpY3RhYmxlIGxpc3QuCiAJICovCiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHsKLQkJKm1hcGNvdW50ID0gMTsJLyogYnJlYWsgZWFybHkgZnJvbSBsb29wICovCisJCSptYXBjb3VudCA9IDA7CS8qIGJyZWFrIGVhcmx5IGZyb20gbG9vcCAqLwogCQkqdm1fZmxhZ3MgfD0gVk1fTE9DS0VEOwotCQlnb3RvIG91dF91bm1hcDsKLQl9Ci0KLQlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKSB7Ci0JCS8qCi0JCSAqIERvbid0IHRyZWF0IGEgcmVmZXJlbmNlIHRocm91Z2ggYSBzZXF1ZW50aWFsbHkgcmVhZAotCQkgKiBtYXBwaW5nIGFzIHN1Y2guICBJZiB0aGUgcGFnZSBoYXMgYmVlbiB1c2VkIGluCi0JCSAqIGFub3RoZXIgbWFwcGluZywgd2Ugd2lsbCBjYXRjaCBpdDsgaWYgdGhpcyBvdGhlcgotCQkgKiBtYXBwaW5nIGlzIGFscmVhZHkgZ29uZSwgdGhlIHVubWFwIHBhdGggd2lsbCBoYXZlCi0JCSAqIHNldCBQR19yZWZlcmVuY2VkIG9yIGFjdGl2YXRlZCB0aGUgcGFnZS4KLQkJICovCi0JCWlmIChsaWtlbHkoIVZNX1NlcXVlbnRpYWxSZWFkSGludCh2bWEpKSkKLQkJCXJlZmVyZW5jZWQrKzsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogUHJldGVuZCB0aGUgcGFnZSBpcyByZWZlcmVuY2VkIGlmIHRoZSB0YXNrIGhhcyB0aGUKQEAgLTUyNiw5ICs1MTQsMzkgQEAKIAkJCXJ3c2VtX2lzX2xvY2tlZCgmbW0tPm1tYXBfc2VtKSkKIAkJcmVmZXJlbmNlZCsrOwogCi1vdXRfdW5tYXA6CisJaWYgKHVubGlrZWx5KFBhZ2VUcmFuc0h1Z2UocGFnZSkpKSB7CisJCXBtZF90ICpwbWQ7CisKKwkJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJcG1kID0gcGFnZV9jaGVja19hZGRyZXNzX3BtZChwYWdlLCBtbSwgYWRkcmVzcywKKwkJCQkJICAgICBQQUdFX0NIRUNLX0FERFJFU1NfUE1EX0ZMQUcpOworCQlpZiAocG1kICYmICFwbWRfdHJhbnNfc3BsaXR0aW5nKCpwbWQpICYmCisJCSAgICBwbWRwX2NsZWFyX2ZsdXNoX3lvdW5nX25vdGlmeSh2bWEsIGFkZHJlc3MsIHBtZCkpCisJCQlyZWZlcmVuY2VkKys7CisJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwl9IGVsc2UgeworCQlwdGVfdCAqcHRlOworCQlzcGlubG9ja190ICpwdGw7CisKKwkJcHRlID0gcGFnZV9jaGVja19hZGRyZXNzKHBhZ2UsIG1tLCBhZGRyZXNzLCAmcHRsLCAwKTsKKwkJaWYgKCFwdGUpCisJCQlnb3RvIG91dDsKKworCQlpZiAocHRlcF9jbGVhcl9mbHVzaF95b3VuZ19ub3RpZnkodm1hLCBhZGRyZXNzLCBwdGUpKSB7CisJCQkvKgorCQkJICogRG9uJ3QgdHJlYXQgYSByZWZlcmVuY2UgdGhyb3VnaCBhIHNlcXVlbnRpYWxseSByZWFkCisJCQkgKiBtYXBwaW5nIGFzIHN1Y2guICBJZiB0aGUgcGFnZSBoYXMgYmVlbiB1c2VkIGluCisJCQkgKiBhbm90aGVyIG1hcHBpbmcsIHdlIHdpbGwgY2F0Y2ggaXQ7IGlmIHRoaXMgb3RoZXIKKwkJCSAqIG1hcHBpbmcgaXMgYWxyZWFkeSBnb25lLCB0aGUgdW5tYXAgcGF0aCB3aWxsIGhhdmUKKwkJCSAqIHNldCBQR19yZWZlcmVuY2VkIG9yIGFjdGl2YXRlZCB0aGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKGxpa2VseSghVk1fU2VxdWVudGlhbFJlYWRIaW50KHZtYSkpKQorCQkJCXJlZmVyZW5jZWQrKzsKKwkJfQorCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKKwl9CisKIAkoKm1hcGNvdW50KS0tOwotCXB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpOwogCiAJaWYgKHJlZmVyZW5jZWQpCiAJCSp2bV9mbGFncyB8PSB2bWEtPnZtX2ZsYWdzOwpAQCAtODY0LDggKzg4MiwxMyBAQAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBleGNsdXNpdmUpCiB7CiAJaW50IGZpcnN0ID0gYXRvbWljX2luY19hbmRfdGVzdCgmcGFnZS0+X21hcGNvdW50KTsKLQlpZiAoZmlyc3QpCi0JCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9BTk9OX1BBR0VTKTsKKwlpZiAoZmlyc3QpIHsKKwkJaWYgKCFQYWdlVHJhbnNIdWdlKHBhZ2UpKQorCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0FOT05fUEFHRVMpOworCQllbHNlCisJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwKKwkJCQkJICAgICAgTlJfQU5PTl9UUkFOU1BBUkVOVF9IVUdFUEFHRVMpOworCX0KIAlpZiAodW5saWtlbHkoUGFnZUtzbShwYWdlKSkpCiAJCXJldHVybjsKIApAQCAtODkzLDcgKzkxNiwxMCBAQAogCVZNX0JVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKIAlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKIAlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIDApOyAvKiBpbmNyZW1lbnQgY291bnQgKHN0YXJ0cyBhdCAtMSkgKi8KLQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfQU5PTl9QQUdFUyk7CisJaWYgKCFQYWdlVHJhbnNIdWdlKHBhZ2UpKQorCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfQU5PTl9QQUdFUyk7CisJZWxzZQorCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfQU5PTl9UUkFOU1BBUkVOVF9IVUdFUEFHRVMpOwogCV9fcGFnZV9zZXRfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcmVzcywgMSk7CiAJaWYgKHBhZ2VfZXZpY3RhYmxlKHBhZ2UsIHZtYSkpCiAJCWxydV9jYWNoZV9hZGRfbHJ1KHBhZ2UsIExSVV9BQ1RJVkVfQU5PTik7CkBAIC05MTEsNyArOTM3LDcgQEAKIHsKIAlpZiAoYXRvbWljX2luY19hbmRfdGVzdCgmcGFnZS0+X21hcGNvdW50KSkgewogCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9NQVBQRUQpOwotCQltZW1fY2dyb3VwX3VwZGF0ZV9maWxlX21hcHBlZChwYWdlLCAxKTsKKwkJbWVtX2Nncm91cF9pbmNfcGFnZV9zdGF0KHBhZ2UsIE1FTUNHX05SX0ZJTEVfTUFQUEVEKTsKIAl9CiB9CiAKQEAgLTk0NiwxMCArOTcyLDE0IEBACiAJCXJldHVybjsKIAlpZiAoUGFnZUFub24ocGFnZSkpIHsKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHBhZ2UpOwotCQlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfQU5PTl9QQUdFUyk7CisJCWlmICghUGFnZVRyYW5zSHVnZShwYWdlKSkKKwkJCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9BTk9OX1BBR0VTKTsKKwkJZWxzZQorCQkJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsCisJCQkJCSAgICAgIE5SX0FOT05fVFJBTlNQQVJFTlRfSFVHRVBBR0VTKTsKIAl9IGVsc2UgewogCQlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9NQVBQRUQpOwotCQltZW1fY2dyb3VwX3VwZGF0ZV9maWxlX21hcHBlZChwYWdlLCAtMSk7CisJCW1lbV9jZ3JvdXBfZGVjX3BhZ2Vfc3RhdChwYWdlLCBNRU1DR19OUl9GSUxFX01BUFBFRCk7CiAJfQogCS8qCiAJICogSXQgd291bGQgYmUgdGlkeSB0byByZXNldCB0aGUgUGFnZUFub24gbWFwcGluZyBoZXJlLApAQCAtMTIwMiw3ICsxMjMyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYm9vbCBpc192bWFfdGVtcG9yYXJ5X3N0YWNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorYm9vbCBpc192bWFfdGVtcG9yYXJ5X3N0YWNrKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWludCBtYXliZV9zdGFjayA9IHZtYS0+dm1fZmxhZ3MgJiAoVk1fR1JPV1NET1dOIHwgVk1fR1JPV1NVUCk7CiAKQEAgLTE0MDAsNiArMTQzMCw3IEBACiAJaW50IHJldDsKIAogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlSHVnZShwYWdlKSAmJiBQYWdlVHJhbnNIdWdlKHBhZ2UpKTsKIAogCWlmICh1bmxpa2VseShQYWdlS3NtKHBhZ2UpKSkKIAkJcmV0ID0gdHJ5X3RvX3VubWFwX2tzbShwYWdlLCBmbGFncyk7CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggZTlmOTI5OC4uMjY0MDM3NCAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtMzY1MywxMSArMzY1MywxOCBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi12b2lkICprbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCit2b2lkICoKK2ttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZV90IHNpemUsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewotCXJldHVybiBfX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCisJdHJhY2Vfa21hbGxvYyhfUkVUX0lQXywgcmV0LAorCQkgICAgICBzaXplLCBzbGFiX2J1ZmZlcl9zaXplKGNhY2hlcCksIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vdHJhY2UpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTM2NzUsMzEgKzM2ODIsMzIgQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi12b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAotCQkJCSAgICBnZnBfdCBmbGFncywKLQkJCQkgICAgaW50IG5vZGVpZCkKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzaXplX3Qgc2l6ZSwKKwkJCQkgIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCQkJICBnZnBfdCBmbGFncywKKwkJCQkgIGludCBub2RlaWQpCiB7Ci0JcmV0dXJuIF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBub2RlaWQsCisJdm9pZCAqcmV0OworCisJcmV0ID0gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCwKIAkJCQkgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJdHJhY2Vfa21hbGxvY19ub2RlKF9SRVRfSVBfLCByZXQsCisJCQkgICBzaXplLCBzbGFiX2J1ZmZlcl9zaXplKGNhY2hlcCksCisJCQkgICBmbGFncywgbm9kZWlkKTsKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZSk7CiAjZW5kaWYKIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKIF9fZG9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUsIHZvaWQgKmNhbGxlcikKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwotCXZvaWQgKnJldDsKIAogCWNhY2hlcCA9IGttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplLCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIoY2FjaGVwKSkpCiAJCXJldHVybiBjYWNoZXA7Ci0JcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UoY2FjaGVwLCBmbGFncywgbm9kZSk7Ci0KLQl0cmFjZV9rbWFsbG9jX25vZGUoKHVuc2lnbmVkIGxvbmcpIGNhbGxlciwgcmV0LAotCQkJICAgc2l6ZSwgY2FjaGVwLT5idWZmZXJfc2l6ZSwgZmxhZ3MsIG5vZGUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHNpemUsIGNhY2hlcCwgZmxhZ3MsIG5vZGUpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfU0xBQikgfHwgZGVmaW5lZChDT05GSUdfVFJBQ0lORykKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCBhMmZlMTcyLi5jN2VmMDA3IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgorCiAvKgogICogTG9jayBvcmRlcjoKICAqICAgMS4gc2xhYl9sb2NrKHBhZ2UpCkBAIC0xNzc0LDExICsxNzc2LDIxIEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MpCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIE5VTUFfTk9fTk9ERSwgX1JFVF9JUF8pOworCXZvaWQgKnJldCA9IHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIE5VTUFfTk9fTk9ERSwgX1JFVF9JUF8pOworCXRyYWNlX2ttYWxsb2MoX1JFVF9JUF8sIHJldCwgc2l6ZSwgcy0+c2l6ZSwgZ2ZwZmxhZ3MpOworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2NfdHJhY2UpOworCit2b2lkICprbWFsbG9jX29yZGVyX3RyYWNlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgdW5zaWduZWQgaW50IG9yZGVyKQoreworCXZvaWQgKnJldCA9IGttYWxsb2Nfb3JkZXIoc2l6ZSwgZmxhZ3MsIG9yZGVyKTsKKwl0cmFjZV9rbWFsbG9jKF9SRVRfSVBfLCByZXQsIHNpemUsIFBBR0VfU0laRSA8PCBvcmRlciwgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGttYWxsb2Nfb3JkZXJfdHJhY2UpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtMTc5NCwxMyArMTgwNiwxNyBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQkJCSAgICBnZnBfdCBnZnBmbGFncywKLQkJCQkgICAgaW50IG5vZGUpCisJCQkJICAgIGludCBub2RlLCBzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgbm9kZSwgX1JFVF9JUF8pOworCXZvaWQgKnJldCA9IHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIF9SRVRfSVBfKTsKKworCXRyYWNlX2ttYWxsb2Nfbm9kZShfUkVUX0lQXywgcmV0LAorCQkJICAgc2l6ZSwgcy0+c2l6ZSwgZ2ZwZmxhZ3MsIG5vZGUpOworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKTsKICNlbmRpZgogI2VuZGlmCiAKQEAgLTM2MjAsNyArMzYzNiw3IEBACiAJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiU3bGQgIiwgbC0+Y291bnQpOwogCiAJCWlmIChsLT5hZGRyKQotCQkJbGVuICs9IHNwcmludF9zeW1ib2woYnVmICsgbGVuLCAodW5zaWduZWQgbG9uZylsLT5hZGRyKTsKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVwUyIsICh2b2lkICopbC0+YWRkcik7CiAJCWVsc2UKIAkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIjxub3QtYXZhaWxhYmxlPiIpOwogCkBAIC0zOTMwLDEyICszOTQ2LDkgQEAKIAogc3RhdGljIHNzaXplX3QgY3Rvcl9zaG93KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICpidWYpCiB7Ci0JaWYgKHMtPmN0b3IpIHsKLQkJaW50IG4gPSBzcHJpbnRfc3ltYm9sKGJ1ZiwgKHVuc2lnbmVkIGxvbmcpcy0+Y3Rvcik7Ci0KLQkJcmV0dXJuIG4gKyBzcHJpbnRmKGJ1ZiArIG4sICJcbiIpOwotCX0KLQlyZXR1cm4gMDsKKwlpZiAoIXMtPmN0b3IpCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVwU1xuIiwgcy0+Y3Rvcik7CiB9CiBTTEFCX0FUVFJfUk8oY3Rvcik7CiAKZGlmZiAtLWdpdCBhL21tL3NwYXJzZS12bWVtbWFwLmMgYi9tbS9zcGFyc2Utdm1lbW1hcC5jCmluZGV4IDI5ZDZjYmYuLjY0Yjk4NDAgMTAwNjQ0Ci0tLSBhL21tL3NwYXJzZS12bWVtbWFwLmMKKysrIGIvbW0vc3BhcnNlLXZtZW1tYXAuYwpAQCAtOSw3ICs5LDcgQEAKICAqCiAgKiBIb3dldmVyLCB2aXJ0dWFsIG1hcHBpbmdzIG5lZWQgYSBwYWdlIHRhYmxlIGFuZCBUTEJzLiBNYW55IExpbnV4CiAgKiBhcmNoaXRlY3R1cmVzIGFscmVhZHkgbWFwIHRoZWlyIHBoeXNpY2FsIHNwYWNlIHVzaW5nIDEtMSBtYXBwaW5ncwotICogdmlhIFRMQnMuIEZvciB0aG9zZSBhcmNoZXMgdGhlIHZpcnR1YWwgbWVtbW9yeSBtYXAgaXMgZXNzZW50aWFsbHkKKyAqIHZpYSBUTEJzLiBGb3IgdGhvc2UgYXJjaGVzIHRoZSB2aXJ0dWFsIG1lbW9yeSBtYXAgaXMgZXNzZW50aWFsbHkKICAqIGZvciBmcmVlIGlmIHdlIHVzZSB0aGUgc2FtZSBwYWdlIHNpemUgYXMgdGhlIDEtMSBtYXBwaW5ncy4gSW4gdGhhdAogICogY2FzZSB0aGUgb3ZlcmhlYWQgY29uc2lzdHMgb2YgYSBmZXcgYWRkaXRpb25hbCBwYWdlcyB0aGF0IGFyZQogICogYWxsb2NhdGVkIHRvIGNyZWF0ZSBhIHZpZXcgb2YgbWVtb3J5IGZvciB2bWVtbWFwLgpkaWZmIC0tZ2l0IGEvbW0vc3BhcnNlLmMgYi9tbS9zcGFyc2UuYwppbmRleCA5NWFjMjE5Li45MzI1MDIwIDEwMDY0NAotLS0gYS9tbS9zcGFyc2UuYworKysgYi9tbS9zcGFyc2UuYwpAQCAtNjcxLDEwICs2NzEsMTAgQEAKIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2Jvb3RtZW0oc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXBzX3NlY3Rpb25fbnIsIHJlbW92aW5nX3NlY3Rpb25fbnIsIGk7Ci0JaW50IG1hZ2ljOworCXVuc2lnbmVkIGxvbmcgbWFnaWM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKywgcGFnZSsrKSB7Ci0JCW1hZ2ljID0gYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCk7CisJCW1hZ2ljID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2UtPmxydS5uZXh0OwogCiAJCUJVR19PTihtYWdpYyA9PSBOT0RFX0lORk8pOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKaW5kZXggM2Y0ODU0Mi4uYmJjMWNlOSAxMDA2NDQKLS0tIGEvbW0vc3dhcC5jCisrKyBiL21tL3N3YXAuYwpAQCAtNTYsMTcgKzU2LDk3IEBACiAJCWRlbF9wYWdlX2Zyb21fbHJ1KHpvbmUsIHBhZ2UpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOwogCX0KK30KKworc3RhdGljIHZvaWQgX19wdXRfc2luZ2xlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJX19wYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJZnJlZV9ob3RfY29sZF9wYWdlKHBhZ2UsIDApOwogfQogCitzdGF0aWMgdm9pZCBfX3B1dF9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNvbXBvdW5kX3BhZ2VfZHRvciAqZHRvcjsKKworCV9fcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCWR0b3IgPSBnZXRfY29tcG91bmRfcGFnZV9kdG9yKHBhZ2UpOworCSgqZHRvcikocGFnZSk7Cit9CisKIHN0YXRpYyB2b2lkIHB1dF9jb21wb3VuZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXBhZ2UgPSBjb21wb3VuZF9oZWFkKHBhZ2UpOwotCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkgewotCQljb21wb3VuZF9wYWdlX2R0b3IgKmR0b3I7Ci0KLQkJZHRvciA9IGdldF9jb21wb3VuZF9wYWdlX2R0b3IocGFnZSk7Ci0JCSgqZHRvcikocGFnZSk7CisJaWYgKHVubGlrZWx5KFBhZ2VUYWlsKHBhZ2UpKSkgeworCQkvKiBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCBjYW4gcnVuIHVuZGVyIHVzICovCisJCXN0cnVjdCBwYWdlICpwYWdlX2hlYWQgPSBwYWdlLT5maXJzdF9wYWdlOworCQlzbXBfcm1iKCk7CisJCS8qCisJCSAqIElmIFBhZ2VUYWlsIGlzIHN0aWxsIHNldCBhZnRlciBzbXBfcm1iKCkgd2UgY2FuIGJlIHN1cmUKKwkJICogdGhhdCB0aGUgcGFnZS0+Zmlyc3RfcGFnZSB3ZSByZWFkIHdhc24ndCBhIGRhbmdsaW5nIHBvaW50ZXIuCisJCSAqIFNlZSBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpIHNtcF93bWIoKS4KKwkJICovCisJCWlmIChsaWtlbHkoUGFnZVRhaWwocGFnZSkgJiYgZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZV9oZWFkKSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkvKgorCQkJICogVmVyaWZ5IHRoYXQgb3VyIHBhZ2VfaGVhZCB3YXNuJ3QgY29udmVydGVkCisJCQkgKiB0byBhIGEgcmVndWxhciBwYWdlIGJlZm9yZSB3ZSBnb3QgYQorCQkJICogcmVmZXJlbmNlIG9uIGl0LgorCQkJICovCisJCQlpZiAodW5saWtlbHkoIVBhZ2VIZWFkKHBhZ2VfaGVhZCkpKSB7CisJCQkJLyogUGFnZUhlYWQgaXMgY2xlYXJlZCBhZnRlciBQYWdlVGFpbCAqLworCQkJCXNtcF9ybWIoKTsKKwkJCQlWTV9CVUdfT04oUGFnZVRhaWwocGFnZSkpOworCQkJCWdvdG8gb3V0X3B1dF9oZWFkOworCQkJfQorCQkJLyoKKwkJCSAqIE9ubHkgcnVuIGNvbXBvdW5kX2xvY2sgb24gYSB2YWxpZCBQYWdlSGVhZCwKKwkJCSAqIGFmdGVyIGhhdmluZyBpdCBwaW5uZWQgd2l0aAorCQkJICogZ2V0X3BhZ2VfdW5sZXNzX3plcm8oKSBhYm92ZS4KKwkJCSAqLworCQkJc21wX21iKCk7CisJCQkvKiBwYWdlX2hlYWQgd2Fzbid0IGEgZGFuZ2xpbmcgcG9pbnRlciAqLworCQkJZmxhZ3MgPSBjb21wb3VuZF9sb2NrX2lycXNhdmUocGFnZV9oZWFkKTsKKwkJCWlmICh1bmxpa2VseSghUGFnZVRhaWwocGFnZSkpKSB7CisJCQkJLyogX19zcGxpdF9odWdlX3BhZ2VfcmVmY291bnQgcnVuIGJlZm9yZSB1cyAqLworCQkJCWNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHBhZ2VfaGVhZCwgZmxhZ3MpOworCQkJCVZNX0JVR19PTihQYWdlSGVhZChwYWdlX2hlYWQpKTsKKwkJCW91dF9wdXRfaGVhZDoKKwkJCQlpZiAocHV0X3BhZ2VfdGVzdHplcm8ocGFnZV9oZWFkKSkKKwkJCQkJX19wdXRfc2luZ2xlX3BhZ2UocGFnZV9oZWFkKTsKKwkJCW91dF9wdXRfc2luZ2xlOgorCQkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkKKwkJCQkJX19wdXRfc2luZ2xlX3BhZ2UocGFnZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJVk1fQlVHX09OKHBhZ2VfaGVhZCAhPSBwYWdlLT5maXJzdF9wYWdlKTsKKwkJCS8qCisJCQkgKiBXZSBjYW4gcmVsZWFzZSB0aGUgcmVmY291bnQgdGFrZW4gYnkKKwkJCSAqIGdldF9wYWdlX3VubGVzc196ZXJvIG5vdyB0aGF0CisJCQkgKiBzcGxpdF9odWdlX3BhZ2VfcmVmY291bnQgaXMgYmxvY2tlZCBvbiB0aGUKKwkJCSAqIGNvbXBvdW5kX2xvY2suCisJCQkgKi8KKwkJCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlX2hlYWQpKQorCQkJCVZNX0JVR19PTigxKTsKKwkJCS8qIF9fc3BsaXRfaHVnZV9wYWdlX3JlZmNvdW50IHdpbGwgd2FpdCBub3cgKi8KKwkJCVZNX0JVR19PTihhdG9taWNfcmVhZCgmcGFnZS0+X2NvdW50KSA8PSAwKTsKKwkJCWF0b21pY19kZWMoJnBhZ2UtPl9jb3VudCk7CisJCQlWTV9CVUdfT04oYXRvbWljX3JlYWQoJnBhZ2VfaGVhZC0+X2NvdW50KSA8PSAwKTsKKwkJCWNvbXBvdW5kX3VubG9ja19pcnFyZXN0b3JlKHBhZ2VfaGVhZCwgZmxhZ3MpOworCQkJaWYgKHB1dF9wYWdlX3Rlc3R6ZXJvKHBhZ2VfaGVhZCkpIHsKKwkJCQlpZiAoUGFnZUhlYWQocGFnZV9oZWFkKSkKKwkJCQkJX19wdXRfY29tcG91bmRfcGFnZShwYWdlX2hlYWQpOworCQkJCWVsc2UKKwkJCQkJX19wdXRfc2luZ2xlX3BhZ2UocGFnZV9oZWFkKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHBhZ2VfaGVhZCBpcyBhIGRhbmdsaW5nIHBvaW50ZXIgKi8KKwkJCVZNX0JVR19PTihQYWdlVGFpbChwYWdlKSk7CisJCQlnb3RvIG91dF9wdXRfc2luZ2xlOworCQl9CisJfSBlbHNlIGlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkgeworCQlpZiAoUGFnZUhlYWQocGFnZSkpCisJCQlfX3B1dF9jb21wb3VuZF9wYWdlKHBhZ2UpOworCQllbHNlCisJCQlfX3B1dF9zaW5nbGVfcGFnZShwYWdlKTsKIAl9CiB9CiAKQEAgLTc1LDcgKzE1NSw3IEBACiAJaWYgKHVubGlrZWx5KFBhZ2VDb21wb3VuZChwYWdlKSkpCiAJCXB1dF9jb21wb3VuZF9wYWdlKHBhZ2UpOwogCWVsc2UgaWYgKHB1dF9wYWdlX3Rlc3R6ZXJvKHBhZ2UpKQotCQlfX3BhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJX19wdXRfc2luZ2xlX3BhZ2UocGFnZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHB1dF9wYWdlKTsKIApAQCAtOTgsMTUgKzE3OCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChwdXRfcGFnZXNfbGlzdCk7CiAKLS8qCi0gKiBwYWdldmVjX21vdmVfdGFpbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggSVJRIGRpc2FibGVkLgotICogT3RoZXJ3aXNlIHRoaXMgbWF5IGNhdXNlIG5hc3R5IHJhY2VzLgotICovCi1zdGF0aWMgdm9pZCBwYWdldmVjX21vdmVfdGFpbChzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKK3N0YXRpYyB2b2lkIHBhZ2V2ZWNfbHJ1X21vdmVfZm4oc3RydWN0IHBhZ2V2ZWMgKnB2ZWMsCisJCQkJdm9pZCAoKm1vdmVfZm4pKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICphcmcpLAorCQkJCXZvaWQgKmFyZykKIHsKIAlpbnQgaTsKLQlpbnQgcGdtb3ZlZCA9IDA7CiAJc3RydWN0IHpvbmUgKnpvbmUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQocHZlYyk7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwpAQCAtMTE0LDI5ICsxOTIsNDkgQEAKIAogCQlpZiAocGFnZXpvbmUgIT0gem9uZSkgewogCQkJaWYgKHpvbmUpCi0JCQkJc3Bpbl91bmxvY2soJnpvbmUtPmxydV9sb2NrKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOwogCQkJem9uZSA9IHBhZ2V6b25lOwotCQkJc3Bpbl9sb2NrKCZ6b25lLT5scnVfbG9jayk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKIAkJfQotCQlpZiAoUGFnZUxSVShwYWdlKSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAmJiAhUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKSB7Ci0JCQlpbnQgbHJ1ID0gcGFnZV9scnVfYmFzZV90eXBlKHBhZ2UpOwotCQkJbGlzdF9tb3ZlX3RhaWwoJnBhZ2UtPmxydSwgJnpvbmUtPmxydVtscnVdLmxpc3QpOwotCQkJcGdtb3ZlZCsrOwotCQl9CisKKwkJKCptb3ZlX2ZuKShwYWdlLCBhcmcpOwogCX0KIAlpZiAoem9uZSkKLQkJc3Bpbl91bmxvY2soJnpvbmUtPmxydV9sb2NrKTsKLQlfX2NvdW50X3ZtX2V2ZW50cyhQR1JPVEFURUQsIHBnbW92ZWQpOwotCXJlbGVhc2VfcGFnZXMocHZlYy0+cGFnZXMsIHB2ZWMtPm5yLCBwdmVjLT5jb2xkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwlyZWxlYXNlX3BhZ2VzKHB2ZWMtPnBhZ2VzLCBwYWdldmVjX2NvdW50KHB2ZWMpLCBwdmVjLT5jb2xkKTsKIAlwYWdldmVjX3JlaW5pdChwdmVjKTsKIH0KIAorc3RhdGljIHZvaWQgcGFnZXZlY19tb3ZlX3RhaWxfZm4oc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmFyZykKK3sKKwlpbnQgKnBnbW92ZWQgPSBhcmc7CisJc3RydWN0IHpvbmUgKnpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CisKKwlpZiAoUGFnZUxSVShwYWdlKSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAmJiAhUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKSB7CisJCWludCBscnUgPSBwYWdlX2xydV9iYXNlX3R5cGUocGFnZSk7CisJCWxpc3RfbW92ZV90YWlsKCZwYWdlLT5scnUsICZ6b25lLT5scnVbbHJ1XS5saXN0KTsKKwkJKCpwZ21vdmVkKSsrOworCX0KK30KKworLyoKKyAqIHBhZ2V2ZWNfbW92ZV90YWlsKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBJUlEgZGlzYWJsZWQuCisgKiBPdGhlcndpc2UgdGhpcyBtYXkgY2F1c2UgbmFzdHkgcmFjZXMuCisgKi8KK3N0YXRpYyB2b2lkIHBhZ2V2ZWNfbW92ZV90YWlsKHN0cnVjdCBwYWdldmVjICpwdmVjKQoreworCWludCBwZ21vdmVkID0gMDsKKworCXBhZ2V2ZWNfbHJ1X21vdmVfZm4ocHZlYywgcGFnZXZlY19tb3ZlX3RhaWxfZm4sICZwZ21vdmVkKTsKKwlfX2NvdW50X3ZtX2V2ZW50cyhQR1JPVEFURUQsIHBnbW92ZWQpOworfQorCiAvKgogICogV3JpdGViYWNrIGlzIGFib3V0IHRvIGVuZCBhZ2FpbnN0IGEgcGFnZSB3aGljaCBoYXMgYmVlbiBtYXJrZWQgZm9yIGltbWVkaWF0ZQogICogcmVjbGFpbS4gIElmIGl0IHN0aWxsIGFwcGVhcnMgdG8gYmUgcmVjbGFpbWFibGUsIG1vdmUgaXQgdG8gdGhlIHRhaWwgb2YgdGhlCiAgKiBpbmFjdGl2ZSBsaXN0LgogICovCi12b2lkICByb3RhdGVfcmVjbGFpbWFibGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3ZvaWQgcm90YXRlX3JlY2xhaW1hYmxlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpICYmICFQYWdlRGlydHkocGFnZSkgJiYgIVBhZ2VBY3RpdmUocGFnZSkgJiYKIAkgICAgIVBhZ2VVbmV2aWN0YWJsZShwYWdlKSAmJiBQYWdlTFJVKHBhZ2UpKSB7CkBAIC0xNzMsMjcgKzI3MSw5NCBAQAogfQogCiAvKgotICogRklYTUU6IHNwZWVkIHRoaXMgdXA/CisgKiBBIHBhZ2Ugd2lsbCBnbyB0byBhY3RpdmUgbGlzdCBlaXRoZXIgYnkgYWN0aXZhdGVfcGFnZSBvciBwdXRiYWNrX2xydV9wYWdlLgorICogSW4gdGhlIGFjdGl2YXRlX3BhZ2UgY2FzZSwgdGhlIHBhZ2UgaGFzbid0IGFjdGl2ZSBiaXQgc2V0LiBUaGUgcGFnZSBtaWdodAorICogbm90IGluIExSVSBsaXN0IGJlY2F1c2UgaXQncyBpc29sYXRlZCBiZWZvcmUgaXQgZ2V0cyBhIGNoYW5jZSB0byBiZSBtb3ZlZCB0bworICogYWN0aXZlIGxpc3QuIFRoZSB3aW5kb3cgaXMgc21hbGwgYmVjYXVzZSBwYWdldmVjIGp1c3Qgc3RvcmVzIHNldmVyYWwgcGFnZXMuCisgKiBGb3Igc3VjaCBjYXNlLCB3ZSBkbyBub3RoaW5nIGZvciBzdWNoIHBhZ2UuCisgKiBJbiB0aGUgcHV0YmFja19scnVfcGFnZSBjYXNlLCB0aGUgcGFnZSBpc24ndCBpbiBscnUgbGlzdCBidXQgaGFzIGFjdGl2ZQorICogYml0IHNldAogICovCitzdGF0aWMgdm9pZCBfX2FjdGl2YXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKKwlpbnQgZmlsZSA9IHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKTsKKwlpbnQgbHJ1ID0gcGFnZV9scnVfYmFzZV90eXBlKHBhZ2UpOworCWJvb2wgcHV0YmFjayA9ICFQYWdlTFJVKHBhZ2UpOworCisJLyogVGhlIHBhZ2UgaXMgaXNvbGF0ZWQgYmVmb3JlIGl0J3MgbW92ZWQgdG8gYWN0aXZlIGxpc3QgKi8KKwlpZiAoIVBhZ2VMUlUocGFnZSkgJiYgIVBhZ2VBY3RpdmUocGFnZSkpCisJCXJldHVybjsKKwlpZiAoKFBhZ2VMUlUocGFnZSkgJiYgUGFnZUFjdGl2ZShwYWdlKSkgfHwgUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKQorCQlyZXR1cm47CisKKwlpZiAoIXB1dGJhY2spCisJCWRlbF9wYWdlX2Zyb21fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbHJ1KTsKKwllbHNlCisJCVNldFBhZ2VMUlUocGFnZSk7CisKKwlTZXRQYWdlQWN0aXZlKHBhZ2UpOworCWxydSArPSBMUlVfQUNUSVZFOworCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7CisKKwlpZiAocHV0YmFjaykKKwkJcmV0dXJuOworCV9fY291bnRfdm1fZXZlbnQoUEdBQ1RJVkFURSk7CisJdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHpvbmUsIHBhZ2UsIGZpbGUsIDEpOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwYWdldmVjLCBhY3RpdmF0ZV9wYWdlX3B2ZWNzKTsKKworc3RhdGljIHZvaWQgYWN0aXZhdGVfcGFnZV9kcmFpbihpbnQgY3B1KQoreworCXN0cnVjdCBwYWdldmVjICpwdmVjID0gJnBlcl9jcHUoYWN0aXZhdGVfcGFnZV9wdmVjcywgY3B1KTsKKworCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQorCQlwYWdldmVjX2xydV9tb3ZlX2ZuKHB2ZWMsIF9fYWN0aXZhdGVfcGFnZSwgTlVMTCk7Cit9CisKK3ZvaWQgYWN0aXZhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoUGFnZUxSVShwYWdlKSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAmJiAhUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKSB7CisJCXN0cnVjdCBwYWdldmVjICpwdmVjID0gJmdldF9jcHVfdmFyKGFjdGl2YXRlX3BhZ2VfcHZlY3MpOworCisJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCQlpZiAoIXBhZ2V2ZWNfYWRkKHB2ZWMsIHBhZ2UpKQorCQkJcGFnZXZlY19scnVfbW92ZV9mbihwdmVjLCBfX2FjdGl2YXRlX3BhZ2UsIE5VTEwpOworCQlwdXRfY3B1X3ZhcihhY3RpdmF0ZV9wYWdlX3B2ZWNzKTsKKwl9Cit9CisKKy8qIENhbGxlciBzaG91bGQgaG9sZCB6b25lLT5scnVfbG9jayAqLworaW50IHB1dGJhY2tfYWN0aXZlX2xydV9wYWdlKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgcGFnZXZlYyAqcHZlYyA9ICZnZXRfY3B1X3ZhcihhY3RpdmF0ZV9wYWdlX3B2ZWNzKTsKKworCWlmICghcGFnZXZlY19hZGQocHZlYywgcGFnZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CisJCXBhZ2V2ZWNfbHJ1X21vdmVfZm4ocHZlYywgX19hY3RpdmF0ZV9wYWdlLCBOVUxMKTsKKwkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOworCX0KKwlwdXRfY3B1X3ZhcihhY3RpdmF0ZV9wYWdlX3B2ZWNzKTsKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9wYWdlX2RyYWluKGludCBjcHUpCit7Cit9CisKIHZvaWQgYWN0aXZhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKIAogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKLQlpZiAoUGFnZUxSVShwYWdlKSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAmJiAhUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKSB7Ci0JCWludCBmaWxlID0gcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwotCQlpbnQgbHJ1ID0gcGFnZV9scnVfYmFzZV90eXBlKHBhZ2UpOwotCQlkZWxfcGFnZV9mcm9tX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7Ci0KLQkJU2V0UGFnZUFjdGl2ZShwYWdlKTsKLQkJbHJ1ICs9IExSVV9BQ1RJVkU7Ci0JCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7Ci0JCV9fY291bnRfdm1fZXZlbnQoUEdBQ1RJVkFURSk7Ci0KLQkJdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHpvbmUsIHBhZ2UsIGZpbGUsIDEpOwotCX0KKwlpZiAoUGFnZUxSVShwYWdlKSAmJiAhUGFnZUFjdGl2ZShwYWdlKSAmJiAhUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKQorCQlfX2FjdGl2YXRlX3BhZ2UocGFnZSwgTlVMTCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiB9CisjZW5kaWYKIAogLyoKICAqIE1hcmsgYSBwYWdlIGFzIGhhdmluZyBzZWVuIGFjdGl2aXR5LgpAQCAtMjkyLDYgKzQ1Nyw3IEBACiAJCXBhZ2V2ZWNfbW92ZV90YWlsKHB2ZWMpOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQorCWFjdGl2YXRlX3BhZ2VfZHJhaW4oY3B1KTsKIH0KIAogdm9pZCBscnVfYWRkX2RyYWluKHZvaWQpCkBAIC0zOTksNDQgKzU2NSw3MCBAQAogCiBFWFBPUlRfU1lNQk9MKF9fcGFnZXZlY19yZWxlYXNlKTsKIAorLyogdXNlZCBieSBfX3NwbGl0X2h1Z2VfcGFnZV9yZWZjb3VudCgpICovCit2b2lkIGxydV9hZGRfcGFnZV90YWlsKHN0cnVjdCB6b25lKiB6b25lLAorCQkgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpwYWdlX3RhaWwpCit7CisJaW50IGFjdGl2ZTsKKwllbnVtIGxydV9saXN0IGxydTsKKwljb25zdCBpbnQgZmlsZSA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKworCVZNX0JVR19PTighUGFnZUhlYWQocGFnZSkpOworCVZNX0JVR19PTihQYWdlQ29tcG91bmQocGFnZV90YWlsKSk7CisJVk1fQlVHX09OKFBhZ2VMUlUocGFnZV90YWlsKSk7CisJVk1fQlVHX09OKCFzcGluX2lzX2xvY2tlZCgmem9uZS0+bHJ1X2xvY2spKTsKKworCVNldFBhZ2VMUlUocGFnZV90YWlsKTsKKworCWlmIChwYWdlX2V2aWN0YWJsZShwYWdlX3RhaWwsIE5VTEwpKSB7CisJCWlmIChQYWdlQWN0aXZlKHBhZ2UpKSB7CisJCQlTZXRQYWdlQWN0aXZlKHBhZ2VfdGFpbCk7CisJCQlhY3RpdmUgPSAxOworCQkJbHJ1ID0gTFJVX0FDVElWRV9BTk9OOworCQl9IGVsc2UgeworCQkJYWN0aXZlID0gMDsKKwkJCWxydSA9IExSVV9JTkFDVElWRV9BTk9OOworCQl9CisJCXVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdCh6b25lLCBwYWdlX3RhaWwsIGZpbGUsIGFjdGl2ZSk7CisJCWlmIChsaWtlbHkoUGFnZUxSVShwYWdlKSkpCisJCQloZWFkID0gcGFnZS0+bHJ1LnByZXY7CisJCWVsc2UKKwkJCWhlYWQgPSAmem9uZS0+bHJ1W2xydV0ubGlzdDsKKwkJX19hZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlX3RhaWwsIGxydSwgaGVhZCk7CisJfSBlbHNlIHsKKwkJU2V0UGFnZVVuZXZpY3RhYmxlKHBhZ2VfdGFpbCk7CisJCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2VfdGFpbCwgTFJVX1VORVZJQ1RBQkxFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fX19wYWdldmVjX2xydV9hZGRfZm4oc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmFyZykKK3sKKwllbnVtIGxydV9saXN0IGxydSA9IChlbnVtIGxydV9saXN0KWFyZzsKKwlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKKwlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGxydSk7CisJaW50IGFjdGl2ZSA9IGlzX2FjdGl2ZV9scnUobHJ1KTsKKworCVZNX0JVR19PTihQYWdlQWN0aXZlKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKTsKKwlWTV9CVUdfT04oUGFnZUxSVShwYWdlKSk7CisKKwlTZXRQYWdlTFJVKHBhZ2UpOworCWlmIChhY3RpdmUpCisJCVNldFBhZ2VBY3RpdmUocGFnZSk7CisJdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHpvbmUsIHBhZ2UsIGZpbGUsIGFjdGl2ZSk7CisJYWRkX3BhZ2VfdG9fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbHJ1KTsKK30KKwogLyoKICAqIEFkZCB0aGUgcGFzc2VkIHBhZ2VzIHRvIHRoZSBMUlUsIHRoZW4gZHJvcCB0aGUgY2FsbGVyJ3MgcmVmY291bnQKICAqIG9uIHRoZW0uICBSZWluaXRpYWxpc2VzIHRoZSBjYWxsZXIncyBwYWdldmVjLgogICovCiB2b2lkIF9fX19wYWdldmVjX2xydV9hZGQoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMsIGVudW0gbHJ1X2xpc3QgbHJ1KQogewotCWludCBpOwotCXN0cnVjdCB6b25lICp6b25lID0gTlVMTDsKLQogCVZNX0JVR19PTihpc191bmV2aWN0YWJsZV9scnUobHJ1KSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy0+cGFnZXNbaV07Ci0JCXN0cnVjdCB6b25lICpwYWdlem9uZSA9IHBhZ2Vfem9uZShwYWdlKTsKLQkJaW50IGZpbGU7Ci0JCWludCBhY3RpdmU7Ci0KLQkJaWYgKHBhZ2V6b25lICE9IHpvbmUpIHsKLQkJCWlmICh6b25lKQotCQkJCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQkJem9uZSA9IHBhZ2V6b25lOwotCQkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQl9Ci0JCVZNX0JVR19PTihQYWdlQWN0aXZlKHBhZ2UpKTsKLQkJVk1fQlVHX09OKFBhZ2VVbmV2aWN0YWJsZShwYWdlKSk7Ci0JCVZNX0JVR19PTihQYWdlTFJVKHBhZ2UpKTsKLQkJU2V0UGFnZUxSVShwYWdlKTsKLQkJYWN0aXZlID0gaXNfYWN0aXZlX2xydShscnUpOwotCQlmaWxlID0gaXNfZmlsZV9scnUobHJ1KTsKLQkJaWYgKGFjdGl2ZSkKLQkJCVNldFBhZ2VBY3RpdmUocGFnZSk7Ci0JCXVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdCh6b25lLCBwYWdlLCBmaWxlLCBhY3RpdmUpOwotCQlhZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlLCBscnUpOwotCX0KLQlpZiAoem9uZSkKLQkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7Ci0JcmVsZWFzZV9wYWdlcyhwdmVjLT5wYWdlcywgcHZlYy0+bnIsIHB2ZWMtPmNvbGQpOwotCXBhZ2V2ZWNfcmVpbml0KHB2ZWMpOworCXBhZ2V2ZWNfbHJ1X21vdmVfZm4ocHZlYywgX19fX3BhZ2V2ZWNfbHJ1X2FkZF9mbiwgKHZvaWQgKilscnUpOwogfQogCiBFWFBPUlRfU1lNQk9MKF9fX19wYWdldmVjX2xydV9hZGQpOwpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IGUxMGY1ODMzLi41YzhjZmFiIDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0xNTcsNiArMTU3LDEyIEBACiAJaWYgKCFlbnRyeS52YWwpCiAJCXJldHVybiAwOwogCisJaWYgKHVubGlrZWx5KFBhZ2VUcmFuc0h1Z2UocGFnZSkpKQorCQlpZiAodW5saWtlbHkoc3BsaXRfaHVnZV9wYWdlKHBhZ2UpKSkgeworCQkJc3dhcGNhY2hlX2ZyZWUoZW50cnksIE5VTEwpOworCQkJcmV0dXJuIDA7CisJCX0KKwogCS8qCiAJICogUmFkaXgtdHJlZSBub2RlIGFsbG9jYXRpb25zIGZyb20gUEZfTUVNQUxMT0MgY29udGV4dHMgY291bGQKIAkgKiBjb21wbGV0ZWx5IGV4aGF1c3QgdGhlIHBhZ2UgYWxsb2NhdG9yLiBfX0dGUF9OT01FTUFMTE9DCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA2N2RkYWFmLi4wN2E0NThkIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTk2NCw2ICs5NjQsOCBAQAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAlkbyB7CiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKHVubGlrZWx5KHBtZF90cmFuc19odWdlKCpwbWQpKSkKKwkJCWNvbnRpbnVlOwogCQlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCiAJCQljb250aW51ZTsKIAkJcmV0ID0gdW51c2VfcHRlX3JhbmdlKHZtYSwgcG1kLCBhZGRyLCBuZXh0LCBlbnRyeSwgcGFnZSk7CkBAIC0xNjc3LDcgKzE2NzksNyBAQAogCWlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CiAJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoaW5vZGUpOwogCQlzZXRfYmxvY2tzaXplKGJkZXYsIHAtPm9sZF9ibG9ja19zaXplKTsKLQkJYmRfcmVsZWFzZShiZGV2KTsKKwkJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMKTsKIAl9IGVsc2UgewogCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWlub2RlLT5pX2ZsYWdzICY9IH5TX1NXQVBGSUxFOwpAQCAtMTkzOSw3ICsxOTQxLDggQEAKIAllcnJvciA9IC1FSU5WQUw7CiAJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKIAkJYmRldiA9IElfQkRFVihpbm9kZSk7Ci0JCWVycm9yID0gYmRfY2xhaW0oYmRldiwgc3lzX3N3YXBvbik7CisJCWVycm9yID0gYmxrZGV2X2dldChiZGV2LCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMLAorCQkJCSAgIHN5c19zd2Fwb24pOwogCQlpZiAoZXJyb3IgPCAwKSB7CiAJCQliZGV2ID0gTlVMTDsKIAkJCWVycm9yID0gLUVJTlZBTDsKQEAgLTIxMzYsNyArMjEzOSw3IEBACiBiYWRfc3dhcDoKIAlpZiAoYmRldikgewogCQlzZXRfYmxvY2tzaXplKGJkZXYsIHAtPm9sZF9ibG9ja19zaXplKTsKLQkJYmRfcmVsZWFzZShiZGV2KTsKKwkJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfCBGTU9ERV9FWENMKTsKIAl9CiAJZGVzdHJveV9zd2FwX2V4dGVudHMocCk7CiAJc3dhcF9jZ3JvdXBfc3dhcG9mZih0eXBlKTsKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCBlYjVjYzdkLi5mOWIxNjY3IDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC03NDgsNyArNzQ4LDcgQEAKIAl2YSA9IGFsbG9jX3ZtYXBfYXJlYShWTUFQX0JMT0NLX1NJWkUsIFZNQVBfQkxPQ0tfU0laRSwKIAkJCQkJVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsCiAJCQkJCW5vZGUsIGdmcF9tYXNrKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHZhKSkpIHsKKwlpZiAoSVNfRVJSKHZhKSkgewogCQlrZnJlZSh2Yik7CiAJCXJldHVybiBFUlJfQ0FTVCh2YSk7CiAJfQpAQCAtMTE3NSw2ICsxMTc1LDcgQEAKIHsKIAl2dW5tYXBfcGFnZV9yYW5nZShhZGRyLCBhZGRyICsgc2l6ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1bm1hcF9rZXJuZWxfcmFuZ2Vfbm9mbHVzaCk7CiAKIC8qKgogICogdW5tYXBfa2VybmVsX3JhbmdlIC0gdW5tYXAga2VybmVsIFZNIGFyZWEgYW5kIGZsdXNoIGNhY2hlIGFuZCBUTEIKQEAgLTEzMTUsMTMgKzEzMTYsNiBAQAogCQkJCQkJLTEsIEdGUF9LRVJORUwsIGNhbGxlcik7CiB9CiAKLXN0cnVjdCB2bV9zdHJ1Y3QgKmdldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJCSAgIGludCBub2RlLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlyZXR1cm4gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIDEsIGZsYWdzLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKLQkJCQkgIG5vZGUsIGdmcF9tYXNrLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotfQotCiBzdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqZmluZF92bV9hcmVhKGNvbnN0IHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IHZtYXBfYXJlYSAqdmE7CkBAIC0xNTM3LDE3ICsxNTMxLDQ3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgKl9fdm1hbGxvY19hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIGdmcF90IGdmcF9tYXNrLCBwZ3Byb3RfdCBwcm90KQorLyoqCisgKglfX3ZtYWxsb2Nfbm9kZV9yYW5nZSAgLSAgYWxsb2NhdGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5CisgKglAc2l6ZToJCWFsbG9jYXRpb24gc2l6ZQorICoJQGFsaWduOgkJZGVzaXJlZCBhbGlnbm1lbnQKKyAqCUBzdGFydDoJCXZtIGFyZWEgcmFuZ2Ugc3RhcnQKKyAqCUBlbmQ6CQl2bSBhcmVhIHJhbmdlIGVuZAorICoJQGdmcF9tYXNrOglmbGFncyBmb3IgdGhlIHBhZ2UgbGV2ZWwgYWxsb2NhdG9yCisgKglAcHJvdDoJCXByb3RlY3Rpb24gbWFzayBmb3IgdGhlIGFsbG9jYXRlZCBwYWdlcworICoJQG5vZGU6CQlub2RlIHRvIHVzZSBmb3IgYWxsb2NhdGlvbiBvciAtMQorICoJQGNhbGxlcjoJY2FsbGVyJ3MgcmV0dXJuIGFkZHJlc3MKKyAqCisgKglBbGxvY2F0ZSBlbm91Z2ggcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGUgcGFnZSBsZXZlbAorICoJYWxsb2NhdG9yIHdpdGggQGdmcF9tYXNrIGZsYWdzLiAgTWFwIHRoZW0gaW50byBjb250aWd1b3VzCisgKglrZXJuZWwgdmlydHVhbCBzcGFjZSwgdXNpbmcgYSBwYWdldGFibGUgcHJvdGVjdGlvbiBvZiBAcHJvdC4KKyAqLwordm9pZCAqX192bWFsbG9jX25vZGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAorCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIGdmcF90IGdmcF9tYXNrLAorCQkJcGdwcm90X3QgcHJvdCwgaW50IG5vZGUsIHZvaWQgKmNhbGxlcikKIHsKLQl2b2lkICphZGRyID0gX192bWFsbG9jX2FyZWFfbm9kZShhcmVhLCBnZnBfbWFzaywgcHJvdCwgLTEsCi0JCQkJCSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJlYWxfc2l6ZSA9IHNpemU7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiB0b3RhbHJhbV9wYWdlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlhcmVhID0gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGFsaWduLCBWTV9BTExPQywgc3RhcnQsIGVuZCwgbm9kZSwKKwkJCQkgIGdmcF9tYXNrLCBjYWxsZXIpOworCisJaWYgKCFhcmVhKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHIgPSBfX3ZtYWxsb2NfYXJlYV9ub2RlKGFyZWEsIGdmcF9tYXNrLCBwcm90LCBub2RlLCBjYWxsZXIpOwogCiAJLyoKIAkgKiBBIHJlZl9jb3VudCA9IDMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHZtX3N0cnVjdCBhbmQgdm1hcF9hcmVhCiAJICogc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gdGhlIF9fZ2V0X3ZtX2FyZWFfbm9kZSgpIGZ1bmN0aW9uIGNvbnRhaW4KIAkgKiByZWZlcmVuY2VzIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHZtYWxsb2MnZWQgYmxvY2suCiAJICovCi0Ja21lbWxlYWtfYWxsb2MoYWRkciwgYXJlYS0+c2l6ZSAtIFBBR0VfU0laRSwgMywgZ2ZwX21hc2spOworCWttZW1sZWFrX2FsbG9jKGFkZHIsIHJlYWxfc2l6ZSwgMywgZ2ZwX21hc2spOwogCiAJcmV0dXJuIGFkZHI7CiB9CkBAIC0xNTY5LDMwICsxNTkzLDggQEAKIAkJCSAgICBnZnBfdCBnZnBfbWFzaywgcGdwcm90X3QgcHJvdCwKIAkJCSAgICBpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKQogewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0Jdm9pZCAqYWRkcjsKLQl1bnNpZ25lZCBsb25nIHJlYWxfc2l6ZSA9IHNpemU7Ci0KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiB0b3RhbHJhbV9wYWdlcykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlhcmVhID0gX19nZXRfdm1fYXJlYV9ub2RlKHNpemUsIGFsaWduLCBWTV9BTExPQywgVk1BTExPQ19TVEFSVCwKLQkJCQkgIFZNQUxMT0NfRU5ELCBub2RlLCBnZnBfbWFzaywgY2FsbGVyKTsKLQotCWlmICghYXJlYSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlhZGRyID0gX192bWFsbG9jX2FyZWFfbm9kZShhcmVhLCBnZnBfbWFzaywgcHJvdCwgbm9kZSwgY2FsbGVyKTsKLQotCS8qCi0JICogQSByZWZfY291bnQgPSAzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSB2bV9zdHJ1Y3QgYW5kIHZtYXBfYXJlYQotCSAqIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGluIHRoZSBfX2dldF92bV9hcmVhX25vZGUoKSBmdW5jdGlvbiBjb250YWluCi0JICogcmVmZXJlbmNlcyB0byB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSB2bWFsbG9jJ2VkIGJsb2NrLgotCSAqLwotCWttZW1sZWFrX2FsbG9jKGFkZHIsIHJlYWxfc2l6ZSwgMywgZ2ZwX21hc2spOwotCi0JcmV0dXJuIGFkZHI7CisJcmV0dXJuIF9fdm1hbGxvY19ub2RlX3JhbmdlKHNpemUsIGFsaWduLCBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKKwkJCQlnZnBfbWFzaywgcHJvdCwgbm9kZSwgY2FsbGVyKTsKIH0KIAogdm9pZCAqX192bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpCkBAIC0yMjAzLDE3ICsyMjA1LDE2IEBACiAgKiBAc2l6ZXM6IGFycmF5IGNvbnRhaW5pbmcgc2l6ZSBvZiBlYWNoIGFyZWEKICAqIEBucl92bXM6IHRoZSBudW1iZXIgb2YgYXJlYXMgdG8gYWxsb2NhdGUKICAqIEBhbGlnbjogYWxpZ25tZW50LCBhbGwgZW50cmllcyBpbiBAb2Zmc2V0cyBhbmQgQHNpemVzIG11c3QgYmUgYWxpZ25lZCB0byB0aGlzCi0gKiBAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzawogICoKICAqIFJldHVybnM6IGttYWxsb2MnZCB2bV9zdHJ1Y3QgcG9pbnRlciBhcnJheSBwb2ludGluZyB0byBhbGxvY2F0ZWQKICAqCSAgICB2bV9zdHJ1Y3RzIG9uIHN1Y2Nlc3MsICVOVUxMIG9uIGZhaWx1cmUKICAqCiAgKiBQZXJjcHUgYWxsb2NhdG9yIHdhbnRzIHRvIHVzZSBjb25ncnVlbnQgdm0gYXJlYXMgc28gdGhhdCBpdCBjYW4KICAqIG1haW50YWluIHRoZSBvZmZzZXRzIGFtb25nIHBlcmNwdSBhcmVhcy4gIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzCi0gKiBjb25ncnVlbnQgdm1hbGxvYyBhcmVhcyBmb3IgaXQuICBUaGVzZSBhcmVhcyB0ZW5kIHRvIGJlIHNjYXR0ZXJlZAotICogcHJldHR5IGZhciwgZGlzdGFuY2UgYmV0d2VlbiB0d28gYXJlYXMgZWFzaWx5IGdvaW5nIHVwIHRvCi0gKiBnaWdhYnl0ZXMuICBUbyBhdm9pZCBpbnRlcmFjdGluZyB3aXRoIHJlZ3VsYXIgdm1hbGxvY3MsIHRoZXNlIGFyZWFzCi0gKiBhcmUgYWxsb2NhdGVkIGZyb20gdG9wLgorICogY29uZ3J1ZW50IHZtYWxsb2MgYXJlYXMgZm9yIGl0IHdpdGggR0ZQX0tFUk5FTC4gIFRoZXNlIGFyZWFzIHRlbmQgdG8KKyAqIGJlIHNjYXR0ZXJlZCBwcmV0dHkgZmFyLCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhcmVhcyBlYXNpbHkgZ29pbmcgdXAKKyAqIHRvIGdpZ2FieXRlcy4gIFRvIGF2b2lkIGludGVyYWN0aW5nIHdpdGggcmVndWxhciB2bWFsbG9jcywgdGhlc2UKKyAqIGFyZWFzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0b3AuCiAgKgogICogRGVzcGl0ZSBpdHMgY29tcGxpY2F0ZWQgbG9vaywgdGhpcyBhbGxvY2F0b3IgaXMgcmF0aGVyIHNpbXBsZS4gIEl0CiAgKiBkb2VzIGV2ZXJ5dGhpbmcgdG9wLWRvd24gYW5kIHNjYW5zIGFyZWFzIGZyb20gdGhlIGVuZCBsb29raW5nIGZvcgpAQCAtMjIyNCw3ICsyMjI1LDcgQEAKICAqLwogc3RydWN0IHZtX3N0cnVjdCAqKnBjcHVfZ2V0X3ZtX2FyZWFzKGNvbnN0IHVuc2lnbmVkIGxvbmcgKm9mZnNldHMsCiAJCQkJICAgICBjb25zdCBzaXplX3QgKnNpemVzLCBpbnQgbnJfdm1zLAotCQkJCSAgICAgc2l6ZV90IGFsaWduLCBnZnBfdCBnZnBfbWFzaykKKwkJCQkgICAgIHNpemVfdCBhbGlnbikKIHsKIAljb25zdCB1bnNpZ25lZCBsb25nIHZtYWxsb2Nfc3RhcnQgPSBBTElHTihWTUFMTE9DX1NUQVJULCBhbGlnbik7CiAJY29uc3QgdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZCA9IFZNQUxMT0NfRU5EICYgfihhbGlnbiAtIDEpOwpAQCAtMjIzNCw4ICsyMjM1LDYgQEAKIAl1bnNpZ25lZCBsb25nIGJhc2UsIHN0YXJ0LCBlbmQsIGxhc3RfZW5kOwogCWJvb2wgcHVyZ2VkID0gZmFsc2U7CiAKLQlnZnBfbWFzayAmPSBHRlBfUkVDTEFJTV9NQVNLOwotCiAJLyogdmVyaWZ5IHBhcmFtZXRlcnMgYW5kIGFsbG9jYXRlIGRhdGEgc3RydWN0dXJlcyAqLwogCUJVR19PTihhbGlnbiAmIH5QQUdFX01BU0sgfHwgIWlzX3Bvd2VyX29mXzIoYWxpZ24pKTsKIAlmb3IgKGxhc3RfYXJlYSA9IDAsIGFyZWEgPSAwOyBhcmVhIDwgbnJfdm1zOyBhcmVhKyspIHsKQEAgLTIyNjgsMTQgKzIyNjcsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jdm1zID0ga3phbGxvYyhzaXplb2Yodm1zWzBdKSAqIG5yX3ZtcywgZ2ZwX21hc2spOwotCXZhcyA9IGt6YWxsb2Moc2l6ZW9mKHZhc1swXSkgKiBucl92bXMsIGdmcF9tYXNrKTsKKwl2bXMgPSBremFsbG9jKHNpemVvZih2bXNbMF0pICogbnJfdm1zLCBHRlBfS0VSTkVMKTsKKwl2YXMgPSBremFsbG9jKHNpemVvZih2YXNbMF0pICogbnJfdm1zLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZhcyB8fCAhdm1zKQogCQlnb3RvIGVycl9mcmVlOwogCiAJZm9yIChhcmVhID0gMDsgYXJlYSA8IG5yX3ZtczsgYXJlYSsrKSB7Ci0JCXZhc1thcmVhXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWFwX2FyZWEpLCBnZnBfbWFzayk7Ci0JCXZtc1thcmVhXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bV9zdHJ1Y3QpLCBnZnBfbWFzayk7CisJCXZhc1thcmVhXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWFwX2FyZWEpLCBHRlBfS0VSTkVMKTsKKwkJdm1zW2FyZWFdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZtX3N0cnVjdCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXZhc1thcmVhXSB8fCAhdm1zW2FyZWFdKQogCQkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC0yNDU2LDEzICsyNDU1LDggQEAKIAlzZXFfcHJpbnRmKG0sICIweCVwLTB4JXAgJTdsZCIsCiAJCXYtPmFkZHIsIHYtPmFkZHIgKyB2LT5zaXplLCB2LT5zaXplKTsKIAotCWlmICh2LT5jYWxsZXIpIHsKLQkJY2hhciBidWZmW0tTWU1fU1lNQk9MX0xFTl07Ci0KLQkJc2VxX3B1dGMobSwgJyAnKTsKLQkJc3ByaW50X3N5bWJvbChidWZmLCAodW5zaWduZWQgbG9uZyl2LT5jYWxsZXIpOwotCQlzZXFfcHV0cyhtLCBidWZmKTsKLQl9CisJaWYgKHYtPmNhbGxlcikKKwkJc2VxX3ByaW50ZihtLCAiICVwUyIsIHYtPmNhbGxlcik7CiAKIAlpZiAodi0+bnJfcGFnZXMpCiAJCXNlcV9wcmludGYobSwgIiBwYWdlcz0lZCIsIHYtPm5yX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggOWNhNTg3Yy4uOTk5OTlhOSAxMDA2NDQKLS0tIGEvbW0vdm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhY3Rpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGFjdGlvbi5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC01MSwxMSArNTMsMjMgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy92bXNjYW4uaD4KIAotZW51bSBsdW1weV9tb2RlIHsKLQlMVU1QWV9NT0RFX05PTkUsCi0JTFVNUFlfTU9ERV9BU1lOQywKLQlMVU1QWV9NT0RFX1NZTkMsCi19OworLyoKKyAqIHJlY2xhaW1fbW9kZSBkZXRlcm1pbmVzIGhvdyB0aGUgaW5hY3RpdmUgbGlzdCBpcyBzaHJ1bmsKKyAqIFJFQ0xBSU1fTU9ERV9TSU5HTEU6IFJlY2xhaW0gb25seSBvcmRlci0wIHBhZ2VzCisgKiBSRUNMQUlNX01PREVfQVNZTkM6ICBEbyBub3QgYmxvY2sKKyAqIFJFQ0xBSU1fTU9ERV9TWU5DOiAgIEFsbG93IGJsb2NraW5nIGUuZy4gY2FsbCB3YWl0X29uX3BhZ2Vfd3JpdGViYWNrCisgKiBSRUNMQUlNX01PREVfTFVNUFlSRUNMQUlNOiBGb3IgaGlnaC1vcmRlciBhbGxvY2F0aW9ucywgdGFrZSBhIHJlZmVyZW5jZQorICoJCQlwYWdlIGZyb20gdGhlIExSVSBhbmQgcmVjbGFpbSBhbGwgcGFnZXMgd2l0aGluIGEKKyAqCQkJbmF0dXJhbGx5IGFsaWduZWQgcmFuZ2UKKyAqIFJFQ0xBSU1fTU9ERV9DT01QQUNUSU9OOiBGb3IgaGlnaC1vcmRlciBhbGxvY2F0aW9ucywgcmVjbGFpbSBhIG51bWJlciBvZgorICoJCQlvcmRlci0wIHBhZ2VzIGFuZCB0aGVuIGNvbXBhY3QgdGhlIHpvbmUKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBfX2JpdHdpc2VfXyByZWNsYWltX21vZGVfdDsKKyNkZWZpbmUgUkVDTEFJTV9NT0RFX1NJTkdMRQkJKChfX2ZvcmNlIHJlY2xhaW1fbW9kZV90KTB4MDF1KQorI2RlZmluZSBSRUNMQUlNX01PREVfQVNZTkMJCSgoX19mb3JjZSByZWNsYWltX21vZGVfdCkweDAydSkKKyNkZWZpbmUgUkVDTEFJTV9NT0RFX1NZTkMJCSgoX19mb3JjZSByZWNsYWltX21vZGVfdCkweDA0dSkKKyNkZWZpbmUgUkVDTEFJTV9NT0RFX0xVTVBZUkVDTEFJTQkoKF9fZm9yY2UgcmVjbGFpbV9tb2RlX3QpMHgwOHUpCisjZGVmaW5lIFJFQ0xBSU1fTU9ERV9DT01QQUNUSU9OCQkoKF9fZm9yY2UgcmVjbGFpbV9tb2RlX3QpMHgxMHUpCiAKIHN0cnVjdCBzY2FuX2NvbnRyb2wgewogCS8qIEluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgaW5hY3RpdmUgcGFnZXMgdGhhdCB3ZXJlIHNjYW5uZWQgKi8KQEAgLTg4LDcgKzEwMiw3IEBACiAJICogSW50ZW5kIHRvIHJlY2xhaW0gZW5vdWdoIGNvbnRpbnVvdXMgbWVtb3J5IHJhdGhlciB0aGFuIHJlY2xhaW0KIAkgKiBlbm91Z2ggYW1vdW50IG9mIG1lbW9yeS4gaS5lLCBtb2RlIGZvciBoaWdoIG9yZGVyIGFsbG9jYXRpb24uCiAJICovCi0JZW51bSBsdW1weV9tb2RlIGx1bXB5X3JlY2xhaW1fbW9kZTsKKwlyZWNsYWltX21vZGVfdCByZWNsYWltX21vZGU7CiAKIAkvKiBXaGljaCBjZ3JvdXAgZG8gd2UgcmVjbGFpbSBmcm9tICovCiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXA7CkBAIC0yNzEsMzQgKzI4NSwzNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9sdW1weV9yZWNsYWltX21vZGUoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywKK3N0YXRpYyB2b2lkIHNldF9yZWNsYWltX21vZGUoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywKIAkJCQkgICBib29sIHN5bmMpCiB7Ci0JZW51bSBsdW1weV9tb2RlIG1vZGUgPSBzeW5jID8gTFVNUFlfTU9ERV9TWU5DIDogTFVNUFlfTU9ERV9BU1lOQzsKKwlyZWNsYWltX21vZGVfdCBzeW5jbW9kZSA9IHN5bmMgPyBSRUNMQUlNX01PREVfU1lOQyA6IFJFQ0xBSU1fTU9ERV9BU1lOQzsKIAogCS8qCi0JICogU29tZSByZWNsYWltIGhhdmUgYWxyZWR5IGJlZW4gZmFpbGVkLiBObyB3b3J0aCB0byB0cnkgc3luY2hyb25vdXMKLQkgKiBsdW1weSByZWNsYWltLgorCSAqIEluaXRpYWxseSBhc3N1bWUgd2UgYXJlIGVudGVyaW5nIGVpdGhlciBsdW1weSByZWNsYWltIG9yCisJICogcmVjbGFpbS9jb21wYWN0aW9uLkRlcGVuZGluZyBvbiB0aGUgb3JkZXIsIHdlIHdpbGwgZWl0aGVyIHNldCB0aGUKKwkgKiBzeW5jIG1vZGUgb3IganVzdCByZWNsYWltIG9yZGVyLTAgcGFnZXMgbGF0ZXIuCiAJICovCi0JaWYgKHN5bmMgJiYgc2MtPmx1bXB5X3JlY2xhaW1fbW9kZSA9PSBMVU1QWV9NT0RFX05PTkUpCi0JCXJldHVybjsKKwlpZiAoQ09NUEFDVElPTl9CVUlMRCkKKwkJc2MtPnJlY2xhaW1fbW9kZSA9IFJFQ0xBSU1fTU9ERV9DT01QQUNUSU9OOworCWVsc2UKKwkJc2MtPnJlY2xhaW1fbW9kZSA9IFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU07CiAKIAkvKgotCSAqIElmIHdlIG5lZWQgYSBsYXJnZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSwgb3IgaGF2ZQotCSAqIHRyb3VibGUgZ2V0dGluZyBhIHNtYWxsIHNldCBvZiBjb250aWd1b3VzIHBhZ2VzLCB3ZQotCSAqIHdpbGwgcmVjbGFpbSBib3RoIGFjdGl2ZSBhbmQgaW5hY3RpdmUgcGFnZXMuCisJICogQXZvaWQgdXNpbmcgbHVtcHkgcmVjbGFpbSBvciByZWNsYWltL2NvbXBhY3Rpb24gaWYgcG9zc2libGUgYnkKKwkgKiByZXN0cmljdGluZyB3aGVuIGl0cyBzZXQgdG8gZWl0aGVyIGNvc3RseSBhbGxvY2F0aW9ucyBvciB3aGVuCisJICogdW5kZXIgbWVtb3J5IHByZXNzdXJlCiAJICovCiAJaWYgKHNjLT5vcmRlciA+IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKQotCQlzYy0+bHVtcHlfcmVjbGFpbV9tb2RlID0gbW9kZTsKKwkJc2MtPnJlY2xhaW1fbW9kZSB8PSBzeW5jbW9kZTsKIAllbHNlIGlmIChzYy0+b3JkZXIgJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyKQotCQlzYy0+bHVtcHlfcmVjbGFpbV9tb2RlID0gbW9kZTsKKwkJc2MtPnJlY2xhaW1fbW9kZSB8PSBzeW5jbW9kZTsKIAllbHNlCi0JCXNjLT5sdW1weV9yZWNsYWltX21vZGUgPSBMVU1QWV9NT0RFX05PTkU7CisJCXNjLT5yZWNsYWltX21vZGUgPSBSRUNMQUlNX01PREVfU0lOR0xFIHwgUkVDTEFJTV9NT0RFX0FTWU5DOwogfQogCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2x1bXB5X3JlY2xhaW1fbW9kZShzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKK3N0YXRpYyB2b2lkIHJlc2V0X3JlY2xhaW1fbW9kZShzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKLQlzYy0+bHVtcHlfcmVjbGFpbV9tb2RlID0gTFVNUFlfTU9ERV9OT05FOworCXNjLT5yZWNsYWltX21vZGUgPSBSRUNMQUlNX01PREVfU0lOR0xFIHwgUkVDTEFJTV9NT0RFX0FTWU5DOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpc19wYWdlX2NhY2hlX2ZyZWVhYmxlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtNDI5LDcgKzQ0Niw3IEBACiAJCSAqIGZpcnN0IGF0dGVtcHQgdG8gZnJlZSBhIHJhbmdlIG9mIHBhZ2VzIGZhaWxzLgogCQkgKi8KIAkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkgJiYKLQkJICAgIHNjLT5sdW1weV9yZWNsYWltX21vZGUgPT0gTFVNUFlfTU9ERV9TWU5DKQorCQkgICAgKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykpCiAJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCiAJCWlmICghUGFnZVdyaXRlYmFjayhwYWdlKSkgewpAQCAtNDM3LDcgKzQ1NCw3IEBACiAJCQlDbGVhclBhZ2VSZWNsYWltKHBhZ2UpOwogCQl9CiAJCXRyYWNlX21tX3Ztc2Nhbl93cml0ZXBhZ2UocGFnZSwKLQkJCXRyYWNlX3JlY2xhaW1fZmxhZ3MocGFnZSwgc2MtPmx1bXB5X3JlY2xhaW1fbW9kZSkpOworCQkJdHJhY2VfcmVjbGFpbV9mbGFncyhwYWdlLCBzYy0+cmVjbGFpbV9tb2RlKSk7CiAJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfVk1TQ0FOX1dSSVRFKTsKIAkJcmV0dXJuIFBBR0VfU1VDQ0VTUzsKIAl9CkBAIC02MjIsNyArNjM5LDcgQEAKIAlyZWZlcmVuY2VkX3BhZ2UgPSBUZXN0Q2xlYXJQYWdlUmVmZXJlbmNlZChwYWdlKTsKIAogCS8qIEx1bXB5IHJlY2xhaW0gLSBpZ25vcmUgcmVmZXJlbmNlcyAqLwotCWlmIChzYy0+bHVtcHlfcmVjbGFpbV9tb2RlICE9IExVTVBZX01PREVfTk9ORSkKKwlpZiAoc2MtPnJlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU0pCiAJCXJldHVybiBQQUdFUkVGX1JFQ0xBSU07CiAKIAkvKgpAQCAtNzM5LDcgKzc1Niw3IEBACiAJCQkgKiBmb3IgYW55IHBhZ2UgZm9yIHdoaWNoIHdyaXRlYmFjayBoYXMgYWxyZWFkeQogCQkJICogc3RhcnRlZC4KIAkJCSAqLwotCQkJaWYgKHNjLT5sdW1weV9yZWNsYWltX21vZGUgPT0gTFVNUFlfTU9ERV9TWU5DICYmCisJCQlpZiAoKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU1lOQykgJiYKIAkJCSAgICBtYXlfZW50ZXJfZnMpCiAJCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJCWVsc2UgewpAQCAtODk1LDcgKzkxMiw3IEBACiAJCQl0cnlfdG9fZnJlZV9zd2FwKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcHV0YmFja19scnVfcGFnZShwYWdlKTsKLQkJZGlzYWJsZV9sdW1weV9yZWNsYWltX21vZGUoc2MpOworCQlyZXNldF9yZWNsYWltX21vZGUoc2MpOwogCQljb250aW51ZTsKIAogYWN0aXZhdGVfbG9ja2VkOgpAQCAtOTA4LDcgKzkyNSw3IEBACiBrZWVwX2xvY2tlZDoKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiBrZWVwOgotCQlkaXNhYmxlX2x1bXB5X3JlY2xhaW1fbW9kZShzYyk7CisJCXJlc2V0X3JlY2xhaW1fbW9kZShzYyk7CiBrZWVwX2x1bXB5OgogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmcmV0X3BhZ2VzKTsKIAkJVk1fQlVHX09OKFBhZ2VMUlUocGFnZSkgfHwgUGFnZVVuZXZpY3RhYmxlKHBhZ2UpKTsKQEAgLTEwMjgsNyArMTA0NSw3IEBACiAJCWNhc2UgMDoKIAkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBkc3QpOwogCQkJbWVtX2Nncm91cF9kZWxfbHJ1KHBhZ2UpOwotCQkJbnJfdGFrZW4rKzsKKwkJCW5yX3Rha2VuICs9IGhwYWdlX25yX3BhZ2VzKHBhZ2UpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAtRUJVU1k6CkBAIC0xMDg2LDcgKzExMDMsNyBAQAogCQkJaWYgKF9faXNvbGF0ZV9scnVfcGFnZShjdXJzb3JfcGFnZSwgbW9kZSwgZmlsZSkgPT0gMCkgewogCQkJCWxpc3RfbW92ZSgmY3Vyc29yX3BhZ2UtPmxydSwgZHN0KTsKIAkJCQltZW1fY2dyb3VwX2RlbF9scnUoY3Vyc29yX3BhZ2UpOwotCQkJCW5yX3Rha2VuKys7CisJCQkJbnJfdGFrZW4gKz0gaHBhZ2VfbnJfcGFnZXMocGFnZSk7CiAJCQkJbnJfbHVtcHlfdGFrZW4rKzsKIAkJCQlpZiAoUGFnZURpcnR5KGN1cnNvcl9wYWdlKSkKIAkJCQkJbnJfbHVtcHlfZGlydHkrKzsKQEAgLTExNDEsMTQgKzExNTgsMTUgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgcGFnZV9saXN0LCBscnUpIHsKKwkJaW50IG51bXBhZ2VzID0gaHBhZ2VfbnJfcGFnZXMocGFnZSk7CiAJCWxydSA9IHBhZ2VfbHJ1X2Jhc2VfdHlwZShwYWdlKTsKIAkJaWYgKFBhZ2VBY3RpdmUocGFnZSkpIHsKIAkJCWxydSArPSBMUlVfQUNUSVZFOwogCQkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOwotCQkJbnJfYWN0aXZlKys7CisJCQlucl9hY3RpdmUgKz0gbnVtcGFnZXM7CiAJCX0KIAkJaWYgKGNvdW50KQotCQkJY291bnRbbHJ1XSsrOworCQkJY291bnRbbHJ1XSArPSBudW1wYWdlczsKIAl9CiAKIAlyZXR1cm4gbnJfYWN0aXZlOwpAQCAtMTI1MywxMyArMTI3MSwxNiBAQAogCQkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCQkJY29udGludWU7CiAJCX0KLQkJU2V0UGFnZUxSVShwYWdlKTsKIAkJbHJ1ID0gcGFnZV9scnUocGFnZSk7Ci0JCWFkZF9wYWdlX3RvX2xydV9saXN0KHpvbmUsIHBhZ2UsIGxydSk7CiAJCWlmIChpc19hY3RpdmVfbHJ1KGxydSkpIHsKIAkJCWludCBmaWxlID0gaXNfZmlsZV9scnUobHJ1KTsKLQkJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbZmlsZV0rKzsKKwkJCWludCBudW1wYWdlcyA9IGhwYWdlX25yX3BhZ2VzKHBhZ2UpOworCQkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFtmaWxlXSArPSBudW1wYWdlczsKKwkJCWlmIChwdXRiYWNrX2FjdGl2ZV9scnVfcGFnZSh6b25lLCBwYWdlKSkKKwkJCQljb250aW51ZTsKIAkJfQorCQlTZXRQYWdlTFJVKHBhZ2UpOworCQlhZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlLCBscnUpOwogCQlpZiAoIXBhZ2V2ZWNfYWRkKCZwdmVjLCBwYWdlKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJCQlfX3BhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CkBAIC0xMzI0LDcgKzEzNDUsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBPbmx5IHN0YWxsIG9uIGx1bXB5IHJlY2xhaW0gKi8KLQlpZiAoc2MtPmx1bXB5X3JlY2xhaW1fbW9kZSA9PSBMVU1QWV9NT0RFX05PTkUpCisJaWYgKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfU0lOR0xFKQogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBJZiB3ZSBoYXZlIHJlbGFpbWVkIGV2ZXJ5dGhpbmcgb24gdGhlIGlzb2xhdGVkIGxpc3QsIG5vIHN0YWxsICovCkBAIC0xMzY4LDE1ICsxMzg5LDE1IEBACiAJCQlyZXR1cm4gU1dBUF9DTFVTVEVSX01BWDsKIAl9CiAKLQlzZXRfbHVtcHlfcmVjbGFpbV9tb2RlKHByaW9yaXR5LCBzYywgZmFsc2UpOworCXNldF9yZWNsYWltX21vZGUocHJpb3JpdHksIHNjLCBmYWxzZSk7CiAJbHJ1X2FkZF9kcmFpbigpOwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAogCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQlucl90YWtlbiA9IGlzb2xhdGVfcGFnZXNfZ2xvYmFsKG5yX3RvX3NjYW4sCiAJCQkmcGFnZV9saXN0LCAmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLAotCQkJc2MtPmx1bXB5X3JlY2xhaW1fbW9kZSA9PSBMVU1QWV9NT0RFX05PTkUgPwotCQkJCQlJU09MQVRFX0lOQUNUSVZFIDogSVNPTEFURV9CT1RILAorCQkJc2MtPnJlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU0gPworCQkJCQlJU09MQVRFX0JPVEggOiBJU09MQVRFX0lOQUNUSVZFLAogCQkJem9uZSwgMCwgZmlsZSk7CiAJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gbnJfc2Nhbm5lZDsKIAkJaWYgKGN1cnJlbnRfaXNfa3N3YXBkKCkpCkBAIC0xMzg4LDggKzE0MDksOCBAQAogCX0gZWxzZSB7CiAJCW5yX3Rha2VuID0gbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKG5yX3RvX3NjYW4sCiAJCQkmcGFnZV9saXN0LCAmbnJfc2Nhbm5lZCwgc2MtPm9yZGVyLAotCQkJc2MtPmx1bXB5X3JlY2xhaW1fbW9kZSA9PSBMVU1QWV9NT0RFX05PTkUgPwotCQkJCQlJU09MQVRFX0lOQUNUSVZFIDogSVNPTEFURV9CT1RILAorCQkJc2MtPnJlY2xhaW1fbW9kZSAmIFJFQ0xBSU1fTU9ERV9MVU1QWVJFQ0xBSU0gPworCQkJCQlJU09MQVRFX0JPVEggOiBJU09MQVRFX0lOQUNUSVZFLAogCQkJem9uZSwgc2MtPm1lbV9jZ3JvdXAsCiAJCQkwLCBmaWxlKTsKIAkJLyoKQEAgLTE0MTEsNyArMTQzMiw3IEBACiAKIAkvKiBDaGVjayBpZiB3ZSBzaG91bGQgc3luY3Jvbm91c2x5IHdhaXQgZm9yIHdyaXRlYmFjayAqLwogCWlmIChzaG91bGRfcmVjbGFpbV9zdGFsbChucl90YWtlbiwgbnJfcmVjbGFpbWVkLCBwcmlvcml0eSwgc2MpKSB7Ci0JCXNldF9sdW1weV9yZWNsYWltX21vZGUocHJpb3JpdHksIHNjLCB0cnVlKTsKKwkJc2V0X3JlY2xhaW1fbW9kZShwcmlvcml0eSwgc2MsIHRydWUpOwogCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3BhZ2VfbGlzdCgmcGFnZV9saXN0LCB6b25lLCBzYyk7CiAJfQogCkBAIC0xNDI2LDcgKzE0NDcsNyBAQAogCQl6b25lX2lkeCh6b25lKSwKIAkJbnJfc2Nhbm5lZCwgbnJfcmVjbGFpbWVkLAogCQlwcmlvcml0eSwKLQkJdHJhY2Vfc2hyaW5rX2ZsYWdzKGZpbGUsIHNjLT5sdW1weV9yZWNsYWltX21vZGUpKTsKKwkJdHJhY2Vfc2hyaW5rX2ZsYWdzKGZpbGUsIHNjLT5yZWNsYWltX21vZGUpKTsKIAlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogCkBAIC0xNDY2LDcgKzE0ODcsNyBAQAogCiAJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmem9uZS0+bHJ1W2xydV0ubGlzdCk7CiAJCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIGxydSk7Ci0JCXBnbW92ZWQrKzsKKwkJcGdtb3ZlZCArPSBocGFnZV9ucl9wYWdlcyhwYWdlKTsKIAogCQlpZiAoIXBhZ2V2ZWNfYWRkKCZwdmVjLCBwYWdlKSB8fCBsaXN0X2VtcHR5KGxpc3QpKSB7CiAJCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTE1MzQsNyArMTU1NSw3IEBACiAJCX0KIAogCQlpZiAocGFnZV9yZWZlcmVuY2VkKHBhZ2UsIDAsIHNjLT5tZW1fY2dyb3VwLCAmdm1fZmxhZ3MpKSB7Ci0JCQlucl9yb3RhdGVkKys7CisJCQlucl9yb3RhdGVkICs9IGhwYWdlX25yX3BhZ2VzKHBhZ2UpOwogCQkJLyoKIAkJCSAqIElkZW50aWZ5IHJlZmVyZW5jZWQsIGZpbGUtYmFja2VkIGFjdGl2ZSBwYWdlcyBhbmQKIAkJCSAqIGdpdmUgdGhlbSBvbmUgbW9yZSB0cmlwIGFyb3VuZCB0aGUgYWN0aXZlIGxpc3QuIFNvCkBAIC0xODA1LDYgKzE4MjYsNTcgQEAKIH0KIAogLyoKKyAqIFJlY2xhaW0vY29tcGFjdGlvbiBkZXBlbmRzIG9uIGEgbnVtYmVyIG9mIHBhZ2VzIGJlaW5nIGZyZWVkLiBUbyBhdm9pZAorICogZGlzcnVwdGlvbiB0byB0aGUgc3lzdGVtLCBhIHNtYWxsIG51bWJlciBvZiBvcmRlci0wIHBhZ2VzIGNvbnRpbnVlIHRvIGJlCisgKiByb3RhdGVkIGFuZCByZWNsYWltZWQgaW4gdGhlIG5vcm1hbCBmYXNoaW9uLiBIb3dldmVyLCBieSB0aGUgdGltZSB3ZSBnZXQKKyAqIGJhY2sgdG8gdGhlIGFsbG9jYXRvciBhbmQgY2FsbCB0cnlfdG9fY29tcGFjdF96b25lKCksIHdlIGVuc3VyZSB0aGF0CisgKiB0aGVyZSBhcmUgZW5vdWdoIGZyZWUgcGFnZXMgZm9yIGl0IHRvIGJlIGxpa2VseSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRfY29udGludWVfcmVjbGFpbShzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZCwKKwkJCQkJc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCit7CisJdW5zaWduZWQgbG9uZyBwYWdlc19mb3JfY29tcGFjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlX2xydV9wYWdlczsKKworCS8qIElmIG5vdCBpbiByZWNsYWltL2NvbXBhY3Rpb24gbW9kZSwgc3RvcCAqLworCWlmICghKHNjLT5yZWNsYWltX21vZGUgJiBSRUNMQUlNX01PREVfQ09NUEFDVElPTikpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogSWYgd2UgZmFpbGVkIHRvIHJlY2xhaW0gYW5kIGhhdmUgc2Nhbm5lZCB0aGUgZnVsbCBsaXN0LCBzdG9wLgorCSAqIE5PVEU6IENoZWNraW5nIGp1c3QgbnJfcmVjbGFpbWVkIHdvdWxkIGV4aXQgcmVjbGFpbS9jb21wYWN0aW9uIGZhcgorCSAqICAgICAgIGZhc3RlciBidXQgb2J2aW91c2x5IHdvdWxkIGJlIGxlc3MgbGlrZWx5IHRvIHN1Y2NlZWQKKwkgKiAgICAgICBhbGxvY2F0aW9uLiBJZiB0aGlzIGlzIGRlc2lyYWJsZSwgdXNlIEdGUF9SRVBFQVQgdG8gZGVjaWRlCisJICogICAgICAgaWYgYm90aCByZWNsYWltZWQgYW5kIHNjYW5uZWQgc2hvdWxkIGJlIGNoZWNrZWQgb3IganVzdAorCSAqICAgICAgIHJlY2xhaW1lZAorCSAqLworCWlmICghbnJfcmVjbGFpbWVkICYmICFucl9zY2FubmVkKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbm90IHJlY2xhaW1lZCBlbm91Z2ggcGFnZXMgZm9yIGNvbXBhY3Rpb24gYW5kIHRoZQorCSAqIGluYWN0aXZlIGxpc3RzIGFyZSBsYXJnZSBlbm91Z2gsIGNvbnRpbnVlIHJlY2xhaW1pbmcKKwkgKi8KKwlwYWdlc19mb3JfY29tcGFjdGlvbiA9ICgyVUwgPDwgc2MtPm9yZGVyKTsKKwlpbmFjdGl2ZV9scnVfcGFnZXMgPSB6b25lX25yX2xydV9wYWdlcyh6b25lLCBzYywgTFJVX0lOQUNUSVZFX0FOT04pICsKKwkJCQl6b25lX25yX2xydV9wYWdlcyh6b25lLCBzYywgTFJVX0lOQUNUSVZFX0ZJTEUpOworCWlmIChzYy0+bnJfcmVjbGFpbWVkIDwgcGFnZXNfZm9yX2NvbXBhY3Rpb24gJiYKKwkJCWluYWN0aXZlX2xydV9wYWdlcyA+IHBhZ2VzX2Zvcl9jb21wYWN0aW9uKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElmIGNvbXBhY3Rpb24gd291bGQgZ28gYWhlYWQgb3IgdGhlIGFsbG9jYXRpb24gd291bGQgc3VjY2VlZCwgc3RvcCAqLworCXN3aXRjaCAoY29tcGFjdGlvbl9zdWl0YWJsZSh6b25lLCBzYy0+b3JkZXIpKSB7CisJY2FzZSBDT01QQUNUX1BBUlRJQUw6CisJY2FzZSBDT01QQUNUX0NPTlRJTlVFOgorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCisvKgogICogVGhpcyBpcyBhIGJhc2ljIHBlci16b25lIHBhZ2UgZnJlZXIuICBVc2VkIGJ5IGJvdGgga3N3YXBkIGFuZCBkaXJlY3QgcmVjbGFpbS4KICAqLwogc3RhdGljIHZvaWQgc2hyaW5rX3pvbmUoaW50IHByaW9yaXR5LCBzdHJ1Y3Qgem9uZSAqem9uZSwKQEAgLTE4MTMsOSArMTg4NSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgbnJbTlJfTFJVX0xJU1RTXTsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW47CiAJZW51bSBscnVfbGlzdCBsOwotCXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkID0gc2MtPm5yX3JlY2xhaW1lZDsKKwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDsKIAl1bnNpZ25lZCBsb25nIG5yX3RvX3JlY2xhaW0gPSBzYy0+bnJfdG9fcmVjbGFpbTsKKwl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQgPSBzYy0+bnJfc2Nhbm5lZDsKIAorcmVzdGFydDoKKwlucl9yZWNsYWltZWQgPSAwOwogCWdldF9zY2FuX2NvdW50KHpvbmUsIHNjLCBuciwgcHJpb3JpdHkpOwogCiAJd2hpbGUgKG5yW0xSVV9JTkFDVElWRV9BTk9OXSB8fCBucltMUlVfQUNUSVZFX0ZJTEVdIHx8CkBAIC0xODQxLDggKzE5MTYsNyBAQAogCQlpZiAobnJfcmVjbGFpbWVkID49IG5yX3RvX3JlY2xhaW0gJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkpCiAJCQlicmVhazsKIAl9Ci0KLQlzYy0+bnJfcmVjbGFpbWVkID0gbnJfcmVjbGFpbWVkOworCXNjLT5ucl9yZWNsYWltZWQgKz0gbnJfcmVjbGFpbWVkOwogCiAJLyoKIAkgKiBFdmVuIGlmIHdlIGRpZCBub3QgdHJ5IHRvIGV2aWN0IGFub24gcGFnZXMgYXQgYWxsLCB3ZSB3YW50IHRvCkBAIC0xODUxLDYgKzE5MjUsMTEgQEAKIAlpZiAoaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSwgc2MpKQogCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwgc2MsIHByaW9yaXR5LCAwKTsKIAorCS8qIHJlY2xhaW0vY29tcGFjdGlvbiBtaWdodCBuZWVkIHJlY2xhaW0gdG8gY29udGludWUgKi8KKwlpZiAoc2hvdWxkX2NvbnRpbnVlX3JlY2xhaW0oem9uZSwgbnJfcmVjbGFpbWVkLAorCQkJCQlzYy0+bnJfc2Nhbm5lZCAtIG5yX3NjYW5uZWQsIHNjKSkKKwkJZ290byByZXN0YXJ0OworCiAJdGhyb3R0bGVfdm1fd3JpdGVvdXQoc2MtPmdmcF9tYXNrKTsKIH0KIApAQCAtMjEyNCwzOCArMjIwMyw4NyBAQAogfQogI2VuZGlmCiAKKy8qCisgKiBwZ2RhdF9iYWxhbmNlZCBpcyB1c2VkIHdoZW4gY2hlY2tpbmcgaWYgYSBub2RlIGlzIGJhbGFuY2VkIGZvciBoaWdoLW9yZGVyCisgKiBhbGxvY2F0aW9ucy4gT25seSB6b25lcyB0aGF0IG1lZXQgd2F0ZXJtYXJrcyBhbmQgYXJlIGluIGEgem9uZSBhbGxvd2VkCisgKiBieSB0aGUgY2FsbGVycyBjbGFzc3pvbmVfaWR4IGFyZSBhZGRlZCB0byBiYWxhbmNlZF9wYWdlcy4gVGhlIHRvdGFsIG9mCisgKiBiYWxhbmNlZCBwYWdlcyBtdXN0IGJlIGF0IGxlYXN0IDI1JSBvZiB0aGUgem9uZXMgYWxsb3dlZCBieSBjbGFzc3pvbmVfaWR4CisgKiBmb3IgdGhlIG5vZGUgdG8gYmUgY29uc2lkZXJlZCBiYWxhbmNlZC4gRm9yY2luZyBhbGwgem9uZXMgdG8gYmUgYmFsYW5jZWQKKyAqIGZvciBoaWdoIG9yZGVycyBjYW4gY2F1c2UgZXhjZXNzaXZlIHJlY2xhaW0gd2hlbiB0aGVyZSBhcmUgaW1iYWxhbmNlZCB6b25lcy4KKyAqIFRoZSBjaG9pY2Ugb2YgMjUlIGlzIGR1ZSB0bworICogICBvIGEgMTZNIERNQSB6b25lIHRoYXQgaXMgYmFsYW5jZWQgd2lsbCBub3QgYmFsYW5jZSBhIHpvbmUgb24gYW55CisgKiAgICAgcmVhc29uYWJsZSBzaXplZCBtYWNoaW5lCisgKiAgIG8gT24gYWxsIG90aGVyIG1hY2hpbmVzLCB0aGUgdG9wIHpvbmUgbXVzdCBiZSBhdCBsZWFzdCBhIHJlYXNvbmFibGUKKyAqICAgICBwcmVjZW50YWdlIG9mIHRoZSBtaWRkbGUgem9uZXMuIEZvciBleGFtcGxlLCBvbiAzMi1iaXQgeDg2LCBoaWdobWVtCisgKiAgICAgd291bGQgbmVlZCB0byBiZSBhdCBsZWFzdCAyNTZNIGZvciBpdCB0byBiZSBiYWxhbmNlIGEgd2hvbGUgbm9kZS4KKyAqICAgICBTaW1pbGFybHksIG9uIHg4Ni02NCB0aGUgTm9ybWFsIHpvbmUgd291bGQgbmVlZCB0byBiZSBhdCBsZWFzdCAxRworICogICAgIHRvIGJhbGFuY2UgYSBub2RlIG9uIGl0cyBvd24uIFRoZXNlIHNlZW1lZCBsaWtlIHJlYXNvbmFibGUgcmF0aW9zLgorICovCitzdGF0aWMgYm9vbCBwZ2RhdF9iYWxhbmNlZChwZ19kYXRhX3QgKnBnZGF0LCB1bnNpZ25lZCBsb25nIGJhbGFuY2VkX3BhZ2VzLAorCQkJCQkJaW50IGNsYXNzem9uZV9pZHgpCit7CisJdW5zaWduZWQgbG9uZyBwcmVzZW50X3BhZ2VzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gY2xhc3N6b25lX2lkeDsgaSsrKQorCQlwcmVzZW50X3BhZ2VzICs9IHBnZGF0LT5ub2RlX3pvbmVzW2ldLnByZXNlbnRfcGFnZXM7CisKKwlyZXR1cm4gYmFsYW5jZWRfcGFnZXMgPiAocHJlc2VudF9wYWdlcyA+PiAyKTsKK30KKwogLyogaXMga3N3YXBkIHNsZWVwaW5nIHByZW1hdHVyZWx5PyAqLwotc3RhdGljIGludCBzbGVlcGluZ19wcmVtYXR1cmVseShwZ19kYXRhX3QgKnBnZGF0LCBpbnQgb3JkZXIsIGxvbmcgcmVtYWluaW5nKQorc3RhdGljIGJvb2wgc2xlZXBpbmdfcHJlbWF0dXJlbHkocGdfZGF0YV90ICpwZ2RhdCwgaW50IG9yZGVyLCBsb25nIHJlbWFpbmluZywKKwkJCQkJaW50IGNsYXNzem9uZV9pZHgpCiB7CiAJaW50IGk7CisJdW5zaWduZWQgbG9uZyBiYWxhbmNlZCA9IDA7CisJYm9vbCBhbGxfem9uZXNfb2sgPSB0cnVlOwogCiAJLyogSWYgYSBkaXJlY3QgcmVjbGFpbWVyIHdva2Uga3N3YXBkIHdpdGhpbiBIWi8xMCwgaXQncyBwcmVtYXR1cmUgKi8KIAlpZiAocmVtYWluaW5nKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKLQkvKiBJZiBhZnRlciBIWi8xMCwgYSB6b25lIGlzIGJlbG93IHRoZSBoaWdoIG1hcmssIGl0J3MgcHJlbWF0dXJlICovCisJLyogQ2hlY2sgdGhlIHdhdGVybWFyayBsZXZlbHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGdkYXQtPm5yX3pvbmVzOyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAKIAkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSkKKwkJLyoKKwkJICogYmFsYW5jZV9wZ2RhdCgpIHNraXBzIG92ZXIgYWxsX3VucmVjbGFpbWFibGUgYWZ0ZXIKKwkJICogREVGX1BSSU9SSVRZLiBFZmZlY3RpdmVseSwgaXQgY29uc2lkZXJzIHRoZW0gYmFsYW5jZWQgc28KKwkJICogdGhleSBtdXN0IGJlIGNvbnNpZGVyZWQgYmFsYW5jZWQgaGVyZSBhcyB3ZWxsIGlmIGtzd2FwZAorCQkgKiBpcyB0byBzbGVlcAorCQkgKi8KKwkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlKSB7CisJCQliYWxhbmNlZCArPSB6b25lLT5wcmVzZW50X3BhZ2VzOwogCQkJY29udGludWU7CisJCX0KIAotCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLAotCQkJCQkJCQkwLCAwKSkKLQkJCXJldHVybiAxOworCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsIGhpZ2hfd21hcmtfcGFnZXMoem9uZSksCisJCQkJCQkJY2xhc3N6b25lX2lkeCwgMCkpCisJCQlhbGxfem9uZXNfb2sgPSBmYWxzZTsKKwkJZWxzZQorCQkJYmFsYW5jZWQgKz0gem9uZS0+cHJlc2VudF9wYWdlczsKIAl9CiAKLQlyZXR1cm4gMDsKKwkvKgorCSAqIEZvciBoaWdoLW9yZGVyIHJlcXVlc3RzLCB0aGUgYmFsYW5jZWQgem9uZXMgbXVzdCBjb250YWluIGF0IGxlYXN0CisJICogMjUlIG9mIHRoZSBub2RlcyBwYWdlcyBmb3Iga3N3YXBkIHRvIHNsZWVwLiBGb3Igb3JkZXItMCwgYWxsIHpvbmVzCisJICogbXVzdCBiZSBiYWxhbmNlZAorCSAqLworCWlmIChvcmRlcikKKwkJcmV0dXJuIHBnZGF0X2JhbGFuY2VkKHBnZGF0LCBiYWxhbmNlZCwgY2xhc3N6b25lX2lkeCk7CisJZWxzZQorCQlyZXR1cm4gIWFsbF96b25lc19vazsKIH0KIAogLyoKICAqIEZvciBrc3dhcGQsIGJhbGFuY2VfcGdkYXQoKSB3aWxsIHdvcmsgYWNyb3NzIGFsbCB0aGlzIG5vZGUncyB6b25lcyB1bnRpbAogICogdGhleSBhcmUgYWxsIGF0IGhpZ2hfd21hcmtfcGFnZXMoem9uZSkuCiAgKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIHdlcmUgYWN0dWFsbHkgZnJlZWQuCisgKiBSZXR1cm5zIHRoZSBmaW5hbCBvcmRlciBrc3dhcGQgd2FzIHJlY2xhaW1pbmcgYXQKICAqCiAgKiBUaGVyZSBpcyBzcGVjaWFsIGhhbmRsaW5nIGhlcmUgZm9yIHpvbmVzIHdoaWNoIGFyZSBmdWxsIG9mIHBpbm5lZCBwYWdlcy4KICAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcGFnZXMgYXJlIGFsbCBtbG9ja2VkLCBvciBpZiB0aGV5IGFyZSBhbGwgdXNlZCBieQpAQCAtMjE3MiwxMSArMjMwMCwxNCBAQAogICogaW50ZXJvcGVyYXRlcyB3aXRoIHRoZSBwYWdlIGFsbG9jYXRvciBmYWxsYmFjayBzY2hlbWUgdG8gZW5zdXJlIHRoYXQgYWdpbmcKICAqIG9mIHBhZ2VzIGlzIGJhbGFuY2VkIGFjcm9zcyB0aGUgem9uZXMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJhbGFuY2VfcGdkYXQocGdfZGF0YV90ICpwZ2RhdCwgaW50IG9yZGVyKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFsYW5jZV9wZ2RhdChwZ19kYXRhX3QgKnBnZGF0LCBpbnQgb3JkZXIsCisJCQkJCQkJaW50ICpjbGFzc3pvbmVfaWR4KQogewogCWludCBhbGxfem9uZXNfb2s7CisJdW5zaWduZWQgbG9uZyBiYWxhbmNlZDsKIAlpbnQgcHJpb3JpdHk7CiAJaW50IGk7CisJaW50IGVuZF96b25lID0gMDsJLyogSW5jbHVzaXZlLiAgMCA9IFpPTkVfRE1BICovCiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FubmVkOwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlID0gY3VycmVudC0+cmVjbGFpbV9zdGF0ZTsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewpAQCAtMjE5OSw3ICsyMzMwLDYgQEAKIAljb3VudF92bV9ldmVudChQQUdFT1VUUlVOKTsKIAogCWZvciAocHJpb3JpdHkgPSBERUZfUFJJT1JJVFk7IHByaW9yaXR5ID49IDA7IHByaW9yaXR5LS0pIHsKLQkJaW50IGVuZF96b25lID0gMDsJLyogSW5jbHVzaXZlLiAgMCA9IFpPTkVfRE1BICovCiAJCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzID0gMDsKIAkJaW50IGhhc191bmRlcl9taW5fd2F0ZXJtYXJrX3pvbmUgPSAwOwogCkBAIC0yMjA4LDYgKzIzMzgsNyBAQAogCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7CiAKIAkJYWxsX3pvbmVzX29rID0gMTsKKwkJYmFsYW5jZWQgPSAwOwogCiAJCS8qCiAJCSAqIFNjYW4gaW4gdGhlIGhpZ2htZW0tPmRtYSBkaXJlY3Rpb24gZm9yIHRoZSBoaWdoZXN0CkBAIC0yMjMwLDkgKzIzNjEsMTAgQEAKIAkJCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwKIAkJCQkJCQkmc2MsIHByaW9yaXR5LCAwKTsKIAotCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwKKwkJCWlmICghem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwKIAkJCQkJaGlnaF93bWFya19wYWdlcyh6b25lKSwgMCwgMCkpIHsKIAkJCQllbmRfem9uZSA9IGk7CisJCQkJKmNsYXNzem9uZV9pZHggPSBpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yMjU1LDYgKzIzODcsNyBAQAogCQkgKiBjYXVzZSB0b28gbXVjaCBzY2FubmluZyBvZiB0aGUgbG93ZXIgem9uZXMuCiAJCSAqLwogCQlmb3IgKGkgPSAwOyBpIDw9IGVuZF96b25lOyBpKyspIHsKKwkJCWludCBjb21wYWN0aW9uOwogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAJCQlpbnQgbnJfc2xhYjsKIApAQCAtMjI3Niw3ICsyNDA5LDcgQEAKIAkJCSAqIFdlIHB1dCBlcXVhbCBwcmVzc3VyZSBvbiBldmVyeSB6b25lLCB1bmxlc3Mgb25lCiAJCQkgKiB6b25lIGhhcyB3YXkgdG9vIG1hbnkgcGFnZXMgZnJlZSBhbHJlYWR5LgogCQkJICovCi0JCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLAorCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQk4KmhpZ2hfd21hcmtfcGFnZXMoem9uZSksIGVuZF96b25lLCAwKSkKIAkJCQlzaHJpbmtfem9uZShwcmlvcml0eSwgem9uZSwgJnNjKTsKIAkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKQEAgLTIyODQsOSArMjQxNywyNiBAQAogCQkJCQkJbHJ1X3BhZ2VzKTsKIAkJCXNjLm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKIAkJCXRvdGFsX3NjYW5uZWQgKz0gc2MubnJfc2Nhbm5lZDsKKworCQkJY29tcGFjdGlvbiA9IDA7CisJCQlpZiAob3JkZXIgJiYKKwkJCSAgICB6b25lX3dhdGVybWFya19vayh6b25lLCAwLAorCQkJCQkgICAgICAgaGlnaF93bWFya19wYWdlcyh6b25lKSwKKwkJCQkJICAgICAgZW5kX3pvbmUsIDApICYmCisJCQkgICAgIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLAorCQkJCQkgICAgICAgaGlnaF93bWFya19wYWdlcyh6b25lKSwKKwkJCQkJICAgICAgIGVuZF96b25lLCAwKSkgeworCQkJCWNvbXBhY3Rfem9uZV9vcmRlcih6b25lLAorCQkJCQkJICAgb3JkZXIsCisJCQkJCQkgICBzYy5nZnBfbWFzaywgZmFsc2UsCisJCQkJCQkgICBDT01QQUNUX01PREVfS1NXQVBEKTsKKwkJCQljb21wYWN0aW9uID0gMTsKKwkJCX0KKwogCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5yX3NsYWIgPT0gMCAmJiAhem9uZV9yZWNsYWltYWJsZSh6b25lKSkKKwkJCWlmICghY29tcGFjdGlvbiAmJiBucl9zbGFiID09IDAgJiYKKwkJCSAgICAhem9uZV9yZWNsYWltYWJsZSh6b25lKSkKIAkJCQl6b25lLT5hbGxfdW5yZWNsYWltYWJsZSA9IDE7CiAJCQkvKgogCQkJICogSWYgd2UndmUgZG9uZSBhIGRlY2VudCBhbW91bnQgb2Ygc2Nhbm5pbmcgYW5kCkBAIC0yMjk3LDcgKzI0NDcsNyBAQAogCQkJICAgIHRvdGFsX3NjYW5uZWQgPiBzYy5ucl9yZWNsYWltZWQgKyBzYy5ucl9yZWNsYWltZWQgLyAyKQogCQkJCXNjLm1heV93cml0ZXBhZ2UgPSAxOwogCi0JCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLAorCQkJaWYgKCF6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLAogCQkJCQloaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCBlbmRfem9uZSwgMCkpIHsKIAkJCQlhbGxfem9uZXNfb2sgPSAwOwogCQkJCS8qCkBAIC0yMzA1LDcgKzI0NTUsNyBAQAogCQkJCSAqIG1lYW5zIHRoYXQgd2UgaGF2ZSBhIEdGUF9BVE9NSUMgYWxsb2NhdGlvbgogCQkJCSAqIGZhaWx1cmUgcmlzay4gSHVycnkgdXAhCiAJCQkJICovCi0JCQkJaWYgKCF6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwKKwkJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsCiAJCQkJCSAgICBtaW5fd21hcmtfcGFnZXMoem9uZSksIGVuZF96b25lLCAwKSkKIAkJCQkJaGFzX3VuZGVyX21pbl93YXRlcm1hcmtfem9uZSA9IDE7CiAJCQl9IGVsc2UgewpAQCAtMjMxNywxMCArMjQ2NywxMiBAQAogCQkJCSAqIHNwZWN0dWxhdGl2ZWx5IGF2b2lkIGNvbmdlc3Rpb24gd2FpdHMKIAkJCQkgKi8KIAkJCQl6b25lX2NsZWFyX2ZsYWcoem9uZSwgWk9ORV9DT05HRVNURUQpOworCQkJCWlmIChpIDw9ICpjbGFzc3pvbmVfaWR4KQorCQkJCQliYWxhbmNlZCArPSB6b25lLT5wcmVzZW50X3BhZ2VzOwogCQkJfQogCiAJCX0KLQkJaWYgKGFsbF96b25lc19vaykKKwkJaWYgKGFsbF96b25lc19vayB8fCAob3JkZXIgJiYgcGdkYXRfYmFsYW5jZWQocGdkYXQsIGJhbGFuY2VkLCAqY2xhc3N6b25lX2lkeCkpKQogCQkJYnJlYWs7CQkvKiBrc3dhcGQ6IGFsbCBkb25lICovCiAJCS8qCiAJCSAqIE9LLCBrc3dhcGQgaXMgZ2V0dGluZyBpbnRvIHRyb3VibGUuICBUYWtlIGEgbmFwLCB0aGVuIHRha2UKQEAgLTIzNDMsNyArMjQ5NSwxMyBAQAogCQkJYnJlYWs7CiAJfQogb3V0OgotCWlmICghYWxsX3pvbmVzX29rKSB7CisKKwkvKgorCSAqIG9yZGVyLTA6IEFsbCB6b25lcyBtdXN0IG1lZXQgaGlnaCB3YXRlcm1hcmsgZm9yIGEgYmFsYW5jZWQgbm9kZQorCSAqIGhpZ2gtb3JkZXI6IEJhbGFuY2VkIHpvbmVzIG11c3QgbWFrZSB1cCBhdCBsZWFzdCAyNSUgb2YgdGhlIG5vZGUKKwkgKiAgICAgICAgICAgICBmb3IgdGhlIG5vZGUgdG8gYmUgYmFsYW5jZWQKKwkgKi8KKwlpZiAoIShhbGxfem9uZXNfb2sgfHwgKG9yZGVyICYmIHBnZGF0X2JhbGFuY2VkKHBnZGF0LCBiYWxhbmNlZCwgKmNsYXNzem9uZV9pZHgpKSkpIHsKIAkJY29uZF9yZXNjaGVkKCk7CiAKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpAQCAtMjM2OCw3ICsyNTI2LDg4IEBACiAJCWdvdG8gbG9vcF9hZ2FpbjsKIAl9CiAKLQlyZXR1cm4gc2MubnJfcmVjbGFpbWVkOworCS8qCisJICogSWYga3N3YXBkIHdhcyByZWNsYWltaW5nIGF0IGEgaGlnaGVyIG9yZGVyLCBpdCBoYXMgdGhlIG9wdGlvbiBvZgorCSAqIHNsZWVwaW5nIHdpdGhvdXQgYWxsIHpvbmVzIGJlaW5nIGJhbGFuY2VkLiBCZWZvcmUgaXQgZG9lcywgaXQgbXVzdAorCSAqIGVuc3VyZSB0aGF0IHRoZSB3YXRlcm1hcmtzIGZvciBvcmRlci0wIG9uICphbGwqIHpvbmVzIGFyZSBtZXQgYW5kCisJICogdGhhdCB0aGUgY29uZ2VzdGlvbiBmbGFncyBhcmUgY2xlYXJlZC4gVGhlIGNvbmdlc3Rpb24gZmxhZyBtdXN0CisJICogYmUgY2xlYXJlZCBhcyBrc3dhcGQgaXMgdGhlIG9ubHkgbWVjaGFuaXNtIHRoYXQgY2xlYXJzIHRoZSBmbGFnCisJICogYW5kIGl0IGlzIHBvdGVudGlhbGx5IGdvaW5nIHRvIHNsZWVwIGhlcmUuCisJICovCisJaWYgKG9yZGVyKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gZW5kX3pvbmU7IGkrKykgeworCQkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CisKKwkJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCQkJY29udGludWU7CisKKwkJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBwcmlvcml0eSAhPSBERUZfUFJJT1JJVFkpCisJCQkJY29udGludWU7CisKKwkJCS8qIENvbmZpcm0gdGhlIHpvbmUgaXMgYmFsYW5jZWQgZm9yIG9yZGVyLTAgKi8KKwkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgMCwKKwkJCQkJaGlnaF93bWFya19wYWdlcyh6b25lKSwgMCwgMCkpIHsKKwkJCQlvcmRlciA9IHNjLm9yZGVyID0gMDsKKwkJCQlnb3RvIGxvb3BfYWdhaW47CisJCQl9CisKKwkJCS8qIElmIGJhbGFuY2VkLCBjbGVhciB0aGUgY29uZ2VzdGVkIGZsYWcgKi8KKwkJCXpvbmVfY2xlYXJfZmxhZyh6b25lLCBaT05FX0NPTkdFU1RFRCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgb3JkZXIgd2Ugd2VyZSByZWNsYWltaW5nIGF0IHNvIHNsZWVwaW5nX3ByZW1hdHVyZWx5KCkKKwkgKiBtYWtlcyBhIGRlY2lzaW9uIG9uIHRoZSBvcmRlciB3ZSB3ZXJlIGxhc3QgcmVjbGFpbWluZyBhdC4gSG93ZXZlciwKKwkgKiBpZiBhbm90aGVyIGNhbGxlciBlbnRlcmVkIHRoZSBhbGxvY2F0b3Igc2xvdyBwYXRoIHdoaWxlIGtzd2FwZAorCSAqIHdhcyBhd2FrZSwgb3JkZXIgd2lsbCByZW1haW4gYXQgdGhlIGhpZ2hlciBsZXZlbAorCSAqLworCSpjbGFzc3pvbmVfaWR4ID0gZW5kX3pvbmU7CisJcmV0dXJuIG9yZGVyOworfQorCitzdGF0aWMgdm9pZCBrc3dhcGRfdHJ5X3RvX3NsZWVwKHBnX2RhdGFfdCAqcGdkYXQsIGludCBvcmRlciwgaW50IGNsYXNzem9uZV9pZHgpCit7CisJbG9uZyByZW1haW5pbmcgPSAwOworCURFRklORV9XQUlUKHdhaXQpOworCisJaWYgKGZyZWV6aW5nKGN1cnJlbnQpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJcmV0dXJuOworCisJcHJlcGFyZV90b193YWl0KCZwZ2RhdC0+a3N3YXBkX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCisJLyogVHJ5IHRvIHNsZWVwIGZvciBhIHNob3J0IGludGVydmFsICovCisJaWYgKCFzbGVlcGluZ19wcmVtYXR1cmVseShwZ2RhdCwgb3JkZXIsIHJlbWFpbmluZywgY2xhc3N6b25lX2lkeCkpIHsKKwkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJCWZpbmlzaF93YWl0KCZwZ2RhdC0+a3N3YXBkX3dhaXQsICZ3YWl0KTsKKwkJcHJlcGFyZV90b193YWl0KCZwZ2RhdC0+a3N3YXBkX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qCisJICogQWZ0ZXIgYSBzaG9ydCBzbGVlcCwgY2hlY2sgaWYgaXQgd2FzIGEgcHJlbWF0dXJlIHNsZWVwLiBJZiBub3QsIHRoZW4KKwkgKiBnbyBmdWxseSB0byBzbGVlcCB1bnRpbCBleHBsaWNpdGx5IHdva2VuIHVwLgorCSAqLworCWlmICghc2xlZXBpbmdfcHJlbWF0dXJlbHkocGdkYXQsIG9yZGVyLCByZW1haW5pbmcsIGNsYXNzem9uZV9pZHgpKSB7CisJCXRyYWNlX21tX3Ztc2Nhbl9rc3dhcGRfc2xlZXAocGdkYXQtPm5vZGVfaWQpOworCisJCS8qCisJCSAqIHZtc3RhdCBjb3VudGVycyBhcmUgbm90IHBlcmZlY3RseSBhY2N1cmF0ZSBhbmQgdGhlIGVzdGltYXRlZAorCQkgKiB2YWx1ZSBmb3IgY291bnRlcnMgc3VjaCBhcyBOUl9GUkVFX1BBR0VTIGNhbiBkZXZpYXRlIGZyb20gdGhlCisJCSAqIHRydWUgdmFsdWUgYnkgbnJfb25saW5lX2NwdXMgKiB0aHJlc2hvbGQuIFRvIGF2b2lkIHRoZSB6b25lCisJCSAqIHdhdGVybWFya3MgYmVpbmcgYnJlYWNoZWQgd2hpbGUgdW5kZXIgcHJlc3N1cmUsIHdlIHJlZHVjZSB0aGUKKwkJICogcGVyLWNwdSB2bXN0YXQgdGhyZXNob2xkIHdoaWxlIGtzd2FwZCBpcyBhd2FrZSBhbmQgcmVzdG9yZQorCQkgKiB0aGVtIGJlZm9yZSBnb2luZyBiYWNrIHRvIHNsZWVwLgorCQkgKi8KKwkJc2V0X3BnZGF0X3BlcmNwdV90aHJlc2hvbGQocGdkYXQsIGNhbGN1bGF0ZV9ub3JtYWxfdGhyZXNob2xkKTsKKwkJc2NoZWR1bGUoKTsKKwkJc2V0X3BnZGF0X3BlcmNwdV90aHJlc2hvbGQocGdkYXQsIGNhbGN1bGF0ZV9wcmVzc3VyZV90aHJlc2hvbGQpOworCX0gZWxzZSB7CisJCWlmIChyZW1haW5pbmcpCisJCQljb3VudF92bV9ldmVudChLU1dBUERfTE9XX1dNQVJLX0hJVF9RVUlDS0xZKTsKKwkJZWxzZQorCQkJY291bnRfdm1fZXZlbnQoS1NXQVBEX0hJR0hfV01BUktfSElUX1FVSUNLTFkpOworCX0KKwlmaW5pc2hfd2FpdCgmcGdkYXQtPmtzd2FwZF93YWl0LCAmd2FpdCk7CiB9CiAKIC8qCkBAIC0yMzg3LDkgKzI2MjYsMTAgQEAKIHN0YXRpYyBpbnQga3N3YXBkKHZvaWQgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBvcmRlcjsKKwlpbnQgY2xhc3N6b25lX2lkeDsKIAlwZ19kYXRhX3QgKnBnZGF0ID0gKHBnX2RhdGFfdCopcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JREVGSU5FX1dBSVQod2FpdCk7CisKIAlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSByZWNsYWltX3N0YXRlID0gewogCQkucmVjbGFpbWVkX3NsYWIgPSAwLAogCX07CkBAIC0yNDE3LDQ5ICsyNjU3LDMwIEBACiAJc2V0X2ZyZWV6YWJsZSgpOwogCiAJb3JkZXIgPSAwOworCWNsYXNzem9uZV9pZHggPSBNQVhfTlJfWk9ORVMgLSAxOwogCWZvciAoIDsgOyApIHsKIAkJdW5zaWduZWQgbG9uZyBuZXdfb3JkZXI7CisJCWludCBuZXdfY2xhc3N6b25lX2lkeDsKIAkJaW50IHJldDsKIAotCQlwcmVwYXJlX3RvX3dhaXQoJnBnZGF0LT5rc3dhcGRfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCW5ld19vcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOworCQluZXdfY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5jbGFzc3pvbmVfaWR4OwogCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7Ci0JCWlmIChvcmRlciA8IG5ld19vcmRlcikgeworCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUyAtIDE7CisJCWlmIChvcmRlciA8IG5ld19vcmRlciB8fCBjbGFzc3pvbmVfaWR4ID4gbmV3X2NsYXNzem9uZV9pZHgpIHsKIAkJCS8qCiAJCQkgKiBEb24ndCBzbGVlcCBpZiBzb21lb25lIHdhbnRzIGEgbGFyZ2VyICdvcmRlcicKLQkJCSAqIGFsbG9jYXRpb24KKwkJCSAqIGFsbG9jYXRpb24gb3IgaGFzIHRpZ2hlciB6b25lIGNvbnN0cmFpbnRzCiAJCQkgKi8KIAkJCW9yZGVyID0gbmV3X29yZGVyOworCQkJY2xhc3N6b25lX2lkeCA9IG5ld19jbGFzc3pvbmVfaWR4OwogCQl9IGVsc2UgewotCQkJaWYgKCFmcmVlemluZyhjdXJyZW50KSAmJiAha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCQkJbG9uZyByZW1haW5pbmcgPSAwOwotCi0JCQkJLyogVHJ5IHRvIHNsZWVwIGZvciBhIHNob3J0IGludGVydmFsICovCi0JCQkJaWYgKCFzbGVlcGluZ19wcmVtYXR1cmVseShwZ2RhdCwgb3JkZXIsIHJlbWFpbmluZykpIHsKLQkJCQkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChIWi8xMCk7Ci0JCQkJCWZpbmlzaF93YWl0KCZwZ2RhdC0+a3N3YXBkX3dhaXQsICZ3YWl0KTsKLQkJCQkJcHJlcGFyZV90b193YWl0KCZwZ2RhdC0+a3N3YXBkX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogQWZ0ZXIgYSBzaG9ydCBzbGVlcCwgY2hlY2sgaWYgaXQgd2FzIGEKLQkJCQkgKiBwcmVtYXR1cmUgc2xlZXAuIElmIG5vdCwgdGhlbiBnbyBmdWxseQotCQkJCSAqIHRvIHNsZWVwIHVudGlsIGV4cGxpY2l0bHkgd29rZW4gdXAKLQkJCQkgKi8KLQkJCQlpZiAoIXNsZWVwaW5nX3ByZW1hdHVyZWx5KHBnZGF0LCBvcmRlciwgcmVtYWluaW5nKSkgewotCQkJCQl0cmFjZV9tbV92bXNjYW5fa3N3YXBkX3NsZWVwKHBnZGF0LT5ub2RlX2lkKTsKLQkJCQkJc2NoZWR1bGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVtYWluaW5nKQotCQkJCQkJY291bnRfdm1fZXZlbnQoS1NXQVBEX0xPV19XTUFSS19ISVRfUVVJQ0tMWSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvdW50X3ZtX2V2ZW50KEtTV0FQRF9ISUdIX1dNQVJLX0hJVF9RVUlDS0xZKTsKLQkJCQl9Ci0JCQl9Ci0KKwkJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KTsKIAkJCW9yZGVyID0gcGdkYXQtPmtzd2FwZF9tYXhfb3JkZXI7CisJCQljbGFzc3pvbmVfaWR4ID0gcGdkYXQtPmNsYXNzem9uZV9pZHg7CisJCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IDA7CisJCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUyAtIDE7CiAJCX0KLQkJZmluaXNoX3dhaXQoJnBnZGF0LT5rc3dhcGRfd2FpdCwgJndhaXQpOwogCiAJCXJldCA9IHRyeV90b19mcmVlemUoKTsKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKQEAgLTI0NzEsNyArMjY5Miw3IEBACiAJCSAqLwogCQlpZiAoIXJldCkgewogCQkJdHJhY2VfbW1fdm1zY2FuX2tzd2FwZF93YWtlKHBnZGF0LT5ub2RlX2lkLCBvcmRlcik7Ci0JCQliYWxhbmNlX3BnZGF0KHBnZGF0LCBvcmRlcik7CisJCQlvcmRlciA9IGJhbGFuY2VfcGdkYXQocGdkYXQsIG9yZGVyLCAmY2xhc3N6b25lX2lkeCk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0yNDgwLDIzICsyNzAxLDI2IEBACiAvKgogICogQSB6b25lIGlzIGxvdyBvbiBmcmVlIG1lbW9yeSwgc28gd2FrZSBpdHMga3N3YXBkIHRhc2sgdG8gc2VydmljZSBpdC4KICAqLwotdm9pZCB3YWtldXBfa3N3YXBkKHN0cnVjdCB6b25lICp6b25lLCBpbnQgb3JkZXIpCit2b2lkIHdha2V1cF9rc3dhcGQoc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwgZW51bSB6b25lX3R5cGUgY2xhc3N6b25lX2lkeCkKIHsKIAlwZ19kYXRhX3QgKnBnZGF0OwogCiAJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJcmV0dXJuOwogCi0JcGdkYXQgPSB6b25lLT56b25lX3BnZGF0OwotCWlmICh6b25lX3dhdGVybWFya19vayh6b25lLCBvcmRlciwgbG93X3dtYXJrX3BhZ2VzKHpvbmUpLCAwLCAwKSkKLQkJcmV0dXJuOwotCWlmIChwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA8IG9yZGVyKQotCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IG9yZGVyOwotCXRyYWNlX21tX3Ztc2Nhbl93YWtldXBfa3N3YXBkKHBnZGF0LT5ub2RlX2lkLCB6b25lX2lkeCh6b25lKSwgb3JkZXIpOwogCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuOworCXBnZGF0ID0gem9uZS0+em9uZV9wZ2RhdDsKKwlpZiAocGdkYXQtPmtzd2FwZF9tYXhfb3JkZXIgPCBvcmRlcikgeworCQlwZ2RhdC0+a3N3YXBkX21heF9vcmRlciA9IG9yZGVyOworCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IG1pbihwZ2RhdC0+Y2xhc3N6b25lX2lkeCwgY2xhc3N6b25lX2lkeCk7CisJfQogCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmcGdkYXQtPmtzd2FwZF93YWl0KSkKIAkJcmV0dXJuOworCWlmICh6b25lX3dhdGVybWFya19va19zYWZlKHpvbmUsIG9yZGVyLCBsb3dfd21hcmtfcGFnZXMoem9uZSksIDAsIDApKQorCQlyZXR1cm47CisKKwl0cmFjZV9tbV92bXNjYW5fd2FrZXVwX2tzd2FwZChwZ2RhdC0+bm9kZV9pZCwgem9uZV9pZHgoem9uZSksIG9yZGVyKTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBnZGF0LT5rc3dhcGRfd2FpdCk7CiB9CiAKZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggMzEyZDcyOC4uMGMzYjUwNCAxMDA2NDQKLS0tIGEvbW0vdm1zdGF0LmMKKysrIGIvbW0vdm1zdGF0LmMKQEAgLTgzLDcgKzgzLDMxIEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAKLXN0YXRpYyBpbnQgY2FsY3VsYXRlX3RocmVzaG9sZChzdHJ1Y3Qgem9uZSAqem9uZSkKK2ludCBjYWxjdWxhdGVfcHJlc3N1cmVfdGhyZXNob2xkKHN0cnVjdCB6b25lICp6b25lKQoreworCWludCB0aHJlc2hvbGQ7CisJaW50IHdhdGVybWFya19kaXN0YW5jZTsKKworCS8qCisJICogQXMgdm1zdGF0cyBhcmUgbm90IHVwIHRvIGRhdGUsIHRoZXJlIGlzIGRyaWZ0IGJldHdlZW4gdGhlIGVzdGltYXRlZAorCSAqIGFuZCByZWFsIHZhbHVlcy4gRm9yIGhpZ2ggdGhyZXNob2xkcyBhbmQgYSBoaWdoIG51bWJlciBvZiBDUFVzLCBpdAorCSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgbWluIHdhdGVybWFyayB0byBiZSBicmVhY2hlZCB3aGlsZSB0aGUgZXN0aW1hdGVkCisJICogdmFsdWUgbG9va3MgZmluZS4gVGhlIHByZXNzdXJlIHRocmVzaG9sZCBpcyBhIHJlZHVjZWQgdmFsdWUgc3VjaAorCSAqIHRoYXQgZXZlbiB0aGUgbWF4aW11bSBhbW91bnQgb2YgZHJpZnQgd2lsbCBub3QgYWNjaWRlbnRhbGx5IGJyZWFjaAorCSAqIHRoZSBtaW4gd2F0ZXJtYXJrCisJICovCisJd2F0ZXJtYXJrX2Rpc3RhbmNlID0gbG93X3dtYXJrX3BhZ2VzKHpvbmUpIC0gbWluX3dtYXJrX3BhZ2VzKHpvbmUpOworCXRocmVzaG9sZCA9IG1heCgxLCAoaW50KSh3YXRlcm1hcmtfZGlzdGFuY2UgLyBudW1fb25saW5lX2NwdXMoKSkpOworCisJLyoKKwkgKiBNYXhpbXVtIHRocmVzaG9sZCBpcyAxMjUKKwkgKi8KKwl0aHJlc2hvbGQgPSBtaW4oMTI1LCB0aHJlc2hvbGQpOworCisJcmV0dXJuIHRocmVzaG9sZDsKK30KKworaW50IGNhbGN1bGF0ZV9ub3JtYWxfdGhyZXNob2xkKHN0cnVjdCB6b25lICp6b25lKQogewogCWludCB0aHJlc2hvbGQ7CiAJaW50IG1lbTsJLyogbWVtb3J5IGluIDEyOCBNQiB1bml0cyAqLwpAQCAtMTQyLDcgKzE2Niw3IEBACiAJZm9yX2VhY2hfcG9wdWxhdGVkX3pvbmUoem9uZSkgewogCQl1bnNpZ25lZCBsb25nIG1heF9kcmlmdCwgdG9sZXJhdGVfZHJpZnQ7CiAKLQkJdGhyZXNob2xkID0gY2FsY3VsYXRlX3RocmVzaG9sZCh6b25lKTsKKwkJdGhyZXNob2xkID0gY2FsY3VsYXRlX25vcm1hbF90aHJlc2hvbGQoem9uZSk7CiAKIAkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCiAJCQlwZXJfY3B1X3B0cih6b25lLT5wYWdlc2V0LCBjcHUpLT5zdGF0X3RocmVzaG9sZApAQCAtMTYxLDYgKzE4NSwyNiBAQAogCX0KIH0KIAordm9pZCBzZXRfcGdkYXRfcGVyY3B1X3RocmVzaG9sZChwZ19kYXRhX3QgKnBnZGF0LAorCQkJCWludCAoKmNhbGN1bGF0ZV9wcmVzc3VyZSkoc3RydWN0IHpvbmUgKikpCit7CisJc3RydWN0IHpvbmUgKnpvbmU7CisJaW50IGNwdTsKKwlpbnQgdGhyZXNob2xkOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBnZGF0LT5ucl96b25lczsgaSsrKSB7CisJCXpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbaV07CisJCWlmICghem9uZS0+cGVyY3B1X2RyaWZ0X21hcmspCisJCQljb250aW51ZTsKKworCQl0aHJlc2hvbGQgPSAoKmNhbGN1bGF0ZV9wcmVzc3VyZSkoem9uZSk7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCQlwZXJfY3B1X3B0cih6b25lLT5wYWdlc2V0LCBjcHUpLT5zdGF0X3RocmVzaG9sZAorCQkJCQkJCT0gdGhyZXNob2xkOworCX0KK30KKwogLyoKICAqIEZvciB1c2Ugd2hlbiB3ZSBrbm93IHRoYXQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCiAgKi8KQEAgLTgzNiw2ICs4ODAsNyBAQAogCSJudW1hX2xvY2FsIiwKIAkibnVtYV9vdGhlciIsCiAjZW5kaWYKKwkibnJfYW5vbl90cmFuc3BhcmVudF9odWdlcGFnZXMiLAogCSJucl9kaXJ0eV90aHJlc2hvbGQiLAogCSJucl9kaXJ0eV9iYWNrZ3JvdW5kX3RocmVzaG9sZCIsCiAKQEAgLTkxMSw3ICs5NTYsNyBAQAogCQkgICAiXG4gICAgICAgIHNjYW5uZWQgICVsdSIKIAkJICAgIlxuICAgICAgICBzcGFubmVkICAlbHUiCiAJCSAgICJcbiAgICAgICAgcHJlc2VudCAgJWx1IiwKLQkJICAgem9uZV9ucl9mcmVlX3BhZ2VzKHpvbmUpLAorCQkgICB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfRlJFRV9QQUdFUyksCiAJCSAgIG1pbl93bWFya19wYWdlcyh6b25lKSwKIAkJICAgbG93X3dtYXJrX3BhZ2VzKHpvbmUpLAogCQkgICBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLApkaWZmIC0tZ2l0IGEvbmV0LzlwL3Byb3RvY29sLmMgYi9uZXQvOXAvcHJvdG9jb2wuYwppbmRleCA3OThiZWFjLi4xZTMwOGYyIDEwMDY0NAotLS0gYS9uZXQvOXAvcHJvdG9jb2wuYworKysgYi9uZXQvOXAvcHJvdG9jb2wuYwpAQCAtMTc4LDI3ICsxNzgsMjQgQEAKIAkJCWJyZWFrOwogCQljYXNlICdzJzp7CiAJCQkJY2hhciAqKnNwdHIgPSB2YV9hcmcoYXAsIGNoYXIgKiopOwotCQkJCWludDE2X3QgbGVuOwotCQkJCWludCBzaXplOworCQkJCXVpbnQxNl90IGxlbjsKIAogCQkJCWVycmNvZGUgPSBwOXBkdV9yZWFkZihwZHUsIHByb3RvX3ZlcnNpb24sCiAJCQkJCQkJCSJ3IiwgJmxlbik7CiAJCQkJaWYgKGVycmNvZGUpCiAJCQkJCWJyZWFrOwogCi0JCQkJc2l6ZSA9IG1heF90KGludDE2X3QsIGxlbiwgMCk7Ci0KLQkJCQkqc3B0ciA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOworCQkJCSpzcHRyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJCQlpZiAoKnNwdHIgPT0gTlVMTCkgewogCQkJCQllcnJjb2RlID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWlmIChwZHVfcmVhZChwZHUsICpzcHRyLCBzaXplKSkgeworCQkJCWlmIChwZHVfcmVhZChwZHUsICpzcHRyLCBsZW4pKSB7CiAJCQkJCWVycmNvZGUgPSAtRUZBVUxUOwogCQkJCQlrZnJlZSgqc3B0cik7CiAJCQkJCSpzcHRyID0gTlVMTDsKIAkJCQl9IGVsc2UKLQkJCQkJKCpzcHRyKVtzaXplXSA9IDA7CisJCQkJCSgqc3B0cilbbGVuXSA9IDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAnUSc6ewpAQCAtMjM0LDE0ICsyMzEsMTQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlICdEJzp7Ci0JCQkJaW50MzJfdCAqY291bnQgPSB2YV9hcmcoYXAsIGludDMyX3QgKik7CisJCQkJdWludDMyX3QgKmNvdW50ID0gdmFfYXJnKGFwLCB1aW50MzJfdCAqKTsKIAkJCQl2b2lkICoqZGF0YSA9IHZhX2FyZyhhcCwgdm9pZCAqKik7CiAKIAkJCQllcnJjb2RlID0KIAkJCQkgICAgcDlwZHVfcmVhZGYocGR1LCBwcm90b192ZXJzaW9uLCAiZCIsIGNvdW50KTsKIAkJCQlpZiAoIWVycmNvZGUpIHsKIAkJCQkJKmNvdW50ID0KLQkJCQkJICAgIG1pbl90KGludDMyX3QsICpjb3VudCwKKwkJCQkJICAgIG1pbl90KHVpbnQzMl90LCAqY291bnQsCiAJCQkJCQkgIHBkdS0+c2l6ZSAtIHBkdS0+b2Zmc2V0KTsKIAkJCQkJKmRhdGEgPSAmcGR1LT5zZGF0YVtwZHUtPm9mZnNldF07CiAJCQkJfQpAQCAtNDA0LDkgKzQwMSwxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ3MnOnsKIAkJCQljb25zdCBjaGFyICpzcHRyID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopOwotCQkJCWludDE2X3QgbGVuID0gMDsKKwkJCQl1aW50MTZfdCBsZW4gPSAwOwogCQkJCWlmIChzcHRyKQotCQkJCQlsZW4gPSBtaW5fdChpbnQxNl90LCBzdHJsZW4oc3B0ciksIFVTSFJUX01BWCk7CisJCQkJCWxlbiA9IG1pbl90KHVpbnQxNl90LCBzdHJsZW4oc3B0ciksCisJCQkJCQkJCVVTSFJUX01BWCk7CiAKIAkJCQllcnJjb2RlID0gcDlwZHVfd3JpdGVmKHBkdSwgcHJvdG9fdmVyc2lvbiwKIAkJCQkJCQkJInciLCBsZW4pOwpAQCAtNDM4LDcgKzQzNiw3IEBACiAJCQkJCQkgc3RidWYtPm5fZ2lkLCBzdGJ1Zi0+bl9tdWlkKTsKIAkJCX0gYnJlYWs7CiAJCWNhc2UgJ0QnOnsKLQkJCQlpbnQzMl90IGNvdW50ID0gdmFfYXJnKGFwLCBpbnQzMl90KTsKKwkJCQl1aW50MzJfdCBjb3VudCA9IHZhX2FyZyhhcCwgdWludDMyX3QpOwogCQkJCWNvbnN0IHZvaWQgKmRhdGEgPSB2YV9hcmcoYXAsIGNvbnN0IHZvaWQgKik7CiAKIAkJCQllcnJjb2RlID0gcDlwZHVfd3JpdGVmKHBkdSwgcHJvdG9fdmVyc2lvbiwgImQiLApkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCBhZDBhYWZlLi43Mjg0MDYyIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMjUzLDcgKzI1Myw5IEBACiAJd2hhdCB3YXMganVzdCBzYWlkLCB5b3UgZG9uJ3QgbmVlZCBpdDogc2F5IE4uCiAKIAlEb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgVENQIGNvbm5lY3Rpb24gcHJvYmluZyBjYW4gYmUgZm91bmQKLQlhdCBodHRwOi8vbGludXgtbmV0Lm9zZGwub3JnL2luZGV4LnBocC9UY3BQcm9iZQorCWF0OgorCQorCSAgaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2NvbGxhYm9yYXRlL3dvcmtncm91cHMvbmV0d29ya2luZy90Y3Bwcm9iZQogCiAJVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0Y3BfcHJvYmUuCmRpZmYgLS1naXQgYS9uZXQvY2VwaC9jZXBoX2hhc2guYyBiL25ldC9jZXBoL2NlcGhfaGFzaC5jCmluZGV4IDgxNWVmODguLjBhMWI1M2IgMTAwNjQ0Ci0tLSBhL25ldC9jZXBoL2NlcGhfaGFzaC5jCisrKyBiL25ldC9jZXBoL2NlcGhfaGFzaC5jCkBAIC0xLDUgKzEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvY2VwaC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKgogICogUm9iZXJ0IEplbmtpbidzIGhhc2ggZnVuY3Rpb24uCkBAIC0xMDQsNiArMTA1LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woY2VwaF9zdHJfaGFzaCk7CiAKIGNvbnN0IGNoYXIgKmNlcGhfc3RyX2hhc2hfbmFtZShpbnQgdHlwZSkKIHsKQEAgLTExNiwzICsxMTgsNCBAQAogCQlyZXR1cm4gInVua25vd24iOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woY2VwaF9zdHJfaGFzaF9uYW1lKTsKZGlmZiAtLWdpdCBhL25ldC9jZXBoL21lc3Nlbmdlci5jIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKaW5kZXggYjZmZjRhMS4uZGZmNjMzZCAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKKysrIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKQEAgLTk2LDcgKzk2LDcgQEAKIAogaW50IGNlcGhfbXNncl9pbml0KHZvaWQpCiB7Ci0JY2VwaF9tc2dyX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiY2VwaC1tc2dyIik7CisJY2VwaF9tc2dyX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJjZXBoLW1zZ3IiLCBXUV9OT05fUkVFTlRSQU5ULCAwKTsKIAlpZiAoIWNlcGhfbXNncl93cSkgewogCQlwcl9lcnIoIm1zZ3JfaW5pdCBmYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTkyMCwyMCArMTkyMCw2IEBACiAvKgogICogQXRvbWljYWxseSBxdWV1ZSB3b3JrIG9uIGEgY29ubmVjdGlvbi4gIEJ1bXAgQGNvbiByZWZlcmVuY2UgdG8KICAqIGF2b2lkIHJhY2VzIHdpdGggY29ubmVjdGlvbiB0ZWFyZG93bi4KLSAqCi0gKiBUaGVyZSBpcyBzb21lIHRyaWNrZXJ5IGdvaW5nIG9uIHdpdGggUVVFVUVEIGFuZCBCVVNZIGJlY2F1c2Ugd2UKLSAqIG9ubHkgd2FudCBhIF9zaW5nbGVfIHRocmVhZCBvcGVyYXRpbmcgb24gZWFjaCBjb25uZWN0aW9uIGF0IGFueQotICogcG9pbnQgaW4gdGltZSwgYnV0IHdlIHdhbnQgdG8gdXNlIGFsbCBhdmFpbGFibGUgQ1BVcy4KLSAqCi0gKiBUaGUgd29ya2VyIHRocmVhZCBvbmx5IHByb2NlZWRzIGlmIGl0IGNhbiBhdG9taWNhbGx5IHNldCBCVVNZLiAgSXQKLSAqIGNsZWFycyBRVUVVRUQgYW5kIGRvZXMgaXQncyB0aGluZy4gIFdoZW4gaXQgdGhpbmtzIGl0J3MgZG9uZSwgaXQKLSAqIGNsZWFycyBCVVNZLCB0aGVuIHJlY2hlY2tzIFFVRVVFRC4uIGlmIGl0J3Mgc2V0IGFnYWluLCBpdCBsb29wcwotICogKHRyaWVzIGFnYWluIHRvIHNldCBCVVNZKS4KLSAqCi0gKiBUbyBxdWV1ZSB3b3JrLCB3ZSBmaXJzdCBzZXQgUVVFVUVELCBfdGhlbl8gaWYgQlVTWSBpc24ndCBzZXQsIHdlCi0gKiB0cnkgdG8gcXVldWUgd29yay4gIElmIHRoYXQgZmFpbHMgKHdvcmsgaXMgYWxyZWFkeSBxdWV1ZWQsIG9yIEJVU1kpCi0gKiB3ZSBnaXZlIHVwICh3b3JrIGFsc28gYWxyZWFkeSBiZWluZyBkb25lIG9yIGlzIHF1ZXVlZCkgYnV0IGxlYXZlIFFVRVVFRAotICogc2V0IHNvIHRoYXQgdGhlIHdvcmtlciB0aHJlYWQgd2lsbCBsb29wIGlmIG5lY2Vzc2FyeS4KICAqLwogc3RhdGljIHZvaWQgcXVldWVfY29uKHN0cnVjdCBjZXBoX2Nvbm5lY3Rpb24gKmNvbikKIHsKQEAgLTE5NDgsMTEgKzE5MzQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2V0X2JpdChRVUVVRUQsICZjb24tPnN0YXRlKTsKLQlpZiAodGVzdF9iaXQoQlVTWSwgJmNvbi0+c3RhdGUpKSB7Ci0JCWRvdXQoInF1ZXVlX2NvbiAlcCAtIGFscmVhZHkgQlVTWVxuIiwgY29uKTsKLQkJY29uLT5vcHMtPnB1dChjb24pOwotCX0gZWxzZSBpZiAoIXF1ZXVlX3dvcmsoY2VwaF9tc2dyX3dxLCAmY29uLT53b3JrLndvcmspKSB7CisJaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsoY2VwaF9tc2dyX3dxLCAmY29uLT53b3JrLCAwKSkgewogCQlkb3V0KCJxdWV1ZV9jb24gJXAgLSBhbHJlYWR5IHF1ZXVlZFxuIiwgY29uKTsKIAkJY29uLT5vcHMtPnB1dChjb24pOwogCX0gZWxzZSB7CkBAIC0xOTY3LDE1ICsxOTQ5LDYgQEAKIHsKIAlzdHJ1Y3QgY2VwaF9jb25uZWN0aW9uICpjb24gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNlcGhfY29ubmVjdGlvbiwKIAkJCQkJCSAgIHdvcmsud29yayk7Ci0JaW50IGJhY2tvZmYgPSAwOwotCi1tb3JlOgotCWlmICh0ZXN0X2FuZF9zZXRfYml0KEJVU1ksICZjb24tPnN0YXRlKSAhPSAwKSB7Ci0JCWRvdXQoImNvbl93b3JrICVwIEJVU1kgYWxyZWFkeSBzZXRcbiIsIGNvbik7Ci0JCWdvdG8gb3V0OwotCX0KLQlkb3V0KCJjb25fd29yayAlcCBzdGFydCwgY2xlYXJpbmcgUVVFVUVEXG4iLCBjb24pOwotCWNsZWFyX2JpdChRVUVVRUQsICZjb24tPnN0YXRlKTsKIAogCW11dGV4X2xvY2soJmNvbi0+bXV0ZXgpOwogCkBAIC0xOTk0LDI4ICsxOTY3LDEzIEBACiAJICAgIHRyeV9yZWFkKGNvbikgPCAwIHx8CiAJICAgIHRyeV93cml0ZShjb24pIDwgMCkgewogCQltdXRleF91bmxvY2soJmNvbi0+bXV0ZXgpOwotCQliYWNrb2ZmID0gMTsKIAkJY2VwaF9mYXVsdChjb24pOyAgICAgLyogZXJyb3IvZmF1bHQgcGF0aCAqLwogCQlnb3RvIGRvbmVfdW5sb2NrZWQ7CiAJfQogCiBkb25lOgogCW11dGV4X3VubG9jaygmY29uLT5tdXRleCk7Ci0KIGRvbmVfdW5sb2NrZWQ6Ci0JY2xlYXJfYml0KEJVU1ksICZjb24tPnN0YXRlKTsKLQlkb3V0KCJjb24tPnN0YXRlPSVsdVxuIiwgY29uLT5zdGF0ZSk7Ci0JaWYgKHRlc3RfYml0KFFVRVVFRCwgJmNvbi0+c3RhdGUpKSB7Ci0JCWlmICghYmFja29mZiB8fCB0ZXN0X2JpdChPUEVOSU5HLCAmY29uLT5zdGF0ZSkpIHsKLQkJCWRvdXQoImNvbl93b3JrICVwIFFVRVVFRCByZXNldCwgbG9vcGluZ1xuIiwgY29uKTsKLQkJCWdvdG8gbW9yZTsKLQkJfQotCQlkb3V0KCJjb25fd29yayAlcCBRVUVVRUQgcmVzZXQsIGJ1dCBqdXN0IGZhdWx0ZWRcbiIsIGNvbik7Ci0JCWNsZWFyX2JpdChRVUVVRUQsICZjb24tPnN0YXRlKTsKLQl9Ci0JZG91dCgiY29uX3dvcmsgJXAgZG9uZVxuIiwgY29uKTsKLQotb3V0OgogCWNvbi0+b3BzLT5wdXQoY29uKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvb3NkbWFwLmMgYi9uZXQvY2VwaC9vc2RtYXAuYwppbmRleCBkNzNmM2Y2Li43MTYwM2FjIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9vc2RtYXAuYworKysgYi9uZXQvY2VwaC9vc2RtYXAuYwpAQCAtNjA1LDggKzYwNSwxMCBAQAogCQkJZ290byBiYWQ7CiAJCX0KIAkJZXJyID0gX19kZWNvZGVfcG9vbChwLCBlbmQsIHBpKTsKLQkJaWYgKGVyciA8IDApCisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShwaSk7CiAJCQlnb3RvIGJhZDsKKwkJfQogCQlfX2luc2VydF9wZ19wb29sKCZtYXAtPnBnX3Bvb2xzLCBwaSk7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDgzNTA3YzIuLjU0Mjc3ZGYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC02MTg5LDcgKzYxODksNyBAQAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBkZWZhdWx0X2RldmljZV9leGl0X2JhdGNoKHN0cnVjdCBsaXN0X2hlYWQgKm5ldF9saXN0KQogewogCS8qIEF0IGV4aXQgYWxsIG5ldHdvcmsgZGV2aWNlcyBtb3N0IGJlIHJlbW92ZWQgZnJvbSBhIG5ldHdvcmsKLQkgKiBuYW1lc3BhY2UuICBEbyB0aGlzIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIHJlZ2lzdGVyYXRpb24uCisJICogbmFtZXNwYWNlLiAgRG8gdGhpcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiByZWdpc3RyYXRpb24uCiAJICogRG8gdGhpcyBhY3Jvc3MgYXMgbWFueSBuZXR3b3JrIG5hbWVzcGFjZXMgYXMgcG9zc2libGUgdG8KIAkgKiBpbXByb3ZlIGJhdGNoaW5nIGVmZmljaWVuY3kuCiAJICovCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggYTY1OGFlYi4uN2RmZWQ3OSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICJza19sb2NrLTI3IiAgICAgICAsICJza19sb2NrLTI4IiAgICAgICAgICAsICJza19sb2NrLUFGX0NBTiIgICAgICAsCiAgICJza19sb2NrLUFGX1RJUEMiICAsICJza19sb2NrLUFGX0JMVUVUT09USCIsICJza19sb2NrLUlVQ1YiICAgICAgICAsCiAgICJza19sb2NrLUFGX1JYUlBDIiAsICJza19sb2NrLUFGX0lTRE4iICAgICAsICJza19sb2NrLUFGX1BIT05FVCIgICAsCi0gICJza19sb2NrLUFGX0lFRUU4MDIxNTQiLCAic2tfbG9jay1BRl9DQUlGIiAsCisgICJza19sb2NrLUFGX0lFRUU4MDIxNTQiLCAic2tfbG9jay1BRl9DQUlGIiAsICJza19sb2NrLUFGX0FMRyIgICAgICAsCiAgICJza19sb2NrLUFGX01BWCIKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWZfZmFtaWx5X3Nsb2NrX2tleV9zdHJpbmdzW0FGX01BWCsxXSA9IHsKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAic2xvY2stMjciICAgICAgICwgInNsb2NrLTI4IiAgICAgICAgICAsICJzbG9jay1BRl9DQU4iICAgICAgLAogICAic2xvY2stQUZfVElQQyIgICwgInNsb2NrLUFGX0JMVUVUT09USCIsICJzbG9jay1BRl9JVUNWIiAgICAgLAogICAic2xvY2stQUZfUlhSUEMiICwgInNsb2NrLUFGX0lTRE4iICAgICAsICJzbG9jay1BRl9QSE9ORVQiICAgLAotICAic2xvY2stQUZfSUVFRTgwMjE1NCIsICJzbG9jay1BRl9DQUlGIiAsCisgICJzbG9jay1BRl9JRUVFODAyMTU0IiwgInNsb2NrLUFGX0NBSUYiICwgInNsb2NrLUFGX0FMRyIgICAgICAsCiAgICJzbG9jay1BRl9NQVgiCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFmX2ZhbWlseV9jbG9ja19rZXlfc3RyaW5nc1tBRl9NQVgrMV0gPSB7CkBAIC0xODksNyArMTg5LDcgQEAKICAgImNsb2NrLTI3IiAgICAgICAsICJjbG9jay0yOCIgICAgICAgICAgLCAiY2xvY2stQUZfQ0FOIiAgICAgICwKICAgImNsb2NrLUFGX1RJUEMiICAsICJjbG9jay1BRl9CTFVFVE9PVEgiLCAiY2xvY2stQUZfSVVDViIgICAgICwKICAgImNsb2NrLUFGX1JYUlBDIiAsICJjbG9jay1BRl9JU0ROIiAgICAgLCAiY2xvY2stQUZfUEhPTkVUIiAgICwKLSAgImNsb2NrLUFGX0lFRUU4MDIxNTQiLCAiY2xvY2stQUZfQ0FJRiIgLAorICAiY2xvY2stQUZfSUVFRTgwMjE1NCIsICJjbG9jay1BRl9DQUlGIiAsICJjbG9jay1BRl9BTEciICAgICAgLAogICAiY2xvY2stQUZfTUFYIgogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvS2NvbmZpZyBiL25ldC9kY2NwL0tjb25maWcKaW5kZXggYWQ2ZGZmZC4uYjc1OTY4YSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvS2NvbmZpZworKysgYi9uZXQvZGNjcC9LY29uZmlnCkBAIC00OSw3ICs0OSw5IEBACiAJd2hhdCB3YXMganVzdCBzYWlkLCB5b3UgZG9uJ3QgbmVlZCBpdDogc2F5IE4uCiAKIAlEb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgRENDUCBjb25uZWN0aW9uIHByb2JpbmcgY2FuIGJlIGZvdW5kCi0JYXQgaHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvRGNjcFByb2JlCisJYXQ6CisJCisJICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvY29sbGFib3JhdGUvd29ya2dyb3Vwcy9uZXR3b3JraW5nL2RjY3Bwcm9iZQogCiAJVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCW1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkY2NwX3Byb2JlLgpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9kZXYuYyBiL25ldC9kZWNuZXQvZG5fZGV2LmMKaW5kZXggMGJhMTU2My4uMGRjYWE5MCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9kZXYuYworKysgYi9uZXQvZGVjbmV0L2RuX2Rldi5jCkBAIC0xMTMwLDcgKzExMzAsNyBAQAogLyoKICAqIFRoaXMgcHJvY2Vzc2VzIGEgZGV2aWNlIHVwIGV2ZW50LiBXZSBvbmx5IHN0YXJ0IHVwCiAgKiB0aGUgbG9vcGJhY2sgZGV2aWNlICYgZXRoZXJuZXQgZGV2aWNlcyB3aXRoIGNvcnJlY3QKLSAqIE1BQyBhZGRyZXNlcyBhdXRvbWF0aWNhbGx5LiBPdGhlcnMgbXVzdCBiZSBzdGFydGVkCisgKiBNQUMgYWRkcmVzc2VzIGF1dG9tYXRpY2FsbHkuIE90aGVycyBtdXN0IGJlIHN0YXJ0ZWQKICAqIHNwZWNpZmljYWxseS4KICAqCiAgKiBGSVhNRTogSG93IHNob3VsZCB3ZSBjb25maWd1cmUgdGhlIGxvb3BiYWNrIGFkZHJlc3MgPyBJZiB3ZSBjb3VsZCBkaXNwZW5zZQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggOWU5NWQ3Zi4uYTVhMTA1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC00MzIsNyArNDMyLDkgQEAKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBJTkVUIChUQ1AsIERDQ1AsIGV0Yykgc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkKIAkgIG5hdGl2ZSBMaW51eCB0b29scyBzdWNoIGFzIHNzLiBzcyBpcyBpbmNsdWRlZCBpbiBpcHJvdXRlMiwgY3VycmVudGx5Ci0JICBkb3dubG9hZGFibGUgYXQgPGh0dHA6Ly9saW51eC1uZXQub3NkbC5vcmcvaW5kZXgucGhwL0lwcm91dGUyPi4KKwkgIGRvd25sb2FkYWJsZSBhdDoKKwkgIAorCSAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvY29sbGFib3JhdGUvd29ya2dyb3Vwcy9uZXR3b3JraW5nL2lwcm91dGUyCiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCBkYzdjMDk2Li40MDZmMzIwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiBJbnRpYWxpemUgVFNPIHN0YXRlIG9mIGEgc2tiLgorLyogSW5pdGlhbGl6ZSBUU08gc3RhdGUgb2YgYSBza2IuCiAgKiBUaGlzIG11c3QgYmUgaW52b2tlZCB0aGUgZmlyc3QgdGltZSB3ZSBjb25zaWRlciB0cmFuc21pdHRpbmcKICAqIFNLQiBvbnRvIHRoZSB3aXJlLgogICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCAwNTlhM2RlLi45NzhlODBlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQkvKiBSZXByb2R1Y2UgQUZfSU5FVCBjaGVja3MgdG8gbWFrZSB0aGUgYmluZGluZ3MgY29uc2l0YW50ICovCisJCS8qIFJlcHJvZHVjZSBBRl9JTkVUIGNoZWNrcyB0byBtYWtlIHRoZSBiaW5kaW5ncyBjb25zaXN0ZW50ICovCiAJCXY0YWRkciA9IGFkZHItPnNpbjZfYWRkci5zNl9hZGRyMzJbM107CiAJCWNoa19hZGRyX3JldCA9IGluZXRfYWRkcl90eXBlKG5ldCwgdjRhZGRyKTsKIAkJaWYgKCFzeXNjdGxfaXBfbm9ubG9jYWxfYmluZCAmJgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FmX3J4cnBjLmMgYi9uZXQvcnhycGMvYWZfcnhycGMuYwppbmRleCAwYjliYjIwLi43NGMwNjRjIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYWZfcnhycGMuYworKysgYi9uZXQvcnhycGMvYWZfcnhycGMuYwpAQCAtODA4LDcgKzgwOCw3IEBACiAJCWdvdG8gZXJyb3JfY2FsbF9qYXI7CiAJfQogCi0JcnhycGNfd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgia3J4cnBjZCIpOworCXJ4cnBjX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgia3J4cnBjZCIsIDAsIDEpOwogCWlmICghcnhycGNfd29ya3F1ZXVlKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiUnhSUEM6IEZhaWxlZCB0byBhbGxvY2F0ZSB3b3JrIHF1ZXVlXG4iKTsKIAkJZ290byBlcnJvcl93b3JrX3F1ZXVlOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCBhMzYyNzBhLi5mMDRkNGE0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogCSAgVG8gYWRtaW5pc3RlciB0aGVzZSBzY2hlZHVsZXJzLCB5b3UnbGwgbmVlZCB0aGUgdXNlci1sZXZlbCB1dGlsaXRpZXMKIAkgIGZyb20gdGhlIHBhY2thZ2UgaXByb3V0ZTIrdGMgYXQgPGZ0cDovL2Z0cC50dXgub3JnL3B1Yi9uZXQvaXAtcm91dGluZy8+LgogCSAgVGhhdCBwYWNrYWdlIGFsc28gY29udGFpbnMgc29tZSBkb2N1bWVudGF0aW9uOyBmb3IgbW9yZSwgY2hlY2sgb3V0Ci0JICA8aHR0cDovL2xpbnV4LW5ldC5vc2RsLm9yZy9pbmRleC5waHAvSXByb3V0ZTI+LgorCSAgPGh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9jb2xsYWJvcmF0ZS93b3JrZ3JvdXBzL25ldHdvcmtpbmcvaXByb3V0ZTI+LgogCiAJICBUaGlzIFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKSBzdXBwb3J0IHdpbGwgZW5hYmxlIHlvdSB0byB1c2UKIAkgIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIChkaWZmc2VydikgYW5kIFJlc291cmNlIFJlc2VydmF0aW9uIFByb3RvY29sCmRpZmYgLS1naXQgYS9uZXQvc29ja2V0LmMgYi9uZXQvc29ja2V0LmMKaW5kZXggY2NjNTc2YS4uYWMyMjE5ZiAxMDA2NDQKLS0tIGEvbmV0L3NvY2tldC5jCisrKyBiL25ldC9zb2NrZXQuYwpAQCAtMzA2LDIwICszMDYsNiBAQAogCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzb2NrZnNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gbW91bnRfcHNldWRvKGZzX3R5cGUsICJzb2NrZXQ6IiwgJnNvY2tmc19vcHMsIFNPQ0tGU19NQUdJQyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNvY2tfbW50IF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzb2NrX2ZzX3R5cGUgPSB7Ci0JLm5hbWUgPQkJInNvY2tmcyIsCi0JLm1vdW50ID0Jc29ja2ZzX21vdW50LAotCS5raWxsX3NiID0Ja2lsbF9hbm9uX3N1cGVyLAotfTsKLQogLyoKICAqIHNvY2tmc19kbmFtZSgpIGlzIGNhbGxlZCBmcm9tIGRfcGF0aCgpLgogICovCkBAIC0zMzMsNiArMzE5LDIxIEBACiAJLmRfZG5hbWUgID0gc29ja2ZzX2RuYW1lLAogfTsKIAorc3RhdGljIHN0cnVjdCBkZW50cnkgKnNvY2tmc19tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCSBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgInNvY2tldDoiLCAmc29ja2ZzX29wcywKKwkJJnNvY2tmc19kZW50cnlfb3BlcmF0aW9ucywgU09DS0ZTX01BR0lDKTsKK30KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc29ja19tbnQgX19yZWFkX21vc3RseTsKKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHNvY2tfZnNfdHlwZSA9IHsKKwkubmFtZSA9CQkic29ja2ZzIiwKKwkubW91bnQgPQlzb2NrZnNfbW91bnQsCisJLmtpbGxfc2IgPQlraWxsX2Fub25fc3VwZXIsCit9OworCiAvKgogICoJT2J0YWlucyB0aGUgZmlyc3QgYXZhaWxhYmxlIGZpbGUgZGVzY3JpcHRvciBhbmQgc2V0cyBpdCB1cCBmb3IgdXNlLgogICoKQEAgLTM2OCw3ICszNjksNiBAQAogCX0KIAlwYXRoLm1udCA9IG1udGdldChzb2NrX21udCk7CiAKLQlkX3NldF9kX29wKHBhdGguZGVudHJ5LCAmc29ja2ZzX2RlbnRyeV9vcGVyYXRpb25zKTsKIAlkX2luc3RhbnRpYXRlKHBhdGguZGVudHJ5LCBTT0NLX0lOT0RFKHNvY2spKTsKIAlTT0NLX0lOT0RFKHNvY2spLT5pX2ZvcCA9ICZzb2NrZXRfZmlsZV9vcHM7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aC5jIGIvbmV0L3N1bnJwYy9hdXRoLmMKaW5kZXggYWZlNjc4NC4uNjdlMzEyNyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoLmMKQEAgLTU2Myw4ICs1NjMsMTcgQEAKIAlyZXR1cm4gY3JlZC0+Y3Jfb3BzLT5jcnZhbGlkYXRlKHRhc2ssIHApOwogfQogCitzdGF0aWMgdm9pZCBycGNhdXRoX3dyYXBfcmVxX2VuY29kZShreGRyZXByb2NfdCBlbmNvZGUsIHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgX19iZTMyICpkYXRhLCB2b2lkICpvYmopCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZycXN0cC0+cnFfc25kX2J1ZiwgZGF0YSk7CisJZW5jb2RlKHJxc3RwLCAmeGRyLCBvYmopOworfQorCiBpbnQKLXJwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGVuY29kZSwgdm9pZCAqcnFzdHAsCitycGNhdXRoX3dyYXBfcmVxKHN0cnVjdCBycGNfdGFzayAqdGFzaywga3hkcmVwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwKIAkJX19iZTMyICpkYXRhLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfcnFzdHAtPnJxX2NyZWQ7CkBAIC01NzQsMTEgKzU4MywyMiBAQAogCWlmIChjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEpCiAJCXJldHVybiBjcmVkLT5jcl9vcHMtPmNyd3JhcF9yZXEodGFzaywgZW5jb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKIAkvKiBCeSBkZWZhdWx0LCB3ZSBlbmNvZGUgdGhlIGFyZ3VtZW50cyBub3JtYWxseS4gKi8KLQlyZXR1cm4gZW5jb2RlKHJxc3RwLCBkYXRhLCBvYmopOworCXJwY2F1dGhfd3JhcF9yZXFfZW5jb2RlKGVuY29kZSwgcnFzdHAsIGRhdGEsIG9iaik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JwY2F1dGhfdW53cmFwX3JlcV9kZWNvZGUoa3hkcmRwcm9jX3QgZGVjb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJICBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBkYXRhKTsKKwlyZXR1cm4gZGVjb2RlKHJxc3RwLCAmeGRyLCBvYmopOwogfQogCiBpbnQKLXJwY2F1dGhfdW53cmFwX3Jlc3Aoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGRlY29kZSwgdm9pZCAqcnFzdHAsCitycGNhdXRoX3Vud3JhcF9yZXNwKHN0cnVjdCBycGNfdGFzayAqdGFzaywga3hkcmRwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwKIAkJX19iZTMyICpkYXRhLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfcnFzdHAtPnJxX2NyZWQ7CkBAIC01ODksNyArNjA5LDcgQEAKIAkJcmV0dXJuIGNyZWQtPmNyX29wcy0+Y3J1bndyYXBfcmVzcCh0YXNrLCBkZWNvZGUsIHJxc3RwLAogCQkJCQkJICAgZGF0YSwgb2JqKTsKIAkvKiBCeSBkZWZhdWx0LCB3ZSBkZWNvZGUgdGhlIGFyZ3VtZW50cyBub3JtYWxseS4gKi8KLQlyZXR1cm4gZGVjb2RlKHJxc3RwLCBkYXRhLCBvYmopOworCXJldHVybiBycGNhdXRoX3Vud3JhcF9yZXFfZGVjb2RlKGRlY29kZSwgcnFzdHAsIGRhdGEsIG9iaik7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCmluZGV4IDM4MzVjZTMuLjQ1ZGJmMTUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKQEAgLTEyMzEsOSArMTIzMSwxOSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdm9pZCBnc3Nfd3JhcF9yZXFfZW5jb2RlKGt4ZHJlcHJvY190IGVuY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQlfX2JlMzIgKnAsIHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJxc3RwLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGUocnFzdHAsICZ4ZHIsIG9iaik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50CiBnc3Nfd3JhcF9yZXFfaW50ZWcoc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4LAotCQlreGRycHJvY190IGVuY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCisJCSAgIGt4ZHJlcHJvY190IGVuY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJICAgX19iZTMyICpwLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHhkcl9idWYJKnNuZF9idWYgPSAmcnFzdHAtPnJxX3NuZF9idWY7CiAJc3RydWN0IHhkcl9idWYJaW50ZWdfYnVmOwpAQCAtMTI0OSw5ICsxMjU5LDcgQEAKIAlvZmZzZXQgPSAodTggKilwIC0gKHU4ICopc25kX2J1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKIAkqcCsrID0gaHRvbmwocnFzdHAtPnJxX3NlcW5vKTsKIAotCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOworCWdzc193cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKIAogCWlmICh4ZHJfYnVmX3N1YnNlZ21lbnQoc25kX2J1ZiwgJmludGVnX2J1ZiwKIAkJCQlvZmZzZXQsIHNuZF9idWYtPmxlbiAtIG9mZnNldCkpCkBAIC0xMzI1LDcgKzEzMzMsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludAogZ3NzX3dyYXBfcmVxX3ByaXYoc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgZ3NzX2NsX2N0eCAqY3R4LAotCQlreGRycHJvY190IGVuY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCisJCSAga3hkcmVwcm9jX3QgZW5jb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkgIF9fYmUzMiAqcCwgdm9pZCAqb2JqKQogewogCXN0cnVjdCB4ZHJfYnVmCSpzbmRfYnVmID0gJnJxc3RwLT5ycV9zbmRfYnVmOwogCXUzMgkJb2Zmc2V0OwpAQCAtMTM0Miw5ICsxMzUxLDcgQEAKIAlvZmZzZXQgPSAodTggKilwIC0gKHU4ICopc25kX2J1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKIAkqcCsrID0gaHRvbmwocnFzdHAtPnJxX3NlcW5vKTsKIAotCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gc3RhdHVzOworCWdzc193cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKIAogCXN0YXR1cyA9IGFsbG9jX2VuY19wYWdlcyhycXN0cCk7CiAJaWYgKHN0YXR1cykKQEAgLTEzOTQsNyArMTQwMSw3IEBACiAKIHN0YXRpYyBpbnQKIGdzc193cmFwX3JlcShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssCi0JICAgICBreGRycHJvY190IGVuY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqb2JqKQorCSAgICAga3hkcmVwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfcnFzdHAtPnJxX2NyZWQ7CiAJc3RydWN0IGdzc19jcmVkCSpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsCkBAIC0xNDA3LDEyICsxNDE0LDE0IEBACiAJCS8qIFRoZSBzcGVjIHNlZW1zIGEgbGl0dGxlIGFtYmlndW91cyBoZXJlLCBidXQgSSB0aGluayB0aGF0IG5vdAogCQkgKiB3cmFwcGluZyBjb250ZXh0IGRlc3RydWN0aW9uIHJlcXVlc3RzIG1ha2VzIHRoZSBtb3N0IHNlbnNlLgogCQkgKi8KLQkJc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOworCQlnc3Nfd3JhcF9yZXFfZW5jb2RlKGVuY29kZSwgcnFzdHAsIHAsIG9iaik7CisJCXN0YXR1cyA9IDA7CiAJCWdvdG8gb3V0OwogCX0KIAlzd2l0Y2ggKGdzc19jcmVkLT5nY19zZXJ2aWNlKSB7CiAJCWNhc2UgUlBDX0dTU19TVkNfTk9ORToKLQkJCXN0YXR1cyA9IGVuY29kZShycXN0cCwgcCwgb2JqKTsKKwkJCWdzc193cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKKwkJCXN0YXR1cyA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBSUENfR1NTX1NWQ19JTlRFR1JJVFk6CiAJCQlzdGF0dXMgPSBnc3Nfd3JhcF9yZXFfaW50ZWcoY3JlZCwgY3R4LCBlbmNvZGUsCkBAIC0xNDk0LDEwICsxNTAzLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK2dzc191bndyYXBfcmVxX2RlY29kZShreGRyZHByb2NfdCBkZWNvZGUsIHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCSAgICAgIF9fYmUzMiAqcCwgdm9pZCAqb2JqKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXJldHVybiBkZWNvZGUocnFzdHAsICZ4ZHIsIG9iaik7Cit9CiAKIHN0YXRpYyBpbnQKIGdzc191bndyYXBfcmVzcChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssCi0JCWt4ZHJwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCisJCWt4ZHJkcHJvY190IGRlY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqcCwgdm9pZCAqb2JqKQogewogCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IHRhc2stPnRrX3Jxc3RwLT5ycV9jcmVkOwogCXN0cnVjdCBnc3NfY3JlZCAqZ3NzX2NyZWQgPSBjb250YWluZXJfb2YoY3JlZCwgc3RydWN0IGdzc19jcmVkLApAQCAtMTUyOCw3ICsxNTQ2LDcgQEAKIAljcmVkLT5jcl9hdXRoLT5hdV9yc2xhY2sgPSBjcmVkLT5jcl9hdXRoLT5hdV92ZXJmc2l6ZSArIChwIC0gc2F2ZWRwKQogCQkJCQkJKyAoc2F2ZWRsZW4gLSBoZWFkLT5pb3ZfbGVuKTsKIG91dF9kZWNvZGU6Ci0Jc3RhdHVzID0gZGVjb2RlKHJxc3RwLCBwLCBvYmopOworCXN0YXR1cyA9IGdzc191bndyYXBfcmVxX2RlY29kZShkZWNvZGUsIHJxc3RwLCBwLCBvYmopOwogb3V0OgogCWdzc19wdXRfY3R4KGN0eCk7CiAJZHByaW50aygiUlBDOiAlNXUgZ3NzX3Vud3JhcF9yZXNwIHJldHVybmluZyAlZFxuIiwgdGFzay0+dGtfcGlkLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9jcnlwdG8uYyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfY3J5cHRvLmMKaW5kZXggNzVlZTk5My4uOTU3NmYzNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9jcnlwdG8uYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19rcmI1X2NyeXB0by5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAkJbXNfdXNhZ2UgPSAxMzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIEVJTlZBTDs7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzYWx0WzBdID0gKG1zX3VzYWdlID4+IDApICYgMHhmZjsKIAlzYWx0WzFdID0gKG1zX3VzYWdlID4+IDgpICYgMHhmZjsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCBkZWMyYTZmLi5iY2RhZTc4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC02Nyw3ICs2Nyw2IEBACiAKICNkZWZpbmUJUlNJX0hBU0hCSVRTCTYKICNkZWZpbmUJUlNJX0hBU0hNQVgJKDE8PFJTSV9IQVNIQklUUykKLSNkZWZpbmUJUlNJX0hBU0hNQVNLCShSU0lfSEFTSE1BWC0xKQogCiBzdHJ1Y3QgcnNpIHsKIAlzdHJ1Y3QgY2FjaGVfaGVhZAloOwpAQCAtMzE5LDcgKzMxOCw2IEBACiAKICNkZWZpbmUJUlNDX0hBU0hCSVRTCTEwCiAjZGVmaW5lCVJTQ19IQVNITUFYCSgxPDxSU0NfSEFTSEJJVFMpCi0jZGVmaW5lCVJTQ19IQVNITUFTSwkoUlNDX0hBU0hNQVgtMSkKIAogI2RlZmluZSBHU1NfU0VRX1dJTgkxMjgKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9iY19zdmMuYyBiL25ldC9zdW5ycGMvYmNfc3ZjLmMKaW5kZXggN2RjZmUwYy4uMWRkMWE2OCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9iY19zdmMuYworKysgYi9uZXQvc3VucnBjL2JjX3N2Yy5jCkBAIC01OSw4ICs1OSw4IEBACiAJCXJldCA9IHRhc2stPnRrX3N0YXR1czsKIAkJcnBjX3B1dF90YXNrKHRhc2spOwogCX0KLQlyZXR1cm4gcmV0OwogCWRwcmludGsoIlJQQzogICAgICAgYmNfc2VuZCByZXQ9ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2FjaGUuYyBiL25ldC9zdW5ycGMvY2FjaGUuYwppbmRleCBlNDMzZTc1Li43MmFkODM2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NhY2hlLmMKKysrIGIvbmV0L3N1bnJwYy9jYWNoZS5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNkZWZpbmUJIFJQQ0RCR19GQUNJTElUWSBSUENEQkdfQ0FDSEUKIAotc3RhdGljIHZvaWQgY2FjaGVfZGVmZXJfcmVxKHN0cnVjdCBjYWNoZV9yZXEgKnJlcSwgc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0pOworc3RhdGljIGJvb2wgY2FjaGVfZGVmZXJfcmVxKHN0cnVjdCBjYWNoZV9yZXEgKnJlcSwgc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0pOwogc3RhdGljIHZvaWQgY2FjaGVfcmV2aXNpdF9yZXF1ZXN0KHN0cnVjdCBjYWNoZV9oZWFkICppdGVtKTsKIAogc3RhdGljIHZvaWQgY2FjaGVfaW5pdChzdHJ1Y3QgY2FjaGVfaGVhZCAqaCkKQEAgLTEyOCw2ICsxMjgsNyBAQAogewogCWhlYWQtPmV4cGlyeV90aW1lID0gZXhwaXJ5OwogCWhlYWQtPmxhc3RfcmVmcmVzaCA9IHNlY29uZHNfc2luY2VfYm9vdCgpOworCXNtcF93bWIoKTsgLyogcGFpcmVkIHdpdGggc21wX3JtYigpIGluIGNhY2hlX2lzX3ZhbGlkKCkgKi8KIAlzZXRfYml0KENBQ0hFX1ZBTElELCAmaGVhZC0+ZmxhZ3MpOwogfQogCkBAIC0yMDgsMTEgKzIwOSwzNiBAQAogCQkvKiBlbnRyeSBpcyB2YWxpZCAqLwogCQlpZiAodGVzdF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZoLT5mbGFncykpCiAJCQlyZXR1cm4gLUVOT0VOVDsKLQkJZWxzZQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiBJbiBjb21iaW5hdGlvbiB3aXRoIHdyaXRlIGJhcnJpZXIgaW4KKwkJCSAqIHN1bnJwY19jYWNoZV91cGRhdGUsIGVuc3VyZXMgdGhhdCBhbnlvbmUKKwkJCSAqIHVzaW5nIHRoZSBjYWNoZSBlbnRyeSBhZnRlciB0aGlzIHNlZXMgdGhlCisJCQkgKiB1cGRhdGVkIGNvbnRlbnRzOgorCQkJICovCisJCQlzbXBfcm1iKCk7CiAJCQlyZXR1cm4gMDsKKwkJfQogCX0KIH0KIAorc3RhdGljIGludCB0cnlfdG9fbmVnYXRlX2VudHJ5KHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCwgc3RydWN0IGNhY2hlX2hlYWQgKmgpCit7CisJaW50IHJ2OworCisJd3JpdGVfbG9jaygmZGV0YWlsLT5oYXNoX2xvY2spOworCXJ2ID0gY2FjaGVfaXNfdmFsaWQoZGV0YWlsLCBoKTsKKwlpZiAocnYgIT0gLUVBR0FJTikgeworCQl3cml0ZV91bmxvY2soJmRldGFpbC0+aGFzaF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlzZXRfYml0KENBQ0hFX05FR0FUSVZFLCAmaC0+ZmxhZ3MpOworCWNhY2hlX2ZyZXNoX2xvY2tlZChoLCBzZWNvbmRzX3NpbmNlX2Jvb3QoKStDQUNIRV9ORVdfRVhQSVJZKTsKKwl3cml0ZV91bmxvY2soJmRldGFpbC0+aGFzaF9sb2NrKTsKKwljYWNoZV9mcmVzaF91bmxvY2tlZChoLCBkZXRhaWwpOworCXJldHVybiAtRU5PRU5UOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBjYWNoZSBtYW5hZ2VtZW50IHJvdXRpbmUgZm9yIGFsbAogICogdGhlIGF1dGhlbnRpY2F0aW9uIGNhY2hlcy4KQEAgLTI1MSwxNCArMjc3LDggQEAKIAkJCWNhc2UgLUVJTlZBTDoKIAkJCQljbGVhcl9iaXQoQ0FDSEVfUEVORElORywgJmgtPmZsYWdzKTsKIAkJCQljYWNoZV9yZXZpc2l0X3JlcXVlc3QoaCk7Ci0JCQkJaWYgKHJ2ID09IC1FQUdBSU4pIHsKLQkJCQkJc2V0X2JpdChDQUNIRV9ORUdBVElWRSwgJmgtPmZsYWdzKTsKLQkJCQkJY2FjaGVfZnJlc2hfbG9ja2VkKGgsIHNlY29uZHNfc2luY2VfYm9vdCgpK0NBQ0hFX05FV19FWFBJUlkpOwotCQkJCQljYWNoZV9mcmVzaF91bmxvY2tlZChoLCBkZXRhaWwpOwotCQkJCQlydiA9IC1FTk9FTlQ7Ci0JCQkJfQorCQkJCXJ2ID0gdHJ5X3RvX25lZ2F0ZV9lbnRyeShkZXRhaWwsIGgpOwogCQkJCWJyZWFrOwotCiAJCQljYXNlIC1FQUdBSU46CiAJCQkJY2xlYXJfYml0KENBQ0hFX1BFTkRJTkcsICZoLT5mbGFncyk7CiAJCQkJY2FjaGVfcmV2aXNpdF9yZXF1ZXN0KGgpOwpAQCAtMjY4LDkgKzI4OCwxMSBAQAogCX0KIAogCWlmIChydiA9PSAtRUFHQUlOKSB7Ci0JCWNhY2hlX2RlZmVyX3JlcShycXN0cCwgaCk7Ci0JCWlmICghdGVzdF9iaXQoQ0FDSEVfUEVORElORywgJmgtPmZsYWdzKSkgewotCQkJLyogUmVxdWVzdCBpcyBub3QgZGVmZXJyZWQgKi8KKwkJaWYgKCFjYWNoZV9kZWZlcl9yZXEocnFzdHAsIGgpKSB7CisJCQkvKgorCQkJICogUmVxdWVzdCB3YXMgbm90IGRlZmVycmVkOyBoYW5kbGUgaXQgYXMgYmVzdAorCQkJICogd2UgY2FuIG91cnNlbHZlczoKKwkJCSAqLwogCQkJcnYgPSBjYWNoZV9pc192YWxpZChkZXRhaWwsIGgpOwogCQkJaWYgKHJ2ID09IC1FQUdBSU4pCiAJCQkJcnYgPSAtRVRJTUVET1VUOwpAQCAtNjE4LDE4ICs2NDAsMTkgQEAKIAkJZGlzY2FyZC0+cmV2aXNpdChkaXNjYXJkLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgY2FjaGVfZGVmZXJfcmVxKHN0cnVjdCBjYWNoZV9yZXEgKnJlcSwgc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0pCisvKiBSZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiBhIGRlZmVycmVkIHJlcXVlc3QgaXMgcXVldWVkLiAqLworc3RhdGljIGJvb2wgY2FjaGVfZGVmZXJfcmVxKHN0cnVjdCBjYWNoZV9yZXEgKnJlcSwgc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0pCiB7CiAJc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSAqZHJlcTsKIAogCWlmIChyZXEtPnRocmVhZF93YWl0KSB7CiAJCWNhY2hlX3dhaXRfcmVxKHJlcSwgaXRlbSk7CiAJCWlmICghdGVzdF9iaXQoQ0FDSEVfUEVORElORywgJml0ZW0tPmZsYWdzKSkKLQkJCXJldHVybjsKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAJZHJlcSA9IHJlcS0+ZGVmZXIocmVxKTsKIAlpZiAoZHJlcSA9PSBOVUxMKQotCQlyZXR1cm47CisJCXJldHVybiBmYWxzZTsKIAlzZXR1cF9kZWZlcnJhbChkcmVxLCBpdGVtLCAxKTsKIAlpZiAoIXRlc3RfYml0KENBQ0hFX1BFTkRJTkcsICZpdGVtLT5mbGFncykpCiAJCS8qIEJpdCBjb3VsZCBoYXZlIGJlZW4gY2xlYXJlZCBiZWZvcmUgd2UgbWFuYWdlZCB0bwpAQCAtNjM4LDYgKzY2MSw3IEBACiAJCWNhY2hlX3JldmlzaXRfcmVxdWVzdChpdGVtKTsKIAogCWNhY2hlX2xpbWl0X2RlZmVycygpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBjYWNoZV9yZXZpc2l0X3JlcXVlc3Qoc3RydWN0IGNhY2hlX2hlYWQgKml0ZW0pCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5jCmluZGV4IDkyY2U5NGYuLjU3ZDM0NGMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2xudC5jCisrKyBiL25ldC9zdW5ycGMvY2xudC5jCkBAIC0xMDk1LDcgKzEwOTUsNyBAQAogcnBjX3hkcl9lbmNvZGUoc3RydWN0IHJwY190YXNrICp0YXNrKQogewogCXN0cnVjdCBycGNfcnFzdAkqcmVxID0gdGFzay0+dGtfcnFzdHA7Ci0Ja3hkcnByb2NfdAllbmNvZGU7CisJa3hkcmVwcm9jX3QJZW5jb2RlOwogCV9fYmUzMgkJKnA7CiAKIAlkcHJpbnRfc3RhdHVzKHRhc2spOwpAQCAtMTUzNSw3ICsxNTM1LDcgQEAKIHsKIAlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSB0YXNrLT50a19jbGllbnQ7CiAJc3RydWN0IHJwY19ycXN0CSpyZXEgPSB0YXNrLT50a19ycXN0cDsKLQlreGRycHJvY190CWRlY29kZSA9IHRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9kZWNvZGU7CisJa3hkcmRwcm9jX3QJZGVjb2RlID0gdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX2RlY29kZTsKIAlfX2JlMzIJCSpwOwogCiAJZHByaW50aygiUlBDOiAlNXUgY2FsbF9kZWNvZGUgKHN0YXR1cyAlZClcbiIsCkBAIC0xNzc2LDEyICsxNzc2LDExIEBACiAJZ290byBvdXRfZ2FyYmFnZTsKIH0KIAotc3RhdGljIGludCBycGNwcm9jX2VuY29kZV9udWxsKHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKK3N0YXRpYyB2b2lkIHJwY3Byb2NfZW5jb2RlX251bGwodm9pZCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKm9iaikKIHsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBycGNwcm9jX2RlY29kZV9udWxsKHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKK3N0YXRpYyBpbnQgcnBjcHJvY19kZWNvZGVfbnVsbCh2b2lkICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqb2JqKQogewogCXJldHVybiAwOwogfQpAQCAtMTgzMCwyMyArMTgyOSwxNSBAQAogCQkJICBjb25zdCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCiB7CiAJY29uc3QgY2hhciAqcnBjX3dhaXRxID0gIm5vbmUiOwotCWNoYXIgKnAsIGFjdGlvbltLU1lNX1NZTUJPTF9MRU5dOwogCiAJaWYgKFJQQ19JU19RVUVVRUQodGFzaykpCiAJCXJwY193YWl0cSA9IHJwY19xbmFtZSh0YXNrLT50a193YWl0cXVldWUpOwogCi0JLyogbWFwIHRrX2FjdGlvbiBwb2ludGVyIHRvIGEgZnVuY3Rpb24gbmFtZTsgdGhlbiB0cmltIG9mZgotCSAqIHRoZSAiKzB4MCBbc3VucnBjXSIgKi8KLQlzcHJpbnRfc3ltYm9sKGFjdGlvbiwgKHVuc2lnbmVkIGxvbmcpdGFzay0+dGtfYWN0aW9uKTsKLQlwID0gc3RyY2hyKGFjdGlvbiwgJysnKTsKLQlpZiAocCkKLQkJKnAgPSAnXDAnOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiJTV1ICUwNHggJTZkICU4cCAlOHAgJThsZCAlOHAgJXN2JXUgJXMgYTolcyBxOiVzXG4iLAorCXByaW50ayhLRVJOX0lORk8gIiU1dSAlMDR4ICU2ZCAlOHAgJThwICU4bGQgJThwICVzdiV1ICVzIGE6JXBzIHE6JXNcbiIsCiAJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfZmxhZ3MsIHRhc2stPnRrX3N0YXR1cywKIAkJY2xudCwgdGFzay0+dGtfcnFzdHAsIHRhc2stPnRrX3RpbWVvdXQsIHRhc2stPnRrX29wcywKIAkJY2xudC0+Y2xfcHJvdG5hbWUsIGNsbnQtPmNsX3ZlcnMsIHJwY19wcm9jX25hbWUodGFzayksCi0JCWFjdGlvbiwgcnBjX3dhaXRxKTsKKwkJdGFzay0+dGtfYWN0aW9uLCBycGNfd2FpdHEpOwogfQogCiB2b2lkIHJwY19zaG93X3Rhc2tzKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY19waXBlLmMgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKaW5kZXggMDlmMDFmNC4uNzJiYzUzNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCisrKyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwpAQCAtNDc0LDcgKzQ3NCw3IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAotCUJVR19PTighZF91bmhhc2hlZChkZW50cnkpKTsKKwlkX2Ryb3AoZGVudHJ5KTsKIAlpbm9kZSA9IHJwY19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dF9lcnI7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jIGIvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYwppbmRleCBmYTZkN2NhLi5jNjUyZTRjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY2JfY2xudC5jCisrKyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKQEAgLTU3LDEwICs1Nyw2IEBACiAJUlBDQlBST0NfR0VUU1RBVCwKIH07CiAKLSNkZWZpbmUgUlBDQl9ISUdIUFJPQ18yCQlSUENCUFJPQ19DQUxMSVQKLSNkZWZpbmUgUlBDQl9ISUdIUFJPQ18zCQlSUENCUFJPQ19UQUREUjJVQUREUgotI2RlZmluZSBSUENCX0hJR0hQUk9DXzQJCVJQQ0JQUk9DX0dFVFNUQVQKLQogLyoKICAqIHJfb3duZXIKICAqCkBAIC02OTMsNDYgKzY4OSwzNyBAQAogICogWERSIGZ1bmN0aW9ucyBmb3IgcnBjYmluZAogICovCiAKLXN0YXRpYyBpbnQgcnBjYl9lbmNfbWFwcGluZyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQkJICAgIGNvbnN0IHN0cnVjdCBycGNiaW5kX2FyZ3MgKnJwY2IpCitzdGF0aWMgdm9pZCBycGNiX2VuY19tYXBwaW5nKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQogewogCXN0cnVjdCBycGNfdGFzayAqdGFzayA9IHJlcS0+cnFfdGFzazsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJX19iZTMyICpwOwogCiAJZHByaW50aygiUlBDOiAlNXUgZW5jb2RpbmcgUE1BUF8lcyBjYWxsICgldSwgJXUsICVkLCAldSlcbiIsCiAJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9uYW1lLAogCQkJcnBjYi0+cl9wcm9nLCBycGNiLT5yX3ZlcnMsIHJwY2ItPnJfcHJvdCwgcnBjYi0+cl9wb3J0KTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQotCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSgmeGRyLCBzaXplb2YoX19iZTMyKSAqIFJQQ0JfbWFwcGluZ2FyZ3Nfc3opOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQotCSpwKysgPSBodG9ubChycGNiLT5yX3Byb2cpOwotCSpwKysgPSBodG9ubChycGNiLT5yX3ZlcnMpOwotCSpwKysgPSBodG9ubChycGNiLT5yX3Byb3QpOwotCSpwICAgPSBodG9ubChycGNiLT5yX3BvcnQpOwotCi0JcmV0dXJuIDA7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgUlBDQl9tYXBwaW5nYXJnc19zeiA8PCAyKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIocnBjYi0+cl9wcm9nKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIocnBjYi0+cl92ZXJzKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIocnBjYi0+cl9wcm90KTsKKwkqcCAgID0gY3B1X3RvX2JlMzIocnBjYi0+cl9wb3J0KTsKIH0KIAotc3RhdGljIGludCBycGNiX2RlY19nZXRwb3J0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCitzdGF0aWMgaW50IHJwY2JfZGVjX2dldHBvcnQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkgICAgc3RydWN0IHJwY2JpbmRfYXJncyAqcnBjYikKIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2sgPSByZXEtPnJxX3Rhc2s7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXVuc2lnbmVkIGxvbmcgcG9ydDsKLQotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKKwlfX2JlMzIgKnA7CiAKIAlycGNiLT5yX3BvcnQgPSAwOwogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIHNpemVvZihfX2JlMzIpKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlwb3J0ID0gbnRvaGwoKnApOworCXBvcnQgPSBiZTMyX3RvX2NwdXAocCk7CiAJZHByaW50aygiUlBDOiAlNXUgUE1BUF8lcyByZXN1bHQ6ICVsdVxuIiwgdGFzay0+dGtfcGlkLAogCQkJdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX25hbWUsIHBvcnQpOwogCWlmICh1bmxpa2VseShwb3J0ID4gVVNIUlRfTUFYKSkKQEAgLTc0MiwyMCArNzI5LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcnBjYl9kZWNfc2V0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCitzdGF0aWMgaW50IHJwY2JfZGVjX3NldChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCXVuc2lnbmVkIGludCAqYm9vbHApCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrID0gcmVxLT5ycV90YXNrOwotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlfX2JlMzIgKnA7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7Ci0KLQlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgc2l6ZW9mKF9fYmUzMikpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKIAogCSpib29scCA9IDA7Ci0JaWYgKCpwKQorCWlmICgqcCAhPSB4ZHJfemVybykKIAkJKmJvb2xwID0gMTsKIAogCWRwcmludGsoIlJQQzogJTV1IFJQQ0JfJXMgY2FsbCAlc1xuIiwKQEAgLTc2NCw3MyArNzQ5LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW5jb2RlX3JwY2Jfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQljb25zdCB1MzIgbWF4c3RybGVuKQorc3RhdGljIHZvaWQgZW5jb2RlX3JwY2Jfc3RyaW5nKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGNoYXIgKnN0cmluZywKKwkJCSAgICAgICBjb25zdCB1MzIgbWF4c3RybGVuKQogewotCXUzMiBsZW47CiAJX19iZTMyICpwOworCXUzMiBsZW47CiAKLQlpZiAodW5saWtlbHkoc3RyaW5nID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKIAlsZW4gPSBzdHJsZW4oc3RyaW5nKTsKLQlpZiAodW5saWtlbHkobGVuID4gbWF4c3RybGVuKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBzaXplb2YoX19iZTMyKSArIGxlbik7Ci0JaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlPOworCUJVR19PTihsZW4gPiBtYXhzdHJsZW4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW4pOwogCXhkcl9lbmNvZGVfb3BhcXVlKHAsIHN0cmluZywgbGVuKTsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJwY2JfZW5jX2dldGFkZHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQorc3RhdGljIHZvaWQgcnBjYl9lbmNfZ2V0YWRkcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHJwY2JpbmRfYXJncyAqcnBjYikKIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2sgPSByZXEtPnJxX3Rhc2s7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOworCV9fYmUzMiAqcDsKIAogCWRwcmludGsoIlJQQzogJTV1IGVuY29kaW5nIFJQQ0JfJXMgY2FsbCAoJXUsICV1LCAnJXMnLCAnJXMnKVxuIiwKIAkJCXRhc2stPnRrX3BpZCwgdGFzay0+dGtfbXNnLnJwY19wcm9jLT5wX25hbWUsCiAJCQlycGNiLT5yX3Byb2csIHJwY2ItPnJfdmVycywKIAkJCXJwY2ItPnJfbmV0aWQsIHJwY2ItPnJfYWRkcik7CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgKFJQQ0JfcHJvZ3JhbV9zeiArIFJQQ0JfdmVyc2lvbl9zeikgPDwgMik7CisJKnArKyA9IGNwdV90b19iZTMyKHJwY2ItPnJfcHJvZyk7CisJKnAgPSBjcHVfdG9fYmUzMihycGNiLT5yX3ZlcnMpOwogCi0JcCA9IHhkcl9yZXNlcnZlX3NwYWNlKCZ4ZHIsCi0JCQlzaXplb2YoX19iZTMyKSAqIChSUENCX3Byb2dyYW1fc3ogKyBSUENCX3ZlcnNpb25fc3opKTsKLQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGh0b25sKHJwY2ItPnJfcHJvZyk7Ci0JKnAgPSBodG9ubChycGNiLT5yX3ZlcnMpOwotCi0JaWYgKGVuY29kZV9ycGNiX3N0cmluZygmeGRyLCBycGNiLT5yX25ldGlkLCBSUENCSU5EX01BWE5FVElETEVOKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKGVuY29kZV9ycGNiX3N0cmluZygmeGRyLCBycGNiLT5yX2FkZHIsIFJQQ0JJTkRfTUFYVUFERFJMRU4pKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAoZW5jb2RlX3JwY2Jfc3RyaW5nKCZ4ZHIsIHJwY2ItPnJfb3duZXIsIFJQQ0JfTUFYT1dORVJMRU4pKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOworCWVuY29kZV9ycGNiX3N0cmluZyh4ZHIsIHJwY2ItPnJfbmV0aWQsIFJQQ0JJTkRfTUFYTkVUSURMRU4pOworCWVuY29kZV9ycGNiX3N0cmluZyh4ZHIsIHJwY2ItPnJfYWRkciwgUlBDQklORF9NQVhVQUREUkxFTik7CisJZW5jb2RlX3JwY2Jfc3RyaW5nKHhkciwgcnBjYi0+cl9vd25lciwgUlBDQl9NQVhPV05FUkxFTik7CiB9CiAKLXN0YXRpYyBpbnQgcnBjYl9kZWNfZ2V0YWRkcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBycGNiX2RlY19nZXRhZGRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJICAgIHN0cnVjdCBycGNiaW5kX2FyZ3MgKnJwY2IpCiB7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzczsKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2sgPSByZXEtPnJxX3Rhc2s7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOworCV9fYmUzMiAqcDsKIAl1MzIgbGVuOwogCiAJcnBjYi0+cl9wb3J0ID0gMDsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSgmeGRyLCBzaXplb2YoX19iZTMyKSk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCWdvdG8gb3V0X2ZhaWw7Ci0JbGVuID0gbnRvaGwoKnApOworCWxlbiA9IGJlMzJfdG9fY3B1cChwKTsKIAogCS8qCiAJICogSWYgdGhlIHJldHVybmVkIHVuaXZlcnNhbCBhZGRyZXNzIGlzIGEgbnVsbCBzdHJpbmcsCkBAIC04NDUsNyArODEwLDcgQEAKIAlpZiAodW5saWtlbHkobGVuID4gUlBDQklORF9NQVhVQUREUkxFTikpCiAJCWdvdG8gb3V0X2ZhaWw7CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgbGVuKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBsZW4pOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlnb3RvIG91dF9mYWlsOwogCWRwcmludGsoIlJQQzogJTV1IFJQQ0JfJXMgcmVwbHk6ICVzXG4iLCB0YXNrLT50a19waWQsCkBAIC04NzEsOCArODM2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvIHJwY2JfcHJvY2VkdXJlczJbXSA9IHsKIAlbUlBDQlBST0NfU0VUXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19TRVQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX21hcHBpbmcsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX3NldCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX21hcHBpbmcsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19zZXQsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfbWFwcGluZ2FyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0Jfc2V0cmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfU0VULApAQCAtODgxLDggKzg0Niw4IEBACiAJfSwKIAlbUlBDQlBST0NfVU5TRVRdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX1VOU0VULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19tYXBwaW5nLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19zZXQsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19tYXBwaW5nLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfc2V0LAogCQkucF9hcmdsZW4JPSBSUENCX21hcHBpbmdhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX3NldHJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX1VOU0VULApAQCAtODkxLDggKzg1Niw4IEBACiAJfSwKIAlbUlBDQlBST0NfR0VUUE9SVF0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfR0VUUE9SVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfbWFwcGluZywKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfZ2V0cG9ydCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX21hcHBpbmcsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19nZXRwb3J0LAogCQkucF9hcmdsZW4JPSBSUENCX21hcHBpbmdhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX2dldHBvcnRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19HRVRQT1JULApAQCAtOTA0LDggKzg2OSw4IEBACiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBycGNiX3Byb2NlZHVyZXMzW10gPSB7CiAJW1JQQ0JQUk9DX1NFVF0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfU0VULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19nZXRhZGRyLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19zZXQsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19nZXRhZGRyLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfc2V0LAogCQkucF9hcmdsZW4JPSBSUENCX2dldGFkZHJhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX3NldHJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX1NFVCwKQEAgLTkxNCw4ICs4NzksOCBAQAogCX0sCiAJW1JQQ0JQUk9DX1VOU0VUXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19VTlNFVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfc2V0LAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX3NldCwKIAkJLnBfYXJnbGVuCT0gUlBDQl9nZXRhZGRyYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9zZXRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19VTlNFVCwKQEAgLTkyNCw4ICs4ODksOCBAQAogCX0sCiAJW1JQQ0JQUk9DX0dFVEFERFJdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX0dFVEFERFIsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX2dldGFkZHIsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX2dldGFkZHIsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19nZXRhZGRyLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfZ2V0YWRkciwKIAkJLnBfYXJnbGVuCT0gUlBDQl9nZXRhZGRyYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9nZXRhZGRycmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfR0VUQUREUiwKQEAgLTkzNyw4ICs5MDIsOCBAQAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gcnBjYl9wcm9jZWR1cmVzNFtdID0gewogCVtSUENCUFJPQ19TRVRdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX1NFVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfc2V0LAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX3NldCwKIAkJLnBfYXJnbGVuCT0gUlBDQl9nZXRhZGRyYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9zZXRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19TRVQsCkBAIC05NDcsOCArOTEyLDggQEAKIAl9LAogCVtSUENCUFJPQ19VTlNFVF0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfVU5TRVQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX2dldGFkZHIsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX3NldCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX2dldGFkZHIsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19zZXQsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfZ2V0YWRkcmFyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0Jfc2V0cmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfVU5TRVQsCkBAIC05NTcsOCArOTIyLDggQEAKIAl9LAogCVtSUENCUFJPQ19HRVRBRERSXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19HRVRBRERSLAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19nZXRhZGRyLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19nZXRhZGRyLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX2dldGFkZHIsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfZ2V0YWRkcmFyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0JfZ2V0YWRkcnJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX0dFVEFERFIsCkBAIC05OTMsMTkgKzk1OCwxOSBAQAogCiBzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uIHJwY2JfdmVyc2lvbjIgPSB7CiAJLm51bWJlcgkJPSBSUENCVkVSU18yLAotCS5ucnByb2NzCT0gUlBDQl9ISUdIUFJPQ18yLAorCS5ucnByb2NzCT0gQVJSQVlfU0laRShycGNiX3Byb2NlZHVyZXMyKSwKIAkucHJvY3MJCT0gcnBjYl9wcm9jZWR1cmVzMgogfTsKIAogc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiBycGNiX3ZlcnNpb24zID0gewogCS5udW1iZXIJCT0gUlBDQlZFUlNfMywKLQkubnJwcm9jcwk9IFJQQ0JfSElHSFBST0NfMywKKwkubnJwcm9jcwk9IEFSUkFZX1NJWkUocnBjYl9wcm9jZWR1cmVzMyksCiAJLnByb2NzCQk9IHJwY2JfcHJvY2VkdXJlczMKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gcnBjYl92ZXJzaW9uNCA9IHsKIAkubnVtYmVyCQk9IFJQQ0JWRVJTXzQsCi0JLm5ycHJvY3MJPSBSUENCX0hJR0hQUk9DXzQsCisJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKHJwY2JfcHJvY2VkdXJlczQpLAogCS5wcm9jcwkJPSBycGNiX3Byb2NlZHVyZXM0CiB9OwogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Yy5jIGIvbmV0L3N1bnJwYy9zdmMuYwppbmRleCA2MzU5YzQyLi4wOGUwNWE4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvc3ZjLmMKQEAgLTQ4OCwxMCArNDg4LDYgQEAKIAlpZiAoc3ZjX3NlcnZfaXNfcG9vbGVkKHNlcnYpKQogCQlzdmNfcG9vbF9tYXBfcHV0KCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKLQlzdmNfc29ja19kZXN0cm95KHNlcnYtPmJjX3hwcnQpOwotI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwotCiAJc3ZjX3VucmVnaXN0ZXIoc2Vydik7CiAJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOwogCWtmcmVlKHNlcnYpOwpAQCAtMTAwNSw2ICsxMDAxLDcgQEAKIAlycXN0cC0+cnFfc3BsaWNlX29rID0gMTsKIAkvKiBXaWxsIGJlIHR1cm5lZCBvZmYgb25seSB3aGVuIE5GU3Y0IFNlc3Npb25zIGFyZSB1c2VkICovCiAJcnFzdHAtPnJxX3VzZWRlZmVycmFsID0gMTsKKwlycXN0cC0+cnFfZHJvcG1lID0gZmFsc2U7CiAKIAkvKiBTZXR1cCByZXBseSBoZWFkZXIgKi8KIAlycXN0cC0+cnFfeHBydC0+eHB0X29wcy0+eHBvX3ByZXBfcmVwbHlfaGRyKHJxc3RwKTsKQEAgLTExMDYsNyArMTEwMyw3IEBACiAJCSpzdGF0cCA9IHByb2NwLT5wY19mdW5jKHJxc3RwLCBycXN0cC0+cnFfYXJncCwgcnFzdHAtPnJxX3Jlc3ApOwogCiAJCS8qIEVuY29kZSByZXBseSAqLwotCQlpZiAoKnN0YXRwID09IHJwY19kcm9wX3JlcGx5KSB7CisJCWlmIChycXN0cC0+cnFfZHJvcG1lKSB7CiAJCQlpZiAocHJvY3AtPnBjX3JlbGVhc2UpCiAJCQkJcHJvY3AtPnBjX3JlbGVhc2UocnFzdHAsIE5VTEwsIHJxc3RwLT5ycV9yZXNwKTsKIAkJCWdvdG8gZHJvcGl0OwpAQCAtMTE0Nyw3ICsxMTQ0LDYgQEAKICBkcm9waXQ6CiAJc3ZjX2F1dGhvcmlzZShycXN0cCk7CS8qIGRvZXNuJ3QgaHVydCB0byBjYWxsIHRoaXMgdHdpY2UgKi8KIAlkcHJpbnRrKCJzdmM6IHN2Y19wcm9jZXNzIGRyb3BpdFxuIik7Ci0Jc3ZjX2Ryb3AocnFzdHApOwogCXJldHVybiAwOwogCiBlcnJfc2hvcnRfbGVuOgpAQCAtMTIxOCw3ICsxMjE0LDYgQEAKIAlzdHJ1Y3Qga3ZlYwkJKnJlc3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdOwogCXN0cnVjdCBzdmNfc2VydgkJKnNlcnYgPSBycXN0cC0+cnFfc2VydmVyOwogCXUzMgkJCWRpcjsKLQlpbnQJCQllcnJvcjsKIAogCS8qCiAJICogU2V0dXAgcmVzcG9uc2UgeGRyX2J1Zi4KQEAgLTEyNDYsMTEgKzEyNDEsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JZXJyb3IgPSBzdmNfcHJvY2Vzc19jb21tb24ocnFzdHAsIGFyZ3YsIHJlc3YpOwotCWlmIChlcnJvciA8PSAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlyZXR1cm4gc3ZjX3NlbmQocnFzdHApOworCS8qIFJldHVybnMgMSBmb3Igc2VuZCwgMCBmb3IgZHJvcCAqLworCWlmIChzdmNfcHJvY2Vzc19jb21tb24ocnFzdHAsIGFyZ3YsIHJlc3YpKQorCQlyZXR1cm4gc3ZjX3NlbmQocnFzdHApOworCWVsc2UgeworCQlzdmNfZHJvcChycXN0cCk7CisJCXJldHVybiAwOworCX0KIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQpAQCAtMTI2NCwxMCArMTI2MSw5IEBACiB7CiAJc3RydWN0IGt2ZWMJKmFyZ3YgPSAmcnFzdHAtPnJxX2FyZy5oZWFkWzBdOwogCXN0cnVjdCBrdmVjCSpyZXN2ID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXTsKLQlpbnQgCQllcnJvcjsKIAogCS8qIEJ1aWxkIHRoZSBzdmNfcnFzdCB1c2VkIGJ5IHRoZSBjb21tb24gcHJvY2Vzc2luZyByb3V0aW5lICovCi0JcnFzdHAtPnJxX3hwcnQgPSBzZXJ2LT5iY194cHJ0OworCXJxc3RwLT5ycV94cHJ0ID0gc2Vydi0+c3ZfYmNfeHBydDsKIAlycXN0cC0+cnFfeGlkID0gcmVxLT5ycV94aWQ7CiAJcnFzdHAtPnJxX3Byb3QgPSByZXEtPnJxX3hwcnQtPnByb3Q7CiAJcnFzdHAtPnJxX3NlcnZlciA9IHNlcnY7CkBAIC0xMjkyLDEyICsxMjg4LDE1IEBACiAJc3ZjX2dldHUzMihhcmd2KTsJLyogWElEICovCiAJc3ZjX2dldG5sKGFyZ3YpOwkvKiBDQUxMRElSICovCiAKLQllcnJvciA9IHN2Y19wcm9jZXNzX2NvbW1vbihycXN0cCwgYXJndiwgcmVzdik7Ci0JaWYgKGVycm9yIDw9IDApCi0JCXJldHVybiBlcnJvcjsKLQotCW1lbWNweSgmcmVxLT5ycV9zbmRfYnVmLCAmcnFzdHAtPnJxX3Jlcywgc2l6ZW9mKHJlcS0+cnFfc25kX2J1ZikpOwotCXJldHVybiBiY19zZW5kKHJlcSk7CisJLyogUmV0dXJucyAxIGZvciBzZW5kLCAwIGZvciBkcm9wICovCisJaWYgKHN2Y19wcm9jZXNzX2NvbW1vbihycXN0cCwgYXJndiwgcmVzdikpIHsKKwkJbWVtY3B5KCZyZXEtPnJxX3NuZF9idWYsICZycXN0cC0+cnFfcmVzLAorCQkJCQkJc2l6ZW9mKHJlcS0+cnFfc25kX2J1ZikpOworCQlyZXR1cm4gYmNfc2VuZChyZXEpOworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgdG8gZG8gdG8gZHJvcCByZXF1ZXN0ICovCisJCXJldHVybiAwOworCX0KIH0KIEVYUE9SVF9TWU1CT0woYmNfc3ZjX3Byb2Nlc3MpOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCmluZGV4IDNmMmM1NTUuLmFiODZiNzkgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYworKysgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjX3hwcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94cHJ0Lmg+CiAKICNkZWZpbmUgUlBDREJHX0ZBQ0lMSVRZCVJQQ0RCR19TVkNYUFJUCiAKQEAgLTEyOCw2ICsxMjksOSBAQAogCWlmICh0ZXN0X2JpdChYUFRfQ0FDSEVfQVVUSCwgJnhwcnQtPnhwdF9mbGFncykpCiAJCXN2Y2F1dGhfdW5peF9pbmZvX3JlbGVhc2UoeHBydCk7CiAJcHV0X25ldCh4cHJ0LT54cHRfbmV0KTsKKwkvKiBTZWUgY29tbWVudCBvbiBjb3JyZXNwb25kaW5nIGdldCBpbiB4c19zZXR1cF9iY190Y3AoKTogKi8KKwlpZiAoeHBydC0+eHB0X2JjX3hwcnQpCisJCXhwcnRfcHV0KHhwcnQtPnhwdF9iY194cHJ0KTsKIAl4cHJ0LT54cHRfb3BzLT54cG9fZnJlZSh4cHJ0KTsKIAltb2R1bGVfcHV0KG93bmVyKTsKIH0KQEAgLTMwMyw2ICszMDcsMTUgQEAKIAlsaXN0X2RlbCgmcnFzdHAtPnJxX2xpc3QpOwogfQogCitzdGF0aWMgYm9vbCBzdmNfeHBydF9oYXNfc29tZXRoaW5nX3RvX2RvKHN0cnVjdCBzdmNfeHBydCAqeHBydCkKK3sKKwlpZiAoeHBydC0+eHB0X2ZsYWdzICYgKCgxPDxYUFRfQ09OTil8KDE8PFhQVF9DTE9TRSkpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoeHBydC0+eHB0X2ZsYWdzICYgKCgxPDxYUFRfREFUQSl8KDE8PFhQVF9ERUZFUlJFRCkpKQorCQlyZXR1cm4geHBydC0+eHB0X29wcy0+eHBvX2hhc193c3BhY2UoeHBydCk7CisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogUXVldWUgdXAgYSB0cmFuc3BvcnQgd2l0aCBkYXRhIHBlbmRpbmcuIElmIHRoZXJlIGFyZSBpZGxlIG5mc2QKICAqIHByb2Nlc3Nlcywgd2FrZSAnZW0gdXAuCkBAIC0zMTUsOCArMzI4LDcgQEAKIAlzdHJ1Y3Qgc3ZjX3Jxc3QJKnJxc3RwOwogCWludCBjcHU7CiAKLQlpZiAoISh4cHJ0LT54cHRfZmxhZ3MgJgotCSAgICAgICgoMTw8WFBUX0NPTk4pfCgxPDxYUFRfREFUQSl8KDE8PFhQVF9DTE9TRSl8KDE8PFhQVF9ERUZFUlJFRCkpKSkKKwlpZiAoIXN2Y194cHJ0X2hhc19zb21ldGhpbmdfdG9fZG8oeHBydCkpCiAJCXJldHVybjsKIAogCWNwdSA9IGdldF9jcHUoKTsKQEAgLTM0MywyOCArMzU1LDcgQEAKIAkJZHByaW50aygic3ZjOiB0cmFuc3BvcnQgJXAgYnVzeSwgbm90IGVucXVldWVkXG4iLCB4cHJ0KTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQlCVUdfT04oeHBydC0+eHB0X3Bvb2wgIT0gTlVMTCk7Ci0JeHBydC0+eHB0X3Bvb2wgPSBwb29sOwogCi0JLyogSGFuZGxlIHBlbmRpbmcgY29ubmVjdGlvbiAqLwotCWlmICh0ZXN0X2JpdChYUFRfQ09OTiwgJnhwcnQtPnhwdF9mbGFncykpCi0JCWdvdG8gcHJvY2VzczsKLQotCS8qIEhhbmRsZSBjbG9zZSBpbi1wcm9ncmVzcyAqLwotCWlmICh0ZXN0X2JpdChYUFRfQ0xPU0UsICZ4cHJ0LT54cHRfZmxhZ3MpKQotCQlnb3RvIHByb2Nlc3M7Ci0KLQkvKiBDaGVjayBpZiB3ZSBoYXZlIHNwYWNlIHRvIHJlcGx5IHRvIGEgcmVxdWVzdCAqLwotCWlmICgheHBydC0+eHB0X29wcy0+eHBvX2hhc193c3BhY2UoeHBydCkpIHsKLQkJLyogRG9uJ3QgZW5xdWV1ZSB3aGlsZSBub3QgZW5vdWdoIHNwYWNlIGZvciByZXBseSAqLwotCQlkcHJpbnRrKCJzdmM6IG5vIHdyaXRlIHNwYWNlLCB0cmFuc3BvcnQgJXAgIG5vdCBlbnF1ZXVlZFxuIiwKLQkJCXhwcnQpOwotCQl4cHJ0LT54cHRfcG9vbCA9IE5VTEw7Ci0JCWNsZWFyX2JpdChYUFRfQlVTWSwgJnhwcnQtPnhwdF9mbGFncyk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLSBwcm9jZXNzOgogCWlmICghbGlzdF9lbXB0eSgmcG9vbC0+c3BfdGhyZWFkcykpIHsKIAkJcnFzdHAgPSBsaXN0X2VudHJ5KHBvb2wtPnNwX3RocmVhZHMubmV4dCwKIAkJCQkgICBzdHJ1Y3Qgc3ZjX3Jxc3QsCkBAIC0zODEsMTMgKzM3MiwxMSBAQAogCQlycXN0cC0+cnFfcmVzZXJ2ZWQgPSBzZXJ2LT5zdl9tYXhfbWVzZzsKIAkJYXRvbWljX2FkZChycXN0cC0+cnFfcmVzZXJ2ZWQsICZ4cHJ0LT54cHRfcmVzZXJ2ZWQpOwogCQlwb29sLT5zcF9zdGF0cy50aHJlYWRzX3dva2VuKys7Ci0JCUJVR19PTih4cHJ0LT54cHRfcG9vbCAhPSBwb29sKTsKIAkJd2FrZV91cCgmcnFzdHAtPnJxX3dhaXQpOwogCX0gZWxzZSB7CiAJCWRwcmludGsoInN2YzogdHJhbnNwb3J0ICVwIHB1dCBpbnRvIHF1ZXVlXG4iLCB4cHJ0KTsKIAkJbGlzdF9hZGRfdGFpbCgmeHBydC0+eHB0X3JlYWR5LCAmcG9vbC0+c3Bfc29ja2V0cyk7CiAJCXBvb2wtPnNwX3N0YXRzLnNvY2tldHNfcXVldWVkKys7Ci0JCUJVR19PTih4cHJ0LT54cHRfcG9vbCAhPSBwb29sKTsKIAl9CiAKIG91dF91bmxvY2s6CkBAIC00MjYsNyArNDE1LDYgQEAKIHZvaWQgc3ZjX3hwcnRfcmVjZWl2ZWQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KQogewogCUJVR19PTighdGVzdF9iaXQoWFBUX0JVU1ksICZ4cHJ0LT54cHRfZmxhZ3MpKTsKLQl4cHJ0LT54cHRfcG9vbCA9IE5VTEw7CiAJLyogQXMgc29vbiBhcyB3ZSBjbGVhciBidXN5LCB0aGUgeHBydCBjb3VsZCBiZSBjbG9zZWQgYW5kCiAJICogJ3B1dCcsIHNvIHdlIG5lZWQgYSByZWZlcmVuY2UgdG8gY2FsbCBzdmNfeHBydF9lbnF1ZXVlIHdpdGg6CiAJICovCkBAIC03MjIsNyArNzEwLDEwIEBACiAJaWYgKHRlc3RfYml0KFhQVF9DTE9TRSwgJnhwcnQtPnhwdF9mbGFncykpIHsKIAkJZHByaW50aygic3ZjX3JlY3Y6IGZvdW5kIFhQVF9DTE9TRVxuIik7CiAJCXN2Y19kZWxldGVfeHBydCh4cHJ0KTsKLQl9IGVsc2UgaWYgKHRlc3RfYml0KFhQVF9MSVNURU5FUiwgJnhwcnQtPnhwdF9mbGFncykpIHsKKwkJLyogTGVhdmUgWFBUX0JVU1kgc2V0IG9uIHRoZSBkZWFkIHhwcnQ6ICovCisJCWdvdG8gb3V0OworCX0KKwlpZiAodGVzdF9iaXQoWFBUX0xJU1RFTkVSLCAmeHBydC0+eHB0X2ZsYWdzKSkgewogCQlzdHJ1Y3Qgc3ZjX3hwcnQgKm5ld3hwdDsKIAkJbmV3eHB0ID0geHBydC0+eHB0X29wcy0+eHBvX2FjY2VwdCh4cHJ0KTsKIAkJaWYgKG5ld3hwdCkgewpAQCAtNzQ3LDI4ICs3MzgsMjMgQEAKIAkJCXNwaW5fdW5sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKIAkJCXN2Y194cHJ0X3JlY2VpdmVkKG5ld3hwdCk7CiAJCX0KLQkJc3ZjX3hwcnRfcmVjZWl2ZWQoeHBydCk7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHhwcnQtPnhwdF9vcHMtPnhwb19oYXNfd3NwYWNlKHhwcnQpKSB7CiAJCWRwcmludGsoInN2Yzogc2VydmVyICVwLCBwb29sICV1LCB0cmFuc3BvcnQgJXAsIGludXNlPSVkXG4iLAogCQkJcnFzdHAsIHBvb2wtPnNwX2lkLCB4cHJ0LAogCQkJYXRvbWljX3JlYWQoJnhwcnQtPnhwdF9yZWYucmVmY291bnQpKTsKIAkJcnFzdHAtPnJxX2RlZmVycmVkID0gc3ZjX2RlZmVycmVkX2RlcXVldWUoeHBydCk7Ci0JCWlmIChycXN0cC0+cnFfZGVmZXJyZWQpIHsKLQkJCXN2Y194cHJ0X3JlY2VpdmVkKHhwcnQpOworCQlpZiAocnFzdHAtPnJxX2RlZmVycmVkKQogCQkJbGVuID0gc3ZjX2RlZmVycmVkX3JlY3YocnFzdHApOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlsZW4gPSB4cHJ0LT54cHRfb3BzLT54cG9fcmVjdmZyb20ocnFzdHApOwotCQkJc3ZjX3hwcnRfcmVjZWl2ZWQoeHBydCk7Ci0JCX0KIAkJZHByaW50aygic3ZjOiBnb3QgbGVuPSVkXG4iLCBsZW4pOwogCX0KKwlzdmNfeHBydF9yZWNlaXZlZCh4cHJ0KTsKIAogCS8qIE5vIGRhdGEsIGluY29tcGxldGUgKFRDUCkgcmVhZCwgb3IgYWNjZXB0KCkgKi8KLQlpZiAobGVuID09IDAgfHwgbGVuID09IC1FQUdBSU4pIHsKLQkJcnFzdHAtPnJxX3Jlcy5sZW4gPSAwOwotCQlzdmNfeHBydF9yZWxlYXNlKHJxc3RwKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQorCWlmIChsZW4gPT0gMCB8fCBsZW4gPT0gLUVBR0FJTikKKwkJZ290byBvdXQ7CisKIAljbGVhcl9iaXQoWFBUX09MRCwgJnhwcnQtPnhwdF9mbGFncyk7CiAKIAlycXN0cC0+cnFfc2VjdXJlID0gc3ZjX3BvcnRfaXNfcHJpdmlsZWdlZChzdmNfYWRkcihycXN0cCkpOwpAQCAtNzc3LDYgKzc2MywxMCBAQAogCWlmIChzZXJ2LT5zdl9zdGF0cykKIAkJc2Vydi0+c3Zfc3RhdHMtPm5ldGNudCsrOwogCXJldHVybiBsZW47CitvdXQ6CisJcnFzdHAtPnJxX3Jlcy5sZW4gPSAwOworCXN2Y194cHJ0X3JlbGVhc2UocnFzdHApOworCXJldHVybiAtRUFHQUlOOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3JlY3YpOwogCkBAIC05MzUsNyArOTI1LDEyIEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoWFBUX0JVU1ksICZ4cHJ0LT54cHRfZmxhZ3MpKQogCQkvKiBzb21lb25lIGVsc2Ugd2lsbCBoYXZlIHRvIGVmZmVjdCB0aGUgY2xvc2UgKi8KIAkJcmV0dXJuOwotCisJLyoKKwkgKiBXZSBleHBlY3Qgc3ZjX2Nsb3NlX3hwcnQoKSB0byB3b3JrIGV2ZW4gd2hlbiBubyB0aHJlYWRzIGFyZQorCSAqIHJ1bm5pbmcgKGUuZy4sIHdoaWxlIGNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIgYmVmb3JlIHN0YXJ0aW5nCisJICogYW55IHRocmVhZHMpLCBzbyBpZiB0aGUgdHJhbnNwb3J0IGlzbid0IGJ1c3ksIHdlIGRlbGV0ZQorCSAqIGl0IG91cnNlbGY6CisJICovCiAJc3ZjX2RlbGV0ZV94cHJ0KHhwcnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2Nsb3NlX3hwcnQpOwpAQCAtOTQ1LDE2ICs5NDAsMTYgQEAKIAlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQ7CiAJc3RydWN0IHN2Y194cHJ0ICp0bXA7CiAKKwkvKgorCSAqIFRoZSBzZXJ2ZXIgaXMgc2h1dHRpbmcgZG93biwgYW5kIG5vIG1vcmUgdGhyZWFkcyBhcmUgcnVubmluZy4KKwkgKiBzdmNfeHBydF9lbnF1ZXVlKCkgbWlnaHQgc3RpbGwgYmUgcnVubmluZywgYnV0IGF0IHdvcnN0IGl0CisJICogd2lsbCByZS1hZGQgdGhlIHhwcnQgdG8gc3Bfc29ja2V0cywgd2hpY2ggd2lsbCBzb29uIGdldAorCSAqIGZyZWVkLiAgU28gd2UgZG9uJ3QgYm90aGVyIHdpdGggYW55IG1vcmUgbG9ja2luZywgYW5kIGRvbid0CisJICogbGVhdmUgdGhlIGNsb3NlIHRvIHRoZSAobm9uZXhpc3RlbnQpIHNlcnZlciB0aHJlYWRzOgorCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh4cHJ0LCB0bXAsIHhwcnRfbGlzdCwgeHB0X2xpc3QpIHsKIAkJc2V0X2JpdChYUFRfQ0xPU0UsICZ4cHJ0LT54cHRfZmxhZ3MpOwotCQlpZiAodGVzdF9iaXQoWFBUX0JVU1ksICZ4cHJ0LT54cHRfZmxhZ3MpKSB7Ci0JCQkvKiBXYWl0aW5nIHRvIGJlIHByb2Nlc3NlZCwgYnV0IG5vIHRocmVhZHMgbGVmdCwKLQkJCSAqIFNvIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhlIHdhaXRpbmcgbGlzdAotCQkJICovCi0JCQlsaXN0X2RlbF9pbml0KCZ4cHJ0LT54cHRfcmVhZHkpOwotCQkJY2xlYXJfYml0KFhQVF9CVVNZLCAmeHBydC0+eHB0X2ZsYWdzKTsKLQkJfQotCQlzdmNfY2xvc2VfeHBydCh4cHJ0KTsKKwkJc3ZjX2RlbGV0ZV94cHJ0KHhwcnQpOwogCX0KIH0KIApAQCAtMTAyOCw2ICsxMDIzLDcgQEAKIAl9CiAJc3ZjX3hwcnRfZ2V0KHJxc3RwLT5ycV94cHJ0KTsKIAlkci0+eHBydCA9IHJxc3RwLT5ycV94cHJ0OworCXJxc3RwLT5ycV9kcm9wbWUgPSB0cnVlOwogCiAJZHItPmhhbmRsZS5yZXZpc2l0ID0gc3ZjX3JldmlzaXQ7CiAJcmV0dXJuICZkci0+aGFuZGxlOwpAQCAtMTA2NSwxNCArMTA2MSwxMyBAQAogCWlmICghdGVzdF9iaXQoWFBUX0RFRkVSUkVELCAmeHBydC0+eHB0X2ZsYWdzKSkKIAkJcmV0dXJuIE5VTEw7CiAJc3Bpbl9sb2NrKCZ4cHJ0LT54cHRfbG9jayk7Ci0JY2xlYXJfYml0KFhQVF9ERUZFUlJFRCwgJnhwcnQtPnhwdF9mbGFncyk7CiAJaWYgKCFsaXN0X2VtcHR5KCZ4cHJ0LT54cHRfZGVmZXJyZWQpKSB7CiAJCWRyID0gbGlzdF9lbnRyeSh4cHJ0LT54cHRfZGVmZXJyZWQubmV4dCwKIAkJCQlzdHJ1Y3Qgc3ZjX2RlZmVycmVkX3JlcSwKIAkJCQloYW5kbGUucmVjZW50KTsKIAkJbGlzdF9kZWxfaW5pdCgmZHItPmhhbmRsZS5yZWNlbnQpOwotCQlzZXRfYml0KFhQVF9ERUZFUlJFRCwgJnhwcnQtPnhwdF9mbGFncyk7Ci0JfQorCX0gZWxzZQorCQljbGVhcl9iaXQoWFBUX0RFRkVSUkVELCAmeHBydC0+eHB0X2ZsYWdzKTsKIAlzcGluX3VubG9jaygmeHBydC0+eHB0X2xvY2spOwogCXJldHVybiBkcjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKaW5kZXggNGU5MzkzYy4uNzk2MzU2OSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoLmMKQEAgLTExOCw3ICsxMTgsNiBAQAogCiAjZGVmaW5lCUROX0hBU0hCSVRTCTYKICNkZWZpbmUJRE5fSEFTSE1BWAkoMTw8RE5fSEFTSEJJVFMpCi0jZGVmaW5lCUROX0hBU0hNQVNLCShETl9IQVNITUFYLTEpCiAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlhdXRoX2RvbWFpbl90YWJsZVtETl9IQVNITUFYXTsKIHN0YXRpYyBzcGlubG9ja190CWF1dGhfZG9tYWluX2xvY2sgPQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKaW5kZXggNTYwNjc3ZC4uMzA5MTZiMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCkBAIC0zMCw3ICszMCw5IEBACiAKIHN0cnVjdCB1bml4X2RvbWFpbiB7CiAJc3RydWN0IGF1dGhfZG9tYWluCWg7CisjaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAogCWludAlhZGRyX2NoYW5nZXM7CisjZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwogCS8qIG90aGVyIHN0dWZmIGxhdGVyICovCiB9OwogCkBAIC02NCw3ICs2Niw5IEBACiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQluZXctPmguZmxhdm91ciA9ICZzdmNhdXRoX3VuaXg7CisjaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAogCQluZXctPmFkZHJfY2hhbmdlcyA9IDA7CisjZW5kaWYgLyogQ09ORklHX05GU0RfREVQUkVDQVRFRCAqLwogCQlydiA9IGF1dGhfZG9tYWluX2xvb2t1cChuYW1lLCAmbmV3LT5oKTsKIAl9CiB9CkBAIC04NSwxNCArODksMTUgQEAKICAqLwogI2RlZmluZQlJUF9IQVNIQklUUwk4CiAjZGVmaW5lCUlQX0hBU0hNQVgJKDE8PElQX0hBU0hCSVRTKQotI2RlZmluZQlJUF9IQVNITUFTSwkoSVBfSEFTSE1BWC0xKQogCiBzdHJ1Y3QgaXBfbWFwIHsKIAlzdHJ1Y3QgY2FjaGVfaGVhZAloOwogCWNoYXIJCQltX2NsYXNzWzhdOyAvKiBlLmcuICJuZnNkIiAqLwogCXN0cnVjdCBpbjZfYWRkcgkJbV9hZGRyOwogCXN0cnVjdCB1bml4X2RvbWFpbgkqbV9jbGllbnQ7CisjaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAogCWludAkJCW1fYWRkX2NoYW5nZTsKKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9ERVBSRUNBVEVEICovCiB9OwogCiBzdGF0aWMgdm9pZCBpcF9tYXBfcHV0KHN0cnVjdCBrcmVmICprcmVmKQpAQCAtMTQ2LDcgKzE1MSw5IEBACiAKIAlrcmVmX2dldCgmaXRlbS0+bV9jbGllbnQtPmgucmVmKTsKIAluZXctPm1fY2xpZW50ID0gaXRlbS0+bV9jbGllbnQ7CisjaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAogCW5ldy0+bV9hZGRfY2hhbmdlID0gaXRlbS0+bV9hZGRfY2hhbmdlOworI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KIH0KIHN0YXRpYyBzdHJ1Y3QgY2FjaGVfaGVhZCAqaXBfbWFwX2FsbG9jKHZvaWQpCiB7CkBAIC0zMzEsNiArMzM4LDcgQEAKIAlpcC5oLmZsYWdzID0gMDsKIAlpZiAoIXVkb20pCiAJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZpcC5oLmZsYWdzKTsKKyNpZmRlZiBDT05GSUdfTkZTRF9ERVBSRUNBVEVECiAJZWxzZSB7CiAJCWlwLm1fYWRkX2NoYW5nZSA9IHVkb20tPmFkZHJfY2hhbmdlczsKIAkJLyogaWYgdGhpcyBpcyBmcm9tIHRoZSBsZWdhY3kgc2V0X2NsaWVudCBzeXN0ZW0gY2FsbCwKQEAgLTMzOSw2ICszNDcsNyBAQAogCQlpZiAoZXhwaXJ5ID09IE5FVkVSKQogCQkJaXAubV9hZGRfY2hhbmdlKys7CiAJfQorI2VuZGlmIC8qIENPTkZJR19ORlNEX0RFUFJFQ0FURUQgKi8KIAlpcC5oLmV4cGlyeV90aW1lID0gZXhwaXJ5OwogCWNoID0gc3VucnBjX2NhY2hlX3VwZGF0ZShjZCwgJmlwLmgsICZpcG0tPmgsCiAJCQkJIGhhc2hfc3RyKGlwbS0+bV9jbGFzcywgSVBfSEFTSEJJVFMpIF4KQEAgLTM1OCw2ICszNjcsNyBAQAogCXJldHVybiBfX2lwX21hcF91cGRhdGUoc24tPmlwX21hcF9jYWNoZSwgaXBtLCB1ZG9tLCBleHBpcnkpOwogfQogCisjaWZkZWYgQ09ORklHX05GU0RfREVQUkVDQVRFRAogaW50IGF1dGhfdW5peF9hZGRfYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBpbjZfYWRkciAqYWRkciwgc3RydWN0IGF1dGhfZG9tYWluICpkb20pCiB7CiAJc3RydWN0IHVuaXhfZG9tYWluICp1ZG9tOwpAQCAtNDAyLDggKzQxMiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJaWYgKChpcG0tPm1fY2xpZW50LT5hZGRyX2NoYW5nZXMgLSBpcG0tPm1fYWRkX2NoYW5nZSkgPjApIHsKLQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZpcG0tPmguZmxhZ3MpID09IDApCi0JCQlhdXRoX2RvbWFpbl9wdXQoJmlwbS0+bV9jbGllbnQtPmgpOworCQlzdW5ycGNfaW52YWxpZGF0ZSgmaXBtLT5oLCBzbi0+aXBfbWFwX2NhY2hlKTsKIAkJcnYgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXJ2ID0gJmlwbS0+bV9jbGllbnQtPmg7CkBAIC00MTMsNiArNDIyLDcgQEAKIAlyZXR1cm4gcnY7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhdXRoX3VuaXhfbG9va3VwKTsKKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9ERVBSRUNBVEVEICovCiAKIHZvaWQgc3ZjYXV0aF91bml4X3B1cmdlKHZvaWQpCiB7CkBAIC00OTcsNyArNTA3LDYgQEAKICAqLwogI2RlZmluZQlHSURfSEFTSEJJVFMJOAogI2RlZmluZQlHSURfSEFTSE1BWAkoMTw8R0lEX0hBU0hCSVRTKQotI2RlZmluZQlHSURfSEFTSE1BU0sJKEdJRF9IQVNITUFYIC0gMSkKIAogc3RydWN0IHVuaXhfZ2lkIHsKIAlzdHJ1Y3QgY2FjaGVfaGVhZAloOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCAwNzkxOWUxLi43YmQzYmJiIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtNjYsNiArNjYsMTMgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19jcmVhdGVfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsCiAJCQkJCSAgc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwKIAkJCQkJICBpbnQsIGludCk7CisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCitzdGF0aWMgc3RydWN0IHN2Y194cHJ0ICpzdmNfYmNfY3JlYXRlX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKiwgaW50LAorCQkJCQkgICAgIHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2thZGRyICosCisJCQkJCSAgICAgaW50LCBpbnQpOworc3RhdGljIHZvaWQgc3ZjX2JjX3NvY2tfZnJlZShzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQpOworI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLworCiAjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgc3ZjX2tleVsyXTsKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgc3ZjX3Nsb2NrX2tleVsyXTsKQEAgLTMyNCwxOSArMzMxLDIxIEBACiAJCQlsZW4gPSBvbmVsZW47CiAJCQlicmVhazsKIAkJfQotCQlpZiAodG9jbG9zZSAmJiBzdHJjbXAodG9jbG9zZSwgYnVmICsgbGVuKSA9PSAwKQorCQlpZiAodG9jbG9zZSAmJiBzdHJjbXAodG9jbG9zZSwgYnVmICsgbGVuKSA9PSAwKSB7CiAJCQljbG9zZXNrID0gc3ZzazsKLQkJZWxzZQorCQkJc3ZjX3hwcnRfZ2V0KCZjbG9zZXNrLT5za194cHJ0KTsKKwkJfSBlbHNlCiAJCQlsZW4gKz0gb25lbGVuOwogCX0KIAlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CiAKLQlpZiAoY2xvc2VzaykKKwlpZiAoY2xvc2VzaykgewogCQkvKiBTaG91bGQgdW5yZWdpc3RlciB3aXRoIHBvcnRtYXAsIGJ1dCB5b3UgY2Fubm90CiAJCSAqIHVucmVnaXN0ZXIganVzdCBvbmUgcHJvdG9jb2wuLi4KIAkJICovCiAJCXN2Y19jbG9zZV94cHJ0KCZjbG9zZXNrLT5za194cHJ0KTsKLQllbHNlIGlmICh0b2Nsb3NlKQorCQlzdmNfeHBydF9wdXQoJmNsb3Nlc2stPnNrX3hwcnQpOworCX0gZWxzZSBpZiAodG9jbG9zZSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTk4NSwxNSArOTk0LDE3IEBACiAJCXZlY1swXSA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXTsKIAl9IGVsc2UgewogCQkvKiBSRVBMWSAqLwotCQlpZiAoc3Zzay0+c2tfYmNfeHBydCkKLQkJCXJlcSA9IHhwcnRfbG9va3VwX3Jxc3Qoc3Zzay0+c2tfYmNfeHBydCwgeGlkKTsKKwkJc3RydWN0IHJwY194cHJ0ICpiY194cHJ0ID0gc3Zzay0+c2tfeHBydC54cHRfYmNfeHBydDsKKworCQlpZiAoYmNfeHBydCkKKwkJCXJlcSA9IHhwcnRfbG9va3VwX3Jxc3QoYmNfeHBydCwgeGlkKTsKIAogCQlpZiAoIXJlcSkgewogCQkJcHJpbnRrKEtFUk5fTk9USUNFCiAJCQkJIiVzOiBHb3QgdW5yZWNvZ25pemVkIHJlcGx5OiAiCi0JCQkJImNhbGxkaXIgMHgleCBza19iY194cHJ0ICVwIHhpZCAlMDh4XG4iLAorCQkJCSJjYWxsZGlyIDB4JXggeHB0X2JjX3hwcnQgJXAgeGlkICUwOHhcbiIsCiAJCQkJX19mdW5jX18sIG50b2hsKGNhbGxkaXIpLAotCQkJCXN2c2stPnNrX2JjX3hwcnQsIHhpZCk7CisJCQkJYmNfeHBydCwgeGlkKTsKIAkJCXZlY1swXSA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMTg0LDYgKzExOTUsNTcgQEAKIAlyZXR1cm4gc3ZjX2NyZWF0ZV9zb2NrZXQoc2VydiwgSVBQUk9UT19UQ1AsIG5ldCwgc2EsIHNhbGVuLCBmbGFncyk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19iY19jcmVhdGVfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsCisJCQkJCSAgICAgc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCQkJICAgICBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBzdmNfYmNfc29ja19mcmVlKHN0cnVjdCBzdmNfeHBydCAqeHBydCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19iY190Y3BfY3JlYXRlKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKKwkJCQkgICAgICAgc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgc2FsZW4sCisJCQkJICAgICAgIGludCBmbGFncykKK3sKKwlyZXR1cm4gc3ZjX2JjX2NyZWF0ZV9zb2NrZXQoc2VydiwgSVBQUk9UT19UQ1AsIG5ldCwgc2EsIHNhbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN2Y19iY190Y3Bfc29ja19kZXRhY2goc3RydWN0IHN2Y194cHJ0ICp4cHJ0KQoreworfQorCitzdGF0aWMgc3RydWN0IHN2Y194cHJ0X29wcyBzdmNfdGNwX2JjX29wcyA9IHsKKwkueHBvX2NyZWF0ZSA9IHN2Y19iY190Y3BfY3JlYXRlLAorCS54cG9fZGV0YWNoID0gc3ZjX2JjX3RjcF9zb2NrX2RldGFjaCwKKwkueHBvX2ZyZWUgPSBzdmNfYmNfc29ja19mcmVlLAorCS54cG9fcHJlcF9yZXBseV9oZHIgPSBzdmNfdGNwX3ByZXBfcmVwbHlfaGRyLAorfTsKKworc3RhdGljIHN0cnVjdCBzdmNfeHBydF9jbGFzcyBzdmNfdGNwX2JjX2NsYXNzID0geworCS54Y2xfbmFtZSA9ICJ0Y3AtYmMiLAorCS54Y2xfb3duZXIgPSBUSElTX01PRFVMRSwKKwkueGNsX29wcyA9ICZzdmNfdGNwX2JjX29wcywKKwkueGNsX21heF9wYXlsb2FkID0gUlBDU1ZDX01BWFBBWUxPQURfVENQLAorfTsKKworc3RhdGljIHZvaWQgc3ZjX2luaXRfYmNfeHBydF9zb2NrKHZvaWQpCit7CisJc3ZjX3JlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2JjX2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQgc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKHZvaWQpCit7CisJc3ZjX3VucmVnX3hwcnRfY2xhc3MoJnN2Y190Y3BfYmNfY2xhc3MpOworfQorI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCitzdGF0aWMgdm9pZCBzdmNfaW5pdF9iY194cHJ0X3NvY2sodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCisKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnRfb3BzIHN2Y190Y3Bfb3BzID0gewogCS54cG9fY3JlYXRlID0gc3ZjX3RjcF9jcmVhdGUsCiAJLnhwb19yZWN2ZnJvbSA9IHN2Y190Y3BfcmVjdmZyb20sCkBAIC0xMjA3LDEyICsxMjY5LDE0IEBACiB7CiAJc3ZjX3JlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2NsYXNzKTsKIAlzdmNfcmVnX3hwcnRfY2xhc3MoJnN2Y191ZHBfY2xhc3MpOworCXN2Y19pbml0X2JjX3hwcnRfc29jaygpOwogfQogCiB2b2lkIHN2Y19jbGVhbnVwX3hwcnRfc29jayh2b2lkKQogewogCXN2Y191bnJlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2NsYXNzKTsKIAlzdmNfdW5yZWdfeHBydF9jbGFzcygmc3ZjX3VkcF9jbGFzcyk7CisJc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN2Y190Y3BfaW5pdChzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2ssIHN0cnVjdCBzdmNfc2VydiAqc2VydikKQEAgLTE1MDksNDEgKzE1NzMsNDUgQEAKIAlrZnJlZShzdnNrKTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogLyoKLSAqIENyZWF0ZSBhIHN2Y194cHJ0LgotICoKLSAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSAoZS5nLiBuZnN2NC4xIGJhY2tjaGFubmVsKS4KLSAqIENhbGxlcnMgc2hvdWxkIHR5cGljYWxseSB1c2UgdGhlIHhwb19jcmVhdGUoKSBtZXRob2QuCisgKiBDcmVhdGUgYSBiYWNrIGNoYW5uZWwgc3ZjX3hwcnQgd2hpY2ggc2hhcmVzIHRoZSBmb3JlIGNoYW5uZWwgc29ja2V0LgogICovCi1zdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19zb2NrX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBwcm90KQorc3RhdGljIHN0cnVjdCBzdmNfeHBydCAqc3ZjX2JjX2NyZWF0ZV9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LAorCQkJCQkgICAgIGludCBwcm90b2NvbCwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICpzaW4sIGludCBsZW4sCisJCQkJCSAgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdmNfc29jayAqc3ZzazsKLQlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQgPSBOVUxMOworCXN0cnVjdCBzdmNfeHBydCAqeHBydDsKIAotCWRwcmludGsoInN2YzogJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAocHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ZjOiBvbmx5IFRDUCBzb2NrZXRzIgorCQkJIiBzdXBwb3J0ZWQgb24gc2hhcmVkIGJhY2sgY2hhbm5lbFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwogCXN2c2sgPSBremFsbG9jKHNpemVvZigqc3ZzayksIEdGUF9LRVJORUwpOwogCWlmICghc3ZzaykKLQkJZ290byBvdXQ7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJeHBydCA9ICZzdnNrLT5za194cHJ0OwotCWlmIChwcm90ID09IElQUFJPVE9fVENQKQotCQlzdmNfeHBydF9pbml0KCZzdmNfdGNwX2NsYXNzLCB4cHJ0LCBzZXJ2KTsKLQllbHNlIGlmIChwcm90ID09IElQUFJPVE9fVURQKQotCQlzdmNfeHBydF9pbml0KCZzdmNfdWRwX2NsYXNzLCB4cHJ0LCBzZXJ2KTsKLQllbHNlCi0JCUJVRygpOwotb3V0OgotCWRwcmludGsoInN2YzogJXMgcmV0dXJuICVwXG4iLCBfX2Z1bmNfXywgeHBydCk7CisJc3ZjX3hwcnRfaW5pdCgmc3ZjX3RjcF9iY19jbGFzcywgeHBydCwgc2Vydik7CisKKwlzZXJ2LT5zdl9iY194cHJ0ID0geHBydDsKKwogCXJldHVybiB4cHJ0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NvY2tfY3JlYXRlKTsKIAogLyoKLSAqIERlc3Ryb3kgYSBzdmNfc29jay4KKyAqIEZyZWUgYSBiYWNrIGNoYW5uZWwgc3ZjX3NvY2suCiAgKi8KLXZvaWQgc3ZjX3NvY2tfZGVzdHJveShzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQpCitzdGF0aWMgdm9pZCBzdmNfYmNfc29ja19mcmVlKHN0cnVjdCBzdmNfeHBydCAqeHBydCkKIHsKLQlpZiAoeHBydCkKKwlpZiAoeHBydCkgeworCQlrZnJlZSh4cHJ0LT54cHRfYmNfc2lkKTsKIAkJa2ZyZWUoY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzdmNfc29jaywgc2tfeHBydCkpOworCX0KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19zb2NrX2Rlc3Ryb3kpOworI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94ZHIuYyBiL25ldC9zdW5ycGMveGRyLmMKaW5kZXggY2Q5ZTg0MS4uNjc5Y2Q2NyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94ZHIuYworKysgYi9uZXQvc3VucnBjL3hkci5jCkBAIC01NTIsNiArNTUyLDc0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfd3JpdGVfcGFnZXMpOwogCitzdGF0aWMgdm9pZCB4ZHJfc2V0X2lvdihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3Qga3ZlYyAqaW92LAorCQlfX2JlMzIgKnAsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKGxlbiA+IGlvdi0+aW92X2xlbikKKwkJbGVuID0gaW92LT5pb3ZfbGVuOworCWlmIChwID09IE5VTEwpCisJCXAgPSAoX19iZTMyKilpb3YtPmlvdl9iYXNlOworCXhkci0+cCA9IHA7CisJeGRyLT5lbmQgPSAoX19iZTMyKikoaW92LT5pb3ZfYmFzZSArIGxlbik7CisJeGRyLT5pb3YgPSBpb3Y7CisJeGRyLT5wYWdlX3B0ciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgeGRyX3NldF9wYWdlX2Jhc2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IHBnbnI7CisJdW5zaWduZWQgaW50IG1heGxlbjsKKwl1bnNpZ25lZCBpbnQgcGdvZmY7CisJdW5zaWduZWQgaW50IHBnZW5kOworCXZvaWQgKmthZGRyOworCisJbWF4bGVuID0geGRyLT5idWYtPnBhZ2VfbGVuOworCWlmIChiYXNlID49IG1heGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWF4bGVuIC09IGJhc2U7CisJaWYgKGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCisJYmFzZSArPSB4ZHItPmJ1Zi0+cGFnZV9iYXNlOworCisJcGduciA9IGJhc2UgPj4gUEFHRV9TSElGVDsKKwl4ZHItPnBhZ2VfcHRyID0gJnhkci0+YnVmLT5wYWdlc1twZ25yXTsKKwlrYWRkciA9IHBhZ2VfYWRkcmVzcygqeGRyLT5wYWdlX3B0cik7CisKKwlwZ29mZiA9IGJhc2UgJiB+UEFHRV9NQVNLOworCXhkci0+cCA9IChfX2JlMzIqKShrYWRkciArIHBnb2ZmKTsKKworCXBnZW5kID0gcGdvZmYgKyBsZW47CisJaWYgKHBnZW5kID4gUEFHRV9TSVpFKQorCQlwZ2VuZCA9IFBBR0VfU0laRTsKKwl4ZHItPmVuZCA9IChfX2JlMzIqKShrYWRkciArIHBnZW5kKTsKKwl4ZHItPmlvdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhkcl9zZXRfbmV4dF9wYWdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJdW5zaWduZWQgaW50IG5ld2Jhc2U7CisKKwluZXdiYXNlID0gKDEgKyB4ZHItPnBhZ2VfcHRyIC0geGRyLT5idWYtPnBhZ2VzKSA8PCBQQUdFX1NISUZUOworCW5ld2Jhc2UgLT0geGRyLT5idWYtPnBhZ2VfYmFzZTsKKworCWlmICh4ZHJfc2V0X3BhZ2VfYmFzZSh4ZHIsIG5ld2Jhc2UsIFBBR0VfU0laRSkgPCAwKQorCQl4ZHJfc2V0X2lvdih4ZHIsIHhkci0+YnVmLT50YWlsLCBOVUxMLCB4ZHItPmJ1Zi0+bGVuKTsKK30KKworc3RhdGljIGJvb2wgeGRyX3NldF9uZXh0X2J1ZmZlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCWlmICh4ZHItPnBhZ2VfcHRyICE9IE5VTEwpCisJCXhkcl9zZXRfbmV4dF9wYWdlKHhkcik7CisJZWxzZSBpZiAoeGRyLT5pb3YgPT0geGRyLT5idWYtPmhlYWQpIHsKKwkJaWYgKHhkcl9zZXRfcGFnZV9iYXNlKHhkciwgMCwgUEFHRV9TSVpFKSA8IDApCisJCQl4ZHJfc2V0X2lvdih4ZHIsIHhkci0+YnVmLT50YWlsLCBOVUxMLCB4ZHItPmJ1Zi0+bGVuKTsKKwl9CisJcmV0dXJuIHhkci0+cCAhPSB4ZHItPmVuZDsKK30KKwogLyoqCiAgKiB4ZHJfaW5pdF9kZWNvZGUgLSBJbml0aWFsaXplIGFuIHhkcl9zdHJlYW0gZm9yIGRlY29kaW5nIGRhdGEuCiAgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CkBAIC01NjAsNDEgKzYyOCw2NyBAQAogICovCiB2b2lkIHhkcl9pbml0X2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBfX2JlMzIgKnApCiB7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IGJ1Zi0+aGVhZDsKLQl1bnNpZ25lZCBpbnQgbGVuID0gaW92LT5pb3ZfbGVuOwotCi0JaWYgKGxlbiA+IGJ1Zi0+bGVuKQotCQlsZW4gPSBidWYtPmxlbjsKIAl4ZHItPmJ1ZiA9IGJ1ZjsKLQl4ZHItPmlvdiA9IGlvdjsKLQl4ZHItPnAgPSBwOwotCXhkci0+ZW5kID0gKF9fYmUzMiAqKSgoY2hhciAqKWlvdi0+aW92X2Jhc2UgKyBsZW4pOworCXhkci0+c2NyYXRjaC5pb3ZfYmFzZSA9IE5VTEw7CisJeGRyLT5zY3JhdGNoLmlvdl9sZW4gPSAwOworCWlmIChidWYtPmhlYWRbMF0uaW92X2xlbiAhPSAwKQorCQl4ZHJfc2V0X2lvdih4ZHIsIGJ1Zi0+aGVhZCwgcCwgYnVmLT5sZW4pOworCWVsc2UgaWYgKGJ1Zi0+cGFnZV9sZW4gIT0gMCkKKwkJeGRyX3NldF9wYWdlX2Jhc2UoeGRyLCAwLCBidWYtPmxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5pdF9kZWNvZGUpOwogCi0vKioKLSAqIHhkcl9pbmxpbmVfcGVlayAtIEFsbG93IHJlYWQtYWhlYWQgaW4gdGhlIFhEUiBkYXRhIHN0cmVhbQotICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtIHN0cnVjdAotICogQG5ieXRlczogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gZGVjb2RlCi0gKgotICogQ2hlY2sgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0byBlbmFibGUgdXMgdG8gZGVjb2RlCi0gKiAnbmJ5dGVzJyBtb3JlIGJ5dGVzIG9mIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKiBJZiBzbyByZXR1cm4gdGhlIGN1cnJlbnQgcG9pbnRlciB3aXRob3V0IHVwZGF0aW5nIHRoZSBjdXJyZW50Ci0gKiBwb2ludGVyIHBvc2l0aW9uLgotICovCi1fX2JlMzIgKiB4ZHJfaW5saW5lX3BlZWsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcykKK3N0YXRpYyBfX2JlMzIgKiBfX3hkcl9pbmxpbmVfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCiB7CiAJX19iZTMyICpwID0geGRyLT5wOwogCV9fYmUzMiAqcSA9IHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpOwogCiAJaWYgKHVubGlrZWx5KHEgPiB4ZHItPmVuZCB8fCBxIDwgcCkpCiAJCXJldHVybiBOVUxMOworCXhkci0+cCA9IHE7CiAJcmV0dXJuIHA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5saW5lX3BlZWspOwogCiAvKioKLSAqIHhkcl9pbmxpbmVfZGVjb2RlIC0gUmV0cmlldmUgbm9uLXBhZ2UgWERSIGRhdGEgdG8gZGVjb2RlCisgKiB4ZHJfc2V0X3NjcmF0Y2hfYnVmZmVyIC0gQXR0YWNoIGEgc2NyYXRjaCBidWZmZXIgZm9yIGRlY29kaW5nIGRhdGEuCisgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CisgKiBAYnVmOiBwb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlcgorICogQGJ1Zmxlbjogc2l6ZSBvZiAnYnVmJworICoKKyAqIFRoZSBzY3JhdGNoIGJ1ZmZlciBpcyB1c2VkIHdoZW4gZGVjb2RpbmcgZnJvbSBhbiBhcnJheSBvZiBwYWdlcy4KKyAqIElmIGFuIHhkcl9pbmxpbmVfZGVjb2RlKCkgY2FsbCBzcGFucyBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCB0aGVuCisgKiB3ZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIHNjcmF0Y2ggYnVmZmVyIGluIG9yZGVyIHRvIGFsbG93IGxpbmVhcgorICogYWNjZXNzLgorICovCit2b2lkIHhkcl9zZXRfc2NyYXRjaF9idWZmZXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXhkci0+c2NyYXRjaC5pb3ZfYmFzZSA9IGJ1ZjsKKwl4ZHItPnNjcmF0Y2guaW92X2xlbiA9IGJ1ZmxlbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9zZXRfc2NyYXRjaF9idWZmZXIpOworCitzdGF0aWMgX19iZTMyICp4ZHJfY29weV90b19zY3JhdGNoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCit7CisJX19iZTMyICpwOworCXZvaWQgKmNwZGVzdCA9IHhkci0+c2NyYXRjaC5pb3ZfYmFzZTsKKwlzaXplX3QgY3BsZW4gPSAoY2hhciAqKXhkci0+ZW5kIC0gKGNoYXIgKil4ZHItPnA7CisKKwlpZiAobmJ5dGVzID4geGRyLT5zY3JhdGNoLmlvdl9sZW4pCisJCXJldHVybiBOVUxMOworCW1lbWNweShjcGRlc3QsIHhkci0+cCwgY3BsZW4pOworCWNwZGVzdCArPSBjcGxlbjsKKwluYnl0ZXMgLT0gY3BsZW47CisJaWYgKCF4ZHJfc2V0X25leHRfYnVmZmVyKHhkcikpCisJCXJldHVybiBOVUxMOworCXAgPSBfX3hkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwltZW1jcHkoY3BkZXN0LCBwLCBuYnl0ZXMpOworCXJldHVybiB4ZHItPnNjcmF0Y2guaW92X2Jhc2U7Cit9CisKKy8qKgorICogeGRyX2lubGluZV9kZWNvZGUgLSBSZXRyaWV2ZSBYRFIgZGF0YSB0byBkZWNvZGUKICAqIEB4ZHI6IHBvaW50ZXIgdG8geGRyX3N0cmVhbSBzdHJ1Y3QKICAqIEBuYnl0ZXM6IG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGRlY29kZQogICoKQEAgLTYwNSwxMyArNjk5LDE2IEBACiAgKi8KIF9fYmUzMiAqIHhkcl9pbmxpbmVfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCiB7Ci0JX19iZTMyICpwID0geGRyLT5wOwotCV9fYmUzMiAqcSA9IHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpOworCV9fYmUzMiAqcDsKIAotCWlmICh1bmxpa2VseShxID4geGRyLT5lbmQgfHwgcSA8IHApKQorCWlmIChuYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIHhkci0+cDsKKwlpZiAoeGRyLT5wID09IHhkci0+ZW5kICYmICF4ZHJfc2V0X25leHRfYnVmZmVyKHhkcikpCiAJCXJldHVybiBOVUxMOwotCXhkci0+cCA9IHE7Ci0JcmV0dXJuIHA7CisJcCA9IF9feGRyX2lubGluZV9kZWNvZGUoeGRyLCBuYnl0ZXMpOworCWlmIChwICE9IE5VTEwpCisJCXJldHVybiBwOworCXJldHVybiB4ZHJfY29weV90b19zY3JhdGNoKHhkciwgbmJ5dGVzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhkcl9pbmxpbmVfZGVjb2RlKTsKIApAQCAtNjcxLDE2ICs3NjgsMTIgQEAKICAqLwogdm9pZCB4ZHJfZW50ZXJfcGFnZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCWNoYXIgKiBrYWRkciA9IHBhZ2VfYWRkcmVzcyh4ZHItPmJ1Zi0+cGFnZXNbMF0pOwogCXhkcl9yZWFkX3BhZ2VzKHhkciwgbGVuKTsKIAkvKgogCSAqIFBvc2l0aW9uIGN1cnJlbnQgcG9pbnRlciBhdCBiZWdpbm5pbmcgb2YgdGFpbCwgYW5kCiAJICogc2V0IHJlbWFpbmluZyBtZXNzYWdlIGxlbmd0aC4KIAkgKi8KLQlpZiAobGVuID4gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZSkKLQkJbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZTsKLQl4ZHItPnAgPSAoX19iZTMyICopKGthZGRyICsgeGRyLT5idWYtPnBhZ2VfYmFzZSk7Ci0JeGRyLT5lbmQgPSAoX19iZTMyICopKChjaGFyICopeGRyLT5wICsgbGVuKTsKKwl4ZHJfc2V0X3BhZ2VfYmFzZSh4ZHIsIDAsIGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZW50ZXJfcGFnZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydC5jIGIvbmV0L3N1bnJwYy94cHJ0LmMKaW5kZXggNGM4ZjE4YS4uODU2Mjc0ZCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTk2NSw2ICs5NjUsNyBAQAogCXhwcnQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICh4cHJ0ID09IE5VTEwpCiAJCWdvdG8gb3V0OworCWtyZWZfaW5pdCgmeHBydC0+a3JlZik7CiAKIAl4cHJ0LT5tYXhfcmVxcyA9IG1heF9yZXE7CiAJeHBydC0+c2xvdCA9IGtjYWxsb2MobWF4X3JlcSwgc2l6ZW9mKHN0cnVjdCBycGNfcnFzdCksIEdGUF9LRVJORUwpOwpAQCAtMTEwMSw4ICsxMTAyLDEwIEBACiAJCQkJLVBUUl9FUlIoeHBydCkpOwogCQlyZXR1cm4geHBydDsKIAl9CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoWFBSVF9JTklUSUFMSVpFRCwgJnhwcnQtPnN0YXRlKSkKKwkJLyogLT5zZXR1cCByZXR1cm5lZCBhIHByZS1pbml0aWFsaXplZCB4cHJ0OiAqLworCQlyZXR1cm4geHBydDsKIAotCWtyZWZfaW5pdCgmeHBydC0+a3JlZik7CiAJc3Bpbl9sb2NrX2luaXQoJnhwcnQtPnRyYW5zcG9ydF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmeHBydC0+cmVzZXJ2ZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0c29jay5jIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCmluZGV4IDk2NTQ5ZGYuLmM0MzFmNWEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHNvY2suYworKysgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKQEAgLTIzNTksNiArMjM1OSwxNSBAQAogCXN0cnVjdCBzdmNfc29jayAqYmNfc29jazsKIAlzdHJ1Y3QgcnBjX3hwcnQgKnJldDsKIAorCWlmIChhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBydCkgeworCQkvKgorCQkgKiBUaGlzIHNlcnZlciBjb25uZWN0aW9uIGFscmVhZHkgaGFzIGEgYmFja2NoYW5uZWwKKwkJICogZXhwb3J0OyB3ZSBjYW4ndCBjcmVhdGUgYSBuZXcgb25lLCBhcyB3ZSB3b3VsZG4ndCBiZQorCQkgKiBhYmxlIHRvIG1hdGNoIHJlcGxpZXMgYmFzZWQgb24geGlkIGFueSBtb3JlLiAgU28sCisJCSAqIHJldXNlIHRoZSBhbHJlYWR5LWV4aXN0aW5nIG9uZToKKwkJICovCisJCSByZXR1cm4gYXJncy0+YmNfeHBydC0+eHB0X2JjX3hwcnQ7CisJfQogCXhwcnQgPSB4c19zZXR1cF94cHJ0KGFyZ3MsIHhwcnRfdGNwX3Nsb3RfdGFibGVfZW50cmllcyk7CiAJaWYgKElTX0VSUih4cHJ0KSkKIAkJcmV0dXJuIHhwcnQ7CkBAIC0yMzc1LDE2ICsyMzg0LDYgQEAKIAl4cHJ0LT5yZWVzdGFibGlzaF90aW1lb3V0ID0gMDsKIAl4cHJ0LT5pZGxlX3RpbWVvdXQgPSAwOwogCi0JLyoKLQkgKiBUaGUgYmFja2NoYW5uZWwgdXNlcyB0aGUgc2FtZSBzb2NrZXQgY29ubmVjdGlvbiBhcyB0aGUKLQkgKiBmb3JlY2hhbm5lbAotCSAqLwotCXhwcnQtPmJjX3hwcnQgPSBhcmdzLT5iY194cHJ0OwotCWJjX3NvY2sgPSBjb250YWluZXJfb2YoYXJncy0+YmNfeHBydCwgc3RydWN0IHN2Y19zb2NrLCBza194cHJ0KTsKLQliY19zb2NrLT5za19iY194cHJ0ID0geHBydDsKLQl0cmFuc3BvcnQtPnNvY2sgPSBiY19zb2NrLT5za19zb2NrOwotCXRyYW5zcG9ydC0+aW5ldCA9IGJjX3NvY2stPnNrX3NrOwotCiAJeHBydC0+b3BzID0gJmJjX3RjcF9vcHM7CiAKIAlzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgewpAQCAtMjQwNyw2ICsyNDA2LDIwIEBACiAJCQl4cHJ0LT5hZGRyZXNzX3N0cmluZ3NbUlBDX0RJU1BMQVlfUFJPVE9dKTsKIAogCS8qCisJICogT25jZSB3ZSd2ZSBhc3NvY2lhdGVkIGEgYmFja2NoYW5uZWwgeHBydCB3aXRoIGEgY29ubmVjdGlvbiwKKwkgKiB3ZSB3YW50IHRvIGtlZXAgaXQgYXJvdW5kIGFzIGxvbmcgYXMgbG9uZyBhcyB0aGUgY29ubmVjdGlvbgorCSAqIGxhc3RzLCBpbiBjYXNlIHdlIG5lZWQgdG8gc3RhcnQgdXNpbmcgaXQgZm9yIGEgYmFja2NoYW5uZWwKKwkgKiBhZ2FpbjsgdGhpcyByZWZlcmVuY2Ugd29uJ3QgYmUgZHJvcHBlZCB1bnRpbCBiY194cHJ0IGlzCisJICogZGVzdHJveWVkLgorCSAqLworCXhwcnRfZ2V0KHhwcnQpOworCWFyZ3MtPmJjX3hwcnQtPnhwdF9iY194cHJ0ID0geHBydDsKKwl4cHJ0LT5iY194cHJ0ID0gYXJncy0+YmNfeHBydDsKKwliY19zb2NrID0gY29udGFpbmVyX29mKGFyZ3MtPmJjX3hwcnQsIHN0cnVjdCBzdmNfc29jaywgc2tfeHBydCk7CisJdHJhbnNwb3J0LT5zb2NrID0gYmNfc29jay0+c2tfc29jazsKKwl0cmFuc3BvcnQtPmluZXQgPSBiY19zb2NrLT5za19zazsKKworCS8qCiAJICogU2luY2Ugd2UgZG9uJ3Qgd2FudCBjb25uZWN0aW9ucyBmb3IgdGhlIGJhY2tjaGFubmVsLCB3ZSBzZXQKIAkgKiB0aGUgeHBydCBzdGF0dXMgdG8gY29ubmVjdGVkCiAJICovCkBAIC0yNDE1LDYgKzI0MjgsNyBAQAogCiAJaWYgKHRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKIAkJcmV0dXJuIHhwcnQ7CisJeHBydF9wdXQoeHBydCk7CiAJcmV0ID0gRVJSX1BUUigtRUlOVkFMKTsKIG91dF9lcnI6CiAJeHBydF9mcmVlKHhwcnQpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy8uZ2l0aWdub3JlIGIvc2NyaXB0cy8uZ2l0aWdub3JlCmluZGV4IGM1ZDVkYjUuLmUyNzQxZDIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvLmdpdGlnbm9yZQorKysgYi9zY3JpcHRzLy5naXRpZ25vcmUKQEAgLTcsMyArNyw0IEBACiBiaW4yYwogdW5pZmRlZgogaWhleDJmdworcmVjb3JkbWNvdW50CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCmluZGV4IDRjNzJjMTEuLjFjNzAyY2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubGliCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0yMDAsNiArMjAwLDI5IEBACiBjbWRfZ3ppcCA9IChjYXQgJChmaWx0ZXItb3V0IEZPUkNFLCReKSB8IGd6aXAgLWYgLTkgPiAkQCkgfHwgXAogCShybSAtZiAkQCA7IGZhbHNlKQogCisjIERUQworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBHZW5lcmF0ZSBhbiBhc3NlbWJseSBmaWxlIHRvIHdyYXAgdGhlIG91dHB1dCBvZiB0aGUgZGV2aWNlIHRyZWUgY29tcGlsZXIKK3F1aWV0X2NtZF9kdF9TX2R0Yj0gRFRCICAgICRACitjbWRfZHRfU19kdGI9CQkJCQkJXAorKAkJCQkJCQlcCisJZWNobyAnXCNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPic7IAlcCisJZWNobyAnLnNlY3Rpb24gLmR0Yi5pbml0LnJvZGF0YSwiYSInOwkJXAorCWVjaG8gJy5iYWxpZ24gU1RSVUNUX0FMSUdOTUVOVCc7CQlcCisJZWNobyAnLmdsb2JhbCBfX2R0Yl8kKCpGKV9iZWdpbic7CQlcCisJZWNobyAnX19kdGJfJCgqRilfYmVnaW46JzsJCQlcCisJZWNobyAnLmluY2JpbiAiJDwiICc7CQkJCVwKKwllY2hvICdfX2R0Yl8kKCpGKV9lbmQ6JzsJCQlcCisJZWNobyAnLmdsb2JhbCBfX2R0Yl8kKCpGKV9lbmQnOwkJCVwKKwllY2hvICcuYmFsaWduIFNUUlVDVF9BTElHTk1FTlQnOyAJCVwKKykgPiAkQAorCiskKG9iaikvJS5kdGIuUzogJChvYmopLyUuZHRiCisJJChjYWxsIGNtZCxkdF9TX2R0YikKKworcXVpZXRfY21kX2R0YyA9IERUQyAgICAgJEAKK2NtZF9kdGMgPSAkKG9ianRyZWUpL3NjcmlwdHMvZHRjL2R0YyAtTyBkdGIgLW8gJEAgLWIgMCAkKERUQ19GTEFHUykgJDwKIAogIyBCemlwMgogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIzOSw2ICsyNjIsMzQgQEAKIAlsem9wIC05ICYmICQoY2FsbCBzaXplX2FwcGVuZCwgJChmaWx0ZXItb3V0IEZPUkNFLCReKSkpID4gJEAgfHwgXAogCShybSAtZiAkQCA7IGZhbHNlKQogCisjIFhaCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVc2UgeHprZXJuIHRvIGNvbXByZXNzIHRoZSBrZXJuZWwgaW1hZ2UgYW5kIHh6bWlzYyB0byBjb21wcmVzcyBvdGhlciB0aGluZ3MuCisjCisjIHh6a2VybiB1c2VzIGEgYmlnIExaTUEyIGRpY3Rpb25hcnkgc2luY2UgaXQgZG9lc24ndCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UKKyMgb2YgdGhlIGtlcm5lbCBkZWNvbXByZXNzb3IuIEEgQkNKIGZpbHRlciBpcyB1c2VkIGlmIGl0IGlzIGF2YWlsYWJsZSBmb3IKKyMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIHh6a2VybiBhbHNvIGFwcGVuZHMgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGRhdGEKKyMgdXNpbmcgc2l6ZV9hcHBlbmQuIFRoZSAueHogZm9ybWF0IGhhcyB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXQKKyMgdGhlIGVuZCBvZiB0aGUgZmlsZSB0b28sIGJ1dCBpdCdzIGluIG1vcmUgY29tcGxleCBmb3JtYXQgYW5kIGl0J3MgZ29vZCB0bworIyBhdm9pZCBjaGFuZ2luZyB0aGUgcGFydCBvZiB0aGUgYm9vdCBjb2RlIHRoYXQgcmVhZHMgdGhlIHVuY29tcHJlc3NlZCBzaXplLgorIyBOb3RlIHRoYXQgdGhlIGJ5dGVzIGFkZGVkIGJ5IHNpemVfYXBwZW5kIHdpbGwgbWFrZSB0aGUgeHogdG9vbCB0aGluayB0aGF0CisjIHRoZSBmaWxlIGlzIGNvcnJ1cHQuIFRoaXMgaXMgZXhwZWN0ZWQuCisjCisjIHh6bWlzYyBkb2Vzbid0IHVzZSBzaXplX2FwcGVuZCwgc28gaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5vcm1hbCAueHoKKyMgZmlsZXMuIHh6bWlzYyB1c2VzIHNtYWxsZXIgTFpNQTIgZGljdGlvbmFyeSB0aGFuIHh6a2VybiwgYmVjYXVzZSBhIHZlcnkKKyMgYmlnIGRpY3Rpb25hcnkgd291bGQgaW5jcmVhc2UgdGhlIG1lbW9yeSB1c2FnZSB0b28gbXVjaCBpbiB0aGUgbXVsdGktY2FsbAorIyBkZWNvbXByZXNzaW9uIG1vZGUuIEEgQkNKIGZpbHRlciBpc24ndCB1c2VkIGVpdGhlci4KK3F1aWV0X2NtZF94emtlcm4gPSBYWktFUk4gICRACitjbWRfeHprZXJuID0gKGNhdCAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIHwgXAorCXNoICQoc3JjdHJlZSkvc2NyaXB0cy94el93cmFwLnNoICYmIFwKKwkkKGNhbGwgc2l6ZV9hcHBlbmQsICQoZmlsdGVyLW91dCBGT1JDRSwkXikpKSA+ICRAIHx8IFwKKwkocm0gLWYgJEAgOyBmYWxzZSkKKworcXVpZXRfY21kX3h6bWlzYyA9IFhaTUlTQyAgJEAKK2NtZF94em1pc2MgPSAoY2F0ICQoZmlsdGVyLW91dCBGT1JDRSwkXikgfCBcCisJeHogLS1jaGVjaz1jcmMzMiAtLWx6bWEyPWRpY3Q9MU1pQikgPiAkQCB8fCBcCisJKHJtIC1mICRAIDsgZmFsc2UpCisKICMgbWlzYyBzdHVmZgogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHF1b3RlOj0iCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwppbmRleCBlYTI2YjIzLi5jOWExNmFiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCisrKyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKQEAgLTEzOCwzOCArMTM4LDM2IEBACiAJcHJpbnRmKCJjbWRfJXMgOj0gJXNcblxuIiwgdGFyZ2V0LCBjbWRsaW5lKTsKIH0KIAotY2hhciAqIHN0cl9jb25maWcgID0gTlVMTDsKLWludCAgICBzaXplX2NvbmZpZyA9IDA7Ci1pbnQgICAgbGVuX2NvbmZpZyAgPSAwOworc3RydWN0IGl0ZW0geworCXN0cnVjdCBpdGVtCSpuZXh0OworCXVuc2lnbmVkIGludAlsZW47CisJdW5zaWduZWQgaW50CWhhc2g7CisJY2hhcgkJbmFtZVswXTsKK307CiAKLS8qCi0gKiBHcm93IHRoZSBjb25maWd1cmF0aW9uIHN0cmluZyB0byBhIGRlc2lyZWQgbGVuZ3RoLgotICogVXN1YWxseSB0aGUgZmlyc3QgZ3Jvd3RoIGlzIHBsZW50eS4KLSAqLwotc3RhdGljIHZvaWQgZ3Jvd19jb25maWcoaW50IGxlbikKKyNkZWZpbmUgSEFTSFNaIDI1Ngorc3RhdGljIHN0cnVjdCBpdGVtICpoYXNodGFiW0hBU0hTWl07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RyaGFzaChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzeikKIHsKLQl3aGlsZSAobGVuX2NvbmZpZyArIGxlbiA+IHNpemVfY29uZmlnKSB7Ci0JCWlmIChzaXplX2NvbmZpZyA9PSAwKQotCQkJc2l6ZV9jb25maWcgPSAyMDQ4OwotCQlzdHJfY29uZmlnID0gcmVhbGxvYyhzdHJfY29uZmlnLCBzaXplX2NvbmZpZyAqPSAyKTsKLQkJaWYgKHN0cl9jb25maWcgPT0gTlVMTCkKLQkJCXsgcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7IGV4aXQoMSk7IH0KLQl9CisJLyogZm52MzIgaGFzaCAqLworCXVuc2lnbmVkIGludCBpLCBoYXNoID0gMjE2NjEzNjI2MVU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykKKwkJaGFzaCA9IChoYXNoIF4gc3RyW2ldKSAqIDB4MDEwMDAxOTM7CisJcmV0dXJuIGhhc2g7CiB9CiAKLQotCiAvKgogICogTG9va3VwIGEgdmFsdWUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgogICovCi1zdGF0aWMgaW50IGlzX2RlZmluZWRfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQorc3RhdGljIGludCBpc19kZWZpbmVkX2NvbmZpZyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaGFzaCkKIHsKLQljb25zdCBjaGFyICogcGNvbmZpZzsKLQljb25zdCBjaGFyICogcGxhc3QgPSBzdHJfY29uZmlnICsgbGVuX2NvbmZpZyAtIGxlbjsKLQlmb3IgKCBwY29uZmlnID0gc3RyX2NvbmZpZyArIDE7IHBjb25maWcgPCBwbGFzdDsgcGNvbmZpZysrICkgewotCQlpZiAocGNvbmZpZ1sgLTFdID09ICdcbicKLQkJJiYgIHBjb25maWdbbGVuXSA9PSAnXG4nCi0JCSYmICAhbWVtY21wKHBjb25maWcsIG5hbWUsIGxlbikpCisJc3RydWN0IGl0ZW0gKmF1eDsKKworCWZvciAoYXV4ID0gaGFzaHRhYltoYXNoICUgSEFTSFNaXTsgYXV4OyBhdXggPSBhdXgtPm5leHQpIHsKKwkJaWYgKGF1eC0+aGFzaCA9PSBoYXNoICYmIGF1eC0+bGVuID09IGxlbiAmJgorCQkgICAgbWVtY21wKGF1eC0+bmFtZSwgbmFtZSwgbGVuKSA9PSAwKQogCQkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtMTc4LDEzICsxNzYsMTkgQEAKIC8qCiAgKiBBZGQgYSBuZXcgdmFsdWUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgogICovCi1zdGF0aWMgdm9pZCBkZWZpbmVfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgZGVmaW5lX2NvbmZpZyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaGFzaCkKIHsKLQlncm93X2NvbmZpZyhsZW4gKyAxKTsKKwlzdHJ1Y3QgaXRlbSAqYXV4ID0gbWFsbG9jKHNpemVvZigqYXV4KSArIGxlbik7CiAKLQltZW1jcHkoc3RyX2NvbmZpZytsZW5fY29uZmlnLCBuYW1lLCBsZW4pOwotCWxlbl9jb25maWcgKz0gbGVuOwotCXN0cl9jb25maWdbbGVuX2NvbmZpZysrXSA9ICdcbic7CisJaWYgKCFhdXgpIHsKKwkJcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCW1lbWNweShhdXgtPm5hbWUsIG5hbWUsIGxlbik7CisJYXV4LT5sZW4gPSBsZW47CisJYXV4LT5oYXNoID0gaGFzaDsKKwlhdXgtPm5leHQgPSBoYXNodGFiW2hhc2ggJSBIQVNIU1pdOworCWhhc2h0YWJbaGFzaCAlIEhBU0hTWl0gPSBhdXg7CiB9CiAKIC8qCkBAIC0xOTIsNDAgKzE5Niw0OSBAQAogICovCiBzdGF0aWMgdm9pZCBjbGVhcl9jb25maWcodm9pZCkKIHsKLQlsZW5fY29uZmlnID0gMDsKLQlkZWZpbmVfY29uZmlnKCIiLCAwKTsKKwlzdHJ1Y3QgaXRlbSAqYXV4LCAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIU1o7IGkrKykgeworCQlmb3IgKGF1eCA9IGhhc2h0YWJbaV07IGF1eDsgYXV4ID0gbmV4dCkgeworCQkJbmV4dCA9IGF1eC0+bmV4dDsKKwkJCWZyZWUoYXV4KTsKKwkJfQorCQloYXNodGFiW2ldID0gTlVMTDsKKwl9CiB9CiAKIC8qCiAgKiBSZWNvcmQgdGhlIHVzZSBvZiBhIENPTkZJR18qIHdvcmQuCiAgKi8KLXN0YXRpYyB2b2lkIHVzZV9jb25maWcoY2hhciAqbSwgaW50IHNsZW4pCitzdGF0aWMgdm9pZCB1c2VfY29uZmlnKGNvbnN0IGNoYXIgKm0sIGludCBzbGVuKQogewotCWNoYXIgc1tQQVRIX01BWF07Ci0JY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IHN0cmhhc2gobSwgc2xlbik7CisJaW50IGMsIGk7CiAKLQlpZiAoaXNfZGVmaW5lZF9jb25maWcobSwgc2xlbikpCisJaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4sIGhhc2gpKQogCSAgICByZXR1cm47CiAKLQlkZWZpbmVfY29uZmlnKG0sIHNsZW4pOworCWRlZmluZV9jb25maWcobSwgc2xlbiwgaGFzaCk7CiAKLQltZW1jcHkocywgbSwgc2xlbik7IHNbc2xlbl0gPSAwOwotCi0JZm9yIChwID0gczsgcCA8IHMgKyBzbGVuOyBwKyspIHsKLQkJaWYgKCpwID09ICdfJykKLQkJCSpwID0gJy8nOworCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvIik7CisJZm9yIChpID0gMDsgaSA8IHNsZW47IGkrKykgeworCQljID0gbVtpXTsKKwkJaWYgKGMgPT0gJ18nKQorCQkJYyA9ICcvJzsKIAkJZWxzZQotCQkJKnAgPSB0b2xvd2VyKChpbnQpKnApOworCQkJYyA9IHRvbG93ZXIoYyk7CisJCXB1dGNoYXIoYyk7CiAJfQotCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvJXMuaCkgXFxcbiIsIHMpOworCXByaW50ZigiLmgpIFxcXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY2hhciAqbWFwLCBzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqbWFwLCBzaXplX3QgbGVuKQogewotCWludCAqZW5kID0gKGludCAqKSAobWFwICsgbGVuKTsKKwljb25zdCBpbnQgKmVuZCA9IChjb25zdCBpbnQgKikgKG1hcCArIGxlbik7CiAJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KLQlpbnQgKm0gICA9IChpbnQgKikgbWFwICsgMTsKLQljaGFyICpwLCAqcTsKKwljb25zdCBpbnQgKm0gICA9IChjb25zdCBpbnQgKikgbWFwICsgMTsKKwljb25zdCBjaGFyICpwLCAqcTsKIAogCWZvciAoOyBtIDwgZW5kOyBtKyspIHsKIAkJaWYgKCptID09IElOVF9DT05GKSB7IHAgPSAoY2hhciAqKSBtICA7IGdvdG8gY29uZjsgfQpAQCAtMjY1LDcgKzI3OCw3IEBACiAJcmV0dXJuIG1lbWNtcChzICsgc2xlbiAtIHN1Ymxlbiwgc3ViLCBzdWJsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBkb19jb25maWdfZmlsZShjaGFyICpmaWxlbmFtZSkKK3N0YXRpYyB2b2lkIGRvX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogCXN0cnVjdCBzdGF0IHN0OwogCWludCBmZDsKQEAgLTI3Myw3ICsyODYsNyBAQAogCiAJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogIik7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBvcGVuaW5nIGNvbmZpZyBmaWxlOiAiKTsKIAkJcGVycm9yKGZpbGVuYW1lKTsKIAkJZXhpdCgyKTsKIAl9CkBAIC0zNDQsMTEgKzM1NywxNSBAQAogCiAJZmQgPSBvcGVuKGRlcGZpbGUsIE9fUkRPTkxZKTsKIAlpZiAoZmQgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IGVycm9yIG9wZW5pbmcgZGVwZmlsZTogIik7CiAJCXBlcnJvcihkZXBmaWxlKTsKIAkJZXhpdCgyKTsKIAl9Ci0JZnN0YXQoZmQsICZzdCk7CisJaWYgKGZzdGF0KGZkLCAmc3QpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBmc3RhdCdpbmcgZGVwZmlsZTogIik7CisgICAgICAgICAgICAgICAgcGVycm9yKGRlcGZpbGUpOworICAgICAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgIH0KIAlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCJmaXhkZXA6ICVzIGlzIGVtcHR5XG4iLGRlcGZpbGUpOwogCQljbG9zZShmZCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggZTNjN2ZjMC4uNGMwMzgzZCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtODU5LDcgKzg1OSw3IEBACiAJCQkJJGF2X3ByZXByb2Nlc3NvciA9IDA7CiAJCQl9CiAKLQkJfSBlbHNpZiAoJGN1ciA9fiAvXihcKFxzKiRUeXBlXHMqKVwpLykgeworCQl9IGVsc2lmICgkY3VyID1+IC9eKFwoXHMqJFR5cGVccyopXCkvICYmICRhdl9wZW5kaW5nIGVxICdfJykgewogCQkJcHJpbnQgIkNBU1QoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQkJcHVzaChAYXZfcGFyZW5fdHlwZSwgJHR5cGUpOwogCQkJJHR5cGUgPSAnQyc7CkBAIC0yNzQzLDYgKzI3NDMsMTEgQEAKIAkJCVdBUk4oInBsYWluIGlubGluZSBpcyBwcmVmZXJyZWQgb3ZlciAkMVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAorIyBDaGVjayBmb3IgX19hdHRyaWJ1dGVfXyBwYWNrZWQsIHByZWZlciBfX3BhY2tlZAorCQlpZiAoJGxpbmUgPX4gL1xiX19hdHRyaWJ1dGVfX1xzKlwoXHMqXCguKlxicGFja2VkXGIvKSB7CisJCQlXQVJOKCJfX3BhY2tlZCBpcyBwcmVmZXJyZWQgb3ZlciBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKVxuIiAuICRoZXJlY3Vycik7CisJCX0KKwogIyBjaGVjayBmb3Igc2l6ZW9mKCYpCiAJCWlmICgkbGluZSA9fiAvXGJzaXplb2ZccypcKFxzKlwmLykgewogCQkJV0FSTigic2l6ZW9mKCYgc2hvdWxkIGJlIGF2b2lkZWRcbiIgLiAkaGVyZWN1cnIpOwpAQCAtMjc4NSwxMCArMjc5MCwxNSBAQAogCQl9CiAKICMgY2hlY2sgZm9yIHBvaW50bGVzcyBjYXN0aW5nIG9mIGttYWxsb2MgcmV0dXJuCi0JCWlmICgkbGluZSA9fiAvXCpccypcKVxzKmtbY3ptXWFsbG9jXGIvKSB7CisJCWlmICgkbGluZSA9fiAvXCpccypcKVxzKltrdl1bY3ptXWFsbG9jKF9ub2RlKXswLDF9XGIvKSB7CiAJCQlXQVJOKCJ1bm5lY2Vzc2FyeSBjYXN0IG1heSBoaWRlIGJ1Z3MsIHNlZSBodHRwOi8vYy1mYXEuY29tL21hbGxvYy9tYWxsb2Nub2Nhc3QuaHRtbFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAorIyBjaGVjayBmb3IgbXVsdGlwbGUgc2VtaWNvbG9ucworCQlpZiAoJGxpbmUgPX4gLztccyo7XHMqJC8pIHsKKwkJICAgIFdBUk4oIlN0YXRlbWVudHMgdGVybWluYXRpb25zIHVzZSAxIHNlbWljb2xvblxuIiAuICRoZXJlY3Vycik7CisJCX0KKwogIyBjaGVjayBmb3IgZ2NjIHNwZWNpZmljIF9fRlVOQ1RJT05fXwogCQlpZiAoJGxpbmUgPX4gL19fRlVOQ1RJT05fXy8pIHsKIAkJCVdBUk4oIl9fZnVuY19fIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgZ2NjIHNwZWNpZmljIF9fRlVOQ1RJT05fX1xuIiAgLiAkaGVyZWN1cnIpOwpAQCAtMjg5Miw2ICsyOTAyLDExIEBACiAJCQkJRVJST1IoImxvY2tkZXBfbm9fdmFsaWRhdGUgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGRldmljZS0+bXV0ZXguXG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQorCisJCWlmICgkbGluZSA9fiAvZGVidWdmc19jcmVhdGVfZmlsZS4qU19JV1VHTy8gfHwKKwkJICAgICRsaW5lID1+IC9ERVZJQ0VfQVRUUi4qU19JV1VHTy8gKSB7CisJCQlXQVJOKCJFeHBvcnRpbmcgd29ybGQgd3JpdGFibGUgZmlsZXMgaXMgdXN1YWxseSBhbiBlcnJvci4gQ29uc2lkZXIgbW9yZSByZXN0cmljdGl2ZSBwZXJtaXNzaW9ucy5cbiIgLiAkaGVyZWN1cnIpOworCQl9CiAJfQogCiAJIyBJZiB3ZSBoYXZlIG5vIGlucHV0IGF0IGFsbCwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydCBvbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoIGIvc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoCmluZGV4IDZiYjQyZTcuLjNhYjMxNmUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2tzeXNjYWxscy5zaAorKysgYi9zY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2gKQEAgLTYsNyArNiw3IEBACiAjIGFuZCBsaXN0ZWQgYmVsb3cgc28gdGhleSBhcmUgaWdub3JlZC4KICMKICMgVXNhZ2U6Ci0jIHN5c2NhbGxjaGsgZ2NjIGdjYy1vcHRpb25zCisjIGNoZWNrc3lzY2FsbHMuc2ggZ2NjIGdjYy1vcHRpb25zCiAjCiAKIGlnbm9yZV9saXN0KCkgewpAQCAtMjA0LDUgKzIwNCw1IEBACiBcI2VuZGlmL3AnICQxCiB9CiAKLShpZ25vcmVfbGlzdCAmJiBzeXNjYWxsX2xpc3QgJHtzcmN0cmVlfS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCkgfCBcCisoaWdub3JlX2xpc3QgJiYgc3lzY2FsbF9saXN0ICQoZGlybmFtZSAkMCkvLi4vYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgpIHwgXAogJCogLUUgLXggYyAtID4gL2Rldi9udWxsCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9kb3VibGVpbml0LmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvZG91YmxlaW5pdC5jb2NjaQppbmRleCA1NWQ3ZGMxLi4xNTZiMjBhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9kb3VibGVpbml0LmNvY2NpCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL2RvdWJsZWluaXQuY29jY2kKQEAgLTcsNyArNyw3IEBACiAvLyBDb3B5cmlnaHQ6IChDKSAyMDEwIEp1bGlhIExhd2FsbCwgRElLVS4gIEdQTHYyLgogLy8gQ29weXJpZ2h0OiAoQykgMjAxMCBHaWxsZXMgTXVsbGVyLCBJTlJJQS9MaVA2LiAgR1BMdjIuCiAvLyBVUkw6IGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCi0vLyBDb21tZW50czoKKy8vIENvbW1lbnRzOiByZXF1aXJlcyBhdCBsZWFzdCBDb2NjaW5lbGxlIDAuMi40LCBsZXggb3IgcGFyc2UgZXJyb3Igb3RoZXJ3aXNlCiAvLyBPcHRpb25zOiAtbm9faW5jbHVkZXMgLWluY2x1ZGVfaGVhZGVycwogCiB2aXJ0dWFsIG9yZwpAQCAtMTksNyArMTksNyBAQAogZXhwcmVzc2lvbiBFOwogQEAKIAotc3RydWN0IEkgcyA9QHAwIHsgLi4uIC5mbGRAcCA9IEUsIC4uLn07CitzdHJ1Y3QgSSBzID1AcDAgeyAuLi4sIC5mbGRAcCA9IEUsIC4uLn07CiAKIEBzQAogaWRlbnRpZmllciBJLCBzLCByLmZsZDsKQEAgLTI3LDcgKzI3LDcgQEAKIGV4cHJlc3Npb24gRTsKIEBACiAKLXN0cnVjdCBJIHMgPUBwMCB7IC4uLiAuZmxkQHAgPSBFLCAuLi59Oworc3RydWN0IEkgcyA9QHAwIHsgLi4uLCAuZmxkQHAgPSBFLCAuLi59OwogCiBAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIG9yZ0AKIHAwIDw8IHIucDA7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvY2NpbmVsbGUvbnVsbC9kZXJlZl9udWxsLmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL251bGwvZGVyZWZfbnVsbC5jb2NjaQppbmRleCA5OTY5ZDc2Li5jZGFjNmNmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2NvY2NpbmVsbGUvbnVsbC9kZXJlZl9udWxsLmNvY2NpCisrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9udWxsL2RlcmVmX251bGwuY29jY2kKQEAgLTExLDIxICsxMSwxMCBAQAogLy8gT3B0aW9uczoKIAogdmlydHVhbCBjb250ZXh0Ci12aXJ0dWFsIHBhdGNoCiB2aXJ0dWFsIG9yZwogdmlydHVhbCByZXBvcnQKIAotQGluaXRpYWxpemU6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0QAotCi1pbXBvcnQgc3lzCi1wcmludCA+PiBzeXMuc3RkZXJyLCAiVGhpcyBzZW1hbnRpYyBwYXRjaCBkb2VzIG5vdCBzdXBwb3J0IHRoZSAncGF0Y2gnIG1vZGUuIgotCi1AZGVwZW5kcyBvbiBwYXRjaEAKLUBACi0KLXRoaXNfcnVsZV9zaG91bGRfbmV2ZXJfbWF0Y2hlcygpOwotCi1AaWZtIGRlcGVuZHMgb24gIXBhdGNoQAorQGlmbUAKIGV4cHJlc3Npb24gKkU7CiBzdGF0ZW1lbnQgUzEsUzI7CiBwb3NpdGlvbiBwMTsKQEAgLTM1LDcgKzI0LDcgQEAKIAogLy8gVGhlIGZvbGxvd2luZyB0d28gcnVsZXMgYXJlIHNlcGFyYXRlLCBiZWNhdXNlIGJvdGggY2FuIG1hdGNoIGEgc2luZ2xlCiAvLyBleHByZXNzaW9uIGluIGRpZmZlcmVudCB3YXlzCi1AcHIxIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitAcHIxIGV4cHJlc3Npb25ACiBleHByZXNzaW9uICppZm0uRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAxOwpAQCAtNDMsNyArMzIsNyBAQAogCiAgKEUgIT0gTlVMTCAmJiAuLi4pID8gPCsuLi5FLT5mQHAxLi4uKz4gOiAuLi4KIAotQHByMiBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMiBleHByZXNzaW9uQAogZXhwcmVzc2lvbiAqaWZtLkU7CiBpZGVudGlmaWVyIGY7CiBwb3NpdGlvbiBwMjsKQEAgLTU5LDcgKzQ4LDcgQEAKIAogLy8gRm9yIG9yZyBhbmQgcmVwb3J0IG1vZGVzCiAKLUByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KSBleGlzdHNACitAciBkZXBlbmRzIG9uICFjb250ZXh0ICYmIChvcmcgfHwgcmVwb3J0KSBleGlzdHNACiBleHByZXNzaW9uIHN1YkUgPD0gaWZtLkU7CiBleHByZXNzaW9uICppZm0uRTsKIGV4cHJlc3Npb24gRTEsRTI7CkBAIC05OSw3ICs4OCw3IEBACiB9CiBlbHNlIFMzCiAKLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgcmVwb3J0QAorQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhb3JnICYmIHJlcG9ydEAKIHAgPDwgci5wOwogcDEgPDwgaWZtLnAxOwogeCA8PCBpZm0uRTsKQEAgLTEwOSw3ICs5OCw3IEBACiBjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKIGNvY2NpLmluY2x1ZGVfbWF0Y2goRmFsc2UpCiAKLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIG9yZyAmJiAhcmVwb3J0QAorQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiBvcmcgJiYgIXJlcG9ydEAKIHAgPDwgci5wOwogcDEgPDwgaWZtLnAxOwogeCA8PCBpZm0uRTsKQEAgLTEyMCw3ICsxMDksNyBAQAogY29jY2kucHJpbnRfbWFpbihtc2dfc2FmZSxwKQogY29jY2kuaW5jbHVkZV9tYXRjaChGYWxzZSkKIAotQHMgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKK0BzIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKIGV4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKIGV4cHJlc3Npb24gKmlmbS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKQEAgLTE1OSw3ICsxNDgsNyBAQAogfQogZWxzZSBTMwogCi1Ac2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmIHJlcG9ydEAKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIW9yZyAmJiByZXBvcnRACiBwIDw8IHMucDsKIHAxIDw8IGlmbS5wMTsKIHggPDwgaWZtLkU7CkBAIC0xNjgsNyArMTU3LDcgQEAKIG1zZz0iRVJST1I6ICVzIGlzIE5VTEwgYnV0IGRlcmVmZXJlbmNlZC4iICUgKHgpCiBjb2NjaWxpYi5yZXBvcnQucHJpbnRfcmVwb3J0KHBbMF0sIG1zZykKIAotQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgb3JnICYmICFyZXBvcnRACitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmIG9yZyAmJiAhcmVwb3J0QAogcCA8PCBzLnA7CiBwMSA8PCBpZm0ucDE7CiB4IDw8IGlmbS5FOwpAQCAtMTgwLDcgKzE2OSw3IEBACiAKIC8vIEZvciBjb250ZXh0IG1vZGUKIAotQGRlcGVuZHMgb24gY29udGV4dCAmJiAhcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0IGV4aXN0c0AKK0BkZXBlbmRzIG9uIGNvbnRleHQgJiYgIW9yZyAmJiAhcmVwb3J0IGV4aXN0c0AKIGV4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKIGV4cHJlc3Npb24gKmlmbS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKQEAgLTIyMyw3ICsyMTIsNyBAQAogLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBydWxlcyBhcmUgZHVwbGljYXRlcyBvZiBpZm0sIHByMSBhbmQgcHIyIHJlc3BlY3RpdmVseS4KIC8vIEl0IGlzIG5lZWQgYmVjYXVzZSB0aGUgcHJldmlvdXMgcnVsZSBhcyBhbHJlYWR5IG1hZGUgYSAiY2hhbmdlIi4KIAotQGlmbTEgZGVwZW5kcyBvbiAhcGF0Y2hACitAaWZtMUAKIGV4cHJlc3Npb24gKkU7CiBzdGF0ZW1lbnQgUzEsUzI7CiBwb3NpdGlvbiBwMTsKQEAgLTIzMSw3ICsyMjAsNyBAQAogCiBpZkBwMSAoKEUgPT0gTlVMTCAmJiAuLi4pIHx8IC4uLikgUzEgZWxzZSBTMgogCi1AcHIxMSBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMTEgZXhwcmVzc2lvbkAKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAxOwpAQCAtMjM5LDcgKzIyOCw3IEBACiAKICAoRSAhPSBOVUxMICYmIC4uLikgPyA8Ky4uLkUtPmZAcDEuLi4rPiA6IC4uLgogCi1AcHIxMiBkZXBlbmRzIG9uICFwYXRjaCBleHByZXNzaW9uQAorQHByMTIgZXhwcmVzc2lvbkAKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAyOwpAQCAtMjUzLDcgKzI0Miw3IEBACiAgc2l6ZW9mKDwrLi4uRS0+ZkBwMi4uLis+KQogKQogCi1AZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAorQGRlcGVuZHMgb24gY29udGV4dCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAogZXhwcmVzc2lvbiBzdWJFIDw9IGlmbTEuRTsKIGV4cHJlc3Npb24gKmlmbTEuRTsKIGV4cHJlc3Npb24gRTEsRTI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NvbmZpZyBiL3NjcmlwdHMvY29uZmlnCmluZGV4IDYwOGQ3ZmQuLmE3YzdjNGIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY29uZmlnCisrKyBiL3NjcmlwdHMvY29uZmlnCkBAIC0xMCw4ICsxMCwxMCBAQAogCS0tZW5hYmxlfC1lIG9wdGlvbiAgIEVuYWJsZSBvcHRpb24KIAktLWRpc2FibGV8LWQgb3B0aW9uICBEaXNhYmxlIG9wdGlvbgogCS0tbW9kdWxlfC1tIG9wdGlvbiAgIFR1cm4gb3B0aW9uIGludG8gYSBtb2R1bGUKLQktLXNldC1zdHIgb3B0aW9uIHZhbHVlCi0JICAgICAgICAgICAgICAgICAgICAgU2V0IG9wdGlvbiB0byAidmFsdWUiCisJLS1zZXQtc3RyIG9wdGlvbiBzdHJpbmcKKwkgICAgICAgICAgICAgICAgICAgICBTZXQgb3B0aW9uIHRvICJzdHJpbmciCisJLS1zZXQtdmFsIG9wdGlvbiB2YWx1ZQorCSAgICAgICAgICAgICAgICAgICAgIFNldCBvcHRpb24gdG8gdmFsdWUKIAktLXN0YXRlfC1zIG9wdGlvbiAgICBQcmludCBzdGF0ZSBvZiBvcHRpb24gKG4seSxtLHVuZGVmKQogCiAJLS1lbmFibGUtYWZ0ZXJ8LUUgYmVmb3Jlb3B0IG9wdGlvbgpAQCAtODYsNyArODgsNyBAQAogCQlCPSRBUkcKIAkJc2hpZnQgMgogCQk7OwotCS0tKikKKwktKikKIAkJY2hlY2thcmcgIiQxIgogCQlzaGlmdAogCQk7OwpAQCAtMTA5LDYgKzExMSwxMSBAQAogCQlzaGlmdAogCQk7OwogCisJLS1zZXQtdmFsKQorCQlzZXRfdmFyICJDT05GSUdfJEFSRyIgIkNPTkZJR18kQVJHPSQxIgorCQlzaGlmdAorCQk7OworCiAJLS1zdGF0ZXwtcykKIAkJaWYgZ3JlcCAtcSAiIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0IiAkRk4gOyB0aGVuCiAJCQllY2hvIG4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL01ha2VmaWxlIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKaW5kZXggMDFjZGIzNi4uMDRhMzFjMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9kdGMvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiBhbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCiAKIGR0Yy1vYmpzCTo9IGR0Yy5vIGZsYXR0cmVlLm8gZnN0cmVlLm8gZGF0YS5vIGxpdmV0cmVlLm8gdHJlZXNvdXJjZS5vIFwKLQkJICAgc3JjcG9zLm8gY2hlY2tzLm8KKwkJICAgc3JjcG9zLm8gY2hlY2tzLm8gdXRpbC5vCiBkdGMtb2JqcwkrPSBkdGMtbGV4ZXIubGV4Lm8gZHRjLXBhcnNlci50YWIubwogCiAjIFNvdXJjZSBmaWxlcyBuZWVkIHRvIGdldCBhdCB0aGUgdXNlcnNwYWNlIHZlcnNpb24gb2YgbGliZmR0X2Vudi5oIHRvIGNvbXBpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIEhPU1RDRkxBR1NfbGl2ZXRyZWUubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQogSE9TVENGTEFHU19zcmNwb3MubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQogSE9TVENGTEFHU190cmVlc291cmNlLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKK0hPU1RDRkxBR1NfdXRpbC5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiAKIEhPU1RDRkxBR1NfZHRjLWxleGVyLmxleC5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiBIT1NUQ0ZMQUdTX2R0Yy1wYXJzZXIudGFiLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2NoZWNrcy5jIGIvc2NyaXB0cy9kdGMvY2hlY2tzLmMKaW5kZXggOTU0ODU3OS4uYTY2MmEwMCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvY2hlY2tzLmMKKysrIGIvc2NyaXB0cy9kdGMvY2hlY2tzLmMKQEAgLTI3OCwzMiArMjc4LDExMiBAQAogfQogUFJPUF9DSEVDSyhwcm9wZXJ0eV9uYW1lX2NoYXJzLCBQUk9QTk9ERUNIQVJTLCBFUlJPUik7CiAKLXN0YXRpYyB2b2lkIGNoZWNrX2V4cGxpY2l0X3BoYW5kbGVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCi0JCQkJCSAgc3RydWN0IG5vZGUgKm5vZGUpCisjZGVmaW5lIERFU0NMQUJFTF9GTVQJIiVzJXMlcyVzJXMiCisjZGVmaW5lIERFU0NMQUJFTF9BUkdTKG5vZGUscHJvcCxtYXJrKQkJXAorCSgobWFyaykgPyAidmFsdWUgb2YgIiA6ICIiKSwJCVwKKwkoKHByb3ApID8gIiciIDogIiIpLCBcCisJKChwcm9wKSA/IChwcm9wKS0+bmFtZSA6ICIiKSwgXAorCSgocHJvcCkgPyAiJyBpbiAiIDogIiIpLCAobm9kZSktPmZ1bGxwYXRoCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbChzdHJ1Y3QgY2hlY2sgKmMsIHN0cnVjdCBub2RlICpkdCwKKwkJCQkgIGNvbnN0IGNoYXIgKmxhYmVsLCBzdHJ1Y3Qgbm9kZSAqbm9kZSwKKwkJCQkgIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgc3RydWN0IG1hcmtlciAqbWFyaykKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG5vZGUgKm90aGVybm9kZSA9IE5VTEw7CisJc3RydWN0IHByb3BlcnR5ICpvdGhlcnByb3AgPSBOVUxMOworCXN0cnVjdCBtYXJrZXIgKm90aGVybWFyayA9IE5VTEw7CisKKwlvdGhlcm5vZGUgPSBnZXRfbm9kZV9ieV9sYWJlbChkdCwgbGFiZWwpOworCisJaWYgKCFvdGhlcm5vZGUpCisJCW90aGVycHJvcCA9IGdldF9wcm9wZXJ0eV9ieV9sYWJlbChkdCwgbGFiZWwsICZvdGhlcm5vZGUpOworCWlmICghb3RoZXJub2RlKQorCQlvdGhlcm1hcmsgPSBnZXRfbWFya2VyX2xhYmVsKGR0LCBsYWJlbCwgJm90aGVybm9kZSwKKwkJCQkJICAgICAgICZvdGhlcnByb3ApOworCisJaWYgKCFvdGhlcm5vZGUpCisJCXJldHVybjsKKworCWlmICgob3RoZXJub2RlICE9IG5vZGUpIHx8IChvdGhlcnByb3AgIT0gcHJvcCkgfHwgKG90aGVybWFyayAhPSBtYXJrKSkKKwkJRkFJTChjLCAiRHVwbGljYXRlIGxhYmVsICclcycgb24gIiBERVNDTEFCRUxfRk1UCisJCSAgICAgIiBhbmQgIiBERVNDTEFCRUxfRk1ULAorCQkgICAgIGxhYmVsLCBERVNDTEFCRUxfQVJHUyhub2RlLCBwcm9wLCBtYXJrKSwKKwkJICAgICBERVNDTEFCRUxfQVJHUyhvdGhlcm5vZGUsIG90aGVycHJvcCwgb3RoZXJtYXJrKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbF9ub2RlKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKmR0LAorCQkJCSAgICAgICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgbGFiZWwgKmw7CisKKwlmb3JfZWFjaF9sYWJlbChub2RlLT5sYWJlbHMsIGwpCisJCWNoZWNrX2R1cGxpY2F0ZV9sYWJlbChjLCBkdCwgbC0+bGFiZWwsIG5vZGUsIE5VTEwsIE5VTEwpOworfQorc3RhdGljIHZvaWQgY2hlY2tfZHVwbGljYXRlX2xhYmVsX3Byb3Aoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCisJCQkJICAgICAgIHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJc3RydWN0IG1hcmtlciAqbSA9IHByb3AtPnZhbC5tYXJrZXJzOworCXN0cnVjdCBsYWJlbCAqbDsKKworCWZvcl9lYWNoX2xhYmVsKHByb3AtPmxhYmVscywgbCkKKwkJY2hlY2tfZHVwbGljYXRlX2xhYmVsKGMsIGR0LCBsLT5sYWJlbCwgbm9kZSwgcHJvcCwgTlVMTCk7CisKKwlmb3JfZWFjaF9tYXJrZXJfb2ZfdHlwZShtLCBMQUJFTCkKKwkJY2hlY2tfZHVwbGljYXRlX2xhYmVsKGMsIGR0LCBtLT5yZWYsIG5vZGUsIHByb3AsIG0pOworfQorQ0hFQ0soZHVwbGljYXRlX2xhYmVsLCBOVUxMLCBjaGVja19kdXBsaWNhdGVfbGFiZWxfbm9kZSwKKyAgICAgIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbF9wcm9wLCBOVUxMLCBFUlJPUik7CisKK3N0YXRpYyB2b2lkIGNoZWNrX2V4cGxpY2l0X3BoYW5kbGVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCisJCQkJICAgIHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJc3RydWN0IG1hcmtlciAqbTsKIAlzdHJ1Y3Qgbm9kZSAqb3RoZXI7CiAJY2VsbF90IHBoYW5kbGU7CiAKLQlwcm9wID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxwaGFuZGxlIik7Ci0JaWYgKCEgcHJvcCkKLQkJcmV0dXJuOyAvKiBObyBwaGFuZGxlLCB0aGF0J3MgZmluZSAqLworCWlmICghc3RyZXEocHJvcC0+bmFtZSwgInBoYW5kbGUiKQorCSAgICAmJiAhc3RyZXEocHJvcC0+bmFtZSwgImxpbnV4LHBoYW5kbGUiKSkKKwkJcmV0dXJuOwogCiAJaWYgKHByb3AtPnZhbC5sZW4gIT0gc2l6ZW9mKGNlbGxfdCkpIHsKLQkJRkFJTChjLCAiJXMgaGFzIGJhZCBsZW5ndGggKCVkKSBsaW51eCxwaGFuZGxlIHByb3BlcnR5IiwKLQkJICAgICBub2RlLT5mdWxscGF0aCwgcHJvcC0+dmFsLmxlbik7CisJCUZBSUwoYywgIiVzIGhhcyBiYWQgbGVuZ3RoICglZCkgJXMgcHJvcGVydHkiLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwcm9wLT52YWwubGVuLCBwcm9wLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW0gPSBwcm9wLT52YWwubWFya2VyczsKKwlmb3JfZWFjaF9tYXJrZXJfb2ZfdHlwZShtLCBSRUZfUEhBTkRMRSkgeworCQlhc3NlcnQobS0+b2Zmc2V0ID09IDApOworCQlpZiAobm9kZSAhPSBnZXRfbm9kZV9ieV9yZWYocm9vdCwgbS0+cmVmKSkKKwkJCS8qICJTZXQgdGhpcyBub2RlJ3MgcGhhbmRsZSBlcXVhbCB0byBzb21lCisJCQkgKiBvdGhlciBub2RlJ3MgcGhhbmRsZSIuICBUaGF0J3Mgbm9uc2Vuc2ljYWwKKwkJCSAqIGJ5IGNvbnN0cnVjdGlvbi4gKi8geworCQkJRkFJTChjLCAiJXMgaW4gJXMgaXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBub2RlIiwKKwkJCSAgICAgcHJvcC0+bmFtZSwgbm9kZS0+ZnVsbHBhdGgpOworCQkJcmV0dXJuOworCQl9CisJCS8qIEJ1dCBzZXR0aW5nIHRoaXMgbm9kZSdzIHBoYW5kbGUgZXF1YWwgdG8gaXRzIG93bgorCQkgKiBwaGFuZGxlIGlzIGFsbG93ZWQgLSB0aGF0IG1lYW5zIGFsbG9jYXRlIGEgdW5pcXVlCisJCSAqIHBoYW5kbGUgZm9yIHRoaXMgbm9kZSwgZXZlbiBpZiBpdCdzIG5vdCBvdGhlcndpc2UKKwkJICogcmVmZXJlbmNlZC4gIFRoZSB2YWx1ZSB3aWxsIGJlIGZpbGxlZCBpbiBsYXRlciwgc28KKwkJICogbm8gZnVydGhlciBjaGVja2luZyBmb3Igbm93LiAqLwogCQlyZXR1cm47CiAJfQogCiAJcGhhbmRsZSA9IHByb3B2YWxfY2VsbChwcm9wKTsKKwogCWlmICgocGhhbmRsZSA9PSAwKSB8fCAocGhhbmRsZSA9PSAtMSkpIHsKLQkJRkFJTChjLCAiJXMgaGFzIGludmFsaWQgbGludXgscGhhbmRsZSB2YWx1ZSAweCV4IiwKLQkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSk7CisJCUZBSUwoYywgIiVzIGhhcyBiYWQgdmFsdWUgKDB4JXgpIGluICVzIHByb3BlcnR5IiwKKwkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSwgcHJvcC0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKKwlpZiAobm9kZS0+cGhhbmRsZSAmJiAobm9kZS0+cGhhbmRsZSAhPSBwaGFuZGxlKSkKKwkJRkFJTChjLCAiJXMgaGFzICVzIHByb3BlcnR5IHdoaWNoIHJlcGxhY2VzIGV4aXN0aW5nIHBoYW5kbGUgaW5mb3JtYXRpb24iLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwcm9wLT5uYW1lKTsKKwogCW90aGVyID0gZ2V0X25vZGVfYnlfcGhhbmRsZShyb290LCBwaGFuZGxlKTsKLQlpZiAob3RoZXIpIHsKKwlpZiAob3RoZXIgJiYgKG90aGVyICE9IG5vZGUpKSB7CiAJCUZBSUwoYywgIiVzIGhhcyBkdXBsaWNhdGVkIHBoYW5kbGUgMHgleCAoc2VlbiBiZWZvcmUgYXQgJXMpIiwKIAkJICAgICBub2RlLT5mdWxscGF0aCwgcGhhbmRsZSwgb3RoZXItPmZ1bGxwYXRoKTsKIAkJcmV0dXJuOwpAQCAtMzExLDcgKzM5MSw3IEBACiAKIAlub2RlLT5waGFuZGxlID0gcGhhbmRsZTsKIH0KLU5PREVfQ0hFQ0soZXhwbGljaXRfcGhhbmRsZXMsIE5VTEwsIEVSUk9SKTsKK1BST1BfQ0hFQ0soZXhwbGljaXRfcGhhbmRsZXMsIE5VTEwsIEVSUk9SKTsKIAogc3RhdGljIHZvaWQgY2hlY2tfbmFtZV9wcm9wZXJ0aWVzKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKnJvb3QsCiAJCQkJICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKQEAgLTU0OSw2ICs2MjksOSBAQAogCSZkdXBsaWNhdGVfbm9kZV9uYW1lcywgJmR1cGxpY2F0ZV9wcm9wZXJ0eV9uYW1lcywKIAkmbm9kZV9uYW1lX2NoYXJzLCAmbm9kZV9uYW1lX2Zvcm1hdCwgJnByb3BlcnR5X25hbWVfY2hhcnMsCiAJJm5hbWVfaXNfc3RyaW5nLCAmbmFtZV9wcm9wZXJ0aWVzLAorCisJJmR1cGxpY2F0ZV9sYWJlbCwKKwogCSZleHBsaWNpdF9waGFuZGxlcywKIAkmcGhhbmRsZV9yZWZlcmVuY2VzLCAmcGF0aF9yZWZlcmVuY2VzLAogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubCBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCmluZGV4IGE2MjdiYmUuLmU4NjZlYTUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sCkBAIC0xOCw3ICsxOCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKICAqLwogCi0lb3B0aW9uIG5veXl3cmFwIG5vaW5wdXQgbm91bnB1dCB5eWxpbmVubworJW9wdGlvbiBub3l5d3JhcCBub3VucHV0IG5vaW5wdXQgbmV2ZXItaW50ZXJhY3RpdmUKIAogJXggSU5DTFVERQogJXggQllURVNUUklORwpAQCAtMzgsNiArMzgsMTMgQEAKICNpbmNsdWRlICJzcmNwb3MuaCIKICNpbmNsdWRlICJkdGMtcGFyc2VyLnRhYi5oIgogCitZWUxUWVBFIHl5bGxvYzsKKworLyogQ0FVVElPTjogdGhpcyB3aWxsIHN0b3Agd29ya2luZyBpZiB3ZSBldmVyIHVzZSB5eWxlc3MoKSBvciB5eXVucHV0KCkgKi8KKyNkZWZpbmUJWVlfVVNFUl9BQ1RJT04gXAorCXsgXAorCQlzcmNwb3NfdXBkYXRlKCZ5eWxsb2MsIHl5dGV4dCwgeXlsZW5nKTsgXAorCX0KIAogLyojZGVmaW5lIExFWERFQlVHCTEqLwogCkBAIC00NywxNSArNTQsMTAgQEAKICNkZWZpbmUgRFBSSU5UKGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGludCBkdHNfdmVyc2lvbjsgLyogPSAwICovCitzdGF0aWMgaW50IGR0c192ZXJzaW9uID0gMTsKIAotI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJaWYgKGR0c192ZXJzaW9uID09IDApIHsgXAotCQkJCURQUklOVCgiPElOSVRJQUw+XG4iKTsgXAotCQkJCUJFR0lOKElOSVRJQUwpOyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAorI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJCURQUklOVCgiPFYxPlxuIik7IFwKIAkJCQlCRUdJTihWMSk7IFwKLQkJCX0KIAogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCk7CkBAIC03NSwxOCArNzcsMTMgQEAKIAkJfQogCiA8Kj57U1RSSU5HfQl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCiAJCQkJCXl5bGVuZy0yKTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlyZXR1cm4gRFRfU1RSSU5HOwogCQl9CiAKIDwqPiIvZHRzLXYxLyIJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKQEAgLTk0LDEwNiArOTEsNTcgQEAKIAkJfQogCiA8Kj4iL21lbXJlc2VydmUvIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiS2V5d29yZDogL21lbXJlc2VydmUvXG4iKTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiBEVF9NRU1SRVNFUlZFOwogCQl9CiAKIDwqPntMQUJFTH06CXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJMYWJlbDogJXNcbiIsIHl5dGV4dCk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCXl5bHZhbC5sYWJlbHJlZlt5eWxlbmctMV0gPSAnXDAnOwogCQkJcmV0dXJuIERUX0xBQkVMOwogCQl9CiAKLTxJTklUSUFMPltib2RoXSMgewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQlpZiAoKnl5dGV4dCA9PSAnYicpCi0JCQkJeXlsdmFsLmNiYXNlID0gMjsKLQkJCWVsc2UgaWYgKCp5eXRleHQgPT0gJ28nKQotCQkJCXl5bHZhbC5jYmFzZSA9IDg7Ci0JCQllbHNlIGlmICgqeXl0ZXh0ID09ICdkJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxMDsKLQkJCWVsc2UKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxNjsKLQkJCURQUklOVCgiQmFzZTogJWRcbiIsIHl5bHZhbC5jYmFzZSk7Ci0JCQlyZXR1cm4gRFRfQkFTRTsKLQkJfQotCi08SU5JVElBTD5bMC05YS1mQS1GXSsJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOwotCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7Ci0JCQlyZXR1cm4gRFRfTEVHQUNZTElURVJBTDsKLQkJfQotCiA8VjE+WzAtOV0rfDBbeFhdWzAtOWEtZkEtRl0rICAgICAgewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLmxpdGVyYWwgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQlEUFJJTlQoIkxpdGVyYWw6ICclcydcbiIsIHl5bHZhbC5saXRlcmFsKTsKIAkJCXJldHVybiBEVF9MSVRFUkFMOwogCQl9CiAKLVwme0xBQkVMfQl7CS8qIGxhYmVsIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Cis8Kj5cJntMQUJFTH0JewkvKiBsYWJlbCByZWZlcmVuY2UgKi8KIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCi0iJnsvIntQQVRIQ0hBUn0rXH0JewkvKiBuZXctc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOworPCo+IiZ7LyJ7UEFUSENIQVJ9K1x9CXsJLyogbmV3LXN0eWxlIHBhdGggcmVmZXJlbmNlICovCiAJCQl5eXRleHRbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzIpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsyKTsKLQkJCXJldHVybiBEVF9SRUY7Ci0JCX0KLQotPElOSVRJQUw+IiYvIntQQVRIQ0hBUn0rIHsJLyogb2xkLXN0eWxlIHBhdGggcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzIpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCiA8QllURVNUUklORz5bMC05YS1mQS1GXXsyfSB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5bHZhbC5ieXRlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgMTYpOwogCQkJRFBSSU5UKCJCeXRlOiAlMDJ4XG4iLCAoaW50KXl5bHZhbC5ieXRlKTsKIAkJCXJldHVybiBEVF9CWVRFOwogCQl9CiAKIDxCWVRFU1RSSU5HPiJdIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiL0JZVEVTVFJJTkdcbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuICddJzsKIAkJfQogCiA8UFJPUE5PREVOQU1FPntQUk9QTk9ERUNIQVJ9KyB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUHJvcE5vZGVOYW1lOiAlc1xuIiwgeXl0ZXh0KTsKLQkJCXl5bHZhbC5wcm9wbm9kZW5hbWUgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5wcm9wbm9kZW5hbWUgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CiAJCQlyZXR1cm4gRFRfUFJPUE5PREVOQU1FOwogCQl9CiAKICIvaW5jYmluLyIJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkJpbmFyeSBJbmNsdWRlXG4iKTsKIAkJCXJldHVybiBEVF9JTkNCSU47CiAJCX0KQEAgLTIwMyw4ICsxNTEsNiBAQAogPCo+e0xJTkVDT01NRU5UfSsgLyogZWF0IEMrKy1zdHlsZSBjb21tZW50cyAqLwogCiA8Kj4uCQl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiQ2hhcjogJWMgKFxceCUwMngpXG4iLCB5eXRleHRbMF0sCiAJCQkJKHVuc2lnbmVkKXl5dGV4dFswXSk7CiAJCQlpZiAoeXl0ZXh0WzBdID09ICdbJykgewpAQCAtMjIxLDEwMCArMTY3LDI1IEBACiAKICUlCiAKLQotLyoKLSAqIFN0YWNrIG9mIG5lc3RlZCBpbmNsdWRlIGZpbGUgY29udGV4dHMuCi0gKi8KLQotc3RydWN0IGluY2xfZmlsZSB7Ci0Jc3RydWN0IGR0Y19maWxlICpmaWxlOwotCVlZX0JVRkZFUl9TVEFURSB5eV9wcmV2X2J1ZjsKLQlpbnQgeXlfcHJldl9saW5lbm87Ci0Jc3RydWN0IGluY2xfZmlsZSAqcHJldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7Ci0KLQotLyoKLSAqIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4KLSAqLwotI2RlZmluZSBNQVhfSU5DTFVERV9ERVBUSAkoMTAwKQotCi1zdGF0aWMgaW50IGluY2xfZGVwdGggPSAwOwotCi0KIHN0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0Jc3RydWN0IGR0Y19maWxlICpuZXdmaWxlOwotCXN0cnVjdCBzZWFyY2hfcGF0aCBzZWFyY2gsICpzZWFyY2hwdHIgPSBOVUxMOwotCiAJYXNzZXJ0KGZpbGVuYW1lKTsKIAotCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpCi0JCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKwlzcmNmaWxlX3B1c2goZmlsZW5hbWUpOwogCi0JaWYgKHNyY3Bvc19maWxlKSB7Ci0JCXNlYXJjaC5kaXIgPSBzcmNwb3NfZmlsZS0+ZGlyOwotCQlzZWFyY2gubmV4dCA9IE5VTEw7Ci0JCXNlYXJjaC5wcmV2ID0gTlVMTDsKLQkJc2VhcmNocHRyID0gJnNlYXJjaDsKLQl9CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAotCW5ld2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZpbGVuYW1lLCBzZWFyY2hwdHIpOwotCi0JaW5jbF9maWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGluY2xfZmlsZSkpOwotCi0JLyoKLQkgKiBTYXZlIGN1cnJlbnQgY29udGV4dC4KLQkgKi8KLQlpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0JaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubyA9IHl5bGluZW5vOwotCWluY2xfZmlsZS0+ZmlsZSA9IHNyY3Bvc19maWxlOwotCWluY2xfZmlsZS0+cHJldiA9IGluY2xfZmlsZV9zdGFjazsKLQotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZTsKLQotCS8qCi0JICogRXN0YWJsaXNoIG5ldyBjb250ZXh0LgotCSAqLwotCXNyY3Bvc19maWxlID0gbmV3ZmlsZTsKLQl5eWxpbmVubyA9IDE7Ci0JeXlpbiA9IG5ld2ZpbGUtPmZpbGU7Ci0JeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7CisJeXlwdXNoX2J1ZmZlcl9zdGF0ZSh5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7CiB9CiAKIAogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewotCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKLQotCWlmIChpbmNsX2ZpbGVfc3RhY2sgPT0gMCkKKwlpZiAoc3JjZmlsZV9wb3AoKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWR0Y19jbG9zZV9maWxlKHNyY3Bvc19maWxlKTsKLQotCS8qCi0JICogUG9wLgotCSAqLwotCS0taW5jbF9kZXB0aDsKLQlpbmNsX2ZpbGUgPSBpbmNsX2ZpbGVfc3RhY2s7Ci0JaW5jbF9maWxlX3N0YWNrID0gaW5jbF9maWxlLT5wcmV2OwotCi0JLyoKLQkgKiBSZWNvdmVyIG9sZCBjb250ZXh0LgotCSAqLwotCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOwotCXl5X3N3aXRjaF90b19idWZmZXIoaW5jbF9maWxlLT55eV9wcmV2X2J1Zik7Ci0JeXlsaW5lbm8gPSBpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vOwotCXNyY3Bvc19maWxlID0gaW5jbF9maWxlLT5maWxlOwotCXl5aW4gPSBpbmNsX2ZpbGUtPmZpbGUgPyBpbmNsX2ZpbGUtPmZpbGUtPmZpbGUgOiBOVUxMOwotCi0JLyoKLQkgKiBGcmVlIG9sZCBzdGF0ZS4KLQkgKi8KLQlmcmVlKGluY2xfZmlsZSk7CisJeXlwb3BfYnVmZmVyX3N0YXRlKCk7CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLWxleGVyLmxleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZAppbmRleCBlMjdjYzYzLi41MGM0NDIwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZApAQCAtMTcwLDIwICsxNzAsNyBAQAogI2RlZmluZSBFT0JfQUNUX0VORF9PRl9GSUxFIDEKICNkZWZpbmUgRU9CX0FDVF9MQVNUX01BVENIIDIKIAotICAgIC8qIE5vdGU6IFdlIHNwZWNpZmljYWxseSBvbWl0IHRoZSB0ZXN0IGZvciB5eV9ydWxlX2Nhbl9tYXRjaF9lb2wgYmVjYXVzZSBpdCByZXF1aXJlcwotICAgICAqICAgICAgIGFjY2VzcyB0byB0aGUgbG9jYWwgdmFyaWFibGUgeXlfYWN0LiBTaW5jZSB5eWxlc3MoKSBpcyBhIG1hY3JvLCBpdCB3b3VsZCBicmVhawotICAgICAqICAgICAgIGV4aXN0aW5nIHNjYW5uZXJzIHRoYXQgY2FsbCB5eWxlc3MoKSBmcm9tIE9VVFNJREUgeXlsZXguIAotICAgICAqICAgICAgIE9uZSBvYnZpb3VzIHNvbHV0aW9uIGl0IHRvIG1ha2UgeXlfYWN0IGEgZ2xvYmFsLiBJIHRyaWVkIHRoYXQsIGFuZCBzYXcKLSAgICAgKiAgICAgICBhIDUlIHBlcmZvcm1hbmNlIGhpdCBpbiBhIG5vbi15eWxpbmVubyBzY2FubmVyLCBiZWNhdXNlIHl5X2FjdCBpcwotICAgICAqICAgICAgIG5vcm1hbGx5IGRlY2xhcmVkIGFzIGEgcmVnaXN0ZXIgdmFyaWFibGUtLSBzbyBpdCBpcyBub3Qgd29ydGggaXQuCi0gICAgICovCi0gICAgI2RlZmluZSAgWVlfTEVTU19MSU5FTk8obikgXAotICAgICAgICAgICAgZG8geyBcCi0gICAgICAgICAgICAgICAgaW50IHl5bDtcCi0gICAgICAgICAgICAgICAgZm9yICggeXlsID0gbjsgeXlsIDwgeXlsZW5nOyArK3l5bCApXAotICAgICAgICAgICAgICAgICAgICBpZiAoIHl5dGV4dFt5eWxdID09ICdcbicgKVwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0teXlsaW5lbm87XAotICAgICAgICAgICAgfXdoaWxlKDApCisgICAgI2RlZmluZSBZWV9MRVNTX0xJTkVOTyhuKQogICAgIAogLyogUmV0dXJuIGFsbCBidXQgdGhlIGZpcnN0ICJuIiBtYXRjaGVkIGNoYXJhY3RlcnMgYmFjayB0byB0aGUgaW5wdXQgc3RyZWFtLiAqLwogI2RlZmluZSB5eWxlc3MobikgXApAQCAtMzg1LDggKzM3Miw4IEBACiAJKnl5X2NwID0gJ1wwJzsgXAogCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOwogCi0jZGVmaW5lIFlZX05VTV9SVUxFUyAyMAotI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDIxCisjZGVmaW5lIFlZX05VTV9SVUxFUyAxNworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDE4CiAvKiBUaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGlzIHNjYW5uZXIsCiAgICBidXQgaXRzIHByZXNlbmNlIGlzIG5lY2Vzc2FyeS4gKi8KIHN0cnVjdCB5eV90cmFuc19pbmZvCkBAIC0zOTQsMjAgKzM4MSwxOSBAQAogCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CiAJZmxleF9pbnQzMl90IHl5X254dDsKIAl9Owotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFsxMDRdID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbOTRdID0KICAgICB7ICAgMCwKICAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAyMSwgICAxOSwgICAxNiwgICAxNiwgICAxOSwgICAxOSwgICAxOSwgICAgNywgICAgNywgICAxOSwKLSAgICAgICAgNywgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxMywgICAxNCwgICAxNCwgICAxOSwgICAgOCwKLSAgICAgICAgOCwgICAxNiwgICAgMCwgICAgMiwgICAgMCwgICAgMCwgICAgOSwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgNywgICAgNywgICAgNSwgICAgMCwgICAgNiwgICAgMCwgICAxMiwKLSAgICAgICAxMiwgICAxNCwgICAxNCwgICAgOCwgICAgMCwgICAxMSwgICAgOSwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAxOCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgOCwgICAgMCwgICAxNywgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAxMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMywgICAxNSwKKyAgICAgICAxOCwgICAxNiwgICAxMywgICAxMywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxMCwgICAxMSwgICAxMSwgICAgNiwgICAgNiwgICAxMywgICAgMCwgICAgMiwgICAgMCwKKyAgICAgICAgNywgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNSwgICAgMCwKKyAgICAgICAgOSwgICAgOSwgICAxMSwgICAxMSwgICAgNiwgICAgMCwgICAgNywgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAxNSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgNiwgICAgMCwgICAxNCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgOCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMywgICAxMiwKICAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMSwgICAgMCwKLQogICAgICAgICAwLCAgICA0LCAgICAwCisKICAgICB9IDsKIAogc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQpAQCAtNDE2LDE2ICs0MDIsMTYgQEAKICAgICAgICAgMiwgICAgMiwgICAgMiwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMiwgICAgMSwgICAgNCwgICAgNSwgICAgMSwgICAgMSwgICAgNiwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgNywgICAgOCwgICAgOCwgICAgOSwgICAgOCwgICAxMCwgICAxMSwgICAxMiwgICAxMywKLSAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxNCwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgOCwgICAgOCwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwKLSAgICAgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKLSAgICAgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwKLSAgICAgICAgMSwgICAxOCwgICAxOSwgICAgMSwgICAxNiwgICAgMSwgICAxNSwgICAyMCwgICAyMSwgICAyMiwKKyAgICAgICAgMSwgICAgNywgICAgNSwgICAgNSwgICAgOCwgICAgNSwgICAgOSwgICAxMCwgICAxMSwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMywgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgNSwgICAgNSwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwKKyAgICAgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwKKyAgICAgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNSwgICAxNiwgICAxNSwgICAxNSwKKyAgICAgICAgMSwgICAxNywgICAxOCwgICAgMSwgICAxNSwgICAgMSwgICAxNCwgICAxOSwgICAyMCwgICAyMSwKIAotICAgICAgIDIzLCAgIDE1LCAgIDE2LCAgIDI0LCAgIDI1LCAgIDE2LCAgIDE2LCAgIDI2LCAgIDI3LCAgIDI4LAotICAgICAgIDI0LCAgIDE2LCAgIDE2LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDE2LCAgIDE3LAotICAgICAgIDE2LCAgIDE2LCAgIDM0LCAgICAxLCAgIDM1LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDIyLCAgIDE0LCAgIDE1LCAgIDE1LCAgIDIzLCAgIDE1LCAgIDE1LCAgIDI0LCAgIDI1LCAgIDI2LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDE1LCAgIDE2LAorICAgICAgIDE1LCAgIDE1LCAgIDMyLCAgICAxLCAgIDMzLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLApAQCAtNDQyLDEzNiArNDI4LDExNCBAQAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9tZXRhWzM2XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfbWV0YVszNF0gPQogICAgIHsgICAwLAotICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAyLCAgICAyLCAgICAyLCAgICAzLAotICAgICAgICA0LCAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA3LCAgICA3LCAgICAxLCAgICAxLCAgICA2LAotICAgICAgICA2LCAgICA2LCAgICA2LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LAotICAgICAgICA3LCAgICA3LCAgICA3LCAgICA4LCAgICAxCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDEsICAgIDIsICAgIDIsICAgIDMsICAgIDQsCisgICAgICAgIDQsICAgIDQsICAgIDUsICAgIDYsICAgIDcsICAgIDcsICAgIDEsICAgIDEsICAgIDYsICAgIDYsCisgICAgICAgIDYsICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgIDcsICAgIDgsICAgIDEKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Jhc2VbMTE3XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYmFzZVsxMDZdID0KICAgICB7ICAgMCwKLSAgICAgICAgMCwgICAgMCwgICAzMCwgICAgMCwgICA0NCwgICAgMCwgICA2NywgICAgMCwgICA5NywgIDEwNSwKLSAgICAgIDMwMiwgIDMwMywgICAzNSwgICA0NCwgICA0MCwgICA5NCwgIDExMiwgICAgMCwgIDEyOSwgIDE1MiwKLSAgICAgIDI5NiwgIDI5NSwgIDE1OSwgICAgMCwgIDE3NiwgIDMwMywgICAgMCwgIDExNiwgICA5NSwgIDE2NSwKLSAgICAgICA0OSwgICA0NiwgIDEwMiwgIDMwMywgIDI5NiwgICAgMCwgICAgMCwgIDI4OCwgIDI5MCwgIDI5MywKLSAgICAgIDI2NCwgIDI2NiwgIDI3MCwgICAgMCwgICAgMCwgIDMwMywgICAgMCwgIDMwMywgIDI2NCwgIDMwMywKLSAgICAgICAgMCwgICAgMCwgIDE5NSwgIDEwMSwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgIDI4NCwgIDEyNSwKLSAgICAgIDI3NywgIDI2NSwgIDIyNSwgIDIzMCwgIDIxNiwgIDIxOCwgICAgMCwgIDIwMiwgIDIyNCwgIDIyMSwKLSAgICAgIDIxNywgIDEwNywgIDE5NiwgIDE4OCwgIDMwMywgIDIwNiwgIDE3OSwgIDE4NiwgIDE3OCwgIDE4NSwKLSAgICAgIDE4MywgIDE2MiwgIDE2MSwgIDE1MCwgIDE2OSwgIDE2MCwgIDE0NSwgIDEyNSwgIDMwMywgIDMwMywKLSAgICAgIDEzNywgIDEwOSwgIDE5MCwgIDEwMywgIDIwMywgIDE2NywgIDEwOCwgIDE5NywgIDMwMywgIDEyMywKKyAgICAgICAgMCwgICAgMCwgIDIzNywgIDIzNiwgICAyNSwgICAgMCwgICA0NywgICAgMCwgICAzMCwgICA3MSwKKyAgICAgIDI0NCwgIDI0NywgICA4MiwgICA4NCwgICA4NCwgIDIxMSwgICA5NSwgIDIyOSwgIDIxOCwgICAgMCwKKyAgICAgIDExMSwgIDI0NywgICAgMCwgICA4NCwgICA4MywgICA5NSwgIDEwNiwgICA4NiwgIDI0NywgIDIzNywKKyAgICAgICAgMCwgIDIzMCwgIDIzMSwgIDIzNCwgIDIwNywgIDIwOSwgIDIxMiwgIDIyMCwgIDI0NywgIDIwNiwKKyAgICAgIDI0NywgIDIxOCwgICAgMCwgIDEwNiwgIDExNiwgICAgMCwgICAgMCwgICAgMCwgIDIyMywgICA4OSwKKyAgICAgIDIyNiwgIDIxOSwgIDE5OSwgIDIwNiwgIDIwMCwgIDIwNCwgICAgMCwgIDE5MCwgIDIxMywgIDIxMiwKKyAgICAgIDIwMiwgICA5MSwgIDE3OCwgIDE2MSwgIDI0NywgIDE3MiwgIDE0NCwgIDE1MCwgIDE0MCwgIDEzMCwKKyAgICAgIDE0MCwgIDEyNCwgIDEyOCwgIDEyMCwgIDEzOCwgIDEzNywgIDEyMywgIDEyMiwgIDI0NywgIDI0NywKKyAgICAgIDEzNCwgIDExNCwgIDEzMiwgICA4NiwgIDEzNSwgIDEyNSwgICA5MCwgIDEzNiwgIDI0NywgICA5NywKKyAgICAgICAyOSwgIDI0NywgIDI0NywgIDE1MywgIDE1NiwgIDE2MSwgIDE2NSwgIDE3MCwgIDE3NiwgIDE4MCwKIAotICAgICAgIDI5LCAgMzAzLCAgMzAzLCAgMjE1LCAgMjIxLCAgMjI2LCAgMjI5LCAgMjM0LCAgMjQwLCAgMjQ2LAotICAgICAgMjUwLCAgMjU3LCAgMjY1LCAgMjcwLCAgMjc1LCAgMjgyCisgICAgICAxODcsICAxOTUsICAyMDAsICAyMDUsICAyMTIKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZlsxMTddID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9kZWZbMTA2XSA9CiAgICAgeyAgIDAsCi0gICAgICAxMDMsICAgIDEsICAgIDEsICAgIDMsICAgIDMsICAgIDUsICAxMDMsICAgIDcsICAgIDMsICAgIDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDQsICAxMDUsICAxMDMsICAxMDYsICAxMDMsICAgMTksCi0gICAgICAgMTksICAgMjAsICAxMDMsICAxMDcsICAgMjAsICAxMDMsICAxMDgsICAxMDksICAxMDUsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDQsICAxMDMsICAxMDQsICAxMTAsICAxMTEsICAxMDMsICAxMTIsICAxMTMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDYsICAgMTksICAxMDMsICAgMjAsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAgMjAsICAxMDgsICAxMDksICAxMDMsICAxMTQsICAxMTAsICAxMTEsICAxMTUsICAxMTIsICAxMTIsCi0gICAgICAxMTMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMTQsICAxMTUsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMTYsICAxMDMsICAxMTYsICAxMDMsICAxMTYsCisgICAgICAgOTMsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDUsICAgOTMsICAgIDcsICAgIDEsICAgIDEsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTQsICAgOTUsICAgOTMsICAgOTYsICAgMTcsICAgOTcsCisgICAgICAgOTYsICAgOTMsICAgOTgsICAgOTksICAgOTMsICAgOTMsICAgOTMsICAgOTQsICAgOTMsICAgOTQsCisgICAgICAxMDAsICAgOTMsICAxMDEsICAxMDIsICAgOTMsICAgOTMsICAgOTMsICAgOTYsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTYsICAgOTgsICAgOTksICAgOTMsICAxMDMsICAxMDAsICAxMDQsICAxMDEsICAxMDEsCisgICAgICAxMDIsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAxMDMsICAxMDQsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAxMDUsICAgOTMsICAxMDUsICAgOTMsICAxMDUsCisgICAgICAgOTMsICAgOTMsICAgIDAsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCiAKLSAgICAgIDEwMywgIDEwMywgICAgMCwgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMworICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzCiAgICAgfSA7CiAKLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbMzM5XSA9CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0WzI4MV0gPQogICAgIHsgICAwLAotICAgICAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDEyLCAgIDE2LCAgIDEyLCAgIDEyLCAgIDEyLCAgIDE3LAotICAgICAgIDE4LCAgIDE4LCAgIDE4LCAgIDEyLCAgIDE5LCAgIDIwLCAgIDIwLCAgIDEyLCAgIDEyLCAgIDIxLAotICAgICAgIDE5LCAgIDIxLCAgIDE5LCAgIDIyLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAotICAgICAgIDIwLCAgIDIwLCAgIDIwLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDMyLCAgIDMyLCAgMTAyLCAgIDIzLAotICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDM0LCAgIDIwLCAgIDMyLCAgIDMyLCAgIDMyLCAgIDMyLCAgIDIwLAotICAgICAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDI0LCAgIDI0LCAgIDI0LCAgIDM1LCAgIDI1LCAgIDU0LAotICAgICAgIDU0LCAgIDU0LCAgIDI2LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDEyLCAgIDEzLCAgIDE0LAotICAgICAgIDE1LCAgIDI3LCAgIDEyLCAgIDI3LCAgIDI3LCAgIDI3LCAgIDIzLCAgIDI3LCAgIDI3LCAgIDI3LAotICAgICAgIDEyLCAgIDI4LCAgIDI4LCAgIDI4LCAgIDEyLCAgIDEyLCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LAotICAgICAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LCAgIDI4LAorICAgICAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDEyLCAgIDE2LCAgIDEyLCAgIDEyLCAgIDE3LCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDE4LCAgIDE4LCAgIDE4LCAgIDEyLCAgIDEyLCAgIDE4LCAgIDE4LAorICAgICAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LCAgIDE4LAorICAgICAgIDE4LCAgIDEyLCAgIDEyLCAgIDE5LCAgIDIwLCAgIDIwLCAgIDIwLCAgIDkyLCAgIDIxLCAgIDI1LAorICAgICAgIDI2LCAgIDI2LCAgIDIyLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDEyLCAgIDEzLCAgIDE0LAorICAgICAgIDE1LCAgIDIzLCAgIDE2LCAgIDIzLCAgIDIzLCAgIDE5LCAgIDIzLCAgIDIzLCAgIDIzLCAgIDEyLAorICAgICAgIDI0LCAgIDI0LCAgIDI0LCAgIDEyLCAgIDEyLCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LAorICAgICAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDI0LCAgIDEyLCAgIDEyLAorICAgICAgIDI1LCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI3LCAgIDI5LCAgIDQzLCAgIDI5LAorICAgICAgIDQzLCAgIDQzLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDUwLCAgIDM5LCAgIDU5LCAgIDQ2LCAgIDkzLAogCi0gICAgICAgMTIsICAgMTIsICAgMjksICAgMzYsICAxMDMsICAgMzQsICAgMTcsICAgMzAsICAgMzEsICAgMzEsCi0gICAgICAgMjksICAgNTQsICAgNTQsICAgNTQsICAgMTcsICAgMzAsICAgMzEsICAgMzEsICAgMzksICAgMzUsCi0gICAgICAgNTIsICAgNDAsICAgNTIsICAgNTIsICAgNTIsICAxMDMsICAgNzgsICAgMzgsICAgMzgsICAgNDYsCi0gICAgICAxMDEsICAgNjAsICAgNzksICAgNDEsICAgNjksICAgOTcsICAgNDIsICAgOTQsICAgNDMsICAgNDUsCi0gICAgICAgNDUsICAgNDUsICAgNDYsICAgNDUsICAgNDcsICAgNDcsICAgOTMsICAgOTIsICAgNDUsICAgNDUsCi0gICAgICAgNDUsICAgNDUsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsCi0gICAgICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgMzksICAgNDcsICAgOTEsICAgNDAsICAgOTAsCi0gICAgICAgOTksICAgNDcsICAgNDcsICAgNDcsICAgNDcsICAgNTQsICAgNTQsICAgNTQsICAgODksICAgODgsCi0gICAgICAgNDEsICAgNTUsICAgODcsICAgNDksICAxMDAsICAgNDMsICAgNTEsICAgNTEsICAgNTEsICAgODYsCi0gICAgICAgNTEsICAgOTUsICAgOTUsICAgOTYsICAgODUsICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTIsCisgICAgICAgMzAsICAgMzMsICAgMzAsICAgMzQsICAgNDUsICAgNDUsICAgNDUsICAgMjcsICAgMjcsICAgNjgsCisgICAgICAgNDMsICAgOTEsICAgNDMsICAgNDMsICAgNjksICAgMzUsICAgODcsICAgMzYsICAgMzksICAgMzcsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgMzksICAgNDIsICAgNDUsICAgNDUsICAgNDUsICAgODksICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgODUsICAgODUsICAgODYsICAgODUsICAgODUsICAgODYsICAgODksCisgICAgICAgODQsICAgOTAsICAgODMsICAgODIsICAgODEsICAgODAsICAgNzksICAgNzgsICAgNzcsICAgNzYsCisgICAgICAgNzUsICAgNzQsICAgOTAsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsCisgICAgICAgMjgsICAgMzEsICAgMzEsICAgMzEsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgNDEsICAgNzMsCisgICAgICAgNDEsICAgNDMsICAgNzIsICAgNDMsICAgNzEsICAgNDMsICAgNDMsICAgNDQsICAgMzMsICAgNDQsCisgICAgICAgNDQsICAgNDQsICAgNDQsICAgNDcsICAgNjksICAgNDcsICAgNDcsICAgNDksICAgNDksICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAgNTEsICAgNTEsICAgNTEsICAgNTEsICAgNTEsCiAKLSAgICAgICA5OSwgICA1MiwgICA1MiwgICA1MiwgICA5NSwgICA5NSwgICA5NiwgICA4NCwgICA0NiwgICA4MywKLSAgICAgICA4MiwgICA4MSwgICAzOSwgICA3OSwgIDEwMCwgICAzMywgICAzMywgICAzMywgICAzMywgICAzMywKLSAgICAgICAzMywgICAzMywgICAzMywgICAzNywgICA4MCwgICA3NywgICAzNywgICAzNywgICAzNywgICA0NCwKLSAgICAgICA0MCwgICA0NCwgICA1MCwgICA3NiwgICA1MCwgICA1MiwgICA3NSwgICA1MiwgICA3NCwgICA1MiwKLSAgICAgICA1MiwgICA1MywgICA3MywgICA1MywgICA1MywgICA1MywgICA1MywgICA1NiwgICA1NiwgICA1NiwKLSAgICAgICA3MiwgICA1NiwgICA1NiwgICA1NywgICA3MSwgICA1NywgICA1NywgICA1OSwgICA1OSwgICA1OSwKLSAgICAgICA1OSwgICA1OSwgICA1OSwgICA1OSwgICA1OSwgICA2MSwgICA2MSwgICA2MSwgICA2MSwgICA2MSwKLSAgICAgICA2MSwgICA2MSwgICA2MSwgICA2NywgICA3MCwgICA2NywgICA2OCwgICA2OCwgICA2OCwgICA2MiwKLSAgICAgICA2OCwgICA2OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwgICA5OCwKLSAgICAgICA2MCwgICA2NiwgICA2NSwgICA2NCwgICA2MywgICA2MiwgICA2MCwgICA1OCwgIDEwMywgICA0OCwKLQotICAgICAgIDQ4LCAgMTAzLCAgIDExLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzCisgICAgICAgNTEsICAgNTEsICAgNTEsICAgNTcsICAgNzAsICAgNTcsICAgNTgsICAgNTgsICAgNTgsICAgNjcsCisgICAgICAgNTgsICAgNTgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsICAgODgsCisgICAgICAgMzQsICAgNjYsICAgNjUsICAgNjQsICAgNjMsICAgNjIsICAgNjEsICAgNjAsICAgNTIsICAgNTAsCisgICAgICAgMzksICAgNTYsICAgMzksICAgNTUsICAgNTQsICAgNTMsICAgNTIsICAgNTAsICAgNDgsICAgOTMsCisgICAgICAgNDAsICAgMzksICAgMzIsICAgOTMsICAgMTksICAgMTksICAgMTEsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1szMzldID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9jaGtbMjgxXSA9CiAgICAgeyAgIDAsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDMsICAgMTMsICAgMTMsICAxMDEsICAgIDMsCi0gICAgICAgIDMsICAgIDMsICAgIDMsICAgMTUsICAgIDMsICAgMTQsICAgMTQsICAgMzIsICAgMzIsICAgIDMsCi0gICAgICAgIDMsICAgIDMsICAgIDMsICAgIDMsICAgIDUsICAgIDUsICAgIDUsICAgMTUsICAgIDUsICAgMzEsCi0gICAgICAgMzEsICAgMzEsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgOTEsICAgIDUsICAgIDksCisgICAgICAgIDksICAgIDksICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCiAgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgMTAsICAgMTAsICAgMTAsICAgMTMsICAgMTMsICAgMTQsICAgMTQsICAgMTUsICAgMjQsICAgMjgsCisgICAgICAgMjQsICAgMjQsICAgMjUsICAgMjUsICAgMjUsICAgNTAsICAgMjQsICAgNTAsICAgMjUsICAgOTAsCiAKLSAgICAgICAgNywgICAgNywgICAgOSwgICAxNiwgICAyOSwgICAzMywgICAgOSwgICAgOSwgICAgOSwgICAgOSwKLSAgICAgICAxMCwgICA1NCwgICA1NCwgICA1NCwgICAxMCwgICAxMCwgICAxMCwgICAxMCwgICAxNywgICAzMywKLSAgICAgICAyOCwgICAxNywgICAyOCwgICAyOCwgICAyOCwgIDEwMCwgICA3MiwgICAxNiwgICAyOSwgICAyOCwKLSAgICAgICA5NywgICA2MCwgICA3MiwgICAxNywgICA2MCwgICA5NCwgICAxNywgICA5MiwgICAxNywgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICA5MSwgICA4OCwgICAxOSwgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAxOSwKLSAgICAgICAxOSwgICAxOSwgICAyMCwgICAyMCwgICAyMCwgICAyMywgICAyMCwgICA4NywgICAyMywgICA4NiwKLSAgICAgICA5NiwgICAyMCwgICAyMCwgICAyMCwgICAyMCwgICAzMCwgICAzMCwgICAzMCwgICA4NSwgICA4NCwKLSAgICAgICAyMywgICAzMCwgICA4MywgICAyMywgICA5NiwgICAyMywgICAyNSwgICAyNSwgICAyNSwgICA4MiwKLSAgICAgICAyNSwgICA5MywgICA5MywgICA5MywgICA4MSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICA1MywKKyAgICAgICAxNSwgICAxNywgICAyOCwgICAxNywgICAyNiwgICAyNiwgICAyNiwgICAyNywgICAyNywgICA2MiwKKyAgICAgICA0NCwgICA4NywgICA0NCwgICA0NCwgICA2MiwgICAxNywgICA4NCwgICAxNywgICA0NCwgICAxNywKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICAyMSwgICA0NSwgICA0NSwgICA0NSwgICA4NiwgICAyMSwKKyAgICAgICAyMSwgICAyMSwgICAyMSwgICA4MywgICA4MywgICA4MywgICA4NSwgICA4NSwgICA4NSwgICA4OCwKKyAgICAgICA4MiwgICA4NiwgICA4MSwgICA3OCwgICA3NywgICA3NiwgICA3NSwgICA3NCwgICA3MywgICA3MiwKKyAgICAgICA3MSwgICA3MCwgICA4OCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwgICA5NCwKKyAgICAgICA5NCwgICA5NSwgICA5NSwgICA5NSwgICA5NiwgICA5NiwgICA5NiwgICA5NiwgICA5NywgICA2OSwKKyAgICAgICA5NywgICA5OCwgICA2OCwgICA5OCwgICA2NywgICA5OCwgICA5OCwgICA5OSwgICA2NiwgICA5OSwKKyAgICAgICA5OSwgICA5OSwgICA5OSwgIDEwMCwgICA2NCwgIDEwMCwgIDEwMCwgIDEwMSwgIDEwMSwgIDEwMSwKKyAgICAgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMSwgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMiwKIAotICAgICAgIDk4LCAgIDUzLCAgIDUzLCAgIDUzLCAgIDk1LCAgIDk1LCAgIDk1LCAgIDgwLCAgIDUzLCAgIDc5LAotICAgICAgIDc4LCAgIDc3LCAgIDc2LCAgIDc0LCAgIDk4LCAgMTA0LCAgMTA0LCAgMTA0LCAgMTA0LCAgMTA0LAotICAgICAgMTA0LCAgMTA0LCAgMTA0LCAgMTA1LCAgIDczLCAgIDcxLCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA2LAotICAgICAgIDcwLCAgMTA2LCAgMTA3LCAgIDY5LCAgMTA3LCAgMTA4LCAgIDY4LCAgMTA4LCAgIDY2LCAgMTA4LAotICAgICAgMTA4LCAgMTA5LCAgIDY1LCAgMTA5LCAgMTA5LCAgMTA5LCAgMTA5LCAgMTEwLCAgMTEwLCAgMTEwLAotICAgICAgIDY0LCAgMTEwLCAgMTEwLCAgMTExLCAgIDYzLCAgMTExLCAgMTExLCAgMTEyLCAgMTEyLCAgMTEyLAotICAgICAgMTEyLCAgMTEyLCAgMTEyLCAgMTEyLCAgMTEyLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLAotICAgICAgMTEzLCAgMTEzLCAgMTEzLCAgMTE0LCAgIDYyLCAgMTE0LCAgMTE1LCAgMTE1LCAgMTE1LCAgIDYxLAotICAgICAgMTE1LCAgMTE1LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LCAgMTE2LAotICAgICAgIDU5LCAgIDQ5LCAgIDQzLCAgIDQyLCAgIDQxLCAgIDQwLCAgIDM5LCAgIDM4LCAgIDM1LCAgIDIyLAotCi0gICAgICAgMjEsICAgMTEsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMKKyAgICAgIDEwMiwgIDEwMiwgIDEwMiwgIDEwMywgICA2MywgIDEwMywgIDEwNCwgIDEwNCwgIDEwNCwgICA2MSwKKyAgICAgIDEwNCwgIDEwNCwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwgIDEwNSwKKyAgICAgICA2MCwgICA1OSwgICA1OCwgICA1NiwgICA1NSwgICA1NCwgICA1MywgICA1MiwgICA1MSwgICA0OSwKKyAgICAgICA0MiwgICA0MCwgICAzOCwgICAzNywgICAzNiwgICAzNSwgICAzNCwgICAzMywgICAzMiwgICAzMCwKKyAgICAgICAxOSwgICAxOCwgICAxNiwgICAxMSwgICAgNCwgICAgMywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MwogICAgIH0gOwogCi0vKiBUYWJsZSBvZiBib29sZWFucywgdHJ1ZSBpZiBydWxlIGNvdWxkIG1hdGNoIGVvbC4gKi8KLXN0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9ydWxlX2Nhbl9tYXRjaF9lb2xbMjFdID0KLSAgICB7ICAgMCwKLTEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIAotICAgIDAsICAgICB9OwotCiBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKIHN0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOwogCkBAIC02MTYsNiArNTgwLDEzIEBACiAjaW5jbHVkZSAic3JjcG9zLmgiCiAjaW5jbHVkZSAiZHRjLXBhcnNlci50YWIuaCIKIAorWVlMVFlQRSB5eWxsb2M7CisKKy8qIENBVVRJT046IHRoaXMgd2lsbCBzdG9wIHdvcmtpbmcgaWYgd2UgZXZlciB1c2UgeXlsZXNzKCkgb3IgeXl1bnB1dCgpICovCisjZGVmaW5lCVlZX1VTRVJfQUNUSU9OIFwKKwl7IFwKKwkJc3JjcG9zX3VwZGF0ZSgmeXlsbG9jLCB5eXRleHQsIHl5bGVuZyk7IFwKKwl9CiAKIC8qI2RlZmluZSBMRVhERUJVRwkxKi8KIApAQCAtNjI1LDE5ICs1OTYsMTQgQEAKICNkZWZpbmUgRFBSSU5UKGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGludCBkdHNfdmVyc2lvbjsgLyogPSAwICovCitzdGF0aWMgaW50IGR0c192ZXJzaW9uID0gMTsKIAotI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJaWYgKGR0c192ZXJzaW9uID09IDApIHsgXAotCQkJCURQUklOVCgiPElOSVRJQUw+XG4iKTsgXAotCQkJCUJFR0lOKElOSVRJQUwpOyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJRFBSSU5UKCI8VjE+XG4iKTsgXAorI2RlZmluZSBCRUdJTl9ERUZBVUxUKCkJCURQUklOVCgiPFYxPlxuIik7IFwKIAkJCQlCRUdJTihWMSk7IFwKLQkJCX0KIAogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCk7Ci0jbGluZSA2NDEgImR0Yy1sZXhlci5sZXguYyIKKyNsaW5lIDYwNyAiZHRjLWxleGVyLmxleC5jIgogCiAjZGVmaW5lIElOSVRJQUwgMAogI2RlZmluZSBJTkNMVURFIDEKQEAgLTgyNiw5ICs3OTIsOSBAQAogCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CiAJcmVnaXN0ZXIgaW50IHl5X2FjdDsKICAgICAKLSNsaW5lIDY0ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDY2ICJkdGMtbGV4ZXIubCIKIAotI2xpbmUgODMyICJkdGMtbGV4ZXIubGV4LmMiCisjbGluZSA3OTggImR0Yy1sZXhlci5sZXguYyIKIAogCWlmICggISh5eV9pbml0KSApCiAJCXsKQEAgLTg4MSwzNSArODQ3LDIxIEBACiAJCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQkJewogCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDk0ICkKIAkJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQkJfQogCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQkrK3l5X2NwOwogCQkJfQotCQl3aGlsZSAoIHl5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gIT0gMzAzICk7CisJCXdoaWxlICggeXlfY3VycmVudF9zdGF0ZSAhPSA5MyApOworCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKKwkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7CiAKIHl5X2ZpbmRfYWN0aW9uOgogCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCWlmICggeXlfYWN0ID09IDAgKQotCQkJeyAvKiBoYXZlIHRvIGJhY2sgdXAgKi8KLQkJCXl5X2NwID0gKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpOwotCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7Ci0JCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQl9CiAKIAkJWVlfRE9fQkVGT1JFX0FDVElPTjsKIAotCQlpZiAoIHl5X2FjdCAhPSBZWV9FTkRfT0ZfQlVGRkVSICYmIHl5X3J1bGVfY2FuX21hdGNoX2VvbFt5eV9hY3RdICkKLQkJCXsKLQkJCWludCB5eWw7Ci0JCQlmb3IgKCB5eWwgPSAwOyB5eWwgPCB5eWxlbmc7ICsreXlsICkKLQkJCQlpZiAoIHl5dGV4dFt5eWxdID09ICdcbicgKQotCQkJCQkgICAKLSAgICB5eWxpbmVubysrOwotOwotCQkJfQotCiBkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KIAogCQlzd2l0Y2ggKCB5eV9hY3QgKQpAQCAtOTI0LDcgKzg3Niw3IEBACiBjYXNlIDE6CiAvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgNjUgImR0Yy1sZXhlci5sIgorI2xpbmUgNjcgImR0Yy1sZXhlci5sIgogewogCQkJY2hhciAqbmFtZSA9IHN0cmNocih5eXRleHQsICdcIicpICsgMTsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwpAQCAtOTM2LDcgKzg4OCw3IEBACiBjYXNlIFlZX1NUQVRFX0VPRihCWVRFU1RSSU5HKToKIGNhc2UgWVlfU1RBVEVfRU9GKFBST1BOT0RFTkFNRSk6CiBjYXNlIFlZX1NUQVRFX0VPRihWMSk6Ci0jbGluZSA3MSAiZHRjLWxleGVyLmwiCisjbGluZSA3MyAiZHRjLWxleGVyLmwiCiB7CiAJCQlpZiAoIXBvcF9pbnB1dF9maWxlKCkpIHsKIAkJCQl5eXRlcm1pbmF0ZSgpOwpAQCAtOTQ2LDIzICs4OTgsMTggQEAKIGNhc2UgMjoKIC8qIHJ1bGUgMiBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSA3NyAiZHRjLWxleGVyLmwiCisjbGluZSA3OSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiU3RyaW5nOiAlc1xuIiwgeXl0ZXh0KTsKIAkJCXl5bHZhbC5kYXRhID0gZGF0YV9jb3B5X2VzY2FwZV9zdHJpbmcoeXl0ZXh0KzEsCiAJCQkJCXl5bGVuZy0yKTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlyZXR1cm4gRFRfU1RSSU5HOwogCQl9CiAJWVlfQlJFQUsKIGNhc2UgMzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDg3ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDg2ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvZHRzLXYxL1xuIik7CiAJCQlkdHNfdmVyc2lvbiA9IDE7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CkBAIC05NzEsMTAgKzkxOCw4IEBACiAJWVlfQlJFQUsKIGNhc2UgNDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDk2ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDkzICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvbWVtcmVzZXJ2ZS9cbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuIERUX01FTVJFU0VSVkU7CkBAIC05ODIsMTU4ICs5MjcsMTAwIEBACiAJWVlfQlJFQUsKIGNhc2UgNToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDEwNCAiZHRjLWxleGVyLmwiCisjbGluZSA5OSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiTGFiZWw6ICVzXG4iLCB5eXRleHQpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCk7CisJCQl5eWx2YWwubGFiZWxyZWYgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQl5eWx2YWwubGFiZWxyZWZbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCXJldHVybiBEVF9MQUJFTDsKIAkJfQogCVlZX0JSRUFLCiBjYXNlIDY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxMTMgImR0Yy1sZXhlci5sIgorI2xpbmUgMTA2ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJaWYgKCp5eXRleHQgPT0gJ2InKQotCQkJCXl5bHZhbC5jYmFzZSA9IDI7Ci0JCQllbHNlIGlmICgqeXl0ZXh0ID09ICdvJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSA4OwotCQkJZWxzZSBpZiAoKnl5dGV4dCA9PSAnZCcpCi0JCQkJeXlsdmFsLmNiYXNlID0gMTA7Ci0JCQllbHNlCi0JCQkJeXlsdmFsLmNiYXNlID0gMTY7Ci0JCQlEUFJJTlQoIkJhc2U6ICVkXG4iLCB5eWx2YWwuY2Jhc2UpOwotCQkJcmV0dXJuIERUX0JBU0U7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSA3OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTI4ICJkdGMtbGV4ZXIubCIKLXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKLQkJCURQUklOVCgiTGl0ZXJhbDogJyVzJ1xuIiwgeXlsdmFsLmxpdGVyYWwpOwotCQkJcmV0dXJuIERUX0xFR0FDWUxJVEVSQUw7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSA4OgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTM2ICJkdGMtbGV4ZXIubCIKLXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJeXlsdmFsLmxpdGVyYWwgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5saXRlcmFsID0geHN0cmR1cCh5eXRleHQpOwogCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7CiAJCQlyZXR1cm4gRFRfTElURVJBTDsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDk6CitjYXNlIDc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNDQgImR0Yy1sZXhlci5sIgorI2xpbmUgMTEyICJkdGMtbGV4ZXIubCIKIHsJLyogbGFiZWwgcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzEpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEwOgorY2FzZSA4OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTUyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDExOCAiZHRjLWxleGVyLmwiCiB7CS8qIG5ldy1zdHlsZSBwYXRoIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eXRleHRbeXlsZW5nLTFdID0gJ1wwJzsKIAkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzIpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsyKTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KzIpOwogCQkJcmV0dXJuIERUX1JFRjsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDExOgorY2FzZSA5OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTYxICJkdGMtbGV4ZXIubCIKLXsJLyogb2xkLXN0eWxlIHBhdGggcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCURQUklOVCgiUmVmOiAlc1xuIiwgeXl0ZXh0KzEpOwotCQkJeXlsdmFsLmxhYmVscmVmID0gc3RyZHVwKHl5dGV4dCsxKTsKLQkJCXJldHVybiBEVF9SRUY7Ci0JCX0KLQlZWV9CUkVBSwotY2FzZSAxMjoKLVlZX1JVTEVfU0VUVVAKLSNsaW5lIDE2OSAiZHRjLWxleGVyLmwiCisjbGluZSAxMjUgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQl5eWx2YWwuYnl0ZSA9IHN0cnRvbCh5eXRleHQsIE5VTEwsIDE2KTsKIAkJCURQUklOVCgiQnl0ZTogJTAyeFxuIiwgKGludCl5eWx2YWwuYnl0ZSk7CiAJCQlyZXR1cm4gRFRfQllURTsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDEzOgorY2FzZSAxMDoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE3NyAiZHRjLWxleGVyLmwiCisjbGluZSAxMzEgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIi9CWVRFU1RSSU5HXG4iKTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiAnXSc7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNDoKK2Nhc2UgMTE6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxODUgImR0Yy1sZXhlci5sIgorI2xpbmUgMTM3ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJQcm9wTm9kZU5hbWU6ICVzXG4iLCB5eXRleHQpOwotCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiBEVF9QUk9QTk9ERU5BTUU7CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNToKK2Nhc2UgMTI6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxOTQgImR0Yy1sZXhlci5sIgorI2xpbmUgMTQ0ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJCaW5hcnkgSW5jbHVkZVxuIik7CiAJCQlyZXR1cm4gRFRfSU5DQklOOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTY6Ci0vKiBydWxlIDE2IGNhbiBtYXRjaCBlb2wgKi8KK2Nhc2UgMTM6CisvKiBydWxlIDEzIGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwMSAiZHRjLWxleGVyLmwiCisjbGluZSAxNDkgImR0Yy1sZXhlci5sIgogLyogZWF0IHdoaXRlc3BhY2UgKi8KIAlZWV9CUkVBSwotY2FzZSAxNzoKLS8qIHJ1bGUgMTcgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAxNDoKKy8qIHJ1bGUgMTQgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE1MCAiZHRjLWxleGVyLmwiCiAvKiBlYXQgQy1zdHlsZSBjb21tZW50cyAqLwogCVlZX0JSRUFLCi1jYXNlIDE4OgotLyogcnVsZSAxOCBjYW4gbWF0Y2ggZW9sICovCitjYXNlIDE1OgorLyogcnVsZSAxNSBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDMgImR0Yy1sZXhlci5sIgorI2xpbmUgMTUxICJkdGMtbGV4ZXIubCIKIC8qIGVhdCBDKystc3R5bGUgY29tbWVudHMgKi8KIAlZWV9CUkVBSwotY2FzZSAxOToKK2Nhc2UgMTY6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDUgImR0Yy1sZXhlci5sIgorI2xpbmUgMTUzICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJDaGFyOiAlYyAoXFx4JTAyeClcbiIsIHl5dGV4dFswXSwKIAkJCQkodW5zaWduZWQpeXl0ZXh0WzBdKTsKIAkJCWlmICh5eXRleHRbMF0gPT0gJ1snKSB7CkBAIC0xMTQ4LDEyICsxMDM1LDEyIEBACiAJCQlyZXR1cm4geXl0ZXh0WzBdOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMjA6CitjYXNlIDE3OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjIyICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE2OCAiZHRjLWxleGVyLmwiCiBFQ0hPOwogCVlZX0JSRUFLCi0jbGluZSAxMTU3ICJkdGMtbGV4ZXIubGV4LmMiCisjbGluZSAxMDQ0ICJkdGMtbGV4ZXIubGV4LmMiCiAKIAljYXNlIFlZX0VORF9PRl9CVUZGRVI6CiAJCXsKQEAgLTEyMTgsNyArMTEwNSw4IEBACiAKIAkJCWVsc2UKIAkJCQl7Ci0JCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfY3AgPSAoeXlfbGFzdF9hY2NlcHRpbmdfY3Bvcyk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZSk7CiAJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKIAkJCQl9CiAJCQl9CkBAIC0xNDQzLDcgKzEzMzEsNyBAQAogCQl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCQl7CiAJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gOTQgKQogCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQkJfQogCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKQEAgLTE0NzEsMTEgKzEzNTksMTEgQEAKIAl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCiAJCXsKIAkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKLQkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDEwNCApCisJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCiAJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKIAkJfQogCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwotCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlID09IDEwMyk7CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gOTMpOwogCiAJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOwogfQpAQCAtMTU1MCwxMSArMTQzOCw2IEBACiAJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CS8qIHByZXNlcnZlIHl5dGV4dCAqLwogCSh5eV9ob2xkX2NoYXIpID0gKisrKHl5X2NfYnVmX3ApOwogCi0JaWYgKCBjID09ICdcbicgKQotCQkgICAKLSAgICB5eWxpbmVubysrOwotOwotCiAJcmV0dXJuIGM7CiB9CiAjZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCkBAIC0xNjY5LDEwICsxNTUyLDYgQEAKIAl5eWZyZWUoKHZvaWQgKikgYiAgKTsKIH0KIAotI2lmbmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuIGludCBpc2F0dHkgKGludCApOwotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0gICAgCiAvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgogICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKICAqIHN1Y2ggYXMgZHVyaW5nIGEgeXlyZXN0YXJ0KCkgb3IgYXQgRU9GLgpAQCAtMTY5Niw3ICsxNTc1LDcgQEAKICAgICAgICAgYi0+eXlfYnNfY29sdW1uID0gMDsKICAgICB9CiAKLSAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSBmaWxlID8gKGlzYXR0eSggZmlsZW5vKGZpbGUpICkgPiAwKSA6IDA7CisgICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKICAgICAKIAllcnJubyA9IG9lcnJubzsKIH0KQEAgLTIwMjUsOSArMTkwNCw2IEBACiAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB5eWxleF9kZXN0cm95KCksIHNvIGRvbid0IGFsbG9jYXRlIGhlcmUuCiAgICAgICovCiAKLSAgICAvKiBXZSBkbyBub3QgdG91Y2ggeXlsaW5lbm8gdW5sZXNzIHRoZSBvcHRpb24gaXMgZW5hYmxlZC4gKi8KLSAgICB5eWxpbmVubyA9ICAxOwotICAgIAogICAgICh5eV9idWZmZXJfc3RhY2spID0gMDsKICAgICAoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOwogICAgICh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IDA7CkBAIC0yMTIwLDEwNCArMTk5NiwyOSBAQAogCiAjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgogCi0jbGluZSAyMjIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTY4ICJkdGMtbGV4ZXIubCIKIAogCiAKLQotLyoKLSAqIFN0YWNrIG9mIG5lc3RlZCBpbmNsdWRlIGZpbGUgY29udGV4dHMuCi0gKi8KLQotc3RydWN0IGluY2xfZmlsZSB7Ci0Jc3RydWN0IGR0Y19maWxlICpmaWxlOwotCVlZX0JVRkZFUl9TVEFURSB5eV9wcmV2X2J1ZjsKLQlpbnQgeXlfcHJldl9saW5lbm87Ci0Jc3RydWN0IGluY2xfZmlsZSAqcHJldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGVfc3RhY2s7Ci0KLQotLyoKLSAqIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4KLSAqLwotI2RlZmluZSBNQVhfSU5DTFVERV9ERVBUSAkoMTAwKQotCi1zdGF0aWMgaW50IGluY2xfZGVwdGggPSAwOwotCi0KIHN0YXRpYyB2b2lkIHB1c2hfaW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0Jc3RydWN0IGR0Y19maWxlICpuZXdmaWxlOwotCXN0cnVjdCBzZWFyY2hfcGF0aCBzZWFyY2gsICpzZWFyY2hwdHIgPSBOVUxMOwotCiAJYXNzZXJ0KGZpbGVuYW1lKTsKIAotCWlmIChpbmNsX2RlcHRoKysgPj0gTUFYX0lOQ0xVREVfREVQVEgpCi0JCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKwlzcmNmaWxlX3B1c2goZmlsZW5hbWUpOwogCi0JaWYgKHNyY3Bvc19maWxlKSB7Ci0JCXNlYXJjaC5kaXIgPSBzcmNwb3NfZmlsZS0+ZGlyOwotCQlzZWFyY2gubmV4dCA9IE5VTEw7Ci0JCXNlYXJjaC5wcmV2ID0gTlVMTDsKLQkJc2VhcmNocHRyID0gJnNlYXJjaDsKLQl9CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAotCW5ld2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZpbGVuYW1lLCBzZWFyY2hwdHIpOwotCi0JaW5jbF9maWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGluY2xfZmlsZSkpOwotCi0JLyoKLQkgKiBTYXZlIGN1cnJlbnQgY29udGV4dC4KLQkgKi8KLQlpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0JaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubyA9IHl5bGluZW5vOwotCWluY2xfZmlsZS0+ZmlsZSA9IHNyY3Bvc19maWxlOwotCWluY2xfZmlsZS0+cHJldiA9IGluY2xfZmlsZV9zdGFjazsKLQotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZTsKLQotCS8qCi0JICogRXN0YWJsaXNoIG5ldyBjb250ZXh0LgotCSAqLwotCXNyY3Bvc19maWxlID0gbmV3ZmlsZTsKLQl5eWxpbmVubyA9IDE7Ci0JeXlpbiA9IG5ld2ZpbGUtPmZpbGU7Ci0JeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sWVlfQlVGX1NJWkUpKTsKKwl5eXB1c2hfYnVmZmVyX3N0YXRlKHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSkpOwogfQogCiAKIHN0YXRpYyBpbnQgcG9wX2lucHV0X2ZpbGUodm9pZCkKIHsKLQlzdHJ1Y3QgaW5jbF9maWxlICppbmNsX2ZpbGU7Ci0KLQlpZiAoaW5jbF9maWxlX3N0YWNrID09IDApCisJaWYgKHNyY2ZpbGVfcG9wKCkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlkdGNfY2xvc2VfZmlsZShzcmNwb3NfZmlsZSk7Ci0KLQkvKgotCSAqIFBvcC4KLQkgKi8KLQktLWluY2xfZGVwdGg7Ci0JaW5jbF9maWxlID0gaW5jbF9maWxlX3N0YWNrOwotCWluY2xfZmlsZV9zdGFjayA9IGluY2xfZmlsZS0+cHJldjsKLQotCS8qCi0JICogUmVjb3ZlciBvbGQgY29udGV4dC4KLQkgKi8KLQl5eV9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSKTsKLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKGluY2xfZmlsZS0+eXlfcHJldl9idWYpOwotCXl5bGluZW5vID0gaW5jbF9maWxlLT55eV9wcmV2X2xpbmVubzsKLQlzcmNwb3NfZmlsZSA9IGluY2xfZmlsZS0+ZmlsZTsKLQl5eWluID0gaW5jbF9maWxlLT5maWxlID8gaW5jbF9maWxlLT5maWxlLT5maWxlIDogTlVMTDsKLQotCS8qCi0JICogRnJlZSBvbGQgc3RhdGUuCi0JICovCi0JZnJlZShpbmNsX2ZpbGUpOworCXl5cG9wX2J1ZmZlcl9zdGF0ZSgpOworCXl5aW4gPSBjdXJyZW50X3NyY2ZpbGUtPmY7CiAKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZCBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZAppbmRleCAyNzEyOTM3Li45YmUyZWVhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkCkBAIC0xLDI0ICsxLDIzIEBACi0vKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi4zLiAgKi8KKworLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuNC4xLiAgKi8KIAogLyogU2tlbGV0b24gaW1wbGVtZW50YXRpb24gZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQwotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIAorICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KKyAgIAogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKICAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCkBAIC0yOSw3ICsyOCw3IEBACiAgICBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgc2tlbGV0b24gYW5kIHRoZSByZXN1bHRpbmcKICAgIEJpc29uIG91dHB1dCBmaWxlcyB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIHdpdGhvdXQgdGhpcyBzcGVjaWFsIGV4Y2VwdGlvbi4KLQorICAgCiAgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluCiAgICB2ZXJzaW9uIDIuMiBvZiBCaXNvbi4gICovCiAKQEAgLTQ3LDcgKzQ2LDcgQEAKICNkZWZpbmUgWVlCSVNPTiAxCiAKIC8qIEJpc29uIHZlcnNpb24uICAqLwotI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuMyIKKyNkZWZpbmUgWVlCSVNPTl9WRVJTSU9OICIyLjQuMSIKIAogLyogU2tlbGV0b24gbmFtZS4gICovCiAjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgpAQCAtNTUsNTUgKzU0LDMyIEBACiAvKiBQdXJlIHBhcnNlcnMuICAqLwogI2RlZmluZSBZWVBVUkUgMAogCisvKiBQdXNoIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVU0ggMAorCisvKiBQdWxsIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVTEwgMQorCiAvKiBVc2luZyBsb2NhdGlvbnMuICAqLwotI2RlZmluZSBZWUxTUF9ORUVERUQgMQotCi0KLQotLyogVG9rZW5zLiAgKi8KLSNpZm5kZWYgWVlUT0tFTlRZUEUKLSMgZGVmaW5lIFlZVE9LRU5UWVBFCi0gICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKLSAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCi0gICBlbnVtIHl5dG9rZW50eXBlIHsKLSAgICAgRFRfVjEgPSAyNTgsCi0gICAgIERUX01FTVJFU0VSVkUgPSAyNTksCi0gICAgIERUX1BST1BOT0RFTkFNRSA9IDI2MCwKLSAgICAgRFRfTElURVJBTCA9IDI2MSwKLSAgICAgRFRfTEVHQUNZTElURVJBTCA9IDI2MiwKLSAgICAgRFRfQkFTRSA9IDI2MywKLSAgICAgRFRfQllURSA9IDI2NCwKLSAgICAgRFRfU1RSSU5HID0gMjY1LAotICAgICBEVF9MQUJFTCA9IDI2NiwKLSAgICAgRFRfUkVGID0gMjY3LAotICAgICBEVF9JTkNCSU4gPSAyNjgKLSAgIH07Ci0jZW5kaWYKLS8qIFRva2Vucy4gICovCi0jZGVmaW5lIERUX1YxIDI1OAotI2RlZmluZSBEVF9NRU1SRVNFUlZFIDI1OQotI2RlZmluZSBEVF9QUk9QTk9ERU5BTUUgMjYwCi0jZGVmaW5lIERUX0xJVEVSQUwgMjYxCi0jZGVmaW5lIERUX0xFR0FDWUxJVEVSQUwgMjYyCi0jZGVmaW5lIERUX0JBU0UgMjYzCi0jZGVmaW5lIERUX0JZVEUgMjY0Ci0jZGVmaW5lIERUX1NUUklORyAyNjUKLSNkZWZpbmUgRFRfTEFCRUwgMjY2Ci0jZGVmaW5lIERUX1JFRiAyNjcKLSNkZWZpbmUgRFRfSU5DQklOIDI2OAotCisjZGVmaW5lIFlZTFNQX05FRURFRCAwCiAKIAogCiAvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KLSNsaW5lIDIzICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxICJkdGMtcGFyc2VyLnkiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAiZHRjLmgiCiAjaW5jbHVkZSAic3JjcG9zLmgiCiAKK1lZTFRZUEUgeXlsbG9jOworCiBleHRlcm4gaW50IHl5bGV4KHZvaWQpOworZXh0ZXJuIHZvaWQgcHJpbnRfZXJyb3IoY2hhciBjb25zdCAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICpzKTsKIAogZXh0ZXJuIHN0cnVjdCBib290X2luZm8gKnRoZV9ib290X2luZm87CiBleHRlcm4gaW50IHRyZWVzb3VyY2VfZXJyb3I7CkBAIC0xMTEsNiArODcsOSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBldmFsX2xpdGVyYWwoY29uc3QgY2hhciAqcywgaW50IGJhc2UsIGludCBiaXRzKTsKIAogCisvKiBMaW5lIDE4OSBvZiB5YWNjLmMgICovCisjbGluZSA5MiAiZHRjLXBhcnNlci50YWIuYyIKKwogLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KICNpZm5kZWYgWVlERUJVRwogIyBkZWZpbmUgWVlERUJVRyAwCkBAIC0xMjksMTAgKzEwOCwzNSBAQAogIyBkZWZpbmUgWVlUT0tFTl9UQUJMRSAwCiAjZW5kaWYKIAorCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBEVF9WMSA9IDI1OCwKKyAgICAgRFRfTUVNUkVTRVJWRSA9IDI1OSwKKyAgICAgRFRfUFJPUE5PREVOQU1FID0gMjYwLAorICAgICBEVF9MSVRFUkFMID0gMjYxLAorICAgICBEVF9CQVNFID0gMjYyLAorICAgICBEVF9CWVRFID0gMjYzLAorICAgICBEVF9TVFJJTkcgPSAyNjQsCisgICAgIERUX0xBQkVMID0gMjY1LAorICAgICBEVF9SRUYgPSAyNjYsCisgICAgIERUX0lOQ0JJTiA9IDI2NworICAgfTsKKyNlbmRpZgorCisKKwogI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKLSNsaW5lIDM3ICJkdGMtcGFyc2VyLnkiCiB7CisKKy8qIExpbmUgMjE0IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5ICJkdGMtcGFyc2VyLnkiCisKIAljaGFyICpwcm9wbm9kZW5hbWU7CiAJY2hhciAqbGl0ZXJhbDsKIAljaGFyICpsYWJlbHJlZjsKQEAgLTE0NywzNCArMTUxLDIzIEBACiAJc3RydWN0IG5vZGUgKm5vZGU7CiAJc3RydWN0IG5vZGUgKm5vZGVsaXN0OwogCXN0cnVjdCByZXNlcnZlX2luZm8gKnJlOwotfQotLyogTGluZSAxODcgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDE1MyAiZHRjLXBhcnNlci50YWIuYyIKLQlZWVNUWVBFOworCisKKworLyogTGluZSAyMTQgb2YgeWFjYy5jICAqLworI2xpbmUgMTU5ICJkdGMtcGFyc2VyLnRhYi5jIgorfSBZWVNUWVBFOworIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKICMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KICMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIFlZTFRZUEUgJiYgISBkZWZpbmVkIFlZTFRZUEVfSVNfREVDTEFSRUQKLXR5cGVkZWYgc3RydWN0IFlZTFRZUEUKLXsKLSAgaW50IGZpcnN0X2xpbmU7Ci0gIGludCBmaXJzdF9jb2x1bW47Ci0gIGludCBsYXN0X2xpbmU7Ci0gIGludCBsYXN0X2NvbHVtbjsKLX0gWVlMVFlQRTsKLSMgZGVmaW5lIHl5bHR5cGUgWVlMVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KLSMgZGVmaW5lIFlZTFRZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlMVFlQRV9JU19UUklWSUFMIDEKICNlbmRpZgogCiAKIC8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KIAogCi0vKiBMaW5lIDIxNiBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTc4ICJkdGMtcGFyc2VyLnRhYi5jIgorLyogTGluZSAyNjQgb2YgeWFjYy5jICAqLworI2xpbmUgMTcxICJkdGMtcGFyc2VyLnRhYi5jIgogCiAjaWZkZWYgc2hvcnQKICMgdW5kZWYgc2hvcnQKQEAgLTI0OSwxNCArMjQyLDE0IEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIGludAotWVlJRCAoaW50IGkpCitZWUlEIChpbnQgeXlpKQogI2Vsc2UKIHN0YXRpYyBpbnQKLVlZSUQgKGkpCi0gICAgaW50IGk7CitZWUlEICh5eWkpCisgICAgaW50IHl5aTsKICNlbmRpZgogewotICByZXR1cm4gaTsKKyAgcmV0dXJuIHl5aTsKIH0KICNlbmRpZgogCkBAIC0zMzIsMTUgKzMyNSwxMyBAQAogCiAjaWYgKCEgZGVmaW5lZCB5eW92ZXJmbG93IFwKICAgICAgJiYgKCEgZGVmaW5lZCBfX2NwbHVzcGx1cyBcCi0JIHx8IChkZWZpbmVkIFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWUxUWVBFX0lTX1RSSVZJQUwgXAotCSAgICAgJiYgZGVmaW5lZCBZWVNUWVBFX0lTX1RSSVZJQUwgJiYgWVlTVFlQRV9JU19UUklWSUFMKSkpCisJIHx8IChkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKIAogLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCiB1bmlvbiB5eWFsbG9jCiB7Ci0gIHl5dHlwZV9pbnQxNiB5eXNzOwotICBZWVNUWVBFIHl5dnM7Ci0gICAgWVlMVFlQRSB5eWxzOworICB5eXR5cGVfaW50MTYgeXlzc19hbGxvYzsKKyAgWVlTVFlQRSB5eXZzX2FsbG9jOwogfTsKIAogLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KQEAgLTM0OSw4ICszNDAsOCBAQAogLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCiAgICBOIGVsZW1lbnRzLiAgKi8KICMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAotICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkgKyBzaXplb2YgKFlZTFRZUEUpKSBcCi0gICAgICArIDIgKiBZWVNUQUNLX0dBUF9NQVhJTVVNKQorICAgICAoKE4pICogKHNpemVvZiAoeXl0eXBlX2ludDE2KSArIHNpemVvZiAoWVlTVFlQRSkpIFwKKyAgICAgICsgWVlTVEFDS19HQVBfTUFYSU1VTSkKIAogLyogQ29weSBDT1VOVCBvYmplY3RzIGZyb20gRlJPTSB0byBUTy4gIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvCiAgICBub3Qgb3ZlcmxhcC4gICovCkBAIC0zNzUsMTIgKzM2NiwxMiBAQAogICAgZWxlbWVudHMgaW4gdGhlIHN0YWNrLCBhbmQgWVlQVFIgZ2l2ZXMgdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUKICAgIHN0YWNrLiAgQWR2YW5jZSBZWVBUUiB0byBhIHByb3Blcmx5IGFsaWduZWQgbG9jYXRpb24gZm9yIHRoZSBuZXh0CiAgICBzdGFjay4gICovCi0jIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrKQkJCQkJXAorIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFja19hbGxvYywgU3RhY2spCQkJCVwKICAgICBkbwkJCQkJCQkJCVwKICAgICAgIHsJCQkJCQkJCQlcCiAJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCi0JWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAotCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrX2FsbG9jLCBTdGFjaywgeXlzaXplKTsJCQlcCisJU3RhY2sgPSAmeXlwdHItPlN0YWNrX2FsbG9jOwkJCQkJXAogCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKIAl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCiAgICAgICB9CQkJCQkJCQkJXApAQCAtMzg5LDIyICszODAsMjIgQEAKICNlbmRpZgogCiAvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICAqLwotI2RlZmluZSBZWUZJTkFMICA5CisjZGVmaW5lIFlZRklOQUwgIDQKIC8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLwotI2RlZmluZSBZWUxBU1QgICA3MworI2RlZmluZSBZWUxBU1QgICA1NgogCiAvKiBZWU5UT0tFTlMgLS0gTnVtYmVyIG9mIHRlcm1pbmFscy4gICovCi0jZGVmaW5lIFlZTlRPS0VOUyAgMjcKKyNkZWZpbmUgWVlOVE9LRU5TICAyNQogLyogWVlOTlRTIC0tIE51bWJlciBvZiBub250ZXJtaW5hbHMuICAqLwotI2RlZmluZSBZWU5OVFMgIDIwCisjZGVmaW5lIFlZTk5UUyAgMTYKIC8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBydWxlcy4gICovCi0jZGVmaW5lIFlZTlJVTEVTICA0NQorI2RlZmluZSBZWU5SVUxFUyAgMzkKIC8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICAqLwotI2RlZmluZSBZWU5TVEFURVMgIDc2CisjZGVmaW5lIFlZTlNUQVRFUyAgNjcKIAogLyogWVlUUkFOU0xBVEUoWVlMRVgpIC0tIEJpc29uIHN5bWJvbCBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gICovCiAjZGVmaW5lIFlZVU5ERUZUT0sgIDIKLSNkZWZpbmUgWVlNQVhVVE9LICAgMjY4CisjZGVmaW5lIFlZTUFYVVRPSyAgIDI2NwogCiAjZGVmaW5lIFlZVFJBTlNMQVRFKFlZWCkJCQkJCQlcCiAgICgodW5zaWduZWQgaW50KSAoWVlYKSA8PSBZWU1BWFVUT0sgPyB5eXRyYW5zbGF0ZVtZWVhdIDogWVlVTkRFRlRPSykKQEAgLTQxNiwxNSArNDA3LDE1IEBACiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAyNCwgICAgMjYsICAgICAyLCAgICAgMiwgICAgMjUsICAgIDE1LCAgICAgMiwgICAgMTYsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE0LAotICAgICAgMjAsICAgIDE5LCAgICAyMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAyMiwgICAgMjQsICAgICAyLCAgICAgMiwgICAgMjMsICAgICAyLCAgICAgMiwgICAgMTQsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDEzLAorICAgICAgMTgsICAgIDE3LCAgICAxOSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgIDIyLCAgICAgMiwgICAgMjMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgMjAsICAgICAyLCAgICAyMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAxNywgICAgIDIsICAgIDE4LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE1LCAgICAgMiwgICAgMTYsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLApAQCAtNDM4LDcgKzQyOSw3IEBACiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsCi0gICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzCisgICAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIKIH07CiAKICNpZiBZWURFQlVHCkBAIC00NDYsNDEgKzQzNywzNyBAQAogICAgWVlSSFMuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXByaHNbXSA9CiB7Ci0gICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgOCwgICAgMTEsICAgIDEyLCAgICAxNSwgICAgMjEsICAgIDIyLCAgICAyNSwKLSAgICAgIDI3LCAgICAzNCwgICAgMzYsICAgIDM4LCAgICA0MSwgICAgNDcsICAgIDQ4LCAgICA1MSwgICAgNTcsICAgIDYxLAotICAgICAgNjQsICAgIDY5LCAgICA3NCwgICAgNzcsICAgIDg3LCAgICA5MywgICAgOTYsICAgIDk3LCAgIDEwMCwgICAxMDMsCi0gICAgIDEwNCwgICAxMDcsICAgMTEwLCAgIDExMywgICAxMTQsICAgMTE2LCAgIDExOCwgICAxMjEsICAgMTIyLCAgIDEyNSwKLSAgICAgMTI4LCAgIDEyOSwgICAxMzIsICAgMTM1LCAgIDEzOSwgICAxNDAKKyAgICAgICAwLCAgICAgMCwgICAgIDMsICAgICA4LCAgICAgOSwgICAgMTIsICAgIDE3LCAgICAyMCwgICAgMjIsICAgIDI1LAorICAgICAgMjksICAgIDMzLCAgICAzOSwgICAgNDAsICAgIDQzLCAgICA0OCwgICAgNTEsICAgIDU0LCAgICA1NywgICAgNjIsCisgICAgICA2NywgICAgNzAsICAgIDgwLCAgICA4NiwgICAgODksICAgIDkwLCAgICA5MywgICAgOTYsICAgIDk3LCAgIDEwMCwKKyAgICAgMTAzLCAgIDEwNiwgICAxMDgsICAgMTA5LCAgIDExMiwgICAxMTUsICAgMTE2LCAgIDExOSwgICAxMjIsICAgMTI1CiB9OwogCiAvKiBZWVJIUyAtLSBBIGAtMSctc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHJ1bGVzJyBSSFMuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cmhzW10gPQogewotICAgICAgMjgsICAgICAwLCAgICAtMSwgICAgIDMsICAgIDE0LCAgICAyOSwgICAgMzQsICAgIC0xLCAgICAzMSwgICAgMzQsCi0gICAgICAtMSwgICAgLTEsICAgIDMwLCAgICAyOSwgICAgLTEsICAgIDQ2LCAgICAgNCwgICAgMzMsICAgIDMzLCAgICAxNCwKLSAgICAgIC0xLCAgICAtMSwgICAgMzIsICAgIDMxLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICA0NiwgICAgIDQsICAgIDMzLAotICAgICAgMTUsICAgIDMzLCAgICAxNCwgICAgLTEsICAgICA2LCAgICAtMSwgICAgIDcsICAgIC0xLCAgICAxNiwgICAgMzUsCi0gICAgICAtMSwgICAgMTcsICAgIDM2LCAgICA0NCwgICAgMTgsICAgIDE0LCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywKLSAgICAgIC0xLCAgICA0NiwgICAgIDUsICAgIDE5LCAgICAzOCwgICAgMTQsICAgIC0xLCAgICA0NiwgICAgIDUsICAgIDE0LAotICAgICAgLTEsICAgIDM5LCAgICAxMCwgICAgLTEsICAgIDM5LCAgICAyMCwgICAgNDAsICAgIDIxLCAgICAtMSwgICAgMzksCi0gICAgICAyMiwgICAgNDMsICAgIDIzLCAgICAtMSwgICAgMzksICAgIDEyLCAgICAtMSwgICAgMzksICAgIDEzLCAgICAyNCwKLSAgICAgIDEwLCAgICAyNSwgICAgMzMsICAgIDI1LCAgICAzMywgICAgMjYsICAgIC0xLCAgICAzOSwgICAgMTMsICAgIDI0LAotICAgICAgMTAsICAgIDI2LCAgICAtMSwgICAgMzgsICAgIDExLCAgICAtMSwgICAgLTEsICAgIDM4LCAgICAyNSwgICAgLTEsCi0gICAgICAzOSwgICAgMTEsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDQyLCAgICAtMSwgICAgNDAsICAgIDEyLCAgICAtMSwKLSAgICAgIDQwLCAgICAxMSwgICAgLTEsICAgIC0xLCAgICAgOCwgICAgLTEsICAgICA2LCAgICAtMSwgICAgNDEsICAgICA3LAotICAgICAgLTEsICAgIC0xLCAgICA0MywgICAgIDksICAgIC0xLCAgICA0MywgICAgMTEsICAgIC0xLCAgICAtMSwgICAgNDUsCi0gICAgICA0NCwgICAgLTEsICAgIDQ1LCAgICAzNywgICAgLTEsICAgIDQ2LCAgICAgNSwgICAgMzUsICAgIC0xLCAgICAtMSwKLSAgICAgIDExLCAgICAtMQorICAgICAgMjYsICAgICAwLCAgICAtMSwgICAgIDMsICAgIDEzLCAgICAyNywgICAgMzAsICAgIC0xLCAgICAtMSwgICAgMjgsCisgICAgICAyNywgICAgLTEsICAgICA0LCAgICAyOSwgICAgMjksICAgIDEzLCAgICAtMSwgICAgMTAsICAgIDI4LCAgICAtMSwKKyAgICAgICA2LCAgICAtMSwgICAgMTQsICAgIDMxLCAgICAtMSwgICAgMzAsICAgIDE0LCAgICAzMSwgICAgLTEsICAgIDMwLAorICAgICAgMTEsICAgIDMxLCAgICAtMSwgICAgMTUsICAgIDMyLCAgICAzOSwgICAgMTYsICAgIDEzLCAgICAtMSwgICAgLTEsCisgICAgICAzMiwgICAgMzMsICAgIC0xLCAgICAgNSwgICAgMTcsICAgIDM0LCAgICAxMywgICAgLTEsICAgICA1LCAgICAxMywKKyAgICAgIC0xLCAgICAxMCwgICAgMzMsICAgIC0xLCAgICAzNSwgICAgIDksICAgIC0xLCAgICAzNSwgICAgMTgsICAgIDM2LAorICAgICAgMTksICAgIC0xLCAgICAzNSwgICAgMjAsICAgIDM4LCAgICAyMSwgICAgLTEsICAgIDM1LCAgICAxMSwgICAgLTEsCisgICAgICAzNSwgICAgMTIsICAgIDIyLCAgICAgOSwgICAgMjMsICAgIDI5LCAgICAyMywgICAgMjksICAgIDI0LCAgICAtMSwKKyAgICAgIDM1LCAgICAxMiwgICAgMjIsICAgICA5LCAgICAyNCwgICAgLTEsICAgIDM0LCAgICAxMCwgICAgLTEsICAgIC0xLAorICAgICAgMzQsICAgIDIzLCAgICAtMSwgICAgMzUsICAgIDEwLCAgICAtMSwgICAgLTEsICAgIDM2LCAgICAzNywgICAgLTEsCisgICAgICAzNiwgICAgMTEsICAgIC0xLCAgICAzNiwgICAgMTAsICAgIC0xLCAgICAgNiwgICAgLTEsICAgIC0xLCAgICAzOCwKKyAgICAgICA4LCAgICAtMSwgICAgMzgsICAgIDEwLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAzOSwgICAgLTEsICAgIDQwLAorICAgICAgMzMsICAgIC0xLCAgICAgNSwgICAgMzEsICAgIC0xLCAgICAxMCwgICAgNDAsICAgIC0xCiB9OwogCiAvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5cmxpbmVbXSA9CiB7Ci0gICAgICAgMCwgICAgODksICAgIDg5LCAgICA5MywgICAxMDEsICAgMTA0LCAgIDExMSwgICAxMTksICAgMTIyLCAgIDEyOSwKLSAgICAgMTMzLCAgIDE0MCwgICAxNDQsICAgMTUxLCAgIDE1OCwgICAxNjYsICAgMTY5LCAgIDE3NiwgICAxODAsICAgMTg3LAotICAgICAxOTEsICAgMTk1LCAgIDE5OSwgICAyMDMsICAgMjIwLCAgIDIzMSwgICAyMzksICAgMjQyLCAgIDI0NiwgICAyNTQsCi0gICAgIDI1NywgICAyNjEsICAgMjY2LCAgIDI3NCwgICAyNzcsICAgMjgxLCAgIDI4NSwgICAyOTMsICAgMjk2LCAgIDMwMCwKLSAgICAgMzA4LCAgIDMxMSwgICAzMTUsICAgMzIzLCAgIDMzMSwgICAzMzQKKyAgICAgICAwLCAgICA4NiwgICAgODYsICAgIDk1LCAgICA5OCwgICAxMDUsICAgMTA5LCAgIDExNywgICAxMjQsICAgMTI4LAorICAgICAxMzIsICAgMTQ1LCAgIDE1MywgICAxNTYsICAgMTYzLCAgIDE2NywgICAxNzEsICAgMTc5LCAgIDE4MywgICAxODcsCisgICAgIDE5MSwgICAxOTUsICAgMjEyLCAgIDIyMiwgICAyMzAsICAgMjMzLCAgIDIzNywgICAyNDUsICAgMjQ4LCAgIDI1MiwKKyAgICAgMjU3LCAgIDI2NCwgICAyNzIsICAgMjc1LCAgIDI3OSwgICAyODcsICAgMjkwLCAgIDI5NCwgICAzMDIsICAgMzA2CiB9OwogI2VuZGlmCiAKQEAgLTQ5MCwxMyArNDc3LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KIHsKICAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJEVF9WMSIsICJEVF9NRU1SRVNFUlZFIiwKLSAgIkRUX1BST1BOT0RFTkFNRSIsICJEVF9MSVRFUkFMIiwgIkRUX0xFR0FDWUxJVEVSQUwiLCAiRFRfQkFTRSIsCi0gICJEVF9CWVRFIiwgIkRUX1NUUklORyIsICJEVF9MQUJFTCIsICJEVF9SRUYiLCAiRFRfSU5DQklOIiwgIic7JyIsICInLSciLAotICAiJy8nIiwgIid7JyIsICInfSciLCAiJz0nIiwgIic8JyIsICInPiciLCAiJ1snIiwgIiddJyIsICInKCciLCAiJywnIiwKLSAgIicpJyIsICIkYWNjZXB0IiwgInNvdXJjZWZpbGUiLCAibWVtcmVzZXJ2ZXMiLCAibWVtcmVzZXJ2ZSIsCi0gICJ2MF9tZW1yZXNlcnZlcyIsICJ2MF9tZW1yZXNlcnZlIiwgImFkZHIiLCAiZGV2aWNldHJlZSIsICJub2RlZGVmIiwKLSAgInByb3BsaXN0IiwgInByb3BkZWYiLCAicHJvcGRhdGEiLCAicHJvcGRhdGFwcmVmaXgiLCAiY2VsbGxpc3QiLAotICAiY2VsbGJhc2UiLCAiY2VsbHZhbCIsICJieXRlc3RyaW5nIiwgInN1Ym5vZGVzIiwgInN1Ym5vZGUiLCAibGFiZWwiLCAwCisgICJEVF9QUk9QTk9ERU5BTUUiLCAiRFRfTElURVJBTCIsICJEVF9CQVNFIiwgIkRUX0JZVEUiLCAiRFRfU1RSSU5HIiwKKyAgIkRUX0xBQkVMIiwgIkRUX1JFRiIsICJEVF9JTkNCSU4iLCAiJzsnIiwgIicvJyIsICIneyciLCAiJ30nIiwgIic9JyIsCisgICInPCciLCAiJz4nIiwgIidbJyIsICInXSciLCAiJygnIiwgIicsJyIsICInKSciLCAiJGFjY2VwdCIsICJzb3VyY2VmaWxlIiwKKyAgIm1lbXJlc2VydmVzIiwgIm1lbXJlc2VydmUiLCAiYWRkciIsICJkZXZpY2V0cmVlIiwgIm5vZGVkZWYiLCAicHJvcGxpc3QiLAorICAicHJvcGRlZiIsICJwcm9wZGF0YSIsICJwcm9wZGF0YXByZWZpeCIsICJjZWxsbGlzdCIsICJjZWxsdmFsIiwKKyAgImJ5dGVzdHJpbmciLCAic3Vibm9kZXMiLCAic3Vibm9kZSIsIDAKIH07CiAjZW5kaWYKIApAQCAtNTA2LDI5ICs0OTIsMjcgQEAKIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDE2IHl5dG9rbnVtW10gPQogewogICAgICAgIDAsICAgMjU2LCAgIDI1NywgICAyNTgsICAgMjU5LCAgIDI2MCwgICAyNjEsICAgMjYyLCAgIDI2MywgICAyNjQsCi0gICAgIDI2NSwgICAyNjYsICAgMjY3LCAgIDI2OCwgICAgNTksICAgIDQ1LCAgICA0NywgICAxMjMsICAgMTI1LCAgICA2MSwKLSAgICAgIDYwLCAgICA2MiwgICAgOTEsICAgIDkzLCAgICA0MCwgICAgNDQsICAgIDQxCisgICAgIDI2NSwgICAyNjYsICAgMjY3LCAgICA1OSwgICAgNDcsICAgMTIzLCAgIDEyNSwgICAgNjEsICAgIDYwLCAgICA2MiwKKyAgICAgIDkxLCAgICA5MywgICAgNDAsICAgIDQ0LCAgICA0MQogfTsKICMgZW5kaWYKIAogLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjFbXSA9CiB7Ci0gICAgICAgMCwgICAgMjcsICAgIDI4LCAgICAyOCwgICAgMjksICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMxLCAgICAzMiwKLSAgICAgIDMyLCAgICAzMywgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM2LCAgICAzNywgICAgMzcsICAgIDM4LAotICAgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsCi0gICAgICA0MCwgICAgNDAsICAgIDQwLCAgICA0MSwgICAgNDEsICAgIDQyLCAgICA0MiwgICAgNDMsICAgIDQzLCAgICA0MywKLSAgICAgIDQ0LCAgICA0NCwgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDYKKyAgICAgICAwLCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyNywgICAgMjgsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMwLAorICAgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzIsICAgIDMzLCAgICAzMywgICAgMzMsICAgIDM0LCAgICAzNCwgICAgMzQsCisgICAgICAzNCwgICAgMzQsICAgIDM0LCAgICAzNCwgICAgMzUsICAgIDM1LCAgICAzNSwgICAgMzYsICAgIDM2LCAgICAzNiwKKyAgICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgNDAsICAgIDQwCiB9OwogCiAvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cjJbXSA9CiB7Ci0gICAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgMSwKLSAgICAgICA2LCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgNSwgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDMsICAgICAyLAotICAgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDksICAgICA1LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsCi0gICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwKLSAgICAgICAwLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMCwgICAgIDEKKyAgICAgICAwLCAgICAgMiwgICAgIDQsICAgICAwLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLAorICAgICAgIDMsICAgICA1LCAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDQsCisgICAgICAgMiwgICAgIDksICAgICA1LCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMSwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyCiB9OwogCiAvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKQEAgLTUzNiw4NiArNTIwLDc5IEBACiAgICBtZWFucyB0aGUgZGVmYXVsdCBpcyBhbiBlcnJvci4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5ZGVmYWN0W10gPQogewotICAgICAgIDcsICAgICAwLCAgICA0NSwgICAgIDAsICAgICA5LCAgICAgMCwgICAgIDcsICAgICAwLCAgICAgNCwgICAgIDEsCi0gICAgICAgMCwgICAgIDMsICAgICA4LCAgICAgMCwgICAgIDAsICAgICA0LCAgICAgMCwgICAgMTUsICAgIDEzLCAgICAxMSwKLSAgICAgIDEyLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMCwgICAgNDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE2LAotICAgICAgIDAsICAgIDQwLCAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDIsICAgIDQxLCAgICAgMCwgICAgMTAsCi0gICAgICAxNCwgICAgMTgsICAgIDI2LCAgICA0MywgICAgIDAsICAgICAwLCAgICAyNSwgICAgMTcsICAgIDI3LCAgICAxOSwKLSAgICAgIDI4LCAgICAyMiwgICAgIDAsICAgIDI5LCAgICAzNywgICAgIDAsICAgIDMzLCAgICAgMCwgICAgIDAsICAgIDM1LAotICAgICAgMzQsICAgIDMyLCAgICAzMSwgICAgMjAsICAgICAwLCAgICAzMCwgICAgMzgsICAgIDM5LCAgICAyMSwgICAgIDAsCi0gICAgICAyNCwgICAgMzYsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIzCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMywgICAgIDEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNywKKyAgICAgICAwLCAgICAgNiwgICAgIDAsICAgICAyLCAgICAgNCwgICAgIDAsICAgIDEyLCAgICAgOCwgICAgIDAsICAgICAwLAorICAgICAgIDUsICAgIDM1LCAgICAxMCwgICAgIDksICAgICAwLCAgICAgMCwgICAgMTMsICAgICAwLCAgICAzNSwgICAgMTUsCisgICAgICAyNCwgICAgMzgsICAgIDE2LCAgICAzOSwgICAgIDAsICAgIDM3LCAgICAzNiwgICAgIDAsICAgICAwLCAgICAxMSwKKyAgICAgIDIzLCAgICAxNCwgICAgMjUsICAgIDE3LCAgICAyNiwgICAgMjAsICAgICAwLCAgICAyNywgICAgMzIsICAgICAwLAorICAgICAgIDAsICAgICAwLCAgICAgMCwgICAgMzEsICAgIDMwLCAgICAyOSwgICAgMTgsICAgIDI4LCAgICAzMywgICAgMzQsCisgICAgICAxOSwgICAgIDAsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyMQogfTsKIAogLyogWVlERUZHT1RPW05URVJNLU5VTV0uICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5ZGVmZ290b1tdID0KIHsKLSAgICAgIC0xLCAgICAgMywgICAgMTQsICAgICA0LCAgICAgNSwgICAgIDYsICAgIDI3LCAgICAxMSwgICAgMTgsICAgIDI1LAotICAgICAgMjksICAgIDQ0LCAgICA0NSwgICAgNTYsICAgIDY0LCAgICA2NSwgICAgNTcsICAgIDMwLCAgICAzMSwgICAgIDcKKyAgICAgIC0xLCAgICAgMiwgICAgIDcsICAgICA4LCAgICAxMCwgICAgMTMsICAgIDE3LCAgICAyMSwgICAgMjYsICAgIDM3LAorICAgICAgMzgsICAgIDUwLCAgICA1NywgICAgNTEsICAgIDI3LCAgICAyOAogfTsKIAogLyogWVlQQUNUW1NUQVRFLU5VTV0gLS0gSW5kZXggaW4gWVlUQUJMRSBvZiB0aGUgcG9ydGlvbiBkZXNjcmliaW5nCiAgICBTVEFURS1OVU0uICAqLwotI2RlZmluZSBZWVBBQ1RfTklORiAtMTQKKyNkZWZpbmUgWVlQQUNUX05JTkYgLTEyCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlwYWN0W10gPQogewotICAgICAgMzAsICAgLTExLCAgIC0xNCwgICAgIDcsICAgLTE0LCAgICAtMSwgICAgMjcsICAgIDEzLCAgICAyNywgICAtMTQsCi0gICAgICAgOCwgICAtMTQsICAgLTE0LCAgICA0MCwgICAgLTEsICAgIDI3LCAgICAzNSwgICAtMTQsICAgLTE0LCAgIC0xNCwKLSAgICAgLTE0LCAgICAyMSwgICAtMTQsICAgLTE0LCAgICA0MCwgICAgMjQsICAgIDQwLCAgICAyOCwgICAgNDAsICAgLTE0LAotICAgICAgMzIsICAgIDI0LCAgICA0NiwgICAgMzgsICAgLTE0LCAgICAzOSwgICAtMTQsICAgLTE0LCAgICAyNiwgICAtMTQsCi0gICAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgLTksICAgIDEwLCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwKLSAgICAgLTE0LCAgIC0xNCwgICAgMzEsICAgLTE0LCAgIC0xNCwgICAgNDQsICAgIC0yLCAgICAgMywgICAgMjMsICAgLTE0LAotICAgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgIDUwLCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNDAsCi0gICAgIC0xNCwgICAtMTQsICAgIDMzLCAgICA0MCwgICAgMzYsICAgLTE0CisgICAgICAxMCwgICAtMTEsICAgIDE4LCAgICAtMSwgICAtMTIsICAgIDIyLCAgICAtMSwgICAgMTUsICAgIC0xLCAgIC0xMiwKKyAgICAgIDIyLCAgIC0xMiwgICAgMjAsICAgICAxLCAgIC0xMiwgICAgMTcsICAgLTEyLCAgIC0xMiwgICAgMjAsICAgIDIwLAorICAgICAtMTIsICAgICA2LCAgIC0xMiwgICAtMTIsICAgIDIxLCAgICAgNiwgICAtMTIsICAgIDIzLCAgICAgNiwgICAtMTIsCisgICAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAgMjgsICAgLTEyLCAgIC0xMiwgICAgLTYsICAgIDEzLCAgIC0xMiwKKyAgICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgIDI0LCAgIC0xMiwgICAtMTIsICAgIDMzLAorICAgICAgLTUsICAgICAwLCAgICAtNCwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsCisgICAgIC0xMiwgICAgMjIsICAgLTEyLCAgICAyNSwgICAgMjIsICAgIDE5LCAgIC0xMgogfTsKIAogLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXBnb3RvW10gPQogewotICAgICAtMTQsICAgLTE0LCAgICA0OCwgICAgMjksICAgIDUzLCAgIC0xNCwgICAtMTMsICAgIDQ3LCAgICAzNCwgICAtMTQsCi0gICAgICAzNywgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNDIsICAgLTE0LCAgICAtNworICAgICAtMTIsICAgLTEyLCAgICAzNiwgICAgMzksICAgLTEwLCAgIC0xMiwgICAgIDgsICAgLTEyLCAgICAxMiwgICAtMTIsCisgICAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAgMjcsICAgIDMxCiB9OwogCiAvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKICAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAogICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KICAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KLSNkZWZpbmUgWVlUQUJMRV9OSU5GIC00NQotc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5dGFibGVbXSA9CisjZGVmaW5lIFlZVEFCTEVfTklORiAtMQorc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXRhYmxlW10gPQogewotICAgICAgMjEsICAgIDE2LCAgICA0NiwgICAgIDgsICAgIDU5LCAgICA0NywgICAgNjAsICAgICA5LCAgICAxNiwgICAgNjEsCi0gICAgICA2MiwgICAgMjgsICAgIDY2LCAgICAzMywgICAgNjcsICAgIDEwLCAgICA0OCwgICAgMTMsICAgIDMyLCAgICA2MywKLSAgICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAzMiwgICAgMTcsICAgIDY4LCAgICAxOSwgICAgMjAsICAgLTQ0LAotICAgICAgNTMsICAgLTQ0LCAgICA1NCwgICAgIDEsICAgLTQ0LCAgICAgMiwgICAgMjYsICAgIDE1LCAgICAgMiwgICAgMjQsCi0gICAgICA0MSwgICAgIDIsICAgIDM0LCAgICAxNywgICAgMTUsICAgIDQyLCAgICAxOSwgICAgMjAsICAgIDY5LCAgICA3MCwKLSAgICAgIDM1LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA1OCwgICAgNTUsICAgIDcyLCAgICA3MSwgICAgNzMsICAgIDEyLAotICAgICAgNzQsICAgIDIyLCAgICA3NSwgICAgMjMsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNiwgICAgIDAsCi0gICAgICAgMCwgICAgIDAsICAgIDQzLCAgICAzNworICAgICAgMTUsICAgIDUzLCAgICAgMywgICAgIDUsICAgIDQwLCAgICA1NCwgICAgNTUsICAgIDQxLCAgICA1OCwgICAgIDYsCisgICAgICA1OSwgICAgMjQsICAgIDE4LCAgICAgMSwgICAgNTYsICAgIDE5LCAgICAyNSwgICAgNDIsICAgICA0LCAgICA2MSwKKyAgICAgIDYyLCAgICA2MCwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDIyLCAgICAyMywgICAgIDksICAgIDEyLAorICAgICAgMjAsICAgIDQ3LCAgICAzMSwgICAgNDgsICAgIDI5LCAgICAxNiwgICAgMTYsICAgIDMyLCAgICAzMCwgICAgMzQsCisgICAgICAzNSwgICAgMzksICAgIDUyLCAgICA2NiwgICAgMTQsICAgIDExLCAgICA0OSwgICAgIDAsICAgIDY0LCAgICAgMCwKKyAgICAgICAwLCAgICA2MywgICAgIDAsICAgICAwLCAgICA2NSwgICAgMzYsICAgIDMzCiB9OwogCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXljaGVja1tdID0KIHsKLSAgICAgIDEzLCAgICAgOCwgICAgMTEsICAgIDE0LCAgICAgNiwgICAgMTQsICAgICA4LCAgICAgMCwgICAgMTUsICAgIDExLAotICAgICAgMTIsICAgIDI0LCAgICAgOSwgICAgMjYsICAgIDExLCAgICAxNiwgICAgMjUsICAgICA0LCAgICAyNSwgICAgMjEsCi0gICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMzEsICAgIDE3LCAgICAyMywgICAgIDYsICAgICA3LCAgICAgNSwKLSAgICAgIDIwLCAgICAgNCwgICAgMjIsICAgICAzLCAgICAgNCwgICAgMTEsICAgIDE1LCAgICAgOCwgICAgMTEsICAgICA0LAotICAgICAgMTQsICAgIDExLCAgICAxNCwgICAgMTcsICAgIDE1LCAgICAxOSwgICAgIDYsICAgICA3LCAgICAyNSwgICAgMjYsCi0gICAgICAxOCwgICAgIDUsICAgIDE0LCAgICAxNCwgICAgMTAsICAgIDI0LCAgICA2OSwgICAgIDcsICAgIDI1LCAgICAgNiwKLSAgICAgIDczLCAgICAxNCwgICAgMjYsICAgIDE1LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzEsICAgIC0xLAotICAgICAgLTEsICAgIC0xLCAgICAzOCwgICAgMzEKKyAgICAgIDEwLCAgICAgNiwgICAgMTMsICAgICA0LCAgICAxMCwgICAgMTAsICAgIDExLCAgICAxMywgICAgIDgsICAgIDEwLAorICAgICAgMTAsICAgICA1LCAgICAxMSwgICAgIDMsICAgIDE5LCAgICAxNCwgICAgMTAsICAgIDIzLCAgICAgMCwgICAgMjMsCisgICAgICAyNCwgICAgMjEsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxOCwgICAgMTksICAgICA2LCAgICAxNCwKKyAgICAgIDEzLCAgICAxOCwgICAgMjQsICAgIDIwLCAgICAxMywgICAgMTUsICAgIDE1LCAgICAyNSwgICAgMTcsICAgIDE2LAorICAgICAgMjgsICAgIDEzLCAgICAgOSwgICAgMjQsICAgICA4LCAgICAgNiwgICAgMjIsICAgIC0xLCAgICAyMywgICAgLTEsCisgICAgICAtMSwgICAgNjEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDI4LCAgICAyNQogfTsKIAogLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKICAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50OCB5eXN0b3NbXSA9CiB7Ci0gICAgICAgMCwgICAgIDMsICAgIDExLCAgICAyOCwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgNDYsICAgIDE0LCAgICAgMCwKLSAgICAgIDE2LCAgICAzNCwgICAgMzEsICAgICA0LCAgICAyOSwgICAgMzAsICAgIDQ2LCAgICAxNywgICAgMzUsICAgICA2LAotICAgICAgIDcsICAgIDMzLCAgICAzNCwgICAgMjksICAgICA0LCAgICAzNiwgICAgMTUsICAgIDMzLCAgICAzMywgICAgMzcsCi0gICAgICA0NCwgICAgNDUsICAgIDQ2LCAgICAzMywgICAgMTQsICAgIDE4LCAgICAzNywgICAgNDQsICAgICA1LCAgICAxNCwKLSAgICAgIDE0LCAgICAxNCwgICAgMTksICAgIDM1LCAgICAzOCwgICAgMzksICAgIDExLCAgICAxNCwgICAgMjUsICAgIDEwLAotICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMjAsICAgIDIyLCAgICAyNCwgICAgNDAsICAgIDQzLCAgICAxMCwgICAgIDYsCi0gICAgICAgOCwgICAgMTEsICAgIDEyLCAgICAyMSwgICAgNDEsICAgIDQyLCAgICAgOSwgICAgMTEsICAgIDIzLCAgICAyNSwKLSAgICAgIDI2LCAgICAgNywgICAgMzMsICAgIDI1LCAgICAzMywgICAgMjYKKyAgICAgICAwLCAgICAgMywgICAgMjYsICAgIDEzLCAgICAgMCwgICAgIDQsICAgIDEwLCAgICAyNywgICAgMjgsICAgICA2LAorICAgICAgMjksICAgIDI4LCAgICAxNCwgICAgMzAsICAgIDI3LCAgICAyOSwgICAgMTUsICAgIDMxLCAgICAxMSwgICAgMTQsCisgICAgICAxMywgICAgMzIsICAgIDMxLCAgICAzMSwgICAgIDUsICAgIDEwLCAgICAzMywgICAgMzksICAgIDQwLCAgICAxMywKKyAgICAgIDE3LCAgICAzMSwgICAgMzMsICAgIDQwLCAgICAxNiwgICAgMzMsICAgIDM5LCAgICAzNCwgICAgMzUsICAgIDEzLAorICAgICAgMTAsICAgIDEzLCAgICAyMywgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDE4LCAgICAyMCwgICAgMjIsCisgICAgICAzNiwgICAgMzgsICAgICA5LCAgICAgNiwgICAgMTAsICAgIDExLCAgICAxOSwgICAgMzcsICAgICA4LCAgICAxMCwKKyAgICAgIDIxLCAgICAyMywgICAgMjQsICAgIDI5LCAgICAyMywgICAgMjksICAgIDI0CiB9OwogCiAjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCkBAIC03MjgsNyArNzA1LDcgQEAKICAgICB7CQkJCQkJCQkJICBcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJCSAgXAogICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsCQkJCQkJICBcCi0JCSAgVHlwZSwgVmFsdWUsIExvY2F0aW9uKTsgXAorCQkgIFR5cGUsIFZhbHVlKTsgXAogICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJCSAgXAogICAgIH0JCQkJCQkJCQkgIFwKIH0gd2hpbGUgKFlZSUQgKDApKQpAQCAtNzQyLDE5ICs3MTksMTcgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ZhbHVlX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwLCBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnApCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKQoreXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKICAgICBGSUxFICp5eW91dHB1dDsKICAgICBpbnQgeXl0eXBlOwogICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLSAgICBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnA7CiAjZW5kaWYKIHsKICAgaWYgKCF5eXZhbHVlcCkKICAgICByZXR1cm47Ci0gIFlZVVNFICh5eWxvY2F0aW9ucCk7CiAjIGlmZGVmIFlZUFJJTlQKICAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKICAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKQEAgLTc3NiwxNCArNzUxLDEzIEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCwgWVlMVFlQRSBjb25zdCAqIGNvbnN0IHl5bG9jYXRpb25wKQoreXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwKQogI2Vsc2UKIHN0YXRpYyB2b2lkCi15eV9zeW1ib2xfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCkKK3l5X3N5bWJvbF9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApCiAgICAgRklMRSAqeXlvdXRwdXQ7CiAgICAgaW50IHl5dHlwZTsKICAgICBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXA7Ci0gICAgWVlMVFlQRSBjb25zdCAqIGNvbnN0IHl5bG9jYXRpb25wOwogI2VuZGlmCiB7CiAgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCkBAIC03OTEsOSArNzY1LDcgQEAKICAgZWxzZQogICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKIAotICBZWV9MT0NBVElPTl9QUklOVCAoeXlvdXRwdXQsICp5eWxvY2F0aW9ucCk7Ci0gIFlZRlBSSU5URiAoeXlvdXRwdXQsICI6ICIpOwotICB5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwLCB5eWxvY2F0aW9ucCk7CisgIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXApOwogICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOwogfQogCkBAIC04MDUsMTcgKzc3NywyMCBAQAogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICpib3R0b20sIHl5dHlwZV9pbnQxNiAqdG9wKQoreXlfc3RhY2tfcHJpbnQgKHl5dHlwZV9pbnQxNiAqeXlib3R0b20sIHl5dHlwZV9pbnQxNiAqeXl0b3ApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50IChib3R0b20sIHRvcCkKLSAgICB5eXR5cGVfaW50MTYgKmJvdHRvbTsKLSAgICB5eXR5cGVfaW50MTYgKnRvcDsKK3l5X3N0YWNrX3ByaW50ICh5eWJvdHRvbSwgeXl0b3ApCisgICAgeXl0eXBlX2ludDE2ICp5eWJvdHRvbTsKKyAgICB5eXR5cGVfaW50MTYgKnl5dG9wOwogI2VuZGlmCiB7CiAgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7Ci0gIGZvciAoOyBib3R0b20gPD0gdG9wOyArK2JvdHRvbSkKLSAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICpib3R0b20pOworICBmb3IgKDsgeXlib3R0b20gPD0geXl0b3A7IHl5Ym90dG9tKyspCisgICAgeworICAgICAgaW50IHl5Ym90ID0gKnl5Ym90dG9tOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgJWQiLCB5eWJvdCk7CisgICAgfQogICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CiB9CiAKQEAgLTgzMywxMiArODA4LDExIEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIHZvaWQKLXl5X3JlZHVjZV9wcmludCAoWVlTVFlQRSAqeXl2c3AsIFlZTFRZUEUgKnl5bHNwLCBpbnQgeXlydWxlKQoreXlfcmVkdWNlX3ByaW50IChZWVNUWVBFICp5eXZzcCwgaW50IHl5cnVsZSkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlsc3AsIHl5cnVsZSkKK3l5X3JlZHVjZV9wcmludCAoeXl2c3AsIHl5cnVsZSkKICAgICBZWVNUWVBFICp5eXZzcDsKLSAgICBZWUxUWVBFICp5eWxzcDsKICAgICBpbnQgeXlydWxlOwogI2VuZGlmCiB7CkBAIC04NTAsMTggKzgyNCwxOCBAQAogICAvKiBUaGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLiAgKi8KICAgZm9yICh5eWkgPSAwOyB5eWkgPCB5eW5yaHM7IHl5aSsrKQogICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICIgICAkJWQgPSAiLCB5eWkgKyAxKTsKICAgICAgIHl5X3N5bWJvbF9wcmludCAoc3RkZXJyLCB5eXJoc1t5eXByaHNbeXlydWxlXSArIHl5aV0sCiAJCSAgICAgICAmKHl5dnNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkKLQkJICAgICAgICwgJih5eWxzcFsoeXlpICsgMSkgLSAoeXlucmhzKV0pCQkgICAgICAgKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisJCSAgICAgICAJCSAgICAgICApOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwogICAgIH0KIH0KIAogIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCiBkbyB7CQkJCQlcCiAgIGlmICh5eWRlYnVnKQkJCQlcCi0gICAgeXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlsc3AsIFJ1bGUpOyBcCisgICAgeXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgUnVsZSk7IFwKIH0gd2hpbGUgKFlZSUQgKDApKQogCiAvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKQEAgLTExMTIsMTggKzEwODYsMTYgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwLCBZWUxUWVBFICp5eWxvY2F0aW9ucCkKK3l5ZGVzdHJ1Y3QgKGNvbnN0IGNoYXIgKnl5bXNnLCBpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKQoreXlkZXN0cnVjdCAoeXltc2csIHl5dHlwZSwgeXl2YWx1ZXApCiAgICAgY29uc3QgY2hhciAqeXltc2c7CiAgICAgaW50IHl5dHlwZTsKICAgICBZWVNUWVBFICp5eXZhbHVlcDsKLSAgICBZWUxUWVBFICp5eWxvY2F0aW9ucDsKICNlbmRpZgogewogICBZWVVTRSAoeXl2YWx1ZXApOwotICBZWVVTRSAoeXlsb2NhdGlvbnApOwogCiAgIGlmICgheXltc2cpCiAgICAgeXltc2cgPSAiRGVsZXRpbmciOwpAQCAtMTEzNiwxMCArMTEwOCw4IEBACiAJYnJlYWs7CiAgICAgfQogfQotDAogCiAvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLwotCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cwogaW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOwpAQCAtMTE1NSwyMyArMTEyNSwyMCBAQAogI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLwogCiAKLQotLyogVGhlIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKy8qIFRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KIGludCB5eWNoYXI7CiAKLS8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLworLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KIFlZU1RZUEUgeXlsdmFsOwogCiAvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLwogaW50IHl5bmVycnM7Ci0vKiBMb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9vay1haGVhZCBzeW1ib2wuICAqLwotWVlMVFlQRSB5eWxsb2M7CiAKIAogCi0vKi0tLS0tLS0tLS0uCi18IHl5cGFyc2UuICB8Ci1gLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cGFyc2Ugb3IgeXlwdXNoX3BhcnNlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWZkZWYgWVlQQVJTRV9QQVJBTQogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCkBAIC0xMTk1LDE0ICsxMTYyLDM5IEBACiAjZW5kaWYKICNlbmRpZgogewotICAKLSAgaW50IHl5c3RhdGU7CisKKworICAgIGludCB5eXN0YXRlOworICAgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICAgIGludCB5eWVycnN0YXR1czsKKworICAgIC8qIFRoZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMuCisgICAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcy4KKworICAgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgICAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOworICAgIHl5dHlwZV9pbnQxNiAqeXlzczsKKyAgICB5eXR5cGVfaW50MTYgKnl5c3NwOworCisgICAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKKyAgICBZWVNUWVBFICp5eXZzOworICAgIFlZU1RZUEUgKnl5dnNwOworCisgICAgWVlTSVpFX1QgeXlzdGFja3NpemU7CisKICAgaW50IHl5bjsKICAgaW50IHl5cmVzdWx0OwotICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KLSAgaW50IHl5ZXJyc3RhdHVzOwotICAvKiBMb29rLWFoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLwotICBpbnQgeXl0b2tlbiA9IDA7CisgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW47CisgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCisgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisgIFlZU1RZUEUgeXl2YWw7CisKICNpZiBZWUVSUk9SX1ZFUkJPU0UKICAgLyogQnVmZmVyIGZvciBlcnJvciBtZXNzYWdlcywgYW5kIGl0cyBhbGxvY2F0ZWQgc2l6ZS4gICovCiAgIGNoYXIgeXltc2didWZbMTI4XTsKQEAgLTEyMTAsNjQgKzEyMDIsMzAgQEAKICAgWVlTSVpFX1QgeXltc2dfYWxsb2MgPSBzaXplb2YgeXltc2didWY7CiAjZW5kaWYKIAotICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgotICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAotICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAotICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgotCi0gICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdwotICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KLQotICAvKiBUaGUgc3RhdGUgc3RhY2suICAqLwotICB5eXR5cGVfaW50MTYgeXlzc2FbWVlJTklUREVQVEhdOwotICB5eXR5cGVfaW50MTYgKnl5c3MgPSB5eXNzYTsKLSAgeXl0eXBlX2ludDE2ICp5eXNzcDsKLQotICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsKLSAgWVlTVFlQRSAqeXl2cyA9IHl5dnNhOwotICBZWVNUWVBFICp5eXZzcDsKLQotICAvKiBUaGUgbG9jYXRpb24gc3RhY2suICAqLwotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsKLSAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOwotICBZWUxUWVBFICp5eWxzcDsKLSAgLyogVGhlIGxvY2F0aW9ucyB3aGVyZSB0aGUgZXJyb3Igc3RhcnRlZCBhbmQgZW5kZWQuICAqLwotICBZWUxUWVBFIHl5ZXJyb3JfcmFuZ2VbMl07Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSwgeXlsc3AgLT0gKE4pKQotCi0gIFlZU0laRV9UIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKLSAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KLSAgWVlTVFlQRSB5eXZhbDsKLSAgWVlMVFlQRSB5eWxvYzsKKyNkZWZpbmUgWVlQT1BTVEFDSyhOKSAgICh5eXZzcCAtPSAoTiksIHl5c3NwIC09IChOKSkKIAogICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZCBydWxlLgogICAgICBLZWVwIHRvIHplcm8gd2hlbiBubyBzeW1ib2wgc2hvdWxkIGJlIHBvcHBlZC4gICovCiAgIGludCB5eWxlbiA9IDA7CiAKKyAgeXl0b2tlbiA9IDA7CisgIHl5c3MgPSB5eXNzYTsKKyAgeXl2cyA9IHl5dnNhOworICB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCiAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CiAKICAgeXlzdGF0ZSA9IDA7CiAgIHl5ZXJyc3RhdHVzID0gMDsKICAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworICB5eWNoYXIgPSBZWUVNUFRZOyAvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwogCiAgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCiAgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawogICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCiAgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQogICB5eXNzcCA9IHl5c3M7CiAgIHl5dnNwID0geXl2czsKLSAgeXlsc3AgPSB5eWxzOwotI2lmIFlZTFRZUEVfSVNfVFJJVklBTAotICAvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHN0YXJ0cy4gICovCi0gIHl5bGxvYy5maXJzdF9saW5lICAgPSB5eWxsb2MubGFzdF9saW5lICAgPSAxOwotICB5eWxsb2MuZmlyc3RfY29sdW1uID0geXlsbG9jLmxhc3RfY29sdW1uID0gMDsKLSNlbmRpZgogCiAgIGdvdG8geXlzZXRzdGF0ZTsKIApAQCAtMTI5NCw3ICsxMjUyLDYgQEAKIAkgICBtZW1vcnkuICAqLwogCVlZU1RZUEUgKnl5dnMxID0geXl2czsKIAl5eXR5cGVfaW50MTYgKnl5c3MxID0geXlzczsKLQlZWUxUWVBFICp5eWxzMSA9IHl5bHM7CiAKIAkvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZiB0aGUKIAkgICBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gIFRoaXMgdXNlZCB0byBiZSBhCkBAIC0xMzAzLDkgKzEyNjAsOCBAQAogCXl5b3ZlcmZsb3cgKFlZXygibWVtb3J5IGV4aGF1c3RlZCIpLAogCQkgICAgJnl5c3MxLCB5eXNpemUgKiBzaXplb2YgKCp5eXNzcCksCiAJCSAgICAmeXl2czEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICAgICZ5eWxzMSwgeXlzaXplICogc2l6ZW9mICgqeXlsc3ApLAogCQkgICAgJnl5c3RhY2tzaXplKTsKLQl5eWxzID0geXlsczE7CisKIAl5eXNzID0geXlzczE7CiAJeXl2cyA9IHl5dnMxOwogICAgICAgfQpAQCAtMTMyNiw5ICsxMjgyLDggQEAKIAkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CiAJaWYgKCEgeXlwdHIpCiAJICBnb3RvIHl5ZXhoYXVzdGVkbGFiOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3MpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnMpOwotCVlZU1RBQ0tfUkVMT0NBVEUgKHl5bHMpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5c3NfYWxsb2MsIHl5c3MpOworCVlZU1RBQ0tfUkVMT0NBVEUgKHl5dnNfYWxsb2MsIHl5dnMpOwogIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQogCWlmICh5eXNzMSAhPSB5eXNzYSkKIAkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOwpAQCAtMTMzOCw3ICsxMjkzLDYgQEAKIAogICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKICAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7Ci0gICAgICB5eWxzcCA9IHl5bHMgKyB5eXNpemUgLSAxOwogCiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCiAJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOwpAQCAtMTM0OSw2ICsxMzAzLDkgQEAKIAogICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOwogCisgIGlmICh5eXN0YXRlID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKICAgZ290byB5eWJhY2t1cDsKIAogLyotLS0tLS0tLS0tLS4KQEAgLTEzNTcsMTYgKzEzMTQsMTYgQEAKIHl5YmFja3VwOgogCiAgIC8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICBSZWFkIGEKLSAgICAgbG9vay1haGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisgICAgIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCiAKLSAgLyogRmlyc3QgdHJ5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGhvdXQgcmVmZXJlbmNlIHRvIGxvb2stYWhlYWQgdG9rZW4uICAqLworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwogICBpZiAoeXluID09IFlZUEFDVF9OSU5GKQogICAgIGdvdG8geXlkZWZhdWx0OwogCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rLWFoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLwogCi0gIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2stYWhlYWQgc3ltYm9sLiAgKi8KKyAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9va2FoZWFkIHN5bWJvbC4gICovCiAgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSkKICAgICB7CiAgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpKTsKQEAgLTEzOTgsMjQgKzEzNTUsMjAgQEAKICAgICAgIGdvdG8geXlyZWR1Y2U7CiAgICAgfQogCi0gIGlmICh5eW4gPT0gWVlGSU5BTCkKLSAgICBZWUFDQ0VQVDsKLQogICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCiAgICAgIHN0YXR1cy4gICovCiAgIGlmICh5eWVycnN0YXR1cykKICAgICB5eWVycnN0YXR1cy0tOwogCi0gIC8qIFNoaWZ0IHRoZSBsb29rLWFoZWFkIHRva2VuLiAgKi8KKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCiAgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CiAKLSAgLyogRGlzY2FyZCB0aGUgc2hpZnRlZCB0b2tlbiB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOworICAvKiBEaXNjYXJkIHRoZSBzaGlmdGVkIHRva2VuLiAgKi8KKyAgeXljaGFyID0gWVlFTVBUWTsKIAogICB5eXN0YXRlID0geXluOwogICAqKyt5eXZzcCA9IHl5bHZhbDsKLSAgKisreXlsc3AgPSB5eWxsb2M7CisKICAgZ290byB5eW5ld3N0YXRlOwogCiAKQEAgLTE0NDYsMzM3ICsxMzk5LDM4NyBAQAogICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLwogICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOwogCi0gIC8qIERlZmF1bHQgbG9jYXRpb24uICAqLwotICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworCiAgIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKICAgc3dpdGNoICh5eW4pCiAgICAgewogICAgICAgICBjYXNlIDI6Ci0jbGluZSA5MCAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgODcgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCh5eXZzcFsoMykgLSAoNCldLnJlKSwgKHl5dnNwWyg0KSAtICg0KV0ubm9kZSksIDApOworCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygoeXl2c3BbKDMpIC0gKDQpXS5yZSksICh5eXZzcFsoNCkgLSAoNCldLm5vZGUpLAorCQkJCQkJCWd1ZXNzX2Jvb3RfY3B1aWQoKHl5dnNwWyg0KSAtICg0KV0ubm9kZSkpKTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDM6Ci0jbGluZSA5NCAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgOTUgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCh5eXZzcFsoMSkgLSAoMildLnJlKSwgKHl5dnNwWygyKSAtICgyKV0ubm9kZSksIDApOworCQkJKHl5dmFsLnJlKSA9IE5VTEw7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA0OgotI2xpbmUgMTAxICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSA5OSAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBOVUxMOworCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNToKLSNsaW5lIDEwNSAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTA2ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOworCQkJKHl5dmFsLnJlKSA9IGJ1aWxkX3Jlc2VydmVfZW50cnkoKHl5dnNwWygyKSAtICg0KV0uYWRkciksICh5eXZzcFsoMykgLSAoNCldLmFkZHIpKTsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDY6Ci0jbGluZSAxMTIgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExMCAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMykgLSAoNSldLmFkZHIpLCAoeXl2c3BbKDQpIC0gKDUpXS5hZGRyKSwgKHl5dnNwWygxKSAtICg1KV0ubGFiZWxyZWYpKTsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ucmUpLT5sYWJlbHMsICh5eXZzcFsoMSkgLSAoMildLmxhYmVscmVmKSk7CisJCQkoeXl2YWwucmUpID0gKHl5dnNwWygyKSAtICgyKV0ucmUpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNzoKLSNsaW5lIDExOSAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBOVUxMOwotCQk7fQotICAgIGJyZWFrOwogCi0gIGNhc2UgODoKLSNsaW5lIDEyMyAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBjaGFpbl9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMSkgLSAoMildLnJlKSwgKHl5dnNwWygyKSAtICgyKV0ucmUpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDk6Ci0jbGluZSAxMzAgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucmUpID0gKHl5dnNwWygxKSAtICgxKV0ucmUpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTA6Ci0jbGluZSAxMzQgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucmUpID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDMpIC0gKDYpXS5hZGRyKSwgKHl5dnNwWyg1KSAtICg2KV0uYWRkcikgLSAoeXl2c3BbKDMpIC0gKDYpXS5hZGRyKSArIDEsICh5eXZzcFsoMSkgLSAoNildLmxhYmVscmVmKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMToKLSNsaW5lIDE0MSAiZHRjLXBhcnNlci55IgorLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDExOCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5hZGRyKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDEpIC0gKDEpXS5saXRlcmFsKSwgMCwgNjQpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMTI6Ci0jbGluZSAxNDUgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSA4OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTI1ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmFkZHIpID0gZXZhbF9saXRlcmFsKCh5eXZzcFsoMSkgLSAoMSldLmxpdGVyYWwpLCAxNiwgNjQpOworCQkJKHl5dmFsLm5vZGUpID0gbmFtZV9ub2RlKCh5eXZzcFsoMikgLSAoMildLm5vZGUpLCAiIik7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxMzoKLSNsaW5lIDE1MiAiZHRjLXBhcnNlci55IgorICBjYXNlIDk6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxMjkgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICIiLCBOVUxMKTsKKwkJCSh5eXZhbC5ub2RlKSA9IG1lcmdlX25vZGVzKCh5eXZzcFsoMSkgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDMpIC0gKDMpXS5ub2RlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxNDoKLSNsaW5lIDE1OSAiZHRjLXBhcnNlci55IgorICBjYXNlIDEwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTMzICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJc3RydWN0IG5vZGUgKnRhcmdldCA9IGdldF9ub2RlX2J5X3JlZigoeXl2c3BbKDEpIC0gKDMpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgzKV0ubGFiZWxyZWYpKTsKKworCQkJaWYgKHRhcmdldCkKKwkJCQltZXJnZV9ub2Rlcyh0YXJnZXQsICh5eXZzcFsoMykgLSAoMyldLm5vZGUpKTsKKwkJCWVsc2UKKwkJCQlwcmludF9lcnJvcigibGFiZWwgb3IgcGF0aCwgJyVzJywgbm90IGZvdW5kIiwgKHl5dnNwWygyKSAtICgzKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5ub2RlKSA9ICh5eXZzcFsoMSkgLSAoMyldLm5vZGUpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTE6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNDYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZSkgPSBidWlsZF9ub2RlKCh5eXZzcFsoMikgLSAoNSldLnByb3BsaXN0KSwgKHl5dnNwWygzKSAtICg1KV0ubm9kZWxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDE1OgotI2xpbmUgMTY2ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMTI6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNTMgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucHJvcGxpc3QpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDE2OgotI2xpbmUgMTcwICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMTM6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNTcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwucHJvcGxpc3QpID0gY2hhaW5fcHJvcGVydHkoKHl5dnNwWygyKSAtICgyKV0ucHJvcCksICh5eXZzcFsoMSkgLSAoMildLnByb3BsaXN0KSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKKyAgY2FzZSAxNDoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE2NCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCSh5eXZhbC5wcm9wKSA9IGJ1aWxkX3Byb3BlcnR5KCh5eXZzcFsoMSkgLSAoNCldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDE1OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTY4ICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygxKSAtICgyKV0ucHJvcG5vZGVuYW1lKSwgZW1wdHlfZGF0YSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxNjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3MiAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ucHJvcCktPmxhYmVscywgKHl5dnNwWygxKSAtICgyKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5wcm9wKSA9ICh5eXZzcFsoMikgLSAoMildLnByb3ApOworCQk7fQorICAgIGJyZWFrOworCiAgIGNhc2UgMTc6Ci0jbGluZSAxNzcgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucHJvcCkgPSBidWlsZF9wcm9wZXJ0eSgoeXl2c3BbKDIpIC0gKDUpXS5wcm9wbm9kZW5hbWUpLCAoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKSwgKHl5dnNwWygxKSAtICg1KV0ubGFiZWxyZWYpKTsKLQkJO30KLSAgICBicmVhazsKIAotICBjYXNlIDE4OgotI2xpbmUgMTgxICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygyKSAtICgzKV0ucHJvcG5vZGVuYW1lKSwgZW1wdHlfZGF0YSwgKHl5dnNwWygxKSAtICgzKV0ubGFiZWxyZWYpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDE5OgotI2xpbmUgMTg4ICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTgwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgKHl5dnNwWygyKSAtICgyKV0uZGF0YSkpOwogCQk7fQogICAgIGJyZWFrOwogCisgIGNhc2UgMTg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxODQgImR0Yy1wYXJzZXIueSIKKyAgICB7CisJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4OCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKKwkJO30KKyAgICBicmVhazsKKwogICBjYXNlIDIwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLwogI2xpbmUgMTkyICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDQpXS5kYXRhKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMjE6Ci0jbGluZSAxOTYgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyMjoKLSNsaW5lIDIwMCAiZHRjLXBhcnNlci55IgotICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgUkVGX1BBVEgsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyMzoKLSNsaW5lIDIwNCAiZHRjLXBhcnNlci55IgorICBjYXNlIDIxOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTk2ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCAmcGF0aCk7Ci0JCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKKwkJCUZJTEUgKmYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCBOVUxMKTsKKwkJCXN0cnVjdCBkYXRhIGQ7CiAKIAkJCWlmICgoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSAhPSAwKQotCQkJCWlmIChmc2VlayhmaWxlLT5maWxlLCAoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwgU0VFS19TRVQpICE9IDApCi0JCQkJCXl5ZXJyb3JmKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAotCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpKHl5dnNwWyg2KSAtICg5KV0uYWRkciksCi0JCQkJCQkgKHl5dnNwWyg0KSAtICg5KV0uZGF0YSkudmFsLCBzdHJlcnJvcihlcnJubykpOworCQkJCWlmIChmc2VlayhmLCAoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwgU0VFS19TRVQpICE9IDApCisJCQkJCXByaW50X2Vycm9yKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAorCQkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSh5eXZzcFsoNikgLSAoOSldLmFkZHIpLAorCQkJCQkJICAgICAoeXl2c3BbKDQpIC0gKDkpXS5kYXRhKS52YWwsCisJCQkJCQkgICAgIHN0cmVycm9yKGVycm5vKSk7CiAKLQkJCWQgPSBkYXRhX2NvcHlfZmlsZShmaWxlLT5maWxlLCAoeXl2c3BbKDgpIC0gKDkpXS5hZGRyKSk7CisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZiwgKHl5dnNwWyg4KSAtICg5KV0uYWRkcikpOwogCiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoOSldLmRhdGEpLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjQ6Ci0jbGluZSAyMjEgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyMjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIxMyAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07Ci0JCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCh5eXZzcFsoNCkgLSAoNSldLmRhdGEpLnZhbCwgJnBhdGgpOworCQkJRklMRSAqZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbigoeXl2c3BbKDQpIC0gKDUpXS5kYXRhKS52YWwsIE5VTEwpOwogCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CiAKLQkJCWQgPSBkYXRhX2NvcHlfZmlsZShmaWxlLT5maWxlLCAtMSk7CisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZiwgLTEpOwogCiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNSldLmRhdGEpLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjU6Ci0jbGluZSAyMzIgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyMzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIyMyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgTEFCRUwsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNjoKLSNsaW5lIDIzOSAiZHRjLXBhcnNlci55IgorICBjYXNlIDI0OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjMwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI3OgotI2xpbmUgMjQzICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjU6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyMzQgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSAoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI4OgotI2xpbmUgMjQ3ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjY6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyMzggImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjk6Ci0jbGluZSAyNTQgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyNzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI0NSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGVtcHR5X2RhdGE7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMDoKLSNsaW5lIDI1OCAiZHRjLXBhcnNlci55IgorICBjYXNlIDI4OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjQ5ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hcHBlbmRfY2VsbCgoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgKHl5dnNwWygyKSAtICgyKV0uY2VsbCkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzE6Ci0jbGluZSAyNjIgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyOToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI1MyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYXBwZW5kX2NlbGwoZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBSRUZfUEhBTkRMRSwKIAkJCQkJCQkgICAgICAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpLCAtMSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMjoKLSNsaW5lIDI2NyAiZHRjLXBhcnNlci55IgorICBjYXNlIDMwOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjU4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDMzOgotI2xpbmUgMjc0ICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLmNiYXNlKSA9IDE2OwotCQk7fQotICAgIGJyZWFrOworICBjYXNlIDMxOgogCi0gIGNhc2UgMzU6Ci0jbGluZSAyODIgImR0Yy1wYXJzZXIueSIKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNjUgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuY2VsbCkgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDAsIDMyKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM2OgotI2xpbmUgMjg2ICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLmNlbGwpID0gZXZhbF9saXRlcmFsKCh5eXZzcFsoMikgLSAoMildLmxpdGVyYWwpLCAoeXl2c3BbKDEpIC0gKDIpXS5jYmFzZSksIDMyKTsKLQkJO30KLSAgICBicmVhazsKKyAgY2FzZSAzMjoKIAotICBjYXNlIDM3OgotI2xpbmUgMjkzICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjcyICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM4OgotI2xpbmUgMjk3ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzM6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNzYgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9ieXRlKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5ieXRlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzOToKLSNsaW5lIDMwMSAiZHRjLXBhcnNlci55IgorICBjYXNlIDM0OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjgwICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQwOgotI2xpbmUgMzA4ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzU6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyODcgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQxOgotI2xpbmUgMzEyICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzY6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyOTEgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwubm9kZWxpc3QpID0gY2hhaW5fbm9kZSgoeXl2c3BbKDEpIC0gKDIpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgyKV0ubm9kZWxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQyOgotI2xpbmUgMzE2ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzc6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyOTUgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQl5eWVycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzIik7CisJCQlwcmludF9lcnJvcigic3ludGF4IGVycm9yOiBwcm9wZXJ0aWVzIG11c3QgcHJlY2VkZSBzdWJub2RlcyIpOwogCQkJWVlFUlJPUjsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDQzOgotI2xpbmUgMzI0ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAzMDMgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygzKSAtICgzKV0ubm9kZSksICh5eXZzcFsoMikgLSAoMyldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoMSkgLSAoMyldLmxhYmVscmVmKSk7CisJCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICh5eXZzcFsoMSkgLSAoMildLnByb3Bub2RlbmFtZSkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDQ6Ci0jbGluZSAzMzEgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwubGFiZWxyZWYpID0gTlVMTDsKLQkJO30KLSAgICBicmVhazsKKyAgY2FzZSAzOToKIAotICBjYXNlIDQ1OgotI2xpbmUgMzM1ICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMzA3ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLmxhYmVscmVmKSA9ICh5eXZzcFsoMSkgLSAoMSldLmxhYmVscmVmKTsKKwkJCWFkZF9sYWJlbCgmKHl5dnNwWygyKSAtICgyKV0ubm9kZSktPmxhYmVscywgKHl5dnNwWygxKSAtICgyKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5ub2RlKSA9ICh5eXZzcFsoMikgLSAoMildLm5vZGUpOwogCQk7fQogICAgIGJyZWFrOwogCiAKLS8qIExpbmUgMTI2NyBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTc4MCAiZHRjLXBhcnNlci50YWIuYyIKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE3ODMgImR0Yy1wYXJzZXIudGFiLmMiCiAgICAgICBkZWZhdWx0OiBicmVhazsKICAgICB9CiAgIFlZX1NZTUJPTF9QUklOVCAoIi0+ICQkID0iLCB5eXIxW3l5bl0sICZ5eXZhbCwgJnl5bG9jKTsKQEAgLTE3ODYsNyArMTc4OSw2IEBACiAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CiAKICAgKisreXl2c3AgPSB5eXZhbDsKLSAgKisreXlsc3AgPSB5eWxvYzsKIAogICAvKiBOb3cgYHNoaWZ0JyB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uICBEZXRlcm1pbmUgd2hhdCBzdGF0ZQogICAgICB0aGF0IGdvZXMgdG8sIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0byBhbmQgdGhlIHJ1bGUKQEAgLTE4NDgsMTEgKzE4NTAsMTEgQEAKICNlbmRpZgogICAgIH0KIAotICB5eWVycm9yX3JhbmdlWzBdID0geXlsbG9jOworCiAKICAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCiAgICAgewotICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KIAkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLwogCiAgICAgICBpZiAoeXljaGFyIDw9IFlZRU9GKQpAQCAtMTg2NCwxMiArMTg2NiwxMiBAQAogICAgICAgZWxzZQogCXsKIAkgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogZGlzY2FyZGluZyIsCi0JCSAgICAgIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCQkgICAgICB5eXRva2VuLCAmeXlsdmFsKTsKIAkgIHl5Y2hhciA9IFlZRU1QVFk7CiAJfQogICAgIH0KIAotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2stYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvcgogICAgICB0b2tlbi4gICovCiAgIGdvdG8geXllcnJsYWIxOwogCkBAIC0xODg1LDcgKzE4ODcsNiBAQAogICBpZiAoLypDT05TVENPTkQqLyAwKQogICAgICBnb3RvIHl5ZXJyb3JsYWI7CiAKLSAgeXllcnJvcl9yYW5nZVswXSA9IHl5bHNwWzEteXlsZW5dOwogICAvKiBEbyBub3QgcmVjbGFpbSB0aGUgc3ltYm9scyBvZiB0aGUgcnVsZSB3aGljaCBhY3Rpb24gdHJpZ2dlcmVkCiAgICAgIHRoaXMgWVlFUlJPUi4gICovCiAgIFlZUE9QU1RBQ0sgKHl5bGVuKTsKQEAgLTE5MTksMjQgKzE5MjAsMTYgQEAKICAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQogCVlZQUJPUlQ7CiAKLSAgICAgIHl5ZXJyb3JfcmFuZ2VbMF0gPSAqeXlsc3A7CisKICAgICAgIHl5ZGVzdHJ1Y3QgKCJFcnJvcjogcG9wcGluZyIsCi0JCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCwgeXlsc3ApOworCQkgIHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOwogICAgICAgWVlQT1BTVEFDSyAoMSk7CiAgICAgICB5eXN0YXRlID0gKnl5c3NwOwogICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKICAgICB9CiAKLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCiAgICorK3l5dnNwID0geXlsdmFsOwogCi0gIHl5ZXJyb3JfcmFuZ2VbMV0gPSB5eWxsb2M7Ci0gIC8qIFVzaW5nIFlZTExPQyBpcyB0ZW1wdGluZywgYnV0IHdvdWxkIGNoYW5nZSB0aGUgbG9jYXRpb24gb2YKLSAgICAgdGhlIGxvb2stYWhlYWQuICBZWUxPQyBpcyBhdmFpbGFibGUgdGhvdWdoLiAgKi8KLSAgWVlMTE9DX0RFRkFVTFQgKHl5bG9jLCAoeXllcnJvcl9yYW5nZSAtIDEpLCAyKTsKLSAgKisreXlsc3AgPSB5eWxvYzsKIAogICAvKiBTaGlmdCB0aGUgZXJyb3IgdG9rZW4uICAqLwogICBZWV9TWU1CT0xfUFJJTlQgKCJTaGlmdGluZyIsIHl5c3Rvc1t5eW5dLCB5eXZzcCwgeXlsc3ApOwpAQCAtMTk1OSw3ICsxOTUyLDcgQEAKICAgeXlyZXN1bHQgPSAxOwogICBnb3RvIHl5cmV0dXJuOwogCi0jaWZuZGVmIHl5b3ZlcmZsb3cKKyNpZiAhZGVmaW5lZCh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KIHwgeXlleGhhdXN0ZWRsYWIgLS0gbWVtb3J5IGV4aGF1c3Rpb24gY29tZXMgaGVyZS4gIHwKIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5NzAsOSArMTk2Myw5IEBACiAjZW5kaWYKIAogeXlyZXR1cm46Ci0gIGlmICh5eWNoYXIgIT0gWVlFT0YgJiYgeXljaGFyICE9IFlZRU1QVFkpCisgIGlmICh5eWNoYXIgIT0gWVlFTVBUWSkKICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IGRpc2NhcmRpbmcgbG9va2FoZWFkIiwKLQkJIHl5dG9rZW4sICZ5eWx2YWwsICZ5eWxsb2MpOworCQkgeXl0b2tlbiwgJnl5bHZhbCk7CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUFCT1JUIG9yIFlZQUNDRVBULiAgKi8KICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpAQCAtMTk4MCw3ICsxOTczLDcgQEAKICAgd2hpbGUgKHl5c3NwICE9IHl5c3MpCiAgICAgewogICAgICAgeXlkZXN0cnVjdCAoIkNsZWFudXA6IHBvcHBpbmciLAotCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCwgeXlsc3ApOworCQkgIHl5c3Rvc1sqeXlzc3BdLCB5eXZzcCk7CiAgICAgICBZWVBPUFNUQUNLICgxKTsKICAgICB9CiAjaWZuZGVmIHl5b3ZlcmZsb3cKQEAgLTE5OTYsMjkgKzE5ODksMjQgQEAKIH0KIAogCi0jbGluZSAzNDAgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxNjc1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMxMyAiZHRjLXBhcnNlci55IgogCiAKLXZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqcywgLi4uKQordm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLikKIHsKLQljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlID8gc3JjcG9zX2ZpbGUtPm5hbWUgOiAiPG5vLWZpbGU+IjsKIAl2YV9saXN0IHZhOwotCXZhX3N0YXJ0KHZhLCBzKTsKIAotCWlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCkKLQkJZm5hbWUgPSAic3RkaW4iOwotCi0JZnByaW50ZihzdGRlcnIsICIlczolZCAiLCBmbmFtZSwgeXlsbG9jLmZpcnN0X2xpbmUpOwotCXZmcHJpbnRmKHN0ZGVyciwgcywgdmEpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzcmNwb3NfdmVycm9yKCZ5eWxsb2MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CiAKIAl0cmVlc291cmNlX2Vycm9yID0gMTsKLQl2YV9lbmQodmEpOwogfQogCi12b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCi17Ci0JeXllcnJvcmYoIiVzIiwgcyk7Cit2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqcykgeworCXByaW50X2Vycm9yKCIlcyIsIHMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpCkBAIC0yMDI5LDEyICsyMDE3LDEyIEBACiAJZXJybm8gPSAwOwogCXZhbCA9IHN0cnRvdWxsKHMsICZlLCBiYXNlKTsKIAlpZiAoKmUpCi0JCXl5ZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKIAllbHNlIGlmICgoZXJybm8gPT0gRVJBTkdFKQogCQkgfHwgKChiaXRzIDwgNjQpICYmICh2YWwgPj0gKDFVTEwgPDwgYml0cykpKSkKLQkJeXllcnJvcigibGl0ZXJhbCBvdXQgb2YgcmFuZ2UiKTsKKwkJcHJpbnRfZXJyb3IoImxpdGVyYWwgb3V0IG9mIHJhbmdlIik7CiAJZWxzZSBpZiAoZXJybm8gIT0gMCkKLQkJeXllcnJvcigiYmFkIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBsaXRlcmFsIik7CiAJcmV0dXJuIHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkCmluZGV4IGJhOTkxMDAuLjk1Yzk1NDcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmhfc2hpcHBlZAorKysgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKQEAgLTEsMjQgKzEsMjMgQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjMuICAqLworCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjEuICAqLwogCiAvKiBTa2VsZXRvbiBpbnRlcmZhY2UgZm9yIEJpc29uJ3MgWWFjYy1saWtlIHBhcnNlcnMgaW4gQwotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKKyAgIAorICAgICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2CiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KKyAgIAogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB5b3UgbWF5IGNyZWF0ZSBhIGxhcmdlciB3b3JrIHRoYXQgY29udGFpbnMKICAgIHBhcnQgb3IgYWxsIG9mIHRoZSBCaXNvbiBwYXJzZXIgc2tlbGV0b24gYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCkBAIC0yOSwxMCArMjgsMTEgQEAKICAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwogICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgotCisgICAKICAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW4KICAgIHZlcnNpb24gMi4yIG9mIEJpc29uLiAgKi8KIAorCiAvKiBUb2tlbnMuICAqLwogI2lmbmRlZiBZWVRPS0VOVFlQRQogIyBkZWZpbmUgWVlUT0tFTlRZUEUKQEAgLTQzLDM1ICs0MywyNCBAQAogICAgICBEVF9NRU1SRVNFUlZFID0gMjU5LAogICAgICBEVF9QUk9QTk9ERU5BTUUgPSAyNjAsCiAgICAgIERUX0xJVEVSQUwgPSAyNjEsCi0gICAgIERUX0xFR0FDWUxJVEVSQUwgPSAyNjIsCi0gICAgIERUX0JBU0UgPSAyNjMsCi0gICAgIERUX0JZVEUgPSAyNjQsCi0gICAgIERUX1NUUklORyA9IDI2NSwKLSAgICAgRFRfTEFCRUwgPSAyNjYsCi0gICAgIERUX1JFRiA9IDI2NywKLSAgICAgRFRfSU5DQklOID0gMjY4CisgICAgIERUX0JBU0UgPSAyNjIsCisgICAgIERUX0JZVEUgPSAyNjMsCisgICAgIERUX1NUUklORyA9IDI2NCwKKyAgICAgRFRfTEFCRUwgPSAyNjUsCisgICAgIERUX1JFRiA9IDI2NiwKKyAgICAgRFRfSU5DQklOID0gMjY3CiAgICB9OwogI2VuZGlmCi0vKiBUb2tlbnMuICAqLwotI2RlZmluZSBEVF9WMSAyNTgKLSNkZWZpbmUgRFRfTUVNUkVTRVJWRSAyNTkKLSNkZWZpbmUgRFRfUFJPUE5PREVOQU1FIDI2MAotI2RlZmluZSBEVF9MSVRFUkFMIDI2MQotI2RlZmluZSBEVF9MRUdBQ1lMSVRFUkFMIDI2MgotI2RlZmluZSBEVF9CQVNFIDI2MwotI2RlZmluZSBEVF9CWVRFIDI2NAotI2RlZmluZSBEVF9TVFJJTkcgMjY1Ci0jZGVmaW5lIERUX0xBQkVMIDI2NgotI2RlZmluZSBEVF9SRUYgMjY3Ci0jZGVmaW5lIERUX0lOQ0JJTiAyNjgKLQogCiAKIAogI2lmICEgZGVmaW5lZCBZWVNUWVBFICYmICEgZGVmaW5lZCBZWVNUWVBFX0lTX0RFQ0xBUkVECiB0eXBlZGVmIHVuaW9uIFlZU1RZUEUKLSNsaW5lIDM3ICJkdGMtcGFyc2VyLnkiCiB7CisKKy8qIExpbmUgMTY3NiBvZiB5YWNjLmMgICovCisjbGluZSAzOSAiZHRjLXBhcnNlci55IgorCiAJY2hhciAqcHJvcG5vZGVuYW1lOwogCWNoYXIgKmxpdGVyYWw7CiAJY2hhciAqbGFiZWxyZWY7CkBAIC04NiwyOCArNzUsMTcgQEAKIAlzdHJ1Y3Qgbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZWxpc3Q7CiAJc3RydWN0IHJlc2VydmVfaW5mbyAqcmU7Ci19Ci0vKiBMaW5lIDE0ODkgb2YgeWFjYy5jLiAgKi8KLSNsaW5lIDkyICJkdGMtcGFyc2VyLnRhYi5oIgotCVlZU1RZUEU7CisKKworCisvKiBMaW5lIDE2NzYgb2YgeWFjYy5jICAqLworI2xpbmUgODMgImR0Yy1wYXJzZXIudGFiLmgiCit9IFlZU1RZUEU7CisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogI2VuZGlmCiAKIGV4dGVybiBZWVNUWVBFIHl5bHZhbDsKIAotI2lmICEgZGVmaW5lZCBZWUxUWVBFICYmICEgZGVmaW5lZCBZWUxUWVBFX0lTX0RFQ0xBUkVECi10eXBlZGVmIHN0cnVjdCBZWUxUWVBFCi17Ci0gIGludCBmaXJzdF9saW5lOwotICBpbnQgZmlyc3RfY29sdW1uOwotICBpbnQgbGFzdF9saW5lOwotICBpbnQgbGFzdF9jb2x1bW47Ci19IFlZTFRZUEU7Ci0jIGRlZmluZSB5eWx0eXBlIFlZTFRZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCi0jIGRlZmluZSBZWUxUWVBFX0lTX0RFQ0xBUkVEIDEKLSMgZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTCAxCi0jZW5kaWYKIAotZXh0ZXJuIFlZTFRZUEUgeXlsbG9jOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci55IGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci55CmluZGV4IGIyYWI1NjIuLjVlODRhNjcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIueQorKysgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnkKQEAgLTE4LDE1ICsxOCwxNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBCiAgKi8KIAotJWxvY2F0aW9ucwotCiAlewogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAorWVlMVFlQRSB5eWxsb2M7CisKIGV4dGVybiBpbnQgeXlsZXgodm9pZCk7CitleHRlcm4gdm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCB5eWVycm9yKGNoYXIgY29uc3QgKnMpOwogCiBleHRlcm4gc3RydWN0IGJvb3RfaW5mbyAqdGhlX2Jvb3RfaW5mbzsKIGV4dGVybiBpbnQgdHJlZXNvdXJjZV9lcnJvcjsKQEAgLTU1LDcgKzU3LDYgQEAKICV0b2tlbiBEVF9NRU1SRVNFUlZFCiAldG9rZW4gPHByb3Bub2RlbmFtZT4gRFRfUFJPUE5PREVOQU1FCiAldG9rZW4gPGxpdGVyYWw+IERUX0xJVEVSQUwKLSV0b2tlbiA8bGl0ZXJhbD4gRFRfTEVHQUNZTElURVJBTAogJXRva2VuIDxjYmFzZT4gRFRfQkFTRQogJXRva2VuIDxieXRlPiBEVF9CWVRFCiAldG9rZW4gPGRhdGE+IERUX1NUUklORwpAQCAtNjcsMTEgKzY4LDggQEAKICV0eXBlIDxkYXRhPiBwcm9wZGF0YXByZWZpeAogJXR5cGUgPHJlPiBtZW1yZXNlcnZlCiAldHlwZSA8cmU+IG1lbXJlc2VydmVzCi0ldHlwZSA8cmU+IHYwX21lbXJlc2VydmUKLSV0eXBlIDxyZT4gdjBfbWVtcmVzZXJ2ZXMKICV0eXBlIDxhZGRyPiBhZGRyCiAldHlwZSA8ZGF0YT4gY2VsbGxpc3QKLSV0eXBlIDxjYmFzZT4gY2VsbGJhc2UKICV0eXBlIDxjZWxsPiBjZWxsdmFsCiAldHlwZSA8ZGF0YT4gYnl0ZXN0cmluZwogJXR5cGUgPHByb3A+IHByb3BkZWYKQEAgLTgxLDE4ICs3OSwxNCBAQAogJXR5cGUgPG5vZGU+IG5vZGVkZWYKICV0eXBlIDxub2RlPiBzdWJub2RlCiAldHlwZSA8bm9kZWxpc3Q+IHN1Ym5vZGVzCi0ldHlwZSA8bGFiZWxyZWY+IGxhYmVsCiAKICUlCiAKIHNvdXJjZWZpbGU6CiAJICBEVF9WMSAnOycgbWVtcmVzZXJ2ZXMgZGV2aWNldHJlZQogCQl7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCQzLCAkNCwgMCk7Ci0JCX0KLQl8IHYwX21lbXJlc2VydmVzIGRldmljZXRyZWUKLQkJewotCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMSwgJDIsIDApOworCQkJdGhlX2Jvb3RfaW5mbyA9IGJ1aWxkX2Jvb3RfaW5mbygkMywgJDQsCisJCQkJCQkJZ3Vlc3NfYm9vdF9jcHVpZCgkNCkpOwogCQl9CiAJOwogCkBAIC0xMDgsMzEgKzEwMiwxNCBAQAogCTsKIAogbWVtcmVzZXJ2ZToKLQkgIGxhYmVsIERUX01FTVJFU0VSVkUgYWRkciBhZGRyICc7JworCSAgRFRfTUVNUkVTRVJWRSBhZGRyIGFkZHIgJzsnCiAJCXsKLQkJCSQkID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgkMywgJDQsICQxKTsKKwkJCSQkID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgkMiwgJDMpOwogCQl9Ci0JOwotCi12MF9tZW1yZXNlcnZlczoKLQkgIC8qIGVtcHR5ICovCisJfCBEVF9MQUJFTCBtZW1yZXNlcnZlCiAJCXsKLQkJCSQkID0gTlVMTDsKLQkJfQotCXwgdjBfbWVtcmVzZXJ2ZSB2MF9tZW1yZXNlcnZlcwotCQl7Ci0JCQkkJCA9IGNoYWluX3Jlc2VydmVfZW50cnkoJDEsICQyKTsKLQkJfTsKLQk7Ci0KLXYwX21lbXJlc2VydmU6Ci0JICBtZW1yZXNlcnZlCi0JCXsKLQkJCSQkID0gJDE7Ci0JCX0KLQl8IGxhYmVsIERUX01FTVJFU0VSVkUgYWRkciAnLScgYWRkciAnOycKLQkJewotCQkJJCQgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCQzLCAkNSAtICQzICsgMSwgJDEpOworCQkJYWRkX2xhYmVsKCYkMi0+bGFiZWxzLCAkMSk7CisJCQkkJCA9ICQyOwogCQl9CiAJOwogCkBAIC0xNDEsMTYgKzExOCwyNiBAQAogCQl7CiAJCQkkJCA9IGV2YWxfbGl0ZXJhbCgkMSwgMCwgNjQpOwogCQl9Ci0JfCBEVF9MRUdBQ1lMSVRFUkFMCi0JCXsKLQkJCSQkID0gZXZhbF9saXRlcmFsKCQxLCAxNiwgNjQpOwotCQl9CiAJICA7CiAKIGRldmljZXRyZWU6CiAJICAnLycgbm9kZWRlZgogCQl7Ci0JCQkkJCA9IG5hbWVfbm9kZSgkMiwgIiIsIE5VTEwpOworCQkJJCQgPSBuYW1lX25vZGUoJDIsICIiKTsKKwkJfQorCXwgZGV2aWNldHJlZSAnLycgbm9kZWRlZgorCQl7CisJCQkkJCA9IG1lcmdlX25vZGVzKCQxLCAkMyk7CisJCX0KKwl8IGRldmljZXRyZWUgRFRfUkVGIG5vZGVkZWYKKwkJeworCQkJc3RydWN0IG5vZGUgKnRhcmdldCA9IGdldF9ub2RlX2J5X3JlZigkMSwgJDIpOworCisJCQlpZiAodGFyZ2V0KQorCQkJCW1lcmdlX25vZGVzKHRhcmdldCwgJDMpOworCQkJZWxzZQorCQkJCXByaW50X2Vycm9yKCJsYWJlbCBvciBwYXRoLCAnJXMnLCBub3QgZm91bmQiLCAkMik7CisJCQkkJCA9ICQxOwogCQl9CiAJOwogCkBAIC0xNzMsMTMgKzE2MCwxOCBAQAogCTsKIAogcHJvcGRlZjoKLQkgIGxhYmVsIERUX1BST1BOT0RFTkFNRSAnPScgcHJvcGRhdGEgJzsnCisJICBEVF9QUk9QTk9ERU5BTUUgJz0nIHByb3BkYXRhICc7JwogCQl7Ci0JCQkkJCA9IGJ1aWxkX3Byb3BlcnR5KCQyLCAkNCwgJDEpOworCQkJJCQgPSBidWlsZF9wcm9wZXJ0eSgkMSwgJDMpOwogCQl9Ci0JfCBsYWJlbCBEVF9QUk9QTk9ERU5BTUUgJzsnCisJfCBEVF9QUk9QTk9ERU5BTUUgJzsnCiAJCXsKLQkJCSQkID0gYnVpbGRfcHJvcGVydHkoJDIsIGVtcHR5X2RhdGEsICQxKTsKKwkJCSQkID0gYnVpbGRfcHJvcGVydHkoJDEsIGVtcHR5X2RhdGEpOworCQl9CisJfCBEVF9MQUJFTCBwcm9wZGVmCisJCXsKKwkJCWFkZF9sYWJlbCgmJDItPmxhYmVscywgJDEpOworCQkJJCQgPSAkMjsKIAkJfQogCTsKIApAQCAtMjAyLDMxICsxOTQsMzAgQEAKIAkJfQogCXwgcHJvcGRhdGFwcmVmaXggRFRfSU5DQklOICcoJyBEVF9TVFJJTkcgJywnIGFkZHIgJywnIGFkZHIgJyknCiAJCXsKLQkJCXN0cnVjdCBzZWFyY2hfcGF0aCBwYXRoID0geyBzcmNwb3NfZmlsZS0+ZGlyLCBOVUxMLCBOVUxMIH07Ci0JCQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUgPSBkdGNfb3Blbl9maWxlKCQ0LnZhbCwgJnBhdGgpOwotCQkJc3RydWN0IGRhdGEgZCA9IGVtcHR5X2RhdGE7CisJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCQ0LnZhbCwgTlVMTCk7CisJCQlzdHJ1Y3QgZGF0YSBkOwogCiAJCQlpZiAoJDYgIT0gMCkKLQkJCQlpZiAoZnNlZWsoZmlsZS0+ZmlsZSwgJDYsIFNFRUtfU0VUKSAhPSAwKQotCQkJCQl5eWVycm9yZigiQ291bGRuJ3Qgc2VlayB0byBvZmZzZXQgJWxsdSBpbiBcIiVzXCI6ICVzIiwKLQkJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSQ2LAotCQkJCQkJICQ0LnZhbCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlpZiAoZnNlZWsoZiwgJDYsIFNFRUtfU0VUKSAhPSAwKQorCQkJCQlwcmludF9lcnJvcigiQ291bGRuJ3Qgc2VlayB0byBvZmZzZXQgJWxsdSBpbiBcIiVzXCI6ICVzIiwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykkNiwKKwkJCQkJCSAgICAgJDQudmFsLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOwogCi0JCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgJDgpOworCQkJZCA9IGRhdGFfY29weV9maWxlKGYsICQ4KTsKIAogCQkJJCQgPSBkYXRhX21lcmdlKCQxLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQl9CiAJfCBwcm9wZGF0YXByZWZpeCBEVF9JTkNCSU4gJygnIERUX1NUUklORyAnKScKIAkJewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoJDQudmFsLCAmcGF0aCk7CisJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCQ0LnZhbCwgTlVMTCk7CiAJCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKIAotCQkJZCA9IGRhdGFfY29weV9maWxlKGZpbGUtPmZpbGUsIC0xKTsKKwkJCWQgPSBkYXRhX2NvcHlfZmlsZShmLCAtMSk7CiAKIAkJCSQkID0gZGF0YV9tZXJnZSgkMSwgZCk7Ci0JCQlkdGNfY2xvc2VfZmlsZShmaWxlKTsKKwkJCWZjbG9zZShmKTsKIAkJfQogCXwgcHJvcGRhdGEgRFRfTEFCRUwKIAkJewpAQCAtMjY5LDIzICsyNjAsMTEgQEAKIAkJfQogCTsKIAotY2VsbGJhc2U6Ci0JICAvKiBlbXB0eSAqLwotCQl7Ci0JCQkkJCA9IDE2OwotCQl9Ci0JfCBEVF9CQVNFCi0JOwotCiBjZWxsdmFsOgogCSAgRFRfTElURVJBTAogCQl7CiAJCQkkJCA9IGV2YWxfbGl0ZXJhbCgkMSwgMCwgMzIpOwogCQl9Ci0JfCBjZWxsYmFzZSBEVF9MRUdBQ1lMSVRFUkFMCi0JCXsKLQkJCSQkID0gZXZhbF9saXRlcmFsKCQyLCAkMSwgMzIpOwotCQl9CiAJOwogCiBieXRlc3RyaW5nOgpAQCAtMzA4LDU3ICsyODcsNDQgQEAKIAkJewogCQkJJCQgPSBOVUxMOwogCQl9Ci0JfCAgc3Vibm9kZSBzdWJub2RlcworCXwgc3Vibm9kZSBzdWJub2RlcwogCQl7CiAJCQkkJCA9IGNoYWluX25vZGUoJDEsICQyKTsKIAkJfQogCXwgc3Vibm9kZSBwcm9wZGVmCiAJCXsKLQkJCXl5ZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKKwkJCXByaW50X2Vycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzIik7CiAJCQlZWUVSUk9SOwogCQl9CiAJOwogCiBzdWJub2RlOgotCSAgbGFiZWwgRFRfUFJPUE5PREVOQU1FIG5vZGVkZWYKKwkgIERUX1BST1BOT0RFTkFNRSBub2RlZGVmCiAJCXsKLQkJCSQkID0gbmFtZV9ub2RlKCQzLCAkMiwgJDEpOworCQkJJCQgPSBuYW1lX25vZGUoJDIsICQxKTsKIAkJfQotCTsKLQotbGFiZWw6Ci0JICAvKiBlbXB0eSAqLworCXwgRFRfTEFCRUwgc3Vibm9kZQogCQl7Ci0JCQkkJCA9IE5VTEw7Ci0JCX0KLQl8IERUX0xBQkVMCi0JCXsKLQkJCSQkID0gJDE7CisJCQlhZGRfbGFiZWwoJiQyLT5sYWJlbHMsICQxKTsKKwkJCSQkID0gJDI7CiAJCX0KIAk7CiAKICUlCiAKLXZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqcywgLi4uKQordm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLikKIHsKLQljb25zdCBjaGFyICpmbmFtZSA9IHNyY3Bvc19maWxlID8gc3JjcG9zX2ZpbGUtPm5hbWUgOiAiPG5vLWZpbGU+IjsKIAl2YV9saXN0IHZhOwotCXZhX3N0YXJ0KHZhLCBzKTsKIAotCWlmIChzdHJjbXAoZm5hbWUsICItIikgPT0gMCkKLQkJZm5hbWUgPSAic3RkaW4iOwotCi0JZnByaW50ZihzdGRlcnIsICIlczolZCAiLCBmbmFtZSwgeXlsbG9jLmZpcnN0X2xpbmUpOwotCXZmcHJpbnRmKHN0ZGVyciwgcywgdmEpOwotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzcmNwb3NfdmVycm9yKCZ5eWxsb2MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7CiAKIAl0cmVlc291cmNlX2Vycm9yID0gMTsKLQl2YV9lbmQodmEpOwogfQogCi12b2lkIHl5ZXJyb3IgKGNoYXIgY29uc3QgKnMpCi17Ci0JeXllcnJvcmYoIiVzIiwgcyk7Cit2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqcykgeworCXByaW50X2Vycm9yKCIlcyIsIHMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpCkBAIC0zNjksMTEgKzMzNSwxMSBAQAogCWVycm5vID0gMDsKIAl2YWwgPSBzdHJ0b3VsbChzLCAmZSwgYmFzZSk7CiAJaWYgKCplKQotCQl5eWVycm9yKCJiYWQgY2hhcmFjdGVycyBpbiBsaXRlcmFsIik7CisJCXByaW50X2Vycm9yKCJiYWQgY2hhcmFjdGVycyBpbiBsaXRlcmFsIik7CiAJZWxzZSBpZiAoKGVycm5vID09IEVSQU5HRSkKIAkJIHx8ICgoYml0cyA8IDY0KSAmJiAodmFsID49ICgxVUxMIDw8IGJpdHMpKSkpCi0JCXl5ZXJyb3IoImxpdGVyYWwgb3V0IG9mIHJhbmdlIik7CisJCXByaW50X2Vycm9yKCJsaXRlcmFsIG91dCBvZiByYW5nZSIpOwogCWVsc2UgaWYgKGVycm5vICE9IDApCi0JCXl5ZXJyb3IoImJhZCBsaXRlcmFsIik7CisJCXByaW50X2Vycm9yKCJiYWQgbGl0ZXJhbCIpOwogCXJldHVybiB2YWw7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMuYyBiL3NjcmlwdHMvZHRjL2R0Yy5jCmluZGV4IGQ4ZmQ0M2IuLmNiYzAxOTMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy5jCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy5jCkBAIC0zMCwzMCArMzAsNyBAQAogaW50IHJlc2VydmVudW07CQkvKiBOdW1iZXIgb2YgbWVtb3J5IHJlc2VydmF0aW9uIHNsb3RzICovCiBpbnQgbWluc2l6ZTsJCS8qIE1pbmltdW0gYmxvYiBzaXplICovCiBpbnQgcGFkc2l6ZTsJCS8qIEFkZGl0aW9uYWwgcGFkZGluZyB0byBibG9iICovCi0KLWNoYXIgKmpvaW5fcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpuYW1lKQotewotCWludCBsZW5wID0gc3RybGVuKHBhdGgpOwotCWludCBsZW5uID0gc3RybGVuKG5hbWUpOwotCWludCBsZW47Ci0JaW50IG5lZWRzbGFzaCA9IDE7Ci0JY2hhciAqc3RyOwotCi0JbGVuID0gbGVucCArIGxlbm4gKyAyOwotCWlmICgobGVucCA+IDApICYmIChwYXRoW2xlbnAtMV0gPT0gJy8nKSkgewotCQluZWVkc2xhc2ggPSAwOwotCQlsZW4tLTsKLQl9Ci0KLQlzdHIgPSB4bWFsbG9jKGxlbik7Ci0JbWVtY3B5KHN0ciwgcGF0aCwgbGVucCk7Ci0JaWYgKG5lZWRzbGFzaCkgewotCQlzdHJbbGVucF0gPSAnLyc7Ci0JCWxlbnArKzsKLQl9Ci0JbWVtY3B5KHN0citsZW5wLCBuYW1lLCBsZW5uKzEpOwotCXJldHVybiBzdHI7Ci19CitpbnQgcGhhbmRsZV9mb3JtYXQgPSBQSEFORExFX0JPVEg7CS8qIFVzZSBsaW51eCxwaGFuZGxlIG9yIHBoYW5kbGUgcHJvcGVydGllcyAqLwogCiBzdGF0aWMgdm9pZCBmaWxsX2Z1bGxwYXRocyhzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqcHJlZml4KQogewpAQCAtMTA0LDggKzgxLDE1IEBACiAJZnByaW50ZihzdGRlcnIsICJcdFx0U2V0IHRoZSBwaHlzaWNhbCBib290IGNwdVxuIik7CiAJZnByaW50ZihzdGRlcnIsICJcdC1mXG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0XHRGb3JjZSAtIHRyeSB0byBwcm9kdWNlIG91dHB1dCBldmVuIGlmIHRoZSBpbnB1dCB0cmVlIGhhcyBlcnJvcnNcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0U29ydCBub2RlcyBhbmQgcHJvcGVydGllcyBiZWZvcmUgb3V0cHV0dGluZyAob25seSB1c2VmdWwgZm9yXG5cdFx0Y29tcGFyaW5nIHRyZWVzKVxuIik7CiAJZnByaW50ZihzdGRlcnIsICJcdC12XG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0XHRQcmludCBEVEMgdmVyc2lvbiBhbmQgZXhpdFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1IIDxwaGFuZGxlIGZvcm1hdD5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRcdHBoYW5kbGUgZm9ybWF0cyBhcmU6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGxlZ2FjeSAtIFwibGludXgscGhhbmRsZVwiIHByb3BlcnRpZXMgb25seVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0XHRlcGFwciAtIFwicGhhbmRsZVwiIHByb3BlcnRpZXMgb25seVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0XHRib3RoIC0gQm90aCBcImxpbnV4LHBoYW5kbGVcIiBhbmQgXCJwaGFuZGxlXCIgcHJvcGVydGllc1xuIik7CiAJZXhpdCgzKTsKIH0KIApAQCAtMTE1LDcgKzk5LDcgQEAKIAljb25zdCBjaGFyICppbmZvcm0gPSAiZHRzIjsKIAljb25zdCBjaGFyICpvdXRmb3JtID0gImR0cyI7CiAJY29uc3QgY2hhciAqb3V0bmFtZSA9ICItIjsKLQlpbnQgZm9yY2UgPSAwLCBjaGVjayA9IDA7CisJaW50IGZvcmNlID0gMCwgY2hlY2sgPSAwLCBzb3J0ID0gMDsKIAljb25zdCBjaGFyICphcmc7CiAJaW50IG9wdDsKIAlGSUxFICpvdXRmID0gTlVMTDsKQEAgLTEyNyw3ICsxMTEsNyBAQAogCW1pbnNpemUgICAgPSAwOwogCXBhZHNpemUgICAgPSAwOwogCi0Jd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImhJOk86bzpWOlI6UzpwOmZjcWI6diIpKSAhPSBFT0YpIHsKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaEk6TzpvOlY6UjpTOnA6ZmNxYjp2SDpzIikpICE9IEVPRikgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICdJJzoKIAkJCWluZm9ybSA9IG9wdGFyZzsKQEAgLTE2NSw2ICsxNDksMjIgQEAKIAkJY2FzZSAndic6CiAJCQlwcmludGYoIlZlcnNpb246ICVzXG4iLCBEVENfVkVSU0lPTik7CiAJCQlleGl0KDApOworCQljYXNlICdIJzoKKwkJCWlmIChzdHJlcShvcHRhcmcsICJsZWdhY3kiKSkKKwkJCQlwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfTEVHQUNZOworCQkJZWxzZSBpZiAoc3RyZXEob3B0YXJnLCAiZXBhcHIiKSkKKwkJCQlwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfRVBBUFI7CisJCQllbHNlIGlmIChzdHJlcShvcHRhcmcsICJib3RoIikpCisJCQkJcGhhbmRsZV9mb3JtYXQgPSBQSEFORExFX0JPVEg7CisJCQllbHNlCisJCQkJZGllKCJJbnZhbGlkIGFyZ3VtZW50IFwiJXNcIiB0byAtSCBvcHRpb25cbiIsCisJCQkJICAgIG9wdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCXNvcnQgPSAxOworCQkJYnJlYWs7CisKIAkJY2FzZSAnaCc6CiAJCWRlZmF1bHQ6CiAJCQl1c2FnZSgpOwpAQCAtMTgyLDYgKzE4Miw5IEBACiAJaWYgKG1pbnNpemUgJiYgcGFkc2l6ZSkKIAkJZGllKCJDYW4ndCBzZXQgYm90aCAtcCBhbmQgLVNcbiIpOwogCisJaWYgKG1pbnNpemUpCisJCWZwcmludGYoc3RkZXJyLCAiRFRDOiBVc2Ugb2YgXCItU1wiIGlzIGRlcHJlY2F0ZWQ7IGl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uLCB1c2UgXCItcFwiIGluc3RlYWRcbiIpOworCiAJZnByaW50ZihzdGRlcnIsICJEVEM6ICVzLT4lcyAgb24gZmlsZSBcIiVzXCJcbiIsCiAJCWluZm9ybSwgb3V0Zm9ybSwgYXJnKTsKIApAQCAtMjAwLDYgKzIwMyw4IEBACiAJZmlsbF9mdWxscGF0aHMoYmktPmR0LCAiIik7CiAJcHJvY2Vzc19jaGVja3MoZm9yY2UsIGJpKTsKIAorCWlmIChzb3J0KQorCQlzb3J0X3RyZWUoYmkpOwogCiAJaWYgKHN0cmVxKG91dG5hbWUsICItIikpIHsKIAkJb3V0ZiA9IHN0ZG91dDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy5oIGIvc2NyaXB0cy9kdGMvZHRjLmgKaW5kZXggMDhkNTRjOC4uZjM3Yzk3ZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLmgKKysrIGIvc2NyaXB0cy9kdGMvZHRjLmgKQEAgLTM0LDcgKzM0LDE3IEBACiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2luY2x1ZGUgPGZkdC5oPgogCisjaW5jbHVkZSAidXRpbC5oIgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCXByaW50ZihmbXQsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGRlYnVnKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKwogI2RlZmluZSBERUZBVUxUX0ZEVF9WRVJTSU9OCTE3CisKIC8qCiAgKiBDb21tYW5kIGxpbmUgb3B0aW9ucwogICovCkBAIC00MiwzNiArNTIsMTEgQEAKIGV4dGVybiBpbnQgcmVzZXJ2ZW51bTsJCS8qIE51bWJlciBvZiBtZW1vcnkgcmVzZXJ2YXRpb24gc2xvdHMgKi8KIGV4dGVybiBpbnQgbWluc2l6ZTsJCS8qIE1pbmltdW0gYmxvYiBzaXplICovCiBleHRlcm4gaW50IHBhZHNpemU7CQkvKiBBZGRpdGlvbmFsIHBhZGRpbmcgdG8gYmxvYiAqLworZXh0ZXJuIGludCBwaGFuZGxlX2Zvcm1hdDsJLyogVXNlIGxpbnV4LHBoYW5kbGUgb3IgcGhhbmRsZSBwcm9wZXJ0aWVzICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGRpZShjaGFyICogc3RyLCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXZhX3N0YXJ0KGFwLCBzdHIpOwotCWZwcmludGYoc3RkZXJyLCAiRkFUQUwgRVJST1I6ICIpOwotCXZmcHJpbnRmKHN0ZGVyciwgc3RyLCBhcCk7Ci0JZXhpdCgxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICp4bWFsbG9jKHNpemVfdCBsZW4pCi17Ci0Jdm9pZCAqbmV3ID0gbWFsbG9jKGxlbik7Ci0KLQlpZiAoISBuZXcpCi0JCWRpZSgibWFsbG9jKCkgZmFpbGVkXG4iKTsKLQotCXJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IGxlbikKLXsKLQl2b2lkICpuZXcgPSByZWFsbG9jKHAsIGxlbik7Ci0KLQlpZiAoISBuZXcpCi0JCWRpZSgicmVhbGxvYygpIGZhaWxlZCAobGVuPSVkKVxuIiwgbGVuKTsKLQotCXJldHVybiBuZXc7Ci19CisjZGVmaW5lIFBIQU5ETEVfTEVHQUNZCTB4MQorI2RlZmluZSBQSEFORExFX0VQQVBSCTB4MgorI2RlZmluZSBQSEFORExFX0JPVEgJMHgzCiAKIHR5cGVkZWYgdWludDMyX3QgY2VsbF90OwogCkBAIC0xNDAsMTMgKzEyNSwxOCBAQAogI2RlZmluZSBNQVhfTk9ERU5BTUVfTEVOCTMxCiAKIC8qIExpdmUgdHJlZXMgKi8KK3N0cnVjdCBsYWJlbCB7CisJY2hhciAqbGFiZWw7CisJc3RydWN0IGxhYmVsICpuZXh0OworfTsKKwogc3RydWN0IHByb3BlcnR5IHsKIAljaGFyICpuYW1lOwogCXN0cnVjdCBkYXRhIHZhbDsKIAogCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAogc3RydWN0IG5vZGUgewpAQCAtMTYzLDIyICsxNTMsMjggQEAKIAljZWxsX3QgcGhhbmRsZTsKIAlpbnQgYWRkcl9jZWxscywgc2l6ZV9jZWxsczsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAorI2RlZmluZSBmb3JfZWFjaF9sYWJlbChsMCwgbCkgXAorCWZvciAoKGwpID0gKGwwKTsgKGwpOyAobCkgPSAobCktPm5leHQpCisKICNkZWZpbmUgZm9yX2VhY2hfcHJvcGVydHkobiwgcCkgXAogCWZvciAoKHApID0gKG4pLT5wcm9wbGlzdDsgKHApOyAocCkgPSAocCktPm5leHQpCiAKICNkZWZpbmUgZm9yX2VhY2hfY2hpbGQobiwgYykJXAogCWZvciAoKGMpID0gKG4pLT5jaGlsZHJlbjsgKGMpOyAoYykgPSAoYyktPm5leHRfc2libGluZykKIAotc3RydWN0IHByb3BlcnR5ICpidWlsZF9wcm9wZXJ0eShjaGFyICpuYW1lLCBzdHJ1Y3QgZGF0YSB2YWwsIGNoYXIgKmxhYmVsKTsKK3ZvaWQgYWRkX2xhYmVsKHN0cnVjdCBsYWJlbCAqKmxhYmVscywgY2hhciAqbGFiZWwpOworCitzdHJ1Y3QgcHJvcGVydHkgKmJ1aWxkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIHN0cnVjdCBkYXRhIHZhbCk7CiBzdHJ1Y3QgcHJvcGVydHkgKmNoYWluX3Byb3BlcnR5KHN0cnVjdCBwcm9wZXJ0eSAqZmlyc3QsIHN0cnVjdCBwcm9wZXJ0eSAqbGlzdCk7CiBzdHJ1Y3QgcHJvcGVydHkgKnJldmVyc2VfcHJvcGVydGllcyhzdHJ1Y3QgcHJvcGVydHkgKmZpcnN0KTsKIAogc3RydWN0IG5vZGUgKmJ1aWxkX25vZGUoc3RydWN0IHByb3BlcnR5ICpwcm9wbGlzdCwgc3RydWN0IG5vZGUgKmNoaWxkcmVuKTsKLXN0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKmxhYmVsKTsKK3N0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUpOwogc3RydWN0IG5vZGUgKmNoYWluX25vZGUoc3RydWN0IG5vZGUgKmZpcnN0LCBzdHJ1Y3Qgbm9kZSAqbGlzdCk7CitzdHJ1Y3Qgbm9kZSAqbWVyZ2Vfbm9kZXMoc3RydWN0IG5vZGUgKm9sZF9ub2RlLCBzdHJ1Y3Qgbm9kZSAqbmV3X25vZGUpOwogCiB2b2lkIGFkZF9wcm9wZXJ0eShzdHJ1Y3Qgbm9kZSAqbm9kZSwgc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKIHZvaWQgYWRkX2NoaWxkKHN0cnVjdCBub2RlICpwYXJlbnQsIHN0cnVjdCBub2RlICpjaGlsZCk7CkBAIC0xODYsNiArMTgyLDEwIEBACiBjb25zdCBjaGFyICpnZXRfdW5pdG5hbWUoc3RydWN0IG5vZGUgKm5vZGUpOwogc3RydWN0IHByb3BlcnR5ICpnZXRfcHJvcGVydHkoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lKTsKIGNlbGxfdCBwcm9wdmFsX2NlbGwoc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKK3N0cnVjdCBwcm9wZXJ0eSAqZ2V0X3Byb3BlcnR5X2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQkgICAgICAgc3RydWN0IG5vZGUgKipub2RlKTsKK3N0cnVjdCBtYXJrZXIgKmdldF9tYXJrZXJfbGFiZWwoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJCXN0cnVjdCBub2RlICoqbm9kZSwgc3RydWN0IHByb3BlcnR5ICoqcHJvcCk7CiBzdHJ1Y3Qgbm9kZSAqZ2V0X3N1Ym5vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5vZGVuYW1lKTsKIHN0cnVjdCBub2RlICpnZXRfbm9kZV9ieV9wYXRoKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpwYXRoKTsKIHN0cnVjdCBub2RlICpnZXRfbm9kZV9ieV9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwpOwpAQCAtMTkzLDYgKzE5Myw4IEBACiBzdHJ1Y3Qgbm9kZSAqZ2V0X25vZGVfYnlfcmVmKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpyZWYpOwogY2VsbF90IGdldF9ub2RlX3BoYW5kbGUoc3RydWN0IG5vZGUgKnJvb3QsIHN0cnVjdCBub2RlICpub2RlKTsKIAordWludDMyX3QgZ3Vlc3NfYm9vdF9jcHVpZChzdHJ1Y3Qgbm9kZSAqdHJlZSk7CisKIC8qIEJvb3QgaW5mbyAodHJlZSBwbHVzIG1lbXJlc2VydmUgaW5mb3JtYXRpb24gKi8KIAogc3RydWN0IHJlc2VydmVfaW5mbyB7CkBAIC0yMDAsMTAgKzIwMiwxMCBAQAogCiAJc3RydWN0IHJlc2VydmVfaW5mbyAqbmV4dDsKIAotCWNoYXIgKmxhYmVsOworCXN0cnVjdCBsYWJlbCAqbGFiZWxzOwogfTsKIAotc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuLCBjaGFyICpsYWJlbCk7CitzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpidWlsZF9yZXNlcnZlX2VudHJ5KHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBsZW4pOwogc3RydWN0IHJlc2VydmVfaW5mbyAqY2hhaW5fcmVzZXJ2ZV9lbnRyeShzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpmaXJzdCwKIAkJCQkJIHN0cnVjdCByZXNlcnZlX2luZm8gKmxpc3QpOwogc3RydWN0IHJlc2VydmVfaW5mbyAqYWRkX3Jlc2VydmVfZW50cnkoc3RydWN0IHJlc2VydmVfaW5mbyAqbGlzdCwKQEAgLTIxOCw2ICsyMjAsNyBAQAogCiBzdHJ1Y3QgYm9vdF9pbmZvICpidWlsZF9ib290X2luZm8oc3RydWN0IHJlc2VydmVfaW5mbyAqcmVzZXJ2ZWxpc3QsCiAJCQkJICBzdHJ1Y3Qgbm9kZSAqdHJlZSwgdWludDMyX3QgYm9vdF9jcHVpZF9waHlzKTsKK3ZvaWQgc29ydF90cmVlKHN0cnVjdCBib290X2luZm8gKmJpKTsKIAogLyogQ2hlY2tzICovCiAKQEAgLTIzOSw4ICsyNDIsNCBAQAogCiBzdHJ1Y3QgYm9vdF9pbmZvICpkdF9mcm9tX2ZzKGNvbnN0IGNoYXIgKmRpcm5hbWUpOwogCi0vKiBtaXNjICovCi0KLWNoYXIgKmpvaW5fcGF0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpuYW1lKTsKLQogI2VuZGlmIC8qIF9EVENfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZmxhdHRyZWUuYyBiL3NjcmlwdHMvZHRjL2ZsYXR0cmVlLmMKaW5kZXggNzZhY2QyOC4uZWFkMDMzMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZmxhdHRyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9mbGF0dHJlZS5jCkBAIC01Miw5ICs1Miw5IEBACiAJdm9pZCAoKnN0cmluZykodm9pZCAqLCBjaGFyICosIGludCk7CiAJdm9pZCAoKmFsaWduKSh2b2lkICosIGludCk7CiAJdm9pZCAoKmRhdGEpKHZvaWQgKiwgc3RydWN0IGRhdGEpOwotCXZvaWQgKCpiZWdpbm5vZGUpKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLQl2b2lkICgqZW5kbm9kZSkodm9pZCAqLCBjb25zdCBjaGFyICopOwotCXZvaWQgKCpwcm9wZXJ0eSkodm9pZCAqLCBjb25zdCBjaGFyICopOworCXZvaWQgKCpiZWdpbm5vZGUpKHZvaWQgKiwgc3RydWN0IGxhYmVsICpsYWJlbHMpOworCXZvaWQgKCplbmRub2RlKSh2b2lkICosIHN0cnVjdCBsYWJlbCAqbGFiZWxzKTsKKwl2b2lkICgqcHJvcGVydHkpKHZvaWQgKiwgc3RydWN0IGxhYmVsICpsYWJlbHMpOwogfTsKIAogc3RhdGljIHZvaWQgYmluX2VtaXRfY2VsbCh2b2lkICplLCBjZWxsX3QgdmFsKQpAQCAtODksMTcgKzg5LDE3IEBACiAJKmR0YnVmID0gZGF0YV9hcHBlbmRfZGF0YSgqZHRidWYsIGQudmFsLCBkLmxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGJpbl9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAliaW5fZW1pdF9jZWxsKGUsIEZEVF9CRUdJTl9OT0RFKTsKIH0KIAotc3RhdGljIHZvaWQgYmluX2VtaXRfZW5kbm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X2VuZG5vZGUodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJYmluX2VtaXRfY2VsbChlLCBGRFRfRU5EX05PREUpOwogfQogCi1zdGF0aWMgdm9pZCBiaW5fZW1pdF9wcm9wZXJ0eSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGJpbl9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCWJpbl9lbWl0X2NlbGwoZSwgRkRUX1BST1ApOwogfQpAQCAtMTI3LDExICsxMjcsMjEgQEAKIAlmcHJpbnRmKGYsICIlc1x0PSAuICsgJWRcbiIsIGxhYmVsLCBvZmZzZXQpOwogfQogCisjZGVmaW5lIEFTTV9FTUlUX0JFTE9ORyhmLCBmbXQsIC4uLikgXAorCXsgXAorCQlmcHJpbnRmKChmKSwgIlx0LmJ5dGVcdCgoIiBmbXQgIikgPj4gMjQpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJCWZwcmludGYoKGYpLCAiXHQuYnl0ZVx0KCgiIGZtdCAiKSA+PiAxNikgJiAweGZmXG4iLCBfX1ZBX0FSR1NfXyk7IFwKKwkJZnByaW50ZigoZiksICJcdC5ieXRlXHQoKCIgZm10ICIpID4+IDgpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJCWZwcmludGYoKGYpLCAiXHQuYnl0ZVx0KCIgZm10ICIpICYgMHhmZlxuIiwgX19WQV9BUkdTX18pOyBcCisJfQorCiBzdGF0aWMgdm9pZCBhc21fZW1pdF9jZWxsKHZvaWQgKmUsIGNlbGxfdCB2YWwpCiB7CiAJRklMRSAqZiA9IGU7CiAKLQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCV4XG4iLCB2YWwpOworCWZwcmludGYoZiwgIlx0LmJ5dGUgMHglMDJ4OyAuYnl0ZSAweCUwMng7IC5ieXRlIDB4JTAyeDsgLmJ5dGUgMHglMDJ4XG4iLAorCQkodmFsID4+IDI0KSAmIDB4ZmYsICh2YWwgPj4gMTYpICYgMHhmZiwKKwkJKHZhbCA+PiA4KSAmIDB4ZmYsIHZhbCAmIDB4ZmYpOwogfQogCiBzdGF0aWMgdm9pZCBhc21fZW1pdF9zdHJpbmcodm9pZCAqZSwgY2hhciAqc3RyLCBpbnQgbGVuKQpAQCAtMTU2LDcgKzE2Niw3IEBACiB7CiAJRklMRSAqZiA9IGU7CiAKLQlmcHJpbnRmKGYsICJcdC5iYWxpZ25cdCVkXG4iLCBhKTsKKwlmcHJpbnRmKGYsICJcdC5iYWxpZ25cdCVkLCAwXG4iLCBhKTsKIH0KIAogc3RhdGljIHZvaWQgYXNtX2VtaXRfZGF0YSh2b2lkICplLCBzdHJ1Y3QgZGF0YSBkKQpAQCAtMTY5LDggKzE3OSw3IEBACiAJCWVtaXRfb2Zmc2V0X2xhYmVsKGYsIG0tPnJlZiwgbS0+b2Zmc2V0KTsKIAogCXdoaWxlICgoZC5sZW4gLSBvZmYpID49IHNpemVvZih1aW50MzJfdCkpIHsKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHgleFxuIiwKLQkJCWZkdDMyX3RvX2NwdSgqKCh1aW50MzJfdCAqKShkLnZhbCtvZmYpKSkpOworCQlhc21fZW1pdF9jZWxsKGUsIGZkdDMyX3RvX2NwdSgqKCh1aW50MzJfdCAqKShkLnZhbCtvZmYpKSkpOwogCQlvZmYgKz0gc2l6ZW9mKHVpbnQzMl90KTsKIAl9CiAKQEAgLTE4MiwzNyArMTkxLDQzIEBACiAJYXNzZXJ0KG9mZiA9PSBkLmxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIGFzbV9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X2JlZ2lubm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAlGSUxFICpmID0gZTsKKwlzdHJ1Y3QgbGFiZWwgKmw7CiAKLQlpZiAobGFiZWwpIHsKLQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzXG4iLCBsYWJlbCk7Ci0JCWZwcmludGYoZiwgIiVzOlxuIiwgbGFiZWwpOworCWZvcl9lYWNoX2xhYmVsKGxhYmVscywgbCkgeworCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNcbiIsIGwtPmxhYmVsKTsKKwkJZnByaW50ZihmLCAiJXM6XG4iLCBsLT5sYWJlbCk7CiAJfQotCWZwcmludGYoZiwgIlx0LmxvbmdcdEZEVF9CRUdJTl9OT0RFXG4iKTsKKwlmcHJpbnRmKGYsICJcdC8qIEZEVF9CRUdJTl9OT0RFICovXG4iKTsKKwlhc21fZW1pdF9jZWxsKGUsIEZEVF9CRUdJTl9OT0RFKTsKIH0KIAotc3RhdGljIHZvaWQgYXNtX2VtaXRfZW5kbm9kZSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X2VuZG5vZGUodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJRklMRSAqZiA9IGU7CisJc3RydWN0IGxhYmVsICpsOwogCi0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX0VORF9OT0RFXG4iKTsKLQlpZiAobGFiZWwpIHsKLQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzX2VuZFxuIiwgbGFiZWwpOwotCQlmcHJpbnRmKGYsICIlc19lbmQ6XG4iLCBsYWJlbCk7CisJZnByaW50ZihmLCAiXHQvKiBGRFRfRU5EX05PREUgKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZSwgRkRUX0VORF9OT0RFKTsKKwlmb3JfZWFjaF9sYWJlbChsYWJlbHMsIGwpIHsKKwkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzX2VuZFxuIiwgbC0+bGFiZWwpOworCQlmcHJpbnRmKGYsICIlc19lbmQ6XG4iLCBsLT5sYWJlbCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBhc21fZW1pdF9wcm9wZXJ0eSh2b2lkICplLCBjb25zdCBjaGFyICpsYWJlbCkKK3N0YXRpYyB2b2lkIGFzbV9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCUZJTEUgKmYgPSBlOworCXN0cnVjdCBsYWJlbCAqbDsKIAotCWlmIChsYWJlbCkgewotCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNcbiIsIGxhYmVsKTsKLQkJZnByaW50ZihmLCAiJXM6XG4iLCBsYWJlbCk7CisJZm9yX2VhY2hfbGFiZWwobGFiZWxzLCBsKSB7CisJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbC0+bGFiZWwpOworCQlmcHJpbnRmKGYsICIlczpcbiIsIGwtPmxhYmVsKTsKIAl9Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX1BST1BcbiIpOworCWZwcmludGYoZiwgIlx0LyogRkRUX1BST1AgKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZSwgRkRUX1BST1ApOwogfQogCiBzdGF0aWMgc3RydWN0IGVtaXR0ZXIgYXNtX2VtaXR0ZXIgPSB7CkBAIC0yNDgsNyArMjYzLDcgQEAKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQ7CiAJaW50IHNlZW5fbmFtZV9wcm9wID0gMDsKIAotCWVtaXQtPmJlZ2lubm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbCk7CisJZW1pdC0+YmVnaW5ub2RlKGV0YXJnZXQsIHRyZWUtPmxhYmVscyk7CiAKIAlpZiAodmktPmZsYWdzICYgRlRGX0ZVTExQQVRIKQogCQllbWl0LT5zdHJpbmcoZXRhcmdldCwgdHJlZS0+ZnVsbHBhdGgsIDApOwpAQCAtMjY1LDcgKzI4MCw3IEBACiAKIAkJbmFtZW9mZiA9IHN0cmluZ3RhYmxlX2luc2VydChzdHJidWYsIHByb3AtPm5hbWUpOwogCi0JCWVtaXQtPnByb3BlcnR5KGV0YXJnZXQsIHByb3AtPmxhYmVsKTsKKwkJZW1pdC0+cHJvcGVydHkoZXRhcmdldCwgcHJvcC0+bGFiZWxzKTsKIAkJZW1pdC0+Y2VsbChldGFyZ2V0LCBwcm9wLT52YWwubGVuKTsKIAkJZW1pdC0+Y2VsbChldGFyZ2V0LCBuYW1lb2ZmKTsKIApAQCAtMjkyLDcgKzMwNyw3IEBACiAJCWZsYXR0ZW5fdHJlZShjaGlsZCwgZW1pdCwgZXRhcmdldCwgc3RyYnVmLCB2aSk7CiAJfQogCi0JZW1pdC0+ZW5kbm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbCk7CisJZW1pdC0+ZW5kbm9kZShldGFyZ2V0LCB0cmVlLT5sYWJlbHMpOwogfQogCiBzdGF0aWMgc3RydWN0IGRhdGEgZmxhdHRlbl9yZXNlcnZlX2xpc3Qoc3RydWN0IHJlc2VydmVfaW5mbyAqcmVzZXJ2ZWxpc3QsCkBAIC00MTMsMTAgKzQyOCwxMyBAQAogCWlmIChwYWRsZW4gPiAwKQogCQlibG9iID0gZGF0YV9hcHBlbmRfemVyb2VzKGJsb2IsIHBhZGxlbik7CiAKLQlmd3JpdGUoYmxvYi52YWwsIGJsb2IubGVuLCAxLCBmKTsKLQotCWlmIChmZXJyb3IoZikpCi0JCWRpZSgiRXJyb3Igd3JpdGluZyBkZXZpY2UgdHJlZSBibG9iOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZndyaXRlKGJsb2IudmFsLCBibG9iLmxlbiwgMSwgZikgIT0gMSkgeworCQlpZiAoZmVycm9yKGYpKQorCQkJZGllKCJFcnJvciB3cml0aW5nIGRldmljZSB0cmVlIGJsb2I6ICVzXG4iLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWVsc2UKKwkJCWRpZSgiU2hvcnQgd3JpdGUgb24gZGV2aWNlIHRyZWUgYmxvYlxuIik7CisJfQogCiAJLyoKIAkgKiBkYXRhX21lcmdlKCkgZnJlZXMgdGhlIHJpZ2h0LWhhbmQgZWxlbWVudCBzbyBvbmx5IHRoZSBibG9iCkBAIC00NTUsMzkgKzQ3Myw0NCBAQAogCQlkaWUoIlVua25vd24gZGV2aWNlIHRyZWUgYmxvYiB2ZXJzaW9uICVkXG4iLCB2ZXJzaW9uKTsKIAogCWZwcmludGYoZiwgIi8qIGF1dG9nZW5lcmF0ZWQgYnkgZHRjLCBkbyBub3QgZWRpdCAqL1xuXG4iKTsKLQlmcHJpbnRmKGYsICIjZGVmaW5lIEZEVF9NQUdJQyAweCV4XG4iLCBGRFRfTUFHSUMpOwotCWZwcmludGYoZiwgIiNkZWZpbmUgRkRUX0JFR0lOX05PREUgMHgleFxuIiwgRkRUX0JFR0lOX05PREUpOwotCWZwcmludGYoZiwgIiNkZWZpbmUgRkRUX0VORF9OT0RFIDB4JXhcbiIsIEZEVF9FTkRfTk9ERSk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfUFJPUCAweCV4XG4iLCBGRFRfUFJPUCk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfRU5EIDB4JXhcbiIsIEZEVF9FTkQpOwotCWZwcmludGYoZiwgIlxuIik7CiAKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgImJsb2Jfc3RhcnQiKTsKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgImhlYWRlciIpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdEZEVF9NQUdJQ1x0XHRcdFx0LyogbWFnaWMgKi9cbiIpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdF8lc19ibG9iX2Fic19lbmQgLSBfJXNfYmxvYl9zdGFydFx0LyogdG90YWxzaXplICovXG4iLAotCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cnVjdF9zdGFydCAtIF8lc19ibG9iX3N0YXJ0XHQvKiBvZmZfZHRfc3RydWN0ICovXG4iLAotCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cmluZ3Nfc3RhcnQgLSBfJXNfYmxvYl9zdGFydFx0Lyogb2ZmX2R0X3N0cmluZ3MgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfcmVzZXJ2ZV9tYXAgLSBfJXNfYmxvYl9zdGFydFx0Lyogb2ZmX2R0X3N0cmluZ3MgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHQlZFx0XHRcdFx0XHQvKiB2ZXJzaW9uICovXG4iLCB2aS0+dmVyc2lvbik7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0JWRcdFx0XHRcdFx0LyogbGFzdF9jb21wX3ZlcnNpb24gKi9cbiIsCi0JCXZpLT5sYXN0X2NvbXBfdmVyc2lvbik7Ci0KLQlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0JWlcdFx0XHRcdFx0LyogYm9vdF9jcHVpZF9waHlzICovXG4iLAotCQkJYmktPmJvb3RfY3B1aWRfcGh5cyk7Ci0KLQlpZiAodmktPmZsYWdzICYgRlRGX1NUUlRBQlNJWkUpCi0JCWZwcmludGYoZiwgIlx0LmxvbmdcdF8lc19zdHJpbmdzX2VuZCAtIF8lc19zdHJpbmdzX3N0YXJ0XHQvKiBzaXplX2R0X3N0cmluZ3MgKi9cbiIsCisJZnByaW50ZihmLCAiXHQvKiBtYWdpYyAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCBGRFRfTUFHSUMpOworCWZwcmludGYoZiwgIlx0LyogdG90YWxzaXplICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19ibG9iX2Fic19lbmQgLSBfJXNfYmxvYl9zdGFydCIsCiAJCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJZnByaW50ZihmLCAiXHQvKiBvZmZfZHRfc3RydWN0ICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJ1Y3Rfc3RhcnQgLSBfJXNfYmxvYl9zdGFydCIsCisJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIG9mZl9kdF9zdHJpbmdzICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJpbmdzX3N0YXJ0IC0gXyVzX2Jsb2Jfc3RhcnQiLAorCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJZnByaW50ZihmLCAiXHQvKiBvZmZfbWVtX3Jzdm1hcCAqL1xuIik7CisJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfcmVzZXJ2ZV9tYXAgLSBfJXNfYmxvYl9zdGFydCIsCisJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIHZlcnNpb24gKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZiwgdmktPnZlcnNpb24pOworCWZwcmludGYoZiwgIlx0LyogbGFzdF9jb21wX3ZlcnNpb24gKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZiwgdmktPmxhc3RfY29tcF92ZXJzaW9uKTsKIAotCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVUNUU0laRSkKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cnVjdF9lbmQgLSBfJXNfc3RydWN0X3N0YXJ0XHQvKiBzaXplX2R0X3N0cnVjdCAqL1xuIiwKKwlpZiAodmktPmZsYWdzICYgRlRGX0JPT1RDUFVJRCkgeworCQlmcHJpbnRmKGYsICJcdC8qIGJvb3RfY3B1aWRfcGh5cyAqL1xuIik7CisJCWFzbV9lbWl0X2NlbGwoZiwgYmktPmJvb3RfY3B1aWRfcGh5cyk7CisJfQorCisJaWYgKHZpLT5mbGFncyAmIEZURl9TVFJUQUJTSVpFKSB7CisJCWZwcmludGYoZiwgIlx0Lyogc2l6ZV9kdF9zdHJpbmdzICovXG4iKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfc3RyaW5nc19lbmQgLSBfJXNfc3RyaW5nc19zdGFydCIsCisJCQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCX0KKworCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVUNUU0laRSkgeworCQlmcHJpbnRmKGYsICJcdC8qIHNpemVfZHRfc3RydWN0ICovXG4iKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICJfJXNfc3RydWN0X2VuZCAtIF8lc19zdHJ1Y3Rfc3RhcnQiLAogCQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCX0KIAogCS8qCiAJICogUmVzZXJ2ZSBtYXAgZW50cmllcy4KQEAgLTUwNSwxNiArNTI4LDE3IEBACiAJICogYXMgaXQgYXBwZWFycyAucXVhZCBpc24ndCBhdmFpbGFibGUgaW4gc29tZSBhc3NlbWJsZXJzLgogCSAqLwogCWZvciAocmUgPSBiaS0+cmVzZXJ2ZWxpc3Q7IHJlOyByZSA9IHJlLT5uZXh0KSB7Ci0JCWlmIChyZS0+bGFiZWwpIHsKLQkJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgcmUtPmxhYmVsKTsKLQkJCWZwcmludGYoZiwgIiVzOlxuIiwgcmUtPmxhYmVsKTsKKwkJc3RydWN0IGxhYmVsICpsOworCisJCWZvcl9lYWNoX2xhYmVsKHJlLT5sYWJlbHMsIGwpIHsKKwkJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbC0+bGFiZWwpOworCQkJZnByaW50ZihmLCAiJXM6XG4iLCBsLT5sYWJlbCk7CiAJCX0KLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHglMDh4LCAweCUwOHhcbiIsCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyA+PiAzMiksCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyAmIDB4ZmZmZmZmZmYpKTsKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0MHglMDh4LCAweCUwOHhcbiIsCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSA+PiAzMiksCi0JCQkodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSAmIDB4ZmZmZmZmZmYpKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICIweCUwOHgiLCAodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyA+PiAzMikpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIjB4JTA4eCIsCisJCQkJKHVuc2lnbmVkIGludCkocmUtPnJlLmFkZHJlc3MgJiAweGZmZmZmZmZmKSk7CisJCUFTTV9FTUlUX0JFTE9ORyhmLCAiMHglMDh4IiwgKHVuc2lnbmVkIGludCkocmUtPnJlLnNpemUgPj4gMzIpKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICIweCUwOHgiLCAodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSAmIDB4ZmZmZmZmZmYpKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IHJlc2VydmVudW07IGkrKykgewogCQlmcHJpbnRmKGYsICJcdC5sb25nXHQwLCAwXG5cdC5sb25nXHQwLCAwXG4iKTsKQEAgLTUyNCw3ICs1NDgsOSBAQAogCiAJZW1pdF9sYWJlbChmLCBzeW1wcmVmaXgsICJzdHJ1Y3Rfc3RhcnQiKTsKIAlmbGF0dGVuX3RyZWUoYmktPmR0LCAmYXNtX2VtaXR0ZXIsIGYsICZzdHJidWYsIHZpKTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRGRFRfRU5EXG4iKTsKKworCWZwcmludGYoZiwgIlx0LyogRkRUX0VORCAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCBGRFRfRU5EKTsKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgInN0cnVjdF9lbmQiKTsKIAogCWVtaXRfbGFiZWwoZiwgc3ltcHJlZml4LCAic3RyaW5nc19zdGFydCIpOwpAQCAtNjAxLDcgKzYyNyw3IEBACiAJCWxlbisrOwogCX0gd2hpbGUgKCgqcCsrKSAhPSAnXDAnKTsKIAotCXN0ciA9IHN0cmR1cChpbmItPnB0cik7CisJc3RyID0geHN0cmR1cChpbmItPnB0cik7CiAKIAlpbmItPnB0ciArPSBsZW47CiAKQEAgLTY0Myw3ICs2NjksNyBAQAogCQlwKys7CiAJfQogCi0JcmV0dXJuIHN0cmR1cChpbmItPmJhc2UgKyBvZmZzZXQpOworCXJldHVybiB4c3RyZHVwKGluYi0+YmFzZSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKmZsYXRfcmVhZF9wcm9wZXJ0eShzdHJ1Y3QgaW5idWYgKmR0YnVmLApAQCAtNjYzLDcgKzY4OSw3IEBACiAKIAl2YWwgPSBmbGF0X3JlYWRfZGF0YShkdGJ1ZiwgcHJvcGxlbik7CiAKLQlyZXR1cm4gYnVpbGRfcHJvcGVydHkobmFtZSwgdmFsLCBOVUxMKTsKKwlyZXR1cm4gYnVpbGRfcHJvcGVydHkobmFtZSwgdmFsKTsKIH0KIAogCkBAIC02ODgsNyArNzE0LDcgQEAKIAkJaWYgKHJlLnNpemUgPT0gMCkKIAkJCWJyZWFrOwogCi0JCW5ldyA9IGJ1aWxkX3Jlc2VydmVfZW50cnkocmUuYWRkcmVzcywgcmUuc2l6ZSwgTlVMTCk7CisJCW5ldyA9IGJ1aWxkX3Jlc2VydmVfZW50cnkocmUuYWRkcmVzcywgcmUuc2l6ZSk7CiAJCXJlc2VydmVsaXN0ID0gYWRkX3Jlc2VydmVfZW50cnkocmVzZXJ2ZWxpc3QsIG5ldyk7CiAJfQogCkBAIC03MTAsNyArNzM2LDcgQEAKIAlpZiAoIXN0cmVxKHBwYXRoLCAiLyIpKQogCQlwbGVuKys7CiAKLQlyZXR1cm4gc3RyZHVwKGNwYXRoICsgcGxlbik7CisJcmV0dXJuIHhzdHJkdXAoY3BhdGggKyBwbGVuKTsKIH0KIAogc3RhdGljIHN0cnVjdCBub2RlICp1bmZsYXR0ZW5fdHJlZShzdHJ1Y3QgaW5idWYgKmR0YnVmLApAQCAtNzc2LDcgKzgwMiw3IEBACiAKIHN0cnVjdCBib290X2luZm8gKmR0X2Zyb21fYmxvYihjb25zdCBjaGFyICpmbmFtZSkKIHsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKmR0Y2Y7CisJRklMRSAqZjsKIAl1aW50MzJfdCBtYWdpYywgdG90YWxzaXplLCB2ZXJzaW9uLCBzaXplX2R0LCBib290X2NwdWlkX3BoeXM7CiAJdWludDMyX3Qgb2ZmX2R0LCBvZmZfc3RyLCBvZmZfbWVtX3Jzdm1hcDsKIAlpbnQgcmM7CkBAIC03OTEsMTQgKzgxNywxNCBAQAogCXVpbnQzMl90IHZhbDsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JZHRjZiA9IGR0Y19vcGVuX2ZpbGUoZm5hbWUsIE5VTEwpOworCWYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oZm5hbWUsIE5VTEwpOwogCi0JcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGR0Y2YtPmZpbGUpOwotCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCisJcmMgPSBmcmVhZCgmbWFnaWMsIHNpemVvZihtYWdpYyksIDEsIGYpOworCWlmIChmZXJyb3IoZikpCiAJCWRpZSgiRXJyb3IgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlcjogJXNcbiIsCiAJCSAgICBzdHJlcnJvcihlcnJubykpOwogCWlmIChyYyA8IDEpIHsKLQkJaWYgKGZlb2YoZHRjZi0+ZmlsZSkpCisJCWlmIChmZW9mKGYpKQogCQkJZGllKCJFT0YgcmVhZGluZyBEVCBibG9iIG1hZ2ljIG51bWJlclxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgbWFnaWMgbnVtYmVyXG4iKTsKQEAgLTgwOCwxMSArODM0LDExIEBACiAJaWYgKG1hZ2ljICE9IEZEVF9NQUdJQykKIAkJZGllKCJCbG9iIGhhcyBpbmNvcnJlY3QgbWFnaWMgbnVtYmVyXG4iKTsKIAotCXJjID0gZnJlYWQoJnRvdGFsc2l6ZSwgc2l6ZW9mKHRvdGFsc2l6ZSksIDEsIGR0Y2YtPmZpbGUpOwotCWlmIChmZXJyb3IoZHRjZi0+ZmlsZSkpCisJcmMgPSBmcmVhZCgmdG90YWxzaXplLCBzaXplb2YodG90YWxzaXplKSwgMSwgZik7CisJaWYgKGZlcnJvcihmKSkKIAkJZGllKCJFcnJvciByZWFkaW5nIERUIGJsb2Igc2l6ZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAJaWYgKHJjIDwgMSkgewotCQlpZiAoZmVvZihkdGNmLT5maWxlKSkKKwkJaWYgKGZlb2YoZikpCiAJCQlkaWUoIkVPRiByZWFkaW5nIERUIGJsb2Igc2l6ZVxuIik7CiAJCWVsc2UKIAkJCWRpZSgiTXlzdGVyaW91cyBzaG9ydCByZWFkIHJlYWRpbmcgYmxvYiBzaXplXG4iKTsKQEAgLTgzMiwxMiArODU4LDEyIEBACiAJcCA9IGJsb2IgKyBzaXplb2YobWFnaWMpICArIHNpemVvZih0b3RhbHNpemUpOwogCiAJd2hpbGUgKHNpemVsZWZ0KSB7Ci0JCWlmIChmZW9mKGR0Y2YtPmZpbGUpKQorCQlpZiAoZmVvZihmKSkKIAkJCWRpZSgiRU9GIGJlZm9yZSByZWFkaW5nICVkIGJ5dGVzIG9mIERUIGJsb2JcbiIsCiAJCQkgICAgdG90YWxzaXplKTsKIAotCQlyYyA9IGZyZWFkKHAsIDEsIHNpemVsZWZ0LCBkdGNmLT5maWxlKTsKLQkJaWYgKGZlcnJvcihkdGNmLT5maWxlKSkKKwkJcmMgPSBmcmVhZChwLCAxLCBzaXplbGVmdCwgZik7CisJCWlmIChmZXJyb3IoZikpCiAJCQlkaWUoIkVycm9yIHJlYWRpbmcgRFQgYmxvYjogJXNcbiIsCiAJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIApAQCAtOTAwLDcgKzkyNiw3IEBACiAKIAlmcmVlKGJsb2IpOwogCi0JZHRjX2Nsb3NlX2ZpbGUoZHRjZik7CisJZmNsb3NlKGYpOwogCiAJcmV0dXJuIGJ1aWxkX2Jvb3RfaW5mbyhyZXNlcnZlbGlzdCwgdHJlZSwgYm9vdF9jcHVpZF9waHlzKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2ZzdHJlZS5jIGIvc2NyaXB0cy9kdGMvZnN0cmVlLmMKaW5kZXggOGZlMWJkZi4uZjM3NzQ1MyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZnN0cmVlLmMKKysrIGIvc2NyaXB0cy9kdGMvZnN0cmVlLmMKQEAgLTU4LDEwICs1OCw5IEBACiAJCQkJCSJXQVJOSU5HOiBDYW5ub3Qgb3BlbiAlczogJXNcbiIsCiAJCQkJCXRtcG5hbSwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJvcCA9IGJ1aWxkX3Byb3BlcnR5KHN0cmR1cChkZS0+ZF9uYW1lKSwKKwkJCQlwcm9wID0gYnVpbGRfcHJvcGVydHkoeHN0cmR1cChkZS0+ZF9uYW1lKSwKIAkJCQkJCSAgICAgIGRhdGFfY29weV9maWxlKHBmaWxlLAotCQkJCQkJCQkgICAgIHN0LnN0X3NpemUpLAotCQkJCQkJICAgICAgTlVMTCk7CisJCQkJCQkJCSAgICAgc3Quc3Rfc2l6ZSkpOwogCQkJCWFkZF9wcm9wZXJ0eSh0cmVlLCBwcm9wKTsKIAkJCQlmY2xvc2UocGZpbGUpOwogCQkJfQpAQCAtNjksOCArNjgsNyBAQAogCQkJc3RydWN0IG5vZGUgKm5ld2NoaWxkOwogCiAJCQluZXdjaGlsZCA9IHJlYWRfZnN0cmVlKHRtcG5hbSk7Ci0JCQluZXdjaGlsZCA9IG5hbWVfbm9kZShuZXdjaGlsZCwgc3RyZHVwKGRlLT5kX25hbWUpLAotCQkJCQkgICAgIE5VTEwpOworCQkJbmV3Y2hpbGQgPSBuYW1lX25vZGUobmV3Y2hpbGQsIHhzdHJkdXAoZGUtPmRfbmFtZSkpOwogCQkJYWRkX2NoaWxkKHRyZWUsIG5ld2NoaWxkKTsKIAkJfQogCkBAIC04Niw4ICs4NCw4IEBACiAJc3RydWN0IG5vZGUgKnRyZWU7CiAKIAl0cmVlID0gcmVhZF9mc3RyZWUoZGlybmFtZSk7Ci0JdHJlZSA9IG5hbWVfbm9kZSh0cmVlLCAiIiwgTlVMTCk7CisJdHJlZSA9IG5hbWVfbm9kZSh0cmVlLCAiIik7CiAKLQlyZXR1cm4gYnVpbGRfYm9vdF9pbmZvKE5VTEwsIHRyZWUsIDApOworCXJldHVybiBidWlsZF9ib290X2luZm8oTlVMTCwgdHJlZSwgZ3Vlc3NfYm9vdF9jcHVpZCh0cmVlKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2xpdmV0cmVlLmMgYi9zY3JpcHRzL2R0Yy9saXZldHJlZS5jCmluZGV4IDBjYTNkZTUuLmM5MjA5ZDUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2xpdmV0cmVlLmMKKysrIGIvc2NyaXB0cy9kdGMvbGl2ZXRyZWUuYwpAQCAtMjQsMTcgKzI0LDMwIEBACiAgKiBUcmVlIGJ1aWxkaW5nIGZ1bmN0aW9ucwogICovCiAKLXN0cnVjdCBwcm9wZXJ0eSAqYnVpbGRfcHJvcGVydHkoY2hhciAqbmFtZSwgc3RydWN0IGRhdGEgdmFsLCBjaGFyICpsYWJlbCkKK3ZvaWQgYWRkX2xhYmVsKHN0cnVjdCBsYWJlbCAqKmxhYmVscywgY2hhciAqbGFiZWwpCit7CisJc3RydWN0IGxhYmVsICpuZXc7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGxhYmVsIGlzbid0IGFscmVhZHkgdGhlcmUgKi8KKwlmb3JfZWFjaF9sYWJlbCgqbGFiZWxzLCBuZXcpCisJCWlmIChzdHJlcShuZXctPmxhYmVsLCBsYWJlbCkpCisJCQlyZXR1cm47CisKKwluZXcgPSB4bWFsbG9jKHNpemVvZigqbmV3KSk7CisJbmV3LT5sYWJlbCA9IGxhYmVsOworCW5ldy0+bmV4dCA9ICpsYWJlbHM7CisJKmxhYmVscyA9IG5ldzsKK30KKworc3RydWN0IHByb3BlcnR5ICpidWlsZF9wcm9wZXJ0eShjaGFyICpuYW1lLCBzdHJ1Y3QgZGF0YSB2YWwpCiB7CiAJc3RydWN0IHByb3BlcnR5ICpuZXcgPSB4bWFsbG9jKHNpemVvZigqbmV3KSk7CiAKKwltZW1zZXQobmV3LCAwLCBzaXplb2YoKm5ldykpOworCiAJbmV3LT5uYW1lID0gbmFtZTsKIAluZXctPnZhbCA9IHZhbDsKIAotCW5ldy0+bmV4dCA9IE5VTEw7Ci0KLQluZXctPmxhYmVsID0gbGFiZWw7Ci0KIAlyZXR1cm4gbmV3OwogfQogCkBAIC03OCwxNyArOTEsODIgQEAKIAlyZXR1cm4gbmV3OwogfQogCi1zdHJ1Y3Qgbm9kZSAqbmFtZV9ub2RlKHN0cnVjdCBub2RlICpub2RlLCBjaGFyICpuYW1lLCBjaGFyICogbGFiZWwpCitzdHJ1Y3Qgbm9kZSAqbmFtZV9ub2RlKHN0cnVjdCBub2RlICpub2RlLCBjaGFyICpuYW1lKQogewogCWFzc2VydChub2RlLT5uYW1lID09IE5VTEwpOwogCiAJbm9kZS0+bmFtZSA9IG5hbWU7CiAKLQlub2RlLT5sYWJlbCA9IGxhYmVsOwotCiAJcmV0dXJuIG5vZGU7CiB9CiAKK3N0cnVjdCBub2RlICptZXJnZV9ub2RlcyhzdHJ1Y3Qgbm9kZSAqb2xkX25vZGUsIHN0cnVjdCBub2RlICpuZXdfbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKm5ld19wcm9wLCAqb2xkX3Byb3A7CisJc3RydWN0IG5vZGUgKm5ld19jaGlsZCwgKm9sZF9jaGlsZDsKKwlzdHJ1Y3QgbGFiZWwgKmw7CisKKwkvKiBBZGQgbmV3IG5vZGUgbGFiZWxzIHRvIG9sZCBub2RlICovCisJZm9yX2VhY2hfbGFiZWwobmV3X25vZGUtPmxhYmVscywgbCkKKwkJYWRkX2xhYmVsKCZvbGRfbm9kZS0+bGFiZWxzLCBsLT5sYWJlbCk7CisKKwkvKiBNb3ZlIHByb3BlcnRpZXMgZnJvbSB0aGUgbmV3IG5vZGUgdG8gdGhlIG9sZCBub2RlLiAgSWYgdGhlcmUKKwkgKiBpcyBhIGNvbGxpc2lvbiwgcmVwbGFjZSB0aGUgb2xkIHZhbHVlIHdpdGggdGhlIG5ldyAqLworCXdoaWxlIChuZXdfbm9kZS0+cHJvcGxpc3QpIHsKKwkJLyogUG9wIHRoZSBwcm9wZXJ0eSBvZmYgdGhlIGxpc3QgKi8KKwkJbmV3X3Byb3AgPSBuZXdfbm9kZS0+cHJvcGxpc3Q7CisJCW5ld19ub2RlLT5wcm9wbGlzdCA9IG5ld19wcm9wLT5uZXh0OworCQluZXdfcHJvcC0+bmV4dCA9IE5VTEw7CisKKwkJLyogTG9vayBmb3IgYSBjb2xsaXNpb24sIHNldCBuZXcgdmFsdWUgaWYgdGhlcmUgaXMgKi8KKwkJZm9yX2VhY2hfcHJvcGVydHkob2xkX25vZGUsIG9sZF9wcm9wKSB7CisJCQlpZiAoc3RyZXEob2xkX3Byb3AtPm5hbWUsIG5ld19wcm9wLT5uYW1lKSkgeworCQkJCS8qIEFkZCBuZXcgbGFiZWxzIHRvIG9sZCBwcm9wZXJ0eSAqLworCQkJCWZvcl9lYWNoX2xhYmVsKG5ld19wcm9wLT5sYWJlbHMsIGwpCisJCQkJCWFkZF9sYWJlbCgmb2xkX3Byb3AtPmxhYmVscywgbC0+bGFiZWwpOworCisJCQkJb2xkX3Byb3AtPnZhbCA9IG5ld19wcm9wLT52YWw7CisJCQkJZnJlZShuZXdfcHJvcCk7CisJCQkJbmV3X3Byb3AgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogaWYgbm8gY29sbGlzaW9uIG9jY3VycmVkLCBhZGQgcHJvcGVydHkgdG8gdGhlIG9sZCBub2RlLiAqLworCQlpZiAobmV3X3Byb3ApCisJCQlhZGRfcHJvcGVydHkob2xkX25vZGUsIG5ld19wcm9wKTsKKwl9CisKKwkvKiBNb3ZlIHRoZSBvdmVycmlkZSBjaGlsZCBub2RlcyBpbnRvIHRoZSBwcmltYXJ5IG5vZGUuICBJZgorCSAqIHRoZXJlIGlzIGEgY29sbGlzaW9uLCB0aGVuIG1lcmdlIHRoZSBub2Rlcy4gKi8KKwl3aGlsZSAobmV3X25vZGUtPmNoaWxkcmVuKSB7CisJCS8qIFBvcCB0aGUgY2hpbGQgbm9kZSBvZmYgdGhlIGxpc3QgKi8KKwkJbmV3X2NoaWxkID0gbmV3X25vZGUtPmNoaWxkcmVuOworCQluZXdfbm9kZS0+Y2hpbGRyZW4gPSBuZXdfY2hpbGQtPm5leHRfc2libGluZzsKKwkJbmV3X2NoaWxkLT5wYXJlbnQgPSBOVUxMOworCQluZXdfY2hpbGQtPm5leHRfc2libGluZyA9IE5VTEw7CisKKwkJLyogU2VhcmNoIGZvciBhIGNvbGxpc2lvbi4gIE1lcmdlIGlmIHRoZXJlIGlzICovCisJCWZvcl9lYWNoX2NoaWxkKG9sZF9ub2RlLCBvbGRfY2hpbGQpIHsKKwkJCWlmIChzdHJlcShvbGRfY2hpbGQtPm5hbWUsIG5ld19jaGlsZC0+bmFtZSkpIHsKKwkJCQltZXJnZV9ub2RlcyhvbGRfY2hpbGQsIG5ld19jaGlsZCk7CisJCQkJbmV3X2NoaWxkID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIGlmIG5vIGNvbGxpc2lvbiBvY2N1cmVkLCBhZGQgY2hpbGQgdG8gdGhlIG9sZCBub2RlLiAqLworCQlpZiAobmV3X2NoaWxkKQorCQkJYWRkX2NoaWxkKG9sZF9ub2RlLCBuZXdfY2hpbGQpOworCX0KKworCS8qIFRoZSBuZXcgbm9kZSBjb250ZW50cyBhcmUgbm93IG1lcmdlZCBpbnRvIHRoZSBvbGQgbm9kZS4gIEZyZWUKKwkgKiB0aGUgbmV3IG5vZGUuICovCisJZnJlZShuZXdfbm9kZSk7CisKKwlyZXR1cm4gb2xkX25vZGU7Cit9CisKIHN0cnVjdCBub2RlICpjaGFpbl9ub2RlKHN0cnVjdCBub2RlICpmaXJzdCwgc3RydWN0IG5vZGUgKmxpc3QpCiB7CiAJYXNzZXJ0KGZpcnN0LT5uZXh0X3NpYmxpbmcgPT0gTlVMTCk7CkBAIC0xMjQsMTggKzIwMiwxNSBAQAogCSpwID0gY2hpbGQ7CiB9CiAKLXN0cnVjdCByZXNlcnZlX2luZm8gKmJ1aWxkX3Jlc2VydmVfZW50cnkodWludDY0X3QgYWRkcmVzcywgdWludDY0X3Qgc2l6ZSwKLQkJCQkJIGNoYXIgKmxhYmVsKQorc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBhZGRyZXNzLCB1aW50NjRfdCBzaXplKQogewogCXN0cnVjdCByZXNlcnZlX2luZm8gKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKIAorCW1lbXNldChuZXcsIDAsIHNpemVvZigqbmV3KSk7CisKIAluZXctPnJlLmFkZHJlc3MgPSBhZGRyZXNzOwogCW5ldy0+cmUuc2l6ZSA9IHNpemU7CiAKLQluZXctPm5leHQgPSBOVUxMOwotCi0JbmV3LT5sYWJlbCA9IGxhYmVsOwotCiAJcmV0dXJuIG5ldzsKIH0KIApAQCAtMjA4LDYgKzI4Myw2MCBAQAogCXJldHVybiBmZHQzMl90b19jcHUoKigoY2VsbF90ICopcHJvcC0+dmFsLnZhbCkpOwogfQogCitzdHJ1Y3QgcHJvcGVydHkgKmdldF9wcm9wZXJ0eV9ieV9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwsCisJCQkJICAgICAgIHN0cnVjdCBub2RlICoqbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG5vZGUgKmM7CisKKwkqbm9kZSA9IHRyZWU7CisKKwlmb3JfZWFjaF9wcm9wZXJ0eSh0cmVlLCBwcm9wKSB7CisJCXN0cnVjdCBsYWJlbCAqbDsKKworCQlmb3JfZWFjaF9sYWJlbChwcm9wLT5sYWJlbHMsIGwpCisJCQlpZiAoc3RyZXEobC0+bGFiZWwsIGxhYmVsKSkKKwkJCQlyZXR1cm4gcHJvcDsKKwl9CisKKwlmb3JfZWFjaF9jaGlsZCh0cmVlLCBjKSB7CisJCXByb3AgPSBnZXRfcHJvcGVydHlfYnlfbGFiZWwoYywgbGFiZWwsIG5vZGUpOworCQlpZiAocHJvcCkKKwkJCXJldHVybiBwcm9wOworCX0KKworCSpub2RlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG1hcmtlciAqZ2V0X21hcmtlcl9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwsCisJCQkJc3RydWN0IG5vZGUgKipub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKipwcm9wKQoreworCXN0cnVjdCBtYXJrZXIgKm07CisJc3RydWN0IHByb3BlcnR5ICpwOworCXN0cnVjdCBub2RlICpjOworCisJKm5vZGUgPSB0cmVlOworCisJZm9yX2VhY2hfcHJvcGVydHkodHJlZSwgcCkgeworCQkqcHJvcCA9IHA7CisJCW0gPSBwLT52YWwubWFya2VyczsKKwkJZm9yX2VhY2hfbWFya2VyX29mX3R5cGUobSwgTEFCRUwpCisJCQlpZiAoc3RyZXEobS0+cmVmLCBsYWJlbCkpCisJCQkJcmV0dXJuIG07CisJfQorCisJZm9yX2VhY2hfY2hpbGQodHJlZSwgYykgeworCQltID0gZ2V0X21hcmtlcl9sYWJlbChjLCBsYWJlbCwgbm9kZSwgcHJvcCk7CisJCWlmIChtKQorCQkJcmV0dXJuIG07CisJfQorCisJKnByb3AgPSBOVUxMOworCSpub2RlID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RydWN0IG5vZGUgKmdldF9zdWJub2RlKHN0cnVjdCBub2RlICpub2RlLCBjb25zdCBjaGFyICpub2RlbmFtZSkKIHsKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQ7CkBAIC0yNDUsMTEgKzM3NCwxMyBAQAogc3RydWN0IG5vZGUgKmdldF9ub2RlX2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAlzdHJ1Y3Qgbm9kZSAqY2hpbGQsICpub2RlOworCXN0cnVjdCBsYWJlbCAqbDsKIAogCWFzc2VydChsYWJlbCAmJiAoc3RybGVuKGxhYmVsKSA+IDApKTsKIAotCWlmICh0cmVlLT5sYWJlbCAmJiBzdHJlcSh0cmVlLT5sYWJlbCwgbGFiZWwpKQotCQlyZXR1cm4gdHJlZTsKKwlmb3JfZWFjaF9sYWJlbCh0cmVlLT5sYWJlbHMsIGwpCisJCWlmIChzdHJlcShsLT5sYWJlbCwgbGFiZWwpKQorCQkJcmV0dXJuIHRyZWU7CiAKIAlmb3JfZWFjaF9jaGlsZCh0cmVlLCBjaGlsZCkgewogCQlub2RlID0gZ2V0X25vZGVfYnlfbGFiZWwoY2hpbGQsIGxhYmVsKTsKQEAgLTI5MywxNiArNDI0LDE4NiBAQAogCWlmICgobm9kZS0+cGhhbmRsZSAhPSAwKSAmJiAobm9kZS0+cGhhbmRsZSAhPSAtMSkpCiAJCXJldHVybiBub2RlLT5waGFuZGxlOwogCi0JYXNzZXJ0KCEgZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxwaGFuZGxlIikpOwotCiAJd2hpbGUgKGdldF9ub2RlX2J5X3BoYW5kbGUocm9vdCwgcGhhbmRsZSkpCiAJCXBoYW5kbGUrKzsKIAogCW5vZGUtPnBoYW5kbGUgPSBwaGFuZGxlOwotCWFkZF9wcm9wZXJ0eShub2RlLAotCQkgICAgIGJ1aWxkX3Byb3BlcnR5KCJsaW51eCxwaGFuZGxlIiwKLQkJCQkgICAgZGF0YV9hcHBlbmRfY2VsbChlbXB0eV9kYXRhLCBwaGFuZGxlKSwKLQkJCQkgICAgTlVMTCkpOworCisJaWYgKCFnZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHBoYW5kbGUiKQorCSAgICAmJiAocGhhbmRsZV9mb3JtYXQgJiBQSEFORExFX0xFR0FDWSkpCisJCWFkZF9wcm9wZXJ0eShub2RlLAorCQkJICAgICBidWlsZF9wcm9wZXJ0eSgibGludXgscGhhbmRsZSIsCisJCQkJCSAgICBkYXRhX2FwcGVuZF9jZWxsKGVtcHR5X2RhdGEsIHBoYW5kbGUpKSk7CisKKwlpZiAoIWdldF9wcm9wZXJ0eShub2RlLCAicGhhbmRsZSIpCisJICAgICYmIChwaGFuZGxlX2Zvcm1hdCAmIFBIQU5ETEVfRVBBUFIpKQorCQlhZGRfcHJvcGVydHkobm9kZSwKKwkJCSAgICAgYnVpbGRfcHJvcGVydHkoInBoYW5kbGUiLAorCQkJCQkgICAgZGF0YV9hcHBlbmRfY2VsbChlbXB0eV9kYXRhLCBwaGFuZGxlKSkpOworCisJLyogSWYgdGhlIG5vZGUgKmRvZXMqIGhhdmUgYSBwaGFuZGxlIHByb3BlcnR5LCB3ZSBtdXN0CisJICogYmUgZGVhbGluZyB3aXRoIGEgc2VsZi1yZWZlcmVuY2luZyBwaGFuZGxlLCB3aGljaCB3aWxsIGJlCisJICogZml4ZWQgdXAgbW9tZW50YXJpbHkgaW4gdGhlIGNhbGxlciAqLwogCiAJcmV0dXJuIG5vZGUtPnBoYW5kbGU7CiB9CisKK3VpbnQzMl90IGd1ZXNzX2Jvb3RfY3B1aWQoc3RydWN0IG5vZGUgKnRyZWUpCit7CisJc3RydWN0IG5vZGUgKmNwdXMsICpib290Y3B1OworCXN0cnVjdCBwcm9wZXJ0eSAqcmVnOworCisJY3B1cyA9IGdldF9ub2RlX2J5X3BhdGgodHJlZSwgIi9jcHVzIik7CisJaWYgKCFjcHVzKQorCQlyZXR1cm4gMDsKKworCisJYm9vdGNwdSA9IGNwdXMtPmNoaWxkcmVuOworCWlmICghYm9vdGNwdSkKKwkJcmV0dXJuIDA7CisKKwlyZWcgPSBnZXRfcHJvcGVydHkoYm9vdGNwdSwgInJlZyIpOworCWlmICghcmVnIHx8IChyZWctPnZhbC5sZW4gIT0gc2l6ZW9mKHVpbnQzMl90KSkpCisJCXJldHVybiAwOworCisJLyogRklYTUU6IFNhbml0eSBjaGVjayBub2RlPyAqLworCisJcmV0dXJuIHByb3B2YWxfY2VsbChyZWcpOworfQorCitzdGF0aWMgaW50IGNtcF9yZXNlcnZlX2luZm8oY29uc3Qgdm9pZCAqYXgsIGNvbnN0IHZvaWQgKmJ4KQoreworCWNvbnN0IHN0cnVjdCByZXNlcnZlX2luZm8gKmEsICpiOworCisJYSA9ICooKGNvbnN0IHN0cnVjdCByZXNlcnZlX2luZm8gKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IHJlc2VydmVfaW5mbyAqIGNvbnN0ICopYngpOworCisJaWYgKGEtPnJlLmFkZHJlc3MgPCBiLT5yZS5hZGRyZXNzKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoYS0+cmUuYWRkcmVzcyA+IGItPnJlLmFkZHJlc3MpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGEtPnJlLnNpemUgPCBiLT5yZS5zaXplKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoYS0+cmUuc2l6ZSA+IGItPnJlLnNpemUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcmVzZXJ2ZV9lbnRyaWVzKHN0cnVjdCBib290X2luZm8gKmJpKQoreworCXN0cnVjdCByZXNlcnZlX2luZm8gKnJpLCAqKnRibDsKKwlpbnQgbiA9IDAsIGkgPSAwOworCisJZm9yIChyaSA9IGJpLT5yZXNlcnZlbGlzdDsKKwkgICAgIHJpOworCSAgICAgcmkgPSByaS0+bmV4dCkKKwkJbisrOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJdGJsID0geG1hbGxvYyhuICogc2l6ZW9mKCp0YmwpKTsKKworCWZvciAocmkgPSBiaS0+cmVzZXJ2ZWxpc3Q7CisJICAgICByaTsKKwkgICAgIHJpID0gcmktPm5leHQpCisJCXRibFtpKytdID0gcmk7CisKKwlxc29ydCh0YmwsIG4sIHNpemVvZigqdGJsKSwgY21wX3Jlc2VydmVfaW5mbyk7CisKKwliaS0+cmVzZXJ2ZWxpc3QgPSB0YmxbMF07CisJZm9yIChpID0gMDsgaSA8IChuLTEpOyBpKyspCisJCXRibFtpXS0+bmV4dCA9IHRibFtpKzFdOworCXRibFtuLTFdLT5uZXh0ID0gTlVMTDsKKworCWZyZWUodGJsKTsKK30KKworc3RhdGljIGludCBjbXBfcHJvcChjb25zdCB2b2lkICpheCwgY29uc3Qgdm9pZCAqYngpCit7CisJY29uc3Qgc3RydWN0IHByb3BlcnR5ICphLCAqYjsKKworCWEgPSAqKChjb25zdCBzdHJ1Y3QgcHJvcGVydHkgKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IHByb3BlcnR5ICogY29uc3QgKilieCk7CisKKwlyZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3Byb3BlcnRpZXMoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJaW50IG4gPSAwLCBpID0gMDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AsICoqdGJsOworCisJZm9yX2VhY2hfcHJvcGVydHkobm9kZSwgcHJvcCkKKwkJbisrOworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJdGJsID0geG1hbGxvYyhuICogc2l6ZW9mKCp0YmwpKTsKKworCWZvcl9lYWNoX3Byb3BlcnR5KG5vZGUsIHByb3ApCisJCXRibFtpKytdID0gcHJvcDsKKworCXFzb3J0KHRibCwgbiwgc2l6ZW9mKCp0YmwpLCBjbXBfcHJvcCk7CisKKwlub2RlLT5wcm9wbGlzdCA9IHRibFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgKG4tMSk7IGkrKykKKwkJdGJsW2ldLT5uZXh0ID0gdGJsW2krMV07CisJdGJsW24tMV0tPm5leHQgPSBOVUxMOworCisJZnJlZSh0YmwpOworfQorCitzdGF0aWMgaW50IGNtcF9zdWJub2RlKGNvbnN0IHZvaWQgKmF4LCBjb25zdCB2b2lkICpieCkKK3sKKwljb25zdCBzdHJ1Y3Qgbm9kZSAqYSwgKmI7CisKKwlhID0gKigoY29uc3Qgc3RydWN0IG5vZGUgKiBjb25zdCAqKWF4KTsKKwliID0gKigoY29uc3Qgc3RydWN0IG5vZGUgKiBjb25zdCAqKWJ4KTsKKworCXJldHVybiBzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfc3Vibm9kZXMoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJaW50IG4gPSAwLCBpID0gMDsKKwlzdHJ1Y3Qgbm9kZSAqc3Vibm9kZSwgKip0Ymw7CisKKwlmb3JfZWFjaF9jaGlsZChub2RlLCBzdWJub2RlKQorCQluKys7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl0YmwgPSB4bWFsbG9jKG4gKiBzaXplb2YoKnRibCkpOworCisJZm9yX2VhY2hfY2hpbGQobm9kZSwgc3Vibm9kZSkKKwkJdGJsW2krK10gPSBzdWJub2RlOworCisJcXNvcnQodGJsLCBuLCBzaXplb2YoKnRibCksIGNtcF9zdWJub2RlKTsKKworCW5vZGUtPmNoaWxkcmVuID0gdGJsWzBdOworCWZvciAoaSA9IDA7IGkgPCAobi0xKTsgaSsrKQorCQl0YmxbaV0tPm5leHRfc2libGluZyA9IHRibFtpKzFdOworCXRibFtuLTFdLT5uZXh0X3NpYmxpbmcgPSBOVUxMOworCisJZnJlZSh0YmwpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X25vZGUoc3RydWN0IG5vZGUgKm5vZGUpCit7CisJc3RydWN0IG5vZGUgKmM7CisKKwlzb3J0X3Byb3BlcnRpZXMobm9kZSk7CisJc29ydF9zdWJub2Rlcyhub2RlKTsKKwlmb3JfZWFjaF9jaGlsZChub2RlLCBjKQorCQlzb3J0X25vZGUoYyk7Cit9CisKK3ZvaWQgc29ydF90cmVlKHN0cnVjdCBib290X2luZm8gKmJpKQoreworCXNvcnRfcmVzZXJ2ZV9lbnRyaWVzKGJpKTsKKwlzb3J0X25vZGUoYmktPmR0KTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3NyY3Bvcy5jIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmMKaW5kZXggOTY0MWI3Ni4uMmRiYzg3NCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvc3JjcG9zLmMKKysrIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmMKQEAgLTE3LDEwMCArMTcsMjMyIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKICAqLwogCisjZGVmaW5lIF9HTlVfU09VUkNFCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCiAjaW5jbHVkZSAiZHRjLmgiCiAjaW5jbHVkZSAic3JjcG9zLmgiCiAKLS8qCi0gKiBMaWtlIHl5bGluZW5vLCB0aGlzIGlzIHRoZSBjdXJyZW50IG9wZW4gZmlsZSBwb3MuCi0gKi8KIAotc3RydWN0IGR0Y19maWxlICpzcmNwb3NfZmlsZTsKLQotc3RhdGljIGludCBkdGNfb3Blbl9vbmUoc3RydWN0IGR0Y19maWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VhcmNoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm5hbWUpCitzdGF0aWMgY2hhciAqZGlybmFtZShjb25zdCBjaGFyICpwYXRoKQogeworCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCisJaWYgKHNsYXNoKSB7CisJCWludCBsZW4gPSBzbGFzaCAtIHBhdGg7CisJCWNoYXIgKmRpciA9IHhtYWxsb2MobGVuICsgMSk7CisKKwkJbWVtY3B5KGRpciwgcGF0aCwgbGVuKTsKKwkJZGlyW2xlbl0gPSAnXDAnOworCQlyZXR1cm4gZGlyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHNyY2ZpbGVfc3RhdGUgKmN1cnJlbnRfc3JjZmlsZTsgLyogPSBOVUxMICovCisKKy8qIERldGVjdCBpbmZpbml0ZSBpbmNsdWRlIHJlY3Vyc2lvbi4gKi8KKyNkZWZpbmUgTUFYX1NSQ0ZJTEVfREVQVEggICAgICgxMDApCitzdGF0aWMgaW50IHNyY2ZpbGVfZGVwdGg7IC8qID0gMCAqLworCitGSUxFICpzcmNmaWxlX3JlbGF0aXZlX29wZW4oY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKipmdWxsbmFtZXApCit7CisJRklMRSAqZjsKIAljaGFyICpmdWxsbmFtZTsKIAotCWlmIChzZWFyY2gpIHsKLQkJZnVsbG5hbWUgPSB4bWFsbG9jKHN0cmxlbihzZWFyY2gpICsgc3RybGVuKGZuYW1lKSArIDIpOwotCi0JCXN0cmNweShmdWxsbmFtZSwgc2VhcmNoKTsKLQkJc3RyY2F0KGZ1bGxuYW1lLCAiLyIpOwotCQlzdHJjYXQoZnVsbG5hbWUsIGZuYW1lKTsKLQl9IGVsc2UgewotCQlmdWxsbmFtZSA9IHN0cmR1cChmbmFtZSk7Ci0JfQotCi0JZmlsZS0+ZmlsZSA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOwotCWlmICghZmlsZS0+ZmlsZSkgewotCQlmcmVlKGZ1bGxuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZmlsZS0+bmFtZSA9IGZ1bGxuYW1lOwotCXJldHVybiAxOwotfQotCi0KLXN0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2VhcmNoX3BhdGggKnNlYXJjaCkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoIGRlZmF1bHRfc2VhcmNoID0geyBOVUxMLCBOVUxMLCBOVUxMIH07Ci0KLQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci0JY29uc3QgY2hhciAqc2xhc2g7Ci0KLQlmaWxlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGR0Y19maWxlKSk7Ci0KLQlzbGFzaCA9IHN0cnJjaHIoZm5hbWUsICcvJyk7Ci0JaWYgKHNsYXNoKSB7Ci0JCWNoYXIgKmRpciA9IHhtYWxsb2Moc2xhc2ggLSBmbmFtZSArIDEpOwotCi0JCW1lbWNweShkaXIsIGZuYW1lLCBzbGFzaCAtIGZuYW1lKTsKLQkJZGlyW3NsYXNoIC0gZm5hbWVdID0gMDsKLQkJZmlsZS0+ZGlyID0gZGlyOwotCX0gZWxzZSB7Ci0JCWZpbGUtPmRpciA9IE5VTEw7Ci0JfQotCiAJaWYgKHN0cmVxKGZuYW1lLCAiLSIpKSB7Ci0JCWZpbGUtPm5hbWUgPSAic3RkaW4iOwotCQlmaWxlLT5maWxlID0gc3RkaW47Ci0JCXJldHVybiBmaWxlOworCQlmID0gc3RkaW47CisJCWZ1bGxuYW1lID0geHN0cmR1cCgiPHN0ZGluPiIpOworCX0gZWxzZSB7CisJCWlmICghY3VycmVudF9zcmNmaWxlIHx8ICFjdXJyZW50X3NyY2ZpbGUtPmRpcgorCQkgICAgfHwgKGZuYW1lWzBdID09ICcvJykpCisJCQlmdWxsbmFtZSA9IHhzdHJkdXAoZm5hbWUpOworCQllbHNlCisJCQlmdWxsbmFtZSA9IGpvaW5fcGF0aChjdXJyZW50X3NyY2ZpbGUtPmRpciwgZm5hbWUpOworCisJCWYgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwkJaWYgKCFmKQorCQkJZGllKCJDb3VsZG4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIGZuYW1lLAorCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJfQogCi0JaWYgKGZuYW1lWzBdID09ICcvJykgewotCQlmaWxlLT5maWxlID0gZm9wZW4oZm5hbWUsICJyIik7Ci0JCWlmICghZmlsZS0+ZmlsZSkKLQkJCWdvdG8gZmFpbDsKKwlpZiAoZnVsbG5hbWVwKQorCQkqZnVsbG5hbWVwID0gZnVsbG5hbWU7CisJZWxzZQorCQlmcmVlKGZ1bGxuYW1lKTsKIAotCQlmaWxlLT5uYW1lID0gc3RyZHVwKGZuYW1lKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JaWYgKCFzZWFyY2gpCi0JCXNlYXJjaCA9ICZkZWZhdWx0X3NlYXJjaDsKLQotCXdoaWxlIChzZWFyY2gpIHsKLQkJaWYgKGR0Y19vcGVuX29uZShmaWxlLCBzZWFyY2gtPmRpciwgZm5hbWUpKQotCQkJcmV0dXJuIGZpbGU7Ci0KLQkJaWYgKGVycm5vICE9IEVOT0VOVCkKLQkJCWdvdG8gZmFpbDsKLQotCQlzZWFyY2ggPSBzZWFyY2gtPm5leHQ7Ci0JfQotCi1mYWlsOgotCWRpZSgiQ291bGRuJ3Qgb3BlbiBcIiVzXCI6ICVzXG4iLCBmbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZjsKIH0KIAotdm9pZCBkdGNfY2xvc2VfZmlsZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUpCit2b2lkIHNyY2ZpbGVfcHVzaChjb25zdCBjaGFyICpmbmFtZSkKIHsKLQlpZiAoZmNsb3NlKGZpbGUtPmZpbGUpKQotCQlkaWUoIkVycm9yIGNsb3NpbmcgXCIlc1wiOiAlc1xuIiwgZmlsZS0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqc3JjZmlsZTsKIAotCWZyZWUoZmlsZS0+ZGlyKTsKLQlmcmVlKGZpbGUpOworCWlmIChzcmNmaWxlX2RlcHRoKysgPj0gTUFYX1NSQ0ZJTEVfREVQVEgpCisJCWRpZSgiSW5jbHVkZXMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKworCXNyY2ZpbGUgPSB4bWFsbG9jKHNpemVvZigqc3JjZmlsZSkpOworCisJc3JjZmlsZS0+ZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbihmbmFtZSwgJnNyY2ZpbGUtPm5hbWUpOworCXNyY2ZpbGUtPmRpciA9IGRpcm5hbWUoc3JjZmlsZS0+bmFtZSk7CisJc3JjZmlsZS0+cHJldiA9IGN1cnJlbnRfc3JjZmlsZTsKKworCXNyY2ZpbGUtPmxpbmVubyA9IDE7CisJc3JjZmlsZS0+Y29sbm8gPSAxOworCisJY3VycmVudF9zcmNmaWxlID0gc3JjZmlsZTsKK30KKworaW50IHNyY2ZpbGVfcG9wKHZvaWQpCit7CisJc3RydWN0IHNyY2ZpbGVfc3RhdGUgKnNyY2ZpbGUgPSBjdXJyZW50X3NyY2ZpbGU7CisKKwlhc3NlcnQoc3JjZmlsZSk7CisKKwljdXJyZW50X3NyY2ZpbGUgPSBzcmNmaWxlLT5wcmV2OworCisJaWYgKGZjbG9zZShzcmNmaWxlLT5mKSkKKwkJZGllKCJFcnJvciBjbG9zaW5nIFwiJXNcIjogJXNcbiIsIHNyY2ZpbGUtPm5hbWUsCisJCSAgICBzdHJlcnJvcihlcnJubykpOworCisJLyogRklYTUU6IFdlIGFsbG93IHRoZSBzcmNmaWxlX3N0YXRlIHN0cnVjdHVyZSB0byBsZWFrLAorCSAqIGJlY2F1c2UgaXQgY291bGQgc3RpbGwgYmUgcmVmZXJlbmNlZCBmcm9tIGEgbG9jYXRpb24KKwkgKiB2YXJpYWJsZSBiZWluZyBjYXJyaWVkIHRocm91Z2ggdGhlIHBhcnNlciBzb21ld2hlcmUuICBUbworCSAqIGZpeCB0aGlzIHdlIGNvdWxkIGVpdGhlciBhbGxvY2F0ZSBhbGwgdGhlIGZpbGVzIGZyb20gYQorCSAqIHRhYmxlLCBvciB1c2UgYSBwb29sIGFsbG9jYXRvci4gKi8KKworCXJldHVybiBjdXJyZW50X3NyY2ZpbGUgPyAxIDogMDsKK30KKworLyoKKyAqIFRoZSBlbXB0eSBzb3VyY2UgcG9zaXRpb24uCisgKi8KKworc3RydWN0IHNyY3BvcyBzcmNwb3NfZW1wdHkgPSB7CisJLmZpcnN0X2xpbmUgPSAwLAorCS5maXJzdF9jb2x1bW4gPSAwLAorCS5sYXN0X2xpbmUgPSAwLAorCS5sYXN0X2NvbHVtbiA9IDAsCisJLmZpbGUgPSBOVUxMLAorfTsKKworI2RlZmluZSBUQUJfU0laRSAgICAgIDgKKwordm9pZCBzcmNwb3NfdXBkYXRlKHN0cnVjdCBzcmNwb3MgKnBvcywgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXBvcy0+ZmlsZSA9IGN1cnJlbnRfc3JjZmlsZTsKKworCXBvcy0+Zmlyc3RfbGluZSA9IGN1cnJlbnRfc3JjZmlsZS0+bGluZW5vOworCXBvcy0+Zmlyc3RfY29sdW1uID0gY3VycmVudF9zcmNmaWxlLT5jb2xubzsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHRleHRbaV0gPT0gJ1xuJykgeworCQkJY3VycmVudF9zcmNmaWxlLT5saW5lbm8rKzsKKwkJCWN1cnJlbnRfc3JjZmlsZS0+Y29sbm8gPSAxOworCQl9IGVsc2UgaWYgKHRleHRbaV0gPT0gJ1x0JykgeworCQkJY3VycmVudF9zcmNmaWxlLT5jb2xubyA9CisJCQkJQUxJR04oY3VycmVudF9zcmNmaWxlLT5jb2xubywgVEFCX1NJWkUpOworCQl9IGVsc2UgeworCQkJY3VycmVudF9zcmNmaWxlLT5jb2xubysrOworCQl9CisKKwlwb3MtPmxhc3RfbGluZSA9IGN1cnJlbnRfc3JjZmlsZS0+bGluZW5vOworCXBvcy0+bGFzdF9jb2x1bW4gPSBjdXJyZW50X3NyY2ZpbGUtPmNvbG5vOworfQorCitzdHJ1Y3Qgc3JjcG9zICoKK3NyY3Bvc19jb3B5KHN0cnVjdCBzcmNwb3MgKnBvcykKK3sKKwlzdHJ1Y3Qgc3JjcG9zICpwb3NfbmV3OworCisJcG9zX25ldyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcmNwb3MpKTsKKwltZW1jcHkocG9zX25ldywgcG9zLCBzaXplb2Yoc3RydWN0IHNyY3BvcykpOworCisJcmV0dXJuIHBvc19uZXc7Cit9CisKKworCit2b2lkCitzcmNwb3NfZHVtcChzdHJ1Y3Qgc3JjcG9zICpwb3MpCit7CisJcHJpbnRmKCJmaWxlICAgICAgICA6IFwiJXNcIlxuIiwKKwkgICAgICAgcG9zLT5maWxlID8gKGNoYXIgKikgcG9zLT5maWxlIDogIjxubyBmaWxlPiIpOworCXByaW50ZigiZmlyc3RfbGluZSAgOiAlZFxuIiwgcG9zLT5maXJzdF9saW5lKTsKKwlwcmludGYoImZpcnN0X2NvbHVtbjogJWRcbiIsIHBvcy0+Zmlyc3RfY29sdW1uKTsKKwlwcmludGYoImxhc3RfbGluZSAgIDogJWRcbiIsIHBvcy0+bGFzdF9saW5lKTsKKwlwcmludGYoImxhc3RfY29sdW1uIDogJWRcbiIsIHBvcy0+bGFzdF9jb2x1bW4pOworCXByaW50ZigiZmlsZSAgICAgICAgOiAlc1xuIiwgcG9zLT5maWxlLT5uYW1lKTsKK30KKworCitjaGFyICoKK3NyY3Bvc19zdHJpbmcoc3RydWN0IHNyY3BvcyAqcG9zKQoreworCWNvbnN0IGNoYXIgKmZuYW1lID0gIjxuby1maWxlPiI7CisJY2hhciAqcG9zX3N0cjsKKwlpbnQgcmM7CisKKwlpZiAocG9zKQorCQlmbmFtZSA9IHBvcy0+ZmlsZS0+bmFtZTsKKworCisJaWYgKHBvcy0+Zmlyc3RfbGluZSAhPSBwb3MtPmxhc3RfbGluZSkKKwkJcmMgPSBhc3ByaW50ZigmcG9zX3N0ciwgIiVzOiVkLiVkLSVkLiVkIiwgZm5hbWUsCisJCQkgICAgICBwb3MtPmZpcnN0X2xpbmUsIHBvcy0+Zmlyc3RfY29sdW1uLAorCQkJICAgICAgcG9zLT5sYXN0X2xpbmUsIHBvcy0+bGFzdF9jb2x1bW4pOworCWVsc2UgaWYgKHBvcy0+Zmlyc3RfY29sdW1uICE9IHBvcy0+bGFzdF9jb2x1bW4pCisJCXJjID0gYXNwcmludGYoJnBvc19zdHIsICIlczolZC4lZC0lZCIsIGZuYW1lLAorCQkJICAgICAgcG9zLT5maXJzdF9saW5lLCBwb3MtPmZpcnN0X2NvbHVtbiwKKwkJCSAgICAgIHBvcy0+bGFzdF9jb2x1bW4pOworCWVsc2UKKwkJcmMgPSBhc3ByaW50ZigmcG9zX3N0ciwgIiVzOiVkLiVkIiwgZm5hbWUsCisJCQkgICAgICBwb3MtPmZpcnN0X2xpbmUsIHBvcy0+Zmlyc3RfY29sdW1uKTsKKworCWlmIChyYyA9PSAtMSkKKwkJZGllKCJDb3VsZG4ndCBhbGxvY2F0ZSBpbiBzcmNwb3Mgc3RyaW5nIik7CisKKwlyZXR1cm4gcG9zX3N0cjsKK30KKwordm9pZAorc3JjcG9zX3ZlcnJvcihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKmZtdCwgdmFfbGlzdCB2YSkKK3sKKyAgICAgICBjb25zdCBjaGFyICpzcmNzdHI7CisKKyAgICAgICBzcmNzdHIgPSBzcmNwb3Nfc3RyaW5nKHBvcyk7CisKKyAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkVycm9yOiAlcyAiLCBzcmNzdHIpOworICAgICAgIHZmcHJpbnRmKHN0ZG91dCwgZm10LCB2YSk7CisgICAgICAgZnByaW50ZihzdGRvdXQsICJcbiIpOworfQorCit2b2lkCitzcmNwb3NfZXJyb3Ioc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQodmEsIGZtdCk7CisJc3JjcG9zX3ZlcnJvcihwb3MsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKKwordm9pZAorc3JjcG9zX3dhcm4oc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICpmbXQsIC4uLikKK3sKKwljb25zdCBjaGFyICpzcmNzdHI7CisJdmFfbGlzdCB2YTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKworCXNyY3N0ciA9IHNyY3Bvc19zdHJpbmcocG9zKTsKKworCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJXMgIiwgc3Jjc3RyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgdmEpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCXZhX2VuZCh2YSk7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9zcmNwb3MuaCBiL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCmluZGV4IGUxN2M3YzAuLmJkNzk2NmUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCisrKyBiL3NjcmlwdHMvZHRjL3NyY3Bvcy5oCkBAIC0xNyw2OSArMTcsNzAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQQogICovCiAKLS8qCi0gKiBBdWdtZW50IHRoZSBzdGFuZGFyZCBZWUxUWVBFIHdpdGggYSBmaWxlbnVtIGluZGV4IGludG8gYW4KLSAqIGFycmF5IG9mIGFsbCBvcGVuZWQgZmlsZW5hbWVzLgotICovCisjaWZuZGVmIF9TUkNQT1NfSF8KKyNkZWZpbmUgX1NSQ1BPU19IXwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotc3RydWN0IGR0Y19maWxlIHsKK3N0cnVjdCBzcmNmaWxlX3N0YXRlIHsKKwlGSUxFICpmOworCWNoYXIgKm5hbWU7CiAJY2hhciAqZGlyOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JRklMRSAqZmlsZTsKKwlpbnQgbGluZW5vLCBjb2xubzsKKwlzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqcHJldjsKIH07CiAKLSNpZiAhIGRlZmluZWQoWVlMVFlQRSkgJiYgISBkZWZpbmVkKFlZTFRZUEVfSVNfREVDTEFSRUQpCi10eXBlZGVmIHN0cnVjdCBZWUxUWVBFIHsKK2V4dGVybiBzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqY3VycmVudF9zcmNmaWxlOyAvKiA9IE5VTEwgKi8KKworRklMRSAqc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKGNvbnN0IGNoYXIgKmZuYW1lLCBjaGFyICoqZnVsbG5hbWVwKTsKK3ZvaWQgc3JjZmlsZV9wdXNoKGNvbnN0IGNoYXIgKmZuYW1lKTsKK2ludCBzcmNmaWxlX3BvcCh2b2lkKTsKKworc3RydWN0IHNyY3BvcyB7CiAgICAgaW50IGZpcnN0X2xpbmU7CiAgICAgaW50IGZpcnN0X2NvbHVtbjsKICAgICBpbnQgbGFzdF9saW5lOwogICAgIGludCBsYXN0X2NvbHVtbjsKLSAgICBzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci19IFlZTFRZUEU7Ci0KLSNkZWZpbmUgWVlMVFlQRV9JU19ERUNMQVJFRAkxCi0jZGVmaW5lIFlZTFRZUEVfSVNfVFJJVklBTAkxCi0jZW5kaWYKLQotLyogQ2F0ZXIgdG8gb2xkIHBhcnNlciB0ZW1wbGF0ZXMuICovCi0jaWZuZGVmIFlZSUQKLSNkZWZpbmUgWVlJRChuKQkobikKLSNlbmRpZgotCi0jZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikJCQkJCVwKLSAgICBkbwkJCQkJCQkJCVwKLSAgICAgIGlmIChZWUlEIChOKSkJCQkJCQkJXAotCXsJCQkJCQkJCVwKLQkgIChDdXJyZW50KS5maXJzdF9saW5lICAgPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9saW5lOwlcCi0JICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MgKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCi0JICAoQ3VycmVudCkubGFzdF9saW5lICAgID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9saW5lOwkJXAotCSAgKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCi0JICAoQ3VycmVudCkuZmlsZSAgICAgICAgID0gWVlSSFNMT0MgKFJocywgTikuZmlsZTsJCVwKLQl9CQkJCQkJCQlcCi0gICAgICBlbHNlCQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IChDdXJyZW50KS5sYXN0X2xpbmUgICA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfbGluZTsJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CQlcCi0JICAgIFlZUkhTTE9DIChSaHMsIDApLmxhc3RfY29sdW1uOwkJCQlcCi0JICAoQ3VycmVudCkuZmlsZSAgICAgICAgID0gWVlSSFNMT0MgKFJocywgMCkuZmlsZTsJCVwKLQl9CQkJCQkJCQlcCi0gICAgd2hpbGUgKFlZSUQgKDApKQotCi0KLQotZXh0ZXJuIHZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICopOwotZXh0ZXJuIHZvaWQgeXllcnJvcmYoY2hhciBjb25zdCAqLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgZHRjX2ZpbGUgKnNyY3Bvc19maWxlOwotCi1zdHJ1Y3Qgc2VhcmNoX3BhdGggewotCWNvbnN0IGNoYXIgKmRpcjsgLyogTlVMTCBmb3IgY3VycmVudCBkaXJlY3RvcnkgKi8KLQlzdHJ1Y3Qgc2VhcmNoX3BhdGggKnByZXYsICpuZXh0OworICAgIHN0cnVjdCBzcmNmaWxlX3N0YXRlICpmaWxlOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBkdGNfZmlsZSAqZHRjX29wZW5fZmlsZShjb25zdCBjaGFyICpmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlYXJjaF9wYXRoICpzZWFyY2gpOwotZXh0ZXJuIHZvaWQgZHRjX2Nsb3NlX2ZpbGUoc3RydWN0IGR0Y19maWxlICpmaWxlKTsKKyNkZWZpbmUgWVlMVFlQRSBzdHJ1Y3Qgc3JjcG9zCisKKyNkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQkJXAorCQlpZiAoTikgewkJCQkJCQlcCisJCQkoQ3VycmVudCkuZmlyc3RfbGluZSA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfbGluZTsJXAorCQkJKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IFlZUkhTTE9DKFJocywgMSkuZmlyc3RfY29sdW1uOwlcCisJCQkoQ3VycmVudCkubGFzdF9saW5lID0gWVlSSFNMT0MoUmhzLCBOKS5sYXN0X2xpbmU7CVwKKwkJCShDdXJyZW50KS5sYXN0X2NvbHVtbiAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2NvbHVtbjsJXAorCQkJKEN1cnJlbnQpLmZpbGUgPSBZWVJIU0xPQyhSaHMsIE4pLmZpbGU7CQkJXAorCQl9IGVsc2UgewkJCQkJCQlcCisJCQkoQ3VycmVudCkuZmlyc3RfbGluZSA9IChDdXJyZW50KS5sYXN0X2xpbmUgPQkJXAorCQkJCVlZUkhTTE9DKFJocywgMCkubGFzdF9saW5lOwkJCVwKKwkJCShDdXJyZW50KS5maXJzdF9jb2x1bW4gPSAoQ3VycmVudCkubGFzdF9jb2x1bW4gPQlcCisJCQkJWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2NvbHVtbjsJCQlcCisJCQkoQ3VycmVudCkuZmlsZSA9IFlZUkhTTE9DIChSaHMsIDApLmZpbGU7CQlcCisJCX0JCQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisKKy8qCisgKiBGaWN0aW9uYWwgc291cmNlIHBvc2l0aW9uIHVzZWQgZm9yIElSIG5vZGVzIHRoYXQgYXJlCisgKiBjcmVhdGVkIHdpdGhvdXQgb3RoZXJ3aXNlIGtub3dpbmcgYSB0cnVlIHNvdXJjZSBwb3NpdGlvbi4KKyAqIEZvciBleGFtcGxlLGNvbnN0YW50IGRlZmluaXRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAqLworZXh0ZXJuIHN0cnVjdCBzcmNwb3Mgc3JjcG9zX2VtcHR5OworCitleHRlcm4gdm9pZCBzcmNwb3NfdXBkYXRlKHN0cnVjdCBzcmNwb3MgKnBvcywgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbik7CitleHRlcm4gc3RydWN0IHNyY3BvcyAqc3JjcG9zX2NvcHkoc3RydWN0IHNyY3BvcyAqcG9zKTsKK2V4dGVybiBjaGFyICpzcmNwb3Nfc3RyaW5nKHN0cnVjdCBzcmNwb3MgKnBvcyk7CitleHRlcm4gdm9pZCBzcmNwb3NfZHVtcChzdHJ1Y3Qgc3JjcG9zICpwb3MpOworCitleHRlcm4gdm9pZCBzcmNwb3NfdmVycm9yKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqLCB2YV9saXN0IHZhKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIHZvaWQgc3JjcG9zX2Vycm9yKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqLCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitleHRlcm4gdm9pZCBzcmNwb3Nfd2FybihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKiwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworCisjZW5kaWYgLyogX1NSQ1BPU19IXyAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jIGIvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jCmluZGV4IDE1MjFmZjEuLmMwOWFhZmEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL3RyZWVzb3VyY2UuYworKysgYi9zY3JpcHRzL2R0Yy90cmVlc291cmNlLmMKQEAgLTMyLDggKzMyLDggQEAKIAl0aGVfYm9vdF9pbmZvID0gTlVMTDsKIAl0cmVlc291cmNlX2Vycm9yID0gMDsKIAotCXNyY3Bvc19maWxlID0gZHRjX29wZW5fZmlsZShmbmFtZSwgTlVMTCk7Ci0JeXlpbiA9IHNyY3Bvc19maWxlLT5maWxlOworCXNyY2ZpbGVfcHVzaChmbmFtZSk7CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAogCWlmICh5eXBhcnNlKCkgIT0gMCkKIAkJZGllKCJVbmFibGUgdG8gcGFyc2UgaW5wdXQgdHJlZVxuIik7CkBAIC02MywyNiArNjMsMjAgQEAKIHsKIAljb25zdCBjaGFyICpzdHIgPSB2YWwudmFsOwogCWludCBpOwotCWludCBuZXdjaHVuayA9IDE7CiAJc3RydWN0IG1hcmtlciAqbSA9IHZhbC5tYXJrZXJzOwogCiAJYXNzZXJ0KHN0clt2YWwubGVuLTFdID09ICdcMCcpOwogCisJd2hpbGUgKG0gJiYgKG0tPm9mZnNldCA9PSAwKSkgeworCQlpZiAobS0+dHlwZSA9PSBMQUJFTCkKKwkJCWZwcmludGYoZiwgIiVzOiAiLCBtLT5yZWYpOworCQltID0gbS0+bmV4dDsKKwl9CisJZnByaW50ZihmLCAiXCIiKTsKKwogCWZvciAoaSA9IDA7IGkgPCAodmFsLmxlbi0xKTsgaSsrKSB7CiAJCWNoYXIgYyA9IHN0cltpXTsKIAotCQlpZiAobmV3Y2h1bmspIHsKLQkJCXdoaWxlIChtICYmIChtLT5vZmZzZXQgPD0gaSkpIHsKLQkJCQlpZiAobS0+dHlwZSA9PSBMQUJFTCkgewotCQkJCQlhc3NlcnQobS0+b2Zmc2V0ID09IGkpOwotCQkJCQlmcHJpbnRmKGYsICIlczogIiwgbS0+cmVmKTsKLQkJCQl9Ci0JCQkJbSA9IG0tPm5leHQ7Ci0JCQl9Ci0JCQlmcHJpbnRmKGYsICJcIiIpOwotCQkJbmV3Y2h1bmsgPSAwOwotCQl9Ci0KIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJ1xhJzoKIAkJCWZwcmludGYoZiwgIlxcYSIpOwpAQCAtMTEzLDcgKzEwNywxNCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ1wwJzoKIAkJCWZwcmludGYoZiwgIlwiLCAiKTsKLQkJCW5ld2NodW5rID0gMTsKKwkJCXdoaWxlIChtICYmIChtLT5vZmZzZXQgPCBpKSkgeworCQkJCWlmIChtLT50eXBlID09IExBQkVMKSB7CisJCQkJCWFzc2VydChtLT5vZmZzZXQgPT0gKGkrMSkpOworCQkJCQlmcHJpbnRmKGYsICIlczogIiwgbS0+cmVmKTsKKwkJCQl9CisJCQkJbSA9IG0tPm5leHQ7CisJCQl9CisJCQlmcHJpbnRmKGYsICJcIiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpZiAoaXNwcmludChjKSkKQEAgLTIzNCwxMCArMjM1LDExIEBACiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXN0cnVjdCBub2RlICpjaGlsZDsKKwlzdHJ1Y3QgbGFiZWwgKmw7CiAKIAl3cml0ZV9wcmVmaXgoZiwgbGV2ZWwpOwotCWlmICh0cmVlLT5sYWJlbCkKLQkJZnByaW50ZihmLCAiJXM6ICIsIHRyZWUtPmxhYmVsKTsKKwlmb3JfZWFjaF9sYWJlbCh0cmVlLT5sYWJlbHMsIGwpCisJCWZwcmludGYoZiwgIiVzOiAiLCBsLT5sYWJlbCk7CiAJaWYgKHRyZWUtPm5hbWUgJiYgKCp0cmVlLT5uYW1lKSkKIAkJZnByaW50ZihmLCAiJXMge1xuIiwgdHJlZS0+bmFtZSk7CiAJZWxzZQpAQCAtMjQ1LDggKzI0Nyw4IEBACiAKIAlmb3JfZWFjaF9wcm9wZXJ0eSh0cmVlLCBwcm9wKSB7CiAJCXdyaXRlX3ByZWZpeChmLCBsZXZlbCsxKTsKLQkJaWYgKHByb3AtPmxhYmVsKQotCQkJZnByaW50ZihmLCAiJXM6ICIsIHByb3AtPmxhYmVsKTsKKwkJZm9yX2VhY2hfbGFiZWwocHJvcC0+bGFiZWxzLCBsKQorCQkJZnByaW50ZihmLCAiJXM6ICIsIGwtPmxhYmVsKTsKIAkJZnByaW50ZihmLCAiJXMiLCBwcm9wLT5uYW1lKTsKIAkJd3JpdGVfcHJvcHZhbChmLCBwcm9wKTsKIAl9CkBAIC0yNjYsOCArMjY4LDEwIEBACiAJZnByaW50ZihmLCAiL2R0cy12MS87XG5cbiIpOwogCiAJZm9yIChyZSA9IGJpLT5yZXNlcnZlbGlzdDsgcmU7IHJlID0gcmUtPm5leHQpIHsKLQkJaWYgKHJlLT5sYWJlbCkKLQkJCWZwcmludGYoZiwgIiVzOiAiLCByZS0+bGFiZWwpOworCQlzdHJ1Y3QgbGFiZWwgKmw7CisKKwkJZm9yX2VhY2hfbGFiZWwocmUtPmxhYmVscywgbCkKKwkJCWZwcmludGYoZiwgIiVzOiAiLCBsLT5sYWJlbCk7CiAJCWZwcmludGYoZiwgIi9tZW1yZXNlcnZlL1x0MHglMDE2bGx4IDB4JTAxNmxseDtcbiIsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlLT5yZS5hZGRyZXNzLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZS0+cmUuc2l6ZSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy91dGlsLmMgYi9zY3JpcHRzL2R0Yy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhYzI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZHRjL3V0aWwuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggSm9uIExvZWxpZ2VyLCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1dGlsLmgiCisKK2NoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpICsgMTsKKwljaGFyICpkdXAgPSB4bWFsbG9jKGxlbik7CisKKwltZW1jcHkoZHVwLCBzLCBsZW4pOworCisJcmV0dXJuIGR1cDsKK30KKworY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGxlbnAgPSBzdHJsZW4ocGF0aCk7CisJaW50IGxlbm4gPSBzdHJsZW4obmFtZSk7CisJaW50IGxlbjsKKwlpbnQgbmVlZHNsYXNoID0gMTsKKwljaGFyICpzdHI7CisKKwlsZW4gPSBsZW5wICsgbGVubiArIDI7CisJaWYgKChsZW5wID4gMCkgJiYgKHBhdGhbbGVucC0xXSA9PSAnLycpKSB7CisJCW5lZWRzbGFzaCA9IDA7CisJCWxlbi0tOworCX0KKworCXN0ciA9IHhtYWxsb2MobGVuKTsKKwltZW1jcHkoc3RyLCBwYXRoLCBsZW5wKTsKKwlpZiAobmVlZHNsYXNoKSB7CisJCXN0cltsZW5wXSA9ICcvJzsKKwkJbGVucCsrOworCX0KKwltZW1jcHkoc3RyK2xlbnAsIG5hbWUsIGxlbm4rMSk7CisJcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3V0aWwuaCBiL3NjcmlwdHMvZHRjL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2VhZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kdGMvdXRpbC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX1VUSUxfSAorI2RlZmluZSBfVVRJTF9ICisKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBKb24gTG9lbGlnZXIsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBkaWUoY2hhciAqIHN0ciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgc3RyKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkZBVEFMIEVSUk9SOiAiKTsKKwl2ZnByaW50ZihzdGRlcnIsIHN0ciwgYXApOworCWV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeG1hbGxvYyhzaXplX3QgbGVuKQoreworCXZvaWQgKm5ldyA9IG1hbGxvYyhsZW4pOworCisJaWYgKCFuZXcpCisJCWRpZSgibWFsbG9jKCkgZmFpbGVkXG4iKTsKKworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IGxlbikKK3sKKwl2b2lkICpuZXcgPSByZWFsbG9jKHAsIGxlbik7CisKKwlpZiAoIW5ldykKKwkJZGllKCJyZWFsbG9jKCkgZmFpbGVkIChsZW49JWQpXG4iLCBsZW4pOworCisJcmV0dXJuIG5ldzsKK30KKworZXh0ZXJuIGNoYXIgKnhzdHJkdXAoY29uc3QgY2hhciAqcyk7CitleHRlcm4gY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYgLyogX1VUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdmVyc2lvbl9nZW4uaCBiL3NjcmlwdHMvZHRjL3ZlcnNpb25fZ2VuLmgKaW5kZXggNjU4ZmY0Mi4uNjE1OGI4NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvdmVyc2lvbl9nZW4uaAorKysgYi9zY3JpcHRzL2R0Yy92ZXJzaW9uX2dlbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIERUQ19WRVJTSU9OICJEVEMgMS4yLjAiCisjZGVmaW5lIERUQ19WRVJTSU9OICJEVEMgMS4yLjAtZzM3YzBiNmEwIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2ggYi9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAppbmRleCA1OTU4ZmZmLi41NWNhZWNkIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaAorKysgYi9zY3JpcHRzL2dlbl9pbml0cmFtZnNfbGlzdC5zaApAQCAtMjQzLDYgKzI0Myw4IEBACiAJCWVjaG8gIiRvdXRwdXRfZmlsZSIgfCBncmVwIC1xICJcLmd6JCIgJiYgY29tcHI9Imd6aXAgLTkgLWYiCiAJCWVjaG8gIiRvdXRwdXRfZmlsZSIgfCBncmVwIC1xICJcLmJ6MiQiICYmIGNvbXByPSJiemlwMiAtOSAtZiIKIAkJZWNobyAiJG91dHB1dF9maWxlIiB8IGdyZXAgLXEgIlwubHptYSQiICYmIGNvbXByPSJsem1hIC05IC1mIgorCQllY2hvICIkb3V0cHV0X2ZpbGUiIHwgZ3JlcCAtcSAiXC54eiQiICYmIFwKKwkJCQljb21wcj0ieHogLS1jaGVjaz1jcmMzMiAtLWx6bWEyPWRpY3Q9MU1pQiIKIAkJZWNobyAiJG91dHB1dF9maWxlIiB8IGdyZXAgLXEgIlwubHpvJCIgJiYgY29tcHI9Imx6b3AgLTkgLWYiCiAJCWVjaG8gIiRvdXRwdXRfZmlsZSIgfCBncmVwIC1xICJcLmNwaW8kIiAmJiBjb21wcj0iY2F0IgogCQlzaGlmdApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZAppbmRleCBlYWVlNDRlLi44MDliOTQ5IDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZApAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImdlbmtzeW1zLmgiCiAKIHN0YXRpYyBpbnQgaXNfdHlwZWRlZjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQppbmRleCAxMGQ3ZGM3Li4wOWEyNjVjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55CkBAIC0yNCw3ICsyNCw3IEBACiAlewogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiZ2Vua3N5bXMuaCIKIAogc3RhdGljIGludCBpc190eXBlZGVmOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbCBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKaW5kZXggZDIxZWMzYS4uMTM5ZTBmZiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAorKysgYi9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCkBAIC0xMyw3ICsxMyw3IEBACiB1c2Ugc3RyaWN0OwogCiBteSAkUCA9ICQwOwotbXkgJFYgPSAnMC4yNi1iZXRhNic7CitteSAkViA9ICcwLjI2JzsKIAogdXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2KTsKIApAQCAtNDAsNyArNDAsNyBAQAogbXkgJG91dHB1dF9tdWx0aWxpbmUgPSAxOwogbXkgJG91dHB1dF9zZXBhcmF0b3IgPSAiLCAiOwogbXkgJG91dHB1dF9yb2xlcyA9IDA7Ci1teSAkb3V0cHV0X3JvbGVzdGF0cyA9IDA7CitteSAkb3V0cHV0X3JvbGVzdGF0cyA9IDE7CiBteSAkc2NtID0gMDsKIG15ICR3ZWIgPSAwOwogbXkgJHN1YnN5c3RlbSA9IDA7CkBAIC00OTQsNiArNDk0LDQwIEBACiAKIGV4aXQoJGV4aXQpOwogCitzdWIgcmFuZ2VfaXNfbWFpbnRhaW5lZCB7CisgICAgbXkgKCRzdGFydCwgJGVuZCkgPSBAXzsKKworICAgIGZvciAobXkgJGkgPSAkc3RhcnQ7ICRpIDwgJGVuZDsgJGkrKykgeworCW15ICRsaW5lID0gJHR5cGV2YWx1ZVskaV07CisJaWYgKCRsaW5lID1+IG0vXihcQyk6XHMqKC4qKS8pIHsKKwkgICAgbXkgJHR5cGUgPSAkMTsKKwkgICAgbXkgJHZhbHVlID0gJDI7CisJICAgIGlmICgkdHlwZSBlcSAnUycpIHsKKwkJaWYgKCR2YWx1ZSA9fiAvKG1haW50YWlufHN1cHBvcnQpL2kpIHsKKwkJICAgIHJldHVybiAxOworCQl9CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdWIgcmFuZ2VfaGFzX21haW50YWluZXIgeworICAgIG15ICgkc3RhcnQsICRlbmQpID0gQF87CisKKyAgICBmb3IgKG15ICRpID0gJHN0YXJ0OyAkaSA8ICRlbmQ7ICRpKyspIHsKKwlteSAkbGluZSA9ICR0eXBldmFsdWVbJGldOworCWlmICgkbGluZSA9fiBtL14oXEMpOlxzKiguKikvKSB7CisJICAgIG15ICR0eXBlID0gJDE7CisJICAgIG15ICR2YWx1ZSA9ICQyOworCSAgICBpZiAoJHR5cGUgZXEgJ00nKSB7CisJCXJldHVybiAxOworCSAgICB9CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3ViIGdldF9tYWludGFpbmVycyB7CiAgICAgJWVtYWlsX2hhc2hfbmFtZSA9ICgpOwogICAgICVlbWFpbF9oYXNoX2FkZHJlc3MgPSAoKTsKQEAgLTU1Niw3ICs1OTAsOSBAQAogCQkJCW15ICRmaWxlX3BkID0gKCRmaWxlICA9fiB0ckAvQEApOwogCQkJCSR2YWx1ZV9wZCsrIGlmIChzdWJzdHIoJHZhbHVlLC0xLDEpIG5lICIvIik7CiAJCQkJJHZhbHVlX3BkID0gLTEgaWYgKCR2YWx1ZSA9fiAvXlwuXCovKTsKLQkJCQlpZiAoJHZhbHVlX3BkID49ICRmaWxlX3BkKSB7CisJCQkJaWYgKCR2YWx1ZV9wZCA+PSAkZmlsZV9wZCAmJgorCQkJCSAgICByYW5nZV9pc19tYWludGFpbmVkKCRzdGFydCwgJGVuZCkgJiYKKwkJCQkgICAgcmFuZ2VfaGFzX21haW50YWluZXIoJHN0YXJ0LCAkZW5kKSkgewogCQkJCSAgICAkZXhhY3RfcGF0dGVybl9tYXRjaF9oYXNoeyRmaWxlfSA9IDE7CiAJCQkJfQogCQkJCWlmICgkcGF0dGVybl9kZXB0aCA9PSAwIHx8CkBAIC03MjAsNyArNzU2LDggQEAKICAgLS1oZWxwID0+IHNob3cgdGhpcyBoZWxwIGluZm9ybWF0aW9uCiAKIERlZmF1bHQgb3B0aW9uczoKLSAgWy0tZW1haWwgLS1naXQgLS1tIC0tbiAtLWwgLS1tdWx0aWxpbmUgLS1wYXR0ZXJuLWRlcHRoPTAgLS1yZW1vdmUtZHVwbGljYXRlc10KKyAgWy0tZW1haWwgLS1ub2dpdCAtLWdpdC1mYWxsYmFjayAtLW0gLS1uIC0tbCAtLW11bHRpbGluZSAtcGF0dGVybi1kZXB0aD0wCisgICAtLXJlbW92ZS1kdXBsaWNhdGVzIC0tcm9sZXN0YXRzXQogCiBOb3RlczoKICAgVXNpbmcgIi1mIGRpcmVjdG9yeSIgbWF5IGdpdmUgdW5leHBlY3RlZCByZXN1bHRzOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9oZWFkZXJzLnNoIGIvc2NyaXB0cy9oZWFkZXJzLnNoCmluZGV4IDFkZGNkZDMuLjk3OGI0MmIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvaGVhZGVycy5zaAorKysgYi9zY3JpcHRzL2hlYWRlcnMuc2gKQEAgLTEzLDcgKzEzLDcgQEAKIAlmaQogfQogCi1hcmNocz0kKGxzICR7c3JjdHJlZX0vYXJjaCkKK2FyY2hzPSR7SERSX0FSQ0hfTElTVDotJChscyAke3NyY3RyZWV9L2FyY2gpfQogCiBmb3IgYXJjaCBpbiAke2FyY2hzfTsgZG8KIAljYXNlICR7YXJjaH0gaW4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvaGVhZGVyc19jaGVjay5wbCBiL3NjcmlwdHMvaGVhZGVyc19jaGVjay5wbAppbmRleCA1MGQ2Y2ZkLi43OTU3ZTdhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2hlYWRlcnNfY2hlY2sucGwKKysrIGIvc2NyaXB0cy9oZWFkZXJzX2NoZWNrLnBsCkBAIC02NCwxMCArNjQsMTAgQEAKIAogc3ViIGNoZWNrX2RlY2xhcmF0aW9ucwogewotCWlmICgkbGluZSA9fm0vXlxzKmV4dGVyblxiLykgeworCWlmICgkbGluZSA9fm0vXihccypleHRlcm58dW5zaWduZWR8Y2hhcnxzaG9ydHxpbnR8bG9uZ3x2b2lkKVxiLykgewogCQlwcmludGYgU1RERVJSICIkZmlsZW5hbWU6JGxpbmVubzogIiAuCi0JCSAgICAgICAgICAgICAgInVzZXJzcGFjZSBjYW5ub3QgY2FsbCBmdW5jdGlvbiBvciB2YXJpYWJsZSAiIC4KLQkJICAgICAgICAgICAgICAiZGVmaW5lZCBpbiB0aGUga2VybmVsXG4iOworCQkJICAgICAgInVzZXJzcGFjZSBjYW5ub3QgcmVmZXJlbmNlIGZ1bmN0aW9uIG9yICIgLgorCQkJICAgICAgInZhcmlhYmxlIGRlZmluZWQgaW4gdGhlIGtlcm5lbFxuIjsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvaGVhZGVyc19pbnN0YWxsLnBsIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKaW5kZXggNGNhM2JlMy4uZWZiM2JlMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKKysrIGIvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwKQEAgLTQ1LDYgKzQ1LDEzIEBACiAJY2xvc2UgJGluOwogCiAJc3lzdGVtICR1bmlmZGVmIC4gIiAkdG1wZmlsZSA+ICRpbnN0YWxsZGlyLyRmaWxlIjsKKwkjIHVuaWZkZWYgd2lsbCBleGl0IDAgb24gc3VjY2VzcywgYW5kIHdpbGwgZXhpdCAxIHdoZW4gdGhlCisJIyBmaWxlIHdhcyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBubyBjaGFuZ2VzIHdlcmUgbWFkZSwKKwkjIHNvIGFib3J0IG9ubHkgd2hlbiBpdCdzIGhpZ2hlciB0aGFuIHRoYXQuCisJbXkgJGUgPSAkPyA+PiA4OworCWlmICgkZSA+IDEpIHsKKwkJZGllICIkdG1wZmlsZTogJCFcbiI7CisJfQogCXVubGluayAkdG1wZmlsZTsKIH0KIGV4aXQgMDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDU0NTlhMzguLjY1OTMyNmMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtNTI5LDggKzUyOSw2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBzYXZlZGVmY29uZmlnOgotCQljb25mX3JlYWQoTlVMTCk7Ci0JCWJyZWFrOwogCWNhc2Ugc2lsZW50b2xkY29uZmlnOgogCWNhc2Ugb2xkYXNrY29uZmlnOgogCWNhc2Ugb2xkY29uZmlnOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwppbmRleCA5ZGY4MDExLi42MWMzNWJmIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtNDQwLDEyICs0NDAsMTEgQEAKIAlmcHV0cygiXCJcbiIsIG91dCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSwgZW51bSBzeW1ib2xfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0LCBib29sIHdyaXRlX25vKQorc3RhdGljIHZvaWQgY29uZl93cml0ZV9zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltLCBGSUxFICpvdXQsIGJvb2wgd3JpdGVfbm8pCiB7CiAJY29uc3QgY2hhciAqc3RyOwogCi0Jc3dpdGNoICh0eXBlKSB7CisJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAljYXNlIFNfQk9PTEVBTjoKIAljYXNlIFNfVFJJU1RBVEU6CiAJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7CkBAIC01MzIsNyArNTMxLDcgQEAKIAkJCQkJCWdvdG8gbmV4dF9tZW51OwogCQkJCX0KIAkJCX0KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgc3ltLT50eXBlLCBvdXQsIHRydWUpOworCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIHRydWUpOwogCQl9CiBuZXh0X21lbnU6CiAJCWlmIChtZW51LT5saXN0ICE9IE5VTEwpIHsKQEAgLTU2MSw3ICs1NjAsNiBAQAogCWNvbnN0IGNoYXIgKmJhc2VuYW1lOwogCWNvbnN0IGNoYXIgKnN0cjsKIAljaGFyIGRpcm5hbWVbUEFUSF9NQVgrMV0sIHRtcG5hbWVbUEFUSF9NQVgrMV0sIG5ld25hbWVbUEFUSF9NQVgrMV07Ci0JZW51bSBzeW1ib2xfdHlwZSB0eXBlOwogCXRpbWVfdCBub3c7CiAJaW50IHVzZV90aW1lc3RhbXAgPSAxOwogCWNoYXIgKmVudjsKQEAgLTYzMywxNCArNjMxLDggQEAKIAkJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQogCQkJCWdvdG8gbmV4dDsKIAkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKLQkJCXR5cGUgPSBzeW0tPnR5cGU7Ci0JCQlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7Ci0JCQkJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOwotCQkJCWlmIChtb2R1bGVzX3N5bS0+Y3Vyci50cmkgPT0gbm8pCi0JCQkJCXR5cGUgPSBTX0JPT0xFQU47Ci0JCQl9CiAJCQkvKiBXcml0ZSBjb25maWcgc3ltYm9sIHRvIGZpbGUgKi8KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgdHlwZSwgb3V0LCB0cnVlKTsKKwkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKIAkJfQogCiBuZXh0OgpAQCAtODMzLDggKzgyNSw3IEBACiAJCSAgICAgICAiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgQyBjb25maWc6IGRvbid0IGVkaXRcbiIKIAkJICAgICAgICIgKiAlc1xuIgogCQkgICAgICAgIiAqICVzIgotCQkgICAgICAgIiAqL1xuIgotCQkgICAgICAgIiNkZWZpbmUgQVVUT0NPTkZfSU5DTFVERURcbiIsCisJCSAgICAgICAiICovXG4iLAogCQkgICAgICAgcm9vdG1lbnUucHJvbXB0LT50ZXh0LCBjdGltZSgmbm93KSk7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CkBAIC04NDMsNyArODM0LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qIHdyaXRlIHN5bWJvbCB0byBjb25maWcgZmlsZSAqLwotCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIHN5bS0+dHlwZSwgb3V0LCBmYWxzZSk7CisJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCBmYWxzZSk7CiAKIAkJLyogdXBkYXRlIGF1dG9jb25mIGFuZCB0cmlzdGF0ZSBmaWxlcyAqLwogCQlzd2l0Y2ggKHN5bS0+dHlwZSkgewpAQCAtOTQ2LDcgKzkzNyw3IEBACiAJaW50IGNudCwgZGVmOwogCiAJLyoKLQkgKiBJZiBjaG9pY2UgaXMgbW9kIHRoZW4gd2UgbWF5IGhhdmUgbW9yZSBpdGVtcyBzbGVjdGVkCisJICogSWYgY2hvaWNlIGlzIG1vZCB0aGVuIHdlIG1heSBoYXZlIG1vcmUgaXRlbXMgc2VsZWN0ZWQKIAkgKiBhbmQgaWYgbm8gdGhlbiBuby1vbmUuCiAJICogSW4gYm90aCBjYXNlcyBzdG9wLgogCSAqLwpAQCAtMTA0MiwxMCArMTAzMywxMCBAQAogCiAJLyoKIAkgKiBXZSBoYXZlIGRpZmZlcmVudCB0eXBlIG9mIGNob2ljZSBibG9ja3MuCi0JICogSWYgY3Vyci50cmkgZXF1YWwgdG8gbW9kIHRoZW4gd2UgY2FuIHNlbGVjdCBzZXZlcmFsCisJICogSWYgY3Vyci50cmkgZXF1YWxzIHRvIG1vZCB0aGVuIHdlIGNhbiBzZWxlY3Qgc2V2ZXJhbAogCSAqIGNob2ljZSBzeW1ib2xzIGluIG9uZSBibG9jay4KIAkgKiBJbiB0aGlzIGNhc2Ugd2UgZG8gbm90aGluZy4KLQkgKiBJZiBjdXJyLnRyaSBlcXVhbCB5ZXMgdGhlbiBvbmx5IG9uZSBzeW1ib2wgY2FuIGJlCisJICogSWYgY3Vyci50cmkgZXF1YWxzIHllcyB0aGVuIG9ubHkgb25lIHN5bWJvbCBjYW4gYmUKIAkgKiBzZWxlY3RlZCBpbiBhIGNob2ljZSBibG9jayBhbmQgd2Ugc2V0IGl0IHRvIHllcywKIAkgKiBhbmQgdGhlIHJlc3QgdG8gbm8uCiAJICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5jIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwppbmRleCAzMzBlN2MwLi4wMDEwMDM0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAlyZXR1cm4gZTIgPyBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpIDogZTE7CiB9CiAKLXN0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZykKK3N0cnVjdCBleHByICpleHByX2NvcHkoY29uc3Qgc3RydWN0IGV4cHIgKm9yZykKIHsKIAlzdHJ1Y3QgZXhwciAqZTsKIApAQCAtMTAxMyw2ICsxMDEzLDQ4IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwciAqCitleHByX2dldF9sZWZ0bW9zdF9zeW1ib2woY29uc3Qgc3RydWN0IGV4cHIgKmUpCit7CisKKwlpZiAoZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChlLT50eXBlICE9IEVfU1lNQk9MKQorCQllID0gZS0+bGVmdC5leHByOworCisJcmV0dXJuIGV4cHJfY29weShlKTsKK30KKworLyoKKyAqIEdpdmVuIGV4cHJlc3Npb24gYGUxJyBhbmQgYGUyJywgcmV0dXJucyB0aGUgbGVhZiBvZiB0aGUgbG9uZ2VzdAorICogc3ViLWV4cHJlc3Npb24gb2YgYGUxJyBub3QgY29udGFpbmluZyAnZTIuCisgKi8KK3N0cnVjdCBleHByICpleHByX3NpbXBsaWZ5X3VubWV0X2RlcChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlzdHJ1Y3QgZXhwciAqcmV0OworCisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwkJcmV0dXJuIGV4cHJfYWxsb2NfYW5kKAorCQkgICAgZXhwcl9zaW1wbGlmeV91bm1ldF9kZXAoZTEtPmxlZnQuZXhwciwgZTIpLAorCQkgICAgZXhwcl9zaW1wbGlmeV91bm1ldF9kZXAoZTEtPnJpZ2h0LmV4cHIsIGUyKSk7CisJY2FzZSBFX0FORDogeworCQlzdHJ1Y3QgZXhwciAqZTsKKwkJZSA9IGV4cHJfYWxsb2NfYW5kKGV4cHJfY29weShlMSksIGV4cHJfY29weShlMikpOworCQllID0gZXhwcl9lbGltaW5hdGVfZHVwcyhlKTsKKwkJcmV0ID0gKCFleHByX2VxKGUsIGUxKSkgPyBlMSA6IE5VTEw7CisJCWV4cHJfZnJlZShlKTsKKwkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlyZXQgPSBlMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGV4cHJfZ2V0X2xlZnRtb3N0X3N5bWJvbChyZXQpOworfQorCiB2b2lkIGV4cHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNvbnN0IGNoYXIgKiksIHZvaWQgKmRhdGEsIGludCBwcmV2dG9rZW4pCiB7CiAJaWYgKCFlKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAppbmRleCBlNTc4MjZjLi4zZDIzOGRiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpOwogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKIHN0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKLXN0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZyk7CitzdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KGNvbnN0IHN0cnVjdCBleHByICpvcmcpOwogdm9pZCBleHByX2ZyZWUoc3RydWN0IGV4cHIgKmUpOwogaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwogdm9pZCBleHByX2VsaW1pbmF0ZV9lcShzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwpAQCAtMjA3LDYgKzIwNyw3IEBACiBzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX29yKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CiB2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwogc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBleHByICpleHByX3NpbXBsaWZ5X3VubWV0X2RlcChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CiAKIHZvaWQgZXhwcl9mcHJpbnQoc3RydWN0IGV4cHIgKmUsIEZJTEUgKm91dCk7CiBzdHJ1Y3QgZ3N0cjsgLyogZm9yd2FyZCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCmluZGV4IDNmNzI0MGQuLmZlYmYwYzkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTE0LDYgKzE0LDcgQEAKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZ2V0dGV4dChjb25zdCBjaGFyICp0eHQpIHsgcmV0dXJuIHR4dDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRleHRkb21haW4oY29uc3QgY2hhciAqZG9tYWlubmFtZSkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBiaW5kdGV4dGRvbWFpbihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkaXIpIHt9CitzdGF0aWMgaW5saW5lIGNoYXIgKmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KGNvbnN0IGNoYXIgKmRuLCBjaGFyICpjKSB7IHJldHVybiBjOyB9CiAjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC02NywxMCArNjgsMTIgQEAKIAllbnVtIHN5bWJvbF90eXBlIHN0eXBlOwogfTsKIAorI2lmZGVmIFlZREVCVUcKK2V4dGVybiBpbnQgemNvbmZkZWJ1ZzsKKyNlbmRpZgorCiBpbnQgemNvbmZwYXJzZSh2b2lkKTsKIHZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCk7Ci0KLWV4dGVybiBpbnQgemNvbmZkZWJ1ZzsKIHZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpOwogRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKaW5kZXggNWY3N2RjYi4uNWZkZjEwZCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbWVudV9yYW5nZV92YWxpZF9zeW0oc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3Qgc3ltYm9sICpzeW0yKQorc3RhdGljIGludCBtZW51X3ZhbGlkYXRlX251bWJlcihzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBzeW1ib2wgKnN5bTIpCiB7CiAJcmV0dXJuIHN5bTItPnR5cGUgPT0gU19JTlQgfHwgc3ltMi0+dHlwZSA9PSBTX0hFWCB8fAogCSAgICAgICAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04gJiYgc3ltX3N0cmluZ192YWxpZChzeW0sIHN5bTItPm5hbWUpKTsKQEAgLTIyMSw2ICsyMjEsMTUgQEAKIAkJCQlwcm9wX3dhcm4ocHJvcCwKIAkJCQkgICAgImRlZmF1bHQgZm9yIGNvbmZpZyBzeW1ib2wgJyVzJyIKIAkJCQkgICAgIiBtdXN0IGJlIGEgc2luZ2xlIHN5bWJvbCIsIHN5bS0+bmFtZSk7CisJCQlpZiAocHJvcC0+ZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCQlicmVhazsKKwkJCXN5bTIgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoc3ltLT50eXBlID09IFNfSEVYIHx8IHN5bS0+dHlwZSA9PSBTX0lOVCkgeworCQkJCWlmICghbWVudV92YWxpZGF0ZV9udW1iZXIoc3ltLCBzeW0yKSkKKwkJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJCSAgICAiJyVzJzogbnVtYmVyIGlzIGludmFsaWQiLAorCQkJCQkgICAgc3ltLT5uYW1lKTsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFBfU0VMRUNUOgogCQkJc3ltMiA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKQEAgLTI0MCw4ICsyNDksOCBAQAogCQkJaWYgKHN5bS0+dHlwZSAhPSBTX0lOVCAmJiBzeW0tPnR5cGUgIT0gU19IRVgpCiAJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBvbmx5IGFsbG93ZWQgIgogCQkJCSAgICAgICAgICAgICAgICAiZm9yIGludCBvciBoZXggc3ltYm9scyIpOwotCQkJaWYgKCFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltKSB8fAotCQkJICAgICFtZW51X3JhbmdlX3ZhbGlkX3N5bShzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bSkpCisJCQlpZiAoIW1lbnVfdmFsaWRhdGVfbnVtYmVyKHN5bSwgcHJvcC0+ZXhwci0+bGVmdC5zeW0pIHx8CisJCQkgICAgIW1lbnVfdmFsaWRhdGVfbnVtYmVyKHN5bSwgcHJvcC0+ZXhwci0+cmlnaHQuc3ltKSkKIAkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIGludmFsaWQiKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwppbmRleCAyNzJhOTg3Li5kYjU2Mzc3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAiT25seSByZWxldmFudCBsaW5lcyBhcmUgc2hvd24uXG4iCiAiXG5cbiIKICJTZWFyY2ggZXhhbXBsZXM6XG4iCi0iRXhhbXBsZXM6IFVTQiAgID0gPiBmaW5kIGFsbCBzeW1ib2xzIGNvbnRhaW5pbmcgVVNCXG4iCisiRXhhbXBsZXM6IFVTQiAgPT4gZmluZCBhbGwgc3ltYm9scyBjb250YWluaW5nIFVTQlxuIgogIiAgICAgICAgICBeVVNCID0+IGZpbmQgYWxsIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBVU0JcbiIKICIgICAgICAgICAgVVNCJCA9PiBmaW5kIGFsbCBzeW1ib2xzIGVuZGluZyB3aXRoIFVTQlxuIgogIlxuIik7CkBAIC0xMjY2LDkgKzEyNjYsMTMgQEAKIAkJCWlmIChjaGlsZC0+c3ltID09IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKG1lbnUtPnN5bSkpCiAJCQkJaXRlbV9tYWtlKGNoaWxkLCAnOicsICI8WD4gJXMiLAogCQkJCQkJXyhtZW51X2dldF9wcm9tcHQoY2hpbGQpKSk7Ci0JCQllbHNlCisJCQllbHNlIGlmIChjaGlsZC0+c3ltKQogCQkJCWl0ZW1fbWFrZShjaGlsZCwgJzonLCAiICAgICVzIiwKIAkJCQkJCV8obWVudV9nZXRfcHJvbXB0KGNoaWxkKSkpOworCQkJZWxzZQorCQkJCWl0ZW1fbWFrZShjaGlsZCwgJzonLCAiKioqICVzICoqKiIsCisJCQkJCQlfKG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpKTsKKwogCQkJaWYgKGNoaWxkLT5zeW0gPT0gYWN0aXZlKXsKIAkJCQlsYXN0X3RvcF9yb3cgPSB0b3Bfcm93KGN1cnNlc19tZW51KTsKIAkJCQlzZWxlY3RlZF9pbmRleCA9IGk7CkBAIC0xMzM0LDcgKzEzMzgsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2hpbGQgPSBpdGVtX2RhdGEoKTsKLQkJaWYgKCFjaGlsZCB8fCAhbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJaWYgKCFjaGlsZCB8fCAhbWVudV9pc192aXNpYmxlKGNoaWxkKSB8fCAhY2hpbGQtPnN5bSkKIAkJCWNvbnRpbnVlOwogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlICcgJzoKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwppbmRleCBhZjZlOWYzLi5hNzk2Yzk1IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCkBAIC0zNTEsMTIgKzM1MSwxNiBAQAogCQkJfQogCQljYWxjX25ld3ZhbDoKIAkJCWlmIChzeW0tPmRpcl9kZXAudHJpID09IG5vICYmIHN5bS0+cmV2X2RlcC50cmkgIT0gbm8pIHsKKwkJCQlzdHJ1Y3QgZXhwciAqZTsKKwkJCQllID0gZXhwcl9zaW1wbGlmeV91bm1ldF9kZXAoc3ltLT5yZXZfZGVwLmV4cHIsCisJCQkJICAgIHN5bS0+ZGlyX2RlcC5leHByKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICgiKTsKLQkJCQlleHByX2ZwcmludChzeW0tPnJldl9kZXAuZXhwciwgc3RkZXJyKTsKKwkJCQlleHByX2ZwcmludChlLCBzdGRlcnIpOwogCQkJCWZwcmludGYoc3RkZXJyLCAiKSBzZWxlY3RzICVzIHdoaWNoIGhhcyB1bm1ldCBkaXJlY3QgZGVwZW5kZW5jaWVzICgiLAogCQkJCQlzeW0tPm5hbWUpOwogCQkJCWV4cHJfZnByaW50KHN5bS0+ZGlyX2RlcC5leHByLCBzdGRlcnIpOwogCQkJCWZwcmludGYoc3RkZXJyLCAiKVxuIik7CisJCQkJZXhwcl9mcmVlKGUpOwogCQkJfQogCQkJbmV3dmFsLnRyaSA9IEVYUFJfT1IobmV3dmFsLnRyaSwgc3ltLT5yZXZfZGVwLnRyaSk7CiAJCX0KQEAgLTY4Niw3ICs2OTAsNyBAQAogCQlzd2l0Y2ggKHN5bS0+dHlwZSkgewogCQljYXNlIFNfQk9PTEVBTjoKIAkJY2FzZSBTX1RSSVNUQVRFOgotCQkJLyogVGhlIHZpc2liaWxpdHkgaW1heSBsaW1pdCB0aGUgdmFsdWUgZnJvbSB5ZXMgPT4gbW9kICovCisJCQkvKiBUaGUgdmlzaWJpbGl0eSBtYXkgbGltaXQgdGhlIHZhbHVlIGZyb20geWVzID0+IG1vZCAqLwogCQkJdmFsID0gRVhQUl9BTkQoZXhwcl9jYWxjX3ZhbHVlKHByb3AtPmV4cHIpLCBwcm9wLT52aXNpYmxlLnRyaSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWt1Ym9vdC5zaCBiL3NjcmlwdHMvbWt1Ym9vdC5zaAppbmRleCAyZTNkM2NkLi40NDY3MzljIDEwMDc1NQotLS0gYS9zY3JpcHRzL21rdWJvb3Quc2gKKysrIGIvc2NyaXB0cy9ta3Vib290LnNoCkBAIC0xMSw3ICsxMSw3IEBACiAJaWYgWyAteiAiJHtNS0lNQUdFfSIgXTsgdGhlbgogCQkjIERvZXNuJ3QgZXhpc3QKIAkJZWNobyAnIm1raW1hZ2UiIGNvbW1hbmQgbm90IGZvdW5kIC0gVS1Cb290IGltYWdlcyB3aWxsIG5vdCBiZSBidWlsdCcgPiYyCi0JCWV4aXQgMDsKKwkJZXhpdCAxOwogCWZpCiBmaQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKaW5kZXggMzMxMjJjYS4uZThmYmE5NSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwpAQCAtNzkwLDYgKzc5MCw3IEBACiB7CiAJIi5jb21tZW50KiIsCiAJIi5kZWJ1ZyoiLAorCSIuemRlYnVnKiIsCQkvKiBDb21wcmVzc2VkIGRlYnVnIHNlY3Rpb25zLiAqLwogCSIuR0NDLWNvbW1hbmQtbGluZSIsCS8qIG1uMTAzMDAgKi8KIAkiLm1kZWJ1ZyoiLCAgICAgICAgLyogYWxwaGEsIHNjb3JlLCBtaXBzIGV0Yy4gKi8KIAkiLnBkciIsICAgICAgICAgICAgLyogYWxwaGEsIHNjb3JlLCBtaXBzIGV0Yy4gKi8KQEAgLTE0NDEsNyArMTQ0Miw3IEBACiAJaW50IHNlY3Rpb24gPSBzaG5keDJzZWNpbmRleChzZWNoZHItPnNoX2luZm8pOwogCiAJcmV0dXJuICh2b2lkICopZWxmLT5oZHIgKyBzZWNoZHJzW3NlY3Rpb25dLnNoX29mZnNldCArCi0JCXItPnJfb2Zmc2V0IC0gc2VjaGRyc1tzZWN0aW9uXS5zaF9hZGRyOworCQlyLT5yX29mZnNldDsKIH0KIAogc3RhdGljIGludCBhZGRlbmRfMzg2X3JlbChzdHJ1Y3QgZWxmX2luZm8gKmVsZiwgRWxmX1NoZHIgKnNlY2hkciwgRWxmX1JlbGEgKnIpCkBAIC0xNjE0LDcgKzE2MTUsNyBAQAogICogQSBtb2R1bGUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBhcmUgZGlzY2FyZGVkCiAgKiBlaXRoZXIgd2hlbiBsb2FkZWQgb3Igd2hlbiB1c2VkIGFzIGJ1aWx0LWluLgogICogRm9yIGxvYWRlZCBtb2R1bGVzIGFsbCBmdW5jdGlvbnMgbWFya2VkIF9faW5pdCBhbmQgYWxsIGRhdGEKLSAqIG1hcmtlZCBfX2luaXRkYXRhIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIG1vZHVsZSBoYXMgYmVlbiBpbnRpYWxpemVkLgorICogbWFya2VkIF9faW5pdGRhdGEgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbW9kdWxlIGhhcyBiZWVuIGluaXRpYWxpemVkLgogICogTGlrZXdpc2UgZm9yIG1vZHVsZXMgdXNlZCBidWlsdC1pbiB0aGUgc2VjdGlvbnMgbWFya2VkIF9fZXhpdAogICogYXJlIGRpc2NhcmRlZCBiZWNhdXNlIF9fZXhpdCBtYXJrZWQgZnVuY3Rpb24gYXJlIHN1cHBvc2VkIHRvIGJlIGNhbGxlZAogICogb25seSB3aGVuIGEgbW9kdWxlIGlzIHVubG9hZGVkIHdoaWNoIG5ldmVyIGhhcHBlbnMgZm9yIGJ1aWx0LWluIG1vZHVsZXMuCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKaW5kZXggNDliNzRlMS4uYjBiMjM1NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCisrKyBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgpAQCAtMjUsOCArMjUsNDQgQEAKIAljaG93biAtUiByb290OnJvb3QgIiRwZGlyIgogCWNobW9kIC1SIGdvLXcgIiRwZGlyIgogCisJIyBBdHRlbXB0IHRvIGZpbmQgdGhlIGNvcnJlY3QgRGViaWFuIGFyY2hpdGVjdHVyZQorCWxvY2FsIGZvcmNlYXJjaD0iIiBkZWJhcmNoPSIiCisJY2FzZSAiJFVUU19NQUNISU5FIiBpbgorCWkzODZ8aWE2NHxhbHBoYSkKKwkJZGViYXJjaD0iJFVUU19NQUNISU5FIiA7OworCXg4Nl82NCkKKwkJZGViYXJjaD1hbWQ2NCA7OworCXNwYXJjKikKKwkJZGViYXJjaD1zcGFyYyA7OworCXMzOTAqKQorCQlkZWJhcmNoPXMzOTAgOzsKKwlwcGMqKQorCQlkZWJhcmNoPXBvd2VycGMgOzsKKwlwYXJpc2MqKQorCQlkZWJhcmNoPWhwcGEgOzsKKwltaXBzKikKKwkJZGViYXJjaD1taXBzJChncmVwIC1xIENQVV9MSVRUTEVfRU5ESUFOPXkgLmNvbmZpZyAmJiBlY2hvIGVsKSA7OworCWFybSopCisJCWRlYmFyY2g9YXJtJChncmVwIC1xIENPTkZJR19BRUFCST15IC5jb25maWcgJiYgZWNobyBlbCkgOzsKKwkqKQorCQllY2hvICIiID4mMgorCQllY2hvICIqKiAqKiAqKiAgV0FSTklORyAgKiogKiogKioiID4mMgorCQllY2hvICIiID4mMgorCQllY2hvICJZb3VyIGFyY2hpdGVjdHVyZSBkb2Vzbid0IGhhdmUgaXQncyBlcXVpdmFsZW50IiA+JjIKKwkJZWNobyAiRGViaWFuIHVzZXJzcGFjZSBhcmNoaXRlY3R1cmUgZGVmaW5lZCEiID4mMgorCQllY2hvICJGYWxsaW5nIGJhY2sgdG8gdXNpbmcgeW91ciBjdXJyZW50IHVzZXJzcGFjZSBpbnN0ZWFkISIgPiYyCisJCWVjaG8gIlBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgJFVUU19NQUNISU5FIHRvICR7MH0gLi4uIiA+JjIKKwkJZWNobyAiIiA+JjIKKwllc2FjCisJaWYgWyAtbiAiJEtCVUlMRF9ERUJBUkNIIiBdIDsgdGhlbgorCQlkZWJhcmNoPSIkS0JVSUxEX0RFQkFSQ0giCisJZmkKKwlpZiBbIC1uICIkZGViYXJjaCIgXSA7IHRoZW4KKwkJZm9yY2VhcmNoPSItREFyY2hpdGVjdHVyZT0kZGViYXJjaCIKKwlmaQorCiAJIyBDcmVhdGUgdGhlIHBhY2thZ2UKLQlkcGtnLWdlbmNvbnRyb2wgLWlzcCAtcCRwbmFtZSAtUCIkcGRpciIKKwlkcGtnLWdlbmNvbnRyb2wgLWlzcCAkZm9yY2VhcmNoIC1wJHBuYW1lIC1QIiRwZGlyIgogCWRwa2cgLS1idWlsZCAiJHBkaXIiIC4uCiB9CiAKQEAgLTQwLDE3ICs3NiwyNyBAQAogZmkKIHRtcGRpcj0iJG9ianRyZWUvZGViaWFuL3RtcCIKIGZ3ZGlyPSIkb2JqdHJlZS9kZWJpYW4vZnd0bXAiCitrZXJuZWxfaGVhZGVyc19kaXI9IiRvYmp0cmVlL2RlYmlhbi9oZHJ0bXAiCitsaWJjX2hlYWRlcnNfZGlyPSIkb2JqdHJlZS9kZWJpYW4vaGVhZGVydG1wIgogcGFja2FnZW5hbWU9bGludXgtaW1hZ2UtJHZlcnNpb24KIGZ3cGFja2FnZW5hbWU9bGludXgtZmlybXdhcmUtaW1hZ2UKK2tlcm5lbF9oZWFkZXJzX3BhY2thZ2VuYW1lPWxpbnV4LWhlYWRlcnMtJHZlcnNpb24KK2xpYmNfaGVhZGVyc19wYWNrYWdlbmFtZT1saW51eC1saWJjLWRldgogCiBpZiBbICIkQVJDSCIgPSAidW0iIF0gOyB0aGVuCiAJcGFja2FnZW5hbWU9dXNlci1tb2RlLWxpbnV4LSR2ZXJzaW9uCiBmaQogCiAjIFNldHVwIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi1ybSAtcmYgIiR0bXBkaXIiICIkZndkaXIiCi1ta2RpciAtcCAiJHRtcGRpci9ERUJJQU4iICIkdG1wZGlyL2xpYiIgIiR0bXBkaXIvYm9vdCIgIiR0bXBkaXIvdXNyL3NoYXJlL2RvYy8kcGFja2FnZW5hbWUiCi1ta2RpciAtcCAiJGZ3ZGlyL0RFQklBTiIgIiRmd2Rpci9saWIiICIkZndkaXIvdXNyL3NoYXJlL2RvYy8kZndwYWNrYWdlbmFtZSIKK3JtIC1yZiAiJHRtcGRpciIgIiRmd2RpciIgIiRrZXJuZWxfaGVhZGVyc19kaXIiICIkbGliY19oZWFkZXJzX2RpciIKK21rZGlyIC1tIDc1NSAtcCAiJHRtcGRpci9ERUJJQU4iCitta2RpciAtcCAgIiR0bXBkaXIvbGliIiAiJHRtcGRpci9ib290IiAiJHRtcGRpci91c3Ivc2hhcmUvZG9jLyRwYWNrYWdlbmFtZSIKK21rZGlyIC1tIDc1NSAtcCAiJGZ3ZGlyL0RFQklBTiIKK21rZGlyIC1wICIkZndkaXIvbGliIiAiJGZ3ZGlyL3Vzci9zaGFyZS9kb2MvJGZ3cGFja2FnZW5hbWUiCitta2RpciAtbSA3NTUgLXAgIiRsaWJjX2hlYWRlcnNfZGlyL0RFQklBTiIKK21rZGlyIC1wICIkbGliY19oZWFkZXJzX2Rpci91c3Ivc2hhcmUvZG9jLyRsaWJjX2hlYWRlcnNfcGFja2FnZW5hbWUiCitta2RpciAtbSA3NTUgLXAgIiRrZXJuZWxfaGVhZGVyc19kaXIvREVCSUFOIgorbWtkaXIgLXAgIiRrZXJuZWxfaGVhZGVyc19kaXIvdXNyL3NoYXJlL2RvYy8ka2VybmVsX2hlYWRlcnNfcGFja2FnZW5hbWUiCiBpZiBbICIkQVJDSCIgPSAidW0iIF0gOyB0aGVuCiAJbWtkaXIgLXAgIiR0bXBkaXIvdXNyL2xpYi91bWwvbW9kdWxlcy8kdmVyc2lvbiIgIiR0bXBkaXIvdXNyL2JpbiIKIGZpCkBAIC04MSw2ICsxMjcsOSBAQAogCWZpCiBmaQogCittYWtlIGhlYWRlcnNfY2hlY2sKK21ha2UgaGVhZGVyc19pbnN0YWxsIElOU1RBTExfSERSX1BBVEg9IiRsaWJjX2hlYWRlcnNfZGlyL3VzciIKKwogIyBJbnN0YWxsIHRoZSBtYWludGFpbmVyIHNjcmlwdHMKICMgTm90ZTogaG9vayBzY3JpcHRzIHVuZGVyIC9ldGMva2VybmVsIGFyZSBhbHNvIGV4ZWN1dGVkIGJ5IG9mZmljaWFsIERlYmlhbgogIyBrZXJuZWwgcGFja2FnZXMsIGFzIHdlbGwgYXMga2VybmVsIHBhY2thZ2VzIGJ1aWx0IHVzaW5nIG1ha2Uta3BrZwpAQCAtMTg4LDYgKzIzNywzMCBAQAogCiBmaQogCisjIEJ1aWxkIGhlYWRlciBwYWNrYWdlCitmaW5kIC4gLW5hbWUgTWFrZWZpbGUgLW8gLW5hbWUgS2NvbmZpZ1wqIC1vIC1uYW1lIFwqLnBsID4gL3RtcC9maWxlcyQkCitmaW5kIGFyY2gveDg2L2luY2x1ZGUgaW5jbHVkZSBzY3JpcHRzIC10eXBlIGYgPj4gL3RtcC9maWxlcyQkCisoY2QgJG9ianRyZWU7IGZpbmQgLmNvbmZpZyBNb2R1bGUuc3ltdmVycyBpbmNsdWRlIHNjcmlwdHMgLXR5cGUgZiA+PiAvdG1wL29iamZpbGVzJCQpCitkZXN0ZGlyPSRrZXJuZWxfaGVhZGVyc19kaXIvdXNyL3NyYy9saW51eC1oZWFkZXJzLSR2ZXJzaW9uCitta2RpciAtcCAiJGRlc3RkaXIiCit0YXIgLWMgLWYgLSAtVCAvdG1wL2ZpbGVzJCQgfCAoY2QgJGRlc3RkaXI7IHRhciAteGYgLSkKKyhjZCAkb2JqdHJlZTsgdGFyIC1jIC1mIC0gLVQgL3RtcC9vYmpmaWxlcyQkKSB8IChjZCAkZGVzdGRpcjsgdGFyIC14ZiAtKQorcm0gLWYgL3RtcC9maWxlcyQkIC90bXAvb2JqZmlsZXMkJAorYXJjaD0kKGRwa2cgLS1wcmludC1hcmNoaXRlY3R1cmUpCisKK2NhdCA8PEVPRiA+PiBkZWJpYW4vY29udHJvbAorCitQYWNrYWdlOiAka2VybmVsX2hlYWRlcnNfcGFja2FnZW5hbWUKK1Byb3ZpZGVzOiBsaW51eC1oZWFkZXJzLCBsaW51eC1oZWFkZXJzLTIuNgorQXJjaGl0ZWN0dXJlOiAkYXJjaAorRGVzY3JpcHRpb246IExpbnV4IGtlcm5lbCBoZWFkZXJzIGZvciAkS0VSTkVMUkVMRUFTRSBvbiAkYXJjaAorIFRoaXMgcGFja2FnZSBwcm92aWRlcyBrZXJuZWwgaGVhZGVyIGZpbGVzIGZvciAkS0VSTkVMUkVMRUFTRSBvbiAkYXJjaAorIC4KKyBUaGlzIGlzIHVzZWZ1bCBmb3IgcGVvcGxlIHdobyBuZWVkIHRvIGJ1aWxkIGV4dGVybmFsIG1vZHVsZXMKK0VPRgorCitjcmVhdGVfcGFja2FnZSAiJGtlcm5lbF9oZWFkZXJzX3BhY2thZ2VuYW1lIiAiJGtlcm5lbF9oZWFkZXJzX2RpciIKKwogIyBEbyB3ZSBoYXZlIGZpcm13YXJlPyBNb3ZlIGl0IG91dCBvZiB0aGUgd2F5IGFuZCBidWlsZCBpdCBpbnRvIGEgcGFja2FnZS4KIGlmIFsgLWUgIiR0bXBkaXIvbGliL2Zpcm13YXJlIiBdOyB0aGVuCiAJbXYgIiR0bXBkaXIvbGliL2Zpcm13YXJlIiAiJGZ3ZGlyL2xpYi8iCkBAIC0yMDMsNiArMjc2LDE4IEBACiAJY3JlYXRlX3BhY2thZ2UgIiRmd3BhY2thZ2VuYW1lIiAiJGZ3ZGlyIgogZmkKIAorY2F0IDw8RU9GID4+IGRlYmlhbi9jb250cm9sCisKK1BhY2thZ2U6ICRsaWJjX2hlYWRlcnNfcGFja2FnZW5hbWUKK1NlY3Rpb246IGRldmVsCitQcm92aWRlczogbGludXgta2VybmVsLWhlYWRlcnMKK0FyY2hpdGVjdHVyZTogYW55CitEZXNjcmlwdGlvbjogTGludXggc3VwcG9ydCBoZWFkZXJzIGZvciB1c2Vyc3BhY2UgZGV2ZWxvcG1lbnQKKyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdXNlcnNwYWNlcyBoZWFkZXJzIGZyb20gdGhlIExpbnV4IGtlcm5lbC4gIFRoZXNlIGhlYWRlcnMKKyBhcmUgdXNlZCBieSB0aGUgaW5zdGFsbGVkIGhlYWRlcnMgZm9yIEdOVSBnbGliYyBhbmQgb3RoZXIgc3lzdGVtIGxpYnJhcmllcy4KK0VPRgorCitjcmVhdGVfcGFja2FnZSAiJGxpYmNfaGVhZGVyc19wYWNrYWdlbmFtZSIgIiRsaWJjX2hlYWRlcnNfZGlyIgogY3JlYXRlX3BhY2thZ2UgIiRwYWNrYWdlbmFtZSIgIiR0bXBkaXIiCiAKIGV4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IGJiYmU1ODQuLjkyZmRjNDUgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTEyMyw3ICsxMjMsNyBAQAogCS1JIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXAgICAgICAgICAgICAgICAgXAogCS1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgICAgICAgICAgXAogCS1JIERFRklORV9UUkFDRSxFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0wsRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTCBcCi0JLS1leHRyYT0rZiAtLWMta2luZHM9LXB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLS1leHRyYT0rZiAtLWMta2luZHM9K3B4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJLS1yZWdleC1hc209Jy9eRU5UUllcKChbXildKilcKS4qL1wxLycgICAgICAgICAgICAgICAgICBcCiAJLS1yZWdleC1jPScvXlNZU0NBTExfREVGSU5FW1s6ZGlnaXQ6XV0/XCgoW14sKV0qKS4qL3N5c19cMS8nIFwKIAktLXJlZ2V4LWMrKz0nL15UUkFDRV9FVkVOVFwoKFteLCldKikuKi90cmFjZV9cMS8nCQlcCmRpZmYgLS1naXQgYS9zY3JpcHRzL3h6X3dyYXAuc2ggYi9zY3JpcHRzL3h6X3dyYXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhNTc5OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMveHpfd3JhcC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMKKyMgVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHh6IHRvIGNvbXByZXNzIHRoZSBrZXJuZWwgaW1hZ2UgdXNpbmcgYXBwcm9wcmlhdGUKKyMgY29tcHJlc3Npb24gb3B0aW9ucyBkZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZS4KKyMKKyMgQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyMKKyMgVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorIyBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorIworCitCQ0o9CitMWk1BMk9QVFM9CisKK2Nhc2UgJEFSQ0ggaW4KKwl4ODZ8eDg2XzY0KSAgICAgQkNKPS0teDg2IDs7CisJcG93ZXJwYykgICAgICAgIEJDSj0tLXBvd2VycGMgOzsKKwlpYTY0KSAgICAgICAgICAgQkNKPS0taWE2NDsgTFpNQTJPUFRTPXBiPTQgOzsKKwlhcm0pICAgICAgICAgICAgQkNKPS0tYXJtIDs7CisJc3BhcmMpICAgICAgICAgIEJDSj0tLXNwYXJjIDs7Citlc2FjCisKK2V4ZWMgeHogLS1jaGVjaz1jcmMzMiAkQkNKIC0tbHptYTI9JExaTUEyT1BUUyxkaWN0PTMyTWlCCmRpZmYgLS1naXQgYS9zZWN1cml0eS9LY29uZmlnIGIvc2VjdXJpdHkvS2NvbmZpZwppbmRleCBlODBkYTk1Li45NWFjY2Q0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L0tjb25maWcKQEAgLTIxLDYgKzIxLDM3IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyByZXF1aXJlZCwgYW5zd2VyIE4uCiAKK2NvbmZpZyBUUlVTVEVEX0tFWVMKKwl0cmlzdGF0ZSAiVFJVU1RFRCBLRVlTIgorCWRlcGVuZHMgb24gS0VZUyAmJiBUQ0dfVFBNCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fSE1BQworCXNlbGVjdCBDUllQVE9fU0hBMQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nLCBzZWFsaW5nLCBhbmQgdW5zZWFsaW5nCisJICBrZXlzIGluIHRoZSBrZXJuZWwuIFRydXN0ZWQga2V5cyBhcmUgcmFuZG9tIG51bWJlciBzeW1tZXRyaWMga2V5cywKKwkgIGdlbmVyYXRlZCBhbmQgUlNBLXNlYWxlZCBieSB0aGUgVFBNLiBUaGUgVFBNIG9ubHkgdW5zZWFscyB0aGUga2V5cywKKwkgIGlmIHRoZSBib290IFBDUnMgYW5kIG90aGVyIGNyaXRlcmlhIG1hdGNoLiAgVXNlcnNwYWNlIHdpbGwgb25seSBldmVyCisJICBzZWUgZW5jcnlwdGVkIGJsb2JzLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIHRoaXMgaXMgcmVxdWlyZWQsIGFuc3dlciBOLgorCitjb25maWcgRU5DUllQVEVEX0tFWVMKKwl0cmlzdGF0ZSAiRU5DUllQVEVEIEtFWVMiCisJZGVwZW5kcyBvbiBLRVlTICYmIFRSVVNURURfS0VZUworCXNlbGVjdCBDUllQVE9fQUVTCisJc2VsZWN0IENSWVBUT19DQkMKKwlzZWxlY3QgQ1JZUFRPX1NIQTI1NgorCXNlbGVjdCBDUllQVE9fUk5HCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRlL2VuY3J5cHRpbmcvZGVjcnlwdGluZyBrZXlzCisJICBpbiB0aGUga2VybmVsLiAgRW5jcnlwdGVkIGtleXMgYXJlIGtlcm5lbCBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlcnMsCisJICB3aGljaCBhcmUgZW5jcnlwdGVkL2RlY3J5cHRlZCB3aXRoIGEgJ21hc3Rlcicgc3ltbWV0cmljIGtleS4gVGhlCisJICAnbWFzdGVyJyBrZXkgY2FuIGJlIGVpdGhlciBhIHRydXN0ZWQta2V5IG9yIHVzZXIta2V5IHR5cGUuCisJICBVc2Vyc3BhY2Ugb25seSBldmVyIHNlZXMvc3RvcmVzIGVuY3J5cHRlZCBibG9icy4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciB0aGlzIGlzIHJlcXVpcmVkLCBhbnN3ZXIgTi4KKwogY29uZmlnIEtFWVNfREVCVUdfUFJPQ19LRVlTCiAJYm9vbCAiRW5hYmxlIHRoZSAvcHJvYy9rZXlzIGZpbGUgYnkgd2hpY2gga2V5cyBtYXkgYmUgdmlld2VkIgogCWRlcGVuZHMgb24gS0VZUwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9maWxlLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2ZpbGUuaAppbmRleCBiZTM2ZmVhLi5hYjhjNmQ4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2ZpbGUuaAorKysgYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2ZpbGUuaApAQCAtMTUsMTIgKzE1LDExIEBACiAjaWZuZGVmIF9fQUFfRklMRV9ICiAjZGVmaW5lIF9fQUFfRklMRV9ICiAKLSNpbmNsdWRlIDxsaW51eC9wYXRoLmg+Ci0KICNpbmNsdWRlICJkb21haW4uaCIKICNpbmNsdWRlICJtYXRjaC5oIgogCiBzdHJ1Y3QgYWFfcHJvZmlsZTsKK3N0cnVjdCBwYXRoOwogCiAvKgogICogV2UgdXNlIE1BWV9FWEVDLCBNQVlfV1JJVEUsIE1BWV9SRUFELCBNQVlfQVBQRU5EIGFuZCB0aGUgZm9sbG93aW5nIGZsYWdzCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL21hdGNoLmggYi9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL21hdGNoLmgKaW5kZXggNzM0YTZkMy4uYTRhODYzOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvbWF0Y2guaApAQCAtMTUsNiArMTUsNyBAQAogI2lmbmRlZiBfX0FBX01BVENIX0gKICNkZWZpbmUgX19BQV9NQVRDSF9ICiAKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNkZWZpbmUgREZBX05PTUFUQ0gJCQkwCkBAIC0yNyw3ICsyOCw3IEBACiAgKiBUaGUgZm9ybWF0IHVzZWQgZm9yIHRyYW5zaXRpb24gdGFibGVzIGlzIGJhc2VkIG9uIHRoZSBHTlUgZmxleCB0YWJsZQogICogZmlsZSBmb3JtYXQgKC0tdGFibGVzLWZpbGUgb3B0aW9uOyBzZWUgVGFibGUgRmlsZSBGb3JtYXQgaW4gdGhlIGZsZXgKICAqIGluZm8gcGFnZXMgYW5kIHRoZSBmbGV4IHNvdXJjZXMgZm9yIGRvY3VtZW50YXRpb24pLiBUaGUgbWFnaWMgbnVtYmVyCi0gKiB1c2VkIGluIHRoZSBoZWFkZXIgaXMgMHgxQjVFNzgzRCBpbnN0ZWQgb2YgMHhGMTNDNTdCMSB0aG91Z2gsIGJlY2F1c2UKKyAqIHVzZWQgaW4gdGhlIGhlYWRlciBpcyAweDFCNUU3ODNEIGluc3RlYWQgb2YgMHhGMTNDNTdCMSB0aG91Z2gsIGJlY2F1c2UKICAqIHRoZSBZWV9JRF9DSEsgKGNoZWNrKSBhbmQgWVlfSURfREVGIChkZWZhdWx0KSB0YWJsZXMgYXJlIHVzZWQKICAqIHNsaWdodGx5IGRpZmZlcmVudGx5IChzZWUgdGhlIGFwcGFybW9yLXBhcnNlciBwYWNrYWdlKS4KICAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9NYWtlZmlsZSBiL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUKaW5kZXggNzRkNTQ0Ny4uNmM5NDEwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9NYWtlZmlsZQorKysgYi9zZWN1cml0eS9rZXlzL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw4IEBACiAJcmVxdWVzdF9rZXlfYXV0aC5vIFwKIAl1c2VyX2RlZmluZWQubwogCitvYmotJChDT05GSUdfVFJVU1RFRF9LRVlTKSArPSB0cnVzdGVkX2RlZmluZWQubworb2JqLSQoQ09ORklHX0VOQ1JZUFRFRF9LRVlTKSArPSBlbmNyeXB0ZWRfZGVmaW5lZC5vCiBvYmotJChDT05GSUdfS0VZU19DT01QQVQpICs9IGNvbXBhdC5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGwubwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDI3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmMKQEAgLTAsMCArMSw5MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOgorICogTWltaSBab2hhciA8em9oYXJAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dAorICovCisKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxrZXlzL3VzZXItdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvdHJ1c3RlZC10eXBlLmg+CisjaW5jbHVkZSA8a2V5cy9lbmNyeXB0ZWQtdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS10eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKworI2luY2x1ZGUgImVuY3J5cHRlZF9kZWZpbmVkLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIEtFWV9UUlVTVEVEX1BSRUZJWFtdID0gInRydXN0ZWQ6IjsKK3N0YXRpYyBjb25zdCBjaGFyIEtFWV9VU0VSX1BSRUZJWFtdID0gInVzZXI6IjsKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfYWxnW10gPSAic2hhMjU2IjsKK3N0YXRpYyBjb25zdCBjaGFyIGhtYWNfYWxnW10gPSAiaG1hYyhzaGEyNTYpIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJsa2NpcGhlcl9hbGdbXSA9ICJjYmMoYWVzKSI7CitzdGF0aWMgdW5zaWduZWQgaW50IGl2c2l6ZTsKK3N0YXRpYyBpbnQgYmxrc2l6ZTsKKworI2RlZmluZSBLRVlfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKEtFWV9UUlVTVEVEX1BSRUZJWCkgLSAxKQorI2RlZmluZSBLRVlfVVNFUl9QUkVGSVhfTEVOIChzaXplb2YgKEtFWV9VU0VSX1BSRUZJWCkgLSAxKQorI2RlZmluZSBIQVNIX1NJWkUgU0hBMjU2X0RJR0VTVF9TSVpFCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUgNDA5NgorI2RlZmluZSBNSU5fREFUQV9TSVpFICAyMAorCitzdHJ1Y3Qgc2Rlc2MgeworCXN0cnVjdCBzaGFzaF9kZXNjIHNoYXNoOworCWNoYXIgY3R4W107Cit9OworCitzdGF0aWMgc3RydWN0IGNyeXB0b19zaGFzaCAqaGFzaGFsZzsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpobWFjYWxnOworCitlbnVtIHsKKwlPcHRfZXJyID0gLTEsIE9wdF9uZXcsIE9wdF9sb2FkLCBPcHRfdXBkYXRlCit9OworCitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCBrZXlfdG9rZW5zID0geworCXtPcHRfbmV3LCAibmV3In0sCisJe09wdF9sb2FkLCAibG9hZCJ9LAorCXtPcHRfdXBkYXRlLCAidXBkYXRlIn0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IGFlc19nZXRfc2l6ZXModm9pZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihibGtjaXBoZXJfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gYWxsb2NfY2lwaGVyICglbGQpXG4iLAorCQkgICAgICAgUFRSX0VSUih0Zm0pKTsKKwkJcmV0dXJuIFBUUl9FUlIodGZtKTsKKwl9CisJaXZzaXplID0gY3J5cHRvX2Jsa2NpcGhlcl9pdnNpemUodGZtKTsKKwlibGtzaXplID0gY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUodGZtKTsKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZhbGlkX21hc3Rlcl9kZXNjIC0gdmVyaWZ5IHRoZSAna2V5LXR5cGU6ZGVzYycgb2YgYSBuZXcvdXBkYXRlZCBtYXN0ZXIta2V5CisgKgorICoga2V5LXR5cGU6PSAidHJ1c3RlZDoiIHwgImVuY3J5cHRlZDoiCisgKiBkZXNjOj0gbWFzdGVyLWtleSBkZXNjcmlwdGlvbgorICoKKyAqIFZlcmlmeSB0aGF0ICdrZXktdHlwZScgaXMgdmFsaWQgYW5kIHRoYXQgJ2Rlc2MnIGV4aXN0cy4gT24ga2V5IHVwZGF0ZSwKKyAqIG9ubHkgdGhlIG1hc3RlciBrZXkgZGVzY3JpcHRpb24gaXMgcGVybWl0dGVkIHRvIGNoYW5nZSwgbm90IHRoZSBrZXktdHlwZS4KKyAqIFRoZSBrZXktdHlwZSByZW1haW5zIGNvbnN0YW50LgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJucyAwLCBvdGhlcndpc2UgLUVJTlZBTC4KKyAqLworc3RhdGljIGludCB2YWxpZF9tYXN0ZXJfZGVzYyhjb25zdCBjaGFyICpuZXdfZGVzYywgY29uc3QgY2hhciAqb3JpZ19kZXNjKQoreworCWlmICghbWVtY21wKG5ld19kZXNjLCBLRVlfVFJVU1RFRF9QUkVGSVgsIEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pKSB7CisJCWlmIChzdHJsZW4obmV3X2Rlc2MpID09IEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pCisJCQlnb3RvIG91dDsKKwkJaWYgKG9yaWdfZGVzYykKKwkJCWlmIChtZW1jbXAobmV3X2Rlc2MsIG9yaWdfZGVzYywgS0VZX1RSVVNURURfUFJFRklYX0xFTikpCisJCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghbWVtY21wKG5ld19kZXNjLCBLRVlfVVNFUl9QUkVGSVgsIEtFWV9VU0VSX1BSRUZJWF9MRU4pKSB7CisJCWlmIChzdHJsZW4obmV3X2Rlc2MpID09IEtFWV9VU0VSX1BSRUZJWF9MRU4pCisJCQlnb3RvIG91dDsKKwkJaWYgKG9yaWdfZGVzYykKKwkJCWlmIChtZW1jbXAobmV3X2Rlc2MsIG9yaWdfZGVzYywgS0VZX1VTRVJfUFJFRklYX0xFTikpCisJCQkJZ290byBvdXQ7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogZGF0YWJsb2JfcGFyc2UgLSBwYXJzZSB0aGUga2V5Y3RsIGRhdGEKKyAqCisgKiBkYXRhYmxvYiBmb3JtYXQ6CisgKiBuZXcgPG1hc3Rlci1rZXkgbmFtZT4gPGRlY3J5cHRlZCBkYXRhIGxlbmd0aD4KKyAqIGxvYWQgPG1hc3Rlci1rZXkgbmFtZT4gPGRlY3J5cHRlZCBkYXRhIGxlbmd0aD4gPGVuY3J5cHRlZCBpdiArIGRhdGE+CisgKiB1cGRhdGUgPG5ldy1tYXN0ZXIta2V5IG5hbWU+CisgKgorICogVG9rZW5pemVzIGEgY29weSBvZiB0aGUga2V5Y3RsIGRhdGEsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gZWFjaCB0b2tlbiwKKyAqIHdoaWNoIGlzIG51bGwgdGVybWluYXRlZC4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgMCwgb3RoZXJ3aXNlIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgZGF0YWJsb2JfcGFyc2UoY2hhciAqZGF0YWJsb2IsIGNoYXIgKiptYXN0ZXJfZGVzYywKKwkJCSAgY2hhciAqKmRlY3J5cHRlZF9kYXRhbGVuLCBjaGFyICoqaGV4X2VuY29kZWRfaXYpCit7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBrZXlfY21kOworCWNoYXIgKnA7CisKKwlwID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCWlmICghcCkKKwkJcmV0dXJuIHJldDsKKwlrZXlfY21kID0gbWF0Y2hfdG9rZW4ocCwga2V5X3Rva2VucywgYXJncyk7CisKKwkqbWFzdGVyX2Rlc2MgPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJaWYgKCEqbWFzdGVyX2Rlc2MpCisJCWdvdG8gb3V0OworCisJaWYgKHZhbGlkX21hc3Rlcl9kZXNjKCptYXN0ZXJfZGVzYywgTlVMTCkgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChkZWNyeXB0ZWRfZGF0YWxlbikgeworCQkqZGVjcnlwdGVkX2RhdGFsZW4gPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJCWlmICghKmRlY3J5cHRlZF9kYXRhbGVuKQorCQkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbmV3OgorCQlpZiAoIWRlY3J5cHRlZF9kYXRhbGVuKQorCQkJYnJlYWs7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgT3B0X2xvYWQ6CisJCWlmICghZGVjcnlwdGVkX2RhdGFsZW4pCisJCQlicmVhazsKKwkJKmhleF9lbmNvZGVkX2l2ID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCQlpZiAoISpoZXhfZW5jb2RlZF9pdikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE9wdF91cGRhdGU6CisJCWlmIChkZWNyeXB0ZWRfZGF0YWxlbikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE9wdF9lcnI6CisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGF0YWJsb2JfZm9ybWF0IC0gZm9ybWF0IGFzIGFuIGFzY2lpIHN0cmluZywgYmVmb3JlIGNvcHlpbmcgdG8gdXNlcnNwYWNlCisgKi8KK3N0YXRpYyBjaGFyICpkYXRhYmxvYl9mb3JtYXQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkgICAgIHNpemVfdCBhc2NpaWJsb2JfbGVuKQoreworCWNoYXIgKmFzY2lpX2J1ZiwgKmJ1ZnA7CisJdTggKml2ID0gZXBheWxvYWQtPml2OworCWludCBsZW47CisJaW50IGk7CisKKwlhc2NpaV9idWYgPSBrbWFsbG9jKGFzY2lpYmxvYl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzY2lpX2J1ZikKKwkJZ290byBvdXQ7CisKKwlhc2NpaV9idWZbYXNjaWlibG9iX2xlbl0gPSAnXDAnOworCisJLyogY29weSBkYXRhYmxvYiBtYXN0ZXJfZGVzYyBhbmQgZGF0YWxlbiBzdHJpbmdzICovCisJbGVuID0gc3ByaW50Zihhc2NpaV9idWYsICIlcyAlcyAiLCBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MsCisJCSAgICAgIGVwYXlsb2FkLT5kYXRhbGVuKTsKKworCS8qIGNvbnZlcnQgdGhlIGhleCBlbmNvZGVkIGl2LCBlbmNyeXB0ZWQtZGF0YSBhbmQgSE1BQyB0byBhc2NpaSAqLworCWJ1ZnAgPSAmYXNjaWlfYnVmW2xlbl07CisJZm9yIChpID0gMDsgaSA8IChhc2NpaWJsb2JfbGVuIC0gbGVuKSAvIDI7IGkrKykKKwkJYnVmcCA9IHBhY2tfaGV4X2J5dGUoYnVmcCwgaXZbaV0pOworb3V0OgorCXJldHVybiBhc2NpaV9idWY7Cit9CisKKy8qCisgKiByZXF1ZXN0X3RydXN0ZWRfa2V5IC0gcmVxdWVzdCB0aGUgdHJ1c3RlZCBrZXkKKyAqCisgKiBUcnVzdGVkIGtleXMgYXJlIHNlYWxlZCB0byBQQ1JzIGFuZCBvdGhlciBtZXRhZGF0YS4gQWx0aG91Z2ggdXNlcnNwYWNlCisgKiBtYW5hZ2VzIGJvdGggdHJ1c3RlZC9lbmNyeXB0ZWQga2V5LXR5cGVzLCBsaWtlIHRoZSBlbmNyeXB0ZWQga2V5IHR5cGUKKyAqIGRhdGEsIHRydXN0ZWQga2V5IHR5cGUgZGF0YSBpcyBub3QgdmlzaWJsZSBkZWNyeXB0ZWQgZnJvbSB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga2V5ICpyZXF1ZXN0X3RydXN0ZWRfa2V5KGNvbnN0IGNoYXIgKnRydXN0ZWRfZGVzYywKKwkJCQkgICAgICAgdTggKiptYXN0ZXJfa2V5LCBzaXplX3QgKm1hc3Rlcl9rZXlsZW4pCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnRwYXlsb2FkOworCXN0cnVjdCBrZXkgKnRrZXk7CisKKwl0a2V5ID0gcmVxdWVzdF9rZXkoJmtleV90eXBlX3RydXN0ZWQsIHRydXN0ZWRfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUih0a2V5KSkKKwkJZ290byBlcnJvcjsKKworCWRvd25fcmVhZCgmdGtleS0+c2VtKTsKKwl0cGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZSh0a2V5LT5wYXlsb2FkLmRhdGEpOworCSptYXN0ZXJfa2V5ID0gdHBheWxvYWQtPmtleTsKKwkqbWFzdGVyX2tleWxlbiA9IHRwYXlsb2FkLT5rZXlfbGVuOworZXJyb3I6CisJcmV0dXJuIHRrZXk7Cit9CisKKy8qCisgKiByZXF1ZXN0X3VzZXJfa2V5IC0gcmVxdWVzdCB0aGUgdXNlciBrZXkKKyAqCisgKiBVc2UgYSB1c2VyIHByb3ZpZGVkIGtleSB0byBlbmNyeXB0L2RlY3J5cHQgYW4gZW5jcnlwdGVkLWtleS4KKyAqLworc3RhdGljIHN0cnVjdCBrZXkgKnJlcXVlc3RfdXNlcl9rZXkoY29uc3QgY2hhciAqbWFzdGVyX2Rlc2MsIHU4ICoqbWFzdGVyX2tleSwKKwkJCQkgICAgc2l6ZV90ICptYXN0ZXJfa2V5bGVuKQoreworCXN0cnVjdCB1c2VyX2tleV9wYXlsb2FkICp1cGF5bG9hZDsKKwlzdHJ1Y3Qga2V5ICp1a2V5OworCisJdWtleSA9IHJlcXVlc3Rfa2V5KCZrZXlfdHlwZV91c2VyLCBtYXN0ZXJfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUih1a2V5KSkKKwkJZ290byBlcnJvcjsKKworCWRvd25fcmVhZCgmdWtleS0+c2VtKTsKKwl1cGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZSh1a2V5LT5wYXlsb2FkLmRhdGEpOworCSptYXN0ZXJfa2V5ID0gdXBheWxvYWQtPmRhdGE7CisJKm1hc3Rlcl9rZXlsZW4gPSB1cGF5bG9hZC0+ZGF0YWxlbjsKK2Vycm9yOgorCXJldHVybiB1a2V5OworfQorCitzdGF0aWMgc3RydWN0IHNkZXNjICphbGxvY19zZGVzYyhzdHJ1Y3QgY3J5cHRvX3NoYXNoICphbGcpCit7CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHNoYXNoX2Rlc2MpICsgY3J5cHRvX3NoYXNoX2Rlc2NzaXplKGFsZyk7CisJc2Rlc2MgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghc2Rlc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXNkZXNjLT5zaGFzaC50Zm0gPSBhbGc7CisJc2Rlc2MtPnNoYXNoLmZsYWdzID0gMHgwOworCXJldHVybiBzZGVzYzsKK30KKworc3RhdGljIGludCBjYWxjX2htYWModTggKmRpZ2VzdCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJICAgICBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHJldDsKKworCXNkZXNjID0gYWxsb2Nfc2Rlc2MoaG1hY2FsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9zZXRrZXkoaG1hY2FsZywga2V5LCBrZXlsZW4pOworCWlmICghcmV0KQorCQlyZXQgPSBjcnlwdG9fc2hhc2hfZGlnZXN0KCZzZGVzYy0+c2hhc2gsIGJ1ZiwgYnVmbGVuLCBkaWdlc3QpOworCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbGNfaGFzaCh1OCAqZGlnZXN0LCBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHJldDsKKworCXNkZXNjID0gYWxsb2Nfc2Rlc2MoaGFzaGFsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9kaWdlc3QoJnNkZXNjLT5zaGFzaCwgYnVmLCBidWZsZW4sIGRpZ2VzdCk7CisJa2ZyZWUoc2Rlc2MpOworCXJldHVybiByZXQ7Cit9CisKK2VudW0gZGVyaXZlZF9rZXlfdHlwZSB7IEVOQ19LRVksIEFVVEhfS0VZIH07CisKKy8qIERlcml2ZSBhdXRoZW50aWNhdGlvbi9lbmNyeXB0aW9uIGtleSBmcm9tIHRydXN0ZWQga2V5ICovCitzdGF0aWMgaW50IGdldF9kZXJpdmVkX2tleSh1OCAqZGVyaXZlZF9rZXksIGVudW0gZGVyaXZlZF9rZXlfdHlwZSBrZXlfdHlwZSwKKwkJCSAgIGNvbnN0IHU4ICptYXN0ZXJfa2V5LCBzaXplX3QgbWFzdGVyX2tleWxlbikKK3sKKwl1OCAqZGVyaXZlZF9idWY7CisJdW5zaWduZWQgaW50IGRlcml2ZWRfYnVmX2xlbjsKKwlpbnQgcmV0OworCisJZGVyaXZlZF9idWZfbGVuID0gc3RybGVuKCJBVVRIX0tFWSIpICsgMSArIG1hc3Rlcl9rZXlsZW47CisJaWYgKGRlcml2ZWRfYnVmX2xlbiA8IEhBU0hfU0laRSkKKwkJZGVyaXZlZF9idWZfbGVuID0gSEFTSF9TSVpFOworCisJZGVyaXZlZF9idWYgPSBremFsbG9jKGRlcml2ZWRfYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXJpdmVkX2J1ZikgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGtleV90eXBlKQorCQlzdHJjcHkoZGVyaXZlZF9idWYsICJBVVRIX0tFWSIpOworCWVsc2UKKwkJc3RyY3B5KGRlcml2ZWRfYnVmLCAiRU5DX0tFWSIpOworCisJbWVtY3B5KGRlcml2ZWRfYnVmICsgc3RybGVuKGRlcml2ZWRfYnVmKSArIDEsIG1hc3Rlcl9rZXksCisJICAgICAgIG1hc3Rlcl9rZXlsZW4pOworCXJldCA9IGNhbGNfaGFzaChkZXJpdmVkX2tleSwgZGVyaXZlZF9idWYsIGRlcml2ZWRfYnVmX2xlbik7CisJa2ZyZWUoZGVyaXZlZF9idWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9ibGtjaXBoZXJfZGVzYyhzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICprZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4sIGNvbnN0IHU4ICppdiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaXZzaXplKQoreworCWludCByZXQ7CisKKwlkZXNjLT50Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGJsa2NpcGhlcl9hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoZGVzYy0+dGZtKSkgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBsb2FkICVzIHRyYW5zZm9ybSAoJWxkKVxuIiwKKwkJICAgICAgIGJsa2NpcGhlcl9hbGcsIFBUUl9FUlIoZGVzYy0+dGZtKSk7CisJCXJldHVybiBQVFJfRVJSKGRlc2MtPnRmbSk7CisJfQorCWRlc2MtPmZsYWdzID0gMDsKKworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGRlc2MtPnRmbSwga2V5LCBrZXlfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBzZXRrZXkgKCVkKVxuIiwgcmV0KTsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MtPnRmbSk7CisJCXJldHVybiByZXQ7CisJfQorCWNyeXB0b19ibGtjaXBoZXJfc2V0X2l2KGRlc2MtPnRmbSwgaXYsIGl2c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga2V5ICpyZXF1ZXN0X21hc3Rlcl9rZXkoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJICAgICAgdTggKiptYXN0ZXJfa2V5LCBzaXplX3QgKm1hc3Rlcl9rZXlsZW4pCit7CisJc3RydWN0IGtleSAqbWtleSA9IE5VTEw7CisKKwlpZiAoIXN0cm5jbXAoZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBLRVlfVFJVU1RFRF9QUkVGSVgsCisJCSAgICAgS0VZX1RSVVNURURfUFJFRklYX0xFTikpIHsKKwkJbWtleSA9IHJlcXVlc3RfdHJ1c3RlZF9rZXkoZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsKKwkJCQkJICAgS0VZX1RSVVNURURfUFJFRklYX0xFTiwKKwkJCQkJICAgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJfSBlbHNlIGlmICghc3RybmNtcChlcGF5bG9hZC0+bWFzdGVyX2Rlc2MsIEtFWV9VU0VSX1BSRUZJWCwKKwkJCSAgICBLRVlfVVNFUl9QUkVGSVhfTEVOKSkgeworCQlta2V5ID0gcmVxdWVzdF91c2VyX2tleShlcGF5bG9hZC0+bWFzdGVyX2Rlc2MgKworCQkJCQlLRVlfVVNFUl9QUkVGSVhfTEVOLAorCQkJCQltYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisKKwlpZiAoSVNfRVJSKG1rZXkpKQorCQlwcl9pbmZvKCJlbmNyeXB0ZWRfa2V5OiBrZXkgJXMgbm90IGZvdW5kIiwKKwkJCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYyk7CisJaWYgKG1rZXkpCisJCWR1bXBfbWFzdGVyX2tleSgqbWFzdGVyX2tleSwgKm1hc3Rlcl9rZXlsZW4pOworb3V0OgorCXJldHVybiBta2V5OworfQorCisvKiBCZWZvcmUgcmV0dXJuaW5nIGRhdGEgdG8gdXNlcnNwYWNlLCBlbmNyeXB0IGRlY3J5cHRlZCBkYXRhLiAqLworc3RhdGljIGludCBkZXJpdmVkX2tleV9lbmNyeXB0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJICAgICAgIGNvbnN0IHU4ICpkZXJpdmVkX2tleSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGVyaXZlZF9rZXlsZW4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX2luWzJdOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19vdXRbMV07CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCXVuc2lnbmVkIGludCBwYWRsZW47CisJY2hhciBwYWRbMTZdOworCWludCByZXQ7CisKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKTsKKwlwYWRsZW4gPSBlbmNyeXB0ZWRfZGF0YWxlbiAtIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbjsKKworCXJldCA9IGluaXRfYmxrY2lwaGVyX2Rlc2MoJmRlc2MsIGRlcml2ZWRfa2V5LCBkZXJpdmVkX2tleWxlbiwKKwkJCQkgIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJZHVtcF9kZWNyeXB0ZWRfZGF0YShlcGF5bG9hZCk7CisKKwltZW1zZXQocGFkLCAwLCBzaXplb2YgcGFkKTsKKwlzZ19pbml0X3RhYmxlKHNnX2luLCAyKTsKKwlzZ19zZXRfYnVmKCZzZ19pblswXSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX2luWzFdLCBwYWQsIHBhZGxlbik7CisKKwlzZ19pbml0X3RhYmxlKHNnX291dCwgMSk7CisJc2dfc2V0X2J1ZihzZ19vdXQsIGVwYXlsb2FkLT5lbmNyeXB0ZWRfZGF0YSwgZW5jcnlwdGVkX2RhdGFsZW4pOworCisJcmV0ID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCBzZ19vdXQsIHNnX2luLCBlbmNyeXB0ZWRfZGF0YWxlbik7CisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGRlc2MudGZtKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gZW5jcnlwdCAoJWQpXG4iLCByZXQpOworCWVsc2UKKwkJZHVtcF9lbmNyeXB0ZWRfZGF0YShlcGF5bG9hZCwgZW5jcnlwdGVkX2RhdGFsZW4pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGF0YWJsb2JfaG1hY19hcHBlbmQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJY29uc3QgdTggKm1hc3Rlcl9rZXksIHNpemVfdCBtYXN0ZXJfa2V5bGVuKQoreworCXU4IGRlcml2ZWRfa2V5W0hBU0hfU0laRV07CisJdTggKmRpZ2VzdDsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2Rlcml2ZWRfa2V5KGRlcml2ZWRfa2V5LCBBVVRIX0tFWSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGlnZXN0ID0gZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbjsKKwlyZXQgPSBjYWxjX2htYWMoZGlnZXN0LCBkZXJpdmVkX2tleSwgc2l6ZW9mIGRlcml2ZWRfa2V5LAorCQkJZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuKTsKKwlpZiAoIXJldCkKKwkJZHVtcF9obWFjKE5VTEwsIGRpZ2VzdCwgSEFTSF9TSVpFKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiB2ZXJpZnkgSE1BQyBiZWZvcmUgZGVjcnlwdGluZyBlbmNyeXB0ZWQga2V5ICovCitzdGF0aWMgaW50IGRhdGFibG9iX2htYWNfdmVyaWZ5KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCWNvbnN0IHU4ICptYXN0ZXJfa2V5LCBzaXplX3QgbWFzdGVyX2tleWxlbikKK3sKKwl1OCBkZXJpdmVkX2tleVtIQVNIX1NJWkVdOworCXU4IGRpZ2VzdFtIQVNIX1NJWkVdOworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfZGVyaXZlZF9rZXkoZGVyaXZlZF9rZXksIEFVVEhfS0VZLCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjYWxjX2htYWMoZGlnZXN0LCBkZXJpdmVkX2tleSwgc2l6ZW9mIGRlcml2ZWRfa2V5LAorCQkJZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gbWVtY21wKGRpZ2VzdCwgZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbiwKKwkJICAgICBzaXplb2YgZGlnZXN0KTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWR1bXBfaG1hYygiZGF0YWJsb2IiLAorCQkJICBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MgKyBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuLAorCQkJICBIQVNIX1NJWkUpOworCQlkdW1wX2htYWMoImNhbGMiLCBkaWdlc3QsIEhBU0hfU0laRSk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVyaXZlZF9rZXlfZGVjcnlwdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCSAgICAgICBjb25zdCB1OCAqZGVyaXZlZF9rZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRlcml2ZWRfa2V5bGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pblsxXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0WzJdOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwljaGFyIHBhZFsxNl07CisJaW50IHJldDsKKworCWVuY3J5cHRlZF9kYXRhbGVuID0gcm91bmR1cChlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCXJldCA9IGluaXRfYmxrY2lwaGVyX2Rlc2MoJmRlc2MsIGRlcml2ZWRfa2V5LCBkZXJpdmVkX2tleWxlbiwKKwkJCQkgIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJZHVtcF9lbmNyeXB0ZWRfZGF0YShlcGF5bG9hZCwgZW5jcnlwdGVkX2RhdGFsZW4pOworCisJbWVtc2V0KHBhZCwgMCwgc2l6ZW9mIHBhZCk7CisJc2dfaW5pdF90YWJsZShzZ19pbiwgMSk7CisJc2dfaW5pdF90YWJsZShzZ19vdXQsIDIpOworCXNnX3NldF9idWYoc2dfaW4sIGVwYXlsb2FkLT5lbmNyeXB0ZWRfZGF0YSwgZW5jcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX291dFswXSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCXNnX3NldF9idWYoJnNnX291dFsxXSwgcGFkLCBzaXplb2YgcGFkKTsKKworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgc2dfb3V0LCBzZ19pbiwgZW5jcnlwdGVkX2RhdGFsZW4pOworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLnRmbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWR1bXBfZGVjcnlwdGVkX2RhdGEoZXBheWxvYWQpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGVjcnlwdGVkIGtleSBhbmQgZGF0YWJsb2IuICovCitzdGF0aWMgc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZW5jcnlwdGVkX2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCisJCQkJCQkJIGNvbnN0IGNoYXIgKm1hc3Rlcl9kZXNjLAorCQkJCQkJCSBjb25zdCBjaGFyICpkYXRhbGVuKQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0gTlVMTDsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhYmxvYl9sZW47CisJdW5zaWduZWQgc2hvcnQgZGVjcnlwdGVkX2RhdGFsZW47CisJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCWxvbmcgZGxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChkYXRhbGVuLCAxMCwgJmRsZW4pOworCWlmIChyZXQgPCAwIHx8IGRsZW4gPCBNSU5fREFUQV9TSVpFIHx8IGRsZW4gPiBNQVhfREFUQV9TSVpFKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWRlY3J5cHRlZF9kYXRhbGVuID0gZGxlbjsKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCisJZGF0YWJsb2JfbGVuID0gc3RybGVuKG1hc3Rlcl9kZXNjKSArIDEgKyBzdHJsZW4oZGF0YWxlbikgKyAxCisJICAgICsgaXZzaXplICsgMSArIGVuY3J5cHRlZF9kYXRhbGVuOworCisJcmV0ID0ga2V5X3BheWxvYWRfcmVzZXJ2ZShrZXksIGRlY3J5cHRlZF9kYXRhbGVuICsgZGF0YWJsb2JfbGVuCisJCQkJICArIEhBU0hfU0laRSArIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJZXBheWxvYWQgPSBremFsbG9jKHNpemVvZigqZXBheWxvYWQpICsgZGVjcnlwdGVkX2RhdGFsZW4gKworCQkJICAgZGF0YWJsb2JfbGVuICsgSEFTSF9TSVpFICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcGF5bG9hZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4gPSBkZWNyeXB0ZWRfZGF0YWxlbjsKKwllcGF5bG9hZC0+ZGF0YWJsb2JfbGVuID0gZGF0YWJsb2JfbGVuOworCXJldHVybiBlcGF5bG9hZDsKK30KKworc3RhdGljIGludCBlbmNyeXB0ZWRfa2V5X2RlY3J5cHQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJIGNvbnN0IGNoYXIgKmhleF9lbmNvZGVkX2l2KQoreworCXN0cnVjdCBrZXkgKm1rZXk7CisJdTggZGVyaXZlZF9rZXlbSEFTSF9TSVpFXTsKKwl1OCAqbWFzdGVyX2tleTsKKwl1OCAqaG1hYzsKKwljb25zdCBjaGFyICpoZXhfZW5jb2RlZF9kYXRhOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwlzaXplX3QgbWFzdGVyX2tleWxlbjsKKwlzaXplX3QgYXNjaWlsZW47CisJaW50IHJldDsKKworCWVuY3J5cHRlZF9kYXRhbGVuID0gcm91bmR1cChlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4sIGJsa3NpemUpOworCWFzY2lpbGVuID0gKGl2c2l6ZSArIDEgKyBlbmNyeXB0ZWRfZGF0YWxlbiArIEhBU0hfU0laRSkgKiAyOworCWlmIChzdHJsZW4oaGV4X2VuY29kZWRfaXYpICE9IGFzY2lpbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhleF9lbmNvZGVkX2RhdGEgPSBoZXhfZW5jb2RlZF9pdiArICgyICogaXZzaXplKSArIDI7CisJaGV4MmJpbihlcGF5bG9hZC0+aXYsIGhleF9lbmNvZGVkX2l2LCBpdnNpemUpOworCWhleDJiaW4oZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhLCBoZXhfZW5jb2RlZF9kYXRhLCBlbmNyeXB0ZWRfZGF0YWxlbik7CisKKwlobWFjID0gZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbjsKKwloZXgyYmluKGhtYWMsIGhleF9lbmNvZGVkX2RhdGEgKyAoZW5jcnlwdGVkX2RhdGFsZW4gKiAyKSwgSEFTSF9TSVpFKTsKKworCW1rZXkgPSByZXF1ZXN0X21hc3Rlcl9rZXkoZXBheWxvYWQsICZtYXN0ZXJfa2V5LCAmbWFzdGVyX2tleWxlbik7CisJaWYgKElTX0VSUihta2V5KSkKKwkJcmV0dXJuIFBUUl9FUlIobWtleSk7CisKKwlyZXQgPSBkYXRhYmxvYl9obWFjX3ZlcmlmeShlcGF5bG9hZCwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBiYWQgaG1hYyAoJWQpXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZXRfZGVyaXZlZF9rZXkoZGVyaXZlZF9rZXksIEVOQ19LRVksIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGRlcml2ZWRfa2V5X2RlY3J5cHQoZXBheWxvYWQsIGRlcml2ZWRfa2V5LCBzaXplb2YgZGVyaXZlZF9rZXkpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoImVuY3J5cHRlZF9rZXk6IGZhaWxlZCB0byBkZWNyeXB0IGtleSAoJWQpXG4iLCByZXQpOworb3V0OgorCXVwX3JlYWQoJm1rZXktPnNlbSk7CisJa2V5X3B1dChta2V5KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2VrZXlfaW5pdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCWNvbnN0IGNoYXIgKm1hc3Rlcl9kZXNjLCBjb25zdCBjaGFyICpkYXRhbGVuKQoreworCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYyA9IGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YQorCSAgICArIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbjsKKwllcGF5bG9hZC0+ZGF0YWxlbiA9IGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArIHN0cmxlbihtYXN0ZXJfZGVzYykgKyAxOworCWVwYXlsb2FkLT5pdiA9IGVwYXlsb2FkLT5kYXRhbGVuICsgc3RybGVuKGRhdGFsZW4pICsgMTsKKwllcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEgPSBlcGF5bG9hZC0+aXYgKyBpdnNpemUgKyAxOworCisJbWVtY3B5KGVwYXlsb2FkLT5tYXN0ZXJfZGVzYywgbWFzdGVyX2Rlc2MsIHN0cmxlbihtYXN0ZXJfZGVzYykpOworCW1lbWNweShlcGF5bG9hZC0+ZGF0YWxlbiwgZGF0YWxlbiwgc3RybGVuKGRhdGFsZW4pKTsKK30KKworLyoKKyAqIGVuY3J5cHRlZF9pbml0IC0gaW5pdGlhbGl6ZSBhbiBlbmNyeXB0ZWQga2V5CisgKgorICogRm9yIGEgbmV3IGtleSwgdXNlIGEgcmFuZG9tIG51bWJlciBmb3IgYm90aCB0aGUgaXYgYW5kIGRhdGEKKyAqIGl0c2VsZi4gIEZvciBhbiBvbGQga2V5LCBkZWNyeXB0IHRoZSBoZXggZW5jb2RlZCBkYXRhLgorICovCitzdGF0aWMgaW50IGVuY3J5cHRlZF9pbml0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJICBjb25zdCBjaGFyICptYXN0ZXJfZGVzYywgY29uc3QgY2hhciAqZGF0YWxlbiwKKwkJCSAgY29uc3QgY2hhciAqaGV4X2VuY29kZWRfaXYpCit7CisJaW50IHJldCA9IDA7CisKKwlfX2VrZXlfaW5pdChlcGF5bG9hZCwgbWFzdGVyX2Rlc2MsIGRhdGFsZW4pOworCWlmICghaGV4X2VuY29kZWRfaXYpIHsKKwkJZ2V0X3JhbmRvbV9ieXRlcyhlcGF5bG9hZC0+aXYsIGl2c2l6ZSk7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcyhlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEsCisJCQkJIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbik7CisJfSBlbHNlCisJCXJldCA9IGVuY3J5cHRlZF9rZXlfZGVjcnlwdChlcGF5bG9hZCwgaGV4X2VuY29kZWRfaXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfaW5zdGFudGlhdGUgLSBpbnN0YW50aWF0ZSBhbiBlbmNyeXB0ZWQga2V5CisgKgorICogRGVjcnlwdCBhbiBleGlzdGluZyBlbmNyeXB0ZWQgZGF0YWJsb2Igb3IgY3JlYXRlIGEgbmV3IGVuY3J5cHRlZCBrZXkKKyAqIGJhc2VkIG9uIGEga2VybmVsIHJhbmRvbSBudW1iZXIuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIDAuIE90aGVyd2lzZSByZXR1cm4gZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgZW5jcnlwdGVkX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQgPSBOVUxMOworCWNoYXIgKmRhdGFibG9iID0gTlVMTDsKKwljaGFyICptYXN0ZXJfZGVzYyA9IE5VTEw7CisJY2hhciAqZGVjcnlwdGVkX2RhdGFsZW4gPSBOVUxMOworCWNoYXIgKmhleF9lbmNvZGVkX2l2ID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKGRhdGFsZW4gPD0gMCB8fCBkYXRhbGVuID4gMzI3NjcgfHwgIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YWJsb2IgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGFibG9iKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkYXRhYmxvYltkYXRhbGVuXSA9IDA7CisJbWVtY3B5KGRhdGFibG9iLCBkYXRhLCBkYXRhbGVuKTsKKwlyZXQgPSBkYXRhYmxvYl9wYXJzZShkYXRhYmxvYiwgJm1hc3Rlcl9kZXNjLCAmZGVjcnlwdGVkX2RhdGFsZW4sCisJCQkgICAgICZoZXhfZW5jb2RlZF9pdik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZXBheWxvYWQgPSBlbmNyeXB0ZWRfa2V5X2FsbG9jKGtleSwgbWFzdGVyX2Rlc2MsIGRlY3J5cHRlZF9kYXRhbGVuKTsKKwlpZiAoSVNfRVJSKGVwYXlsb2FkKSkgeworCQlyZXQgPSBQVFJfRVJSKGVwYXlsb2FkKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IGVuY3J5cHRlZF9pbml0KGVwYXlsb2FkLCBtYXN0ZXJfZGVzYywgZGVjcnlwdGVkX2RhdGFsZW4sCisJCQkgICAgIGhleF9lbmNvZGVkX2l2KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShlcGF5bG9hZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgZXBheWxvYWQpOworb3V0OgorCWtmcmVlKGRhdGFibG9iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlbmNyeXB0ZWRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQ7CisKKwllcGF5bG9hZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQsIHJjdSk7CisJbWVtc2V0KGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwgMCwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKwlrZnJlZShlcGF5bG9hZCk7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfdXBkYXRlIC0gdXBkYXRlIHRoZSBtYXN0ZXIga2V5IGRlc2NyaXB0aW9uCisgKgorICogQ2hhbmdlIHRoZSBtYXN0ZXIga2V5IGRlc2NyaXB0aW9uIGZvciBhbiBleGlzdGluZyBlbmNyeXB0ZWQga2V5LgorICogVGhlIG5leHQgcmVhZCB3aWxsIHJldHVybiBhbiBlbmNyeXB0ZWQgZGF0YWJsb2IgdXNpbmcgdGhlIG5ldworICogbWFzdGVyIGtleSBkZXNjcmlwdGlvbi4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gMC4gT3RoZXJ3aXNlIHJldHVybiBlcnJuby4KKyAqLworc3RhdGljIGludCBlbmNyeXB0ZWRfdXBkYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQgPSBrZXktPnBheWxvYWQuZGF0YTsKKwlzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICpuZXdfZXBheWxvYWQ7CisJY2hhciAqYnVmOworCWNoYXIgKm5ld19tYXN0ZXJfZGVzYyA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGFsZW4gPiAzMjc2NyB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidWYgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZbZGF0YWxlbl0gPSAwOworCW1lbWNweShidWYsIGRhdGEsIGRhdGFsZW4pOworCXJldCA9IGRhdGFibG9iX3BhcnNlKGJ1ZiwgJm5ld19tYXN0ZXJfZGVzYywgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmFsaWRfbWFzdGVyX2Rlc2MobmV3X21hc3Rlcl9kZXNjLCBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCW5ld19lcGF5bG9hZCA9IGVuY3J5cHRlZF9rZXlfYWxsb2Moa2V5LCBuZXdfbWFzdGVyX2Rlc2MsCisJCQkJCSAgIGVwYXlsb2FkLT5kYXRhbGVuKTsKKwlpZiAoSVNfRVJSKG5ld19lcGF5bG9hZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihuZXdfZXBheWxvYWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlfX2VrZXlfaW5pdChuZXdfZXBheWxvYWQsIG5ld19tYXN0ZXJfZGVzYywgZXBheWxvYWQtPmRhdGFsZW4pOworCisJbWVtY3B5KG5ld19lcGF5bG9hZC0+aXYsIGVwYXlsb2FkLT5pdiwgaXZzaXplKTsKKwltZW1jcHkobmV3X2VwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCSAgICAgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBuZXdfZXBheWxvYWQpOworCWNhbGxfcmN1KCZlcGF5bG9hZC0+cmN1LCBlbmNyeXB0ZWRfcmN1X2ZyZWUpOworb3V0OgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGVuY3J5cHRlZF9yZWFkIC0gZm9ybWF0IGFuZCBjb3B5IHRoZSBlbmNyeXB0ZWQgZGF0YSB0byB1c2Vyc3BhY2UKKyAqCisgKiBUaGUgcmVzdWx0aW5nIGRhdGFibG9iIGZvcm1hdCBpczoKKyAqIDxtYXN0ZXIta2V5IG5hbWU+IDxkZWNyeXB0ZWQgZGF0YSBsZW5ndGg+IDxlbmNyeXB0ZWQgaXY+IDxlbmNyeXB0ZWQgZGF0YT4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gdG8gdXNlcnNwYWNlIHRoZSBlbmNyeXB0ZWQga2V5IGRhdGFibG9iIHNpemUuCisgKi8KK3N0YXRpYyBsb25nIGVuY3J5cHRlZF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQ7CisJc3RydWN0IGtleSAqbWtleTsKKwl1OCAqbWFzdGVyX2tleTsKKwlzaXplX3QgbWFzdGVyX2tleWxlbjsKKwljaGFyIGRlcml2ZWRfa2V5W0hBU0hfU0laRV07CisJY2hhciAqYXNjaWlfYnVmOworCXNpemVfdCBhc2NpaWJsb2JfbGVuOworCWludCByZXQ7CisKKwllcGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoa2V5LT5wYXlsb2FkLmRhdGEsCisJCQkJICByd3NlbV9pc19sb2NrZWQoJigoc3RydWN0IGtleSAqKWtleSktPnNlbSkpOworCisJLyogcmV0dXJucyB0aGUgaGV4IGVuY29kZWQgaXYsIGVuY3J5cHRlZC1kYXRhLCBhbmQgaG1hYyBhcyBhc2NpaSAqLworCWFzY2lpYmxvYl9sZW4gPSBlcGF5bG9hZC0+ZGF0YWJsb2JfbGVuICsgaXZzaXplICsgMQorCSAgICArIHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKQorCSAgICArIChIQVNIX1NJWkUgKiAyKTsKKworCWlmICghYnVmZmVyIHx8IGJ1ZmxlbiA8IGFzY2lpYmxvYl9sZW4pCisJCXJldHVybiBhc2NpaWJsb2JfbGVuOworCisJbWtleSA9IHJlcXVlc3RfbWFzdGVyX2tleShlcGF5bG9hZCwgJm1hc3Rlcl9rZXksICZtYXN0ZXJfa2V5bGVuKTsKKwlpZiAoSVNfRVJSKG1rZXkpKQorCQlyZXR1cm4gUFRSX0VSUihta2V5KTsKKworCXJldCA9IGdldF9kZXJpdmVkX2tleShkZXJpdmVkX2tleSwgRU5DX0tFWSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZGVyaXZlZF9rZXlfZW5jcnlwdChlcGF5bG9hZCwgZGVyaXZlZF9rZXksIHNpemVvZiBkZXJpdmVkX2tleSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gZGF0YWJsb2JfaG1hY19hcHBlbmQoZXBheWxvYWQsIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWFzY2lpX2J1ZiA9IGRhdGFibG9iX2Zvcm1hdChlcGF5bG9hZCwgYXNjaWlibG9iX2xlbik7CisJaWYgKCFhc2NpaV9idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdXBfcmVhZCgmbWtleS0+c2VtKTsKKwlrZXlfcHV0KG1rZXkpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGFzY2lpX2J1ZiwgYXNjaWlibG9iX2xlbikgIT0gMCkKKwkJcmV0ID0gLUVGQVVMVDsKKwlrZnJlZShhc2NpaV9idWYpOworCisJcmV0dXJuIGFzY2lpYmxvYl9sZW47CitvdXQ6CisJdXBfcmVhZCgmbWtleS0+c2VtKTsKKwlrZXlfcHV0KG1rZXkpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfZGVzdHJveSAtIGJlZm9yZSBmcmVlaW5nIHRoZSBrZXksIGNsZWFyIHRoZSBkZWNyeXB0ZWQgZGF0YQorICoKKyAqIEJlZm9yZSBmcmVlaW5nIHRoZSBrZXksIGNsZWFyIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgZGVjcnlwdGVkCisgKiBrZXkgZGF0YS4KKyAqLworc3RhdGljIHZvaWQgZW5jcnlwdGVkX2Rlc3Ryb3koc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0ga2V5LT5wYXlsb2FkLmRhdGE7CisKKwlpZiAoIWVwYXlsb2FkKQorCQlyZXR1cm47CisKKwltZW1zZXQoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLCAwLCBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCWtmcmVlKGtleS0+cGF5bG9hZC5kYXRhKTsKK30KKworc3RydWN0IGtleV90eXBlIGtleV90eXBlX2VuY3J5cHRlZCA9IHsKKwkubmFtZSA9ICJlbmNyeXB0ZWQiLAorCS5pbnN0YW50aWF0ZSA9IGVuY3J5cHRlZF9pbnN0YW50aWF0ZSwKKwkudXBkYXRlID0gZW5jcnlwdGVkX3VwZGF0ZSwKKwkubWF0Y2ggPSB1c2VyX21hdGNoLAorCS5kZXN0cm95ID0gZW5jcnlwdGVkX2Rlc3Ryb3ksCisJLmRlc2NyaWJlID0gdXNlcl9kZXNjcmliZSwKKwkucmVhZCA9IGVuY3J5cHRlZF9yZWFkLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGtleV90eXBlX2VuY3J5cHRlZCk7CisKK3N0YXRpYyB2b2lkIGVuY3J5cHRlZF9zaGFzaF9yZWxlYXNlKHZvaWQpCit7CisJaWYgKGhhc2hhbGcpCisJCWNyeXB0b19mcmVlX3NoYXNoKGhhc2hhbGcpOworCWlmIChobWFjYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZW5jcnlwdGVkX3NoYXNoX2FsbG9jKHZvaWQpCit7CisJaW50IHJldDsKKworCWhtYWNhbGcgPSBjcnlwdG9fYWxsb2Nfc2hhc2goaG1hY19hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoaG1hY2FsZykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byAlc1xuIiwKKwkJCWhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoaG1hY2FsZyk7CisJfQorCisJaGFzaGFsZyA9IGNyeXB0b19hbGxvY19zaGFzaChoYXNoX2FsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihoYXNoYWxnKSkgeworCQlwcl9pbmZvKCJlbmNyeXB0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaGFzaF9hbGcpOworCQlyZXQgPSBQVFJfRVJSKGhhc2hhbGcpOworCQlnb3RvIGhhc2hhbGdfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworaGFzaGFsZ19mYWlsOgorCWNyeXB0b19mcmVlX3NoYXNoKGhtYWNhbGcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW5jcnlwdGVkKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGVuY3J5cHRlZF9zaGFzaF9hbGxvYygpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV9lbmNyeXB0ZWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gYWVzX2dldF9zaXplcygpOworb3V0OgorCWVuY3J5cHRlZF9zaGFzaF9yZWxlYXNlKCk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9lbmNyeXB0ZWQodm9pZCkKK3sKKwllbmNyeXB0ZWRfc2hhc2hfcmVsZWFzZSgpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX2VuY3J5cHRlZCk7Cit9CisKK2xhdGVfaW5pdGNhbGwoaW5pdF9lbmNyeXB0ZWQpOworbW9kdWxlX2V4aXQoY2xlYW51cF9lbmNyeXB0ZWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmggYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmNWUyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkX2RlZmluZWQuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9fRU5DUllQVEVEX0tFWV9ICisjZGVmaW5lIF9fRU5DUllQVEVEX0tFWV9ICisKKyNkZWZpbmUgRU5DUllQVEVEX0RFQlVHIDAKKworI2lmIEVOQ1JZUFRFRF9ERUJVRworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfbWFzdGVyX2tleShjb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJtYXN0ZXIga2V5OiAiLCBEVU1QX1BSRUZJWF9OT05FLCAzMiwgMSwKKwkJICAgICAgIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kZWNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCkKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImRlY3J5cHRlZCBkYXRhOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAzMiwgMSwKKwkJICAgICAgIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwKKwkJICAgICAgIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2VuY3J5cHRlZF9kYXRhKHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZW5jcnlwdGVkX2RhdGFsZW4pCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJlbmNyeXB0ZWQgZGF0YTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsCisJCSAgICAgICBlcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEsIGVuY3J5cHRlZF9kYXRhbGVuLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaG1hYyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHU4ICpkaWdlc3QsCisJCQkgICAgIHVuc2lnbmVkIGludCBobWFjX3NpemUpCit7CisJaWYgKHN0cikKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogJXMiLCBzdHIpOworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiaG1hYzogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsIGRpZ2VzdCwKKwkJICAgICAgIGhtYWNfc2l6ZSwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfbWFzdGVyX2tleShjb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2RlY3J5cHRlZF9kYXRhKHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9lbmNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9obWFjKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgdTggKmRpZ2VzdCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGhtYWNfc2l6ZSkKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5jIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzVlOWYyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOgorICogRGF2aWQgU2FmZm9yZCA8c2FmZm9yZEB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFNlZSBEb2N1bWVudGF0aW9uL2tleXMtdHJ1c3RlZC1lbmNyeXB0ZWQudHh0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGtleXMvdXNlci10eXBlLmg+CisjaW5jbHVkZSA8a2V5cy90cnVzdGVkLXR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RwbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RwbV9jb21tYW5kLmg+CisKKyNpbmNsdWRlICJ0cnVzdGVkX2RlZmluZWQuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgaG1hY19hbGdbXSA9ICJobWFjKHNoYTEpIjsKK3N0YXRpYyBjb25zdCBjaGFyIGhhc2hfYWxnW10gPSAic2hhMSI7CisKK3N0cnVjdCBzZGVzYyB7CisJc3RydWN0IHNoYXNoX2Rlc2Mgc2hhc2g7CisJY2hhciBjdHhbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpoYXNoYWxnOworc3RhdGljIHN0cnVjdCBjcnlwdG9fc2hhc2ggKmhtYWNhbGc7CisKK3N0YXRpYyBzdHJ1Y3Qgc2Rlc2MgKmluaXRfc2Rlc2Moc3RydWN0IGNyeXB0b19zaGFzaCAqYWxnKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBzaGFzaF9kZXNjKSArIGNyeXB0b19zaGFzaF9kZXNjc2l6ZShhbGcpOworCXNkZXNjID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkZXNjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzZGVzYy0+c2hhc2gudGZtID0gYWxnOworCXNkZXNjLT5zaGFzaC5mbGFncyA9IDB4MDsKKwlyZXR1cm4gc2Rlc2M7Cit9CisKK3N0YXRpYyBpbnQgVFNTX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFsZW4sCisJCSAgICB1bnNpZ25lZCBjaGFyICpkaWdlc3QpCit7CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwlpbnQgcmV0OworCisJc2Rlc2MgPSBpbml0X3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjYW4ndCBhbGxvYyAlc1xuIiwgaGFzaF9hbGcpOworCQlyZXR1cm4gUFRSX0VSUihzZGVzYyk7CisJfQorCisJcmV0ID0gY3J5cHRvX3NoYXNoX2RpZ2VzdCgmc2Rlc2MtPnNoYXNoLCBkYXRhLCBkYXRhbGVuLCBkaWdlc3QpOworCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IFRTU19yYXdobWFjKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgLi4uKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJdmFfbGlzdCBhcmdwOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IHJldDsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhobWFjYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9zZXRrZXkoaG1hY2FsZywga2V5LCBrZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2Rlc2MtPnNoYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl2YV9zdGFydChhcmdwLCBrZXlsZW4pOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRhdGEgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgY2hhciAqKTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGRhdGEsIGRsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwl2YV9lbmQoYXJncCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBkaWdlc3QpOworb3V0OgorCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY2FsY3VsYXRlIGF1dGhvcml6YXRpb24gaW5mbyBmaWVsZHMgdG8gc2VuZCB0byBUUE0KKyAqLworc3RhdGljIGludCBUU1NfYXV0aGhtYWModW5zaWduZWQgY2hhciAqZGlnZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQl1bnNpZ25lZCBpbnQga2V5bGVuLCB1bnNpZ25lZCBjaGFyICpoMSwKKwkJCXVuc2lnbmVkIGNoYXIgKmgyLCB1bnNpZ25lZCBjaGFyIGgzLCAuLi4pCit7CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgY2hhciBjOworCWludCByZXQ7CisJdmFfbGlzdCBhcmdwOworCisJc2Rlc2MgPSBpbml0X3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjYW4ndCBhbGxvYyAlc1xuIiwgaGFzaF9hbGcpOworCQlyZXR1cm4gUFRSX0VSUihzZGVzYyk7CisJfQorCisJYyA9IGgzOworCXJldCA9IGNyeXB0b19zaGFzaF9pbml0KCZzZGVzYy0+c2hhc2gpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YV9zdGFydChhcmdwLCBoMyk7CisJZm9yICg7OykgeworCQlkbGVuID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7CisJCWlmIChkbGVuID09IDApCisJCQlicmVhazsKKwkJZGF0YSA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBjaGFyICopOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGRhdGEsIGRsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJdmFfZW5kKGFyZ3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJdmFfZW5kKGFyZ3ApOworCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBwYXJhbWRpZ2VzdCk7CisJaWYgKCFyZXQpCisJCXJldCA9IFRTU19yYXdobWFjKGRpZ2VzdCwga2V5LCBrZXlsZW4sIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGgxLAorCQkJCSAgVFBNX05PTkNFX1NJWkUsIGgyLCAxLCAmYywgMCwgMCk7CitvdXQ6CisJa2ZyZWUoc2Rlc2MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB2ZXJpZnkgdGhlIEFVVEgxX0NPTU1BTkQgKFNlYWwpIHJlc3VsdCBmcm9tIFRQTQorICovCitzdGF0aWMgaW50IFRTU19jaGVja2htYWMxKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgY29uc3QgdWludDMyX3QgY29tbWFuZCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb25vbmNlLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgIHVuc2lnbmVkIGludCBrZXlsZW4sIC4uLikKK3sKKwl1aW50MzJfdCBidWZzaXplOworCXVpbnQxNl90IHRhZzsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICplbm9uY2U7CisJdW5zaWduZWQgY2hhciAqY29udGludWVmbGFnOworCXVuc2lnbmVkIGNoYXIgKmF1dGhkYXRhOworCXVuc2lnbmVkIGNoYXIgdGVzdGhtYWNbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGludCBkcG9zOworCXZhX2xpc3QgYXJncDsKKwlpbnQgcmV0OworCisJYnVmc2l6ZSA9IExPQUQzMihidWZmZXIsIFRQTV9TSVpFX09GRlNFVCk7CisJdGFnID0gTE9BRDE2KGJ1ZmZlciwgMCk7CisJb3JkaW5hbCA9IGNvbW1hbmQ7CisJcmVzdWx0ID0gTE9BRDMyTihidWZmZXIsIFRQTV9SRVRVUk5fT0ZGU0VUKTsKKwlpZiAodGFnID09IFRQTV9UQUdfUlNQX0NPTU1BTkQpCisJCXJldHVybiAwOworCWlmICh0YWcgIT0gVFBNX1RBR19SU1BfQVVUSDFfQ09NTUFORCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYXV0aGRhdGEgPSBidWZmZXIgKyBidWZzaXplIC0gU0hBMV9ESUdFU1RfU0laRTsKKwljb250aW51ZWZsYWcgPSBhdXRoZGF0YSAtIDE7CisJZW5vbmNlID0gY29udGludWVmbGFnIC0gVFBNX05PTkNFX1NJWkU7CisKKwlzZGVzYyA9IGluaXRfc2Rlc2MoaGFzaGFsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBoYXNoX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisJcmV0ID0gY3J5cHRvX3NoYXNoX2luaXQoJnNkZXNjLT5zaGFzaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgKGNvbnN0IHU4ICopJnJlc3VsdCwKKwkJCQkgIHNpemVvZiByZXN1bHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIChjb25zdCB1OCAqKSZvcmRpbmFsLAorCQkJCSAgc2l6ZW9mIG9yZGluYWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YV9zdGFydChhcmdwLCBrZXlsZW4pOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRwb3MgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCBidWZmZXIgKyBkcG9zLCBkbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXZhX2VuZChhcmdwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXZhX2VuZChhcmdwKTsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNkZXNjLT5zaGFzaCwgcGFyYW1kaWdlc3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IFRTU19yYXdobWFjKHRlc3RobWFjLCBrZXksIGtleWxlbiwgU0hBMV9ESUdFU1RfU0laRSwgcGFyYW1kaWdlc3QsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBlbm9uY2UsIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsCisJCQkgIDEsIGNvbnRpbnVlZmxhZywgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKG1lbWNtcCh0ZXN0aG1hYywgYXV0aGRhdGEsIFNIQTFfRElHRVNUX1NJWkUpKQorCQlyZXQgPSAtRUlOVkFMOworb3V0OgorCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdmVyaWZ5IHRoZSBBVVRIMl9DT01NQU5EICh1bnNlYWwpIHJlc3VsdCBmcm9tIFRQTQorICovCitzdGF0aWMgaW50IFRTU19jaGVja2htYWMyKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSAgY29uc3QgdWludDMyX3QgY29tbWFuZCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqb25vbmNlLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXkxLAorCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuMSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5MiwKKwkJCSAgdW5zaWduZWQgaW50IGtleWxlbjIsIC4uLikKK3sKKwl1aW50MzJfdCBidWZzaXplOworCXVpbnQxNl90IHRhZzsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICplbm9uY2UxOworCXVuc2lnbmVkIGNoYXIgKmNvbnRpbnVlZmxhZzE7CisJdW5zaWduZWQgY2hhciAqYXV0aGRhdGExOworCXVuc2lnbmVkIGNoYXIgKmVub25jZTI7CisJdW5zaWduZWQgY2hhciAqY29udGludWVmbGFnMjsKKwl1bnNpZ25lZCBjaGFyICphdXRoZGF0YTI7CisJdW5zaWduZWQgY2hhciB0ZXN0aG1hYzFbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciB0ZXN0aG1hYzJbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBwYXJhbWRpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXVuc2lnbmVkIGludCBkbGVuOworCXVuc2lnbmVkIGludCBkcG9zOworCXZhX2xpc3QgYXJncDsKKwlpbnQgcmV0OworCisJYnVmc2l6ZSA9IExPQUQzMihidWZmZXIsIFRQTV9TSVpFX09GRlNFVCk7CisJdGFnID0gTE9BRDE2KGJ1ZmZlciwgMCk7CisJb3JkaW5hbCA9IGNvbW1hbmQ7CisJcmVzdWx0ID0gTE9BRDMyTihidWZmZXIsIFRQTV9SRVRVUk5fT0ZGU0VUKTsKKworCWlmICh0YWcgPT0gVFBNX1RBR19SU1BfQ09NTUFORCkKKwkJcmV0dXJuIDA7CisJaWYgKHRhZyAhPSBUUE1fVEFHX1JTUF9BVVRIMl9DT01NQU5EKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhdXRoZGF0YTEgPSBidWZmZXIgKyBidWZzaXplIC0gKFNIQTFfRElHRVNUX1NJWkUgKyAxCisJCQkrIFNIQTFfRElHRVNUX1NJWkUgKyBTSEExX0RJR0VTVF9TSVpFKTsKKwlhdXRoZGF0YTIgPSBidWZmZXIgKyBidWZzaXplIC0gKFNIQTFfRElHRVNUX1NJWkUpOworCWNvbnRpbnVlZmxhZzEgPSBhdXRoZGF0YTEgLSAxOworCWNvbnRpbnVlZmxhZzIgPSBhdXRoZGF0YTIgLSAxOworCWVub25jZTEgPSBjb250aW51ZWZsYWcxIC0gVFBNX05PTkNFX1NJWkU7CisJZW5vbmNlMiA9IGNvbnRpbnVlZmxhZzIgLSBUUE1fTk9OQ0VfU0laRTsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhoYXNoYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKwlyZXQgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2Rlc2MtPnNoYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCAoY29uc3QgdTggKikmcmVzdWx0LAorCQkJCSAgc2l6ZW9mIHJlc3VsdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgKGNvbnN0IHU4ICopJm9yZGluYWwsCisJCQkJICBzaXplb2Ygb3JkaW5hbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdmFfc3RhcnQoYXJncCwga2V5bGVuMik7CisJZm9yICg7OykgeworCQlkbGVuID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7CisJCWlmIChkbGVuID09IDApCisJCQlicmVhazsKKwkJZHBvcyA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIGJ1ZmZlciArIGRwb3MsIGRsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJdmFfZW5kKGFyZ3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJdmFfZW5kKGFyZ3ApOworCXJldCA9IGNyeXB0b19zaGFzaF9maW5hbCgmc2Rlc2MtPnNoYXNoLCBwYXJhbWRpZ2VzdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gVFNTX3Jhd2htYWModGVzdGhtYWMxLCBrZXkxLCBrZXlsZW4xLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGVub25jZTEsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsIDEsIGNvbnRpbnVlZmxhZzEsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAobWVtY21wKHRlc3RobWFjMSwgYXV0aGRhdGExLCBTSEExX0RJR0VTVF9TSVpFKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gVFNTX3Jhd2htYWModGVzdGhtYWMyLCBrZXkyLCBrZXlsZW4yLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICBwYXJhbWRpZ2VzdCwgVFBNX05PTkNFX1NJWkUsIGVub25jZTIsCisJCQkgIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsIDEsIGNvbnRpbnVlZmxhZzIsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAobWVtY21wKHRlc3RobWFjMiwgYXV0aGRhdGEyLCBTSEExX0RJR0VTVF9TSVpFKSkKKwkJcmV0ID0gLUVJTlZBTDsKK291dDoKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZvciBrZXkgc3BlY2lmaWMgdHBtIHJlcXVlc3RzLCB3ZSB3aWxsIGdlbmVyYXRlIGFuZCBzZW5kIG91cgorICogb3duIFRQTSBjb21tYW5kIHBhY2tldHMgdXNpbmcgdGhlIGRyaXZlcnMgc2VuZCBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCB0cnVzdGVkX3RwbV9zZW5kKGNvbnN0IHUzMiBjaGlwX251bSwgdW5zaWduZWQgY2hhciAqY21kLAorCQkJICAgIHNpemVfdCBidWZsZW4pCit7CisJaW50IHJjOworCisJZHVtcF90cG1fYnVmKGNtZCk7CisJcmMgPSB0cG1fc2VuZChjaGlwX251bSwgY21kLCBidWZsZW4pOworCWR1bXBfdHBtX2J1ZihjbWQpOworCWlmIChyYyA+IDApCisJCS8qIENhbid0IHJldHVybiBwb3NpdGl2ZSByZXR1cm4gY29kZXMgdmFsdWVzIHRvIGtleWN0bCAqLworCQlyYyA9IC1FUEVSTTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBnZXQgYSByYW5kb20gdmFsdWUgZnJvbSBUUE0KKyAqLworc3RhdGljIGludCB0cG1fZ2V0X3JhbmRvbShzdHJ1Y3QgdHBtX2J1ZiAqdGIsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3QgbGVuKQoreworCWludCByZXQ7CisKKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX0dFVFJBTkRPTV9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX0dFVFJBTkRPTSk7CisJc3RvcmUzMih0YiwgbGVuKTsKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgc2l6ZW9mIHRiLT5kYXRhKTsKKwlpZiAoIXJldCkKKwkJbWVtY3B5KGJ1ZiwgdGItPmRhdGEgKyBUUE1fR0VUUkFORE9NX1NJWkUsIGxlbik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteV9nZXRfcmFuZG9tKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdHBtX2J1ZiAqdGI7CisJaW50IHJldDsKKworCXRiID0ga21hbGxvYyhzaXplb2YgKnRiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0YiwgYnVmLCBsZW4pOworCisJa2ZyZWUodGIpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMb2NrIGEgdHJ1c3RlZCBrZXksIGJ5IGV4dGVuZGluZyBhIHNlbGVjdGVkIFBDUi4KKyAqCisgKiBQcmV2ZW50cyBhIHRydXN0ZWQga2V5IHRoYXQgaXMgc2VhbGVkIHRvIFBDUnMgZnJvbSBiZWluZyBhY2Nlc3NlZC4KKyAqIFRoaXMgdXNlcyB0aGUgdHBtIGRyaXZlcidzIGV4dGVuZCBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBwY3Jsb2NrKGNvbnN0IGludCBwY3JudW0pCit7CisJdW5zaWduZWQgY2hhciBoYXNoW1NIQTFfRElHRVNUX1NJWkVdOworCWludCByZXQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0ID0gbXlfZ2V0X3JhbmRvbShoYXNoLCBTSEExX0RJR0VTVF9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gdHBtX3Bjcl9leHRlbmQoVFBNX0FOWV9OVU0sIHBjcm51bSwgaGFzaCkgPyAtRUlOVkFMIDogMDsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBvYmplY3Qgc3BlY2lmaWMgYXV0aG9yaXNhdGlvbiBwcm90b2NvbCAoT1NBUCkgc2Vzc2lvbgorICovCitzdGF0aWMgaW50IG9zYXAoc3RydWN0IHRwbV9idWYgKnRiLCBzdHJ1Y3Qgb3NhcHNlc3MgKnMsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdWludDE2X3QgdHlwZSwgdWludDMyX3QgaGFuZGxlKQoreworCXVuc2lnbmVkIGNoYXIgZW5vbmNlW1RQTV9OT05DRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIG9ub25jZVtUUE1fTk9OQ0VfU0laRV07CisJaW50IHJldDsKKworCXJldCA9IHRwbV9nZXRfcmFuZG9tKHRiLCBvbm9uY2UsIFRQTV9OT05DRV9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCUlOSVRfQlVGKHRiKTsKKwlzdG9yZTE2KHRiLCBUUE1fVEFHX1JRVV9DT01NQU5EKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1NBUF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX09TQVApOworCXN0b3JlMTYodGIsIHR5cGUpOworCXN0b3JlMzIodGIsIGhhbmRsZSk7CisJc3RvcmVieXRlcyh0Yiwgb25vbmNlLCBUUE1fTk9OQ0VfU0laRSk7CisKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgTUFYX0JVRl9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXMtPmhhbmRsZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwltZW1jcHkocy0+ZW5vbmNlLCAmKHRiLT5kYXRhW1RQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCldKSwKKwkgICAgICAgVFBNX05PTkNFX1NJWkUpOworCW1lbWNweShlbm9uY2UsICYodGItPmRhdGFbVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSArCisJCQkJICBUUE1fTk9OQ0VfU0laRV0pLCBUUE1fTk9OQ0VfU0laRSk7CisJcmV0dXJuIFRTU19yYXdobWFjKHMtPnNlY3JldCwga2V5LCBTSEExX0RJR0VTVF9TSVpFLCBUUE1fTk9OQ0VfU0laRSwKKwkJCSAgIGVub25jZSwgVFBNX05PTkNFX1NJWkUsIG9ub25jZSwgMCwgMCk7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gb2JqZWN0IGluZGVwZW5kZW50IGF1dGhvcmlzYXRpb24gcHJvdG9jb2wgKG9pYXApIHNlc3Npb24KKyAqLworc3RhdGljIGludCBvaWFwKHN0cnVjdCB0cG1fYnVmICp0YiwgdWludDMyX3QgKmhhbmRsZSwgdW5zaWduZWQgY2hhciAqbm9uY2UpCit7CisJaW50IHJldDsKKworCUlOSVRfQlVGKHRiKTsKKwlzdG9yZTE2KHRiLCBUUE1fVEFHX1JRVV9DT01NQU5EKTsKKwlzdG9yZTMyKHRiLCBUUE1fT0lBUF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBUUE1fT1JEX09JQVApOworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmhhbmRsZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwltZW1jcHkobm9uY2UsICZ0Yi0+ZGF0YVtUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpXSwKKwkgICAgICAgVFBNX05PTkNFX1NJWkUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdHBtX2RpZ2VzdHMgeworCXVuc2lnbmVkIGNoYXIgZW5jYXV0aFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIHB1YmF1dGhbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciB4b3J3b3JrW1NIQTFfRElHRVNUX1NJWkUgKiAyXTsKKwl1bnNpZ25lZCBjaGFyIHhvcmhhc2hbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBub25jZW9kZFtUUE1fTk9OQ0VfU0laRV07Cit9OworCisvKgorICogSGF2ZSB0aGUgVFBNIHNlYWwoZW5jcnlwdCkgdGhlIHRydXN0ZWQga2V5LCBwb3NzaWJseSBiYXNlZCBvbgorICogUGxhdGZvcm0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMgKFBDUnMpLiBBVVRIMSBmb3Igc2VhbGluZyBrZXkuCisgKi8KK3N0YXRpYyBpbnQgdHBtX3NlYWwoc3RydWN0IHRwbV9idWYgKnRiLCB1aW50MTZfdCBrZXl0eXBlLAorCQkgICAgdWludDMyX3Qga2V5aGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXlhdXRoLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdWludDMyX3QgZGF0YWxlbiwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKmJsb2IsIHVpbnQzMl90ICpibG9ibGVuLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYmF1dGgsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwY3JpbmZvLCB1aW50MzJfdCBwY3JpbmZvc2l6ZSkKK3sKKwlzdHJ1Y3Qgb3NhcHNlc3Mgc2VzczsKKwlzdHJ1Y3QgdHBtX2RpZ2VzdHMgKnRkOworCXVuc2lnbmVkIGNoYXIgY29udDsKKwl1aW50MzJfdCBvcmRpbmFsOworCXVpbnQzMl90IHBjcnNpemU7CisJdWludDMyX3QgZGF0c2l6ZTsKKwlpbnQgc2VhbGluZm9zaXplOworCWludCBlbmNkYXRhc2l6ZTsKKwlpbnQgc3RvcmVkc2l6ZTsKKwlpbnQgcmV0OworCWludCBpOworCisJLyogYWxsb2Mgc29tZSB3b3JrIHNwYWNlIGZvciBhbGwgdGhlIGhhc2hlcyAqLworCXRkID0ga21hbGxvYyhzaXplb2YgKnRkLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGdldCBzZXNzaW9uIGZvciBzZWFsaW5nIGtleSAqLworCXJldCA9IG9zYXAodGIsICZzZXNzLCBrZXlhdXRoLCBrZXl0eXBlLCBrZXloYW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWR1bXBfc2Vzcygmc2Vzcyk7CisKKwkvKiBjYWxjdWxhdGUgZW5jcnlwdGVkIGF1dGhvcml6YXRpb24gdmFsdWUgKi8KKwltZW1jcHkodGQtPnhvcndvcmssIHNlc3Muc2VjcmV0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwltZW1jcHkodGQtPnhvcndvcmsgKyBTSEExX0RJR0VTVF9TSVpFLCBzZXNzLmVub25jZSwgU0hBMV9ESUdFU1RfU0laRSk7CisJcmV0ID0gVFNTX3NoYTEodGQtPnhvcndvcmssIFNIQTFfRElHRVNUX1NJWkUgKiAyLCB0ZC0+eG9yaGFzaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0YiwgdGQtPm5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJb3JkaW5hbCA9IGh0b25sKFRQTV9PUkRfU0VBTCk7CisJZGF0c2l6ZSA9IGh0b25sKGRhdGFsZW4pOworCXBjcnNpemUgPSBodG9ubChwY3JpbmZvc2l6ZSk7CisJY29udCA9IDA7CisKKwkvKiBlbmNyeXB0IGRhdGEgYXV0aG9yaXphdGlvbiBrZXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0hBMV9ESUdFU1RfU0laRTsgKytpKQorCQl0ZC0+ZW5jYXV0aFtpXSA9IHRkLT54b3JoYXNoW2ldIF4gYmxvYmF1dGhbaV07CisKKwkvKiBjYWxjdWxhdGUgYXV0aG9yaXphdGlvbiBITUFDIHZhbHVlICovCisJaWYgKHBjcmluZm9zaXplID09IDApIHsKKwkJLyogbm8gcGNyIGluZm8gc3BlY2lmaWVkICovCisJCXJldCA9IFRTU19hdXRoaG1hYyh0ZC0+cHViYXV0aCwgc2Vzcy5zZWNyZXQsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgc2Vzcy5lbm9uY2UsIHRkLT5ub25jZW9kZCwgY29udCwKKwkJCQkgICBzaXplb2YodWludDMyX3QpLCAmb3JkaW5hbCwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCQkgICB0ZC0+ZW5jYXV0aCwgc2l6ZW9mKHVpbnQzMl90KSwgJnBjcnNpemUsCisJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSwgJmRhdHNpemUsIGRhdGFsZW4sIGRhdGEsIDAsCisJCQkJICAgMCk7CisJfSBlbHNlIHsKKwkJLyogcGNyIGluZm8gc3BlY2lmaWVkICovCisJCXJldCA9IFRTU19hdXRoaG1hYyh0ZC0+cHViYXV0aCwgc2Vzcy5zZWNyZXQsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgc2Vzcy5lbm9uY2UsIHRkLT5ub25jZW9kZCwgY29udCwKKwkJCQkgICBzaXplb2YodWludDMyX3QpLCAmb3JkaW5hbCwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCQkgICB0ZC0+ZW5jYXV0aCwgc2l6ZW9mKHVpbnQzMl90KSwgJnBjcnNpemUsCisJCQkJICAgcGNyaW5mb3NpemUsIHBjcmluZm8sIHNpemVvZih1aW50MzJfdCksCisJCQkJICAgJmRhdHNpemUsIGRhdGFsZW4sIGRhdGEsIDAsIDApOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGJ1aWxkIGFuZCBzZW5kIHRoZSBUUE0gcmVxdWVzdCBwYWNrZXQgKi8KKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQVVUSDFfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX1NFQUxfU0laRSArIHBjcmluZm9zaXplICsgZGF0YWxlbik7CisJc3RvcmUzMih0YiwgVFBNX09SRF9TRUFMKTsKKwlzdG9yZTMyKHRiLCBrZXloYW5kbGUpOworCXN0b3JlYnl0ZXModGIsIHRkLT5lbmNhdXRoLCBTSEExX0RJR0VTVF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBwY3JpbmZvc2l6ZSk7CisJc3RvcmVieXRlcyh0YiwgcGNyaW5mbywgcGNyaW5mb3NpemUpOworCXN0b3JlMzIodGIsIGRhdGFsZW4pOworCXN0b3JlYnl0ZXModGIsIGRhdGEsIGRhdGFsZW4pOworCXN0b3JlMzIodGIsIHNlc3MuaGFuZGxlKTsKKwlzdG9yZWJ5dGVzKHRiLCB0ZC0+bm9uY2VvZGQsIFRQTV9OT05DRV9TSVpFKTsKKwlzdG9yZTgodGIsIGNvbnQpOworCXN0b3JlYnl0ZXModGIsIHRkLT5wdWJhdXRoLCBTSEExX0RJR0VTVF9TSVpFKTsKKworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBCbG9iICovCisJc2VhbGluZm9zaXplID0gTE9BRDMyKHRiLT5kYXRhLCBUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpKTsKKwllbmNkYXRhc2l6ZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSArCisJCQkgICAgIHNpemVvZih1aW50MzJfdCkgKyBzZWFsaW5mb3NpemUpOworCXN0b3JlZHNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKHVpbnQzMl90KSArIHNlYWxpbmZvc2l6ZSArCisJICAgIHNpemVvZih1aW50MzJfdCkgKyBlbmNkYXRhc2l6ZTsKKworCS8qIGNoZWNrIHRoZSBITUFDIGluIHRoZSByZXNwb25zZSAqLworCXJldCA9IFRTU19jaGVja2htYWMxKHRiLT5kYXRhLCBvcmRpbmFsLCB0ZC0+bm9uY2VvZGQsIHNlc3Muc2VjcmV0LAorCQkJICAgICBTSEExX0RJR0VTVF9TSVpFLCBzdG9yZWRzaXplLCBUUE1fREFUQV9PRkZTRVQsIDAsCisJCQkgICAgIDApOworCisJLyogY29weSB0aGUgcmV0dXJuZWQgYmxvYiB0byBjYWxsZXIgKi8KKwlpZiAoIXJldCkgeworCQltZW1jcHkoYmxvYiwgdGItPmRhdGEgKyBUUE1fREFUQV9PRkZTRVQsIHN0b3JlZHNpemUpOworCQkqYmxvYmxlbiA9IHN0b3JlZHNpemU7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB1c2UgdGhlIEFVVEgyX0NPTU1BTkQgZm9ybSBvZiB1bnNlYWwsIHRvIGF1dGhvcml6ZSBib3RoIGtleSBhbmQgYmxvYgorICovCitzdGF0aWMgaW50IHRwbV91bnNlYWwoc3RydWN0IHRwbV9idWYgKnRiLAorCQkgICAgICB1aW50MzJfdCBrZXloYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleWF1dGgsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2IsIGludCBibG9ibGVuLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9iYXV0aCwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50ICpkYXRhbGVuKQoreworCXVuc2lnbmVkIGNoYXIgbm9uY2VvZGRbVFBNX05PTkNFX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgZW5vbmNlMVtUUE1fTk9OQ0VfU0laRV07CisJdW5zaWduZWQgY2hhciBlbm9uY2UyW1RQTV9OT05DRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGF1dGhkYXRhMVtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGF1dGhkYXRhMltTSEExX0RJR0VTVF9TSVpFXTsKKwl1aW50MzJfdCBhdXRoaGFuZGxlMSA9IDA7CisJdWludDMyX3QgYXV0aGhhbmRsZTIgPSAwOworCXVuc2lnbmVkIGNoYXIgY29udCA9IDA7CisJdWludDMyX3Qgb3JkaW5hbDsKKwl1aW50MzJfdCBrZXlobmRsOworCWludCByZXQ7CisKKwkvKiBzZXNzaW9ucyBmb3IgdW5zZWFsaW5nIGtleSBhbmQgZGF0YSAqLworCXJldCA9IG9pYXAodGIsICZhdXRoaGFuZGxlMSwgZW5vbmNlMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG9pYXAgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IG9pYXAodGIsICZhdXRoaGFuZGxlMiwgZW5vbmNlMik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG9pYXAgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJb3JkaW5hbCA9IGh0b25sKFRQTV9PUkRfVU5TRUFMKTsKKwlrZXlobmRsID0gaHRvbmwoU1JLSEFORExFKTsKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0Yiwgbm9uY2VvZGQsIFRQTV9OT05DRV9TSVpFKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogdHBtX2dldF9yYW5kb20gZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IFRTU19hdXRoaG1hYyhhdXRoZGF0YTEsIGtleWF1dGgsIFRQTV9OT05DRV9TSVpFLAorCQkJICAgZW5vbmNlMSwgbm9uY2VvZGQsIGNvbnQsIHNpemVvZih1aW50MzJfdCksCisJCQkgICAmb3JkaW5hbCwgYmxvYmxlbiwgYmxvYiwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gVFNTX2F1dGhobWFjKGF1dGhkYXRhMiwgYmxvYmF1dGgsIFRQTV9OT05DRV9TSVpFLAorCQkJICAgZW5vbmNlMiwgbm9uY2VvZGQsIGNvbnQsIHNpemVvZih1aW50MzJfdCksCisJCQkgICAmb3JkaW5hbCwgYmxvYmxlbiwgYmxvYiwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBidWlsZCBhbmQgc2VuZCBUUE0gcmVxdWVzdCBwYWNrZXQgKi8KKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQVVUSDJfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX1VOU0VBTF9TSVpFICsgYmxvYmxlbik7CisJc3RvcmUzMih0YiwgVFBNX09SRF9VTlNFQUwpOworCXN0b3JlMzIodGIsIGtleWhhbmRsZSk7CisJc3RvcmVieXRlcyh0YiwgYmxvYiwgYmxvYmxlbik7CisJc3RvcmUzMih0YiwgYXV0aGhhbmRsZTEpOworCXN0b3JlYnl0ZXModGIsIG5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJc3RvcmU4KHRiLCBjb250KTsKKwlzdG9yZWJ5dGVzKHRiLCBhdXRoZGF0YTEsIFNIQTFfRElHRVNUX1NJWkUpOworCXN0b3JlMzIodGIsIGF1dGhoYW5kbGUyKTsKKwlzdG9yZWJ5dGVzKHRiLCBub25jZW9kZCwgVFBNX05PTkNFX1NJWkUpOworCXN0b3JlOCh0YiwgY29udCk7CisJc3RvcmVieXRlcyh0YiwgYXV0aGRhdGEyLCBTSEExX0RJR0VTVF9TSVpFKTsKKworCXJldCA9IHRydXN0ZWRfdHBtX3NlbmQoVFBNX0FOWV9OVU0sIHRiLT5kYXRhLCBNQVhfQlVGX1NJWkUpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBhdXRoaG1hYyBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YWxlbiA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUKTsKKwlyZXQgPSBUU1NfY2hlY2tobWFjMih0Yi0+ZGF0YSwgb3JkaW5hbCwgbm9uY2VvZGQsCisJCQkgICAgIGtleWF1dGgsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkgICAgIGJsb2JhdXRoLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICAgICBzaXplb2YodWludDMyX3QpLCBUUE1fREFUQV9PRkZTRVQsCisJCQkgICAgICpkYXRhbGVuLCBUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpLCAwLAorCQkJICAgICAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogVFNTX2NoZWNraG1hYzIgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW1lbWNweShkYXRhLCB0Yi0+ZGF0YSArIFRQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCksICpkYXRhbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhdmUgdGhlIFRQTSBzZWFsKGVuY3J5cHQpIHRoZSBzeW1tZXRyaWMga2V5CisgKi8KK3N0YXRpYyBpbnQga2V5X3NlYWwoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAsCisJCSAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgdHBtX2J1ZiAqdGI7CisJaW50IHJldDsKKworCXRiID0ga3phbGxvYyhzaXplb2YgKnRiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluY2x1ZGUgbWlncmF0YWJsZSBmbGFnIGF0IGVuZCBvZiBzZWFsZWQga2V5ICovCisJcC0+a2V5W3AtPmtleV9sZW5dID0gcC0+bWlncmF0YWJsZTsKKworCXJldCA9IHRwbV9zZWFsKHRiLCBvLT5rZXl0eXBlLCBvLT5rZXloYW5kbGUsIG8tPmtleWF1dGgsCisJCSAgICAgICBwLT5rZXksIHAtPmtleV9sZW4gKyAxLCBwLT5ibG9iLCAmcC0+YmxvYl9sZW4sCisJCSAgICAgICBvLT5ibG9iYXV0aCwgby0+cGNyaW5mbywgby0+cGNyaW5mb19sZW4pOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogc3Jrc2VhbCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKworCWtmcmVlKHRiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSGF2ZSB0aGUgVFBNIHVuc2VhbChkZWNyeXB0KSB0aGUgc3ltbWV0cmljIGtleQorICovCitzdGF0aWMgaW50IGtleV91bnNlYWwoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAsCisJCSAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICpvKQoreworCXN0cnVjdCB0cG1fYnVmICp0YjsKKwlpbnQgcmV0OworCisJdGIgPSBremFsbG9jKHNpemVvZiAqdGIsIEdGUF9LRVJORUwpOworCWlmICghdGIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gdHBtX3Vuc2VhbCh0Yiwgby0+a2V5aGFuZGxlLCBvLT5rZXlhdXRoLCBwLT5ibG9iLCBwLT5ibG9iX2xlbiwKKwkJCSBvLT5ibG9iYXV0aCwgcC0+a2V5LCAmcC0+a2V5X2xlbik7CisJaWYgKHJldCA8IDApCisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBzcmt1bnNlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJZWxzZQorCQkvKiBwdWxsIG1pZ3JhdGFibGUgZmxhZyBvdXQgb2Ygc2VhbGVkIGtleSAqLworCQlwLT5taWdyYXRhYmxlID0gcC0+a2V5Wy0tcC0+a2V5X2xlbl07CisKKwlrZnJlZSh0Yik7CisJcmV0dXJuIHJldDsKK30KKworZW51bSB7CisJT3B0X2VyciA9IC0xLAorCU9wdF9uZXcsIE9wdF9sb2FkLCBPcHRfdXBkYXRlLAorCU9wdF9rZXloYW5kbGUsIE9wdF9rZXlhdXRoLCBPcHRfYmxvYmF1dGgsCisJT3B0X3BjcmluZm8sIE9wdF9wY3Jsb2NrLCBPcHRfbWlncmF0YWJsZQorfTsKKworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3Qga2V5X3Rva2VucyA9IHsKKwl7T3B0X25ldywgIm5ldyJ9LAorCXtPcHRfbG9hZCwgImxvYWQifSwKKwl7T3B0X3VwZGF0ZSwgInVwZGF0ZSJ9LAorCXtPcHRfa2V5aGFuZGxlLCAia2V5aGFuZGxlPSVzIn0sCisJe09wdF9rZXlhdXRoLCAia2V5YXV0aD0lcyJ9LAorCXtPcHRfYmxvYmF1dGgsICJibG9iYXV0aD0lcyJ9LAorCXtPcHRfcGNyaW5mbywgInBjcmluZm89JXMifSwKKwl7T3B0X3BjcmxvY2ssICJwY3Jsb2NrPSVzIn0sCisJe09wdF9taWdyYXRhYmxlLCAibWlncmF0YWJsZT0lcyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworLyogY2FuIGhhdmUgemVybyBvciBtb3JlIHRva2VuPSBvcHRpb25zICovCitzdGF0aWMgaW50IGdldG9wdGlvbnMoY2hhciAqYywgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheSwKKwkJICAgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdCkKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJY2hhciAqcCA9IGM7CisJaW50IHRva2VuOworCWludCByZXM7CisJdW5zaWduZWQgbG9uZyBoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBsb2NrOworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZjLCAiIFx0IikpKSB7CisJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJY29udGludWU7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwga2V5X3Rva2VucywgYXJncyk7CisKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9wY3JpbmZvOgorCQkJb3B0LT5wY3JpbmZvX2xlbiA9IHN0cmxlbihhcmdzWzBdLmZyb20pIC8gMjsKKwkJCWlmIChvcHQtPnBjcmluZm9fbGVuID4gTUFYX1BDUklORk9fU0laRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWhleDJiaW4ob3B0LT5wY3JpbmZvLCBhcmdzWzBdLmZyb20sIG9wdC0+cGNyaW5mb19sZW4pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2tleWhhbmRsZToKKwkJCXJlcyA9IHN0cmljdF9zdHJ0b3VsKGFyZ3NbMF0uZnJvbSwgMTYsICZoYW5kbGUpOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlvcHQtPmtleXR5cGUgPSBTRUFMX2tleXR5cGU7CisJCQlvcHQtPmtleWhhbmRsZSA9IGhhbmRsZTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9rZXlhdXRoOgorCQkJaWYgKHN0cmxlbihhcmdzWzBdLmZyb20pICE9IDIgKiBTSEExX0RJR0VTVF9TSVpFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaGV4MmJpbihvcHQtPmtleWF1dGgsIGFyZ3NbMF0uZnJvbSwgU0hBMV9ESUdFU1RfU0laRSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmxvYmF1dGg6CisJCQlpZiAoc3RybGVuKGFyZ3NbMF0uZnJvbSkgIT0gMiAqIFNIQTFfRElHRVNUX1NJWkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZXgyYmluKG9wdC0+YmxvYmF1dGgsIGFyZ3NbMF0uZnJvbSwgU0hBMV9ESUdFU1RfU0laRSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWlncmF0YWJsZToKKwkJCWlmICgqYXJnc1swXS5mcm9tID09ICcwJykKKwkJCQlwYXktPm1pZ3JhdGFibGUgPSAwOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3BjcmxvY2s6CisJCQlyZXMgPSBzdHJpY3Rfc3RydG91bChhcmdzWzBdLmZyb20sIDEwLCAmbG9jayk7CisJCQlpZiAocmVzIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCW9wdC0+cGNybG9jayA9IGxvY2s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZGF0YWJsb2JfcGFyc2UgLSBwYXJzZSB0aGUga2V5Y3RsIGRhdGEgYW5kIGZpbGwgaW4gdGhlCisgKiAJCSAgICBwYXlsb2FkIGFuZCBvcHRpb25zIHN0cnVjdHVyZXMKKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgMCwgb3RoZXJ3aXNlIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgZGF0YWJsb2JfcGFyc2UoY2hhciAqZGF0YWJsb2IsIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwLAorCQkJICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJbG9uZyBrZXlsZW47CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGtleV9jbWQ7CisJY2hhciAqYzsKKworCS8qIG1haW4gY29tbWFuZCAqLworCWMgPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlrZXlfY21kID0gbWF0Y2hfdG9rZW4oYywga2V5X3Rva2VucywgYXJncyk7CisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbmV3OgorCQkvKiBmaXJzdCBhcmd1bWVudCBpcyBrZXkgc2l6ZSAqLworCQljID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCQlpZiAoIWMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChjLCAxMCwgJmtleWxlbik7CisJCWlmIChyZXQgPCAwIHx8IGtleWxlbiA8IE1JTl9LRVlfU0laRSB8fCBrZXlsZW4gPiBNQVhfS0VZX1NJWkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcC0+a2V5X2xlbiA9IGtleWxlbjsKKwkJcmV0ID0gZ2V0b3B0aW9ucyhkYXRhYmxvYiwgcCwgbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gT3B0X25ldzsKKwkJYnJlYWs7CisJY2FzZSBPcHRfbG9hZDoKKwkJLyogZmlyc3QgYXJndW1lbnQgaXMgc2VhbGVkIGJsb2IgKi8KKwkJYyA9IHN0cnNlcCgmZGF0YWJsb2IsICIgXHQiKTsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAtPmJsb2JfbGVuID0gc3RybGVuKGMpIC8gMjsKKwkJaWYgKHAtPmJsb2JfbGVuID4gTUFYX0JMT0JfU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQloZXgyYmluKHAtPmJsb2IsIGMsIHAtPmJsb2JfbGVuKTsKKwkJcmV0ID0gZ2V0b3B0aW9ucyhkYXRhYmxvYiwgcCwgbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gT3B0X2xvYWQ7CisJCWJyZWFrOworCWNhc2UgT3B0X3VwZGF0ZToKKwkJLyogYWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9ucyAqLworCQlyZXQgPSBnZXRvcHRpb25zKGRhdGFibG9iLCBwLCBvKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBPcHRfdXBkYXRlOworCQlicmVhazsKKwljYXNlIE9wdF9lcnI6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICp0cnVzdGVkX29wdGlvbnNfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9uczsKKworCW9wdGlvbnMgPSBremFsbG9jKHNpemVvZiAqb3B0aW9ucywgR0ZQX0tFUk5FTCk7CisJaWYgKG9wdGlvbnMpIHsKKwkJLyogc2V0IGFueSBub24temVybyBkZWZhdWx0cyAqLworCQlvcHRpb25zLT5rZXl0eXBlID0gU1JLX2tleXR5cGU7CisJCW9wdGlvbnMtPmtleWhhbmRsZSA9IFNSS0hBTkRMRTsKKwl9CisJcmV0dXJuIG9wdGlvbnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqdHJ1c3RlZF9wYXlsb2FkX2FsbG9jKHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IGtleV9wYXlsb2FkX3Jlc2VydmUoa2V5LCBzaXplb2YgKnApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcDsKKwlwID0ga3phbGxvYyhzaXplb2YgKnAsIEdGUF9LRVJORUwpOworCWlmIChwKQorCQlwLT5taWdyYXRhYmxlID0gMTsgLyogbWlncmF0YWJsZSBieSBkZWZhdWx0ICovCisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiB0cnVzdGVkX2luc3RhbnRpYXRlIC0gY3JlYXRlIGEgbmV3IHRydXN0ZWQga2V5CisgKgorICogVW5zZWFsIGFuIGV4aXN0aW5nIHRydXN0ZWQgYmxvYiBvciwgZm9yIGEgbmV3IGtleSwgZ2V0IGEKKyAqIHJhbmRvbSBrZXksIHRoZW4gc2VhbCBhbmQgY3JlYXRlIGEgdHJ1c3RlZCBrZXktdHlwZSBrZXksCisgKiBhZGRpbmcgaXQgdG8gdGhlIHNwZWNpZmllZCBrZXlyaW5nLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiAwLiBPdGhlcndpc2UgcmV0dXJuIGVycm5vLgorICovCitzdGF0aWMgaW50IHRydXN0ZWRfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBkYXRhbGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkID0gTlVMTDsKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucyA9IE5VTEw7CisJY2hhciAqZGF0YWJsb2I7CisJaW50IHJldCA9IDA7CisJaW50IGtleV9jbWQ7CisKKwlpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGFsZW4gPiAzMjc2NyB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhYmxvYiA9IGttYWxsb2MoZGF0YWxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghZGF0YWJsb2IpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShkYXRhYmxvYiwgZGF0YSwgZGF0YWxlbik7CisJZGF0YWJsb2JbZGF0YWxlbl0gPSAnXDAnOworCisJb3B0aW9ucyA9IHRydXN0ZWRfb3B0aW9uc19hbGxvYygpOworCWlmICghb3B0aW9ucykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcGF5bG9hZCA9IHRydXN0ZWRfcGF5bG9hZF9hbGxvYyhrZXkpOworCWlmICghcGF5bG9hZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlrZXlfY21kID0gZGF0YWJsb2JfcGFyc2UoZGF0YWJsb2IsIHBheWxvYWQsIG9wdGlvbnMpOworCWlmIChrZXlfY21kIDwgMCkgeworCQlyZXQgPSBrZXlfY21kOworCQlnb3RvIG91dDsKKwl9CisKKwlkdW1wX3BheWxvYWQocGF5bG9hZCk7CisJZHVtcF9vcHRpb25zKG9wdGlvbnMpOworCisJc3dpdGNoIChrZXlfY21kKSB7CisJY2FzZSBPcHRfbG9hZDoKKwkJcmV0ID0ga2V5X3Vuc2VhbChwYXlsb2FkLCBvcHRpb25zKTsKKwkJZHVtcF9wYXlsb2FkKHBheWxvYWQpOworCQlkdW1wX29wdGlvbnMob3B0aW9ucyk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV91bnNlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWJyZWFrOworCWNhc2UgT3B0X25ldzoKKwkJcmV0ID0gbXlfZ2V0X3JhbmRvbShwYXlsb2FkLT5rZXksIHBheWxvYWQtPmtleV9sZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV9jcmVhdGUgZmFpbGVkICglZClcbiIsIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBrZXlfc2VhbChwYXlsb2FkLCBvcHRpb25zKTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X3NlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXJldCAmJiBvcHRpb25zLT5wY3Jsb2NrKQorCQlyZXQgPSBwY3Jsb2NrKG9wdGlvbnMtPnBjcmxvY2spOworb3V0OgorCWtmcmVlKGRhdGFibG9iKTsKKwlrZnJlZShvcHRpb25zKTsKKwlpZiAoIXJldCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBwYXlsb2FkKTsKKwllbHNlCisJCWtmcmVlKHBheWxvYWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRydXN0ZWRfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnA7CisKKwlwID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQsIHJjdSk7CisJbWVtc2V0KHAtPmtleSwgMCwgcC0+a2V5X2xlbik7CisJa2ZyZWUocCk7Cit9CisKKy8qCisgKiB0cnVzdGVkX3VwZGF0ZSAtIHJlc2VhbCBhbiBleGlzdGluZyBrZXkgd2l0aCBuZXcgUENSIHZhbHVlcworICovCitzdGF0aWMgaW50IHRydXN0ZWRfdXBkYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAgPSBrZXktPnBheWxvYWQuZGF0YTsKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqbmV3X3A7CisJc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm5ld19vOworCWNoYXIgKmRhdGFibG9iOworCWludCByZXQgPSAwOworCisJaWYgKCFwLT5taWdyYXRhYmxlKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChkYXRhbGVuIDw9IDAgfHwgZGF0YWxlbiA+IDMyNzY3IHx8ICFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGFibG9iID0ga21hbGxvYyhkYXRhbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhYmxvYikKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV3X28gPSB0cnVzdGVkX29wdGlvbnNfYWxsb2MoKTsKKwlpZiAoIW5ld19vKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwluZXdfcCA9IHRydXN0ZWRfcGF5bG9hZF9hbGxvYyhrZXkpOworCWlmICghbmV3X3ApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KGRhdGFibG9iLCBkYXRhLCBkYXRhbGVuKTsKKwlkYXRhYmxvYltkYXRhbGVuXSA9ICdcMCc7CisJcmV0ID0gZGF0YWJsb2JfcGFyc2UoZGF0YWJsb2IsIG5ld19wLCBuZXdfbyk7CisJaWYgKHJldCAhPSBPcHRfdXBkYXRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkvKiBjb3B5IG9sZCBrZXkgdmFsdWVzLCBhbmQgcmVzZWFsIHdpdGggbmV3IHBjcnMgKi8KKwluZXdfcC0+bWlncmF0YWJsZSA9IHAtPm1pZ3JhdGFibGU7CisJbmV3X3AtPmtleV9sZW4gPSBwLT5rZXlfbGVuOworCW1lbWNweShuZXdfcC0+a2V5LCBwLT5rZXksIHAtPmtleV9sZW4pOworCWR1bXBfcGF5bG9hZChwKTsKKwlkdW1wX3BheWxvYWQobmV3X3ApOworCisJcmV0ID0ga2V5X3NlYWwobmV3X3AsIG5ld19vKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X3NlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisJCWtmcmVlKG5ld19wKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChuZXdfby0+cGNybG9jaykgeworCQlyZXQgPSBwY3Jsb2NrKG5ld19vLT5wY3Jsb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2luZm8oInRydXN0ZWRfa2V5OiBwY3Jsb2NrIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJa2ZyZWUobmV3X3ApOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCBuZXdfcCk7CisJY2FsbF9yY3UoJnAtPnJjdSwgdHJ1c3RlZF9yY3VfZnJlZSk7CitvdXQ6CisJa2ZyZWUoZGF0YWJsb2IpOworCWtmcmVlKG5ld19vKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdHJ1c3RlZF9yZWFkIC0gY29weSB0aGUgc2VhbGVkIGJsb2IgZGF0YSB0byB1c2Vyc3BhY2UgaW4gaGV4LgorICogT24gc3VjY2VzcywgcmV0dXJuIHRvIHVzZXJzcGFjZSB0aGUgdHJ1c3RlZCBrZXkgZGF0YWJsb2Igc2l6ZS4KKyAqLworc3RhdGljIGxvbmcgdHJ1c3RlZF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwOworCWNoYXIgKmFzY2lpX2J1ZjsKKwljaGFyICpidWZwOworCWludCBpOworCisJcCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoa2V5LT5wYXlsb2FkLmRhdGEsCisJCQlyd3NlbV9pc19sb2NrZWQoJigoc3RydWN0IGtleSAqKWtleSktPnNlbSkpOworCWlmICghcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFidWZmZXIgfHwgYnVmbGVuIDw9IDApCisJCXJldHVybiAyICogcC0+YmxvYl9sZW47CisJYXNjaWlfYnVmID0ga21hbGxvYygyICogcC0+YmxvYl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYXNjaWlfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1ZnAgPSBhc2NpaV9idWY7CisJZm9yIChpID0gMDsgaSA8IHAtPmJsb2JfbGVuOyBpKyspCisJCWJ1ZnAgPSBwYWNrX2hleF9ieXRlKGJ1ZnAsIHAtPmJsb2JbaV0pOworCWlmICgoY29weV90b191c2VyKGJ1ZmZlciwgYXNjaWlfYnVmLCAyICogcC0+YmxvYl9sZW4pKSAhPSAwKSB7CisJCWtmcmVlKGFzY2lpX2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZShhc2NpaV9idWYpOworCXJldHVybiAyICogcC0+YmxvYl9sZW47Cit9CisKKy8qCisgKiB0cnVzdGVkX2Rlc3Ryb3kgLSBiZWZvcmUgZnJlZWluZyB0aGUga2V5LCBjbGVhciB0aGUgZGVjcnlwdGVkIGRhdGEKKyAqLworc3RhdGljIHZvaWQgdHJ1c3RlZF9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCA9IGtleS0+cGF5bG9hZC5kYXRhOworCisJaWYgKCFwKQorCQlyZXR1cm47CisJbWVtc2V0KHAtPmtleSwgMCwgcC0+a2V5X2xlbik7CisJa2ZyZWUoa2V5LT5wYXlsb2FkLmRhdGEpOworfQorCitzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfdHJ1c3RlZCA9IHsKKwkubmFtZSA9ICJ0cnVzdGVkIiwKKwkuaW5zdGFudGlhdGUgPSB0cnVzdGVkX2luc3RhbnRpYXRlLAorCS51cGRhdGUgPSB0cnVzdGVkX3VwZGF0ZSwKKwkubWF0Y2ggPSB1c2VyX21hdGNoLAorCS5kZXN0cm95ID0gdHJ1c3RlZF9kZXN0cm95LAorCS5kZXNjcmliZSA9IHVzZXJfZGVzY3JpYmUsCisJLnJlYWQgPSB0cnVzdGVkX3JlYWQsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChrZXlfdHlwZV90cnVzdGVkKTsKKworc3RhdGljIHZvaWQgdHJ1c3RlZF9zaGFzaF9yZWxlYXNlKHZvaWQpCit7CisJaWYgKGhhc2hhbGcpCisJCWNyeXB0b19mcmVlX3NoYXNoKGhhc2hhbGcpOworCWlmIChobWFjYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdHJ1c3RlZF9zaGFzaF9hbGxvYyh2b2lkKQoreworCWludCByZXQ7CisKKwlobWFjYWxnID0gY3J5cHRvX2FsbG9jX3NoYXNoKGhtYWNfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhtYWNhbGcpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaG1hY19hbGcpOworCQlyZXR1cm4gUFRSX0VSUihobWFjYWxnKTsKKwl9CisKKwloYXNoYWxnID0gY3J5cHRvX2FsbG9jX3NoYXNoKGhhc2hfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhhc2hhbGcpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvICVzXG4iLAorCQkJaGFzaF9hbGcpOworCQlyZXQgPSBQVFJfRVJSKGhhc2hhbGcpOworCQlnb3RvIGhhc2hhbGdfZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworaGFzaGFsZ19mYWlsOgorCWNyeXB0b19mcmVlX3NoYXNoKGhtYWNhbGcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHJ1c3RlZCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0cnVzdGVkX3NoYXNoX2FsbG9jKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3RydXN0ZWQpOworCWlmIChyZXQgPCAwKQorCQl0cnVzdGVkX3NoYXNoX3JlbGVhc2UoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF90cnVzdGVkKHZvaWQpCit7CisJdHJ1c3RlZF9zaGFzaF9yZWxlYXNlKCk7CisJdW5yZWdpc3Rlcl9rZXlfdHlwZSgma2V5X3R5cGVfdHJ1c3RlZCk7Cit9CisKK2xhdGVfaW5pdGNhbGwoaW5pdF90cnVzdGVkKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdHJ1c3RlZCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvdHJ1c3RlZF9kZWZpbmVkLmggYi9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDlmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5oCkBAIC0wLDAgKzEsMTM0IEBACisjaWZuZGVmIF9fVFJVU1RFRF9LRVlfSAorI2RlZmluZSBfX1RSVVNURURfS0VZX0gKKworLyogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgVFBNIGNvbnN0YW50cyAqLworI2RlZmluZSBNQVhfUENSSU5GT19TSVpFCQk2NAorI2RlZmluZSBNQVhfQlVGX1NJWkUJCQk1MTIKKyNkZWZpbmUgVFBNX0dFVFJBTkRPTV9TSVpFCQkxNAorI2RlZmluZSBUUE1fT1NBUF9TSVpFCQkJMzYKKyNkZWZpbmUgVFBNX09JQVBfU0laRQkJCTEwCisjZGVmaW5lIFRQTV9TRUFMX1NJWkUJCQk4NworI2RlZmluZSBUUE1fVU5TRUFMX1NJWkUJCQkxMDQKKyNkZWZpbmUgVFBNX1NJWkVfT0ZGU0VUCQkJMgorI2RlZmluZSBUUE1fUkVUVVJOX09GRlNFVAkJNgorI2RlZmluZSBUUE1fREFUQV9PRkZTRVQJCQkxMAorCisjZGVmaW5lIExPQUQzMihidWZmZXIsIG9mZnNldCkJKG50b2hsKCoodWludDMyX3QgKikmYnVmZmVyW29mZnNldF0pKQorI2RlZmluZSBMT0FEMzJOKGJ1ZmZlciwgb2Zmc2V0KQkoKih1aW50MzJfdCAqKSZidWZmZXJbb2Zmc2V0XSkKKyNkZWZpbmUgTE9BRDE2KGJ1ZmZlciwgb2Zmc2V0KQkobnRvaHMoKih1aW50MTZfdCAqKSZidWZmZXJbb2Zmc2V0XSkpCisKK3N0cnVjdCB0cG1fYnVmIHsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgZGF0YVtNQVhfQlVGX1NJWkVdOworfTsKKworI2RlZmluZSBJTklUX0JVRih0YikgKHRiLT5sZW4gPSAwKQorCitzdHJ1Y3Qgb3NhcHNlc3MgeworCXVpbnQzMl90IGhhbmRsZTsKKwl1bnNpZ25lZCBjaGFyIHNlY3JldFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGVub25jZVtUUE1fTk9OQ0VfU0laRV07Cit9OworCisvKiBkaXNjcmV0ZSB2YWx1ZXMsIGJ1dCBoYXZlIHRvIHN0b3JlIGluIHVpbnQxNl90IGZvciBUUE0gdXNlICovCitlbnVtIHsKKwlTRUFMX2tleXR5cGUgPSAxLAorCVNSS19rZXl0eXBlID0gNAorfTsKKworc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgeworCXVpbnQxNl90IGtleXR5cGU7CisJdWludDMyX3Qga2V5aGFuZGxlOworCXVuc2lnbmVkIGNoYXIga2V5YXV0aFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGJsb2JhdXRoW1NIQTFfRElHRVNUX1NJWkVdOworCXVpbnQzMl90IHBjcmluZm9fbGVuOworCXVuc2lnbmVkIGNoYXIgcGNyaW5mb1tNQVhfUENSSU5GT19TSVpFXTsKKwlpbnQgcGNybG9jazsKK307CisKKyNkZWZpbmUgVFBNX0RFQlVHIDAKKworI2lmIFRQTV9ERUJVRworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfb3B0aW9ucyhzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleTogc2VhbGluZyBrZXkgdHlwZSAlZFxuIiwgby0+a2V5dHlwZSk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHNlYWxpbmcga2V5IGhhbmRsZSAlMFhcbiIsIG8tPmtleWhhbmRsZSk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHBjcmxvY2sgJWRcbiIsIG8tPnBjcmxvY2spOworCXByX2luZm8oInRydXN0ZWRfa2V5OiBwY3JpbmZvICVkXG4iLCBvLT5wY3JpbmZvX2xlbik7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAicGNyaW5mbyAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsIG8tPnBjcmluZm8sIG8tPnBjcmluZm9fbGVuLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGF5bG9hZChzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCkKK3sKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleToga2V5X2xlbiAlZFxuIiwgcC0+a2V5X2xlbik7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAia2V5ICIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgcC0+a2V5LCBwLT5rZXlfbGVuLCAwKTsKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleTogYmxvYmxlbiAlZFxuIiwgcC0+YmxvYl9sZW4pOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgImJsb2IgIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJICAgICAgIDE2LCAxLCBwLT5ibG9iLCBwLT5ibG9iX2xlbiwgMCk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IG1pZ3JhdGFibGUgJWRcbiIsIHAtPm1pZ3JhdGFibGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9zZXNzKHN0cnVjdCBvc2Fwc2VzcyAqcykKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJ0cnVzdGVkLWtleTogaGFuZGxlICIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPmhhbmRsZSwgNCwgMCk7CisJcHJfaW5mbygidHJ1c3RlZC1rZXk6IHNlY3JldDpcbiIpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPnNlY3JldCwgU0hBMV9ESUdFU1RfU0laRSwgMCk7CisJcHJfaW5mbygidHJ1c3RlZC1rZXk6IGVub25jZTpcbiIpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgJnMtPmVub25jZSwgU0hBMV9ESUdFU1RfU0laRSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3RwbV9idWYodW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBsZW47CisKKwlwcl9pbmZvKCJcbnRydXN0ZWQta2V5OiB0cG0gYnVmZmVyXG4iKTsKKwlsZW4gPSBMT0FEMzIoYnVmLCBUUE1fU0laRV9PRkZTRVQpOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBidWYsIGxlbiwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGR1bXBfb3B0aW9ucyhzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGF5bG9hZChzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfc2VzcyhzdHJ1Y3Qgb3NhcHNlc3MgKnMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3RwbV9idWYodW5zaWduZWQgY2hhciAqYnVmKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZTgoc3RydWN0IHRwbV9idWYgKmJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlidWYtPmRhdGFbYnVmLT5sZW4rK10gPSB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlMTYoc3RydWN0IHRwbV9idWYgKmJ1ZiwgY29uc3QgdWludDE2X3QgdmFsdWUpCit7CisJKih1aW50MTZfdCAqKSAmIGJ1Zi0+ZGF0YVtidWYtPmxlbl0gPSBodG9ucyh2YWx1ZSk7CisJYnVmLT5sZW4gKz0gc2l6ZW9mIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmUzMihzdHJ1Y3QgdHBtX2J1ZiAqYnVmLCBjb25zdCB1aW50MzJfdCB2YWx1ZSkKK3sKKwkqKHVpbnQzMl90ICopICYgYnVmLT5kYXRhW2J1Zi0+bGVuXSA9IGh0b25sKHZhbHVlKTsKKwlidWYtPmxlbiArPSBzaXplb2YgdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZWJ5dGVzKHN0cnVjdCB0cG1fYnVmICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAorCQkJICAgICAgY29uc3QgaW50IGxlbikKK3sKKwltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5sZW4sIGluLCBsZW4pOworCWJ1Zi0+bGVuICs9IGxlbjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDZmNjM3ZDIuLmUyNzZlYjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTI1MjUsNyArMjUyNSwxMCBAQAogCXNpZCA9IHRzZWMtPnNpZDsKIAluZXdzaWQgPSB0c2VjLT5jcmVhdGVfc2lkOwogCi0JaWYgKCFuZXdzaWQgfHwgIShzYnNlYy0+ZmxhZ3MgJiBTRV9TQkxBQkVMU1VQUCkpIHsKKwlpZiAoKHNic2VjLT5mbGFncyAmIFNFX1NCSU5JVElBTElaRUQpICYmCisJICAgIChzYnNlYy0+YmVoYXZpb3IgPT0gU0VDVVJJVFlfRlNfVVNFX01OVFBPSU5UKSkKKwkJbmV3c2lkID0gc2JzZWMtPm1udHBvaW50X3NpZDsKKwllbHNlIGlmICghbmV3c2lkIHx8ICEoc2JzZWMtPmZsYWdzICYgU0VfU0JMQUJFTFNVUFApKSB7CiAJCXJjID0gc2VjdXJpdHlfdHJhbnNpdGlvbl9zaWQoc2lkLCBkc2VjLT5zaWQsCiAJCQkJCSAgICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhpbm9kZS0+aV9tb2RlKSwKIAkJCQkJICAgICAmbmV3c2lkKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaAppbmRleCBlOTRlODJmLi41NjE1MDgxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9sc21fYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXRoLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgImZsYXNrLmgiCiAjaW5jbHVkZSAiYXZfcGVybWlzc2lvbnMuaCIKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKaW5kZXggODg1OGQyYi4uN2VkMzY2MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzbWFwLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogCSAgICAibm9kZV9iaW5kIiwgIm5hbWVfY29ubmVjdCIsIE5VTEwgfSB9LAogCXsgIm1lbXByb3RlY3QiLCB7ICJtbWFwX3plcm8iLCBOVUxMIH0gfSwKIAl7ICJwZWVyIiwgeyAicmVjdiIsIE5VTEwgfSB9LAotCXsgImNhcGFiaWxpdHkyIiwgeyAibWFjX292ZXJyaWRlIiwgIm1hY19hZG1pbiIsIE5VTEwgfSB9LAorCXsgImNhcGFiaWxpdHkyIiwgeyAibWFjX292ZXJyaWRlIiwgIm1hY19hZG1pbiIsICJzeXNsb2ciLCBOVUxMIH0gfSwKIAl7ICJrZXJuZWxfc2VydmljZSIsIHsgInVzZV9hc19vdmVycmlkZSIsICJjcmVhdGVfZmlsZXNfYXMiLCBOVUxMIH0gfSwKIAl7ICJ0dW5fc29ja2V0IiwKIAkgIHsgQ09NTU9OX1NPQ0tfUEVSTVMsIE5VTEwgfSB9LApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCmluZGV4IDc1ZWMwYzYuLjhiMDJiMjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKQEAgLTY1LDYgKzY1LDggQEAKIAl7IFJUTV9ORVdBRERSTEFCRUwsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSB9LAogCXsgUlRNX0RFTEFERFJMQUJFTCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCiAJeyBSVE1fR0VUQUREUkxBQkVMLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKKwl7IFJUTV9HRVREQ0IsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKKwl7IFJUTV9TRVREQ0IsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgbmxtc2dfcGVybSBubG1zZ19maXJld2FsbF9wZXJtc1tdID0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IDQzZGVhYzIuLmVhMzljYjcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtMTQxLDE5ICsxNDEsMjQgQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiAKIHsKLQljaGFyICpwYWdlOworCWNoYXIgKnBhZ2UgPSBOVUxMOwogCXNzaXplX3QgbGVuZ3RoOwogCWludCBuZXdfdmFsdWU7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OworCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQorCQlnb3RvIG91dDsKKworCWxlbmd0aCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0OwpAQCAtMjY4LDIwICsyNzMsMjUgQEAKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiAKIHsKLQljaGFyICpwYWdlOworCWNoYXIgKnBhZ2UgPSBOVUxMOwogCXNzaXplX3QgbGVuZ3RoOwogCWludCBuZXdfdmFsdWU7CiAJZXh0ZXJuIGludCBzZWxpbnV4X2Rpc2FibGUodm9pZCk7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OzsKKworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCisJCWdvdG8gb3V0OworCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKIAkJZ290byBvdXQ7CkBAIC0yOTIsNyArMzAyLDcgQEAKIAogCWlmIChuZXdfdmFsdWUpIHsKIAkJbGVuZ3RoID0gc2VsaW51eF9kaXNhYmxlKCk7Ci0JCWlmIChsZW5ndGggPCAwKQorCQlpZiAobGVuZ3RoKQogCQkJZ290byBvdXQ7CiAJCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfS0VSTkVMLCBBVURJVF9NQUNfU1RBVFVTLAogCQkJInNlbGludXg9MCBhdWlkPSV1IHNlcz0ldSIsCkBAIC00OTMsNyArNTAzLDYgQEAKIAkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JaW50IHJldDsKIAlzc2l6ZV90IGxlbmd0aDsKIAl2b2lkICpkYXRhID0gTlVMTDsKIApAQCAtNTAzLDE3ICs1MTIsMTkgQEAKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlsZW5ndGggPSAtRUlOVkFMOworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmICgoY291bnQgPiA2NCAqIDEwMjQgKiAxMDI0KQotCSAgICB8fCAoZGF0YSA9IHZtYWxsb2MoY291bnQpKSA9PSBOVUxMKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJbGVuZ3RoID0gLUVGQklHOworCWlmIChjb3VudCA+IDY0ICogMTAyNCAqIDEwMjQpCiAJCWdvdG8gb3V0OwotCX0KKworCWxlbmd0aCA9IC1FTk9NRU07CisJZGF0YSA9IHZtYWxsb2MoY291bnQpOworCWlmICghZGF0YSkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKQpAQCAtNTIzLDIzICs1MzQsMTkgQEAKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHNlbF9tYWtlX2Jvb2xzKCk7Ci0JaWYgKHJldCkgewotCQlsZW5ndGggPSByZXQ7CisJbGVuZ3RoID0gc2VsX21ha2VfYm9vbHMoKTsKKwlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDE7Ci0JfQogCi0JcmV0ID0gc2VsX21ha2VfY2xhc3NlcygpOwotCWlmIChyZXQpIHsKLQkJbGVuZ3RoID0gcmV0OworCWxlbmd0aCA9IHNlbF9tYWtlX2NsYXNzZXMoKTsKKwlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDE7Ci0JfQogCi0JcmV0ID0gc2VsX21ha2VfcG9saWN5Y2FwKCk7Ci0JaWYgKHJldCkKLQkJbGVuZ3RoID0gcmV0OwotCWVsc2UKLQkJbGVuZ3RoID0gY291bnQ7CisJbGVuZ3RoID0gc2VsX21ha2VfcG9saWN5Y2FwKCk7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQxOworCisJbGVuZ3RoID0gY291bnQ7CiAKIG91dDE6CiAJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9LRVJORUwsIEFVRElUX01BQ19QT0xJQ1lfTE9BRCwKQEAgLTU1OSwyNiArNTY2LDI2IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jb250ZXh0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKmNhbm9uOworCWNoYXIgKmNhbm9uID0gTlVMTDsKIAl1MzIgc2lkLCBsZW47CiAJc3NpemVfdCBsZW5ndGg7CiAKIAlsZW5ndGggPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fQ0hFQ0tfQ09OVEVYVCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChidWYsIHNpemUsICZzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlyZXR1cm4gbGVuZ3RoOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY2Fub24sICZsZW4pOwotCWlmIChsZW5ndGggPCAwKQotCQlyZXR1cm4gbGVuZ3RoOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNjAyLDIzICs2MDksMjggQEAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jaGVja3JlcXByb3Qoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAl1bnNpZ25lZCBpbnQgbmV3X3ZhbHVlOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX1NFVENIRUNLUkVRUFJPVCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJCWdvdG8gb3V0OworCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQogCQlnb3RvIG91dDsKQEAgLTY5Myw3ICs3MDUsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKnNjb24sICp0Y29uOworCWNoYXIgKnNjb24gPSBOVUxMLCAqdGNvbiA9IE5VTEw7CiAJdTMyIHNzaWQsIHRzaWQ7CiAJdTE2IHRjbGFzczsKIAlzdHJ1Y3QgYXZfZGVjaXNpb24gYXZkOwpAQCAtNzAxLDI3ICs3MTMsMjkgQEAKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX0FWKTsKIAlpZiAobGVuZ3RoKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJc2NvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghc2NvbikKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCXRjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRjb24pCiAJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVJTlZBTDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVzICVzICVodSIsIHNjb24sIHRjb24sICZ0Y2xhc3MpICE9IDMpCi0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChzY29uLCBzdHJsZW4oc2NvbikgKyAxLCAmc3NpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHRjb24sIHN0cmxlbih0Y29uKSArIDEsICZ0c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJc2VjdXJpdHlfY29tcHV0ZV9hdl91c2VyKHNzaWQsIHRzaWQsIHRjbGFzcywgJmF2ZCk7CiAKQEAgLTczMCwxMzMgKzc0NCwxMzEgQEAKIAkJCSAgYXZkLmFsbG93ZWQsIDB4ZmZmZmZmZmYsCiAJCQkgIGF2ZC5hdWRpdGFsbG93LCBhdmQuYXVkaXRkZW55LAogCQkJICBhdmQuc2Vxbm8sIGF2ZC5mbGFncyk7Ci1vdXQyOgotCWtmcmVlKHRjb24pOwogb3V0OgorCWtmcmVlKHRjb24pOwogCWtmcmVlKHNjb24pOwogCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9jcmVhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JY2hhciAqc2NvbiwgKnRjb247CisJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKIAl1MzIgc3NpZCwgdHNpZCwgbmV3c2lkOwogCXUxNiB0Y2xhc3M7CiAJc3NpemVfdCBsZW5ndGg7Ci0JY2hhciAqbmV3Y29uOworCWNoYXIgKm5ld2NvbiA9IE5VTEw7CiAJdTMyIGxlbjsKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX0NSRUFURSk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3RyYW5zaXRpb25fc2lkX3VzZXIoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7Ci0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXQ7CiAJfQogCiAJbWVtY3B5KGJ1ZiwgbmV3Y29uLCBsZW4pOwogCWxlbmd0aCA9IGxlbjsKLW91dDM6Ci0Ja2ZyZWUobmV3Y29uKTsKLW91dDI6Ci0Ja2ZyZWUodGNvbik7CiBvdXQ6CisJa2ZyZWUobmV3Y29uKTsKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfcmVsYWJlbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpzY29uLCAqdGNvbjsKKwljaGFyICpzY29uID0gTlVMTCwgKnRjb24gPSBOVUxMOwogCXUzMiBzc2lkLCB0c2lkLCBuZXdzaWQ7CiAJdTE2IHRjbGFzczsKIAlzc2l6ZV90IGxlbmd0aDsKLQljaGFyICpuZXdjb247CisJY2hhciAqbmV3Y29uID0gTlVMTDsKIAl1MzIgbGVuOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX0NPTVBVVEVfUkVMQUJFTCk7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NoYW5nZV9zaWQoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCi0JaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkgewotCQlsZW5ndGggPSAtRVJBTkdFOwotCQlnb3RvIG91dDM7Ci0JfQorCWxlbmd0aCA9IC1FUkFOR0U7CisJaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkKKwkJZ290byBvdXQ7CiAKIAltZW1jcHkoYnVmLCBuZXdjb24sIGxlbik7CiAJbGVuZ3RoID0gbGVuOwotb3V0MzoKLQlrZnJlZShuZXdjb24pOwotb3V0MjoKLQlrZnJlZSh0Y29uKTsKIG91dDoKKwlrZnJlZShuZXdjb24pOworCWtmcmVlKHRjb24pOwogCWtmcmVlKHNjb24pOwogCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV91c2VyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKmNvbiwgKnVzZXIsICpwdHI7Ci0JdTMyIHNpZCwgKnNpZHM7CisJY2hhciAqY29uID0gTlVMTCwgKnVzZXIgPSBOVUxMLCAqcHRyOworCXUzMiBzaWQsICpzaWRzID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAljaGFyICpuZXdjb247CiAJaW50IGksIHJjOwpAQCAtODY0LDI4ICs4NzYsMjkgQEAKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX1VTRVIpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OzsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJY29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OzsKIAorCWxlbmd0aCA9IC1FTk9NRU07CiAJdXNlciA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdXNlcikKIAkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUlOVkFMOwogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMiLCBjb24sIHVzZXIpICE9IDIpCi0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZChjb24sIHN0cmxlbihjb24pICsgMSwgJnNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2dldF91c2VyX3NpZHMoc2lkLCB1c2VyLCAmc2lkcywgJm5zaWRzKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc3ByaW50ZihidWYsICIldSIsIG5zaWRzKSArIDE7CiAJcHRyID0gYnVmICsgbGVuZ3RoOwpAQCAtODkzLDgyICs5MDYsODAgQEAKIAkJcmMgPSBzZWN1cml0eV9zaWRfdG9fY29udGV4dChzaWRzW2ldLCAmbmV3Y29uLCAmbGVuKTsKIAkJaWYgKHJjKSB7CiAJCQlsZW5ndGggPSByYzsKLQkJCWdvdG8gb3V0MzsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWlmICgobGVuZ3RoICsgbGVuKSA+PSBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQpIHsKIAkJCWtmcmVlKG5ld2Nvbik7CiAJCQlsZW5ndGggPSAtRVJBTkdFOwotCQkJZ290byBvdXQzOworCQkJZ290byBvdXQ7CiAJCX0KIAkJbWVtY3B5KHB0ciwgbmV3Y29uLCBsZW4pOwogCQlrZnJlZShuZXdjb24pOwogCQlwdHIgKz0gbGVuOwogCQlsZW5ndGggKz0gbGVuOwogCX0KLW91dDM6Ci0Ja2ZyZWUoc2lkcyk7Ci1vdXQyOgotCWtmcmVlKHVzZXIpOwogb3V0OgorCWtmcmVlKHNpZHMpOworCWtmcmVlKHVzZXIpOwogCWtmcmVlKGNvbik7CiAJcmV0dXJuIGxlbmd0aDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2VsX3dyaXRlX21lbWJlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpzY29uLCAqdGNvbjsKKwljaGFyICpzY29uID0gTlVMTCwgKnRjb24gPSBOVUxMOwogCXUzMiBzc2lkLCB0c2lkLCBuZXdzaWQ7CiAJdTE2IHRjbGFzczsKIAlzc2l6ZV90IGxlbmd0aDsKLQljaGFyICpuZXdjb247CisJY2hhciAqbmV3Y29uID0gTlVMTDsKIAl1MzIgbGVuOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX0NPTVBVVEVfTUVNQkVSKTsKIAlpZiAobGVuZ3RoKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FTk9NRU07CiAJc2NvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghc2NvbikKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X21lbWJlcl9zaWQoc3NpZCwgdHNpZCwgdGNsYXNzLCAmbmV3c2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAmbmV3Y29uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVSQU5HRTsKIAlpZiAobGVuID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICBjb250ZXh0IHNpemUgKCV1KSBleGNlZWRzICIKIAkJCSJwYXlsb2FkIG1heFxuIiwgX19mdW5jX18sIGxlbik7Ci0JCWxlbmd0aCA9IC1FUkFOR0U7Ci0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXQ7CiAJfQogCiAJbWVtY3B5KGJ1ZiwgbmV3Y29uLCBsZW4pOwogCWxlbmd0aCA9IGxlbjsKLW91dDM6Ci0Ja2ZyZWUobmV3Y29uKTsKLW91dDI6Ci0Ja2ZyZWUodGNvbik7CiBvdXQ6CisJa2ZyZWUobmV3Y29uKTsKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQpAQCAtOTc4LDcgKzk4OSw2IEBACiAJc3RydWN0IGlub2RlICpyZXQgPSBuZXdfaW5vZGUoc2IpOwogCiAJaWYgKHJldCkgewotCQlyZXQtPmlfaW5vID0gZ2V0X25leHRfaW5vKCk7CiAJCXJldC0+aV9tb2RlID0gbW9kZTsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCX0KQEAgLTk5OCwxNiArMTAwOCwxNCBAQAogCiAJbXV0ZXhfbG9jaygmc2VsX211dGV4KTsKIAotCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpCiAJCWdvdG8gb3V0OwotCX0KIAorCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghcGFnZSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJY3VyX2VuZm9yY2luZyA9IHNlY3VyaXR5X2dldF9ib29sX3ZhbHVlKGluZGV4KTsKIAlpZiAoY3VyX2VuZm9yY2luZyA8IDApIHsKQEAgLTEwMTksOCArMTAyNyw3IEBACiAJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgbGVuZ3RoKTsKIG91dDoKIAltdXRleF91bmxvY2soJnNlbF9tdXRleCk7Ci0JaWYgKHBhZ2UpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA0MCwyNiArMTA0NywyMyBAQAogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGluZGV4ID49IGJvb2xfbnVtIHx8IHN0cmNtcChuYW1lLCBib29sX3BlbmRpbmdfbmFtZXNbaW5kZXhdKSkgewotCQlsZW5ndGggPSAtRUlOVkFMOworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKGluZGV4ID49IGJvb2xfbnVtIHx8IHN0cmNtcChuYW1lLCBib29sX3BlbmRpbmdfbmFtZXNbaW5kZXhdKSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlsZW5ndGggPSAtRU5PTUVNOworCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JCWxlbmd0aCA9IC1FSU5WQUw7CisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKIAkJZ290byBvdXQ7Ci0JfQorCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKCFwYWdlKQogCQlnb3RvIG91dDsKLQl9CiAKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKQEAgLTEwNzcsOCArMTA4MSw3IEBACiAKIG91dDoKIAltdXRleF91bmxvY2soJnNlbF9tdXRleCk7Ci0JaWYgKHBhZ2UpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCkBAIC0xMTAyLDE5ICsxMTA1LDE5IEBACiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoY291bnQgPj0gUEFHRV9TSVpFKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJbGVuZ3RoID0gLUVOT01FTTsKKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQogCQlnb3RvIG91dDsKLQl9Ci0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlsZW5ndGggPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQogCQlnb3RvIG91dDsKLQl9CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpIHsKLQkJbGVuZ3RoID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCiAJCWdvdG8gb3V0OwotCX0KIAogCWxlbmd0aCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQpAQCAtMTEyNCwxNSArMTEyNywxNiBAQAogCWlmIChzc2NhbmYocGFnZSwgIiVkIiwgJm5ld192YWx1ZSkgIT0gMSkKIAkJZ290byBvdXQ7CiAKKwlsZW5ndGggPSAwOwogCWlmIChuZXdfdmFsdWUgJiYgYm9vbF9wZW5kaW5nX3ZhbHVlcykKLQkJc2VjdXJpdHlfc2V0X2Jvb2xzKGJvb2xfbnVtLCBib29sX3BlbmRpbmdfdmFsdWVzKTsKKwkJbGVuZ3RoID0gc2VjdXJpdHlfc2V0X2Jvb2xzKGJvb2xfbnVtLCBib29sX3BlbmRpbmdfdmFsdWVzKTsKIAotCWxlbmd0aCA9IGNvdW50OworCWlmICghbGVuZ3RoKQorCQlsZW5ndGggPSBjb3VudDsKIAogb3V0OgogCW11dGV4X3VubG9jaygmc2VsX211dGV4KTsKLQlpZiAocGFnZSkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOwogCXJldHVybiBsZW5ndGg7CiB9CiAKQEAgLTExNzMsNyArMTE3Nyw3IEBACiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfYm9vbHModm9pZCkKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaSwgcmV0OwogCXNzaXplX3QgbGVuOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqZGlyID0gYm9vbF9kaXI7CkBAIC0xMTk0LDM4ICsxMTk4LDQwIEBACiAKIAlzZWxfcmVtb3ZlX2VudHJpZXMoZGlyKTsKIAorCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gc2VjdXJpdHlfZ2V0X2Jvb2xzKCZudW0sICZuYW1lcywgJnZhbHVlcyk7Ci0JaWYgKHJldCAhPSAwKQorCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIG5hbWVzW2ldKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpbm9kZSA9IHNlbF9tYWtlX2lub2RlKGRpci0+ZF9zYiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSKTsKLQkJaWYgKCFpbm9kZSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJZ290byBvdXQ7CiAKKwkJcmV0ID0gLUVOT01FTTsKKwkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUik7CisJCWlmICghaW5vZGUpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSAtRUlOVkFMOwogCQlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIvJXMvJXMiLCBCT09MX0RJUl9OQU1FLCBuYW1lc1tpXSk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0gZWxzZSBpZiAobGVuID49IFBBR0VfU0laRSkgewotCQkJcmV0ID0gLUVOQU1FVE9PTE9ORzsKLQkJCWdvdG8gZXJyOwotCQl9CisJCWlmIChsZW4gPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gLUVOQU1FVE9PTE9ORzsKKwkJaWYgKGxlbiA+PSBQQUdFX1NJWkUpCisJCQlnb3RvIG91dDsKKwogCQlpc2VjID0gKHN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKilpbm9kZS0+aV9zZWN1cml0eTsKIAkJcmV0ID0gc2VjdXJpdHlfZ2VuZnNfc2lkKCJzZWxpbnV4ZnMiLCBwYWdlLCBTRUNDTEFTU19GSUxFLCAmc2lkKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOworCQkJZ290byBvdXQ7CisKIAkJaXNlYy0+c2lkID0gc2lkOwogCQlpc2VjLT5pbml0aWFsaXplZCA9IDE7CiAJCWlub2RlLT5pX2ZvcCA9ICZzZWxfYm9vbF9vcHM7CkBAIC0xMjM1LDEwICsxMjQxLDEyIEBACiAJYm9vbF9udW0gPSBudW07CiAJYm9vbF9wZW5kaW5nX25hbWVzID0gbmFtZXM7CiAJYm9vbF9wZW5kaW5nX3ZhbHVlcyA9IHZhbHVlczsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlyZXR1cm4gMDsKIG91dDoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci0JcmV0dXJuIHJldDsKLWVycjoKKwogCWlmIChuYW1lcykgewogCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCiAJCQlrZnJlZShuYW1lc1tpXSk7CkBAIC0xMjQ2LDggKzEyNTQsOCBAQAogCX0KIAlrZnJlZSh2YWx1ZXMpOwogCXNlbF9yZW1vdmVfZW50cmllcyhkaXIpOwotCXJldCA9IC1FTk9NRU07Ci0JZ290byBvdXQ7CisKKwlyZXR1cm4gcmV0OwogfQogCiAjZGVmaW5lIE5VTExfRklMRV9OQU1FICJudWxsIgpAQCAtMTI2OSw0NyArMTI3Nyw0MSBAQAogCQkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IHJldDsKIAlpbnQgbmV3X3ZhbHVlOwogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlyZXQgPSAtRU5PTUVNOworCXJldCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19TRVRTRUNQQVJBTSk7CisJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKCpwcG9zICE9IDApIHsKLQkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQogCQlnb3RvIG91dDsKLQl9CiAKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlyZXQgPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghcGFnZSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JaWYgKHNzY2FuZihwYWdlLCAiJXUiLCAmbmV3X3ZhbHVlKSAhPSAxKSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmIChuZXdfdmFsdWUgIT0gYXZjX2NhY2hlX3RocmVzaG9sZCkgewotCQlyZXQgPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fU0VUU0VDUEFSQU0pOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfZnJlZTsKLQkJYXZjX2NhY2hlX3RocmVzaG9sZCA9IG5ld192YWx1ZTsKLQl9CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc3NjYW5mKHBhZ2UsICIldSIsICZuZXdfdmFsdWUpICE9IDEpCisJCWdvdG8gb3V0OworCisJYXZjX2NhY2hlX3RocmVzaG9sZCA9IG5ld192YWx1ZTsKKwogCXJldCA9IGNvdW50Owotb3V0X2ZyZWU6Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwogb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzE3LDE5ICsxMzE5LDE4IEBACiAJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgKnBhZ2U7Ci0Jc3NpemVfdCByZXQgPSAwOworCXNzaXplX3QgbGVuZ3RoOwogCiAJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gYXZjX2dldF9oYXNoX3N0YXRzKHBhZ2UpOwotCWlmIChyZXQgPj0gMCkKLQkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgcmV0KTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuZ3RoID0gYXZjX2dldF9oYXNoX3N0YXRzKHBhZ2UpOworCWlmIChsZW5ndGggPj0gMCkKKwkJbGVuZ3RoID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgbGVuZ3RoKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNlbF9hdmNfY2FjaGVfdGhyZXNob2xkX29wcyA9IHsKQEAgLTE0MTEsNyArMTQxMiw3IEBACiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfYXZjX2ZpbGVzKHN0cnVjdCBkZW50cnkgKmRpcikKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaTsKIAlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgZmlsZXNbXSA9IHsKIAkJeyAiY2FjaGVfdGhyZXNob2xkIiwKIAkJICAmc2VsX2F2Y19jYWNoZV90aHJlc2hvbGRfb3BzLCBTX0lSVUdPfFNfSVdVU1IgfSwKQEAgLTE0MjYsMjIgKzE0MjcsMTkgQEAKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIGZpbGVzW2ldLm5hbWUpOwotCQlpZiAoIWRlbnRyeSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8ZmlsZXNbaV0ubW9kZSk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJaW5vZGUtPmlfZm9wID0gZmlsZXNbaV0ub3BzOwogCQlpbm9kZS0+aV9pbm8gPSArK3NlbF9sYXN0X2lubzsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotb3V0OgotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2VsX3JlYWRfaW5pdGNvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKQEAgLTE0NTUsNyArMTQ1Myw3IEBACiAJaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXNpZCA9IGlub2RlLT5pX2lubyZTRUxfSU5PX01BU0s7CiAJcmV0ID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkLCAmY29uLCAmbGVuKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgY29uLCBsZW4pOwpAQCAtMTQ3MCwyOCArMTQ2OCwyNSBAQAogCiBzdGF0aWMgaW50IHNlbF9tYWtlX2luaXRjb25fZmlsZXMoc3RydWN0IGRlbnRyeSAqZGlyKQogewotCWludCBpLCByZXQgPSAwOworCWludCBpOwogCiAJZm9yIChpID0gMTsgaSA8PSBTRUNJTklUU0lEX05VTTsgaSsrKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAkJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgc2VjdXJpdHlfZ2V0X2luaXRpYWxfc2lkX2NvbnRleHQoaSkpOwotCQlpZiAoIWRlbnRyeSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmICghZGVudHJ5KQorCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJaW5vZGUtPmlfZm9wID0gJnNlbF9pbml0Y29uX29wczsKIAkJaW5vZGUtPmlfaW5vID0gaXxTRUxfSU5JVENPTl9JTk9fT0ZGU0VUOwogCQlkX2FkZChkZW50cnksIGlub2RlKTsKIAl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZWxfZGl2KHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQpAQCAtMTUyNywxNSArMTUyMiwxMyBAQAogCXVuc2lnbmVkIGxvbmcgaW5vID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlZCIsIHNlbF9pbm9fdG9fY2xhc3MoaW5vKSk7CiAJcmMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBwYWdlLCBsZW4pOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKLW91dDoKKwogCXJldHVybiByYzsKIH0KIApAQCAtMTU1MiwxNSArMTU0NSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgaW5vID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CiAKIAlwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlsZW4gPSBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlZCIsIHNlbF9pbm9fdG9fcGVybShpbm8pKTsKIAlyYyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIGxlbik7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwotb3V0OgorCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNTkxLDM5ICsxNTgyLDM3IEBACiBzdGF0aWMgaW50IHNlbF9tYWtlX3Blcm1fZmlsZXMoY2hhciAqb2JqY2xhc3MsIGludCBjbGFzc3ZhbHVlLAogCQkJCXN0cnVjdCBkZW50cnkgKmRpcikKIHsKLQlpbnQgaSwgcmMgPSAwLCBucGVybXM7CisJaW50IGksIHJjLCBucGVybXM7CiAJY2hhciAqKnBlcm1zOwogCiAJcmMgPSBzZWN1cml0eV9nZXRfcGVybWlzc2lvbnMob2JqY2xhc3MsICZwZXJtcywgJm5wZXJtcyk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJZm9yIChpID0gMDsgaSA8IG5wZXJtczsgaSsrKSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAorCQlyYyA9IC1FTk9NRU07CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIHBlcm1zW2ldKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0MTsKLQkJfQorCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OwogCisJCXJjID0gLUVOT01FTTsKIAkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0MTsKLQkJfQorCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXQ7CisKIAkJaW5vZGUtPmlfZm9wID0gJnNlbF9wZXJtX29wczsKIAkJLyogaSsxIHNpbmNlIHBlcm0gdmFsdWVzIGFyZSAxLWluZGV4ZWQgKi8KIAkJaW5vZGUtPmlfaW5vID0gc2VsX3Blcm1fdG9faW5vKGNsYXNzdmFsdWUsIGkgKyAxKTsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotCi1vdXQxOgorCXJjID0gMDsKK291dDoKIAlmb3IgKGkgPSAwOyBpIDwgbnBlcm1zOyBpKyspCiAJCWtmcmVlKHBlcm1zW2ldKTsKIAlrZnJlZShwZXJtcyk7Ci1vdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjM1LDM0ICsxNjI0LDI3IEBACiAJaW50IHJjOwogCiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgImluZGV4Iik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFkZW50cnkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUd8U19JUlVHTyk7Ci0JaWYgKCFpbm9kZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlub2RlLT5pX2ZvcCA9ICZzZWxfY2xhc3Nfb3BzOwogCWlub2RlLT5pX2lubyA9IHNlbF9jbGFzc190b19pbm8oaW5kZXgpOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKGRpciwgInBlcm1zIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFkZW50cnkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmMgPSBzZWxfbWFrZV9kaXIoZGlyLT5kX2lub2RlLCBkZW50cnksICZsYXN0X2NsYXNzX2lubyk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJcmMgPSBzZWxfbWFrZV9wZXJtX2ZpbGVzKGNsYXNzbmFtZSwgaW5kZXgsIGRlbnRyeSk7CiAKLW91dDoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE2OTIsMTUgKzE2NzQsMTUgQEAKIAogc3RhdGljIGludCBzZWxfbWFrZV9jbGFzc2VzKHZvaWQpCiB7Ci0JaW50IHJjID0gMCwgbmNsYXNzZXMsIGk7CisJaW50IHJjLCBuY2xhc3NlcywgaTsKIAljaGFyICoqY2xhc3NlczsKIAogCS8qIGRlbGV0ZSBhbnkgZXhpc3RpbmcgZW50cmllcyAqLwogCXNlbF9yZW1vdmVfY2xhc3NlcygpOwogCiAJcmMgPSBzZWN1cml0eV9nZXRfY2xhc3NlcygmY2xhc3NlcywgJm5jbGFzc2VzKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dDsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qICsyIHNpbmNlIGNsYXNzZXMgYXJlIDEtaW5kZXhlZCAqLwogCWxhc3RfY2xhc3NfaW5vID0gc2VsX2NsYXNzX3RvX2lubyhuY2xhc3NlcyArIDIpOwpAQCAtMTcwOCwyOSArMTY5MCwyNyBAQAogCWZvciAoaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrKSB7CiAJCXN0cnVjdCBkZW50cnkgKmNsYXNzX25hbWVfZGlyOwogCisJCXJjID0gLUVOT01FTTsKIAkJY2xhc3NfbmFtZV9kaXIgPSBkX2FsbG9jX25hbWUoY2xhc3NfZGlyLCBjbGFzc2VzW2ldKTsKLQkJaWYgKCFjbGFzc19uYW1lX2RpcikgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXQxOwotCQl9CisJCWlmICghY2xhc3NfbmFtZV9kaXIpCisJCQlnb3RvIG91dDsKIAogCQlyYyA9IHNlbF9tYWtlX2RpcihjbGFzc19kaXItPmRfaW5vZGUsIGNsYXNzX25hbWVfZGlyLAogCQkJCSZsYXN0X2NsYXNzX2lubyk7CiAJCWlmIChyYykKLQkJCWdvdG8gb3V0MTsKKwkJCWdvdG8gb3V0OwogCiAJCS8qIGkrMSBzaW5jZSBjbGFzcyB2YWx1ZXMgYXJlIDEtaW5kZXhlZCAqLwogCQlyYyA9IHNlbF9tYWtlX2NsYXNzX2Rpcl9lbnRyaWVzKGNsYXNzZXNbaV0sIGkgKyAxLAogCQkJCWNsYXNzX25hbWVfZGlyKTsKIAkJaWYgKHJjKQotCQkJZ290byBvdXQxOworCQkJZ290byBvdXQ7CiAJfQotCi1vdXQxOgorCXJjID0gMDsKK291dDoKIAlmb3IgKGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKykKIAkJa2ZyZWUoY2xhc3Nlc1tpXSk7CiAJa2ZyZWUoY2xhc3Nlcyk7Ci1vdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNzY3LDE0ICsxNzQ3LDEyIEBACiBzdGF0aWMgaW50IHNlbF9tYWtlX2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJdW5zaWduZWQgbG9uZyAqaW5vKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAlpbm9kZSA9IHNlbF9tYWtlX2lub2RlKGRpci0+aV9zYiwgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPKTsKLQlpZiAoIWlub2RlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCWlub2RlLT5pX2lubyA9ICsrKCppbm8pOwpAQCAtMTc4Myw4ICsxNzYxLDggQEAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAkvKiBidW1wIGxpbmsgY291bnQgb24gcGFyZW50IGRpcmVjdG9yeSwgdG9vICovCiAJaW5jX25saW5rKGRpcik7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNlbF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC0xODIwLDExICsxNzk4LDEwIEBACiAKIAlyb290X2lub2RlID0gc2ItPnNfcm9vdC0+ZF9pbm9kZTsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsIEJPT0xfRElSX05BTUUpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODMyLDE3ICsxODA5LDE2IEBACiAKIAlib29sX2RpciA9IGRlbnRyeTsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsIE5VTExfRklMRV9OQU1FKTsKLQlpZiAoIWRlbnRyeSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZGVudHJ5KQogCQlnb3RvIGVycjsKLQl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCWlub2RlID0gc2VsX21ha2VfaW5vZGUoc2IsIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTyk7Ci0JaWYgKCFpbm9kZSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghaW5vZGUpCiAJCWdvdG8gZXJyOwotCX0KKwogCWlub2RlLT5pX2lubyA9ICsrc2VsX2xhc3RfaW5vOwogCWlzZWMgPSAoc3RydWN0IGlub2RlX3NlY3VyaXR5X3N0cnVjdCAqKWlub2RlLT5pX3NlY3VyaXR5OwogCWlzZWMtPnNpZCA9IFNFQ0lOSVRTSURfREVWTlVMTDsKQEAgLTE4NTMsMTEgKzE4MjksMTAgQEAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAlzZWxpbnV4X251bGwgPSBkZW50cnk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAiYXZjIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRlbnRyeSkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0ID0gc2VsX21ha2VfZGlyKHJvb3RfaW5vZGUsIGRlbnRyeSwgJnNlbF9sYXN0X2lubyk7CiAJaWYgKHJldCkKQEAgLTE4NjcsMTEgKzE4NDIsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsICJpbml0aWFsX2NvbnRleHRzIik7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRlbnRyeSkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0ID0gc2VsX21ha2VfZGlyKHJvb3RfaW5vZGUsIGRlbnRyeSwgJnNlbF9sYXN0X2lubyk7CiAJaWYgKHJldCkKQEAgLTE4ODEsMTEgKzE4NTUsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAorCXJldCA9IC1FTk9NRU07CiAJZGVudHJ5ID0gZF9hbGxvY19uYW1lKHNiLT5zX3Jvb3QsICJjbGFzcyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODkzLDExICsxODY2LDEwIEBACiAKIAljbGFzc19kaXIgPSBkZW50cnk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAicG9saWN5X2NhcGFiaWxpdGllcyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xOTA1LDEyICsxODc3LDExIEBACiAKIAlwb2xpY3ljYXBfZGlyID0gZGVudHJ5OwogCi1vdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIGVycjoKIAlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgZmFpbGVkIHdoaWxlIGNyZWF0aW5nIGlub2Rlc1xuIiwKIAkJX19mdW5jX18pOwotCWdvdG8gb3V0OworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzZWxfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCkBAIC0xOTM0LDE0ICsxOTA1LDE2IEBACiAJaWYgKCFzZWxpbnV4X2VuYWJsZWQpCiAJCXJldHVybiAwOwogCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNlbF9mc190eXBlKTsKLQlpZiAoIWVycikgewotCQlzZWxpbnV4ZnNfbW91bnQgPSBrZXJuX21vdW50KCZzZWxfZnNfdHlwZSk7Ci0JCWlmIChJU19FUlIoc2VsaW51eGZzX21vdW50KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJzZWxpbnV4ZnM6ICBjb3VsZCBub3QgbW91bnQhXG4iKTsKLQkJCWVyciA9IFBUUl9FUlIoc2VsaW51eGZzX21vdW50KTsKLQkJCXNlbGludXhmc19tb3VudCA9IE5VTEw7Ci0JCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2VsaW51eGZzX21vdW50ID0ga2Vybl9tb3VudCgmc2VsX2ZzX3R5cGUpOworCWlmIChJU19FUlIoc2VsaW51eGZzX21vdW50KSkgeworCQlwcmludGsoS0VSTl9FUlIgInNlbGludXhmczogIGNvdWxkIG5vdCBtb3VudCFcbiIpOworCQllcnIgPSBQVFJfRVJSKHNlbGludXhmc19tb3VudCk7CisJCXNlbGludXhmc19tb3VudCA9IE5VTEw7CiAJfQorCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCmluZGV4IDY1NWZlMWMuLmMzZjg0NWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKQEAgLTE5Myw2ICsxOTMsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgY29uZF9ib29sX2RhdHVtICpib29sZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJYm9vbGRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMjAwLDcgKzIwMSwxMCBAQAogCWlmICghYm9vbGRhdHVtLT52YWx1ZSB8fCBib29sZGF0dW0tPnZhbHVlID4gcC0+cF9ib29scy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwLT5wX2Jvb2xfdmFsX3RvX25hbWVbYm9vbGRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9CT09MU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgYm9vbGRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPmJvb2xfdmFsX3RvX3N0cnVjdFtib29sZGF0dW0tPnZhbHVlIC0gMV0gPSBib29sZGF0dW07CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCmluZGV4IGI0ZWZmN2EuLjFlZjhlNGUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwpAQCAtNDUsNyArNDUsNyBAQAogCWxlbiA9IDE7IC8qIGZvciB0aGUgYmVnaW5uaW5nICI6IiAqLwogCWZvciAobCA9IDA7IGwgPCAyOyBsKyspIHsKIAkJaW50IGluZGV4X3NlbnMgPSBjb250ZXh0LT5yYW5nZS5sZXZlbFtsXS5zZW5zOwotCQlsZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfc2Vuc192YWxfdG9fbmFtZVtpbmRleF9zZW5zIC0gMV0pOworCQlsZW4gKz0gc3RybGVuKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0xFVkVMUywgaW5kZXhfc2VucyAtIDEpKTsKIAogCQkvKiBjYXRlZ29yaWVzICovCiAJCWhlYWQgPSAtMjsKQEAgLTU1LDE3ICs1NSwxNyBAQAogCQkJaWYgKGkgLSBwcmV2ID4gMSkgewogCQkJCS8qIG9uZSBvciBtb3JlIG5lZ2F0aXZlIGJpdHMgYXJlIHNraXBwZWQgKi8KIAkJCQlpZiAoaGVhZCAhPSBwcmV2KSB7Ci0JCQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgcHJldik7CiAJCQkJCWxlbiArPSBzdHJsZW4obm0pICsgMTsKIAkJCQl9Ci0JCQkJbm0gPSBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXTsKKwkJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIGkpOwogCQkJCWxlbiArPSBzdHJsZW4obm0pICsgMTsKIAkJCQloZWFkID0gaTsKIAkJCX0KIAkJCXByZXYgPSBpOwogCQl9CiAJCWlmIChwcmV2ICE9IGhlYWQpIHsKLQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJbGVuICs9IHN0cmxlbihubSkgKyAxOwogCQl9CiAJCWlmIChsID09IDApIHsKQEAgLTEwMiw4ICsxMDIsOCBAQAogCXNjb250ZXh0cCsrOwogCiAJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgewotCQlzdHJjcHkoc2NvbnRleHRwLAotCQkgICAgICAgcG9saWN5ZGIucF9zZW5zX3ZhbF90b19uYW1lW2NvbnRleHQtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxXSk7CisJCXN0cmNweShzY29udGV4dHAsIHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0xFVkVMUywKKwkJCQkJICAgY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uc2VucyAtIDEpKTsKIAkJc2NvbnRleHRwICs9IHN0cmxlbihzY29udGV4dHApOwogCiAJCS8qIGNhdGVnb3JpZXMgKi8KQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJCQkJKnNjb250ZXh0cCsrID0gJy4nOwogCQkJCQllbHNlCiAJCQkJCQkqc2NvbnRleHRwKysgPSAnLCc7Ci0JCQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgcHJldik7CiAJCQkJCXN0cmNweShzY29udGV4dHAsIG5tKTsKIAkJCQkJc2NvbnRleHRwICs9IHN0cmxlbihubSk7CiAJCQkJfQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCQkJCSpzY29udGV4dHArKyA9ICc6JzsKIAkJCQllbHNlCiAJCQkJCSpzY29udGV4dHArKyA9ICcsJzsKLQkJCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW2ldOworCQkJCW5tID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0FUUywgaSk7CiAJCQkJc3RyY3B5KHNjb250ZXh0cCwgbm0pOwogCQkJCXNjb250ZXh0cCArPSBzdHJsZW4obm0pOwogCQkJCWhlYWQgPSBpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCQkJKnNjb250ZXh0cCsrID0gJy4nOwogCQkJZWxzZQogCQkJCSpzY29udGV4dHArKyA9ICcsJzsKLQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbcHJldl07CisJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJc3RyY3B5KHNjb250ZXh0cCwgbm0pOwogCQkJc2NvbnRleHRwICs9IHN0cmxlbihubSk7CiAJCX0KQEAgLTE2Niw3ICsxNjYsNyBAQAogCWlmICghbC0+c2VucyB8fCBsLT5zZW5zID4gcC0+cF9sZXZlbHMubnByaW0pCiAJCXJldHVybiAwOwogCWxldmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocC0+cF9sZXZlbHMudGFibGUsCi0JCQkJICBwLT5wX3NlbnNfdmFsX3RvX25hbWVbbC0+c2VucyAtIDFdKTsKKwkJCQkgIHN5bV9uYW1lKHAsIFNZTV9MRVZFTFMsIGwtPnNlbnMgLSAxKSk7CiAJaWYgKCFsZXZkYXR1bSkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ4Miw3ICs0ODIsOCBAQAogCiAJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgewogCQlsZXZkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKG5ld3AtPnBfbGV2ZWxzLnRhYmxlLAotCQkJb2xkcC0+cF9zZW5zX3ZhbF90b19uYW1lW2MtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxXSk7CisJCQkJCSAgc3ltX25hbWUob2xkcCwgU1lNX0xFVkVMUywKKwkJCQkJCSAgIGMtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxKSk7CiAKIAkJaWYgKCFsZXZkYXR1bSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtNDkzLDcgKzQ5NCw3IEBACiAJCQlpbnQgcmM7CiAKIAkJCWNhdGRhdHVtID0gaGFzaHRhYl9zZWFyY2gobmV3cC0+cF9jYXRzLnRhYmxlLAotCQkJCQkJICBvbGRwLT5wX2NhdF92YWxfdG9fbmFtZVtpXSk7CisJCQkJCQkgIHN5bV9uYW1lKG9sZHAsIFNZTV9DQVRTLCBpKSk7CiAJCQlpZiAoIWNhdGRhdHVtKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcmMgPSBlYml0bWFwX3NldF9iaXQoJmJpdG1hcCwgY2F0ZGF0dW0tPnZhbHVlIC0gMSwgMSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggOTRmNjMwZC4uYmU5ZGUzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtMTQ4LDMyICsxNDgsMzAgQEAKIAlpbnQgcmM7CiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CiAKKwlyYyA9IC1FTk9NRU07CiAJcm9sZSA9IGt6YWxsb2Moc2l6ZW9mKCpyb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyb2xlKSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIXJvbGUpCiAJCWdvdG8gb3V0OwotCX0KKworCXJjID0gLUVJTlZBTDsKIAlyb2xlLT52YWx1ZSA9ICsrcC0+cF9yb2xlcy5ucHJpbTsKLQlpZiAocm9sZS0+dmFsdWUgIT0gT0JKRUNUX1JfVkFMKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZnJlZV9yb2xlOwotCX0KKwlpZiAocm9sZS0+dmFsdWUgIT0gT0JKRUNUX1JfVkFMKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrc3RyZHVwKE9CSkVDVF9SLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfcm9sZTsKLQl9CisJaWYgKCFrZXkpCisJCWdvdG8gb3V0OworCiAJcmMgPSBoYXNodGFiX2luc2VydChwLT5wX3JvbGVzLnRhYmxlLCBrZXksIHJvbGUpOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9rZXk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAotb3V0X2ZyZWVfa2V5OgorCXJldHVybiAwOworb3V0OgogCWtmcmVlKGtleSk7Ci1vdXRfZnJlZV9yb2xlOgogCWtmcmVlKHJvbGUpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIHUzMiByYW5nZXRyX2hhc2goc3RydWN0IGhhc2h0YWIgKmgsIGNvbnN0IHZvaWQgKmspCkBAIC0yMTMsMzUgKzIxMSwzMyBAQAogCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspIHsKIAkJcmMgPSBzeW10YWJfaW5pdCgmcC0+c3ltdGFiW2ldLCBzeW10YWJfc2l6ZXNbaV0pOwogCQlpZiAocmMpCi0JCQlnb3RvIG91dF9mcmVlX3N5bXRhYjsKKwkJCWdvdG8gb3V0OwogCX0KIAogCXJjID0gYXZ0YWJfaW5pdCgmcC0+dGVfYXZ0YWIpOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJcmMgPSByb2xlc19pbml0KHApOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJcmMgPSBjb25kX3BvbGljeWRiX2luaXQocCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dF9mcmVlX3N5bXRhYjsKKwkJZ290byBvdXQ7CiAKIAlwLT5yYW5nZV90ciA9IGhhc2h0YWJfY3JlYXRlKHJhbmdldHJfaGFzaCwgcmFuZ2V0cl9jbXAsIDI1Nik7CiAJaWYgKCFwLT5yYW5nZV90cikKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJZWJpdG1hcF9pbml0KCZwLT5wb2xpY3ljYXBzKTsKIAllYml0bWFwX2luaXQoJnAtPnBlcm1pc3NpdmVfbWFwKTsKIAorCXJldHVybiAwOwogb3V0OgotCXJldHVybiByYzsKLQotb3V0X2ZyZWVfc3ltdGFiOgogCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspCiAJCWhhc2h0YWJfZGVzdHJveShwLT5zeW10YWJbaV0udGFibGUpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogLyoKQEAgLTI1OCwxMiArMjU0LDE3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjb21tb25fZGF0dW0gKmNvbWRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWNvbWRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwogCWlmICghY29tZGF0dW0tPnZhbHVlIHx8IGNvbWRhdHVtLT52YWx1ZSA+IHAtPnBfY29tbW9ucy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcC0+cF9jb21tb25fdmFsX3RvX25hbWVbY29tZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7CisKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQ09NTU9OU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgY29tZGF0dW0tPnZhbHVlIC0gMSwga2V5LAorCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJQlVHKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MSwxMiArMjcyLDE2IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjbGFzc19kYXR1bSAqY2xhZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJY2xhZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CiAJaWYgKCFjbGFkYXR1bS0+dmFsdWUgfHwgY2xhZGF0dW0tPnZhbHVlID4gcC0+cF9jbGFzc2VzLm5wcmltKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwLT5wX2NsYXNzX3ZhbF90b19uYW1lW2NsYWRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9DTEFTU0VTXTsKKwlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCBjbGFkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQlCVUcoKTsKIAlwLT5jbGFzc192YWxfdG9fc3RydWN0W2NsYWRhdHVtLT52YWx1ZSAtIDFdID0gY2xhZGF0dW07CiAJcmV0dXJuIDA7CiB9CkBAIC0yODUsNiArMjkwLDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJcm9sZSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKQEAgLTI5Miw3ICsyOTgsMTEgQEAKIAkgICAgfHwgcm9sZS0+dmFsdWUgPiBwLT5wX3JvbGVzLm5wcmltCiAJICAgIHx8IHJvbGUtPmJvdW5kcyA+IHAtPnBfcm9sZXMubnByaW0pCiAJCXJldHVybiAtRUlOVkFMOwotCXAtPnBfcm9sZV92YWxfdG9fbmFtZVtyb2xlLT52YWx1ZSAtIDFdID0ga2V5OworCisJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX1JPTEVTXTsKKwlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCByb2xlLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPnJvbGVfdmFsX3RvX3N0cnVjdFtyb2xlLT52YWx1ZSAtIDFdID0gcm9sZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwMSw2ICszMTEsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgdHlwZV9kYXR1bSAqdHlwZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJdHlwZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CkBAIC0zMTAsOCArMzIxLDE1IEBACiAJCSAgICB8fCB0eXBkYXR1bS0+dmFsdWUgPiBwLT5wX3R5cGVzLm5wcmltCiAJCSAgICB8fCB0eXBkYXR1bS0+Ym91bmRzID4gcC0+cF90eXBlcy5ucHJpbSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlwLT5wX3R5cGVfdmFsX3RvX25hbWVbdHlwZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7Ci0JCXAtPnR5cGVfdmFsX3RvX3N0cnVjdFt0eXBkYXR1bS0+dmFsdWUgLSAxXSA9IHR5cGRhdHVtOworCQlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fVFlQRVNdOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCB0eXBkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOworCisJCWZhID0gcC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5OworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCB0eXBkYXR1bS0+dmFsdWUgLSAxLCB0eXBkYXR1bSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMjEsNiArMzM5LDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IHVzZXJfZGF0dW0gKnVzcmRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCXVzcmRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzI4LDcgKzM0NywxMSBAQAogCSAgICB8fCB1c3JkYXR1bS0+dmFsdWUgPiBwLT5wX3VzZXJzLm5wcmltCiAJICAgIHx8IHVzcmRhdHVtLT5ib3VuZHMgPiBwLT5wX3VzZXJzLm5wcmltKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwLT5wX3VzZXJfdmFsX3RvX25hbWVbdXNyZGF0dW0tPnZhbHVlIC0gMV0gPSBrZXk7CisKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fVVNFUlNdOworCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIHVzcmRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdFt1c3JkYXR1bS0+dmFsdWUgLSAxXSA9IHVzcmRhdHVtOwogCXJldHVybiAwOwogfQpAQCAtMzM3LDYgKzM2MCw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBsZXZlbF9kYXR1bSAqbGV2ZGF0dW07CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhOwogCiAJbGV2ZGF0dW0gPSBkYXR1bTsKIAlwID0gZGF0YXA7CkBAIC0zNDUsNyArMzY5LDEwIEBACiAJCWlmICghbGV2ZGF0dW0tPmxldmVsLT5zZW5zIHx8CiAJCSAgICBsZXZkYXR1bS0+bGV2ZWwtPnNlbnMgPiBwLT5wX2xldmVscy5ucHJpbSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlwLT5wX3NlbnNfdmFsX3RvX25hbWVbbGV2ZGF0dW0tPmxldmVsLT5zZW5zIC0gMV0gPSBrZXk7CisJCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9MRVZFTFNdOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCBsZXZkYXR1bS0+bGV2ZWwtPnNlbnMgLSAxLCBrZXksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzU1LDYgKzM4Miw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCBjYXRfZGF0dW0gKmNhdGRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWNhdGRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzYyLDcgKzM5MCwxMCBAQAogCWlmICghY2F0ZGF0dW0tPmlzYWxpYXMpIHsKIAkJaWYgKCFjYXRkYXR1bS0+dmFsdWUgfHwgY2F0ZGF0dW0tPnZhbHVlID4gcC0+cF9jYXRzLm5wcmltKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXAtPnBfY2F0X3ZhbF90b19uYW1lW2NhdGRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCQlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQ0FUU107CisJCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIGNhdGRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zODAsNDcgKzQxMSw2IEBACiAJY2F0X2luZGV4LAogfTsKIAotLyoKLSAqIERlZmluZSB0aGUgY29tbW9uIHZhbF90b19uYW1lIGFycmF5IGFuZCB0aGUgY2xhc3MKLSAqIHZhbF90b19uYW1lIGFuZCB2YWxfdG9fc3RydWN0IGFycmF5cyBpbiBhIHBvbGljeQotICogZGF0YWJhc2Ugc3RydWN0dXJlLgotICoKLSAqIENhbGxlciBtdXN0IGNsZWFuIHVwIHVwb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBwb2xpY3lkYl9pbmRleF9jbGFzc2VzKHN0cnVjdCBwb2xpY3lkYiAqcCkKLXsKLQlpbnQgcmM7Ci0KLQlwLT5wX2NvbW1vbl92YWxfdG9fbmFtZSA9Ci0JCWttYWxsb2MocC0+cF9jb21tb25zLm5wcmltICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOwotCWlmICghcC0+cF9jb21tb25fdmFsX3RvX25hbWUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGhhc2h0YWJfbWFwKHAtPnBfY29tbW9ucy50YWJsZSwgY29tbW9uX2luZGV4LCBwKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCi0JcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwLT5wX2NsYXNzX3ZhbF90b19uYW1lID0KLQkJa21hbGxvYyhwLT5wX2NsYXNzZXMubnByaW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT5wX2NsYXNzX3ZhbF90b19uYW1lKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBoYXNodGFiX21hcChwLT5wX2NsYXNzZXMudGFibGUsIGNsYXNzX2luZGV4LCBwKTsKLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KICNpZmRlZiBERUJVR19IQVNIRVMKIHN0YXRpYyB2b2lkIHN5bXRhYl9oYXNoX2V2YWwoc3RydWN0IHN5bXRhYiAqcykKIHsKQEAgLTQ1OCw5ICs0NDgsOSBAQAogICoKICAqIENhbGxlciBtdXN0IGNsZWFuIHVwIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgcG9saWN5ZGJfaW5kZXhfb3RoZXJzKHN0cnVjdCBwb2xpY3lkYiAqcCkKK3N0YXRpYyBpbnQgcG9saWN5ZGJfaW5kZXgoc3RydWN0IHBvbGljeWRiICpwKQogewotCWludCBpLCByYyA9IDA7CisJaW50IGksIHJjOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlNFTGludXg6ICAlZCB1c2VycywgJWQgcm9sZXMsICVkIHR5cGVzLCAlZCBib29scyIsCiAJICAgICAgIHAtPnBfdXNlcnMubnByaW0sIHAtPnBfcm9sZXMubnByaW0sIHAtPnBfdHlwZXMubnByaW0sIHAtPnBfYm9vbHMubnByaW0pOwpAQCAtNDc3LDQ3ICs0NjcsNjMgQEAKIAlzeW10YWJfaGFzaF9ldmFsKHAtPnN5bXRhYik7CiAjZW5kaWYKIAorCXJjID0gLUVOT01FTTsKKwlwLT5jbGFzc192YWxfdG9fc3RydWN0ID0KKwkJa21hbGxvYyhwLT5wX2NsYXNzZXMubnByaW0gKiBzaXplb2YoKihwLT5jbGFzc192YWxfdG9fc3RydWN0KSksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRU5PTUVNOwogCXAtPnJvbGVfdmFsX3RvX3N0cnVjdCA9CiAJCWttYWxsb2MocC0+cF9yb2xlcy5ucHJpbSAqIHNpemVvZigqKHAtPnJvbGVfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICghcC0+cm9sZV92YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKLQl9CiAKKwlyYyA9IC1FTk9NRU07CiAJcC0+dXNlcl92YWxfdG9fc3RydWN0ID0KIAkJa21hbGxvYyhwLT5wX3VzZXJzLm5wcmltICogc2l6ZW9mKCoocC0+dXNlcl92YWxfdG9fc3RydWN0KSksCiAJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPnVzZXJfdmFsX3RvX3N0cnVjdCkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFwLT51c2VyX3ZhbF90b19zdHJ1Y3QpCiAJCWdvdG8gb3V0OwotCX0KIAotCXAtPnR5cGVfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF90eXBlcy5ucHJpbSAqIHNpemVvZigqKHAtPnR5cGVfdmFsX3RvX3N0cnVjdCkpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT50eXBlX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOworCS8qIFllcywgSSB3YW50IHRoZSBzaXplb2YgdGhlIHBvaW50ZXIsIG5vdCB0aGUgc3RydWN0dXJlICovCisJcmMgPSAtRU5PTUVNOworCXAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSA9IGZsZXhfYXJyYXlfYWxsb2Moc2l6ZW9mKHN0cnVjdCB0eXBlX2RhdHVtICopLAorCQkJCQkJICAgICAgIHAtPnBfdHlwZXMubnByaW0sCisJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCWlmICghcC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAoY29uZF9pbml0X2Jvb2xfaW5kZXhlcyhwKSkgewotCQlyYyA9IC1FTk9NRU07CisJcmMgPSBmbGV4X2FycmF5X3ByZWFsbG9jKHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwgMCwKKwkJCQkgcC0+cF90eXBlcy5ucHJpbSAtIDEsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAocmMpCiAJCWdvdG8gb3V0OwotCX0KIAotCWZvciAoaSA9IFNZTV9ST0xFUzsgaSA8IFNZTV9OVU07IGkrKykgewotCQlwLT5zeW1fdmFsX3RvX25hbWVbaV0gPQotCQkJa21hbGxvYyhwLT5zeW10YWJbaV0ubnByaW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcC0+c3ltX3ZhbF90b19uYW1lW2ldKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJcmMgPSAtRU5PTUVNOworCWlmIChjb25kX2luaXRfYm9vbF9pbmRleGVzKHApKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOworCQlwLT5zeW1fdmFsX3RvX25hbWVbaV0gPSBmbGV4X2FycmF5X2FsbG9jKHNpemVvZihjaGFyICopLAorCQkJCQkJCSBwLT5zeW10YWJbaV0ubnByaW0sCisJCQkJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwLT5zeW1fdmFsX3RvX25hbWVbaV0pCiAJCQlnb3RvIG91dDsKLQkJfQorCisJCXJjID0gZmxleF9hcnJheV9wcmVhbGxvYyhwLT5zeW1fdmFsX3RvX25hbWVbaV0sCisJCQkJCSAwLCBwLT5zeW10YWJbaV0ubnByaW0gLSAxLAorCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwogCQlyYyA9IGhhc2h0YWJfbWFwKHAtPnN5bXRhYltpXS50YWJsZSwgaW5kZXhfZltpXSwgcCk7CiAJCWlmIChyYykKIAkJCWdvdG8gb3V0OwogCX0KLQorCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC01NDAsOSArNTQ2LDExIEBACiAJc3RydWN0IGNvbW1vbl9kYXR1bSAqY29tZGF0dW07CiAKIAlrZnJlZShrZXkpOwotCWNvbWRhdHVtID0gZGF0dW07Ci0JaGFzaHRhYl9tYXAoY29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlLCBwZXJtX2Rlc3Ryb3ksIE5VTEwpOwotCWhhc2h0YWJfZGVzdHJveShjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOworCWlmIChkYXR1bSkgeworCQljb21kYXR1bSA9IGRhdHVtOworCQloYXNodGFiX21hcChjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHBlcm1fZGVzdHJveSwgTlVMTCk7CisJCWhhc2h0YWJfZGVzdHJveShjb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01NTQsMzggKzU2Miw0MCBAQAogCXN0cnVjdCBjb25zdHJhaW50X2V4cHIgKmUsICpldG1wOwogCiAJa2ZyZWUoa2V5KTsKLQljbGFkYXR1bSA9IGRhdHVtOwotCWhhc2h0YWJfbWFwKGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSwgcGVybV9kZXN0cm95LCBOVUxMKTsKLQloYXNodGFiX2Rlc3Ryb3koY2xhZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlKTsKLQljb25zdHJhaW50ID0gY2xhZGF0dW0tPmNvbnN0cmFpbnRzOwotCXdoaWxlIChjb25zdHJhaW50KSB7Ci0JCWUgPSBjb25zdHJhaW50LT5leHByOwotCQl3aGlsZSAoZSkgewotCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7Ci0JCQlldG1wID0gZTsKLQkJCWUgPSBlLT5uZXh0OwotCQkJa2ZyZWUoZXRtcCk7CisJaWYgKGRhdHVtKSB7CisJCWNsYWRhdHVtID0gZGF0dW07CisJCWhhc2h0YWJfbWFwKGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSwgcGVybV9kZXN0cm95LCBOVUxMKTsKKwkJaGFzaHRhYl9kZXN0cm95KGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSk7CisJCWNvbnN0cmFpbnQgPSBjbGFkYXR1bS0+Y29uc3RyYWludHM7CisJCXdoaWxlIChjb25zdHJhaW50KSB7CisJCQllID0gY29uc3RyYWludC0+ZXhwcjsKKwkJCXdoaWxlIChlKSB7CisJCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7CisJCQkJZXRtcCA9IGU7CisJCQkJZSA9IGUtPm5leHQ7CisJCQkJa2ZyZWUoZXRtcCk7CisJCQl9CisJCQljdGVtcCA9IGNvbnN0cmFpbnQ7CisJCQljb25zdHJhaW50ID0gY29uc3RyYWludC0+bmV4dDsKKwkJCWtmcmVlKGN0ZW1wKTsKIAkJfQotCQljdGVtcCA9IGNvbnN0cmFpbnQ7Ci0JCWNvbnN0cmFpbnQgPSBjb25zdHJhaW50LT5uZXh0OwotCQlrZnJlZShjdGVtcCk7Ci0JfQogCi0JY29uc3RyYWludCA9IGNsYWRhdHVtLT52YWxpZGF0ZXRyYW5zOwotCXdoaWxlIChjb25zdHJhaW50KSB7Ci0JCWUgPSBjb25zdHJhaW50LT5leHByOwotCQl3aGlsZSAoZSkgewotCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7Ci0JCQlldG1wID0gZTsKLQkJCWUgPSBlLT5uZXh0OwotCQkJa2ZyZWUoZXRtcCk7CisJCWNvbnN0cmFpbnQgPSBjbGFkYXR1bS0+dmFsaWRhdGV0cmFuczsKKwkJd2hpbGUgKGNvbnN0cmFpbnQpIHsKKwkJCWUgPSBjb25zdHJhaW50LT5leHByOworCQkJd2hpbGUgKGUpIHsKKwkJCQllYml0bWFwX2Rlc3Ryb3koJmUtPm5hbWVzKTsKKwkJCQlldG1wID0gZTsKKwkJCQllID0gZS0+bmV4dDsKKwkJCQlrZnJlZShldG1wKTsKKwkJCX0KKwkJCWN0ZW1wID0gY29uc3RyYWludDsKKwkJCWNvbnN0cmFpbnQgPSBjb25zdHJhaW50LT5uZXh0OworCQkJa2ZyZWUoY3RlbXApOwogCQl9Ci0JCWN0ZW1wID0gY29uc3RyYWludDsKLQkJY29uc3RyYWludCA9IGNvbnN0cmFpbnQtPm5leHQ7Ci0JCWtmcmVlKGN0ZW1wKTsKLQl9CiAKLQlrZnJlZShjbGFkYXR1bS0+Y29ta2V5KTsKKwkJa2ZyZWUoY2xhZGF0dW0tPmNvbWtleSk7CisJfQogCWtmcmVlKGRhdHVtKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU5NSw5ICs2MDUsMTEgQEAKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqcm9sZTsKIAogCWtmcmVlKGtleSk7Ci0Jcm9sZSA9IGRhdHVtOwotCWViaXRtYXBfZGVzdHJveSgmcm9sZS0+ZG9taW5hdGVzKTsKLQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPnR5cGVzKTsKKwlpZiAoZGF0dW0pIHsKKwkJcm9sZSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPmRvbWluYXRlcyk7CisJCWViaXRtYXBfZGVzdHJveSgmcm9sZS0+dHlwZXMpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MTQsMTEgKzYyNiwxMyBAQAogCXN0cnVjdCB1c2VyX2RhdHVtICp1c3JkYXR1bTsKIAogCWtmcmVlKGtleSk7Ci0JdXNyZGF0dW0gPSBkYXR1bTsKLQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yb2xlcyk7Ci0JZWJpdG1hcF9kZXN0cm95KCZ1c3JkYXR1bS0+cmFuZ2UubGV2ZWxbMF0uY2F0KTsKLQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yYW5nZS5sZXZlbFsxXS5jYXQpOwotCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPmRmbHRsZXZlbC5jYXQpOworCWlmIChkYXR1bSkgeworCQl1c3JkYXR1bSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yb2xlcyk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPnJhbmdlLmxldmVsWzBdLmNhdCk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPnJhbmdlLmxldmVsWzFdLmNhdCk7CisJCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPmRmbHRsZXZlbC5jYXQpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02MjgsOSArNjQyLDExIEBACiAJc3RydWN0IGxldmVsX2RhdHVtICpsZXZkYXR1bTsKIAogCWtmcmVlKGtleSk7Ci0JbGV2ZGF0dW0gPSBkYXR1bTsKLQllYml0bWFwX2Rlc3Ryb3koJmxldmRhdHVtLT5sZXZlbC0+Y2F0KTsKLQlrZnJlZShsZXZkYXR1bS0+bGV2ZWwpOworCWlmIChkYXR1bSkgeworCQlsZXZkYXR1bSA9IGRhdHVtOworCQllYml0bWFwX2Rlc3Ryb3koJmxldmRhdHVtLT5sZXZlbC0+Y2F0KTsKKwkJa2ZyZWUobGV2ZGF0dW0tPmxldmVsKTsKKwl9CiAJa2ZyZWUoZGF0dW0pOwogCXJldHVybiAwOwogfQpAQCAtNjk1LDEzICs3MTEsMTYgQEAKIAkJaGFzaHRhYl9kZXN0cm95KHAtPnN5bXRhYltpXS50YWJsZSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFNZTV9OVU07IGkrKykKLQkJa2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgU1lNX05VTTsgaSsrKSB7CisJCWlmIChwLT5zeW1fdmFsX3RvX25hbWVbaV0pCisJCQlmbGV4X2FycmF5X2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKKwl9CiAKIAlrZnJlZShwLT5jbGFzc192YWxfdG9fc3RydWN0KTsKIAlrZnJlZShwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpOwogCWtmcmVlKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCk7Ci0Ja2ZyZWUocC0+dHlwZV92YWxfdG9fc3RydWN0KTsKKwlpZiAocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KQorCQlmbGV4X2FycmF5X2ZyZWUocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5KTsKIAogCWF2dGFiX2Rlc3Ryb3koJnAtPnRlX2F2dGFiKTsKIApAQCAtNzg1LDE5ICs4MDQsMjEgQEAKIAogCWhlYWQgPSBwLT5vY29udGV4dHNbT0NPTl9JU0lEXTsKIAlmb3IgKGMgPSBoZWFkOyBjOyBjID0gYy0+bmV4dCkgeworCQlyYyA9IC1FSU5WQUw7CiAJCWlmICghYy0+Y29udGV4dFswXS51c2VyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBTSUQgJXMgd2FzIG5ldmVyICIKLQkJCSAgICAgICAiZGVmaW5lZC5cbiIsIGMtPnUubmFtZSk7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBTSUQgJXMgd2FzIG5ldmVyIGRlZmluZWQuXG4iLAorCQkJCWMtPnUubmFtZSk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoc2lkdGFiX2luc2VydChzLCBjLT5zaWRbMF0sICZjLT5jb250ZXh0WzBdKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdW5hYmxlIHRvIGxvYWQgaW5pdGlhbCAiCi0JCQkgICAgICAgIlNJRCAlcy5cbiIsIGMtPnUubmFtZSk7Ci0JCQlyYyA9IC1FSU5WQUw7CisKKwkJcmMgPSBzaWR0YWJfaW5zZXJ0KHMsIGMtPnNpZFswXSwgJmMtPmNvbnRleHRbMF0pOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBsb2FkIGluaXRpYWwgU0lEICVzLlxuIiwKKwkJCQljLT51Lm5hbWUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CisJcmMgPSAwOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTg0Niw4ICs4NjcsNyBAQAogCQkgKiBSb2xlIG11c3QgYmUgYXV0aG9yaXplZCBmb3IgdGhlIHR5cGUuCiAJCSAqLwogCQlyb2xlID0gcC0+cm9sZV92YWxfdG9fc3RydWN0W2MtPnJvbGUgLSAxXTsKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLAotCQkJCSAgICAgYy0+dHlwZSAtIDEpKQorCQlpZiAoIWViaXRtYXBfZ2V0X2JpdCgmcm9sZS0+dHlwZXMsIGMtPnR5cGUgLSAxKSkKIAkJCS8qIHJvbGUgbWF5IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggdHlwZSAqLwogCQkJcmV0dXJuIDA7CiAKQEAgLTg1OCw4ICs4NzgsNyBAQAogCQlpZiAoIXVzcmRhdHVtKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnVzcmRhdHVtLT5yb2xlcywKLQkJCQkgICAgIGMtPnJvbGUgLSAxKSkKKwkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnVzcmRhdHVtLT5yb2xlcywgYy0+cm9sZSAtIDEpKQogCQkJLyogdXNlciBtYXkgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCByb2xlICovCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC04ODEsMjAgKzkwMCwyMiBAQAogCWludCByYzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gb3V0OwogCisJcmMgPSAtRUlOVkFMOwogCWl0ZW1zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAoaXRlbXMgPiBBUlJBWV9TSVpFKGJ1ZikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICByYW5nZSBvdmVyZmxvd1xuIik7Ci0JCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQorCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpICogaXRlbXMpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICB0cnVuY2F0ZWQgcmFuZ2VcbiIpOwogCQlnb3RvIG91dDsKIAl9CisKIAlyLT5sZXZlbFswXS5zZW5zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAoaXRlbXMgPiAxKQogCQlyLT5sZXZlbFsxXS5zZW5zID0gbGUzMl90b19jcHUoYnVmWzFdKTsKQEAgLTkwMywxNSArOTI0LDEzIEBACiAKIAlyYyA9IGViaXRtYXBfcmVhZCgmci0+bGV2ZWxbMF0uY2F0LCBmcCk7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgZXJyb3IgcmVhZGluZyBsb3cgIgotCQkgICAgICAgImNhdGVnb3JpZXNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbG93IGNhdGVnb3JpZXNcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKGl0ZW1zID4gMSkgewogCQlyYyA9IGViaXRtYXBfcmVhZCgmci0+bGV2ZWxbMV0uY2F0LCBmcCk7CiAJCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICBlcnJvciByZWFkaW5nIGhpZ2ggIgotCQkJICAgICAgICJjYXRlZ29yaWVzXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgZXJyb3IgcmVhZGluZyBoaWdoIGNhdGVnb3JpZXNcbiIpOwogCQkJZ290byBiYWRfaGlnaDsKIAkJfQogCX0gZWxzZSB7CkBAIC05MjIsMTIgKzk0MSwxMSBAQAogCQl9CiAJfQogCi0JcmMgPSAwOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZF9oaWdoOgogCWViaXRtYXBfZGVzdHJveSgmci0+bGV2ZWxbMF0uY2F0KTsKLQlnb3RvIG91dDsKK291dDoKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC05NDIsNyArOTYwLDcgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHJjIDwgMCkgeworCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGNvbnRleHQgdHJ1bmNhdGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTUwLDE5ICs5NjgsMjAgQEAKIAljLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAljLT50eXBlID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX01MUykgewotCQlpZiAobWxzX3JlYWRfcmFuZ2VfaGVscGVyKCZjLT5yYW5nZSwgZnApKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGVycm9yIHJlYWRpbmcgTUxTIHJhbmdlIG9mICIKLQkJCSAgICAgICAiY29udGV4dFxuIik7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCXJjID0gbWxzX3JlYWRfcmFuZ2VfaGVscGVyKCZjLT5yYW5nZSwgZnApOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogZXJyb3IgcmVhZGluZyBNTFMgcmFuZ2Ugb2YgY29udGV4dFxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KIAorCXJjID0gLUVJTlZBTDsKIAlpZiAoIXBvbGljeWRiX2NvbnRleHRfaXN2YWxpZChwLCBjKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBpbnZhbGlkIHNlY3VyaXR5IGNvbnRleHRcbiIpOwogCQljb250ZXh0X2Rlc3Ryb3koYyk7Ci0JCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CiAJfQorCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC05ODEsMzcgKzEwMDAsMzYgQEAKIAlfX2xlMzIgYnVmWzJdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJcGVyZGF0dW0gPSBremFsbG9jKHNpemVvZigqcGVyZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBlcmRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcGVyZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJcGVyZGF0dW0tPnZhbHVlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQorCiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCBwZXJkYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIGJhZDoKIAlwZXJtX2Rlc3Ryb3koa2V5LCBwZXJkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNvbW1vbl9yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKQpAQCAtMTAyMiwxNCArMTA0MCwxMyBAQAogCXUzMiBsZW4sIG5lbDsKIAlpbnQgaSwgcmM7CiAKKwlyYyA9IC1FTk9NRU07CiAJY29tZGF0dW0gPSBremFsbG9jKHNpemVvZigqY29tZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbWRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghY29tZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMDQxLDEzICsxMDU4LDEzIEBACiAJY29tZGF0dW0tPnBlcm1pc3Npb25zLm5wcmltID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAluZWwgPSBsZTMyX3RvX2NwdShidWZbM10pOwogCisJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICgha2V5KQogCQlnb3RvIGJhZDsKLQl9CisKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCkBAIC0xMDYwLDExICsxMDc3LDEwIEBACiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGNvbWRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZDoKIAljb21tb25fZGVzdHJveShrZXksIGNvbWRhdHVtLCBOVUxMKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF9jb25zX2hlbHBlcihzdHJ1Y3QgY29uc3RyYWludF9ub2RlICoqbm9kZXAsIGludCBuY29ucywKQEAgLTEwODgsNyArMTEwNCw3IEBACiAJCQkqbm9kZXAgPSBjOwogCiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCAoc2l6ZW9mKHUzMikgKiAyKSk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAkJYy0+cGVybWlzc2lvbnMgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQluZXhwciA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CkBAIC0xMTA1LDcgKzExMjEsNyBAQAogCQkJCWMtPmV4cHIgPSBlOwogCiAJCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgKHNpemVvZih1MzIpICogMykpOwotCQkJaWYgKHJjIDwgMCkKKwkJCWlmIChyYykKIAkJCQlyZXR1cm4gcmM7CiAJCQllLT5leHByX3R5cGUgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQkJZS0+YXR0ciA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CkBAIC0xMTMzLDggKzExNDksOSBAQAogCQkJCWlmIChkZXB0aCA9PSAoQ0VYUFJfTUFYREVQVEggLSAxKSkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJZGVwdGgrKzsKLQkJCQlpZiAoZWJpdG1hcF9yZWFkKCZlLT5uYW1lcywgZnApKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlyYyA9IGViaXRtYXBfcmVhZCgmZS0+bmFtZXMsIGZwKTsKKwkJCQlpZiAocmMpCisJCQkJCXJldHVybiByYzsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTU3LDE0ICsxMTc0LDEzIEBACiAJdTMyIGxlbiwgbGVuMiwgbmNvbnMsIG5lbDsKIAlpbnQgaSwgcmM7CiAKKwlyYyA9IC1FTk9NRU07CiAJY2xhZGF0dW0gPSBremFsbG9jKHNpemVvZigqY2xhZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsYWRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghY2xhZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMTc5LDMzICsxMTk1LDMwIEBACiAKIAluY29ucyA9IGxlMzJfdG9fY3B1KGJ1Zls1XSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KKwogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlpZiAobGVuMikgeworCQlyYyA9IC1FTk9NRU07CiAJCWNsYWRhdHVtLT5jb21rZXkgPSBrbWFsbG9jKGxlbjIgKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbGFkYXR1bS0+Y29ta2V5KSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghY2xhZGF0dW0tPmNvbWtleSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCXJjID0gbmV4dF9lbnRyeShjbGFkYXR1bS0+Y29ta2V5LCBmcCwgbGVuMik7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCWdvdG8gYmFkOwogCQljbGFkYXR1bS0+Y29ta2V5W2xlbjJdID0gJ1wwJzsKIAotCQljbGFkYXR1bS0+Y29tZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwLT5wX2NvbW1vbnMudGFibGUsCi0JCQkJCQkgICAgY2xhZGF0dW0tPmNvbWtleSk7CisJCXJjID0gLUVJTlZBTDsKKwkJY2xhZGF0dW0tPmNvbWRhdHVtID0gaGFzaHRhYl9zZWFyY2gocC0+cF9jb21tb25zLnRhYmxlLCBjbGFkYXR1bS0+Y29ta2V5KTsKIAkJaWYgKCFjbGFkYXR1bS0+Y29tZGF0dW0pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVua25vd24gY29tbW9uICVzXG4iLAotCQkJICAgICAgIGNsYWRhdHVtLT5jb21rZXkpOwotCQkJcmMgPSAtRUlOVkFMOworCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdW5rbm93biBjb21tb24gJXNcbiIsIGNsYWRhdHVtLT5jb21rZXkpOwogCQkJZ290byBiYWQ7CiAJCX0KIAl9CkBAIC0xMjIyLDcgKzEyMzUsNyBAQAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fVkFMSURBVEVUUkFOUykgewogCQkvKiBncmFiIHRoZSB2YWxpZGF0ZXRyYW5zIHJ1bGVzICovCiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYykKIAkJCWdvdG8gYmFkOwogCQluY29ucyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJCXJjID0gcmVhZF9jb25zX2hlbHBlcigmY2xhZGF0dW0tPnZhbGlkYXRldHJhbnMsIG5jb25zLCAxLCBmcCk7CkBAIC0xMjM0LDEyICsxMjQ3LDEwIEBACiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAotCXJjID0gMDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJY2xzX2Rlc3Ryb3koa2V5LCBjbGFkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHJvbGVfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTEyNTAsMTcgKzEyNjEsMTYgQEAKIAlfX2xlMzIgYnVmWzNdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJcm9sZSA9IGt6YWxsb2Moc2l6ZW9mKCpyb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyb2xlKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghcm9sZSkKKwkJZ290byBiYWQ7CiAKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZKQogCQl0b19yZWFkID0gMzsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YoYnVmWzBdKSAqIHRvX3JlYWQpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMjY4LDEzICsxMjc4LDEzIEBACiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKIAkJcm9sZS0+Ym91bmRzID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQorCiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIApAQCAtMTI4NywxMCArMTI5NywxMCBAQAogCQlnb3RvIGJhZDsKIAogCWlmIChzdHJjbXAoa2V5LCBPQkpFQ1RfUikgPT0gMCkgeworCQlyYyA9IC1FSU5WQUw7CiAJCWlmIChyb2xlLT52YWx1ZSAhPSBPQkpFQ1RfUl9WQUwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogUm9sZSAlcyBoYXMgd3JvbmcgdmFsdWUgJWRcbiIsCiAJCQkgICAgICAgT0JKRUNUX1IsIHJvbGUtPnZhbHVlKTsKLQkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gYmFkOwogCQl9CiAJCXJjID0gMDsKQEAgLTEzMDAsMTEgKzEzMTAsMTAgQEAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgcm9sZSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJcm9sZV9kZXN0cm95KGtleSwgcm9sZSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHR5cGVfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTEzMTUsMTcgKzEzMjQsMTYgQEAKIAlfX2xlMzIgYnVmWzRdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJdHlwZGF0dW0gPSBremFsbG9jKHNpemVvZigqdHlwZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR5cGRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJcmV0dXJuIHJjOwotCX0KKwlpZiAoIXR5cGRhdHVtKQorCQlnb3RvIGJhZDsKIAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXRvX3JlYWQgPSA0OwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZihidWZbMF0pICogdG9fcmVhZCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKQEAgLTEzNDMsMjQgKzEzNTEsMjIgQEAKIAkJdHlwZGF0dW0tPnByaW1hcnkgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCX0KIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgdHlwZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogYmFkOgogCXR5cGVfZGVzdHJveShrZXksIHR5cGRhdHVtLCBOVUxMKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIApAQCAtMTM3NiwyMiArMTM4MiwxOCBAQAogCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6IHRydW5jYXRlZCBsZXZlbFxuIik7Ci0JCWdvdG8gYmFkOworCQlyZXR1cm4gcmM7CiAJfQogCWxwLT5zZW5zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAotCWlmIChlYml0bWFwX3JlYWQoJmxwLT5jYXQsIGZwKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbGV2ZWwgIgotCQkgICAgICAgImNhdGVnb3JpZXNcbiIpOwotCQlnb3RvIGJhZDsKKwlyYyA9IGViaXRtYXBfcmVhZCgmbHAtPmNhdCwgZnApOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbGV2ZWwgY2F0ZWdvcmllc1xuIik7CisJCXJldHVybiByYzsKIAl9Ci0KIAlyZXR1cm4gMDsKLQotYmFkOgotCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IHVzZXJfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTE0MDIsMTcgKzE0MDQsMTYgQEAKIAlfX2xlMzIgYnVmWzNdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJdXNyZGF0dW0gPSBremFsbG9jKHNpemVvZigqdXNyZGF0dW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzcmRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghdXNyZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKIAkJdG9fcmVhZCA9IDM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKGJ1ZlswXSkgKiB0b19yZWFkKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwpAQCAtMTQyMCwxMyArMTQyMSwxMiBAQAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXVzcmRhdHVtLT5ib3VuZHMgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCisJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICgha2V5KQogCQlnb3RvIGJhZDsKLQl9CiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIApAQCAtMTQ0NiwxMSArMTQ0NiwxMCBAQAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCB1c3JkYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJdXNlcl9kZXN0cm95KGtleSwgdXNyZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBzZW5zX3JlYWQoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApCkBAIC0xNDYxLDQ3ICsxNDYwLDQzIEBACiAJX19sZTMyIGJ1ZlsyXTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCWxldmRhdHVtID0ga3phbGxvYyhzaXplb2YoKmxldmRhdHVtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFsZXZkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWxldmRhdHVtKQorCQlnb3RvIGJhZDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWxldmRhdHVtLT5pc2FsaWFzID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKKwlyYyA9IC1FTk9NRU07CiAJbGV2ZGF0dW0tPmxldmVsID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1sc19sZXZlbCksIEdGUF9BVE9NSUMpOwotCWlmICghbGV2ZGF0dW0tPmxldmVsKSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWxldmRhdHVtLT5sZXZlbCkKIAkJZ290byBiYWQ7Ci0JfQotCWlmIChtbHNfcmVhZF9sZXZlbChsZXZkYXR1bS0+bGV2ZWwsIGZwKSkgewotCQlyYyA9IC1FSU5WQUw7CisKKwlyYyA9IG1sc19yZWFkX2xldmVsKGxldmRhdHVtLT5sZXZlbCwgZnApOworCWlmIChyYykKIAkJZ290byBiYWQ7Ci0JfQogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGxldmRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZDoKIAlzZW5zX2Rlc3Ryb3koa2V5LCBsZXZkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNhdF9yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKQpAQCAtMTUxMiwzOSArMTUwNywzNSBAQAogCV9fbGUzMiBidWZbM107CiAJdTMyIGxlbjsKIAorCXJjID0gLUVOT01FTTsKIAljYXRkYXR1bSA9IGt6YWxsb2Moc2l6ZW9mKCpjYXRkYXR1bSksIEdGUF9BVE9NSUMpOwotCWlmICghY2F0ZGF0dW0pIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFjYXRkYXR1bSkKKwkJZ290byBiYWQ7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAljYXRkYXR1bS0+dmFsdWUgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCWNhdGRhdHVtLT5pc2FsaWFzID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9BVE9NSUMpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgY2F0ZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotCisJcmV0dXJuIDA7CiBiYWQ6CiAJY2F0X2Rlc3Ryb3koa2V5LCBjYXRkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50ICgqcmVhZF9mW1NZTV9OVU1dKSAoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApID0KQEAgLTE1ODUsOSArMTU3Niw5IEBACiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiU0VMaW51eDogYm91bmRhcnkgdmlvbGF0ZWQgcG9saWN5OiAiCiAJCQkgICAgICAgInVzZXI9JXMgcm9sZT0lcyBib3VuZHM9JXNcbiIsCi0JCQkgICAgICAgcC0+cF91c2VyX3ZhbF90b19uYW1lW3VzZXItPnZhbHVlIC0gMV0sCi0JCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW2JpdF0sCi0JCQkgICAgICAgcC0+cF91c2VyX3ZhbF90b19uYW1lW3VwcGVyLT52YWx1ZSAtIDFdKTsKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVVNFUlMsIHVzZXItPnZhbHVlIC0gMSksCisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1JPTEVTLCBiaXQpLAorCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9VU0VSUywgdXBwZXItPnZhbHVlIC0gMSkpOwogCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTYyMiw5ICsxNjEzLDkgQEAKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJTRUxpbnV4OiBib3VuZGFyeSB2aW9sYXRlZCBwb2xpY3k6ICIKIAkJCSAgICAgICAicm9sZT0lcyB0eXBlPSVzIGJvdW5kcz0lc1xuIiwKLQkJCSAgICAgICBwLT5wX3JvbGVfdmFsX3RvX25hbWVbcm9sZS0+dmFsdWUgLSAxXSwKLQkJCSAgICAgICBwLT5wX3R5cGVfdmFsX3RvX25hbWVbYml0XSwKLQkJCSAgICAgICBwLT5wX3JvbGVfdmFsX3RvX25hbWVbdXBwZXItPnZhbHVlIC0gMV0pOworCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9ST0xFUywgcm9sZS0+dmFsdWUgLSAxKSwKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVFlQRVMsIGJpdCksCisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1JPTEVTLCB1cHBlci0+dmFsdWUgLSAxKSk7CiAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xNjQ4LDEyICsxNjM5LDE1IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCXVwcGVyID0gcC0+dHlwZV92YWxfdG9fc3RydWN0W3VwcGVyLT5ib3VuZHMgLSAxXTsKKwkJdXBwZXIgPSBmbGV4X2FycmF5X2dldF9wdHIocC0+dHlwZV92YWxfdG9fc3RydWN0X2FycmF5LAorCQkJCQkgICB1cHBlci0+Ym91bmRzIC0gMSk7CisJCUJVR19PTighdXBwZXIpOworCiAJCWlmICh1cHBlci0+YXR0cmlidXRlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IHR5cGUgJXM6ICIKIAkJCSAgICAgICAiYm91bmRlZCBieSBhdHRyaWJ1dGUgJXMiLAogCQkJICAgICAgIChjaGFyICopIGtleSwKLQkJCSAgICAgICBwLT5wX3R5cGVfdmFsX3RvX25hbWVbdXBwZXItPnZhbHVlIC0gMV0pOworCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9UWVBFUywgdXBwZXItPnZhbHVlIC0gMSkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0yMDY2LDEzICsyMDYwLDE0IEBACiAKIAlyYyA9IHBvbGljeWRiX2luaXQocCk7CiAJaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJjOwogCiAJLyogUmVhZCB0aGUgbWFnaWMgbnVtYmVyIGFuZCBzdHJpbmcgbGVuZ3RoLiAqLwogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSAqIDIpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAorCXJjID0gLUVJTlZBTDsKIAlpZiAobGUzMl90b19jcHUoYnVmWzBdKSAhPSBQT0xJQ1lEQl9NQUdJQykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiBtYWdpYyBudW1iZXIgMHgleCBkb2VzICIKIAkJICAgICAgICJub3QgbWF0Y2ggZXhwZWN0ZWQgbWFnaWMgbnVtYmVyIDB4JXhcbiIsCkBAIC0yMDgwLDYgKzIwNzUsNyBAQAogCQlnb3RvIGJhZDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAlpZiAobGVuICE9IHN0cmxlbihQT0xJQ1lEQl9TVFJJTkcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHBvbGljeWRiIHN0cmluZyBsZW5ndGggJWQgZG9lcyBub3QgIgpAQCAtMjA4NywxOSArMjA4MywyMyBAQAogCQkgICAgICAgbGVuLCBzdHJsZW4oUE9MSUNZREJfU1RSSU5HKSk7CiAJCWdvdG8gYmFkOwogCX0KKworCXJjID0gLUVOT01FTTsKIAlwb2xpY3lkYl9zdHIgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwogCWlmICghcG9saWN5ZGJfc3RyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvbGljeWRiICIKIAkJICAgICAgICJzdHJpbmcgb2YgbGVuZ3RoICVkXG4iLCBsZW4pOwotCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gYmFkOwogCX0KKwogCXJjID0gbmV4dF9lbnRyeShwb2xpY3lkYl9zdHIsIGZwLCBsZW4pOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdHJ1bmNhdGVkIHBvbGljeWRiIHN0cmluZyBpZGVudGlmaWVyXG4iKTsKIAkJa2ZyZWUocG9saWN5ZGJfc3RyKTsKIAkJZ290byBiYWQ7CiAJfQorCisJcmMgPSAtRUlOVkFMOwogCXBvbGljeWRiX3N0cltsZW5dID0gJ1wwJzsKIAlpZiAoc3RyY21wKHBvbGljeWRiX3N0ciwgUE9MSUNZREJfU1RSSU5HKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiBzdHJpbmcgJXMgZG9lcyBub3QgbWF0Y2ggIgpAQCAtMjExMyw5ICsyMTEzLDEwIEBACiAKIAkvKiBSZWFkIHRoZSB2ZXJzaW9uIGFuZCB0YWJsZSBzaXplcy4gKi8KIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikqNCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCisJcmMgPSAtRUlOVkFMOwogCXAtPnBvbGljeXZlcnMgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWlmIChwLT5wb2xpY3l2ZXJzIDwgUE9MSUNZREJfVkVSU0lPTl9NSU4gfHwKIAkgICAgcC0+cG9saWN5dmVycyA+IFBPTElDWURCX1ZFUlNJT05fTUFYKSB7CkBAIC0yMTI4LDYgKzIxMjksNyBAQAogCWlmICgobGUzMl90b19jcHUoYnVmWzFdKSAmIFBPTElDWURCX0NPTkZJR19NTFMpKSB7CiAJCXAtPm1sc19lbmFibGVkID0gMTsKIAorCQlyYyA9IC1FSU5WQUw7CiAJCWlmIChwLT5wb2xpY3l2ZXJzIDwgUE9MSUNZREJfVkVSU0lPTl9NTFMpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogc2VjdXJpdHkgcG9saWN5ZGIgdmVyc2lvbiAlZCAiCiAJCQkJIihNTFMpIG5vdCBiYWNrd2FyZHMgY29tcGF0aWJsZVxuIiwKQEAgLTIxMzgsMTQgKzIxNDAsMTkgQEAKIAlwLT5yZWplY3RfdW5rbm93biA9ICEhKGxlMzJfdG9fY3B1KGJ1ZlsxXSkgJiBSRUpFQ1RfVU5LTk9XTik7CiAJcC0+YWxsb3dfdW5rbm93biA9ICEhKGxlMzJfdG9fY3B1KGJ1ZlsxXSkgJiBBTExPV19VTktOT1dOKTsKIAotCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUE9MQ0FQICYmCi0JICAgIGViaXRtYXBfcmVhZCgmcC0+cG9saWN5Y2FwcywgZnApICE9IDApCi0JCWdvdG8gYmFkOworCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUE9MQ0FQKSB7CisJCXJjID0gZWJpdG1hcF9yZWFkKCZwLT5wb2xpY3ljYXBzLCBmcCk7CisJCWlmIChyYykKKwkJCWdvdG8gYmFkOworCX0KIAotCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUEVSTUlTU0lWRSAmJgotCSAgICBlYml0bWFwX3JlYWQoJnAtPnBlcm1pc3NpdmVfbWFwLCBmcCkgIT0gMCkKLQkJZ290byBiYWQ7CisJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9QRVJNSVNTSVZFKSB7CisJCXJjID0gZWJpdG1hcF9yZWFkKCZwLT5wZXJtaXNzaXZlX21hcCwgZnApOworCQlpZiAocmMpCisJCQlnb3RvIGJhZDsKKwl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJaW5mbyA9IHBvbGljeWRiX2xvb2t1cF9jb21wYXQocC0+cG9saWN5dmVycyk7CiAJaWYgKCFpbmZvKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBmaW5kIHBvbGljeSBjb21wYXQgaW5mbyAiCkBAIC0yMTUzLDYgKzIxNjAsNyBAQAogCQlnb3RvIGJhZDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJaWYgKGxlMzJfdG9fY3B1KGJ1ZlsyXSkgIT0gaW5mby0+c3ltX251bSB8fAogCQlsZTMyX3RvX2NwdShidWZbM10pICE9IGluZm8tPm9jb25fbnVtKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHBvbGljeWRiIHRhYmxlIHNpemVzICglZCwlZCkgZG8gIgpAQCAtMjE2NCw3ICsyMTcyLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zeW1fbnVtOyBpKyspIHsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKIAkJbnByaW0gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQluZWwgPSBsZTMyX3RvX2NwdShidWZbMV0pOwpAQCAtMjE4OCw3OCArMjE5Niw3MyBAQAogCX0KIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJbHRyID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgbmVsOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOwogCQl0ciA9IGt6YWxsb2Moc2l6ZW9mKCp0ciksIEdGUF9LRVJORUwpOwotCQlpZiAoIXRyKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghdHIpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlpZiAobHRyKQogCQkJbHRyLT5uZXh0ID0gdHI7CiAJCWVsc2UKIAkJCXAtPnJvbGVfdHIgPSB0cjsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjMpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKKworCQlyYyA9IC1FSU5WQUw7CiAJCXRyLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJdHItPnR5cGUgPSBsZTMyX3RvX2NwdShidWZbMV0pOwogCQl0ci0+bmV3X3JvbGUgPSBsZTMyX3RvX2NwdShidWZbMl0pOwogCQlpZiAoIXBvbGljeWRiX3JvbGVfaXN2YWxpZChwLCB0ci0+cm9sZSkgfHwKIAkJICAgICFwb2xpY3lkYl90eXBlX2lzdmFsaWQocCwgdHItPnR5cGUpIHx8Ci0JCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHRyLT5uZXdfcm9sZSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJICAgICFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgdHItPm5ld19yb2xlKSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCWx0ciA9IHRyOwogCX0KIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCW5lbCA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJbHJhID0gTlVMTDsKIAlmb3IgKGkgPSAwOyBpIDwgbmVsOyBpKyspIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlyYSA9IGt6YWxsb2Moc2l6ZW9mKCpyYSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXJhKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghcmEpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlpZiAobHJhKQogCQkJbHJhLT5uZXh0ID0gcmE7CiAJCWVsc2UKIAkJCXAtPnJvbGVfYWxsb3cgPSByYTsKIAkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKKworCQlyYyA9IC1FSU5WQUw7CiAJCXJhLT5yb2xlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJcmEtPm5ld19yb2xlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAkJaWYgKCFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgcmEtPnJvbGUpIHx8Ci0JCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHJhLT5uZXdfcm9sZSkpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJICAgICFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgcmEtPm5ld19yb2xlKSkKIAkJCWdvdG8gYmFkOwotCQl9CiAJCWxyYSA9IHJhOwogCX0KIAotCXJjID0gcG9saWN5ZGJfaW5kZXhfY2xhc3NlcyhwKTsKKwlyYyA9IHBvbGljeWRiX2luZGV4KHApOwogCWlmIChyYykKIAkJZ290byBiYWQ7CiAKLQlyYyA9IHBvbGljeWRiX2luZGV4X290aGVycyhwKTsKLQlpZiAocmMpCi0JCWdvdG8gYmFkOwotCisJcmMgPSAtRUlOVkFMOwogCXAtPnByb2Nlc3NfY2xhc3MgPSBzdHJpbmdfdG9fc2VjdXJpdHlfY2xhc3MocCwgInByb2Nlc3MiKTsKIAlpZiAoIXAtPnByb2Nlc3NfY2xhc3MpCiAJCWdvdG8gYmFkOwotCXAtPnByb2Nlc3NfdHJhbnNfcGVybXMgPSBzdHJpbmdfdG9fYXZfcGVybShwLCBwLT5wcm9jZXNzX2NsYXNzLAotCQkJCQkJICAgInRyYW5zaXRpb24iKTsKLQlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zIHw9IHN0cmluZ190b19hdl9wZXJtKHAsIHAtPnByb2Nlc3NfY2xhc3MsCi0JCQkJCQkgICAgImR5bnRyYW5zaXRpb24iKTsKKworCXJjID0gLUVJTlZBTDsKKwlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zID0gc3RyaW5nX3RvX2F2X3Blcm0ocCwgcC0+cHJvY2Vzc19jbGFzcywgInRyYW5zaXRpb24iKTsKKwlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zIHw9IHN0cmluZ190b19hdl9wZXJtKHAsIHAtPnByb2Nlc3NfY2xhc3MsICJkeW50cmFuc2l0aW9uIik7CiAJaWYgKCFwLT5wcm9jZXNzX3RyYW5zX3Blcm1zKQogCQlnb3RvIGJhZDsKIApAQCAtMjMxMiw4ICsyMzE1LDYgQEAKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6Ci0JaWYgKCFyYykKLQkJcmMgPSAtRUlOVkFMOwogCXBvbGljeWRiX2Rlc3Ryb3kocCk7CiAJZ290byBvdXQ7CiB9CkBAIC0zMDc2LDcgKzMwNzcsNyBAQAogCWlmICghaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGNvbXBhdGliaWxpdHkgbG9va3VwIGZhaWxlZCBmb3IgcG9saWN5ICIKIAkJICAgICJ2ZXJzaW9uICVkIiwgcC0+cG9saWN5dmVycyk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVmWzBdID0gY3B1X3RvX2xlMzIocC0+cG9saWN5dmVycyk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKaW5kZXggOTVkM2Q3ZC4uNGUzYWI5ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaApAQCAtMjAzLDIxICsyMDMsMTMgQEAKICNkZWZpbmUgcF9jYXRzIHN5bXRhYltTWU1fQ0FUU10KIAogCS8qIHN5bWJvbCBuYW1lcyBpbmRleGVkIGJ5ICh2YWx1ZSAtIDEpICovCi0JY2hhciAqKnN5bV92YWxfdG9fbmFtZVtTWU1fTlVNXTsKLSNkZWZpbmUgcF9jb21tb25fdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9DT01NT05TXQotI2RlZmluZSBwX2NsYXNzX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQ0xBU1NFU10KLSNkZWZpbmUgcF9yb2xlX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fUk9MRVNdCi0jZGVmaW5lIHBfdHlwZV92YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX1RZUEVTXQotI2RlZmluZSBwX3VzZXJfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9VU0VSU10KLSNkZWZpbmUgcF9ib29sX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQk9PTFNdCi0jZGVmaW5lIHBfc2Vuc192YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX0xFVkVMU10KLSNkZWZpbmUgcF9jYXRfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9DQVRTXQorCXN0cnVjdCBmbGV4X2FycmF5ICpzeW1fdmFsX3RvX25hbWVbU1lNX05VTV07CiAKIAkvKiBjbGFzcywgcm9sZSwgYW5kIHVzZXIgYXR0cmlidXRlcyBpbmRleGVkIGJ5ICh2YWx1ZSAtIDEpICovCiAJc3RydWN0IGNsYXNzX2RhdHVtICoqY2xhc3NfdmFsX3RvX3N0cnVjdDsKIAlzdHJ1Y3Qgcm9sZV9kYXR1bSAqKnJvbGVfdmFsX3RvX3N0cnVjdDsKIAlzdHJ1Y3QgdXNlcl9kYXR1bSAqKnVzZXJfdmFsX3RvX3N0cnVjdDsKLQlzdHJ1Y3QgdHlwZV9kYXR1bSAqKnR5cGVfdmFsX3RvX3N0cnVjdDsKKwlzdHJ1Y3QgZmxleF9hcnJheSAqdHlwZV92YWxfdG9fc3RydWN0X2FycmF5OwogCiAJLyogdHlwZSBlbmZvcmNlbWVudCBhY2Nlc3MgdmVjdG9ycyBhbmQgdHJhbnNpdGlvbnMgKi8KIAlzdHJ1Y3QgYXZ0YWIgdGVfYXZ0YWI7CkBAIC0zMjEsNiArMzEzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgY2hhciAqc3ltX25hbWUoc3RydWN0IHBvbGljeWRiICpwLCB1bnNpZ25lZCBpbnQgc3ltX251bSwgdW5zaWduZWQgaW50IGVsZW1lbnRfbnIpCit7CisJc3RydWN0IGZsZXhfYXJyYXkgKmZhID0gcC0+c3ltX3ZhbF90b19uYW1lW3N5bV9udW1dOworCisJcmV0dXJuIGZsZXhfYXJyYXlfZ2V0X3B0cihmYSwgZWxlbWVudF9ucik7Cit9CisKIGV4dGVybiB1MTYgc3RyaW5nX3RvX3NlY3VyaXR5X2NsYXNzKHN0cnVjdCBwb2xpY3lkYiAqcCwgY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gdTMyIHN0cmluZ190b19hdl9wZXJtKHN0cnVjdCBwb2xpY3lkYiAqcCwgdTE2IHRjbGFzcywgY29uc3QgY2hhciAqbmFtZSk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwppbmRleCAyMjNjMWZmLi5hMDNjZmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCkBAIC00NjQsNyArNDY0LDcgQEAKIAlpZiAoIXBlcm1pc3Npb25zKQogCQlyZXR1cm47CiAKLQl0Y2xhc3NfbmFtZSA9IHBvbGljeWRiLnBfY2xhc3NfdmFsX3RvX25hbWVbdGNsYXNzIC0gMV07CisJdGNsYXNzX25hbWUgPSBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DTEFTU0VTLCB0Y2xhc3MgLSAxKTsKIAl0Y2xhc3NfZGF0ID0gcG9saWN5ZGIuY2xhc3NfdmFsX3RvX3N0cnVjdFt0Y2xhc3MgLSAxXTsKIAljb21tb25fZGF0ID0gdGNsYXNzX2RhdC0+Y29tZGF0dW07CiAKQEAgLTUzMCwxMiArNTMwLDE4IEBACiAJc3RydWN0IGNvbnRleHQgbG9fc2NvbnRleHQ7CiAJc3RydWN0IGNvbnRleHQgbG9fdGNvbnRleHQ7CiAJc3RydWN0IGF2X2RlY2lzaW9uIGxvX2F2ZDsKLQlzdHJ1Y3QgdHlwZV9kYXR1bSAqc291cmNlCi0JCT0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W3Njb250ZXh0LT50eXBlIC0gMV07Ci0Jc3RydWN0IHR5cGVfZGF0dW0gKnRhcmdldAotCQk9IHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdFt0Y29udGV4dC0+dHlwZSAtIDFdOworCXN0cnVjdCB0eXBlX2RhdHVtICpzb3VyY2U7CisJc3RydWN0IHR5cGVfZGF0dW0gKnRhcmdldDsKIAl1MzIgbWFza2VkID0gMDsKIAorCXNvdXJjZSA9IGZsZXhfYXJyYXlfZ2V0X3B0cihwb2xpY3lkYi50eXBlX3ZhbF90b19zdHJ1Y3RfYXJyYXksCisJCQkJICAgIHNjb250ZXh0LT50eXBlIC0gMSk7CisJQlVHX09OKCFzb3VyY2UpOworCisJdGFyZ2V0ID0gZmxleF9hcnJheV9nZXRfcHRyKHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwKKwkJCQkgICAgdGNvbnRleHQtPnR5cGUgLSAxKTsKKwlCVUdfT04oIXRhcmdldCk7CisKIAlpZiAoc291cmNlLT5ib3VuZHMpIHsKIAkJbWVtc2V0KCZsb19hdmQsIDAsIHNpemVvZihsb19hdmQpKTsKIApAQCAtNzAxLDE2ICs3MDcsMTYgQEAKIAljaGFyICpvID0gTlVMTCwgKm4gPSBOVUxMLCAqdCA9IE5VTEw7CiAJdTMyIG9sZW4sIG5sZW4sIHRsZW47CiAKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG9jb250ZXh0LCAmbywgJm9sZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG9jb250ZXh0LCAmbywgJm9sZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG5jb250ZXh0LCAmbiwgJm5sZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG5jb250ZXh0LCAmbiwgJm5sZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pKQogCQlnb3RvIG91dDsKIAlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0FUT01JQywgQVVESVRfU0VMSU5VWF9FUlIsCiAJCSAgInNlY3VyaXR5X3ZhbGlkYXRlX3RyYW5zaXRpb246ICBkZW5pZWQgZm9yIgogCQkgICIgb2xkY29udGV4dD0lcyBuZXdjb250ZXh0PSVzIHRhc2tjb250ZXh0PSVzIHRjbGFzcz0lcyIsCi0JCSAgbywgbiwgdCwgcG9saWN5ZGIucF9jbGFzc192YWxfdG9fbmFtZVt0Y2xhc3MtMV0pOworCQkgIG8sIG4sIHQsIHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NMQVNTRVMsIHRjbGFzcy0xKSk7CiBvdXQ6CiAJa2ZyZWUobyk7CiAJa2ZyZWUobik7CkBAIC04MDEsMTAgKzgwNywxMSBAQAogCXN0cnVjdCBjb250ZXh0ICpvbGRfY29udGV4dCwgKm5ld19jb250ZXh0OwogCXN0cnVjdCB0eXBlX2RhdHVtICp0eXBlOwogCWludCBpbmRleDsKLQlpbnQgcmMgPSAtRUlOVkFMOworCWludCByYzsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FSU5WQUw7CiAJb2xkX2NvbnRleHQgPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIG9sZF9zaWQpOwogCWlmICghb2xkX2NvbnRleHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogdW5yZWNvZ25pemVkIFNJRCAldVxuIiwKQEAgLTgxMiw2ICs4MTksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJbmV3X2NvbnRleHQgPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIG5ld19zaWQpOwogCWlmICghbmV3X2NvbnRleHQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogdW5yZWNvZ25pemVkIFNJRCAldVxuIiwKQEAgLTgxOSwyOCArODI3LDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXJjID0gMDsKIAkvKiB0eXBlL2RvbWFpbiB1bmNoYW5nZWQgKi8KLQlpZiAob2xkX2NvbnRleHQtPnR5cGUgPT0gbmV3X2NvbnRleHQtPnR5cGUpIHsKLQkJcmMgPSAwOworCWlmIChvbGRfY29udGV4dC0+dHlwZSA9PSBuZXdfY29udGV4dC0+dHlwZSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJaW5kZXggPSBuZXdfY29udGV4dC0+dHlwZTsKIAl3aGlsZSAodHJ1ZSkgewotCQl0eXBlID0gcG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0W2luZGV4IC0gMV07CisJCXR5cGUgPSBmbGV4X2FycmF5X2dldF9wdHIocG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0X2FycmF5LAorCQkJCQkgIGluZGV4IC0gMSk7CiAJCUJVR19PTighdHlwZSk7CiAKIAkJLyogbm90IGJvdW5kZWQgYW55bW9yZSAqLwotCQlpZiAoIXR5cGUtPmJvdW5kcykgewotCQkJcmMgPSAtRVBFUk07CisJCXJjID0gLUVQRVJNOworCQlpZiAoIXR5cGUtPmJvdW5kcykKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogQG5ld3NpZCBpcyBib3VuZGVkIGJ5IEBvbGRzaWQgKi8KLQkJaWYgKHR5cGUtPmJvdW5kcyA9PSBvbGRfY29udGV4dC0+dHlwZSkgewotCQkJcmMgPSAwOworCQlyYyA9IDA7CisJCWlmICh0eXBlLT5ib3VuZHMgPT0gb2xkX2NvbnRleHQtPnR5cGUpCiAJCQlicmVhazsKLQkJfQorCiAJCWluZGV4ID0gdHlwZS0+Ym91bmRzOwogCX0KIApAQCAtMTAwNSw5ICsxMDEyLDkgQEAKIAl9CiAKIAkvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBjb250ZXh0LiAqLwotCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfdXNlcl92YWxfdG9fbmFtZVtjb250ZXh0LT51c2VyIC0gMV0pICsgMTsKLQkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX3JvbGVfdmFsX3RvX25hbWVbY29udGV4dC0+cm9sZSAtIDFdKSArIDE7Ci0JKnNjb250ZXh0X2xlbiArPSBzdHJsZW4ocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2NvbnRleHQtPnR5cGUgLSAxXSkgKyAxOworCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1VTRVJTLCBjb250ZXh0LT51c2VyIC0gMSkpICsgMTsKKwkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9ST0xFUywgY29udGV4dC0+cm9sZSAtIDEpKSArIDE7CisJKnNjb250ZXh0X2xlbiArPSBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVFlQRVMsIGNvbnRleHQtPnR5cGUgLSAxKSkgKyAxOwogCSpzY29udGV4dF9sZW4gKz0gbWxzX2NvbXB1dGVfY29udGV4dF9sZW4oY29udGV4dCk7CiAKIAlpZiAoIXNjb250ZXh0KQpAQCAtMTAyMywxMiArMTAzMCwxMiBAQAogCSAqIENvcHkgdGhlIHVzZXIgbmFtZSwgcm9sZSBuYW1lIGFuZCB0eXBlIG5hbWUgaW50byB0aGUgY29udGV4dC4KIAkgKi8KIAlzcHJpbnRmKHNjb250ZXh0cCwgIiVzOiVzOiVzIiwKLQkJcG9saWN5ZGIucF91c2VyX3ZhbF90b19uYW1lW2NvbnRleHQtPnVzZXIgLSAxXSwKLQkJcG9saWN5ZGIucF9yb2xlX3ZhbF90b19uYW1lW2NvbnRleHQtPnJvbGUgLSAxXSwKLQkJcG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2NvbnRleHQtPnR5cGUgLSAxXSk7Ci0Jc2NvbnRleHRwICs9IHN0cmxlbihwb2xpY3lkYi5wX3VzZXJfdmFsX3RvX25hbWVbY29udGV4dC0+dXNlciAtIDFdKSArCi0JCSAgICAgMSArIHN0cmxlbihwb2xpY3lkYi5wX3JvbGVfdmFsX3RvX25hbWVbY29udGV4dC0+cm9sZSAtIDFdKSArCi0JCSAgICAgMSArIHN0cmxlbihwb2xpY3lkYi5wX3R5cGVfdmFsX3RvX25hbWVbY29udGV4dC0+dHlwZSAtIDFdKTsKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVVNFUlMsIGNvbnRleHQtPnVzZXIgLSAxKSwKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fUk9MRVMsIGNvbnRleHQtPnJvbGUgLSAxKSwKKwkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVFlQRVMsIGNvbnRleHQtPnR5cGUgLSAxKSk7CisJc2NvbnRleHRwICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9VU0VSUywgY29udGV4dC0+dXNlciAtIDEpKSArCisJCSAgICAgMSArIHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9ST0xFUywgY29udGV4dC0+cm9sZSAtIDEpKSArCisJCSAgICAgMSArIHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9UWVBFUywgY29udGV4dC0+dHlwZSAtIDEpKTsKIAogCW1sc19zaWRfdG9fY29udGV4dChjb250ZXh0LCAmc2NvbnRleHRwKTsKIApAQCAtMTE4NywxNiArMTE5NCwxMyBAQAogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlpZiAoKHAgLSBzY29udGV4dCkgPCBzY29udGV4dF9sZW4pIHsKLQkJcmMgPSAtRUlOVkFMOworCXJjID0gLUVJTlZBTDsKKwlpZiAoKHAgLSBzY29udGV4dCkgPCBzY29udGV4dF9sZW4pCiAJCWdvdG8gb3V0OwotCX0KIAogCS8qIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgbmV3IGNvbnRleHQuICovCi0JaWYgKCFwb2xpY3lkYl9jb250ZXh0X2lzdmFsaWQocG9sLCBjdHgpKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlpZiAoIXBvbGljeWRiX2NvbnRleHRfaXN2YWxpZChwb2wsIGN0eCkpCiAJCWdvdG8gb3V0OwotCX0KIAlyYyA9IDA7CiBvdXQ6CiAJaWYgKHJjKQpAQCAtMTIzNSwyNyArMTIzOSwyNiBAQAogCiAJaWYgKGZvcmNlKSB7CiAJCS8qIFNhdmUgYW5vdGhlciBjb3B5IGZvciBzdG9yaW5nIGluIHVuaW50ZXJwcmV0ZWQgZm9ybSAqLworCQlyYyA9IC1FTk9NRU07CiAJCXN0ciA9IGtzdHJkdXAoc2NvbnRleHQyLCBnZnBfZmxhZ3MpOwotCQlpZiAoIXN0cikgewotCQkJa2ZyZWUoc2NvbnRleHQyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CisJCWlmICghc3RyKQorCQkJZ290byBvdXQ7CiAJfQogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQlyYyA9IHN0cmluZ190b19jb250ZXh0X3N0cnVjdCgmcG9saWN5ZGIsICZzaWR0YWIsCi0JCQkJICAgICAgc2NvbnRleHQyLCBzY29udGV4dF9sZW4sCi0JCQkJICAgICAgJmNvbnRleHQsIGRlZl9zaWQpOworCXJjID0gc3RyaW5nX3RvX2NvbnRleHRfc3RydWN0KCZwb2xpY3lkYiwgJnNpZHRhYiwgc2NvbnRleHQyLAorCQkJCSAgICAgIHNjb250ZXh0X2xlbiwgJmNvbnRleHQsIGRlZl9zaWQpOwogCWlmIChyYyA9PSAtRUlOVkFMICYmIGZvcmNlKSB7CiAJCWNvbnRleHQuc3RyID0gc3RyOwogCQljb250ZXh0LmxlbiA9IHNjb250ZXh0X2xlbjsKIAkJc3RyID0gTlVMTDsKIAl9IGVsc2UgaWYgKHJjKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsICZjb250ZXh0LCBzaWQpOwogCWNvbnRleHRfZGVzdHJveSgmY29udGV4dCk7Ci1vdXQ6CitvdXRfdW5sb2NrOgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKK291dDoKIAlrZnJlZShzY29udGV4dDIpOwogCWtmcmVlKHN0cik7CiAJcmV0dXJuIHJjOwpAQCAtMTMxOSwxOCArMTMyMiwxOCBAQAogCWNoYXIgKnMgPSBOVUxMLCAqdCA9IE5VTEwsICpuID0gTlVMTDsKIAl1MzIgc2xlbiwgdGxlbiwgbmxlbjsKIAotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoc2NvbnRleHQsICZzLCAmc2xlbikgPCAwKQorCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoc2NvbnRleHQsICZzLCAmc2xlbikpCiAJCWdvdG8gb3V0OwotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcodGNvbnRleHQsICZ0LCAmdGxlbikgPCAwKQorCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcodGNvbnRleHQsICZ0LCAmdGxlbikpCiAJCWdvdG8gb3V0OwotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcobmV3Y29udGV4dCwgJm4sICZubGVuKSA8IDApCisJaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhuZXdjb250ZXh0LCAmbiwgJm5sZW4pKQogCQlnb3RvIG91dDsKIAlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0FUT01JQywgQVVESVRfU0VMSU5VWF9FUlIsCiAJCSAgInNlY3VyaXR5X2NvbXB1dGVfc2lkOiAgaW52YWxpZCBjb250ZXh0ICVzIgogCQkgICIgZm9yIHNjb250ZXh0PSVzIgogCQkgICIgdGNvbnRleHQ9JXMiCiAJCSAgIiB0Y2xhc3M9JXMiLAotCQkgIG4sIHMsIHQsIHBvbGljeWRiLnBfY2xhc3NfdmFsX3RvX25hbWVbdGNsYXNzLTFdKTsKKwkJICBuLCBzLCB0LCBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DTEFTU0VTLCB0Y2xhc3MtMSkpOwogb3V0OgogCWtmcmVlKHMpOwogCWtmcmVlKHQpOwpAQCAtMTU2OSwyMiArMTU3MiwxNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjb252ZXJ0X2NvbnRleHRfaGFuZGxlX2ludmFsaWRfY29udGV4dChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCkKIHsKLQlpbnQgcmMgPSAwOworCWNoYXIgKnM7CisJdTMyIGxlbjsKIAotCWlmIChzZWxpbnV4X2VuZm9yY2luZykgewotCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIHsKLQkJY2hhciAqczsKLQkJdTMyIGxlbjsKKwlpZiAoc2VsaW51eF9lbmZvcmNpbmcpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICghY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKGNvbnRleHQsICZzLCAmbGVuKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlNFTGludXg6ICBDb250ZXh0ICVzIHdvdWxkIGJlIGludmFsaWQgaWYgZW5mb3JjaW5nXG4iLAotCQkJICAgICAgIHMpOwotCQkJa2ZyZWUocyk7Ci0JCX0KKwlpZiAoIWNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhjb250ZXh0LCAmcywgJmxlbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0VMaW51eDogIENvbnRleHQgJXMgd291bGQgYmUgaW52YWxpZCBpZiBlbmZvcmNpbmdcbiIsIHMpOworCQlrZnJlZShzKTsKIAl9Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdHJ1Y3QgY29udmVydF9jb250ZXh0X2FyZ3MgewpAQCAtMTYyMSwxNyArMTYxOSwxNyBAQAogCiAJaWYgKGMtPnN0cikgewogCQlzdHJ1Y3QgY29udGV4dCBjdHg7CisKKwkJcmMgPSAtRU5PTUVNOwogCQlzID0ga3N0cmR1cChjLT5zdHIsIEdGUF9LRVJORUwpOwotCQlpZiAoIXMpIHsKLQkJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFzKQogCQkJZ290byBvdXQ7Ci0JCX0KKwogCQlyYyA9IHN0cmluZ190b19jb250ZXh0X3N0cnVjdChhcmdzLT5uZXdwLCBOVUxMLCBzLAogCQkJCQkgICAgICBjLT5sZW4sICZjdHgsIFNFQ1NJRF9OVUxMKTsKIAkJa2ZyZWUocyk7CiAJCWlmICghcmMpIHsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJTRUxpbnV4OiAgQ29udGV4dCAlcyBiZWNhbWUgdmFsaWQgKG1hcHBlZCkuXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiU0VMaW51eDogIENvbnRleHQgJXMgYmVjYW1lIHZhbGlkIChtYXBwZWQpLlxuIiwKIAkJCSAgICAgICBjLT5zdHIpOwogCQkJLyogUmVwbGFjZSBzdHJpbmcgd2l0aCBtYXBwZWQgcmVwcmVzZW50YXRpb24uICovCiAJCQlrZnJlZShjLT5zdHIpOwpAQCAtMTY0Myw4ICsxNjQxLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewogCQkJLyogT3RoZXIgZXJyb3IgY29uZGl0aW9uLCBlLmcuIEVOT01FTS4gKi8KLQkJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlNFTGludXg6ICAgVW5hYmxlIHRvIG1hcCBjb250ZXh0ICVzLCByYyA9ICVkLlxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogICBVbmFibGUgdG8gbWFwIGNvbnRleHQgJXMsIHJjID0gJWQuXG4iLAogCQkJICAgICAgIGMtPnN0ciwgLXJjKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNjU0LDI1ICsxNjUxLDI2IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIAotCXJjID0gLUVJTlZBTDsKLQogCS8qIENvbnZlcnQgdGhlIHVzZXIuICovCisJcmMgPSAtRUlOVkFMOwogCXVzcmRhdHVtID0gaGFzaHRhYl9zZWFyY2goYXJncy0+bmV3cC0+cF91c2Vycy50YWJsZSwKLQkJCQkgIGFyZ3MtPm9sZHAtPnBfdXNlcl92YWxfdG9fbmFtZVtjLT51c2VyIC0gMV0pOworCQkJCSAgc3ltX25hbWUoYXJncy0+b2xkcCwgU1lNX1VTRVJTLCBjLT51c2VyIC0gMSkpOwogCWlmICghdXNyZGF0dW0pCiAJCWdvdG8gYmFkOwogCWMtPnVzZXIgPSB1c3JkYXR1bS0+dmFsdWU7CiAKIAkvKiBDb252ZXJ0IHRoZSByb2xlLiAqLworCXJjID0gLUVJTlZBTDsKIAlyb2xlID0gaGFzaHRhYl9zZWFyY2goYXJncy0+bmV3cC0+cF9yb2xlcy50YWJsZSwKLQkJCSAgICAgIGFyZ3MtPm9sZHAtPnBfcm9sZV92YWxfdG9fbmFtZVtjLT5yb2xlIC0gMV0pOworCQkJICAgICAgc3ltX25hbWUoYXJncy0+b2xkcCwgU1lNX1JPTEVTLCBjLT5yb2xlIC0gMSkpOwogCWlmICghcm9sZSkKIAkJZ290byBiYWQ7CiAJYy0+cm9sZSA9IHJvbGUtPnZhbHVlOwogCiAJLyogQ29udmVydCB0aGUgdHlwZS4gKi8KKwlyYyA9IC1FSU5WQUw7CiAJdHlwZGF0dW0gPSBoYXNodGFiX3NlYXJjaChhcmdzLT5uZXdwLT5wX3R5cGVzLnRhYmxlLAotCQkJCSAgYXJncy0+b2xkcC0+cF90eXBlX3ZhbF90b19uYW1lW2MtPnR5cGUgLSAxXSk7CisJCQkJICBzeW1fbmFtZShhcmdzLT5vbGRwLCBTWU1fVFlQRVMsIGMtPnR5cGUgLSAxKSk7CiAJaWYgKCF0eXBkYXR1bSkKIAkJZ290byBiYWQ7CiAJYy0+dHlwZSA9IHR5cGRhdHVtLT52YWx1ZTsKQEAgLTE3MDAsNiArMTY5OCw3IEBACiAJCW9jID0gYXJncy0+bmV3cC0+b2NvbnRleHRzW09DT05fSVNJRF07CiAJCXdoaWxlIChvYyAmJiBvYy0+c2lkWzBdICE9IFNFQ0lOSVRTSURfVU5MQUJFTEVEKQogCQkJb2MgPSBvYy0+bmV4dDsKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAoIW9jKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmFibGUgdG8gbG9vayB1cCIKIAkJCQkiIHRoZSBpbml0aWFsIFNJRHMgbGlzdFxuIik7CkBAIC0xNzE5LDE5ICsxNzE4LDIwIEBACiAJfQogCiAJY29udGV4dF9kZXN0cm95KCZvbGRjKTsKKwogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiBiYWQ6CiAJLyogTWFwIG9sZCByZXByZXNlbnRhdGlvbiB0byBzdHJpbmcgYW5kIHNhdmUgaXQuICovCi0JaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZygmb2xkYywgJnMsICZsZW4pKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyYyA9IGNvbnRleHRfc3RydWN0X3RvX3N0cmluZygmb2xkYywgJnMsICZsZW4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCWNvbnRleHRfZGVzdHJveSgmb2xkYyk7CiAJY29udGV4dF9kZXN0cm95KGMpOwogCWMtPnN0ciA9IHM7CiAJYy0+bGVuID0gbGVuOwotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIlNFTGludXg6ICBDb250ZXh0ICVzIGJlY2FtZSBpbnZhbGlkICh1bm1hcHBlZCkuXG4iLAorCXByaW50ayhLRVJOX0lORk8gIlNFTGludXg6ICBDb250ZXh0ICVzIGJlY2FtZSBpbnZhbGlkICh1bm1hcHBlZCkuXG4iLAogCSAgICAgICBjLT5zdHIpOwogCXJjID0gMDsKIAlnb3RvIG91dDsKQEAgLTIwMTIsNyArMjAxMiw3IEBACiAJCSAgICAgIHUzMiBhZGRybGVuLAogCQkgICAgICB1MzIgKm91dF9zaWQpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJc3RydWN0IG9jb250ZXh0ICpjOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKQEAgLTIwMjEsMTAgKzIwMjEsOSBAQAogCWNhc2UgQUZfSU5FVDogewogCQl1MzIgYWRkcjsKIAotCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTMyKSkgewotCQkJcmMgPSAtRUlOVkFMOworCQlyYyA9IC1FSU5WQUw7CisJCWlmIChhZGRybGVuICE9IHNpemVvZih1MzIpKQogCQkJZ290byBvdXQ7Ci0JCX0KIAogCQlhZGRyID0gKigodTMyICopYWRkcnApOwogCkBAIC0yMDM4LDEwICsyMDM3LDkgQEAKIAl9CiAKIAljYXNlIEFGX0lORVQ2OgotCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTY0KSAqIDIpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTY0KSAqIDIpCiAJCQlnb3RvIG91dDsKLQkJfQogCQljID0gcG9saWN5ZGIub2NvbnRleHRzW09DT05fTk9ERTZdOwogCQl3aGlsZSAoYykgewogCQkJaWYgKG1hdGNoX2lwdjZfYWRkcm1hc2soYWRkcnAsIGMtPnUubm9kZTYuYWRkciwKQEAgLTIwNTIsNiArMjA1MCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKKwkJcmMgPSAwOwogCQkqb3V0X3NpZCA9IFNFQ0lOSVRTSURfTk9ERTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjA2OSw2ICsyMDY4LDcgQEAKIAkJKm91dF9zaWQgPSBTRUNJTklUU0lEX05PREU7CiAJfQogCisJcmMgPSAwOwogb3V0OgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAlyZXR1cm4gcmM7CkBAIC0yMTEzLDI0ICsyMTEzLDIyIEBACiAKIAljb250ZXh0X2luaXQoJnVzZXJjb24pOwogCisJcmMgPSAtRUlOVkFMOwogCWZyb21jb24gPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIGZyb21zaWQpOwotCWlmICghZnJvbWNvbikgewotCQlyYyA9IC1FSU5WQUw7CisJaWYgKCFmcm9tY29uKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JfQogCisJcmMgPSAtRUlOVkFMOwogCXVzZXIgPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3VzZXJzLnRhYmxlLCB1c2VybmFtZSk7Ci0JaWYgKCF1c2VyKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlpZiAoIXVzZXIpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CisKIAl1c2VyY29uLnVzZXIgPSB1c2VyLT52YWx1ZTsKIAorCXJjID0gLUVOT01FTTsKIAlteXNpZHMgPSBrY2FsbG9jKG1heG5lbCwgc2l6ZW9mKCpteXNpZHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW15c2lkcykgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFteXNpZHMpCiAJCWdvdG8gb3V0X3VubG9jazsKLQl9CiAKIAllYml0bWFwX2Zvcl9lYWNoX3Bvc2l0aXZlX2JpdCgmdXNlci0+cm9sZXMsIHJub2RlLCBpKSB7CiAJCXJvbGUgPSBwb2xpY3lkYi5yb2xlX3ZhbF90b19zdHJ1Y3RbaV07CkBAIC0yMTQ3LDEyICsyMTQ1LDExIEBACiAJCQlpZiAobXluZWwgPCBtYXhuZWwpIHsKIAkJCQlteXNpZHNbbXluZWwrK10gPSBzaWQ7CiAJCQl9IGVsc2UgeworCQkJCXJjID0gLUVOT01FTTsKIAkJCQltYXhuZWwgKz0gU0lEU19ORUw7CiAJCQkJbXlzaWRzMiA9IGtjYWxsb2MobWF4bmVsLCBzaXplb2YoKm15c2lkczIpLCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAoIW15c2lkczIpIHsKLQkJCQkJcmMgPSAtRU5PTUVNOworCQkJCWlmICghbXlzaWRzMikKIAkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KIAkJCQltZW1jcHkobXlzaWRzMiwgbXlzaWRzLCBteW5lbCAqIHNpemVvZigqbXlzaWRzMikpOwogCQkJCWtmcmVlKG15c2lkcyk7CiAJCQkJbXlzaWRzID0gbXlzaWRzMjsKQEAgLTIxNjAsNyArMjE1Nyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0KKwlyYyA9IDA7CiBvdXRfdW5sb2NrOgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAlpZiAocmMgfHwgIW15bmVsKSB7CkBAIC0yMTY4LDkgKzIxNjUsOSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FTk9NRU07CiAJbXlzaWRzMiA9IGtjYWxsb2MobXluZWwsIHNpemVvZigqbXlzaWRzMiksIEdGUF9LRVJORUwpOwogCWlmICghbXlzaWRzMikgewotCQlyYyA9IC1FTk9NRU07CiAJCWtmcmVlKG15c2lkcyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyMTEsNyArMjIwOCw3IEBACiAJdTE2IHNjbGFzczsKIAlzdHJ1Y3QgZ2VuZnMgKmdlbmZzOwogCXN0cnVjdCBvY29udGV4dCAqYzsKLQlpbnQgcmMgPSAwLCBjbXAgPSAwOworCWludCByYywgY21wID0gMDsKIAogCXdoaWxlIChwYXRoWzBdID09ICcvJyAmJiBwYXRoWzFdID09ICcvJykKIAkJcGF0aCsrOwpAQCAtMjIxOSw2ICsyMjE2LDcgQEAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCiAJc2NsYXNzID0gdW5tYXBfY2xhc3Mob3JpZ19zY2xhc3MpOworCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKIAogCWZvciAoZ2VuZnMgPSBwb2xpY3lkYi5nZW5mczsgZ2VuZnM7IGdlbmZzID0gZ2VuZnMtPm5leHQpIHsKIAkJY21wID0gc3RyY21wKGZzdHlwZSwgZ2VuZnMtPmZzdHlwZSk7CkBAIC0yMjI2LDExICsyMjI0LDkgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmICghZ2VuZnMgfHwgY21wKSB7Ci0JCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKLQkJcmMgPSAtRU5PRU5UOworCXJjID0gLUVOT0VOVDsKKwlpZiAoIWdlbmZzIHx8IGNtcCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJZm9yIChjID0gZ2VuZnMtPmhlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CiAJCWxlbiA9IHN0cmxlbihjLT51Lm5hbWUpOwpAQCAtMjIzOSwyMSArMjIzNSwxOCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKCFjKSB7Ci0JCSpzaWQgPSBTRUNJTklUU0lEX1VOTEFCRUxFRDsKLQkJcmMgPSAtRU5PRU5UOworCXJjID0gLUVOT0VOVDsKKwlpZiAoIWMpCiAJCWdvdG8gb3V0OwotCX0KIAogCWlmICghYy0+c2lkWzBdKSB7Ci0JCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsCi0JCQkJCSAgICZjLT5jb250ZXh0WzBdLAotCQkJCQkgICAmYy0+c2lkWzBdKTsKKwkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJmMtPmNvbnRleHRbMF0sICZjLT5zaWRbMF0pOwogCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAkqc2lkID0gYy0+c2lkWzBdOworCXJjID0gMDsKIG91dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwpAQCAtMjI4NSw4ICsyMjc4LDcgQEAKIAlpZiAoYykgewogCQkqYmVoYXZpb3IgPSBjLT52LmJlaGF2aW9yOwogCQlpZiAoIWMtPnNpZFswXSkgewotCQkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwKLQkJCQkJCSAgICZjLT5jb250ZXh0WzBdLAorCQkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJmMtPmNvbnRleHRbMF0sCiAJCQkJCQkgICAmYy0+c2lkWzBdKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG91dDsKQEAgLTIzMDksMzQgKzIzMDEsMzkgQEAKIAogaW50IHNlY3VyaXR5X2dldF9ib29scyhpbnQgKmxlbiwgY2hhciAqKipuYW1lcywgaW50ICoqdmFsdWVzKQogewotCWludCBpLCByYyA9IC1FTk9NRU07CisJaW50IGksIHJjOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAkqbmFtZXMgPSBOVUxMOwogCSp2YWx1ZXMgPSBOVUxMOwogCisJcmMgPSAwOwogCSpsZW4gPSBwb2xpY3lkYi5wX2Jvb2xzLm5wcmltOwotCWlmICghKmxlbikgewotCQlyYyA9IDA7CisJaWYgKCEqbGVuKQogCQlnb3RvIG91dDsKLQl9CiAKLSAgICAgICAqbmFtZXMgPSBrY2FsbG9jKCpsZW4sIHNpemVvZihjaGFyICopLCBHRlBfQVRPTUlDKTsKKwlyYyA9IC1FTk9NRU07CisJKm5hbWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoY2hhciAqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqbmFtZXMpCiAJCWdvdG8gZXJyOwogCi0gICAgICAgKnZhbHVlcyA9IGtjYWxsb2MoKmxlbiwgc2l6ZW9mKGludCksIEdGUF9BVE9NSUMpOworCXJjID0gLUVOT01FTTsKKwkqdmFsdWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoaW50KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqdmFsdWVzKQogCQlnb3RvIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCAqbGVuOyBpKyspIHsKIAkJc2l6ZV90IG5hbWVfbGVuOworCiAJCSgqdmFsdWVzKVtpXSA9IHBvbGljeWRiLmJvb2xfdmFsX3RvX3N0cnVjdFtpXS0+c3RhdGU7Ci0JCW5hbWVfbGVuID0gc3RybGVuKHBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSkgKyAxOwotCSAgICAgICAoKm5hbWVzKVtpXSA9IGttYWxsb2Moc2l6ZW9mKGNoYXIpICogbmFtZV9sZW4sIEdGUF9BVE9NSUMpOworCQluYW1lX2xlbiA9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9CT09MUywgaSkpICsgMTsKKworCQlyYyA9IC1FTk9NRU07CisJCSgqbmFtZXMpW2ldID0ga21hbGxvYyhzaXplb2YoY2hhcikgKiBuYW1lX2xlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghKCpuYW1lcylbaV0pCiAJCQlnb3RvIGVycjsKLQkJc3RybmNweSgoKm5hbWVzKVtpXSwgcG9saWN5ZGIucF9ib29sX3ZhbF90b19uYW1lW2ldLCBuYW1lX2xlbik7CisKKwkJc3RybmNweSgoKm5hbWVzKVtpXSwgc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQk9PTFMsIGkpLCBuYW1lX2xlbik7CiAJCSgqbmFtZXMpW2ldW25hbWVfbGVuIC0gMV0gPSAwOwogCX0KIAlyYyA9IDA7CkBAIC0yMzU1LDI0ICsyMzUyLDIzIEBACiAKIGludCBzZWN1cml0eV9zZXRfYm9vbHMoaW50IGxlbiwgaW50ICp2YWx1ZXMpCiB7Ci0JaW50IGksIHJjID0gMDsKKwlpbnQgaSwgcmM7CiAJaW50IGxlbnAsIHNlcW5vID0gMDsKIAlzdHJ1Y3QgY29uZF9ub2RlICpjdXI7CiAKIAl3cml0ZV9sb2NrX2lycSgmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FRkFVTFQ7CiAJbGVucCA9IHBvbGljeWRiLnBfYm9vbHMubnByaW07Ci0JaWYgKGxlbiAhPSBsZW5wKSB7Ci0JCXJjID0gLUVGQVVMVDsKKwlpZiAobGVuICE9IGxlbnApCiAJCWdvdG8gb3V0OwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoISF2YWx1ZXNbaV0gIT0gcG9saWN5ZGIuYm9vbF92YWxfdG9fc3RydWN0W2ldLT5zdGF0ZSkgewogCQkJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsCiAJCQkJQVVESVRfTUFDX0NPTkZJR19DSEFOR0UsCiAJCQkJImJvb2w9JXMgdmFsPSVkIG9sZF92YWw9JWQgYXVpZD0ldSBzZXM9JXUiLAotCQkJCXBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSwKKwkJCQlzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9CT09MUywgaSksCiAJCQkJISF2YWx1ZXNbaV0sCiAJCQkJcG9saWN5ZGIuYm9vbF92YWxfdG9fc3RydWN0W2ldLT5zdGF0ZSwKIAkJCQlhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCksCkBAIC0yMzkxLDcgKzIzODcsNyBAQAogCX0KIAogCXNlcW5vID0gKytsYXRlc3RfZ3JhbnRpbmc7Ci0KKwlyYyA9IDA7CiBvdXQ6CiAJd3JpdGVfdW5sb2NrX2lycSgmcG9saWN5X3J3bG9jayk7CiAJaWYgKCFyYykgewpAQCAtMjQwNSwxNiArMjQwMSwxNSBAQAogCiBpbnQgc2VjdXJpdHlfZ2V0X2Jvb2xfdmFsdWUoaW50IGJvb2wpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJaW50IGxlbjsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKKwlyYyA9IC1FRkFVTFQ7CiAJbGVuID0gcG9saWN5ZGIucF9ib29scy5ucHJpbTsKLQlpZiAoYm9vbCA+PSBsZW4pIHsKLQkJcmMgPSAtRUZBVUxUOworCWlmIChib29sID49IGxlbikKIAkJZ290byBvdXQ7Ci0JfQogCiAJcmMgPSBwb2xpY3lkYi5ib29sX3ZhbF90b19zdHJ1Y3RbYm9vbF0tPnN0YXRlOwogb3V0OgpAQCAtMjQ2NCw4ICsyNDU5LDkgQEAKIAlzdHJ1Y3QgY29udGV4dCBuZXdjb247CiAJY2hhciAqczsKIAl1MzIgbGVuOwotCWludCByYyA9IDA7CisJaW50IHJjOwogCisJcmMgPSAwOwogCWlmICghc3NfaW5pdGlhbGl6ZWQgfHwgIXBvbGljeWRiLm1sc19lbmFibGVkKSB7CiAJCSpuZXdfc2lkID0gc2lkOwogCQlnb3RvIG91dDsKQEAgLTI0NzQsMTkgKzI0NzAsMjAgQEAKIAljb250ZXh0X2luaXQoJm5ld2Nvbik7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOworCisJcmMgPSAtRUlOVkFMOwogCWNvbnRleHQxID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwogCWlmICghY29udGV4dDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogIHVucmVjb2duaXplZCBTSUQgJWRcbiIsCiAJCQlfX2Z1bmNfXywgc2lkKTsKLQkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCisJcmMgPSAtRUlOVkFMOwogCWNvbnRleHQyID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBtbHNfc2lkKTsKIAlpZiAoIWNvbnRleHQyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICB1bnJlY29nbml6ZWQgU0lEICVkXG4iLAogCQkJX19mdW5jX18sIG1sc19zaWQpOwotCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKQEAgLTI1MDAsMjAgKzI0OTcsMTcgQEAKIAkvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG5ldyBjb250ZXh0LiAqLwogCWlmICghcG9saWN5ZGJfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJm5ld2NvbikpIHsKIAkJcmMgPSBjb252ZXJ0X2NvbnRleHRfaGFuZGxlX2ludmFsaWRfY29udGV4dCgmbmV3Y29uKTsKLQkJaWYgKHJjKQotCQkJZ290byBiYWQ7CisJCWlmIChyYykgeworCQkJaWYgKCFjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm5ld2NvbiwgJnMsICZsZW4pKSB7CisJCQkJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsIEFVRElUX1NFTElOVVhfRVJSLAorCQkJCQkgICJzZWN1cml0eV9zaWRfbWxzX2NvcHk6IGludmFsaWQgY29udGV4dCAlcyIsIHMpOworCQkJCWtmcmVlKHMpOworCQkJfQorCQkJZ290byBvdXRfdW5sb2NrOworCQl9CiAJfQogCiAJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJm5ld2NvbiwgbmV3X3NpZCk7Ci0JZ290byBvdXRfdW5sb2NrOwotCi1iYWQ6Ci0JaWYgKCFjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm5ld2NvbiwgJnMsICZsZW4pKSB7Ci0JCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLCBBVURJVF9TRUxJTlVYX0VSUiwKLQkJCSAgInNlY3VyaXR5X3NpZF9tbHNfY29weTogaW52YWxpZCBjb250ZXh0ICVzIiwgcyk7Ci0JCWtmcmVlKHMpOwotCX0KLQogb3V0X3VubG9jazoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJY29udGV4dF9kZXN0cm95KCZuZXdjb24pOwpAQCAtMjU0OSw2ICsyNTQzLDggQEAKIAlzdHJ1Y3QgY29udGV4dCAqbmxibF9jdHg7CiAJc3RydWN0IGNvbnRleHQgKnhmcm1fY3R4OwogCisJKnBlZXJfc2lkID0gU0VDU0lEX05VTEw7CisKIAkvKiBoYW5kbGUgdGhlIGNvbW1vbiAod2hpY2ggYWxzbyBoYXBwZW5zIHRvIGJlIHRoZSBzZXQgb2YgZWFzeSkgY2FzZXMKIAkgKiByaWdodCBhd2F5LCB0aGVzZSB0d28gaWYgc3RhdGVtZW50cyBjYXRjaCBldmVyeXRoaW5nIGludm9sdmluZyBhCiAJICogc2luZ2xlIG9yIGFic2VudCBwZWVyIFNJRC9sYWJlbCAqLwpAQCAtMjU2Nyw0MCArMjU2MywzNyBAQAogCS8qIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgc3NfaW5pdGlhbGl6ZWQgaGVyZSBzaW5jZSB0aGUgb25seSB3YXkgYm90aAogCSAqIG5sYmxfc2lkIGFuZCB4ZnJtX3NpZCBhcmUgbm90IGVxdWFsIHRvIFNFQ1NJRF9OVUxMIHdvdWxkIGJlIGlmIHRoZQogCSAqIHNlY3VyaXR5IHNlcnZlciB3YXMgaW5pdGlhbGl6ZWQgYW5kIHNzX2luaXRpYWxpemVkIHdhcyB0cnVlICovCi0JaWYgKCFwb2xpY3lkYi5tbHNfZW5hYmxlZCkgewotCQkqcGVlcl9zaWQgPSBTRUNTSURfTlVMTDsKKwlpZiAoIXBvbGljeWRiLm1sc19lbmFibGVkKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUlOVkFMOwogCW5sYmxfY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBubGJsX3NpZCk7CiAJaWYgKCFubGJsX2N0eCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIFNJRCAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBubGJsX3NpZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXRfc2xvd3BhdGg7CisJCWdvdG8gb3V0OwogCX0KKwlyYyA9IC1FSU5WQUw7CiAJeGZybV9jdHggPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIHhmcm1fc2lkKTsKIAlpZiAoIXhmcm1fY3R4KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICB1bnJlY29nbml6ZWQgU0lEICVkXG4iLAogCQkgICAgICAgX19mdW5jX18sIHhmcm1fc2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9zbG93cGF0aDsKKwkJZ290byBvdXQ7CiAJfQogCXJjID0gKG1sc19jb250ZXh0X2NtcChubGJsX2N0eCwgeGZybV9jdHgpID8gMCA6IC1FQUNDRVMpOworCWlmIChyYykKKwkJZ290byBvdXQ7CiAKLW91dF9zbG93cGF0aDoKKwkvKiBhdCBwcmVzZW50IE5ldExhYmVsIFNJRHMvbGFiZWxzIHJlYWxseSBvbmx5IGNhcnJ5IE1MUworCSAqIGluZm9ybWF0aW9uIHNvIGlmIHRoZSBNTFMgcG9ydGlvbiBvZiB0aGUgTmV0TGFiZWwgU0lECisJICogbWF0Y2hlcyB0aGUgTUxTIHBvcnRpb24gb2YgdGhlIGxhYmVsZWQgWEZSTSBTSUQvbGFiZWwKKwkgKiB0aGVuIHBhc3MgYWxvbmcgdGhlIFhGUk0gU0lEIGFzIGl0IGlzIHRoZSBtb3N0CisJICogZXhwcmVzc2l2ZSAqLworCSpwZWVyX3NpZCA9IHhmcm1fc2lkOworb3V0OgogCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQlpZiAocmMgPT0gMCkKLQkJLyogYXQgcHJlc2VudCBOZXRMYWJlbCBTSURzL2xhYmVscyByZWFsbHkgb25seSBjYXJyeSBNTFMKLQkJICogaW5mb3JtYXRpb24gc28gaWYgdGhlIE1MUyBwb3J0aW9uIG9mIHRoZSBOZXRMYWJlbCBTSUQKLQkJICogbWF0Y2hlcyB0aGUgTUxTIHBvcnRpb24gb2YgdGhlIGxhYmVsZWQgWEZSTSBTSUQvbGFiZWwKLQkJICogdGhlbiBwYXNzIGFsb25nIHRoZSBYRlJNIFNJRCBhcyBpdCBpcyB0aGUgbW9zdAotCQkgKiBleHByZXNzaXZlICovCi0JCSpwZWVyX3NpZCA9IHhmcm1fc2lkOwotCWVsc2UKLQkJKnBlZXJfc2lkID0gU0VDU0lEX05VTEw7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjE5LDEwICsyNjEyLDExIEBACiAKIGludCBzZWN1cml0eV9nZXRfY2xhc3NlcyhjaGFyICoqKmNsYXNzZXMsIGludCAqbmNsYXNzZXMpCiB7Ci0JaW50IHJjID0gLUVOT01FTTsKKwlpbnQgcmM7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRU5PTUVNOwogCSpuY2xhc3NlcyA9IHBvbGljeWRiLnBfY2xhc3Nlcy5ucHJpbTsKIAkqY2xhc3NlcyA9IGtjYWxsb2MoKm5jbGFzc2VzLCBzaXplb2YoKipjbGFzc2VzKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqY2xhc3NlcykKQEAgLTI2MzAsNyArMjYyNCw3IEBACiAKIAlyYyA9IGhhc2h0YWJfbWFwKHBvbGljeWRiLnBfY2xhc3Nlcy50YWJsZSwgZ2V0X2NsYXNzZXNfY2FsbGJhY2ssCiAJCQkqY2xhc3Nlcyk7Ci0JaWYgKHJjIDwgMCkgeworCWlmIChyYykgewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8ICpuY2xhc3NlczsgaSsrKQogCQkJa2ZyZWUoKCpjbGFzc2VzKVtpXSk7CkBAIC0yNjU3LDE5ICsyNjUxLDIwIEBACiAKIGludCBzZWN1cml0eV9nZXRfcGVybWlzc2lvbnMoY2hhciAqY2xhc3MsIGNoYXIgKioqcGVybXMsIGludCAqbnBlcm1zKQogewotCWludCByYyA9IC1FTk9NRU0sIGk7CisJaW50IHJjLCBpOwogCXN0cnVjdCBjbGFzc19kYXR1bSAqbWF0Y2g7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUlOVkFMOwogCW1hdGNoID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF9jbGFzc2VzLnRhYmxlLCBjbGFzcyk7CiAJaWYgKCFtYXRjaCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIGNsYXNzICVzXG4iLAogCQkJX19mdW5jX18sIGNsYXNzKTsKLQkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IC1FTk9NRU07CiAJKm5wZXJtcyA9IG1hdGNoLT5wZXJtaXNzaW9ucy5ucHJpbTsKIAkqcGVybXMgPSBrY2FsbG9jKCpucGVybXMsIHNpemVvZigqKnBlcm1zKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCEqcGVybXMpCkBAIC0yNjc4LDEzICsyNjczLDEzIEBACiAJaWYgKG1hdGNoLT5jb21kYXR1bSkgewogCQlyYyA9IGhhc2h0YWJfbWFwKG1hdGNoLT5jb21kYXR1bS0+cGVybWlzc2lvbnMudGFibGUsCiAJCQkJZ2V0X3Blcm1pc3Npb25zX2NhbGxiYWNrLCAqcGVybXMpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGVycjsKIAl9CiAKIAlyYyA9IGhhc2h0YWJfbWFwKG1hdGNoLT5wZXJtaXNzaW9ucy50YWJsZSwgZ2V0X3Blcm1pc3Npb25zX2NhbGxiYWNrLAogCQkJKnBlcm1zKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBlcnI7CiAKIG91dDoKQEAgLTI3OTYsMzYgKzI3OTEsMzkgQEAKIAlzd2l0Y2ggKGZpZWxkKSB7CiAJY2FzZSBBVURJVF9TVUJKX1VTRVI6CiAJY2FzZSBBVURJVF9PQkpfVVNFUjoKKwkJcmMgPSAtRUlOVkFMOwogCQl1c2VyZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3VzZXJzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCF1c2VyZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQudXNlciA9IHVzZXJkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC51c2VyID0gdXNlcmRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1JPTEU6CiAJY2FzZSBBVURJVF9PQkpfUk9MRToKKwkJcmMgPSAtRUlOVkFMOwogCQlyb2xlZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3JvbGVzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCFyb2xlZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQucm9sZSA9IHJvbGVkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC5yb2xlID0gcm9sZWRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1RZUEU6CiAJY2FzZSBBVURJVF9PQkpfVFlQRToKKwkJcmMgPSAtRUlOVkFMOwogCQl0eXBlZGF0dW0gPSBoYXNodGFiX3NlYXJjaChwb2xpY3lkYi5wX3R5cGVzLnRhYmxlLCBydWxlc3RyKTsKIAkJaWYgKCF0eXBlZGF0dW0pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXRtcHJ1bGUtPmF1X2N0eHQudHlwZSA9IHR5cGVkYXR1bS0+dmFsdWU7CisJCQlnb3RvIG91dDsKKwkJdG1wcnVsZS0+YXVfY3R4dC50eXBlID0gdHlwZWRhdHVtLT52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBBVURJVF9TVUJKX1NFTjoKIAljYXNlIEFVRElUX1NVQkpfQ0xSOgogCWNhc2UgQVVESVRfT0JKX0xFVl9MT1c6CiAJY2FzZSBBVURJVF9PQkpfTEVWX0hJR0g6CiAJCXJjID0gbWxzX2Zyb21fc3RyaW5nKHJ1bGVzdHIsICZ0bXBydWxlLT5hdV9jdHh0LCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAJCWJyZWFrOwogCX0KLQorCXJjID0gMDsKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAKIAlpZiAocmMpIHsKQEAgLTMwNTAsNyArMzA0OCw3IEBACiBpbnQgc2VjdXJpdHlfbmV0bGJsX3NlY2F0dHJfdG9fc2lkKHN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgKnNlY2F0dHIsCiAJCQkJICAgdTMyICpzaWQpCiB7Ci0JaW50IHJjID0gLUVJRFJNOworCWludCByYzsKIAlzdHJ1Y3QgY29udGV4dCAqY3R4OwogCXN0cnVjdCBjb250ZXh0IGN0eF9uZXc7CiAKQEAgLTMwNjEsMTYgKzMwNTksMTUgQEAKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAKLQlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9DQUNIRSkgeworCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX0NBQ0hFKQogCQkqc2lkID0gKih1MzIgKilzZWNhdHRyLT5jYWNoZS0+ZGF0YTsKLQkJcmMgPSAwOwotCX0gZWxzZSBpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9TRUNJRCkgeworCWVsc2UgaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfU0VDSUQpCiAJCSpzaWQgPSBzZWNhdHRyLT5hdHRyLnNlY2lkOwotCQlyYyA9IDA7Ci0JfSBlbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKKwllbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19MVkwpIHsKKwkJcmMgPSAtRUlEUk07CiAJCWN0eCA9IHNpZHRhYl9zZWFyY2goJnNpZHRhYiwgU0VDSU5JVFNJRF9ORVRNU0cpOwogCQlpZiAoY3R4ID09IE5VTEwpCi0JCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CisJCQlnb3RvIG91dDsKIAogCQljb250ZXh0X2luaXQoJmN0eF9uZXcpOwogCQljdHhfbmV3LnVzZXIgPSBjdHgtPnVzZXI7CkBAIC0zMDc4LDM0ICszMDc1LDM1IEBACiAJCWN0eF9uZXcudHlwZSA9IGN0eC0+dHlwZTsKIAkJbWxzX2ltcG9ydF9uZXRsYmxfbHZsKCZjdHhfbmV3LCBzZWNhdHRyKTsKIAkJaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfTUxTX0NBVCkgewotCQkJaWYgKGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCi0JCQkJCQkgIHNlY2F0dHItPmF0dHIubWxzLmNhdCkgIT0gMCkKLQkJCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CisJCQlyYyA9IGViaXRtYXBfbmV0bGJsX2ltcG9ydCgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCisJCQkJCQkgICBzZWNhdHRyLT5hdHRyLm1scy5jYXQpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gb3V0OwogCQkJbWVtY3B5KCZjdHhfbmV3LnJhbmdlLmxldmVsWzFdLmNhdCwKIAkJCSAgICAgICAmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQsCiAJCQkgICAgICAgc2l6ZW9mKGN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KSk7CiAJCX0KLQkJaWYgKG1sc19jb250ZXh0X2lzdmFsaWQoJnBvbGljeWRiLCAmY3R4X25ldykgIT0gMSkKLQkJCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybl9jbGVhbnVwOworCQlyYyA9IC1FSURSTTsKKwkJaWYgKCFtbHNfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJmN0eF9uZXcpKQorCQkJZ290byBvdXRfZnJlZTsKIAogCQlyYyA9IHNpZHRhYl9jb250ZXh0X3RvX3NpZCgmc2lkdGFiLCAmY3R4X25ldywgc2lkKTsKLQkJaWYgKHJjICE9IDApCi0JCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm5fY2xlYW51cDsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfZnJlZTsKIAogCQlzZWN1cml0eV9uZXRsYmxfY2FjaGVfYWRkKHNlY2F0dHIsICpzaWQpOwogCiAJCWViaXRtYXBfZGVzdHJveSgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQpOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCSpzaWQgPSBTRUNTSURfTlVMTDsKLQkJcmMgPSAwOwotCX0KIAotbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjoKKwlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CisJcmV0dXJuIDA7CitvdXRfZnJlZToKKwllYml0bWFwX2Rlc3Ryb3koJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KTsKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwotbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybl9jbGVhbnVwOgotCWViaXRtYXBfZGVzdHJveSgmY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQpOwotCWdvdG8gbmV0bGJsX3NlY2F0dHJfdG9fc2lkX3JldHVybjsKIH0KIAogLyoqCkBAIC0zMTI3LDI4ICszMTI1LDIzIEBACiAJCXJldHVybiAwOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKKworCXJjID0gLUVOT0VOVDsKIAljdHggPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIHNpZCk7Ci0JaWYgKGN0eCA9PSBOVUxMKSB7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBuZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZTsKLQl9Ci0Jc2VjYXR0ci0+ZG9tYWluID0ga3N0cmR1cChwb2xpY3lkYi5wX3R5cGVfdmFsX3RvX25hbWVbY3R4LT50eXBlIC0gMV0sCisJaWYgKGN0eCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKKwlzZWNhdHRyLT5kb21haW4gPSBrc3RyZHVwKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1RZUEVTLCBjdHgtPnR5cGUgLSAxKSwKIAkJCQkgIEdGUF9BVE9NSUMpOwotCWlmIChzZWNhdHRyLT5kb21haW4gPT0gTlVMTCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU7Ci0JfQorCWlmIChzZWNhdHRyLT5kb21haW4gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKIAlzZWNhdHRyLT5hdHRyLnNlY2lkID0gc2lkOwogCXNlY2F0dHItPmZsYWdzIHw9IE5FVExCTF9TRUNBVFRSX0RPTUFJTl9DUFkgfCBORVRMQkxfU0VDQVRUUl9TRUNJRDsKIAltbHNfZXhwb3J0X25ldGxibF9sdmwoY3R4LCBzZWNhdHRyKTsKIAlyYyA9IG1sc19leHBvcnRfbmV0bGJsX2NhdChjdHgsIHNlY2F0dHIpOwotCWlmIChyYyAhPSAwKQotCQlnb3RvIG5ldGxibF9zaWRfdG9fc2VjYXR0cl9mYWlsdXJlOwotCXJlYWRfdW5sb2NrKCZwb2xpY3lfcndsb2NrKTsKLQotCXJldHVybiAwOwotCi1uZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZToKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMKaW5kZXggZTgxNzk4OS4uNTg0MGEzNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5jCkBAIC0xNDcsNiArMTQ3LDE3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBzaWR0YWJfdXBkYXRlX2NhY2hlKHN0cnVjdCBzaWR0YWIgKnMsIHN0cnVjdCBzaWR0YWJfbm9kZSAqbiwgaW50IGxvYykKK3sKKwlCVUdfT04obG9jID49IFNJRFRBQl9DQUNIRV9MRU4pOworCisJd2hpbGUgKGxvYyA+IDApIHsKKwkJcy0+Y2FjaGVbbG9jXSA9IHMtPmNhY2hlW2xvYyAtIDFdOworCQlsb2MtLTsKKwl9CisJcy0+Y2FjaGVbMF0gPSBuOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBzaWR0YWJfc2VhcmNoX2NvbnRleHQoc3RydWN0IHNpZHRhYiAqcywKIAkJCQkJCSAgc3RydWN0IGNvbnRleHQgKmNvbnRleHQpCiB7CkBAIC0xNTYsMTQgKzE2NywzMyBAQAogCWZvciAoaSA9IDA7IGkgPCBTSURUQUJfU0laRTsgaSsrKSB7CiAJCWN1ciA9IHMtPmh0YWJsZVtpXTsKIAkJd2hpbGUgKGN1cikgewotCQkJaWYgKGNvbnRleHRfY21wKCZjdXItPmNvbnRleHQsIGNvbnRleHQpKQorCQkJaWYgKGNvbnRleHRfY21wKCZjdXItPmNvbnRleHQsIGNvbnRleHQpKSB7CisJCQkJc2lkdGFiX3VwZGF0ZV9jYWNoZShzLCBjdXIsIFNJRFRBQl9DQUNIRV9MRU4gLSAxKTsKIAkJCQlyZXR1cm4gY3VyLT5zaWQ7CisJCQl9CiAJCQljdXIgPSBjdXItPm5leHQ7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIHNpZHRhYl9zZWFyY2hfY2FjaGUoc3RydWN0IHNpZHRhYiAqcywgc3RydWN0IGNvbnRleHQgKmNvbnRleHQpCit7CisJaW50IGk7CisJc3RydWN0IHNpZHRhYl9ub2RlICpub2RlOworCisJZm9yIChpID0gMDsgaSA8IFNJRFRBQl9DQUNIRV9MRU47IGkrKykgeworCQlub2RlID0gcy0+Y2FjaGVbaV07CisJCWlmICh1bmxpa2VseSghbm9kZSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGNvbnRleHRfY21wKCZub2RlLT5jb250ZXh0LCBjb250ZXh0KSkgeworCQkJc2lkdGFiX3VwZGF0ZV9jYWNoZShzLCBub2RlLCBpKTsKKwkJCXJldHVybiBub2RlLT5zaWQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIGludCBzaWR0YWJfY29udGV4dF90b19zaWQoc3RydWN0IHNpZHRhYiAqcywKIAkJCSAgc3RydWN0IGNvbnRleHQgKmNvbnRleHQsCiAJCQkgIHUzMiAqb3V0X3NpZCkKQEAgLTE3NCw3ICsyMDQsOSBAQAogCiAJKm91dF9zaWQgPSBTRUNTSURfTlVMTDsKIAotCXNpZCA9IHNpZHRhYl9zZWFyY2hfY29udGV4dChzLCBjb250ZXh0KTsKKwlzaWQgID0gc2lkdGFiX3NlYXJjaF9jYWNoZShzLCBjb250ZXh0KTsKKwlpZiAoIXNpZCkKKwkJc2lkID0gc2lkdGFiX3NlYXJjaF9jb250ZXh0KHMsIGNvbnRleHQpOwogCWlmICghc2lkKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CiAJCS8qIFJlc2NhbiBub3cgdGhhdCB3ZSBob2xkIHRoZSBsb2NrLiAqLwpAQCAtMjU5LDEyICsyOTEsMTUgQEAKIHZvaWQgc2lkdGFiX3NldChzdHJ1Y3Qgc2lkdGFiICpkc3QsIHN0cnVjdCBzaWR0YWIgKnNyYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNyYy0+bG9jaywgZmxhZ3MpOwogCWRzdC0+aHRhYmxlID0gc3JjLT5odGFibGU7CiAJZHN0LT5uZWwgPSBzcmMtPm5lbDsKIAlkc3QtPm5leHRfc2lkID0gc3JjLT5uZXh0X3NpZDsKIAlkc3QtPnNodXRkb3duID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX0NBQ0hFX0xFTjsgaSsrKQorCQlkc3QtPmNhY2hlW2ldID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcmMtPmxvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuaCBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmgKaW5kZXggNjRlYTViMS4uODRkYzE1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5oCkBAIC0yNiw2ICsyNiw4IEBACiAJdW5zaWduZWQgaW50IG5lbDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzICovCiAJdW5zaWduZWQgaW50IG5leHRfc2lkOwkvKiBuZXh0IFNJRCB0byBhbGxvY2F0ZSAqLwogCXVuc2lnbmVkIGNoYXIgc2h1dGRvd247CisjZGVmaW5lIFNJRFRBQl9DQUNIRV9MRU4JMworCXN0cnVjdCBzaWR0YWJfbm9kZSAqY2FjaGVbU0lEVEFCX0NBQ0hFX0xFTl07CiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggNDNhZTc0Ny4uMTI5YzRlYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC01MSwxMSArNTEsMTggQEAKICAqLwogc3RydWN0IGlub2RlX3NtYWNrIHsKIAljaGFyCQkqc21rX2lub2RlOwkvKiBsYWJlbCBvZiB0aGUgZnNvICovCisJY2hhcgkJKnNta190YXNrOwkvKiBsYWJlbCBvZiB0aGUgdGFzayAqLwogCXN0cnVjdCBtdXRleAlzbWtfbG9jazsJLyogaW5pdGlhbGl6YXRpb24gbG9jayAqLwogCWludAkJc21rX2ZsYWdzOwkvKiBzbWFjayBpbm9kZSBmbGFncyAqLwogfTsKIAorc3RydWN0IHRhc2tfc21hY2sgeworCWNoYXIJCSpzbWtfdGFzazsJLyogbGFiZWwgdXNlZCBmb3IgYWNjZXNzIGNvbnRyb2wgKi8KKwljaGFyCQkqc21rX2ZvcmtlZDsJLyogbGFiZWwgd2hlbiBmb3JrZWQgKi8KK307CisKICNkZWZpbmUJU01LX0lOT0RFX0lOU1RBTlQJMHgwMQkvKiBpbm9kZSBpcyBpbnN0YW50aWF0ZWQgKi8KKyNkZWZpbmUJU01LX0lOT0RFX1RSQU5TTVVURQkweDAyCS8qIGRpcmVjdG9yeSBpcyB0cmFuc211dGluZyAqLwogCiAvKgogICogQSBsYWJlbCBhY2Nlc3MgcnVsZS4KQEAgLTE2MSw2ICsxNjgsMTAgQEAKICNkZWZpbmUgU01BQ0tfQ0lQU09fTUFYQ0FUTlVNICAgICAgICAgICAyMzkgICAgIC8qIENJUFNPIDIuMiBzdGFuZGFyZCAqLwogCiAvKgorICogRmxhZyBmb3IgdHJhbnNtdXRlIGFjY2VzcworICovCisjZGVmaW5lIE1BWV9UUkFOU01VVEUJNjQKKy8qCiAgKiBKdXN0IHRvIG1ha2UgdGhlIGNvbW1vbiBjYXNlcyBlYXNpZXIgdG8gZGVhbCB3aXRoCiAgKi8KICNkZWZpbmUgTUFZX0FOWQkJKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0FQUEVORCB8IE1BWV9FWEVDKQpAQCAtMTkxLDYgKzIwMiw3IEBACiAvKgogICogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbiBzbWFja19hY2Nlc3MuYwogICovCitpbnQgc21rX2FjY2Vzc19lbnRyeShjaGFyICosIGNoYXIgKik7CiBpbnQgc21rX2FjY2VzcyhjaGFyICosIGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKik7CiBpbnQgc21rX2N1cmFjYyhjaGFyICosIHUzMiwgc3RydWN0IHNta19hdWRpdF9pbmZvICopOwogaW50IHNtYWNrX3RvX2NpcHNvKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNtYWNrX2NpcHNvICopOwpAQCAtMjM0LDYgKzI0NiwxNSBAQAogfQogCiAvKgorICogSXMgdGhlIGRpcmVjdG9yeSB0cmFuc211dGluZz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgc21rX2lub2RlX3RyYW5zbXV0YWJsZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlzcCkKK3sKKwlzdHJ1Y3QgaW5vZGVfc21hY2sgKnNpcCA9IGlzcC0+aV9zZWN1cml0eTsKKwlyZXR1cm4gKHNpcC0+c21rX2ZsYWdzICYgU01LX0lOT0RFX1RSQU5TTVVURSkgIT0gMDsKK30KKworLyoKICAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBzbWFjayBsYWJlbCBpbiBhbiBpbm9kZSBibG9iLgogICovCiBzdGF0aWMgaW5saW5lIGNoYXIgKnNta19vZl9pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlzcCkKQEAgLTI0Myw2ICsyNjQsMzAgQEAKIH0KIAogLyoKKyAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBzbWFjayBsYWJlbCBpbiBhbiB0YXNrIGJsb2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqc21rX29mX3Rhc2soY29uc3Qgc3RydWN0IHRhc2tfc21hY2sgKnRzcCkKK3sKKwlyZXR1cm4gdHNwLT5zbWtfdGFzazsKK30KKworLyoKKyAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBmb3JrZWQgc21hY2sgbGFiZWwgaW4gYW4gdGFzayBibG9iLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKnNta19vZl9mb3JrZWQoY29uc3Qgc3RydWN0IHRhc2tfc21hY2sgKnRzcCkKK3sKKwlyZXR1cm4gdHNwLT5zbWtfZm9ya2VkOworfQorCisvKgorICogUHJlc2VudCBhIHBvaW50ZXIgdG8gdGhlIHNtYWNrIGxhYmVsIGluIHRoZSBjdXJyZW50IHRhc2sgYmxvYi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICpzbWtfb2ZfY3VycmVudCh2b2lkKQoreworCXJldHVybiBzbWtfb2ZfdGFzayhjdXJyZW50X3NlY3VyaXR5KCkpOworfQorCisvKgogICogbG9nZ2luZyBmdW5jdGlvbnMKICAqLwogI2RlZmluZSBTTUFDS19BVURJVF9ERU5JRUQgMHgxCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCmluZGV4IGY0ZmFjNjQuLjdiYTg0NzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jCkBAIC02Nyw2ICs2Nyw0NiBAQAogaW50IGxvZ19wb2xpY3kgPSBTTUFDS19BVURJVF9ERU5JRUQ7CiAKIC8qKgorICogc21rX2FjY2Vzc19lbnRyeSAtIGxvb2sgdXAgbWF0Y2hpbmcgYWNjZXNzIHJ1bGUKKyAqIEBzdWJqZWN0X2xhYmVsOiBhIHBvaW50ZXIgdG8gdGhlIHN1YmplY3QncyBTbWFjayBsYWJlbAorICogQG9iamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBvYmplY3QncyBTbWFjayBsYWJlbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIHN1YmplY3Qvb2JqZWN0IHBhaXIgaW4gdGhlCisgKiBhY2Nlc3MgcnVsZSBsaXN0IGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nIHJ1bGUgaWYgZm91bmQsCisgKiBOVUxMIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOgorICogRXZlbiB0aG91Z2ggU21hY2sgbGFiZWxzIGFyZSB1c3VhbGx5IHNoYXJlZCBvbiBzbWFja19saXN0CisgKiBsYWJlbHMgdGhhdCBjb21lIGluIG9mZiB0aGUgbmV0d29yayBjYW4ndCBiZSBpbXBvcnRlZAorICogYW5kIGFkZGVkIHRvIHRoZSBsaXN0IGZvciBsb2NraW5nIHJlYXNvbnMuCisgKgorICogVGhlcmVmb3JlLCBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBsYWJlbHMsCisgKiBub3QganVzdCB0aGUgcG9pbnRlciB2YWx1ZXMuIE9mIGNvdXJzZSwgaW4gbW9zdCBjYXNlcyB0aGUgbGFiZWxzCisgKiB3aWxsIGJlIG9uIHRoZSBsaXN0LCBzbyBjaGVja2luZyB0aGUgcG9pbnRlcnMgbWF5IGJlIGEgd29ydGh3aGlsZQorICogb3B0aW1pemF0aW9uLgorICovCitpbnQgc21rX2FjY2Vzc19lbnRyeShjaGFyICpzdWJqZWN0X2xhYmVsLCBjaGFyICpvYmplY3RfbGFiZWwpCit7CisJdTMyIG1heSA9IE1BWV9OT1Q7CisJc3RydWN0IHNtYWNrX3J1bGUgKnNycDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzcnAsICZzbWFja19ydWxlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHNycC0+c21rX3N1YmplY3QgPT0gc3ViamVjdF9sYWJlbCB8fAorCQkgICAgc3RyY21wKHNycC0+c21rX3N1YmplY3QsIHN1YmplY3RfbGFiZWwpID09IDApIHsKKwkJCWlmIChzcnAtPnNta19vYmplY3QgPT0gb2JqZWN0X2xhYmVsIHx8CisJCQkgICAgc3RyY21wKHNycC0+c21rX29iamVjdCwgb2JqZWN0X2xhYmVsKSA9PSAwKSB7CisJCQkJbWF5ID0gc3JwLT5zbWtfYWNjZXNzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIG1heTsKK30KKworLyoqCiAgKiBzbWtfYWNjZXNzIC0gZGV0ZXJtaW5lIGlmIGEgc3ViamVjdCBoYXMgYSBzcGVjaWZpYyBhY2Nlc3MgdG8gYW4gb2JqZWN0CiAgKiBAc3ViamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBzdWJqZWN0J3MgU21hY2sgbGFiZWwKICAqIEBvYmplY3RfbGFiZWw6IGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3MgU21hY2sgbGFiZWwKQEAgLTkwLDcgKzEzMCw2IEBACiAJICAgICAgIHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSkKIHsKIAl1MzIgbWF5ID0gTUFZX05PVDsKLQlzdHJ1Y3Qgc21hY2tfcnVsZSAqc3JwOwogCWludCByYyA9IDA7CiAKIAkvKgpAQCAtMTQ0LDE4ICsxODMsNyBAQAogCSAqIGFjY2VzcyAoZS5nLiByZWFkIGlzIGluY2x1ZGVkIGluIHJlYWR3cml0ZSkgaXQncwogCSAqIGdvb2QuCiAJICovCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNycCwgJnNtYWNrX3J1bGVfbGlzdCwgbGlzdCkgewotCQlpZiAoc3JwLT5zbWtfc3ViamVjdCA9PSBzdWJqZWN0X2xhYmVsIHx8Ci0JCSAgICBzdHJjbXAoc3JwLT5zbWtfc3ViamVjdCwgc3ViamVjdF9sYWJlbCkgPT0gMCkgewotCQkJaWYgKHNycC0+c21rX29iamVjdCA9PSBvYmplY3RfbGFiZWwgfHwKLQkJCSAgICBzdHJjbXAoc3JwLT5zbWtfb2JqZWN0LCBvYmplY3RfbGFiZWwpID09IDApIHsKLQkJCQltYXkgPSBzcnAtPnNta19hY2Nlc3M7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJbWF5ID0gc21rX2FjY2Vzc19lbnRyeShzdWJqZWN0X2xhYmVsLCBvYmplY3RfbGFiZWwpOwogCS8qCiAJICogVGhpcyBpcyBhIGJpdCBtYXAgb3BlcmF0aW9uLgogCSAqLwpAQCAtMTg1LDcgKzIxMyw3IEBACiBpbnQgc21rX2N1cmFjYyhjaGFyICpvYmpfbGFiZWwsIHUzMiBtb2RlLCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEpCiB7CiAJaW50IHJjOwotCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKnNwID0gc21rX29mX2N1cnJlbnQoKTsKIAogCXJjID0gc21rX2FjY2VzcyhzcCwgb2JqX2xhYmVsLCBtb2RlLCBOVUxMKTsKIAlpZiAocmMgPT0gMCkKQEAgLTE5Niw3ICsyMjQsNyBAQAogCSAqIG9ubHkgb25lIHRoYXQgZ2V0cyBwcml2aWxlZ2UgYW5kIGN1cnJlbnQgZG9lcyBub3QKIAkgKiBoYXZlIHRoYXQgbGFiZWwuCiAJICovCi0JaWYgKHNtYWNrX29ubHljYXAgIT0gTlVMTCAmJiBzbWFja19vbmx5Y2FwICE9IGN1cnJlbnQtPmNyZWQtPnNlY3VyaXR5KQorCWlmIChzbWFja19vbmx5Y2FwICE9IE5VTEwgJiYgc21hY2tfb25seWNhcCAhPSBzcCkKIAkJZ290byBvdXRfYXVkaXQ7CiAKIAlpZiAoY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKaW5kZXggY2NiNzFhMC4uNTMzYmYzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKQEAgLTMsMTIgKzMsMTQgQEAKICAqCiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzbWFjayBob29rIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucy4KICAqCi0gKiAgQXV0aG9yOgorICogIEF1dGhvcnM6CiAgKglDYXNleSBTY2hhdWZsZXIgPGNhc2V5QHNjaGF1Zmxlci1jYS5jb20+CisgKglKYXJra28gU2Fra2luZW4gPGV4dC1qYXJra28uMi5zYWtraW5lbkBub2tpYS5jb20+CiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNyBDYXNleSBTY2hhdWZsZXIgPGNhc2V5QHNjaGF1Zmxlci1jYS5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCiAgKiAgICAgICAgICAgICAgICBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24KICAqCiAgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsCkBAIC0zNSw2ICszNyw5IEBACiAKICNkZWZpbmUgdGFza19zZWN1cml0eSh0YXNrKQkodGFza19jcmVkX3h4eCgodGFzayksIHNlY3VyaXR5KSkKIAorI2RlZmluZSBUUkFOU19UUlVFCSJUUlVFIgorI2RlZmluZSBUUkFOU19UUlVFX1NJWkUJNAorCiAvKioKICAqIHNta19mZXRjaCAtIEZldGNoIHRoZSBzbWFjayBsYWJlbCBmcm9tIGEgZmlsZS4KICAqIEBpcDogYSBwb2ludGVyIHRvIHRoZSBpbm9kZQpAQCAtNDMsNyArNDgsNyBAQAogICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1hc3RlciBsaXN0IGVudHJ5IGZvciB0aGUgU21hY2sgbGFiZWwKICAqIG9yIE5VTEwgaWYgdGhlcmUgd2FzIG5vIGxhYmVsIHRvIGZldGNoLgogICovCi1zdGF0aWMgY2hhciAqc21rX2ZldGNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkZW50cnkgKmRwKQorc3RhdGljIGNoYXIgKnNta19mZXRjaChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCkKIHsKIAlpbnQgcmM7CiAJY2hhciBpbltTTUtfTEFCRUxMRU5dOwpAQCAtNTEsNyArNTYsNyBAQAogCWlmIChpcC0+aV9vcC0+Z2V0eGF0dHIgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyYyA9IGlwLT5pX29wLT5nZXR4YXR0cihkcCwgWEFUVFJfTkFNRV9TTUFDSywgaW4sIFNNS19MQUJFTExFTik7CisJcmMgPSBpcC0+aV9vcC0+Z2V0eGF0dHIoZHAsIG5hbWUsIGluLCBTTUtfTEFCRUxMRU4pOwogCWlmIChyYyA8IDApCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDMsOCArMTA4LDggQEAKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7Ci0JdHNwID0gdGFza19zZWN1cml0eShjdHApOworCXNwID0gc21rX29mX2N1cnJlbnQoKTsKKwl0c3AgPSBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KGN0cCkpOwogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIGN0cCk7CiAKQEAgLTEzOCw4ICsxNDMsOCBAQAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHB0cCk7CiAKLQlzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKLQl0c3AgPSB0YXNrX3NlY3VyaXR5KHB0cCk7CisJc3AgPSBzbWtfb2ZfY3VycmVudCgpOworCXRzcCA9IHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocHRwKSk7CiAJLyogd2Ugd29uJ3QgbG9nIGhlcmUsIGJlY2F1c2UgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLwogCXJjID0gc21rX2FjY2Vzcyh0c3AsIHNwLCBNQVlfUkVBRFdSSVRFLCBOVUxMKTsKIAlpZiAocmMgIT0gMCAmJiBoYXNfY2FwYWJpbGl0eShwdHAsIENBUF9NQUNfT1ZFUlJJREUpKQpAQCAtMTYwLDcgKzE2NSw3IEBACiBzdGF0aWMgaW50IHNtYWNrX3N5c2xvZyhpbnQgdHlwZWZyb21fZmlsZSkKIHsKIAlpbnQgcmMgPSAwOwotCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKnNwID0gc21rX29mX2N1cnJlbnQoKTsKIAogCWlmIChjYXBhYmxlKENBUF9NQUNfT1ZFUlJJREUpKQogCQlyZXR1cm4gMDsKQEAgLTM5MSw2ICszOTYsNDAgQEAKIH0KIAogLyoKKyAqIEJQUk0gaG9va3MKKyAqLworCitzdGF0aWMgaW50IHNtYWNrX2Jwcm1fc2V0X2NyZWRzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJc3RydWN0IHRhc2tfc21hY2sgKnRzcCA9IGJwcm0tPmNyZWQtPnNlY3VyaXR5OworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwOworCXN0cnVjdCBkZW50cnkgKmRwOworCWludCByYzsKKworCXJjID0gY2FwX2Jwcm1fc2V0X2NyZWRzKGJwcm0pOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoYnBybS0+Y3JlZF9wcmVwYXJlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYnBybS0+ZmlsZSA9PSBOVUxMIHx8IGJwcm0tPmZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAwOworCisJZHAgPSBicHJtLT5maWxlLT5mX2RlbnRyeTsKKworCWlmIChkcC0+ZF9pbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlzcCA9IGRwLT5kX2lub2RlLT5pX3NlY3VyaXR5OworCisJaWYgKGlzcC0+c21rX3Rhc2sgIT0gTlVMTCkKKwkJdHNwLT5zbWtfdGFzayA9IGlzcC0+c21rX3Rhc2s7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIElub2RlIGhvb2tzCiAgKi8KIApAQCAtNDAyLDcgKzQ0MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpbm9kZS0+aV9zZWN1cml0eSA9IG5ld19pbm9kZV9zbWFjayhjdXJyZW50X3NlY3VyaXR5KCkpOworCWlub2RlLT5pX3NlY3VyaXR5ID0gbmV3X2lub2RlX3NtYWNrKHNta19vZl9jdXJyZW50KCkpOwogCWlmIChpbm9kZS0+aV9zZWN1cml0eSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTQzNCw2ICs0NzMsOCBAQAogCQkJCSAgICAgY2hhciAqKm5hbWUsIHZvaWQgKip2YWx1ZSwgc2l6ZV90ICpsZW4pCiB7CiAJY2hhciAqaXNwID0gc21rX29mX2lub2RlKGlub2RlKTsKKwljaGFyICpkc3AgPSBzbWtfb2ZfaW5vZGUoZGlyKTsKKwl1MzIgbWF5OwogCiAJaWYgKG5hbWUpIHsKIAkJKm5hbWUgPSBrc3RyZHVwKFhBVFRSX1NNQUNLX1NVRkZJWCwgR0ZQX0tFUk5FTCk7CkBAIC00NDIsNiArNDgzLDE2IEBACiAJfQogCiAJaWYgKHZhbHVlKSB7CisJCW1heSA9IHNta19hY2Nlc3NfZW50cnkoc21rX29mX2N1cnJlbnQoKSwgZHNwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgYWNjZXNzIHJ1bGUgYWxsb3dzIHRyYW5zbXV0YXRpb24gYW5kCisJCSAqIHRoZSBkaXJlY3RvcnkgcmVxdWVzdHMgdHJhbnNtdXRhdGlvbiB0aGVuCisJCSAqIGJ5IGFsbCBtZWFucyB0cmFuc211dGUuCisJCSAqLworCQlpZiAoKChtYXkgJiBNQVlfVFJBTlNNVVRFKSAhPSAwKSAmJiBzbWtfaW5vZGVfdHJhbnNtdXRhYmxlKGRpcikpCisJCQlpc3AgPSBkc3A7CisKIAkJKnZhbHVlID0ga3N0cmR1cChpc3AsIEdGUF9LRVJORUwpOwogCQlpZiAoKnZhbHVlID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY2NCw3ICs3MTUsOCBAQAogCiAJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLKSA9PSAwIHx8CiAJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBJTikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwKSB7CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBPVVQpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwKSB7CiAJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJCXJjID0gLUVQRVJNOwogCQkvKgpAQCAtNjc0LDYgKzcyNiwxMiBAQAogCQlpZiAoc2l6ZSA9PSAwIHx8IHNpemUgPj0gU01LX0xBQkVMTEVOIHx8CiAJCSAgICBzbWtfaW1wb3J0KHZhbHVlLCBzaXplKSA9PSBOVUxMKQogCQkJcmMgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUpID09IDApIHsKKwkJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQorCQkJcmMgPSAtRVBFUk07CisJCWlmIChzaXplICE9IFRSQU5TX1RSVUVfU0laRSB8fAorCQkgICAgc3RybmNtcCh2YWx1ZSwgVFJBTlNfVFJVRSwgVFJBTlNfVFJVRV9TSVpFKSAhPSAwKQorCQkJcmMgPSAtRUlOVkFMOwogCX0gZWxzZQogCQlyYyA9IGNhcF9pbm9kZV9zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiAKQEAgLTcwMCwyNiArNzU4LDIzIEBACiBzdGF0aWMgdm9pZCBzbWFja19pbm9kZV9wb3N0X3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKIAljaGFyICpuc3A7CisJc3RydWN0IGlub2RlX3NtYWNrICppc3AgPSBkZW50cnktPmRfaW5vZGUtPmlfc2VjdXJpdHk7CiAKLQkvKgotCSAqIE5vdCBTTUFDSwotCSAqLwotCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykpCi0JCXJldHVybjsKLQotCWlzcCA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zZWN1cml0eTsKLQotCS8qCi0JICogTm8gbG9ja2luZyBpcyBkb25lIGhlcmUuIFRoaXMgaXMgYSBwb2ludGVyCi0JICogYXNzaWdubWVudC4KLQkgKi8KLQluc3AgPSBzbWtfaW1wb3J0KHZhbHVlLCBzaXplKTsKLQlpZiAobnNwICE9IE5VTEwpCi0JCWlzcC0+c21rX2lub2RlID0gbnNwOwotCWVsc2UKLQkJaXNwLT5zbWtfaW5vZGUgPSBzbWFja19rbm93bl9pbnZhbGlkLnNta19rbm93bjsKKwlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0spID09IDApIHsKKwkJbnNwID0gc21rX2ltcG9ydCh2YWx1ZSwgc2l6ZSk7CisJCWlmIChuc3AgIT0gTlVMTCkKKwkJCWlzcC0+c21rX2lub2RlID0gbnNwOworCQllbHNlCisJCQlpc3AtPnNta19pbm9kZSA9IHNtYWNrX2tub3duX2ludmFsaWQuc21rX2tub3duOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwKSB7CisJCW5zcCA9IHNta19pbXBvcnQodmFsdWUsIHNpemUpOworCQlpZiAobnNwICE9IE5VTEwpCisJCQlpc3AtPnNta190YXNrID0gbnNwOworCQllbHNlCisJCQlpc3AtPnNta190YXNrID0gc21hY2tfa25vd25faW52YWxpZC5zbWtfa25vd247CisJfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS1RSQU5TTVVURSkgPT0gMCkKKwkJaXNwLT5zbWtfZmxhZ3MgfD0gU01LX0lOT0RFX1RSQU5TTVVURTsKIAogCXJldHVybjsKIH0KQEAgLTc1MiwxMiArODA3LDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogeworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwOwogCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAlpbnQgcmMgPSAwOwogCiAJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLKSA9PSAwIHx8CiAJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBJTikgPT0gMCB8fAotCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwKSB7CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLSVBPVVQpID09IDAgfHwKKwkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tFWEVDKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFKSA9PSAwKSB7CiAJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJCXJjID0gLUVQRVJNOwogCX0gZWxzZQpAQCAtNzY4LDYgKzgyNiwxMSBAQAogCWlmIChyYyA9PSAwKQogCQlyYyA9IHNta19jdXJhY2Moc21rX29mX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSksIE1BWV9XUklURSwgJmFkKTsKIAorCWlmIChyYyA9PSAwKSB7CisJCWlzcCA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zZWN1cml0eTsKKwkJaXNwLT5zbWtfdGFzayA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJjOwogfQogCkBAIC04OTUsNyArOTU4LDcgQEAKICAqLwogc3RhdGljIGludCBzbWFja19maWxlX2FsbG9jX3NlY3VyaXR5KHN0cnVjdCBmaWxlICpmaWxlKQogewotCWZpbGUtPmZfc2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJZmlsZS0+Zl9zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDUsNyArMTA2OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfZmlsZV9zZXRfZm93bmVyKHN0cnVjdCBmaWxlICpmaWxlKQogewotCWZpbGUtPmZfc2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJZmlsZS0+Zl9zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMjUsNyArMTA4OCw3IEBACiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IHJjOwotCWNoYXIgKnRzcCA9IHRzay0+Y3JlZC0+c2VjdXJpdHk7CisJY2hhciAqdHNwID0gc21rX29mX3Rhc2sodHNrLT5jcmVkLT5zZWN1cml0eSk7CiAJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCiAJLyoKQEAgLTEwODIsNyArMTE0NSw5IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfY3JlZF9hbGxvY19ibGFuayhzdHJ1Y3QgY3JlZCAqY3JlZCwgZ2ZwX3QgZ2ZwKQogewotCWNyZWQtPnNlY3VyaXR5ID0gTlVMTDsKKwljcmVkLT5zZWN1cml0eSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX3NtYWNrKSwgZ2ZwKTsKKwlpZiAoY3JlZC0+c2VjdXJpdHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTcsNyArMTE2Miw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtYWNrX2NyZWRfZnJlZShzdHJ1Y3QgY3JlZCAqY3JlZCkKIHsKLQljcmVkLT5zZWN1cml0eSA9IE5VTEw7CisJa2ZyZWUoY3JlZC0+c2VjdXJpdHkpOwogfQogCiAvKioKQEAgLTExMTEsNyArMTE3NiwxNiBAQAogc3RhdGljIGludCBzbWFja19jcmVkX3ByZXBhcmUoc3RydWN0IGNyZWQgKm5ldywgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCwKIAkJCSAgICAgIGdmcF90IGdmcCkKIHsKLQluZXctPnNlY3VyaXR5ID0gb2xkLT5zZWN1cml0eTsKKwlzdHJ1Y3QgdGFza19zbWFjayAqb2xkX3RzcCA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IHRhc2tfc21hY2sgKm5ld190c3A7CisKKwluZXdfdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRhc2tfc21hY2spLCBnZnApOworCWlmIChuZXdfdHNwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbmV3X3RzcC0+c21rX3Rhc2sgPSBvbGRfdHNwLT5zbWtfdGFzazsKKwluZXdfdHNwLT5zbWtfZm9ya2VkID0gb2xkX3RzcC0+c21rX3Rhc2s7CisJbmV3LT5zZWN1cml0eSA9IG5ld190c3A7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjQsNyArMTE5OCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBzbWFja19jcmVkX3RyYW5zZmVyKHN0cnVjdCBjcmVkICpuZXcsIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQpCiB7Ci0JbmV3LT5zZWN1cml0eSA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IHRhc2tfc21hY2sgKm9sZF90c3AgPSBvbGQtPnNlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICpuZXdfdHNwID0gbmV3LT5zZWN1cml0eTsKKworCW5ld190c3AtPnNta190YXNrID0gb2xkX3RzcC0+c21rX3Rhc2s7CisJbmV3X3RzcC0+c21rX2ZvcmtlZCA9IG9sZF90c3AtPnNta190YXNrOwogfQogCiAvKioKQEAgLTExMzYsMTIgKzEyMTQsMTMgQEAKICAqLwogc3RhdGljIGludCBzbWFja19rZXJuZWxfYWN0X2FzKHN0cnVjdCBjcmVkICpuZXcsIHUzMiBzZWNpZCkKIHsKKwlzdHJ1Y3QgdGFza19zbWFjayAqbmV3X3RzcCA9IG5ldy0+c2VjdXJpdHk7CiAJY2hhciAqc21hY2sgPSBzbWFja19mcm9tX3NlY2lkKHNlY2lkKTsKIAogCWlmIChzbWFjayA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW5ldy0+c2VjdXJpdHkgPSBzbWFjazsKKwluZXdfdHNwLT5zbWtfdGFzayA9IHNtYWNrOwogCXJldHVybiAwOwogfQogCkBAIC0xMTU3LDggKzEyMzYsMTAgQEAKIAkJCQkJc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcCA9IGlub2RlLT5pX3NlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICp0c3AgPSBuZXctPnNlY3VyaXR5OwogCi0JbmV3LT5zZWN1cml0eSA9IGlzcC0+c21rX2lub2RlOworCXRzcC0+c21rX2ZvcmtlZCA9IGlzcC0+c21rX2lub2RlOworCXRzcC0+c21rX3Rhc2sgPSBpc3AtPnNta19pbm9kZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE3NSw3ICsxMjU2LDcgQEAKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHApOwotCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIGFjY2VzcywgJmFkKTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgYWNjZXNzLCAmYWQpOwogfQogCiAvKioKQEAgLTEyMjEsNyArMTMwMiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNtYWNrX3Rhc2tfZ2V0c2VjaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1MzIgKnNlY2lkKQogewotCSpzZWNpZCA9IHNtYWNrX3RvX3NlY2lkKHRhc2tfc2VjdXJpdHkocCkpOworCSpzZWNpZCA9IHNtYWNrX3RvX3NlY2lkKHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocCkpKTsKIH0KIAogLyoqCkBAIC0xMzMzLDE0ICsxNDE0LDE1IEBACiAJICogY2FuIHdyaXRlIHRoZSByZWNlaXZlci4KIAkgKi8KIAlpZiAoc2VjaWQgPT0gMCkKLQkJcmV0dXJuIHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1dSSVRFLCAmYWQpOworCQlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgTUFZX1dSSVRFLAorCQkJCSAgJmFkKTsKIAkvKgogCSAqIElmIHRoZSBzZWNpZCBpc24ndCAwIHdlJ3JlIGRlYWxpbmcgd2l0aCBzb21lIFVTQiBJTwogCSAqIHNwZWNpZmljIGJlaGF2aW9yLiBUaGlzIGlzIG5vdCBjbGVhbi4gRm9yIG9uZSB0aGluZwogCSAqIHdlIGNhbid0IHRha2UgcHJpdmlsZWdlIGludG8gYWNjb3VudC4KIAkgKi8KLQlyZXR1cm4gc21rX2FjY2VzcyhzbWFja19mcm9tX3NlY2lkKHNlY2lkKSwgdGFza19zZWN1cml0eShwKSwKLQkJCSAgTUFZX1dSSVRFLCAmYWQpOworCXJldHVybiBzbWtfYWNjZXNzKHNtYWNrX2Zyb21fc2VjaWQoc2VjaWQpLAorCQkJICBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTEzNTIsMTIgKzE0MzQsMTIgQEAKIHN0YXRpYyBpbnQgc21hY2tfdGFza193YWl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7Ci0JY2hhciAqc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7Ci0JY2hhciAqdHNwID0gdGFza19zZWN1cml0eShwKTsKKwljaGFyICpzcCA9IHNta19vZl9jdXJyZW50KCk7CisJY2hhciAqdHNwID0gc21rX29mX2ZvcmtlZCh0YXNrX3NlY3VyaXR5KHApKTsKIAlpbnQgcmM7CiAKIAkvKiB3ZSBkb24ndCBsb2cgaGVyZSwgd2UgY2FuIGJlIG92ZXJyaWRlbiAqLwotCXJjID0gc21rX2FjY2VzcyhzcCwgdHNwLCBNQVlfV1JJVEUsIE5VTEwpOworCXJjID0gc21rX2FjY2Vzcyh0c3AsIHNwLCBNQVlfV1JJVEUsIE5VTEwpOwogCWlmIChyYyA9PSAwKQogCQlnb3RvIG91dF9sb2c7CiAKQEAgLTEzNzgsNyArMTQ2MCw3IEBACiAgb3V0X2xvZzoKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCBwKTsKLQlzbWFja19sb2coc3AsIHRzcCwgTUFZX1dSSVRFLCByYywgJmFkKTsKKwlzbWFja19sb2codHNwLCBzcCwgTUFZX1dSSVRFLCByYywgJmFkKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEzOTIsNyArMTQ3NCw3IEBACiBzdGF0aWMgdm9pZCBzbWFja190YXNrX3RvX2lub2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcCA9IGlub2RlLT5pX3NlY3VyaXR5OwotCWlzcC0+c21rX2lub2RlID0gdGFza19zZWN1cml0eShwKTsKKwlpc3AtPnNta19pbm9kZSA9IHNta19vZl90YXNrKHRhc2tfc2VjdXJpdHkocCkpOwogfQogCiAvKgpAQCAtMTQxMSw3ICsxNDkzLDcgQEAKICAqLwogc3RhdGljIGludCBzbWFja19za19hbGxvY19zZWN1cml0eShzdHJ1Y3Qgc29jayAqc2ssIGludCBmYW1pbHksIGdmcF90IGdmcF9mbGFncykKIHsKLQljaGFyICpjc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJY2hhciAqY3NwID0gc21rX29mX2N1cnJlbnQoKTsKIAlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3A7CiAKIAlzc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2V0X3NtYWNrKSwgZ2ZwX2ZsYWdzKTsKQEAgLTE2NjcsMTAgKzE3NDksMTMgQEAKIAkJc3NwLT5zbWtfaW4gPSBzcDsKIAllbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfU01BQ0tfSVBPVVQpID09IDApIHsKIAkJc3NwLT5zbWtfb3V0ID0gc3A7Ci0JCXJjID0gc21hY2tfbmV0bGFiZWwoc29jay0+c2ssIFNNQUNLX0NJUFNPX1NPQ0tFVCk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCAtcmMpOworCQlpZiAoc29jay0+c2stPnNrX2ZhbWlseSAhPSBQRl9VTklYKSB7CisJCQlyYyA9IHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOworCQkJaWYgKHJjICE9IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiU21hY2s6IFwiJXNcIiBuZXRsYmwgZXJyb3IgJWQuXG4iLAorCQkJCQlfX2Z1bmNfXywgLXJjKTsKKwkJfQogCX0gZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKQEAgLTE3NDksNyArMTgzNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfbXNnX21zZ19hbGxvY19zZWN1cml0eShzdHJ1Y3QgbXNnX21zZyAqbXNnKQogewotCW1zZy0+c2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJbXNnLT5zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3ODUsNyArMTg3MCw3IEBACiB7CiAJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlzcCA9ICZzaHAtPnNobV9wZXJtOwogCi0JaXNwLT5zZWN1cml0eSA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwlpc3AtPnNlY3VyaXR5ID0gc21rX29mX2N1cnJlbnQoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTkwOCw3ICsxOTkzLDcgQEAKIHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXNwID0gJnNtYS0+c2VtX3Blcm07CiAKLQlpc3AtPnNlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCWlzcC0+c2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDI2LDcgKzIxMTEsNyBAQAogewogCXN0cnVjdCBrZXJuX2lwY19wZXJtICpraXNwID0gJm1zcS0+cV9wZXJtOwogCi0Ja2lzcC0+c2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJa2lzcC0+c2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTk4LDkgKzIyODMsMTEgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicDsKIAlzdHJ1Y3Qgc3VwZXJibG9ja19zbWFjayAqc2JzcDsKIAlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKLQljaGFyICpjc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJY2hhciAqY3NwID0gc21rX29mX2N1cnJlbnQoKTsKIAljaGFyICpmZXRjaGVkOwogCWNoYXIgKmZpbmFsOworCWNoYXIgdHJhdHRyW1RSQU5TX1RSVUVfU0laRV07CisJaW50IHRyYW5zZmxhZyA9IDA7CiAJc3RydWN0IGRlbnRyeSAqZHA7CiAKIAlpZiAoaW5vZGUgPT0gTlVMTCkKQEAgLTIyNjcsOSArMjM1NCwxMCBAQAogCQlicmVhazsKIAljYXNlIFNPQ0tGU19NQUdJQzoKIAkJLyoKLQkJICogQ2FzZXkgc2F5cyBzb2NrZXRzIGdldCB0aGUgc21hY2sgb2YgdGhlIHRhc2suCisJCSAqIFNvY2tldCBhY2Nlc3MgaXMgY29udHJvbGxlZCBieSB0aGUgc29ja2V0CisJCSAqIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGludm9sdmVkLgogCQkgKi8KLQkJZmluYWwgPSBjc3A7CisJCWZpbmFsID0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd247CiAJCWJyZWFrOwogCWNhc2UgUFJPQ19TVVBFUl9NQUdJQzoKIAkJLyoKQEAgLTIyOTYsNyArMjM4NCwxNiBAQAogCQkvKgogCQkgKiBUaGlzIGlzbid0IGFuIHVuZGVyc3Rvb2Qgc3BlY2lhbCBjYXNlLgogCQkgKiBHZXQgdGhlIHZhbHVlIGZyb20gdGhlIHhhdHRyLgotCQkgKgorCQkgKi8KKworCQkvKgorCQkgKiBVTklYIGRvbWFpbiBzb2NrZXRzIHVzZSBsb3dlciBsZXZlbCBzb2NrZXQgZGF0YS4KKwkJICovCisJCWlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkgeworCQkJZmluYWwgPSBzbWFja19rbm93bl9zdGFyLnNta19rbm93bjsKKwkJCWJyZWFrOworCQl9CisJCS8qCiAJCSAqIE5vIHhhdHRyIHN1cHBvcnQgbWVhbnMsIGFsYXMsIG5vIFNNQUNLIGxhYmVsLgogCQkgKiBVc2UgdGhlIGFmb3JlYXBwbGllZCBkZWZhdWx0LgogCQkgKiBJdCB3b3VsZCBiZSBjdXJpb3VzIGlmIHRoZSBsYWJlbCBvZiB0aGUgdGFzawpAQCAtMjMwOCw5ICsyNDA1LDIxIEBACiAJCSAqIEdldCB0aGUgZGVudHJ5IGZvciB4YXR0ci4KIAkJICovCiAJCWRwID0gZGdldChvcHRfZGVudHJ5KTsKLQkJZmV0Y2hlZCA9IHNta19mZXRjaChpbm9kZSwgZHApOwotCQlpZiAoZmV0Y2hlZCAhPSBOVUxMKQorCQlmZXRjaGVkID0gc21rX2ZldGNoKFhBVFRSX05BTUVfU01BQ0ssIGlub2RlLCBkcCk7CisJCWlmIChmZXRjaGVkICE9IE5VTEwpIHsKIAkJCWZpbmFsID0gZmV0Y2hlZDsKKwkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQkJdHJhdHRyWzBdID0gJ1wwJzsKKwkJCQlpbm9kZS0+aV9vcC0+Z2V0eGF0dHIoZHAsCisJCQkJCVhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUsCisJCQkJCXRyYXR0ciwgVFJBTlNfVFJVRV9TSVpFKTsKKwkJCQlpZiAoc3RybmNtcCh0cmF0dHIsIFRSQU5TX1RSVUUsCisJCQkJCSAgICBUUkFOU19UUlVFX1NJWkUpID09IDApCisJCQkJCXRyYW5zZmxhZyA9IFNNS19JTk9ERV9UUkFOU01VVEU7CisJCQl9CisJCX0KKwkJaXNwLT5zbWtfdGFzayA9IHNta19mZXRjaChYQVRUUl9OQU1FX1NNQUNLRVhFQywgaW5vZGUsIGRwKTsKKwogCQlkcHV0KGRwKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjMyMCw3ICsyNDI5LDcgQEAKIAllbHNlCiAJCWlzcC0+c21rX2lub2RlID0gZmluYWw7CiAKLQlpc3AtPnNta19mbGFncyB8PSBTTUtfSU5PREVfSU5TVEFOVDsKKwlpc3AtPnNta19mbGFncyB8PSAoU01LX0lOT0RFX0lOU1RBTlQgfCB0cmFuc2ZsYWcpOwogCiB1bmxvY2thbmRvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZpc3AtPnNta19sb2NrKTsKQEAgLTIzNDUsNyArMjQ1NCw3IEBACiAJaWYgKHN0cmNtcChuYW1lLCAiY3VycmVudCIpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY3AgPSBrc3RyZHVwKHRhc2tfc2VjdXJpdHkocCksIEdGUF9LRVJORUwpOworCWNwID0ga3N0cmR1cChzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMzY5LDYgKzI0NzgsOCBAQAogc3RhdGljIGludCBzbWFja19zZXRwcm9jYXR0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKm5hbWUsCiAJCQkgICAgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKKwlzdHJ1Y3QgdGFza19zbWFjayAqdHNwOworCXN0cnVjdCB0YXNrX3NtYWNrICpvbGR0c3A7CiAJc3RydWN0IGNyZWQgKm5ldzsKIAljaGFyICpuZXdzbWFjazsKIApAQCAtMjM5OCwxMCArMjUwOSwxOCBAQAogCWlmIChuZXdzbWFjayA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duKQogCQlyZXR1cm4gLUVQRVJNOwogCisJb2xkdHNwID0gcC0+Y3JlZC0+c2VjdXJpdHk7CiAJbmV3ID0gcHJlcGFyZV9jcmVkcygpOwogCWlmIChuZXcgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbmV3LT5zZWN1cml0eSA9IG5ld3NtYWNrOworCXRzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX3NtYWNrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRzcCA9PSBOVUxMKSB7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl0c3AtPnNta190YXNrID0gbmV3c21hY2s7CisJdHNwLT5zbWtfZm9ya2VkID0gb2xkdHNwLT5zbWtfZm9ya2VkOworCW5ldy0+c2VjdXJpdHkgPSB0c3A7CiAJY29tbWl0X2NyZWRzKG5ldyk7CiAJcmV0dXJuIHNpemU7CiB9CkBAIC0yNDE4LDE0ICsyNTM3LDE4IEBACiBzdGF0aWMgaW50IHNtYWNrX3VuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNvY2ssCiAJCQkJICAgICBzdHJ1Y3Qgc29jayAqb3RoZXIsIHN0cnVjdCBzb2NrICpuZXdzaykKIHsKLQlzdHJ1Y3QgaW5vZGUgKnNwID0gU09DS19JTk9ERShzb2NrLT5za19zb2NrZXQpOwotCXN0cnVjdCBpbm9kZSAqb3AgPSBTT0NLX0lOT0RFKG90aGVyLT5za19zb2NrZXQpOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrX3NlY3VyaXR5OworCXN0cnVjdCBzb2NrZXRfc21hY2sgKm9zcCA9IG90aGVyLT5za19zZWN1cml0eTsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJaW50IHJjID0gMDsKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CiAJc21rX2FkX3NldGZpZWxkX3VfbmV0X3NrKCZhZCwgb3RoZXIpOwotCXJldHVybiBzbWtfYWNjZXNzKHNta19vZl9pbm9kZShzcCksIHNta19vZl9pbm9kZShvcCksCi0JCQkJIE1BWV9SRUFEV1JJVEUsICZhZCk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19PVkVSUklERSkpCisJCXJjID0gc21rX2FjY2Vzcyhzc3AtPnNta19vdXQsIG9zcC0+c21rX2luLCBNQVlfV1JJVEUsICZhZCk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMjQzOCwxMyArMjU2MSwxOCBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX3VuaXhfbWF5X3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqb3RoZXIpCiB7Ci0Jc3RydWN0IGlub2RlICpzcCA9IFNPQ0tfSU5PREUoc29jayk7Ci0Jc3RydWN0IGlub2RlICpvcCA9IFNPQ0tfSU5PREUob3RoZXIpOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpvc3AgPSBvdGhlci0+c2stPnNrX3NlY3VyaXR5OwogCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKKwlpbnQgcmMgPSAwOwogCiAJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfTkVUKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV9uZXRfc2soJmFkLCBvdGhlci0+c2spOwotCXJldHVybiBzbWtfYWNjZXNzKHNta19vZl9pbm9kZShzcCksIHNta19vZl9pbm9kZShvcCksIE1BWV9XUklURSwgJmFkKTsKKworCWlmICghY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKKwkJcmMgPSBzbWtfYWNjZXNzKHNzcC0+c21rX291dCwgb3NwLT5zbWtfaW4sIE1BWV9XUklURSwgJmFkKTsKKworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0yNjI5LDcgKzI3NTcsNyBAQAogCiAvKioKICAqIHNtYWNrX3NvY2tldF9nZXRwZWVyc2VjX2RncmFtIC0gcHVsbCBpbiBwYWNrZXQgbGFiZWwKLSAqIEBzb2NrOiB0aGUgc29ja2V0CisgKiBAc29jazogdGhlIHBlZXIgc29ja2V0CiAgKiBAc2tiOiBwYWNrZXQgZGF0YQogICogQHNlY2lkOiBwb2ludGVyIHRvIHdoZXJlIHRvIHB1dCB0aGUgc2VjaWQgb2YgdGhlIHBhY2tldAogICoKQEAgLTI2NDAsNDEgKzI3NjgsMzkgQEAKIAogewogCXN0cnVjdCBuZXRsYmxfbHNtX3NlY2F0dHIgc2VjYXR0cjsKLQlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNvY2tldF9zbWFjayAqc3A7CiAJY2hhciBzbWFja1tTTUtfTEFCRUxMRU5dOwotCWludCBmYW1pbHkgPSBQRl9JTkVUOwotCXUzMiBzOworCWludCBmYW1pbHkgPSBQRl9VTlNQRUM7CisJdTMyIHMgPSAwOwkvKiAwIGlzIHRoZSBpbnZhbGlkIHNlY2lkICovCiAJaW50IHJjOwogCi0JLyoKLQkgKiBPbmx5IHdvcmtzIGZvciBmYW1pbGllcyB3aXRoIHBhY2tldHMuCi0JICovCi0JaWYgKHNvY2sgIT0gTlVMTCkgewotCQlzayA9IHNvY2stPnNrOwotCQlpZiAoc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUICYmIHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVDYpCi0JCQlyZXR1cm4gMDsKLQkJZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQkJZmFtaWx5ID0gUEZfSU5FVDsKKwkJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJCWZhbWlseSA9IFBGX0lORVQ2OwogCX0KLQkvKgotCSAqIFRyYW5zbGF0ZSB3aGF0IG5ldGxhYmVsIGdhdmUgdXMuCi0JICovCi0JbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7Ci0JcmMgPSBuZXRsYmxfc2tidWZmX2dldGF0dHIoc2tiLCBmYW1pbHksICZzZWNhdHRyKTsKLQlpZiAocmMgPT0gMCkKLQkJc21hY2tfZnJvbV9zZWNhdHRyKCZzZWNhdHRyLCBzbWFjayk7Ci0JbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJaWYgKGZhbWlseSA9PSBQRl9VTlNQRUMgJiYgc29jayAhPSBOVUxMKQorCQlmYW1pbHkgPSBzb2NrLT5zay0+c2tfZmFtaWx5OwogCi0JLyoKLQkgKiBHaXZlIHVwIGlmIHdlIGNvdWxkbid0IGdldCBhbnl0aGluZwotCSAqLwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzID0gc21hY2tfdG9fc2VjaWQoc21hY2spOworCWlmIChmYW1pbHkgPT0gUEZfVU5JWCkgeworCQlzcCA9IHNvY2stPnNrLT5za19zZWN1cml0eTsKKwkJcyA9IHNtYWNrX3RvX3NlY2lkKHNwLT5zbWtfb3V0KTsKKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBQRl9JTkVUIHx8IGZhbWlseSA9PSBQRl9JTkVUNikgeworCQkvKgorCQkgKiBUcmFuc2xhdGUgd2hhdCBuZXRsYWJlbCBnYXZlIHVzLgorCQkgKi8KKwkJbmV0bGJsX3NlY2F0dHJfaW5pdCgmc2VjYXR0cik7CisJCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgZmFtaWx5LCAmc2VjYXR0cik7CisJCWlmIChyYyA9PSAwKSB7CisJCQlzbWFja19mcm9tX3NlY2F0dHIoJnNlY2F0dHIsIHNtYWNrKTsKKwkJCXMgPSBzbWFja190b19zZWNpZChzbWFjayk7CisJCX0KKwkJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CisJfQorCSpzZWNpZCA9IHM7CiAJaWYgKHMgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqc2VjaWQgPSBzOwogCXJldHVybiAwOwogfQogCkBAIC0yNjk1LDcgKzI4MjEsNyBAQAogCQlyZXR1cm47CiAKIAlzc3AgPSBzay0+c2tfc2VjdXJpdHk7Ci0Jc3NwLT5zbWtfaW4gPSBzc3AtPnNta19vdXQgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJc3NwLT5zbWtfaW4gPSBzc3AtPnNta19vdXQgPSBzbWtfb2ZfY3VycmVudCgpOwogCS8qIGNzc3AtPnNta19wYWNrZXQgaXMgYWxyZWFkeSBzZXQgaW4gc21hY2tfaW5ldF9jc2tfY2xvbmUoKSAqLwogfQogCkBAIC0yODE2LDcgKzI5NDIsNyBAQAogc3RhdGljIGludCBzbWFja19rZXlfYWxsb2Moc3RydWN0IGtleSAqa2V5LCBjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0Ja2V5LT5zZWN1cml0eSA9IGNyZWQtPnNlY3VyaXR5OworCWtleS0+c2VjdXJpdHkgPSBzbWtfb2ZfdGFzayhjcmVkLT5zZWN1cml0eSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4NDUsNiArMjk3MSw3IEBACiB7CiAJc3RydWN0IGtleSAqa2V5cDsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJY2hhciAqdHNwID0gc21rX29mX3Rhc2soY3JlZC0+c2VjdXJpdHkpOwogCiAJa2V5cCA9IGtleV9yZWZfdG9fcHRyKGtleV9yZWYpOwogCWlmIChrZXlwID09IE5VTEwpCkBAIC0yODU4LDE0ICsyOTg1LDE0IEBACiAJLyoKIAkgKiBUaGlzIHNob3VsZCBub3Qgb2NjdXIKIAkgKi8KLQlpZiAoY3JlZC0+c2VjdXJpdHkgPT0gTlVMTCkKKwlpZiAodHNwID09IE5VTEwpCiAJCXJldHVybiAtRUFDQ0VTOwogI2lmZGVmIENPTkZJR19BVURJVAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0tFWSk7CiAJYWQuYS51LmtleV9zdHJ1Y3Qua2V5ID0ga2V5cC0+c2VyaWFsOwogCWFkLmEudS5rZXlfc3RydWN0LmtleV9kZXNjID0ga2V5cC0+ZGVzY3JpcHRpb247CiAjZW5kaWYKLQlyZXR1cm4gc21rX2FjY2VzcyhjcmVkLT5zZWN1cml0eSwga2V5cC0+c2VjdXJpdHksCisJcmV0dXJuIHNta19hY2Nlc3ModHNwLCBrZXlwLT5zZWN1cml0eSwKIAkJCQkgTUFZX1JFQURXUklURSwgJmFkKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfS0VZUyAqLwpAQCAtMzA2Nyw2ICszMTk0LDggQEAKIAkuc2JfbW91bnQgPSAJCQlzbWFja19zYl9tb3VudCwKIAkuc2JfdW1vdW50ID0gCQkJc21hY2tfc2JfdW1vdW50LAogCisJLmJwcm1fc2V0X2NyZWRzID0JCXNtYWNrX2Jwcm1fc2V0X2NyZWRzLAorCiAJLmlub2RlX2FsbG9jX3NlY3VyaXR5ID0gCXNtYWNrX2lub2RlX2FsbG9jX3NlY3VyaXR5LAogCS5pbm9kZV9mcmVlX3NlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9mcmVlX3NlY3VyaXR5LAogCS5pbm9kZV9pbml0X3NlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9pbml0X3NlY3VyaXR5LApAQCAtMzIwMyw5ICszMzMyLDE2IEBACiBzdGF0aWMgX19pbml0IGludCBzbWFja19pbml0KHZvaWQpCiB7CiAJc3RydWN0IGNyZWQgKmNyZWQ7CisJc3RydWN0IHRhc2tfc21hY2sgKnRzcDsKIAotCWlmICghc2VjdXJpdHlfbW9kdWxlX2VuYWJsZSgmc21hY2tfb3BzKSkKKwl0c3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFza19zbWFjayksIEdGUF9LRVJORUwpOworCWlmICh0c3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIXNlY3VyaXR5X21vZHVsZV9lbmFibGUoJnNtYWNrX29wcykpIHsKKwkJa2ZyZWUodHNwKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiU21hY2s6ICBJbml0aWFsaXppbmcuXG4iKTsKIApAQCAtMzIxMyw3ICszMzQ5LDkgQEAKIAkgKiBTZXQgdGhlIHNlY3VyaXR5IHN0YXRlIGZvciB0aGUgaW5pdGlhbCB0YXNrLgogCSAqLwogCWNyZWQgPSAoc3RydWN0IGNyZWQgKikgY3VycmVudC0+Y3JlZDsKLQljcmVkLT5zZWN1cml0eSA9ICZzbWFja19rbm93bl9mbG9vci5zbWtfa25vd247CisJdHNwLT5zbWtfZm9ya2VkID0gc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duOworCXRzcC0+c21rX3Rhc2sgPSBzbWFja19rbm93bl9mbG9vci5zbWtfa25vd247CisJY3JlZC0+c2VjdXJpdHkgPSB0c3A7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBzbWFja19rbm93X2xpc3QgKi8KIAlpbml0X3NtYWNrX2tub3dfbGlzdCgpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IGRjMWZkNjIuLjM2MmQ1ZWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTEwOSw5ICsxMDksMTIgQEAKICAqIFNNS19BQ0NFU1NMRU46IE1heGltdW0gbGVuZ3RoIGZvciBhIHJ1bGUgYWNjZXNzIGZpZWxkCiAgKiBTTUtfTE9BRExFTjogU21hY2sgcnVsZSBsZW5ndGgKICAqLwotI2RlZmluZSBTTUtfQUNDRVNTICAgICJyd3hhIgotI2RlZmluZSBTTUtfQUNDRVNTTEVOIChzaXplb2YoU01LX0FDQ0VTUykgLSAxKQotI2RlZmluZSBTTUtfTE9BRExFTiAgIChTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfQUNDRVNTTEVOKQorI2RlZmluZSBTTUtfT0FDQ0VTUwkicnd4YSIKKyNkZWZpbmUgU01LX0FDQ0VTUwkicnd4YXQiCisjZGVmaW5lIFNNS19PQUNDRVNTTEVOCShzaXplb2YoU01LX09BQ0NFU1MpIC0gMSkKKyNkZWZpbmUgU01LX0FDQ0VTU0xFTgkoc2l6ZW9mKFNNS19BQ0NFU1MpIC0gMSkKKyNkZWZpbmUgU01LX09MT0FETEVOCShTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfT0FDQ0VTU0xFTikKKyNkZWZpbmUgU01LX0xPQURMRU4JKFNNS19MQUJFTExFTiArIFNNS19MQUJFTExFTiArIFNNS19BQ0NFU1NMRU4pCiAKIC8qKgogICogc21rX25ldGxhYmVsX2F1ZGl0X3NldCAtIGZpbGwgYSBuZXRsYmxfYXVkaXQgc3RydWN0CkBAIC0xMjEsNyArMTI0LDcgQEAKIHsKIAluYXAtPmxvZ2ludWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpOwogCW5hcC0+c2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KTsKLQluYXAtPnNlY2lkID0gc21hY2tfdG9fc2VjaWQoY3VycmVudF9zZWN1cml0eSgpKTsKKwluYXAtPnNlY2lkID0gc21hY2tfdG9fc2VjaWQoc21rX29mX2N1cnJlbnQoKSk7CiB9CiAKIC8qCkBAIC0xNzUsNiArMTc4LDggQEAKIAkJc2VxX3B1dGMocywgJ3gnKTsKIAlpZiAoc3JwLT5zbWtfYWNjZXNzICYgTUFZX0FQUEVORCkKIAkJc2VxX3B1dGMocywgJ2EnKTsKKwlpZiAoc3JwLT5zbWtfYWNjZXNzICYgTUFZX1RSQU5TTVVURSkKKwkJc2VxX3B1dGMocywgJ3QnKTsKIAlpZiAoc3JwLT5zbWtfYWNjZXNzID09IDApCiAJCXNlcV9wdXRjKHMsICctJyk7CiAKQEAgLTI3MywxMCArMjc4LDE1IEBACiAJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCpwcG9zICE9IDAgfHwgY291bnQgIT0gU01LX0xPQURMRU4pCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogTWlub3IgaGFjayBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQorCSAqLworCWlmIChjb3VudCA8IChTTUtfT0xPQURMRU4pIHx8IGNvdW50ID4gU01LX0xPQURMRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGF0YSA9IGt6YWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWRhdGEgPSBremFsbG9jKFNNS19MT0FETEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjg1LDYgKzI5NSwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwkvKgorCSAqIE1vcmUgb24gdGhlIG1pbm9yIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKKwkgKi8KKwlpZiAoY291bnQgPT0gKFNNS19PTE9BRExFTikpCisJCWRhdGFbU01LX09MT0FETEVOXSA9ICctJzsKKwogCXJ1bGUgPSBremFsbG9jKHNpemVvZigqcnVsZSksIEdGUF9LRVJORUwpOwogCWlmIChydWxlID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtMzQ1LDYgKzM2MSwxNyBAQAogCQlnb3RvIG91dF9mcmVlX3J1bGU7CiAJfQogCisJc3dpdGNoIChkYXRhW1NNS19MQUJFTExFTiArIFNNS19MQUJFTExFTiArIDRdKSB7CisJY2FzZSAnLSc6CisJCWJyZWFrOworCWNhc2UgJ3QnOgorCWNhc2UgJ1QnOgorCQlydWxlLT5zbWtfYWNjZXNzIHw9IE1BWV9UUkFOU01VVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2ZyZWVfcnVsZTsKKwl9CisKIAlyYyA9IHNta19zZXRfYWNjZXNzKHJ1bGUpOwogCiAJaWYgKCFyYykKQEAgLTExNjAsNyArMTE4Nyw3IEBACiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCWNoYXIgaW5bU01LX0xBQkVMTEVOXTsKLQljaGFyICpzcCA9IGN1cnJlbnQtPmNyZWQtPnNlY3VyaXR5OworCWNoYXIgKnNwID0gc21rX29mX3Rhc2soY3VycmVudC0+Y3JlZC0+c2VjdXJpdHkpOwogCiAJaWYgKCFjYXBhYmxlKENBUF9NQUNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpkaWZmIC0tZ2l0IGEvc291bmQvYWM5N19idXMuYyBiL3NvdW5kL2FjOTdfYnVzLmMKaW5kZXggYTM1MWRkMC4uMmI1MGNiZSAxMDA2NDQKLS0tIGEvc291bmQvYWM5N19idXMuYworKysgYi9zb3VuZC9hYzk3X2J1cy5jCkBAIC0xOSw4ICsxOSw4IEBACiAKIC8qCiAgKiBMZXQgZHJpdmVycyBkZWNpZGUgd2hldGhlciB0aGV5IHdhbnQgdG8gc3VwcG9ydCBnaXZlbiBjb2RlYyBmcm9tIHRoZWlyCi0gKiBwcm9iZSBtZXRob2QuICBEcml2ZXJzIGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgc3RydWN0IHNuZF9hYzk3IHN0cnVjdHVyZSBhbmQgbWF5Ci0gKiBkZWNpZGUgYmFzZWQgb24gdGhlIGlkIGZpZWxkIGFtb25nc3Qgb3RoZXIgdGhpbmdzLgorICogcHJvYmUgbWV0aG9kLiBEcml2ZXJzIGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgc3RydWN0IHNuZF9hYzk3CisgKiBzdHJ1Y3R1cmUgYW5kIG1heSAgZGVjaWRlIGJhc2VkIG9uIHRoZSBpZCBmaWVsZCBhbW9uZ3N0IG90aGVyIHRoaW5ncy4KICAqLwogc3RhdGljIGludCBhYzk3X2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL29ueXguYyBiL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jCmluZGV4IDkxODUyZTQuLjM2ODdhNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvb255eC5jCkBAIC0xMTE0LDcgKzExMTQsNiBAQAogCW9mX25vZGVfcHV0KG9ueXgtPmNvZGVjLm5vZGUpOwogCWlmIChvbnl4LT5jb2RlY19pbmZvKQogCQlrZnJlZShvbnl4LT5jb2RlY19pbmZvKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBvbnl4KTsKIAlrZnJlZShvbnl4KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL2dwaW8tZmVhdHVyZS5jIGIvc291bmQvYW9hL2NvcmUvZ3Bpby1mZWF0dXJlLmMKaW5kZXggZGU4ZTAzYS4uZmFhMzE3NCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2NvcmUvZ3Bpby1mZWF0dXJlLmMKKysrIGIvc291bmQvYW9hL2NvcmUvZ3Bpby1mZWF0dXJlLmMKQEAgLTI4NywxMCArMjg3LDkgQEAKIAkJZnJlZV9pcnEobGluZWluX2RldGVjdF9pcnEsICZydC0+bGluZV9pbl9ub3RpZnkpOwogCWlmIChydC0+bGluZV9vdXRfbm90aWZ5LmdwaW9fcHJpdmF0ZSkKIAkJZnJlZV9pcnEobGluZW91dF9kZXRlY3RfaXJxLCAmcnQtPmxpbmVfb3V0X25vdGlmeSk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmhlYWRwaG9uZV9ub3RpZnkud29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmspOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ0LT5saW5lX291dF9ub3RpZnkud29yayk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJ0LT5oZWFkcGhvbmVfbm90aWZ5LndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnQtPmxpbmVfb3V0X25vdGlmeS53b3JrKTsKIAltdXRleF9kZXN0cm95KCZydC0+aGVhZHBob25lX25vdGlmeS5tdXRleCk7CiAJbXV0ZXhfZGVzdHJveSgmcnQtPmxpbmVfaW5fbm90aWZ5Lm11dGV4KTsKIAltdXRleF9kZXN0cm95KCZydC0+bGluZV9vdXRfbm90aWZ5Lm11dGV4KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL2dwaW8tcG1mLmMgYi9zb3VuZC9hb2EvY29yZS9ncGlvLXBtZi5jCmluZGV4IDdlMjY3YzkuLmM4ZDhhMWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb3JlL2dwaW8tcG1mLmMKKysrIGIvc291bmQvYW9hL2NvcmUvZ3Bpby1wbWYuYwpAQCAtMTA3LDEwICsxMDcsOSBAQAogCiAJLyogbWFrZSBzdXJlIG5vIHdvcmsgaXMgcGVuZGluZyBiZWZvcmUgZnJlZWluZwogCSAqIGFsbCB0aGluZ3MgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrKCZydC0+aGVhZHBob25lX25vdGlmeS53b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZydC0+bGluZV9pbl9ub3RpZnkud29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmxpbmVfb3V0X25vdGlmeS53b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnQtPmhlYWRwaG9uZV9ub3RpZnkud29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydC0+bGluZV9pbl9ub3RpZnkud29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZydC0+bGluZV9vdXRfbm90aWZ5LndvcmspOwogCiAJbXV0ZXhfZGVzdHJveSgmcnQtPmhlYWRwaG9uZV9ub3RpZnkubXV0ZXgpOwogCW11dGV4X2Rlc3Ryb3koJnJ0LT5saW5lX2luX25vdGlmeS5tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbnRyb2wuYyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCmluZGV4IDQ1YTgxODAuLjljZTAwZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29udHJvbC5jCisrKyBiL3NvdW5kL2NvcmUvY29udHJvbC5jCkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogfQogCiAvKgotICogRnJlcXVlbnRseSB1c2VkIGNvbnRyb2wgY2FsbGJhY2tzCisgKiBGcmVxdWVudGx5IHVzZWQgY29udHJvbCBjYWxsYmFja3MvaGVscGVycwogICovCiBpbnQgc25kX2N0bF9ib29sZWFuX21vbm9faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCkBAIC0xNTEzLDMgKzE1MTMsMjkgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChzbmRfY3RsX2Jvb2xlYW5fc3RlcmVvX2luZm8pOworCisvKioKKyAqIHNuZF9jdGxfZW51bV9pbmZvIC0gZmlsbHMgdGhlIGluZm8gc3RydWN0dXJlIGZvciBhbiBlbnVtZXJhdGVkIGNvbnRyb2wKKyAqIEBpbmZvOiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorICogQGNoYW5uZWxzOiB0aGUgbnVtYmVyIG9mIHRoZSBjb250cm9sJ3MgY2hhbm5lbHM7IG9mdGVuIG9uZQorICogQGl0ZW1zOiB0aGUgbnVtYmVyIG9mIGNvbnRyb2wgdmFsdWVzOyBhbHNvIHRoZSBzaXplIG9mIEBuYW1lcworICogQG5hbWVzOiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBhbGwgY29udHJvbCB2YWx1ZXMKKyAqCisgKiBTZXRzIGFsbCByZXF1aXJlZCBmaWVsZHMgaW4gQGluZm8gdG8gdGhlaXIgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogSWYgdGhlIGNvbnRyb2wncyBhY2Nlc3NpYmlsaXR5IGlzIG5vdCB0aGUgZGVmYXVsdCAocmVhZGFibGUgYW5kIHdyaXRhYmxlKSwKKyAqIHRoZSBjYWxsZXIgaGFzIHRvIGZpbGwgQGluZm8tPmFjY2Vzcy4KKyAqLworaW50IHNuZF9jdGxfZW51bV9pbmZvKHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbywgdW5zaWduZWQgaW50IGNoYW5uZWxzLAorCQkgICAgICB1bnNpZ25lZCBpbnQgaXRlbXMsIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10pCit7CisJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwlpbmZvLT5jb3VudCA9IGNoYW5uZWxzOworCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBpdGVtczsKKwlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IGl0ZW1zKQorCQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBpdGVtcyAtIDE7CisJc3RybGNweShpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJCW5hbWVzW2luZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0sCisJCXNpemVvZihpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUpKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc25kX2N0bF9lbnVtX2luZm8pOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbml0LmMgYi9zb3VuZC9jb3JlL2luaXQuYwppbmRleCA1N2I3OTJlMi4uM2U2NWRhMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogICogIGV4dGVybmFsIGFjY2Vzc2VzLiAgVGh1cywgeW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgdGhlIGVuZAogICogIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FyZC4KICAqCi0gKiAgUmV0dXJucyB6ZXJvIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHJlZ2lzdHJhaW4gZmFpbGVkLgorICogIFJldHVybnMgemVybyBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSByZWdpc3RyYXRpb24gZmFpbGVkLgogICovCiBpbnQgc25kX2NhcmRfcmVnaXN0ZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCmluZGV4IGI3NTNlYzYuLmEyZTRlYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKQEAgLTQ1Myw4ICs0NTMsMTAgQEAKIAl9IGVsc2UgewogCQkqcGFyYW1zID0gKnNhdmU7CiAJCW1heCA9IHNuZF9wY21faHdfcGFyYW1fbWF4KHBjbSwgcGFyYW1zLCB2YXIsIG1heCwgJm1heGRpcik7Ci0JCWlmIChtYXggPCAwKQorCQlpZiAobWF4IDwgMCkgeworCQkJa2ZyZWUoc2F2ZSk7CiAJCQlyZXR1cm4gbWF4OworCQl9CiAJCWxhc3QgPSAxOwogCX0KICBfZW5kOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbGliLmMgYi9zb3VuZC9jb3JlL3BjbV9saWIuYwppbmRleCAxMTQ0NmExLi5hODJlMzc1NiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTM3Myw2ICszNzMsMjcgQEAKIAkJCSAgICh1bnNpZ25lZCBsb25nKW5ld19od19wdHIsCiAJCQkgICAodW5zaWduZWQgbG9uZylydW50aW1lLT5od19wdHJfYmFzZSk7CiAJfQorCisJaWYgKHJ1bnRpbWUtPm5vX3BlcmlvZF93YWtldXApIHsKKwkJLyoKKwkJICogV2l0aG91dCByZWd1bGFyIHBlcmlvZCBpbnRlcnJ1cHRzLCB3ZSBoYXZlIHRvIGNoZWNrCisJCSAqIHRoZSBlbGFwc2VkIHRpbWUgdG8gZGV0ZWN0IHhydW5zLgorCQkgKi8KKwkJamRlbHRhID0gamlmZmllcyAtIHJ1bnRpbWUtPmh3X3B0cl9qaWZmaWVzOworCQlpZiAoamRlbHRhIDwgcnVudGltZS0+aHdfcHRyX2J1ZmZlcl9qaWZmaWVzIC8gMikKKwkJCWdvdG8gbm9fZGVsdGFfY2hlY2s7CisJCWhkZWx0YSA9IGpkZWx0YSAtIGRlbHRhICogSFogLyBydW50aW1lLT5yYXRlOworCQl3aGlsZSAoaGRlbHRhID4gcnVudGltZS0+aHdfcHRyX2J1ZmZlcl9qaWZmaWVzIC8gMiArIDEpIHsKKwkJCWRlbHRhICs9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOworCQkJaHdfYmFzZSArPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKwkJCWlmIChod19iYXNlID49IHJ1bnRpbWUtPmJvdW5kYXJ5KQorCQkJCWh3X2Jhc2UgPSAwOworCQkJbmV3X2h3X3B0ciA9IGh3X2Jhc2UgKyBwb3M7CisJCQloZGVsdGEgLT0gcnVudGltZS0+aHdfcHRyX2J1ZmZlcl9qaWZmaWVzOworCQl9CisJCWdvdG8gbm9fZGVsdGFfY2hlY2s7CisJfQorCiAJLyogc29tZXRoaW5nIG11c3QgYmUgcmVhbGx5IHdyb25nICovCiAJaWYgKGRlbHRhID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplICsgcnVudGltZS0+cGVyaW9kX3NpemUpIHsKIAkJaHdfcHRyX2Vycm9yKHN1YnN0cmVhbSwKQEAgLTQ0Miw2ICs0NjMsNyBAQAogCQkJICAgICAobG9uZylvbGRfaHdfcHRyKTsKIAl9CiAKKyBub19kZWx0YV9jaGVjazoKIAlpZiAocnVudGltZS0+c3RhdHVzLT5od19wdHIgPT0gbmV3X2h3X3B0cikKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jIGIvc291bmQvY29yZS9wY21fbmF0aXZlLmMKaW5kZXggZTgyYzFmOS4uNGJlNDVlNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMKKysrIGIvc291bmQvY29yZS9wY21fbmF0aXZlLmMKQEAgLTQyMiw2ICs0MjIsOSBAQAogCXJ1bnRpbWUtPmluZm8gPSBwYXJhbXMtPmluZm87CiAJcnVudGltZS0+cmF0ZV9udW0gPSBwYXJhbXMtPnJhdGVfbnVtOwogCXJ1bnRpbWUtPnJhdGVfZGVuID0gcGFyYW1zLT5yYXRlX2RlbjsKKwlydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwID0KKwkJCShwYXJhbXMtPmluZm8gJiBTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQKSAmJgorCQkJKHBhcmFtcy0+ZmxhZ3MgJiBTTkRSVl9QQ01fSFdfUEFSQU1TX05PX1BFUklPRF9XQUtFVVApOwogCiAJYml0cyA9IHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKHJ1bnRpbWUtPmZvcm1hdCk7CiAJcnVudGltZS0+c2FtcGxlX2JpdHMgPSBiaXRzOwpAQCAtOTg0LDcgKzk4Nyw3IEBACiAJaWYgKHB1c2gpCiAJCXNuZF9wY21fdXBkYXRlX2h3X3B0cihzdWJzdHJlYW0pOwogCS8qIFRoZSBqaWZmaWVzIGNoZWNrIGluIHNuZF9wY21fdXBkYXRlX2h3X3B0ciooKSBpcyBkb25lIGJ5Ci0JICogYSBkZWx0YSBiZXR3ZW4gdGhlIGN1cnJlbnQgamlmZmllcywgdGhpcyBnaXZlcyBhIGxhcmdlIGVub3VnaAorCSAqIGEgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudCBqaWZmaWVzLCB0aGlzIGdpdmVzIGEgbGFyZ2UgZW5vdWdoCiAJICogZGVsdGEsIGVmZmVjdGl2ZWx5IHRvIHNraXAgdGhlIGNoZWNrIG9uY2UuCiAJICovCiAJc3Vic3RyZWFtLT5ydW50aW1lLT5od19wdHJfamlmZmllcyA9IGppZmZpZXMgLSBIWiAqIDEwMDA7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXEuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcS5jCmluZGV4IGJmMDlhNWEuLjExOWZkZGI2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXEuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXEuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgInNlcV90aW1lci5oIgogI2luY2x1ZGUgInNlcV9zeXN0ZW0uaCIKICNpbmNsdWRlICJzZXFfaW5mby5oIgorI2luY2x1ZGUgPHNvdW5kL21pbm9ycy5oPgogI2luY2x1ZGUgPHNvdW5kL3NlcV9kZXZpY2UuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TRVFfRFVNTVlfTU9EVUxFKQpAQCAtNzMsNiArNzQsOSBAQAogbW9kdWxlX3BhcmFtKHNlcV9kZWZhdWx0X3RpbWVyX3Jlc29sdXRpb24sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlcV9kZWZhdWx0X3RpbWVyX3Jlc29sdXRpb24sICJUaGUgZGVmYXVsdCB0aW1lciByZXNvbHV0aW9uIGluIEh6LiIpOwogCitNT0RVTEVfQUxJQVNfQ0hBUkRFVihDT05GSUdfU05EX01BSk9SLCBTTkRSVl9NSU5PUl9TRVFVRU5DRVIpOworTU9EVUxFX0FMSUFTKCJkZXZuYW1lOnNuZC9zZXEiKTsKKwogLyoKICAqICBJTklUIFBBUlQKICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZC5jIGIvc291bmQvY29yZS9zb3VuZC5jCmluZGV4IDY2NjkxZmUuLjFjN2EzZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc291bmQuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kLmMKQEAgLTE4OCwxNCArMTg4LDIyIEBACiB9OwogCiAjaWZkZWYgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUwotc3RhdGljIGludCBzbmRfZmluZF9mcmVlX21pbm9yKHZvaWQpCitzdGF0aWMgaW50IHNuZF9maW5kX2ZyZWVfbWlub3IoaW50IHR5cGUpCiB7CiAJaW50IG1pbm9yOwogCisJLyogc3RhdGljIG1pbm9ycyBmb3IgbW9kdWxlIGF1dG8gbG9hZGluZyAqLworCWlmICh0eXBlID09IFNORFJWX0RFVklDRV9UWVBFX1NFUVVFTkNFUikKKwkJcmV0dXJuIFNORFJWX01JTk9SX1NFUVVFTkNFUjsKKwlpZiAodHlwZSA9PSBTTkRSVl9ERVZJQ0VfVFlQRV9USU1FUikKKwkJcmV0dXJuIFNORFJWX01JTk9SX1RJTUVSOworCiAJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgQVJSQVlfU0laRShzbmRfbWlub3JzKTsgKyttaW5vcikgewotCQkvKiBza2lwIG1pbm9ycyBzdGlsbCB1c2VkIHN0YXRpY2FsbHkgZm9yIGF1dG9sb2FkaW5nIGRldmljZXMgKi8KLQkJaWYgKFNORFJWX01JTk9SX0RFVklDRShtaW5vcikgPT0gU05EUlZfTUlOT1JfQ09OVFJPTCB8fAotCQkgICAgbWlub3IgPT0gU05EUlZfTUlOT1JfU0VRVUVOQ0VSKQorCQkvKiBza2lwIHN0YXRpYyBtaW5vcnMgc3RpbGwgdXNlZCBmb3IgbW9kdWxlIGF1dG8gbG9hZGluZyAqLworCQlpZiAoU05EUlZfTUlOT1JfREVWSUNFKG1pbm9yKSA9PSBTTkRSVl9NSU5PUl9DT05UUk9MKQorCQkJY29udGludWU7CisJCWlmIChtaW5vciA9PSBTTkRSVl9NSU5PUl9TRVFVRU5DRVIgfHwKKwkJICAgIG1pbm9yID09IFNORFJWX01JTk9SX1RJTUVSKQogCQkJY29udGludWU7CiAJCWlmICghc25kX21pbm9yc1ttaW5vcl0pCiAJCQlyZXR1cm4gbWlub3I7CkBAIC0yNjksNyArMjc3LDcgQEAKIAlwcmVnLT5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CiAJbXV0ZXhfbG9jaygmc291bmRfbXV0ZXgpOwogI2lmZGVmIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMKLQltaW5vciA9IHNuZF9maW5kX2ZyZWVfbWlub3IoKTsKKwltaW5vciA9IHNuZF9maW5kX2ZyZWVfbWlub3IodHlwZSk7CiAjZWxzZQogCW1pbm9yID0gc25kX2tlcm5lbF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwogCWlmIChtaW5vciA+PSAwICYmIHNuZF9taW5vcnNbbWlub3JdKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IDEzYWZiNjAuLmVkMDE2MzI5IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3RpbWVyLmMKKysrIGIvc291bmQvY29yZS90aW1lci5jCkBAIC0zNCw4ICszNCw4IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1NORF9IUEVUKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfSFBFVF9NT0RVTEUpCi0jZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgMworI2lmIGRlZmluZWQoQ09ORklHX1NORF9IUlRJTUVSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfSFJUSU1FUl9NT0RVTEUpCisjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgNAogI2VsaWYgZGVmaW5lZChDT05GSUdfU05EX1JUQ1RJTUVSKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUlRDVElNRVJfTU9EVUxFKQogI2RlZmluZSBERUZBVUxUX1RJTUVSX0xJTUlUIDIKICNlbHNlCkBAIC01Miw2ICs1Miw5IEBACiBtb2R1bGVfcGFyYW0odGltZXJfdHN0YW1wX21vbm90b25pYywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModGltZXJfdHN0YW1wX21vbm90b25pYywgIlVzZSBwb3NpeCBtb25vdG9uaWMgY2xvY2sgc291cmNlIGZvciB0aW1lc3RhbXBzIChkZWZhdWx0KS4iKTsKIAorTU9EVUxFX0FMSUFTX0NIQVJERVYoQ09ORklHX1NORF9NQUpPUiwgU05EUlZfTUlOT1JfVElNRVIpOworTU9EVUxFX0FMSUFTKCJkZXZuYW1lOnNuZC90aW1lciIpOworCiBzdHJ1Y3Qgc25kX3RpbWVyX3VzZXIgewogCXN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnRpbWVyaTsKIAlpbnQgdHJlYWQ7CQkvKiBlbmhhbmNlZCByZWFkIHdpdGggdGltZXN0YW1wcyBhbmQgZXZlbnRzICovCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jIGIvc291bmQvZHJpdmVycy9tbDQwMy1hYzk3Y3IuYwppbmRleCBhMTI4MmMxLi41Y2ZjYjkwIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21sNDAzLWFjOTdjci5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbWw0MDMtYWM5N2NyLmMKQEAgLTExNDMsOCArMTE0Myw4IEBACiAJCQkJCSAgICAgKHJlc291cmNlLT5zdGFydCkgKyAxKTsKIAlpZiAobWw0MDNfYWM5N2NyLT5wb3J0ID09IE5VTEwpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBTTkRfTUw0MDNfQUM5N0NSX0RSSVZFUiAiOiAiCi0JCQkgICAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gKCV4IHRvICV4KVxuIiwKLQkJCSAgIHJlc291cmNlLT5zdGFydCwgcmVzb3VyY2UtPmVuZCk7CisJCQkgICAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gKCVwUilcbiIsCisJCQkgICByZXNvdXJjZSk7CiAJCXNuZF9tbDQwM19hYzk3Y3JfZnJlZShtbDQwM19hYzk3Y3IpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYwppbmRleCA5NzFhODRhLi5jNDI0ZDMyIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExMy5jCkBAIC01Nyw4ICs1Nyw3IEBACiB7CiAJY2hpcC0+aW5pdCA9IDE7CS8qIGRvbid0IHNjaGVkdWxlIG5ldyB3b3JrICovCiAJbWIoKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7CiAJa2ZyZWUoY2hpcCk7CiB9CiAKQEAgLTE0MSw3ICsxNDAsNyBAQAogewogCWNoaXAtPmluaXQgPSAxOwogCW1iKCk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlmbHVzaF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7CiAJYWs0MTEzX2luaXRfcmVncyhjaGlwKTsKIAkvKiBicmluZyB1cCBzdGF0aXN0aWNzIC8gZXZlbnQgcXVlaW5nICovCiAJY2hpcC0+aW5pdCA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMgYi9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKaW5kZXggMDM0MTQ1MS4uZDlmYjUzNyAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL2FrNDExNC5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwpAQCAtNjcsOCArNjcsNyBAQAogewogCWNoaXAtPmluaXQgPSAxOwkvKiBkb24ndCBzY2hlZHVsZSBuZXcgd29yayAqLwogCW1iKCk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yayk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOwogCWtmcmVlKGNoaXApOwogfQogCkBAIC0xNTQsNyArMTUzLDcgQEAKIHsKIAljaGlwLT5pbml0ID0gMTsKIAltYigpOwotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmx1c2hfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOwogCWFrNDExNF9pbml0X3JlZ3MoY2hpcCk7CiAJLyogYnJpbmcgdXAgc3RhdGlzdGljcyAvIGV2ZW50IHF1ZWluZyAqLwogCWNoaXAtPmluaXQgPSAwOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wbDNzYTIuYyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKaW5kZXggMjY1YWJjY2UuLjliOTE1ZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCXNuZF9wcmludGQoIk9QTDMtU0EgWzB4JWx4XSBkZXRlY3QgKDEpID0gMHgleCAoMHgleClcbiIsIHBvcnQsIHRtcCwgdG1wMSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQkvKiB0cnkgaWYgdGhlIE1JQyByZWdpc3RlciBpcyBhY2Nlc2libGUgKi8KKwkvKiB0cnkgaWYgdGhlIE1JQyByZWdpc3RlciBpcyBhY2Nlc3NpYmxlICovCiAJdG1wID0gc25kX29wbDNzYTJfcmVhZChjaGlwLCBPUEwzU0EyX01JQyk7CiAJc25kX29wbDNzYTJfd3JpdGUoY2hpcCwgT1BMM1NBMl9NSUMsIDB4OGEpOwogCWlmICgoKHRtcDEgPSBzbmRfb3BsM3NhMl9yZWFkKGNoaXAsIE9QTDNTQTJfTUlDKSkgJiAweDlmKSAhPSAweDhhKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvS2NvbmZpZyBiL3NvdW5kL3BjaS9LY29uZmlnCmluZGV4IDEyZTM0NjUuLjk4MjNkNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAgICAgdHJpc3RhdGUKIAogY29uZmlnIFNORF9PWFlHRU4KLQl0cmlzdGF0ZSAiQy1NZWRpYSA4Nzg4IChPeHlnZW4pIgorCXRyaXN0YXRlICJDLU1lZGlhIDg3ODYsIDg3ODcsIDg3ODggKE94eWdlbikiCiAJc2VsZWN0IFNORF9PWFlHRU5fTElCCiAJc2VsZWN0IFNORF9QQ00KIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCkBAIC0yMTcsMTMgKzIxNywxOCBAQAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQy1NZWRpYSBDTUk4Nzg4IChPeHlnZW4gSEQgQXVkaW8pIGNoaXA6CiAJICAgKiBBc291bmQgQS04Nzg4CisJICAgKiBBc3VzIFhvbmFyIERHCiAJICAgKiBBdXplblRlY2ggWC1NZXJpZGlhbgorCSAgICogQXV6ZW5UZWNoIFgtTWVyaWRpYW4gMkcKIAkgICAqIEJnZWFycyBiLUVuc3BpcmVyCiAJICAgKiBDbHViM0QgVGhlYXRyb24gRFRTCiAJICAgKiBIVC1PbWVnYSBDbGFybyAocGx1cykKIAkgICAqIEhULU9tZWdhIENsYXJvIGhhbG8gKFhUKQorCSAgICogS3Vyb3V0b3NoaWtvdSBDTUk4Nzg3LUhHMlBDSQogCSAgICogUmF6ZXIgQmFycmFjdWRhIEFDLTEKIAkgICAqIFNvbmRpZ28gSW5mZXJubworCSAgICogVGVtcG9UZWMvTWVkaWFUZWsgSGlGaWVyIEZhbnRhc2lhCisJICAgKiBUZW1wb1RlYy9NZWRpYVRlayBIaUZpZXIgU2VyZW5hZGUKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLW94eWdlbi4KQEAgLTU3OCwxOCArNTgzLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNuZC1oZHNwbS4KIAotY29uZmlnIFNORF9ISUZJRVIKLQl0cmlzdGF0ZSAiVGVtcG9UZWMgSGlGaWVyIEZhbnRhc2lhIgotCXNlbGVjdCBTTkRfT1hZR0VOX0xJQgotCXNlbGVjdCBTTkRfUENNCi0Jc2VsZWN0IFNORF9NUFU0MDFfVUFSVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgTWVkaWFUZWsvVGVtcG9UZWMgSGlGaWVyCi0JICBGYW50YXNpYSBzb3VuZCBjYXJkLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBzbmQtaGlmaWVyLgotCiBjb25maWcgU05EX0lDRTE3MTIKIAl0cmlzdGF0ZSAiSUNFbnNlbWJsZSBJQ0UxNzEyIChFbnZ5MjQpIgogCXNlbGVjdCBTTkRfTVBVNDAxX1VBUlQKQEAgLTgyNiw4ICs4MTksOCBAQAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNvdW5kIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQXN1cyBBVjY2L0FWMTAwL0FWMjAwIGNoaXBzLCBpLmUuLCBYb25hciBEMSwgRFgsIEQyLCBEMlgsIERTLAogCSAgRXNzZW5jZSBTVCAoRGVsdXhlKSwgYW5kIEVzc2VuY2UgU1RYLgotCSAgU3VwcG9ydCBmb3IgdGhlIEhEQVYxLjMgKERlbHV4ZSkgaXMgaW5jb21wbGV0ZTsgZm9yIHRoZQotCSAgSERBVjEuMyBTbGltIGFuZCBYZW5zZSwgbWlzc2luZy4KKwkgIFN1cHBvcnQgZm9yIHRoZSBIREFWMS4zIChEZWx1eGUpIGFuZCBIREFWMS4zIFNsaW0gaXMgZXhwZXJpbWVudGFsOworCSAgZm9yIHRoZSBYZW5zZSwgbWlzc2luZy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLXZpcnR1b3NvLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCmluZGV4IGE3NjMwZTllLi4wZmM2MTRjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0xMDE0LDggKzEwMTQsNyBAQAogewogCWlmIChhYzk3KSB7CiAjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYWM5Ny0+cG93ZXJfd29yayk7Ci0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWM5Ny0+cG93ZXJfd29yayk7CiAjZW5kaWYKIAkJc25kX2FjOTdfcHJvY19kb25lKGFjOTcpOwogCQlpZiAoYWM5Ny0+YnVzKQpAQCAtMjQ1Niw4ICsyNDU1LDcgQEAKIAlpZiAoYWM5Ny0+YnVpbGRfb3BzLT5zdXNwZW5kKQogCQlhYzk3LT5idWlsZF9vcHMtPnN1c3BlbmQoYWM5Nyk7CiAjaWZkZWYgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUKLQljYW5jZWxfZGVsYXllZF93b3JrKCZhYzk3LT5wb3dlcl93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWM5Ny0+cG93ZXJfd29yayk7CiAjZW5kaWYKIAlzbmRfYWM5N19wb3dlcmRvd24oYWM5Nyk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCAyZjNjYWNiLi42MTE3NTk1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogIGF6dDMzMjguYyAtIGRyaXZlciBmb3IgQXp0ZWNoIEFaRjMzMjggYmFzZWQgc291bmRjYXJkcyAoZS5nLiBQQ0kxNjgpLgotICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSAtIDIwMDkgYnkgQW5kcmVhcyBNb2hyIDxhbmRpIEFUIGxpc2FzLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSAtIDIwMTAgYnkgQW5kcmVhcyBNb2hyIDxhbmRpIEFUIGxpc2FzLmRlPgogICoKICAqICBGcmFtZXdvcmsgYm9ycm93ZWQgZnJvbSBCYXJ0IEhhcnRnZXJzJ3MgYWxzNDAwMC5jLgogICogIERyaXZlciBkZXZlbG9wZWQgb24gUENJMTY4IEFQKFcpIHZlcnNpb24gKFBDSSByZXYuIDEwLCBzdWJzeXN0ZW0gSUQgMTgwMSksCkBAIC0xNzUsNiArMTc1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4gLyogV0FSTl9PTkNFICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yMDEsMTQgKzIwMiwxNSBAQAogCiAvKiA9PT0gRGVidWcgc2V0dGluZ3MgPT09CiAgIEZ1cnRoZXIgZGlhZ25vc3RpYyBmdW5jdGlvbmFsaXR5IHRoYW4gdGhlIHNldHRpbmdzIGJlbG93Ci0gIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJvdmlkZWQsIHNpbmNlIG9uZSBjYW4gZWFzaWx5IHdyaXRlIGEgYmFzaCBzY3JpcHQKKyAgZG9lcyBub3QgbmVlZCB0byBiZSBwcm92aWRlZCwgc2luY2Ugb25lIGNhbiBlYXNpbHkgd3JpdGUgYSBQT1NJWCBzaGVsbCBzY3JpcHQKICAgdG8gZHVtcCB0aGUgY2FyZCdzIEkvTyBwb3J0cyAodGhvc2UgbGlzdGVkIGluIGxzcGNpIC12IC12KToKLSAgZnVuY3Rpb24gZHVtcCgpCisgIGR1bXAoKQogICB7CiAgICAgbG9jYWwgZGVzY3I9JDE7IGxvY2FsIGFkZHI9JDI7IGxvY2FsIGNvdW50PSQzCiAKICAgICBlY2hvICIke2Rlc2NyfTogJHtjb3VudH0gQCAke2FkZHJ9OiIKLSAgICBkZCBpZj0vZGV2L3BvcnQgc2tpcD0kWyR7YWRkcn1dIGNvdW50PSR7Y291bnR9IGJzPTEgMj4vZGV2L251bGx8IGhleGR1bXAgLUMKKyAgICBkZCBpZj0vZGV2L3BvcnQgc2tpcD1gcHJpbnRmICVkICR7YWRkcn1gIGNvdW50PSR7Y291bnR9IGJzPTEgXAorICAgICAgMj4vZGV2L251bGx8IGhleGR1bXAgLUMKICAgfQogICBhbmQgdGhlbiB1c2Ugc29tZXRoaW5nIGxpa2UKICAgImR1bXAgam95MjAwIDB4MjAwIDgiLCAiZHVtcCBtcHUzODggMHgzODggNCIsICJkdW1wIGpveSAweGI0MDAgOCIsCkBAIC0yMTYsMTQgKzIxOCwxNCBAQAogICBwb3NzaWJseSB3aXRoaW4gYSAid2hpbGUgdHJ1ZTsgZG8gLi4uIHNsZWVwIDE7IGRvbmUiIGxvb3AuCiAgIFR3ZWFraW5nIHBvcnRzIGNvdWxkIGJlIGRvbmUgdXNpbmcKICAgVkFMU1RSSU5HPSJgcHJpbnRmICIlMDJ4IiAkdmFsdWVgIgotICBwcmludGYgIlx4IiIkVkFMU1RSSU5HInxkZCBvZj0vZGV2L3BvcnQgc2Vlaz0kWyR7YWRkcn1dIGJzPTEgMj4vZGV2L251bGwKKyAgcHJpbnRmICJceCIiJFZBTFNUUklORyJ8ZGQgb2Y9L2Rldi9wb3J0IHNlZWs9YHByaW50ZiAlZCAke2FkZHJ9YCBicz0xIFwKKyAgICAyPi9kZXYvbnVsbAogKi8KIAogI2RlZmluZSBERUJVR19NSVNDCTAKICNkZWZpbmUgREVCVUdfQ0FMTFMJMAogI2RlZmluZSBERUJVR19NSVhFUgkwCiAjZGVmaW5lIERFQlVHX0NPREVDCTAKLSNkZWZpbmUgREVCVUdfSU8JMAogI2RlZmluZSBERUJVR19USU1FUgkwCiAjZGVmaW5lIERFQlVHX0dBTUUJMAogI2RlZmluZSBERUJVR19QTQkwCkBAIC0yOTEsMTkgKzI5MywyMyBAQAogbW9kdWxlX3BhcmFtKHNlcXRpbWVyX3NjYWxpbmcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlcXRpbWVyX3NjYWxpbmcsICJTZXQgMTAyNDAwMEh6IHNlcXVlbmNlciB0aW1lciBzY2FsZSBmYWN0b3IgKGxvY2t1cCBkYW5nZXIhKS4gRGVmYXVsdCAxMjguIik7CiAKLXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhIHsKLQl1bnNpZ25lZCBsb25nIGlvX2Jhc2U7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0JYm9vbCBydW5uaW5nOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCiBlbnVtIHNuZF9hemYzMzI4X2NvZGVjX3R5cGUgeworICAvKiB3YXJuaW5nOiBmaXhlZCBpbmRpY2VzIChhbHNvIHVzZWQgZm9yIGJpdG1hc2sgY2hlY2tzISkgKi8KICAgQVpGX0NPREVDX1BMQVlCQUNLID0gMCwKICAgQVpGX0NPREVDX0NBUFRVUkUgPSAxLAogICBBWkZfQ09ERUNfSTJTX09VVCA9IDIsCiB9OwogCitzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSB7CisJdW5zaWduZWQgbG9uZyBpb19iYXNlOyAvKiBrZWVwIGZpcnN0ISAoYXZvaWQgb2Zmc2V0IGNhbGMpICovCisJdW5zaWduZWQgaW50IGRtYV9iYXNlOyAvKiBoZWxwZXIgdG8gYXZvaWQgYW4gaW5kaXJlY3Rpb24gaW4gaG90cGF0aCAqLworCXNwaW5sb2NrX3QgKmxvY2s7IC8qIFRPRE86IGNvbnZlcnQgdG8gb3VyIG93biBwZXItY29kZWMgbG9jayBtZW1iZXIgKi8KKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlib29sIHJ1bm5pbmc7CisJZW51bSBzbmRfYXpmMzMyOF9jb2RlY190eXBlIHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKIHN0cnVjdCBzbmRfYXpmMzMyOCB7CiAJLyogb2Z0ZW4tdXNlZCBmaWVsZHMgdG93YXJkcyBiZWdpbm5pbmcsIHRoZW4gZ3JvdXBlZCAqLwogCkBAIC0zNjIsNiArMzY4LDkgQEAKIHN0YXRpYyBpbnQKIHNuZF9hemYzMzI4X2lvX3JlZ19zZXRiKHVuc2lnbmVkIHJlZywgdTggbWFzaywgYm9vbCBkb19zZXQpCiB7CisJLyogV2VsbCwgc3RyaWN0bHkgc3Bva2VuLCB0aGUgaW5iL291dGIgc2VxdWVuY2UgaXNuJ3QgYXRvbWljCisJICAgYW5kIHdvdWxkIG5lZWQgbG9ja2luZy4gSG93ZXZlciB3ZSBjdXJyZW50bHkgZG9uJ3QgY2FyZQorCSAgIHNpbmNlIGl0IHBvdGVudGlhbGx5IGNvbXBsaWNhdGVzIG1hdHRlcnMuICovCiAJdTggcHJldiA9IGluYihyZWcpLCBuZXc7CiAKIAluZXcgPSAoZG9fc2V0KSA/IChwcmV2fG1hc2spIDogKHByZXYgJiB+bWFzayk7CkBAIC00MTMsNiArNDIyLDIxIEBACiAJb3V0bCh2YWx1ZSwgY29kZWMtPmlvX2Jhc2UgKyByZWcpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQKK3NuZF9hemYzMzI4X2NvZGVjX291dGxfbXVsdGkoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjLAorCQkJICAgICB1bnNpZ25lZCByZWcsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50CispCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gY29kZWMtPmlvX2Jhc2UgKyByZWc7CisJaWYgKGNvdW50KSB7CisJCWNvbnN0IHUzMiAqYnVmID0gYnVmZmVyOworCQlkbyB7CisJCQlvdXRsKCpidWYrKywgYWRkcik7CisJCQlhZGRyICs9IDQ7CisJCX0gd2hpbGUgKC0tY291bnQpOworCX0KK30KKwogc3RhdGljIGlubGluZSB1MzIKIHNuZF9hemYzMzI4X2NvZGVjX2lubChjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMsIHVuc2lnbmVkIHJlZykKIHsKQEAgLTk0MywzOCArOTY3LDQzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zbmRfYXpmMzMyOF9jb2RlY19zZXRmbXQoc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAotCQkJICAgICAgIGVudW0gc25kX2F6ZjMzMjhfY29kZWNfdHlwZSBjb2RlY190eXBlLAorc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10KHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYywKIAkJCSAgICAgICBlbnVtIGF6Zl9mcmVxX3QgYml0cmF0ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgZm9ybWF0X3dpZHRoLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVscwogKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0gJmNoaXAtPmNvZGVjc1tjb2RlY190eXBlXTsKIAl1MTYgdmFsID0gMHhmZjAwOworCXU4IGZyZXEgPSAwOwogCiAJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJc3dpdGNoIChiaXRyYXRlKSB7Ci0JY2FzZSBBWkZfRlJFUV80MDAwOiAgdmFsIHw9IFNPVU5ERk9STUFUX0ZSRVFfU1VTUEVDVEVEXzQwMDA7IGJyZWFrOwotCWNhc2UgQVpGX0ZSRVFfNDgwMDogIHZhbCB8PSBTT1VOREZPUk1BVF9GUkVRX1NVU1BFQ1RFRF80ODAwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzU1MTI6Ci0JCS8qIHRoZSBBWkYzMzI4IG5hbWVzIGl0ICI1NTEwIiBmb3Igc29tZSBzdHJhbmdlIHJlYXNvbiAqLwotCQkJICAgICB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV81NTEwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzY2MjA6ICB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV82NjIwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzgwMDA6ICB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV84MDAwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzk2MDA6ICB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV85NjAwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzExMDI1OiB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV8xMTAyNTsgYnJlYWs7Ci0JY2FzZSBBWkZfRlJFUV8xMzI0MDogdmFsIHw9IFNPVU5ERk9STUFUX0ZSRVFfU1VTUEVDVEVEXzEzMjQwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzE2MDAwOiB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV8xNjAwMDsgYnJlYWs7Ci0JY2FzZSBBWkZfRlJFUV8yMjA1MDogdmFsIHw9IFNPVU5ERk9STUFUX0ZSRVFfMjIwNTA7IGJyZWFrOwotCWNhc2UgQVpGX0ZSRVFfMzIwMDA6IHZhbCB8PSBTT1VOREZPUk1BVF9GUkVRXzMyMDAwOyBicmVhazsKKyNkZWZpbmUgQVpGX0ZNVF9YTEFURShpbl9mcmVxLCBvdXRfYml0cykgXAorCWRvIHsgXAorCQljYXNlIEFaRl9GUkVRXyAjIyBpbl9mcmVxOiBcCisJCQlmcmVxID0gU09VTkRGT1JNQVRfRlJFUV8gIyMgb3V0X2JpdHM7IFwKKwkJCWJyZWFrOyBcCisJfSB3aGlsZSAoMCk7CisJQVpGX0ZNVF9YTEFURSg0MDAwLCBTVVNQRUNURURfNDAwMCkKKwlBWkZfRk1UX1hMQVRFKDQ4MDAsIFNVU1BFQ1RFRF80ODAwKQorCS8qIHRoZSBBWkYzMzI4IG5hbWVzIGl0ICI1NTEwIiBmb3Igc29tZSBzdHJhbmdlIHJlYXNvbjogKi8KKwlBWkZfRk1UX1hMQVRFKDU1MTIsIDU1MTApCisJQVpGX0ZNVF9YTEFURSg2NjIwLCA2NjIwKQorCUFaRl9GTVRfWExBVEUoODAwMCwgODAwMCkKKwlBWkZfRk1UX1hMQVRFKDk2MDAsIDk2MDApCisJQVpGX0ZNVF9YTEFURSgxMTAyNSwgMTEwMjUpCisJQVpGX0ZNVF9YTEFURSgxMzI0MCwgU1VTUEVDVEVEXzEzMjQwKQorCUFaRl9GTVRfWExBVEUoMTYwMDAsIDE2MDAwKQorCUFaRl9GTVRfWExBVEUoMjIwNTAsIDIyMDUwKQorCUFaRl9GTVRfWExBVEUoMzIwMDAsIDMyMDAwKQogCWRlZmF1bHQ6CiAJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJ1bmtub3duIGJpdHJhdGUgJWQsIGFzc3VtaW5nIDQ0LjFrSHohXG4iLCBiaXRyYXRlKTsKIAkJLyogZmFsbC10aHJvdWdoICovCi0JY2FzZSBBWkZfRlJFUV80NDEwMDogdmFsIHw9IFNPVU5ERk9STUFUX0ZSRVFfNDQxMDA7IGJyZWFrOwotCWNhc2UgQVpGX0ZSRVFfNDgwMDA6IHZhbCB8PSBTT1VOREZPUk1BVF9GUkVRXzQ4MDAwOyBicmVhazsKLQljYXNlIEFaRl9GUkVRXzY2MjAwOiB2YWwgfD0gU09VTkRGT1JNQVRfRlJFUV9TVVNQRUNURURfNjYyMDA7IGJyZWFrOworCUFaRl9GTVRfWExBVEUoNDQxMDAsIDQ0MTAwKQorCUFaRl9GTVRfWExBVEUoNDgwMDAsIDQ4MDAwKQorCUFaRl9GTVRfWExBVEUoNjYyMDAsIFNVU1BFQ1RFRF82NjIwMCkKKyN1bmRlZiBBWkZfRk1UX1hMQVRFCiAJfQogCS8qIHZhbCA9IDB4ZmYwNzsgM20yNy45OTNzICg2NTMwMUh6OyAtPiA2NDAwMEh6Pz8/KSBobW0sIDY2MTIwLCA2NTk2NywgNjYxMjMgKi8KIAkvKiB2YWwgPSAweGZmMDk7IDE3bTE1LjA5OHMgKDEzMTIzLDQ3OEh6OyAtPiAxMjAwMEh6Pz8/KSBobW0sIDEzMjM3LjJIej8gKi8KQEAgLTk4NiwxMyArMTAxNSwxNSBAQAogCS8qIHZhbCA9IDB4ZmYwZDsgNDFtMjMuMTM1cyAoNTUyMyw2MDBIejsgLT4gNTUxMkh6Pz8/KSAqLwogCS8qIHZhbCA9IDB4ZmYwZTsgMjhtMzAuNzc3cyAoODAxN0h6OyAtPiA4MDAwSHo/Pz8pICovCiAKKwl2YWwgfD0gZnJlcTsKKwogCWlmIChjaGFubmVscyA9PSAyKQogCQl2YWwgfD0gU09VTkRGT1JNQVRfRkxBR18yQ0hBTk5FTFM7CiAKIAlpZiAoZm9ybWF0X3dpZHRoID09IDE2KQogCQl2YWwgfD0gU09VTkRGT1JNQVRfRkxBR18xNkJJVDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5yZWdfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGNvZGVjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBzZXQgYml0cmF0ZS9mb3JtYXQgKi8KIAlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNvZGVjLCBJRFhfSU9fQ09ERUNfU09VTkRGT1JNQVQsIHZhbCk7CkBAIC0xMDA0LDcgKzEwMzUsOCBAQAogCSAqIChGSVhNRTogeWVzLCBpdCB3b3JrcywgYnV0IHdoYXQgZXhhY3RseSBhbSBJIGRvaW5nIGhlcmU/PyA6KQogCSAqIEZJWE1FOiBkb2VzIHRoaXMgaGF2ZSBzb21lIHNpZGUgZWZmZWN0cyBmb3IgZnVsbC1kdXBsZXgKIAkgKiBvciBvdGhlciBkcmFtYXRpYyBzaWRlIGVmZmVjdHM/ICovCi0JaWYgKGNvZGVjX3R5cGUgPT0gQVpGX0NPREVDX1BMQVlCQUNLKSAvKiBvbmx5IGRvIGl0IGZvciBwbGF5YmFjayAqLworCS8qIGRvIGl0IGZvciBub24tY2FwdHVyZSBjb2RlY3Mgb25seSAqLworCWlmIChjb2RlYy0+dHlwZSAhPSBBWkZfQ09ERUNfQ0FQVFVSRSkKIAkJc25kX2F6ZjMzMjhfY29kZWNfb3V0dyhjb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUywKIAkJCXNuZF9hemYzMzI4X2NvZGVjX2ludyhjb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUykgfAogCQkJRE1BX1JVTl9TT01FVEhJTkcxIHwKQEAgLTEwMTQsMjAgKzEwNDYsMTkgQEAKIAkJCURNQV9TT01FVEhJTkdfRUxTRQogCQkpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNvZGVjLT5sb2NrLCBmbGFncyk7CiAJc25kX2F6ZjMzMjhfZGJnY2FsbGxlYXZlKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10X2xvd3Bvd2VyKHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwKLQkJCSAgICBlbnVtIHNuZF9hemYzMzI4X2NvZGVjX3R5cGUgY29kZWNfdHlwZQorc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10X2xvd3Bvd2VyKHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYwogKQogewogCS8qIGNob29zZSBsb3dlc3QgZnJlcXVlbmN5IGZvciBsb3cgcG93ZXIgY29uc3VtcHRpb24uCiAJICogV2hpbGUgdGhpcyB3aWxsIGNhdXNlIGxvdWRlciBub2lzZSBkdWUgdG8gcmF0aGVyIGNvYXJzZSBmcmVxdWVuY3ksCiAJICogaXQgc2hvdWxkIG5ldmVyIG1hdHRlciBzaW5jZSBvdXRwdXQgc2hvdWxkIGFsd2F5cwogCSAqIGdldCBkaXNhYmxlZCBwcm9wZXJseSB3aGVuIGlkbGUgYW55d2F5LiAqLwotCXNuZF9hemYzMzI4X2NvZGVjX3NldGZtdChjaGlwLCBjb2RlY190eXBlLCBBWkZfRlJFUV80MDAwLCA4LCAxKTsKKwlzbmRfYXpmMzMyOF9jb2RlY19zZXRmbXQoY29kZWMsIEFaRl9GUkVRXzQwMDAsIDgsIDEpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTEwMSw2OSArMTEzMiw4NyBAQAogCQkvKiAuLi5hbmQgYWRqdXN0IGNsb2NrLCB0b28KIAkJICogKHJlZHVjZSBub2lzZSBhbmQgcG93ZXIgY29uc3VtcHRpb24pICovCiAJCWlmICghZW5hYmxlKQotCQkJc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10X2xvd3Bvd2VyKAotCQkJCWNoaXAsCi0JCQkJY29kZWNfdHlwZQotCQkJKTsKKwkJCXNuZF9hemYzMzI4X2NvZGVjX3NldGZtdF9sb3dwb3dlcihjb2RlYyk7CiAJCWNvZGVjLT5ydW5uaW5nID0gZW5hYmxlOwogCX0KIH0KIAogc3RhdGljIHZvaWQKLXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwLAotCQkJCWVudW0gc25kX2F6ZjMzMjhfY29kZWNfdHlwZSBjb2RlY190eXBlLAorc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMsCiAJCQkJdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCXVuc2lnbmVkIGludCBjb3VudCwKLQkJCQl1bnNpZ25lZCBpbnQgc2l6ZQorCQkJCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXMsCisJCQkJdW5zaWduZWQgaW50IGJ1ZmZlcl9ieXRlcwogKQogewotCWNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CisJV0FSTl9PTkNFKHBlcmlvZF9ieXRlcyAmIDEsICJvZGQgcGVyaW9kIGxlbmd0aCE/XG4iKTsKKwlXQVJOX09OQ0UoYnVmZmVyX2J5dGVzICE9IDIgKiBwZXJpb2RfYnl0ZXMsCisJCSAibWlzc2VkIG91ciBpbnB1dCBleHBlY3RhdGlvbnMhICV1IHZzLiAldVxuIiwKKwkJIGJ1ZmZlcl9ieXRlcywgcGVyaW9kX2J5dGVzKTsKIAlpZiAoIWNvZGVjLT5ydW5uaW5nKSB7CiAJCS8qIEFaRjMzMjggdXNlcyBhIHR3byBidWZmZXIgcG9pbnRlciBETUEgdHJhbnNmZXIgYXBwcm9hY2ggKi8KIAotCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBhZGRyX2FyZWEyOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCS8qIHdpZHRoIDMyYml0IChwcmV2ZW50IG92ZXJmbG93KTogKi8KLQkJdTMyIGNvdW50X2FyZWFzLCBsZW5ndGhzOworCQl1MzIgYXJlYV9sZW5ndGg7CisJCXN0cnVjdCBjb2RlY19zZXR1cF9pbyB7CisJCQl1MzIgZG1hX3N0YXJ0XzE7CisJCQl1MzIgZG1hX3N0YXJ0XzI7CisJCQl1MzIgZG1hX2xlbmd0aHM7CisJCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2V0dXBfaW87CiAKLQkJY291bnRfYXJlYXMgPSBzaXplLzI7Ci0JCWFkZHJfYXJlYTIgPSBhZGRyK2NvdW50X2FyZWFzOwotCQlzbmRfYXpmMzMyOF9kYmdjb2RlYygic2V0ZG1hOiBidWZmZXJzICUwOGx4WyV1XSAvICUwOGx4WyV1XVxuIiwKLQkJCQlhZGRyLCBjb3VudF9hcmVhcywgYWRkcl9hcmVhMiwgY291bnRfYXJlYXMpOworCQlhcmVhX2xlbmd0aCA9IGJ1ZmZlcl9ieXRlcy8yOwogCi0JCWNvdW50X2FyZWFzLS07IC8qIG1heC4gaW5kZXggKi8KKwkJc2V0dXBfaW8uZG1hX3N0YXJ0XzEgPSBhZGRyOworCQlzZXR1cF9pby5kbWFfc3RhcnRfMiA9IGFkZHIrYXJlYV9sZW5ndGg7CisKKwkJc25kX2F6ZjMzMjhfZGJnY29kZWMoCisJCQkic2V0ZG1hOiBidWZmZXJzICUwOHhbJXVdIC8gJTA4eFsldV0sICV1LCAldVxuIiwKKwkJCQlzZXR1cF9pby5kbWFfc3RhcnRfMSwgYXJlYV9sZW5ndGgsCisJCQkJc2V0dXBfaW8uZG1hX3N0YXJ0XzIsIGFyZWFfbGVuZ3RoLAorCQkJCXBlcmlvZF9ieXRlcywgYnVmZmVyX2J5dGVzKTsKKworCQkvKiBIbW0sIGFyZSB3ZSByZWFsbHkgc3VwcG9zZWQgdG8gZGVjcmVtZW50IHRoaXMgYnkgMT8/CisJCSAgIE1vc3QgZGVmaW5pdGVseSBjZXJ0YWlubHkgbm90OiBjb25maWd1cmluZyBmdWxsIGxlbmd0aCBkb2VzCisJCSAgIHdvcmsgcHJvcGVybHkgKGkuZS4gbGlrZWx5IGJldHRlciksIGFuZCBCVFcgd2UKKwkJICAgdmlvbGF0ZWQgcG9zc2libHkgZGlmZmVyaW5nIGZyYW1lIHNpemVzIHdpdGggdGhpcy4uLgorCisJCWFyZWFfbGVuZ3RoLS07IHwqIG1heC4gaW5kZXggKnwKKwkJKi8KIAogCQkvKiBidWlsZCBjb21iaW5lZCBJL08gYnVmZmVyIGxlbmd0aCB3b3JkICovCi0JCWxlbmd0aHMgPSAoY291bnRfYXJlYXMgPDwgMTYpIHwgKGNvdW50X2FyZWFzKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7Ci0JCXNuZF9hemYzMzI4X2NvZGVjX291dGwoY29kZWMsIElEWF9JT19DT0RFQ19ETUFfU1RBUlRfMSwgYWRkcik7Ci0JCXNuZF9hemYzMzI4X2NvZGVjX291dGwoY29kZWMsIElEWF9JT19DT0RFQ19ETUFfU1RBUlRfMiwKLQkJCQkJCQkJYWRkcl9hcmVhMik7Ci0JCXNuZF9hemYzMzI4X2NvZGVjX291dGwoY29kZWMsIElEWF9JT19DT0RFQ19ETUFfTEVOR1RIUywKLQkJCQkJCQkJbGVuZ3Rocyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CisJCXNldHVwX2lvLmRtYV9sZW5ndGhzID0gKGFyZWFfbGVuZ3RoIDw8IDE2KSB8IChhcmVhX2xlbmd0aCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoY29kZWMtPmxvY2ssIGZsYWdzKTsKKwkJc25kX2F6ZjMzMjhfY29kZWNfb3V0bF9tdWx0aSgKKwkJCWNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX1NUQVJUXzEsICZzZXR1cF9pbywgMworCQkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNvZGVjLT5sb2NrLCBmbGFncyk7CiAJfQogCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogfQogCiBzdGF0aWMgaW50Ci1zbmRfYXpmMzMyOF9jb2RlY19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc25kX2F6ZjMzMjhfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0jaWYgMAotCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKyNpZiAwCiAgICAgICAgIHVuc2lnbmVkIGludCBzaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7CiAjZW5kaWYKIAogCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOworCisJY29kZWMtPmRtYV9iYXNlID0gcnVudGltZS0+ZG1hX2FkZHI7CisKICNpZiAwCi0Jc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10KGNoaXAsIEFaRl9DT0RFQ18uLi4sCisJc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10KGNvZGVjLAogCQlydW50aW1lLT5yYXRlLAogCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpLAogCQlydW50aW1lLT5jaGFubmVscyk7Ci0Jc25kX2F6ZjMzMjhfY29kZWNfc2V0ZG1hYShjaGlwLCBBWkZfQ09ERUNfLi4uLAorCXNuZF9hemYzMzI4X2NvZGVjX3NldGRtYWEoY29kZWMsCiAJCQkJCXJ1bnRpbWUtPmRtYV9hZGRyLCBjb3VudCwgc2l6ZSk7CiAjZW5kaWYKIAlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKQEAgLTExNzEsMjQgKzEyMjAsMjMgQEAKIH0KIAogc3RhdGljIGludAotc25kX2F6ZjMzMjhfY29kZWNfdHJpZ2dlcihlbnVtIHNuZF9hemYzMzI4X2NvZGVjX3R5cGUgY29kZWNfdHlwZSwKLQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQorc25kX2F6ZjMzMjhfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCiB7CiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCWNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9ICZjaGlwLT5jb2RlY3NbY29kZWNfdHlwZV07CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2IGZsYWdzMTsKIAlib29sIHByZXZpb3VzbHlfbXV0ZWQgPSAwOwotCWJvb2wgaXNfcGxheWJhY2tfY29kZWMgPSAoQVpGX0NPREVDX1BMQVlCQUNLID09IGNvZGVjX3R5cGUpOworCWJvb2wgaXNfbWFpbl9taXhlcl9wbGF5YmFja19jb2RlYyA9IChBWkZfQ09ERUNfUExBWUJBQ0sgPT0gY29kZWMtPnR5cGUpOwogCi0Jc25kX2F6ZjMzMjhfZGJnY2FsbHMoInNuZF9hemYzMzI4X2NvZGVjX3RyaWdnZXIgY21kICVkXG4iLCBjbWQpOworCXNuZF9hemYzMzI4X2RiZ2NhbGxzKCJzbmRfYXpmMzMyOF9wY21fdHJpZ2dlciBjbWQgJWRcbiIsIGNtZCk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCJTVEFSVCAlc1xuIiwgY29kZWMtPm5hbWUpOwogCi0JCWlmIChpc19wbGF5YmFja19jb2RlYykgeworCQlpZiAoaXNfbWFpbl9taXhlcl9wbGF5YmFja19jb2RlYykgewogCQkJLyogbXV0ZSBXYXZlT3V0IChhdm9pZCBjbGlja2luZyBkdXJpbmcgc2V0dXApICovCiAJCQlwcmV2aW91c2x5X211dGVkID0KIAkJCQlzbmRfYXpmMzMyOF9taXhlcl9zZXRfbXV0ZSgKQEAgLTExOTYsMTIgKzEyNDQsMTIgQEAKIAkJCQkpOwogCQl9CiAKLQkJc25kX2F6ZjMzMjhfY29kZWNfc2V0Zm10KGNoaXAsIGNvZGVjX3R5cGUsCisJCXNuZF9hemYzMzI4X2NvZGVjX3NldGZtdChjb2RlYywKIAkJCXJ1bnRpbWUtPnJhdGUsCiAJCQlzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpLAogCQkJcnVudGltZS0+Y2hhbm5lbHMpOwogCi0JCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzcGluX2xvY2soY29kZWMtPmxvY2spOwogCQkvKiBmaXJzdCwgcmVtZW1iZXIgY3VycmVudCB2YWx1ZTogKi8KIAkJZmxhZ3MxID0gc25kX2F6ZjMzMjhfY29kZWNfaW53KGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0ZMQUdTKTsKIApAQCAtMTIxMSwxNCArMTI1OSwxNCBAQAogCiAJCS8qIEZJWE1FOiBjbGVhciBpbnRlcnJ1cHRzIG9yIHdoYXQ/Pz8gKi8KIAkJc25kX2F6ZjMzMjhfY29kZWNfb3V0dyhjb2RlYywgSURYX0lPX0NPREVDX0lSUVRZUEUsIDB4ZmZmZik7Ci0JCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXNwaW5fdW5sb2NrKGNvZGVjLT5sb2NrKTsKIAotCQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNoaXAsIGNvZGVjX3R5cGUsIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQlzbmRfYXpmMzMyOF9jb2RlY19zZXRkbWFhKGNvZGVjLCBydW50aW1lLT5kbWFfYWRkciwKIAkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAogCQkJc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkKIAkJKTsKIAotCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJc3Bpbl9sb2NrKGNvZGVjLT5sb2NrKTsKICNpZmRlZiBXSU45WAogCQkvKiBGSVhNRTogZW5hYmxlIHBsYXliYWNrL3JlY29yZGluZz8/PyAqLwogCQlmbGFnczEgfD0gRE1BX1JVTl9TT01FVEhJTkcxIHwgRE1BX1JVTl9TT01FVEhJTkcyOwpAQCAtMTI0MiwxMCArMTI5MCwxMCBAQAogCQkJRE1BX0VQSUxPR1VFX1NPTUVUSElORyB8CiAJCQlETUFfU09NRVRISU5HX0VMU0UpOwogI2VuZGlmCi0JCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JCXNuZF9hemYzMzI4X2N0cmxfY29kZWNfYWN0aXZpdHkoY2hpcCwgY29kZWNfdHlwZSwgMSk7CisJCXNwaW5fdW5sb2NrKGNvZGVjLT5sb2NrKTsKKwkJc25kX2F6ZjMzMjhfY3RybF9jb2RlY19hY3Rpdml0eShjaGlwLCBjb2RlYy0+dHlwZSwgMSk7CiAKLQkJaWYgKGlzX3BsYXliYWNrX2NvZGVjKSB7CisJCWlmIChpc19tYWluX21peGVyX3BsYXliYWNrX2NvZGVjKSB7CiAJCQkvKiBub3cgdW5tdXRlIFdhdmVPdXQgKi8KIAkJCWlmICghcHJldmlvdXNseV9tdXRlZCkKIAkJCQlzbmRfYXpmMzMyOF9taXhlcl9zZXRfbXV0ZSgKQEAgLTEyNTgsMTkgKzEzMDYsMTkgQEAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKIAkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlJFU1VNRSAlc1xuIiwgY29kZWMtPm5hbWUpOwogCQkvKiByZXN1bWUgY29kZWMgaWYgd2Ugd2VyZSBhY3RpdmUgKi8KLQkJc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJCXNwaW5fbG9jayhjb2RlYy0+bG9jayk7CiAJCWlmIChjb2RlYy0+cnVubmluZykKIAkJCXNuZF9hemYzMzI4X2NvZGVjX291dHcoY29kZWMsIElEWF9JT19DT0RFQ19ETUFfRkxBR1MsCiAJCQkJc25kX2F6ZjMzMjhfY29kZWNfaW53KAogCQkJCQljb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUwogCQkJCSkgfCBETUFfUkVTVU1FCiAJCQkpOwotCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzcGluX3VubG9jayhjb2RlYy0+bG9jayk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJc25kX2F6ZjMzMjhfZGJnY29kZWMoIlNUT1AgJXNcbiIsIGNvZGVjLT5uYW1lKTsKIAotCQlpZiAoaXNfcGxheWJhY2tfY29kZWMpIHsKKwkJaWYgKGlzX21haW5fbWl4ZXJfcGxheWJhY2tfY29kZWMpIHsKIAkJCS8qIG11dGUgV2F2ZU91dCAoYXZvaWQgY2xpY2tpbmcgZHVyaW5nIHNldHVwKSAqLwogCQkJcHJldmlvdXNseV9tdXRlZCA9CiAJCQkJc25kX2F6ZjMzMjhfbWl4ZXJfc2V0X211dGUoCkBAIC0xMjc4LDcgKzEzMjYsNyBAQAogCQkJCSk7CiAJCX0KIAotCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwkJc3Bpbl9sb2NrKGNvZGVjLT5sb2NrKTsKIAkJLyogZmlyc3QsIHJlbWVtYmVyIGN1cnJlbnQgdmFsdWU6ICovCiAJCWZsYWdzMSA9IHNuZF9hemYzMzI4X2NvZGVjX2ludyhjb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUyk7CiAKQEAgLTEyOTMsMTAgKzEzNDEsMTAgQEAKIAogCQlmbGFnczEgJj0gfkRNQV9SVU5fU09NRVRISU5HMTsKIAkJc25kX2F6ZjMzMjhfY29kZWNfb3V0dyhjb2RlYywgSURYX0lPX0NPREVDX0RNQV9GTEFHUywgZmxhZ3MxKTsKLQkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQkJc25kX2F6ZjMzMjhfY3RybF9jb2RlY19hY3Rpdml0eShjaGlwLCBjb2RlY190eXBlLCAwKTsKKwkJc3Bpbl91bmxvY2soY29kZWMtPmxvY2spOworCQlzbmRfYXpmMzMyOF9jdHJsX2NvZGVjX2FjdGl2aXR5KGNoaXAsIGNvZGVjLT50eXBlLCAwKTsKIAotCQlpZiAoaXNfcGxheWJhY2tfY29kZWMpIHsKKwkJaWYgKGlzX21haW5fbWl4ZXJfcGxheWJhY2tfY29kZWMpIHsKIAkJCS8qIG5vdyB1bm11dGUgV2F2ZU91dCAqLwogCQkJaWYgKCFwcmV2aW91c2x5X211dGVkKQogCQkJCXNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKApAQCAtMTMzMCw2NyArMTM3OCwyOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQKLXNuZF9hemYzMzI4X2NvZGVjX3BsYXliYWNrX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X2NvZGVjX3RyaWdnZXIoQVpGX0NPREVDX1BMQVlCQUNLLCBzdWJzdHJlYW0sIGNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNuZF9hemYzMzI4X2NvZGVjX2NhcHR1cmVfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlyZXR1cm4gc25kX2F6ZjMzMjhfY29kZWNfdHJpZ2dlcihBWkZfQ09ERUNfQ0FQVFVSRSwgc3Vic3RyZWFtLCBjbWQpOwotfQotCi1zdGF0aWMgaW50Ci1zbmRfYXpmMzMyOF9jb2RlY19pMnNfb3V0X3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X2NvZGVjX3RyaWdnZXIoQVpGX0NPREVDX0kyU19PVVQsIHN1YnN0cmVhbSwgY21kKTsKLX0KLQogc3RhdGljIHNuZF9wY21fdWZyYW1lc190Ci1zbmRfYXpmMzMyOF9jb2RlY19wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICBlbnVtIHNuZF9hemYzMzI4X2NvZGVjX3R5cGUgY29kZWNfdHlwZQorc25kX2F6ZjMzMjhfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0KICkKIHsKLQljb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0gJmNoaXAtPmNvZGVjc1tjb2RlY190eXBlXTsKLQl1bnNpZ25lZCBsb25nIGJ1ZnB0ciwgcmVzdWx0OworCWNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYyA9CisJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCXNuZF9wY21fdWZyYW1lc190IGZybXJlczsKIAotI2lmZGVmIFFVRVJZX0hBUkRXQVJFCi0JYnVmcHRyID0gc25kX2F6ZjMzMjhfY29kZWNfaW5sKGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX1NUQVJUXzEpOwotI2Vsc2UKLQlidWZwdHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOwotI2VuZGlmCiAJcmVzdWx0ID0gc25kX2F6ZjMzMjhfY29kZWNfaW5sKGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0NVUlJQT1MpOwogCiAJLyogY2FsY3VsYXRlIG9mZnNldCAqLwotCXJlc3VsdCAtPSBidWZwdHI7CisjaWZkZWYgUVVFUllfSEFSRFdBUkUKKwlyZXN1bHQgLT0gc25kX2F6ZjMzMjhfY29kZWNfaW5sKGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX1NUQVJUXzEpOworI2Vsc2UKKwlyZXN1bHQgLT0gY29kZWMtPmRtYV9iYXNlOworI2VuZGlmCiAJZnJtcmVzID0gYnl0ZXNfdG9fZnJhbWVzKCBzdWJzdHJlYW0tPnJ1bnRpbWUsIHJlc3VsdCk7Ci0Jc25kX2F6ZjMzMjhfZGJnY29kZWMoIiVzIEAgMHglOGx4LCBmcmFtZXMgJThsZFxuIiwKLQkJCQljb2RlYy0+bmFtZSwgcmVzdWx0LCBmcm1yZXMpOworCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCIlMDhsaSAlcyBAIDB4JThseCwgZnJhbWVzICU4bGRcbiIsCisJCQkJamlmZmllcywgY29kZWMtPm5hbWUsIHJlc3VsdCwgZnJtcmVzKTsKIAlyZXR1cm4gZnJtcmVzOwogfQogCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKLXNuZF9hemYzMzI4X2NvZGVjX3BsYXliYWNrX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X2NvZGVjX3BvaW50ZXIoc3Vic3RyZWFtLCBBWkZfQ09ERUNfUExBWUJBQ0spOwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKLXNuZF9hemYzMzI4X2NvZGVjX2NhcHR1cmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX2F6ZjMzMjhfY29kZWNfcG9pbnRlcihzdWJzdHJlYW0sIEFaRl9DT0RFQ19DQVBUVVJFKTsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190Ci1zbmRfYXpmMzMyOF9jb2RlY19pMnNfb3V0X3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X2NvZGVjX3BvaW50ZXIoc3Vic3RyZWFtLCBBWkZfQ09ERUNfSTJTX09VVCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZmRlZiBTVVBQT1JUX0dBTUVQT1JUCkBAIC0xNTMyLDcgKzE1NDIsNyBAQAogCQl9CiAJfQogCi0JLyogdHJpZ2dlciBuZXh0IGF4ZXMgc2FtcGxpbmcsIHRvIGJlIGV2YWx1YXRlZCB0aGUgbmV4dCB0aW1lIHdlCisJLyogdHJpZ2dlciBuZXh0IHNhbXBsaW5nIG9mIGF4ZXMsIHRvIGJlIGV2YWx1YXRlZCB0aGUgbmV4dCB0aW1lIHdlCiAJICogZW50ZXIgdGhpcyBmdW5jdGlvbiAqLwogCiAJLyogZm9yIHNvbWUgdmVyeSwgdmVyeSBzdHJhbmdlIHJlYXNvbiB3ZSBjYW5ub3QgZW5hYmxlCkBAIC0xNjI0LDI5ICsxNjM0LDI5IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotc25kX2F6ZjMzMjhfY29kZWNfaW50ZXJydXB0KHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCwgdTggc3RhdHVzKQorc25kX2F6ZjMzMjhfcGNtX2ludGVycnVwdChjb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqZmlyc3RfY29kZWMsCisJCQkgIHU4IHN0YXR1cworKQogewogCXU4IHdoaWNoOwogCWVudW0gc25kX2F6ZjMzMjhfY29kZWNfdHlwZSBjb2RlY190eXBlOwotCWNvbnN0IHN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlYzsKKwljb25zdCBzdHJ1Y3Qgc25kX2F6ZjMzMjhfY29kZWNfZGF0YSAqY29kZWMgPSBmaXJzdF9jb2RlYzsKIAogCWZvciAoY29kZWNfdHlwZSA9IEFaRl9DT0RFQ19QTEFZQkFDSzsKIAkJIGNvZGVjX3R5cGUgPD0gQVpGX0NPREVDX0kyU19PVVQ7Ci0JCQkgKytjb2RlY190eXBlKSB7CisJCQkgKytjb2RlY190eXBlLCArK2NvZGVjKSB7CiAKIAkJLyogc2tpcCBjb2RlYyBpZiB0aGVyZSdzIG5vIGludGVycnVwdCBmb3IgaXQgKi8KIAkJaWYgKCEoc3RhdHVzICYgKDEgPDwgY29kZWNfdHlwZSkpKQogCQkJY29udGludWU7CiAKLQkJY29kZWMgPSAmY2hpcC0+Y29kZWNzW2NvZGVjX3R5cGVdOwotCi0JCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzcGluX2xvY2soY29kZWMtPmxvY2spOwogCQl3aGljaCA9IHNuZF9hemYzMzI4X2NvZGVjX2luYihjb2RlYywgSURYX0lPX0NPREVDX0lSUVRZUEUpOwogCQkvKiBhY2sgYWxsIElSUSB0eXBlcyBpbW1lZGlhdGVseSAqLwogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXRiKGNvZGVjLCBJRFhfSU9fQ09ERUNfSVJRVFlQRSwgd2hpY2gpOwotCQlzcGluX3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCQlzcGluX3VubG9jayhjb2RlYy0+bG9jayk7CiAKLQkJaWYgKChjaGlwLT5wY21bY29kZWNfdHlwZV0pICYmIChjb2RlYy0+c3Vic3RyZWFtKSkgeworCQlpZiAoY29kZWMtPnN1YnN0cmVhbSkgewogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjb2RlYy0+c3Vic3RyZWFtKTsKIAkJCXNuZF9hemYzMzI4X2RiZ2NvZGVjKCIlcyBwZXJpb2QgZG9uZSAoIyV4KSwgQCAleFxuIiwKIAkJCQljb2RlYy0+bmFtZSwKQEAgLTE3MDEsNyArMTcxMSw3IEBACiAJfQogCiAJaWYgKHN0YXR1cyAmIChJUlFfUExBWUJBQ0t8SVJRX1JFQ09SRElOR3xJUlFfSTJTX09VVCkpCi0JCXNuZF9hemYzMzI4X2NvZGVjX2ludGVycnVwdChjaGlwLCBzdGF0dXMpOworCQlzbmRfYXpmMzMyOF9wY21faW50ZXJydXB0KGNoaXAtPmNvZGVjcywgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgJiBJUlFfR0FNRVBPUlQpCiAJCXNuZF9hemYzMzI4X2dhbWVwb3J0X2ludGVycnVwdChjaGlwKTsKQEAgLTE3ODksMTAxICsxNzk5LDg1IEBACiB7CiAJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0gJmNoaXAtPmNvZGVjc1tjb2RlY190eXBlXTsKIAogCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwotCWNoaXAtPmNvZGVjc1tjb2RlY190eXBlXS5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJY29kZWMtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAogCS8qIHNhbWUgcGFyYW1ldGVycyBmb3IgYWxsIG91ciBjb2RlY3MgLSBhdCBsZWFzdCB3ZSB0aGluayBzby4uLiAqLwogCXJ1bnRpbWUtPmh3ID0gc25kX2F6ZjMzMjhfaGFyZHdhcmU7CiAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkgICAmc25kX2F6ZjMzMjhfaHdfY29uc3RyYWludHNfcmF0ZXMpOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGNvZGVjOwogCXNuZF9hemYzMzI4X2RiZ2NhbGxsZWF2ZSgpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1zbmRfYXpmMzMyOF9wbGF5YmFja19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc25kX2F6ZjMzMjhfcGNtX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJcmV0dXJuIHNuZF9hemYzMzI4X3BjbV9vcGVuKHN1YnN0cmVhbSwgQVpGX0NPREVDX1BMQVlCQUNLKTsKIH0KIAogc3RhdGljIGludAotc25kX2F6ZjMzMjhfY2FwdHVyZV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc25kX2F6ZjMzMjhfcGNtX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlyZXR1cm4gc25kX2F6ZjMzMjhfcGNtX29wZW4oc3Vic3RyZWFtLCBBWkZfQ09ERUNfQ0FQVFVSRSk7CiB9CiAKIHN0YXRpYyBpbnQKLXNuZF9hemYzMzI4X2kyc19vdXRfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3NuZF9hemYzMzI4X3BjbV9pMnNfb3V0X29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJcmV0dXJuIHNuZF9hemYzMzI4X3BjbV9vcGVuKHN1YnN0cmVhbSwgQVpGX0NPREVDX0kyU19PVVQpOwogfQogCiBzdGF0aWMgaW50Ci1zbmRfYXpmMzMyOF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCSAgICAgIGVudW0gc25kX2F6ZjMzMjhfY29kZWNfdHlwZSBjb2RlY190eXBlCitzbmRfYXpmMzMyOF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0KICkKIHsKLQlzdHJ1Y3Qgc25kX2F6ZjMzMjggKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0KKwkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfYXpmMzMyOF9kYmdjYWxsZW50ZXIoKTsKLQljaGlwLT5jb2RlY3NbY29kZWNfdHlwZV0uc3Vic3RyZWFtID0gTlVMTDsKKwljb2RlYy0+c3Vic3RyZWFtID0gTlVMTDsKIAlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotc25kX2F6ZjMzMjhfcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X3BjbV9jbG9zZShzdWJzdHJlYW0sIEFaRl9DT0RFQ19QTEFZQkFDSyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNuZF9hemYzMzI4X2NhcHR1cmVfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JcmV0dXJuIHNuZF9hemYzMzI4X3BjbV9jbG9zZShzdWJzdHJlYW0sIEFaRl9DT0RFQ19DQVBUVVJFKTsKLX0KLQotc3RhdGljIGludAotc25kX2F6ZjMzMjhfaTJzX291dF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX2F6ZjMzMjhfcGNtX2Nsb3NlKHN1YnN0cmVhbSwgQVpGX0NPREVDX0kyU19PVVQpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X3BsYXliYWNrX29wcyA9IHsKLQkub3BlbiA9CQlzbmRfYXpmMzMyOF9wbGF5YmFja19vcGVuLAotCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BsYXliYWNrX2Nsb3NlLAorCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKIAkuaHdfcGFyYW1zID0Jc25kX2F6ZjMzMjhfaHdfcGFyYW1zLAogCS5od19mcmVlID0Jc25kX2F6ZjMzMjhfaHdfZnJlZSwKLQkucHJlcGFyZSA9CXNuZF9hemYzMzI4X2NvZGVjX3ByZXBhcmUsCi0JLnRyaWdnZXIgPQlzbmRfYXpmMzMyOF9jb2RlY19wbGF5YmFja190cmlnZ2VyLAotCS5wb2ludGVyID0Jc25kX2F6ZjMzMjhfY29kZWNfcGxheWJhY2tfcG9pbnRlcgorCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYXpmMzMyOF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9hemYzMzI4X3BjbV9wb2ludGVyCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2NhcHR1cmVfb3BzID0gewotCS5vcGVuID0JCXNuZF9hemYzMzI4X2NhcHR1cmVfb3BlbiwKLQkuY2xvc2UgPQlzbmRfYXpmMzMyOF9jYXB0dXJlX2Nsb3NlLAorCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9jYXB0dXJlX29wZW4sCisJLmNsb3NlID0Jc25kX2F6ZjMzMjhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMgPQlzbmRfYXpmMzMyOF9od19wYXJhbXMsCiAJLmh3X2ZyZWUgPQlzbmRfYXpmMzMyOF9od19mcmVlLAotCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfY29kZWNfcHJlcGFyZSwKLQkudHJpZ2dlciA9CXNuZF9hemYzMzI4X2NvZGVjX2NhcHR1cmVfdHJpZ2dlciwKLQkucG9pbnRlciA9CXNuZF9hemYzMzI4X2NvZGVjX2NhcHR1cmVfcG9pbnRlcgorCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYXpmMzMyOF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9hemYzMzI4X3BjbV9wb2ludGVyCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2kyc19vdXRfb3BzID0gewotCS5vcGVuID0JCXNuZF9hemYzMzI4X2kyc19vdXRfb3BlbiwKLQkuY2xvc2UgPQlzbmRfYXpmMzMyOF9pMnNfb3V0X2Nsb3NlLAorCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9pMnNfb3V0X29wZW4sCisJLmNsb3NlID0Jc25kX2F6ZjMzMjhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMgPQlzbmRfYXpmMzMyOF9od19wYXJhbXMsCiAJLmh3X2ZyZWUgPQlzbmRfYXpmMzMyOF9od19mcmVlLAotCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfY29kZWNfcHJlcGFyZSwKLQkudHJpZ2dlciA9CXNuZF9hemYzMzI4X2NvZGVjX2kyc19vdXRfdHJpZ2dlciwKLQkucG9pbnRlciA9CXNuZF9hemYzMzI4X2NvZGVjX2kyc19vdXRfcG9pbnRlcgorCS5wcmVwYXJlID0Jc25kX2F6ZjMzMjhfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlzbmRfYXpmMzMyOF9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF9hemYzMzI4X3BjbV9wb2ludGVyCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdApAQCAtMTk2Niw3ICsxOTYwLDcgQEAKIAkJc25kX2F6ZjMzMjhfZGJndGltZXIoImRlbGF5IHdhcyB0b28gbG93ICglZCkhXG4iLCBkZWxheSk7CiAJCWRlbGF5ID0gNDk7IC8qIG1pbmltdW0gdGltZSBpcyA0OSB0aWNrcyAqLwogCX0KLQlzbmRfYXpmMzMyOF9kYmd0aW1lcigic2V0dGluZyB0aW1lciBjb3VudGRvd24gdmFsdWUgJWQsIGFkZCBDT1VOVERPV058SVJRXG4iLCBkZWxheSk7CisJc25kX2F6ZjMzMjhfZGJndGltZXIoInNldHRpbmcgdGltZXIgY291bnRkb3duIHZhbHVlICVkXG4iLCBkZWxheSk7CiAJZGVsYXkgfD0gVElNRVJfQ09VTlRET1dOX0VOQUJMRSB8IFRJTUVSX0lSUV9FTkFCTEU7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJc25kX2F6ZjMzMjhfY3RybF9vdXRsKGNoaXAsIElEWF9JT19USU1FUl9WQUxVRSwgZGVsYXkpOwpAQCAtMjE4MCw2ICsyMTc0LDcgQEAKIAl9OwogCXU4IGRtYV9pbml0OwogCWVudW0gc25kX2F6ZjMzMjhfY29kZWNfdHlwZSBjb2RlY190eXBlOworCXN0cnVjdCBzbmRfYXpmMzMyOF9jb2RlY19kYXRhICpjb2RlY19zZXR1cDsKIAogCSpyY2hpcCA9IE5VTEw7CiAKQEAgLTIyMTcsMTUgKzIyMTIsMjMgQEAKIAljaGlwLT5vcGwzX2lvICA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDMpOwogCWNoaXAtPm1peGVyX2lvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgNCk7CiAKLQljaGlwLT5jb2RlY3NbQVpGX0NPREVDX1BMQVlCQUNLXS5pb19iYXNlID0KLQkJCQljaGlwLT5jdHJsX2lvICsgQVpGX0lPX09GRlNfQ09ERUNfUExBWUJBQ0s7Ci0JY2hpcC0+Y29kZWNzW0FaRl9DT0RFQ19QTEFZQkFDS10ubmFtZSA9ICJQTEFZQkFDSyI7Ci0JY2hpcC0+Y29kZWNzW0FaRl9DT0RFQ19DQVBUVVJFXS5pb19iYXNlID0KLQkJCQljaGlwLT5jdHJsX2lvICsgQVpGX0lPX09GRlNfQ09ERUNfQ0FQVFVSRTsKLQljaGlwLT5jb2RlY3NbQVpGX0NPREVDX0NBUFRVUkVdLm5hbWUgPSAiQ0FQVFVSRSI7Ci0JY2hpcC0+Y29kZWNzW0FaRl9DT0RFQ19JMlNfT1VUXS5pb19iYXNlID0KLQkJCQljaGlwLT5jdHJsX2lvICsgQVpGX0lPX09GRlNfQ09ERUNfSTJTX09VVDsKLQljaGlwLT5jb2RlY3NbQVpGX0NPREVDX0kyU19PVVRdLm5hbWUgPSAiSTJTX09VVCI7CisJY29kZWNfc2V0dXAgPSAmY2hpcC0+Y29kZWNzW0FaRl9DT0RFQ19QTEFZQkFDS107CisJY29kZWNfc2V0dXAtPmlvX2Jhc2UgPSBjaGlwLT5jdHJsX2lvICsgQVpGX0lPX09GRlNfQ09ERUNfUExBWUJBQ0s7CisJY29kZWNfc2V0dXAtPmxvY2sgPSAmY2hpcC0+cmVnX2xvY2s7CisJY29kZWNfc2V0dXAtPnR5cGUgPSBBWkZfQ09ERUNfUExBWUJBQ0s7CisJY29kZWNfc2V0dXAtPm5hbWUgPSAiUExBWUJBQ0siOworCisJY29kZWNfc2V0dXAgPSAmY2hpcC0+Y29kZWNzW0FaRl9DT0RFQ19DQVBUVVJFXTsKKwljb2RlY19zZXR1cC0+aW9fYmFzZSA9IGNoaXAtPmN0cmxfaW8gKyBBWkZfSU9fT0ZGU19DT0RFQ19DQVBUVVJFOworCWNvZGVjX3NldHVwLT5sb2NrID0gJmNoaXAtPnJlZ19sb2NrOworCWNvZGVjX3NldHVwLT50eXBlID0gQVpGX0NPREVDX0NBUFRVUkU7CisJY29kZWNfc2V0dXAtPm5hbWUgPSAiQ0FQVFVSRSI7CisKKwljb2RlY19zZXR1cCA9ICZjaGlwLT5jb2RlY3NbQVpGX0NPREVDX0kyU19PVVRdOworCWNvZGVjX3NldHVwLT5pb19iYXNlID0gY2hpcC0+Y3RybF9pbyArIEFaRl9JT19PRkZTX0NPREVDX0kyU19PVVQ7CisJY29kZWNfc2V0dXAtPmxvY2sgPSAmY2hpcC0+cmVnX2xvY2s7CisJY29kZWNfc2V0dXAtPnR5cGUgPSBBWkZfQ09ERUNfSTJTX09VVDsKKwljb2RlY19zZXR1cC0+bmFtZSA9ICJJMlNfT1VUIjsKIAogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2F6ZjMzMjhfaW50ZXJydXB0LAogCQkJSVJRRl9TSEFSRUQsIGNhcmQtPnNob3J0bmFtZSwgY2hpcCkpIHsKQEAgLTIyNTcsMTUgKzIyNjAsMTUgQEAKIAkJc3RydWN0IHNuZF9hemYzMzI4X2NvZGVjX2RhdGEgKmNvZGVjID0KIAkJCSAmY2hpcC0+Y29kZWNzW2NvZGVjX3R5cGVdOwogCi0JCS8qIHNodXRkb3duIGNvZGVjcyB0byBzYXZlIHBvd2VyICovCisJCS8qIHNodXRkb3duIGNvZGVjcyB0byByZWR1Y2UgcG93ZXIgLyBub2lzZSAqLwogCQkJLyogaGF2ZSAuLi5jdHJsX2NvZGVjX2FjdGl2aXR5KCkgYWN0IHByb3Blcmx5ICovCiAJCWNvZGVjLT5ydW5uaW5nID0gMTsKIAkJc25kX2F6ZjMzMjhfY3RybF9jb2RlY19hY3Rpdml0eShjaGlwLCBjb2RlY190eXBlLCAwKTsKIAotCQlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoY29kZWMtPmxvY2spOwogCQlzbmRfYXpmMzMyOF9jb2RlY19vdXRiKGNvZGVjLCBJRFhfSU9fQ09ERUNfRE1BX0ZMQUdTLAogCQkJCQkJIGRtYV9pbml0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycShjb2RlYy0+bG9jayk7CiAJfQogCiAJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGNpLT5kZXYpOwpAQCAtMjQxOSw2ICsyNDIyLDcgQEAKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKIAorCS8qIHNhbWUgcGNtIG9iamVjdCBmb3IgcGxheWJhY2svY2FwdHVyZSAqLwogCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtW0FaRl9DT0RFQ19QTEFZQkFDS10pOwogCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtW0FaRl9DT0RFQ19JMlNfT1VUXSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggMzdlMWI1ZC4uMjk1OGEwNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTYzNywxNSArNjM3LDkgQEAKIHN0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCiB7Ci0Jc3RhdGljIGNoYXIgKnRleHRzWzNdID0geyJUViBUdW5lciIsICJGTSIsICJNaWMvTGluZSJ9OworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0ZXh0c1szXSA9IHsiVFYgVHVuZXIiLCAiRk0iLCAiTWljL0xpbmUifTsKIAotCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JaW5mby0+Y291bnQgPSAxOwotCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwotCWlmIChpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAyKQotCQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOwotCXN0cmNweShpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW2luZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwotCXJldHVybiAwOworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCB0ZXh0cyk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2J0ODd4X2NhcHR1cmVfc291cmNlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2LmggYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNi5oCmluZGV4IGYxOWMxMTAuLmZjNTNiOWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2LmgKKysrIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDYuaApAQCAtMTg4LDcgKzE4OCw3IEBACiAjZGVmaW5lIFBMQVlCQUNLX0xJU1RfUFRSCTB4MDIJCS8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcGVyaW9kIGJlaW5nIHBsYXllZCAqLwogCQkJCQkJLyogUFRSWzU6MF0sIERlZmF1bHQ6IDB4MCAqLwogI2RlZmluZSBQTEFZQkFDS19VTktOT1dOMwkweDAzCQkvKiBOb3QgdXNlZCA/PyAqLwotI2RlZmluZSBQTEFZQkFDS19ETUFfQUREUgkweDA0CQkvKiBQbGF5YmFjayBETUEgYWRkcmVzc3MgKi8KKyNkZWZpbmUgUExBWUJBQ0tfRE1BX0FERFIJMHgwNAkJLyogUGxheWJhY2sgRE1BIGFkZHJlc3MgKi8KIAkJCQkJCS8qIERNQVszMTowXSwgRGVmYXVsdDogMHgwICovCiAjZGVmaW5lIFBMQVlCQUNLX1BFUklPRF9TSVpFCTB4MDUJCS8qIFBsYXliYWNrIHBlcmlvZCBzaXplLiB3aW4yMDAwIHVzZXMgMHgwNDAwMDAwMCAqLwogCQkJCQkJLyogU0laRVszMToxNl0sIERlZmF1bHQ6IDB4MCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IGQyZDEyYzAuLjAxYjQ5MzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX2NhMDEwNl9wY20gKmVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJc25kX3BjbV91ZnJhbWVzX3QgcHRyLCBwdHIxLCBwdHIyID0gMDsKLQlpbnQgY2hhbm5lbCA9IGNoYW5uZWw9ZXBjbS0+Y2hhbm5lbF9pZDsKKwlpbnQgY2hhbm5lbCA9IGVwY20tPmNoYW5uZWxfaWQ7CiAKIAlpZiAoIWVwY20tPnJ1bm5pbmcpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NtaXBjaS5jIGIvc291bmQvcGNpL2NtaXBjaS5jCmluZGV4IDMyOTk2OGUuLmI1YmIwMzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jbWlwY2kuYworKysgYi9zb3VuZC9wY2kvY21pcGNpLmMKQEAgLTI1MDcsMTQgKzI1MDcsMTIgQEAKIAkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlzdHJ1Y3QgY21pcGNpICpjbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdGF0aWMgY2hhciAqdGV4dHNbM10gPSB7ICJMaW5lLUluIiwgIlJlYXIgT3V0cHV0IiwgIkJhc3MgT3V0cHV0IiB9OwotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCXVpbmZvLT5jb3VudCA9IDE7Ci0JdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBjbS0+Y2hpcF92ZXJzaW9uID49IDM5ID8gMyA6IDI7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGV4dHNbM10gPSB7CisJCSJMaW5lLUluIiwgIlJlYXIgT3V0cHV0IiwgIkJhc3MgT3V0cHV0IgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWluZm8sIDEsCisJCQkJIGNtLT5jaGlwX3ZlcnNpb24gPj0gMzkgPyAzIDogMiwgdGV4dHMpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfbGluZV9pbl9tb2RlKHN0cnVjdCBjbWlwY2kgKmNtKQpAQCAtMjU2NCwxNCArMjU2Miw5IEBACiBzdGF0aWMgaW50IHNuZF9jbWlwY2lfbWljX2luX21vZGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKLQlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICJNaWMtSW4iLCAiQ2VudGVyL0xGRSBPdXRwdXQiIH07Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGV4dHNbMl0gPSB7ICJNaWMtSW4iLCAiQ2VudGVyL0xGRSBPdXRwdXQiIH07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWluZm8sIDEsIDIsIHRleHRzKTsKIH0KIAogc3RhdGljIGludCBzbmRfY21pcGNpX21pY19pbl9tb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wbS5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKaW5kZXggYTMzMDFjYy4uMTg1YjAwMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKQEAgLTkwLDEyICs5MCw3IEBACiAJaW50IGk7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKLQlpZiAocGNpX3Jlc3RvcmVfc3RhdGUocGNpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczU1MzVhdWRpbzogcGNpX3Jlc3RvcmVfc3RhdGUgZmFpbGVkLCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIGRldmljZVxuIik7Ci0JCXNuZF9jYXJkX2Rpc2Nvbm5lY3QoY2FyZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2kpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImNzNTUzNWF1ZGlvOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQsICIKIAkJICAgICAgICJkaXNhYmxpbmcgZGV2aWNlXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCmluZGV4IGRmNDdmNzMuLjBjNzAxZTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtMTE0LDcgKzExNCw3IEBACiAJCQkJCQkgKi8KICNkZWZpbmUgUExBWUJBQ0tfTElTVF9TSVpFCTB4MDEJCS8qIFNpemUgb2YgbGlzdCBpbiBieXRlcyA8PCAxNi4gRS5nLiA4IHBlcmlvZHMgLT4gMHgwMDM4MDAwMCAgKi8KICNkZWZpbmUgUExBWUJBQ0tfTElTVF9QVFIJMHgwMgkJLyogUG9pbnRlciB0byB0aGUgY3VycmVudCBwZXJpb2QgYmVpbmcgcGxheWVkICovCi0jZGVmaW5lIFBMQVlCQUNLX0RNQV9BRERSCTB4MDQJCS8qIFBsYXliYWNrIERNQSBhZGRyZXNzcyAqLworI2RlZmluZSBQTEFZQkFDS19ETUFfQUREUgkweDA0CQkvKiBQbGF5YmFjayBETUEgYWRkcmVzcyAqLwogI2RlZmluZSBQTEFZQkFDS19QRVJJT0RfU0laRQkweDA1CQkvKiBQbGF5YmFjayBwZXJpb2Qgc2l6ZSAqLwogI2RlZmluZSBQTEFZQkFDS19QT0lOVEVSCTB4MDYJCS8qIFBsYXliYWNrIHBlcmlvZCBwb2ludGVyLiBTYW1wbGUgY3VycmVudGx5IGluIERBQyAqLwogI2RlZmluZSBQTEFZQkFDS19VTktOT1dOMSAgICAgICAweDA3CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmggYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmgKaW5kZXggMTUzMjE0OTQuLjAwZjQ4MTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuaAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmgKQEAgLTk2LDcgKzk2LDcgQEAKICNkZWZpbmUgUExBWUJBQ0tfTElTVF9TSVpFCTB4MDEJCS8qIFNpemUgb2YgbGlzdCBpbiBieXRlcyA8PCAxNi4gRS5nLiA4IHBlcmlvZHMgLT4gMHgwMDM4MDAwMCAgKi8KICNkZWZpbmUgUExBWUJBQ0tfTElTVF9QVFIJMHgwMgkJLyogUG9pbnRlciB0byB0aGUgY3VycmVudCBwZXJpb2QgYmVpbmcgcGxheWVkICovCiAjZGVmaW5lIFBMQVlCQUNLX1VOS05PV04zCTB4MDMJCS8qIE5vdCB1c2VkICovCi0jZGVmaW5lIFBMQVlCQUNLX0RNQV9BRERSCTB4MDQJCS8qIFBsYXliYWNrIERNQSBhZGRyZXNzcyAqLworI2RlZmluZSBQTEFZQkFDS19ETUFfQUREUgkweDA0CQkvKiBQbGF5YmFjayBETUEgYWRkcmVzcyAqLwogI2RlZmluZSBQTEFZQkFDS19QRVJJT0RfU0laRQkweDA1CQkvKiBQbGF5YmFjayBwZXJpb2Qgc2l6ZS4gd2luMjAwMCB1c2VzIDB4MDQwMDAwMDAgKi8KICNkZWZpbmUgUExBWUJBQ0tfUE9JTlRFUgkweDA2CQkvKiBQbGF5YmFjayBwZXJpb2QgcG9pbnRlci4gVXNlZCB3aXRoIFBMQVlCQUNLX0xJU1RfUFRSIHRvIGRldGVybWluZSBidWZmZXIgcG9zaXRpb24gY3VycmVudGx5IGluIERBQyAqLwogI2RlZmluZSBQTEFZQkFDS19GSUZPX0VORF9BRERSRVNTCTB4MDcJCS8qIFBsYXliYWNrIEZJRk8gZW5kIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5NjguYyBiL3NvdW5kL3BjaS9lczE5NjguYwppbmRleCAyM2E1OGYwLi43YzE3ZjQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC0yMjAsNyArMjIwLDcgQEAKICNkZWZpbmUJUklOR0JfRU5fMkNPREVDCQkweDAwMjAKICNkZWZpbmUgUklOR0JfU0lOR19CSVRfRFVBTAkweDAwNDAKIAotLyogKioqKlBvcnQgQWRyZXNzZXMqKioqICovCisvKiAqKioqUG9ydCBBZGRyZXNzZXMqKioqICovCiAKIC8qICAgV3JpdGUgJiBSZWFkICovCiAjZGVmaW5lIEVTTV9JTkRFWAkJMHgwMgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKaW5kZXggOThiNmQwMi4uMDVlNWVjOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCkBAIC00NTcxLDYgKzQ1NzEsOSBAQAogCQl9CiAJCW1lbXNldChjZmctPmhwX3BpbnMgKyBjZmctPmhwX291dHMsIDAsCiAJCSAgICAgICBzaXplb2YoaGRhX25pZF90KSAqIChBVVRPX0NGR19NQVhfT1VUUyAtIGNmZy0+aHBfb3V0cykpOworCQlpZiAoIWNmZy0+aHBfb3V0cykKKwkJCWNmZy0+bGluZV9vdXRfdHlwZSA9IEFVVE9fUElOX0hQX09VVDsKKwogCX0KIAogCS8qIHNvcnQgYnkgc2VxdWVuY2UgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IGExYzQwMDguLmQzZDE4YmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtMTIzNSw3ICsxMjM1LDggQEAKIAkJCXBvc19hZGogPSAwOwogCQl9IGVsc2UgewogCQkJb2ZzID0gc2V0dXBfYmRsZShzdWJzdHJlYW0sIGF6eF9kZXYsCi0JCQkJCSAmYmRsLCBvZnMsIHBvc19hZGosIDEpOworCQkJCQkgJmJkbCwgb2ZzLCBwb3NfYWRqLAorCQkJCQkgIXN1YnN0cmVhbS0+cnVudGltZS0+bm9fcGVyaW9kX3dha2V1cCk7CiAJCQlpZiAob2ZzIDwgMCkKIAkJCQlnb3RvIGVycm9yOwogCQl9CkBAIC0xMjQ3LDcgKzEyNDgsOCBAQAogCQkJCQkgcGVyaW9kX2J5dGVzIC0gcG9zX2FkaiwgMCk7CiAJCWVsc2UKIAkJCW9mcyA9IHNldHVwX2JkbGUoc3Vic3RyZWFtLCBhenhfZGV2LCAmYmRsLCBvZnMsCi0JCQkJCSBwZXJpb2RfYnl0ZXMsIDEpOworCQkJCQkgcGVyaW9kX2J5dGVzLAorCQkJCQkgIXN1YnN0cmVhbS0+cnVudGltZS0+bm9fcGVyaW9kX3dha2V1cCk7CiAJCWlmIChvZnMgPCAwKQogCQkJZ290byBlcnJvcjsKIAl9CkBAIC0xNTE1LDcgKzE1MTcsOCBAQAogCQkJCSAvKiBObyBmdWxsLXJlc3VtZSB5ZXQgaW1wbGVtZW50ZWQgKi8KIAkJCQkgLyogU05EUlZfUENNX0lORk9fUkVTVU1FIHwqLwogCQkJCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKKwkJCQkgU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCksCiAJLmZvcm1hdHMgPQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCiAJLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFXzQ4MDAwLAogCS5yYXRlX21pbiA9CQk0ODAwMCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IGY3ZmYzZjcuLjQ2NzgwNjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJSERBX0NPREVDX01VVEUoIkF1eCBQbGF5YmFjayBTd2l0Y2giLCAweDE2LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDEzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDBmLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1vbm8gUGxheWJhY2sgVm9sdW1lIiwgMHgxZSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDFlLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTcyOSw3ICs3MjksNyBAQAogCUhEQV9DT0RFQ19NVVRFKCJBdXggUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKIAkvKiAKIAkgICBIREFfQ09ERUNfVk9MVU1FKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MWUsIDB4MCwgSERBX09VVFBVVCksCiAJICAgSERBX0NPREVDX01VVEUoIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxZSwgMHgwLCBIREFfT1VUUFVUKSwgKi8KQEAgLTc3NSw3ICs3NzUsNyBAQAogCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTMsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTIsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKIAl7CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MTMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxMywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCXsKQEAgLTE1MTUsOCArMTUxNSw4IEBACiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDFjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MWQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCiAJewpAQCAtMTcyNiw4ICsxNzI2LDggQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDFkLCAweDAsIEhEQV9PVVRQVVQpLAogI2VuZGlmCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTgsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCiAJewpAQCAtMTc3NCw3ICsxNzc0LDcgQEAKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTIsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKIAl7CkBAIC0yMTYwLDggKzIxNjAsOCBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkFuYWxvZyBNaXggUGxheWJhY2sgVm9sdW1lIiwgMHgyMSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQW5hbG9nIE1peCBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgzOSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDNjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDNjLCAweDAsIEhEQV9PVVRQVVQpLAogCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTIyMDMsOCArMjIwMyw4IEBACiAJSERBX0NPREVDX1ZPTFVNRSgiQW5hbG9nIE1peCBQbGF5YmFjayBWb2x1bWUiLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJBbmFsb2cgTWl4IFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCiAKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4M2MsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MzksIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4M2MsIDB4MCwgSERBX09VVFBVVCksCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiQ2hhbm5lbCBNb2RlIiwKQEAgLTIyMzIsNyArMjIzMiw3IEBACiAJSERBX0NPREVDX1ZPTFVNRSgiQW5hbG9nIE1peCBQbGF5YmFjayBWb2x1bWUiLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJBbmFsb2cgTWl4IFBsYXliYWNrIFN3aXRjaCIsIDB4MjEsIDB4MCwgSERBX09VVFBVVCksCiAKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAogCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTI5MDIsNyArMjkwMiw3IEBACiAJCWlkeCA9IGFkMTk4OF9waW5faWR4KHBpbik7CiAJCWJuaWQgPSBhZDE5ODhfYm9vc3Rfbmlkc1tpZHhdOwogCQlpZiAoYm5pZCkgewotCQkJc3ByaW50ZihuYW1lLCAiJXMgQm9vc3QiLCBjdGxuYW1lKTsKKwkJCXNwcmludGYobmFtZSwgIiVzIEJvb3N0IFZvbHVtZSIsIGN0bG5hbWUpOwogCQkJcmV0dXJuIGFkZF9jb250cm9sKHNwZWMsIEFEX0NUTF9XSURHRVRfVk9MLCBuYW1lLAogCQkJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKGJuaWQsIDMsIGlkeCwgSERBX09VVFBVVCkpOwogCkBAIC0zMzAwLDggKzMzMDAsOCBAQAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUVfSURYKCJDYXB0dXJlIFZvbHVtZSIsIDEsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCkBAIC0zNDk5LDkgKzM0OTksOSBAQAogCUhEQV9DT0RFQ19NVVRFKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDMsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRG9ja2luZyBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwNCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRG9ja2luZyBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2tpbmcgTWljIEJvb3N0IiwgMHgyNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRG9jayBNaWMgQm9vc3QgVm9sdW1lIiwgMHgyNSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtMzU2MCw4ICszNTYwLDggQEAKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZS1JbiBQbGF5YmFjayBWb2x1bWUiLCAweDIwLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lLUluIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZS1JbiBCb29zdCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZS1JbiBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtMzc0NSw5ICszNzQ1LDkgQEAKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDQsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgyMCwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDI1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE0LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MjUsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKQEAgLTM4ODgsOSArMzg4OCw5IEBACiAJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDQsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkRvY2sgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDQsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTUsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJEb2NrIE1pYyBCb29zdCIsIDB4MjUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTQsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIEJvb3N0IFZvbHVtZSIsIDB4MjUsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJeyB9IC8qIGVuZCAqLwpAQCAtNDEyNiw4ICs0MTI2LDggQEAKIAlIREFfQ09ERUNfTVVURSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4NSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgyMCwgMHgwMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE3LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDBjLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJewpAQCAtNDI1NSw4ICs0MjU1LDggQEAKIAlIREFfQ09ERUNfTVVURSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4NSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDI1LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgyNSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTQ0OTQsOSArNDQ5NCw5IEBACiAJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MTMsIDEsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEVfTU9OTygiTW9ubyBQbGF5YmFjayBTd2l0Y2giLCAweDEzLCAxLCAweDAsIEhEQV9PVVRQVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgzYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUtSW4gQm9vc3QiLCAweDNhLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDNjLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDM5LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUtSW4gQm9vc3QgVm9sdW1lIiwgMHgzYSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FX0lEWCgiQ2FwdHVyZSBWb2x1bWUiLCAxLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtNDU0Nyw3ICs0NTQ3LDcgQEAKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDIwLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MjAsIDB4MDYsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MjAsIDB4MDYsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRGlnaXRhbCBNaWMgQm9vc3QiLCAweDFmLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRGlnaXRhbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxZiwgMHgwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCA3NmJkNThhLi5lOTY1ODFmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC04NjksMTYgKzg2OSwxNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV9taXhlcnNbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRXh0IE1pYyBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkV4dCBNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDFhLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJFeHQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRXh0IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgyLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZjeHQ1MDQ1X2hwX2JpbmRfbWFzdGVyX3ZvbCksCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTkxMCwxNiArOTEwLDE2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0NTA0NV9taXhlcnNfaHA1MzBbXSA9IHsKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRXh0IE1pYyBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkV4dCBNaWMgQ2FwdHVyZSBTd2l0Y2giLCAweDFhLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBDYXB0dXJlIFZvbHVtZSIsIDB4MWEsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MWEsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMHgxYSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIENhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQ00gUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJFeHQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRXh0IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTcsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9CSU5EX1ZPTCgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICZjeHQ1MDQ1X2hwX2JpbmRfbWFzdGVyX3ZvbCksCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKIAl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50IG1pYyAqLworCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MX0sCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJIEFDX0FNUF9TRVRfSU5QVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgxN30sCkBAIC05NjAsNyArOTYwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV9iZW5xX2luaXRfdmVyYnNbXSA9IHsKLQkvKiBJbnQgTWljLCBNaWMgKi8KKwkvKiBJbnRlcm5hbCBNaWMsIE1pYyAqLwogCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl84MCB9LAogCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl84MCB9LAogCS8qIExpbmUgSW4sSFAsIEFtcCAgKi8KQEAgLTk3Myw3ICs5NzMsNyBAQAogCXsweDE3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgyKX0sCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDMpfSwKIAl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoNCl9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50IG1pYyAqLworCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDF9LAogCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAogCSBBQ19BTVBfU0VUX0lOUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MTd9LApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDQ3X2Jhc2VfbWl4ZXJzW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MTksIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MWEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDEyLCAweDAzLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTIsIDB4MDMsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiUENNIFZvbHVtZSIsIDB4MTAsIDB4MDAsIEhEQV9PVVRQVVQpLApAQCAtMTc5Niw4ICsxNzk2LDggQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDUxX2NhcHR1cmVfbWl4ZXJzW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFZvbHVtZSIsIDB4MTQsIDB4MDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBTd2l0Y2giLCAweDE0LCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkV4dGVybmFsIE1pYyBWb2x1bWUiLCAweDE0LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJFeHRlcm5hbCBNaWMgU3dpdGNoIiwgMHgxNCwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgVm9sdW1lIiwgMHgxNCwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFN3aXRjaCIsIDB4MTQsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRG9ja2luZyBNaWMgVm9sdW1lIiwgMHgxNSwgMHgwMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRG9ja2luZyBNaWMgU3dpdGNoIiwgMHgxNSwgMHgwMCwgSERBX0lOUFVUKSwKIAl7fQpAQCAtMTgwNiw4ICsxODA2LDggQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDUxX2hwX21peGVyc1tdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBWb2x1bWUiLCAweDE0LCAweDAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgU3dpdGNoIiwgMHgxNCwgMHgwMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJFeHRlcm5hbCBNaWMgVm9sdW1lIiwgMHgxNSwgMHgwMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRXh0ZXJuYWwgTWljIFN3aXRjaCIsIDB4MTUsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFZvbHVtZSIsIDB4MTUsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBTd2l0Y2giLCAweDE1LCAweDAwLCBIREFfSU5QVVQpLAogCXt9CiB9OwogCkBAIC0xODI2LDggKzE4MjYsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNTFfdG9zaGliYV9taXhlcnNbXSA9IHsKIAlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgVm9sdW1lIiwgMHgxNCwgMHgwMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFN3aXRjaCIsIDB4MTQsIDB4MDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRXh0ZXJuYWwgTWljIFZvbHVtZSIsIDB4MTQsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkV4dGVybmFsIE1pYyBTd2l0Y2giLCAweDE0LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBWb2x1bWUiLCAweDE0LCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgU3dpdGNoIiwgMHgxNCwgMHgwMSwgSERBX0lOUFVUKSwKIAl7fQogfTsKIApAQCAtMTg0Nyw3ICsxODQ3LDcgQEAKIAl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCS8qIERBQzEgKi8JCiAJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBSZWNvcmQgc2VsZWN0b3I6IEludCBtaWMgKi8KKwkvKiBSZWNvcmQgc2VsZWN0b3I6IEludGVybmFsIG1pYyAqLwogCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIHwgMHg0NH0sCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSkgfCAweDQ0fSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKSB8IDB4NDR9LApAQCAtMTg3NCw3ICsxODc0LDcgQEAKIAl7MHgxNiwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCS8qIERBQzEgKi8KIAl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50IG1pYyAqLworCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSkgfCAweDQ0fSwKIAl7MHgxNCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MX0sCiAJLyogU1BESUYgcm91dGU6IFBDTSAqLwpAQCAtMTkwNCw3ICsxOTA0LDcgQEAKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAogCS8qIERBQzEgKi8KIAl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogSW50IG1pYyAqLworCS8qIFJlY29yZCBzZWxlY3RvcjogSW50ZXJuYWwgbWljICovCiAJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCkgfCAweDQ0fSwKIAl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKSB8IDB4NDR9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApIHwgMHg0NH0sCkBAIC0xOTMyLDcgKzE5MzIsNyBAQAogCXsweDE2LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCiAJLyogREFDMSAqLwogCXsweDEwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCi0JLyogUmVjb3JkIHNlbGVjdG9yOiBJbnQgbWljICovCisJLyogUmVjb3JkIHNlbGVjdG9yOiBJbnRlcm5hbCBtaWMgKi8KIAl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKSB8IDB4NDR9LAogCXsweDE0LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgxfSwKIAkvKiBTUERJRiByb3V0ZTogUENNICovCkBAIC0yMTExLDYgKzIxMTEsMTEgQEAKIAl7IDIsIE5VTEwgfSwKIH07CiAKKyNkZWZpbmUgSFBfUFJFU0VOVF9QT1JUX0EJKDEgPDwgMCkKKyNkZWZpbmUgSFBfUFJFU0VOVF9QT1JUX0QJKDEgPDwgMSkKKyNkZWZpbmUgaHBfcG9ydF9hX3ByZXNlbnQoc3BlYykJKChzcGVjKS0+aHBfcHJlc2VudCAmIEhQX1BSRVNFTlRfUE9SVF9BKQorI2RlZmluZSBocF9wb3J0X2RfcHJlc2VudChzcGVjKQkoKHNwZWMpLT5ocF9wcmVzZW50ICYgSFBfUFJFU0VOVF9QT1JUX0QpCisKIHN0YXRpYyB2b2lkIGN4dDUwNjZfdXBkYXRlX3NwZWFrZXIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGNvbmV4YW50X3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTIxMjAsMjQgKzIxMjUsMjAgQEAKIAkJICAgIHNwZWMtPmhwX3ByZXNlbnQsIHNwZWMtPmN1cl9lYXBkKTsKIAogCS8qIFBvcnQgQSAoSFApICovCi0JcGluY3RsID0gKChzcGVjLT5ocF9wcmVzZW50ICYgMSkgJiYgc3BlYy0+Y3VyX2VhcGQpID8gUElOX0hQIDogMDsKKwlwaW5jdGwgPSAoaHBfcG9ydF9hX3ByZXNlbnQoc3BlYykgJiYgc3BlYy0+Y3VyX2VhcGQpID8gUElOX0hQIDogMDsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDE5LCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCiAJCQlwaW5jdGwpOwogCiAJLyogUG9ydCBEIChIUC9MTykgKi8KLQlpZiAoc3BlYy0+ZGVsbF9hdXRvbXV0ZSkgewotCQkvKiBERUxMIEFJTyBQb3J0IFJ1bGU6IFBvcnRBPiAgUG9ydEQ+ICBJbnRTcGsgKi8KLQkJcGluY3RsID0gKCEoc3BlYy0+aHBfcHJlc2VudCAmIDEpICYmIHNwZWMtPmN1cl9lYXBkKQotCQkJPyBQSU5fT1VUIDogMDsKLQl9IGVsc2UgaWYgKHNwZWMtPnRoaW5rcGFkKSB7Ci0JCWlmIChzcGVjLT5jdXJfZWFwZCkKLQkJCXBpbmN0bCA9IHNwZWMtPnBvcnRfZF9tb2RlOwotCQkvKiBNdXRlIGRvY2sgbGluZS1vdXQgaWYgUG9ydCBBIChsYXB0b3AgSFApIGlzIHByZXNlbnQgKi8KLQkJaWYgKHNwZWMtPmhwX3ByZXNlbnQmICAxKQorCXBpbmN0bCA9IHNwZWMtPmN1cl9lYXBkID8gc3BlYy0+cG9ydF9kX21vZGUgOiAwOworCWlmIChzcGVjLT5kZWxsX2F1dG9tdXRlIHx8IHNwZWMtPnRoaW5rcGFkKSB7CisJCS8qIE11dGUgaWYgUG9ydCBBIGlzIGNvbm5lY3RlZCAqLworCQlpZiAoaHBfcG9ydF9hX3ByZXNlbnQoc3BlYykpCiAJCQlwaW5jdGwgPSAwOwogCX0gZWxzZSB7Ci0JCXBpbmN0bCA9ICgoc3BlYy0+aHBfcHJlc2VudCAmIDIpICYmIHNwZWMtPmN1cl9lYXBkKQotCQkJPyBzcGVjLT5wb3J0X2RfbW9kZSA6IDA7CisJCS8qIFRoaW5rcGFkL0RlbGwgZG9lc24ndCBnaXZlIHBpbi1EIHN0YXR1cyAqLworCQlpZiAoIWhwX3BvcnRfZF9wcmVzZW50KHNwZWMpKQorCQkJcGluY3RsID0gMDsKIAl9CiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxYywgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJcGluY3RsKTsKQEAgLTIzNzksOCArMjM4MCw4IEBACiAJLyogUG9ydCBEICovCiAJcG9ydEQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDFjKTsKIAotCXNwZWMtPmhwX3ByZXNlbnQgPSAhIShwb3J0QSk7Ci0Jc3BlYy0+aHBfcHJlc2VudCB8PSBwb3J0RCA/IDIgOiAwOworCXNwZWMtPmhwX3ByZXNlbnQgPSBwb3J0QSA/IEhQX1BSRVNFTlRfUE9SVF9BIDogMDsKKwlzcGVjLT5ocF9wcmVzZW50IHw9IHBvcnREID8gSFBfUFJFU0VOVF9QT1JUX0QgOiAwOwogCXNuZF9wcmludGRkKCJDWFQ1MDY2OiBocCBhdXRvbXV0ZSBwb3J0QT0leCBwb3J0RD0leCBwcmVzZW50PSVkXG4iLAogCQlwb3J0QSwgcG9ydEQsIHNwZWMtPmhwX3ByZXNlbnQpOwogCWN4dDUwNjZfdXBkYXRlX3NwZWFrZXIoY29kZWMpOwpAQCAtMjcyOCw3ICsyNzI5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjeHQ1MDY2X3Zvc3Ryb19taXhlcnNbXSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJJbnQgTWljIEJvb3N0IENhcHR1cmUgRW51bSIsCisJCS5uYW1lID0gIkludGVybmFsIE1pYyBCb29zdCBDYXB0dXJlIEVudW0iLAogCQkuaW5mbyA9IGN4dDUwNjZfbWljX2Jvb3N0X211eF9lbnVtX2luZm8sCiAJCS5nZXQgPSBjeHQ1MDY2X21pY19ib29zdF9tdXhfZW51bV9nZXQsCiAJCS5wdXQgPSBjeHQ1MDY2X21pY19ib29zdF9tdXhfZW51bV9wdXQsCkBAIC0yOTU0LDcgKzI5NTUsNyBAQAogCXsweDIyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAogCiAJLyogaW50ZXJuYWwgbWljcm9waG9uZSAqLwotCXsweDIzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sIC8qIGVuYWJsZSBpbnQgbWljICovCisJezB4MjMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfSwgLyogZW5hYmxlIGludGVybmFsIG1pYyAqLwogCiAJLyogRUFQRCAqLwogCXsweDFkLCBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwgMHgyfSwgLyogZGVmYXVsdCBvbiAqLwpAQCAtMzAwOSw3ICszMDEwLDcgQEAKIAl7MHgyMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKIAogCS8qIGludGVybmFsIG1pY3JvcGhvbmUgKi8KLQl7MHgyMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LCAvKiBlbmFibGUgaW50IG1pYyAqLworCXsweDIzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sIC8qIGVuYWJsZSBpbnRlcm5hbCBtaWMgKi8KIAogCS8qIEVBUEQgKi8KIAl7MHgxZCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4Mn0sIC8qIGRlZmF1bHQgb24gKi8KQEAgLTMwOTcsNiArMzA5OCw3IEBACiAJU05EX1BDSV9RVUlSS19NQVNLKDB4MTAyNSwgMHhmZjAwLCAweDA0MDAsICJBY2VyIiwgQ1hUNTA2Nl9JREVBUEFEKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmQ4LCAiRGVsbCBWb3N0cm8iLCBDWFQ1MDY2X0RFTExfVk9TVFJPKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmY1LCAiRGVsbCBWb3N0cm8gMzIwIiwgQ1hUNTA2Nl9JREVBUEFEKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNDAxLCAiRGVsbCBWb3N0cm8gMTAxNCIsIENYVDUwNjZfREVMTF9WT1NUUk8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0MDIsICJEZWxsIFZvc3RybyIsIENYVDUwNjZfREVMTF9WT1NUUk8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0MDgsICJEZWxsIEluc3Bpcm9uIE9uZSAxOVQiLCBDWFQ1MDY2X0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDM2MGIsICJIUCBHNjAiLCBDWFQ1MDY2X0hQX0xBUFRPUCksCkBAIC0zMTA4LDE2ICszMTEwLDkgQEAKIAkJICAgICAgQ1hUNTA2Nl9MQVBUT1ApLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA4MzMsICJPTFBDIFhPLTEuNSIsIENYVDUwNjZfT0xQQ19YT18xXzUpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJMZW5vdm8gVDQwMHMiLCBDWFQ1MDY2X1RISU5LUEFEKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWIyLCAiVGhpbmtwYWQgWDEwMGUiLCBDWFQ1MDY2X0lERUFQQUQpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYzUsICJUaGlua3BhZCBFZGdlIDEzIiwgQ1hUNTA2Nl9USElOS1BBRCksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjFiMywgIlRoaW5rcGFkIEVkZ2UgMTMgKDE5NykiLCBDWFQ1MDY2X0lERUFQQUQpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYjQsICJUaGlua3BhZCBFZGdlIiwgQ1hUNTA2Nl9JREVBUEFEKSwKLQlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWM4LCAiVGhpbmtwYWQgRWRnZSAxMSIsIENYVDUwNjZfSURFQVBBRCksCiAgCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxNWUsICJMZW5vdm8gVGhpbmtwYWQiLCBDWFQ1MDY2X1RISU5LUEFEKSwKLSAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzhhZiwgIkxlbm92byBHIHNlcmllcyIsIENYVDUwNjZfSURFQVBBRCksCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzkwYSwgIkxlbm92byBTMTAtM3QiLCBDWFQ1MDY2X0lERUFQQUQpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM5MzgsICJMZW5vdm8gRyBzZXJpZXMgKEFNRCkiLCBDWFQ1MDY2X0lERUFQQUQpLAotCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNhMGQsICJpZGVhcGFkIiwgQ1hUNTA2Nl9JREVBUEFEKSwKKwlTTkRfUENJX1FVSVJLX1ZFTkRPUigweDE3YWEsICJMZW5vdm8iLCBDWFQ1MDY2X0lERUFQQUQpLCAvKiBGYWxsYmFjayBmb3IgTGVub3ZvcyB3aXRob3V0IGRvY2sgbWljICovCiAJe30KIH07CiAKQEAgLTM0MjIsNiArMzQxNyw5IEBACiAJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKIAkJCQkgICAgcHJlc2VudCA/IDAgOiBQSU5fT1VUKTsKIAl9CisJZm9yIChpID0gMDsgIXByZXNlbnQgJiYgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspCisJCWlmIChzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBjZmctPmxpbmVfb3V0X3BpbnNbaV0pKQorCQkJcHJlc2VudCA9IDE7CiAJZm9yIChpID0gMDsgaSA8IGNmZy0+c3BlYWtlcl9vdXRzOyBpKyspIHsKIAkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY2ZnLT5zcGVha2VyX3BpbnNbaV0sIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggMzFkZjc3NC4uZjI5Yjk3YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTMxLDEwICszMSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKIAorc3RhdGljIGJvb2wgc3RhdGljX2hkbWlfcGNtOworbW9kdWxlX3BhcmFtKHN0YXRpY19oZG1pX3BjbSwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXRpY19oZG1pX3BjbSwgIkRvbid0IHJlc3RyaWN0IFBDTSBwYXJhbWV0ZXJzIHBlciBFTEQgaW5mbyIpOworCiAvKgogICogVGhlIEhETUkvRGlzcGxheVBvcnQgY29uZmlndXJhdGlvbiBjYW4gYmUgaGlnaGx5IGR5bmFtaWMuIEEgZ3JhcGhpY3MgZGV2aWNlCiAgKiBjb3VsZCBzdXBwb3J0IHR3byBpbmRlcGVuZGVudCBwaXBlcywgZWFjaCBvZiB0aGVtIGNhbiBiZSBjb25uZWN0ZWQgdG8gb25lIG9yCkBAIC04MjcsNyArODMyLDcgQEAKIAkJKmNvZGVjX3BhcnMgPSAqaGluZm87CiAKIAllbGQgPSAmc3BlYy0+c2lua19lbGRbaWR4XTsKLQlpZiAoZWxkLT5zYWRfY291bnQgPiAwKSB7CisJaWYgKCFzdGF0aWNfaGRtaV9wY20gJiYgZWxkLT5lbGRfdmFsaWQgJiYgZWxkLT5zYWRfY291bnQgPiAwKSB7CiAJCWhkbWlfZWxkX3VwZGF0ZV9wY21faW5mbyhlbGQsIGhpbmZvLCBjb2RlY19wYXJzKTsKIAkJaWYgKGhpbmZvLT5jaGFubmVsc19taW4gPiBoaW5mby0+Y2hhbm5lbHNfbWF4IHx8CiAJCSAgICAhaGluZm8tPnJhdGVzIHx8ICFoaW5mby0+Zm9ybWF0cykKQEAgLTkwNCwyMyArOTA5LDI4IEBACiAJc3BlYy0+cGluW3NwZWMtPm51bV9waW5zXSA9IHBpbl9uaWQ7CiAJc3BlYy0+bnVtX3BpbnMrKzsKIAotCS8qCi0JICogSXQgaXMgYXNzdW1lZCB0aGF0IGNvbnZlcnRlciBub2RlcyBjb21lIGZpcnN0IGluIHRoZSBub2RlIGxpc3QgYW5kCi0JICogaGVuY2UgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYW5kIHVzYWJsZSBub3cuCi0JICovCiAJcmV0dXJuIGhkbWlfcmVhZF9waW5fY29ubihjb2RlYywgcGluX25pZCk7CiB9CiAKIHN0YXRpYyBpbnQgaGRtaV9hZGRfY3Z0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogeworCWludCBpLCBmb3VuZF9waW4gPSAwOwogCXN0cnVjdCBoZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAotCWlmIChzcGVjLT5udW1fY3Z0cyA+PSBNQVhfSERNSV9DVlRTKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAiSERNSTogbm8gc3BhY2UgZm9yIGNvbnZlcnRlciAlZFxuIiwgbmlkKTsKLQkJcmV0dXJuIC1FMkJJRzsKKwlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX3BpbnM7IGkrKykKKwkJaWYgKG5pZCA9PSBzcGVjLT5waW5fY3Z0W2ldKSB7CisJCQlmb3VuZF9waW4gPSAxOworCQkJYnJlYWs7CisJCX0KKworCWlmICghZm91bmRfcGluKSB7CisJCXNuZF9wcmludGRkKCJIRE1JOiBTa2lwcGluZyBub2RlICVkIChubyBjb25uZWN0aW9uKVxuIiwgbmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHNuZF9CVUdfT04oc3BlYy0+bnVtX2N2dHMgPj0gTUFYX0hETUlfQ1ZUUykpCisJCXJldHVybiAtRTJCSUc7CisKIAlzcGVjLT5jdnRbc3BlYy0+bnVtX2N2dHNdID0gbmlkOwogCXNwZWMtPm51bV9jdnRzKys7CiAKQEAgLTkzMSw2ICs5NDEsOCBAQAogewogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGksIG5vZGVzOworCWludCBudW1fdG1wX2N2dHMgPSAwOworCWhkYV9uaWRfdCB0bXBfY3Z0W01BWF9IRE1JX0NWVFNdOwogCiAJbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5hZmcsICZuaWQpOwogCWlmICghbmlkIHx8IG5vZGVzIDwgMCkgewpAQCAtOTQxLDYgKzk1Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyssIG5pZCsrKSB7CiAJCXVuc2lnbmVkIGludCBjYXBzOwogCQl1bnNpZ25lZCBpbnQgdHlwZTsKKwkJdW5zaWduZWQgaW50IGNvbmZpZzsKIAogCQljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKTsKIAkJdHlwZSA9IGdldF93Y2Fwc190eXBlKGNhcHMpOwpAQCAtOTUwLDE3ICs5NjMsMzIgQEAKIAogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBBQ19XSURfQVVEX09VVDoKLQkJCWhkbWlfYWRkX2N2dChjb2RlYywgbmlkKTsKKwkJCWlmIChudW1fdG1wX2N2dHMgPj0gTUFYX0hETUlfQ1ZUUykgeworCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICJIRE1JOiBubyBzcGFjZSBmb3IgY29udmVydGVyICVkXG4iLCBuaWQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdG1wX2N2dFtudW1fdG1wX2N2dHNdID0gbmlkOworCQkJbnVtX3RtcF9jdnRzKys7CiAJCQlicmVhazsKIAkJY2FzZSBBQ19XSURfUElOOgogCQkJY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCk7CiAJCQlpZiAoIShjYXBzICYgKEFDX1BJTkNBUF9IRE1JIHwgQUNfUElOQ0FQX0RQKSkpCiAJCQkJY29udGludWU7CisKKwkJCWNvbmZpZyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxULCAwKTsKKwkJCWlmIChnZXRfZGVmY2ZnX2Nvbm5lY3QoY29uZmlnKSA9PSBBQ19KQUNLX1BPUlRfTk9ORSkKKwkJCQljb250aW51ZTsKKwogCQkJaGRtaV9hZGRfcGluKGNvZGVjLCBuaWQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3RtcF9jdnRzOyBpKyspCisJCWhkbWlfYWRkX2N2dChjb2RlYywgdG1wX2N2dFtpXSk7CisKIAkvKgogCSAqIEc0NS9JYmV4UGVhayBkb24ndCBzdXBwb3J0IEVQU1M6IHRoZSB1bnNvbGljaXRlZCBwaW4gaG90IHBsdWcgZXZlbnQKIAkgKiBjYW4gYmUgbG9zdCBhbmQgcHJlc2VuY2Ugc2Vuc2UgdmVyYiB3aWxsIGJlY29tZSBpbmFjY3VyYXRlIGlmIHRoZQpAQCAtMTE2NSwxMSArMTE5Myw1MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGNoYW5uZWxzXzJfNl84W10gPSB7CisJMiwgNiwgOAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjaGFubmVsc18yXzhbXSA9IHsKKwkyLCA4Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGh3X2NvbnN0cmFpbnRzXzJfNl84X2NoYW5uZWxzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoY2hhbm5lbHNfMl82XzgpLAorCS5saXN0ID0gY2hhbm5lbHNfMl82XzgsCisJLm1hc2sgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBod19jb25zdHJhaW50c18yXzhfY2hhbm5lbHMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShjaGFubmVsc18yXzgpLAorCS5saXN0ID0gY2hhbm5lbHNfMl84LAorCS5tYXNrID0gMCwKK307CisKIHN0YXRpYyBpbnQgc2ltcGxlX3BsYXliYWNrX3BjbV9vcGVuKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCiAJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpod19jb25zdHJhaW50c19jaGFubmVscyA9IE5VTEw7CisKKwlzd2l0Y2ggKGNvZGVjLT5wcmVzZXQtPmlkKSB7CisJY2FzZSAweDEwZGUwMDAyOgorCWNhc2UgMHgxMGRlMDAwMzoKKwljYXNlIDB4MTBkZTAwMDU6CisJY2FzZSAweDEwZGUwMDA2OgorCQlod19jb25zdHJhaW50c19jaGFubmVscyA9ICZod19jb25zdHJhaW50c18yXzhfY2hhbm5lbHM7CisJCWJyZWFrOworCWNhc2UgMHgxMGRlMDAwNzoKKwkJaHdfY29uc3RyYWludHNfY2hhbm5lbHMgPSAmaHdfY29uc3RyYWludHNfMl82XzhfY2hhbm5lbHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChod19jb25zdHJhaW50c19jaGFubmVscyAhPSBOVUxMKSB7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCisJCQkJaHdfY29uc3RyYWludHNfY2hhbm5lbHMpOworCX0KKwogCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIApAQCAtMTUzMiw3ICsxNjAyLDcgQEAKIHsgLmlkID0gMHgxMDAyNzkzYywgLm5hbWUgPSAiUlM2MDAgSERNSSIsCS5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIHsgLmlkID0gMHgxMDAyNzkxOSwgLm5hbWUgPSAiUlM2MDAgSERNSSIsCS5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKIHsgLmlkID0gMHgxMDAyNzkxYSwgLm5hbWUgPSAiUlM2OTAvNzgwIEhETUkiLAkucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCi17IC5pZCA9IDB4MTAwMmFhMDEsIC5uYW1lID0gIlI2eHggSERNSSIsCS5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKK3sgLmlkID0gMHgxMDAyYWEwMSwgLm5hbWUgPSAiUjZ4eCBIRE1JIiwJLnBhdGNoID0gcGF0Y2hfZ2VuZXJpY19oZG1pIH0sCiB7IC5pZCA9IDB4MTA5NTEzOTAsIC5uYW1lID0gIlNpSTEzOTAgSERNSSIsCS5wYXRjaCA9IHBhdGNoX2dlbmVyaWNfaGRtaSB9LAogeyAuaWQgPSAweDEwOTUxMzkyLCAubmFtZSA9ICJTaUkxMzkyIEhETUkiLAkucGF0Y2ggPSBwYXRjaF9nZW5lcmljX2hkbWkgfSwKIHsgLmlkID0gMHgxN2U4MDA0NywgLm5hbWUgPSAiQ2hyb250ZWwgSERNSSIsCS5wYXRjaCA9IHBhdGNoX2dlbmVyaWNfaGRtaSB9LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA1NTJhMDllLi41MWMwOGVkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMjMxLDcgKzIzMSw2IEBACiAJQUxDODg4X0FDRVJfQVNQSVJFXzg5MzBHLAogCUFMQzg4OF9BQ0VSX0FTUElSRV83NzMwRywKIAlBTEM4ODNfTUVESU9OLAotCUFMQzg4M19NRURJT05fTUQyLAogCUFMQzg4M19NRURJT05fV0lNMjE2MCwKIAlBTEM4ODNfTEFQVE9QX0VBUEQsCiAJQUxDODgzX0xFTk9WT18xMDFFXzJjaCwKQEAgLTE2NzgsMjkgKzE2NzcsMzIgQEAKIAl1MzIgdmFsOwogfTsKIAorc3RydWN0IGFsY19tb2RlbF9maXh1cCB7CisJY29uc3QgaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCiBzdHJ1Y3QgYWxjX2ZpeHVwIHsKIAl1bnNpZ25lZCBpbnQgc2t1OwogCWNvbnN0IHN0cnVjdCBhbGNfcGluY2ZnICpwaW5zOwogCWNvbnN0IHN0cnVjdCBoZGFfdmVyYiAqdmVyYnM7CisJdm9pZCAoKmZ1bmMpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsCisJCSAgICAgaW50IHByZV9pbml0KTsKIH07CiAKLXN0YXRpYyB2b2lkIGFsY19waWNrX2ZpeHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJICAgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnF1aXJrLAotCQkJICAgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LAotCQkJICAgaW50IHByZV9pbml0KQorc3RhdGljIHZvaWQgX19hbGNfcGlja19maXh1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFsY19maXh1cCAqZml4LAorCQkJICAgICBjb25zdCBjaGFyICptb2RlbG5hbWUsCisJCQkgICAgIGludCBwcmVfaW5pdCkKIHsKIAljb25zdCBzdHJ1Y3QgYWxjX3BpbmNmZyAqY2ZnOwogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKIAotCXF1aXJrID0gc25kX3BjaV9xdWlya19sb29rdXAoY29kZWMtPmJ1cy0+cGNpLCBxdWlyayk7Ci0JaWYgKCFxdWlyaykKLQkJcmV0dXJuOwotCWZpeCArPSBxdWlyay0+dmFsdWU7CiAJY2ZnID0gZml4LT5waW5zOwogCWlmIChwcmVfaW5pdCAmJiBmaXgtPnNrdSkgewogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEFwcGx5IHNrdSBvdmVycmlkZSBmb3IgJXNcbiIsCi0JCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgcXVpcmstPm5hbWUpOworCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAjZW5kaWYKIAkJc3BlYyA9IGNvZGVjLT5zcGVjOwogCQlzcGVjLT5jZGVmaW5lLnNrdV9jZmcgPSBmaXgtPnNrdTsKQEAgLTE3MDksNyArMTcxMSw3IEBACiAJaWYgKHByZV9pbml0ICYmIGNmZykgewogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEFwcGx5IHBpbmNmZyBmb3IgJXNcbiIsCi0JCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgcXVpcmstPm5hbWUpOworCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAjZW5kaWYKIAkJZm9yICg7IGNmZy0+bmlkOyBjZmcrKykKIAkJCXNuZF9oZGFfY29kZWNfc2V0X3BpbmNmZyhjb2RlYywgY2ZnLT5uaWQsIGNmZy0+dmFsKTsKQEAgLTE3MTcsMTAgKzE3MTksNTMgQEAKIAlpZiAoIXByZV9pbml0ICYmIGZpeC0+dmVyYnMpIHsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHX1ZFUkJPU0UKIAkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6ICVzOiBBcHBseSBmaXgtdmVyYnMgZm9yICVzXG4iLAotCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIHF1aXJrLT5uYW1lKTsKKwkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOwogI2VuZGlmCiAJCWFkZF92ZXJiKGNvZGVjLT5zcGVjLCBmaXgtPnZlcmJzKTsKIAl9CisJaWYgKGZpeC0+ZnVuYykgeworI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQorCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogJXM6IEFwcGx5IGZpeC1mdW5jIGZvciAlc1xuIiwKKwkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOworI2VuZGlmCisJCWZpeC0+ZnVuYyhjb2RlYywgZml4LCBwcmVfaW5pdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGNfcGlja19maXh1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnF1aXJrLAorCQkJCSBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsCisJCQkJIGludCBwcmVfaW5pdCkKK3sKKwlxdWlyayA9IHNuZF9wY2lfcXVpcmtfbG9va3VwKGNvZGVjLT5idXMtPnBjaSwgcXVpcmspOworCWlmIChxdWlyaykgeworCQlmaXggKz0gcXVpcmstPnZhbHVlOworI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQorCQlfX2FsY19waWNrX2ZpeHVwKGNvZGVjLCBmaXgsIHF1aXJrLT5uYW1lLCBwcmVfaW5pdCk7CisjZWxzZQorCQlfX2FsY19waWNrX2ZpeHVwKGNvZGVjLCBmaXgsIE5VTEwsIHByZV9pbml0KTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgYWxjX3BpY2tfZml4dXBfbW9kZWwoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIGNvbnN0IHN0cnVjdCBhbGNfbW9kZWxfZml4dXAgKm1vZGVscywKKwkJCQkgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgKnF1aXJrLAorCQkJCSBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsCisJCQkJIGludCBwcmVfaW5pdCkKK3sKKwlpZiAoY29kZWMtPm1vZGVsbmFtZSAmJiBtb2RlbHMpIHsKKwkJd2hpbGUgKG1vZGVscy0+bmFtZSkgeworCQkJaWYgKCFzdHJjbXAoY29kZWMtPm1vZGVsbmFtZSwgbW9kZWxzLT5uYW1lKSkgeworCQkJCWZpeCArPSBtb2RlbHMtPmlkOworCQkJCWJyZWFrOworCQkJfQorCQkJbW9kZWxzKys7CisJCX0KKwkJX19hbGNfcGlja19maXh1cChjb2RlYywgZml4LCBjb2RlYy0+bW9kZWxuYW1lLCBwcmVfaW5pdCk7CisJfSBlbHNlIHsKKwkJYWxjX3BpY2tfZml4dXAoY29kZWMsIHF1aXJrLCBmaXgsIHByZV9pbml0KTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYWxjX3JlYWRfY29lZl9pZHgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xOTgxLDYgKzIwMjYsNyBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAogCXsgfQogfTsKIApAQCAtMjEyMCwxNyArMjE2NiwxNyBAQAogCXsKIAkJLm51bV9pdGVtcyA9IDUsCiAJCS5pdGVtcyA9IHsKLQkJCXsgIkV4dCBNaWMiLCAweDAgfSwKKwkJCXsgIk1pYyIsIDB4MCB9LAogCQkJeyAiTGluZSBJbiIsIDB4MiB9LAogCQkJeyAiQ0QiLCAweDQgfSwKIAkJCXsgIklucHV0IE1peCIsIDB4YSB9LAotCQkJeyAiSW50IE1pYyIsIDB4YiB9LAorCQkJeyAiSW50ZXJuYWwgTWljIiwgMHhiIH0sCiAJCX0sCiAJfSwKIAl7CiAJCS5udW1faXRlbXMgPSA0LAogCQkuaXRlbXMgPSB7Ci0JCQl7ICJFeHQgTWljIiwgMHgwIH0sCisJCQl7ICJNaWMiLCAweDAgfSwKIAkJCXsgIkxpbmUgSW4iLCAweDIgfSwKIAkJCXsgIkNEIiwgMHg0IH0sCiAJCQl7ICJJbnB1dCBNaXgiLCAweGEgfSwKQEAgLTIxODcsNyArMjIzMyw3IEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC0yMjA1LDcgKzIyNTEsNyBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwpAQCAtMjc5NiwxMCArMjg0MiwxMCBAQAogCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkV4dCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJFeHQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTMzMDcsNyArMzM1Myw3IEBACiB9OwogCiAvKiBhdXRvLXRvZ2dsZSBmcm9udCBtaWMgKi8KLXN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAl1bnNpZ25lZCBjaGFyIGJpdHM7CkBAIC0zMzI5LDcgKzMzNzUsNyBAQAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaW5pdF9ob29rKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCWFsY19hdXRvbXV0ZV9hbXAoY29kZWMpOwotCWFsYzg4MF91bml3aWxsX21pY19hdXRvbXV0ZShjb2RlYyk7CisJYWxjODh4X3NpbXBsZV9taWNfYXV0b211dGUoY29kZWMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKQEAgLTMzNDAsNyArMzM4Niw3IEBACiAJICovCiAJc3dpdGNoIChyZXMgPj4gMjgpIHsKIAljYXNlIEFMQzg4MF9NSUNfRVZFTlQ6Ci0JCWFsYzg4MF91bml3aWxsX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYWxjX2F1dG9tdXRlX2FtcF91bnNvbF9ldmVudChjb2RlYywgcmVzKTsKQEAgLTUwMjMsNiArNTA2OSwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYWxjX2dldF9saW5lX291dF9wZngoY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnLAorCQkJCQlib29sIGNhbl9iZV9tYXN0ZXIpCit7CisJaWYgKCFjZmctPmhwX291dHMgJiYgIWNmZy0+c3BlYWtlcl9vdXRzICYmIGNhbl9iZV9tYXN0ZXIpCisJCXJldHVybiAiTWFzdGVyIjsKKworCXN3aXRjaCAoY2ZnLT5saW5lX291dF90eXBlKSB7CisJY2FzZSBBVVRPX1BJTl9TUEVBS0VSX09VVDoKKwkJcmV0dXJuICJTcGVha2VyIjsKKwljYXNlIEFVVE9fUElOX0hQX09VVDoKKwkJcmV0dXJuICJIZWFkcGhvbmUiOworCWRlZmF1bHQ6CisJCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxKQorCQkJcmV0dXJuICJQQ00iOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIC8qIGFkZCBwbGF5YmFjayBjb250cm9scyBmcm9tIHRoZSBwYXJzZWQgREFDIHRhYmxlICovCiBzdGF0aWMgaW50IGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCiAJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQpAQCAtNTAzMCw2ICs1MDk1LDcgQEAKIAlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0gewogCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKIAl9OworCWNvbnN0IGNoYXIgKnBmeCA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KGNmZywgZmFsc2UpOwogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGksIGVycjsKIApAQCAtNTAzNyw3ICs1MTAzLDcgQEAKIAkJaWYgKCFzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkKIAkJCWNvbnRpbnVlOwogCQluaWQgPSBhbGM4ODBfaWR4X3RvX21peGVyKGFsYzg4MF9kYWNfdG9faWR4KHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKSk7Ci0JCWlmIChpID09IDIpIHsKKwkJaWYgKCFwZnggJiYgaSA9PSAyKSB7CiAJCQkvKiBDZW50ZXIvTEZFICovCiAJCQllcnIgPSBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAogCQkJCQkgICAgICAiQ2VudGVyIiwKQEAgLTUwNjQsMTggKzUxMzAsMTcgQEAKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7Ci0JCQljb25zdCBjaGFyICpwZng7Ci0JCQlpZiAoY2ZnLT5saW5lX291dHMgPT0gMSAmJgotCQkJICAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkKLQkJCQlwZnggPSAiU3BlYWtlciI7Ci0JCQllbHNlCi0JCQkJcGZ4ID0gY2huYW1lW2ldOwotCQkJZXJyID0gYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgcGZ4LAorCQkJY29uc3QgY2hhciAqbmFtZSA9IHBmeDsKKwkJCWlmICghbmFtZSkKKwkJCQluYW1lID0gY2huYW1lW2ldOworCQkJZXJyID0gX19hZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCQkJbmFtZSwgaSwKIAkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKIAkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJZXJyID0gYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIHBmeCwKKwkJCWVyciA9IF9fYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCisJCQkJCSAgICAgICBuYW1lLCBpLAogCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAyLAogCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOwogCQkJaWYgKGVyciA8IDApCkBAIC01MTU1LDcgKzUyMjAsOCBAQAogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eFswXTsKLQlpbnQgaSwgZXJyLCBpZHgsIHR5cGUsIHR5cGVfaWR4ID0gMDsKKwlpbnQgaSwgZXJyLCBpZHgsIHR5cGVfaWR4ID0gMDsKKwljb25zdCBjaGFyICpwcmV2X2xhYmVsID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewogCQloZGFfbmlkX3QgcGluOwpAQCAtNTE2NSwxMiArNTIzMSwxMyBAQAogCQlpZiAoIWFsY19pc19pbnB1dF9waW4oY29kZWMsIHBpbikpCiAJCQljb250aW51ZTsKIAotCQl0eXBlID0gY2ZnLT5pbnB1dHNbaV0udHlwZTsKLQkJaWYgKGkgPiAwICYmIHR5cGUgPT0gY2ZnLT5pbnB1dHNbaSAtIDFdLnR5cGUpCisJCWxhYmVsID0gaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpOworCQlpZiAocHJldl9sYWJlbCAmJiAhc3RyY21wKGxhYmVsLCBwcmV2X2xhYmVsKSkKIAkJCXR5cGVfaWR4Kys7CiAJCWVsc2UKIAkJCXR5cGVfaWR4ID0gMDsKLQkJbGFiZWwgPSBoZGFfZ2V0X2F1dG9jZmdfaW5wdXRfbGFiZWwoY29kZWMsIGNmZywgaSk7CisJCXByZXZfbGFiZWwgPSBsYWJlbDsKKwogCQlpZiAobWl4ZXIpIHsKIAkJCWlkeCA9IGdldF9jb25uZWN0aW9uX2luZGV4KGNvZGVjLCBtaXhlciwgcGluKTsKIAkJCWlmIChpZHggPj0gMCkgewpAQCAtNzQwNiw3ICs3NDczLDcgQEAKIAkubnVtX2l0ZW1zID0gNCwKIAkuaXRlbXMgPSB7CiAJCXsgIk1pYyIsIDB4MCB9LAotCQl7ICJJbnQgTWljIiwgMHgxIH0sCisJCXsgIkludGVybmFsIE1pYyIsIDB4MSB9LAogCQl7ICJMaW5lIiwgMHgyIH0sCiAJCXsgIkNEIiwgMHg0IH0sCiAJfSwKQEAgLTc0MTYsNyArNzQ4Myw3IEBACiAJLm51bV9pdGVtcyA9IDIsCiAJLml0ZW1zID0gewogCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50IE1pYyIsIDB4MSB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKIAl9LAogfTsKIApAQCAtNzg1MSwxMCArNzkxOCwxMCBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTc4NzgsOCArNzk0NSw4IEBACiAJSERBX0NPREVDX01VVEUgICgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFICAoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgQm9vc3QiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTc4OTYsOCArNzk2Myw4IEBACiAJSERBX0NPREVDX01VVEUgICgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA3LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFICAoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgQm9vc3QiLCAweDE1LCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTksIDB4MDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBCb29zdCBWb2x1bWUiLCAweDE1LCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAweDAwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTc5MTIsNyArNzk3OSw3IEBACiAJSERBX0JJTkRfTVVURSAgICgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA3LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFICAoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEJvb3N0IiwgMHgxNSwgMHgwMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEJvb3N0IFZvbHVtZSIsIDB4MTUsIDB4MDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtNzkzMSw3ICs3OTk4LDcgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTc5NDYsMTAgKzgwMTMsMTAgQEAKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtNzk2OSw3ICs4MDM2LDcgQEAKIAlIREFfQ09ERUNfTVVURSgiTW9iaWxlIExpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMywgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtNzk4Miw3ICs4MDQ5LDcgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTg3NjMsMTAgKzg4MzAsMTAgQEAKIAlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDBlLCAyLCAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC04Nzc3LDExICs4ODQ0LDExIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtODc5MSwxMSArODg1OCwxMSBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTg4MDgsMTAgKzg4NzUsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC04ODMxLDEwICs4ODk4LDEwIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwpAQCAtODg1NSwxMCArODkyMiwxMCBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTg4NzksMTAgKzg5NDYsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDMsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC04OTAyLDEwICs4OTY5LDEwIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwpAQCAtODkyNiw3ICs4OTkzLDcgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTg5MzksMjAgKzkwMDYsMjAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhcmdhXzhjaF9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIlNpZGUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQklORF9NVVRFKCJTaWRlIFBsYXliYWNrIFN3aXRjaCIsIDB4MGYsIDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtODk2Myw3ICs5MDMwLDcgQEAKIAlIREFfQklORF9NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGQsIDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwpAQCAtODk3NiwyMSArOTA0Myw4IEBACiAJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JeyB9IC8qIGVuZCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg4M19tZWRpb25fbWQyX21peGVyW10gPSB7Ci0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtOTAzNyw3ICs5MDkxLDcgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTkwNTAsNyArOTEwNCw3IEBACiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTkwNzIsMTAgKzkxMjYsMTAgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC05MDk2LDggKzkxNTAsOCBAQAogCUhEQV9DT0RFQ19NVVRFKCJFbmFibGUgSGVhZHBob25lcyIsIDB4MTUsIDB4MDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFX01PTk8oIkVuYWJsZSBMRkUiLCAweDE2LCAyLCAweDAwLCBIREFfT1VUUFVUKSwKIAkvKiBCb29zdCBtaXhlcnMgKi8KLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgQm9vc3QiLCAweDFhLCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAweDAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgQm9vc3QgVm9sdW1lIiwgMHgxYSwgMHgwMCwgSERBX0lOUFVUKSwKIAkvKiBJbnB1dCBtaXhlcnMgKi8KIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDAsIEhEQV9JTlBVVCksCkBAIC05MTExLDcgKzkxNjUsNyBAQAogCUhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwpAQCAtOTE0MSw3ICs5MTk1LDcgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKQEAgLTkxODIsMTYgKzkyMzYsNiBAQAogCXNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzFdID0gMHgxNzsKIH0KIAotLyogYXV0by10b2dnbGUgZnJvbnQgbWljICovCi0vKgotc3RhdGljIHZvaWQgYWxjODgzX21pdGFjX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBjaGFyIGJpdHMgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE4KSA/IEhEQV9BTVBfTVVURSA6IDA7Ci0KLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGIsIEhEQV9JTlBVVCwgMSwgSERBX0FNUF9NVVRFLCBiaXRzKTsKLX0KLSovCi0KIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21pdGFjX3ZlcmJzW10gPSB7CiAJLyogSFAgKi8KIAl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LApAQCAtOTQzNSwxOCArOTQ3OSw4IEBACiAJCWFsYzg4OF9sZW5vdm9fbXM3MTk1X3JjYV9hdXRvbXV0ZShjb2RlYyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgzX21lZGlvbl9tZDJfdmVyYnNbXSA9IHsKLQl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0JezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCi0JezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKLQotCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVCB8IEFDX1VTUlNQX0VOfSwKLQl7IH0gLyogZW5kICovCi19OwotCiAvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCi1zdGF0aWMgdm9pZCBhbGM4ODNfbWVkaW9uX21kMl9zZXR1cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGFsYzg4M19sZW5vdm9fbmIwNzYzX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCkBAIC05NDU4LDE1ICs5NDkyLDYgQEAKICNkZWZpbmUgYWxjODgzX3RhcmdhX2luaXRfaG9vawkJYWxjODgyX3RhcmdhX2luaXRfaG9vawogI2RlZmluZSBhbGM4ODNfdGFyZ2FfdW5zb2xfZXZlbnQJYWxjODgyX3RhcmdhX3Vuc29sX2V2ZW50CiAKLXN0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE4KTsKLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGIsIEhEQV9JTlBVVCwgMSwKLQkJCQkgSERBX0FNUF9NVVRFLCBwcmVzZW50ID8gSERBX0FNUF9NVVRFIDogMCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtOTQ3OCw3ICs5NTAzLDcgQEAKIHN0YXRpYyB2b2lkIGFsYzg4M19jbGV2b19tNzIwX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlhbGNfYXV0b211dGVfYW1wKGNvZGVjKTsKLQlhbGM4ODNfY2xldm9fbTcyMF9taWNfYXV0b211dGUoY29kZWMpOworCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX2NsZXZvX203MjBfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC05NDg2LDcgKzk1MTEsNyBAQAogewogCXN3aXRjaCAocmVzID4+IDI2KSB7CiAJY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgotCQlhbGM4ODNfY2xldm9fbTcyMF9taWNfYXV0b211dGUoY29kZWMpOworCQlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWFsY19hdXRvbXV0ZV9hbXBfdW5zb2xfZXZlbnQoY29kZWMsIHJlcyk7CkBAIC05NzMxLDcgKzk3NTYsNiBAQAogCVtBTEM4ODhfQUNFUl9BU1BJUkVfODkzMEddCT0gImFjZXItYXNwaXJlLTg5MzBnIiwKIAlbQUxDODg4X0FDRVJfQVNQSVJFXzc3MzBHXQk9ICJhY2VyLWFzcGlyZS03NzMwZyIsCiAJW0FMQzg4M19NRURJT05dCQk9ICJtZWRpb24iLAotCVtBTEM4ODNfTUVESU9OX01EMl0JPSAibWVkaW9uLW1kMiIsCiAJW0FMQzg4M19NRURJT05fV0lNMjE2MF0JPSAibWVkaW9uLXdpbTIxNjAiLAogCVtBTEM4ODNfTEFQVE9QX0VBUERdCT0gImxhcHRvcC1lYXBkIiwKIAlbQUxDODgzX0xFTk9WT18xMDFFXzJjaF0gPSAibGVub3ZvLTEwMWUiLApAQCAtMTAzNzksMTkgKzEwNDAzLDYgQEAKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4M19zaXhzdGFja19tb2RlcywKIAkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCiAJfSwKLQlbQUxDODgzX01FRElPTl9NRDJdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODNfbWVkaW9uX21kMl9taXhlcn0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicywgYWxjODgzX21lZGlvbl9tZDJfdmVyYnN9LAotCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4M19kYWNfbmlkcyksCi0JCS5kYWNfbmlkcyA9IGFsYzg4M19kYWNfbmlkcywKLQkJLmRpZ19vdXRfbmlkID0gQUxDODgzX0RJR09VVF9OSUQsCi0JCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCi0JCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKLQkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCi0JCS51bnNvbF9ldmVudCA9IGFsY19hdXRvbXV0ZV9hbXBfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4M19tZWRpb25fbWQyX3NldHVwLAotCQkuaW5pdF9ob29rID0gYWxjX2F1dG9tdXRlX2FtcCwKLQl9LAogCVtBTEM4ODNfTUVESU9OX1dJTTIxNjBdID0gewogCQkubWl4ZXJzID0geyBhbGM4ODNfbWVkaW9uX3dpbTIxNjBfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzLCBhbGM4ODNfbWVkaW9uX3dpbTIxNjBfdmVyYnMgfSwKQEAgLTEwNDY4LDcgKzEwNDc5LDcgQEAKIAkJLm5lZWRfZGFjX2ZpeCA9IDEsCiAJCS5pbnB1dF9tdXggPSAmYWxjODgzX2xlbm92b19uYjA3NjNfY2FwdHVyZV9zb3VyY2UsCiAJCS51bnNvbF9ldmVudCA9IGFsY19hdXRvbXV0ZV9hbXBfdW5zb2xfZXZlbnQsCi0JCS5zZXR1cCA9IGFsYzg4M19tZWRpb25fbWQyX3NldHVwLAorCQkuc2V0dXAgPSBhbGM4ODNfbGVub3ZvX25iMDc2M19zZXR1cCwKIAkJLmluaXRfaG9vayA9IGFsY19hdXRvbXV0ZV9hbXAsCiAJfSwKIAlbQUxDODg4X0xFTk9WT19NUzcxOTVfRElHXSA9IHsKQEAgLTEwODMwLDI1ICsxMDg0MSwzMCBAQAogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOwotCWludCBpLCBlcnIsIHR5cGU7CisJaW50IGksIGVycjsKIAlpbnQgdHlwZV9pZHggPSAwOwogCWhkYV9uaWRfdCBuaWQ7CisJY29uc3QgY2hhciAqcHJldl9sYWJlbCA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspIHsKIAkJaWYgKGNmZy0+aW5wdXRzW2ldLnR5cGUgPiBBVVRPX1BJTl9NSUMpCiAJCQlicmVhazsKIAkJbmlkID0gY2ZnLT5pbnB1dHNbaV0ucGluOwogCQlpZiAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9JTl9BTVApIHsKLQkJCWNoYXIgbGFiZWxbMzJdOwotCQkJdHlwZSA9IGNmZy0+aW5wdXRzW2ldLnR5cGU7Ci0JCQlpZiAoaSA+IDAgJiYgdHlwZSA9PSBjZmctPmlucHV0c1tpIC0gMV0udHlwZSkKKwkJCWNvbnN0IGNoYXIgKmxhYmVsOworCQkJY2hhciBib29zdF9sYWJlbFszMl07CisKKwkJCWxhYmVsID0gaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpOworCQkJaWYgKHByZXZfbGFiZWwgJiYgIXN0cmNtcChsYWJlbCwgcHJldl9sYWJlbCkpCiAJCQkJdHlwZV9pZHgrKzsKIAkJCWVsc2UKIAkJCQl0eXBlX2lkeCA9IDA7Ci0JCQlzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKSwgIiVzIEJvb3N0IiwKLQkJCQkgaGRhX2dldF9hdXRvY2ZnX2lucHV0X2xhYmVsKGNvZGVjLCBjZmcsIGkpKTsKLQkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbGFiZWwsCi0JCQkJCSAgdHlwZV9pZHgsCisJCQlwcmV2X2xhYmVsID0gbGFiZWw7CisKKwkJCXNucHJpbnRmKGJvb3N0X2xhYmVsLCBzaXplb2YoYm9vc3RfbGFiZWwpLAorCQkJCSAiJXMgQm9vc3QgVm9sdW1lIiwgbGFiZWwpOworCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgIGJvb3N0X2xhYmVsLCB0eXBlX2lkeCwKIAkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfSU5QVVQpKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CkBAIC0xMDg1Nyw2ICsxMDg3Myw5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyk7CisKIC8qIGFsbW9zdCBpZGVudGljYWwgd2l0aCBBTEM4ODAgcGFyc2VyLi4uICovCiBzdGF0aWMgaW50IGFsYzg4Ml9wYXJzZV9hdXRvX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTEwODc0LDcgKzEwODkzLDEwIEBACiAJZXJyID0gYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwODg3KQorCQllcnIgPSBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJZWxzZQorCQllcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3BlYywgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdLApAQCAtMTEwOTAsMTAgKzExMTEyLDEwIEBACiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MEQsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTW9ubyBQbGF5YmFjayBWb2x1bWUiLCAweDBlLCAyLCAweDAsIEhEQV9PVVRQVVQpLApAQCAtMTExOTQsMTAgKzExMjE2LDEwIEBACiAJCQkgICAgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCkBAIC0xMTIxOSw3ICsxMTI0MSw3IEBACiAJCQkgICAgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKQEAgLTExMjMwLDcgKzExMjUyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X29wdGlvbl9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIlJlYXIgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiUmVhciBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIlJlYXIgTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJSZWFyIE1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTExMjUwLDcgKzExMjcyLDcgQEAKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTExMzU3LDEwICsxMTM3OSwxMCBAQAogCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDBkLCAweDAsIEhEQV9PVVRQVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CkBAIC0xMTM3NCwxMCArMTEzOTYsMTAgQEAKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xMTQ0NSwxMCArMTE0NjcsMTAgQEAKIAlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xMTYzMiw3ICsxMTY1NCw3IEBACiAKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAKIAlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwZCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCkBAIC0xMTY4Nyw3ICsxMTcwOSw3IEBACiAJLm51bV9pdGVtcyA9IDMsCiAJLml0ZW1zID0gewogCQl7ICJNaWMiLCAweDAgfSwKLQkJeyAiSW50IE1pYyIsIDB4MSB9LAorCQl7ICJJbnRlcm5hbCBNaWMiLCAweDEgfSwKIAkJeyAiQ0QiLCAweDQgfSwKIAl9LAogfTsKQEAgLTExODM5LDEyICsxMTg2MSwxMiBAQAogCX0sCiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTE4NzUsMTIgKzExODk3LDEyIEBACiAJfSwKIAlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xMTg4OSwxMCArMTE5MTEsMTAgQEAKIAlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTE5MTgsOCArMTE5NDAsOCBAQAogCUhEQV9CSU5EX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBNaWMgQm9vc3QiLCAweDE1LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxNSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xMjA4OSwxMyArMTIxMTEsOCBAQAogCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKIAlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXSA9IDI7CiAKLQlpZiAoIWNmZy0+c3BlYWtlcl9waW5zWzBdICYmICFjZmctPmhwX3BpbnNbMF0pCi0JCXBmeCA9ICJNYXN0ZXIiOwotCWVsc2UgaWYgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkKLQkJcGZ4ID0gIlNwZWFrZXIiOwotCWVsc2UgaWYgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9IUF9PVVQpCi0JCXBmeCA9ICJIZWFkcGhvbmUiOwotCWVsc2UKKwlwZnggPSBhbGNfZ2V0X2xpbmVfb3V0X3BmeChjZmcsIHRydWUpOworCWlmICghcGZ4KQogCQlwZnggPSAiRnJvbnQiOwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJZXJyID0gYWxjMjYyX2FkZF9vdXRfc3dfY3RsKHNwZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSwgcGZ4LCBpKTsKQEAgLTEyOTk2LDkgKzEzMDEzLDkgQEAKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAogCXsgfQogfTsKIApAQCAtMTMwMDcsOSArMTMwMjQsOSBAQAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MiwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgzLCAweDAsIEhEQV9PVVRQVVQpLAogCUFMQzI2Ml9ISVBQT19NQVNURVJfU1dJVENILAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCiAJeyB9CiB9OwogCkBAIC0xMzExMyw5ICsxMzEzMCw5IEBACiAJCS5wdXQgPSBhbGMyNjhfYWNlcl9tYXN0ZXJfc3dfcHV0LAogCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxNCwgMywgMCwgSERBX09VVFBVVCksCiAJfSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBJbiBCb29zdCBWb2x1bWUiLCAweDFhLCAwLCBIREFfSU5QVVQpLAogCXsgfQogfTsKIApAQCAtMTMxMzEsOCArMTMxNDgsOCBAQAogCQkucHV0ID0gYWxjMjY4X2FjZXJfbWFzdGVyX3N3X3B1dCwKIAkJLnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MTQsIDMsIDAsIEhEQV9PVVRQVVQpLAogCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IiwgMHgxYSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MWEsIDAsIEhEQV9JTlBVVCksCiAJeyB9CiB9OwogCkBAIC0xMzIyNCw4ICsxMzI0MSw4IEBACiAJSERBX0NPREVDX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCXsgfQogfTsKIApAQCAtMTMyNTgsOCArMTMyNzUsOCBAQAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAweDIzLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIDB4MjMsIDIsIEhEQV9PVVRQVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkV4dCBNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCXsgfQogfTsKIApAQCAtMTQwODIsMTAgKzE0MDk5LDEwIEBACiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFX01PTk8oIk1vbm8gUGxheWJhY2sgU3dpdGNoIiwgMHgxNiwgMiwgMHgwLCBIREFfT1VUUFVUKSwKIAl7IH0gLyogZW5kICovCkBAIC0xNDEwNSwxMCArMTQxMjIsMTAgQEAKIAl9LAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0KIH07CiAKQEAgLTE0MTI2LDEzICsxNDE0MywxMyBAQAogCX0sCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkRvY2sgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDMsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRG9jayBNaWMgQm9vc3QiLCAweDFiLCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkRvY2sgTWljIEJvb3N0IFZvbHVtZSIsIDB4MWIsIDAsIEhEQV9JTlBVVCksCiAJeyB9CiB9OwogCkBAIC0xNDE2MiwzMCArMTQxNzksMzAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGMyNjlfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5X2xhcHRvcF9kaWdpdGFsX2NhcHR1cmVfbWl4ZXJbXSA9IHsKIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX2FuYWxvZ19jYXB0dXJlX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50TWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjY5dmJfbGFwdG9wX2RpZ2l0YWxfY2FwdHVyZV9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTE0ODA0LDEyICsxNDgyMSwyMyBAQAogfQogI2VuZGlmIC8qIFNORF9IREFfTkVFRFNfUkVTVU1FICovCiAKK3N0YXRpYyB2b2lkIGFsYzI2OV9maXh1cF9od2VxKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhbGNfZml4dXAgKmZpeCwgaW50IHByZV9pbml0KQoreworCWludCBjb2VmOworCisJY29lZiA9IGFsY19yZWFkX2NvZWZfaWR4KGNvZGVjLCAweDFlKTsKKwlhbGNfd3JpdGVfY29lZl9pZHgoY29kZWMsIDB4MWUsIGNvZWYgfCAweDgwKTsKK30KKwogZW51bSB7CiAJQUxDMjY5X0ZJWFVQX1NPTllfVkFJTywKIAlBTEMyNzVfRklYX1NPTllfVkFJT19HUElPMiwKIAlBTEMyNjlfRklYVVBfREVMTF9NMTAxWiwKIAlBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSwKIAlBTEMyNjlfRklYVVBfQVNVU19HNzNKVywKKwlBTEMyNjlfRklYVVBfTEVOT1ZPX0VBUEQsCisJQUxDMjc1X0ZJWFVQX1NPTllfSFdFUSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTE0ODI0LDYgKzE0ODUyLDcgQEAKIAkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDR9LAogCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDA0fSwKIAkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAorCQkJezB4MTksIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUZHUkR9LAogCQkJeyB9CiAJCX0KIAl9LApAQCAtMTQ4NDQsMTcgKzE0ODczLDM0IEBACiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRF0gPSB7CisJCS52ZXJicyA9IChjb25zdCBzdHJ1Y3QgaGRhX3ZlcmJbXSkgeworCQkJezB4MTQsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAwfSwKKwkJCXt9CisJCX0KKwl9LAorCVtBTEMyNzVfRklYVVBfU09OWV9IV0VRXSA9IHsKKwkJLmZ1bmMgPSBhbGMyNjlfZml4dXBfaHdlcSwKKwkJLnZlcmJzID0gKGNvbnN0IHN0cnVjdCBoZGFfdmVyYltdKSB7CisJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDA0fSwKKwkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwNH0sCisJCQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAwfSwKKwkJCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGR1JEfSwKKwkJCXsgfQorCQl9CisJfQogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzI2OV9maXh1cF90YmxbXSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDczLCAiU29ueSBWQUlPIiwgQUxDMjc1X0ZJWF9TT05ZX1ZBSU9fR1BJTzIpLAotCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwN2IsICJTb255IFZBSU8iLCBBTEMyNzVfRklYX1NPTllfVkFJT19HUElPMiksCi0JU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA4NCwgIlNvbnkgVkFJTyIsIEFMQzI3NV9GSVhfU09OWV9WQUlPX0dQSU8yKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDdiLCAiU29ueSBWQUlPIiwgQUxDMjc1X0ZJWFVQX1NPTllfSFdFUSksCisJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA4NCwgIlNvbnkgVkFJTyIsIEFMQzI3NV9GSVhVUF9TT05ZX0hXRVEpLAogCVNORF9QQ0lfUVVJUktfVkVORE9SKDB4MTA0ZCwgIlNvbnkgVkFJTyIsIEFMQzI2OV9GSVhVUF9TT05ZX1ZBSU8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA0NzAsICJEZWxsIE0xMDF6IiwgQUxDMjY5X0ZJWFVQX0RFTExfTTEwMVopLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIxYjgsICJUaGlua3BhZCBFZGdlIDE0IiwgQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIwZjIsICJUaGlua3BhZCBTTDQxMC81MTAiLCBBTEMyNjlfRklYVVBfU0tVX0lHTk9SRSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MWExMywgIkFzdXMgRzczSnciLCBBTEMyNjlfRklYVVBfQVNVU19HNzNKVyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4OWU1NCwgIkxFTk9WTyBOQiIsIEFMQzI2OV9GSVhVUF9MRU5PVk9fRUFQRCksCiAJe30KIH07CiAKQEAgLTE1ODg5LDEzICsxNTkzNSwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFsYzg2MV9jcmVhdGVfb3V0X3N3KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpwZngsCi0JCQkJaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKK3N0YXRpYyBpbnQgX19hbGM4NjFfY3JlYXRlX291dF9zdyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqcGZ4LAorCQkJCSAgaGRhX25pZF90IG5pZCwgaW50IGlkeCwgdW5zaWduZWQgaW50IGNocykKIHsKLQlyZXR1cm4gYWRkX3BiX3N3X2N0cmwoY29kZWMtPnNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwKKwlyZXR1cm4gX19hZGRfcGJfc3dfY3RybChjb2RlYy0+c3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgcGZ4LCBpZHgsCiAJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfT1VUUFVUKSk7CiB9CiAKKyNkZWZpbmUgYWxjODYxX2NyZWF0ZV9vdXRfc3coY29kZWMsIHBmeCwgbmlkLCBjaHMpIFwKKwlfX2FsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCBwZngsIG5pZCwgMCwgY2hzKQorCiAvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwogc3RhdGljIGludCBhbGM4NjFfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQpAQCAtMTU5MDQsMjYgKzE1OTUzLDE1IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgKmNobmFtZVs0XSA9IHsKIAkJIkZyb250IiwgIlN1cnJvdW5kIiwgTlVMTCAvKkNMRkUqLywgIlNpZGUiCiAJfTsKKwljb25zdCBjaGFyICpwZnggPSBhbGNfZ2V0X2xpbmVfb3V0X3BmeChjZmcsIHRydWUpOwogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGksIGVycjsKIAotCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxKSB7Ci0JCWNvbnN0IGNoYXIgKnBmeCA9IE5VTEw7Ci0JCWlmICghY2ZnLT5ocF9vdXRzKQotCQkJcGZ4ID0gIk1hc3RlciI7Ci0JCWVsc2UgaWYgKGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCkKLQkJCXBmeCA9ICJTcGVha2VyIjsKLQkJaWYgKHBmeCkgewotCQkJbmlkID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF07Ci0JCQlyZXR1cm4gYWxjODYxX2NyZWF0ZV9vdXRfc3coY29kZWMsIHBmeCwgbmlkLCAzKTsKLQkJfQotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CiAJCW5pZCA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldOwogCQlpZiAoIW5pZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoaSA9PSAyKSB7CisJCWlmICghcGZ4ICYmIGkgPT0gMikgewogCQkJLyogQ2VudGVyL0xGRSAqLwogCQkJZXJyID0gYWxjODYxX2NyZWF0ZV9vdXRfc3coY29kZWMsICJDZW50ZXIiLCBuaWQsIDEpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNTkzMiw3ICsxNTk3MCwxMCBAQAogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKLQkJCWVyciA9IGFsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCBjaG5hbWVbaV0sIG5pZCwgMyk7CisJCQljb25zdCBjaGFyICpuYW1lID0gcGZ4OworCQkJaWYgKCFuYW1lKQorCQkJCW5hbWUgPSBjaG5hbWVbaV07CisJCQllcnIgPSBfX2FsYzg2MV9jcmVhdGVfb3V0X3N3KGNvZGVjLCBuYW1lLCBuaWQsIGksIDMpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMTY0MDQsOCArMTY0NDUsOCBAQAogc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg2MXZkX2RhbGxhc19jYXB0dXJlX3NvdXJjZSA9IHsKIAkubnVtX2l0ZW1zID0gMiwKIAkuaXRlbXMgPSB7Ci0JCXsgIkV4dCBNaWMiLCAweDAgfSwKLQkJeyAiSW50IE1pYyIsIDB4MSB9LAorCQl7ICJNaWMiLCAweDAgfSwKKwkJeyAiSW50ZXJuYWwgTWljIiwgMHgxIH0sCiAJfSwKIH07CiAKQEAgLTE2NDg0LDExICsxNjUyNSwxMSBAQAogCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDFiLCAweDAsIEhEQV9PVVRQVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCkBAIC0xNjUwNywxMSArMTY1NDgsMTEgQEAKIAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKIAotCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAotCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIApAQCAtMTY1MzEsMTEgKzE2NTcyLDExIEBACiAKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCiAKLQlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAKLQlIREFfQ09ERUNfVk9MVU1FKCJGcm9udCBNaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAKQEAgLTE2NTQ2LDE5ICsxNjU4NywxOSBAQAogfTsKIAogLyogUGluIGFzc2lnbm1lbnQ6IFNwZWFrZXI9MHgxNCwgSFAgPSAweDE1LAotICogICAgICAgICAgICAgICAgIEV4dCBNaWM9MHgxOCwgSW50IE1pYyA9IDB4MTksIENEID0gMHgxYywgUEMgQmVlcCA9IDB4MWQKKyAqICAgICAgICAgICAgICAgICBNaWM9MHgxOCwgSW50ZXJuYWwgTWljID0gMHgxOSwgQ0QgPSAweDFjLCBQQyBCZWVwID0gMHgxZAogICovCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfZGFsbGFzX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9CSU5EX01VVEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQklORF9NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJFeHQgTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJFeHQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiRXh0IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkludCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCBWb2x1bWUiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xNjcyMywxOCArMTY3NjQsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9fbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXVuc2lnbmVkIGludCBwcmVzZW50OwotCXVuc2lnbmVkIGNoYXIgYml0czsKLQotCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDE4KTsKLQliaXRzID0gcHJlc2VudCA/IEhEQV9BTVBfTVVURSA6IDA7Ci0KLQlzbmRfaGRhX2NvZGVjX2FtcF9zdGVyZW8oY29kZWMsIDB4MGIsIEhEQV9JTlBVVCwgMSwKLQkJCQkgSERBX0FNUF9NVVRFLCBiaXRzKTsKLX0KLQogc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX3NldHVwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwpAQCAtMTY3NDUsNyArMTY3NzQsNyBAQAogc3RhdGljIHZvaWQgYWxjODYxdmRfbGVub3ZvX2luaXRfaG9vayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlhbGNfYXV0b211dGVfYW1wKGNvZGVjKTsKLQlhbGM4NjF2ZF9sZW5vdm9fbWljX2F1dG9tdXRlKGNvZGVjKTsKKwlhbGM4OHhfc2ltcGxlX21pY19hdXRvbXV0ZShjb2RlYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg2MXZkX2xlbm92b191bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKQEAgLTE2NzUzLDcgKzE2NzgyLDcgQEAKIHsKIAlzd2l0Y2ggKHJlcyA+PiAyNikgewogCWNhc2UgQUxDODgwX01JQ19FVkVOVDoKLQkJYWxjODYxdmRfbGVub3ZvX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWFsYzg4eF9zaW1wbGVfbWljX2F1dG9tdXRlKGNvZGVjKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYWxjX2F1dG9tdXRlX2FtcF91bnNvbF9ldmVudChjb2RlYywgcmVzKTsKQEAgLTE3MDQzLDEyICsxNzA3MiwxMyBAQAogI2RlZmluZSBhbGM4NjF2ZF9pZHhfdG9fbWl4ZXJfc3dpdGNoKG5pZCkJKChuaWQpICsgMHgwYykKIAogLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KLS8qIEJhc2VkIG9uIEFMQzg4MCB2ZXJzaW9uLiBCdXQgQUxDODYxVkQgaGFzIHNlcGFyYXRlLAorLyogQmFzZWQgb24gQUxDODgwIHZlcnNpb24uIEJ1dCBBTEM4NjFWRCBhbmQgQUxDODg3IGhhdmUgc2VwYXJhdGUsCiAgKiBkaWZmZXJlbnQgTklEcyBmb3IgbXV0ZS91bm11dGUgc3dpdGNoIGFuZCB2b2x1bWUgY29udHJvbCAqLwogc3RhdGljIGludCBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCiAJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7IkZyb250IiwgIlN1cnJvdW5kIiwgIkNMRkUiLCAiU2lkZSJ9OworCWNvbnN0IGNoYXIgKnBmeCA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KGNmZywgdHJ1ZSk7CiAJaGRhX25pZF90IG5pZF92LCBuaWRfczsKIAlpbnQgaSwgZXJyOwogCkBAIC0xNzA2Miw3ICsxNzA5Miw3IEBACiAJCQkJYWxjODgwX2RhY190b19pZHgoCiAJCQkJCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKSk7CiAKLQkJaWYgKGkgPT0gMikgeworCQlpZiAoIXBmeCAmJiBpID09IDIpIHsKIAkJCS8qIENlbnRlci9MRkUgKi8KIAkJCWVyciA9IGFkZF9wYl92b2xfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCiAJCQkJCSAgICAgICJDZW50ZXIiLApAQCAtMTcwODksMjQgKzE3MTE5LDE3IEBACiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgewotCQkJY29uc3QgY2hhciAqcGZ4OwotCQkJaWYgKGNmZy0+bGluZV9vdXRzID09IDEgJiYKLQkJCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpIHsKLQkJCQlpZiAoIWNmZy0+aHBfcGlucykKLQkJCQkJcGZ4ID0gIlNwZWFrZXIiOwotCQkJCWVsc2UKLQkJCQkJcGZ4ID0gIlBDTSI7Ci0JCQl9IGVsc2UKLQkJCQlwZnggPSBjaG5hbWVbaV07Ci0JCQllcnIgPSBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBwZngsCisJCQljb25zdCBjaGFyICpuYW1lID0gcGZ4OworCQkJaWYgKCFuYW1lKQorCQkJCW5hbWUgPSBjaG5hbWVbaV07CisJCQllcnIgPSBfX2FkZF9wYl92b2xfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCisJCQkJCQluYW1lLCBpLAogCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDMsIDAsCiAJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxICYmCi0JCQkgICAgY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUKQotCQkJCXBmeCA9ICJTcGVha2VyIjsKLQkJCWVyciA9IGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBwZngsCisJCQllcnIgPSBfX2FkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICAgICAgbmFtZSwgaSwKIAkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAzLCAyLAogCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOwogCQkJaWYgKGVyciA8IDApCkBAIC0xNzU3MCwxMyArMTc1OTMsMTMgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKIAlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKIAotCUhEQV9DT0RFQ19WT0xVTUUoImUtTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJlLU1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoImUtTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiaS1NaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoImktTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiaS1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTc3MjAsOCArMTc3NDMsOCBAQAogCiAJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJpLU1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoImktTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJJbnRlcm5hbCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAogCXsgfSAvKiBlbmQgKi8KIH07CiAKQEAgLTE3NzMyLDggKzE3NzU1LDggQEAKIAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiaS1NaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJpLU1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCkBAIC0xODU2NiwxMyArMTg1ODksMTMgQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKIAlBTEMyNjJfSElQUE9fTUFTVEVSX1NXSVRDSCwKIAotCUhEQV9DT0RFQ19WT0xVTUUoImUtTWljL0xpbmVJbiBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiZS1NaWMvTGluZUluIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiZS1NaWMvTGluZUluIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMvTGluZUluIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljL0xpbmVJbiBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYy9MaW5lSW4gUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiaS1NaWMgQm9vc3QiLCAweDE5LCAwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoImktTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiaS1NaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBCb29zdCBWb2x1bWUiLCAweDE5LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludGVybmFsIE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkludGVybmFsIE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwogfTsKIApAQCAtMTg1ODMsMTMgKzE4NjA2LDEzIEBACiAJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX01VVEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCAweDIxLCAweDAsIEhEQV9PVVRQVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiRXh0IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkV4dCBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkV4dCBNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IFZvbHVtZSIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCiAKLQlIREFfQ09ERUNfVk9MVU1FKCJJbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50ZXJuYWwgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC0xOTA5NCwyMCArMTkxMTcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYWxjNjYyX2FkZF92b2xfY3RsKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgY29uc3QgY2hhciAqcGZ4LAotCQkJICAgICAgaGRhX25pZF90IG5pZCwgdW5zaWduZWQgaW50IGNocykKK3N0YXRpYyBpbmxpbmUgaW50IF9fYWxjNjYyX2FkZF92b2xfY3RsKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgY29uc3QgY2hhciAqcGZ4LAorCQkJCSAgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgY2hzKQogewotCXJldHVybiBhZGRfcGJfdm9sX2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBwZngsCisJcmV0dXJuIF9fYWRkX3BiX3ZvbF9jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgcGZ4LCBpZHgsCiAJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfT1VUUFVUKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFsYzY2Ml9hZGRfc3dfY3RsKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgY29uc3QgY2hhciAqcGZ4LAotCQkJICAgICBoZGFfbmlkX3QgbmlkLCB1bnNpZ25lZCBpbnQgY2hzKQorc3RhdGljIGlubGluZSBpbnQgX19hbGM2NjJfYWRkX3N3X2N0bChzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsIGNvbnN0IGNoYXIgKnBmeCwKKwkJCQkgICAgICBoZGFfbmlkX3QgbmlkLCBpbnQgaWR4LCB1bnNpZ25lZCBpbnQgY2hzKQogewotCXJldHVybiBhZGRfcGJfc3dfY3RybChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBwZngsCisJcmV0dXJuIF9fYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgcGZ4LCBpZHgsCiAJCQkgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgY2hzLCAwLCBIREFfSU5QVVQpKTsKIH0KIAorI2RlZmluZSBhbGM2NjJfYWRkX3ZvbF9jdGwoc3BlYywgcGZ4LCBuaWQsIGNocykgXAorCV9fYWxjNjYyX2FkZF92b2xfY3RsKHNwZWMsIHBmeCwgbmlkLCAwLCBjaHMpCisjZGVmaW5lIGFsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbmlkLCBjaHMpIFwKKwlfX2FsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbmlkLCAwLCBjaHMpCiAjZGVmaW5lIGFsYzY2Ml9hZGRfc3RlcmVvX3ZvbChzcGVjLCBwZngsIG5pZCkgXAogCWFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBwZngsIG5pZCwgMykKICNkZWZpbmUgYWxjNjYyX2FkZF9zdGVyZW9fc3coc3BlYywgcGZ4LCBuaWQpIFwKQEAgLTE5MTIxLDYgKzE5MTQ4LDcgQEAKIAlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0gewogCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKIAl9OworCWNvbnN0IGNoYXIgKnBmeCA9IGFsY19nZXRfbGluZV9vdXRfcGZ4KGNmZywgdHJ1ZSk7CiAJaGRhX25pZF90IG5pZCwgbWl4OwogCWludCBpLCBlcnI7CiAKQEAgLTE5MTMxLDcgKzE5MTU5LDcgQEAKIAkJbWl4ID0gYWxjNjYyX2RhY190b19taXgoY29kZWMsIGNmZy0+bGluZV9vdXRfcGluc1tpXSwgbmlkKTsKIAkJaWYgKCFtaXgpCiAJCQljb250aW51ZTsKLQkJaWYgKGkgPT0gMikgeworCQlpZiAoIXBmeCAmJiBpID09IDIpIHsKIAkJCS8qIENlbnRlci9MRkUgKi8KIAkJCWVyciA9IGFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCAiQ2VudGVyIiwgbmlkLCAxKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtMTkxNDYsMjIgKzE5MTc0LDEzIEBACiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9IGVsc2UgewotCQkJY29uc3QgY2hhciAqcGZ4OwotCQkJaWYgKGNmZy0+bGluZV9vdXRzID09IDEgJiYKLQkJCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpIHsKLQkJCQlpZiAoY2ZnLT5ocF9vdXRzKQotCQkJCQlwZnggPSAiU3BlYWtlciI7Ci0JCQkJZWxzZQotCQkJCQlwZnggPSAiUENNIjsKLQkJCX0gZWxzZQotCQkJCXBmeCA9IGNobmFtZVtpXTsKLQkJCWVyciA9IGFsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBwZngsIG5pZCwgMyk7CisJCQljb25zdCBjaGFyICpuYW1lID0gcGZ4OworCQkJaWYgKCFuYW1lKQorCQkJCW5hbWUgPSBjaG5hbWVbaV07CisJCQllcnIgPSBfX2FsYzY2Ml9hZGRfdm9sX2N0bChzcGVjLCBuYW1lLCBuaWQsIGksIDMpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxICYmCi0JCQkgICAgY2ZnLT5saW5lX291dF90eXBlID09IEFVVE9fUElOX1NQRUFLRVJfT1VUKQotCQkJCXBmeCA9ICJTcGVha2VyIjsKLQkJCWVyciA9IGFsYzY2Ml9hZGRfc3dfY3RsKHNwZWMsIHBmeCwgbWl4LCAzKTsKKwkJCWVyciA9IF9fYWxjNjYyX2FkZF9zd19jdGwoc3BlYywgbmFtZSwgbWl4LCBpLCAzKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTE5MzU4LDkgKzE5Mzc3LDIxIEBACiAJCWFsY19pbml0aG9vayhjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzI3Ml9maXh1cF9tYXJpbyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWxjX2ZpeHVwICpmaXgsIGludCBwcmVfaW5pdCkgeworCWlmIChzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKGNvZGVjLCAweDIsIEhEQV9PVVRQVVQsCisJCQkJICAgICAgKDB4M2IgPDwgQUNfQU1QQ0FQX09GRlNFVF9TSElGVCkgfAorCQkJCSAgICAgICgweDNiIDw8IEFDX0FNUENBUF9OVU1fU1RFUFNfU0hJRlQpIHwKKwkJCQkgICAgICAoMHgwMyA8PCBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUKSB8CisJCQkJICAgICAgKDAgPDwgQUNfQU1QQ0FQX01VVEVfU0hJRlQpKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImhkYV9jb2RlYzogZmFpbGVkIHRvIG92ZXJyaWRlIGFtcCBjYXBzIGZvciBOSUQgMHgyXG4iKTsKK30KKwogZW51bSB7CiAJQUxDNjYyX0ZJWFVQX0FTUElSRSwKIAlBTEM2NjJfRklYVVBfSURFQVBBRCwKKwlBTEMyNzJfRklYVVBfTUFSSU8sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19maXh1cCBhbGM2NjJfZml4dXBzW10gPSB7CkBAIC0xOTM3Niw2ICsxOTQwNyw5IEBACiAJCQl7IH0KIAkJfQogCX0sCisJW0FMQzI3Ml9GSVhVUF9NQVJJT10gPSB7CisJCS5mdW5jID0gYWxjMjcyX2ZpeHVwX21hcmlvLAorCX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGM2NjJfZml4dXBfdGJsW10gPSB7CkBAIC0xOTM4Niw2ICsxOTQyMCwxMCBAQAogCXt9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsY19tb2RlbF9maXh1cCBhbGM2NjJfZml4dXBfbW9kZWxzW10gPSB7CisJey5pZCA9IEFMQzI3Ml9GSVhVUF9NQVJJTywgLm5hbWUgPSAibWFyaW8ifSwKKwl7fQorfTsKIAogCiBzdGF0aWMgaW50IHBhdGNoX2FsYzY2MihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTE5NDg1LDcgKzE5NTIzLDggQEAKIAljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKIAlpZiAoYm9hcmRfY29uZmlnID09IEFMQzY2Ml9BVVRPKSB7CiAJCXNwZWMtPmluaXRfaG9vayA9IGFsYzY2Ml9hdXRvX2luaXQ7Ci0JCWFsY19waWNrX2ZpeHVwKGNvZGVjLCBhbGM2NjJfZml4dXBfdGJsLCBhbGM2NjJfZml4dXBzLCAwKTsKKwkJYWxjX3BpY2tfZml4dXBfbW9kZWwoY29kZWMsIGFsYzY2Ml9maXh1cF9tb2RlbHMsCisJCQkJICAgICBhbGM2NjJfZml4dXBfdGJsLCBhbGM2NjJfZml4dXBzLCAwKTsKIAl9CiAKIAlhbGNfaW5pdF9qYWNrcyhjb2RlYyk7CkBAIC0xOTYxMiw5ICsxOTY1MSw5IEBACiAJSERBX0NPREVDX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MTQsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0NPREVDX1ZPTFVNRSgiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIDB4NCwgMHgwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTYsIDB4MCwgSERBX09VVFBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBCb29zdCIsIDB4MTIsIDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IiwgMHgxOSwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJJbnRlcm5hbCBNaWMgQm9vc3QgVm9sdW1lIiwgMHgxMiwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QgVm9sdW1lIiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIEluIEJvb3N0IFZvbHVtZSIsIDB4MTksIDAsIEhEQV9JTlBVVCksCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggZjAzYjJmZi4uNGFiMDE5ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtMzg5LDYgKzM4OSw5IEBACiAJMHgxMSwgMHgyMCwgMAogfTsKIAorI2RlZmluZSBTVEFDOTJIRDg4WFhYX05VTV9ETUlDUwlTVEFDOTJIRDgzWFhYX05VTV9ETUlDUworI2RlZmluZSBzdGFjOTJoZDg4eHh4X2RtaWNfbmlkcwlzdGFjOTJoZDgzeHh4X2RtaWNfbmlkcworCiAjZGVmaW5lIFNUQUM5MkhEODdCX05VTV9ETUlDUwkgMQogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDg3Yl9kbWljX25pZHNbU1RBQzkySEQ4N0JfTlVNX0RNSUNTICsgMV0gPSB7CiAJMHgxMSwgMApAQCAtMzU5MSw3ICszNTk0LDcgQEAKIAkJaWYgKGNoZWNrX21pY19waW4oY29kZWMsIHNwZWMtPmRtaWNfbmlkc1tpXSwKIAkJICAgICZmaXhlZCwgJmV4dCwgJmRvY2spKQogCQkJcmV0dXJuIDA7Ci0JaWYgKCFmaXhlZCAmJiAhZXh0ICYmICFkb2NrKQorCWlmICghZml4ZWQgfHwgKCFleHQgJiYgIWRvY2spKQogCQlyZXR1cm4gMDsgLyogbm8gaW5wdXQgdG8gc3dpdGNoICovCiAJaWYgKCEoZ2V0X3djYXBzKGNvZGVjLCBleHQpICYgQUNfV0NBUF9VTlNPTF9DQVApKQogCQlyZXR1cm4gMDsgLyogbm8gdW5zb2wgc3VwcG9ydCAqLwpAQCAtNTQyMiw3ICs1NDI1LDcgQEAKIAlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLCAweDdFRCwgMCk7CiAJY29kZWMtPm5vX3RyaWdnZXJfc2Vuc2UgPSAxOwogCWNvZGVjLT5zcGVjID0gc3BlYzsKLQlzcGVjLT5saW5lYXJfdG9uZV9iZWVwID0gMTsKKwlzcGVjLT5saW5lYXJfdG9uZV9iZWVwID0gMDsKIAljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBzdGFjOTJoZDgzeHh4X3NsYXZlX2RpZ19vdXRzOwogCXNwZWMtPmRpZ2JlZXBfbmlkID0gMHgyMTsKIAlzcGVjLT5kbWljX25pZHMgPSBzdGFjOTJoZDgzeHh4X2RtaWNfbmlkczsKQEAgLTU0NjIsMTUgKzU0NjUsMjEgQEAKIAkJc3BlYy0+bnVtX2RtaWNzID0gc3RhYzkyeHhfY29ubmVjdGVkX3BvcnRzKGNvZGVjLAogCQkJCXN0YWM5MmhkODdiX2RtaWNfbmlkcywKIAkJCQlTVEFDOTJIRDg3Ql9OVU1fRE1JQ1MpOwotCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJc3BlYy0+bnVtX3BpbnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkODh4eHhfcGluX25pZHMpOworCQlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MmhkODh4eHhfcGluX25pZHM7CisJCXNwZWMtPm1vbm9fbmlkID0gMDsKKwkJc3BlYy0+bnVtX3B3cnMgPSAwOworCQlicmVhazsKIAljYXNlIDB4MTExZDc2NjY6CiAJY2FzZSAweDExMWQ3NjY3OgogCWNhc2UgMHgxMTFkNzY2ODoKIAljYXNlIDB4MTExZDc2Njk6CisJCXNwZWMtPm51bV9kbWljcyA9IHN0YWM5Mnh4X2Nvbm5lY3RlZF9wb3J0cyhjb2RlYywKKwkJCQlzdGFjOTJoZDg4eHh4X2RtaWNfbmlkcywKKwkJCQlTVEFDOTJIRDg4WFhYX05VTV9ETUlDUyk7CiAJCXNwZWMtPm51bV9waW5zID0gQVJSQVlfU0laRShzdGFjOTJoZDg4eHh4X3Bpbl9uaWRzKTsKIAkJc3BlYy0+cGluX25pZHMgPSBzdGFjOTJoZDg4eHh4X3Bpbl9uaWRzOwogCQlzcGVjLT5tb25vX25pZCA9IDA7Ci0JCXNwZWMtPmRpZ2JlZXBfbmlkID0gMDsKIAkJc3BlYy0+bnVtX3B3cnMgPSAwOwogCQlicmVhazsKIAljYXNlIDB4MTExZDc2MDQ6CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCBkMWMzZjhkLi43ZjQ4NTJhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTI2Myw4ICsyNjMsNyBAQAogCQlyZXR1cm47CiAJc25kX2hkYV9jb2RlY193cml0ZShzcGVjLT5jb2RlYywgMHgxLCAwLCAweGY4MSwKIAkJCSAgICAhc3BlYy0+dnQxNzA4X2phY2tfZGV0ZWN0ZWN0KTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZzcGVjLT52dDE3MDhfaHBfd29yayk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnNwZWMtPnZ0MTcwOF9ocF93b3JrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYwppbmRleCA3MTJjMTcxLi43YjYyZGUwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKQEAgLTk2LDYgKzk2LDExIEBACiAJCXRtcCB8PSBJQ0UxNzEyX0RFTFRBX0FQX0NDTEsgfCBJQ0UxNzEyX0RFTFRBX0FQX0NTX0NPREVDOwogCQl0bXAgJj0gfklDRTE3MTJfREVMVEFfQVBfQ1NfRElHSVRBTDsKIAkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTY2RToKKwkJdG1wIHw9IElDRTE3MTJfREVMVEFfNjZFX0NDTEsgfCBJQ0UxNzEyX0RFTFRBXzY2RV9DU19DSElQX0EgfAorCQkgICAgICAgSUNFMTcxMl9ERUxUQV82NkVfQ1NfQ0hJUF9COworCQl0bXAgJj0gfklDRTE3MTJfREVMVEFfNjZFX0NTX0NTODQyNzsKKwkJYnJlYWs7CiAJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKIAkJdG1wIHw9IElDRTE3MTJfVlg0NDJfQ0NMSyB8IElDRTE3MTJfVlg0NDJfQ09ERUNfQ0hJUF9BIHwgSUNFMTcxMl9WWDQ0Ml9DT0RFQ19DSElQX0I7CiAJCXRtcCAmPSB+SUNFMTcxMl9WWDQ0Ml9DU19ESUdJVEFMOwpAQCAtMTE5LDYgKzEyNCw5IEBACiAJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTQxMDoKIAkJdG1wIHw9IElDRTE3MTJfREVMVEFfQVBfQ1NfRElHSVRBTDsKIAkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTY2RToKKwkJdG1wIHw9IElDRTE3MTJfREVMVEFfNjZFX0NTX0NTODQyNzsKKwkJYnJlYWs7CiAJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKIAkJdG1wIHw9IElDRTE3MTJfVlg0NDJfQ1NfRElHSVRBTDsKIAkJYnJlYWs7CkBAIC0yNzYsNiArMjg0LDIwIEBACiB9CiAKIC8qCisgKiBBSzQ1MjQgb24gRGVsdGE2NiByZXYgRSB0byBjaG9vc2UgdGhlIGNoaXAgYWRkcmVzcworICovCitzdGF0aWMgdm9pZCBkZWx0YTY2ZV9hazQ1MjRfbG9jayhzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrLCBpbnQgY2hpcCkKK3sKKwlzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlICpwcml2ID0gKHZvaWQgKilhay0+cHJpdmF0ZV92YWx1ZVswXTsKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IGFrLT5wcml2YXRlX2RhdGFbMF07CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJcHJpdi0+Y3NfbWFzayA9CisJcHJpdi0+Y3NfYWRkciA9IGNoaXAgPT0gMCA/IElDRTE3MTJfREVMVEFfNjZFX0NTX0NISVBfQSA6CisJCQkJICAgIElDRTE3MTJfREVMVEFfNjZFX0NTX0NISVBfQjsKK30KKworLyoKICAqIEFLNDUyOCBvbiBWWDQ0MiB0byBjaG9vc2UgdGhlIGNoaXAgbWFzawogICovCiBzdGF0aWMgdm9pZCB2eDQ0Ml9hazQ1MjRfbG9jayhzdHJ1Y3Qgc25kX2FrbTR4eHggKmFrLCBpbnQgY2hpcCkKQEAgLTQ4Nyw2ICs1MDksMjkgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTY2ZSBfX2RldmluaXRkYXRhID0geworCS50eXBlID0gU05EX0FLNDUyNCwKKwkubnVtX2FkY3MgPSA0LAorCS5udW1fZGFjcyA9IDQsCisJLm9wcyA9IHsKKwkJLmxvY2sgPSBkZWx0YTY2ZV9hazQ1MjRfbG9jaywKKwkJLnNldF9yYXRlX3ZhbCA9IGRlbHRhX2FrNDUyNF9zZXRfcmF0ZV92YWwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGE2NmVfcHJpdiBfX2RldmluaXRkYXRhID0geworCS5jYWRkciA9IDIsCisJLmNpZiA9IDAsIC8qIHRoZSBkZWZhdWx0IGxldmVsIG9mIHRoZSBDSUYgcGluIGZyb20gQUs0NTI0ICovCisJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfNjZFX0RPVVQsCisJLmNsa19tYXNrID0gSUNFMTcxMl9ERUxUQV82NkVfQ0NMSywKKwkuY3NfbWFzayA9IDAsCisJLmNzX2FkZHIgPSAwLCAvKiBzZXQgbGF0ZXIgKi8KKwkuY3Nfbm9uZSA9IDAsCisJLmFkZF9mbGFncyA9IDAsCisJLm1hc2tfZmxhZ3MgPSAwLAorfTsKKworCiBzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTQ0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0NTI0LAogCS5udW1fYWRjcyA9IDQsCkBAIC02NDQsOSArNjg5LDExIEBACiAJCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfaW5pdChhaywgJmFrbV9kZWx0YTQ0LCAmYWttX2RlbHRhNDRfcHJpdiwgaWNlKTsKIAkJYnJlYWs7CiAJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9WWDQ0MjoKLQljYXNlIElDRTE3MTJfU1VCREVWSUNFX0RFTFRBNjZFOgogCQllcnIgPSBzbmRfaWNlMTcxMl9ha200eHh4X2luaXQoYWssICZha21fdng0NDIsICZha21fdng0NDJfcHJpdiwgaWNlKTsKIAkJYnJlYWs7CisJY2FzZSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTY2RToKKwkJZXJyID0gc25kX2ljZTE3MTJfYWttNHh4eF9pbml0KGFrLCAmYWttX2RlbHRhNjZlLCAmYWttX2RlbHRhNjZlX3ByaXYsIGljZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXNuZF9CVUcoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaAppbmRleCAxYTBhYzZjLi4xMWE5YzNhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmgKQEAgLTE0NCw2ICsxNDQsMTcgQEAKICNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfQ1NfTk9ORQkweDUwCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgSUNFMTcxMl9ERUxUQV8xMDEwTFRfV09SRENMT0NLIDB4ODAJLyogc2FtcGxlIGNsb2NrIHNvdXJjZTogMCA9IFdvcmQgQ2xvY2sgSW5wdXQsIDEgPSBTL1BESUYgSW5wdXQgPz8/ICovCiAKKy8qIE0tQXVkaW8gRGVsdGEgNjYgcmV2LiBFIGRlZmluaXRpb25zLgorICogTmV3ZXIgcmV2aXNpb25zIG9mIERlbHRhIDY2IGhhdmUgQ1M4NDI3IG92ZXIgU1BJIGZvcgorICogUy9QRElGIHRyYW5zY2VpdmVyIGluc3RlYWQgb2YgQ1M4NDA0L0NTODQxNC4gKi8KKy8qIDB4MDEgPSBERlMgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV82NkVfQ0NMSwkJMHgwMgkvKiBTUEkgY2xvY2sgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV82NkVfRElOCQkweDA0CS8qIGRhdGEgaW5wdXQgKi8KKyNkZWZpbmUgSUNFMTcxMl9ERUxUQV82NkVfRE9VVAkJMHgwOAkvKiBkYXRhIG91dHB1dCAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBXzY2RV9DU19DUzg0MjcJMHgxMAkvKiBjaGlwIHNlbGVjdCwgbG93ID0gQ1M4NDI3ICovCisjZGVmaW5lIElDRTE3MTJfREVMVEFfNjZFX0NTX0NISVBfQQkweDIwCS8qIEFLNDUyNCAjMCAqLworI2RlZmluZSBJQ0UxNzEyX0RFTFRBXzY2RV9DU19DSElQX0IJMHg0MAkvKiBBSzQ1MjQgIzEgKi8KKwogLyogRGlnaWdyYW0gVlg0NDIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgSUNFMTcxMl9WWDQ0Ml9DQ0xLCQkweDAyCS8qIFNQSSBjbG9jayAqLwogI2RlZmluZSBJQ0UxNzEyX1ZYNDQyX0RJTgkJMHgwNAkvKiBkYXRhIGlucHV0ICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL01ha2VmaWxlIGIvc291bmQvcGNpL294eWdlbi9NYWtlZmlsZQppbmRleCBhY2Q4ZjE1Li4wZjg3MjY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vTWFrZWZpbGUKQEAgLTEsMTAgKzEsOCBAQAogc25kLW94eWdlbi1saWItb2JqcyA6PSBveHlnZW5faW8ubyBveHlnZW5fbGliLm8gb3h5Z2VuX21peGVyLm8gb3h5Z2VuX3BjbS5vCi1zbmQtaGlmaWVyLW9ianMgOj0gaGlmaWVyLm8KLXNuZC1veHlnZW4tb2JqcyA6PSBveHlnZW4ubworc25kLW94eWdlbi1vYmpzIDo9IG94eWdlbi5vIHhvbmFyX2RnLm8KIHNuZC12aXJ0dW9zby1vYmpzIDo9IHZpcnR1b3NvLm8geG9uYXJfbGliLm8gXAogCXhvbmFyX3BjbTE3OXgubyB4b25hcl9jczQzeHgubyB4b25hcl93bTg3eDYubyB4b25hcl9oZG1pLm8KIAogb2JqLSQoQ09ORklHX1NORF9PWFlHRU5fTElCKSArPSBzbmQtb3h5Z2VuLWxpYi5vCi1vYmotJChDT05GSUdfU05EX0hJRklFUikgKz0gc25kLWhpZmllci5vCiBvYmotJChDT05GSUdfU05EX09YWUdFTikgKz0gc25kLW94eWdlbi5vCiBvYmotJChDT05GSUdfU05EX1ZJUlRVT1NPKSArPSBzbmQtdmlydHVvc28ubwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9jczQyNDUuaCBiL3NvdW5kL3BjaS9veHlnZW4vY3M0MjQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwMTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vY3M0MjQ1LmgKQEAgLTAsMCArMSwxMDcgQEAKKyNkZWZpbmUgQ1M0MjQ1X0NISVBfSUQJCTB4MDEKKyNkZWZpbmUgQ1M0MjQ1X1BPV0VSX0NUUkwJMHgwMgorI2RlZmluZSBDUzQyNDVfREFDX0NUUkxfMQkweDAzCisjZGVmaW5lIENTNDI0NV9BRENfQ1RSTAkJMHgwNAorI2RlZmluZSBDUzQyNDVfTUNMS19GUkVRCTB4MDUKKyNkZWZpbmUgQ1M0MjQ1X1NJR05BTF9TRUwJMHgwNgorI2RlZmluZSBDUzQyNDVfUEdBX0JfQ1RSTAkweDA3CisjZGVmaW5lIENTNDI0NV9QR0FfQV9DVFJMCTB4MDgKKyNkZWZpbmUgQ1M0MjQ1X0FOQUxPR19JTgkweDA5CisjZGVmaW5lIENTNDI0NV9EQUNfQV9DVFJMCTB4MGEKKyNkZWZpbmUgQ1M0MjQ1X0RBQ19CX0NUUkwJMHgwYgorI2RlZmluZSBDUzQyNDVfREFDX0NUUkxfMgkweDBjCisjZGVmaW5lIENTNDI0NV9JTlRfU1RBVFVTCTB4MGQKKyNkZWZpbmUgQ1M0MjQ1X0lOVF9NQVNLCQkweDBlCisjZGVmaW5lIENTNDI0NV9JTlRfTU9ERV9NU0IJMHgwZgorI2RlZmluZSBDUzQyNDVfSU5UX01PREVfTFNCCTB4MTAKKworLyogQ2hpcCBJRCAqLworI2RlZmluZSBDUzQyNDVfQ0hJUF9QQVJUX01BU0sJMHhmMAorI2RlZmluZSBDUzQyNDVfQ0hJUF9SRVZfTUFTSwkweDBmCisKKy8qIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MjQ1X0ZSRUVaRQkJMHg4MAorI2RlZmluZSBDUzQyNDVfUEROX01JQwkJMHgwOAorI2RlZmluZSBDUzQyNDVfUEROX0FEQwkJMHgwNAorI2RlZmluZSBDUzQyNDVfUEROX0RBQwkJMHgwMgorI2RlZmluZSBDUzQyNDVfUEROCQkweDAxCisKKy8qIERBQyBDb250cm9sICovCisjZGVmaW5lIENTNDI0NV9EQUNfRk1fTUFTSwkweGMwCisjZGVmaW5lIENTNDI0NV9EQUNfRk1fU0lOR0xFCTB4MDAKKyNkZWZpbmUgQ1M0MjQ1X0RBQ19GTV9ET1VCTEUJMHg0MAorI2RlZmluZSBDUzQyNDVfREFDX0ZNX1FVQUQJMHg4MAorI2RlZmluZSBDUzQyNDVfREFDX0RJRl9NQVNLCTB4MzAKKyNkZWZpbmUgQ1M0MjQ1X0RBQ19ESUZfTEpVU1QJMHgwMAorI2RlZmluZSBDUzQyNDVfREFDX0RJRl9JMlMJMHgxMAorI2RlZmluZSBDUzQyNDVfREFDX0RJRl9SSlVTVF8xNgkweDIwCisjZGVmaW5lIENTNDI0NV9EQUNfRElGX1JKVVNUXzI0CTB4MzAKKyNkZWZpbmUgQ1M0MjQ1X1JFU0VSVkVEXzEJMHgwOAorI2RlZmluZSBDUzQyNDVfTVVURV9EQUMJCTB4MDQKKyNkZWZpbmUgQ1M0MjQ1X0RFRU1QSAkJMHgwMgorI2RlZmluZSBDUzQyNDVfREFDX01BU1RFUgkweDAxCisKKy8qIEFEQyBDb250cm9sICovCisjZGVmaW5lIENTNDI0NV9BRENfRk1fTUFTSwkweGMwCisjZGVmaW5lIENTNDI0NV9BRENfRk1fU0lOR0xFCTB4MDAKKyNkZWZpbmUgQ1M0MjQ1X0FEQ19GTV9ET1VCTEUJMHg0MAorI2RlZmluZSBDUzQyNDVfQURDX0ZNX1FVQUQJMHg4MAorI2RlZmluZSBDUzQyNDVfQURDX0RJRl9NQVNLCTB4MTAKKyNkZWZpbmUgQ1M0MjQ1X0FEQ19ESUZfTEpVU1QJMHgwMAorI2RlZmluZSBDUzQyNDVfQURDX0RJRl9JMlMJMHgxMAorI2RlZmluZSBDUzQyNDVfTVVURV9BREMJCTB4MDQKKyNkZWZpbmUgQ1M0MjQ1X0hQRl9GUkVFWkUJMHgwMgorI2RlZmluZSBDUzQyNDVfQURDX01BU1RFUgkweDAxCisKKy8qIE1DTEsgRnJlcXVlbmN5ICovCisjZGVmaW5lIENTNDI0NV9NQ0xLMV9NQVNLCTB4NzAKKyNkZWZpbmUgQ1M0MjQ1X01DTEsxX1NISUZUCTQKKyNkZWZpbmUgQ1M0MjQ1X01DTEsyX01BU0sJMHgwNworI2RlZmluZSBDUzQyNDVfTUNMSzJfU0hJRlQJMAorI2RlZmluZSBDUzQyNDVfTUNMS18xCQkwCisjZGVmaW5lIENTNDI0NV9NQ0xLXzFfNQkJMQorI2RlZmluZSBDUzQyNDVfTUNMS18yCQkyCisjZGVmaW5lIENTNDI0NV9NQ0xLXzMJCTMKKyNkZWZpbmUgQ1M0MjQ1X01DTEtfNAkJNAorCisvKiBTaWduYWwgU2VsZWN0aW9uICovCisjZGVmaW5lIENTNDI0NV9BX09VVF9TRUxfTUFTSwkweDYwCisjZGVmaW5lIENTNDI0NV9BX09VVF9TRUxfSElaCTB4MDAKKyNkZWZpbmUgQ1M0MjQ1X0FfT1VUX1NFTF9EQUMJMHgyMAorI2RlZmluZSBDUzQyNDVfQV9PVVRfU0VMX1BHQQkweDQwCisjZGVmaW5lIENTNDI0NV9MT09QCQkweDAyCisjZGVmaW5lIENTNDI0NV9BU1lOQ0gJCTB4MDEKKworLyogQ2hhbm5lbCBCL0EgUEdBIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MjQ1X1BHQV9HQUlOX01BU0sJMHgzZgorCisvKiBBREMgSW5wdXQgQ29udHJvbCAqLworI2RlZmluZSBDUzQyNDVfUEdBX1NPRlQJCTB4MTAKKyNkZWZpbmUgQ1M0MjQ1X1BHQV9aRVJPCQkweDA4CisjZGVmaW5lIENTNDI0NV9TRUxfTUFTSwkJMHgwNworI2RlZmluZSBDUzQyNDVfU0VMX01JQwkJMHgwMAorI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzEJMHgwMQorI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzIJMHgwMgorI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzMJMHgwMworI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzQJMHgwNAorI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzUJMHgwNQorI2RlZmluZSBDUzQyNDVfU0VMX0lOUFVUXzYJMHgwNgorCisvKiBEQUMgQ2hhbm5lbCBBL0IgVm9sdW1lIENvbnRyb2wgKi8KKyNkZWZpbmUgQ1M0MjQ1X1ZPTF9NQVNLCQkweGZmCisKKy8qIERBQyBDb250cm9sIDIgKi8KKyNkZWZpbmUgQ1M0MjQ1X0RBQ19TT0ZUCQkweDgwCisjZGVmaW5lIENTNDI0NV9EQUNfWkVSTwkJMHg0MAorI2RlZmluZSBDUzQyNDVfSU5WRVJUX0RBQwkweDIwCisjZGVmaW5lIENTNDI0NV9JTlRfQUNUSVZFX0hJR0gJMHgwMQorCisvKiBJbnRlcnJ1cHQgU3RhdHVzL01hc2svTW9kZSAqLworI2RlZmluZSBDUzQyNDVfQURDX0NMS19FUlIJMHgwOAorI2RlZmluZSBDUzQyNDVfREFDX0NMS19FUlIJMHgwNAorI2RlZmluZSBDUzQyNDVfQURDX09WRkwJCTB4MDIKKyNkZWZpbmUgQ1M0MjQ1X0FEQ19VTkRSRkwJMHgwMQorCisKKyNkZWZpbmUgQ1M0MjQ1X1NQSV9BRERSRVNTCSgweDllIDw8IDE2KQorI2RlZmluZSBDUzQyNDVfU1BJX1dSSVRFCSgwIDw8IDE2KQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9oaWZpZXIuYyBiL3NvdW5kL3BjaS9veHlnZW4vaGlmaWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODdkNjguLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL294eWdlbi9oaWZpZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQy1NZWRpYSBDTUk4Nzg4IGRyaXZlciBmb3IgdGhlIE1lZGlhVGVrL1RlbXBvVGVjIEhpRmllciBGYW50YXNpYQotICoKLSAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+Ci0gKgotICoKLSAqICBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgotICoKLSAqICBUaGlzIGRyaXZlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIGRyaXZlcjsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICovCi0KLS8qCi0gKiBDTUk4Nzg4OgotICoKLSAqIFNQSSAwIC0+IEFLNDM5NgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgIm94eWdlbi5oIgotI2luY2x1ZGUgImFrNDM5Ni5oIgotCi1NT0RVTEVfQVVUSE9SKCJDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVGVtcG9UZWMgSGlGaWVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi1zdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwotc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwotc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwotCi1tb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiY2FyZCBpbmRleCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiZW5hYmxlIGNhcmQiKTsKLQotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGhpZmllcl9pZHMpID0gewotCXsgT1hZR0VOX1BDSV9TVUJJRCgweDE0YzMsIDB4MTcxMCkgfSwKLQl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxNGMzLCAweDE3MTEpIH0sCi0JeyBPWFlHRU5fUENJX1NVQklEX0JST0tFTl9FRVBST00gfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaGlmaWVyX2lkcyk7Ci0KLXN0cnVjdCBoaWZpZXJfZGF0YSB7Ci0JdTggYWs0Mzk2X3JlZ3NbNV07Ci19OwotCi1zdGF0aWMgdm9pZCBhazQzOTZfd3JpdGUoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggcmVnLCB1OCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgaGlmaWVyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCi0Jb3h5Z2VuX3dyaXRlX3NwaShjaGlwLCBPWFlHRU5fU1BJX1RSSUdHRVIgIHwKLQkJCSBPWFlHRU5fU1BJX0RBVEFfTEVOR1RIXzIgfAotCQkJIE9YWUdFTl9TUElfQ0xPQ0tfMTYwIHwKLQkJCSAoMCA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSB8Ci0JCQkgT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEksCi0JCQkgQUs0Mzk2X1dSSVRFIHwgKHJlZyA8PCA4KSB8IHZhbHVlKTsKLQlkYXRhLT5hazQzOTZfcmVnc1tyZWddID0gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGFrNDM5Nl93cml0ZV9jYWNoZWQoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggcmVnLCB1OCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgaGlmaWVyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCi0JaWYgKHZhbHVlICE9IGRhdGEtPmFrNDM5Nl9yZWdzW3JlZ10pCi0JCWFrNDM5Nl93cml0ZShjaGlwLCByZWcsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgaGlmaWVyX3JlZ2lzdGVyc19pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCi17Ci0Jc3RydWN0IGhpZmllcl9kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQotCWFrNDM5Nl93cml0ZShjaGlwLCBBSzQzOTZfQ09OVFJPTF8xLCBBSzQzOTZfRElGXzI0X01TQiB8IEFLNDM5Nl9SU1ROKTsKLQlhazQzOTZfd3JpdGUoY2hpcCwgQUs0Mzk2X0NPTlRST0xfMiwKLQkJICAgICBkYXRhLT5hazQzOTZfcmVnc1tBSzQzOTZfQ09OVFJPTF8yXSk7Ci0JYWs0Mzk2X3dyaXRlKGNoaXAsIEFLNDM5Nl9DT05UUk9MXzMsIEFLNDM5Nl9QQ00pOwotCWFrNDM5Nl93cml0ZShjaGlwLCBBSzQzOTZfTENIX0FUVCwgY2hpcC0+ZGFjX3ZvbHVtZVswXSk7Ci0JYWs0Mzk2X3dyaXRlKGNoaXAsIEFLNDM5Nl9SQ0hfQVRULCBjaGlwLT5kYWNfdm9sdW1lWzFdKTsKLX0KLQotc3RhdGljIHZvaWQgaGlmaWVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKLXsKLQlzdHJ1Y3QgaGlmaWVyX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCi0JZGF0YS0+YWs0Mzk2X3JlZ3NbQUs0Mzk2X0NPTlRST0xfMl0gPQotCQlBSzQzOTZfU01VVEUgfCBBSzQzOTZfREVNX09GRiB8IEFLNDM5Nl9ERlNfTk9STUFMOwotCWhpZmllcl9yZWdpc3RlcnNfaW5pdChjaGlwKTsKLQotCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJBSzQzOTYiKTsKLQlzbmRfY29tcG9uZW50X2FkZChjaGlwLT5jYXJkLCAiQ1M1MzQwIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZmllcl9jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGhpZmllcl9yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKLXsKLQloaWZpZXJfcmVnaXN0ZXJzX2luaXQoY2hpcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9hazQzOTZfcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IGhpZmllcl9kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1OCB2YWx1ZTsKLQotCXZhbHVlID0gZGF0YS0+YWs0Mzk2X3JlZ3NbQUs0Mzk2X0NPTlRST0xfMl0gJiB+QUs0Mzk2X0RGU19NQVNLOwotCWlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDU0MDAwKQotCQl2YWx1ZSB8PSBBSzQzOTZfREZTX05PUk1BTDsKLQllbHNlIGlmIChwYXJhbXNfcmF0ZShwYXJhbXMpIDw9IDEwODAwMCkKLQkJdmFsdWUgfD0gQUs0Mzk2X0RGU19ET1VCTEU7Ci0JZWxzZQotCQl2YWx1ZSB8PSBBSzQzOTZfREZTX1FVQUQ7Ci0KLQltc2xlZXAoMSk7IC8qIHdhaXQgZm9yIHRoZSBuZXcgTUNMSyB0byBiZWNvbWUgc3RhYmxlICovCi0KLQlpZiAodmFsdWUgIT0gZGF0YS0+YWs0Mzk2X3JlZ3NbQUs0Mzk2X0NPTlRST0xfMl0pIHsKLQkJYWs0Mzk2X3dyaXRlKGNoaXAsIEFLNDM5Nl9DT05UUk9MXzEsCi0JCQkgICAgIEFLNDM5Nl9ESUZfMjRfTVNCKTsKLQkJYWs0Mzk2X3dyaXRlKGNoaXAsIEFLNDM5Nl9DT05UUk9MXzIsIHZhbHVlKTsKLQkJYWs0Mzk2X3dyaXRlKGNoaXAsIEFLNDM5Nl9DT05UUk9MXzEsCi0JCQkgICAgIEFLNDM5Nl9ESUZfMjRfTVNCIHwgQUs0Mzk2X1JTVE4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2FrNDM5Nl92b2x1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKLXsKLQlhazQzOTZfd3JpdGVfY2FjaGVkKGNoaXAsIEFLNDM5Nl9MQ0hfQVRULCBjaGlwLT5kYWNfdm9sdW1lWzBdKTsKLQlhazQzOTZfd3JpdGVfY2FjaGVkKGNoaXAsIEFLNDM5Nl9SQ0hfQVRULCBjaGlwLT5kYWNfdm9sdW1lWzFdKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2FrNDM5Nl9tdXRlKHN0cnVjdCBveHlnZW4gKmNoaXApCi17Ci0Jc3RydWN0IGhpZmllcl9kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQl1OCB2YWx1ZTsKLQotCXZhbHVlID0gZGF0YS0+YWs0Mzk2X3JlZ3NbQUs0Mzk2X0NPTlRST0xfMl0gJiB+QUs0Mzk2X1NNVVRFOwotCWlmIChjaGlwLT5kYWNfbXV0ZSkKLQkJdmFsdWUgfD0gQUs0Mzk2X1NNVVRFOwotCWFrNDM5Nl93cml0ZV9jYWNoZWQoY2hpcCwgQUs0Mzk2X0NPTlRST0xfMiwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfY3M1MzQwX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAotCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci19Ci0KLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoYWs0Mzk2X2RiX3NjYWxlLCBUTFZfREJfR0FJTl9NVVRFLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfaGlmaWVyID0gewotCS5zaG9ydG5hbWUgPSAiQy1NZWRpYSBDTUk4Nzg3IiwKLQkubG9uZ25hbWUgPSAiQy1NZWRpYSBPeHlnZW4gSEQgQXVkaW8iLAotCS5jaGlwID0gIkNNSTg3ODgiLAotCS5pbml0ID0gaGlmaWVyX2luaXQsCi0JLmNsZWFudXAgPSBoaWZpZXJfY2xlYW51cCwKLQkucmVzdW1lID0gaGlmaWVyX3Jlc3VtZSwKLQkuZ2V0X2kyc19tY2xrID0gb3h5Z2VuX2RlZmF1bHRfaTJzX21jbGssCi0JLnNldF9kYWNfcGFyYW1zID0gc2V0X2FrNDM5Nl9wYXJhbXMsCi0JLnNldF9hZGNfcGFyYW1zID0gc2V0X2NzNTM0MF9wYXJhbXMsCi0JLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2FrNDM5Nl92b2x1bWUsCi0JLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9hazQzOTZfbXV0ZSwKLQkuZGFjX3RsdiA9IGFrNDM5Nl9kYl9zY2FsZSwKLQkubW9kZWxfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBoaWZpZXJfZGF0YSksCi0JLmRldmljZV9jb25maWcgPSBQTEFZQkFDS18wX1RPX0kyUyB8Ci0JCQkgUExBWUJBQ0tfMV9UT19TUERJRiB8Ci0JCQkgQ0FQVFVSRV8wX0ZST01fSTJTXzEsCi0JLmRhY19jaGFubmVscyA9IDIsCi0JLmRhY192b2x1bWVfbWluID0gMCwKLQkuZGFjX3ZvbHVtZV9tYXggPSAyNTUsCi0JLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSwKLQkuZGFjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKLQkuYWRjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKLX07Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGdldF9oaWZpZXJfbW9kZWwoc3RydWN0IG94eWdlbiAqY2hpcCwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0JY2hpcC0+bW9kZWwgPSBtb2RlbF9oaWZpZXI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGhpZmllcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAotCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKLXsKLQlzdGF0aWMgaW50IGRldjsKLQlpbnQgZXJyOwotCi0JaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFlbmFibGVbZGV2XSkgewotCQkrK2RldjsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCWVyciA9IG94eWdlbl9wY2lfcHJvYmUocGNpLCBpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwKLQkJCSAgICAgICBoaWZpZXJfaWRzLCBnZXRfaGlmaWVyX21vZGVsKTsKLQlpZiAoZXJyID49IDApCi0JCSsrZGV2OwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBoaWZpZXJfZHJpdmVyID0gewotCS5uYW1lID0gIkNNSTg3ODdIaUZpZXIiLAotCS5pZF90YWJsZSA9IGhpZmllcl9pZHMsCi0JLnByb2JlID0gaGlmaWVyX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChveHlnZW5fcGNpX3JlbW92ZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBveHlnZW5fcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IG94eWdlbl9wY2lfcmVzdW1lLAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfaGlmaWVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaGlmaWVyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfaGlmaWVyX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhpZmllcl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhbHNhX2NhcmRfaGlmaWVyX2luaXQpCi1tb2R1bGVfZXhpdChhbHNhX2NhcmRfaGlmaWVyX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jIGIvc291bmQvcGNpL294eWdlbi9veHlnZW4uYwppbmRleCA5OGE4ZWIzLi5kN2U4ZGRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmMKQEAgLTIwLDE5ICsyMCwzMiBAQAogLyoKICAqIENNSTg3ODg6CiAgKgotICogU1BJIDAgLT4gMXN0IEFLNDM5NiAoZnJvbnQpCi0gKiBTUEkgMSAtPiAybmQgQUs0Mzk2IChzdXJyb3VuZCkKLSAqIFNQSSAyIC0+IDNyZCBBSzQzOTYgKGNlbnRlci9MRkUpCi0gKiBTUEkgMyAtPiBXTTg3ODUKLSAqIFNQSSA0IC0+IDR0aCBBSzQzOTYgKGJhY2spCisgKiAgIFNQSSAwIC0+IDFzdCBBSzQzOTYgKGZyb250KQorICogICBTUEkgMSAtPiAybmQgQUs0Mzk2IChzdXJyb3VuZCkKKyAqICAgU1BJIDIgLT4gM3JkIEFLNDM5NiAoY2VudGVyL0xGRSkKKyAqICAgU1BJIDMgLT4gV004Nzg1CisgKiAgIFNQSSA0IC0+IDR0aCBBSzQzOTYgKGJhY2spCiAgKgotICogR1BJTyAwIC0+IERGUzAgb2YgQUs1Mzg1Ci0gKiBHUElPIDEgLT4gREZTMSBvZiBBSzUzODUKLSAqIEdQSU8gOCAtPiBlbmFibGUgaGVhZHBob25lIGFtcGxpZmllciBvbiBIVC1PbWVnYSBtb2RlbHMKKyAqICAgR1BJTyAwIC0+IERGUzAgb2YgQUs1Mzg1CisgKiAgIEdQSU8gMSAtPiBERlMxIG9mIEFLNTM4NQorICoKKyAqIFgtTWVyaWRpYW4gbW9kZWxzOgorICogICBHUElPIDQgLT4gZW5hYmxlIGV4dGVuc2lvbiBTL1BESUYgaW5wdXQKKyAqICAgR1BJTyA2IC0+IGVuYWJsZSBvbi1ib2FyZCBTL1BESUYgaW5wdXQKKyAqCisgKiBDbGFybyBtb2RlbHM6CisgKiAgIEdQSU8gNiAtPiBTL1BESUYgZnJvbSBvcHRpY2FsICgwKSBvciBjb2F4aWFsICgxKSBpbnB1dAorICogICBHUElPIDggLT4gZW5hYmxlIGhlYWRwaG9uZSBhbXBsaWZpZXIKICAqCiAgKiBDTTk3ODA6CiAgKgotICogR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIEFEQyBpbnB1dAorICogICBMSU5FX09VVCAtPiBpbnB1dCBvZiBBREMKKyAqCisgKiAgIEFVWF9JTiA8LSBhdXgKKyAqICAgQ0RfSU4gIDwtIENECisgKiAgIE1JQ19JTiA8LSBtaWMKKyAqCisgKiAgIEdQTyAwIC0+IHJvdXRlIGxpbmUtaW4gKDApIG9yIEFDOTcgb3V0cHV0ICgxKSB0byBBREMgaW5wdXQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQxLDE4ICs1NCwyMiBAQAogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgIm94eWdlbi5oIgorI2luY2x1ZGUgInhvbmFyX2RnLmgiCiAjaW5jbHVkZSAiYWs0Mzk2LmgiCiAjaW5jbHVkZSAid204Nzg1LmgiCiAKIE1PRFVMRV9BVVRIT1IoIkNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDLU1lZGlhIENNSTg3ODggZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDLU1lZGlhLENNSTg3ODh9fSIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Qy1NZWRpYSxDTUk4Nzg2fSIKKwkJCSIse0MtTWVkaWEsQ01JODc4N30iCisJCQkiLHtDLU1lZGlhLENNSTg3ODh9fSIpOwogCiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwogc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwpAQCAtNjYsMjQgKzgzLDQ2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZSwgImVuYWJsZSBjYXJkIik7CiAKIGVudW0gewotCU1PREVMX0NNRURJQV9SRUYsCS8qIEMtTWVkaWEncyByZWZlcmVuY2UgZGVzaWduICovCi0JTU9ERUxfTUVSSURJQU4sCQkvKiBBdXplblRlY2ggWC1NZXJpZGlhbiAqLwotCU1PREVMX0NMQVJPLAkJLyogSFQtT21lZ2EgQ2xhcm8gKi8KLQlNT0RFTF9DTEFST19IQUxPLAkvKiBIVC1PbWVnYSBDbGFybyBoYWxvICovCisJTU9ERUxfQ01FRElBX1JFRiwKKwlNT0RFTF9NRVJJRElBTiwKKwlNT0RFTF9NRVJJRElBTl8yRywKKwlNT0RFTF9DTEFSTywKKwlNT0RFTF9DTEFST19IQUxPLAorCU1PREVMX0ZBTlRBU0lBLAorCU1PREVMX1NFUkVOQURFLAorCU1PREVMXzJDSF9PVVRQVVQsCisJTU9ERUxfSEcyUENJLAorCU1PREVMX1hPTkFSX0RHLAogfTsKIAogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG94eWdlbl9pZHMpID0geworCS8qIEMtTWVkaWEncyByZWZlcmVuY2UgZGVzaWduICovCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4MTBiMCwgMHgwMjE2KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAorCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEwYjAsIDB4MDIxNyksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKIAl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMGIwLCAweDAyMTgpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4MTBiMCwgMHgwMjE5KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAogCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEzZjYsIDB4MDAwMSksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKIAl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxM2Y2LCAweDAwMTApLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4MTNmNiwgMHg4Nzg4KSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAotCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEzZjYsIDB4ZmZmZiksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0NNRURJQV9SRUYgfSwKIAl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxNDdhLCAweGEwMTcpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9DTUVESUFfUkVGIH0sCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4MWE1OCwgMHgwOTEwKSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ01FRElBX1JFRiB9LAorCS8qIEFzdXMgWG9uYXIgREcgKi8KKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxMDQzLCAweDg0NjcpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9YT05BUl9ERyB9LAorCS8qIFBDSSAyLjAgSEQgQXVkaW8gKi8KKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHgxM2Y2LCAweDg3ODIpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF8yQ0hfT1VUUFVUIH0sCisJLyogS3Vyb3V0b3NoaWtvdSBDTUk4Nzg3LUhHMlBDSSAqLworCXsgT1hZR0VOX1BDSV9TVUJJRCgweDEzZjYsIDB4ZmZmZiksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0hHMlBDSSB9LAorCS8qIFRlbXBvVGVjIEhpRmllciBGYW50YXNpYSAqLworCXsgT1hZR0VOX1BDSV9TVUJJRCgweDE0YzMsIDB4MTcxMCksIC5kcml2ZXJfZGF0YSA9IE1PREVMX0ZBTlRBU0lBIH0sCisJLyogVGVtcG9UZWMgSGlGaWVyIFNlcmVuYWRlICovCisJeyBPWFlHRU5fUENJX1NVQklEKDB4MTRjMywgMHgxNzExKSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfU0VSRU5BREUgfSwKKwkvKiBBdXplblRlY2ggWC1NZXJpZGlhbiAqLwogCXsgT1hZR0VOX1BDSV9TVUJJRCgweDQxNWEsIDB4NTQzMSksIC5kcml2ZXJfZGF0YSA9IE1PREVMX01FUklESUFOIH0sCisJLyogQXV6ZW5UZWNoIFgtTWVyaWRpYW4gMkcgKi8KKwl7IE9YWUdFTl9QQ0lfU1VCSUQoMHg1NDMxLCAweDAxN2EpLCAuZHJpdmVyX2RhdGEgPSBNT0RFTF9NRVJJRElBTl8yRyB9LAorCS8qIEhULU9tZWdhIENsYXJvICovCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4NzI4NCwgMHg5NzYxKSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ0xBUk8gfSwKKwkvKiBIVC1PbWVnYSBDbGFybyBoYWxvICovCiAJeyBPWFlHRU5fUENJX1NVQklEKDB4NzI4NCwgMHg5NzgxKSwgLmRyaXZlcl9kYXRhID0gTU9ERUxfQ0xBUk9fSEFMTyB9LAogCXsgfQogfTsKQEAgLTk1LDkgKzEzNCwxNSBAQAogI2RlZmluZSBHUElPX0FLNTM4NV9ERlNfRE9VQkxFCTB4MDAwMQogI2RlZmluZSBHUElPX0FLNTM4NV9ERlNfUVVBRAkweDAwMDIKIAorI2RlZmluZSBHUElPX01FUklESUFOX0RJR19NQVNLCTB4MDA1MAorI2RlZmluZSBHUElPX01FUklESUFOX0RJR19FWFQJMHgwMDEwCisjZGVmaW5lIEdQSU9fTUVSSURJQU5fRElHX0JPQVJECTB4MDA0MAorCisjZGVmaW5lIEdQSU9fQ0xBUk9fRElHX0NPQVgJMHgwMDQwCiAjZGVmaW5lIEdQSU9fQ0xBUk9fSFAJCTB4MDEwMAogCiBzdHJ1Y3QgZ2VuZXJpY19kYXRhIHsKKwl1bnNpZ25lZCBpbnQgZGFjczsKIAl1OCBhazQzOTZfcmVnc1s0XVs1XTsKIAl1MTYgd204Nzg1X3JlZ3NbM107CiB9OwpAQCAtMTQ4LDcgKzE5Myw3IEBACiAJc3RydWN0IGdlbmVyaWNfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRhY3M7ICsraSkgewogCQlhazQzOTZfd3JpdGUoY2hpcCwgaSwgQUs0Mzk2X0NPTlRST0xfMSwKIAkJCSAgICAgQUs0Mzk2X0RJRl8yNF9NU0IgfCBBSzQzOTZfUlNUTik7CiAJCWFrNDM5Nl93cml0ZShjaGlwLCBpLCBBSzQzOTZfQ09OVFJPTF8yLApAQCAtMTY2LDYgKzIxMSw3IEBACiB7CiAJc3RydWN0IGdlbmVyaWNfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAKKwlkYXRhLT5kYWNzID0gY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX3BjbSAvIDI7CiAJZGF0YS0+YWs0Mzk2X3JlZ3NbMF1bQUs0Mzk2X0NPTlRST0xfMl0gPQogCQlBSzQzOTZfU01VVEUgfCBBSzQzOTZfREVNX09GRiB8IEFLNDM5Nl9ERlNfTk9STUFMOwogCWFrNDM5Nl9yZWdpc3RlcnNfaW5pdChjaGlwKTsKQEAgLTIwNyw2ICsyNTMsMTAgQEAKIAogc3RhdGljIHZvaWQgbWVyaWRpYW5faW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogeworCW94eWdlbl9zZXRfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsCisJCQkgIEdQSU9fTUVSSURJQU5fRElHX01BU0spOworCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fR1BJT19EQVRBLAorCQkJICAgICAgR1BJT19NRVJJRElBTl9ESUdfQk9BUkQsIEdQSU9fTUVSSURJQU5fRElHX01BU0spOwogCWFrNDM5Nl9pbml0KGNoaXApOwogCWFrNTM4NV9pbml0KGNoaXApOwogfQpAQCAtMjIwLDYgKzI3MCw4IEBACiAKIHN0YXRpYyB2b2lkIGNsYXJvX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKKwlveHlnZW5fc2V0X2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLCBHUElPX0NMQVJPX0RJR19DT0FYKTsKKwlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsIEdQSU9fQ0xBUk9fRElHX0NPQVgpOwogCWFrNDM5Nl9pbml0KGNoaXApOwogCXdtODc4NV9pbml0KGNoaXApOwogCWNsYXJvX2VuYWJsZV9ocChjaGlwKTsKQEAgLTIyNywxMSArMjc5LDI0IEBACiAKIHN0YXRpYyB2b2lkIGNsYXJvX2hhbG9faW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogeworCW94eWdlbl9zZXRfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsIEdQSU9fQ0xBUk9fRElHX0NPQVgpOworCW94eWdlbl9jbGVhcl9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwgR1BJT19DTEFST19ESUdfQ09BWCk7CiAJYWs0Mzk2X2luaXQoY2hpcCk7CiAJYWs1Mzg1X2luaXQoY2hpcCk7CiAJY2xhcm9fZW5hYmxlX2hwKGNoaXApOwogfQogCitzdGF0aWMgdm9pZCBmYW50YXNpYV9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJYWs0Mzk2X2luaXQoY2hpcCk7CisJc25kX2NvbXBvbmVudF9hZGQoY2hpcC0+Y2FyZCwgIkNTNTM0MCIpOworfQorCitzdGF0aWMgdm9pZCBzdGVyZW9fb3V0cHV0X2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlhazQzOTZfaW5pdChjaGlwKTsKK30KKwogc3RhdGljIHZvaWQgZ2VuZXJpY19jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiB9CkBAIC0yNjgsNiArMzMzLDExIEBACiAJY2xhcm9fZW5hYmxlX2hwKGNoaXApOwogfQogCitzdGF0aWMgdm9pZCBzdGVyZW9fcmVzdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJYWs0Mzk2X3JlZ2lzdGVyc19pbml0KGNoaXApOworfQorCiBzdGF0aWMgdm9pZCBzZXRfYWs0Mzk2X3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC0yODYsNyArMzU2LDcgQEAKIAltc2xlZXAoMSk7IC8qIHdhaXQgZm9yIHRoZSBuZXcgTUNMSyB0byBiZWNvbWUgc3RhYmxlICovCiAKIAlpZiAodmFsdWUgIT0gZGF0YS0+YWs0Mzk2X3JlZ3NbMF1bQUs0Mzk2X0NPTlRST0xfMl0pIHsKLQkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGFjczsgKytpKSB7CiAJCQlhazQzOTZfd3JpdGUoY2hpcCwgaSwgQUs0Mzk2X0NPTlRST0xfMSwKIAkJCQkgICAgIEFLNDM5Nl9ESUZfMjRfTVNCKTsKIAkJCWFrNDM5Nl93cml0ZShjaGlwLCBpLCBBSzQzOTZfQ09OVFJPTF8yLCB2YWx1ZSk7CkBAIC0yOTgsOSArMzY4LDEwIEBACiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9hazQzOTZfdm9sdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CisJc3RydWN0IGdlbmVyaWNfZGF0YSAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmRhY3M7ICsraSkgewogCQlhazQzOTZfd3JpdGVfY2FjaGVkKGNoaXAsIGksIEFLNDM5Nl9MQ0hfQVRULAogCQkJCSAgICBjaGlwLT5kYWNfdm9sdW1lW2kgKiAyXSk7CiAJCWFrNDM5Nl93cml0ZV9jYWNoZWQoY2hpcCwgaSwgQUs0Mzk2X1JDSF9BVFQsCkBAIC0zMTcsNyArMzg4LDcgQEAKIAl2YWx1ZSA9IGRhdGEtPmFrNDM5Nl9yZWdzWzBdW0FLNDM5Nl9DT05UUk9MXzJdICYgfkFLNDM5Nl9TTVVURTsKIAlpZiAoY2hpcC0+ZGFjX211dGUpCiAJCXZhbHVlIHw9IEFLNDM5Nl9TTVVURTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kYWNzOyArK2kpCiAJCWFrNDM5Nl93cml0ZV9jYWNoZWQoY2hpcCwgaSwgQUs0Mzk2X0NPTlRST0xfMiwgdmFsdWUpOwogfQogCkBAIC0zNTYsNiArNDI3LDEwIEBACiAJCQkgICAgICB2YWx1ZSwgR1BJT19BSzUzODVfREZTX01BU0spOwogfQogCitzdGF0aWMgdm9pZCBzZXRfbm9fcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworfQorCiBzdGF0aWMgaW50IHJvbGxvZmZfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCiAJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCiB7CkBAIC0zNjMsMTMgKzQzOCw3IEBACiAJCSJTaGFycCBSb2xsLW9mZiIsICJTbG93IFJvbGwtb2ZmIgogCX07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDIpCi0JCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDIsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCByb2xsb2ZmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCkBAIC00MDAsNyArNDY5LDcgQEAKIAkJcmVnICY9IH5BSzQzOTZfU0xPVzsKIAljaGFuZ2VkID0gcmVnICE9IGRhdGEtPmFrNDM5Nl9yZWdzWzBdW0FLNDM5Nl9DT05UUk9MXzJdOwogCWlmIChjaGFuZ2VkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kYWNzOyArK2kpCiAJCQlhazQzOTZfd3JpdGUoY2hpcCwgaSwgQUs0Mzk2X0NPTlRST0xfMiwgcmVnKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CkBAIC00MjEsMTMgKzQ5MCw3IEBACiAJCSJOb25lIiwgIkhpZ2gtcGFzcyBGaWx0ZXIiCiAJfTsKIAotCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JaW5mby0+Y291bnQgPSAxOwotCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOwotCWlmIChpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gMikKLQkJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKLQlzdHJjcHkoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBuYW1lc1tpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMiwgbmFtZXMpOwogfQogCiBzdGF0aWMgaW50IGhwZl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKQEAgLTQ2Niw2ICs1MjksMTAwIEBACiAJLnB1dCA9IGhwZl9wdXQsCiB9OwogCitzdGF0aWMgaW50IG1lcmlkaWFuX2RpZ19zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbMl0gPSB7ICJPbi1ib2FyZCIsICJFeHRlbnNpb24iIH07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMiwgbmFtZXMpOworfQorCitzdGF0aWMgaW50IGNsYXJvX2RpZ19zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbMl0gPSB7ICJPcHRpY2FsIiwgIkNvYXhpYWwiIH07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMiwgbmFtZXMpOworfQorCitzdGF0aWMgaW50IG1lcmlkaWFuX2RpZ19zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisKKwl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJISEob3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKSAmCisJCSAgIEdQSU9fTUVSSURJQU5fRElHX0VYVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xhcm9fZGlnX3NvdXJjZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKworCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkhIShveHlnZW5fcmVhZDE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEpICYKKwkJICAgR1BJT19DTEFST19ESUdfQ09BWCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVyaWRpYW5fZGlnX3NvdXJjZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwl1MTYgb2xkX3JlZywgbmV3X3JlZzsKKwlpbnQgY2hhbmdlZDsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwlvbGRfcmVnID0gb3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKTsKKwluZXdfcmVnID0gb2xkX3JlZyAmIH5HUElPX01FUklESUFOX0RJR19NQVNLOworCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IDApCisJCW5ld19yZWcgfD0gR1BJT19NRVJJRElBTl9ESUdfQk9BUkQ7CisJZWxzZQorCQluZXdfcmVnIHw9IEdQSU9fTUVSSURJQU5fRElHX0VYVDsKKwljaGFuZ2VkID0gbmV3X3JlZyAhPSBvbGRfcmVnOworCWlmIChjaGFuZ2VkKQorCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBuZXdfcmVnKTsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIGludCBjbGFyb19kaWdfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXUxNiBvbGRfcmVnLCBuZXdfcmVnOworCWludCBjaGFuZ2VkOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCW9sZF9yZWcgPSBveHlnZW5fcmVhZDE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEpOworCW5ld19yZWcgPSBvbGRfcmVnICYgfkdQSU9fQ0xBUk9fRElHX0NPQVg7CisJaWYgKHZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pCisJCW5ld19yZWcgfD0gR1BJT19DTEFST19ESUdfQ09BWDsKKwljaGFuZ2VkID0gbmV3X3JlZyAhPSBvbGRfcmVnOworCWlmIChjaGFuZ2VkKQorCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBuZXdfcmVnKTsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1lcmlkaWFuX2RpZ19zb3VyY2VfY29udHJvbCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJJRUM5NTggU291cmNlIENhcHR1cmUgRW51bSIsCisJLmluZm8gPSBtZXJpZGlhbl9kaWdfc291cmNlX2luZm8sCisJLmdldCA9IG1lcmlkaWFuX2RpZ19zb3VyY2VfZ2V0LAorCS5wdXQgPSBtZXJpZGlhbl9kaWdfc291cmNlX3B1dCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjbGFyb19kaWdfc291cmNlX2NvbnRyb2wgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiSUVDOTU4IFNvdXJjZSBDYXB0dXJlIEVudW0iLAorCS5pbmZvID0gY2xhcm9fZGlnX3NvdXJjZV9pbmZvLAorCS5nZXQgPSBjbGFyb19kaWdfc291cmNlX2dldCwKKwkucHV0ID0gY2xhcm9fZGlnX3NvdXJjZV9wdXQsCit9OworCiBzdGF0aWMgaW50IGdlbmVyaWNfbWl4ZXJfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogewogCXJldHVybiBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnJvbGxvZmZfY29udHJvbCwgY2hpcCkpOwpAQCAtNDg0LDYgKzY0MSw4MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1lcmlkaWFuX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ2VuZXJpY19taXhlcl9pbml0KGNoaXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsCisJCQkgIHNuZF9jdGxfbmV3MSgmbWVyaWRpYW5fZGlnX3NvdXJjZV9jb250cm9sLCBjaGlwKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xhcm9fbWl4ZXJfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCWludCBlcnI7CisKKwllcnIgPSBnZW5lcmljX3dtODc4NV9taXhlcl9pbml0KGNoaXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsCisJCQkgIHNuZF9jdGxfbmV3MSgmY2xhcm9fZGlnX3NvdXJjZV9jb250cm9sLCBjaGlwKSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xhcm9faGFsb19taXhlcl9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJaW50IGVycjsKKworCWVyciA9IGdlbmVyaWNfbWl4ZXJfaW5pdChjaGlwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLAorCQkJICBzbmRfY3RsX25ldzEoJmNsYXJvX2RpZ19zb3VyY2VfY29udHJvbCwgY2hpcCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2FrNDM5Nl9yZWdpc3RlcnMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19kYXRhICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGFjLCBpOworCisJZm9yIChkYWMgPSAwOyBkYWMgPCBkYXRhLT5kYWNzOyArK2RhYykgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJcbkFLNDM5NiAldToiLCBkYWMgKyAxKTsKKwkJZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAlMDJ4IiwgZGF0YS0+YWs0Mzk2X3JlZ3NbZGFjXVtpXSk7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfd204Nzg1X3JlZ2lzdGVycyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJCSAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQoreworCXN0cnVjdCBnZW5lcmljX2RhdGEgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXVuc2lnbmVkIGludCBpOworCisJc25kX2lwcmludGYoYnVmZmVyLCAiXG5XTTg3ODU6Iik7CisJZm9yIChpID0gMDsgaSA8IDM7ICsraSkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICUwM3giLCBkYXRhLT53bTg3ODVfcmVnc1tpXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9veHlnZW5fcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJZHVtcF9hazQzOTZfcmVnaXN0ZXJzKGNoaXAsIGJ1ZmZlcik7CisJZHVtcF93bTg3ODVfcmVnaXN0ZXJzKGNoaXAsIGJ1ZmZlcik7Cit9CisKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoYWs0Mzk2X2RiX3NjYWxlLCBUTFZfREJfR0FJTl9NVVRFLCAwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfZ2VuZXJpYyA9IHsKQEAgLTQ5NCwxMSArNzI2LDExIEBACiAJLm1peGVyX2luaXQgPSBnZW5lcmljX3dtODc4NV9taXhlcl9pbml0LAogCS5jbGVhbnVwID0gZ2VuZXJpY19jbGVhbnVwLAogCS5yZXN1bWUgPSBnZW5lcmljX3Jlc3VtZSwKLQkuZ2V0X2kyc19tY2xrID0gb3h5Z2VuX2RlZmF1bHRfaTJzX21jbGssCiAJLnNldF9kYWNfcGFyYW1zID0gc2V0X2FrNDM5Nl9wYXJhbXMsCiAJLnNldF9hZGNfcGFyYW1zID0gc2V0X3dtODc4NV9wYXJhbXMsCiAJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2FrNDM5Nl92b2x1bWUsCiAJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9hazQzOTZfbXV0ZSwKKwkuZHVtcF9yZWdpc3RlcnMgPSBkdW1wX294eWdlbl9yZWdpc3RlcnMsCiAJLmRhY190bHYgPSBhazQzOTZfZGJfc2NhbGUsCiAJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ2VuZXJpY19kYXRhKSwKIAkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKQEAgLTUwOCwxMSArNzQwLDE0IEBACiAJCQkgQ0FQVFVSRV8xX0ZST01fU1BESUYgfAogCQkJIENBUFRVUkVfMl9GUk9NX0FDOTdfMSB8CiAJCQkgQUM5N19DRF9JTlBVVCwKLQkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX2NoYW5uZWxzX3BjbSA9IDgsCisJLmRhY19jaGFubmVsc19taXhlciA9IDgsCiAJLmRhY192b2x1bWVfbWluID0gMCwKIAkuZGFjX3ZvbHVtZV9tYXggPSAyNTUsCiAJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSB8CiAJCQkgIE9YWUdFTl9GVU5DVElPTl9FTkFCTEVfU1BJXzRfNSwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMTI4LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAyNTYsIDEyOCksCiAJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9OwpAQCAtNTIwLDQyICs3NTUsODcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGdldF9veHlnZW5fbW9kZWwoc3RydWN0IG94eWdlbiAqY2hpcCwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7CisJCVtNT0RFTF9NRVJJRElBTl0JPSAiQXV6ZW5UZWNoIFgtTWVyaWRpYW4iLAorCQlbTU9ERUxfTUVSSURJQU5fMkddCT0gIkF1emVuVGVjaCBYLU1lcmlkaWFuIDJHIiwKKwkJW01PREVMX0NMQVJPXQkJPSAiSFQtT21lZ2EgQ2xhcm8iLAorCQlbTU9ERUxfQ0xBUk9fSEFMT10JPSAiSFQtT21lZ2EgQ2xhcm8gaGFsbyIsCisJCVtNT0RFTF9GQU5UQVNJQV0JPSAiVGVtcG9UZWMgSGlGaWVyIEZhbnRhc2lhIiwKKwkJW01PREVMX1NFUkVOQURFXQk9ICJUZW1wb1RlYyBIaUZpZXIgU2VyZW5hZGUiLAorCQlbTU9ERUxfSEcyUENJXQkJPSAiQ01JODc4Ny1IRzJQQ0kiLAorCX07CisKIAljaGlwLT5tb2RlbCA9IG1vZGVsX2dlbmVyaWM7CiAJc3dpdGNoIChpZC0+ZHJpdmVyX2RhdGEpIHsKIAljYXNlIE1PREVMX01FUklESUFOOgorCWNhc2UgTU9ERUxfTUVSSURJQU5fMkc6CiAJCWNoaXAtPm1vZGVsLmluaXQgPSBtZXJpZGlhbl9pbml0OwotCQljaGlwLT5tb2RlbC5taXhlcl9pbml0ID0gZ2VuZXJpY19taXhlcl9pbml0OworCQljaGlwLT5tb2RlbC5taXhlcl9pbml0ID0gbWVyaWRpYW5fbWl4ZXJfaW5pdDsKIAkJY2hpcC0+bW9kZWwucmVzdW1lID0gbWVyaWRpYW5fcmVzdW1lOwogCQljaGlwLT5tb2RlbC5zZXRfYWRjX3BhcmFtcyA9IHNldF9hazUzODVfcGFyYW1zOworCQljaGlwLT5tb2RlbC5kdW1wX3JlZ2lzdGVycyA9IGR1bXBfYWs0Mzk2X3JlZ2lzdGVyczsKIAkJY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKIAkJCQkJICAgIFBMQVlCQUNLXzFfVE9fU1BESUYgfAogCQkJCQkgICAgQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAogCQkJCQkgICAgQ0FQVFVSRV8xX0ZST01fU1BESUY7CisJCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gTU9ERUxfTUVSSURJQU4pCisJCQljaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnIHw9IEFDOTdfQ0RfSU5QVVQ7CiAJCWJyZWFrOwogCWNhc2UgTU9ERUxfQ0xBUk86CiAJCWNoaXAtPm1vZGVsLmluaXQgPSBjbGFyb19pbml0OworCQljaGlwLT5tb2RlbC5taXhlcl9pbml0ID0gY2xhcm9fbWl4ZXJfaW5pdDsKIAkJY2hpcC0+bW9kZWwuY2xlYW51cCA9IGNsYXJvX2NsZWFudXA7CiAJCWNoaXAtPm1vZGVsLnN1c3BlbmQgPSBjbGFyb19zdXNwZW5kOwogCQljaGlwLT5tb2RlbC5yZXN1bWUgPSBjbGFyb19yZXN1bWU7CiAJCWJyZWFrOwogCWNhc2UgTU9ERUxfQ0xBUk9fSEFMTzoKIAkJY2hpcC0+bW9kZWwuaW5pdCA9IGNsYXJvX2hhbG9faW5pdDsKLQkJY2hpcC0+bW9kZWwubWl4ZXJfaW5pdCA9IGdlbmVyaWNfbWl4ZXJfaW5pdDsKKwkJY2hpcC0+bW9kZWwubWl4ZXJfaW5pdCA9IGNsYXJvX2hhbG9fbWl4ZXJfaW5pdDsKIAkJY2hpcC0+bW9kZWwuY2xlYW51cCA9IGNsYXJvX2NsZWFudXA7CiAJCWNoaXAtPm1vZGVsLnN1c3BlbmQgPSBjbGFyb19zdXNwZW5kOwogCQljaGlwLT5tb2RlbC5yZXN1bWUgPSBjbGFyb19yZXN1bWU7CiAJCWNoaXAtPm1vZGVsLnNldF9hZGNfcGFyYW1zID0gc2V0X2FrNTM4NV9wYXJhbXM7CisJCWNoaXAtPm1vZGVsLmR1bXBfcmVnaXN0ZXJzID0gZHVtcF9hazQzOTZfcmVnaXN0ZXJzOwogCQljaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAogCQkJCQkgICAgUExBWUJBQ0tfMV9UT19TUERJRiB8CiAJCQkJCSAgICBDQVBUVVJFXzBfRlJPTV9JMlNfMiB8CiAJCQkJCSAgICBDQVBUVVJFXzFfRlJPTV9TUERJRjsKIAkJYnJlYWs7CisJY2FzZSBNT0RFTF9GQU5UQVNJQToKKwljYXNlIE1PREVMX1NFUkVOQURFOgorCWNhc2UgTU9ERUxfMkNIX09VVFBVVDoKKwljYXNlIE1PREVMX0hHMlBDSToKKwkJY2hpcC0+bW9kZWwuc2hvcnRuYW1lID0gIkMtTWVkaWEgQ01JODc4NyI7CisJCWNoaXAtPm1vZGVsLmNoaXAgPSAiQ01JODc4NyI7CisJCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gTU9ERUxfRkFOVEFTSUEpCisJCQljaGlwLT5tb2RlbC5pbml0ID0gZmFudGFzaWFfaW5pdDsKKwkJZWxzZQorCQkJY2hpcC0+bW9kZWwuaW5pdCA9IHN0ZXJlb19vdXRwdXRfaW5pdDsKKwkJY2hpcC0+bW9kZWwucmVzdW1lID0gc3RlcmVvX3Jlc3VtZTsKKwkJY2hpcC0+bW9kZWwubWl4ZXJfaW5pdCA9IGdlbmVyaWNfbWl4ZXJfaW5pdDsKKwkJY2hpcC0+bW9kZWwuc2V0X2FkY19wYXJhbXMgPSBzZXRfbm9fcGFyYW1zOworCQljaGlwLT5tb2RlbC5kdW1wX3JlZ2lzdGVycyA9IGR1bXBfYWs0Mzk2X3JlZ2lzdGVyczsKKwkJY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKKwkJCQkJICAgIFBMQVlCQUNLXzFfVE9fU1BESUY7CisJCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gTU9ERUxfRkFOVEFTSUEpIHsKKwkJCWNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgfD0gQ0FQVFVSRV8wX0ZST01fSTJTXzE7CisJCQljaGlwLT5tb2RlbC5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCk7CisJCX0KKwkJY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX3BjbSA9IDI7CisJCWNoaXAtPm1vZGVsLmRhY19jaGFubmVsc19taXhlciA9IDI7CisJCWJyZWFrOworCWNhc2UgTU9ERUxfWE9OQVJfREc6CisJCWNoaXAtPm1vZGVsID0gbW9kZWxfeG9uYXJfZGc7CisJCWJyZWFrOwogCX0KIAlpZiAoaWQtPmRyaXZlcl9kYXRhID09IE1PREVMX01FUklESUFOIHx8CisJICAgIGlkLT5kcml2ZXJfZGF0YSA9PSBNT0RFTF9NRVJJRElBTl8yRyB8fAogCSAgICBpZC0+ZHJpdmVyX2RhdGEgPT0gTU9ERUxfQ0xBUk9fSEFMTykgewogCQljaGlwLT5tb2RlbC5taXNjX2ZsYWdzID0gT1hZR0VOX01JU0NfTUlESTsKIAkJY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyB8PSBNSURJX09VVFBVVCB8IE1JRElfSU5QVVQ7CiAJfQorCWlmIChpZC0+ZHJpdmVyX2RhdGEgPCBBUlJBWV9TSVpFKG5hbWVzKSAmJiBuYW1lc1tpZC0+ZHJpdmVyX2RhdGFdKQorCQljaGlwLT5tb2RlbC5zaG9ydG5hbWUgPSBuYW1lc1tpZC0+ZHJpdmVyX2RhdGFdOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5oIGIvc291bmQvcGNpL294eWdlbi9veHlnZW4uaAppbmRleCA3ZDUyMjJjLi5jMmFlNjNkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbi5oCisrKyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuLmgKQEAgLTE2LDYgKzE2LDEwIEBACiAjZGVmaW5lIFBDTV9BQzk3CTUKICNkZWZpbmUgUENNX0NPVU5UCTYKIAorI2RlZmluZSBPWFlHRU5fTUNMS1MoZl9zaW5nbGUsIGZfZG91YmxlLCBmX3F1YWQpICgoTUNMS18jI2Zfc2luZ2xlIDw8IDApIHwgXAorCQkJCQkJICAoTUNMS18jI2ZfZG91YmxlIDw8IDIpIHwgXAorCQkJCQkJICAoTUNMS18jI2ZfcXVhZCAgIDw8IDQpKQorCiAjZGVmaW5lIE9YWUdFTl9JT19TSVpFCTB4MTAwCiAKICNkZWZpbmUgT1hZR0VOX0VFUFJPTV9JRAkweDQzNGQJLyogIkNNIiAqLwpAQCAtMzUsNiArMzksNyBAQAogI2RlZmluZSBNSURJX09VVFBVVAkJMHgwODAwCiAjZGVmaW5lIE1JRElfSU5QVVQJCTB4MTAwMAogI2RlZmluZSBBQzk3X0NEX0lOUFVUCQkweDIwMDAKKyNkZWZpbmUgQUM5N19GTUlDX1NXSVRDSAkweDQwMDAKIAogZW51bSB7CiAJQ09OVFJPTF9TUERJRl9QQ00sCkBAIC02NSw2ICs3MCw3IEBACiBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXM7CiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldzsKIHN0cnVjdCBzbmRfcmF3bWlkaTsKK3N0cnVjdCBzbmRfaW5mb19idWZmZXI7CiBzdHJ1Y3Qgb3h5Z2VuOwogCiBzdHJ1Y3Qgb3h5Z2VuX21vZGVsIHsKQEAgLTc5LDggKzg1LDYgQEAKIAl2b2lkICgqcmVzdW1lKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKIAl2b2lkICgqcGNtX2hhcmR3YXJlX2ZpbHRlcikodW5zaWduZWQgaW50IGNoYW5uZWwsCiAJCQkJICAgIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpoYXJkd2FyZSk7Ci0JdW5zaWduZWQgaW50ICgqZ2V0X2kyc19tY2xrKShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKTsKIAl2b2lkICgqc2V0X2RhY19wYXJhbXMpKHN0cnVjdCBveHlnZW4gKmNoaXAsCiAJCQkgICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwogCXZvaWQgKCpzZXRfYWRjX3BhcmFtcykoc3RydWN0IG94eWdlbiAqY2hpcCwKQEAgLTkyLDE1ICs5NiwxOSBAQAogCXZvaWQgKCp1YXJ0X2lucHV0KShzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKIAl2b2lkICgqYWM5N19zd2l0Y2gpKHN0cnVjdCBveHlnZW4gKmNoaXAsCiAJCQkgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG11dGUpOworCXZvaWQgKCpkdW1wX3JlZ2lzdGVycykoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpOwogCWNvbnN0IHVuc2lnbmVkIGludCAqZGFjX3RsdjsKLQl1bnNpZ25lZCBsb25nIHByaXZhdGVfZGF0YTsKIAlzaXplX3QgbW9kZWxfZGF0YV9zaXplOwogCXVuc2lnbmVkIGludCBkZXZpY2VfY29uZmlnOwotCXU4IGRhY19jaGFubmVsczsKKwl1OCBkYWNfY2hhbm5lbHNfcGNtOworCXU4IGRhY19jaGFubmVsc19taXhlcjsKIAl1OCBkYWNfdm9sdW1lX21pbjsKIAl1OCBkYWNfdm9sdW1lX21heDsKIAl1OCBtaXNjX2ZsYWdzOwogCXU4IGZ1bmN0aW9uX2ZsYWdzOworCXU4IGRhY19tY2xrczsKKwl1OCBhZGNfbWNsa3M7CiAJdTE2IGRhY19pMnNfZm9ybWF0OwogCXUxNiBhZGNfaTJzX2Zvcm1hdDsKIH07CkBAIC0xMjEsNyArMTI5LDYgQEAKIAl1OCBwY21fcnVubmluZzsKIAl1OCBkYWNfcm91dGluZzsKIAl1OCBzcGRpZl9wbGF5YmFja19lbmFibGU7Ci0JdTggcmV2aXNpb247CiAJdTggaGFzX2FjOTdfMDsKIAl1OCBoYXNfYWM5N18xOwogCXUzMiBzcGRpZl9iaXRzOwpAQCAtMTY3LDggKzE3NCw2IEBACiAvKiBveHlnZW5fcGNtLmMgKi8KIAogaW50IG94eWdlbl9wY21faW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKTsKLXVuc2lnbmVkIGludCBveHlnZW5fZGVmYXVsdF9pMnNfbWNsayhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKTsKIAogLyogb3h5Z2VuX2lvLmMgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYyBiL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX2lvLmMKaW5kZXggMDliMmIyYS4uZjUxNjRiMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5faW8uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9pby5jCkBAIC0xOTcsMTEgKzE5NywxMSBAQAogewogCXVuc2lnbmVkIGludCBjb3VudDsKIAotCS8qIHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gNy42OCB1cyAoMjQgKiAzMjAgbnMpICovCisJLyogc2hvdWxkIG5vdCBuZWVkIG1vcmUgdGhhbiAzMC43MiB1cyAoMjQgKiAxLjI4IHVzKSAqLwogCWNvdW50ID0gMTA7CiAJd2hpbGUgKChveHlnZW5fcmVhZDgoY2hpcCwgT1hZR0VOX1NQSV9DT05UUk9MKSAmIE9YWUdFTl9TUElfQlVTWSkKIAkgICAgICAgJiYgY291bnQgPiAwKSB7Ci0JCXVkZWxheSgxKTsKKwkJdWRlbGF5KDQpOwogCQktLWNvdW50OwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fbGliLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwppbmRleCBlNWViZTU2Li43MGI3Mzk4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9saWIuYwpAQCAtMjAyLDcgKzIwMiwxMyBAQAogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwogCWludCBpLCBqOwogCi0Jc25kX2lwcmludGYoYnVmZmVyLCAiQ01JODc4OFxuXG4iKTsKKwlzd2l0Y2ggKG94eWdlbl9yZWFkOChjaGlwLCBPWFlHRU5fUkVWSVNJT04pICYgT1hZR0VOX1BBQ0tBR0VfSURfTUFTSykgeworCWNhc2UgT1hZR0VOX1BBQ0tBR0VfSURfODc4NjogaSA9ICc2JzsgYnJlYWs7CisJY2FzZSBPWFlHRU5fUEFDS0FHRV9JRF84Nzg3OiBpID0gJzcnOyBicmVhazsKKwljYXNlIE9YWUdFTl9QQUNLQUdFX0lEXzg3ODg6IGkgPSAnOCc7IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgaSA9ICc/JzsgYnJlYWs7CisJfQorCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkNNSTg3OCVjOlxuIiwgaSk7CiAJZm9yIChpID0gMDsgaSA8IE9YWUdFTl9JT19TSVpFOyBpICs9IDB4MTApIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeDoiLCBpKTsKIAkJZm9yIChqID0gMDsgaiA8IDB4MTA7ICsraikKQEAgLTIxMiw3ICsyMTgsNyBAQAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNoaXAtPm11dGV4KSA8IDApCiAJCXJldHVybjsKIAlpZiAoY2hpcC0+aGFzX2FjOTdfMCkgewotCQlzbmRfaXByaW50ZihidWZmZXIsICJcbkFDOTdcbiIpOworCQlzbmRfaXByaW50ZihidWZmZXIsICJcbkFDOTc6XG4iKTsKIAkJZm9yIChpID0gMDsgaSA8IDB4ODA7IGkgKz0gMHgxMCkgewogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTAyeDoiLCBpKTsKIAkJCWZvciAoaiA9IDA7IGogPCAweDEwOyBqICs9IDIpCkBAIC0yMjIsNyArMjI4LDcgQEAKIAkJfQogCX0KIAlpZiAoY2hpcC0+aGFzX2FjOTdfMSkgewotCQlzbmRfaXByaW50ZihidWZmZXIsICJcbkFDOTcgMlxuIik7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQUM5NyAyOlxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCAweDgwOyBpICs9IDB4MTApIHsKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMng6IiwgaSk7CiAJCQlmb3IgKGogPSAwOyBqIDwgMHgxMDsgaiArPSAyKQpAQCAtMjMyLDEzICsyMzgsMTUgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlpZiAoY2hpcC0+bW9kZWwuZHVtcF9yZWdpc3RlcnMpCisJCWNoaXAtPm1vZGVsLmR1bXBfcmVnaXN0ZXJzKGNoaXAsIGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIG94eWdlbl9wcm9jX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCi0JaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAiY21pODc4OCIsICZlbnRyeSkpCisJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAib3h5Z2VuIiwgJmVudHJ5KSkKIAkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBveHlnZW5fcHJvY19yZWFkKTsKIH0KICNlbHNlCkBAIC0yNjIsNyArMjcwLDcgQEAKIAkgKi8KIAlzdWJkZXZpY2UgPSBveHlnZW5fcmVhZF9lZXByb20oY2hpcCwgMik7CiAJLyogdXNlIGRlZmF1bHQgSUQgaWYgRUVQUk9NIGlzIG1pc3NpbmcgKi8KLQlpZiAoc3ViZGV2aWNlID09IDB4ZmZmZikKKwlpZiAoc3ViZGV2aWNlID09IDB4ZmZmZiAmJiBveHlnZW5fcmVhZF9lZXByb20oY2hpcCwgMSkgPT0gMHhmZmZmKQogCQlzdWJkZXZpY2UgPSAweDg3ODg7CiAJLyoKIAkgKiBXZSB1c2Ugb25seSB0aGUgc3Vic3lzdGVtIGRldmljZSBJRCBmb3Igc2VhcmNoaW5nIGJlY2F1c2UgaXQgaXMKQEAgLTM2NCwxMiArMzcyLDcgQEAKIAkJKElFQzk1OF9BRVMxX0NPTl9QQ01fQ09ERVIgPDwgT1hZR0VOX1NQRElGX0NBVEVHT1JZX1NISUZUKTsKIAljaGlwLT5zcGRpZl9wY21fYml0cyA9IGNoaXAtPnNwZGlmX2JpdHM7CiAKLQlpZiAob3h5Z2VuX3JlYWQ4KGNoaXAsIE9YWUdFTl9SRVZJU0lPTikgJiBPWFlHRU5fUkVWSVNJT05fMikKLQkJY2hpcC0+cmV2aXNpb24gPSAyOwotCWVsc2UKLQkJY2hpcC0+cmV2aXNpb24gPSAxOwotCi0JaWYgKGNoaXAtPnJldmlzaW9uID09IDEpCisJaWYgKCEob3h5Z2VuX3JlYWQ4KGNoaXAsIE9YWUdFTl9SRVZJU0lPTikgJiBPWFlHRU5fUkVWSVNJT05fMikpCiAJCW94eWdlbl9zZXRfYml0czgoY2hpcCwgT1hZR0VOX01JU0MsCiAJCQkJIE9YWUdFTl9NSVNDX1BDSV9NRU1fV18xX0NMT0NLKTsKIApAQCAtNDA2LDI4ICs0MDksNDAgQEAKIAkJICAgICAgKE9YWUdFTl9GT1JNQVRfMTYgPDwgT1hZR0VOX01VTFRJQ0hfRk9STUFUX1NISUZUKSk7CiAJb3h5Z2VuX3dyaXRlOChjaGlwLCBPWFlHRU5fUkVDX0NIQU5ORUxTLCBPWFlHRU5fUkVDX0NIQU5ORUxTXzJfMl8yKTsKIAlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX01VTFRJQ0hfRk9STUFULAotCQkgICAgICAgT1hZR0VOX1JBVEVfNDgwMDAgfCBjaGlwLT5tb2RlbC5kYWNfaTJzX2Zvcm1hdCB8Ci0JCSAgICAgICBPWFlHRU5fSTJTX01DTEtfMjU2IHwgT1hZR0VOX0kyU19CSVRTXzE2IHwKLQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwgT1hZR0VOX0kyU19CQ0xLXzY0KTsKKwkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwKKwkJICAgICAgIGNoaXAtPm1vZGVsLmRhY19pMnNfZm9ybWF0IHwKKwkJICAgICAgIE9YWUdFTl9JMlNfTUNMSyhjaGlwLT5tb2RlbC5kYWNfbWNsa3MpIHwKKwkJICAgICAgIE9YWUdFTl9JMlNfQklUU18xNiB8CisJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8CisJCSAgICAgICBPWFlHRU5fSTJTX0JDTEtfNjQpOwogCWlmIChjaGlwLT5tb2RlbC5kZXZpY2VfY29uZmlnICYgQ0FQVFVSRV8wX0ZST01fSTJTXzEpCiAJCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9JMlNfQV9GT1JNQVQsCi0JCQkgICAgICAgT1hZR0VOX1JBVEVfNDgwMDAgfCBjaGlwLT5tb2RlbC5hZGNfaTJzX2Zvcm1hdCB8Ci0JCQkgICAgICAgT1hZR0VOX0kyU19NQ0xLXzI1NiB8IE9YWUdFTl9JMlNfQklUU18xNiB8Ci0JCQkgICAgICAgT1hZR0VOX0kyU19NQVNURVIgfCBPWFlHRU5fSTJTX0JDTEtfNjQpOworCQkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwKKwkJCSAgICAgICBjaGlwLT5tb2RlbC5hZGNfaTJzX2Zvcm1hdCB8CisJCQkgICAgICAgT1hZR0VOX0kyU19NQ0xLKGNoaXAtPm1vZGVsLmFkY19tY2xrcykgfAorCQkJICAgICAgIE9YWUdFTl9JMlNfQklUU18xNiB8CisJCQkgICAgICAgT1hZR0VOX0kyU19NQVNURVIgfAorCQkJICAgICAgIE9YWUdFTl9JMlNfQkNMS182NCk7CiAJZWxzZQogCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX0FfRk9STUFULAotCQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwgT1hZR0VOX0kyU19NVVRFX01DTEspOworCQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwKKwkJCSAgICAgICBPWFlHRU5fSTJTX01VVEVfTUNMSyk7CiAJaWYgKGNoaXAtPm1vZGVsLmRldmljZV9jb25maWcgJiAoQ0FQVFVSRV8wX0ZST01fSTJTXzIgfAogCQkJCQkgQ0FQVFVSRV8yX0ZST01fSTJTXzIpKQogCQlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fSTJTX0JfRk9STUFULAotCQkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwgY2hpcC0+bW9kZWwuYWRjX2kyc19mb3JtYXQgfAotCQkJICAgICAgIE9YWUdFTl9JMlNfTUNMS18yNTYgfCBPWFlHRU5fSTJTX0JJVFNfMTYgfAotCQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwgT1hZR0VOX0kyU19CQ0xLXzY0KTsKKwkJCSAgICAgICBPWFlHRU5fUkFURV80ODAwMCB8CisJCQkgICAgICAgY2hpcC0+bW9kZWwuYWRjX2kyc19mb3JtYXQgfAorCQkJICAgICAgIE9YWUdFTl9JMlNfTUNMSyhjaGlwLT5tb2RlbC5hZGNfbWNsa3MpIHwKKwkJCSAgICAgICBPWFlHRU5fSTJTX0JJVFNfMTYgfAorCQkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwKKwkJCSAgICAgICBPWFlHRU5fSTJTX0JDTEtfNjQpOwogCWVsc2UKIAkJb3h5Z2VuX3dyaXRlMTYoY2hpcCwgT1hZR0VOX0kyU19CX0ZPUk1BVCwKLQkJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8IE9YWUdFTl9JMlNfTVVURV9NQ0xLKTsKKwkJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8CisJCQkgICAgICAgT1hZR0VOX0kyU19NVVRFX01DTEspOwogCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9JMlNfQ19GT1JNQVQsCi0JCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8IE9YWUdFTl9JMlNfTVVURV9NQ0xLKTsKKwkJICAgICAgIE9YWUdFTl9JMlNfTUFTVEVSIHwKKwkJICAgICAgIE9YWUdFTl9JMlNfTVVURV9NQ0xLKTsKIAlveHlnZW5fY2xlYXJfYml0czMyKGNoaXAsIE9YWUdFTl9TUERJRl9DT05UUk9MLAogCQkJICAgIE9YWUdFTl9TUERJRl9PVVRfRU5BQkxFIHwKIAkJCSAgICBPWFlHRU5fU1BESUZfTE9PUEJBQ0spOwpAQCAtNTU3LDcgKzU3Miw4IEBACiAJb3h5Z2VuX3NodXRkb3duKGNoaXApOwogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtfc3luYygmY2hpcC0+c3BkaWZfaW5wdXRfYml0c193b3JrKTsKKwlmbHVzaF93b3JrX3N5bmMoJmNoaXAtPmdwaW9fd29yayk7CiAJY2hpcC0+bW9kZWwuY2xlYW51cChjaGlwKTsKIAlrZnJlZShjaGlwLT5tb2RlbF9kYXRhKTsKIAltdXRleF9kZXN0cm95KCZjaGlwLT5tdXRleCk7CkBAIC02NDgsOCArNjY0LDggQEAKIAogCXN0cmNweShjYXJkLT5kcml2ZXIsIGNoaXAtPm1vZGVsLmNoaXApOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIGNoaXAtPm1vZGVsLnNob3J0bmFtZSk7Ci0Jc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIChyZXYgJXUpIGF0ICUjbHgsIGlycSAlaSIsCi0JCWNoaXAtPm1vZGVsLmxvbmduYW1lLCBjaGlwLT5yZXZpc2lvbiwgY2hpcC0+YWRkciwgY2hpcC0+aXJxKTsKKwlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgJSNseCwgaXJxICVpIiwKKwkJY2hpcC0+bW9kZWwubG9uZ25hbWUsIGNoaXAtPmFkZHIsIGNoaXAtPmlycSk7CiAJc3RyY3B5KGNhcmQtPm1peGVybmFtZSwgY2hpcC0+bW9kZWwuY2hpcCk7CiAJc25kX2NvbXBvbmVudF9hZGQoY2FyZCwgY2hpcC0+bW9kZWwuY2hpcCk7CiAKQEAgLTczMyw3ICs3NDksOCBAQAogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCiAJc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlmbHVzaF93b3JrX3N5bmMoJmNoaXAtPnNwZGlmX2lucHV0X2JpdHNfd29yayk7CisJZmx1c2hfd29ya19zeW5jKCZjaGlwLT5ncGlvX3dvcmspOwogCWNoaXAtPmludGVycnVwdF9tYXNrID0gc2F2ZWRfaW50ZXJydXB0X21hc2s7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX21peGVyLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9taXhlci5jCmluZGV4IDI4NDliMzYuLjliZmYxNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX21peGVyLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fbWl4ZXIuYwpAQCAtMzEsNyArMzEsNyBAQAogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKIAogCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JaW5mby0+Y291bnQgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHM7CisJaW5mby0+Y291bnQgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXI7CiAJaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSBjaGlwLT5tb2RlbC5kYWNfdm9sdW1lX21pbjsKIAlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IGNoaXAtPm1vZGVsLmRhY192b2x1bWVfbWF4OwogCXJldHVybiAwOwpAQCAtNDQsNyArNDQsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHM7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX21peGVyOyArK2kpCiAJCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gY2hpcC0+ZGFjX3ZvbHVtZVtpXTsKIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKQEAgLTU5LDcgKzU5LDcgQEAKIAogCWNoYW5nZWQgPSAwOwogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IGNoaXAtPm1vZGVsLmRhY19jaGFubmVsc19taXhlcjsgKytpKQogCQlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gIT0gY2hpcC0+ZGFjX3ZvbHVtZVtpXSkgewogCQkJY2hpcC0+ZGFjX3ZvbHVtZVtpXSA9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldOwogCQkJY2hhbmdlZCA9IDE7CkBAIC05Nyw2ICs5NywxNiBAQAogCXJldHVybiBjaGFuZ2VkOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IHVwbWl4X2l0ZW1fY291bnQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX3BjbSA8IDgpCisJCXJldHVybiAyOworCWVsc2UgaWYgKGNoaXAtPm1vZGVsLnVwZGF0ZV9jZW50ZXJfbGZlX21peCkKKwkJcmV0dXJuIDU7CisJZWxzZQorCQlyZXR1cm4gMzsKK30KKwogc3RhdGljIGludCB1cG1peF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1s1XSA9IHsKQEAgLTEwNywxNSArMTE3LDkgQEAKIAkJIkZyb250K1N1cnJvdW5kK0NlbnRlci9MRkUrQmFjayIsCiAJfTsKIAlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gY2hpcC0+bW9kZWwudXBkYXRlX2NlbnRlcl9sZmVfbWl4ID8gNSA6IDM7CisJdW5zaWduZWQgaW50IGNvdW50ID0gdXBtaXhfaXRlbV9jb3VudChjaGlwKTsKIAotCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JaW5mby0+Y291bnQgPSAxOwotCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBjb3VudDsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IGNvdW50KQotCQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBjb3VudCAtIDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIGNvdW50LCBuYW1lcyk7CiB9CiAKIHN0YXRpYyBpbnQgdXBtaXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCkBAIC0xODgsNyArMTkyLDcgQEAKIHN0YXRpYyBpbnQgdXBtaXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCiB7CiAJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBjb3VudCA9IGNoaXAtPm1vZGVsLnVwZGF0ZV9jZW50ZXJfbGZlX21peCA/IDUgOiAzOworCXVuc2lnbmVkIGludCBjb3VudCA9IHVwbWl4X2l0ZW1fY291bnQoY2hpcCk7CiAJaW50IGNoYW5nZWQ7CiAKIAlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+PSBjb3VudCkKQEAgLTQzMCwzMCArNDM0LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3BkaWZfbG9vcGJhY2tfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQorc3RhdGljIGludCBzcGRpZl9iaXRfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCiB7CiAJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXUzMiBiaXQgPSBjdGwtPnByaXZhdGVfdmFsdWU7CiAKIAl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCSEhKG94eWdlbl9yZWFkMzIoY2hpcCwgT1hZR0VOX1NQRElGX0NPTlRST0wpCi0JCSAgICYgT1hZR0VOX1NQRElGX0xPT1BCQUNLKTsKKwkJISEob3h5Z2VuX3JlYWQzMihjaGlwLCBPWFlHRU5fU1BESUZfQ09OVFJPTCkgJiBiaXQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNwZGlmX2xvb3BiYWNrX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3N0YXRpYyBpbnQgc3BkaWZfYml0X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQogewogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwl1MzIgYml0ID0gY3RsLT5wcml2YXRlX3ZhbHVlOwogCXUzMiBvbGRyZWcsIG5ld3JlZzsKIAlpbnQgY2hhbmdlZDsKIAogCXNwaW5fbG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKIAlvbGRyZWcgPSBveHlnZW5fcmVhZDMyKGNoaXAsIE9YWUdFTl9TUERJRl9DT05UUk9MKTsKIAlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCi0JCW5ld3JlZyA9IG9sZHJlZyB8IE9YWUdFTl9TUERJRl9MT09QQkFDSzsKKwkJbmV3cmVnID0gb2xkcmVnIHwgYml0OwogCWVsc2UKLQkJbmV3cmVnID0gb2xkcmVnICYgfk9YWUdFTl9TUERJRl9MT09QQkFDSzsKKwkJbmV3cmVnID0gb2xkcmVnICYgfmJpdDsKIAljaGFuZ2VkID0gbmV3cmVnICE9IG9sZHJlZzsKIAlpZiAoY2hhbmdlZCkKIAkJb3h5Z2VuX3dyaXRlMzIoY2hpcCwgT1hZR0VOX1NQRElGX0NPTlRST0wsIG5ld3JlZyk7CkBAIC02NDQsNiArNjQ5LDQ2IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorc3RhdGljIGludCBtaWNfZm1pY19zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7ICJNaWMgSmFjayIsICJGcm9udCBQYW5lbCIgfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAyLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgbWljX2ZtaWNfc291cmNlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkhIShveHlnZW5fcmVhZF9hYzk3KGNoaXAsIDAsIENNOTc4MF9KQUNLKSAmIENNOTc4MF9GTUlDMk1JQyk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWljX2ZtaWNfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXUxNiBvbGRyZWcsIG5ld3JlZzsKKwlpbnQgY2hhbmdlOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCW9sZHJlZyA9IG94eWdlbl9yZWFkX2FjOTcoY2hpcCwgMCwgQ005NzgwX0pBQ0spOworCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKQorCQluZXdyZWcgPSBvbGRyZWcgfCBDTTk3ODBfRk1JQzJNSUM7CisJZWxzZQorCQluZXdyZWcgPSBvbGRyZWcgJiB+Q005NzgwX0ZNSUMyTUlDOworCWNoYW5nZSA9IG5ld3JlZyAhPSBvbGRyZWc7CisJaWYgKGNoYW5nZSkKKwkJb3h5Z2VuX3dyaXRlX2FjOTcoY2hpcCwgMCwgQ005NzgwX0pBQ0ssIG5ld3JlZyk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIGNoYW5nZTsKK30KKwogc3RhdGljIGludCBhYzk3X2ZwX3JlY192b2x1bWVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCiAJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQogewpAQCAtNzkxLDggKzgzNiwxNyBAQAogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIkxvb3BiYWNrICIsIE5PTkUsIFNXSVRDSCksCiAJCS5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbywKLQkJLmdldCA9IHNwZGlmX2xvb3BiYWNrX2dldCwKLQkJLnB1dCA9IHNwZGlmX2xvb3BiYWNrX3B1dCwKKwkJLmdldCA9IHNwZGlmX2JpdF9zd2l0Y2hfZ2V0LAorCQkucHV0ID0gc3BkaWZfYml0X3N3aXRjaF9wdXQsCisJCS5wcml2YXRlX3ZhbHVlID0gT1hZR0VOX1NQRElGX0xPT1BCQUNLLAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIlZhbGlkaXR5IENoZWNrICIsQ0FQVFVSRSxTV0lUQ0gpLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSBzcGRpZl9iaXRfc3dpdGNoX2dldCwKKwkJLnB1dCA9IHNwZGlmX2JpdF9zd2l0Y2hfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IE9YWUdFTl9TUERJRl9TUERWQUxJRCwKIAl9LAogfTsKIApAQCAtOTA4LDYgKzk2MiwxMyBAQAogCUFDOTdfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAwLCBBQzk3X01JQywgMCksCiAJQUM5N19TV0lUQ0goIk1pYyBDYXB0dXJlIFN3aXRjaCIsIDAsIEFDOTdfTUlDLCAxNSwgMSksCiAJQUM5N19TV0lUQ0goIk1pYyBCb29zdCAoKzIwZEIpIiwgMCwgQUM5N19NSUMsIDYsIDApLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIk1pYyBTb3VyY2UgQ2FwdHVyZSBFbnVtIiwKKwkJLmluZm8gPSBtaWNfZm1pY19zb3VyY2VfaW5mbywKKwkJLmdldCA9IG1pY19mbWljX3NvdXJjZV9nZXQsCisJCS5wdXQgPSBtaWNfZm1pY19zb3VyY2VfcHV0LAorCX0sCiAJQUM5N19TV0lUQ0goIkxpbmUgQ2FwdHVyZSBTd2l0Y2giLCAwLCBBQzk3X0xJTkUsIDE1LCAxKSwKIAlBQzk3X1ZPTFVNRSgiQ0QgQ2FwdHVyZSBWb2x1bWUiLCAwLCBBQzk3X0NELCAxKSwKIAlBQzk3X1NXSVRDSCgiQ0QgQ2FwdHVyZSBTd2l0Y2giLCAwLCBBQzk3X0NELCAxNSwgMSksCkBAIC05NzAsNyArMTAzMSwxMCBAQAogCQkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghc3RyY21wKHRlbXBsYXRlLm5hbWUsICJTdGVyZW8gVXBtaXhpbmciKSAmJgotCQkgICAgY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzID09IDIpCisJCSAgICBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfcGNtID09IDIpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJjbXAodGVtcGxhdGUubmFtZSwgIk1pYyBTb3VyY2UgQ2FwdHVyZSBFbnVtIikgJiYKKwkJICAgICEoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIEFDOTdfRk1JQ19TV0lUQ0gpKQogCQkJY29udGludWU7CiAJCWlmICghc3RybmNtcCh0ZW1wbGF0ZS5uYW1lLCAiQ0QgQ2FwdHVyZSAiLCAxMSkgJiYKIAkJICAgICEoY2hpcC0+bW9kZWwuZGV2aWNlX2NvbmZpZyAmIEFDOTdfQ0RfSU5QVVQpKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwppbmRleCA4MTQ2Njc0Li5kNTUzM2UzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwpAQCAtMzksNyArMzksOCBAQAogCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKIAkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAogCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCVNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQsCisJCVNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQgfAorCQlTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQLAogCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAogCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKIAkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CkBAIC02NSw3ICs2Niw4IEBACiAJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAogCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CiAJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCwKKwkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCVNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAsCiAJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CiAJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAogCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKQEAgLTkxLDcgKzkzLDggQEAKIAkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CiAJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQlTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJULAorCQlTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKKwkJU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCwKIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAogCS5yYXRlX21pbiA9IDQ4MDAwLApAQCAtMTQwLDcgKzE0Myw3IEBACiAJCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gNDQxMDA7CiAJCWJyZWFrOwogCWNhc2UgUENNX01VTFRJQ0g6Ci0JCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGNoaXAtPm1vZGVsLmRhY19jaGFubmVsczsKKwkJcnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gY2hpcC0+bW9kZWwuZGFjX2NoYW5uZWxzX3BjbTsKIAkJYnJlYWs7CiAJfQogCWlmIChjaGlwLT5tb2RlbC5wY21faGFyZHdhcmVfZmlsdGVyKQpAQCAtMjcxLDE3ICsyNzQsNiBAQAogCX0KIH0KIAotdW5zaWduZWQgaW50IG94eWdlbl9kZWZhdWx0X2kyc19tY2xrKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQotewotCWlmIChwYXJhbXNfcmF0ZShod19wYXJhbXMpIDw9IDk2MDAwKQotCQlyZXR1cm4gT1hZR0VOX0kyU19NQ0xLXzI1NjsKLQllbHNlCi0JCXJldHVybiBPWFlHRU5fSTJTX01DTEtfMTI4OwotfQotRVhQT1JUX1NZTUJPTChveHlnZW5fZGVmYXVsdF9pMnNfbWNsayk7Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgb3h5Z2VuX2kyc19iaXRzKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewogCWlmIChwYXJhbXNfZm9ybWF0KGh3X3BhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCkBAIC0zNDEsNiArMzMzLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1MTYgZ2V0X21jbGsoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwl1bnNpZ25lZCBpbnQgbWNsa3MsIHNoaWZ0OworCisJaWYgKGNoYW5uZWwgPT0gUENNX01VTFRJQ0gpCisJCW1jbGtzID0gY2hpcC0+bW9kZWwuZGFjX21jbGtzOworCWVsc2UKKwkJbWNsa3MgPSBjaGlwLT5tb2RlbC5hZGNfbWNsa3M7CisKKwlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSA0ODAwMCkKKwkJc2hpZnQgPSAwOworCWVsc2UgaWYgKHBhcmFtc19yYXRlKHBhcmFtcykgPD0gOTYwMDApCisJCXNoaWZ0ID0gMjsKKwllbHNlCisJCXNoaWZ0ID0gNDsKKworCXJldHVybiBPWFlHRU5fSTJTX01DTEsobWNsa3MgPj4gc2hpZnQpOworfQorCiBzdGF0aWMgaW50IG94eWdlbl9yZWNfYV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKQEAgLTM1Nyw4ICszNjksOCBAQAogCQkJICAgICBPWFlHRU5fUkVDX0ZPUk1BVF9BX01BU0spOwogCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fSTJTX0FfRk9STUFULAogCQkJICAgICAgb3h5Z2VuX3JhdGUoaHdfcGFyYW1zKSB8Ci0JCQkgICAgICBjaGlwLT5tb2RlbC5nZXRfaTJzX21jbGsoY2hpcCwgUENNX0EsIGh3X3BhcmFtcykgfAogCQkJICAgICAgY2hpcC0+bW9kZWwuYWRjX2kyc19mb3JtYXQgfAorCQkJICAgICAgZ2V0X21jbGsoY2hpcCwgUENNX0EsIGh3X3BhcmFtcykgfAogCQkJICAgICAgb3h5Z2VuX2kyc19iaXRzKGh3X3BhcmFtcyksCiAJCQkgICAgICBPWFlHRU5fSTJTX1JBVEVfTUFTSyB8CiAJCQkgICAgICBPWFlHRU5fSTJTX0ZPUk1BVF9NQVNLIHwKQEAgLTM5Myw5ICs0MDUsOCBAQAogCWlmICghaXNfYWM5NykKIAkJb3h5Z2VuX3dyaXRlMTZfbWFza2VkKGNoaXAsIE9YWUdFTl9JMlNfQl9GT1JNQVQsCiAJCQkJICAgICAgb3h5Z2VuX3JhdGUoaHdfcGFyYW1zKSB8Ci0JCQkJICAgICAgY2hpcC0+bW9kZWwuZ2V0X2kyc19tY2xrKGNoaXAsIFBDTV9CLAotCQkJCQkJCSAgICAgICBod19wYXJhbXMpIHwKIAkJCQkgICAgICBjaGlwLT5tb2RlbC5hZGNfaTJzX2Zvcm1hdCB8CisJCQkJICAgICAgZ2V0X21jbGsoY2hpcCwgUENNX0IsIGh3X3BhcmFtcykgfAogCQkJCSAgICAgIG94eWdlbl9pMnNfYml0cyhod19wYXJhbXMpLAogCQkJCSAgICAgIE9YWUdFTl9JMlNfUkFURV9NQVNLIHwKIAkJCQkgICAgICBPWFlHRU5fSTJTX0ZPUk1BVF9NQVNLIHwKQEAgLTQ3Niw4ICs0ODcsNyBAQAogCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fSTJTX01VTFRJQ0hfRk9STUFULAogCQkJICAgICAgb3h5Z2VuX3JhdGUoaHdfcGFyYW1zKSB8CiAJCQkgICAgICBjaGlwLT5tb2RlbC5kYWNfaTJzX2Zvcm1hdCB8Ci0JCQkgICAgICBjaGlwLT5tb2RlbC5nZXRfaTJzX21jbGsoY2hpcCwgUENNX01VTFRJQ0gsCi0JCQkJCQkgICAgICAgaHdfcGFyYW1zKSB8CisJCQkgICAgICBnZXRfbWNsayhjaGlwLCBQQ01fTVVMVElDSCwgaHdfcGFyYW1zKSB8CiAJCQkgICAgICBveHlnZW5faTJzX2JpdHMoaHdfcGFyYW1zKSwKIAkJCSAgICAgIE9YWUdFTl9JMlNfUkFURV9NQVNLIHwKIAkJCSAgICAgIE9YWUdFTl9JMlNfRk9STUFUX01BU0sgfApAQCAtNTMwLDcgKzU0MCwxMCBAQAogCW94eWdlbl9zZXRfYml0czgoY2hpcCwgT1hZR0VOX0RNQV9GTFVTSCwgY2hhbm5lbF9tYXNrKTsKIAlveHlnZW5fY2xlYXJfYml0czgoY2hpcCwgT1hZR0VOX0RNQV9GTFVTSCwgY2hhbm5lbF9tYXNrKTsKIAotCWNoaXAtPmludGVycnVwdF9tYXNrIHw9IGNoYW5uZWxfbWFzazsKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5ub19wZXJpb2Rfd2FrZXVwKQorCQljaGlwLT5pbnRlcnJ1cHRfbWFzayAmPSB+Y2hhbm5lbF9tYXNrOworCWVsc2UKKwkJY2hpcC0+aW50ZXJydXB0X21hc2sgfD0gY2hhbm5lbF9tYXNrOwogCW94eWdlbl93cml0ZTE2KGNoaXAsIE9YWUdFTl9JTlRFUlJVUFRfTUFTSywgY2hpcC0+aW50ZXJydXB0X21hc2spOwogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcmVncy5oIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fcmVncy5oCmluZGV4IDRkY2Q0MWIuLjYzZGM3YTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3JlZ3MuaAorKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9yZWdzLmgKQEAgLTEzOSw5ICsxMzksMTEgQEAKICNkZWZpbmUgIE9YWUdFTl9JMlNfRk9STUFUX0kyUwkJMHgwMDAwCiAjZGVmaW5lICBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVAkweDAwMDgKICNkZWZpbmUgIE9YWUdFTl9JMlNfTUNMS19NQVNLCQkweDAwMzAJLyogTUNMSy9MUkNLICovCi0jZGVmaW5lICBPWFlHRU5fSTJTX01DTEtfMTI4CQkweDAwMDAKLSNkZWZpbmUgIE9YWUdFTl9JMlNfTUNMS18yNTYJCTB4MDAxMAotI2RlZmluZSAgT1hZR0VOX0kyU19NQ0xLXzUxMgkJMHgwMDIwCisjZGVmaW5lICBPWFlHRU5fSTJTX01DTEtfU0hJRlQJCTQKKyNkZWZpbmUgIE1DTEtfMTI4CQkJMAorI2RlZmluZSAgTUNMS18yNTYJCQkxCisjZGVmaW5lICBNQ0xLXzUxMgkJCTIKKyNkZWZpbmUgIE9YWUdFTl9JMlNfTUNMSyhmKQkJKCgoZikgJiAzKSA8PCBPWFlHRU5fSTJTX01DTEtfU0hJRlQpCiAjZGVmaW5lICBPWFlHRU5fSTJTX0JJVFNfTUFTSwkJMHgwMGMwCiAjZGVmaW5lICBPWFlHRU5fSTJTX0JJVFNfMTYJCTB4MDAwMAogI2RlZmluZSAgT1hZR0VOX0kyU19CSVRTXzIwCQkweDAwNDAKQEAgLTIzOCwxMSArMjQwLDExIEBACiAjZGVmaW5lICBPWFlHRU5fU1BJX0RBVEFfTEVOR1RIX01BU0sJMHgwMgogI2RlZmluZSAgT1hZR0VOX1NQSV9EQVRBX0xFTkdUSF8yCTB4MDAKICNkZWZpbmUgIE9YWUdFTl9TUElfREFUQV9MRU5HVEhfMwkweDAyCi0jZGVmaW5lICBPWFlHRU5fU1BJX0NMT0NLX01BU0sJCTB4YzAKKyNkZWZpbmUgIE9YWUdFTl9TUElfQ0xPQ0tfTUFTSwkJMHgwYwogI2RlZmluZSAgT1hZR0VOX1NQSV9DTE9DS18xNjAJCTB4MDAJLyogbnMgKi8KLSNkZWZpbmUgIE9YWUdFTl9TUElfQ0xPQ0tfMzIwCQkweDQwCi0jZGVmaW5lICBPWFlHRU5fU1BJX0NMT0NLXzY0MAkJMHg4MAotI2RlZmluZSAgT1hZR0VOX1NQSV9DTE9DS18xMjgwCQkweGMwCisjZGVmaW5lICBPWFlHRU5fU1BJX0NMT0NLXzMyMAkJMHgwNAorI2RlZmluZSAgT1hZR0VOX1NQSV9DTE9DS182NDAJCTB4MDgKKyNkZWZpbmUgIE9YWUdFTl9TUElfQ0xPQ0tfMTI4MAkJMHgwYwogI2RlZmluZSAgT1hZR0VOX1NQSV9DT0RFQ19NQVNLCQkweDcwCS8qIDAuLjUgKi8KICNkZWZpbmUgIE9YWUdFTl9TUElfQ09ERUNfU0hJRlQJCTQKICNkZWZpbmUgIE9YWUdFTl9TUElfQ0VOX01BU0sJCTB4ODAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXIuaCBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXIuaAppbmRleCBiMzUzNDNiLi4wNDM0YzIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyLmgKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hci5oCkBAIC0yNCw2ICsyNCw4IEBACiB2b2lkIHhvbmFyX2luaXRfY3M1M3gxKHN0cnVjdCBveHlnZW4gKmNoaXApOwogdm9pZCB4b25hcl9zZXRfY3M1M3gxX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CisKKyNkZWZpbmUgWE9OQVJfR1BJT19CSVRfSU5WRVJUCSgxIDw8IDE2KQogaW50IHhvbmFyX2dwaW9fYml0X3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAogCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpOwogaW50IHhvbmFyX2dwaW9fYml0X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9jczQzeHguYyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfY3M0M3h4LmMKaW5kZXggYWEyN2MzMTAuLjlmNzJkNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfY3M0M3h4LmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9jczQzeHguYwpAQCAtMjIsMjkgKzIyLDI4IEBACiAgKgogICogQ01JODc4ODoKICAqCi0gKiBJwrJDIDwtPiBDUzQzOTggKGZyb250KQotICogICAgIDwtPiBDUzQzNjJBIChzdXJyb3VuZCwgY2VudGVyL0xGRSwgYmFjaykKKyAqICAgScKyQyA8LT4gQ1M0Mzk4IChhZGRyIDEwMDExMTEpIChmcm9udCkKKyAqICAgICAgIDwtPiBDUzQzNjJBIChhZGRyIDAwMTEwMDApIChzdXJyb3VuZCwgY2VudGVyL0xGRSwgYmFjaykKICAqCi0gKiBHUEkgMCA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50IChEWCBvbmx5KQorICogICBHUEkgMCA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50IChEWCBvbmx5KQogICoKLSAqIEdQSU8gMCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCi0gKiBHUElPIDEgLT4gZW5hYmxlIGZyb250IHBhbmVsIEkvTwotICogR1BJTyAyIC0+IE0wIG9mIENTNTM2MQotICogR1BJTyAzIC0+IE0xIG9mIENTNTM2MQotICogR1BJTyA4IC0+IHJvdXRlIGlucHV0IGphY2sgdG8gbGluZS1pbiAoMCkgb3IgbWljLWluICgxKQotICoKLSAqIENTNDM5ODoKLSAqCi0gKiBBRDAgPC0gMQotICogQUQxIDwtIDEKLSAqCi0gKiBDUzQzNjJBOgotICoKLSAqIEFEMCA8LSAwCisgKiAgIEdQSU8gMCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCisgKiAgIEdQSU8gMSAtPiByb3V0ZSBvdXRwdXQgdG8gZnJvbnQgcGFuZWwKKyAqICAgR1BJTyAyIC0+IE0wIG9mIENTNTM2MQorICogICBHUElPIDMgLT4gTTEgb2YgQ1M1MzYxCisgKiAgIEdQSU8gNiAtPiA/CisgKiAgIEdQSU8gNyAtPiA/CisgKiAgIEdQSU8gOCAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIGxpbmUtaW4gKDApIG9yIG1pYy1pbiAoMSkKICAqCiAgKiBDTTk3ODA6CiAgKgotICogR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIENTNTM2MSBpbnB1dAorICogICBMSU5FX09VVCAtPiBpbnB1dCBvZiBBREMKKyAqCisgKiAgIEFVWF9JTiAgPC0gYXV4CisgKiAgIE1JQ19JTiAgPC0gbWljCisgKiAgIEZNSUNfSU4gPC0gZnJvbnQgbWljCisgKgorICogICBHUE8gMCAtPiByb3V0ZSBsaW5lLWluICgwKSBvciBBQzk3IG91dHB1dCAoMSkgdG8gQ1M1MzYxIGlucHV0CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtNjMsNiArNjIsNyBAQAogI2RlZmluZSBHUElfRVhUX1BPV0VSCQkweDAxCiAjZGVmaW5lIEdQSU9fRDFfT1VUUFVUX0VOQUJMRQkweDAwMDEKICNkZWZpbmUgR1BJT19EMV9GUk9OVF9QQU5FTAkweDAwMDIKKyNkZWZpbmUgR1BJT19EMV9NQUdJQwkJMHgwMGMwCiAjZGVmaW5lIEdQSU9fRDFfSU5QVVRfUk9VVEUJMHgwMTAwCiAKICNkZWZpbmUgSTJDX0RFVklDRV9DUzQzOTgJMHg5ZQkvKiAxMDAxMSwgQUQxPTEsIEFEMD0xLCAvVz0wICovCkBAIC0xNjksMTIgKzE2OSwxMiBAQAogCWNzNDN4eF9yZWdpc3RlcnNfaW5pdChjaGlwKTsKIAogCW94eWdlbl9zZXRfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsCi0JCQkgIEdQSU9fRDFfRlJPTlRfUEFORUwgfCBHUElPX0QxX0lOUFVUX1JPVVRFKTsKKwkJCSAgR1BJT19EMV9GUk9OVF9QQU5FTCB8CisJCQkgIEdQSU9fRDFfTUFHSUMgfAorCQkJICBHUElPX0QxX0lOUFVUX1JPVVRFKTsKIAlveHlnZW5fY2xlYXJfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEsCiAJCQkgICAgR1BJT19EMV9GUk9OVF9QQU5FTCB8IEdQSU9fRDFfSU5QVVRfUk9VVEUpOwogCi0Jb3h5Z2VuX2FjOTdfc2V0X2JpdHMoY2hpcCwgMCwgQ005NzgwX0pBQ0ssIENNOTc4MF9GTUlDMk1JQyk7Ci0KIAl4b25hcl9pbml0X2NzNTN4MShjaGlwKTsKIAl4b25hcl9lbmFibGVfb3V0cHV0KGNoaXApOwogCkBAIC0yODQsNyArMjg0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGZyb250X3BhbmVsX3N3aXRjaCA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJGcm9udCBQYW5lbCBTd2l0Y2giLAorCS5uYW1lID0gIkZyb250IFBhbmVsIFBsYXliYWNrIFN3aXRjaCIsCiAJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAogCS5nZXQgPSB4b25hcl9ncGlvX2JpdF9zd2l0Y2hfZ2V0LAogCS5wdXQgPSB4b25hcl9ncGlvX2JpdF9zd2l0Y2hfcHV0LApAQCAtMjk4LDEzICsyOTgsNyBAQAogCQkiRmFzdCBSb2xsLW9mZiIsICJTbG93IFJvbGwtb2ZmIgogCX07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDIpCi0JCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDIsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCByb2xsb2ZmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCkBAIC0zODAsNiArMzc0LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfY3M0MzYyYV9yZWdpc3RlcnMoc3RydWN0IHhvbmFyX2NzNDN4eCAqZGF0YSwKKwkJCQkgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbkNTNDM2MkE6Iik7CisJZm9yIChpID0gMTsgaSA8PSAxNDsgKytpKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgJTAyeCIsIGRhdGEtPmNzNDM2MmFfcmVnc1tpXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9kMV9yZWdpc3RlcnMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgeG9uYXJfY3M0M3h4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQ1M0Mzk4OiA3PyIpOworCWZvciAoaSA9IDI7IGkgPD0gODsgKytpKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgJTAyeCIsIGRhdGEtPmNzNDM5OF9yZWdzW2ldKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworCWR1bXBfY3M0MzYyYV9yZWdpc3RlcnMoZGF0YSwgYnVmZmVyKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfeG9uYXJfZDEgPSB7CiAJLmxvbmduYW1lID0gIkFzdXMgVmlydHVvc28gMTAwIiwKIAkuY2hpcCA9ICJBVjIwMCIsCkBAIC0zODgsMjIgKzQwNiwyNiBAQAogCS5jbGVhbnVwID0geG9uYXJfZDFfY2xlYW51cCwKIAkuc3VzcGVuZCA9IHhvbmFyX2QxX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHhvbmFyX2QxX3Jlc3VtZSwKLQkuZ2V0X2kyc19tY2xrID0gb3h5Z2VuX2RlZmF1bHRfaTJzX21jbGssCiAJLnNldF9kYWNfcGFyYW1zID0gc2V0X2NzNDN4eF9wYXJhbXMsCiAJLnNldF9hZGNfcGFyYW1zID0geG9uYXJfc2V0X2NzNTN4MV9wYXJhbXMsCiAJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX2NzNDN4eF92b2x1bWUsCiAJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9jczQzeHhfbXV0ZSwKIAkudXBkYXRlX2NlbnRlcl9sZmVfbWl4ID0gdXBkYXRlX2NzNDN4eF9jZW50ZXJfbGZlX21peCwKIAkuYWM5N19zd2l0Y2ggPSB4b25hcl9kMV9saW5lX21pY19hYzk3X3N3aXRjaCwKKwkuZHVtcF9yZWdpc3RlcnMgPSBkdW1wX2QxX3JlZ2lzdGVycywKIAkuZGFjX3RsdiA9IGNzNDM2MmFfZGJfc2NhbGUsCiAJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeG9uYXJfY3M0M3h4KSwKIAkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKIAkJCSBQTEFZQkFDS18xX1RPX1NQRElGIHwKLQkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMiwKLQkuZGFjX2NoYW5uZWxzID0gOCwKKwkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMiB8CisJCQkgQUM5N19GTUlDX1NXSVRDSCwKKwkuZGFjX2NoYW5uZWxzX3BjbSA9IDgsCisJLmRhY19jaGFubmVsc19taXhlciA9IDgsCiAJLmRhY192b2x1bWVfbWluID0gMTI3IC0gNjAsCiAJLmRhY192b2x1bWVfbWF4ID0gMTI3LAogCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl8yV0lSRSwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMTI4LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCksCiAJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jIGIvc291bmQvcGNpL294eWdlbi94b25hcl9kZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZGUwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmMKQEAgLTAsMCArMSw1NzIgQEAKKy8qCisgKiBjYXJkIGRyaXZlciBmb3IgdGhlIFhvbmFyIERHCisgKgorICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KKyAqCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgZHJpdmVyOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyoKKyAqIFhvbmFyIERHCisgKiAtLS0tLS0tLQorICoKKyAqIENNSTg3ODg6CisgKgorICogICBTUEkgMCAtPiBDUzQyNDUKKyAqCisgKiAgIEdQSU8gMyA8LSA/CisgKiAgIEdQSU8gNCA8LSBoZWFkcGhvbmUgZGV0ZWN0CisgKiAgIEdQSU8gNSAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIGxpbmUtaW4gKDApIG9yIG1pYy1pbiAoMSkKKyAqICAgR1BJTyA2IC0+IHJvdXRlIGlucHV0IGphY2sgdG8gbGluZS1pbiAoMCkgb3IgbWljLWluICgxKQorICogICBHUElPIDcgLT4gZW5hYmxlIHJlYXIgaGVhZHBob25lIGFtcAorICogICBHUElPIDggLT4gZW5hYmxlIG91dHB1dCB0byBzcGVha2VycworICoKKyAqIENTNDI0NToKKyAqCisgKiAgIGlucHV0IDEgPC0gYXV4CisgKiAgIGlucHV0IDIgPC0gZnJvbnQgbWljCisgKiAgIGlucHV0IDQgPC0gbGluZS9taWMKKyAqICAgYXV4IG91dCAtPiBmcm9udCBwYW5lbCBoZWFkcGhvbmVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSAib3h5Z2VuLmgiCisjaW5jbHVkZSAieG9uYXJfZGcuaCIKKyNpbmNsdWRlICJjczQyNDUuaCIKKworI2RlZmluZSBHUElPX01BR0lDCQkweDAwMDgKKyNkZWZpbmUgR1BJT19IUF9ERVRFQ1QJCTB4MDAxMAorI2RlZmluZSBHUElPX0lOUFVUX1JPVVRFCTB4MDA2MAorI2RlZmluZSBHUElPX0hQX1JFQVIJCTB4MDA4MAorI2RlZmluZSBHUElPX09VVFBVVF9FTkFCTEUJMHgwMTAwCisKK3N0cnVjdCBkZyB7CisJdW5zaWduZWQgaW50IG91dHB1dF9zZWw7CisJczggaW5wdXRfdm9sWzRdWzJdOworCXVuc2lnbmVkIGludCBpbnB1dF9zZWw7CisJdTggaHBfdm9sX2F0dDsKKwl1OCBjczQyNDVfcmVnc1sweDExXTsKK307CisKK3N0YXRpYyB2b2lkIGNzNDI0NV93cml0ZShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJb3h5Z2VuX3dyaXRlX3NwaShjaGlwLCBPWFlHRU5fU1BJX1RSSUdHRVIgfAorCQkJIE9YWUdFTl9TUElfREFUQV9MRU5HVEhfMyB8CisJCQkgT1hZR0VOX1NQSV9DTE9DS18xMjgwIHwKKwkJCSAoMCA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSB8CisJCQkgT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEksCisJCQkgQ1M0MjQ1X1NQSV9BRERSRVNTIHwKKwkJCSBDUzQyNDVfU1BJX1dSSVRFIHwKKwkJCSAodmFsdWUgPDwgOCkgfCByZWcpOworCWRhdGEtPmNzNDI0NV9yZWdzW3JlZ10gPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgY3M0MjQ1X3dyaXRlX2NhY2hlZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwLCB1bnNpZ25lZCBpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJaWYgKHZhbHVlICE9IGRhdGEtPmNzNDI0NV9yZWdzW3JlZ10pCisJCWNzNDI0NV93cml0ZShjaGlwLCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgY3M0MjQ1X3JlZ2lzdGVyc19pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCWNzNDI0NV93cml0ZShjaGlwLCBDUzQyNDVfUE9XRVJfQ1RSTCwgQ1M0MjQ1X1BETik7CisJY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8xLAorCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQ1RSTF8xXSk7CisJY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9BRENfQ1RSTCwKKwkJICAgICBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1NJR05BTF9TRUwsCisJCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1NJR05BTF9TRUxdKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BHQV9CX0NUUkwsCisJCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1BHQV9CX0NUUkxdKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BHQV9BX0NUUkwsCisJCSAgICAgZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X1BHQV9BX0NUUkxdKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0FOQUxPR19JTiwKKwkJICAgICBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQU5BTE9HX0lOXSk7CisJY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQV9DVFJMLAorCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQV9DVFJMXSk7CisJY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQl9DVFJMLAorCQkgICAgIGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9EQUNfQl9DVFJMXSk7CisJY3M0MjQ1X3dyaXRlKGNoaXAsIENTNDI0NV9EQUNfQ1RSTF8yLAorCQkgICAgIENTNDI0NV9EQUNfU09GVCB8IENTNDI0NV9EQUNfWkVSTyB8IENTNDI0NV9JTlZFUlRfREFDKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0lOVF9NQVNLLCAwKTsKKwljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X1BPV0VSX0NUUkwsIDApOworfQorCitzdGF0aWMgdm9pZCBjczQyNDVfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwlkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfREFDX0NUUkxfMV0gPQorCQlDUzQyNDVfREFDX0ZNX1NJTkdMRSB8IENTNDI0NV9EQUNfRElGX0xKVVNUOworCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BRENfQ1RSTF0gPQorCQlDUzQyNDVfQURDX0ZNX1NJTkdMRSB8IENTNDI0NV9BRENfRElGX0xKVVNUOworCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9TSUdOQUxfU0VMXSA9CisJCUNTNDI0NV9BX09VVF9TRUxfSElaIHwgQ1M0MjQ1X0FTWU5DSDsKKwlkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfUEdBX0JfQ1RSTF0gPSAwOworCWRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9QR0FfQV9DVFJMXSA9IDA7CisJZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0FOQUxPR19JTl0gPQorCQlDUzQyNDVfUEdBX1NPRlQgfCBDUzQyNDVfUEdBX1pFUk8gfCBDUzQyNDVfU0VMX0lOUFVUXzQ7CisJZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0RBQ19BX0NUUkxdID0gMDsKKwlkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfREFDX0JfQ1RSTF0gPSAwOworCWNzNDI0NV9yZWdpc3RlcnNfaW5pdChjaGlwKTsKKwlzbmRfY29tcG9uZW50X2FkZChjaGlwLT5jYXJkLCAiQ1M0MjQ1Iik7Cit9CisKK3N0YXRpYyB2b2lkIGRnX291dHB1dF9lbmFibGUoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwltc2xlZXAoMjUwMCk7CisJb3h5Z2VuX3NldF9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwgR1BJT19PVVRQVVRfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgZGdfaW5pdChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwlkYXRhLT5vdXRwdXRfc2VsID0gMDsKKwlkYXRhLT5pbnB1dF9zZWwgPSAzOworCWRhdGEtPmhwX3ZvbF9hdHQgPSAyICogMTY7CisKKwljczQyNDVfaW5pdChjaGlwKTsKKworCW94eWdlbl9jbGVhcl9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fQ09OVFJPTCwKKwkJCSAgICBHUElPX01BR0lDIHwgR1BJT19IUF9ERVRFQ1QpOworCW94eWdlbl9zZXRfYml0czE2KGNoaXAsIE9YWUdFTl9HUElPX0NPTlRST0wsCisJCQkgIEdQSU9fSU5QVVRfUk9VVEUgfCBHUElPX0hQX1JFQVIgfCBHUElPX09VVFBVVF9FTkFCTEUpOworCW94eWdlbl9jbGVhcl9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwKKwkJCSAgICBHUElPX0lOUFVUX1JPVVRFIHwgR1BJT19IUF9SRUFSKTsKKwlkZ19vdXRwdXRfZW5hYmxlKGNoaXApOworfQorCitzdGF0aWMgdm9pZCBkZ19jbGVhbnVwKHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBHUElPX09VVFBVVF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBkZ19zdXNwZW5kKHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJZGdfY2xlYW51cChjaGlwKTsKK30KKworc3RhdGljIHZvaWQgZGdfcmVzdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCit7CisJY3M0MjQ1X3JlZ2lzdGVyc19pbml0KGNoaXApOworCWRnX291dHB1dF9lbmFibGUoY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jczQyNDVfZGFjX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1OCB2YWx1ZTsKKworCXZhbHVlID0gZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0RBQ19DVFJMXzFdICYgfkNTNDI0NV9EQUNfRk1fTUFTSzsKKwlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSA1MDAwMCkKKwkJdmFsdWUgfD0gQ1M0MjQ1X0RBQ19GTV9TSU5HTEU7CisJZWxzZSBpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSAxMDAwMDApCisJCXZhbHVlIHw9IENTNDI0NV9EQUNfRk1fRE9VQkxFOworCWVsc2UKKwkJdmFsdWUgfD0gQ1M0MjQ1X0RBQ19GTV9RVUFEOworCWNzNDI0NV93cml0ZV9jYWNoZWQoY2hpcCwgQ1M0MjQ1X0RBQ19DVFJMXzEsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2NzNDI0NV9hZGNfcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXU4IHZhbHVlOworCisJdmFsdWUgPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdICYgfkNTNDI0NV9BRENfRk1fTUFTSzsKKwlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSA1MDAwMCkKKwkJdmFsdWUgfD0gQ1M0MjQ1X0FEQ19GTV9TSU5HTEU7CisJZWxzZSBpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA8PSAxMDAwMDApCisJCXZhbHVlIHw9IENTNDI0NV9BRENfRk1fRE9VQkxFOworCWVsc2UKKwkJdmFsdWUgfD0gQ1M0MjQ1X0FEQ19GTV9RVUFEOworCWNzNDI0NV93cml0ZV9jYWNoZWQoY2hpcCwgQ1M0MjQ1X0FEQ19DVFJMLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbM10gPSB7CisJCSJTcGVha2VycyIsICJIZWFkcGhvbmVzIiwgIkZQIEhlYWRwaG9uZXMiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZGF0YS0+b3V0cHV0X3NlbDsKKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdXRwdXRfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXU4IHJlZzsKKwlpbnQgY2hhbmdlZDsKKworCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJY2hhbmdlZCA9IHZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gIT0gZGF0YS0+b3V0cHV0X3NlbDsKKwlpZiAoY2hhbmdlZCkgeworCQlkYXRhLT5vdXRwdXRfc2VsID0gdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKworCQlyZWcgPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfU0lHTkFMX1NFTF0gJgorCQkJCQkJfkNTNDI0NV9BX09VVF9TRUxfTUFTSzsKKwkJcmVnIHw9IGRhdGEtPm91dHB1dF9zZWwgPT0gMiA/CisJCQkJQ1M0MjQ1X0FfT1VUX1NFTF9EQUMgOiBDUzQyNDVfQV9PVVRfU0VMX0hJWjsKKwkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfU0lHTkFMX1NFTCwgcmVnKTsKKworCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9EQUNfQV9DVFJMLAorCQkJCSAgICBkYXRhLT5vdXRwdXRfc2VsID8gZGF0YS0+aHBfdm9sX2F0dCA6IDApOworCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9EQUNfQl9DVFJMLAorCQkJCSAgICBkYXRhLT5vdXRwdXRfc2VsID8gZGF0YS0+aHBfdm9sX2F0dCA6IDApOworCisJCW94eWdlbl93cml0ZTE2X21hc2tlZChjaGlwLCBPWFlHRU5fR1BJT19EQVRBLAorCQkJCSAgICAgIGRhdGEtPm91dHB1dF9zZWwgPT0gMSA/IEdQSU9fSFBfUkVBUiA6IDAsCisJCQkJICAgICAgR1BJT19IUF9SRUFSKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBpbnQgaHBfdm9sdW1lX29mZnNldF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1szXSA9IHsKKwkJIjwgNjQgb2htcyIsICI2NC0xNTAgb2htcyIsICIxNTAtMzAwIG9obXMiCisJfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgaHBfdm9sdW1lX29mZnNldF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWlmIChkYXRhLT5ocF92b2xfYXR0ID4gMiAqIDcpCisJCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOworCWVsc2UgaWYgKGRhdGEtPmhwX3ZvbF9hdHQgPiAwKQorCQl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTsKKwllbHNlCisJCXZhbHVlLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAyOworCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwX3ZvbHVtZV9vZmZzZXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgczggYXR0c1szXSA9IHsgMiAqIDE2LCAyICogNywgMCB9OworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXM4IGF0dDsKKwlpbnQgY2hhbmdlZDsKKworCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJYXR0ID0gYXR0c1t2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdXTsKKwltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7CisJY2hhbmdlZCA9IGF0dCAhPSBkYXRhLT5ocF92b2xfYXR0OworCWlmIChjaGFuZ2VkKSB7CisJCWRhdGEtPmhwX3ZvbF9hdHQgPSBhdHQ7CisJCWlmIChkYXRhLT5vdXRwdXRfc2VsKSB7CisJCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9EQUNfQV9DVFJMLCBhdHQpOworCQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfREFDX0JfQ1RSTCwgYXR0KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIGludCBpbnB1dF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMjsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDIgKiAtMTI7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyICogMTI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdOworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZGF0YS0+aW5wdXRfdm9sW2lkeF1bMV07CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfdm9sX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwlpZiAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPCAyICogLTEyIHx8CisJICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID4gMiAqIDEyIHx8CisJICAgIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdIDwgMiAqIC0xMiB8fAorCSAgICB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA+IDIgKiAxMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWNoYW5nZWQgPSBkYXRhLT5pbnB1dF92b2xbaWR4XVswXSAhPSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSB8fAorCQkgIGRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdICE9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmIChjaGFuZ2VkKSB7CisJCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzBdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCWRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdID0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJCWlmIChpZHggPT0gZGF0YS0+aW5wdXRfc2VsKSB7CisJCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9QR0FfQV9DVFJMLAorCQkJCQkgICAgZGF0YS0+aW5wdXRfdm9sW2lkeF1bMF0pOworCQkJY3M0MjQ1X3dyaXRlX2NhY2hlZChjaGlwLCBDUzQyNDVfUEdBX0JfQ1RSTCwKKwkJCQkJICAgIGRhdGEtPmlucHV0X3ZvbFtpZHhdWzFdKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKGNzNDI0NV9wZ2FfZGJfc2NhbGUsIC0xMjAwLCA1MCwgMCk7CisKK3N0YXRpYyBpbnQgaW5wdXRfc2VsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzRdID0geworCQkiTWljIiwgIkF1eCIsICJGcm9udCBNaWMiLCAiTGluZSIKKwl9OworCisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDQsIG5hbWVzKTsKK30KKworc3RhdGljIGludCBpbnB1dF9zZWxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKKwkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZGF0YS0+aW5wdXRfc2VsOworCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlucHV0X3NlbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAorCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0YXRpYyBjb25zdCB1OCBzZWxfdmFsdWVzWzRdID0geworCQlDUzQyNDVfU0VMX01JQywKKwkJQ1M0MjQ1X1NFTF9JTlBVVF8xLAorCQlDUzQyNDVfU0VMX0lOUFVUXzIsCisJCUNTNDI0NV9TRUxfSU5QVVRfNAorCX07CisJc3RydWN0IG94eWdlbiAqY2hpcCA9IGN0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZyAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJaW50IGNoYW5nZWQ7CisKKwlpZiAodmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOworCWNoYW5nZWQgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IGRhdGEtPmlucHV0X3NlbDsKKwlpZiAoY2hhbmdlZCkgeworCQlkYXRhLT5pbnB1dF9zZWwgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJCWNzNDI0NV93cml0ZShjaGlwLCBDUzQyNDVfQU5BTE9HX0lOLAorCQkJICAgICAoZGF0YS0+Y3M0MjQ1X3JlZ3NbQ1M0MjQ1X0FOQUxPR19JTl0gJgorCQkJCQkJCX5DUzQyNDVfU0VMX01BU0spIHwKKwkJCSAgICAgc2VsX3ZhbHVlc1tkYXRhLT5pbnB1dF9zZWxdKTsKKworCQljczQyNDVfd3JpdGVfY2FjaGVkKGNoaXAsIENTNDI0NV9QR0FfQV9DVFJMLAorCQkJCSAgICBkYXRhLT5pbnB1dF92b2xbZGF0YS0+aW5wdXRfc2VsXVswXSk7CisJCWNzNDI0NV93cml0ZV9jYWNoZWQoY2hpcCwgQ1M0MjQ1X1BHQV9CX0NUUkwsCisJCQkJICAgIGRhdGEtPmlucHV0X3ZvbFtkYXRhLT5pbnB1dF9zZWxdWzFdKTsKKworCQlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSwKKwkJCQkgICAgICBkYXRhLT5pbnB1dF9zZWwgPyAwIDogR1BJT19JTlBVVF9ST1VURSwKKwkJCQkgICAgICBHUElPX0lOUFVUX1JPVVRFKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5tdXRleCk7CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBpbnQgaHBmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzJdID0geyAiQWN0aXZlIiwgIkZyb3plbiIgfTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAyLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgaHBmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCisJdmFsdWUtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCSEhKGRhdGEtPmNzNDI0NV9yZWdzW0NTNDI0NV9BRENfQ1RSTF0gJiBDUzQyNDVfSFBGX0ZSRUVaRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBmX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGcgKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXU4IHJlZzsKKwlpbnQgY2hhbmdlZDsKKworCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKKwlyZWcgPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdICYgfkNTNDI0NV9IUEZfRlJFRVpFOworCWlmICh2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKQorCQlyZWcgfD0gQ1M0MjQ1X0hQRl9GUkVFWkU7CisJY2hhbmdlZCA9IHJlZyAhPSBkYXRhLT5jczQyNDVfcmVnc1tDUzQyNDVfQURDX0NUUkxdOworCWlmIChjaGFuZ2VkKQorCQljczQyNDVfd3JpdGUoY2hpcCwgQ1M0MjQ1X0FEQ19DVFJMLCByZWcpOworCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOworCXJldHVybiBjaGFuZ2VkOworfQorCisjZGVmaW5lIElOUFVUX1ZPTFVNRSh4bmFtZSwgaW5kZXgpIHsgXAorCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisJLm5hbWUgPSB4bmFtZSwgXAorCS5pbmZvID0gaW5wdXRfdm9sX2luZm8sIFwKKwkuZ2V0ID0gaW5wdXRfdm9sX2dldCwgXAorCS5wdXQgPSBpbnB1dF92b2xfcHV0LCBcCisJLnRsdiA9IHsgLnAgPSBjczQyNDVfcGdhX2RiX3NjYWxlIH0sIFwKKwkucHJpdmF0ZV92YWx1ZSA9IGluZGV4LCBcCit9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGdfY29udHJvbHNbXSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBbmFsb2cgT3V0cHV0IFBsYXliYWNrIEVudW0iLAorCQkuaW5mbyA9IG91dHB1dF9zd2l0Y2hfaW5mbywKKwkJLmdldCA9IG91dHB1dF9zd2l0Y2hfZ2V0LAorCQkucHV0ID0gb3V0cHV0X3N3aXRjaF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJIZWFkcGhvbmVzIEltcGVkYW5jZSBQbGF5YmFjayBFbnVtIiwKKwkJLmluZm8gPSBocF92b2x1bWVfb2Zmc2V0X2luZm8sCisJCS5nZXQgPSBocF92b2x1bWVfb2Zmc2V0X2dldCwKKwkJLnB1dCA9IGhwX3ZvbHVtZV9vZmZzZXRfcHV0LAorCX0sCisJSU5QVVRfVk9MVU1FKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKKwlJTlBVVF9WT0xVTUUoIkF1eCBDYXB0dXJlIFZvbHVtZSIsIDEpLAorCUlOUFVUX1ZPTFVNRSgiRnJvbnQgTWljIENhcHR1cmUgVm9sdW1lIiwgMiksCisJSU5QVVRfVk9MVU1FKCJMaW5lIENhcHR1cmUgVm9sdW1lIiwgMyksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGlucHV0X3NlbF9pbmZvLAorCQkuZ2V0ID0gaW5wdXRfc2VsX2dldCwKKwkJLnB1dCA9IGlucHV0X3NlbF9wdXQsCisJfSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgSGlnaC1wYXNzIEZpbHRlciBDYXB0dXJlIEVudW0iLAorCQkuaW5mbyA9IGhwZl9pbmZvLAorCQkuZ2V0ID0gaHBmX2dldCwKKwkJLnB1dCA9IGhwZl9wdXQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgZGdfY29udHJvbF9maWx0ZXIoc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKnRlbXBsYXRlKQoreworCWlmICghc3RybmNtcCh0ZW1wbGF0ZS0+bmFtZSwgIk1hc3RlciBQbGF5YmFjayAiLCAxNikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRnX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGdfY29udHJvbHMpOyArK2kpIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwKKwkJCQkgIHNuZF9jdGxfbmV3MSgmZGdfY29udHJvbHNbaV0sIGNoaXApKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9jczQyNDVfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IGRnICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuQ1M0MjQ1OiIpOworCWZvciAoaSA9IDE7IGkgPD0gMHgxMDsgKytpKQorCQlzbmRfaXByaW50ZihidWZmZXIsICIgJTAyeCIsIGRhdGEtPmNzNDI0NV9yZWdzW2ldKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworfQorCitzdHJ1Y3Qgb3h5Z2VuX21vZGVsIG1vZGVsX3hvbmFyX2RnID0geworCS5zaG9ydG5hbWUgPSAiWG9uYXIgREciLAorCS5sb25nbmFtZSA9ICJDLU1lZGlhIE94eWdlbiBIRCBBdWRpbyIsCisJLmNoaXAgPSAiQ01JODc4NiIsCisJLmluaXQgPSBkZ19pbml0LAorCS5jb250cm9sX2ZpbHRlciA9IGRnX2NvbnRyb2xfZmlsdGVyLAorCS5taXhlcl9pbml0ID0gZGdfbWl4ZXJfaW5pdCwKKwkuY2xlYW51cCA9IGRnX2NsZWFudXAsCisJLnN1c3BlbmQgPSBkZ19zdXNwZW5kLAorCS5yZXN1bWUgPSBkZ19yZXN1bWUsCisJLnNldF9kYWNfcGFyYW1zID0gc2V0X2NzNDI0NV9kYWNfcGFyYW1zLAorCS5zZXRfYWRjX3BhcmFtcyA9IHNldF9jczQyNDVfYWRjX3BhcmFtcywKKwkuZHVtcF9yZWdpc3RlcnMgPSBkdW1wX2NzNDI0NV9yZWdpc3RlcnMsCisJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGcpLAorCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAorCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAorCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yLAorCS5kYWNfY2hhbm5lbHNfcGNtID0gNiwKKwkuZGFjX2NoYW5uZWxzX21peGVyID0gMCwKKwkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fU1BJLAorCS5kYWNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCksCisJLmFkY19tY2xrcyA9IE9YWUdFTl9NQ0xLUygyNTYsIDEyOCwgMTI4KSwKKwkuZGFjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKKwkuYWRjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmggYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2RnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4OGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfZGcuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgWE9OQVJfREdfSF9JTkNMVURFRAorI2RlZmluZSBYT05BUl9ER19IX0lOQ0xVREVECisKKyNpbmNsdWRlICJveHlnZW4uaCIKKworZXh0ZXJuIHN0cnVjdCBveHlnZW5fbW9kZWwgbW9kZWxfeG9uYXJfZGc7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2hkbWkuYwppbmRleCBiMTJkYjFmLi4xMzZkYWM2YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKKysrIGIvc291bmQvcGNpL294eWdlbi94b25hcl9oZG1pLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgSERNSSBtb2RlbHMgKFhvbmFyIEhEQVYxLjMpCisgKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBIRE1JIG1vZGVscyAoWG9uYXIgSERBVjEuMy9IREFWMS4zIFNsaW0pCiAgKgogICogQ29weXJpZ2h0IChjKSBDbGVtZW5zIExhZGlzY2ggPGNsZW1lbnNAbGFkaXNjaC5kZT4KICAqCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2xpYi5jIGIvc291bmQvcGNpL294eWdlbi94b25hcl9saWIuYwppbmRleCBiM2ZmNzEzLi4wZWJlN2Y1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX2xpYi5jCisrKyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfbGliLmMKQEAgLTEwNCw5ICsxMDQsMTAgQEAKIHsKIAlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7CiAJdTE2IGJpdCA9IGN0bC0+cHJpdmF0ZV92YWx1ZTsKKwlib29sIGludmVydCA9IGN0bC0+cHJpdmF0ZV92YWx1ZSAmIFhPTkFSX0dQSU9fQklUX0lOVkVSVDsKIAogCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJISEob3h5Z2VuX3JlYWQxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBKSAmIGJpdCk7CisJCSEhKG94eWdlbl9yZWFkMTYoY2hpcCwgT1hZR0VOX0dQSU9fREFUQSkgJiBiaXQpIF4gaW52ZXJ0OwogCXJldHVybiAwOwogfQogCkBAIC0xMTUsMTIgKzExNiwxMyBAQAogewogCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKIAl1MTYgYml0ID0gY3RsLT5wcml2YXRlX3ZhbHVlOworCWJvb2wgaW52ZXJ0ID0gY3RsLT5wcml2YXRlX3ZhbHVlICYgWE9OQVJfR1BJT19CSVRfSU5WRVJUOwogCXUxNiBvbGRfYml0cywgbmV3X2JpdHM7CiAJaW50IGNoYW5nZWQ7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5yZWdfbG9jayk7CiAJb2xkX2JpdHMgPSBveHlnZW5fcmVhZDE2KGNoaXAsIE9YWUdFTl9HUElPX0RBVEEpOwotCWlmICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwlpZiAoISF2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSBeIGludmVydCkKIAkJbmV3X2JpdHMgPSBvbGRfYml0cyB8IGJpdDsKIAllbHNlCiAJCW5ld19iaXRzID0gb2xkX2JpdHMgJiB+Yml0OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl9wY20xNzl4LmMgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYwppbmRleCBkNDkxZmQ2Li41NGNhZDM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3BjbTE3OXguYwpAQCAtMjIsMjAgKzIyLDI2IEBACiAgKgogICogQ01JODc4ODoKICAqCi0gKiBTUEkgMCAtPiAxc3QgUENNMTc5NiAoZnJvbnQpCi0gKiBTUEkgMSAtPiAybmQgUENNMTc5NiAoc3Vycm91bmQpCi0gKiBTUEkgMiAtPiAzcmQgUENNMTc5NiAoY2VudGVyL0xGRSkKLSAqIFNQSSA0IC0+IDR0aCBQQ00xNzk2IChiYWNrKQorICogICBTUEkgMCAtPiAxc3QgUENNMTc5NiAoZnJvbnQpCisgKiAgIFNQSSAxIC0+IDJuZCBQQ00xNzk2IChzdXJyb3VuZCkKKyAqICAgU1BJIDIgLT4gM3JkIFBDTTE3OTYgKGNlbnRlci9MRkUpCisgKiAgIFNQSSA0IC0+IDR0aCBQQ00xNzk2IChiYWNrKQogICoKLSAqIEdQSU8gMiAtPiBNMCBvZiBDUzUzODEKLSAqIEdQSU8gMyAtPiBNMSBvZiBDUzUzODEKLSAqIEdQSU8gNSA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50IChEMlggb25seSkKLSAqIEdQSU8gNyAtPiBBTFQKLSAqIEdQSU8gOCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCisgKiAgIEdQSU8gMiAtPiBNMCBvZiBDUzUzODEKKyAqICAgR1BJTyAzIC0+IE0xIG9mIENTNTM4MQorICogICBHUElPIDUgPC0gZXh0ZXJuYWwgcG93ZXIgcHJlc2VudCAoRDJYIG9ubHkpCisgKiAgIEdQSU8gNyAtPiBBTFQKKyAqICAgR1BJTyA4IC0+IGVuYWJsZSBvdXRwdXQgdG8gc3BlYWtlcnMKICAqCiAgKiBDTTk3ODA6CiAgKgotICogR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIENTNTM4MSBpbnB1dAorICogICBMSU5FX09VVCAtPiBpbnB1dCBvZiBBREMKKyAqCisgKiAgIEFVWF9JTiAgIDwtIGF1eAorICogICBWSURFT19JTiA8LSBDRAorICogICBGTUlDX0lOICA8LSBtaWMKKyAqCisgKiAgIEdQTyAwIC0+IHJvdXRlIGxpbmUtaW4gKDApIG9yIEFDOTcgb3V0cHV0ICgxKSB0byBDUzUzODEgaW5wdXQKICAqLwogCiAvKgpAQCAtNDQsNTIgKzUwLDUzIEBACiAgKgogICogQ01JODc4ODoKICAqCi0gKiBJwrJDIDwtPiBQQ00xNzk2IChmcm9udCkKKyAqICAgScKyQyA8LT4gUENNMTc5NiAoYWRkciAxMDAxMTAwKSAoZnJvbnQpCiAgKgotICogR1BJIDAgPC0gZXh0ZXJuYWwgcG93ZXIgcHJlc2VudAorICogICBHUEkgMCA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50CiAgKgotICogR1BJTyAwIC0+IGVuYWJsZSBvdXRwdXQgdG8gc3BlYWtlcnMKLSAqIEdQSU8gMiAtPiBNMCBvZiBDUzUzODEKLSAqIEdQSU8gMyAtPiBNMSBvZiBDUzUzODEKLSAqIEdQSU8gOCAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIGxpbmUtaW4gKDApIG9yIG1pYy1pbiAoMSkKKyAqICAgR1BJTyAwIC0+IGVuYWJsZSBIRE1JICgwKSBvciBzcGVha2VyICgxKSBvdXRwdXQKKyAqICAgR1BJTyAyIC0+IE0wIG9mIENTNTM4MQorICogICBHUElPIDMgLT4gTTEgb2YgQ1M1MzgxCisgKiAgIEdQSU8gNCA8LSBkYXVnaHRlcmJvYXJkIGRldGVjdGlvbgorICogICBHUElPIDUgPC0gZGF1Z2h0ZXJib2FyZCBkZXRlY3Rpb24KKyAqICAgR1BJTyA2IC0+ID8KKyAqICAgR1BJTyA3IC0+ID8KKyAqICAgR1BJTyA4IC0+IHJvdXRlIGlucHV0IGphY2sgdG8gbGluZS1pbiAoMCkgb3IgbWljLWluICgxKQogICoKLSAqIFRYRCAtPiBIRE1JIGNvbnRyb2xsZXIKLSAqIFJYRCA8LSBIRE1JIGNvbnRyb2xsZXIKLSAqCi0gKiBQQ00xNzk2IGZyb250OiBBRDEsMCA8LSAwLDAKKyAqICAgVUFSVCA8LT4gSERNSSBjb250cm9sbGVyCiAgKgogICogQ005NzgwOgogICoKLSAqIEdQTyAwIC0+IHJvdXRlIGxpbmUtaW4gKDApIG9yIEFDOTcgb3V0cHV0ICgxKSB0byBDUzUzODEgaW5wdXQKKyAqICAgTElORV9PVVQgLT4gaW5wdXQgb2YgQURDCisgKgorICogICBBVVhfSU4gPC0gYXV4CisgKiAgIENEX0lOICA8LSBDRAorICogICBNSUNfSU4gPC0gbWljCisgKgorICogICBHUE8gMCAtPiByb3V0ZSBsaW5lLWluICgwKSBvciBBQzk3IG91dHB1dCAoMSkgdG8gQ1M1MzgxIGlucHV0CiAgKgogICogbm8gZGF1Z2h0ZXJib2FyZAogICogLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIEdQSU8gNCA8LSAxCisgKiAgIEdQSU8gNCA8LSAxCiAgKgogICogSDYgZGF1Z2h0ZXJib2FyZAogICogLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIEdQSU8gNCA8LSAwCi0gKiBHUElPIDUgPC0gMAorICogICBHUElPIDQgPC0gMAorICogICBHUElPIDUgPC0gMAogICoKLSAqIEnCskMgPC0+IFBDTTE3OTYgKHN1cnJvdW5kKQotICogICAgIDwtPiBQQ00xNzk2IChjZW50ZXIvTEZFKQotICogICAgIDwtPiBQQ00xNzk2IChiYWNrKQotICoKLSAqIFBDTTE3OTYgc3Vycm91bmQ6ICAgQUQxLDAgPC0gMCwxCi0gKiBQQ00xNzk2IGNlbnRlci9MRkU6IEFEMSwwIDwtIDEsMAotICogUENNMTc5NiBiYWNrOiAgICAgICBBRDEsMCA8LSAxLDEKKyAqICAgScKyQyA8LT4gUENNMTc5NiAoYWRkciAxMDAxMTAxKSAoc3Vycm91bmQpCisgKiAgICAgICA8LT4gUENNMTc5NiAoYWRkciAxMDAxMTEwKSAoY2VudGVyL0xGRSkKKyAqICAgICAgIDwtPiBQQ00xNzk2IChhZGRyIDEwMDExMTEpIChiYWNrKQogICoKICAqIHVua25vd24gZGF1Z2h0ZXJib2FyZAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgotICogR1BJTyA0IDwtIDAKLSAqIEdQSU8gNSA8LSAxCisgKiAgIEdQSU8gNCA8LSAwCisgKiAgIEdQSU8gNSA8LSAxCiAgKgotICogScKyQyA8LT4gQ1M0MzYyQSAoc3Vycm91bmQsIGNlbnRlci9MRkUsIGJhY2spCi0gKgotICogQ1M0MzYyQTogQUQwIDwtIDAKKyAqICAgScKyQyA8LT4gQ1M0MzYyQSAoYWRkciAwMDExMDAwKSAoc3Vycm91bmQsIGNlbnRlci9MRkUsIGJhY2spCiAgKi8KIAogLyoKQEAgLTk4LDMyICsxMDUsMzUgQEAKICAqCiAgKiBDTUk4Nzg4OgogICoKLSAqIEnCskMgPC0+IFBDTTE3OTJBCi0gKiAgICAgPC0+IENTMjAwMCAoU1Qgb25seSkKKyAqICAgScKyQyA8LT4gUENNMTc5MkEgKGFkZHIgMTAwMTEwMCkKKyAqICAgICAgIDwtPiBDUzIwMDAgKGFkZHIgMTAwMTExMCkgKFNUIG9ubHkpCiAgKgotICogQURDMSBNQ0xLIC0+IFJFRl9DTEsgb2YgQ1MyMDAwIChTVCBvbmx5KQorICogICBBREMxIE1DTEsgLT4gUkVGX0NMSyBvZiBDUzIwMDAgKFNUIG9ubHkpCiAgKgotICogR1BJIDAgPC0gZXh0ZXJuYWwgcG93ZXIgcHJlc2VudCAoU1RYIG9ubHkpCisgKiAgIEdQSSAwIDwtIGV4dGVybmFsIHBvd2VyIHByZXNlbnQgKFNUWCBvbmx5KQogICoKLSAqIEdQSU8gMCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCi0gKiBHUElPIDEgLT4gcm91dGUgSFAgdG8gZnJvbnQgcGFuZWwgKDApIG9yIHJlYXIgamFjayAoMSkKLSAqIEdQSU8gMiAtPiBNMCBvZiBDUzUzODEKLSAqIEdQSU8gMyAtPiBNMSBvZiBDUzUzODEKLSAqIEdQSU8gNyAtPiByb3V0ZSBvdXRwdXQgdG8gc3BlYWtlciBqYWNrcyAoMCkgb3IgSFAgKDEpCi0gKiBHUElPIDggLT4gcm91dGUgaW5wdXQgamFjayB0byBsaW5lLWluICgwKSBvciBtaWMtaW4gKDEpCisgKiAgIEdQSU8gMCAtPiBlbmFibGUgb3V0cHV0IHRvIHNwZWFrZXJzCisgKiAgIEdQSU8gMSAtPiByb3V0ZSBIUCB0byBmcm9udCBwYW5lbCAoMCkgb3IgcmVhciBqYWNrICgxKQorICogICBHUElPIDIgLT4gTTAgb2YgQ1M1MzgxCisgKiAgIEdQSU8gMyAtPiBNMSBvZiBDUzUzODEKKyAqICAgR1BJTyA0IDwtIGRhdWdodGVyYm9hcmQgZGV0ZWN0aW9uCisgKiAgIEdQSU8gNSA8LSBkYXVnaHRlcmJvYXJkIGRldGVjdGlvbgorICogICBHUElPIDYgLT4gPworICogICBHUElPIDcgLT4gcm91dGUgb3V0cHV0IHRvIHNwZWFrZXIgamFja3MgKDApIG9yIEhQICgxKQorICogICBHUElPIDggLT4gcm91dGUgaW5wdXQgamFjayB0byBsaW5lLWluICgwKSBvciBtaWMtaW4gKDEpCiAgKgogICogUENNMTc5MkE6CiAgKgotICogQUQxLDAgPC0gMCwwCi0gKiBTQ0sgPC0gQ0xLX09VVCBvZiBDUzIwMDAgKFNUIG9ubHkpCi0gKgotICogQ1MyMDAwOgotICoKLSAqIEFEMCA8LSAwCisgKiAgIFNDSyA8LSBDTEtfT1VUIG9mIENTMjAwMCAoU1Qgb25seSkKICAqCiAgKiBDTTk3ODA6CiAgKgotICogR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIENTNTM4MSBpbnB1dAorICogICBMSU5FX09VVCAtPiBpbnB1dCBvZiBBREMKKyAqCisgKiAgIEFVWF9JTiA8LSBhdXgKKyAqICAgTUlDX0lOIDwtIG1pYworICoKKyAqICAgR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIENTNTM4MSBpbnB1dAogICoKICAqIEg2IGRhdWdodGVyYm9hcmQKICAqIC0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzMywxNSArMTQzLDM5IEBACiAgKi8KIAogLyoKLSAqIFhvbmFyIEhEQVYxLjMgU2xpbQotICogLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBYb25hciBYZW5zZQorICogLS0tLS0tLS0tLS0KICAqCiAgKiBDTUk4Nzg4OgogICoKLSAqIEdQSU8gMSAtPiBlbmFibGUgb3V0cHV0CisgKiAgIEnCskMgPC0+IFBDTTE3OTYgKGFkZHIgMTAwMTEwMCkgKGZyb250KQorICogICAgICAgPC0+IENTNDM2MkEgKGFkZHIgMDAxMTAwMCkgKHN1cnJvdW5kLCBjZW50ZXIvTEZFLCBiYWNrKQorICogICAgICAgPC0+IENTMjAwMCAoYWRkciAxMDAxMTEwKQogICoKLSAqIFRYRCAtPiBIRE1JIGNvbnRyb2xsZXIKLSAqIFJYRCA8LSBIRE1JIGNvbnRyb2xsZXIKKyAqICAgQURDMSBNQ0xLIC0+IFJFRl9DTEsgb2YgQ1MyMDAwCisgKgorICogICBHUEkgMCA8LSBleHRlcm5hbCBwb3dlciBwcmVzZW50CisgKgorICogICBHUElPIDAgLT4gZW5hYmxlIG91dHB1dAorICogICBHUElPIDEgLT4gcm91dGUgSFAgdG8gZnJvbnQgcGFuZWwgKDApIG9yIHJlYXIgamFjayAoMSkKKyAqICAgR1BJTyAyIC0+IE0wIG9mIENTNTM4MQorICogICBHUElPIDMgLT4gTTEgb2YgQ1M1MzgxCisgKiAgIEdQSU8gNCAtPiBlbmFibGUgb3V0cHV0CisgKiAgIEdQSU8gNSAtPiBlbmFibGUgb3V0cHV0CisgKiAgIEdQSU8gNiAtPiA/CisgKiAgIEdQSU8gNyAtPiByb3V0ZSBvdXRwdXQgdG8gSFAgKDApIG9yIHNwZWFrZXIgKDEpCisgKiAgIEdQSU8gOCAtPiByb3V0ZSBpbnB1dCBqYWNrIHRvIG1pYy1pbiAoMCkgb3IgbGluZS1pbiAoMSkKKyAqCisgKiBDTTk3ODA6CisgKgorICogICBMSU5FX09VVCAtPiBpbnB1dCBvZiBBREMKKyAqCisgKiAgIEFVWF9JTiAgIDwtIGF1eAorICogICBWSURFT19JTiA8LSA/CisgKiAgIEZNSUNfSU4gIDwtIG1pYworICoKKyAqICAgR1BPIDAgLT4gcm91dGUgbGluZS1pbiAoMCkgb3IgQUM5NyBvdXRwdXQgKDEpIHRvIENTNTM4MSBpbnB1dAorICogICBHUE8gMSAtPiByb3V0ZSBtaWMtaW4gZnJvbSBpbnB1dCBqYWNrICgwKSBvciBmcm9udCBwYW5lbCBoZWFkZXIgKDEpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtMTUwLDYgKzE4NCw3IEBACiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KQEAgLTE2NywxMiArMjAyLDE0IEBACiAjZGVmaW5lIEdQSU9fSU5QVVRfUk9VVEUJMHgwMTAwCiAKICNkZWZpbmUgR1BJT19IREFWX09VVFBVVF9FTkFCTEUJMHgwMDAxCisjZGVmaW5lIEdQSU9fSERBVl9NQUdJQwkJMHgwMGMwCiAKICNkZWZpbmUgR1BJT19EQl9NQVNLCQkweDAwMzAKICNkZWZpbmUgR1BJT19EQl9INgkJMHgwMDAwCiAKICNkZWZpbmUgR1BJT19TVF9PVVRQVVRfRU5BQkxFCTB4MDAwMQogI2RlZmluZSBHUElPX1NUX0hQX1JFQVIJCTB4MDAwMgorI2RlZmluZSBHUElPX1NUX01BR0lDCQkweDAwNDAKICNkZWZpbmUgR1BJT19TVF9IUAkJMHgwMDgwCiAKICNkZWZpbmUgSTJDX0RFVklDRV9QQ00xNzk2KGkpCSgweDk4ICsgKChpKSA8PCAxKSkJLyogMTAwMTEsIGlpLCAvVz0wICovCkBAIC0xODYsMTEgKzIyMywxMiBAQAogCXVuc2lnbmVkIGludCBkYWNzOwogCXU4IHBjbTE3OTZfcmVnc1s0XVs1XTsKIAl1bnNpZ25lZCBpbnQgY3VycmVudF9yYXRlOwotCWJvb2wgb3NfMTI4OworCWJvb2wgaDY7CiAJYm9vbCBocF9hY3RpdmU7CiAJczggaHBfZ2Fpbl9vZmZzZXQ7CiAJYm9vbCBoYXNfY3MyMDAwOwotCXU4IGNzMjAwMF9mdW5fY2ZnXzE7CisJdTggY3MyMDAwX3JlZ3NbMHgxZl07CisJYm9vbCBicm9rZW5faTJjOwogfTsKIAogc3RydWN0IHhvbmFyX2hkYXYgewpAQCAtMjQ5LDE2ICsyODcsMTQgQEAKIAlzdHJ1Y3QgeG9uYXJfcGNtMTc5eCAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAKIAlveHlnZW5fd3JpdGVfaTJjKGNoaXAsIEkyQ19ERVZJQ0VfQ1MyMDAwLCByZWcsIHZhbHVlKTsKLQlpZiAocmVnID09IENTMjAwMF9GVU5fQ0ZHXzEpCi0JCWRhdGEtPmNzMjAwMF9mdW5fY2ZnXzEgPSB2YWx1ZTsKKwlkYXRhLT5jczIwMDBfcmVnc1tyZWddID0gdmFsdWU7CiB9CiAKIHN0YXRpYyB2b2lkIGNzMjAwMF93cml0ZV9jYWNoZWQoc3RydWN0IG94eWdlbiAqY2hpcCwgdTggcmVnLCB1OCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgeG9uYXJfcGNtMTc5eCAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CiAKLQlpZiAocmVnICE9IENTMjAwMF9GVU5fQ0ZHXzEgfHwKLQkgICAgdmFsdWUgIT0gZGF0YS0+Y3MyMDAwX2Z1bl9jZmdfMSkKKwlpZiAodmFsdWUgIT0gZGF0YS0+Y3MyMDAwX3JlZ3NbcmVnXSkKIAkJY3MyMDAwX3dyaXRlKGNoaXAsIHJlZywgdmFsdWUpOwogfQogCkBAIC0yNjgsNiArMzA0LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlzOCBnYWluX29mZnNldDsKIAorCW1zbGVlcCgxKTsKIAlnYWluX29mZnNldCA9IGRhdGEtPmhwX2FjdGl2ZSA/IGRhdGEtPmhwX2dhaW5fb2Zmc2V0IDogMDsKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGFjczsgKytpKSB7CiAJCS8qIHNldCBBVExEIGJlZm9yZSBBVEwvQVRSICovCkBAIC0yODIsNiArMzE5LDcgQEAKIAkJcGNtMTc5Nl93cml0ZShjaGlwLCBpLCAyMCwKIAkJCSAgICAgIGRhdGEtPnBjbTE3OTZfcmVnc1swXVsyMCAtIFBDTTE3OTZfUkVHX0JBU0VdKTsKIAkJcGNtMTc5Nl93cml0ZShjaGlwLCBpLCAyMSwgMCk7CisJCWdhaW5fb2Zmc2V0ID0gMDsKIAl9CiB9CiAKQEAgLTI5MCwxMCArMzI4LDExIEBACiAJc3RydWN0IHhvbmFyX3BjbTE3OXggKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwogCiAJZGF0YS0+cGNtMTc5Nl9yZWdzWzBdWzE4IC0gUENNMTc5Nl9SRUdfQkFTRV0gPSBQQ00xNzk2X01VVEUgfAotCQlQQ00xNzk2X0RNRl9ESVNBQkxFRCB8IFBDTTE3OTZfRk1UXzI0X0xKVVNUIHwgUENNMTc5Nl9BVExEOworCQlQQ00xNzk2X0RNRl9ESVNBQkxFRCB8IFBDTTE3OTZfRk1UXzI0X0kyUyB8IFBDTTE3OTZfQVRMRDsKIAlkYXRhLT5wY20xNzk2X3JlZ3NbMF1bMTkgLSBQQ00xNzk2X1JFR19CQVNFXSA9CiAJCVBDTTE3OTZfRkxUX1NIQVJQIHwgUENNMTc5Nl9BVFNfMTsKLQlkYXRhLT5wY20xNzk2X3JlZ3NbMF1bMjAgLSBQQ00xNzk2X1JFR19CQVNFXSA9IFBDTTE3OTZfT1NfNjQ7CisJZGF0YS0+cGNtMTc5Nl9yZWdzWzBdWzIwIC0gUENNMTc5Nl9SRUdfQkFTRV0gPQorCQlkYXRhLT5oNiA/IFBDTTE3OTZfT1NfNjQgOiBQQ00xNzk2X09TXzEyODsKIAlwY20xNzk2X3JlZ2lzdGVyc19pbml0KGNoaXApOwogCWRhdGEtPmN1cnJlbnRfcmF0ZSA9IDQ4MDAwOwogfQpAQCAtMzM5LDE4ICszNzgsMjAgQEAKIAlveHlnZW5fd3JpdGUxNihjaGlwLCBPWFlHRU5fMldJUkVfQlVTX1NUQVRVUywKIAkJICAgICAgIE9YWUdFTl8yV0lSRV9MRU5HVEhfOCB8CiAJCSAgICAgICBPWFlHRU5fMldJUkVfSU5URVJSVVBUX01BU0sgfAotCQkgICAgICAgT1hZR0VOXzJXSVJFX1NQRUVEX0ZBU1QpOworCQkgICAgICAgT1hZR0VOXzJXSVJFX1NQRUVEX1NUQU5EQVJEKTsKIAogCWRhdGEtPnBjbTE3OXguZ2VuZXJpYy5hbnRpX3BvcF9kZWxheSA9IDEwMDsKIAlkYXRhLT5wY20xNzl4LmdlbmVyaWMub3V0cHV0X2VuYWJsZV9iaXQgPSBHUElPX0hEQVZfT1VUUFVUX0VOQUJMRTsKIAlkYXRhLT5wY20xNzl4LmdlbmVyaWMuZXh0X3Bvd2VyX3JlZyA9IE9YWUdFTl9HUElfREFUQTsKIAlkYXRhLT5wY20xNzl4LmdlbmVyaWMuZXh0X3Bvd2VyX2ludF9yZWcgPSBPWFlHRU5fR1BJX0lOVEVSUlVQVF9NQVNLOwogCWRhdGEtPnBjbTE3OXguZ2VuZXJpYy5leHRfcG93ZXJfYml0ID0gR1BJX0VYVF9QT1dFUjsKLQlkYXRhLT5wY20xNzl4LmRhY3MgPSBjaGlwLT5tb2RlbC5wcml2YXRlX2RhdGEgPyA0IDogMTsKKwlkYXRhLT5wY20xNzl4LmRhY3MgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXIgLyAyOworCWRhdGEtPnBjbTE3OXguaDYgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXIgPiAyOwogCiAJcGNtMTc5Nl9pbml0KGNoaXApOwogCi0Jb3h5Z2VuX3NldF9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fQ09OVFJPTCwgR1BJT19JTlBVVF9ST1VURSk7CisJb3h5Z2VuX3NldF9iaXRzMTYoY2hpcCwgT1hZR0VOX0dQSU9fQ09OVFJPTCwKKwkJCSAgR1BJT19IREFWX01BR0lDIHwgR1BJT19JTlBVVF9ST1VURSk7CiAJb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLCBHUElPX0lOUFVUX1JPVVRFKTsKIAogCXhvbmFyX2luaXRfY3M1M3gxKGNoaXApOwpAQCAtMzY3LDcgKzQwOCw3IEBACiAJb3h5Z2VuX3dyaXRlMTYoY2hpcCwgT1hZR0VOXzJXSVJFX0JVU19TVEFUVVMsCiAJCSAgICAgICBPWFlHRU5fMldJUkVfTEVOR1RIXzggfAogCQkgICAgICAgT1hZR0VOXzJXSVJFX0lOVEVSUlVQVF9NQVNLIHwKLQkJICAgICAgIE9YWUdFTl8yV0lSRV9TUEVFRF9GQVNUKTsKKwkJICAgICAgIE9YWUdFTl8yV0lSRV9TUEVFRF9TVEFOREFSRCk7CiB9CiAKIHN0YXRpYyB2b2lkIHhvbmFyX3N0X2luaXRfY29tbW9uKHN0cnVjdCBveHlnZW4gKmNoaXApCkBAIC0zNzUsMTMgKzQxNiwxNCBAQAogCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAogCWRhdGEtPmdlbmVyaWMub3V0cHV0X2VuYWJsZV9iaXQgPSBHUElPX1NUX09VVFBVVF9FTkFCTEU7Ci0JZGF0YS0+ZGFjcyA9IGNoaXAtPm1vZGVsLnByaXZhdGVfZGF0YSA/IDQgOiAxOworCWRhdGEtPmRhY3MgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXIgLyAyOwogCWRhdGEtPmhwX2dhaW5fb2Zmc2V0ID0gMiotMTg7CiAKIAlwY20xNzk2X2luaXQoY2hpcCk7CiAKIAlveHlnZW5fc2V0X2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLAotCQkJICBHUElPX0lOUFVUX1JPVVRFIHwgR1BJT19TVF9IUF9SRUFSIHwgR1BJT19TVF9IUCk7CisJCQkgIEdQSU9fSU5QVVRfUk9VVEUgfCBHUElPX1NUX0hQX1JFQVIgfAorCQkJICBHUElPX1NUX01BR0lDIHwgR1BJT19TVF9IUCk7CiAJb3h5Z2VuX2NsZWFyX2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19EQVRBLAogCQkJICAgIEdQSU9fSU5QVVRfUk9VVEUgfCBHUElPX1NUX0hQX1JFQVIgfCBHUElPX1NUX0hQKTsKIApAQCAtNDEwLDkgKzQ1MiwxMSBAQAogCWNzMjAwMF93cml0ZShjaGlwLCBDUzIwMDBfUkFUSU9fMCArIDEsIDB4MTApOwogCWNzMjAwMF93cml0ZShjaGlwLCBDUzIwMDBfUkFUSU9fMCArIDIsIDB4MDApOwogCWNzMjAwMF93cml0ZShjaGlwLCBDUzIwMDBfUkFUSU9fMCArIDMsIDB4MDApOwotCWNzMjAwMF93cml0ZShjaGlwLCBDUzIwMDBfRlVOX0NGR18xLCBkYXRhLT5jczIwMDBfZnVuX2NmZ18xKTsKKwljczIwMDBfd3JpdGUoY2hpcCwgQ1MyMDAwX0ZVTl9DRkdfMSwKKwkJICAgICBkYXRhLT5jczIwMDBfcmVnc1tDUzIwMDBfRlVOX0NGR18xXSk7CiAJY3MyMDAwX3dyaXRlKGNoaXAsIENTMjAwMF9GVU5fQ0ZHXzIsIDApOwogCWNzMjAwMF93cml0ZShjaGlwLCBDUzIwMDBfR0xPQkFMX0NGRywgQ1MyMDAwX0VOX0RFVl9DRkdfMik7CisJbXNsZWVwKDMpOyAvKiBQTEwgbG9jayBkZWxheSAqLwogfQogCiBzdGF0aWMgdm9pZCB4b25hcl9zdF9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCkBAIC00MjAsMTMgKzQ2NCwxOCBAQAogCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAogCWRhdGEtPmdlbmVyaWMuYW50aV9wb3BfZGVsYXkgPSAxMDA7CisJZGF0YS0+aDYgPSBjaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfbWl4ZXIgPiAyOwogCWRhdGEtPmhhc19jczIwMDAgPSAxOwotCWRhdGEtPmNzMjAwMF9mdW5fY2ZnXzEgPSBDUzIwMDBfUkVGX0NMS19ESVZfMTsKKwlkYXRhLT5jczIwMDBfcmVnc1tDUzIwMDBfRlVOX0NGR18xXSA9IENTMjAwMF9SRUZfQ0xLX0RJVl8xOworCWRhdGEtPmJyb2tlbl9pMmMgPSB0cnVlOwogCiAJb3h5Z2VuX3dyaXRlMTYoY2hpcCwgT1hZR0VOX0kyU19BX0ZPUk1BVCwKLQkJICAgICAgIE9YWUdFTl9SQVRFXzQ4MDAwIHwgT1hZR0VOX0kyU19GT1JNQVRfSTJTIHwKLQkJICAgICAgIE9YWUdFTl9JMlNfTUNMS18xMjggfCBPWFlHRU5fSTJTX0JJVFNfMTYgfAotCQkgICAgICAgT1hZR0VOX0kyU19NQVNURVIgfCBPWFlHRU5fSTJTX0JDTEtfNjQpOworCQkgICAgICAgT1hZR0VOX1JBVEVfNDgwMDAgfAorCQkgICAgICAgT1hZR0VOX0kyU19GT1JNQVRfSTJTIHwKKwkJICAgICAgIE9YWUdFTl9JMlNfTUNMSyhkYXRhLT5oNiA/IE1DTEtfMjU2IDogTUNMS181MTIpIHwKKwkJICAgICAgIE9YWUdFTl9JMlNfQklUU18xNiB8CisJCSAgICAgICBPWFlHRU5fSTJTX01BU1RFUiB8CisJCSAgICAgICBPWFlHRU5fSTJTX0JDTEtfNjQpOwogCiAJeG9uYXJfc3RfaW5pdF9pMmMoY2hpcCk7CiAJY3MyMDAwX3JlZ2lzdGVyc19pbml0KGNoaXApOwpAQCAtNTA3LDQ0ICs1NTYsMTYgQEAKIAl4b25hcl9zdHhfcmVzdW1lKGNoaXApOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG1jbGtfZnJvbV9yYXRlKHN0cnVjdCBveHlnZW4gKmNoaXAsIHVuc2lnbmVkIGludCByYXRlKQotewotCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKLQotCWlmIChyYXRlIDw9IDMyMDAwKQotCQlyZXR1cm4gT1hZR0VOX0kyU19NQ0xLXzUxMjsKLQllbHNlIGlmIChyYXRlIDw9IDQ4MDAwICYmIGRhdGEtPm9zXzEyOCkKLQkJcmV0dXJuIE9YWUdFTl9JMlNfTUNMS181MTI7Ci0JZWxzZSBpZiAocmF0ZSA8PSA5NjAwMCkKLQkJcmV0dXJuIE9YWUdFTl9JMlNfTUNMS18yNTY7Ci0JZWxzZQotCQlyZXR1cm4gT1hZR0VOX0kyU19NQ0xLXzEyODsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfcGNtMTc5Nl9pMnNfbWNsayhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAotCQkJCQkgdW5zaWduZWQgaW50IGNoYW5uZWwsCi0JCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlpZiAoY2hhbm5lbCA9PSBQQ01fTVVMVElDSCkKLQkJcmV0dXJuIG1jbGtfZnJvbV9yYXRlKGNoaXAsIHBhcmFtc19yYXRlKHBhcmFtcykpOwotCWVsc2UKLQkJcmV0dXJuIG94eWdlbl9kZWZhdWx0X2kyc19tY2xrKGNoaXAsIGNoYW5uZWwsIHBhcmFtcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHVwZGF0ZV9wY20xNzk2X292ZXJzYW1wbGluZyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogewogCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1OCByZWc7CiAKLQlpZiAoZGF0YS0+Y3VycmVudF9yYXRlIDw9IDMyMDAwKQorCWlmIChkYXRhLT5jdXJyZW50X3JhdGUgPD0gNDgwMDAgJiYgIWRhdGEtPmg2KQogCQlyZWcgPSBQQ00xNzk2X09TXzEyODsKLQllbHNlIGlmIChkYXRhLT5jdXJyZW50X3JhdGUgPD0gNDgwMDAgJiYgZGF0YS0+b3NfMTI4KQotCQlyZWcgPSBQQ00xNzk2X09TXzEyODsKLQllbHNlIGlmIChkYXRhLT5jdXJyZW50X3JhdGUgPD0gOTYwMDAgfHwgZGF0YS0+b3NfMTI4KQotCQlyZWcgPSBQQ00xNzk2X09TXzY0OwogCWVsc2UKLQkJcmVnID0gUENNMTc5Nl9PU18zMjsKKwkJcmVnID0gUENNMTc5Nl9PU182NDsKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+ZGFjczsgKytpKQogCQlwY20xNzk2X3dyaXRlX2NhY2hlZChjaGlwLCBpLCAyMCwgcmVnKTsKIH0KQEAgLTU1NCw2ICs1NzUsNyBAQAogewogCXN0cnVjdCB4b25hcl9wY20xNzl4ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKIAorCW1zbGVlcCgxKTsKIAlkYXRhLT5jdXJyZW50X3JhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCXVwZGF0ZV9wY20xNzk2X292ZXJzYW1wbGluZyhjaGlwKTsKIH0KQEAgLTU3MCw2ICs1OTIsNyBAQAogCQkJCSAgICAgKyBnYWluX29mZnNldCk7CiAJCXBjbTE3OTZfd3JpdGVfY2FjaGVkKGNoaXAsIGksIDE3LCBjaGlwLT5kYWNfdm9sdW1lW2kgKiAyICsgMV0KIAkJCQkgICAgICsgZ2Fpbl9vZmZzZXQpOworCQlnYWluX29mZnNldCA9IDA7CiAJfQogfQogCkBAIC01NzksNyArNjAyLDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAl1OCB2YWx1ZTsKIAotCXZhbHVlID0gUENNMTc5Nl9ETUZfRElTQUJMRUQgfCBQQ00xNzk2X0ZNVF8yNF9MSlVTVCB8IFBDTTE3OTZfQVRMRDsKKwl2YWx1ZSA9IFBDTTE3OTZfRE1GX0RJU0FCTEVEIHwgUENNMTc5Nl9GTVRfMjRfSTJTIHwgUENNMTc5Nl9BVExEOwogCWlmIChjaGlwLT5kYWNfbXV0ZSkKIAkJdmFsdWUgfD0gUENNMTc5Nl9NVVRFOwogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5kYWNzOyArK2kpCkBAIC01OTIsNDUgKzYxNSwzNSBAQAogCXU4IHJhdGVfbWNsaywgcmVnOwogCiAJc3dpdGNoIChyYXRlKSB7Ci0JCS8qIFhYWCBXaHkgaXMgdGhlIEkyUyBBIE1DTEsgaGFsZiB0aGUgYWN0dWFsIEkyUyBNQ0xLPyAqLwogCWNhc2UgMzIwMDA6Ci0JCXJhdGVfbWNsayA9IE9YWUdFTl9SQVRFXzMyMDAwIHwgT1hZR0VOX0kyU19NQ0xLXzI1NjsKKwljYXNlIDY0MDAwOgorCQlyYXRlX21jbGsgPSBPWFlHRU5fUkFURV8zMjAwMDsKIAkJYnJlYWs7CiAJY2FzZSA0NDEwMDoKLQkJaWYgKGRhdGEtPm9zXzEyOCkKLQkJCXJhdGVfbWNsayA9IE9YWUdFTl9SQVRFXzQ0MTAwIHwgT1hZR0VOX0kyU19NQ0xLXzI1NjsKLQkJZWxzZQotCQkJcmF0ZV9tY2xrID0gT1hZR0VOX1JBVEVfNDQxMDAgfCBPWFlHRU5fSTJTX01DTEtfMTI4OwotCQlicmVhazsKLQlkZWZhdWx0OiAvKiA0ODAwMCAqLwotCQlpZiAoZGF0YS0+b3NfMTI4KQotCQkJcmF0ZV9tY2xrID0gT1hZR0VOX1JBVEVfNDgwMDAgfCBPWFlHRU5fSTJTX01DTEtfMjU2OwotCQllbHNlCi0JCQlyYXRlX21jbGsgPSBPWFlHRU5fUkFURV80ODAwMCB8IE9YWUdFTl9JMlNfTUNMS18xMjg7Ci0JCWJyZWFrOwotCWNhc2UgNjQwMDA6Ci0JCXJhdGVfbWNsayA9IE9YWUdFTl9SQVRFXzMyMDAwIHwgT1hZR0VOX0kyU19NQ0xLXzI1NjsKLQkJYnJlYWs7CiAJY2FzZSA4ODIwMDoKLQkJcmF0ZV9tY2xrID0gT1hZR0VOX1JBVEVfNDQxMDAgfCBPWFlHRU5fSTJTX01DTEtfMjU2OwotCQlicmVhazsKLQljYXNlIDk2MDAwOgotCQlyYXRlX21jbGsgPSBPWFlHRU5fUkFURV80ODAwMCB8IE9YWUdFTl9JMlNfTUNMS18yNTY7Ci0JCWJyZWFrOwogCWNhc2UgMTc2NDAwOgotCQlyYXRlX21jbGsgPSBPWFlHRU5fUkFURV80NDEwMCB8IE9YWUdFTl9JMlNfTUNMS18yNTY7CisJCXJhdGVfbWNsayA9IE9YWUdFTl9SQVRFXzQ0MTAwOwogCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKIAljYXNlIDE5MjAwMDoKLQkJcmF0ZV9tY2xrID0gT1hZR0VOX1JBVEVfNDgwMDAgfCBPWFlHRU5fSTJTX01DTEtfMjU2OworCQlyYXRlX21jbGsgPSBPWFlHRU5fUkFURV80ODAwMDsKIAkJYnJlYWs7CiAJfQorCisJaWYgKHJhdGUgPD0gOTYwMDAgJiYgKHJhdGUgPiA0ODAwMCB8fCBkYXRhLT5oNikpIHsKKwkJcmF0ZV9tY2xrIHw9IE9YWUdFTl9JMlNfTUNMSyhNQ0xLXzI1Nik7CisJCXJlZyA9IENTMjAwMF9SRUZfQ0xLX0RJVl8xOworCX0gZWxzZSB7CisJCXJhdGVfbWNsayB8PSBPWFlHRU5fSTJTX01DTEsoTUNMS181MTIpOworCQlyZWcgPSBDUzIwMDBfUkVGX0NMS19ESVZfMjsKKwl9CisKIAlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0kyU19BX0ZPUk1BVCwgcmF0ZV9tY2xrLAogCQkJICAgICAgT1hZR0VOX0kyU19SQVRFX01BU0sgfCBPWFlHRU5fSTJTX01DTEtfTUFTSyk7Ci0JaWYgKChyYXRlX21jbGsgJiBPWFlHRU5fSTJTX01DTEtfTUFTSykgPD0gT1hZR0VOX0kyU19NQ0xLXzEyOCkKLQkJcmVnID0gQ1MyMDAwX1JFRl9DTEtfRElWXzE7Ci0JZWxzZQotCQlyZWcgPSBDUzIwMDBfUkVGX0NMS19ESVZfMjsKIAljczIwMDBfd3JpdGVfY2FjaGVkKGNoaXAsIENTMjAwMF9GVU5fQ0ZHXzEsIHJlZyk7CisJbXNsZWVwKDMpOyAvKiBQTEwgbG9jayBkZWxheSAqLwogfQogCiBzdGF0aWMgdm9pZCBzZXRfc3RfcGFyYW1zKHN0cnVjdCBveHlnZW4gKmNoaXAsCkBAIC02NjUsMTMgKzY3OCw3IEBACiAJCSJTaGFycCBSb2xsLW9mZiIsICJTbG93IFJvbGwtb2ZmIgogCX07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDIpCi0JCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDIsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCByb2xsb2ZmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCkBAIC03MTksNTcgKzcyNiwxMyBAQAogCS5wdXQgPSByb2xsb2ZmX3B1dCwKIH07CiAKLXN0YXRpYyBpbnQgb3NfMTI4X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzWzJdID0geyAiNjR4IiwgIjEyOHgiIH07Ci0KLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDIpCi0JCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3NfMTI4X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCi0JCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQotewotCXN0cnVjdCBveHlnZW4gKmNoaXAgPSBjdGwtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgeG9uYXJfcGNtMTc5eCAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0KLQl2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZGF0YS0+b3NfMTI4OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9zXzEyOF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLAotCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKLXsKLQlzdHJ1Y3Qgb3h5Z2VuICpjaGlwID0gY3RsLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHhvbmFyX3BjbTE3OXggKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwotCWludCBjaGFuZ2VkOwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoYW5nZWQgPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICE9IGRhdGEtPm9zXzEyODsKLQlpZiAoY2hhbmdlZCkgewotCQlkYXRhLT5vc18xMjggPSB2YWx1ZS0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCQlpZiAoZGF0YS0+aGFzX2NzMjAwMCkKLQkJCXVwZGF0ZV9jczIwMDBfcmF0ZShjaGlwLCBkYXRhLT5jdXJyZW50X3JhdGUpOwotCQlveHlnZW5fd3JpdGUxNl9tYXNrZWQoY2hpcCwgT1hZR0VOX0kyU19NVUxUSUNIX0ZPUk1BVCwKLQkJCQkgICAgICBtY2xrX2Zyb21fcmF0ZShjaGlwLCBkYXRhLT5jdXJyZW50X3JhdGUpLAotCQkJCSAgICAgIE9YWUdFTl9JMlNfTUNMS19NQVNLKTsKLQkJdXBkYXRlX3BjbTE3OTZfb3ZlcnNhbXBsaW5nKGNoaXApOwotCX0KLQltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG9zXzEyOF9jb250cm9sID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhkYXZfaGRtaV9jb250cm9sID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gIkRBQyBPdmVyc2FtcGxpbmcgUGxheWJhY2sgRW51bSIsCi0JLmluZm8gPSBvc18xMjhfaW5mbywKLQkuZ2V0ID0gb3NfMTI4X2dldCwKLQkucHV0ID0gb3NfMTI4X3B1dCwKKwkubmFtZSA9ICJIRE1JIFBsYXliYWNrIFN3aXRjaCIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvLAorCS5nZXQgPSB4b25hcl9ncGlvX2JpdF9zd2l0Y2hfZ2V0LAorCS5wdXQgPSB4b25hcl9ncGlvX2JpdF9zd2l0Y2hfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gR1BJT19IREFWX09VVFBVVF9FTkFCTEUgfCBYT05BUl9HUElPX0JJVF9JTlZFUlQsCiB9OwogCiBzdGF0aWMgaW50IHN0X291dHB1dF9zd2l0Y2hfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGwsCkBAIC03NzksMTMgKzc0Miw3IEBACiAJCSJTcGVha2VycyIsICJIZWFkcGhvbmVzIiwgIkZQIEhlYWRwaG9uZXMiCiAJfTsKIAotCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JaW5mby0+Y291bnQgPSAxOwotCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwotCWlmIChpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gMykKLQkJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMjsKLQlzdHJjcHkoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBuYW1lc1tpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMywgbmFtZXMpOwogfQogCiBzdGF0aWMgaW50IHN0X291dHB1dF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwKQEAgLTg0MCwxMyArNzk3LDcgQEAKIAkJIjwgNjQgb2htcyIsICI2NC0zMDAgb2htcyIsICIzMDAtNjAwIG9obXMiCiAJfTsKIAotCWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JaW5mby0+Y291bnQgPSAxOwotCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAzOwotCWlmIChpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAyKQotCQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOwotCXN0cmNweShpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIG5hbWVzW2luZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwotCXJldHVybiAwOworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyhpbmZvLCAxLCAzLCBuYW1lcyk7CiB9CiAKIHN0YXRpYyBpbnQgc3RfaHBfdm9sdW1lX29mZnNldF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLApAQCAtOTI4LDE2ICs4NzksMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB4b25hcl9zdF9oNl9jb250cm9sX2ZpbHRlcihzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqdGVtcGxhdGUpCit7CisJaWYgKCFzdHJuY21wKHRlbXBsYXRlLT5uYW1lLCAiTWFzdGVyIFBsYXliYWNrICIsIDE2KSkKKwkJLyogbm8gdm9sdW1lL211dGUsIGFzIEnCskMgdG8gdGhlIHRoaXJkIERBQyBkb2VzIG5vdCB3b3JrICovCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFkZF9wY20xNzk2X2NvbnRyb2xzKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CisJc3RydWN0IHhvbmFyX3BjbTE3OXggKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOwogCWludCBlcnI7CiAKLQllcnIgPSBzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBzbmRfY3RsX25ldzEoJnJvbGxvZmZfY29udHJvbCwgY2hpcCkpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmb3NfMTI4X2NvbnRyb2wsIGNoaXApKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlpZiAoIWRhdGEtPmJyb2tlbl9pMmMpIHsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2hpcC0+Y2FyZCwKKwkJCQkgIHNuZF9jdGxfbmV3MSgmcm9sbG9mZl9jb250cm9sLCBjaGlwKSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk1Niw3ICs5MTYsMTUgQEAKIAogc3RhdGljIGludCB4b25hcl9oZGF2X21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKLQlyZXR1cm4gYWRkX3BjbTE3OTZfY29udHJvbHMoY2hpcCk7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIHNuZF9jdGxfbmV3MSgmaGRhdl9oZG1pX2NvbnRyb2wsIGNoaXApKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhZGRfcGNtMTc5Nl9jb250cm9scyhjaGlwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB4b25hcl9zdF9taXhlcl9pbml0KHN0cnVjdCBveHlnZW4gKmNoaXApCkBAIC05NzYsNiArOTQ0LDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfcGNtMTc5Nl9yZWdpc3RlcnMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IHhvbmFyX3BjbTE3OXggKmRhdGEgPSBjaGlwLT5tb2RlbF9kYXRhOworCXVuc2lnbmVkIGludCBkYWMsIGk7CisKKwlmb3IgKGRhYyA9IDA7IGRhYyA8IGRhdGEtPmRhY3M7ICsrZGFjKSB7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuUENNMTc5NiAldToiLCBkYWMgKyAxKTsKKwkJZm9yIChpID0gMDsgaSA8IDU7ICsraSkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAlMDJ4IiwKKwkJCQkgICAgZGF0YS0+cGNtMTc5Nl9yZWdzW2RhY11baV0pOworCX0KKwlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2NzMjAwMF9yZWdpc3RlcnMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCQkgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgeG9uYXJfcGNtMTc5eCAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoZGF0YS0+aGFzX2NzMjAwMCkgeworCQlzbmRfaXByaW50ZihidWZmZXIsICJcbkNTMjAwMDpcbjAwOiAgICIpOworCQlmb3IgKGkgPSAxOyBpIDwgMHgxMDsgKytpKQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICUwMngiLCBkYXRhLT5jczIwMDBfcmVnc1tpXSk7CisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuMTA6Iik7CisJCWZvciAoaSA9IDB4MTA7IGkgPCAweDFmOyArK2kpCisJCQlzbmRfaXByaW50ZihidWZmZXIsICIgJTAyeCIsIGRhdGEtPmNzMjAwMF9yZWdzW2ldKTsKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc3RfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJZHVtcF9wY20xNzk2X3JlZ2lzdGVycyhjaGlwLCBidWZmZXIpOworCWR1bXBfY3MyMDAwX3JlZ2lzdGVycyhjaGlwLCBidWZmZXIpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9kMiA9IHsKIAkubG9uZ25hbWUgPSAiQXN1cyBWaXJ0dW9zbyAyMDAiLAogCS5jaGlwID0gIkFWMjAwIiwKQEAgLTk4NSwxMSArOTkyLDExIEBACiAJLmNsZWFudXAgPSB4b25hcl9kMl9jbGVhbnVwLAogCS5zdXNwZW5kID0geG9uYXJfZDJfc3VzcGVuZCwKIAkucmVzdW1lID0geG9uYXJfZDJfcmVzdW1lLAotCS5nZXRfaTJzX21jbGsgPSBnZXRfcGNtMTc5Nl9pMnNfbWNsaywKIAkuc2V0X2RhY19wYXJhbXMgPSBzZXRfcGNtMTc5Nl9wYXJhbXMsCiAJLnNldF9hZGNfcGFyYW1zID0geG9uYXJfc2V0X2NzNTN4MV9wYXJhbXMsCiAJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3BjbTE3OTZfdm9sdW1lLAogCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfcGNtMTc5Nl9tdXRlLAorCS5kdW1wX3JlZ2lzdGVycyA9IGR1bXBfcGNtMTc5Nl9yZWdpc3RlcnMsCiAJLmRhY190bHYgPSBwY20xNzk2X2RiX3NjYWxlLAogCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX3BjbTE3OXgpLAogCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfApAQCAtOTk5LDEzICsxMDA2LDE2IEBACiAJCQkgTUlESV9PVVRQVVQgfAogCQkJIE1JRElfSU5QVVQgfAogCQkJIEFDOTdfQ0RfSU5QVVQsCi0JLmRhY19jaGFubmVscyA9IDgsCisJLmRhY19jaGFubmVsc19wY20gPSA4LAorCS5kYWNfY2hhbm5lbHNfbWl4ZXIgPSA4LAogCS5kYWNfdm9sdW1lX21pbiA9IDI1NSAtIDIqNjAsCiAJLmRhY192b2x1bWVfbWF4ID0gMjU1LAogCS5taXNjX2ZsYWdzID0gT1hZR0VOX01JU0NfTUlESSwKIAkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fU1BJIHwKIAkJCSAgT1hZR0VOX0ZVTkNUSU9OX0VOQUJMRV9TUElfNF81LAotCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAorCS5kYWNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoNTEyLCAxMjgsIDEyOCksCisJLmFkY19tY2xrcyA9IE9YWUdFTl9NQ0xLUygyNTYsIDEyOCwgMTI4KSwKKwkuZGFjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9JMlMsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9OwogCkBAIC0xMDE4LDI1ICsxMDI4LDI4IEBACiAJLnN1c3BlbmQgPSB4b25hcl9oZGF2X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHhvbmFyX2hkYXZfcmVzdW1lLAogCS5wY21faGFyZHdhcmVfZmlsdGVyID0geG9uYXJfaGRtaV9wY21faGFyZHdhcmVfZmlsdGVyLAotCS5nZXRfaTJzX21jbGsgPSBnZXRfcGNtMTc5Nl9pMnNfbWNsaywKIAkuc2V0X2RhY19wYXJhbXMgPSBzZXRfaGRhdl9wYXJhbXMsCiAJLnNldF9hZGNfcGFyYW1zID0geG9uYXJfc2V0X2NzNTN4MV9wYXJhbXMsCiAJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3BjbTE3OTZfdm9sdW1lLAogCS51cGRhdGVfZGFjX211dGUgPSB1cGRhdGVfcGNtMTc5Nl9tdXRlLAogCS51YXJ0X2lucHV0ID0geG9uYXJfaGRtaV91YXJ0X2lucHV0LAogCS5hYzk3X3N3aXRjaCA9IHhvbmFyX2xpbmVfbWljX2FjOTdfc3dpdGNoLAorCS5kdW1wX3JlZ2lzdGVycyA9IGR1bXBfcGNtMTc5Nl9yZWdpc3RlcnMsCiAJLmRhY190bHYgPSBwY20xNzk2X2RiX3NjYWxlLAogCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX2hkYXYpLAogCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAogCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAogCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yIHwKIAkJCSBDQVBUVVJFXzFfRlJPTV9TUERJRiwKLQkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX2NoYW5uZWxzX3BjbSA9IDgsCisJLmRhY19jaGFubmVsc19taXhlciA9IDIsCiAJLmRhY192b2x1bWVfbWluID0gMjU1IC0gMio2MCwKIAkuZGFjX3ZvbHVtZV9tYXggPSAyNTUsCiAJLm1pc2NfZmxhZ3MgPSBPWFlHRU5fTUlTQ19NSURJLAogCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl8yV0lSRSwKLQkuZGFjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDUxMiwgMTI4LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCksCisJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfSTJTLAogCS5hZGNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0xKVVNULAogfTsKIApAQCAtMTA0OCwyMiArMTA2MSwyNiBAQAogCS5jbGVhbnVwID0geG9uYXJfc3RfY2xlYW51cCwKIAkuc3VzcGVuZCA9IHhvbmFyX3N0X3N1c3BlbmQsCiAJLnJlc3VtZSA9IHhvbmFyX3N0X3Jlc3VtZSwKLQkuZ2V0X2kyc19tY2xrID0gZ2V0X3BjbTE3OTZfaTJzX21jbGssCiAJLnNldF9kYWNfcGFyYW1zID0gc2V0X3N0X3BhcmFtcywKIAkuc2V0X2FkY19wYXJhbXMgPSB4b25hcl9zZXRfY3M1M3gxX3BhcmFtcywKIAkudXBkYXRlX2RhY192b2x1bWUgPSB1cGRhdGVfcGNtMTc5Nl92b2x1bWUsCiAJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV9wY20xNzk2X211dGUsCiAJLmFjOTdfc3dpdGNoID0geG9uYXJfbGluZV9taWNfYWM5N19zd2l0Y2gsCisJLmR1bXBfcmVnaXN0ZXJzID0gZHVtcF9zdF9yZWdpc3RlcnMsCiAJLmRhY190bHYgPSBwY20xNzk2X2RiX3NjYWxlLAogCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX3BjbTE3OXgpLAogCS5kZXZpY2VfY29uZmlnID0gUExBWUJBQ0tfMF9UT19JMlMgfAogCQkJIFBMQVlCQUNLXzFfVE9fU1BESUYgfAotCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yLAotCS5kYWNfY2hhbm5lbHMgPSAyLAorCQkJIENBUFRVUkVfMF9GUk9NX0kyU18yIHwKKwkJCSBBQzk3X0ZNSUNfU1dJVENILAorCS5kYWNfY2hhbm5lbHNfcGNtID0gMiwKKwkuZGFjX2NoYW5uZWxzX21peGVyID0gMiwKIAkuZGFjX3ZvbHVtZV9taW4gPSAyNTUgLSAyKjYwLAogCS5kYWNfdm9sdW1lX21heCA9IDI1NSwKIAkuZnVuY3Rpb25fZmxhZ3MgPSBPWFlHRU5fRlVOQ1RJT05fMldJUkUsCi0JLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmRhY19tY2xrcyA9IE9YWUdFTl9NQ0xLUyg1MTIsIDEyOCwgMTI4KSwKKwkuYWRjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMTI4LCAxMjgpLAorCS5kYWNfaTJzX2Zvcm1hdCA9IE9YWUdFTl9JMlNfRk9STUFUX0kyUywKIAkuYWRjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9MSlVTVCwKIH07CiAKQEAgLTEwODksNyArMTEwNiw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBHUElPX0RCX0g2OgogCQkJY2hpcC0+bW9kZWwuc2hvcnRuYW1lID0gIlhvbmFyIEhEQVYxLjMrSDYiOwotCQkJY2hpcC0+bW9kZWwucHJpdmF0ZV9kYXRhID0gMTsKKwkJCWNoaXAtPm1vZGVsLmRhY19jaGFubmVsc19taXhlciA9IDg7CisJCQljaGlwLT5tb2RlbC5kYWNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTExMDIsOCArMTEyMCwxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgR1BJT19EQl9INjoKIAkJCWNoaXAtPm1vZGVsLnNob3J0bmFtZSA9ICJYb25hciBTVCtINiI7Ci0JCQljaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHMgPSA4OwotCQkJY2hpcC0+bW9kZWwucHJpdmF0ZV9kYXRhID0gMTsKKwkJCWNoaXAtPm1vZGVsLmNvbnRyb2xfZmlsdGVyID0geG9uYXJfc3RfaDZfY29udHJvbF9maWx0ZXI7CisJCQljaGlwLT5tb2RlbC5kYWNfY2hhbm5lbHNfcGNtID0gODsKKwkJCWNoaXAtPm1vZGVsLmRhY19jaGFubmVsc19taXhlciA9IDg7CisJCQljaGlwLT5tb2RlbC5kYWNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAxMjgsIDEyOCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTExMTQsOSArMTEzNCw2IEBACiAJCWNoaXAtPm1vZGVsLnJlc3VtZSA9IHhvbmFyX3N0eF9yZXN1bWU7CiAJCWNoaXAtPm1vZGVsLnNldF9kYWNfcGFyYW1zID0gc2V0X3BjbTE3OTZfcGFyYW1zOwogCQlicmVhazsKLQljYXNlIDB4ODM1ZToKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGhlIEhEQVYxLjMgU2xpbSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi94b25hcl93bTg3eDYuYyBiL3NvdW5kL3BjaS9veHlnZW4veG9uYXJfd204N3g2LmMKaW5kZXggMjAwZjc2MC4uNDJkMWFiMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi94b25hcl93bTg3eDYuYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL3hvbmFyX3dtODd4Ni5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGNhcmQgZHJpdmVyIGZvciBtb2RlbHMgd2l0aCBXTTg3NzYvV004NzY2IERBQ3MgKFhvbmFyIERTKQorICogY2FyZCBkcml2ZXIgZm9yIG1vZGVscyB3aXRoIFdNODc3Ni9XTTg3NjYgREFDcyAoWG9uYXIgRFMvSERBVjEuMyBTbGltKQogICoKICAqIENvcHlyaWdodCAoYykgQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CiAgKgpAQCAtMjIsMjYgKzIyLDQ4IEBACiAgKgogICogQ01JODc4ODoKICAqCi0gKiBTUEkgMCAtPiBXTTg3NjYgKHN1cnJvdW5kLCBjZW50ZXIvTEZFLCBiYWNrKQotICogU1BJIDEgLT4gV004Nzc2IChmcm9udCwgaW5wdXQpCisgKiAgIFNQSSAwIC0+IFdNODc2NiAoc3Vycm91bmQsIGNlbnRlci9MRkUsIGJhY2spCisgKiAgIFNQSSAxIC0+IFdNODc3NiAoZnJvbnQsIGlucHV0KQogICoKLSAqIEdQSU8gNCA8LSBoZWFkcGhvbmUgZGV0ZWN0LCAwID0gcGx1Z2dlZAotICogR1BJTyA2IC0+IHJvdXRlIGlucHV0IGphY2sgdG8gbWljLWluICgwKSBvciBsaW5lLWluICgxKQotICogR1BJTyA3IC0+IGVuYWJsZSBvdXRwdXQgdG8gZnJvbnQgTC9SIHNwZWFrZXIgY2hhbm5lbHMKLSAqIEdQSU8gOCAtPiBlbmFibGUgb3V0cHV0IHRvIG90aGVyIHNwZWFrZXIgY2hhbm5lbHMgYW5kIGZyb250IHBhbmVsIGhlYWRwaG9uZQorICogICBHUElPIDQgPC0gaGVhZHBob25lIGRldGVjdCwgMCA9IHBsdWdnZWQKKyAqICAgR1BJTyA2IC0+IHJvdXRlIGlucHV0IGphY2sgdG8gbWljLWluICgwKSBvciBsaW5lLWluICgxKQorICogICBHUElPIDcgLT4gZW5hYmxlIG91dHB1dCB0byBmcm9udCBML1Igc3BlYWtlciBjaGFubmVscworICogICBHUElPIDggLT4gZW5hYmxlIG91dHB1dCB0byBvdGhlciBzcGVha2VyIGNoYW5uZWxzIGFuZCBmcm9udCBwYW5lbCBoZWFkcGhvbmUKICAqCi0gKiBXTTg3NjY6CisgKiBXTTg3NzY6CiAgKgotICogaW5wdXQgMSA8LSBsaW5lCi0gKiBpbnB1dCAyIDwtIG1pYwotICogaW5wdXQgMyA8LSBmcm9udCBtaWMKLSAqIGlucHV0IDQgPC0gYXV4CisgKiAgIGlucHV0IDEgPC0gbGluZQorICogICBpbnB1dCAyIDwtIG1pYworICogICBpbnB1dCAzIDwtIGZyb250IG1pYworICogICBpbnB1dCA0IDwtIGF1eAorICovCisKKy8qCisgKiBYb25hciBIREFWMS4zIFNsaW0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENNSTg3ODg6CisgKgorICogICBJwrJDIDwtPiBXTTg3NzYgKGFkZHIgMDAxMTAxMCkKKyAqCisgKiAgIEdQSU8gMCAgLT4gZGlzYWJsZSBIRE1JIG91dHB1dAorICogICBHUElPIDEgIC0+IGVuYWJsZSBIUCBvdXRwdXQKKyAqICAgR1BJTyA2ICAtPiBmaXJtd2FyZSBFRVBST00gScKyQyBjbG9jaworICogICBHUElPIDcgPC0+IGZpcm13YXJlIEVFUFJPTSBJwrJDIGRhdGEKKyAqCisgKiAgIFVBUlQgPC0+IEhETUkgY29udHJvbGxlcgorICoKKyAqIFdNODc3NjoKKyAqCisgKiAgIGlucHV0IDEgPC0gbWljCisgKiAgIGlucHV0IDIgPC0gYXV4CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTU1LDYgKzc3LDEzIEBACiAjZGVmaW5lIEdQSU9fRFNfT1VUUFVUX0ZST05UTFIJMHgwMDgwCiAjZGVmaW5lIEdQSU9fRFNfT1VUUFVUX0VOQUJMRQkweDAxMDAKIAorI2RlZmluZSBHUElPX1NMSU1fSERNSV9ESVNBQkxFCTB4MDAwMQorI2RlZmluZSBHUElPX1NMSU1fT1VUUFVUX0VOQUJMRQkweDAwMDIKKyNkZWZpbmUgR1BJT19TTElNX0ZJUk1XQVJFX0NMSwkweDAwNDAKKyNkZWZpbmUgR1BJT19TTElNX0ZJUk1XQVJFX0RBVEEJMHgwMDgwCisKKyNkZWZpbmUgSTJDX0RFVklDRV9XTTg3NzYJMHgzNAkvKiAwMDExMDEsIDAsIC9XPTAgKi8KKwogI2RlZmluZSBMQ19DT05UUk9MX0xJTUlURVIJMHg0MDAwMDAwMAogI2RlZmluZSBMQ19DT05UUk9MX0FMQwkJMHgyMDAwMDAwMAogCkBAIC02NiwxOSArOTUsMzcgQEAKIAlzdHJ1Y3Qgc25kX2tjb250cm9sICptaWNfYWRjbXV4X2NvbnRyb2w7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqbGNfY29udHJvbHNbMTNdOwogCXN0cnVjdCBzbmRfamFjayAqaHBfamFjazsKKwlzdHJ1Y3QgeG9uYXJfaGRtaSBoZG1pOwogfTsKIAotc3RhdGljIHZvaWQgd204Nzc2X3dyaXRlKHN0cnVjdCBveHlnZW4gKmNoaXAsCi0JCQkgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQorc3RhdGljIHZvaWQgd204Nzc2X3dyaXRlX3NwaShzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0Jc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7Ci0KIAlveHlnZW5fd3JpdGVfc3BpKGNoaXAsIE9YWUdFTl9TUElfVFJJR0dFUiB8CiAJCQkgT1hZR0VOX1NQSV9EQVRBX0xFTkdUSF8yIHwKIAkJCSBPWFlHRU5fU1BJX0NMT0NLXzE2MCB8CiAJCQkgKDEgPDwgT1hZR0VOX1NQSV9DT0RFQ19TSElGVCkgfAogCQkJIE9YWUdFTl9TUElfQ0VOX0xBVENIX0NMT0NLX0xPLAogCQkJIChyZWcgPDwgOSkgfCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODc3Nl93cml0ZV9pMmMoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCW94eWdlbl93cml0ZV9pMmMoY2hpcCwgSTJDX0RFVklDRV9XTTg3NzYsCisJCQkgKHJlZyA8PCAxKSB8ICh2YWx1ZSA+PiA4KSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB3bTg3NzZfd3JpdGUoc3RydWN0IG94eWdlbiAqY2hpcCwKKwkJCSB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwlpZiAoKGNoaXAtPm1vZGVsLmZ1bmN0aW9uX2ZsYWdzICYgT1hZR0VOX0ZVTkNUSU9OXzJXSVJFX1NQSV9NQVNLKSA9PQorCSAgICBPWFlHRU5fRlVOQ1RJT05fU1BJKQorCQl3bTg3NzZfd3JpdGVfc3BpKGNoaXAsIHJlZywgdmFsdWUpOworCWVsc2UKKwkJd204Nzc2X3dyaXRlX2kyYyhjaGlwLCByZWcsIHZhbHVlKTsKIAlpZiAocmVnIDwgQVJSQVlfU0laRShkYXRhLT53bTg3NzZfcmVncykpIHsKIAkJaWYgKHJlZyA+PSBXTTg3NzZfSFBMVk9MICYmIHJlZyA8PSBXTTg3NzZfREFDTUFTVEVSKQogCQkJdmFsdWUgJj0gfldNODc3Nl9VUERBVEU7CkBAIC0yNDUsMTcgKzI5Miw1MCBAQAogCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJXTTg3NjYiKTsKIH0KIAorc3RhdGljIHZvaWQgeG9uYXJfaGRhdl9zbGltX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlzdHJ1Y3QgeG9uYXJfd204N3g2ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCWRhdGEtPmdlbmVyaWMuYW50aV9wb3BfZGVsYXkgPSAzMDA7CisJZGF0YS0+Z2VuZXJpYy5vdXRwdXRfZW5hYmxlX2JpdCA9IEdQSU9fU0xJTV9PVVRQVVRfRU5BQkxFOworCisJd204Nzc2X2luaXQoY2hpcCk7CisKKwlveHlnZW5fc2V0X2JpdHMxNihjaGlwLCBPWFlHRU5fR1BJT19DT05UUk9MLAorCQkJICBHUElPX1NMSU1fSERNSV9ESVNBQkxFIHwKKwkJCSAgR1BJT19TTElNX0ZJUk1XQVJFX0NMSyB8CisJCQkgIEdQSU9fU0xJTV9GSVJNV0FSRV9EQVRBKTsKKworCXhvbmFyX2hkbWlfaW5pdChjaGlwLCAmZGF0YS0+aGRtaSk7CisJeG9uYXJfZW5hYmxlX291dHB1dChjaGlwKTsKKworCXNuZF9jb21wb25lbnRfYWRkKGNoaXAtPmNhcmQsICJXTTg3NzYiKTsKK30KKwogc3RhdGljIHZvaWQgeG9uYXJfZHNfY2xlYW51cChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQogewogCXhvbmFyX2Rpc2FibGVfb3V0cHV0KGNoaXApOwogCXdtODc3Nl93cml0ZShjaGlwLCBXTTg3NzZfUkVTRVQsIDApOwogfQogCitzdGF0aWMgdm9pZCB4b25hcl9oZGF2X3NsaW1fY2xlYW51cChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXhvbmFyX2hkbWlfY2xlYW51cChjaGlwKTsKKwl4b25hcl9kaXNhYmxlX291dHB1dChjaGlwKTsKKwl3bTg3NzZfd3JpdGUoY2hpcCwgV004Nzc2X1JFU0VULCAwKTsKKwltc2xlZXAoMik7Cit9CisKIHN0YXRpYyB2b2lkIHhvbmFyX2RzX3N1c3BlbmQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAl4b25hcl9kc19jbGVhbnVwKGNoaXApOwogfQogCitzdGF0aWMgdm9pZCB4b25hcl9oZGF2X3NsaW1fc3VzcGVuZChzdHJ1Y3Qgb3h5Z2VuICpjaGlwKQoreworCXhvbmFyX2hkYXZfc2xpbV9jbGVhbnVwKGNoaXApOworfQorCiBzdGF0aWMgdm9pZCB4b25hcl9kc19yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAl3bTg3NzZfcmVnaXN0ZXJzX2luaXQoY2hpcCk7CkBAIC0yNjQsNiArMzQ0LDE1IEBACiAJeG9uYXJfZHNfaGFuZGxlX2hwX2phY2soY2hpcCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhvbmFyX2hkYXZfc2xpbV9yZXN1bWUoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlzdHJ1Y3QgeG9uYXJfd204N3g2ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKworCXdtODc3Nl9yZWdpc3RlcnNfaW5pdChjaGlwKTsKKwl4b25hcl9oZG1pX3Jlc3VtZShjaGlwLCAmZGF0YS0+aGRtaSk7CisJeG9uYXJfZW5hYmxlX291dHB1dChjaGlwKTsKK30KKwogc3RhdGljIHZvaWQgd204Nzc2X2FkY19oYXJkd2FyZV9maWx0ZXIodW5zaWduZWQgaW50IGNoYW5uZWwsCiAJCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpoYXJkd2FyZSkKIHsKQEAgLTI3OCw2ICszNjcsMTMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHhvbmFyX2hkYXZfc2xpbV9oYXJkd2FyZV9maWx0ZXIodW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqaGFyZHdhcmUpCit7CisJd204Nzc2X2FkY19oYXJkd2FyZV9maWx0ZXIoY2hhbm5lbCwgaGFyZHdhcmUpOworCXhvbmFyX2hkbWlfcGNtX2hhcmR3YXJlX2ZpbHRlcihjaGFubmVsLCBoYXJkd2FyZSk7Cit9CisKIHN0YXRpYyB2b2lkIHNldF93bTg3eDZfZGFjX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAogCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC0yOTQsNiArMzkwLDE0IEBACiAJd204Nzc2X3dyaXRlX2NhY2hlZChjaGlwLCBXTTg3NzZfTVNUUkNUUkwsIHJlZyk7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9oZGF2X3NsaW1fZGFjX3BhcmFtcyhzdHJ1Y3Qgb3h5Z2VuICpjaGlwLAorCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisKKwl4b25hcl9zZXRfaGRtaV9wYXJhbXMoY2hpcCwgJmRhdGEtPmhkbWksIHBhcmFtcyk7Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV93bTg3NzZfdm9sdW1lKHN0cnVjdCBveHlnZW4gKmNoaXApCiB7CiAJc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CkBAIC00NzMsMTEgKzU3Nyw2IEBACiAJY29uc3QgY2hhciAqY29uc3QgKm5hbWVzOwogCiAJbWF4ID0gKGN0bC0+cHJpdmF0ZV92YWx1ZSA+PiAxMikgJiAweGY7Ci0JaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQlpbmZvLT5jb3VudCA9IDE7Ci0JaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IG1heCArIDE7Ci0JaWYgKGluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IG1heCkKLQkJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gbWF4OwogCXN3aXRjaCAoKGN0bC0+cHJpdmF0ZV92YWx1ZSA+PiAyNCkgJiAweDFmKSB7CiAJY2FzZSBXTTg3NzZfQUxDQ1RSTDI6CiAJCW5hbWVzID0gaGxkOwpAQCAtNTAxLDggKzYwMCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIG1heCArIDEsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCB3bTg3NzZfZmllbGRfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLApAQCAtNzU5LDEzICs4NTcsOCBAQAogCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1szXSA9IHsKIAkJIk5vbmUiLCAiUGVhayBMaW1pdGVyIiwgIkF1dG9tYXRpYyBMZXZlbCBDb250cm9sIgogCX07Ci0JaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQlpbmZvLT5jb3VudCA9IDE7Ci0JaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7Ci0JaWYgKGluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSAzKQotCQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAyOwotCXN0cmNweShpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIG5hbWVzW2luZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOwotCXJldHVybiAwOworCisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDMsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCB3bTg3NzZfbGV2ZWxfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqY3RsLApAQCAtODUxLDEzICs5NDQsNyBAQAogCQkiTm9uZSIsICJIaWdoLXBhc3MgRmlsdGVyIgogCX07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IDIpCi0JCWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IDE7Ci0Jc3RyY3B5KGluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZXNbaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKGluZm8sIDEsIDIsIG5hbWVzKTsKIH0KIAogc3RhdGljIGludCBocGZfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCkBAIC05ODUsNiArMTA3Miw1MyBAQAogCQkucHJpdmF0ZV92YWx1ZSA9IDAsCiAJfSwKIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGRhdl9zbGltX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSERNSSBQbGF5YmFjayBTd2l0Y2giLAorCQkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJCS5nZXQgPSB4b25hcl9ncGlvX2JpdF9zd2l0Y2hfZ2V0LAorCQkucHV0ID0geG9uYXJfZ3Bpb19iaXRfc3dpdGNoX3B1dCwKKwkJLnByaXZhdGVfdmFsdWUgPSBHUElPX1NMSU1fSERNSV9ESVNBQkxFIHwgWE9OQVJfR1BJT19CSVRfSU5WRVJULAorCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCisJCS5pbmZvID0gd204Nzc2X2hwX3ZvbF9pbmZvLAorCQkuZ2V0ID0gd204Nzc2X2hwX3ZvbF9nZXQsCisJCS5wdXQgPSB3bTg3NzZfaHBfdm9sX3B1dCwKKwkJLnRsdiA9IHsgLnAgPSB3bTg3NzZfaHBfZGJfc2NhbGUgfSwKKwl9LAorCVdNODc3Nl9CSVRfU1dJVENIKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCSAgV004Nzc2X1BXUkRPV04sIFdNODc3Nl9IUFBELCAxLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJJbnB1dCBDYXB0dXJlIFZvbHVtZSIsCisJCS5pbmZvID0gd204Nzc2X2lucHV0X3ZvbF9pbmZvLAorCQkuZ2V0ID0gd204Nzc2X2lucHV0X3ZvbF9nZXQsCisJCS5wdXQgPSB3bTg3NzZfaW5wdXRfdm9sX3B1dCwKKwkJLnRsdiA9IHsgLnAgPSB3bTg3NzZfYWRjX2RiX3NjYWxlIH0sCisJfSwKKwlXTTg3NzZfQklUX1NXSVRDSCgiTWljIENhcHR1cmUgU3dpdGNoIiwKKwkJCSAgV004Nzc2X0FEQ01VWCwgMSA8PCAwLCAwLCAwKSwKKwlXTTg3NzZfQklUX1NXSVRDSCgiQXV4IENhcHR1cmUgU3dpdGNoIiwKKwkJCSAgV004Nzc2X0FEQ01VWCwgMSA8PCAxLCAwLCAwKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJBREMgRmlsdGVyIENhcHR1cmUgRW51bSIsCisJCS5pbmZvID0gaHBmX2luZm8sCisJCS5nZXQgPSBocGZfZ2V0LAorCQkucHV0ID0gaHBmX3B1dCwKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkxldmVsIENvbnRyb2wgQ2FwdHVyZSBFbnVtIiwKKwkJLmluZm8gPSB3bTg3NzZfbGV2ZWxfY29udHJvbF9pbmZvLAorCQkuZ2V0ID0gd204Nzc2X2xldmVsX2NvbnRyb2xfZ2V0LAorCQkucHV0ID0gd204Nzc2X2xldmVsX2NvbnRyb2xfcHV0LAorCQkucHJpdmF0ZV92YWx1ZSA9IDAsCisJfSwKK307CiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGNfY29udHJvbHNbXSA9IHsKIAlXTTg3NzZfRklFTERfQ1RMX1ZPTFVNRSgiTGltaXRlciBUaHJlc2hvbGQiLAogCQkJCVdNODc3Nl9BTENDVFJMMSwgMCwgMTEsIDAsIDE1LCAweGYsCkBAIC0xMDI4LDYgKzExNjIsMjYgQEAKIAkJCQlMQ19DT05UUk9MX0FMQywgd204Nzc2X25ndGhfZGJfc2NhbGUpLAogfTsKIAorc3RhdGljIGludCBhZGRfbGNfY29udHJvbHMoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwlzdHJ1Y3QgeG9uYXJfd204N3g2ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGw7CisJaW50IGVycjsKKworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGxjX2NvbnRyb2xzKSAhPSBBUlJBWV9TSVpFKGRhdGEtPmxjX2NvbnRyb2xzKSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNfY29udHJvbHMpOyArK2kpIHsKKwkJY3RsID0gc25kX2N0bF9uZXcxKCZsY19jb250cm9sc1tpXSwgY2hpcCk7CisJCWlmICghY3RsKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGN0bCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZGF0YS0+bGNfY29udHJvbHNbaV0gPSBjdGw7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHhvbmFyX2RzX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKIHsKIAlzdHJ1Y3QgeG9uYXJfd204N3g2ICpkYXRhID0gY2hpcC0+bW9kZWxfZGF0YTsKQEAgLTEwNDksMTcgKzEyMDMsNTQgQEAKIAl9CiAJaWYgKCFkYXRhLT5saW5lX2FkY211eF9jb250cm9sIHx8ICFkYXRhLT5taWNfYWRjbXV4X2NvbnRyb2wpCiAJCXJldHVybiAtRU5YSU87Ci0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobGNfY29udHJvbHMpICE9IEFSUkFZX1NJWkUoZGF0YS0+bGNfY29udHJvbHMpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsY19jb250cm9scyk7ICsraSkgewotCQljdGwgPSBzbmRfY3RsX25ldzEoJmxjX2NvbnRyb2xzW2ldLCBjaGlwKTsKKworCXJldHVybiBhZGRfbGNfY29udHJvbHMoY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgeG9uYXJfaGRhdl9zbGltX21peGVyX2luaXQoc3RydWN0IG94eWdlbiAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGw7CisJaW50IGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkYXZfc2xpbV9jb250cm9scyk7ICsraSkgeworCQljdGwgPSBzbmRfY3RsX25ldzEoJmhkYXZfc2xpbV9jb250cm9sc1tpXSwgY2hpcCk7CiAJCWlmICghY3RsKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGN0bCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQkJZGF0YS0+bGNfY29udHJvbHNbaV0gPSBjdGw7CiAJfQotCXJldHVybiAwOworCisJcmV0dXJuIGFkZF9sY19jb250cm9scyhjaGlwKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF93bTg3NzZfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbldNODc3NjpcbjAwOiIpOworCWZvciAoaSA9IDA7IGkgPCAweDEwOyArK2kpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAlMDN4IiwgZGF0YS0+d204Nzc2X3JlZ3NbaV0pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuMTA6Iik7CisJZm9yIChpID0gMHgxMDsgaSA8IDB4MTc7ICsraSkKKwkJc25kX2lwcmludGYoYnVmZmVyLCAiICUwM3giLCBkYXRhLT53bTg3NzZfcmVnc1tpXSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF93bTg3eDZfcmVnaXN0ZXJzKHN0cnVjdCBveHlnZW4gKmNoaXAsCisJCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IHhvbmFyX3dtODd4NiAqZGF0YSA9IGNoaXAtPm1vZGVsX2RhdGE7CisJdW5zaWduZWQgaW50IGk7CisKKwlkdW1wX3dtODc3Nl9yZWdpc3RlcnMoY2hpcCwgYnVmZmVyKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJcbldNODc2NjpcbjAwOiIpOworCWZvciAoaSA9IDA7IGkgPCAweDEwOyArK2kpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAlMDN4IiwgZGF0YS0+d204NzY2X3JlZ3NbaV0pOworCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlxuIik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3h5Z2VuX21vZGVsIG1vZGVsX3hvbmFyX2RzID0gewpAQCAtMTA3MiwyMiArMTI2Myw1NyBAQAogCS5zdXNwZW5kID0geG9uYXJfZHNfc3VzcGVuZCwKIAkucmVzdW1lID0geG9uYXJfZHNfcmVzdW1lLAogCS5wY21faGFyZHdhcmVfZmlsdGVyID0gd204Nzc2X2FkY19oYXJkd2FyZV9maWx0ZXIsCi0JLmdldF9pMnNfbWNsayA9IG94eWdlbl9kZWZhdWx0X2kyc19tY2xrLAogCS5zZXRfZGFjX3BhcmFtcyA9IHNldF93bTg3eDZfZGFjX3BhcmFtcywKIAkuc2V0X2FkY19wYXJhbXMgPSBzZXRfd204Nzc2X2FkY19wYXJhbXMsCiAJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3dtODd4Nl92b2x1bWUsCiAJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV93bTg3eDZfbXV0ZSwKIAkudXBkYXRlX2NlbnRlcl9sZmVfbWl4ID0gdXBkYXRlX3dtODc2Nl9jZW50ZXJfbGZlX21peCwKIAkuZ3Bpb19jaGFuZ2VkID0geG9uYXJfZHNfZ3Bpb19jaGFuZ2VkLAorCS5kdW1wX3JlZ2lzdGVycyA9IGR1bXBfd204N3g2X3JlZ2lzdGVycywKIAkuZGFjX3RsdiA9IHdtODd4Nl9kYWNfZGJfc2NhbGUsCiAJLm1vZGVsX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeG9uYXJfd204N3g2KSwKIAkuZGV2aWNlX2NvbmZpZyA9IFBMQVlCQUNLXzBfVE9fSTJTIHwKIAkJCSBQTEFZQkFDS18xX1RPX1NQRElGIHwKIAkJCSBDQVBUVVJFXzBfRlJPTV9JMlNfMSwKLQkuZGFjX2NoYW5uZWxzID0gOCwKKwkuZGFjX2NoYW5uZWxzX3BjbSA9IDgsCisJLmRhY19jaGFubmVsc19taXhlciA9IDgsCiAJLmRhY192b2x1bWVfbWluID0gMjU1IC0gMio2MCwKIAkuZGFjX3ZvbHVtZV9tYXggPSAyNTUsCiAJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMjU2LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAyNTYsIDEyOCksCisJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG94eWdlbl9tb2RlbCBtb2RlbF94b25hcl9oZGF2X3NsaW0gPSB7CisJLnNob3J0bmFtZSA9ICJYb25hciBIREFWMS4zIFNsaW0iLAorCS5sb25nbmFtZSA9ICJBc3VzIFZpcnR1b3NvIDIwMCIsCisJLmNoaXAgPSAiQVYyMDAiLAorCS5pbml0ID0geG9uYXJfaGRhdl9zbGltX2luaXQsCisJLm1peGVyX2luaXQgPSB4b25hcl9oZGF2X3NsaW1fbWl4ZXJfaW5pdCwKKwkuY2xlYW51cCA9IHhvbmFyX2hkYXZfc2xpbV9jbGVhbnVwLAorCS5zdXNwZW5kID0geG9uYXJfaGRhdl9zbGltX3N1c3BlbmQsCisJLnJlc3VtZSA9IHhvbmFyX2hkYXZfc2xpbV9yZXN1bWUsCisJLnBjbV9oYXJkd2FyZV9maWx0ZXIgPSB4b25hcl9oZGF2X3NsaW1faGFyZHdhcmVfZmlsdGVyLAorCS5zZXRfZGFjX3BhcmFtcyA9IHNldF9oZGF2X3NsaW1fZGFjX3BhcmFtcywKKwkuc2V0X2FkY19wYXJhbXMgPSBzZXRfd204Nzc2X2FkY19wYXJhbXMsCisJLnVwZGF0ZV9kYWNfdm9sdW1lID0gdXBkYXRlX3dtODc3Nl92b2x1bWUsCisJLnVwZGF0ZV9kYWNfbXV0ZSA9IHVwZGF0ZV93bTg3NzZfbXV0ZSwKKwkudWFydF9pbnB1dCA9IHhvbmFyX2hkbWlfdWFydF9pbnB1dCwKKwkuZHVtcF9yZWdpc3RlcnMgPSBkdW1wX3dtODc3Nl9yZWdpc3RlcnMsCisJLmRhY190bHYgPSB3bTg3eDZfZGFjX2RiX3NjYWxlLAorCS5tb2RlbF9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHhvbmFyX3dtODd4NiksCisJLmRldmljZV9jb25maWcgPSBQTEFZQkFDS18wX1RPX0kyUyB8CisJCQkgUExBWUJBQ0tfMV9UT19TUERJRiB8CisJCQkgQ0FQVFVSRV8wX0ZST01fSTJTXzEsCisJLmRhY19jaGFubmVsc19wY20gPSA4LAorCS5kYWNfY2hhbm5lbHNfbWl4ZXIgPSAyLAorCS5kYWNfdm9sdW1lX21pbiA9IDI1NSAtIDIqNjAsCisJLmRhY192b2x1bWVfbWF4ID0gMjU1LAorCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl8yV0lSRSwKKwkuZGFjX21jbGtzID0gT1hZR0VOX01DTEtTKDI1NiwgMjU2LCAxMjgpLAorCS5hZGNfbWNsa3MgPSBPWFlHRU5fTUNMS1MoMjU2LCAyNTYsIDEyOCksCiAJLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9OwpAQCAtMTA5OSw2ICsxMzI1LDkgQEAKIAljYXNlIDB4ODM4ZToKIAkJY2hpcC0+bW9kZWwgPSBtb2RlbF94b25hcl9kczsKIAkJYnJlYWs7CisJY2FzZSAweDgzNWU6CisJCWNoaXAtPm1vZGVsID0gbW9kZWxfeG9uYXJfaGRhdl9zbGltOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggMGI3MjBjZi4uMmQ4MzMyNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtNjAsNiArNjAsNyBAQAogCSAgICAgICAgIntSTUUgSERTUC05NjUyfSwiCiAJCSJ7Uk1FIEhEU1AtOTYzMn19Iik7CiAjaWZkZWYgSERTUF9GV19MT0FERVIKK01PRFVMRV9GSVJNV0FSRSgicnBtX2Zpcm13YXJlLmJpbiIpOwogTU9EVUxFX0ZJUk1XQVJFKCJtdWx0aWZhY2VfZmlybXdhcmUuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoIm11bHRpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgiZGlnaWZhY2VfZmlybXdhcmUuYmluIik7CkBAIC04MSw2ICs4Miw3IEBACiAjZGVmaW5lIEg5NjMyX1NTX0NIQU5ORUxTCSAxMgogI2RlZmluZSBIOTYzMl9EU19DSEFOTkVMUwkgOAogI2RlZmluZSBIOTYzMl9RU19DSEFOTkVMUwkgNAorI2RlZmluZSBSUE1fQ0hBTk5FTFMgICAgICAgICAgICAgNgogCiAvKiBXcml0ZSByZWdpc3RlcnMuIFRoZXNlIGFyZSBkZWZpbmVkIGFzIGJ5dGUtb2Zmc2V0cyBmcm9tIHRoZSBpb2Jhc2UgdmFsdWUuCiAgKi8KQEAgLTE5MSw2ICsxOTMsMjUgQEAKICNkZWZpbmUgSERTUF9QaG9uZUdhaW4xCQkgICgxPDwzMCkKICNkZWZpbmUgSERTUF9RdWFkU3BlZWQJICAJICAoMTw8MzEpCiAKKy8qIFJQTSB1c2VzIHNvbWUgb2YgdGhlIHJlZ2lzdGVycyBmb3Igc3BlY2lhbCBwdXJwb3NlcyAqLworI2RlZmluZSBIRFNQX1JQTV9JbnAxMiAgICAgICAgICAgIDB4MDRBMDAKKyNkZWZpbmUgSERTUF9SUE1fSW5wMTJfUGhvbl82ZEIgICAweDAwODAwICAvKiBEb2xieSAqLworI2RlZmluZSBIRFNQX1JQTV9JbnAxMl9QaG9uXzBkQiAgIDB4MDAwMDAgIC8qIC4uICovCisjZGVmaW5lIEhEU1BfUlBNX0lucDEyX1Bob25fbjZkQiAgMHgwNDAwMCAgLyogaW5wXzAgKi8KKyNkZWZpbmUgSERTUF9SUE1fSW5wMTJfTGluZV8wZEIgICAweDA0MjAwICAvKiBEb2xieStQUk8gKi8KKyNkZWZpbmUgSERTUF9SUE1fSW5wMTJfTGluZV9uNmRCICAweDAwMjAwICAvKiBQUk8gKi8KKworI2RlZmluZSBIRFNQX1JQTV9JbnAzNCAgICAgICAgICAgIDB4MzIwMDAKKyNkZWZpbmUgSERTUF9SUE1fSW5wMzRfUGhvbl82ZEIgICAweDIwMDAwICAvKiBTeW5jUmVmMSAqLworI2RlZmluZSBIRFNQX1JQTV9JbnAzNF9QaG9uXzBkQiAgIDB4MDAwMDAgIC8qIC4uICovCisjZGVmaW5lIEhEU1BfUlBNX0lucDM0X1Bob25fbjZkQiAgMHgwMjAwMCAgLyogU3luY1JlZjIgKi8KKyNkZWZpbmUgSERTUF9SUE1fSW5wMzRfTGluZV8wZEIgICAweDMwMDAwICAvKiBTeW5jUmVmMStTeW5jUmVmMCAqLworI2RlZmluZSBIRFNQX1JQTV9JbnAzNF9MaW5lX242ZEIgIDB4MTAwMDAgIC8qIFN5bmNSZWYwICovCisKKyNkZWZpbmUgSERTUF9SUE1fQnlwYXNzICAgICAgICAgICAweDAxMDAwCisKKyNkZWZpbmUgSERTUF9SUE1fRGlzY29ubmVjdCAgICAgICAweDAwMDAxCisKICNkZWZpbmUgSERTUF9BREdhaW5NYXNrICAgICAgIChIRFNQX0FER2FpbjB8SERTUF9BREdhaW4xKQogI2RlZmluZSBIRFNQX0FER2Fpbk1pbnVzMTBkQlYgIEhEU1BfQURHYWluTWFzawogI2RlZmluZSBIRFNQX0FER2FpblBsdXM0ZEJ1ICAgKEhEU1BfQURHYWluMCkKQEAgLTQ1MCw3ICs0NzEsNyBAQAogCXUzMiAgICAgICAgICAgICAgICAgICBjcmVnX3NwZGlmOwogCXUzMiAgICAgICAgICAgICAgICAgICBjcmVnX3NwZGlmX3N0cmVhbTsKIAlpbnQgICAgICAgICAgICAgICAgICAgY2xvY2tfc291cmNlX2xvY2tlZDsKLQljaGFyICAgICAgICAgICAgICAgICAqY2FyZF9uYW1lOwkgICAgIC8qIGRpZ2lmYWNlL211bHRpZmFjZSAqLworCWNoYXIgICAgICAgICAgICAgICAgICpjYXJkX25hbWU7CSAvKiBkaWdpZmFjZS9tdWx0aWZhY2UvcnBtICovCiAJZW51bSBIRFNQX0lPX1R5cGUgICAgIGlvX3R5cGU7ICAgICAgICAgICAgICAgLyogZGl0dG8sIGJ1dCBmb3IgY29kZSB1c2UgKi8KICAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgIGZpcm13YXJlX3JldjsKIAl1bnNpZ25lZCBzaG9ydAkgICAgICBzdGF0ZTsJCSAgICAgLyogc3RvcmVzIHN0YXRlIGJpdHMgKi8KQEAgLTYxMiw2ICs2MzMsNyBAQAogCXN3aXRjaCAoaGRzcC0+aW9fdHlwZSkgewogCWNhc2UgTXVsdGlmYWNlOgogCWNhc2UgRGlnaWZhY2U6CisJY2FzZSBSUE06CiAJZGVmYXVsdDoKIAkJaWYgKGhkc3AtPmZpcm13YXJlX3JldiA9PSAweGEpCiAJCQlyZXR1cm4gKDY0ICogb3V0KSArICgzMiArIChpbikpOwpAQCAtNjI5LDYgKzY1MSw3IEBACiAJc3dpdGNoIChoZHNwLT5pb190eXBlKSB7CiAJY2FzZSBNdWx0aWZhY2U6CiAJY2FzZSBEaWdpZmFjZToKKwljYXNlIFJQTToKIAlkZWZhdWx0OgogCQlpZiAoaGRzcC0+ZmlybXdhcmVfcmV2ID09IDB4YSkKIAkJCXJldHVybiAoNjQgKiBvdXQpICsgaW47CkBAIC02NTUsNyArNjc4LDcgQEAKIHsKIAlpZiAoaGRzcC0+aW9fdHlwZSA9PSBIOTY1MiB8fCBoZHNwLT5pb190eXBlID09IEg5NjMyKSByZXR1cm4gMDsKIAlpZiAoaGRzcF9yZWFkIChoZHNwLCBIRFNQX3N0YXR1c1JlZ2lzdGVyKSAmIEhEU1BfQ29uZmlnRXJyb3IpIHsKLQkJc25kX3ByaW50ayAoIkhhbW1lcmZhbGwtRFNQOiBubyBEaWdpZmFjZSBvciBNdWx0aWZhY2UgY29ubmVjdGVkIVxuIik7CisJCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBubyBJTyBib3ggY29ubmVjdGVkIVxuIik7CiAJCWhkc3AtPnN0YXRlICY9IH5IRFNQX0Zpcm13YXJlTG9hZGVkOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC02ODAsNyArNzAzLDcgQEAKIAkJfQogCX0KIAotCXNuZF9wcmludGsoIkhhbW1lcmZhbGwtRFNQOiBubyBEaWdpZmFjZSBvciBNdWx0aWZhY2UgY29ubmVjdGVkIVxuIik7CisJc25kX3ByaW50aygiSGFtbWVyZmFsbC1EU1A6IG5vIElPIGJveCBjb25uZWN0ZWQhXG4iKTsKIAloZHNwLT5zdGF0ZSAmPSB+SERTUF9GaXJtd2FyZUxvYWRlZDsKIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTc1MiwxNyArNzc1LDIxIEBACiAJCWhkc3Bfd3JpdGUgKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19MT0FEKTsKIAkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9maWZvRGF0YSwgMCk7CiAKLQkJaWYgKGhkc3BfZmlmb193YWl0IChoZHNwLCAwLCBIRFNQX1NIT1JUX1dBSVQpKSB7Ci0JCQloZHNwLT5pb190eXBlID0gTXVsdGlmYWNlOwotCQkJaGRzcF93cml0ZSAoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9WRVJTSU9OX0JJVCk7Ci0JCQloZHNwX3dyaXRlIChoZHNwLCBIRFNQX2NvbnRyb2wyUmVnLCBIRFNQX1NfTE9BRCk7Ci0JCQloZHNwX2ZpZm9fd2FpdCAoaGRzcCwgMCwgSERTUF9TSE9SVF9XQUlUKTsKKwkJaWYgKGhkc3BfZmlmb193YWl0KGhkc3AsIDAsIEhEU1BfU0hPUlRfV0FJVCkpIHsKKwkJCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sMlJlZywgSERTUF9WRVJTSU9OX0JJVCk7CisJCQloZHNwX3dyaXRlKGhkc3AsIEhEU1BfY29udHJvbDJSZWcsIEhEU1BfU19MT0FEKTsKKwkJCWlmIChoZHNwX2ZpZm9fd2FpdChoZHNwLCAwLCBIRFNQX1NIT1JUX1dBSVQpKQorCQkJCWhkc3AtPmlvX3R5cGUgPSBSUE07CisJCQllbHNlCisJCQkJaGRzcC0+aW9fdHlwZSA9IE11bHRpZmFjZTsKIAkJfSBlbHNlIHsKIAkJCWhkc3AtPmlvX3R5cGUgPSBEaWdpZmFjZTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIGZpcm13YXJlIHdhcyBhbHJlYWR5IGxvYWRlZCwgZ2V0IGlvYm94IHR5cGUgKi8KLQkJaWYgKGhkc3BfcmVhZChoZHNwLCBIRFNQX3N0YXR1czJSZWdpc3RlcikgJiBIRFNQX3ZlcnNpb24xKQorCQlpZiAoaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKSAmIEhEU1BfdmVyc2lvbjIpCisJCQloZHNwLT5pb190eXBlID0gUlBNOworCQllbHNlIGlmIChoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpICYgSERTUF92ZXJzaW9uMSkKIAkJCWhkc3AtPmlvX3R5cGUgPSBNdWx0aWZhY2U7CiAJCWVsc2UKIAkJCWhkc3AtPmlvX3R5cGUgPSBEaWdpZmFjZTsKQEAgLTExODQsNiArMTIxMSw3IEBACiAJCQloZHNwLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwX2RzOwogCX0gZWxzZSB7CiAJCXN3aXRjaCAoaGRzcC0+aW9fdHlwZSkgeworCQljYXNlIFJQTToKIAkJY2FzZSBNdWx0aWZhY2U6CiAJCQloZHNwLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwX21mX3NzOwogCQkJYnJlYWs7CkBAIC0zMjMxLDYgKzMyNTksMzE4IEBACiBIRFNQX1VTRV9NSURJX1RBU0tMRVQoIlVzZSBNaWRpIFRhc2tsZXQiLCAwKSwKIH07CiAKKworc3RhdGljIGludCBoZHNwX3JwbV9pbnB1dDEyKHN0cnVjdCBoZHNwICpoZHNwKQoreworCXN3aXRjaCAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfUlBNX0lucDEyKSB7CisJY2FzZSBIRFNQX1JQTV9JbnAxMl9QaG9uXzZkQjoKKwkJcmV0dXJuIDA7CisJY2FzZSBIRFNQX1JQTV9JbnAxMl9QaG9uX242ZEI6CisJCXJldHVybiAyOworCWNhc2UgSERTUF9SUE1fSW5wMTJfTGluZV8wZEI6CisJCXJldHVybiAzOworCWNhc2UgSERTUF9SUE1fSW5wMTJfTGluZV9uNmRCOgorCQlyZXR1cm4gNDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfcnBtX2lucHV0MTIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGhkc3BfcnBtX2lucHV0MTIoaGRzcCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBoZHNwX3NldF9ycG1faW5wdXQxMihzdHJ1Y3QgaGRzcCAqaGRzcCwgaW50IG1vZGUpCit7CisJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9SUE1fSW5wMTI7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUlBNX0lucDEyX1Bob25fNmRCOworCQlicmVhazsKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1JQTV9JbnAxMl9QaG9uX242ZEI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciB8PSBIRFNQX1JQTV9JbnAxMl9MaW5lXzBkQjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUlBNX0lucDEyX0xpbmVfbjZkQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X3JwbV9pbnB1dDEyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAodmFsIDwgMCkKKwkJdmFsID0gMDsKKwlpZiAodmFsID4gNCkKKwkJdmFsID0gNDsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlpZiAodmFsICE9IGhkc3BfcnBtX2lucHV0MTIoaGRzcCkpCisJCWNoYW5nZSA9IChoZHNwX3NldF9ycG1faW5wdXQxMihoZHNwLCB2YWwpID09IDApID8gMSA6IDA7CisJZWxzZQorCQljaGFuZ2UgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworCitzdGF0aWMgaW50IHNuZF9oZHNwX2luZm9fcnBtX2lucHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyJQaG9ubyArNmRCIiwgIlBob25vIDBkQiIsICJQaG9ubyAtNmRCIiwgIkxpbmUgMGRCIiwgIkxpbmUgLTZkQiJ9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDU7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhkc3BfcnBtX2lucHV0MzQoc3RydWN0IGhkc3AgKmhkc3ApCit7CisJc3dpdGNoIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9SUE1fSW5wMzQpIHsKKwljYXNlIEhEU1BfUlBNX0lucDM0X1Bob25fNmRCOgorCQlyZXR1cm4gMDsKKwljYXNlIEhEU1BfUlBNX0lucDM0X1Bob25fbjZkQjoKKwkJcmV0dXJuIDI7CisJY2FzZSBIRFNQX1JQTV9JbnAzNF9MaW5lXzBkQjoKKwkJcmV0dXJuIDM7CisJY2FzZSBIRFNQX1JQTV9JbnAzNF9MaW5lX242ZEI6CisJCXJldHVybiA0OworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHNuZF9oZHNwX2dldF9ycG1faW5wdXQzNChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3AgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcF9ycG1faW5wdXQzNChoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhkc3Bfc2V0X3JwbV9pbnB1dDM0KHN0cnVjdCBoZHNwICpoZHNwLCBpbnQgbW9kZSkKK3sKKwloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX1JQTV9JbnAzNDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9SUE1fSW5wMzRfUGhvbl82ZEI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJYnJlYWs7CisJY2FzZSAyOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUlBNX0lucDM0X1Bob25fbjZkQjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUlBNX0lucDM0X0xpbmVfMGRCOworCQlicmVhazsKKwljYXNlIDQ6CisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9SUE1fSW5wMzRfTGluZV9uNmRCOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJaGRzcF93cml0ZShoZHNwLCBIRFNQX2NvbnRyb2xSZWdpc3RlciwgaGRzcC0+Y29udHJvbF9yZWdpc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzbmRfaGRzcF9wdXRfcnBtX2lucHV0MzQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJaW50IHZhbDsKKworCWlmICghc25kX2hkc3BfdXNlX2lzX2V4Y2x1c2l2ZShoZHNwKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWlmICh2YWwgPCAwKQorCQl2YWwgPSAwOworCWlmICh2YWwgPiA0KQorCQl2YWwgPSA0OworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWlmICh2YWwgIT0gaGRzcF9ycG1faW5wdXQzNChoZHNwKSkKKwkJY2hhbmdlID0gKGhkc3Bfc2V0X3JwbV9pbnB1dDM0KGhkc3AsIHZhbCkgPT0gMCkgPyAxIDogMDsKKwllbHNlCisJCWNoYW5nZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQorCisKKy8qIFJQTSBCeXBhc3Mgc3dpdGNoICovCitzdGF0aWMgaW50IGhkc3BfcnBtX2J5cGFzcyhzdHJ1Y3QgaGRzcCAqaGRzcCkKK3sKKwlyZXR1cm4gKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1JQTV9CeXBhc3MpID8gMSA6IDA7Cit9CisKKworc3RhdGljIGludCBzbmRfaGRzcF9nZXRfcnBtX2J5cGFzcyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3AgKmhkc3AgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhkc3BfcnBtX2J5cGFzcyhoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhkc3Bfc2V0X3JwbV9ieXBhc3Moc3RydWN0IGhkc3AgKmhkc3AsIGludCBvbikKK3sKKwlpZiAob24pCisJCWhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUF9SUE1fQnlwYXNzOworCWVsc2UKKwkJaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmPSB+SERTUF9SUE1fQnlwYXNzOworCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X3JwbV9ieXBhc3Moc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmICghc25kX2hkc3BfdXNlX2lzX2V4Y2x1c2l2ZShoZHNwKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDE7CisJc3Bpbl9sb2NrX2lycSgmaGRzcC0+bG9jayk7CisJY2hhbmdlID0gKGludCl2YWwgIT0gaGRzcF9ycG1fYnlwYXNzKGhkc3ApOworCWhkc3Bfc2V0X3JwbV9ieXBhc3MoaGRzcCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKKworc3RhdGljIGludCBzbmRfaGRzcF9pbmZvX3JwbV9ieXBhc3Moc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7Ik9uIiwgIk9mZiJ9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBSUE0gRGlzY29ubmVjdCBzd2l0Y2ggKi8KK3N0YXRpYyBpbnQgaGRzcF9ycG1fZGlzY29ubmVjdChzdHJ1Y3QgaGRzcCAqaGRzcCkKK3sKKwlyZXR1cm4gKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1JQTV9EaXNjb25uZWN0KSA/IDEgOiAwOworfQorCisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X3JwbV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaGRzcF9ycG1fZGlzY29ubmVjdChoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGhkc3Bfc2V0X3JwbV9kaXNjb25uZWN0KHN0cnVjdCBoZHNwICpoZHNwLCBpbnQgb24pCit7CisJaWYgKG9uKQorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BfUlBNX0Rpc2Nvbm5lY3Q7CisJZWxzZQorCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX1JQTV9EaXNjb25uZWN0OworCWhkc3Bfd3JpdGUoaGRzcCwgSERTUF9jb250cm9sUmVnaXN0ZXIsIGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X3JwbV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcCAqaGRzcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAxOworCXNwaW5fbG9ja19pcnEoJmhkc3AtPmxvY2spOworCWNoYW5nZSA9IChpbnQpdmFsICE9IGhkc3BfcnBtX2Rpc2Nvbm5lY3QoaGRzcCk7CisJaGRzcF9zZXRfcnBtX2Rpc2Nvbm5lY3QoaGRzcCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfaW5mb19ycG1fZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbXSA9IHsiT24iLCAiT2ZmIn07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BfcnBtX2NvbnRyb2xzW10gPSB7CisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiUlBNIEJ5cGFzcyIsCisJCS5nZXQgPSBzbmRfaGRzcF9nZXRfcnBtX2J5cGFzcywKKwkJLnB1dCA9IHNuZF9oZHNwX3B1dF9ycG1fYnlwYXNzLAorCQkuaW5mbyA9IHNuZF9oZHNwX2luZm9fcnBtX2J5cGFzcworCX0sCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiUlBNIERpc2Nvbm5lY3QiLAorCQkuZ2V0ID0gc25kX2hkc3BfZ2V0X3JwbV9kaXNjb25uZWN0LAorCQkucHV0ID0gc25kX2hkc3BfcHV0X3JwbV9kaXNjb25uZWN0LAorCQkuaW5mbyA9IHNuZF9oZHNwX2luZm9fcnBtX2Rpc2Nvbm5lY3QKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIklucHV0IDEvMiIsCisJCS5nZXQgPSBzbmRfaGRzcF9nZXRfcnBtX2lucHV0MTIsCisJCS5wdXQgPSBzbmRfaGRzcF9wdXRfcnBtX2lucHV0MTIsCisJCS5pbmZvID0gc25kX2hkc3BfaW5mb19ycG1faW5wdXQKKwl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIklucHV0IDMvNCIsCisJCS5nZXQgPSBzbmRfaGRzcF9nZXRfcnBtX2lucHV0MzQsCisJCS5wdXQgPSBzbmRfaGRzcF9wdXRfcnBtX2lucHV0MzQsCisJCS5pbmZvID0gc25kX2hkc3BfaW5mb19ycG1faW5wdXQKKwl9LAorCUhEU1BfU1lTVEVNX1NBTVBMRV9SQVRFKCJTeXN0ZW0gU2FtcGxlIFJhdGUiLCAwKSwKKwlIRFNQX01JWEVSKCJNaXhlciIsIDApCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2hkc3BfOTZ4eF9hZWIgPSBIRFNQX0FFQigiQW5hbG9nIEV4dGVuc2lvbiBCb2FyZCIsIDApOwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9oZHNwX2FkYXRfc3luY19jaGVjayA9IEhEU1BfQURBVF9TWU5DX0NIRUNLOwogCkBAIC0zMjQwLDYgKzM1ODAsMTYgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAKKwlpZiAoaGRzcC0+aW9fdHlwZSA9PSBSUE0pIHsKKwkJLyogUlBNIEJ5cGFzcywgRGlzY29ubmVjdCBhbmQgSW5wdXQgc3dpdGNoZXMgKi8KKwkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKHNuZF9oZHNwX3JwbV9jb250cm9scyk7IGlkeCsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2N0bF9uZXcxKCZzbmRfaGRzcF9ycG1fY29udHJvbHNbaWR4XSwgaGRzcCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2hkc3BfY29udHJvbHMpOyBpZHgrKykgewogCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9oZHNwX2NvbnRyb2xzW2lkeF0sIGhkc3ApKSkgPCAwKQogCQkJcmV0dXJuIGVycjsKQEAgLTM0NTksNDggKzM4MDksMTAyIEBACiAKIAlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogCi0Jc3dpdGNoIChoZHNwX3NwZGlmX2luKGhkc3ApKSB7Ci0JY2FzZSBIRFNQX1NQRElGSU5fT1BUSUNBTDoKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBPcHRpY2FsXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBIRFNQX1NQRElGSU5fQ09BWElBTDoKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBDb2F4aWFsXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBIRFNQX1NQRElGSU5fSU5URVJOQUw6Ci0JCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBpbnB1dDogSW50ZXJuYWxcbiIpOwotCQlicmVhazsKLQljYXNlIEhEU1BfU1BESUZJTl9BRVM6Ci0JCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBpbnB1dDogQUVTXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiA/Pz9cbiIpOwotCQlicmVhazsKKwlpZiAoaGRzcC0+aW9fdHlwZSAhPSBSUE0pIHsKKwkJc3dpdGNoIChoZHNwX3NwZGlmX2luKGhkc3ApKSB7CisJCWNhc2UgSERTUF9TUERJRklOX09QVElDQUw6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6IE9wdGljYWxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSERTUF9TUERJRklOX0NPQVhJQUw6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6IENvYXhpYWxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSERTUF9TUERJRklOX0lOVEVSTkFMOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBJbnRlcm5hbFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBIRFNQX1NQRElGSU5fQUVTOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IGlucHV0OiBBRVNcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggaW5wdXQ6ID8/P1xuIik7CisJCQlicmVhazsKKwkJfQogCX0KIAotCWlmIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9TUERJRk9wdGljYWxPdXQpCi0JCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBvdXRwdXQ6IENvYXhpYWwgJiBBREFUMVxuIik7Ci0JZWxzZQotCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggb3V0cHV0OiBDb2F4aWFsIG9ubHlcbiIpOworCWlmIChSUE0gPT0gaGRzcC0+aW9fdHlwZSkgeworCQlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfUlBNX0J5cGFzcykKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJQTSBCeXBhc3M6IGRpc2FibGVkXG4iKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiUlBNIEJ5cGFzczogZW5hYmxlZFxuIik7CisJCWlmIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9SUE1fRGlzY29ubmVjdCkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlJQTSBkaXNjb25uZWN0ZWRcbiIpOworCQllbHNlCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJSUE0gY29ubmVjdGVkXG4iKTsKIAotCWlmIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9TUERJRlByb2Zlc3Npb25hbCkKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IFByb2Zlc3Npb25hbFxuIik7Ci0JZWxzZQotCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggcXVhbGl0eTogQ29uc3VtZXJcbiIpOworCQlzd2l0Y2ggKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1JQTV9JbnAxMikgeworCQljYXNlIEhEU1BfUlBNX0lucDEyX1Bob25fNmRCOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgMS8yOiBQaG9ubywgNmRCXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEhEU1BfUlBNX0lucDEyX1Bob25fMGRCOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgMS8yOiBQaG9ubywgMGRCXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEhEU1BfUlBNX0lucDEyX1Bob25fbjZkQjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklucHV0IDEvMjogUGhvbm8sIC02ZEJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSERTUF9SUE1fSW5wMTJfTGluZV8wZEI6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnB1dCAxLzI6IExpbmUsIDBkQlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBIRFNQX1JQTV9JbnAxMl9MaW5lX242ZEI6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnB1dCAxLzI6IExpbmUsIC02ZEJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnB1dCAxLzI6ID8/P1xuIik7CisJCX0KIAotCWlmIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9TUERJRkVtcGhhc2lzKQotCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggZW1waGFzaXM6IG9uXG4iKTsKLQllbHNlCi0JCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBlbXBoYXNpczogb2ZmXG4iKTsKKwkJc3dpdGNoIChoZHNwLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUF9SUE1fSW5wMzQpIHsKKwkJY2FzZSBIRFNQX1JQTV9JbnAzNF9QaG9uXzZkQjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklucHV0IDMvNDogUGhvbm8sIDZkQlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBIRFNQX1JQTV9JbnAzNF9QaG9uXzBkQjoKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklucHV0IDMvNDogUGhvbm8sIDBkQlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBIRFNQX1JQTV9JbnAzNF9QaG9uX242ZEI6CisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnB1dCAzLzQ6IFBob25vLCAtNmRCXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIEhEU1BfUlBNX0lucDM0X0xpbmVfMGRCOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgMy80OiBMaW5lLCAwZEJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgSERTUF9SUE1fSW5wMzRfTGluZV9uNmRCOgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgMy80OiBMaW5lLCAtNmRCXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSW5wdXQgMy80OiA/Pz9cbiIpOworCQl9CiAKLQlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZOb25BdWRpbykKLQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IE5vbkF1ZGlvOiBvblxuIik7Ci0JZWxzZQotCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggTm9uQXVkaW86IG9mZlxuIik7Ci0JaWYgKCh4ID0gaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZSAoaGRzcCkpICE9IDApCi0JCXNuZF9pcHJpbnRmIChidWZmZXIsICJJRUM5NTggc2FtcGxlIHJhdGU6ICVkXG4iLCB4KTsKLQllbHNlCi0JCXNuZF9pcHJpbnRmIChidWZmZXIsICJJRUM5NTggc2FtcGxlIHJhdGU6IEVycm9yIGZsYWcgc2V0XG4iKTsKKwl9IGVsc2UgeworCQlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZPcHRpY2FsT3V0KQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IG91dHB1dDogQ29heGlhbCAmIEFEQVQxXG4iKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IG91dHB1dDogQ29heGlhbCBvbmx5XG4iKTsKIAorCQlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZQcm9mZXNzaW9uYWwpCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggcXVhbGl0eTogUHJvZmVzc2lvbmFsXG4iKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IHF1YWxpdHk6IENvbnN1bWVyXG4iKTsKKworCQlpZiAoaGRzcC0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BfU1BESUZFbXBoYXNpcykKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBlbXBoYXNpczogb25cbiIpOworCQllbHNlCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggZW1waGFzaXM6IG9mZlxuIik7CisKKwkJaWYgKGhkc3AtPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQX1NQRElGTm9uQXVkaW8pCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggTm9uQXVkaW86IG9uXG4iKTsKKwkJZWxzZQorCQkJc25kX2lwcmludGYoYnVmZmVyLCAiSUVDOTU4IE5vbkF1ZGlvOiBvZmZcbiIpOworCQl4ID0gaGRzcF9zcGRpZl9zYW1wbGVfcmF0ZShoZHNwKTsKKwkJaWYgKHggIT0gMCkKKwkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIklFQzk1OCBzYW1wbGUgcmF0ZTogJWRcbiIsIHgpOworCQllbHNlCisJCQlzbmRfaXByaW50ZihidWZmZXIsICJJRUM5NTggc2FtcGxlIHJhdGU6IEVycm9yIGZsYWcgc2V0XG4iKTsKKwl9CiAJc25kX2lwcmludGYoYnVmZmVyLCAiXG4iKTsKIAogCS8qIFN5bmMgQ2hlY2sgKi8KQEAgLTM3NjUsNyArNDE2OSw3IEBACiAJCQlzbmRfaGRzcF9taWRpX2lucHV0X3JlYWQgKCZoZHNwLT5taWRpWzBdKTsKIAkJfQogCX0KLQlpZiAoaGRzcC0+aW9fdHlwZSAhPSBNdWx0aWZhY2UgJiYgaGRzcC0+aW9fdHlwZSAhPSBIOTYzMiAmJiBtaWRpMSAmJiBtaWRpMXN0YXR1cykgeworCWlmIChoZHNwLT5pb190eXBlICE9IE11bHRpZmFjZSAmJiBoZHNwLT5pb190eXBlICE9IFJQTSAmJiBoZHNwLT5pb190eXBlICE9IEg5NjMyICYmIG1pZGkxICYmIG1pZGkxc3RhdHVzKSB7CiAJCWlmIChoZHNwLT51c2VfbWlkaV90YXNrbGV0KSB7CiAJCQkvKiB3ZSBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgaW5wdXQgdW50aWwgcHJvY2Vzc2luZyBpcyBkb25lICovCiAJCQloZHNwLT5jb250cm9sX3JlZ2lzdGVyICY9IH5IRFNQX01pZGkxSW50ZXJydXB0RW5hYmxlOwpAQCAtNDA5Myw3ICs0NDk3LDcgQEAKIAkJCQkgU05EUlZfUENNX1JBVEVfOTYwMDApLAogCS5yYXRlX21pbiA9CQkzMjAwMCwKIAkucmF0ZV9tYXggPQkJOTYwMDAsCi0JLmNoYW5uZWxzX21pbiA9CQkxNCwKKwkuY2hhbm5lbHNfbWluID0JCTYsCiAJLmNoYW5uZWxzX21heCA9CQlIRFNQX01BWF9DSEFOTkVMUywKIAkuYnVmZmVyX2J5dGVzX21heCA9CUhEU1BfQ0hBTk5FTF9CVUZGRVJfQllURVMgKiBIRFNQX01BWF9DSEFOTkVMUywKIAkucGVyaW9kX2J5dGVzX21pbiA9CSg2NCAqIDQpICogMTAsCkBAIC00MTIyLDcgKzQ1MjYsNyBAQAogCQkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCksCiAJLnJhdGVfbWluID0JCTMyMDAwLAogCS5yYXRlX21heCA9CQk5NjAwMCwKLQkuY2hhbm5lbHNfbWluID0JCTE0LAorCS5jaGFubmVsc19taW4gPQkJNSwKIAkuY2hhbm5lbHNfbWF4ID0JCUhEU1BfTUFYX0NIQU5ORUxTLAogCS5idWZmZXJfYnl0ZXNfbWF4ID0JSERTUF9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqIEhEU1BfTUFYX0NIQU5ORUxTLAogCS5wZXJpb2RfYnl0ZXNfbWluID0JKDY0ICogNCkgKiAxMCwKQEAgLTQzNTcsMTAgKzQ3NjEsMTIgQEAKIAkJCSAgICAgc25kX2hkc3BfaHdfcnVsZV9yYXRlX291dF9jaGFubmVscywgaGRzcCwKIAkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CiAKLQloZHNwLT5jcmVnX3NwZGlmX3N0cmVhbSA9IGhkc3AtPmNyZWdfc3BkaWY7Ci0JaGRzcC0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKLQlzbmRfY3RsX25vdGlmeShoZHNwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8Ci0JCSAgICAgICBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmaGRzcC0+c3BkaWZfY3RsLT5pZCk7CisJaWYgKFJQTSAhPSBoZHNwLT5pb190eXBlKSB7CisJCWhkc3AtPmNyZWdfc3BkaWZfc3RyZWFtID0gaGRzcC0+Y3JlZ19zcGRpZjsKKwkJaGRzcC0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKKwkJc25kX2N0bF9ub3RpZnkoaGRzcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfAorCQkJU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywgJmhkc3AtPnNwZGlmX2N0bC0+aWQpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDM3NSw5ICs0NzgxLDExIEBACiAKIAlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOwogCi0JaGRzcC0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOwotCXNuZF9jdGxfbm90aWZ5KGhkc3AtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFIHwKLQkJICAgICAgIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sICZoZHNwLT5zcGRpZl9jdGwtPmlkKTsKKwlpZiAoUlBNICE9IGhkc3AtPmlvX3R5cGUpIHsKKwkJaGRzcC0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOworCQlzbmRfY3RsX25vdGlmeShoZHNwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSB8CisJCQlTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLCAmaGRzcC0+c3BkaWZfY3RsLT5pZCk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC00NjE2LDcgKzUwMjQsNyBAQAogCQlpZiAoaGRzcC0+aW9fdHlwZSAhPSBIOTYzMikKIAkJICAgIGluZm8uYWRhdHN5bmNfc3luY19jaGVjayA9ICh1bnNpZ25lZCBjaGFyKWhkc3BfYWRhdHN5bmNfc3luY19jaGVjayhoZHNwKTsKIAkJaW5mby5zcGRpZl9zeW5jX2NoZWNrID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9zcGRpZl9zeW5jX2NoZWNrKGhkc3ApOwotCQlmb3IgKGkgPSAwOyBpIDwgKChoZHNwLT5pb190eXBlICE9IE11bHRpZmFjZSAmJiBoZHNwLT5pb190eXBlICE9IEg5NjMyKSA/IDMgOiAxKTsgKytpKQorCQlmb3IgKGkgPSAwOyBpIDwgKChoZHNwLT5pb190eXBlICE9IE11bHRpZmFjZSAmJiBoZHNwLT5pb190eXBlICE9IFJQTSAmJiBoZHNwLT5pb190eXBlICE9IEg5NjMyKSA/IDMgOiAxKTsgKytpKQogCQkJaW5mby5hZGF0X3N5bmNfY2hlY2tbaV0gPSAodW5zaWduZWQgY2hhciloZHNwX2FkYXRfc3luY19jaGVjayhoZHNwLCBpKTsKIAkJaW5mby5zcGRpZl9pbiA9ICh1bnNpZ25lZCBjaGFyKWhkc3Bfc3BkaWZfaW4oaGRzcCk7CiAJCWluZm8uc3BkaWZfb3V0ID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9zcGRpZl9vdXQoaGRzcCk7CkBAIC00NjM2LDYgKzUwNDQsOSBAQAogCQkJaW5mby5waG9uZV9nYWluID0gKHVuc2lnbmVkIGNoYXIpaGRzcF9waG9uZV9nYWluKGhkc3ApOwogCQkJaW5mby54bHJfYnJlYWtvdXRfY2FibGUgPSAodW5zaWduZWQgY2hhciloZHNwX3hscl9icmVha291dF9jYWJsZShoZHNwKTsKIAorCQl9IGVsc2UgaWYgKGhkc3AtPmlvX3R5cGUgPT0gUlBNKSB7CisJCQlpbmZvLmRhX2dhaW4gPSAodW5zaWduZWQgY2hhcikgaGRzcF9ycG1faW5wdXQxMihoZHNwKTsKKwkJCWluZm8uYWRfZ2FpbiA9ICh1bnNpZ25lZCBjaGFyKSBoZHNwX3JwbV9pbnB1dDM0KGhkc3ApOwogCQl9CiAJCWlmIChoZHNwLT5pb190eXBlID09IEg5NjMyIHx8IGhkc3AtPmlvX3R5cGUgPT0gSDk2NTIpCiAJCQlpbmZvLmFuYWxvZ19leHRlbnNpb25fYm9hcmQgPSAodW5zaWduZWQgY2hhciloZHNwX2FlYihoZHNwKTsKQEAgLTQ4NDQsNiArNTI1NSwxNCBAQAogCQloZHNwLT5kc19pbl9jaGFubmVscyA9IGhkc3AtPmRzX291dF9jaGFubmVscyA9IE1VTFRJRkFDRV9EU19DSEFOTkVMUzsKIAkJYnJlYWs7CiAKKwljYXNlIFJQTToKKwkJaGRzcC0+Y2FyZF9uYW1lID0gIlJNRSBIYW1tZXJmYWxsIERTUCArIFJQTSI7CisJCWhkc3AtPnNzX2luX2NoYW5uZWxzID0gUlBNX0NIQU5ORUxTLTE7CisJCWhkc3AtPnNzX291dF9jaGFubmVscyA9IFJQTV9DSEFOTkVMUzsKKwkJaGRzcC0+ZHNfaW5fY2hhbm5lbHMgPSBSUE1fQ0hBTk5FTFMtMTsKKwkJaGRzcC0+ZHNfb3V0X2NoYW5uZWxzID0gUlBNX0NIQU5ORUxTOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAgCQkvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KIAkJYnJlYWs7CkBAIC00OTMwLDYgKzUzNDksOSBAQAogCiAJLyogY2F1dGlvbjogbWF4IGxlbmd0aCBvZiBmaXJtd2FyZSBmaWxlbmFtZSBpcyAzMCEgKi8KIAlzd2l0Y2ggKGhkc3AtPmlvX3R5cGUpIHsKKwljYXNlIFJQTToKKwkJZndmaWxlID0gInJwbV9maXJtd2FyZS5iaW4iOworCQlicmVhazsKIAljYXNlIE11bHRpZmFjZToKIAkJaWYgKGhkc3AtPmZpcm13YXJlX3JldiA9PSAweGEpCiAJCQlmd2ZpbGUgPSAibXVsdGlmYWNlX2Zpcm13YXJlLmJpbiI7CkBAIC01MTAwLDcgKzU1MjIsOSBAQAogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiSGFtbWVyZmFsbC1EU1A6IEZpcm13YXJlIGFscmVhZHkgcHJlc2VudCwgaW5pdGlhbGl6aW5nIGNhcmQuXG4iKTsKLQkJCWlmIChoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpICYgSERTUF92ZXJzaW9uMSkKKwkJCWlmIChoZHNwX3JlYWQoaGRzcCwgSERTUF9zdGF0dXMyUmVnaXN0ZXIpICYgSERTUF92ZXJzaW9uMikKKwkJCQloZHNwLT5pb190eXBlID0gUlBNOworCQkJZWxzZSBpZiAoaGRzcF9yZWFkKGhkc3AsIEhEU1Bfc3RhdHVzMlJlZ2lzdGVyKSAmIEhEU1BfdmVyc2lvbjEpCiAJCQkJaGRzcC0+aW9fdHlwZSA9IE11bHRpZmFjZTsKIAkJCWVsc2UKIAkJCQloZHNwLT5pb190eXBlID0gRGlnaWZhY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwppbmRleCAwYzk4ZWY5Li5mNWVhZGZjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnBsYXliYWNrX21peGVyX2N0bHNbSERTUE1fTUFYX0NIQU5ORUxTXTsKIAkvKiBidXQgaW5wdXQgdG8gbXVjaCwgc28gbm90IHVzZWQgKi8KIAlzdHJ1Y3Qgc25kX2tjb250cm9sICppbnB1dF9taXhlcl9jdGxzW0hEU1BNX01BWF9DSEFOTkVMU107Ci0JLyogZnVsbCBtaXhlciBhY2Nlc3NhYmxlIG92ZXIgbWl4ZXIgaW9jdGwgb3IgaHdkZXAtZGV2aWNlICovCisJLyogZnVsbCBtaXhlciBhY2Nlc3NpYmxlIG92ZXIgbWl4ZXIgaW9jdGwgb3IgaHdkZXAtZGV2aWNlICovCiAJc3RydWN0IGhkc3BtX21peGVyICptaXhlcjsKIAogfTsKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXJldHVybiBiaXQyZnJlcV90YWJbbl07CiB9CiAKLS8qIFdyaXRlL3JlYWQgdG8vZnJvbSBIRFNQTSB3aXRoIEFkcmVzc2VzIGluIEJ5dGVzCisvKiBXcml0ZS9yZWFkIHRvL2Zyb20gSERTUE0gd2l0aCBBZGRyZXNzZXMgaW4gQnl0ZXMKICAgIG5vdCB3b3JkcyBidXQgb25seSAzMkJpdCB3cml0ZXMgYXJlIGFsbG93ZWQgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGhkc3BtX3dyaXRlKHN0cnVjdCBoZHNwbSAqIGhkc3BtLCB1bnNpZ25lZCBpbnQgcmVnLApAQCAtMjkwOCw3ICsyOTA4LDcgQEAKIAogCS8qIENoYW5uZWwgcGxheWJhY2sgbWl4ZXIgYXMgZGVmYXVsdCBjb250cm9sIAogCSAgIE5vdGU6IHRoZSB3aG9sZSBtYXRyaXggd291bGQgYmUgMTI4KkhEU1BNX01JWEVSX0NIQU5ORUxTIEZhZGVycywKLQkgICB0aGF0cyB0b28gKiBiaWcgZm9yIGFueSBhbHNhbWl4ZXIgdGhleSBhcmUgYWNjZXNpYmxlIHZpYSBzcGVjaWFsCisJICAgdGhhdHMgdG9vICogYmlnIGZvciBhbnkgYWxzYW1peGVyIHRoZXkgYXJlIGFjY2Vzc2libGUgdmlhIHNwZWNpYWwKIAkgICBJT0NUTCBvbiBod2RlcCBhbmQgdGhlIG1peGVyIDJkaW1lbnNpb25hbCBtaXhlciBjb250cm9sCiAJKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IDU1MTgzNzEuLmM5NGMwNTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTEzODksMTUgKzEzODksOSBAQAogCiBzdGF0aWMgaW50IHNuZF95bWZwY2lfZHJlY19zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvKQogewotCXN0YXRpYyBjaGFyICp0ZXh0c1szXSA9IHsiQUMnOTciLCAiSUVDOTU4IiwgIlpWIFBvcnQifTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGV4dHNbM10gPSB7IkFDJzk3IiwgIklFQzk1OCIsICJaViBQb3J0In07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMikKLQkJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMjsKLQlzdHJjcHkoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1tpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMywgdGV4dHMpOwogfQogCiBzdGF0aWMgaW50IHNuZF95bWZwY2lfZHJlY19zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IDU4MWE2NzAuLmVkY2U4YTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtNTEsNyArNTEsNyBAQAogc3RhdGljIGludCBzbmRfcHMzX3N0YXJ0X2RlbGF5ID0gQ09ORklHX1NORF9QUzNfREVGQVVMVF9TVEFSVF9ERUxBWTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKHN0YXJ0X2RlbGF5LCBzbmRfcHMzX3N0YXJ0X2RlbGF5LCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3RhcnRfZGVsYXksICJ0aW1lIHRvIGluc2VydCBzaWxlbnQgZGF0YSBpbiBtaWxpc2VjIik7CitNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X2RlbGF5LCAidGltZSB0byBpbnNlcnQgc2lsZW50IGRhdGEgaW4gbXMiKTsKIAogc3RhdGljIGludCBpbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsKIHN0YXRpYyBjaGFyICppZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9LY29uZmlnIGIvc291bmQvc29jL0tjb25maWcKaW5kZXggM2U1OThlNy4uYTNlZmM1MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL0tjb25maWcKKysrIGIvc291bmQvc29jL0tjb25maWcKQEAgLTIwLDYgKzIwLDIxIEBACiAKIGlmIFNORF9TT0MKIAorY29uZmlnIFNORF9TT0NfQ0FDSEVfTFpPCisJYm9vbCAiU3VwcG9ydCBMWk8gY29tcHJlc3Npb24gZm9yIHJlZ2lzdGVyIGNhY2hlcyIKKwlzZWxlY3QgTFpPX0NPTVBSRVNTCisJc2VsZWN0IExaT19ERUNPTVBSRVNTCisJLS0taGVscC0tLQorCSAgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBMWk8gY29tcHJlc3Npb24gZm9yIHJlZ2lzdGVyIGNhY2hlcy4KKwkgICBUaGlzIHdpbGwgYWxsb3cgbWFjaGluZSBvciBDT0RFQyBkcml2ZXJzIHRvIGNvbXByZXNzIHJlZ2lzdGVyCisJICAgY2FjaGVzIGluIG1lbW9yeSwgcmVkdWNpbmcgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBhdCB0aGUKKwkgICBleHBlbnNlIG9mIHBlcmZvcm1hbmNlLiAgSWYgdGhpcyBpcyBub3QgcHJlc2VudCBhbmQgaXMgdXNlZAorCSAgIHRoZSBzeXN0ZW0gd2lsbCBmYWxsIGJhY2sgdG8gdW5jb21wcmVzc2VkIGNhY2hlcy4KKworCSAgIFVzdWFsbHkgaXQgaXMgc2FmZSB0byBkaXNhYmxlIHRoaXMgb3B0aW9uLCB3aGVyZSBjYWNoZQorCSAgIGNvbXByZXNzaW9uIGluIHVzZWQgdGhlIHJidHJlZSBvcHRpb24gd2lsbCB0eXBpY2FsbHkgcGVyZm9ybQorCSAgIGJldHRlci4KKwogY29uZmlnIFNORF9TT0NfQUM5N19CVVMKIAlib29sCiAKQEAgLTM2LDcgKzUxLDcgQEAKIHNvdXJjZSAic291bmQvc29jL29tYXAvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL2tpcmt3b29kL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9weGEvS2NvbmZpZyIKLXNvdXJjZSAic291bmQvc29jL3MzYzI0eHgvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL3NhbXN1bmcvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3M2MDAwL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zaC9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvdHh4OS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IGViMTgzNDQuLmNlOTEzYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBvbWFwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IGtpcmt3b29kLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHB4YS8KLW9iai0kKENPTkZJR19TTkRfU09DKQkrPSBzM2MyNHh4Lworb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNhbXN1bmcvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gczYwMDAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc2gvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gdHh4OS8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9wbGF5cGFxX3dtODUxMC5jIGIvc291bmQvc29jL2F0bWVsL3BsYXlwYXFfd204NTEwLmMKaW5kZXggNWY0ZTU5Zi4uMWFhYzJmNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL3BsYXlwYXFfd204NTEwLmMKKysrIGIvc291bmQvc29jL2F0bWVsL3BsYXlwYXFfd204NTEwLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgogI2luY2x1ZGUgPG1hY2gvcG9ydG11eC5oPgpAQCAtMzE4LDI3ICszMTcsMjggQEAKIHN0YXRpYyBpbnQgcGxheXBhcV93bTg1MTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBpOwogCiAJLyoKIAkgKiBBZGQgREFQTSB3aWRnZXRzCiAJICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGxheXBhcV9kYXBtX3dpZGdldHMpOyBpKyspCi0JCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChjb2RlYywgJnBsYXlwYXFfZGFwbV93aWRnZXRzW2ldKTsKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGRhcG0sICZwbGF5cGFxX2RhcG1fd2lkZ2V0c1tpXSk7CiAKIAogCiAJLyoKIAkgKiBTZXR1cCBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMKIAkgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAKIAogCS8qIGFsd2F5cyBjb25uZWN0ZWQgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSW50IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IFNwayIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50IE1pYyIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvc2FtOWcyMF93bTg3MzEuYyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCmluZGV4IGU1MjFhZGEuLmFmM2M3MzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9zYW05ZzIwX3dtODczMS5jCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTE0MCw2ICsxMzksNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAogCXByaW50ayhLRVJOX0RFQlVHCkBAIC0xNTQsMjUgKzE1NCwyNSBAQAogCX0KIAogCS8qIEFkZCBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgYXQ5MXNhbTlnMjBla19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhdDkxc2FtOWcyMGVrX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBla19kYXBtX3dpZGdldHMpKTsKIAkvKiBTZXQgdXAgc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCS8qIG5vdCBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUkxJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxMSU5FSU4iKTsKIAogI2lmZGVmIEVOQUJMRV9NSUNfSU5QVVQKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkludCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50IE1pYyIpOwogI2Vsc2UKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSW50IE1pYyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkludCBNaWMiKTsKICNlbmRpZgogCiAJLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IFNwayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9zbmQtc29jLWFmZWI5MjYwLmMgYi9zb3VuZC9zb2MvYXRtZWwvc25kLXNvYy1hZmViOTI2MC5jCmluZGV4IDg2ZTBmODUuLmRhMjIwOGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9zbmQtc29jLWFmZWI5MjYwLmMKKysrIGIvc291bmQvc29jL2F0bWVsL3NuZC1zb2MtYWZlYjkyNjAuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xMDUsMTkgKzEwNCwyMCBAQAogc3RhdGljIGludCBhZmViOTI2MF90bHYzMjBhaWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAkvKiBBZGQgYWZlYjkyNjAgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBTZXQgdXAgYWZlYjkyNjAgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgSW4iKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F1MXgvZGIxMjAwLmMgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwppbmRleCBiNjJmY2QzLi5jYjk5ZjA0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYworKysgYi9zb3VuZC9zb2MvYXUxeC9kYjEyMDAuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE4MzYuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE4MzYuYwppbmRleCAyMzk0YmZmLi44MzAxMmRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxODM2LmMKKysrIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTgzNi5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxOTN4LmMgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQxOTN4LmMKaW5kZXggZTRhNjI1My4uZDNjY2I5MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkMTkzeC5jCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDE5M3guYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkNzMzMTEuYyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1hZDczMzExLmMKaW5kZXggOTAwY2VkNS4uNzMyZmI4YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LWFkNzMzMTEuYworKysgYi9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtYWQ3MzMxMS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3NtMjYwMi5jIGIvc291bmQvc29jL2JsYWNrZmluL2JmNXh4LXNzbTI2MDIuYwppbmRleCAzNmYyNzY5Li5lOTAyYjI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYmxhY2tmaW4vYmY1eHgtc3NtMjYwMi5jCisrKyBiL3NvdW5kL3NvYy9ibGFja2Zpbi9iZjV4eC1zc20yNjAyLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKICNpbmNsdWRlIDxhc20vZG1hLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMgYi9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKaW5kZXggMDFkMTllOS4uMDZiNjk4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwpAQCAtMTksMTAgKzE5LDEwIEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCiAjaW5jbHVkZSAiODhwbTg2MHgtY29kZWMuaCIKIApAQCAtMTQ2LDcgKzE0Niw2IEBACiAKIAlpbnQJCQlpcnFbNF07CiAJdW5zaWduZWQgY2hhcgkJbmFtZVs0XVtNQVhfTkFNRV9MRU5dOwotCXVuc2lnbmVkIGNoYXIJCXJlZ19jYWNoZVtSRUdfQ0FDSEVfU0laRV07CiB9OwogCiAvKiAtOTQ1MGRCIHRvIDBkQiBpbiAxNTBkQiBzdGVwcyAoIG11dGUgaW5zdGVhZCBvZiAtOTQ1MGRCKSAqLwpAQCAtMTE3Miw3ICsxMTcxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgQXVkaW8gUExMICYgQXVkaW8gc2VjdGlvbiAqLwogCQkJZGF0YSA9IEFVRElPX1BMTCB8IEFVRElPX1NFQ1RJT05fUkVTRVQKIAkJCQl8IEFVRElPX1NFQ1RJT05fT047CkBAIC0xMTg1LDcgKzExODQsNyBAQAogCQlwbTg2MHhfc2V0X2JpdHMoY29kZWMtPmNvbnRyb2xfZGF0YSwgUkVHX01JU0MyLCBkYXRhLCAwKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCkBAIC0xMjYzLDYgKzEyNjIsMTIgQEAKIAltYXNrID0gcG04NjB4LT5kZXQuaHNfc2hydCB8IHBtODYweC0+ZGV0Lmhvb2tfZGV0IHwgcG04NjB4LT5kZXQubG9fc2hydAogCQl8IHBtODYweC0+ZGV0LmhwX2RldDsKIAorI2lmbmRlZiBDT05GSUdfU05EX1NPQ184OFBNODYwWF9NT0RVTEUKKwlpZiAoc3RhdHVzICYgKEhFQURTRVRfU1RBVFVTIHwgTUlDX1NUQVRVUyB8IFNIT1JUX0hTMSB8IFNIT1JUX0hTMiB8CisJCSAgICAgIFNIT1JUX0xPMSB8IFNIT1JUX0xPMikpCisJCXRyYWNlX3NuZF9zb2NfamFja19pcnEoZGV2X25hbWUocG04NjB4LT5jb2RlYy0+ZGV2KSk7CisjZW5kaWYKKwogCWlmICgocG04NjB4LT5kZXQuaHBfZGV0ICYgU05EX0pBQ0tfSEVBRFBIT05FKQogCQkmJiAoc3RhdHVzICYgSEVBRFNFVF9TVEFUVVMpKQogCQlyZXBvcnQgfD0gU05EX0pBQ0tfSEVBRFBIT05FOwpAQCAtMTM0Niw2ICsxMzUxLDcgQEAKIHN0YXRpYyBpbnQgcG04NjB4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgcG04NjB4X3ByaXYgKnBtODYweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgaSwgcmV0OwogCiAJcG04NjB4LT5jb2RlYyA9IGNvZGVjOwpAQCAtMTM1OCw3ICsxMzY0LDcgQEAKIAkJCQkJICAgcG04NjB4LT5uYW1lW2ldLCBwbTg2MHgpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRIVxuIik7Ci0JCQlnb3RvIG91dF9pcnE7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIApAQCAtMTM2OSwyMiArMTM3NSwyMCBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmaWxsIHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKIAkJCXJldCk7Ci0JCWdvdG8gb3V0X2NvZGVjOworCQlnb3RvIG91dDsKIAl9CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgcG04NjB4X3NuZF9jb250cm9scywKIAkJCSAgICAgQVJSQVlfU0laRShwbTg2MHhfc25kX2NvbnRyb2xzKSk7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgcG04NjB4X2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHBtODYweF9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHBtODYweF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAlyZXR1cm4gMDsKIAotb3V0X2NvZGVjOgotCWkgPSAzOwotb3V0X2lycToKLQlmb3IgKDsgaSA+PSAwOyBpLS0pCitvdXQ6CisJd2hpbGUgKC0taSA+PSAwKQogCQlmcmVlX2lycShwbTg2MHgtPmlycVtpXSwgcG04NjB4KTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHBtODYweF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IDNiNTY5MGQuLjg4M2EzMTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTIyLDYgKzIyLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19BSzQ1MzUgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfQUs0NjQyIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FLNDY3MSBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19BTEM1NjIzIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0NRMDA5M1ZDIGlmIE1GRF9EQVZJTkNJX1ZPSUNFQ09ERUMKIAlzZWxlY3QgU05EX1NPQ19DUzQyTDUxIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX0NTNDI3MCBpZiBJMkMKQEAgLTU0LDkgKzU1LDExIEBACiAJc2VsZWN0IFNORF9TT0NfV004NzI3CiAJc2VsZWN0IFNORF9TT0NfV004NzI4IGlmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX1NPQ19XTTg3MzEgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQorCXNlbGVjdCBTTkRfU09DX1dNODczNyBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004NzQxIGlmIFNORF9TT0NfSTJDX0FORF9TUEkKIAlzZWxlY3QgU05EX1NPQ19XTTg3NTAgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODc1MyBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfV004NzcwIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19XTTg3NzYgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODgwNCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9TT0NfV004OTAwIGlmIEkyQwpAQCAtNzUsNiArNzgsNyBAQAogCXNlbGVjdCBTTkRfU09DX1dNODk5MCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTg5OTMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004OTk0IGlmIE1GRF9XTTg5OTQKKwlzZWxlY3QgU05EX1NPQ19XTTg5OTUgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNOTA4MSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTkwOTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV005NzA1IGlmIFNORF9TT0NfQUM5N19CVVMKQEAgLTEzMCw2ICsxMzQsOSBAQAogY29uZmlnIFNORF9TT0NfQUs0NjcxCiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfQUxDNTYyMworICAgICAgIHRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX0NRMDA5M1ZDCiAJdHJpc3RhdGUKIApAQCAtMTYwLDYgKzE2Nyw5IEBACiBjb25maWcgU05EX1NPQ19EQTcyMTAKICAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfRE1JQworCXRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX01BWDk4MDg4CiAgICAgICAgdHJpc3RhdGUKIApAQCAtMjMxLDYgKzI0MSw5IEBACiBjb25maWcgU05EX1NPQ19XTTg3MzEKIAl0cmlzdGF0ZQogCitjb25maWcgU05EX1NPQ19XTTg3MzcKKwl0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19XTTg3NDEKIAl0cmlzdGF0ZQogCkBAIC0yNDAsNiArMjUzLDkgQEAKIGNvbmZpZyBTTkRfU09DX1dNODc1MwogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX1dNODc3MAorCXRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1dNODc3NgogCXRyaXN0YXRlCiAKQEAgLTI5NCw2ICszMTAsOSBAQAogY29uZmlnIFNORF9TT0NfV004OTk0CiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfV004OTk1CisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfV005MDgxCiAJdHJpc3RhdGUKIApAQCAtMzE4LDMgKzMzNyw0IEBACiAKIGNvbmZpZyBTTkRfU09DX1dNOTA5MAogCXRyaXN0YXRlCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IGY2N2EyZDYuLjU3OWFmOWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMTQsOSArMTQsMTEgQEAKIHNuZC1zb2MtY3M0MjcwLW9ianMgOj0gY3M0MjcwLm8KIHNuZC1zb2MtY3gyMDQ0Mi1vYmpzIDo9IGN4MjA0NDIubwogc25kLXNvYy1kYTcyMTAtb2JqcyA6PSBkYTcyMTAubworc25kLXNvYy1kbWljLW9ianMgOj0gZG1pYy5vCiBzbmQtc29jLWwzLW9ianMgOj0gbDMubwogc25kLXNvYy1tYXg5ODA4OC1vYmpzIDo9IG1heDk4MDg4Lm8KIHNuZC1zb2MtcGNtMzAwOC1vYmpzIDo9IHBjbTMwMDgubworc25kLXNvYy1hbGM1NjIzLW9ianMgOj0gYWxjNTYyMy5vCiBzbmQtc29jLXNwZGlmLW9ianMgOj0gc3BkaWZfdHJhbnNjaWV2ZXIubwogc25kLXNvYy1zc20yNjAyLW9ianMgOj0gc3NtMjYwMi5vCiBzbmQtc29jLXN0YWM5NzY2LW9ianMgOj0gc3RhYzk3NjYubwpAQCAtMzgsOSArNDAsMTEgQEAKIHNuZC1zb2Mtd204NzI3LW9ianMgOj0gd204NzI3Lm8KIHNuZC1zb2Mtd204NzI4LW9ianMgOj0gd204NzI4Lm8KIHNuZC1zb2Mtd204NzMxLW9ianMgOj0gd204NzMxLm8KK3NuZC1zb2Mtd204NzM3LW9ianMgOj0gd204NzM3Lm8KIHNuZC1zb2Mtd204NzQxLW9ianMgOj0gd204NzQxLm8KIHNuZC1zb2Mtd204NzUwLW9ianMgOj0gd204NzUwLm8KIHNuZC1zb2Mtd204NzUzLW9ianMgOj0gd204NzUzLm8KK3NuZC1zb2Mtd204NzcwLW9ianMgOj0gd204NzcwLm8KIHNuZC1zb2Mtd204Nzc2LW9ianMgOj0gd204Nzc2Lm8KIHNuZC1zb2Mtd204ODA0LW9ianMgOj0gd204ODA0Lm8KIHNuZC1zb2Mtd204OTAwLW9ianMgOj0gd204OTAwLm8KQEAgLTU4LDcgKzYyLDggQEAKIHNuZC1zb2Mtd204OTg4LW9ianMgOj0gd204OTg4Lm8KIHNuZC1zb2Mtd204OTkwLW9ianMgOj0gd204OTkwLm8KIHNuZC1zb2Mtd204OTkzLW9ianMgOj0gd204OTkzLm8KLXNuZC1zb2Mtd204OTk0LW9ianMgOj0gd204OTk0Lm8KK3NuZC1zb2Mtd204OTk0LW9ianMgOj0gd204OTk0Lm8gd204OTk0LXRhYmxlcy5vCitzbmQtc29jLXdtODk5NS1vYmpzIDo9IHdtODk5NS5vCiBzbmQtc29jLXdtOTA4MS1vYmpzIDo9IHdtOTA4MS5vCiBzbmQtc29jLXdtOTcwNS1vYmpzIDo9IHdtOTcwNS5vCiBzbmQtc29jLXdtOTcxMi1vYmpzIDo9IHdtOTcxMi5vCkBAIC04OCwxMCArOTMsMTIgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0NTNDI3MCkJKz0gc25kLXNvYy1jczQyNzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfQ1gyMDQ0MikJKz0gc25kLXNvYy1jeDIwNDQyLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0RBNzIxMCkJKz0gc25kLXNvYy1kYTcyMTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfRE1JQykJKz0gc25kLXNvYy1kbWljLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0wzKQkrPSBzbmQtc29jLWwzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0paNDc0MF9DT0RFQykJKz0gc25kLXNvYy1qejQ3NDAtY29kZWMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTgwODgpCSs9IHNuZC1zb2MtbWF4OTgwODgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUENNMzAwOCkJKz0gc25kLXNvYy1wY20zMDA4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0FMQzU2MjMpICAgICs9IHNuZC1zb2MtYWxjNTYyMy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TUERJRikJKz0gc25kLXNvYy1zcGRpZi5vCiBvYmotJChDT05GSUdfU05EX1NPQ19TU00yNjAyKQkrPSBzbmQtc29jLXNzbTI2MDIubwogb2JqLSQoQ09ORklHX1NORF9TT0NfU1RBQzk3NjYpCSs9IHNuZC1zb2Mtc3RhYzk3NjYubwpAQCAtMTEzLDkgKzEyMCwxMSBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzI3KQkrPSBzbmQtc29jLXdtODcyNy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg3MjgpCSs9IHNuZC1zb2Mtd204NzI4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODczMSkJKz0gc25kLXNvYy13bTg3MzEubworb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzM3KQkrPSBzbmQtc29jLXdtODczNy5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg3NDEpCSs9IHNuZC1zb2Mtd204NzQxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc1MCkJKz0gc25kLXNvYy13bTg3NTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzUzKQkrPSBzbmQtc29jLXdtODc1My5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg3NzApCSs9IHNuZC1zb2Mtd204NzcwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc3NikJKz0gc25kLXNvYy13bTg3NzYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004ODA0KQkrPSBzbmQtc29jLXdtODgwNC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5MDApCSs9IHNuZC1zb2Mtd204OTAwLm8KQEAgLTEzNCw2ICsxNDMsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTkwKQkrPSBzbmQtc29jLXdtODk5MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5OTMpCSs9IHNuZC1zb2Mtd204OTkzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODk5NCkJKz0gc25kLXNvYy13bTg5OTQubworb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTk1KQkrPSBzbmQtc29jLXdtODk5NS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTkwODEpCSs9IHNuZC1zb2Mtd205MDgxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNOTcwNSkJKz0gc25kLXNvYy13bTk3MDUubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV005NzEyKQkrPSBzbmQtc29jLXdtOTcxMi5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCBkMjcyNTM0Li5hYjYzZDUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSAiYWQxODM2LmgiCiAKQEAgLTIyMCw2ICsyMTksNyBAQAogc3RhdGljIGludCBhZDE4MzZfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhZDE4MzZfcHJpdiAqYWQxODM2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQgPSAwOwogCiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFkMTgzNi0+Y29udHJvbF9kYXRhOwpAQCAtMjI3LDcgKzIyNyw2IEBACiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLAogCQkJCXJldCk7Ci0JCWtmcmVlKGFkMTgzNik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yNTIsOSArMjUxLDkgQEAKIAogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhZDE4MzZfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKGFkMTgzNl9zbmRfY29udHJvbHMpKTsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBhZDE4MzZfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWQxODM2X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoYWQxODM2X2RhcG1fd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19wYXRocywgQVJSQVlfU0laRShhdWRpb19wYXRocykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX3BhdGhzLCBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKaW5kZXggZmEyODM0Yy4uZGE0NjQ3OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCkBAIC0xOSwxMiArMTksMTAgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlICJhZDE5M3guaCIKIAogLyogY29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgYWQxOTN4X3ByaXYgewotCXU4IHJlZ19jYWNoZVtBRDE5M1hfTlVNX1JFR1NdOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgYnVzX3R5cGU7CiAJdm9pZCAqY29udHJvbF9kYXRhOwogCWludCBzeXNjbGs7CkBAIC0zNTMsNiArMzUxLDcgQEAKIHN0YXRpYyBpbnQgYWQxOTN4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWQxOTN4X3ByaXYgKmFkMTkzeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFkMTkzeC0+Y29udHJvbF9kYXRhOwpAQCAtMzYzLDcgKzM2Miw2IEBACiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLAogCQkJCXJldCk7Ci0JCWtmcmVlKGFkMTkzeCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zODUsOSArMzgzLDkgQEAKIAogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhZDE5M3hfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpKTsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBhZDE5M3hfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWQxOTN4X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoYWQxOTN4X2RhcG1fd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19wYXRocywgQVJSQVlfU0laRShhdWRpb19wYXRocykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX3BhdGhzLCBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKaW5kZXggNDEwY2NkNS4uMzRjYjUxZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSAiYWQxOTgwLmgiCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCmluZGV4IGNkODhjOGYuLjhiMzg3MzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgImFrNDUzNS5oIgpAQCAtMjkwLDEwICsyODksMTEgQEAKIAogc3RhdGljIGludCBhazQ1MzVfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIGFrNDUzNV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKGFrNDUzNV9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWs0NTM1X2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUoYWs0NTM1X2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzY2LDkgKzM2Niw5IEBACiBzdGF0aWMgaW50IGFrNDUzNV9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCXUxNiBtdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQykgJiAweGZmZGY7CisJdTE2IG11dGVfcmVnID0gYWs0NTM1X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBBSzQ1MzVfREFDKTsKIAlpZiAoIW11dGUpCi0JCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X0RBQywgbXV0ZV9yZWcpOworCQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9EQUMsIG11dGVfcmVnICYgfjB4MjApOwogCWVsc2UKIAkJYWs0NTM1X3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOwogCXJldHVybiAwOwpAQCAtMzgxLDExICszODEsMTEgQEAKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKLQkJbXV0ZV9yZWcgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUoY29kZWMsIEFLNDUzNV9EQUMpICYgMHhmZmRmOwotCQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9EQUMsIG11dGVfcmVnKTsKKwkJbXV0ZV9yZWcgPSBhazQ1MzVfcmVhZF9yZWdfY2FjaGUoY29kZWMsIEFLNDUzNV9EQUMpOworCQlhazQ1MzVfd3JpdGUoY29kZWMsIEFLNDUzNV9EQUMsIG11dGVfcmVnICYgfjB4MjApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQltdXRlX3JlZyA9IGFrNDUzNV9yZWFkX3JlZ19jYWNoZShjb2RlYywgQUs0NTM1X0RBQykgJiAweGZmZGY7CisJCW11dGVfcmVnID0gYWs0NTM1X3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBBSzQ1MzVfREFDKTsKIAkJYWs0NTM1X3dyaXRlKGNvZGVjLCBBSzQ1MzVfREFDLCBtdXRlX3JlZyB8IDB4MjApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgpAQCAtMzk5LDcgKzM5OSw3IEBACiAJCWFrNDUzNV93cml0ZShjb2RlYywgQUs0NTM1X1BNMSwgaSAmICh+MHg4MCkpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCmluZGV4IDkwYzkwYjcuLmYwMGViYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKaW5kZXggMjRmNWY0OS4uMmVjNzVhYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTI4LDcgKzI3LDYgQEAKIHN0cnVjdCBhazQ2NzFfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdm9pZCAqY29udHJvbF9kYXRhOwotCXU4IHJlZ19jYWNoZVtBSzQ2NzFfQ0FDSEVSRUdOVU1dOwogfTsKIAogLyogYWs0NjcxIHJlZ2lzdGVyIGNhY2hlICYgZGVmYXVsdCByZWdpc3RlciBzZXR0aW5ncyAqLwpAQCAtNDM3LDEwICs0MzUsMTEgQEAKIAogc3RhdGljIGludCBhazQ2NzFfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIGFrNDY3MV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKGFrNDY3MV9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFrNDY3MV9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKGFrNDY3MV9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MDIsNyArNjAxLDcgQEAKIAkJc25kX3NvY193cml0ZShjb2RlYywgQUs0NjcxX0FEX0RBX1BPV0VSX01BTkFHRU1FTlQsIDB4MDApOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jIGIvc291bmQvc29jL2NvZGVjcy9hbGM1NjIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNzdjOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5jCkBAIC0wLDAgKzEsMTExNyBAQAorLyoKKyAqIGFsYzU2MjMuYyAgLS0gIGFsYzU2MlsxMjNdIEFMU0EgU29jIEF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA4IFJlYWx0ZWsgTWljcm9lbGVjdHJvbmljcworICogQXV0aG9yOiBmbG92ZSA8ZmxvdmVAcmVhbHRlay5jb20+IEV0aGFuIDxla3VAbWFydmVsbC5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMTAgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCisgKgorICogQmFzZWQgb24gV004NzUzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvYWxjNTYyMy5oPgorCisjaW5jbHVkZSAiYWxjNTYyMy5oIgorCitzdGF0aWMgaW50IGNhcHNfY2hhcmdlID0gMjAwMDsKK21vZHVsZV9wYXJhbShjYXBzX2NoYXJnZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2Fwc19jaGFyZ2UsICJBTEM1NjIzIGNhcCBjaGFyZ2UgdGltZSAobXNlY3MpIik7CisKKy8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLworc3RydWN0IGFsYzU2MjNfcHJpdiB7CisJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CisJdm9pZCAqY29udHJvbF9kYXRhOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwl1OCBpZDsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworCXUxNiByZWdfY2FjaGVbQUxDNTYyM19WRU5ET1JfSUQyKzJdOworCXVuc2lnbmVkIGludCBhZGRfY3RybDsKKwl1bnNpZ25lZCBpbnQgamFja19kZXRfY3RybDsKK307CisKK3N0YXRpYyB2b2lkIGFsYzU2MjNfZmlsbF9jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGksIHN0ZXAgPSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc3RlcDsKKwl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKworCS8qIG5vdCByZWFsbHkgZWZmaWNpZW50IC4uLiAqLworCWZvciAoaSA9IDAgOyBpIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgOyBpICs9IHN0ZXApCisJCWNhY2hlW2ldID0gY29kZWMtPmh3X3JlYWQoY29kZWMsIGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhbGM1NjIzX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYW1wX21peGVyX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJLyogdG8gcG93ZXItb24vb2ZmIGNsYXNzLWQgYW1wIGdlbmVyYXRvcnMvc3BlYWtlciAqLworCS8qIG5lZWQgdG8gd3JpdGUgdG8gJ2luZGV4LTQ2aCcgcmVnaXN0ZXIgOiAgICAgICAgKi8KKwkvKiBzbyB3cml0ZSBpbmRleCBudW0gKGhlcmUgMHg0NikgdG8gcmVnIDB4NmEgICAgICovCisJLyogYW5kIHRoZW4gMHhmZmZmLzAgdG8gcmVnIDB4NmMgICAgICAgICAgICAgICAgICAqLworCXNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIEFMQzU2MjNfSElEX0NUUkxfSU5ERVgsIDB4NDYpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIEFMQzU2MjNfSElEX0NUUkxfREFUQSwgMHhGRkZGKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2Nfd3JpdGUody0+Y29kZWMsIEFMQzU2MjNfSElEX0NUUkxfREFUQSwgMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQUxDNTYyMyBDb250cm9scworICovCisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRSh2b2xfdGx2LCAtMzQ1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShocF90bHYsIC00NjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY19yZWNfdGx2LCAtMTY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYm9vc3RfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoMyksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMjAwMCwgMCwgMCksCisJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgMCwgMCksCit9Oworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ190bHYsIDAsIDYwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MjFfdm9sX3NuZF9jb250cm9sc1tdID0geworCVNPQ19ET1VCTEVfVExWKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsCisJCQlBTEM1NjIzX1NQS19PVVRfVk9MLCA4LCAwLCAzMSwgMSwgaHBfdGx2KSwKKwlTT0NfRE9VQkxFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsCisJCQlBTEM1NjIzX1NQS19PVVRfVk9MLCAxNSwgNywgMSwgMSksCisJU09DX0RPVUJMRV9UTFYoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJQUxDNTYyM19IUF9PVVRfVk9MLCA4LCAwLCAzMSwgMSwgaHBfdGx2KSwKKwlTT0NfRE9VQkxFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCUFMQzU2MjNfSFBfT1VUX1ZPTCwgMTUsIDcsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYyMl92b2xfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0RPVUJMRV9UTFYoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCUFMQzU2MjNfU1BLX09VVF9WT0wsIDgsIDAsIDMxLCAxLCBocF90bHYpLAorCVNPQ19ET1VCTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCUFMQzU2MjNfU1BLX09VVF9WT0wsIDE1LCA3LCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiTGluZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJQUxDNTYyM19IUF9PVVRfVk9MLCA4LCAwLCAzMSwgMSwgaHBfdGx2KSwKKwlTT0NfRE9VQkxFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsCisJCQlBTEM1NjIzX0hQX09VVF9WT0wsIDE1LCA3LCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX3ZvbF9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1RMVigiTGluZSBQbGF5YmFjayBWb2x1bWUiLAorCQkJQUxDNTYyM19TUEtfT1VUX1ZPTCwgOCwgMCwgMzEsIDEsIGhwX3RsdiksCisJU09DX0RPVUJMRSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLAorCQkJQUxDNTYyM19TUEtfT1VUX1ZPTCwgMTUsIDcsIDEsIDEpLAorCVNPQ19ET1VCTEVfVExWKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwKKwkJCUFMQzU2MjNfSFBfT1VUX1ZPTCwgOCwgMCwgMzEsIDEsIGhwX3RsdiksCisJU09DX0RPVUJMRSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsCisJCQlBTEM1NjIzX0hQX09VVF9WT0wsIDE1LCA3LCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX3NuZF9jb250cm9sc1tdID0geworCVNPQ19ET1VCTEVfVExWKCJBdXhvdXQgUGxheWJhY2sgVm9sdW1lIiwKKwkJCUFMQzU2MjNfTU9OT19BVVhfT1VUX1ZPTCwgOCwgMCwgMzEsIDEsIGhwX3RsdiksCisJU09DX0RPVUJMRSgiQXV4b3V0IFBsYXliYWNrIFN3aXRjaCIsCisJCQlBTEM1NjIzX01PTk9fQVVYX09VVF9WT0wsIDE1LCA3LCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJCQlBTEM1NjIzX1NURVJFT19EQUNfVk9MLCA4LCAwLCAzMSwgMSwgdm9sX3RsdiksCisJU09DX0RPVUJMRV9UTFYoIkF1eEkgQ2FwdHVyZSBWb2x1bWUiLAorCQkJQUxDNTYyM19BVVhJTl9WT0wsIDgsIDAsIDMxLCAxLCB2b2xfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiTGluZUluIENhcHR1cmUgVm9sdW1lIiwKKwkJCUFMQzU2MjNfTElORV9JTl9WT0wsIDgsIDAsIDMxLCAxLCB2b2xfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiTWljMSBDYXB0dXJlIFZvbHVtZSIsCisJCQlBTEM1NjIzX01JQ19WT0wsIDgsIDMxLCAxLCB2b2xfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiTWljMiBDYXB0dXJlIFZvbHVtZSIsCisJCQlBTEM1NjIzX01JQ19WT0wsIDAsIDMxLCAxLCB2b2xfdGx2KSwKKwlTT0NfRE9VQkxFX1RMVigiUmVjIENhcHR1cmUgVm9sdW1lIiwKKwkJCUFMQzU2MjNfQURDX1JFQ19HQUlOLCA3LCAwLCAzMSwgMCwgYWRjX3JlY190bHYpLAorCVNPQ19TSU5HTEVfVExWKCJNaWMgMSBCb29zdCBWb2x1bWUiLAorCQkJQUxDNTYyM19NSUNfQ1RSTCwgMTAsIDIsIDAsIGJvb3N0X3RsdiksCisJU09DX1NJTkdMRV9UTFYoIk1pYyAyIEJvb3N0IFZvbHVtZSIsCisJCQlBTEM1NjIzX01JQ19DVFJMLCA4LCAyLCAwLCBib29zdF90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJEaWdpdGFsIEJvb3N0IFZvbHVtZSIsCisJCQlBTEM1NjIzX0FERF9DVFJMX1JFRywgNCwgMywgMCwgZGlnX3RsdiksCit9OworCisvKgorICogREFQTSBDb250cm9scworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19ocF9taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMSTJIUCBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX0xJTkVfSU5fVk9MLCAxNSwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkFVWEkySFAgUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19BVVhJTl9WT0wsIDE1LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTUlDMTJIUCBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX01JQ19ST1VUSU5HX0NUUkwsIDE1LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTUlDMjJIUCBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX01JQ19ST1VUSU5HX0NUUkwsIDcsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJEQUMySFAgUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19TVEVSRU9fREFDX1ZPTCwgMTUsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHBsX21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkFEQzJIUF9MIFBsYXliYWNrIFN3aXRjaCIsIEFMQzU2MjNfQURDX1JFQ19HQUlOLCAxNSwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19ocHJfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiQURDMkhQX1IgUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX0dBSU4sIDE0LCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX21vbm9fbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiQURDMk1PTk9fTCBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX0FEQ19SRUNfR0FJTiwgMTMsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJBREMyTU9OT19SIFBsYXliYWNrIFN3aXRjaCIsIEFMQzU2MjNfQURDX1JFQ19HQUlOLCAxMiwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkxJMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19MSU5FX0lOX1ZPTCwgMTMsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJBVVhJMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19BVVhJTl9WT0wsIDEzLCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTUlDMTJNT05PIFBsYXliYWNrIFN3aXRjaCIsIEFMQzU2MjNfTUlDX1JPVVRJTkdfQ1RSTCwgMTMsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJNSUMyMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19NSUNfUk9VVElOR19DVFJMLCA1LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiREFDMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19TVEVSRU9fREFDX1ZPTCwgMTMsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfc3BlYWtlcl9taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMSTJTUEsgUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19MSU5FX0lOX1ZPTCwgMTQsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJBVVhJMlNQSyBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX0FVWElOX1ZPTCwgMTQsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJNSUMxMlNQSyBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX01JQ19ST1VUSU5HX0NUUkwsIDE0LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTUlDMjJTUEsgUGxheWJhY2sgU3dpdGNoIiwgQUxDNTYyM19NSUNfUk9VVElOR19DVFJMLCA2LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiREFDMlNQSyBQbGF5YmFjayBTd2l0Y2giLCBBTEM1NjIzX1NURVJFT19EQUNfVk9MLCAxNCwgMSwgMSksCit9OworCisvKiBMZWZ0IFJlY29yZCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfY2FwdHVyZUxfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTWljMSBDYXB0dXJlIFN3aXRjaCIsIEFMQzU2MjNfQURDX1JFQ19NSVhFUiwgMTQsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJNaWMyIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCAxMywgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkxpbmVJbkwgQ2FwdHVyZSBTd2l0Y2giLCBBTEM1NjIzX0FEQ19SRUNfTUlYRVIsIDEyLCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTGVmdCBBdXhJIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCAxMSwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkhQTWl4ZXJMIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCAxMCwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIlNQS01peGVyIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCA5LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiTW9ub01peGVyIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCA4LCAxLCAxKSwKK307CisKKy8qIFJpZ2h0IFJlY29yZCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfY2FwdHVyZVJfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiTWljMSBDYXB0dXJlIFN3aXRjaCIsIEFMQzU2MjNfQURDX1JFQ19NSVhFUiwgNiwgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIk1pYzIgQ2FwdHVyZSBTd2l0Y2giLCBBTEM1NjIzX0FEQ19SRUNfTUlYRVIsIDUsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJMaW5lSW5SIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCA0LCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgQXV4SSBDYXB0dXJlIFN3aXRjaCIsIEFMQzU2MjNfQURDX1JFQ19NSVhFUiwgMywgMSwgMSksCitTT0NfREFQTV9TSU5HTEUoIkhQTWl4ZXJSIENhcHR1cmUgU3dpdGNoIiwgQUxDNTYyM19BRENfUkVDX01JWEVSLCAyLCAxLCAxKSwKK1NPQ19EQVBNX1NJTkdMRSgiU1BLTWl4ZXIgQ2FwdHVyZSBTd2l0Y2giLCBBTEM1NjIzX0FEQ19SRUNfTUlYRVIsIDEsIDEsIDEpLAorU09DX0RBUE1fU0lOR0xFKCJNb25vTWl4ZXIgQ2FwdHVyZSBTd2l0Y2giLCBBTEM1NjIzX0FEQ19SRUNfTUlYRVIsIDAsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MjNfc3BrX25fc291cl9zZWxbXSA9IHsKKwkJIlJOLy1SIiwgIlJQLytSIiwgIkxOLy1SIiwgIlZtaWQiIH07CitzdGF0aWMgY29uc3QgY2hhciAqYWxjNTYyM19ocGxfb3V0X2lucHV0X3NlbFtdID0geworCQkiVm1pZCIsICJIUCBMZWZ0IE1peCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MjNfaHByX291dF9pbnB1dF9zZWxbXSA9IHsKKwkJIlZtaWQiLCAiSFAgUmlnaHQgTWl4In07CitzdGF0aWMgY29uc3QgY2hhciAqYWxjNTYyM19zcGtvdXRfaW5wdXRfc2VsW10gPSB7CisJCSJWbWlkIiwgIkhQT3V0IE1peCIsICJTcGVha2VyIE1peCIsICJNb25vIE1peCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MjNfYXV4X291dF9pbnB1dF9zZWxbXSA9IHsKKwkJIlZtaWQiLCAiSFBPdXQgTWl4IiwgIlNwZWFrZXIgTWl4IiwgIk1vbm8gTWl4In07CisKKy8qIGF1eG91dCBvdXRwdXQgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfYXV4X291dF9pbnB1dF9lbnVtID0KK1NPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCA2LCA0LCBhbGM1NjIzX2F1eF9vdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX2F1eG91dF9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2F1eF9vdXRfaW5wdXRfZW51bSk7CisKKy8qIHNwZWFrZXIgb3V0cHV0IG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjIzX3Nwa291dF9pbnB1dF9lbnVtID0KK1NPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxMCwgNCwgYWxjNTYyM19zcGtvdXRfaW5wdXRfc2VsKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX3Nwa291dF9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX3Nwa291dF9pbnB1dF9lbnVtKTsKKworLyogaGVhZHBob25lIGxlZnQgb3V0cHV0IG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjIzX2hwbF9vdXRfaW5wdXRfZW51bSA9CitTT0NfRU5VTV9TSU5HTEUoQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgOSwgMiwgYWxjNTYyM19ocGxfb3V0X2lucHV0X3NlbCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19ocGxfb3V0X211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfaHBsX291dF9pbnB1dF9lbnVtKTsKKworLyogaGVhZHBob25lIHJpZ2h0IG91dHB1dCBtdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjNTYyM19ocHJfb3V0X2lucHV0X2VudW0gPQorU09DX0VOVU1fU0lOR0xFKEFMQzU2MjNfT1VUUFVUX01JWEVSX0NUUkwsIDgsIDIsIGFsYzU2MjNfaHByX291dF9pbnB1dF9zZWwpOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzU2MjNfaHByX291dF9tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCBhbGM1NjIzX2hwcl9vdXRfaW5wdXRfZW51bSk7CisKKy8qIHNwZWFrZXIgb3V0cHV0IE4gc2VsZWN0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFsYzU2MjNfc3BrX25fc291cl9lbnVtID0KK1NPQ19FTlVNX1NJTkdMRShBTEM1NjIzX09VVFBVVF9NSVhFUl9DVFJMLCAxNCwgNCwgYWxjNTYyM19zcGtfbl9zb3VyX3NlbCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNTYyM19zcGtvdXRuX211eF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIGFsYzU2MjNfc3BrX25fc291cl9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFsYzU2MjNfZGFwbV93aWRnZXRzW10gPSB7CisvKiBNdXhlcyAqLworU05EX1NPQ19EQVBNX01VWCgiQXV4T3V0IE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmYWxjNTYyM19hdXhvdXRfbXV4X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIlNwZWFrZXJPdXQgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZhbGM1NjIzX3Nwa291dF9tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiTGVmdCBIZWFkcGhvbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZhbGM1NjIzX2hwbF9vdXRfbXV4X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIlJpZ2h0IEhlYWRwaG9uZSBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJmFsYzU2MjNfaHByX291dF9tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiU3BlYWtlck91dCBOIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmYWxjNTYyM19zcGtvdXRuX211eF9jb250cm9scyksCisKKy8qIG91dHB1dCBtaXhlcnMgKi8KK1NORF9TT0NfREFQTV9NSVhFUigiSFAgTWl4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZhbGM1NjIzX2hwX21peGVyX2NvbnRyb2xzWzBdLAorCUFSUkFZX1NJWkUoYWxjNTYyM19ocF9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJIUFIgTWl4IiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMiwgNCwgMCwKKwkmYWxjNTYyM19ocHJfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRShhbGM1NjIzX2hwcl9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJIUEwgTWl4IiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMiwgNSwgMCwKKwkmYWxjNTYyM19ocGxfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRShhbGM1NjIzX2hwbF9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJIUE91dCBNaXgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX01JWEVSKCJNb25vIE1peCIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDIsIDIsIDAsCisJJmFsYzU2MjNfbW9ub19taXhlcl9jb250cm9sc1swXSwKKwlBUlJBWV9TSVpFKGFsYzU2MjNfbW9ub19taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX01JWEVSKCJTcGVha2VyIE1peCIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDIsIDMsIDAsCisJJmFsYzU2MjNfc3BlYWtlcl9taXhlcl9jb250cm9sc1swXSwKKwlBUlJBWV9TSVpFKGFsYzU2MjNfc3BlYWtlcl9taXhlcl9jb250cm9scykpLAorCisvKiBpbnB1dCBtaXhlcnMgKi8KK1NORF9TT0NfREFQTV9NSVhFUigiTGVmdCBDYXB0dXJlIE1peCIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDIsIDEsIDAsCisJJmFsYzU2MjNfY2FwdHVyZUxfbWl4ZXJfY29udHJvbHNbMF0sCisJQVJSQVlfU0laRShhbGM1NjIzX2NhcHR1cmVMX21peGVyX2NvbnRyb2xzKSksCitTTkRfU09DX0RBUE1fTUlYRVIoIlJpZ2h0IENhcHR1cmUgTWl4IiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMiwgMCwgMCwKKwkmYWxjNTYyM19jYXB0dXJlUl9taXhlcl9jb250cm9sc1swXSwKKwlBUlJBWV9TSVpFKGFsYzU2MjNfY2FwdHVyZVJfbWl4ZXJfY29udHJvbHMpKSwKKworU05EX1NPQ19EQVBNX0RBQygiTGVmdCBEQUMiLCAiTGVmdCBIaUZpIFBsYXliYWNrIiwKKwlBTEM1NjIzX1BXUl9NQU5BR19BREQyLCA5LCAwKSwKK1NORF9TT0NfREFQTV9EQUMoIlJpZ2h0IERBQyIsICJSaWdodCBIaUZpIFBsYXliYWNrIiwKKwlBTEM1NjIzX1BXUl9NQU5BR19BREQyLCA4LCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUigiSTJTIE1peCIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDEsIDE1LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUigiQXV4SSBNaXgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX01JWEVSKCJMaW5lIE1peCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fQURDKCJMZWZ0IEFEQyIsICJMZWZ0IEhpRmkgQ2FwdHVyZSIsCisJQUxDNTYyM19QV1JfTUFOQUdfQUREMiwgNywgMCksCitTTkRfU09DX0RBUE1fQURDKCJSaWdodCBBREMiLCAiUmlnaHQgSGlGaSBDYXB0dXJlIiwKKwlBTEM1NjIzX1BXUl9NQU5BR19BREQyLCA2LCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkxlZnQgSGVhZHBob25lIiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgMTAsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgSGVhZHBob25lIiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgOSwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJTcGVha2VyT3V0IiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgMTIsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBBdXhPdXQiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQzLCAxNCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBBdXhPdXQiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQzLCAxMywgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IExpbmVJbiIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDMsIDcsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgTGluZUluIiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgNiwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IEF1eEkiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQzLCA1LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlJpZ2h0IEF1eEkiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQzLCA0LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIk1JQzEgUEdBIiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgMywgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJNSUMyIFBHQSIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDMsIDIsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiTUlDMSBQcmUgQW1wIiwgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgMSwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJNSUMyIFByZSBBbXAiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQzLCAwLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhczEiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQxLCAxMSwgMCksCisKK1NORF9TT0NfREFQTV9PVVRQVVQoIkFVWE9VVEwiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkFVWE9VVFIiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkhQTCIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiSFBSIiksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVQiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVE4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTElORUlOTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FSU5SIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIkFVWElOTCIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJBVVhJTlIiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTUlDMSIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMyIiksCitTTkRfU09DX0RBUE1fVk1JRCgiVm1pZCIpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzU2MjNfYW1wX25hbWVzW10gPSB7IkFCIEFtcCIsICJEIEFtcCJ9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGM1NjIzX2FtcF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCwgMTMsIDIsIGFsYzU2MjNfYW1wX25hbWVzKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM1NjIzX2FtcF9tdXhfY29udHJvbHMgPQorCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgYWxjNTYyM19hbXBfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhbGM1NjIzX2RhcG1fYW1wX3dpZGdldHNbXSA9IHsKK1NORF9TT0NfREFQTV9QR0FfRSgiRCBBbXAiLCBBTEM1NjIzX1BXUl9NQU5BR19BREQyLCAxNCwgMCwgTlVMTCwgMCwKKwlhbXBfbWl4ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK1NORF9TT0NfREFQTV9QR0EoIkFCIEFtcCIsIEFMQzU2MjNfUFdSX01BTkFHX0FERDIsIDE1LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NVVgoIkFCLUQgQW1wIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmYWxjNTYyM19hbXBfbXV4X2NvbnRyb2xzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uW10gPSB7CisJLyogdmlydHVhbCBtaXhlciAtIG1peGVzIGxlZnQgJiByaWdodCBjaGFubmVscyAqLworCXsiSTJTIE1peCIsIE5VTEwsCQkJCSJMZWZ0IERBQyJ9LAorCXsiSTJTIE1peCIsIE5VTEwsCQkJCSJSaWdodCBEQUMifSwKKwl7IkxpbmUgTWl4IiwgTlVMTCwJCQkJIlJpZ2h0IExpbmVJbiJ9LAorCXsiTGluZSBNaXgiLCBOVUxMLAkJCQkiTGVmdCBMaW5lSW4ifSwKKwl7IkF1eEkgTWl4IiwgTlVMTCwJCQkJIkxlZnQgQXV4SSJ9LAorCXsiQXV4SSBNaXgiLCBOVUxMLAkJCQkiUmlnaHQgQXV4SSJ9LAorCXsiQVVYT1VUTCIsIE5VTEwsCQkJCSJMZWZ0IEF1eE91dCJ9LAorCXsiQVVYT1VUUiIsIE5VTEwsCQkJCSJSaWdodCBBdXhPdXQifSwKKworCS8qIEhQIG1peGVyICovCisJeyJIUEwgTWl4IiwgIkFEQzJIUF9MIFBsYXliYWNrIFN3aXRjaCIsCQkiTGVmdCBDYXB0dXJlIE1peCJ9LAorCXsiSFBMIE1peCIsIE5VTEwsCQkJCSJIUCBNaXgifSwKKwl7IkhQUiBNaXgiLCAiQURDMkhQX1IgUGxheWJhY2sgU3dpdGNoIiwJCSJSaWdodCBDYXB0dXJlIE1peCJ9LAorCXsiSFBSIE1peCIsIE5VTEwsCQkJCSJIUCBNaXgifSwKKwl7IkhQIE1peCIsICJMSTJIUCBQbGF5YmFjayBTd2l0Y2giLAkJIkxpbmUgTWl4In0sCisJeyJIUCBNaXgiLCAiQVVYSTJIUCBQbGF5YmFjayBTd2l0Y2giLAkJIkF1eEkgTWl4In0sCisJeyJIUCBNaXgiLCAiTUlDMTJIUCBQbGF5YmFjayBTd2l0Y2giLAkJIk1JQzEgUEdBIn0sCisJeyJIUCBNaXgiLCAiTUlDMjJIUCBQbGF5YmFjayBTd2l0Y2giLAkJIk1JQzIgUEdBIn0sCisJeyJIUCBNaXgiLCAiREFDMkhQIFBsYXliYWNrIFN3aXRjaCIsCQkiSTJTIE1peCJ9LAorCisJLyogc3BlYWtlciBtaXhlciAqLworCXsiU3BlYWtlciBNaXgiLCAiTEkyU1BLIFBsYXliYWNrIFN3aXRjaCIsCSJMaW5lIE1peCJ9LAorCXsiU3BlYWtlciBNaXgiLCAiQVVYSTJTUEsgUGxheWJhY2sgU3dpdGNoIiwJIkF1eEkgTWl4In0sCisJeyJTcGVha2VyIE1peCIsICJNSUMxMlNQSyBQbGF5YmFjayBTd2l0Y2giLAkiTUlDMSBQR0EifSwKKwl7IlNwZWFrZXIgTWl4IiwgIk1JQzIyU1BLIFBsYXliYWNrIFN3aXRjaCIsCSJNSUMyIFBHQSJ9LAorCXsiU3BlYWtlciBNaXgiLCAiREFDMlNQSyBQbGF5YmFjayBTd2l0Y2giLAkiSTJTIE1peCJ9LAorCisJLyogbW9ubyBtaXhlciAqLworCXsiTW9ubyBNaXgiLCAiQURDMk1PTk9fTCBQbGF5YmFjayBTd2l0Y2giLAkiTGVmdCBDYXB0dXJlIE1peCJ9LAorCXsiTW9ubyBNaXgiLCAiQURDMk1PTk9fUiBQbGF5YmFjayBTd2l0Y2giLAkiUmlnaHQgQ2FwdHVyZSBNaXgifSwKKwl7Ik1vbm8gTWl4IiwgIkxJMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwJCSJMaW5lIE1peCJ9LAorCXsiTW9ubyBNaXgiLCAiQVVYSTJNT05PIFBsYXliYWNrIFN3aXRjaCIsCSJBdXhJIE1peCJ9LAorCXsiTW9ubyBNaXgiLCAiTUlDMTJNT05PIFBsYXliYWNrIFN3aXRjaCIsCSJNSUMxIFBHQSJ9LAorCXsiTW9ubyBNaXgiLCAiTUlDMjJNT05PIFBsYXliYWNrIFN3aXRjaCIsCSJNSUMyIFBHQSJ9LAorCXsiTW9ubyBNaXgiLCAiREFDMk1PTk8gUGxheWJhY2sgU3dpdGNoIiwJIkkyUyBNaXgifSwKKworCS8qIExlZnQgcmVjb3JkIG1peGVyICovCisJeyJMZWZ0IENhcHR1cmUgTWl4IiwgIkxpbmVJbkwgQ2FwdHVyZSBTd2l0Y2giLAkiTElORUlOTCJ9LAorCXsiTGVmdCBDYXB0dXJlIE1peCIsICJMZWZ0IEF1eEkgQ2FwdHVyZSBTd2l0Y2giLCAiQVVYSU5MIn0sCisJeyJMZWZ0IENhcHR1cmUgTWl4IiwgIk1pYzEgQ2FwdHVyZSBTd2l0Y2giLAkiTUlDMSBQcmUgQW1wIn0sCisJeyJMZWZ0IENhcHR1cmUgTWl4IiwgIk1pYzIgQ2FwdHVyZSBTd2l0Y2giLAkiTUlDMiBQcmUgQW1wIn0sCisJeyJMZWZ0IENhcHR1cmUgTWl4IiwgIkhQTWl4ZXJMIENhcHR1cmUgU3dpdGNoIiwgIkhQTCBNaXgifSwKKwl7IkxlZnQgQ2FwdHVyZSBNaXgiLCAiU1BLTWl4ZXIgQ2FwdHVyZSBTd2l0Y2giLCAiU3BlYWtlciBNaXgifSwKKwl7IkxlZnQgQ2FwdHVyZSBNaXgiLCAiTW9ub01peGVyIENhcHR1cmUgU3dpdGNoIiwgIk1vbm8gTWl4In0sCisKKwkvKlJpZ2h0IHJlY29yZCBtaXhlciAqLworCXsiUmlnaHQgQ2FwdHVyZSBNaXgiLCAiTGluZUluUiBDYXB0dXJlIFN3aXRjaCIsCSJMSU5FSU5SIn0sCisJeyJSaWdodCBDYXB0dXJlIE1peCIsICJSaWdodCBBdXhJIENhcHR1cmUgU3dpdGNoIiwJIkFVWElOUiJ9LAorCXsiUmlnaHQgQ2FwdHVyZSBNaXgiLCAiTWljMSBDYXB0dXJlIFN3aXRjaCIsCSJNSUMxIFByZSBBbXAifSwKKwl7IlJpZ2h0IENhcHR1cmUgTWl4IiwgIk1pYzIgQ2FwdHVyZSBTd2l0Y2giLAkiTUlDMiBQcmUgQW1wIn0sCisJeyJSaWdodCBDYXB0dXJlIE1peCIsICJIUE1peGVyUiBDYXB0dXJlIFN3aXRjaCIsICJIUFIgTWl4In0sCisJeyJSaWdodCBDYXB0dXJlIE1peCIsICJTUEtNaXhlciBDYXB0dXJlIFN3aXRjaCIsICJTcGVha2VyIE1peCJ9LAorCXsiUmlnaHQgQ2FwdHVyZSBNaXgiLCAiTW9ub01peGVyIENhcHR1cmUgU3dpdGNoIiwgIk1vbm8gTWl4In0sCisKKwkvKiBoZWFkcGhvbmUgbGVmdCBtdXggKi8KKwl7IkxlZnQgSGVhZHBob25lIE11eCIsICJIUCBMZWZ0IE1peCIsCQkiSFBMIE1peCJ9LAorCXsiTGVmdCBIZWFkcGhvbmUgTXV4IiwgIlZtaWQiLAkJCSJWbWlkIn0sCisKKwkvKiBoZWFkcGhvbmUgcmlnaHQgbXV4ICovCisJeyJSaWdodCBIZWFkcGhvbmUgTXV4IiwgIkhQIFJpZ2h0IE1peCIsCQkiSFBSIE1peCJ9LAorCXsiUmlnaHQgSGVhZHBob25lIE11eCIsICJWbWlkIiwJCQkiVm1pZCJ9LAorCisJLyogc3BlYWtlciBvdXQgbXV4ICovCisJeyJTcGVha2VyT3V0IE11eCIsICJWbWlkIiwJCQkiVm1pZCJ9LAorCXsiU3BlYWtlck91dCBNdXgiLCAiSFBPdXQgTWl4IiwJCQkiSFBPdXQgTWl4In0sCisJeyJTcGVha2VyT3V0IE11eCIsICJTcGVha2VyIE1peCIsCQkiU3BlYWtlciBNaXgifSwKKwl7IlNwZWFrZXJPdXQgTXV4IiwgIk1vbm8gTWl4IiwJCQkiTW9ubyBNaXgifSwKKworCS8qIE1vbm8vQXV4IE91dCBtdXggKi8KKwl7IkF1eE91dCBNdXgiLCAiVm1pZCIsCQkJCSJWbWlkIn0sCisJeyJBdXhPdXQgTXV4IiwgIkhQT3V0IE1peCIsCQkJIkhQT3V0IE1peCJ9LAorCXsiQXV4T3V0IE11eCIsICJTcGVha2VyIE1peCIsCQkJIlNwZWFrZXIgTWl4In0sCisJeyJBdXhPdXQgTXV4IiwgIk1vbm8gTWl4IiwJCQkiTW9ubyBNaXgifSwKKworCS8qIG91dHB1dCBwZ2EgKi8KKwl7IkhQTCIsIE5VTEwsCQkJCQkiTGVmdCBIZWFkcGhvbmUifSwKKwl7IkxlZnQgSGVhZHBob25lIiwgTlVMTCwJCQkiTGVmdCBIZWFkcGhvbmUgTXV4In0sCisJeyJIUFIiLCBOVUxMLAkJCQkJIlJpZ2h0IEhlYWRwaG9uZSJ9LAorCXsiUmlnaHQgSGVhZHBob25lIiwgTlVMTCwJCQkiUmlnaHQgSGVhZHBob25lIE11eCJ9LAorCXsiTGVmdCBBdXhPdXQiLCBOVUxMLAkJCQkiQXV4T3V0IE11eCJ9LAorCXsiUmlnaHQgQXV4T3V0IiwgTlVMTCwJCQkJIkF1eE91dCBNdXgifSwKKworCS8qIGlucHV0IHBnYSAqLworCXsiTGVmdCBMaW5lSW4iLCBOVUxMLAkJCQkiTElORUlOTCJ9LAorCXsiUmlnaHQgTGluZUluIiwgTlVMTCwJCQkJIkxJTkVJTlIifSwKKwl7IkxlZnQgQXV4SSIsIE5VTEwsCQkJCSJBVVhJTkwifSwKKwl7IlJpZ2h0IEF1eEkiLCBOVUxMLAkJCQkiQVVYSU5SIn0sCisJeyJNSUMxIFByZSBBbXAiLCBOVUxMLAkJCQkiTUlDMSJ9LAorCXsiTUlDMiBQcmUgQW1wIiwgTlVMTCwJCQkJIk1JQzIifSwKKwl7Ik1JQzEgUEdBIiwgTlVMTCwJCQkJIk1JQzEgUHJlIEFtcCJ9LAorCXsiTUlDMiBQR0EiLCBOVUxMLAkJCQkiTUlDMiBQcmUgQW1wIn0sCisKKwkvKiBsZWZ0IEFEQyAqLworCXsiTGVmdCBBREMiLCBOVUxMLAkJCQkiTGVmdCBDYXB0dXJlIE1peCJ9LAorCisJLyogcmlnaHQgQURDICovCisJeyJSaWdodCBBREMiLCBOVUxMLAkJCQkiUmlnaHQgQ2FwdHVyZSBNaXgifSwKKworCXsiU3BlYWtlck91dCBOIE11eCIsICJSTi8tUiIsCQkJIlNwZWFrZXJPdXQifSwKKwl7IlNwZWFrZXJPdXQgTiBNdXgiLCAiUlAvK1IiLAkJCSJTcGVha2VyT3V0In0sCisJeyJTcGVha2VyT3V0IE4gTXV4IiwgIkxOLy1SIiwJCQkiU3BlYWtlck91dCJ9LAorCXsiU3BlYWtlck91dCBOIE11eCIsICJWbWlkIiwJCQkiVm1pZCJ9LAorCisJeyJTUEtPVVQiLCBOVUxMLAkJCQkiU3BlYWtlck91dCJ9LAorCXsiU1BLT1VUTiIsIE5VTEwsCQkJCSJTcGVha2VyT3V0IE4gTXV4In0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbl9zcGtbXSA9IHsKKwl7IlNwZWFrZXJPdXQiLCBOVUxMLAkJCQkiU3BlYWtlck91dCBNdXgifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uX2FtcF9zcGtbXSA9IHsKKwl7IkFCIEFtcCIsIE5VTEwsCQkJCSJTcGVha2VyT3V0IE11eCJ9LAorCXsiRCBBbXAiLCBOVUxMLAkJCQkJIlNwZWFrZXJPdXQgTXV4In0sCisJeyJBQi1EIEFtcCBNdXgiLCAiQUIgQW1wIiwJCQkiQUIgQW1wIn0sCisJeyJBQi1EIEFtcCBNdXgiLCAiRCBBbXAiLAkJCSJEIEFtcCJ9LAorCXsiU3BlYWtlck91dCIsIE5VTEwsCQkJCSJBQi1EIEFtcCBNdXgifSwKK307CisKKy8qIFBMTCBkaXZpc29ycyAqLworc3RydWN0IF9wbGxfZGl2IHsKKwl1MzIgcGxsX2luOworCXUzMiBwbGxfb3V0OworCXUxNiByZWd2YWx1ZTsKK307CisKKy8qIE5vdGUgOiBwbGwgY29kZSBmcm9tIG9yaWdpbmFsIGFsYzU2MjMgZHJpdmVyLiBOb3Qgc3VyZSBvZiBob3cgZ29vZCBpdCBpcyAqLworLyogdXNlZnVsbCBvbmx5IGZvciBtYXN0ZXIgbW9kZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBfcGxsX2RpdiBjb2RlY19tYXN0ZXJfcGxsX2RpdltdID0geworCisJeyAgMjA0ODAwMCwgIDgxOTIwMDAsCTB4MGVhMH0sCisJeyAgMzY4NjQwMCwgIDgxOTIwMDAsCTB4NGUyN30sCisJeyAxMjAwMDAwMCwgIDgxOTIwMDAsCTB4NDU2Yn0sCisJeyAxMzAwMDAwMCwgIDgxOTIwMDAsCTB4NDk1Zn0sCisJeyAxMzEwMDAwMCwgIDgxOTIwMDAsCTB4MDMyMH0sCisJeyAgMjA0ODAwMCwgIDExMjg5NjAwLAkweGY2Mzd9LAorCXsgIDM2ODY0MDAsICAxMTI4OTYwMCwJMHgyZjIyfSwKKwl7IDEyMDAwMDAwLCAgMTEyODk2MDAsCTB4M2UyZn0sCisJeyAxMzAwMDAwMCwgIDExMjg5NjAwLAkweDRkNWJ9LAorCXsgMTMxMDAwMDAsICAxMTI4OTYwMCwJMHgzNjNifSwKKwl7ICAyMDQ4MDAwLCAgMTYzODQwMDAsCTB4MWVhMH0sCisJeyAgMzY4NjQwMCwgIDE2Mzg0MDAwLAkweDllMjd9LAorCXsgMTIwMDAwMDAsICAxNjM4NDAwMCwJMHg0NTJifSwKKwl7IDEzMDAwMDAwLCAgMTYzODQwMDAsCTB4NTQyZn0sCisJeyAxMzEwMDAwMCwgIDE2Mzg0MDAwLAkweDAzYTB9LAorCXsgIDIwNDgwMDAsICAxNjkzNDQwMCwJMHhlNjI1fSwKKwl7ICAzNjg2NDAwLCAgMTY5MzQ0MDAsCTB4OTEyNn0sCisJeyAxMjAwMDAwMCwgIDE2OTM0NDAwLAkweDRkMmN9LAorCXsgMTMwMDAwMDAsICAxNjkzNDQwMCwJMHg3NDJmfSwKKwl7IDEzMTAwMDAwLCAgMTY5MzQ0MDAsCTB4M2MyN30sCisJeyAgMjA0ODAwMCwgIDIyNTc5MjAwLAkweDJhYTB9LAorCXsgIDM2ODY0MDAsICAyMjU3OTIwMCwJMHgyZjIwfSwKKwl7IDEyMDAwMDAwLCAgMjI1NzkyMDAsCTB4N2UyZn0sCisJeyAxMzAwMDAwMCwgIDIyNTc5MjAwLAkweDc0MmZ9LAorCXsgMTMxMDAwMDAsICAyMjU3OTIwMCwJMHgzYzI3fSwKKwl7ICAyMDQ4MDAwLCAgMjQ1NzYwMDAsCTB4MmVhMH0sCisJeyAgMzY4NjQwMCwgIDI0NTc2MDAwLAkweGVlMjd9LAorCXsgMTIwMDAwMDAsICAyNDU3NjAwMCwJMHgyOTE1fSwKKwl7IDEzMDAwMDAwLCAgMjQ1NzYwMDAsCTB4NzcyZX0sCisJeyAxMzEwMDAwMCwgIDI0NTc2MDAwLAkweDBkMjB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBfcGxsX2RpdiBjb2RlY19zbGF2ZV9wbGxfZGl2W10gPSB7CisKKwl7ICAxMDI0MDAwLCAgMTYzODQwMDAsICAweDNlYTB9LAorCXsgIDE0MTEyMDAsICAyMjU3OTIwMCwJMHgzZWEwfSwKKwl7ICAxNTM2MDAwLCAgMjQ1NzYwMDAsCTB4M2VhMH0sCisJeyAgMjA0ODAwMCwgIDE2Mzg0MDAwLCAgMHgxZWEwfSwKKwl7ICAyODIyNDAwLCAgMjI1NzkyMDAsCTB4MWVhMH0sCisJeyAgMzA3MjAwMCwgIDI0NTc2MDAwLAkweDFlYTB9LAorCit9OworCitzdGF0aWMgaW50IGFsYzU2MjNfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksIGludCBwbGxfaWQsCisJCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJaW50IGk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlpbnQgZ2JsX2NsayA9IDAsIHBsbF9kaXYgPSAwOworCXUxNiByZWc7CisKKwlpZiAocGxsX2lkIDwgQUxDNTYyM19QTExfRlJfTUNMSyB8fCBwbGxfaWQgPiBBTEM1NjIzX1BMTF9GUl9CQ0spCisJCXJldHVybiAtRU5PREVWOworCisJLyogRGlzYWJsZSBQTEwgcG93ZXIgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBTEM1NjIzX1BXUl9NQU5BR19BREQyLAorCQkJCUFMQzU2MjNfUFdSX0FERDJfUExMLAorCQkJCTApOworCisJLyogcGxsIGlzIG5vdCB1c2VkIGluIHNsYXZlIG1vZGUgKi8KKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFMQzU2MjNfREFJX0NPTlRST0wpOworCWlmIChyZWcgJiBBTEM1NjIzX0RBSV9TRFBfU0xBVkVfTU9ERSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocGxsX2lkKSB7CisJY2FzZSBBTEM1NjIzX1BMTF9GUl9NQ0xLOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2RlY19tYXN0ZXJfcGxsX2Rpdik7IGkrKykgeworCQkJaWYgKGNvZGVjX21hc3Rlcl9wbGxfZGl2W2ldLnBsbF9pbiA9PSBmcmVxX2luCisJCQkgICAmJiBjb2RlY19tYXN0ZXJfcGxsX2RpdltpXS5wbGxfb3V0ID09IGZyZXFfb3V0KSB7CisJCQkJLyogUExMIHNvdXJjZSBmcm9tIE1DTEsgKi8KKwkJCQlwbGxfZGl2ICA9IGNvZGVjX21hc3Rlcl9wbGxfZGl2W2ldLnJlZ3ZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgQUxDNTYyM19QTExfRlJfQkNLOgorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2RlY19zbGF2ZV9wbGxfZGl2KTsgaSsrKSB7CisJCQlpZiAoY29kZWNfc2xhdmVfcGxsX2RpdltpXS5wbGxfaW4gPT0gZnJlcV9pbgorCQkJICAgJiYgY29kZWNfc2xhdmVfcGxsX2RpdltpXS5wbGxfb3V0ID09IGZyZXFfb3V0KSB7CisJCQkJLyogUExMIHNvdXJjZSBmcm9tIEJpdGNsayAqLworCQkJCWdibF9jbGsgPSBBTEM1NjIzX0dCTF9DTEtfUExMX1NPVVJfU0VMX0JJVENMSzsKKwkJCQlwbGxfZGl2ID0gY29kZWNfc2xhdmVfcGxsX2RpdltpXS5yZWd2YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBsbF9kaXYpCisJCXJldHVybiAtRUlOVkFMOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19HTE9CQUxfQ0xLX0NUUkxfUkVHLCBnYmxfY2xrKTsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBTEM1NjIzX1BMTF9DVFJMLCBwbGxfZGl2KTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBTEM1NjIzX1BXUl9NQU5BR19BREQyLAorCQkJCUFMQzU2MjNfUFdSX0FERDJfUExMLAorCQkJCUFMQzU2MjNfUFdSX0FERDJfUExMKTsKKwlnYmxfY2xrIHw9IEFMQzU2MjNfR0JMX0NMS19TWVNfU09VUl9TRUxfUExMOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfR0xPQkFMX0NMS19DVFJMX1JFRywgZ2JsX2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IF9jb2VmZl9kaXYgeworCXUxNiBmczsKKwl1MTYgcmVndmFsdWU7Cit9OworCisvKiBjb2RlYyBoaWZpIG1jbGsgKGFmdGVyIFBMTCkgY2xvY2sgZGl2aWRlciBjb2VmZmljaWVudHMgKi8KKy8qIHZhbHVlcyBpbnNwaXJlZCBmcm9tIGNvbHVtbiBCQ0xLPTMyRnMgb2YgQXBwZW5kaXggQSB0YWJsZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBfY29lZmZfZGl2IGNvZWZmX2RpdltdID0geworCXsyNTYqOCwgMHgzYTY5fSwKKwl7Mzg0KjgsIDB4M2M2Yn0sCisJezI1Nio0LCAweDJhNjl9LAorCXszODQqNCwgMHgyYzZifSwKKwl7MjU2KjIsIDB4MWE2OX0sCisJezM4NCoyLCAweDFjNmJ9LAorCXsyNTYqMSwgMHgwYTY5fSwKKwl7Mzg0KjEsIDB4MGM2Yn0sCit9OworCitzdGF0aWMgaW50IGdldF9jb2VmZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCByYXRlKQoreworCXN0cnVjdCBhbGM1NjIzX3ByaXYgKmFsYzU2MjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLmZzICogcmF0ZSA9PSBhbGM1NjIzLT5zeXNjbGspCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBDbG9jayBhZnRlciBQTEwgYW5kIGRpdmlkZXJzCisgKi8KK3N0YXRpYyBpbnQgYWxjNTYyM19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgYWxjNTYyM19wcml2ICphbGM1NjIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlICA4MTkyMDAwOgorCWNhc2UgMTEyODk2MDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2Mzg0MDAwOgorCWNhc2UgMTY5MzQ0MDA6CisJY2FzZSAxODQzMjAwMDoKKwljYXNlIDIyNTc5MjAwOgorCWNhc2UgMjQ1NzYwMDA6CisJCWFsYzU2MjMtPnN5c2NsayA9IGZyZXE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhbGM1NjIzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IGlmYWNlID0gMDsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWZhY2UgPSBBTEM1NjIzX0RBSV9TRFBfTUFTVEVSX01PREU7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJaWZhY2UgPSBBTEM1NjIzX0RBSV9TRFBfU0xBVkVfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogaW50ZXJmYWNlIGZvcm1hdCAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJaWZhY2UgfD0gQUxDNTYyM19EQUlfSTJTX0RGX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlpZmFjZSB8PSBBTEM1NjIzX0RBSV9JMlNfREZfUklHSFQ7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlpZmFjZSB8PSBBTEM1NjIzX0RBSV9JMlNfREZfTEVGVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJaWZhY2UgfD0gQUxDNTYyM19EQUlfSTJTX0RGX1BDTTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJaWZhY2UgfD0gQUxDNTYyM19EQUlfSTJTX0RGX1BDTSB8IEFMQzU2MjNfREFJX0kyU19QQ01fTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xvY2sgaW52ZXJzaW9uICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IEFMQzU2MjNfREFJX01BSU5fSTJTX0JDTEtfUE9MX0NUUkw7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWlmYWNlIHw9IEFMQzU2MjNfREFJX01BSU5fSTJTX0JDTEtfUE9MX0NUUkw7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBBTEM1NjIzX0RBSV9DT05UUk9MLCBpZmFjZSk7Cit9CisKK3N0YXRpYyBpbnQgYWxjNTYyM19wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IGFsYzU2MjNfcHJpdiAqYWxjNTYyMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBjb2VmZiwgcmF0ZTsKKwl1MTYgaWZhY2U7CisKKwlpZmFjZSA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUxDNTYyM19EQUlfQ09OVFJPTCk7CisJaWZhY2UgJj0gfkFMQzU2MjNfREFJX0kyU19ETF9NQVNLOworCisJLyogYml0IHNpemUgKi8KKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWlmYWNlIHw9IEFMQzU2MjNfREFJX0kyU19ETF8xNjsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IEFMQzU2MjNfREFJX0kyU19ETF8yMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJaWZhY2UgfD0gQUxDNTYyM19EQUlfSTJTX0RMXzI0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlpZmFjZSB8PSBBTEM1NjIzX0RBSV9JMlNfRExfMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCBpZmFjZSAmIHNyYXRlICovCisJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19EQUlfQ09OVFJPTCwgaWZhY2UpOworCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWNvZWZmID0gZ2V0X2NvZWZmKGNvZGVjLCByYXRlKTsKKwlpZiAoY29lZmYgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvZWZmID0gY29lZmZfZGl2W2NvZWZmXS5yZWd2YWx1ZTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3lzY2xrPSVkLHJhdGU9JWQsY29lZmY9MHglMDR4XG4iLAorCQlfX2Z1bmNfXywgYWxjNTYyMy0+c3lzY2xrLCByYXRlLCBjb2VmZik7CisJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19TVEVSRU9fQURfREFfQ0xLX0NUUkwsIGNvZWZmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYzU2MjNfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1MTYgaHBfbXV0ZSA9IEFMQzU2MjNfTUlTQ19NX0RBQ19MX0lOUFVUIHwgQUxDNTYyM19NSVNDX01fREFDX1JfSU5QVVQ7CisJdTE2IG11dGVfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBBTEM1NjIzX01JU0NfQ1RSTCkgJiB+aHBfbXV0ZTsKKworCWlmIChtdXRlKQorCQltdXRlX3JlZyB8PSBocF9tdXRlOworCisJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfTUlTQ19DVFJMLCBtdXRlX3JlZyk7Cit9CisKKyNkZWZpbmUgQUxDNTYyM19BREQyX1BPV0VSX0VOIChBTEM1NjIzX1BXUl9BREQyX1ZSRUYgXAorCXwgQUxDNTYyM19QV1JfQUREMl9EQUNfUkVGX0NJUikKKworI2RlZmluZSBBTEM1NjIzX0FERDNfUE9XRVJfRU4gKEFMQzU2MjNfUFdSX0FERDNfTUFJTl9CSUFTIFwKKwl8IEFMQzU2MjNfUFdSX0FERDNfTUlDMV9CT09TVF9BRCkKKworI2RlZmluZSBBTEM1NjIzX0FERDFfUE9XRVJfRU4gXAorCShBTEM1NjIzX1BXUl9BREQxX1NIT1JUX0NVUlJfREVUX0VOIHwgQUxDNTYyM19QV1JfQUREMV9TT0ZUR0VOX0VOIFwKKwl8IEFMQzU2MjNfUFdSX0FERDFfREVQT1BfQlVGX0hQIHwgQUxDNTYyM19QV1JfQUREMV9IUF9PVVRfQU1QIFwKKwl8IEFMQzU2MjNfUFdSX0FERDFfSFBfT1VUX0VOSF9BTVApCisKKyNkZWZpbmUgQUxDNTYyM19BREQxX1BPV0VSX0VOXzU2MjIgXAorCShBTEM1NjIzX1BXUl9BREQxX1NIT1JUX0NVUlJfREVUX0VOIFwKKwl8IEFMQzU2MjNfUFdSX0FERDFfSFBfT1VUX0FNUCkKKworc3RhdGljIHZvaWQgZW5hYmxlX3Bvd2VyX2RlcG9wKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjNTYyM19wcml2ICphbGM1NjIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBTEM1NjIzX1BXUl9NQU5BR19BREQxLAorCQkJCUFMQzU2MjNfUFdSX0FERDFfU09GVEdFTl9FTiwKKwkJCQlBTEM1NjIzX1BXUl9BREQxX1NPRlRHRU5fRU4pOworCisJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgQUxDNTYyM19BREQzX1BPV0VSX0VOKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIEFMQzU2MjNfTUlTQ19DVFJMLAorCQkJCUFMQzU2MjNfTUlTQ19IUF9ERVBPUF9NT0RFMl9FTiwKKwkJCQlBTEM1NjIzX01JU0NfSFBfREVQT1BfTU9ERTJfRU4pOworCisJbXNsZWVwKDUwMCk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBBTEM1NjIzX1BXUl9NQU5BR19BREQyLCBBTEM1NjIzX0FERDJfUE9XRVJfRU4pOworCisJLyogYXZvaWQgd3JpdGluZyAnMScgaW50byA1NjIyIHJlc2VydmVkIGJpdHMgKi8KKwlpZiAoYWxjNTYyMy0+aWQgPT0gMHgyMikKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19QV1JfTUFOQUdfQUREMSwKKwkJCUFMQzU2MjNfQUREMV9QT1dFUl9FTl81NjIyKTsKKwllbHNlCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfUFdSX01BTkFHX0FERDEsCisJCQlBTEM1NjIzX0FERDFfUE9XRVJfRU4pOworCisJLyogZGlzYWJsZSBIUCBEZXBvcDIgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBTEM1NjIzX01JU0NfQ1RSTCwKKwkJCQlBTEM1NjIzX01JU0NfSFBfREVQT1BfTU9ERTJfRU4sCisJCQkJMCk7CisKK30KKworc3RhdGljIGludCBhbGM1NjIzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWVuYWJsZV9wb3dlcl9kZXBvcChjb2RlYyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCS8qIGV2ZXJ5dGhpbmcgb2ZmIGV4Y2VwdCB2cmVmL3ZtaWQsICovCisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfUFdSX01BTkFHX0FERDIsCisJCQkJQUxDNTYyM19QV1JfQUREMl9WUkVGKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19QV1JfTUFOQUdfQUREMywKKwkJCQlBTEM1NjIzX1BXUl9BREQzX01BSU5fQklBUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJLyogZXZlcnl0aGluZyBvZmYsIGRhYyBtdXRlLCBpbmFjdGl2ZSAqLworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBBTEM1NjIzX1BXUl9NQU5BR19BREQyLCAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19QV1JfTUFOQUdfQUREMywgMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfUFdSX01BTkFHX0FERDEsIDApOworCQlicmVhazsKKwl9CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFMQzU2MjNfRk9STUFUUwkoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgXAorCQkJfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSBcCisJCQl8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhbGM1NjIzX2RhaV9vcHMgPSB7CisJCS5od19wYXJhbXMgPSBhbGM1NjIzX3BjbV9od19wYXJhbXMsCisJCS5kaWdpdGFsX211dGUgPSBhbGM1NjIzX211dGUsCisJCS5zZXRfZm10ID0gYWxjNTYyM19zZXRfZGFpX2ZtdCwKKwkJLnNldF9zeXNjbGsgPSBhbGM1NjIzX3NldF9kYWlfc3lzY2xrLAorCQkuc2V0X3BsbCA9IGFsYzU2MjNfc2V0X2RhaV9wbGwsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhbGM1NjIzX2RhaSA9IHsKKwkubmFtZSA9ICJhbGM1NjIzLWhpZmkiLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZV9taW4gPQk4MDAwLAorCQkucmF0ZV9tYXggPQk0ODAwMCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJLmZvcm1hdHMgPSBBTEM1NjIzX0ZPUk1BVFMsfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNhcHR1cmUiLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlX21pbiA9CTgwMDAsCisJCS5yYXRlX21heCA9CTQ4MDAwLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkuZm9ybWF0cyA9IEFMQzU2MjNfRk9STUFUUyx9LAorCisJLm9wcyA9ICZhbGM1NjIzX2RhaV9vcHMsCit9OworCitzdGF0aWMgaW50IGFsYzU2MjNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsYzU2MjNfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgaSwgc3RlcCA9IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zdGVwOworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAyIDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIDsgaSArPSBzdGVwKQorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CisKKwlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisKKwkvKiBjaGFyZ2UgYWxjNTYyMyBjYXBzICovCisJaWYgKGNvZGVjLT5kYXBtLnN1c3BlbmRfYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT04pIHsKKwkJYWxjNTYyM19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCQljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOworCQlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBjb2RlYy0+ZGFwbS5iaWFzX2xldmVsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGM1NjIzX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjNTYyM19wcml2ICphbGM1NjIzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgMTYsIGFsYzU2MjMtPmNvbnRyb2xfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWFsYzU2MjNfcmVzZXQoY29kZWMpOworCWFsYzU2MjNfZmlsbF9jYWNoZShjb2RlYyk7CisKKwkvKiBwb3dlciBvbiBkZXZpY2UgKi8KKwlhbGM1NjIzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisKKwlpZiAoYWxjNTYyMy0+YWRkX2N0cmwpIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgQUxDNTYyM19BRERfQ1RSTF9SRUcsCisJCQkJYWxjNTYyMy0+YWRkX2N0cmwpOworCX0KKworCWlmIChhbGM1NjIzLT5qYWNrX2RldF9jdHJsKSB7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIEFMQzU2MjNfSkFDS19ERVRfQ1RSTCwKKwkJCQlhbGM1NjIzLT5qYWNrX2RldF9jdHJsKTsKKwl9CisKKwlzd2l0Y2ggKGFsYzU2MjMtPmlkKSB7CisJY2FzZSAweDIxOgorCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgcnQ1NjIxX3ZvbF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHJ0NTYyMV92b2xfc25kX2NvbnRyb2xzKSk7CisJCWJyZWFrOworCWNhc2UgMHgyMjoKKwkJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHJ0NTYyMl92b2xfc25kX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShydDU2MjJfdm9sX3NuZF9jb250cm9scykpOworCQlicmVhazsKKwljYXNlIDB4MjM6CisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhbGM1NjIzX3ZvbF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFsYzU2MjNfdm9sX3NuZF9jb250cm9scykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYWxjNTYyM19zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFsYzU2MjNfc25kX2NvbnRyb2xzKSk7CisKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFsYzU2MjNfZGFwbV93aWRnZXRzLAorCQkJCQlBUlJBWV9TSVpFKGFsYzU2MjNfZGFwbV93aWRnZXRzKSk7CisKKwkvKiBzZXQgdXAgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKworCXN3aXRjaCAoYWxjNTYyMy0+aWQpIHsKKwljYXNlIDB4MjE6CisJY2FzZSAweDIyOgorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFsYzU2MjNfZGFwbV9hbXBfd2lkZ2V0cywKKwkJCQkJQVJSQVlfU0laRShhbGM1NjIzX2RhcG1fYW1wX3dpZGdldHMpKTsKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb25fYW1wX3NwaywKKwkJCQkJQVJSQVlfU0laRShpbnRlcmNvbl9hbXBfc3BrKSk7CisJCWJyZWFrOworCWNhc2UgMHgyMzoKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb25fc3BrLAorCQkJCQlBUlJBWV9TSVpFKGludGVyY29uX3NwaykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBwb3dlciBkb3duIGNoaXAgKi8KK3N0YXRpYyBpbnQgYWxjNTYyM19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWFsYzU2MjNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZpY2VfYWxjNTYyMyA9IHsKKwkucHJvYmUgPSBhbGM1NjIzX3Byb2JlLAorCS5yZW1vdmUgPSBhbGM1NjIzX3JlbW92ZSwKKwkuc3VzcGVuZCA9IGFsYzU2MjNfc3VzcGVuZCwKKwkucmVzdW1lID0gYWxjNTYyM19yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gYWxjNTYyM19zZXRfYmlhc19sZXZlbCwKKwkucmVnX2NhY2hlX3NpemUgPSBBTEM1NjIzX1ZFTkRPUl9JRDIrMiwKKwkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAorCS5yZWdfY2FjaGVfc3RlcCA9IDIsCit9OworCisvKgorICogQUxDNTYyMyAyIHdpcmUgYWRkcmVzcyBpcyBkZXRlcm1pbmVkIGJ5IEExIHBpbgorICogc3RhdGUgZHVyaW5nIHBvd2VydXAuCisgKiAgICBsb3cgID0gMHgxYQorICogICAgaGlnaCA9IDB4MWIKKyAqLworc3RhdGljIGludCBhbGM1NjIzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWxjNTYyM19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYWxjNTYyM19wcml2ICphbGM1NjIzOworCWludCByZXQsIHZpZDEsIHZpZDI7CisKKwl2aWQxID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQUxDNTYyM19WRU5ET1JfSUQxKTsKKwlpZiAodmlkMSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBJMkNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdmlkMSA9ICgodmlkMSAmIDB4ZmYpIDw8IDgpIHwgKHZpZDEgPj4gOCk7CisKKwl2aWQyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQUxDNTYyM19WRU5ET1JfSUQyKTsKKwlpZiAodmlkMiA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBJMkNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoKHZpZDEgIT0gMHgxMGVjKSB8fCAodmlkMiAhPSBpZC0+ZHJpdmVyX2RhdGEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5rbm93biBvciB3cm9uZyBjb2RlY1xuIik7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXhwZWN0ZWQgJXg6JWx4LCBnb3QgJXg6JXhcbiIsCisJCQkJMHgxMGVjLCBpZC0+ZHJpdmVyX2RhdGEsCisJCQkJdmlkMSwgdmlkMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm91bmQgY29kZWMgaWQgOiBhbGM1NiUwMnhcbiIsIHZpZDIpOworCisJYWxjNTYyMyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGM1NjIzX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWxjNTYyMyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGRhdGEpIHsKKwkJYWxjNTYyMy0+YWRkX2N0cmwgPSBwZGF0YS0+YWRkX2N0cmw7CisJCWFsYzU2MjMtPmphY2tfZGV0X2N0cmwgPSBwZGF0YS0+amFja19kZXRfY3RybDsKKwl9CisKKwlhbGM1NjIzLT5pZCA9IHZpZDI7CisJc3dpdGNoIChhbGM1NjIzLT5pZCkgeworCWNhc2UgMHgyMToKKwkJYWxjNTYyM19kYWkubmFtZSA9ICJhbGM1NjIxLWhpZmkiOworCQlicmVhazsKKwljYXNlIDB4MjI6CisJCWFsYzU2MjNfZGFpLm5hbWUgPSAiYWxjNTYyMi1oaWZpIjsKKwkJYnJlYWs7CisJY2FzZSAweDIzOgorCQlhbGM1NjIzX2RhaS5uYW1lID0gImFsYzU2MjMtaGlmaSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWtmcmVlKGFsYzU2MjMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBhbGM1NjIzKTsKKwlhbGM1NjIzLT5jb250cm9sX2RhdGEgPSBjbGllbnQ7CisJYWxjNTYyMy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CisJbXV0ZXhfaW5pdCgmYWxjNTYyMy0+bXV0ZXgpOworCisJcmV0ID0gIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2LAorCQkmc29jX2NvZGVjX2RldmljZV9hbGM1NjIzLCAmYWxjNTYyM19kYWksIDEpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBjb2RlYzogJWRcbiIsIHJldCk7CisJCWtmcmVlKGFsYzU2MjMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWxjNTYyM19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFsYzU2MjNfcHJpdiAqYWxjNTYyMyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisJa2ZyZWUoYWxjNTYyMyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhbGM1NjIzX2kyY190YWJsZVtdID0geworCXsiYWxjNTYyMSIsIDB4MjF9LAorCXsiYWxjNTYyMiIsIDB4MjJ9LAorCXsiYWxjNTYyMyIsIDB4MjN9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFsYzU2MjNfaTJjX3RhYmxlKTsKKworLyogIGkyYyBjb2RlYyBjb250cm9sIGxheWVyICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWxjNTYyM19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFsYzU2MngtY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFsYzU2MjNfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgX19kZXZleGl0X3AoYWxjNTYyM19pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhbGM1NjIzX2kyY190YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsYzU2MjNfbW9kaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmYWxjNTYyM19pMmNfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgYWRkIGkyYyBkcml2ZXIiLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGFsYzU2MjNfbW9kaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbGM1NjIzX21vZGV4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWxjNTYyM19pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFsYzU2MjNfbW9kZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBhbGM1NjIxLzIvMyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MjMuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIGFsYzU2MjMuaCAgLS0gIGFsYzU2MlsxMjNdIEFMU0EgU29jIEF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDA4IFJlYWx0ZWsgTWljcm9lbGVjdHJvbmljcworICogQ29weXJpZ2h0IDIwMTAgQXJuYXVkIFBhdGFyZCA8YXJuYXVkLnBhdGFyZEBydHAtbmV0Lm9yZz4KKyAqCisgKiBBdXRob3I6IGZsb3ZlIDxmbG92ZUByZWFsdGVrLmNvbT4KKyAqIEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfQUxDNTYyM19ICisjZGVmaW5lIF9BTEM1NjIzX0gKKworI2RlZmluZSBBTEM1NjIzX1JFU0VUCQkJCTB4MDAKKy8qCQkJCTU2MjEgNTYyMiA1NjIzICAqLworLyogc3BlYWtlciBvdXRwdXQgdm9sCQkgICAyICAgIDIgICAgICAgKi8KKy8qIGxpbmUgb3V0cHV0IHZvbCAgICAgICAgICAgICAgICAgICAgICA0ICAgIDIgICovCisvKiBIUCBvdXRwdXQgdm9sCQkgICA0ICAgIDAgICAgNCAgKi8KKyNkZWZpbmUgQUxDNTYyM19TUEtfT1VUX1ZPTAkJCTB4MDIKKyNkZWZpbmUgQUxDNTYyM19IUF9PVVRfVk9MCQkJMHgwNAorI2RlZmluZSBBTEM1NjIzX01PTk9fQVVYX09VVF9WT0wJCTB4MDYKKyNkZWZpbmUgQUxDNTYyM19BVVhJTl9WT0wJCQkweDA4CisjZGVmaW5lIEFMQzU2MjNfTElORV9JTl9WT0wJCQkweDBBCisjZGVmaW5lIEFMQzU2MjNfU1RFUkVPX0RBQ19WT0wJCQkweDBDCisjZGVmaW5lIEFMQzU2MjNfTUlDX1ZPTAkJCQkweDBFCisjZGVmaW5lIEFMQzU2MjNfTUlDX1JPVVRJTkdfQ1RSTAkJMHgxMAorI2RlZmluZSBBTEM1NjIzX0FEQ19SRUNfR0FJTgkJCTB4MTIKKyNkZWZpbmUgQUxDNTYyM19BRENfUkVDX01JWEVSCQkJMHgxNAorI2RlZmluZSBBTEM1NjIzX1NPRlRfVk9MX0NUUkxfVElNRQkJMHgxNgorLyogQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTCA6CQkJKi8KKy8qIHNhbWUgcmVtYXJrIGFzIGZvciByZWcgMiBsaW5lIHZzIHNwZWFrZXIJKi8KKyNkZWZpbmUgQUxDNTYyM19PVVRQVVRfTUlYRVJfQ1RSTAkJMHgxQworI2RlZmluZSBBTEM1NjIzX01JQ19DVFJMCQkJMHgyMgorCisjZGVmaW5lCUFMQzU2MjNfREFJX0NPTlRST0wJCQkweDM0CisjZGVmaW5lIEFMQzU2MjNfREFJX1NEUF9NQVNURVJfTU9ERQkJKDAgPDwgMTUpCisjZGVmaW5lIEFMQzU2MjNfREFJX1NEUF9TTEFWRV9NT0RFCQkoMSA8PCAxNSkKKyNkZWZpbmUgQUxDNTYyM19EQUlfSTJTX1BDTV9NT0RFCQkoMSA8PCAxNCkKKyNkZWZpbmUgQUxDNTYyM19EQUlfTUFJTl9JMlNfQkNMS19QT0xfQ1RSTAkoMSA8PCAgNykKKyNkZWZpbmUgQUxDNTYyM19EQUlfQURDX0RBVEFfTF9SX1NXQVAJCSgxIDw8ICA1KQorI2RlZmluZSBBTEM1NjIzX0RBSV9EQUNfREFUQV9MX1JfU1dBUAkJKDEgPDwgIDQpCisjZGVmaW5lIEFMQzU2MjNfREFJX0kyU19ETF9NQVNLCQkJKDMgPDwgIDIpCisjZGVmaW5lIEFMQzU2MjNfREFJX0kyU19ETF8zMgkJCSgzIDw8ICAyKQorI2RlZmluZQlBTEM1NjIzX0RBSV9JMlNfRExfMjQJCQkoMiA8PCAgMikKKyNkZWZpbmUgQUxDNTYyM19EQUlfSTJTX0RMXzIwCQkJKDEgPDwgIDIpCisjZGVmaW5lIEFMQzU2MjNfREFJX0kyU19ETF8xNgkJCSgwIDw8ICAyKQorI2RlZmluZSBBTEM1NjIzX0RBSV9JMlNfREZfUENNCQkJKDMgPDwgIDApCisjZGVmaW5lCUFMQzU2MjNfREFJX0kyU19ERl9MRUZUCQkJKDIgPDwgIDApCisjZGVmaW5lIEFMQzU2MjNfREFJX0kyU19ERl9SSUdIVAkJKDEgPDwgIDApCisjZGVmaW5lIEFMQzU2MjNfREFJX0kyU19ERl9JMlMJCQkoMCA8PCAgMCkKKworI2RlZmluZSBBTEM1NjIzX1NURVJFT19BRF9EQV9DTEtfQ1RSTAkJMHgzNgorI2RlZmluZQlBTEM1NjIzX0NPTVBBTkRJTkdfQ1RSTAkJCTB4MzgKKworI2RlZmluZQlBTEM1NjIzX1BXUl9NQU5BR19BREQxCQkJMHgzQQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQxX01BSU5fSTJTX0VOCQkoMSA8PCAxNSkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMV9aQ19ERVRfUERfRU4JCSgxIDw8IDE0KQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQxX01JQzFfQklBU19FTgkJKDEgPDwgMTEpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDFfU0hPUlRfQ1VSUl9ERVRfRU4JKDEgPDwgMTApCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDFfU09GVEdFTl9FTgkJKDEgPDwgIDgpIC8qIHJzdmQgb24gNTYyMiAqLworI2RlZmluZQlBTEM1NjIzX1BXUl9BREQxX0RFUE9QX0JVRl9IUAkJKDEgPDwgIDYpIC8qIHJzdmQgb24gNTYyMiAqLworI2RlZmluZQlBTEM1NjIzX1BXUl9BREQxX0hQX09VVF9BTVAJCSgxIDw8ICA1KQorI2RlZmluZQlBTEM1NjIzX1BXUl9BREQxX0hQX09VVF9FTkhfQU1QCQkoMSA8PCAgNCkgLyogcnN2ZCBvbiA1NjIyICovCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDFfREVQT1BfQlVGX0FVWAkJKDEgPDwgIDIpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDFfQVVYX09VVF9BTVAJCSgxIDw8ICAxKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQxX0FVWF9PVVRfRU5IX0FNUAkoMSA8PCAgMCkgLyogcnN2ZCBvbiA1NjIyICovCisKKyNkZWZpbmUgQUxDNTYyM19QV1JfTUFOQUdfQUREMgkJCTB4M0MKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9MSU5FT1VUCQkoMSA8PCAxNSkgLyogcnQ1NjIzICovCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDJfQ0xBU1NfQUIJCSgxIDw8IDE1KSAvKiBydDU2MjEgKi8KKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9DTEFTU19ECQkoMSA8PCAxNCkgLyogcnQ1NjIxICovCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDJfVlJFRgkJCSgxIDw8IDEzKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX1BMTAkJCSgxIDw8IDEyKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX0RBQ19SRUZfQ0lSCQkoMSA8PCAxMCkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9MX0RBQ19DTEsJCSgxIDw8ICA5KQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX1JfREFDX0NMSwkJKDEgPDwgIDgpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDJfTF9BRENfQ0xLX0dBSU4JCSgxIDw8ICA3KQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX1JfQURDX0NMS19HQUlOCQkoMSA8PCAgNikKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9MX0hQX01JWEVSCQkoMSA8PCAgNSkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9SX0hQX01JWEVSCQkoMSA8PCAgNCkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9TUEtfTUlYRVIJCSgxIDw8ICAzKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX01PTk9fTUlYRVIJCSgxIDw8ICAyKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQyX0xfQURDX1JFQ19NSVhFUgkoMSA8PCAgMSkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREMl9SX0FEQ19SRUNfTUlYRVIJKDEgPDwgIDApCisKKyNkZWZpbmUgQUxDNTYyM19QV1JfTUFOQUdfQUREMwkJCTB4M0UKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREM19NQUlOX0JJQVMJCSgxIDw8IDE1KQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQzX0FVWE9VVF9MX1ZPTF9BTVAJKDEgPDwgMTQpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfQVVYT1VUX1JfVk9MX0FNUAkoMSA8PCAxMykKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREM19TUEtfT1VUCQkoMSA8PCAxMikKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREM19IUF9MX09VVF9WT0wJCSgxIDw8IDEwKQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQzX0hQX1JfT1VUX1ZPTAkJKDEgPDwgIDkpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfTElORUlOX0xfVk9MCQkoMSA8PCAgNykKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREM19MSU5FSU5fUl9WT0wJCSgxIDw8ICA2KQorI2RlZmluZSBBTEM1NjIzX1BXUl9BREQzX0FVWElOX0xfVk9MCQkoMSA8PCAgNSkKKyNkZWZpbmUgQUxDNTYyM19QV1JfQUREM19BVVhJTl9SX1ZPTAkJKDEgPDwgIDQpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfTUlDMV9GVU5fQ1RSTAkJKDEgPDwgIDMpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfTUlDMl9GVU5fQ1RSTAkJKDEgPDwgIDIpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfTUlDMV9CT09TVF9BRAkJKDEgPDwgIDEpCisjZGVmaW5lIEFMQzU2MjNfUFdSX0FERDNfTUlDMl9CT09TVF9BRAkJKDEgPDwgIDApCisKKyNkZWZpbmUgQUxDNTYyM19BRERfQ1RSTF9SRUcJCQkweDQwCisKKyNkZWZpbmUJQUxDNTYyM19HTE9CQUxfQ0xLX0NUUkxfUkVHCQkweDQyCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19TWVNfU09VUl9TRUxfUExMCSgxIDw8IDE1KQorI2RlZmluZSBBTEM1NjIzX0dCTF9DTEtfU1lTX1NPVVJfU0VMX01DTEsJKDAgPDwgMTUpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfU09VUl9TRUxfQklUQ0xLCSgxIDw8IDE0KQorI2RlZmluZSBBTEM1NjIzX0dCTF9DTEtfUExMX1NPVVJfU0VMX01DTEsJKDAgPDwgMTQpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfRElWX1JBVElPX0RJVjgJKDMgPDwgIDEpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfRElWX1JBVElPX0RJVjQJKDIgPDwgIDEpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfRElWX1JBVElPX0RJVjIJKDEgPDwgIDEpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfRElWX1JBVElPX0RJVjEJKDAgPDwgIDEpCisjZGVmaW5lIEFMQzU2MjNfR0JMX0NMS19QTExfUFJFX0RJVjIJCSgxIDw8ICAwKQorI2RlZmluZSBBTEM1NjIzX0dCTF9DTEtfUExMX1BSRV9ESVYxCQkoMCA8PCAgMCkKKworI2RlZmluZSBBTEM1NjIzX1BMTF9DVFJMCQkJMHg0NAorI2RlZmluZSBBTEM1NjIzX1BMTF9DVFJMX05fVkFMKG4pCQkoKChuKSYweGZmKSA8PCA4KQorI2RlZmluZSBBTEM1NjIzX1BMTF9DVFJMX0tfVkFMKGspCQkoKChrKSYweDcpICA8PCA0KQorI2RlZmluZSBBTEM1NjIzX1BMTF9DVFJMX01fVkFMKG0pCQkoKG0pJjB4ZikKKworI2RlZmluZSBBTEM1NjIzX0dQSU9fT1VUUFVUX1BJTl9DVFJMCQkweDRBCisjZGVmaW5lIEFMQzU2MjNfR1BJT19QSU5fQ09ORklHCQkJMHg0QworI2RlZmluZSBBTEM1NjIzX0dQSU9fUElOX1BPTEFSSVRZCQkweDRFCisjZGVmaW5lIEFMQzU2MjNfR1BJT19QSU5fU1RJQ0tZCQkJMHg1MAorI2RlZmluZSBBTEM1NjIzX0dQSU9fUElOX1dBS0VVUAkJCTB4NTIKKyNkZWZpbmUgQUxDNTYyM19HUElPX1BJTl9TVEFUVVMJCQkweDU0CisjZGVmaW5lIEFMQzU2MjNfR1BJT19QSU5fU0hBUklORwkJMHg1NgorI2RlZmluZQlBTEM1NjIzX09WRVJfQ1VSUl9TVEFUVVMJCTB4NTgKKyNkZWZpbmUgQUxDNTYyM19KQUNLX0RFVF9DVFJMCQkJMHg1QQorCisjZGVmaW5lIEFMQzU2MjNfTUlTQ19DVFJMCQkJMHg1RQorI2RlZmluZSBBTEM1NjIzX01JU0NfRElTQUJMRV9GQVNUX1ZSRUcJCSgxIDw8IDE1KQorI2RlZmluZSBBTEM1NjIzX01JU0NfU1BLX0NMQVNTX0FCX09DX1BECQkoMSA8PCAxMykgLyogNTYyMSAqLworI2RlZmluZSBBTEM1NjIzX01JU0NfU1BLX0NMQVNTX0FCX09DX0RFVAkoMSA8PCAxMikgLyogNTYyMSAqLworI2RlZmluZSBBTEM1NjIzX01JU0NfSFBfREVQT1BfTU9ERTNfRU4JCSgxIDw8IDEwKQorI2RlZmluZSBBTEM1NjIzX01JU0NfSFBfREVQT1BfTU9ERTJfRU4JCSgxIDw8ICA5KQorI2RlZmluZSBBTEM1NjIzX01JU0NfSFBfREVQT1BfTU9ERTFfRU4JCSgxIDw8ICA4KQorI2RlZmluZSBBTEM1NjIzX01JU0NfQVVYT1VUX0RFUE9QX01PREUzX0VOCSgxIDw8ICA2KQorI2RlZmluZSBBTEM1NjIzX01JU0NfQVVYT1VUX0RFUE9QX01PREUyX0VOCSgxIDw8ICA1KQorI2RlZmluZSBBTEM1NjIzX01JU0NfQVVYT1VUX0RFUE9QX01PREUxX0VOCSgxIDw8ICA0KQorI2RlZmluZSBBTEM1NjIzX01JU0NfTV9EQUNfTF9JTlBVVAkJKDEgPDwgIDMpCisjZGVmaW5lIEFMQzU2MjNfTUlTQ19NX0RBQ19SX0lOUFVUCQkoMSA8PCAgMikKKyNkZWZpbmUgQUxDNTYyM19NSVNDX0lSUU9VVF9JTlZfQ1RSTAkJKDEgPDwgIDApCisKKyNkZWZpbmUJQUxDNTYyM19QU0VEVUVPX1NQQVRJQUxfQ1RSTAkJMHg2MAorI2RlZmluZSBBTEM1NjIzX0VRX0NUUkwJCQkJMHg2MgorI2RlZmluZSBBTEM1NjIzX0VRX01PREVfRU5BQkxFCQkJMHg2NgorI2RlZmluZSBBTEM1NjIzX0FWQ19DVFJMCQkJMHg2OAorI2RlZmluZSBBTEM1NjIzX0hJRF9DVFJMX0lOREVYCQkJMHg2QQorI2RlZmluZSBBTEM1NjIzX0hJRF9DVFJMX0RBVEEJCQkweDZDCisjZGVmaW5lIEFMQzU2MjNfVkVORE9SX0lEMQkJCTB4N0MKKyNkZWZpbmUgQUxDNTYyM19WRU5ET1JfSUQyCQkJMHg3RQorCisjZGVmaW5lIEFMQzU2MjNfUExMX0ZSX01DTEsJCQkwCisjZGVmaW5lIEFMQzU2MjNfUExMX0ZSX0JDSwkJCTEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKaW5kZXggODIzNjQzOS4uNDZkYmZkMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCkBAIC0zNiw4ICszNiw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG0zNjUuaD4KQEAgLTExNiw3ICsxMTQsNyBAQAogCQkJICAgICBEQVZJTkNJX1ZDX1JFRzEyX1BPV0VSX0FMTF9PRkYpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IDZkNGJkYzYuLjhiNTEyNDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtMTA2LDYgKzEwNiwyMSBAQAogI2RlZmluZSBDUzQyNzBfTVVURV9EQUNfQQkweDAxCiAjZGVmaW5lIENTNDI3MF9NVVRFX0RBQ19CCTB4MDIKIAorLyogUG93ZXItb24gZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSByZWdpc3RlcnMKKyAqCisgKiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBwb3dlci1vbiBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzLCB3aXRoIHRoZQorICogZXhjZXB0aW9uIG9mIHRoZSAiQ0hJUElEIiByZWdpc3RlciAoMDFoKS4gIFRoZSBsb3dlciBmb3VyIGJpdHMgb2YgdGhhdAorICogcmVnaXN0ZXIgY29udGFpbiB0aGUgaGFyZHdhcmUgcmV2aXNpb24sIHNvIGl0IGlzIHRyZWF0ZWQgYXMgdm9sYXRpbGUuCisgKgorICogQWxzbyBub3RlIHRoYXQgb24gdGhlIENTNDI3MCwgdGhlIGZpcnN0IHJlYWRhYmxlIHJlZ2lzdGVyIGlzIDEsIGJ1dCBBU29DCisgKiBhc3N1bWVzIHRoZSBmaXJzdCByZWdpc3RlciBpcyAwLiAgVGhlcmZvcmUsIHRoZSBhcnJheSBtdXN0IGhhdmUgYW4gZW50cnkgZm9yCisgKiByZWdpc3RlciAwLCBidXQgd2UgdXNlIGNzNDI3MF9yZWdfaXNfcmVhZGFibGUoKSB0byB0ZWxsIEFTb0MgdGhhdCBpdCBjYW4ndAorICogYmUgcmVhZC4KKyAqLworc3RhdGljIGNvbnN0IHU4IGNzNDI3MF9kZWZhdWx0X3JlZ19jYWNoZVtDUzQyNzBfTEFTVFJFRyArIDFdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4NjAsIDB4MjAsIDB4MDAsIDB4MDAKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICpzdXBwbHlfbmFtZXNbXSA9IHsKIAkidmEiLCAidmQiLCAidmxjIgogfTsKQEAgLTExNCw3ICsxMjksNiBAQAogc3RydWN0IGNzNDI3MF9wcml2YXRlIHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKIAl2b2lkICpjb250cm9sX2RhdGE7Ci0JdTggcmVnX2NhY2hlW0NTNDI3MF9OVU1SRUdTXTsKIAl1bnNpZ25lZCBpbnQgbWNsazsgLyogSW5wdXQgZnJlcXVlbmN5IG9mIHRoZSBNQ0xLIHBpbiAqLwogCXVuc2lnbmVkIGludCBtb2RlOyAvKiBUaGUgbW9kZSAoSTJTIG9yIGxlZnQtanVzdGlmaWVkKSAqLwogCXVuc2lnbmVkIGludCBzbGF2ZV9tb2RlOwpAQCAtMTc5LDYgKzE5MywyMCBAQAogLyogVGhlIG51bWJlciBvZiBNQ0xLL0xSQ0sgcmF0aW9zIHN1cHBvcnRlZCBieSB0aGUgQ1M0MjcwICovCiAjZGVmaW5lIE5VTV9NQ0xLX1JBVElPUwkJQVJSQVlfU0laRShjczQyNzBfbW9kZV9yYXRpb3MpCiAKK3N0YXRpYyBpbnQgY3M0MjcwX3JlZ19pc19yZWFkYWJsZSh1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiAocmVnID49IENTNDI3MF9GSVJTVFJFRykgJiYgKHJlZyA8PSBDUzQyNzBfTEFTVFJFRyk7Cit9CisKK3N0YXRpYyBpbnQgY3M0MjcwX3JlZ19pc192b2xhdGlsZSh1bnNpZ25lZCBpbnQgcmVnKQoreworCS8qIFVucmVhZGFibGUgcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkIHZvbGF0aWxlICovCisJaWYgKChyZWcgPCBDUzQyNzBfRklSU1RSRUcpIHx8IChyZWcgPiBDUzQyNzBfTEFTVFJFRykpCisJCXJldHVybiAxOworCisJcmV0dXJuIHJlZyA9PSBDUzQyNzBfQ0hJUElEOworfQorCiAvKioKICAqIGNzNDI3MF9zZXRfZGFpX3N5c2NsayAtIGRldGVybWluZSB0aGUgQ1M0MjcwIHNhbXBsZXMgcmF0ZXMuCiAgKiBAY29kZWNfZGFpOiB0aGUgY29kZWMgREFJCkBAIC0yNjQsOTcgKzI5Miw2IEBACiB9CiAKIC8qKgotICogY3M0MjcwX2ZpbGxfY2FjaGUgLSBwcmUtZmlsbCB0aGUgQ1M0MjcwIHJlZ2lzdGVyIGNhY2hlLgotICogQGNvZGVjOiB0aGUgY29kZWMgZm9yIHRoaXMgQ1M0MjcwCi0gKgotICogVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgQ1M0MjcwIHJlZ2lzdGVyIGNhY2hlIGJ5IHJlYWRpbmcgdGhlIHJlZ2lzdGVyCi0gKiB2YWx1ZXMgZnJvbSB0aGUgaGFyZHdhcmUuCi0gKgotICogVGhpcyBDUzQyNzAgcmVnaXN0ZXJzIGFyZSBjYWNoZWQgdG8gYXZvaWQgZXhjZXNzaXZlIEkyQyBJL08gb3BlcmF0aW9ucy4KLSAqIEFmdGVyIHRoZSBpbml0aWFsIHJlYWQgdG8gcHJlLWZpbGwgdGhlIGNhY2hlLCB0aGUgQ1M0MjcwIG5ldmVyIHVwZGF0ZXMKLSAqIHRoZSByZWdpc3RlciB2YWx1ZXMsIHNvIHdlIHdvbid0IGhhdmUgYSBjYWNoZSBjb2hlcmVuY3kgcHJvYmxlbS4KLSAqCi0gKiBXZSB1c2UgdGhlIGF1dG8taW5jcmVtZW50IGZlYXR1cmUgb2YgdGhlIENTNDI3MCB0byByZWFkIGFsbCByZWdpc3RlcnMgaW4KLSAqIG9uZSBzaG90LgotICovCi1zdGF0aWMgaW50IGNzNDI3MF9maWxsX2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKLQlzMzIgbGVuZ3RoOwotCi0JbGVuZ3RoID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoaTJjX2NsaWVudCwKLQkJQ1M0MjcwX0ZJUlNUUkVHIHwgQ1M0MjcwX0kyQ19JTkNSLCBDUzQyNzBfTlVNUkVHUywgY2FjaGUpOwotCi0JaWYgKGxlbmd0aCAhPSBDUzQyNzBfTlVNUkVHUykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJpMmMgcmVhZCBmYWlsdXJlLCBhZGRyPTB4JXhcbiIsCi0JCSAgICAgICBpMmNfY2xpZW50LT5hZGRyKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogY3M0MjcwX3JlYWRfcmVnX2NhY2hlIC0gcmVhZCBmcm9tIHRoZSBDUzQyNzAgcmVnaXN0ZXIgY2FjaGUuCi0gKiBAY29kZWM6IHRoZSBjb2RlYyBmb3IgdGhpcyBDUzQyNzAKLSAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiByZWdpc3Rlci4gIEl0IHJlYWRzIG9ubHkgZnJvbQotICogdGhlIHJlZ2lzdGVyIGNhY2hlLCBub3QgdGhlIGhhcmR3YXJlIGl0c2VsZi4KLSAqCi0gKiBUaGlzIENTNDI3MCByZWdpc3RlcnMgYXJlIGNhY2hlZCB0byBhdm9pZCBleGNlc3NpdmUgSTJDIEkvTyBvcGVyYXRpb25zLgotICogQWZ0ZXIgdGhlIGluaXRpYWwgcmVhZCB0byBwcmUtZmlsbCB0aGUgY2FjaGUsIHRoZSBDUzQyNzAgbmV2ZXIgdXBkYXRlcwotICogdGhlIHJlZ2lzdGVyIHZhbHVlcywgc28gd2Ugd29uJ3QgaGF2ZSBhIGNhY2hlIGNvaGVyZW5jeSBwcm9ibGVtLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzNDI3MF9yZWFkX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JdW5zaWduZWQgaW50IHJlZykKLXsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwotCi0JaWYgKChyZWcgPCBDUzQyNzBfRklSU1RSRUcpIHx8IChyZWcgPiBDUzQyNzBfTEFTVFJFRykpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIGNhY2hlW3JlZyAtIENTNDI3MF9GSVJTVFJFR107Ci19Ci0KLS8qKgotICogY3M0MjcwX2kyY193cml0ZSAtIHdyaXRlIHRvIGEgQ1M0MjcwIHJlZ2lzdGVyIHZpYSB0aGUgSTJDIGJ1cy4KLSAqIEBjb2RlYzogdGhlIGNvZGVjIGZvciB0aGlzIENTNDI3MAotICogQHJlZzogdGhlIHJlZ2lzdGVyIHRvIHdyaXRlCi0gKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGdpdmVuIENTNDI3MCByZWdpc3RlciwgYW5kCi0gKiBhbHNvIHVwZGF0ZXMgdGhlIHJlZ2lzdGVyIGNhY2hlLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIGh3X3dyaXRlIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc25kX3NvY19jb2RlYy4KLSAqIFRoYXQncyBiZWNhdXNlIGl0J3MgdG9vIGNsdW5reTogdGhlIGh3X3dyaXRlX3QgcHJvdG90eXBlIGRvZXMgbm90IG1hdGNoCi0gKiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKCksIGFuZCBpdCdzIGp1c3QgYW5vdGhlciBsYXllciBvZiBvdmVyaGVhZC4KLSAqLwotc3RhdGljIGludCBjczQyNzBfaTJjX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKLQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JdTggKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKLQotCWlmICgocmVnIDwgQ1M0MjcwX0ZJUlNUUkVHKSB8fCAocmVnID4gQ1M0MjcwX0xBU1RSRUcpKQotCQlyZXR1cm4gLUVJTzsKLQotCS8qIE9ubHkgcGVyZm9ybSBhbiBJMkMgb3BlcmF0aW9uIGlmIHRoZSBuZXcgdmFsdWUgaXMgZGlmZmVyZW50ICovCi0JaWYgKGNhY2hlW3JlZyAtIENTNDI3MF9GSVJTVFJFR10gIT0gdmFsdWUpIHsKLQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNvZGVjLT5jb250cm9sX2RhdGE7Ci0JCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgImkyYyB3cml0ZSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQkvKiBXZSd2ZSB3cml0dGVuIHRvIHRoZSBoYXJkd2FyZSwgc28gdXBkYXRlIHRoZSBjYWNoZSAqLwotCQljYWNoZVtyZWcgLSBDUzQyNzBfRklSU1RSRUddID0gdmFsdWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogY3M0MjcwX2h3X3BhcmFtcyAtIHByb2dyYW0gdGhlIENTNDI3MCB3aXRoIHRoZSBnaXZlbiBoYXJkd2FyZSBwYXJhbWV0ZXJzLgogICogQHN1YnN0cmVhbTogdGhlIGF1ZGlvIHN0cmVhbQogICogQHBhcmFtczogdGhlIGhhcmR3YXJlIHBhcmFtZXRlcnMgdG8gc2V0CkBAIC01NTEsMTUgKzQ4OCwxNiBAQAogc3RhdGljIGludCBjczQyNzBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjczQyNzBfcHJpdmF0ZSAqY3M0MjcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGksIHJldCwgcmVnOworCWludCBpLCByZXQ7CiAKIAljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0MjcwLT5jb250cm9sX2RhdGE7CiAKLQkvKiBUaGUgSTJDIGludGVyZmFjZSBpcyBzZXQgdXAsIHNvIHByZS1maWxsIG91ciByZWdpc3RlciBjYWNoZSAqLwotCi0JcmV0ID0gY3M0MjcwX2ZpbGxfY2FjaGUoY29kZWMpOworCS8qIFRlbGwgQVNvQyB3aGF0IGtpbmQgb2YgSS9PIHRvIHVzZSB0byByZWFkIHRoZSByZWdpc3RlcnMuICBBU29DIHdpbGwKKwkgKiB0aGVuIGRvIHRoZSBJMkMgdHJhbnNhY3Rpb25zIGl0c2VsZi4KKwkgKi8KKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgOCwgOCwgY3M0MjcwLT5jb250cm9sX3R5cGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgImZhaWxlZCB0byBmaWxsIHJlZ2lzdGVyIGNhY2hlXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjYWNoZSBJL08gKHJldD0laSlcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01NjgsMTAgKzUwNiw3IEBACiAJICogdGhpcyBmZWF0dXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBBbiBhcHBsaWNhdGlvbiAoZS5nLiBhbHNhY3RsKSBjYW4KIAkgKiByZS1lbmFibGVkIGl0IGJ5IHVzaW5nIHRoZSBjb250cm9scy4KIAkgKi8KLQotCXJlZyA9IGNzNDI3MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgQ1M0MjcwX01VVEUpOwotCXJlZyAmPSB+Q1M0MjcwX01VVEVfQVVUTzsKLQlyZXQgPSBjczQyNzBfaTJjX3dyaXRlKGNvZGVjLCBDUzQyNzBfTVVURSwgcmVnKTsKKwlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBDUzQyNzBfTVVURSwgQ1M0MjcwX01VVEVfQVVUTywgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiaTJjIHdyaXRlIGZhaWxlZFxuIik7CiAJCXJldHVybiByZXQ7CkBAIC01ODIsMTAgKzUxNyw4IEBACiAJICogcGxheWJhY2sgaGFzIHN0YXJ0ZWQuICBBbiBhcHBsaWNhdGlvbiAoZS5nLiBhbHNhY3RsKSBjYW4KIAkgKiByZS1lbmFibGVkIGl0IGJ5IHVzaW5nIHRoZSBjb250cm9scy4KIAkgKi8KLQotCXJlZyA9IGNzNDI3MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgQ1M0MjcwX1RSQU5TKTsKLQlyZWcgJj0gfihDUzQyNzBfVFJBTlNfU09GVCB8IENTNDI3MF9UUkFOU19aRVJPKTsKLQlyZXQgPSBjczQyNzBfaTJjX3dyaXRlKGNvZGVjLCBDUzQyNzBfVFJBTlMsIHJlZyk7CisJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQ1M0MjcwX1RSQU5TLAorCQlDUzQyNzBfVFJBTlNfU09GVCB8IENTNDI3MF9UUkFOU19aRVJPLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJpMmMgd3JpdGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTcwOCwxNSArNjQxLDE2IEBACiAgKiBBc3NpZ24gdGhpcyB2YXJpYWJsZSB0byB0aGUgY29kZWNfZGV2IGZpZWxkIG9mIHRoZSBtYWNoaW5lIGRyaXZlcidzCiAgKiBzbmRfc29jX2RldmljZSBzdHJ1Y3R1cmUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQyNzAgPSB7Ci0JLnByb2JlID0JY3M0MjcwX3Byb2JlLAotCS5yZW1vdmUgPQljczQyNzBfcmVtb3ZlLAotCS5zdXNwZW5kID0JY3M0MjcwX3NvY19zdXNwZW5kLAotCS5yZXN1bWUgPQljczQyNzBfc29jX3Jlc3VtZSwKLQkucmVhZCA9IGNzNDI3MF9yZWFkX3JlZ19jYWNoZSwKLQkud3JpdGUgPSBjczQyNzBfaTJjX3dyaXRlLAotCS5yZWdfY2FjaGVfc2l6ZSA9IENTNDI3MF9OVU1SRUdTLAotCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQyNzAgPSB7CisJLnByb2JlID0JCWNzNDI3MF9wcm9iZSwKKwkucmVtb3ZlID0JCWNzNDI3MF9yZW1vdmUsCisJLnN1c3BlbmQgPQkJY3M0MjcwX3NvY19zdXNwZW5kLAorCS5yZXN1bWUgPQkJY3M0MjcwX3NvY19yZXN1bWUsCisJLnZvbGF0aWxlX3JlZ2lzdGVyID0JY3M0MjcwX3JlZ19pc192b2xhdGlsZSwKKwkucmVhZGFibGVfcmVnaXN0ZXIgPQljczQyNzBfcmVnX2lzX3JlYWRhYmxlLAorCS5yZWdfY2FjaGVfc2l6ZSA9CUNTNDI3MF9MQVNUUkVHICsgMSwKKwkucmVnX3dvcmRfc2l6ZSA9CXNpemVvZih1OCksCisJLnJlZ19jYWNoZV9kZWZhdWx0ID0JY3M0MjcwX2RlZmF1bHRfcmVnX2NhY2hlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCmluZGV4IGNiMDg2ZWEuLjhmYjcwNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CkBAIC00Nyw3ICs0Niw2IEBACiAJdW5zaWduZWQgaW50IG1jbGs7CiAJdW5zaWduZWQgaW50IGF1ZGlvX21vZGU7CS8qIFRoZSBtb2RlIChJMlMgb3IgbGVmdC1qdXN0aWZpZWQpICovCiAJZW51bSBtYXN0ZXJfc2xhdmVfbW9kZSBmdW5jOwotCXU4IHJlZ19jYWNoZVtDUzQyTDUxX05VTVJFR1NdOwogfTsKIAogI2RlZmluZSBDUzQyTDUxX0ZPUk1BVFMgKCBcCkBAIC01MTksNiArNTE3LDcgQEAKIHN0YXRpYyBpbnQgY3M0Mmw1MV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGNzNDJsNTFfcHJpdmF0ZSAqY3M0Mmw1MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0LCByZWc7CiAKIAljb2RlYy0+Y29udHJvbF9kYXRhID0gY3M0Mmw1MS0+Y29udHJvbF9kYXRhOwpAQCAtNTUwLDkgKzU0OSw5IEBACiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgY3M0Mmw1MV9zbmRfY29udHJvbHMsCiAJCUFSUkFZX1NJWkUoY3M0Mmw1MV9zbmRfY29udHJvbHMpKTsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBjczQybDUxX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGNzNDJsNTFfZGFwbV93aWRnZXRzLAogCQlBUlJBWV9TSVpFKGNzNDJsNTFfZGFwbV93aWRnZXRzKSk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGNzNDJsNTFfcm91dGVzLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNzNDJsNTFfcm91dGVzLAogCQlBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKaW5kZXggZThkMjdjOC4uMDNkMWU4NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2luY2x1ZGUgImN4MjA0NDIuaCIKIApAQCAtMjYsNyArMjYsNiBAQAogc3RydWN0IGN4MjA0NDJfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdm9pZCAqY29udHJvbF9kYXRhOwotCXU4IHJlZ19jYWNoZVsxXTsKIH07CiAKICNkZWZpbmUgQ1gyMDQ0Ml9QTQkJMHgwCkBAIC04OSwxMCArODgsMTEgQEAKIAogc3RhdGljIGludCBjeDIwNDQyX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBjeDIwNDQyX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUoY3gyMDQ0Ml9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgY3gyMDQ0Ml9hdWRpb19tYXAsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBjeDIwNDQyX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUoY3gyMDQ0Ml9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBjeDIwNDQyX2F1ZGlvX21hcCwKIAkJCQlBUlJBWV9TSVpFKGN4MjA0NDJfYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCS8qIFByZXZlbnQgdGhlIGNvZGVjIGRyaXZlciBmcm9tIGZ1cnRoZXIgYWNjZXNzaW5nIHRoZSBtb2RlbSAqLwogCWNvZGVjLT5od193cml0ZSA9IE5VTEw7CiAJY3gyMDQ0Mi0+Y29udHJvbF9kYXRhID0gTlVMTDsKLQljb2RlYy0+cG9wX3RpbWUgPSAwOworCWNvZGVjLT5jYXJkLT5wb3BfdGltZSA9IDA7CiB9CiAKIC8qIExpbmUgZGlzY2lwbGluZSAuaGFuZ3VwKCkgKi8KQEAgLTI5MSw3ICsyOTEsNyBAQAogCQkvKiBTZXQgdXAgY29kZWMgZHJpdmVyIGFjY2VzcyB0byBtb2RlbSBjb250cm9scyAqLwogCQljeDIwNDQyLT5jb250cm9sX2RhdGEgPSB0dHk7CiAJCWNvZGVjLT5od193cml0ZSA9IChod193cml0ZV90KXR0eS0+b3BzLT53cml0ZTsKLQkJY29kZWMtPnBvcF90aW1lID0gMTsKKwkJY29kZWMtPmNhcmQtPnBvcF90aW1lID0gMTsKIAl9CiB9CiAKQEAgLTM0OCw3ICszNDgsNyBAQAogCiAJY3gyMDQ0Mi0+Y29udHJvbF9kYXRhID0gTlVMTDsKIAljb2RlYy0+aHdfd3JpdGUgPSBOVUxMOwotCWNvZGVjLT5wb3BfdGltZSA9IDA7CisJY29kZWMtPmNhcmQtPnBvcF90aW1lID0gMDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKaW5kZXggNThiYjliOS4uOTJmZDlkNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kbWljLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2U5ZGFjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9kbWljLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGRtaWMuYyAgLS0gIFNvQyBhdWRpbyBmb3IgR2VuZXJpYyBEaWdpdGFsIE1JQ3MKKyAqCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBkbWljX2RhaSA9IHsKKwkubmFtZSA9ICJkbWljLWhpZmkiLAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gOCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRQorCQkJfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRQorCQkJfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfZG1pYyA9IHt9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkbWljX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsCisJCQkmc29jX2RtaWMsICZkbWljX2RhaSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRtaWNfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkbWljLWNvZGVjIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRtaWNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImRtaWMtY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGRtaWNfZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkbWljX2Rldl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZG1pY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZG1pY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZG1pY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGRtaWNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkbWljX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkbWljX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgRE1JQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jIGIvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYwppbmRleCAxNjI1M2VjLi5mN2NkMzQ2ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCiAjZGVmaW5lIEpaNDc0MF9SRUdfQ09ERUNfMSAweDAKQEAgLTI2Niw3ICsyNjUsNyBAQAogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQkvKiBUaGUgb25seSB3YXkgdG8gY2xlYXIgdGhlIHN1c3BlbmQgZmxhZyBpcyB0byByZXNldCB0aGUgY29kZWMgKi8KLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCiAJCQlqejQ3NDBfY29kZWNfd2FrZXVwKGNvZGVjKTsKIAogCQltYXNrID0gSlo0NzQwX0NPREVDXzFfVlJFRl9ESVNBQkxFIHwKQEAgLTI4OCwyMyArMjg3LDI1IEBACiAJCWJyZWFrOwogCX0KIAotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgano0NzQwX2NvZGVjX2Rldl9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgSlo0NzQwX1JFR19DT0RFQ18xLAogCQkJSlo0NzQwX0NPREVDXzFfU1cyX0VOQUJMRSwgSlo0NzQwX0NPREVDXzFfU1cyX0VOQUJMRSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgano0NzQwX2NvZGVjX2NvbnRyb2xzLAogCQlBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19jb250cm9scykpOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgano0NzQwX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGp6NDc0MF9jb2RlY19kYXBtX3dpZGdldHMsCiAJCUFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGp6NDc0MF9jb2RlY19kYXBtX3JvdXRlcywKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMsCiAJCUFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2RhcG1fcm91dGVzKSk7CiAKIAlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCmluZGV4IDY0NDdkYmIuLjg5NDk4ZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTIyOSwxNSArMTIyOCwxNyBAQAogCiBzdGF0aWMgaW50IG1heDk4MDg4X2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLSAgICAgICBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBtYXg5ODA4OF9kYXBtX3dpZGdldHMsCisgICAgICAgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisgICAgICAgc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtYXg5ODA4OF9kYXBtX3dpZGdldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKG1heDk4MDg4X2RhcG1fd2lkZ2V0cykpOwogCi0gICAgICAgc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKyAgICAgICBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKICAgICAgICBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgbWF4OTgwODhfc25kX2NvbnRyb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUobWF4OTgwODhfc25kX2NvbnRyb2xzKSk7CiAKLSAgICAgICBzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworICAgICAgIHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhkYXBtKTsKICAgICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTYyMiw3ICsxNjIzLDcgQEAKICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLSAgICAgICAgICAgICAgIGlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorICAgICAgICAgICAgICAgaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OTgwODhfc3luY19jYWNoZShjb2RlYyk7CiAKICAgICAgICAgICAgICAgIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE05ODA4OF9SRUdfNENfUFdSX0VOX0lOLApAQCAtMTYzNSw3ICsxNjM2LDcgQEAKICAgICAgICAgICAgICAgIGNvZGVjLT5jYWNoZV9zeW5jID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KLSAgICAgICBjb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworICAgICAgIGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKICAgICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTk1Nyw3ICsxOTU4LDcgQEAKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogCi0gICAgICAgLyogaW5pdGFsaXplIHByaXZhdGUgZGF0YSAqLworICAgICAgIC8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCiAKICAgICAgICBtYXg5ODA4OC0+c3lzY2xrID0gKHVuc2lnbmVkKS0xOwogICAgICAgIG1heDk4MDg4LT5lcV90ZXh0Y250ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKaW5kZXggNmYzOGQ2MS4uMjcyN2JlZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKICNpbmNsdWRlICJzc20yNjAyLmgiCkBAIC0yMDcsMTAgKzIwNiwxMSBAQAogCiBzdGF0aWMgaW50IHNzbTI2MDJfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHNzbTI2MDJfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShzc20yNjAyX2RhcG1fd2lkZ2V0cykpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19jb25uLCBBUlJBWV9TSVpFKGF1ZGlvX2Nvbm4pKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHNzbTI2MDJfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRShzc20yNjAyX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX2Nvbm4sIEFSUkFZX1NJWkUoYXVkaW9fY29ubikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTMsNyArNDkzLDcgQEAKIAkJYnJlYWs7CiAKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwppbmRleCAwNjFmOWU1Li43OGIyYjUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkJc3RhYzk3NjZfYWM5N193cml0ZShjb2RlYywgQUM5N19QT1dFUkRPV04sIDB4ZmZmZik7CiAJCWJyZWFrOwogCX0KLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IGU4NjUyYjEuLjU0YTMwZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTM5MSwxMSArMzkwLDEyIEBACiAKIHN0YXRpYyBpbnQgdGx2MzIwYWljMjNfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cykpOwogCS8qIHNldCB1cCBhdWRpbyBwYXRoIGludGVyY29ubmVjdHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzQsNyArNTc0LDcgQEAKIAkJdGx2MzIwYWljMjNfd3JpdGUoY29kZWMsIFRMVjMyMEFJQzIzX1BXUiwgMHhmZmZmKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKaW5kZXggNmI3ZDcxZS4uZTJhNzYwOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgInRsdjMyMGFpYzI2LmgiCkBAIC0zMSw3ICszMCw2IEBACiBzdHJ1Y3QgYWljMjYgewogCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgY29kZWM7Ci0JdTE2IHJlZ19jYWNoZVtBSUMyNl9OVU1fUkVHU107CS8qIHNoYWRvdyByZWdpc3RlcnMgKi8KIAlpbnQgbWFzdGVyOwogCWludCBkYXRmbTsKIAlpbnQgbWNsazsKQEAgLTM1NSw3ICszNTMsNiBAQAogICovCiBzdGF0aWMgaW50IGFpYzI2X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3QgYWljMjYgKmFpYzI2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCwgZXJyLCBpLCByZWc7CiAKIAlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiUHJvYmluZyBBSUMyNiBTb0MgQ09ERUMgZHJpdmVyXG4iKTsKQEAgLTM3Myw3ICszNzAsNyBAQAogCWFpYzI2X3JlZ193cml0ZShjb2RlYywgQUlDMjZfUkVHX0FVRElPX0NUUkwzLCByZWcpOwogCiAJLyogRmlsbCByZWdpc3RlciBjYWNoZSAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFpYzI2LT5yZWdfY2FjaGUpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplOyBpKyspCiAJCWFpYzI2X3JlZ19yZWFkKGNvZGVjLCBpKTsKIAogCS8qIFJlZ2lzdGVyIHRoZSBzeXNmcyBmaWxlcyBmb3IgZGVidWdnaW5nICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKaW5kZXggNzdiOGY5YS4uM2JlZGFiMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYzMjBhaWMzeC5oPgpAQCAtNjEsNiArNjAsOCBAQAogCSJEUlZERCIsCS8qIEFEQyBBbmFsb2cgYW5kIE91dHB1dCBEcml2ZXIgVm9sdGFnZSAqLwogfTsKIAorc3RhdGljIExJU1RfSEVBRChyZXNldF9saXN0KTsKKwogc3RydWN0IGFpYzN4X3ByaXY7CiAKIHN0cnVjdCBhaWMzeF9kaXNhYmxlX25iIHsKQEAgLTc3LDYgKzc4LDcgQEAKIAlzdHJ1Y3QgYWljM3hfc2V0dXBfZGF0YSAqc2V0dXA7CiAJdm9pZCAqY29udHJvbF9kYXRhOwogCXVuc2lnbmVkIGludCBzeXNjbGs7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCBtYXN0ZXI7CiAJaW50IGdwaW9fcmVzZXQ7CiAJaW50IHBvd2VyOwpAQCAtMTgzLDcgKzE4NSw3IEBACiAKIAlpZiAoc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkgewogCQkvKiBmaW5kIGRhcG0gd2lkZ2V0IHBhdGggYXNzb2Mgd2l0aCBrY29udHJvbCAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhdGgsICZ3aWRnZXQtPmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+ZGFwbS0+Y2FyZC0+cGF0aHMsIGxpc3QpIHsKIAkJCWlmIChwYXRoLT5rY29udHJvbCAhPSBrY29udHJvbCkKIAkJCQljb250aW51ZTsKIApAQCAtMTk5LDcgKzIwMSw3IEBACiAJCX0KIAogCQlpZiAoZm91bmQpCi0JCQlzbmRfc29jX2RhcG1fc3luYyh3aWRnZXQtPmNvZGVjKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKHdpZGdldC0+ZGFwbSk7CiAJfQogCiAJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOwpAQCAtNzg4LDE3ICs3OTAsMTkgQEAKIHN0YXRpYyBpbnQgYWljM3hfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhaWMzeF9wcml2ICphaWMzeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIGFpYzN4X2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFpYzN4X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBzZXQgdXAgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCWlmIChhaWMzeC0+bW9kZWwgPT0gQUlDM1hfTU9ERUxfMzAwNykgewotCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBhaWMzMDA3X2RhcG1fd2lkZ2V0cywKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzMDA3X2RhcG1fd2lkZ2V0cywKIAkJCUFSUkFZX1NJWkUoYWljMzAwN19kYXBtX3dpZGdldHMpKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uXzMwMDcsIEFSUkFZX1NJWkUoaW50ZXJjb25fMzAwNykpOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbl8zMDA3LAorCQkJCQlBUlJBWV9TSVpFKGludGVyY29uXzMwMDcpKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwNzUsNyArMTA3OSw3IEBACiAJCSAqIFB1dCBjb2RlYyB0byByZXNldCBhbmQgcmVxdWlyZSBjYWNoZSBzeW5jIGFzIGF0IGxlYXN0IG9uZQogCQkgKiBvZiB0aGUgc3VwcGxpZXMgd2FzIGRpc2FibGVkCiAJCSAqLwotCQlpZiAoYWljM3gtPmdwaW9fcmVzZXQgPj0gMCkKKwkJaWYgKGdwaW9faXNfdmFsaWQoYWljM3gtPmdwaW9fcmVzZXQpKQogCQkJZ3Bpb19zZXRfdmFsdWUoYWljM3gtPmdwaW9fcmVzZXQsIDApOwogCQlhaWMzeC0+Y29kZWMtPmNhY2hlX3N5bmMgPSAxOwogCX0KQEAgLTExMDIsNyArMTEwNiw3IEBACiAJCWlmICghY29kZWMtPmNhY2hlX3N5bmMpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoYWljM3gtPmdwaW9fcmVzZXQgPj0gMCkgeworCQlpZiAoZ3Bpb19pc192YWxpZChhaWMzeC0+Z3Bpb19yZXNldCkpIHsKIAkJCXVkZWxheSgxKTsKIAkJCWdwaW9fc2V0X3ZhbHVlKGFpYzN4LT5ncGlvX3Jlc2V0LCAxKTsKIAkJfQpAQCAtMTEzNSw3ICsxMTM5LDcgQEAKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZICYmCisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZICYmCiAJCSAgICBhaWMzeC0+bWFzdGVyKSB7CiAJCQkvKiBlbmFibGUgcGxsICovCiAJCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIEFJQzNYX1BMTF9QUk9HQV9SRUcpOwpAQCAtMTE0Niw3ICsxMTUwLDcgQEAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQlpZiAoIWFpYzN4LT5wb3dlcikKIAkJCWFpYzN4X3NldF9wb3dlcihjb2RlYywgMSk7Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfUFJFUEFSRSAmJgorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfUFJFUEFSRSAmJgogCQkgICAgYWljM3gtPm1hc3RlcikgewogCQkJLyogZGlzYWJsZSBwbGwgKi8KIAkJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgQUlDM1hfUExMX1BST0dBX1JFRyk7CkBAIC0xMTU5LDcgKzExNjMsNyBAQAogCQkJYWljM3hfc2V0X3Bvd2VyKGNvZGVjLCAwKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzQ0LDE0ICsxMzQ4LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sIGFpYzN4X2lzX3NoYXJlZF9yZXNldChzdHJ1Y3QgYWljM3hfcHJpdiAqYWljM3gpCit7CisJc3RydWN0IGFpYzN4X3ByaXYgKmE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZyZXNldF9saXN0LCBsaXN0KSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKGFpYzN4LT5ncGlvX3Jlc2V0KSAmJgorCQkgICAgYWljM3gtPmdwaW9fcmVzZXQgPT0gYS0+Z3Bpb19yZXNldCkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGludCBhaWMzeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IGFpYzN4X3ByaXYgKmFpYzN4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCwgaTsKIAorCUlOSVRfTElTVF9IRUFEKCZhaWMzeC0+bGlzdCk7CiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGFpYzN4LT5jb250cm9sX2RhdGE7CiAJYWljM3gtPmNvZGVjID0gY29kZWM7Ci0JY29kZWMtPmlkbGVfYmlhc19vZmYgPSAxOworCWNvZGVjLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIGFpYzN4LT5jb250cm9sX3R5cGUpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMTM1OSw3ICsxMzc3LDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoYWljM3gtPmdwaW9fcmVzZXQgPj0gMCkgeworCWlmIChncGlvX2lzX3ZhbGlkKGFpYzN4LT5ncGlvX3Jlc2V0KSAmJgorCSAgICAhYWljM3hfaXNfc2hhcmVkX3Jlc2V0KGFpYzN4KSkgewogCQlyZXQgPSBncGlvX3JlcXVlc3QoYWljM3gtPmdwaW9fcmVzZXQsICJ0bHYzMjBhaWMzeCByZXNldCIpOwogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIGVycl9ncGlvOwpAQCAtMTQwNSw2ICsxNDI0LDcgQEAKIAkJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsICZhaWMzeF9jbGFzc2RfYW1wX2dhaW5fY3RybCwgMSk7CiAKIAlhaWMzeF9hZGRfd2lkZ2V0cyhjb2RlYyk7CisJbGlzdF9hZGQoJmFpYzN4LT5saXN0LCAmcmVzZXRfbGlzdCk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTQxNCwxMCArMTQzNCwxMCBAQAogCQkJCQkgICAgICAmYWljM3gtPmRpc2FibGVfbmJbaV0ubmIpOwogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRShhaWMzeC0+c3VwcGxpZXMpLCBhaWMzeC0+c3VwcGxpZXMpOwogZXJyX2dldDoKLQlpZiAoYWljM3gtPmdwaW9fcmVzZXQgPj0gMCkKKwlpZiAoZ3Bpb19pc192YWxpZChhaWMzeC0+Z3Bpb19yZXNldCkgJiYKKwkgICAgIWFpYzN4X2lzX3NoYXJlZF9yZXNldChhaWMzeCkpCiAJCWdwaW9fZnJlZShhaWMzeC0+Z3Bpb19yZXNldCk7CiBlcnJfZ3BpbzoKLQlrZnJlZShhaWMzeCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQyNyw3ICsxNDQ3LDkgQEAKIAlpbnQgaTsKIAogCWFpYzN4X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQlpZiAoYWljM3gtPmdwaW9fcmVzZXQgPj0gMCkgeworCWxpc3RfZGVsKCZhaWMzeC0+bGlzdCk7CisJaWYgKGdwaW9faXNfdmFsaWQoYWljM3gtPmdwaW9fcmVzZXQpICYmCisJICAgICFhaWMzeF9pc19zaGFyZWRfcmVzZXQoYWljM3gpKSB7CiAJCWdwaW9fc2V0X3ZhbHVlKGFpYzN4LT5ncGlvX3Jlc2V0LCAwKTsKIAkJZ3Bpb19mcmVlKGFpYzN4LT5ncGlvX3Jlc2V0KTsKIAl9CkBAIC0xNTIzLDIxICsxNTQ1LDYgQEAKIAkucmVtb3ZlID0gYWljM3hfaTJjX3JlbW92ZSwKIAkuaWRfdGFibGUgPSBhaWMzeF9pMmNfaWQsCiB9OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWljM3hfaTJjX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTJjX2FkZF9kcml2ZXIoJmFpYzN4X2kyY19kcml2ZXIpOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yIHJlZ3NpdGVyaW5nIGkyYyBkcml2ZXIsICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhaWMzeF9pMmNfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZhaWMzeF9pMmNfZHJpdmVyKTsKLX0KICNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBhaWMzeF9tb2Rpbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggYzVhYjhjOC4uNzFkN2JlOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtMzYsMjEgKzM2LDIxIEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAjaW5jbHVkZSA8c291bmQvdGx2MzIwZGFjMzMtcGxhdC5oPgogI2luY2x1ZGUgInRsdjMyMGRhYzMzLmgiCiAKLSNkZWZpbmUgREFDMzNfQlVGRkVSX1NJWkVfQllURVMJCTI0NTc2CS8qIGJ5dGVzLCAxMjI4OCAxNiBiaXQgd29yZHMsCi0JCQkJCQkgKiA2MTQ0IHN0ZXJlbyAqLwotI2RlZmluZSBEQUMzM19CVUZGRVJfU0laRV9TQU1QTEVTCTYxNDQKLQotI2RlZmluZSBOU0FNUExFX01BWAkJNTcwMAotCi0jZGVmaW5lIE1PREU3X0xUSFIJCTEwCi0jZGVmaW5lIE1PREU3X1VUSFIJCShEQUMzM19CVUZGRVJfU0laRV9TQU1QTEVTIC0gMTApCisvKgorICogVGhlIGludGVybmFsIEZJRk8gaXMgMjQ1NzYgYnl0ZXMgbG9uZworICogSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gaG9sZCAxNmJpdCBvciAyNGJpdCBzYW1wbGVzCisgKiBJbiAxNmJpdCBjb25maWd1cmF0aW9uIHRoZSBGSUZPIGNhbiBob2xkIDYxNDQgc3RlcmVvIHNhbXBsZXMKKyAqIEluIDI0Yml0IGNvbmZpZ3VyYXRpb24gdGhlIEZJRk8gY2FuIGhvbGQgNDA5NiBzdGVyZW8gc2FtcGxlcworICovCisjZGVmaW5lIERBQzMzX0ZJRk9fU0laRV8xNkJJVAk2MTQ0CisjZGVmaW5lIERBQzMzX0ZJRk9fU0laRV8yNEJJVAk0MDk2CisjZGVmaW5lIERBQzMzX01PREU3X01BUkdJTgkxMAkvKiBTYWZldHkgbWFyZ2luIGZvciBGSUZPIGluIE1vZGU3ICovCiAKICNkZWZpbmUgQlVSU1RfQkFTRUZSRVFfSFoJNDkxNTIwMDAKIApAQCAtMTAwLDE2ICsxMDAsMTEgQEAKIAl1bnNpZ25lZCBpbnQgcmVmY2xrOwogCiAJdW5zaWduZWQgaW50IGFsYXJtX3RocmVzaG9sZDsJLyogc2V0IHRvIGJlIGhhbGYgb2YgTEFURU5DWV9USU1FX01TICovCi0JdW5zaWduZWQgaW50IG5zYW1wbGVfbWluOwkvKiBuc2FtcGxlIHNob3VsZCBub3QgYmUgbG93ZXIgdGhhbgotCQkJCQkgKiB0aGlzICovCi0JdW5zaWduZWQgaW50IG5zYW1wbGVfbWF4OwkvKiBuc2FtcGxlIHNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4KLQkJCQkJICogdGhpcyAqLwogCWVudW0gZGFjMzNfZmlmb19tb2RlcyBmaWZvX21vZGU7LyogRklGTyBtb2RlIHNlbGVjdGlvbiAqLworCXVuc2lnbmVkIGludCBmaWZvX3NpemU7CQkvKiBTaXplIG9mIHRoZSBGSUZPIGluIHNhbXBsZXMgKi8KIAl1bnNpZ25lZCBpbnQgbnNhbXBsZTsJCS8qIGJ1cnN0IHJlYWQgYW1vdW50IGZyb20gaG9zdCAqLwogCWludCBtb2RlMV9sYXRlbmN5OwkJLyogbGF0ZW5jeSBjYXVzZWQgYnkgdGhlIGkyYyB3cml0ZXMgaW4KIAkJCQkJICogdXMgKi8KLQlpbnQgYXV0b19maWZvX2NvbmZpZzsgCQkvKiBDb25maWd1cmUgdGhlIEZJRk8gYmFzZWQgb24gdGhlCi0JCQkJCSAqIHBlcmlvZCBzaXplICovCiAJdTggYnVyc3RfYmNsa2RpdjsJCS8qIEJDTEsgZGl2aWRlciB2YWx1ZSBpbiBidXJzdCBtb2RlICovCiAJdW5zaWduZWQgaW50IGJ1cnN0X3JhdGU7CS8qIEludGVyZmFjZSBzcGVlZCBpbiBCdXJzdCBtb2RlcyAqLwogCkBAIC0zMDMsNyArMjk4LDYgQEAKIAlpZiAodW5saWtlbHkoIWRhYzMzLT5jaGlwX3Bvd2VyKSkKIAkJcmV0dXJuOwogCi0JLyogNDQtNDY6IERBQyBDb250cm9sIFJlZ2lzdGVycyAqLwogCS8qIEEgOiBEQUMgc2FtcGxlIHJhdGUgRnNyZWYvMS41ICovCiAJZGFjMzNfd3JpdGUoY29kZWMsIERBQzMzX0RBQ19DVFJMX0EsIERBQzMzX0RBQ1JBVEUoMCkpOwogCS8qIEIgOiBEQUMgc3JjPW5vcm1hbCwgbm90IG11dGVkICovCkBAIC0zMTYsOCArMzEwLDYgQEAKIAkgY2xvY2sgc291cmNlID0gaW50ZXJuYWwgb3NjICg/KSAqLwogCWRhYzMzX3dyaXRlKGNvZGVjLCBEQUMzM19BTkFfVk9MX1NPRlRfU1RFUF9DVFJMLCBEQUMzM19WT0xDTEtFTik7CiAKLQlkYWMzM193cml0ZShjb2RlYywgREFDMzNfUFdSX0NUUkwsIERBQzMzX1BETkFMTEIpOwotCiAJLyogUmVzdG9yZSBvbmx5IHNlbGVjdGVkIHJlZ2lzdGVycyAoZ2FpbnMgbW9zdGx5KSAqLwogCWRhYzMzX3dyaXRlKGNvZGVjLCBEQUMzM19MREFDX0RJR19WT0xfQ1RSTCwKIAkJICAgIGRhYzMzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBEQUMzM19MREFDX0RJR19WT0xfQ1RSTCkpOwpAQCAtMzI4LDYgKzMyMCwxMCBAQAogCQkgICAgZGFjMzNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIERBQzMzX0xJTkVMX1RPX0xMT19WT0wpKTsKIAlkYWMzM193cml0ZShjb2RlYywgREFDMzNfTElORVJfVE9fUkxPX1ZPTCwKIAkJICAgIGRhYzMzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBEQUMzM19MSU5FUl9UT19STE9fVk9MKSk7CisKKwlkYWMzM193cml0ZShjb2RlYywgREFDMzNfT1VUX0FNUF9DVFJMLAorCQkgICAgZGFjMzNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIERBQzMzX09VVF9BTVBfQ1RSTCkpOworCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGRhYzMzX3JlYWRfaWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpAQCAtMzU3LDYgKzM1MywyMSBAQAogCWRhYzMzX3dyaXRlKGNvZGVjLCBEQUMzM19QV1JfQ1RSTCwgcmVnKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRhYzMzX2Rpc2FibGVfZGlnaXRhbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJdTggcmVnOworCisJLyogU3RvcCB0aGUgREFJIGNsb2NrICovCisJcmVnID0gZGFjMzNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIERBQzMzX1NFUl9BVURJT0lGX0NUUkxfQik7CisJcmVnICY9IH5EQUMzM19CQ0xLT047CisJZGFjMzNfd3JpdGUoY29kZWMsIERBQzMzX1NFUl9BVURJT0lGX0NUUkxfQiwgcmVnKTsKKworCS8qIFBvd2VyIGRvd24gdGhlIE9zY2lsbGF0b3IsIGFuZCBEQUNzICovCisJcmVnID0gZGFjMzNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIERBQzMzX1BXUl9DVFJMKTsKKwlyZWcgJj0gfihEQUMzM19PU0NQRE5CIHwgREFDMzNfREFDUlBETkIgfCBEQUMzM19EQUNMUEROQik7CisJZGFjMzNfd3JpdGUoY29kZWMsIERBQzMzX1BXUl9DVFJMLCByZWcpOworfQorCiBzdGF0aWMgaW50IGRhYzMzX2hhcmRfcG93ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgcG93ZXIpCiB7CiAJc3RydWN0IHRsdjMyMGRhYzMzX3ByaXYgKmRhYzMzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CkBAIC00MDUsNyArNDE2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBsYXliYWNrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorc3RhdGljIGludCBkYWMzM19wbGF5YmFja19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKIAlzdHJ1Y3QgdGx2MzIwZGFjMzNfcHJpdiAqZGFjMzMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKHctPmNvZGVjKTsKQEAgLTQxNyw3NyArNDI4LDEzIEBACiAJCQlkYWMzM19wcmVwYXJlX2NoaXAoZGFjMzMtPnN1YnN0cmVhbSk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWRhYzMzX2Rpc2FibGVfZGlnaXRhbCh3LT5jb2RlYyk7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkYWMzM19nZXRfbnNhbXBsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHRsdjMyMGRhYzMzX3ByaXYgKmRhYzMzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhYzMzLT5uc2FtcGxlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGFjMzNfc2V0X25zYW1wbGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCB0bHYzMjBkYWMzM19wcml2ICpkYWMzMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JaWYgKGRhYzMzLT5uc2FtcGxlID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlyZXR1cm4gMDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8IGRhYzMzLT5uc2FtcGxlX21pbiB8fAotCSAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA+IGRhYzMzLT5uc2FtcGxlX21heCkgewotCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWRhYzMzLT5uc2FtcGxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JCS8qIFJlIGNhbGN1bGF0ZSB0aGUgYnVyc3QgdGltZSAqLwotCQlkYWMzMy0+bW9kZTFfdXNfYnVyc3QgPSBTQU1QTEVTX1RPX1VTKGRhYzMzLT5idXJzdF9yYXRlLAotCQkJCQkJICAgICAgZGFjMzMtPm5zYW1wbGUpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGFjMzNfZ2V0X3V0aHIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCB0bHYzMjBkYWMzM19wcml2ICpkYWMzMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkYWMzMy0+dXRocjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhYzMzX3NldF91dGhyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGx2MzIwZGFjMzNfcHJpdiAqZGFjMzMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChkYWMzMy0+c3Vic3RyZWFtKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKGRhYzMzLT51dGhyID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlyZXR1cm4gMDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8IChNT0RFN19MVEhSICsgMTApIHx8Ci0JICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID4gTU9ERTdfVVRIUikKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCWRhYzMzLT51dGhyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGRhYzMzX2dldF9maWZvX21vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC01NzIsMTMgKzUxOSw2IEBACiAJCSBkYWMzM19nZXRfZmlmb19tb2RlLCBkYWMzM19zZXRfZmlmb19tb2RlKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzM19maWZvX3NuZF9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJuU2FtcGxlIiwgMCwgMCwgNTkwMCwgMCwKLQkJZGFjMzNfZ2V0X25zYW1wbGUsIGRhYzMzX3NldF9uc2FtcGxlKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVRIUiIsIDAsIDAsIE1PREU3X1VUSFIsIDAsCi0JCSBkYWMzM19nZXRfdXRociwgZGFjMzNfc2V0X3V0aHIpLAotfTsKLQogLyogQW5hbG9nIGJ5cGFzcyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhYzMzX2RhcG1fYWJ5cGFzc2xfY29udHJvbCA9CiAJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBEQUMzM19MSU5FTF9UT19MTE9fVk9MLCA3LCAxLCAxKTsKQEAgLTU4Niw2ICs1MjYsMjUgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzM19kYXBtX2FieXBhc3NyX2NvbnRyb2wgPQogCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgREFDMzNfTElORVJfVE9fUkxPX1ZPTCwgNywgMSwgMSk7CiAKKy8qIExPUCBML1IgaW52ZXJ0IHNlbGVjdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRhYzMzX2xyX2xvbV90ZXh0c1tdID0geyJEQUMiLCAiTE9QIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjMzNfbGVmdF9sb21fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKERBQzMzX09VVF9BTVBfQ1RSTCwgMywKKwkJCUFSUkFZX1NJWkUoZGFjMzNfbHJfbG9tX3RleHRzKSwKKwkJCWRhYzMzX2xyX2xvbV90ZXh0cyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzM19kYXBtX2xlZnRfbG9tX2NvbnRyb2wgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCBkYWMzM19sZWZ0X2xvbV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWMzM19yaWdodF9sb21fZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKERBQzMzX09VVF9BTVBfQ1RSTCwgMiwKKwkJCUFSUkFZX1NJWkUoZGFjMzNfbHJfbG9tX3RleHRzKSwKKwkJCWRhYzMzX2xyX2xvbV90ZXh0cyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzM19kYXBtX3JpZ2h0X2xvbV9jb250cm9sID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgZGFjMzNfcmlnaHRfbG9tX2VudW0pOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgZGFjMzNfZGFwbV93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX09VVFBVVCgiTEVGVF9MTyIpLAogCVNORF9TT0NfREFQTV9PVVRQVVQoIlJJR0hUX0xPIiksCkBAIC01OTMsOCArNTUyLDggQEAKIAlTTkRfU09DX0RBUE1fSU5QVVQoIkxJTkVMIiksCiAJU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FUiIpLAogCi0JU05EX1NPQ19EQVBNX0RBQygiREFDTCIsICJMZWZ0IFBsYXliYWNrIiwgREFDMzNfTERBQ19QV1JfQ1RSTCwgMiwgMCksCi0JU05EX1NPQ19EQVBNX0RBQygiREFDUiIsICJSaWdodCBQbGF5YmFjayIsIERBQzMzX1JEQUNfUFdSX0NUUkwsIDIsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQ0wiLCAiTGVmdCBQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiREFDUiIsICJSaWdodCBQbGF5YmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCksCiAKIAkvKiBBbmFsb2cgYnlwYXNzICovCiAJU05EX1NPQ19EQVBNX1NXSVRDSCgiQW5hbG9nIExlZnQgQnlwYXNzIiwgU05EX1NPQ19OT1BNLCAwLCAwLApAQCAtNjAyLDEyICs1NjEsMzAgQEAKIAlTTkRfU09DX0RBUE1fU1dJVENIKCJBbmFsb2cgUmlnaHQgQnlwYXNzIiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkJCSZkYWMzM19kYXBtX2FieXBhc3NyX2NvbnRyb2wpLAogCi0JU05EX1NPQ19EQVBNX1JFRyhzbmRfc29jX2RhcG1fbWl4ZXIsICJPdXRwdXQgTGVmdCBBbXAgUG93ZXIiLAorCVNORF9TT0NfREFQTV9NVVgoIkxlZnQgTE9NIEludmVydGVkIEZyb20iLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZkYWMzM19kYXBtX2xlZnRfbG9tX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9NVVgoIlJpZ2h0IExPTSBJbnZlcnRlZCBGcm9tIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmZGFjMzNfZGFwbV9yaWdodF9sb21fY29udHJvbCksCisJLyoKKwkgKiBGb3IgREFQTSBwYXRoLCB3aGVuIG9ubHkgdGhlIGFubG9nIGJ5cGFzcyBwYXRoIGlzIGVuYWJsZWQsIGFuZCB0aGUKKwkgKiBMT1AgaW52ZXJ0ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBEQUMgc2lkZS4KKwkgKiBUaGlzIGlzIG5lZWRlZCwgc28gd2UgY2FuIGF0dGFjaCB0aGUgREFDIHBvd2VyIHN1cHBseSBpbiB0aGlzIGNhc2UuCisJICovCisJU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBCeXBhc3MgUEdBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBCeXBhc3MgUEdBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9SRUcoc25kX3NvY19kYXBtX21peGVyLCAiT3V0cHV0IExlZnQgQW1wbGlmaWVyIiwKIAkJCSBEQUMzM19PVVRfQU1QX1BXUl9DVFJMLCA2LCAzLCAzLCAwKSwKLQlTTkRfU09DX0RBUE1fUkVHKHNuZF9zb2NfZGFwbV9taXhlciwgIk91dHB1dCBSaWdodCBBbXAgUG93ZXIiLAorCVNORF9TT0NfREFQTV9SRUcoc25kX3NvY19kYXBtX21peGVyLCAiT3V0cHV0IFJpZ2h0IEFtcGxpZmllciIsCiAJCQkgREFDMzNfT1VUX0FNUF9QV1JfQ1RSTCwgNCwgMywgMywgMCksCiAKLQlTTkRfU09DX0RBUE1fUFJFKCJQcmVwYXJlIFBsYXliYWNrIiwgcGxheWJhY2tfZXZlbnQpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkxlZnQgREFDIFBvd2VyIiwKKwkJCSAgICBEQUMzM19MREFDX1BXUl9DVFJMLCAyLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSaWdodCBEQUMgUG93ZXIiLAorCQkJICAgIERBQzMzX1JEQUNfUFdSX0NUUkwsIDIsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1BSRSgiUHJlIFBsYXliYWNrIiwgZGFjMzNfcGxheWJhY2tfZXZlbnQpLAorCVNORF9TT0NfREFQTV9QT1NUKCJQb3N0IFBsYXliYWNrIiwgZGFjMzNfcGxheWJhY2tfZXZlbnQpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXVkaW9fbWFwW10gPSB7CkBAIC02MTUsMjQgKzU5MiwzOSBAQAogCXsiQW5hbG9nIExlZnQgQnlwYXNzIiwgIlN3aXRjaCIsICJMSU5FTCJ9LAogCXsiQW5hbG9nIFJpZ2h0IEJ5cGFzcyIsICJTd2l0Y2giLCAiTElORVIifSwKIAotCXsiT3V0cHV0IExlZnQgQW1wIFBvd2VyIiwgTlVMTCwgIkRBQ0wifSwKLQl7Ik91dHB1dCBSaWdodCBBbXAgUG93ZXIiLCBOVUxMLCAiREFDUiJ9LAorCXsiT3V0cHV0IExlZnQgQW1wbGlmaWVyIiwgTlVMTCwgIkRBQ0wifSwKKwl7Ik91dHB1dCBSaWdodCBBbXBsaWZpZXIiLCBOVUxMLCAiREFDUiJ9LAogCi0JeyJPdXRwdXQgTGVmdCBBbXAgUG93ZXIiLCBOVUxMLCAiQW5hbG9nIExlZnQgQnlwYXNzIn0sCi0JeyJPdXRwdXQgUmlnaHQgQW1wIFBvd2VyIiwgTlVMTCwgIkFuYWxvZyBSaWdodCBCeXBhc3MifSwKKwl7IkxlZnQgQnlwYXNzIFBHQSIsIE5VTEwsICJBbmFsb2cgTGVmdCBCeXBhc3MifSwKKwl7IlJpZ2h0IEJ5cGFzcyBQR0EiLCBOVUxMLCAiQW5hbG9nIFJpZ2h0IEJ5cGFzcyJ9LAorCisJeyJMZWZ0IExPTSBJbnZlcnRlZCBGcm9tIiwgIkRBQyIsICJMZWZ0IEJ5cGFzcyBQR0EifSwKKwl7IlJpZ2h0IExPTSBJbnZlcnRlZCBGcm9tIiwgIkRBQyIsICJSaWdodCBCeXBhc3MgUEdBIn0sCisJeyJMZWZ0IExPTSBJbnZlcnRlZCBGcm9tIiwgIkxPUCIsICJBbmFsb2cgTGVmdCBCeXBhc3MifSwKKwl7IlJpZ2h0IExPTSBJbnZlcnRlZCBGcm9tIiwgIkxPUCIsICJBbmFsb2cgUmlnaHQgQnlwYXNzIn0sCisKKwl7Ik91dHB1dCBMZWZ0IEFtcGxpZmllciIsIE5VTEwsICJMZWZ0IExPTSBJbnZlcnRlZCBGcm9tIn0sCisJeyJPdXRwdXQgUmlnaHQgQW1wbGlmaWVyIiwgTlVMTCwgIlJpZ2h0IExPTSBJbnZlcnRlZCBGcm9tIn0sCisKKwl7IkRBQ0wiLCBOVUxMLCAiTGVmdCBEQUMgUG93ZXIifSwKKwl7IkRBQ1IiLCBOVUxMLCAiUmlnaHQgREFDIFBvd2VyIn0sCisKKwl7IkxlZnQgQnlwYXNzIFBHQSIsIE5VTEwsICJMZWZ0IERBQyBQb3dlciJ9LAorCXsiUmlnaHQgQnlwYXNzIFBHQSIsIE5VTEwsICJSaWdodCBEQUMgUG93ZXIifSwKIAogCS8qIG91dHB1dCAqLwotCXsiTEVGVF9MTyIsIE5VTEwsICJPdXRwdXQgTGVmdCBBbXAgUG93ZXIifSwKLQl7IlJJR0hUX0xPIiwgTlVMTCwgIk91dHB1dCBSaWdodCBBbXAgUG93ZXIifSwKKwl7IkxFRlRfTE8iLCBOVUxMLCAiT3V0cHV0IExlZnQgQW1wbGlmaWVyIn0sCisJeyJSSUdIVF9MTyIsIE5VTEwsICJPdXRwdXQgUmlnaHQgQW1wbGlmaWVyIn0sCiB9OwogCiBzdGF0aWMgaW50IGRhYzMzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBkYWMzM19kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKGRhYzMzX2RhcG1fd2lkZ2V0cykpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgZGFjMzNfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRShkYWMzM19kYXBtX3dpZGdldHMpKTsKIAkvKiBzZXQgdXAgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY0MCwxNiArNjMyLDE4IEBACiBzdGF0aWMgaW50IGRhYzMzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKKwlzdHJ1Y3QgdGx2MzIwZGFjMzNfcHJpdiAqZGFjMzMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCQlkYWMzM19zb2Z0X3Bvd2VyKGNvZGVjLCAxKTsKKwkJaWYgKCFkYWMzMy0+c3Vic3RyZWFtKQorCQkJZGFjMzNfc29mdF9wb3dlcihjb2RlYywgMSk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIENvbWluZyBmcm9tIE9GRiwgc3dpdGNoIG9uIHRoZSBjb2RlYyAqLwogCQkJcmV0ID0gZGFjMzNfaGFyZF9wb3dlcihjb2RlYywgMSk7CiAJCQlpZiAocmV0ICE9IDApCkBAIC02NjAsMTQgKzY1NCwxNCBAQAogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCS8qIERvIG5vdCBwb3dlciBvZmYsIHdoZW4gdGhlIGNvZGVjIGlzIGFscmVhZHkgb2ZmICovCi0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQogCQkJcmV0dXJuIDA7CiAJCXJldCA9IGRhYzMzX2hhcmRfcG93ZXIoY29kZWMsIDApOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwNSw3ICs2OTksNyBAQAogCQlzcGluX3VubG9ja19pcnEoJmRhYzMzLT5sb2NrKTsKIAogCQlkYWMzM193cml0ZTE2KGNvZGVjLCBEQUMzM19QUkVGSUxMX01TQiwKLQkJCQlEQUMzM19USFJSRUcoTU9ERTdfTFRIUikpOworCQkJCURBQzMzX1RIUlJFRyhEQUMzM19NT0RFN19NQVJHSU4pKTsKIAogCQkvKiBFbmFibGUgVXBwZXIgVGhyZXNob2xkIElSUSAqLwogCQlkYWMzM193cml0ZShjb2RlYywgREFDMzNfRklGT19JUlFfTUFTSywgREFDMzNfTVVUKTsKQEAgLTgxNSw2ICs4MDksOCBAQAogCS8qIFN0cmVhbSBzdGFydGVkLCBzYXZlIHRoZSBzdWJzdHJlYW0gcG9pbnRlciAqLwogCWRhYzMzLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHN1YnN0cmVhbS0+cnVudGltZSwgMCwgMzIsIDI0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC04MjYsMTggKzgyMiwxNyBAQAogCXN0cnVjdCB0bHYzMjBkYWMzM19wcml2ICpkYWMzMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCiAJZGFjMzMtPnN1YnN0cmVhbSA9IE5VTEw7Ci0KLQkvKiBSZXNldCB0aGUgblNhbXBsZSByZXN0cmljdGlvbnMgKi8KLQlkYWMzMy0+bnNhbXBsZV9taW4gPSAwOwotCWRhYzMzLT5uc2FtcGxlX21heCA9IE5TQU1QTEVfTUFYOwogfQogCisjZGVmaW5lIENBTENfQlVSU1RfUkFURShiY2xrZGl2LCBiY2xrX3Blcl9zYW1wbGUpIFwKKwkoQlVSU1RfQkFTRUZSRVFfSFogLyBiY2xrZGl2IC8gYmNsa19wZXJfc2FtcGxlKQogc3RhdGljIGludCBkYWMzM19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCB0bHYzMjBkYWMzM19wcml2ICpkYWMzMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCiAJLyogQ2hlY2sgcGFyYW1ldGVycyBmb3IgdmFsaWRpdHkgKi8KIAlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKQEAgLTg1Miw2ICs4NDcsMTIgQEAKIAogCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJZGFjMzMtPmZpZm9fc2l6ZSA9IERBQzMzX0ZJRk9fU0laRV8xNkJJVDsKKwkJZGFjMzMtPmJ1cnN0X3JhdGUgPSBDQUxDX0JVUlNUX1JBVEUoZGFjMzMtPmJ1cnN0X2JjbGtkaXYsIDMyKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJZGFjMzMtPmZpZm9fc2l6ZSA9IERBQzMzX0ZJRk9fU0laRV8yNEJJVDsKKwkJZGFjMzMtPmJ1cnN0X3JhdGUgPSBDQUxDX0JVUlNUX1JBVEUoZGFjMzMtPmJ1cnN0X2JjbGtkaXYsIDY0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgZm9ybWF0ICVkXG4iLApAQCAtOTA2LDYgKzkwNyw5IEBACiAJCWFpY3RybF9hIHw9IChEQUMzM19OQ1lDTF8xNiB8IERBQzMzX1dMRU5fMTYpOwogCQlmaWZvY3RybF9hIHw9IERBQzMzX1dJRFRIOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlhaWN0cmxfYSB8PSAoREFDMzNfTkNZQ0xfMzIgfCBEQUMzM19XTEVOXzI0KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAidW5zdXBwb3J0ZWQgZm9ybWF0ICVkXG4iLAogCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQpOwpAQCAtMTA0MCw3ICsxMDQ0LDEwIEBACiAJCWRhYzMzX3dyaXRlKGNvZGVjLCBEQUMzM19TRVJfQVVESU9JRl9DVFJMX0MsCiAJCQkJCQkJZGFjMzMtPmJ1cnN0X2JjbGtkaXYpOwogCWVsc2UKLQkJZGFjMzNfd3JpdGUoY29kZWMsIERBQzMzX1NFUl9BVURJT0lGX0NUUkxfQywgMzIpOworCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCisJCQlkYWMzM193cml0ZShjb2RlYywgREFDMzNfU0VSX0FVRElPSUZfQ1RSTF9DLCAzMik7CisJCWVsc2UKKwkJCWRhYzMzX3dyaXRlKGNvZGVjLCBEQUMzM19TRVJfQVVESU9JRl9DVFJMX0MsIDE2KTsKIAogCXN3aXRjaCAoZGFjMzMtPmZpZm9fbW9kZSkgewogCWNhc2UgREFDMzNfRklGT19NT0RFMToKQEAgLTEwNTMsNyArMTA2MCw4IEBACiAJCSAqIGF0IHRoZSBib3R0b20sIGFuZCBhbHNvIGF0IHRoZSB0b3Agb2YgdGhlIEZJRk8KIAkJICovCiAJCWRhYzMzX3dyaXRlMTYoY29kZWMsIERBQzMzX1VUSFJfTVNCLCBEQUMzM19USFJSRUcoZGFjMzMtPnV0aHIpKTsKLQkJZGFjMzNfd3JpdGUxNihjb2RlYywgREFDMzNfTFRIUl9NU0IsIERBQzMzX1RIUlJFRyhNT0RFN19MVEhSKSk7CisJCWRhYzMzX3dyaXRlMTYoY29kZWMsIERBQzMzX0xUSFJfTVNCLAorCQkJICAgICAgREFDMzNfVEhSUkVHKERBQzMzX01PREU3X01BUkdJTikpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEwODIsNDIgKzEwOTAsMjEgQEAKIAkJLyogTnVtYmVyIG9mIHNhbXBsZXMgdW5kZXIgaTJjIGxhdGVuY3kgKi8KIAkJZGFjMzMtPmFsYXJtX3RocmVzaG9sZCA9IFVTX1RPX1NBTVBMRVMocmF0ZSwKIAkJCQkJCWRhYzMzLT5tb2RlMV9sYXRlbmN5KTsKLQkJbnNhbXBsZV9saW1pdCA9IERBQzMzX0JVRkZFUl9TSVpFX1NBTVBMRVMgLQotCQkJCWRhYzMzLT5hbGFybV90aHJlc2hvbGQ7CisJCW5zYW1wbGVfbGltaXQgPSBkYWMzMy0+Zmlmb19zaXplIC0gZGFjMzMtPmFsYXJtX3RocmVzaG9sZDsKIAotCQlpZiAoZGFjMzMtPmF1dG9fZmlmb19jb25maWcpIHsKLQkJCWlmIChwZXJpb2Rfc2l6ZSA8PSBkYWMzMy0+YWxhcm1fdGhyZXNob2xkKQotCQkJCS8qCi0JCQkJICogQ29uZmlndXJlIG5TYW1hcGxlIHRvIG51bWJlciBvZiBwZXJpb2RzLAotCQkJCSAqIHdoaWNoIGNvdmVycyB0aGUgbGF0ZW5jeSByZXF1aXJvbm1lbnQuCi0JCQkJICovCi0JCQkJZGFjMzMtPm5zYW1wbGUgPSBwZXJpb2Rfc2l6ZSAqCi0JCQkJICAgICAgICgoZGFjMzMtPmFsYXJtX3RocmVzaG9sZCAvIHBlcmlvZF9zaXplKSArCi0JCQkJICAgICAgIChkYWMzMy0+YWxhcm1fdGhyZXNob2xkICUgcGVyaW9kX3NpemUgPwotCQkJCSAgICAgICAxIDogMCkpOwotCQkJZWxzZSBpZiAocGVyaW9kX3NpemUgPiBuc2FtcGxlX2xpbWl0KQotCQkJCWRhYzMzLT5uc2FtcGxlID0gbnNhbXBsZV9saW1pdDsKLQkJCWVsc2UKLQkJCQlkYWMzMy0+bnNhbXBsZSA9IHBlcmlvZF9zaXplOwotCQl9IGVsc2UgewotCQkJLyogblNhbXBsZSB0aW1lIHNoYWxsIG5vdCBiZSBzaG9ydGVyIHRoYW4gaTJjIGxhdGVuY3kgKi8KLQkJCWRhYzMzLT5uc2FtcGxlX21pbiA9IGRhYzMzLT5hbGFybV90aHJlc2hvbGQ7CisJCWlmIChwZXJpb2Rfc2l6ZSA8PSBkYWMzMy0+YWxhcm1fdGhyZXNob2xkKQogCQkJLyoKLQkJCSAqIG5TYW1wbGUgc2hvdWxkIG5vdCBiZSBiaWdnZXIgdGhhbiBhbHNhIGJ1ZmZlciBtaW51cwotCQkJICogc2l6ZSBvZiBvbmUgcGVyaW9kIHRvIGF2b2lkIG92ZXJydW5zCisJCQkgKiBDb25maWd1cmUgblNhbWFwbGUgdG8gbnVtYmVyIG9mIHBlcmlvZHMsCisJCQkgKiB3aGljaCBjb3ZlcnMgdGhlIGxhdGVuY3kgcmVxdWlyb25tZW50LgogCQkJICovCi0JCQlkYWMzMy0+bnNhbXBsZV9tYXggPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0KLQkJCQkJCXBlcmlvZF9zaXplOwotCi0JCQlpZiAoZGFjMzMtPm5zYW1wbGVfbWF4ID4gbnNhbXBsZV9saW1pdCkKLQkJCQlkYWMzMy0+bnNhbXBsZV9tYXggPSBuc2FtcGxlX2xpbWl0OwotCi0JCQkvKiBDb3JyZWN0IHRoZSBuU2FtcGxlIGlmIGl0IGlzIG91dHNpZGUgb2YgdGhlIHJhbmdlcyAqLwotCQkJaWYgKGRhYzMzLT5uc2FtcGxlIDwgZGFjMzMtPm5zYW1wbGVfbWluKQotCQkJCWRhYzMzLT5uc2FtcGxlID0gZGFjMzMtPm5zYW1wbGVfbWluOwotCQkJaWYgKGRhYzMzLT5uc2FtcGxlID4gZGFjMzMtPm5zYW1wbGVfbWF4KQotCQkJCWRhYzMzLT5uc2FtcGxlID0gZGFjMzMtPm5zYW1wbGVfbWF4OwotCQl9CisJCQlkYWMzMy0+bnNhbXBsZSA9IHBlcmlvZF9zaXplICoKKwkJCQkoKGRhYzMzLT5hbGFybV90aHJlc2hvbGQgLyBwZXJpb2Rfc2l6ZSkgKworCQkJCShkYWMzMy0+YWxhcm1fdGhyZXNob2xkICUgcGVyaW9kX3NpemUgPworCQkJCTEgOiAwKSk7CisJCWVsc2UgaWYgKHBlcmlvZF9zaXplID4gbnNhbXBsZV9saW1pdCkKKwkJCWRhYzMzLT5uc2FtcGxlID0gbnNhbXBsZV9saW1pdDsKKwkJZWxzZQorCQkJZGFjMzMtPm5zYW1wbGUgPSBwZXJpb2Rfc2l6ZTsKIAogCQlkYWMzMy0+bW9kZTFfdXNfYnVyc3QgPSBTQU1QTEVTX1RPX1VTKGRhYzMzLT5idXJzdF9yYXRlLAogCQkJCQkJICAgICAgZGFjMzMtPm5zYW1wbGUpOwpAQCAtMTEyNSwxOSArMTExMiwxNiBAQAogCQlkYWMzMy0+dF9zdGFtcDIgPSAwOwogCQlicmVhazsKIAljYXNlIERBQzMzX0ZJRk9fTU9ERTc6Ci0JCWlmIChkYWMzMy0+YXV0b19maWZvX2NvbmZpZykgewotCQkJZGFjMzMtPnV0aHIgPSBVVEhSX0ZST01fUEVSSU9EX1NJWkUoCi0JCQkJCXBlcmlvZF9zaXplLAotCQkJCQlyYXRlLAotCQkJCQlkYWMzMy0+YnVyc3RfcmF0ZSkgKyA5OwotCQkJaWYgKGRhYzMzLT51dGhyID4gTU9ERTdfVVRIUikKLQkJCQlkYWMzMy0+dXRociA9IE1PREU3X1VUSFI7Ci0JCQlpZiAoZGFjMzMtPnV0aHIgPCAoTU9ERTdfTFRIUiArIDEwKSkKLQkJCQlkYWMzMy0+dXRociA9IChNT0RFN19MVEhSICsgMTApOwotCQl9CisJCWRhYzMzLT51dGhyID0gVVRIUl9GUk9NX1BFUklPRF9TSVpFKHBlcmlvZF9zaXplLCByYXRlLAorCQkJCQkJICAgIGRhYzMzLT5idXJzdF9yYXRlKSArIDk7CisJCWlmIChkYWMzMy0+dXRociA+IChkYWMzMy0+Zmlmb19zaXplIC0gREFDMzNfTU9ERTdfTUFSR0lOKSkKKwkJCWRhYzMzLT51dGhyID0gZGFjMzMtPmZpZm9fc2l6ZSAtIERBQzMzX01PREU3X01BUkdJTjsKKwkJaWYgKGRhYzMzLT51dGhyIDwgKERBQzMzX01PREU3X01BUkdJTiArIDEwKSkKKwkJCWRhYzMzLT51dGhyID0gKERBQzMzX01PREU3X01BUkdJTiArIDEwKTsKKwogCQlkYWMzMy0+bW9kZTdfdXNfdG9fbHRociA9CiAJCQkJU0FNUExFU19UT19VUyhzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUsCi0JCQkJCWRhYzMzLT51dGhyIC0gTU9ERTdfTFRIUiArIDEpOworCQkJCQlkYWMzMy0+dXRociAtIERBQzMzX01PREU3X01BUkdJTiArIDEpOwogCQlkYWMzMy0+dF9zdGFtcDEgPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTI1NSw4ICsxMjM5LDggQEAKIAkJCXNhbXBsZXMgKz0gKHNhbXBsZXNfaW4gLSBzYW1wbGVzX291dCk7CiAKIAkJCWlmIChsaWtlbHkoc2FtcGxlcyA+IDApKQotCQkJCWRlbGF5ID0gc2FtcGxlcyA+IERBQzMzX0JVRkZFUl9TSVpFX1NBTVBMRVMgPwotCQkJCQlEQUMzM19CVUZGRVJfU0laRV9TQU1QTEVTIDogc2FtcGxlczsKKwkJCQlkZWxheSA9IHNhbXBsZXMgPiBkYWMzMy0+Zmlmb19zaXplID8KKwkJCQkJZGFjMzMtPmZpZm9fc2l6ZSA6IHNhbXBsZXM7CiAJCQllbHNlCiAJCQkJZGVsYXkgPSAwOwogCQl9CkBAIC0xMzA4LDcgKzEyOTIsNyBAQAogCQkJc2FtcGxlc19pbiA9IFVTX1RPX1NBTVBMRVMoCiAJCQkJCWRhYzMzLT5idXJzdF9yYXRlLAogCQkJCQl0aW1lX2RlbHRhKTsKLQkJCWRlbGF5ID0gTU9ERTdfTFRIUiArIHNhbXBsZXNfaW4gLSBzYW1wbGVzX291dDsKKwkJCWRlbGF5ID0gREFDMzNfTU9ERTdfTUFSR0lOICsgc2FtcGxlc19pbiAtIHNhbXBsZXNfb3V0OwogCiAJCQlpZiAodW5saWtlbHkoZGVsYXkgPiB1dGhyKSkKIAkJCQlkZWxheSA9IHV0aHI7CkBAIC0xNDE1LDcgKzEzOTksNyBAQAogCiAJY29kZWMtPmNvbnRyb2xfZGF0YSA9IGRhYzMzLT5jb250cm9sX2RhdGE7CiAJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpIGkyY19tYXN0ZXJfc2VuZDsKLQljb2RlYy0+aWRsZV9iaWFzX29mZiA9IDE7CisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAJZGFjMzMtPmNvZGVjID0gY29kZWM7CiAKIAkvKiBSZWFkIHRoZSB0bHYzMjBkYWMzMyBJRCByZWdpc3RlcnMgKi8KQEAgLTE0NTksMTQgKzE0NDMsMTAgQEAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKGRhYzMzX3NuZF9jb250cm9scykpOwogCS8qIE9ubHkgYWRkIHRoZSBGSUZPIGNvbnRyb2xzLCBpZiB3ZSBoYXZlIHZhbGlkIElSUSBudW1iZXIgKi8KLQlpZiAoZGFjMzMtPmlycSA+PSAwKSB7CisJaWYgKGRhYzMzLT5pcnEgPj0gMCkKIAkJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIGRhYzMzX21vZGVfc25kX2NvbnRyb2xzLAogCQkJCSAgICAgQVJSQVlfU0laRShkYWMzM19tb2RlX3NuZF9jb250cm9scykpOwotCQkvKiBGSUZPIHVzYWdlIGNvbnRyb2xzIG9ubHksIGlmIGF1dG9pbyBjb25maWcgaXMgbm90IHNlbGVjdGVkICovCi0JCWlmICghZGFjMzMtPmF1dG9fZmlmb19jb25maWcpCi0JCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgZGFjMzNfZmlmb19zbmRfY29udHJvbHMsCi0JCQkJCUFSUkFZX1NJWkUoZGFjMzNfZmlmb19zbmRfY29udHJvbHMpKTsKLQl9CisKIAlkYWMzM19hZGRfd2lkZ2V0cyhjb2RlYyk7CiAKIGVycl9wb3dlcjoKQEAgLTE1MTUsNyArMTQ5NSw3IEBACiAKICNkZWZpbmUgREFDMzNfUkFURVMJKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAogCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwKQotI2RlZmluZSBEQUMzM19GT1JNQVRTCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFCisjZGVmaW5lIERBQzMzX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIGRhYzMzX2RhaV9vcHMgPSB7CiAJLnN0YXJ0dXAJPSBkYWMzM19zdGFydHVwLApAQCAtMTU2MywxNyArMTU0MywxMSBAQAogCiAJZGFjMzMtPnBvd2VyX2dwaW8gPSBwZGF0YS0+cG93ZXJfZ3BpbzsKIAlkYWMzMy0+YnVyc3RfYmNsa2RpdiA9IHBkYXRhLT5idXJzdF9iY2xrZGl2OwotCS8qIFByZSBjYWxjdWxhdGUgdGhlIGJ1cnN0IHJhdGUgKi8KLQlkYWMzMy0+YnVyc3RfcmF0ZSA9IEJVUlNUX0JBU0VGUkVRX0haIC8gZGFjMzMtPmJ1cnN0X2JjbGtkaXYgLyAzMjsKIAlkYWMzMy0+a2VlcF9iY2xrID0gcGRhdGEtPmtlZXBfYmNsazsKLQlkYWMzMy0+YXV0b19maWZvX2NvbmZpZyA9IHBkYXRhLT5hdXRvX2ZpZm9fY29uZmlnOwogCWRhYzMzLT5tb2RlMV9sYXRlbmN5ID0gcGRhdGEtPm1vZGUxX2xhdGVuY3k7CiAJaWYgKCFkYWMzMy0+bW9kZTFfbGF0ZW5jeSkKIAkJZGFjMzMtPm1vZGUxX2xhdGVuY3kgPSAxMDAwMDsgLyogMTBtcyAqLwogCWRhYzMzLT5pcnEgPSBjbGllbnQtPmlycTsKLQlkYWMzMy0+bnNhbXBsZSA9IE5TQU1QTEVfTUFYOwotCWRhYzMzLT5uc2FtcGxlX21heCA9IE5TQU1QTEVfTUFYOwotCWRhYzMzLT51dGhyID0gTU9ERTdfVVRIUjsKIAkvKiBEaXNhYmxlIEZJRk8gdXNlIGJ5IGRlZmF1bHQgKi8KIAlkYWMzMy0+Zmlmb19tb2RlID0gREFDMzNfRklGT19CWVBBU1M7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCmluZGV4IGQyYzI0MzAuLjFmMWFjODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC90cGE2MTMwYTItcGxhdC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKICNpbmNsdWRlICJ0cGE2MTMwYTIuaCIKQEAgLTQyLDcgKzQxLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHJlZ3NbVFBBNjEzMEEyX0NBQ0hFUkVHTlVNXTsKIAlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHk7CiAJaW50IHBvd2VyX2dwaW87Ci0JdW5zaWduZWQgY2hhciBwb3dlcl9zdGF0ZTsKKwl1OCBwb3dlcl9zdGF0ZToxOwogCWVudW0gdHBhX21vZGVsIGlkOwogfTsKIApAQCAtMTE3LDcgKzExNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB0cGE2MTMwYTJfcG93ZXIoaW50IHBvd2VyKQorc3RhdGljIGludCB0cGE2MTMwYTJfcG93ZXIodTggcG93ZXIpCiB7CiAJc3RydWN0CXRwYTYxMzBhMl9kYXRhICpkYXRhOwogCXU4CXZhbDsKQEAgLTEyNywxNyArMTI2LDE5IEBACiAJZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YSh0cGE2MTMwYTJfY2xpZW50KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKLQlpZiAocG93ZXIgJiYgIWRhdGEtPnBvd2VyX3N0YXRlKSB7Ci0JCS8qIFBvd2VyIG9uICovCi0JCWlmIChkYXRhLT5wb3dlcl9ncGlvID49IDApCi0JCQlncGlvX3NldF92YWx1ZShkYXRhLT5wb3dlcl9ncGlvLCAxKTsKKwlpZiAocG93ZXIgPT0gZGF0YS0+cG93ZXJfc3RhdGUpCisJCWdvdG8gZXhpdDsKIAorCWlmIChwb3dlcikgewogCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnN1cHBseSk7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJZGV2X2VycigmdHBhNjEzMGEyX2NsaWVudC0+ZGV2LAogCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHN1cHBseTogJWRcbiIsIHJldCk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KKwkJLyogUG93ZXIgb24gKi8KKwkJaWYgKGRhdGEtPnBvd2VyX2dwaW8gPj0gMCkKKwkJCWdwaW9fc2V0X3ZhbHVlKGRhdGEtPnBvd2VyX2dwaW8sIDEpOwogCiAJCWRhdGEtPnBvd2VyX3N0YXRlID0gMTsKIAkJcmV0ID0gdHBhNjEzMGEyX2luaXRpYWxpemUoKTsKQEAgLTE1MCwxMiArMTUxLDcgQEAKIAkJCWRhdGEtPnBvd2VyX3N0YXRlID0gMDsKIAkJCWdvdG8gZXhpdDsKIAkJfQotCi0JCS8qIENsZWFyIFNXUyAqLwotCQl2YWwgPSB0cGE2MTMwYTJfcmVhZChUUEE2MTMwQTJfUkVHX0NPTlRST0wpOwotCQl2YWwgJj0gflRQQTYxMzBBMl9TV1M7Ci0JCXRwYTYxMzBhMl9pMmNfd3JpdGUoVFBBNjEzMEEyX1JFR19DT05UUk9MLCB2YWwpOwotCX0gZWxzZSBpZiAoIXBvd2VyICYmIGRhdGEtPnBvd2VyX3N0YXRlKSB7CisJfSBlbHNlIHsKIAkJLyogc2V0IFNXUyAqLwogCQl2YWwgPSB0cGE2MTMwYTJfcmVhZChUUEE2MTMwQTJfUkVHX0NPTlRST0wpOwogCQl2YWwgfD0gVFBBNjEzMEEyX1NXUzsKQEAgLTMwMCw2ICsyOTYsNyBAQAogCQkvKiBFbmFibGUgYW1wbGlmaWVyICovCiAJCXZhbCA9IHRwYTYxMzBhMl9yZWFkKFRQQTYxMzBBMl9SRUdfQ09OVFJPTCk7CiAJCXZhbCB8PSBjaGFubmVsOworCQl2YWwgJj0gflRQQTYxMzBBMl9TV1M7CiAJCXRwYTYxMzBhMl9pMmNfd3JpdGUoVFBBNjEzMEEyX1JFR19DT05UUk9MLCB2YWwpOwogCiAJCS8qIFVubXV0ZSBjaGFubmVsICovCkBAIC0zMjAsNzIgKzMxNywyNCBAQAogCX0KIH0KIAotc3RhdGljIGludCB0cGE2MTMwYTJfbGVmdF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCXRwYTYxMzBhMl9jaGFubmVsX2VuYWJsZShUUEE2MTMwQTJfSFBfRU5fTCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQl0cGE2MTMwYTJfY2hhbm5lbF9lbmFibGUoVFBBNjEzMEEyX0hQX0VOX0wsIDApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBhNjEzMGEyX3JpZ2h0X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJdHBhNjEzMGEyX2NoYW5uZWxfZW5hYmxlKFRQQTYxMzBBMl9IUF9FTl9SLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXRwYTYxMzBhMl9jaGFubmVsX2VuYWJsZShUUEE2MTMwQTJfSFBfRU5fUiwgMCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0cGE2MTMwYTJfc3VwcGx5X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoraW50IHRwYTYxMzBhMl9zdGVyZW9fZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKIHsKIAlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwlpZiAoZW5hYmxlKSB7CiAJCXJldCA9IHRwYTYxMzBhMl9wb3dlcigxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJdHBhNjEzMGEyX2NoYW5uZWxfZW5hYmxlKFRQQTYxMzBBMl9IUF9FTl9SIHwgVFBBNjEzMEEyX0hQX0VOX0wsCisJCQkJCSAxKTsKKwl9IGVsc2UgeworCQl0cGE2MTMwYTJfY2hhbm5lbF9lbmFibGUoVFBBNjEzMEEyX0hQX0VOX1IgfCBUUEE2MTMwQTJfSFBfRU5fTCwKKwkJCQkJIDApOwogCQlyZXQgPSB0cGE2MTMwYTJfcG93ZXIoMCk7Ci0JCWJyZWFrOwogCX0KKwogCXJldHVybiByZXQ7CiB9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0cGE2MTMwYTJfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX1BHQV9FKCJUUEE2MTMwQTIgTGVmdCIsIFNORF9TT0NfTk9QTSwKLQkJCTAsIDAsIE5VTEwsIDAsIHRwYTYxMzBhMl9sZWZ0X2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VfFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJUUEE2MTMwQTIgUmlnaHQiLCBTTkRfU09DX05PUE0sCi0JCQkwLCAwLCBOVUxMLCAwLCB0cGE2MTMwYTJfcmlnaHRfZXZlbnQsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVV8U05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJUUEE2MTMwQTIgRW5hYmxlIiwgU05EX1NPQ19OT1BNLAotCQkJMCwgMCwgdHBhNjEzMGEyX3N1cHBseV9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVXxTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCS8qIE91dHB1dHMgKi8KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJUUEE2MTMwQTIgSGVhZHBob25lIExlZnQiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJUUEE2MTMwQTIgSGVhZHBob25lIFJpZ2h0IiksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19tYXBbXSA9IHsKLQl7IlRQQTYxMzBBMiBIZWFkcGhvbmUgTGVmdCIsIE5VTEwsICJUUEE2MTMwQTIgTGVmdCJ9LAotCXsiVFBBNjEzMEEyIEhlYWRwaG9uZSBSaWdodCIsIE5VTEwsICJUUEE2MTMwQTIgUmlnaHQifSwKLQotCXsiVFBBNjEzMEEyIEhlYWRwaG9uZSBMZWZ0IiwgTlVMTCwgIlRQQTYxMzBBMiBFbmFibGUifSwKLQl7IlRQQTYxMzBBMiBIZWFkcGhvbmUgUmlnaHQiLCBOVUxMLCAiVFBBNjEzMEEyIEVuYWJsZSJ9LAotfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHRwYTYxMzBhMl9zdGVyZW9fZW5hYmxlKTsKIAogaW50IHRwYTYxMzBhMl9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewpAQCAtMzk2LDE4ICszNDUsMTIgQEAKIAogCWRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEodHBhNjEzMGEyX2NsaWVudCk7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB0cGE2MTMwYTJfZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUodHBhNjEzMGEyX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQogCWlmIChkYXRhLT5pZCA9PSBUUEE2MTQwQTIpCiAJCXJldHVybiBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHBhNjE0MGEyX2NvbnRyb2xzLAogCQkJCQkJQVJSQVlfU0laRSh0cGE2MTQwYTJfY29udHJvbHMpKTsKIAllbHNlCiAJCXJldHVybiBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdHBhNjEzMGEyX2NvbnRyb2xzLAogCQkJCQkJQVJSQVlfU0laRSh0cGE2MTMwYTJfY29udHJvbHMpKTsKLQogfQogRVhQT1JUX1NZTUJPTF9HUEwodHBhNjEzMGEyX2FkZF9jb250cm9scyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmggYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5oCmluZGV4IDU3ZTg2N2YuLjVkZjQ5YzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuaApAQCAtNTcsNSArNTcsNiBAQAogI2RlZmluZSBUUEE2MTMwQTJfVkVSU0lPTl9NQVNLCQkoMHgwZikKIAogZXh0ZXJuIGludCB0cGE2MTMwYTJfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CitleHRlcm4gaW50IHRwYTYxMzBhMl9zdGVyZW9fZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSk7CiAKICNlbmRpZiAvKiBfX1RQQTYxMzBBMl9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggY2JlYmVjNi4uZTRkNDY0YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTIzMyw2ICsyMzIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHR3bDQwMzBfd2FpdF9tcyhpbnQgdGltZSkKK3sKKwlpZiAodGltZSA8IDYwKSB7CisJCXRpbWUgKj0gMTAwMDsKKwkJdXNsZWVwX3JhbmdlKHRpbWUsIHRpbWUgKyA1MDApOworCX0gZWxzZSB7CisJCW1zbGVlcCh0aW1lKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHR3bDQwMzBfY29kZWNfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CkBAIC0zMzgsMTAgKzM0NywxNCBAQAogCXR3bDQwMzBfd3JpdGUoY29kZWMsIFRXTDQwMzBfUkVHX0FOQU1JQ0wsCiAJCXJlZyB8IFRXTDQwMzBfQ05DTF9PRkZTRVRfU1RBUlQpOwogCi0JLyogd2FpdCBmb3Igb2Zmc2V0IGNhbmNlbGxhdGlvbiB0byBjb21wbGV0ZSAqLworCS8qCisJICogV2FpdCBmb3Igb2Zmc2V0IGNhbmNlbGxhdGlvbiB0byBjb21wbGV0ZS4KKwkgKiBTaW5jZSB0aGlzIHRha2VzIGEgd2hpbGUsIGRvIG5vdCBzbGFtIHRoZSBpMmMuCisJICogU3RhcnQgcG9sbGluZyB0aGUgc3RhdHVzIGFmdGVyIH4yMG1zLgorCSAqLworCW1zbGVlcCgyMCk7CiAJZG8gewotCQkvKiB0aGlzIHRha2VzIGEgbGl0dGxlIHdoaWxlLCBzbyBkb24ndCBzbGFtIGkyYyAqLwotCQl1ZGVsYXkoMjAwMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJdHdsX2kyY19yZWFkX3U4KFRXTDQwMzBfTU9EVUxFX0FVRElPX1ZPSUNFLCAmYnl0ZSwKIAkJCQkgICAgVFdMNDAzMF9SRUdfQU5BTUlDTCk7CiAJfSB3aGlsZSAoKGkrKyA8IDEwMCkgJiYKQEAgLTcyNSw5ICs3MzgsMTIgQEAKIAkvKiBCYXNlIHZhbHVlcyBmb3IgcmFtcCBkZWxheSBjYWxjdWxhdGlvbjogMl4xOSAtIDJeMjYgKi8KIAl1bnNpZ25lZCBpbnQgcmFtcF9iYXNlW10gPSB7NTI0Mjg4LCAxMDQ4NTc2LCAyMDk3MTUyLCA0MTk0MzA0LAogCQkJCSAgICA4Mzg4NjA4LCAxNjc3NzIxNiwgMzM1NTQ0MzIsIDY3MTA4ODY0fTsKKwl1bnNpZ25lZCBpbnQgZGVsYXk7CiAKIAloc19nYWluID0gdHdsNDAzMF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNDAzMF9SRUdfSFNfR0FJTl9TRVQpOwogCWhzX3BvcCA9IHR3bDQwMzBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDQwMzBfUkVHX0hTX1BPUE5fU0VUKTsKKwlkZWxheSA9IChyYW1wX2Jhc2VbKGhzX3BvcCAmIFRXTDQwMzBfUkFNUF9ERUxBWSkgPj4gMl0gLworCQl0d2w0MDMwLT5zeXNjbGspICsgMTsKIAogCS8qIEVuYWJsZSBleHRlcm5hbCBtdXRlIGNvbnRyb2wsIHRoaXMgZHJhbWF0aWNhbGx5IHJlZHVjZXMKIAkgKiB0aGUgcG9wLW5vaXNlICovCkBAIC03NTEsMTYgKzc2NywxNCBAQAogCQloc19wb3AgfD0gVFdMNDAzMF9SQU1QX0VOOwogCQl0d2w0MDMwX3dyaXRlKGNvZGVjLCBUV0w0MDMwX1JFR19IU19QT1BOX1NFVCwgaHNfcG9wKTsKIAkJLyogV2FpdCByYW1wIGRlbGF5IHRpbWUgKyAxLCBzbyB0aGUgVk1JRCBjYW4gc2V0dGxlICovCi0JCW1kZWxheSgocmFtcF9iYXNlWyhoc19wb3AgJiBUV0w0MDMwX1JBTVBfREVMQVkpID4+IDJdIC8KLQkJCXR3bDQwMzAtPnN5c2NsaykgKyAxKTsKKwkJdHdsNDAzMF93YWl0X21zKGRlbGF5KTsKIAl9IGVsc2UgewogCQkvKiBIZWFkc2V0IHJhbXAtZG93biBfbm90XyBhY2NvcmRpbmcgdG8KIAkJICogdGhlIFRSTSwgYnV0IGluIGEgd2F5IHRoYXQgaXQgaXMgd29ya2luZyAqLwogCQloc19wb3AgJj0gflRXTDQwMzBfUkFNUF9FTjsKIAkJdHdsNDAzMF93cml0ZShjb2RlYywgVFdMNDAzMF9SRUdfSFNfUE9QTl9TRVQsIGhzX3BvcCk7CiAJCS8qIFdhaXQgcmFtcCBkZWxheSB0aW1lICsgMSwgc28gdGhlIFZNSUQgY2FuIHNldHRsZSAqLwotCQltZGVsYXkoKHJhbXBfYmFzZVsoaHNfcG9wICYgVFdMNDAzMF9SQU1QX0RFTEFZKSA+PiAyXSAvCi0JCQl0d2w0MDMwLT5zeXNjbGspICsgMSk7CisJCXR3bDQwMzBfd2FpdF9tcyhkZWxheSk7CiAJCS8qIEJ5cGFzcyB0aGUgcmVnX2NhY2hlIHRvIG11dGUgdGhlIGhlYWRzZXQgKi8KIAkJdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwKIAkJCQkJaHNfZ2FpbiAmICh+MHgwZiksCkBAIC04MzUsNyArODQ5LDcgQEAKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YSh3LT5jb2RlYyk7CiAKIAlpZiAodHdsNDAzMC0+ZGlnaW1pY19kZWxheSkKLQkJbWRlbGF5KHR3bDQwMzAtPmRpZ2ltaWNfZGVsYXkpOworCQl0d2w0MDMwX3dhaXRfbXModHdsNDAzMC0+ZGlnaW1pY19kZWxheSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MjEsMTAgKzE2MzUsMTEgQEAKIAogc3RhdGljIGludCB0d2w0MDMwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB0d2w0MDMwX2RhcG1fd2lkZ2V0cywKLQkJCQkgQVJSQVlfU0laRSh0d2w0MDMwX2RhcG1fd2lkZ2V0cykpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdHdsNDAzMF9kYXBtX3dpZGdldHMsCisJCQkJIEFSUkFZX1NJWkUodHdsNDAzMF9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjM4LDE0ICsxNjUzLDE0IEBACiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpCiAJCQl0d2w0MDMwX2NvZGVjX2VuYWJsZShjb2RlYywgMSk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKIAkJdHdsNDAzMF9jb2RlY19lbmFibGUoY29kZWMsIDApOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MDksNiArMTcyNCw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNDAzMF9wcml2ICp0d2w0MDMwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHN1YnN0cmVhbS0+cnVudGltZSwgMCwgMzIsIDI0KTsKIAlpZiAodHdsNDAzMC0+bWFzdGVyX3N1YnN0cmVhbSkgewogCQl0d2w0MDMwLT5zbGF2ZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJCS8qIFRoZSBEQUkgaGFzIG9uZSBjb25maWd1cmF0aW9uIGZvciBwbGF5YmFjayBhbmQgY2FwdHVyZSwgc28KQEAgLTE4MzMsNyArMTg0OSw3IEBACiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKIAkJZm9ybWF0IHw9IFRXTDQwMzBfREFUQV9XSURUSF8xNlNfMTZXOwogCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CiAJCWZvcm1hdCB8PSBUV0w0MDMwX0RBVEFfV0lEVEhfMzJTXzI0VzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTIxNjYsNyArMjE4Miw3IEBACiB9CiAKICNkZWZpbmUgVFdMNDAzMF9SQVRFUwkgKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDApCi0jZGVmaW5lIFRXTDQwMzBfRk9STUFUUwkgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCisjZGVmaW5lIFRXTDQwMzBfRk9STUFUUwkgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHR3bDQwMzBfZGFpX2hpZmlfb3BzID0gewogCS5zdGFydHVwCT0gdHdsNDAzMF9zdGFydHVwLApAQCAtMjI0NSw3ICsyMjYxLDcgQEAKIAlzbmRfc29jX2NvZGVjX3NldF9kcnZkYXRhKGNvZGVjLCB0d2w0MDMwKTsKIAkvKiBTZXQgdGhlIGRlZmF1bHRzLCBhbmQgcG93ZXIgdXAgdGhlIGNvZGVjICovCiAJdHdsNDAzMC0+c3lzY2xrID0gdHdsNDAzMF9jb2RlY19nZXRfbWNsaygpIC8gMTAwMDsKLQljb2RlYy0+aWRsZV9iaWFzX29mZiA9IDE7CisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAKIAl0d2w0MDMwX2luaXRfY2hpcChjb2RlYyk7CiAKQEAgLTIyNTcsOSArMjI3MywxMiBAQAogCiBzdGF0aWMgaW50IHR3bDQwMzBfc29jX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHR3bDQwMzBfcHJpdiAqdHdsNDAzMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCiAJLyogUmVzZXQgcmVnaXN0ZXJzIHRvIHRoZWlyIGNoaXAgZGVmYXVsdCBiZWZvcmUgbGVhdmluZyAqLwogCXR3bDQwMzBfcmVzZXRfcmVnaXN0ZXJzKGNvZGVjKTsKIAl0d2w0MDMwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwlrZnJlZSh0d2w0MDMwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI5MSwxMCArMjMxMCw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IHR3bDQwMzBfY29kZWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHR3bDQwMzBfcHJpdiAqdHdsNDAzMCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKLQlrZnJlZSh0d2w0MDMwKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYwppbmRleCAxMGY2ZTUyLi40YmJmMWIxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYwpAQCAtMzQsMTQgKzM0LDQ2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCiAjaW5jbHVkZSAidHdsNjA0MC5oIgogCi0jZGVmaW5lIFRXTDYwNDBfUkFURVMJIChTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwKQotI2RlZmluZSBUV0w2MDQwX0ZPUk1BVFMJIChTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKyNkZWZpbmUgVFdMNjA0MF9SQVRFUwkJU05EUlZfUENNX1JBVEVfODAwMF85NjAwMAorI2RlZmluZSBUV0w2MDQwX0ZPUk1BVFMJKFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCisjZGVmaW5lIFRXTDYwNDBfT1VUSFNfMGRCIDB4MDAKKyNkZWZpbmUgVFdMNjA0MF9PVVRIU19NMzBkQiAweDBGCisjZGVmaW5lIFRXTDYwNDBfT1VUSEZfMGRCIDB4MDMKKyNkZWZpbmUgVFdMNjA0MF9PVVRIRl9NNTJkQiAweDFECisKKyNkZWZpbmUgVFdMNjA0MF9SQU1QX05PTkUJMAorI2RlZmluZSBUV0w2MDQwX1JBTVBfVVAJCTEKKyNkZWZpbmUgVFdMNjA0MF9SQU1QX0RPV04JMgorCisjZGVmaW5lIFRXTDYwNDBfSFNMX1ZPTF9NQVNLCTB4MEYKKyNkZWZpbmUgVFdMNjA0MF9IU0xfVk9MX1NISUZUCTAKKyNkZWZpbmUgVFdMNjA0MF9IU1JfVk9MX01BU0sJMHhGMAorI2RlZmluZSBUV0w2MDQwX0hTUl9WT0xfU0hJRlQJNAorI2RlZmluZSBUV0w2MDQwX0hGX1ZPTF9NQVNLCTB4MUYKKyNkZWZpbmUgVFdMNjA0MF9IRl9WT0xfU0hJRlQJMAorCitzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgeworCXUxNiBhY3RpdmU7CisJdTE2IGxlZnRfdm9sOworCXUxNiByaWdodF92b2w7CisJdTE2IGxlZnRfc3RlcDsKKwl1MTYgcmlnaHRfc3RlcDsKKwl1bnNpZ25lZCBpbnQgc3RlcF9kZWxheTsKKwl1MTYgcmFtcDsKKwl1MTYgbXV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiByYW1wX2RvbmU7Cit9OworCitzdHJ1Y3QgdHdsNjA0MF9qYWNrX2RhdGEgeworCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJaW50IHJlcG9ydDsKK307CiAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHR3bDYwNDBfZGF0YSB7CkBAIC01Myw2ICs4NSwxNyBAQAogCXVuc2lnbmVkIGludCBzeXNjbGs7CiAJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0ICpzeXNjbGtfY29uc3RyYWludHM7CiAJc3RydWN0IGNvbXBsZXRpb24gcmVhZHk7CisJc3RydWN0IHR3bDYwNDBfamFja19kYXRhIGhzX2phY2s7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisJc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7CisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVjdCB0d2w2MDQwX291dHB1dCBoZWFkc2V0OworCXN0cnVjdCB0d2w2MDQwX291dHB1dCBoYW5kc2ZyZWU7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmhmX3dvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqaHNfd29ya3F1ZXVlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHNfZGVsYXllZF93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaGZfZGVsYXllZF93b3JrOwogfTsKIAogLyoKQEAgLTIwMSw3ICsyNDQsNyBAQAogCWlmIChyZWcgPj0gVFdMNjA0MF9DQUNIRVJFR05VTSkKIAkJcmV0dXJuIC1FSU87CiAKLQl0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfQVVESU9fVk9JQ0UsICZ2YWx1ZSwgcmVnKTsKKwl0d2xfaTJjX3JlYWRfdTgoVFdMX01PRFVMRV9BVURJT19WT0lDRSwgJnZhbHVlLCByZWcpOwogCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKIAogCXJldHVybiB2YWx1ZTsKQEAgLTIxNyw3ICsyNjAsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCXR3bDYwNDBfd3JpdGVfcmVnX2NhY2hlKGNvZGVjLCByZWcsIHZhbHVlKTsKLQlyZXR1cm4gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9BVURJT19WT0lDRSwgdmFsdWUsIHJlZyk7CisJcmV0dXJuIHR3bF9pMmNfd3JpdGVfdTgoVFdMX01PRFVMRV9BVURJT19WT0lDRSwgdmFsdWUsIHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIHR3bDYwNDBfaW5pdF92aW9fcmVncyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCkBAIC0yNTQsNiArMjk3LDMwNSBAQAogCX0KIH0KIAorLyoKKyAqIFJhbXAgSFMgUEdBIHZvbHVtZSB0byBtaW5pbWlzZSBwb3BzIGF0IHN0cmVhbSBzdGFydHVwIGFuZCBzaHV0ZG93bi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdHdsNjA0MF9oc19yYW1wX3N0ZXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJdW5zaWduZWQgaW50IGxlZnRfc3RlcCwgdW5zaWduZWQgaW50IHJpZ2h0X3N0ZXApCit7CisKKwlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpoZWFkc2V0ID0gJnByaXYtPmhlYWRzZXQ7CisJaW50IGxlZnRfY29tcGxldGUgPSAwLCByaWdodF9jb21wbGV0ZSA9IDA7CisJdTggcmVnLCB2YWw7CisKKwkvKiBsZWZ0IGNoYW5uZWwgKi8KKwlsZWZ0X3N0ZXAgPSAobGVmdF9zdGVwID4gMHhGKSA/IDB4RiA6IGxlZnRfc3RlcDsKKwlyZWcgPSB0d2w2MDQwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19IU0dBSU4pOworCXZhbCA9ICh+cmVnICYgVFdMNjA0MF9IU0xfVk9MX01BU0spOworCisJaWYgKGhlYWRzZXQtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX1VQKSB7CisJCS8qIHJhbXAgc3RlcCB1cCAqLworCQlpZiAodmFsIDwgaGVhZHNldC0+bGVmdF92b2wpIHsKKwkJCXZhbCArPSBsZWZ0X3N0ZXA7CisJCQlyZWcgJj0gflRXTDYwNDBfSFNMX1ZPTF9NQVNLOworCQkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfSFNHQUlOLAorCQkJCQkocmVnIHwgKH52YWwgJiBUV0w2MDQwX0hTTF9WT0xfTUFTSykpKTsKKwkJfSBlbHNlIHsKKwkJCWxlZnRfY29tcGxldGUgPSAxOworCQl9CisJfSBlbHNlIGlmIChoZWFkc2V0LT5yYW1wID09IFRXTDYwNDBfUkFNUF9ET1dOKSB7CisJCS8qIHJhbXAgc3RlcCBkb3duICovCisJCWlmICh2YWwgPiAweDApIHsKKwkJCXZhbCAtPSBsZWZ0X3N0ZXA7CisJCQlyZWcgJj0gflRXTDYwNDBfSFNMX1ZPTF9NQVNLOworCQkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfSFNHQUlOLCByZWcgfAorCQkJCQkJKH52YWwgJiBUV0w2MDQwX0hTTF9WT0xfTUFTSykpOworCQl9IGVsc2UgeworCQkJbGVmdF9jb21wbGV0ZSA9IDE7CisJCX0KKwl9CisKKwkvKiByaWdodCBjaGFubmVsICovCisJcmlnaHRfc3RlcCA9IChyaWdodF9zdGVwID4gMHhGKSA/IDB4RiA6IHJpZ2h0X3N0ZXA7CisJcmVnID0gdHdsNjA0MF9yZWFkX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSFNHQUlOKTsKKwl2YWwgPSAofnJlZyAmIFRXTDYwNDBfSFNSX1ZPTF9NQVNLKSA+PiBUV0w2MDQwX0hTUl9WT0xfU0hJRlQ7CisKKwlpZiAoaGVhZHNldC0+cmFtcCA9PSBUV0w2MDQwX1JBTVBfVVApIHsKKwkJLyogcmFtcCBzdGVwIHVwICovCisJCWlmICh2YWwgPCBoZWFkc2V0LT5yaWdodF92b2wpIHsKKwkJCXZhbCArPSByaWdodF9zdGVwOworCQkJcmVnICY9IH5UV0w2MDQwX0hTUl9WT0xfTUFTSzsKKwkJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTR0FJTiwKKwkJCQkocmVnIHwgKH52YWwgPDwgVFdMNjA0MF9IU1JfVk9MX1NISUZUKSkpOworCQl9IGVsc2UgeworCQkJcmlnaHRfY29tcGxldGUgPSAxOworCQl9CisJfSBlbHNlIGlmIChoZWFkc2V0LT5yYW1wID09IFRXTDYwNDBfUkFNUF9ET1dOKSB7CisJCS8qIHJhbXAgc3RlcCBkb3duICovCisJCWlmICh2YWwgPiAweDApIHsKKwkJCXZhbCAtPSByaWdodF9zdGVwOworCQkJcmVnICY9IH5UV0w2MDQwX0hTUl9WT0xfTUFTSzsKKwkJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hTR0FJTiwKKwkJCQkJIHJlZyB8ICh+dmFsIDw8IFRXTDYwNDBfSFNSX1ZPTF9TSElGVCkpOworCQl9IGVsc2UgeworCQkJcmlnaHRfY29tcGxldGUgPSAxOworCQl9CisJfQorCisJcmV0dXJuIGxlZnRfY29tcGxldGUgJiByaWdodF9jb21wbGV0ZTsKK30KKworLyoKKyAqIFJhbXAgSEYgUEdBIHZvbHVtZSB0byBtaW5pbWlzZSBwb3BzIGF0IHN0cmVhbSBzdGFydHVwIGFuZCBzaHV0ZG93bi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdHdsNjA0MF9oZl9yYW1wX3N0ZXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJdW5zaWduZWQgaW50IGxlZnRfc3RlcCwgdW5zaWduZWQgaW50IHJpZ2h0X3N0ZXApCit7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB0d2w2MDQwX291dHB1dCAqaGFuZHNmcmVlID0gJnByaXYtPmhhbmRzZnJlZTsKKwlpbnQgbGVmdF9jb21wbGV0ZSA9IDAsIHJpZ2h0X2NvbXBsZXRlID0gMDsKKwl1MTYgcmVnLCB2YWw7CisKKwkvKiBsZWZ0IGNoYW5uZWwgKi8KKwlsZWZ0X3N0ZXAgPSAobGVmdF9zdGVwID4gMHgxRCkgPyAweDFEIDogbGVmdF9zdGVwOworCXJlZyA9IHR3bDYwNDBfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGTEdBSU4pOworCXJlZyA9IDB4MUQgLSByZWc7CisJdmFsID0gKHJlZyAmIFRXTDYwNDBfSEZfVk9MX01BU0spOworCWlmIChoYW5kc2ZyZWUtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX1VQKSB7CisJCS8qIHJhbXAgc3RlcCB1cCAqLworCQlpZiAodmFsIDwgaGFuZHNmcmVlLT5sZWZ0X3ZvbCkgeworCQkJdmFsICs9IGxlZnRfc3RlcDsKKwkJCXJlZyAmPSB+VFdMNjA0MF9IRl9WT0xfTUFTSzsKKwkJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGTEdBSU4sCisJCQkJCQlyZWcgfCAoMHgxRCAtIHZhbCkpOworCQl9IGVsc2UgeworCQkJbGVmdF9jb21wbGV0ZSA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKGhhbmRzZnJlZS0+cmFtcCA9PSBUV0w2MDQwX1JBTVBfRE9XTikgeworCQkvKiByYW1wIHN0ZXAgZG93biAqLworCQlpZiAodmFsID4gMCkgeworCQkJdmFsIC09IGxlZnRfc3RlcDsKKwkJCXJlZyAmPSB+VFdMNjA0MF9IRl9WT0xfTUFTSzsKKwkJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGTEdBSU4sCisJCQkJCQlyZWcgfCAoMHgxRCAtIHZhbCkpOworCQl9IGVsc2UgeworCQkJbGVmdF9jb21wbGV0ZSA9IDE7CisJCX0KKwl9CisKKwkvKiByaWdodCBjaGFubmVsICovCisJcmlnaHRfc3RlcCA9IChyaWdodF9zdGVwID4gMHgxRCkgPyAweDFEIDogcmlnaHRfc3RlcDsKKwlyZWcgPSB0d2w2MDQwX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBUV0w2MDQwX1JFR19IRlJHQUlOKTsKKwlyZWcgPSAweDFEIC0gcmVnOworCXZhbCA9IChyZWcgJiBUV0w2MDQwX0hGX1ZPTF9NQVNLKTsKKwlpZiAoaGFuZHNmcmVlLT5yYW1wID09IFRXTDYwNDBfUkFNUF9VUCkgeworCQkvKiByYW1wIHN0ZXAgdXAgKi8KKwkJaWYgKHZhbCA8IGhhbmRzZnJlZS0+cmlnaHRfdm9sKSB7CisJCQl2YWwgKz0gcmlnaHRfc3RlcDsKKwkJCXJlZyAmPSB+VFdMNjA0MF9IRl9WT0xfTUFTSzsKKwkJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGUkdBSU4sCisJCQkJCQlyZWcgfCAoMHgxRCAtIHZhbCkpOworCQl9IGVsc2UgeworCQkJcmlnaHRfY29tcGxldGUgPSAxOworCQl9CisJfSBlbHNlIGlmIChoYW5kc2ZyZWUtPnJhbXAgPT0gVFdMNjA0MF9SQU1QX0RPV04pIHsKKwkJLyogcmFtcCBzdGVwIGRvd24gKi8KKwkJaWYgKHZhbCA+IDApIHsKKwkJCXZhbCAtPSByaWdodF9zdGVwOworCQkJcmVnICY9IH5UV0w2MDQwX0hGX1ZPTF9NQVNLOworCQkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfSEZSR0FJTiwKKwkJCQkJCXJlZyB8ICgweDFEIC0gdmFsKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gbGVmdF9jb21wbGV0ZSAmIHJpZ2h0X2NvbXBsZXRlOworfQorCisvKgorICogVGhpcyB3b3JrIHJhbXBzIGJvdGggb3V0cHV0IFBHQXMgYXQgc3RyZWFtIHN0YXJ0L3N0b3AgdGltZSB0bworICogbWluaW1pc2UgcG9wIGFzc29jaWF0ZWQgd2l0aCBEQVBNIHBvd2VyIHN3aXRjaGluZy4KKyAqLworc3RhdGljIHZvaWQgdHdsNjA0MF9wZ2FfaHNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHdsNjA0MF9kYXRhLCBoc19kZWxheWVkX3dvcmsud29yayk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcHJpdi0+Y29kZWM7CisJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpoZWFkc2V0ID0gJnByaXYtPmhlYWRzZXQ7CisJdW5zaWduZWQgaW50IGRlbGF5ID0gaGVhZHNldC0+c3RlcF9kZWxheTsKKwlpbnQgaSwgaGVhZHNldF9jb21wbGV0ZTsKKworCS8qIGRvIHdlIG5lZWQgdG8gcmFtcCBhdCBhbGwgPyAqLworCWlmIChoZWFkc2V0LT5yYW1wID09IFRXTDYwNDBfUkFNUF9OT05FKQorCQlyZXR1cm47CisKKwkvKiBIUyBQR0Egdm9sdW1lcyBoYXZlIDQgYml0cyBvZiByZXNvbHV0aW9uIHRvIHJhbXAgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspIHsKKwkJaGVhZHNldF9jb21wbGV0ZSA9IDE7CisJCWlmIChoZWFkc2V0LT5yYW1wICE9IFRXTDYwNDBfUkFNUF9OT05FKQorCQkJaGVhZHNldF9jb21wbGV0ZSA9IHR3bDYwNDBfaHNfcmFtcF9zdGVwKGNvZGVjLAorCQkJCQkJCWhlYWRzZXQtPmxlZnRfc3RlcCwKKwkJCQkJCQloZWFkc2V0LT5yaWdodF9zdGVwKTsKKworCQkvKiByYW1wIGZpbmlzaGVkID8gKi8KKwkJaWYgKGhlYWRzZXRfY29tcGxldGUpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBUT0RPOiB0dW5lOiBkZWxheSBpcyBsb25nZXIgb3ZlciAwZEIKKwkJICogYXMgaW5jcmVhc2VzIGFyZSBsYXJnZXIuCisJCSAqLworCQlpZiAoaSA+PSA4KQorCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkgKworCQkJCQkJCShkZWxheSA+PiAxKSkpOworCQllbHNlCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCX0KKworCWlmIChoZWFkc2V0LT5yYW1wID09IFRXTDYwNDBfUkFNUF9ET1dOKSB7CisJCWhlYWRzZXQtPmFjdGl2ZSA9IDA7CisJCWNvbXBsZXRlKCZoZWFkc2V0LT5yYW1wX2RvbmUpOworCX0gZWxzZSB7CisJCWhlYWRzZXQtPmFjdGl2ZSA9IDE7CisJfQorCWhlYWRzZXQtPnJhbXAgPSBUV0w2MDQwX1JBTVBfTk9ORTsKK30KKworc3RhdGljIHZvaWQgdHdsNjA0MF9wZ2FfaGZfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHdsNjA0MF9kYXRhLCBoZl9kZWxheWVkX3dvcmsud29yayk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcHJpdi0+Y29kZWM7CisJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpoYW5kc2ZyZWUgPSAmcHJpdi0+aGFuZHNmcmVlOworCXVuc2lnbmVkIGludCBkZWxheSA9IGhhbmRzZnJlZS0+c3RlcF9kZWxheTsKKwlpbnQgaSwgaGFuZHNmcmVlX2NvbXBsZXRlOworCisJLyogZG8gd2UgbmVlZCB0byByYW1wIGF0IGFsbCA/ICovCisJaWYgKGhhbmRzZnJlZS0+cmFtcCA9PSBUV0w2MDQwX1JBTVBfTk9ORSkKKwkJcmV0dXJuOworCisJLyogSEYgUEdBIHZvbHVtZXMgaGF2ZSA1IGJpdHMgb2YgcmVzb2x1dGlvbiB0byByYW1wICovCisJZm9yIChpID0gMDsgaSA8PSAzMjsgaSsrKSB7CisJCWhhbmRzZnJlZV9jb21wbGV0ZSA9IDE7CisJCWlmIChoYW5kc2ZyZWUtPnJhbXAgIT0gVFdMNjA0MF9SQU1QX05PTkUpCisJCQloYW5kc2ZyZWVfY29tcGxldGUgPSB0d2w2MDQwX2hmX3JhbXBfc3RlcChjb2RlYywKKwkJCQkJCQloYW5kc2ZyZWUtPmxlZnRfc3RlcCwKKwkJCQkJCQloYW5kc2ZyZWUtPnJpZ2h0X3N0ZXApOworCisJCS8qIHJhbXAgZmluaXNoZWQgPyAqLworCQlpZiAoaGFuZHNmcmVlX2NvbXBsZXRlKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVE9ETzogdHVuZTogZGVsYXkgaXMgbG9uZ2VyIG92ZXIgMGRCCisJCSAqIGFzIGluY3JlYXNlcyBhcmUgbGFyZ2VyLgorCQkgKi8KKwkJaWYgKGkgPj0gMTYpCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSArCisJCQkJCQkgICAgICAgKGRlbGF5ID4+IDEpKSk7CisJCWVsc2UKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7CisJfQorCisKKwlpZiAoaGFuZHNmcmVlLT5yYW1wID09IFRXTDYwNDBfUkFNUF9ET1dOKSB7CisJCWhhbmRzZnJlZS0+YWN0aXZlID0gMDsKKwkJY29tcGxldGUoJmhhbmRzZnJlZS0+cmFtcF9kb25lKTsKKwl9IGVsc2UKKwkJaGFuZHNmcmVlLT5hY3RpdmUgPSAxOworCWhhbmRzZnJlZS0+cmFtcCA9IFRXTDYwNDBfUkFNUF9OT05FOworfQorCitzdGF0aWMgaW50IHBnYV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdy0+Y29kZWM7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB0d2w2MDQwX291dHB1dCAqb3V0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgKndvcms7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnF1ZXVlOworCisJc3dpdGNoICh3LT5zaGlmdCkgeworCWNhc2UgMjoKKwljYXNlIDM6CisJCW91dCA9ICZwcml2LT5oZWFkc2V0OworCQl3b3JrID0gJnByaXYtPmhzX2RlbGF5ZWRfd29yazsKKwkJcXVldWUgPSBwcml2LT5oc193b3JrcXVldWU7CisJCW91dC0+c3RlcF9kZWxheSA9IDU7CS8qIDUgbXMgYmV0d2VlbiB2b2x1bWUgcmFtcCBzdGVwcyAqLworCQlicmVhazsKKwljYXNlIDQ6CisJCW91dCA9ICZwcml2LT5oYW5kc2ZyZWU7CisJCXdvcmsgPSAmcHJpdi0+aGZfZGVsYXllZF93b3JrOworCQlxdWV1ZSA9IHByaXYtPmhmX3dvcmtxdWV1ZTsKKwkJb3V0LT5zdGVwX2RlbGF5ID0gNTsJLyogNSBtcyBiZXR3ZWVuIHZvbHVtZSByYW1wIHN0ZXBzICovCisJCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQorCQkJcHJpdi0+bm9uX2xwKys7CisJCWVsc2UKKwkJCXByaXYtPm5vbl9scC0tOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlpZiAob3V0LT5hY3RpdmUpCisJCQlicmVhazsKKworCQkvKiBkb24ndCB1c2Ugdm9sdW1lIHJhbXAgZm9yIHBvd2VyLXVwICovCisJCW91dC0+bGVmdF9zdGVwID0gb3V0LT5sZWZ0X3ZvbDsKKwkJb3V0LT5yaWdodF9zdGVwID0gb3V0LT5yaWdodF92b2w7CisKKwkJaWYgKCFkZWxheWVkX3dvcmtfcGVuZGluZyh3b3JrKSkgeworCQkJb3V0LT5yYW1wID0gVFdMNjA0MF9SQU1QX1VQOworCQkJcXVldWVfZGVsYXllZF93b3JrKHF1ZXVlLCB3b3JrLAorCQkJCQltc2Vjc190b19qaWZmaWVzKDEpKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWlmICghb3V0LT5hY3RpdmUpCisJCQlicmVhazsKKworCQlpZiAoIWRlbGF5ZWRfd29ya19wZW5kaW5nKHdvcmspKSB7CisJCQkvKiB1c2Ugdm9sdW1lIHJhbXAgZm9yIHBvd2VyLWRvd24gKi8KKwkJCW91dC0+bGVmdF9zdGVwID0gMTsKKwkJCW91dC0+cmlnaHRfc3RlcCA9IDE7CisJCQlvdXQtPnJhbXAgPSBUV0w2MDQwX1JBTVBfRE9XTjsKKwkJCUlOSVRfQ09NUExFVElPTihvdXQtPnJhbXBfZG9uZSk7CisKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhxdWV1ZSwgd29yaywKKwkJCQkJbXNlY3NfdG9famlmZmllcygxKSk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb3V0LT5yYW1wX2RvbmUsCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiAvKiB0d2w2MDQwIGNvZGVjIG1hbnVhbCBwb3dlci11cCBzZXF1ZW5jZSAqLwogc3RhdGljIHZvaWQgdHdsNjA0MF9wb3dlcl91cChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CkBAIC0zODIsNiArNzI0LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgdHdsNjA0MF9oc19qYWNrX3JlcG9ydChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywgaW50IHJlcG9ydCkKK3sKKwlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHN0YXR1czsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKworCS8qIFN5bmMgc3RhdHVzICovCisJc3RhdHVzID0gdHdsNjA0MF9yZWFkX3JlZ192b2xhdGlsZShjb2RlYywgVFdMNjA0MF9SRUdfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgVFdMNjA0MF9QTFVHQ09NUCkKKwkJc25kX3NvY19qYWNrX3JlcG9ydChqYWNrLCByZXBvcnQsIHJlcG9ydCk7CisJZWxzZQorCQlzbmRfc29jX2phY2tfcmVwb3J0KGphY2ssIDAsIHJlcG9ydCk7CisKKwltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKK30KKwordm9pZCB0d2w2MDQwX2hzX2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgcmVwb3J0KQoreworCXN0cnVjdCB0d2w2MDQwX2RhdGEgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgdHdsNjA0MF9qYWNrX2RhdGEgKmhzX2phY2sgPSAmcHJpdi0+aHNfamFjazsKKworCWhzX2phY2stPmphY2sgPSBqYWNrOworCWhzX2phY2stPnJlcG9ydCA9IHJlcG9ydDsKKworCXR3bDYwNDBfaHNfamFja19yZXBvcnQoY29kZWMsIGhzX2phY2stPmphY2ssIGhzX2phY2stPnJlcG9ydCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0d2w2MDQwX2hzX2phY2tfZGV0ZWN0KTsKKworc3RhdGljIHZvaWQgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQlzdHJ1Y3QgdHdsNjA0MF9kYXRhLCBkZWxheWVkX3dvcmsud29yayk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcHJpdi0+Y29kZWM7CisJc3RydWN0IHR3bDYwNDBfamFja19kYXRhICpoc19qYWNrID0gJnByaXYtPmhzX2phY2s7CisKKwl0d2w2MDQwX2hzX2phY2tfcmVwb3J0KGNvZGVjLCBoc19qYWNrLT5qYWNrLCBoc19qYWNrLT5yZXBvcnQpOworfQorCiAvKiBhdWRpbyBpbnRlcnJ1cHQgaGFuZGxlciAqLwogc3RhdGljIGlycXJldHVybl90IHR3bDYwNDBfbmF1ZGludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CkBAIC0zODksMzMgKzc3MiwxODAgQEAKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdTggaW50aWQ7CiAKLQl0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfQVVESU9fVk9JQ0UsICZpbnRpZCwgVFdMNjA0MF9SRUdfSU5USUQpOworCXR3bF9pMmNfcmVhZF91OChUV0xfTU9EVUxFX0FVRElPX1ZPSUNFLCAmaW50aWQsIFRXTDYwNDBfUkVHX0lOVElEKTsKIAotCXN3aXRjaCAoaW50aWQpIHsKLQljYXNlIFRXTDYwNDBfVEhJTlQ6CisJaWYgKGludGlkICYgVFdMNjA0MF9USElOVCkKIAkJZGV2X2FsZXJ0KGNvZGVjLT5kZXYsICJkaWUgdGVtcCBvdmVyLWxpbWl0IGRldGVjdGlvblxuIik7Ci0JCWJyZWFrOwotCWNhc2UgVFdMNjA0MF9QTFVHSU5UOgotCWNhc2UgVFdMNjA0MF9VTlBMVUdJTlQ6Ci0JY2FzZSBUV0w2MDQwX0hPT0tJTlQ6Ci0JCWJyZWFrOwotCWNhc2UgVFdMNjA0MF9IRklOVDoKKworCWlmICgoaW50aWQgJiBUV0w2MDQwX1BMVUdJTlQpIHx8IChpbnRpZCAmIFRXTDYwNDBfVU5QTFVHSU5UKSkKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmRlbGF5ZWRfd29yaywKKwkJCQkJCQltc2Vjc190b19qaWZmaWVzKDIwMCkpOworCisJaWYgKGludGlkICYgVFdMNjA0MF9IT09LSU5UKQorCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiaG9vayBkZXRlY3Rpb25cbiIpOworCisJaWYgKGludGlkICYgVFdMNjA0MF9IRklOVCkKIAkJZGV2X2FsZXJ0KGNvZGVjLT5kZXYsICJoZiBkcml2ZXJzIG92ZXIgY3VycmVudCBkZXRlY3Rpb25cbiIpOwotCQlicmVhazsKLQljYXNlIFRXTDYwNDBfVklCSU5UOgorCisJaWYgKGludGlkICYgVFdMNjA0MF9WSUJJTlQpCiAJCWRldl9hbGVydChjb2RlYy0+ZGV2LCAidmliIGRyaXZlcnMgb3ZlciBjdXJyZW50IGRldGVjdGlvblxuIik7Ci0JCWJyZWFrOwotCWNhc2UgVFdMNjA0MF9SRUFEWUlOVDoKKworCWlmIChpbnRpZCAmIFRXTDYwNDBfUkVBRFlJTlQpCiAJCWNvbXBsZXRlKCZwcml2LT5yZWFkeSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgInVua25vd24gYXVkaW8gaW50ZXJydXB0ICVkXG4iLCBpbnRpZCk7Ci0JCWJyZWFrOwotCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCB0d2w2MDQwX3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9IE5VTEw7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCisJLyogRm9yIEhTIGFuZCBIRiB3ZSBzaGFkb3cgdGhlIHZhbHVlcyBhbmQgb25seSBhY3R1YWxseSB3cml0ZQorCSAqIHRoZW0gb3V0IHdoZW4gYWN0aXZlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgYW1wbGlmaWVyIGNvbWVzIG9uCisJICogYXMgcXVpZXRseSBhcyBwb3NzaWJsZS4gKi8KKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgVFdMNjA0MF9SRUdfSFNHQUlOOgorCQlvdXQgPSAmdHdsNjA0MF9wcml2LT5oZWFkc2V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAob3V0KSB7CisJCW91dC0+bGVmdF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJb3V0LT5yaWdodF92b2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwkJaWYgKCFvdXQtPmFjdGl2ZSkKKwkJCXJldHVybiAxOworCX0KKworCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0d2w2MDQwX2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqdHdsNjA0MF9wcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpvdXQgPSAmdHdsNjA0MF9wcml2LT5oZWFkc2V0OworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJdW5zaWduZWQgaW50IHJlZyA9IG1jLT5yZWc7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgVFdMNjA0MF9SRUdfSFNHQUlOOgorCQlvdXQgPSAmdHdsNjA0MF9wcml2LT5oZWFkc2V0OworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG91dC0+bGVmdF92b2w7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gb3V0LT5yaWdodF92b2w7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfZ2V0X3ZvbHN3KGtjb250cm9sLCB1Y29udHJvbCk7Cit9CisKK3N0YXRpYyBpbnQgdHdsNjA0MF9wdXRfdm9sc3dfMnJfdnUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHR3bDYwNDBfZGF0YSAqdHdsNjA0MF9wcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHR3bDYwNDBfb3V0cHV0ICpvdXQgPSBOVUxMOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgcmVnID0gbWMtPnJlZzsKKworCS8qIEZvciBIUyBhbmQgSEYgd2Ugc2hhZG93IHRoZSB2YWx1ZXMgYW5kIG9ubHkgYWN0dWFsbHkgd3JpdGUKKwkgKiB0aGVtIG91dCB3aGVuIGFjdGl2ZSBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGFtcGxpZmllciBjb21lcyBvbgorCSAqIGFzIHF1aWV0bHkgYXMgcG9zc2libGUuICovCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFRXTDYwNDBfUkVHX0hGTEdBSU46CisJY2FzZSBUV0w2MDQwX1JFR19IRlJHQUlOOgorCQlvdXQgPSAmdHdsNjA0MF9wcml2LT5oYW5kc2ZyZWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChvdXQpIHsKKwkJb3V0LT5sZWZ0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlvdXQtPnJpZ2h0X3ZvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCQlpZiAoIW91dC0+YWN0aXZlKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0ID0gc25kX3NvY19wdXRfdm9sc3dfMnIoa2NvbnRyb2wsIHVjb250cm9sKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHR3bDYwNDBfZ2V0X3ZvbHN3XzJyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgdHdsNjA0MF9kYXRhICp0d2w2MDQwX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgdHdsNjA0MF9vdXRwdXQgKm91dCA9ICZ0d2w2MDQwX3ByaXYtPmhhbmRzZnJlZTsKKwlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KKwkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOworCisJLyogSWYgdGhlc2UgYXJlIGNhY2hlZCByZWdpc3RlcnMgdXNlIHRoZSBjYWNoZSAqLworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBUV0w2MDQwX1JFR19IRkxHQUlOOgorCWNhc2UgVFdMNjA0MF9SRUdfSEZSR0FJTjoKKwkJb3V0ID0gJnR3bDYwNDBfcHJpdi0+aGFuZHNmcmVlOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG91dC0+bGVmdF92b2w7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gb3V0LT5yaWdodF92b2w7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNuZF9zb2NfZ2V0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7Cit9CisKKy8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLworI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfVExWKHhuYW1lLCB4cmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgeG1heCxcCisJCQkJCQkJeGludmVydCwgdGx2X2FycmF5KVwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8XAorCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSxcCisJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywgLmdldCA9IHR3bDYwNDBfZ2V0X3ZvbHN3LCBcCisJLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3LCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCQl7LnJlZyA9IHhyZWcsIC5zaGlmdCA9IHNoaWZ0X2xlZnQsIC5yc2hpZnQgPSBzaGlmdF9yaWdodCxcCisJCSAubWF4ID0geG1heCwgLnBsYXRmb3JtX21heCA9IHhtYXgsIC5pbnZlcnQgPSB4aW52ZXJ0fSB9CisKKy8qIGRvdWJsZSBjb250cm9sIHdpdGggdm9sdW1lIHVwZGF0ZSAqLworI2RlZmluZSBTT0NfVFdMNjA0MF9ET1VCTEVfUl9UTFYoeG5hbWUsIHJlZ19sZWZ0LCByZWdfcmlnaHQsIHhzaGlmdCwgeG1heCxcCisJCQkJeGludmVydCwgdGx2X2FycmF5KVwKK3sJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSxcCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8IFwKKwkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8IFwKKwkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLCBcCisJLnRsdi5wID0gKHRsdl9hcnJheSksIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzd18yciwgXAorCS5nZXQgPSB0d2w2MDQwX2dldF92b2xzd18yciwgLnB1dCA9IHR3bDYwNDBfcHV0X3ZvbHN3XzJyX3Z1LCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCkgXAorCQl7LnJlZyA9IHJlZ19sZWZ0LCAucnJlZyA9IHJlZ19yaWdodCwgLnNoaWZ0ID0geHNoaWZ0LCBcCisJCSAucnNoaWZ0ID0geHNoaWZ0LCAubWF4ID0geG1heCwgLmludmVydCA9IHhpbnZlcnR9LCB9CisKIC8qCiAgKiBNSUNBVFQgdm9sdW1lIGNvbnRyb2w6CiAgKiBmcm9tIC02IHRvIDAgZEIgaW4gNiBkQiBzdGVwcwpAQCAtNDI0LDkgKzk1NCwxNSBAQAogCiAvKgogICogTUlDR0FJTiB2b2x1bWUgY29udHJvbDoKLSAqIGZyb20gNiB0byAzMCBkQiBpbiA2IGRCIHN0ZXBzCisgKiBmcm9tIC02IHRvIDMwIGRCIGluIDYgZEIgc3RlcHMKICAqLwotc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG1pY19hbXBfdGx2LCA2MDAsIDYwMCwgMCk7CitzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUobWljX2FtcF90bHYsIC02MDAsIDYwMCwgMCk7CisKKy8qCisgKiBBRk1HQUlOIHZvbHVtZSBjb250cm9sOgorICogZnJvbSAxOCB0byAyNCBkQiBpbiA2IGRCIHN0ZXBzCisgKi8KK3N0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZm1fYW1wX3RsdiwgMTgwMCwgNjAwLCAwKTsKIAogLyoKICAqIEhTR0FJTiB2b2x1bWUgY29udHJvbDoKQEAgLTQ1NSw4ICs5OTEsMzAgQEAKIAl7IkhlYWRzZXQgTWljIiwgIlN1YiBNaWMiLCAiQXV4L0ZNIFJpZ2h0IiwgIk9mZiJ9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19NSUNMQ1RMLCAzLCAzLCB0d2w2MDQwX2FtaWNsX3RleHRzKSwKLQlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfTUlDUkNUTCwgMywgMywgdHdsNjA0MF9hbWljcl90ZXh0cyksCisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX01JQ0xDVEwsIDMsIDQsIHR3bDYwNDBfYW1pY2xfdGV4dHMpLAorCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19NSUNSQ1RMLCAzLCA0LCB0d2w2MDQwX2FtaWNyX3RleHRzKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp0d2w2MDQwX2hzX3RleHRzW10gPSB7CisJIk9mZiIsICJIUyBEQUMiLCAiTGluZS1JbiBhbXAiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR3bDYwNDBfaHNfZW51bVtdID0geworCVNPQ19FTlVNX1NJTkdMRShUV0w2MDQwX1JFR19IU0xDVEwsIDUsIEFSUkFZX1NJWkUodHdsNjA0MF9oc190ZXh0cyksCisJCQl0d2w2MDQwX2hzX3RleHRzKSwKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfSFNSQ1RMLCA1LCBBUlJBWV9TSVpFKHR3bDYwNDBfaHNfdGV4dHMpLAorCQkJdHdsNjA0MF9oc190ZXh0cyksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqdHdsNjA0MF9oZl90ZXh0c1tdID0geworCSJPZmYiLCAiSEYgREFDIiwgIkxpbmUtSW4gYW1wIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w2MDQwX2hmX2VudW1bXSA9IHsKKwlTT0NfRU5VTV9TSU5HTEUoVFdMNjA0MF9SRUdfSEZMQ1RMLCAyLCBBUlJBWV9TSVpFKHR3bDYwNDBfaGZfdGV4dHMpLAorCQkJdHdsNjA0MF9oZl90ZXh0cyksCisJU09DX0VOVU1fU0lOR0xFKFRXTDYwNDBfUkVHX0hGUkNUTCwgMiwgQVJSQVlfU0laRSh0d2w2MDQwX2hmX3RleHRzKSwKKwkJCXR3bDYwNDBfaGZfdGV4dHMpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFtaWNsX2NvbnRyb2wgPQpAQCAtNDY2LDE4ICsxMDI0LDE4IEBACiAJU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w2MDQwX2VudW1bMV0pOwogCiAvKiBIZWFkc2V0IERBQyBwbGF5YmFjayBzd2l0Y2hlcyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhzZGFjbF9zd2l0Y2hfY29udHJvbHMgPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgVFdMNjA0MF9SRUdfSFNMQ1RMLCA1LCAxLCAwKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoc2xfbXV4X2NvbnRyb2xzID0KKwlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDYwNDBfaHNfZW51bVswXSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoc2RhY3Jfc3dpdGNoX2NvbnRyb2xzID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRXTDYwNDBfUkVHX0hTUkNUTCwgNSwgMSwgMCk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHNyX211eF9jb250cm9scyA9CisJU09DX0RBUE1fRU5VTSgiUm91dGUiLCB0d2w2MDQwX2hzX2VudW1bMV0pOwogCiAvKiBIYW5kc2ZyZWUgREFDIHBsYXliYWNrIHN3aXRjaGVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGZkYWNsX3N3aXRjaF9jb250cm9scyA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBUV0w2MDQwX1JFR19IRkxDVEwsIDIsIDEsIDApOworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhmbF9tdXhfY29udHJvbHMgPQorCVNPQ19EQVBNX0VOVU0oIlJvdXRlIiwgdHdsNjA0MF9oZl9lbnVtWzBdKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhmZGFjcl9zd2l0Y2hfY29udHJvbHMgPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgVFdMNjA0MF9SRUdfSEZSQ1RMLCAyLCAxLCAwKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZnJfbXV4X2NvbnRyb2xzID0KKwlTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHR3bDYwNDBfaGZfZW51bVsxXSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzID0KIAlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFRXTDYwNDBfUkVHX0VBUkNUTCwgMCwgMSwgMCk7CkBAIC00ODksMTAgKzEwNDcsMTQgQEAKIAlTT0NfRE9VQkxFX1RMVigiQ2FwdHVyZSBWb2x1bWUiLAogCQlUV0w2MDQwX1JFR19NSUNHQUlOLCAwLCAzLCA0LCAwLCBtaWNfYW1wX3RsdiksCiAKKwkvKiBBRk0gZ2FpbnMgKi8KKwlTT0NfRE9VQkxFX1RMVigiQXV4IEZNIFZvbHVtZSIsCisJCVRXTDYwNDBfUkVHX0xJTkVHQUlOLCAwLCA0LCAweEYsIDAsIGFmbV9hbXBfdGx2KSwKKwogCS8qIFBsYXliYWNrIGdhaW5zICovCi0JU09DX0RPVUJMRV9UTFYoIkhlYWRzZXQgUGxheWJhY2sgVm9sdW1lIiwKKwlTT0NfVFdMNjA0MF9ET1VCTEVfVExWKCJIZWFkc2V0IFBsYXliYWNrIFZvbHVtZSIsCiAJCVRXTDYwNDBfUkVHX0hTR0FJTiwgMCwgNCwgMHhGLCAxLCBoc190bHYpLAotCVNPQ19ET1VCTEVfUl9UTFYoIkhhbmRzZnJlZSBQbGF5YmFjayBWb2x1bWUiLAorCVNPQ19UV0w2MDQwX0RPVUJMRV9SX1RMVigiSGFuZHNmcmVlIFBsYXliYWNrIFZvbHVtZSIsCiAJCVRXTDYwNDBfUkVHX0hGTEdBSU4sIFRXTDYwNDBfUkVHX0hGUkdBSU4sIDAsIDB4MUQsIDEsIGhmX3RsdiksCiAJU09DX1NJTkdMRV9UTFYoIkVhcnBob25lIFBsYXliYWNrIFZvbHVtZSIsCiAJCVRXTDYwNDBfUkVHX0VBUkNUTCwgMSwgMHhGLCAxLCBlcF90bHYpLApAQCAtNTI1LDYgKzEwODcsMTIgQEAKIAlTTkRfU09DX0RBUE1fUEdBKCJNaWNBbXBSIiwKIAkJCVRXTDYwNDBfUkVHX01JQ1JDVEwsIDAsIDAsIE5VTEwsIDApLAogCisJLyogQXV4aWxpYXJ5IEZNIFBHQXMgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJBRk1BbXBMIiwKKwkJCVRXTDYwNDBfUkVHX01JQ0xDVEwsIDEsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkFGTUFtcFIiLAorCQkJVFdMNjA0MF9SRUdfTUlDUkNUTCwgMSwgMCwgTlVMTCwgMCksCisKIAkvKiBBRENzICovCiAJU05EX1NPQ19EQVBNX0FEQygiQURDIExlZnQiLCAiTGVmdCBGcm9udCBDYXB0dXJlIiwKIAkJCVRXTDYwNDBfUkVHX01JQ0xDVEwsIDIsIDApLApAQCAtNTU5LDI5ICsxMTI3LDMzIEBACiAJCQl0d2w2MDQwX3Bvd2VyX21vZGVfZXZlbnQsCiAJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCi0JLyogQW5hbG9nIHBsYXliYWNrIHN3aXRjaGVzICovCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiSFNEQUMgTGVmdCBQbGF5YmFjayIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc2RhY2xfc3dpdGNoX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJIU0RBQyBSaWdodCBQbGF5YmFjayIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc2RhY3Jfc3dpdGNoX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJIRkRBQyBMZWZ0IFBsYXliYWNrIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMCwgJmhmZGFjbF9zd2l0Y2hfY29udHJvbHMpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkhGREFDIFJpZ2h0IFBsYXliYWNrIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMCwgJmhmZGFjcl9zd2l0Y2hfY29udHJvbHMpLAorCVNORF9TT0NfREFQTV9NVVgoIkhGIExlZnQgUGxheWJhY2siLAorCQkJU05EX1NPQ19OT1BNLCAwLCAwLCAmaGZsX211eF9jb250cm9scyksCisJU05EX1NPQ19EQVBNX01VWCgiSEYgUmlnaHQgUGxheWJhY2siLAorCQkJU05EX1NPQ19OT1BNLCAwLCAwLCAmaGZyX211eF9jb250cm9scyksCisJLyogQW5hbG9nIHBsYXliYWNrIE11eGVzICovCisJU05EX1NPQ19EQVBNX01VWCgiSFMgTGVmdCBQbGF5YmFjayIsCisJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc2xfbXV4X2NvbnRyb2xzKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJIUyBSaWdodCBQbGF5YmFjayIsCisJCQlTTkRfU09DX05PUE0sIDAsIDAsICZoc3JfbXV4X2NvbnRyb2xzKSwKIAogCS8qIEFuYWxvZyBwbGF5YmFjayBkcml2ZXJzICovCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJIYW5kc2ZyZWUgTGVmdCBEcml2ZXIiLAorCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhhbmRzZnJlZSBMZWZ0IERyaXZlciIsCiAJCQlUV0w2MDQwX1JFR19IRkxDVEwsIDQsIDAsIE5VTEwsIDAsCi0JCQl0d2w2MDQwX3Bvd2VyX21vZGVfZXZlbnQsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9QR0FfRSgiSGFuZHNmcmVlIFJpZ2h0IERyaXZlciIsCisJCQlwZ2FfZXZlbnQsCisJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisJU05EX1NPQ19EQVBNX09VVF9EUlZfRSgiSGFuZHNmcmVlIFJpZ2h0IERyaXZlciIsCiAJCQlUV0w2MDQwX1JFR19IRlJDVEwsIDQsIDAsIE5VTEwsIDAsCi0JCQl0d2w2MDQwX3Bvd2VyX21vZGVfZXZlbnQsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9QR0EoIkhlYWRzZXQgTGVmdCBEcml2ZXIiLAotCQkJVFdMNjA0MF9SRUdfSFNMQ1RMLCAyLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fUEdBKCJIZWFkc2V0IFJpZ2h0IERyaXZlciIsCi0JCQlUV0w2MDQwX1JFR19IU1JDVEwsIDIsIDAsIE5VTEwsIDApLAorCQkJcGdhX2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhlYWRzZXQgTGVmdCBEcml2ZXIiLAorCQkJVFdMNjA0MF9SRUdfSFNMQ1RMLCAyLCAwLCBOVUxMLCAwLAorCQkJcGdhX2V2ZW50LAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCVNORF9TT0NfREFQTV9PVVRfRFJWX0UoIkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwKKwkJCVRXTDYwNDBfUkVHX0hTUkNUTCwgMiwgMCwgTlVMTCwgMCwKKwkJCXBnYV9ldmVudCwKKwkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKIAlTTkRfU09DX0RBUE1fU1dJVENIX0UoIkVhcnBob25lIERyaXZlciIsCiAJCQlTTkRfU09DX05PUE0sIDAsIDAsICZlcF9kcml2ZXJfc3dpdGNoX2NvbnRyb2xzLAogCQkJdHdsNjA0MF9wb3dlcl9tb2RlX2V2ZW50LApAQCAtNjExLDEyICsxMTgzLDE4IEBACiAJeyJBREMgTGVmdCIsIE5VTEwsICJNaWNBbXBMIn0sCiAJeyJBREMgUmlnaHQiLCBOVUxMLCAiTWljQW1wUiJ9LAogCi0JLyogSGVhZHNldCBwbGF5YmFjayBwYXRoICovCi0JeyJIU0RBQyBMZWZ0IFBsYXliYWNrIiwgIlN3aXRjaCIsICJIU0RBQyBMZWZ0In0sCi0JeyJIU0RBQyBSaWdodCBQbGF5YmFjayIsICJTd2l0Y2giLCAiSFNEQUMgUmlnaHQifSwKKwkvKiBBRk0gcGF0aCAqLworCXsiQUZNQW1wTCIsICJOVUxMIiwgIkFGTUwifSwKKwl7IkFGTUFtcFIiLCAiTlVMTCIsICJBRk1SIn0sCiAKLQl7IkhlYWRzZXQgTGVmdCBEcml2ZXIiLCBOVUxMLCAiSFNEQUMgTGVmdCBQbGF5YmFjayJ9LAotCXsiSGVhZHNldCBSaWdodCBEcml2ZXIiLCBOVUxMLCAiSFNEQUMgUmlnaHQgUGxheWJhY2sifSwKKwl7IkhTIExlZnQgUGxheWJhY2siLCAiSFMgREFDIiwgIkhTREFDIExlZnQifSwKKwl7IkhTIExlZnQgUGxheWJhY2siLCAiTGluZS1JbiBhbXAiLCAiQUZNQW1wTCJ9LAorCisJeyJIUyBSaWdodCBQbGF5YmFjayIsICJIUyBEQUMiLCAiSFNEQUMgUmlnaHQifSwKKwl7IkhTIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKKworCXsiSGVhZHNldCBMZWZ0IERyaXZlciIsICJOVUxMIiwgIkhTIExlZnQgUGxheWJhY2sifSwKKwl7IkhlYWRzZXQgUmlnaHQgRHJpdmVyIiwgIk5VTEwiLCAiSFMgUmlnaHQgUGxheWJhY2sifSwKIAogCXsiSFNPTCIsIE5VTEwsICJIZWFkc2V0IExlZnQgRHJpdmVyIn0sCiAJeyJIU09SIiwgTlVMTCwgIkhlYWRzZXQgUmlnaHQgRHJpdmVyIn0sCkBAIC02MjUsMTIgKzEyMDMsMTQgQEAKIAl7IkVhcnBob25lIERyaXZlciIsICJTd2l0Y2giLCAiSFNEQUMgTGVmdCJ9LAogCXsiRVAiLCBOVUxMLCAiRWFycGhvbmUgRHJpdmVyIn0sCiAKLQkvKiBIYW5kc2ZyZWUgcGxheWJhY2sgcGF0aCAqLwotCXsiSEZEQUMgTGVmdCBQbGF5YmFjayIsICJTd2l0Y2giLCAiSEZEQUMgTGVmdCJ9LAotCXsiSEZEQUMgUmlnaHQgUGxheWJhY2siLCAiU3dpdGNoIiwgIkhGREFDIFJpZ2h0In0sCisJeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkhGIERBQyIsICJIRkRBQyBMZWZ0In0sCisJeyJIRiBMZWZ0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcEwifSwKIAotCXsiSEZEQUMgTGVmdCBQR0EiLCBOVUxMLCAiSEZEQUMgTGVmdCBQbGF5YmFjayJ9LAotCXsiSEZEQUMgUmlnaHQgUEdBIiwgTlVMTCwgIkhGREFDIFJpZ2h0IFBsYXliYWNrIn0sCisJeyJIRiBSaWdodCBQbGF5YmFjayIsICJIRiBEQUMiLCAiSEZEQUMgUmlnaHQifSwKKwl7IkhGIFJpZ2h0IFBsYXliYWNrIiwgIkxpbmUtSW4gYW1wIiwgIkFGTUFtcFIifSwKKworCXsiSEZEQUMgTGVmdCBQR0EiLCBOVUxMLCAiSEYgTGVmdCBQbGF5YmFjayJ9LAorCXsiSEZEQUMgUmlnaHQgUEdBIiwgTlVMTCwgIkhGIFJpZ2h0IFBsYXliYWNrIn0sCiAKIAl7IkhhbmRzZnJlZSBMZWZ0IERyaXZlciIsICJTd2l0Y2giLCAiSEZEQUMgTGVmdCBQR0EifSwKIAl7IkhhbmRzZnJlZSBSaWdodCBEcml2ZXIiLCAiU3dpdGNoIiwgIkhGREFDIFJpZ2h0IFBHQSJ9LApAQCAtNjQxLDEyICsxMjIxLDEyIEBACiAKIHN0YXRpYyBpbnQgdHdsNjA0MF9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgdHdsNjA0MF9kYXBtX3dpZGdldHMsCisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0d2w2MDQwX2RhcG1fd2lkZ2V0cywKIAkJCQkgQVJSQVlfU0laRSh0d2w2MDQwX2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7Ci0KLQlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTksMTAgKzEyMzksMTAgQEAKIAl1OCBpbnRpZDsKIAogCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcHJpdi0+cmVhZHksCi0JCQkJbXNlY3NfdG9famlmZmllcyg0OCkpOworCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTQ0KSk7CiAKIAlpZiAoIXRpbWVfbGVmdCkgewotCQl0d2xfaTJjX3JlYWRfdTgoVFdMNDAzMF9NT0RVTEVfQVVESU9fVk9JQ0UsICZpbnRpZCwKKwkJdHdsX2kyY19yZWFkX3U4KFRXTF9NT0RVTEVfQVVESU9fVk9JQ0UsICZpbnRpZCwKIAkJCQkJCQlUV0w2MDQwX1JFR19JTlRJRCk7CiAJCWlmICghKGludGlkICYgVFdMNjA0MF9SRUFEWUlOVCkpIHsKIAkJCWRldl9lcnIoY29kZWMtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgUkVBRFlJTlRcbiIpOwpAQCAtNzEzLDYgKzEyOTMsMTUgQEAKIAogCQkvKiBpbml0aWFsaXplIHZkZC92c3MgcmVnaXN0ZXJzIHdpdGggcmVnX2NhY2hlICovCiAJCXR3bDYwNDBfaW5pdF92ZGRfcmVncyhjb2RlYyk7CisKKwkJLyogU2V0IGV4dGVybmFsIGJvb3N0IEdQTyAqLworCQl0d2w2MDQwX3dyaXRlKGNvZGVjLCBUV0w2MDQwX1JFR19HUE9DVEwsIDB4MDIpOworCisJCS8qIFNldCBpbml0aWFsIG1pbmltYWwgZ2FpbiB2YWx1ZXMgKi8KKwkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfSFNHQUlOLCAweEZGKTsKKwkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfRUFSQ1RMLCAweDFFKTsKKwkJdHdsNjA0MF93cml0ZShjb2RlYywgVFdMNjA0MF9SRUdfSEZMR0FJTiwgMHgxRCk7CisJCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0hGUkdBSU4sIDB4MUQpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCWlmICghcHJpdi0+Y29kZWNfcG93ZXJlZCkKQEAgLTczOSw3ICsxMzI4LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc3MiwyMyArMTM2MSw2IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlpZiAoIXByaXYtPnN5c2NsaykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkibm8gbWNsayBjb25maWd1cmVkLCBjYWxsIHNldF9zeXNjbGsoKSBvbiBpbml0XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBjYXB0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgYXQgMTcuNjQgTUh6LAotCSAqIGl0J3MgcmVzZXJ2ZWQgZm9yIGhlYWRzZXQgbG93LXBvd2VyIHBsYXliYWNrIHNjZW5hcmlvCi0JICovCi0JaWYgKChwcml2LT5zeXNjbGsgPT0gMTc2NDAwMDApICYmIHN1YnN0cmVhbS0+c3RyZWFtKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSJjYXB0dXJlIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBhdCAlZEh6XG4iLAotCQkJcHJpdi0+c3lzY2xrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAogCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCXByaXYtPnN5c2Nsa19jb25zdHJhaW50cyk7CkBAIC04MTQsMTAgKzEzODYsMTcgQEAKIAogCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwogCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgMTEyNTA6CisJY2FzZSAyMjUwMDoKKwljYXNlIDQ0MTAwOgogCWNhc2UgODgyMDA6CiAJCWxwcGxsY3RsIHw9IFRXTDYwNDBfTFBMTEZJTjsKIAkJcHJpdi0+c3lzY2xrID0gMTc2NDAwMDA7CiAJCWJyZWFrOworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgMzIwMDA6CisJY2FzZSA0ODAwMDoKIAljYXNlIDk2MDAwOgogCQlscHBsbGN0bCAmPSB+VFdMNjA0MF9MUExMRklOOwogCQlwcml2LT5zeXNjbGsgPSAxOTIwMDAwMDsKQEAgLTgzMiwzMSArMTQxMSwzNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHR3bDYwNDBfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCWludCBjbWQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQorc3RhdGljIGludCB0d2w2MDQwX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3QgdHdsNjA0MF9kYXRhICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCS8qCi0JCSAqIGxvdy1wb3dlciBwbGF5YmFjayBtb2RlIGlzIHJlc3RyaWN0ZWQKLQkJICogZm9yIGhlYWRzZXQgcGF0aCBvbmx5Ci0JCSAqLwotCQlpZiAoKHByaXYtPnN5c2NsayA9PSAxNzY0MDAwMCkgJiYgcHJpdi0+bm9uX2xwKSB7CisJaWYgKCFwcml2LT5zeXNjbGspIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJIm5vIG1jbGsgY29uZmlndXJlZCwgY2FsbCBzZXRfc3lzY2xrKCkgb24gaW5pdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogY2FwdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGF0IDE3LjY0IE1IeiwKKwkgKiBpdCdzIHJlc2VydmVkIGZvciBoZWFkc2V0IGxvdy1wb3dlciBwbGF5YmFjayBzY2VuYXJpbworCSAqLworCWlmICgocHJpdi0+c3lzY2xrID09IDE3NjQwMDAwKSAmJgorCQkJc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCSJjYXB0dXJlIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBhdCAlZEh6XG4iLAorCQkJcHJpdi0+c3lzY2xrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwcml2LT5zeXNjbGsgPT0gMTc2NDAwMDApICYmIHByaXYtPm5vbl9scCkgewogCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAogCQkJCSJzb21lIGVuYWJsZWQgcGF0aHMgYXJlbid0IHN1cHBvcnRlZCBhdCAlZEh6XG4iLAogCQkJCXByaXYtPnN5c2Nsayk7CiAJCQlyZXR1cm4gLUVQRVJNOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwogCX0KLQogCXJldHVybiAwOwogfQogCkBAIC05NzAsNyArMTU1NSw3IEBACiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB0d2w2MDQwX2RhaV9vcHMgPSB7CiAJLnN0YXJ0dXAJPSB0d2w2MDQwX3N0YXJ0dXAsCiAJLmh3X3BhcmFtcwk9IHR3bDYwNDBfaHdfcGFyYW1zLAotCS50cmlnZ2VyCT0gdHdsNjA0MF90cmlnZ2VyLAorCS5wcmVwYXJlCT0gdHdsNjA0MF9wcmVwYXJlLAogCS5zZXRfc3lzY2xrCT0gdHdsNjA0MF9zZXRfZGFpX3N5c2NsaywKIH07CiAKQEAgLTEwMDQsNiArMTU4OSw3IEBACiBzdGF0aWMgaW50IHR3bDYwNDBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAl0d2w2MDQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJdHdsNjA0MF9zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPmRhcG0uc3VzcGVuZF9iaWFzX2xldmVsKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAxOCwyNCArMTYwNCw0MSBAQAogCXN0cnVjdCB0d2w2MDQwX2RhdGEgKnByaXY7CiAJaW50IGF1ZHB3cm9uLCBuYXVkaW50OwogCWludCByZXQgPSAwOworCXU4IGljcmV2LCBpbnRtciA9IFRXTDYwNDBfQUxMSU5UX01TSzsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHdsNjA0MF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHByaXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgcHJpdik7CiAKLQlpZiAodHdsX2NvZGVjKSB7CisJcHJpdi0+Y29kZWMgPSBjb2RlYzsKKworCXR3bF9pMmNfcmVhZF91OChUV0xfTU9EVUxFX0FVRElPX1ZPSUNFLCAmaWNyZXYsIFRXTDYwNDBfUkVHX0FTSUNSRVYpOworCisJaWYgKHR3bF9jb2RlYyAmJiAoaWNyZXYgPiAwKSkKIAkJYXVkcHdyb24gPSB0d2xfY29kZWMtPmF1ZHB3cm9uX2dwaW87Ci0JCW5hdWRpbnQgPSB0d2xfY29kZWMtPm5hdWRpbnRfaXJxOwotCX0gZWxzZSB7CisJZWxzZQogCQlhdWRwd3JvbiA9IC1FSU5WQUw7CisKKwlpZiAodHdsX2NvZGVjKQorCQluYXVkaW50ID0gdHdsX2NvZGVjLT5uYXVkaW50X2lycTsKKwllbHNlCiAJCW5hdWRpbnQgPSAwOwotCX0KIAogCXByaXYtPmF1ZHB3cm9uID0gYXVkcHdyb247CiAJcHJpdi0+bmF1ZGludCA9IG5hdWRpbnQ7CisJcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInR3bDYwNDAtY29kZWMiKTsKKworCWlmICghcHJpdi0+d29ya3F1ZXVlKQorCQlnb3RvIHdvcmtfZXJyOworCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmRlbGF5ZWRfd29yaywgdHdsNjA0MF9hY2Nlc3Nvcnlfd29yayk7CisKKwltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CiAKIAlpbml0X2NvbXBsZXRpb24oJnByaXYtPnJlYWR5KTsKKwlpbml0X2NvbXBsZXRpb24oJnByaXYtPmhlYWRzZXQucmFtcF9kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJnByaXYtPmhhbmRzZnJlZS5yYW1wX2RvbmUpOwogCiAJaWYgKGdwaW9faXNfdmFsaWQoYXVkcHdyb24pKSB7CiAJCXJldCA9IGdwaW9fcmVxdWVzdChhdWRwd3JvbiwgImF1ZHB3cm9uIik7CkBAIC0xMDQ3LDcgKzE2NTAsMTQgQEAKIAkJCWdvdG8gZ3BpbzJfZXJyOwogCiAJCXByaXYtPmNvZGVjX3Bvd2VyZWQgPSAwOworCisJCS8qIGVuYWJsZSBvbmx5IGNvZGVjIHJlYWR5IGludGVycnVwdCAqLworCQlpbnRtciAmPSB+KFRXTDYwNDBfUkVBRFlNU0sgfCBUV0w2MDQwX1BMVUdNU0spOworCisJCS8qIHJlc2V0IGludGVycnVwdCBzdGF0dXMgdG8gYWxsb3cgY29ycmVjdCBwb3dlciB1cCBzZXF1ZW5jZSAqLworCQl0d2w2MDQwX3JlYWRfcmVnX3ZvbGF0aWxlKGNvZGVjLCBUV0w2MDQwX1JFR19JTlRJRCk7CiAJfQorCXR3bDYwNDBfd3JpdGUoY29kZWMsIFRXTDYwNDBfUkVHX0lOVE1SLCBpbnRtcik7CiAKIAlpZiAobmF1ZGludCkgewogCQkvKiBhdWRpbyBpbnRlcnJ1cHQgKi8KQEAgLTEwNTcsMjUgKzE2NjcsMjkgQEAKIAkJCQkidHdsNjA0MF9jb2RlYyIsIGNvZGVjKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZ3BpbzJfZXJyOwotCX0gZWxzZSB7Ci0JCWlmIChncGlvX2lzX3ZhbGlkKGF1ZHB3cm9uKSkgewotCQkJLyogZW5hYmxlIG9ubHkgY29kZWMgcmVhZHkgaW50ZXJydXB0ICovCi0JCQl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSU5UTVIsCi0JCQkJCX5UV0w2MDQwX1JFQURZTVNLICYgVFdMNjA0MF9BTExJTlRfTVNLKTsKLQkJfSBlbHNlIHsKLQkJCS8qIG5vIGludGVycnVwdHMgYXQgYWxsICovCi0JCQl0d2w2MDQwX3dyaXRlX3JlZ19jYWNoZShjb2RlYywgVFdMNjA0MF9SRUdfSU5UTVIsCi0JCQkJCQlUV0w2MDQwX0FMTElOVF9NU0spOwotCQl9CiAJfQogCiAJLyogaW5pdCB2aW8gcmVnaXN0ZXJzICovCiAJdHdsNjA0MF9pbml0X3Zpb19yZWdzKGNvZGVjKTsKIAorCXByaXYtPmhmX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ0d2w2MDQwLWhmIik7CisJaWYgKHByaXYtPmhmX3dvcmtxdWV1ZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gaXJxX2VycjsKKwl9CisJcHJpdi0+aHNfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInR3bDYwNDAtaHMiKTsKKwlpZiAocHJpdi0+aHNfd29ya3F1ZXVlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byB3cV9lcnI7CisJfQorCisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhzX2RlbGF5ZWRfd29yaywgdHdsNjA0MF9wZ2FfaHNfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhmX2RlbGF5ZWRfd29yaywgdHdsNjA0MF9wZ2FfaGZfd29yayk7CisKIAkvKiBwb3dlciBvbiBkZXZpY2UgKi8KIAlyZXQgPSB0d2w2MDQwX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAJaWYgKHJldCkKLQkJZ290byBpcnFfZXJyOworCQlnb3RvIGJpYXNfZXJyOwogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHR3bDYwNDBfc25kX2NvbnRyb2xzLAogCQkJCUFSUkFZX1NJWkUodHdsNjA0MF9zbmRfY29udHJvbHMpKTsKQEAgLTEwODMsNiArMTY5NywxMCBAQAogCiAJcmV0dXJuIDA7CiAKK2JpYXNfZXJyOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhzX3dvcmtxdWV1ZSk7Cit3cV9lcnI6CisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+aGZfd29ya3F1ZXVlKTsKIGlycV9lcnI6CiAJaWYgKG5hdWRpbnQpCiAJCWZyZWVfaXJxKG5hdWRpbnQsIGNvZGVjKTsKQEAgLTEwOTAsNiArMTcwOCw4IEBACiAJaWYgKGdwaW9faXNfdmFsaWQoYXVkcHdyb24pKQogCQlncGlvX2ZyZWUoYXVkcHdyb24pOwogZ3BpbzFfZXJyOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Cit3b3JrX2VycjoKIAlrZnJlZShwcml2KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEwOCw2ICsxNzI4LDkgQEAKIAlpZiAobmF1ZGludCkKIAkJZnJlZV9pcnEobmF1ZGludCwgY29kZWMpOwogCisJZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5oZl93b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPmhzX3dvcmtxdWV1ZSk7CiAJa2ZyZWUocHJpdik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5oIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmgKaW5kZXggZjdjNzdmYS4uMjNhZWVkMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmgKQEAgLTc5LDYgKzc5LDcgQEAKIAogLyogSU5UTVIgKDB4MDQpIGZpZWxkcyAqLwogCisjZGVmaW5lIFRXTDYwNDBfUExVR01TSwkJCTB4MDIKICNkZWZpbmUgVFdMNjA0MF9SRUFEWU1TSwkJMHg0MAogI2RlZmluZSBUV0w2MDQwX0FMTElOVF9NU0sJCTB4N0IKIApAQCAtMTM1LDQgKzEzNiwxMSBAQAogI2RlZmluZSBUV0w2MDQwX0hQUExMX0lECQkxCiAjZGVmaW5lIFRXTDYwNDBfTFBQTExfSUQJCTIKIAorLyogU1RBVFVTICgweDJFKSBmaWVsZHMgKi8KKworI2RlZmluZSBUV0w2MDQwX1BMVUdDT01QCQkweDAyCisKK3ZvaWQgdHdsNjA0MF9oc19qYWNrX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICAgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywgaW50IHJlcG9ydCk7CisKICNlbmRpZiAvKiBFbmQgb2YgX19UV0w2MDQwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwppbmRleCA0NjRmMGNmLi5lNzY4NDdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgPHNvdW5kL3VkYTEzNHguaD4KQEAgLTM4OSw3ICszODgsNyBAQAogCQkJcGQtPnBvd2VyKDApOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKaW5kZXggMGM2YzcyNS4uYzVjYThjZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvdWRhMTM4MC5oPgogCkBAIC0zNiw3ICszNSw2IEBACiAvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KIHN0cnVjdCB1ZGExMzgwX3ByaXYgewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQl1MTYgcmVnX2NhY2hlW1VEQTEzODBfQ0FDSEVSRUdOVU1dOwogCXVuc2lnbmVkIGludCBkYWNfY2xrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKQEAgLTQxNCwxMCArNDEyLDExIEBACiAKIHN0YXRpYyBpbnQgdWRhMTM4MF9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgdWRhMTM4MF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHVkYTEzODBfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjAzLDcgKzYwMiw3IEBACiAJaW50IHJlZzsKIAlzdHJ1Y3QgdWRhMTM4MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNvZGVjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gbGV2ZWwpCisJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gbGV2ZWwpCiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChsZXZlbCkgewpAQCAtNjEzLDcgKzYxMiw3IEBACiAJCXVkYTEzODBfd3JpdGUoY29kZWMsIFVEQTEzODBfUE0sIFIwMl9QT05fQklBUyB8IHBtKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcG93ZXIpKSB7CiAJCQkJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPmdwaW9fcG93ZXIsIDEpOwogCQkJCW1kZWxheSgxKTsKQEAgLTYzNiw3ICs2MzUsNyBAQAogCQlmb3IgKHJlZyA9IFVEQTEzODBfTVZPTDsgcmVnIDwgVURBMTM4MF9DQUNIRVJFR05VTTsgcmVnKyspCiAJCQlzZXRfYml0KHJlZyAtIDB4MTAsICZ1ZGExMzgwX2NhY2hlX2RpcnR5KTsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCmluZGV4IDBjNDdjNzguLmQzZmZhMmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwpAQCAtMjUsOCArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiAjaW5jbHVkZSAid2wxMjczLmgiCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwppbmRleCA0YmNkMTY4Li44MGRkZjRmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTcwNSw2ICs3MDQsNyBAQAogLyogQ2FsbGVkIGZyb20gdGhlIG1hY2hpbmUgZHJpdmVyICovCiBpbnQgd20yMDAwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKIAlpZiAoIXdtMjAwMF9pMmMpIHsKQEAgLTcxMiwxMiArNzEyLDEyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtMjAwMF9kYXBtX3dpZGdldHMsCisJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTIwMDBfZGFwbV93aWRnZXRzLAogCQkJCQlBUlJBWV9TSVpFKHdtMjAwMF9kYXBtX3dpZGdldHMpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwppbmRleCA3NjExYWRkLi42ZDZkYzllIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAogI2luY2x1ZGUgIndtODM1MC5oIgogCkBAIC01NCw2ICs1NCw3IEBACiAKIHN0cnVjdCB3bTgzNTBfamFja19kYXRhIHsKIAlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlpbnQgcmVwb3J0OwogCWludCBzaG9ydF9yZXBvcnQ7CiB9OwpAQCAtMjMwLDggKzIzMSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHdtODM1MF9wZ2Ffd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0KLQkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2NvZGVjLCBkZWxheWVkX3dvcmsud29yayk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCwgZGVsYXllZF93b3JrLndvcmspOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhcG0tPmNvZGVjOwogCXN0cnVjdCB3bTgzNTBfZGF0YSAqd204MzUwX2RhdGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlzdHJ1Y3Qgd204MzUwX291dHB1dCAqb3V0MSA9ICZ3bTgzNTBfZGF0YS0+b3V0MSwKIAkgICAgKm91dDIgPSAmd204MzUwX2RhdGEtPm91dDI7CkBAIC0zMDIsOCArMzA0LDggQEAKIAkJb3V0LT5yYW1wID0gV004MzUwX1JBTVBfVVA7CiAJCW91dC0+YWN0aXZlID0gMTsKIAotCQlpZiAoIWRlbGF5ZWRfd29ya19wZW5kaW5nKCZjb2RlYy0+ZGVsYXllZF93b3JrKSkKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmRlbGF5ZWRfd29yaywKKwkJaWYgKCFkZWxheWVkX3dvcmtfcGVuZGluZygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrKSkKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLAogCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJYnJlYWs7CiAKQEAgLTMxMSw4ICszMTMsOCBAQAogCQlvdXQtPnJhbXAgPSBXTTgzNTBfUkFNUF9ET1dOOwogCQlvdXQtPmFjdGl2ZSA9IDA7CiAKLQkJaWYgKCFkZWxheWVkX3dvcmtfcGVuZGluZygmY29kZWMtPmRlbGF5ZWRfd29yaykpCi0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssCisJCWlmICghZGVsYXllZF93b3JrX3BlbmRpbmcoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaykpCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywKIAkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxKSk7CiAJCWJyZWFrOwogCX0KQEAgLTc4Niw5ICs3ODgsMTAgQEAKIAogc3RhdGljIGludCB3bTgzNTBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywKKwlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCiAJCQkJCXdtODM1MF9kYXBtX3dpZGdldHMsCiAJCQkJCUFSUkFZX1NJWkUod204MzUwX2RhcG1fd2lkZ2V0cykpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtNzk3LDcgKzgwMCw3IEBACiAJfQogCiAJLyogc2V0IHVwIGF1ZGlvIHBhdGhzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBUE0gcm91dGUgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTExODQsNyArMTE4Nyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUocHJpdi0+c3VwcGxpZXMpLAogCQkJCQkJICAgIHByaXYtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQgIT0gMCkKQEAgLTEzMTcsNyArMTMyMCw3IEBACiAJCQkJICAgICAgIHByaXYtPnN1cHBsaWVzKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCkBAIC0xMzM0LDM3ICsxMzM3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCB3bTgzNTBfaHBfamFja19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCB3bTgzNTBfaHBfd29yayhzdHJ1Y3Qgd204MzUwX2RhdGEgKnByaXYsCisJCQkgICBzdHJ1Y3Qgd204MzUwX2phY2tfZGF0YSAqamFjaywKKwkJCSAgIHUxNiBtYXNrKQogewotCXN0cnVjdCB3bTgzNTBfZGF0YSAqcHJpdiA9IGRhdGE7CiAJc3RydWN0IHdtODM1MCAqd204MzUwID0gcHJpdi0+Y29kZWMuY29udHJvbF9kYXRhOwogCXUxNiByZWc7CiAJaW50IHJlcG9ydDsKLQlpbnQgbWFzazsKLQlzdHJ1Y3Qgd204MzUwX2phY2tfZGF0YSAqamFjayA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGlycSAtIHdtODM1MC0+aXJxX2Jhc2UpIHsKLQljYXNlIFdNODM1MF9JUlFfQ09ERUNfSkNLX0RFVF9MOgotCQlqYWNrID0gJnByaXYtPmhwbDsKLQkJbWFzayA9IFdNODM1MF9KQUNLX0xfTFZMOwotCQlicmVhazsKLQotCWNhc2UgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX1I6Ci0JCWphY2sgPSAmcHJpdi0+aHByOwotCQltYXNrID0gV004MzUwX0pBQ0tfUl9MVkw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JaWYgKCFqYWNrLT5qYWNrKSB7Ci0JCWRldl93YXJuKHdtODM1MC0+ZGV2LCAiSmFjayBpbnRlcnJ1cHQgY2FsbGVkIHdpdGggbm8gamFja1xuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQkvKiBEZWJvdW5jZSAqLwotCW1zbGVlcCgyMDApOwogCiAJcmVnID0gd204MzUwX3JlZ19yZWFkKHdtODM1MCwgV004MzUwX0pBQ0tfUElOX1NUQVRVUyk7CiAJaWYgKHJlZyAmIG1hc2spCkBAIC0xMzc0LDYgKzEzNTMsNTQgQEAKIAogCXNuZF9zb2NfamFja19yZXBvcnQoamFjay0+amFjaywgcmVwb3J0LCBqYWNrLT5yZXBvcnQpOwogCit9CisKK3N0YXRpYyB2b2lkIHdtODM1MF9ocGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdtODM1MF9kYXRhICpwcml2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bTgzNTBfZGF0YSwgaHBsLndvcmsud29yayk7CisKKwl3bTgzNTBfaHBfd29yayhwcml2LCAmcHJpdi0+aHBsLCBXTTgzNTBfSkFDS19MX0xWTCk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODM1MF9ocHJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdtODM1MF9kYXRhICpwcml2ID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bTgzNTBfZGF0YSwgaHByLndvcmsud29yayk7CisJCisJd204MzUwX2hwX3dvcmsocHJpdiwgJnByaXYtPmhwciwgV004MzUwX0pBQ0tfUl9MVkwpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzUwX2hwX2phY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bTgzNTBfZGF0YSAqcHJpdiA9IGRhdGE7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gcHJpdi0+Y29kZWMuY29udHJvbF9kYXRhOworCXN0cnVjdCB3bTgzNTBfamFja19kYXRhICpqYWNrID0gTlVMTDsKKworCXN3aXRjaCAoaXJxIC0gd204MzUwLT5pcnFfYmFzZSkgeworCWNhc2UgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX0w6CisjaWZuZGVmIENPTkZJR19TTkRfU09DX1dNODM1MF9NT0RVTEUKKwkJdHJhY2Vfc25kX3NvY19qYWNrX2lycSgiV004MzUwIEhQTCIpOworI2VuZGlmCisJCWphY2sgPSAmcHJpdi0+aHBsOworCQlicmVhazsKKworCWNhc2UgV004MzUwX0lSUV9DT0RFQ19KQ0tfREVUX1I6CisjaWZuZGVmIENPTkZJR19TTkRfU09DX1dNODM1MF9NT0RVTEUKKwkJdHJhY2Vfc25kX3NvY19qYWNrX2lycSgiV004MzUwIEhQUiIpOworI2VuZGlmCisJCWphY2sgPSAmcHJpdi0+aHByOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCh3bTgzNTAtPmRldikpCisJCXBtX3dha2V1cF9ldmVudCh3bTgzNTAtPmRldiwgMjUwKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmamFjay0+d29yaywgMjAwKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTQzNiw2ICsxNDYzLDEwIEBACiAJdTE2IHJlZzsKIAlpbnQgcmVwb3J0ID0gMDsKIAorI2lmbmRlZiBDT05GSUdfU05EX1NPQ19XTTgzNTBfTU9EVUxFCisJdHJhY2Vfc25kX3NvY19qYWNrX2lycSgiV004MzUwIG1pYyIpOworI2VuZGlmCisKIAlyZWcgPSB3bTgzNTBfcmVnX3JlYWQod204MzUwLCBXTTgzNTBfSkFDS19QSU5fU1RBVFVTKTsKIAlpZiAocmVnICYgV004MzUwX0pBQ0tfTUlDU0NEX0xWTCkKIAkJcmVwb3J0IHw9IHByaXYtPm1pYy5zaG9ydF9yZXBvcnQ7CkBAIC0xNTUwLDcgKzE1ODEsOSBAQAogCS8qIFB1dCB0aGUgY29kZWMgaW50byByZXNldCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSAqLwogCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSwgV004MzUwX0NPREVDX0VOQSk7CiAKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRlbGF5ZWRfd29yaywgd204MzUwX3BnYV93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLCB3bTgzNTBfcGdhX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5ocGwud29yaywgd204MzUwX2hwbF93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aHByLndvcmssIHdtODM1MF9ocHJfd29yayk7CiAKIAkvKiBFbmFibGUgdGhlIGNvZGVjICovCiAJd204MzUwX3NldF9iaXRzKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSwgV004MzUwX0NPREVDX0VOQSk7CkBAIC0xNjI2LDcgKzE2NTksNiBAQAogewogCXN0cnVjdCB3bTgzNTBfZGF0YSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfcGxhdGRhdGEoY29kZWMtPmRldik7Ci0JaW50IHJldDsKIAogCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX0pBQ0tfREVURUNULAogCQkJICBXTTgzNTBfSkRMX0VOQSB8IFdNODM1MF9KRFJfRU5BKTsKQEAgLTE2NDEsMTUgKzE2NzMsMTIgQEAKIAlwcml2LT5ocHIuamFjayA9IE5VTEw7CiAJcHJpdi0+bWljLmphY2sgPSBOVUxMOwogCi0JLyogY2FuY2VsIGFueSB3b3JrIHdhaXRpbmcgdG8gYmUgcXVldWVkLiAqLwotCXJldCA9IGNhbmNlbF9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aHBsLndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aHByLndvcmspOwogCiAJLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAogCSAqIHdhaXQgZm9yIGl0cyBjb21wbGV0aW9uICovCi0JaWYgKHJldCkgewotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssIDApOwotCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCX0KKwlmbHVzaF9kZWxheWVkX3dvcmtfc3luYygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrKTsKIAogCXdtODM1MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCmluZGV4IDg1MDI5OTcuLjNjM2JjMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtOTExLDEwICs5MTAsMTEgQEAKIAogc3RhdGljIGludCB3bTg0MDBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODQwMF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODQwMF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NDAwX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204NDAwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIxOSw3ICsxMjE5LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShwb3dlciksCiAJCQkJCQkgICAgJnBvd2VyWzBdKTsKIAkJCWlmIChyZXQgIT0gMCkgewpAQCAtMTMwNiw3ICsxMzA2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCmluZGV4IDhmMTA3MDkuLmRiMGRjZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgIndtODUxMC5oIgpAQCAtMjE2LDEwICsyMTUsMTEgQEAKIAogc3RhdGljIGludCB3bTg1MTBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODUxMF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODUxMF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NTEwX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204NTEwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKIAkJcG93ZXIxIHw9IFdNODUxMF9QT1dFUjFfQklBU0VOIHwgV004NTEwX1BPV0VSMV9CVUZJT0VOOwogCi0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIEluaXRpYWwgY2FwIGNoYXJnZSBhdCBWTUlEIDVrICovCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1MTBfUE9XRVIxLCBwb3dlcjEgfCAweDMpOwogCQkJbWRlbGF5KDEwMCk7CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCmluZGV4IGRlY2E3OWUuLjVlYjJmNTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtMTA5LDEwICsxMDgsMTEgQEAKIAogc3RhdGljIGludCB3bTg1MjNfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODUyM19kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODUyM19kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg1MjMtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg1MjMtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQgIT0gMCkgewpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCQkJICAgICAgIHdtODUyMy0+c3VwcGxpZXMpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCmluZGV4IDg3MjVkNGUuLjhmNmI1ZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTE5MSw3ICsxOTAsNiBAQAogc3RydWN0IHdtODU4MF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tXTTg1ODBfTlVNX1NVUFBMSUVTXTsKLQl1MTYgcmVnX2NhY2hlW1dNODU4MF9NQVhfUkVHSVNURVIgKyAxXTsKIAlzdHJ1Y3QgcGxsX3N0YXRlIGE7CiAJc3RydWN0IHBsbF9zdGF0ZSBiOwogCWludCBzeXNjbGtbMl07CkBAIC0zMDIsMTAgKzMwMCwxMSBAQAogCiBzdGF0aWMgaW50IHdtODU4MF9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204NTgwX2RhcG1fd2lkZ2V0cywKLQkJCQkgIEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0cykpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg1ODBfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDcsMTMgKzUwNiwxMyBAQAogCX0KIAogCS8qIExvb2sgdXAgdGhlIFNZU0NMSyByYXRpbzsgYWNjZXB0IG9ubHkgZXhhY3QgbWF0Y2hlcyAqLwotCXJhdGlvID0gd204NTgwLT5zeXNjbGtbZGFpLT5pZF0gLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXJhdGlvID0gd204NTgwLT5zeXNjbGtbZGFpLT5kcml2ZXItPmlkXSAvIHBhcmFtc19yYXRlKHBhcmFtcyk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NTgwX3N5c2Nsa19yYXRpb3MpOyBpKyspCiAJCWlmIChyYXRpbyA9PSB3bTg1ODBfc3lzY2xrX3JhdGlvc1tpXSkKIAkJCWJyZWFrOwogCWlmIChpID09IEFSUkFZX1NJWkUod204NTgwX3N5c2Nsa19yYXRpb3MpKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgY2xvY2sgcmF0aW8gJWQvJWRcbiIsCi0JCQl3bTg1ODAtPnN5c2Nsa1tkYWktPmlkXSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCQl3bTg1ODAtPnN5c2Nsa1tkYWktPmRyaXZlci0+aWRdLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXBhaWZhIHw9IGk7CkBAIC03MTYsNyArNzE1LDcgQEAKIAogCXN3aXRjaCAoY2xrX2lkKSB7CiAJY2FzZSBXTTg1ODBfQ0xLU1JDX0FEQ01DTEs6Ci0JCWlmIChkYWktPmlkICE9IFdNODU4MF9EQUlfUEFJRlRYKQorCQlpZiAoZGFpLT5kcml2ZXItPmlkICE9IFdNODU4MF9EQUlfUEFJRlRYKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXNlbCA9IDAgPDwgc2VsX3NoaWZ0OwogCQlicmVhazsKQEAgLTczNSw3ICs3MzQsNyBAQAogCX0KIAogCS8qIFdlIHJlYWxseSBzaG91bGQgdmFsaWRhdGUgUExMIHNldHRpbmdzIGJ1dCBub3QgeWV0ICovCi0Jd204NTgwLT5zeXNjbGtbZGFpLT5pZF0gPSBmcmVxOworCXdtODU4MC0+c3lzY2xrW2RhaS0+ZHJpdmVyLT5pZF0gPSBmcmVxOwogCiAJcmV0dXJuIHNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODU4MF9DTEtTRUwsIHNlbF9tYXNrLCBzZWwpOwogfQpAQCAtNzY3LDcgKzc2Niw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogUG93ZXIgdXAgYW5kIGdldCBpbmRpdmlkdWFsIGNvbnRyb2wgb2YgdGhlIERBQ3MgKi8KIAkJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NTgwX1BXUkROMSk7CiAJCQlyZWcgJj0gfihXTTg1ODBfUFdSRE4xX1BXRE4gfCBXTTg1ODBfUFdSRE4xX0FMTERBQ1BEKTsKQEAgLTc4NSw3ICs3ODQsNyBAQAogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg1ODBfUFdSRE4xLCByZWcgfCBXTTg1ODBfUFdSRE4xX1BXRE4pOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkwNSw3ICs5MDQsNyBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODU4MF9zZXRfYmlhc19sZXZlbCwKIAkucmVnX2NhY2hlX3NpemUgPSBBUlJBWV9TSVpFKHdtODU4MF9yZWcpLAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHUxNiksCi0JLnJlZ19jYWNoZV9kZWZhdWx0ID0gJndtODU4MF9yZWcsCisJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd204NTgwX3JlZywKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwppbmRleCA1NGZiZDc2Li45N2MzMDM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKQEAgLTM0LDcgKzMzLDYgQEAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHdtODcxMV9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGJ1c190eXBlOwotCXUxNiByZWdfY2FjaGVbV004NzExX0NBQ0hFUkVHTlVNXTsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOwogfTsKIApAQCAtOTMsMTAgKzkxLDExIEBACiAKIHN0YXRpYyBpbnQgd204NzExX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg3MTFfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg3MTFfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3MTFfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg3MTFfZGFwbV93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzE4LDcgKzMxNyw3IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODcxMV9QV1IsIDB4ZmZmZik7CiAJCWJyZWFrOwogCX0KLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggMDc1ZjM1ZS4uNzM2YjAzNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCkBAIC03MywxMCArNzIsMTEgQEAKIAogc3RhdGljIGludCB3bTg3MjhfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODcyOF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODcyOF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODcyOF9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODcyOF9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODAsNyArMTgwLDcgQEAKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIFBvd2VyIGV2ZXJ5dGhpbmcgdXAuLi4gKi8KIAkJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004NzI4X0RBQ0NUTCk7CiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MjhfREFDQ1RMLCByZWcgJiB+MHg0KTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MjhfREFDQ1RMLCByZWcgfCAweDQpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IGU3MjVjMDkuLjBhNjdjMzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtNDQsOSArNDMsMTAgQEAKIHN0cnVjdCB3bTg3MzFfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004NzMxX05VTV9TVVBQTElFU107Ci0JdTE2IHJlZ19jYWNoZVtXTTg3MzFfQ0FDSEVSRUdOVU1dOwogCXVuc2lnbmVkIGludCBzeXNjbGs7CiAJaW50IHN5c2Nsa190eXBlOworCWludCBwbGF5YmFja19mczsKKwlib29sIGRlZW1waDsKIH07CiAKIApAQCAtNjUsMTYgKzY1LDc5IEBACiAjZGVmaW5lIHdtODczMV9yZXNldChjKQlzbmRfc29jX3dyaXRlKGMsIFdNODczMV9SRVNFVCwgMCkKIAogc3RhdGljIGNvbnN0IGNoYXIgKndtODczMV9pbnB1dF9zZWxlY3RbXSA9IHsiTGluZSBJbiIsICJNaWMifTsKLXN0YXRpYyBjb25zdCBjaGFyICp3bTg3MzFfZGVlbXBoW10gPSB7Ik5vbmUiLCAiMzJLaHoiLCAiNDQuMUtoeiIsICI0OEtoeiJ9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODczMV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFKFdNODczMV9BUEFOQSwgMiwgMiwgd204NzMxX2lucHV0X3NlbGVjdCksCi0JU09DX0VOVU1fU0lOR0xFKFdNODczMV9BUERJR0ksIDEsIDQsIHdtODczMV9kZWVtcGgpLAotfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzMxX2luc2VsX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg3MzFfQVBBTkEsIDIsIDIsIHdtODczMV9pbnB1dF9zZWxlY3QpOworCitzdGF0aWMgaW50IHdtODczMV9kZWVtcGhbXSA9IHsgMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCB9OworCitzdGF0aWMgaW50IHdtODczMV9zZXRfZGVlbXBoKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwsIGksIGJlc3Q7CisKKwkvKiBJZiB3ZSdyZSB1c2luZyBkZWVtcGhhc2lzIHNlbGVjdCB0aGUgbmVhcmVzdCBhdmFpbGFibGUgc2FtcGxlCisJICogcmF0ZS4KKwkgKi8KKwlpZiAod204NzMxLT5kZWVtcGgpIHsKKwkJYmVzdCA9IDE7CisJCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHdtODczMV9kZWVtcGgpOyBpKyspIHsKKwkJCWlmIChhYnMod204NzMxX2RlZW1waFtpXSAtIHdtODczMS0+cGxheWJhY2tfZnMpIDwKKwkJCSAgICBhYnMod204NzMxX2RlZW1waFtiZXN0XSAtIHdtODczMS0+cGxheWJhY2tfZnMpKQorCQkJCWJlc3QgPSBpOworCQl9CisKKwkJdmFsID0gYmVzdCA8PCAxOworCX0gZWxzZSB7CisJCWJlc3QgPSAwOworCQl2YWwgPSAwOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgIlNldCBkZWVtcGhhc2lzICVkICglZEh6KVxuIiwKKwkJYmVzdCwgd204NzMxX2RlZW1waFtiZXN0XSk7CisKKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzMxX0FQRElHSSwgMHg2LCB2YWwpOworfQorCitzdGF0aWMgaW50IHdtODczMV9nZXRfZGVlbXBoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHdtODczMV9wcml2ICp3bTg3MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB3bTg3MzEtPmRlZW1waDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczMV9wdXRfZGVlbXBoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHdtODczMV9wcml2ICp3bTg3MzEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgZGVlbXBoID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZWVtcGggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CisJaWYgKHdtODczMS0+ZGVlbXBoICE9IGRlZW1waCkgeworCQl3bTg3MzEtPmRlZW1waCA9IGRlZW1waDsKKworCQl3bTg3MzFfc2V0X2RlZW1waChjb2RlYyk7CisKKwkJcmV0ID0gMTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGluX3RsdiwgLTM0NTAsIDE1MCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc2lkZXRvbmVfdGx2LCAtMTUwMCwgMzAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShvdXRfdGx2LCAtMTIxMDAsIDEwMCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUobWljX3RsdiwgMCwgMjAwMCwgMCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3MzFfc25kX2NvbnRyb2xzW10gPSB7CiAKQEAgLTg3LDcgKzE1MCw3IEBACiAJCSBpbl90bHYpLAogU09DX0RPVUJMRV9SKCJMaW5lIENhcHR1cmUgU3dpdGNoIiwgV004NzMxX0xJTlZPTCwgV004NzMxX1JJTlZPTCwgNywgMSwgMSksCiAKLVNPQ19TSU5HTEUoIk1pYyBCb29zdCAoKzIwZEIpIiwgV004NzMxX0FQQU5BLCAwLCAxLCAwKSwKK1NPQ19TSU5HTEVfVExWKCJNaWMgQm9vc3QgVm9sdW1lIiwgV004NzMxX0FQQU5BLCAwLCAxLCAwLCBtaWNfdGx2KSwKIFNPQ19TSU5HTEUoIk1pYyBDYXB0dXJlIFN3aXRjaCIsIFdNODczMV9BUEFOQSwgMSwgMSwgMSksCiAKIFNPQ19TSU5HTEVfVExWKCJTaWRldG9uZSBQbGF5YmFjayBWb2x1bWUiLCBXTTg3MzFfQVBBTkEsIDYsIDMsIDEsCkBAIC05Niw3ICsxNTksOCBAQAogU09DX1NJTkdMRSgiQURDIEhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgV004NzMxX0FQRElHSSwgMCwgMSwgMSksCiBTT0NfU0lOR0xFKCJTdG9yZSBEQyBPZmZzZXQgU3dpdGNoIiwgV004NzMxX0FQRElHSSwgNCwgMSwgMCksCiAKLVNPQ19FTlVNKCJQbGF5YmFjayBEZS1lbXBoYXNpcyIsIHdtODczMV9lbnVtWzFdKSwKK1NPQ19TSU5HTEVfQk9PTF9FWFQoIlBsYXliYWNrIERlZW1waGFzaXMgU3dpdGNoIiwgMCwKKwkJICAgIHdtODczMV9nZXRfZGVlbXBoLCB3bTg3MzFfcHV0X2RlZW1waCksCiB9OwogCiAvKiBPdXRwdXQgTWl4ZXIgKi8KQEAgLTEwOCw3ICsxNzIsNyBAQAogCiAvKiBJbnB1dCBtdXggKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3MzFfaW5wdXRfbXV4X2NvbnRyb2xzID0KLVNPQ19EQVBNX0VOVU0oIklucHV0IFNlbGVjdCIsIHdtODczMV9lbnVtWzBdKTsKK1NPQ19EQVBNX0VOVU0oIklucHV0IFNlbGVjdCIsIHdtODczMV9pbnNlbF9lbnVtKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODczMV9kYXBtX3dpZGdldHNbXSA9IHsKIFNORF9TT0NfREFQTV9TVVBQTFkoIk9TQyIsIFdNODczMV9QV1IsIDUsIDEsIE5VTEwsIDApLApAQCAtMTY1LDEwICsyMjksMTEgQEAKIAogc3RhdGljIGludCB3bTg3MzFfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODczMV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODczMV9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzksNiArMzA0LDggQEAKIAl1MTYgc3JhdGUgPSAoY29lZmZfZGl2W2ldLnNyIDw8IDIpIHwKIAkJKGNvZWZmX2RpdltpXS5ib3NyIDw8IDEpIHwgY29lZmZfZGl2W2ldLnVzYjsKIAorCXdtODczMS0+cGxheWJhY2tfZnMgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCiAJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX1NSQVRFLCBzcmF0ZSk7CiAKIAkvKiBiaXQgc2l6ZSAqLwpAQCAtMjUzLDYgKzMyMCw4IEBACiAJCWJyZWFrOwogCX0KIAorCXdtODczMV9zZXRfZGVlbXBoKGNvZGVjKTsKKwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczMV9JRkFDRSwgaWZhY2UpOwogCXJldHVybiAwOwogfQpAQCAtMzE5LDcgKzM4OCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zOTksNyArNDY4LDcgQEAKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg3MzEtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg3MzEtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQgIT0gMCkKQEAgLTQyOCw3ICs0OTcsNyBAQAogCQkJCSAgICAgICB3bTg3MzEtPnN1cHBsaWVzKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCkBAIC01NDIsNyArNjExLDYgQEAKIGVycl9yZWd1bGF0b3JfZ2V0OgogCXJlZ3VsYXRvcl9idWxrX2ZyZWUoQVJSQVlfU0laRSh3bTg3MzEtPnN1cHBsaWVzKSwgd204NzMxLT5zdXBwbGllcyk7CiAKLQlrZnJlZSh3bTg3MzEpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzY3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCkBAIC0wLDAgKzEsNzU0IEBACisvKgorICogd204NzM3LmMgIC0tICBXTTg3MzcgQUxTQSBTb0MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgIndtODczNy5oIgorCisjZGVmaW5lIFdNODczN19OVU1fU1VQUExJRVMgNAorc3RhdGljIGNvbnN0IGNoYXIgKndtODczN19zdXBwbHlfbmFtZXNbV004NzM3X05VTV9TVVBQTElFU10gPSB7CisJIkRDVkREIiwKKwkiREJWREQiLAorCSJBVkREIiwKKwkiTVZERCIsCit9OworCisvKiBjb2RlYyBwcml2YXRlIGRhdGEgKi8KK3N0cnVjdCB3bTg3MzdfcHJpdiB7CisJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbV004NzM3X05VTV9TVVBQTElFU107CisJdW5zaWduZWQgaW50IG1jbGs7Cit9OworCitzdGF0aWMgY29uc3QgdTE2IHdtODczN19yZWdbV004NzM3X1JFR0lTVEVSX0NPVU5UXSA9IHsKKwkweDAwQzMsICAgICAvKiBSMCAgLSBMZWZ0IFBHQSB2b2x1bWUgKi8KKwkweDAwQzMsICAgICAvKiBSMSAgLSBSaWdodCBQR0Egdm9sdW1lICovCisJMHgwMDA3LCAgICAgLyogUjIgIC0gQVVESU8gcGF0aCBMICovCisJMHgwMDA3LCAgICAgLyogUjMgIC0gQVVESU8gcGF0aCBSICovCisJMHgwMDAwLCAgICAgLyogUjQgIC0gM0QgRW5oYW5jZSAqLworCTB4MDAwMCwgICAgIC8qIFI1ICAtIEFEQyBDb250cm9sICovCisJMHgwMDAwLCAgICAgLyogUjYgIC0gUG93ZXIgTWFuYWdlbWVudCAqLworCTB4MDAwQSwgICAgIC8qIFI3ICAtIEF1ZGlvIEZvcm1hdCAqLworCTB4MDAwMCwgICAgIC8qIFI4ICAtIENsb2NraW5nICovCisJMHgwMDBGLCAgICAgLyogUjkgIC0gTUlDIFByZWFtcCBDb250cm9sICovCisJMHgwMDAzLCAgICAgLyogUjEwIC0gTWlzYyBCaWFzIENvbnRyb2wgKi8KKwkweDAwMDAsICAgICAvKiBSMTEgLSBOb2lzZSBHYXRlICovCisJMHgwMDdDLCAgICAgLyogUjEyIC0gQUxDMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAtIEFMQzIgKi8KKwkweDAwMzIsICAgICAvKiBSMTQgLSBBTEMzICovCit9OworCitzdGF0aWMgaW50IHdtODczN19yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODczN19SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWljYm9vc3RfdGx2W10gPSB7CisJVExWX0RCX1JBTkdFX0hFQUQoNCksCisJMCwgMCwgVExWX0RCX1NDQUxFX0lURU0oMTMwMCwgMCwgMCksCisJMSwgMSwgVExWX0RCX1NDQUxFX0lURU0oMTgwMCwgMCwgMCksCisJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMjgwMCwgMCwgMCksCisJMywgMywgVExWX0RCX1NDQUxFX0lURU0oMzMwMCwgMCwgMCksCit9Oworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHBnYV90bHYsIC05NzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3RsdiwgLTYwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShuZ190bHYsIC03ODAwLCA2MDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFsY19tYXhfdGx2LCAtMTIwMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhbGNfdGFyZ2V0X3RsdiwgLTE4MDAsIDEwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICptaWNiaWFzX2VudW1fdGV4dFtdID0geworCSIyNSUiLAorCSI1MCUiLAorCSI3NSUiLAorCSIxMDAlIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWljYmlhc19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMCwgNCwgbWljYmlhc19lbnVtX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqbG93X2N1dG9mZl90ZXh0W10gPSB7CisJIkxvdyIsICJIaWdoIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsb3dfM2QgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfM0RfRU5IQU5DRSwgNiwgMiwgbG93X2N1dG9mZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmhpZ2hfY3V0b2ZmX3RleHRbXSA9IHsKKwkiSGlnaCIsICJMb3ciCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhpZ2hfM2QgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfM0RfRU5IQU5DRSwgNSwgMiwgaGlnaF9jdXRvZmZfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICphbGNfZm5fdGV4dFtdID0geworCSJEaXNhYmxlZCIsICJSaWdodCIsICJMZWZ0IiwgIlN0ZXJlbyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjX2ZuID0KKwlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FMQzEsIDcsIDQsIGFsY19mbl90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFsY19ob2xkX3RleHRbXSA9IHsKKwkiMCIsICIyLjY3bXMiLCAiNS4zM21zIiwgIjEwLjY2bXMiLCAiMjEuMzJtcyIsICI0Mi42NG1zIiwgIjg1LjI4bXMiLAorCSIxNzAuNTZtcyIsICIzNDEuMTJtcyIsICI2ODIuMjRtcyIsICIxLjM2NHMiLCAiMi43MjhzIiwgIjUuNDU4cyIsCisJIjEwLjkxNnMiLCAiMjEuODMycyIsICI0My42OTFzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGNfaG9sZCA9CisJU09DX0VOVU1fU0lOR0xFKFdNODczN19BTEMyLCAwLCAxNiwgYWxjX2hvbGRfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICphbGNfYXRrX3RleHRbXSA9IHsKKwkiOC40bXMiLCAiMTYuOG1zIiwgIjMzLjZtcyIsICI2Ny4ybXMiLCAiMTM0LjRtcyIsICIyNjguOG1zIiwgIjUzNy42bXMiLAorCSIxLjA3NXMiLCAiMi4xNXMiLCAiNC4zcyIsICI4LjZzIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhbGNfYXRrID0KKwlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FMQzMsIDAsIDExLCBhbGNfYXRrX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqYWxjX2RjeV90ZXh0W10gPSB7CisJIjMzLjZtcyIsICI2Ny4ybXMiLCAiMTM0LjRtcyIsICIyNjguOG1zIiwgIjUzNy42bXMiLCAiMS4wNzVzIiwgIjIuMTVzIiwKKwkiNC4zcyIsICI4LjZzIiwgIjE3LjJzIiwgIjM0LjQxcyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWxjX2RjeSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODczN19BTEMzLCA0LCAxMSwgYWxjX2RjeV90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODczN19zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19ET1VCTEVfUl9UTFYoIk1pYyBCb29zdCBWb2x1bWUiLCBXTTg3MzdfQVVESU9fUEFUSF9MLCBXTTg3MzdfQVVESU9fUEFUSF9SLAorCQkgNiwgMywgMCwgbWljYm9vc3RfdGx2KSwKK1NPQ19ET1VCTEVfUigiTWljIEJvb3N0IFN3aXRjaCIsIFdNODczN19BVURJT19QQVRIX0wsIFdNODczN19BVURJT19QQVRIX1IsCisJICAgICA0LCAxLCAwKSwKK1NPQ19ET1VCTEUoIk1pYyBaQyBTd2l0Y2giLCBXTTg3MzdfQVVESU9fUEFUSF9MLCBXTTg3MzdfQVVESU9fUEFUSF9SLAorCSAgIDMsIDEsIDApLAorCitTT0NfRE9VQkxFX1JfVExWKCJDYXB0dXJlIFZvbHVtZSIsIFdNODczN19MRUZUX1BHQV9WT0xVTUUsCisJCSBXTTg3MzdfUklHSFRfUEdBX1ZPTFVNRSwgMCwgMjU1LCAwLCBwZ2FfdGx2KSwKK1NPQ19ET1VCTEUoIkNhcHR1cmUgWkMgU3dpdGNoIiwgV004NzM3X0FVRElPX1BBVEhfTCwgV004NzM3X0FVRElPX1BBVEhfUiwKKwkgICAyLCAxLCAwKSwKKworU09DX0RPVUJMRSgiSU5QVVQxIERDIEJpYXMgU3dpdGNoIiwgV004NzM3X01JU0NfQklBU19DT05UUk9MLCAwLCAxLCAxLCAwKSwKKworU09DX0VOVU0oIk1pYyBQR0EgQmlhcyIsIG1pY2JpYXNfZW51bSksCitTT0NfU0lOR0xFKCJBREMgTG93IFBvd2VyIFN3aXRjaCIsIFdNODczN19BRENfQ09OVFJPTCwgMiwgMSwgMCksCitTT0NfU0lOR0xFKCJIaWdoIFBhc3MgRmlsdGVyIFN3aXRjaCIsIFdNODczN19BRENfQ09OVFJPTCwgMCwgMSwgMSksCitTT0NfRE9VQkxFKCJQb2xhcml0eSBJbnZlcnQgU3dpdGNoIiwgV004NzM3X0FEQ19DT05UUk9MLCA1LCA2LCAxLCAwKSwKKworU09DX1NJTkdMRSgiM0QgU3dpdGNoIiwgV004NzM3XzNEX0VOSEFOQ0UsIDAsIDEsIDApLAorU09DX1NJTkdMRSgiM0QgRGVwdGgiLCBXTTg3MzdfM0RfRU5IQU5DRSwgMSwgMTUsIDApLAorU09DX0VOVU0oIjNEIExvdyBDdXQtb2ZmIiwgbG93XzNkKSwKK1NPQ19FTlVNKCIzRCBIaWdoIEN1dC1vZmYiLCBsb3dfM2QpLAorU09DX1NJTkdMRV9UTFYoIjNEIEFEQyBWb2x1bWUiLCBXTTg3MzdfM0RfRU5IQU5DRSwgNywgMSwgMSwgYWRjX3RsdiksCisKK1NPQ19TSU5HTEUoIk5vaXNlIEdhdGUgU3dpdGNoIiwgV004NzM3X05PSVNFX0dBVEUsIDAsIDEsIDApLAorU09DX1NJTkdMRV9UTFYoIk5vaXNlIEdhdGUgVGhyZXNob2xkIFZvbHVtZSIsIFdNODczN19OT0lTRV9HQVRFLCAyLCA3LCAwLAorCSAgICAgICBuZ190bHYpLAorCitTT0NfRU5VTSgiQUxDIiwgYWxjX2ZuKSwKK1NPQ19TSU5HTEVfVExWKCJBTEMgTWF4IEdhaW4gVm9sdW1lIiwgV004NzM3X0FMQzEsIDQsIDcsIDAsIGFsY19tYXhfdGx2KSwKK1NPQ19TSU5HTEVfVExWKCJBTEMgVGFyZ2V0IFZvbHVtZSIsIFdNODczN19BTEMxLCAwLCAxNSwgMCwgYWxjX3RhcmdldF90bHYpLAorU09DX0VOVU0oIkFMQyBIb2xkIFRpbWUiLCBhbGNfaG9sZCksCitTT0NfU0lOR0xFKCJBTEMgWkMgU3dpdGNoIiwgV004NzM3X0FMQzIsIDQsIDEsIDApLAorU09DX0VOVU0oIkFMQyBBdHRhY2sgVGltZSIsIGFsY19hdGspLAorU09DX0VOVU0oIkFMQyBEZWNheSBUaW1lIiwgYWxjX2RjeSksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGluc2VsX3RleHRbXSA9IHsKKwkiTElOUFVUMSIsICJMSU5QVVQyIiwgIkxJTlBVVDMiLCAiTElOUFVUMSBEQyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxpbnNlbF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV004NzM3X0FVRElPX1BBVEhfTCwgNywgNCwgbGluc2VsX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbGluc2VsX211eCA9CisJU09DX0RBUE1fRU5VTSgiTElOU0VMIiwgbGluc2VsX2VudW0pOworCisKK3N0YXRpYyBjb25zdCBjaGFyICpyaW5zZWxfdGV4dFtdID0geworCSJSSU5QVVQxIiwgIlJJTlBVVDIiLCAiUklOUFVUMyIsICJSSU5QVVQxIERDIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmluc2VsX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfQVVESU9fUEFUSF9SLCA3LCA0LCByaW5zZWxfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByaW5zZWxfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSSU5TRUwiLCByaW5zZWxfZW51bSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpieXBhc3NfdGV4dFtdID0geworCSJEaXJlY3QiLCAiUHJlYW1wIgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsYnlwYXNzX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg3MzdfTUlDX1BSRUFNUF9DT05UUk9MLCAyLCAyLCBieXBhc3NfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsYnlwYXNzX211eCA9CisJU09DX0RBUE1fRU5VTSgiTGVmdCBCeXBhc3MiLCBsYnlwYXNzX2VudW0pOworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcmJ5cGFzc19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCwgMywgMiwgYnlwYXNzX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmJ5cGFzc19tdXggPQorCVNPQ19EQVBNX0VOVU0oIkxlZnQgQnlwYXNzIiwgcmJ5cGFzc19lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODczN19kYXBtX3dpZGdldHNbXSA9IHsKK1NORF9TT0NfREFQTV9JTlBVVCgiTElOUFVUMSIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5QVVQyIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIkxJTlBVVDMiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiUklOUFVUMSIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJSSU5QVVQyIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlJJTlBVVDMiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTEFDSU4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiUkFDSU4iKSwKKworU05EX1NPQ19EQVBNX01VWCgiTElOU0VMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbGluc2VsX211eCksCitTTkRfU09DX0RBUE1fTVVYKCJSSU5TRUwiLCBTTkRfU09DX05PUE0sIDAsIDAsICZyaW5zZWxfbXV4KSwKKworU05EX1NPQ19EQVBNX01VWCgiTGVmdCBQcmVhbXAgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbGJ5cGFzc19tdXgpLAorU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgUHJlYW1wIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnJieXBhc3NfbXV4KSwKKworU05EX1NPQ19EQVBNX1BHQSgiUEdBTCIsIFdNODczN19QT1dFUl9NQU5BR0VNRU5ULCA1LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIlBHQVIiLCBXTTg3MzdfUE9XRVJfTUFOQUdFTUVOVCwgNCwgMCwgTlVMTCwgMCksCisKK1NORF9TT0NfREFQTV9EQUMoIkFEQ0wiLCBOVUxMLCBXTTg3MzdfUE9XRVJfTUFOQUdFTUVOVCwgMywgMCksCitTTkRfU09DX0RBUE1fREFDKCJBRENSIiwgTlVMTCwgV004NzM3X1BPV0VSX01BTkFHRU1FTlQsIDIsIDApLAorCitTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGIiwgIkNhcHR1cmUiLCAwLCBXTTg3MzdfUE9XRVJfTUFOQUdFTUVOVCwgNiwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworCXsgIkxJTlNFTCIsICJMSU5QVVQxIiwgIkxJTlBVVDEiIH0sCisJeyAiTElOU0VMIiwgIkxJTlBVVDIiLCAiTElOUFVUMiIgfSwKKwl7ICJMSU5TRUwiLCAiTElOUFVUMyIsICJMSU5QVVQzIiB9LAorCXsgIkxJTlNFTCIsICJMSU5QVVQxIERDIiwgIkxJTlBVVDEiIH0sCisKKwl7ICJSSU5TRUwiLCAiUklOUFVUMSIsICJSSU5QVVQxIiB9LAorCXsgIlJJTlNFTCIsICJSSU5QVVQyIiwgIlJJTlBVVDIiIH0sCisJeyAiUklOU0VMIiwgIlJJTlBVVDMiLCAiUklOUFVUMyIgfSwKKwl7ICJSSU5TRUwiLCAiUklOUFVUMSBEQyIsICJSSU5QVVQxIiB9LAorCisJeyAiTGVmdCBQcmVhbXAgTXV4IiwgIlByZWFtcCIsICJMSU5TRUwiIH0sCisJeyAiTGVmdCBQcmVhbXAgTXV4IiwgIkRpcmVjdCIsICJMQUNJTiIgfSwKKworCXsgIlJpZ2h0IFByZWFtcCBNdXgiLCAiUHJlYW1wIiwgIlJJTlNFTCIgfSwKKwl7ICJSaWdodCBQcmVhbXAgTXV4IiwgIkRpcmVjdCIsICJSQUNJTiIgfSwKKworCXsgIlBHQUwiLCBOVUxMLCAiTGVmdCBQcmVhbXAgTXV4IiB9LAorCXsgIlBHQVIiLCBOVUxMLCAiUmlnaHQgUHJlYW1wIE11eCIgfSwKKworCXsgIkFEQ0wiLCBOVUxMLCAiUEdBTCIgfSwKKwl7ICJBRENSIiwgTlVMTCwgIlBHQVIiIH0sCisKKwl7ICJBSUYiLCBOVUxMLCAiQURDTCIgfSwKKwl7ICJBSUYiLCBOVUxMLCAiQURDUiIgfSwKK307CisKK3N0YXRpYyBpbnQgd204NzM3X2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODczN19kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODczN19kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBpbnRlcmNvbiwgQVJSQVlfU0laRShpbnRlcmNvbikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNvZGVjIG1jbGsgY2xvY2sgZGl2aWRlciBjb2VmZmljaWVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXUzMiBtY2xrOworCXUzMiByYXRlOworCXU4IHVzYjsKKwl1OCBzcjsKK30gY29lZmZfZGl2W10gPSB7CisJeyAxMjI4ODAwMCwgIDgwMDAsIDAsICAweDQgfSwKKwl7IDEyMjg4MDAwLCAxMjAwMCwgMCwgIDB4OCB9LAorCXsgMTIyODgwMDAsIDE2MDAwLCAwLCAgMHhhIH0sCisJeyAxMjI4ODAwMCwgMjQwMDAsIDAsIDB4MWMgfSwKKwl7IDEyMjg4MDAwLCAzMjAwMCwgMCwgIDB4YyB9LAorCXsgMTIyODgwMDAsIDQ4MDAwLCAwLCAgICAwIH0sCisJeyAxMjI4ODAwMCwgOTYwMDAsIDAsICAweGUgfSwKKworCXsgMTEyODk2MDAsICA4MDAwLCAwLCAweDE0IH0sCisJeyAxMTI4OTYwMCwgMTEwMjUsIDAsIDB4MTggfSwKKwl7IDExMjg5NjAwLCAyMjA1MCwgMCwgMHgxYSB9LAorCXsgMTEyODk2MDAsIDQ0MTAwLCAwLCAweDEwIH0sCisJeyAxMTI4OTYwMCwgODgyMDAsIDAsIDB4MWUgfSwKKworCXsgMTg0MzIwMDAsICA4MDAwLCAwLCAgMHg1IH0sCisJeyAxODQzMjAwMCwgMTIwMDAsIDAsICAweDkgfSwKKwl7IDE4NDMyMDAwLCAxNjAwMCwgMCwgIDB4YiB9LAorCXsgMTg0MzIwMDAsIDI0MDAwLCAwLCAweDFiIH0sCisJeyAxODQzMjAwMCwgMzIwMDAsIDAsICAweGQgfSwKKwl7IDE4NDMyMDAwLCA0ODAwMCwgMCwgIDB4MSB9LAorCXsgMTg0MzIwMDAsIDk2MDAwLCAwLCAweDFmIH0sCisKKwl7IDE2OTM0NDAwLCAgODAwMCwgMCwgMHgxNSB9LAorCXsgMTY5MzQ0MDAsIDExMDI1LCAwLCAweDE5IH0sCisJeyAxNjkzNDQwMCwgMjIwNTAsIDAsIDB4MWIgfSwKKwl7IDE2OTM0NDAwLCA0NDEwMCwgMCwgMHgxMSB9LAorCXsgMTY5MzQ0MDAsIDg4MjAwLCAwLCAweDFmIH0sCisKKwl7IDEyMDAwMDAwLCAgODAwMCwgMSwgIDB4NCB9LAorCXsgMTIwMDAwMDAsIDExMDI1LCAxLCAweDE5IH0sCisJeyAxMjAwMDAwMCwgMTIwMDAsIDEsICAweDggfSwKKwl7IDEyMDAwMDAwLCAxNjAwMCwgMSwgIDB4YSB9LAorCXsgMTIwMDAwMDAsIDIyMDUwLCAxLCAweDFiIH0sCisJeyAxMjAwMDAwMCwgMjQwMDAsIDEsIDB4MWMgfSwKKwl7IDEyMDAwMDAwLCAzMjAwMCwgMSwgIDB4YyB9LAorCXsgMTIwMDAwMDAsIDQ0MTAwLCAxLCAweDExIH0sCisJeyAxMjAwMDAwMCwgNDgwMDAsIDEsICAweDAgfSwKKwl7IDEyMDAwMDAwLCA4ODIwMCwgMSwgMHgxZiB9LAorCXsgMTIwMDAwMDAsIDk2MDAwLCAxLCAgMHhlIH0sCit9OworCitzdGF0aWMgaW50IHdtODczN19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHdtODczN19wcml2ICp3bTg3MzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaTsKKwl1MTYgY2xvY2tpbmcgPSAwOworCXUxNiBhZiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2VmZl9kaXYpOyBpKyspIHsKKwkJaWYgKGNvZWZmX2RpdltpXS5yYXRlICE9IHBhcmFtc19yYXRlKHBhcmFtcykpCisJCQljb250aW51ZTsKKworCQlpZiAoY29lZmZfZGl2W2ldLm1jbGsgPT0gd204NzM3LT5tY2xrKQorCQkJYnJlYWs7CisKKwkJaWYgKGNvZWZmX2RpdltpXS5tY2xrID09IHdtODczNy0+bWNsayAqIDIpIHsKKwkJCWNsb2NraW5nIHw9IFdNODczN19DTEtESVYyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGNvZWZmX2RpdikpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJWRIeiBNQ0xLIGNhbid0IHN1cHBvcnQgJWRIelxuIiwKKwkJCXdtODczNy0+bWNsaywgcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNsb2NraW5nIHw9IGNvZWZmX2RpdltpXS51c2IgfCAoY29lZmZfZGl2W2ldLnNyIDw8IFdNODczN19TUl9TSElGVCk7CisKKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQlhZiB8PSAweDg7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWFmIHw9IDB4MTA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWFmIHw9IDB4MTg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODczN19BVURJT19GT1JNQVQsIFdNODczN19XTF9NQVNLLCBhZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzM3X0NMT0NLSU5HLAorCQkJICAgIFdNODczN19VU0JfTU9ERSB8IFdNODczN19DTEtESVYyIHwgV004NzM3X1NSX01BU0ssCisJCQkgICAgY2xvY2tpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzM3X3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQkJCSBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCB3bTg3MzdfcHJpdiAqd204NzM3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2VmZl9kaXYpOyBpKyspIHsKKwkJaWYgKGZyZXEgPT0gY29lZmZfZGl2W2ldLm1jbGsgfHwKKwkJICAgIGZyZXEgPT0gY29lZmZfZGl2W2ldLm1jbGsgKiAyKSB7CisJCQl3bTg3MzctPm1jbGsgPSBmcmVxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJNQ0xLIHJhdGUgJWRIeiBub3Qgc3VwcG9ydGVkXG4iLCBmcmVxKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbnQgd204NzM3X3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IGFmID0gMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWFmIHw9IFdNODczN19NUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWFmIHw9IDB4MjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJYWYgfD0gMHgxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlhZiB8PSAweDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCWFmIHw9IDB4MTM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlhZiB8PSBXTTg3MzdfTFJQOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MzdfQVVESU9fRk9STUFULAorCQkJICAgIFdNODczN19GT1JNQVRfTUFTSyB8IFdNODczN19MUlAgfCBXTTg3MzdfTVMsIGFmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczN19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN0cnVjdCB3bTg3MzdfcHJpdiAqd204NzM3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkvKiBWTUlEIGF0IDIqNzVrICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODczN19NSVNDX0JJQVNfQ09OVFJPTCwKKwkJCQkgICAgV004NzM3X1ZNSURTRUxfTUFTSywgMCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204NzM3LT5zdXBwbGllcyksCisJCQkJCQkgICAgd204NzM3LT5zdXBwbGllcyk7CisJCQlpZiAocmV0ICE9IDApIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCisJCQkvKiBGYXN0IFZNSUQgcmFtcCBhdCAyKjIuNWsgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODczN19NSVNDX0JJQVNfQ09OVFJPTCwKKwkJCQkJICAgIFdNODczN19WTUlEU0VMX01BU0ssIDB4NCk7CisKKwkJCS8qIEJyaW5nIFZNSUQgdXAgKi8KKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODczN19QT1dFUl9NQU5BR0VNRU5ULAorCQkJCQkgICAgV004NzM3X1ZNSURfTUFTSyB8CisJCQkJCSAgICBXTTg3MzdfVlJFRl9NQVNLLAorCQkJCQkgICAgV004NzM3X1ZNSURfTUFTSyB8CisJCQkJCSAgICBXTTg3MzdfVlJFRl9NQVNLKTsKKworCQkJbXNsZWVwKDUwMCk7CisJCX0KKworCQkvKiBWTUlEIGF0IDIqMzAwayAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MzdfTUlTQ19CSUFTX0NPTlRST0wsCisJCQkJICAgIFdNODczN19WTUlEU0VMX01BU0ssIDIpOworCisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MzdfUE9XRVJfTUFOQUdFTUVOVCwKKwkJCQkgICAgV004NzM3X1ZNSURfTUFTSyB8IFdNODczN19WUkVGX01BU0ssIDApOworCisJCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg3MzctPnN1cHBsaWVzKSwKKwkJCQkgICAgICAgd204NzM3LT5zdXBwbGllcyk7CisJCWJyZWFrOworCX0KKworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBXTTg3MzdfUkFURVMgU05EUlZfUENNX1JBVEVfODAwMF85NjAwMAorCisjZGVmaW5lIFdNODczN19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgd204NzM3X2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcwk9IHdtODczN19od19wYXJhbXMsCisJLnNldF9zeXNjbGsJPSB3bTg3Mzdfc2V0X2RhaV9zeXNjbGssCisJLnNldF9mbXQJPSB3bTg3Mzdfc2V0X2RhaV9mbXQsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTg3MzdfZGFpID0geworCS5uYW1lID0gIndtODczNyIsCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDIsICAvKiBNb25vIG1vZGVzIG5vdCB5ZXQgc3VwcG9ydGVkICovCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg3MzdfUkFURVMsCisJCS5mb3JtYXRzID0gV004NzM3X0ZPUk1BVFMsCisJfSwKKwkub3BzID0gJndtODczN19kYWlfb3BzLAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB3bTg3Mzdfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl3bTg3Mzdfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODczN19yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXdtODczN19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgd204NzM3X3N1c3BlbmQgTlVMTAorI2RlZmluZSB3bTg3MzdfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHdtODczN19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODczN19wcml2ICp3bTg3MzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODczNy0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBJL086ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpOyBpKyspCisJCXdtODczNy0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204NzM3X3N1cHBseV9uYW1lc1tpXTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldChjb2RlYy0+ZGV2LCBBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLAorCQkJCSB3bTg3MzctPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLAorCQkJCSAgICB3bTg3MzctPnN1cHBsaWVzKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2dldDsKKwl9CisKKwlyZXQgPSB3bTg3MzdfcmVzZXQoY29kZWMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBpc3N1ZSByZXNldFxuIik7CisJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3MzdfTEVGVF9QR0FfVk9MVU1FLCBXTTg3MzdfTFZVLAorCQkJICAgIFdNODczN19MVlUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODczN19SSUdIVF9QR0FfVk9MVU1FLCBXTTg3MzdfUlZVLAorCQkJICAgIFdNODczN19SVlUpOworCisJd204NzM3X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisKKwkvKiBCaWFzIGxldmVsIGNvbmZpZ3VyYXRpb24gd2lsbCBoYXZlIGRvbmUgYW4gZXh0cmEgZW5hYmxlICovCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLCB3bTg3MzctPnN1cHBsaWVzKTsKKworCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg3Mzdfc25kX2NvbnRyb2xzLAorCQkJICAgICBBUlJBWV9TSVpFKHdtODczN19zbmRfY29udHJvbHMpKTsKKwl3bTg3MzdfYWRkX3dpZGdldHMoY29kZWMpOworCisJcmV0dXJuIDA7CisKK2Vycl9lbmFibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLCB3bTg3MzctPnN1cHBsaWVzKTsKK2Vycl9nZXQ6CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLCB3bTg3MzctPnN1cHBsaWVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NzM3X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODczN19wcml2ICp3bTg3MzcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXdtODczN19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODczNy0+c3VwcGxpZXMpLCB3bTg3MzctPnN1cHBsaWVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODczNyA9IHsKKwkucHJvYmUJCT0gd204NzM3X3Byb2JlLAorCS5yZW1vdmUJCT0gd204NzM3X3JlbW92ZSwKKwkuc3VzcGVuZAk9IHdtODczN19zdXNwZW5kLAorCS5yZXN1bWUJCT0gd204NzM3X3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3Mzdfc2V0X2JpYXNfbGV2ZWwsCisKKwkucmVnX2NhY2hlX3NpemUgPSBXTTg3MzdfUkVHSVNURVJfQ09VTlQgLSAxLCAvKiBTa2lwIHJlc2V0ICovCisJLnJlZ193b3JkX3NpemUJPSBzaXplb2YodTE2KSwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTg3MzdfcmVnLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0kyQykgfHwgZGVmaW5lZChDT05GSUdfSTJDX01PRFVMRSkKK3N0YXRpYyBfX2RldmluaXQgaW50IHdtODczN19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHdtODczN19wcml2ICp3bTg3Mzc7CisJaW50IHJldDsKKworCXdtODczNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3MzdfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh3bTg3MzcgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg3MzcpOworCXdtODczNy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19JMkM7CisKKwlyZXQgPSAgc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCisJCQkJICAgICAgJnNvY19jb2RlY19kZXZfd204NzM3LCAmd204NzM3X2RhaSwgMSk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKHdtODczNyk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgX19kZXZleGl0IGludCB3bTg3MzdfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODczN19pMmNfaWRbXSA9IHsKKwl7ICJ3bTg3MzciLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODczN19pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzM3X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid204NzM3IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSAgICB3bTg3MzdfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIF9fZGV2ZXhpdF9wKHdtODczN19pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSB3bTg3MzdfaTJjX2lkLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdtODczN19zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgd204NzM3X3ByaXYgKndtODczNzsKKwlpbnQgcmV0OworCisJd204NzM3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtODczN19wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdtODczNyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODczNy0+Y29udHJvbF90eXBlID0gU05EX1NPQ19TUEk7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgd204NzM3KTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204NzM3LCAmd204NzM3X2RhaSwgMSk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKHdtODczNyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204NzM3X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlrZnJlZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3Mzdfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ3bTg3MzciLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB3bTg3Mzdfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aod204NzM3X3NwaV9yZW1vdmUpLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfU1BJX01BU1RFUiAqLworCitzdGF0aWMgaW50IF9faW5pdCB3bTg3MzdfbW9kaW5pdCh2b2lkKQoreworCWludCByZXQ7CisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCXJldCA9IGkyY19hZGRfZHJpdmVyKCZ3bTg3MzdfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODczNyBJMkMgZHJpdmVyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ3bTg3Mzdfc3BpX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIFdNODczNyBTUEkgZHJpdmVyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh3bTg3MzdfbW9kaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTg3MzdfZXhpdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bTg3Mzdfc3BpX2RyaXZlcik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJaTJjX2RlbF9kcml2ZXIoJndtODczN19pMmNfZHJpdmVyKTsKKyNlbmRpZgorfQorbW9kdWxlX2V4aXQod204NzM3X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgV004NzM3IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5oIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QxNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuaApAQCAtMCwwICsxLDMyMiBAQAorI2lmbmRlZiBfV004NzM3X0gKKyNkZWZpbmUgX1dNODczN19ICisKKy8qCisgKiB3bTg3MzcuYyAgLS0gIFdNODUyMyBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBNYXJrIEJyb3duIDxicm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKy8qCisgKiBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgV004NzM3X0xFRlRfUEdBX1ZPTFVNRSAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV004NzM3X1JJR0hUX1BHQV9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV004NzM3X0FVRElPX1BBVEhfTCAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV004NzM3X0FVRElPX1BBVEhfUiAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgV004NzM3XzNEX0VOSEFOQ0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV004NzM3X0FEQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgV004NzM3X1BPV0VSX01BTkFHRU1FTlQgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgV004NzM3X0FVRElPX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgV004NzM3X0NMT0NLSU5HICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgV004NzM3X01JQ19QUkVBTVBfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgV004NzM3X01JU0NfQklBU19DT05UUk9MICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgV004NzM3X05PSVNFX0dBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgV004NzM3X0FMQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgV004NzM3X0FMQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgV004NzM3X0FMQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgV004NzM3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKworI2RlZmluZSBXTTg3MzdfUkVHSVNURVJfQ09VTlQgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgV004NzM3X01BWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgIDB4MEYKKworLyoKKyAqIEZpZWxkIERlZmluaXRpb25zLgorICovCisKKy8qCisgKiBSMCAoMHgwMCkgLSBMZWZ0IFBHQSB2b2x1bWUKKyAqLworI2RlZmluZSBXTTg3MzdfTFZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBMVlUgKi8KKyNkZWZpbmUgV004NzM3X0xWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogTFZVICovCisjZGVmaW5lIFdNODczN19MVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIExWVSAqLworI2RlZmluZSBXTTg3MzdfTFZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMVlUgKi8KKyNkZWZpbmUgV004NzM3X0xJTlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogTElOVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NzM3X0xJTlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTElOVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NzM3X0xJTlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogTElOVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxICgweDAxKSAtIFJpZ2h0IFBHQSB2b2x1bWUKKyAqLworI2RlZmluZSBXTTg3MzdfUlZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBSVlUgKi8KKyNkZWZpbmUgV004NzM3X1JWVV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogUlZVICovCisjZGVmaW5lIFdNODczN19SVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIFJWVSAqLworI2RlZmluZSBXTTg3MzdfUlZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSVlUgKi8KKyNkZWZpbmUgV004NzM3X1JJTlZPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRiAgLyogUklOVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NzM3X1JJTlZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogUklOVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004NzM3X1JJTlZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogUklOVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyICgweDAyKSAtIEFVRElPIHBhdGggTAorICovCisjZGVmaW5lIFdNODczN19MSU5TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxODAgIC8qIExJTlNFTCAtIFs4OjddICovCisjZGVmaW5lIFdNODczN19MSU5TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIExJTlNFTCAtIFs4OjddICovCisjZGVmaW5lIFdNODczN19MSU5TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExJTlNFTCAtIFs4OjddICovCisjZGVmaW5lIFdNODczN19MTUlDQk9PU1RfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwNjAgIC8qIExNSUNCT09TVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODczN19MTUlDQk9PU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIExNSUNCT09TVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODczN19MTUlDQk9PU1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExNSUNCT09TVCAtIFs2OjVdICovCisjZGVmaW5lIFdNODczN19MTUJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExNQkUgKi8KKyNkZWZpbmUgV004NzM3X0xNQkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTE1CRSAqLworI2RlZmluZSBXTTg3MzdfTE1CRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMTUJFICovCisjZGVmaW5lIFdNODczN19MTUJFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExNQkUgKi8KKyNkZWZpbmUgV004NzM3X0xNWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogTE1aQyAqLworI2RlZmluZSBXTTg3MzdfTE1aQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBMTVpDICovCisjZGVmaW5lIFdNODczN19MTVpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIExNWkMgKi8KKyNkZWZpbmUgV004NzM3X0xNWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTE1aQyAqLworI2RlZmluZSBXTTg3MzdfTFBaQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMUFpDICovCisjZGVmaW5lIFdNODczN19MUFpDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExQWkMgKi8KKyNkZWZpbmUgV004NzM3X0xQWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTFBaQyAqLworI2RlZmluZSBXTTg3MzdfTFBaQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBMUFpDICovCisjZGVmaW5lIFdNODczN19MWkNUT19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIExaQ1RPIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NzM3X0xaQ1RPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogTFpDVE8gLSBbMTowXSAqLworI2RlZmluZSBXTTg3MzdfTFpDVE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBMWkNUTyAtIFsxOjBdICovCisKKy8qCisgKiBSMyAoMHgwMykgLSBBVURJTyBwYXRoIFIKKyAqLworI2RlZmluZSBXTTg3MzdfUklOU0VMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTgwICAvKiBSSU5TRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg3MzdfUklOU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBSSU5TRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg3MzdfUklOU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBSSU5TRUwgLSBbODo3XSAqLworI2RlZmluZSBXTTg3MzdfUk1JQ0JPT1NUX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBSTUlDQk9PU1QgLSBbNjo1XSAqLworI2RlZmluZSBXTTg3MzdfUk1JQ0JPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBSTUlDQk9PU1QgLSBbNjo1XSAqLworI2RlZmluZSBXTTg3MzdfUk1JQ0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBSTUlDQk9PU1QgLSBbNjo1XSAqLworI2RlZmluZSBXTTg3MzdfUk1CRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBSTUJFICovCisjZGVmaW5lIFdNODczN19STUJFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFJNQkUgKi8KKyNkZWZpbmUgV004NzM3X1JNQkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUk1CRSAqLworI2RlZmluZSBXTTg3MzdfUk1CRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBSTUJFICovCisjZGVmaW5lIFdNODczN19STVpDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFJNWkMgKi8KKyNkZWZpbmUgV004NzM3X1JNWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUk1aQyAqLworI2RlZmluZSBXTTg3MzdfUk1aQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSTVpDICovCisjZGVmaW5lIFdNODczN19STVpDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFJNWkMgKi8KKyNkZWZpbmUgV004NzM3X1JQWkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogUlBaQyAqLworI2RlZmluZSBXTTg3MzdfUlBaQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBSUFpDICovCisjZGVmaW5lIFdNODczN19SUFpDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFJQWkMgKi8KKyNkZWZpbmUgV004NzM3X1JQWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUlBaQyAqLworI2RlZmluZSBXTTg3MzdfUlpDVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBSWkNUTyAtIFsxOjBdICovCisjZGVmaW5lIFdNODczN19SWkNUT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJaQ1RPIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NzM3X1JaQ1RPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUlpDVE8gLSBbMTowXSAqLworCisvKgorICogUjQgKDB4MDQpIC0gM0QgRW5oYW5jZQorICovCisjZGVmaW5lIFdNODczN19ESVYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIERJVjIgKi8KKyNkZWZpbmUgV004NzM3X0RJVjJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogRElWMiAqLworI2RlZmluZSBXTTg3MzdfRElWMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBESVYyICovCisjZGVmaW5lIFdNODczN19ESVYyX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIERJVjIgKi8KKyNkZWZpbmUgV004NzM3XzNETEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogM0RMQyAqLworI2RlZmluZSBXTTg3MzdfM0RMQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiAzRExDICovCisjZGVmaW5lIFdNODczN18zRExDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIDNETEMgKi8KKyNkZWZpbmUgV004NzM3XzNETENfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogM0RMQyAqLworI2RlZmluZSBXTTg3MzdfM0RVQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwICAvKiAzRFVDICovCisjZGVmaW5lIFdNODczN18zRFVDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIDNEVUMgKi8KKyNkZWZpbmUgV004NzM3XzNEVUNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogM0RVQyAqLworI2RlZmluZSBXTTg3MzdfM0RVQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiAzRFVDICovCisjZGVmaW5lIFdNODczN18zRERFUFRIX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMUUgIC8qIDNEREVQVEggLSBbNDoxXSAqLworI2RlZmluZSBXTTg3MzdfM0RERVBUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiAzRERFUFRIIC0gWzQ6MV0gKi8KKyNkZWZpbmUgV004NzM3XzNEREVQVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogM0RERVBUSCAtIFs0OjFdICovCisjZGVmaW5lIFdNODczN18zREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIDNERSAqLworI2RlZmluZSBXTTg3MzdfM0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiAzREUgKi8KKyNkZWZpbmUgV004NzM3XzNERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogM0RFICovCisjZGVmaW5lIFdNODczN18zREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIDNERSAqLworCisvKgorICogUjUgKDB4MDUpIC0gQURDIENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg3MzdfTU9OT01JWF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTgwICAvKiBNT05PTUlYIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NzM3X01PTk9NSVhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogTU9OT01JWCAtIFs4OjddICovCisjZGVmaW5lIFdNODczN19NT05PTUlYX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE1PTk9NSVggLSBbODo3XSAqLworI2RlZmluZSBXTTg3MzdfUE9MQVJJVFlfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDYwICAvKiBQT0xBUklUWSAtIFs2OjVdICovCisjZGVmaW5lIFdNODczN19QT0xBUklUWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIFBPTEFSSVRZIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004NzM3X1BPTEFSSVRZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogUE9MQVJJVFkgLSBbNjo1XSAqLworI2RlZmluZSBXTTg3MzdfSFBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBIUE9SICovCisjZGVmaW5lIFdNODczN19IUE9SX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEhQT1IgKi8KKyNkZWZpbmUgV004NzM3X0hQT1JfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogSFBPUiAqLworI2RlZmluZSBXTTg3MzdfSFBPUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBIUE9SICovCisjZGVmaW5lIFdNODczN19MUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExQICovCisjZGVmaW5lIFdNODczN19MUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExQICovCisjZGVmaW5lIFdNODczN19MUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIExQICovCisjZGVmaW5lIFdNODczN19MUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExQICovCisjZGVmaW5lIFdNODczN19NT05PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIE1PTk9VVCAqLworI2RlZmluZSBXTTg3MzdfTU9OT1VUX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBNT05PVVQgKi8KKyNkZWZpbmUgV004NzM3X01PTk9VVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTU9OT1VUICovCisjZGVmaW5lIFdNODczN19NT05PVVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE1PTk9VVCAqLworI2RlZmluZSBXTTg3MzdfQURDSFBEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBRENIUEQgKi8KKyNkZWZpbmUgV004NzM3X0FEQ0hQRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQURDSFBEICovCisjZGVmaW5lIFdNODczN19BRENIUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFEQ0hQRCAqLworI2RlZmluZSBXTTg3MzdfQURDSFBEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBRENIUEQgKi8KKworLyoKKyAqIFI2ICgweDA2KSAtIFBvd2VyIE1hbmFnZW1lbnQKKyAqLworI2RlZmluZSBXTTg3MzdfVk1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBWTUlEICovCisjZGVmaW5lIFdNODczN19WTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIFZNSUQgKi8KKyNkZWZpbmUgV004NzM3X1ZNSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogVk1JRCAqLworI2RlZmluZSBXTTg3MzdfVk1JRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBWTUlEICovCisjZGVmaW5lIFdNODczN19WUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIFZSRUYgKi8KKyNkZWZpbmUgV004NzM3X1ZSRUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogVlJFRiAqLworI2RlZmluZSBXTTg3MzdfVlJFRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBWUkVGICovCisjZGVmaW5lIFdNODczN19WUkVGX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFZSRUYgKi8KKyNkZWZpbmUgV004NzM3X0FJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUkgKi8KKyNkZWZpbmUgV004NzM3X0FJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQUkgKi8KKyNkZWZpbmUgV004NzM3X0FJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogQUkgKi8KKyNkZWZpbmUgV004NzM3X0FJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUkgKi8KKyNkZWZpbmUgV004NzM3X1BHTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMCAgLyogUEdMICovCisjZGVmaW5lIFdNODczN19QR0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgIC8qIFBHTCAqLworI2RlZmluZSBXTTg3MzdfUEdMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBQR0wgKi8KKyNkZWZpbmUgV004NzM3X1BHTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUEdMICovCisjZGVmaW5lIFdNODczN19QR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIFBHUiAqLworI2RlZmluZSBXTTg3MzdfUEdSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBQR1IgKi8KKyNkZWZpbmUgV004NzM3X1BHUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogUEdSICovCisjZGVmaW5lIFdNODczN19QR1JfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFBHUiAqLworI2RlZmluZSBXTTg3MzdfQURMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBREwgKi8KKyNkZWZpbmUgV004NzM3X0FETF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogQURMICovCisjZGVmaW5lIFdNODczN19BRExfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEFETCAqLworI2RlZmluZSBXTTg3MzdfQURMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBBREwgKi8KKyNkZWZpbmUgV004NzM3X0FEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogQURSICovCisjZGVmaW5lIFdNODczN19BRFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFEUiAqLworI2RlZmluZSBXTTg3MzdfQURSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBBRFIgKi8KKyNkZWZpbmUgV004NzM3X0FEUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQURSICovCisjZGVmaW5lIFdNODczN19NSUNCSUFTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIE1JQ0JJQVMgLSBbMTowXSAqLworI2RlZmluZSBXTTg3MzdfTUlDQklBU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNSUNCSUFTIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004NzM3X01JQ0JJQVNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTUlDQklBUyAtIFsxOjBdICovCisKKy8qCisgKiBSNyAoMHgwNykgLSBBdWRpbyBGb3JtYXQKKyAqLworI2RlZmluZSBXTTg3MzdfU0RPRElTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBTRE9ESVMgKi8KKyNkZWZpbmUgV004NzM3X1NET0RJU19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogU0RPRElTICovCisjZGVmaW5lIFdNODczN19TRE9ESVNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIFNET0RJUyAqLworI2RlZmluZSBXTTg3MzdfU0RPRElTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBTRE9ESVMgKi8KKyNkZWZpbmUgV004NzM3X01TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTVMgKi8KKyNkZWZpbmUgV004NzM3X01TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogTVMgKi8KKyNkZWZpbmUgV004NzM3X01TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgLyogTVMgKi8KKyNkZWZpbmUgV004NzM3X01TX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTVMgKi8KKyNkZWZpbmUgV004NzM3X0xSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogTFJQICovCisjZGVmaW5lIFdNODczN19MUlBfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIExSUCAqLworI2RlZmluZSBXTTg3MzdfTFJQX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBMUlAgKi8KKyNkZWZpbmUgV004NzM3X0xSUF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogTFJQICovCisjZGVmaW5lIFdNODczN19XTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEMgIC8qIFdMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NzM3X1dMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogV0wgLSBbMzoyXSAqLworI2RlZmluZSBXTTg3MzdfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBXTCAtIFszOjJdICovCisjZGVmaW5lIFdNODczN19GT1JNQVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEZPUk1BVCAtIFsxOjBdICovCisjZGVmaW5lIFdNODczN19GT1JNQVRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZPUk1BVCAtIFsxOjBdICovCisjZGVmaW5lIFdNODczN19GT1JNQVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEZPUk1BVCAtIFsxOjBdICovCisKKy8qCisgKiBSOCAoMHgwOCkgLSBDbG9ja2luZworICovCisjZGVmaW5lIFdNODczN19BVVRPREVURUNUICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEFVVE9ERVRFQ1QgKi8KKyNkZWZpbmUgV004NzM3X0FVVE9ERVRFQ1RfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogQVVUT0RFVEVDVCAqLworI2RlZmluZSBXTTg3MzdfQVVUT0RFVEVDVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBBVVRPREVURUNUICovCisjZGVmaW5lIFdNODczN19BVVRPREVURUNUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEFVVE9ERVRFQ1QgKi8KKyNkZWZpbmUgV004NzM3X0NMS0RJVjIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCAgLyogQ0xLRElWMiAqLworI2RlZmluZSBXTTg3MzdfQ0xLRElWMl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDQwICAvKiBDTEtESVYyICovCisjZGVmaW5lIFdNODczN19DTEtESVYyX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIENMS0RJVjIgKi8KKyNkZWZpbmUgV004NzM3X0NMS0RJVjJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLRElWMiAqLworI2RlZmluZSBXTTg3MzdfU1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNFICAvKiBTUiAtIFs1OjFdICovCisjZGVmaW5lIFdNODczN19TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFNSIC0gWzU6MV0gKi8KKyNkZWZpbmUgV004NzM3X1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogU1IgLSBbNToxXSAqLworI2RlZmluZSBXTTg3MzdfVVNCX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBVU0IgTU9ERSAqLworI2RlZmluZSBXTTg3MzdfVVNCX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBVU0IgTU9ERSAqLworI2RlZmluZSBXTTg3MzdfVVNCX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBVU0IgTU9ERSAqLworI2RlZmluZSBXTTg3MzdfVVNCX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBVU0IgTU9ERSAqLworCisvKgorICogUjkgKDB4MDkpIC0gTUlDIFByZWFtcCBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NzM3X1JCWVBFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogUkJZUEVOICovCisjZGVmaW5lIFdNODczN19SQllQRU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDggIC8qIFJCWVBFTiAqLworI2RlZmluZSBXTTg3MzdfUkJZUEVOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAzICAvKiBSQllQRU4gKi8KKyNkZWZpbmUgV004NzM3X1JCWVBFTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogUkJZUEVOICovCisjZGVmaW5lIFdNODczN19MQllQRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIExCWVBFTiAqLworI2RlZmluZSBXTTg3MzdfTEJZUEVOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBMQllQRU4gKi8KKyNkZWZpbmUgV004NzM3X0xCWVBFTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogTEJZUEVOICovCisjZGVmaW5lIFdNODczN19MQllQRU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIExCWVBFTiAqLworI2RlZmluZSBXTTg3MzdfTUJDVFJMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBNQkNUUkwgLSBbMTowXSAqLworI2RlZmluZSBXTTg3MzdfTUJDVFJMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBNQkNUUkwgLSBbMTowXSAqLworI2RlZmluZSBXTTg3MzdfTUJDVFJMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBNQkNUUkwgLSBbMTowXSAqLworCisvKgorICogUjEwICgweDBBKSAtIE1pc2MgQmlhcyBDb250cm9sCisgKi8KKyNkZWZpbmUgV004NzM3X1ZNSURTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAgLyogVk1JRFNFTCAtIFszOjJdICovCisjZGVmaW5lIFdNODczN19WTUlEU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIFZNSURTRUwgLSBbMzoyXSAqLworI2RlZmluZSBXTTg3MzdfVk1JRFNFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBWTUlEU0VMIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004NzM3X0xJTlBVVDFfRENfQklBU19FTkFCTEUgICAgICAgICAgIDB4MDAwMiAgLyogTElOUFVUMSBEQyBCSUFTIEVOQUJMRSAqLworI2RlZmluZSBXTTg3MzdfTElOUFVUMV9EQ19CSUFTX0VOQUJMRV9NQVNLICAgICAgMHgwMDAyICAvKiBMSU5QVVQxIERDIEJJQVMgRU5BQkxFICovCisjZGVmaW5lIFdNODczN19MSU5QVVQxX0RDX0JJQVNfRU5BQkxFX1NISUZUICAgICAgICAgIDEgIC8qIExJTlBVVDEgREMgQklBUyBFTkFCTEUgKi8KKyNkZWZpbmUgV004NzM3X0xJTlBVVDFfRENfQklBU19FTkFCTEVfV0lEVEggICAgICAgICAgMSAgLyogTElOUFVUMSBEQyBCSUFTIEVOQUJMRSAqLworI2RlZmluZSBXTTg3MzdfUklOUFVUMV9EQ19CSUFTX0VOQUJMRSAgICAgICAgICAgMHgwMDAxICAvKiBSSU5QVVQxIERDIEJJQVMgRU5BQkxFICovCisjZGVmaW5lIFdNODczN19SSU5QVVQxX0RDX0JJQVNfRU5BQkxFX01BU0sgICAgICAweDAwMDEgIC8qIFJJTlBVVDEgREMgQklBUyBFTkFCTEUgKi8KKyNkZWZpbmUgV004NzM3X1JJTlBVVDFfRENfQklBU19FTkFCTEVfU0hJRlQgICAgICAgICAgMCAgLyogUklOUFVUMSBEQyBCSUFTIEVOQUJMRSAqLworI2RlZmluZSBXTTg3MzdfUklOUFVUMV9EQ19CSUFTX0VOQUJMRV9XSURUSCAgICAgICAgICAxICAvKiBSSU5QVVQxIERDIEJJQVMgRU5BQkxFICovCisKKy8qCisgKiBSMTEgKDB4MEIpIC0gTm9pc2UgR2F0ZQorICovCisjZGVmaW5lIFdNODczN19OR1RIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUMgIC8qIE5HVEggLSBbNDoyXSAqLworI2RlZmluZSBXTTg3MzdfTkdUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBOR1RIIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004NzM3X05HVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgLyogTkdUSCAtIFs0OjJdICovCisjZGVmaW5lIFdNODczN19OR0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE5HQVQgKi8KKyNkZWZpbmUgV004NzM3X05HQVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogTkdBVCAqLworI2RlZmluZSBXTTg3MzdfTkdBVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBOR0FUICovCisjZGVmaW5lIFdNODczN19OR0FUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIE5HQVQgKi8KKworLyoKKyAqIFIxMiAoMHgwQykgLSBBTEMxCisgKi8KKyNkZWZpbmUgV004NzM3X0FMQ1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MCAgLyogQUxDU0VMIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NzM3X0FMQ1NFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogQUxDU0VMIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NzM3X0FMQ1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogQUxDU0VMIC0gWzg6N10gKi8KKyNkZWZpbmUgV004NzM3X01BWF9HQUlOX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA3MCAgLyogTUFYIEdBSU4gLSBbNjo0XSAqLworI2RlZmluZSBXTTg3MzdfTUFYX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBNQVggR0FJTiAtIFs2OjRdICovCisjZGVmaW5lIFdNODczN19NQVhfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIE1BWCBHQUlOIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004NzM3X0FMQ0xfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogQUxDTCAtIFszOjBdICovCisjZGVmaW5lIFdNODczN19BTENMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFMQ0wgLSBbMzowXSAqLworI2RlZmluZSBXTTg3MzdfQUxDTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBTENMIC0gWzM6MF0gKi8KKworLyoKKyAqIFIxMyAoMHgwRCkgLSBBTEMyCisgKi8KKyNkZWZpbmUgV004NzM3X0FMQ1pDRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMCAgLyogQUxDWkNFICovCisjZGVmaW5lIFdNODczN19BTENaQ0VfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgIC8qIEFMQ1pDRSAqLworI2RlZmluZSBXTTg3MzdfQUxDWkNFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBTENaQ0UgKi8KKyNkZWZpbmUgV004NzM3X0FMQ1pDRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQUxDWkNFICovCisjZGVmaW5lIFdNODczN19ITERfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEhMRCAtIFszOjBdICovCisjZGVmaW5lIFdNODczN19ITERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEhMRCAtIFszOjBdICovCisjZGVmaW5lIFdNODczN19ITERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEhMRCAtIFszOjBdICovCisKKy8qCisgKiBSMTQgKDB4MEUpIC0gQUxDMworICovCisjZGVmaW5lIFdNODczN19EQ1lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRjAgIC8qIERDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODczN19EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODczN19EQ1lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIERDWSAtIFs3OjRdICovCisjZGVmaW5lIFdNODczN19BVEtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEFUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODczN19BVEtfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEFUSyAtIFszOjBdICovCisjZGVmaW5lIFdNODczN19BVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEFUSyAtIFszOjBdICovCisKKy8qCisgKiBSMTUgKDB4MEYpIC0gUmVzZXQKKyAqLworI2RlZmluZSBXTTg3MzdfUkVTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMUZGICAvKiBSRVNFVCAtIFs4OjBdICovCisjZGVmaW5lIFdNODczN19SRVNFVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIFJFU0VUIC0gWzg6MF0gKi8KKyNkZWZpbmUgV004NzM3X1JFU0VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgLyogUkVTRVQgLSBbODowXSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCmluZGV4IGFlYTYwZWYuLjQ5NGYyZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtOTQsMTAgKzkzLDExIEBACiAKIHN0YXRpYyBpbnQgd204NzQxX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg3NDFfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg3NDFfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NDFfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg3NDFfZGFwbV93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJLnJlc3VtZSA9CXdtODc0MV9yZXN1bWUsCiAJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRSh3bTg3NDFfcmVnX2RlZmF1bHRzKSwKIAkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAotCS5yZWdfY2FjaGVfZGVmYXVsdCA9ICZ3bTg3NDFfcmVnX2RlZmF1bHRzLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc0MV9yZWdfZGVmYXVsdHMsCiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKaW5kZXggNmM5MjRjZC4uMzhmMzhmZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiAjaW5jbHVkZSAid204NzUwLmgiCkBAIC01Myw3ICs1Miw2IEBACiBzdHJ1Y3Qgd204NzUwX3ByaXYgewogCXVuc2lnbmVkIGludCBzeXNjbGs7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7Ci0JdTE2IHJlZ19jYWNoZVtBUlJBWV9TSVpFKHdtODc1MF9yZWcpXTsKIH07CiAKICNkZWZpbmUgd204NzUwX3Jlc2V0KGMpCXNuZF9zb2Nfd3JpdGUoYywgV004NzUwX1JFU0VULCAwKQpAQCAtMzk5LDEwICszOTcsMTEgQEAKIAogc3RhdGljIGludCB3bTg3NTBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc1MF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NzUwX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjE1LDcgKzYxNCw3IEBACiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogU2V0IFZNSUQgdG8gNWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9QV1IxLCBwd3JfcmVnIHwgMHgwMWMxKTsKIApAQCAtNjMwLDcgKzYyOSw3IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1MF9QV1IxLCAweDAwMDEpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCmluZGV4IDg3Y2FhZTUuLjc5YjAyYWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTYyMywxMCArNjIyLDExIEBACiAKIHN0YXRpYyBpbnQgd204NzUzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg3NTNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg3NTNfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODc1M19kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNDUsNyArMTI0NSw3IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1M19QV1IxLCAweDAwMDEpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzUsOSArMTQzNSwxMSBAQAogCiBzdGF0aWMgdm9pZCB3bTg3NTNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2NvZGVjLCBkZWxheWVkX3dvcmsud29yayk7Ci0Jd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBjb2RlYy0+Ymlhc19sZXZlbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCwKKwkJCSAgICAgZGVsYXllZF93b3JrLndvcmspOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhcG0tPmNvZGVjOworCXdtODc1M19zZXRfYmlhc19sZXZlbChjb2RlYywgZGFwbS0+Ymlhc19sZXZlbCk7CiB9CiAKIHN0YXRpYyBpbnQgd204NzUzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCkBAIC0xNDY2LDQxICsxNDY4LDIyIEBACiAJd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKIAkvKiBjaGFyZ2Ugd204NzUzIGNhcHMgKi8KLQlpZiAoY29kZWMtPnN1c3BlbmRfYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT04pIHsKKwlpZiAoY29kZWMtPmRhcG0uc3VzcGVuZF9iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PTikgewogCQl3bTg3NTNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19QUkVQQVJFKTsKLQkJY29kZWMtPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT047Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmRlbGF5ZWRfd29yaywKKwkJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PTjsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmssCiAJCQltc2Vjc190b19qaWZmaWVzKGNhcHNfY2hhcmdlKSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyBhbnkgZGVsYXllZCB3b3JrIHRvIGJlIHF1ZXVlZCBhbmQgcnVuLgotICovCi1zdGF0aWMgaW50IHJ1bl9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspCi17Ci0JaW50IHJldDsKLQotCS8qIGNhbmNlbCBhbnkgd29yayB3YWl0aW5nIHRvIGJlIHF1ZXVlZC4gKi8KLQlyZXQgPSBjYW5jZWxfZGVsYXllZF93b3JrKGR3b3JrKTsKLQotCS8qIGlmIHRoZXJlIHdhcyBhbnkgd29yayB3YWl0aW5nIHRoZW4gd2UgcnVuIGl0IG5vdyBhbmQKLQkgKiB3YWl0IGZvciBpdCdzIGNvbXBsZXRpb24gKi8KLQlpZiAocmV0KSB7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yayhkd29yaywgMCk7Ci0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgd204NzUzX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204NzUzX3ByaXYgKndtODc1MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCByZXQ7CiAKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRlbGF5ZWRfd29yaywgd204NzUzX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmssIHdtODc1M193b3JrKTsKIAogCXJldCA9IHNuZF9zb2NfY29kZWNfc2V0X2NhY2hlX2lvKGNvZGVjLCA3LCA5LCB3bTg3NTMtPmNvbnRyb2xfdHlwZSk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTE1MTksNyArMTUwMiw3IEBACiAKIAkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KIAl3bTg3NTNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19QUkVQQVJFKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmssCiAJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKGNhcHNfY2hhcmdlKSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCkBAIC0xNTQ0LDcgKzE1MjcsNyBAQAogLyogcG93ZXIgZG93biBjaGlwICovCiBzdGF0aWMgaW50IHdtODc1M19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXJ1bl9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmspOworCWZsdXNoX2RlbGF5ZWRfd29ya19zeW5jKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmspOwogCXdtODc1M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjkyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICogd204NzcwLmMgIC0tICBXTTg3NzAgQUxTQSBTb0MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIHBsYworICoKKyAqIEF1dGhvcjogRGltaXRyaXMgUGFwYXN0YW1vcyA8ZHBAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAid204NzcwLmgiCisKKyNkZWZpbmUgV004NzcwX05VTV9TVVBQTElFUyAzCitzdGF0aWMgY29uc3QgY2hhciAqd204NzcwX3N1cHBseV9uYW1lc1tXTTg3NzBfTlVNX1NVUFBMSUVTXSA9IHsKKwkiQVZERDEiLAorCSJBVkREMiIsCisJIkRWREQiCit9OworCitzdGF0aWMgY29uc3QgdTE2IHdtODc3MF9yZWdfZGVmc1tXTTg3NzBfQ0FDSEVSRUdOVU1dID0geworCTB4N2YsIDB4N2YsIDB4N2YsIDB4N2YsCisJMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKwkweDdmLCAweGZmLCAweGZmLCAweGZmLAorCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJMHhmZiwgMHhmZiwgMCwgMHg5MCwgMCwKKwkwLCAweDIyLCAweDIyLCAweDNlLAorCTB4YywgMHhjLCAweDEwMCwgMHgxODksCisJMHgxODksIDB4ODc3MAorfTsKKworc3RydWN0IHdtODc3MF9wcml2IHsKKwllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tXTTg3NzBfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGlzYWJsZV9uYltXTTg3NzBfTlVNX1NVUFBMSUVTXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IHN5c2NsazsKK307CisKK3N0YXRpYyBpbnQgdm91dDEyc3VwcGx5X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpOworc3RhdGljIGludCB2b3V0MzRzdXBwbHlfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7CisKKy8qCisgKiBXZSBjYW4ndCB1c2UgdGhlIHNhbWUgbm90aWZpZXIgYmxvY2sgZm9yIG1vcmUgdGhhbiBvbmUgc3VwcGx5IGFuZAorICogdGhlcmUncyBubyB3YXkgSSBjYW4gc2VlIHRvIGdldCBmcm9tIGEgY2FsbGJhY2sgdG8gdGhlIGNhbGxlcgorICogZXhjZXB0IGNvbnRhaW5lcl9vZigpLgorICovCisjZGVmaW5lIFdNODc3MF9SRUdVTEFUT1JfRVZFTlQobikgXAorc3RhdGljIGludCB3bTg3NzBfcmVndWxhdG9yX2V2ZW50XyMjbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBcCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkgICAgXAoreyBcCisJc3RydWN0IHdtODc3MF9wcml2ICp3bTg3NzAgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCB3bTg3NzBfcHJpdiwgXAorCQkJCSAgICAgZGlzYWJsZV9uYltuXSk7IFwKKwlpZiAoZXZlbnQgJiBSRUdVTEFUT1JfRVZFTlRfRElTQUJMRSkgeyBcCisJCXdtODc3MC0+Y29kZWMtPmNhY2hlX3N5bmMgPSAxOyBcCisJfSBcCisJcmV0dXJuIDA7IFwKK30KKworV004NzcwX1JFR1VMQVRPUl9FVkVOVCgwKQorV004NzcwX1JFR1VMQVRPUl9FVkVOVCgxKQorV004NzcwX1JFR1VMQVRPUl9FVkVOVCgyKQorCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3RsdiwgLTEyMDAsIDEwMCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGFjX2RpZ190bHYsIC0xMjc1MCwgNTAsIDEpOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY19hbGdfdGx2LCAtMTI3MDAsIDEwMCwgMSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkYWNfcGhhc2VfdGV4dFtdWzJdID0geworCXsgIkRBQzEgTm9ybWFsIiwgIkRBQzEgSW52ZXJ0ZWQiIH0sCisJeyAiREFDMiBOb3JtYWwiLCAiREFDMiBJbnZlcnRlZCIgfSwKKwl7ICJEQUMzIE5vcm1hbCIsICJEQUMzIEludmVydGVkIiB9LAorCXsgIkRBQzQgTm9ybWFsIiwgIkRBQzQgSW52ZXJ0ZWQiIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRhY19waGFzZVtdID0geworCVNPQ19FTlVNX0RPVUJMRShXTTg3NzBfREFDUEhBU0UsIDAsIDEsIDIsIGRhY19waGFzZV90ZXh0WzBdKSwKKwlTT0NfRU5VTV9ET1VCTEUoV004NzcwX0RBQ1BIQVNFLCAyLCAzLCAyLCBkYWNfcGhhc2VfdGV4dFsxXSksCisJU09DX0VOVU1fRE9VQkxFKFdNODc3MF9EQUNQSEFTRSwgNCwgNSwgMiwgZGFjX3BoYXNlX3RleHRbMl0pLAorCVNPQ19FTlVNX0RPVUJMRShXTTg3NzBfREFDUEhBU0UsIDYsIDcsIDIsIGRhY19waGFzZV90ZXh0WzNdKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NzBfc25kX2NvbnRyb2xzW10gPSB7CisJLyogZ2xvYmFsIERBQyBwbGF5YmFjayBjb250cm9scyAqLworCVNPQ19TSU5HTEVfVExWKCJEQUMgUGxheWJhY2sgVm9sdW1lIiwgV004NzcwX01TRElHVk9MLCAwLCAyNTUsIDAsCisJCWRhY19kaWdfdGx2KSwKKwlTT0NfU0lOR0xFKCJEQUMgUGxheWJhY2sgU3dpdGNoIiwgV004NzcwX0RBQ01VVEUsIDQsIDEsIDEpLAorCVNPQ19TSU5HTEUoIkRBQyBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg3NzBfREFDQ1RSTDEsIDAsIDEsIDApLAorCisJLyogZ2xvYmFsIFZPVVQgcGxheWJhY2sgY29udHJvbHMgKi8KKwlTT0NfU0lOR0xFX1RMVigiVk9VVCBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NzBfTVNBTEdWT0wsIDAsIDEyNywgMCwKKwkJZGFjX2FsZ190bHYpLAorCVNPQ19TSU5HTEUoIlZPVVQgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzcwX01TQUxHVk9MLCA3LCAxLCAwKSwKKworCS8qIFZPVVQxLzIvMy80IHNwZWNpZmljIGNvbnRyb2xzICovCisJU09DX0RPVUJMRV9SX1RMVigiVk9VVDEgUGxheWJhY2sgVm9sdW1lIiwgV004NzcwX1ZPVVQxTFZPTCwKKwkJV004NzcwX1ZPVVQxUlZPTCwgMCwgMTI3LCAwLCBkYWNfYWxnX3RsdiksCisJU09DX0RPVUJMRV9SKCJWT1VUMSBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg3NzBfVk9VVDFMVk9MLAorCQlXTTg3NzBfVk9VVDFSVk9MLCA3LCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJWT1VUMiBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NzBfVk9VVDJMVk9MLAorCQlXTTg3NzBfVk9VVDJSVk9MLCAwLCAxMjcsIDAsIGRhY19hbGdfdGx2KSwKKwlTT0NfRE9VQkxFX1IoIlZPVVQyIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc3MF9WT1VUMkxWT0wsCisJCVdNODc3MF9WT1VUMlJWT0wsIDcsIDEsIDApLAorCVNPQ19ET1VCTEVfUl9UTFYoIlZPVVQzIFBsYXliYWNrIFZvbHVtZSIsIFdNODc3MF9WT1VUM0xWT0wsCisJCVdNODc3MF9WT1VUM1JWT0wsIDAsIDEyNywgMCwgZGFjX2FsZ190bHYpLAorCVNPQ19ET1VCTEVfUigiVk9VVDMgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzcwX1ZPVVQzTFZPTCwKKwkJV004NzcwX1ZPVVQzUlZPTCwgNywgMSwgMCksCisJU09DX0RPVUJMRV9SX1RMVigiVk9VVDQgUGxheWJhY2sgVm9sdW1lIiwgV004NzcwX1ZPVVQ0TFZPTCwKKwkJV004NzcwX1ZPVVQ0UlZPTCwgMCwgMTI3LCAwLCBkYWNfYWxnX3RsdiksCisJU09DX0RPVUJMRV9SKCJWT1VUNCBQbGF5YmFjayBaQyBTd2l0Y2giLCBXTTg3NzBfVk9VVDRMVk9MLAorCQlXTTg3NzBfVk9VVDRSVk9MLCA3LCAxLCAwKSwKKworCS8qIERBQzEvMi8zLzQgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFBsYXliYWNrIFZvbHVtZSIsIFdNODc3MF9EQUMxTFZPTCwKKwkJV004NzcwX0RBQzFSVk9MLCAwLCAyNTUsIDAsIGRhY19kaWdfdGx2KSwKKwlTT0NfU0lOR0xFKCJEQUMxIERlZW1waGFzaXMgU3dpdGNoIiwgV004NzcwX0RBQ0NUUkwyLCAwLCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDMSBQaGFzZSIsIGRhY19waGFzZVswXSksCisJU09DX0RPVUJMRV9SX1RMVigiREFDMiBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NzBfREFDMkxWT0wsCisJCVdNODc3MF9EQUMyUlZPTCwgMCwgMjU1LCAwLCBkYWNfZGlnX3RsdiksCisJU09DX1NJTkdMRSgiREFDMiBEZWVtcGhhc2lzIFN3aXRjaCIsIFdNODc3MF9EQUNDVFJMMiwgMSwgMSwgMCksCisJU09DX0VOVU0oIkRBQzIgUGhhc2UiLCBkYWNfcGhhc2VbMV0pLAorCVNPQ19ET1VCTEVfUl9UTFYoIkRBQzMgUGxheWJhY2sgVm9sdW1lIiwgV004NzcwX0RBQzNMVk9MLAorCQlXTTg3NzBfREFDM1JWT0wsIDAsIDI1NSwgMCwgZGFjX2RpZ190bHYpLAorCVNPQ19TSU5HTEUoIkRBQzMgRGVlbXBoYXNpcyBTd2l0Y2giLCBXTTg3NzBfREFDQ1RSTDIsIDIsIDEsIDApLAorCVNPQ19FTlVNKCJEQUMzIFBoYXNlIiwgZGFjX3BoYXNlWzJdKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUM0IFBsYXliYWNrIFZvbHVtZSIsIFdNODc3MF9EQUM0TFZPTCwKKwkJV004NzcwX0RBQzRSVk9MLCAwLCAyNTUsIDAsIGRhY19kaWdfdGx2KSwKKwlTT0NfU0lOR0xFKCJEQUM0IERlZW1waGFzaXMgU3dpdGNoIiwgV004NzcwX0RBQ0NUUkwyLCAzLCAxLCAwKSwKKwlTT0NfRU5VTSgiREFDNCBQaGFzZSIsIGRhY19waGFzZVszXSksCisKKwkvKiBBREMgc3BlY2lmaWMgY29udHJvbHMgKi8KKwlTT0NfRE9VQkxFX1JfVExWKCJDYXB0dXJlIFZvbHVtZSIsIFdNODc3MF9BRENMQ1RSTCwgV004NzcwX0FEQ1JDVFJMLAorCQkwLCAzMSwgMCwgYWRjX3RsdiksCisJU09DX0RPVUJMRV9SKCJDYXB0dXJlIFN3aXRjaCIsIFdNODc3MF9BRENMQ1RSTCwgV004NzcwX0FEQ1JDVFJMLAorCQk1LCAxLCAxKSwKKworCS8qIG90aGVyIGNvbnRyb2xzICovCisJU09DX1NJTkdMRSgiQURDIDEyOHggT3ZlcnNhbXBsaW5nIFN3aXRjaCIsIFdNODc3MF9NU1RSQ1RSTCwgMywgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIEhpZ2hwYXNzIEZpbHRlciBTd2l0Y2giLCBXTTg3NzBfSUZBQ0VDVFJMLCA4LCAxLCAxKQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFpbl90ZXh0W10gPSB7CisJIkFJTjEiLCAiQUlOMiIsICJBSU4zIiwgIkFJTjQiLAorCSJBSU41IiwgIkFJTjYiLCAiQUlONyIsICJBSU44IgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaW5fZW51bSA9CisJU09DX0VOVU1fRE9VQkxFKFdNODc3MF9BRENNVVgsIDAsIDQsIDgsIGFpbl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpbl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIkNhcHR1cmUgTXV4IiwgYWluX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm91dDFfbWl4X2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMxIFN3aXRjaCIsIFdNODc3MF9PVVRNVVgxLCAwLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFVWDEgU3dpdGNoIiwgV004NzcwX09VVE1VWDEsIDEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQnlwYXNzIFN3aXRjaCIsIFdNODc3MF9PVVRNVVgxLCAyLCAxLCAwKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHZvdXQyX21peF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDMiBTd2l0Y2giLCBXTTg3NzBfT1VUTVVYMSwgMywgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBVVgyIFN3aXRjaCIsIFdNODc3MF9PVVRNVVgxLCA0LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJ5cGFzcyBTd2l0Y2giLCBXTTg3NzBfT1VUTVVYMSwgNSwgMSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2b3V0M19taXhfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQzMgU3dpdGNoIiwgV004NzcwX09VVE1VWDIsIDAsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQVVYMyBTd2l0Y2giLCBXTTg3NzBfT1VUTVVYMiwgMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJCeXBhc3MgU3dpdGNoIiwgV004NzcwX09VVE1VWDIsIDIsIDEsIDApCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm91dDRfbWl4X2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUM0IFN3aXRjaCIsIFdNODc3MF9PVVRNVVgyLCAzLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJ5cGFzcyBTd2l0Y2giLCBXTTg3NzBfT1VUTVVYMiwgNCwgMSwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg3NzBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0lOUFVUKCJBVVgxIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBVVgyIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBVVgzIiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjEiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjIiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjMiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjQiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjUiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjYiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjciKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkFJTjgiKSwKKworCVNORF9TT0NfREFQTV9NVVgoIkNhcHR1cmUgTXV4IiwgV004NzcwX0FEQ01VWCwgOCwgMSwgJmFpbl9tdXgpLAorCisJU05EX1NPQ19EQVBNX0FEQygiQURDIiwgIkNhcHR1cmUiLCBXTTg3NzBfUFdETkNUUkwsIDEsIDEpLAorCisJU05EX1NPQ19EQVBNX0RBQygiREFDMSIsICJQbGF5YmFjayIsIFdNODc3MF9QV0ROQ1RSTCwgMiwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMiIsICJQbGF5YmFjayIsIFdNODc3MF9QV0ROQ1RSTCwgMywgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMyIsICJQbGF5YmFjayIsIFdNODc3MF9QV0ROQ1RSTCwgNCwgMSksCisJU05EX1NPQ19EQVBNX0RBQygiREFDNCIsICJQbGF5YmFjayIsIFdNODc3MF9QV0ROQ1RSTCwgNSwgMSksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJWT1VUMTIgU3VwcGx5IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl2b3V0MTJzdXBwbHlfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJWT1VUMzQgU3VwcGx5IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl2b3V0MzRzdXBwbHlfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiVk9VVDEgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXZvdXQxX21peF9jb250cm9scywgQVJSQVlfU0laRSh2b3V0MV9taXhfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlZPVVQyIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQl2b3V0Ml9taXhfY29udHJvbHMsIEFSUkFZX1NJWkUodm91dDJfbWl4X2NvbnRyb2xzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJWT1VUMyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJdm91dDNfbWl4X2NvbnRyb2xzLCBBUlJBWV9TSVpFKHZvdXQzX21peF9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiVk9VVDQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXZvdXQ0X21peF9jb250cm9scywgQVJSQVlfU0laRSh2b3V0NF9taXhfY29udHJvbHMpKSwKKworCVNORF9TT0NfREFQTV9PVVRQVVQoIlZPVVQxIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiVk9VVDIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJWT1VUMyIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlZPVVQ0IikKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtODc3MF9pbnRlcmNvbltdID0geworCXsgIkNhcHR1cmUgTXV4IiwgIkFJTjEiLCAiQUlOMSIgfSwKKwl7ICJDYXB0dXJlIE11eCIsICJBSU4yIiwgIkFJTjIiIH0sCisJeyAiQ2FwdHVyZSBNdXgiLCAiQUlOMyIsICJBSU4zIiB9LAorCXsgIkNhcHR1cmUgTXV4IiwgIkFJTjQiLCAiQUlONCIgfSwKKwl7ICJDYXB0dXJlIE11eCIsICJBSU41IiwgIkFJTjUiIH0sCisJeyAiQ2FwdHVyZSBNdXgiLCAiQUlONiIsICJBSU42IiB9LAorCXsgIkNhcHR1cmUgTXV4IiwgIkFJTjciLCAiQUlONyIgfSwKKwl7ICJDYXB0dXJlIE11eCIsICJBSU44IiwgIkFJTjgiIH0sCisKKwl7ICJBREMiLCBOVUxMLCAiQ2FwdHVyZSBNdXgiIH0sCisKKwl7ICJWT1VUMSBNaXhlciIsIE5VTEwsICJWT1VUMTIgU3VwcGx5IiB9LAorCXsgIlZPVVQxIE1peGVyIiwgIkRBQzEgU3dpdGNoIiwgIkRBQzEiIH0sCisJeyAiVk9VVDEgTWl4ZXIiLCAiQVVYMSBTd2l0Y2giLCAiQVVYMSIgfSwKKwl7ICJWT1VUMSBNaXhlciIsICJCeXBhc3MgU3dpdGNoIiwgIkNhcHR1cmUgTXV4IiB9LAorCisJeyAiVk9VVDIgTWl4ZXIiLCBOVUxMLCAiVk9VVDEyIFN1cHBseSIgfSwKKwl7ICJWT1VUMiBNaXhlciIsICJEQUMyIFN3aXRjaCIsICJEQUMyIiB9LAorCXsgIlZPVVQyIE1peGVyIiwgIkFVWDIgU3dpdGNoIiwgIkFVWDIiIH0sCisJeyAiVk9VVDIgTWl4ZXIiLCAiQnlwYXNzIFN3aXRjaCIsICJDYXB0dXJlIE11eCIgfSwKKworCXsgIlZPVVQzIE1peGVyIiwgTlVMTCwgIlZPVVQzNCBTdXBwbHkiIH0sCisJeyAiVk9VVDMgTWl4ZXIiLCAiREFDMyBTd2l0Y2giLCAiREFDMyIgfSwKKwl7ICJWT1VUMyBNaXhlciIsICJBVVgzIFN3aXRjaCIsICJBVVgzIiB9LAorCXsgIlZPVVQzIE1peGVyIiwgIkJ5cGFzcyBTd2l0Y2giLCAiQ2FwdHVyZSBNdXgiIH0sCisKKwl7ICJWT1VUNCBNaXhlciIsIE5VTEwsICJWT1VUMzQgU3VwcGx5IiB9LAorCXsgIlZPVVQ0IE1peGVyIiwgIkRBQzQgU3dpdGNoIiwgIkRBQzQiIH0sCisJeyAiVk9VVDQgTWl4ZXIiLCAiQnlwYXNzIFN3aXRjaCIsICJDYXB0dXJlIE11eCIgfSwKKworCXsgIlZPVVQxIiwgTlVMTCwgIlZPVVQxIE1peGVyIiB9LAorCXsgIlZPVVQyIiwgTlVMTCwgIlZPVVQyIE1peGVyIiB9LAorCXsgIlZPVVQzIiwgTlVMTCwgIlZPVVQzIE1peGVyIiB9LAorCXsgIlZPVVQ0IiwgTlVMTCwgIlZPVVQ0IE1peGVyIiB9Cit9OworCitzdGF0aWMgaW50IHZvdXQxMnN1cHBseV9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWNvZGVjID0gdy0+Y29kZWM7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX09VVE1VWDEsIDB4MTgwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9PVVRNVVgxLCAweDE4MCwgMHgxODApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3V0MzRzdXBwbHlfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwljb2RlYyA9IHctPmNvZGVjOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9PVVRNVVgyLCAweDE4MCwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NzBfT1VUTVVYMiwgMHgxODAsIDB4MTgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzcwX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgV004NzcwX1JFU0VULCAwKTsKK30KKworc3RhdGljIGludCB3bTg3NzBfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IGlmYWNlLCBtYXN0ZXI7CisKKwljb2RlYyA9IGRhaS0+Y29kZWM7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQltYXN0ZXIgPSAweDEwMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQltYXN0ZXIgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZmFjZSA9IDA7CisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlpZmFjZSB8PSAweDI7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfUklHSFRfSjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWlmYWNlIHw9IDB4MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWlmYWNlIHw9IDB4YzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJaWZhY2UgfD0gMHg4OworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQlpZmFjZSB8PSAweDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9JRkFDRUNUUkwsIDB4ZiwgaWZhY2UpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9NU1RSQ1RSTCwgMHgxMDAsIG1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludCBtY2xrX3JhdGlvc1tdID0geworCTEyOCwKKwkxOTIsCisJMjU2LAorCTM4NCwKKwk1MTIsCisJNzY4Cit9OworCitzdGF0aWMgaW50IHdtODc3MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg3NzBfcHJpdiAqd204NzcwOworCWludCBpOworCWludCBpZmFjZTsKKwlpbnQgc2hpZnQ7CisJaW50IHJhdGlvOworCisJY29kZWMgPSBkYWktPmNvZGVjOworCXdtODc3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWZhY2UgPSAwOworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWlmYWNlIHw9IDB4MTA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWlmYWNlIHw9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWlmYWNlIHw9IDB4MzA7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoc3Vic3RyZWFtLT5zdHJlYW0pIHsKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6CisJCWkgPSAwOworCQlzaGlmdCA9IDQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgorCQlpID0gMjsKKwkJc2hpZnQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBPbmx5IG5lZWQgdG8gc2V0IE1DTEsvTFJDTEsgcmF0aW8gaWYgd2UncmUgbWFzdGVyICovCisJaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV004NzcwX01TVFJDVFJMKSAmIDB4MTAwKSB7CisJCWZvciAoOyBpIDwgQVJSQVlfU0laRShtY2xrX3JhdGlvcyk7ICsraSkgeworCQkJcmF0aW8gPSB3bTg3NzAtPnN5c2NsayAvIHBhcmFtc19yYXRlKHBhcmFtcyk7CisJCQlpZiAocmF0aW8gPT0gbWNsa19yYXRpb3NbaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKG1jbGtfcmF0aW9zKSkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJVbmFibGUgdG8gY29uZmlndXJlIE1DTEsgcmF0aW8gJWQvJWRcbiIsCisJCQkJd204NzcwLT5zeXNjbGssIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNQ0xLIGlzICVkZnNcbiIsIG1jbGtfcmF0aW9zW2ldKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NzBfTVNUUkNUUkwsIDB4NyA8PCBzaGlmdCwKKwkJCQkgICAgaSA8PCBzaGlmdCk7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX0lGQUNFQ1RSTCwgMHgzMCwgaWZhY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzcwX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWNvZGVjID0gZGFpLT5jb2RlYzsKKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX0RBQ01VVEUsIDB4MTAsCisJCQkJICAgISFtdXRlIDw8IDQpOworfQorCitzdGF0aWMgaW50IHdtODc3MF9zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJICAgICBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHdtODc3MF9wcml2ICp3bTg3NzA7CisKKwljb2RlYyA9IGRhaS0+Y29kZWM7CisJd204NzcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJd204NzcwLT5zeXNjbGsgPSBmcmVxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTg3NzBfc3luY19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJdTE2ICpjYWNoZTsKKworCWlmICghY29kZWMtPmNhY2hlX3N5bmMpCisJCXJldHVybjsKKworCWNvZGVjLT5jYWNoZV9vbmx5ID0gMDsKKwljYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplOyBpKyspIHsKKwkJaWYgKGkgPT0gV004NzcwX1JFU0VUIHx8IGNhY2hlW2ldID09IHdtODc3MF9yZWdfZGVmc1tpXSkKKwkJCWNvbnRpbnVlOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCBjYWNoZVtpXSk7CisJfQorCWNvZGVjLT5jYWNoZV9zeW5jID0gMDsKK30KKworc3RhdGljIGludCB3bTg3NzBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB3bTg3NzBfcHJpdiAqd204NzcwOworCisJd204NzcwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAorCQkJCQkJICAgIHdtODc3MC0+c3VwcGxpZXMpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLAorCQkJCQlyZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQl3bTg3NzBfc3luY19jYWNoZShjb2RlYyk7CisJCQkvKiBnbG9iYWwgcG93ZXJ1cCAqLworCQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzcwX1BXRE5DVFJMLCAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCS8qIGdsb2JhbCBwb3dlcmRvd24gKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV004NzcwX1BXRE5DVFJMLCAxKTsKKwkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAorCQkJCSAgICAgICB3bTg3NzAtPnN1cHBsaWVzKTsKKwkJYnJlYWs7CisJfQorCisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdNODc3MF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHdtODc3MF9kYWlfb3BzID0geworCS5kaWdpdGFsX211dGUgPSB3bTg3NzBfbXV0ZSwKKwkuaHdfcGFyYW1zID0gd204NzcwX2h3X3BhcmFtcywKKwkuc2V0X2ZtdCA9IHdtODc3MF9zZXRfZm10LAorCS5zZXRfc3lzY2xrID0gd204NzcwX3NldF9zeXNjbGssCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTg3NzBfZGFpID0geworCS5uYW1lID0gIndtODc3MC1oaWZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5mb3JtYXRzID0gV004NzcwX0ZPUk1BVFMKKwl9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF85NjAwMCwKKwkJLmZvcm1hdHMgPSBXTTg3NzBfRk9STUFUUworCX0sCisJLm9wcyA9ICZ3bTg3NzBfZGFpX29wcywKKwkuc3ltbWV0cmljX3JhdGVzID0gMQorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB3bTg3NzBfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwl3bTg3NzBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc3MF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXdtODc3MF9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgd204NzcwX3N1c3BlbmQgTlVMTAorI2RlZmluZSB3bTg3NzBfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHdtODc3MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODc3MF9wcml2ICp3bTg3NzA7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXdtODc3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXdtODc3MC0+Y29kZWMgPSBjb2RlYzsKKworCWNvZGVjLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOworCisJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODc3MC0+Y29udHJvbF90eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIEkvTzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzcwLT5zdXBwbGllcyk7IGkrKykKKwkJd204NzcwLT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg3NzBfc3VwcGx5X25hbWVzW2ldOworCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KGNvZGVjLT5kZXYsIEFSUkFZX1NJWkUod204NzcwLT5zdXBwbGllcyksCisJCQkJIHdtODc3MC0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXdtODc3MC0+ZGlzYWJsZV9uYlswXS5ub3RpZmllcl9jYWxsID0gd204NzcwX3JlZ3VsYXRvcl9ldmVudF8wOworCXdtODc3MC0+ZGlzYWJsZV9uYlsxXS5ub3RpZmllcl9jYWxsID0gd204NzcwX3JlZ3VsYXRvcl9ldmVudF8xOworCXdtODc3MC0+ZGlzYWJsZV9uYlsyXS5ub3RpZmllcl9jYWxsID0gd204NzcwX3JlZ3VsYXRvcl9ldmVudF8yOworCisJLyogVGhpcyBzaG91bGQgcmVhbGx5IGJlIG1vdmVkIGludG8gdGhlIHJlZ3VsYXRvciBjb3JlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzcwLT5zdXBwbGllcyk7IGkrKykgeworCQlyZXQgPSByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIod204NzcwLT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJCSAgJndtODc3MC0+ZGlzYWJsZV9uYltpXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciBub3RpZmllcjogJWRcbiIsCisJCQkJcmV0KTsKKwkJfQorCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLAorCQkJCSAgICB3bTg3NzAtPnN1cHBsaWVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9yZWdfZ2V0OworCX0KKworCXJldCA9IHdtODc3MF9yZXNldChjb2RlYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcmVnX2VuYWJsZTsKKwl9CisKKwl3bTg3NzBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKworCS8qIGxhdGNoIHRoZSB2b2x1bWUgdXBkYXRlIGJpdHMgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NzBfTVNESUdWT0wsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX01TQUxHVk9MLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9WT1VUMVJWT0wsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX1ZPVVQyUlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NzBfVk9VVDNSVk9MLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9WT1VUNFJWT0wsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX0RBQzFSVk9MLCAweDEwMCwgMHgxMDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9EQUMyUlZPTCwgMHgxMDAsIDB4MTAwKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NzBfREFDM1JWT0wsIDB4MTAwLCAweDEwMCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004NzcwX0RBQzRSVk9MLCAweDEwMCwgMHgxMDApOworCisJLyogbXV0ZSBhbGwgREFDcyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc3MF9EQUNNVVRFLCAweDEwLCAweDEwKTsKKworCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg3NzBfc25kX2NvbnRyb2xzLAorCQkJICAgICBBUlJBWV9TSVpFKHdtODc3MF9zbmRfY29udHJvbHMpKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKCZjb2RlYy0+ZGFwbSwgd204NzcwX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204NzcwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjb2RlYy0+ZGFwbSwgd204NzcwX2ludGVyY29uLAorCQkJCUFSUkFZX1NJWkUod204NzcwX2ludGVyY29uKSk7CisJcmV0dXJuIDA7CisKK2Vycl9yZWdfZW5hYmxlOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg3NzAtPnN1cHBsaWVzKSwgd204NzcwLT5zdXBwbGllcyk7CitlcnJfcmVnX2dldDoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUod204NzcwLT5zdXBwbGllcyksIHdtODc3MC0+c3VwcGxpZXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204NzcwX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODc3MF9wcml2ICp3bTg3NzA7CisJaW50IGk7CisKKwl3bTg3NzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl3bTg3NzBfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzcwLT5zdXBwbGllcyk7ICsraSkKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIod204NzcwLT5zdXBwbGllc1tpXS5jb25zdW1lciwKKwkJCQkJICAgICAgJndtODc3MC0+ZGlzYWJsZV9uYltpXSk7CisJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODc3MC0+c3VwcGxpZXMpLCB3bTg3NzAtPnN1cHBsaWVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc3MCA9IHsKKwkucHJvYmUgPSB3bTg3NzBfcHJvYmUsCisJLnJlbW92ZSA9IHdtODc3MF9yZW1vdmUsCisJLnN1c3BlbmQgPSB3bTg3NzBfc3VzcGVuZCwKKwkucmVzdW1lID0gd204NzcwX3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3NzBfc2V0X2JpYXNfbGV2ZWwsCisJLnJlZ19jYWNoZV9zaXplID0gQVJSQVlfU0laRSh3bTg3NzBfcmVnX2RlZnMpLAorCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mICh1MTYpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODc3MF9yZWdfZGVmcworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg3NzBfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHdtODc3MF9wcml2ICp3bTg3NzA7CisJaW50IHJldDsKKworCXdtODc3MCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg3NzBfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghd204NzcwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODc3MC0+Y29udHJvbF90eXBlID0gU05EX1NPQ19TUEk7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgd204NzcwKTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204NzcwLCAmd204NzcwX2RhaSwgMSk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKHdtODc3MCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204NzcwX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlrZnJlZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg3NzBfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTg3NzAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHdtODc3MF9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODc3MF9zcGlfcmVtb3ZlKQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB3bTg3NzBfbW9kaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ3bTg3NzBfc3BpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciB3bTg3NzAgU1BJIGRyaXZlcjogJWRcbiIsCisJCSAgICAgICByZXQpOworCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdCh3bTg3NzBfbW9kaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3bTg3NzBfZXhpdCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bTg3NzBfc3BpX2RyaXZlcik7CisjZW5kaWYKK30KK21vZHVsZV9leGl0KHdtODc3MF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNODc3MCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRpbWl0cmlzIFBhcGFzdGFtb3MgPGRwQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWIzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiB3bTg3NzAuaCAgLS0gIFdNODc3MCBBU29DIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBBdXRob3I6IERpbWl0cmlzIFBhcGFzdGFtb3MgPGRwQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dNODc3MF9ICisjZGVmaW5lIF9XTTg3NzBfSAorCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgV004NzcwX1ZPVVQxTFZPTCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFdNODc3MF9WT1VUMVJWT0wgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFdNODc3MF9WT1VUMkxWT0wgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIFdNODc3MF9WT1VUMlJWT0wgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFdNODc3MF9WT1VUM0xWT0wgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFdNODc3MF9WT1VUM1JWT0wgICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIFdNODc3MF9WT1VUNExWT0wgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIFdNODc3MF9WT1VUNFJWT0wgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIFdNODc3MF9NU0FMR1ZPTCAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIFdNODc3MF9EQUMxTFZPTCAgICAgICAgICAgICAgICAgMHg5CisjZGVmaW5lIFdNODc3MF9EQUMxUlZPTCAgICAgICAgICAgICAgICAgMHhhCisjZGVmaW5lIFdNODc3MF9EQUMyTFZPTCAgICAgICAgICAgICAgICAgMHhiCisjZGVmaW5lIFdNODc3MF9EQUMyUlZPTCAgICAgICAgICAgICAgICAgMHhjCisjZGVmaW5lIFdNODc3MF9EQUMzTFZPTCAgICAgICAgICAgICAgICAgMHhkCisjZGVmaW5lIFdNODc3MF9EQUMzUlZPTCAgICAgICAgICAgICAgICAgMHhlCisjZGVmaW5lIFdNODc3MF9EQUM0TFZPTCAgICAgICAgICAgICAgICAgMHhmCisjZGVmaW5lIFdNODc3MF9EQUM0UlZPTCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBXTTg3NzBfTVNESUdWT0wgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgV004NzcwX0RBQ1BIQVNFICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIFdNODc3MF9EQUNDVFJMMSAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBXTTg3NzBfREFDTVVURSAgICAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgV004NzcwX0RBQ0NUUkwyICAgICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIFdNODc3MF9JRkFDRUNUUkwgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBXTTg3NzBfTVNUUkNUUkwgICAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgV004NzcwX1BXRE5DVFJMICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIFdNODc3MF9BRENMQ1RSTCAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBXTTg3NzBfQURDUkNUUkwgICAgICAgICAgICAgICAgIDB4MWEKKyNkZWZpbmUgV004NzcwX0FEQ01VWCAgICAgICAgICAgICAgICAgICAweDFiCisjZGVmaW5lIFdNODc3MF9PVVRNVVgxICAgICAgICAgICAgICAgICAgMHgxYworI2RlZmluZSBXTTg3NzBfT1VUTVVYMiAgICAgICAgICAgICAgICAgIDB4MWQKKyNkZWZpbmUgV004NzcwX1JFU0VUICAgICAgICAgICAgICAgICAgICAweDMxCisKKyNkZWZpbmUgV004NzcwX0NBQ0hFUkVHTlVNIDB4MjAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwppbmRleCAwMTMyYTI3Li44ZTc5NTNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTMwNiw3ICszMDUsNyBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCS8qIERpc2FibGUgdGhlIGdsb2JhbCBwb3dlcmRvd247IERBUE0gZG9lcyB0aGUgcmVzdCAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004Nzc2X1BXUkRPV04sIDEsIDApOwogCQl9CkBAIC0zMTcsNyArMzE2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNCw2ICs0MDMsNyBAQAogc3RhdGljIGludCB3bTg3NzZfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg3NzZfcHJpdiAqd204Nzc2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQgPSAwOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDcsIDksIHdtODc3Ni0+Y29udHJvbF90eXBlKTsKQEAgLTQyNyw5ICs0MjcsOSBAQAogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODc3Nl9zbmRfY29udHJvbHMsCiAJCQkgICAgIEFSUkFZX1NJWkUod204Nzc2X3NuZF9jb250cm9scykpOwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc3Nl9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NzZfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg3NzZfZGFwbV93aWRnZXRzKSk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIHJvdXRlcywgQVJSQVlfU0laRShyb3V0ZXMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCByb3V0ZXMsIEFSUkFZX1NJWkUocm91dGVzKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggNDU5OWU4ZS4uNmRhZTFiNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCkBAIC01MTUsNyArNTE0LDcgQEAKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDksIDApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg4MDQtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQpIHsKQEAgLTUzNyw3ICs1MzYsNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTgxLDcgKzU4MCw3IEBACiAJd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJd204ODA0LT5jb2RlYyA9IGNvZGVjOwogCi0JY29kZWMtPmlkbGVfYmlhc19vZmYgPSAxOworCWNvZGVjLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDgsIDgsIHdtODgwNC0+Y29udHJvbF90eXBlKTsKIAlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKaW5kZXggYWNhNGIxZS4uY2QwOTU5OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCkBAIC0xNDAsNyArMTM5LDYgQEAKIAogc3RydWN0IHdtODkwMF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl1MTYgcmVnX2NhY2hlW1dNODkwMF9NQVhSRUddOwogCiAJdTMyIGZsbF9pbjsgLyogRkxMIGlucHV0IGZyZXF1ZW5jeSAqLwogCXUzMiBmbGxfb3V0OyAvKiBGTEwgb3V0cHV0IGZyZXF1ZW5jeSAqLwpAQCAtNjExLDEwICs2MDksMTEgQEAKIAogc3RhdGljIGludCB3bTg5MDBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODkwMF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODkwMF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTAwX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204OTAwX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA1MSw3ICsxMDUwLDcgQEAKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCS8qIENoYXJnZSBjYXBhY2l0b3JzIGlmIGluaXRpYWwgcG93ZXIgdXAgKi8KLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogU1RBUlRVUF9CSUFTX0VOQSBvbiAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAwX1JFR19QT1dFUjEsCiAJCQkJICAgICBXTTg5MDBfUkVHX1BPV0VSMV9TVEFSVFVQX0JJQVNfRU5BKTsKQEAgLTExMTksNyArMTExOCw3IEBACiAJCQkgICAgIFdNODkwMF9SRUdfUE9XRVIyX1NZU0NMS19FTkEpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IDYyMmI2MDIuLjk4NzQ3NmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtMjksOSArMjksOSBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC93bTg5MDMuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCiAjaW5jbHVkZSAid204OTAzLmgiCiAKQEAgLTIxNCwxNSArMjE0LDE0IEBACiAKIHN0cnVjdCB3bTg5MDNfcHJpdiB7CiAKLQl1MTYgcmVnX2NhY2hlW0FSUkFZX1NJWkUod204OTAzX3JlZ19kZWZhdWx0cyldOwotCiAJaW50IHN5c2NsazsKIAlpbnQgaXJxOwogCi0JLyogUmVmZXJlbmNlIGNvdW50cyAqLworCWludCBmczsKKwlpbnQgZGVlbXBoOworCisJLyogUmVmZXJlbmNlIGNvdW50ICovCiAJaW50IGNsYXNzX3dfdXNlcnM7Ci0JaW50IHBsYXliYWNrX2FjdGl2ZTsKLQlpbnQgY2FwdHVyZV9hY3RpdmU7CiAKIAlzdHJ1Y3QgY29tcGxldGlvbiB3c2VxOwogCkBAIC0yMzEsOSArMjMwLDYgQEAKIAlpbnQgbWljX3Nob3J0OwogCWludCBtaWNfbGFzdF9yZXBvcnQ7CiAJaW50IG1pY19kZWxheTsKLQotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqbWFzdGVyX3N1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNsYXZlX3N1YnN0cmVhbTsKIH07CiAKIHN0YXRpYyBpbnQgd204OTAzX3ZvbGF0aWxlX3JlZ2lzdGVyKHVuc2lnbmVkIGludCByZWcpCkBAIC00NjMsNiArNDU5LDcyIEBACiAJLnByaXZhdGVfdmFsdWUgPSAgU09DX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXgsIGludmVydCkgfQogCiAKK3N0YXRpYyBpbnQgd204OTAzX2RlZW1waFtdID0geyAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwIH07CisKK3N0YXRpYyBpbnQgd204OTAzX3NldF9kZWVtcGgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCwgaSwgYmVzdDsKKworCS8qIElmIHdlJ3JlIHVzaW5nIGRlZW1waGFzaXMgc2VsZWN0IHRoZSBuZWFyZXN0IGF2YWlsYWJsZSBzYW1wbGUKKwkgKiByYXRlLgorCSAqLworCWlmICh3bTg5MDMtPmRlZW1waCkgeworCQliZXN0ID0gMTsKKwkJZm9yIChpID0gMjsgaSA8IEFSUkFZX1NJWkUod204OTAzX2RlZW1waCk7IGkrKykgeworCQkJaWYgKGFicyh3bTg5MDNfZGVlbXBoW2ldIC0gd204OTAzLT5mcykgPAorCQkJICAgIGFicyh3bTg5MDNfZGVlbXBoW2Jlc3RdIC0gd204OTAzLT5mcykpCisJCQkJYmVzdCA9IGk7CisJCX0KKworCQl2YWwgPSBiZXN0IDw8IFdNODkwM19ERUVNUEhfU0hJRlQ7CisJfSBlbHNlIHsKKwkJYmVzdCA9IDA7CisJCXZhbCA9IDA7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU2V0IGRlZW1waGFzaXMgJWQgKCVkSHopXG4iLAorCQliZXN0LCB3bTg5MDNfZGVlbXBoW2Jlc3RdKTsKKworCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfMSwKKwkJCQkgICBXTTg5MDNfREVFTVBIX01BU0ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX2dldF9kZWVtcGgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHdtODkwMy0+ZGVlbXBoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTAzX3B1dF9kZWVtcGgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBkZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWludCByZXQgPSAwOworCisJaWYgKGRlZW1waCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKKwlpZiAod204OTAzLT5kZWVtcGggIT0gZGVlbXBoKSB7CisJCXdtODkwMy0+ZGVlbXBoID0gZGVlbXBoOworCisJCXdtODkwM19zZXRfZGVlbXBoKGNvZGVjKTsKKworCQlyZXQgPSAxOworCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKiBBTFNBIGNhbiBvbmx5IGRvIHN0ZXBzIG9mIC4wMWRCICovCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF90bHYsIC03MjAwLCA3NSwgMSk7CiAKQEAgLTQ3NSw2ICs1MzcsMjMgQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkcmNfdGx2X21heCwgMTIwMCwgNjAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkcmNfdGx2X3N0YXJ0dXAsIC0zMDAsIDUwLCAwKTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmhwZl9tb2RlX3RleHRbXSA9IHsKKwkiSGktZmkiLCAiVm9pY2UgMSIsICJWb2ljZSAyIiwgIlZvaWNlIDMiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhwZl9tb2RlID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0FEQ19ESUdJVEFMXzAsIDUsIDQsIGhwZl9tb2RlX3RleHQpOworCitzdGF0aWMgY29uc3QgY2hhciAqb3NyX3RleHRbXSA9IHsKKwkiTG93IHBvd2VyIiwgIkhpZ2ggcGVyZm9ybWFuY2UiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19vc3IgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfQU5BTE9HVUVfQURDXzAsIDAsIDIsIG9zcl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBkYWNfb3NyID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDAsIDIsIG9zcl90ZXh0KTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKmRyY19zbG9wZV90ZXh0W10gPSB7CiAJIjEiLCAiMS8yIiwgIjEvNCIsICIxLzgiLCAiMS8xNiIsICIwIgogfTsKQEAgLTUzNywxMyArNjE2LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXV0ZV9tb2RlID0KIAlTT0NfRU5VTV9TSU5HTEUoV004OTAzX0RBQ19ESUdJVEFMXzEsIDksIDIsIG11dGVfbW9kZV90ZXh0KTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmRhY19kZWVtcGhhc2lzX3RleHRbXSA9IHsKLQkiRGlzYWJsZWQiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX2RlZW1waGFzaXMgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5MDNfREFDX0RJR0lUQUxfMSwgMSwgNCwgZGFjX2RlZW1waGFzaXNfdGV4dCk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpjb21wYW5kaW5nX3RleHRbXSA9IHsKIAkidWxhdyIsICJhbGF3IgogfTsKQEAgLTYxMyw2ICs2ODUsOSBAQAogCSAgIDYsIDEsIDApLAogCiAvKiBBRENzICovCitTT0NfRU5VTSgiQURDIE9TUiIsIGFkY19vc3IpLAorU09DX1NJTkdMRSgiSFBGIFN3aXRjaCIsIFdNODkwM19BRENfRElHSVRBTF8wLCA0LCAxLCAwKSwKK1NPQ19FTlVNKCJIUEYgTW9kZSIsIGhwZl9tb2RlKSwKIFNPQ19TSU5HTEUoIkRSQyBTd2l0Y2giLCBXTTg5MDNfRFJDXzAsIDE1LCAxLCAwKSwKIFNPQ19FTlVNKCJEUkMgQ29tcHJlc3NvciBTbG9wZSBSMCIsIGRyY19zbG9wZV9yMCksCiBTT0NfRU5VTSgiRFJDIENvbXByZXNzb3IgU2xvcGUgUjEiLCBkcmNfc2xvcGVfcjEpLApAQCAtNjQyLDE0ICs3MTcsMTYgQEAKIAkgICAgICAgMTIsIDAsIGRpZ2l0YWxfc2lkZXRvbmVfdGx2KSwKIAogLyogREFDICovCitTT0NfRU5VTSgiREFDIE9TUiIsIGRhY19vc3IpLAogU09DX0RPVUJMRV9SX1RMVigiRGlnaXRhbCBQbGF5YmFjayBWb2x1bWUiLCBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX0xFRlQsCiAJCSBXTTg5MDNfREFDX0RJR0lUQUxfVk9MVU1FX1JJR0hULCAxLCAxMjAsIDAsIGRpZ2l0YWxfdGx2KSwKIFNPQ19FTlVNKCJEQUMgU29mdCBNdXRlIFJhdGUiLCBzb2Z0X211dGUpLAogU09DX0VOVU0oIkRBQyBNdXRlIE1vZGUiLCBtdXRlX21vZGUpLAogU09DX1NJTkdMRSgiREFDIE1vbm8gU3dpdGNoIiwgV004OTAzX0RBQ19ESUdJVEFMXzEsIDEyLCAxLCAwKSwKLVNPQ19FTlVNKCJEQUMgRGUtZW1waGFzaXMiLCBkYWNfZGVlbXBoYXNpcyksCiBTT0NfRU5VTSgiREFDIENvbXBhbmRpbmcgTW9kZSIsIGRhY19jb21wYW5kaW5nKSwKIFNPQ19TSU5HTEUoIkRBQyBDb21wYW5kaW5nIFN3aXRjaCIsIFdNODkwM19BVURJT19JTlRFUkZBQ0VfMCwgMSwgMSwgMCksCitTT0NfU0lOR0xFX0JPT0xfRVhUKCJQbGF5YmFjayBEZWVtcGhhc2lzIFN3aXRjaCIsIDAsCisJCSAgICB3bTg5MDNfZ2V0X2RlZW1waCwgd204OTAzX3B1dF9kZWVtcGgpLAogCiAvKiBIZWFkcGhvbmVzICovCiBTT0NfRE9VQkxFX1IoIkhlYWRwaG9uZSBTd2l0Y2giLApAQCAtOTIzLDEwICsxMDAwLDExIEBACiAKIHN0YXRpYyBpbnQgd204OTAzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5MDNfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg5MDNfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5MDNfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg5MDNfZGFwbV93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTM0LDcgKzEwMTIsNyBAQAogc3RhdGljIGludCB3bTg5MDNfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKLQl1MTYgcmVnLCByZWcyOworCXUxNiByZWc7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046CkBAIC05NDYsNyArMTAyNCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAzX0NMT0NLX1JBVEVTXzIsCiAJCQkJICAgICBXTTg5MDNfQ0xLX1NZU19FTkEpOwogCkBAIC05NTgsMjMgKzEwMzYsMTUgQEAKIAkJCXdtODkwM19ydW5fc2VxdWVuY2UoY29kZWMsIDApOwogCQkJd204OTAzX3N5bmNfcmVnX2NhY2hlKGNvZGVjLCBjb2RlYy0+cmVnX2NhY2hlKTsKIAotCQkJLyogRW5hYmxlIGxvdyBpbXBlZGVuY2UgY2hhcmdlIHB1bXAgb3V0cHV0ICovCi0JCQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCSAgV004OTAzX0NPTlRST0xfSU5URVJGQUNFX1RFU1RfMSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0VfVEVTVF8xLAotCQkJCSAgICAgcmVnIHwgV004OTAzX1RFU1RfS0VZKTsKLQkJCXJlZzIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwM19DSEFSR0VfUFVNUF9URVNUXzEpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAzX0NIQVJHRV9QVU1QX1RFU1RfMSwKLQkJCQkgICAgIHJlZzIgfCBXTTg5MDNfQ1BfU1dfS0VMVklOX01PREVfTUFTSyk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0VfVEVTVF8xLAotCQkJCSAgICAgcmVnKTsKLQogCQkJLyogQnkgZGVmYXVsdCBubyBieXBhc3MgcGF0aHMgYXJlIGVuYWJsZWQgc28KIAkJCSAqIGVuYWJsZSBDbGFzcyBXIHN1cHBvcnQuCiAJCQkgKi8KIAkJCWRldl9kYmcoY29kZWMtPmRldiwgIkVuYWJsaW5nIENsYXNzIFdcbiIpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTAzX0NMQVNTX1dfMCwgcmVnIHwKLQkJCQkgICAgIFdNODkwM19DUF9EWU5fRlJFUSB8IFdNODkwM19DUF9EWU5fVik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5MDNfQ0xBU1NfV18wLAorCQkJCQkgICAgV004OTAzX0NQX0RZTl9GUkVRIHwKKwkJCQkJICAgIFdNODkwM19DUF9EWU5fViwKKwkJCQkJICAgIFdNODkwM19DUF9EWU5fRlJFUSB8CisJCQkJCSAgICBXTTg5MDNfQ1BfRFlOX1YpOwogCQl9CiAKIAkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDNfVk1JRF9DT05UUk9MXzApOwpAQCAtOTkxLDcgKzEwNjEsNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAogCXJldHVybiAwOwogfQpAQCAtMTIyMiw1OCArMTI5Miw2IEBACiAJeyAwLCAgICAgIDAgfSwKIH07CiAKLXN0YXRpYyBpbnQgd204OTAzX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCB3bTg5MDNfcHJpdiAqd204OTAzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqbWFzdGVyX3J1bnRpbWU7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJd204OTAzLT5wbGF5YmFja19hY3RpdmUrKzsKLQllbHNlCi0JCXdtODkwMy0+Y2FwdHVyZV9hY3RpdmUrKzsKLQotCS8qIFRoZSBEQUkgaGFzIHNoYXJlZCBjbG9ja3Mgc28gaWYgd2UgYWxyZWFkeSBoYXZlIGEgcGxheWJhY2sgb3IKLQkgKiBjYXB0dXJlIGdvaW5nIHRoZW4gY29uc3RyYWluIHRoaXMgc3Vic3RyZWFtIHRvIG1hdGNoIGl0LgotCSAqLwotCWlmICh3bTg5MDMtPm1hc3Rlcl9zdWJzdHJlYW0pIHsKLQkJbWFzdGVyX3J1bnRpbWUgPSB3bTg5MDMtPm1hc3Rlcl9zdWJzdHJlYW0tPnJ1bnRpbWU7Ci0KLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQ29uc3RyYWluaW5nIHRvICVkIGJpdHNcbiIsCi0JCQltYXN0ZXJfcnVudGltZS0+c2FtcGxlX2JpdHMpOwotCi0JCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgoc3Vic3RyZWFtLT5ydW50aW1lLAotCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9TQU1QTEVfQklUUywKLQkJCQkJICAgICBtYXN0ZXJfcnVudGltZS0+c2FtcGxlX2JpdHMsCi0JCQkJCSAgICAgbWFzdGVyX3J1bnRpbWUtPnNhbXBsZV9iaXRzKTsKLQotCQl3bTg5MDMtPnNsYXZlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQl9IGVsc2UKLQkJd204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdtODkwM19zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXdtODkwMy0+cGxheWJhY2tfYWN0aXZlLS07Ci0JZWxzZQotCQl3bTg5MDMtPmNhcHR1cmVfYWN0aXZlLS07Ci0KLQlpZiAod204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtID09IHN1YnN0cmVhbSkKLQkJd204OTAzLT5tYXN0ZXJfc3Vic3RyZWFtID0gd204OTAzLT5zbGF2ZV9zdWJzdHJlYW07Ci0KLQl3bTg5MDMtPnNsYXZlX3N1YnN0cmVhbSA9IE5VTEw7Ci19Ci0KIHN0YXRpYyBpbnQgd204OTAzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKQEAgLTEyOTgsMTEgKzEzMTYsNiBAQAogCXUxNiBjbG9jazEgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwM19DTE9DS19SQVRFU18xKTsKIAl1MTYgZGFjX2RpZ2l0YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5MDNfREFDX0RJR0lUQUxfMSk7CiAKLQlpZiAoc3Vic3RyZWFtID09IHdtODkwMy0+c2xhdmVfc3Vic3RyZWFtKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIklnbm9yaW5nIGh3X3BhcmFtcyBmb3Igc2xhdmUgc3Vic3RyZWFtXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJLyogRW5hYmxlIHNsb3Bpbmcgc3RvcGJhbmQgZmlsdGVyIGZvciBsb3cgc2FtcGxlIHJhdGVzICovCiAJaWYgKGZzIDw9IDI0MDAwKQogCQlkYWNfZGlnaXRhbDEgfD0gV004OTAzX0RBQ19TQl9GSUxUOwpAQCAtMTMyMCwxOSArMTMzMyw2IEBACiAJCX0KIAl9CiAKLQkvKiBDb25zdHJhaW50cyBzaG91bGQgc3RvcCB1cyBoaXR0aW5nIHRoaXMgYnV0IGxldCdzIG1ha2Ugc3VyZSAqLwotCWlmICh3bTg5MDMtPmNhcHR1cmVfYWN0aXZlKQotCQlzd2l0Y2ggKHNhbXBsZV9yYXRlc1tkc3BfY29uZmlnXS5yYXRlKSB7Ci0JCWNhc2UgODgyMDA6Ci0JCWNhc2UgOTYwMDA6Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlZEh6IHVuc3VwcG9ydGVkIGJ5IEFEQ1xuIiwKLQkJCQlmcyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQogCWRldl9kYmcoY29kZWMtPmRldiwgIkRTUCBmcyA9ICVkSHpcbiIsIHNhbXBsZV9yYXRlc1tkc3BfY29uZmlnXS5yYXRlKTsKIAljbG9jazEgJj0gfldNODkwM19TQU1QTEVfUkFURV9NQVNLOwogCWNsb2NrMSB8PSBzYW1wbGVfcmF0ZXNbZHNwX2NvbmZpZ10udmFsdWU7CkBAIC0xNDI4LDYgKzE0MjgsOSBAQAogCWFpZjIgfD0gYmNsa19kaXZzW2JjbGtfZGl2XS5kaXY7CiAJYWlmMyB8PSBiY2xrIC8gZnM7CiAKKwl3bTg5MDMtPmZzID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwl3bTg5MDNfc2V0X2RlZW1waChjb2RlYyk7CisKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0xPQ0tfUkFURVNfMCwgY2xvY2swKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDNfQ0xPQ0tfUkFURVNfMSwgY2xvY2sxKTsKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5MDNfQVVESU9fSU5URVJGQUNFXzEsIGFpZjEpOwpAQCAtMTUyMSw2ICsxNTI0LDExIEBACiAJbWljX3JlcG9ydCA9IHdtODkwMy0+bWljX2xhc3RfcmVwb3J0OwogCWludF9wb2wgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODkwM19JTlRFUlJVUFRfUE9MQVJJVFlfMSk7CiAKKyNpZm5kZWYgQ09ORklHX1NORF9TT0NfV004OTAzX01PRFVMRQorCWlmIChpbnRfdmFsICYgKFdNODkwM19NSUNTSFJUX0VJTlQgfCBXTTg5MDNfTUlDREVUX0VJTlQpKQorCQl0cmFjZV9zbmRfc29jX2phY2tfaXJxKGRldl9uYW1lKGNvZGVjLT5kZXYpKTsKKyNlbmRpZgorCiAJaWYgKGludF92YWwgJiBXTTg5MDNfTUlDU0hSVF9FSU5UKSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pY3JvcGhvbmUgc2hvcnQgKHBvbD0leClcbiIsIGludF9wb2wpOwogCkBAIC0xNTcxLDggKzE1NzksNiBAQAogCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHdtODkwM19kYWlfb3BzID0gewotCS5zdGFydHVwCT0gd204OTAzX3N0YXJ0dXAsCi0JLnNodXRkb3duCT0gd204OTAzX3NodXRkb3duLAogCS5od19wYXJhbXMJPSB3bTg5MDNfaHdfcGFyYW1zLAogCS5kaWdpdGFsX211dGUJPSB3bTg5MDNfZGlnaXRhbF9tdXRlLAogCS5zZXRfZm10CT0gd204OTAzX3NldF9kYWlfZm10LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmgKaW5kZXggOTk2NDM1ZS4uZTg0OTBmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDMuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5oCkBAIC0xOSwxMCArMTksNiBAQAogCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLAogCQkJICAgICBpbnQgZGV0LCBpbnQgc2hydCk7CiAKLSNkZWZpbmUgV004OTAzX01DTEtfRElWXzIgMQotI2RlZmluZSBXTTg5MDNfQ0xLX1NZUyAgICAyCi0jZGVmaW5lIFdNODkwM19CQ0xLICAgICAgIDMKLSNkZWZpbmUgV004OTAzX0xSQ0xLICAgICAgNAogCiAvKgogICogUmVnaXN0ZXIgdmFsdWVzLgpAQCAtOTgsOCArOTQsNiBAQAogI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX1NUQVRVU18xX01BU0sgICAgICAgICAgMHg3QQogI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX1BPTEFSSVRZXzEgICAgICAgICAgICAgMHg3QgogI2RlZmluZSBXTTg5MDNfSU5URVJSVVBUX0NPTlRST0wgICAgICAgICAgICAgICAgMHg3RQotI2RlZmluZSBXTTg5MDNfQ09OVFJPTF9JTlRFUkZBQ0VfVEVTVF8xICAgICAgICAgMHg4MQotI2RlZmluZSBXTTg5MDNfQ0hBUkdFX1BVTVBfVEVTVF8xICAgICAgICAgICAgICAgMHg5NQogI2RlZmluZSBXTTg5MDNfQ0xPQ0tfUkFURV9URVNUXzQgICAgICAgICAgICAgICAgMHhBNAogI2RlZmluZSBXTTg5MDNfQU5BTE9HVUVfT1VUUFVUX0JJQVNfMCAgICAgICAgICAgMHhBQwogCkBAIC0xMjA2LDI1ICsxMjAwLDYgQEAKICNkZWZpbmUgV004OTAzX0lSUV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogSVJRX1BPTCAqLwogCiAvKgotICogUjEyOSAoMHg4MSkgLSBDb250cm9sIEludGVyZmFjZSBUZXN0IDEKLSAqLwotI2RlZmluZSBXTTg5MDNfVVNFUl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBVU0VSX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVVNFUl9LRVlfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBVU0VSX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVVNFUl9LRVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBVU0VSX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVVNFUl9LRVlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBVU0VSX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVEVTVF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBURVNUX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVEVTVF9LRVlfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBURVNUX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVEVTVF9LRVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBURVNUX0tFWSAqLwotI2RlZmluZSBXTTg5MDNfVEVTVF9LRVlfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBURVNUX0tFWSAqLwotCi0vKgotICogUjE0OSAoMHg5NSkgLSBDaGFyZ2UgUHVtcCBUZXN0IDEKLSAqLwotI2RlZmluZSBXTTg5MDNfQ1BfU1dfS0VMVklOX01PREVfTUFTSyAgICAgICAgICAgMHgwMDA2ICAvKiBDUF9TV19LRUxWSU5fTU9ERSAtIFsyOjFdICovCi0jZGVmaW5lIFdNODkwM19DUF9TV19LRUxWSU5fTU9ERV9TSElGVCAgICAgICAgICAgICAgIDEgIC8qIENQX1NXX0tFTFZJTl9NT0RFIC0gWzI6MV0gKi8KLSNkZWZpbmUgV004OTAzX0NQX1NXX0tFTFZJTl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgMiAgLyogQ1BfU1dfS0VMVklOX01PREUgLSBbMjoxXSAqLwotCi0vKgogICogUjE2NCAoMHhBNCkgLSBDbG9jayBSYXRlIFRlc3QgNAogICovCiAjZGVmaW5lIFdNODkwM19BRENfRElHX01JQyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAgIC8qIEFEQ19ESUdfTUlDICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwppbmRleCAxZWMxMmVmLi45ZGU0NGE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvd204OTA0Lmg+CkBAIC0xNDI3LDEwICsxNDI2LDExIEBACiBzdGF0aWMgaW50IHdtODkwNF9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODkwNF9wcml2ICp3bTg5MDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5MDRfY29yZV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5MDRfY29yZV9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtODkwNF9jb3JlX2RhcG1fd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBjb3JlX2ludGVyY29uLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNvcmVfaW50ZXJjb24sCiAJCQkJQVJSQVlfU0laRShjb3JlX2ludGVyY29uKSk7CiAKIAlzd2l0Y2ggKHdtODkwNC0+ZGV2dHlwZSkgewpAQCAtMTQ0MiwyMCArMTQ0MiwyMCBAQAogCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204OTA0X3NuZF9jb250cm9scywKIAkJCQkgICAgIEFSUkFZX1NJWkUod204OTA0X3NuZF9jb250cm9scykpOwogCi0JCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODkwNF9hZGNfZGFwbV93aWRnZXRzLAorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODkwNF9hZGNfZGFwbV93aWRnZXRzLAogCQkJCQkgIEFSUkFZX1NJWkUod204OTA0X2FkY19kYXBtX3dpZGdldHMpKTsKLQkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTA0X2RhY19kYXBtX3dpZGdldHMsCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTA0X2RhY19kYXBtX3dpZGdldHMsCiAJCQkJCSAgQVJSQVlfU0laRSh3bTg5MDRfZGFjX2RhcG1fd2lkZ2V0cykpOwotCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5MDRfZGFwbV93aWRnZXRzLAorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODkwNF9kYXBtX3dpZGdldHMsCiAJCQkJCSAgQVJSQVlfU0laRSh3bTg5MDRfZGFwbV93aWRnZXRzKSk7CiAKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGNvcmVfaW50ZXJjb24sCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGNvcmVfaW50ZXJjb24sCiAJCQkJCUFSUkFZX1NJWkUoY29yZV9pbnRlcmNvbikpOwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYWRjX2ludGVyY29uLAorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhZGNfaW50ZXJjb24sCiAJCQkJCUFSUkFZX1NJWkUoYWRjX2ludGVyY29uKSk7Ci0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBkYWNfaW50ZXJjb24sCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGRhY19pbnRlcmNvbiwKIAkJCQkJQVJSQVlfU0laRShkYWNfaW50ZXJjb24pKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIHdtODkwNF9pbnRlcmNvbiwKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd204OTA0X2ludGVyY29uLAogCQkJCQlBUlJBWV9TSVpFKHdtODkwNF9pbnRlcmNvbikpOwogCQlicmVhazsKIApAQCAtMTQ2MywxNyArMTQ2MywxNyBAQAogCQlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd204OTA0X2RhY19zbmRfY29udHJvbHMsCiAJCQkJICAgICBBUlJBWV9TSVpFKHdtODkwNF9kYWNfc25kX2NvbnRyb2xzKSk7CiAKLQkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTA0X2RhY19kYXBtX3dpZGdldHMsCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTA0X2RhY19kYXBtX3dpZGdldHMsCiAJCQkJCSAgQVJSQVlfU0laRSh3bTg5MDRfZGFjX2RhcG1fd2lkZ2V0cykpOwogCi0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBkYWNfaW50ZXJjb24sCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGRhY19pbnRlcmNvbiwKIAkJCQkJQVJSQVlfU0laRShkYWNfaW50ZXJjb24pKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIHdtODkxMl9pbnRlcmNvbiwKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd204OTEyX2ludGVyY29uLAogCQkJCQlBUlJBWV9TSVpFKHdtODkxMl9pbnRlcmNvbikpOwogCQlicmVhazsKIAl9CiAKLQlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4OSw3ICsxNTg5LDcgQEAKIAkJICAgICAgIC0gd204OTA0LT5mcyk7CiAJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUoY2xrX3N5c19yYXRlcyk7IGkrKykgewogCQljdXJfdmFsID0gYWJzKCh3bTg5MDQtPnN5c2Nsa19yYXRlIC8KLQkJCSAgICAgICBjbGtfc3lzX3JhdGVzW2ldLnJhdGlvKSAtIHdtODkwNC0+ZnMpOzsKKwkJCSAgICAgICBjbGtfc3lzX3JhdGVzW2ldLnJhdGlvKSAtIHdtODkwNC0+ZnMpOwogCQlpZiAoY3VyX3ZhbCA8IGJlc3RfdmFsKSB7CiAJCQliZXN0ID0gaTsKIAkJCWJlc3RfdmFsID0gY3VyX3ZhbDsKQEAgLTIxMzgsNyArMjEzOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204OTA0LT5zdXBwbGllcyksCiAJCQkJCQkgICAgd204OTA0LT5zdXBwbGllcyk7CiAJCQlpZiAocmV0ICE9IDApIHsKQEAgLTIxOTcsNyArMjE5Nyw3IEBACiAJCQkJICAgICAgIHdtODkwNC0+c3VwcGxpZXMpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNzMsNyArMjM3Myw3IEBACiAJaW50IHJldCwgaTsKIAogCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKLQljb2RlYy0+aWRsZV9iaWFzX29mZiA9IDE7CisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CiAKIAlzd2l0Y2ggKHdtODkwNC0+ZGV2dHlwZSkgewogCWNhc2UgV004OTA0OgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKaW5kZXggMjMwODZlMi4uMjU1ODBlMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCkBAIC00Myw3ICs0Miw2IEBACiAKIHN0cnVjdCB3bTg5NDBfcHJpdiB7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKLQl1MTYgcmVnX2NhY2hlW1dNODk0MF9DQUNIRVJFR05VTV07CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJdm9pZCAqY29udHJvbF9kYXRhOwogfTsKQEAgLTI5MSwxMyArMjg5LDE0IEBACiAKIHN0YXRpYyBpbnQgd204OTQwX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk0MF9kYXBtX3dpZGdldHMsCisJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5NDBfZGFwbV93aWRnZXRzLAogCQkJCQlBUlJBWV9TSVpFKHdtODk0MF9kYXBtX3dpZGdldHMpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKLQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIApAQCAtNzM1LDcgKzczNCw2IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gcmV0OwotOwogfQogCiBzdGF0aWMgaW50IHdtODk0MF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKaW5kZXggMmFjMzViMC4uNzE2N2RmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3dtODk1NS5oPgpAQCAtNTc2LDEzICs1NzUsMTQgQEAKIAogc3RhdGljIGludCB3bTg5NTVfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NTVfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKHdtODk1NV9zbmRfY29udHJvbHMpKTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk1NV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5NTVfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg5NTVfZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgd204OTU1X2ludGVyY29uLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk1NV9pbnRlcmNvbiwKIAkJCQlBUlJBWV9TSVpFKHdtODk1NV9pbnRlcmNvbikpOwogCiAJcmV0dXJuIDA7CkBAIC03ODYsNyArNzg2LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg5NTUtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg5NTUtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQgIT0gMCkgewpAQCAtODUwLDcgKzg1MCw3IEBACiAJCQkJICAgICAgIHdtODk1NS0+c3VwcGxpZXMpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCmluZGV4IGZmNmZmMmYuLjQzOTMzOTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC93bTg5NjAuaD4KQEAgLTcyLDcgKzcxLDYgQEAKIH07CiAKIHN0cnVjdCB3bTg5NjBfcHJpdiB7Ci0JdTE2IHJlZ19jYWNoZVtXTTg5NjBfQ0FDSEVSRUdOVU1dOwogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAlpbnQgKCpzZXRfYmlhc19sZXZlbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKQEAgLTM4OSwyNyArMzg3LDI4IEBACiB7CiAJc3RydWN0IHdtODk2MF9kYXRhICpwZGF0YSA9IGNvZGVjLT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHdtODk2MF9wcml2ICp3bTg5NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NjBfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTYwX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod204OTYwX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX3BhdGhzLCBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fcGF0aHMsIEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpKTsKIAogCS8qIEluIGNhcGxlc3MgbW9kZSBPVVQzIGlzIHVzZWQgdG8gcHJvdmlkZSBWTUlEIGZvciB0aGUKIAkgKiBoZWFkcGhvbmUgb3V0cHV0cywgb3RoZXJ3aXNlIGl0IGlzIHVzZWQgYXMgYSBtb25vIG1peGVyLgogCSAqLwogCWlmIChwZGF0YSAmJiBwZGF0YS0+Y2FwbGVzcykgewotCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NjBfZGFwbV93aWRnZXRzX2NhcGxlc3MsCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTYwX2RhcG1fd2lkZ2V0c19jYXBsZXNzLAogCQkJCQkgIEFSUkFZX1NJWkUod204OTYwX2RhcG1fd2lkZ2V0c19jYXBsZXNzKSk7CiAKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX3BhdGhzX2NhcGxlc3MsCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX3BhdGhzX2NhcGxlc3MsCiAJCQkJCUFSUkFZX1NJWkUoYXVkaW9fcGF0aHNfY2FwbGVzcykpOwogCX0gZWxzZSB7Ci0JCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk2MF9kYXBtX3dpZGdldHNfb3V0MywKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5NjBfZGFwbV93aWRnZXRzX291dDMsCiAJCQkJCSAgQVJSQVlfU0laRSh3bTg5NjBfZGFwbV93aWRnZXRzX291dDMpKTsKIAotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fcGF0aHNfb3V0MywKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fcGF0aHNfb3V0MywKIAkJCQkJQVJSQVlfU0laRShhdWRpb19wYXRoc19vdXQzKSk7CiAJfQogCkBAIC00MTgsNyArNDE3LDkgQEAKIAkgKiBsaXN0IGVhY2ggdGltZSB0byBmaW5kIHRoZSBkZXNpcmVkIHBvd2VyIHN0YXRlIGRvIHNvIG5vdwogCSAqIGFuZCBzYXZlIHRoZSByZXN1bHQuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5jYXJkLT53aWRnZXRzLCBsaXN0KSB7CisJCWlmICh3LT5kYXBtICE9ICZjb2RlYy0+ZGFwbSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoc3RyY21wKHctPm5hbWUsICJMT1VUMSBQR0EiKSA9PSAwKQogCQkJd204OTYwLT5sb3V0MSA9IHc7CiAJCWlmIChzdHJjbXAody0+bmFtZSwgIlJPVVQxIFBHQSIpID09IDApCkBAIC01NzMsNyArNTc0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgYW50aS1wb3AgZmVhdHVyZXMgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2MF9BUE9QMSwKIAkJCQkgICAgICBXTTg5NjBfUE9CQ1RSTCB8IFdNODk2MF9TT0ZUX1NUIHwKQEAgLTYxMSw3ICs2MTIsNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAogCXJldHVybiAwOwogfQpAQCAtNjI3LDcgKzYyOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKLQkJc3dpdGNoIChjb2RlYy0+Ymlhc19sZXZlbCkgeworCQlzd2l0Y2ggKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpIHsKIAkJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKIAkJCS8qIEVuYWJsZSBhbnRpIHBvcCBtb2RlICovCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NjBfQVBPUDEsCkBAIC02ODIsNyArNjgzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlzd2l0Y2ggKGNvZGVjLT5iaWFzX2xldmVsKSB7CisJCXN3aXRjaCAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCkgewogCQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQkJLyogRGlzYWJsZSBIUCBkaXNjaGFyZ2UgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2MF9BUE9QMiwKQEAgLTcwNiw3ICs3MDcsNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKaW5kZXggODM0MDQ4NS4uNTUyNTJlNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogCkBAIC0yOTAsNyArMjg5LDYgQEAKIHN0cnVjdCB3bTg5NjFfcHJpdiB7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CiAJaW50IHN5c2NsazsKLQl1MTYgcmVnX2NhY2hlW1dNODk2MV9NQVhfUkVHSVNURVJdOwogfTsKIAogc3RhdGljIGludCB3bTg5NjFfdm9sYXRpbGVfcmVnaXN0ZXIodW5zaWduZWQgaW50IHJlZykKQEAgLTg4Miw3ICs4ODAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJLyogRW5hYmxlIGJpYXMgZ2VuZXJhdGlvbiAqLwogCQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NjFfQU5USV9QT1ApOwogCQkJcmVnIHw9IFdNODk2MV9CVUZJT0VOIHwgV004OTYxX0JVRkRDT1BFTjsKQEAgLTg5Nyw3ICs4OTUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfUFJFUEFSRSkgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfUFJFUEFSRSkgewogCQkJLyogVlJFRiBvZmYgKi8KIAkJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTYxX1BXUl9NR01UXzEpOwogCQkJcmVnICY9IH5XTTg5NjFfVlJFRjsKQEAgLTkxOSw3ICs5MTcsNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAogCXJldHVybiAwOwogfQpAQCAtOTU5LDYgKzk1Nyw3IEBACiAKIHN0YXRpYyBpbnQgd204OTYxX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldCA9IDA7CiAJdTE2IHJlZzsKIApAQCAtMTAyNCw5ICsxMDIzLDkgQEAKIAogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NjFfc25kX2NvbnRyb2xzLAogCQkJCUFSUkFZX1NJWkUod204OTYxX3NuZF9jb250cm9scykpOwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk2MV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5NjFfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg5NjFfZGFwbV93aWRnZXRzKSk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX3BhdGhzLCBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fcGF0aHMsIEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKaW5kZXggN2M0MjFjYy4uYjljYjFmYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCkBAIC0yOSwxMCArMjksMTAgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvd204OTYyLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAogI2luY2x1ZGUgIndtODk2Mi5oIgogCkBAIC0xOTU2LDcgKzE5NTYsNyBAQAogCiBzdGF0aWMgaW50IHdtODk2Ml9yZXNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7Ci0JcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TT0ZUV0FSRV9SRVNFVCwgMCk7CisJcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk2Ml9TT0ZUV0FSRV9SRVNFVCwgMHg2MjQzKTsKIH0KIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGlucGdhX3RsdiwgLTIzMjUsIDc1LCAwKTsKQEAgLTI2NzcsNiArMjY3Nyw3IEBACiBzdGF0aWMgaW50IHdtODk2Ml9hZGRfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk2Ml9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NjJfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKHdtODk2Ml9zbmRfY29udHJvbHMpKTsKQEAgLTI2ODgsMjYgKzI2ODksMjYgQEAKIAkJCQkgICAgIEFSUkFZX1NJWkUod204OTYyX3Nwa19zdGVyZW9fY29udHJvbHMpKTsKIAogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTYyX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk2Ml9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtODk2Ml9kYXBtX3dpZGdldHMpKTsKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnNwa19tb25vKQotCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NjJfZGFwbV9zcGtfbW9ub193aWRnZXRzLAorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk2Ml9kYXBtX3Nwa19tb25vX3dpZGdldHMsCiAJCQkJCSAgQVJSQVlfU0laRSh3bTg5NjJfZGFwbV9zcGtfbW9ub193aWRnZXRzKSk7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NjJfZGFwbV9zcGtfc3RlcmVvX3dpZGdldHMsCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTYyX2RhcG1fc3BrX3N0ZXJlb193aWRnZXRzLAogCQkJCQkgIEFSUkFZX1NJWkUod204OTYyX2RhcG1fc3BrX3N0ZXJlb193aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgd204OTYyX2ludGVyY29uLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk2Ml9pbnRlcmNvbiwKIAkJCQlBUlJBWV9TSVpFKHdtODk2Ml9pbnRlcmNvbikpOwogCWlmIChwZGF0YSAmJiBwZGF0YS0+c3BrX21vbm8pCi0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCB3bTg5NjJfc3BrX21vbm9faW50ZXJjb24sCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtODk2Ml9zcGtfbW9ub19pbnRlcmNvbiwKIAkJCQkJQVJSQVlfU0laRSh3bTg5NjJfc3BrX21vbm9faW50ZXJjb24pKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCB3bTg5NjJfc3BrX3N0ZXJlb19pbnRlcmNvbiwKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgd204OTYyX3Nwa19zdGVyZW9faW50ZXJjb24sCiAJCQkJCUFSUkFZX1NJWkUod204OTYyX3Nwa19zdGVyZW9faW50ZXJjb24pKTsKIAogCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQmVlcCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQmVlcCIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yODE0LDcgKzI4MTUsNyBAQAogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldDsKIAotCWlmIChsZXZlbCA9PSBjb2RlYy0+Ymlhc19sZXZlbCkKKwlpZiAobGV2ZWwgPT0gY29kZWMtPmRhcG0uYmlhc19sZXZlbCkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CkBAIC0yODI4LDcgKzI4MjksNyBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKIAkJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHdtODk2Mi0+c3VwcGxpZXMpLAogCQkJCQkJICAgIHdtODk2Mi0+c3VwcGxpZXMpOwogCQkJaWYgKHJldCAhPSAwKSB7CkBAIC0yODc4LDcgKzI4NzksNyBAQAogCQkJCSAgICAgICB3bTg5NjItPnN1cHBsaWVzKTsKIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCkBAIC0zMzQ4LDYgKzMzNDksMTIgQEAKIAlpZiAoYWN0aXZlICYgKFdNODk2Ml9NSUNTQ0RfRUlOVCB8IFdNODk2Ml9NSUNEX0VJTlQpKSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIk1pY3JvcGhvbmUgZXZlbnQgZGV0ZWN0ZWRcbiIpOwogCisjaWZuZGVmIENPTkZJR19TTkRfU09DX1dNODk2Ml9NT0RVTEUKKwkJdHJhY2Vfc25kX3NvY19qYWNrX2lycShkZXZfbmFtZShjb2RlYy0+ZGV2KSk7CisjZW5kaWYKKworCQlwbV93YWtldXBfZXZlbnQoY29kZWMtPmRldiwgMzAwKTsKKwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndtODk2Mi0+bWljX3dvcmssCiAJCQkJICAgICAgbXNlY3NfdG9famlmZmllcygyNTApKTsKIAl9CkBAIC0zNDMzLDYgKzM0NDAsNyBAQAogCXN0cnVjdCB3bTg5NjJfcHJpdiAqd204OTYyID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bTg5NjJfcHJpdiwgYmVlcF93b3JrKTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTg5NjItPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgaTsKIAlpbnQgcmVnID0gMDsKIAlpbnQgYmVzdCA9IDA7CkBAIC0zNDQ5LDE2ICszNDU3LDE2IEBACiAKIAkJcmVnID0gV004OTYyX0JFRVBfRU5BIHwgKGJlc3QgPDwgV004OTYyX0JFRVBfUkFURV9TSElGVCk7CiAKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJCZWVwIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJCZWVwIik7CiAJfSBlbHNlIHsKIAkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRGlzYWJsaW5nIGJlZXBcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJCZWVwIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQmVlcCIpOwogCX0KIAogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk2Ml9CRUVQX0dFTkVSQVRPUl8xLAogCQkJICAgIFdNODk2Ml9CRUVQX0VOQSB8IFdNODk2Ml9CRUVQX1JBVEVfTUFTSywgcmVnKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogLyogRm9yIHVzYWJpbGl0eSBkZWZpbmUgYSB3YXkgb2YgaW5qZWN0aW5nIGJlZXAgZXZlbnRzIGZvciB0aGUgZGV2aWNlIC0KQEAgLTM3MDYsNyArMzcxNCw3IEBACiAJSU5JVF9ERUxBWUVEX1dPUksoJndtODk2Mi0+bWljX3dvcmssIHdtODk2Ml9taWNfd29yayk7CiAKIAljb2RlYy0+Y2FjaGVfc3luYyA9IDE7Ci0JY29kZWMtPmlkbGVfYmlhc19vZmYgPSAxOworCWNvZGVjLT5kYXBtLmlkbGVfYmlhc19vZmYgPSAxOwogCiAJcmV0ID0gc25kX3NvY19jb2RlY19zZXRfY2FjaGVfaW8oY29kZWMsIDE2LCAxNiwgU05EX1NPQ19JMkMpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMzg2NSw3ICszODczLDYgQEAKIGVycl9nZXQ6CiAJcmVndWxhdG9yX2J1bGtfZnJlZShBUlJBWV9TSVpFKHdtODk2Mi0+c3VwcGxpZXMpLCB3bTg5NjItPnN1cHBsaWVzKTsKIGVycjoKLQlrZnJlZSh3bTg5NjIpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCmluZGV4IDlmMThkYjYuLjU3MmJiODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgIndtODk3MS5oIgpAQCAtMzMzLDEwICszMzIsMTEgQEAKIAogc3RhdGljIGludCB3bTg5NzFfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk3MV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODk3MV9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTcxX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204OTcxX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCAweDAwMDEpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5MCw5ICs1OTAsMTEgQEAKIAogc3RhdGljIHZvaWQgd204OTcxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYywgZGVsYXllZF93b3JrLndvcmspOwotCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPmJpYXNfbGV2ZWwpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQsCisJCQkgICAgIGRlbGF5ZWRfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYXBtLT5jb2RlYzsKKwl3bTg5NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpOwogfQogCiBzdGF0aWMgaW50IHdtODk3MV9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgcG1fbWVzc2FnZV90IHN0YXRlKQpAQCAtNjIwLDExICs2MjIsMTEgQEAKIAl3bTg5NzFfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKIAogCS8qIGNoYXJnZSB3bTg5NzEgY2FwcyAqLwotCWlmIChjb2RlYy0+c3VzcGVuZF9iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PTikgeworCWlmIChjb2RlYy0+ZGFwbS5zdXNwZW5kX2JpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09OKSB7CiAJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTcxX1BXUjEpICYgMHhmZTNlOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcmVnIHwgMHgwMWMwKTsKLQkJY29kZWMtPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT047Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayh3bTg5NzFfd29ya3EsICZjb2RlYy0+ZGVsYXllZF93b3JrLAorCQljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOworCQlxdWV1ZV9kZWxheWVkX3dvcmsod204OTcxX3dvcmtxLCAmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLAogCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAJfQogCkBAIC02NDMsNyArNjQ1LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRlbGF5ZWRfd29yaywgd204OTcxX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmssIHdtODk3MV93b3JrKTsKIAl3bTg5NzFfd29ya3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJ3bTg5NzEiKTsKIAlpZiAod204OTcxX3dvcmtxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjUzLDggKzY1NSw4IEBACiAJLyogY2hhcmdlIG91dHB1dCBjYXBzIC0gc2V0IHZtaWQgdG8gNWsgZm9yIHF1aWNrIHBvd2VyIHVwICovCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUFdSMSkgJiAweGZlM2U7CiAJc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1BXUjEsIHJlZyB8IDB4MDFjMCk7Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfU1RBTkRCWTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsod204OTcxX3dvcmtxLCAmY29kZWMtPmRlbGF5ZWRfd29yaywKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7CisJcXVldWVfZGVsYXllZF93b3JrKHdtODk3MV93b3JrcSwgJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywKIAkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwppbmRleCBiNDM2M2Y2Li5jYTY0NmE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTUyLDcgKzUxLDYgQEAKIAogc3RydWN0IHdtODk3NF9wcml2IHsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKLQl1MTYgcmVnX2NhY2hlW1dNODk3NF9DQUNIRVJFR05VTV07CiB9OwogCiAjZGVmaW5lIHdtODk3NF9yZXNldChjKQlzbmRfc29jX3dyaXRlKGMsIFdNODk3NF9SRVNFVCwgMCkKQEAgLTI3NCwxMCArMjcyLDExIEBACiAKIHN0YXRpYyBpbnQgd204OTc0X2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NzRfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg5NzRfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk3NF9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODk3NF9kYXBtX3dpZGdldHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzMCw3ICs1MjksNyBAQAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCXBvd2VyMSB8PSBXTTg5NzRfUE9XRVIxX0JJQVNFTiB8IFdNODk3NF9QT1dFUjFfQlVGSU9FTjsKIAotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBJbml0aWFsIGNhcCBjaGFyZ2UgYXQgVk1JRCA1ayAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTc0X1BPV0VSMSwgcG93ZXIxIHwgMHgzKTsKIAkJCW1kZWxheSgxMDApOwpAQCAtNTQ3LDcgKzU0Niw3IEBACiAJCWJyZWFrOwogCX0KIAotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwppbmRleCAxM2I5NzlhLi40YmJjMzQ0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC02MCw3ICs1OSw2IEBACiAJdW5zaWduZWQgaW50IGZfb3BjbGs7CiAJaW50IG1jbGtfaWR4OwogCWVudW0gd204OTc4X3N5c2Nsa19zcmMgc3lzY2xrOwotCXUxNiByZWdfY2FjaGVbV004OTc4X0NBQ0hFUkVHTlVNXTsKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3bTg5NzhfY29tcGFuZGluZ1tdID0geyJPZmYiLCAiTkMiLCAidS1sYXciLCAiQS1sYXcifTsKQEAgLTM1NSwxMSArMzUzLDEyIEBACiAKIHN0YXRpYyBpbnQgd204OTc4X2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5NzhfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRSh3bTg5NzhfZGFwbV93aWRnZXRzKSk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5NzhfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg5NzhfZGFwbV93aWRnZXRzKSk7CiAJLyogc2V0IHVwIHRoZSBXTTg5NzggYXVkaW8gbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgzNyw3ICs4MzYsNyBAQAogCQkvKiBiaXQgMzogZW5hYmxlIGJpYXMsIGJpdCAyOiBlbmFibGUgSS9PIHRpZSBvZmYgYnVmZmVyICovCiAJCXBvd2VyMSB8PSAweGM7CiAKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogSW5pdGlhbCBjYXAgY2hhcmdlIGF0IFZNSUQgNWsgKi8KIAkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3OF9QT1dFUl9NQU5BR0VNRU5UXzEsCiAJCQkJICAgICAgcG93ZXIxIHwgMHgzKTsKQEAgLTg1Nyw3ICs4NTYsNyBAQAogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVkLCAleFxuIiwgX19mdW5jX18sIGxldmVsLCBwb3dlcjEpOwogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCmluZGV4IGZkMmU3Y2MuLmJhZTUxMGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtNTMzLDEwICs1MzIsMTEgQEAKIAogc3RhdGljIGludCB3bTg5ODVfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk4NV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODk4NV9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTg1X2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod204OTg1X2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwKIAkJCQlBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCXJldHVybiAwOwogfQpAQCAtODc5LDcgKzg3OSw3IEBACiAJCQkJICAgIDEgPDwgV004OTg1X1ZNSURTRUxfU0hJRlQpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg5ODUtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg5ODUtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQpIHsKQEAgLTkzOSw3ICs5MzksNyBAQAogCQlicmVhazsKIAl9CiAKLQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKaW5kZXggZDdmMjU5Ny4uZDcxNzBmMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCiAjaW5jbHVkZSAid204OTg4LmgiCkBAIC01NCw3ICs1Myw2IEBACiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKIAlzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKnN5c2Nsa19jb25zdHJhaW50czsKLQl1MTYgcmVnX2NhY2hlW1dNODk4OF9OVU1fUkVHXTsKIH07CiAKIApAQCAtNjc3LDcgKzY3NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogVlJFRiwgVk1JRD0yeDVrICovCiAJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5ODhfUFdSMSwgcHdyX3JlZyB8IDB4MWMxKTsKIApAQCAtNjkzLDcgKzY5MSw3IEBACiAJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk4OF9QV1IxLCAweDAwMDApOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc1OSw2ICs3NTcsNyBAQAogc3RhdGljIGludCB3bTg5ODhfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5ODhfcHJpdiAqd204OTg4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQgPSAwOwogCXUxNiByZWc7CiAKQEAgLTc5MCw5ICs3ODksOSBAQAogCiAJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk4OF9zbmRfY29udHJvbHMsCiAJCQkJQVJSQVlfU0laRSh3bTg5ODhfc25kX2NvbnRyb2xzKSk7Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204OTg4X2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk4OF9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtODk4OF9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKaW5kZXggMjY0ODI4ZS4uNWM4N2E2MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtOTE0LDExICs5MTMsMTIgQEAKIAogc3RhdGljIGludCB3bTg5OTBfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk5MF9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODk5MF9kYXBtX3dpZGdldHMsCisJCQkJICBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3dpZGdldHMpKTsKIAkvKiBzZXQgdXAgdGhlIFdNODk5MCBhdWRpbyBtYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgYWxsIG91dHB1dCBkaXNjaGFyZ2UgYml0cyAqLwogCQkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkwX0FOVElQT1AxLCBXTTg5OTBfRElTX0xMSU5FIHwKIAkJCQlXTTg5OTBfRElTX1JMSU5FIHwgV004OTkwX0RJU19PVVQzIHwKQEAgLTEyNjYsNyArMTI2Niw3IEBACiAJCWJyZWFrOwogCX0KIAotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwppbmRleCA1ODllM2ZhLi4xOGMwZDljIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvd204OTkzLmg+CiAKQEAgLTIyNiw3ICsyMjUsNiBAQAogCiBzdHJ1Y3Qgd204OTkzX3ByaXYgewogCXN0cnVjdCB3bV9odWJzX2RhdGEgaHVic19kYXRhOwotCXUxNiByZWdfY2FjaGVbV004OTkzX1JFR0lTVEVSX0NPVU5UXTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tXTTg5OTNfTlVNX1NVUFBMSUVTXTsKIAlzdHJ1Y3Qgd204OTkzX3BsYXRmb3JtX2RhdGEgcGRhdGE7CiAJZW51bSBzbmRfc29jX2NvbnRyb2xfdHlwZSBjb250cm9sX3R5cGU7CkBAIC03MzUsNiArNzMzLDcgQEAKIAkJCQkJICAgIDApOwogCQl9CiAJCXdtODk5My0+Y2xhc3Nfd191c2VycysrOworCQl3bTg5OTMtPmh1YnNfZGF0YS5jbGFzc193ID0gdHJ1ZTsKIAl9CiAKIAkvKiBJbXBsZW1lbnQgdGhlIGNoYW5nZSAqLwpAQCAtNzUxLDYgKzc1MCw3IEBACiAJCQkJCSAgICBXTTg5OTNfQ1BfRFlOX1YpOwogCQl9CiAJCXdtODk5My0+Y2xhc3Nfd191c2Vycy0tOworCQl3bTg5OTMtPmh1YnNfZGF0YS5jbGFzc193ID0gZmFsc2U7CiAJfQogCiAJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiSW5kaXJlY3QgREFDIHVzZSBjb3VudCBub3cgJWRcbiIsCkBAIC05NjgsNyArOTY4LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg5OTMtPnN1cHBsaWVzKSwKIAkJCQkJCSAgICB3bTg5OTMtPnN1cHBsaWVzKTsKIAkJCWlmIChyZXQgIT0gMCkKQEAgLTEwMjksNiArMTAyOSwxMiBAQAogCQkJCSAgICBXTTg5OTNfVk1JRF9TRUxfTUFTSyB8IFdNODk5M19CSUFTX0VOQSwKIAkJCQkgICAgMCk7CiAKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX0FOVElQT1AyLAorCQkJCSAgICBXTTg5OTNfU1RBUlRVUF9CSUFTX0VOQSB8CisJCQkJICAgIFdNODk5M19WTUlEX0JVRl9FTkEgfAorCQkJCSAgICBXTTg5OTNfVk1JRF9SQU1QX01BU0sgfAorCQkJCSAgICBXTTg5OTNfQklBU19TUkMsIDApOworCiAjaWZkZWYgQ09ORklHX1JFR1VMQVRPUgogICAgICAgICAgICAgICAgLyogUG9zdCAyLjYuMzQgd2Ugd2lsbCBiZSBhYmxlIHRvIGdldCBhIGNhbGxiYWNrIHdoZW4KICAgICAgICAgICAgICAgICAqIHRoZSByZWd1bGF0b3JzIGFyZSBkaXNhYmxlZCB3aGljaCB3ZSBjYW4gdXNlIGJ1dApAQCAtMTA0Myw3ICsxMDQ5LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjUsNyArMTIzMSw3IEBACiAJCSAgICAgICAtIHdtODk5My0+ZnMpOwogCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKGNsa19zeXNfcmF0ZXMpOyBpKyspIHsKIAkJY3VyX3ZhbCA9IGFicygod204OTkzLT5zeXNjbGtfcmF0ZSAvCi0JCQkgICAgICAgY2xrX3N5c19yYXRlc1tpXS5yYXRpbykgLSB3bTg5OTMtPmZzKTs7CisJCQkgICAgICAgY2xrX3N5c19yYXRlc1tpXS5yYXRpbykgLSB3bTg5OTMtPmZzKTsKIAkJaWYgKGN1cl92YWwgPCBiZXN0X3ZhbCkgewogCQkJYmVzdCA9IGk7CiAJCQliZXN0X3ZhbCA9IGN1cl92YWw7CkBAIC0xNDIyLDYgKzE0MjgsNyBAQAogc3RhdGljIGludCB3bTg5OTNfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTg5OTNfcHJpdiAqd204OTkzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQsIGksIHZhbDsKIAogCXdtODk5My0+aHVic19kYXRhLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CkBAIC0xNTAzLDExICsxNTEwLDExIEBACiAJCQkJICAgICBBUlJBWV9TSVpFKHdtODk5M19lcV9jb250cm9scykpOwogCX0KIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODk5M19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg5OTNfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg5OTNfZGFwbV93aWRnZXRzKSk7CiAJd21faHVic19hZGRfYW5hbG9ndWVfY29udHJvbHMoY29kZWMpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIHJvdXRlcywgQVJSQVlfU0laRShyb3V0ZXMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCByb3V0ZXMsIEFSUkFZX1NJWkUocm91dGVzKSk7CiAJd21faHVic19hZGRfYW5hbG9ndWVfcm91dGVzKGNvZGVjLCB3bTg5OTMtPnBkYXRhLmxpbmVvdXQxX2RpZmYsCiAJCQkJICAgIHdtODk5My0+cGRhdGEubGluZW91dDJfZGlmZik7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LXRhYmxlcy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQtdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlOWIwMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LXRhYmxlcy5jCkBAIC0wLDAgKzEsMzE0NyBAQAorI2luY2x1ZGUgIndtODk5NC5oIgorCitjb25zdCBzdHJ1Y3Qgd204OTk0X2FjY2Vzc19tYXNrIHdtODk5NF9hY2Nlc3NfbWFza3NbV004OTk0X0NBQ0hFX1NJWkVdID0geworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjAgICAgIC0gU29mdHdhcmUgUmVzZXQgKi8KKwl7IDB4M0IzNywgMHgzQjM3IH0sIC8qIFIxICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDEpICovCisJeyAweDZCRjAsIDB4NkJGMCB9LCAvKiBSMiAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICgyKSAqLworCXsgMHgzRkYwLCAweDNGRjAgfSwgLyogUjMgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoMykgKi8KKwl7IDB4M0YzRiwgMHgzRjNGIH0sIC8qIFI0ICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDQpICovCisJeyAweDNGMEYsIDB4M0YwRiB9LCAvKiBSNSAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICg1KSAqLworCXsgMHgwMDNGLCAweDAwM0YgfSwgLyogUjYgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoNikgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwICovCisJeyAweDAxQzAsIDB4MDFDMCB9LCAvKiBSMjEgICAgLSBJbnB1dCBNaXhlciAoMSkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzICovCisJeyAweDAwREYsIDB4MDFERiB9LCAvKiBSMjQgICAgLSBMZWZ0IExpbmUgSW5wdXQgMSYyIFZvbHVtZSAqLworCXsgMHgwMERGLCAweDAxREYgfSwgLyogUjI1ICAgIC0gTGVmdCBMaW5lIElucHV0IDMmNCBWb2x1bWUgKi8KKwl7IDB4MDBERiwgMHgwMURGIH0sIC8qIFIyNiAgICAtIFJpZ2h0IExpbmUgSW5wdXQgMSYyIFZvbHVtZSAqLworCXsgMHgwMERGLCAweDAxREYgfSwgLyogUjI3ICAgIC0gUmlnaHQgTGluZSBJbnB1dCAzJjQgVm9sdW1lICovCisJeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMjggICAgLSBMZWZ0IE91dHB1dCBWb2x1bWUgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIyOSAgICAtIFJpZ2h0IE91dHB1dCBWb2x1bWUgKi8KKwl7IDB4MDA3NywgMHgwMDc3IH0sIC8qIFIzMCAgICAtIExpbmUgT3V0cHV0cyBWb2x1bWUgKi8KKwl7IDB4MDAzMCwgMHgwMDMwIH0sIC8qIFIzMSAgICAtIEhQT1VUMiBWb2x1bWUgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIzMiAgICAtIExlZnQgT1BHQSBWb2x1bWUgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIzMyAgICAtIFJpZ2h0IE9QR0EgVm9sdW1lICovCisJeyAweDAwN0YsIDB4MDA3RiB9LCAvKiBSMzQgICAgLSBTUEtNSVhMIEF0dGVudWF0aW9uICovCisJeyAweDAxN0YsIDB4MDE3RiB9LCAvKiBSMzUgICAgLSBTUEtNSVhSIEF0dGVudWF0aW9uICovCisJeyAweDAwM0YsIDB4MDAzRiB9LCAvKiBSMzYgICAgLSBTUEtPVVQgTWl4ZXJzICovCisJeyAweDAwM0YsIDB4MDAzRiB9LCAvKiBSMzcgICAgLSBDbGFzc0QgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIzOCAgICAtIFNwZWFrZXIgVm9sdW1lIExlZnQgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIzOSAgICAtIFNwZWFrZXIgVm9sdW1lIFJpZ2h0ICovCisJeyAweDAwRkYsIDB4MDBGRiB9LCAvKiBSNDAgICAgLSBJbnB1dCBNaXhlciAoMikgKi8KKwl7IDB4MDFCNywgMHgwMUI3IH0sIC8qIFI0MSAgICAtIElucHV0IE1peGVyICgzKSAqLworCXsgMHgwMUI3LCAweDAxQjcgfSwgLyogUjQyICAgIC0gSW5wdXQgTWl4ZXIgKDQpICovCisJeyAweDAxQzcsIDB4MDFDNyB9LCAvKiBSNDMgICAgLSBJbnB1dCBNaXhlciAoNSkgKi8KKwl7IDB4MDFDNywgMHgwMUM3IH0sIC8qIFI0NCAgICAtIElucHV0IE1peGVyICg2KSAqLworCXsgMHgwMUZGLCAweDAxRkYgfSwgLyogUjQ1ICAgIC0gT3V0cHV0IE1peGVyICgxKSAqLworCXsgMHgwMUZGLCAweDAxRkYgfSwgLyogUjQ2ICAgIC0gT3V0cHV0IE1peGVyICgyKSAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjQ3ICAgIC0gT3V0cHV0IE1peGVyICgzKSAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjQ4ICAgIC0gT3V0cHV0IE1peGVyICg0KSAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjQ5ICAgIC0gT3V0cHV0IE1peGVyICg1KSAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjUwICAgIC0gT3V0cHV0IE1peGVyICg2KSAqLworCXsgMHgwMDM4LCAweDAwMzggfSwgLyogUjUxICAgIC0gSFBPVVQyIE1peGVyICovCisJeyAweDAwNzcsIDB4MDA3NyB9LCAvKiBSNTIgICAgLSBMaW5lIE1peGVyICgxKSAqLworCXsgMHgwMDc3LCAweDAwNzcgfSwgLyogUjUzICAgIC0gTGluZSBNaXhlciAoMikgKi8KKwl7IDB4MDNGRiwgMHgwM0ZGIH0sIC8qIFI1NCAgICAtIFNwZWFrZXIgTWl4ZXIgKi8KKwl7IDB4MDBDMSwgMHgwMEMxIH0sIC8qIFI1NSAgICAtIEFkZGl0aW9uYWwgQ29udHJvbCAqLworCXsgMHgwMEYwLCAweDAwRjAgfSwgLyogUjU2ICAgIC0gQW50aVBPUCAoMSkgKi8KKwl7IDB4MDFFRiwgMHgwMUVGIH0sIC8qIFI1NyAgICAtIEFudGlQT1AgKDIpICovCisJeyAweDAwRkYsIDB4MDBGRiB9LCAvKiBSNTggICAgLSBNSUNCSUFTICovCisJeyAweDAwMEYsIDB4MDAwRiB9LCAvKiBSNTkgICAgLSBMRE8gMSAqLworCXsgMHgwMDA3LCAweDAwMDcgfSwgLyogUjYwICAgIC0gTERPIDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzUgKi8KKwl7IDB4ODAwMCwgMHg4MDAwIH0sIC8qIFI3NiAgICAtIENoYXJnZSBQdW1wICgxKSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjgwICovCisJeyAweDAzMDEsIDB4MDMwMSB9LCAvKiBSODEgICAgLSBDbGFzcyBXICgxKSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjgyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODMgKi8KKwl7IDB4MzMzRiwgMHgzMzNGIH0sIC8qIFI4NCAgICAtIERDIFNlcnZvICgxKSAqLworCXsgMHgwRkVGLCAweDBGRUYgfSwgLyogUjg1ICAgIC0gREMgU2Vydm8gKDIpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODYgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFI4NyAgICAtIERDIFNlcnZvICg0KSAqLworCXsgMHgwMzMzLCAweDAwMDAgfSwgLyogUjg4ICAgIC0gREMgU2Vydm8gUmVhZGJhY2sgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NSAqLworCXsgMHgwMEVFLCAweDAwRUUgfSwgLyogUjk2ICAgIC0gQW5hbG9ndWUgSFAgKDEpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTY5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTcwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTcxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTcyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTczICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTc5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTgwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTgxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTgyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTgzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTg5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTkxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTkyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjAxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjAzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjA5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjEwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjEyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjEzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjE5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjMwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjUzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjU1ICovCisJeyAweDAwMEYsIDB4MDAwMCB9LCAvKiBSMjU2ICAgLSBDaGlwIFJldmlzaW9uICovCisJeyAweDAwNzQsIDB4MDA3NCB9LCAvKiBSMjU3ICAgLSBDb250cm9sIEludGVyZmFjZSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI2OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI3MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI3MSAqLworCXsgMHg4MDdGLCAweDgzN0YgfSwgLyogUjI3MiAgIC0gV3JpdGUgU2VxdWVuY2VyIEN0cmwgKDEpICovCisJeyAweDAxN0YsIDB4MDAwMCB9LCAvKiBSMjczICAgLSBXcml0ZSBTZXF1ZW5jZXIgQ3RybCAoMikgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyOTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzMzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzNzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIzOTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0MzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0NzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0ODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI0OTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MTEgKi8KKwl7IDB4MDAxRiwgMHgwMDFGIH0sIC8qIFI1MTIgICAtIEFJRjEgQ2xvY2tpbmcgKDEpICovCisJeyAweDAwM0YsIDB4MDAzRiB9LCAvKiBSNTEzICAgLSBBSUYxIENsb2NraW5nICgyKSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUxNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUxNSAqLworCXsgMHgwMDFGLCAweDAwMUYgfSwgLyogUjUxNiAgIC0gQUlGMiBDbG9ja2luZyAoMSkgKi8KKwl7IDB4MDAzRiwgMHgwMDNGIH0sIC8qIFI1MTcgICAtIEFJRjIgQ2xvY2tpbmcgKDIpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTE5ICovCisJeyAweDAwMUYsIDB4MDAxRiB9LCAvKiBSNTIwICAgLSBDbG9ja2luZyAoMSkgKi8KKwl7IDB4MDc3NywgMHgwNzc3IH0sIC8qIFI1MjEgICAtIENsb2NraW5nICgyKSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUyNyAqLworCXsgMHgwMEZGLCAweDAwRkYgfSwgLyogUjUyOCAgIC0gQUlGMSBSYXRlICovCisJeyAweDAwRkYsIDB4MDBGRiB9LCAvKiBSNTI5ICAgLSBBSUYyIFJhdGUgKi8KKwl7IDB4MDAwRiwgMHgwMDAwIH0sIC8qIFI1MzAgICAtIFJhdGUgU3RhdHVzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTQzICovCisJeyAweDAwMDcsIDB4MDAwNyB9LCAvKiBSNTQ0ICAgLSBGTEwxIENvbnRyb2wgKDEpICovCisJeyAweDNGNzcsIDB4M0Y3NyB9LCAvKiBSNTQ1ICAgLSBGTEwxIENvbnRyb2wgKDIpICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSNTQ2ICAgLSBGTEwxIENvbnRyb2wgKDMpICovCisJeyAweDdGRUYsIDB4N0ZFRiB9LCAvKiBSNTQ3ICAgLSBGTEwxIENvbnRyb2wgKDQpICovCisJeyAweDFGREIsIDB4MUZEQiB9LCAvKiBSNTQ4ICAgLSBGTEwxIENvbnRyb2wgKDUpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTUzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTU5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTY5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTcwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTcxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTcyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTczICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTc1ICovCisJeyAweDAwMDcsIDB4MDAwNyB9LCAvKiBSNTc2ICAgLSBGTEwyIENvbnRyb2wgKDEpICovCisJeyAweDNGNzcsIDB4M0Y3NyB9LCAvKiBSNTc3ICAgLSBGTEwyIENvbnRyb2wgKDIpICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSNTc4ICAgLSBGTEwyIENvbnRyb2wgKDMpICovCisJeyAweDdGRUYsIDB4N0ZFRiB9LCAvKiBSNTc5ICAgLSBGTEwyIENvbnRyb2wgKDQpICovCisJeyAweDFGREIsIDB4MUZEQiB9LCAvKiBSNTgwICAgLSBGTEwyIENvbnRyb2wgKDUpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTgxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTgyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTgzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTg5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTkxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTkyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjAxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjAzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjA5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjEwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjEyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjEzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjE5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjIxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjIyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjMwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjUzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjU5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjY5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjcwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjcxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjcyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjczICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjc5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjgwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjgxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjgyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjgzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjg5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjkxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjkyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzAxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzAzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzA5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzEwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzEyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzEzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzE5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzIxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzIyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzMwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzUzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzU5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzY3ICovCisJeyAweEUxRjgsIDB4RTFGOCB9LCAvKiBSNzY4ICAgLSBBSUYxIENvbnRyb2wgKDEpICovCisJeyAweENEMUYsIDB4Q0QxRiB9LCAvKiBSNzY5ICAgLSBBSUYxIENvbnRyb2wgKDIpICovCisJeyAweEYwMDAsIDB4RjAwMCB9LCAvKiBSNzcwICAgLSBBSUYxIE1hc3Rlci9TbGF2ZSAqLworCXsgMHgwMUYwLCAweDAxRjAgfSwgLyogUjc3MSAgIC0gQUlGMSBCQ0xLICovCisJeyAweDBGRkYsIDB4MEZGRiB9LCAvKiBSNzcyICAgLSBBSUYxQURDIExSQ0xLICovCisJeyAweDBGRkYsIDB4MEZGRiB9LCAvKiBSNzczICAgLSBBSUYxREFDIExSQ0xLICovCisJeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSNzc0ICAgLSBBSUYxREFDIERhdGEgKi8KKwl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFI3NzUgICAtIEFJRjFBREMgRGF0YSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc3NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc3NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc3OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc3OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc4MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc4MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc4MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc4MyAqLworCXsgMHhGMUY4LCAweEYxRjggfSwgLyogUjc4NCAgIC0gQUlGMiBDb250cm9sICgxKSAqLworCXsgMHhGRDFGLCAweEZEMUYgfSwgLyogUjc4NSAgIC0gQUlGMiBDb250cm9sICgyKSAqLworCXsgMHhGMDAwLCAweEYwMDAgfSwgLyogUjc4NiAgIC0gQUlGMiBNYXN0ZXIvU2xhdmUgKi8KKwl7IDB4MDFGMCwgMHgwMUYwIH0sIC8qIFI3ODcgICAtIEFJRjIgQkNMSyAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjc4OCAgIC0gQUlGMkFEQyBMUkNMSyAqLworCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjc4OSAgIC0gQUlGMkRBQyBMUkNMSyAqLworCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjc5MCAgIC0gQUlGMkRBQyBEYXRhICovCisJeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSNzkxICAgLSBBSUYyQURDIERhdGEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3OTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4NzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4ODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4OTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5NzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDAzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDA2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDA5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDEyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDE1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDE4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDIxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAyMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMjMgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDI0ICAtIEFJRjEgQURDMSBMZWZ0IFZvbHVtZSAqLworCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEwMjUgIC0gQUlGMSBBREMxIFJpZ2h0IFZvbHVtZSAqLworCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEwMjYgIC0gQUlGMSBEQUMxIExlZnQgVm9sdW1lICovCisJeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTAyNyAgLSBBSUYxIERBQzEgUmlnaHQgVm9sdW1lICovCisJeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTAyOCAgLSBBSUYxIEFEQzIgTGVmdCBWb2x1bWUgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDI5ICAtIEFJRjEgQURDMiBSaWdodCBWb2x1bWUgKi8KKwl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDMwICAtIEFJRjEgREFDMiBMZWZ0IFZvbHVtZSAqLworCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEwMzEgIC0gQUlGMSBEQUMyIFJpZ2h0IFZvbHVtZSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDM5ICovCisJeyAweEY4MDAsIDB4RjgwMCB9LCAvKiBSMTA0MCAgLSBBSUYxIEFEQzEgRmlsdGVycyAqLworCXsgMHg3ODAwLCAweDc4MDAgfSwgLyogUjEwNDEgIC0gQUlGMSBBREMyIEZpbHRlcnMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA1MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA1NSAqLworCXsgMHgwMkI2LCAweDAyQjYgfSwgLyogUjEwNTYgIC0gQUlGMSBEQUMxIEZpbHRlcnMgKDEpICovCisJeyAweDNGMDAsIDB4M0YwMCB9LCAvKiBSMTA1NyAgLSBBSUYxIERBQzEgRmlsdGVycyAoMikgKi8KKwl7IDB4MDJCNiwgMHgwMkI2IH0sIC8qIFIxMDU4ICAtIEFJRjEgREFDMiBGaWx0ZXJzICgxKSAqLworCXsgMHgzRjAwLCAweDNGMDAgfSwgLyogUjEwNTkgIC0gQUlGMSBEQUMyIEZpbHRlcnMgKDIpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDYyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDcxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDgwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDgzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDg2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4NyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEwODggIC0gQUlGMSBEUkMxICgxKSAqLworCXsgMHgxRkZGLCAweDFGRkYgfSwgLyogUjEwODkgIC0gQUlGMSBEUkMxICgyKSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEwOTAgIC0gQUlGMSBEUkMxICgzKSAqLworCXsgMHgwN0ZGLCAweDA3RkYgfSwgLyogUjEwOTEgIC0gQUlGMSBEUkMxICg0KSAqLworCXsgMHgwM0ZGLCAweDAzRkYgfSwgLyogUjEwOTIgIC0gQUlGMSBEUkMxICg1KSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDk0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA5NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDk3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA5OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTAwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEwMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTAzICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTEwNCAgLSBBSUYxIERSQzIgKDEpICovCisJeyAweDFGRkYsIDB4MUZGRiB9LCAvKiBSMTEwNSAgLSBBSUYxIERSQzIgKDIpICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTEwNiAgLSBBSUYxIERSQzIgKDMpICovCisJeyAweDA3RkYsIDB4MDdGRiB9LCAvKiBSMTEwNyAgLSBBSUYxIERSQzIgKDQpICovCisJeyAweDAzRkYsIDB4MDNGRiB9LCAvKiBSMTEwOCAgLSBBSUYxIERSQzIgKDUpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEwOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQ0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQ3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTUwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE1MSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNTIgIC0gQUlGMSBEQUMxIEVRIEdhaW5zICgxKSAqLworCXsgMHhGRkMwLCAweEZGQzAgfSwgLyogUjExNTMgIC0gQUlGMSBEQUMxIEVRIEdhaW5zICgyKSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNTQgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMSBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE1NSAgLSBBSUYxIERBQzEgRVEgQmFuZCAxIEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTU2ICAtIEFJRjEgREFDMSBFUSBCYW5kIDEgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTU3ICAtIEFJRjEgREFDMSBFUSBCYW5kIDIgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNTggIC0gQUlGMSBEQUMxIEVRIEJhbmQgMiBCICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE1OSAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEMgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTYwICAtIEFJRjEgREFDMSBFUSBCYW5kIDIgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTYxICAtIEFJRjEgREFDMSBFUSBCYW5kIDMgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNjIgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBCICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2MyAgLSBBSUYxIERBQzEgRVEgQmFuZCAzIEMgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTY0ICAtIEFJRjEgREFDMSBFUSBCYW5kIDMgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTY1ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNjYgIC0gQUlGMSBEQUMxIEVRIEJhbmQgNCBCICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2NyAgLSBBSUYxIERBQzEgRVEgQmFuZCA0IEMgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTY4ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTY5ICAtIEFJRjEgREFDMSBFUSBCYW5kIDUgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNzAgIC0gQUlGMSBEQUMxIEVRIEJhbmQgNSBCICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE3MSAgLSBBSUYxIERBQzEgRVEgQmFuZCA1IFBHICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTc0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTc3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTgwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE4MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExODIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTgzICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE4NCAgLSBBSUYxIERBQzIgRVEgR2FpbnMgKDEpICovCisJeyAweEZGQzAsIDB4RkZDMCB9LCAvKiBSMTE4NSAgLSBBSUYxIERBQzIgRVEgR2FpbnMgKDIpICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE4NiAgLSBBSUYxIERBQzIgRVEgQmFuZCAxIEEgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTg3ICAtIEFJRjEgREFDMiBFUSBCYW5kIDEgQiAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExODggIC0gQUlGMSBEQUMyIEVRIEJhbmQgMSBQRyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExODkgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5MCAgLSBBSUYxIERBQzIgRVEgQmFuZCAyIEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTkxICAtIEFJRjEgREFDMiBFUSBCYW5kIDIgQyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTIgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBQRyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTMgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMyBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5NCAgLSBBSUYxIERBQzIgRVEgQmFuZCAzIEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTk1ICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTYgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMyBQRyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTcgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNCBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5OCAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTk5ICAtIEFJRjEgREFDMiBFUSBCYW5kIDQgQyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEyMDAgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNCBQRyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEyMDEgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTIwMiAgLSBBSUYxIERBQzIgRVEgQmFuZCA1IEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMjAzICAtIEFJRjEgREFDMiBFUSBCYW5kIDUgUEcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjA0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIwNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMDYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjA3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIwOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMDkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjEwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjEzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjE2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjE5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjIyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjI1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjI4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjMxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjM0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjM3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQ2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQ5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjUyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjU1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjY3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjcwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjczICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjc2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjc5ICovCisJeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTI4MCAgLSBBSUYyIEFEQyBMZWZ0IFZvbHVtZSAqLworCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEyODEgIC0gQUlGMiBBREMgUmlnaHQgVm9sdW1lICovCisJeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTI4MiAgLSBBSUYyIERBQyBMZWZ0IFZvbHVtZSAqLworCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEyODMgIC0gQUlGMiBEQUMgUmlnaHQgVm9sdW1lICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI4NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyODUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjg2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI4NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyODggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjg5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjkyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjk1ICovCisJeyAweEY4MDAsIDB4RjgwMCB9LCAvKiBSMTI5NiAgLSBBSUYyIEFEQyBGaWx0ZXJzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzExICovCisJeyAweDAyQjYsIDB4MDJCNiB9LCAvKiBSMTMxMiAgLSBBSUYyIERBQyBGaWx0ZXJzICgxKSAqLworCXsgMHgzRjAwLCAweDNGMDAgfSwgLyogUjEzMTMgIC0gQUlGMiBEQUMgRmlsdGVycyAoMikgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzM1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzM4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNDAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzQxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM0MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNDMgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMzQ0ICAtIEFJRjIgRFJDICgxKSAqLworCXsgMHgxRkZGLCAweDFGRkYgfSwgLyogUjEzNDUgIC0gQUlGMiBEUkMgKDIpICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTM0NiAgLSBBSUYyIERSQyAoMykgKi8KKwl7IDB4MDdGRiwgMHgwN0ZGIH0sIC8qIFIxMzQ3ICAtIEFJRjIgRFJDICg0KSAqLworCXsgMHgwM0ZGLCAweDAzRkYgfSwgLyogUjEzNDggIC0gQUlGMiBEUkMgKDUpICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM0OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzY5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzcyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzc1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzc4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzgxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzg0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzg3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzk2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDA4ICAtIEFJRjIgRVEgR2FpbnMgKDEpICovCisJeyAweEZGQzAsIDB4RkZDMCB9LCAvKiBSMTQwOSAgLSBBSUYyIEVRIEdhaW5zICgyKSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTAgIC0gQUlGMiBFUSBCYW5kIDEgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTEgIC0gQUlGMiBFUSBCYW5kIDEgQiAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTIgIC0gQUlGMiBFUSBCYW5kIDEgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDEzICAtIEFJRjIgRVEgQmFuZCAyIEEgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDE0ICAtIEFJRjIgRVEgQmFuZCAyIEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDE1ICAtIEFJRjIgRVEgQmFuZCAyIEMgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDE2ICAtIEFJRjIgRVEgQmFuZCAyIFBHICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxNyAgLSBBSUYyIEVRIEJhbmQgMyBBICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxOCAgLSBBSUYyIEVRIEJhbmQgMyBCICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxOSAgLSBBSUYyIEVRIEJhbmQgMyBDICovCisJeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQyMCAgLSBBSUYyIEVRIEJhbmQgMyBQRyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MjEgIC0gQUlGMiBFUSBCYW5kIDQgQSAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MjIgIC0gQUlGMiBFUSBCYW5kIDQgQiAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MjMgIC0gQUlGMiBFUSBCYW5kIDQgQyAqLworCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MjQgIC0gQUlGMiBFUSBCYW5kIDQgUEcgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDI1ICAtIEFJRjIgRVEgQmFuZCA1IEEgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDI2ICAtIEFJRjIgRVEgQmFuZCA1IEIgKi8KKwl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDI3ICAtIEFJRjIgRVEgQmFuZCA1IFBHICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQyOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MjkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDMwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDMzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDM2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDM5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQ1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDUxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDU0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDU3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDYwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDYzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDY2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDY5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3MCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDcyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3MyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDc1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDc4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDgxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDg0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDg3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4OCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDkwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5MSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDkzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5NCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDk2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5NyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDk5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTAyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTA1ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwNiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTA4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwOSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTExICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxMiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTE0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxNSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTE3ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxOCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTkgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTIwICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyMSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjIgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTIzICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyNCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjUgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTI2ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyNyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjggKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTI5ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUzMCAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MzEgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTMyICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUzMyAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MzQgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTM1ICovCisJeyAweDAxRUYsIDB4MDFFRiB9LCAvKiBSMTUzNiAgLSBEQUMxIE1peGVyIFZvbHVtZXMgKi8KKwl7IDB4MDAzNywgMHgwMDM3IH0sIC8qIFIxNTM3ICAtIERBQzEgTGVmdCBNaXhlciBSb3V0aW5nICovCisJeyAweDAwMzcsIDB4MDAzNyB9LCAvKiBSMTUzOCAgLSBEQUMxIFJpZ2h0IE1peGVyIFJvdXRpbmcgKi8KKwl7IDB4MDFFRiwgMHgwMUVGIH0sIC8qIFIxNTM5ICAtIERBQzIgTWl4ZXIgVm9sdW1lcyAqLworCXsgMHgwMDM3LCAweDAwMzcgfSwgLyogUjE1NDAgIC0gREFDMiBMZWZ0IE1peGVyIFJvdXRpbmcgKi8KKwl7IDB4MDAzNywgMHgwMDM3IH0sIC8qIFIxNTQxICAtIERBQzIgUmlnaHQgTWl4ZXIgUm91dGluZyAqLworCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjE1NDIgIC0gQUlGMSBBREMxIExlZnQgTWl4ZXIgUm91dGluZyAqLworCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjE1NDMgIC0gQUlGMSBBREMxIFJpZ2h0IE1peGVyIFJvdXRpbmcgKi8KKwl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFIxNTQ0ICAtIEFJRjEgQURDMiBMZWZ0IE1peGVyIFJvdXRpbmcgKi8KKwl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFIxNTQ1ICAtIEFJRjEgQURDMiBSaWdodCBtaXhlciBSb3V0aW5nICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU0NiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NDcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTQ4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU0OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NTAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTUxICovCisJeyAweDAyRkYsIDB4MDNGRiB9LCAvKiBSMTU1MiAgLSBEQUMxIExlZnQgVm9sdW1lICovCisJeyAweDAyRkYsIDB4MDNGRiB9LCAvKiBSMTU1MyAgLSBEQUMxIFJpZ2h0IFZvbHVtZSAqLworCXsgMHgwMkZGLCAweDAzRkYgfSwgLyogUjE1NTQgIC0gREFDMiBMZWZ0IFZvbHVtZSAqLworCXsgMHgwMkZGLCAweDAzRkYgfSwgLyogUjE1NTUgIC0gREFDMiBSaWdodCBWb2x1bWUgKi8KKwl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFIxNTU2ICAtIERBQyBTb2Z0bXV0ZSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NTcgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTU4ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU1OSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NjAgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTYxICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2MiAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NjMgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTY0ICovCisJeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2NSAqLworCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NjYgKi8KKwl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTY3ICovCisJeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSMTU2OCAgLSBPdmVyc2FtcGxpbmcgKi8KKwl7IDB4MDNDMywgMHgwM0MzIH0sIC8qIFIxNTY5ICAtIFNpZGV0b25lICovCit9OworCitjb25zdCBfX2RldmluaXRkYXRhIHUxNiB3bTg5OTRfcmVnX2RlZmF1bHRzW1dNODk5NF9DQUNIRV9TSVpFXSA9IHsKKwkweDg5OTQsICAgICAvKiBSMCAgICAgLSBTb2Z0d2FyZSBSZXNldCAqLworCTB4MDAwMCwgICAgIC8qIFIxICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDEpICovCisJMHg2MDAwLCAgICAgLyogUjIgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMyAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICgzKSAqLworCTB4MDAwMCwgICAgIC8qIFI0ICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDQpICovCisJMHgwMDAwLCAgICAgLyogUjUgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSNiAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICg2KSAqLworCTB4MDAwMCwgICAgIC8qIFI3ICovCisJMHgwMDAwLCAgICAgLyogUjggKi8KKwkweDAwMDAsICAgICAvKiBSOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNiAqLworCTB4MDAwMCwgICAgIC8qIFIxNyAqLworCTB4MDAwMCwgICAgIC8qIFIxOCAqLworCTB4MDAwMCwgICAgIC8qIFIxOSAqLworCTB4MDAwMCwgICAgIC8qIFIyMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMSAgICAtIElucHV0IE1peGVyICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFIyMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMyAqLworCTB4MDA4QiwgICAgIC8qIFIyNCAgICAtIExlZnQgTGluZSBJbnB1dCAxJjIgVm9sdW1lICovCisJMHgwMDhCLCAgICAgLyogUjI1ICAgIC0gTGVmdCBMaW5lIElucHV0IDMmNCBWb2x1bWUgKi8KKwkweDAwOEIsICAgICAvKiBSMjYgICAgLSBSaWdodCBMaW5lIElucHV0IDEmMiBWb2x1bWUgKi8KKwkweDAwOEIsICAgICAvKiBSMjcgICAgLSBSaWdodCBMaW5lIElucHV0IDMmNCBWb2x1bWUgKi8KKwkweDAwNkQsICAgICAvKiBSMjggICAgLSBMZWZ0IE91dHB1dCBWb2x1bWUgKi8KKwkweDAwNkQsICAgICAvKiBSMjkgICAgLSBSaWdodCBPdXRwdXQgVm9sdW1lICovCisJMHgwMDY2LCAgICAgLyogUjMwICAgIC0gTGluZSBPdXRwdXRzIFZvbHVtZSAqLworCTB4MDAyMCwgICAgIC8qIFIzMSAgICAtIEhQT1VUMiBWb2x1bWUgKi8KKwkweDAwNzksICAgICAvKiBSMzIgICAgLSBMZWZ0IE9QR0EgVm9sdW1lICovCisJMHgwMDc5LCAgICAgLyogUjMzICAgIC0gUmlnaHQgT1BHQSBWb2x1bWUgKi8KKwkweDAwMDMsICAgICAvKiBSMzQgICAgLSBTUEtNSVhMIEF0dGVudWF0aW9uICovCisJMHgwMDAzLCAgICAgLyogUjM1ICAgIC0gU1BLTUlYUiBBdHRlbnVhdGlvbiAqLworCTB4MDAxMSwgICAgIC8qIFIzNiAgICAtIFNQS09VVCBNaXhlcnMgKi8KKwkweDAxNDAsICAgICAvKiBSMzcgICAgLSBDbGFzc0QgKi8KKwkweDAwNzksICAgICAvKiBSMzggICAgLSBTcGVha2VyIFZvbHVtZSBMZWZ0ICovCisJMHgwMDc5LCAgICAgLyogUjM5ICAgIC0gU3BlYWtlciBWb2x1bWUgUmlnaHQgKi8KKwkweDAwMDAsICAgICAvKiBSNDAgICAgLSBJbnB1dCBNaXhlciAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSNDEgICAgLSBJbnB1dCBNaXhlciAoMykgKi8KKwkweDAwMDAsICAgICAvKiBSNDIgICAgLSBJbnB1dCBNaXhlciAoNCkgKi8KKwkweDAwMDAsICAgICAvKiBSNDMgICAgLSBJbnB1dCBNaXhlciAoNSkgKi8KKwkweDAwMDAsICAgICAvKiBSNDQgICAgLSBJbnB1dCBNaXhlciAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSNDUgICAgLSBPdXRwdXQgTWl4ZXIgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjQ2ICAgIC0gT3V0cHV0IE1peGVyICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFI0NyAgICAtIE91dHB1dCBNaXhlciAoMykgKi8KKwkweDAwMDAsICAgICAvKiBSNDggICAgLSBPdXRwdXQgTWl4ZXIgKDQpICovCisJMHgwMDAwLCAgICAgLyogUjQ5ICAgIC0gT3V0cHV0IE1peGVyICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFI1MCAgICAtIE91dHB1dCBNaXhlciAoNikgKi8KKwkweDAwMDAsICAgICAvKiBSNTEgICAgLSBIUE9VVDIgTWl4ZXIgKi8KKwkweDAwMDAsICAgICAvKiBSNTIgICAgLSBMaW5lIE1peGVyICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI1MyAgICAtIExpbmUgTWl4ZXIgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjU0ICAgIC0gU3BlYWtlciBNaXhlciAqLworCTB4MDAwMCwgICAgIC8qIFI1NSAgICAtIEFkZGl0aW9uYWwgQ29udHJvbCAqLworCTB4MDAwMCwgICAgIC8qIFI1NiAgICAtIEFudGlQT1AgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjU3ICAgIC0gQW50aVBPUCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSNTggICAgLSBNSUNCSUFTICovCisJMHgwMDBELCAgICAgLyogUjU5ICAgIC0gTERPIDEgKi8KKwkweDAwMDMsICAgICAvKiBSNjAgICAgLSBMRE8gMiAqLworCTB4MDAwMCwgICAgIC8qIFI2MSAqLworCTB4MDAwMCwgICAgIC8qIFI2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2MyAqLworCTB4MDAwMCwgICAgIC8qIFI2NCAqLworCTB4MDAwMCwgICAgIC8qIFI2NSAqLworCTB4MDAwMCwgICAgIC8qIFI2NiAqLworCTB4MDAwMCwgICAgIC8qIFI2NyAqLworCTB4MDAwMCwgICAgIC8qIFI2OCAqLworCTB4MDAwMCwgICAgIC8qIFI2OSAqLworCTB4MDAwMCwgICAgIC8qIFI3MCAqLworCTB4MDAwMCwgICAgIC8qIFI3MSAqLworCTB4MDAwMCwgICAgIC8qIFI3MiAqLworCTB4MDAwMCwgICAgIC8qIFI3MyAqLworCTB4MDAwMCwgICAgIC8qIFI3NCAqLworCTB4MDAwMCwgICAgIC8qIFI3NSAqLworCTB4MUYyNSwgICAgIC8qIFI3NiAgICAtIENoYXJnZSBQdW1wICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI3NyAqLworCTB4MDAwMCwgICAgIC8qIFI3OCAqLworCTB4MDAwMCwgICAgIC8qIFI3OSAqLworCTB4MDAwMCwgICAgIC8qIFI4MCAqLworCTB4MDAwNCwgICAgIC8qIFI4MSAgICAtIENsYXNzIFcgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjgyICovCisJMHgwMDAwLCAgICAgLyogUjgzICovCisJMHgwMDAwLCAgICAgLyogUjg0ICAgIC0gREMgU2Vydm8gKDEpICovCisJMHgwNTRBLCAgICAgLyogUjg1ICAgIC0gREMgU2Vydm8gKDIpICovCisJMHgwMDAwLCAgICAgLyogUjg2ICovCisJMHgwMDAwLCAgICAgLyogUjg3ICAgIC0gREMgU2Vydm8gKDQpICovCisJMHgwMDAwLCAgICAgLyogUjg4ICAgIC0gREMgU2Vydm8gUmVhZGJhY2sgKi8KKwkweDAwMDAsICAgICAvKiBSODkgKi8KKwkweDAwMDAsICAgICAvKiBSOTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTIgKi8KKwkweDAwMDAsICAgICAvKiBSOTMgKi8KKwkweDAwMDAsICAgICAvKiBSOTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTYgICAgLSBBbmFsb2d1ZSBIUCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSOTcgKi8KKwkweDAwMDAsICAgICAvKiBSOTggKi8KKwkweDAwMDAsICAgICAvKiBSOTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwICovCisJMHgwMDAwLCAgICAgLyogUjEwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzICovCisJMHgwMDAwLCAgICAgLyogUjEwNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA2ICovCisJMHgwMDAwLCAgICAgLyogUjEwNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTA5ICovCisJMHgwMDAwLCAgICAgLyogUjExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTEgKi8KKwkweDAwMDAsICAgICAvKiBSMTEyICovCisJMHgwMDAwLCAgICAgLyogUjExMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTE1ICovCisJMHgwMDAwLCAgICAgLyogUjExNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4ICovCisJMHgwMDAwLCAgICAgLyogUjExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxICovCisJMHgwMDAwLCAgICAgLyogUjEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3ICovCisJMHgwMDAwLCAgICAgLyogUjEyOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwICovCisJMHgwMDAwLCAgICAgLyogUjEzMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzICovCisJMHgwMDAwLCAgICAgLyogUjEzNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTM5ICovCisJMHgwMDAwLCAgICAgLyogUjE0MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQyICovCisJMHgwMDAwLCAgICAgLyogUjE0MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ1ICovCisJMHgwMDAwLCAgICAgLyogUjE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4ICovCisJMHgwMDAwLCAgICAgLyogUjE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxICovCisJMHgwMDAwLCAgICAgLyogUjE1MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0ICovCisJMHgwMDAwLCAgICAgLyogUjE1NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTU3ICovCisJMHgwMDAwLCAgICAgLyogUjE1OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTYwICovCisJMHgwMDAwLCAgICAgLyogUjE2MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTYzICovCisJMHgwMDAwLCAgICAgLyogUjE2NCAqLworCTB4MDAwMCwgICAgIC8qIFIxNjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTY2ICovCisJMHgwMDAwLCAgICAgLyogUjE2NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNjggKi8KKwkweDAwMDAsICAgICAvKiBSMTY5ICovCisJMHgwMDAwLCAgICAgLyogUjE3MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTcyICovCisJMHgwMDAwLCAgICAgLyogUjE3MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTc1ICovCisJMHgwMDAwLCAgICAgLyogUjE3NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTc4ICovCisJMHgwMDAwLCAgICAgLyogUjE3OSAqLworCTB4MDAwMCwgICAgIC8qIFIxODAgKi8KKwkweDAwMDAsICAgICAvKiBSMTgxICovCisJMHgwMDAwLCAgICAgLyogUjE4MiAqLworCTB4MDAwMCwgICAgIC8qIFIxODMgKi8KKwkweDAwMDAsICAgICAvKiBSMTg0ICovCisJMHgwMDAwLCAgICAgLyogUjE4NSAqLworCTB4MDAwMCwgICAgIC8qIFIxODYgKi8KKwkweDAwMDAsICAgICAvKiBSMTg3ICovCisJMHgwMDAwLCAgICAgLyogUjE4OCAqLworCTB4MDAwMCwgICAgIC8qIFIxODkgKi8KKwkweDAwMDAsICAgICAvKiBSMTkwICovCisJMHgwMDAwLCAgICAgLyogUjE5MSAqLworCTB4MDAwMCwgICAgIC8qIFIxOTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTkzICovCisJMHgwMDAwLCAgICAgLyogUjE5NCAqLworCTB4MDAwMCwgICAgIC8qIFIxOTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTk2ICovCisJMHgwMDAwLCAgICAgLyogUjE5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxOTggKi8KKwkweDAwMDAsICAgICAvKiBSMTk5ICovCisJMHgwMDAwLCAgICAgLyogUjIwMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMjAyICovCisJMHgwMDAwLCAgICAgLyogUjIwMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMDQgKi8KKwkweDAwMDAsICAgICAvKiBSMjA1ICovCisJMHgwMDAwLCAgICAgLyogUjIwNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMDcgKi8KKwkweDAwMDAsICAgICAvKiBSMjA4ICovCisJMHgwMDAwLCAgICAgLyogUjIwOSAqLworCTB4MDAwMCwgICAgIC8qIFIyMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMjExICovCisJMHgwMDAwLCAgICAgLyogUjIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIyMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMjE0ICovCisJMHgwMDAwLCAgICAgLyogUjIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIyMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMjE3ICovCisJMHgwMDAwLCAgICAgLyogUjIxOCAqLworCTB4MDAwMCwgICAgIC8qIFIyMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMjIwICovCisJMHgwMDAwLCAgICAgLyogUjIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIyMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMjIzICovCisJMHgwMDAwLCAgICAgLyogUjIyNCAqLworCTB4MDAwMCwgICAgIC8qIFIyMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMjI2ICovCisJMHgwMDAwLCAgICAgLyogUjIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIyMjggKi8KKwkweDAwMDAsICAgICAvKiBSMjI5ICovCisJMHgwMDAwLCAgICAgLyogUjIzMCAqLworCTB4MDAwMCwgICAgIC8qIFIyMzEgKi8KKwkweDAwMDAsICAgICAvKiBSMjMyICovCisJMHgwMDAwLCAgICAgLyogUjIzMyAqLworCTB4MDAwMCwgICAgIC8qIFIyMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjM1ICovCisJMHgwMDAwLCAgICAgLyogUjIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIyMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjM4ICovCisJMHgwMDAwLCAgICAgLyogUjIzOSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMjQxICovCisJMHgwMDAwLCAgICAgLyogUjI0MiAqLworCTB4MDAwMCwgICAgIC8qIFIyNDMgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ0ICovCisJMHgwMDAwLCAgICAgLyogUjI0NSAqLworCTB4MDAwMCwgICAgIC8qIFIyNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMjQ3ICovCisJMHgwMDAwLCAgICAgLyogUjI0OCAqLworCTB4MDAwMCwgICAgIC8qIFIyNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMjUwICovCisJMHgwMDAwLCAgICAgLyogUjI1MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjUzICovCisJMHgwMDAwLCAgICAgLyogUjI1NCAqLworCTB4MDAwMCwgICAgIC8qIFIyNTUgKi8KKwkweDAwMDMsICAgICAvKiBSMjU2ICAgLSBDaGlwIFJldmlzaW9uICovCisJMHg4MDA0LCAgICAgLyogUjI1NyAgIC0gQ29udHJvbCBJbnRlcmZhY2UgKi8KKwkweDAwMDAsICAgICAvKiBSMjU4ICovCisJMHgwMDAwLCAgICAgLyogUjI1OSAqLworCTB4MDAwMCwgICAgIC8qIFIyNjAgKi8KKwkweDAwMDAsICAgICAvKiBSMjYxICovCisJMHgwMDAwLCAgICAgLyogUjI2MiAqLworCTB4MDAwMCwgICAgIC8qIFIyNjMgKi8KKwkweDAwMDAsICAgICAvKiBSMjY0ICovCisJMHgwMDAwLCAgICAgLyogUjI2NSAqLworCTB4MDAwMCwgICAgIC8qIFIyNjYgKi8KKwkweDAwMDAsICAgICAvKiBSMjY3ICovCisJMHgwMDAwLCAgICAgLyogUjI2OCAqLworCTB4MDAwMCwgICAgIC8qIFIyNjkgKi8KKwkweDAwMDAsICAgICAvKiBSMjcwICovCisJMHgwMDAwLCAgICAgLyogUjI3MSAqLworCTB4MDAwMCwgICAgIC8qIFIyNzIgICAtIFdyaXRlIFNlcXVlbmNlciBDdHJsICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFIyNzMgICAtIFdyaXRlIFNlcXVlbmNlciBDdHJsICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFIyNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMjc1ICovCisJMHgwMDAwLCAgICAgLyogUjI3NiAqLworCTB4MDAwMCwgICAgIC8qIFIyNzcgKi8KKwkweDAwMDAsICAgICAvKiBSMjc4ICovCisJMHgwMDAwLCAgICAgLyogUjI3OSAqLworCTB4MDAwMCwgICAgIC8qIFIyODAgKi8KKwkweDAwMDAsICAgICAvKiBSMjgxICovCisJMHgwMDAwLCAgICAgLyogUjI4MiAqLworCTB4MDAwMCwgICAgIC8qIFIyODMgKi8KKwkweDAwMDAsICAgICAvKiBSMjg0ICovCisJMHgwMDAwLCAgICAgLyogUjI4NSAqLworCTB4MDAwMCwgICAgIC8qIFIyODYgKi8KKwkweDAwMDAsICAgICAvKiBSMjg3ICovCisJMHgwMDAwLCAgICAgLyogUjI4OCAqLworCTB4MDAwMCwgICAgIC8qIFIyODkgKi8KKwkweDAwMDAsICAgICAvKiBSMjkwICovCisJMHgwMDAwLCAgICAgLyogUjI5MSAqLworCTB4MDAwMCwgICAgIC8qIFIyOTIgKi8KKwkweDAwMDAsICAgICAvKiBSMjkzICovCisJMHgwMDAwLCAgICAgLyogUjI5NCAqLworCTB4MDAwMCwgICAgIC8qIFIyOTUgKi8KKwkweDAwMDAsICAgICAvKiBSMjk2ICovCisJMHgwMDAwLCAgICAgLyogUjI5NyAqLworCTB4MDAwMCwgICAgIC8qIFIyOTggKi8KKwkweDAwMDAsICAgICAvKiBSMjk5ICovCisJMHgwMDAwLCAgICAgLyogUjMwMCAqLworCTB4MDAwMCwgICAgIC8qIFIzMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMzAyICovCisJMHgwMDAwLCAgICAgLyogUjMwMyAqLworCTB4MDAwMCwgICAgIC8qIFIzMDQgKi8KKwkweDAwMDAsICAgICAvKiBSMzA1ICovCisJMHgwMDAwLCAgICAgLyogUjMwNiAqLworCTB4MDAwMCwgICAgIC8qIFIzMDcgKi8KKwkweDAwMDAsICAgICAvKiBSMzA4ICovCisJMHgwMDAwLCAgICAgLyogUjMwOSAqLworCTB4MDAwMCwgICAgIC8qIFIzMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMzExICovCisJMHgwMDAwLCAgICAgLyogUjMxMiAqLworCTB4MDAwMCwgICAgIC8qIFIzMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMzE0ICovCisJMHgwMDAwLCAgICAgLyogUjMxNSAqLworCTB4MDAwMCwgICAgIC8qIFIzMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMzE3ICovCisJMHgwMDAwLCAgICAgLyogUjMxOCAqLworCTB4MDAwMCwgICAgIC8qIFIzMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMzIwICovCisJMHgwMDAwLCAgICAgLyogUjMyMSAqLworCTB4MDAwMCwgICAgIC8qIFIzMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMzIzICovCisJMHgwMDAwLCAgICAgLyogUjMyNCAqLworCTB4MDAwMCwgICAgIC8qIFIzMjUgKi8KKwkweDAwMDAsICAgICAvKiBSMzI2ICovCisJMHgwMDAwLCAgICAgLyogUjMyNyAqLworCTB4MDAwMCwgICAgIC8qIFIzMjggKi8KKwkweDAwMDAsICAgICAvKiBSMzI5ICovCisJMHgwMDAwLCAgICAgLyogUjMzMCAqLworCTB4MDAwMCwgICAgIC8qIFIzMzEgKi8KKwkweDAwMDAsICAgICAvKiBSMzMyICovCisJMHgwMDAwLCAgICAgLyogUjMzMyAqLworCTB4MDAwMCwgICAgIC8qIFIzMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMzM1ICovCisJMHgwMDAwLCAgICAgLyogUjMzNiAqLworCTB4MDAwMCwgICAgIC8qIFIzMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMzM4ICovCisJMHgwMDAwLCAgICAgLyogUjMzOSAqLworCTB4MDAwMCwgICAgIC8qIFIzNDAgKi8KKwkweDAwMDAsICAgICAvKiBSMzQxICovCisJMHgwMDAwLCAgICAgLyogUjM0MiAqLworCTB4MDAwMCwgICAgIC8qIFIzNDMgKi8KKwkweDAwMDAsICAgICAvKiBSMzQ0ICovCisJMHgwMDAwLCAgICAgLyogUjM0NSAqLworCTB4MDAwMCwgICAgIC8qIFIzNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMzQ3ICovCisJMHgwMDAwLCAgICAgLyogUjM0OCAqLworCTB4MDAwMCwgICAgIC8qIFIzNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMzUwICovCisJMHgwMDAwLCAgICAgLyogUjM1MSAqLworCTB4MDAwMCwgICAgIC8qIFIzNTIgKi8KKwkweDAwMDAsICAgICAvKiBSMzUzICovCisJMHgwMDAwLCAgICAgLyogUjM1NCAqLworCTB4MDAwMCwgICAgIC8qIFIzNTUgKi8KKwkweDAwMDAsICAgICAvKiBSMzU2ICovCisJMHgwMDAwLCAgICAgLyogUjM1NyAqLworCTB4MDAwMCwgICAgIC8qIFIzNTggKi8KKwkweDAwMDAsICAgICAvKiBSMzU5ICovCisJMHgwMDAwLCAgICAgLyogUjM2MCAqLworCTB4MDAwMCwgICAgIC8qIFIzNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMzYyICovCisJMHgwMDAwLCAgICAgLyogUjM2MyAqLworCTB4MDAwMCwgICAgIC8qIFIzNjQgKi8KKwkweDAwMDAsICAgICAvKiBSMzY1ICovCisJMHgwMDAwLCAgICAgLyogUjM2NiAqLworCTB4MDAwMCwgICAgIC8qIFIzNjcgKi8KKwkweDAwMDAsICAgICAvKiBSMzY4ICovCisJMHgwMDAwLCAgICAgLyogUjM2OSAqLworCTB4MDAwMCwgICAgIC8qIFIzNzAgKi8KKwkweDAwMDAsICAgICAvKiBSMzcxICovCisJMHgwMDAwLCAgICAgLyogUjM3MiAqLworCTB4MDAwMCwgICAgIC8qIFIzNzMgKi8KKwkweDAwMDAsICAgICAvKiBSMzc0ICovCisJMHgwMDAwLCAgICAgLyogUjM3NSAqLworCTB4MDAwMCwgICAgIC8qIFIzNzYgKi8KKwkweDAwMDAsICAgICAvKiBSMzc3ICovCisJMHgwMDAwLCAgICAgLyogUjM3OCAqLworCTB4MDAwMCwgICAgIC8qIFIzNzkgKi8KKwkweDAwMDAsICAgICAvKiBSMzgwICovCisJMHgwMDAwLCAgICAgLyogUjM4MSAqLworCTB4MDAwMCwgICAgIC8qIFIzODIgKi8KKwkweDAwMDAsICAgICAvKiBSMzgzICovCisJMHgwMDAwLCAgICAgLyogUjM4NCAqLworCTB4MDAwMCwgICAgIC8qIFIzODUgKi8KKwkweDAwMDAsICAgICAvKiBSMzg2ICovCisJMHgwMDAwLCAgICAgLyogUjM4NyAqLworCTB4MDAwMCwgICAgIC8qIFIzODggKi8KKwkweDAwMDAsICAgICAvKiBSMzg5ICovCisJMHgwMDAwLCAgICAgLyogUjM5MCAqLworCTB4MDAwMCwgICAgIC8qIFIzOTEgKi8KKwkweDAwMDAsICAgICAvKiBSMzkyICovCisJMHgwMDAwLCAgICAgLyogUjM5MyAqLworCTB4MDAwMCwgICAgIC8qIFIzOTQgKi8KKwkweDAwMDAsICAgICAvKiBSMzk1ICovCisJMHgwMDAwLCAgICAgLyogUjM5NiAqLworCTB4MDAwMCwgICAgIC8qIFIzOTcgKi8KKwkweDAwMDAsICAgICAvKiBSMzk4ICovCisJMHgwMDAwLCAgICAgLyogUjM5OSAqLworCTB4MDAwMCwgICAgIC8qIFI0MDAgKi8KKwkweDAwMDAsICAgICAvKiBSNDAxICovCisJMHgwMDAwLCAgICAgLyogUjQwMiAqLworCTB4MDAwMCwgICAgIC8qIFI0MDMgKi8KKwkweDAwMDAsICAgICAvKiBSNDA0ICovCisJMHgwMDAwLCAgICAgLyogUjQwNSAqLworCTB4MDAwMCwgICAgIC8qIFI0MDYgKi8KKwkweDAwMDAsICAgICAvKiBSNDA3ICovCisJMHgwMDAwLCAgICAgLyogUjQwOCAqLworCTB4MDAwMCwgICAgIC8qIFI0MDkgKi8KKwkweDAwMDAsICAgICAvKiBSNDEwICovCisJMHgwMDAwLCAgICAgLyogUjQxMSAqLworCTB4MDAwMCwgICAgIC8qIFI0MTIgKi8KKwkweDAwMDAsICAgICAvKiBSNDEzICovCisJMHgwMDAwLCAgICAgLyogUjQxNCAqLworCTB4MDAwMCwgICAgIC8qIFI0MTUgKi8KKwkweDAwMDAsICAgICAvKiBSNDE2ICovCisJMHgwMDAwLCAgICAgLyogUjQxNyAqLworCTB4MDAwMCwgICAgIC8qIFI0MTggKi8KKwkweDAwMDAsICAgICAvKiBSNDE5ICovCisJMHgwMDAwLCAgICAgLyogUjQyMCAqLworCTB4MDAwMCwgICAgIC8qIFI0MjEgKi8KKwkweDAwMDAsICAgICAvKiBSNDIyICovCisJMHgwMDAwLCAgICAgLyogUjQyMyAqLworCTB4MDAwMCwgICAgIC8qIFI0MjQgKi8KKwkweDAwMDAsICAgICAvKiBSNDI1ICovCisJMHgwMDAwLCAgICAgLyogUjQyNiAqLworCTB4MDAwMCwgICAgIC8qIFI0MjcgKi8KKwkweDAwMDAsICAgICAvKiBSNDI4ICovCisJMHgwMDAwLCAgICAgLyogUjQyOSAqLworCTB4MDAwMCwgICAgIC8qIFI0MzAgKi8KKwkweDAwMDAsICAgICAvKiBSNDMxICovCisJMHgwMDAwLCAgICAgLyogUjQzMiAqLworCTB4MDAwMCwgICAgIC8qIFI0MzMgKi8KKwkweDAwMDAsICAgICAvKiBSNDM0ICovCisJMHgwMDAwLCAgICAgLyogUjQzNSAqLworCTB4MDAwMCwgICAgIC8qIFI0MzYgKi8KKwkweDAwMDAsICAgICAvKiBSNDM3ICovCisJMHgwMDAwLCAgICAgLyogUjQzOCAqLworCTB4MDAwMCwgICAgIC8qIFI0MzkgKi8KKwkweDAwMDAsICAgICAvKiBSNDQwICovCisJMHgwMDAwLCAgICAgLyogUjQ0MSAqLworCTB4MDAwMCwgICAgIC8qIFI0NDIgKi8KKwkweDAwMDAsICAgICAvKiBSNDQzICovCisJMHgwMDAwLCAgICAgLyogUjQ0NCAqLworCTB4MDAwMCwgICAgIC8qIFI0NDUgKi8KKwkweDAwMDAsICAgICAvKiBSNDQ2ICovCisJMHgwMDAwLCAgICAgLyogUjQ0NyAqLworCTB4MDAwMCwgICAgIC8qIFI0NDggKi8KKwkweDAwMDAsICAgICAvKiBSNDQ5ICovCisJMHgwMDAwLCAgICAgLyogUjQ1MCAqLworCTB4MDAwMCwgICAgIC8qIFI0NTEgKi8KKwkweDAwMDAsICAgICAvKiBSNDUyICovCisJMHgwMDAwLCAgICAgLyogUjQ1MyAqLworCTB4MDAwMCwgICAgIC8qIFI0NTQgKi8KKwkweDAwMDAsICAgICAvKiBSNDU1ICovCisJMHgwMDAwLCAgICAgLyogUjQ1NiAqLworCTB4MDAwMCwgICAgIC8qIFI0NTcgKi8KKwkweDAwMDAsICAgICAvKiBSNDU4ICovCisJMHgwMDAwLCAgICAgLyogUjQ1OSAqLworCTB4MDAwMCwgICAgIC8qIFI0NjAgKi8KKwkweDAwMDAsICAgICAvKiBSNDYxICovCisJMHgwMDAwLCAgICAgLyogUjQ2MiAqLworCTB4MDAwMCwgICAgIC8qIFI0NjMgKi8KKwkweDAwMDAsICAgICAvKiBSNDY0ICovCisJMHgwMDAwLCAgICAgLyogUjQ2NSAqLworCTB4MDAwMCwgICAgIC8qIFI0NjYgKi8KKwkweDAwMDAsICAgICAvKiBSNDY3ICovCisJMHgwMDAwLCAgICAgLyogUjQ2OCAqLworCTB4MDAwMCwgICAgIC8qIFI0NjkgKi8KKwkweDAwMDAsICAgICAvKiBSNDcwICovCisJMHgwMDAwLCAgICAgLyogUjQ3MSAqLworCTB4MDAwMCwgICAgIC8qIFI0NzIgKi8KKwkweDAwMDAsICAgICAvKiBSNDczICovCisJMHgwMDAwLCAgICAgLyogUjQ3NCAqLworCTB4MDAwMCwgICAgIC8qIFI0NzUgKi8KKwkweDAwMDAsICAgICAvKiBSNDc2ICovCisJMHgwMDAwLCAgICAgLyogUjQ3NyAqLworCTB4MDAwMCwgICAgIC8qIFI0NzggKi8KKwkweDAwMDAsICAgICAvKiBSNDc5ICovCisJMHgwMDAwLCAgICAgLyogUjQ4MCAqLworCTB4MDAwMCwgICAgIC8qIFI0ODEgKi8KKwkweDAwMDAsICAgICAvKiBSNDgyICovCisJMHgwMDAwLCAgICAgLyogUjQ4MyAqLworCTB4MDAwMCwgICAgIC8qIFI0ODQgKi8KKwkweDAwMDAsICAgICAvKiBSNDg1ICovCisJMHgwMDAwLCAgICAgLyogUjQ4NiAqLworCTB4MDAwMCwgICAgIC8qIFI0ODcgKi8KKwkweDAwMDAsICAgICAvKiBSNDg4ICovCisJMHgwMDAwLCAgICAgLyogUjQ4OSAqLworCTB4MDAwMCwgICAgIC8qIFI0OTAgKi8KKwkweDAwMDAsICAgICAvKiBSNDkxICovCisJMHgwMDAwLCAgICAgLyogUjQ5MiAqLworCTB4MDAwMCwgICAgIC8qIFI0OTMgKi8KKwkweDAwMDAsICAgICAvKiBSNDk0ICovCisJMHgwMDAwLCAgICAgLyogUjQ5NSAqLworCTB4MDAwMCwgICAgIC8qIFI0OTYgKi8KKwkweDAwMDAsICAgICAvKiBSNDk3ICovCisJMHgwMDAwLCAgICAgLyogUjQ5OCAqLworCTB4MDAwMCwgICAgIC8qIFI0OTkgKi8KKwkweDAwMDAsICAgICAvKiBSNTAwICovCisJMHgwMDAwLCAgICAgLyogUjUwMSAqLworCTB4MDAwMCwgICAgIC8qIFI1MDIgKi8KKwkweDAwMDAsICAgICAvKiBSNTAzICovCisJMHgwMDAwLCAgICAgLyogUjUwNCAqLworCTB4MDAwMCwgICAgIC8qIFI1MDUgKi8KKwkweDAwMDAsICAgICAvKiBSNTA2ICovCisJMHgwMDAwLCAgICAgLyogUjUwNyAqLworCTB4MDAwMCwgICAgIC8qIFI1MDggKi8KKwkweDAwMDAsICAgICAvKiBSNTA5ICovCisJMHgwMDAwLCAgICAgLyogUjUxMCAqLworCTB4MDAwMCwgICAgIC8qIFI1MTEgKi8KKwkweDAwMDAsICAgICAvKiBSNTEyICAgLSBBSUYxIENsb2NraW5nICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI1MTMgICAtIEFJRjEgQ2xvY2tpbmcgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjUxNCAqLworCTB4MDAwMCwgICAgIC8qIFI1MTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTE2ICAgLSBBSUYyIENsb2NraW5nICgxKSAqLworCTB4MDAwMCwgICAgIC8qIFI1MTcgICAtIEFJRjIgQ2xvY2tpbmcgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjUxOCAqLworCTB4MDAwMCwgICAgIC8qIFI1MTkgKi8KKwkweDAwMDAsICAgICAvKiBSNTIwICAgLSBDbG9ja2luZyAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSNTIxICAgLSBDbG9ja2luZyAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSNTIyICovCisJMHgwMDAwLCAgICAgLyogUjUyMyAqLworCTB4MDAwMCwgICAgIC8qIFI1MjQgKi8KKwkweDAwMDAsICAgICAvKiBSNTI1ICovCisJMHgwMDAwLCAgICAgLyogUjUyNiAqLworCTB4MDAwMCwgICAgIC8qIFI1MjcgKi8KKwkweDAwODMsICAgICAvKiBSNTI4ICAgLSBBSUYxIFJhdGUgKi8KKwkweDAwODMsICAgICAvKiBSNTI5ICAgLSBBSUYyIFJhdGUgKi8KKwkweDAwMDAsICAgICAvKiBSNTMwICAgLSBSYXRlIFN0YXR1cyAqLworCTB4MDAwMCwgICAgIC8qIFI1MzEgKi8KKwkweDAwMDAsICAgICAvKiBSNTMyICovCisJMHgwMDAwLCAgICAgLyogUjUzMyAqLworCTB4MDAwMCwgICAgIC8qIFI1MzQgKi8KKwkweDAwMDAsICAgICAvKiBSNTM1ICovCisJMHgwMDAwLCAgICAgLyogUjUzNiAqLworCTB4MDAwMCwgICAgIC8qIFI1MzcgKi8KKwkweDAwMDAsICAgICAvKiBSNTM4ICovCisJMHgwMDAwLCAgICAgLyogUjUzOSAqLworCTB4MDAwMCwgICAgIC8qIFI1NDAgKi8KKwkweDAwMDAsICAgICAvKiBSNTQxICovCisJMHgwMDAwLCAgICAgLyogUjU0MiAqLworCTB4MDAwMCwgICAgIC8qIFI1NDMgKi8KKwkweDAwMDAsICAgICAvKiBSNTQ0ICAgLSBGTEwxIENvbnRyb2wgKDEpICovCisJMHgwMDAwLCAgICAgLyogUjU0NSAgIC0gRkxMMSBDb250cm9sICgyKSAqLworCTB4MDAwMCwgICAgIC8qIFI1NDYgICAtIEZMTDEgQ29udHJvbCAoMykgKi8KKwkweDAwMDAsICAgICAvKiBSNTQ3ICAgLSBGTEwxIENvbnRyb2wgKDQpICovCisJMHgwQzgwLCAgICAgLyogUjU0OCAgIC0gRkxMMSBDb250cm9sICg1KSAqLworCTB4MDAwMCwgICAgIC8qIFI1NDkgKi8KKwkweDAwMDAsICAgICAvKiBSNTUwICovCisJMHgwMDAwLCAgICAgLyogUjU1MSAqLworCTB4MDAwMCwgICAgIC8qIFI1NTIgKi8KKwkweDAwMDAsICAgICAvKiBSNTUzICovCisJMHgwMDAwLCAgICAgLyogUjU1NCAqLworCTB4MDAwMCwgICAgIC8qIFI1NTUgKi8KKwkweDAwMDAsICAgICAvKiBSNTU2ICovCisJMHgwMDAwLCAgICAgLyogUjU1NyAqLworCTB4MDAwMCwgICAgIC8qIFI1NTggKi8KKwkweDAwMDAsICAgICAvKiBSNTU5ICovCisJMHgwMDAwLCAgICAgLyogUjU2MCAqLworCTB4MDAwMCwgICAgIC8qIFI1NjEgKi8KKwkweDAwMDAsICAgICAvKiBSNTYyICovCisJMHgwMDAwLCAgICAgLyogUjU2MyAqLworCTB4MDAwMCwgICAgIC8qIFI1NjQgKi8KKwkweDAwMDAsICAgICAvKiBSNTY1ICovCisJMHgwMDAwLCAgICAgLyogUjU2NiAqLworCTB4MDAwMCwgICAgIC8qIFI1NjcgKi8KKwkweDAwMDAsICAgICAvKiBSNTY4ICovCisJMHgwMDAwLCAgICAgLyogUjU2OSAqLworCTB4MDAwMCwgICAgIC8qIFI1NzAgKi8KKwkweDAwMDAsICAgICAvKiBSNTcxICovCisJMHgwMDAwLCAgICAgLyogUjU3MiAqLworCTB4MDAwMCwgICAgIC8qIFI1NzMgKi8KKwkweDAwMDAsICAgICAvKiBSNTc0ICovCisJMHgwMDAwLCAgICAgLyogUjU3NSAqLworCTB4MDAwMCwgICAgIC8qIFI1NzYgICAtIEZMTDIgQ29udHJvbCAoMSkgKi8KKwkweDAwMDAsICAgICAvKiBSNTc3ICAgLSBGTEwyIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjU3OCAgIC0gRkxMMiBDb250cm9sICgzKSAqLworCTB4MDAwMCwgICAgIC8qIFI1NzkgICAtIEZMTDIgQ29udHJvbCAoNCkgKi8KKwkweDBDODAsICAgICAvKiBSNTgwICAgLSBGTEwyIENvbnRyb2wgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjU4MSAqLworCTB4MDAwMCwgICAgIC8qIFI1ODIgKi8KKwkweDAwMDAsICAgICAvKiBSNTgzICovCisJMHgwMDAwLCAgICAgLyogUjU4NCAqLworCTB4MDAwMCwgICAgIC8qIFI1ODUgKi8KKwkweDAwMDAsICAgICAvKiBSNTg2ICovCisJMHgwMDAwLCAgICAgLyogUjU4NyAqLworCTB4MDAwMCwgICAgIC8qIFI1ODggKi8KKwkweDAwMDAsICAgICAvKiBSNTg5ICovCisJMHgwMDAwLCAgICAgLyogUjU5MCAqLworCTB4MDAwMCwgICAgIC8qIFI1OTEgKi8KKwkweDAwMDAsICAgICAvKiBSNTkyICovCisJMHgwMDAwLCAgICAgLyogUjU5MyAqLworCTB4MDAwMCwgICAgIC8qIFI1OTQgKi8KKwkweDAwMDAsICAgICAvKiBSNTk1ICovCisJMHgwMDAwLCAgICAgLyogUjU5NiAqLworCTB4MDAwMCwgICAgIC8qIFI1OTcgKi8KKwkweDAwMDAsICAgICAvKiBSNTk4ICovCisJMHgwMDAwLCAgICAgLyogUjU5OSAqLworCTB4MDAwMCwgICAgIC8qIFI2MDAgKi8KKwkweDAwMDAsICAgICAvKiBSNjAxICovCisJMHgwMDAwLCAgICAgLyogUjYwMiAqLworCTB4MDAwMCwgICAgIC8qIFI2MDMgKi8KKwkweDAwMDAsICAgICAvKiBSNjA0ICovCisJMHgwMDAwLCAgICAgLyogUjYwNSAqLworCTB4MDAwMCwgICAgIC8qIFI2MDYgKi8KKwkweDAwMDAsICAgICAvKiBSNjA3ICovCisJMHgwMDAwLCAgICAgLyogUjYwOCAqLworCTB4MDAwMCwgICAgIC8qIFI2MDkgKi8KKwkweDAwMDAsICAgICAvKiBSNjEwICovCisJMHgwMDAwLCAgICAgLyogUjYxMSAqLworCTB4MDAwMCwgICAgIC8qIFI2MTIgKi8KKwkweDAwMDAsICAgICAvKiBSNjEzICovCisJMHgwMDAwLCAgICAgLyogUjYxNCAqLworCTB4MDAwMCwgICAgIC8qIFI2MTUgKi8KKwkweDAwMDAsICAgICAvKiBSNjE2ICovCisJMHgwMDAwLCAgICAgLyogUjYxNyAqLworCTB4MDAwMCwgICAgIC8qIFI2MTggKi8KKwkweDAwMDAsICAgICAvKiBSNjE5ICovCisJMHgwMDAwLCAgICAgLyogUjYyMCAqLworCTB4MDAwMCwgICAgIC8qIFI2MjEgKi8KKwkweDAwMDAsICAgICAvKiBSNjIyICovCisJMHgwMDAwLCAgICAgLyogUjYyMyAqLworCTB4MDAwMCwgICAgIC8qIFI2MjQgKi8KKwkweDAwMDAsICAgICAvKiBSNjI1ICovCisJMHgwMDAwLCAgICAgLyogUjYyNiAqLworCTB4MDAwMCwgICAgIC8qIFI2MjcgKi8KKwkweDAwMDAsICAgICAvKiBSNjI4ICovCisJMHgwMDAwLCAgICAgLyogUjYyOSAqLworCTB4MDAwMCwgICAgIC8qIFI2MzAgKi8KKwkweDAwMDAsICAgICAvKiBSNjMxICovCisJMHgwMDAwLCAgICAgLyogUjYzMiAqLworCTB4MDAwMCwgICAgIC8qIFI2MzMgKi8KKwkweDAwMDAsICAgICAvKiBSNjM0ICovCisJMHgwMDAwLCAgICAgLyogUjYzNSAqLworCTB4MDAwMCwgICAgIC8qIFI2MzYgKi8KKwkweDAwMDAsICAgICAvKiBSNjM3ICovCisJMHgwMDAwLCAgICAgLyogUjYzOCAqLworCTB4MDAwMCwgICAgIC8qIFI2MzkgKi8KKwkweDAwMDAsICAgICAvKiBSNjQwICovCisJMHgwMDAwLCAgICAgLyogUjY0MSAqLworCTB4MDAwMCwgICAgIC8qIFI2NDIgKi8KKwkweDAwMDAsICAgICAvKiBSNjQzICovCisJMHgwMDAwLCAgICAgLyogUjY0NCAqLworCTB4MDAwMCwgICAgIC8qIFI2NDUgKi8KKwkweDAwMDAsICAgICAvKiBSNjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjY0NyAqLworCTB4MDAwMCwgICAgIC8qIFI2NDggKi8KKwkweDAwMDAsICAgICAvKiBSNjQ5ICovCisJMHgwMDAwLCAgICAgLyogUjY1MCAqLworCTB4MDAwMCwgICAgIC8qIFI2NTEgKi8KKwkweDAwMDAsICAgICAvKiBSNjUyICovCisJMHgwMDAwLCAgICAgLyogUjY1MyAqLworCTB4MDAwMCwgICAgIC8qIFI2NTQgKi8KKwkweDAwMDAsICAgICAvKiBSNjU1ICovCisJMHgwMDAwLCAgICAgLyogUjY1NiAqLworCTB4MDAwMCwgICAgIC8qIFI2NTcgKi8KKwkweDAwMDAsICAgICAvKiBSNjU4ICovCisJMHgwMDAwLCAgICAgLyogUjY1OSAqLworCTB4MDAwMCwgICAgIC8qIFI2NjAgKi8KKwkweDAwMDAsICAgICAvKiBSNjYxICovCisJMHgwMDAwLCAgICAgLyogUjY2MiAqLworCTB4MDAwMCwgICAgIC8qIFI2NjMgKi8KKwkweDAwMDAsICAgICAvKiBSNjY0ICovCisJMHgwMDAwLCAgICAgLyogUjY2NSAqLworCTB4MDAwMCwgICAgIC8qIFI2NjYgKi8KKwkweDAwMDAsICAgICAvKiBSNjY3ICovCisJMHgwMDAwLCAgICAgLyogUjY2OCAqLworCTB4MDAwMCwgICAgIC8qIFI2NjkgKi8KKwkweDAwMDAsICAgICAvKiBSNjcwICovCisJMHgwMDAwLCAgICAgLyogUjY3MSAqLworCTB4MDAwMCwgICAgIC8qIFI2NzIgKi8KKwkweDAwMDAsICAgICAvKiBSNjczICovCisJMHgwMDAwLCAgICAgLyogUjY3NCAqLworCTB4MDAwMCwgICAgIC8qIFI2NzUgKi8KKwkweDAwMDAsICAgICAvKiBSNjc2ICovCisJMHgwMDAwLCAgICAgLyogUjY3NyAqLworCTB4MDAwMCwgICAgIC8qIFI2NzggKi8KKwkweDAwMDAsICAgICAvKiBSNjc5ICovCisJMHgwMDAwLCAgICAgLyogUjY4MCAqLworCTB4MDAwMCwgICAgIC8qIFI2ODEgKi8KKwkweDAwMDAsICAgICAvKiBSNjgyICovCisJMHgwMDAwLCAgICAgLyogUjY4MyAqLworCTB4MDAwMCwgICAgIC8qIFI2ODQgKi8KKwkweDAwMDAsICAgICAvKiBSNjg1ICovCisJMHgwMDAwLCAgICAgLyogUjY4NiAqLworCTB4MDAwMCwgICAgIC8qIFI2ODcgKi8KKwkweDAwMDAsICAgICAvKiBSNjg4ICovCisJMHgwMDAwLCAgICAgLyogUjY4OSAqLworCTB4MDAwMCwgICAgIC8qIFI2OTAgKi8KKwkweDAwMDAsICAgICAvKiBSNjkxICovCisJMHgwMDAwLCAgICAgLyogUjY5MiAqLworCTB4MDAwMCwgICAgIC8qIFI2OTMgKi8KKwkweDAwMDAsICAgICAvKiBSNjk0ICovCisJMHgwMDAwLCAgICAgLyogUjY5NSAqLworCTB4MDAwMCwgICAgIC8qIFI2OTYgKi8KKwkweDAwMDAsICAgICAvKiBSNjk3ICovCisJMHgwMDAwLCAgICAgLyogUjY5OCAqLworCTB4MDAwMCwgICAgIC8qIFI2OTkgKi8KKwkweDAwMDAsICAgICAvKiBSNzAwICovCisJMHgwMDAwLCAgICAgLyogUjcwMSAqLworCTB4MDAwMCwgICAgIC8qIFI3MDIgKi8KKwkweDAwMDAsICAgICAvKiBSNzAzICovCisJMHgwMDAwLCAgICAgLyogUjcwNCAqLworCTB4MDAwMCwgICAgIC8qIFI3MDUgKi8KKwkweDAwMDAsICAgICAvKiBSNzA2ICovCisJMHgwMDAwLCAgICAgLyogUjcwNyAqLworCTB4MDAwMCwgICAgIC8qIFI3MDggKi8KKwkweDAwMDAsICAgICAvKiBSNzA5ICovCisJMHgwMDAwLCAgICAgLyogUjcxMCAqLworCTB4MDAwMCwgICAgIC8qIFI3MTEgKi8KKwkweDAwMDAsICAgICAvKiBSNzEyICovCisJMHgwMDAwLCAgICAgLyogUjcxMyAqLworCTB4MDAwMCwgICAgIC8qIFI3MTQgKi8KKwkweDAwMDAsICAgICAvKiBSNzE1ICovCisJMHgwMDAwLCAgICAgLyogUjcxNiAqLworCTB4MDAwMCwgICAgIC8qIFI3MTcgKi8KKwkweDAwMDAsICAgICAvKiBSNzE4ICovCisJMHgwMDAwLCAgICAgLyogUjcxOSAqLworCTB4MDAwMCwgICAgIC8qIFI3MjAgKi8KKwkweDAwMDAsICAgICAvKiBSNzIxICovCisJMHgwMDAwLCAgICAgLyogUjcyMiAqLworCTB4MDAwMCwgICAgIC8qIFI3MjMgKi8KKwkweDAwMDAsICAgICAvKiBSNzI0ICovCisJMHgwMDAwLCAgICAgLyogUjcyNSAqLworCTB4MDAwMCwgICAgIC8qIFI3MjYgKi8KKwkweDAwMDAsICAgICAvKiBSNzI3ICovCisJMHgwMDAwLCAgICAgLyogUjcyOCAqLworCTB4MDAwMCwgICAgIC8qIFI3MjkgKi8KKwkweDAwMDAsICAgICAvKiBSNzMwICovCisJMHgwMDAwLCAgICAgLyogUjczMSAqLworCTB4MDAwMCwgICAgIC8qIFI3MzIgKi8KKwkweDAwMDAsICAgICAvKiBSNzMzICovCisJMHgwMDAwLCAgICAgLyogUjczNCAqLworCTB4MDAwMCwgICAgIC8qIFI3MzUgKi8KKwkweDAwMDAsICAgICAvKiBSNzM2ICovCisJMHgwMDAwLCAgICAgLyogUjczNyAqLworCTB4MDAwMCwgICAgIC8qIFI3MzggKi8KKwkweDAwMDAsICAgICAvKiBSNzM5ICovCisJMHgwMDAwLCAgICAgLyogUjc0MCAqLworCTB4MDAwMCwgICAgIC8qIFI3NDEgKi8KKwkweDAwMDAsICAgICAvKiBSNzQyICovCisJMHgwMDAwLCAgICAgLyogUjc0MyAqLworCTB4MDAwMCwgICAgIC8qIFI3NDQgKi8KKwkweDAwMDAsICAgICAvKiBSNzQ1ICovCisJMHgwMDAwLCAgICAgLyogUjc0NiAqLworCTB4MDAwMCwgICAgIC8qIFI3NDcgKi8KKwkweDAwMDAsICAgICAvKiBSNzQ4ICovCisJMHgwMDAwLCAgICAgLyogUjc0OSAqLworCTB4MDAwMCwgICAgIC8qIFI3NTAgKi8KKwkweDAwMDAsICAgICAvKiBSNzUxICovCisJMHgwMDAwLCAgICAgLyogUjc1MiAqLworCTB4MDAwMCwgICAgIC8qIFI3NTMgKi8KKwkweDAwMDAsICAgICAvKiBSNzU0ICovCisJMHgwMDAwLCAgICAgLyogUjc1NSAqLworCTB4MDAwMCwgICAgIC8qIFI3NTYgKi8KKwkweDAwMDAsICAgICAvKiBSNzU3ICovCisJMHgwMDAwLCAgICAgLyogUjc1OCAqLworCTB4MDAwMCwgICAgIC8qIFI3NTkgKi8KKwkweDAwMDAsICAgICAvKiBSNzYwICovCisJMHgwMDAwLCAgICAgLyogUjc2MSAqLworCTB4MDAwMCwgICAgIC8qIFI3NjIgKi8KKwkweDAwMDAsICAgICAvKiBSNzYzICovCisJMHgwMDAwLCAgICAgLyogUjc2NCAqLworCTB4MDAwMCwgICAgIC8qIFI3NjUgKi8KKwkweDAwMDAsICAgICAvKiBSNzY2ICovCisJMHgwMDAwLCAgICAgLyogUjc2NyAqLworCTB4NDA1MCwgICAgIC8qIFI3NjggICAtIEFJRjEgQ29udHJvbCAoMSkgKi8KKwkweDQwMDAsICAgICAvKiBSNzY5ICAgLSBBSUYxIENvbnRyb2wgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjc3MCAgIC0gQUlGMSBNYXN0ZXIvU2xhdmUgKi8KKwkweDAwNDAsICAgICAvKiBSNzcxICAgLSBBSUYxIEJDTEsgKi8KKwkweDAwNDAsICAgICAvKiBSNzcyICAgLSBBSUYxQURDIExSQ0xLICovCisJMHgwMDQwLCAgICAgLyogUjc3MyAgIC0gQUlGMURBQyBMUkNMSyAqLworCTB4MDAwNCwgICAgIC8qIFI3NzQgICAtIEFJRjFEQUMgRGF0YSAqLworCTB4MDEwMCwgICAgIC8qIFI3NzUgICAtIEFJRjFBREMgRGF0YSAqLworCTB4MDAwMCwgICAgIC8qIFI3NzYgKi8KKwkweDAwMDAsICAgICAvKiBSNzc3ICovCisJMHgwMDAwLCAgICAgLyogUjc3OCAqLworCTB4MDAwMCwgICAgIC8qIFI3NzkgKi8KKwkweDAwMDAsICAgICAvKiBSNzgwICovCisJMHgwMDAwLCAgICAgLyogUjc4MSAqLworCTB4MDAwMCwgICAgIC8qIFI3ODIgKi8KKwkweDAwMDAsICAgICAvKiBSNzgzICovCisJMHg0MDUwLCAgICAgLyogUjc4NCAgIC0gQUlGMiBDb250cm9sICgxKSAqLworCTB4NDAwMCwgICAgIC8qIFI3ODUgICAtIEFJRjIgQ29udHJvbCAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSNzg2ICAgLSBBSUYyIE1hc3Rlci9TbGF2ZSAqLworCTB4MDA0MCwgICAgIC8qIFI3ODcgICAtIEFJRjIgQkNMSyAqLworCTB4MDA0MCwgICAgIC8qIFI3ODggICAtIEFJRjJBREMgTFJDTEsgKi8KKwkweDAwNDAsICAgICAvKiBSNzg5ICAgLSBBSUYyREFDIExSQ0xLICovCisJMHgwMDAwLCAgICAgLyogUjc5MCAgIC0gQUlGMkRBQyBEYXRhICovCisJMHgwMDAwLCAgICAgLyogUjc5MSAgIC0gQUlGMkFEQyBEYXRhICovCisJMHgwMDAwLCAgICAgLyogUjc5MiAqLworCTB4MDAwMCwgICAgIC8qIFI3OTMgKi8KKwkweDAwMDAsICAgICAvKiBSNzk0ICovCisJMHgwMDAwLCAgICAgLyogUjc5NSAqLworCTB4MDAwMCwgICAgIC8qIFI3OTYgKi8KKwkweDAwMDAsICAgICAvKiBSNzk3ICovCisJMHgwMDAwLCAgICAgLyogUjc5OCAqLworCTB4MDAwMCwgICAgIC8qIFI3OTkgKi8KKwkweDAwMDAsICAgICAvKiBSODAwICovCisJMHgwMDAwLCAgICAgLyogUjgwMSAqLworCTB4MDAwMCwgICAgIC8qIFI4MDIgKi8KKwkweDAwMDAsICAgICAvKiBSODAzICovCisJMHgwMDAwLCAgICAgLyogUjgwNCAqLworCTB4MDAwMCwgICAgIC8qIFI4MDUgKi8KKwkweDAwMDAsICAgICAvKiBSODA2ICovCisJMHgwMDAwLCAgICAgLyogUjgwNyAqLworCTB4MDAwMCwgICAgIC8qIFI4MDggKi8KKwkweDAwMDAsICAgICAvKiBSODA5ICovCisJMHgwMDAwLCAgICAgLyogUjgxMCAqLworCTB4MDAwMCwgICAgIC8qIFI4MTEgKi8KKwkweDAwMDAsICAgICAvKiBSODEyICovCisJMHgwMDAwLCAgICAgLyogUjgxMyAqLworCTB4MDAwMCwgICAgIC8qIFI4MTQgKi8KKwkweDAwMDAsICAgICAvKiBSODE1ICovCisJMHgwMDAwLCAgICAgLyogUjgxNiAqLworCTB4MDAwMCwgICAgIC8qIFI4MTcgKi8KKwkweDAwMDAsICAgICAvKiBSODE4ICovCisJMHgwMDAwLCAgICAgLyogUjgxOSAqLworCTB4MDAwMCwgICAgIC8qIFI4MjAgKi8KKwkweDAwMDAsICAgICAvKiBSODIxICovCisJMHgwMDAwLCAgICAgLyogUjgyMiAqLworCTB4MDAwMCwgICAgIC8qIFI4MjMgKi8KKwkweDAwMDAsICAgICAvKiBSODI0ICovCisJMHgwMDAwLCAgICAgLyogUjgyNSAqLworCTB4MDAwMCwgICAgIC8qIFI4MjYgKi8KKwkweDAwMDAsICAgICAvKiBSODI3ICovCisJMHgwMDAwLCAgICAgLyogUjgyOCAqLworCTB4MDAwMCwgICAgIC8qIFI4MjkgKi8KKwkweDAwMDAsICAgICAvKiBSODMwICovCisJMHgwMDAwLCAgICAgLyogUjgzMSAqLworCTB4MDAwMCwgICAgIC8qIFI4MzIgKi8KKwkweDAwMDAsICAgICAvKiBSODMzICovCisJMHgwMDAwLCAgICAgLyogUjgzNCAqLworCTB4MDAwMCwgICAgIC8qIFI4MzUgKi8KKwkweDAwMDAsICAgICAvKiBSODM2ICovCisJMHgwMDAwLCAgICAgLyogUjgzNyAqLworCTB4MDAwMCwgICAgIC8qIFI4MzggKi8KKwkweDAwMDAsICAgICAvKiBSODM5ICovCisJMHgwMDAwLCAgICAgLyogUjg0MCAqLworCTB4MDAwMCwgICAgIC8qIFI4NDEgKi8KKwkweDAwMDAsICAgICAvKiBSODQyICovCisJMHgwMDAwLCAgICAgLyogUjg0MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NDQgKi8KKwkweDAwMDAsICAgICAvKiBSODQ1ICovCisJMHgwMDAwLCAgICAgLyogUjg0NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NDcgKi8KKwkweDAwMDAsICAgICAvKiBSODQ4ICovCisJMHgwMDAwLCAgICAgLyogUjg0OSAqLworCTB4MDAwMCwgICAgIC8qIFI4NTAgKi8KKwkweDAwMDAsICAgICAvKiBSODUxICovCisJMHgwMDAwLCAgICAgLyogUjg1MiAqLworCTB4MDAwMCwgICAgIC8qIFI4NTMgKi8KKwkweDAwMDAsICAgICAvKiBSODU0ICovCisJMHgwMDAwLCAgICAgLyogUjg1NSAqLworCTB4MDAwMCwgICAgIC8qIFI4NTYgKi8KKwkweDAwMDAsICAgICAvKiBSODU3ICovCisJMHgwMDAwLCAgICAgLyogUjg1OCAqLworCTB4MDAwMCwgICAgIC8qIFI4NTkgKi8KKwkweDAwMDAsICAgICAvKiBSODYwICovCisJMHgwMDAwLCAgICAgLyogUjg2MSAqLworCTB4MDAwMCwgICAgIC8qIFI4NjIgKi8KKwkweDAwMDAsICAgICAvKiBSODYzICovCisJMHgwMDAwLCAgICAgLyogUjg2NCAqLworCTB4MDAwMCwgICAgIC8qIFI4NjUgKi8KKwkweDAwMDAsICAgICAvKiBSODY2ICovCisJMHgwMDAwLCAgICAgLyogUjg2NyAqLworCTB4MDAwMCwgICAgIC8qIFI4NjggKi8KKwkweDAwMDAsICAgICAvKiBSODY5ICovCisJMHgwMDAwLCAgICAgLyogUjg3MCAqLworCTB4MDAwMCwgICAgIC8qIFI4NzEgKi8KKwkweDAwMDAsICAgICAvKiBSODcyICovCisJMHgwMDAwLCAgICAgLyogUjg3MyAqLworCTB4MDAwMCwgICAgIC8qIFI4NzQgKi8KKwkweDAwMDAsICAgICAvKiBSODc1ICovCisJMHgwMDAwLCAgICAgLyogUjg3NiAqLworCTB4MDAwMCwgICAgIC8qIFI4NzcgKi8KKwkweDAwMDAsICAgICAvKiBSODc4ICovCisJMHgwMDAwLCAgICAgLyogUjg3OSAqLworCTB4MDAwMCwgICAgIC8qIFI4ODAgKi8KKwkweDAwMDAsICAgICAvKiBSODgxICovCisJMHgwMDAwLCAgICAgLyogUjg4MiAqLworCTB4MDAwMCwgICAgIC8qIFI4ODMgKi8KKwkweDAwMDAsICAgICAvKiBSODg0ICovCisJMHgwMDAwLCAgICAgLyogUjg4NSAqLworCTB4MDAwMCwgICAgIC8qIFI4ODYgKi8KKwkweDAwMDAsICAgICAvKiBSODg3ICovCisJMHgwMDAwLCAgICAgLyogUjg4OCAqLworCTB4MDAwMCwgICAgIC8qIFI4ODkgKi8KKwkweDAwMDAsICAgICAvKiBSODkwICovCisJMHgwMDAwLCAgICAgLyogUjg5MSAqLworCTB4MDAwMCwgICAgIC8qIFI4OTIgKi8KKwkweDAwMDAsICAgICAvKiBSODkzICovCisJMHgwMDAwLCAgICAgLyogUjg5NCAqLworCTB4MDAwMCwgICAgIC8qIFI4OTUgKi8KKwkweDAwMDAsICAgICAvKiBSODk2ICovCisJMHgwMDAwLCAgICAgLyogUjg5NyAqLworCTB4MDAwMCwgICAgIC8qIFI4OTggKi8KKwkweDAwMDAsICAgICAvKiBSODk5ICovCisJMHgwMDAwLCAgICAgLyogUjkwMCAqLworCTB4MDAwMCwgICAgIC8qIFI5MDEgKi8KKwkweDAwMDAsICAgICAvKiBSOTAyICovCisJMHgwMDAwLCAgICAgLyogUjkwMyAqLworCTB4MDAwMCwgICAgIC8qIFI5MDQgKi8KKwkweDAwMDAsICAgICAvKiBSOTA1ICovCisJMHgwMDAwLCAgICAgLyogUjkwNiAqLworCTB4MDAwMCwgICAgIC8qIFI5MDcgKi8KKwkweDAwMDAsICAgICAvKiBSOTA4ICovCisJMHgwMDAwLCAgICAgLyogUjkwOSAqLworCTB4MDAwMCwgICAgIC8qIFI5MTAgKi8KKwkweDAwMDAsICAgICAvKiBSOTExICovCisJMHgwMDAwLCAgICAgLyogUjkxMiAqLworCTB4MDAwMCwgICAgIC8qIFI5MTMgKi8KKwkweDAwMDAsICAgICAvKiBSOTE0ICovCisJMHgwMDAwLCAgICAgLyogUjkxNSAqLworCTB4MDAwMCwgICAgIC8qIFI5MTYgKi8KKwkweDAwMDAsICAgICAvKiBSOTE3ICovCisJMHgwMDAwLCAgICAgLyogUjkxOCAqLworCTB4MDAwMCwgICAgIC8qIFI5MTkgKi8KKwkweDAwMDAsICAgICAvKiBSOTIwICovCisJMHgwMDAwLCAgICAgLyogUjkyMSAqLworCTB4MDAwMCwgICAgIC8qIFI5MjIgKi8KKwkweDAwMDAsICAgICAvKiBSOTIzICovCisJMHgwMDAwLCAgICAgLyogUjkyNCAqLworCTB4MDAwMCwgICAgIC8qIFI5MjUgKi8KKwkweDAwMDAsICAgICAvKiBSOTI2ICovCisJMHgwMDAwLCAgICAgLyogUjkyNyAqLworCTB4MDAwMCwgICAgIC8qIFI5MjggKi8KKwkweDAwMDAsICAgICAvKiBSOTI5ICovCisJMHgwMDAwLCAgICAgLyogUjkzMCAqLworCTB4MDAwMCwgICAgIC8qIFI5MzEgKi8KKwkweDAwMDAsICAgICAvKiBSOTMyICovCisJMHgwMDAwLCAgICAgLyogUjkzMyAqLworCTB4MDAwMCwgICAgIC8qIFI5MzQgKi8KKwkweDAwMDAsICAgICAvKiBSOTM1ICovCisJMHgwMDAwLCAgICAgLyogUjkzNiAqLworCTB4MDAwMCwgICAgIC8qIFI5MzcgKi8KKwkweDAwMDAsICAgICAvKiBSOTM4ICovCisJMHgwMDAwLCAgICAgLyogUjkzOSAqLworCTB4MDAwMCwgICAgIC8qIFI5NDAgKi8KKwkweDAwMDAsICAgICAvKiBSOTQxICovCisJMHgwMDAwLCAgICAgLyogUjk0MiAqLworCTB4MDAwMCwgICAgIC8qIFI5NDMgKi8KKwkweDAwMDAsICAgICAvKiBSOTQ0ICovCisJMHgwMDAwLCAgICAgLyogUjk0NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NDYgKi8KKwkweDAwMDAsICAgICAvKiBSOTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjk0OCAqLworCTB4MDAwMCwgICAgIC8qIFI5NDkgKi8KKwkweDAwMDAsICAgICAvKiBSOTUwICovCisJMHgwMDAwLCAgICAgLyogUjk1MSAqLworCTB4MDAwMCwgICAgIC8qIFI5NTIgKi8KKwkweDAwMDAsICAgICAvKiBSOTUzICovCisJMHgwMDAwLCAgICAgLyogUjk1NCAqLworCTB4MDAwMCwgICAgIC8qIFI5NTUgKi8KKwkweDAwMDAsICAgICAvKiBSOTU2ICovCisJMHgwMDAwLCAgICAgLyogUjk1NyAqLworCTB4MDAwMCwgICAgIC8qIFI5NTggKi8KKwkweDAwMDAsICAgICAvKiBSOTU5ICovCisJMHgwMDAwLCAgICAgLyogUjk2MCAqLworCTB4MDAwMCwgICAgIC8qIFI5NjEgKi8KKwkweDAwMDAsICAgICAvKiBSOTYyICovCisJMHgwMDAwLCAgICAgLyogUjk2MyAqLworCTB4MDAwMCwgICAgIC8qIFI5NjQgKi8KKwkweDAwMDAsICAgICAvKiBSOTY1ICovCisJMHgwMDAwLCAgICAgLyogUjk2NiAqLworCTB4MDAwMCwgICAgIC8qIFI5NjcgKi8KKwkweDAwMDAsICAgICAvKiBSOTY4ICovCisJMHgwMDAwLCAgICAgLyogUjk2OSAqLworCTB4MDAwMCwgICAgIC8qIFI5NzAgKi8KKwkweDAwMDAsICAgICAvKiBSOTcxICovCisJMHgwMDAwLCAgICAgLyogUjk3MiAqLworCTB4MDAwMCwgICAgIC8qIFI5NzMgKi8KKwkweDAwMDAsICAgICAvKiBSOTc0ICovCisJMHgwMDAwLCAgICAgLyogUjk3NSAqLworCTB4MDAwMCwgICAgIC8qIFI5NzYgKi8KKwkweDAwMDAsICAgICAvKiBSOTc3ICovCisJMHgwMDAwLCAgICAgLyogUjk3OCAqLworCTB4MDAwMCwgICAgIC8qIFI5NzkgKi8KKwkweDAwMDAsICAgICAvKiBSOTgwICovCisJMHgwMDAwLCAgICAgLyogUjk4MSAqLworCTB4MDAwMCwgICAgIC8qIFI5ODIgKi8KKwkweDAwMDAsICAgICAvKiBSOTgzICovCisJMHgwMDAwLCAgICAgLyogUjk4NCAqLworCTB4MDAwMCwgICAgIC8qIFI5ODUgKi8KKwkweDAwMDAsICAgICAvKiBSOTg2ICovCisJMHgwMDAwLCAgICAgLyogUjk4NyAqLworCTB4MDAwMCwgICAgIC8qIFI5ODggKi8KKwkweDAwMDAsICAgICAvKiBSOTg5ICovCisJMHgwMDAwLCAgICAgLyogUjk5MCAqLworCTB4MDAwMCwgICAgIC8qIFI5OTEgKi8KKwkweDAwMDAsICAgICAvKiBSOTkyICovCisJMHgwMDAwLCAgICAgLyogUjk5MyAqLworCTB4MDAwMCwgICAgIC8qIFI5OTQgKi8KKwkweDAwMDAsICAgICAvKiBSOTk1ICovCisJMHgwMDAwLCAgICAgLyogUjk5NiAqLworCTB4MDAwMCwgICAgIC8qIFI5OTcgKi8KKwkweDAwMDAsICAgICAvKiBSOTk4ICovCisJMHgwMDAwLCAgICAgLyogUjk5OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAwICovCisJMHgwMDAwLCAgICAgLyogUjEwMDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDAzICovCisJMHgwMDAwLCAgICAgLyogUjEwMDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDA2ICovCisJMHgwMDAwLCAgICAgLyogUjEwMDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTAwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDA5ICovCisJMHgwMDAwLCAgICAgLyogUjEwMTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDEyICovCisJMHgwMDAwLCAgICAgLyogUjEwMTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDE1ICovCisJMHgwMDAwLCAgICAgLyogUjEwMTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTAxNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDE4ICovCisJMHgwMDAwLCAgICAgLyogUjEwMTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDIxICovCisJMHgwMDAwLCAgICAgLyogUjEwMjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTAyMyAqLworCTB4MDBDMCwgICAgIC8qIFIxMDI0ICAtIEFJRjEgQURDMSBMZWZ0IFZvbHVtZSAqLworCTB4MDBDMCwgICAgIC8qIFIxMDI1ICAtIEFJRjEgQURDMSBSaWdodCBWb2x1bWUgKi8KKwkweDAwQzAsICAgICAvKiBSMTAyNiAgLSBBSUYxIERBQzEgTGVmdCBWb2x1bWUgKi8KKwkweDAwQzAsICAgICAvKiBSMTAyNyAgLSBBSUYxIERBQzEgUmlnaHQgVm9sdW1lICovCisJMHgwMEMwLCAgICAgLyogUjEwMjggIC0gQUlGMSBBREMyIExlZnQgVm9sdW1lICovCisJMHgwMEMwLCAgICAgLyogUjEwMjkgIC0gQUlGMSBBREMyIFJpZ2h0IFZvbHVtZSAqLworCTB4MDBDMCwgICAgIC8qIFIxMDMwICAtIEFJRjEgREFDMiBMZWZ0IFZvbHVtZSAqLworCTB4MDBDMCwgICAgIC8qIFIxMDMxICAtIEFJRjEgREFDMiBSaWdodCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDMzICovCisJMHgwMDAwLCAgICAgLyogUjEwMzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDM2ICovCisJMHgwMDAwLCAgICAgLyogUjEwMzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTAzOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDM5ICovCisJMHgwMDAwLCAgICAgLyogUjEwNDAgIC0gQUlGMSBBREMxIEZpbHRlcnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTA0MSAgLSBBSUYxIEFEQzIgRmlsdGVycyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDQyICovCisJMHgwMDAwLCAgICAgLyogUjEwNDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTA0NCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDQ1ICovCisJMHgwMDAwLCAgICAgLyogUjEwNDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTA0NyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDQ4ICovCisJMHgwMDAwLCAgICAgLyogUjEwNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTA1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDUxICovCisJMHgwMDAwLCAgICAgLyogUjEwNTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTA1MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDU0ICovCisJMHgwMDAwLCAgICAgLyogUjEwNTUgKi8KKwkweDAyMDAsICAgICAvKiBSMTA1NiAgLSBBSUYxIERBQzEgRmlsdGVycyAoMSkgKi8KKwkweDAwMTAsICAgICAvKiBSMTA1NyAgLSBBSUYxIERBQzEgRmlsdGVycyAoMikgKi8KKwkweDAyMDAsICAgICAvKiBSMTA1OCAgLSBBSUYxIERBQzIgRmlsdGVycyAoMSkgKi8KKwkweDAwMTAsICAgICAvKiBSMTA1OSAgLSBBSUYxIERBQzIgRmlsdGVycyAoMikgKi8KKwkweDAwMDAsICAgICAvKiBSMTA2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDYxICovCisJMHgwMDAwLCAgICAgLyogUjEwNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTA2MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDY0ICovCisJMHgwMDAwLCAgICAgLyogUjEwNjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTA2NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDY3ICovCisJMHgwMDAwLCAgICAgLyogUjEwNjggKi8KKwkweDAwMDAsICAgICAvKiBSMTA2OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDcwICovCisJMHgwMDAwLCAgICAgLyogUjEwNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTA3MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMDczICovCisJMHgwMDAwLCAgICAgLyogUjEwNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTA3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDc2ICovCisJMHgwMDAwLCAgICAgLyogUjEwNzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTA3OCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDc5ICovCisJMHgwMDAwLCAgICAgLyogUjEwODAgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4MSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDgyICovCisJMHgwMDAwLCAgICAgLyogUjEwODMgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4NCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDg1ICovCisJMHgwMDAwLCAgICAgLyogUjEwODYgKi8KKwkweDAwMDAsICAgICAvKiBSMTA4NyAqLworCTB4MDA5OCwgICAgIC8qIFIxMDg4ICAtIEFJRjEgRFJDMSAoMSkgKi8KKwkweDA4NDUsICAgICAvKiBSMTA4OSAgLSBBSUYxIERSQzEgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEwOTAgIC0gQUlGMSBEUkMxICgzKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMDkxICAtIEFJRjEgRFJDMSAoNCkgKi8KKwkweDAwMDAsICAgICAvKiBSMTA5MiAgLSBBSUYxIERSQzEgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEwOTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTA5NCAqLworCTB4MDAwMCwgICAgIC8qIFIxMDk1ICovCisJMHgwMDAwLCAgICAgLyogUjEwOTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTA5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxMDk4ICovCisJMHgwMDAwLCAgICAgLyogUjEwOTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTAxICovCisJMHgwMDAwLCAgICAgLyogUjExMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwMyAqLworCTB4MDA5OCwgICAgIC8qIFIxMTA0ICAtIEFJRjEgRFJDMiAoMSkgKi8KKwkweDA4NDUsICAgICAvKiBSMTEwNSAgLSBBSUYxIERSQzIgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjExMDYgIC0gQUlGMSBEUkMyICgzKSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTA3ICAtIEFJRjEgRFJDMiAoNCkgKi8KKwkweDAwMDAsICAgICAvKiBSMTEwOCAgLSBBSUYxIERSQzIgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjExMDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTExMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTExICovCisJMHgwMDAwLCAgICAgLyogUjExMTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTExMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTE0ICovCisJMHgwMDAwLCAgICAgLyogUjExMTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTExNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTE3ICovCisJMHgwMDAwLCAgICAgLyogUjExMTggKi8KKwkweDAwMDAsICAgICAvKiBSMTExOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTIwICovCisJMHgwMDAwLCAgICAgLyogUjExMjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTEyMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTIzICovCisJMHgwMDAwLCAgICAgLyogUjExMjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTEyNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTI2ICovCisJMHgwMDAwLCAgICAgLyogUjExMjcgKi8KKwkweDAwMDAsICAgICAvKiBSMTEyOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTI5ICovCisJMHgwMDAwLCAgICAgLyogUjExMzAgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTMyICovCisJMHgwMDAwLCAgICAgLyogUjExMzMgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTM1ICovCisJMHgwMDAwLCAgICAgLyogUjExMzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTEzNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTM4ICovCisJMHgwMDAwLCAgICAgLyogUjExMzkgKi8KKwkweDAwMDAsICAgICAvKiBSMTE0MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMTQxICovCisJMHgwMDAwLCAgICAgLyogUjExNDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTE0MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTQ0ICovCisJMHgwMDAwLCAgICAgLyogUjExNDUgKi8KKwkweDAwMDAsICAgICAvKiBSMTE0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjExNDggKi8KKwkweDAwMDAsICAgICAvKiBSMTE0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTUwICovCisJMHgwMDAwLCAgICAgLyogUjExNTEgKi8KKwkweDYzMTgsICAgICAvKiBSMTE1MiAgLSBBSUYxIERBQzEgRVEgR2FpbnMgKDEpICovCisJMHg2MzAwLCAgICAgLyogUjExNTMgIC0gQUlGMSBEQUMxIEVRIEdhaW5zICgyKSAqLworCTB4MEZDQSwgICAgIC8qIFIxMTU0ICAtIEFJRjEgREFDMSBFUSBCYW5kIDEgQSAqLworCTB4MDQwMCwgICAgIC8qIFIxMTU1ICAtIEFJRjEgREFDMSBFUSBCYW5kIDEgQiAqLworCTB4MDBEOCwgICAgIC8qIFIxMTU2ICAtIEFJRjEgREFDMSBFUSBCYW5kIDEgUEcgKi8KKwkweDFFQjUsICAgICAvKiBSMTE1NyAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEEgKi8KKwkweEYxNDUsICAgICAvKiBSMTE1OCAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEIgKi8KKwkweDBCNzUsICAgICAvKiBSMTE1OSAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEMgKi8KKwkweDAxQzUsICAgICAvKiBSMTE2MCAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIFBHICovCisJMHgxQzU4LCAgICAgLyogUjExNjEgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBBICovCisJMHhGMzczLCAgICAgLyogUjExNjIgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBCICovCisJMHgwQTU0LCAgICAgLyogUjExNjMgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBDICovCisJMHgwNTU4LCAgICAgLyogUjExNjQgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBQRyAqLworCTB4MTY4RSwgICAgIC8qIFIxMTY1ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQSAqLworCTB4RjgyOSwgICAgIC8qIFIxMTY2ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQiAqLworCTB4MDdBRCwgICAgIC8qIFIxMTY3ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQyAqLworCTB4MTEwMywgICAgIC8qIFIxMTY4ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgUEcgKi8KKwkweDA1NjQsICAgICAvKiBSMTE2OSAgLSBBSUYxIERBQzEgRVEgQmFuZCA1IEEgKi8KKwkweDA1NTksICAgICAvKiBSMTE3MCAgLSBBSUYxIERBQzEgRVEgQmFuZCA1IEIgKi8KKwkweDQwMDAsICAgICAvKiBSMTE3MSAgLSBBSUYxIERBQzEgRVEgQmFuZCA1IFBHICovCisJMHgwMDAwLCAgICAgLyogUjExNzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMTc0ICovCisJMHgwMDAwLCAgICAgLyogUjExNzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTE3NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTc3ICovCisJMHgwMDAwLCAgICAgLyogUjExNzggKi8KKwkweDAwMDAsICAgICAvKiBSMTE3OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMTgwICovCisJMHgwMDAwLCAgICAgLyogUjExODEgKi8KKwkweDAwMDAsICAgICAvKiBSMTE4MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMTgzICovCisJMHg2MzE4LCAgICAgLyogUjExODQgIC0gQUlGMSBEQUMyIEVRIEdhaW5zICgxKSAqLworCTB4NjMwMCwgICAgIC8qIFIxMTg1ICAtIEFJRjEgREFDMiBFUSBHYWlucyAoMikgKi8KKwkweDBGQ0EsICAgICAvKiBSMTE4NiAgLSBBSUYxIERBQzIgRVEgQmFuZCAxIEEgKi8KKwkweDA0MDAsICAgICAvKiBSMTE4NyAgLSBBSUYxIERBQzIgRVEgQmFuZCAxIEIgKi8KKwkweDAwRDgsICAgICAvKiBSMTE4OCAgLSBBSUYxIERBQzIgRVEgQmFuZCAxIFBHICovCisJMHgxRUI1LCAgICAgLyogUjExODkgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBBICovCisJMHhGMTQ1LCAgICAgLyogUjExOTAgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBCICovCisJMHgwQjc1LCAgICAgLyogUjExOTEgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBDICovCisJMHgwMUM1LCAgICAgLyogUjExOTIgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBQRyAqLworCTB4MUM1OCwgICAgIC8qIFIxMTkzICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQSAqLworCTB4RjM3MywgICAgIC8qIFIxMTk0ICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQiAqLworCTB4MEE1NCwgICAgIC8qIFIxMTk1ICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQyAqLworCTB4MDU1OCwgICAgIC8qIFIxMTk2ICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgUEcgKi8KKwkweDE2OEUsICAgICAvKiBSMTE5NyAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEEgKi8KKwkweEY4MjksICAgICAvKiBSMTE5OCAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEIgKi8KKwkweDA3QUQsICAgICAvKiBSMTE5OSAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEMgKi8KKwkweDExMDMsICAgICAvKiBSMTIwMCAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IFBHICovCisJMHgwNTY0LCAgICAgLyogUjEyMDEgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBBICovCisJMHgwNTU5LCAgICAgLyogUjEyMDIgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBCICovCisJMHg0MDAwLCAgICAgLyogUjEyMDMgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBQRyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjA0ICovCisJMHgwMDAwLCAgICAgLyogUjEyMDUgKi8KKwkweDAwMDAsICAgICAvKiBSMTIwNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjA3ICovCisJMHgwMDAwLCAgICAgLyogUjEyMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTIwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEwICovCisJMHgwMDAwLCAgICAgLyogUjEyMTEgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxMiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjEzICovCisJMHgwMDAwLCAgICAgLyogUjEyMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjE2ICovCisJMHgwMDAwLCAgICAgLyogUjEyMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTIxOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjE5ICovCisJMHgwMDAwLCAgICAgLyogUjEyMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjIyICovCisJMHgwMDAwLCAgICAgLyogUjEyMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjI1ICovCisJMHgwMDAwLCAgICAgLyogUjEyMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTIyNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjI4ICovCisJMHgwMDAwLCAgICAgLyogUjEyMjkgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjMxICovCisJMHgwMDAwLCAgICAgLyogUjEyMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjM0ICovCisJMHgwMDAwLCAgICAgLyogUjEyMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTIzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjM3ICovCisJMHgwMDAwLCAgICAgLyogUjEyMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTIzOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQwICovCisJMHgwMDAwLCAgICAgLyogUjEyNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQzICovCisJMHgwMDAwLCAgICAgLyogUjEyNDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQ2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTI0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjQ5ICovCisJMHgwMDAwLCAgICAgLyogUjEyNTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1MSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjUyICovCisJMHgwMDAwLCAgICAgLyogUjEyNTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1NCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjU1ICovCisJMHgwMDAwLCAgICAgLyogUjEyNTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTI1NyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjU4ICovCisJMHgwMDAwLCAgICAgLyogUjEyNTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjYxICovCisJMHgwMDAwLCAgICAgLyogUjEyNjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjY0ICovCisJMHgwMDAwLCAgICAgLyogUjEyNjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI2NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjY3ICovCisJMHgwMDAwLCAgICAgLyogUjEyNjggKi8KKwkweDAwMDAsICAgICAvKiBSMTI2OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjcwICovCisJMHgwMDAwLCAgICAgLyogUjEyNzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjczICovCisJMHgwMDAwLCAgICAgLyogUjEyNzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjc2ICovCisJMHgwMDAwLCAgICAgLyogUjEyNzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTI3OCAqLworCTB4MDAwMCwgICAgIC8qIFIxMjc5ICovCisJMHgwMEMwLCAgICAgLyogUjEyODAgIC0gQUlGMiBBREMgTGVmdCBWb2x1bWUgKi8KKwkweDAwQzAsICAgICAvKiBSMTI4MSAgLSBBSUYyIEFEQyBSaWdodCBWb2x1bWUgKi8KKwkweDAwQzAsICAgICAvKiBSMTI4MiAgLSBBSUYyIERBQyBMZWZ0IFZvbHVtZSAqLworCTB4MDBDMCwgICAgIC8qIFIxMjgzICAtIEFJRjIgREFDIFJpZ2h0IFZvbHVtZSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjg0ICovCisJMHgwMDAwLCAgICAgLyogUjEyODUgKi8KKwkweDAwMDAsICAgICAvKiBSMTI4NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjg3ICovCisJMHgwMDAwLCAgICAgLyogUjEyODggKi8KKwkweDAwMDAsICAgICAvKiBSMTI4OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkwICovCisJMHgwMDAwLCAgICAgLyogUjEyOTEgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMjkzICovCisJMHgwMDAwLCAgICAgLyogUjEyOTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMjk2ICAtIEFJRjIgQURDIEZpbHRlcnMgKi8KKwkweDAwMDAsICAgICAvKiBSMTI5NyAqLworCTB4MDAwMCwgICAgIC8qIFIxMjk4ICovCisJMHgwMDAwLCAgICAgLyogUjEyOTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzAxICovCisJMHgwMDAwLCAgICAgLyogUjEzMDIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzA0ICovCisJMHgwMDAwLCAgICAgLyogUjEzMDUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMwNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzA3ICovCisJMHgwMDAwLCAgICAgLyogUjEzMDggKi8KKwkweDAwMDAsICAgICAvKiBSMTMwOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzEwICovCisJMHgwMDAwLCAgICAgLyogUjEzMTEgKi8KKwkweDAyMDAsICAgICAvKiBSMTMxMiAgLSBBSUYyIERBQyBGaWx0ZXJzICgxKSAqLworCTB4MDAxMCwgICAgIC8qIFIxMzEzICAtIEFJRjIgREFDIEZpbHRlcnMgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEzMTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxNSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzE2ICovCisJMHgwMDAwLCAgICAgLyogUjEzMTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTMxOCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzE5ICovCisJMHgwMDAwLCAgICAgLyogUjEzMjAgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyMSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzIyICovCisJMHgwMDAwLCAgICAgLyogUjEzMjMgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyNCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzI1ICovCisJMHgwMDAwLCAgICAgLyogUjEzMjYgKi8KKwkweDAwMDAsICAgICAvKiBSMTMyNyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzI4ICovCisJMHgwMDAwLCAgICAgLyogUjEzMjkgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzMCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzMxICovCisJMHgwMDAwLCAgICAgLyogUjEzMzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzMyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzM0ICovCisJMHgwMDAwLCAgICAgLyogUjEzMzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTMzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzM3ICovCisJMHgwMDAwLCAgICAgLyogUjEzMzggKi8KKwkweDAwMDAsICAgICAvKiBSMTMzOSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzQwICovCisJMHgwMDAwLCAgICAgLyogUjEzNDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTM0MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzQzICovCisJMHgwMDk4LCAgICAgLyogUjEzNDQgIC0gQUlGMiBEUkMgKDEpICovCisJMHgwODQ1LCAgICAgLyogUjEzNDUgIC0gQUlGMiBEUkMgKDIpICovCisJMHgwMDAwLCAgICAgLyogUjEzNDYgIC0gQUlGMiBEUkMgKDMpICovCisJMHgwMDAwLCAgICAgLyogUjEzNDcgIC0gQUlGMiBEUkMgKDQpICovCisJMHgwMDAwLCAgICAgLyogUjEzNDggIC0gQUlGMiBEUkMgKDUpICovCisJMHgwMDAwLCAgICAgLyogUjEzNDkgKi8KKwkweDAwMDAsICAgICAvKiBSMTM1MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzUxICovCisJMHgwMDAwLCAgICAgLyogUjEzNTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTM1MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzU0ICovCisJMHgwMDAwLCAgICAgLyogUjEzNTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM1NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzU3ICovCisJMHgwMDAwLCAgICAgLyogUjEzNTggKi8KKwkweDAwMDAsICAgICAvKiBSMTM1OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYwICovCisJMHgwMDAwLCAgICAgLyogUjEzNjEgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzYzICovCisJMHgwMDAwLCAgICAgLyogUjEzNjQgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzY2ICovCisJMHgwMDAwLCAgICAgLyogUjEzNjcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM2OCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzY5ICovCisJMHgwMDAwLCAgICAgLyogUjEzNzAgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3MSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzcyICovCisJMHgwMDAwLCAgICAgLyogUjEzNzMgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3NCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzc1ICovCisJMHgwMDAwLCAgICAgLyogUjEzNzYgKi8KKwkweDAwMDAsICAgICAvKiBSMTM3NyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzc4ICovCisJMHgwMDAwLCAgICAgLyogUjEzNzkgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4MCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzgxICovCisJMHgwMDAwLCAgICAgLyogUjEzODIgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4MyAqLworCTB4MDAwMCwgICAgIC8qIFIxMzg0ICovCisJMHgwMDAwLCAgICAgLyogUjEzODUgKi8KKwkweDAwMDAsICAgICAvKiBSMTM4NiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzg3ICovCisJMHgwMDAwLCAgICAgLyogUjEzODggKi8KKwkweDAwMDAsICAgICAvKiBSMTM4OSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkwICovCisJMHgwMDAwLCAgICAgLyogUjEzOTEgKi8KKwkweDAwMDAsICAgICAvKiBSMTM5MiAqLworCTB4MDAwMCwgICAgIC8qIFIxMzkzICovCisJMHgwMDAwLCAgICAgLyogUjEzOTQgKi8KKwkweDAwMDAsICAgICAvKiBSMTM5NSAqLworCTB4MDAwMCwgICAgIC8qIFIxMzk2ICovCisJMHgwMDAwLCAgICAgLyogUjEzOTcgKi8KKwkweDAwMDAsICAgICAvKiBSMTM5OCAqLworCTB4MDAwMCwgICAgIC8qIFIxMzk5ICovCisJMHgwMDAwLCAgICAgLyogUjE0MDAgKi8KKwkweDAwMDAsICAgICAvKiBSMTQwMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDAyICovCisJMHgwMDAwLCAgICAgLyogUjE0MDMgKi8KKwkweDAwMDAsICAgICAvKiBSMTQwNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDA1ICovCisJMHgwMDAwLCAgICAgLyogUjE0MDYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQwNyAqLworCTB4NjMxOCwgICAgIC8qIFIxNDA4ICAtIEFJRjIgRVEgR2FpbnMgKDEpICovCisJMHg2MzAwLCAgICAgLyogUjE0MDkgIC0gQUlGMiBFUSBHYWlucyAoMikgKi8KKwkweDBGQ0EsICAgICAvKiBSMTQxMCAgLSBBSUYyIEVRIEJhbmQgMSBBICovCisJMHgwNDAwLCAgICAgLyogUjE0MTEgIC0gQUlGMiBFUSBCYW5kIDEgQiAqLworCTB4MDBEOCwgICAgIC8qIFIxNDEyICAtIEFJRjIgRVEgQmFuZCAxIFBHICovCisJMHgxRUI1LCAgICAgLyogUjE0MTMgIC0gQUlGMiBFUSBCYW5kIDIgQSAqLworCTB4RjE0NSwgICAgIC8qIFIxNDE0ICAtIEFJRjIgRVEgQmFuZCAyIEIgKi8KKwkweDBCNzUsICAgICAvKiBSMTQxNSAgLSBBSUYyIEVRIEJhbmQgMiBDICovCisJMHgwMUM1LCAgICAgLyogUjE0MTYgIC0gQUlGMiBFUSBCYW5kIDIgUEcgKi8KKwkweDFDNTgsICAgICAvKiBSMTQxNyAgLSBBSUYyIEVRIEJhbmQgMyBBICovCisJMHhGMzczLCAgICAgLyogUjE0MTggIC0gQUlGMiBFUSBCYW5kIDMgQiAqLworCTB4MEE1NCwgICAgIC8qIFIxNDE5ICAtIEFJRjIgRVEgQmFuZCAzIEMgKi8KKwkweDA1NTgsICAgICAvKiBSMTQyMCAgLSBBSUYyIEVRIEJhbmQgMyBQRyAqLworCTB4MTY4RSwgICAgIC8qIFIxNDIxICAtIEFJRjIgRVEgQmFuZCA0IEEgKi8KKwkweEY4MjksICAgICAvKiBSMTQyMiAgLSBBSUYyIEVRIEJhbmQgNCBCICovCisJMHgwN0FELCAgICAgLyogUjE0MjMgIC0gQUlGMiBFUSBCYW5kIDQgQyAqLworCTB4MTEwMywgICAgIC8qIFIxNDI0ICAtIEFJRjIgRVEgQmFuZCA0IFBHICovCisJMHgwNTY0LCAgICAgLyogUjE0MjUgIC0gQUlGMiBFUSBCYW5kIDUgQSAqLworCTB4MDU1OSwgICAgIC8qIFIxNDI2ICAtIEFJRjIgRVEgQmFuZCA1IEIgKi8KKwkweDQwMDAsICAgICAvKiBSMTQyNyAgLSBBSUYyIEVRIEJhbmQgNSBQRyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDI4ICovCisJMHgwMDAwLCAgICAgLyogUjE0MjkgKi8KKwkweDAwMDAsICAgICAvKiBSMTQzMCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDMxICovCisJMHgwMDAwLCAgICAgLyogUjE0MzIgKi8KKwkweDAwMDAsICAgICAvKiBSMTQzMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDM0ICovCisJMHgwMDAwLCAgICAgLyogUjE0MzUgKi8KKwkweDAwMDAsICAgICAvKiBSMTQzNiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDM3ICovCisJMHgwMDAwLCAgICAgLyogUjE0MzggKi8KKwkweDAwMDAsICAgICAvKiBSMTQzOSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQwICovCisJMHgwMDAwLCAgICAgLyogUjE0NDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQzICovCisJMHgwMDAwLCAgICAgLyogUjE0NDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQ2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ0OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDQ5ICovCisJMHgwMDAwLCAgICAgLyogUjE0NTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ1MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDUyICovCisJMHgwMDAwLCAgICAgLyogUjE0NTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ1NCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDU1ICovCisJMHgwMDAwLCAgICAgLyogUjE0NTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ1NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDU4ICovCisJMHgwMDAwLCAgICAgLyogUjE0NTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDYxICovCisJMHgwMDAwLCAgICAgLyogUjE0NjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDY0ICovCisJMHgwMDAwLCAgICAgLyogUjE0NjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDY3ICovCisJMHgwMDAwLCAgICAgLyogUjE0NjggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ2OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDcwICovCisJMHgwMDAwLCAgICAgLyogUjE0NzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3MiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDczICovCisJMHgwMDAwLCAgICAgLyogUjE0NzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3NSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDc2ICovCisJMHgwMDAwLCAgICAgLyogUjE0NzcgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ3OCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDc5ICovCisJMHgwMDAwLCAgICAgLyogUjE0ODAgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4MSAqLworCTB4MDAwMCwgICAgIC8qIFIxNDgyICovCisJMHgwMDAwLCAgICAgLyogUjE0ODMgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4NCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDg1ICovCisJMHgwMDAwLCAgICAgLyogUjE0ODYgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ4NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDg4ICovCisJMHgwMDAwLCAgICAgLyogUjE0ODkgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNDkxICovCisJMHgwMDAwLCAgICAgLyogUjE0OTIgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNDk0ICovCisJMHgwMDAwLCAgICAgLyogUjE0OTUgKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNDk3ICovCisJMHgwMDAwLCAgICAgLyogUjE0OTggKi8KKwkweDAwMDAsICAgICAvKiBSMTQ5OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAwICovCisJMHgwMDAwLCAgICAgLyogUjE1MDEgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTAzICovCisJMHgwMDAwLCAgICAgLyogUjE1MDQgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTA2ICovCisJMHgwMDAwLCAgICAgLyogUjE1MDcgKi8KKwkweDAwMDAsICAgICAvKiBSMTUwOCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTA5ICovCisJMHgwMDAwLCAgICAgLyogUjE1MTAgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxMSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTEyICovCisJMHgwMDAwLCAgICAgLyogUjE1MTMgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxNCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTE1ICovCisJMHgwMDAwLCAgICAgLyogUjE1MTYgKi8KKwkweDAwMDAsICAgICAvKiBSMTUxNyAqLworCTB4MDAwMCwgICAgIC8qIFIxNTE4ICovCisJMHgwMDAwLCAgICAgLyogUjE1MTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTUyMCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTIxICovCisJMHgwMDAwLCAgICAgLyogUjE1MjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTUyMyAqLworCTB4MDAwMCwgICAgIC8qIFIxNTI0ICovCisJMHgwMDAwLCAgICAgLyogUjE1MjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTUyNiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTI3ICovCisJMHgwMDAwLCAgICAgLyogUjE1MjggKi8KKwkweDAwMDAsICAgICAvKiBSMTUyOSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTMwICovCisJMHgwMDAwLCAgICAgLyogUjE1MzEgKi8KKwkweDAwMDAsICAgICAvKiBSMTUzMiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTMzICovCisJMHgwMDAwLCAgICAgLyogUjE1MzQgKi8KKwkweDAwMDAsICAgICAvKiBSMTUzNSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTM2ICAtIERBQzEgTWl4ZXIgVm9sdW1lcyAqLworCTB4MDAwMCwgICAgIC8qIFIxNTM3ICAtIERBQzEgTGVmdCBNaXhlciBSb3V0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjE1MzggIC0gREFDMSBSaWdodCBNaXhlciBSb3V0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjE1MzkgIC0gREFDMiBNaXhlciBWb2x1bWVzICovCisJMHgwMDAwLCAgICAgLyogUjE1NDAgIC0gREFDMiBMZWZ0IE1peGVyIFJvdXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0MSAgLSBEQUMyIFJpZ2h0IE1peGVyIFJvdXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0MiAgLSBBSUYxIEFEQzEgTGVmdCBNaXhlciBSb3V0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjE1NDMgIC0gQUlGMSBBREMxIFJpZ2h0IE1peGVyIFJvdXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0NCAgLSBBSUYxIEFEQzIgTGVmdCBNaXhlciBSb3V0aW5nICovCisJMHgwMDAwLCAgICAgLyogUjE1NDUgIC0gQUlGMSBBREMyIFJpZ2h0IG1peGVyIFJvdXRpbmcgKi8KKwkweDAwMDAsICAgICAvKiBSMTU0NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTQ3ICovCisJMHgwMDAwLCAgICAgLyogUjE1NDggKi8KKwkweDAwMDAsICAgICAvKiBSMTU0OSAqLworCTB4MDAwMCwgICAgIC8qIFIxNTUwICovCisJMHgwMDAwLCAgICAgLyogUjE1NTEgKi8KKwkweDAyQzAsICAgICAvKiBSMTU1MiAgLSBEQUMxIExlZnQgVm9sdW1lICovCisJMHgwMkMwLCAgICAgLyogUjE1NTMgIC0gREFDMSBSaWdodCBWb2x1bWUgKi8KKwkweDAyQzAsICAgICAvKiBSMTU1NCAgLSBEQUMyIExlZnQgVm9sdW1lICovCisJMHgwMkMwLCAgICAgLyogUjE1NTUgIC0gREFDMiBSaWdodCBWb2x1bWUgKi8KKwkweDAwMDAsICAgICAvKiBSMTU1NiAgLSBEQUMgU29mdG11dGUgKi8KKwkweDAwMDAsICAgICAvKiBSMTU1NyAqLworCTB4MDAwMCwgICAgIC8qIFIxNTU4ICovCisJMHgwMDAwLCAgICAgLyogUjE1NTkgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2MCAqLworCTB4MDAwMCwgICAgIC8qIFIxNTYxICovCisJMHgwMDAwLCAgICAgLyogUjE1NjIgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2MyAqLworCTB4MDAwMCwgICAgIC8qIFIxNTY0ICovCisJMHgwMDAwLCAgICAgLyogUjE1NjUgKi8KKwkweDAwMDAsICAgICAvKiBSMTU2NiAqLworCTB4MDAwMCwgICAgIC8qIFIxNTY3ICovCisJMHgwMDAyLCAgICAgLyogUjE1NjggIC0gT3ZlcnNhbXBsaW5nICovCisJMHgwMDAwLCAgICAgLyogUjE1NjkgIC0gU2lkZXRvbmUgKi8KK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwppbmRleCA0ZDNlNmYxYS4uMjQ3YTZhOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC0xOCwxNSArMTgsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21mZC93bTg5OTQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC93bTg5OTQvcmVnaXN0ZXJzLmg+CkBAIC01Nyw4ICs1OSw2IEBACiAJV004OTk0X0FJRjJfRVFfR0FJTlNfMSwKIH07CiAKLSNkZWZpbmUgV004OTk0X1JFR19DQUNIRV9TSVpFICAweDYyMQotCiBzdHJ1Y3Qgd204OTk0X21pY2RldCB7CiAJc3RydWN0IHNuZF9zb2NfamFjayAqamFjazsKIAlpbnQgZGV0OwpAQCAtNzEsNyArNzEsNiBAQAogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTE2IHJlZ19jYWNoZVtXTTg5OTRfUkVHX0NBQ0hFX1NJWkUgKyAxXTsKIAlpbnQgc3lzY2xrWzJdOwogCWludCBzeXNjbGtfcmF0ZVsyXTsKIAlpbnQgbWNsa1syXTsKQEAgLTgxLDYgKzgwLDggQEAKIAlpbnQgZGFjX3JhdGVzWzJdOwogCWludCBscmNsa19zaGFyZWRbMl07CiAKKwlpbnQgbWJjX2VuYVszXTsKKwogCS8qIFBsYXRmb3JtIGRlcGVuZGFudCBEUkMgY29uZmlndXJhdGlvbiAqLwogCWNvbnN0IGNoYXIgKipkcmNfdGV4dHM7CiAJaW50IGRyY19jZmdbV004OTk0X05VTV9EUkNdOwpAQCAtOTIsMTU4OCArOTMsMjIgQEAKIAlpbnQgcmV0dW5lX21vYmlsZV9jZmdbV004OTk0X05VTV9FUV07CiAJc3RydWN0IHNvY19lbnVtIHJldHVuZV9tb2JpbGVfZW51bTsKIAorCS8qIFBsYXRmb3JtIGRlcGVuZGFudCBNQkMgY29uZmlndXJhdGlvbiAqLworCWludCBtYmNfY2ZnOworCWNvbnN0IGNoYXIgKiptYmNfdGV4dHM7CisJc3RydWN0IHNvY19lbnVtIG1iY19lbnVtOworCiAJc3RydWN0IHdtODk5NF9taWNkZXQgbWljZGV0WzJdOwogCisJd204OTU4X21pY2RldF9jYiBqYWNrX2NiOworCXZvaWQgKmphY2tfY2JfZGF0YTsKKwlib29sIGphY2tfaXNfbWljOworCWJvb2wgamFja19pc192aWRlbzsKKwogCWludCByZXZpc2lvbjsKIAlzdHJ1Y3Qgd204OTk0X3BkYXRhICpwZGF0YTsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IHJlYWRhYmxlOyAgIC8qIE1hc2sgb2YgcmVhZGFibGUgYml0cyAqLwotCXVuc2lnbmVkIHNob3J0IHdyaXRhYmxlOyAgIC8qIE1hc2sgb2Ygd3JpdGFibGUgYml0cyAqLwotfSBhY2Nlc3NfbWFza3NbXSA9IHsKLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIwICAgICAtIFNvZnR3YXJlIFJlc2V0ICovCi0JeyAweDNCMzcsIDB4M0IzNyB9LCAvKiBSMSAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICgxKSAqLwotCXsgMHg2QkYwLCAweDZCRjAgfSwgLyogUjIgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoMikgKi8KLQl7IDB4M0ZGMCwgMHgzRkYwIH0sIC8qIFIzICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDMpICovCi0JeyAweDNGM0YsIDB4M0YzRiB9LCAvKiBSNCAgICAgLSBQb3dlciBNYW5hZ2VtZW50ICg0KSAqLwotCXsgMHgzRjBGLCAweDNGMEYgfSwgLyogUjUgICAgIC0gUG93ZXIgTWFuYWdlbWVudCAoNSkgKi8KLQl7IDB4MDAzRiwgMHgwMDNGIH0sIC8qIFI2ICAgICAtIFBvd2VyIE1hbmFnZW1lbnQgKDYpICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMCAqLwotCXsgMHgwMUMwLCAweDAxQzAgfSwgLyogUjIxICAgIC0gSW5wdXQgTWl4ZXIgKDEpICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyMyAqLwotCXsgMHgwMERGLCAweDAxREYgfSwgLyogUjI0ICAgIC0gTGVmdCBMaW5lIElucHV0IDEmMiBWb2x1bWUgKi8KLQl7IDB4MDBERiwgMHgwMURGIH0sIC8qIFIyNSAgICAtIExlZnQgTGluZSBJbnB1dCAzJjQgVm9sdW1lICovCi0JeyAweDAwREYsIDB4MDFERiB9LCAvKiBSMjYgICAgLSBSaWdodCBMaW5lIElucHV0IDEmMiBWb2x1bWUgKi8KLQl7IDB4MDBERiwgMHgwMURGIH0sIC8qIFIyNyAgICAtIFJpZ2h0IExpbmUgSW5wdXQgMyY0IFZvbHVtZSAqLwotCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjI4ICAgIC0gTGVmdCBPdXRwdXQgVm9sdW1lICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMjkgICAgLSBSaWdodCBPdXRwdXQgVm9sdW1lICovCi0JeyAweDAwNzcsIDB4MDA3NyB9LCAvKiBSMzAgICAgLSBMaW5lIE91dHB1dHMgVm9sdW1lICovCi0JeyAweDAwMzAsIDB4MDAzMCB9LCAvKiBSMzEgICAgLSBIUE9VVDIgVm9sdW1lICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMzIgICAgLSBMZWZ0IE9QR0EgVm9sdW1lICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMzMgICAgLSBSaWdodCBPUEdBIFZvbHVtZSAqLwotCXsgMHgwMDdGLCAweDAwN0YgfSwgLyogUjM0ICAgIC0gU1BLTUlYTCBBdHRlbnVhdGlvbiAqLwotCXsgMHgwMTdGLCAweDAxN0YgfSwgLyogUjM1ICAgIC0gU1BLTUlYUiBBdHRlbnVhdGlvbiAqLwotCXsgMHgwMDNGLCAweDAwM0YgfSwgLyogUjM2ICAgIC0gU1BLT1VUIE1peGVycyAqLwotCXsgMHgwMDNGLCAweDAwM0YgfSwgLyogUjM3ICAgIC0gQ2xhc3NEICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMzggICAgLSBTcGVha2VyIFZvbHVtZSBMZWZ0ICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMzkgICAgLSBTcGVha2VyIFZvbHVtZSBSaWdodCAqLwotCXsgMHgwMEZGLCAweDAwRkYgfSwgLyogUjQwICAgIC0gSW5wdXQgTWl4ZXIgKDIpICovCi0JeyAweDAxQjcsIDB4MDFCNyB9LCAvKiBSNDEgICAgLSBJbnB1dCBNaXhlciAoMykgKi8KLQl7IDB4MDFCNywgMHgwMUI3IH0sIC8qIFI0MiAgICAtIElucHV0IE1peGVyICg0KSAqLwotCXsgMHgwMUM3LCAweDAxQzcgfSwgLyogUjQzICAgIC0gSW5wdXQgTWl4ZXIgKDUpICovCi0JeyAweDAxQzcsIDB4MDFDNyB9LCAvKiBSNDQgICAgLSBJbnB1dCBNaXhlciAoNikgKi8KLQl7IDB4MDFGRiwgMHgwMUZGIH0sIC8qIFI0NSAgICAtIE91dHB1dCBNaXhlciAoMSkgKi8KLQl7IDB4MDFGRiwgMHgwMUZGIH0sIC8qIFI0NiAgICAtIE91dHB1dCBNaXhlciAoMikgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI0NyAgICAtIE91dHB1dCBNaXhlciAoMykgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI0OCAgICAtIE91dHB1dCBNaXhlciAoNCkgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI0OSAgICAtIE91dHB1dCBNaXhlciAoNSkgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI1MCAgICAtIE91dHB1dCBNaXhlciAoNikgKi8KLQl7IDB4MDAzOCwgMHgwMDM4IH0sIC8qIFI1MSAgICAtIEhQT1VUMiBNaXhlciAqLwotCXsgMHgwMDc3LCAweDAwNzcgfSwgLyogUjUyICAgIC0gTGluZSBNaXhlciAoMSkgKi8KLQl7IDB4MDA3NywgMHgwMDc3IH0sIC8qIFI1MyAgICAtIExpbmUgTWl4ZXIgKDIpICovCi0JeyAweDAzRkYsIDB4MDNGRiB9LCAvKiBSNTQgICAgLSBTcGVha2VyIE1peGVyICovCi0JeyAweDAwQzEsIDB4MDBDMSB9LCAvKiBSNTUgICAgLSBBZGRpdGlvbmFsIENvbnRyb2wgKi8KLQl7IDB4MDBGMCwgMHgwMEYwIH0sIC8qIFI1NiAgICAtIEFudGlQT1AgKDEpICovCi0JeyAweDAxRUYsIDB4MDFFRiB9LCAvKiBSNTcgICAgLSBBbnRpUE9QICgyKSAqLwotCXsgMHgwMEZGLCAweDAwRkYgfSwgLyogUjU4ICAgIC0gTUlDQklBUyAqLwotCXsgMHgwMDBGLCAweDAwMEYgfSwgLyogUjU5ICAgIC0gTERPIDEgKi8KLQl7IDB4MDAwNywgMHgwMDA3IH0sIC8qIFI2MCAgICAtIExETyAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI2OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1ICovCi0JeyAweDgwMDAsIDB4ODAwMCB9LCAvKiBSNzYgICAgLSBDaGFyZ2UgUHVtcCAoMSkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MCAqLwotCXsgMHgwMzAxLCAweDAzMDEgfSwgLyogUjgxICAgIC0gQ2xhc3MgVyAoMSkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI4MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjgzICovCi0JeyAweDMzM0YsIDB4MzMzRiB9LCAvKiBSODQgICAgLSBEQyBTZXJ2byAoMSkgKi8KLQl7IDB4MEZFRiwgMHgwRkVGIH0sIC8qIFI4NSAgICAtIERDIFNlcnZvICgyKSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjg2ICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSODcgICAgLSBEQyBTZXJ2byAoNCkgKi8KLQl7IDB4MDMzMywgMHgwMDAwIH0sIC8qIFI4OCAgICAtIERDIFNlcnZvIFJlYWRiYWNrICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUgKi8KLQl7IDB4MDBFRSwgMHgwMEVFIH0sIC8qIFI5NiAgICAtIEFuYWxvZ3VlIEhQICgxKSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE2OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE3OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE4OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIwOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIxOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjIzOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjI1NSAqLwotCXsgMHgwMDBGLCAweDAwMDAgfSwgLyogUjI1NiAgIC0gQ2hpcCBSZXZpc2lvbiAqLwotCXsgMHgwMDc0LCAweDAwNzQgfSwgLyogUjI1NyAgIC0gQ29udHJvbCBJbnRlcmZhY2UgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNTkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNjkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIyNzEgKi8KLQl7IDB4ODA3RiwgMHg4MzdGIH0sIC8qIFIyNzIgICAtIFdyaXRlIFNlcXVlbmNlciBDdHJsICgxKSAqLwotCXsgMHgwMTdGLCAweDAwMDAgfSwgLyogUjI3MyAgIC0gV3JpdGUgU2VxdWVuY2VyIEN0cmwgKDIpICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjgxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjkwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMjk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzAwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzAzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzExICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzIwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzIxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzIzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzMwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzMzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzM5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzQ5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzUxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzUyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzYxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzcwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzgxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzkwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMzk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDAwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDAzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDExICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDIwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDIxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDIzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDMwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDMzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDM5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDQ5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDUxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDUyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDYxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDcwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDgxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDkwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNDk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTAwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTAzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNTExICovCi0JeyAweDAwMUYsIDB4MDAxRiB9LCAvKiBSNTEyICAgLSBBSUYxIENsb2NraW5nICgxKSAqLwotCXsgMHgwMDNGLCAweDAwM0YgfSwgLyogUjUxMyAgIC0gQUlGMSBDbG9ja2luZyAoMikgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MTQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MTUgKi8KLQl7IDB4MDAxRiwgMHgwMDFGIH0sIC8qIFI1MTYgICAtIEFJRjIgQ2xvY2tpbmcgKDEpICovCi0JeyAweDAwM0YsIDB4MDAzRiB9LCAvKiBSNTE3ICAgLSBBSUYyIENsb2NraW5nICgyKSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUxOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUxOSAqLwotCXsgMHgwMDFGLCAweDAwMUYgfSwgLyogUjUyMCAgIC0gQ2xvY2tpbmcgKDEpICovCi0JeyAweDA3NzcsIDB4MDc3NyB9LCAvKiBSNTIxICAgLSBDbG9ja2luZyAoMikgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI1MjcgKi8KLQl7IDB4MDBGRiwgMHgwMEZGIH0sIC8qIFI1MjggICAtIEFJRjEgUmF0ZSAqLwotCXsgMHgwMEZGLCAweDAwRkYgfSwgLyogUjUyOSAgIC0gQUlGMiBSYXRlICovCi0JeyAweDAwMEYsIDB4MDAwMCB9LCAvKiBSNTMwICAgLSBSYXRlIFN0YXR1cyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjUzOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU0MyAqLwotCXsgMHgwMDA3LCAweDAwMDcgfSwgLyogUjU0NCAgIC0gRkxMMSBDb250cm9sICgxKSAqLwotCXsgMHgzRjc3LCAweDNGNzcgfSwgLyogUjU0NSAgIC0gRkxMMSBDb250cm9sICgyKSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjU0NiAgIC0gRkxMMSBDb250cm9sICgzKSAqLwotCXsgMHg3RkVGLCAweDdGRUYgfSwgLyogUjU0NyAgIC0gRkxMMSBDb250cm9sICg0KSAqLwotCXsgMHgxRkRCLCAweDFGREIgfSwgLyogUjU0OCAgIC0gRkxMMSBDb250cm9sICg1KSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU1OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU2OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU3NSAqLwotCXsgMHgwMDA3LCAweDAwMDcgfSwgLyogUjU3NiAgIC0gRkxMMiBDb250cm9sICgxKSAqLwotCXsgMHgzRjc3LCAweDNGNzcgfSwgLyogUjU3NyAgIC0gRkxMMiBDb250cm9sICgyKSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjU3OCAgIC0gRkxMMiBDb250cm9sICgzKSAqLwotCXsgMHg3RkVGLCAweDdGRUYgfSwgLyogUjU3OSAgIC0gRkxMMiBDb250cm9sICg0KSAqLwotCXsgMHgxRkRCLCAweDFGREIgfSwgLyogUjU4MCAgIC0gRkxMMiBDb250cm9sICg1KSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU4OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjU5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYwOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYxOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjYzOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY1OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY2OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY3OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY4OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjY5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcwOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcxOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjcyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjczOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc1OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjc2NyAqLwotCXsgMHhFMUY4LCAweEUxRjggfSwgLyogUjc2OCAgIC0gQUlGMSBDb250cm9sICgxKSAqLwotCXsgMHhDRDFGLCAweENEMUYgfSwgLyogUjc2OSAgIC0gQUlGMSBDb250cm9sICgyKSAqLwotCXsgMHhGMDAwLCAweEYwMDAgfSwgLyogUjc3MCAgIC0gQUlGMSBNYXN0ZXIvU2xhdmUgKi8KLQl7IDB4MDFGMCwgMHgwMUYwIH0sIC8qIFI3NzEgICAtIEFJRjEgQkNMSyAqLwotCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjc3MiAgIC0gQUlGMUFEQyBMUkNMSyAqLwotCXsgMHgwRkZGLCAweDBGRkYgfSwgLyogUjc3MyAgIC0gQUlGMURBQyBMUkNMSyAqLwotCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjc3NCAgIC0gQUlGMURBQyBEYXRhICovCi0JeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSNzc1ICAgLSBBSUYxQURDIERhdGEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NzYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NzcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NzggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3NzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3ODAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3ODEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3ODIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFI3ODMgKi8KLQl7IDB4RjFGOCwgMHhGMUY4IH0sIC8qIFI3ODQgICAtIEFJRjIgQ29udHJvbCAoMSkgKi8KLQl7IDB4RkQxRiwgMHhGRDFGIH0sIC8qIFI3ODUgICAtIEFJRjIgQ29udHJvbCAoMikgKi8KLQl7IDB4RjAwMCwgMHhGMDAwIH0sIC8qIFI3ODYgICAtIEFJRjIgTWFzdGVyL1NsYXZlICovCi0JeyAweDAxRjAsIDB4MDFGMCB9LCAvKiBSNzg3ICAgLSBBSUYyIEJDTEsgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI3ODggICAtIEFJRjJBREMgTFJDTEsgKi8KLQl7IDB4MEZGRiwgMHgwRkZGIH0sIC8qIFI3ODkgICAtIEFJRjJEQUMgTFJDTEsgKi8KLQl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFI3OTAgICAtIEFJRjJEQUMgRGF0YSAqLwotCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjc5MSAgIC0gQUlGMkFEQyBEYXRhICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSNzk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODAwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODAzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODExICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODIwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODIxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODIzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODMwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODMzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODM5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODQ5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODUxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODUyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODYxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODcwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODgxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODkwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSODk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTAwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTAzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTExICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTIwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTIxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTIzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTMwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTMzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTM5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTQ5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTYxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTcwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTgxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTkwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSOTk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDA1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMDcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDA4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAwOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDExICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDE0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDE3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAxOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMTkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDIwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAyMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDIzICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTAyNCAgLSBBSUYxIEFEQzEgTGVmdCBWb2x1bWUgKi8KLQl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDI1ICAtIEFJRjEgQURDMSBSaWdodCBWb2x1bWUgKi8KLQl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDI2ICAtIEFJRjEgREFDMSBMZWZ0IFZvbHVtZSAqLwotCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEwMjcgIC0gQUlGMSBEQUMxIFJpZ2h0IFZvbHVtZSAqLwotCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEwMjggIC0gQUlGMSBBREMyIExlZnQgVm9sdW1lICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTAyOSAgLSBBSUYxIEFEQzIgUmlnaHQgVm9sdW1lICovCi0JeyAweDAwRkYsIDB4MDFGRiB9LCAvKiBSMTAzMCAgLSBBSUYxIERBQzIgTGVmdCBWb2x1bWUgKi8KLQl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMDMxICAtIEFJRjEgREFDMiBSaWdodCBWb2x1bWUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMzQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwMzcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTAzOSAqLwotCXsgMHhGODAwLCAweEY4MDAgfSwgLyogUjEwNDAgIC0gQUlGMSBBREMxIEZpbHRlcnMgKi8KLQl7IDB4NzgwMCwgMHg3ODAwIH0sIC8qIFIxMDQxICAtIEFJRjEgQURDMiBGaWx0ZXJzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNDMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNTUgKi8KLQl7IDB4MDJCNiwgMHgwMkI2IH0sIC8qIFIxMDU2ICAtIEFJRjEgREFDMSBGaWx0ZXJzICgxKSAqLwotCXsgMHgzRjAwLCAweDNGMDAgfSwgLyogUjEwNTcgIC0gQUlGMSBEQUMxIEZpbHRlcnMgKDIpICovCi0JeyAweDAyQjYsIDB4MDJCNiB9LCAvKiBSMTA1OCAgLSBBSUYxIERBQzIgRmlsdGVycyAoMSkgKi8KLQl7IDB4M0YwMCwgMHgzRjAwIH0sIC8qIFIxMDU5ICAtIEFJRjEgREFDMiBGaWx0ZXJzICgyKSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDYxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDY3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA2OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNjkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDcwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA3NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwNzggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwODEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwODQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA4NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwODcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMDg4ICAtIEFJRjEgRFJDMSAoMSkgKi8KLQl7IDB4MUZGRiwgMHgxRkZGIH0sIC8qIFIxMDg5ICAtIEFJRjEgRFJDMSAoMikgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMDkwICAtIEFJRjEgRFJDMSAoMykgKi8KLQl7IDB4MDdGRiwgMHgwN0ZGIH0sIC8qIFIxMDkxICAtIEFJRjEgRFJDMSAoNCkgKi8KLQl7IDB4MDNGRiwgMHgwM0ZGIH0sIC8qIFIxMDkyICAtIEFJRjEgRFJDMSAoNSkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDkzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA5NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDk2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTA5NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEwOTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMDk5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEwMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMDEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTAyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEwMyAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExMDQgIC0gQUlGMSBEUkMyICgxKSAqLwotCXsgMHgxRkZGLCAweDFGRkYgfSwgLyogUjExMDUgIC0gQUlGMSBEUkMyICgyKSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExMDYgIC0gQUlGMSBEUkMyICgzKSAqLwotCXsgMHgwN0ZGLCAweDA3RkYgfSwgLyogUjExMDcgIC0gQUlGMSBEUkMyICg0KSAqLwotCXsgMHgwM0ZGLCAweDAzRkYgfSwgLyogUjExMDggIC0gQUlGMSBEUkMyICg1KSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTExNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTEzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExMzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQ2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE0NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNDggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTQ5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE1MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNTEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTUyICAtIEFJRjEgREFDMSBFUSBHYWlucyAoMSkgKi8KLQl7IDB4RkZDMCwgMHhGRkMwIH0sIC8qIFIxMTUzICAtIEFJRjEgREFDMSBFUSBHYWlucyAoMikgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTU0ICAtIEFJRjEgREFDMSBFUSBCYW5kIDEgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNTUgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMSBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE1NiAgLSBBSUYxIERBQzEgRVEgQmFuZCAxIFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE1NyAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTU4ICAtIEFJRjEgREFDMSBFUSBCYW5kIDIgQiAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNTkgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMiBDICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2MCAgLSBBSUYxIERBQzEgRVEgQmFuZCAyIFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2MSAgLSBBSUYxIERBQzEgRVEgQmFuZCAzIEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTYyICAtIEFJRjEgREFDMSBFUSBCYW5kIDMgQiAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNjMgIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBDICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2NCAgLSBBSUYxIERBQzEgRVEgQmFuZCAzIFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2NSAgLSBBSUYxIERBQzEgRVEgQmFuZCA0IEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTY2ICAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQiAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNjcgIC0gQUlGMSBEQUMxIEVRIEJhbmQgNCBDICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2OCAgLSBBSUYxIERBQzEgRVEgQmFuZCA0IFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE2OSAgLSBBSUYxIERBQzEgRVEgQmFuZCA1IEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTcwICAtIEFJRjEgREFDMSBFUSBCYW5kIDUgQiAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExNzEgIC0gQUlGMSBEQUMxIEVRIEJhbmQgNSBQRyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTczICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTc2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE3NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExNzggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTc5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE4MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjExODEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMTgyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTE4MyAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExODQgIC0gQUlGMSBEQUMyIEVRIEdhaW5zICgxKSAqLwotCXsgMHhGRkMwLCAweEZGQzAgfSwgLyogUjExODUgIC0gQUlGMSBEQUMyIEVRIEdhaW5zICgyKSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExODYgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMSBBICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE4NyAgLSBBSUYxIERBQzIgRVEgQmFuZCAxIEIgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTg4ICAtIEFJRjEgREFDMiBFUSBCYW5kIDEgUEcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTg5ICAtIEFJRjEgREFDMiBFUSBCYW5kIDIgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTAgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5MSAgLSBBSUYxIERBQzIgRVEgQmFuZCAyIEMgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTkyICAtIEFJRjEgREFDMiBFUSBCYW5kIDIgUEcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTkzICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTQgIC0gQUlGMSBEQUMyIEVRIEJhbmQgMyBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5NSAgLSBBSUYxIERBQzIgRVEgQmFuZCAzIEMgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTk2ICAtIEFJRjEgREFDMiBFUSBCYW5kIDMgUEcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMTk3ICAtIEFJRjEgREFDMiBFUSBCYW5kIDQgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjExOTggIC0gQUlGMSBEQUMyIEVRIEJhbmQgNCBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTE5OSAgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEMgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMjAwICAtIEFJRjEgREFDMiBFUSBCYW5kIDQgUEcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxMjAxICAtIEFJRjEgREFDMiBFUSBCYW5kIDUgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEyMDIgIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTIwMyAgLSBBSUYxIERBQzIgRVEgQmFuZCA1IFBHICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIwNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMDUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjA2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIwNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMDggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjA5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjEyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjE1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMTcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjE4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIxOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjIxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjI0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjI3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIyOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMjkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjMwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjMzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjM2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTIzNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyMzggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjM5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQ1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNDcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjQ4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI0OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjUxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjU0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNTkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI2NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNjggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjY5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjcyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjc1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyNzcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjc4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI3OSAqLwotCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEyODAgIC0gQUlGMiBBREMgTGVmdCBWb2x1bWUgKi8KLQl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMjgxICAtIEFJRjIgQURDIFJpZ2h0IFZvbHVtZSAqLwotCXsgMHgwMEZGLCAweDAxRkYgfSwgLyogUjEyODIgIC0gQUlGMiBEQUMgTGVmdCBWb2x1bWUgKi8KLQl7IDB4MDBGRiwgMHgwMUZGIH0sIC8qIFIxMjgzICAtIEFJRjIgREFDIFJpZ2h0IFZvbHVtZSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyODQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjg1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI4NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyODcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjg4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI4OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjkxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjk0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5NSAqLwotCXsgMHhGODAwLCAweEY4MDAgfSwgLyogUjEyOTYgIC0gQUlGMiBBREMgRmlsdGVycyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEyOTcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMjk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTI5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxMSAqLwotCXsgMHgwMkI2LCAweDAyQjYgfSwgLyogUjEzMTIgIC0gQUlGMiBEQUMgRmlsdGVycyAoMSkgKi8KLQl7IDB4M0YwMCwgMHgzRjAwIH0sIC8qIFIxMzEzICAtIEFJRjIgREFDIEZpbHRlcnMgKDIpICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzM3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTMzOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzMzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzQwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM0MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNDIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzQzICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTM0NCAgLSBBSUYyIERSQyAoMSkgKi8KLQl7IDB4MUZGRiwgMHgxRkZGIH0sIC8qIFIxMzQ1ICAtIEFJRjIgRFJDICgyKSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjEzNDYgIC0gQUlGMiBEUkMgKDMpICovCi0JeyAweDA3RkYsIDB4MDdGRiB9LCAvKiBSMTM0NyAgLSBBSUYyIERSQyAoNCkgKi8KLQl7IDB4MDNGRiwgMHgwM0ZGIH0sIC8qIFIxMzQ4ICAtIEFJRjIgRFJDICg1KSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM2OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM3OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzNzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM4NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzODggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjEzOTcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxMzk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTM5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDA3ICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQwOCAgLSBBSUYyIEVRIEdhaW5zICgxKSAqLwotCXsgMHhGRkMwLCAweEZGQzAgfSwgLyogUjE0MDkgIC0gQUlGMiBFUSBHYWlucyAoMikgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDEwICAtIEFJRjIgRVEgQmFuZCAxIEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDExICAtIEFJRjIgRVEgQmFuZCAxIEIgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDEyICAtIEFJRjIgRVEgQmFuZCAxIFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxMyAgLSBBSUYyIEVRIEJhbmQgMiBBICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxNCAgLSBBSUYyIEVRIEJhbmQgMiBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxNSAgLSBBSUYyIEVRIEJhbmQgMiBDICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQxNiAgLSBBSUYyIEVRIEJhbmQgMiBQRyAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTcgIC0gQUlGMiBFUSBCYW5kIDMgQSAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTggIC0gQUlGMiBFUSBCYW5kIDMgQiAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MTkgIC0gQUlGMiBFUSBCYW5kIDMgQyAqLwotCXsgMHhGRkZGLCAweEZGRkYgfSwgLyogUjE0MjAgIC0gQUlGMiBFUSBCYW5kIDMgUEcgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDIxICAtIEFJRjIgRVEgQmFuZCA0IEEgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDIyICAtIEFJRjIgRVEgQmFuZCA0IEIgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDIzICAtIEFJRjIgRVEgQmFuZCA0IEMgKi8KLQl7IDB4RkZGRiwgMHhGRkZGIH0sIC8qIFIxNDI0ICAtIEFJRjIgRVEgQmFuZCA0IFBHICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQyNSAgLSBBSUYyIEVRIEJhbmQgNSBBICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQyNiAgLSBBSUYyIEVRIEJhbmQgNSBCICovCi0JeyAweEZGRkYsIDB4RkZGRiB9LCAvKiBSMTQyNyAgLSBBSUYyIEVRIEJhbmQgNSBQRyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MjggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDI5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDMyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDM1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0MzcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDM4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQzOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQ0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDUzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDU2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ1NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDU5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDYyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDY1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDY4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ2OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDcxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3MiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDc0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3NSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDc3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ3OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0NzkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDgwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDgzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDg2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ4NyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0ODggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDg5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5MCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDkyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5MyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDk1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5NiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE0OTcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNDk4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTQ5OSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTAxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTA0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwNSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTA3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUwOCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTEwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxMSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTEzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxNCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTE2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUxNyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MTggKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTE5ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyMCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjEgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTIyICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyMyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjQgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTI1ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyNiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MjcgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTI4ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUyOSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MzAgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTMxICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUzMiAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1MzMgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTM0ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTUzNSAqLwotCXsgMHgwMUVGLCAweDAxRUYgfSwgLyogUjE1MzYgIC0gREFDMSBNaXhlciBWb2x1bWVzICovCi0JeyAweDAwMzcsIDB4MDAzNyB9LCAvKiBSMTUzNyAgLSBEQUMxIExlZnQgTWl4ZXIgUm91dGluZyAqLwotCXsgMHgwMDM3LCAweDAwMzcgfSwgLyogUjE1MzggIC0gREFDMSBSaWdodCBNaXhlciBSb3V0aW5nICovCi0JeyAweDAxRUYsIDB4MDFFRiB9LCAvKiBSMTUzOSAgLSBEQUMyIE1peGVyIFZvbHVtZXMgKi8KLQl7IDB4MDAzNywgMHgwMDM3IH0sIC8qIFIxNTQwICAtIERBQzIgTGVmdCBNaXhlciBSb3V0aW5nICovCi0JeyAweDAwMzcsIDB4MDAzNyB9LCAvKiBSMTU0MSAgLSBEQUMyIFJpZ2h0IE1peGVyIFJvdXRpbmcgKi8KLQl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFIxNTQyICAtIEFJRjEgQURDMSBMZWZ0IE1peGVyIFJvdXRpbmcgKi8KLQl7IDB4MDAwMywgMHgwMDAzIH0sIC8qIFIxNTQzICAtIEFJRjEgQURDMSBSaWdodCBNaXhlciBSb3V0aW5nICovCi0JeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSMTU0NCAgLSBBSUYxIEFEQzIgTGVmdCBNaXhlciBSb3V0aW5nICovCi0JeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSMTU0NSAgLSBBSUYxIEFEQzIgUmlnaHQgbWl4ZXIgUm91dGluZyAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NDYgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTQ3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU0OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NDkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTUwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU1MSAqLwotCXsgMHgwMkZGLCAweDAzRkYgfSwgLyogUjE1NTIgIC0gREFDMSBMZWZ0IFZvbHVtZSAqLwotCXsgMHgwMkZGLCAweDAzRkYgfSwgLyogUjE1NTMgIC0gREFDMSBSaWdodCBWb2x1bWUgKi8KLQl7IDB4MDJGRiwgMHgwM0ZGIH0sIC8qIFIxNTU0ICAtIERBQzIgTGVmdCBWb2x1bWUgKi8KLQl7IDB4MDJGRiwgMHgwM0ZGIH0sIC8qIFIxNTU1ICAtIERBQzIgUmlnaHQgVm9sdW1lICovCi0JeyAweDAwMDMsIDB4MDAwMyB9LCAvKiBSMTU1NiAgLSBEQUMgU29mdG11dGUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTU3ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU1OCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NTkgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTYwICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2MSAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NjIgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTYzICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2NCAqLwotCXsgMHgwMDAwLCAweDAwMDAgfSwgLyogUjE1NjUgKi8KLQl7IDB4MDAwMCwgMHgwMDAwIH0sIC8qIFIxNTY2ICovCi0JeyAweDAwMDAsIDB4MDAwMCB9LCAvKiBSMTU2NyAqLwotCXsgMHgwMDAzLCAweDAwMDMgfSwgLyogUjE1NjggIC0gT3ZlcnNhbXBsaW5nICovCi0JeyAweDAzQzMsIDB4MDNDMyB9LCAvKiBSMTU2OSAgLSBTaWRldG9uZSAqLwotfTsKLQogc3RhdGljIGludCB3bTg5OTRfcmVhZGFibGUodW5zaWduZWQgaW50IHJlZykKIHsKIAlzd2l0Y2ggKHJlZykgewpAQCAtMTY5NiwxNCArMTMxLDE0IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChyZWcgPj0gQVJSQVlfU0laRShhY2Nlc3NfbWFza3MpKQorCWlmIChyZWcgPj0gV004OTk0X0NBQ0hFX1NJWkUpCiAJCXJldHVybiAwOwotCXJldHVybiBhY2Nlc3NfbWFza3NbcmVnXS5yZWFkYWJsZSAhPSAwOworCXJldHVybiB3bTg5OTRfYWNjZXNzX21hc2tzW3JlZ10ucmVhZGFibGUgIT0gMDsKIH0KIAogc3RhdGljIGludCB3bTg5OTRfdm9sYXRpbGUodW5zaWduZWQgaW50IHJlZykKIHsKLQlpZiAocmVnID49IFdNODk5NF9SRUdfQ0FDSEVfU0laRSkKKwlpZiAocmVnID49IFdNODk5NF9DQUNIRV9TSVpFKQogCQlyZXR1cm4gMTsKIAogCXN3aXRjaCAocmVnKSB7CkBAIC0xNzE0LDYgKzE0OSw4IEBACiAJY2FzZSBXTTg5OTRfUkFURV9TVEFUVVM6CiAJY2FzZSBXTTg5OTRfTERPXzE6CiAJY2FzZSBXTTg5OTRfTERPXzI6CisJY2FzZSBXTTg5NThfRFNQMl9FWEVDQ09OVFJPTDoKKwljYXNlIFdNODk1OF9NSUNfREVURUNUXzM6CiAJCXJldHVybiAxOwogCWRlZmF1bHQ6CiAJCXJldHVybiAwOwpAQCAtMTcyMywxNCArMTYwLDE2IEBACiBzdGF0aWMgaW50IHdtODk5NF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCiAJdW5zaWduZWQgaW50IHZhbHVlKQogewotCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKIAogCUJVR19PTihyZWcgPiBXTTg5OTRfTUFYX1JFR0lTVEVSKTsKIAotCWlmICghd204OTk0X3ZvbGF0aWxlKHJlZykpCi0JCXdtODk5NC0+cmVnX2NhY2hlW3JlZ10gPSB2YWx1ZTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIjB4JXggPSAweCV4XG4iLCByZWcsIHZhbHVlKTsKKwlpZiAoIXdtODk5NF92b2xhdGlsZShyZWcpKSB7CisJCXJldCA9IHNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYWNoZSB3cml0ZSB0byAleCBmYWlsZWQ6ICVkXG4iLAorCQkJCXJlZywgcmV0KTsKKwl9CiAKIAlyZXR1cm4gd204OTk0X3JlZ193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCByZWcsIHZhbHVlKTsKIH0KQEAgLTE3MzgsMTQgKzE3NywyMiBAQAogc3RhdGljIHVuc2lnbmVkIGludCB3bTg5OTRfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJdW5zaWduZWQgaW50IHJlZykKIHsKLQl1MTYgKnJlZ19jYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OwogCiAJQlVHX09OKHJlZyA+IFdNODk5NF9NQVhfUkVHSVNURVIpOwogCi0JaWYgKHdtODk5NF92b2xhdGlsZShyZWcpKQotCQlyZXR1cm4gd204OTk0X3JlZ19yZWFkKGNvZGVjLT5jb250cm9sX2RhdGEsIHJlZyk7Ci0JZWxzZQotCQlyZXR1cm4gcmVnX2NhY2hlW3JlZ107CisJaWYgKCF3bTg5OTRfdm9sYXRpbGUocmVnKSAmJiB3bTg5OTRfcmVhZGFibGUocmVnKSAmJgorCSAgICByZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3JlYWQoY29kZWMsIHJlZywgJnZhbCk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldHVybiB2YWw7CisJCWVsc2UKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhY2hlIHJlYWQgZnJvbSAleCBmYWlsZWQ6ICVkXG4iLAorCQkJCXJlZywgcmV0KTsKKwl9CisKKwlyZXR1cm4gd204OTk0X3JlZ19yZWFkKGNvZGVjLT5jb250cm9sX2RhdGEsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbnQgY29uZmlndXJlX2FpZl9jbG9jayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBhaWYpCkBAIC0xODM3LDcgKzI4NCw3IEBACiAKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQ0xPQ0tJTkdfMSwgV004OTk0X1NZU0NMS19TUkMsIG5ldyk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTg2NCw2ICszMTEsMTkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2lkZXRvbmVfaHBmID0KIAlTT0NfRU5VTV9TSU5HTEUoV004OTk0X1NJREVUT05FLCA3LCA3LCBzaWRldG9uZV9ocGZfdGV4dCk7CiAKK3N0YXRpYyBjb25zdCBjaGFyICphZGNfaHBmX3RleHRbXSA9IHsKKwkiSGlGaSIsICJWb2ljZSAxIiwgIlZvaWNlIDIiLCAiVm9pY2UgMyIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMWFkYzFfaHBmID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjFfQURDMV9GSUxURVJTLCAxMywgNCwgYWRjX2hwZl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWYxYWRjMl9ocGYgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfQUlGMV9BREMyX0ZJTFRFUlMsIDEzLCA0LCBhZGNfaHBmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjJhZGNfaHBmID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjJfQURDX0ZJTFRFUlMsIDEzLCA0LCBhZGNfaHBmX3RleHQpOworCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWlmX3RsdiwgMCwgNjAwLCAwKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTcyMDAsIDc1LCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzdF90bHYsIC0zNjAwLCAzMDAsIDApOwpAQCAtMjA3MSwyMSArNTMxLDI1MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqYWlmZGFjX3NyY190ZXh0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYWlmX2NoYW5fc3JjX3RleHRbXSA9IHsKIAkiTGVmdCIsICJSaWdodCIKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMWFkY2xfc3JjID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjFfQ09OVFJPTF8xLCAxNSwgMiwgYWlmX2NoYW5fc3JjX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjFhZGNyX3NyYyA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9BSUYxX0NPTlRST0xfMSwgMTQsIDIsIGFpZl9jaGFuX3NyY190ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWYyYWRjbF9zcmMgPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfQUlGMl9DT05UUk9MXzEsIDE1LCAyLCBhaWZfY2hhbl9zcmNfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMmFkY3Jfc3JjID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjJfQ09OVFJPTF8xLCAxNCwgMiwgYWlmX2NoYW5fc3JjX3RleHQpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjFkYWNsX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5NF9BSUYxX0NPTlRST0xfMiwgMTUsIDIsIGFpZmRhY19zcmNfdGV4dCk7CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9BSUYxX0NPTlRST0xfMiwgMTUsIDIsIGFpZl9jaGFuX3NyY190ZXh0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWYxZGFjcl9zcmMgPQotCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfQUlGMV9DT05UUk9MXzIsIDE0LCAyLCBhaWZkYWNfc3JjX3RleHQpOworCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfQUlGMV9DT05UUk9MXzIsIDE0LCAyLCBhaWZfY2hhbl9zcmNfdGV4dCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMmRhY2xfc3JjID0KLQlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjJfQ09OVFJPTF8yLCAxNSwgMiwgYWlmZGFjX3NyY190ZXh0KTsKKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X0FJRjJfQ09OVFJPTF8yLCAxNSwgMiwgYWlmX2NoYW5fc3JjX3RleHQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFpZjJkYWNyX3NyYyA9Ci0JU09DX0VOVU1fU0lOR0xFKFdNODk5NF9BSUYyX0NPTlRST0xfMiwgMTQsIDIsIGFpZmRhY19zcmNfdGV4dCk7CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9BSUYyX0NPTlRST0xfMiwgMTQsIDIsIGFpZl9jaGFuX3NyY190ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm9zcl90ZXh0W10gPSB7CisJIkxvdyBQb3dlciIsICJIaWdoIFBlcmZvcm1hbmNlIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGFjX29zciA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9PVkVSU0FNUExJTkcsIDAsIDIsIG9zcl90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZGNfb3NyID0KKwlTT0NfRU5VTV9TSU5HTEUoV004OTk0X09WRVJTQU1QTElORywgMSwgMiwgb3NyX3RleHQpOworCitzdGF0aWMgdm9pZCB3bTg5NThfbWJjX2FwcGx5KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1iYywgaW50IHN0YXJ0KQoreworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdtODk5NF9wZGF0YSAqcGRhdGEgPSB3bTg5OTQtPnBkYXRhOworCWludCBwd3JfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81KTsKKwlpbnQgZW5hLCByZWcsIGFpZiwgaTsKKworCXN3aXRjaCAobWJjKSB7CisJY2FzZSAwOgorCQlwd3JfcmVnICY9IChXTTg5OTRfQUlGMURBQzFMX0VOQSB8IFdNODk5NF9BSUYxREFDMVJfRU5BKTsKKwkJYWlmID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwd3JfcmVnICY9IChXTTg5OTRfQUlGMURBQzJMX0VOQSB8IFdNODk5NF9BSUYxREFDMlJfRU5BKTsKKwkJYWlmID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwd3JfcmVnICY9IChXTTg5OTRfQUlGMkRBQ0xfRU5BIHwgV004OTk0X0FJRjJEQUNSX0VOQSk7CisJCWFpZiA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJLyogV2UgY2FuIG9ubHkgZW5hYmxlIHRoZSBNQkMgaWYgdGhlIEFJRiBpcyBlbmFibGVkIGFuZCB3ZQorCSAqIHdhbnQgaXQgdG8gYmUgZW5hYmxlZC4gKi8KKwllbmEgPSBwd3JfcmVnICYmIHdtODk5NC0+bWJjX2VuYVttYmNdOworCisJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NThfRFNQMl9QUk9HUkFNKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIk1CQyAlZCBzdGFydHVwOiAlZCwgcG93ZXI6ICV4LCBEU1A6ICV4XG4iLAorCQltYmMsIHN0YXJ0LCBwd3JfcmVnLCByZWcpOworCisJaWYgKHN0YXJ0ICYmIGVuYSkgeworCQkvKiBJZiB0aGUgRFNQIGlzIGFscmVhZHkgcnVubmluZyB0aGVuIG5vb3AgKi8KKwkJaWYgKHJlZyAmIFdNODk1OF9EU1AyX0VOQSkKKwkJCXJldHVybjsKKworCQkvKiBTd2l0Y2ggdGhlIGNsb2NrIG92ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIEFJRiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQ0xPQ0tJTkdfMSwKKwkJCQkgICAgV004OTU4X0RTUDJDTEtfU1JDIHwgV004OTU4X0RTUDJDTEtfRU5BLAorCQkJCSAgICBhaWYgPDwgV004OTU4X0RTUDJDTEtfU1JDX1NISUZUIHwKKwkJCQkgICAgV004OTU4X0RTUDJDTEtfRU5BKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfRFNQMl9QUk9HUkFNLAorCQkJCSAgICBXTTg5NThfRFNQMl9FTkEsIFdNODk1OF9EU1AyX0VOQSk7CisKKwkJLyogSWYgd2UndmUgZ290IHVzZXIgc3VwcGxpZWQgTUJDIHNldHRpbmdzIHVzZSB0aGVtICovCisJCWlmIChwZGF0YSAmJiBwZGF0YS0+bnVtX21iY19jZmdzKSB7CisJCQlzdHJ1Y3Qgd204OTU4X21iY19jZmcgKmNmZworCQkJCT0gJnBkYXRhLT5tYmNfY2Znc1t3bTg5OTQtPm1iY19jZmddOworCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjZmctPmNvZWZmX3JlZ3MpOyBpKyspCisJCQkJc25kX3NvY193cml0ZShjb2RlYywgaSArIFdNODk1OF9NQkNfQkFORF8xX0tfMSwKKwkJCQkJICAgICAgY2ZnLT5jb2VmZl9yZWdzW2ldKTsKKworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2ZnLT5jdXRvZmZfcmVncyk7IGkrKykKKwkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLAorCQkJCQkgICAgICBpICsgV004OTU4X01CQ19CQU5EXzJfTE9XRVJfQ1VUT0ZGX0MxXzEsCisJCQkJCSAgICAgIGNmZy0+Y3V0b2ZmX3JlZ3NbaV0pOworCQl9CisKKwkJLyogUnVuIHRoZSBEU1AgKi8KKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTU4X0RTUDJfRVhFQ0NPTlRST0wsCisJCQkgICAgICBXTTg5NThfRFNQMl9SVU5SKTsKKworCQkvKiBBbmQgd2UncmUgb2ZmISAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfRFNQMl9DT05GSUcsCisJCQkJICAgIFdNODk1OF9NQkNfRU5BIHwgV004OTU4X01CQ19TRUxfTUFTSywKKwkJCQkgICAgbWJjIDw8IFdNODk1OF9NQkNfU0VMX1NISUZUIHwKKwkJCQkgICAgV004OTU4X01CQ19FTkEpOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBEU1AgaXMgYWxyZWFkeSBzdG9wcGVkIHRoZW4gbm9vcCAqLworCQlpZiAoIShyZWcgJiBXTTg5NThfRFNQMl9FTkEpKQorCQkJcmV0dXJuOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk1OF9EU1AyX0NPTkZJRywKKwkJCQkgICAgV004OTU4X01CQ19FTkEsIDApOwkKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X0RTUDJfUFJPR1JBTSwKKwkJCQkgICAgV004OTU4X0RTUDJfRU5BLCAwKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk0X0NMT0NLSU5HXzEsCisJCQkJICAgIFdNODk1OF9EU1AyQ0xLX0VOQSwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHdtODk1OF9haWZfZXYoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHctPmNvZGVjOworCWludCBtYmM7CisKKwlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJY2FzZSAxMzoKKwljYXNlIDEyOgorCQltYmMgPSAyOworCQlicmVhazsKKwljYXNlIDExOgorCWNhc2UgMTA6CisJCW1iYyA9IDE7CisJCWJyZWFrOworCWNhc2UgOToKKwljYXNlIDg6CisJCW1iYyA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXdtODk1OF9tYmNfYXBwbHkoY29kZWMsIG1iYywgMSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQl3bTg5NThfbWJjX2FwcGx5KGNvZGVjLCBtYmMsIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NThfcHV0X21iY19lbnVtKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3bTg5OTRfcGRhdGEgKnBkYXRhID0gd204OTk0LT5wZGF0YTsKKwlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpbnQgcmVnOworCisJLyogRG9uJ3QgYWxsb3cgb24gdGhlIGZseSByZWNvbmZpZ3VyYXRpb24gKi8KKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5NF9DTE9DS0lOR18xKTsKKwlpZiAocmVnIDwgMCB8fCByZWcgJiBXTTg5NThfRFNQMkNMS19FTkEpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodmFsdWUgPj0gcGRhdGEtPm51bV9tYmNfY2ZncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3bTg5OTQtPm1iY19jZmcgPSB2YWx1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk1OF9nZXRfbWJjX2VudW0oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gd204OTk0LT5tYmNfY2ZnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTU4X21iY19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5NThfbWJjX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IG1iYyA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3bTg5OTQtPm1iY19lbmFbbWJjXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk1OF9tYmNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgbWJjID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW50IGk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+bWJjX2VuYSk7IGkrKykgeworCQlpZiAobWJjICE9IGkgJiYgd204OTk0LT5tYmNfZW5hW2ldKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJNQkMgJWQgYWN0aXZlIGFscmVhZHlcbiIsIG1iYyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJd204OTk0LT5tYmNfZW5hW21iY10gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXdtODk1OF9tYmNfYXBwbHkoY29kZWMsIG1iYywgd204OTk0LT5tYmNfZW5hW21iY10pOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV004OTU4X01CQ19TV0lUQ0goeG5hbWUsIHh2YWwpIHtcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0gKHhuYW1lKSwgXAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLFwKKwkuaW5mbyA9IHdtODk1OF9tYmNfaW5mbywgXAorCS5nZXQgPSB3bTg5NThfbWJjX2dldCwgLnB1dCA9IHdtODk1OF9tYmNfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSB4dmFsIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5NF9zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIkFJRjFBREMxIFZvbHVtZSIsIFdNODk5NF9BSUYxX0FEQzFfTEVGVF9WT0xVTUUsCkBAIC0yMDk4LDEwICs3ODksMTUgQEAKIAkJIFdNODk5NF9BSUYyX0FEQ19SSUdIVF9WT0xVTUUsCiAJCSAxLCAxMTksIDAsIGRpZ2l0YWxfdGx2KSwKIAorU09DX0VOVU0oIkFJRjFBRENMIFNvdXJjZSIsIGFpZjFhZGNsX3NyYyksCitTT0NfRU5VTSgiQUlGMUFEQ1IgU291cmNlIiwgYWlmMWFkY3Jfc3JjKSwKK1NPQ19FTlVNKCJBSUYyQURDTCBTb3VyY2UiLCBhaWYyYWRjbF9zcmMpLAorU09DX0VOVU0oIkFJRjJBRENSIFNvdXJjZSIsIGFpZjJhZGNyX3NyYyksCisKIFNPQ19FTlVNKCJBSUYxREFDTCBTb3VyY2UiLCBhaWYxZGFjbF9zcmMpLAogU09DX0VOVU0oIkFJRjFEQUNSIFNvdXJjZSIsIGFpZjFkYWNyX3NyYyksCi1TT0NfRU5VTSgiQUlGMkRBQ0wgU291cmNlIiwgYWlmMWRhY2xfc3JjKSwKLVNPQ19FTlVNKCJBSUYyREFDUiBTb3VyY2UiLCBhaWYxZGFjcl9zcmMpLAorU09DX0VOVU0oIkFJRjJEQUNMIFNvdXJjZSIsIGFpZjJkYWNsX3NyYyksCitTT0NfRU5VTSgiQUlGMkRBQ1IgU291cmNlIiwgYWlmMmRhY3Jfc3JjKSwKIAogU09DX0RPVUJMRV9SX1RMVigiQUlGMURBQzEgVm9sdW1lIiwgV004OTk0X0FJRjFfREFDMV9MRUZUX1ZPTFVNRSwKIAkJIFdNODk5NF9BSUYxX0RBQzFfUklHSFRfVk9MVU1FLCAxLCA5NiwgMCwgZGlnaXRhbF90bHYpLApAQCAtMjE0MCw2ICs4MzYsMTggQEAKIFNPQ19FTlVNKCJTaWRldG9uZSBIUEYgTXV4Iiwgc2lkZXRvbmVfaHBmKSwKIFNPQ19TSU5HTEUoIlNpZGV0b25lIEhQRiBTd2l0Y2giLCBXTTg5OTRfU0lERVRPTkUsIDYsIDEsIDApLAogCitTT0NfRU5VTSgiQUlGMUFEQzEgSFBGIE1vZGUiLCBhaWYxYWRjMV9ocGYpLAorU09DX0RPVUJMRSgiQUlGMUFEQzEgSFBGIFN3aXRjaCIsIFdNODk5NF9BSUYxX0FEQzFfRklMVEVSUywgMTIsIDExLCAxLCAwKSwKKworU09DX0VOVU0oIkFJRjFBREMyIEhQRiBNb2RlIiwgYWlmMWFkYzJfaHBmKSwKK1NPQ19ET1VCTEUoIkFJRjFBREMyIEhQRiBTd2l0Y2giLCBXTTg5OTRfQUlGMV9BREMyX0ZJTFRFUlMsIDEyLCAxMSwgMSwgMCksCisKK1NPQ19FTlVNKCJBSUYyQURDIEhQRiBNb2RlIiwgYWlmMmFkY19ocGYpLAorU09DX0RPVUJMRSgiQUlGMkFEQyBIUEYgU3dpdGNoIiwgV004OTk0X0FJRjJfQURDX0ZJTFRFUlMsIDEyLCAxMSwgMSwgMCksCisKK1NPQ19FTlVNKCJBREMgT1NSIiwgYWRjX29zciksCitTT0NfRU5VTSgiREFDIE9TUiIsIGRhY19vc3IpLAorCiBTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFZvbHVtZSIsIFdNODk5NF9EQUMxX0xFRlRfVk9MVU1FLAogCQkgV004OTk0X0RBQzFfUklHSFRfVk9MVU1FLCAxLCA5NiwgMCwgZGlnaXRhbF90bHYpLAogU09DX0RPVUJMRV9SKCJEQUMxIFN3aXRjaCIsIFdNODk5NF9EQUMxX0xFRlRfVk9MVU1FLApAQCAtMjE2MiwxNSArODcwLDE1IEBACiAKIFNPQ19TSU5HTEVfVExWKCJBSUYxREFDMSAzRCBTdGVyZW8gVm9sdW1lIiwgV004OTk0X0FJRjFfREFDMV9GSUxURVJTXzIsCiAJICAgICAgIDEwLCAxNSwgMCwgd204OTk0XzNkX3RsdiksCi1TT0NfU0lOR0xFKCJBSUYxREFDMSAzRCBTdGVyZW8gU3dpdGNoIiwgV004OTk0X0FJRjFfREFDMl9GSUxURVJTXzIsCitTT0NfU0lOR0xFKCJBSUYxREFDMSAzRCBTdGVyZW8gU3dpdGNoIiwgV004OTk0X0FJRjFfREFDMV9GSUxURVJTXzIsCiAJICAgOCwgMSwgMCksCiBTT0NfU0lOR0xFX1RMVigiQUlGMURBQzIgM0QgU3RlcmVvIFZvbHVtZSIsIFdNODk5NF9BSUYxX0RBQzJfRklMVEVSU18yLAogCSAgICAgICAxMCwgMTUsIDAsIHdtODk5NF8zZF90bHYpLAogU09DX1NJTkdMRSgiQUlGMURBQzIgM0QgU3RlcmVvIFN3aXRjaCIsIFdNODk5NF9BSUYxX0RBQzJfRklMVEVSU18yLAogCSAgIDgsIDEsIDApLAotU09DX1NJTkdMRV9UTFYoIkFJRjJEQUMgM0QgU3RlcmVvIFZvbHVtZSIsIFdNODk5NF9BSUYxX0RBQzFfRklMVEVSU18yLAorU09DX1NJTkdMRV9UTFYoIkFJRjJEQUMgM0QgU3RlcmVvIFZvbHVtZSIsIFdNODk5NF9BSUYyX0RBQ19GSUxURVJTXzIsCiAJICAgICAgIDEwLCAxNSwgMCwgd204OTk0XzNkX3RsdiksCi1TT0NfU0lOR0xFKCJBSUYyREFDIDNEIFN0ZXJlbyBTd2l0Y2giLCBXTTg5OTRfQUlGMV9EQUMyX0ZJTFRFUlNfMiwKK1NPQ19TSU5HTEUoIkFJRjJEQUMgM0QgU3RlcmVvIFN3aXRjaCIsIFdNODk5NF9BSUYyX0RBQ19GSUxURVJTXzIsCiAJICAgOCwgMSwgMCksCiB9OwogCkBAIC0yMjA5LDYgKzkxNywxMyBAQAogCSAgICAgICBlcV90bHYpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk1OF9zbmRfY29udHJvbHNbXSA9IHsKK1NPQ19TSU5HTEVfVExWKCJBSUYzIEJvb3N0IFZvbHVtZSIsIFdNODk1OF9BSUYzX0NPTlRST0xfMiwgMTAsIDMsIDAsIGFpZl90bHYpLAorV004OTU4X01CQ19TV0lUQ0goIkFJRjFEQUMxIE1CQyBTd2l0Y2giLCAwKSwKK1dNODk1OF9NQkNfU1dJVENIKCJBSUYxREFDMiBNQkMgU3dpdGNoIiwgMSksCitXTTg5NThfTUJDX1NXSVRDSCgiQUlGMkRBQyBNQkMgU3dpdGNoIiwgMiksCit9OworCiBzdGF0aWMgaW50IGNsa19zeXNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCiAJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKIHsKQEAgLTIyMjgsNiArOTQzLDcgQEAKIAogc3RhdGljIHZvaWQgd204OTk0X3VwZGF0ZV9jbGFzc193KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCWludCBlbmFibGUgPSAxOwogCWludCBzb3VyY2UgPSAwOyAgLyogR0NDIGZsb3cgYW5hbHlzaXMgY2FuJ3QgdHJhY2sgZW5hYmxlICovCiAJaW50IHJlZywgcmVnX3I7CkBAIC0yMjc4LDExICs5OTQsMTMgQEAKIAkJCQkgICAgV004OTk0X0NQX0RZTl9QV1IgfAogCQkJCSAgICBXTTg5OTRfQ1BfRFlOX1NSQ19TRUxfTUFTSywKIAkJCQkgICAgc291cmNlIHwgV004OTk0X0NQX0RZTl9QV1IpOworCQl3bTg5OTQtPmh1YnMuY2xhc3NfdyA9IHRydWU7CiAJCQogCX0gZWxzZSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIkNsYXNzIFcgZGlzYWJsZWRcbiIpOwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQ0xBU1NfV18xLAogCQkJCSAgICBXTTg5OTRfQ1BfRFlOX1BXUiwgMCk7CisJCXdtODk5NC0+aHVicy5jbGFzc193ID0gZmFsc2U7CiAJfQogfQogCkBAIC0yNTEyLDE0ICsxMjMwLDQ3IEBACiAJU09DX0RBUE1fRU5VTSgiQUlGMkFEQyBNdXgiLCBhaWYyYWRjX2VudW0pOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWlmM2FkY190ZXh0W10gPSB7Ci0JIkFJRjFBRENEQVQiLCAiQUlGMkFEQ0RBVCIsICJBSUYyREFDREFUIiwKKwkiQUlGMUFEQ0RBVCIsICJBSUYyQURDREFUIiwgIkFJRjJEQUNEQVQiLCAiTW9ubyBQQ00iLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWYzYWRjX2VudW0gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3bTg5OTRfYWlmM2FkY19lbnVtID0KIAlTT0NfRU5VTV9TSU5HTEUoV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNiwgMywgMywgYWlmM2FkY190ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjNhZGNfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJBSUYzQURDIE11eCIsIGFpZjNhZGNfZW51bSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTk0X2FpZjNhZGNfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBSUYzQURDIE11eCIsIHdtODk5NF9haWYzYWRjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHdtODk1OF9haWYzYWRjX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF82LCAzLCA0LCBhaWYzYWRjX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204OTU4X2FpZjNhZGNfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJBSUYzQURDIE11eCIsIHdtODk1OF9haWYzYWRjX2VudW0pOworCitzdGF0aWMgY29uc3QgY2hhciAqbW9ub19wY21fb3V0X3RleHRbXSA9IHsKKwkiTm9uZSIsICJBSUYyQURDTCIsICJBSUYyQURDUiIsIAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtb25vX3BjbV9vdXRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzYsIDksIDMsIG1vbm9fcGNtX291dF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1vbm9fcGNtX291dF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIk1vbm8gUENNIE91dCBNdXgiLCBtb25vX3BjbV9vdXRfZW51bSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICphaWYyZGFjX3NyY190ZXh0W10gPSB7CisJIkFJRjIiLCAiQUlGMyIsCit9OworCisvKiBOb3RlIHRoYXQgdGhlc2UgdHdvIGNvbnRyb2wgc2hvdWxkbid0IGJlIHNpbXVsdGFuZW91c2x5IHN3aXRjaGVkIHRvIEFJRjMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWlmMmRhY2xfc3JjX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF82LCA3LCAyLCBhaWYyZGFjX3NyY190ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjJkYWNsX3NyY19tdXggPQorCVNPQ19EQVBNX0VOVU0oIkFJRjJEQUNMIE11eCIsIGFpZjJkYWNsX3NyY19lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhaWYyZGFjcl9zcmNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzYsIDgsIDIsIGFpZjJkYWNfc3JjX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMmRhY3Jfc3JjX211eCA9CisJU09DX0RBUE1fRU5VTSgiQUlGMkRBQ1IgTXV4IiwgYWlmMmRhY3Jfc3JjX2VudW0pOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204OTk0X2RhcG1fd2lkZ2V0c1tdID0gewogU05EX1NPQ19EQVBNX0lOUFVUKCJETUlDMURBVCIpLApAQCAtMjU0MCwxOSArMTI5MSwyMyBAQAogCQkgICAgIDAsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDksIDApLAogU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjFBREMxUiIsICJBSUYxIENhcHR1cmUiLAogCQkgICAgIDAsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDgsIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMURBQzFMIiwgTlVMTCwgMCwKLQkJICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzUsIDksIDApLAotU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMURBQzFSIiwgTlVMTCwgMCwKLQkJICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzUsIDgsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYxREFDMUwiLCBOVUxMLCAwLAorCQkgICAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81LCA5LCAwLCB3bTg5NThfYWlmX2V2LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYxREFDMVIiLCBOVUxMLCAwLAorCQkgICAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81LCA4LCAwLCB3bTg5NThfYWlmX2V2LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAogCiBTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMUFEQzJMIiwgIkFJRjEgQ2FwdHVyZSIsCiAJCSAgICAgMCwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNCwgMTEsIDApLAogU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjFBREMyUiIsICJBSUYxIENhcHR1cmUiLAogCQkgICAgIDAsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDEwLCAwKSwKLVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjFEQUMyTCIsIE5VTEwsIDAsCi0JCSAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81LCAxMSwgMCksCi1TTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxREFDMlIiLCBOVUxMLCAwLAotCQkgICAgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNSwgMTAsIDApLAorU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYxREFDMkwiLCBOVUxMLCAwLAorCQkgICAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81LCAxMSwgMCwgd204OTU4X2FpZl9ldiwKKwkJICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK1NORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGMURBQzJSIiwgTlVMTCwgMCwKKwkJICAgICAgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNSwgMTAsIDAsIHdtODk1OF9haWZfZXYsCisJCSAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiAKIFNORF9TT0NfREFQTV9NSVhFUigiQUlGMUFEQzFMIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkgICBhaWYxYWRjMWxfbWl4LCBBUlJBWV9TSVpFKGFpZjFhZGMxbF9taXgpKSwKQEAgLTI1ODEsMTAgKzEzMzYsMTIgQEAKIAkJICAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF80LCAxMywgMCksCiBTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMkFEQ1IiLCBOVUxMLCAwLAogCQkgICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDEyLCAwKSwKLVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJEQUNMIiwgTlVMTCwgMCwKLQkJICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzUsIDEzLCAwKSwKLVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjJEQUNSIiwgTlVMTCwgMCwKLQkJICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzUsIDEyLCAwKSwKK1NORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGMkRBQ0wiLCBOVUxMLCAwLAorCQkgICAgICBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF81LCAxMywgMCwgd204OTU4X2FpZl9ldiwKKwkJICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYyREFDUiIsIE5VTEwsIDAsCisJCSAgICAgIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzUsIDEyLCAwLCB3bTg5NThfYWlmX2V2LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCiAKIFNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjFEQUNEQVQiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYyREFDREFUIiwgIkFJRjIgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLApAQCAtMjU5Myw3ICsxMzUwLDYgQEAKIFNORF9TT0NfREFQTV9NVVgoIkFJRjFEQUMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWlmMWRhY19tdXgpLAogU05EX1NPQ19EQVBNX01VWCgiQUlGMkRBQyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhaWYyZGFjX211eCksCiBTTkRfU09DX0RBUE1fTVVYKCJBSUYyQURDIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmFpZjJhZGNfbXV4KSwKLVNORF9TT0NfREFQTV9NVVgoIkFJRjNBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmYWlmM2FkY19tdXgpLAogCiBTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYzREFDREFUIiwgIkFJRjMgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAogU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGM0FEQ0RBVCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLApAQCAtMjYzMSw4ICsxMzg3LDE4IEBACiBTTkRfU09DX0RBUE1fUE9TVCgiRGVidWcgbG9nIiwgcG9zdF9ldiksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODk5NF9zcGVjaWZpY19kYXBtX3dpZGdldHNbXSA9IHsKK1NORF9TT0NfREFQTV9NVVgoIkFJRjNBREMgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmd204OTk0X2FpZjNhZGNfbXV4KSwKK307CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg5NThfZGFwbV93aWRnZXRzW10gPSB7CitTTkRfU09DX0RBUE1fTVVYKCJNb25vIFBDTSBPdXQgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmbW9ub19wY21fb3V0X211eCksCitTTkRfU09DX0RBUE1fTVVYKCJBSUYyREFDTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhaWYyZGFjbF9zcmNfbXV4KSwKK1NORF9TT0NfREFQTV9NVVgoIkFJRjJEQUNSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmFpZjJkYWNyX3NyY19tdXgpLAorU05EX1NPQ19EQVBNX01VWCgiQUlGM0FEQyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg5NThfYWlmM2FkY19tdXgpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb25bXSA9IHsKIAl7ICJDTEtfU1lTIiwgTlVMTCwgIkFJRjFDTEsiLCBjaGVja19jbGtfc3lzIH0sCiAJeyAiQ0xLX1NZUyIsIE5VTEwsICJBSUYyQ0xLIiwgY2hlY2tfY2xrX3N5cyB9LAogCkBAIC0yNzQwLDkgKzE1MDYsNiBAQAogCXsgIkFJRjFEQUMyTCIsIE5VTEwsICJBSUYxREFDIE11eCIgfSwKIAl7ICJBSUYxREFDMlIiLCBOVUxMLCAiQUlGMURBQyBNdXgiIH0sCiAKLQl7ICJBSUYyREFDTCIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKLQl7ICJBSUYyREFDUiIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKLQogCXsgIkFJRjFEQUMgTXV4IiwgIkFJRjFEQUNEQVQiLCAiQUlGMURBQ0RBVCIgfSwKIAl7ICJBSUYxREFDIE11eCIsICJBSUYzREFDREFUIiwgIkFJRjNEQUNEQVQiIH0sCiAJeyAiQUlGMkRBQyBNdXgiLCAiQUlGMkRBQ0RBVCIsICJBSUYyREFDREFUIiB9LApAQCAtMjgxNSw2ICsxNTc4LDI2IEBACiAJeyAiUmlnaHQgSGVhZHBob25lIE11eCIsICJEQUMiLCAiREFDMVIiIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5OTRfaW50ZXJjb25bXSA9IHsKKwl7ICJBSUYyREFDTCIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKKwl7ICJBSUYyREFDUiIsIE5VTEwsICJBSUYyREFDIE11eCIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdtODk1OF9pbnRlcmNvbltdID0geworCXsgIkFJRjJEQUNMIiwgTlVMTCwgIkFJRjJEQUNMIE11eCIgfSwKKwl7ICJBSUYyREFDUiIsIE5VTEwsICJBSUYyREFDUiBNdXgiIH0sCisKKwl7ICJBSUYyREFDTCBNdXgiLCAiQUlGMiIsICJBSUYyREFDIE11eCIgfSwKKwl7ICJBSUYyREFDTCBNdXgiLCAiQUlGMyIsICJBSUYzREFDREFUIiB9LAorCXsgIkFJRjJEQUNSIE11eCIsICJBSUYyIiwgIkFJRjJEQUMgTXV4IiB9LAorCXsgIkFJRjJEQUNSIE11eCIsICJBSUYzIiwgIkFJRjNEQUNEQVQiIH0sCisKKwl7ICJNb25vIFBDTSBPdXQgTXV4IiwgIkFJRjJBRENMIiwgIkFJRjJBRENMIiB9LAorCXsgIk1vbm8gUENNIE91dCBNdXgiLCAiQUlGMkFEQ1IiLCAiQUlGMkFEQ1IiIH0sCisKKwl7ICJBSUYzQURDIE11eCIsICJNb25vIFBDTSIsICJNb25vIFBDTSBPdXQgTXV4IiB9LAorfTsKKwogLyogVGhlIHNpemUgaW4gYml0cyBvZiB0aGUgRkxMIGRpdmlkZSBtdWx0aXBsaWVkIGJ5IDEwCiAgKiB0byBhbGxvdyByb3VuZGluZyBsYXRlciAqLwogI2RlZmluZSBGSVhFRF9GTExfU0laRSAoKDEgPDwgMTYpICogMTApCkBAIC0yOTMwLDYgKzE3MTMsNyBAQAogCQkvKiBBbGxvdyBubyBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aGVuIHN0b3BwaW5nICovCiAJCWlmIChmcmVxX291dCkKIAkJCXJldHVybiAtRUlOVkFMOworCQlzcmMgPSB3bTg5OTQtPmZsbFtpZF0uc3JjOwogCQlicmVhazsKIAljYXNlIFdNODk5NF9GTExfU1JDX01DTEsxOgogCWNhc2UgV004OTk0X0ZMTF9TUkNfTUNMSzI6CkBAIC0zMDk0LDYgKzE4NzgsNyBAQAogc3RhdGljIGludCB3bTg5OTRfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKKwlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCiAJc3dpdGNoIChsZXZlbCkgewpAQCAtMzEwNywxNiArMTg5MiwzNiBAQAogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7Ci0JCQkvKiBUd2VhayBEQyBzZXJ2byBhbmQgRFNQIGNvbmZpZ3VyYXRpb24gZm9yCi0JCQkgKiBpbXByb3ZlZCBwZXJmb3JtYW5jZS4gKi8KLQkJCWlmICh3bTg5OTQtPnJldmlzaW9uIDwgNCkgewotCQkJCS8qIFR3ZWFrIERDIHNlcnZvIGFuZCBEU1AgY29uZmlndXJhdGlvbiBmb3IKLQkJCQkgKiBpbXByb3ZlZCBwZXJmb3JtYW5jZS4gKi8KLQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDEwMiwgMHgzKTsKLQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDU2LCAweDMpOwotCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4ODE3LCAwKTsKLQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDEwMiwgMCk7CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoY29kZWMtPmRldik7CisKKwkJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQkJY2FzZSBXTTg5OTQ6CisJCQkJaWYgKHdtODk5NC0+cmV2aXNpb24gPCA0KSB7CisJCQkJCS8qIFR3ZWFrIERDIHNlcnZvIGFuZCBEU1AKKwkJCQkJICogY29uZmlndXJhdGlvbiBmb3IgaW1wcm92ZWQKKwkJCQkJICogcGVyZm9ybWFuY2UuICovCisJCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTAyLCAweDMpOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDU2LCAweDMpOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDgxNywgMCk7CisJCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTAyLCAwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV004OTU4OgorCQkJCWlmICh3bTg5OTQtPnJldmlzaW9uID09IDApIHsKKwkJCQkJLyogT3B0aW1pc2UgcGVyZm9ybWFuY2UgZm9yIHJldiBBICovCisJCQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4MTAyLCAweDMpOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweGNiLCAweDgxKTsKKwkJCQkJc25kX3NvY193cml0ZShjb2RlYywgMHg4MTcsIDApOworCQkJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweDEwMiwgMCk7CisKKwkJCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKKwkJCQkJCQkgICAgV004OTU4X0NIQVJHRV9QVU1QXzIsCisJCQkJCQkJICAgIFdNODk1OF9DUF9ESVNDSCwKKwkJCQkJCQkgICAgV004OTU4X0NQX0RJU0NIKTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIERpc2NoYXJnZSBMSU5FT1VUMSAmIDIgKi8KQEAgLTMxNTEsNyArMTk1Niw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKIAkJCS8qIFN3aXRjaCBvdmVyIHRvIHN0YXJ0dXAgYmlhc2VzICovCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTRfQU5USVBPUF8yLAogCQkJCQkgICAgV004OTk0X0JJQVNfU1JDIHwKQEAgLTMxODMsMTYgKzE5ODgsMTkgQEAKIAkJCQkJICAgIFdNODk5NF9TVEFSVFVQX0JJQVNfRU5BIHwKIAkJCQkJICAgIFdNODk5NF9WTUlEX0JVRl9FTkEgfAogCQkJCQkgICAgV004OTk0X1ZNSURfUkFNUF9NQVNLLCAwKTsKKworCQkJcG1fcnVudGltZV9wdXQoY29kZWMtPmRldik7CiAJCX0KIAkJYnJlYWs7CiAJfQotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtODk5NF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCWludCBtc19yZWc7CiAJaW50IGFpZjFfcmVnOwogCWludCBtcyA9IDA7CkBAIC0zMjc3LDYgKzIwODUsMTMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogVGhlIEFJRjIgZm9ybWF0IGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgbWlycm9yZWQgdG8gQUlGMworCSAqIG9uIFdNODk1OCBpZiBpdCdzIGluIHVzZSBzbyBqdXN0IGRvIGl0IGFsbCB0aGUgdGltZS4gKi8KKwlpZiAoY29udHJvbC0+dHlwZSA9PSBXTTg5NTggJiYgZGFpLT5pZCA9PSAyKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NThfQUlGM19DT05UUk9MXzEsCisJCQkJICAgIFdNODk5NF9BSUYxX0xSQ0xLX0lOViB8CisJCQkJICAgIFdNODk1OF9BSUYzX0ZNVF9NQVNLLCBhaWYxKTsKKwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFpZjFfcmVnLAogCQkJICAgIFdNODk5NF9BSUYxX0JDTEtfSU5WIHwgV004OTk0X0FJRjFfTFJDTEtfSU5WIHwKIAkJCSAgICBXTTg5OTRfQUlGMV9GTVRfTUFTSywKQEAgLTMzMTcsMTIgKzIxMzIsMTUgQEAKIAkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IGFpZjFfcmVnOworCWludCBhaWYyX3JlZzsKIAlpbnQgYmNsa19yZWc7CiAJaW50IGxyY2xrX3JlZzsKIAlpbnQgcmF0ZV9yZWc7CiAJaW50IGFpZjEgPSAwOworCWludCBhaWYyID0gMDsKIAlpbnQgYmNsayA9IDA7CiAJaW50IGxyY2xrID0gMDsKIAlpbnQgcmF0ZV92YWwgPSAwOwpAQCAtMzMzMyw2ICsyMTUxLDcgQEAKIAlzd2l0Y2ggKGRhaS0+aWQpIHsKIAljYXNlIDE6CiAJCWFpZjFfcmVnID0gV004OTk0X0FJRjFfQ09OVFJPTF8xOworCQlhaWYyX3JlZyA9IFdNODk5NF9BSUYxX0NPTlRST0xfMjsKIAkJYmNsa19yZWcgPSBXTTg5OTRfQUlGMV9CQ0xLOwogCQlyYXRlX3JlZyA9IFdNODk5NF9BSUYxX1JBVEU7CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLIHx8CkBAIC0zMzQ1LDYgKzIxNjQsNyBAQAogCQlicmVhazsKIAljYXNlIDI6CiAJCWFpZjFfcmVnID0gV004OTk0X0FJRjJfQ09OVFJPTF8xOworCQlhaWYyX3JlZyA9IFdNODk5NF9BSUYyX0NPTlRST0xfMjsKIAkJYmNsa19yZWcgPSBXTTg5OTRfQUlGMl9CQ0xLOwogCQlyYXRlX3JlZyA9IFdNODk5NF9BSUYyX1JBVEU7CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLIHx8CkBAIC0zMzU1LDYgKzIxNzUsMTQgQEAKIAkJCWRldl9kYmcoY29kZWMtPmRldiwgIkFJRjIgdXNpbmcgc3BsaXQgTFJDTEtcbiIpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgMzoKKwkJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJCWNhc2UgV004OTU4OgorCQkJYWlmMV9yZWcgPSBXTTg5NThfQUlGM19DT05UUk9MXzE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzM5Miw2ICsyMjIwLDEwIEBACiAJZGV2X2RiZyhkYWktPmRldiwgIkFJRiVkQ0xLIGlzICVkSHosIHRhcmdldCBCQ0xLICVkSHpcbiIsCiAJCWRhaS0+aWQsIHdtODk5NC0+YWlmY2xrW2lkXSwgYmNsa19yYXRlKTsKIAorCWlmIChwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSA9PSAxICYmCisJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIGFpZjFfcmVnKSAmIDB4MTgpID09IDB4MTgpCisJCWFpZjIgfD0gV004OTk0X0FJRjFfTU9OTzsKKwogCWlmICh3bTg5OTQtPmFpZmNsa1tpZF0gPT0gMCkgewogCQlkZXZfZXJyKGRhaS0+ZGV2LCAiQUlGJWRDTEsgbm90IGNvbmZpZ3VyZWRcbiIsIGRhaS0+aWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM0MzUsNiArMjI2Nyw3IEBACiAJCWxyY2xrLCBiY2xrX3JhdGUgLyBscmNsayk7CiAKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhaWYxX3JlZywgV004OTk0X0FJRjFfV0xfTUFTSywgYWlmMSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYWlmMl9yZWcsIFdNODk5NF9BSUYxX01PTk8sIGFpZjIpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJjbGtfcmVnLCBXTTg5OTRfQUlGMV9CQ0xLX0RJVl9NQVNLLCBiY2xrKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBscmNsa19yZWcsIFdNODk5NF9BSUYxREFDX1JBVEVfTUFTSywKIAkJCSAgICBscmNsayk7CkBAIC0zNDU4LDYgKzIyOTEsNDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB3bTg5OTRfYWlmM19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCWludCBhaWYxX3JlZzsKKwlpbnQgYWlmMSA9IDA7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIDM6CisJCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCQljYXNlIFdNODk1ODoKKwkJCWFpZjFfcmVnID0gV004OTU4X0FJRjNfQ09OVFJPTF8xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWFpZjEgfD0gMHgyMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJYWlmMSB8PSAweDQwOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQlhaWYxIHw9IDB4NjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhaWYxX3JlZywgV004OTk0X0FJRjFfV0xfTUFTSywgYWlmMSk7Cit9CisKIHN0YXRpYyBpbnQgd204OTk0X2FpZl9tdXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgbXV0ZSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwpAQCAtMzUzOSw2ICsyNDEzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHdtODk5NF9haWYzX2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcwk9IHdtODk5NF9haWYzX2h3X3BhcmFtcywKIAkuc2V0X3RyaXN0YXRlCT0gd204OTk0X3NldF90cmlzdGF0ZSwKIH07CiAKQEAgLTM1NDgsMTQgKzI0MjMsMTQgQEAKIAkJLmlkID0gMSwKIAkJLnBsYXliYWNrID0gewogCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAogCQkJLnJhdGVzID0gV004OTk0X1JBVEVTLAogCQkJLmZvcm1hdHMgPSBXTTg5OTRfRk9STUFUUywKIAkJfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKLQkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKIAkJCS5yYXRlcyA9IFdNODk5NF9SQVRFUywKIAkJCS5mb3JtYXRzID0gV004OTk0X0ZPUk1BVFMsCkBAIC0zNTY3LDE0ICsyNDQyLDE0IEBACiAJCS5pZCA9IDIsCiAJCS5wbGF5YmFjayA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKLQkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKIAkJCS5yYXRlcyA9IFdNODk5NF9SQVRFUywKIAkJCS5mb3JtYXRzID0gV004OTk0X0ZPUk1BVFMsCiAJCX0sCiAJCS5jYXB0dXJlID0gewogCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCiAJCQkucmF0ZXMgPSBXTTg5OTRfUkFURVMsCiAJCQkuZm9ybWF0cyA9IFdNODk5NF9GT1JNQVRTLApAQCAtMzU4NiwxNCArMjQ2MSwxNCBAQAogCQkuaWQgPSAzLAogCQkucGxheWJhY2sgPSB7CiAJCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBQbGF5YmFjayIsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCiAJCQkucmF0ZXMgPSBXTTg5OTRfUkFURVMsCiAJCQkuZm9ybWF0cyA9IFdNODk5NF9GT1JNQVRTLAogCQl9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIENhcHR1cmUiLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAogCQkJLnJhdGVzID0gV004OTk0X1JBVEVTLAogCQkJLmZvcm1hdHMgPSBXTTg5OTRfRk9STUFUUywKQEAgLTM2MjUsMjYgKzI1MDAsMTIgQEAKIHN0YXRpYyBpbnQgd204OTk0X3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODk5NF9wcml2ICp3bTg5OTQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgKnJlZ19jYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJaW50IGksIHJldDsKIAogCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyAqLwotCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+cmVnX2NhY2hlKTsgaSsrKSB7Ci0JCXN3aXRjaCAoaSkgewotCQljYXNlIFdNODk5NF9MRE9fMToKLQkJY2FzZSBXTTg5OTRfTERPXzI6Ci0JCWNhc2UgV004OTk0X1NPRlRXQVJFX1JFU0VUOgotCQkJLyogSGFuZGxlZCBieSBvdGhlciBNRkQgZHJpdmVycyAqLwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICghYWNjZXNzX21hc2tzW2ldLndyaXRhYmxlKQotCQkJY29udGludWU7Ci0KLQkJd204OTk0X3JlZ193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBpLCByZWdfY2FjaGVbaV0pOwotCX0KKwlyZXQgPSBzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHN5bmMgY2FjaGU6ICVkXG4iLCByZXQpOwogCiAJd204OTk0X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKQEAgLTM3OTQsNiArMjY1NSwzNCBAQAogCWRldl9kYmcoY29kZWMtPmRldiwgIiVkIFJlVHVuZSBNb2JpbGUgY29uZmlndXJhdGlvbnNcbiIsCiAJCXBkYXRhLT5udW1fcmV0dW5lX21vYmlsZV9jZmdzKTsKIAorCWlmIChwZGF0YS0+bnVtX21iY19jZmdzKSB7CisJCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbnRyb2xbXSA9IHsKKwkJCVNPQ19FTlVNX0VYVCgiTUJDIE1vZGUiLCB3bTg5OTQtPm1iY19lbnVtLAorCQkJCSAgICAgd204OTU4X2dldF9tYmNfZW51bSwgd204OTU4X3B1dF9tYmNfZW51bSksCisJCX07CisKKwkJLyogV2UgbmVlZCBhbiBhcnJheSBvZiB0ZXh0cyBmb3IgdGhlIGVudW0gQVBJICovCisJCXdtODk5NC0+bWJjX3RleHRzID0ga21hbGxvYyhzaXplb2YoY2hhciAqKQorCQkJCQkgICAgKiBwZGF0YS0+bnVtX21iY19jZmdzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF3bTg5OTQtPm1iY190ZXh0cykgeworCQkJZGV2X2Vycih3bTg5OTQtPmNvZGVjLT5kZXYsCisJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBNQkMgY29uZmlnIHRleHRzXG4iLAorCQkJCXBkYXRhLT5udW1fbWJjX2NmZ3MpOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbWJjX2NmZ3M7IGkrKykKKwkJCXdtODk5NC0+bWJjX3RleHRzW2ldID0gcGRhdGEtPm1iY19jZmdzW2ldLm5hbWU7CisKKwkJd204OTk0LT5tYmNfZW51bS5tYXggPSBwZGF0YS0+bnVtX21iY19jZmdzOworCQl3bTg5OTQtPm1iY19lbnVtLnRleHRzID0gd204OTk0LT5tYmNfdGV4dHM7CisKKwkJcmV0ID0gc25kX3NvY19hZGRfY29udHJvbHMod204OTk0LT5jb2RlYywgY29udHJvbCwgMSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWRldl9lcnIod204OTk0LT5jb2RlYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gYWRkIE1CQyBtb2RlIGNvbnRyb2xzOiAlZFxuIiwgcmV0KTsKKwl9CisKIAlpZiAocGRhdGEtPm51bV9yZXR1bmVfbW9iaWxlX2NmZ3MpCiAJCXdtODk5NF9oYW5kbGVfcmV0dW5lX21vYmlsZV9wZGF0YSh3bTg5OTQpOwogCWVsc2UKQEAgLTM4MjMsOCArMjcxMiwxMiBAQAogewogCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHdtODk5NF9taWNkZXQgKm1pY2RldDsKKwlzdHJ1Y3Qgd204OTk0ICpjb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAlpbnQgcmVnOwogCisJaWYgKGNvbnRyb2wtPnR5cGUgIT0gV004OTk0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN3aXRjaCAobWljYmlhcykgewogCWNhc2UgMToKIAkJbWljZGV0ID0gJndtODk5NC0+bWljZGV0WzBdOwpAQCAtMzg2Myw2ICsyNzU2LDEwIEBACiAJaW50IHJlZzsKIAlpbnQgcmVwb3J0OwogCisjaWZuZGVmIENPTkZJR19TTkRfU09DX1dNODk5NF9NT0RVTEUKKwl0cmFjZV9zbmRfc29jX2phY2tfaXJxKGRldl9uYW1lKGNvZGVjLT5kZXYpKTsKKyNlbmRpZgorCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTRfSU5URVJSVVBUX1JBV19TVEFUVVNfMik7CiAJaWYgKHJlZyA8IDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgbWljcm9waG9uZSBzdGF0dXM6ICVkXG4iLApAQCAtMzg5MSw3NyArMjc4OCwyNTEgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKKy8qIERlZmF1bHQgbWljcm9waG9uZSBkZXRlY3Rpb24gaGFuZGxlciBmb3IgV004OTU4IC0gdGhlIHVzZXIgY2FuCisgKiBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2lzaC4KKyAqLworc3RhdGljIHZvaWQgd204OTU4X2RlZmF1bHRfbWljZGV0KHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGF0YTsKKwlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXBvcnQgPSAwOworCisJLyogSWYgbm90aGluZyBwcmVzZW50IHRoZW4gY2xlYXIgb3VyIHN0YXR1c2VzICovCisJaWYgKCEoc3RhdHVzICYgV004OTU4X01JQ0RfU1RTKSkgeworCQl3bTg5OTQtPmphY2tfaXNfdmlkZW8gPSBmYWxzZTsKKwkJd204OTk0LT5qYWNrX2lzX21pYyA9IGZhbHNlOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQXNzdW1lIGFueXRoaW5nIG92ZXIgNDc1IG9obXMgaXMgYSBtaWNyb3Bob25lIGFuZCByZW1lbWJlcgorCSAqIHRoYXQgd2UndmUgc2VlbiBvbmUgKHNpbmNlIGJ1dHRvbnMgb3ZlcnJpZGUgaXQpICovCisJaWYgKHN0YXR1cyAmIDB4NjAwKQorCQl3bTg5OTQtPmphY2tfaXNfbWljID0gdHJ1ZTsKKwlpZiAod204OTk0LT5qYWNrX2lzX21pYykKKwkJcmVwb3J0IHw9IFNORF9KQUNLX01JQ1JPUEhPTkU7CisKKwkvKiBWaWRlbyBoYXMgYW4gaW1wZWRlbmNlIG9mIGFwcHJveGltYXRlbHkgNzUgb2htczsgYXNzdW1lCisJICogdGhpcyBpc24ndCB1c2VkIGFzIGEgYnV0dG9uIGFuZCByZW1lbWJlciBpdCBzaW5jZSBidXR0b25zCisJICogb3ZlcnJpZGUgaXQuICovCisJaWYgKHN0YXR1cyAmIDB4NDApCisJCXdtODk5NC0+amFja19pc192aWRlbyA9IHRydWU7CisJaWYgKHdtODk5NC0+amFja19pc192aWRlbykKKwkJcmVwb3J0IHw9IFNORF9KQUNLX1ZJREVPT1VUOworCisJLyogRXZlcnl0aGluZyBlbHNlIGlzIGJ1dHRvbnM7IGp1c3QgYXNzaWduIHNsb3RzICovCisJaWYgKHN0YXR1cyAmIDB4NCkKKwkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8wOworCWlmIChzdGF0dXMgJiAweDgpCisJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMTsKKwlpZiAoc3RhdHVzICYgMHgxMCkKKwkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8yOworCWlmIChzdGF0dXMgJiAweDIwKQorCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzM7CisJaWYgKHN0YXR1cyAmIDB4ODApCisJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fNDsKKwlpZiAoc3RhdHVzICYgMHgxMDApCisJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fNTsKKworZG9uZToKKwlzbmRfc29jX2phY2tfcmVwb3J0KHdtODk5NC0+bWljZGV0WzBdLmphY2ssCisJCQkgICAgU05EX0pBQ0tfQlROXzAgfCBTTkRfSkFDS19CVE5fMSB8IFNORF9KQUNLX0JUTl8yIHwKKwkJCSAgICBTTkRfSkFDS19CVE5fMyB8IFNORF9KQUNLX0JUTl80IHwgU05EX0pBQ0tfQlROXzUgfAorCQkJICAgIFNORF9KQUNLX01JQ1JPUEhPTkUgfCBTTkRfSkFDS19WSURFT09VVCwKKwkJCSAgICByZXBvcnQpOworfQorCisvKioKKyAqIHdtODk1OF9taWNfZGV0ZWN0IC0gRW5hYmxlIG1pY3JvcGhvbmUgZGV0ZWN0aW9uIHZpYSB0aGUgV004OTU4IElSUQorICoKKyAqIEBjb2RlYzogICBXTTg5NTggY29kZWMKKyAqIEBqYWNrOiAgICBqYWNrIHRvIHJlcG9ydCBkZXRlY3Rpb24gZXZlbnRzIG9uCisgKgorICogRW5hYmxlIG1pY3JvcGhvbmUgZGV0ZWN0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBXTTg5NTguICBCeQorICogZGVmYXVsdCBzaW1wbGUgZGV0ZWN0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBkZXRlY3Rpb24gb2YgdXAgdG8gNgorICogYnV0dG9ucyBwbHVzIHZpZGVvIGFuZCBtaWNyb3Bob25lIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkLgorICoKKyAqIFRoZSBXTTg5NTggaGFzIGFuIGFkdmFuY2VkIGphY2sgZGV0ZWN0aW9uIGZhY2lsaXR5IHdoaWNoIGlzIGFibGUgdG8KKyAqIHN1cHBvcnQgY29tcGxleCBhY2Nlc3NvcnkgZGV0ZWN0aW9uLCBlc3BlY2lhbGx5IHdoZW4gdXNlZCBpbgorICogY29uanVuY3Rpb24gd2l0aCBleHRlcm5hbCBjaXJjdWl0cnkuICBJbiBvcmRlciB0byBwcm92aWRlIG1heGltdW0KKyAqIGZsZXhpYmxpdHkgYSBjYWxsYmFjayBpcyBwcm92aWRlZCB3aGljaCBhbGxvd3MgYSBjb21wbGV0ZWx5IGN1c3RvbQorICogZGV0ZWN0aW9uIGFsZ29yaXRobS4KKyAqLworaW50IHdtODk1OF9taWNfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywKKwkJICAgICAgd204OTU4X21pY2RldF9jYiBjYiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOworCisJaWYgKGNvbnRyb2wtPnR5cGUgIT0gV004OTU4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChqYWNrKSB7CisJCWlmICghY2IpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIlVzaW5nIGRlZmF1bHQgbWljZGV0IGNhbGxiYWNrXG4iKTsKKwkJCWNiID0gd204OTU4X2RlZmF1bHRfbWljZGV0OworCQkJY2JfZGF0YSA9IGNvZGVjOworCQl9CisKKwkJd204OTk0LT5taWNkZXRbMF0uamFjayA9IGphY2s7CisJCXdtODk5NC0+amFja19jYiA9IGNiOworCQl3bTg5OTQtPmphY2tfY2JfZGF0YSA9IGNiX2RhdGE7CisKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTU4X01JQ19ERVRFQ1RfMSwKKwkJCQkgICAgV004OTU4X01JQ0RfRU5BLCBXTTg5NThfTUlDRF9FTkEpOworCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk1OF9NSUNfREVURUNUXzEsCisJCQkJICAgIFdNODk1OF9NSUNEX0VOQSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bTg5NThfbWljX2RldGVjdCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTg5NThfbWljX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3bTg5OTRfcHJpdiAqd204OTk0ID0gZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3bTg5OTQtPmNvZGVjOworCWludCByZWc7CisKKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk1OF9NSUNfREVURUNUXzMpOworCWlmIChyZWcgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byByZWFkIG1pYyBkZXRlY3Qgc3RhdHVzOiAlZFxuIiwKKwkJCXJlZyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoIShyZWcgJiBXTTg5NThfTUlDRF9WQUxJRCkpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiTWljIGRldGVjdCBkYXRhIG5vdCB2YWxpZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworI2lmbmRlZiBDT05GSUdfU05EX1NPQ19XTTg5OTRfTU9EVUxFCisJdHJhY2Vfc25kX3NvY19qYWNrX2lycShkZXZfbmFtZShjb2RlYy0+ZGV2KSk7CisjZW5kaWYKKworCWlmICh3bTg5OTQtPmphY2tfY2IpCisJCXdtODk5NC0+amFja19jYihyZWcsIHdtODk5NC0+amFja19jYl9kYXRhKTsKKwllbHNlCisJCWRldl93YXJuKGNvZGVjLT5kZXYsICJBY2Nlc3NvcnkgZGV0ZWN0aW9uIHdpdGggbm8gY2FsbGJhY2tcbiIpOworCitvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaW50IHdtODk5NF9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHdtODk5NCAqY29udHJvbDsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldCwgaTsKIAogCWNvZGVjLT5jb250cm9sX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKKwljb250cm9sID0gY29kZWMtPmNvbnRyb2xfZGF0YTsKIAogCXdtODk5NCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bTg5OTRfcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICh3bTg5OTQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgd204OTk0KTsKIAotCWNvZGVjLT5yZWdfY2FjaGUgPSAmd204OTk0LT5yZWdfY2FjaGU7Ci0KIAl3bTg5OTQtPnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwogCXdtODk5NC0+Y29kZWMgPSBjb2RlYzsKIAotCS8qIEZpbGwgdGhlIGNhY2hlIHdpdGggcGh5c2ljYWwgdmFsdWVzIHdlIGluaGVyaXRlZDsgZG9uJ3QgcmVzZXQgKi8KLQlyZXQgPSB3bTg5OTRfYnVsa19yZWFkKGNvZGVjLT5jb250cm9sX2RhdGEsIDAsCi0JCQkgICAgICAgQVJSQVlfU0laRSh3bTg5OTQtPnJlZ19jYWNoZSkgLSAxLAotCQkJICAgICAgIGNvZGVjLT5yZWdfY2FjaGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmaWxsIHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKLQkJCXJldCk7Ci0JCWdvdG8gZXJyOwotCX0KKwlwbV9ydW50aW1lX2VuYWJsZShjb2RlYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3Jlc3VtZShjb2RlYy0+ZGV2KTsKIAotCS8qIENsZWFyIHRoZSBjYWNoZWQgdmFsdWVzIGZvciB1bnJlYWRhYmxlL3ZvbGF0aWxlIHJlZ2lzdGVycyB0bwotCSAqIGF2b2lkIHBvdGVudGlhbCBjb25mdXNpb24uCi0JICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0LT5yZWdfY2FjaGUpOyBpKyspCi0JCWlmICh3bTg5OTRfdm9sYXRpbGUoaSkgfHwgIXdtODk5NF9yZWFkYWJsZShpKSkKLQkJCXdtODk5NC0+cmVnX2NhY2hlW2ldID0gMDsKKwkvKiBSZWFkIG91ciBjdXJyZW50IHN0YXR1cyBiYWNrIGZyb20gdGhlIGNoaXAgLSB3ZSBkb24ndCB3YW50IHRvCisJICogcmVzZXQgYXMgdGhpcyBtYXkgaW50ZXJmZXJlIHdpdGggdGhlIEdQSU8gb3IgTERPIG9wZXJhdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgV004OTk0X0NBQ0hFX1NJWkU7IGkrKykgeworCQlpZiAoIXdtODk5NF9yZWFkYWJsZShpKSB8fCB3bTg5OTRfdm9sYXRpbGUoaSkpCisJCQljb250aW51ZTsKKworCQlyZXQgPSB3bTg5OTRfcmVnX3JlYWQoY29kZWMtPmNvbnRyb2xfZGF0YSwgaSk7CisJCWlmIChyZXQgPD0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIGksIHJldCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gaW5pdGlhbGlzZSBjYWNoZSBmb3IgMHgleDogJWRcbiIsCisJCQkJaSwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQogCiAJLyogU2V0IHJldmlzaW9uLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KIAl3bTg5OTQtPnJldmlzaW9uID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTRfQ0hJUF9SRVZJU0lPTik7Ci0Jc3dpdGNoICh3bTg5OTQtPnJldmlzaW9uKSB7Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQkJd204OTk0LT5odWJzLmRjc19jb2RlcyA9IC01OwotCQl3bTg5OTQtPmh1YnMuaHBfc3RhcnR1cF9tb2RlID0gMTsKKwlzd2l0Y2ggKGNvbnRyb2wtPnR5cGUpIHsKKwljYXNlIFdNODk5NDoKKwkJc3dpdGNoICh3bTg5OTQtPnJldmlzaW9uKSB7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJd204OTk0LT5odWJzLmRjc19jb2RlcyA9IC01OworCQkJd204OTk0LT5odWJzLmhwX3N0YXJ0dXBfbW9kZSA9IDE7CisJCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgV004OTU4OgogCQl3bTg5OTQtPmh1YnMuZGNzX3JlYWRiYWNrX21vZGUgPSAxOwogCQlicmVhazsKKwogCWRlZmF1bHQ6Ci0JCXdtODk5NC0+aHVicy5kY3NfcmVhZGJhY2tfbW9kZSA9IDE7CiAJCWJyZWFrOwogCX0KIAotCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX01JQzFfREVULAotCQkJCSB3bTg5OTRfbWljX2lycSwgIk1pYyAxIGRldGVjdCIsIHdtODk5NCk7Ci0JaWYgKHJldCAhPSAwKQotCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAotCQkJICJGYWlsZWQgdG8gcmVxdWVzdCBNaWMxIGRldGVjdCBJUlE6ICVkXG4iLCByZXQpOworCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCWNhc2UgV004OTk0OgorCQlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwKKwkJCQkJIFdNODk5NF9JUlFfTUlDMV9ERVQsCisJCQkJCSB3bTg5OTRfbWljX2lycSwgIk1pYyAxIGRldGVjdCIsCisJCQkJCSB3bTg5OTQpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHJlcXVlc3QgTWljMSBkZXRlY3QgSVJROiAlZFxuIiwKKwkJCQkgcmV0KTsKIAotCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX01JQzFfU0hSVCwKLQkJCQkgd204OTk0X21pY19pcnEsICJNaWMgMSBzaG9ydCIsIHdtODk5NCk7Ci0JaWYgKHJldCAhPSAwKQotCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAotCQkJICJGYWlsZWQgdG8gcmVxdWVzdCBNaWMxIHNob3J0IElSUTogJWRcbiIsIHJldCk7CisJCXJldCA9IHdtODk5NF9yZXF1ZXN0X2lycShjb2RlYy0+Y29udHJvbF9kYXRhLAorCQkJCQkgV004OTk0X0lSUV9NSUMxX1NIUlQsCisJCQkJCSB3bTg5OTRfbWljX2lycSwgIk1pYyAxIHNob3J0IiwKKwkJCQkJIHdtODk5NCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWRldl93YXJuKGNvZGVjLT5kZXYsCisJCQkJICJGYWlsZWQgdG8gcmVxdWVzdCBNaWMxIHNob3J0IElSUTogJWRcbiIsCisJCQkJIHJldCk7CiAKLQlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMyX0RFVCwKLQkJCQkgd204OTk0X21pY19pcnEsICJNaWMgMiBkZXRlY3QiLCB3bTg5OTQpOwotCWlmIChyZXQgIT0gMCkKLQkJZGV2X3dhcm4oY29kZWMtPmRldiwKLQkJCSAiRmFpbGVkIHRvIHJlcXVlc3QgTWljMiBkZXRlY3QgSVJROiAlZFxuIiwgcmV0KTsKKwkJcmV0ID0gd204OTk0X3JlcXVlc3RfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsCisJCQkJCSBXTTg5OTRfSVJRX01JQzJfREVULAorCQkJCQkgd204OTk0X21pY19pcnEsICJNaWMgMiBkZXRlY3QiLAorCQkJCQkgd204OTk0KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X3dhcm4oY29kZWMtPmRldiwKKwkJCQkgIkZhaWxlZCB0byByZXF1ZXN0IE1pYzIgZGV0ZWN0IElSUTogJWRcbiIsCisJCQkJIHJldCk7CiAKLQlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMyX1NIUlQsCi0JCQkJIHdtODk5NF9taWNfaXJxLCAiTWljIDIgc2hvcnQiLCB3bTg5OTQpOwotCWlmIChyZXQgIT0gMCkKLQkJZGV2X3dhcm4oY29kZWMtPmRldiwKLQkJCSAiRmFpbGVkIHRvIHJlcXVlc3QgTWljMiBzaG9ydCBJUlE6ICVkXG4iLCByZXQpOworCQlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwKKwkJCQkJIFdNODk5NF9JUlFfTUlDMl9TSFJULAorCQkJCQkgd204OTk0X21pY19pcnEsICJNaWMgMiBzaG9ydCIsCisJCQkJCSB3bTg5OTQpOworCQlpZiAocmV0ICE9IDApCisJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHJlcXVlc3QgTWljMiBzaG9ydCBJUlE6ICVkXG4iLAorCQkJCSByZXQpOworCQlicmVhazsKKworCWNhc2UgV004OTU4OgorCQlyZXQgPSB3bTg5OTRfcmVxdWVzdF9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwKKwkJCQkJIFdNODk5NF9JUlFfTUlDMV9ERVQsCisJCQkJCSB3bTg5NThfbWljX2lycSwgIk1pYyBkZXRlY3QiLAorCQkJCQkgd204OTk0KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZGV2X3dhcm4oY29kZWMtPmRldiwKKwkJCQkgIkZhaWxlZCB0byByZXF1ZXN0IE1pYyBkZXRlY3QgSVJROiAlZFxuIiwKKwkJCQkgcmV0KTsKKwkJYnJlYWs7CisJfQogCiAJLyogUmVtZW1iZXIgaWYgQUlGbkxSQ0xLIGlzIGNvbmZpZ3VyZWQgYXMgYSBHUElPLiAgVGhpcyBzaG91bGQgYmUKIAkgKiBjb25maWd1cmVkIG9uIGluaXQgLSBpZiBhIHN5c3RlbSB3YW50cyB0byBkbyB0aGlzIGR5bmFtaWNhbGx5CkBAIC00MDM0LDEwICszMTA1LDM2IEBACiAJd21faHVic19hZGRfYW5hbG9ndWVfY29udHJvbHMoY29kZWMpOwogCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5OTRfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKHdtODk5NF9zbmRfY29udHJvbHMpKTsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5OTRfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTk0X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod204OTk0X2RhcG1fd2lkZ2V0cykpOworCisJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJY2FzZSBXTTg5OTQ6CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTk0X3NwZWNpZmljX2RhcG1fd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk5NF9zcGVjaWZpY19kYXBtX3dpZGdldHMpKTsKKwkJYnJlYWs7CisJY2FzZSBXTTg5NTg6CisJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg5NThfc25kX2NvbnRyb2xzLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTg5NThfc25kX2NvbnRyb2xzKSk7CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTU4X2RhcG1fd2lkZ2V0cywKKwkJCQkJICBBUlJBWV9TSVpFKHdtODk1OF9kYXBtX3dpZGdldHMpKTsKKwkJYnJlYWs7CisJfQorCQkKKwogCXdtX2h1YnNfYWRkX2FuYWxvZ3VlX3JvdXRlcyhjb2RlYywgMCwgMCk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGludGVyY29uLCBBUlJBWV9TSVpFKGludGVyY29uKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKKworCXN3aXRjaCAoY29udHJvbC0+dHlwZSkgeworCWNhc2UgV004OTk0OgorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3bTg5OTRfaW50ZXJjb24sCisJCQkJCUFSUkFZX1NJWkUod204OTk0X2ludGVyY29uKSk7CisJCWJyZWFrOworCWNhc2UgV004OTU4OgorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3bTg5NThfaW50ZXJjb24sCisJCQkJCUFSUkFZX1NJWkUod204OTU4X2ludGVyY29uKSk7CisJCWJyZWFrOworCX0KIAogCXJldHVybiAwOwogCkBAIC00MDU0LDEzICszMTUxLDI5IEBACiBzdGF0aWMgaW50ICB3bTg5OTRfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgd204OTk0X3ByaXYgKndtODk5NCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCB3bTg5OTQgKmNvbnRyb2wgPSBjb2RlYy0+Y29udHJvbF9kYXRhOwogCiAJd204OTk0X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKIAotCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX01JQzJfU0hSVCwgd204OTk0KTsKLQl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMyX0RFVCwgd204OTk0KTsKLQl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMxX1NIUlQsIHdtODk5NCk7Ci0Jd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfTUlDMV9ERVQsIHdtODk5NCk7CisJcG1fcnVudGltZV9kaXNhYmxlKGNvZGVjLT5kZXYpOworCisJc3dpdGNoIChjb250cm9sLT50eXBlKSB7CisJY2FzZSBXTTg5OTQ6CisJCXdtODk5NF9mcmVlX2lycShjb2RlYy0+Y29udHJvbF9kYXRhLCBXTTg5OTRfSVJRX01JQzJfU0hSVCwKKwkJCQl3bTg5OTQpOworCQl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMyX0RFVCwKKwkJCQl3bTg5OTQpOworCQl3bTg5OTRfZnJlZV9pcnEoY29kZWMtPmNvbnRyb2xfZGF0YSwgV004OTk0X0lSUV9NSUMxX1NIUlQsCisJCQkJd204OTk0KTsKKwkJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfTUlDMV9ERVQsCisJCQkJd204OTk0KTsKKwkJYnJlYWs7CisKKwljYXNlIFdNODk1ODoKKwkJd204OTk0X2ZyZWVfaXJxKGNvZGVjLT5jb250cm9sX2RhdGEsIFdNODk5NF9JUlFfTUlDMV9ERVQsCisJCQkJd204OTk0KTsKKwkJYnJlYWs7CisJfQogCWtmcmVlKHdtODk5NC0+cmV0dW5lX21vYmlsZV90ZXh0cyk7CiAJa2ZyZWUod204OTk0LT5kcmNfdGV4dHMpOwogCWtmcmVlKHdtODk5NCk7CkBAIC00MDczLDExICszMTg2LDE2IEBACiAJLnJlbW92ZSA9CXdtODk5NF9jb2RlY19yZW1vdmUsCiAJLnN1c3BlbmQgPQl3bTg5OTRfc3VzcGVuZCwKIAkucmVzdW1lID0Jd204OTk0X3Jlc3VtZSwKLQkucmVhZCA9IHdtODk5NF9yZWFkLAotCS53cml0ZSA9IHdtODk5NF93cml0ZSwKKwkucmVhZCA9CQl3bTg5OTRfcmVhZCwKKwkud3JpdGUgPQl3bTg5OTRfd3JpdGUsCiAJLnJlYWRhYmxlX3JlZ2lzdGVyID0gd204OTk0X3JlYWRhYmxlLAogCS52b2xhdGlsZV9yZWdpc3RlciA9IHdtODk5NF92b2xhdGlsZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5OTRfc2V0X2JpYXNfbGV2ZWwsCisKKwkucmVnX2NhY2hlX3NpemUgPSBXTTg5OTRfQ0FDSEVfU0laRSwKKwkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTg5OTRfcmVnX2RlZmF1bHRzLAorCS5yZWdfd29yZF9zaXplID0gMiwKKwkuY29tcHJlc3NfdHlwZSA9IFNORF9TT0NfUkJUUkVFX0NPTVBSRVNTSU9OLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgd204OTk0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuaAppbmRleCBkOGRjZTI2Li4wYzM1NWJmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmgKQEAgLTI4LDcgKzI4LDIxIEBACiAjZGVmaW5lIFdNODk5NF9GTExfU1JDX0xSQ0xLICAzCiAjZGVmaW5lIFdNODk5NF9GTExfU1JDX0JDTEsgICA0CiAKK3R5cGVkZWYgdm9pZCAoKndtODk1OF9taWNkZXRfY2IpKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpOworCiBpbnQgd204OTk0X21pY19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLAogCQkgICAgICBpbnQgbWljYmlhcywgaW50IGRldCwgaW50IHNocnQpOworaW50IHdtODk1OF9taWNfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywKKwkJICAgICAgd204OTU4X21pY2RldF9jYiBjYiwgdm9pZCAqY2JfZGF0YSk7CisKKyNkZWZpbmUgV004OTk0X0NBQ0hFX1NJWkUgMTU3MAorCitzdHJ1Y3Qgd204OTk0X2FjY2Vzc19tYXNrIHsKKwl1bnNpZ25lZCBzaG9ydCByZWFkYWJsZTsgICAvKiBNYXNrIG9mIHJlYWRhYmxlIGJpdHMgKi8KKwl1bnNpZ25lZCBzaG9ydCB3cml0YWJsZTsgICAvKiBNYXNrIG9mIHdyaXRhYmxlIGJpdHMgKi8KK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgd204OTk0X2FjY2Vzc19tYXNrIHdtODk5NF9hY2Nlc3NfbWFza3NbV004OTk0X0NBQ0hFX1NJWkVdOworZXh0ZXJuIGNvbnN0IF9fZGV2aW5pdGRhdGEgIHUxNiB3bTg5OTRfcmVnX2RlZmF1bHRzW1dNODk5NF9DQUNIRV9TSVpFXTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ1Y2JkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwpAQCAtMCwwICsxLDE4MTggQEAKKy8qCisgKiB3bTg5OTUuYyAgLS0gIFdNODk5NSBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgcGxjCisgKgorICogQXV0aG9yOiBEaW1pdHJpcyBQYXBhc3RhbW9zIDxkcEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogQmFzZWQgb24gd204OTk0LmMgYW5kIHdtX2h1YnMuYyBieSBNYXJrIEJyb3duCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgIndtODk5NS5oIgorCitzdGF0aWMgY29uc3QgdTE2IHdtODk5NV9yZWdfZGVmc1tXTTg5OTVfTUFYX1JFR0lTVEVSICsgMV0gPSB7CisJWzBdICAgICA9IDB4ODk5NSwgWzVdICAgICA9IDB4MDEwMCwgWzE2XSAgICA9IDB4MDAwYiwgWzE3XSAgICA9IDB4MDAwYiwKKwlbMjRdICAgID0gMHgwMmMwLCBbMjVdICAgID0gMHgwMmMwLCBbMjZdICAgID0gMHgwMmMwLCBbMjddICAgID0gMHgwMmMwLAorCVsyOF0gICAgPSAweDAwMGYsIFszMl0gICAgPSAweDAwMDUsIFszM10gICAgPSAweDAwMDUsIFs0MF0gICAgPSAweDAwMDMsCisJWzQxXSAgICA9IDB4MDAxMywgWzQ4XSAgICA9IDB4MDAwNCwgWzU2XSAgICA9IDB4MDlmOCwgWzY0XSAgICA9IDB4MWYyNSwKKwlbNjldICAgID0gMHgwMDA0LCBbODJdICAgID0gMHhhYWFhLCBbODRdICAgID0gMHgyYTJhLCBbMTQ2XSAgID0gMHgwMDYwLAorCVsyNTZdICAgPSAweDAwMDIsIFsyNTddICAgPSAweDgwMDQsIFs1MjBdICAgPSAweDAwMTAsIFs1MjhdICAgPSAweDAwODMsCisJWzUyOV0gICA9IDB4MDA4MywgWzU0OF0gICA9IDB4MGM4MCwgWzU4MF0gICA9IDB4MGM4MCwgWzc2OF0gICA9IDB4NDA1MCwKKwlbNzY5XSAgID0gMHg0MDAwLCBbNzcxXSAgID0gMHgwMDQwLCBbNzcyXSAgID0gMHgwMDQwLCBbNzczXSAgID0gMHgwMDQwLAorCVs3NzRdICAgPSAweDAwMDQsIFs3NzVdICAgPSAweDAxMDAsIFs3ODRdICAgPSAweDQwNTAsIFs3ODVdICAgPSAweDQwMDAsCisJWzc4N10gICA9IDB4MDA0MCwgWzc4OF0gICA9IDB4MDA0MCwgWzc4OV0gICA9IDB4MDA0MCwgWzEwMjRdICA9IDB4MDBjMCwKKwlbMTAyNV0gID0gMHgwMGMwLCBbMTAyNl0gID0gMHgwMGMwLCBbMTAyN10gID0gMHgwMGMwLCBbMTAyOF0gID0gMHgwMGMwLAorCVsxMDI5XSAgPSAweDAwYzAsIFsxMDMwXSAgPSAweDAwYzAsIFsxMDMxXSAgPSAweDAwYzAsIFsxMDU2XSAgPSAweDAyMDAsCisJWzEwNTddICA9IDB4MDAxMCwgWzEwNThdICA9IDB4MDIwMCwgWzEwNTldICA9IDB4MDAxMCwgWzEwODhdICA9IDB4MDA5OCwKKwlbMTA4OV0gID0gMHgwODQ1LCBbMTEwNF0gID0gMHgwMDk4LCBbMTEwNV0gID0gMHgwODQ1LCBbMTE1Ml0gID0gMHg2MzE4LAorCVsxMTUzXSAgPSAweDYzMDAsIFsxMTU0XSAgPSAweDBmY2EsIFsxMTU1XSAgPSAweDA0MDAsIFsxMTU2XSAgPSAweDAwZDgsCisJWzExNTddICA9IDB4MWViNSwgWzExNThdICA9IDB4ZjE0NSwgWzExNTldICA9IDB4MGI3NSwgWzExNjBdICA9IDB4MDFjNSwKKwlbMTE2MV0gID0gMHgxYzU4LCBbMTE2Ml0gID0gMHhmMzczLCBbMTE2M10gID0gMHgwYTU0LCBbMTE2NF0gID0gMHgwNTU4LAorCVsxMTY1XSAgPSAweDE2OGUsIFsxMTY2XSAgPSAweGY4MjksIFsxMTY3XSAgPSAweDA3YWQsIFsxMTY4XSAgPSAweDExMDMsCisJWzExNjldICA9IDB4MDU2NCwgWzExNzBdICA9IDB4MDU1OSwgWzExNzFdICA9IDB4NDAwMCwgWzExODRdICA9IDB4NjMxOCwKKwlbMTE4NV0gID0gMHg2MzAwLCBbMTE4Nl0gID0gMHgwZmNhLCBbMTE4N10gID0gMHgwNDAwLCBbMTE4OF0gID0gMHgwMGQ4LAorCVsxMTg5XSAgPSAweDFlYjUsIFsxMTkwXSAgPSAweGYxNDUsIFsxMTkxXSAgPSAweDBiNzUsIFsxMTkyXSAgPSAweDAxYzUsCisJWzExOTNdICA9IDB4MWM1OCwgWzExOTRdICA9IDB4ZjM3MywgWzExOTVdICA9IDB4MGE1NCwgWzExOTZdICA9IDB4MDU1OCwKKwlbMTE5N10gID0gMHgxNjhlLCBbMTE5OF0gID0gMHhmODI5LCBbMTE5OV0gID0gMHgwN2FkLCBbMTIwMF0gID0gMHgxMTAzLAorCVsxMjAxXSAgPSAweDA1NjQsIFsxMjAyXSAgPSAweDA1NTksIFsxMjAzXSAgPSAweDQwMDAsIFsxMjgwXSAgPSAweDAwYzAsCisJWzEyODFdICA9IDB4MDBjMCwgWzEyODJdICA9IDB4MDBjMCwgWzEyODNdICA9IDB4MDBjMCwgWzEzMTJdICA9IDB4MDIwMCwKKwlbMTMxM10gID0gMHgwMDEwLCBbMTM0NF0gID0gMHgwMDk4LCBbMTM0NV0gID0gMHgwODQ1LCBbMTQwOF0gID0gMHg2MzE4LAorCVsxNDA5XSAgPSAweDYzMDAsIFsxNDEwXSAgPSAweDBmY2EsIFsxNDExXSAgPSAweDA0MDAsIFsxNDEyXSAgPSAweDAwZDgsCisJWzE0MTNdICA9IDB4MWViNSwgWzE0MTRdICA9IDB4ZjE0NSwgWzE0MTVdICA9IDB4MGI3NSwgWzE0MTZdICA9IDB4MDFjNSwKKwlbMTQxN10gID0gMHgxYzU4LCBbMTQxOF0gID0gMHhmMzczLCBbMTQxOV0gID0gMHgwYTU0LCBbMTQyMF0gID0gMHgwNTU4LAorCVsxNDIxXSAgPSAweDE2OGUsIFsxNDIyXSAgPSAweGY4MjksIFsxNDIzXSAgPSAweDA3YWQsIFsxNDI0XSAgPSAweDExMDMsCisJWzE0MjVdICA9IDB4MDU2NCwgWzE0MjZdICA9IDB4MDU1OSwgWzE0MjddICA9IDB4NDAwMCwgWzE1NjhdICA9IDB4MDAwMiwKKwlbMTc5Ml0gID0gMHhhMTAwLCBbMTc5M10gID0gMHhhMTAxLCBbMTc5NF0gID0gMHhhMTAxLCBbMTc5NV0gID0gMHhhMTAxLAorCVsxNzk2XSAgPSAweGExMDEsIFsxNzk3XSAgPSAweGExMDEsIFsxNzk4XSAgPSAweGExMDEsIFsxNzk5XSAgPSAweGExMDEsCisJWzE4MDBdICA9IDB4YTEwMSwgWzE4MDFdICA9IDB4YTEwMSwgWzE4MDJdICA9IDB4YTEwMSwgWzE4MDNdICA9IDB4YTEwMSwKKwlbMTgwNF0gID0gMHhhMTAxLCBbMTgwNV0gID0gMHhhMTAxLCBbMTgyNV0gID0gMHgwMDU1LCBbMTg0OF0gID0gMHgzZmZmLAorCVsxODQ5XSAgPSAweDFmZmYsIFsyMDQ5XSAgPSAweDAwMDEsIFsyMDUwXSAgPSAweDAwNjksIFsyMDU2XSAgPSAweDAwMDIsCisJWzIwNTddICA9IDB4MDAwMywgWzIwNThdICA9IDB4MDA2OSwgWzEyMjg4XSA9IDB4MDAwMSwgWzEyMjg5XSA9IDB4MDAwMSwKKwlbMTIyOTFdID0gMHgwMDA2LCBbMTIyOTJdID0gMHgwMDQwLCBbMTIyOTNdID0gMHgwMDAxLCBbMTIyOTRdID0gMHgwMDBmLAorCVsxMjI5NV0gPSAweDAwMDYsIFsxMjI5Nl0gPSAweDAwMDEsIFsxMjI5N10gPSAweDAwMDMsIFsxMjI5OF0gPSAweDAxMDQsCisJWzEyMzAwXSA9IDB4MDA2MCwgWzEyMzAxXSA9IDB4MDAxMSwgWzEyMzAyXSA9IDB4MDQwMSwgWzEyMzA0XSA9IDB4MDA1MCwKKwlbMTIzMDVdID0gMHgwMDAzLCBbMTIzMDZdID0gMHgwMTAwLCBbMTIzMDhdID0gMHgwMDUxLCBbMTIzMDldID0gMHgwMDAzLAorCVsxMjMxMF0gPSAweDAxMDQsIFsxMjMxMV0gPSAweDAwMGEsIFsxMjMxMl0gPSAweDAwNjAsIFsxMjMxM10gPSAweDAwM2IsCisJWzEyMzE0XSA9IDB4MDUwMiwgWzEyMzE1XSA9IDB4MDEwMCwgWzEyMzE2XSA9IDB4MmZmZiwgWzEyMzIwXSA9IDB4MmZmZiwKKwlbMTIzMjRdID0gMHgyZmZmLCBbMTIzMjhdID0gMHgyZmZmLCBbMTIzMzJdID0gMHgyZmZmLCBbMTIzMzZdID0gMHgyZmZmLAorCVsxMjM0MF0gPSAweDJmZmYsIFsxMjM0NF0gPSAweDJmZmYsIFsxMjM0OF0gPSAweDJmZmYsIFsxMjM1Ml0gPSAweDAwMDEsCisJWzEyMzUzXSA9IDB4MDAwMSwgWzEyMzU1XSA9IDB4MDAwNiwgWzEyMzU2XSA9IDB4MDA0MCwgWzEyMzU3XSA9IDB4MDAwMSwKKwlbMTIzNThdID0gMHgwMDBmLCBbMTIzNTldID0gMHgwMDA2LCBbMTIzNjBdID0gMHgwMDAxLCBbMTIzNjFdID0gMHgwMDAzLAorCVsxMjM2Ml0gPSAweDAxMDQsIFsxMjM2NF0gPSAweDAwNjAsIFsxMjM2NV0gPSAweDAwMTEsIFsxMjM2Nl0gPSAweDA0MDEsCisJWzEyMzY4XSA9IDB4MDA1MCwgWzEyMzY5XSA9IDB4MDAwMywgWzEyMzcwXSA9IDB4MDEwMCwgWzEyMzcyXSA9IDB4MDA2MCwKKwlbMTIzNzNdID0gMHgwMDNiLCBbMTIzNzRdID0gMHgwNTAyLCBbMTIzNzVdID0gMHgwMTAwLCBbMTIzNzZdID0gMHgyZmZmLAorCVsxMjM4MF0gPSAweDJmZmYsIFsxMjM4NF0gPSAweDJmZmYsIFsxMjM4OF0gPSAweDJmZmYsIFsxMjM5Ml0gPSAweDJmZmYsCisJWzEyMzk2XSA9IDB4MmZmZiwgWzEyNDAwXSA9IDB4MmZmZiwgWzEyNDA0XSA9IDB4MmZmZiwgWzEyNDA4XSA9IDB4MmZmZiwKKwlbMTI0MTJdID0gMHgyZmZmLCBbMTI0MTZdID0gMHgwMDAxLCBbMTI0MTddID0gMHgwMDAxLCBbMTI0MTldID0gMHgwMDA2LAorCVsxMjQyMF0gPSAweDAwNDAsIFsxMjQyMV0gPSAweDAwMDEsIFsxMjQyMl0gPSAweDAwMGYsIFsxMjQyM10gPSAweDAwMDYsCisJWzEyNDI0XSA9IDB4MDAwMSwgWzEyNDI1XSA9IDB4MDAwMywgWzEyNDI2XSA9IDB4MDEwNiwgWzEyNDI4XSA9IDB4MDA2MSwKKwlbMTI0MjldID0gMHgwMDExLCBbMTI0MzBdID0gMHgwNDAxLCBbMTI0MzJdID0gMHgwMDUwLCBbMTI0MzNdID0gMHgwMDAzLAorCVsxMjQzNF0gPSAweDAxMDIsIFsxMjQzNl0gPSAweDAwNTEsIFsxMjQzN10gPSAweDAwMDMsIFsxMjQzOF0gPSAweDAxMDYsCisJWzEyNDM5XSA9IDB4MDAwYSwgWzEyNDQwXSA9IDB4MDA2MSwgWzEyNDQxXSA9IDB4MDAzYiwgWzEyNDQyXSA9IDB4MDUwMiwKKwlbMTI0NDNdID0gMHgwMTAwLCBbMTI0NDRdID0gMHgyZmZmLCBbMTI0NDhdID0gMHgyZmZmLCBbMTI0NTJdID0gMHgyZmZmLAorCVsxMjQ1Nl0gPSAweDJmZmYsIFsxMjQ2MF0gPSAweDJmZmYsIFsxMjQ2NF0gPSAweDJmZmYsIFsxMjQ2OF0gPSAweDJmZmYsCisJWzEyNDcyXSA9IDB4MmZmZiwgWzEyNDc2XSA9IDB4MmZmZiwgWzEyNDgwXSA9IDB4MDAwMSwgWzEyNDgxXSA9IDB4MDAwMSwKKwlbMTI0ODNdID0gMHgwMDA2LCBbMTI0ODRdID0gMHgwMDQwLCBbMTI0ODVdID0gMHgwMDAxLCBbMTI0ODZdID0gMHgwMDBmLAorCVsxMjQ4N10gPSAweDAwMDYsIFsxMjQ4OF0gPSAweDAwMDEsIFsxMjQ4OV0gPSAweDAwMDMsIFsxMjQ5MF0gPSAweDAxMDYsCisJWzEyNDkyXSA9IDB4MDA2MSwgWzEyNDkzXSA9IDB4MDAxMSwgWzEyNDk0XSA9IDB4MDQwMSwgWzEyNDk2XSA9IDB4MDA1MCwKKwlbMTI0OTddID0gMHgwMDAzLCBbMTI0OThdID0gMHgwMTAyLCBbMTI1MDBdID0gMHgwMDYxLCBbMTI1MDFdID0gMHgwMDNiLAorCVsxMjUwMl0gPSAweDA1MDIsIFsxMjUwM10gPSAweDAxMDAsIFsxMjUwNF0gPSAweDJmZmYsIFsxMjUwOF0gPSAweDJmZmYsCisJWzEyNTEyXSA9IDB4MmZmZiwgWzEyNTE2XSA9IDB4MmZmZiwgWzEyNTIwXSA9IDB4MmZmZiwgWzEyNTI0XSA9IDB4MmZmZiwKKwlbMTI1MjhdID0gMHgyZmZmLCBbMTI1MzJdID0gMHgyZmZmLCBbMTI1MzZdID0gMHgyZmZmLCBbMTI1NDBdID0gMHgyZmZmLAorCVsxMjU0NF0gPSAweDAwNjAsIFsxMjU0Nl0gPSAweDA2MDEsIFsxMjU0OF0gPSAweDAwNTAsIFsxMjU1MF0gPSAweDAxMDAsCisJWzEyNTUyXSA9IDB4MDAwMSwgWzEyNTU0XSA9IDB4MDEwNCwgWzEyNTU1XSA9IDB4MDEwMCwgWzEyNTU2XSA9IDB4MmZmZiwKKwlbMTI1NjBdID0gMHgyZmZmLCBbMTI1NjRdID0gMHgyZmZmLCBbMTI1NjhdID0gMHgyZmZmLCBbMTI1NzJdID0gMHgyZmZmLAorCVsxMjU3Nl0gPSAweDJmZmYsIFsxMjU4MF0gPSAweDJmZmYsIFsxMjU4NF0gPSAweDJmZmYsIFsxMjU4OF0gPSAweDJmZmYsCisJWzEyNTkyXSA9IDB4MmZmZiwgWzEyNTk2XSA9IDB4MmZmZiwgWzEyNjAwXSA9IDB4MmZmZiwgWzEyNjA0XSA9IDB4MmZmZiwKKwlbMTI2MDhdID0gMHgwMDYxLCBbMTI2MTBdID0gMHgwNjAxLCBbMTI2MTJdID0gMHgwMDUwLCBbMTI2MTRdID0gMHgwMTAyLAorCVsxMjYxNl0gPSAweDAwMDEsIFsxMjYxOF0gPSAweDAxMDYsIFsxMjYxOV0gPSAweDAxMDAsIFsxMjYyMF0gPSAweDJmZmYsCisJWzEyNjI0XSA9IDB4MmZmZiwgWzEyNjI4XSA9IDB4MmZmZiwgWzEyNjMyXSA9IDB4MmZmZiwgWzEyNjM2XSA9IDB4MmZmZiwKKwlbMTI2NDBdID0gMHgyZmZmLCBbMTI2NDRdID0gMHgyZmZmLCBbMTI2NDhdID0gMHgyZmZmLCBbMTI2NTJdID0gMHgyZmZmLAorCVsxMjY1Nl0gPSAweDJmZmYsIFsxMjY2MF0gPSAweDJmZmYsIFsxMjY2NF0gPSAweDJmZmYsIFsxMjY2OF0gPSAweDJmZmYsCisJWzEyNjcyXSA9IDB4MDA2MCwgWzEyNjc0XSA9IDB4MDYwMSwgWzEyNjc2XSA9IDB4MDA2MSwgWzEyNjc4XSA9IDB4MDYwMSwKKwlbMTI2ODBdID0gMHgwMDUwLCBbMTI2ODJdID0gMHgwMzAwLCBbMTI2ODRdID0gMHgwMDAxLCBbMTI2ODZdID0gMHgwMzA0LAorCVsxMjY4OF0gPSAweDAwNDAsIFsxMjY5MF0gPSAweDAwMGYsIFsxMjY5Ml0gPSAweDAwMDEsIFsxMjY5NV0gPSAweDAxMDAKK307CisKK3N0cnVjdCBmbGxfY29uZmlnIHsKKwlpbnQgc3JjOworCWludCBpbjsKKwlpbnQgb3V0OworfTsKKworc3RydWN0IHdtODk5NV9wcml2IHsKKwllbnVtIHNuZF9zb2NfY29udHJvbF90eXBlIGNvbnRyb2xfdHlwZTsKKwlpbnQgc3lzY2xrWzJdOworCWludCBtY2xrWzJdOworCWludCBhaWZjbGtbMl07CisJc3RydWN0IGZsbF9jb25maWcgZmxsWzJdLCBmbGxfc3VzcGVuZFsyXTsKK307CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTcyMDAsIDc1LCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShpbjFscl9wZ2FfdGx2LCAtMTY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShpbjFsX2Jvb3N0X3RsdiwgMCwgNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzaWRldG9uZV90bHYsIC0zNjAwLCAxNTAsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqaW4xbF90ZXh0W10gPSB7CisJIkRpZmZlcmVudGlhbCIsICJTaW5nbGUtZW5kZWQgSU4xTE4iLCAiU2luZ2xlLWVuZGVkIElOMUxQIgorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGluMWxfZW51bSwgV004OTk1X0xFRlRfTElORV9JTlBVVF9DT05UUk9MLAorCQkJCSAgMiwgaW4xbF90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmluMXJfdGV4dFtdID0geworCSJEaWZmZXJlbnRpYWwiLCAiU2luZ2xlLWVuZGVkIElOMVJOIiwgIlNpbmdsZS1lbmRlZCBJTjFSUCIKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChpbjFyX2VudW0sIFdNODk5NV9MRUZUX0xJTkVfSU5QVVRfQ09OVFJPTCwKKwkJCQkgIDAsIGluMXJfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkbWljX3NyY190ZXh0W10gPSB7CisJIkRNSUNEQVQxIiwgIkRNSUNEQVQyIiwgIkRNSUNEQVQzIgorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRtaWNfc3JjMV9lbnVtLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF81LAorCQkJCSAgOCwgZG1pY19zcmNfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woZG1pY19zcmMyX2VudW0sIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzUsCisJCQkJICA2LCBkbWljX3NyY190ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5NV9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfRE9VQkxFX1JfVExWKCJEQUMxIFZvbHVtZSIsIFdNODk5NV9EQUMxX0xFRlRfVk9MVU1FLAorCQlXTTg5OTVfREFDMV9SSUdIVF9WT0xVTUUsIDAsIDk2LCAwLCBkaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SKCJEQUMxIFN3aXRjaCIsIFdNODk5NV9EQUMxX0xFRlRfVk9MVU1FLAorCQlXTTg5OTVfREFDMV9SSUdIVF9WT0xVTUUsIDksIDEsIDEpLAorCisJU09DX0RPVUJMRV9SX1RMVigiREFDMiBWb2x1bWUiLCBXTTg5OTVfREFDMl9MRUZUX1ZPTFVNRSwKKwkJV004OTk1X0RBQzJfUklHSFRfVk9MVU1FLCAwLCA5NiwgMCwgZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUigiREFDMiBTd2l0Y2giLCBXTTg5OTVfREFDMl9MRUZUX1ZPTFVNRSwKKwkJV004OTk1X0RBQzJfUklHSFRfVk9MVU1FLCA5LCAxLCAxKSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIkFJRjFEQUMxIFZvbHVtZSIsIFdNODk5NV9BSUYxX0RBQzFfTEVGVF9WT0xVTUUsCisJCVdNODk5NV9BSUYxX0RBQzFfUklHSFRfVk9MVU1FLCAwLCA5NiwgMCwgZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkFJRjFEQUMyIFZvbHVtZSIsIFdNODk5NV9BSUYxX0RBQzJfTEVGVF9WT0xVTUUsCisJCVdNODk5NV9BSUYxX0RBQzJfUklHSFRfVk9MVU1FLCAwLCA5NiwgMCwgZGlnaXRhbF90bHYpLAorCVNPQ19ET1VCTEVfUl9UTFYoIkFJRjJEQUMgVm9sdW1lIiwgV004OTk1X0FJRjJfREFDX0xFRlRfVk9MVU1FLAorCQlXTTg5OTVfQUlGMl9EQUNfUklHSFRfVk9MVU1FLCAwLCA5NiwgMCwgZGlnaXRhbF90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiSU4xTFIgVm9sdW1lIiwgV004OTk1X0xFRlRfTElORV9JTlBVVF8xX1ZPTFVNRSwKKwkJV004OTk1X1JJR0hUX0xJTkVfSU5QVVRfMV9WT0xVTUUsIDAsIDMxLCAwLCBpbjFscl9wZ2FfdGx2KSwKKworCVNPQ19TSU5HTEVfVExWKCJJTjFMIEJvb3N0IiwgV004OTk1X0xFRlRfTElORV9JTlBVVF9DT05UUk9MLAorCQk0LCAzLCAwLCBpbjFsX2Jvb3N0X3RsdiksCisKKwlTT0NfRU5VTSgiSU4xTCBNb2RlIiwgaW4xbF9lbnVtKSwKKwlTT0NfRU5VTSgiSU4xUiBNb2RlIiwgaW4xcl9lbnVtKSwKKworCVNPQ19FTlVNKCJETUlDMSBTUkMiLCBkbWljX3NyYzFfZW51bSksCisJU09DX0VOVU0oIkRNSUMyIFNSQyIsIGRtaWNfc3JjMl9lbnVtKSwKKworCVNPQ19ET1VCTEVfVExWKCJEQUMxIFNpZGV0b25lIFZvbHVtZSIsIFdNODk5NV9EQUMxX01JWEVSX1ZPTFVNRVMsIDAsIDUsCisJCTI0LCAwLCBzaWRldG9uZV90bHYpLAorCVNPQ19ET1VCTEVfVExWKCJEQUMyIFNpZGV0b25lIFZvbHVtZSIsIFdNODk5NV9EQUMyX01JWEVSX1ZPTFVNRVMsIDAsIDUsCisJCTI0LCAwLCBzaWRldG9uZV90bHYpLAorCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMUFEQzEgVm9sdW1lIiwgV004OTk1X0FJRjFfQURDMV9MRUZUX1ZPTFVNRSwKKwkJV004OTk1X0FJRjFfQURDMV9SSUdIVF9WT0xVTUUsIDAsIDk2LCAwLCBkaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMUFEQzIgVm9sdW1lIiwgV004OTk1X0FJRjFfQURDMl9MRUZUX1ZPTFVNRSwKKwkJV004OTk1X0FJRjFfQURDMl9SSUdIVF9WT0xVTUUsIDAsIDk2LCAwLCBkaWdpdGFsX3RsdiksCisJU09DX0RPVUJMRV9SX1RMVigiQUlGMkFEQyBWb2x1bWUiLCBXTTg5OTVfQUlGMl9BRENfTEVGVF9WT0xVTUUsCisJCVdNODk5NV9BSUYyX0FEQ19SSUdIVF9WT0xVTUUsIDAsIDk2LCAwLCBkaWdpdGFsX3RsdikKK307CisKK3N0YXRpYyB2b2lkIHdtODk5NV91cGRhdGVfY2xhc3NfdyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGVuYWJsZSA9IDE7CisJaW50IHNvdXJjZSA9IDA7ICAvKiBHQ0MgZmxvdyBhbmFseXNpcyBjYW4ndCB0cmFjayBlbmFibGUgKi8KKwlpbnQgcmVnLCByZWdfcjsKKworCS8qIFdlIGFsc28gbmVlZCB0aGUgc2FtZSBzZXR0aW5nIGZvciBML1IgYW5kIG9ubHkgb25lIHBhdGggKi8KKwlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5NV9EQUMxX0xFRlRfTUlYRVJfUk9VVElORyk7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFdNODk5NV9BSUYyREFDTF9UT19EQUMxTDoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQ2xhc3MgVyBzb3VyY2UgQUlGMkRBQ1xuIik7CisJCXNvdXJjZSA9IDIgPDwgV004OTk1X0NQX0RZTl9TUkNfU0VMX1NISUZUOworCQlicmVhazsKKwljYXNlIFdNODk5NV9BSUYxREFDMkxfVE9fREFDMUw6CisJCWRldl9kYmcoY29kZWMtPmRldiwgIkNsYXNzIFcgc291cmNlIEFJRjFEQUMyXG4iKTsKKwkJc291cmNlID0gMSA8PCBXTTg5OTVfQ1BfRFlOX1NSQ19TRUxfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgV004OTk1X0FJRjFEQUMxTF9UT19EQUMxTDoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQ2xhc3MgVyBzb3VyY2UgQUlGMURBQzFcbiIpOworCQlzb3VyY2UgPSAwIDw8IFdNODk5NV9DUF9EWU5fU1JDX1NFTF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiREFDIG1peGVyIHNldHRpbmc6ICV4XG4iLCByZWcpOworCQllbmFibGUgPSAwOworCQlicmVhazsKKwl9CisKKwlyZWdfciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk1X0RBQzFfUklHSFRfTUlYRVJfUk9VVElORyk7CisJaWYgKHJlZ19yICE9IHJlZykgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJMZWZ0IGFuZCByaWdodCBEQUMgbWl4ZXJzIGRpZmZlcmVudFxuIik7CisJCWVuYWJsZSA9IDA7CisJfQorCisJaWYgKGVuYWJsZSkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJDbGFzcyBXIGVuYWJsZWRcbiIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQ0xBU1NfV18xLAorCQkJCSAgICBXTTg5OTVfQ1BfRFlOX1BXUl9NQVNLIHwKKwkJCQkgICAgV004OTk1X0NQX0RZTl9TUkNfU0VMX01BU0ssCisJCQkJICAgIHNvdXJjZSB8IFdNODk5NV9DUF9EWU5fUFdSKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJDbGFzcyBXIGRpc2FibGVkXG4iKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0NMQVNTX1dfMSwKKwkJCQkgICAgV004OTk1X0NQX0RZTl9QV1JfTUFTSywgMCk7CisJfQorfQorCitzdGF0aWMgaW50IGNoZWNrX2Nsa19zeXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnOworCWNvbnN0IGNoYXIgKmNsazsKKworCXJlZyA9IHNuZF9zb2NfcmVhZChzb3VyY2UtPmNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSk7CisJLyogQ2hlY2sgd2hhdCB3ZSdyZSBjdXJyZW50bHkgdXNpbmcgZm9yIENMS19TWVMgKi8KKwlpZiAocmVnICYgV004OTk1X1NZU0NMS19TUkMpCisJCWNsayA9ICJBSUYyQ0xLIjsKKwllbHNlCisJCWNsayA9ICJBSUYxQ0xLIjsKKwlyZXR1cm4gIXN0cmNtcChzb3VyY2UtPm5hbWUsIGNsayk7Cit9CisKK3N0YXRpYyBpbnQgd204OTk1X3B1dF9jbGFzc193KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCWludCByZXQ7CisKKwl3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWNvZGVjID0gdy0+Y29kZWM7CisJcmV0ID0gc25kX3NvY19kYXBtX3B1dF92b2xzdyhrY29udHJvbCwgdWNvbnRyb2wpOworCXdtODk5NV91cGRhdGVfY2xhc3Nfdyhjb2RlYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBocF9zdXBwbHlfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKworCWNvZGVjID0gdy0+Y29kZWM7CisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyogRW5hYmxlIHRoZSBoZWFkcGhvbmUgYW1wICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJICAgIFdNODk5NV9IUE9VVDFMX0VOQV9NQVNLIHwKKwkJCQkgICAgV004OTk1X0hQT1VUMVJfRU5BX01BU0ssCisJCQkJICAgIFdNODk5NV9IUE9VVDFMX0VOQSB8CisJCQkJICAgIFdNODk5NV9IUE9VVDFSX0VOQSk7CisKKwkJLyogRW5hYmxlIHRoZSBzZWNvbmQgc3RhZ2UgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0FOQUxPR1VFX0hQXzEsCisJCQkJICAgIFdNODk5NV9IUE9VVDFMX0RMWV9NQVNLIHwKKwkJCQkgICAgV004OTk1X0hQT1VUMVJfRExZX01BU0ssCisJCQkJICAgIFdNODk5NV9IUE9VVDFMX0RMWSB8CisJCQkJICAgIFdNODk5NV9IUE9VVDFSX0RMWSk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9DSEFSR0VfUFVNUF8xLAorCQkJCSAgICBXTTg5OTVfQ1BfRU5BX01BU0ssIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGNfc2Vydm9fY21kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCSB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwlpbnQgdGltZW91dCA9IDEwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHJlZyA9ICUjeCwgdmFsID0gJSN4LCBtYXNrID0gJSN4XG4iLAorCQlfX2Z1bmNfXywgcmVnLCB2YWwsIG1hc2spOworCisJc25kX3NvY193cml0ZShjb2RlYywgcmVnLCB2YWwpOworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJbXNsZWVwKDEwKTsKKwkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfRENfU0VSVk9fUkVBREJBQ0tfMCk7CisJCWlmICgodmFsICYgbWFzaykgPT0gbWFzaykKKwkJCXJldHVybjsKKwl9CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgREMgU2Vydm9cbiIpOworfQorCitzdGF0aWMgaW50IGhwX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJdW5zaWduZWQgaW50IHJlZzsKKworCWNvZGVjID0gdy0+Y29kZWM7CisJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfQU5BTE9HVUVfSFBfMSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9DSEFSR0VfUFVNUF8xLAorCQkJCSAgICBXTTg5OTVfQ1BfRU5BX01BU0ssIFdNODk5NV9DUF9FTkEpOworCisJCW1zbGVlcCg1KTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTVfSFBPVVQxTF9FTkFfTUFTSyB8CisJCQkJICAgIFdNODk5NV9IUE9VVDFSX0VOQV9NQVNLLAorCQkJCSAgICBXTTg5OTVfSFBPVVQxTF9FTkEgfCBXTTg5OTVfSFBPVVQxUl9FTkEpOworCisJCXVkZWxheSgyMCk7CisKKwkJcmVnIHw9IFdNODk5NV9IUE9VVDFMX0RMWSB8IFdNODk5NV9IUE9VVDFSX0RMWTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTk1X0FOQUxPR1VFX0hQXzEsIHJlZyk7CisKKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTk1X0RDX1NFUlZPXzEsIFdNODk5NV9EQ1NfRU5BX0NIQU5fMCB8CisJCQkgICAgICBXTTg5OTVfRENTX0VOQV9DSEFOXzEpOworCisJCWRjX3NlcnZvX2NtZChjb2RlYywgV004OTk1X0RDX1NFUlZPXzIsCisJCQkgICAgIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzAgfAorCQkJICAgICBXTTg5OTVfRENTX1RSSUdfU1RBUlRVUF8xLAorCQkJICAgICBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzAgfAorCQkJICAgICBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzEpOworCisJCXJlZyB8PSBXTTg5OTVfSFBPVVQxUl9PVVRQIHwgV004OTk1X0hQT1VUMVJfUk1WX1NIT1JUIHwKKwkJICAgICAgIFdNODk5NV9IUE9VVDFMX09VVFAgfCBXTTg5OTVfSFBPVVQxTF9STVZfU0hPUlQ7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5NV9BTkFMT0dVRV9IUF8xLCByZWcpOworCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BTkFMT0dVRV9IUF8xLAorCQkJCSAgICBXTTg5OTVfSFBPVVQxTF9PVVRQX01BU0sgfAorCQkJCSAgICBXTTg5OTVfSFBPVVQxUl9PVVRQX01BU0sgfAorCQkJCSAgICBXTTg5OTVfSFBPVVQxTF9STVZfU0hPUlRfTUFTSyB8CisJCQkJICAgIFdNODk5NV9IUE9VVDFSX1JNVl9TSE9SVF9NQVNLLCAwKTsKKworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQU5BTE9HVUVfSFBfMSwKKwkJCQkgICAgV004OTk1X0hQT1VUMUxfRExZX01BU0sgfAorCQkJCSAgICBXTTg5OTVfSFBPVVQxUl9ETFlfTUFTSywgMCk7CisKKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTk1X0RDX1NFUlZPXzEsIDApOworCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJICAgIFdNODk5NV9IUE9VVDFMX0VOQV9NQVNLIHwKKwkJCQkgICAgV004OTk1X0hQT1VUMVJfRU5BX01BU0ssCisJCQkJICAgIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWd1cmVfYWlmX2Nsb2NrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGFpZikKK3sKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlpbnQgcmF0ZTsKKwlpbnQgcmVnMSA9IDA7CisJaW50IG9mZnNldDsKKworCXdtODk5NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGFpZikKKwkJb2Zmc2V0ID0gNDsKKwllbHNlCisJCW9mZnNldCA9IDA7CisKKwlzd2l0Y2ggKHdtODk5NS0+c3lzY2xrW2FpZl0pIHsKKwljYXNlIFdNODk5NV9TWVNDTEtfTUNMSzE6CisJCXJhdGUgPSB3bTg5OTUtPm1jbGtbMF07CisJCWJyZWFrOworCWNhc2UgV004OTk1X1NZU0NMS19NQ0xLMjoKKwkJcmVnMSB8PSAweDg7CisJCXJhdGUgPSB3bTg5OTUtPm1jbGtbMV07CisJCWJyZWFrOworCWNhc2UgV004OTk1X1NZU0NMS19GTEwxOgorCQlyZWcxIHw9IDB4MTA7CisJCXJhdGUgPSB3bTg5OTUtPmZsbFswXS5vdXQ7CisJCWJyZWFrOworCWNhc2UgV004OTk1X1NZU0NMS19GTEwyOgorCQlyZWcxIHw9IDB4MTg7CisJCXJhdGUgPSB3bTg5OTUtPmZsbFsxXS5vdXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyYXRlID49IDEzNTAwMDAwKSB7CisJCXJhdGUgLz0gMjsKKwkJcmVnMSB8PSBXTTg5OTVfQUlGMUNMS19ESVY7CisKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRGl2aWRpbmcgQUlGJWQgY2xvY2sgdG8gJWRIelxuIiwKKwkJCWFpZiArIDEsIHJhdGUpOworCX0KKworCXdtODk5NS0+YWlmY2xrW2FpZl0gPSByYXRlOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0FJRjFfQ0xPQ0tJTkdfMSArIG9mZnNldCwKKwkJCSAgICBXTTg5OTVfQUlGMUNMS19TUkNfTUFTSyB8IFdNODk5NV9BSUYxQ0xLX0RJVl9NQVNLLAorCQkJICAgIHJlZzEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9jbG9jayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHdtODk5NV9wcml2ICp3bTg5OTU7CisJaW50IG9sZCwgbmV3OworCisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwkvKiBCcmluZyB1cCB0aGUgQUlGIGNsb2NrcyBmaXJzdCAqLworCWNvbmZpZ3VyZV9haWZfY2xvY2soY29kZWMsIDApOworCWNvbmZpZ3VyZV9haWZfY2xvY2soY29kZWMsIDEpOworCisJLyoKKwkgKiBUaGVuIHN3aXRjaCBDTEtfU1lTIG92ZXIgdG8gdGhlIGhpZ2hlciBvZiB0aGVtOyBhIGNoYW5nZQorCSAqIGNhbiBvbmx5IGhhcHBlbiBhcyBhIHJlc3VsdCBvZiBhIGNsb2NraW5nIGNoYW5nZSB3aGljaCBjYW4KKwkgKiBvbmx5IGJlIG1hZGUgb3V0c2lkZSBvZiBEQVBNIHNvIHdlIGNhbiBzYWZlbHkgcmVkbyB0aGUKKwkgKiBjbG9ja2luZy4KKwkgKi8KKworCS8qIElmIHRoZXkncmUgZXF1YWwgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggaXMgdXNlZCAqLworCWlmICh3bTg5OTUtPmFpZmNsa1swXSA9PSB3bTg5OTUtPmFpZmNsa1sxXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAod204OTk1LT5haWZjbGtbMF0gPCB3bTg5OTUtPmFpZmNsa1sxXSkKKwkJbmV3ID0gV004OTk1X1NZU0NMS19TUkM7CisJZWxzZQorCQluZXcgPSAwOworCisJb2xkID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSkgJiBXTTg5OTVfU1lTQ0xLX1NSQzsKKworCS8qIElmIHRoZXJlJ3Mgbm8gY2hhbmdlIHRoZW4gd2UncmUgZG9uZS4gKi8KKwlpZiAob2xkID09IG5ldykKKwkJcmV0dXJuIDA7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQ0xPQ0tJTkdfMSwKKwkJCSAgICBXTTg5OTVfU1lTQ0xLX1NSQ19NQVNLLCBuZXcpOworCisJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsa19zeXNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisKKwljb2RlYyA9IHctPmNvZGVjOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCXJldHVybiBjb25maWd1cmVfY2xvY2soY29kZWMpOworCisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWNvbmZpZ3VyZV9jbG9jayhjb2RlYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2lkZXRvbmVfdGV4dFtdID0geworCSJBREMvRE1JQzEiLCAiRE1JQzIiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZTFfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NV9TSURFVE9ORSwgMCwgMiwgc2lkZXRvbmVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzaWRldG9uZTFfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJMZWZ0IFNpZGV0b25lIE11eCIsIHNpZGV0b25lMV9lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzaWRldG9uZTJfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKFdNODk5NV9TSURFVE9ORSwgMSwgMiwgc2lkZXRvbmVfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzaWRldG9uZTJfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJSaWdodCBTaWRldG9uZSBNdXgiLCBzaWRldG9uZTJfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYxYWRjMWxfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMvRE1JQyBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMxX0xFRlRfTUlYRVJfUk9VVElORywKKwkJMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBSUYyIFN3aXRjaCIsIFdNODk5NV9BSUYxX0FEQzFfTEVGVF9NSVhFUl9ST1VUSU5HLAorCQkwLCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYxYWRjMXJfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMvRE1JQyBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMxX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQUlGMiBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMxX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFhZGMybF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRNSUMgU3dpdGNoIiwgV004OTk1X0FJRjFfQURDMl9MRUZUX01JWEVSX1JPVVRJTkcsCisJCTEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQUlGMiBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMyX0xFRlRfTUlYRVJfUk9VVElORywKKwkJMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMWFkYzJyX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRE1JQyBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMyX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTEsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiQUlGMiBTd2l0Y2giLCBXTTg5OTVfQUlGMV9BREMyX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhYzFsX21peFtdID0geworCVdNODk5NV9DTEFTU19XX1NXSVRDSCgiUmlnaHQgU2lkZXRvbmUgU3dpdGNoIiwgV004OTk1X0RBQzFfTEVGVF9NSVhFUl9ST1VUSU5HLAorCQk1LCAxLCAwKSwKKwlXTTg5OTVfQ0xBU1NfV19TV0lUQ0goIkxlZnQgU2lkZXRvbmUgU3dpdGNoIiwgV004OTk1X0RBQzFfTEVGVF9NSVhFUl9ST1VUSU5HLAorCQk0LCAxLCAwKSwKKwlXTTg5OTVfQ0xBU1NfV19TV0lUQ0goIkFJRjIgU3dpdGNoIiwgV004OTk1X0RBQzFfTEVGVF9NSVhFUl9ST1VUSU5HLAorCQkyLCAxLCAwKSwKKwlXTTg5OTVfQ0xBU1NfV19TV0lUQ0goIkFJRjEuMiBTd2l0Y2giLCBXTTg5OTVfREFDMV9MRUZUX01JWEVSX1JPVVRJTkcsCisJCTEsIDEsIDApLAorCVdNODk5NV9DTEFTU19XX1NXSVRDSCgiQUlGMS4xIFN3aXRjaCIsIFdNODk5NV9EQUMxX0xFRlRfTUlYRVJfUk9VVElORywKKwkJMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMXJfbWl4W10gPSB7CisJV004OTk1X0NMQVNTX1dfU1dJVENIKCJSaWdodCBTaWRldG9uZSBTd2l0Y2giLCBXTTg5OTVfREFDMV9SSUdIVF9NSVhFUl9ST1VUSU5HLAorCQk1LCAxLCAwKSwKKwlXTTg5OTVfQ0xBU1NfV19TV0lUQ0goIkxlZnQgU2lkZXRvbmUgU3dpdGNoIiwgV004OTk1X0RBQzFfUklHSFRfTUlYRVJfUk9VVElORywKKwkJNCwgMSwgMCksCisJV004OTk1X0NMQVNTX1dfU1dJVENIKCJBSUYyIFN3aXRjaCIsIFdNODk5NV9EQUMxX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTIsIDEsIDApLAorCVdNODk5NV9DTEFTU19XX1NXSVRDSCgiQUlGMS4yIFN3aXRjaCIsIFdNODk5NV9EQUMxX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTEsIDEsIDApLAorCVdNODk5NV9DTEFTU19XX1NXSVRDSCgiQUlGMS4xIFN3aXRjaCIsIFdNODk5NV9EQUMxX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjJkYWMybF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IFNpZGV0b25lIFN3aXRjaCIsIFdNODk5NV9EQUMyX0xFRlRfTUlYRVJfUk9VVElORywKKwkJNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJMZWZ0IFNpZGV0b25lIFN3aXRjaCIsIFdNODk5NV9EQUMyX0xFRlRfTUlYRVJfUk9VVElORywKKwkJNCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBSUYyIFN3aXRjaCIsIFdNODk5NV9EQUMyX0xFRlRfTUlYRVJfUk9VVElORywKKwkJMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBSUYxLjIgU3dpdGNoIiwgV004OTk1X0RBQzJfTEVGVF9NSVhFUl9ST1VUSU5HLAorCQkxLCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFJRjEuMSBTd2l0Y2giLCBXTTg5OTVfREFDMl9MRUZUX01JWEVSX1JPVVRJTkcsCisJCTAsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjJkYWMycl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IFNpZGV0b25lIFN3aXRjaCIsIFdNODk5NV9EQUMyX1JJR0hUX01JWEVSX1JPVVRJTkcsCisJCTUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTGVmdCBTaWRldG9uZSBTd2l0Y2giLCBXTTg5OTVfREFDMl9SSUdIVF9NSVhFUl9ST1VUSU5HLAorCQk0LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFJRjIgU3dpdGNoIiwgV004OTk1X0RBQzJfUklHSFRfTUlYRVJfUk9VVElORywKKwkJMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBSUYxLjIgU3dpdGNoIiwgV004OTk1X0RBQzJfUklHSFRfTUlYRVJfUk9VVElORywKKwkJMSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJBSUYxLjEgU3dpdGNoIiwgV004OTk1X0RBQzJfUklHSFRfTUlYRVJfUk9VVElORywKKwkJMCwgMSwgMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW4xbF9wZ2EgPQorCVNPQ19EQVBNX1NJTkdMRSgiSU4xTCBTd2l0Y2giLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF8yLCA1LCAxLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGluMXJfcGdhID0KKwlTT0NfREFQTV9TSU5HTEUoIklOMVIgU3dpdGNoIiwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMiwgNCwgMSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICphZGNfbXV4X3RleHRbXSA9IHsKKwkiQURDIiwKKwkiRE1JQyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFkY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoMCwgMCwgMiwgYWRjX211eF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY2xfbXV4ID0KKwlTT0NfREFQTV9FTlVNX1ZJUlQoIkFEQ0wgTXV4IiwgYWRjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjcl9tdXggPQorCVNPQ19EQVBNX0VOVU1fVklSVCgiQURDUiBNdXgiLCBhZGNfZW51bSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzcGtfc3JjX3RleHRbXSA9IHsKKwkiREFDMUwiLCAiREFDMVIiLCAiREFDMkwiLCAiREFDMlIiCit9OworCitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMWxfc3JjX2VudW0sIFdNODk5NV9MRUZUX1BETV9TUEVBS0VSXzEsCisJCQkJICAwLCBzcGtfc3JjX3RleHQpOworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazFyX3NyY19lbnVtLCBXTTg5OTVfUklHSFRfUERNX1NQRUFLRVJfMSwKKwkJCQkgIDAsIHNwa19zcmNfdGV4dCk7CitzdGF0aWMgY29uc3QgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3BrMmxfc3JjX2VudW0sIFdNODk5NV9MRUZUX1BETV9TUEVBS0VSXzIsCisJCQkJICAwLCBzcGtfc3JjX3RleHQpOworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHNwazJyX3NyY19lbnVtLCBXTTg5OTVfUklHSFRfUERNX1NQRUFLRVJfMiwKKwkJCQkgIDAsIHNwa19zcmNfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGsxbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNQSzFMIFNSQyIsIHNwazFsX3NyY19lbnVtKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGsxcl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNQSzFSIFNSQyIsIHNwazFyX3NyY19lbnVtKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGsybF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNQSzJMIFNSQyIsIHNwazJsX3NyY19lbnVtKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGsycl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNQSzJSIFNSQyIsIHNwazJyX3NyY19lbnVtKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODk5NV9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSU5QVVQoIkRNSUMxREFUIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJETUlDMkRBVCIpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFMIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFSIiksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklOMUwgUEdBIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmaW4xbF9wZ2EsIDEpLAorCVNORF9TT0NfREFQTV9NSVhFUigiSU4xUiBQR0EiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZpbjFyX3BnYSwgMSksCisKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUzEiLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF8xLCA4LCAwKSwKKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUzIiLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF8xLCA5LCAwKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkFJRjFDTEsiLCBXTTg5OTVfQUlGMV9DTE9DS0lOR18xLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBSUYyQ0xLIiwgV004OTk1X0FJRjJfQ0xPQ0tJTkdfMSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiRFNQMUNMSyIsIFdNODk5NV9DTE9DS0lOR18xLCAzLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJEU1AyQ0xLIiwgV004OTk1X0NMT0NLSU5HXzEsIDIsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlNZU0RTUENMSyIsIFdNODk5NV9DTE9DS0lOR18xLCAxLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJDTEtfU1lTIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBjbGtfc3lzX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fQUlGX09VVCgiQUlGMUFEQzFMIiwgIkFJRjEgQ2FwdHVyZSIsIDAsCisJCVdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzMsIDksIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYxQURDMVIiLCAiQUlGMSBDYXB0dXJlIiwgMCwKKwkJV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgOCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjFBRENEQVQiLCAiQUlGMSBDYXB0dXJlIiwgMCwKKwlTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYxQURDMkwiLCAiQUlGMSBDYXB0dXJlIiwKKwkJMCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgMTEsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYxQURDMlIiLCAiQUlGMSBDYXB0dXJlIiwKKwkJMCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgMTAsIDApLAorCisJU05EX1NPQ19EQVBNX1ZJUlRfTVVYKCJBRENMIE11eCIsIFNORF9TT0NfTk9QTSwgMSwgMCwKKwkJJmFkY2xfbXV4KSwKKwlTTkRfU09DX0RBUE1fVklSVF9NVVgoIkFEQ1IgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmYWRjcl9tdXgpLAorCisJU05EX1NPQ19EQVBNX0FEQygiRE1JQzJMIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgNSwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiRE1JQzJSIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgNCwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiRE1JQzFMIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgMywgMCksCisJU05EX1NPQ19EQVBNX0FEQygiRE1JQzFSIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgMiwgMCksCisKKwlTTkRfU09DX0RBUE1fQURDKCJBRENMIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMywgMSwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiQURDUiIsIE5VTEwsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzMsIDAsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUYxQURDMUwgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFpZjFhZGMxbF9taXgsIEFSUkFZX1NJWkUoYWlmMWFkYzFsX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUlGMUFEQzFSIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlhaWYxYWRjMXJfbWl4LCBBUlJBWV9TSVpFKGFpZjFhZGMxcl9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjFBREMyTCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWlmMWFkYzJsX21peCwgQVJSQVlfU0laRShhaWYxYWRjMmxfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUYxQURDMlIgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFpZjFhZGMycl9taXgsIEFSUkFZX1NJWkUoYWlmMWFkYzJyX21peCkpLAorCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMURBQzFMIiwgTlVMTCwgMCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNCwKKwkJOSwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMURBQzFSIiwgTlVMTCwgMCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNCwKKwkJOCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMURBQ0RBVCIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAorCQkwLCAwKSwKKworCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRjFEQUMyTCIsIE5VTEwsIDAsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzQsCisJCTExLCAwKSwKKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxREFDMlIiLCBOVUxMLCAwLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF80LAorCQkxMCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjJEQUMyTCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJYWlmMmRhYzJsX21peCwgQVJSQVlfU0laRShhaWYyZGFjMmxfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJBSUYyREFDMlIgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWFpZjJkYWMycl9taXgsIEFSUkFZX1NJWkUoYWlmMmRhYzJyX21peCkpLAorCisJU05EX1NPQ19EQVBNX0RBQygiREFDMkwiLCBOVUxMLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF80LCAzLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMyUiIsIE5VTEwsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzQsIDIsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQzFMIiwgTlVMTCwgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNCwgMSwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiREFDMVIiLCBOVUxMLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF80LCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9NSVhFUigiREFDMUwgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIGRhYzFsX21peCwKKwkJQVJSQVlfU0laRShkYWMxbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkRBQzFSIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBkYWMxcl9taXgsCisJCUFSUkFZX1NJWkUoZGFjMXJfbWl4KSksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJMZWZ0IFNpZGV0b25lIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmc2lkZXRvbmUxX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUmlnaHQgU2lkZXRvbmUiLCBTTkRfU09DX05PUE0sIDAsIDAsICZzaWRldG9uZTJfbXV4KSwKKworCVNORF9TT0NfREFQTV9QR0FfRSgiSGVhZHBob25lIFBHQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKKwkJaHBfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkhlYWRwaG9uZSBTdXBwbHkiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCWhwX3N1cHBseV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCisKKwlTTkRfU09DX0RBUE1fTVVYKCJTUEsxTCBEcml2ZXIiLCBXTTg5OTVfTEVGVF9QRE1fU1BFQUtFUl8xLAorCQk0LCAwLCAmc3BrMWxfbXV4KSwKKwlTTkRfU09DX0RBUE1fTVVYKCJTUEsxUiBEcml2ZXIiLCBXTTg5OTVfUklHSFRfUERNX1NQRUFLRVJfMSwKKwkJNCwgMCwgJnNwazFyX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU1BLMkwgRHJpdmVyIiwgV004OTk1X0xFRlRfUERNX1NQRUFLRVJfMiwKKwkJNCwgMCwgJnNwazJsX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU1BLMlIgRHJpdmVyIiwgV004OTk1X1JJR0hUX1BETV9TUEVBS0VSXzIsCisJCTQsIDAsICZzcGsycl9tdXgpLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPMiIsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzIsIDEsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFAxTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQMVIiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEsxTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQSzFSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMkwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEsyUiIpCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3bTg5OTVfaW50ZXJjb25bXSA9IHsKKwl7ICJDTEtfU1lTIiwgTlVMTCwgIkFJRjFDTEsiLCBjaGVja19jbGtfc3lzIH0sCisJeyAiQ0xLX1NZUyIsIE5VTEwsICJBSUYyQ0xLIiwgY2hlY2tfY2xrX3N5cyB9LAorCisJeyAiRFNQMUNMSyIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIkRTUDJDTEsiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKKwl7ICJTWVNEU1BDTEsiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKKworCXsgIkFJRjFBREMxTCIsIE5VTEwsICJBSUYxQ0xLIiB9LAorCXsgIkFJRjFBREMxTCIsIE5VTEwsICJEU1AxQ0xLIiB9LAorCXsgIkFJRjFBREMxUiIsIE5VTEwsICJBSUYxQ0xLIiB9LAorCXsgIkFJRjFBREMxUiIsIE5VTEwsICJEU1AxQ0xLIiB9LAorCXsgIkFJRjFBREMxUiIsIE5VTEwsICJTWVNEU1BDTEsiIH0sCisKKwl7ICJBSUYxQURDMkwiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJBSUYxQURDMkwiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJBSUYxQURDMlIiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJBSUYxQURDMlIiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJBSUYxQURDMlIiLCBOVUxMLCAiU1lTRFNQQ0xLIiB9LAorCisJeyAiRE1JQzFMIiwgTlVMTCwgIkRNSUMxREFUIiB9LAorCXsgIkRNSUMxTCIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIkRNSUMxUiIsIE5VTEwsICJETUlDMURBVCIgfSwKKwl7ICJETUlDMVIiLCBOVUxMLCAiQ0xLX1NZUyIgfSwKKwl7ICJETUlDMkwiLCBOVUxMLCAiRE1JQzJEQVQiIH0sCisJeyAiRE1JQzJMIiwgTlVMTCwgIkNMS19TWVMiIH0sCisJeyAiRE1JQzJSIiwgTlVMTCwgIkRNSUMyREFUIiB9LAorCXsgIkRNSUMyUiIsIE5VTEwsICJDTEtfU1lTIiB9LAorCisJeyAiQURDTCIsIE5VTEwsICJBSUYxQ0xLIiB9LAorCXsgIkFEQ0wiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJBRENMIiwgTlVMTCwgIlNZU0RTUENMSyIgfSwKKworCXsgIkFEQ1IiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJBRENSIiwgTlVMTCwgIkRTUDFDTEsiIH0sCisJeyAiQURDUiIsIE5VTEwsICJTWVNEU1BDTEsiIH0sCisKKwl7ICJJTjFMIFBHQSIsICJJTjFMIFN3aXRjaCIsICJJTjFMIiB9LAorCXsgIklOMVIgUEdBIiwgIklOMVIgU3dpdGNoIiwgIklOMVIiIH0sCisJeyAiSU4xTCBQR0EiLCBOVUxMLCAiTERPMiIgfSwKKwl7ICJJTjFSIFBHQSIsIE5VTEwsICJMRE8yIiB9LAorCisJeyAiQURDTCIsIE5VTEwsICJJTjFMIFBHQSIgfSwKKwl7ICJBRENSIiwgTlVMTCwgIklOMVIgUEdBIiB9LAorCisJeyAiQURDTCBNdXgiLCAiQURDIiwgIkFEQ0wiIH0sCisJeyAiQURDTCBNdXgiLCAiRE1JQyIsICJETUlDMUwiIH0sCisJeyAiQURDUiBNdXgiLCAiQURDIiwgIkFEQ1IiIH0sCisJeyAiQURDUiBNdXgiLCAiRE1JQyIsICJETUlDMVIiIH0sCisKKwkvKiBBSUYxIG91dHB1dHMgKi8KKwl7ICJBSUYxQURDMUwiLCBOVUxMLCAiQUlGMUFEQzFMIE1peGVyIiB9LAorCXsgIkFJRjFBREMxTCBNaXhlciIsICJBREMvRE1JQyBTd2l0Y2giLCAiQURDTCBNdXgiIH0sCisKKwl7ICJBSUYxQURDMVIiLCBOVUxMLCAiQUlGMUFEQzFSIE1peGVyIiB9LAorCXsgIkFJRjFBREMxUiBNaXhlciIsICJBREMvRE1JQyBTd2l0Y2giLCAiQURDUiBNdXgiIH0sCisKKwl7ICJBSUYxQURDMkwiLCBOVUxMLCAiQUlGMUFEQzJMIE1peGVyIiB9LAorCXsgIkFJRjFBREMyTCBNaXhlciIsICJETUlDIFN3aXRjaCIsICJETUlDMkwiIH0sCisKKwl7ICJBSUYxQURDMlIiLCBOVUxMLCAiQUlGMUFEQzJSIE1peGVyIiB9LAorCXsgIkFJRjFBREMyUiBNaXhlciIsICJETUlDIFN3aXRjaCIsICJETUlDMlIiIH0sCisKKwkvKiBTaWRldG9uZSAqLworCXsgIkxlZnQgU2lkZXRvbmUiLCAiQURDL0RNSUMxIiwgIkFJRjFBREMxTCIgfSwKKwl7ICJMZWZ0IFNpZGV0b25lIiwgIkRNSUMyIiwgIkFJRjFBREMyTCIgfSwKKwl7ICJSaWdodCBTaWRldG9uZSIsICJBREMvRE1JQzEiLCAiQUlGMUFEQzFSIiB9LAorCXsgIlJpZ2h0IFNpZGV0b25lIiwgIkRNSUMyIiwgIkFJRjFBREMyUiIgfSwKKworCXsgIkFJRjFEQUMxTCIsIE5VTEwsICJBSUYxQ0xLIiB9LAorCXsgIkFJRjFEQUMxTCIsIE5VTEwsICJEU1AxQ0xLIiB9LAorCXsgIkFJRjFEQUMxUiIsIE5VTEwsICJBSUYxQ0xLIiB9LAorCXsgIkFJRjFEQUMxUiIsIE5VTEwsICJEU1AxQ0xLIiB9LAorCXsgIkFJRjFEQUMxUiIsIE5VTEwsICJTWVNEU1BDTEsiIH0sCisKKwl7ICJBSUYxREFDMkwiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJBSUYxREFDMkwiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJBSUYxREFDMlIiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJBSUYxREFDMlIiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJBSUYxREFDMlIiLCBOVUxMLCAiU1lTRFNQQ0xLIiB9LAorCisJeyAiREFDMUwiLCBOVUxMLCAiQUlGMUNMSyIgfSwKKwl7ICJEQUMxTCIsIE5VTEwsICJEU1AxQ0xLIiB9LAorCXsgIkRBQzFMIiwgTlVMTCwgIlNZU0RTUENMSyIgfSwKKworCXsgIkRBQzFSIiwgTlVMTCwgIkFJRjFDTEsiIH0sCisJeyAiREFDMVIiLCBOVUxMLCAiRFNQMUNMSyIgfSwKKwl7ICJEQUMxUiIsIE5VTEwsICJTWVNEU1BDTEsiIH0sCisKKwl7ICJBSUYxREFDMUwiLCBOVUxMLCAiQUlGMURBQ0RBVCIgfSwKKwl7ICJBSUYxREFDMVIiLCBOVUxMLCAiQUlGMURBQ0RBVCIgfSwKKwl7ICJBSUYxREFDMkwiLCBOVUxMLCAiQUlGMURBQ0RBVCIgfSwKKwl7ICJBSUYxREFDMlIiLCBOVUxMLCAiQUlGMURBQ0RBVCIgfSwKKworCS8qIERBQzEgaW5wdXRzICovCisJeyAiREFDMUwiLCBOVUxMLCAiREFDMUwgTWl4ZXIiIH0sCisJeyAiREFDMUwgTWl4ZXIiLCAiQUlGMS4xIFN3aXRjaCIsICJBSUYxREFDMUwiIH0sCisJeyAiREFDMUwgTWl4ZXIiLCAiQUlGMS4yIFN3aXRjaCIsICJBSUYxREFDMkwiIH0sCisJeyAiREFDMUwgTWl4ZXIiLCAiTGVmdCBTaWRldG9uZSBTd2l0Y2giLCAiTGVmdCBTaWRldG9uZSIgfSwKKwl7ICJEQUMxTCBNaXhlciIsICJSaWdodCBTaWRldG9uZSBTd2l0Y2giLCAiUmlnaHQgU2lkZXRvbmUiIH0sCisKKwl7ICJEQUMxUiIsIE5VTEwsICJEQUMxUiBNaXhlciIgfSwKKwl7ICJEQUMxUiBNaXhlciIsICJBSUYxLjEgU3dpdGNoIiwgIkFJRjFEQUMxUiIgfSwKKwl7ICJEQUMxUiBNaXhlciIsICJBSUYxLjIgU3dpdGNoIiwgIkFJRjFEQUMyUiIgfSwKKwl7ICJEQUMxUiBNaXhlciIsICJMZWZ0IFNpZGV0b25lIFN3aXRjaCIsICJMZWZ0IFNpZGV0b25lIiB9LAorCXsgIkRBQzFSIE1peGVyIiwgIlJpZ2h0IFNpZGV0b25lIFN3aXRjaCIsICJSaWdodCBTaWRldG9uZSIgfSwKKworCS8qIERBQzIvQUlGMiBvdXRwdXRzICovCisJeyAiREFDMkwiLCBOVUxMLCAiQUlGMkRBQzJMIE1peGVyIiB9LAorCXsgIkFJRjJEQUMyTCBNaXhlciIsICJBSUYxLjIgU3dpdGNoIiwgIkFJRjFEQUMyTCIgfSwKKwl7ICJBSUYyREFDMkwgTWl4ZXIiLCAiQUlGMS4xIFN3aXRjaCIsICJBSUYxREFDMUwiIH0sCisKKwl7ICJEQUMyUiIsIE5VTEwsICJBSUYyREFDMlIgTWl4ZXIiIH0sCisJeyAiQUlGMkRBQzJSIE1peGVyIiwgIkFJRjEuMiBTd2l0Y2giLCAiQUlGMURBQzJSIiB9LAorCXsgIkFJRjJEQUMyUiBNaXhlciIsICJBSUYxLjEgU3dpdGNoIiwgIkFJRjFEQUMxUiIgfSwKKworCS8qIE91dHB1dCBzdGFnZXMgKi8KKwl7ICJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkRBQzFMIiB9LAorCXsgIkhlYWRwaG9uZSBQR0EiLCBOVUxMLCAiREFDMVIiIH0sCisKKwl7ICJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkRBQzJMIiB9LAorCXsgIkhlYWRwaG9uZSBQR0EiLCBOVUxMLCAiREFDMlIiIH0sCisKKwl7ICJIZWFkcGhvbmUgUEdBIiwgTlVMTCwgIkhlYWRwaG9uZSBTdXBwbHkiIH0sCisJeyAiSGVhZHBob25lIFBHQSIsIE5VTEwsICJDTEtfU1lTIiB9LAorCXsgIkhlYWRwaG9uZSBQR0EiLCBOVUxMLCAiTERPMiIgfSwKKworCXsgIkhQMUwiLCBOVUxMLCAiSGVhZHBob25lIFBHQSIgfSwKKwl7ICJIUDFSIiwgTlVMTCwgIkhlYWRwaG9uZSBQR0EiIH0sCisKKwl7ICJTUEsxTCBEcml2ZXIiLCAiREFDMUwiLCAiREFDMUwiIH0sCisJeyAiU1BLMUwgRHJpdmVyIiwgIkRBQzFSIiwgIkRBQzFSIiB9LAorCXsgIlNQSzFMIERyaXZlciIsICJEQUMyTCIsICJEQUMyTCIgfSwKKwl7ICJTUEsxTCBEcml2ZXIiLCAiREFDMlIiLCAiREFDMlIiIH0sCisJeyAiU1BLMUwgRHJpdmVyIiwgTlVMTCwgIkNMS19TWVMiIH0sCisKKwl7ICJTUEsxUiBEcml2ZXIiLCAiREFDMUwiLCAiREFDMUwiIH0sCisJeyAiU1BLMVIgRHJpdmVyIiwgIkRBQzFSIiwgIkRBQzFSIiB9LAorCXsgIlNQSzFSIERyaXZlciIsICJEQUMyTCIsICJEQUMyTCIgfSwKKwl7ICJTUEsxUiBEcml2ZXIiLCAiREFDMlIiLCAiREFDMlIiIH0sCisJeyAiU1BLMVIgRHJpdmVyIiwgTlVMTCwgIkNMS19TWVMiIH0sCisKKwl7ICJTUEsyTCBEcml2ZXIiLCAiREFDMUwiLCAiREFDMUwiIH0sCisJeyAiU1BLMkwgRHJpdmVyIiwgIkRBQzFSIiwgIkRBQzFSIiB9LAorCXsgIlNQSzJMIERyaXZlciIsICJEQUMyTCIsICJEQUMyTCIgfSwKKwl7ICJTUEsyTCBEcml2ZXIiLCAiREFDMlIiLCAiREFDMlIiIH0sCisJeyAiU1BLMkwgRHJpdmVyIiwgTlVMTCwgIkNMS19TWVMiIH0sCisKKwl7ICJTUEsyUiBEcml2ZXIiLCAiREFDMUwiLCAiREFDMUwiIH0sCisJeyAiU1BLMlIgRHJpdmVyIiwgIkRBQzFSIiwgIkRBQzFSIiB9LAorCXsgIlNQSzJSIERyaXZlciIsICJEQUMyTCIsICJEQUMyTCIgfSwKKwl7ICJTUEsyUiBEcml2ZXIiLCAiREFDMlIiLCAiREFDMlIiIH0sCisJeyAiU1BLMlIgRHJpdmVyIiwgTlVMTCwgIkNMS19TWVMiIH0sCisKKwl7ICJTUEsxTCIsIE5VTEwsICJTUEsxTCBEcml2ZXIiIH0sCisJeyAiU1BLMVIiLCBOVUxMLCAiU1BLMVIgRHJpdmVyIiB9LAorCXsgIlNQSzJMIiwgTlVMTCwgIlNQSzJMIERyaXZlciIgfSwKKwl7ICJTUEsyUiIsIE5VTEwsICJTUEsyUiBEcml2ZXIiIH0KK307CisKK3N0YXRpYyBpbnQgd204OTk1X3ZvbGF0aWxlKHVuc2lnbmVkIGludCByZWcpCit7CisJLyogb3V0IG9mIGJvdW5kcyByZWdpc3RlcnMgYXJlIGdlbmVyYWxseSBjb25zaWRlcmVkCisJICogdm9sYXRpbGUgdG8gc3VwcG9ydCByZWdpc3RlciBiYW5rcyB0aGF0IGFyZSBwYXJ0aWFsbHkKKwkgKiBvd25lZCBieSBzb21ldGhpbmcgZWxzZSBmb3IgZS5nLiBhIERTUAorCSAqLworCWlmIChyZWcgPiBXTTg5OTVfTUFYX0NBQ0hFRF9SRUdJU1RFUikKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgV004OTk1X1NPRlRXQVJFX1JFU0VUOgorCWNhc2UgV004OTk1X0RDX1NFUlZPX1JFQURCQUNLXzA6CisJY2FzZSBXTTg5OTVfSU5URVJSVVBUX1NUQVRVU18xOgorCWNhc2UgV004OTk1X0lOVEVSUlVQVF9TVEFUVVNfMjoKKwljYXNlIFdNODk5NV9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSzoKKwljYXNlIFdNODk5NV9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSzoKKwljYXNlIFdNODk5NV9JTlRFUlJVUFRfQ09OVFJPTDoKKwljYXNlIFdNODk5NV9BQ0NFU1NPUllfREVURUNUX01PREUxOgorCWNhc2UgV004OTk1X0FDQ0VTU09SWV9ERVRFQ1RfTU9ERTI6CisJY2FzZSBXTTg5OTVfSEVBRFBIT05FX0RFVEVDVDE6CisJY2FzZSBXTTg5OTVfSEVBRFBIT05FX0RFVEVDVDI6CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk5NV9haWZfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlpbnQgbXV0ZV9yZWc7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIDA6CisJCW11dGVfcmVnID0gV004OTk1X0FJRjFfREFDMV9GSUxURVJTXzE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbXV0ZV9yZWcgPSBXTTg5OTVfQUlGMl9EQUNfRklMVEVSU18xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtdXRlX3JlZywgV004OTk1X0FJRjFEQUMxX01VVEVfTUFTSywKKwkJCSAgICAhIW11dGUgPDwgV004OTk1X0FJRjFEQUMxX01VVEVfU0hJRlQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk5NV9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJaW50IG1hc3RlcjsKKwlpbnQgYWlmOworCisJY29kZWMgPSBkYWktPmNvZGVjOworCisJbWFzdGVyID0gMDsKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCW1hc3RlciA9IFdNODk5NV9BSUYxX01TVFI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJVbmtub3duIG1hc3Rlci9zbGF2ZSBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWlmID0gMDsKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJYWlmIHw9IFdNODk5NV9BSUYxX0xSQ0xLX0lOVjsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlhaWYgfD0gKDB4MyA8PCBXTTg5OTVfQUlGMV9GTVRfU0hJRlQpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJYWlmIHw9ICgweDIgPDwgV004OTk1X0FJRjFfRk1UX1NISUZUKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJYWlmIHw9ICgweDEgPDwgV004OTk1X0FJRjFfRk1UX1NISUZUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgIlVua25vd24gZGFpIGZvcm1hdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCS8qIGZyYW1lIGludmVyc2lvbiBub3QgdmFsaWQgZm9yIERTUCBtb2RlcyAqLworCQlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWFpZiB8PSBXTTg5OTVfQUlGMV9CQ0xLX0lOVjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQkJYWlmIHw9IFdNODk5NV9BSUYxX0JDTEtfSU5WIHwgV004OTk1X0FJRjFfTFJDTEtfSU5WOworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCQlhaWYgfD0gV004OTk1X0FJRjFfQkNMS19JTlY7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJCWFpZiB8PSBXTTg5OTVfQUlGMV9MUkNMS19JTlY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BSUYxX0NPTlRST0xfMSwKKwkJCSAgICBXTTg5OTVfQUlGMV9CQ0xLX0lOVl9NQVNLIHwKKwkJCSAgICBXTTg5OTVfQUlGMV9MUkNMS19JTlZfTUFTSyB8CisJCQkgICAgV004OTk1X0FJRjFfRk1UX01BU0ssIGFpZik7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0FJRjFfTUFTVEVSX1NMQVZFLAorCQkJICAgIFdNODk5NV9BSUYxX01TVFJfTUFTSywgbWFzdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludCBzcnNbXSA9IHsKKwk4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwKKwk0ODAwMCwgODgyMDAsIDk2MDAwCit9OworCitzdGF0aWMgY29uc3QgaW50IGZzX3JhdGlvc1tdID0geworCS0xIC8qIHJlc2VydmVkICovLAorCTEyOCwgMTkyLCAyNTYsIDM4NCwgNTEyLCA3NjgsIDEwMjQsIDE0MDgsIDE1MzYKK307CisKK3N0YXRpYyBjb25zdCBpbnQgYmNsa19kaXZzW10gPSB7CisJMTAsIDE1LCAyMCwgMzAsIDQwLCA1NSwgNjAsIDgwLCAxMTAsIDEyMCwgMTYwLCAyMjAsIDI0MCwgMzIwLCA0NDAsIDQ4MAorfTsKKworc3RhdGljIGludCB3bTg5OTVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlpbnQgYWlmMV9yZWc7CisJaW50IGJjbGtfcmVnOworCWludCBscmNsa19yZWc7CisJaW50IHJhdGVfcmVnOworCWludCBiY2xrX3JhdGU7CisJaW50IGFpZjE7CisJaW50IGxyY2xrLCBiY2xrOworCWludCBpLCByYXRlX3ZhbCwgYmVzdCwgYmVzdF92YWwsIGN1cl92YWw7CisKKwljb2RlYyA9IGRhaS0+Y29kZWM7CisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIDA6CisJCWFpZjFfcmVnID0gV004OTk1X0FJRjFfQ09OVFJPTF8xOworCQliY2xrX3JlZyA9IFdNODk5NV9BSUYxX0JDTEs7CisJCXJhdGVfcmVnID0gV004OTk1X0FJRjFfUkFURTsKKwkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgLyogfHwKKwkJCXdtODk5NS0+bHJjbGtfc2hhcmVkWzBdICovKSB7CisJCQlscmNsa19yZWcgPSBXTTg5OTVfQUlGMURBQ19MUkNMSzsKKwkJfSBlbHNlIHsKKwkJCWxyY2xrX3JlZyA9IFdNODk5NV9BSUYxQURDX0xSQ0xLOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQUlGMSB1c2luZyBzcGxpdCBMUkNMS1xuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhaWYxX3JlZyA9IFdNODk5NV9BSUYyX0NPTlRST0xfMTsKKwkJYmNsa19yZWcgPSBXTTg5OTVfQUlGMl9CQ0xLOworCQlyYXRlX3JlZyA9IFdNODk5NV9BSUYyX1JBVEU7CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLIC8qIHx8CisJCSAgICB3bTg5OTUtPmxyY2xrX3NoYXJlZFsxXSAqLykgeworCQkJbHJjbGtfcmVnID0gV004OTk1X0FJRjJEQUNfTFJDTEs7CisJCX0gZWxzZSB7CisJCQlscmNsa19yZWcgPSBXTTg5OTVfQUlGMkFEQ19MUkNMSzsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIkFJRjIgdXNpbmcgc3BsaXQgTFJDTEtcbiIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJjbGtfcmF0ZSA9IHNuZF9zb2NfcGFyYW1zX3RvX2JjbGsocGFyYW1zKTsKKwlpZiAoYmNsa19yYXRlIDwgMCkKKwkJcmV0dXJuIGJjbGtfcmF0ZTsKKworCWFpZjEgPSAwOworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWFpZjEgfD0gKDB4MSA8PCBXTTg5OTVfQUlGMV9XTF9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCWFpZjEgfD0gKDB4MiA8PCBXTTg5OTVfQUlGMV9XTF9TSElGVCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6CisJCWFpZjEgfD0gKDB4MyA8PCBXTTg5OTVfQUlGMV9XTF9TSElGVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGFpLT5kZXYsICJVbnN1cHBvcnRlZCB3b3JkIGxlbmd0aCAldVxuIiwKKwkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRyeSB0byBmaW5kIGEgc3VpdGFibGUgc2FtcGxlIHJhdGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcnMpOyArK2kpCisJCWlmIChzcnNbaV0gPT0gcGFyYW1zX3JhdGUocGFyYW1zKSkKKwkJCWJyZWFrOworCWlmIChpID09IEFSUkFZX1NJWkUoc3JzKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiU2FtcGxlIHJhdGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmF0ZV92YWwgPSBpIDw8IFdNODk5NV9BSUYxX1NSX1NISUZUOworCisJZGV2X2RiZyhkYWktPmRldiwgIlNhbXBsZSByYXRlIGlzICVkSHpcbiIsIHNyc1tpXSk7CisJZGV2X2RiZyhkYWktPmRldiwgIkFJRiVkQ0xLIGlzICVkSHosIHRhcmdldCBCQ0xLICVkSHpcbiIsCisJCWRhaS0+aWQgKyAxLCB3bTg5OTUtPmFpZmNsa1tkYWktPmlkXSwgYmNsa19yYXRlKTsKKworCS8qIEFJRkNMSy9mcyByYXRpbzsgbG9vayBmb3IgYSBjbG9zZSBtYXRjaCBpbiBlaXRoZXIgZGlyZWN0aW9uICovCisJYmVzdCA9IDE7CisJYmVzdF92YWwgPSBhYnMoKGZzX3JhdGlvc1sxXSAqIHBhcmFtc19yYXRlKHBhcmFtcykpCisJCSAgICAgICAtIHdtODk5NS0+YWlmY2xrW2RhaS0+aWRdKTsKKwlmb3IgKGkgPSAyOyBpIDwgQVJSQVlfU0laRShmc19yYXRpb3MpOyBpKyspIHsKKwkJY3VyX3ZhbCA9IGFicygoZnNfcmF0aW9zW2ldICogcGFyYW1zX3JhdGUocGFyYW1zKSkKKwkJCSAgICAgIC0gd204OTk1LT5haWZjbGtbZGFpLT5pZF0pOworCQlpZiAoY3VyX3ZhbCA+PSBiZXN0X3ZhbCkKKwkJCWNvbnRpbnVlOworCQliZXN0ID0gaTsKKwkJYmVzdF92YWwgPSBjdXJfdmFsOworCX0KKwlyYXRlX3ZhbCB8PSBiZXN0OworCisJZGV2X2RiZyhkYWktPmRldiwgIlNlbGVjdGVkIEFJRiVkQ0xLL2ZzID0gJWRcbiIsCisJCWRhaS0+aWQgKyAxLCBmc19yYXRpb3NbYmVzdF0pOworCisJLyoKKwkgKiBXZSBtYXkgbm90IGdldCBxdWl0ZSB0aGUgcmlnaHQgZnJlcXVlbmN5IGlmIHVzaW5nCisJICogYXBwcm94aW1hdGUgY2xvY2tzIHNvIGxvb2sgZm9yIHRoZSBjbG9zZXN0IG1hdGNoIHRoYXQgaXMKKwkgKiBoaWdoZXIgdGhhbiB0aGUgdGFyZ2V0ICh3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGVub3VnaAorCSAqIEJDTEtzIHRvIGNsb2NrIG91dCB0aGUgc2FtcGxlcykuCisJICovCisJYmVzdCA9IDA7CisJYmNsayA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmNsa19kaXZzKTsgaSsrKSB7CisJCWN1cl92YWwgPSAod204OTk1LT5haWZjbGtbZGFpLT5pZF0gKiAxMCAvIGJjbGtfZGl2c1tpXSkgLSBiY2xrX3JhdGU7CisJCWlmIChjdXJfdmFsIDwgMCkgLyogQkNMSyB0YWJsZSBpcyBzb3J0ZWQgKi8KKwkJCWJyZWFrOworCQliZXN0ID0gaTsKKwl9CisJYmNsayB8PSBiZXN0IDw8IFdNODk5NV9BSUYxX0JDTEtfRElWX1NISUZUOworCisJYmNsa19yYXRlID0gd204OTk1LT5haWZjbGtbZGFpLT5pZF0gKiAxMCAvIGJjbGtfZGl2c1tiZXN0XTsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiVXNpbmcgQkNMS19ESVYgJWQgZm9yIGFjdHVhbCBCQ0xLICVkSHpcbiIsCisJCWJjbGtfZGl2c1tiZXN0XSwgYmNsa19yYXRlKTsKKworCWxyY2xrID0gYmNsa19yYXRlIC8gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiVXNpbmcgTFJDTEsgcmF0ZSAlZCBmb3IgYWN0dWFsIExSQ0xLICVkSHpcbiIsCisJCWxyY2xrLCBiY2xrX3JhdGUgLyBscmNsayk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhaWYxX3JlZywKKwkJCSAgICBXTTg5OTVfQUlGMV9XTF9NQVNLLCBhaWYxKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBiY2xrX3JlZywKKwkJCSAgICBXTTg5OTVfQUlGMV9CQ0xLX0RJVl9NQVNLLCBiY2xrKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBscmNsa19yZWcsCisJCQkgICAgV004OTk1X0FJRjFEQUNfUkFURV9NQVNLLCBscmNsayk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmF0ZV9yZWcsCisJCQkgICAgV004OTk1X0FJRjFfU1JfTUFTSyB8CisJCQkgICAgV004OTk1X0FJRjFDTEtfUkFURV9NQVNLLCByYXRlX3ZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTk1X3NldF90cmlzdGF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IHRyaXN0YXRlKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJaW50IHJlZywgdmFsLCBtYXNrOworCisJc3dpdGNoIChjb2RlY19kYWktPmlkKSB7CisJY2FzZSAwOgorCQlyZWcgPSBXTTg5OTVfQUlGMV9NQVNURVJfU0xBVkU7CisJCW1hc2sgPSBXTTg5OTVfQUlGMV9UUkk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVnID0gV004OTk1X0FJRjJfTUFTVEVSX1NMQVZFOworCQltYXNrID0gV004OTk1X0FJRjJfVFJJOworCQlicmVhazsKKwljYXNlIDI6CisJCXJlZyA9IFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzU7CisJCW1hc2sgPSBXTTg5OTVfQUlGM19UUkk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0cmlzdGF0ZSkKKwkJdmFsID0gbWFzazsKKwllbHNlCisJCXZhbCA9IDA7CisKKwlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBtYXNrLCByZWcpOworfQorCisvKiBUaGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBGTEwgZGl2aWRlIG11bHRpcGxpZWQgYnkgMTAKKyAqIHRvIGFsbG93IHJvdW5kaW5nIGxhdGVyICovCisjZGVmaW5lIEZJWEVEX0ZMTF9TSVpFICgoMSA8PCAxNikgKiAxMCkKKworc3RydWN0IGZsbF9kaXYgeworCXUxNiBvdXRkaXY7CisJdTE2IG47CisJdTE2IGs7CisJdTE2IGNsa19yZWZfZGl2OworCXUxNiBmbGxfZnJhdGlvOworfTsKKworc3RhdGljIGludCB3bTg5OTVfZ2V0X2ZsbF9jb25maWcoc3RydWN0IGZsbF9kaXYgKmZsbCwKKwkJCQkgaW50IGZyZXFfaW4sIGludCBmcmVxX291dCkKK3sKKwl1NjQgS3BhcnQ7CisJdW5zaWduZWQgaW50IEssIE5kaXYsIE5tb2Q7CisKKwlwcl9kZWJ1ZygiRkxMIGlucHV0PSVkSHosIG91dHB1dD0lZEh6XG4iLCBmcmVxX2luLCBmcmVxX291dCk7CisKKwkvKiBTY2FsZSB0aGUgaW5wdXQgZnJlcXVlbmN5IGRvd24gdG8gPD0gMTMuNU1IeiAqLworCWZsbC0+Y2xrX3JlZl9kaXYgPSAwOworCXdoaWxlIChmcmVxX2luID4gMTM1MDAwMDApIHsKKwkJZmxsLT5jbGtfcmVmX2RpdisrOworCQlmcmVxX2luIC89IDI7CisKKwkJaWYgKGZsbC0+Y2xrX3JlZl9kaXYgPiAzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByX2RlYnVnKCJDTEtfUkVGX0RJVj0lZCwgRnJlZj0lZEh6XG4iLCBmbGwtPmNsa19yZWZfZGl2LCBmcmVxX2luKTsKKworCS8qIFNjYWxlIHRoZSBvdXRwdXQgdG8gZ2l2ZSA5ME1Iejw9RnZjbzw9MTAwTUh6ICovCisJZmxsLT5vdXRkaXYgPSAzOworCXdoaWxlIChmcmVxX291dCAqIChmbGwtPm91dGRpdiArIDEpIDwgOTAwMDAwMDApIHsKKwkJZmxsLT5vdXRkaXYrKzsKKwkJaWYgKGZsbC0+b3V0ZGl2ID4gNjMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZnJlcV9vdXQgKj0gZmxsLT5vdXRkaXYgKyAxOworCXByX2RlYnVnKCJPVVRESVY9JWQsIEZ2Y289JWRIelxuIiwgZmxsLT5vdXRkaXYsIGZyZXFfb3V0KTsKKworCWlmIChmcmVxX2luID4gMTAwMDAwMCkgeworCQlmbGwtPmZsbF9mcmF0aW8gPSAwOworCX0gZWxzZSBpZiAoZnJlcV9pbiA+IDI1NjAwMCkgeworCQlmbGwtPmZsbF9mcmF0aW8gPSAxOworCQlmcmVxX2luICo9IDI7CisJfSBlbHNlIGlmIChmcmVxX2luID4gMTI4MDAwKSB7CisJCWZsbC0+ZmxsX2ZyYXRpbyA9IDI7CisJCWZyZXFfaW4gKj0gNDsKKwl9IGVsc2UgaWYgKGZyZXFfaW4gPiA2NDAwMCkgeworCQlmbGwtPmZsbF9mcmF0aW8gPSAzOworCQlmcmVxX2luICo9IDg7CisJfSBlbHNlIHsKKwkJZmxsLT5mbGxfZnJhdGlvID0gNDsKKwkJZnJlcV9pbiAqPSAxNjsKKwl9CisJcHJfZGVidWcoIkZMTF9GUkFUSU89JWQsIEZyZWY9JWRIelxuIiwgZmxsLT5mbGxfZnJhdGlvLCBmcmVxX2luKTsKKworCS8qIE5vdywgY2FsY3VsYXRlIE4uSyAqLworCU5kaXYgPSBmcmVxX291dCAvIGZyZXFfaW47CisKKwlmbGwtPm4gPSBOZGl2OworCU5tb2QgPSBmcmVxX291dCAlIGZyZXFfaW47CisJcHJfZGVidWcoIk5tb2Q9JWRcbiIsIE5tb2QpOworCisJLyogQ2FsY3VsYXRlIGZyYWN0aW9uYWwgcGFydCAtIHNjYWxlIHVwIHNvIHdlIGNhbiByb3VuZC4gKi8KKwlLcGFydCA9IEZJWEVEX0ZMTF9TSVpFICogKGxvbmcgbG9uZylObW9kOworCisJZG9fZGl2KEtwYXJ0LCBmcmVxX2luKTsKKworCUsgPSBLcGFydCAmIDB4RkZGRkZGRkY7CisKKwlpZiAoKEsgJSAxMCkgPj0gNSkKKwkJSyArPSA1OworCisJLyogTW92ZSBkb3duIHRvIHByb3BlciByYW5nZSBub3cgcm91bmRpbmcgaXMgZG9uZSAqLworCWZsbC0+ayA9IEsgLyAxMDsKKworCXByX2RlYnVnKCJOPSV4IEs9JXhcbiIsIGZsbC0+biwgZmxsLT5rKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk5NV9zZXRfZmxsKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgaWQsCisJCQkgIGludCBzcmMsIHVuc2lnbmVkIGludCBmcmVxX2luLAorCQkJICB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg5OTVfcHJpdiAqd204OTk1OworCWludCByZWdfb2Zmc2V0LCByZXQ7CisJc3RydWN0IGZsbF9kaXYgZmxsOworCXUxNiByZWcsIGFpZjEsIGFpZjI7CisKKwljb2RlYyA9IGRhaS0+Y29kZWM7CisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlhaWYxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTVfQUlGMV9DTE9DS0lOR18xKQorCSAgICAgICAmIFdNODk5NV9BSUYxQ0xLX0VOQTsKKworCWFpZjIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5NV9BSUYyX0NMT0NLSU5HXzEpCisJICAgICAgICYgV004OTk1X0FJRjJDTEtfRU5BOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgV004OTk1X0ZMTDE6CisJCXJlZ19vZmZzZXQgPSAwOworCQlpZCA9IDA7CisJCWJyZWFrOworCWNhc2UgV004OTk1X0ZMTDI6CisJCXJlZ19vZmZzZXQgPSAweDIwOworCQlpZCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc3JjKSB7CisJY2FzZSAwOgorCQkvKiBBbGxvdyBubyBzb3VyY2Ugc3BlY2lmaWNhdGlvbiB3aGVuIHN0b3BwaW5nICovCisJCWlmIChmcmVxX291dCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFdNODk5NV9GTExfU1JDX01DTEsxOgorCWNhc2UgV004OTk1X0ZMTF9TUkNfTUNMSzI6CisJY2FzZSBXTTg5OTVfRkxMX1NSQ19MUkNMSzoKKwljYXNlIFdNODk5NV9GTExfU1JDX0JDTEs6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFyZSB3ZSBjaGFuZ2luZyBhbnl0aGluZz8gKi8KKwlpZiAod204OTk1LT5mbGxbaWRdLnNyYyA9PSBzcmMgJiYKKwkgICAgd204OTk1LT5mbGxbaWRdLmluID09IGZyZXFfaW4gJiYgd204OTk1LT5mbGxbaWRdLm91dCA9PSBmcmVxX291dCkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSdyZSBzdG9wcGluZyB0aGUgRkxMIHJlZG8gdGhlIG9sZCBjb25maWcgLSBubworCSAqIHJlZ2lzdGVycyB3aWxsIGFjdHVhbGx5IGJlIHdyaXR0ZW4gYnV0IHdlIGF2b2lkIEdDQyBmbG93CisJICogYW5hbHlzaXMgYnVncyBzcGV3aW5nIHdhcm5pbmdzLgorCSAqLworCWlmIChmcmVxX291dCkKKwkJcmV0ID0gd204OTk1X2dldF9mbGxfY29uZmlnKCZmbGwsIGZyZXFfaW4sIGZyZXFfb3V0KTsKKwllbHNlCisJCXJldCA9IHdtODk5NV9nZXRfZmxsX2NvbmZpZygmZmxsLCB3bTg5OTUtPmZsbFtpZF0uaW4sCisJCQkJCSAgICB3bTg5OTUtPmZsbFtpZF0ub3V0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEdhdGUgdGhlIEFJRiBjbG9ja3Mgd2hpbGUgd2UgcmVjbG9jayAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BSUYxX0NMT0NLSU5HXzEsCisJCQkgICAgV004OTk1X0FJRjFDTEtfRU5BX01BU0ssIDApOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BSUYyX0NMT0NLSU5HXzEsCisJCQkgICAgV004OTk1X0FJRjJDTEtfRU5BX01BU0ssIDApOworCisJLyogV2UgYWx3YXlzIG5lZWQgdG8gZGlzYWJsZSB0aGUgRkxMIHdoaWxlIHJlY29uZmlndXJpbmcgKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfRkxMMV9DT05UUk9MXzEgKyByZWdfb2Zmc2V0LAorCQkJICAgIFdNODk5NV9GTEwxX0VOQV9NQVNLLCAwKTsKKworCXJlZyA9IChmbGwub3V0ZGl2IDw8IFdNODk5NV9GTEwxX09VVERJVl9TSElGVCkgfAorCSAgICAgIChmbGwuZmxsX2ZyYXRpbyA8PCBXTTg5OTVfRkxMMV9GUkFUSU9fU0hJRlQpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9GTEwxX0NPTlRST0xfMiArIHJlZ19vZmZzZXQsCisJCQkgICAgV004OTk1X0ZMTDFfT1VURElWX01BU0sgfAorCQkJICAgIFdNODk5NV9GTEwxX0ZSQVRJT19NQVNLLCByZWcpOworCisJc25kX3NvY193cml0ZShjb2RlYywgV004OTk1X0ZMTDFfQ09OVFJPTF8zICsgcmVnX29mZnNldCwgZmxsLmspOworCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0ZMTDFfQ09OVFJPTF80ICsgcmVnX29mZnNldCwKKwkJCSAgICBXTTg5OTVfRkxMMV9OX01BU0ssCisJCQkgICAgZmxsLm4gPDwgV004OTk1X0ZMTDFfTl9TSElGVCk7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfRkxMMV9DT05UUk9MXzUgKyByZWdfb2Zmc2V0LAorCQkJICAgIFdNODk5NV9GTEwxX1JFRkNMS19ESVZfTUFTSyB8CisJCQkgICAgV004OTk1X0ZMTDFfUkVGQ0xLX1NSQ19NQVNLLAorCQkJICAgIChmbGwuY2xrX3JlZl9kaXYgPDwgV004OTk1X0ZMTDFfUkVGQ0xLX0RJVl9TSElGVCkgfAorCQkJICAgIChzcmMgLSAxKSk7CisKKwlpZiAoZnJlcV9vdXQpCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9GTEwxX0NPTlRST0xfMSArIHJlZ19vZmZzZXQsCisJCQkJICAgIFdNODk5NV9GTEwxX0VOQV9NQVNLLCBXTTg5OTVfRkxMMV9FTkEpOworCisJd204OTk1LT5mbGxbaWRdLmluID0gZnJlcV9pbjsKKwl3bTg5OTUtPmZsbFtpZF0ub3V0ID0gZnJlcV9vdXQ7CisJd204OTk1LT5mbGxbaWRdLnNyYyA9IHNyYzsKKworCS8qIEVuYWJsZSBhbnkgZ2F0ZWQgQUlGIGNsb2NrcyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BSUYxX0NMT0NLSU5HXzEsCisJCQkgICAgV004OTk1X0FJRjFDTEtfRU5BX01BU0ssIGFpZjEpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9BSUYyX0NMT0NLSU5HXzEsCisJCQkgICAgV004OTk1X0FJRjJDTEtfRU5BX01BU0ssIGFpZjIpOworCisJY29uZmlndXJlX2Nsb2NrKGNvZGVjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODk5NV9zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCB3bTg5OTVfcHJpdiAqd204OTk1OworCisJY29kZWMgPSBkYWktPmNvZGVjOworCXdtODk5NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogQUlGMyBzaGFyZXMgY2xvY2tpbmcgd2l0aCBBSUYxLzIgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIFdNODk5NV9TWVNDTEtfTUNMSzE6CisJCXdtODk5NS0+c3lzY2xrW2RhaS0+aWRdID0gV004OTk1X1NZU0NMS19NQ0xLMTsKKwkJd204OTk1LT5tY2xrWzBdID0gZnJlcTsKKwkJZGV2X2RiZyhkYWktPmRldiwgIkFJRiVkIHVzaW5nIE1DTEsxIGF0ICV1SHpcbiIsCisJCQlkYWktPmlkICsgMSwgZnJlcSk7CisJCWJyZWFrOworCWNhc2UgV004OTk1X1NZU0NMS19NQ0xLMjoKKwkJd204OTk1LT5zeXNjbGtbZGFpLT5pZF0gPSBXTTg5OTVfU1lTQ0xLX01DTEsxOworCQl3bTg5OTUtPm1jbGtbMV0gPSBmcmVxOworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiQUlGJWQgdXNpbmcgTUNMSzIgYXQgJXVIelxuIiwKKwkJCWRhaS0+aWQgKyAxLCBmcmVxKTsKKwkJYnJlYWs7CisJY2FzZSBXTTg5OTVfU1lTQ0xLX0ZMTDE6CisJCXdtODk5NS0+c3lzY2xrW2RhaS0+aWRdID0gV004OTk1X1NZU0NMS19GTEwxOworCQlkZXZfZGJnKGRhaS0+ZGV2LCAiQUlGJWQgdXNpbmcgRkxMMVxuIiwgZGFpLT5pZCArIDEpOworCQlicmVhazsKKwljYXNlIFdNODk5NV9TWVNDTEtfRkxMMjoKKwkJd204OTk1LT5zeXNjbGtbZGFpLT5pZF0gPSBXTTg5OTVfU1lTQ0xLX0ZMTDI7CisJCWRldl9kYmcoZGFpLT5kZXYsICJBSUYlZCB1c2luZyBGTEwyXG4iLCBkYWktPmlkICsgMSk7CisJCWJyZWFrOworCWNhc2UgV004OTk1X1NZU0NMS19PUENMSzoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiVW5rbm93biBjbG9jayBzb3VyY2UgJWRcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbmZpZ3VyZV9jbG9jayhjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5OTVfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlpbnQgcmV0OworCisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJldCA9IHNuZF9zb2NfY2FjaGVfc3luYyhjb2RlYyk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIHN5bmMgY2FjaGU6ICVkXG4iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9QT1dFUl9NQU5BR0VNRU5UXzEsCisJCQkJCSAgICBXTTg5OTVfQkdfRU5BX01BU0ssIFdNODk5NV9CR19FTkEpOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfUE9XRVJfTUFOQUdFTUVOVF8xLAorCQkJCSAgICBXTTg5OTVfQkdfRU5BX01BU0ssIDApOworCQlicmVhazsKKwl9CisKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgd204OTk1X3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJd204OTk1X3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg5OTVfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwl3bTg5OTVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHdtODk5NV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgd204OTk1X3Jlc3VtZSBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCB3bTg5OTVfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCisJaTJjID0gY29udGFpbmVyX29mKGNvZGVjLT5kZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXdtODk5NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXdtODk5NV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204OTk1X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlpbnQgcmV0OworCisJY29kZWMtPmRhcG0uaWRsZV9iaWFzX29mZiA9IDE7CisJd204OTk1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZXQgPSBzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyhjb2RlYywgMTYsIDE2LCB3bTg5OTUtPmNvbnRyb2xfdHlwZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIHNldCBjYWNoZSBpL286ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTk1X1NPRlRXQVJFX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXQgIT0gMHg4OTk1KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgZGV2aWNlIElEOiAlI3hcbiIsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk5NV9TT0ZUV0FSRV9SRVNFVCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGlzc3VlIHJlc2V0OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bTg5OTVfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19TVEFOREJZKTsKKworCS8qIExhdGNoIHZvbHVtZSB1cGRhdGVzIChyaWdodCBvbmx5OyB3ZSBhbHdheXMgZG8gbGVmdCB0aGVuIHJpZ2h0KS4gKi8KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMV9EQUMxX1JJR0hUX1ZPTFVNRSwKKwkJCSAgICBXTTg5OTVfQUlGMURBQzFfVlVfTUFTSywgV004OTk1X0FJRjFEQUMxX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMV9EQUMyX1JJR0hUX1ZPTFVNRSwKKwkJCSAgICBXTTg5OTVfQUlGMURBQzJfVlVfTUFTSywgV004OTk1X0FJRjFEQUMyX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMl9EQUNfUklHSFRfVk9MVU1FLAorCQkJICAgIFdNODk5NV9BSUYyREFDX1ZVX01BU0ssIFdNODk5NV9BSUYyREFDX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMV9BREMxX1JJR0hUX1ZPTFVNRSwKKwkJCSAgICBXTTg5OTVfQUlGMUFEQzFfVlVfTUFTSywgV004OTk1X0FJRjFBREMxX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMV9BREMyX1JJR0hUX1ZPTFVNRSwKKwkJCSAgICBXTTg5OTVfQUlGMUFEQzJfVlVfTUFTSywgV004OTk1X0FJRjFBREMyX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfQUlGMl9BRENfUklHSFRfVk9MVU1FLAorCQkJICAgIFdNODk5NV9BSUYyQURDX1ZVX01BU0ssIFdNODk5NV9BSUYxQURDMl9WVSk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTk1X0RBQzFfUklHSFRfVk9MVU1FLAorCQkJICAgIFdNODk5NV9EQUMxX1ZVX01BU0ssIFdNODk5NV9EQUMxX1ZVKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTVfREFDMl9SSUdIVF9WT0xVTUUsCisJCQkgICAgV004OTk1X0RBQzJfVlVfTUFTSywgV004OTk1X0RBQzJfVlUpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODk5NV9SSUdIVF9MSU5FX0lOUFVUXzFfVk9MVU1FLAorCQkJICAgIFdNODk5NV9JTjFfVlVfTUFTSywgV004OTk1X0lOMV9WVSk7CisKKwl3bTg5OTVfdXBkYXRlX2NsYXNzX3coY29kZWMpOworCisJc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODk5NV9zbmRfY29udHJvbHMsCisJCQkgICAgIEFSUkFZX1NJWkUod204OTk1X3NuZF9jb250cm9scykpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoJmNvZGVjLT5kYXBtLCB3bTg5OTVfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh3bTg5OTVfZGFwbV93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNvZGVjLT5kYXBtLCB3bTg5OTVfaW50ZXJjb24sCisJCQkJQVJSQVlfU0laRSh3bTg5OTVfaW50ZXJjb24pKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdNODk5NV9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgd204OTk1X2FpZjFfZGFpX29wcyA9IHsKKwkuc2V0X3N5c2NsayA9IHdtODk5NV9zZXRfZGFpX3N5c2NsaywKKwkuc2V0X2ZtdCA9IHdtODk5NV9zZXRfZGFpX2ZtdCwKKwkuaHdfcGFyYW1zID0gd204OTk1X2h3X3BhcmFtcywKKwkuZGlnaXRhbF9tdXRlID0gd204OTk1X2FpZl9tdXRlLAorCS5zZXRfcGxsID0gd204OTk1X3NldF9mbGwsCisJLnNldF90cmlzdGF0ZSA9IHdtODk5NV9zZXRfdHJpc3RhdGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyB3bTg5OTVfYWlmMl9kYWlfb3BzID0geworCS5zZXRfc3lzY2xrID0gd204OTk1X3NldF9kYWlfc3lzY2xrLAorCS5zZXRfZm10ID0gd204OTk1X3NldF9kYWlfZm10LAorCS5od19wYXJhbXMgPSB3bTg5OTVfaHdfcGFyYW1zLAorCS5kaWdpdGFsX211dGUgPSB3bTg5OTVfYWlmX211dGUsCisJLnNldF9wbGwgPSB3bTg5OTVfc2V0X2ZsbCwKKwkuc2V0X3RyaXN0YXRlID0gd204OTk1X3NldF90cmlzdGF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHdtODk5NV9haWYzX2RhaV9vcHMgPSB7CisJLnNldF90cmlzdGF0ZSA9IHdtODk5NV9zZXRfdHJpc3RhdGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB3bTg5OTVfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTg5OTUtYWlmMSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkJLmZvcm1hdHMgPSBXTTg5OTVfRk9STUFUUworCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFdNODk5NV9GT1JNQVRTCisJCX0sCisJCS5vcHMgPSAmd204OTk1X2FpZjFfZGFpX29wcworCX0sCisJeworCQkubmFtZSA9ICJ3bTg5OTUtYWlmMiIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkJLmZvcm1hdHMgPSBXTTg5OTVfRk9STUFUUworCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFdNODk5NV9GT1JNQVRTCisJCX0sCisJCS5vcHMgPSAmd204OTk1X2FpZjJfZGFpX29wcworCX0sCisJeworCQkubmFtZSA9ICJ3bTg5OTUtYWlmMyIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkJLmZvcm1hdHMgPSBXTTg5OTVfRk9STUFUUworCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFdNODk5NV9GT1JNQVRTCisJCX0sCisJCS5vcHMgPSAmd204OTk1X2FpZjNfZGFpX29wcworCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTUgPSB7CisJLnByb2JlID0gd204OTk1X3Byb2JlLAorCS5yZW1vdmUgPSB3bTg5OTVfcmVtb3ZlLAorCS5zdXNwZW5kID0gd204OTk1X3N1c3BlbmQsCisJLnJlc3VtZSA9IHdtODk5NV9yZXN1bWUsCisJLnNldF9iaWFzX2xldmVsID0gd204OTk1X3NldF9iaWFzX2xldmVsLAorCS5yZWdfY2FjaGVfc2l6ZSA9IEFSUkFZX1NJWkUod204OTk1X3JlZ19kZWZzKSwKKwkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1MTYpLAorCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtODk5NV9yZWdfZGVmcywKKwkudm9sYXRpbGVfcmVnaXN0ZXIgPSB3bTg5OTVfdm9sYXRpbGUsCisJLmNvbXByZXNzX3R5cGUgPSBTTkRfU09DX1JCVFJFRV9DT01QUkVTU0lPTgorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg5OTVfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHdtODk5NV9wcml2ICp3bTg5OTU7CisJaW50IHJldDsKKworCXdtODk5NSA9IGt6YWxsb2Moc2l6ZW9mICp3bTg5OTUsIEdGUF9LRVJORUwpOworCWlmICghd204OTk1KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdtODk5NS0+Y29udHJvbF90eXBlID0gU05EX1NPQ19TUEk7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgd204OTk1KTsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAorCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204OTk1LCB3bTg5OTVfZGFpLAorCQkJCSAgICAgQVJSQVlfU0laRSh3bTg5OTVfZGFpKSk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKHdtODk5NSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd204OTk1X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2KTsKKwlrZnJlZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg5OTVfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTg5OTUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHdtODk5NV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODk5NV9zcGlfcmVtb3ZlKQorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorc3RhdGljIF9fZGV2aW5pdCBpbnQgd204OTk1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgd204OTk1X3ByaXYgKndtODk5NTsKKwlpbnQgcmV0OworCisJd204OTk1ID0ga3phbGxvYyhzaXplb2YgKndtODk5NSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3bTg5OTUpCisJCXJldHVybiAtRU5PTUVNOworCisJd204OTk1LT5jb250cm9sX3R5cGUgPSBTTkRfU09DX0kyQzsKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB3bTg5OTUpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCisJCQkJICAgICAmc29jX2NvZGVjX2Rldl93bTg5OTUsIHdtODk5NV9kYWksCisJCQkJICAgICBBUlJBWV9TSVpFKHdtODk5NV9kYWkpKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUod204OTk1KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZleGl0IGludCB3bTg5OTVfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmY2xpZW50LT5kZXYpOworCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODk5NV9pMmNfaWRbXSA9IHsKKwl7IndtODk5NSIsIDB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204OTk1X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3bTg5OTVfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ3bTg5OTUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHdtODk5NV9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHdtODk5NV9pMmNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSB3bTg5OTVfaTJjX2lkCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHdtODk5NV9tb2Rpbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCisJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJndtODk5NV9pMmNfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdtODk5NSBJMkMgZHJpdmVyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ3bTg5OTVfc3BpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciB3bTg5OTUgU1BJIGRyaXZlcjogJWRcbiIsCisJCSAgICAgICByZXQpOworCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KHdtODk5NV9tb2Rpbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdtODk5NV9leGl0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfTU9EVUxFKQorCWkyY19kZWxfZHJpdmVyKCZ3bTg5OTVfaTJjX2RyaXZlcik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTUFTVEVSKQorCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmd204OTk1X3NwaV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9leGl0KHdtODk5NV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNODk5NSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRpbWl0cmlzIFBhcGFzdGFtb3MgPGRwQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDIxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5oCkBAIC0wLDAgKzEsNDI2OSBAQAorLyoKKyAqIHdtODk5NS5oICAtLSAgV004OTk1IEFMU0EgU29DIEF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBwbGMKKyAqCisgKiBBdXRob3I6IERpbWl0cmlzIFBhcGFzdGFtb3MgPGRwQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1dNODk5NV9ICisjZGVmaW5lIF9XTTg5OTVfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKy8qCisgKiBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgV004OTk1X1NPRlRXQVJFX1JFU0VUICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMiAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfMyAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNCAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV004OTk1X1BPV0VSX01BTkFHRU1FTlRfNSAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgV004OTk1X0xFRlRfTElORV9JTlBVVF8xX1ZPTFVNRSAgICAgICAgIDB4MTAKKyNkZWZpbmUgV004OTk1X1JJR0hUX0xJTkVfSU5QVVRfMV9WT0xVTUUgICAgICAgIDB4MTEKKyNkZWZpbmUgV004OTk1X0xFRlRfTElORV9JTlBVVF9DT05UUk9MICAgICAgICAgIDB4MTIKKyNkZWZpbmUgV004OTk1X0RBQzFfTEVGVF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgV004OTk1X0RBQzFfUklHSFRfVk9MVU1FICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgV004OTk1X0RBQzJfTEVGVF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUgV004OTk1X0RBQzJfUklHSFRfVk9MVU1FICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgV004OTk1X09VVFBVVF9WT0xVTUVfWkNfMSAgICAgICAgICAgICAgIDB4MUMKKyNkZWZpbmUgV004OTk1X01JQ0JJQVNfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgV004OTk1X01JQ0JJQVNfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgV004OTk1X0xET18xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgV004OTk1X0xET18yICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgV004OTk1X0FDQ0VTU09SWV9ERVRFQ1RfTU9ERTEgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgV004OTk1X0FDQ0VTU09SWV9ERVRFQ1RfTU9ERTIgICAgICAgICAgIDB4MzEKKyNkZWZpbmUgV004OTk1X0hFQURQSE9ORV9ERVRFQ1QxICAgICAgICAgICAgICAgIDB4MzQKKyNkZWZpbmUgV004OTk1X0hFQURQSE9ORV9ERVRFQ1QyICAgICAgICAgICAgICAgIDB4MzUKKyNkZWZpbmUgV004OTk1X01JQ19ERVRFQ1RfMSAgICAgICAgICAgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgV004OTk1X01JQ19ERVRFQ1RfMiAgICAgICAgICAgICAgICAgICAgIDB4MzkKKyNkZWZpbmUgV004OTk1X0NIQVJHRV9QVU1QXzEgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgV004OTk1X0NMQVNTX1dfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NDUKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzEgICAgICAgICAgICAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzIgICAgICAgICAgICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzMgICAgICAgICAgICAgICAgICAgICAgIDB4NTIKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzUgICAgICAgICAgICAgICAgICAgICAgIDB4NTQKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzYgICAgICAgICAgICAgICAgICAgICAgIDB4NTUKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPXzcgICAgICAgICAgICAgICAgICAgICAgIDB4NTYKKyNkZWZpbmUgV004OTk1X0RDX1NFUlZPX1JFQURCQUNLXzAgICAgICAgICAgICAgIDB4NTcKKyNkZWZpbmUgV004OTk1X0FOQUxPR1VFX0hQXzEgICAgICAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgV004OTk1X0FOQUxPR1VFX0hQXzIgICAgICAgICAgICAgICAgICAgIDB4NjEKKyNkZWZpbmUgV004OTk1X0NISVBfUkVWSVNJT04gICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIFdNODk5NV9DT05UUk9MX0lOVEVSRkFDRV8xICAgICAgICAgICAgICAweDEwMQorI2RlZmluZSBXTTg5OTVfQ09OVFJPTF9JTlRFUkZBQ0VfMiAgICAgICAgICAgICAgMHgxMDIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl9DVFJMXzEgICAgICAgICAgIDB4MTEwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfQ1RSTF8yICAgICAgICAgICAweDExMQorI2RlZmluZSBXTTg5OTVfQUlGMV9DTE9DS0lOR18xICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgV004OTk1X0FJRjFfQ0xPQ0tJTkdfMiAgICAgICAgICAgICAgICAgIDB4MjAxCisjZGVmaW5lIFdNODk5NV9BSUYyX0NMT0NLSU5HXzEgICAgICAgICAgICAgICAgICAweDIwNAorI2RlZmluZSBXTTg5OTVfQUlGMl9DTE9DS0lOR18yICAgICAgICAgICAgICAgICAgMHgyMDUKKyNkZWZpbmUgV004OTk1X0NMT0NLSU5HXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MjA4CisjZGVmaW5lIFdNODk5NV9DTE9DS0lOR18yICAgICAgICAgICAgICAgICAgICAgICAweDIwOQorI2RlZmluZSBXTTg5OTVfQUlGMV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAKKyNkZWZpbmUgV004OTk1X0FJRjJfUkFURSAgICAgICAgICAgICAgICAgICAgICAgIDB4MjExCisjZGVmaW5lIFdNODk5NV9SQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDIxMgorI2RlZmluZSBXTTg5OTVfRkxMMV9DT05UUk9MXzEgICAgICAgICAgICAgICAgICAgMHgyMjAKKyNkZWZpbmUgV004OTk1X0ZMTDFfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgIDB4MjIxCisjZGVmaW5lIFdNODk5NV9GTEwxX0NPTlRST0xfMyAgICAgICAgICAgICAgICAgICAweDIyMgorI2RlZmluZSBXTTg5OTVfRkxMMV9DT05UUk9MXzQgICAgICAgICAgICAgICAgICAgMHgyMjMKKyNkZWZpbmUgV004OTk1X0ZMTDFfQ09OVFJPTF81ICAgICAgICAgICAgICAgICAgIDB4MjI0CisjZGVmaW5lIFdNODk5NV9GTEwyX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDI0MAorI2RlZmluZSBXTTg5OTVfRkxMMl9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHgyNDEKKyNkZWZpbmUgV004OTk1X0ZMTDJfQ09OVFJPTF8zICAgICAgICAgICAgICAgICAgIDB4MjQyCisjZGVmaW5lIFdNODk5NV9GTEwyX0NPTlRST0xfNCAgICAgICAgICAgICAgICAgICAweDI0MworI2RlZmluZSBXTTg5OTVfRkxMMl9DT05UUk9MXzUgICAgICAgICAgICAgICAgICAgMHgyNDQKKyNkZWZpbmUgV004OTk1X0FJRjFfQ09OVFJPTF8xICAgICAgICAgICAgICAgICAgIDB4MzAwCisjZGVmaW5lIFdNODk5NV9BSUYxX0NPTlRST0xfMiAgICAgICAgICAgICAgICAgICAweDMwMQorI2RlZmluZSBXTTg5OTVfQUlGMV9NQVNURVJfU0xBVkUgICAgICAgICAgICAgICAgMHgzMDIKKyNkZWZpbmUgV004OTk1X0FJRjFfQkNMSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAzCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX0xSQ0xLICAgICAgICAgICAgICAgICAgICAweDMwNAorI2RlZmluZSBXTTg5OTVfQUlGMURBQ19MUkNMSyAgICAgICAgICAgICAgICAgICAgMHgzMDUKKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfREFUQSAgICAgICAgICAgICAgICAgICAgIDB4MzA2CisjZGVmaW5lIFdNODk5NV9BSUYxQURDX0RBVEEgICAgICAgICAgICAgICAgICAgICAweDMwNworI2RlZmluZSBXTTg5OTVfQUlGMl9DT05UUk9MXzEgICAgICAgICAgICAgICAgICAgMHgzMTAKKyNkZWZpbmUgV004OTk1X0FJRjJfQ09OVFJPTF8yICAgICAgICAgICAgICAgICAgIDB4MzExCisjZGVmaW5lIFdNODk5NV9BSUYyX01BU1RFUl9TTEFWRSAgICAgICAgICAgICAgICAweDMxMgorI2RlZmluZSBXTTg5OTVfQUlGMl9CQ0xLICAgICAgICAgICAgICAgICAgICAgICAgMHgzMTMKKyNkZWZpbmUgV004OTk1X0FJRjJBRENfTFJDTEsgICAgICAgICAgICAgICAgICAgIDB4MzE0CisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0xSQ0xLICAgICAgICAgICAgICAgICAgICAweDMxNQorI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19EQVRBICAgICAgICAgICAgICAgICAgICAgMHgzMTYKKyNkZWZpbmUgV004OTk1X0FJRjJBRENfREFUQSAgICAgICAgICAgICAgICAgICAgIDB4MzE3CisjZGVmaW5lIFdNODk5NV9BSUYxX0FEQzFfTEVGVF9WT0xVTUUgICAgICAgICAgICAweDQwMAorI2RlZmluZSBXTTg5OTVfQUlGMV9BREMxX1JJR0hUX1ZPTFVNRSAgICAgICAgICAgMHg0MDEKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9MRUZUX1ZPTFVNRSAgICAgICAgICAgIDB4NDAyCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfUklHSFRfVk9MVU1FICAgICAgICAgICAweDQwMworI2RlZmluZSBXTTg5OTVfQUlGMV9BREMyX0xFRlRfVk9MVU1FICAgICAgICAgICAgMHg0MDQKKyNkZWZpbmUgV004OTk1X0FJRjFfQURDMl9SSUdIVF9WT0xVTUUgICAgICAgICAgIDB4NDA1CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfTEVGVF9WT0xVTUUgICAgICAgICAgICAweDQwNgorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX1JJR0hUX1ZPTFVNRSAgICAgICAgICAgMHg0MDcKKyNkZWZpbmUgV004OTk1X0FJRjFfQURDMV9GSUxURVJTICAgICAgICAgICAgICAgIDB4NDEwCisjZGVmaW5lIFdNODk5NV9BSUYxX0FEQzJfRklMVEVSUyAgICAgICAgICAgICAgICAweDQxMQorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0ZJTFRFUlNfMSAgICAgICAgICAgICAgMHg0MjAKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9GSUxURVJTXzIgICAgICAgICAgICAgIDB4NDIxCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRklMVEVSU18xICAgICAgICAgICAgICAweDQyMgorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0ZJTFRFUlNfMiAgICAgICAgICAgICAgMHg0MjMKKyNkZWZpbmUgV004OTk1X0FJRjFfRFJDMV8xICAgICAgICAgICAgICAgICAgICAgIDB4NDQwCisjZGVmaW5lIFdNODk5NV9BSUYxX0RSQzFfMiAgICAgICAgICAgICAgICAgICAgICAweDQ0MQorI2RlZmluZSBXTTg5OTVfQUlGMV9EUkMxXzMgICAgICAgICAgICAgICAgICAgICAgMHg0NDIKKyNkZWZpbmUgV004OTk1X0FJRjFfRFJDMV80ICAgICAgICAgICAgICAgICAgICAgIDB4NDQzCisjZGVmaW5lIFdNODk5NV9BSUYxX0RSQzFfNSAgICAgICAgICAgICAgICAgICAgICAweDQ0NAorI2RlZmluZSBXTTg5OTVfQUlGMV9EUkMyXzEgICAgICAgICAgICAgICAgICAgICAgMHg0NTAKKyNkZWZpbmUgV004OTk1X0FJRjFfRFJDMl8yICAgICAgICAgICAgICAgICAgICAgIDB4NDUxCisjZGVmaW5lIFdNODk5NV9BSUYxX0RSQzJfMyAgICAgICAgICAgICAgICAgICAgICAweDQ1MgorI2RlZmluZSBXTTg5OTVfQUlGMV9EUkMyXzQgICAgICAgICAgICAgICAgICAgICAgMHg0NTMKKyNkZWZpbmUgV004OTk1X0FJRjFfRFJDMl81ICAgICAgICAgICAgICAgICAgICAgIDB4NDU0CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfR0FJTlNfMSAgICAgICAgICAgICAweDQ4MAorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0dBSU5TXzIgICAgICAgICAgICAgMHg0ODEKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzFfQSAgICAgICAgICAgIDB4NDgyCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF8xX0IgICAgICAgICAgICAweDQ4MworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfMV9QRyAgICAgICAgICAgMHg0ODQKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzJfQSAgICAgICAgICAgIDB4NDg1CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF8yX0IgICAgICAgICAgICAweDQ4NgorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfMl9DICAgICAgICAgICAgMHg0ODcKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzJfUEcgICAgICAgICAgIDB4NDg4CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF8zX0EgICAgICAgICAgICAweDQ4OQorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfM19CICAgICAgICAgICAgMHg0OEEKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzNfQyAgICAgICAgICAgIDB4NDhCCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF8zX1BHICAgICAgICAgICAweDQ4QworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfNF9BICAgICAgICAgICAgMHg0OEQKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzRfQiAgICAgICAgICAgIDB4NDhFCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF80X0MgICAgICAgICAgICAweDQ4RgorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfNF9QRyAgICAgICAgICAgMHg0OTAKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMV9FUV9CQU5EXzVfQSAgICAgICAgICAgIDB4NDkxCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzFfRVFfQkFORF81X0IgICAgICAgICAgICAweDQ5MgorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMxX0VRX0JBTkRfNV9QRyAgICAgICAgICAgMHg0OTMKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9HQUlOU18xICAgICAgICAgICAgIDB4NEEwCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfR0FJTlNfMiAgICAgICAgICAgICAweDRBMQorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfMV9BICAgICAgICAgICAgMHg0QTIKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzFfQiAgICAgICAgICAgIDB4NEEzCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF8xX1BHICAgICAgICAgICAweDRBNAorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfMl9BICAgICAgICAgICAgMHg0QTUKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzJfQiAgICAgICAgICAgIDB4NEE2CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF8yX0MgICAgICAgICAgICAweDRBNworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfMl9QRyAgICAgICAgICAgMHg0QTgKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzNfQSAgICAgICAgICAgIDB4NEE5CisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF8zX0IgICAgICAgICAgICAweDRBQQorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfM19DICAgICAgICAgICAgMHg0QUIKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzNfUEcgICAgICAgICAgIDB4NEFDCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF80X0EgICAgICAgICAgICAweDRBRAorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfNF9CICAgICAgICAgICAgMHg0QUUKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzRfQyAgICAgICAgICAgIDB4NEFGCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF80X1BHICAgICAgICAgICAweDRCMAorI2RlZmluZSBXTTg5OTVfQUlGMV9EQUMyX0VRX0JBTkRfNV9BICAgICAgICAgICAgMHg0QjEKKyNkZWZpbmUgV004OTk1X0FJRjFfREFDMl9FUV9CQU5EXzVfQiAgICAgICAgICAgIDB4NEIyCisjZGVmaW5lIFdNODk5NV9BSUYxX0RBQzJfRVFfQkFORF81X1BHICAgICAgICAgICAweDRCMworI2RlZmluZSBXTTg5OTVfQUlGMl9BRENfTEVGVF9WT0xVTUUgICAgICAgICAgICAgMHg1MDAKKyNkZWZpbmUgV004OTk1X0FJRjJfQURDX1JJR0hUX1ZPTFVNRSAgICAgICAgICAgIDB4NTAxCisjZGVmaW5lIFdNODk5NV9BSUYyX0RBQ19MRUZUX1ZPTFVNRSAgICAgICAgICAgICAweDUwMgorI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNfUklHSFRfVk9MVU1FICAgICAgICAgICAgMHg1MDMKKyNkZWZpbmUgV004OTk1X0FJRjJfQURDX0ZJTFRFUlMgICAgICAgICAgICAgICAgIDB4NTEwCisjZGVmaW5lIFdNODk5NV9BSUYyX0RBQ19GSUxURVJTXzEgICAgICAgICAgICAgICAweDUyMAorI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNfRklMVEVSU18yICAgICAgICAgICAgICAgMHg1MjEKKyNkZWZpbmUgV004OTk1X0FJRjJfRFJDXzEgICAgICAgICAgICAgICAgICAgICAgIDB4NTQwCisjZGVmaW5lIFdNODk5NV9BSUYyX0RSQ18yICAgICAgICAgICAgICAgICAgICAgICAweDU0MQorI2RlZmluZSBXTTg5OTVfQUlGMl9EUkNfMyAgICAgICAgICAgICAgICAgICAgICAgMHg1NDIKKyNkZWZpbmUgV004OTk1X0FJRjJfRFJDXzQgICAgICAgICAgICAgICAgICAgICAgIDB4NTQzCisjZGVmaW5lIFdNODk5NV9BSUYyX0RSQ181ICAgICAgICAgICAgICAgICAgICAgICAweDU0NAorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9HQUlOU18xICAgICAgICAgICAgICAgICAgMHg1ODAKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfR0FJTlNfMiAgICAgICAgICAgICAgICAgIDB4NTgxCisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfMV9BICAgICAgICAgICAgICAgICAweDU4MgorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzFfQiAgICAgICAgICAgICAgICAgMHg1ODMKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF8xX1BHICAgICAgICAgICAgICAgIDB4NTg0CisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfMl9BICAgICAgICAgICAgICAgICAweDU4NQorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzJfQiAgICAgICAgICAgICAgICAgMHg1ODYKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF8yX0MgICAgICAgICAgICAgICAgIDB4NTg3CisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfMl9QRyAgICAgICAgICAgICAgICAweDU4OAorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzNfQSAgICAgICAgICAgICAgICAgMHg1ODkKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF8zX0IgICAgICAgICAgICAgICAgIDB4NThBCisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfM19DICAgICAgICAgICAgICAgICAweDU4QgorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzNfUEcgICAgICAgICAgICAgICAgMHg1OEMKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF80X0EgICAgICAgICAgICAgICAgIDB4NThECisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfNF9CICAgICAgICAgICAgICAgICAweDU4RQorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzRfQyAgICAgICAgICAgICAgICAgMHg1OEYKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF80X1BHICAgICAgICAgICAgICAgIDB4NTkwCisjZGVmaW5lIFdNODk5NV9BSUYyX0VRX0JBTkRfNV9BICAgICAgICAgICAgICAgICAweDU5MQorI2RlZmluZSBXTTg5OTVfQUlGMl9FUV9CQU5EXzVfQiAgICAgICAgICAgICAgICAgMHg1OTIKKyNkZWZpbmUgV004OTk1X0FJRjJfRVFfQkFORF81X1BHICAgICAgICAgICAgICAgIDB4NTkzCisjZGVmaW5lIFdNODk5NV9EQUMxX01JWEVSX1ZPTFVNRVMgICAgICAgICAgICAgICAweDYwMAorI2RlZmluZSBXTTg5OTVfREFDMV9MRUZUX01JWEVSX1JPVVRJTkcgICAgICAgICAgMHg2MDEKKyNkZWZpbmUgV004OTk1X0RBQzFfUklHSFRfTUlYRVJfUk9VVElORyAgICAgICAgIDB4NjAyCisjZGVmaW5lIFdNODk5NV9EQUMyX01JWEVSX1ZPTFVNRVMgICAgICAgICAgICAgICAweDYwMworI2RlZmluZSBXTTg5OTVfREFDMl9MRUZUX01JWEVSX1JPVVRJTkcgICAgICAgICAgMHg2MDQKKyNkZWZpbmUgV004OTk1X0RBQzJfUklHSFRfTUlYRVJfUk9VVElORyAgICAgICAgIDB4NjA1CisjZGVmaW5lIFdNODk5NV9BSUYxX0FEQzFfTEVGVF9NSVhFUl9ST1VUSU5HICAgICAweDYwNgorI2RlZmluZSBXTTg5OTVfQUlGMV9BREMxX1JJR0hUX01JWEVSX1JPVVRJTkcgICAgMHg2MDcKKyNkZWZpbmUgV004OTk1X0FJRjFfQURDMl9MRUZUX01JWEVSX1JPVVRJTkcgICAgIDB4NjA4CisjZGVmaW5lIFdNODk5NV9BSUYxX0FEQzJfUklHSFRfTUlYRVJfUk9VVElORyAgICAweDYwOQorI2RlZmluZSBXTTg5OTVfREFDX1NPRlRNVVRFICAgICAgICAgICAgICAgICAgICAgMHg2MTAKKyNkZWZpbmUgV004OTk1X09WRVJTQU1QTElORyAgICAgICAgICAgICAgICAgICAgIDB4NjIwCisjZGVmaW5lIFdNODk5NV9TSURFVE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAweDYyMQorI2RlZmluZSBXTTg5OTVfR1BJT18xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAKKyNkZWZpbmUgV004OTk1X0dQSU9fMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAxCisjZGVmaW5lIFdNODk5NV9HUElPXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwMgorI2RlZmluZSBXTTg5OTVfR1BJT180ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDMKKyNkZWZpbmUgV004OTk1X0dQSU9fNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzA0CisjZGVmaW5lIFdNODk5NV9HUElPXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwNQorI2RlZmluZSBXTTg5OTVfR1BJT183ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDYKKyNkZWZpbmUgV004OTk1X0dQSU9fOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzA3CisjZGVmaW5lIFdNODk5NV9HUElPXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwOAorI2RlZmluZSBXTTg5OTVfR1BJT18xMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDkKKyNkZWZpbmUgV004OTk1X0dQSU9fMTEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzBBCisjZGVmaW5lIFdNODk5NV9HUElPXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwQgorI2RlZmluZSBXTTg5OTVfR1BJT18xMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MEMKKyNkZWZpbmUgV004OTk1X0dQSU9fMTQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzBECisjZGVmaW5lIFdNODk5NV9QVUxMX0NPTlRST0xfMSAgICAgICAgICAgICAgICAgICAweDcyMAorI2RlZmluZSBXTTg5OTVfUFVMTF9DT05UUk9MXzIgICAgICAgICAgICAgICAgICAgMHg3MjEKKyNkZWZpbmUgV004OTk1X0lOVEVSUlVQVF9TVEFUVVNfMSAgICAgICAgICAgICAgIDB4NzMwCisjZGVmaW5lIFdNODk5NV9JTlRFUlJVUFRfU1RBVFVTXzIgICAgICAgICAgICAgICAweDczMQorI2RlZmluZSBXTTg5OTVfSU5URVJSVVBUX1JBV19TVEFUVVNfMiAgICAgICAgICAgMHg3MzIKKyNkZWZpbmUgV004OTk1X0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLICAgICAgICAgIDB4NzM4CisjZGVmaW5lIFdNODk5NV9JTlRFUlJVUFRfU1RBVFVTXzJfTUFTSyAgICAgICAgICAweDczOQorI2RlZmluZSBXTTg5OTVfSU5URVJSVVBUX0NPTlRST0wgICAgICAgICAgICAgICAgMHg3NDAKKyNkZWZpbmUgV004OTk1X0xFRlRfUERNX1NQRUFLRVJfMSAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIFdNODk5NV9SSUdIVF9QRE1fU1BFQUtFUl8xICAgICAgICAgICAgICAweDgwMQorI2RlZmluZSBXTTg5OTVfUERNX1NQRUFLRVJfMV9NVVRFX1NFUVVFTkNFICAgICAgMHg4MDIKKyNkZWZpbmUgV004OTk1X0xFRlRfUERNX1NQRUFLRVJfMiAgICAgICAgICAgICAgIDB4ODA4CisjZGVmaW5lIFdNODk5NV9SSUdIVF9QRE1fU1BFQUtFUl8yICAgICAgICAgICAgICAweDgwOQorI2RlZmluZSBXTTg5OTVfUERNX1NQRUFLRVJfMl9NVVRFX1NFUVVFTkNFICAgICAgMHg4MEEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8wICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEgICAgICAgICAgICAgICAgMHgzMDAxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMiAgICAgICAgICAgICAgICAweDMwMDIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zICAgICAgICAgICAgICAgIDB4MzAwMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQgICAgICAgICAgICAgICAgMHgzMDA0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNSAgICAgICAgICAgICAgICAweDMwMDUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl82ICAgICAgICAgICAgICAgIDB4MzAwNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzcgICAgICAgICAgICAgICAgMHgzMDA3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfOCAgICAgICAgICAgICAgICAweDMwMDgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl85ICAgICAgICAgICAgICAgIDB4MzAwOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEwICAgICAgICAgICAgICAgMHgzMDBBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTEgICAgICAgICAgICAgICAweDMwMEIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMiAgICAgICAgICAgICAgIDB4MzAwQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEzICAgICAgICAgICAgICAgMHgzMDBECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTQgICAgICAgICAgICAgICAweDMwMEUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNSAgICAgICAgICAgICAgIDB4MzAwRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE2ICAgICAgICAgICAgICAgMHgzMDEwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTcgICAgICAgICAgICAgICAweDMwMTEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xOCAgICAgICAgICAgICAgIDB4MzAxMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE5ICAgICAgICAgICAgICAgMHgzMDEzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjAgICAgICAgICAgICAgICAweDMwMTQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMSAgICAgICAgICAgICAgIDB4MzAxNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIyICAgICAgICAgICAgICAgMHgzMDE2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjMgICAgICAgICAgICAgICAweDMwMTcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNCAgICAgICAgICAgICAgIDB4MzAxOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI1ICAgICAgICAgICAgICAgMHgzMDE5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjYgICAgICAgICAgICAgICAweDMwMUEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNyAgICAgICAgICAgICAgIDB4MzAxQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI4ICAgICAgICAgICAgICAgMHgzMDFDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjkgICAgICAgICAgICAgICAweDMwMUQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMCAgICAgICAgICAgICAgIDB4MzAxRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMxICAgICAgICAgICAgICAgMHgzMDFGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzIgICAgICAgICAgICAgICAweDMwMjAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMyAgICAgICAgICAgICAgIDB4MzAyMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM0ICAgICAgICAgICAgICAgMHgzMDIyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzUgICAgICAgICAgICAgICAweDMwMjMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNiAgICAgICAgICAgICAgIDB4MzAyNAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM3ICAgICAgICAgICAgICAgMHgzMDI1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzggICAgICAgICAgICAgICAweDMwMjYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zOSAgICAgICAgICAgICAgIDB4MzAyNworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQwICAgICAgICAgICAgICAgMHgzMDI4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDEgICAgICAgICAgICAgICAweDMwMjkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MiAgICAgICAgICAgICAgIDB4MzAyQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQzICAgICAgICAgICAgICAgMHgzMDJCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDQgICAgICAgICAgICAgICAweDMwMkMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NSAgICAgICAgICAgICAgIDB4MzAyRAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ2ICAgICAgICAgICAgICAgMHgzMDJFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDcgICAgICAgICAgICAgICAweDMwMkYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80OCAgICAgICAgICAgICAgIDB4MzAzMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ5ICAgICAgICAgICAgICAgMHgzMDMxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTAgICAgICAgICAgICAgICAweDMwMzIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81MSAgICAgICAgICAgICAgIDB4MzAzMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzUyICAgICAgICAgICAgICAgMHgzMDM0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTMgICAgICAgICAgICAgICAweDMwMzUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81NCAgICAgICAgICAgICAgIDB4MzAzNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzU1ICAgICAgICAgICAgICAgMHgzMDM3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTYgICAgICAgICAgICAgICAweDMwMzgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81NyAgICAgICAgICAgICAgIDB4MzAzOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzU4ICAgICAgICAgICAgICAgMHgzMDNBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTkgICAgICAgICAgICAgICAweDMwM0IKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl82MCAgICAgICAgICAgICAgIDB4MzAzQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzYxICAgICAgICAgICAgICAgMHgzMDNECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNjIgICAgICAgICAgICAgICAweDMwM0UKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl82MyAgICAgICAgICAgICAgIDB4MzAzRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzY0ICAgICAgICAgICAgICAgMHgzMDQwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNjUgICAgICAgICAgICAgICAweDMwNDEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl82NiAgICAgICAgICAgICAgIDB4MzA0MgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzY3ICAgICAgICAgICAgICAgMHgzMDQzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNjggICAgICAgICAgICAgICAweDMwNDQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl82OSAgICAgICAgICAgICAgIDB4MzA0NQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzcwICAgICAgICAgICAgICAgMHgzMDQ2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNzEgICAgICAgICAgICAgICAweDMwNDcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl83MiAgICAgICAgICAgICAgIDB4MzA0OAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzczICAgICAgICAgICAgICAgMHgzMDQ5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNzQgICAgICAgICAgICAgICAweDMwNEEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl83NSAgICAgICAgICAgICAgIDB4MzA0QgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzc2ICAgICAgICAgICAgICAgMHgzMDRDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNzcgICAgICAgICAgICAgICAweDMwNEQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl83OCAgICAgICAgICAgICAgIDB4MzA0RQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzc5ICAgICAgICAgICAgICAgMHgzMDRGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfODAgICAgICAgICAgICAgICAweDMwNTAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl84MSAgICAgICAgICAgICAgIDB4MzA1MQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzgyICAgICAgICAgICAgICAgMHgzMDUyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfODMgICAgICAgICAgICAgICAweDMwNTMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl84NCAgICAgICAgICAgICAgIDB4MzA1NAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzg1ICAgICAgICAgICAgICAgMHgzMDU1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfODYgICAgICAgICAgICAgICAweDMwNTYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl84NyAgICAgICAgICAgICAgIDB4MzA1NworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzg4ICAgICAgICAgICAgICAgMHgzMDU4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfODkgICAgICAgICAgICAgICAweDMwNTkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl85MCAgICAgICAgICAgICAgIDB4MzA1QQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzkxICAgICAgICAgICAgICAgMHgzMDVCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfOTIgICAgICAgICAgICAgICAweDMwNUMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl85MyAgICAgICAgICAgICAgIDB4MzA1RAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzk0ICAgICAgICAgICAgICAgMHgzMDVFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfOTUgICAgICAgICAgICAgICAweDMwNUYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl85NiAgICAgICAgICAgICAgIDB4MzA2MAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzk3ICAgICAgICAgICAgICAgMHgzMDYxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfOTggICAgICAgICAgICAgICAweDMwNjIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl85OSAgICAgICAgICAgICAgIDB4MzA2MworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEwMCAgICAgICAgICAgICAgMHgzMDY0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTAxICAgICAgICAgICAgICAweDMwNjUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMDIgICAgICAgICAgICAgIDB4MzA2NgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEwMyAgICAgICAgICAgICAgMHgzMDY3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTA0ICAgICAgICAgICAgICAweDMwNjgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMDUgICAgICAgICAgICAgIDB4MzA2OQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEwNiAgICAgICAgICAgICAgMHgzMDZBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTA3ICAgICAgICAgICAgICAweDMwNkIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMDggICAgICAgICAgICAgIDB4MzA2QworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEwOSAgICAgICAgICAgICAgMHgzMDZECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTEwICAgICAgICAgICAgICAweDMwNkUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMTEgICAgICAgICAgICAgIDB4MzA2RgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzExMiAgICAgICAgICAgICAgMHgzMDcwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTEzICAgICAgICAgICAgICAweDMwNzEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMTQgICAgICAgICAgICAgIDB4MzA3MgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzExNSAgICAgICAgICAgICAgMHgzMDczCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTE2ICAgICAgICAgICAgICAweDMwNzQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMTcgICAgICAgICAgICAgIDB4MzA3NQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzExOCAgICAgICAgICAgICAgMHgzMDc2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTE5ICAgICAgICAgICAgICAweDMwNzcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMjAgICAgICAgICAgICAgIDB4MzA3OAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEyMSAgICAgICAgICAgICAgMHgzMDc5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTIyICAgICAgICAgICAgICAweDMwN0EKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMjMgICAgICAgICAgICAgIDB4MzA3QgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEyNCAgICAgICAgICAgICAgMHgzMDdDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTI1ICAgICAgICAgICAgICAweDMwN0QKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMjYgICAgICAgICAgICAgIDB4MzA3RQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEyNyAgICAgICAgICAgICAgMHgzMDdGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTI4ICAgICAgICAgICAgICAweDMwODAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMjkgICAgICAgICAgICAgIDB4MzA4MQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEzMCAgICAgICAgICAgICAgMHgzMDgyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTMxICAgICAgICAgICAgICAweDMwODMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMzIgICAgICAgICAgICAgIDB4MzA4NAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEzMyAgICAgICAgICAgICAgMHgzMDg1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTM0ICAgICAgICAgICAgICAweDMwODYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMzUgICAgICAgICAgICAgIDB4MzA4NworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEzNiAgICAgICAgICAgICAgMHgzMDg4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTM3ICAgICAgICAgICAgICAweDMwODkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xMzggICAgICAgICAgICAgIDB4MzA4QQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzEzOSAgICAgICAgICAgICAgMHgzMDhCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTQwICAgICAgICAgICAgICAweDMwOEMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNDEgICAgICAgICAgICAgIDB4MzA4RAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE0MiAgICAgICAgICAgICAgMHgzMDhFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTQzICAgICAgICAgICAgICAweDMwOEYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNDQgICAgICAgICAgICAgIDB4MzA5MAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE0NSAgICAgICAgICAgICAgMHgzMDkxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTQ2ICAgICAgICAgICAgICAweDMwOTIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNDcgICAgICAgICAgICAgIDB4MzA5MworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE0OCAgICAgICAgICAgICAgMHgzMDk0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTQ5ICAgICAgICAgICAgICAweDMwOTUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNTAgICAgICAgICAgICAgIDB4MzA5NgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE1MSAgICAgICAgICAgICAgMHgzMDk3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTUyICAgICAgICAgICAgICAweDMwOTgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNTMgICAgICAgICAgICAgIDB4MzA5OQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE1NCAgICAgICAgICAgICAgMHgzMDlBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTU1ICAgICAgICAgICAgICAweDMwOUIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNTYgICAgICAgICAgICAgIDB4MzA5QworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE1NyAgICAgICAgICAgICAgMHgzMDlECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTU4ICAgICAgICAgICAgICAweDMwOUUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNTkgICAgICAgICAgICAgIDB4MzA5RgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE2MCAgICAgICAgICAgICAgMHgzMEEwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTYxICAgICAgICAgICAgICAweDMwQTEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNjIgICAgICAgICAgICAgIDB4MzBBMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE2MyAgICAgICAgICAgICAgMHgzMEEzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTY0ICAgICAgICAgICAgICAweDMwQTQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNjUgICAgICAgICAgICAgIDB4MzBBNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE2NiAgICAgICAgICAgICAgMHgzMEE2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTY3ICAgICAgICAgICAgICAweDMwQTcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNjggICAgICAgICAgICAgIDB4MzBBOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE2OSAgICAgICAgICAgICAgMHgzMEE5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTcwICAgICAgICAgICAgICAweDMwQUEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNzEgICAgICAgICAgICAgIDB4MzBBQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE3MiAgICAgICAgICAgICAgMHgzMEFDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTczICAgICAgICAgICAgICAweDMwQUQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNzQgICAgICAgICAgICAgIDB4MzBBRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE3NSAgICAgICAgICAgICAgMHgzMEFGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTc2ICAgICAgICAgICAgICAweDMwQjAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xNzcgICAgICAgICAgICAgIDB4MzBCMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE3OCAgICAgICAgICAgICAgMHgzMEIyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTc5ICAgICAgICAgICAgICAweDMwQjMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xODAgICAgICAgICAgICAgIDB4MzBCNAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE4MSAgICAgICAgICAgICAgMHgzMEI1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTgyICAgICAgICAgICAgICAweDMwQjYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xODMgICAgICAgICAgICAgIDB4MzBCNworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE4NCAgICAgICAgICAgICAgMHgzMEI4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTg1ICAgICAgICAgICAgICAweDMwQjkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xODYgICAgICAgICAgICAgIDB4MzBCQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE4NyAgICAgICAgICAgICAgMHgzMEJCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTg4ICAgICAgICAgICAgICAweDMwQkMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xODkgICAgICAgICAgICAgIDB4MzBCRAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE5MCAgICAgICAgICAgICAgMHgzMEJFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTkxICAgICAgICAgICAgICAweDMwQkYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xOTIgICAgICAgICAgICAgIDB4MzBDMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE5MyAgICAgICAgICAgICAgMHgzMEMxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTk0ICAgICAgICAgICAgICAweDMwQzIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xOTUgICAgICAgICAgICAgIDB4MzBDMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE5NiAgICAgICAgICAgICAgMHgzMEM0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMTk3ICAgICAgICAgICAgICAweDMwQzUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8xOTggICAgICAgICAgICAgIDB4MzBDNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzE5OSAgICAgICAgICAgICAgMHgzMEM3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjAwICAgICAgICAgICAgICAweDMwQzgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMDEgICAgICAgICAgICAgIDB4MzBDOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIwMiAgICAgICAgICAgICAgMHgzMENBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjAzICAgICAgICAgICAgICAweDMwQ0IKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMDQgICAgICAgICAgICAgIDB4MzBDQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIwNSAgICAgICAgICAgICAgMHgzMENECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjA2ICAgICAgICAgICAgICAweDMwQ0UKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMDcgICAgICAgICAgICAgIDB4MzBDRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIwOCAgICAgICAgICAgICAgMHgzMEQwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjA5ICAgICAgICAgICAgICAweDMwRDEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMTAgICAgICAgICAgICAgIDB4MzBEMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIxMSAgICAgICAgICAgICAgMHgzMEQzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjEyICAgICAgICAgICAgICAweDMwRDQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMTMgICAgICAgICAgICAgIDB4MzBENQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIxNCAgICAgICAgICAgICAgMHgzMEQ2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjE1ICAgICAgICAgICAgICAweDMwRDcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMTYgICAgICAgICAgICAgIDB4MzBEOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIxNyAgICAgICAgICAgICAgMHgzMEQ5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjE4ICAgICAgICAgICAgICAweDMwREEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMTkgICAgICAgICAgICAgIDB4MzBEQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIyMCAgICAgICAgICAgICAgMHgzMERDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjIxICAgICAgICAgICAgICAweDMwREQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMjIgICAgICAgICAgICAgIDB4MzBERQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIyMyAgICAgICAgICAgICAgMHgzMERGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjI0ICAgICAgICAgICAgICAweDMwRTAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMjUgICAgICAgICAgICAgIDB4MzBFMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIyNiAgICAgICAgICAgICAgMHgzMEUyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjI3ICAgICAgICAgICAgICAweDMwRTMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMjggICAgICAgICAgICAgIDB4MzBFNAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIyOSAgICAgICAgICAgICAgMHgzMEU1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjMwICAgICAgICAgICAgICAweDMwRTYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMzEgICAgICAgICAgICAgIDB4MzBFNworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIzMiAgICAgICAgICAgICAgMHgzMEU4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjMzICAgICAgICAgICAgICAweDMwRTkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMzQgICAgICAgICAgICAgIDB4MzBFQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIzNSAgICAgICAgICAgICAgMHgzMEVCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjM2ICAgICAgICAgICAgICAweDMwRUMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yMzcgICAgICAgICAgICAgIDB4MzBFRAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzIzOCAgICAgICAgICAgICAgMHgzMEVFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjM5ICAgICAgICAgICAgICAweDMwRUYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNDAgICAgICAgICAgICAgIDB4MzBGMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI0MSAgICAgICAgICAgICAgMHgzMEYxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjQyICAgICAgICAgICAgICAweDMwRjIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNDMgICAgICAgICAgICAgIDB4MzBGMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI0NCAgICAgICAgICAgICAgMHgzMEY0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjQ1ICAgICAgICAgICAgICAweDMwRjUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNDYgICAgICAgICAgICAgIDB4MzBGNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI0NyAgICAgICAgICAgICAgMHgzMEY3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjQ4ICAgICAgICAgICAgICAweDMwRjgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNDkgICAgICAgICAgICAgIDB4MzBGOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI1MCAgICAgICAgICAgICAgMHgzMEZBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjUxICAgICAgICAgICAgICAweDMwRkIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNTIgICAgICAgICAgICAgIDB4MzBGQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI1MyAgICAgICAgICAgICAgMHgzMEZECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjU0ICAgICAgICAgICAgICAweDMwRkUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNTUgICAgICAgICAgICAgIDB4MzBGRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI1NiAgICAgICAgICAgICAgMHgzMTAwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjU3ICAgICAgICAgICAgICAweDMxMDEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNTggICAgICAgICAgICAgIDB4MzEwMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI1OSAgICAgICAgICAgICAgMHgzMTAzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjYwICAgICAgICAgICAgICAweDMxMDQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNjEgICAgICAgICAgICAgIDB4MzEwNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI2MiAgICAgICAgICAgICAgMHgzMTA2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjYzICAgICAgICAgICAgICAweDMxMDcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNjQgICAgICAgICAgICAgIDB4MzEwOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI2NSAgICAgICAgICAgICAgMHgzMTA5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjY2ICAgICAgICAgICAgICAweDMxMEEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNjcgICAgICAgICAgICAgIDB4MzEwQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI2OCAgICAgICAgICAgICAgMHgzMTBDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjY5ICAgICAgICAgICAgICAweDMxMEQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNzAgICAgICAgICAgICAgIDB4MzEwRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI3MSAgICAgICAgICAgICAgMHgzMTBGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjcyICAgICAgICAgICAgICAweDMxMTAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNzMgICAgICAgICAgICAgIDB4MzExMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI3NCAgICAgICAgICAgICAgMHgzMTEyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjc1ICAgICAgICAgICAgICAweDMxMTMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNzYgICAgICAgICAgICAgIDB4MzExNAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI3NyAgICAgICAgICAgICAgMHgzMTE1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjc4ICAgICAgICAgICAgICAweDMxMTYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yNzkgICAgICAgICAgICAgIDB4MzExNworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI4MCAgICAgICAgICAgICAgMHgzMTE4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjgxICAgICAgICAgICAgICAweDMxMTkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yODIgICAgICAgICAgICAgIDB4MzExQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI4MyAgICAgICAgICAgICAgMHgzMTFCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjg0ICAgICAgICAgICAgICAweDMxMUMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yODUgICAgICAgICAgICAgIDB4MzExRAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI4NiAgICAgICAgICAgICAgMHgzMTFFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjg3ICAgICAgICAgICAgICAweDMxMUYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yODggICAgICAgICAgICAgIDB4MzEyMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI4OSAgICAgICAgICAgICAgMHgzMTIxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjkwICAgICAgICAgICAgICAweDMxMjIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yOTEgICAgICAgICAgICAgIDB4MzEyMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI5MiAgICAgICAgICAgICAgMHgzMTI0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjkzICAgICAgICAgICAgICAweDMxMjUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yOTQgICAgICAgICAgICAgIDB4MzEyNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI5NSAgICAgICAgICAgICAgMHgzMTI3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjk2ICAgICAgICAgICAgICAweDMxMjgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8yOTcgICAgICAgICAgICAgIDB4MzEyOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzI5OCAgICAgICAgICAgICAgMHgzMTJBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMjk5ICAgICAgICAgICAgICAweDMxMkIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMDAgICAgICAgICAgICAgIDB4MzEyQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMwMSAgICAgICAgICAgICAgMHgzMTJECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzAyICAgICAgICAgICAgICAweDMxMkUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMDMgICAgICAgICAgICAgIDB4MzEyRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMwNCAgICAgICAgICAgICAgMHgzMTMwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzA1ICAgICAgICAgICAgICAweDMxMzEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMDYgICAgICAgICAgICAgIDB4MzEzMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMwNyAgICAgICAgICAgICAgMHgzMTMzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzA4ICAgICAgICAgICAgICAweDMxMzQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMDkgICAgICAgICAgICAgIDB4MzEzNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMxMCAgICAgICAgICAgICAgMHgzMTM2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzExICAgICAgICAgICAgICAweDMxMzcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMTIgICAgICAgICAgICAgIDB4MzEzOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMxMyAgICAgICAgICAgICAgMHgzMTM5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzE0ICAgICAgICAgICAgICAweDMxM0EKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMTUgICAgICAgICAgICAgIDB4MzEzQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMxNiAgICAgICAgICAgICAgMHgzMTNDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzE3ICAgICAgICAgICAgICAweDMxM0QKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMTggICAgICAgICAgICAgIDB4MzEzRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMxOSAgICAgICAgICAgICAgMHgzMTNGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzIwICAgICAgICAgICAgICAweDMxNDAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMjEgICAgICAgICAgICAgIDB4MzE0MQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMyMiAgICAgICAgICAgICAgMHgzMTQyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzIzICAgICAgICAgICAgICAweDMxNDMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMjQgICAgICAgICAgICAgIDB4MzE0NAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMyNSAgICAgICAgICAgICAgMHgzMTQ1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzI2ICAgICAgICAgICAgICAweDMxNDYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMjcgICAgICAgICAgICAgIDB4MzE0NworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMyOCAgICAgICAgICAgICAgMHgzMTQ4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzI5ICAgICAgICAgICAgICAweDMxNDkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMzAgICAgICAgICAgICAgIDB4MzE0QQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMzMSAgICAgICAgICAgICAgMHgzMTRCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzMyICAgICAgICAgICAgICAweDMxNEMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMzMgICAgICAgICAgICAgIDB4MzE0RAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMzNCAgICAgICAgICAgICAgMHgzMTRFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzM1ICAgICAgICAgICAgICAweDMxNEYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMzYgICAgICAgICAgICAgIDB4MzE1MAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzMzNyAgICAgICAgICAgICAgMHgzMTUxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzM4ICAgICAgICAgICAgICAweDMxNTIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zMzkgICAgICAgICAgICAgIDB4MzE1MworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM0MCAgICAgICAgICAgICAgMHgzMTU0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzQxICAgICAgICAgICAgICAweDMxNTUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNDIgICAgICAgICAgICAgIDB4MzE1NgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM0MyAgICAgICAgICAgICAgMHgzMTU3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzQ0ICAgICAgICAgICAgICAweDMxNTgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNDUgICAgICAgICAgICAgIDB4MzE1OQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM0NiAgICAgICAgICAgICAgMHgzMTVBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzQ3ICAgICAgICAgICAgICAweDMxNUIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNDggICAgICAgICAgICAgIDB4MzE1QworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM0OSAgICAgICAgICAgICAgMHgzMTVECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzUwICAgICAgICAgICAgICAweDMxNUUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNTEgICAgICAgICAgICAgIDB4MzE1RgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM1MiAgICAgICAgICAgICAgMHgzMTYwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzUzICAgICAgICAgICAgICAweDMxNjEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNTQgICAgICAgICAgICAgIDB4MzE2MgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM1NSAgICAgICAgICAgICAgMHgzMTYzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzU2ICAgICAgICAgICAgICAweDMxNjQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNTcgICAgICAgICAgICAgIDB4MzE2NQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM1OCAgICAgICAgICAgICAgMHgzMTY2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzU5ICAgICAgICAgICAgICAweDMxNjcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNjAgICAgICAgICAgICAgIDB4MzE2OAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM2MSAgICAgICAgICAgICAgMHgzMTY5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzYyICAgICAgICAgICAgICAweDMxNkEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNjMgICAgICAgICAgICAgIDB4MzE2QgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM2NCAgICAgICAgICAgICAgMHgzMTZDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzY1ICAgICAgICAgICAgICAweDMxNkQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNjYgICAgICAgICAgICAgIDB4MzE2RQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM2NyAgICAgICAgICAgICAgMHgzMTZGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzY4ICAgICAgICAgICAgICAweDMxNzAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNjkgICAgICAgICAgICAgIDB4MzE3MQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM3MCAgICAgICAgICAgICAgMHgzMTcyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzcxICAgICAgICAgICAgICAweDMxNzMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNzIgICAgICAgICAgICAgIDB4MzE3NAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM3MyAgICAgICAgICAgICAgMHgzMTc1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzc0ICAgICAgICAgICAgICAweDMxNzYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNzUgICAgICAgICAgICAgIDB4MzE3NworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM3NiAgICAgICAgICAgICAgMHgzMTc4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzc3ICAgICAgICAgICAgICAweDMxNzkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zNzggICAgICAgICAgICAgIDB4MzE3QQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM3OSAgICAgICAgICAgICAgMHgzMTdCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzgwICAgICAgICAgICAgICAweDMxN0MKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zODEgICAgICAgICAgICAgIDB4MzE3RAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM4MiAgICAgICAgICAgICAgMHgzMTdFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzgzICAgICAgICAgICAgICAweDMxN0YKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zODQgICAgICAgICAgICAgIDB4MzE4MAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM4NSAgICAgICAgICAgICAgMHgzMTgxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzg2ICAgICAgICAgICAgICAweDMxODIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zODcgICAgICAgICAgICAgIDB4MzE4MworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM4OCAgICAgICAgICAgICAgMHgzMTg0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzg5ICAgICAgICAgICAgICAweDMxODUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zOTAgICAgICAgICAgICAgIDB4MzE4NgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM5MSAgICAgICAgICAgICAgMHgzMTg3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzkyICAgICAgICAgICAgICAweDMxODgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zOTMgICAgICAgICAgICAgIDB4MzE4OQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM5NCAgICAgICAgICAgICAgMHgzMThBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzk1ICAgICAgICAgICAgICAweDMxOEIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zOTYgICAgICAgICAgICAgIDB4MzE4QworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzM5NyAgICAgICAgICAgICAgMHgzMThECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfMzk4ICAgICAgICAgICAgICAweDMxOEUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl8zOTkgICAgICAgICAgICAgIDB4MzE4RgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQwMCAgICAgICAgICAgICAgMHgzMTkwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDAxICAgICAgICAgICAgICAweDMxOTEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MDIgICAgICAgICAgICAgIDB4MzE5MgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQwMyAgICAgICAgICAgICAgMHgzMTkzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDA0ICAgICAgICAgICAgICAweDMxOTQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MDUgICAgICAgICAgICAgIDB4MzE5NQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQwNiAgICAgICAgICAgICAgMHgzMTk2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDA3ICAgICAgICAgICAgICAweDMxOTcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MDggICAgICAgICAgICAgIDB4MzE5OAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQwOSAgICAgICAgICAgICAgMHgzMTk5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDEwICAgICAgICAgICAgICAweDMxOUEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MTEgICAgICAgICAgICAgIDB4MzE5QgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQxMiAgICAgICAgICAgICAgMHgzMTlDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDEzICAgICAgICAgICAgICAweDMxOUQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MTQgICAgICAgICAgICAgIDB4MzE5RQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQxNSAgICAgICAgICAgICAgMHgzMTlGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDE2ICAgICAgICAgICAgICAweDMxQTAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MTcgICAgICAgICAgICAgIDB4MzFBMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQxOCAgICAgICAgICAgICAgMHgzMUEyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDE5ICAgICAgICAgICAgICAweDMxQTMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MjAgICAgICAgICAgICAgIDB4MzFBNAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQyMSAgICAgICAgICAgICAgMHgzMUE1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDIyICAgICAgICAgICAgICAweDMxQTYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MjMgICAgICAgICAgICAgIDB4MzFBNworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQyNCAgICAgICAgICAgICAgMHgzMUE4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDI1ICAgICAgICAgICAgICAweDMxQTkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MjYgICAgICAgICAgICAgIDB4MzFBQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQyNyAgICAgICAgICAgICAgMHgzMUFCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDI4ICAgICAgICAgICAgICAweDMxQUMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MjkgICAgICAgICAgICAgIDB4MzFBRAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQzMCAgICAgICAgICAgICAgMHgzMUFFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDMxICAgICAgICAgICAgICAweDMxQUYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MzIgICAgICAgICAgICAgIDB4MzFCMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQzMyAgICAgICAgICAgICAgMHgzMUIxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDM0ICAgICAgICAgICAgICAweDMxQjIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MzUgICAgICAgICAgICAgIDB4MzFCMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQzNiAgICAgICAgICAgICAgMHgzMUI0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDM3ICAgICAgICAgICAgICAweDMxQjUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80MzggICAgICAgICAgICAgIDB4MzFCNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQzOSAgICAgICAgICAgICAgMHgzMUI3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDQwICAgICAgICAgICAgICAweDMxQjgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NDEgICAgICAgICAgICAgIDB4MzFCOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ0MiAgICAgICAgICAgICAgMHgzMUJBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDQzICAgICAgICAgICAgICAweDMxQkIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NDQgICAgICAgICAgICAgIDB4MzFCQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ0NSAgICAgICAgICAgICAgMHgzMUJECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDQ2ICAgICAgICAgICAgICAweDMxQkUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NDcgICAgICAgICAgICAgIDB4MzFCRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ0OCAgICAgICAgICAgICAgMHgzMUMwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDQ5ICAgICAgICAgICAgICAweDMxQzEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NTAgICAgICAgICAgICAgIDB4MzFDMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ1MSAgICAgICAgICAgICAgMHgzMUMzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDUyICAgICAgICAgICAgICAweDMxQzQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NTMgICAgICAgICAgICAgIDB4MzFDNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ1NCAgICAgICAgICAgICAgMHgzMUM2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDU1ICAgICAgICAgICAgICAweDMxQzcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NTYgICAgICAgICAgICAgIDB4MzFDOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ1NyAgICAgICAgICAgICAgMHgzMUM5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDU4ICAgICAgICAgICAgICAweDMxQ0EKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NTkgICAgICAgICAgICAgIDB4MzFDQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ2MCAgICAgICAgICAgICAgMHgzMUNDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDYxICAgICAgICAgICAgICAweDMxQ0QKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NjIgICAgICAgICAgICAgIDB4MzFDRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ2MyAgICAgICAgICAgICAgMHgzMUNGCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDY0ICAgICAgICAgICAgICAweDMxRDAKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NjUgICAgICAgICAgICAgIDB4MzFEMQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ2NiAgICAgICAgICAgICAgMHgzMUQyCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDY3ICAgICAgICAgICAgICAweDMxRDMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NjggICAgICAgICAgICAgIDB4MzFENAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ2OSAgICAgICAgICAgICAgMHgzMUQ1CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDcwICAgICAgICAgICAgICAweDMxRDYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NzEgICAgICAgICAgICAgIDB4MzFENworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ3MiAgICAgICAgICAgICAgMHgzMUQ4CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDczICAgICAgICAgICAgICAweDMxRDkKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NzQgICAgICAgICAgICAgIDB4MzFEQQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ3NSAgICAgICAgICAgICAgMHgzMURCCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDc2ICAgICAgICAgICAgICAweDMxREMKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80NzcgICAgICAgICAgICAgIDB4MzFERAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ3OCAgICAgICAgICAgICAgMHgzMURFCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDc5ICAgICAgICAgICAgICAweDMxREYKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80ODAgICAgICAgICAgICAgIDB4MzFFMAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ4MSAgICAgICAgICAgICAgMHgzMUUxCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDgyICAgICAgICAgICAgICAweDMxRTIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80ODMgICAgICAgICAgICAgIDB4MzFFMworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ4NCAgICAgICAgICAgICAgMHgzMUU0CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDg1ICAgICAgICAgICAgICAweDMxRTUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80ODYgICAgICAgICAgICAgIDB4MzFFNgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ4NyAgICAgICAgICAgICAgMHgzMUU3CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDg4ICAgICAgICAgICAgICAweDMxRTgKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80ODkgICAgICAgICAgICAgIDB4MzFFOQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ5MCAgICAgICAgICAgICAgMHgzMUVBCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDkxICAgICAgICAgICAgICAweDMxRUIKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80OTIgICAgICAgICAgICAgIDB4MzFFQworI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ5MyAgICAgICAgICAgICAgMHgzMUVECisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDk0ICAgICAgICAgICAgICAweDMxRUUKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80OTUgICAgICAgICAgICAgIDB4MzFFRgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ5NiAgICAgICAgICAgICAgMHgzMUYwCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNDk3ICAgICAgICAgICAgICAweDMxRjEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl80OTggICAgICAgICAgICAgIDB4MzFGMgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzQ5OSAgICAgICAgICAgICAgMHgzMUYzCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTAwICAgICAgICAgICAgICAweDMxRjQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81MDEgICAgICAgICAgICAgIDB4MzFGNQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzUwMiAgICAgICAgICAgICAgMHgzMUY2CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTAzICAgICAgICAgICAgICAweDMxRjcKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81MDQgICAgICAgICAgICAgIDB4MzFGOAorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzUwNSAgICAgICAgICAgICAgMHgzMUY5CisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTA2ICAgICAgICAgICAgICAweDMxRkEKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81MDcgICAgICAgICAgICAgIDB4MzFGQgorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzUwOCAgICAgICAgICAgICAgMHgzMUZDCisjZGVmaW5lIFdNODk5NV9XUklURV9TRVFVRU5DRVJfNTA5ICAgICAgICAgICAgICAweDMxRkQKKyNkZWZpbmUgV004OTk1X1dSSVRFX1NFUVVFTkNFUl81MTAgICAgICAgICAgICAgIDB4MzFGRQorI2RlZmluZSBXTTg5OTVfV1JJVEVfU0VRVUVOQ0VSXzUxMSAgICAgICAgICAgICAgMHgzMUZGCisKKyNkZWZpbmUgV004OTk1X1JFR0lTVEVSX0NPVU5UICAgICAgICAgICAgICAgICAgIDcyNQorI2RlZmluZSBXTTg5OTVfTUFYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgzMUZGCisKKyNkZWZpbmUgV004OTk1X01BWF9DQUNIRURfUkVHSVNURVIJCVdNODk5NV9NQVhfUkVHSVNURVIKKworLyoKKyAqIEZpZWxkIERlZmluaXRpb25zLgorICovCisKKy8qCisgKiBSMCAoMHgwMCkgLSBTb2Z0d2FyZSBSZXNldAorICovCisjZGVmaW5lIFdNODk5NV9TV19SRVNFVF9NQVNLICAgICAgICAgICAgICAgICAgICAweEZGRkYJLyogU1dfUkVTRVQgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NXX1JFU0VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBTV19SRVNFVCAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfU1dfUkVTRVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDE2CS8qIFNXX1JFU0VUIC0gWzE1OjBdICovCisKKy8qCisgKiBSMSAoMHgwMSkgLSBQb3dlciBNYW5hZ2VtZW50ICgxKQorICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDkJLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogTUlDQjJfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDgJLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogTUlDQjFfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogSFBPVVQyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMkxfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBIUE9VVDJMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA3CS8qIEhQT1VUMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBIUE9VVDJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEhQT1VUMlJfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYJLyogSFBPVVQyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEhQT1VUMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAJLyogSFBPVVQxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgNQkvKiBIUE9VVDFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEhQT1VUMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogSFBPVVQxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMVJfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBIUE9VVDFSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0CS8qIEhQT1VUMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0JHX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBCR19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0JHX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBCR19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0JHX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBCR19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0JHX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBCR19FTkEgKi8KKworLyoKKyAqIFIyICgweDAyKSAtIFBvd2VyIE1hbmFnZW1lbnQgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X09QQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X09QQ0xLX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X09QQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMQkvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X09QQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBPUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0lOMUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBJTjFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSU4xTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIElOMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9JTjFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogSU4xTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0lOMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBJTjFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIElOMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9JTjFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogSU4xUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0lOMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBJTjFSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIElOMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9MRE8yX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogTERPMl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBMRE8yX0VOQSAqLworI2RlZmluZSBXTTg5OTVfTERPMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIExETzJfRU5BICovCisjZGVmaW5lIFdNODk5NV9MRE8yX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogTERPMl9FTkEgKi8KKworLyoKKyAqIFIzICgweDAzKSAtIFBvd2VyIE1hbmFnZW1lbnQgKDMpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYyQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYyQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAxMwkvKiBBSUYyQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0VOQSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYyQURDUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0VOQV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYyQURDUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAxMgkvKiBBSUYyQURDUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyQURDUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxQURDMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMkxfRU5BX01BU0sgICAgICAgICAgICAgICAweDA4MDAJLyogQUlGMUFEQzJMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDExCS8qIEFJRjFBREMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMlJfRU5BICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogQUlGMUFEQzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwNDAwCS8qIEFJRjFBREMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAxMAkvKiBBSUYxQURDMlJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFMX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEFJRjFBREMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDIwMAkvKiBBSUYxQURDMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDkJLyogQUlGMUFEQzFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFBREMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxQURDMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMVJfRU5BX01BU0sgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMUFEQzFSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFBREMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDM0xfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogRE1JQzNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzNMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIERNSUMzTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMzTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNwkvKiBETUlDM0xfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDM0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogRE1JQzNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzNSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIERNSUMzUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMzUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBETUlDM1JfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDM1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDYJLyogRE1JQzNSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzNSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIERNSUMzUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMyTF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBETUlDMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDMkxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAJLyogRE1JQzJMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA1CS8qIERNSUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMyTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBETUlDMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDMlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogRE1JQzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzJSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIERNSUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMyUl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNAkvKiBETUlDMlJfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogRE1JQzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIERNSUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMxTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBETUlDMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDMUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMJLyogRE1JQzFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIERNSUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMxUl9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBETUlDMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9ETUlDMVJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDQJLyogRE1JQzFSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRE1JQzFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAyCS8qIERNSUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RNSUMxUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBETUlDMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BRENMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBRENMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQURDTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEFEQ0xfRU5BICovCisjZGVmaW5lIFdNODk5NV9BRENMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogQURDTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBRENSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQURDUl9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFEQ1JfRU5BICovCisjZGVmaW5lIFdNODk5NV9BRENSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogQURDUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBBRENSX0VOQSAqLworCisvKgorICogUjQgKDB4MDQpIC0gUG93ZXIgTWFuYWdlbWVudCAoNCkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfRU5BICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEFJRjJEQUNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEFJRjJEQUNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDEzCS8qIEFJRjJEQUNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJEQUNMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfRU5BICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjJEQUNSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfRU5BX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjJEQUNSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDEyCS8qIEFJRjJEQUNSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJEQUNSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIEFJRjFEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxREFDMkxfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMkxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMTEJLyogQUlGMURBQzJMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9FTkEgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBBSUYxREFDMlJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMlJfRU5BX01BU0sgICAgICAgICAgICAgICAweDA0MDAJLyogQUlGMURBQzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDEwCS8qIEFJRjFEQUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMlJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMUxfRU5BICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogQUlGMURBQzFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFMX0VOQV9NQVNLICAgICAgICAgICAgICAgMHgwMjAwCS8qIEFJRjFEQUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgOQkvKiBBSUYxREFDMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzFMX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX0VOQSAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFEQUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxUl9FTkFfTUFTSyAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMVJfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMVJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMURBQzFSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMwkvKiBEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBEQUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBEQUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBEQUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMyUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBEQUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBEQUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMxTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBEQUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBEQUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBEQUMxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMxUl9FTkEgKi8KKworLyoKKyAqIFI1ICgweDA1KSAtIFBvd2VyIE1hbmFnZW1lbnQgKDUpCisgKi8KKyNkZWZpbmUgV004OTk1X0RNSUNfU1JDMl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDMwMAkvKiBETUlDX1NSQzIgLSBbOTo4XSAqLworI2RlZmluZSBXTTg5OTVfRE1JQ19TUkMyX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA4CS8qIERNSUNfU1JDMiAtIFs5OjhdICovCisjZGVmaW5lIFdNODk5NV9ETUlDX1NSQzJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIJLyogRE1JQ19TUkMyIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RNSUNfU1JDMV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBDMAkvKiBETUlDX1NSQzEgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5OTVfRE1JQ19TUkMxX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA2CS8qIERNSUNfU1JDMSAtIFs3OjZdICovCisjZGVmaW5lIFdNODk5NV9ETUlDX1NSQzFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIJLyogRE1JQ19TUkMxIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjNfVFJJICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBBSUYzX1RSSSAqLworI2RlZmluZSBXTTg5OTVfQUlGM19UUklfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEFJRjNfVFJJICovCisjZGVmaW5lIFdNODk5NV9BSUYzX1RSSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogQUlGM19UUkkgKi8KKyNkZWZpbmUgV004OTk1X0FJRjNfVFJJX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYzX1RSSSAqLworI2RlZmluZSBXTTg5OTVfQUlGM19BRENEQVRfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDE4CS8qIEFJRjNfQURDREFUX1NSQyAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYzX0FEQ0RBVF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgIDMJLyogQUlGM19BRENEQVRfU1JDIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjNfQURDREFUX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBBSUYzX0FEQ0RBVF9TUkMgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9BRENEQVRfU1JDICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJfQURDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9BRENEQVRfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJfQURDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9BRENEQVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAyCS8qIEFJRjJfQURDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9BRENEQVRfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjJfQURDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNEQVRfU1JDICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjJfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNEQVRfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjJfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNEQVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAxCS8qIEFJRjJfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9EQUNEQVRfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjJfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUNEQVRfU1JDICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUNEQVRfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUNEQVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjFfREFDREFUX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9EQUNEQVRfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjFfREFDREFUX1NSQyAqLworCisvKgorICogUjE2ICgweDEwKSAtIExlZnQgTGluZSBJbnB1dCAxIFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9JTjFfVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogSU4xX1ZVICovCisjZGVmaW5lIFdNODk5NV9JTjFfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogSU4xX1ZVICovCisjZGVmaW5lIFdNODk5NV9JTjFfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDcJLyogSU4xX1ZVICovCisjZGVmaW5lIFdNODk5NV9JTjFfVlVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogSU4xX1ZVICovCisjZGVmaW5lIFdNODk5NV9JTjFMX1pDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogSU4xTF9aQyAqLworI2RlZmluZSBXTTg5OTVfSU4xTF9aQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIElOMUxfWkMgKi8KKyNkZWZpbmUgV004OTk1X0lOMUxfWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBJTjFMX1pDICovCisjZGVmaW5lIFdNODk5NV9JTjFMX1pDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogSU4xTF9aQyAqLworI2RlZmluZSBXTTg5OTVfSU4xTF9WT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDFGCS8qIElOMUxfVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0lOMUxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBJTjFMX1ZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9JTjFMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogSU4xTF9WT0wgLSBbNDowXSAqLworCisvKgorICogUjE3ICgweDExKSAtIFJpZ2h0IExpbmUgSW5wdXQgMSBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg5OTVfSU4xX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIElOMV9WVSAqLworI2RlZmluZSBXTTg5OTVfSU4xX1ZVX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIElOMV9WVSAqLworI2RlZmluZSBXTTg5OTVfSU4xX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA3CS8qIElOMV9WVSAqLworI2RlZmluZSBXTTg5OTVfSU4xX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIElOMV9WVSAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9aQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIElOMVJfWkMgKi8KKyNkZWZpbmUgV004OTk1X0lOMVJfWkNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBJTjFSX1pDICovCisjZGVmaW5lIFdNODk5NV9JTjFSX1pDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogSU4xUl9aQyAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9aQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIElOMVJfWkMgKi8KKyNkZWZpbmUgV004OTk1X0lOMVJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBJTjFSX1ZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9JTjFSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogSU4xUl9WT0wgLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA1CS8qIElOMVJfVk9MIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxOCAoMHgxMikgLSBMZWZ0IExpbmUgSW5wdXQgQ29udHJvbAorICovCisjZGVmaW5lIFdNODk5NV9JTjFMX0JPT1NUX01BU0sgICAgICAgICAgICAgICAgICAweDAwMzAJLyogSU4xTF9CT09TVCAtIFs1OjRdICovCisjZGVmaW5lIFdNODk5NV9JTjFMX0JPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDQJLyogSU4xTF9CT09TVCAtIFs1OjRdICovCisjZGVmaW5lIFdNODk5NV9JTjFMX0JPT1NUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDIJLyogSU4xTF9CT09TVCAtIFs1OjRdICovCisjZGVmaW5lIFdNODk5NV9JTjFMX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMEMJLyogSU4xTF9NT0RFIC0gWzM6Ml0gKi8KKyNkZWZpbmUgV004OTk1X0lOMUxfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBJTjFMX01PREUgLSBbMzoyXSAqLworI2RlZmluZSBXTTg5OTVfSU4xTF9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyCS8qIElOMUxfTU9ERSAtIFszOjJdICovCisjZGVmaW5lIFdNODk5NV9JTjFSX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMJLyogSU4xUl9NT0RFIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0lOMVJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBJTjFSX01PREUgLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfSU4xUl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyCS8qIElOMVJfTU9ERSAtIFsxOjBdICovCisKKy8qCisgKiBSMjQgKDB4MTgpIC0gREFDMSBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9EQUMxTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogREFDMUxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIERBQzFMX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBEQUMxTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMxTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogREFDMUxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMV9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIERBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBEQUMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9EQUMxX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgJLyogREFDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMV9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIERBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFMX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRgkvKiBEQUMxTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfREFDMUxfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCS8qIERBQzFMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9EQUMxTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDgJLyogREFDMUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNSAoMHgxOSkgLSBEQUMxIFJpZ2h0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9EQUMxUl9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogREFDMVJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMVJfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIERBQzFSX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBEQUMxUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMxUl9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogREFDMVJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMV9WVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIERBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFfVlVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBEQUMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9EQUMxX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgJLyogREFDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMV9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIERBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzFSX1ZPTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGRgkvKiBEQUMxUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfREFDMVJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCS8qIERBQzFSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9EQUMxUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDgJLyogREFDMVJfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIyNiAoMHgxQSkgLSBEQUMyIExlZnQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBEQUMyTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMyTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAJLyogREFDMkxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMkxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA5CS8qIERBQzJMX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMyTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMyX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIERBQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBEQUMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9EQUMyX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMkxfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGCS8qIERBQzJMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9EQUMyTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAJLyogREFDMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0RBQzJMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBEQUMyTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjI3ICgweDFCKSAtIERBQzIgUmlnaHQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBEQUMyUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMyUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAyMDAJLyogREFDMlJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfREFDMlJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA5CS8qIERBQzJSX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUMyUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9EQUMyX1ZVICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMl9WVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIERBQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0RBQzJfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBEQUMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9EQUMyX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfREFDMlJfVk9MX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMEZGCS8qIERBQzJSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9EQUMyUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAJLyogREFDMlJfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0RBQzJSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBEQUMyUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjI4ICgweDFDKSAtIE91dHB1dCBWb2x1bWUgWkMgKDEpCisgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMkxfWkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBIUE9VVDJMX1pDICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX1pDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDgJLyogSFBPVVQyTF9aQyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyTF9aQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAzCS8qIEhQT1VUMkxfWkMgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMkxfWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDJMX1pDICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJSX1pDICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogSFBPVVQyUl9aQyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9aQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEhQT1VUMlJfWkMgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMgkvKiBIUE9VVDJSX1pDICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJSX1pDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQyUl9aQyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9aQyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEhQT1VUMUxfWkMgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfWkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBIUE9VVDFMX1pDICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFMX1pDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQxTF9aQyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9aQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIEhQT1VUMUxfWkMgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMVJfWkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBIUE9VVDFSX1pDICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX1pDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEJLyogSFBPVVQxUl9aQyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxUl9aQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCS8qIEhQT1VUMVJfWkMgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMVJfWkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDFSX1pDICovCisKKy8qCisgKiBSMzIgKDB4MjApIC0gTUlDQklBUyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfTUlDQjFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIE1JQ0IxX01PREUgKi8KKyNkZWZpbmUgV004OTk1X01JQ0IxX01PREVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBNSUNCMV9NT0RFICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMJLyogTUlDQjFfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfTUlDQjFfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1JQ0IxX01PREUgKi8KKyNkZWZpbmUgV004OTk1X01JQ0IxX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNgkvKiBNSUNCMV9MVkwgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfTUlDQjFfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1JQ0IxX0xWTCAtIFsyOjFdICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIJLyogTUlDQjFfTFZMIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTk1X01JQ0IxX0RJU0NIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBNSUNCMV9ESVNDSCAqLworI2RlZmluZSBXTTg5OTVfTUlDQjFfRElTQ0hfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIE1JQ0IxX0RJU0NIICovCisjZGVmaW5lIFdNODk5NV9NSUNCMV9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAJLyogTUlDQjFfRElTQ0ggKi8KKyNkZWZpbmUgV004OTk1X01JQ0IxX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBNSUNCMV9ESVNDSCAqLworCisvKgorICogUjMzICgweDIxKSAtIE1JQ0JJQVMgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X01JQ0IyX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBNSUNCMl9NT0RFICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDgJLyogTUlDQjJfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfTUlDQjJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAzCS8qIE1JQ0IyX01PREUgKi8KKyNkZWZpbmUgV004OTk1X01JQ0IyX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBNSUNCMl9NT0RFICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDYJLyogTUlDQjJfTFZMIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTk1X01JQ0IyX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBNSUNCMl9MVkwgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfTUlDQjJfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyCS8qIE1JQ0IyX0xWTCAtIFsyOjFdICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9ESVNDSCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogTUlDQjJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTk1X01JQ0IyX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBNSUNCMl9ESVNDSCAqLworI2RlZmluZSBXTTg5OTVfTUlDQjJfRElTQ0hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCS8qIE1JQ0IyX0RJU0NIICovCisjZGVmaW5lIFdNODk5NV9NSUNCMl9ESVNDSF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogTUlDQjJfRElTQ0ggKi8KKworLyoKKyAqIFI0MCAoMHgyOCkgLSBMRE8gMQorICovCisjZGVmaW5lIFdNODk5NV9MRE8xX01PREUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogTERPMV9NT0RFICovCisjZGVmaW5lIFdNODk5NV9MRE8xX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogTERPMV9NT0RFICovCisjZGVmaW5lIFdNODk5NV9MRE8xX01PREVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUJLyogTERPMV9NT0RFICovCisjZGVmaW5lIFdNODk5NV9MRE8xX01PREVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogTERPMV9NT0RFICovCisjZGVmaW5lIFdNODk5NV9MRE8xX1ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDYJLyogTERPMV9WU0VMIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTk1X0xETzFfVlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBMRE8xX1ZTRUwgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfTERPMV9WU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyCS8qIExETzFfVlNFTCAtIFsyOjFdICovCisjZGVmaW5lIFdNODk5NV9MRE8xX0RJU0NIICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogTERPMV9ESVNDSCAqLworI2RlZmluZSBXTTg5OTVfTERPMV9ESVNDSF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIExETzFfRElTQ0ggKi8KKyNkZWZpbmUgV004OTk1X0xETzFfRElTQ0hfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMAkvKiBMRE8xX0RJU0NIICovCisjZGVmaW5lIFdNODk5NV9MRE8xX0RJU0NIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogTERPMV9ESVNDSCAqLworCisvKgorICogUjQxICgweDI5KSAtIExETyAyCisgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBMRE8yX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBMRE8yX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBMRE8yX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfTU9ERV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBMRE8yX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0xETzJfVlNFTF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxRQkvKiBMRE8yX1ZTRUwgLSBbNDoxXSAqLworI2RlZmluZSBXTTg5OTVfTERPMl9WU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxCS8qIExETzJfVlNFTCAtIFs0OjFdICovCisjZGVmaW5lIFdNODk5NV9MRE8yX1ZTRUxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQJLyogTERPMl9WU0VMIC0gWzQ6MV0gKi8KKyNkZWZpbmUgV004OTk1X0xETzJfRElTQ0ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBMRE8yX0RJU0NIICovCisjZGVmaW5lIFdNODk5NV9MRE8yX0RJU0NIX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEJLyogTERPMl9ESVNDSCAqLworI2RlZmluZSBXTTg5OTVfTERPMl9ESVNDSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAwCS8qIExETzJfRElTQ0ggKi8KKyNkZWZpbmUgV004OTk1X0xETzJfRElTQ0hfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBMRE8yX0RJU0NIICovCisKKy8qCisgKiBSNDggKDB4MzApIC0gQWNjZXNzb3J5IERldGVjdCBNb2RlMQorICovCisjZGVmaW5lIFdNODk5NV9KRF9NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDMJLyogSkRfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9KRF9NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogSkRfTU9ERSAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9KRF9NT0RFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDIJLyogSkRfTU9ERSAtIFsxOjBdICovCisKKy8qCisgKiBSNDkgKDB4MzEpIC0gQWNjZXNzb3J5IERldGVjdCBNb2RlMgorICovCisjZGVmaW5lIFdNODk5NV9WSURfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogVklEX0VOQSAqLworI2RlZmluZSBXTTg5OTVfVklEX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIFZJRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1ZJRF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBWSURfRU5BICovCisjZGVmaW5lIFdNODk5NV9WSURfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogVklEX0VOQSAqLworCisvKgorICogUjUyICgweDM0KSAtIEhlYWRwaG9uZSBEZXRlY3QxCisgKi8KKyNkZWZpbmUgV004OTk1X0hQX1JBTVBSQVRFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBIUF9SQU1QUkFURSAqLworI2RlZmluZSBXTTg5OTVfSFBfUkFNUFJBVEVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEhQX1JBTVBSQVRFICovCisjZGVmaW5lIFdNODk5NV9IUF9SQU1QUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBfUkFNUFJBVEUgKi8KKyNkZWZpbmUgV004OTk1X0hQX1JBTVBSQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUF9SQU1QUkFURSAqLworI2RlZmluZSBXTTg5OTVfSFBfUE9MTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEhQX1BPTEwgKi8KKyNkZWZpbmUgV004OTk1X0hQX1BPTExfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBIUF9QT0xMICovCisjZGVmaW5lIFdNODk5NV9IUF9QT0xMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogSFBfUE9MTCAqLworI2RlZmluZSBXTTg5OTVfSFBfUE9MTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEhQX1BPTEwgKi8KKworLyoKKyAqIFI1MyAoMHgzNSkgLSBIZWFkcGhvbmUgRGV0ZWN0MgorICovCisjZGVmaW5lIFdNODk5NV9IUF9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogSFBfRE9ORSAqLworI2RlZmluZSBXTTg5OTVfSFBfRE9ORV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIEhQX0RPTkUgKi8KKyNkZWZpbmUgV004OTk1X0hQX0RPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNwkvKiBIUF9ET05FICovCisjZGVmaW5lIFdNODk5NV9IUF9ET05FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBfRE9ORSAqLworI2RlZmluZSBXTTg5OTVfSFBfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDdGCS8qIEhQX0xWTCAtIFs2OjBdICovCisjZGVmaW5lIFdNODk5NV9IUF9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogSFBfTFZMIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004OTk1X0hQX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNwkvKiBIUF9MVkwgLSBbNjowXSAqLworCisvKgorICogUjU2ICgweDM4KSAtIE1pYyBEZXRlY3QgKDEpCisgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfUkFURV9NQVNLICAgICAgICAgICAgICAgICAgIDB4NzgwMAkvKiBNSUNEX1JBVEUgLSBbMTQ6MTFdICovCisjZGVmaW5lIFdNODk5NV9NSUNEX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTEJLyogTUlDRF9SQVRFIC0gWzE0OjExXSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICA0CS8qIE1JQ0RfUkFURSAtIFsxNDoxMV0gKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfTFZMX1NFTF9NQVNLICAgICAgICAgICAgICAgIDB4MDFGOAkvKiBNSUNEX0xWTF9TRUwgLSBbODozXSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9MVkxfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAzCS8qIE1JQ0RfTFZMX1NFTCAtIFs4OjNdICovCisjZGVmaW5lIFdNODk5NV9NSUNEX0xWTF9TRUxfV0lEVEggICAgICAgICAgICAgICAgICAgIDYJLyogTUlDRF9MVkxfU0VMIC0gWzg6M10gKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfREJUSU1FICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBNSUNEX0RCVElNRSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9EQlRJTUVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIE1JQ0RfREJUSU1FICovCisjZGVmaW5lIFdNODk5NV9NSUNEX0RCVElNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEJLyogTUlDRF9EQlRJTUUgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfREJUSU1FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBNSUNEX0RCVElNRSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIE1JQ0RfRU5BICovCisjZGVmaW5lIFdNODk5NV9NSUNEX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogTUlDRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBNSUNEX0VOQSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1JQ0RfRU5BICovCisKKy8qCisgKiBSNTcgKDB4MzkpIC0gTWljIERldGVjdCAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMUZDCS8qIE1JQ0RfTFZMIC0gWzg6Ml0gKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBNSUNEX0xWTCAtIFs4OjJdICovCisjZGVmaW5lIFdNODk5NV9NSUNEX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDcJLyogTUlDRF9MVkwgLSBbODoyXSAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfVkFMSURfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBNSUNEX1ZBTElEICovCisjZGVmaW5lIFdNODk5NV9NSUNEX1ZBTElEX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEJLyogTUlDRF9WQUxJRCAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9WQUxJRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1JQ0RfVkFMSUQgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfU1RTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBNSUNEX1NUUyAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9TVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIE1JQ0RfU1RTICovCisjZGVmaW5lIFdNODk5NV9NSUNEX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogTUlDRF9TVFMgKi8KKyNkZWZpbmUgV004OTk1X01JQ0RfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBNSUNEX1NUUyAqLworCisvKgorICogUjY0ICgweDQwKSAtIENoYXJnZSBQdW1wICgxKQorICovCisjZGVmaW5lIFdNODk5NV9DUF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQ1BfRU5BICovCisjZGVmaW5lIFdNODk5NV9DUF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQ1BfRU5BICovCisjZGVmaW5lIFdNODk5NV9DUF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogQ1BfRU5BICovCisjZGVmaW5lIFdNODk5NV9DUF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogQ1BfRU5BICovCisKKy8qCisgKiBSNjkgKDB4NDUpIC0gQ2xhc3MgVyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQ1BfRFlOX1NSQ19TRUxfTUFTSyAgICAgICAgICAgICAgMHgwMzAwCS8qIENQX0RZTl9TUkNfU0VMIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004OTk1X0NQX0RZTl9TUkNfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgOAkvKiBDUF9EWU5fU1JDX1NFTCAtIFs5OjhdICovCisjZGVmaW5lIFdNODk5NV9DUF9EWU5fU1JDX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgIDIJLyogQ1BfRFlOX1NSQ19TRUwgLSBbOTo4XSAqLworI2RlZmluZSBXTTg5OTVfQ1BfRFlOX1BXUiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIENQX0RZTl9QV1IgKi8KKyNkZWZpbmUgV004OTk1X0NQX0RZTl9QV1JfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBDUF9EWU5fUFdSICovCisjZGVmaW5lIFdNODk5NV9DUF9EWU5fUFdSX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAJLyogQ1BfRFlOX1BXUiAqLworI2RlZmluZSBXTTg5OTVfQ1BfRFlOX1BXUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIENQX0RZTl9QV1IgKi8KKworLyoKKyAqIFI4MCAoMHg1MCkgLSBEQyBTZXJ2byAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzMgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIERDU19FTkFfQ0hBTl8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRU5BX0NIQU5fM19NQVNLICAgICAgICAgICAgICAweDAwMDgJLyogRENTX0VOQV9DSEFOXzMgKi8KKyNkZWZpbmUgV004OTk1X0RDU19FTkFfQ0hBTl8zX1NISUZUICAgICAgICAgICAgICAgICAgMwkvKiBEQ1NfRU5BX0NIQU5fMyAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzNfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIERDU19FTkFfQ0hBTl8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRU5BX0NIQU5fMiAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogRENTX0VOQV9DSEFOXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19FTkFfQ0hBTl8yX01BU0sgICAgICAgICAgICAgIDB4MDAwNAkvKiBEQ1NfRU5BX0NIQU5fMiAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzJfU0hJRlQgICAgICAgICAgICAgICAgICAyCS8qIERDU19FTkFfQ0hBTl8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRU5BX0NIQU5fMl9XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogRENTX0VOQV9DSEFOXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19FTkFfQ0hBTl8xICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBEQ1NfRU5BX0NIQU5fMSAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzFfTUFTSyAgICAgICAgICAgICAgMHgwMDAyCS8qIERDU19FTkFfQ0hBTl8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRU5BX0NIQU5fMV9TSElGVCAgICAgICAgICAgICAgICAgIDEJLyogRENTX0VOQV9DSEFOXzEgKi8KKyNkZWZpbmUgV004OTk1X0RDU19FTkFfQ0hBTl8xX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBEQ1NfRU5BX0NIQU5fMSAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIERDU19FTkFfQ0hBTl8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRU5BX0NIQU5fMF9NQVNLICAgICAgICAgICAgICAweDAwMDEJLyogRENTX0VOQV9DSEFOXzAgKi8KKyNkZWZpbmUgV004OTk1X0RDU19FTkFfQ0hBTl8wX1NISUZUICAgICAgICAgICAgICAgICAgMAkvKiBEQ1NfRU5BX0NIQU5fMCAqLworI2RlZmluZSBXTTg5OTVfRENTX0VOQV9DSEFOXzBfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIERDU19FTkFfQ0hBTl8wICovCisKKy8qCisgKiBSODEgKDB4NTEpIC0gREMgU2Vydm8gKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8zICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBEQ1NfVFJJR19TSU5HTEVfMyAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0lOR0xFXzNfTUFTSyAgICAgICAgICAgMHg4MDAwCS8qIERDU19UUklHX1NJTkdMRV8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TSU5HTEVfM19TSElGVCAgICAgICAgICAgICAgMTUJLyogRENTX1RSSUdfU0lOR0xFXzMgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8zX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBEQ1NfVFJJR19TSU5HTEVfMyAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0lOR0xFXzIgICAgICAgICAgICAgICAgMHg0MDAwCS8qIERDU19UUklHX1NJTkdMRV8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TSU5HTEVfMl9NQVNLICAgICAgICAgICAweDQwMDAJLyogRENTX1RSSUdfU0lOR0xFXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8yX1NISUZUICAgICAgICAgICAgICAxNAkvKiBEQ1NfVFJJR19TSU5HTEVfMiAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0lOR0xFXzJfV0lEVEggICAgICAgICAgICAgICAxCS8qIERDU19UUklHX1NJTkdMRV8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TSU5HTEVfMSAgICAgICAgICAgICAgICAweDIwMDAJLyogRENTX1RSSUdfU0lOR0xFXzEgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8xX01BU0sgICAgICAgICAgIDB4MjAwMAkvKiBEQ1NfVFJJR19TSU5HTEVfMSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0lOR0xFXzFfU0hJRlQgICAgICAgICAgICAgIDEzCS8qIERDU19UUklHX1NJTkdMRV8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TSU5HTEVfMV9XSURUSCAgICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU0lOR0xFXzEgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8wICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBEQ1NfVFJJR19TSU5HTEVfMCAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0lOR0xFXzBfTUFTSyAgICAgICAgICAgMHgxMDAwCS8qIERDU19UUklHX1NJTkdMRV8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TSU5HTEVfMF9TSElGVCAgICAgICAgICAgICAgMTIJLyogRENTX1RSSUdfU0lOR0xFXzAgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NJTkdMRV8wX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBEQ1NfVFJJR19TSU5HTEVfMCAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzMgICAgICAgICAgICAgICAgMHgwODAwCS8qIERDU19UUklHX1NFUklFU18zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TRVJJRVNfM19NQVNLICAgICAgICAgICAweDA4MDAJLyogRENTX1RSSUdfU0VSSUVTXzMgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NFUklFU18zX1NISUZUICAgICAgICAgICAgICAxMQkvKiBEQ1NfVFJJR19TRVJJRVNfMyAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzNfV0lEVEggICAgICAgICAgICAgICAxCS8qIERDU19UUklHX1NFUklFU18zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TRVJJRVNfMiAgICAgICAgICAgICAgICAweDA0MDAJLyogRENTX1RSSUdfU0VSSUVTXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NFUklFU18yX01BU0sgICAgICAgICAgIDB4MDQwMAkvKiBEQ1NfVFJJR19TRVJJRVNfMiAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzJfU0hJRlQgICAgICAgICAgICAgIDEwCS8qIERDU19UUklHX1NFUklFU18yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TRVJJRVNfMl9XSURUSCAgICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU0VSSUVTXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NFUklFU18xICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBEQ1NfVFJJR19TRVJJRVNfMSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzFfTUFTSyAgICAgICAgICAgMHgwMjAwCS8qIERDU19UUklHX1NFUklFU18xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TRVJJRVNfMV9TSElGVCAgICAgICAgICAgICAgIDkJLyogRENTX1RSSUdfU0VSSUVTXzEgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NFUklFU18xX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBEQ1NfVFJJR19TRVJJRVNfMSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIERDU19UUklHX1NFUklFU18wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TRVJJRVNfMF9NQVNLICAgICAgICAgICAweDAxMDAJLyogRENTX1RSSUdfU0VSSUVTXzAgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX1NFUklFU18wX1NISUZUICAgICAgICAgICAgICAgOAkvKiBEQ1NfVFJJR19TRVJJRVNfMCAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfU0VSSUVTXzBfV0lEVEggICAgICAgICAgICAgICAxCS8qIERDU19UUklHX1NFUklFU18wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzMgICAgICAgICAgICAgICAweDAwODAJLyogRENTX1RSSUdfU1RBUlRVUF8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzNfTUFTSyAgICAgICAgICAweDAwODAJLyogRENTX1RSSUdfU1RBUlRVUF8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzNfU0hJRlQgICAgICAgICAgICAgIDcJLyogRENTX1RSSUdfU1RBUlRVUF8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzNfV0lEVEggICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU1RBUlRVUF8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzIgICAgICAgICAgICAgICAweDAwNDAJLyogRENTX1RSSUdfU1RBUlRVUF8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzJfTUFTSyAgICAgICAgICAweDAwNDAJLyogRENTX1RSSUdfU1RBUlRVUF8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzJfU0hJRlQgICAgICAgICAgICAgIDYJLyogRENTX1RSSUdfU1RBUlRVUF8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzJfV0lEVEggICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU1RBUlRVUF8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzEgICAgICAgICAgICAgICAweDAwMjAJLyogRENTX1RSSUdfU1RBUlRVUF8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzFfTUFTSyAgICAgICAgICAweDAwMjAJLyogRENTX1RSSUdfU1RBUlRVUF8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzFfU0hJRlQgICAgICAgICAgICAgIDUJLyogRENTX1RSSUdfU1RBUlRVUF8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzFfV0lEVEggICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU1RBUlRVUF8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzAgICAgICAgICAgICAgICAweDAwMTAJLyogRENTX1RSSUdfU1RBUlRVUF8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzBfTUFTSyAgICAgICAgICAweDAwMTAJLyogRENTX1RSSUdfU1RBUlRVUF8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzBfU0hJRlQgICAgICAgICAgICAgIDQJLyogRENTX1RSSUdfU1RBUlRVUF8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19TVEFSVFVQXzBfV0lEVEggICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfU1RBUlRVUF8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfMyAgICAgICAgICAgICAgICAweDAwMDgJLyogRENTX1RSSUdfREFDX1dSXzMgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX0RBQ19XUl8zX01BU0sgICAgICAgICAgIDB4MDAwOAkvKiBEQ1NfVFJJR19EQUNfV1JfMyAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzNfU0hJRlQgICAgICAgICAgICAgICAzCS8qIERDU19UUklHX0RBQ19XUl8zICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfM19XSURUSCAgICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfREFDX1dSXzMgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX0RBQ19XUl8yICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBEQ1NfVFJJR19EQUNfV1JfMiAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzJfTUFTSyAgICAgICAgICAgMHgwMDA0CS8qIERDU19UUklHX0RBQ19XUl8yICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfMl9TSElGVCAgICAgICAgICAgICAgIDIJLyogRENTX1RSSUdfREFDX1dSXzIgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX0RBQ19XUl8yX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBEQ1NfVFJJR19EQUNfV1JfMiAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzEgICAgICAgICAgICAgICAgMHgwMDAyCS8qIERDU19UUklHX0RBQ19XUl8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfMV9NQVNLICAgICAgICAgICAweDAwMDIJLyogRENTX1RSSUdfREFDX1dSXzEgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX0RBQ19XUl8xX1NISUZUICAgICAgICAgICAgICAgMQkvKiBEQ1NfVFJJR19EQUNfV1JfMSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzFfV0lEVEggICAgICAgICAgICAgICAxCS8qIERDU19UUklHX0RBQ19XUl8xICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfMCAgICAgICAgICAgICAgICAweDAwMDEJLyogRENTX1RSSUdfREFDX1dSXzAgKi8KKyNkZWZpbmUgV004OTk1X0RDU19UUklHX0RBQ19XUl8wX01BU0sgICAgICAgICAgIDB4MDAwMQkvKiBEQ1NfVFJJR19EQUNfV1JfMCAqLworI2RlZmluZSBXTTg5OTVfRENTX1RSSUdfREFDX1dSXzBfU0hJRlQgICAgICAgICAgICAgICAwCS8qIERDU19UUklHX0RBQ19XUl8wICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVFJJR19EQUNfV1JfMF9XSURUSCAgICAgICAgICAgICAgIDEJLyogRENTX1RSSUdfREFDX1dSXzAgKi8KKworLyoKKyAqIFI4MiAoMHg1MikgLSBEQyBTZXJ2byAoMykKKyAqLworI2RlZmluZSBXTTg5OTVfRENTX1RJTUVSX1BFUklPRF8yM19NQVNLICAgICAgICAgMHgwRjAwCS8qIERDU19USU1FUl9QRVJJT0RfMjMgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19USU1FUl9QRVJJT0RfMjNfU0hJRlQgICAgICAgICAgICAgOAkvKiBEQ1NfVElNRVJfUEVSSU9EXzIzIC0gWzExOjhdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfVElNRVJfUEVSSU9EXzIzX1dJRFRIICAgICAgICAgICAgIDQJLyogRENTX1RJTUVSX1BFUklPRF8yMyAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RJTUVSX1BFUklPRF8wMV9NQVNLICAgICAgICAgMHgwMDBGCS8qIERDU19USU1FUl9QRVJJT0RfMDEgLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RJTUVSX1BFUklPRF8wMV9TSElGVCAgICAgICAgICAgICAwCS8qIERDU19USU1FUl9QRVJJT0RfMDEgLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfRENTX1RJTUVSX1BFUklPRF8wMV9XSURUSCAgICAgICAgICAgICA0CS8qIERDU19USU1FUl9QRVJJT0RfMDEgLSBbMzowXSAqLworCisvKgorICogUjg0ICgweDU0KSAtIERDIFNlcnZvICg1KQorICovCisjZGVmaW5lIFdNODk5NV9EQ1NfU0VSSUVTX05PXzIzX01BU0sgICAgICAgICAgICAweDdGMDAJLyogRENTX1NFUklFU19OT18yMyAtIFsxNDo4XSAqLworI2RlZmluZSBXTTg5OTVfRENTX1NFUklFU19OT18yM19TSElGVCAgICAgICAgICAgICAgICA4CS8qIERDU19TRVJJRVNfTk9fMjMgLSBbMTQ6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19TRVJJRVNfTk9fMjNfV0lEVEggICAgICAgICAgICAgICAgNwkvKiBEQ1NfU0VSSUVTX05PXzIzIC0gWzE0OjhdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfU0VSSUVTX05PXzAxX01BU0sgICAgICAgICAgICAweDAwN0YJLyogRENTX1NFUklFU19OT18wMSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfU0VSSUVTX05PXzAxX1NISUZUICAgICAgICAgICAgICAgIDAJLyogRENTX1NFUklFU19OT18wMSAtIFs2OjBdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfU0VSSUVTX05PXzAxX1dJRFRIICAgICAgICAgICAgICAgIDcJLyogRENTX1NFUklFU19OT18wMSAtIFs2OjBdICovCisKKy8qCisgKiBSODUgKDB4NTUpIC0gREMgU2Vydm8gKDYpCisgKi8KKyNkZWZpbmUgV004OTk1X0RDU19EQUNfV1JfVkFMXzNfTUFTSyAgICAgICAgICAgIDB4RkYwMAkvKiBEQ1NfREFDX1dSX1ZBTF8zIC0gWzE1OjhdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfREFDX1dSX1ZBTF8zX1NISUZUICAgICAgICAgICAgICAgIDgJLyogRENTX0RBQ19XUl9WQUxfMyAtIFsxNTo4XSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9WQUxfM19XSURUSCAgICAgICAgICAgICAgICA4CS8qIERDU19EQUNfV1JfVkFMXzMgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19EQUNfV1JfVkFMXzJfTUFTSyAgICAgICAgICAgIDB4MDBGRgkvKiBEQ1NfREFDX1dSX1ZBTF8yIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19EQUNfV1JfVkFMXzJfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBEQ1NfREFDX1dSX1ZBTF8yIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19EQUNfV1JfVkFMXzJfV0lEVEggICAgICAgICAgICAgICAgOAkvKiBEQ1NfREFDX1dSX1ZBTF8yIC0gWzc6MF0gKi8KKworLyoKKyAqIFI4NiAoMHg1NikgLSBEQyBTZXJ2byAoNykKKyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9WQUxfMV9NQVNLICAgICAgICAgICAgMHhGRjAwCS8qIERDU19EQUNfV1JfVkFMXzEgLSBbMTU6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19EQUNfV1JfVkFMXzFfU0hJRlQgICAgICAgICAgICAgICAgOAkvKiBEQ1NfREFDX1dSX1ZBTF8xIC0gWzE1OjhdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfREFDX1dSX1ZBTF8xX1dJRFRIICAgICAgICAgICAgICAgIDgJLyogRENTX0RBQ19XUl9WQUxfMSAtIFsxNTo4XSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9WQUxfMF9NQVNLICAgICAgICAgICAgMHgwMEZGCS8qIERDU19EQUNfV1JfVkFMXzAgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9WQUxfMF9TSElGVCAgICAgICAgICAgICAgICAwCS8qIERDU19EQUNfV1JfVkFMXzAgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9WQUxfMF9XSURUSCAgICAgICAgICAgICAgICA4CS8qIERDU19EQUNfV1JfVkFMXzAgLSBbNzowXSAqLworCisvKgorICogUjg3ICgweDU3KSAtIERDIFNlcnZvIFJlYWRiYWNrIDAKKyAqLworI2RlZmluZSBXTTg5OTVfRENTX0NBTF9DT01QTEVURV9NQVNLICAgICAgICAgICAgMHgwRjAwCS8qIERDU19DQUxfQ09NUExFVEUgLSBbMTE6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19DQUxfQ09NUExFVEVfU0hJRlQgICAgICAgICAgICAgICAgOAkvKiBEQ1NfQ0FMX0NPTVBMRVRFIC0gWzExOjhdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfQ0FMX0NPTVBMRVRFX1dJRFRIICAgICAgICAgICAgICAgIDQJLyogRENTX0NBTF9DT01QTEVURSAtIFsxMTo4XSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9DT01QTEVURV9NQVNLICAgICAgICAgMHgwMEYwCS8qIERDU19EQUNfV1JfQ09NUExFVEUgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9DT01QTEVURV9TSElGVCAgICAgICAgICAgICA0CS8qIERDU19EQUNfV1JfQ09NUExFVEUgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfRENTX0RBQ19XUl9DT01QTEVURV9XSURUSCAgICAgICAgICAgICA0CS8qIERDU19EQUNfV1JfQ09NUExFVEUgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfRENTX1NUQVJUVVBfQ09NUExFVEVfTUFTSyAgICAgICAgMHgwMDBGCS8qIERDU19TVEFSVFVQX0NPTVBMRVRFIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTk1X0RDU19TVEFSVFVQX0NPTVBMRVRFX1NISUZUICAgICAgICAgICAgMAkvKiBEQ1NfU1RBUlRVUF9DT01QTEVURSAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9EQ1NfU1RBUlRVUF9DT01QTEVURV9XSURUSCAgICAgICAgICAgIDQJLyogRENTX1NUQVJUVVBfQ09NUExFVEUgLSBbMzowXSAqLworCisvKgorICogUjk2ICgweDYwKSAtIEFuYWxvZ3VlIEhQICgxKQorICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFMX1JNVl9TSE9SVCAgICAgICAgICAgICAgICAweDAwODAJLyogSFBPVVQxTF9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfUk1WX1NIT1JUX01BU0sgICAgICAgICAgIDB4MDA4MAkvKiBIUE9VVDFMX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9STVZfU0hPUlRfU0hJRlQgICAgICAgICAgICAgICA3CS8qIEhQT1VUMUxfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFMX1JNVl9TSE9SVF9XSURUSCAgICAgICAgICAgICAgIDEJLyogSFBPVVQxTF9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfT1VUUCAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBIUE9VVDFMX09VVFAgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfT1VUUF9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBIUE9VVDFMX09VVFAgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfT1VUUF9TSElGVCAgICAgICAgICAgICAgICAgICAgNgkvKiBIUE9VVDFMX09VVFAgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfT1VUUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDFMX09VVFAgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfRExZICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBIUE9VVDFMX0RMWSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxTF9ETFlfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEhQT1VUMUxfRExZICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFMX0RMWV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUJLyogSFBPVVQxTF9ETFkgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMUxfRExZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDFMX0RMWSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxUl9STVZfU0hPUlQgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEhQT1VUMVJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX1JNVl9TSE9SVF9NQVNLICAgICAgICAgICAweDAwMDgJLyogSFBPVVQxUl9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMVJfUk1WX1NIT1JUX1NISUZUICAgICAgICAgICAgICAgMwkvKiBIUE9VVDFSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxUl9STVZfU0hPUlRfV0lEVEggICAgICAgICAgICAgICAxCS8qIEhQT1VUMVJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX09VVFAgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogSFBPVVQxUl9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX09VVFBfTUFTSyAgICAgICAgICAgICAgICAweDAwMDQJLyogSFBPVVQxUl9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX09VVFBfU0hJRlQgICAgICAgICAgICAgICAgICAgIDIJLyogSFBPVVQxUl9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX09VVFBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQxUl9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX0RMWSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogSFBPVVQxUl9ETFkgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMVJfRExZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBIUE9VVDFSX0RMWSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQxUl9ETFlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxCS8qIEhQT1VUMVJfRExZICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDFSX0RMWV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQxUl9ETFkgKi8KKworLyoKKyAqIFI5NyAoMHg2MSkgLSBBbmFsb2d1ZSBIUCAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyTF9STVZfU0hPUlQgICAgICAgICAgICAgICAgMHgwMDgwCS8qIEhQT1VUMkxfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX1JNVl9TSE9SVF9NQVNLICAgICAgICAgICAweDAwODAJLyogSFBPVVQyTF9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMkxfUk1WX1NIT1JUX1NISUZUICAgICAgICAgICAgICAgNwkvKiBIUE9VVDJMX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyTF9STVZfU0hPUlRfV0lEVEggICAgICAgICAgICAgICAxCS8qIEhQT1VUMkxfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX09VVFAgICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogSFBPVVQyTF9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX09VVFBfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAJLyogSFBPVVQyTF9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX09VVFBfU0hJRlQgICAgICAgICAgICAgICAgICAgIDYJLyogSFBPVVQyTF9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX09VVFBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQyTF9PVVRQICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX0RMWSAgICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogSFBPVVQyTF9ETFkgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMkxfRExZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBIUE9VVDJMX0RMWSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyTF9ETFlfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1CS8qIEhQT1VUMkxfRExZICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJMX0RMWV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSFBPVVQyTF9ETFkgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfUk1WX1NIT1JUICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBIUE9VVDJSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9STVZfU0hPUlRfTUFTSyAgICAgICAgICAgMHgwMDA4CS8qIEhQT1VUMlJfUk1WX1NIT1JUICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJSX1JNVl9TSE9SVF9TSElGVCAgICAgICAgICAgICAgIDMJLyogSFBPVVQyUl9STVZfU0hPUlQgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfUk1WX1NIT1JUX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBIUE9VVDJSX1JNVl9TSE9SVCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9PVVRQICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEhQT1VUMlJfT1VUUCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9PVVRQX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEhQT1VUMlJfT1VUUCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9PVVRQX1NISUZUICAgICAgICAgICAgICAgICAgICAyCS8qIEhQT1VUMlJfT1VUUCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9PVVRQX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEhQT1VUMlJfT1VUUCAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9ETFkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEhQT1VUMlJfRExZICovCisjZGVmaW5lIFdNODk5NV9IUE9VVDJSX0RMWV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIJLyogSFBPVVQyUl9ETFkgKi8KKyNkZWZpbmUgV004OTk1X0hQT1VUMlJfRExZX1NISUZUICAgICAgICAgICAgICAgICAgICAgMQkvKiBIUE9VVDJSX0RMWSAqLworI2RlZmluZSBXTTg5OTVfSFBPVVQyUl9ETFlfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEhQT1VUMlJfRExZICovCisKKy8qCisgKiBSMjU2ICgweDEwMCkgLSBDaGlwIFJldmlzaW9uCisgKi8KKyNkZWZpbmUgV004OTk1X0NISVBfUkVWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwRgkvKiBDSElQX1JFViAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9DSElQX1JFVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogQ0hJUF9SRVYgLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfQ0hJUF9SRVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0CS8qIENISVBfUkVWIC0gWzM6MF0gKi8KKworLyoKKyAqIFIyNTcgKDB4MTAxKSAtIENvbnRyb2wgSW50ZXJmYWNlICgxKQorICovCisjZGVmaW5lIFdNODk5NV9SRUdfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogUkVHX1NZTkMgKi8KKyNkZWZpbmUgV004OTk1X1JFR19TWU5DX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBSRUdfU1lOQyAqLworI2RlZmluZSBXTTg5OTVfUkVHX1NZTkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1CS8qIFJFR19TWU5DICovCisjZGVmaW5lIFdNODk5NV9SRUdfU1lOQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogUkVHX1NZTkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSV9DT05UUkQgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBTUElfQ09OVFJEICovCisjZGVmaW5lIFdNODk5NV9TUElfQ09OVFJEX01BU0sgICAgICAgICAgICAgICAgICAweDAwNDAJLyogU1BJX0NPTlRSRCAqLworI2RlZmluZSBXTTg5OTVfU1BJX0NPTlRSRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA2CS8qIFNQSV9DT05UUkQgKi8KKyNkZWZpbmUgV004OTk1X1NQSV9DT05UUkRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBTUElfQ09OVFJEICovCisjZGVmaW5lIFdNODk5NV9TUElfNFdJUkUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogU1BJXzRXSVJFICovCisjZGVmaW5lIFdNODk5NV9TUElfNFdJUkVfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogU1BJXzRXSVJFICovCisjZGVmaW5lIFdNODk5NV9TUElfNFdJUkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDUJLyogU1BJXzRXSVJFICovCisjZGVmaW5lIFdNODk5NV9TUElfNFdJUkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1BJXzRXSVJFICovCisjZGVmaW5lIFdNODk5NV9TUElfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogU1BJX0NGRyAqLworI2RlZmluZSBXTTg5OTVfU1BJX0NGR19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFNQSV9DRkcgKi8KKyNkZWZpbmUgV004OTk1X1NQSV9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBTUElfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9TUElfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1BJX0NGRyAqLworI2RlZmluZSBXTTg5OTVfQVVUT19JTkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEFVVE9fSU5DICovCisjZGVmaW5lIFdNODk5NV9BVVRPX0lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogQVVUT19JTkMgKi8KKyNkZWZpbmUgV004OTk1X0FVVE9fSU5DX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBBVVRPX0lOQyAqLworI2RlZmluZSBXTTg5OTVfQVVUT19JTkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEFVVE9fSU5DICovCisKKy8qCisgKiBSMjU4ICgweDEwMikgLSBDb250cm9sIEludGVyZmFjZSAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfQ1RSTF9JRl9TUkMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIENUUkxfSUZfU1JDICovCisjZGVmaW5lIFdNODk5NV9DVFJMX0lGX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDAwMDEJLyogQ1RSTF9JRl9TUkMgKi8KKyNkZWZpbmUgV004OTk1X0NUUkxfSUZfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAkvKiBDVFJMX0lGX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQ1RSTF9JRl9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIENUUkxfSUZfU1JDICovCisKKy8qCisgKiBSMjcyICgweDExMCkgLSBXcml0ZSBTZXF1ZW5jZXIgQ3RybCAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIFdTRVFfRU5BICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogV1NFUV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNQkvKiBXU0VRX0VOQSAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIFdTRVFfRU5BICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogV1NFUV9BQk9SVCAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9BQk9SVF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIFdTRVFfQUJPUlQgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfQUJPUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBXU0VRX0FCT1JUICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0FCT1JUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogV1NFUV9BQk9SVCAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIFdTRVFfU1RBUlQgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBXU0VRX1NUQVJUICovCisjZGVmaW5lIFdNODk5NV9XU0VRX1NUQVJUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDgJLyogV1NFUV9TVEFSVCAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9TVEFSVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIFdTRVFfU1RBUlQgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfU1RBUlRfSU5ERVhfTUFTSyAgICAgICAgICAgIDB4MDA3RgkvKiBXU0VRX1NUQVJUX0lOREVYIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfU1RBUlRfSU5ERVhfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBXU0VRX1NUQVJUX0lOREVYIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfU1RBUlRfSU5ERVhfV0lEVEggICAgICAgICAgICAgICAgNwkvKiBXU0VRX1NUQVJUX0lOREVYIC0gWzY6MF0gKi8KKworLyoKKyAqIFIyNzMgKDB4MTExKSAtIFdyaXRlIFNlcXVlbmNlciBDdHJsICgyKQorICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogV1NFUV9CVVNZICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0JVU1lfTUFTSyAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogV1NFUV9CVVNZICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0JVU1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDgJLyogV1NFUV9CVVNZICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0JVU1lfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogV1NFUV9CVVNZICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0NVUlJFTlRfSU5ERVhfTUFTSyAgICAgICAgICAweDAwN0YJLyogV1NFUV9DVVJSRU5UX0lOREVYIC0gWzY6MF0gKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfQ1VSUkVOVF9JTkRFWF9TSElGVCAgICAgICAgICAgICAgMAkvKiBXU0VRX0NVUlJFTlRfSU5ERVggLSBbNjowXSAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9DVVJSRU5UX0lOREVYX1dJRFRIICAgICAgICAgICAgICA3CS8qIFdTRVFfQ1VSUkVOVF9JTkRFWCAtIFs2OjBdICovCisKKy8qCisgKiBSNTEyICgweDIwMCkgLSBBSUYxIENsb2NraW5nICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDAwMTgJLyogQUlGMUNMS19TUkMgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzCS8qIEFJRjFDTEtfU1JDIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMgkvKiBBSUYxQ0xLX1NSQyAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMUNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYxQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjFDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfRElWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYxQ0xLX0RJViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFDTEtfRElWICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUNMS19ESVYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQ0xLX0RJViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMUNMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFDTEtfRU5BICovCisKKy8qCisgKiBSNTEzICgweDIwMSkgLSBBSUYxIENsb2NraW5nICgyKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDX0RJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMzgJLyogQUlGMURBQ19ESVYgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19ESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzCS8qIEFJRjFEQUNfRElWIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMwkvKiBBSUYxREFDX0RJViAtIFs1OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX0RJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDcJLyogQUlGMUFEQ19ESVYgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19ESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFBRENfRElWIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMwkvKiBBSUYxQURDX0RJViAtIFsyOjBdICovCisKKy8qCisgKiBSNTE2ICgweDIwNCkgLSBBSUYyIENsb2NraW5nICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDAwMTgJLyogQUlGMkNMS19TUkMgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzCS8qIEFJRjJDTEtfU1JDIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMgkvKiBBSUYyQ0xLX1NSQyAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfRElWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYyQ0xLX0RJViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19ESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjJDTEtfRElWICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkNMS19ESVYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyQ0xLX0RJViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMkNMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYyQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJDTEtfRU5BICovCisKKy8qCisgKiBSNTE3ICgweDIwNSkgLSBBSUYyIENsb2NraW5nICgyKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0RJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMzgJLyogQUlGMkRBQ19ESVYgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19ESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAzCS8qIEFJRjJEQUNfRElWIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMwkvKiBBSUYyREFDX0RJViAtIFs1OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0RJVl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDcJLyogQUlGMkFEQ19ESVYgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19ESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjJBRENfRElWIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMwkvKiBBSUYyQURDX0RJViAtIFsyOjBdICovCisKKy8qCisgKiBSNTIwICgweDIwOCkgLSBDbG9ja2luZyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfTEZDTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIExGQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfTEZDTEtfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIExGQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfTEZDTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA1CS8qIExGQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfTEZDTEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIExGQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfVE9DTEtfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfVE9DTEtfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfVE9DTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0CS8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfVE9DTEtfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIFRPQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURTUENMS19FTkEgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjFEU1BDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFNQQ0xLX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwMDgJLyogQUlGMURTUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEU1BDTEtfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMwkvKiBBSUYxRFNQQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURTUENMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEU1BDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFNQQ0xLX0VOQSAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMkRTUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEU1BDTEtfRU5BX01BU0sgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyRFNQQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRTUENMS19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEU1BDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFNQQ0xLX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRTUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NZU0RTUENMS19FTkEgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBTWVNEU1BDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9TWVNEU1BDTEtfRU5BX01BU0sgICAgICAgICAgICAgICAweDAwMDIJLyogU1lTRFNQQ0xLX0VOQSAqLworI2RlZmluZSBXTTg5OTVfU1lTRFNQQ0xLX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAxCS8qIFNZU0RTUENMS19FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NZU0RTUENMS19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBTWVNEU1BDTEtfRU5BICovCisjZGVmaW5lIFdNODk5NV9TWVNDTEtfU1JDICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogU1lTQ0xLX1NSQyAqLworI2RlZmluZSBXTTg5OTVfU1lTQ0xLX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIFNZU0NMS19TUkMgKi8KKyNkZWZpbmUgV004OTk1X1NZU0NMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMAkvKiBTWVNDTEtfU1JDICovCisjZGVmaW5lIFdNODk5NV9TWVNDTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1lTQ0xLX1NSQyAqLworCisvKgorICogUjUyMSAoMHgyMDkpIC0gQ2xvY2tpbmcgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X1RPQ0xLX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDcwMAkvKiBUT0NMS19ESVYgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004OTk1X1RPQ0xLX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBUT0NMS19ESVYgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004OTk1X1RPQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMwkvKiBUT0NMS19ESVYgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004OTk1X0RCQ0xLX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDBGMAkvKiBEQkNMS19ESVYgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfREJDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0CS8qIERCQ0xLX0RJViAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9EQkNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDQJLyogREJDTEtfRElWIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004OTk1X09QQ0xLX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwNwkvKiBPUENMS19ESVYgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfT1BDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCS8qIE9QQ0xLX0RJViAtIFsyOjBdICovCisjZGVmaW5lIFdNODk5NV9PUENMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDMJLyogT1BDTEtfRElWIC0gWzI6MF0gKi8KKworLyoKKyAqIFI1MjggKDB4MjEwKSAtIEFJRjEgUmF0ZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxX1NSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwRjAJLyogQUlGMV9TUiAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9BSUYxX1NSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMV9TUiAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9BSUYxX1NSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMV9TUiAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9BSUYxQ0xLX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDAwMEYJLyogQUlGMUNMS19SQVRFIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFDTEtfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxQ0xLX1JBVEUgLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUNMS19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjFDTEtfUkFURSAtIFszOjBdICovCisKKy8qCisgKiBSNTI5ICgweDIxMSkgLSBBSUYyIFJhdGUKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9TUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMEYwCS8qIEFJRjJfU1IgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9TUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjJfU1IgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9TUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjJfU1IgLSBbNzo0XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkNMS19SQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwMDBGCS8qIEFJRjJDTEtfUkFURSAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQ0xLX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAJLyogQUlGMkNMS19SQVRFIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJDTEtfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYyQ0xLX1JBVEUgLSBbMzowXSAqLworCisvKgorICogUjUzMCAoMHgyMTIpIC0gUmF0ZSBTdGF0dXMKKyAqLworI2RlZmluZSBXTTg5OTVfU1JfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDBGCS8qIFNSX0VSUk9SIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NSX0VSUk9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBTUl9FUlJPUiAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9TUl9FUlJPUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDQJLyogU1JfRVJST1IgLSBbMzowXSAqLworCisvKgorICogUjU0NCAoMHgyMjApIC0gRkxMMSBDb250cm9sICgxKQorICovCisjZGVmaW5lIFdNODk5NV9GTEwxX09TQ19FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogRkxMMV9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwxX09TQ19FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIJLyogRkxMMV9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwxX09TQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMV9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwxX09TQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMV9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogRkxMMV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBGTEwxX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEZMTDFfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMV9FTkEgKi8KKworLyoKKyAqIFI1NDUgKDB4MjIxKSAtIEZMTDEgQ29udHJvbCAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgzRjAwCS8qIEZMTDFfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogRkxMMV9PVVRESVYgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfT1VURElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNgkvKiBGTEwxX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9DVFJMX1JBVEVfTUFTSyAgICAgICAgICAgICAgMHgwMDcwCS8qIEZMTDFfQ1RSTF9SQVRFIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfQ1RSTF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgNAkvKiBGTEwxX0NUUkxfUkFURSAtIFs2OjRdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0NUUkxfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgIDMJLyogRkxMMV9DVFJMX1JBVEUgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3CS8qIEZMTDFfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAkvKiBGTEwxX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0ZSQVRJT19XSURUSCAgICAgICAgICAgICAgICAgICAgIDMJLyogRkxMMV9GUkFUSU8gLSBbMjowXSAqLworCisvKgorICogUjU0NiAoMHgyMjIpIC0gRkxMMSBDb250cm9sICgzKQorICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEZGRkYJLyogRkxMMV9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogRkxMMV9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMTYJLyogRkxMMV9LIC0gWzE1OjBdICovCisKKy8qCisgKiBSNTQ3ICgweDIyMykgLSBGTEwxIENvbnRyb2wgKDQpCisgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4N0ZFMAkvKiBGTEwxX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBGTEwxX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxMAkvKiBGTEwxX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTE9PUF9HQUlOX01BU0sgICAgICAgICAgICAgIDB4MDAwRgkvKiBGTEwxX0xPT1BfR0FJTiAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0xPT1BfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgIDAJLyogRkxMMV9MT09QX0dBSU4gLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9MT09QX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICA0CS8qIEZMTDFfTE9PUF9HQUlOIC0gWzM6MF0gKi8KKworLyoKKyAqIFI1NDggKDB4MjI0KSAtIEZMTDEgQ29udHJvbCAoNSkKKyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkNfTkNPX1ZBTF9NQVNLICAgICAgICAgICAgMHgxRjgwCS8qIEZMTDFfRlJDX05DT19WQUwgLSBbMTI6N10gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfRlJDX05DT19WQUxfU0hJRlQgICAgICAgICAgICAgICAgNwkvKiBGTEwxX0ZSQ19OQ09fVkFMIC0gWzEyOjddICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0ZSQ19OQ09fVkFMX1dJRFRIICAgICAgICAgICAgICAgIDYJLyogRkxMMV9GUkNfTkNPX1ZBTCAtIFsxMjo3XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkNfTkNPICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEZMTDFfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkNfTkNPX01BU0sgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEZMTDFfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkNfTkNPX1NISUZUICAgICAgICAgICAgICAgICAgICA2CS8qIEZMTDFfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9GUkNfTkNPX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEZMTDFfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9SRUZDTEtfRElWX01BU0sgICAgICAgICAgICAgMHgwMDE4CS8qIEZMTDFfUkVGQ0xLX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX1JFRkNMS19ESVZfU0hJRlQgICAgICAgICAgICAgICAgIDMJLyogRkxMMV9SRUZDTEtfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfUkVGQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBGTEwxX1JFRkNMS19ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9SRUZDTEtfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDAzCS8qIEZMTDFfUkVGQ0xLX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwxX1JFRkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogRkxMMV9SRUZDTEtfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfUkVGQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBGTEwxX1JFRkNMS19TUkMgLSBbMTowXSAqLworCisvKgorICogUjU3NiAoMHgyNDApIC0gRkxMMiBDb250cm9sICgxKQorICovCisjZGVmaW5lIFdNODk5NV9GTEwyX09TQ19FTkEgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogRkxMMl9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwyX09TQ19FTkFfTUFTSyAgICAgICAgICAgICAgICAweDAwMDIJLyogRkxMMl9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwyX09TQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMl9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwyX09TQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMl9PU0NfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogRkxMMl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBGTEwyX0VOQSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEZMTDJfRU5BICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogRkxMMl9FTkEgKi8KKworLyoKKyAqIFI1NzcgKDB4MjQxKSAtIEZMTDIgQ29udHJvbCAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgMHgzRjAwCS8qIEZMTDJfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogRkxMMl9PVVRESVYgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfT1VURElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNgkvKiBGTEwyX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9DVFJMX1JBVEVfTUFTSyAgICAgICAgICAgICAgMHgwMDcwCS8qIEZMTDJfQ1RSTF9SQVRFIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfQ1RSTF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgNAkvKiBGTEwyX0NUUkxfUkFURSAtIFs2OjRdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0NUUkxfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgIDMJLyogRkxMMl9DVFJMX1JBVEUgLSBbNjo0XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3CS8qIEZMTDJfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgMAkvKiBGTEwyX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0ZSQVRJT19XSURUSCAgICAgICAgICAgICAgICAgICAgIDMJLyogRkxMMl9GUkFUSU8gLSBbMjowXSAqLworCisvKgorICogUjU3OCAoMHgyNDIpIC0gRkxMMiBDb250cm9sICgzKQorICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEZGRkYJLyogRkxMMl9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogRkxMMl9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMTYJLyogRkxMMl9LIC0gWzE1OjBdICovCisKKy8qCisgKiBSNTc5ICgweDI0MykgLSBGTEwyIENvbnRyb2wgKDQpCisgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4N0ZFMAkvKiBGTEwyX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBGTEwyX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxMAkvKiBGTEwyX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTE9PUF9HQUlOX01BU0sgICAgICAgICAgICAgIDB4MDAwRgkvKiBGTEwyX0xPT1BfR0FJTiAtIFszOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0xPT1BfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgIDAJLyogRkxMMl9MT09QX0dBSU4gLSBbMzowXSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9MT09QX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICA0CS8qIEZMTDJfTE9PUF9HQUlOIC0gWzM6MF0gKi8KKworLyoKKyAqIFI1ODAgKDB4MjQ0KSAtIEZMTDIgQ29udHJvbCAoNSkKKyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkNfTkNPX1ZBTF9NQVNLICAgICAgICAgICAgMHgxRjgwCS8qIEZMTDJfRlJDX05DT19WQUwgLSBbMTI6N10gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfRlJDX05DT19WQUxfU0hJRlQgICAgICAgICAgICAgICAgNwkvKiBGTEwyX0ZSQ19OQ09fVkFMIC0gWzEyOjddICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0ZSQ19OQ09fVkFMX1dJRFRIICAgICAgICAgICAgICAgIDYJLyogRkxMMl9GUkNfTkNPX1ZBTCAtIFsxMjo3XSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkNfTkNPICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEZMTDJfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkNfTkNPX01BU0sgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEZMTDJfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkNfTkNPX1NISUZUICAgICAgICAgICAgICAgICAgICA2CS8qIEZMTDJfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9GUkNfTkNPX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEZMTDJfRlJDX05DTyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9SRUZDTEtfRElWX01BU0sgICAgICAgICAgICAgMHgwMDE4CS8qIEZMTDJfUkVGQ0xLX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX1JFRkNMS19ESVZfU0hJRlQgICAgICAgICAgICAgICAgIDMJLyogRkxMMl9SRUZDTEtfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfUkVGQ0xLX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBGTEwyX1JFRkNMS19ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9SRUZDTEtfU1JDX01BU0sgICAgICAgICAgICAgMHgwMDAzCS8qIEZMTDJfUkVGQ0xLX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9GTEwyX1JFRkNMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogRkxMMl9SRUZDTEtfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfUkVGQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBGTEwyX1JFRkNMS19TUkMgLSBbMTowXSAqLworCisvKgorICogUjc2OCAoMHgzMDApIC0gQUlGMSBDb250cm9sICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9TUkMgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMUFEQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9TUkNfTUFTSyAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMUFEQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTUJLyogQUlGMUFEQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDUl9TUkMgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMUFEQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDUl9TUkNfTUFTSyAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMUFEQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDUl9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTQJLyogQUlGMUFEQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDUl9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX1RETSAgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogQUlGMUFEQ19URE0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfVERNX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYxQURDX1RETSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19URE1fU0hJRlQgICAgICAgICAgICAgICAgICAgIDEzCS8qIEFJRjFBRENfVERNICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX1RETV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQ19URE0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfQkNMS19JTlYgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0JDTEtfSU5WX01BU0sgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMV9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9CQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfQkNMS19JTlZfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xSQ0xLX0lOViAgICAgICAgICAgICAgICAgICAweDAwODAJLyogQUlGMV9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfTFJDTEtfSU5WX01BU0sgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYxX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9MUkNMS19JTlZfU0hJRlQgICAgICAgICAgICAgICAgICA3CS8qIEFJRjFfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xSQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogQUlGMV9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfV0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA2MAkvKiBBSUYxX1dMIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfV0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBBSUYxX1dMIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfV0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBBSUYxX1dMIC0gWzY6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfRk1UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxOAkvKiBBSUYxX0ZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0ZNVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMJLyogQUlGMV9GTVQgLSBbNDozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9GTVRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjFfRk1UIC0gWzQ6M10gKi8KKworLyoKKyAqIFI3NjkgKDB4MzAxKSAtIEFJRjEgQ29udHJvbCAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjFEQUNMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ0xfU1JDX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjFEQUNMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ0xfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgIDE1CS8qIEFJRjFEQUNMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ0xfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUNMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfU1JDICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEFJRjFEQUNSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfU1JDX01BU0sgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEFJRjFEQUNSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgIDE0CS8qIEFJRjFEQUNSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUNSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19CT09TVF9NQVNLICAgICAgICAgICAgICAgMHgwQzAwCS8qIEFJRjFEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDX0JPT1NUX1NISUZUICAgICAgICAgICAgICAgICAgMTAJLyogQUlGMURBQ19CT09TVCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfQk9PU1RfV0lEVEggICAgICAgICAgICAgICAgICAgMgkvKiBBSUYxREFDX0JPT1NUIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjFEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjFEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QX1NISUZUICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjFEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUNfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjFEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfQ09NUE1PREVfTUFTSyAgICAgICAgICAgIDB4MDAwOAkvKiBBSUYxREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDX0NPTVBNT0RFX1NISUZUICAgICAgICAgICAgICAgIDMJLyogQUlGMURBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYxQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYxQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAgICAgMgkvKiBBSUYxQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDX0NPTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUE1PREUgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYxQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX0NPTVBNT0RFX01BU0sgICAgICAgICAgICAweDAwMDIJLyogQUlGMUFEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19DT01QTU9ERV9TSElGVCAgICAgICAgICAgICAgICAxCS8qIEFJRjFBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfQ09NUE1PREVfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMV9MT09QQkFDSyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9MT09QQkFDS19NQVNLICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFfTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfTE9PUEJBQ0tfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxX0xPT1BCQUNLICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xPT1BCQUNLX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMV9MT09QQkFDSyAqLworCisvKgorICogUjc3MCAoMHgzMDIpIC0gQUlGMSBNYXN0ZXIvU2xhdmUKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9UUkkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjFfVFJJICovCisjZGVmaW5lIFdNODk5NV9BSUYxX1RSSV9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMV9UUkkgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfVFJJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNQkvKiBBSUYxX1RSSSAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9UUklfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFfVFJJICovCisjZGVmaW5lIFdNODk5NV9BSUYxX01TVFIgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMV9NU1RSICovCisjZGVmaW5lIFdNODk5NV9BSUYxX01TVFJfTUFTSyAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMV9NU1RSICovCisjZGVmaW5lIFdNODk5NV9BSUYxX01TVFJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTQJLyogQUlGMV9NU1RSICovCisjZGVmaW5lIFdNODk5NV9BSUYxX01TVFJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMV9NU1RSICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0NMS19GUkMgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogQUlGMV9DTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0NMS19GUkNfTUFTSyAgICAgICAgICAgICAgICAweDIwMDAJLyogQUlGMV9DTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0NMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTMJLyogQUlGMV9DTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0NMS19GUkNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMV9DTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xSQ0xLX0ZSQyAgICAgICAgICAgICAgICAgICAweDEwMDAJLyogQUlGMV9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFfTFJDTEtfRlJDX01BU0sgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYxX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMV9MUkNMS19GUkNfU0hJRlQgICAgICAgICAgICAgICAgIDEyCS8qIEFJRjFfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0xSQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogQUlGMV9MUkNMS19GUkMgKi8KKworLyoKKyAqIFI3NzEgKDB4MzAzKSAtIEFJRjEgQkNMSworICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0JDTEtfRElWX01BU0sgICAgICAgICAgICAgICAweDAwRjAJLyogQUlGMV9CQ0xLX0RJViAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0JDTEtfRElWX1NISUZUICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMV9CQ0xLX0RJViAtIFs3OjRdICovCisjZGVmaW5lIFdNODk5NV9BSUYxX0JDTEtfRElWX1dJRFRIICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMV9CQ0xLX0RJViAtIFs3OjRdICovCisKKy8qCisgKiBSNzcyICgweDMwNCkgLSBBSUYxQURDIExSQ0xLCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfTFJDTEtfRElSICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxQURDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19MUkNMS19ESVJfTUFTSyAgICAgICAgICAgMHgwODAwCS8qIEFJRjFBRENfTFJDTEtfRElSICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDX0xSQ0xLX0RJUl9TSElGVCAgICAgICAgICAgICAgMTEJLyogQUlGMUFEQ19MUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfTFJDTEtfRElSX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19SQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwN0ZGCS8qIEFJRjFBRENfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFBRENfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgIDExCS8qIEFJRjFBRENfUkFURSAtIFsxMDowXSAqLworCisvKgorICogUjc3MyAoMHgzMDUpIC0gQUlGMURBQyBMUkNMSworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDX0xSQ0xLX0RJUiAgICAgICAgICAgICAgICAweDA4MDAJLyogQUlGMURBQ19MUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfTFJDTEtfRElSX01BU0sgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxREFDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ19MUkNMS19ESVJfU0hJRlQgICAgICAgICAgICAgIDExCS8qIEFJRjFEQUNfTFJDTEtfRElSICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDX0xSQ0xLX0RJUl9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMURBQ19MUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfUkFURV9NQVNLICAgICAgICAgICAgICAgIDB4MDdGRgkvKiBBSUYxREFDX1JBVEUgLSBbMTA6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDX1JBVEUgLSBbMTA6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAxMQkvKiBBSUYxREFDX1JBVEUgLSBbMTA6MF0gKi8KKworLyoKKyAqIFI3NzQgKDB4MzA2KSAtIEFJRjFEQUMgRGF0YQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDTF9EQVRfSU5WICAgICAgICAgICAgICAgICAweDAwMDIJLyogQUlGMURBQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ0xfREFUX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFEQUNMX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNMX0RBVF9JTlZfU0hJRlQgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDTF9EQVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfREFUX0lOViAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUNSX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUNSX0RBVF9JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDUl9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDUl9EQVRfSU5WX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQ1JfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQ1JfREFUX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUNSX0RBVF9JTlYgKi8KKworLyoKKyAqIFI3NzUgKDB4MzA3KSAtIEFJRjFBREMgRGF0YQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9EQVRfSU5WICAgICAgICAgICAgICAgICAweDAwMDIJLyogQUlGMUFEQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ0xfREFUX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFBRENMX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENMX0RBVF9JTlZfU0hJRlQgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDTF9EQVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ1JfREFUX0lOViAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFBRENSX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENSX0RBVF9JTlZfTUFTSyAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxQURDUl9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDUl9EQVRfSU5WX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMUFEQ1JfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ1JfREFUX0lOVl9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjFBRENSX0RBVF9JTlYgKi8KKworLyoKKyAqIFI3ODQgKDB4MzEwKSAtIEFJRjIgQ29udHJvbCAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfU1JDICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjJBRENMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfU1JDX01BU0sgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjJBRENMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgIDE1CS8qIEFJRjJBRENMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENMX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfU1JDICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEFJRjJBRENSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfU1JDX01BU0sgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEFJRjJBRENSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgIDE0CS8qIEFJRjJBRENSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENSX1NSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19URE0gICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEFJRjJBRENfVERNICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1RETV9NQVNLICAgICAgICAgICAgICAgICAweDIwMDAJLyogQUlGMkFEQ19URE0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfVERNX1NISUZUICAgICAgICAgICAgICAgICAgICAxMwkvKiBBSUYyQURDX1RETSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19URE1fV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfVERNICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1RETV9DSEFOICAgICAgICAgICAgICAgICAweDEwMDAJLyogQUlGMkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19URE1fQ0hBTl9NQVNLICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjJBRENfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfVERNX0NIQU5fU0hJRlQgICAgICAgICAgICAgICAxMgkvKiBBSUYyQURDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1RETV9DSEFOX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9CQ0xLX0lOViAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQkNMS19JTlZfTUFTSyAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYyX0JDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyX0JDTEtfSU5WX1NISUZUICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMl9CQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9CQ0xLX0lOVl9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJfQkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTFJDTEtfSU5WICAgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYyX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9MUkNMS19JTlZfTUFTSyAgICAgICAgICAgICAgMHgwMDgwCS8qIEFJRjJfTFJDTEtfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyX0xSQ0xLX0lOVl9TSElGVCAgICAgICAgICAgICAgICAgIDcJLyogQUlGMl9MUkNMS19JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTFJDTEtfSU5WX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyX0xSQ0xLX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9XTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDYwCS8qIEFJRjJfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9XTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA1CS8qIEFJRjJfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9XTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJfV0wgLSBbNjo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9GTVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDE4CS8qIEFJRjJfRk1UIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfRk1UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMwkvKiBBSUYyX0ZNVCAtIFs0OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYyX0ZNVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDIJLyogQUlGMl9GTVQgLSBbNDozXSAqLworCisvKgorICogUjc4NSAoMHgzMTEpIC0gQUlGMiBDb250cm9sICgyKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9TUkMgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMkRBQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9TUkNfTUFTSyAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMkRBQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTUJLyogQUlGMkRBQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ0xfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9TUkMgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMkRBQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9TUkNfTUFTSyAgICAgICAgICAgICAgICAweDQwMDAJLyogQUlGMkRBQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMTQJLyogQUlGMkRBQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ1JfU1JDICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1RETSAgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogQUlGMkRBQ19URE0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVERNX01BU0sgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYyREFDX1RETSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19URE1fU0hJRlQgICAgICAgICAgICAgICAgICAgIDEzCS8qIEFJRjJEQUNfVERNICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1RETV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19URE0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVERNX0NIQU4gICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYyREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1RETV9DSEFOX01BU0sgICAgICAgICAgICAweDEwMDAJLyogQUlGMkRBQ19URE1fQ0hBTiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19URE1fQ0hBTl9TSElGVCAgICAgICAgICAgICAgIDEyCS8qIEFJRjJEQUNfVERNX0NIQU4gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVERNX0NIQU5fV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX1RETV9DSEFOICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0JPT1NUX01BU0sgICAgICAgICAgICAgICAweDBDMDAJLyogQUlGMkRBQ19CT09TVCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfQk9PU1RfU0hJRlQgICAgICAgICAgICAgICAgICAxMAkvKiBBSUYyREFDX0JPT1NUIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19CT09TVF9XSURUSCAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEQUNfQk9PU1QgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogQUlGMkRBQ19DT01QICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVBfTUFTSyAgICAgICAgICAgICAgICAweDAwMTAJLyogQUlGMkRBQ19DT01QICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMkRBQ19DT01QICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19DT01QICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVBNT0RFICAgICAgICAgICAgICAgICAweDAwMDgJLyogQUlGMkRBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19DT01QTU9ERV9NQVNLICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjJEQUNfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfQ09NUE1PREVfU0hJRlQgICAgICAgICAgICAgICAgMwkvKiBBSUYyREFDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0NPTVBNT0RFX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJBRENfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJBRENfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QX1NISUZUICAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJBRENfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfQ09NUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QTU9ERSAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjJBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfQ09NUE1PREVfTUFTSyAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYyQURDX0NPTVBNT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0NPTVBNT0RFX1NISUZUICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ19DT01QTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19DT01QTU9ERV9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfQ09NUE1PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTE9PUEJBQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYyX0xPT1BCQUNLICovCisjZGVmaW5lIFdNODk5NV9BSUYyX0xPT1BCQUNLX01BU0sgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMl9MT09QQkFDSyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9MT09QQkFDS19TSElGVCAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjJfTE9PUEJBQ0sgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTE9PUEJBQ0tfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyX0xPT1BCQUNLICovCisKKy8qCisgKiBSNzg2ICgweDMxMikgLSBBSUYyIE1hc3Rlci9TbGF2ZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyX1RSSSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMl9UUkkgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfVFJJX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBBSUYyX1RSSSAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9UUklfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1CS8qIEFJRjJfVFJJICovCisjZGVmaW5lIFdNODk5NV9BSUYyX1RSSV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMl9UUkkgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTVNUUiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBBSUYyX01TVFIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTVNUUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBBSUYyX01TVFIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTVNUUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBBSUYyX01TVFIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTVNUUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyX01TVFIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQ0xLX0ZSQyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYyX0NMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQ0xLX0ZSQ19NQVNLICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBBSUYyX0NMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAgICAxMwkvKiBBSUYyX0NMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQ0xLX0ZSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyX0NMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTFJDTEtfRlJDICAgICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYyX0xSQ0xLX0ZSQyAqLworI2RlZmluZSBXTTg5OTVfQUlGMl9MUkNMS19GUkNfTUFTSyAgICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjJfTFJDTEtfRlJDICovCisjZGVmaW5lIFdNODk5NV9BSUYyX0xSQ0xLX0ZSQ19TSElGVCAgICAgICAgICAgICAgICAgMTIJLyogQUlGMl9MUkNMS19GUkMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfTFJDTEtfRlJDX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyX0xSQ0xLX0ZSQyAqLworCisvKgorICogUjc4NyAoMHgzMTMpIC0gQUlGMiBCQ0xLCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQkNMS19ESVZfTUFTSyAgICAgICAgICAgICAgIDB4MDBGMAkvKiBBSUYyX0JDTEtfRElWIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQkNMS19ESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYyX0JDTEtfRElWIC0gWzc6NF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJfQkNMS19ESVZfV0lEVEggICAgICAgICAgICAgICAgICAgNAkvKiBBSUYyX0JDTEtfRElWIC0gWzc6NF0gKi8KKworLyoKKyAqIFI3ODggKDB4MzE0KSAtIEFJRjJBREMgTFJDTEsKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19MUkNMS19ESVIgICAgICAgICAgICAgICAgMHgwODAwCS8qIEFJRjJBRENfTFJDTEtfRElSICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0xSQ0xLX0RJUl9NQVNLICAgICAgICAgICAweDA4MDAJLyogQUlGMkFEQ19MUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfTFJDTEtfRElSX1NISUZUICAgICAgICAgICAgICAxMQkvKiBBSUYyQURDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19MUkNMS19ESVJfV0lEVEggICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfTFJDTEtfRElSICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAweDA3RkYJLyogQUlGMkFEQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAJLyogQUlGMkFEQ19SQVRFIC0gWzEwOjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgMTEJLyogQUlGMkFEQ19SQVRFIC0gWzEwOjBdICovCisKKy8qCisgKiBSNzg5ICgweDMxNSkgLSBBSUYyREFDIExSQ0xLCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTFJDTEtfRElSICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYyREFDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19MUkNMS19ESVJfTUFTSyAgICAgICAgICAgMHgwODAwCS8qIEFJRjJEQUNfTFJDTEtfRElSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0xSQ0xLX0RJUl9TSElGVCAgICAgICAgICAgICAgMTEJLyogQUlGMkRBQ19MUkNMS19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTFJDTEtfRElSX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX0xSQ0xLX0RJUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19SQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwN0ZGCS8qIEFJRjJEQUNfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfUkFURSAtIFsxMDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgIDExCS8qIEFJRjJEQUNfUkFURSAtIFsxMDowXSAqLworCisvKgorICogUjc5MCAoMHgzMTYpIC0gQUlGMkRBQyBEYXRhCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX0RBVF9JTlYgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYyREFDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9EQVRfSU5WX01BU0sgICAgICAgICAgICAweDAwMDIJLyogQUlGMkRBQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfREFUX0lOVl9TSElGVCAgICAgICAgICAgICAgICAxCS8qIEFJRjJEQUNMX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX0RBVF9JTlZfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9EQVRfSU5WICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMkRBQ1JfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfREFUX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJEQUNSX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNSX0RBVF9JTlZfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDUl9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9EQVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ1JfREFUX0lOViAqLworCisvKgorICogUjc5MSAoMHgzMTcpIC0gQUlGMkFEQyBEYXRhCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0RBVF9JTlYgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYyQURDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9EQVRfSU5WX01BU0sgICAgICAgICAgICAweDAwMDIJLyogQUlGMkFEQ0xfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfREFUX0lOVl9TSElGVCAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENMX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0RBVF9JTlZfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYyQURDTF9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9EQVRfSU5WICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMkFEQ1JfREFUX0lOViAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfREFUX0lOVl9NQVNLICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJBRENSX0RBVF9JTlYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0RBVF9JTlZfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYyQURDUl9EQVRfSU5WICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9EQVRfSU5WX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ1JfREFUX0lOViAqLworCisvKgorICogUjEwMjQgKDB4NDAwKSAtIEFJRjEgQURDMSBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMV9WVSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMUFEQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX1ZVX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxQURDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFBREMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMV9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYxQURDMUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxQURDMUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgOAkvKiBBSUYxQURDMUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDI1ICgweDQwMSkgLSBBSUYxIEFEQzEgUmlnaHQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX1ZVICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxQURDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFfVlVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFBREMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMV9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMUFEQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjFBREMxUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFBREMxUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFBREMxUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwMjYgKDB4NDAyKSAtIEFJRjEgREFDMSBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9WVSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX1ZVX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEQUMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYxREFDMUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMUxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgOAkvKiBBSUYxREFDMUxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDI3ICgweDQwMykgLSBBSUYxIERBQzEgUmlnaHQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX1ZVICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfVlVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFEQUMxX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMURBQzFfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjFEQUMxUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEQUMxUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwMjggKDB4NDA0KSAtIEFJRjEgQURDMiBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMl9WVSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMUFEQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyX1ZVX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxQURDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFBREMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYxQURDMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxQURDMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgOAkvKiBBSUYxQURDMkxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDI5ICgweDQwNSkgLSBBSUYxIEFEQzIgUmlnaHQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyX1ZVICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxQURDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfVlVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFBREMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMUFEQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjFBREMyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFBREMyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFBREMyUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwMzAgKDB4NDA2KSAtIEFJRjEgREFDMiBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9WVSAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURBQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX1ZVX01BU0sgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEQUMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYxREFDMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMkxfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgOAkvKiBBSUYxREFDMkxfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMDMxICgweDQwNykgLSBBSUYxIERBQzIgUmlnaHQgVm9sdW1lCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX1ZVICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfVlVfTUFTSyAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFEQUMyX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9WVV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMURBQzJfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMl9WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1ZPTF9NQVNLICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjFEQUMyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1ZPTF9TSElGVCAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEQUMyUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEwNDAgKDB4NDEwKSAtIEFJRjEgQURDMSBGaWx0ZXJzCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfNEZTICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBBSUYxQURDXzRGUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQ180RlNfTUFTSyAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjFBRENfNEZTICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDXzRGU19TSElGVCAgICAgICAgICAgICAgICAgICAgMTUJLyogQUlGMUFEQ180RlMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBRENfNEZTX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDXzRGUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFMX0hQRiAgICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjFBREMxTF9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9IUEZfTUFTSyAgICAgICAgICAgICAgIDB4MTAwMAkvKiBBSUYxQURDMUxfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMUxfSFBGX1NISUZUICAgICAgICAgICAgICAgICAgMTIJLyogQUlGMUFEQzFMX0hQRiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFMX0hQRl9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFBREMxTF9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9IUEYgICAgICAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxQURDMVJfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMVJfSFBGX01BU0sgICAgICAgICAgICAgICAweDA4MDAJLyogQUlGMUFEQzFSX0hQRiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX0hQRl9TSElGVCAgICAgICAgICAgICAgICAgIDExCS8qIEFJRjFBREMxUl9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9IUEZfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMVJfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMV9IUEZfTU9ERSAgICAgICAgICAgICAgICAweDAwMDgJLyogQUlGMUFEQzFfSFBGX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX0hQRl9NT0RFX01BU0sgICAgICAgICAgIDB4MDAwOAkvKiBBSUYxQURDMV9IUEZfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFfSFBGX01PREVfU0hJRlQgICAgICAgICAgICAgICAzCS8qIEFJRjFBREMxX0hQRl9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMV9IUEZfTU9ERV9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzFfSFBGX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX0hQRl9DVVRfTUFTSyAgICAgICAgICAgIDB4MDAwNwkvKiBBSUYxQURDMV9IUEZfQ1VUIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX0hQRl9DVVRfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxQURDMV9IUEZfQ1VUIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxX0hQRl9DVVRfV0lEVEggICAgICAgICAgICAgICAgMwkvKiBBSUYxQURDMV9IUEZfQ1VUIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxMDQxICgweDQxMSkgLSBBSUYxIEFEQzIgRmlsdGVycworICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMkxfSFBGICAgICAgICAgICAgICAgICAgICAweDEwMDAJLyogQUlGMUFEQzJMX0hQRiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJMX0hQRl9NQVNLICAgICAgICAgICAgICAgMHgxMDAwCS8qIEFJRjFBREMyTF9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9IUEZfU0hJRlQgICAgICAgICAgICAgICAgICAxMgkvKiBBSUYxQURDMkxfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMkxfSFBGX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzJMX0hQRiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX0hQRiAgICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIEFJRjFBREMyUl9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyUl9IUEZfTUFTSyAgICAgICAgICAgICAgIDB4MDgwMAkvKiBBSUYxQURDMlJfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMlJfSFBGX1NISUZUICAgICAgICAgICAgICAgICAgMTEJLyogQUlGMUFEQzJSX0hQRiAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX0hQRl9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFBREMyUl9IUEYgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyX0hQRl9NT0RFICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBBSUYxQURDMl9IUEZfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfSFBGX01PREVfTUFTSyAgICAgICAgICAgMHgwMDA4CS8qIEFJRjFBREMyX0hQRl9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMl9IUEZfTU9ERV9TSElGVCAgICAgICAgICAgICAgIDMJLyogQUlGMUFEQzJfSFBGX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyX0hQRl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMl9IUEZfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfSFBGX0NVVF9NQVNLICAgICAgICAgICAgMHgwMDA3CS8qIEFJRjFBREMyX0hQRl9DVVQgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfSFBGX0NVVF9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFBREMyX0hQRl9DVVQgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJfSFBGX0NVVF9XSURUSCAgICAgICAgICAgICAgICAzCS8qIEFJRjFBREMyX0hQRl9DVVQgLSBbMjowXSAqLworCisvKgorICogUjEwNTYgKDB4NDIwKSAtIEFJRjEgREFDMSBGaWx0ZXJzICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9NVVRFICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogQUlGMURBQzFfTVVURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfTVVURV9NQVNLICAgICAgICAgICAgICAgMHgwMjAwCS8qIEFJRjFEQUMxX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgOQkvKiBBSUYxREFDMV9NVVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzFfTVVURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfTU9OTyAgICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIEFJRjFEQUMxX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX01PTk9fTUFTSyAgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYxREFDMV9NT05PICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9NT05PX1NISUZUICAgICAgICAgICAgICAgICAgIDcJLyogQUlGMURBQzFfTU9OTyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMxX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX01VVEVSQVRFICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBBSUYxREFDMV9NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfTVVURVJBVEVfTUFTSyAgICAgICAgICAgMHgwMDIwCS8qIEFJRjFEQUMxX01VVEVSQVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9NVVRFUkFURV9TSElGVCAgICAgICAgICAgICAgIDUJLyogQUlGMURBQzFfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX01VVEVSQVRFX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV9NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfVU5NVVRFX1JBTVAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjFEQUMxX1VOTVVURV9SQU1QICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9VTk1VVEVfUkFNUF9NQVNLICAgICAgICAweDAwMTAJLyogQUlGMURBQzFfVU5NVVRFX1JBTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX1VOTVVURV9SQU1QX1NISUZUICAgICAgICAgICAgNAkvKiBBSUYxREFDMV9VTk1VVEVfUkFNUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfVU5NVVRFX1JBTVBfV0lEVEggICAgICAgICAgICAxCS8qIEFJRjFEQUMxX1VOTVVURV9SQU1QICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9ERUVNUF9NQVNLICAgICAgICAgICAgICAweDAwMDYJLyogQUlGMURBQzFfREVFTVAgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfREVFTVBfU0hJRlQgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMxX0RFRU1QIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0RFRU1QX1dJRFRIICAgICAgICAgICAgICAgICAgMgkvKiBBSUYxREFDMV9ERUVNUCAtIFsyOjFdICovCisKKy8qCisgKiBSMTA1NyAoMHg0MjEpIC0gQUlGMSBEQUMxIEZpbHRlcnMgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxXzNEX0dBSU5fTUFTSyAgICAgICAgICAgIDB4M0UwMAkvKiBBSUYxREFDMV8zRF9HQUlOIC0gWzEzOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV8zRF9HQUlOX1NISUZUICAgICAgICAgICAgICAgIDkJLyogQUlGMURBQzFfM0RfR0FJTiAtIFsxMzo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfM0RfR0FJTl9XSURUSCAgICAgICAgICAgICAgICA1CS8qIEFJRjFEQUMxXzNEX0dBSU4gLSBbMTM6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxXzNEX0VOQSAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMV8zRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxXzNEX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYxREFDMV8zRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxXzNEX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgOAkvKiBBSUYxREFDMV8zRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxXzNEX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV8zRF9FTkEgKi8KKworLyoKKyAqIFIxMDU4ICgweDQyMikgLSBBSUYxIERBQzIgRmlsdGVycyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfTVVURSAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEFJRjFEQUMyX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX01VVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDIwMAkvKiBBSUYxREFDMl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgIDkJLyogQUlGMURBQzJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX01PTk8gICAgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYxREFDMl9NT05PICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9NT05PX01BU0sgICAgICAgICAgICAgICAweDAwODAJLyogQUlGMURBQzJfTU9OTyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfTU9OT19TSElGVCAgICAgICAgICAgICAgICAgICA3CS8qIEFJRjFEQUMyX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX01PTk9fV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMl9NT05PICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9NVVRFUkFURSAgICAgICAgICAgICAgICAweDAwMjAJLyogQUlGMURBQzJfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX01VVEVSQVRFX01BU0sgICAgICAgICAgIDB4MDAyMAkvKiBBSUYxREFDMl9NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfTVVURVJBVEVfU0hJRlQgICAgICAgICAgICAgICA1CS8qIEFJRjFEQUMyX01VVEVSQVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9NVVRFUkFURV9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzJfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX1VOTVVURV9SQU1QICAgICAgICAgICAgIDB4MDAxMAkvKiBBSUYxREFDMl9VTk1VVEVfUkFNUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfVU5NVVRFX1JBTVBfTUFTSyAgICAgICAgMHgwMDEwCS8qIEFJRjFEQUMyX1VOTVVURV9SQU1QICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9VTk1VVEVfUkFNUF9TSElGVCAgICAgICAgICAgIDQJLyogQUlGMURBQzJfVU5NVVRFX1JBTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX1VOTVVURV9SQU1QX1dJRFRIICAgICAgICAgICAgMQkvKiBBSUYxREFDMl9VTk1VVEVfUkFNUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfREVFTVBfTUFTSyAgICAgICAgICAgICAgMHgwMDA2CS8qIEFJRjFEQUMyX0RFRU1QIC0gWzI6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0RFRU1QX1NISUZUICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMl9ERUVNUCAtIFsyOjFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9ERUVNUF9XSURUSCAgICAgICAgICAgICAgICAgIDIJLyogQUlGMURBQzJfREVFTVAgLSBbMjoxXSAqLworCisvKgorICogUjEwNTkgKDB4NDIzKSAtIEFJRjEgREFDMiBGaWx0ZXJzICgyKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl8zRF9HQUlOX01BU0sgICAgICAgICAgICAweDNFMDAJLyogQUlGMURBQzJfM0RfR0FJTiAtIFsxMzo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfM0RfR0FJTl9TSElGVCAgICAgICAgICAgICAgICA5CS8qIEFJRjFEQUMyXzNEX0dBSU4gLSBbMTM6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyXzNEX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgNQkvKiBBSUYxREFDMl8zRF9HQUlOIC0gWzEzOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl8zRF9FTkEgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURBQzJfM0RfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl8zRF9FTkFfTUFTSyAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURBQzJfM0RfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl8zRF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgIDgJLyogQUlGMURBQzJfM0RfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl8zRF9FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzJfM0RfRU5BICovCisKKy8qCisgKiBSMTA4OCAoMHg0NDApIC0gQUlGMSBEUkMxICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1JNU19NQVNLICAgICAgICAweEY4MDAJLyogQUlGMURSQzFfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1JNU19TSElGVCAgICAgICAgICAgMTEJLyogQUlGMURSQzFfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1JNU19XSURUSCAgICAgICAgICAgIDUJLyogQUlGMURSQzFfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1BLX01BU0sgICAgICAgICAweDA2MDAJLyogQUlGMURSQzFfU0lHX0RFVF9QSyAtIFsxMDo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfU0lHX0RFVF9QS19TSElGVCAgICAgICAgICAgICA5CS8qIEFJRjFEUkMxX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfUEtfV0lEVEggICAgICAgICAgICAgMgkvKiBBSUYxRFJDMV9TSUdfREVUX1BLIC0gWzEwOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19FTkEgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURSQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19FTkFfTUFTSyAgICAgICAgICAgICAweDAxMDAJLyogQUlGMURSQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgIDgJLyogQUlGMURSQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19FTkFfV0lEVEggICAgICAgICAgICAgICAgIDEJLyogQUlGMURSQzFfTkdfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX01PREUgICAgICAgICAgICAweDAwODAJLyogQUlGMURSQzFfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX01PREVfTUFTSyAgICAgICAweDAwODAJLyogQUlGMURSQzFfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX01PREVfU0hJRlQgICAgICAgICAgIDcJLyogQUlGMURSQzFfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX01PREVfV0lEVEggICAgICAgICAgIDEJLyogQUlGMURSQzFfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUICAgICAgICAgICAgICAgICAweDAwNDAJLyogQUlGMURSQzFfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfU0lHX0RFVF9NQVNLICAgICAgICAgICAgMHgwMDQwCS8qIEFJRjFEUkMxX1NJR19ERVQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfU0hJRlQgICAgICAgICAgICAgICAgNgkvKiBBSUYxRFJDMV9TSUdfREVUICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMURSQzFfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfT1BfRU5BICAgICAgICAgICAgMHgwMDIwCS8qIEFJRjFEUkMxX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfT1BfRU5BX01BU0sgICAgICAgMHgwMDIwCS8qIEFJRjFEUkMxX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfT1BfRU5BX1NISUZUICAgICAgICAgICA1CS8qIEFJRjFEUkMxX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfT1BfRU5BX1dJRFRIICAgICAgICAgICAxCS8qIEFJRjFEUkMxX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfUVIgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjFEUkMxX1FSICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9RUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMTAJLyogQUlGMURSQzFfUVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1FSX1NISUZUICAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYxRFJDMV9RUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfUVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEUkMxX1FSICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9BTlRJQ0xJUCAgICAgICAgICAgICAgICAweDAwMDgJLyogQUlGMURSQzFfQU5USUNMSVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX0FOVElDTElQX01BU0sgICAgICAgICAgIDB4MDAwOAkvKiBBSUYxRFJDMV9BTlRJQ0xJUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfQU5USUNMSVBfU0hJRlQgICAgICAgICAgICAgICAzCS8qIEFJRjFEUkMxX0FOVElDTElQICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9BTlRJQ0xJUF9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMURSQzFfQU5USUNMSVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0RSQ19FTkEgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYxREFDMV9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9EUkNfRU5BX01BU0sgICAgICAgICAgICAweDAwMDQJLyogQUlGMURBQzFfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRFJDX0VOQV9TSElGVCAgICAgICAgICAgICAgICAyCS8qIEFJRjFEQUMxX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0RSQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMUxfRFJDX0VOQSAgICAgICAgICAgICAgICAweDAwMDIJLyogQUlGMUFEQzFMX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxTF9EUkNfRU5BX01BU0sgICAgICAgICAgIDB4MDAwMgkvKiBBSUYxQURDMUxfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFMX0RSQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAxCS8qIEFJRjFBREMxTF9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMUxfRFJDX0VOQV9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzFMX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9EUkNfRU5BICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxQURDMVJfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzFSX0RSQ19FTkFfTUFTSyAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFBREMxUl9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMVJfRFJDX0VOQV9TSElGVCAgICAgICAgICAgICAgIDAJLyogQUlGMUFEQzFSX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMxUl9EUkNfRU5BX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMVJfRFJDX0VOQSAqLworCisvKgorICogUjEwODkgKDB4NDQxKSAtIEFJRjEgRFJDMSAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfQVRLX01BU0sgICAgICAgICAgICAgICAgMHgxRTAwCS8qIEFJRjFEUkMxX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfQVRLX1NISUZUICAgICAgICAgICAgICAgICAgICA5CS8qIEFJRjFEUkMxX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfQVRLX1dJRFRIICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjFEUkMxX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfRENZX01BU0sgICAgICAgICAgICAgICAgMHgwMUUwCS8qIEFJRjFEUkMxX0RDWSAtIFs4OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgIDUJLyogQUlGMURSQzFfRENZIC0gWzg6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX0RDWV9XSURUSCAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYxRFJDMV9EQ1kgLSBbODo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUlOR0FJTl9NQVNLICAgICAgICAgICAgMHgwMDFDCS8qIEFJRjFEUkMxX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUlOR0FJTl9TSElGVCAgICAgICAgICAgICAgICAyCS8qIEFJRjFEUkMxX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUlOR0FJTl9XSURUSCAgICAgICAgICAgICAgICAzCS8qIEFJRjFEUkMxX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUFYR0FJTl9NQVNLICAgICAgICAgICAgMHgwMDAzCS8qIEFJRjFEUkMxX01BWEdBSU4gLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUFYR0FJTl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEUkMxX01BWEdBSU4gLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTUFYR0FJTl9XSURUSCAgICAgICAgICAgICAgICAyCS8qIEFJRjFEUkMxX01BWEdBSU4gLSBbMTowXSAqLworCisvKgorICogUjEwOTAgKDB4NDQyKSAtIEFJRjEgRFJDMSAoMykKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTkdfTUlOR0FJTl9NQVNLICAgICAgICAgMHhGMDAwCS8qIEFJRjFEUkMxX05HX01JTkdBSU4gLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19NSU5HQUlOX1NISUZUICAgICAgICAgICAgMTIJLyogQUlGMURSQzFfTkdfTUlOR0FJTiAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX05HX01JTkdBSU5fV0lEVEggICAgICAgICAgICAgNAkvKiBBSUYxRFJDMV9OR19NSU5HQUlOIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTkdfRVhQX01BU0sgICAgICAgICAgICAgMHgwQzAwCS8qIEFJRjFEUkMxX05HX0VYUCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX05HX0VYUF9TSElGVCAgICAgICAgICAgICAgICAxMAkvKiBBSUYxRFJDMV9OR19FWFAgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9OR19FWFBfV0lEVEggICAgICAgICAgICAgICAgIDIJLyogQUlGMURSQzFfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfUVJfVEhSX01BU0sgICAgICAgICAgICAgMHgwMzAwCS8qIEFJRjFEUkMxX1FSX1RIUiAtIFs5OjhdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9RUl9USFJfU0hJRlQgICAgICAgICAgICAgICAgIDgJLyogQUlGMURSQzFfUVJfVEhSIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1FSX1RIUl9XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBBSUYxRFJDMV9RUl9USFIgLSBbOTo4XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfUVJfRENZX01BU0sgICAgICAgICAgICAgMHgwMEMwCS8qIEFJRjFEUkMxX1FSX0RDWSAtIFs3OjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9RUl9EQ1lfU0hJRlQgICAgICAgICAgICAgICAgIDYJLyogQUlGMURSQzFfUVJfRENZIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1FSX0RDWV9XSURUSCAgICAgICAgICAgICAgICAgMgkvKiBBSUYxRFJDMV9RUl9EQ1kgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfSElfQ09NUF9NQVNLICAgICAgICAgICAgMHgwMDM4CS8qIEFJRjFEUkMxX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfSElfQ09NUF9TSElGVCAgICAgICAgICAgICAgICAzCS8qIEFJRjFEUkMxX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfSElfQ09NUF9XSURUSCAgICAgICAgICAgICAgICAzCS8qIEFJRjFEUkMxX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTE9fQ09NUF9NQVNLICAgICAgICAgICAgMHgwMDA3CS8qIEFJRjFEUkMxX0xPX0NPTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTE9fQ09NUF9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEUkMxX0xPX0NPTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfTE9fQ09NUF9XSURUSCAgICAgICAgICAgICAgICAzCS8qIEFJRjFEUkMxX0xPX0NPTVAgLSBbMjowXSAqLworCisvKgorICogUjEwOTEgKDB4NDQzKSAtIEFJRjEgRFJDMSAoNCkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRV9JUF9NQVNLICAgICAgICAgICAgMHgwN0UwCS8qIEFJRjFEUkMxX0tORUVfSVAgLSBbMTA6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX0tORUVfSVBfU0hJRlQgICAgICAgICAgICAgICAgNQkvKiBBSUYxRFJDMV9LTkVFX0lQIC0gWzEwOjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9LTkVFX0lQX1dJRFRIICAgICAgICAgICAgICAgIDYJLyogQUlGMURSQzFfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRV9PUF9NQVNLICAgICAgICAgICAgMHgwMDFGCS8qIEFJRjFEUkMxX0tORUVfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRV9PUF9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEUkMxX0tORUVfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRV9PUF9XSURUSCAgICAgICAgICAgICAgICA1CS8qIEFJRjFEUkMxX0tORUVfT1AgLSBbNDowXSAqLworCisvKgorICogUjEwOTIgKDB4NDQ0KSAtIEFJRjEgRFJDMSAoNSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfSVBfTUFTSyAgICAgICAgICAgMHgwM0UwCS8qIEFJRjFEUkMxX0tORUUyX0lQIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX0tORUUyX0lQX1NISUZUICAgICAgICAgICAgICAgNQkvKiBBSUYxRFJDMV9LTkVFMl9JUCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9LTkVFMl9JUF9XSURUSCAgICAgICAgICAgICAgIDUJLyogQUlGMURSQzFfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfS05FRTJfT1BfTUFTSyAgICAgICAgICAgMHgwMDFGCS8qIEFJRjFEUkMxX0tORUUyX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX0tORUUyX09QX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxRFJDMV9LTkVFMl9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9LTkVFMl9PUF9XSURUSCAgICAgICAgICAgICAgIDUJLyogQUlGMURSQzFfS05FRTJfT1AgLSBbNDowXSAqLworCisvKgorICogUjExMDQgKDB4NDUwKSAtIEFJRjEgRFJDMiAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9STVNfTUFTSyAgICAgICAgMHhGODAwCS8qIEFJRjFEUkMyX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9STVNfU0hJRlQgICAgICAgICAgIDExCS8qIEFJRjFEUkMyX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9STVNfV0lEVEggICAgICAgICAgICA1CS8qIEFJRjFEUkMyX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9QS19NQVNLICAgICAgICAgMHgwNjAwCS8qIEFJRjFEUkMyX1NJR19ERVRfUEsgLSBbMTA6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfUEtfU0hJRlQgICAgICAgICAgICAgOQkvKiBBSUYxRFJDMl9TSUdfREVUX1BLIC0gWzEwOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9TSUdfREVUX1BLX1dJRFRIICAgICAgICAgICAgIDIJLyogQUlGMURSQzJfU0lHX0RFVF9QSyAtIFsxMDo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfRU5BICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFEUkMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfRU5BX01BU0sgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjFEUkMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfRU5BX1NISUZUICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEUkMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEUkMyX05HX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9NT0RFICAgICAgICAgICAgMHgwMDgwCS8qIEFJRjFEUkMyX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9NT0RFX01BU0sgICAgICAgMHgwMDgwCS8qIEFJRjFEUkMyX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9NT0RFX1NISUZUICAgICAgICAgICA3CS8qIEFJRjFEUkMyX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9NT0RFX1dJRFRIICAgICAgICAgICAxCS8qIEFJRjFEUkMyX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVCAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEFJRjFEUkMyX1NJR19ERVQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfTUFTSyAgICAgICAgICAgIDB4MDA0MAkvKiBBSUYxRFJDMl9TSUdfREVUICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9TSUdfREVUX1NISUZUICAgICAgICAgICAgICAgIDYJLyogQUlGMURSQzJfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjFEUkMyX1NJR19ERVQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX09QX0VOQSAgICAgICAgICAgIDB4MDAyMAkvKiBBSUYxRFJDMl9LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX09QX0VOQV9NQVNLICAgICAgIDB4MDAyMAkvKiBBSUYxRFJDMl9LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX09QX0VOQV9TSElGVCAgICAgICAgICAgNQkvKiBBSUYxRFJDMl9LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX09QX0VOQV9XSURUSCAgICAgICAgICAgMQkvKiBBSUYxRFJDMl9LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1FSICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBBSUYxRFJDMl9RUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfUVJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjFEUkMyX1FSICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9RUl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMURSQzJfUVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1FSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYxRFJDMl9RUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfQU5USUNMSVAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjFEUkMyX0FOVElDTElQICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9BTlRJQ0xJUF9NQVNLICAgICAgICAgICAweDAwMDgJLyogQUlGMURSQzJfQU5USUNMSVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0FOVElDTElQX1NISUZUICAgICAgICAgICAgICAgMwkvKiBBSUYxRFJDMl9BTlRJQ0xJUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfQU5USUNMSVBfV0lEVEggICAgICAgICAgICAgICAxCS8qIEFJRjFEUkMyX0FOVElDTElQICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9EUkNfRU5BICAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMURBQzJfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRFJDX0VOQV9NQVNLICAgICAgICAgICAgMHgwMDA0CS8qIEFJRjFEQUMyX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0RSQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgMgkvKiBBSUYxREFDMl9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9EUkNfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMURBQzJfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJMX0RSQ19FTkEgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFBREMyTF9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMkxfRFJDX0VOQV9NQVNLICAgICAgICAgICAweDAwMDIJLyogQUlGMUFEQzJMX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyTF9EUkNfRU5BX1NISUZUICAgICAgICAgICAgICAgMQkvKiBBSUYxQURDMkxfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJMX0RSQ19FTkFfV0lEVEggICAgICAgICAgICAgICAxCS8qIEFJRjFBREMyTF9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMlJfRFJDX0VOQSAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMUFEQzJSX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFBREMyUl9EUkNfRU5BX01BU0sgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxQURDMlJfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMUFEQzJSX0RSQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAwCS8qIEFJRjFBREMyUl9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYxQURDMlJfRFJDX0VOQV9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMUFEQzJSX0RSQ19FTkEgKi8KKworLyoKKyAqIFIxMTA1ICgweDQ1MSkgLSBBSUYxIERSQzIgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0FUS19NQVNLICAgICAgICAgICAgICAgIDB4MUUwMAkvKiBBSUYxRFJDMl9BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0FUS19TSElGVCAgICAgICAgICAgICAgICAgICAgOQkvKiBBSUYxRFJDMl9BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0FUS19XSURUSCAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYxRFJDMl9BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0RDWV9NQVNLICAgICAgICAgICAgICAgIDB4MDFFMAkvKiBBSUYxRFJDMl9EQ1kgLSBbODo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfRENZX1NISUZUICAgICAgICAgICAgICAgICAgICA1CS8qIEFJRjFEUkMyX0RDWSAtIFs4OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9EQ1lfV0lEVEggICAgICAgICAgICAgICAgICAgIDQJLyogQUlGMURSQzJfRENZIC0gWzg6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01JTkdBSU5fTUFTSyAgICAgICAgICAgIDB4MDAxQwkvKiBBSUYxRFJDMl9NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01JTkdBSU5fU0hJRlQgICAgICAgICAgICAgICAgMgkvKiBBSUYxRFJDMl9NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01JTkdBSU5fV0lEVEggICAgICAgICAgICAgICAgMwkvKiBBSUYxRFJDMl9NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01BWEdBSU5fTUFTSyAgICAgICAgICAgIDB4MDAwMwkvKiBBSUYxRFJDMl9NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01BWEdBSU5fU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxRFJDMl9NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX01BWEdBSU5fV0lEVEggICAgICAgICAgICAgICAgMgkvKiBBSUYxRFJDMl9NQVhHQUlOIC0gWzE6MF0gKi8KKworLyoKKyAqIFIxMTA2ICgweDQ1MikgLSBBSUYxIERSQzIgKDMpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX05HX01JTkdBSU5fTUFTSyAgICAgICAgIDB4RjAwMAkvKiBBSUYxRFJDMl9OR19NSU5HQUlOIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfTUlOR0FJTl9TSElGVCAgICAgICAgICAgIDEyCS8qIEFJRjFEUkMyX05HX01JTkdBSU4gLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9OR19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgIDQJLyogQUlGMURSQzJfTkdfTUlOR0FJTiAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX05HX0VYUF9NQVNLICAgICAgICAgICAgIDB4MEMwMAkvKiBBSUYxRFJDMl9OR19FWFAgLSBbMTE6MTBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9OR19FWFBfU0hJRlQgICAgICAgICAgICAgICAgMTAJLyogQUlGMURSQzJfTkdfRVhQIC0gWzExOjEwXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfTkdfRVhQX1dJRFRIICAgICAgICAgICAgICAgICAyCS8qIEFJRjFEUkMyX05HX0VYUCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1FSX1RIUl9NQVNLICAgICAgICAgICAgIDB4MDMwMAkvKiBBSUYxRFJDMl9RUl9USFIgLSBbOTo4XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfUVJfVEhSX1NISUZUICAgICAgICAgICAgICAgICA4CS8qIEFJRjFEUkMyX1FSX1RIUiAtIFs5OjhdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9RUl9USFJfV0lEVEggICAgICAgICAgICAgICAgIDIJLyogQUlGMURSQzJfUVJfVEhSIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1FSX0RDWV9NQVNLICAgICAgICAgICAgIDB4MDBDMAkvKiBBSUYxRFJDMl9RUl9EQ1kgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfUVJfRENZX1NISUZUICAgICAgICAgICAgICAgICA2CS8qIEFJRjFEUkMyX1FSX0RDWSAtIFs3OjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9RUl9EQ1lfV0lEVEggICAgICAgICAgICAgICAgIDIJLyogQUlGMURSQzJfUVJfRENZIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0hJX0NPTVBfTUFTSyAgICAgICAgICAgIDB4MDAzOAkvKiBBSUYxRFJDMl9ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0hJX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgMwkvKiBBSUYxRFJDMl9ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0hJX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgMwkvKiBBSUYxRFJDMl9ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0xPX0NPTVBfTUFTSyAgICAgICAgICAgIDB4MDAwNwkvKiBBSUYxRFJDMl9MT19DT01QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0xPX0NPTVBfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxRFJDMl9MT19DT01QIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0xPX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgMwkvKiBBSUYxRFJDMl9MT19DT01QIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxMTA3ICgweDQ1MykgLSBBSUYxIERSQzIgKDQpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUVfSVBfTUFTSyAgICAgICAgICAgIDB4MDdFMAkvKiBBSUYxRFJDMl9LTkVFX0lQIC0gWzEwOjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9LTkVFX0lQX1NISUZUICAgICAgICAgICAgICAgIDUJLyogQUlGMURSQzJfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfS05FRV9JUF9XSURUSCAgICAgICAgICAgICAgICA2CS8qIEFJRjFEUkMyX0tORUVfSVAgLSBbMTA6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUVfT1BfTUFTSyAgICAgICAgICAgIDB4MDAxRgkvKiBBSUYxRFJDMl9LTkVFX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUVfT1BfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxRFJDMl9LTkVFX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUVfT1BfV0lEVEggICAgICAgICAgICAgICAgNQkvKiBBSUYxRFJDMl9LTkVFX09QIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxMTA4ICgweDQ1NCkgLSBBSUYxIERSQzIgKDUpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX0lQX01BU0sgICAgICAgICAgIDB4MDNFMAkvKiBBSUYxRFJDMl9LTkVFMl9JUCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9LTkVFMl9JUF9TSElGVCAgICAgICAgICAgICAgIDUJLyogQUlGMURSQzJfS05FRTJfSVAgLSBbOTo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfS05FRTJfSVBfV0lEVEggICAgICAgICAgICAgICA1CS8qIEFJRjFEUkMyX0tORUUyX0lQIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX0tORUUyX09QX01BU0sgICAgICAgICAgIDB4MDAxRgkvKiBBSUYxRFJDMl9LTkVFMl9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9LTkVFMl9PUF9TSElGVCAgICAgICAgICAgICAgIDAJLyogQUlGMURSQzJfS05FRTJfT1AgLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfS05FRTJfT1BfV0lEVEggICAgICAgICAgICAgICA1CS8qIEFJRjFEUkMyX0tORUUyX09QIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxMTUyICgweDQ4MCkgLSBBSUYxIERBQzEgRVEgR2FpbnMgKDEpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IxX0dBSU5fTUFTSyAgICAgICAgIDB4RjgwMAkvKiBBSUYxREFDMV9FUV9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjFfR0FJTl9TSElGVCAgICAgICAgICAgIDExCS8qIEFJRjFEQUMxX0VRX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMV9HQUlOX1dJRFRIICAgICAgICAgICAgIDUJLyogQUlGMURBQzFfRVFfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IyX0dBSU5fTUFTSyAgICAgICAgIDB4MDdDMAkvKiBBSUYxREFDMV9FUV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMl9HQUlOX1NISUZUICAgICAgICAgICAgIDYJLyogQUlGMURBQzFfRVFfQjJfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjJfR0FJTl9XSURUSCAgICAgICAgICAgICA1CS8qIEFJRjFEQUMxX0VRX0IyX0dBSU4gLSBbMTA6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0dBSU5fTUFTSyAgICAgICAgIDB4MDAzRQkvKiBBSUYxREFDMV9FUV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0dBSU5fU0hJRlQgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV9FUV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0dBSU5fV0lEVEggICAgICAgICAgICAgNQkvKiBBSUYxREFDMV9FUV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0VOQSAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMV9FUV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMV9FUV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMV9FUV9FTkEgKi8KKworLyoKKyAqIFIxMTUzICgweDQ4MSkgLSBBSUYxIERBQzEgRVEgR2FpbnMgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I0X0dBSU5fTUFTSyAgICAgICAgIDB4RjgwMAkvKiBBSUYxREFDMV9FUV9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjRfR0FJTl9TSElGVCAgICAgICAgICAgIDExCS8qIEFJRjFEQUMxX0VRX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNF9HQUlOX1dJRFRIICAgICAgICAgICAgIDUJLyogQUlGMURBQzFfRVFfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I1X0dBSU5fTUFTSyAgICAgICAgIDB4MDdDMAkvKiBBSUYxREFDMV9FUV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNV9HQUlOX1NISUZUICAgICAgICAgICAgIDYJLyogQUlGMURBQzFfRVFfQjVfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjVfR0FJTl9XSURUSCAgICAgICAgICAgICA1CS8qIEFJRjFEQUMxX0VRX0I1X0dBSU4gLSBbMTA6Nl0gKi8KKworLyoKKyAqIFIxMTU0ICgweDQ4MikgLSBBSUYxIERBQzEgRVEgQmFuZCAxIEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjFfQV9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0IxX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IxX0FfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CMV9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMV9BX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzFfRVFfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjExNTUgKDB4NDgzKSAtIEFJRjEgREFDMSBFUSBCYW5kIDEgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMV9CX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjFfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjFfQl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxX0VRX0IxX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IxX0JfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMV9FUV9CMV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE1NiAoMHg0ODQpIC0gQUlGMSBEQUMxIEVRIEJhbmQgMSBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMV9QR19NQVNLICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjFfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjFfUEdfV0lEVEggICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0IxX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE1NyAoMHg0ODUpIC0gQUlGMSBEQUMxIEVRIEJhbmQgMiBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IyX0FfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMV9FUV9CMl9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMl9BX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzFfRVFfQjJfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjJfQV9XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0IyX0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTU4ICgweDQ4NikgLSBBSUYxIERBQzEgRVEgQmFuZCAyIEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjJfQl9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IyX0JfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CMl9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMl9CX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzFfRVFfQjJfQiAtIFsxNTowXSAqLworCisvKgorICogUjExNTkgKDB4NDg3KSAtIEFJRjEgREFDMSBFUSBCYW5kIDIgQworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMl9DX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjJfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxX0VRX0IyX0MgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IyX0NfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMV9FUV9CMl9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2MCAoMHg0ODgpIC0gQUlGMSBEQUMxIEVRIEJhbmQgMiBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CMl9QR19NQVNLICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IyX1BHX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CMl9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjJfUEdfV0lEVEggICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0IyX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2MSAoMHg0ODkpIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0FfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMV9FUV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CM19BX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzFfRVFfQjNfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjNfQV9XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0IzX0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTYyICgweDQ4QSkgLSBBSUYxIERBQzEgRVEgQmFuZCAzIEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjNfQl9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0JfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CM19CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CM19CX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzFfRVFfQjNfQiAtIFsxNTowXSAqLworCisvKgorICogUjExNjMgKDB4NDhCKSAtIEFJRjEgREFDMSBFUSBCYW5kIDMgQworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CM19DX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjNfQ19TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxX0VRX0IzX0MgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX0NfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMV9FUV9CM19DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2NCAoMHg0OEMpIC0gQUlGMSBEQUMxIEVRIEJhbmQgMyBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CM19QR19NQVNLICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0IzX1BHX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjNfUEdfV0lEVEggICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0IzX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2NSAoMHg0OEQpIC0gQUlGMSBEQUMxIEVRIEJhbmQgNCBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I0X0FfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMV9FUV9CNF9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNF9BX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzFfRVFfQjRfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjRfQV9XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0I0X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTY2ICgweDQ4RSkgLSBBSUYxIERBQzEgRVEgQmFuZCA0IEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjRfQl9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0I0X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I0X0JfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CNF9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNF9CX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzFfRVFfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjExNjcgKDB4NDhGKSAtIEFJRjEgREFDMSBFUSBCYW5kIDQgQworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNF9DX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjRfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjRfQ19TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxX0VRX0I0X0MgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I0X0NfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMV9FUV9CNF9DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2OCAoMHg0OTApIC0gQUlGMSBEQUMxIEVRIEJhbmQgNCBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNF9QR19NQVNLICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzFfRVFfQjRfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I0X1BHX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjRfUEdfV0lEVEggICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0I0X1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE2OSAoMHg0OTEpIC0gQUlGMSBEQUMxIEVRIEJhbmQgNSBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I1X0FfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMV9FUV9CNV9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNV9BX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzFfRVFfQjVfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjVfQV9XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMxX0VRX0I1X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTcwICgweDQ5MikgLSBBSUYxIERBQzEgRVEgQmFuZCA1IEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjVfQl9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0I1X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I1X0JfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMV9FUV9CNV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNV9CX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzFfRVFfQjVfQiAtIFsxNTowXSAqLworCisvKgorICogUjExNzEgKDB4NDkzKSAtIEFJRjEgREFDMSBFUSBCYW5kIDUgUEcKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFfRVFfQjVfUEdfTUFTSyAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMxX0VRX0I1X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMV9FUV9CNV9QR19TSElGVCAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzFfRVFfQjVfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxX0VRX0I1X1BHX1dJRFRIICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMV9FUV9CNV9QRyAtIFsxNTowXSAqLworCisvKgorICogUjExODQgKDB4NEEwKSAtIEFJRjEgREFDMiBFUSBHYWlucyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjFfR0FJTl9NQVNLICAgICAgICAgMHhGODAwCS8qIEFJRjFEQUMyX0VRX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMV9HQUlOX1NISUZUICAgICAgICAgICAgMTEJLyogQUlGMURBQzJfRVFfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IxX0dBSU5fV0lEVEggICAgICAgICAgICAgNQkvKiBBSUYxREFDMl9FUV9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjJfR0FJTl9NQVNLICAgICAgICAgMHgwN0MwCS8qIEFJRjFEQUMyX0VRX0IyX0dBSU4gLSBbMTA6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IyX0dBSU5fU0hJRlQgICAgICAgICAgICAgNgkvKiBBSUYxREFDMl9FUV9CMl9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMl9HQUlOX1dJRFRIICAgICAgICAgICAgIDUJLyogQUlGMURBQzJfRVFfQjJfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfR0FJTl9NQVNLICAgICAgICAgMHgwMDNFCS8qIEFJRjFEQUMyX0VRX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfR0FJTl9TSElGVCAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyX0VRX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfR0FJTl9XSURUSCAgICAgICAgICAgICA1CS8qIEFJRjFEQUMyX0VRX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfRU5BICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMyX0VRX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfRU5BX01BU0sgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMyX0VRX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyX0VRX0VOQSAqLworCisvKgorICogUjExODUgKDB4NEExKSAtIEFJRjEgREFDMiBFUSBHYWlucyAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjRfR0FJTl9NQVNLICAgICAgICAgMHhGODAwCS8qIEFJRjFEQUMyX0VRX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNF9HQUlOX1NISUZUICAgICAgICAgICAgMTEJLyogQUlGMURBQzJfRVFfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I0X0dBSU5fV0lEVEggICAgICAgICAgICAgNQkvKiBBSUYxREFDMl9FUV9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjVfR0FJTl9NQVNLICAgICAgICAgMHgwN0MwCS8qIEFJRjFEQUMyX0VRX0I1X0dBSU4gLSBbMTA6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I1X0dBSU5fU0hJRlQgICAgICAgICAgICAgNgkvKiBBSUYxREFDMl9FUV9CNV9HQUlOIC0gWzEwOjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNV9HQUlOX1dJRFRIICAgICAgICAgICAgIDUJLyogQUlGMURBQzJfRVFfQjVfR0FJTiAtIFsxMDo2XSAqLworCisvKgorICogUjExODYgKDB4NEEyKSAtIEFJRjEgREFDMiBFUSBCYW5kIDEgQQorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMV9BX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjFfQV9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IxX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IxX0FfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMl9FUV9CMV9BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE4NyAoMHg0QTMpIC0gQUlGMSBEQUMyIEVRIEJhbmQgMSBCCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IxX0JfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CMV9CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMV9CX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzJfRVFfQjFfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjFfQl9XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMyX0VRX0IxX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTg4ICgweDRBNCkgLSBBSUYxIERBQzIgRVEgQmFuZCAxIFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IxX1BHX01BU0sgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjFfUEdfU0hJRlQgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IxX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMV9QR19XSURUSCAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjFfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTg5ICgweDRBNSkgLSBBSUYxIERBQzIgRVEgQmFuZCAyIEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjJfQV9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMyX0VRX0IyX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IyX0FfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMl9FUV9CMl9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMl9BX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjJfQSAtIFsxNTowXSAqLworCisvKgorICogUjExOTAgKDB4NEE2KSAtIEFJRjEgREFDMiBFUSBCYW5kIDIgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMl9CX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjJfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjJfQl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IyX0JfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMl9FUV9CMl9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE5MSAoMHg0QTcpIC0gQUlGMSBEQUMyIEVRIEJhbmQgMiBDCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IyX0NfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CMl9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMl9DX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzJfRVFfQjJfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjJfQ19XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMyX0VRX0IyX0MgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTkyICgweDRBOCkgLSBBSUYxIERBQzIgRVEgQmFuZCAyIFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IyX1BHX01BU0sgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CMl9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjJfUEdfU0hJRlQgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IyX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CMl9QR19XSURUSCAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjJfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTkzICgweDRBOSkgLSBBSUYxIERBQzIgRVEgQmFuZCAzIEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfQV9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMyX0VRX0IzX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IzX0FfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMl9FUV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CM19BX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjNfQSAtIFsxNTowXSAqLworCisvKgorICogUjExOTQgKDB4NEFBKSAtIEFJRjEgREFDMiBFUSBCYW5kIDMgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CM19CX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjNfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfQl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IzX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IzX0JfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMl9FUV9CM19CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE5NSAoMHg0QUIpIC0gQUlGMSBEQUMyIEVRIEJhbmQgMyBDCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IzX0NfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CM19DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CM19DX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzJfRVFfQjNfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfQ19XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMyX0VRX0IzX0MgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTk2ICgweDRBQykgLSBBSUYxIERBQzIgRVEgQmFuZCAzIFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0IzX1BHX01BU0sgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CM19QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjNfUEdfU0hJRlQgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0IzX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CM19QR19XSURUSCAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjNfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMTk3ICgweDRBRCkgLSBBSUYxIERBQzIgRVEgQmFuZCA0IEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjRfQV9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMyX0VRX0I0X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I0X0FfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMl9FUV9CNF9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNF9BX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjRfQSAtIFsxNTowXSAqLworCisvKgorICogUjExOTggKDB4NEFFKSAtIEFJRjEgREFDMiBFUSBCYW5kIDQgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNF9CX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjRfQl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0I0X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I0X0JfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMl9FUV9CNF9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTE5OSAoMHg0QUYpIC0gQUlGMSBEQUMyIEVRIEJhbmQgNCBDCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I0X0NfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CNF9DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNF9DX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMURBQzJfRVFfQjRfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjRfQ19XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMyX0VRX0I0X0MgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMjAwICgweDRCMCkgLSBBSUYxIERBQzIgRVEgQmFuZCA0IFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I0X1BHX01BU0sgICAgICAgICAgIDB4RkZGRgkvKiBBSUYxREFDMl9FUV9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjRfUEdfU0hJRlQgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNF9QR19XSURUSCAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxMjAxICgweDRCMSkgLSBBSUYxIERBQzIgRVEgQmFuZCA1IEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjVfQV9NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjFEQUMyX0VRX0I1X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I1X0FfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMl9FUV9CNV9BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNV9BX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMURBQzJfRVFfQjVfQSAtIFsxNTowXSAqLworCisvKgorICogUjEyMDIgKDB4NEIyKSAtIEFJRjEgREFDMiBFUSBCYW5kIDUgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNV9CX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjVfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMyX0VRX0I1X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I1X0JfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYxREFDMl9FUV9CNV9CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTIwMyAoMHg0QjMpIC0gQUlGMSBEQUMyIEVRIEJhbmQgNSBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYxREFDMl9FUV9CNV9QR19NQVNLICAgICAgICAgICAweEZGRkYJLyogQUlGMURBQzJfRVFfQjVfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyX0VRX0I1X1BHX1NISUZUICAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMl9FUV9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJfRVFfQjVfUEdfV0lEVEggICAgICAgICAgICAgIDE2CS8qIEFJRjFEQUMyX0VRX0I1X1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTI4MCAoMHg1MDApIC0gQUlGMiBBREMgTGVmdCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19WVSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJBRENfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfVlVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYyQURDX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkFEQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYyQURDTF9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjJBRENMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkFEQ0xfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjgxICgweDUwMSkgLSBBSUYyIEFEQyBSaWdodCBWb2x1bWUKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19WVSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJBRENfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfVlVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYyQURDX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX1ZVX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkFEQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19WVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX1ZPTF9NQVNLICAgICAgICAgICAgICAgIDB4MDBGRgkvKiBBSUYyQURDUl9WT0wgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgICAwCS8qIEFJRjJBRENSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkFEQ1JfVk9MIC0gWzc6MF0gKi8KKworLyoKKyAqIFIxMjgyICgweDUwMikgLSBBSUYyIERBQyBMZWZ0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1ZVICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMkRBQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJEQUNfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOAkvKiBBSUYyREFDX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjJEQUNMX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ0xfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgOAkvKiBBSUYyREFDTF9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEyODMgKDB4NTAzKSAtIEFJRjIgREFDIFJpZ2h0IFZvbHVtZQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1ZVICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMkRBQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19WVV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJEQUNfVlUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVlVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOAkvKiBBSUYyREFDX1ZVICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1ZVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19WVSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVk9MX01BU0sgICAgICAgICAgICAgICAgMHgwMEZGCS8qIEFJRjJEQUNSX1ZPTCAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ1JfVk9MIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNSX1ZPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgOAkvKiBBSUYyREFDUl9WT0wgLSBbNzowXSAqLworCisvKgorICogUjEyOTYgKDB4NTEwKSAtIEFJRjIgQURDIEZpbHRlcnMKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ180RlMgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEFJRjJBRENfNEZTICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDXzRGU19NQVNLICAgICAgICAgICAgICAgICAweDgwMDAJLyogQUlGMkFEQ180RlMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfNEZTX1NISUZUICAgICAgICAgICAgICAgICAgICAxNQkvKiBBSUYyQURDXzRGUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ180RlNfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENfNEZTICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9IUEYgICAgICAgICAgICAgICAgICAgICAweDEwMDAJLyogQUlGMkFEQ0xfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9IUEZfTUFTSyAgICAgICAgICAgICAgICAweDEwMDAJLyogQUlGMkFEQ0xfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9IUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIJLyogQUlGMkFEQ0xfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9IUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ0xfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9IUEYgICAgICAgICAgICAgICAgICAgICAweDA4MDAJLyogQUlGMkFEQ1JfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9IUEZfTUFTSyAgICAgICAgICAgICAgICAweDA4MDAJLyogQUlGMkFEQ1JfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9IUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgMTEJLyogQUlGMkFEQ1JfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9IUEZfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ1JfSFBGICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0hQRl9NT0RFICAgICAgICAgICAgICAgICAweDAwMDgJLyogQUlGMkFEQ19IUEZfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19IUEZfTU9ERV9NQVNLICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjJBRENfSFBGX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfSFBGX01PREVfU0hJRlQgICAgICAgICAgICAgICAgMwkvKiBBSUYyQURDX0hQRl9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0hQRl9NT0RFX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ19IUEZfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ19IUEZfQ1VUX01BU0sgICAgICAgICAgICAgMHgwMDA3CS8qIEFJRjJBRENfSFBGX0NVVCAtIFsyOjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDX0hQRl9DVVRfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogQUlGMkFEQ19IUEZfQ1VUIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENfSFBGX0NVVF9XSURUSCAgICAgICAgICAgICAgICAgMwkvKiBBSUYyQURDX0hQRl9DVVQgLSBbMjowXSAqLworCisvKgorICogUjEzMTIgKDB4NTIwKSAtIEFJRjIgREFDIEZpbHRlcnMgKDEpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURSAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBBSUYyREFDX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURV9NQVNLICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBBSUYyREFDX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgOQkvKiBBSUYyREFDX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTU9OTyAgICAgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYyREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTU9OT19NQVNLICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYyREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTU9OT19TSElGVCAgICAgICAgICAgICAgICAgICAgNwkvKiBBSUYyREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTU9OT19XSURUSCAgICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX01PTk8gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURVJBVEUgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBBSUYyREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX01VVEVSQVRFX01BU0sgICAgICAgICAgICAweDAwMjAJLyogQUlGMkRBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19NVVRFUkFURV9TSElGVCAgICAgICAgICAgICAgICA1CS8qIEFJRjJEQUNfTVVURVJBVEUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfTVVURVJBVEVfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX01VVEVSQVRFICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1VOTVVURV9SQU1QICAgICAgICAgICAgICAweDAwMTAJLyogQUlGMkRBQ19VTk1VVEVfUkFNUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19VTk1VVEVfUkFNUF9NQVNLICAgICAgICAgMHgwMDEwCS8qIEFJRjJEQUNfVU5NVVRFX1JBTVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfVU5NVVRFX1JBTVBfU0hJRlQgICAgICAgICAgICAgNAkvKiBBSUYyREFDX1VOTVVURV9SQU1QICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX1VOTVVURV9SQU1QX1dJRFRIICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19VTk1VVEVfUkFNUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19ERUVNUF9NQVNLICAgICAgICAgICAgICAgMHgwMDA2CS8qIEFJRjJEQUNfREVFTVAgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19ERUVNUF9TSElGVCAgICAgICAgICAgICAgICAgICAxCS8qIEFJRjJEQUNfREVFTVAgLSBbMjoxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19ERUVNUF9XSURUSCAgICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEQUNfREVFTVAgLSBbMjoxXSAqLworCisvKgorICogUjEzMTMgKDB4NTIxKSAtIEFJRjIgREFDIEZpbHRlcnMgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfM0RfR0FJTl9NQVNLICAgICAgICAgICAgIDB4M0UwMAkvKiBBSUYyREFDXzNEX0dBSU4gLSBbMTM6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfM0RfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgOQkvKiBBSUYyREFDXzNEX0dBSU4gLSBbMTM6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfM0RfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgNQkvKiBBSUYyREFDXzNEX0dBSU4gLSBbMTM6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfM0RfRU5BICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYyREFDXzNEX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ18zRF9FTkFfTUFTSyAgICAgICAgICAgICAgMHgwMTAwCS8qIEFJRjJEQUNfM0RfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDXzNEX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkRBQ18zRF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfM0RfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDXzNEX0VOQSAqLworCisvKgorICogUjEzNDQgKDB4NTQwKSAtIEFJRjIgRFJDICgxKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfUk1TX01BU0sgICAgICAgICAweEY4MDAJLyogQUlGMkRSQ19TSUdfREVUX1JNUyAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfU0lHX0RFVF9STVNfU0hJRlQgICAgICAgICAgICAxMQkvKiBBSUYyRFJDX1NJR19ERVRfUk1TIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX1JNU19XSURUSCAgICAgICAgICAgICA1CS8qIEFJRjJEUkNfU0lHX0RFVF9STVMgLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfUEtfTUFTSyAgICAgICAgICAweDA2MDAJLyogQUlGMkRSQ19TSUdfREVUX1BLIC0gWzEwOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfUEtfU0hJRlQgICAgICAgICAgICAgIDkJLyogQUlGMkRSQ19TSUdfREVUX1BLIC0gWzEwOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfUEtfV0lEVEggICAgICAgICAgICAgIDIJLyogQUlGMkRSQ19TSUdfREVUX1BLIC0gWzEwOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX05HX0VOQSAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMkRSQ19OR19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTkdfRU5BX01BU0sgICAgICAgICAgICAgIDB4MDEwMAkvKiBBSUYyRFJDX05HX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19OR19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICA4CS8qIEFJRjJEUkNfTkdfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX05HX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRSQ19OR19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfU0lHX0RFVF9NT0RFICAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYyRFJDX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX01PREVfTUFTSyAgICAgICAgMHgwMDgwCS8qIEFJRjJEUkNfU0lHX0RFVF9NT0RFICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfTU9ERV9TSElGVCAgICAgICAgICAgIDcJLyogQUlGMkRSQ19TSUdfREVUX01PREUgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfU0lHX0RFVF9NT0RFX1dJRFRIICAgICAgICAgICAgMQkvKiBBSUYyRFJDX1NJR19ERVRfTU9ERSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEFJRjJEUkNfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX01BU0sgICAgICAgICAgICAgMHgwMDQwCS8qIEFJRjJEUkNfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX1NISUZUICAgICAgICAgICAgICAgICA2CS8qIEFJRjJEUkNfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIEFJRjJEUkNfU0lHX0RFVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFMl9PUF9FTkEgICAgICAgICAgICAgMHgwMDIwCS8qIEFJRjJEUkNfS05FRTJfT1BfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX09QX0VOQV9NQVNLICAgICAgICAweDAwMjAJLyogQUlGMkRSQ19LTkVFMl9PUF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfS05FRTJfT1BfRU5BX1NISUZUICAgICAgICAgICAgNQkvKiBBSUYyRFJDX0tORUUyX09QX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFMl9PUF9FTkFfV0lEVEggICAgICAgICAgICAxCS8qIEFJRjJEUkNfS05FRTJfT1BfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1FSICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogQUlGMkRSQ19RUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19RUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFJRjJEUkNfUVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfUVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYyRFJDX1FSICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1FSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogQUlGMkRSQ19RUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19BTlRJQ0xJUCAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEFJRjJEUkNfQU5USUNMSVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfQU5USUNMSVBfTUFTSyAgICAgICAgICAgIDB4MDAwOAkvKiBBSUYyRFJDX0FOVElDTElQICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0FOVElDTElQX1NISUZUICAgICAgICAgICAgICAgIDMJLyogQUlGMkRSQ19BTlRJQ0xJUCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19BTlRJQ0xJUF9XSURUSCAgICAgICAgICAgICAgICAxCS8qIEFJRjJEUkNfQU5USUNMSVAgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRFJDX0VOQSAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRFJDX0VOQV9NQVNLICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRFJDX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgMgkvKiBBSUYyREFDX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRFJDX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0RSQ19FTkEgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYyQURDTF9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDTF9EUkNfRU5BX01BU0sgICAgICAgICAgICAweDAwMDIJLyogQUlGMkFEQ0xfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ0xfRFJDX0VOQV9TSElGVCAgICAgICAgICAgICAgICAxCS8qIEFJRjJBRENMX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENMX0RSQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgMQkvKiBBSUYyQURDTF9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9EUkNfRU5BICAgICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMkFEQ1JfRFJDX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkFEQ1JfRFJDX0VOQV9NQVNLICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJBRENSX0RSQ19FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJBRENSX0RSQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYyQURDUl9EUkNfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyQURDUl9EUkNfRU5BX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogQUlGMkFEQ1JfRFJDX0VOQSAqLworCisvKgorICogUjEzNDUgKDB4NTQxKSAtIEFJRjIgRFJDICgyKQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0FUS19NQVNLICAgICAgICAgICAgICAgICAweDFFMDAJLyogQUlGMkRSQ19BVEsgLSBbMTI6OV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfQVRLX1NISUZUICAgICAgICAgICAgICAgICAgICAgOQkvKiBBSUYyRFJDX0FUSyAtIFsxMjo5XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19BVEtfV0lEVEggICAgICAgICAgICAgICAgICAgICA0CS8qIEFJRjJEUkNfQVRLIC0gWzEyOjldICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0RDWV9NQVNLICAgICAgICAgICAgICAgICAweDAxRTAJLyogQUlGMkRSQ19EQ1kgLSBbODo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19EQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgICA1CS8qIEFJRjJEUkNfRENZIC0gWzg6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfRENZX1dJRFRIICAgICAgICAgICAgICAgICAgICAgNAkvKiBBSUYyRFJDX0RDWSAtIFs4OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX01JTkdBSU5fTUFTSyAgICAgICAgICAgICAweDAwMUMJLyogQUlGMkRSQ19NSU5HQUlOIC0gWzQ6Ml0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTUlOR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgMgkvKiBBSUYyRFJDX01JTkdBSU4gLSBbNDoyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAzCS8qIEFJRjJEUkNfTUlOR0FJTiAtIFs0OjJdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX01BWEdBSU5fTUFTSyAgICAgICAgICAgICAweDAwMDMJLyogQUlGMkRSQ19NQVhHQUlOIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTUFYR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyRFJDX01BWEdBSU4gLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19NQVhHQUlOX1dJRFRIICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEUkNfTUFYR0FJTiAtIFsxOjBdICovCisKKy8qCisgKiBSMTM0NiAoMHg1NDIpIC0gQUlGMiBEUkMgKDMpCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTkdfTUlOR0FJTl9NQVNLICAgICAgICAgIDB4RjAwMAkvKiBBSUYyRFJDX05HX01JTkdBSU4gLSBbMTU6MTJdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX05HX01JTkdBSU5fU0hJRlQgICAgICAgICAgICAgMTIJLyogQUlGMkRSQ19OR19NSU5HQUlOIC0gWzE1OjEyXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19OR19NSU5HQUlOX1dJRFRIICAgICAgICAgICAgICA0CS8qIEFJRjJEUkNfTkdfTUlOR0FJTiAtIFsxNToxMl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTkdfRVhQX01BU0sgICAgICAgICAgICAgIDB4MEMwMAkvKiBBSUYyRFJDX05HX0VYUCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTkdfRVhQX1NISUZUICAgICAgICAgICAgICAgICAxMAkvKiBBSUYyRFJDX05HX0VYUCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTkdfRVhQX1dJRFRIICAgICAgICAgICAgICAgICAgMgkvKiBBSUYyRFJDX05HX0VYUCAtIFsxMToxMF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfUVJfVEhSX01BU0sgICAgICAgICAgICAgIDB4MDMwMAkvKiBBSUYyRFJDX1FSX1RIUiAtIFs5OjhdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1FSX1RIUl9TSElGVCAgICAgICAgICAgICAgICAgIDgJLyogQUlGMkRSQ19RUl9USFIgLSBbOTo4XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19RUl9USFJfV0lEVEggICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEUkNfUVJfVEhSIC0gWzk6OF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfUVJfRENZX01BU0sgICAgICAgICAgICAgIDB4MDBDMAkvKiBBSUYyRFJDX1FSX0RDWSAtIFs3OjZdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1FSX0RDWV9TSElGVCAgICAgICAgICAgICAgICAgIDYJLyogQUlGMkRSQ19RUl9EQ1kgLSBbNzo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19RUl9EQ1lfV0lEVEggICAgICAgICAgICAgICAgICAyCS8qIEFJRjJEUkNfUVJfRENZIC0gWzc6Nl0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfSElfQ09NUF9NQVNLICAgICAgICAgICAgIDB4MDAzOAkvKiBBSUYyRFJDX0hJX0NPTVAgLSBbNTozXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19ISV9DT01QX1NISUZUICAgICAgICAgICAgICAgICAzCS8qIEFJRjJEUkNfSElfQ09NUCAtIFs1OjNdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0hJX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgIDMJLyogQUlGMkRSQ19ISV9DT01QIC0gWzU6M10gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfTE9fQ09NUF9NQVNLICAgICAgICAgICAgIDB4MDAwNwkvKiBBSUYyRFJDX0xPX0NPTVAgLSBbMjowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19MT19DT01QX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEUkNfTE9fQ09NUCAtIFsyOjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0xPX0NPTVBfV0lEVEggICAgICAgICAgICAgICAgIDMJLyogQUlGMkRSQ19MT19DT01QIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxMzQ3ICgweDU0MykgLSBBSUYyIERSQyAoNCkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFX0lQX01BU0sgICAgICAgICAgICAgMHgwN0UwCS8qIEFJRjJEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFX0lQX1NISUZUICAgICAgICAgICAgICAgICA1CS8qIEFJRjJEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFX0lQX1dJRFRIICAgICAgICAgICAgICAgICA2CS8qIEFJRjJEUkNfS05FRV9JUCAtIFsxMDo1XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19LTkVFX09QX01BU0sgICAgICAgICAgICAgMHgwMDFGCS8qIEFJRjJEUkNfS05FRV9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUVfT1BfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRSQ19LTkVFX09QIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfS05FRV9PUF9XSURUSCAgICAgICAgICAgICAgICAgNQkvKiBBSUYyRFJDX0tORUVfT1AgLSBbNDowXSAqLworCisvKgorICogUjEzNDggKDB4NTQ0KSAtIEFJRjIgRFJDICg1KQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX0lQX01BU0sgICAgICAgICAgICAweDAzRTAJLyogQUlGMkRSQ19LTkVFMl9JUCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX0lQX1NISUZUICAgICAgICAgICAgICAgIDUJLyogQUlGMkRSQ19LTkVFMl9JUCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX0lQX1dJRFRIICAgICAgICAgICAgICAgIDUJLyogQUlGMkRSQ19LTkVFMl9JUCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX09QX01BU0sgICAgICAgICAgICAweDAwMUYJLyogQUlGMkRSQ19LTkVFMl9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX09QX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMkRSQ19LTkVFMl9PUCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX0tORUUyX09QX1dJRFRIICAgICAgICAgICAgICAgIDUJLyogQUlGMkRSQ19LTkVFMl9PUCAtIFs0OjBdICovCisKKy8qCisgKiBSMTQwOCAoMHg1ODApIC0gQUlGMiBFUSBHYWlucyAoMSkKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9HQUlOX01BU0sgICAgICAgICAgMHhGODAwCS8qIEFJRjJEQUNfRVFfQjFfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjFfR0FJTl9TSElGVCAgICAgICAgICAgICAxMQkvKiBBSUYyREFDX0VRX0IxX0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IxX0dBSU5fV0lEVEggICAgICAgICAgICAgIDUJLyogQUlGMkRBQ19FUV9CMV9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMl9HQUlOX01BU0sgICAgICAgICAgMHgwN0MwCS8qIEFJRjJEQUNfRVFfQjJfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMl9HQUlOX1NISUZUICAgICAgICAgICAgICA2CS8qIEFJRjJEQUNfRVFfQjJfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMl9HQUlOX1dJRFRIICAgICAgICAgICAgICA1CS8qIEFJRjJEQUNfRVFfQjJfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CM19HQUlOX01BU0sgICAgICAgICAgMHgwMDNFCS8qIEFJRjJEQUNfRVFfQjNfR0FJTiAtIFs1OjFdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0dBSU5fU0hJRlQgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ19FUV9CM19HQUlOIC0gWzU6MV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjNfR0FJTl9XSURUSCAgICAgICAgICAgICAgNQkvKiBBSUYyREFDX0VRX0IzX0dBSU4gLSBbNToxXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9FTkEgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJEQUNfRVFfRU5BICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0VOQV9NQVNLICAgICAgICAgICAgICAweDAwMDEJLyogQUlGMkRBQ19FUV9FTkEgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0VOQSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIEFJRjJEQUNfRVFfRU5BICovCisKKy8qCisgKiBSMTQwOSAoMHg1ODEpIC0gQUlGMiBFUSBHYWlucyAoMikKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9HQUlOX01BU0sgICAgICAgICAgMHhGODAwCS8qIEFJRjJEQUNfRVFfQjRfR0FJTiAtIFsxNToxMV0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjRfR0FJTl9TSElGVCAgICAgICAgICAgICAxMQkvKiBBSUYyREFDX0VRX0I0X0dBSU4gLSBbMTU6MTFdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0I0X0dBSU5fV0lEVEggICAgICAgICAgICAgIDUJLyogQUlGMkRBQ19FUV9CNF9HQUlOIC0gWzE1OjExXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNV9HQUlOX01BU0sgICAgICAgICAgMHgwN0MwCS8qIEFJRjJEQUNfRVFfQjVfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNV9HQUlOX1NISUZUICAgICAgICAgICAgICA2CS8qIEFJRjJEQUNfRVFfQjVfR0FJTiAtIFsxMDo2XSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNV9HQUlOX1dJRFRIICAgICAgICAgICAgICA1CS8qIEFJRjJEQUNfRVFfQjVfR0FJTiAtIFsxMDo2XSAqLworCisvKgorICogUjE0MTAgKDB4NTgyKSAtIEFJRjIgRVEgQmFuZCAxIEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9BX01BU0sgICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9BX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjFfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9BX1dJRFRIICAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjFfQSAtIFsxNTowXSAqLworCisvKgorICogUjE0MTEgKDB4NTgzKSAtIEFJRjIgRVEgQmFuZCAxIEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9CX01BU0sgICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjFfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9CX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjFfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9CX1dJRFRIICAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjFfQiAtIFsxNTowXSAqLworCisvKgorICogUjE0MTIgKDB4NTg0KSAtIEFJRjIgRVEgQmFuZCAxIFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjFfUEdfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0IxX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IxX1BHX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ19FUV9CMV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMV9QR19XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjFfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDEzICgweDU4NSkgLSBBSUYyIEVRIEJhbmQgMiBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQV9NQVNLICAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0IyX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQV9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0IyX0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQV9XSURUSCAgICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0IyX0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDE0ICgweDU4NikgLSBBSUYyIEVRIEJhbmQgMiBCCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQl9NQVNLICAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQl9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0IyX0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQl9XSURUSCAgICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0IyX0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDE1ICgweDU4NykgLSBBSUYyIEVRIEJhbmQgMiBDCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQ19NQVNLICAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0IyX0MgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQ19TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0IyX0MgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfQ19XSURUSCAgICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0IyX0MgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDE2ICgweDU4OCkgLSBBSUYyIEVRIEJhbmQgMiBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IyX1BHX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMkRBQ19FUV9CMl9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CMl9QR19TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjJfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjJfUEdfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0IyX1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTQxNyAoMHg1ODkpIC0gQUlGMiBFUSBCYW5kIDMgQQorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0FfTUFTSyAgICAgICAgICAgICAweEZGRkYJLyogQUlGMkRBQ19FUV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0FfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ19FUV9CM19BIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0FfV0lEVEggICAgICAgICAgICAgICAgMTYJLyogQUlGMkRBQ19FUV9CM19BIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTQxOCAoMHg1OEEpIC0gQUlGMiBFUSBCYW5kIDMgQgorICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0JfTUFTSyAgICAgICAgICAgICAweEZGRkYJLyogQUlGMkRBQ19FUV9CM19CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0JfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ19FUV9CM19CIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0JfV0lEVEggICAgICAgICAgICAgICAgMTYJLyogQUlGMkRBQ19FUV9CM19CIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTQxOSAoMHg1OEIpIC0gQUlGMiBFUSBCYW5kIDMgQworICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0NfTUFTSyAgICAgICAgICAgICAweEZGRkYJLyogQUlGMkRBQ19FUV9CM19DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0NfU0hJRlQgICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ19FUV9CM19DIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX0NfV0lEVEggICAgICAgICAgICAgICAgMTYJLyogQUlGMkRBQ19FUV9CM19DIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTQyMCAoMHg1OEMpIC0gQUlGMiBFUSBCYW5kIDMgUEcKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CM19QR19NQVNLICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjNfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjNfUEdfU0hJRlQgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0IzX1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0IzX1BHX1dJRFRIICAgICAgICAgICAgICAgMTYJLyogQUlGMkRBQ19FUV9CM19QRyAtIFsxNTowXSAqLworCisvKgorICogUjE0MjEgKDB4NThEKSAtIEFJRjIgRVEgQmFuZCA0IEEKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9BX01BU0sgICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjRfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9BX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjRfQSAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9BX1dJRFRIICAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjRfQSAtIFsxNTowXSAqLworCisvKgorICogUjE0MjIgKDB4NThFKSAtIEFJRjIgRVEgQmFuZCA0IEIKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9CX01BU0sgICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9CX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjRfQiAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9CX1dJRFRIICAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjRfQiAtIFsxNTowXSAqLworCisvKgorICogUjE0MjMgKDB4NThGKSAtIEFJRjIgRVEgQmFuZCA0IEMKKyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9DX01BU0sgICAgICAgICAgICAgMHhGRkZGCS8qIEFJRjJEQUNfRVFfQjRfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9DX1NISUZUICAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjRfQyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9DX1dJRFRIICAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjRfQyAtIFsxNTowXSAqLworCisvKgorICogUjE0MjQgKDB4NTkwKSAtIEFJRjIgRVEgQmFuZCA0IFBHCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjRfUEdfTUFTSyAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0I0X1BHIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0I0X1BHX1NISUZUICAgICAgICAgICAgICAgIDAJLyogQUlGMkRBQ19FUV9CNF9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNF9QR19XSURUSCAgICAgICAgICAgICAgIDE2CS8qIEFJRjJEQUNfRVFfQjRfUEcgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDI1ICgweDU5MSkgLSBBSUYyIEVRIEJhbmQgNSBBCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQV9NQVNLICAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0I1X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQV9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0I1X0EgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQV9XSURUSCAgICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0I1X0EgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDI2ICgweDU5MikgLSBBSUYyIEVRIEJhbmQgNSBCCisgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQl9NQVNLICAgICAgICAgICAgIDB4RkZGRgkvKiBBSUYyREFDX0VRX0I1X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQl9TSElGVCAgICAgICAgICAgICAgICAgMAkvKiBBSUYyREFDX0VRX0I1X0IgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfQl9XSURUSCAgICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0I1X0IgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNDI3ICgweDU5MykgLSBBSUYyIEVRIEJhbmQgNSBQRworICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDX0VRX0I1X1BHX01BU0sgICAgICAgICAgICAweEZGRkYJLyogQUlGMkRBQ19FUV9CNV9QRyAtIFsxNTowXSAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ19FUV9CNV9QR19TSElGVCAgICAgICAgICAgICAgICAwCS8qIEFJRjJEQUNfRVFfQjVfUEcgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNfRVFfQjVfUEdfV0lEVEggICAgICAgICAgICAgICAxNgkvKiBBSUYyREFDX0VRX0I1X1BHIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTUzNiAoMHg2MDApIC0gREFDMSBNaXhlciBWb2x1bWVzCisgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfREFDMV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDNFMAkvKiBBRENSX0RBQzFfVk9MIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfREFDMV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgNQkvKiBBRENSX0RBQzFfVk9MIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfREFDMV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNQkvKiBBRENSX0RBQzFfVk9MIC0gWzk6NV0gKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfREFDMV9WT0xfTUFTSyAgICAgICAgICAgICAgIDB4MDAxRgkvKiBBRENMX0RBQzFfVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfREFDMV9WT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgMAkvKiBBRENMX0RBQzFfVk9MIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfREFDMV9WT0xfV0lEVEggICAgICAgICAgICAgICAgICAgNQkvKiBBRENMX0RBQzFfVk9MIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNTM3ICgweDYwMSkgLSBEQUMxIExlZnQgTWl4ZXIgUm91dGluZworICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzFMICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogQURDUl9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMxTF9NQVNLICAgICAgICAgICAgICAgMHgwMDIwCS8qIEFEQ1JfVE9fREFDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfVE9fREFDMUxfU0hJRlQgICAgICAgICAgICAgICAgICAgNQkvKiBBRENSX1RPX0RBQzFMICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzFMX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQURDUl9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMxTCAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFEQ0xfVE9fREFDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMUxfTUFTSyAgICAgICAgICAgICAgIDB4MDAxMAkvKiBBRENMX1RPX0RBQzFMICovCisjZGVmaW5lIFdNODk5NV9BRENMX1RPX0RBQzFMX1NISUZUICAgICAgICAgICAgICAgICAgIDQJLyogQURDTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMxTF9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFEQ0xfVE9fREFDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0RBQzFMICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfVE9fREFDMUxfTUFTSyAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJEQUNMX1RPX0RBQzFMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19EQUMxTF9TSElGVCAgICAgICAgICAgICAgIDIJLyogQUlGMkRBQ0xfVE9fREFDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0RBQzFMX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX1RPX0RBQzFMICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFEQUMyTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX1RPX0RBQzFMX01BU0sgICAgICAgICAgMHgwMDAyCS8qIEFJRjFEQUMyTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX1RPX0RBQzFMX1NISUZUICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJMX1RPX0RBQzFMX1dJRFRIICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFMX1RPX0RBQzFMICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMxTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFMX1RPX0RBQzFMX01BU0sgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMxTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFMX1RPX0RBQzFMX1NISUZUICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxTF9UT19EQUMxTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFMX1RPX0RBQzFMX1dJRFRIICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMxTF9UT19EQUMxTCAqLworCisvKgorICogUjE1MzggKDB4NjAyKSAtIERBQzEgUmlnaHQgTWl4ZXIgUm91dGluZworICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzFSICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogQURDUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMxUl9NQVNLICAgICAgICAgICAgICAgMHgwMDIwCS8qIEFEQ1JfVE9fREFDMVIgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfVE9fREFDMVJfU0hJRlQgICAgICAgICAgICAgICAgICAgNQkvKiBBRENSX1RPX0RBQzFSICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzFSX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogQURDUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMxUiAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIEFEQ0xfVE9fREFDMVIgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMVJfTUFTSyAgICAgICAgICAgICAgIDB4MDAxMAkvKiBBRENMX1RPX0RBQzFSICovCisjZGVmaW5lIFdNODk5NV9BRENMX1RPX0RBQzFSX1NISUZUICAgICAgICAgICAgICAgICAgIDQJLyogQURDTF9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMxUl9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFEQ0xfVE9fREFDMVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNSX1RPX0RBQzFSICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fREFDMVJfTUFTSyAgICAgICAgICAgMHgwMDA0CS8qIEFJRjJEQUNSX1RPX0RBQzFSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19EQUMxUl9TSElGVCAgICAgICAgICAgICAgIDIJLyogQUlGMkRBQ1JfVE9fREFDMVIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNSX1RPX0RBQzFSX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBBSUYyREFDUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1RPX0RBQzFSICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFJRjFEQUMyUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1RPX0RBQzFSX01BU0sgICAgICAgICAgMHgwMDAyCS8qIEFJRjFEQUMyUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1RPX0RBQzFSX1NISUZUICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzJSX1RPX0RBQzFSX1dJRFRIICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMyUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1RPX0RBQzFSICAgICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMxUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1RPX0RBQzFSX01BU0sgICAgICAgICAgMHgwMDAxCS8qIEFJRjFEQUMxUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1RPX0RBQzFSX1NISUZUICAgICAgICAgICAgICAwCS8qIEFJRjFEQUMxUl9UT19EQUMxUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMURBQzFSX1RPX0RBQzFSX1dJRFRIICAgICAgICAgICAgICAxCS8qIEFJRjFEQUMxUl9UT19EQUMxUiAqLworCisvKgorICogUjE1MzkgKDB4NjAzKSAtIERBQzIgTWl4ZXIgVm9sdW1lcworICovCisjZGVmaW5lIFdNODk5NV9BRENSX0RBQzJfVk9MX01BU0sgICAgICAgICAgICAgICAweDAzRTAJLyogQURDUl9EQUMyX1ZPTCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BRENSX0RBQzJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDUJLyogQURDUl9EQUMyX1ZPTCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BRENSX0RBQzJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDUJLyogQURDUl9EQUMyX1ZPTCAtIFs5OjVdICovCisjZGVmaW5lIFdNODk5NV9BRENMX0RBQzJfVk9MX01BU0sgICAgICAgICAgICAgICAweDAwMUYJLyogQURDTF9EQUMyX1ZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BRENMX0RBQzJfVk9MX1NISUZUICAgICAgICAgICAgICAgICAgIDAJLyogQURDTF9EQUMyX1ZPTCAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9BRENMX0RBQzJfVk9MX1dJRFRIICAgICAgICAgICAgICAgICAgIDUJLyogQURDTF9EQUMyX1ZPTCAtIFs0OjBdICovCisKKy8qCisgKiBSMTU0MCAoMHg2MDQpIC0gREFDMiBMZWZ0IE1peGVyIFJvdXRpbmcKKyAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMyTCAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEFEQ1JfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfVE9fREFDMkxfTUFTSyAgICAgICAgICAgICAgIDB4MDAyMAkvKiBBRENSX1RPX0RBQzJMICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzJMX1NISUZUICAgICAgICAgICAgICAgICAgIDUJLyogQURDUl9UT19EQUMyTCAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMyTF9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFEQ1JfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMkwgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBBRENMX1RPX0RBQzJMICovCisjZGVmaW5lIFdNODk5NV9BRENMX1RPX0RBQzJMX01BU0sgICAgICAgICAgICAgICAweDAwMTAJLyogQURDTF9UT19EQUMyTCAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMyTF9TSElGVCAgICAgICAgICAgICAgICAgICA0CS8qIEFEQ0xfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMkxfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBRENMX1RPX0RBQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19EQUMyTCAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMkRBQ0xfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0RBQzJMX01BU0sgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDTF9UT19EQUMyTCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ0xfVE9fREFDMkxfU0hJRlQgICAgICAgICAgICAgICAyCS8qIEFJRjJEQUNMX1RPX0RBQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19EQUMyTF9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ0xfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9UT19EQUMyTCAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYxREFDMkxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9UT19EQUMyTF9NQVNLICAgICAgICAgIDB4MDAwMgkvKiBBSUYxREFDMkxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9UT19EQUMyTF9TSElGVCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMkxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyTF9UT19EQUMyTF9XSURUSCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMkxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9UT19EQUMyTCAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMUxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9UT19EQUMyTF9NQVNLICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMUxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9UT19EQUMyTF9TSElGVCAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMUxfVE9fREFDMkwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxTF9UT19EQUMyTF9XSURUSCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMUxfVE9fREFDMkwgKi8KKworLyoKKyAqIFIxNTQxICgweDYwNSkgLSBEQUMyIFJpZ2h0IE1peGVyIFJvdXRpbmcKKyAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMyUiAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEFEQ1JfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FEQ1JfVE9fREFDMlJfTUFTSyAgICAgICAgICAgICAgIDB4MDAyMAkvKiBBRENSX1RPX0RBQzJSICovCisjZGVmaW5lIFdNODk5NV9BRENSX1RPX0RBQzJSX1NISUZUICAgICAgICAgICAgICAgICAgIDUJLyogQURDUl9UT19EQUMyUiAqLworI2RlZmluZSBXTTg5OTVfQURDUl9UT19EQUMyUl9XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEFEQ1JfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMlIgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBBRENMX1RPX0RBQzJSICovCisjZGVmaW5lIFdNODk5NV9BRENMX1RPX0RBQzJSX01BU0sgICAgICAgICAgICAgICAweDAwMTAJLyogQURDTF9UT19EQUMyUiAqLworI2RlZmluZSBXTTg5OTVfQURDTF9UT19EQUMyUl9TSElGVCAgICAgICAgICAgICAgICAgICA0CS8qIEFEQ0xfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FEQ0xfVE9fREFDMlJfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBBRENMX1RPX0RBQzJSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19EQUMyUiAgICAgICAgICAgICAgICAweDAwMDQJLyogQUlGMkRBQ1JfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNSX1RPX0RBQzJSX01BU0sgICAgICAgICAgIDB4MDAwNAkvKiBBSUYyREFDUl9UT19EQUMyUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fREFDMlJfU0hJRlQgICAgICAgICAgICAgICAyCS8qIEFJRjJEQUNSX1RPX0RBQzJSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19EQUMyUl9XSURUSCAgICAgICAgICAgICAgIDEJLyogQUlGMkRBQ1JfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9UT19EQUMyUiAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBSUYxREFDMlJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9UT19EQUMyUl9NQVNLICAgICAgICAgIDB4MDAwMgkvKiBBSUYxREFDMlJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9UT19EQUMyUl9TSElGVCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMlJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMyUl9UT19EQUMyUl9XSURUSCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMlJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxUl9UT19EQUMyUiAgICAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMVJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxUl9UT19EQUMyUl9NQVNLICAgICAgICAgIDB4MDAwMQkvKiBBSUYxREFDMVJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxUl9UT19EQUMyUl9TSElGVCAgICAgICAgICAgICAgMAkvKiBBSUYxREFDMVJfVE9fREFDMlIgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEQUMxUl9UT19EQUMyUl9XSURUSCAgICAgICAgICAgICAgMQkvKiBBSUYxREFDMVJfVE9fREFDMlIgKi8KKworLyoKKyAqIFIxNTQyICgweDYwNikgLSBBSUYxIEFEQzEgTGVmdCBNaXhlciBSb3V0aW5nCisgKi8KKyNkZWZpbmUgV004OTk1X0FEQzFMX1RPX0FJRjFBREMxTCAgICAgICAgICAgICAgIDB4MDAwMgkvKiBBREMxTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FEQzFMX1RPX0FJRjFBREMxTF9NQVNLICAgICAgICAgIDB4MDAwMgkvKiBBREMxTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FEQzFMX1RPX0FJRjFBREMxTF9TSElGVCAgICAgICAgICAgICAgMQkvKiBBREMxTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FEQzFMX1RPX0FJRjFBREMxTF9XSURUSCAgICAgICAgICAgICAgMQkvKiBBREMxTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0FJRjFBREMxTCAgICAgICAgICAgIDB4MDAwMQkvKiBBSUYyREFDTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0FJRjFBREMxTF9NQVNLICAgICAgIDB4MDAwMQkvKiBBSUYyREFDTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0FJRjFBREMxTF9TSElGVCAgICAgICAgICAgMAkvKiBBSUYyREFDTF9UT19BSUYxQURDMUwgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEQUNMX1RPX0FJRjFBREMxTF9XSURUSCAgICAgICAgICAgMQkvKiBBSUYyREFDTF9UT19BSUYxQURDMUwgKi8KKworLyoKKyAqIFIxNTQzICgweDYwNykgLSBBSUYxIEFEQzEgUmlnaHQgTWl4ZXIgUm91dGluZworICovCisjZGVmaW5lIFdNODk5NV9BREMxUl9UT19BSUYxQURDMVIgICAgICAgICAgICAgICAweDAwMDIJLyogQURDMVJfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BREMxUl9UT19BSUYxQURDMVJfTUFTSyAgICAgICAgICAweDAwMDIJLyogQURDMVJfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BREMxUl9UT19BSUYxQURDMVJfU0hJRlQgICAgICAgICAgICAgIDEJLyogQURDMVJfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BREMxUl9UT19BSUYxQURDMVJfV0lEVEggICAgICAgICAgICAgIDEJLyogQURDMVJfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19BSUYxQURDMVIgICAgICAgICAgICAweDAwMDEJLyogQUlGMkRBQ1JfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19BSUYxQURDMVJfTUFTSyAgICAgICAweDAwMDEJLyogQUlGMkRBQ1JfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19BSUYxQURDMVJfU0hJRlQgICAgICAgICAgIDAJLyogQUlGMkRBQ1JfVE9fQUlGMUFEQzFSICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDUl9UT19BSUYxQURDMVJfV0lEVEggICAgICAgICAgIDEJLyogQUlGMkRBQ1JfVE9fQUlGMUFEQzFSICovCisKKy8qCisgKiBSMTU0NCAoMHg2MDgpIC0gQUlGMSBBREMyIExlZnQgTWl4ZXIgUm91dGluZworICovCisjZGVmaW5lIFdNODk5NV9BREMyTF9UT19BSUYxQURDMkwgICAgICAgICAgICAgICAweDAwMDIJLyogQURDMkxfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BREMyTF9UT19BSUYxQURDMkxfTUFTSyAgICAgICAgICAweDAwMDIJLyogQURDMkxfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BREMyTF9UT19BSUYxQURDMkxfU0hJRlQgICAgICAgICAgICAgIDEJLyogQURDMkxfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BREMyTF9UT19BSUYxQURDMkxfV0lEVEggICAgICAgICAgICAgIDEJLyogQURDMkxfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19BSUYxQURDMkwgICAgICAgICAgICAweDAwMDEJLyogQUlGMkRBQ0xfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19BSUYxQURDMkxfTUFTSyAgICAgICAweDAwMDEJLyogQUlGMkRBQ0xfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19BSUYxQURDMkxfU0hJRlQgICAgICAgICAgIDAJLyogQUlGMkRBQ0xfVE9fQUlGMUFEQzJMICovCisjZGVmaW5lIFdNODk5NV9BSUYyREFDTF9UT19BSUYxQURDMkxfV0lEVEggICAgICAgICAgIDEJLyogQUlGMkRBQ0xfVE9fQUlGMUFEQzJMICovCisKKy8qCisgKiBSMTU0NSAoMHg2MDkpIC0gQUlGMSBBREMyIFJpZ2h0IG1peGVyIFJvdXRpbmcKKyAqLworI2RlZmluZSBXTTg5OTVfQURDMlJfVE9fQUlGMUFEQzJSICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFEQzJSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQURDMlJfVE9fQUlGMUFEQzJSX01BU0sgICAgICAgICAgMHgwMDAyCS8qIEFEQzJSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQURDMlJfVE9fQUlGMUFEQzJSX1NISUZUICAgICAgICAgICAgICAxCS8qIEFEQzJSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQURDMlJfVE9fQUlGMUFEQzJSX1dJRFRIICAgICAgICAgICAgICAxCS8qIEFEQzJSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fQUlGMUFEQzJSICAgICAgICAgICAgMHgwMDAxCS8qIEFJRjJEQUNSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fQUlGMUFEQzJSX01BU0sgICAgICAgMHgwMDAxCS8qIEFJRjJEQUNSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fQUlGMUFEQzJSX1NISUZUICAgICAgICAgICAwCS8qIEFJRjJEQUNSX1RPX0FJRjFBREMyUiAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRBQ1JfVE9fQUlGMUFEQzJSX1dJRFRIICAgICAgICAgICAxCS8qIEFJRjJEQUNSX1RPX0FJRjFBREMyUiAqLworCisvKgorICogUjE1NTIgKDB4NjEwKSAtIERBQyBTb2Z0bXV0ZQorICovCisjZGVmaW5lIFdNODk5NV9EQUNfU09GVE1VVEVNT0RFICAgICAgICAgICAgICAgICAweDAwMDIJLyogREFDX1NPRlRNVVRFTU9ERSAqLworI2RlZmluZSBXTTg5OTVfREFDX1NPRlRNVVRFTU9ERV9NQVNLICAgICAgICAgICAgMHgwMDAyCS8qIERBQ19TT0ZUTVVURU1PREUgKi8KKyNkZWZpbmUgV004OTk1X0RBQ19TT0ZUTVVURU1PREVfU0hJRlQgICAgICAgICAgICAgICAgMQkvKiBEQUNfU09GVE1VVEVNT0RFICovCisjZGVmaW5lIFdNODk5NV9EQUNfU09GVE1VVEVNT0RFX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogREFDX1NPRlRNVVRFTU9ERSAqLworI2RlZmluZSBXTTg5OTVfREFDX01VVEVSQVRFICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfREFDX01VVEVSQVRFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAxCS8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfREFDX01VVEVSQVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAwCS8qIERBQ19NVVRFUkFURSAqLworI2RlZmluZSBXTTg5OTVfREFDX01VVEVSQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIERBQ19NVVRFUkFURSAqLworCisvKgorICogUjE1NjggKDB4NjIwKSAtIE92ZXJzYW1wbGluZworICovCisjZGVmaW5lIFdNODk5NV9BRENfT1NSMTI4ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogQURDX09TUjEyOCAqLworI2RlZmluZSBXTTg5OTVfQURDX09TUjEyOF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEFEQ19PU1IxMjggKi8KKyNkZWZpbmUgV004OTk1X0FEQ19PU1IxMjhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMQkvKiBBRENfT1NSMTI4ICovCisjZGVmaW5lIFdNODk5NV9BRENfT1NSMTI4X1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogQURDX09TUjEyOCAqLworI2RlZmluZSBXTTg5OTVfREFDX09TUjEyOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIERBQ19PU1IxMjggKi8KKyNkZWZpbmUgV004OTk1X0RBQ19PU1IxMjhfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBEQUNfT1NSMTI4ICovCisjZGVmaW5lIFdNODk5NV9EQUNfT1NSMTI4X1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAJLyogREFDX09TUjEyOCAqLworI2RlZmluZSBXTTg5OTVfREFDX09TUjEyOF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIERBQ19PU1IxMjggKi8KKworLyoKKyAqIFIxNTY5ICgweDYyMSkgLSBTaWRldG9uZQorICovCisjZGVmaW5lIFdNODk5NV9TVF9MUEYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAJLyogU1RfTFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9MUEZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDEwMDAJLyogU1RfTFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9MUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTIJLyogU1RfTFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9MUEZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1RfTFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfQ1VUX01BU0sgICAgICAgICAgICAgICAgICAweDAzODAJLyogU1RfSFBGX0NVVCAtIFs5OjddICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfQ1VUX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDcJLyogU1RfSFBGX0NVVCAtIFs5OjddICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfQ1VUX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMJLyogU1RfSFBGX0NVVCAtIFs5OjddICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogU1RfSFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogU1RfSFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogU1RfSFBGICovCisjZGVmaW5lIFdNODk5NV9TVF9IUEZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1RfSFBGICovCisjZGVmaW5lIFdNODk5NV9TVFJfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogU1RSX1NFTCAqLworI2RlZmluZSBXTTg5OTVfU1RSX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIFNUUl9TRUwgKi8KKyNkZWZpbmUgV004OTk1X1NUUl9TRUxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBTVFJfU0VMICovCisjZGVmaW5lIFdNODk5NV9TVFJfU0VMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1RSX1NFTCAqLworI2RlZmluZSBXTTg5OTVfU1RMX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIFNUTF9TRUwgKi8KKyNkZWZpbmUgV004OTk1X1NUTF9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBTVExfU0VMICovCisjZGVmaW5lIFdNODk5NV9TVExfU0VMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogU1RMX1NFTCAqLworI2RlZmluZSBXTTg5OTVfU1RMX1NFTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIFNUTF9TRUwgKi8KKworLyoKKyAqIFIxNzkyICgweDcwMCkgLSBHUElPIDEKKyAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDFfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDFfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1AxX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDFfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDFfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AxX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQMV9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDFfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDFfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDFfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDFfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDFfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDFfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1AxX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDFfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AxX0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQMV9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDFfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1AxX0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzkzICgweDcwMSkgLSBHUElPIDIKKyAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDJfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDJfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1AyX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDJfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDJfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDJfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AyX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AyX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQMl9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDJfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDJfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AyX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AyX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDJfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDJfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AyX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQMl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AyX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDJfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDJfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1AyX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDJfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AyX0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQMl9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDJfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1AyX0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk0ICgweDcwMikgLSBHUElPIDMKKyAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQM19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQM19ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDNfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDNfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1AzX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQM19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDNfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDNfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AzX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AzX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQM19QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQM19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDNfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDNfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AzX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AzX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQM19PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQM19PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDNfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDNfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AzX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQM19EQiAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQM19EQiAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQM19EQiAqLworI2RlZmluZSBXTTg5OTVfR1AzX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQM19EQiAqLworI2RlZmluZSBXTTg5OTVfR1AzX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQM19MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQM19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDNfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDNfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1AzX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AzX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQM19MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQM19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDNfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AzX0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQM19GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDNfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1AzX0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk1ICgweDcwMykgLSBHUElPIDQKKyAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDRfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDRfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A0X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDRfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDRfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDRfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A0X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A0X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQNF9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDRfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDRfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A0X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQNF9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDRfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDRfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A0X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A0X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A0X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDRfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDRfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A0X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A0X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDRfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A0X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQNF9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDRfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A0X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk2ICgweDcwNCkgLSBHUElPIDUKKyAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQNV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDVfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDVfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A1X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDVfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDVfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDVfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDVfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A1X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A1X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQNV9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDVfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDVfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A1X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A1X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQNV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDVfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDVfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A1X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQNV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A1X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A1X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQNV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDVfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDVfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A1X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A1X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDVfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A1X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQNV9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDVfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A1X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk3ICgweDcwNSkgLSBHUElPIDYKKyAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQNl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDZfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDZfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A2X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDZfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDZfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDZfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDZfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A2X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A2X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQNl9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDZfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDZfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A2X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A2X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQNl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDZfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDZfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A2X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQNl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQNl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A2X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A2X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQNl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDZfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDZfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A2X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A2X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDZfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A2X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQNl9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDZfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A2X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk4ICgweDcwNikgLSBHUElPIDcKKyAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQN19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQN19ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDdfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDdfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A3X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQN19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDdfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDdfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDdfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDdfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDdfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDdfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDdfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDdfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDdfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDdfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A3X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A3X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQN19QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQN19QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDdfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDdfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A3X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A3X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQN19PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQN19PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDdfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDdfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A3X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQN19EQiAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQN19EQiAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQN19EQiAqLworI2RlZmluZSBXTTg5OTVfR1A3X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQN19EQiAqLworI2RlZmluZSBXTTg5OTVfR1A3X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQN19MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQN19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDdfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDdfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A3X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A3X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQN19MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQN19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDdfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A3X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQN19GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDdfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A3X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxNzk5ICgweDcwNykgLSBHUElPIDgKKyAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQOF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDhfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDhfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A4X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDhfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDhfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDhfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDhfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDhfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDhfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDhfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDhfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDhfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDhfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A4X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A4X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQOF9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDhfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDhfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A4X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A4X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQOF9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDhfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDhfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A4X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQOF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQOF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQOF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A4X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A4X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQOF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDhfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDhfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A4X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A4X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDhfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A4X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQOF9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDhfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A4X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxODAwICgweDcwOCkgLSBHUElPIDkKKyAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQOV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDlfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDlfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1A5X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDlfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDlfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDlfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDlfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDlfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDlfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDlfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDlfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDlfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDlfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1A5X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1A5X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQOV9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDlfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDlfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1A5X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A5X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQOV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDlfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDlfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A5X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQOV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQOV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQOV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A5X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1A5X0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQOV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDlfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDlfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A5X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1A5X0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDlfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1A5X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQOV9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDlfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1A5X0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxODAxICgweDcwOSkgLSBHUElPIDEwCisgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfRElSICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDEwX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMTBfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDEwX0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1AxMF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEwX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEdQMTBfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDEwX1BVICovCisjZGVmaW5lIFdNODk5NV9HUDEwX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTQJLyogR1AxMF9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTBfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfUEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDEwX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDEwX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogR1AxMF9QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzCS8qIEdQMTBfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEwX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDEwX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AxMF9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDEwX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQMTBfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDEwX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMF9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBHUDEwX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9PUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTBfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDEwX09QX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgIDkJLyogR1AxMF9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEwX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMTBfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfREJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBHUDEwX0RCICovCisjZGVmaW5lIFdNODk5NV9HUDEwX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgJLyogR1AxMF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9EQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTBfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfTFZMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDEwX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMTBfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDEwX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1AxMF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTBfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEwX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDFGCS8qIEdQMTBfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9GTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQMTBfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9GTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA1CS8qIEdQMTBfRk4gLSBbNDowXSAqLworCisvKgorICogUjE4MDIgKDB4NzBBKSAtIEdQSU8gMTEKKyAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMTFfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDExX0RJUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogR1AxMV9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNQkvKiBHUDExX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9ESVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTFfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDExX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogR1AxMV9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEdQMTFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDExX1BVICovCisjZGVmaW5lIFdNODk5NV9HUDExX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMV9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEdQMTFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDExX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDExX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMJLyogR1AxMV9QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfUE9MICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDExX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9QT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIEdQMTFfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDExX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTAJLyogR1AxMV9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDExX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTFfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDExX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AxMV9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfT1BfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDExX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9PUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTFfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDExX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogR1AxMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9EQl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMTFfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfREJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBHUDExX0RCICovCisjZGVmaW5lIFdNODk5NV9HUDExX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMV9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMTFfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDExX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogR1AxMV9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTFfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgkvKiBHUDExX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTFfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDExX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMUYJLyogR1AxMV9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDExX0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogR1AxMV9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDExX0ZOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1AxMV9GTiAtIFs0OjBdICovCisKKy8qCisgKiBSMTgwMyAoMHg3MEIpIC0gR1BJTyAxMgorICovCisjZGVmaW5lIFdNODk5NV9HUDEyX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogR1AxMl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfRElSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDEyX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9ESVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1CS8qIEdQMTJfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDEyX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMl9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfUFUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDEyX1BVICovCisjZGVmaW5lIFdNODk5NV9HUDEyX1BVX01BU0sgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogR1AxMl9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE0CS8qIEdQMTJfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEyX1BVICovCisjZGVmaW5lIFdNODk5NV9HUDEyX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogR1AxMl9QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEdQMTJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMwkvKiBHUDEyX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDEyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMl9QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIEdQMTJfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDEyX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AxMl9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfUE9MX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMAkvKiBHUDEyX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTJfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDEyX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AxMl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfT1BfQ0ZHX01BU0sgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBHUDEyX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICA5CS8qIEdQMTJfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDEyX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMl9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfREIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBHUDEyX0RCICovCisjZGVmaW5lIFdNODk5NV9HUDEyX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogR1AxMl9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4CS8qIEdQMTJfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfREJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEyX0RCICovCisjZGVmaW5lIFdNODk5NV9HUDEyX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogR1AxMl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfTFZMX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDEyX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2CS8qIEdQMTJfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDEyX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxMl9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfRk5fTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAxRgkvKiBHUDEyX0ZOIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBHUDEyX0ZOIC0gWzQ6MF0gKi8KKyNkZWZpbmUgV004OTk1X0dQMTJfRk5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBHUDEyX0ZOIC0gWzQ6MF0gKi8KKworLyoKKyAqIFIxODA0ICgweDcwQykgLSBHUElPIDEzCisgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfRElSICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAkvKiBHUDEzX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxM19ESVJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMTNfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDEzX0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUJLyogR1AxM19ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEzX0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxM19QVSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEdQMTNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBHUDEzX1BVICovCisjZGVmaW5lIFdNODk5NV9HUDEzX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTQJLyogR1AxM19QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxM19QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTNfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfUEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDEzX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDEzX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAweDIwMDAJLyogR1AxM19QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEzCS8qIEdQMTNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEzX1BEICovCisjZGVmaW5lIFdNODk5NV9HUDEzX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAJLyogR1AxM19QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfUE9MX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDEzX1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQMTNfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDEzX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxM19QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfT1BfQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBHUDEzX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxM19PUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTNfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDEzX09QX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgIDkJLyogR1AxM19PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfT1BfQ0ZHX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEzX09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxM19EQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMTNfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfREJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBHUDEzX0RCICovCisjZGVmaW5lIFdNODk5NV9HUDEzX0RCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgJLyogR1AxM19EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxM19EQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTNfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfTFZMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDEzX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMTNfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDEzX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1AxM19MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTNfTFZMX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDEzX0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19GTl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDFGCS8qIEdQMTNfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AxM19GTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEdQMTNfRk4gLSBbNDowXSAqLworI2RlZmluZSBXTTg5OTVfR1AxM19GTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICA1CS8qIEdQMTNfRk4gLSBbNDowXSAqLworCisvKgorICogUjE4MDUgKDB4NzBEKSAtIEdQSU8gMTQKKyAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCS8qIEdQMTRfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0RJUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAJLyogR1AxNF9ESVIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNQkvKiBHUDE0X0RJUiAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9ESVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTRfRElSICovCisjZGVmaW5lIFdNODk5NV9HUDE0X1BVICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogR1AxNF9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCS8qIEdQMTRfUFUgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxNAkvKiBHUDE0X1BVICovCisjZGVmaW5lIFdNODk5NV9HUDE0X1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxNF9QVSAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEdQMTRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAkvKiBHUDE0X1BEICovCisjZGVmaW5lIFdNODk5NV9HUDE0X1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTMJLyogR1AxNF9QRCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTRfUEQgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfUE9MICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBHUDE0X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9QT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIEdQMTRfUE9MICovCisjZGVmaW5lIFdNODk5NV9HUDE0X1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTAJLyogR1AxNF9QT0wgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfUE9MX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDE0X1BPTCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTRfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDE0X09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAweDAyMDAJLyogR1AxNF9PUF9DRkcgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfT1BfQ0ZHX1NISUZUICAgICAgICAgICAgICAgICAgICAgOQkvKiBHUDE0X09QX0NGRyAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9PUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTRfT1BfQ0ZHICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0RCICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogR1AxNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9EQl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQMTRfREIgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfREJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBHUDE0X0RCICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AxNF9EQiAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQMTRfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogR1AxNF9MVkwgKi8KKyNkZWZpbmUgV004OTk1X0dQMTRfTFZMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNgkvKiBHUDE0X0xWTCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTRfTFZMICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMUYJLyogR1AxNF9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0ZOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogR1AxNF9GTiAtIFs0OjBdICovCisjZGVmaW5lIFdNODk5NV9HUDE0X0ZOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDUJLyogR1AxNF9GTiAtIFs0OjBdICovCisKKy8qCisgKiBSMTgyNCAoMHg3MjApIC0gUHVsbCBDb250cm9sICgxKQorICovCisjZGVmaW5lIFdNODk5NV9ETUlDREFUM19QRCAgICAgICAgICAgICAgICAgICAgICAweDQwMDAJLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RNSUNEQVQzX1BEX01BU0sgICAgICAgICAgICAgICAgIDB4NDAwMAkvKiBETUlDREFUM19QRCAqLworI2RlZmluZSBXTTg5OTVfRE1JQ0RBVDNfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE0CS8qIERNSUNEQVQzX1BEICovCisjZGVmaW5lIFdNODk5NV9ETUlDREFUM19QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogRE1JQ0RBVDNfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RNSUNEQVQyX1BEICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAkvKiBETUlDREFUMl9QRCAqLworI2RlZmluZSBXTTg5OTVfRE1JQ0RBVDJfUERfTUFTSyAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIERNSUNEQVQyX1BEICovCisjZGVmaW5lIFdNODk5NV9ETUlDREFUMl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgMTIJLyogRE1JQ0RBVDJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RNSUNEQVQyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBETUlDREFUMl9QRCAqLworI2RlZmluZSBXTTg5OTVfRE1JQ0RBVDFfUEQgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIERNSUNEQVQxX1BEICovCisjZGVmaW5lIFdNODk5NV9ETUlDREFUMV9QRF9NQVNLICAgICAgICAgICAgICAgICAweDA0MDAJLyogRE1JQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RNSUNEQVQxX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAxMAkvKiBETUlDREFUMV9QRCAqLworI2RlZmluZSBXTTg5OTVfRE1JQ0RBVDFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIERNSUNEQVQxX1BEICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAJLyogTUNMSzJfUFUgKi8KKyNkZWZpbmUgV004OTk1X01DTEsyX1BVX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBNQ0xLMl9QVSAqLworI2RlZmluZSBXTTg5OTVfTUNMSzJfUFVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA5CS8qIE1DTEsyX1BVICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMl9QVV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogTUNMSzJfUFUgKi8KKyNkZWZpbmUgV004OTk1X01DTEsyX1BEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAkvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTg5OTVfTUNMSzJfUERfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIE1DTEsyX1BEICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMl9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDgJLyogTUNMSzJfUEQgKi8KKyNkZWZpbmUgV004OTk1X01DTEsyX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBNQ0xLMl9QRCAqLworI2RlZmluZSBXTTg5OTVfTUNMSzFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCS8qIE1DTEsxX1BVICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogTUNMSzFfUFUgKi8KKyNkZWZpbmUgV004OTk1X01DTEsxX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNwkvKiBNQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfTUNMSzFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1DTEsxX1BVICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAJLyogTUNMSzFfUEQgKi8KKyNkZWZpbmUgV004OTk1X01DTEsxX1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBNQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfTUNMSzFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2CS8qIE1DTEsxX1BEICovCisjZGVmaW5lIFdNODk5NV9NQ0xLMV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogTUNMSzFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RBQ0RBVDFfUFUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBEQUNEQVQxX1BVICovCisjZGVmaW5lIFdNODk5NV9EQUNEQVQxX1BVX01BU0sgICAgICAgICAgICAgICAgICAweDAwMjAJLyogREFDREFUMV9QVSAqLworI2RlZmluZSBXTTg5OTVfREFDREFUMV9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICA1CS8qIERBQ0RBVDFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0RBQ0RBVDFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBEQUNEQVQxX1BVICovCisjZGVmaW5lIFdNODk5NV9EQUNEQVQxX1BEICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogREFDREFUMV9QRCAqLworI2RlZmluZSBXTTg5OTVfREFDREFUMV9QRF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIERBQ0RBVDFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0RBQ0RBVDFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgNAkvKiBEQUNEQVQxX1BEICovCisjZGVmaW5lIFdNODk5NV9EQUNEQVQxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogREFDREFUMV9QRCAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BVICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIERBQ0xSQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BVX01BU0sgICAgICAgICAgICAgICAgMHgwMDA4CS8qIERBQ0xSQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAzCS8qIERBQ0xSQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIERBQ0xSQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BEICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIERBQ0xSQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BEX01BU0sgICAgICAgICAgICAgICAgMHgwMDA0CS8qIERBQ0xSQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAyCS8qIERBQ0xSQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfREFDTFJDTEsxX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIERBQ0xSQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfQkNMSzFfUFUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEJDTEsxX1BVICovCisjZGVmaW5lIFdNODk5NV9CQ0xLMV9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogQkNMSzFfUFUgKi8KKyNkZWZpbmUgV004OTk1X0JDTEsxX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBCQ0xLMV9QVSAqLworI2RlZmluZSBXTTg5OTVfQkNMSzFfUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEJDTEsxX1BVICovCisjZGVmaW5lIFdNODk5NV9CQ0xLMV9QRCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogQkNMSzFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0JDTEsxX1BEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBCQ0xLMV9QRCAqLworI2RlZmluZSBXTTg5OTVfQkNMSzFfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIEJDTEsxX1BEICovCisjZGVmaW5lIFdNODk5NV9CQ0xLMV9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogQkNMSzFfUEQgKi8KKworLyoKKyAqIFIxODI1ICgweDcyMSkgLSBQdWxsIENvbnRyb2wgKDIpCisgKi8KKyNkZWZpbmUgV004OTk1X0xETzFFTkFfUEQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBMRE8xRU5BX1BEICovCisjZGVmaW5lIFdNODk5NV9MRE8xRU5BX1BEX01BU0sgICAgICAgICAgICAgICAgICAweDAwMTAJLyogTERPMUVOQV9QRCAqLworI2RlZmluZSBXTTg5OTVfTERPMUVOQV9QRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICA0CS8qIExETzFFTkFfUEQgKi8KKyNkZWZpbmUgV004OTk1X0xETzFFTkFfUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBMRE8xRU5BX1BEICovCisjZGVmaW5lIFdNODk5NV9NT0RFX1BEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogTU9ERV9QRCAqLworI2RlZmluZSBXTTg5OTVfTU9ERV9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIE1PREVfUEQgKi8KKyNkZWZpbmUgV004OTk1X01PREVfUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBNT0RFX1BEICovCisjZGVmaW5lIFdNODk5NV9NT0RFX1BEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogTU9ERV9QRCAqLworI2RlZmluZSBXTTg5OTVfQ1NOQUREUl9QRCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIENTTkFERFJfUEQgKi8KKyNkZWZpbmUgV004OTk1X0NTTkFERFJfUERfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBDU05BRERSX1BEICovCisjZGVmaW5lIFdNODk5NV9DU05BRERSX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAJLyogQ1NOQUREUl9QRCAqLworI2RlZmluZSBXTTg5OTVfQ1NOQUREUl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIENTTkFERFJfUEQgKi8KKworLyoKKyAqIFIxODQwICgweDczMCkgLSBJbnRlcnJ1cHQgU3RhdHVzIDEKKyAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEdQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIEdQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEzCS8qIEdQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIEdQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIEdQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEyCS8qIEdQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxM19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIEdQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIEdQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDExCS8qIEdQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIEdQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIEdQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIEdQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEdQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA5CS8qIEdQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxMF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A5X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIEdQOV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDlfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAxMDAJLyogR1A5X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQOV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgOAkvKiBHUDlfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A5X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQOV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDhfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogR1A4X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQOF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBHUDhfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A4X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3CS8qIEdQOF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDhfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A4X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBHUDdfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A3X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIEdQN19FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDdfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYJLyogR1A3X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQN19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDdfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A2X0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIEdQNl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDZfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMjAJLyogR1A2X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQNl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNQkvKiBHUDZfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A2X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQNl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQNV9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBHUDVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A1X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0CS8qIEdQNV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDVfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1A1X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1A0X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEdQNF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDMJLyogR1A0X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIEdQM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDNfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogR1AzX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBHUDNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AzX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBHUDJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AyX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIEdQMl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEJLyogR1AyX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBHUDFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfR1AxX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIEdQMV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9HUDFfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAJLyogR1AxX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0dQMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBHUDFfRUlOVCAqLworCisvKgorICogUjE4NDEgKDB4NzMxKSAtIEludGVycnVwdCBTdGF0dXMgMgorICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRE9ORV8yM19FSU5UICAgICAgICAgICAgICAgICAweDEwMDAJLyogRENTX0RPTkVfMjNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMjNfRUlOVF9NQVNLICAgICAgICAgICAgMHgxMDAwCS8qIERDU19ET05FXzIzX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0RDU19ET05FXzIzX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAxMgkvKiBEQ1NfRE9ORV8yM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRE9ORV8yM19FSU5UX1dJRFRIICAgICAgICAgICAgICAgIDEJLyogRENTX0RPTkVfMjNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfRUlOVCAgICAgICAgICAgICAgICAgMHgwODAwCS8qIERDU19ET05FXzAxX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0RDU19ET05FXzAxX0VJTlRfTUFTSyAgICAgICAgICAgIDB4MDgwMAkvKiBEQ1NfRE9ORV8wMV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9EQ1NfRE9ORV8wMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgMTEJLyogRENTX0RPTkVfMDFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAxCS8qIERDU19ET05FXzAxX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfRE9ORV9FSU5UICAgICAgICAgICAgICAgICAgIDB4MDQwMAkvKiBXU0VRX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9ET05FX0VJTlRfTUFTSyAgICAgICAgICAgICAgMHgwNDAwCS8qIFdTRVFfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0RPTkVfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgMTAJLyogV1NFUV9ET05FX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfRE9ORV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBXU0VRX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRklGT1NfRVJSX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIEZJRk9TX0VSUl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9GSUZPU19FUlJfRUlOVF9NQVNLICAgICAgICAgICAgICAweDAyMDAJLyogRklGT1NfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0ZJRk9TX0VSUl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgOQkvKiBGSUZPU19FUlJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRklGT1NfRVJSX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIEZJRk9TX0VSUl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfRUlOVCAgICAgICAgICAgICAweDAxMDAJLyogQUlGMkRSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfU0lHX0RFVF9FSU5UX01BU0sgICAgICAgIDB4MDEwMAkvKiBBSUYyRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX0VJTlRfU0hJRlQgICAgICAgICAgICA4CS8qIEFJRjJEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfRUlOVF9XSURUSCAgICAgICAgICAgIDEJLyogQUlGMkRSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfRUlOVCAgICAgICAgICAgIDB4MDA4MAkvKiBBSUYxRFJDMl9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfRUlOVF9NQVNLICAgICAgIDB4MDA4MAkvKiBBSUYxRFJDMl9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfRUlOVF9TSElGVCAgICAgICAgICAgNwkvKiBBSUYxRFJDMl9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfRUlOVF9XSURUSCAgICAgICAgICAgMQkvKiBBSUYxRFJDMl9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfRUlOVCAgICAgICAgICAgIDB4MDA0MAkvKiBBSUYxRFJDMV9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfRUlOVF9NQVNLICAgICAgIDB4MDA0MAkvKiBBSUYxRFJDMV9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfRUlOVF9TSElGVCAgICAgICAgICAgNgkvKiBBSUYxRFJDMV9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfRUlOVF9XSURUSCAgICAgICAgICAgMQkvKiBBSUYxRFJDMV9TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X1NSQzJfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfU1JDMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgICAgMHgwMDIwCS8qIFNSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9TUkMyX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDUJLyogU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X1NSQzJfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBTUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfU1JDMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9TUkMxX0xPQ0tfRUlOVF9NQVNLICAgICAgICAgICAgICAweDAwMTAJLyogU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X1NSQzFfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgNAkvKiBTUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfU1JDMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAxCS8qIFNSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0xPQ0tfRUlOVCAgICAgICAgICAgICAgICAgICAweDAwMDgJLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTE9DS19FSU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwOAkvKiBGTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAzCS8qIEZMTDJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0xPQ0tfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgIDEJLyogRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTE9DS19FSU5UICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBGTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgICAgMHgwMDA0CS8qIEZMTDFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgIDIJLyogRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgMQkvKiBGTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSFBfRE9ORV9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEhQX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSFBfRE9ORV9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwMDAyCS8qIEhQX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSFBfRE9ORV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAxCS8qIEhQX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSFBfRE9ORV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIEhQX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FSU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIE1JQ0RfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FSU5UX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIE1JQ0RfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCS8qIE1JQ0RfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfTUlDRF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIE1JQ0RfRUlOVCAqLworCisvKgorICogUjE4NDIgKDB4NzMyKSAtIEludGVycnVwdCBSYXcgU3RhdHVzIDIKKyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMjNfU1RTICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIERDU19ET05FXzIzX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMjNfU1RTX01BU0sgICAgICAgICAgICAgMHgxMDAwCS8qIERDU19ET05FXzIzX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMjNfU1RTX1NISUZUICAgICAgICAgICAgICAgIDEyCS8qIERDU19ET05FXzIzX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMjNfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIERDU19ET05FXzIzX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfU1RTICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIERDU19ET05FXzAxX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfU1RTX01BU0sgICAgICAgICAgICAgMHgwODAwCS8qIERDU19ET05FXzAxX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfU1RTX1NISUZUICAgICAgICAgICAgICAgIDExCS8qIERDU19ET05FXzAxX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRENTX0RPTkVfMDFfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAxCS8qIERDU19ET05FXzAxX1NUUyAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9ET05FX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIFdTRVFfRE9ORV9TVFMgKi8KKyNkZWZpbmUgV004OTk1X1dTRVFfRE9ORV9TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDQwMAkvKiBXU0VRX0RPTkVfU1RTICovCisjZGVmaW5lIFdNODk5NV9XU0VRX0RPTkVfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgMTAJLyogV1NFUV9ET05FX1NUUyAqLworI2RlZmluZSBXTTg5OTVfV1NFUV9ET05FX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIFdTRVFfRE9ORV9TVFMgKi8KKyNkZWZpbmUgV004OTk1X0ZJRk9TX0VSUl9TVFMgICAgICAgICAgICAgICAgICAgIDB4MDIwMAkvKiBGSUZPU19FUlJfU1RTICovCisjZGVmaW5lIFdNODk5NV9GSUZPU19FUlJfU1RTX01BU0sgICAgICAgICAgICAgICAweDAyMDAJLyogRklGT1NfRVJSX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRklGT1NfRVJSX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA5CS8qIEZJRk9TX0VSUl9TVFMgKi8KKyNkZWZpbmUgV004OTk1X0ZJRk9TX0VSUl9TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBGSUZPU19FUlJfU1RTICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfU1RTICAgICAgICAgICAgICAweDAxMDAJLyogQUlGMkRSQ19TSUdfREVUX1NUUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMkRSQ19TSUdfREVUX1NUU19NQVNLICAgICAgICAgMHgwMTAwCS8qIEFJRjJEUkNfU0lHX0RFVF9TVFMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjJEUkNfU0lHX0RFVF9TVFNfU0hJRlQgICAgICAgICAgICAgOAkvKiBBSUYyRFJDX1NJR19ERVRfU1RTICovCisjZGVmaW5lIFdNODk5NV9BSUYyRFJDX1NJR19ERVRfU1RTX1dJRFRIICAgICAgICAgICAgIDEJLyogQUlGMkRSQ19TSUdfREVUX1NUUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9TVFMgICAgICAgICAgICAgMHgwMDgwCS8qIEFJRjFEUkMyX1NJR19ERVRfU1RTICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMl9TSUdfREVUX1NUU19NQVNLICAgICAgICAweDAwODAJLyogQUlGMURSQzJfU0lHX0RFVF9TVFMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMyX1NJR19ERVRfU1RTX1NISUZUICAgICAgICAgICAgNwkvKiBBSUYxRFJDMl9TSUdfREVUX1NUUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzJfU0lHX0RFVF9TVFNfV0lEVEggICAgICAgICAgICAxCS8qIEFJRjFEUkMyX1NJR19ERVRfU1RTICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1NUUyAgICAgICAgICAgICAweDAwNDAJLyogQUlGMURSQzFfU0lHX0RFVF9TVFMgKi8KKyNkZWZpbmUgV004OTk1X0FJRjFEUkMxX1NJR19ERVRfU1RTX01BU0sgICAgICAgIDB4MDA0MAkvKiBBSUYxRFJDMV9TSUdfREVUX1NUUyAqLworI2RlZmluZSBXTTg5OTVfQUlGMURSQzFfU0lHX0RFVF9TVFNfU0hJRlQgICAgICAgICAgICA2CS8qIEFJRjFEUkMxX1NJR19ERVRfU1RTICovCisjZGVmaW5lIFdNODk5NV9BSUYxRFJDMV9TSUdfREVUX1NUU19XSURUSCAgICAgICAgICAgIDEJLyogQUlGMURSQzFfU0lHX0RFVF9TVFMgKi8KKyNkZWZpbmUgV004OTk1X1NSQzJfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAyMAkvKiBTUkMyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNODk5NV9TUkMyX0xPQ0tfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMjAJLyogU1JDMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTg5OTVfU1JDMl9MT0NLX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICA1CS8qIFNSQzJfTE9DS19TVFMgKi8KKyNkZWZpbmUgV004OTk1X1NSQzJfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBTUkMyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNODk5NV9TUkMxX0xPQ0tfU1RTICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTg5OTVfU1JDMV9MT0NLX1NUU19NQVNLICAgICAgICAgICAgICAgMHgwMDEwCS8qIFNSQzFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV004OTk1X1NSQzFfTE9DS19TVFNfU0hJRlQgICAgICAgICAgICAgICAgICAgNAkvKiBTUkMxX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNODk5NV9TUkMxX0xPQ0tfU1RTX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogU1JDMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9MT0NLX1NUUyAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIEZMTDJfTE9DS19TVFMgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDJfTE9DS19TVFNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwOAkvKiBGTEwyX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNODk5NV9GTEwyX0xPQ0tfU1RTX1NISUZUICAgICAgICAgICAgICAgICAgIDMJLyogRkxMMl9MT0NLX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRkxMMl9MT0NLX1NUU19XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIEZMTDJfTE9DS19TVFMgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTE9DS19TVFMgICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBGTEwxX0xPQ0tfU1RTICovCisjZGVmaW5lIFdNODk5NV9GTEwxX0xPQ0tfU1RTX01BU0sgICAgICAgICAgICAgICAweDAwMDQJLyogRkxMMV9MT0NLX1NUUyAqLworI2RlZmluZSBXTTg5OTVfRkxMMV9MT0NLX1NUU19TSElGVCAgICAgICAgICAgICAgICAgICAyCS8qIEZMTDFfTE9DS19TVFMgKi8KKyNkZWZpbmUgV004OTk1X0ZMTDFfTE9DS19TVFNfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBGTEwxX0xPQ0tfU1RTICovCisKKy8qCisgKiBSMTg0OCAoMHg3MzgpIC0gSW50ZXJydXB0IFN0YXR1cyAxIE1hc2sKKyAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxNF9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCS8qIElNX0dQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxNF9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgyMDAwCS8qIElNX0dQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxNF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDEzCS8qIElNX0dQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMTRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxM19FSU5UICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCS8qIElNX0dQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxM19FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwCS8qIElNX0dQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDEyCS8qIElNX0dQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxM19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMTNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMl9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwODAwCS8qIElNX0dQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwODAwCS8qIElNX0dQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDExCS8qIElNX0dQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMl9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMTJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMV9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCS8qIElNX0dQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMV9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwNDAwCS8qIElNX0dQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDEwCS8qIElNX0dQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMTFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMF9FSU5UICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCS8qIElNX0dQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMF9FSU5UX01BU0sgICAgICAgICAgICAgICAgMHgwMjAwCS8qIElNX0dQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMF9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICA5CS8qIElNX0dQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxMF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMTBfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A5X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCS8qIElNX0dQOV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDlfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAxMDAJLyogSU1fR1A5X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQOV9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgOAkvKiBJTV9HUDlfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A5X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQOV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDhfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwODAJLyogSU1fR1A4X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQOF9FSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MDA4MAkvKiBJTV9HUDhfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A4X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA3CS8qIElNX0dQOF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDhfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSU1fR1A4X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQN19FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAkvKiBJTV9HUDdfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A3X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDQwCS8qIElNX0dQN19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDdfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDYJLyogSU1fR1A3X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQN19FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBJTV9HUDdfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A2X0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCS8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDZfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAJLyogSU1fR1A2X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQNl9FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNQkvKiBJTV9HUDZfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A2X0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQNl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDVfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogSU1fR1A1X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQNV9FSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBJTV9HUDVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A1X0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0CS8qIElNX0dQNV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDVfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSU1fR1A1X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQNF9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1A0X0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIElNX0dQNF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDRfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDMJLyogSU1fR1A0X0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQNF9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBJTV9HUDRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AzX0VJTlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDNfRUlOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDQJLyogSU1fR1AzX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQM19FSU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgMgkvKiBJTV9HUDNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AzX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDJfRUlOVCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIJLyogSU1fR1AyX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQMl9FSU5UX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMgkvKiBJTV9HUDJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AyX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0dQMl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDJfRUlOVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEJLyogSU1fR1AyX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQMV9FSU5UICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQkvKiBJTV9HUDFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fR1AxX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIElNX0dQMV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9HUDFfRUlOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDAJLyogSU1fR1AxX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0dQMV9FSU5UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMQkvKiBJTV9HUDFfRUlOVCAqLworCisvKgorICogUjE4NDkgKDB4NzM5KSAtIEludGVycnVwdCBTdGF0dXMgMiBNYXNrCisgKi8KKyNkZWZpbmUgV004OTk1X0lNX0RDU19ET05FXzIzX0VJTlQgICAgICAgICAgICAgIDB4MTAwMAkvKiBJTV9EQ1NfRE9ORV8yM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9EQ1NfRE9ORV8yM19FSU5UX01BU0sgICAgICAgICAweDEwMDAJLyogSU1fRENTX0RPTkVfMjNfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRENTX0RPTkVfMjNfRUlOVF9TSElGVCAgICAgICAgICAgIDEyCS8qIElNX0RDU19ET05FXzIzX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0RDU19ET05FXzIzX0VJTlRfV0lEVEggICAgICAgICAgICAgMQkvKiBJTV9EQ1NfRE9ORV8yM19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9EQ1NfRE9ORV8wMV9FSU5UICAgICAgICAgICAgICAweDA4MDAJLyogSU1fRENTX0RPTkVfMDFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRENTX0RPTkVfMDFfRUlOVF9NQVNLICAgICAgICAgMHgwODAwCS8qIElNX0RDU19ET05FXzAxX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0RDU19ET05FXzAxX0VJTlRfU0hJRlQgICAgICAgICAgICAxMQkvKiBJTV9EQ1NfRE9ORV8wMV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9EQ1NfRE9ORV8wMV9FSU5UX1dJRFRIICAgICAgICAgICAgIDEJLyogSU1fRENTX0RPTkVfMDFfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fV1NFUV9ET05FX0VJTlQgICAgICAgICAgICAgICAgMHgwNDAwCS8qIElNX1dTRVFfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9XU0VRX0RPTkVfRUlOVF9NQVNLICAgICAgICAgICAweDA0MDAJLyogSU1fV1NFUV9ET05FX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX1dTRVFfRE9ORV9FSU5UX1NISUZUICAgICAgICAgICAgICAxMAkvKiBJTV9XU0VRX0RPTkVfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fV1NFUV9ET05FX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxCS8qIElNX1dTRVFfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9GSUZPU19FUlJfRUlOVCAgICAgICAgICAgICAgICAweDAyMDAJLyogSU1fRklGT1NfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0ZJRk9TX0VSUl9FSU5UX01BU0sgICAgICAgICAgIDB4MDIwMAkvKiBJTV9GSUZPU19FUlJfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRklGT1NfRVJSX0VJTlRfU0hJRlQgICAgICAgICAgICAgICA5CS8qIElNX0ZJRk9TX0VSUl9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9GSUZPU19FUlJfRUlOVF9XSURUSCAgICAgICAgICAgICAgIDEJLyogSU1fRklGT1NfRVJSX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0FJRjJEUkNfU0lHX0RFVF9FSU5UICAgICAgICAgIDB4MDEwMAkvKiBJTV9BSUYyRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMkRSQ19TSUdfREVUX0VJTlRfTUFTSyAgICAgMHgwMTAwCS8qIElNX0FJRjJEUkNfU0lHX0RFVF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9BSUYyRFJDX1NJR19ERVRfRUlOVF9TSElGVCAgICAgICAgIDgJLyogSU1fQUlGMkRSQ19TSUdfREVUX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0FJRjJEUkNfU0lHX0RFVF9FSU5UX1dJRFRIICAgICAgICAgMQkvKiBJTV9BSUYyRFJDX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzJfU0lHX0RFVF9FSU5UICAgICAgICAgMHgwMDgwCS8qIElNX0FJRjFEUkMyX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzJfU0lHX0RFVF9FSU5UX01BU0sgICAgMHgwMDgwCS8qIElNX0FJRjFEUkMyX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzJfU0lHX0RFVF9FSU5UX1NISUZUICAgICAgICA3CS8qIElNX0FJRjFEUkMyX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzJfU0lHX0RFVF9FSU5UX1dJRFRIICAgICAgICAxCS8qIElNX0FJRjFEUkMyX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzFfU0lHX0RFVF9FSU5UICAgICAgICAgMHgwMDQwCS8qIElNX0FJRjFEUkMxX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzFfU0lHX0RFVF9FSU5UX01BU0sgICAgMHgwMDQwCS8qIElNX0FJRjFEUkMxX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzFfU0lHX0RFVF9FSU5UX1NISUZUICAgICAgICA2CS8qIElNX0FJRjFEUkMxX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fQUlGMURSQzFfU0lHX0RFVF9FSU5UX1dJRFRIICAgICAgICAxCS8qIElNX0FJRjFEUkMxX1NJR19ERVRfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fU1JDMl9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDIwCS8qIElNX1NSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9TUkMyX0xPQ0tfRUlOVF9NQVNLICAgICAgICAgICAweDAwMjAJLyogSU1fU1JDMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX1NSQzJfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgNQkvKiBJTV9TUkMyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fU1JDMl9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxCS8qIElNX1NSQzJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9TUkMxX0xPQ0tfRUlOVCAgICAgICAgICAgICAgICAweDAwMTAJLyogSU1fU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX1NSQzFfTE9DS19FSU5UX01BU0sgICAgICAgICAgIDB4MDAxMAkvKiBJTV9TUkMxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fU1JDMV9MT0NLX0VJTlRfU0hJRlQgICAgICAgICAgICAgICA0CS8qIElNX1NSQzFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9TUkMxX0xPQ0tfRUlOVF9XSURUSCAgICAgICAgICAgICAgIDEJLyogSU1fU1JDMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0ZMTDJfTE9DS19FSU5UICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRkxMMl9MT0NLX0VJTlRfTUFTSyAgICAgICAgICAgMHgwMDA4CS8qIElNX0ZMTDJfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9GTEwyX0xPQ0tfRUlOVF9TSElGVCAgICAgICAgICAgICAgIDMJLyogSU1fRkxMMl9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0ZMTDJfTE9DS19FSU5UX1dJRFRIICAgICAgICAgICAgICAgMQkvKiBJTV9GTEwyX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRkxMMV9MT0NLX0VJTlQgICAgICAgICAgICAgICAgMHgwMDA0CS8qIElNX0ZMTDFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9GTEwxX0xPQ0tfRUlOVF9NQVNLICAgICAgICAgICAweDAwMDQJLyogSU1fRkxMMV9MT0NLX0VJTlQgKi8KKyNkZWZpbmUgV004OTk1X0lNX0ZMTDFfTE9DS19FSU5UX1NISUZUICAgICAgICAgICAgICAgMgkvKiBJTV9GTEwxX0xPQ0tfRUlOVCAqLworI2RlZmluZSBXTTg5OTVfSU1fRkxMMV9MT0NLX0VJTlRfV0lEVEggICAgICAgICAgICAgICAxCS8qIElNX0ZMTDFfTE9DS19FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9IUF9ET05FX0VJTlQgICAgICAgICAgICAgICAgICAweDAwMDIJLyogSU1fSFBfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9IUF9ET05FX0VJTlRfTUFTSyAgICAgICAgICAgICAweDAwMDIJLyogSU1fSFBfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9IUF9ET05FX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgIDEJLyogSU1fSFBfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9IUF9ET05FX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgIDEJLyogSU1fSFBfRE9ORV9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9NSUNEX0VJTlQgICAgICAgICAgICAgICAgICAgICAweDAwMDEJLyogSU1fTUlDRF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9NSUNEX0VJTlRfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEJLyogSU1fTUlDRF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9NSUNEX0VJTlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDAJLyogSU1fTUlDRF9FSU5UICovCisjZGVmaW5lIFdNODk5NV9JTV9NSUNEX0VJTlRfV0lEVEggICAgICAgICAgICAgICAgICAgIDEJLyogSU1fTUlDRF9FSU5UICovCisKKy8qCisgKiBSMTg1NiAoMHg3NDApIC0gSW50ZXJydXB0IENvbnRyb2wKKyAqLworI2RlZmluZSBXTTg5OTVfSU1fSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIElNX0lSUSAqLworI2RlZmluZSBXTTg5OTVfSU1fSVJRX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCS8qIElNX0lSUSAqLworI2RlZmluZSBXTTg5OTVfSU1fSVJRX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCS8qIElNX0lSUSAqLworI2RlZmluZSBXTTg5OTVfSU1fSVJRX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxCS8qIElNX0lSUSAqLworCisvKgorICogUjIwNDggKDB4ODAwKSAtIExlZnQgUERNIFNwZWFrZXIgMQorICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogU1BLMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMTAJLyogU1BLMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDQJLyogU1BLMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1BLMUxfRU5BICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9NVVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgJLyogU1BLMUxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfU1BLMUxfTVVURV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIFNQSzFMX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFMX01VVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMwkvKiBTUEsxTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9NVVRFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEJLyogU1BLMUxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfU1BLMUxfTVVURV9aQyAgICAgICAgICAgICAgICAgICAgMHgwMDA0CS8qIFNQSzFMX01VVEVfWkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFMX01VVEVfWkNfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNAkvKiBTUEsxTF9NVVRFX1pDICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9NVVRFX1pDX1NISUZUICAgICAgICAgICAgICAgICAgIDIJLyogU1BLMUxfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMUxfTVVURV9aQ19XSURUSCAgICAgICAgICAgICAgICAgICAxCS8qIFNQSzFMX01VVEVfWkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFMX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMwkvKiBTUEsxTF9TUkMgLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfU1BLMUxfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCS8qIFNQSzFMX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9TUEsxTF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIJLyogU1BLMUxfU1JDIC0gWzE6MF0gKi8KKworLyoKKyAqIFIyMDQ5ICgweDgwMSkgLSBSaWdodCBQRE0gU3BlYWtlciAxCisgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBTUEsxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBTUEsxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBTUEsxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBTUEsxUl9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsxUl9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDgJLyogU1BLMVJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfU1BLMVJfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAzCS8qIFNQSzFSX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBTUEsxUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsxUl9NVVRFX1pDICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogU1BLMVJfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMVJfTVVURV9aQ19NQVNLICAgICAgICAgICAgICAgMHgwMDA0CS8qIFNQSzFSX01VVEVfWkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX01VVEVfWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMgkvKiBTUEsxUl9NVVRFX1pDICovCisjZGVmaW5lIFdNODk5NV9TUEsxUl9NVVRFX1pDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogU1BLMVJfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMVJfU1JDX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzCS8qIFNQSzFSX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9TUEsxUl9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAJLyogU1BLMVJfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NQSzFSX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBTUEsxUl9TUkMgLSBbMTowXSAqLworCisvKgorICogUjIwNTAgKDB4ODAyKSAtIFBETSBTcGVha2VyIDEgTXV0ZSBTZXF1ZW5jZQorICovCisjZGVmaW5lIFdNODk5NV9TUEsxX01VVEVfU0VRMV9NQVNLICAgICAgICAgICAgICAweDAwRkYJLyogU1BLMV9NVVRFX1NFUTEgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfU1BLMV9NVVRFX1NFUTFfU0hJRlQgICAgICAgICAgICAgICAgICAwCS8qIFNQSzFfTVVURV9TRVExIC0gWzc6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NQSzFfTVVURV9TRVExX1dJRFRIICAgICAgICAgICAgICAgICAgOAkvKiBTUEsxX01VVEVfU0VRMSAtIFs3OjBdICovCisKKy8qCisgKiBSMjA1NiAoMHg4MDgpIC0gTGVmdCBQRE0gU3BlYWtlciAyCisgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBTUEsyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAxMAkvKiBTUEsyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBTUEsyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMQkvKiBTUEsyTF9FTkEgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX01VVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsyTF9NVVRFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDgJLyogU1BLMkxfTVVURSAqLworI2RlZmluZSBXTTg5OTVfU1BLMkxfTVVURV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAzCS8qIFNQSzJMX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX01VVEVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMQkvKiBTUEsyTF9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsyTF9NVVRFX1pDICAgICAgICAgICAgICAgICAgICAweDAwMDQJLyogU1BLMkxfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMkxfTVVURV9aQ19NQVNLICAgICAgICAgICAgICAgMHgwMDA0CS8qIFNQSzJMX01VVEVfWkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX01VVEVfWkNfU0hJRlQgICAgICAgICAgICAgICAgICAgMgkvKiBTUEsyTF9NVVRFX1pDICovCisjZGVmaW5lIFdNODk5NV9TUEsyTF9NVVRFX1pDX1dJRFRIICAgICAgICAgICAgICAgICAgIDEJLyogU1BLMkxfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMkxfU1JDX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAzCS8qIFNQSzJMX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODk5NV9TUEsyTF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAJLyogU1BLMkxfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NQSzJMX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMgkvKiBTUEsyTF9TUkMgLSBbMTowXSAqLworCisvKgorICogUjIwNTcgKDB4ODA5KSAtIFJpZ2h0IFBETSBTcGVha2VyIDIKKyAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfRU5BICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFNQSzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDEwCS8qIFNQSzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICA0CS8qIFNQSzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxCS8qIFNQSzJSX0VOQSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfTVVURSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CS8qIFNQSzJSX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJSX01VVEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwOAkvKiBTUEsyUl9NVVRFICovCisjZGVmaW5lIFdNODk5NV9TUEsyUl9NVVRFX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDMJLyogU1BLMlJfTVVURSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfTVVURV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxCS8qIFNQSzJSX01VVEUgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJSX01VVEVfWkMgICAgICAgICAgICAgICAgICAgIDB4MDAwNAkvKiBTUEsyUl9NVVRFX1pDICovCisjZGVmaW5lIFdNODk5NV9TUEsyUl9NVVRFX1pDX01BU0sgICAgICAgICAgICAgICAweDAwMDQJLyogU1BLMlJfTVVURV9aQyAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfTVVURV9aQ19TSElGVCAgICAgICAgICAgICAgICAgICAyCS8qIFNQSzJSX01VVEVfWkMgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJSX01VVEVfWkNfV0lEVEggICAgICAgICAgICAgICAgICAgMQkvKiBTUEsyUl9NVVRFX1pDICovCisjZGVmaW5lIFdNODk5NV9TUEsyUl9TUkNfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDMJLyogU1BLMlJfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004OTk1X1NQSzJSX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBTUEsyUl9TUkMgLSBbMTowXSAqLworI2RlZmluZSBXTTg5OTVfU1BLMlJfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyCS8qIFNQSzJSX1NSQyAtIFsxOjBdICovCisKKy8qCisgKiBSMjA1OCAoMHg4MEEpIC0gUERNIFNwZWFrZXIgMiBNdXRlIFNlcXVlbmNlCisgKi8KKyNkZWZpbmUgV004OTk1X1NQSzJfTVVURV9TRVExX01BU0sgICAgICAgICAgICAgIDB4MDBGRgkvKiBTUEsyX01VVEVfU0VRMSAtIFs3OjBdICovCisjZGVmaW5lIFdNODk5NV9TUEsyX01VVEVfU0VRMV9TSElGVCAgICAgICAgICAgICAgICAgIDAJLyogU1BLMl9NVVRFX1NFUTEgLSBbNzowXSAqLworI2RlZmluZSBXTTg5OTVfU1BLMl9NVVRFX1NFUTFfV0lEVEggICAgICAgICAgICAgICAgICA4CS8qIFNQSzJfTVVURV9TRVExIC0gWzc6MF0gKi8KKworI2RlZmluZSBXTTg5OTVfQ0xBU1NfV19TV0lUQ0goeG5hbWUsIHJlZywgc2hpZnQsIG1heCwgaW52ZXJ0KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csIFwKKwkuZ2V0ID0gc25kX3NvY19kYXBtX2dldF92b2xzdywgLnB1dCA9IHdtODk5NV9wdXRfY2xhc3NfdywgXAorCS5wcml2YXRlX3ZhbHVlID0gIFNPQ19TSU5HTEVfVkFMVUUocmVnLCBzaGlmdCwgbWF4LCBpbnZlcnQpIFwKK30KKworc3RydWN0IHdtODk5NV9yZWdfYWNjZXNzIHsKKwl1MTYgcmVhZDsKKwl1MTYgd3JpdGU7CisJdTE2IHZvbDsKK307CisKKy8qIFNvdXJjZXMgZm9yIEFJRjEvMiBTWVNDTEsgLSB1c2Ugd2l0aCBzZXRfZGFpX3N5c2NsaygpICovCitlbnVtIGNsa19zcmMgeworCVdNODk5NV9TWVNDTEtfTUNMSzEgPSAxLAorCVdNODk5NV9TWVNDTEtfTUNMSzIsCisJV004OTk1X1NZU0NMS19GTEwxLAorCVdNODk5NV9TWVNDTEtfRkxMMiwKKwlXTTg5OTVfU1lTQ0xLX09QQ0xLCit9OworCisjZGVmaW5lIFdNODk5NV9GTEwxIDEKKyNkZWZpbmUgV004OTk1X0ZMTDIgMgorCisjZGVmaW5lIFdNODk5NV9GTExfU1JDX01DTEsxICAxCisjZGVmaW5lIFdNODk5NV9GTExfU1JDX01DTEsyICAyCisjZGVmaW5lIFdNODk5NV9GTExfU1JDX0xSQ0xLICAzCisjZGVmaW5lIFdNODk5NV9GTExfU1JDX0JDTEsgICA0CisKKyNlbmRpZiAvKiBfV004OTk1X0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCmluZGV4IGE0ODY2NzAuLjQzODI1YjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwODEuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIApAQCAtMTU4LDcgKzE1Nyw2IEBACiBzdHJ1Y3Qgd205MDgxX3ByaXYgewogCWVudW0gc25kX3NvY19jb250cm9sX3R5cGUgY29udHJvbF90eXBlOwogCXZvaWQgKmNvbnRyb2xfZGF0YTsKLQl1MTYgcmVnX2NhY2hlW1dNOTA4MV9NQVhfUkVHSVNURVIgKyAxXTsKIAlpbnQgc3lzY2xrX3NvdXJjZTsKIAlpbnQgbWNsa19yYXRlOwogCWludCBzeXNjbGtfcmF0ZTsKQEAgLTU5MSw2ICs1ODksMTAgQEAKIAlyZWc1IHw9IGZsbF9kaXYuZmxsX2Nsa19yZWZfZGl2IDw8IFdNOTA4MV9GTExfQ0xLX1JFRl9ESVZfU0hJRlQ7CiAJc25kX3NvY193cml0ZShjb2RlYywgV005MDgxX0ZMTF9DT05UUk9MXzUsIHJlZzUpOwogCisJLyogU2V0IGdhaW4gdG8gdGhlIHJlY29tbWVuZGVkIHZhbHVlICovCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV005MDgxX0ZMTF9DT05UUk9MXzQsCisJCQkgICAgV005MDgxX0ZMTF9HQUlOX01BU0ssIDApOworCiAJLyogRW5hYmxlIHRoZSBGTEwgKi8KIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTkwODFfRkxMX0NPTlRST0xfMSwgcmVnMSB8IFdNOTA4MV9GTExfRU5BKTsKIApAQCAtODA1LDcgKzgwNyw3IEBACiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgogCQkvKiBJbml0aWFsIGNvbGQgc3RhcnQgKi8KLQkJaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogRGlzYWJsZSBMSU5FT1VUIGRpc2NoYXJnZSAqLwogCQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTkwODFfQU5USV9QT1BfQ09OVFJPTCk7CiAJCQlyZWcgJj0gfldNOTA4MV9MSU5FT1VUX0RJU0NIOwpAQCAtODY1LDcgKzg2Nyw3IEBACiAJCWJyZWFrOwogCX0KIAotCWNvZGVjLT5iaWFzX2xldmVsID0gbGV2ZWw7CisJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IGxldmVsOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjI4LDYgKzEyMzAsNyBAQAogc3RhdGljIGludCB3bTkwODFfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB3bTkwODFfcHJpdiAqd205MDgxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAJdTE2IHJlZzsKIApAQCAtMTI2OSw5ICsxMjcyLDkgQEAKIAkJCQkgICAgIEFSUkFZX1NJWkUod205MDgxX2VxX2NvbnRyb2xzKSk7CiAJfQogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd205MDgxX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtOTA4MV9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtOTA4MV9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fcGF0aHMsIEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19wYXRocywgQVJSQVlfU0laRShhdWRpb19wYXRocykpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCmluZGV4IDZlNWY2NGYuLmE3ODhjNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC93bTkwOTAuaD4KIApAQCAtNDQyLDMxICs0NDEsMzIgQEAKIHN0YXRpYyBpbnQgd205MDkwX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtOTA5MF9wcml2ICp3bTkwOTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGk7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTkwOTBfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd205MDkwX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod205MDkwX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgd205MDkwX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKHdtOTA5MF9jb250cm9scykpOwogCiAJaWYgKHdtOTA5MC0+cGRhdGEubGluMV9kaWZmKSB7Ci0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXBfaW4xX2RpZmYsCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcF9pbjFfZGlmZiwKIAkJCQkJQVJSQVlfU0laRShhdWRpb19tYXBfaW4xX2RpZmYpKTsKIAl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwX2luMV9zZSwKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwX2luMV9zZSwKIAkJCQkJQVJSQVlfU0laRShhdWRpb19tYXBfaW4xX3NlKSk7CiAJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTkwOTBfaW4xX3NlX2NvbnRyb2xzLAogCQkJCSAgICAgQVJSQVlfU0laRSh3bTkwOTBfaW4xX3NlX2NvbnRyb2xzKSk7CiAJfQogCiAJaWYgKHdtOTA5MC0+cGRhdGEubGluMl9kaWZmKSB7Ci0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXBfaW4yX2RpZmYsCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcF9pbjJfZGlmZiwKIAkJCQkJQVJSQVlfU0laRShhdWRpb19tYXBfaW4yX2RpZmYpKTsKIAl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwX2luMl9zZSwKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwX2luMl9zZSwKIAkJCQkJQVJSQVlfU0laRShhdWRpb19tYXBfaW4yX3NlKSk7CiAJCXNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTkwOTBfaW4yX3NlX2NvbnRyb2xzLAogCQkJCSAgICAgQVJSQVlfU0laRSh3bTkwOTBfaW4yX3NlX2NvbnRyb2xzKSk7CkBAIC01MTMsNyArNTEzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBSZXN0b3JlIHRoZSByZWdpc3RlciBjYWNoZSAqLwogCQkJZm9yIChpID0gMTsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplOyBpKyspIHsKIAkJCQlpZiAocmVnX2NhY2hlW2ldID09IHdtOTA5MF9yZWdfZGVmYXVsdHNbaV0pCkBAIC01NDMsNyArNTQzLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCmluZGV4IGExNDRhY2QuLjQ3YjM1N2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgIndtOTcwNS5oIgogCkBAIC0yMDMsOSArMjAyLDExIEBACiAKIHN0YXRpYyBpbnQgd205NzA1X2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTk3MDVfZGFwbV93aWRnZXRzLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd205NzA1X2RhcG1fd2lkZ2V0cywKIAkJCQkJQVJSQVlfU0laRSh3bTk3MDVfZGFwbV93aWRnZXRzKSk7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCmluZGV4IGQyZjIyNGQuLmJmNWQ0ZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlICJ3bTk3MTIuaCIKIAogI2RlZmluZSBXTTk3MTJfVkVSU0lPTiAiMC40IgpAQCAtNDMyLDEwICs0MzEsMTEgQEAKIAogc3RhdGljIGludCB3bTk3MTJfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtOTcxMl9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHdtOTcxMl9kYXBtX3dpZGdldHMpKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd205NzEyX2RhcG1fd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUod205NzEyX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTcwLDcgKzU3MCw3IEBACiAJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJET1dOLCAweGZmZmYpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCmluZGV4IDdkYTEzYjAuLjM4ZWQ5ODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSAid205NzEzLmgiCiAKQEAgLTY0NywxMCArNjQ2LDEyIEBACiAKIHN0YXRpYyBpbnQgd205NzEzX2FkZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTk3MTNfZGFwbV93aWRnZXRzLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd205NzEzX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod205NzEzX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNDcsNyArMTE0OCw3IEBACiAJCWFjOTdfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJET1dOLCAweGZmZmYpOwogCQlicmVhazsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21faHVicy5jIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKaW5kZXggMGUyNDA5Mi4uYzQ2Njk4MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CiAKQEAgLTk0LDQxICs5Myw2MSBAQAogCXN0cnVjdCB3bV9odWJzX2RhdGEgKmh1YnMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAl1MTYgcmVnLCByZWdfbCwgcmVnX3IsIGRjc19jZmc7CiAKLQkvKiBTZXQgZm9yIDMyIHNlcmllcyB1cGRhdGVzICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTkzX0RDX1NFUlZPXzEsCi0JCQkgICAgV004OTkzX0RDU19TRVJJRVNfTk9fMDFfTUFTSywKLQkJCSAgICAzMiA8PCBXTTg5OTNfRENTX1NFUklFU19OT18wMV9TSElGVCk7Ci0Jd2FpdF9mb3JfZGNfc2Vydm8oY29kZWMsCi0JCQkgIFdNODk5M19EQ1NfVFJJR19TRVJJRVNfMCB8IFdNODk5M19EQ1NfVFJJR19TRVJJRVNfMSk7CisJLyogSWYgd2UncmUgdXNpbmcgYSBkaWdpdGFsIG9ubHkgcGF0aCBhbmQgaGF2ZSBhIHByZXZpb3VzbHkKKwkgKiBjYWxsaWJyYXRlZCBEQyBzZXJ2byBvZmZzZXQgc3RvcmVkIHRoZW4gdXNlIHRoYXQuICovCisJaWYgKGh1YnMtPmNsYXNzX3cgJiYgaHVicy0+Y2xhc3Nfd19kY3MpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiVXNpbmcgY2FjaGVkIERDIHNlcnZvIG9mZnNldCAleFxuIiwKKwkJCWh1YnMtPmNsYXNzX3dfZGNzKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgV004OTkzX0RDX1NFUlZPXzMsIGh1YnMtPmNsYXNzX3dfZGNzKTsKKwkJd2FpdF9mb3JfZGNfc2Vydm8oY29kZWMsCisJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzAgfAorCQkJCSAgV004OTkzX0RDU19UUklHX0RBQ19XUl8xKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERldmljZXMgbm90IHVzaW5nIGEgRENTIGNvZGUgY29ycmVjdGlvbiBoYXZlIHN0YXJ0dXAgbW9kZSAqLworCWlmIChodWJzLT5kY3NfY29kZXMpIHsKKwkJLyogU2V0IGZvciAzMiBzZXJpZXMgdXBkYXRlcyAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMSwKKwkJCQkgICAgV004OTkzX0RDU19TRVJJRVNfTk9fMDFfTUFTSywKKwkJCQkgICAgMzIgPDwgV004OTkzX0RDU19TRVJJRVNfTk9fMDFfU0hJRlQpOworCQl3YWl0X2Zvcl9kY19zZXJ2byhjb2RlYywKKwkJCQkgIFdNODk5M19EQ1NfVFJJR19TRVJJRVNfMCB8CisJCQkJICBXTTg5OTNfRENTX1RSSUdfU0VSSUVTXzEpOworCX0gZWxzZSB7CisJCXdhaXRfZm9yX2RjX3NlcnZvKGNvZGVjLAorCQkJCSAgV004OTkzX0RDU19UUklHX1NUQVJUVVBfMCB8CisJCQkJICBXTTg5OTNfRENTX1RSSUdfU1RBUlRVUF8xKTsKKwl9CisKKwkvKiBEaWZmZXJlbnQgY2hpcHMgaW4gdGhlIGZhbWlseSBzdXBwb3J0IGRpZmZlcmVudCByZWFkYmFjaworCSAqIG1ldGhvZHMuCisJICovCisJc3dpdGNoIChodWJzLT5kY3NfcmVhZGJhY2tfbW9kZSkgeworCWNhc2UgMDoKKwkJcmVnX2wgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5M19EQ19TRVJWT19SRUFEQkFDS18xKQorCQkJJiBXTTg5OTNfRENTX0lOVEVHX0NIQU5fMF9NQVNLOworCQlyZWdfciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPX1JFQURCQUNLXzIpCisJCQkmIFdNODk5M19EQ1NfSU5URUdfQ0hBTl8xX01BU0s7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5OTNfRENfU0VSVk9fMyk7CisJCXJlZ19sID0gKHJlZyAmIFdNODk5M19EQ1NfREFDX1dSX1ZBTF8xX01BU0spCisJCQk+PiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9TSElGVDsKKwkJcmVnX3IgPSByZWcgJiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMF9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJVbmtub3duIERDUyByZWFkYmFjayBtZXRob2RcbiIpOworCQlicmVhazsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJEQ1MgaW5wdXQ6ICV4ICV4XG4iLCByZWdfbCwgcmVnX3IpOwogCiAJLyogQXBwbHkgY29ycmVjdGlvbiB0byBEQyBzZXJ2byByZXN1bHQgKi8KIAlpZiAoaHVicy0+ZGNzX2NvZGVzKSB7CiAJCWRldl9kYmcoY29kZWMtPmRldiwgIkFwcGx5aW5nICVkIGNvZGUgREMgc2Vydm8gY29ycmVjdGlvblxuIiwKIAkJCWh1YnMtPmRjc19jb2Rlcyk7CiAKLQkJLyogRGlmZmVyZW50IGNoaXBzIGluIHRoZSBmYW1pbHkgc3VwcG9ydCBkaWZmZXJlbnQKLQkJICogcmVhZGJhY2sgbWV0aG9kcy4KLQkJICovCi0JCXN3aXRjaCAoaHVicy0+ZGNzX3JlYWRiYWNrX21vZGUpIHsKLQkJY2FzZSAwOgotCQkJcmVnX2wgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk5M19EQ19TRVJWT19SRUFEQkFDS18xKQotCQkJCSYgV004OTkzX0RDU19JTlRFR19DSEFOXzBfTUFTSzs7Ci0JCQlyZWdfciA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPX1JFQURCQUNLXzIpCi0JCQkJJiBXTTg5OTNfRENTX0lOVEVHX0NIQU5fMV9NQVNLOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlZyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004OTkzX0RDX1NFUlZPXzMpOwotCQkJcmVnX2wgPSAocmVnICYgV004OTkzX0RDU19EQUNfV1JfVkFMXzFfTUFTSykKLQkJCQk+PiBXTTg5OTNfRENTX0RBQ19XUl9WQUxfMV9TSElGVDsKLQkJCXJlZ19yID0gcmVnICYgV004OTkzX0RDU19EQUNfV1JfVkFMXzBfTUFTSzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJV0FSTigxLCAiVW5rbm93biBEQ1MgcmVhZGJhY2sgbWV0aG9kXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRENTIGlucHV0OiAleCAleFxuIiwgcmVnX2wsIHJlZ19yKTsKLQogCQkvKiBIUE9VVDFMICovCiAJCWlmIChyZWdfbCArIGh1YnMtPmRjc19jb2RlcyA+IDAgJiYKIAkJICAgIHJlZ19sICsgaHVicy0+ZGNzX2NvZGVzIDwgMHhmZikKQEAgLTE0OCw3ICsxNjcsMTUgQEAKIAkJd2FpdF9mb3JfZGNfc2Vydm8oY29kZWMsCiAJCQkJICBXTTg5OTNfRENTX1RSSUdfREFDX1dSXzAgfAogCQkJCSAgV004OTkzX0RDU19UUklHX0RBQ19XUl8xKTsKKwl9IGVsc2UgeworCQlkY3NfY2ZnID0gcmVnX2wgPDwgV004OTkzX0RDU19EQUNfV1JfVkFMXzFfU0hJRlQ7CisJCWRjc19jZmcgfD0gcmVnX3I7CiAJfQorCisJLyogU2F2ZSB0aGUgY2FsbGlicmF0ZWQgb2Zmc2V0IGlmIHdlJ3JlIGluIGNsYXNzIFcgbW9kZSBhbmQKKwkgKiB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSBhbnkgYW5hbG9ndWUgc2lnbmFsIG1peGVkIGluLiAqLworCWlmIChodWJzLT5jbGFzc193KQorCQlodWJzLT5jbGFzc193X2RjcyA9IGRjc19jZmc7CiB9CiAKIC8qCkBAIC0xNjMsNiArMTkwLDkgQEAKIAogCXJldCA9IHNuZF9zb2NfcHV0X3ZvbHN3XzJyKGtjb250cm9sLCB1Y29udHJvbCk7CiAKKwkvKiBVcGRhdGluZyB0aGUgYW5hbG9ndWUgZ2FpbnMgaW52YWxpZGF0ZXMgdGhlIERDIHNlcnZvIGNhY2hlICovCisJaHVicy0+Y2xhc3Nfd19kY3MgPSAwOworCiAJLyogSWYgd2UncmUgYXBwbHlpbmcgYW4gb2Zmc2V0IGNvcnJlY3Rpb24gdGhlbiB1cGRhdGluZyB0aGUKIAkgKiBjYWxsaWJyYXRpb24gd291bGQgYmUgbGlrZWx5IHRvIGludHJvZHVjZSBmdXJ0aGVyIG9mZnNldHMuICovCiAJaWYgKGh1YnMtPmRjc19jb2RlcykKQEAgLTc5MSw2ICs4MjEsOCBAQAogCiBpbnQgd21faHVic19hZGRfYW5hbG9ndWVfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogeworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwogCS8qIExhdGNoIHZvbHVtZSB1cGRhdGUgYml0cyAmIGRlZmF1bHQgWkMgb24gKi8KIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfTEVGVF9MSU5FX0lOUFVUXzFfMl9WT0xVTUUsCiAJCQkgICAgV004OTkzX0lOMV9WVSwgV004OTkzX0lOMV9WVSk7CkBAIC04MTksNyArODUxLDcgQEAKIAlzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgYW5hbG9ndWVfc25kX2NvbnRyb2xzLAogCQkJICAgICBBUlJBWV9TSVpFKGFuYWxvZ3VlX3NuZF9jb250cm9scykpOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgYW5hbG9ndWVfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYW5hbG9ndWVfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhbmFsb2d1ZV9kYXBtX3dpZGdldHMpKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTgyOCwyNCArODYwLDI2IEBACiBpbnQgd21faHVic19hZGRfYW5hbG9ndWVfcm91dGVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQlpbnQgbGluZW91dDFfZGlmZiwgaW50IGxpbmVvdXQyX2RpZmYpCiB7Ci0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGFuYWxvZ3VlX3JvdXRlcywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhbmFsb2d1ZV9yb3V0ZXMsCiAJCQkJQVJSQVlfU0laRShhbmFsb2d1ZV9yb3V0ZXMpKTsKIAogCWlmIChsaW5lb3V0MV9kaWZmKQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwKIAkJCQkJbGluZW91dDFfZGlmZl9yb3V0ZXMsCiAJCQkJCUFSUkFZX1NJWkUobGluZW91dDFfZGlmZl9yb3V0ZXMpKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLAorCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLAogCQkJCQlsaW5lb3V0MV9zZV9yb3V0ZXMsCiAJCQkJCUFSUkFZX1NJWkUobGluZW91dDFfc2Vfcm91dGVzKSk7CiAKIAlpZiAobGluZW91dDJfZGlmZikKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsCisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sCiAJCQkJCWxpbmVvdXQyX2RpZmZfcm91dGVzLAogCQkJCQlBUlJBWV9TSVpFKGxpbmVvdXQyX2RpZmZfcm91dGVzKSk7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwKIAkJCQkJbGluZW91dDJfc2Vfcm91dGVzLAogCQkJCQlBUlJBWV9TSVpFKGxpbmVvdXQyX3NlX3JvdXRlcykpOwogCkBAIC04NzIsNyArOTA2LDcgQEAKIAkgKiBWTUlEIGFzIGFuIG91dHB1dCBhbmQgY2FuIGRpc2FibGUgaXQuCiAJICovCiAJaWYgKGxpbmVvdXQxX2RpZmYgJiYgbGluZW91dDJfZGlmZikKLQkJY29kZWMtPmlkbGVfYmlhc19vZmYgPSAxOworCQljb2RlYy0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gMTsKIAogCWlmIChsaW5lb3V0MWZiKQogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTNfQURESVRJT05BTF9DT05UUk9MLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bV9odWJzLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAppbmRleCBlNTFjMTY2Li5mOGE1ZTk3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtX2h1YnMuaApAQCAtMjMsNiArMjMsOSBAQAogCWludCBkY3NfY29kZXM7CiAJaW50IGRjc19yZWFkYmFja19tb2RlOwogCWludCBocF9zdGFydHVwX21vZGU7CisKKwlib29sIGNsYXNzX3c7CisJdTE2IGNsYXNzX3dfZGNzOwogfTsKIAogZXh0ZXJuIGludCB3bV9odWJzX2FkZF9hbmFsb2d1ZV9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCmluZGV4IGJjOWU2YjBiLi4wYzJkNmJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMjcsNyArMjYsNiBAQAogI2luY2x1ZGUgPG1hY2gvZWRtYS5oPgogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAKLSNpbmNsdWRlICIuLi9jb2RlY3MvdGx2MzIwYWljM3guaCIKICNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImRhdmluY2ktaTJzLmgiCiAjaW5jbHVkZSAiZGF2aW5jaS1tY2FzcC5oIgpAQCAtMTMyLDI2ICsxMzAsMjcgQEAKIHN0YXRpYyBpbnQgZXZtX2FpYzN4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCS8qIEFkZCBkYXZpbmNpLWV2bSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgYWljM3hfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWljM3hfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpKTsKIAogCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCiAJLyogbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1PTk9fTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhQTENPTSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhQUkNPTSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTU9OT19MT1VUIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUExDT00iKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQUkNPTSIpOwogCiAJLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgT3V0Iik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktc2Zmc2RyLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXNmZnNkci5jCmluZGV4IDZjNjY2NmEuLjBmZTU1OGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktc2Zmc2RyLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1zZmZzZHIuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1pMnMuYyBiL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWkycy5jCmluZGV4IDRmNDg3MzMuLjlhYzkzZjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWkycy5jCisrKyBiL3NvdW5kL3NvYy9lcDkzeHgvZXA5M3h4LWkycy5jCkBAIC0zNTIsMTMgKzM1MiwxMyBAQAogCS5wbGF5YmFjawk9IHsKIAkJLmNoYW5uZWxzX21pbgk9IDIsCiAJCS5jaGFubmVsc19tYXgJPSAyLAotCQkucmF0ZXMJCT0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJLnJhdGVzCQk9IFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAsCiAJCS5mb3JtYXRzCT0gRVA5M1hYX0kyU19GT1JNQVRTLAogCX0sCiAJLmNhcHR1cmUJPSB7CiAJCSAuY2hhbm5lbHNfbWluCT0gMiwKIAkJIC5jaGFubmVsc19tYXgJPSAyLAotCQkgLnJhdGVzCQk9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCSAucmF0ZXMJCT0gU05EUlZfUENNX1JBVEVfODAwMF85NjAwMCwKIAkJIC5mb3JtYXRzCT0gRVA5M1hYX0kyU19GT1JNQVRTLAogCX0sCiAJLm9wcwkJPSAmZXA5M3h4X2kyc19kYWlfb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9lcDkzeHgtcGNtLmMgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYwppbmRleCAyZjEyMWRkLi4wNjY3MDc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L2VwOTN4eC1wY20uYwpAQCAtMzUsOSArMzUsOSBAQAogCQkJCSAgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVECXwKIAkJCQkgICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiksCiAJCQkJICAgCi0JLnJhdGVzCQkJPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5yYXRlcwkJCT0gU05EUlZfUENNX1JBVEVfODAwMF85NjAwMCwKIAkucmF0ZV9taW4JCT0gU05EUlZfUENNX1JBVEVfODAwMCwKLQkucmF0ZV9tYXgJCT0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJLnJhdGVfbWF4CQk9IFNORFJWX1BDTV9SQVRFXzk2MDAwLAogCQogCS5mb3JtYXRzCQk9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CiAJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jIGIvc291bmQvc29jL2VwOTN4eC9zbmFwcGVyY2wxNS5jCmluZGV4IDI4YWI1ZmYuLmRmZTFkN2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9lcDkzeHgvc25hcHBlcmNsMTUuYworKysgYi9zb3VuZC9zb2MvZXA5M3h4L3NuYXBwZXJjbDE1LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtNzksMTEgKzc4LDEyIEBACiBzdGF0aWMgaW50IHNuYXBwZXJjbDE1X3RsdjMyMGFpYzIzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9ldWtyZWEtdGx2MzIwLmMgYi9zb3VuZC9zb2MvaW14L2V1a3JlYS10bHYzMjAuYwppbmRleCBkZDRmZmZkLi5lMjBjOWUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L2V1a3JlYS10bHYzMjAuYworKysgYi9zb3VuZC9zb2MvaW14L2V1a3JlYS10bHYzMjAuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlICIuLi9jb2RlY3MvdGx2MzIwYWljMjMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvaW14LXNzaS5jIGIvc291bmQvc29jL2lteC9pbXgtc3NpLmMKaW5kZXggMzkwYjZmZi4uMzA4OTRlYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2lteC9pbXgtc3NpLmMKKysrIGIvc291bmQvc29jL2lteC9pbXgtc3NpLmMKQEAgLTQ1NiwxMyArNDU2LDEzIEBACiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBpbXhfc3NpX2RhaSA9IHsKIAkucHJvYmUgPSBpbXhfc3NpX2RhaV9wcm9iZSwKIAkucGxheWJhY2sgPSB7Ci0JCS5jaGFubmVsc19taW4gPSAyLAorCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJLmNoYW5uZWxzX21heCA9IDIsCiAJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAsCiAJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCiAJfSwKIAkuY2FwdHVyZSA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19taW4gPSAxLAogCQkuY2hhbm5lbHNfbWF4ID0gMiwKIAkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF85NjAwMCwKIAkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbXgvcGh5Y29yZS1hYzk3LmMgYi9zb3VuZC9zb2MvaW14L3BoeWNvcmUtYWM5Ny5jCmluZGV4IDllYWJjMjguLmE3ZGViNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvcGh5Y29yZS1hYzk3LmMKKysrIGIvc291bmQvc29jL2lteC9waHljb3JlLWFjOTcuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGlteF9waHljb3JlOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC93bTExMzMtZXYxLmMgYi9zb3VuZC9zb2MvaW14L3dtMTEzMy1ldjEuYwppbmRleCAzMGZkYjE1Li43NWI0YzcyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW14L3dtMTEzMy1ldjEuYworKysgYi9zb3VuZC9zb2MvaW14L3dtMTEzMy1ldjEuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdWRtdXguaD4KIApAQCAtMjEzLDExICsyMTIsMTIgQEAKIHN0YXRpYyBpbnQgd20xMTMzX2V2MV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTExMzNfZXYxX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTExMzNfZXYxX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtMTEzM19ldjFfd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIHdtMTEzM19ldjFfbWFwLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHdtMTEzM19ldjFfbWFwLAogCQkJCUFSUkFZX1NJWkUod20xMTMzX2V2MV9tYXApKTsKIAogCS8qIEhlYWRwaG9uZSBqYWNrIGRldGVjdGlvbiAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJd204MzUwX21pY19qYWNrX2RldGVjdChjb2RlYywgJm1pY19qYWNrLCBTTkRfSkFDS19NSUNST1BIT05FLAogCQkJICAgICAgIFNORF9KQUNLX0JUTl8wKTsKIAotCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEJpYXMiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTWljIEJpYXMiKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2p6NDc0MC9qejQ3NDAtaTJzLmMgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYwppbmRleCBmM2NmZmQxLi40MTliZjRmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYworKysgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgImp6NDc0MC1pMnMuaCIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9qejQ3NDAvcWlfbGI2MC5jIGIvc291bmQvc29jL2p6NDc0MC9xaV9sYjYwLmMKaW5kZXggZWYxYTk5ZS4uNDk3MjNlMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2p6NDc0MC9xaV9sYjYwLmMKKysrIGIvc291bmQvc29jL2p6NDc0MC9xaV9sYjYwLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNkZWZpbmUgUUlfTEI2MF9TTkRfR1BJTyBKWl9HUElPX1BPUlRCKDI5KQpAQCAtNTksMTAgKzU4LDExIEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJJTiIpOwogCiAJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBRSV9MQjYwX0RBSUZNVCk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTcwLDkgKzcwLDExIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgcWlfbGI2MF93aWRnZXRzLCBBUlJBWV9TSVpFKHFpX2xiNjBfd2lkZ2V0cykpOwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBxaV9sYjYwX3JvdXRlcywgQVJSQVlfU0laRShxaV9sYjYwX3JvdXRlcykpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHFpX2xiNjBfd2lkZ2V0cywKKwkJCQkgIEFSUkFZX1NJWkUocWlfbGI2MF93aWRnZXRzKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgcWlfbGI2MF9yb3V0ZXMsCisJCQkJQVJSQVlfU0laRShxaV9sYjYwX3JvdXRlcykpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZyBiL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCmluZGV4IDE2ZWMyYTIuLjhmNDllMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9LY29uZmlnCkBAIC0xMSwxMCArMTEsMTkgQEAKIAogY29uZmlnIFNORF9LSVJLV09PRF9TT0NfT1BFTlJECiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBLaXJrd29vZCBPcGVucmQgQ2xpZW50IgotCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiBNQUNIX09QRU5SRF9DTElFTlQKKwlkZXBlbmRzIG9uIFNORF9LSVJLV09PRF9TT0MgJiYgKE1BQ0hfT1BFTlJEX0NMSUVOVCB8fCBNQUNIX09QRU5SRF9VTFRJTUFURSkKIAlzZWxlY3QgU05EX0tJUktXT09EX1NPQ19JMlMKIAlzZWxlY3QgU05EX1NPQ19DUzQyTDUxCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbgogCSAgT3BlbnJkIENsaWVudC4KIAorY29uZmlnIFNORF9LSVJLV09PRF9TT0NfVDUzMjUKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIEhQIHQ1MzI1IgorCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiBNQUNIX1Q1MzI1CisJc2VsZWN0IFNORF9LSVJLV09PRF9TT0NfSTJTCisJc2VsZWN0IFNORF9TT0NfQUxDNTYyMworCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24KKwkgIHRoZSBIUCB0NTMyNSB0aGluIGNsaWVudC4KKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlIGIvc291bmQvc29jL2tpcmt3b29kL01ha2VmaWxlCmluZGV4IDMzYTE2ZGMuLjNlNjJhZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9raXJrd29vZC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mva2lya3dvb2QvTWFrZWZpbGUKQEAgLTUsNSArNSw3IEBACiBvYmotJChDT05GSUdfU05EX0tJUktXT09EX1NPQ19JMlMpICs9IHNuZC1zb2Mta2lya3dvb2QtaTJzLm8KIAogc25kLXNvYy1vcGVucmQtb2JqcyA6PSBraXJrd29vZC1vcGVucmQubworc25kLXNvYy10NTMyNS1vYmpzIDo9IGtpcmt3b29kLXQ1MzI1Lm8KIAogb2JqLSQoQ09ORklHX1NORF9LSVJLV09PRF9TT0NfT1BFTlJEKSArPSBzbmQtc29jLW9wZW5yZC5vCitvYmotJChDT05GSUdfU05EX0tJUktXT09EX1NPQ19UNTMyNSkgKz0gc25kLXNvYy10NTMyNS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2Qtb3BlbnJkLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2Qtb3BlbnJkLmMKaW5kZXggOWQ3YzgxZS4uZDg2M2FmYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLW9wZW5yZC5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1vcGVucmQuYwpAQCAtODYsNyArODYsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIW1hY2hpbmVfaXNfb3BlbnJkX2NsaWVudCgpKQorCWlmICghbWFjaGluZV9pc19vcGVucmRfY2xpZW50KCkgJiYgIW1hY2hpbmVfaXNfb3BlbnJkX3VsdGltYXRlKCkpCiAJCXJldHVybiAwOwogCiAJb3BlbnJkX2NsaWVudF9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC10NTMyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDIxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtdDUzMjUuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIGtpcmt3b29kLXQ1MzI1LmMKKyAqCisgKiAoYykgMjAxMCBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxtYWNoL2tpcmt3b29kLmg+CisjaW5jbHVkZSA8cGxhdC9hdWRpby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL2FsYzU2MjMuaCIKKworc3RhdGljIGludCB0NTMyNV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBmcmVxLCBmbXQ7CisKKwlmbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgZm10KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBmbXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZnJlcSA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTY7CisKKwlyZXR1cm4gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIGZyZXEsIFNORF9TT0NfQ0xPQ0tfSU4pOworCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgdDUzMjVfb3BzID0geworCS5od19wYXJhbXMgPSB0NTMyNV9od19wYXJhbXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdDUzMjVfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIE5VTEwpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgdDUzMjVfcm91dGVbXSA9IHsKKwl7ICJIZWFkcGhvbmUgSmFjayIsCU5VTEwsCSJIUEwiIH0sCisJeyAiSGVhZHBob25lIEphY2siLAlOVUxMLAkiSFBSIiB9LAorCisJeyJTcGVha2VyIiwJCU5VTEwsCSJTUEtPVVQifSwKKwl7IlNwZWFrZXIiLAkJTlVMTCwJIlNQS09VVE4ifSwKKworCXsgIk1JQzEiLAkJTlVMTCwJIk1pYyBKYWNrIiB9LAorCXsgIk1JQzIiLAkJTlVMTCwJIk1pYyBKYWNrIiB9LAorfTsKKworc3RhdGljIGludCB0NTMyNV9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0NTMyNV9kYXBtX3dpZGdldHMsCisJCQkJQVJSQVlfU0laRSh0NTMyNV9kYXBtX3dpZGdldHMpKTsKKworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIHQ1MzI1X3JvdXRlLCBBUlJBWV9TSVpFKHQ1MzI1X3JvdXRlKSk7CisKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHQ1MzI1X2RhaVtdID0geworeworCS5uYW1lID0gIkFMQzU2MjEiLAorCS5zdHJlYW1fbmFtZSA9ICJBTEM1NjIxIEhpRmkiLAorCS5jcHVfZGFpX25hbWUgPSAia2lya3dvb2QtaTJzIiwKKwkucGxhdGZvcm1fbmFtZSA9ICJraXJrd29vZC1wY20tYXVkaW8iLAorCS5jb2RlY19kYWlfbmFtZSA9ICJhbGM1NjIxLWhpZmkiLAorCS5jb2RlY19uYW1lID0gImFsYzU2MngtY29kZWMuMC0wMDFhIiwKKwkub3BzID0gJnQ1MzI1X29wcywKKwkuaW5pdCA9IHQ1MzI1X2RhaV9pbml0LAorfSwKK307CisKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgdDUzMjUgPSB7CisJLm5hbWUgPSAidDUzMjUiLAorCS5kYWlfbGluayA9IHQ1MzI1X2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRSh0NTMyNV9kYWkpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnQ1MzI1X3NuZF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgX19pbml0IHQ1MzI1X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtYWNoaW5lX2lzX3Q1MzI1KCkpCisJCXJldHVybiAwOworCisJdDUzMjVfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghdDUzMjVfc25kX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YSh0NTMyNV9zbmRfZGV2aWNlLAorCQkJJnQ1MzI1KTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQodDUzMjVfc25kX2RldmljZSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGF0Zm9ybV9kZXZpY2VfYWRkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHQ1MzI1X3NuZF9kZXZpY2UpOworCX0KKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdCh0NTMyNV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHQ1MzI1X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0NTMyNV9zbmRfZGV2aWNlKTsKK30KK21vZHVsZV9leGl0KHQ1MzI1X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyB0NTMyNSBhdWRpbyBjbGllbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWF1ZGlvLmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWRpby5jCmluZGV4IDE2MWY1YjYuLjM4YTJkMGQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWRpby5jCisrKyBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWF1ZGlvLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgIm51YzkwMC1hdWRpby5oIgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9hbTM1MTdldm0uYyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCmluZGV4IDk3OWRkNTAuLjE2MTc1MDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL2FtMzUxN2V2bS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KQEAgLTExNCwyMCArMTEzLDIxIEBACiBzdGF0aWMgaW50IGFtMzUxN2V2bV9haWMyM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAkvKiBBZGQgYW0zNTE3LWV2bSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpKTsKIAogCS8qIFNldCB1cCBkYXZpbmNpLWV2bSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCiAJLyogYWx3YXlzIGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgSW4iKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEluIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBJbiIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9hbXMtZGVsdGEuYyBiL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jCmluZGV4IDQzODE0NmEuLjIxMDFiZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTk0LDYgKzk0LDcgQEAKIAkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IHNvY19lbnVtICpjb250cm9sID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIHNob3J0IHBpbnM7CiAJaW50IHBpbiwgY2hhbmdlZCA9IDA7CkBAIC0xMTIsNDggKzExMyw0OCBAQAogCiAJLyogU2V0dXAgcGlucyBhZnRlciBjb3JyZXNwb25kaW5nIGJpdHMgaWYgY2hhbmdlZCAqLwogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfTU9VVEhQSUVDRSkpOwotCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGNvZGVjLCAiTW91dGhwaWVjZSIpKSB7CisJaWYgKHBpbiAhPSBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIk1vdXRocGllY2UiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTW91dGhwaWVjZSIpOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1vdXRocGllY2UiKTsKIAkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTW91dGhwaWVjZSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7CiAJfQogCXBpbiA9ICEhKHBpbnMgJiAoMSA8PCBBTVNfREVMVEFfRUFSUElFQ0UpKTsKLQlpZiAocGluICE9IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIkVhcnBpZWNlIikpIHsKKwlpZiAocGluICE9IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhkYXBtLCAiRWFycGllY2UiKSkgewogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRWFycGllY2UiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFYXJwaWVjZSIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJFYXJwaWVjZSIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFYXJwaWVjZSIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX01JQ1JPUEhPTkUpKTsKLQlpZiAocGluICE9IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIk1pY3JvcGhvbmUiKSkgeworCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJNaWNyb3Bob25lIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pY3JvcGhvbmUiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWNyb3Bob25lIik7CiAJCWVsc2UKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1pY3JvcGhvbmUiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljcm9waG9uZSIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX1NQRUFLRVIpKTsKLQlpZiAocGluICE9IHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIlNwZWFrZXIiKSkgeworCWlmIChwaW4gIT0gc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJTcGVha2VyIikpIHsKIAkJY2hhbmdlZCA9IDE7CiAJCWlmIChwaW4pCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIlNwZWFrZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CiAJCWVsc2UKLQkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIlNwZWFrZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCX0KIAlwaW4gPSAhIShwaW5zICYgKDEgPDwgQU1TX0RFTFRBX0FHQykpOwogCWlmIChwaW4gIT0gYW1zX2RlbHRhX2F1ZGlvX2FnYykgewogCQlhbXNfZGVsdGFfYXVkaW9fYWdjID0gcGluOwogCQljaGFuZ2VkID0gMTsKIAkJaWYgKHBpbikKLQkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiQUdDSU4iKTsKKwkJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBR0NJTiIpOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJBR0NJTiIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBR0NJTiIpOwogCX0KIAlpZiAoY2hhbmdlZCkKLQkJc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKIApAQCAtMTY0LDE5ICsxNjUsMjAgQEAKIAkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJdW5zaWduZWQgc2hvcnQgcGlucywgbW9kZTsKIAotCXBpbnMgPSAoKHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIk1vdXRocGllY2UiKSA8PAorCXBpbnMgPSAoKHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhkYXBtLCAiTW91dGhwaWVjZSIpIDw8CiAJCQkJCQkJQU1TX0RFTFRBX01PVVRIUElFQ0UpIHwKLQkJCShzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoY29kZWMsICJFYXJwaWVjZSIpIDw8CisJCQkoc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJFYXJwaWVjZSIpIDw8CiAJCQkJCQkJQU1TX0RFTFRBX0VBUlBJRUNFKSk7CiAJaWYgKHBpbnMpCi0JCXBpbnMgfD0gKHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIk1pY3JvcGhvbmUiKSA8PAorCQlwaW5zIHw9IChzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIk1pY3JvcGhvbmUiKSA8PAogCQkJCQkJCUFNU19ERUxUQV9NSUNST1BIT05FKTsKIAllbHNlCi0JCXBpbnMgPSAoKHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgIk1pY3JvcGhvbmUiKSA8PAorCQlwaW5zID0gKChzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoZGFwbSwgIk1pY3JvcGhvbmUiKSA8PAogCQkJCQkJCUFNU19ERUxUQV9NSUNST1BIT05FKSB8Ci0JCQkoc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGNvZGVjLCAiU3BlYWtlciIpIDw8CisJCQkoc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKGRhcG0sICJTcGVha2VyIikgPDwKIAkJCQkJCQlBTVNfREVMVEFfU1BFQUtFUikgfAogCQkJKGFtc19kZWx0YV9hdWRpb19hZ2MgPDwgQU1TX0RFTFRBX0FHQykpOwogCkBAIC0zMDAsNiArMzAyLDcgQEAKIHN0YXRpYyB2b2lkIGN4ODE4MDFfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB0dHktPmRpc2NfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAlkZWxfdGltZXJfc3luYygmY3g4MTgwMV90aW1lcik7CiAKQEAgLTMxMiwxMiArMzE1LDEyIEBACiAJdjI1M19vcHMuY2xvc2UodHR5KTsKIAogCS8qIFJldmVydCBiYWNrIHRvIGRlZmF1bHQgYXVkaW8gaW5wdXQvb3V0cHV0IGNvbnN0ZWxsYXRpb24gKi8KLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNb3V0aHBpZWNlIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFYXJwaWVjZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljcm9waG9uZSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIlNwZWFrZXIiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJBR0NJTiIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1vdXRocGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRWFycGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljcm9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQUdDSU4iKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogLyogTGluZSBkaXNjaXBsaW5lIC5oYW5ndXAoKSAqLwpAQCAtNDMyLDE2ICs0MzUsMTYgQEAKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChjb2RlYy0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQogCQkJYW1zX2RlbHRhX2xhdGNoMl93cml0ZShBTVNfREVMVEFfTEFUQ0gyX01PREVNX05SRVNFVCwKIAkJCQkJCUFNU19ERUxUQV9MQVRDSDJfTU9ERU1fTlJFU0VUKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgIT0gU05EX1NPQ19CSUFTX09GRikKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgIT0gU05EX1NPQ19CSUFTX09GRikKIAkJCWFtc19kZWx0YV9sYXRjaDJfd3JpdGUoQU1TX0RFTFRBX0xBVENIMl9NT0RFTV9OUkVTRVQsCiAJCQkJCQkwKTsKIAl9Ci0JY29kZWMtPmJpYXNfbGV2ZWwgPSBsZXZlbDsKKwljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gbGV2ZWw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5Miw2ICs0OTUsNyBAQAogc3RhdGljIGludCBhbXNfZGVsdGFfY3gyMDQ0Ml9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwogCWludCByZXQ7CkBAIC01NDEsNyArNTQ1LDcgQEAKIAl9CiAKIAkvKiBBZGQgYm9hcmQgc3BlY2lmaWMgREFQTSB3aWRnZXRzIGFuZCByb3V0ZXMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBhbXNfZGVsdGFfZGFwbV93aWRnZXRzLAorCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYW1zX2RlbHRhX2RhcG1fd2lkZ2V0cywKIAkJCQkJQVJSQVlfU0laRShhbXNfZGVsdGFfZGFwbV93aWRnZXRzKSk7CiAJaWYgKHJldCkgewogCQlkZXZfd2FybihjYXJkLT5kZXYsCkBAIC01NTAsNyArNTU0LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGFtc19kZWx0YV9hdWRpb19tYXAsCisJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYW1zX2RlbHRhX2F1ZGlvX21hcCwKIAkJCQkJQVJSQVlfU0laRShhbXNfZGVsdGFfYXVkaW9fbWFwKSk7CiAJaWYgKHJldCkgewogCQlkZXZfd2FybihjYXJkLT5kZXYsCkBAIC01NjAsMTMgKzU2NCwxMyBAQAogCX0KIAogCS8qIFNldCB1cCBpbml0aWFsIHBpbiBjb25zdGVsbGF0aW9uICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTW91dGhwaWVjZSIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRWFycGllY2UiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pY3JvcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJTcGVha2VyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQUdDSU4iKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJBR0NPVVQiKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNb3V0aHBpZWNlIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVhcnBpZWNlIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pY3JvcGhvbmUiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFHQ0lOIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBR0NPVVQiKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCS8qIEFkZCB2aXJ0dWFsIHN3aXRjaCAqLwogCXJldCA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhbXNfZGVsdGFfYXVkaW9fY29udHJvbHMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9pZ2VwMDAyMC5jIGIvc291bmQvc29jL29tYXAvaWdlcDAwMjAuYwppbmRleCBmZDNhNDBmLi4wYWUzNDcwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9pZ2VwMDAyMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL2lnZXAwMDIwLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbjgxMC5jIGIvc291bmQvc29jL29tYXAvbjgxMC5jCmluZGV4IGEzYjZkODkuLjgzZDIxM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL244MTAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMzYsNyArMzUsNiBAQAogCiAjaW5jbHVkZSAib21hcC1tY2JzcC5oIgogI2luY2x1ZGUgIm9tYXAtcGNtLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzN4LmgiCiAKICNkZWZpbmUgTjgxMF9IRUFEU0VUX0FNUF9HUElPCTEwCiAjZGVmaW5lIE44MTBfU1BFQUtFUl9BTVBfR1BJTwkxMDEKQEAgLTU4LDYgKzU2LDcgQEAKIAogc3RhdGljIHZvaWQgbjgxMF9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBocCA9IDAsIGxpbmUxbCA9IDA7CiAKIAlzd2l0Y2ggKG44MTBfamFja19mdW5jKSB7CkBAIC03MiwyNSArNzEsMjUgQEAKIAl9CiAKIAlpZiAobjgxMF9zcGtfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOwogCiAJaWYgKGhwKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCWlmIChsaW5lMWwpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTElORTFMIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMSU5FMUwiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxJTkUxTCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkUxTCIpOwogCiAJaWYgKG44MTBfZG1pY19mdW5jKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkRNaWMiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkRNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgbjgxMF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtMjc0LDE3ICsyNzMsMTggQEAKIHN0YXRpYyBpbnQgbjgxMF9haWMzM19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAogCS8qIE5vdCBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTU9OT19MT1VUIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkhQTENPTSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIUFJDT00iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTUlDM0wiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTUlDM1IiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORTFSIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUyTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FMlIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNT05PX0xPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUExDT00iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUFJDT00iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMzTCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzNSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTFSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJSIik7CiAKIAkvKiBBZGQgTjgxMCBzcGVjaWZpYyBjb250cm9scyAqLwogCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhaWMzM19uODEwX2NvbnRyb2xzLApAQCAtMjkzLDEzICsyOTMsMTMgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIEFkZCBOODEwIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBhaWMzM19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBhaWMzM19kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKGFpYzMzX2RhcG1fd2lkZ2V0cykpOwogCiAJLyogU2V0IHVwIE44MTAgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5jIGIvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5jCmluZGV4IDdlODRmMjQuLmQyMDNmNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmMKQEAgLTEwMiw2ICsxMDIsMTcgQEAKIHN0YXRpYyBjb25zdCBpbnQgb21hcDI0eHhfZG1hX3JlcXNbXVsyXSA9IHt9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQorc3RhdGljIGNvbnN0IGludCBvbWFwNDR4eF9kbWFfcmVxc1tdWzJdID0geworCXsgT01BUDQ0WFhfRE1BX01DQlNQMV9UWCwgT01BUDQ0WFhfRE1BX01DQlNQMV9SWCB9LAorCXsgT01BUDQ0WFhfRE1BX01DQlNQMl9UWCwgT01BUDQ0WFhfRE1BX01DQlNQMl9SWCB9LAorCXsgT01BUDQ0WFhfRE1BX01DQlNQM19UWCwgT01BUDQ0WFhfRE1BX01DQlNQM19SWCB9LAorCXsgT01BUDQ0WFhfRE1BX01DQlNQNF9UWCwgT01BUDQ0WFhfRE1BX01DQlNQNF9SWCB9LAorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgaW50IG9tYXA0NHh4X2RtYV9yZXFzW11bMl0gPSB7fTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQyMCkKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG9tYXAyNDIwX21jYnNwX3BvcnRbXVsyXSA9IHsKIAl7IE9NQVAyNFhYX01DQlNQMV9CQVNFICsgT01BUF9NQ0JTUF9SRUdfRFhSMSwKQEAgLTE0Nyw2ICsxNTgsMjEgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG9tYXAzNHh4X21jYnNwX3BvcnRbXVsyXSA9IHt9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgb21hcDQ0eHhfbWNic3BfcG9ydFtdWzJdID0geworCXsgT01BUDQ0WFhfTUNCU1AxX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQNDRYWF9NQ0JTUDFfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDQ0WFhfTUNCU1AyX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQNDRYWF9NQ0JTUDJfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDQ0WFhfTUNCU1AzX0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQNDRYWF9NQ0JTUDNfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorCXsgT01BUDQ0WFhfTUNCU1A0X0JBU0UgKyBPTUFQX01DQlNQX1JFR19EWFIsCisJICBPTUFQNDRYWF9NQ0JTUDRfQkFTRSArIE9NQVBfTUNCU1BfUkVHX0RSUiB9LAorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBvbWFwNDR4eF9tY2JzcF9wb3J0W11bMl0gPSB7fTsKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBvbWFwX21jYnNwX3NldF90aHJlc2hvbGQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwpAQCAtMjI0LDcgKzI1MCw3IEBACiAJICogMiBjaGFubmVscyAoc3RlcmVvKTogc2l6ZSBpcyAxMjggLyAyID0gNjQgZnJhbWVzICgyICogNjQgd29yZHMpCiAJICogNCBjaGFubmVsczogc2l6ZSBpcyAxMjggLyA0ID0gMzIgZnJhbWVzICg0ICogMzIgd29yZHMpCiAJICovCi0JaWYgKGNwdV9pc19vbWFwMzQzeCgpKSB7CisJaWYgKGNwdV9pc19vbWFwMzQzeCgpIHx8IGNwdV9pc19vbWFwNDR4eCgpKSB7CiAJCS8qCiAJCSogUnVsZSBmb3IgdGhlIGJ1ZmZlciBzaXplLiBXZSBzaG91bGQgbm90IGFsbG93CiAJCSogc21hbGxlciBidWZmZXIgdGhhbiB0aGUgRklGTyBzaXplIHRvIGF2b2lkIHVuZGVycnVucwpAQCAtMzMyLDYgKzM1OCw5IEBACiAJfSBlbHNlIGlmIChjcHVfaXNfb21hcDM0M3goKSkgewogCQlkbWEgPSBvbWFwMjR4eF9kbWFfcmVxc1tidXNfaWRdW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAkJcG9ydCA9IG9tYXAzNHh4X21jYnNwX3BvcnRbYnVzX2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJIH0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKKwkJZG1hID0gb21hcDQ0eHhfZG1hX3JlcXNbYnVzX2lkXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJCXBvcnQgPSBvbWFwNDR4eF9tY2JzcF9wb3J0W2J1c19pZF1bc3Vic3RyZWFtLT5zdHJlYW1dOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTQ5OCwxMSArNTI3LDExIEBACiAJcmVncy0+c3BjcjIJfD0gWElOVE0oMykgfCBGUkVFOwogCXJlZ3MtPnNwY3IxCXw9IFJJTlRNKDMpOwogCS8qIFJGSUcgYW5kIFhGSUcgYXJlIG5vdCBkZWZpbmVkIGluIDM0eHggKi8KLQlpZiAoIWNwdV9pc19vbWFwMzR4eCgpKSB7CisJaWYgKCFjcHVfaXNfb21hcDM0eHgoKSAmJiAhY3B1X2lzX29tYXA0NHh4KCkpIHsKIAkJcmVncy0+cmNyMgl8PSBSRklHOwogCQlyZWdzLT54Y3IyCXw9IFhGSUc7CiAJfQotCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkgeworCWlmIChjcHVfaXNfb21hcDI0MzAoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDQ0eHgoKSkgewogCQlyZWdzLT54Y2NyID0gRFhFTkRMWSgxKSB8IFhETUFFTiB8IFhESVNBQkxFOwogCQlyZWdzLT5yY2NyID0gUkZVTExfQ1lDTEUgfCBSRE1BRU4gfCBSRElTQUJMRTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmggYi9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jYnNwLmgKaW5kZXggZmZkY2M1YS4uMTEwYzEwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1tY2JzcC5oCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNic3AuaApAQCAtNTAsNiArNTAsMTAgQEAKICN1bmRlZiAgTlVNX0xJTktTCiAjZGVmaW5lIE5VTV9MSU5LUwkzCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVA0KQorI3VuZGVmICBOVU1fTElOS1MKKyNkZWZpbmUgTlVNX0xJTktTCTQKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDMpCiAjdW5kZWYgIE5VTV9MSU5LUwogI2RlZmluZSBOVU1fTElOS1MJNQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcDJldm0uYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAyZXZtLmMKaW5kZXggY2YzZmM4YS4uMjliNjBkNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcDJldm0uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwMmV2bS5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAzYmVhZ2xlLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM2JlYWdsZS5jCmluZGV4IGU1NjgzMmIuLjQwZGI4MTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAzYmVhZ2xlLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcDNiZWFnbGUuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jIGIvc291bmQvc29jL29tYXAvb21hcDNldm0uYwppbmRleCA4MTBmMWUzNi4uMGRhYTA0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcDNldm0uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM2V2bS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAzcGFuZG9yYS5jIGIvc291bmQvc29jL29tYXAvb21hcDNwYW5kb3JhLmMKaW5kZXggNGVlMzNjZS4uODA0N2M1MjFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwM3BhbmRvcmEuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CkBAIC0xNzAsNTEgKzE2OSw1MyBAQAogc3RhdGljIGludCBvbWFwM3BhbmRvcmFfb3V0X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCiAJLyogQWxsIFRXTDQwMzAgb3V0cHV0IHBpbnMgYXJlIGZsb2F0aW5nICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkVBUlBJRUNFIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBSRURSSVZFTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJQUkVEUklWRVIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSFNPTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIU09SIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVEwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQ0FSS0lUUiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIRkwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiSEZSIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlZJQlJBIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiRUFSUElFQ0UiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQUkVEUklWRUwiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQUkVEUklWRVIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIU09MIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSFNPUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVEwiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJDQVJLSVRSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSEZMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSEZSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiVklCUkEiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIG9tYXAzcGFuZG9yYV9vdXRfZGFwbV93aWRnZXRzLAorCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgb21hcDNwYW5kb3JhX291dF9kYXBtX3dpZGdldHMsCiAJCQkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfb3V0X2RhcG1fd2lkZ2V0cykpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIG9tYXAzcGFuZG9yYV9vdXRfbWFwLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIG9tYXAzcGFuZG9yYV9vdXRfbWFwLAogCQlBUlJBWV9TSVpFKG9tYXAzcGFuZG9yYV9vdXRfbWFwKSk7CiAKLQlyZXR1cm4gc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXJldHVybiBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogc3RhdGljIGludCBvbWFwM3BhbmRvcmFfaW5faW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKIAkvKiBOb3QgY29tbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIU01JQyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDQVJLSVRNSUMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRElHSU1JQzAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRElHSU1JQzEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIU01JQyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVE1JQyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkRJR0lNSUMwIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiRElHSU1JQzEiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIG9tYXAzcGFuZG9yYV9pbl9kYXBtX3dpZGdldHMsCisJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBvbWFwM3BhbmRvcmFfaW5fZGFwbV93aWRnZXRzLAogCQkJCUFSUkFZX1NJWkUob21hcDNwYW5kb3JhX2luX2RhcG1fd2lkZ2V0cykpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIG9tYXAzcGFuZG9yYV9pbl9tYXAsCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgb21hcDNwYW5kb3JhX2luX21hcCwKIAkJQVJSQVlfU0laRShvbWFwM3BhbmRvcmFfaW5fbWFwKSk7CiAKLQlyZXR1cm4gc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXJldHVybiBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBvbWFwM3BhbmRvcmFfb3BzID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb3NrNTkxMi5jIGIvc291bmQvc29jL29tYXAvb3NrNTkxMi5jCmluZGV4IDY1YWUwMGUuLjdlNzVlNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29zazU5MTIuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vc2s1OTEyLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpAQCAtMTE2LDE5ICsxMTUsMjAgQEAKIHN0YXRpYyBpbnQgb3NrX3RsdjMyMGFpYzIzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCS8qIEFkZCBvc2s1OTEyIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cykpOwogCiAJLyogU2V0IHVwIG9zazU5MTIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgSW4iKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb3Zlcm8uYyBiL3NvdW5kL3NvYy9vbWFwL292ZXJvLmMKaW5kZXggZTk1YTYwNy4uYmJjZjM4MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb3Zlcm8uYworKysgYi9zb3VuZC9zb2Mvb21hcC9vdmVyby5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL3J4NTEuYyBiL3NvdW5kL3NvYy9vbWFwL3J4NTEuYwppbmRleCAwNGI1NzIzLi4wOWZiMGRmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKKysrIGIvc291bmQvc29jL29tYXAvcng1MS5jCkBAIC0zMCwxNCArMzAsMTIgQEAKICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxwbGF0L21jYnNwLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSAib21hcC1tY2JzcC5oIgogI2luY2x1ZGUgIm9tYXAtcGNtLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzN4LmgiCiAKICNkZWZpbmUgUlg1MV9UVk9VVF9TRUxfR1BJTwkJNDAKICNkZWZpbmUgUlg1MV9KQUNLX0RFVEVDVF9HUElPCQkxNzcKQEAgLTU4LDE5ICs1NiwyMSBAQAogCiBzdGF0aWMgdm9pZCByeDUxX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAlpZiAocng1MV9zcGtfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJFeHQgU3BrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOwogCWlmIChyeDUxX2RtaWNfZnVuYykKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJETWljIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJETWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRE1pYyIpOwogCiAJZ3Bpb19zZXRfdmFsdWUoUlg1MV9UVk9VVF9TRUxfR1BJTywKIAkJICAgICAgIHJ4NTFfamFja19mdW5jID09IFJYNTFfSkFDS19UVk9VVCk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgcng1MV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtMjQ0LDEyICsyNDQsMTMgQEAKIHN0YXRpYyBpbnQgcng1MV9haWMzNF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAogCS8qIFNldCB1cCBOQyBjb2RlYyBwaW5zICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1JQzNMIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1JQzNSIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUxUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzNMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTUlDM1IiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FMVIiKTsKIAogCS8qIEFkZCBSWC01MSBzcGVjaWZpYyBjb250cm9scyAqLwogCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCBhaWMzNF9yeDUxX2NvbnRyb2xzLApAQCAtMjU4LDEzICsyNTksMTMgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIEFkZCBSWC01MSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgYWljMzRfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgYWljMzRfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShhaWMzNF9kYXBtX3dpZGdldHMpKTsKIAogCS8qIFNldCB1cCBSWC01MSBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJLyogQVYgamFjayBkZXRlY3Rpb24gKi8KIAllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiQVYgSmFjayIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9zZHAzNDMwLmMgYi9zb3VuZC9zb2Mvb21hcC9zZHAzNDMwLmMKaW5kZXggMDdmYmNmNy4uM2Y3MmQxNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvc2RwMzQzMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL3NkcDM0MzAuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0xOTEsMzkgKzE5MCw0MCBAQAogc3RhdGljIGludCBzZHAzNDMwX3R3bDQwMzBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKIAkvKiBBZGQgU0RQMzQzMCBzcGVjaWZpYyB3aWRnZXRzICovCi0JcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgc2RwMzQzMF90d2w0MDMwX2RhcG1fd2lkZ2V0cywKKwlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHNkcDM0MzBfdHdsNDAzMF9kYXBtX3dpZGdldHMsCiAJCQkJQVJSQVlfU0laRShzZHAzNDMwX3R3bDQwMzBfZGFwbV93aWRnZXRzKSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIFNldCB1cCBTRFAzNDMwIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAkvKiBTRFAzNDMwIGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgU3BrIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgU3RlcmVvcGhvbmUiKTsKIAogCS8qIFRXTDQwMzAgbm90IGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkFVWEwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQVVYUiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDQVJLSVRNSUMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRElHSU1JQzAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRElHSU1JQzEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJBVVhMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQVVYUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVE1JQyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkRJR0lNSUMwIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiRElHSU1JQzEiKTsKIAotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVRMIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVFIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiRUFSUElFQ0UiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUFJFRFJJVkVMIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBSRURSSVZFUiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDQVJLSVRMIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVFIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVRMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkVBUlBJRUNFIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUFJFRFJJVkVMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUFJFRFJJVkVSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0FSS0lUTCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVFIiKTsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMgYi9zb3VuZC9zb2Mvb21hcC9zZHA0NDMwLmMKaW5kZXggNGI0NDYzZC4uMTg5ZTAzOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvc2RwNDQzMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL3NkcDQ0MzAuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8cGxhdC9oYXJkd2FyZS5oPgpAQCAtNjYsNiArNjYsMjEgQEAKIAkuaHdfcGFyYW1zID0gc2RwNDQzMF9od19wYXJhbXMsCiB9OwogCisvKiBIZWFkc2V0IGphY2sgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrIGhzX2phY2s7CisKKy8qSGVhZHNldCBqYWNrIGRldGVjdGlvbiBEQVBNIHBpbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBoc19qYWNrX3BpbnNbXSA9IHsKKwl7CisJCS5waW4gPSAiSGVhZHNldCBNaWMiLAorCQkubWFzayA9IFNORF9KQUNLX01JQ1JPUEhPTkUsCisJfSwKKwl7CisJCS5waW4gPSAiSGVhZHNldCBTdGVyZW9waG9uZSIsCisJCS5tYXNrID0gU05EX0pBQ0tfSEVBRFBIT05FLAorCX0sCit9OworCiBzdGF0aWMgaW50IHNkcDQ0MzBfZ2V0X3Bvd2VyX21vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CkBAIC0xMDIsNiArMTE3LDcgQEAKIAlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9IUCgiSGVhZHNldCBTdGVyZW9waG9uZSIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9TUEsoIkVhcnBob25lIFNwayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQXV4L0ZNIFN0ZXJlbyBJbiIpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXVkaW9fbWFwW10gPSB7CkBAIC0xMjQsMTEgKzE0MCwxNiBAQAogCiAJLyogRWFycGhvbmUgc3BlYWtlciAqLwogCXsiRWFycGhvbmUgU3BrIiwgTlVMTCwgIkVQIn0sCisKKwkvKiBBdXgvRk0gU3RlcmVvIEluOiBBRk1MLCBBRk1SICovCisJeyJBRk1MIiwgTlVMTCwgIkF1eC9GTSBTdGVyZW8gSW4ifSwKKwl7IkFGTVIiLCBOVUxMLCAiQXV4L0ZNIFN0ZXJlbyBJbiJ9LAogfTsKIAogc3RhdGljIGludCBzZHA0NDMwX3R3bDYwNDBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKIAkvKiBBZGQgU0RQNDQzMCBzcGVjaWZpYyBjb250cm9scyAqLwpAQCAtMTM4LDI1ICsxNTksMzkgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIEFkZCBTRFA0NDMwIHNwZWNpZmljIHdpZGdldHMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBzZHA0NDMwX3R3bDYwNDBfZGFwbV93aWRnZXRzLAorCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgc2RwNDQzMF90d2w2MDQwX2RhcG1fd2lkZ2V0cywKIAkJCQlBUlJBWV9TSVpFKHNkcDQ0MzBfdHdsNjA0MF9kYXBtX3dpZGdldHMpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJLyogU2V0IHVwIFNEUDQ0MzAgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIFNEUDQ0MzAgY29ubmVjdGVkIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkV4dCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBRk1MIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFGTVIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOwogCi0JLyogVFdMNjA0MCBub3QgY29ubmVjdGVkIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQUZNTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJBRk1SIik7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCisJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsCisJCQkJU05EX0pBQ0tfSEVBRFNFVCwgJmhzX2phY2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2phY2tfYWRkX3BpbnMoJmhzX2phY2ssIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSwKKwkJCQloc19qYWNrX3BpbnMpOworCisJaWYgKG1hY2hpbmVfaXNfb21hcF80NDMwc2RwKCkpCisJCXR3bDYwNDBfaHNfamFja19kZXRlY3QoY29kZWMsICZoc19qYWNrLCBTTkRfSkFDS19IRUFEU0VUKTsKKwllbHNlCisJCXNuZF9zb2NfamFja19yZXBvcnQoJmhzX2phY2ssIFNORF9KQUNLX0hFQURTRVQsIFNORF9KQUNLX0hFQURTRVQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL3pvb20yLmMgYi9zb3VuZC9zb2Mvb21hcC96b29tMi5jCmluZGV4IDcxODAzMWUuLjAxNzA5OTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL3pvb20yLmMKKysrIGIvc291bmQvc29jL29tYXAvem9vbTIuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CkBAIC0xNjIsMzUgKzE2MSwzNiBAQAogc3RhdGljIGludCB6b29tMl90d2w0MDMwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCiAJLyogQWRkIFpvb20yIHNwZWNpZmljIHdpZGdldHMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB6b29tMl90d2w0MDMwX2RhcG1fd2lkZ2V0cywKKwlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHpvb20yX3R3bDQwMzBfZGFwbV93aWRnZXRzLAogCQkJCUFSUkFZX1NJWkUoem9vbTJfdHdsNDAzMF9kYXBtX3dpZGdldHMpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJLyogU2V0IHVwIFpvb20yIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAkvKiBab29tMiBjb25uZWN0ZWQgcGlucyAqLwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IFNwayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgU3RlcmVvcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1eCBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgTWljIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBdXggSW4iKTsKIAogCS8qIFRXTDQwMzAgbm90IGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVE1JQyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJESUdJTUlDMCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJESUdJTUlDMSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJFQVJQSUVDRSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJQUkVEUklWRUwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUFJFRFJJVkVSIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNBUktJVEwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiQ0FSS0lUUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVE1JQyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkRJR0lNSUMwIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiRElHSU1JQzEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJFQVJQSUVDRSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlBSRURSSVZFTCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlBSRURSSVZFUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNBUktJVEwiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJDQVJLSVRSIik7CiAKLQlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9jb3JnaS5jIGIvc291bmQvc29jL3B4YS9jb3JnaS5jCmluZGV4IGY0NTFhY2QuLmZjNTkyZjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvY29yZ2kuYworKysgYi9zb3VuZC9zb2MvcHhhL2NvcmdpLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9jb3JnaS5oPgpAQCAtNDgsNTEgKzQ3LDUzIEBACiAKIHN0YXRpYyB2b2lkIGNvcmdpX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoIChjb3JnaV9qYWNrX2Z1bmMpIHsKIAljYXNlIENPUkdJX0hQOgogCQkvKiBzZXQgPSB1bm11dGUgaGVhZHBob25lICovCiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAxKTsKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDEpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBDT1JHSV9NSUM6CiAJCS8qIHJlc2V0ID0gbXV0ZSBoZWFkcGhvbmUgKi8KIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfUiwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAljYXNlIENPUkdJX0xJTkU6CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9MLCAwKTsKIAkJZ3Bpb19zZXRfdmFsdWUoQ09SR0lfR1BJT19NVVRFX1IsIDApOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBDT1JHSV9IRUFEU0VUOgogCQlncGlvX3NldF92YWx1ZShDT1JHSV9HUElPX01VVEVfTCwgMCk7CiAJCWdwaW9fc2V0X3ZhbHVlKENPUkdJX0dQSU9fTVVURV9SLCAxKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAoY29yZ2lfc3BrX2Z1bmMgPT0gQ09SR0lfU1BLX09OKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CiAKIAkvKiBzaWduYWwgYSBEQVBNIGV2ZW50ICovCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IGNvcmdpX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yNzksMTAgKzI4MCwxMSBAQAogc3RhdGljIGludCBjb3JnaV93bTg3MzFfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnI7CiAKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTExJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTExJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJMSU5FSU4iKTsKIAogCS8qIEFkZCBjb3JnaSBzcGVjaWZpYyBjb250cm9scyAqLwogCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg3MzFfY29yZ2lfY29udHJvbHMsCkBAIC0yOTEsMTMgKzI5MywxMyBAQAogCQlyZXR1cm4gZXJyOwogCiAJLyogQWRkIGNvcmdpIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg3MzFfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204NzMxX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod204NzMxX2RhcG1fd2lkZ2V0cykpOwogCiAJLyogU2V0IHVwIGNvcmdpIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYyBiL3NvdW5kL3NvYy9weGEvZTc0MF93bTk3MDUuYwppbmRleCBjODJjZWRiLi4yODMzM2U3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U3NDBfd205NzA1LmMKKysrIGIvc291bmQvc29jL3B4YS9lNzQwX3dtOTcwNS5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxtYWNoL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KQEAgLTkyLDIzICs5MSwyNCBAQAogc3RhdGljIGludCBlNzQwX2FjOTdfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkhQT1VUTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIUE9VVFIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUEhPTkUiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORUlOTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FSU5SIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNESU5MIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkNESU5SIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBDQkVFUCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJNSUMyIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSFBPVVRMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSFBPVVRSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUEhPTkUiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FSU5MIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORUlOUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNESU5MIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0RJTlIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQQ0JFRVAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMyIik7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBlNzQwX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGU3NDBfZGFwbV93aWRnZXRzLAogCQkJCQlBUlJBWV9TSVpFKGU3NDBfZGFwbV93aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jIGIvc291bmQvc29jL3B4YS9lNzUwX3dtOTcwNS5jCmluZGV4IDRjMTQzODAuLjAxYmYzMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZTc1MF93bTk3MDUuYworKysgYi9zb3VuZC9zb2MvcHhhL2U3NTBfd205NzA1LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgpAQCAtNzQsMjMgKzczLDI0IEBACiBzdGF0aWMgaW50IGU3NTBfYWM5N19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJST1VUIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBIT05FIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkVJTkwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORUlOUiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDRElOTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJDRElOUiIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJQQ0JFRVAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTUlDMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJST1VUIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUEhPTkUiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FSU5MIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORUlOUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkNESU5MIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiQ0RJTlIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJQQ0JFRVAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMyIik7CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBlNzUwX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGU3NTBfZGFwbV93aWRnZXRzLAogCQkJCQlBUlJBWV9TSVpFKGU3NTBfZGFwbV93aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCmluZGV4IGQ0MmU1ZmUuLmM2YTM3YzZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL2U4MDBfd205NzEyLmMKKysrIGIvc291bmQvc29jL3B4YS9lODAwX3dtOTcxMi5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KQEAgLTc1LDEyICs3NCwxMyBAQAogc3RhdGljIGludCBlODAwX2FjOTdfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgZTgwMF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBlODAwX2RhcG1fd2lkZ2V0cywKIAkJCQkJQVJSQVlfU0laRShlODAwX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL2VtLXgyNzAuYyBiL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCmluZGV4IGVhZGY5ZDMuLmZjMjJlNmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCisrKyBiL3NvdW5kL3NvYy9weGEvZW0teDI3MC5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPG1hY2gvYXVkaW8uaD4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYyBiL3NvdW5kL3NvYy9weGEvbWFnaWNpYW4uYwppbmRleCA1ZWYwNTI2Li42N2RjYzM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL21hZ2ljaWFuLmMKKysrIGIvc291bmQvc29jL3B4YS9tYWdpY2lhbi5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvdWRhMTM4MC5oPgogCiAjaW5jbHVkZSA8bWFjaC9tYWdpY2lhbi5oPgpAQCAtNDQsMjcgKzQzLDI5IEBACiAKIHN0YXRpYyB2b2lkIG1hZ2ljaWFuX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAlpZiAobWFnaWNpYW5fc3BrX3N3aXRjaCkKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCWlmIChtYWdpY2lhbl9ocF9zd2l0Y2gpCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CiAKIAlzd2l0Y2ggKG1hZ2ljaWFuX2luX3NlbCkgewogCWNhc2UgTUFHSUNJQU5fTUlDOgotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CiAJCWJyZWFrOwogCWNhc2UgTUFHSUNJQU5fTUlDX0VYVDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQ2FsbCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOwogCQlicmVhazsKIAl9CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgbWFnaWNpYW5fc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTM5OSwxNSArNDAwLDE2IEBACiBzdGF0aWMgaW50IG1hZ2ljaWFuX3VkYTEzODBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnI7CiAKIAkvKiBOQyBjb2RlYyBwaW5zICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlZPVVRMSFAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiVk9VVFJIUCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlZPVVRMSFAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJWT1VUUkhQIik7CiAKIAkvKiBGSVhNRTogaXMgYW55dGhpbmcgY29ubmVjdGVkIGhlcmU/ICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlZJTkwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiVklOUiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlZJTkwiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJWSU5SIik7CiAKIAkvKiBBZGQgbWFnaWNpYW4gc3BlY2lmaWMgY29udHJvbHMgKi8KIAllcnIgPSBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdWRhMTM4MF9tYWdpY2lhbl9jb250cm9scywKQEAgLTQxNiwxMyArNDE4LDEzIEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBBZGQgbWFnaWNpYW4gc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHVkYTEzODBfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdWRhMTM4MF9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBTZXQgdXAgbWFnaWNpYW4gc3BlY2lmaWMgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYyBiL3NvdW5kL3NvYy9weGEvbWlvYTcwMV93bTk3MTMuYwppbmRleCBmMjg0Y2M1Li4wZDcwZmM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL21pb2E3MDFfd205NzEzLmMKKysrIGIvc291bmQvc29jL3B4YS9taW9hNzAxX3dtOTcxMy5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KIApAQCAtMTMwLDEzICsxMjksMTQgQEAKIHN0YXRpYyBpbnQgbWlvYTcwMV93bTk3MTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCXVuc2lnbmVkIHNob3J0IHJlZzsKIAogCS8qIEFkZCBtaW9hNzAxIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBBUlJBWV9BTkRfU0laRShtaW9hNzAxX2RhcG1fd2lkZ2V0cykpOworCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgQVJSQVlfQU5EX1NJWkUobWlvYTcwMV9kYXBtX3dpZGdldHMpKTsKIAogCS8qIFNldCB1cCBtaW9hNzAxIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwbmVjdHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgQVJSQVlfQU5EX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgQVJSQVlfQU5EX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAkvKiBQcmVwYXJlIEdQSU84IGZvciByZWFyIHNwZWFrZXIgYW1wbGlmaWVyICovCiAJcmVnID0gY29kZWMtPmRyaXZlci0+cmVhZChjb2RlYywgQUM5N19HUElPX0NGRyk7CkBAIC0xNDYsMTIgKzE0NiwxMiBAQAogCXJlZyA9IGNvZGVjLT5kcml2ZXItPnJlYWQoY29kZWMsIEFDOTdfM0RfQ09OVFJPTCk7CiAJY29kZWMtPmRyaXZlci0+d3JpdGUoY29kZWMsIEFDOTdfM0RfQ09OVFJPTCwgcmVnIHwgMHhjMDAwKTsKIAotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRnJvbnQgU3BlYWtlciIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiUmVhciBTcGVha2VyIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJGcm9udCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkZyb250IFNwZWFrZXIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiUmVhciBTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkZyb250IE1pYyIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9wYWxtMjd4LmMgYi9zb3VuZC9zb2MvcHhhL3BhbG0yN3guYwppbmRleCAxM2Y2ZDQ4Li44NTdkYjk2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3BhbG0yN3guYworKysgYi9zb3VuZC9zb2MvcHhhL3BhbG0yN3guYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC03NywzNyArNzYsMzggQEAKIHN0YXRpYyBpbnQgcGFsbTI3eF9hYzk3X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgZXJyOwogCiAJLyogYWRkIHBhbG0yN3ggc3BlY2lmaWMgd2lkZ2V0cyAqLwotCWVyciA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHBhbG0yN3hfZGFwbV93aWRnZXRzLAorCWVyciA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgcGFsbTI3eF9kYXBtX3dpZGdldHMsCiAJCQkJQVJSQVlfU0laRShwYWxtMjd4X2RhcG1fd2lkZ2V0cykpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBzZXQgdXAgcGFsbTI3eCBzcGVjaWZpYyBhdWRpbyBwYXRoIGF1ZGlvX21hcCAqLwotCWVyciA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJZXJyID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBjb25uZWN0ZWQgcGlucyAqLwogCWlmIChtYWNoaW5lX2lzX3BhbG1sZCgpKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1JQzEiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhQT1VUTCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSFBPVVRSIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJMT1VUMiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiUk9VVDIiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1JQzEiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBPVVRMIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhQT1VUUiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMT1VUMiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJST1VUMiIpOwogCiAJLyogbm90IGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTU9OT09VVCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FSU5MIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkVJTlIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUENCRUVQIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlBIT05FIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1JQzIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OT09VVCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkVJTkwiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FSU5SIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUENCRUVQIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUEhPTkUiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMyIik7CiAKLQllcnIgPSBzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJZXJyID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9wb29kbGUuYyBiL3NvdW5kL3NvYy9weGEvcG9vZGxlLmMKaW5kZXggODRlZGQwMy4uNjI5OGVlMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9wb29kbGUuYworKysgYi9zb3VuZC9zb2MvcHhhL3Bvb2RsZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9sb2NvbW8uaD4KQEAgLTQ2LDYgKzQ1LDggQEAKIAogc3RhdGljIHZvaWQgcG9vZGxlX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJaWYgKHBvb2RsZV9qYWNrX2Z1bmMgPT0gUE9PRExFX0hQKSB7CiAJCS8qIHNldCA9IHVubXV0ZSBoZWFkcGhvbmUgKi8KQEAgLTUzLDIzICs1NCwyMyBAQAogCQkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMSk7CiAJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCiAJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAxKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAl9IGVsc2UgewogCQlsb2NvbW9fZ3Bpb193cml0ZSgmcG9vZGxlX2xvY29tb19kZXZpY2UuZGV2LAogCQkJUE9PRExFX0xPQ09NT19HUElPX01VVEVfTCwgMCk7CiAJCWxvY29tb19ncGlvX3dyaXRlKCZwb29kbGVfbG9jb21vX2RldmljZS5kZXYsCiAJCQlQT09ETEVfTE9DT01PX0dQSU9fTVVURV9SLCAwKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCX0KIAogCS8qIHNldCB0aGUgZW5wb2ludHMgdG8gdGhlaXIgbmV3IGNvbm5ldGlvbiBzdGF0ZXMgKi8KIAlpZiAocG9vZGxlX3Nwa19mdW5jID09IFBPT0RMRV9TUEtfT04pCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IFNwayIpOwogCWVsc2UKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiRXh0IFNwayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKIAogCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgcG9vZGxlX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC0yNDQsMTEgKzI0NSwxMiBAQAogc3RhdGljIGludCBwb29kbGVfd204NzMxX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgZXJyOwogCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxMSU5FSU4iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUkxJTkVJTiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTUlDSU4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMTElORUlOIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUkxJTkVJTiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNSUNJTiIpOwogCiAJLyogQWRkIHBvb2RsZSBzcGVjaWZpYyBjb250cm9scyAqLwogCWVyciA9IHNuZF9zb2NfYWRkX2NvbnRyb2xzKGNvZGVjLCB3bTg3MzFfcG9vZGxlX2NvbnRyb2xzLApAQCAtMjU3LDEzICsyNTksMTMgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIEFkZCBwb29kbGUgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODczMV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3MzFfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg3MzFfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBTZXQgdXAgcG9vZGxlIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYyBiL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYwppbmRleCAyY2RhODJiYy4uMGZkNjBmNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS9yYXVtZmVsZC5jCisrKyBiL3NvdW5kL3NvYy9weGEvcmF1bWZlbGQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9zYWFyYi5jIGIvc291bmQvc29jL3B4YS9zYWFyYi5jCmluZGV4IGQ2M2NiNDcuLjk1OTUxODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvc2FhcmIuYworKysgYi9zb3VuZC9zb2MvcHhhL3NhYXJiLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtMTMzLDIwICsxMzIsMjEgQEAKIHN0YXRpYyBpbnQgc2FhcmJfcG04NjB4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgc2FhcmJfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgc2FhcmJfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShzYWFyYl9kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgU3BlYWtlciIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IE1pYyAxIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgTWljIDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyAyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgTWljIDEiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyAzIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyAyIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7CiAKLQlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9zcGl0ei5jIGIvc291bmQvc29jL3B4YS9zcGl0ei5jCmluZGV4IDBiMzBkN2QuLmMyYWNiNjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvc3BpdHouYworKysgYi9zb3VuZC9zb2MvcHhhL3NwaXR6LmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8bWFjaC9zcGl0ei5oPgpAQCAtNDYsNjEgKzQ1LDYzIEBACiAKIHN0YXRpYyB2b2lkIHNwaXR6X2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAlpZiAoc3BpdHpfc3BrX2Z1bmMgPT0gU1BJVFpfU1BLX09OKQotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkV4dCBTcGsiKTsKIAllbHNlCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkV4dCBTcGsiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFeHQgU3BrIik7CiAKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoIChzcGl0el9qYWNrX2Z1bmMpIHsKIAljYXNlIFNQSVRaX0hQOgogCQkvKiBlbmFibGUgYW5kIHVubXV0ZSBocCBqYWNrLCBkaXNhYmxlIG1pYyBiaWFzICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfTCwgMSk7CiAJCWdwaW9fc2V0X3ZhbHVlKFNQSVRaX0dQSU9fTVVURV9SLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBTUElUWl9NSUM6CiAJCS8qIGVuYWJsZSBtaWMgamFjayBhbmQgYmlhcywgbXV0ZSBocCAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfTElORToKIAkJLyogZW5hYmxlIGxpbmUgamFjaywgZGlzYWJsZSBtaWMgYmlhcyBhbmQgbXV0ZSBocCAqLwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJMaW5lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfSEVBRFNFVDoKIAkJLyogZW5hYmxlIGFuZCB1bm11dGUgaGVhZHNldCBqYWNrIGVuYWJsZSBtaWMgYmlhcywgbXV0ZSBMIGhwICovCi0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRwaG9uZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTGluZSBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMSk7CiAJCWJyZWFrOwogCWNhc2UgU1BJVFpfSFBfT0ZGOgogCiAJCS8qIGphY2sgcmVtb3ZlZCwgZXZlcnl0aGluZyBvZmYgKi8KLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkxpbmUgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lIEphY2siKTsKIAkJZ3Bpb19zZXRfdmFsdWUoU1BJVFpfR1BJT19NVVRFX0wsIDApOwogCQlncGlvX3NldF92YWx1ZShTUElUWl9HUElPX01VVEVfUiwgMCk7CiAJCWJyZWFrOwogCX0KLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiB9CiAKIHN0YXRpYyBpbnQgc3BpdHpfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTI4MSwxNiArMjgyLDE3IEBACiBzdGF0aWMgaW50IHNwaXR6X3dtODc1MF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAogCS8qIE5DIGNvZGVjIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUklOUFVUMSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5QVVQyIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJJTlBVVDIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElOUFVUMyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSSU5QVVQzIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTU9OTzEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSSU5QVVQxIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElOUFVUMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJJTlBVVDIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5QVVQzIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUklOUFVUMyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNT05PMSIpOwogCiAJLyogQWRkIHNwaXR6IHNwZWNpZmljIGNvbnRyb2xzICovCiAJZXJyID0gc25kX3NvY19hZGRfY29udHJvbHMoY29kZWMsIHdtODc1MF9zcGl0el9jb250cm9scywKQEAgLTI5OSwxMyArMzAxLDEzIEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBBZGQgc3BpdHogc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc1MF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NTBfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBTZXQgdXAgc3BpdHogc3BlY2lmaWMgYXVkaW8gcGF0aHMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS90YXZvcmV2YjMuYyBiL3NvdW5kL3NvYy9weGEvdGF2b3JldmIzLmMKaW5kZXggMjQ4YzI4My4uZjg4MWY2NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS90YXZvcmV2YjMuYworKysgYi9zb3VuZC9zb2MvcHhhL3Rhdm9yZXZiMy5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTEzMywyMCArMTMyLDIxIEBACiBzdGF0aWMgaW50IGV2YjNfcG04NjB4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgcmV0OwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgZXZiM19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBldmIzX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoZXZiM19kYXBtX3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIGNvbm5lY3RlZCBwaW5zICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgU3BlYWtlciIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiRXh0IE1pYyAxIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJFeHQgTWljIDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyAyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBTdGVyZW9waG9uZSIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgTWljIDEiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRXh0IE1pYyAzIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyAyIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IFN0ZXJlb3Bob25lIik7CiAKLQlyZXQgPSBzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS90b3NhLmMgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwppbmRleCA3Yjk4M2Y5Li5mNzU4MDRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3Rvc2EuYworKysgYi9zb3VuZC9zb2MvcHhhL3Rvc2EuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL3Rvc2EuaD4KQEAgLTQ5LDMxICs0OCwzMyBAQAogCiBzdGF0aWMgdm9pZCB0b3NhX2V4dF9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKIAkvKiBzZXQgdXAgamFjayBjb25uZWN0aW9uICovCiAJc3dpdGNoICh0b3NhX2phY2tfZnVuYykgewogCWNhc2UgVE9TQV9IUDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiTWljIChJbnRlcm5hbCkiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IEphY2siKTsKIAkJYnJlYWs7CiAJY2FzZSBUT1NBX01JQ19JTlQ6Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIChJbnRlcm5hbCkiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHBob25lIEphY2siKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgKEludGVybmFsKSIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBKYWNrIik7CiAJCWJyZWFrOwogCWNhc2UgVE9TQV9IRUFEU0VUOgotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNaWMgKEludGVybmFsKSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgSmFjayIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyAoSW50ZXJuYWwpIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgSmFjayIpOwogCQlicmVhazsKIAl9CiAKIAlpZiAodG9zYV9zcGtfZnVuYyA9PSBUT1NBX1NQS19PTikKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJTcGVha2VyIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogfQogCiBzdGF0aWMgaW50IHRvc2Ffc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTE5MSwxMCArMTkyLDExIEBACiBzdGF0aWMgaW50IHRvc2FfYWM5N19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVycjsKIAotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVQzIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1PTk9PVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OT09VVCIpOwogCiAJLyogYWRkIHRvc2Egc3BlY2lmaWMgY29udHJvbHMgKi8KIAllcnIgPSBzbmRfc29jX2FkZF9jb250cm9scyhjb2RlYywgdG9zYV9jb250cm9scywKQEAgLTIwMywxMyArMjA1LDEzIEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBhZGQgdG9zYSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgdG9zYV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB0b3NhX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUodG9zYV9kYXBtX3dpZGdldHMpKTsKIAogCS8qIHNldCB1cCB0b3NhIHNwZWNpZmljIGF1ZGlvIHBhdGggYXVkaW9fbWFwICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvejIuYyBiL3NvdW5kL3NvYy9weGEvejIuYwppbmRleCA0Y2M4NDFiLi4yZDRmODk2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3oyLmMKKysrIGIvc291bmQvc29jL3B4YS96Mi5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTE0MCwyMiArMTM5LDIzIEBACiBzdGF0aWMgaW50IHoyX3dtODc1MF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IHJldDsKIAogCS8qIE5DIGNvZGVjIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJMSU5QVVQzIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiUklOUFVUMyIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJNT05PIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5QVVQzIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJSSU5QVVQzIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJPVVQzIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNT05PIik7CiAKIAkvKiBBZGQgejIgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc1MF9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NTBfZGFwbV93aWRnZXRzLAogCQkJCSBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpKTsKIAogCS8qIFNldCB1cCB6MiBzcGVjaWZpYyBhdWRpbyBwYXRocyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOwogCi0JcmV0ID0gc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXJldCA9IHNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMgYi9zb3VuZC9zb2MvcHhhL3p5bG9uaXRlLmMKaW5kZXggZDI3ZTA1YS4uYjIyMmE3ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS96eWxvbml0ZS5jCisrKyBiL3NvdW5kL3NvYy9weGEvenlsb25pdGUuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3dtOTcxMy5oIgogI2luY2x1ZGUgInB4YTJ4eC1hYzk3LmgiCkBAIC03MywyMSArNzIsMjIgQEAKIHN0YXRpYyBpbnQgenlsb25pdGVfd205NzEzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCWlmIChjbGtfcG91dCkKIAkJc25kX3NvY19kYWlfc2V0X3BsbChydGQtPmNvZGVjX2RhaSwgMCwgMCwKIAkJCQkgICAgY2xrX2dldF9yYXRlKHBvdXQpLCAwKTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHp5bG9uaXRlX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHp5bG9uaXRlX2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoenlsb25pdGVfZGFwbV93aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIFN0YXRpYyBzZXR1cCBmb3Igbm93ICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgRWFycGllY2UiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgRWFycGllY2UiKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvS2NvbmZpZyBiL3NvdW5kL3NvYy9zM2MyNHh4L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWJmOGEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi1jb25maWcgU05EX1MzQzI0WFhfU09DCi0JdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIFNhbXN1bmcgUzNDWFhYWCBjaGlwcyIKLQlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCB8fCBBUkNIX1MzQzY0WFggfHwgQVJDSF9TNVBDMTAwIHx8IEFSQ0hfUzVQVjIxMAotCXNlbGVjdCBTM0M2NFhYX0RNQSBpZiBBUkNIX1MzQzY0WFgKLQlzZWxlY3QgUzNDMjQxMF9ETUEgaWYgQVJDSF9TM0MyNDEwCi0JaGVscAotCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCi0JICB0aGUgUzNDMjRYWCBBQzk3IG9yIEkyUyBpbnRlcmZhY2VzLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8KLQkgIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgotCi1jb25maWcgU05EX1MzQzI0WFhfU09DX0kyUwotCXRyaXN0YXRlCi0Jc2VsZWN0IFMzQzI0MTBfRE1BCi0KLWNvbmZpZyBTTkRfUzNDX0kyU1YyX1NPQwotCXRyaXN0YXRlCi0KLWNvbmZpZyBTTkRfUzNDMjQxMl9TT0NfSTJTCi0JdHJpc3RhdGUKLQlzZWxlY3QgU05EX1MzQ19JMlNWMl9TT0MKLQlzZWxlY3QgUzNDMjQxMF9ETUEKLQotY29uZmlnIFNORF9TM0M2NFhYX1NPQ19JMlMKLQl0cmlzdGF0ZQotCXNlbGVjdCBTTkRfUzNDX0kyU1YyX1NPQwotCXNlbGVjdCBTM0M2NFhYX0RNQQotCi1jb25maWcgU05EX1MzQzY0WFhfU09DX0kyU19WNAotCXRyaXN0YXRlCi0Jc2VsZWN0IFNORF9TM0NfSTJTVjJfU09DCi0Jc2VsZWN0IFMzQzY0WFhfRE1BCi0KLWNvbmZpZyBTTkRfUzNDX1NPQ19QQ00KLQl0cmlzdGF0ZQotCi1jb25maWcgU05EX1MzQ19TT0NfQUM5NwotCXRyaXN0YXRlCi0Jc2VsZWN0IFNORF9TT0NfQUM5N19CVVMKLQotY29uZmlnIFNORF9TNVBfU09DX1NQRElGCi0JdHJpc3RhdGUKLQlzZWxlY3QgU05EX1NPQ19TUERJRgotCi1jb25maWcgU05EX1MzQzI0WFhfU09DX05FTzE5NzNfV004NzUzCi0JdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgTkVPMTk3MyAtIFdNODc1MyIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBNQUNIX05FTzE5NzNfR1RBMDEKLQlzZWxlY3QgU05EX1MzQzI0WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX1dNODc1MwotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gc21kazI0NDAKLQkgIHdpdGggdGhlIFdNODc1My4KLQotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19ORU8xOTczX0dUQTAyX1dNODc1MwotCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciB0aGUgT3Blbm1va28gTmVvIEZyZWVSdW5uZXIgKEdUQTAyKSIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBNQUNIX05FTzE5NzNfR1RBMDIKLQlzZWxlY3QgU05EX1MzQzI0WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX1dNODc1MwotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGF1ZGlvIHN1cHBvcnQgZm9yIHRoZSBPcGVubW9rbyBOZW8gRnJlZVJ1bm5lcgotCSAgc21hcnRwaG9uZS4KLQkgIAotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19KSVZFX1dNODc1MAotCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIEppdmUiCi0JZGVwZW5kcyBvbiBTTkRfUzNDMjRYWF9TT0MgJiYgTUFDSF9KSVZFCi0Jc2VsZWN0IFNORF9TT0NfV004NzUwCi0Jc2VsZWN0IFNORF9TM0MyNDEyX1NPQ19JMlMKLQloZWxwCi0JICBTYXQgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBKaXZlLgotCi1jb25maWcgU05EX1MzQzY0WFhfU09DX1dNODU4MAotCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODU4MCBvbiBTTURLNjRYWCIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBNQUNIX1NNREs2NDEwCi0Jc2VsZWN0IFNORF9TT0NfV004NTgwCi0Jc2VsZWN0IFNORF9TM0M2NFhYX1NPQ19JMlNfVjQKLQloZWxwCi0JICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBTTURLNjQxMC4KLQotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19TTURLMjQ0M19XTTk3MTAKLQl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESzI0NDMgLSBXTTk3MTAiCi0JZGVwZW5kcyBvbiBTTkRfUzNDMjRYWF9TT0MgJiYgTUFDSF9TTURLMjQ0MwotCXNlbGVjdCBTM0MyNDEwX0RNQQotCXNlbGVjdCBBQzk3X0JVUwotCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKLQlzZWxlY3QgU05EX1MzQ19TT0NfQUM5NwotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gc21kazI0NDMKLQkgIHdpdGggdGhlIFdNOTcxMC4KLQotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19MTjI0NDBTQkNfQUxDNjUwCi0JdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIHN1cHBvcnQgZm9yIExOMjQ0MFNCQyAtIEFMQzY1MCIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBBUkNIX1MzQzI0MTAKLQlzZWxlY3QgUzNDMjQxMF9ETUEKLQlzZWxlY3QgQUM5N19CVVMKLQlzZWxlY3QgU05EX1NPQ19BQzk3X0NPREVDCi0Jc2VsZWN0IFNORF9TM0NfU09DX0FDOTcKLQloZWxwCi0JICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGxuMjQ0MHNiYwotCSAgd2l0aCB0aGUgQUxDNjUwLgotCi1jb25maWcgU05EX1MzQzI0WFhfU09DX1MzQzI0WFhfVURBMTM0WAotCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgVURBMTM0WCB3aXJlZCB0byBhIFMzQzI0WFgiCi0gICAgICAgCWRlcGVuZHMgb24gU05EX1MzQzI0WFhfU09DICYmIEFSQ0hfUzNDMjQxMAotICAgICAgIAlzZWxlY3QgU05EX1MzQzI0WFhfU09DX0kyUwotCXNlbGVjdCBTTkRfU09DX0wzCi0gICAgICAgCXNlbGVjdCBTTkRfU09DX1VEQTEzNFgKLQotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19TSU1URUMKLQl0cmlzdGF0ZQotCWhlbHAKLQkgIEludGVybmFsIG5vZGUgZm9yIGNvbW1vbiBTM0MyNFhYL1NpbXRlYyBzdXBwb3IKLQotY29uZmlnIFNORF9TM0MyNFhYX1NPQ19TSU1URUNfVExWMzIwQUlDMjMKLQl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBUTFYzMjBBSUMyMyBvbiBTaW10ZWMgYm9hcmRzIgotCWRlcGVuZHMgb24gU05EX1MzQzI0WFhfU09DICYmIEFSQ0hfUzNDMjQxMAotCXNlbGVjdCBTTkRfUzNDMjRYWF9TT0NfSTJTCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDMjMKLQlzZWxlY3QgU05EX1MzQzI0WFhfU09DX1NJTVRFQwotCi1jb25maWcgU05EX1MzQzI0WFhfU09DX1NJTVRFQ19IRVJNRVMKLQl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBTaW10ZWMgSGVybWVzIGJvYXJkIgotCWRlcGVuZHMgb24gU05EX1MzQzI0WFhfU09DICYmIEFSQ0hfUzNDMjQxMAotCXNlbGVjdCBTTkRfUzNDMjRYWF9TT0NfSTJTCi0Jc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1gKLQlzZWxlY3QgU05EX1MzQzI0WFhfU09DX1NJTVRFQwotCi1jb25maWcgU05EX1MzQzI0WFhfU09DX1JYMTk1MF9VREExMzgwCi0JdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIHRoZSBIUCBpUEFRIFJYMTk1MCIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBNQUNIX1JYMTk1MAotCXNlbGVjdCBTTkRfUzNDMjRYWF9TT0NfSTJTCi0Jc2VsZWN0IFNORF9TT0NfVURBMTM4MAotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGF1ZGlvIHN1cHBvcnQgZm9yIEhQIGlQQVEgUlgxOTUwIFBEQS4KLQotY29uZmlnIFNORF9TT0NfU01ES19XTTk3MTMKLQl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyB3aXRoIFdNOTcxMyIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiAoTUFDSF9TTURLNjQxMCB8fCBNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMCkKLQlzZWxlY3QgU05EX1NPQ19XTTk3MTMKLQlzZWxlY3QgU05EX1MzQ19TT0NfQUM5NwotCWhlbHAKLQkgIFNhdCBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gdGhlIFNNREsuCi0KLWNvbmZpZyBTTkRfUzNDNjRYWF9TT0NfU01BUlRRCi0JdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgU21hcnRRIGJvYXJkIgotCWRlcGVuZHMgb24gU05EX1MzQzI0WFhfU09DICYmIE1BQ0hfU01BUlRRCi0Jc2VsZWN0IFNORF9TM0M2NFhYX1NPQ19JMlMKLQlzZWxlY3QgU05EX1NPQ19XTTg3NTAKLQotY29uZmlnIFNORF9TNVBDMTEwX1NPQ19BUVVJTEFfV004OTk0Ci0JdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgQVFVSUxBIC0gV004OTk0IgotCWRlcGVuZHMgb24gU05EX1MzQzI0WFhfU09DICYmIE1BQ0hfQVFVSUxBCi0Jc2VsZWN0IFNORF9TM0M2NFhYX1NPQ19JMlNfVjQKLQlzZWxlY3QgU05EX1NPQ19XTTg5OTQKLQloZWxwCi0JICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGFxdWlsYQotCSAgd2l0aCB0aGUgV004OTk0LgotCi1jb25maWcgU05EX1M1UFYyMTBfU09DX0dPTklfV004OTk0Ci0JdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgR09OSSAtIFdNODk5NCIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiBNQUNIX0dPTkkKLQlzZWxlY3QgU05EX1MzQzY0WFhfU09DX0kyU19WNAotCXNlbGVjdCBTTkRfU09DX1dNODk5NAotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gZ29uaQotCSAgd2l0aCB0aGUgV004OTk0LgotCi1jb25maWcgU05EX1NPQ19TTURLX1NQRElGCi0JdHJpc3RhdGUgIlNvQyBTL1BESUYgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TM0MyNFhYX1NPQyAmJiAoTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtDMTEwIHx8IE1BQ0hfU01ES1YyMTApCi0Jc2VsZWN0IFNORF9TNVBfU09DX1NQRElGCi0JaGVscAotCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBTL1BESUYgYXVkaW8gb24gdGhlIFNNREsuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zM2MyNHh4L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZThmNDFkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBTM2MyNFhYIFBsYXRmb3JtIFN1cHBvcnQKLXNuZC1zb2MtczNjMjR4eC1vYmpzIDo9IHMzYy1kbWEubwotc25kLXNvYy1zM2MyNHh4LWkycy1vYmpzIDo9IHMzYzI0eHgtaTJzLm8KLXNuZC1zb2MtczNjMjQxMi1pMnMtb2JqcyA6PSBzM2MyNDEyLWkycy5vCi1zbmQtc29jLXMzYzY0eHgtaTJzLW9ianMgOj0gczNjNjR4eC1pMnMubwotc25kLXNvYy1zM2MtYWM5Ny1vYmpzIDo9IHMzYy1hYzk3Lm8KLXNuZC1zb2MtczNjNjR4eC1pMnMtdjQtb2JqcyA6PSBzM2M2NHh4LWkycy12NC5vCi1zbmQtc29jLXMzYy1pMnMtdjItb2JqcyA6PSBzM2MtaTJzLXYyLm8KLXNuZC1zb2MtczNjLXBjbS1vYmpzIDo9IHMzYy1wY20ubwotc25kLXNvYy1zYW1zdW5nLXNwZGlmLW9ianMgOj0gc3BkaWYubwotCi1vYmotJChDT05GSUdfU05EX1MzQzI0WFhfU09DKSArPSBzbmQtc29jLXMzYzI0eHgubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19JMlMpICs9IHNuZC1zb2MtczNjMjR4eC1pMnMubwotb2JqLSQoQ09ORklHX1NORF9TM0NfU09DX0FDOTcpICs9IHNuZC1zb2MtczNjLWFjOTcubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNDEyX1NPQ19JMlMpICs9IHNuZC1zb2MtczNjMjQxMi1pMnMubwotb2JqLSQoQ09ORklHX1NORF9TM0M2NFhYX1NPQ19JMlMpICs9IHNuZC1zb2MtczNjNjR4eC1pMnMubwotb2JqLSQoQ09ORklHX1NORF9TM0M2NFhYX1NPQ19JMlNfVjQpICs9IHNuZC1zb2MtczNjNjR4eC1pMnMtdjQubwotb2JqLSQoQ09ORklHX1NORF9TM0NfSTJTVjJfU09DKSArPSBzbmQtc29jLXMzYy1pMnMtdjIubwotb2JqLSQoQ09ORklHX1NORF9TM0NfU09DX1BDTSkgKz0gc25kLXNvYy1zM2MtcGNtLm8KLW9iai0kKENPTkZJR19TTkRfUzVQX1NPQ19TUERJRikgKz0gc25kLXNvYy1zYW1zdW5nLXNwZGlmLm8KLQotIyBTM0MyNFhYIE1hY2hpbmUgU3VwcG9ydAotc25kLXNvYy1qaXZlLXdtODc1MC1vYmpzIDo9IGppdmVfd204NzUwLm8KLXNuZC1zb2MtbmVvMTk3My13bTg3NTMtb2JqcyA6PSBuZW8xOTczX3dtODc1My5vCi1zbmQtc29jLW5lbzE5NzMtZ3RhMDItd204NzUzLW9ianMgOj0gbmVvMTk3M19ndGEwMl93bTg3NTMubwotc25kLXNvYy1zbWRrMjQ0My13bTk3MTAtb2JqcyA6PSBzbWRrMjQ0M193bTk3MTAubwotc25kLXNvYy1sbjI0NDBzYmMtYWxjNjUwLW9ianMgOj0gbG4yNDQwc2JjX2FsYzY1MC5vCi1zbmQtc29jLXMzYzI0eHgtdWRhMTM0eC1vYmpzIDo9IHMzYzI0eHhfdWRhMTM0eC5vCi1zbmQtc29jLXMzYzI0eHgtc2ltdGVjLW9ianMgOj0gczNjMjR4eF9zaW10ZWMubwotc25kLXNvYy1zM2MyNHh4LXNpbXRlYy1oZXJtZXMtb2JqcyA6PSBzM2MyNHh4X3NpbXRlY19oZXJtZXMubwotc25kLXNvYy1zM2MyNHh4LXNpbXRlYy10bHYzMjBhaWMyMy1vYmpzIDo9IHMzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLm8KLXNuZC1zb2MtcngxOTUwLXVkYTEzODAtb2JqcyA6PSByeDE5NTBfdWRhMTM4MC5vCi1zbmQtc29jLXNtZGs2NHh4LXdtODU4MC1vYmpzIDo9IHNtZGs2NHh4X3dtODU4MC5vCi1zbmQtc29jLXNtZGstd205NzEzLW9ianMgOj0gc21ka193bTk3MTMubwotc25kLXNvYy1zM2M2NHh4LXNtYXJ0cS13bTg5ODctb2JqcyA6PSBzbWFydHFfd204OTg3Lm8KLXNuZC1zb2MtYXF1aWxhLXdtODk5NC1vYmpzIDo9IGFxdWlsYV93bTg5OTQubwotc25kLXNvYy1nb25pLXdtODk5NC1vYmpzIDo9IGdvbmlfd204OTk0Lm8KLXNuZC1zb2Mtc21kay1zcGRpZi1vYmpzIDo9IHNtZGtfc3BkaWYubwotCi1vYmotJChDT05GSUdfU05EX1MzQzI0WFhfU09DX0pJVkVfV004NzUwKSArPSBzbmQtc29jLWppdmUtd204NzUwLm8KLW9iai0kKENPTkZJR19TTkRfUzNDMjRYWF9TT0NfTkVPMTk3M19XTTg3NTMpICs9IHNuZC1zb2MtbmVvMTk3My13bTg3NTMubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19ORU8xOTczX0dUQTAyX1dNODc1MykgKz0gc25kLXNvYy1uZW8xOTczLWd0YTAyLXdtODc1My5vCi1vYmotJChDT05GSUdfU05EX1MzQzI0WFhfU09DX1NNREsyNDQzX1dNOTcxMCkgKz0gc25kLXNvYy1zbWRrMjQ0My13bTk3MTAubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19MTjI0NDBTQkNfQUxDNjUwKSArPSBzbmQtc29jLWxuMjQ0MHNiYy1hbGM2NTAubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19TM0MyNFhYX1VEQTEzNFgpICs9IHNuZC1zb2MtczNjMjR4eC11ZGExMzR4Lm8KLW9iai0kKENPTkZJR19TTkRfUzNDMjRYWF9TT0NfU0lNVEVDKSArPSBzbmQtc29jLXMzYzI0eHgtc2ltdGVjLm8KLW9iai0kKENPTkZJR19TTkRfUzNDMjRYWF9TT0NfU0lNVEVDX0hFUk1FUykgKz0gc25kLXNvYy1zM2MyNHh4LXNpbXRlYy1oZXJtZXMubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19TSU1URUNfVExWMzIwQUlDMjMpICs9IHNuZC1zb2MtczNjMjR4eC1zaW10ZWMtdGx2MzIwYWljMjMubwotb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19SWDE5NTBfVURBMTM4MCkgKz0gc25kLXNvYy1yeDE5NTAtdWRhMTM4MC5vCi1vYmotJChDT05GSUdfU05EX1MzQzY0WFhfU09DX1dNODU4MCkgKz0gc25kLXNvYy1zbWRrNjR4eC13bTg1ODAubwotb2JqLSQoQ09ORklHX1NORF9TT0NfU01ES19XTTk3MTMpICs9IHNuZC1zb2Mtc21kay13bTk3MTMubwotb2JqLSQoQ09ORklHX1NORF9TM0M2NFhYX1NPQ19TTUFSVFEpICs9IHNuZC1zb2MtczNjNjR4eC1zbWFydHEtd204OTg3Lm8KLW9iai0kKENPTkZJR19TTkRfUzVQQzExMF9TT0NfQVFVSUxBX1dNODk5NCkgKz0gc25kLXNvYy1hcXVpbGEtd204OTk0Lm8KLW9iai0kKENPTkZJR19TTkRfUzVQVjIxMF9TT0NfR09OSV9XTTg5OTQpICs9IHNuZC1zb2MtZ29uaS13bTg5OTQubwotb2JqLSQoQ09ORklHX1NORF9TT0NfU01ES19TUERJRikgKz0gc25kLXNvYy1zbWRrLXNwZGlmLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L2FxdWlsYV93bTg5OTQuYyBiL3NvdW5kL3NvYy9zM2MyNHh4L2FxdWlsYV93bTg5OTQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ZDE5Ny4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9hcXVpbGFfd204OTk0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIGFxdWlsYV93bTg5OTQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAotICogQXV0aG9yOiBDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvcmVncy1jbG9jay5oPgotCi0jaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlICIuLi9jb2RlY3Mvd204OTk0LmgiCi0jaW5jbHVkZSAiczNjLWRtYS5oIgotI2luY2x1ZGUgInMzYzY0eHgtaTJzLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGFxdWlsYTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphcXVpbGFfc25kX2RldmljZTsKLQotLyogMy41IHBpZSBqYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBqYWNrOwotCi0vKiAzLjUgcGllIGphY2sgZGV0ZWN0aW9uIERBUE0gcGlucyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIGphY2tfcGluc1tdID0gewotCXsKLQkJLnBpbiA9ICJIZWFkc2V0IE1pYyIsCi0JCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKLQl9LCB7Ci0JCS5waW4gPSAiSGVhZHNldCBTdGVyZW9waG9uZSIsCi0JCS5tYXNrID0gU05EX0pBQ0tfSEVBRFBIT05FIHwgU05EX0pBQ0tfTUVDSEFOSUNBTCB8Ci0JCQlTTkRfSkFDS19BVk9VVCwKLQl9LAotfTsKLQotLyogMy41IHBpZSBqYWNrIGRldGVjdGlvbiBncGlvcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfZ3BpbyBqYWNrX2dwaW9zW10gPSB7Ci0JewotCQkuZ3BpbyA9IFM1UFYyMTBfR1BIMCg2KSwKLQkJLm5hbWUgPSAiREVUXzMuNSIsCi0JCS5yZXBvcnQgPSBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfTUVDSEFOSUNBTCB8Ci0JCQlTTkRfSkFDS19BVk9VVCwKLQkJLmRlYm91bmNlX3RpbWUgPSAyMDAsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhcXVpbGFfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIkV4dCBSY3YiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fSFAoIkhlYWRzZXQgU3RlcmVvcGhvbmUiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIk1haW4gTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiMm5kIE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9MSU5FKCJSYWRpbyBJbiIsIE5VTEwpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXF1aWxhX2RhcG1fcm91dGVzW10gPSB7Ci0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQS09VVExQIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQS09VVExOIn0sCi0KLQl7IkV4dCBSY3YiLCBOVUxMLCAiSFBPVVQyTiJ9LAotCXsiRXh0IFJjdiIsIE5VTEwsICJIUE9VVDJQIn0sCi0KLQl7IkhlYWRzZXQgU3RlcmVvcGhvbmUiLCBOVUxMLCAiSFBPVVQxTCJ9LAotCXsiSGVhZHNldCBTdGVyZW9waG9uZSIsIE5VTEwsICJIUE9VVDFSIn0sCi0KLQl7IklOMVJOIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCi0JeyJJTjFSUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCi0JeyJJTjFSTiIsIE5VTEwsICIybmQgTWljIn0sCi0JeyJJTjFSUCIsIE5VTEwsICIybmQgTWljIn0sCi0KLQl7IklOMUxOIiwgTlVMTCwgIk1haW4gTWljIn0sCi0JeyJJTjFMUCIsIE5VTEwsICJNYWluIE1pYyJ9LAotCi0JeyJJTjJMTiIsIE5VTEwsICJSYWRpbyBJbiJ9LAotCXsiSU4yUk4iLCBOVUxMLCAiUmFkaW8gSW4ifSwKLX07Ci0KLXN0YXRpYyBpbnQgYXF1aWxhX3dtODk5NF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlpbnQgcmV0OwotCi0JLyogYWRkIGFxdWlsYSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgYXF1aWxhX2RhcG1fd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUoYXF1aWxhX2RhcG1fd2lkZ2V0cykpOwotCi0JLyogc2V0IHVwIGFxdWlsYSBzcGVjaWZpYyBhdWRpbyByb3V0ZXMgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXF1aWxhX2RhcG1fcm91dGVzLAotCQkJQVJSQVlfU0laRShhcXVpbGFfZGFwbV9yb3V0ZXMpKTsKLQotCS8qIHNldCBlbmRwb2ludHMgdG8gbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJJTjJMUDpWWFJOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIklOMlJQOlZYUlAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORU9VVDFOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkVPVVQxUCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FT1VUMk4iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORU9VVDJQIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlNQS09VVFJOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlNQS09VVFJQIik7Ci0KLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7Ci0KLQkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCi0JcmV0ID0gc25kX3NvY19qYWNrX25ldygmYXF1aWxhLCAiSGVhZHNldCBKYWNrIiwKLQkJCVNORF9KQUNLX0hFQURTRVQgfCBTTkRfSkFDS19NRUNIQU5JQ0FMIHwgU05EX0pBQ0tfQVZPVVQsCi0JCQkmamFjayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfamFja19hZGRfcGlucygmamFjaywgQVJSQVlfU0laRShqYWNrX3BpbnMpLCBqYWNrX3BpbnMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2phY2tfYWRkX2dwaW9zKCZqYWNrLCBBUlJBWV9TSVpFKGphY2tfZ3Bpb3MpLCBqYWNrX2dwaW9zKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXF1aWxhX2hpZmlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0JdW5zaWduZWQgaW50IHBsbF9vdXQgPSAyNDAwMDAwMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIHNldCB0aGUgY3B1IERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAotCQkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCB0aGUgY3B1IHN5c3RlbSBjbG9jayAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY3B1X2RhaSwgUzNDNjRYWF9DTEtTUkNfUENMSywKLQkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogc2V0IGNvZGVjIERBSSBjb25maWd1cmF0aW9uICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjb2RlY19kYWksIFNORF9TT0NfREFJRk1UX0kyUyB8Ci0JCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogc2V0IHRoZSBjb2RlYyBGTEwgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgV004OTk0X0ZMTDEsIDAsIHBsbF9vdXQsCi0JCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFdNODk5NF9TWVNDTEtfRkxMMSwKLQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYsIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYXF1aWxhX2hpZmlfb3BzID0gewotCS5od19wYXJhbXMgPSBhcXVpbGFfaGlmaV9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgaW50IGFxdWlsYV92b2ljZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXVuc2lnbmVkIGludCBwbGxfb3V0ID0gMjQwMDAwMDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSAhPSA4MDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9MRUZUX0ogfAotCQkJU05EX1NPQ19EQUlGTVRfSUJfSUYgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCB0aGUgY29kZWMgRkxMICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODk5NF9GTEwyLCAwLCBwbGxfb3V0LAotCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDI1Nik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBzZXQgdGhlIGNvZGVjIHN5c3RlbSBjbG9jayAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg5OTRfU1lTQ0xLX0ZMTDIsCi0JCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogMjU2LCBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB2b2ljZV9kYWkgPSB7Ci0JLm5hbWUgPSAiYXF1aWxhLXZvaWNlLWRhaSIsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKLQkuY2FwdHVyZSA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGFxdWlsYV92b2ljZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IGFxdWlsYV92b2ljZV9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYXF1aWxhX2RhaVtdID0gewotewotCS5uYW1lID0gIldNODk5NCIsCi0JLnN0cmVhbV9uYW1lID0gIldNODk5NCBIaUZpIiwKLQkuY3B1X2RhaV9uYW1lID0gInMzYzY0eHgtaTJzLXY0IiwKLQkuY29kZWNfZGFpX25hbWUgPSAid204OTk0LWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lID0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKLQkuY29kZWNfbmFtZSA9ICJ3bTg5OTQtY29kZWMuMC0weDFhIiwKLQkuaW5pdCA9IGFxdWlsYV93bTg5OTRfaW5pdCwKLQkub3BzID0gJmFxdWlsYV9oaWZpX29wcywKLX0sIHsKLQkubmFtZSA9ICJXTTg5OTQgVm9pY2UiLAotCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSIsCi0JLmNwdV9kYWlfbmFtZSA9ICJhcXVpbGEtdm9pY2UtZGFpIiwKLQkuY29kZWNfZGFpX25hbWUgPSAid204OTk0LXZvaWNlIiwKLQkucGxhdGZvcm1fbmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUgPSAid204OTk0LWNvZGVjLjAtMHgxYSIsCi0JLm9wcyA9ICZhcXVpbGFfdm9pY2Vfb3BzLAotfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGFxdWlsYSA9IHsKLQkubmFtZSA9ICJhcXVpbGEiLAotCS5kYWlfbGluayA9IGFxdWlsYV9kYWksCi0JLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoYXF1aWxhX2RhaSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhcXVpbGFfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAoIW1hY2hpbmVfaXNfYXF1aWxhKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JYXF1aWxhX3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIC0xKTsKLQlpZiAoIWFxdWlsYV9zbmRfZGV2aWNlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIHJlZ2lzdGVyIHZvaWNlIERBSSBoZXJlICovCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJmFxdWlsYV9zbmRfZGV2aWNlLT5kZXYsICZ2b2ljZV9kYWkpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShhcXVpbGFfc25kX2RldmljZSwgJmFxdWlsYSk7Ci0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhcXVpbGFfc25kX2RldmljZSk7Ci0KLQlpZiAocmV0KQotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGFxdWlsYV9zbmRfZGV2aWNlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhcXVpbGFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFxdWlsYV9zbmRfZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoYXF1aWxhX2luaXQpOwotbW9kdWxlX2V4aXQoYXF1aWxhX2V4aXQpOwotCi0vKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KLU1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgV004OTk0IEFxdWlsYShTNVBDMTEwKSIpOwotTU9EVUxFX0FVVEhPUigiQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2M2NHh4LWkycy12NC5jIGIvc291bmQvc29jL3MzYzI0eHgvczNjNjR4eC1pMnMtdjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2Mjg0Ny4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2M2NHh4LWkycy12NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzY0eHgtaTJzLXY0LmMKLSAqCi0gKiBBTFNBIFNvQyBBdWRpbyBMYXllciAtIFMzQzY0WFggSTJTdjQgZHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkCi0gKiAJQXV0aG9yOiBKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2F1ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL21hcC5oPgotI2luY2x1ZGUgPG1hY2gvZG1hLmg+Ci0KLSNpbmNsdWRlICJzM2MtZG1hLmgiCi0jaW5jbHVkZSAicmVncy1pMnMtdjIuaCIKLSNpbmNsdWRlICJzM2M2NHh4LWkycy5oIgotCi1zdGF0aWMgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCBzM2M2NHh4X2RtYV9jbGllbnRfb3V0ID0gewotCS5uYW1lCQk9ICJJMlN2NCBQQ00gU3RlcmVvIG91dCIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50IHMzYzY0eHhfZG1hX2NsaWVudF9pbiA9IHsKLQkubmFtZQkJPSAiSTJTdjQgUENNIFN0ZXJlbyBpbiIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjNjR4eF9pMnN2NF9wY21fc3RlcmVvX291dDsKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjNjR4eF9pMnN2NF9wY21fc3RlcmVvX2luOwotc3RhdGljIHN0cnVjdCBzM2NfaTJzdjJfaW5mbyBzM2M2NHh4X2kyc3Y0OwotCi1zdGF0aWMgaW50IHMzYzY0eHhfaTJzdjRfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnMgPSAmczNjNjR4eF9pMnN2NDsKLQlpbnQgcmV0ID0gMDsKLQotCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgaTJzKTsKLQotCXJldCA9IHMzY19pMnN2Ml9wcm9iZShkYWksIGkycywgaTJzLT5iYXNlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgczNjX2kyc3Y0X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSkKLXsKLQlzdHJ1Y3QgczNjX2kyc3YyX2luZm8gKmkycyA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGNwdV9kYWkpOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqZG1hX2RhdGE7Ci0JdTMyIGlpc21vZDsKLQotCWRldl9kYmcoY3B1X2RhaS0+ZGV2LCAiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWRtYV9kYXRhID0gaTJzLT5kbWFfcGxheWJhY2s7Ci0JZWxzZQotCQlkbWFfZGF0YSA9IGkycy0+ZG1hX2NhcHR1cmU7Ci0KLQlzbmRfc29jX2RhaV9zZXRfZG1hX2RhdGEoY3B1X2RhaSwgc3Vic3RyZWFtLCBkbWFfZGF0YSk7Ci0KLQlpaXNtb2QgPSByZWFkbChpMnMtPnJlZ3MgKyBTM0MyNDEyX0lJU01PRCk7Ci0JZGV2X2RiZyhjcHVfZGFpLT5kZXYsICIlczogcjogSUlTTU9EOiAleFxuIiwgX19mdW5jX18sIGlpc21vZCk7Ci0KLQlpaXNtb2QgJj0gflMzQzY0WFhfSUlTTU9EX0JMQ19NQVNLOwotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1M4OgotCQlpaXNtb2QgfD0gUzNDNjRYWF9JSVNNT0RfQkxDXzhCSVQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWlpc21vZCB8PSBTM0M2NFhYX0lJU01PRF9CTENfMjRCSVQ7Ci0JCWJyZWFrOwotCX0KLQotCXdyaXRlbChpaXNtb2QsIGkycy0+cmVncyArIFMzQzI0MTJfSUlTTU9EKTsKLQlkZXZfZGJnKGNwdV9kYWktPmRldiwgIiVzOiB3OiBJSVNNT0Q6ICV4XG4iLCBfX2Z1bmNfXywgaWlzbW9kKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBzM2M2NHh4X2kyc3Y0X2RhaV9vcHMgPSB7Ci0JLmh3X3BhcmFtcwk9IHMzY19pMnN2NF9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzM2M2NHh4X2kyc192NF9kYWkgPSB7Ci0JLnN5bW1ldHJpY19yYXRlcyA9IDEsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFMzQzY0WFhfSTJTX1JBVEVTLAotCQkuZm9ybWF0cyA9IFMzQzY0WFhfSTJTX0ZNVFMsCi0JfSwKLQkuY2FwdHVyZSA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTM0M2NFhYX0kyU19SQVRFUywKLQkJLmZvcm1hdHMgPSBTM0M2NFhYX0kyU19GTVRTLAotCX0sCi0JLnByb2JlID0gczNjNjR4eF9pMnN2NF9wcm9iZSwKLQkub3BzID0gJnMzYzY0eHhfaTJzdjRfZGFpX29wcywKLX07Ci0KLXN0YXRpYyBfX2RldmluaXQgaW50IHMzYzY0eHhfaTJzdjRfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHMzY19hdWRpb19wZGF0YSAqaTJzX3BkYXRhOwotCXN0cnVjdCBzM2NfaTJzdjJfaW5mbyAqaTJzOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQ7Ci0KLQlpMnMgPSAmczNjNjR4eF9pMnN2NDsKLQotCWkycy0+ZmVhdHVyZSB8PSBTM0NfRkVBVFVSRV9DRENMS0NPTjsKLQotCWkycy0+ZG1hX2NhcHR1cmUgPSAmczNjNjR4eF9pMnN2NF9wY21fc3RlcmVvX2luOwotCWkycy0+ZG1hX3BsYXliYWNrID0gJnMzYzY0eHhfaTJzdjRfcGNtX3N0ZXJlb19vdXQ7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgSTJTLVRYIGRtYSByZXNvdXJjZVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWkycy0+ZG1hX3BsYXliYWNrLT5jaGFubmVsID0gcmVzLT5zdGFydDsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBJMlMtUlggZG1hIHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JaTJzLT5kbWFfY2FwdHVyZS0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgSTJTIFNGUiBhZGRyZXNzXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCi0JCQkJInMzYzY0eHgtaTJzLXY0IikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgU0ZSIHJlZ2lvblxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWkycy0+ZG1hX2NhcHR1cmUtPmRtYV9hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTJfSUlTUlhEOwotCWkycy0+ZG1hX3BsYXliYWNrLT5kbWFfYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1RYRDsKLQotCWkycy0+ZG1hX2NhcHR1cmUtPmNsaWVudCA9ICZzM2M2NHh4X2RtYV9jbGllbnRfaW47Ci0JaTJzLT5kbWFfY2FwdHVyZS0+ZG1hX3NpemUgPSA0OwotCWkycy0+ZG1hX3BsYXliYWNrLT5jbGllbnQgPSAmczNjNjR4eF9kbWFfY2xpZW50X291dDsKLQlpMnMtPmRtYV9wbGF5YmFjay0+ZG1hX3NpemUgPSA0OwotCi0JaTJzLT5iYXNlID0gcmVzLT5zdGFydDsKLQotCWkyc19wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChpMnNfcGRhdGEgJiYgaTJzX3BkYXRhLT5jZmdfZ3BpbyAmJiBpMnNfcGRhdGEtPmNmZ19ncGlvKHBkZXYpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBjb25maWd1cmUgZ3Bpb1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWkycy0+aWlzX2NjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJhdWRpby1idXMiKTsKLQlpZiAoSVNfRVJSKGkycy0+aWlzX2NjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYXVkaW8tYnVzXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihpMnMtPmlpc19jY2xrKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JY2xrX2VuYWJsZShpMnMtPmlpc19jY2xrKTsKLQotCXJldCA9IHMzY19pMnN2Ml9yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldiwgcGRldi0+aWQsICZzM2M2NHh4X2kyc192NF9kYWkpOwotCWlmIChyZXQgIT0gMCkKLQkJZ290byBlcnJfaTJzdjI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2kyc3YyOgotCWNsa19wdXQoaTJzLT5paXNfY2Nsayk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIF9fZGV2ZXhpdCBpbnQgczNjNjR4eF9pMnN2NF9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnMgPSAmczNjNjR4eF9pMnN2NDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJnBkZXYtPmRldik7Ci0JY2xrX3B1dChpMnMtPmlpc19jY2xrKTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHJlcykKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7Ci0JZWxzZQotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBJMlMgU0ZSIGFkZHJlc3NcbiIpOwotCQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjNjR4eF9pMnN2NF9kcml2ZXIgPSB7Ci0JLnByb2JlICA9IHMzYzY0eHhfaTJzdjRfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBzM2M2NHh4X2kyc3Y0X2Rldl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiczNjNjR4eC1paXMtdjQiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgczNjNjR4eF9pMnN2NF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmczNjNjR4eF9pMnN2NF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoczNjNjR4eF9pMnN2NF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHMzYzY0eHhfaTJzdjRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzM2M2NHh4X2kyc3Y0X2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzM2M2NHh4X2kyc3Y0X2V4aXQpOwotCi0vKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KLU1PRFVMRV9BVVRIT1IoIkphc3dpbmRlciBTaW5naCwgPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlMzQzY0WFggSTJTdjQgU29DIEludGVyZmFjZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2M2NHh4LWlpcy12NCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjNjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzY0eHgtaTJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlN2FjYjYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjNjR4eC1pMnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zM2M2NHh4LWkycy5jCi0gKgotICogQUxTQSBTb0MgQXVkaW8gTGF5ZXIgLSBTM0M2NFhYIEkyUyBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCBPcGVubW9rbywgSW5jLgotICogQ29weXJpZ2h0IDIwMDggU2ltdGVjIEVsZWN0cm9uaWNzCi0gKiAgICAgIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotI2luY2x1ZGUgPHBsYXQvYXVkaW8uaD4KLQotI2luY2x1ZGUgPG1hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLQotI2luY2x1ZGUgInMzYy1kbWEuaCIKLSNpbmNsdWRlICJyZWdzLWkycy12Mi5oIgotI2luY2x1ZGUgInMzYzY0eHgtaTJzLmgiCi0KLS8qIFRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIG1heGltdW0gb2YgdGhlIHRvdGFsIG51bWJlcgotICogb2YgSTJTdjMgY29udHJvbGxlcnMgdGhhdCBhbnkgc3VwcG9ydGVkIFNvQyBoYXMuCi0gKi8KLSNkZWZpbmUgTUFYX0kyU1YzCTIKLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjNjR4eF9kbWFfY2xpZW50X291dCA9IHsKLQkubmFtZQkJPSAiSTJTIFBDTSBTdGVyZW8gb3V0IgotfTsKLQotc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjNjR4eF9kbWFfY2xpZW50X2luID0gewotCS5uYW1lCQk9ICJJMlMgUENNIFN0ZXJlbyBpbiIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjNjR4eF9pMnNfcGNtX3N0ZXJlb19vdXRbTUFYX0kyU1YzXTsKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjNjR4eF9pMnNfcGNtX3N0ZXJlb19pbltNQVhfSTJTVjNdOwotc3RhdGljIHN0cnVjdCBzM2NfaTJzdjJfaW5mbyBzM2M2NHh4X2kyc1tNQVhfSTJTVjNdOwotCi1zdHJ1Y3QgY2xrICpzM2M2NHh4X2kyc19nZXRfY2xvY2soc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnMgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwotCXUzMiBpaXNtb2QgPSByZWFkbChpMnMtPnJlZ3MgKyBTM0MyNDEyX0lJU01PRCk7Ci0KLQlpZiAoaWlzbW9kICYgUzNDMjQxMl9JSVNNT0RfSU1TX1NZU01VWCkKLQkJcmV0dXJuIGkycy0+aWlzX2NjbGs7Ci0JZWxzZQotCQlyZXR1cm4gaTJzLT5paXNfcGNsazsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHMzYzY0eHhfaTJzX2dldF9jbG9jayk7Ci0KLXN0YXRpYyBpbnQgczNjNjR4eF9pMnNfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnM7Ci0JaW50IHJldDsKLQotCWlmIChkYWktPmlkID49IE1BWF9JMlNWMykgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiaWQgJWQgb3V0IG9mIHJhbmdlXG4iLCBkYWktPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaTJzID0gJnMzYzY0eHhfaTJzW2RhaS0+aWRdOwotCXNuZF9zb2NfZGFpX3NldF9kcnZkYXRhKGRhaSwgaTJzKTsKLQotCWkycy0+aWlzX2NjbGsgPSBjbGtfZ2V0KGRhaS0+ZGV2LCAiYXVkaW8tYnVzIik7Ci0JaWYgKElTX0VSUihpMnMtPmlpc19jY2xrKSkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbGVkIHRvIGdldCBhdWRpby1idXNcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGkycy0+aWlzX2NjbGspOwotCQlnb3RvIGVycjsKLQl9Ci0KLQljbGtfZW5hYmxlKGkycy0+aWlzX2NjbGspOwotCi0JcmV0ID0gczNjX2kyc3YyX3Byb2JlKGRhaSwgaTJzLCBpMnMtPmJhc2UpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2NsazsKLQotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWNsa19kaXNhYmxlKGkycy0+aWlzX2NjbGspOwotCWNsa19wdXQoaTJzLT5paXNfY2Nsayk7Ci1lcnI6Ci0Ja2ZyZWUoaTJzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHMzYzY0eHhfaTJzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgczNjX2kyc3YyX2luZm8gKmkycyA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0KLQljbGtfZGlzYWJsZShpMnMtPmlpc19jY2xrKTsKLQljbGtfcHV0KGkycy0+aWlzX2NjbGspOwotCWtmcmVlKGkycyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHMzYzY0eHhfaTJzX2RhaV9vcHM7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHMzYzY0eHhfaTJzX2RhaVtNQVhfSTJTVjNdID0gewotewotCS5uYW1lID0gInMzYzY0eHgtaTJzLTAiLAotCS5wcm9iZSA9IHMzYzY0eHhfaTJzX3Byb2JlLAotCS5yZW1vdmUgPSBzM2M2NHh4X2kyc19yZW1vdmUsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFMzQzY0WFhfSTJTX1JBVEVTLAotCQkuZm9ybWF0cyA9IFMzQzY0WFhfSTJTX0ZNVFMsfSwKLQkuY2FwdHVyZSA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTM0M2NFhYX0kyU19SQVRFUywKLQkJLmZvcm1hdHMgPSBTM0M2NFhYX0kyU19GTVRTLH0sCi0JLm9wcyA9ICZzM2M2NHh4X2kyc19kYWlfb3BzLAotCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAotfSwgewotCS5uYW1lID0gInMzYzY0eHgtaTJzLTEiLAotCS5wcm9iZSA9IHMzYzY0eHhfaTJzX3Byb2JlLAotCS5yZW1vdmUgPSBzM2M2NHh4X2kyc19yZW1vdmUsCi0JLnBsYXliYWNrID0gewotCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlcyA9IFMzQzY0WFhfSTJTX1JBVEVTLAotCQkuZm9ybWF0cyA9IFMzQzY0WFhfSTJTX0ZNVFMsfSwKLQkuY2FwdHVyZSA9IHsKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTM0M2NFhYX0kyU19SQVRFUywKLQkJLmZvcm1hdHMgPSBTM0M2NFhYX0kyU19GTVRTLH0sCi0JLm9wcyA9ICZzM2M2NHh4X2kyc19kYWlfb3BzLAotCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAotfSx9OwotCi1zdGF0aWMgX19kZXZpbml0IGludCBzM2M2NHh4X2lpc19kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhICppMnNfcGRhdGE7Ci0Jc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnM7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0JaW50IGksIHJldDsKLQotCWlmIChwZGV2LT5pZCA+PSBNQVhfSTJTVjMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaWQgJWQgb3V0IG9mIHJhbmdlXG4iLCBwZGV2LT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWkycyA9ICZzM2M2NHh4X2kyc1twZGV2LT5pZF07Ci0KLQlpMnMtPmRtYV9jYXB0dXJlID0gJnMzYzY0eHhfaTJzX3BjbV9zdGVyZW9faW5bcGRldi0+aWRdOwotCWkycy0+ZG1hX3BsYXliYWNrID0gJnMzYzY0eHhfaTJzX3BjbV9zdGVyZW9fb3V0W3BkZXYtPmlkXTsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBJMlMtVFggZG1hIHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JaTJzLT5kbWFfcGxheWJhY2stPmNoYW5uZWwgPSByZXMtPnN0YXJ0OwotCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IEkyUy1SWCBkbWEgcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlpMnMtPmRtYV9jYXB0dXJlLT5jaGFubmVsID0gcmVzLT5zdGFydDsKLQotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBJMlMgU0ZSIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQkiczNjNjR4eC1pMnMiKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBTRlIgcmVnaW9uXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JaTJzLT5iYXNlID0gcmVzLT5zdGFydDsKLQotCWkyc19wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChpMnNfcGRhdGEgJiYgaTJzX3BkYXRhLT5jZmdfZ3BpbyAmJiBpMnNfcGRhdGEtPmNmZ19ncGlvKHBkZXYpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBjb25maWd1cmUgZ3Bpb1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpMnMtPmRtYV9jYXB0dXJlLT5kbWFfYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1JYRDsKLQlpMnMtPmRtYV9wbGF5YmFjay0+ZG1hX2FkZHIgPSByZXMtPnN0YXJ0ICsgUzNDMjQxMl9JSVNUWEQ7Ci0KLQlpMnMtPmRtYV9jYXB0dXJlLT5jbGllbnQgPSAmczNjNjR4eF9kbWFfY2xpZW50X2luOwotCWkycy0+ZG1hX2NhcHR1cmUtPmRtYV9zaXplID0gNDsKLQlpMnMtPmRtYV9wbGF5YmFjay0+Y2xpZW50ID0gJnMzYzY0eHhfZG1hX2NsaWVudF9vdXQ7Ci0JaTJzLT5kbWFfcGxheWJhY2stPmRtYV9zaXplID0gNDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMzYzY0eHhfaTJzX2RhaSk7IGkrKykgewotCQlyZXQgPSBzM2NfaTJzdjJfcmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYsIGksCi0JCQkJCQkmczNjNjR4eF9pMnNfZGFpW2ldKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIF9fZGV2ZXhpdCBpbnQgczNjNjR4eF9paXNfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWlzKCZwZGV2LT5kZXYsIEFSUkFZX1NJWkUoczNjNjR4eF9pMnNfZGFpKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzY0eHhfaWlzX2RyaXZlciA9IHsKLQkucHJvYmUgID0gczNjNjR4eF9paXNfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBzM2M2NHh4X2lpc19kZXZfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInMzYzY0eHgtaWlzIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHMzYzY0eHhfaTJzX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzM2M2NHh4X2lpc19kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoczNjNjR4eF9pMnNfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzM2M2NHh4X2kyc19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzY0eHhfaWlzX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzM2M2NHh4X2kyc19leGl0KTsKLQotLyogTW9kdWxlIGluZm9ybWF0aW9uICovCi1NT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0M2NFhYIEkyUyBTb0MgSW50ZXJmYWNlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYzY0eHgtaWlzIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2M2NHh4LWkycy5oIGIvc291bmQvc29jL3MzYzI0eHgvczNjNjR4eC1pMnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0MDc1ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2M2NHh4LWkycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogc291bmQvc29jL3MzYzI0eHgvczNjNjR4eC1pMnMuaAotICoKLSAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gUzNDNjRYWCBJMlMgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IDIwMDggT3Blbm1va28sIEluYy4KLSAqIENvcHlyaWdodCAyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwotICogICAgICBCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Ci0gKiAgICAgIGh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fU05EX1NPQ19TM0MyNFhYX1MzQzY0WFhfSTJTX0gKLSNkZWZpbmUgX19TTkRfU09DX1MzQzI0WFhfUzNDNjRYWF9JMlNfSCBfX0ZJTEVfXwotCi1zdHJ1Y3QgY2xrOwotCi0jaW5jbHVkZSAiczNjLWkycy12Mi5oIgotCi0jZGVmaW5lIFMzQzY0WFhfRElWX0JDTEsJUzNDX0kyU1YyX0RJVl9CQ0xLCi0jZGVmaW5lIFMzQzY0WFhfRElWX1JDTEsJUzNDX0kyU1YyX0RJVl9SQ0xLCi0jZGVmaW5lIFMzQzY0WFhfRElWX1BSRVNDQUxFUglTM0NfSTJTVjJfRElWX1BSRVNDQUxFUgotCi0jZGVmaW5lIFMzQzY0WFhfQ0xLU1JDX1BDTEsJUzNDX0kyU1YyX0NMS1NSQ19QQ0xLCi0jZGVmaW5lIFMzQzY0WFhfQ0xLU1JDX01VWAlTM0NfSTJTVjJfQ0xLU1JDX0FVRElPQlVTCi0jZGVmaW5lIFMzQzY0WFhfQ0xLU1JDX0NEQ0xLICAgIFMzQ19JMlNWMl9DTEtTUkNfQ0RDTEsKLQotI2RlZmluZSBTM0M2NFhYX0kyU19SQVRFUyBcCi0JKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgXAotCVNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKLQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDApCi0KLSNkZWZpbmUgUzNDNjRYWF9JMlNfRk1UUyBcCi0JKFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAotCSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSkKLQotc3RydWN0IGNsayAqczNjNjR4eF9pMnNfZ2V0X2Nsb2NrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKTsKLQotI2VuZGlmIC8qIF9fU05EX1NPQ19TM0MyNFhYX1MzQzY0WFhfSTJTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3NtZGs2NHh4X3dtODU4MC5jIGIvc291bmQvc29jL3MzYzI0eHgvc21kazY0eHhfd204NTgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MmU0OTkuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvc21kazY0eHhfd204NTgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoKLSAqICBzbWRrNjR4eF93bTg1ODAuYwotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkCi0gKiAgQXV0aG9yOiBKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KLQotI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg1ODAuaCIKLSNpbmNsdWRlICJzM2MtZG1hLmgiCi0jaW5jbHVkZSAiczNjNjR4eC1pMnMuaCIKLQotLyoKLSAqIERlZmF1bHQgQ0ZHIHN3aXRjaCBzZXR0aW5ncyB0byB1c2UgdGhpcyBkcml2ZXI6Ci0gKgotICogICBTTURLNjQxMDogU2V0IENGRzEgMS0zIE9mZiwgQ0ZHMiAxLTQgT24KLSAqLwotCi0vKiBTTURLNjRYWCBoYXMgYSAxMk1IWiBjcnlzdGFsIGF0dGFjaGVkIHRvIFdNODU4MCAqLwotI2RlZmluZSBTTURLNjRYWF9XTTg1ODBfRlJFUSAxMjAwMDAwMAotCi1zdGF0aWMgaW50IHNtZGs2NHh4X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JdW5zaWduZWQgaW50IHBsbF9vdXQ7Ci0JaW50IGJmcywgcmZzLCByZXQ7Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6Ci0JCWJmcyA9IDE2OwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfVTE2X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCWJmcyA9IDMyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUaGUgRnZjbyBmb3IgV004NTgwIFBMTHMgbXVzdCBmYWxsIHdpdGhpbiBbOTAsMTAwXU1Iei4KLQkgKiBUaGlzIGNyaXRlcmlvbiBjYW4ndCBiZSBtZXQgaWYgd2UgcmVxdWVzdCBQTEwgb3V0cHV0Ci0JICogYXMgezgwMDB4MjU2LCA2NDAwMHgyNTYsIDExMDI1eDI1Nn1Iei4KLQkgKiBBcyBhIHdheW91dCwgd2UgcmF0aGVyIGNoYW5nZSByZnMgdG8gYSBtaW5pbXVtIHZhbHVlIHRoYXQKLQkgKiByZXN1bHRzIGluIChwYXJhbXNfcmF0ZShwYXJhbXMpICogcmZzKSwgYW5kIGl0c2VsZiwgYWNjZXB0YWJsZQotCSAqIHRvIGJvdGggLSB0aGUgQ09ERUMgYW5kIHRoZSBDUFUuCi0JICovCi0Jc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7Ci0JY2FzZSAxNjAwMDoKLQljYXNlIDIyMDUwOgotCWNhc2UgMzIwMDA6Ci0JY2FzZSA0NDEwMDoKLQljYXNlIDQ4MDAwOgotCWNhc2UgODgyMDA6Ci0JY2FzZSA5NjAwMDoKLQkJcmZzID0gMjU2OwotCQlicmVhazsKLQljYXNlIDY0MDAwOgotCQlyZnMgPSAzODQ7Ci0JCWJyZWFrOwotCWNhc2UgODAwMDoKLQljYXNlIDExMDI1OgotCQlyZnMgPSA1MTI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwbGxfb3V0ID0gcGFyYW1zX3JhdGUocGFyYW1zKSAqIHJmczsKLQotCS8qIFNldCB0aGUgQ29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTCi0JCQkJCSB8IFNORF9TT0NfREFJRk1UX05CX05GCi0JCQkJCSB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogU2V0IHRoZSBBUCBEQUkgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTCi0JCQkJCSB8IFNORF9TT0NfREFJRk1UX05CX05GCi0JCQkJCSB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBTM0M2NFhYX0NMS1NSQ19DRENMSywKLQkJCQkJMCwgU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBXZSB1c2UgUENMSyBmb3IgYmFzaWMgb3BzIGluIFNvQy1TbGF2ZSBtb2RlICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBTM0M2NFhYX0NMS1NSQ19QQ0xLLAotCQkJCQkwLCBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFNldCBXTTg1ODAgdG8gZHJpdmUgTUNMSyBmcm9tIGl0cyBQTExBICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2Nsa2Rpdihjb2RlY19kYWksIFdNODU4MF9NQ0xLLAotCQkJCQlXTTg1ODBfQ0xLU1JDX1BMTEEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIFdNODU4MF9QTExBLCAwLAotCQkJCQlTTURLNjRYWF9XTTg1ODBfRlJFUSwgcGxsX291dCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgV004NTgwX0NMS1NSQ19QTExBLAotCQkJCSAgICAgcGxsX291dCwgU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2xrZGl2KGNwdV9kYWksIFMzQ19JMlNWMl9ESVZfQkNMSywgYmZzKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgUzNDX0kyU1YyX0RJVl9SQ0xLLCByZnMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTTURLNjRYWCBXTTg1ODAgREFJIG9wZXJhdGlvbnMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc21kazY0eHhfb3BzID0gewotCS5od19wYXJhbXMgPSBzbWRrNjR4eF9od19wYXJhbXMsCi19OwotCi0vKiBTTURLNjR4eCBQbGF5YmFjayB3aWRnZXRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204NTgwX2RhcG1fd2lkZ2V0c19wYmtbXSA9IHsKLQlTTkRfU09DX0RBUE1fSFAoIkZyb250IiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX0hQKCJDZW50ZXIrU3ViIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX0hQKCJSZWFyIiwgTlVMTCksCi19OwotCi0vKiBTTURLNjR4eCBDYXB0dXJlIHdpZGdldHMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg1ODBfZGFwbV93aWRnZXRzX2NwdFtdID0gewotCVNORF9TT0NfREFQTV9NSUMoIk1pY0luIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX0xJTkUoIkxpbmVJbiIsIE5VTEwpLAotfTsKLQotLyogU01ESy1QQUlGVFggY29ubmVjdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF90eFtdID0gewotCS8qIE1pY0luIGZlZWRzIEFJTkwgKi8KLQl7IkFJTkwiLCBOVUxMLCAiTWljSW4ifSwKLQotCS8qIExpbmVJbiBmZWVkcyBBSU5ML1IgKi8KLQl7IkFJTkwiLCBOVUxMLCAiTGluZUluIn0sCi0JeyJBSU5SIiwgTlVMTCwgIkxpbmVJbiJ9LAotfTsKLQotLyogU01ESy1QQUlGUlggY29ubmVjdGlvbnMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF9yeFtdID0gewotCS8qIEZyb250IExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUMUwvUiAqLwotCXsiRnJvbnQiLCBOVUxMLCAiVk9VVDFMIn0sCi0JeyJGcm9udCIsIE5VTEwsICJWT1VUMVIifSwKLQotCS8qIENlbnRlci9TdWIgYXJlIGZlZCBWT1VUMkwvUiAqLwotCXsiQ2VudGVyK1N1YiIsIE5VTEwsICJWT1VUMkwifSwKLQl7IkNlbnRlcitTdWIiLCBOVUxMLCAiVk9VVDJSIn0sCi0KLQkvKiBSZWFyIExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUM0wvUiAqLwotCXsiUmVhciIsIE5VTEwsICJWT1VUM0wifSwKLQl7IlJlYXIiLCBOVUxMLCAiVk9VVDNSIn0sCi19OwotCi1zdGF0aWMgaW50IHNtZGs2NHh4X3dtODU4MF9pbml0X3BhaWZ0eChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQkvKiBBZGQgc21kazY0eHggc3BlY2lmaWMgQ2FwdHVyZSB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204NTgwX2RhcG1fd2lkZ2V0c19jcHQsCi0JCQkJICBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3dpZGdldHNfY3B0KSk7Ci0KLQkvKiBTZXQgdXAgUEFJRlRYIGF1ZGlvIHBhdGggKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwX3R4LCBBUlJBWV9TSVpFKGF1ZGlvX21hcF90eCkpOwotCi0JLyogRW5hYmxpbmcgdGhlIG1pY3JvcGhvbmUgcmVxdWlyZXMgdGhlIGZpdHRpbmcgb2YgYSAwUgotCSAqIHJlc2lzdG9yIHRvIGNvbm5lY3QgdGhlIGxpbmUgZnJvbSB0aGUgbWljcm9waG9uZSBqYWNrLgotCSAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIk1pY0luIik7Ci0KLQkvKiBzaWduYWwgYSBEQVBNIGV2ZW50ICovCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc21kazY0eHhfd204NTgwX2luaXRfcGFpZnJ4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQotCS8qIEFkZCBzbWRrNjR4eCBzcGVjaWZpYyBQbGF5YmFjayB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204NTgwX2RhcG1fd2lkZ2V0c19wYmssCi0JCQkJICBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3dpZGdldHNfcGJrKSk7Ci0KLQkvKiBTZXQgdXAgUEFJRlJYIGF1ZGlvIHBhdGggKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwX3J4LCBBUlJBWV9TSVpFKGF1ZGlvX21hcF9yeCkpOwotCi0JLyogc2lnbmFsIGEgREFQTSBldmVudCAqLwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgc21kazY0eHhfZGFpW10gPSB7Ci17IC8qIFByaW1hcnkgUGxheWJhY2sgaS9mICovCi0JLm5hbWUgPSAiV004NTgwIFBBSUYgUlgiLAotCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCi0JLmNwdV9kYWlfbmFtZSA9ICJzM2M2NHh4LWlpcy12NCIsCi0JLmNvZGVjX2RhaV9uYW1lID0gIndtODU4MC1oaWZpLXBsYXliYWNrIiwKLQkucGxhdGZvcm1fbmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCi0JLmNvZGVjX25hbWUgPSAid204NTgwLWNvZGVjLjAtMDAxYiIsCi0JLmluaXQgPSBzbWRrNjR4eF93bTg1ODBfaW5pdF9wYWlmcngsCi0JLm9wcyA9ICZzbWRrNjR4eF9vcHMsCi19LAoteyAvKiBQcmltYXJ5IENhcHR1cmUgaS9mICovCi0JLm5hbWUgPSAiV004NTgwIFBBSUYgVFgiLAotCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKLQkuY3B1X2RhaV9uYW1lID0gInMzYzY0eHgtaWlzLXY0IiwKLQkuY29kZWNfZGFpX25hbWUgPSAid204NTgwLWhpZmktY2FwdHVyZSIsCi0JLnBsYXRmb3JtX25hbWUgPSAiczNjMjR4eC1wY20tYXVkaW8iLAotCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAotCS5pbml0ID0gc21kazY0eHhfd204NTgwX2luaXRfcGFpZnR4LAotCS5vcHMgPSAmc21kazY0eHhfb3BzLAotfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNtZGs2NHh4ID0gewotCS5uYW1lID0gIlNNREs2NHh4IDUuMSIsCi0JLmRhaV9saW5rID0gc21kazY0eHhfZGFpLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKHNtZGs2NHh4X2RhaSksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21kazY0eHhfc25kX2RldmljZTsKLQotc3RhdGljIGludCBfX2luaXQgc21kazY0eHhfYXVkaW9faW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlzbWRrNjR4eF9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7Ci0JaWYgKCFzbWRrNjR4eF9zbmRfZGV2aWNlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHNtZGs2NHh4X3NuZF9kZXZpY2UsICZzbWRrNjR4eCk7Ci0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbWRrNjR4eF9zbmRfZGV2aWNlKTsKLQotCWlmIChyZXQpCi0JCXBsYXRmb3JtX2RldmljZV9wdXQoc21kazY0eHhfc25kX2RldmljZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQoc21kazY0eHhfYXVkaW9faW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkphc3dpbmRlciBTaW5naCwgamFzc2kuYnJhckBzYW1zdW5nLmNvbSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTTURLNjRYWCBXTTg1ODAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zNjAwMC9zNjEwNS1pcGNhbS5jIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKaW5kZXggYzEyNDRjNS4uNTg5MGU0MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKKysrIGIvc291bmQvc29jL3M2MDAwL3M2MTA1LWlwY2FtLmMKQEAgLTE4LDExICsxOCw5IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDx2YXJpYW50L2RtYWMuaD4KIAotI2luY2x1ZGUgIi4uL2NvZGVjcy90bHYzMjBhaWMzeC5oIgogI2luY2x1ZGUgInM2MDAwLXBjbS5oIgogI2luY2x1ZGUgInM2MDAwLWkycy5oIgogCkBAIC0xMDcsNiArMTA1LDcgQEAKIAkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCXVuc2lnbmVkIGludCB2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSAhPSAwKTsKIAljaGFyICpkaWZmZXJlbnRpYWwgPSAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCI7CiAJY2hhciAqc3RlcmVvID0gIkF1ZGlvIE91dCBTdGVyZW8iOwpAQCAtMTE0LDEwICsxMTMsMTAgQEAKIAlpZiAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPT0gdmFsKQogCQlyZXR1cm4gMDsKIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IHZhbDsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsIHZhbCA/IGRpZmZlcmVudGlhbCA6IHN0ZXJlbyk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCB2YWwgPyBzdGVyZW8gOiBkaWZmZXJlbnRpYWwpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgdmFsID8gZGlmZmVyZW50aWFsIDogc3RlcmVvKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCB2YWwgPyBzdGVyZW8gOiBkaWZmZXJlbnRpYWwpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xMzcsMzUgKzEzNiwzNiBAQAogc3RhdGljIGludCBzNjEwNV9haWMzeF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKIAkvKiBBZGQgczYxMDUgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIGFpYzN4X2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGFpYzN4X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBTZXQgdXAgczYxMDUgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIG5vdCBwcmVzZW50ICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1PTk9fTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FMkwiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORTJSIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OT19MT1VUIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJMIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJSIik7CiAKIAkvKiBub3QgY29ubmVjdGVkICovCi0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk1JQzNMIik7IC8qIExJTkUyTCBvbiB0aGlzIGNoaXAgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTUlDM1IiKTsgLyogTElORTJSIG9uIHRoaXMgY2hpcCAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSTE9VVCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJIUFJDT00iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMzTCIpOyAvKiBMSU5FMkwgb24gdGhpcyBjaGlwICovCisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTUlDM1IiKTsgLyogTElORTJSIG9uIHRoaXMgY2hpcCAqLworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxMT1VUIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUkxPVVQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUFJDT00iKTsKIAogCS8qIGFsd2F5cyBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1ZGlvIEluIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkF1ZGlvIEluIik7CiAKIAkvKiBtdXN0IGNvcnJlc3BvbmQgdG8gYXVkaW9fb3V0X211eC5wcml2YXRlX3ZhbHVlIGluaXRpYWxpemVyICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQXVkaW8gT3V0IERpZmZlcmVudGlhbCIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCBTdGVyZW8iKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCBEaWZmZXJlbnRpYWwiKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0IFN0ZXJlbyIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJc25kX2N0bF9hZGQoY29kZWMtPmNhcmQtPnNuZF9jYXJkLCBzbmRfY3RsX25ldzEoJmF1ZGlvX291dF9tdXgsIGNvZGVjKSk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTZiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCkBAIC0wLDAgKzEsMTcxIEBACitjb25maWcgU05EX1NPQ19TQU1TVU5HCisJdHJpc3RhdGUgIkFTb0Mgc3VwcG9ydCBmb3IgU2Ftc3VuZyIKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCB8fCBBUkNIX1MzQzY0WFggfHwgQVJDSF9TNVBDMTAwIHx8IEFSQ0hfUzVQVjIxMCB8fCBBUkNIX1M1UDY0WDAgfHwgQVJDSF9TNVA2NDQyIHx8IEFSQ0hfUzVQVjMxMAorCXNlbGVjdCBTM0M2NFhYX0RNQSBpZiBBUkNIX1MzQzY0WFgKKwlzZWxlY3QgUzNDMjQxMF9ETUEgaWYgQVJDSF9TM0MyNDEwCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgY29kZWNzIGF0dGFjaGVkIHRvCisJICB0aGUgU2Ftc3VuZyBTb0NzJyBBdWRpbyBpbnRlcmZhY2VzLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8KKwkgIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgorCitjb25maWcgU05EX1MzQzI0WFhfSTJTCisJdHJpc3RhdGUKKwlzZWxlY3QgUzNDMjQxMF9ETUEKKworY29uZmlnIFNORF9TM0NfSTJTVjJfU09DCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TM0MyNDEyX1NPQ19JMlMKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfUzNDX0kyU1YyX1NPQworCXNlbGVjdCBTM0MyNDEwX0RNQQorCitjb25maWcgU05EX1NBTVNVTkdfUENNCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TQU1TVU5HX0FDOTcKKwl0cmlzdGF0ZQorCXNlbGVjdCBTTkRfU09DX0FDOTdfQlVTCisKK2NvbmZpZyBTTkRfU0FNU1VOR19TUERJRgorCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfU1BESUYKKworY29uZmlnIFNORF9TQU1TVU5HX0kyUworCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1NBTVNVTkdfTkVPMTk3M19XTTg3NTMKKwl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBORU8xOTczIC0gV004NzUzIgorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfTkVPMTk3M19HVEEwMQorCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKKwlzZWxlY3QgU05EX1NPQ19XTTg3NTMKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHNtZGsyNDQwCisJICB3aXRoIHRoZSBXTTg3NTMuCisKK2NvbmZpZyBTTkRfU09DX1NBTVNVTkdfTkVPMTk3M19HVEEwMl9XTTg3NTMKKwl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgdGhlIE9wZW5tb2tvIE5lbyBGcmVlUnVubmVyIChHVEEwMikiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9ORU8xOTczX0dUQTAyCisJc2VsZWN0IFNORF9TM0MyNFhYX0kyUworCXNlbGVjdCBTTkRfU09DX1dNODc1MworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGF1ZGlvIHN1cHBvcnQgZm9yIHRoZSBPcGVubW9rbyBOZW8gRnJlZVJ1bm5lcgorCSAgc21hcnRwaG9uZS4KKwkgIAorY29uZmlnIFNORF9TT0NfU0FNU1VOR19KSVZFX1dNODc1MAorCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIEppdmUiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9KSVZFCisJc2VsZWN0IFNORF9TT0NfV004NzUwCisJc2VsZWN0IFNORF9TM0MyNDEyX1NPQ19JMlMKKwloZWxwCisJICBTYXQgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBKaXZlLgorCitjb25maWcgU05EX1NPQ19TQU1TVU5HX1NNREtfV004NTgwCisJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgV004NTgwIG9uIFNNREsiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ESzY0MTAgfHwgTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREs2NDQwIHx8IE1BQ0hfU01ESzY0NTAgfHwgTUFDSF9TTURLNjQ0MiB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES0MxMTApCisJc2VsZWN0IFNORF9TT0NfV004NTgwCisJc2VsZWN0IFNORF9TQU1TVU5HX0kyUworCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gdGhlIFNNREtzLgorCitjb25maWcgU05EX1NPQ19TQU1TVU5HX1NNREtfV004OTk0CisJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgV004OTk0IG9uIFNNREsiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgKE1BQ0hfU01ES1YzMTAgfHwgTUFDSF9TTURLQzIxMCkKKwlzZWxlY3QgU05EX1NPQ19XTTg5OTQKKwlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCisJaGVscAorCQlTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBTTURLcy4KKworY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLMjQ0M19XTTk3MTAKKwl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESzI0NDMgLSBXTTk3MTAiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9TTURLMjQ0MworCXNlbGVjdCBTM0MyNDEwX0RNQQorCXNlbGVjdCBBQzk3X0JVUworCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKKwlzZWxlY3QgU05EX1NBTVNVTkdfQUM5NworCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gc21kazI0NDMKKwkgIHdpdGggdGhlIFdNOTcxMC4KKworY29uZmlnIFNORF9TT0NfU0FNU1VOR19MTjI0NDBTQkNfQUxDNjUwCisJdHJpc3RhdGUgIlNvQyBBQzk3IEF1ZGlvIHN1cHBvcnQgZm9yIExOMjQ0MFNCQyAtIEFMQzY1MCIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgUzNDMjQxMF9ETUEKKwlzZWxlY3QgQUM5N19CVVMKKwlzZWxlY3QgU05EX1NPQ19BQzk3X0NPREVDCisJc2VsZWN0IFNORF9TQU1TVU5HX0FDOTcKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIGxuMjQ0MHNiYworCSAgd2l0aCB0aGUgQUxDNjUwLgorCitjb25maWcgU05EX1NPQ19TQU1TVU5HX1MzQzI0WFhfVURBMTM0WAorCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgVURBMTM0WCB3aXJlZCB0byBhIFMzQzI0WFgiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNDEwCisJc2VsZWN0IFNORF9TM0MyNFhYX0kyUworCXNlbGVjdCBTTkRfU09DX0wzCisJc2VsZWN0IFNORF9TT0NfVURBMTM0WAorCitjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQworCXRyaXN0YXRlCisJaGVscAorCSAgSW50ZXJuYWwgbm9kZSBmb3IgY29tbW9uIFMzQzI0WFgvU2ltdGVjIHN1cHBvcgorCitjb25maWcgU05EX1NPQ19TQU1TVU5HX1NJTVRFQ19UTFYzMjBBSUMyMworCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFRMVjMyMEFJQzIzIG9uIFNpbXRlYyBib2FyZHMiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNDEwCisJc2VsZWN0IFNORF9TM0MyNFhYX0kyUworCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzCisJc2VsZWN0IFNORF9TT0NfU0FNU1VOR19TSU1URUMKKworY29uZmlnIFNORF9TT0NfU0FNU1VOR19TSU1URUNfSEVSTUVTCisJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgU2ltdGVjIEhlcm1lcyBib2FyZCIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCisJc2VsZWN0IFNORF9TT0NfVExWMzIwQUlDM1gKKwlzZWxlY3QgU05EX1NPQ19TQU1TVU5HX1NJTVRFQworCitjb25maWcgU05EX1NPQ19TQU1TVU5HX0gxOTQwX1VEQTEzODAKKwl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgdGhlIEhQIGlQQVEgSDE5NDAiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9IMTk0MAorCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKKwlzZWxlY3QgU05EX1NPQ19VREExMzgwCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgYXVkaW8gc3VwcG9ydCBmb3IgSFAgaVBBUSBoMTk0MCBQREEuCisKK2NvbmZpZyBTTkRfU09DX1NBTVNVTkdfUlgxOTUwX1VEQTEzODAKKwl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgdGhlIEhQIGlQQVEgUlgxOTUwIgorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfUlgxOTUwCisJc2VsZWN0IFNORF9TM0MyNFhYX0kyUworCXNlbGVjdCBTTkRfU09DX1VEQTEzODAKKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBhdWRpbyBzdXBwb3J0IGZvciBIUCBpUEFRIFJYMTk1MCBQREEuCisKK2NvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19XTTk3MTMKKwl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyB3aXRoIFdNOTcxMyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLNjQxMCB8fCBNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMCB8fCBNQUNIX1NNREtWMzEwIHx8IE1BQ0hfU01ES0MyMTApCisJc2VsZWN0IFNORF9TT0NfV005NzEzCisJc2VsZWN0IFNORF9TQU1TVU5HX0FDOTcKKwloZWxwCisJICBTYXQgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIHRoZSBTTURLLgorCitjb25maWcgU05EX1NPQ19TTUFSVFEKKwl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBTbWFydFEgYm9hcmQiCisJZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9TTUFSVFEKKwlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCisJc2VsZWN0IFNORF9TT0NfV004NzUwCisKK2NvbmZpZyBTTkRfU09DX0dPTklfQVFVSUxBX1dNODk5NAorCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIEFRVUlMQS9HT05JIC0gV004OTk0IgorCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX0dPTkkgfHwgTUFDSF9BUVVJTEEpCisJc2VsZWN0IFNORF9TQU1TVU5HX0kyUworCXNlbGVjdCBTTkRfU09DX1dNODk5NAorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gZ29uaSBvciBhcXVpbGEKKwkgIHdpdGggdGhlIFdNODk5NC4KKworY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLX1NQRElGCisJdHJpc3RhdGUgIlNvQyBTL1BESUYgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtDMTEwIHx8IE1BQ0hfU01ES1YyMTApCisJc2VsZWN0IFNORF9TQU1TVU5HX1NQRElGCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBTL1BESUYgYXVkaW8gb24gdGhlIFNNREsuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zYW1zdW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWQ0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9NYWtlZmlsZQpAQCAtMCwwICsxLDU1IEBACisjIFMzYzI0WFggUGxhdGZvcm0gU3VwcG9ydAorc25kLXNvYy1zM2MyNHh4LW9ianMgOj0gZG1hLm8KK3NuZC1zb2MtczNjMjR4eC1pMnMtb2JqcyA6PSBzM2MyNHh4LWkycy5vCitzbmQtc29jLXMzYzI0MTItaTJzLW9ianMgOj0gczNjMjQxMi1pMnMubworc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCitzbmQtc29jLXMzYy1pMnMtdjItb2JqcyA6PSBzM2MtaTJzLXYyLm8KK3NuZC1zb2Mtc2Ftc3VuZy1zcGRpZi1vYmpzIDo9IHNwZGlmLm8KK3NuZC1zb2MtcGNtLW9ianMgOj0gcGNtLm8KK3NuZC1zb2MtaTJzLW9ianMgOj0gaTJzLm8KKworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VORykgKz0gc25kLXNvYy1zM2MyNHh4Lm8KK29iai0kKENPTkZJR19TTkRfUzNDMjRYWF9JMlMpICs9IHNuZC1zb2MtczNjMjR4eC1pMnMubworb2JqLSQoQ09ORklHX1NORF9TQU1TVU5HX0FDOTcpICs9IHNuZC1zb2MtYWM5Ny5vCitvYmotJChDT05GSUdfU05EX1MzQzI0MTJfU09DX0kyUykgKz0gc25kLXNvYy1zM2MyNDEyLWkycy5vCitvYmotJChDT05GSUdfU05EX1MzQ19JMlNWMl9TT0MpICs9IHNuZC1zb2MtczNjLWkycy12Mi5vCitvYmotJChDT05GSUdfU05EX1NBTVNVTkdfU1BESUYpICs9IHNuZC1zb2Mtc2Ftc3VuZy1zcGRpZi5vCitvYmotJChDT05GSUdfU05EX1NBTVNVTkdfUENNKSArPSBzbmQtc29jLXBjbS5vCitvYmotJChDT05GSUdfU05EX1NBTVNVTkdfSTJTKSArPSBzbmQtc29jLWkycy5vCisKKyMgUzNDMjRYWCBNYWNoaW5lIFN1cHBvcnQKK3NuZC1zb2Mtaml2ZS13bTg3NTAtb2JqcyA6PSBqaXZlX3dtODc1MC5vCitzbmQtc29jLW5lbzE5NzMtd204NzUzLW9ianMgOj0gbmVvMTk3M193bTg3NTMubworc25kLXNvYy1uZW8xOTczLWd0YTAyLXdtODc1My1vYmpzIDo9IG5lbzE5NzNfZ3RhMDJfd204NzUzLm8KK3NuZC1zb2Mtc21kazI0NDMtd205NzEwLW9ianMgOj0gc21kazI0NDNfd205NzEwLm8KK3NuZC1zb2MtbG4yNDQwc2JjLWFsYzY1MC1vYmpzIDo9IGxuMjQ0MHNiY19hbGM2NTAubworc25kLXNvYy1zM2MyNHh4LXVkYTEzNHgtb2JqcyA6PSBzM2MyNHh4X3VkYTEzNHgubworc25kLXNvYy1zM2MyNHh4LXNpbXRlYy1vYmpzIDo9IHMzYzI0eHhfc2ltdGVjLm8KK3NuZC1zb2MtczNjMjR4eC1zaW10ZWMtaGVybWVzLW9ianMgOj0gczNjMjR4eF9zaW10ZWNfaGVybWVzLm8KK3NuZC1zb2MtczNjMjR4eC1zaW10ZWMtdGx2MzIwYWljMjMtb2JqcyA6PSBzM2MyNHh4X3NpbXRlY190bHYzMjBhaWMyMy5vCitzbmQtc29jLWgxOTQwLXVkYTEzODAtb2JqcyA6PSBoMTk0MF91ZGExMzgwLm8KK3NuZC1zb2MtcngxOTUwLXVkYTEzODAtb2JqcyA6PSByeDE5NTBfdWRhMTM4MC5vCitzbmQtc29jLXNtZGstd204NTgwLW9ianMgOj0gc21ka193bTg1ODAubworc25kLXNvYy1zbWRrLXdtODk5NC1vYmpzIDo9IHNtZGtfd204OTk0Lm8KK3NuZC1zb2Mtc21kay13bTk3MTMtb2JqcyA6PSBzbWRrX3dtOTcxMy5vCitzbmQtc29jLXMzYzY0eHgtc21hcnRxLXdtODk4Ny1vYmpzIDo9IHNtYXJ0cV93bTg5ODcubworc25kLXNvYy1nb25pLXdtODk5NC1vYmpzIDo9IGdvbmlfd204OTk0Lm8KK3NuZC1zb2Mtc21kay1zcGRpZi1vYmpzIDo9IHNtZGtfc3BkaWYubworCitvYmotJChDT05GSUdfU05EX1NPQ19TQU1TVU5HX0pJVkVfV004NzUwKSArPSBzbmQtc29jLWppdmUtd204NzUwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfTkVPMTk3M19XTTg3NTMpICs9IHNuZC1zb2MtbmVvMTk3My13bTg3NTMubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19ORU8xOTczX0dUQTAyX1dNODc1MykgKz0gc25kLXNvYy1uZW8xOTczLWd0YTAyLXdtODc1My5vCitvYmotJChDT05GSUdfU05EX1NPQ19TQU1TVU5HX1NNREsyNDQzX1dNOTcxMCkgKz0gc25kLXNvYy1zbWRrMjQ0My13bTk3MTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19MTjI0NDBTQkNfQUxDNjUwKSArPSBzbmQtc29jLWxuMjQ0MHNiYy1hbGM2NTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19TM0MyNFhYX1VEQTEzNFgpICs9IHNuZC1zb2MtczNjMjR4eC11ZGExMzR4Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfU0lNVEVDKSArPSBzbmQtc29jLXMzYzI0eHgtc2ltdGVjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfU0lNVEVDX0hFUk1FUykgKz0gc25kLXNvYy1zM2MyNHh4LXNpbXRlYy1oZXJtZXMubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19TSU1URUNfVExWMzIwQUlDMjMpICs9IHNuZC1zb2MtczNjMjR4eC1zaW10ZWMtdGx2MzIwYWljMjMubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19IMTk0MF9VREExMzgwKSArPSBzbmQtc29jLWgxOTQwLXVkYTEzODAubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19SWDE5NTBfVURBMTM4MCkgKz0gc25kLXNvYy1yeDE5NTAtdWRhMTM4MC5vCitvYmotJChDT05GSUdfU05EX1NPQ19TQU1TVU5HX1NNREtfV004NTgwKSArPSBzbmQtc29jLXNtZGstd204NTgwLm8KK29iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfU01ES19XTTg5OTQpICs9IHNuZC1zb2Mtc21kay13bTg5OTQubworb2JqLSQoQ09ORklHX1NORF9TT0NfU0FNU1VOR19TTURLX1dNOTcxMykgKz0gc25kLXNvYy1zbWRrLXdtOTcxMy5vCitvYmotJChDT05GSUdfU05EX1NPQ19TTUFSVFEpICs9IHNuZC1zb2MtczNjNjR4eC1zbWFydHEtd204OTg3Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1NBTVNVTkdfU01ES19TUERJRikgKz0gc25kLXNvYy1zbWRrLXNwZGlmLm8KK29iai0kKENPTkZJR19TTkRfU09DX0dPTklfQVFVSUxBX1dNODk5NCkgKz0gc25kLXNvYy1nb25pLXdtODk5NC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MtYWM5Ny5jIGIvc291bmQvc29jL3NhbXN1bmcvYWM5Ny5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1hYzk3LmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwppbmRleCBmODkxZWI3Li40NzcwYTk1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1hYzk3LmMKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwogICoKICAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gUzNDIEFDOTcgQ29udHJvbGxlciBkcml2ZXIKICAqIAlFdm9sdmVkIGZyb20gczNjMjQ0My1hYzk3LmMKQEAgLTI0LDggKzI0LDggQEAKICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogI2luY2x1ZGUgPHBsYXQvYXVkaW8uaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKLSNpbmNsdWRlICJzM2MtYWM5Ny5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImFjOTcuaCIKIAogI2RlZmluZSBBQ19DTURfQUREUih4KSAoeCA8PCAxNikKICNkZWZpbmUgQUNfQ01EX0RBVEEoeCkgKHggJiAweGZmZmYpCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlkYXRhID0gKHN0YXQgJiAweGZmZmYpOwogCiAJaWYgKGFkZHIgIT0gcmVnKQotCQlwcl9lcnIoInMzYy1hYzk3OiByZXEgYWRkciA9ICUwMngsIHJlcCBhZGRyID0gJTAyeFxuIiwKKwkJcHJfZXJyKCJhYzk3OiByZXEgYWRkciA9ICUwMngsIHJlcCBhZGRyID0gJTAyeFxuIiwKIAkJCXJlZywgYWRkcik7CiAKIAltdXRleF91bmxvY2soJnMzY19hYzk3LmxvY2spOwpAQCAtMzM0LDcgKzMzNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHMzY19hYzk3X2RhaVtdID0gewogCVtTM0NfQUM5N19EQUlfUENNXSA9IHsKLQkJLm5hbWUgPQkiczNjLWFjOTciLAorCQkubmFtZSA9CSJzYW1zdW5nLWFjOTciLAogCQkuYWM5N19jb250cm9sID0gMSwKIAkJLnBsYXliYWNrID0gewogCQkJLnN0cmVhbV9uYW1lID0gIkFDOTcgUGxheWJhY2siLApAQCAtMzUxLDcgKzM1MSw3IEBACiAJCS5vcHMgPSAmczNjX2FjOTdfZGFpX29wcywKIAl9LAogCVtTM0NfQUM5N19EQUlfTUlDXSA9IHsKLQkJLm5hbWUgPSAiczNjLWFjOTctbWljIiwKKwkJLm5hbWUgPSAic2Ftc3VuZy1hYzk3LW1pYyIsCiAJCS5hYzk3X2NvbnRyb2wgPSAxLAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZSA9ICJBQzk3IE1pYyBDYXB0dXJlIiwKQEAgLTQwNyw3ICs0MDcsNyBAQAogCX0KIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9yZXMtPnN0YXJ0LAotCQkJCXJlc291cmNlX3NpemUobWVtX3JlcyksICJzM2MtYWM5NyIpKSB7CisJCQkJcmVzb3VyY2Vfc2l6ZShtZW1fcmVzKSwgImFjOTciKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCByZWdpc3RlciByZWdpb25cbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTQzMSw3ICs0MzEsNyBAQAogCiAJczNjX2FjOTcuYWM5N19jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJhYzk3Iik7CiAJaWYgKElTX0VSUihzM2NfYWM5Ny5hYzk3X2NsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiczNjLWFjOTcgZmFpbGVkIHRvIGdldCBhYzk3X2Nsb2NrXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWM5NyBmYWlsZWQgdG8gZ2V0IGFjOTdfY2xvY2tcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjI7CiAJfQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJcmV0ID0gcmVxdWVzdF9pcnEoaXJxX3Jlcy0+c3RhcnQsIHMzY19hYzk3X2lycSwKIAkJCQkJSVJRRl9ESVNBQkxFRCwgIkFDOTciLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzM2MtYWM5NzogaW50ZXJydXB0IHJlcXVlc3QgZmFpbGVkLlxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFjOTc6IGludGVycnVwdCByZXF1ZXN0IGZhaWxlZC5cbiIpOwogCQlnb3RvIGVycjQ7CiAJfQogCkBAIC00OTcsNyArNDk3LDcgQEAKIAkucHJvYmUgID0gczNjX2FjOTdfcHJvYmUsCiAJLnJlbW92ZSA9IHMzY19hYzk3X3JlbW92ZSwKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzM2MtYWM5NyIsCisJCS5uYW1lID0gInNhbXN1bmctYWM5NyIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiB9OwpAQCAtNTE3LDQgKzUxNyw0IEBACiBNT0RVTEVfQVVUSE9SKCJKYXN3aW5kZXIgU2luZ2gsIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBQzk3IGRyaXZlciBmb3IgdGhlIFNhbXN1bmcgU29DIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOnMzYy1hYzk3Iik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNhbXN1bmctYWM5NyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjLWFjOTcuaCBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuaApzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MtYWM5Ny5oCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmgKaW5kZXggNWRjZWRkMC4uMGQwZTFiNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjLWFjOTcuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmgKQEAgLTEsMTEgKzEsMTEgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1hYzk3LmgKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL2FjOTcuaAogICoKICAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gUzNDIEFDOTcgQ29udHJvbGxlciBkcml2ZXIKLSAqIAlFdm9sdmVkIGZyb20gczNjMjQ0My1hYzk3LmgKKyAqCUV2b2x2ZWQgZnJvbSBzM2MyNDQzLWFjOTcuaAogICoKICAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMdGQKLSAqIAlBdXRob3I6IEphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KLSAqIAlDcmVkaXRzOiBHcmFlbWUgR3JlZ29yeSwgU2VhbiBDaG9pCisgKglBdXRob3I6IEphc3dpbmRlciBTaW5naCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4KKyAqCUNyZWRpdHM6IEdyYWVtZSBHcmVnb3J5LCBTZWFuIENob2kKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYy1kbWEuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1kbWEuYwpyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvZG1hLmMKaW5kZXggMjQzZjc5Yi4uMjEyNDAxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjLWRtYS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHMzYy1kbWEuYyAgLS0gIEFMU0EgU29jIEF1ZGlvIExheWVyCisgKiBkbWEuYyAgLS0gIEFMU0EgU29jIEF1ZGlvIExheWVyCiAgKgogICogKGMpIDIwMDYgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KICAqIEdyYWVtZSBHcmVnb3J5IGdyYWVtZS5ncmVnb3J5QHdvbGZzb25taWNyby5jb20gb3IgbGludXhAd29sZnNvbm1pY3JvLmNvbQpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2RtYS5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgczNjX2RtYV9oYXJkd2FyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBkbWFfaGFyZHdhcmUgPSB7CiAJLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKIAkJCQkgICAgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQkJCSAgICBTTkRSVl9QQ01fSU5GT19NTUFQIHwKQEAgLTUzLDcgKzUzLDcgQEAKIAkuZmlmb19zaXplCQk9IDMyLAogfTsKIAotc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhIHsKK3N0cnVjdCBydW50aW1lX2RhdGEgewogCXNwaW5sb2NrX3QgbG9jazsKIAlpbnQgc3RhdGU7CiAJdW5zaWduZWQgaW50IGRtYV9sb2FkZWQ7CkBAIC02NSwxNCArNjUsMTQgQEAKIAlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgKnBhcmFtczsKIH07CiAKLS8qIHMzY19kbWFfZW5xdWV1ZQorLyogZG1hX2VucXVldWUKICAqCiAgKiBwbGFjZSBhIGRtYSBidWZmZXIgb250byB0aGUgcXVldWUgZm9yIHRoZSBkbWEgc3lzdGVtCiAgKiB0byBoYW5kbGUuCiAqLwotc3RhdGljIHZvaWQgczNjX2RtYV9lbnF1ZXVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIHZvaWQgZG1hX2VucXVldWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWRtYV9hZGRyX3QgcG9zID0gcHJ0ZC0+ZG1hX3BvczsKIAl1bnNpZ25lZCBpbnQgbGltaXQ7CiAJaW50IHJldDsKQEAgLTExMiwxMiArMTEyLDEyIEBACiAJcHJ0ZC0+ZG1hX3BvcyA9IHBvczsKIH0KIAotc3RhdGljIHZvaWQgczNjMjR4eF9hdWRpb19idWZmZG9uZShzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbm5lbCwKK3N0YXRpYyB2b2lkIGF1ZGlvX2J1ZmZkb25lKHN0cnVjdCBzM2MyNDEwX2RtYV9jaGFuICpjaGFubmVsLAogCQkJCXZvaWQgKmRldl9pZCwgaW50IHNpemUsCiAJCQkJZW51bSBzM2MyNDEwX2RtYV9idWZmcmVzdWx0IHJlc3VsdCkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRldl9pZDsKLQlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQ7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZDsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTEzMiwxNyArMTMyLDE3IEBACiAJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKIAlpZiAocHJ0ZC0+c3RhdGUgJiBTVF9SVU5OSU5HICYmICFzM2NfZG1hX2hhc19jaXJjdWxhcigpKSB7CiAJCXBydGQtPmRtYV9sb2FkZWQtLTsKLQkJczNjX2RtYV9lbnF1ZXVlKHN1YnN0cmVhbSk7CisJCWRtYV9lbnF1ZXVlKHN1YnN0cmVhbSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IHMzY19kbWFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBkbWFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgdG90Ynl0ZXMgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7CiAJc3RydWN0IHMzY19kbWFfcGFyYW1zICpkbWEgPQpAQCAtMTgxLDcgKzE4MSw3IEBACiAJfQogCiAJczNjMjQxMF9kbWFfc2V0X2J1ZmZkb25lX2ZuKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKLQkJCQkgICAgczNjMjR4eF9hdWRpb19idWZmZG9uZSk7CisJCQkJICAgIGF1ZGlvX2J1ZmZkb25lKTsKIAogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcik7CiAKQEAgLTE5OSw5ICsxOTksOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHMzY19kbWFfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3N0YXRpYyBpbnQgZG1hX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtMjE2LDkgKzIxNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczNjX2RtYV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBkbWFfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldCA9IDA7CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwpAQCAtMjQ5LDE0ICsyNDksMTQgQEAKIAlwcnRkLT5kbWFfcG9zID0gcHJ0ZC0+ZG1hX3N0YXJ0OwogCiAJLyogZW5xdWV1ZSBkbWEgYnVmZmVycyAqLwotCXMzY19kbWFfZW5xdWV1ZShzdWJzdHJlYW0pOworCWRtYV9lbnF1ZXVlKHN1YnN0cmVhbSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHMzY19kbWFfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3N0YXRpYyBpbnQgZG1hX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCiB7Ci0Jc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQgPSAwOwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKQEAgLTI4OSwxMCArMjg5LDEwIEBACiB9CiAKIHN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAotczNjX2RtYV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorZG1hX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHJlczsKIAlkbWFfYWRkcl90IHNyYywgZHN0OwogCkBAIC0zMjQsMTcgKzMyNCwxNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCByZXMpOwogfQogCi1zdGF0aWMgaW50IHMzY19kbWFfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3N0YXRpYyBpbnQgZG1hX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQ7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZDsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7Ci0Jc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZzM2NfZG1hX2hhcmR3YXJlKTsKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJmRtYV9oYXJkd2FyZSk7CiAKLQlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydW50aW1lX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAocHJ0ZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzQ0LDIyICszNDQsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzM2NfZG1hX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBkbWFfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJ1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIXBydGQpCi0JCXByX2RlYnVnKCJzM2NfZG1hX2Nsb3NlIGNhbGxlZCB3aXRoIHBydGQgPT0gTlVMTFxuIik7CisJCXByX2RlYnVnKCJkbWFfY2xvc2UgY2FsbGVkIHdpdGggcHJ0ZCA9PSBOVUxMXG4iKTsKIAogCWtmcmVlKHBydGQpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczNjX2RtYV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBkbWFfbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtMzcyLDIzICszNzIsMjMgQEAKIAkJCQkgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgczNjX2RtYV9vcHMgPSB7Ci0JLm9wZW4JCT0gczNjX2RtYV9vcGVuLAotCS5jbG9zZQkJPSBzM2NfZG1hX2Nsb3NlLAorc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBkbWFfb3BzID0geworCS5vcGVuCQk9IGRtYV9vcGVuLAorCS5jbG9zZQkJPSBkbWFfY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMJPSBzM2NfZG1hX2h3X3BhcmFtcywKLQkuaHdfZnJlZQk9IHMzY19kbWFfaHdfZnJlZSwKLQkucHJlcGFyZQk9IHMzY19kbWFfcHJlcGFyZSwKLQkudHJpZ2dlcgk9IHMzY19kbWFfdHJpZ2dlciwKLQkucG9pbnRlcgk9IHMzY19kbWFfcG9pbnRlciwKLQkubW1hcAkJPSBzM2NfZG1hX21tYXAsCisJLmh3X3BhcmFtcwk9IGRtYV9od19wYXJhbXMsCisJLmh3X2ZyZWUJPSBkbWFfaHdfZnJlZSwKKwkucHJlcGFyZQk9IGRtYV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gZG1hX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBkbWFfcG9pbnRlciwKKwkubW1hcAkJPSBkbWFfbW1hcCwKIH07CiAKLXN0YXRpYyBpbnQgczNjX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSkKK3N0YXRpYyBpbnQgcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKQogewogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOwogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQlzaXplX3Qgc2l6ZSA9IHMzY19kbWFfaGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKwlzaXplX3Qgc2l6ZSA9IGRtYV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4OwogCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtNDAzLDcgKzQwMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHMzY19kbWFfZnJlZV9kbWFfYnVmZmVycyhzdHJ1Y3Qgc25kX3BjbSAqcGNtKQorc3RhdGljIHZvaWQgZG1hX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKQEAgLTQyNiw5ICs0MjYsOSBAQAogCX0KIH0KIAotc3RhdGljIHU2NCBzM2NfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworc3RhdGljIHU2NCBkbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAKLXN0YXRpYyBpbnQgczNjX2RtYV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorc3RhdGljIGludCBkbWFfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgc3RydWN0IHNuZF9wY20gKnBjbSkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTQzNiw2NyArNDM2LDY3IEBACiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmICghY2FyZC0+ZGV2LT5kbWFfbWFzaykKLQkJY2FyZC0+ZGV2LT5kbWFfbWFzayA9ICZzM2NfZG1hX21hc2s7CisJCWNhcmQtPmRldi0+ZG1hX21hc2sgPSAmZG1hX21hc2s7CiAJaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQogCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZjsKIAogCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7Ci0JCXJldCA9IHMzY19wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJcmV0ID0gcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCiAJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCX0KIAogCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5jaGFubmVsc19taW4pIHsKLQkJcmV0ID0gczNjX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQlyZXQgPSBwcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKIAkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIAl9Ci0gb3V0Ogorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9zb2NfcGxhdGZvcm0gPSB7Ci0JLm9wcwkJPSAmczNjX2RtYV9vcHMsCi0JLnBjbV9uZXcJPSBzM2NfZG1hX25ldywKLQkucGNtX2ZyZWUJPSBzM2NfZG1hX2ZyZWVfZG1hX2J1ZmZlcnMsCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfYXNvY19wbGF0Zm9ybSA9IHsKKwkub3BzCQk9ICZkbWFfb3BzLAorCS5wY21fbmV3CT0gZG1hX25ldywKKwkucGNtX2ZyZWUJPSBkbWFfZnJlZV9kbWFfYnVmZmVycywKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHMzYzI0eHhfc29jX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzYW1zdW5nX2Fzb2NfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmczNjMjR4eF9zb2NfcGxhdGZvcm0pOworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzYW1zdW5nX2Fzb2NfcGxhdGZvcm0pOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzM2MyNHh4X3NvY19wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNhbXN1bmdfYXNvY19wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0eHhfcGNtX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzb2NfZG1hX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJCS5uYW1lID0gInNhbXN1bmctYXVkaW8iLAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogCi0JLnByb2JlID0gczNjMjR4eF9zb2NfcGxhdGZvcm1fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMzYzI0eHhfc29jX3BsYXRmb3JtX3JlbW92ZSksCisJLnByb2JlID0gc2Ftc3VuZ19hc29jX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzYW1zdW5nX2Fzb2NfcGxhdGZvcm1fcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNuZF9zM2MyNHh4X3BjbV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBzYW1zdW5nX2Fzb2NfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnMzYzI0eHhfcGNtX2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXNvY19kbWFfZHJpdmVyKTsKIH0KLW1vZHVsZV9pbml0KHNuZF9zM2MyNHh4X3BjbV9pbml0KTsKK21vZHVsZV9pbml0KHNhbXN1bmdfYXNvY19pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IHNuZF9zM2MyNHh4X3BjbV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Ftc3VuZ19hc29jX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjMjR4eF9wY21fZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXNvY19kbWFfZHJpdmVyKTsKIH0KLW1vZHVsZV9leGl0KHNuZF9zM2MyNHh4X3BjbV9leGl0KTsKK21vZHVsZV9leGl0KHNhbXN1bmdfYXNvY19leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzLCA8YmVuQHNpbXRlYy5jby51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTM0MgQXVkaW8gRE1BIG1vZHVsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIEFTb0MgRE1BIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzM2MyNHh4LXBjbS1hdWRpbyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzYW1zdW5nLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MtZG1hLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MtZG1hLmgKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL2RtYS5oCmluZGV4IDc0OGMwN2QuLmY4Y2QyYjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYy1kbWEuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgczNjLWRtYS5oIC0tCisgKiAgZG1hLmggLS0KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9nb25pX3dtODk5NC5jIGIvc291bmQvc29jL3NhbXN1bmcvZ29uaV93bTg5OTQuYwpzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9nb25pX3dtODk5NC5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9nb25pX3dtODk5NC5jCmluZGV4IDY5NGY3MDIuLjM0ZGQ5ZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L2dvbmlfd204OTk0LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvZ29uaV93bTg5OTQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KQEAgLTI1LDggKzI0LDE2IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3dtODk5NC9yZWdpc3RlcnMuaD4KICNpbmNsdWRlICIuLi9jb2RlY3Mvd204OTk0LmgiCi0jaW5jbHVkZSAiczNjLWRtYS5oIgotI2luY2x1ZGUgInMzYzY0eHgtaTJzLmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiaTJzLmgiCisKKyNkZWZpbmUgTUFDSElORV9OQU1FCTAKKyNkZWZpbmUgQ1BVX1ZPSUNFX0RBSQkxCisKK3N0YXRpYyBjb25zdCBjaGFyICphcXVpbGFfc3RyW10gPSB7CisJW01BQ0hJTkVfTkFNRV0gPSAiYXF1aWxhIiwKKwlbQ1BVX1ZPSUNFX0RBSV0gPSAiYXF1aWxhLXZvaWNlLWRhaSIsCit9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBnb25pOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdvbmlfc25kX2RldmljZTsKQEAgLTk3LDI4ICsxMDQsMzQgQEAKIHN0YXRpYyBpbnQgZ29uaV93bTg5OTRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCByZXQ7CiAKIAkvKiBhZGQgZ29uaSBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgZ29uaV9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBnb25pX2RhcG1fd2lkZ2V0cywKIAkJCUFSUkFZX1NJWkUoZ29uaV9kYXBtX3dpZGdldHMpKTsKIAogCS8qIHNldCB1cCBnb25pIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBnb25pX2RhcG1fcm91dGVzLAorCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGdvbmlfZGFwbV9yb3V0ZXMsCiAJCQlBUlJBWV9TSVpFKGdvbmlfZGFwbV9yb3V0ZXMpKTsKIAogCS8qIHNldCBlbmRwb2ludHMgdG8gbm90IGNvbm5lY3RlZCAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJJTjJMUDpWWFJOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIklOMlJQOlZYUlAiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORU9VVDFOIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkVPVVQxUCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5FT1VUMk4iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElORU9VVDJQIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSU4yTFA6VlhSTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIklOMlJQOlZYUlAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUMU4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUMVAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUMk4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FT1VUMlAiKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlpZiAobWFjaGluZV9pc19hcXVpbGEoKSkgeworCQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJTUEtPVVRSTiIpOworCQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJTUEtPVVRSUCIpOworCX0KKworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJLyogSGVhZHNldCBqYWNrIGRldGVjdGlvbiAqLwotCXJldCA9IHNuZF9zb2NfamFja19uZXcoJmdvbmksICJIZWFkc2V0IEphY2siLAorCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkc2V0IEphY2siLAogCQkJU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX01FQ0hBTklDQUwgfCBTTkRfSkFDS19BVk9VVCwKIAkJCSZqYWNrKTsKIAlpZiAocmV0KQpAQCAtMTUwLDEyICsxNjMsNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogc2V0IHRoZSBjcHUgc3lzdGVtIGNsb2NrICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCBTM0M2NFhYX0NMS1NSQ19QQ0xLLAotCQkJMCwgU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBzZXQgY29kZWMgREFJIGNvbmZpZ3VyYXRpb24gKi8KIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKIAkJCVNORF9TT0NfREFJRk1UX05CX05GIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CkBAIC0yMzYsOSArMjQzLDkgQEAKIHsKIAkubmFtZSA9ICJXTTg5OTQiLAogCS5zdHJlYW1fbmFtZSA9ICJXTTg5OTQgSGlGaSIsCi0JLmNwdV9kYWlfbmFtZSA9ICJzM2M2NHh4LWkycy12NCIsCisJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLWkycy4wIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204OTk0LWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lID0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKIAkuY29kZWNfbmFtZSA9ICJ3bTg5OTQtY29kZWMuMC0weDFhIiwKIAkuaW5pdCA9IGdvbmlfd204OTk0X2luaXQsCiAJLm9wcyA9ICZnb25pX2hpZmlfb3BzLApAQCAtMjQ3LDcgKzI1NCw3IEBACiAJLnN0cmVhbV9uYW1lID0gIlZvaWNlIiwKIAkuY3B1X2RhaV9uYW1lID0gImdvbmktdm9pY2UtZGFpIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204OTk0LXZvaWNlIiwKLQkucGxhdGZvcm1fbmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCiAJLmNvZGVjX25hbWUgPSAid204OTk0LWNvZGVjLjAtMHgxYSIsCiAJLm9wcyA9ICZnb25pX3ZvaWNlX29wcywKIH0sCkBAIC0yNjMsNyArMjcwLDExIEBACiB7CiAJaW50IHJldDsKIAotCWlmICghbWFjaGluZV9pc19nb25pKCkpCisJaWYgKG1hY2hpbmVfaXNfYXF1aWxhKCkpIHsKKwkJdm9pY2VfZGFpLm5hbWUgPSBhcXVpbGFfc3RyW0NQVV9WT0lDRV9EQUldOworCQlnb25pX2RhaVsxXS5jcHVfZGFpX25hbWUgPSBhcXVpbGFfc3RyW0NQVV9WT0lDRV9EQUldOworCQlnb25pLm5hbWUgPSBhcXVpbGFfc3RyW01BQ0hJTkVfTkFNRV07CisJfSBlbHNlIGlmICghbWFjaGluZV9pc19nb25pKCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJZ29uaV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CkBAIC0yNzIsMjAgKzI4MywyNSBAQAogCiAJLyogcmVnaXN0ZXIgdm9pY2UgREFJIGhlcmUgKi8KIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaSgmZ29uaV9zbmRfZGV2aWNlLT5kZXYsICZ2b2ljZV9kYWkpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGdvbmlfc25kX2RldmljZSk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZ29uaV9zbmRfZGV2aWNlLCAmZ29uaSk7CiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChnb25pX3NuZF9kZXZpY2UpOwogCi0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCXNuZF9zb2NfdW5yZWdpc3Rlcl9kYWkoJmdvbmlfc25kX2RldmljZS0+ZGV2KTsKIAkJcGxhdGZvcm1fZGV2aWNlX3B1dChnb25pX3NuZF9kZXZpY2UpOworCX0KIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBnb25pX2V4aXQodm9pZCkKIHsKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZnb25pX3NuZF9kZXZpY2UtPmRldik7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ29uaV9zbmRfZGV2aWNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWY3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBoMTk0MC11ZGExMzgwLmMgIC0tICBBTFNBIFNvYyBBdWRpbyBMYXllcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBcm5hdWQgUGF0YXJkIDxhcm5hdWQucGF0YXJkQHJ0cC1uZXQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDEwIFZhc2lseSBLaG9ydXpoaWNrIDxhbmFyc291bEBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gdmVyc2lvbiBmcm9tIEFybmF1ZCBQYXRhcmQgPGFybmF1ZC5wYXRhcmRAcnRwLW5ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvdWRhMTM4MC5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKworI2luY2x1ZGUgPHBsYXQvcmVncy1paXMuaD4KKworI2luY2x1ZGUgPG1hY2gvaDE5NDAtbGF0Y2guaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJzM2MyNHh4LWkycy5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy91ZGExMzgwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHsKKwkxMTAyNSwKKwkyMjA1MCwKKwk0NDEwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgaHdfcmF0ZXMgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlcyksCisJLmxpc3QgPSByYXRlcywKKwkubWFzayA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBocF9qYWNrOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19waW4gaHBfamFja19waW5zW10gPSB7CisJeworCQkucGluCT0gIkhlYWRwaG9uZSBKYWNrIiwKKwkJLm1hc2sJPSBTTkRfSkFDS19IRUFEUEhPTkUsCisJfSwKKwl7CisJCS5waW4JPSAiU3BlYWtlciIsCisJCS5tYXNrCT0gU05EX0pBQ0tfSEVBRFBIT05FLAorCQkuaW52ZXJ0CT0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfZ3BpbyBocF9qYWNrX2dwaW9zW10gPSB7CisJeworCQkuZ3BpbwkJCT0gUzNDMjQxMF9HUEcoNCksCisJCS5uYW1lCQkJPSAiaHAtZ3BpbyIsCisJCS5yZXBvcnQJCQk9IFNORF9KQUNLX0hFQURQSE9ORSwKKwkJLmludmVydAkJCT0gMSwKKwkJLmRlYm91bmNlX3RpbWUJCT0gMjAwLAorCX0sCit9OworCitzdGF0aWMgaW50IGgxOTQwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXJ1bnRpbWUtPmh3LnJhdGVfbWluID0gaHdfcmF0ZXMubGlzdFswXTsKKwlydW50aW1lLT5ody5yYXRlX21heCA9IGh3X3JhdGVzLmxpc3RbaHdfcmF0ZXMuY291bnQgLSAxXTsKKwlydW50aW1lLT5ody5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1Q7CisKKwlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKKwkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJCSZod19yYXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgaDE5NDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgZGl2OworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAxMTAyNToKKwljYXNlIDIyMDUwOgorCWNhc2UgNDQxMDA6CisJCWRpdiA9IHMzYzI0eHhfaTJzX2dldF9jbG9ja3JhdGUoKSAvICgzODQgKiByYXRlKTsKKwkJaWYgKHMzYzI0eHhfaTJzX2dldF9jbG9ja3JhdGUoKSAlICgzODQgKiByYXRlKSA+ICgxOTIgKiByYXRlKSkKKwkJCWRpdisrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZydGQtPmRldiwgIiVzOiByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlfX2Z1bmNfXywgcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHNldCBjb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMgfAorCQlTTkRfU09DX0RBSUZNVF9OQl9ORiB8IFNORF9TT0NfREFJRk1UX0NCU19DRlMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGNwdSBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY3B1X2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTIHwKKwkJU05EX1NPQ19EQUlGTVRfTkJfTkYgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNlbGVjdCBjbG9jayBzb3VyY2UgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIFMzQzI0WFhfQ0xLU1JDX1BDTEssIHJhdGUsCisJCQlTTkRfU09DX0NMT0NLX09VVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgTUNMSyBkaXZpc2lvbiBmb3Igc2FtcGxlIHJhdGUgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2xrZGl2KGNwdV9kYWksIFMzQzI0WFhfRElWX01DTEssCisJCVMzQzI0MTBfSUlTTU9EXzM4NEZTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCBCQ0xLIGRpdmlzaW9uIGZvciBzYW1wbGUgcmF0ZSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgUzNDMjRYWF9ESVZfQkNMSywKKwkJUzNDMjQxMF9JSVNNT0RfMzJGUyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgcHJlc2NhbGVyIGRpdmlzaW9uIGZvciBzYW1wbGUgcmF0ZSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgUzNDMjRYWF9ESVZfUFJFU0NBTEVSLAorCQlTM0MyNFhYX1BSRVNDQUxFKGRpdiwgZGl2KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBoMTk0MF9vcHMgPSB7CisJLnN0YXJ0dXAJPSBoMTk0MF9zdGFydHVwLAorCS5od19wYXJhbXMJPSBoMTk0MF9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGgxOTQwX3Nwa19wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQorCQlncGlvX3NldF92YWx1ZShIMTk0MF9MQVRDSF9BVURJT19QT1dFUiwgMSk7CisJZWxzZQorCQlncGlvX3NldF92YWx1ZShIMTk0MF9MQVRDSF9BVURJT19QT1dFUiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaDE5NDAgbWFjaGluZSBkYXBtIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB1ZGExMzgwX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIEphY2siLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBoMTk0MF9zcGtfcG93ZXIpLAorfTsKKworLyogaDE5NDAgbWFjaGluZSBhdWRpb19tYXAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcFtdID0geworCS8qIGhlYWRwaG9uZSBjb25uZWN0ZWQgdG8gVk9VVExIUCwgVk9VVFJIUCAqLworCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiVk9VVExIUCJ9LAorCXsiSGVhZHBob25lIEphY2siLCBOVUxMLCAiVk9VVFJIUCJ9LAorCisJLyogZXh0IHNwZWFrZXIgY29ubmVjdGVkIHRvIFZPVVRMLCBWT1VUUiAgKi8KKwl7IlNwZWFrZXIiLCBOVUxMLCAiVk9VVEwifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiVk9VVFIifSwKKworCS8qIG1pYyBpcyBjb25uZWN0ZWQgdG8gVklOTSAqLworCXsiVklOTSIsIE5VTEwsICJNaWMgSmFjayJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfc25kX2RldmljZTsKKworc3RhdGljIGludCBoMTk0MF91ZGExMzgwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKKwlpbnQgZXJyOworCisJLyogQWRkIGgxOTQwIHNwZWNpZmljIHdpZGdldHMgKi8KKwllcnIgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHVkYTEzODBfZGFwbV93aWRnZXRzLAorCQkJCSAgQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cykpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXQgdXAgaDE5NDAgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLworCWVyciA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwKKwkJCQkgICAgICBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCisJCSZocF9qYWNrKTsKKworCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLAorCQlocF9qYWNrX3BpbnMpOworCisJc25kX3NvY19qYWNrX2FkZF9ncGlvcygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX2dwaW9zKSwKKwkJaHBfamFja19ncGlvcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogczNjMjR4eCBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBoMTk0MF91ZGExMzgwX2RhaVtdID0geworCXsKKwkJLm5hbWUJCT0gInVkYTEzODAiLAorCQkuc3RyZWFtX25hbWUJPSAiVURBMTM4MCBEdXBsZXgiLAorCQkuY3B1X2RhaV9uYW1lCT0gInMzYzI0eHgtaWlzIiwKKwkJLmNvZGVjX2RhaV9uYW1lCT0gInVkYTEzODAtaGlmaSIsCisJCS5pbml0CQk9IGgxOTQwX3VkYTEzODBfaW5pdCwKKwkJLnBsYXRmb3JtX25hbWUJPSAic2Ftc3VuZy1hdWRpbyIsCisJCS5jb2RlY19uYW1lCT0gInVkYTEzODAtY29kZWMuMC0wMDFhIiwKKwkJLm9wcwkJPSAmaDE5NDBfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBoMTk0MF9hc29jID0geworCS5uYW1lID0gImgxOTQwIiwKKwkuZGFpX2xpbmsgPSBoMTk0MF91ZGExMzgwX2RhaSwKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShoMTk0MF91ZGExMzgwX2RhaSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoMTk0MF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbWFjaGluZV9pc19oMTk0MCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNvbmZpZ3VyZSBzb21lIGdwaW9zICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KEgxOTQwX0xBVENIX0FVRElPX1BPV0VSLCAic3BlYWtlci1wb3dlciIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChIMTk0MF9MQVRDSF9BVURJT19QT1dFUiwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZ3BpbzsKKworCXMzYzI0eHhfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghczNjMjR4eF9zbmRfZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2dwaW87CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoczNjMjR4eF9zbmRfZGV2aWNlLCAmaDE5NDBfYXNvYyk7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzM2MyNHh4X3NuZF9kZXZpY2UpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJfcGxhdDsKKworCXJldHVybiAwOworCitlcnJfcGxhdDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHMzYzI0eHhfc25kX2RldmljZSk7CitlcnJfZ3BpbzoKKwlncGlvX2ZyZWUoSDE5NDBfTEFUQ0hfQVVESU9fUE9XRVIpOworCitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoMTk0MF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoczNjMjR4eF9zbmRfZGV2aWNlKTsKKwlzbmRfc29jX2phY2tfZnJlZV9ncGlvcygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX2dwaW9zKSwKKwkJaHBfamFja19ncGlvcyk7CisJZ3Bpb19mcmVlKEgxOTQwX0xBVENIX0FVRElPX1BPV0VSKTsKK30KKworbW9kdWxlX2luaXQoaDE5NDBfaW5pdCk7Cittb2R1bGVfZXhpdChoMTk0MF9leGl0KTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJBcm5hdWQgUGF0YXJkLCBWYXNpbHkgS2hvcnV6aGljayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBIMTk0MCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhYzNhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuYworICoKKyAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gU2Ftc3VuZyBJMlMgQ29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgorICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxwbGF0L2F1ZGlvLmg+CisKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJpMnMuaCIKKworI2RlZmluZSBJMlNDT04JCTB4MAorI2RlZmluZSBJMlNNT0QJCTB4NAorI2RlZmluZSBJMlNGSUMJCTB4OAorI2RlZmluZSBJMlNQU1IJCTB4YworI2RlZmluZSBJMlNUWEQJCTB4MTAKKyNkZWZpbmUgSTJTUlhECQkweDE0CisjZGVmaW5lIEkyU0ZJQ1MJCTB4MTgKKyNkZWZpbmUgSTJTVFhEUwkJMHgxYworCisjZGVmaW5lIENPTl9SU1RDTFIJCSgxIDw8IDMxKQorI2RlZmluZSBDT05fRlJYT0ZTVEFUVVMJCSgxIDw8IDI2KQorI2RlZmluZSBDT05fRlJYT1JJTlRFTgkJKDEgPDwgMjUpCisjZGVmaW5lIENPTl9GVFhTVVJTVEFUCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ09OX0ZUWFNVUklOVEVOCQkoMSA8PCAyMykKKyNkZWZpbmUgQ09OX1RYU0RNQV9QQVVTRQkoMSA8PCAyMCkKKyNkZWZpbmUgQ09OX1RYU0RNQV9BQ1RJVkUJKDEgPDwgMTgpCisKKyNkZWZpbmUgQ09OX0ZUWFVSU1RBVFVTCQkoMSA8PCAxNykKKyNkZWZpbmUgQ09OX0ZUWFVSSU5URU4JCSgxIDw8IDE2KQorI2RlZmluZSBDT05fVFhGSUZPMl9FTVBUWQkoMSA8PCAxNSkKKyNkZWZpbmUgQ09OX1RYRklGTzFfRU1QVFkJKDEgPDwgMTQpCisjZGVmaW5lIENPTl9UWEZJRk8yX0ZVTEwJKDEgPDwgMTMpCisjZGVmaW5lIENPTl9UWEZJRk8xX0ZVTEwJKDEgPDwgMTIpCisKKyNkZWZpbmUgQ09OX0xSSU5ERVgJCSgxIDw8IDExKQorI2RlZmluZSBDT05fVFhGSUZPX0VNUFRZCSgxIDw8IDEwKQorI2RlZmluZSBDT05fUlhGSUZPX0VNUFRZCSgxIDw8IDkpCisjZGVmaW5lIENPTl9UWEZJRk9fRlVMTAkJKDEgPDwgOCkKKyNkZWZpbmUgQ09OX1JYRklGT19GVUxMCQkoMSA8PCA3KQorI2RlZmluZSBDT05fVFhETUFfUEFVU0UJCSgxIDw8IDYpCisjZGVmaW5lIENPTl9SWERNQV9QQVVTRQkJKDEgPDwgNSkKKyNkZWZpbmUgQ09OX1RYQ0hfUEFVU0UJCSgxIDw8IDQpCisjZGVmaW5lIENPTl9SWENIX1BBVVNFCQkoMSA8PCAzKQorI2RlZmluZSBDT05fVFhETUFfQUNUSVZFCSgxIDw8IDIpCisjZGVmaW5lIENPTl9SWERNQV9BQ1RJVkUJKDEgPDwgMSkKKyNkZWZpbmUgQ09OX0FDVElWRQkJKDEgPDwgMCkKKworI2RlZmluZSBNT0RfT1BDTEtfQ0RDTEtfT1VUCSgwIDw8IDMwKQorI2RlZmluZSBNT0RfT1BDTEtfQ0RDTEtfSU4JKDEgPDwgMzApCisjZGVmaW5lIE1PRF9PUENMS19CQ0xLX09VVAkoMiA8PCAzMCkKKyNkZWZpbmUgTU9EX09QQ0xLX1BDTEsJCSgzIDw8IDMwKQorI2RlZmluZSBNT0RfT1BDTEtfTUFTSwkJKDMgPDwgMzApCisjZGVmaW5lIE1PRF9UWFNfSURNQQkJKDEgPDwgMjgpIC8qIFNlY19UWEZJRk8gdXNlIEktRE1BICovCisKKyNkZWZpbmUgTU9EX0JMQ1NfU0hJRlQJMjYKKyNkZWZpbmUgTU9EX0JMQ1NfMTZCSVQJKDAgPDwgTU9EX0JMQ1NfU0hJRlQpCisjZGVmaW5lIE1PRF9CTENTXzhCSVQJKDEgPDwgTU9EX0JMQ1NfU0hJRlQpCisjZGVmaW5lIE1PRF9CTENTXzI0QklUCSgyIDw8IE1PRF9CTENTX1NISUZUKQorI2RlZmluZSBNT0RfQkxDU19NQVNLCSgzIDw8IE1PRF9CTENTX1NISUZUKQorI2RlZmluZSBNT0RfQkxDUF9TSElGVAkyNAorI2RlZmluZSBNT0RfQkxDUF8xNkJJVAkoMCA8PCBNT0RfQkxDUF9TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1BfOEJJVAkoMSA8PCBNT0RfQkxDUF9TSElGVCkKKyNkZWZpbmUgTU9EX0JMQ1BfMjRCSVQJKDIgPDwgTU9EX0JMQ1BfU0hJRlQpCisjZGVmaW5lIE1PRF9CTENQX01BU0sJKDMgPDwgTU9EX0JMQ1BfU0hJRlQpCisKKyNkZWZpbmUgTU9EX0MyRERfSEhBTEYJCSgxIDw8IDIxKSAvKiBEaXNjYXJkIEhpZ2hlci1oYWxmICovCisjZGVmaW5lIE1PRF9DMkREX0xIQUxGCQkoMSA8PCAyMCkgLyogRGlzY2FyZCBMb3dlci1oYWxmICovCisjZGVmaW5lIE1PRF9DMUREX0hIQUxGCQkoMSA8PCAxOSkKKyNkZWZpbmUgTU9EX0MxRERfTEhBTEYJCSgxIDw8IDE4KQorI2RlZmluZSBNT0RfREMyX0VOCQkoMSA8PCAxNykKKyNkZWZpbmUgTU9EX0RDMV9FTgkJKDEgPDwgMTYpCisjZGVmaW5lIE1PRF9CTENfMTZCSVQJCSgwIDw8IDEzKQorI2RlZmluZSBNT0RfQkxDXzhCSVQJCSgxIDw8IDEzKQorI2RlZmluZSBNT0RfQkxDXzI0QklUCQkoMiA8PCAxMykKKyNkZWZpbmUgTU9EX0JMQ19NQVNLCQkoMyA8PCAxMykKKworI2RlZmluZSBNT0RfSU1TX1NZU01VWAkJKDEgPDwgMTApCisjZGVmaW5lIE1PRF9TTEFWRQkJKDEgPDwgMTEpCisjZGVmaW5lIE1PRF9UWE9OTFkJCSgwIDw8IDgpCisjZGVmaW5lIE1PRF9SWE9OTFkJCSgxIDw8IDgpCisjZGVmaW5lIE1PRF9UWFJYCQkoMiA8PCA4KQorI2RlZmluZSBNT0RfTUFTSwkJKDMgPDwgOCkKKyNkZWZpbmUgTU9EX0xSX0xMT1cJCSgwIDw8IDcpCisjZGVmaW5lIE1PRF9MUl9STE9XCQkoMSA8PCA3KQorI2RlZmluZSBNT0RfU0RGX0lJUwkJKDAgPDwgNSkKKyNkZWZpbmUgTU9EX1NERl9NU0IJCSgxIDw8IDUpCisjZGVmaW5lIE1PRF9TREZfTFNCCQkoMiA8PCA1KQorI2RlZmluZSBNT0RfU0RGX01BU0sJCSgzIDw8IDUpCisjZGVmaW5lIE1PRF9SQ0xLXzI1NkZTCQkoMCA8PCAzKQorI2RlZmluZSBNT0RfUkNMS181MTJGUwkJKDEgPDwgMykKKyNkZWZpbmUgTU9EX1JDTEtfMzg0RlMJCSgyIDw8IDMpCisjZGVmaW5lIE1PRF9SQ0xLXzc2OEZTCQkoMyA8PCAzKQorI2RlZmluZSBNT0RfUkNMS19NQVNLCQkoMyA8PCAzKQorI2RlZmluZSBNT0RfQkNMS18zMkZTCQkoMCA8PCAxKQorI2RlZmluZSBNT0RfQkNMS180OEZTCQkoMSA8PCAxKQorI2RlZmluZSBNT0RfQkNMS18xNkZTCQkoMiA8PCAxKQorI2RlZmluZSBNT0RfQkNMS18yNEZTCQkoMyA8PCAxKQorI2RlZmluZSBNT0RfQkNMS19NQVNLCQkoMyA8PCAxKQorI2RlZmluZSBNT0RfOEJJVAkJKDEgPDwgMCkKKworI2RlZmluZSBNT0RfQ0RDTEtDT04JCSgxIDw8IDEyKQorCisjZGVmaW5lIFBTUl9QU1JFTgkJKDEgPDwgMTUpCisKKyNkZWZpbmUgRklDX1RYMkNPVU5UKHgpCQkoKCh4KSA+PiAgMjQpICYgMHhmKQorI2RlZmluZSBGSUNfVFgxQ09VTlQoeCkJCSgoKHgpID4+ICAxNikgJiAweGYpCisKKyNkZWZpbmUgRklDX1RYRkxVU0gJCSgxIDw8IDE1KQorI2RlZmluZSBGSUNfUlhGTFVTSAkJKDEgPDwgNykKKyNkZWZpbmUgRklDX1RYQ09VTlQoeCkJCSgoKHgpID4+ICA4KSAmIDB4ZikKKyNkZWZpbmUgRklDX1JYQ09VTlQoeCkJCSgoKHgpID4+ICAwKSAmIDB4ZikKKyNkZWZpbmUgRklDU19UWENPVU5UKHgpCQkoKCh4KSA+PiAgOCkgJiAweDdmKQorCisjZGVmaW5lIG1zZWNzX3RvX2xvb3BzKHQpIChsb29wc19wZXJfamlmZnkgLyAxMDAwICogSFogKiB0KQorCitzdHJ1Y3QgaTJzX2RhaSB7CisJLyogUGxhdGZvcm0gZGV2aWNlIGZvciB0aGlzIERBSSAqLworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJLyogSU9SRU1BUCdkIFNGUnMgKi8KKwl2b2lkIF9faW9tZW0JKmFkZHI7CisJLyogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIFNGUnMgKi8KKwl1MzIJYmFzZTsKKwkvKiBSYXRlIG9mIFJDTEsgc291cmNlIGNsb2NrICovCisJdW5zaWduZWQgbG9uZyByY2xrX3NyY3JhdGU7CisJLyogRnJhbWUgQ2xvY2sgKi8KKwl1bnNpZ25lZCBmcm1jbGs7CisJLyoKKwkgKiBTcGVjaWZpY2FsbHkgcmVxdWVzdGVkIFJDTEssQkNMSyBieSBNQUNISU5FIERyaXZlci4KKwkgKiAwIGluZGljYXRlcyBDUFUgZHJpdmVyIGlzIGZyZWUgdG8gY2hvb3NlIGFueSB2YWx1ZS4KKwkgKi8KKwl1bnNpZ25lZCByZnMsIGJmczsKKwkvKiBJMlMgQ29udHJvbGxlcidzIGNvcmUgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpjbGs7CisJLyogQ2xvY2sgZm9yIGdlbmVyYXRpbmcgSTJTIHNpZ25hbHMgKi8KKwlzdHJ1Y3QgY2xrICpvcF9jbGs7CisJLyogQXJyYXkgb2YgY2xvY2sgbmFtZXMgZm9yIG9wX2NsayAqLworCWNvbnN0IGNoYXIgKipzcmNfY2xrOworCS8qIFBvaW50ZXIgdG8gdGhlIFByaW1hcnlfRmlmbyBpZiB0aGlzIGlzIFNlY19GaWZvLCBOVUxMIG90aGVyd2lzZSAqLworCXN0cnVjdCBpMnNfZGFpICpwcmlfZGFpOworCS8qIFBvaW50ZXIgdG8gdGhlIFNlY29uZGFyeV9GaWZvIGlmIGl0IGhhcyBvbmUsIE5VTEwgb3RoZXJ3aXNlICovCisJc3RydWN0IGkyc19kYWkgKnNlY19kYWk7CisjZGVmaW5lIERBSV9PUEVORUQJKDEgPDwgMCkgLyogRGFpIGlzIG9wZW5lZCAqLworI2RlZmluZSBEQUlfTUFOQUdFUgkoMSA8PCAxKSAvKiBEYWkgaXMgdGhlIG1hbmFnZXIgKi8KKwl1bnNpZ25lZCBtb2RlOworCS8qIERyaXZlciBmb3IgdGhpcyBEQUkgKi8KKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGkyc19kYWlfZHJ2OworCS8qIERNQSBwYXJhbWV0ZXJzICovCisJc3RydWN0IHMzY19kbWFfcGFyYW1zIGRtYV9wbGF5YmFjazsKKwlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgZG1hX2NhcHR1cmU7CisJdTMyCXF1aXJrczsKKwl1MzIJc3VzcGVuZF9pMnNtb2Q7CisJdTMyCXN1c3BlbmRfaTJzY29uOworCXUzMglzdXNwZW5kX2kyc3BzcjsKK307CisKKy8qIExvY2sgZm9yIGNyb3NzIGkvZiBjaGVja3MgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKy8qIElmIHRoaXMgaXMgdGhlICdvdmVybGF5JyBzdGVyZW8gREFJICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfc2Vjb25kYXJ5KHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJcmV0dXJuIGkycy0+cHJpX2RhaSA/IHRydWUgOiBmYWxzZTsKK30KKworLyogSWYgb3BlcmF0aW5nIGluIFNvQy1TbGF2ZSBtb2RlICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfc2xhdmUoc3RydWN0IGkyc19kYWkgKmkycykKK3sKKwlyZXR1cm4gKHJlYWRsKGkycy0+YWRkciArIEkyU01PRCkgJiBNT0RfU0xBVkUpID8gdHJ1ZSA6IGZhbHNlOworfQorCisvKiBJZiB0aGlzIGludGVyZmFjZSBvZiB0aGUgY29udHJvbGxlciBpcyB0cmFuc21pdHRpbmcgZGF0YSAqLworc3RhdGljIGlubGluZSBib29sIHR4X2FjdGl2ZShzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCXUzMiBhY3RpdmU7CisKKwlpZiAoIWkycykKKwkJcmV0dXJuIGZhbHNlOworCisJYWN0aXZlID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKworCWlmIChpc19zZWNvbmRhcnkoaTJzKSkKKwkJYWN0aXZlICY9IENPTl9UWFNETUFfQUNUSVZFOworCWVsc2UKKwkJYWN0aXZlICY9IENPTl9UWERNQV9BQ1RJVkU7CisKKwlyZXR1cm4gYWN0aXZlID8gdHJ1ZSA6IGZhbHNlOworfQorCisvKiBJZiB0aGUgb3RoZXIgaW50ZXJmYWNlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRyYW5zbWl0dGluZyBkYXRhICovCitzdGF0aWMgaW5saW5lIGJvb2wgb3RoZXJfdHhfYWN0aXZlKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJc3RydWN0IGkyc19kYWkgKm90aGVyID0gaTJzLT5wcmlfZGFpID8gOiBpMnMtPnNlY19kYWk7CisKKwlyZXR1cm4gdHhfYWN0aXZlKG90aGVyKTsKK30KKworLyogSWYgYW55IGludGVyZmFjZSBvZiB0aGUgY29udHJvbGxlciBpcyB0cmFuc21pdHRpbmcgZGF0YSAqLworc3RhdGljIGlubGluZSBib29sIGFueV90eF9hY3RpdmUoc3RydWN0IGkyc19kYWkgKmkycykKK3sKKwlyZXR1cm4gdHhfYWN0aXZlKGkycykgfHwgb3RoZXJfdHhfYWN0aXZlKGkycyk7Cit9CisKKy8qIElmIHRoaXMgaW50ZXJmYWNlIG9mIHRoZSBjb250cm9sbGVyIGlzIHJlY2VpdmluZyBkYXRhICovCitzdGF0aWMgaW5saW5lIGJvb2wgcnhfYWN0aXZlKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJdTMyIGFjdGl2ZTsKKworCWlmICghaTJzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlhY3RpdmUgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNNT0QpICYgQ09OX1JYRE1BX0FDVElWRTsKKworCXJldHVybiBhY3RpdmUgPyB0cnVlIDogZmFsc2U7Cit9CisKKy8qIElmIHRoZSBvdGhlciBpbnRlcmZhY2Ugb2YgdGhlIGNvbnRyb2xsZXIgaXMgcmVjZWl2aW5nIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBvdGhlcl9yeF9hY3RpdmUoc3RydWN0IGkyc19kYWkgKmkycykKK3sKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKworCXJldHVybiByeF9hY3RpdmUob3RoZXIpOworfQorCisvKiBJZiBhbnkgaW50ZXJmYWNlIG9mIHRoZSBjb250cm9sbGVyIGlzIHJlY2VpdmluZyBkYXRhICovCitzdGF0aWMgaW5saW5lIGJvb2wgYW55X3J4X2FjdGl2ZShzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCXJldHVybiByeF9hY3RpdmUoaTJzKSB8fCBvdGhlcl9yeF9hY3RpdmUoaTJzKTsKK30KKworLyogSWYgdGhlIG90aGVyIERBSSBpcyB0cmFuc21pdHRpbmcgb3IgcmVjZWl2aW5nIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBvdGhlcl9hY3RpdmUoc3RydWN0IGkyc19kYWkgKmkycykKK3sKKwlyZXR1cm4gb3RoZXJfcnhfYWN0aXZlKGkycykgfHwgb3RoZXJfdHhfYWN0aXZlKGkycyk7Cit9CisKKy8qIElmIHRoaXMgREFJIGlzIHRyYW5zbWl0dGluZyBvciByZWNlaXZpbmcgZGF0YSAqLworc3RhdGljIGlubGluZSBib29sIHRoaXNfYWN0aXZlKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJcmV0dXJuIHR4X2FjdGl2ZShpMnMpIHx8IHJ4X2FjdGl2ZShpMnMpOworfQorCisvKiBJZiB0aGUgY29udHJvbGxlciBpcyBhY3RpdmUgYW55d2F5ICovCitzdGF0aWMgaW5saW5lIGJvb2wgYW55X2FjdGl2ZShzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCXJldHVybiB0aGlzX2FjdGl2ZShpMnMpIHx8IG90aGVyX2FjdGl2ZShpMnMpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpMnNfZGFpICp0b19pbmZvKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXJldHVybiBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfb3BlbmVkKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJaWYgKGkycyAmJiAoaTJzLT5tb2RlICYgREFJX09QRU5FRCkpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfbWFuYWdlcihzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCWlmIChpc19vcGVuZWQoaTJzKSAmJiAoaTJzLT5tb2RlICYgREFJX01BTkFHRVIpKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworLyogUmVhZCBSQ0xLIG9mIEkyUyAoaW4gbXVsdGlwbGVzIG9mIExSQ0xLKSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfcmZzKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJdTMyIHJmcyA9IChyZWFkbChpMnMtPmFkZHIgKyBJMlNNT0QpID4+IDMpICYgMHgzOworCisJc3dpdGNoIChyZnMpIHsKKwljYXNlIDM6CXJldHVybiA3Njg7CisJY2FzZSAyOiByZXR1cm4gMzg0OworCWNhc2UgMToJcmV0dXJuIDUxMjsKKwlkZWZhdWx0OiByZXR1cm4gMjU2OworCX0KK30KKworLyogV3JpdGUgUkNMSyBvZiBJMlMgKGluIG11bHRpcGxlcyBvZiBMUkNMSykgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcmZzKHN0cnVjdCBpMnNfZGFpICppMnMsIHVuc2lnbmVkIHJmcykKK3sKKwl1MzIgbW9kID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKworCW1vZCAmPSB+TU9EX1JDTEtfTUFTSzsKKworCXN3aXRjaCAocmZzKSB7CisJY2FzZSA3Njg6CisJCW1vZCB8PSBNT0RfUkNMS183NjhGUzsKKwkJYnJlYWs7CisJY2FzZSA1MTI6CisJCW1vZCB8PSBNT0RfUkNMS181MTJGUzsKKwkJYnJlYWs7CisJY2FzZSAzODQ6CisJCW1vZCB8PSBNT0RfUkNMS18zODRGUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbW9kIHw9IE1PRF9SQ0xLXzI1NkZTOworCQlicmVhazsKKwl9CisKKwl3cml0ZWwobW9kLCBpMnMtPmFkZHIgKyBJMlNNT0QpOworfQorCisvKiBSZWFkIEJpdC1DbG9jayBvZiBJMlMgKGluIG11bHRpcGxlcyBvZiBMUkNMSykgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2JmcyhzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCXUzMiBiZnMgPSAocmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKSA+PiAxKSAmIDB4MzsKKworCXN3aXRjaCAoYmZzKSB7CisJY2FzZSAzOiByZXR1cm4gMjQ7CisJY2FzZSAyOiByZXR1cm4gMTY7CisJY2FzZSAxOglyZXR1cm4gNDg7CisJZGVmYXVsdDogcmV0dXJuIDMyOworCX0KK30KKworLyogV3JpdGUgQml0LUNsb2NrIG9mIEkyUyAoaW4gbXVsdGlwbGVzIG9mIExSQ0xLKSAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9iZnMoc3RydWN0IGkyc19kYWkgKmkycywgdW5zaWduZWQgYmZzKQoreworCXUzMiBtb2QgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNNT0QpOworCisJbW9kICY9IH5NT0RfQkNMS19NQVNLOworCisJc3dpdGNoIChiZnMpIHsKKwljYXNlIDQ4OgorCQltb2QgfD0gTU9EX0JDTEtfNDhGUzsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJbW9kIHw9IE1PRF9CQ0xLXzMyRlM7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCW1vZCB8PSBNT0RfQkNMS18yNEZTOworCQlicmVhazsKKwljYXNlIDE2OgorCQltb2QgfD0gTU9EX0JDTEtfMTZGUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJzLT5wZGV2LT5kZXYsICJXcm9uZyBCQ0xLIERpdmlkZXIhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbChtb2QsIGkycy0+YWRkciArIEkyU01PRCk7Cit9CisKKy8qIFNhbXBsZS1TaXplICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfYmxjKHN0cnVjdCBpMnNfZGFpICppMnMpCit7CisJaW50IGJsYyA9IHJlYWRsKGkycy0+YWRkciArIEkyU01PRCk7CisKKwlibGMgPSAoYmxjID4+IDEzKSAmIDB4MzsKKworCXN3aXRjaCAoYmxjKSB7CisJY2FzZSAyOiByZXR1cm4gMjQ7CisJY2FzZSAxOglyZXR1cm4gODsKKwlkZWZhdWx0OiByZXR1cm4gMTY7CisJfQorfQorCisvKiBUWCBDaGFubmVsIENvbnRyb2wgKi8KK3N0YXRpYyB2b2lkIGkyc190eGN0cmwoc3RydWN0IGkyc19kYWkgKmkycywgaW50IG9uKQoreworCXZvaWQgX19pb21lbSAqYWRkciA9IGkycy0+YWRkcjsKKwl1MzIgY29uID0gcmVhZGwoYWRkciArIEkyU0NPTik7CisJdTMyIG1vZCA9IHJlYWRsKGFkZHIgKyBJMlNNT0QpICYgfk1PRF9NQVNLOworCisJaWYgKG9uKSB7CisJCWNvbiB8PSBDT05fQUNUSVZFOworCQljb24gJj0gfkNPTl9UWENIX1BBVVNFOworCisJCWlmIChpc19zZWNvbmRhcnkoaTJzKSkgeworCQkJY29uIHw9IENPTl9UWFNETUFfQUNUSVZFOworCQkJY29uICY9IH5DT05fVFhTRE1BX1BBVVNFOworCQl9IGVsc2UgeworCQkJY29uIHw9IENPTl9UWERNQV9BQ1RJVkU7CisJCQljb24gJj0gfkNPTl9UWERNQV9QQVVTRTsKKwkJfQorCisJCWlmIChhbnlfcnhfYWN0aXZlKGkycykpCisJCQltb2QgfD0gTU9EX1RYUlg7CisJCWVsc2UKKwkJCW1vZCB8PSBNT0RfVFhPTkxZOworCX0gZWxzZSB7CisJCWlmIChpc19zZWNvbmRhcnkoaTJzKSkgeworCQkJY29uIHw9ICBDT05fVFhTRE1BX1BBVVNFOworCQkJY29uICY9IH5DT05fVFhTRE1BX0FDVElWRTsKKwkJfSBlbHNlIHsKKwkJCWNvbiB8PSAgQ09OX1RYRE1BX1BBVVNFOworCQkJY29uICY9IH5DT05fVFhETUFfQUNUSVZFOworCQl9CisKKwkJaWYgKG90aGVyX3R4X2FjdGl2ZShpMnMpKSB7CisJCQl3cml0ZWwoY29uLCBhZGRyICsgSTJTQ09OKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWNvbiB8PSAgQ09OX1RYQ0hfUEFVU0U7CisKKwkJaWYgKGFueV9yeF9hY3RpdmUoaTJzKSkKKwkJCW1vZCB8PSBNT0RfUlhPTkxZOworCQllbHNlCisJCQljb24gJj0gfkNPTl9BQ1RJVkU7CisJfQorCisJd3JpdGVsKG1vZCwgYWRkciArIEkyU01PRCk7CisJd3JpdGVsKGNvbiwgYWRkciArIEkyU0NPTik7Cit9CisKKy8qIFJYIENoYW5uZWwgQ29udHJvbCAqLworc3RhdGljIHZvaWQgaTJzX3J4Y3RybChzdHJ1Y3QgaTJzX2RhaSAqaTJzLCBpbnQgb24pCit7CisJdm9pZCBfX2lvbWVtICphZGRyID0gaTJzLT5hZGRyOworCXUzMiBjb24gPSByZWFkbChhZGRyICsgSTJTQ09OKTsKKwl1MzIgbW9kID0gcmVhZGwoYWRkciArIEkyU01PRCkgJiB+TU9EX01BU0s7CisKKwlpZiAob24pIHsKKwkJY29uIHw9IENPTl9SWERNQV9BQ1RJVkUgfCBDT05fQUNUSVZFOworCQljb24gJj0gfihDT05fUlhETUFfUEFVU0UgfCBDT05fUlhDSF9QQVVTRSk7CisKKwkJaWYgKGFueV90eF9hY3RpdmUoaTJzKSkKKwkJCW1vZCB8PSBNT0RfVFhSWDsKKwkJZWxzZQorCQkJbW9kIHw9IE1PRF9SWE9OTFk7CisJfSBlbHNlIHsKKwkJY29uIHw9ICBDT05fUlhETUFfUEFVU0UgfCBDT05fUlhDSF9QQVVTRTsKKwkJY29uICY9IH5DT05fUlhETUFfQUNUSVZFOworCisJCWlmIChhbnlfdHhfYWN0aXZlKGkycykpCisJCQltb2QgfD0gTU9EX1RYT05MWTsKKwkJZWxzZQorCQkJY29uICY9IH5DT05fQUNUSVZFOworCX0KKworCXdyaXRlbChtb2QsIGFkZHIgKyBJMlNNT0QpOworCXdyaXRlbChjb24sIGFkZHIgKyBJMlNDT04pOworfQorCisvKiBGbHVzaCBGSUZPIG9mIGFuIGludGVyZmFjZSAqLworc3RhdGljIGlubGluZSB2b2lkIGkyc19maWZvKHN0cnVjdCBpMnNfZGFpICppMnMsIHUzMiBmbHVzaCkKK3sKKwl2b2lkIF9faW9tZW0gKmZpYzsKKwl1MzIgdmFsOworCisJaWYgKCFpMnMpCisJCXJldHVybjsKKworCWlmIChpc19zZWNvbmRhcnkoaTJzKSkKKwkJZmljID0gaTJzLT5hZGRyICsgSTJTRklDUzsKKwllbHNlCisJCWZpYyA9IGkycy0+YWRkciArIEkyU0ZJQzsKKworCS8qIEZsdXNoIHRoZSBGSUZPICovCisJd3JpdGVsKHJlYWRsKGZpYykgfCBmbHVzaCwgZmljKTsKKworCS8qIEJlIHBhdGllbnQgKi8KKwl2YWwgPSBtc2Vjc190b19sb29wcygxKSAvIDEwMDA7IC8qIDEgdXNlYyAqLworCXdoaWxlICgtLXZhbCkKKwkJY3B1X3JlbGF4KCk7CisKKwl3cml0ZWwocmVhZGwoZmljKSAmIH5mbHVzaCwgZmljKTsKK30KKworc3RhdGljIGludCBpMnNfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkgIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCByZnMsIGludCBkaXIpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKwl1MzIgbW9kID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBTQU1TVU5HX0kyU19DRENMSzoKKwkJLyogU2hvdWxkbid0IG1hdHRlciBpbiBHQVRJTkcoQ0xPQ0tfSU4pIG1vZGUgKi8KKwkJaWYgKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKQorCQkJcmZzID0gMDsKKworCQlpZiAoKHJmcyAmJiBvdGhlci0+cmZzICYmIChvdGhlci0+cmZzICE9IHJmcykpIHx8CisJCQkJKGFueV9hY3RpdmUoaTJzKSAmJgorCQkJCSgoKGRpciA9PSBTTkRfU09DX0NMT0NLX0lOKQorCQkJCQkmJiAhKG1vZCAmIE1PRF9DRENMS0NPTikpIHx8CisJCQkJKChkaXIgPT0gU05EX1NPQ19DTE9DS19PVVQpCisJCQkJCSYmIChtb2QgJiBNT0RfQ0RDTEtDT04pKSkpKSB7CisJCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwKKwkJCQkiJXM6JWQgT3RoZXIgREFJIGJ1c3lcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCWlmIChkaXIgPT0gU05EX1NPQ19DTE9DS19JTikKKwkJCW1vZCB8PSBNT0RfQ0RDTEtDT047CisJCWVsc2UKKwkJCW1vZCAmPSB+TU9EX0NEQ0xLQ09OOworCisJCWkycy0+cmZzID0gcmZzOworCQlicmVhazsKKworCWNhc2UgU0FNU1VOR19JMlNfUkNMS1NSQ18wOiAvKiBjbG9jayBjb3Jyc3BvbmRpbmcgdG8gSUlTTU9EWzEwXSA6PSAwICovCisJY2FzZSBTQU1TVU5HX0kyU19SQ0xLU1JDXzE6IC8qIGNsb2NrIGNvcnJzcG9uZGluZyB0byBJSVNNT0RbMTBdIDo9IDEgKi8KKwkJaWYgKChpMnMtPnF1aXJrcyAmIFFVSVJLX05PX01VWFBTUikKKwkJCQl8fCAoY2xrX2lkID09IFNBTVNVTkdfSTJTX1JDTEtTUkNfMCkpCisJCQljbGtfaWQgPSAwOworCQllbHNlCisJCQljbGtfaWQgPSAxOworCisJCWlmICghYW55X2FjdGl2ZShpMnMpKSB7CisJCQlpZiAoaTJzLT5vcF9jbGspIHsKKwkJCQlpZiAoKGNsa19pZCAmJiAhKG1vZCAmIE1PRF9JTVNfU1lTTVVYKSkgfHwKKwkJCQkJKCFjbGtfaWQgJiYgKG1vZCAmIE1PRF9JTVNfU1lTTVVYKSkpIHsKKwkJCQkJY2xrX2Rpc2FibGUoaTJzLT5vcF9jbGspOworCQkJCQljbGtfcHV0KGkycy0+b3BfY2xrKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpMnMtPnJjbGtfc3JjcmF0ZSA9CisJCQkJCQljbGtfZ2V0X3JhdGUoaTJzLT5vcF9jbGspOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCWkycy0+b3BfY2xrID0gY2xrX2dldCgmaTJzLT5wZGV2LT5kZXYsCisJCQkJCQlpMnMtPnNyY19jbGtbY2xrX2lkXSk7CisJCQljbGtfZW5hYmxlKGkycy0+b3BfY2xrKTsKKwkJCWkycy0+cmNsa19zcmNyYXRlID0gY2xrX2dldF9yYXRlKGkycy0+b3BfY2xrKTsKKworCQkJLyogT3Zlci1yaWRlIHRoZSBvdGhlcidzICovCisJCQlpZiAob3RoZXIpIHsKKwkJCQlvdGhlci0+b3BfY2xrID0gaTJzLT5vcF9jbGs7CisJCQkJb3RoZXItPnJjbGtfc3JjcmF0ZSA9IGkycy0+cmNsa19zcmNyYXRlOworCQkJfQorCQl9IGVsc2UgaWYgKCghY2xrX2lkICYmIChtb2QgJiBNT0RfSU1TX1NZU01VWCkpCisJCQkJfHwgKGNsa19pZCAmJiAhKG1vZCAmIE1PRF9JTVNfU1lTTVVYKSkpIHsKKwkJCWRldl9lcnIoJmkycy0+cGRldi0+ZGV2LAorCQkJCSIlczolZCBPdGhlciBEQUkgYnVzeVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeworCQkJLyogQ2FsbCBjYW4ndCBiZSBvbiB0aGUgYWN0aXZlIERBSSAqLworCQkJaTJzLT5vcF9jbGsgPSBvdGhlci0+b3BfY2xrOworCQkJaTJzLT5yY2xrX3NyY3JhdGUgPSBvdGhlci0+cmNsa19zcmNyYXRlOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoY2xrX2lkID09IDApCisJCQltb2QgJj0gfk1PRF9JTVNfU1lTTVVYOworCQllbHNlCisJCQltb2QgfD0gTU9EX0lNU19TWVNNVVg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJzLT5wZGV2LT5kZXYsICJXZSBkb24ndCBzZXJ2ZSB0aGF0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdyaXRlbChtb2QsIGkycy0+YWRkciArIEkyU01PRCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMnNfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBpMnNfZGFpICppMnMgPSB0b19pbmZvKGRhaSk7CisJdTMyIG1vZCA9IHJlYWRsKGkycy0+YWRkciArIEkyU01PRCk7CisJdTMyIHRtcCA9IDA7CisKKwkvKiBGb3JtYXQgaXMgcHJpb3JpdHkgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQl0bXAgfD0gTU9EX0xSX1JMT1c7CisJCXRtcCB8PSBNT0RfU0RGX01TQjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXRtcCB8PSBNT0RfTFJfUkxPVzsKKwkJdG1wIHw9IE1PRF9TREZfTFNCOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJdG1wIHw9IE1PRF9TREZfSUlTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwgIkZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJTlYgZmxhZyBpcyByZWxhdGl2ZSB0byB0aGUgRk9STUFUIGZsYWcgLSBpZiBzZXQgaXQgc2ltcGx5CisJICogZmxpcHMgdGhlIHBvbGFyaXR5IHNwZWNpZmllZCBieSB0aGUgU3RhbmRhcmQKKwkgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJaWYgKHRtcCAmIE1PRF9MUl9STE9XKQorCQkJdG1wICY9IH5NT0RfTFJfUkxPVzsKKwkJZWxzZQorCQkJdG1wIHw9IE1PRF9MUl9STE9XOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwgIlBvbGFyaXR5IG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQl0bXAgfD0gTU9EX1NMQVZFOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCS8qIFNldCBkZWZhdWx0IHNvdXJjZSBjbG9jayBpbiBNYXN0ZXIgbW9kZSAqLworCQlpZiAoaTJzLT5yY2xrX3NyY3JhdGUgPT0gMCkKKwkJCWkyc19zZXRfc3lzY2xrKGRhaSwgU0FNU1VOR19JMlNfUkNMS1NSQ18wLAorCQkJCQkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwgIm1hc3Rlci9zbGF2ZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhbnlfYWN0aXZlKGkycykgJiYKKwkJCSgobW9kICYgKE1PRF9TREZfTUFTSyB8IE1PRF9MUl9STE9XCisJCQkJfCBNT0RfU0xBVkUpKSAhPSB0bXApKSB7CisJCWRldl9lcnIoJmkycy0+cGRldi0+ZGV2LAorCQkJCSIlczolZCBPdGhlciBEQUkgYnVzeVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbW9kICY9IH4oTU9EX1NERl9NQVNLIHwgTU9EX0xSX1JMT1cgfCBNT0RfU0xBVkUpOworCW1vZCB8PSB0bXA7CisJd3JpdGVsKG1vZCwgaTJzLT5hZGRyICsgSTJTTU9EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBpMnNfZGFpICppMnMgPSB0b19pbmZvKGRhaSk7CisJdTMyIG1vZCA9IHJlYWRsKGkycy0+YWRkciArIEkyU01PRCk7CisKKwlpZiAoIWlzX3NlY29uZGFyeShpMnMpKQorCQltb2QgJj0gfihNT0RfREMyX0VOIHwgTU9EX0RDMV9FTik7CisKKwlzd2l0Y2ggKHBhcmFtc19jaGFubmVscyhwYXJhbXMpKSB7CisJY2FzZSA2OgorCQltb2QgfD0gTU9EX0RDMl9FTjsKKwljYXNlIDQ6CisJCW1vZCB8PSBNT0RfREMxX0VOOworCQlicmVhazsKKwljYXNlIDI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmkycy0+cGRldi0+ZGV2LCAiJWQgY2hhbm5lbHMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQlwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpc19zZWNvbmRhcnkoaTJzKSkKKwkJbW9kICY9IH5NT0RfQkxDU19NQVNLOworCWVsc2UKKwkJbW9kICY9IH5NT0RfQkxDUF9NQVNLOworCisJaWYgKGlzX21hbmFnZXIoaTJzKSkKKwkJbW9kICY9IH5NT0RfQkxDX01BU0s7CisKKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoKKwkJaWYgKGlzX3NlY29uZGFyeShpMnMpKQorCQkJbW9kIHw9IE1PRF9CTENTXzhCSVQ7CisJCWVsc2UKKwkJCW1vZCB8PSBNT0RfQkxDUF84QklUOworCQlpZiAoaXNfbWFuYWdlcihpMnMpKQorCQkJbW9kIHw9IE1PRF9CTENfOEJJVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJaWYgKGlzX3NlY29uZGFyeShpMnMpKQorCQkJbW9kIHw9IE1PRF9CTENTXzE2QklUOworCQllbHNlCisJCQltb2QgfD0gTU9EX0JMQ1BfMTZCSVQ7CisJCWlmIChpc19tYW5hZ2VyKGkycykpCisJCQltb2QgfD0gTU9EX0JMQ18xNkJJVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJaWYgKGlzX3NlY29uZGFyeShpMnMpKQorCQkJbW9kIHw9IE1PRF9CTENTXzI0QklUOworCQllbHNlCisJCQltb2QgfD0gTU9EX0JMQ1BfMjRCSVQ7CisJCWlmIChpc19tYW5hZ2VyKGkycykpCisJCQltb2QgfD0gTU9EX0JMQ18yNEJJVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJzLT5wZGV2LT5kZXYsICJGb3JtYXQoJWQpIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlbChtb2QsIGkycy0+YWRkciArIEkyU01PRCk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLAorCQkJKHZvaWQgKikmaTJzLT5kbWFfcGxheWJhY2spOworCWVsc2UKKwkJc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLAorCQkJKHZvaWQgKikmaTJzLT5kbWFfY2FwdHVyZSk7CisKKwlpMnMtPmZybWNsayA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogV2Ugc2V0IGNvbnN0cmFpbnRzIG9uIHRoZSBzdWJzdHJlYW0gYWNjIHRvIHRoZSB2ZXJzaW9uIG9mIEkyUyAqLworc3RhdGljIGludCBpMnNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBpMnNfZGFpICppMnMgPSB0b19pbmZvKGRhaSk7CisJc3RydWN0IGkyc19kYWkgKm90aGVyID0gaTJzLT5wcmlfZGFpID8gOiBpMnMtPnNlY19kYWk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisKKwlpMnMtPm1vZGUgfD0gREFJX09QRU5FRDsKKworCWlmIChpc19tYW5hZ2VyKG90aGVyKSkKKwkJaTJzLT5tb2RlICY9IH5EQUlfTUFOQUdFUjsKKwllbHNlCisJCWkycy0+bW9kZSB8PSBEQUlfTUFOQUdFUjsKKworCS8qIEVuZm9yY2Ugc2V0X3N5c2NsayBpbiBNYXN0ZXIgbW9kZSAqLworCWkycy0+cmNsa19zcmNyYXRlID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKworCWkycy0+bW9kZSAmPSB+REFJX09QRU5FRDsKKwlpMnMtPm1vZGUgJj0gfkRBSV9NQU5BR0VSOworCisJaWYgKGlzX29wZW5lZChvdGhlcikpCisJCW90aGVyLT5tb2RlIHw9IERBSV9NQU5BR0VSOworCisJLyogUmVzZXQgYW55IGNvbnN0cmFpbnQgb24gUkZTIGFuZCBCRlMgKi8KKwlpMnMtPnJmcyA9IDA7CisJaTJzLT5iZnMgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCisJLyogR2F0ZSBDRENMSyBieSBkZWZhdWx0ICovCisJaWYgKCFpc19vcGVuZWQob3RoZXIpKQorCQlpMnNfc2V0X3N5c2NsayhkYWksIFNBTVNVTkdfSTJTX0NEQ0xLLAorCQkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19zZXR1cChzdHJ1Y3QgaTJzX2RhaSAqaTJzKQoreworCXN0cnVjdCBpMnNfZGFpICpvdGhlciA9IGkycy0+cHJpX2RhaSA/IDogaTJzLT5zZWNfZGFpOworCXVuc2lnbmVkIHJmcywgYmZzLCBibGM7CisJdTMyIHBzcjsKKworCWJsYyA9IGdldF9ibGMoaTJzKTsKKworCWJmcyA9IGkycy0+YmZzOworCisJaWYgKCFiZnMgJiYgb3RoZXIpCisJCWJmcyA9IG90aGVyLT5iZnM7CisKKwkvKiBTZWxlY3QgbGVhc3QgcG9zc2libGUgbXVsdGlwbGUoMikgaWYgbm8gY29uc3RyYWludCBzZXQgKi8KKwlpZiAoIWJmcykKKwkJYmZzID0gYmxjICogMjsKKworCXJmcyA9IGkycy0+cmZzOworCisJaWYgKCFyZnMgJiYgb3RoZXIpCisJCXJmcyA9IG90aGVyLT5yZnM7CisKKwlpZiAoKHJmcyA9PSAyNTYgfHwgcmZzID09IDUxMikgJiYgKGJsYyA9PSAyNCkpIHsKKwkJZGV2X2VycigmaTJzLT5wZGV2LT5kZXYsCisJCQkiJWQtUkZTIG5vdCBzdXBwb3J0ZWQgZm9yIDI0LWJsY1xuIiwgcmZzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFyZnMpIHsKKwkJaWYgKGJmcyA9PSAxNiB8fCBiZnMgPT0gMzIpCisJCQlyZnMgPSAyNTY7CisJCWVsc2UKKwkJCXJmcyA9IDM4NDsKKwl9CisKKwkvKiBJZiBhbHJlYWR5IHNldHVwIGFuZCBydW5uaW5nICovCisJaWYgKGFueV9hY3RpdmUoaTJzKSAmJiAoZ2V0X3JmcyhpMnMpICE9IHJmcyB8fCBnZXRfYmZzKGkycykgIT0gYmZzKSkgeworCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwKKwkJCQkiJXM6JWQgT3RoZXIgREFJIGJ1c3lcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIERvbid0IGJvdGhlciBSRlMsIEJGUyAmIFBTUiBpbiBTbGF2ZSBtb2RlICovCisJaWYgKGlzX3NsYXZlKGkycykpCisJCXJldHVybiAwOworCisJc2V0X2JmcyhpMnMsIGJmcyk7CisJc2V0X3JmcyhpMnMsIHJmcyk7CisKKwlpZiAoIShpMnMtPnF1aXJrcyAmIFFVSVJLX05PX01VWFBTUikpIHsKKwkJcHNyID0gaTJzLT5yY2xrX3NyY3JhdGUgLyBpMnMtPmZybWNsayAvIHJmczsKKwkJd3JpdGVsKCgocHNyIC0gMSkgPDwgOCkgfCBQU1JfUFNSRU4sIGkycy0+YWRkciArIEkyU1BTUik7CisJCWRldl9kYmcoJmkycy0+cGRldi0+ZGV2LAorCQkJIlJDTEtfU1JDPSVsdUh6IFBTUj0ldSwgUkNMSz0lZGZzLCBCQ0xLPSVkZnNcbiIsCisJCQkJaTJzLT5yY2xrX3NyY3JhdGUsIHBzciwgcmZzLCBiZnMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyc190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCWludCBjbWQsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCWludCBjYXB0dXJlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpMnNfZGFpICppMnMgPSB0b19pbmZvKHJ0ZC0+Y3B1X2RhaSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlpZiAoY29uZmlnX3NldHVwKGkycykpIHsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGNhcHR1cmUpCisJCQlpMnNfcnhjdHJsKGkycywgMSk7CisJCWVsc2UKKwkJCWkyc190eGN0cmwoaTJzLCAxKTsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJaWYgKGNhcHR1cmUpCisJCQlpMnNfcnhjdHJsKGkycywgMCk7CisJCWVsc2UKKwkJCWkyc190eGN0cmwoaTJzLCAwKTsKKworCQlpZiAoY2FwdHVyZSkKKwkJCWkyc19maWZvKGkycywgRklDX1JYRkxVU0gpOworCQllbHNlCisJCQlpMnNfZmlmbyhpMnMsIEZJQ19UWEZMVVNIKTsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyc19zZXRfY2xrZGl2KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCWludCBkaXZfaWQsIGludCBkaXYpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKworCXN3aXRjaCAoZGl2X2lkKSB7CisJY2FzZSBTQU1TVU5HX0kyU19ESVZfQkNMSzoKKwkJaWYgKChhbnlfYWN0aXZlKGkycykgJiYgZGl2ICYmIChnZXRfYmZzKGkycykgIT0gZGl2KSkKKwkJCXx8IChvdGhlciAmJiBvdGhlci0+YmZzICYmIChvdGhlci0+YmZzICE9IGRpdikpKSB7CisJCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwKKwkJCQkiJXM6JWQgT3RoZXIgREFJIGJ1c3lcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlpMnMtPmJmcyA9IGRpdjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJzLT5wZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjbG9jayBkaXZpZGVyKCVkKVxuIiwgZGl2X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdAoraTJzX2RlbGF5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgaTJzX2RhaSAqaTJzID0gdG9faW5mbyhkYWkpOworCXUzMiByZWcgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNGSUMpOworCXNuZF9wY21fc2ZyYW1lc190IGRlbGF5OworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJZGVsYXkgPSBGSUNfUlhDT1VOVChyZWcpOworCWVsc2UgaWYgKGlzX3NlY29uZGFyeShpMnMpKQorCQlkZWxheSA9IEZJQ1NfVFhDT1VOVChyZWFkbChpMnMtPmFkZHIgKyBJMlNGSUNTKSk7CisJZWxzZQorCQlkZWxheSA9IEZJQ19UWENPVU5UKHJlZyk7CisKKwlyZXR1cm4gZGVsYXk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgaTJzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKworCWlmIChkYWktPmFjdGl2ZSkgeworCQlpMnMtPnN1c3BlbmRfaTJzbW9kID0gcmVhZGwoaTJzLT5hZGRyICsgSTJTTU9EKTsKKwkJaTJzLT5zdXNwZW5kX2kyc2NvbiA9IHJlYWRsKGkycy0+YWRkciArIEkyU0NPTik7CisJCWkycy0+c3VzcGVuZF9pMnNwc3IgPSByZWFkbChpMnMtPmFkZHIgKyBJMlNQU1IpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyc19yZXN1bWUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKworCWlmIChkYWktPmFjdGl2ZSkgeworCQl3cml0ZWwoaTJzLT5zdXNwZW5kX2kyc2NvbiwgaTJzLT5hZGRyICsgSTJTQ09OKTsKKwkJd3JpdGVsKGkycy0+c3VzcGVuZF9pMnNtb2QsIGkycy0+YWRkciArIEkyU01PRCk7CisJCXdyaXRlbChpMnMtPnN1c3BlbmRfaTJzcHNyLCBpMnMtPmFkZHIgKyBJMlNQU1IpOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgaTJzX3N1c3BlbmQgTlVMTAorI2RlZmluZSBpMnNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIGludCBzYW1zdW5nX2kyc19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGkyc19kYWkgKmkycyA9IHRvX2luZm8oZGFpKTsKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKworCWlmIChvdGhlciAmJiBvdGhlci0+Y2xrKSAvKiBJZiB0aGlzIGlzIHByb2JlIG9uIHNlY29uZGFyeSAqLworCQlnb3RvIHByb2JlX2V4aXQ7CisKKwlpMnMtPmFkZHIgPSBpb3JlbWFwKGkycy0+YmFzZSwgMHgxMDApOworCWlmIChpMnMtPmFkZHIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpMnMtPnBkZXYtPmRldiwgImNhbm5vdCBpb3JlbWFwIHJlZ2lzdGVyc1xuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaTJzLT5jbGsgPSBjbGtfZ2V0KCZpMnMtPnBkZXYtPmRldiwgImlpcyIpOworCWlmIChJU19FUlIoaTJzLT5jbGspKSB7CisJCWRldl9lcnIoJmkycy0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpMnNfY2xvY2tcbiIpOworCQlpb3VubWFwKGkycy0+YWRkcik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwljbGtfZW5hYmxlKGkycy0+Y2xrKTsKKworCWlmIChvdGhlcikgeworCQlvdGhlci0+YWRkciA9IGkycy0+YWRkcjsKKwkJb3RoZXItPmNsayA9IGkycy0+Y2xrOworCX0KKworCWlmIChpMnMtPnF1aXJrcyAmIFFVSVJLX05FRURfUlNUQ0xSKQorCQl3cml0ZWwoQ09OX1JTVENMUiwgaTJzLT5hZGRyICsgSTJTQ09OKTsKKworcHJvYmVfZXhpdDoKKwkvKiBSZXNldCBhbnkgY29uc3RyYWludCBvbiBSRlMgYW5kIEJGUyAqLworCWkycy0+cmZzID0gMDsKKwlpMnMtPmJmcyA9IDA7CisJaTJzX3R4Y3RybChpMnMsIDApOworCWkyc19yeGN0cmwoaTJzLCAwKTsKKwlpMnNfZmlmbyhpMnMsIEZJQ19UWEZMVVNIKTsKKwlpMnNfZmlmbyhvdGhlciwgRklDX1RYRkxVU0gpOworCWkyc19maWZvKGkycywgRklDX1JYRkxVU0gpOworCisJLyogR2F0ZSBDRENMSyBieSBkZWZhdWx0ICovCisJaWYgKCFpc19vcGVuZWQob3RoZXIpKQorCQlpMnNfc2V0X3N5c2NsayhkYWksIFNBTVNVTkdfSTJTX0NEQ0xLLAorCQkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2Ftc3VuZ19pMnNfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgaTJzX2RhaSAqaTJzID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlzdHJ1Y3QgaTJzX2RhaSAqb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKworCWlmICghb3RoZXIgfHwgIW90aGVyLT5jbGspIHsKKworCQlpZiAoaTJzLT5xdWlya3MgJiBRVUlSS19ORUVEX1JTVENMUikKKwkJCXdyaXRlbCgwLCBpMnMtPmFkZHIgKyBJMlNDT04pOworCisJCWNsa19kaXNhYmxlKGkycy0+Y2xrKTsKKwkJY2xrX3B1dChpMnMtPmNsayk7CisKKwkJaW91bm1hcChpMnMtPmFkZHIpOworCX0KKworCWkycy0+Y2xrID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBzYW1zdW5nX2kyc19kYWlfb3BzID0geworCS50cmlnZ2VyID0gaTJzX3RyaWdnZXIsCisJLmh3X3BhcmFtcyA9IGkyc19od19wYXJhbXMsCisJLnNldF9mbXQgPSBpMnNfc2V0X2ZtdCwKKwkuc2V0X2Nsa2RpdiA9IGkyc19zZXRfY2xrZGl2LAorCS5zZXRfc3lzY2xrID0gaTJzX3NldF9zeXNjbGssCisJLnN0YXJ0dXAgPSBpMnNfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBpMnNfc2h1dGRvd24sCisJLmRlbGF5ID0gaTJzX2RlbGF5LAorfTsKKworI2RlZmluZSBTQU1TVU5HX0kyU19SQVRFUwlTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwCisKKyNkZWZpbmUgU0FNU1VOR19JMlNfRk1UUwkoU05EUlZfUENNX0ZNVEJJVF9TOCB8IFwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQorCitzdGF0aWMgX19kZXZpbml0CitzdHJ1Y3QgaTJzX2RhaSAqaTJzX2FsbG9jX2RhaShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBib29sIHNlYykKK3sKKwlzdHJ1Y3QgaTJzX2RhaSAqaTJzOworCisJaTJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyc19kYWkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTJzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaTJzLT5wZGV2ID0gcGRldjsKKwlpMnMtPnByaV9kYWkgPSBOVUxMOworCWkycy0+c2VjX2RhaSA9IE5VTEw7CisJaTJzLT5pMnNfZGFpX2Rydi5zeW1tZXRyaWNfcmF0ZXMgPSAxOworCWkycy0+aTJzX2RhaV9kcnYucHJvYmUgPSBzYW1zdW5nX2kyc19kYWlfcHJvYmU7CisJaTJzLT5pMnNfZGFpX2Rydi5yZW1vdmUgPSBzYW1zdW5nX2kyc19kYWlfcmVtb3ZlOworCWkycy0+aTJzX2RhaV9kcnYub3BzID0gJnNhbXN1bmdfaTJzX2RhaV9vcHM7CisJaTJzLT5pMnNfZGFpX2Rydi5zdXNwZW5kID0gaTJzX3N1c3BlbmQ7CisJaTJzLT5pMnNfZGFpX2Rydi5yZXN1bWUgPSBpMnNfcmVzdW1lOworCWkycy0+aTJzX2RhaV9kcnYucGxheWJhY2suY2hhbm5lbHNfbWluID0gMjsKKwlpMnMtPmkyc19kYWlfZHJ2LnBsYXliYWNrLmNoYW5uZWxzX21heCA9IDI7CisJaTJzLT5pMnNfZGFpX2Rydi5wbGF5YmFjay5yYXRlcyA9IFNBTVNVTkdfSTJTX1JBVEVTOworCWkycy0+aTJzX2RhaV9kcnYucGxheWJhY2suZm9ybWF0cyA9IFNBTVNVTkdfSTJTX0ZNVFM7CisKKwlpZiAoIXNlYykgeworCQlpMnMtPmkyc19kYWlfZHJ2LmNhcHR1cmUuY2hhbm5lbHNfbWluID0gMjsKKwkJaTJzLT5pMnNfZGFpX2Rydi5jYXB0dXJlLmNoYW5uZWxzX21heCA9IDI7CisJCWkycy0+aTJzX2RhaV9kcnYuY2FwdHVyZS5yYXRlcyA9IFNBTVNVTkdfSTJTX1JBVEVTOworCQlpMnMtPmkyc19kYWlfZHJ2LmNhcHR1cmUuZm9ybWF0cyA9IFNBTVNVTkdfSTJTX0ZNVFM7CisJfSBlbHNlIHsJLyogQ3JlYXRlIGEgbmV3IHBsYXRmb3JtX2RldmljZSBmb3IgU2Vjb25kYXJ5ICovCisJCWkycy0+cGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YShOVUxMLAorCQkJCXBkZXYtPm5hbWUsIHBkZXYtPmlkICsgU0FNU1VOR19JMlNfU0VDT0ZGLAorCQkJCU5VTEwsIDAsIE5VTEwsIDApOworCQlpZiAoSVNfRVJSKGkycy0+cGRldikpIHsKKwkJCWtmcmVlKGkycyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCS8qIFByZS1hc3NpZ24gc25kX3NvY19kYWlfc2V0X2RydmRhdGEgKi8KKwlkZXZfc2V0X2RydmRhdGEoJmkycy0+cGRldi0+ZGV2LCBpMnMpOworCisJcmV0dXJuIGkyczsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgc2Ftc3VuZ19pMnNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgZG1hX3BsX2NoYW4sIGRtYV9jcF9jaGFuLCBkbWFfcGxfc2VjX2NoYW47CisJc3RydWN0IGkyc19kYWkgKnByaV9kYWksICpzZWNfZGFpID0gTlVMTDsKKwlzdHJ1Y3QgczNjX2F1ZGlvX3BkYXRhICppMnNfcGRhdGE7CisJc3RydWN0IHNhbXN1bmdfaTJzICppMnNfY2ZnOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiByZWdzX2Jhc2UsIHF1aXJrczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIENhbGwgZHVyaW5nIFNlY29uZGF5IGludGVyZmFjZSByZWdpc3RyYXRpb24gKi8KKwlpZiAocGRldi0+aWQgPj0gU0FNU1VOR19JMlNfU0VDT0ZGKSB7CisJCXNlY19kYWkgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJCXNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZzZWNfZGFpLT5wZGV2LT5kZXYsCisJCQkmc2VjX2RhaS0+aTJzX2RhaV9kcnYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpMnNfcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoaTJzX3BkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3Qgd29yayB3aXRob3V0IHMzY19hdWRpb19wZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBJMlMtVFggZG1hIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJZG1hX3BsX2NoYW4gPSByZXMtPnN0YXJ0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IEkyUy1SWCBkbWEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlkbWFfY3BfY2hhbiA9IHJlcy0+c3RhcnQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDIpOworCWlmIChyZXMpCisJCWRtYV9wbF9zZWNfY2hhbiA9IHJlcy0+c3RhcnQ7CisJZWxzZQorCQlkbWFfcGxfc2VjX2NoYW4gPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IEkyUyBTRlIgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCQkJCSJzYW1zdW5nLWkycyIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IFNGUiByZWdpb25cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZWdzX2Jhc2UgPSByZXMtPnN0YXJ0OworCisJaTJzX2NmZyA9ICZpMnNfcGRhdGEtPnR5cGUuaTJzOworCXF1aXJrcyA9IGkyc19jZmctPnF1aXJrczsKKworCXByaV9kYWkgPSBpMnNfYWxsb2NfZGFpKHBkZXYsIGZhbHNlKTsKKwlpZiAoIXByaV9kYWkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jIEkyU19wcmlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmRtYV9hZGRyID0gcmVnc19iYXNlICsgSTJTVFhEOworCXByaV9kYWktPmRtYV9jYXB0dXJlLmRtYV9hZGRyID0gcmVnc19iYXNlICsgSTJTUlhEOworCXByaV9kYWktPmRtYV9wbGF5YmFjay5jbGllbnQgPQorCQkoc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCAqKSZwcmlfZGFpLT5kbWFfcGxheWJhY2s7CisJcHJpX2RhaS0+ZG1hX2NhcHR1cmUuY2xpZW50ID0KKwkJKHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgKikmcHJpX2RhaS0+ZG1hX2NhcHR1cmU7CisJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmNoYW5uZWwgPSBkbWFfcGxfY2hhbjsKKwlwcmlfZGFpLT5kbWFfY2FwdHVyZS5jaGFubmVsID0gZG1hX2NwX2NoYW47CisJcHJpX2RhaS0+c3JjX2NsayA9IGkyc19jZmctPnNyY19jbGs7CisJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmRtYV9zaXplID0gNDsKKwlwcmlfZGFpLT5kbWFfY2FwdHVyZS5kbWFfc2l6ZSA9IDQ7CisJcHJpX2RhaS0+YmFzZSA9IHJlZ3NfYmFzZTsKKwlwcmlfZGFpLT5xdWlya3MgPSBxdWlya3M7CisKKwlpZiAocXVpcmtzICYgUVVJUktfUFJJXzZDSEFOKQorCQlwcmlfZGFpLT5pMnNfZGFpX2Rydi5wbGF5YmFjay5jaGFubmVsc19tYXggPSA2OworCisJaWYgKHF1aXJrcyAmIFFVSVJLX1NFQ19EQUkpIHsKKwkJc2VjX2RhaSA9IGkyc19hbGxvY19kYWkocGRldiwgdHJ1ZSk7CisJCWlmICghc2VjX2RhaSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jIEkyU19zZWNcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suZG1hX2FkZHIgPSByZWdzX2Jhc2UgKyBJMlNUWERTOworCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suY2xpZW50ID0KKwkJCShzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICopJnNlY19kYWktPmRtYV9wbGF5YmFjazsKKwkJLyogVXNlIGlETUEgYWx3YXlzIGlmIFN5c0RNQSBub3QgcHJvdmlkZWQgKi8KKwkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmNoYW5uZWwgPSBkbWFfcGxfc2VjX2NoYW4gPyA6IC0xOworCQlzZWNfZGFpLT5zcmNfY2xrID0gaTJzX2NmZy0+c3JjX2NsazsKKwkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmRtYV9zaXplID0gNDsKKwkJc2VjX2RhaS0+YmFzZSA9IHJlZ3NfYmFzZTsKKwkJc2VjX2RhaS0+cXVpcmtzID0gcXVpcmtzOworCQlzZWNfZGFpLT5wcmlfZGFpID0gcHJpX2RhaTsKKwkJcHJpX2RhaS0+c2VjX2RhaSA9IHNlY19kYWk7CisJfQorCisJaWYgKGkyc19wZGF0YS0+Y2ZnX2dwaW8gJiYgaTJzX3BkYXRhLT5jZmdfZ3BpbyhwZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gY29uZmlndXJlIGdwaW9cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjM7CisJfQorCisJc25kX3NvY19yZWdpc3Rlcl9kYWkoJnByaV9kYWktPnBkZXYtPmRldiwgJnByaV9kYWktPmkyc19kYWlfZHJ2KTsKKworCXJldHVybiAwOworZXJyMzoKKwlrZnJlZShzZWNfZGFpKTsKK2VycjI6CisJa2ZyZWUocHJpX2RhaSk7CitlcnIxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZWdzX2Jhc2UsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZleGl0IGludCBzYW1zdW5nX2kyc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaTJzX2RhaSAqaTJzLCAqb3RoZXI7CisKKwlpMnMgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJb3RoZXIgPSBpMnMtPnByaV9kYWkgPyA6IGkycy0+c2VjX2RhaTsKKworCWlmIChvdGhlcikgeworCQlvdGhlci0+cHJpX2RhaSA9IE5VTEw7CisJCW90aGVyLT5zZWNfZGFpID0gTlVMTDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwkJaWYgKHJlcykKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCX0KKworCWkycy0+cHJpX2RhaSA9IE5VTEw7CisJaTJzLT5zZWNfZGFpID0gTlVMTDsKKworCWtmcmVlKGkycyk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNhbXN1bmdfaTJzX2RyaXZlciA9IHsKKwkucHJvYmUgID0gc2Ftc3VuZ19pMnNfcHJvYmUsCisJLnJlbW92ZSA9IHNhbXN1bmdfaTJzX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzYW1zdW5nLWkycyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYW1zdW5nX2kyc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2Ftc3VuZ19pMnNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHNhbXN1bmdfaTJzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Ftc3VuZ19pMnNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzYW1zdW5nX2kyc19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoc2Ftc3VuZ19pMnNfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiSmFzd2luZGVyIFNpbmdoLCA8amFzc2kuYnJhckBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBJMlMgSW50ZXJmYWNlIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNhbXN1bmctaTJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuaCBiL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTVmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuaApAQCAtMCwwICsxLDI5IEBACisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9pMnMuaAorICoKKyAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gU2Ftc3VuZyBJMlMgQ29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkLgorICoJSmFzd2luZGVyIFNpbmdoIDxqYXNzaS5icmFyQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX1NORF9TT0NfU0FNU1VOR19JMlNfSAorI2RlZmluZSBfX1NORF9TT0NfU0FNU1VOR19JMlNfSAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgSTJTIGJsb2NrcyB0aGF0IGFueSBTb0MgY2FuIGhhdmUuCisgKiBUaGUgc2Vjb25kYXJ5IGludGVyZmFjZSBvZiBhIENQVSBkYWkoaWYgdGhlcmUgZXhpc3RzIGFueSksCisgKiBpcyBpbmRleGVkIGF0IFtjcHUtZGFpJ3MgSUQgKyBTQU1TVU5HX0kyU19TRUNPRkZdCisgKi8KKyNkZWZpbmUgU0FNU1VOR19JMlNfU0VDT0ZGCTQKKworI2RlZmluZSBTQU1TVU5HX0kyU19ESVZfQkNMSwkxCisKKyNkZWZpbmUgU0FNU1VOR19JMlNfUkNMS1NSQ18wCTAKKyNkZWZpbmUgU0FNU1VOR19JMlNfUkNMS1NSQ18xCTEKKyNkZWZpbmUgU0FNU1VOR19JMlNfQ0RDTEsJCTIKKworI2VuZGlmIC8qIF9fU05EX1NPQ19TQU1TVU5HX0kyU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9qaXZlX3dtODc1MC5jIGIvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYwpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9qaXZlX3dtODc1MC5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9qaXZlX3dtODc1MC5jCmluZGV4IDQ5NjA1Y2QuLjA4ODAyNTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L2ppdmVfd204NzUwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L2ppdmVfd204NzUwLmMKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL2ppdmVfd204NzUwLmMKICAqCiAgKiBDb3B5cmlnaHQgMjAwNywyMDA4IFNpbXRlYyBFbGVjdHJvbmljcwogICoKQEAgLTIxLDExICsyMSwxMCBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKKyNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJzM2MyNDEyLWkycy5oIgogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3dtODc1MC5oIgpAQCAtMTExLDE4ICsxMTAsMTkgQEAKIHN0YXRpYyBpbnQgaml2ZV93bTg3NTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnI7CiAKIAkvKiBUaGVzZSBlbmRwb2ludHMgYXJlIG5vdCBiZWluZyB1c2VkLiAqLwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJMSU5QVVQyIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIlJJTlBVVDIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElOUFVUMyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSSU5QVVQzIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTU9OTyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTlBVVDIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJSSU5QVVQyIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElOUFVUMyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlJJTlBVVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQzIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTU9OTyIpOwogCiAJLyogQWRkIGppdmUgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCWVyciA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc1MF9kYXBtX3dpZGdldHMsCisJZXJyID0gc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NTBfZGFwbV93aWRnZXRzLAogCQkJCQlBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhZGQgd2lkZ2V0cyAoJWQpXG4iLApAQCAtMTMwLDggKzEzMCw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDEsNyArMTQxLDcgQEAKIAkuc3RyZWFtX25hbWUJPSAiV004NzUwIiwKIAkuY3B1X2RhaV9uYW1lCT0gInMzYzI0MTItaTJzIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204NzUwLWhpZmkiLAotCS5wbGF0Zm9ybV9uYW1lCT0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkucGxhdGZvcm1fbmFtZQk9ICJzYW1zdW5nLWF1ZGlvIiwKIAkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0weDFhIiwKIAkuaW5pdAkJPSBqaXZlX3dtODc1MF9pbml0LAogCS5vcHMJCT0gJmppdmVfb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvbG00ODU3LmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9sbTQ4NTcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvbG00ODU3LmgKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL2xtNDg1Ny5oCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9sbjI0NDBzYmNfYWxjNjUwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvbG4yNDQwc2JjX2FsYzY1MC5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9sbjI0NDBzYmNfYWxjNjUwLmMKaW5kZXggYWJlNjRhYi4uYTJiYjM0ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvbG4yNDQwc2JjX2FsYzY1MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2xuMjQ0MHNiY19hbGM2NTAuYwpAQCAtMjEsMTAgKzIxLDkgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKLSNpbmNsdWRlICJzM2MtYWM5Ny5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImFjOTcuaCIKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgbG4yNDQwc2JjOwogCkBAIC0zMiwxMCArMzEsMTAgQEAKIHsKIAkubmFtZSA9ICJBQzk3IiwKIAkuc3RyZWFtX25hbWUgPSAiQUM5NyBIaUZpIiwKLQkuY3B1X2RhaV9uYW1lID0gInMzYy1hYzk3IiwKKwkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctYWM5NyIsCiAJLmNvZGVjX2RhaV9uYW1lID0gImFjOTctaGlmaSIsCiAJLmNvZGVjX25hbWUgPSAiYWM5Ny1jb2RlYyIsCi0JLnBsYXRmb3JtX25hbWUgPSAiczNjMjR4eC1wY20tYXVkaW8iLAorCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAogfSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L25lbzE5NzNfZ3RhMDJfd204NzUzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX2d0YTAyX3dtODc1My5jCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L25lbzE5NzNfZ3RhMDJfd204NzUzLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfZ3RhMDJfd204NzUzLmMKaW5kZXggZTk3YmRmMS4uM2VlYzYxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvbmVvMTk3M19ndGEwMl93bTg3NTMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9uZW8xOTczX2d0YTAyX3dtODc1My5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCkBAIC0zMiw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bWFjaC9ndGEwMi5oPgogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg3NTMuaCIKLSNpbmNsdWRlICJzM2MtZG1hLmgiCisjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAiczNjMjR4eC1pMnMuaCIKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgbmVvMTk3M19ndGEwMjsKQEAgLTMzMywxNiArMzMyLDE3IEBACiBzdGF0aWMgaW50IG5lbzE5NzNfZ3RhMDJfd204NzUzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlpbnQgZXJyOwogCiAJLyogc2V0IHVwIE5DIGNvZGVjIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiT1VUMyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVQ0Iik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUxIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUyIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiT1VUMyIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDQiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FMSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkUyIik7CiAKIAkvKiBBZGQgbmVvMTk3MyBndGEwMiBzcGVjaWZpYyB3aWRnZXRzICovCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgd204NzUzX2RhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODc1M19kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3dpZGdldHMpKTsKIAogCS8qIGFkZCBuZW8xOTczIGd0YTAyIHNwZWNpZmljIGNvbnRyb2xzICovCkBAIC0zNTMsMjUgKzM1MywyNSBAQAogCQlyZXR1cm4gZXJyOwogCiAJLyogc2V0IHVwIG5lbzE5NzMgZ3RhMDIgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXAgKi8KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYXVkaW9fbWFwLCBBUlJBWV9TSVpFKGF1ZGlvX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKIAogCS8qIHNldCBlbmRwb2ludHMgdG8gZGVmYXVsdCBvZmYgbW9kZSAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIlN0ZXJlbyBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGFuZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIYW5kc2V0IFNwayIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiU3RlcmVvIE91dCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIYW5kc2V0IFNwayIpOwogCiAJLyogYWxsb3cgYXVkaW8gcGF0aHMgZnJvbSB0aGUgR1NNIG1vZGVtIHRvIHJ1biBkdXJpbmcgc3VzcGVuZCAqLwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChjb2RlYywgIlN0ZXJlbyBPdXQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoY29kZWMsICJHU00gTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGNvZGVjLCAiSGFuZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoY29kZWMsICJIYW5kc2V0IFNwayIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3RlcmVvIE91dCIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJHU00gTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhhbmRzZXQgTWljIik7CisJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IFNwayIpOwogCi0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDAsNyArNDAwLDcgQEAKIAkuY3B1X2RhaV9uYW1lID0gInMzYzI0eHgtaTJzIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204NzUzLWhpZmkiLAogCS5pbml0ID0gbmVvMTk3M19ndGEwMl93bTg3NTNfaW5pdCwKLQkucGxhdGZvcm1fbmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCiAJLmNvZGVjX25hbWUgPSAid204NzUzLWNvZGVjLjAtMHgxYSIsCiAJLm9wcyA9ICZuZW8xOTczX2d0YTAyX2hpZmlfb3BzLAogfSwKQEAgLTQxMSw3ICs0MTEsNyBAQAogCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg3NTMtdm9pY2UiLAogCS5vcHMgPSAmbmVvMTk3M19ndGEwMl92b2ljZV9vcHMsCiAJLmNvZGVjX25hbWUgPSAid204NzUzLWNvZGVjLjAtMHgxYSIsCi0JLnBsYXRmb3JtX25hbWUgPSAiczNjMjR4eC1wY20tYXVkaW8iLAorCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAogfSwKIH07CiAKQEAgLTQzOCwyNSArNDM4LDIxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogcmVnaXN0ZXIgYmx1ZXRvb3RoIERBSSBoZXJlICovCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9kYWkoJm5lbzE5NzNfZ3RhMDJfc25kX2RldmljZS0+ZGV2LCAtMSwgJmJ0X2RhaSk7Ci0JaWYgKHJldCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KG5lbzE5NzNfZ3RhMDJfc25kX2RldmljZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpKCZuZW8xOTczX2d0YTAyX3NuZF9kZXZpY2UtPmRldiwgJmJ0X2RhaSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X2RldmljZTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKG5lbzE5NzNfZ3RhMDJfc25kX2RldmljZSwgJm5lbzE5NzNfZ3RhMDIpOwogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobmVvMTk3M19ndGEwMl9zbmRfZGV2aWNlKTsKIAotCWlmIChyZXQpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX3B1dChuZW8xOTczX2d0YTAyX3NuZF9kZXZpY2UpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0KQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RhaTsKIAogCS8qIEluaXRpYWxpc2UgR1BJT3MgdXNlZCBieSBhbXAgKi8KIAlyZXQgPSBncGlvX3JlcXVlc3QoR1RBMDJfR1BJT19IUF9JTiwgIkdUQTAyX0hQX0lOIik7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoImd0YTAyX3dtODc1MzogRmFpbGVkIHRvIHJlZ2lzdGVyIEdQSU8gJWRcbiIsIEdUQTAyX0dQSU9fSFBfSU4pOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RldmljZTsKKwkJZ290byBlcnJfZGVsX2RldmljZTsKIAl9CiAKIAlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1RBMDJfR1BJT19IUF9JTiwgMSk7CkBAIC00ODMsMTUgKzQ3OSwxOSBAQAogCWdwaW9fZnJlZShHVEEwMl9HUElPX0FNUF9TSFVUKTsKIGVycl9mcmVlX2dwaW9faHBfaW46CiAJZ3Bpb19mcmVlKEdUQTAyX0dQSU9fSFBfSU4pOwotZXJyX3VucmVnaXN0ZXJfZGV2aWNlOgotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG5lbzE5NzNfZ3RhMDJfc25kX2RldmljZSk7CitlcnJfZGVsX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKG5lbzE5NzNfZ3RhMDJfc25kX2RldmljZSk7CitlcnJfdW5yZWdpc3Rlcl9kYWk6CisJc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmbmVvMTk3M19ndGEwMl9zbmRfZGV2aWNlLT5kZXYpOworZXJyX3B1dF9kZXZpY2U6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChuZW8xOTczX2d0YTAyX3NuZF9kZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiBtb2R1bGVfaW5pdChuZW8xOTczX2d0YTAyX2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmVvMTk3M19ndGEwMl9leGl0KHZvaWQpCiB7Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2RhaSgmbmVvMTk3M19ndGEwMl9zbmRfZGV2aWNlLT5kZXYsIC0xKTsKKwlzbmRfc29jX3VucmVnaXN0ZXJfZGFpKCZuZW8xOTczX2d0YTAyX3NuZF9kZXZpY2UtPmRldik7CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobmVvMTk3M19ndGEwMl9zbmRfZGV2aWNlKTsKIAlncGlvX2ZyZWUoR1RBMDJfR1BJT19IUF9JTik7CiAJZ3Bpb19mcmVlKEdUQTAyX0dQSU9fQU1QX1NIVVQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvbmVvMTk3M193bTg3NTMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKc2ltaWxhcml0eSBpbmRleCA4MyUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvbmVvMTk3M193bTg3NTMuYwpyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvbmVvMTk3M193bTg3NTMuYwppbmRleCBmNGYyZWU3Li5jN2EyNDUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9uZW8xOTczX3dtODc1My5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL25lbzE5NzNfd204NzUzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CkBAIC0zNiw3ICszNSw3IEBACiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzUzLmgiCiAjaW5jbHVkZSAibG00ODU3LmgiCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgInMzYzI0eHgtaTJzLmgiCiAKIC8qIGRlZmluZSB0aGUgc2NlbmFyaW9zICovCkBAIC0yMzcsODEgKzIzNiw4MyBAQAogCiBzdGF0aWMgaW50IHNldF9zY2VuYXJpb19lbmRwb2ludHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgc2NlbmFyaW8pCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCiAJcHJfZGVidWcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAogCXN3aXRjaCAobmVvMTk3M19zY2VuYXJpbykgewogCWNhc2UgTkVPX0FVRElPX09GRjoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQXVkaW8gT3V0Iik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBJbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE5FT19HU01fQ0FMTF9BVURJT19IQU5EU0VUOgotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIEluIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiQ2FsbCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE5FT19HU01fQ0FMTF9BVURJT19IRUFEU0VUOgotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIEluIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQ2FsbCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE5FT19HU01fQ0FMTF9BVURJT19CTFVFVE9PVEg6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIEluIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE5FT19TVEVSRU9fVE9fU1BFQUtFUlM6Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiQXVkaW8gT3V0Iik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBJbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgSW4iKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkc2V0IE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CiAJCWJyZWFrOwogCWNhc2UgTkVPX1NURVJFT19UT19IRUFEUEhPTkVTOgotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiR1NNIExpbmUgSW4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQ2FsbCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCQlicmVhazsKIAljYXNlIE5FT19DQVBUVVJFX0hBTkRTRVQ6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiR1NNIExpbmUgSW4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkNhbGwgTWljIik7CiAJCWJyZWFrOwogCWNhc2UgTkVPX0NBUFRVUkVfSEVBRFNFVDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQXVkaW8gT3V0Iik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBJbiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRzZXQgTWljIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkNhbGwgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQXVkaW8gT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgT3V0Iik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiR1NNIExpbmUgSW4iKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQ2FsbCBNaWMiKTsKIAkJYnJlYWs7CiAJY2FzZSBORU9fQ0FQVFVSRV9CTFVFVE9PVEg6Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkF1ZGlvIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBPdXQiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiR1NNIExpbmUgSW4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiSGVhZHNldCBNaWMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQ2FsbCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBdWRpbyBPdXQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBPdXQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJHU00gTGluZSBJbiIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhlYWRzZXQgTWljIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQ2FsbCBNaWMiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGNvZGVjLCAiQXVkaW8gT3V0Iik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbihjb2RlYywgIkdTTSBMaW5lIE91dCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJHU00gTGluZSBJbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkc2V0IE1pYyIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJDYWxsIE1pYyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkF1ZGlvIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIE91dCIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkdTTSBMaW5lIEluIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHNldCBNaWMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDYWxsIE1pYyIpOwogCX0KIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTAyLDIwICs1MDMsMjEgQEAKIHN0YXRpYyBpbnQgbmVvMTk3M193bTg3NTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnI7CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCiAJLyogc2V0IHVwIE5DIGNvZGVjIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTE9VVDIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUk9VVDIiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiT1VUMyIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJPVVQ0Iik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUxIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIkxJTkUyIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTE9VVDIiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJST1VUMiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJPVVQ0Iik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5FMiIpOwogCiAJLyogQWRkIG5lbzE5NzMgc3BlY2lmaWMgd2lkZ2V0cyAqLwotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIHdtODc1M19kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg3NTNfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh3bTg3NTNfZGFwbV93aWRnZXRzKSk7CiAKIAkvKiBzZXQgZW5kcG9pbnRzIHRvIGRlZmF1bHQgbW9kZSAqLwpAQCAtNTI4LDEwICs1MzAsMTAgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIHNldCB1cCBuZW8xOTczIHNwZWNpZmljIGF1ZGlvIHJvdXRlcyAqLwotCWVyciA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBkYXBtX3JvdXRlcywKKwllcnIgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBkYXBtX3JvdXRlcywKIAkJCQkgICAgICBBUlJBWV9TSVpFKGRhcG1fcm91dGVzKSk7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1Niw3ICs1NTgsNyBAQAogeyAvKiBIaWZpIFBsYXliYWNrIC0gZm9yIHNpbWlsYXRpb3VzIHVzZSB3aXRoIHZvaWNlIGJlbG93ICovCiAJLm5hbWUgPSAiV004NzUzIiwKIAkuc3RyZWFtX25hbWUgPSAiV004NzUzIEhpRmkiLAotCS5wbGF0Zm9ybV9uYW1lID0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKIAkuY3B1X2RhaV9uYW1lID0gInMzYzI0eHgtaTJzIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204NzUzLWhpZmkiLAogCS5jb2RlY19uYW1lID0gIndtODc1My1jb2RlYy4wLTB4MWEiLApAQCAtNTY2LDcgKzU2OCw3IEBACiB7IC8qIFZvaWNlIHZpYSBCVCAqLwogCS5uYW1lID0gIkJsdWV0b290aCIsCiAJLnN0cmVhbV9uYW1lID0gIlZvaWNlIiwKLQkucGxhdGZvcm1fbmFtZSA9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCiAJLmNwdV9kYWlfbmFtZSA9ICJibHVldG9vdGgtZGFpIiwKIAkuY29kZWNfZGFpX25hbWUgPSAid204NzUzLXZvaWNlIiwKIAkuY29kZWNfbmFtZSA9ICJ3bTg3NTMtY29kZWMuMC0weDFhIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYy1wY20uYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3BjbS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1wY20uYwpyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvcGNtLmMKaW5kZXggMmUwMjBlMS4uNDhkMGI3NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3BjbS5jCkBAIC0xLDQgKzEsNCBAQAotLyogc291bmQvc29jL3MzYzI0eHgvczNjLXBjbS5jCisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYwogICoKICAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gUzNDIFBDTS1Db250cm9sbGVyIGRyaXZlcgogICoKQEAgLTI5LDggKzI5LDggQEAKICNpbmNsdWRlIDxwbGF0L2F1ZGlvLmg+CiAjaW5jbHVkZSA8cGxhdC9kbWEuaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKLSNpbmNsdWRlICJzM2MtcGNtLmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAicGNtLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50IHMzY19wY21fZG1hX2NsaWVudF9vdXQgPSB7CiAJLm5hbWUJCT0gIlBDTSBTdGVyZW8gb3V0IgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjLXBjbS5oIGIvc291bmQvc29jL3NhbXN1bmcvcGNtLmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvczNjLXBjbS5oCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9wY20uaAppbmRleCBmNjBiYWExLi4wMzM5M2RjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MtcGNtLmgKKysrIGIvc291bmQvc29jL3NhbXN1bmcvcGNtLmgKQEAgLTEsNCArMSw0IEBACi0vKiAgc291bmQvc29jL3MzYzI0eHgvczNjLXBjbS5oCisvKiAgc291bmQvc29jL3NhbXN1bmcvcGNtLmgKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3JlZ3MtaTJzLXYyLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yZWdzLWkycy12Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9yZWdzLWkycy12Mi5oCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9yZWdzLWkycy12Mi5oCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9yeDE5NTBfdWRhMTM4MC5jIGIvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9yeDE5NTBfdWRhMTM4MC5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCmluZGV4IDQ2OGNjMTEuLmY0MDAyNzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3J4MTk1MF91ZGExMzgwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxzb3VuZC91ZGExMzgwLmg+CiAjaW5jbHVkZSA8c291bmQvamFjay5oPgogCkBAIC0zNSw3ICszNCw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgInMzYzI0eHgtaTJzLmgiCiAjaW5jbHVkZSAiLi4vY29kZWNzL3VkYTEzODAuaCIKIApAQCAtOTUsNyArOTQsNyBAQAogCQkuY3B1X2RhaV9uYW1lCT0gInMzYzI0eHgtaWlzIiwKIAkJLmNvZGVjX2RhaV9uYW1lCT0gInVkYTEzODAtaGlmaSIsCiAJCS5pbml0CQk9IHJ4MTk1MF91ZGExMzgwX2luaXQsCi0JCS5wbGF0Zm9ybV9uYW1lCT0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkJLnBsYXRmb3JtX25hbWUJPSAic2Ftc3VuZy1hdWRpbyIsCiAJCS5jb2RlY19uYW1lCT0gInVkYTEzODAtY29kZWMuMC0wMDFhIiwKIAkJLm9wcwkJPSAmcngxOTUwX29wcywKIAl9LApAQCAtMjI4LDI2ICsyMjcsMjggQEAKIHN0YXRpYyBpbnQgcngxOTUwX3VkYTEzODBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCWludCBlcnI7CiAKIAkvKiBBZGQgcngxOTUwIHNwZWNpZmljIHdpZGdldHMgKi8KLQllcnIgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKKwllcnIgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHVkYTEzODBfZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cykpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB1cCByeDE5NTAgc3BlY2lmaWMgYXVkaW8gcGF0aCBhdWRpb19tYXBuZWN0cyAqLwotCWVyciA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBhdWRpb19tYXAsCisJZXJyID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwLAogCQkJCSAgICAgIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIk1pYyBKYWNrIik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCiAJCSZocF9qYWNrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYy1pMnMtdjIuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MtaTJzLXYyLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYwppbmRleCBiMzg2NmQ1Li4wOTRmMzZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MtaTJzLXYyLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCkBAIC0xLDQgKzEsNCBAQAotLyogc291bmQvc29jL3MzYzI0eHgvczNjLWkyYy12Mi5jCisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJjLXYyLmMKICAqCiAgKiBBTFNBIFNvYyBBdWRpbyBMYXllciAtIEkyUyBjb3JlIGZvciBuZXdlciBTYW1zdW5nIFNvQ3MuCiAgKgpAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAicmVncy1pMnMtdjIuaCIKICNpbmNsdWRlICJzM2MtaTJzLXYyLmgiCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogCiAjdW5kZWYgUzNDX0lJU19WMl9TVVBQT1JURUQKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjLWkycy12Mi5oIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYy1pMnMtdjIuaApyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5oCmluZGV4IGQ0NTgzMDEuLmY4Mjk3ZDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYy1pMnMtdjIuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmgKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zM2MtaTJzLXYyLmgKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuaAogICoKICAqIEFMU0EgU29jIEF1ZGlvIExheWVyIC0gUzNDX0kyU1YyIEkyUyBkcml2ZXIKICAqCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNDEyLWkycy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNDEyLWkycy5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCmluZGV4IDRhODYxY2YuLjdlYTgzNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0MTItaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzI0MTItaTJzLmMKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKICAqCiAgKiBBTFNBIFNvYyBBdWRpbyBMYXllciAtIFMzQzI0MTIgSTJTIGRyaXZlcgogICoKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAKLSNpbmNsdWRlICJzM2MtZG1hLmgiCisjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicmVncy1pMnMtdjIuaCIKICNpbmNsdWRlICJzM2MyNDEyLWkycy5oIgogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNDEyLWkycy5oIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuaApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNDEyLWkycy5oCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5oCmluZGV4IDAxYTA0NzEuLjAyYWQ1NzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0MTItaTJzLmgKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuaApAQCAtMSw0ICsxLDQgQEAKLS8qIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzI0MTItaTJzLmMKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKICAqCiAgKiBBTFNBIFNvYyBBdWRpbyBMYXllciAtIFMzQzI0MTIgSTJTIGRyaXZlcgogICoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtaTJzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtaTJzLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKaW5kZXggZTA2MGRhYS4uMTNlNDFlZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCkBAIC0zOCw3ICszOCw3IEBACiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtaWlzLmg+CiAKLSNpbmNsdWRlICJzM2MtZG1hLmgiCisjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAiczNjMjR4eC1pMnMuaCIKIAogc3RhdGljIHN0cnVjdCBzM2MyNDEwX2RtYV9jbGllbnQgczNjMjR4eF9kbWFfY2xpZW50X291dCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtaTJzLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4LWkycy5oCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5oCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWMuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jCmluZGV4IGM0YzExMTQuLmE0MzQwMzJkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjLmMKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5jCisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5jCiAgKgogICogQ29weXJpZ2h0IDIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKgpAQCAtMTcsMTEgKzE3LDEwIEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAKICNpbmNsdWRlIDxwbGF0L2F1ZGlvLXNpbXRlYy5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgInMzYzI0eHgtaTJzLmgiCiAjaW5jbHVkZSAiczNjMjR4eF9zaW10ZWMuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWMuaCBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjLmgKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWMuaApyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWMuaAppbmRleCBlNjNkNWZmLi44MjcwNzQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5oCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjLmgKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlYy5oCisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlYy5oCiAgKgogICogQ29weXJpZ2h0IDIwMDkgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWNfaGVybWVzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY19oZXJtZXMuYwpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlY19oZXJtZXMuYwpyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfaGVybWVzLmMKaW5kZXggZjg4NDUzNy4uYmI0MjkyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWNfaGVybWVzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfaGVybWVzLmMKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3NpbXRlY19oZXJtZXMuYworLyogc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfaGVybWVzLmMKICAqCiAgKiBDb3B5cmlnaHQgMjAwOSBTaW10ZWMgRWxlY3Ryb25pY3MKICAqCkBAIC0xNCwxNiArMTQsMTMgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgPHBsYXQvYXVkaW8tc2ltdGVjLmg+CiAKLSNpbmNsdWRlICJzM2MtZG1hLmgiCisjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAiczNjMjR4eC1pMnMuaCIKICNpbmNsdWRlICJzM2MyNHh4X3NpbXRlYy5oIgogCi0jaW5jbHVkZSAiLi4vY29kZWNzL3RsdjMyMGFpYzN4LmgiCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBkYXBtX3dpZGdldHNbXSA9IHsKIAlTTkRfU09DX0RBUE1fTElORSgiR1NNIE91dCIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9MSU5FKCJHU00gSW4iLCBOVUxMKSwKQEAgLTc2LDE5ICs3MywyMCBAQAogc3RhdGljIGludCBzaW10ZWNfaGVybWVzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoY29kZWMsIGRhcG1fd2lkZ2V0cywKKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIGRhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUoZGFwbV93aWRnZXRzKSk7CiAKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhjb2RlYywgYmFzZV9tYXAsIEFSUkFZX1NJWkUoYmFzZV9tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOwogCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTGluZSBJbiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTGluZSBPdXQiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIk1pYyBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkhlYWRwaG9uZSBKYWNrIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmUgSW4iKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBPdXQiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTWljIEphY2siKTsKIAogCXNpbXRlY19hdWRpb19pbml0KHJ0ZCk7Ci0Jc25kX3NvY19kYXBtX3N5bmMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05OSw3ICs5Nyw3IEBACiAJLmNvZGVjX25hbWUJPSAidGx2MzIwYWljM3gtY29kZWMuMC0weDFhIiwKIAkuY3B1X2RhaV9uYW1lCT0gInMzYzI0eHgtaTJzIiwKIAkuY29kZWNfZGFpX25hbWUgPSAidGx2MzIwYWljM3gtaGlmaSIsCi0JLnBsYXRmb3JtX25hbWUJPSAiczNjMjR4eC1wY20tYXVkaW8iLAorCS5wbGF0Zm9ybV9uYW1lCT0gInNhbXN1bmctYXVkaW8iLAogCS5pbml0CQk9IHNpbXRlY19oZXJtZXNfaW5pdCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY190bHYzMjBhaWMyMy5jCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfc2ltdGVjX3RsdjMyMGFpYzIzLmMKaW5kZXggYzA5Njc1OS4uZmJiYTRlMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3NpbXRlY190bHYzMjBhaWMyMy5jCkBAIC0xLDQgKzEsNCBAQAotLyogc291bmQvc29jL3MzYzI0eHgvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYworLyogc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF9zaW10ZWNfdGx2MzIwYWljMjMuYwogICoKICAqIENvcHlyaWdodCAyMDA5IFNpbXRlYyBFbGVjdHJvbmljcwogICoKQEAgLTE0LDExICsxNCwxMCBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCiAjaW5jbHVkZSA8cGxhdC9hdWRpby1zaW10ZWMuaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKKyNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJzM2MyNHh4LWkycy5oIgogI2luY2x1ZGUgInMzYzI0eHhfc2ltdGVjLmgiCiAKQEAgLTY1LDE5ICs2NCwyMCBAQAogc3RhdGljIGludCBzaW10ZWNfdGx2MzIwYWljMjNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhjb2RlYywgZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgZGFwbV93aWRnZXRzLAogCQkJCSAgQVJSQVlfU0laRShkYXBtX3dpZGdldHMpKTsKIAotCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGNvZGVjLCBiYXNlX21hcCwgQVJSQVlfU0laRShiYXNlX21hcCkpOworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGJhc2VfbWFwLCBBUlJBWV9TSVpFKGJhc2VfbWFwKSk7CiAKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgIkhlYWRwaG9uZSBKYWNrIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJMaW5lIEluIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJMaW5lIE91dCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCAiTWljIEphY2siKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZSBJbiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lIE91dCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJNaWMgSmFjayIpOwogCiAJc2ltdGVjX2F1ZGlvX2luaXQocnRkKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg4LDcgKzg4LDcgQEAKIAkuY29kZWNfbmFtZQk9ICJ0bHYzMjBhaWMzeC1jb2RlYy4wLTB4MWEiLAogCS5jcHVfZGFpX25hbWUJPSAiczNjMjR4eC1pMnMiLAogCS5jb2RlY19kYWlfbmFtZSA9ICJ0bHYzMjBhaWMzeC1oaWZpIiwKLQkucGxhdGZvcm1fbmFtZQk9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJLnBsYXRmb3JtX25hbWUJPSAic2Ftc3VuZy1hdWRpbyIsCiAJLmluaXQJCT0gc2ltdGVjX3RsdjMyMGFpYzIzX2luaXQsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3VkYTEzNHguYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHhfdWRhMTM0eC5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3VkYTEzNHguYwppbmRleCBiZDQ4ZmZiLi5jZGM4ZWNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4X3VkYTEzNHguYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4X3VkYTEzNHguYwpAQCAtMTgsMTMgKzE4LDEyIEBACiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvczNjMjR4eF91ZGExMzR4Lmg+CiAjaW5jbHVkZSA8c291bmQvdWRhMTM0eC5oPgogCiAjaW5jbHVkZSA8cGxhdC9yZWdzLWlpcy5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgorI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgInMzYzI0eHgtaTJzLmgiCiAjaW5jbHVkZSAiLi4vY29kZWNzL3VkYTEzNHguaCIKIApAQCAtMjMxLDcgKzIzMCw3IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInVkYTEzNHgtaGlmaSIsCiAJLmNwdV9kYWlfbmFtZSA9ICJzM2MyNHh4LWkycyIsCiAJLm9wcyA9ICZzM2MyNHh4X3VkYTEzNHhfb3BzLAotCS5wbGF0Zm9ybV9uYW1lCT0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkucGxhdGZvcm1fbmFtZQk9ICJzYW1zdW5nLWF1ZGlvIiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfczNjMjR4eF91ZGExMzR4ID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvc21hcnRxX3dtODk4Ny5jIGIvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCnNpbWlsYXJpdHkgaW5kZXggODIlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3NtYXJ0cV93bTg5ODcuYwpyZW5hbWUgdG8gc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCmluZGV4IGRkMjBjYTcuLjYxZTJiNTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3NtYXJ0cV93bTg5ODcuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zbWFydHFfd204OTg3LmMKKy8qIHNvdW5kL3NvYy9zYW1zdW5nL3NtYXJ0cV93bTg5ODcuYwogICoKICAqIENvcHlyaWdodCAyMDEwIE1hdXJ1cyBDdWVsZW5hZXJlIDxtY3VlbGVuYWVyZUBnbWFpbC5jb20+CiAgKgpAQCAtMTksMTMgKzE5LDEzIEBACiAKICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgotI2luY2x1ZGUgInMzYzY0eHgtaTJzLmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiaTJzLmgiCiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NzUwLmgiCiAKQEAgLTM5LDE1ICszOSwxMSBAQAogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+ZGFpLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5kYWktPmNwdV9kYWk7Ci0Jc3RydWN0IHMzY19pMnN2Ml9yYXRlX2NhbGMgZGl2OworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCXVuc2lnbmVkIGludCBjbGsgPSAwOwogCWludCByZXQ7CiAKLQlzM2NfaTJzdjJfaWlzX2NhbGNfcmF0ZSgmZGl2LCBOVUxMLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAotCQkJCXMzY19pMnN2Ml9nZXRfY2xvY2soY3B1X2RhaSkpOwotCiAJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CiAJY2FzZSA4MDAwOgogCWNhc2UgMTYwMDA6CkBAIC03OCwyMyArNzQsMjQgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIFVzZSBQQ0xLIGZvciBJMlMgc2lnbmFsIGdlbmVyYXRpb24gKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIFNBTVNVTkdfSTJTX1JDTEtTUkNfMCwKKwkJCQkJMCwgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBHYXRlIHRoZSBSQ0xLIG91dHB1dCBvbiBQQUQgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNwdV9kYWksIFNBTVNVTkdfSTJTX0NEQ0xLLAorCQkJCQkwLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCS8qIHNldCB0aGUgY29kZWMgc3lzdGVtIGNsb2NrIGZvciBEQUMgYW5kIEFEQyAqLwogCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg3NTBfU1lTQ0xLLCBjbGssCiAJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIHNldCBNQ0xLIGRpdmlzaW9uIGZvciBzYW1wbGUgcmF0ZSAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgUzNDX0kyU1YyX0RJVl9SQ0xLLCBkaXYuZnNfZGl2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHNldCBwcmVzY2FsZXIgZGl2aXNpb24gZm9yIHNhbXBsZSByYXRlICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2Nsa2RpdihjcHVfZGFpLCBTM0NfSTJTVjJfRElWX1BSRVNDQUxFUiwKLQkJCQkgICAgIGRpdi5jbGtfZGl2IC0gMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2LDEyICsxNTMsMTQgQEAKIAl7IkxJTlBVVDIiLCBOVUxMLCAiTWljIEJpYXMifSwKIH07CiAKLXN0YXRpYyBpbnQgc21hcnRxX3dtODk4N19pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgc21hcnRxX3dtODk4N19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAJaW50IGVyciA9IDA7CiAKIAkvKiBBZGQgU21hcnRRIHNwZWNpZmljIHdpZGdldHMgKi8KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCB3bTg5ODdfZGFwbV93aWRnZXRzLAorCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgd204OTg3X2RhcG1fd2lkZ2V0cywKIAkJCQkgIEFSUkFZX1NJWkUod204OTg3X2RhcG1fd2lkZ2V0cykpOwogCiAJLyogYWRkIFNtYXJ0USBzcGVjaWZpYyBjb250cm9scyAqLwpAQCAtMTcyLDI1ICsxNzEsMjUgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIHNldHVwIFNtYXJ0USBzcGVjaWZpYyBhdWRpbyBwYXRoICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAkvKiBzZXQgZW5kcG9pbnRzIHRvIG5vdCBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiTElOUFVUMSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oY29kZWMsICJSSU5QVVQxIik7Ci0Jc25kX3NvY19kYXBtX25jX3Bpbihjb2RlYywgIk9VVDMiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGNvZGVjLCAiUk9VVDEiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJMSU5QVVQxIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiUklOUFVUMSIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk9VVDMiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJST1VUMSIpOwogCiAJLyogc2V0IGVuZHBvaW50cyB0byBkZWZhdWx0IG9mZiBtb2RlICovCi0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJJbnRlcm5hbCBTcGVha2VyIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oY29kZWMsICJJbnRlcm5hbCBNaWMiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsICJIZWFkcGhvbmUgSmFjayIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJbnRlcm5hbCBTcGVha2VyIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkludGVybmFsIE1pYyIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lIEphY2siKTsKIAotCWVyciA9IHNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwllcnIgPSBzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCi0JZXJyID0gc25kX3NvY19qYWNrX25ldygmc25kX3NvY19zbWFydHEsICJIZWFkcGhvbmUgSmFjayIsCisJZXJyID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwKIAkJCSAgICAgICBTTkRfSkFDS19IRUFEUEhPTkUsICZzbWFydHFfamFjayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTIxMSw5ICsyMTAsOSBAQAogCXsKIAkJLm5hbWUJCT0gIndtODk4NyIsCiAJCS5zdHJlYW1fbmFtZQk9ICJTbWFydFEgSGktRmkiLAotCQkuY3B1X2RhaV9uYW1lCT0gInMzYzY0eHgtaTJzLjAiLAorCQkuY3B1X2RhaV9uYW1lCT0gInNhbXN1bmctaTJzLjAiLAogCQkuY29kZWNfZGFpX25hbWUJPSAid204NzUwLWhpZmkiLAotCQkucGxhdGZvcm1fbmFtZQk9ICJzM2MyNHh4LXBjbS1hdWRpbyIsCisJCS5wbGF0Zm9ybV9uYW1lCT0gInNhbXN1bmctYXVkaW8iLAogCQkuY29kZWNfbmFtZQk9ICJ3bTg3NTAtY29kZWMuMC0weDFhIiwKIAkJLmluaXQJCT0gc21hcnRxX3dtODk4N19pbml0LAogCQkub3BzCQk9ICZzbWFydHFfaGlmaV9vcHMsCkBAIC0yNzUsNiArMjc0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHNtYXJ0cV9leGl0KHZvaWQpCiB7CisJZ3Bpb19mcmVlKFMzQzY0WFhfR1BLKDEyKSk7CiAJc25kX3NvY19qYWNrX2ZyZWVfZ3Bpb3MoJnNtYXJ0cV9qYWNrLCBBUlJBWV9TSVpFKHNtYXJ0cV9qYWNrX2dwaW9zKSwKIAkJCQlzbWFydHFfamFja19ncGlvcyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3NtZGsyNDQzX3dtOTcxMC5jIGIvc291bmQvc29jL3NhbXN1bmcvc21kazI0NDNfd205NzEwLmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvc21kazI0NDNfd205NzEwLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3NtZGsyNDQzX3dtOTcxMC5jCmluZGV4IDQ2MTMyODguLjNiZTdlN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zM2MyNHh4L3NtZGsyNDQzX3dtOTcxMC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGsyNDQzX3dtOTcxMC5jCkBAIC0xNywxMCArMTcsOSBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCi0jaW5jbHVkZSAiczNjLWRtYS5oIgotI2luY2x1ZGUgInMzYy1hYzk3LmgiCisjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAiYWM5Ny5oIgogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbWRrMjQ0MzsKIApAQCAtMjgsMTAgKzI3LDEwIEBACiB7CiAJLm5hbWUgPSAiQUM5NyIsCiAJLnN0cmVhbV9uYW1lID0gIkFDOTcgSGlGaSIsCi0JLmNwdV9kYWlfbmFtZSA9ICJzM2MtYWM5NyIsCisJLmNwdV9kYWlfbmFtZSA9ICJzYW1zdW5nLWFjOTciLAogCS5jb2RlY19kYWlfbmFtZSA9ICJhYzk3LWhpZmkiLAogCS5jb2RlY19uYW1lID0gImFjOTctY29kZWMiLAotCS5wbGF0Zm9ybV9uYW1lID0gInMzYzI0eHgtcGNtLWF1ZGlvIiwKKwkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKIH0sCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zbWRrX3NwZGlmLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gc291bmQvc29jL3MzYzI0eHgvc21ka19zcGRpZi5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3NwZGlmLmMKaW5kZXggYzhiZDkwNC4uYjVjM2ZhZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvc21ka19zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfc3BkaWYuYwpAQCAtMTgsNyArMTgsNyBAQAogCiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKLSNpbmNsdWRlICJzM2MtZG1hLmgiCisjaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAic3BkaWYuaCIKIAogLyogQXVkaW8gY2xvY2sgc2V0dGluZ3MgYXJlIGJlbG9uZ2VkIHRvIGJvYXJkIHNwZWNpZmljIHBhcnQuIEV2ZXJ5CkBAIC0yOCw3ICsyOCw3IEBACiBzdGF0aWMgaW50IHNldF9hdWRpb19jbG9ja19oZWlyYWNoeShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBjbGsgKmZvdXRfZXBsbCwgKm1vdXRfZXBsbCwgKnNjbGtfYXVkaW8wLCAqc2Nsa19zcGRpZjsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJZm91dF9lcGxsID0gY2xrX2dldChOVUxMLCAiZm91dF9lcGxsIik7CiAJaWYgKElTX0VSUihmb3V0X2VwbGwpKSB7CkBAIC02MSw3ICs2MSw3IEBACiAJCWdvdG8gb3V0MzsKIAl9CiAKLQkvKiBTZXQgYXVkaW8gY2xvY2sgaGVpcmFjaHkgZm9yIFMvUERJRiAqLworCS8qIFNldCBhdWRpbyBjbG9jayBoaWVyYXJjaHkgZm9yIFMvUERJRiAqLwogCWNsa19zZXRfcGFyZW50KG1vdXRfZXBsbCwgZm91dF9lcGxsKTsKIAljbGtfc2V0X3BhcmVudChzY2xrX2F1ZGlvMCwgbW91dF9lcGxsKTsKIAljbGtfc2V0X3BhcmVudChzY2xrX3NwZGlmLCBzY2xrX2F1ZGlvMCk7CkBAIC03OSw3ICs3OSw3IEBACiAKIC8qIFdlIHNob3VsZCBoYXZlZCB0byBzZXQgY2xvY2sgZGlyZWN0bHkgb24gdGhpcyBwYXJ0IGJlY2F1c2Ugb2YgY2xvY2sKICAqIHNjaGVtZSBvZiBTYW1zdWRuZyBTb0NzIGRpZCBub3Qgc3VwcG9ydCB0byBzZXQgcmF0ZXMgZnJvbSBhYnN0cmN0Ci0gKiBjbG9jayBvZiBpdCdzIGhlaXJhY2h5LgorICogY2xvY2sgb2YgaXQncyBoaWVyYXJjaHkuCiAgKi8KIHN0YXRpYyBpbnQgc2V0X2F1ZGlvX2Nsb2NrX3JhdGUodW5zaWduZWQgbG9uZyBlcGxsX3JhdGUsCiAJCQkJdW5zaWduZWQgbG9uZyBhdWRpb19yYXRlKQpAQCAtMTUyLDEyICsxNTIsMTAgQEAKIAkuaHdfcGFyYW1zID0gc21ka19od19wYXJhbXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbWRrOwotCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgc21ka19kYWkgPSB7CiAJLm5hbWUgPSAiUy9QRElGIiwKIAkuc3RyZWFtX25hbWUgPSAiUy9QRElGIFBDTSBQbGF5YmFjayIsCi0JLnBsYXRmb3JtX25hbWUgPSAiczNjMjR4eC1wY20tYXVkaW8iLAorCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAogCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1zcGRpZiIsCiAJLmNvZGVjX2RhaV9uYW1lID0gImRpdC1oaWZpIiwKIAkuY29kZWNfbmFtZSA9ICJzcGRpZi1kaXQiLApAQCAtMTgzLDcgKzE4MSw3IEBACiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNtZGtfc25kX3NwZGlmX2RpdF9kZXZpY2UpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnIxOwogCiAJc21ka19zbmRfc3BkaWZfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7CiAJaWYgKCFzbWRrX3NuZF9zcGRpZl9kZXZpY2UpIHsKQEAgLTE5NSwxNyArMTkzLDIxIEBACiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNtZGtfc25kX3NwZGlmX2RldmljZSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnIxOworCQlnb3RvIGVycjM7CiAKLQkvKiBTZXQgYXVkaW8gY2xvY2sgaGVpcmFjaHkgbWFudWFsbHkgKi8KKwkvKiBTZXQgYXVkaW8gY2xvY2sgaGllcmFyY2h5IG1hbnVhbGx5ICovCiAJcmV0ID0gc2V0X2F1ZGlvX2Nsb2NrX2hlaXJhY2h5KHNtZGtfc25kX3NwZGlmX2RldmljZSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnIxOworCQlnb3RvIGVycjQ7CiAKIAlyZXR1cm4gMDsKLWVycjE6CitlcnI0OgorCXBsYXRmb3JtX2RldmljZV9kZWwoc21ka19zbmRfc3BkaWZfZGV2aWNlKTsKK2VycjM6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChzbWRrX3NuZF9zcGRpZl9kZXZpY2UpOwogZXJyMjoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNtZGtfc25kX3NwZGlmX2RpdF9kZXZpY2UpOworZXJyMToKIAlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNtZGtfc25kX3NwZGlmX2RpdF9kZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CkBAIC0yMTMsNiArMjE1LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzbWRrX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzbWRrX3NuZF9zcGRpZl9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNtZGtfc25kX3NwZGlmX2RpdF9kZXZpY2UpOwogfQogCiBtb2R1bGVfaW5pdChzbWRrX2luaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjZmYxYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgc21ka193bTg1ODAuYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTHRkCisgKiAgQXV0aG9yOiBKYXN3aW5kZXIgU2luZ2ggPGphc3NpLmJyYXJAc2Ftc3VuZy5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29kZWNzL3dtODU4MC5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImkycy5oIgorCisvKgorICogRGVmYXVsdCBDRkcgc3dpdGNoIHNldHRpbmdzIHRvIHVzZSB0aGlzIGRyaXZlcjoKKyAqCisgKiAgIFNNREs2NDEwOiBTZXQgQ0ZHMSAxLTMgT2ZmLCBDRkcyIDEtNCBPbgorICovCisKKy8qIFNNREsgaGFzIGEgMTJNSFogY3J5c3RhbCBhdHRhY2hlZCB0byBXTTg1ODAgKi8KKyNkZWZpbmUgU01ES19XTTg1ODBfRlJFUSAxMjAwMDAwMAorCitzdGF0aWMgaW50IHNtZGtfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwl1bnNpZ25lZCBpbnQgcGxsX291dDsKKwlpbnQgYmZzLCByZnMsIHJldDsKKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1U4OgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoKKwkJYmZzID0gMTY7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VMTZfTEU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYmZzID0gMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFRoZSBGdmNvIGZvciBXTTg1ODAgUExMcyBtdXN0IGZhbGwgd2l0aGluIFs5MCwxMDBdTUh6LgorCSAqIFRoaXMgY3JpdGVyaW9uIGNhbid0IGJlIG1ldCBpZiB3ZSByZXF1ZXN0IFBMTCBvdXRwdXQKKwkgKiBhcyB7ODAwMHgyNTYsIDY0MDAweDI1NiwgMTEwMjV4MjU2fUh6LgorCSAqIEFzIGEgd2F5b3V0LCB3ZSByYXRoZXIgY2hhbmdlIHJmcyB0byBhIG1pbmltdW0gdmFsdWUgdGhhdAorCSAqIHJlc3VsdHMgaW4gKHBhcmFtc19yYXRlKHBhcmFtcykgKiByZnMpLCBhbmQgaXRzZWxmLCBhY2NlcHRhYmxlCisJICogdG8gYm90aCAtIHRoZSBDT0RFQyBhbmQgdGhlIENQVS4KKwkgKi8KKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDE2MDAwOgorCWNhc2UgMjIwNTA6CisJY2FzZSAzMjAwMDoKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA4ODIwMDoKKwljYXNlIDk2MDAwOgorCQlyZnMgPSAyNTY7CisJCWJyZWFrOworCWNhc2UgNjQwMDA6CisJCXJmcyA9IDM4NDsKKwkJYnJlYWs7CisJY2FzZSA4MDAwOgorCWNhc2UgMTEwMjU6CisJCXJmcyA9IDUxMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBsbF9vdXQgPSBwYXJhbXNfcmF0ZShwYXJhbXMpICogcmZzOworCisJLyogU2V0IHRoZSBDb2RlYyBEQUkgY29uZmlndXJhdGlvbiAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgdGhlIEFQIERBSSBjb25maWd1cmF0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgV004NTgwIHRvIGRyaXZlIE1DTEsgZnJvbSBpdHMgUExMQSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY29kZWNfZGFpLCBXTTg1ODBfTUNMSywKKwkJCQkJV004NTgwX0NMS1NSQ19QTExBKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCBXTTg1ODBfUExMQSwgMCwKKwkJCQkJU01ES19XTTg1ODBfRlJFUSwgcGxsX291dCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgV004NTgwX0NMS1NSQ19QTExBLAorCQkJCSAgICAgcGxsX291dCwgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNNREsgV004NTgwIERBSSBvcGVyYXRpb25zLgorICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHNtZGtfb3BzID0geworCS5od19wYXJhbXMgPSBzbWRrX2h3X3BhcmFtcywKK307CisKKy8qIFNNREsgUGxheWJhY2sgd2lkZ2V0cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODU4MF9kYXBtX3dpZGdldHNfcGJrW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJGcm9udCIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9IUCgiQ2VudGVyK1N1YiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9IUCgiUmVhciIsIE5VTEwpLAorfTsKKworLyogU01ESyBDYXB0dXJlIHdpZGdldHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg1ODBfZGFwbV93aWRnZXRzX2NwdFtdID0geworCVNORF9TT0NfREFQTV9NSUMoIk1pY0luIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmVJbiIsIE5VTEwpLAorfTsKKworLyogU01ESy1QQUlGVFggY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF90eFtdID0geworCS8qIE1pY0luIGZlZWRzIEFJTkwgKi8KKwl7IkFJTkwiLCBOVUxMLCAiTWljSW4ifSwKKworCS8qIExpbmVJbiBmZWVkcyBBSU5ML1IgKi8KKwl7IkFJTkwiLCBOVUxMLCAiTGluZUluIn0sCisJeyJBSU5SIiwgTlVMTCwgIkxpbmVJbiJ9LAorfTsKKworLyogU01ESy1QQUlGUlggY29ubmVjdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcF9yeFtdID0geworCS8qIEZyb250IExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUMUwvUiAqLworCXsiRnJvbnQiLCBOVUxMLCAiVk9VVDFMIn0sCisJeyJGcm9udCIsIE5VTEwsICJWT1VUMVIifSwKKworCS8qIENlbnRlci9TdWIgYXJlIGZlZCBWT1VUMkwvUiAqLworCXsiQ2VudGVyK1N1YiIsIE5VTEwsICJWT1VUMkwifSwKKwl7IkNlbnRlcitTdWIiLCBOVUxMLCAiVk9VVDJSIn0sCisKKwkvKiBSZWFyIExlZnQvUmlnaHQgYXJlIGZlZCBWT1VUM0wvUiAqLworCXsiUmVhciIsIE5VTEwsICJWT1VUM0wifSwKKwl7IlJlYXIiLCBOVUxMLCAiVk9VVDNSIn0sCit9OworCitzdGF0aWMgaW50IHNtZGtfd204NTgwX2luaXRfcGFpZnR4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwkvKiBBZGQgc21kayBzcGVjaWZpYyBDYXB0dXJlIHdpZGdldHMgKi8KKwlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIHdtODU4MF9kYXBtX3dpZGdldHNfY3B0LAorCQkJCSAgQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzX2NwdCkpOworCisJLyogU2V0IHVwIFBBSUZUWCBhdWRpbyBwYXRoICovCisJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgYXVkaW9fbWFwX3R4LCBBUlJBWV9TSVpFKGF1ZGlvX21hcF90eCkpOworCisJLyogRW5hYmxpbmcgdGhlIG1pY3JvcGhvbmUgcmVxdWlyZXMgdGhlIGZpdHRpbmcgb2YgYSAwUgorCSAqIHJlc2lzdG9yIHRvIGNvbm5lY3QgdGhlIGxpbmUgZnJvbSB0aGUgbWljcm9waG9uZSBqYWNrLgorCSAqLworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljSW4iKTsKKworCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtZGtfd204NTgwX2luaXRfcGFpZnJ4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwkvKiBBZGQgc21kayBzcGVjaWZpYyBQbGF5YmFjayB3aWRnZXRzICovCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCB3bTg1ODBfZGFwbV93aWRnZXRzX3BiaywKKwkJCQkgIEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0c19wYmspKTsKKworCS8qIFNldCB1cCBQQUlGUlggYXVkaW8gcGF0aCAqLworCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGF1ZGlvX21hcF9yeCwgQVJSQVlfU0laRShhdWRpb19tYXBfcngpKTsKKworCS8qIHNpZ25hbCBhIERBUE0gZXZlbnQgKi8KKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKworCXJldHVybiAwOworfQorCitlbnVtIHsKKwlQUklfUExBWUJBQ0sgPSAwLAorCVBSSV9DQVBUVVJFLAorCVNFQ19QTEFZQkFDSywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBzbWRrX2RhaVtdID0geworCVtQUklfUExBWUJBQ0tdID0geyAvKiBQcmltYXJ5IFBsYXliYWNrIGkvZiAqLworCQkubmFtZSA9ICJXTTg1ODAgUEFJRiBSWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1pMnMuMCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg1ODAtaGlmaS1wbGF5YmFjayIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmluaXQgPSBzbWRrX3dtODU4MF9pbml0X3BhaWZyeCwKKwkJLm9wcyA9ICZzbWRrX29wcywKKwl9LAorCVtQUklfQ0FQVFVSRV0gPSB7IC8qIFByaW1hcnkgQ2FwdHVyZSBpL2YgKi8KKwkJLm5hbWUgPSAiV004NTgwIFBBSUYgVFgiLAorCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1pMnMuMCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg1ODAtaGlmaS1jYXB0dXJlIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic2Ftc3VuZy1hdWRpbyIsCisJCS5jb2RlY19uYW1lID0gIndtODU4MC1jb2RlYy4wLTAwMWIiLAorCQkuaW5pdCA9IHNtZGtfd204NTgwX2luaXRfcGFpZnR4LAorCQkub3BzID0gJnNtZGtfb3BzLAorCX0sCisJW1NFQ19QTEFZQkFDS10gPSB7IC8qIFNlY19GaWZvIFBsYXliYWNrIGkvZiAqLworCQkubmFtZSA9ICJTZWNfRklGTyBUWCIsCisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1pMnMueCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg1ODAtaGlmaS1wbGF5YmFjayIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg1ODAtY29kZWMuMC0wMDFiIiwKKwkJLmluaXQgPSBzbWRrX3dtODU4MF9pbml0X3BhaWZyeCwKKwkJLm9wcyA9ICZzbWRrX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc21kayA9IHsKKwkubmFtZSA9ICJTTURLLUkyUyIsCisJLmRhaV9saW5rID0gc21ka19kYWksCisJLm51bV9saW5rcyA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21ka19zbmRfZGV2aWNlOworCitzdGF0aWMgaW50IF9faW5pdCBzbWRrX2F1ZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWNoYXIgKnN0cjsKKworCWlmIChtYWNoaW5lX2lzX3NtZGtjMTAwKCkgfHwgbWFjaGluZV9pc19zbWRrNjQ0MigpCisJCQl8fCBtYWNoaW5lX2lzX3NtZGt2MjEwKCkgfHwgbWFjaGluZV9pc19zbWRrYzExMCgpKSB7CisJCXNtZGsubnVtX2xpbmtzID0gMzsKKwkJLyogU2Vjb25kYXJ5IGlzIGF0IG9mZnNldCBTQU1TVU5HX0kyU19TRUNPRkYgZnJvbSBQcmltYXJ5ICovCisJCXN0ciA9IChjaGFyICopc21ka19kYWlbU0VDX1BMQVlCQUNLXS5jcHVfZGFpX25hbWU7CisJCXN0cltzdHJsZW4oc3RyKSAtIDFdID0gJzAnICsgU0FNU1VOR19JMlNfU0VDT0ZGOworCX0gZWxzZSBpZiAobWFjaGluZV9pc19zbWRrNjQxMCgpKSB7CisJCXN0ciA9IChjaGFyICopc21ka19kYWlbUFJJX1BMQVlCQUNLXS5jcHVfZGFpX25hbWU7CisJCXN0cltzdHJsZW4oc3RyKSAtIDFdID0gJzInOworCQlzdHIgPSAoY2hhciAqKXNtZGtfZGFpW1BSSV9DQVBUVVJFXS5jcHVfZGFpX25hbWU7CisJCXN0cltzdHJsZW4oc3RyKSAtIDFdID0gJzInOworCX0KKworCXNtZGtfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghc21ka19zbmRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHNtZGtfc25kX2RldmljZSwgJnNtZGspOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc21ka19zbmRfZGV2aWNlKTsKKworCWlmIChyZXQpCisJCXBsYXRmb3JtX2RldmljZV9wdXQoc21ka19zbmRfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChzbWRrX2F1ZGlvX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc21ka19hdWRpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc21ka19zbmRfZGV2aWNlKTsKK30KK21vZHVsZV9leGl0KHNtZGtfYXVkaW9fZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphc3dpbmRlciBTaW5naCwgamFzc2kuYnJhckBzYW1zdW5nLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTTURLIFdNODU4MCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjMTAwOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiAgc21ka193bTg5OTQuYworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICIuLi9jb2RlY3Mvd204OTk0LmgiCisKKyAvKgorICAqIERlZmF1bHQgQ0ZHIHN3aXRjaCBzZXR0aW5ncyB0byB1c2UgdGhpcyBkcml2ZXI6CisgICoJU01ES1YzMTA6IENGRzUtMTAwMCwgQ0ZHNy0xMTExMTEKKyAgKi8KKworIC8qCisgICogQ29uZmlndXJlIGF1ZGlvIHJvdXRlIGFzIDotCisgICogJCBhbWl4ZXIgc3NldCAnREFDMScgb24sb24KKyAgKiAkIGFtaXhlciBzc2V0ICdSaWdodCBIZWFkcGhvbmUgTXV4JyAnREFDJworICAqICQgYW1peGVyIHNzZXQgJ0xlZnQgSGVhZHBob25lIE11eCcgJ0RBQycKKyAgKiAkIGFtaXhlciBzc2V0ICdEQUMxUiBNaXhlciBBSUYxLjEnIG9uCisgICogJCBhbWl4ZXIgc3NldCAnREFDMUwgTWl4ZXIgQUlGMS4xJyBvbgorICAqICQgYW1peGVyIHNzZXQgJ0lOMkwnIG9uCisgICogJCBhbWl4ZXIgc3NldCAnSU4yTCBQR0EgSU4yTE4nIG9uCisgICogJCBhbWl4ZXIgc3NldCAnTUlYSU5MIElOMkwnIG9uCisgICogJCBhbWl4ZXIgc3NldCAnQUlGMUFEQzFMIE1peGVyIEFEQy9ETUlDJyBvbgorICAqICQgYW1peGVyIHNzZXQgJ0lOMlInIG9uCisgICogJCBhbWl4ZXIgc3NldCAnSU4yUiBQR0EgSU4yUk4nIG9uCisgICogJCBhbWl4ZXIgc3NldCAnTUlYSU5SIElOMlInIG9uCisgICogJCBhbWl4ZXIgc3NldCAnQUlGMUFEQzFSIE1peGVyIEFEQy9ETUlDJyBvbgorICAqLworCisvKiBTTURLIGhhcyBhIDE2LjkzNE1IWiBjcnlzdGFsIGF0dGFjaGVkIHRvIFdNODk5NCAqLworI2RlZmluZSBTTURLX1dNODk5NF9GUkVRIDE2OTM0MDAwCisKK3N0YXRpYyBpbnQgc21ka19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCXVuc2lnbmVkIGludCBwbGxfb3V0OworCWludCByZXQ7CisKKwkvKiBBSUYxQ0xLIHNob3VsZCBiZSA+PTNNSHogZm9yIG9wdGltYWwgcGVyZm9ybWFuY2UgKi8KKwlpZiAocGFyYW1zX3JhdGUocGFyYW1zKSA9PSA4MDAwIHx8IHBhcmFtc19yYXRlKHBhcmFtcykgPT0gMTEwMjUpCisJCXBsbF9vdXQgPSBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyOworCWVsc2UKKwkJcGxsX291dCA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTY7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNvZGVjX2RhaSwgU05EX1NPQ19EQUlGTVRfSTJTCisJCQkJCSB8IFNORF9TT0NfREFJRk1UX05CX05GCisJCQkJCSB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9JMlMKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKKwkJCQkJIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgV004OTk0X0ZMTDEsIFdNODk5NF9GTExfU1JDX01DTEsxLAorCQkJCQlTTURLX1dNODk5NF9GUkVRLCBwbGxfb3V0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBXTTg5OTRfU1lTQ0xLX0ZMTDEsCisJCQkJCXBsbF9vdXQsIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTTURLIFdNODk5NCBEQUkgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBzbWRrX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gc21ka19od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IHNtZGtfd204OTk0X2luaXRfcGFpZnR4KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CisKKwkvKiBIZWFkUGhvbmUgKi8KKwlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBPVVQxUiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJIUE9VVDFMIik7CisKKwkvKiBNaWNJbiAqLworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJTjFMTiIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJJTjFSTiIpOworCisJLyogTGluZUluICovCisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIklOMkxOIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIklOMlJOIik7CisKKwkvKiBPdGhlciBwaW5zIE5DICovCisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSFBPVVQyUCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkhQT1VUMk4iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJTUEtPVVRMTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIlNQS09VVExQIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiU1BLT1VUUlAiKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJTUEtPVVRSTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkVPVVQxTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkVPVVQxUCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkVPVVQyTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIkxJTkVPVVQyUCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIklOMUxQIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSU4yTFA6VlhSTiIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIklOMVJQIik7CisJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiSU4yUlA6VlhSUCIpOworCisJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNtZGtfZGFpW10gPSB7CisJeyAvKiBQcmltYXJ5IERBSSBpL2YgKi8KKwkJLm5hbWUgPSAiV004OTk0IEFJRjEiLAorCQkuc3RyZWFtX25hbWUgPSAiUHJpX0RhaSIsCisJCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1pMnMuMCIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg5OTQtYWlmMSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAorCQkuY29kZWNfbmFtZSA9ICJ3bTg5OTQtY29kZWMiLAorCQkuaW5pdCA9IHNtZGtfd204OTk0X2luaXRfcGFpZnR4LAorCQkub3BzID0gJnNtZGtfb3BzLAorCX0sIHsgLyogU2VjX0ZpZm8gUGxheWJhY2sgaS9mICovCisJCS5uYW1lID0gIlNlY19GSUZPIFRYIiwKKwkJLnN0cmVhbV9uYW1lID0gIlNlY19EYWkiLAorCQkuY3B1X2RhaV9uYW1lID0gInNhbXN1bmctaTJzLjQiLAorCQkuY29kZWNfZGFpX25hbWUgPSAid204OTk0LWFpZjEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzYW1zdW5nLWF1ZGlvIiwKKwkJLmNvZGVjX25hbWUgPSAid204OTk0LWNvZGVjIiwKKwkJLm9wcyA9ICZzbWRrX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc21kayA9IHsKKwkubmFtZSA9ICJTTURLLUkyUyIsCisJLmRhaV9saW5rID0gc21ka19kYWksCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoc21ka19kYWkpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGtfc25kX2RldmljZTsKKworc3RhdGljIGludCBfX2luaXQgc21ka19hdWRpb19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNtZGtfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOworCWlmICghc21ka19zbmRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHNtZGtfc25kX2RldmljZSwgJnNtZGspOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbWRrX3NuZF9kZXZpY2UpOworCWlmIChyZXQpCisJCXBsYXRmb3JtX2RldmljZV9wdXQoc21ka19zbmRfZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChzbWRrX2F1ZGlvX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgc21ka19hdWRpb19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc21ka19zbmRfZGV2aWNlKTsKK30KK21vZHVsZV9leGl0KHNtZGtfYXVkaW9fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgU01ESyBXTTg5OTQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3NtZGtfd205NzEzLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtOTcxMy5jCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3NtZGtfd205NzEzLmMKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd205NzEzLmMKaW5kZXggMzNiYThmZC4uYWU1ZmVkNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvc21ka193bTk3MTMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtOTcxMy5jCkBAIC0xNSw4ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKLSNpbmNsdWRlICJzM2MtZG1hLmgiCi0jaW5jbHVkZSAiczNjLWFjOTcuaCIKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJhYzk3LmgiCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNtZGs7CiAKQEAgLTI3LDYgKzI3LDcgQEAKICAqICAgU01ES0MxMDA6IFNldCBDRkc2IDEtMyBPbiwgQ0ZHNyAxICAgT24KICAqICAgU01ES0MxMTA6IFNldCBDRkdCMTAgMS0yIE9mZiwgQ0ZHQjEyIDEtMyBPbgogICogICBTTURLVjIxMDogU2V0IENGR0IxMCAxLTIgT2ZmLCBDRkdCMTIgMS0zIE9uCisgKiAgIFNNREtWMzEwOiBTZXQgQ0ZHMiAxLTIgT2ZmLCBDRkc0IEFsbCBPbiwgQ0ZHNyBBbGwgT2ZmLCBDRkc4IDEtT24KICAqLwogCiAvKgpAQCAtNDUsOCArNDYsOCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHNtZGtfZGFpID0gewogCS5uYW1lID0gIkFDOTciLAogCS5zdHJlYW1fbmFtZSA9ICJBQzk3IFBDTSIsCi0JLnBsYXRmb3JtX25hbWUgPSAiczNjMjR4eC1wY20tYXVkaW8iLAotCS5jcHVfZGFpX25hbWUgPSAiczNjLWFjOTciLAorCS5wbGF0Zm9ybV9uYW1lID0gInNhbXN1bmctYXVkaW8iLAorCS5jcHVfZGFpX25hbWUgPSAic2Ftc3VuZy1hYzk3IiwKIAkuY29kZWNfZGFpX25hbWUgPSAid205NzEzLWhpZmkiLAogCS5jb2RlY19uYW1lID0gIndtOTcxMy1jb2RlYyIsCiB9OwpAQCAtNzAsMjQgKzcxLDI3IEBACiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNtZGtfc25kX3dtOTcxM19kZXZpY2UpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyOworCQlnb3RvIGVycjE7CiAKIAlzbWRrX3NuZF9hYzk3X2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOwogCWlmICghc21ka19zbmRfYWM5N19kZXZpY2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyMjsKIAl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShzbWRrX3NuZF9hYzk3X2RldmljZSwgJnNtZGspOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbWRrX3NuZF9hYzk3X2RldmljZSk7Ci0JaWYgKHJldCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNtZGtfc25kX2FjOTdfZGV2aWNlKTsKLQkJZ290byBlcnI7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKIAogCXJldHVybiAwOwotZXJyOgorCitlcnIzOgorCXBsYXRmb3JtX2RldmljZV9wdXQoc21ka19zbmRfYWM5N19kZXZpY2UpOworZXJyMjoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNtZGtfc25kX3dtOTcxM19kZXZpY2UpOworZXJyMToKIAlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNtZGtfc25kX3dtOTcxM19kZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zcGRpZi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvczNjMjR4eC9zcGRpZi5jCnJlbmFtZSB0byBzb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCmluZGV4IGNlNTU0ZTkuLmYwODE2NDA0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvczNjMjR4eC9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKQEAgLTEsNCArMSw0IEBACi0vKiBzb3VuZC9zb2MvczNjMjR4eC9zcGRpZi5jCisvKiBzb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCiAgKgogICogQUxTQSBTb0MgQXVkaW8gTGF5ZXIgLSBTYW1zdW5nIFMvUERJRiBDb250cm9sbGVyIGRyaXZlcgogICoKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxwbGF0L2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KIAotI2luY2x1ZGUgInMzYy1kbWEuaCIKKyNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJzcGRpZi5oIgogCiAvKiBSZWdpc3RlcnMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L3NwZGlmLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5oCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9zM2MyNHh4L3NwZGlmLmgKcmVuYW1lIHRvIHNvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmgKaW5kZXggM2VkNTU1OS4uNGY3MmNiNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3MzYzI0eHgvc3BkaWYuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5oCkBAIC0xLDQgKzEsNCBAQAotLyogc291bmQvc29jL3MzYzI0eHgvc3BkaWYuaAorLyogc291bmQvc29jL3NhbXN1bmcvc3BkaWYuaAogICoKICAqIEFMU0EgU29DIEF1ZGlvIExheWVyIC0gU2Ftc3VuZyBTL1BESUYgQ29udHJvbGxlciBkcml2ZXIKICAqCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvS2NvbmZpZyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCmluZGV4IDdmMGE0OTYuLmQ4ZTA2YTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCkBAIC00OCw3ICs0OCw3IEBACiAKIGNvbmZpZyBTTkRfRlNJX0FLNDY0MgogCXRyaXN0YXRlICJGU0ktQUs0NjQyIHNvdW5kIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NINF9GU0kgJiYgSTJDX1NIX01PQklMRQorCWRlcGVuZHMgb24gU05EX1NPQ19TSDRfRlNJICYmIEkyQwogCXNlbGVjdCBTTkRfU09DX0FLNDY0MgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZ2VuZXJpYyBzb3VuZCBzdXBwb3J0IGZvciB0aGUKQEAgLTU2LDcgKzU2LDcgQEAKIAogY29uZmlnIFNORF9GU0lfREE3MjEwCiAJdHJpc3RhdGUgIkZTSS1EQTcyMTAgc291bmQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0g0X0ZTSSAmJiBJMkNfU0hfTU9CSUxFCisJZGVwZW5kcyBvbiBTTkRfU09DX1NINF9GU0kgJiYgSTJDCiAJc2VsZWN0IFNORF9TT0NfREE3MjEwCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBnZW5lcmljIHNvdW5kIHN1cHBvcnQgZm9yIHRoZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYyBiL3NvdW5kL3NvYy9zaC9mc2ktYWs0NjQyLmMKaW5kZXggZDk2NjAyZC4uYTE0ODIwYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1hazQ2NDIuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLWFrNDY0Mi5jCkBAIC0xMiw2ICsxMiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgogCitzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmNhcmQ7CisJY29uc3QgY2hhciAqY3B1X2RhaTsKKwljb25zdCBjaGFyICpjb2RlYzsKKwljb25zdCBjaGFyICpwbGF0Zm9ybTsKK307CisKIHN0YXRpYyBpbnQgZnNpX2FrNDY0Ml9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gcnRkLT5jb2RlY19kYWk7CkBAIC0yNywzNyArMzUsNDIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGZzaV9kYWlfbGluayA9IHsKLQkubmFtZQkJPSAiQUs0NjQyIiwKLQkuc3RyZWFtX25hbWUJPSAiQUs0NjQyIiwKLQkuY3B1X2RhaV9uYW1lCT0gImZzaWEtZGFpIiwgLyogZnNpIEEgKi8KIAkuY29kZWNfZGFpX25hbWUJPSAiYWs0NjQyLWhpZmkiLAotI2lmZGVmIENPTkZJR19NQUNIX0FQNEVWQgotCS5wbGF0Zm9ybV9uYW1lCT0gInNoX2ZzaTIiLAotCS5jb2RlY19uYW1lCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTMiLAotI2Vsc2UKLQkucGxhdGZvcm1fbmFtZQk9ICJzaF9mc2kuMCIsCi0JLmNvZGVjX25hbWUJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMiIsCi0jZW5kaWYKIAkuaW5pdAkJPSBmc2lfYWs0NjQyX2RhaV9pbml0LAotCS5vcHMJCT0gTlVMTCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGZzaV9zb2NfY2FyZCAgPSB7Ci0JLm5hbWUJCT0gIkZTSSAoQUs0NjQyKSIsCiAJLmRhaV9saW5rCT0gJmZzaV9kYWlfbGluaywKIAkubnVtX2xpbmtzCT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpmc2lfc25kX2RldmljZTsKIAotc3RhdGljIGludCBfX2luaXQgZnNpX2FrNDY0Ml9pbml0KHZvaWQpCitzdGF0aWMgaW50IGZzaV9hazQ2NDJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0ID0gLUVOT01FTTsKKwljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkCSppZF9lbnRyeTsKKwlzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhICpwZGF0YTsKKworCWlkX2VudHJ5ID0gcGRldi0+aWRfZW50cnk7CisJaWYgKCFpZF9lbnRyeSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmtub3duIGZzaSBhazQ2NDJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwZGF0YSA9IChzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhICopaWRfZW50cnktPmRyaXZlcl9kYXRhOwogCiAJZnNpX3NuZF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvYy1hdWRpbyIsIEZTSV9QT1JUX0EpOwogCWlmICghZnNpX3NuZF9kZXZpY2UpCiAJCWdvdG8gb3V0OwogCisJZnNpX2RhaV9saW5rLm5hbWUJCT0gcGRhdGEtPm5hbWU7CisJZnNpX2RhaV9saW5rLnN0cmVhbV9uYW1lCT0gcGRhdGEtPm5hbWU7CisJZnNpX2RhaV9saW5rLmNwdV9kYWlfbmFtZQk9IHBkYXRhLT5jcHVfZGFpOworCWZzaV9kYWlfbGluay5wbGF0Zm9ybV9uYW1lCT0gcGRhdGEtPnBsYXRmb3JtOworCWZzaV9kYWlfbGluay5jb2RlY19uYW1lCQk9IHBkYXRhLT5jb2RlYzsKKwlmc2lfc29jX2NhcmQubmFtZQkJPSBwZGF0YS0+Y2FyZDsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGZzaV9zbmRfZGV2aWNlLCAmZnNpX3NvY19jYXJkKTsKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGZzaV9zbmRfZGV2aWNlKTsKIApAQCAtNjgsOSArODEsMTA4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGZzaV9hazQ2NDJfZXhpdCh2b2lkKQorc3RhdGljIGludCBmc2lfYWs0NjQyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGZzaV9zbmRfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpX2FfYWs0NjQyID0geworCS5uYW1lCQk9ICJBSzQ2NDIiLAorCS5jYXJkCQk9ICJGU0lBIChBSzQ2NDIpIiwKKwkuY3B1X2RhaQk9ICJmc2lhLWRhaSIsCisJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKKwkucGxhdGZvcm0JPSAic2hfZnNpLjAiLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpX2JfYWs0NjQyID0geworCS5uYW1lCQk9ICJBSzQ2NDIiLAorCS5jYXJkCQk9ICJGU0lCIChBSzQ2NDIpIiwKKwkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCisJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKKwkucGxhdGZvcm0JPSAic2hfZnNpLjAiLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpX2FfYWs0NjQzID0geworCS5uYW1lCQk9ICJBSzQ2NDMiLAorCS5jYXJkCQk9ICJGU0lBIChBSzQ2NDMpIiwKKwkuY3B1X2RhaQk9ICJmc2lhLWRhaSIsCisJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKKwkucGxhdGZvcm0JPSAic2hfZnNpLjAiLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpX2JfYWs0NjQzID0geworCS5uYW1lCQk9ICJBSzQ2NDMiLAorCS5jYXJkCQk9ICJGU0lCIChBSzQ2NDMpIiwKKwkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCisJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEzIiwKKwkucGxhdGZvcm0JPSAic2hfZnNpLjAiLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpMl9hX2FrNDY0MiA9IHsKKwkubmFtZQkJPSAiQUs0NjQyIiwKKwkuY2FyZAkJPSAiRlNJMkEgKEFLNDY0MikiLAorCS5jcHVfZGFpCT0gImZzaWEtZGFpIiwKKwkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTIiLAorCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNpX2FrNDY0Ml9kYXRhIGZzaTJfYl9hazQ2NDIgPSB7CisJLm5hbWUJCT0gIkFLNDY0MiIsCisJLmNhcmQJCT0gIkZTSTJCIChBSzQ2NDIpIiwKKwkuY3B1X2RhaQk9ICJmc2liLWRhaSIsCisJLmNvZGVjCQk9ICJhazQ2NDItY29kZWMuMC0wMDEyIiwKKwkucGxhdGZvcm0JPSAic2hfZnNpMiIsCit9OworCitzdGF0aWMgc3RydWN0IGZzaV9hazQ2NDJfZGF0YSBmc2kyX2FfYWs0NjQzID0geworCS5uYW1lCQk9ICJBSzQ2NDMiLAorCS5jYXJkCQk9ICJGU0kyQSAoQUs0NjQzKSIsCisJLmNwdV9kYWkJPSAiZnNpYS1kYWkiLAorCS5jb2RlYwkJPSAiYWs0NjQyLWNvZGVjLjAtMDAxMyIsCisJLnBsYXRmb3JtCT0gInNoX2ZzaTIiLAorfTsKKworc3RhdGljIHN0cnVjdCBmc2lfYWs0NjQyX2RhdGEgZnNpMl9iX2FrNDY0MyA9IHsKKwkubmFtZQkJPSAiQUs0NjQzIiwKKwkuY2FyZAkJPSAiRlNJMkIgKEFLNDY0MykiLAorCS5jcHVfZGFpCT0gImZzaWItZGFpIiwKKwkuY29kZWMJCT0gImFrNDY0Mi1jb2RlYy4wLTAwMTMiLAorCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGZzaV9pZF90YWJsZVtdID0geworCS8qIEZTSSAqLworCXsgInNoX2ZzaV9hX2FrNDY0MiIsCShrZXJuZWxfdWxvbmdfdCkmZnNpX2FfYWs0NjQyIH0sCisJeyAic2hfZnNpX2JfYWs0NjQyIiwJKGtlcm5lbF91bG9uZ190KSZmc2lfYl9hazQ2NDIgfSwKKwl7ICJzaF9mc2lfYV9hazQ2NDMiLAkoa2VybmVsX3Vsb25nX3QpJmZzaV9hX2FrNDY0MyB9LAorCXsgInNoX2ZzaV9iX2FrNDY0MyIsCShrZXJuZWxfdWxvbmdfdCkmZnNpX2JfYWs0NjQzIH0sCisKKwkvKiBGU0kgMiAqLworCXsgInNoX2ZzaTJfYV9hazQ2NDIiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTJfYV9hazQ2NDIgfSwKKwl7ICJzaF9mc2kyX2JfYWs0NjQyIiwJKGtlcm5lbF91bG9uZ190KSZmc2kyX2JfYWs0NjQyIH0sCisJeyAic2hfZnNpMl9hX2FrNDY0MyIsCShrZXJuZWxfdWxvbmdfdCkmZnNpMl9hX2FrNDY0MyB9LAorCXsgInNoX2ZzaTJfYl9hazQ2NDMiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTJfYl9hazQ2NDMgfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzaV9hazQ2NDIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiZnNpLWFrNDY0Mi1hdWRpbyIsCisJfSwKKwkucHJvYmUJCT0gZnNpX2FrNDY0Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IGZzaV9hazQ2NDJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGZzaV9pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZzaV9hazQ2NDJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzaV9hazQ2NDIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNpX2FrNDY0Ml9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzaV9hazQ2NDIpOwogfQogCiBtb2R1bGVfaW5pdChmc2lfYWs0NjQyX2luaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYyBiL3NvdW5kL3NvYy9zaC9mc2ktZGE3MjEwLmMKaW5kZXggYTZhZGI2ZS4uZThkZjlkYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL2ZzaS1kYTcyMTAuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLWRhNzIxMC5jCkBAIC0xOCw3ICsxOCw3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNvZGVjX2RhaTsKIAogCXJldHVybiBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwKLQkJCQkgICBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQkJICAgU05EX1NPQ19EQUlGTVRfSTJTIHwKIAkJCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS5jIGIvc291bmQvc29jL3NoL2ZzaS5jCmluZGV4IDRjMjQwNGIuLjJiMDY0MDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKQEAgLTE5LDIwICsxOSwyNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NoX2ZzaS5oPgogCi0jZGVmaW5lIERPX0ZNVAkJMHgwMDAwCi0jZGVmaW5lIERPRkZfQ1RMCTB4MDAwNAotI2RlZmluZSBET0ZGX1NUCQkweDAwMDgKLSNkZWZpbmUgRElfRk1UCQkweDAwMEMKLSNkZWZpbmUgRElGRl9DVEwJMHgwMDEwCi0jZGVmaW5lIERJRkZfU1QJCTB4MDAxNAotI2RlZmluZSBDS0cxCQkweDAwMTgKLSNkZWZpbmUgQ0tHMgkJMHgwMDFDCi0jZGVmaW5lIERJRFQJCTB4MDAyMAotI2RlZmluZSBET0RUCQkweDAwMjQKLSNkZWZpbmUgTVVURV9TVAkJMHgwMDI4Ci0jZGVmaW5lIE9VVF9TRUwJCTB4MDAzMAotI2RlZmluZSBSRUdfRU5ECQlPVVRfU0VMCisvKiBQb3J0QS9Qb3J0QiByZWdpc3RlciAqLworI2RlZmluZSBSRUdfRE9fRk1UCTB4MDAwMAorI2RlZmluZSBSRUdfRE9GRl9DVEwJMHgwMDA0CisjZGVmaW5lIFJFR19ET0ZGX1NUCTB4MDAwOAorI2RlZmluZSBSRUdfRElfRk1UCTB4MDAwQworI2RlZmluZSBSRUdfRElGRl9DVEwJMHgwMDEwCisjZGVmaW5lIFJFR19ESUZGX1NUCTB4MDAxNAorI2RlZmluZSBSRUdfQ0tHMQkweDAwMTgKKyNkZWZpbmUgUkVHX0NLRzIJMHgwMDFDCisjZGVmaW5lIFJFR19ESURUCTB4MDAyMAorI2RlZmluZSBSRUdfRE9EVAkweDAwMjQKKyNkZWZpbmUgUkVHX01VVEVfU1QJMHgwMDI4CisjZGVmaW5lIFJFR19PVVRfU0VMCTB4MDAzMAogCisvKiBtYXN0ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVNUX0NMS19SU1QJMHgwMjEwCisjZGVmaW5lIE1TVF9TT0ZUX1JTVAkweDAyMTQKKyNkZWZpbmUgTVNUX0ZJRk9fU1oJMHgwMjE4CisKKy8qIGNvcmUgcmVnaXN0ZXIgKGRlcGVuZCBvbiBGU0kgdmVyc2lvbikgKi8KICNkZWZpbmUgQV9NU1RfQ1RMUgkweDAxODAKICNkZWZpbmUgQl9NU1RfQ1RMUgkweDAxQTAKICNkZWZpbmUgQ1BVX0lOVF9TVAkweDAxRjQKQEAgLTQxLDIyICs0NywyMyBAQAogI2RlZmluZSBJTlRfU1QJCTB4MDIwMAogI2RlZmluZSBJRU1TSwkJMHgwMjA0CiAjZGVmaW5lIElNU0sJCTB4MDIwOAotI2RlZmluZSBNVVRFCQkweDAyMEMKLSNkZWZpbmUgQ0xLX1JTVAkJMHgwMjEwCi0jZGVmaW5lIFNPRlRfUlNUCTB4MDIxNAotI2RlZmluZSBGSUZPX1NaCQkweDAyMTgKLSNkZWZpbmUgTVJFR19TVEFSVAlBX01TVF9DVExSCi0jZGVmaW5lIE1SRUdfRU5ECUZJRk9fU1oKIAogLyogRE9fRk1UICovCiAvKiBESV9GTVQgKi8KKyNkZWZpbmUgQ1JfQldTXzI0CSgweDAgPDwgMjApIC8qIEZTSTIgKi8KKyNkZWZpbmUgQ1JfQldTXzE2CSgweDEgPDwgMjApIC8qIEZTSTIgKi8KKyNkZWZpbmUgQ1JfQldTXzIwCSgweDIgPDwgMjApIC8qIEZTSTIgKi8KKworI2RlZmluZSBDUl9EVE1EX1BDTQkJKDB4MCA8PCA4KSAvKiBGU0kyICovCisjZGVmaW5lIENSX0RUTURfU1BESUZfUENNCSgweDEgPDwgOCkgLyogRlNJMiAqLworI2RlZmluZSBDUl9EVE1EX1NQRElGX1NUUkVBTQkoMHgyIDw8IDgpIC8qIEZTSTIgKi8KKwogI2RlZmluZSBDUl9NT05PCQkoMHgwIDw8IDQpCiAjZGVmaW5lIENSX01PTk9fRAkoMHgxIDw8IDQpCiAjZGVmaW5lIENSX1BDTQkJKDB4MiA8PCA0KQogI2RlZmluZSBDUl9JMlMJCSgweDMgPDwgNCkKICNkZWZpbmUgQ1JfVERNCQkoMHg0IDw8IDQpCiAjZGVmaW5lIENSX1RETV9ECSgweDUgPDwgNCkKLSNkZWZpbmUgQ1JfU1BESUYJMHgwMDEwMDEyMAogCiAvKiBET0ZGX0NUTCAqLwogLyogRElGRl9DVEwgKi8KQEAgLTkzLDYgKzEwMCwxMCBAQAogI2RlZmluZSBJUgkJKDEgPDwgIDQpIC8qIEludGVycnVwdCBSZXNldCAqLwogI2RlZmluZSBGU0lTUgkJKDEgPDwgIDApIC8qIFNvZnR3YXJlIFJlc2V0ICovCiAKKy8qIE9VVF9TRUwgKEZTSTIpICovCisjZGVmaW5lIERNTUQJCSgxIDw8IDQpIC8qIFNQRElGIG91dHB1dCB0aW1pbmcgMDogQmlwaGFzZSBvbmx5ICovCisJCQkJIC8qCQkJMTogQmlwaGFzZSBhbmQgc2VyaWFsICovCisKIC8qIEZJRk9fU1ogKi8KICNkZWZpbmUgRklGT19TWl9NQVNLCTB4NwogCkBAIC0xMjMsNiArMTM0LDkgQEAKIAlpbnQgYnVmZl9sZW47CiAJaW50IHBlcmlvZF9sZW47CiAJaW50IHBlcmlvZF9udW07CisKKwlpbnQgdWVycl9udW07CisJaW50IG9lcnJfbnVtOwogfTsKIAogc3RydWN0IGZzaV9wcml2IHsKQEAgLTEzMyw4ICsxNDcsNiBAQAogCXN0cnVjdCBmc2lfc3RyZWFtIGNhcHR1cmU7CiAKIAlsb25nIHJhdGU7Ci0KLQl1MzIgbXN0X2N0cmw7CiB9OwogCiBzdHJ1Y3QgZnNpX2NvcmUgewpAQCAtMTQzLDYgKzE1NSw4IEBACiAJdTMyIGludF9zdDsKIAl1MzIgaWVtc2s7CiAJdTMyIGltc2s7CisJdTMyIGFfbWNsazsKKwl1MzIgYl9tY2xrOwogfTsKIAogc3RydWN0IGZzaV9tYXN0ZXIgewpAQCAtMTgyLDYyICsxOTYsMjIgQEAKIAlfX2ZzaV9yZWdfd3JpdGUocmVnLCB2YWwpOwogfQogCi1zdGF0aWMgdm9pZCBmc2lfcmVnX3dyaXRlKHN0cnVjdCBmc2lfcHJpdiAqZnNpLCB1MzIgcmVnLCB1MzIgZGF0YSkKLXsKLQlpZiAocmVnID4gUkVHX0VORCkgewotCQlwcl9lcnIoImZzaTogcmVnaXN0ZXIgYWNjZXNzIGVyciAoJXMpXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9CisjZGVmaW5lIGZzaV9yZWdfd3JpdGUocCwgciwgZClcCisJX19mc2lfcmVnX3dyaXRlKCh1MzIpKHAtPmJhc2UgKyBSRUdfIyNyKSwgZCkKIAotCV9fZnNpX3JlZ193cml0ZSgodTMyKShmc2ktPmJhc2UgKyByZWcpLCBkYXRhKTsKLX0KKyNkZWZpbmUgZnNpX3JlZ19yZWFkKHAsIHIpXAorCV9fZnNpX3JlZ19yZWFkKCh1MzIpKHAtPmJhc2UgKyBSRUdfIyNyKSkKIAotc3RhdGljIHUzMiBmc2lfcmVnX3JlYWQoc3RydWN0IGZzaV9wcml2ICpmc2ksIHUzMiByZWcpCi17Ci0JaWYgKHJlZyA+IFJFR19FTkQpIHsKLQkJcHJfZXJyKCJmc2k6IHJlZ2lzdGVyIGFjY2VzcyBlcnIgKCVzKVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9CisjZGVmaW5lIGZzaV9yZWdfbWFza19zZXQocCwgciwgbSwgZClcCisJX19mc2lfcmVnX21hc2tfc2V0KCh1MzIpKHAtPmJhc2UgKyBSRUdfIyNyKSwgbSwgZCkKIAotCXJldHVybiBfX2ZzaV9yZWdfcmVhZCgodTMyKShmc2ktPmJhc2UgKyByZWcpKTsKLX0KLQotc3RhdGljIHZvaWQgZnNpX3JlZ19tYXNrX3NldChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiBkYXRhKQotewotCWlmIChyZWcgPiBSRUdfRU5EKSB7Ci0JCXByX2VycigiZnNpOiByZWdpc3RlciBhY2Nlc3MgZXJyICglcylcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCV9fZnNpX3JlZ19tYXNrX3NldCgodTMyKShmc2ktPmJhc2UgKyByZWcpLCBtYXNrLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgZnNpX21hc3Rlcl93cml0ZShzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyLCB1MzIgcmVnLCB1MzIgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChyZWcgPCBNUkVHX1NUQVJUKSB8fAotCSAgICAocmVnID4gTVJFR19FTkQpKSB7Ci0JCXByX2VycigiZnNpOiByZWdpc3RlciBhY2Nlc3MgZXJyICglcylcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKLQlfX2ZzaV9yZWdfd3JpdGUoKHUzMikobWFzdGVyLT5iYXNlICsgcmVnKSwgZGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB1MzIgZnNpX21hc3Rlcl9yZWFkKHN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIsIHUzMiByZWcpCisjZGVmaW5lIGZzaV9tYXN0ZXJfcmVhZChwLCByKSBfZnNpX21hc3Rlcl9yZWFkKHAsIE1TVF8jI3IpCisjZGVmaW5lIGZzaV9jb3JlX3JlYWQocCwgcikgICBfZnNpX21hc3Rlcl9yZWFkKHAsIHAtPmNvcmUtPnIpCitzdGF0aWMgdTMyIF9mc2lfbWFzdGVyX3JlYWQoc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciwgdTMyIHJlZykKIHsKIAl1MzIgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKHJlZyA8IE1SRUdfU1RBUlQpIHx8Ci0JICAgIChyZWcgPiBNUkVHX0VORCkpIHsKLQkJcHJfZXJyKCJmc2k6IHJlZ2lzdGVyIGFjY2VzcyBlcnIgKCVzKVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7CiAJcmV0ID0gX19mc2lfcmVnX3JlYWQoKHUzMikobWFzdGVyLT5iYXNlICsgcmVnKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFzdGVyLT5sb2NrLCBmbGFncyk7CkBAIC0yNDUsMTcgKzIxOSwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZzaV9tYXN0ZXJfbWFza19zZXQoc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciwKKyNkZWZpbmUgZnNpX21hc3Rlcl9tYXNrX3NldChwLCByLCBtLCBkKSBfZnNpX21hc3Rlcl9tYXNrX3NldChwLCBNU1RfIyNyLCBtLCBkKQorI2RlZmluZSBmc2lfY29yZV9tYXNrX3NldChwLCByLCBtLCBkKSAgX2ZzaV9tYXN0ZXJfbWFza19zZXQocCwgcC0+Y29yZS0+ciwgbSwgZCkKK3N0YXRpYyB2b2lkIF9mc2lfbWFzdGVyX21hc2tfc2V0KHN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIsCiAJCQkgICAgICAgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiBkYXRhKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKHJlZyA8IE1SRUdfU1RBUlQpIHx8Ci0JICAgIChyZWcgPiBNUkVHX0VORCkpIHsKLQkJcHJfZXJyKCJmc2k6IHJlZ2lzdGVyIGFjY2VzcyBlcnIgKCVzKVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1hc3Rlci0+bG9jaywgZmxhZ3MpOwogCV9fZnNpX3JlZ19tYXNrX3NldCgodTMyKShtYXN0ZXItPmJhc2UgKyByZWcpLCBtYXNrLCBkYXRhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXN0ZXItPmxvY2ssIGZsYWdzKTsKQEAgLTM1OSwyNyArMzI5LDQxIEBACiAJaW8tPmJ1ZmZfb2Zmc2V0CT0gMDsKIAlpby0+cGVyaW9kX2xlbgk9IHBlcmlvZF9sZW47CiAJaW8tPnBlcmlvZF9udW0JPSAwOworCWlvLT5vZXJyX251bQk9IC0xOyAvKiBpZ25vcmUgMXN0IGVyciAqLworCWlvLT51ZXJyX251bQk9IC0xOyAvKiBpZ25vcmUgMXN0IGVyciAqLwogfQogCiBzdGF0aWMgdm9pZCBmc2lfc3RyZWFtX3BvcChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IGlzX3BsYXkpCiB7CiAJc3RydWN0IGZzaV9zdHJlYW0gKmlvID0gZnNpX2dldF9zdHJlYW0oZnNpLCBpc19wbGF5KTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IGZzaV9nZXRfZGFpKGlvLT5zdWJzdHJlYW0pOworCisKKwlpZiAoaW8tPm9lcnJfbnVtID4gMCkKKwkJZGV2X2VycihkYWktPmRldiwgIm92ZXJfcnVuID0gJWRcbiIsIGlvLT5vZXJyX251bSk7CisKKwlpZiAoaW8tPnVlcnJfbnVtID4gMCkKKwkJZGV2X2VycihkYWktPmRldiwgInVuZGVyX3J1biA9ICVkXG4iLCBpby0+dWVycl9udW0pOwogCiAJaW8tPnN1YnN0cmVhbQk9IE5VTEw7CiAJaW8tPmJ1ZmZfbGVuCT0gMDsKIAlpby0+YnVmZl9vZmZzZXQJPSAwOwogCWlvLT5wZXJpb2RfbGVuCT0gMDsKIAlpby0+cGVyaW9kX251bQk9IDA7CisJaW8tPm9lcnJfbnVtCT0gMDsKKwlpby0+dWVycl9udW0JPSAwOwogfQogCiBzdGF0aWMgaW50IGZzaV9nZXRfZmlmb19kYXRhX251bShzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IGlzX3BsYXkpCiB7CiAJdTMyIHN0YXR1czsKLQl1MzIgcmVnID0gaXNfcGxheSA/IERPRkZfU1QgOiBESUZGX1NUOwogCXN0cnVjdCBmc2lfc3RyZWFtICppbyA9IGZzaV9nZXRfc3RyZWFtKGZzaSwgaXNfcGxheSk7CiAJaW50IGRhdGFfbnVtOwogCi0Jc3RhdHVzID0gZnNpX3JlZ19yZWFkKGZzaSwgcmVnKTsKKwlzdGF0dXMgPSBpc19wbGF5ID8KKwkJZnNpX3JlZ19yZWFkKGZzaSwgRE9GRl9TVCkgOgorCQlmc2lfcmVnX3JlYWQoZnNpLCBESUZGX1NUKTsKKwogCWRhdGFfbnVtID0gMHgxZmYgJiAoc3RhdHVzID4+IDgpOwogCWRhdGFfbnVtICo9IGlvLT5jaGFuX251bTsKIApAQCAtNDA2LDYgKzM5MCwyNyBAQAogCXJldHVybiBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgMSkgLyBpby0+Y2hhbl9udW07CiB9CiAKK3N0YXRpYyB2b2lkIGZzaV9jb3VudF9maWZvX2VycihzdHJ1Y3QgZnNpX3ByaXYgKmZzaSkKK3sKKwl1MzIgb3N0YXR1cyA9IGZzaV9yZWdfcmVhZChmc2ksIERPRkZfU1QpOworCXUzMiBpc3RhdHVzID0gZnNpX3JlZ19yZWFkKGZzaSwgRElGRl9TVCk7CisKKwlpZiAob3N0YXR1cyAmIEVSUl9PVkVSKQorCQlmc2ktPnBsYXliYWNrLm9lcnJfbnVtKys7CisKKwlpZiAob3N0YXR1cyAmIEVSUl9VTkRFUikKKwkJZnNpLT5wbGF5YmFjay51ZXJyX251bSsrOworCisJaWYgKGlzdGF0dXMgJiBFUlJfT1ZFUikKKwkJZnNpLT5jYXB0dXJlLm9lcnJfbnVtKys7CisKKwlpZiAoaXN0YXR1cyAmIEVSUl9VTkRFUikKKwkJZnNpLT5jYXB0dXJlLnVlcnJfbnVtKys7CisKKwlmc2lfcmVnX3dyaXRlKGZzaSwgRE9GRl9TVCwgMCk7CisJZnNpX3JlZ193cml0ZShmc2ksIERJRkZfU1QsIDApOworfQorCiAvKgogICoJCWRtYSBmdW5jdGlvbgogICovCkBAIC00NzMsOCArNDc4LDggQEAKIAl1MzIgZGF0YSA9IEFCX0lPKDEsIGZzaV9nZXRfcG9ydF9zaGlmdChmc2ksIGlzX3BsYXkpKTsKIAlzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyID0gZnNpX2dldF9tYXN0ZXIoZnNpKTsKIAotCWZzaV9tYXN0ZXJfbWFza19zZXQobWFzdGVyLCBtYXN0ZXItPmNvcmUtPmltc2ssICBkYXRhLCBkYXRhKTsKLQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgbWFzdGVyLT5jb3JlLT5pZW1zaywgZGF0YSwgZGF0YSk7CisJZnNpX2NvcmVfbWFza19zZXQobWFzdGVyLCBpbXNrLCAgZGF0YSwgZGF0YSk7CisJZnNpX2NvcmVfbWFza19zZXQobWFzdGVyLCBpZW1zaywgZGF0YSwgZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZzaV9pcnFfZGlzYWJsZShzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IGlzX3BsYXkpCkBAIC00ODIsMTggKzQ4NywxMyBAQAogCXUzMiBkYXRhID0gQUJfSU8oMSwgZnNpX2dldF9wb3J0X3NoaWZ0KGZzaSwgaXNfcGxheSkpOwogCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOwogCi0JZnNpX21hc3Rlcl9tYXNrX3NldChtYXN0ZXIsIG1hc3Rlci0+Y29yZS0+aW1zaywgIGRhdGEsIDApOwotCWZzaV9tYXN0ZXJfbWFza19zZXQobWFzdGVyLCBtYXN0ZXItPmNvcmUtPmllbXNrLCBkYXRhLCAwKTsKKwlmc2lfY29yZV9tYXNrX3NldChtYXN0ZXIsIGltc2ssICBkYXRhLCAwKTsKKwlmc2lfY29yZV9tYXNrX3NldChtYXN0ZXIsIGllbXNrLCBkYXRhLCAwKTsKIH0KIAogc3RhdGljIHUzMiBmc2lfaXJxX2dldF9zdGF0dXMoc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlcikKIHsKLQlyZXR1cm4gZnNpX21hc3Rlcl9yZWFkKG1hc3RlciwgbWFzdGVyLT5jb3JlLT5pbnRfc3QpOwotfQotCi1zdGF0aWMgdm9pZCBmc2lfaXJxX2NsZWFyX2FsbF9zdGF0dXMoc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlcikKLXsKLQlmc2lfbWFzdGVyX3dyaXRlKG1hc3RlciwgbWFzdGVyLT5jb3JlLT5pbnRfc3QsIDApOworCXJldHVybiBmc2lfY29yZV9yZWFkKG1hc3RlciwgaW50X3N0KTsKIH0KIAogc3RhdGljIHZvaWQgZnNpX2lycV9jbGVhcl9zdGF0dXMoc3RydWN0IGZzaV9wcml2ICpmc2kpCkBAIC01MDUsNyArNTA1LDcgQEAKIAlkYXRhIHw9IEFCX0lPKDEsIGZzaV9nZXRfcG9ydF9zaGlmdChmc2ksIDEpKTsKIAogCS8qIGNsZWFyIGludGVycnVwdCBmYWN0b3IgKi8KLQlmc2lfbWFzdGVyX21hc2tfc2V0KG1hc3RlciwgbWFzdGVyLT5jb3JlLT5pbnRfc3QsIGRhdGEsIDApOworCWZzaV9jb3JlX21hc2tfc2V0KG1hc3RlciwgaW50X3N0LCBkYXRhLCAwKTsKIH0KIAogLyoKQEAgLTUxNiwxNyArNTE2LDE5IEBACiBzdGF0aWMgdm9pZCBmc2lfc3BkaWZfY2xrX2N0cmwoc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBlbmFibGUpCiB7CiAJc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlciA9IGZzaV9nZXRfbWFzdGVyKGZzaSk7Ci0JdTMyIHZhbCA9IEJQIHwgU0U7CisJdTMyIG1hc2ssIHZhbDsKIAogCWlmIChtYXN0ZXItPmNvcmUtPnZlciA8IDIpIHsKIAkJcHJfZXJyKCJmc2k6IHJlZ2lzdGVyIGFjY2VzcyBlcnIgKCVzKVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGVuYWJsZSkKLQkJZnNpX21hc3Rlcl9tYXNrX3NldChtYXN0ZXIsIGZzaS0+bXN0X2N0cmwsIHZhbCwgdmFsKTsKLQllbHNlCi0JCWZzaV9tYXN0ZXJfbWFza19zZXQobWFzdGVyLCBmc2ktPm1zdF9jdHJsLCB2YWwsIDApOworCW1hc2sgPSBCUCB8IFNFOworCXZhbCA9IGVuYWJsZSA/IG1hc2sgOiAwOworCisJZnNpX2lzX3BvcnRfYShmc2kpID8KKwkJZnNpX2NvcmVfbWFza19zZXQobWFzdGVyLCBhX21jbGssIG1hc2ssIHZhbCkgOgorCQlmc2lfY29yZV9tYXNrX3NldChtYXN0ZXIsIGJfbWNsaywgbWFzaywgdmFsKTsKIH0KIAogLyoKQEAgLTU1MCw3ICs1NTIsNyBAQAogewogCXN0cnVjdCBmc2lfbWFzdGVyICptYXN0ZXIgPSBmc2lfZ2V0X21hc3Rlcihmc2kpOwogCXN0cnVjdCBmc2lfc3RyZWFtICppbyA9IGZzaV9nZXRfc3RyZWFtKGZzaSwgaXNfcGxheSk7Ci0JdTMyIGN0cmwsIHNoaWZ0LCBpOworCXUzMiBzaGlmdCwgaTsKIAogCS8qIGdldCBvbi1jaGlwIFJBTSBjYXBhY2l0eSAqLwogCXNoaWZ0ID0gZnNpX21hc3Rlcl9yZWFkKG1hc3RlciwgRklGT19TWik7CkBAIC01ODMsMTMgKzU4NSwxNyBAQAogCWRldl9kYmcoZGFpLT5kZXYsICIlZCBjaGFubmVsICVkIHN0b3JlXG4iLAogCQlpby0+Y2hhbl9udW0sIGlvLT5maWZvX21heF9udW0pOwogCi0JY3RybCA9IGlzX3BsYXkgPyBET0ZGX0NUTCA6IERJRkZfQ1RMOwotCi0JLyogc2V0IGludGVycnVwdCBnZW5lcmF0aW9uIGZhY3RvciAqLwotCWZzaV9yZWdfd3JpdGUoZnNpLCBjdHJsLCBJUlFfSEFMRik7Ci0KLQkvKiBjbGVhciBGSUZPICovCi0JZnNpX3JlZ19tYXNrX3NldChmc2ksIGN0cmwsIEZJRk9fQ0xSLCBGSUZPX0NMUik7CisJLyoKKwkgKiBzZXQgaW50ZXJydXB0IGdlbmVyYXRpb24gZmFjdG9yCisJICogY2xlYXIgRklGTworCSAqLworCWlmIChpc19wbGF5KSB7CisJCWZzaV9yZWdfd3JpdGUoZnNpLAlET0ZGX0NUTCwgSVJRX0hBTEYpOworCQlmc2lfcmVnX21hc2tfc2V0KGZzaSwJRE9GRl9DVEwsIEZJRk9fQ0xSLCBGSUZPX0NMUik7CisJfSBlbHNlIHsKKwkJZnNpX3JlZ193cml0ZShmc2ksCURJRkZfQ1RMLCBJUlFfSEFMRik7CisJCWZzaV9yZWdfbWFza19zZXQoZnNpLAlESUZGX0NUTCwgRklGT19DTFIsIEZJRk9fQ0xSKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGZzaV9zb2Z0X2FsbF9yZXNldChzdHJ1Y3QgZnNpX21hc3RlciAqbWFzdGVyKQpAQCAtNjA0LDEzICs2MTAsMTIgQEAKIAltZGVsYXkoMTApOwogfQogCi1zdGF0aWMgaW50IGZzaV9maWZvX2RhdGFfY3RybChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IHN0YXJ0dXAsIGludCBzdHJlYW0pCitzdGF0aWMgaW50IGZzaV9maWZvX2RhdGFfY3RybChzdHJ1Y3QgZnNpX3ByaXYgKmZzaSwgaW50IHN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gTlVMTDsKIAlpbnQgaXNfcGxheSA9IGZzaV9zdHJlYW1faXNfcGxheShzdHJlYW0pOwogCXN0cnVjdCBmc2lfc3RyZWFtICppbyA9IGZzaV9nZXRfc3RyZWFtKGZzaSwgaXNfcGxheSk7Ci0JdTMyIHN0YXR1c19yZWcgPSBpc19wbGF5ID8gRE9GRl9TVCA6IERJRkZfU1Q7CiAJaW50IGRhdGFfcmVzaWR1ZV9udW07CiAJaW50IGRhdGFfbnVtOwogCWludCBkYXRhX251bV9tYXg7CkBAIC02OTgsMzUgKzcwMywyMCBAQAogCS8qIHVwZGF0ZSBidWZmX29mZnNldCAqLwogCWlvLT5idWZmX29mZnNldCArPSBmc2lfbnVtMm9mZnNldChkYXRhX251bSwgY2hfd2lkdGgpOwogCi0JLyogY2hlY2sgZmlmbyBzdGF0dXMgKi8KLQlpZiAoIXN0YXJ0dXApIHsKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBmc2lfZ2V0X2RhaShzdWJzdHJlYW0pOwotCQl1MzIgc3RhdHVzID0gZnNpX3JlZ19yZWFkKGZzaSwgc3RhdHVzX3JlZyk7Ci0KLQkJaWYgKHN0YXR1cyAmIEVSUl9PVkVSKQotCQkJZGV2X2VycihkYWktPmRldiwgIm92ZXIgcnVuXG4iKTsKLQkJaWYgKHN0YXR1cyAmIEVSUl9VTkRFUikKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJ1bmRlciBydW5cbiIpOwotCX0KLQlmc2lfcmVnX3dyaXRlKGZzaSwgc3RhdHVzX3JlZywgMCk7Ci0KLQkvKiByZS1lbmFibGUgaXJxICovCi0JZnNpX2lycV9lbmFibGUoZnNpLCBpc19wbGF5KTsKLQogCWlmIChvdmVyX3BlcmlvZCkKIAkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZnNpX2RhdGFfcG9wKHN0cnVjdCBmc2lfcHJpdiAqZnNpLCBpbnQgc3RhcnR1cCkKK3N0YXRpYyBpbnQgZnNpX2RhdGFfcG9wKHN0cnVjdCBmc2lfcHJpdiAqZnNpKQogewotCXJldHVybiBmc2lfZmlmb19kYXRhX2N0cmwoZnNpLCBzdGFydHVwLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCXJldHVybiBmc2lfZmlmb19kYXRhX2N0cmwoZnNpLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwogfQogCi1zdGF0aWMgaW50IGZzaV9kYXRhX3B1c2goc3RydWN0IGZzaV9wcml2ICpmc2ksIGludCBzdGFydHVwKQorc3RhdGljIGludCBmc2lfZGF0YV9wdXNoKHN0cnVjdCBmc2lfcHJpdiAqZnNpKQogewotCXJldHVybiBmc2lfZmlmb19kYXRhX2N0cmwoZnNpLCBzdGFydHVwLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKwlyZXR1cm4gZnNpX2ZpZm9fZGF0YV9jdHJsKGZzaSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBmc2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCkBAIC03MzksMTUgKzcyOSwxOSBAQAogCWZzaV9tYXN0ZXJfbWFza19zZXQobWFzdGVyLCBTT0ZUX1JTVCwgSVIsIElSKTsKIAogCWlmIChpbnRfc3QgJiBBQl9JTygxLCBBT19TSElGVCkpCi0JCWZzaV9kYXRhX3B1c2goJm1hc3Rlci0+ZnNpYSwgMCk7CisJCWZzaV9kYXRhX3B1c2goJm1hc3Rlci0+ZnNpYSk7CiAJaWYgKGludF9zdCAmIEFCX0lPKDEsIEJPX1NISUZUKSkKLQkJZnNpX2RhdGFfcHVzaCgmbWFzdGVyLT5mc2liLCAwKTsKKwkJZnNpX2RhdGFfcHVzaCgmbWFzdGVyLT5mc2liKTsKIAlpZiAoaW50X3N0ICYgQUJfSU8oMSwgQUlfU0hJRlQpKQotCQlmc2lfZGF0YV9wb3AoJm1hc3Rlci0+ZnNpYSwgMCk7CisJCWZzaV9kYXRhX3BvcCgmbWFzdGVyLT5mc2lhKTsKIAlpZiAoaW50X3N0ICYgQUJfSU8oMSwgQklfU0hJRlQpKQotCQlmc2lfZGF0YV9wb3AoJm1hc3Rlci0+ZnNpYiwgMCk7CisJCWZzaV9kYXRhX3BvcCgmbWFzdGVyLT5mc2liKTsKIAotCWZzaV9pcnFfY2xlYXJfYWxsX3N0YXR1cyhtYXN0ZXIpOworCWZzaV9jb3VudF9maWZvX2VycigmbWFzdGVyLT5mc2lhKTsKKwlmc2lfY291bnRfZmlmb19lcnIoJm1hc3Rlci0+ZnNpYik7CisKKwlmc2lfaXJxX2NsZWFyX3N0YXR1cygmbWFzdGVyLT5mc2lhKTsKKwlmc2lfaXJxX2NsZWFyX3N0YXR1cygmbWFzdGVyLT5mc2liKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc2NCw3ICs3NTgsNiBAQAogCXN0cnVjdCBmc2lfc3RyZWFtICppbzsKIAl1MzIgZmxhZ3MgPSBmc2lfZ2V0X2luZm9fZmxhZ3MoZnNpKTsKIAl1MzIgZm10OwotCXUzMiByZWc7CiAJdTMyIGRhdGE7CiAJaW50IGlzX3BsYXkgPSBmc2lfaXNfcGxheShzdWJzdHJlYW0pOwogCWludCBpc19tYXN0ZXI7CkBAIC03OTYsNyArNzg5LDYgQEAKIAogCS8qIGRvIGZtdCwgZGkgZm10ICovCiAJZGF0YSA9IDA7Ci0JcmVnID0gaXNfcGxheSA/IERPX0ZNVCA6IERJX0ZNVDsKIAlmbXQgPSBpc19wbGF5ID8gU0hfRlNJX0dFVF9PRk1UKGZsYWdzKSA6IFNIX0ZTSV9HRVRfSUZNVChmbGFncyk7CiAJc3dpdGNoIChmbXQpIHsKIAljYXNlIFNIX0ZTSV9GTVRfTU9OTzoKQEAgLTgzMCwxNiArODIyLDE4IEBACiAJCQlkZXZfZXJyKGRhaS0+ZGV2LCAiVGhpcyBGU0kgY2FuIG5vdCB1c2UgU1BESUZcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJZGF0YSA9IENSX1NQRElGOworCQlkYXRhID0gQ1JfQldTXzE2IHwgQ1JfRFRNRF9TUERJRl9QQ00gfCBDUl9QQ007CiAJCWlvLT5jaGFuX251bSA9IDI7CiAJCWZzaV9zcGRpZl9jbGtfY3RybChmc2ksIDEpOwotCQlmc2lfcmVnX21hc2tfc2V0KGZzaSwgT1VUX1NFTCwgMHgwMDEwLCAweDAwMTApOworCQlmc2lfcmVnX21hc2tfc2V0KGZzaSwgT1VUX1NFTCwgRE1NRCwgRE1NRCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGFpLT5kZXYsICJ1bmtub3duIGZvcm1hdC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZnNpX3JlZ193cml0ZShmc2ksIHJlZywgZGF0YSk7CisJaXNfcGxheSA/CisJCWZzaV9yZWdfd3JpdGUoZnNpLCBET19GTVQsIGRhdGEpIDoKKwkJZnNpX3JlZ193cml0ZShmc2ksIERJX0ZNVCwgZGF0YSk7CiAKIAkvKiBpcnEgY2xlYXIgKi8KIAlmc2lfaXJxX2Rpc2FibGUoZnNpLCBpc19wbGF5KTsKQEAgLTg4Myw3ICs4NzcsOCBAQAogCQlmc2lfc3RyZWFtX3B1c2goZnNpLCBpc19wbGF5LCBzdWJzdHJlYW0sCiAJCQkJZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSwKIAkJCQlmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgcnVudGltZS0+cGVyaW9kX3NpemUpKTsKLQkJcmV0ID0gaXNfcGxheSA/IGZzaV9kYXRhX3B1c2goZnNpLCAxKSA6IGZzaV9kYXRhX3BvcChmc2ksIDEpOworCQlyZXQgPSBpc19wbGF5ID8gZnNpX2RhdGFfcHVzaChmc2kpIDogZnNpX2RhdGFfcG9wKGZzaSk7CisJCWZzaV9pcnFfZW5hYmxlKGZzaSwgaXNfcGxheSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAkJZnNpX2lycV9kaXNhYmxlKGZzaSwgaXNfcGxheSk7CkBAIC0xMTc0LDEyICsxMTY5LDEwIEBACiAJLyogRlNJIEEgc2V0dGluZyAqLwogCW1hc3Rlci0+ZnNpYS5iYXNlCT0gbWFzdGVyLT5iYXNlOwogCW1hc3Rlci0+ZnNpYS5tYXN0ZXIJPSBtYXN0ZXI7Ci0JbWFzdGVyLT5mc2lhLm1zdF9jdHJsCT0gQV9NU1RfQ1RMUjsKIAogCS8qIEZTSSBCIHNldHRpbmcgKi8KIAltYXN0ZXItPmZzaWIuYmFzZQk9IG1hc3Rlci0+YmFzZSArIDB4NDA7CiAJbWFzdGVyLT5mc2liLm1hc3Rlcgk9IG1hc3RlcjsKLQltYXN0ZXItPmZzaWIubXN0X2N0cmwJPSBCX01TVF9DVExSOwogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9yZXN1bWUoJnBkZXYtPmRldik7CkBAIC0xMjY2LDYgKzEyNTksOCBAQAogCS5pbnRfc3QJPSBDUFVfSU5UX1NULAogCS5pZW1zawk9IENQVV9JRU1TSywKIAkuaW1zawk9IENQVV9JTVNLLAorCS5hX21jbGsJPSBBX01TVF9DVExSLAorCS5iX21jbGsJPSBCX01TVF9DVExSLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgZnNpX2lkX3RhYmxlW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvbWlnb3IuYyBiL3NvdW5kL3NvYy9zaC9taWdvci5jCmluZGV4IGFjNmM0OWMuLjYwODhhNmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9taWdvci5jCisrKyBiL3NvdW5kL3NvYy9zaC9taWdvci5jCkBAIC04LDExICs4LDExIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAotI2luY2x1ZGUgPGFzbS9jbGtkZXYuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KIAogI2luY2x1ZGUgPGNwdS9zaDc3MjIuaD4KQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5NzguaCIKICNpbmNsdWRlICJzaXUuaCIKQEAgLTE0MCwxMSArMTM5LDEyIEBACiBzdGF0aWMgaW50IG1pZ29yX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07CiAKLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGNvZGVjLCBtaWdvcl9kYXBtX3dpZGdldHMsCisJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtaWdvcl9kYXBtX3dpZGdldHMsCiAJCQkJICBBUlJBWV9TSVpFKG1pZ29yX2RhcG1fd2lkZ2V0cykpOwogCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoY29kZWMsIGF1ZGlvX21hcCwgQVJSQVlfU0laRShhdWRpb19tYXApKTsKKwlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19tYXAsIEFSUkFZX1NJWkUoYXVkaW9fbWFwKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zaDc3NjAtYWM5Ny5jIGIvc291bmQvc29jL3NoL3NoNzc2MC1hYzk3LmMKaW5kZXggZjhlMGFiOC4uOTE3ZDNjZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3NoNzc2MC1hYzk3LmMKKysrIGIvc291bmQvc29jL3NoL3NoNzc2MC1hYzk3LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBJUFNFTCAweEZFNDAwMDM0CkBAIC0yMyw3ICsyMiw3IEBACiAKIHN0YXRpYyBpbnQgbWFjaGluZV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7Ci0Jc25kX3NvY19kYXBtX3N5bmMocnRkLT5jb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoJnJ0ZC0+Y29kZWMtPmRhcG0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvc2l1LmggYi9zb3VuZC9zb2Mvc2gvc2l1LmgKaW5kZXggOWY0ZGNiOS4uODNjMzQzMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3NpdS5oCisrKyBiL3NvdW5kL3NvYy9zaC9zaXUuaApAQCAtNzUsNyArNzUsNyBAQAogCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIAogI2RlZmluZSBTSVVfUEVSSU9EX0JZVEVTX01BWAk4MTkyCQkvKiBETUEgdHJhbnNmZXIvcGVyaW9kIHNpemUgKi8KICNkZWZpbmUgU0lVX1BFUklPRF9CWVRFU19NSU4JMjU2CQkvKiBETUEgdHJhbnNmZXIvcGVyaW9kIHNpemUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMgYi9zb3VuZC9zb2Mvc2gvc2l1X2RhaS5jCmluZGV4IGFmNTNiNjQuLjQ5NzNjMjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9zaXVfZGFpLmMKKysrIGIvc291bmQvc29jL3NoL3NpdV9kYWkuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGFzbS9zaXUuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlICJzaXUuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3NpdV9wY20uYyBiL3NvdW5kL3NvYy9zaC9zaXVfcGNtLmMKaW5kZXggZWQyOWM5ZS4uYTQyM2JhYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3NpdV9wY20uYworKysgYi9zb3VuZC9zb2Mvc2gvc2l1X3BjbS5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAKICNpbmNsdWRlIDxhc20vc2l1Lmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY2FjaGUuYyBiL3NvdW5kL3NvYy9zb2MtY2FjaGUuYwppbmRleCBkMjE0ZjAyLi44YzJhMjFhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNhY2hlLmMKKysrIGIvc291bmQvc29jL3NvYy1jYWNoZS5jCkBAIC0xNCwyNyArMTQsMzQgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8bGludXgvbHpvLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX3NvY180XzEyX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CiAKIAlpZiAocmVnID49IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIHx8CiAJCXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykpIHsKIAkJCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKIAkJCQlyZXR1cm4gLTE7CiAKKwkJCUJVR19PTighY29kZWMtPmh3X3JlYWQpOwogCQkJcmV0dXJuIGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOwogCX0KIAotCXJldHVybiBjYWNoZVtyZWddOworCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvY180XzEyX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKIAkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewotCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwogCXU4IGRhdGFbMl07CiAJaW50IHJldDsKIApAQCAtNDIsMTYgKzQ5LDE3IEBACiAJZGF0YVsxXSA9IHZhbHVlICYgMHgwMGZmOwogCiAJaWYgKCFzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpICYmCi0JCXJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplKQotCQkJY2FjaGVbcmVnXSA9IHZhbHVlOworCQlyZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQogCiAJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KSB7CiAJCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiMHgleCA9IDB4JXhcbiIsIHJlZywgdmFsdWUpOwotCiAJcmV0ID0gY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOwogCWlmIChyZXQgPT0gMikKIAkJcmV0dXJuIDA7CkBAIC03Nyw3ICs4NSw3IEBACiAJbXNnWzFdID0gZGF0YVswXTsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm0pOwotCW1lbXNldCgmdCwgMCwgKHNpemVvZiB0KSk7CisJbWVtc2V0KCZ0LCAwLCBzaXplb2YgdCk7CiAKIAl0LnR4X2J1ZiA9ICZtc2dbMF07CiAJdC5sZW4gPSBsZW47CkBAIC05NCwyMyArMTAyLDI3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfN185X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CiAKIAlpZiAocmVnID49IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIHx8CiAJCXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykpIHsKIAkJCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKIAkJCQlyZXR1cm4gLTE7CiAKKwkJCUJVR19PTighY29kZWMtPmh3X3JlYWQpOwogCQkJcmV0dXJuIGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOwogCX0KIAotCXJldHVybiBjYWNoZVtyZWddOworCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvY183Xzlfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAogCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTggZGF0YVsyXTsKIAlpbnQgcmV0OwogCkBAIC0xMTgsMTYgKzEzMCwxNyBAQAogCWRhdGFbMV0gPSB2YWx1ZSAmIDB4MDBmZjsKIAogCWlmICghc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSAmJgotCQlyZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKLQkJCWNhY2hlW3JlZ10gPSB2YWx1ZTsKKwkJcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUpIHsKKwkJcmV0ID0gc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmIChjb2RlYy0+Y2FjaGVfb25seSkgewogCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJCXJldHVybiAwOwogCX0KIAotCWRldl9kYmcoY29kZWMtPmRldiwgIjB4JXggPSAweCV4XG4iLCByZWcsIHZhbHVlKTsKLQogCXJldCA9IGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAyKTsKIAlpZiAocmV0ID09IDIpCiAJCXJldHVybiAwOwpAQCAtMTUzLDcgKzE2Niw3IEBACiAJbXNnWzFdID0gZGF0YVsxXTsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm0pOwotCW1lbXNldCgmdCwgMCwgKHNpemVvZiB0KSk7CisJbWVtc2V0KCZ0LCAwLCBzaXplb2YgdCk7CiAKIAl0LnR4X2J1ZiA9ICZtc2dbMF07CiAJdC5sZW4gPSBsZW47CkBAIC0xNzAsMjQgKzE4MywyNSBAQAogc3RhdGljIGludCBzbmRfc29jXzhfOF93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCiAJCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOwogCXU4IGRhdGFbMl07CisJaW50IHJldDsKIAogCXJlZyAmPSAweGZmOwogCWRhdGFbMF0gPSByZWc7CiAJZGF0YVsxXSA9IHZhbHVlICYgMHhmZjsKIAogCWlmICghc25kX3NvY19jb2RlY192b2xhdGlsZV9yZWdpc3Rlcihjb2RlYywgcmVnKSAmJgotCQlyZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkKLQkJCWNhY2hlW3JlZ10gPSB2YWx1ZTsKKwkJcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUpIHsKKwkJcmV0ID0gc25kX3NvY19jYWNoZV93cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmIChjb2RlYy0+Y2FjaGVfb25seSkgewogCQljb2RlYy0+Y2FjaGVfc3luYyA9IDE7CiAJCXJldHVybiAwOwogCX0KIAotCWRldl9kYmcoY29kZWMtPmRldiwgIjB4JXggPSAweCV4XG4iLCByZWcsIHZhbHVlKTsKLQogCWlmIChjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikgPT0gMikKIAkJcmV0dXJuIDA7CiAJZWxzZQpAQCAtMTk3LDcgKzIxMSw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfOF84X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1OCAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKIAogCXJlZyAmPSAweGZmOwogCWlmIChyZWcgPj0gY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUgfHwKQEAgLTIwNSwxMCArMjIwLDE0IEBACiAJCQlpZiAoY29kZWMtPmNhY2hlX29ubHkpCiAJCQkJcmV0dXJuIC0xOwogCisJCQlCVUdfT04oIWNvZGVjLT5od19yZWFkKTsKIAkJCXJldHVybiBjb2RlYy0+aHdfcmVhZChjb2RlYywgcmVnKTsKIAl9CiAKLQlyZXR1cm4gY2FjaGVbcmVnXTsKKwlyZXQgPSBzbmRfc29jX2NhY2hlX3JlYWQoY29kZWMsIHJlZywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gdmFsOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKQEAgLTIyNyw3ICsyNDYsNyBAQAogCW1zZ1sxXSA9IGRhdGFbMV07CiAKIAlzcGlfbWVzc2FnZV9pbml0KCZtKTsKLQltZW1zZXQoJnQsIDAsIChzaXplb2YgdCkpOworCW1lbXNldCgmdCwgMCwgc2l6ZW9mIHQpOwogCiAJdC50eF9idWYgPSAmbXNnWzBdOwogCXQubGVuID0gbGVuOwpAQCAtMjQ0LDI0ICsyNjMsMjUgQEAKIHN0YXRpYyBpbnQgc25kX3NvY184XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKIAkJCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKLQl1MTYgKnJlZ19jYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTggZGF0YVszXTsKKwlpbnQgcmV0OwogCiAJZGF0YVswXSA9IHJlZzsKIAlkYXRhWzFdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKIAlkYXRhWzJdID0gdmFsdWUgJiAweGZmOwogCiAJaWYgKCFzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpICYmCi0JICAgIHJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplKQotCQlyZWdfY2FjaGVbcmVnXSA9IHZhbHVlOworCQlyZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQogCiAJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KSB7CiAJCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiMHgleCA9IDB4JXhcbiIsIHJlZywgdmFsdWUpOwotCiAJaWYgKGNvZGVjLT5od193cml0ZShjb2RlYy0+Y29udHJvbF9kYXRhLCBkYXRhLCAzKSA9PSAzKQogCQlyZXR1cm4gMDsKIAllbHNlCkBAIC0yNzEsMTcgKzI5MSwyMiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzhfMTZfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZykKIHsKLQl1MTYgKmNhY2hlID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CiAKIAlpZiAocmVnID49IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplIHx8CiAJICAgIHNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykpIHsKIAkJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KQogCQkJcmV0dXJuIC0xOwogCisJCUJVR19PTighY29kZWMtPmh3X3JlYWQpOwogCQlyZXR1cm4gY29kZWMtPmh3X3JlYWQoY29kZWMsIHJlZyk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGNhY2hlW3JlZ107CiAJfQorCisJcmV0ID0gc25kX3NvY19jYWNoZV9yZWFkKGNvZGVjLCByZWcsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZhbDsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCkBAIC0zMDEsNyArMzI2LDcgQEAKIAltc2dbMl0gPSBkYXRhWzJdOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0JbWVtc2V0KCZ0LCAwLCAoc2l6ZW9mIHQpKTsKKwltZW1zZXQoJnQsIDAsIHNpemVvZiB0KTsKIAogCXQudHhfYnVmID0gJm1zZ1swXTsKIAl0LmxlbiA9IGxlbjsKQEAgLTQyMCw3ICs0NDUsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzbmRfc29jXzE2XzhfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnKQogewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCiAJcmVnICY9IDB4ZmY7CiAJaWYgKHJlZyA+PSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSB8fApAQCAtNDI4LDE2ICs0NTQsMTkgQEAKIAkJCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKIAkJCQlyZXR1cm4gLTE7CiAKKwkJCUJVR19PTighY29kZWMtPmh3X3JlYWQpOwogCQkJcmV0dXJuIGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOwogCX0KIAotCXJldHVybiBjYWNoZVtyZWddOworCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvY18xNl84X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKIAkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQogewotCXU4ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTggZGF0YVszXTsKIAlpbnQgcmV0OwogCkBAIC00NDcsMTYgKzQ3NiwxNyBAQAogCiAJcmVnICY9IDB4ZmY7CiAJaWYgKCFzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpICYmCi0JCXJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplKQotCQkJY2FjaGVbcmVnXSA9IHZhbHVlOworCQlyZWcgPCBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSkgeworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3dyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQogCiAJaWYgKGNvZGVjLT5jYWNoZV9vbmx5KSB7CiAJCWNvZGVjLT5jYWNoZV9zeW5jID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiMHgleCA9IDB4JXhcbiIsIHJlZywgdmFsdWUpOwotCiAJcmV0ID0gY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDMpOwogCWlmIChyZXQgPT0gMykKIAkJcmV0dXJuIDA7CkBAIC00ODMsNyArNTEzLDcgQEAKIAltc2dbMl0gPSBkYXRhWzJdOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0JbWVtc2V0KCZ0LCAwLCAoc2l6ZW9mIHQpKTsKKwltZW1zZXQoJnQsIDAsIHNpemVvZiB0KTsKIAogCXQudHhfYnVmID0gJm1zZ1swXTsKIAl0LmxlbiA9IGxlbjsKQEAgLTUzNCwyMyArNTY0LDI4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNuZF9zb2NfMTZfMTZfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcpCiB7Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOwogCiAJaWYgKHJlZyA+PSBjb2RlYy0+ZHJpdmVyLT5yZWdfY2FjaGVfc2l6ZSB8fAogCSAgICBzbmRfc29jX2NvZGVjX3ZvbGF0aWxlX3JlZ2lzdGVyKGNvZGVjLCByZWcpKSB7CiAJCWlmIChjb2RlYy0+Y2FjaGVfb25seSkKIAkJCXJldHVybiAtMTsKIAorCQlCVUdfT04oIWNvZGVjLT5od19yZWFkKTsKIAkJcmV0dXJuIGNvZGVjLT5od19yZWFkKGNvZGVjLCByZWcpOwogCX0KIAotCXJldHVybiBjYWNoZVtyZWddOworCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgcmVnLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIHZhbDsKIH0KIAogc3RhdGljIGludCBzbmRfc29jXzE2XzE2X3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7Ci0JdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CiAJdTggZGF0YVs0XTsKIAlpbnQgcmV0OwogCkBAIC01NjAsMTYgKzU5NSwxNyBAQAogCWRhdGFbM10gPSB2YWx1ZSAmIDB4ZmY7CiAKIAlpZiAoIXNuZF9zb2NfY29kZWNfdm9sYXRpbGVfcmVnaXN0ZXIoY29kZWMsIHJlZykgJiYKLQkJcmVnIDwgY29kZWMtPmRyaXZlci0+cmVnX2NhY2hlX3NpemUpCi0JCQljYWNoZVtyZWddID0gdmFsdWU7CisJCXJlZyA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplKSB7CisJCXJldCA9IHNuZF9zb2NfY2FjaGVfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtMTsKKwl9CiAKIAlpZiAoY29kZWMtPmNhY2hlX29ubHkpIHsKIAkJY29kZWMtPmNhY2hlX3N5bmMgPSAxOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIweCV4ID0gMHgleFxuIiwgcmVnLCB2YWx1ZSk7Ci0KIAlyZXQgPSBjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgNCk7CiAJaWYgKHJldCA9PSA0KQogCQlyZXR1cm4gMDsKQEAgLTU5Nyw3ICs2MzMsNyBAQAogCW1zZ1szXSA9IGRhdGFbM107CiAKIAlzcGlfbWVzc2FnZV9pbml0KCZtKTsKLQltZW1zZXQoJnQsIDAsIChzaXplb2YgdCkpOworCW1lbXNldCgmdCwgMCwgc2l6ZW9mIHQpOwogCiAJdC50eF9idWYgPSAmbXNnWzBdOwogCXQubGVuID0gbGVuOwpAQCAtNjkyLDggKzcyOCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNvZGVjLT5kcml2ZXItPndyaXRlID0gaW9fdHlwZXNbaV0ud3JpdGU7Ci0JY29kZWMtPmRyaXZlci0+cmVhZCA9IGlvX3R5cGVzW2ldLnJlYWQ7CisJY29kZWMtPndyaXRlID0gaW9fdHlwZXNbaV0ud3JpdGU7CisJY29kZWMtPnJlYWQgPSBpb190eXBlc1tpXS5yZWFkOwogCiAJc3dpdGNoIChjb250cm9sKSB7CiAJY2FzZSBTTkRfU09DX0NVU1RPTToKQEAgLTcyNCwzICs3NjAsOTMwIEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2NvZGVjX3NldF9jYWNoZV9pbyk7CisKK3N0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IHZhbHVlOworCXVuc2lnbmVkIGludCBkZWZ2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCB7CisJc3RydWN0IHJiX3Jvb3Qgcm9vdDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqc25kX3NvY19yYnRyZWVfbG9va3VwKAorCXN0cnVjdCByYl9yb290ICpyb290LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYm5vZGU7CisKKwlub2RlID0gcm9vdC0+cmJfbm9kZTsKKwl3aGlsZSAobm9kZSkgeworCQlyYm5vZGUgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUsIG5vZGUpOworCQlpZiAocmJub2RlLT5yZWcgPCByZWcpCisJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAocmJub2RlLT5yZWcgPiByZWcpCisJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiByYm5vZGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19yYnRyZWVfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCSBzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqbmV3LCAqcGFyZW50OworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYm5vZGVfdG1wOworCisJcGFyZW50ID0gTlVMTDsKKwluZXcgPSAmcm9vdC0+cmJfbm9kZTsKKwl3aGlsZSAoKm5ldykgeworCQlyYm5vZGVfdG1wID0gY29udGFpbmVyX29mKCpuZXcsIHN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlLAorCQkJCQkgIG5vZGUpOworCQlwYXJlbnQgPSAqbmV3OworCQlpZiAocmJub2RlX3RtcC0+cmVnIDwgcmJub2RlLT5yZWcpCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfbGVmdCk7CisJCWVsc2UgaWYgKHJibm9kZV90bXAtPnJlZyA+IHJibm9kZS0+cmVnKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogaW5zZXJ0IHRoZSBub2RlIGludG8gdGhlIHJidHJlZSAqLworCXJiX2xpbmtfbm9kZSgmcmJub2RlLT5ub2RlLCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZyYm5vZGUtPm5vZGUsIHJvb3QpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19yYnRyZWVfY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCAqcmJ0cmVlX2N0eDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZyYnRyZWVfY3R4LT5yb290KTsgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJcmJub2RlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUsIG5vZGUpOworCQlpZiAocmJub2RlLT52YWx1ZSA9PSByYm5vZGUtPmRlZnZhbCkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSBzbmRfc29jX2NhY2hlX3JlYWQoY29kZWMsIHJibm9kZS0+cmVnLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIHJibm9kZS0+cmVnLCB2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU3luY2VkIHJlZ2lzdGVyICUjeCwgdmFsdWUgPSAlI3hcbiIsCisJCQlyYm5vZGUtPnJlZywgdmFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX3JidHJlZV9jYWNoZV93cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9jdHggKnJidHJlZV9jdHg7CisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUgKnJibm9kZTsKKworCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCXJibm9kZSA9IHNuZF9zb2NfcmJ0cmVlX2xvb2t1cCgmcmJ0cmVlX2N0eC0+cm9vdCwgcmVnKTsKKwlpZiAocmJub2RlKSB7CisJCWlmIChyYm5vZGUtPnZhbHVlID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisJCXJibm9kZS0+dmFsdWUgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQkvKiBiYWlsIG91dCBlYXJseSwgbm8gbmVlZCB0byBjcmVhdGUgdGhlIHJibm9kZSB5ZXQgKi8KKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiAwOworCQkvKgorCQkgKiBmb3IgdW5pbml0aWFsaXplZCByZWdpc3RlcnMgd2hvc2UgdmFsdWUgaXMgY2hhbmdlZAorCQkgKiBmcm9tIHRoZSBkZWZhdWx0IHplcm8sIGNyZWF0ZSBhbiByYm5vZGUgYW5kIGluc2VydAorCQkgKiBpdCBpbnRvIHRoZSB0cmVlLgorCQkgKi8KKwkJcmJub2RlID0ga3phbGxvYyhzaXplb2YgKnJibm9kZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmJub2RlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJibm9kZS0+cmVnID0gcmVnOworCQlyYm5vZGUtPnZhbHVlID0gdmFsdWU7CisJCXNuZF9zb2NfcmJ0cmVlX2luc2VydCgmcmJ0cmVlX2N0eC0+cm9vdCwgcmJub2RlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX3JidHJlZV9jYWNoZV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCAqcmJ0cmVlX2N0eDsKKwlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJub2RlOworCisJcmJ0cmVlX2N0eCA9IGNvZGVjLT5yZWdfY2FjaGU7CisJcmJub2RlID0gc25kX3NvY19yYnRyZWVfbG9va3VwKCZyYnRyZWVfY3R4LT5yb290LCByZWcpOworCWlmIChyYm5vZGUpIHsKKwkJKnZhbHVlID0gcmJub2RlLT52YWx1ZTsKKwl9IGVsc2UgeworCQkvKiB1bmluaXRpYWxpemVkIHJlZ2lzdGVycyBkZWZhdWx0IHRvIDAgKi8KKwkJKnZhbHVlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX3JidHJlZV9jYWNoZV9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfY3R4ICpyYnRyZWVfY3R4OworCXN0cnVjdCBzbmRfc29jX3JidHJlZV9ub2RlICpyYnRyZWVfbm9kZTsKKworCS8qIGlmIHdlJ3ZlIGFscmVhZHkgYmVlbiBjYWxsZWQgdGhlbiBqdXN0IHJldHVybiAqLworCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmICghcmJ0cmVlX2N0eCkKKwkJcmV0dXJuIDA7CisKKwkvKiBmcmVlIHVwIHRoZSByYnRyZWUgKi8KKwluZXh0ID0gcmJfZmlyc3QoJnJidHJlZV9jdHgtPnJvb3QpOworCXdoaWxlIChuZXh0KSB7CisJCXJidHJlZV9ub2RlID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHNuZF9zb2NfcmJ0cmVlX25vZGUsIG5vZGUpOworCQluZXh0ID0gcmJfbmV4dCgmcmJ0cmVlX25vZGUtPm5vZGUpOworCQlyYl9lcmFzZSgmcmJ0cmVlX25vZGUtPm5vZGUsICZyYnRyZWVfY3R4LT5yb290KTsKKwkJa2ZyZWUocmJ0cmVlX25vZGUpOworCX0KKworCS8qIHJlbGVhc2UgdGhlIHJlc291cmNlcyAqLworCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19yYnRyZWVfY2FjaGVfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfcmJ0cmVlX2N0eCAqcmJ0cmVlX2N0eDsKKworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWFsbG9jKHNpemVvZiAqcmJ0cmVlX2N0eCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb2RlYy0+cmVnX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJidHJlZV9jdHggPSBjb2RlYy0+cmVnX2NhY2hlOworCXJidHJlZV9jdHgtPnJvb3QgPSBSQl9ST09UOworCisJaWYgKCFjb2RlYy0+cmVnX2RlZl9jb3B5KQorCQlyZXR1cm4gMDsKKworLyoKKyAqIHBvcHVsYXRlIHRoZSByYnRyZWUgd2l0aCB0aGUgaW5pdGlhbGl6ZWQgcmVnaXN0ZXJzLiAgQWxsIG90aGVyCisgKiByZWdpc3RlcnMgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIHdoZW4gdGhleSBhcmUgZmlyc3Qgd3JpdHRlbi4KKyAqCisgKiBUaGUgcmVhc29uaW5nIGJlaGluZCB0aGlzLCBpcyB0aGF0IHdlIG5lZWQgdG8gc3RlcCB0aHJvdWdoIGFuZAorICogZGVyZWZlcmVuY2UgdGhlIGNhY2hlIGluIHU4L3UxNiBpbmNyZW1lbnRzIHdpdGhvdXQgc2FjcmlmaWNpbmcKKyAqIHBvcnRhYmlsaXR5LiAgVGhpcyBjb3VsZCBhbHNvIGJlIGRvbmUgdXNpbmcgbWVtY3B5KCkgYnV0IHRoYXQgd291bGQKKyAqIGJlIHNsaWdodGx5IG1vcmUgY3J5cHRpYy4KKyAqLworI2RlZmluZSBzbmRfc29jX3JidHJlZV9wb3B1bGF0ZShjYWNoZSkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCByZXQsIGk7CQkJCQkJCVwKKwlzdHJ1Y3Qgc25kX3NvY19yYnRyZWVfbm9kZSAqcmJ0cmVlX25vZGU7CQkJXAorCQkJCQkJCQkJXAorCXJldCA9IDA7CQkJCQkJCVwKKwljYWNoZSA9IGNvZGVjLT5yZWdfZGVmX2NvcHk7CQkJCQlcCisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5kcml2ZXItPnJlZ19jYWNoZV9zaXplOyArK2kpIHsJCVwKKwkJaWYgKCFjYWNoZVtpXSkJCQkJCQlcCisJCQljb250aW51ZTsJCQkJCVwKKwkJcmJ0cmVlX25vZGUgPSBremFsbG9jKHNpemVvZiAqcmJ0cmVlX25vZGUsIEdGUF9LRVJORUwpOwlcCisJCWlmICghcmJ0cmVlX25vZGUpIHsJCQkJCVwKKwkJCXJldCA9IC1FTk9NRU07CQkJCQlcCisJCQlzbmRfc29jX2NhY2hlX2V4aXQoY29kZWMpOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJCXJidHJlZV9ub2RlLT5yZWcgPSBpOwkJCQkJXAorCQlyYnRyZWVfbm9kZS0+dmFsdWUgPSBjYWNoZVtpXTsJCQkJXAorCQlyYnRyZWVfbm9kZS0+ZGVmdmFsID0gY2FjaGVbaV07CQkJCVwKKwkJc25kX3NvY19yYnRyZWVfaW5zZXJ0KCZyYnRyZWVfY3R4LT5yb290LAkJXAorCQkJCSAgICAgIHJidHJlZV9ub2RlKTsJCQlcCisJfQkJCQkJCQkJXAorCXJldDsJCQkJCQkJCVwKK30pCisKKwlzd2l0Y2ggKGNvZGVjLT5kcml2ZXItPnJlZ193b3JkX3NpemUpIHsKKwljYXNlIDE6IHsKKwkJY29uc3QgdTggKmNhY2hlOworCisJCXJldHVybiBzbmRfc29jX3JidHJlZV9wb3B1bGF0ZShjYWNoZSk7CisJfQorCWNhc2UgMjogeworCQljb25zdCB1MTYgKmNhY2hlOworCisJCXJldHVybiBzbmRfc29jX3JidHJlZV9wb3B1bGF0ZShjYWNoZSk7CisJfQorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NORF9TT0NfQ0FDSEVfTFpPCitzdHJ1Y3Qgc25kX3NvY19sem9fY3R4IHsKKwl2b2lkICp3bWVtOworCXZvaWQgKmRzdDsKKwljb25zdCB2b2lkICpzcmM7CisJc2l6ZV90IHNyY19sZW47CisJc2l6ZV90IGRzdF9sZW47CisJc2l6ZV90IGRlY29tcHJlc3NlZF9zaXplOworCXVuc2lnbmVkIGxvbmcgKnN5bmNfYm1wOworCWludCBzeW5jX2JtcF9uYml0czsKK307CisKKyNkZWZpbmUgTFpPX0JMT0NLX05VTSA4CitzdGF0aWMgaW50IHNuZF9zb2NfbHpvX2Jsb2NrX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIExaT19CTE9DS19OVU07Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19sem9fcHJlcGFyZShzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICpsem9fY3R4KQoreworCWx6b19jdHgtPndtZW0gPSBrbWFsbG9jKExaTzFYX01FTV9DT01QUkVTUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFsem9fY3R4LT53bWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2x6b19jb21wcmVzcyhzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICpsem9fY3R4KQoreworCXNpemVfdCBjb21wcmVzc19zaXplOworCWludCByZXQ7CisKKwlyZXQgPSBsem8xeF8xX2NvbXByZXNzKGx6b19jdHgtPnNyYywgbHpvX2N0eC0+c3JjX2xlbiwKKwkJCSAgICAgICBsem9fY3R4LT5kc3QsICZjb21wcmVzc19zaXplLCBsem9fY3R4LT53bWVtKTsKKwlpZiAocmV0ICE9IExaT19FX09LIHx8IGNvbXByZXNzX3NpemUgPiBsem9fY3R4LT5kc3RfbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsem9fY3R4LT5kc3RfbGVuID0gY29tcHJlc3Nfc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2x6b19kZWNvbXByZXNzKHN0cnVjdCBzbmRfc29jX2x6b19jdHggKmx6b19jdHgpCit7CisJc2l6ZV90IGRzdF9sZW47CisJaW50IHJldDsKKworCWRzdF9sZW4gPSBsem9fY3R4LT5kc3RfbGVuOworCXJldCA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShsem9fY3R4LT5zcmMsIGx6b19jdHgtPnNyY19sZW4sCisJCQkJICAgIGx6b19jdHgtPmRzdCwgJmRzdF9sZW4pOworCWlmIChyZXQgIT0gTFpPX0VfT0sgfHwgZHN0X2xlbiAhPSBsem9fY3R4LT5kc3RfbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2x6b19jb21wcmVzc19jYWNoZV9ibG9jayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXN0cnVjdCBzbmRfc29jX2x6b19jdHggKmx6b19jdHgpCit7CisJaW50IHJldDsKKworCWx6b19jdHgtPmRzdF9sZW4gPSBsem8xeF93b3JzdF9jb21wcmVzcyhQQUdFX1NJWkUpOworCWx6b19jdHgtPmRzdCA9IGttYWxsb2MobHpvX2N0eC0+ZHN0X2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsem9fY3R4LT5kc3QpIHsKKwkJbHpvX2N0eC0+ZHN0X2xlbiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHNuZF9zb2NfbHpvX2NvbXByZXNzKGx6b19jdHgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfbHpvX2RlY29tcHJlc3NfY2FjaGVfYmxvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQlzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICpsem9fY3R4KQoreworCWludCByZXQ7CisKKwlsem9fY3R4LT5kc3RfbGVuID0gbHpvX2N0eC0+ZGVjb21wcmVzc2VkX3NpemU7CisJbHpvX2N0eC0+ZHN0ID0ga21hbGxvYyhsem9fY3R4LT5kc3RfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWx6b19jdHgtPmRzdCkgeworCQlsem9fY3R4LT5kc3RfbGVuID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gc25kX3NvY19sem9fZGVjb21wcmVzcyhsem9fY3R4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc25kX3NvY19sem9fZ2V0X2Jsa2luZGV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdW5zaWduZWQgaW50IHJlZykKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKKwlzaXplX3QgcmVnX3NpemU7CisKKwljb2RlY19kcnYgPSBjb2RlYy0+ZHJpdmVyOworCXJlZ19zaXplID0gY29kZWNfZHJ2LT5yZWdfY2FjaGVfc2l6ZSAqIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZTsKKwlyZXR1cm4gKHJlZyAqIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZSkgLworCSAgICAgICBESVZfUk9VTkRfVVAocmVnX3NpemUsIHNuZF9zb2NfbHpvX2Jsb2NrX2NvdW50KCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzbmRfc29jX2x6b19nZXRfYmxrcG9zKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdW5zaWduZWQgaW50IHJlZykKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKKwlzaXplX3QgcmVnX3NpemU7CisKKwljb2RlY19kcnYgPSBjb2RlYy0+ZHJpdmVyOworCXJlZ19zaXplID0gY29kZWNfZHJ2LT5yZWdfY2FjaGVfc2l6ZSAqIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZTsKKwlyZXR1cm4gcmVnICUgKERJVl9ST1VORF9VUChyZWdfc2l6ZSwgc25kX3NvY19sem9fYmxvY2tfY291bnQoKSkgLworCQkgICAgICBjb2RlY19kcnYtPnJlZ193b3JkX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzbmRfc29jX2x6b19nZXRfYmxrc2l6ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyICpjb2RlY19kcnY7CisJc2l6ZV90IHJlZ19zaXplOworCisJY29kZWNfZHJ2ID0gY29kZWMtPmRyaXZlcjsKKwlyZWdfc2l6ZSA9IGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemUgKiBjb2RlY19kcnYtPnJlZ193b3JkX3NpemU7CisJcmV0dXJuIERJVl9ST1VORF9VUChyZWdfc2l6ZSwgc25kX3NvY19sem9fYmxvY2tfY291bnQoKSk7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19sem9fY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfbHpvX2N0eCAqKmx6b19ibG9ja3M7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJbHpvX2Jsb2NrcyA9IGNvZGVjLT5yZWdfY2FjaGU7CisJZm9yX2VhY2hfc2V0X2JpdChpLCBsem9fYmxvY2tzWzBdLT5zeW5jX2JtcCwgbHpvX2Jsb2Nrc1swXS0+c3luY19ibXBfbmJpdHMpIHsKKwkJcmV0ID0gc25kX3NvY19jYWNoZV9yZWFkKGNvZGVjLCBpLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHNuZF9zb2Nfd3JpdGUoY29kZWMsIGksIHZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTeW5jZWQgcmVnaXN0ZXIgJSN4LCB2YWx1ZSA9ICUjeFxuIiwKKwkJCWksIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19sem9fY2FjaGVfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICpsem9fYmxvY2ssICoqbHpvX2Jsb2NrczsKKwlpbnQgcmV0LCBibGtpbmRleCwgYmxrcG9zOworCXNpemVfdCBibGtzaXplLCB0bXBfZHN0X2xlbjsKKwl2b2lkICp0bXBfZHN0OworCisJLyogaW5kZXggb2YgdGhlIGNvbXByZXNzZWQgbHpvIGJsb2NrICovCisJYmxraW5kZXggPSBzbmRfc29jX2x6b19nZXRfYmxraW5kZXgoY29kZWMsIHJlZyk7CisJLyogcmVnaXN0ZXIgaW5kZXggd2l0aGluIHRoZSBkZWNvbXByZXNzZWQgYmxvY2sgKi8KKwlibGtwb3MgPSBzbmRfc29jX2x6b19nZXRfYmxrcG9zKGNvZGVjLCByZWcpOworCS8qIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgKi8KKwlibGtzaXplID0gc25kX3NvY19sem9fZ2V0X2Jsa3NpemUoY29kZWMpOworCWx6b19ibG9ja3MgPSBjb2RlYy0+cmVnX2NhY2hlOworCWx6b19ibG9jayA9IGx6b19ibG9ja3NbYmxraW5kZXhdOworCisJLyogc2F2ZSB0aGUgcG9pbnRlciBhbmQgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGJsb2NrICovCisJdG1wX2RzdCA9IGx6b19ibG9jay0+ZHN0OworCXRtcF9kc3RfbGVuID0gbHpvX2Jsb2NrLT5kc3RfbGVuOworCisJLyogcHJlcGFyZSB0aGUgc291cmNlIHRvIGJlIHRoZSBjb21wcmVzc2VkIGJsb2NrICovCisJbHpvX2Jsb2NrLT5zcmMgPSBsem9fYmxvY2stPmRzdDsKKwlsem9fYmxvY2stPnNyY19sZW4gPSBsem9fYmxvY2stPmRzdF9sZW47CisKKwkvKiBkZWNvbXByZXNzIHRoZSBibG9jayAqLworCXJldCA9IHNuZF9zb2NfbHpvX2RlY29tcHJlc3NfY2FjaGVfYmxvY2soY29kZWMsIGx6b19ibG9jayk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUobHpvX2Jsb2NrLT5kc3QpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB3cml0ZSB0aGUgbmV3IHZhbHVlIHRvIHRoZSBjYWNoZSAqLworCXN3aXRjaCAoY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSkgeworCWNhc2UgMTogeworCQl1OCAqY2FjaGU7CisJCWNhY2hlID0gbHpvX2Jsb2NrLT5kc3Q7CisJCWlmIChjYWNoZVtibGtwb3NdID09IHZhbHVlKSB7CisJCQlrZnJlZShsem9fYmxvY2stPmRzdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQljYWNoZVtibGtwb3NdID0gdmFsdWU7CisJfQorCWJyZWFrOworCWNhc2UgMjogeworCQl1MTYgKmNhY2hlOworCQljYWNoZSA9IGx6b19ibG9jay0+ZHN0OworCQlpZiAoY2FjaGVbYmxrcG9zXSA9PSB2YWx1ZSkgeworCQkJa2ZyZWUobHpvX2Jsb2NrLT5kc3QpOworCQkJZ290byBvdXQ7CisJCX0KKwkJY2FjaGVbYmxrcG9zXSA9IHZhbHVlOworCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKiBwcmVwYXJlIHRoZSBzb3VyY2UgdG8gYmUgdGhlIGRlY29tcHJlc3NlZCBibG9jayAqLworCWx6b19ibG9jay0+c3JjID0gbHpvX2Jsb2NrLT5kc3Q7CisJbHpvX2Jsb2NrLT5zcmNfbGVuID0gbHpvX2Jsb2NrLT5kc3RfbGVuOworCisJLyogY29tcHJlc3MgdGhlIGJsb2NrICovCisJcmV0ID0gc25kX3NvY19sem9fY29tcHJlc3NfY2FjaGVfYmxvY2soY29kZWMsIGx6b19ibG9jayk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUobHpvX2Jsb2NrLT5kc3QpOworCQlrZnJlZShsem9fYmxvY2stPnNyYyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHNldCB0aGUgYml0IHNvIHdlIGtub3cgd2UgaGF2ZSB0byBzeW5jIHRoaXMgcmVnaXN0ZXIgKi8KKwlzZXRfYml0KHJlZywgbHpvX2Jsb2NrLT5zeW5jX2JtcCk7CisJa2ZyZWUodG1wX2RzdCk7CisJa2ZyZWUobHpvX2Jsb2NrLT5zcmMpOworCXJldHVybiAwOworb3V0OgorCWx6b19ibG9jay0+ZHN0ID0gdG1wX2RzdDsKKwlsem9fYmxvY2stPmRzdF9sZW4gPSB0bXBfZHN0X2xlbjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfbHpvX2NhY2hlX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICpsem9fYmxvY2ssICoqbHpvX2Jsb2NrczsKKwlpbnQgcmV0LCBibGtpbmRleCwgYmxrcG9zOworCXNpemVfdCBibGtzaXplLCB0bXBfZHN0X2xlbjsKKwl2b2lkICp0bXBfZHN0OworCisJKnZhbHVlID0gMDsKKwkvKiBpbmRleCBvZiB0aGUgY29tcHJlc3NlZCBsem8gYmxvY2sgKi8KKwlibGtpbmRleCA9IHNuZF9zb2NfbHpvX2dldF9ibGtpbmRleChjb2RlYywgcmVnKTsKKwkvKiByZWdpc3RlciBpbmRleCB3aXRoaW4gdGhlIGRlY29tcHJlc3NlZCBibG9jayAqLworCWJsa3BvcyA9IHNuZF9zb2NfbHpvX2dldF9ibGtwb3MoY29kZWMsIHJlZyk7CisJLyogc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBibG9jayAqLworCWJsa3NpemUgPSBzbmRfc29jX2x6b19nZXRfYmxrc2l6ZShjb2RlYyk7CisJbHpvX2Jsb2NrcyA9IGNvZGVjLT5yZWdfY2FjaGU7CisJbHpvX2Jsb2NrID0gbHpvX2Jsb2Nrc1tibGtpbmRleF07CisKKwkvKiBzYXZlIHRoZSBwb2ludGVyIGFuZCBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgKi8KKwl0bXBfZHN0ID0gbHpvX2Jsb2NrLT5kc3Q7CisJdG1wX2RzdF9sZW4gPSBsem9fYmxvY2stPmRzdF9sZW47CisKKwkvKiBwcmVwYXJlIHRoZSBzb3VyY2UgdG8gYmUgdGhlIGNvbXByZXNzZWQgYmxvY2sgKi8KKwlsem9fYmxvY2stPnNyYyA9IGx6b19ibG9jay0+ZHN0OworCWx6b19ibG9jay0+c3JjX2xlbiA9IGx6b19ibG9jay0+ZHN0X2xlbjsKKworCS8qIGRlY29tcHJlc3MgdGhlIGJsb2NrICovCisJcmV0ID0gc25kX3NvY19sem9fZGVjb21wcmVzc19jYWNoZV9ibG9jayhjb2RlYywgbHpvX2Jsb2NrKTsKKwlpZiAocmV0ID49IDApIHsKKwkJLyogZmV0Y2ggdGhlIHZhbHVlIGZyb20gdGhlIGNhY2hlICovCisJCXN3aXRjaCAoY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSkgeworCQljYXNlIDE6IHsKKwkJCXU4ICpjYWNoZTsKKwkJCWNhY2hlID0gbHpvX2Jsb2NrLT5kc3Q7CisJCQkqdmFsdWUgPSBjYWNoZVtibGtwb3NdOworCQl9CisJCWJyZWFrOworCQljYXNlIDI6IHsKKwkJCXUxNiAqY2FjaGU7CisJCQljYWNoZSA9IGx6b19ibG9jay0+ZHN0OworCQkJKnZhbHVlID0gY2FjaGVbYmxrcG9zXTsKKwkJfQorCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJfQorCisJa2ZyZWUobHpvX2Jsb2NrLT5kc3QpOworCS8qIHJlc3RvcmUgdGhlIHBvaW50ZXIgYW5kIGxlbmd0aCBvZiB0aGUgY29tcHJlc3NlZCBibG9jayAqLworCWx6b19ibG9jay0+ZHN0ID0gdG1wX2RzdDsKKwlsem9fYmxvY2stPmRzdF9sZW4gPSB0bXBfZHN0X2xlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2x6b19jYWNoZV9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICoqbHpvX2Jsb2NrczsKKwlpbnQgaSwgYmxrY291bnQ7CisKKwlsem9fYmxvY2tzID0gY29kZWMtPnJlZ19jYWNoZTsKKwlpZiAoIWx6b19ibG9ja3MpCisJCXJldHVybiAwOworCisJYmxrY291bnQgPSBzbmRfc29jX2x6b19ibG9ja19jb3VudCgpOworCS8qCisJICogdGhlIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCB1c2VkIGZvciBzeW5jaW5nIHRoZSBjYWNoZQorCSAqIGlzIHNoYXJlZCBhbW9uZ3N0IGFsbCBsem9fYmxvY2tzLiAgRW5zdXJlIGl0IGlzIGZyZWVkCisJICogb25seSBvbmNlLgorCSAqLworCWlmIChsem9fYmxvY2tzWzBdKQorCQlrZnJlZShsem9fYmxvY2tzWzBdLT5zeW5jX2JtcCk7CisJZm9yIChpID0gMDsgaSA8IGJsa2NvdW50OyArK2kpIHsKKwkJaWYgKGx6b19ibG9ja3NbaV0pIHsKKwkJCWtmcmVlKGx6b19ibG9ja3NbaV0tPndtZW0pOworCQkJa2ZyZWUobHpvX2Jsb2Nrc1tpXS0+ZHN0KTsKKwkJfQorCQkvKiBlYWNoIGx6b19ibG9jayBpcyBhIHBvaW50ZXIgcmV0dXJuZWQgYnkga21hbGxvYyBvciBOVUxMICovCisJCWtmcmVlKGx6b19ibG9ja3NbaV0pOworCX0KKwlrZnJlZShsem9fYmxvY2tzKTsKKwljb2RlYy0+cmVnX2NhY2hlID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2x6b19jYWNoZV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19sem9fY3R4ICoqbHpvX2Jsb2NrczsKKwlzaXplX3QgcmVnX3NpemUsIGJtcF9zaXplOworCWNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciAqY29kZWNfZHJ2OworCWludCByZXQsIHRvZnJlZSwgaSwgYmxrc2l6ZSwgYmxrY291bnQ7CisJY29uc3QgY2hhciAqcCwgKmVuZDsKKwl1bnNpZ25lZCBsb25nICpzeW5jX2JtcDsKKworCXJldCA9IDA7CisJY29kZWNfZHJ2ID0gY29kZWMtPmRyaXZlcjsKKwlyZWdfc2l6ZSA9IGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemUgKiBjb2RlY19kcnYtPnJlZ193b3JkX3NpemU7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbm90IGJlZW4gZ2l2ZW4gYSBkZWZhdWx0IHJlZ2lzdGVyIGNhY2hlCisJICogdGhlbiBhbGxvY2F0ZSBhIGR1bW15IHplcm8tZWQgb3V0IHJlZ2lvbiwgY29tcHJlc3MgaXQKKwkgKiBhbmQgcmVtZW1iZXIgdG8gZnJlZSBpdCBhZnRlcndhcmRzLgorCSAqLworCXRvZnJlZSA9IDA7CisJaWYgKCFjb2RlYy0+cmVnX2RlZl9jb3B5KQorCQl0b2ZyZWUgPSAxOworCisJaWYgKCFjb2RlYy0+cmVnX2RlZl9jb3B5KSB7CisJCWNvZGVjLT5yZWdfZGVmX2NvcHkgPSBremFsbG9jKHJlZ19zaXplLAorCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNvZGVjLT5yZWdfZGVmX2NvcHkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlibGtjb3VudCA9IHNuZF9zb2NfbHpvX2Jsb2NrX2NvdW50KCk7CisJY29kZWMtPnJlZ19jYWNoZSA9IGt6YWxsb2MoYmxrY291bnQgKiBzaXplb2YgKmx6b19ibG9ja3MsCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb2RlYy0+cmVnX2NhY2hlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3RvZnJlZTsKKwl9CisJbHpvX2Jsb2NrcyA9IGNvZGVjLT5yZWdfY2FjaGU7CisKKwkvKgorCSAqIGFsbG9jYXRlIGEgYml0bWFwIHRvIGJlIHVzZWQgd2hlbiBzeW5jaW5nIHRoZSBjYWNoZSB3aXRoCisJICogdGhlIGhhcmR3YXJlLiAgRWFjaCB0aW1lIGEgcmVnaXN0ZXIgaXMgbW9kaWZpZWQsIHRoZSBjb3JyZXNwb25kaW5nCisJICogYml0IGlzIHNldCBpbiB0aGUgYml0bWFwLCBzbyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSB0byBzeW5jCisJICogdGhhdCByZWdpc3Rlci4KKwkgKi8KKwlibXBfc2l6ZSA9IGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemU7CisJc3luY19ibXAgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1MoYm1wX3NpemUpICogc2l6ZW9mKGxvbmcpLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzeW5jX2JtcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJYml0bWFwX3plcm8oc3luY19ibXAsIGJtcF9zaXplKTsKKworCS8qIGFsbG9jYXRlIHRoZSBsem8gYmxvY2tzIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmxrY291bnQ7ICsraSkgeworCQlsem9fYmxvY2tzW2ldID0ga3phbGxvYyhzaXplb2YgKipsem9fYmxvY2tzLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFsem9fYmxvY2tzW2ldKSB7CisJCQlrZnJlZShzeW5jX2JtcCk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnI7CisJCX0KKwkJbHpvX2Jsb2Nrc1tpXS0+c3luY19ibXAgPSBzeW5jX2JtcDsKKwkJbHpvX2Jsb2Nrc1tpXS0+c3luY19ibXBfbmJpdHMgPSBibXBfc2l6ZTsKKwkJLyogYWxsb2MgdGhlIHdvcmtpbmcgc3BhY2UgZm9yIHRoZSBjb21wcmVzc2VkIGJsb2NrICovCisJCXJldCA9IHNuZF9zb2NfbHpvX3ByZXBhcmUobHpvX2Jsb2Nrc1tpXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJYmxrc2l6ZSA9IHNuZF9zb2NfbHpvX2dldF9ibGtzaXplKGNvZGVjKTsKKwlwID0gY29kZWMtPnJlZ19kZWZfY29weTsKKwllbmQgPSBjb2RlYy0+cmVnX2RlZl9jb3B5ICsgcmVnX3NpemU7CisJLyogY29tcHJlc3MgdGhlIHJlZ2lzdGVyIG1hcCBhbmQgZmlsbCB0aGUgbHpvIGJsb2NrcyAqLworCWZvciAoaSA9IDA7IGkgPCBibGtjb3VudDsgKytpLCBwICs9IGJsa3NpemUpIHsKKwkJbHpvX2Jsb2Nrc1tpXS0+c3JjID0gcDsKKwkJaWYgKHAgKyBibGtzaXplID4gZW5kKQorCQkJbHpvX2Jsb2Nrc1tpXS0+c3JjX2xlbiA9IGVuZCAtIHA7CisJCWVsc2UKKwkJCWx6b19ibG9ja3NbaV0tPnNyY19sZW4gPSBibGtzaXplOworCQlyZXQgPSBzbmRfc29jX2x6b19jb21wcmVzc19jYWNoZV9ibG9jayhjb2RlYywKKwkJCQkJCSAgICAgICBsem9fYmxvY2tzW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKwkJbHpvX2Jsb2Nrc1tpXS0+ZGVjb21wcmVzc2VkX3NpemUgPQorCQkJbHpvX2Jsb2Nrc1tpXS0+c3JjX2xlbjsKKwl9CisKKwlpZiAodG9mcmVlKSB7CisJCWtmcmVlKGNvZGVjLT5yZWdfZGVmX2NvcHkpOworCQljb2RlYy0+cmVnX2RlZl9jb3B5ID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJc25kX3NvY19jYWNoZV9leGl0KGNvZGVjKTsKK2Vycl90b2ZyZWU6CisJaWYgKHRvZnJlZSkgeworCQlrZnJlZShjb2RlYy0+cmVnX2RlZl9jb3B5KTsKKwkJY29kZWMtPnJlZ19kZWZfY29weSA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzbmRfc29jX2ZsYXRfY2FjaGVfc3luYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJaW50IHJldDsKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJY29kZWNfZHJ2ID0gY29kZWMtPmRyaXZlcjsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWNfZHJ2LT5yZWdfY2FjaGVfc2l6ZTsgKytpKSB7CisJCXJldCA9IHNuZF9zb2NfY2FjaGVfcmVhZChjb2RlYywgaSwgJnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAoY29kZWNfZHJ2LT5yZWdfY2FjaGVfZGVmYXVsdCkgeworCQkJc3dpdGNoIChjb2RlY19kcnYtPnJlZ193b3JkX3NpemUpIHsKKwkJCWNhc2UgMTogeworCQkJCWNvbnN0IHU4ICpjYWNoZTsKKworCQkJCWNhY2hlID0gY29kZWNfZHJ2LT5yZWdfY2FjaGVfZGVmYXVsdDsKKwkJCQlpZiAoY2FjaGVbaV0gPT0gdmFsKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQkJY2FzZSAyOiB7CisJCQkJY29uc3QgdTE2ICpjYWNoZTsKKworCQkJCWNhY2hlID0gY29kZWNfZHJ2LT5yZWdfY2FjaGVfZGVmYXVsdDsKKwkJCQlpZiAoY2FjaGVbaV0gPT0gdmFsKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCQlyZXQgPSBzbmRfc29jX3dyaXRlKGNvZGVjLCBpLCB2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU3luY2VkIHJlZ2lzdGVyICUjeCwgdmFsdWUgPSAlI3hcbiIsCisJCQlpLCB2YWwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc29jX2ZsYXRfY2FjaGVfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJc3dpdGNoIChjb2RlYy0+ZHJpdmVyLT5yZWdfd29yZF9zaXplKSB7CisJY2FzZSAxOiB7CisJCXU4ICpjYWNoZTsKKworCQljYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJCWNhY2hlW3JlZ10gPSB2YWx1ZTsKKwl9CisJYnJlYWs7CisJY2FzZSAyOiB7CisJCXUxNiAqY2FjaGU7CisKKwkJY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCQljYWNoZVtyZWddID0gdmFsdWU7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfZmxhdF9jYWNoZV9yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQoreworCXN3aXRjaCAoY29kZWMtPmRyaXZlci0+cmVnX3dvcmRfc2l6ZSkgeworCWNhc2UgMTogeworCQl1OCAqY2FjaGU7CisKKwkJY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCQkqdmFsdWUgPSBjYWNoZVtyZWddOworCX0KKwlicmVhazsKKwljYXNlIDI6IHsKKwkJdTE2ICpjYWNoZTsKKworCQljYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJCSp2YWx1ZSA9IGNhY2hlW3JlZ107CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfZmxhdF9jYWNoZV9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoIWNvZGVjLT5yZWdfY2FjaGUpCisJCXJldHVybiAwOworCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfZmxhdF9jYWNoZV9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgKmNvZGVjX2RydjsKKwlzaXplX3QgcmVnX3NpemU7CisKKwljb2RlY19kcnYgPSBjb2RlYy0+ZHJpdmVyOworCXJlZ19zaXplID0gY29kZWNfZHJ2LT5yZWdfY2FjaGVfc2l6ZSAqIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZTsKKworCS8qCisJICogZm9yIGZsYXQgY29tcHJlc3Npb24sIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBhIGNvcHkgb2YgdGhlCisJICogb3JpZ2luYWwgZGVmYXVsdHMgcmVnaXN0ZXIgY2FjaGUgYXMgaXQgd2lsbCBkZWZpbml0ZWx5IG5vdAorCSAqIGJlIG1hcmtlZCBhcyBfX2RldmluaXRjb25zdAorCSAqLworCWtmcmVlKGNvZGVjLT5yZWdfZGVmX2NvcHkpOworCWNvZGVjLT5yZWdfZGVmX2NvcHkgPSBOVUxMOworCisJaWYgKGNvZGVjX2Rydi0+cmVnX2NhY2hlX2RlZmF1bHQpCisJCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKGNvZGVjX2Rydi0+cmVnX2NhY2hlX2RlZmF1bHQsCisJCQkJCSAgIHJlZ19zaXplLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWNvZGVjLT5yZWdfY2FjaGUgPSBremFsbG9jKHJlZ19zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvZGVjLT5yZWdfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGFuIGFycmF5IG9mIGFsbCBzdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jYWNoZV9vcHMgY2FjaGVfdHlwZXNbXSA9IHsKKwkvKiBGbGF0ICptdXN0KiBiZSB0aGUgZmlyc3QgZW50cnkgZm9yIGZhbGxiYWNrICovCisJeworCQkuaWQgPSBTTkRfU09DX0ZMQVRfQ09NUFJFU1NJT04sCisJCS5uYW1lID0gImZsYXQiLAorCQkuaW5pdCA9IHNuZF9zb2NfZmxhdF9jYWNoZV9pbml0LAorCQkuZXhpdCA9IHNuZF9zb2NfZmxhdF9jYWNoZV9leGl0LAorCQkucmVhZCA9IHNuZF9zb2NfZmxhdF9jYWNoZV9yZWFkLAorCQkud3JpdGUgPSBzbmRfc29jX2ZsYXRfY2FjaGVfd3JpdGUsCisJCS5zeW5jID0gc25kX3NvY19mbGF0X2NhY2hlX3N5bmMKKwl9LAorI2lmZGVmIENPTkZJR19TTkRfU09DX0NBQ0hFX0xaTworCXsKKwkJLmlkID0gU05EX1NPQ19MWk9fQ09NUFJFU1NJT04sCisJCS5uYW1lID0gIkxaTyIsCisJCS5pbml0ID0gc25kX3NvY19sem9fY2FjaGVfaW5pdCwKKwkJLmV4aXQgPSBzbmRfc29jX2x6b19jYWNoZV9leGl0LAorCQkucmVhZCA9IHNuZF9zb2NfbHpvX2NhY2hlX3JlYWQsCisJCS53cml0ZSA9IHNuZF9zb2NfbHpvX2NhY2hlX3dyaXRlLAorCQkuc3luYyA9IHNuZF9zb2NfbHpvX2NhY2hlX3N5bmMKKwl9LAorI2VuZGlmCisJeworCQkuaWQgPSBTTkRfU09DX1JCVFJFRV9DT01QUkVTU0lPTiwKKwkJLm5hbWUgPSAicmJ0cmVlIiwKKwkJLmluaXQgPSBzbmRfc29jX3JidHJlZV9jYWNoZV9pbml0LAorCQkuZXhpdCA9IHNuZF9zb2NfcmJ0cmVlX2NhY2hlX2V4aXQsCisJCS5yZWFkID0gc25kX3NvY19yYnRyZWVfY2FjaGVfcmVhZCwKKwkJLndyaXRlID0gc25kX3NvY19yYnRyZWVfY2FjaGVfd3JpdGUsCisJCS5zeW5jID0gc25kX3NvY19yYnRyZWVfY2FjaGVfc3luYworCX0KK307CisKK2ludCBzbmRfc29jX2NhY2hlX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FjaGVfdHlwZXMpOyArK2kpCisJCWlmIChjYWNoZV90eXBlc1tpXS5pZCA9PSBjb2RlYy0+Y29tcHJlc3NfdHlwZSkKKwkJCWJyZWFrOworCisJLyogRmFsbCBiYWNrIHRvIGZsYXQgY29tcHJlc3Npb24gKi8KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGNhY2hlX3R5cGVzKSkgeworCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiQ291bGQgbm90IG1hdGNoIGNvbXByZXNzIHR5cGU6ICVkXG4iLAorCQkJIGNvZGVjLT5jb21wcmVzc190eXBlKTsKKwkJaSA9IDA7CisJfQorCisJbXV0ZXhfaW5pdCgmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKKwljb2RlYy0+Y2FjaGVfb3BzID0gJmNhY2hlX3R5cGVzW2ldOworCisJaWYgKGNvZGVjLT5jYWNoZV9vcHMtPmluaXQpIHsKKwkJaWYgKGNvZGVjLT5jYWNoZV9vcHMtPm5hbWUpCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJJbml0aWFsaXppbmcgJXMgY2FjaGUgZm9yICVzIGNvZGVjXG4iLAorCQkJCWNvZGVjLT5jYWNoZV9vcHMtPm5hbWUsIGNvZGVjLT5uYW1lKTsKKwkJcmV0dXJuIGNvZGVjLT5jYWNoZV9vcHMtPmluaXQoY29kZWMpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIE5PVEU6IGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgY2FsbGVkCisgKiBtdWx0aXBsZSB0aW1lcy4KKyAqLworaW50IHNuZF9zb2NfY2FjaGVfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaWYgKGNvZGVjLT5jYWNoZV9vcHMgJiYgY29kZWMtPmNhY2hlX29wcy0+ZXhpdCkgeworCQlpZiAoY29kZWMtPmNhY2hlX29wcy0+bmFtZSkKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIkRlc3Ryb3lpbmcgJXMgY2FjaGUgZm9yICVzIGNvZGVjXG4iLAorCQkJCWNvZGVjLT5jYWNoZV9vcHMtPm5hbWUsIGNvZGVjLT5uYW1lKTsKKwkJcmV0dXJuIGNvZGVjLT5jYWNoZV9vcHMtPmV4aXQoY29kZWMpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBzbmRfc29jX2NhY2hlX3JlYWQ6IEZldGNoIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIHJlZ2lzdGVyIGZyb20gdGhlIGNhY2hlLgorICoKKyAqIEBjb2RlYzogQ09ERUMgdG8gY29uZmlndXJlLgorICogQHJlZzogVGhlIHJlZ2lzdGVyIGluZGV4LgorICogQHZhbHVlOiBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuCisgKi8KK2ludCBzbmRfc29jX2NhY2hlX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKKworCWlmICh2YWx1ZSAmJiBjb2RlYy0+Y2FjaGVfb3BzICYmIGNvZGVjLT5jYWNoZV9vcHMtPnJlYWQpIHsKKwkJcmV0ID0gY29kZWMtPmNhY2hlX29wcy0+cmVhZChjb2RlYywgcmVnLCB2YWx1ZSk7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXRleF91bmxvY2soJmNvZGVjLT5jYWNoZV9yd19tdXRleCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2NhY2hlX3JlYWQpOworCisvKioKKyAqIHNuZF9zb2NfY2FjaGVfd3JpdGU6IFNldCB0aGUgdmFsdWUgb2YgYSBnaXZlbiByZWdpc3RlciBpbiB0aGUgY2FjaGUuCisgKgorICogQGNvZGVjOiBDT0RFQyB0byBjb25maWd1cmUuCisgKiBAcmVnOiBUaGUgcmVnaXN0ZXIgaW5kZXguCisgKiBAdmFsdWU6IFRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUuCisgKi8KK2ludCBzbmRfc29jX2NhY2hlX3dyaXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKKworCWlmIChjb2RlYy0+Y2FjaGVfb3BzICYmIGNvZGVjLT5jYWNoZV9vcHMtPndyaXRlKSB7CisJCXJldCA9IGNvZGVjLT5jYWNoZV9vcHMtPndyaXRlKGNvZGVjLCByZWcsIHZhbHVlKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y2FjaGVfcndfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCW11dGV4X3VubG9jaygmY29kZWMtPmNhY2hlX3J3X211dGV4KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY2FjaGVfd3JpdGUpOworCisvKioKKyAqIHNuZF9zb2NfY2FjaGVfc3luYzogU3luYyB0aGUgcmVnaXN0ZXIgY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUuCisgKgorICogQGNvZGVjOiBDT0RFQyB0byBjb25maWd1cmUuCisgKgorICogQW55IHJlZ2lzdGVycyB0aGF0IHNob3VsZCBub3QgYmUgc3luY2VkIHNob3VsZCBiZSBtYXJrZWQgYXMKKyAqIHZvbGF0aWxlLiAgSW4gZ2VuZXJhbCBkcml2ZXJzIGNhbiBjaG9vc2Ugbm90IHRvIHVzZSB0aGUgcHJvdmlkZWQKKyAqIHN5bmNpbmcgZnVuY3Rpb25hbGl0eSBpZiB0aGV5IHNvIHJlcXVpcmUuCisgKi8KK2ludCBzbmRfc29jX2NhY2hlX3N5bmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQ7CisKKwlpZiAoIWNvZGVjLT5jYWNoZV9zeW5jKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChjb2RlYy0+Y2FjaGVfb3BzICYmIGNvZGVjLT5jYWNoZV9vcHMtPnN5bmMpIHsKKwkJaWYgKGNvZGVjLT5jYWNoZV9vcHMtPm5hbWUpCisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTeW5jaW5nICVzIGNhY2hlIGZvciAlcyBjb2RlY1xuIiwKKwkJCQljb2RlYy0+Y2FjaGVfb3BzLT5uYW1lLCBjb2RlYy0+bmFtZSk7CisJCXJldCA9IGNvZGVjLT5jYWNoZV9vcHMtPnN5bmMoY29kZWMpOworCQlpZiAoIXJldCkKKwkJCWNvZGVjLT5jYWNoZV9zeW5jID0gMDsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfY2FjaGVfc3luYyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IDg1YjdkNTQuLmJhYzcyOTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0zMywxMiArMzMsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgorCiAjZGVmaW5lIE5BTUVfU0laRQkzMgogCiBzdGF0aWMgREVGSU5FX01VVEVYKHBjbV9tdXRleCk7CkBAIC02NywyNSArNzAsNiBAQAogbW9kdWxlX3BhcmFtKHBtZG93bl90aW1lLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwbWRvd25fdGltZSwgIkRBUE0gc3RyZWFtIHBvd2VyZG93biB0aW1lIChtc2VjcykiKTsKIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFueSBkZWxheWVkIHdvcmsgdG8gYmUgcXVldWVkIGFuZCBydW4uCi0gKi8KLXN0YXRpYyBpbnQgcnVuX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKLXsKLQlpbnQgcmV0OwotCi0JLyogY2FuY2VsIGFueSB3b3JrIHdhaXRpbmcgdG8gYmUgcXVldWVkLiAqLwotCXJldCA9IGNhbmNlbF9kZWxheWVkX3dvcmsoZHdvcmspOwotCi0JLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAotCSAqIHdhaXQgZm9yIGl0J3MgY29tcGxldGlvbiAqLwotCWlmIChyZXQpIHsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKGR3b3JrLCAwKTsKLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLyogY29kZWMgcmVnaXN0ZXIgZHVtcCAqLwogc3RhdGljIHNzaXplX3Qgc29jX2NvZGVjX3JlZ19zaG93KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY2hhciAqYnVmKQogewpAQCAtMTE0LDcgKzk4LDcgQEAKIAkJCSAqIHRoZSByZWdpc3RlciBiZWluZyB2b2xhdGlsZSBhbmQgdGhlIGRldmljZSBiZWluZwogCQkJICogcG93ZXJlZCBvZmYuCiAJCQkgKi8KLQkJCXJldCA9IGNvZGVjLT5kcml2ZXItPnJlYWQoY29kZWMsIGkpOworCQkJcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBpKTsKIAkJCWlmIChyZXQgPj0gMCkKIAkJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwKIAkJCQkJCSAgUEFHRV9TSVpFIC0gY291bnQsCkBAIC0yMjUsNyArMjA5LDcgQEAKIAkJc3RhcnQrKzsKIAlpZiAoc3RyaWN0X3N0cnRvdWwoc3RhcnQsIDE2LCAmdmFsdWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQljb2RlYy0+ZHJpdmVyLT53cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7CisJc25kX3NvY193cml0ZShjb2RlYywgcmVnLCB2YWx1ZSk7CiAJcmV0dXJuIGJ1Zl9zaXplOwogfQogCkBAIC0yMzgsOCArMjIyLDEwIEBACiAKIHN0YXRpYyB2b2lkIHNvY19pbml0X2NvZGVjX2RlYnVnZnMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQogewotCWNvZGVjLT5kZWJ1Z2ZzX2NvZGVjX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY29kZWMtPm5hbWUgLAotCQkJCQkJICAgICAgIGRlYnVnZnNfcm9vdCk7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19jYXJkX3Jvb3QgPSBjb2RlYy0+Y2FyZC0+ZGVidWdmc19jYXJkX3Jvb3Q7CisKKwljb2RlYy0+ZGVidWdmc19jb2RlY19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGNvZGVjLT5uYW1lLAorCQkJCQkJICAgICAgIGRlYnVnZnNfY2FyZF9yb290KTsKIAlpZiAoIWNvZGVjLT5kZWJ1Z2ZzX2NvZGVjX3Jvb3QpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgZGVidWdmcyBkaXJlY3RvcnlcbiIpOwpAQCAtMjUzLDIwICsyMzksMTMgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgcmVnaXN0ZXIgZGVidWdmcyBmaWxlXG4iKTsKIAotCWNvZGVjLT5kZWJ1Z2ZzX3BvcF90aW1lID0gZGVidWdmc19jcmVhdGVfdTMyKCJkYXBtX3BvcF90aW1lIiwgMDY0NCwKLQkJCQkJCSAgICAgY29kZWMtPmRlYnVnZnNfY29kZWNfcm9vdCwKLQkJCQkJCSAgICAgJmNvZGVjLT5wb3BfdGltZSk7Ci0JaWYgKCFjb2RlYy0+ZGVidWdmc19wb3BfdGltZSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcG9wIHRpbWUgZGVidWdmcyBmaWxlXG4iKTsKLQotCWNvZGVjLT5kZWJ1Z2ZzX2RhcG0gPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhcG0iLAorCWNvZGVjLT5kYXBtLmRlYnVnZnNfZGFwbSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGFwbSIsCiAJCQkJCQkgY29kZWMtPmRlYnVnZnNfY29kZWNfcm9vdCk7Ci0JaWYgKCFjb2RlYy0+ZGVidWdmc19kYXBtKQorCWlmICghY29kZWMtPmRhcG0uZGVidWdmc19kYXBtKQogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBEQVBNIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKIAotCXNuZF9zb2NfZGFwbV9kZWJ1Z2ZzX2luaXQoY29kZWMpOworCXNuZF9zb2NfZGFwbV9kZWJ1Z2ZzX2luaXQoJmNvZGVjLT5kYXBtKTsKIH0KIAogc3RhdGljIHZvaWQgc29jX2NsZWFudXBfY29kZWNfZGVidWdmcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCkBAIC0zNzQsNiArMzUzLDI5IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLC8qIHJlYWQgYWNjZXNzZXMgZl9wb3MgKi8KIH07CiAKK3N0YXRpYyB2b2lkIHNvY19pbml0X2NhcmRfZGVidWdmcyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCWNhcmQtPmRlYnVnZnNfY2FyZF9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKGNhcmQtPm5hbWUsCisJCQkJCQkgICAgIGRlYnVnZnNfcm9vdCk7CisJaWYgKCFjYXJkLT5kZWJ1Z2ZzX2NhcmRfcm9vdCkgeworCQlkZXZfd2FybihjYXJkLT5kZXYsCisJCQkgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgY29kZWMgZGVidWdmcyBkaXJlY3RvcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJY2FyZC0+ZGVidWdmc19wb3BfdGltZSA9IGRlYnVnZnNfY3JlYXRlX3UzMigiZGFwbV9wb3BfdGltZSIsIDA2NDQsCisJCQkJCQkgICAgY2FyZC0+ZGVidWdmc19jYXJkX3Jvb3QsCisJCQkJCQkgICAgJmNhcmQtPnBvcF90aW1lKTsKKwlpZiAoIWNhcmQtPmRlYnVnZnNfcG9wX3RpbWUpCisJCWRldl93YXJuKGNhcmQtPmRldiwKKwkJICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBvcCB0aW1lIGRlYnVnZnMgZmlsZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNvY19jbGVhbnVwX2NhcmRfZGVidWdmcyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShjYXJkLT5kZWJ1Z2ZzX2NhcmRfcm9vdCk7Cit9CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzb2NfaW5pdF9jb2RlY19kZWJ1Z2ZzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKQEAgLTM4Myw2ICszODUsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzb2NfY2xlYW51cF9jb2RlY19kZWJ1Z2ZzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIHNvY19pbml0X2NhcmRfZGVidWdmcyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc29jX2NsZWFudXBfY2FyZF9kZWJ1Z2ZzKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7Cit9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTkRfU09DX0FDOTdfQlVTCkBAIC00OTcsNyArNTA3LDcgQEAKIAkJfQogCX0KIAotCS8qIENoZWNrIHRoYXQgdGhlIGNvZGVjIGFuZCBjcHUgREFJJ3MgYXJlIGNvbXBhdGlibGUgKi8KKwkvKiBDaGVjayB0aGF0IHRoZSBjb2RlYyBhbmQgY3B1IERBSXMgYXJlIGNvbXBhdGlibGUgKi8KIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlydW50aW1lLT5ody5yYXRlX21pbiA9CiAJCQltYXgoY29kZWNfZGFpX2Rydi0+cGxheWJhY2sucmF0ZV9taW4sCkBAIC04NDYsNyArODU2LDcgQEAKIH0KIAogLyoKLSAqIEZyZWUncyByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGh3X3BhcmFtcywgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcworICogRnJlZXMgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBod19wYXJhbXMsIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKICAqLwogc3RhdGljIGludCBzb2NfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CkBAIC04NzAsNyArODgwLDcgQEAKIAlpZiAocGxhdGZvcm0tPmRyaXZlci0+b3BzLT5od19mcmVlKQogCQlwbGF0Zm9ybS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtKTsKIAotCS8qIG5vdyBmcmVlIGh3IHBhcmFtcyBmb3IgdGhlIERBSSdzICAqLworCS8qIG5vdyBmcmVlIGh3IHBhcmFtcyBmb3IgdGhlIERBSXMgICovCiAJaWYgKGNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUpCiAJCWNvZGVjX2RhaS0+ZHJpdmVyLT5vcHMtPmh3X2ZyZWUoc3Vic3RyZWFtLCBjb2RlY19kYWkpOwogCkBAIC05NTgsNiArOTY4LDcgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlpbnQgaTsKIAogCS8qIElmIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIHNvYyBkZXZpY2UgZmFpbGVkLCB0aGVyZSBpcyBubyBjb2RlYwpAQCAtOTc2LDcgKzk4Nyw3IEBACiAJLyogd2UncmUgZ29pbmcgdG8gYmxvY2sgdXNlcnNwYWNlIHRvdWNoaW5nIHVzIHVudGlsIHJlc3VtZSBjb21wbGV0ZXMgKi8KIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQtPnNuZF9jYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwogCi0JLyogbXV0ZSBhbnkgYWN0aXZlIERBQydzICovCisJLyogbXV0ZSBhbnkgYWN0aXZlIERBQ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX3J0ZDsgaSsrKSB7CiAJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpID0gY2FyZC0+cnRkW2ldLmNvZGVjX2RhaTsKIAkJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZHJ2ID0gZGFpLT5kcml2ZXI7CkBAIC0xMDE2LDggKzEwMjcsOCBAQAogCiAJLyogY2xvc2UgYW55IHdhaXRpbmcgc3RyZWFtcyBhbmQgc2F2ZSBzdGF0ZSAqLwogCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspIHsKLQkJcnVuX2RlbGF5ZWRfd29yaygmY2FyZC0+cnRkW2ldLmRlbGF5ZWRfd29yayk7Ci0JCWNhcmQtPnJ0ZFtpXS5jb2RlYy0+c3VzcGVuZF9iaWFzX2xldmVsID0gY2FyZC0+cnRkW2ldLmNvZGVjLT5iaWFzX2xldmVsOworCQlmbHVzaF9kZWxheWVkX3dvcmtfc3luYygmY2FyZC0+cnRkW2ldLmRlbGF5ZWRfd29yayk7CisJCWNhcmQtPnJ0ZFtpXS5jb2RlYy0+ZGFwbS5zdXNwZW5kX2JpYXNfbGV2ZWwgPSBjYXJkLT5ydGRbaV0uY29kZWMtPmRhcG0uYmlhc19sZXZlbDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX3J0ZDsgaSsrKSB7CkBAIC0xMDM2LDEyICsxMDQ3LDExIEBACiAJfQogCiAJLyogc3VzcGVuZCBhbGwgQ09ERUNzICovCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjYXJkLT5ydGRbaV0uY29kZWM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNhcmQtPmNvZGVjX2Rldl9saXN0LCBjYXJkX2xpc3QpIHsKIAkJLyogSWYgdGhlcmUgYXJlIHBhdGhzIGFjdGl2ZSB0aGVuIHRoZSBDT0RFQyB3aWxsIGJlIGhlbGQgd2l0aAogCQkgKiBiaWFzIF9PTiBhbmQgc2hvdWxkIG5vdCBiZSBzdXNwZW5kZWQuICovCiAJCWlmICghY29kZWMtPnN1c3BlbmRlZCAmJiBjb2RlYy0+ZHJpdmVyLT5zdXNwZW5kKSB7Ci0JCQlzd2l0Y2ggKGNvZGVjLT5iaWFzX2xldmVsKSB7CisJCQlzd2l0Y2ggKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpIHsKIAkJCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCQljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCQkJY29kZWMtPmRyaXZlci0+c3VzcGVuZChjb2RlYywgUE1TR19TVVNQRU5EKTsKQEAgLTEwNzgsNiArMTA4OCw3IEBACiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9CiAJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfY2FyZCwgZGVmZXJyZWRfcmVzdW1lX3dvcmspOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoY2FyZC0+ZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJaW50IGk7CiAKIAkvKiBvdXIgcG93ZXIgc3RhdGUgaXMgc3RpbGwgU05EUlZfQ1RMX1BPV0VSX0QzaG90IGZyb20gc3VzcGVuZCB0aW1lLApAQCAtMTEwMywxNCArMTExNCwxMyBAQAogCQkJY3B1X2RhaS0+ZHJpdmVyLT5yZXN1bWUoY3B1X2RhaSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjYXJkLT5ydGRbaV0uY29kZWM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNhcmQtPmNvZGVjX2Rldl9saXN0LCBjYXJkX2xpc3QpIHsKIAkJLyogSWYgdGhlIENPREVDIHdhcyBpZGxlIG92ZXIgc3VzcGVuZCB0aGVuIGl0IHdpbGwgaGF2ZSBiZWVuCiAJCSAqIGxlZnQgd2l0aCBiaWFzIE9GRiBvciBTVEFOREJZIGFuZCBzdXNwZW5kZWQgc28gd2UgbXVzdCBub3cKIAkJICogcmVzdW1lLiAgT3RoZXJ3aXNlIHRoZSBzdXNwZW5kIHdhcyBzdXBwcmVzc2VkLgogCQkgKi8KIAkJaWYgKGNvZGVjLT5kcml2ZXItPnJlc3VtZSAmJiBjb2RlYy0+c3VzcGVuZGVkKSB7Ci0JCQlzd2l0Y2ggKGNvZGVjLT5iaWFzX2xldmVsKSB7CisJCQlzd2l0Y2ggKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpIHsKIAkJCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCQljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCQkJY29kZWMtPmRyaXZlci0+cmVzdW1lKGNvZGVjKTsKQEAgLTEyNDksOSArMTI1OSw2IEBACiAJCWlmICghc3RyY21wKGNvZGVjLT5uYW1lLCBkYWlfbGluay0+Y29kZWNfbmFtZSkpIHsKIAkJCXJ0ZC0+Y29kZWMgPSBjb2RlYzsKIAotCQkJaWYgKCF0cnlfbW9kdWxlX2dldChjb2RlYy0+ZGV2LT5kcml2ZXItPm93bmVyKSkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQogCQkJLyogQ09ERUMgZm91bmQsIHNvIGZpbmQgQ09ERUMgREFJIGZyb20gcmVnaXN0ZXJlZCBEQUlzIGZyb20gdGhpcyBDT0RFQyovCiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjX2RhaSwgJmRhaV9saXN0LCBsaXN0KSB7CiAJCQkJaWYgKGNvZGVjLT5kZXYgPT0gY29kZWNfZGFpLT5kZXYgJiYKQEAgLTEyNzcsMTAgKzEyODQsNiBAQAogCS8qIG5vLCB0aGVuIGZpbmQgQ1BVIERBSSBmcm9tIHJlZ2lzdGVyZWQgREFJcyovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwbGF0Zm9ybSwgJnBsYXRmb3JtX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFzdHJjbXAocGxhdGZvcm0tPm5hbWUsIGRhaV9saW5rLT5wbGF0Zm9ybV9uYW1lKSkgewotCi0JCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHBsYXRmb3JtLT5kZXYtPmRyaXZlci0+b3duZXIpKQotCQkJCXJldHVybiAtRU5PREVWOwotCiAJCQlydGQtPnBsYXRmb3JtID0gcGxhdGZvcm07CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTI5OSw2ICsxMzAyLDI3IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyB2b2lkIHNvY19yZW1vdmVfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBlcnI7CisKKwlpZiAoY29kZWMtPmRyaXZlci0+cmVtb3ZlKSB7CisJCWVyciA9IGNvZGVjLT5kcml2ZXItPnJlbW92ZShjb2RlYyk7CisJCWlmIChlcnIgPCAwKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJhc29jOiBmYWlsZWQgdG8gcmVtb3ZlICVzOiAlZFxuIiwKKwkJCQljb2RlYy0+bmFtZSwgZXJyKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWxsIERBUE0gd2lkZ2V0cyBhcmUgZnJlZWQgKi8KKwlzbmRfc29jX2RhcG1fZnJlZSgmY29kZWMtPmRhcG0pOworCisJc29jX2NsZWFudXBfY29kZWNfZGVidWdmcyhjb2RlYyk7CisJY29kZWMtPnByb2JlZCA9IDA7CisJbGlzdF9kZWwoJmNvZGVjLT5jYXJkX2xpc3QpOworCW1vZHVsZV9wdXQoY29kZWMtPmRldi0+ZHJpdmVyLT5vd25lcik7Cit9CisKIHN0YXRpYyB2b2lkIHNvY19yZW1vdmVfZGFpX2xpbmsoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwgaW50IG51bSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gJmNhcmQtPnJ0ZFtudW1dOwpAQCAtMTMxMCw2ICsxMzM0LDcgQEAKIAkvKiB1bnJlZ2lzdGVyIHRoZSBydGQgZGV2aWNlICovCiAJaWYgKHJ0ZC0+ZGV2X3JlZ2lzdGVyZWQpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZydGQtPmRldiwgJmRldl9hdHRyX3BtZG93bl90aW1lKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZydGQtPmRldiwgJmRldl9hdHRyX2NvZGVjX3JlZyk7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZydGQtPmRldik7CiAJCXJ0ZC0+ZGV2X3JlZ2lzdGVyZWQgPSAwOwogCX0KQEAgLTEzMzgsMjIgKzEzNjMsOCBAQAogCX0KIAogCS8qIHJlbW92ZSB0aGUgQ09ERUMgKi8KLQlpZiAoY29kZWMgJiYgY29kZWMtPnByb2JlZCkgewotCQlpZiAoY29kZWMtPmRyaXZlci0+cmVtb3ZlKSB7Ci0JCQllcnIgPSBjb2RlYy0+ZHJpdmVyLT5yZW1vdmUoY29kZWMpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBmYWlsZWQgdG8gcmVtb3ZlICVzXG4iLCBjb2RlYy0+bmFtZSk7Ci0JCX0KLQotCQkvKiBNYWtlIHN1cmUgYWxsIERBUE0gd2lkZ2V0cyBhcmUgZnJlZWQgKi8KLQkJc25kX3NvY19kYXBtX2ZyZWUoY29kZWMpOwotCi0JCXNvY19jbGVhbnVwX2NvZGVjX2RlYnVnZnMoY29kZWMpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnJ0ZC0+ZGV2LCAmZGV2X2F0dHJfY29kZWNfcmVnKTsKLQkJY29kZWMtPnByb2JlZCA9IDA7Ci0JCWxpc3RfZGVsKCZjb2RlYy0+Y2FyZF9saXN0KTsKLQkJbW9kdWxlX3B1dChjb2RlYy0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQl9CisJaWYgKGNvZGVjICYmIGNvZGVjLT5wcm9iZWQpCisJCXNvY19yZW1vdmVfY29kZWMoY29kZWMpOwogCiAJLyogcmVtb3ZlIHRoZSBjcHVfZGFpICovCiAJaWYgKGNwdV9kYWkgJiYgY3B1X2RhaS0+cHJvYmVkKSB7CkBAIC0xMzY4LDggKzEzNzksMTI2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzb2Nfc2V0X25hbWVfcHJlZml4KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpOworCisJaWYgKGNhcmQtPmNvZGVjX2NvbmYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9jb25maWdzOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiAqbWFwID0gJmNhcmQtPmNvZGVjX2NvbmZbaV07CisJCWlmIChtYXAtPmRldl9uYW1lICYmICFzdHJjbXAoY29kZWMtPm5hbWUsIG1hcC0+ZGV2X25hbWUpKSB7CisJCQljb2RlYy0+bmFtZV9wcmVmaXggPSBtYXAtPm5hbWVfcHJlZml4OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc29jX3Byb2JlX2NvZGVjKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IHJldCA9IDA7CisKKwljb2RlYy0+Y2FyZCA9IGNhcmQ7CisJY29kZWMtPmRhcG0uY2FyZCA9IGNhcmQ7CisJc29jX3NldF9uYW1lX3ByZWZpeChjYXJkLCBjb2RlYyk7CisKKwlpZiAoY29kZWMtPmRyaXZlci0+cHJvYmUpIHsKKwkJcmV0ID0gY29kZWMtPmRyaXZlci0+cHJvYmUoY29kZWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSJhc29jOiBmYWlsZWQgdG8gcHJvYmUgQ09ERUMgJXM6ICVkXG4iLAorCQkJCWNvZGVjLT5uYW1lLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXNvY19pbml0X2NvZGVjX2RlYnVnZnMoY29kZWMpOworCisJLyogbWFyayBjb2RlYyBhcyBwcm9iZWQgYW5kIGFkZCB0byBjYXJkIGNvZGVjIGxpc3QgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNvZGVjLT5kZXYtPmRyaXZlci0+b3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNvZGVjLT5wcm9iZWQgPSAxOworCWxpc3RfYWRkKCZjb2RlYy0+Y2FyZF9saXN0LCAmY2FyZC0+Y29kZWNfZGV2X2xpc3QpOworCWxpc3RfYWRkKCZjb2RlYy0+ZGFwbS5saXN0LCAmY2FyZC0+ZGFwbV9saXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIHJ0ZF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikge30KIAorc3RhdGljIGludCBzb2NfcG9zdF9jb21wb25lbnRfaW5pdChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAorCQkJCSAgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgICBpbnQgbnVtLCBpbnQgZGFpbGVzcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX2F1eF9kZXYgKmF1eF9kZXYgPSBOVUxMOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisJY29uc3QgY2hhciAqdGVtcCwgKm5hbWU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRhaWxlc3MpIHsKKwkJZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbbnVtXTsKKwkJcnRkID0gJmNhcmQtPnJ0ZFtudW1dOworCQluYW1lID0gZGFpX2xpbmstPm5hbWU7CisJfSBlbHNlIHsKKwkJYXV4X2RldiA9ICZjYXJkLT5hdXhfZGV2W251bV07CisJCXJ0ZCA9ICZjYXJkLT5ydGRfYXV4W251bV07CisJCW5hbWUgPSBhdXhfZGV2LT5uYW1lOworCX0KKworCS8qIG1hY2hpbmUgY29udHJvbHMsIHJvdXRlcyBhbmQgd2lkZ2V0cyBhcmUgbm90IHByZWZpeGVkICovCisJdGVtcCA9IGNvZGVjLT5uYW1lX3ByZWZpeDsKKwljb2RlYy0+bmFtZV9wcmVmaXggPSBOVUxMOworCisJLyogZG8gbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworCWlmICghZGFpbGVzcyAmJiBkYWlfbGluay0+aW5pdCkKKwkJcmV0ID0gZGFpX2xpbmstPmluaXQocnRkKTsKKwllbHNlIGlmIChkYWlsZXNzICYmIGF1eF9kZXYtPmluaXQpCisJCXJldCA9IGF1eF9kZXYtPmluaXQoJmNvZGVjLT5kYXBtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgImFzb2M6IGZhaWxlZCB0byBpbml0ICVzOiAlZFxuIiwgbmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY29kZWMtPm5hbWVfcHJlZml4ID0gdGVtcDsKKworCS8qIE1ha2Ugc3VyZSBhbGwgREFQTSB3aWRnZXRzIGFyZSBpbnN0YW50aWF0ZWQgKi8KKwlzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmNvZGVjLT5kYXBtKTsKKwlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCisJLyogcmVnaXN0ZXIgdGhlIHJ0ZCBkZXZpY2UgKi8KKwlydGQtPmNvZGVjID0gY29kZWM7CisJcnRkLT5jYXJkID0gY2FyZDsKKwlydGQtPmRldi5wYXJlbnQgPSBjYXJkLT5kZXY7CisJcnRkLT5kZXYucmVsZWFzZSA9IHJ0ZF9yZWxlYXNlOworCXJ0ZC0+ZGV2LmluaXRfbmFtZSA9IG5hbWU7CisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZydGQtPmRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiYXNvYzogZmFpbGVkIHRvIHJlZ2lzdGVyIHJ1bnRpbWUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcnRkLT5kZXZfcmVnaXN0ZXJlZCA9IDE7CisKKwkvKiBhZGQgREFQTSBzeXNmcyBlbnRyaWVzIGZvciB0aGlzIGNvZGVjICovCisJcmV0ID0gc25kX3NvY19kYXBtX3N5c19hZGQoJnJ0ZC0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJImFzb2M6IGZhaWxlZCB0byBhZGQgY29kZWMgZGFwbSBzeXNmcyBlbnRyaWVzOiAlZFxuIiwKKwkJCXJldCk7CisKKwkvKiBhZGQgY29kZWMgc3lzZnMgZW50cmllcyAqLworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcnRkLT5kZXYsICZkZXZfYXR0cl9jb2RlY19yZWcpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkiYXNvYzogZmFpbGVkIHRvIGFkZCBjb2RlYyBzeXNmcyBmaWxlczogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzb2NfcHJvYmVfZGFpX2xpbmsoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwgaW50IG51bSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbbnVtXTsKQEAgLTEzODMsMTAgKzE1MTIsNyBAQAogCiAJLyogY29uZmlnIGNvbXBvbmVudHMgKi8KIAljb2RlY19kYWktPmNvZGVjID0gY29kZWM7Ci0JY29kZWMtPmNhcmQgPSBjYXJkOwogCWNwdV9kYWktPnBsYXRmb3JtID0gcGxhdGZvcm07Ci0JcnRkLT5jYXJkID0gY2FyZDsKLQlydGQtPmRldi5wYXJlbnQgPSBjYXJkLT5kZXY7CiAJY29kZWNfZGFpLT5jYXJkID0gY2FyZDsKIAljcHVfZGFpLT5jYXJkID0gY2FyZDsKIApAQCAtMTQxMCwyMCArMTUzNiw5IEBACiAKIAkvKiBwcm9iZSB0aGUgQ09ERUMgKi8KIAlpZiAoIWNvZGVjLT5wcm9iZWQpIHsKLQkJaWYgKGNvZGVjLT5kcml2ZXItPnByb2JlKSB7Ci0JCQlyZXQgPSBjb2RlYy0+ZHJpdmVyLT5wcm9iZShjb2RlYyk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIHByb2JlIENPREVDICVzXG4iLAotCQkJCQkJY29kZWMtPm5hbWUpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQotCQlzb2NfaW5pdF9jb2RlY19kZWJ1Z2ZzKGNvZGVjKTsKLQotCQkvKiBtYXJrIGNvZGVjIGFzIHByb2JlZCBhbmQgYWRkIHRvIGNhcmQgY29kZWMgbGlzdCAqLwotCQljb2RlYy0+cHJvYmVkID0gMTsKLQkJbGlzdF9hZGQoJmNvZGVjLT5jYXJkX2xpc3QsICZjYXJkLT5jb2RlY19kZXZfbGlzdCk7CisJCXJldCA9IHNvY19wcm9iZV9jb2RlYyhjYXJkLCBjb2RlYyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBwcm9iZSB0aGUgcGxhdGZvcm0gKi8KQEAgLTE0MzcsNiArMTU1MiwxMCBAQAogCQkJfQogCQl9CiAJCS8qIG1hcmsgcGxhdGZvcm0gYXMgcHJvYmVkIGFuZCBhZGQgdG8gY2FyZCBwbGF0Zm9ybSBsaXN0ICovCisKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChwbGF0Zm9ybS0+ZGV2LT5kcml2ZXItPm93bmVyKSkKKwkJCXJldHVybiAtRU5PREVWOworCiAJCXBsYXRmb3JtLT5wcm9iZWQgPSAxOwogCQlsaXN0X2FkZCgmcGxhdGZvcm0tPmNhcmRfbGlzdCwgJmNhcmQtPnBsYXRmb3JtX2Rldl9saXN0KTsKIAl9CkBAIC0xNDYwLDQzICsxNTc5LDE0IEBACiAJLyogREFQTSBkYWkgbGluayBzdHJlYW0gd29yayAqLwogCUlOSVRfREVMQVlFRF9XT1JLKCZydGQtPmRlbGF5ZWRfd29yaywgY2xvc2VfZGVsYXllZF93b3JrKTsKIAotCS8qIG5vdyB0aGF0IGFsbCBjbGllbnRzIGhhdmUgcHJvYmVkLCBpbml0aWFsaXNlIHRoZSBEQUkgbGluayAqLwotCWlmIChkYWlfbGluay0+aW5pdCkgewotCQlyZXQgPSBkYWlfbGluay0+aW5pdChydGQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhc29jOiBmYWlsZWQgdG8gaW5pdCAlc1xuIiwgZGFpX2xpbmstPnN0cmVhbV9uYW1lKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKiBNYWtlIHN1cmUgYWxsIERBUE0gd2lkZ2V0cyBhcmUgaW5zdGFudGlhdGVkICovCi0Jc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7Ci0KLQkvKiByZWdpc3RlciB0aGUgcnRkIGRldmljZSAqLwotCXJ0ZC0+ZGV2LnJlbGVhc2UgPSBydGRfcmVsZWFzZTsKLQlydGQtPmRldi5pbml0X25hbWUgPSBkYWlfbGluay0+bmFtZTsKLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnJ0ZC0+ZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byByZWdpc3RlciBEQUkgcnVudGltZSBkZXZpY2UgJWRcbiIsIHJldCk7CisJcmV0ID0gc29jX3Bvc3RfY29tcG9uZW50X2luaXQoY2FyZCwgY29kZWMsIG51bSwgMCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9CiAKLQlydGQtPmRldl9yZWdpc3RlcmVkID0gMTsKIAlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnJ0ZC0+ZGV2LCAmZGV2X2F0dHJfcG1kb3duX3RpbWUpOwogCWlmIChyZXQgPCAwKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhc29jOiBmYWlsZWQgdG8gYWRkIHBtZG93bl90aW1lIHN5c2ZzXG4iKTsKIAotCS8qIGFkZCBEQVBNIHN5c2ZzIGVudHJpZXMgZm9yIHRoaXMgY29kZWMgKi8KLQlyZXQgPSBzbmRfc29jX2RhcG1fc3lzX2FkZCgmcnRkLT5kZXYpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhc29jOiBmYWlsZWQgdG8gYWRkIGNvZGVjIGRhcG0gc3lzZnMgZW50cmllc1xuIik7Ci0KLQkvKiBhZGQgY29kZWMgc3lzZnMgZW50cmllcyAqLwotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcnRkLT5kZXYsICZkZXZfYXR0cl9jb2RlY19yZWcpOwotCWlmIChyZXQgPCAwKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhc29jOiBmYWlsZWQgdG8gYWRkIGNvZGVjIHN5c2ZzIGZpbGVzXG4iKTsKLQogCS8qIGNyZWF0ZSB0aGUgcGNtICovCiAJcmV0ID0gc29jX25ld19wY20ocnRkLCBudW0pOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xNTUxLDkgKzE2NDEsODUgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IHNvY19wcm9iZV9hdXhfZGV2KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsIGludCBudW0pCit7CisJc3RydWN0IHNuZF9zb2NfYXV4X2RldiAqYXV4X2RldiA9ICZjYXJkLT5hdXhfZGV2W251bV07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCWludCByZXQgPSAtRU5PREVWOworCisJLyogZmluZCBDT0RFQyBmcm9tIHJlZ2lzdGVyZWQgQ09ERUNzKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmY29kZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cmNtcChjb2RlYy0+bmFtZSwgYXV4X2Rldi0+Y29kZWNfbmFtZSkpIHsKKwkJCWlmIChjb2RlYy0+cHJvYmVkKSB7CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCQkiYXNvYzogY29kZWMgYWxyZWFkeSBwcm9iZWQiKTsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCS8qIGNvZGVjIG5vdCBmb3VuZCAqLworCWRldl9lcnIoY2FyZC0+ZGV2LCAiYXNvYzogY29kZWMgJXMgbm90IGZvdW5kIiwgYXV4X2Rldi0+Y29kZWNfbmFtZSk7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCWlmICghdHJ5X21vZHVsZV9nZXQoY29kZWMtPmRldi0+ZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gc29jX3Byb2JlX2NvZGVjKGNhcmQsIGNvZGVjKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNvY19wb3N0X2NvbXBvbmVudF9pbml0KGNhcmQsIGNvZGVjLCBudW0sIDEpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc29jX3JlbW92ZV9hdXhfZGV2KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsIGludCBudW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9ICZjYXJkLT5ydGRfYXV4W251bV07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKworCS8qIHVucmVnaXN0ZXIgdGhlIHJ0ZCBkZXZpY2UgKi8KKwlpZiAocnRkLT5kZXZfcmVnaXN0ZXJlZCkgeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnJ0ZC0+ZGV2LCAmZGV2X2F0dHJfY29kZWNfcmVnKTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnJ0ZC0+ZGV2KTsKKwkJcnRkLT5kZXZfcmVnaXN0ZXJlZCA9IDA7CisJfQorCisJaWYgKGNvZGVjICYmIGNvZGVjLT5wcm9iZWQpCisJCXNvY19yZW1vdmVfY29kZWMoY29kZWMpOworfQorCitzdGF0aWMgaW50IHNuZF9zb2NfaW5pdF9jb2RlY19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkJICAgIGVudW0gc25kX3NvY19jb21wcmVzc190eXBlIGNvbXByZXNzX3R5cGUpCit7CisJaW50IHJldDsKKworCWlmIChjb2RlYy0+Y2FjaGVfaW5pdCkKKwkJcmV0dXJuIDA7CisKKwkvKiBvdmVycmlkZSB0aGUgY29tcHJlc3NfdHlwZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoY29tcHJlc3NfdHlwZSAmJiBjb2RlYy0+Y29tcHJlc3NfdHlwZSAhPSBjb21wcmVzc190eXBlKQorCQljb2RlYy0+Y29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGU7CisJcmV0ID0gc25kX3NvY19jYWNoZV9pbml0KGNvZGVjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IGNhY2hlIGNvbXByZXNzaW9uIHR5cGU6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY29kZWMtPmNhY2hlX2luaXQgPSAxOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzbmRfc29jX2luc3RhbnRpYXRlX2NhcmQoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGNhcmQtPmRldik7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgKmNvZGVjX2NvbmY7CisJZW51bSBzbmRfc29jX2NvbXByZXNzX3R5cGUgY29tcHJlc3NfdHlwZTsKIAlpbnQgcmV0LCBpOwogCiAJbXV0ZXhfbG9jaygmY2FyZC0+bXV0ZXgpOwpAQCAtMTU3Myw2ICsxNzM5LDM5IEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBpbml0aWFsaXplIHRoZSByZWdpc3RlciBjYWNoZSBmb3IgZWFjaCBhdmFpbGFibGUgY29kZWMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmY29kZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoY29kZWMtPmNhY2hlX2luaXQpCisJCQljb250aW51ZTsKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGNvbXByZXNzX3R5cGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9jb25maWdzOyArK2kpIHsKKwkJCWNvZGVjX2NvbmYgPSAmY2FyZC0+Y29kZWNfY29uZltpXTsKKwkJCWlmICghc3RyY21wKGNvZGVjLT5uYW1lLCBjb2RlY19jb25mLT5kZXZfbmFtZSkpIHsKKwkJCQljb21wcmVzc190eXBlID0gY29kZWNfY29uZi0+Y29tcHJlc3NfdHlwZTsKKwkJCQlpZiAoY29tcHJlc3NfdHlwZSAmJiBjb21wcmVzc190eXBlCisJCQkJICAgICE9IGNvZGVjLT5jb21wcmVzc190eXBlKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBjYXJkLT5udW1fY29uZmlncykgeworCQkJLyogbm8gbmVlZCB0byBvdmVycmlkZSB0aGUgY29tcHJlc3NfdHlwZSBzbworCQkJICogZ28gYWhlYWQgYW5kIGRvIHRoZSBzdGFuZGFyZCB0aGluZyAqLworCQkJcmV0ID0gc25kX3NvY19pbml0X2NvZGVjX2NhY2hlKGNvZGVjLCAwKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5tdXRleCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyogb3ZlcnJpZGUgdGhlIGNvbXByZXNzX3R5cGUgd2l0aCB0aGUgb25lIHN1cHBsaWVkIGluCisJCSAqIHRoZSBtYWNoaW5lIGRyaXZlciAqLworCQlyZXQgPSBzbmRfc29jX2luaXRfY29kZWNfY2FjaGUoY29kZWMsIGNvbXByZXNzX3R5cGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAkvKiBjYXJkIGJpbmQgY29tcGxldGUgc28gcmVnaXN0ZXIgYSBzb3VuZCBjYXJkICovCiAJcmV0ID0gc25kX2NhcmRfY3JlYXRlKFNORFJWX0RFRkFVTFRfSURYMSwgU05EUlZfREVGQVVMVF9TVFIxLAogCQkJY2FyZC0+b3duZXIsIDAsICZjYXJkLT5zbmRfY2FyZCk7CkBAIC0xNjA1LDYgKzE4MDQsMTUgQEAKIAkJfQogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fYXV4X2RldnM7IGkrKykgeworCQlyZXQgPSBzb2NfcHJvYmVfYXV4X2RldihjYXJkLCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2VycigiYXNvYzogZmFpbGVkIHRvIGFkZCBhdXhpbGlhcnkgZGV2aWNlcyAlczogJWRcbiIsCisJCQkgICAgICAgY2FyZC0+bmFtZSwgcmV0KTsKKwkJCWdvdG8gcHJvYmVfYXV4X2Rldl9lcnI7CisJCX0KKwl9CisKIAlzbnByaW50ZihjYXJkLT5zbmRfY2FyZC0+c2hvcnRuYW1lLCBzaXplb2YoY2FyZC0+c25kX2NhcmQtPnNob3J0bmFtZSksCiAJCSAiJXMiLCAgY2FyZC0+bmFtZSk7CiAJc25wcmludGYoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lLCBzaXplb2YoY2FyZC0+c25kX2NhcmQtPmxvbmduYW1lKSwKQEAgLTE2MTMsNyArMTgyMSw3IEBACiAJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZC0+c25kX2NhcmQpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXNvYzogZmFpbGVkIHRvIHJlZ2lzdGVyIHNvdW5kY2FyZCBmb3IgJXNcbiIsIGNhcmQtPm5hbWUpOwotCQlnb3RvIHByb2JlX2RhaV9lcnI7CisJCWdvdG8gcHJvYmVfYXV4X2Rldl9lcnI7CiAJfQogCiAjaWZkZWYgQ09ORklHX1NORF9TT0NfQUM5N19CVVMKQEAgLTE2MjMsOCArMTgzMSw4IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byByZWdpc3RlciBBQzk3ICVzXG4iLCBjYXJkLT5uYW1lKTsKIAkJCXdoaWxlICgtLWkgPj0gMCkKLQkJCQlzb2NfdW5yZWdpc3Rlcl9hYzk3X2RhaV9saW5rKCZjYXJkLT5ydGRbaV0pOwotCQkJZ290byBwcm9iZV9kYWlfZXJyOworCQkJCXNvY191bnJlZ2lzdGVyX2FjOTdfZGFpX2xpbmsoY2FyZC0+cnRkW2ldLmNvZGVjKTsKKwkJCWdvdG8gcHJvYmVfYXV4X2Rldl9lcnI7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTE2MzMsNiArMTg0MSwxMCBAQAogCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOwogCXJldHVybjsKIAorcHJvYmVfYXV4X2Rldl9lcnI6CisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9hdXhfZGV2czsgaSsrKQorCQlzb2NfcmVtb3ZlX2F1eF9kZXYoY2FyZCwgaSk7CisKIHByb2JlX2RhaV9lcnI6CiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKQogCQlzb2NfcmVtb3ZlX2RhaV9saW5rKGNhcmQsIGkpOwpAQCAtMTY2OCw2ICsxODgwLDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmRhaV9kZXZfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmNvZGVjX2Rldl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+cGxhdGZvcm1fZGV2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjYXJkLT53aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY2FyZC0+cGF0aHMpOworCUlOSVRfTElTVF9IRUFEKCZjYXJkLT5kYXBtX2xpc3QpOworCisJc29jX2luaXRfY2FyZF9kZWJ1Z2ZzKGNhcmQpOwogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOwogCWlmIChyZXQgIT0gMCkgewpAQCAtMTY4OSwxMyArMTkwNiwxOSBAQAogCQkvKiBtYWtlIHN1cmUgYW55IGRlbGF5ZWQgd29yayBydW5zICovCiAJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspIHsKIAkJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSAmY2FyZC0+cnRkW2ldOwotCQkJcnVuX2RlbGF5ZWRfd29yaygmcnRkLT5kZWxheWVkX3dvcmspOworCQkJZmx1c2hfZGVsYXllZF93b3JrX3N5bmMoJnJ0ZC0+ZGVsYXllZF93b3JrKTsKIAkJfQogCisJCS8qIHJlbW92ZSBhdXhpbGlhcnkgZGV2aWNlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2F1eF9kZXZzOyBpKyspCisJCQlzb2NfcmVtb3ZlX2F1eF9kZXYoY2FyZCwgaSk7CisKIAkJLyogcmVtb3ZlIGFuZCBmcmVlIGVhY2ggREFJICovCiAJCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspCiAJCQlzb2NfcmVtb3ZlX2RhaV9saW5rKGNhcmQsIGkpOwogCisJCXNvY19jbGVhbnVwX2NhcmRfZGVidWdmcyhjYXJkKTsKKwogCQkvKiByZW1vdmUgdGhlIGNhcmQgKi8KIAkJaWYgKGNhcmQtPnJlbW92ZSkKIAkJCWNhcmQtPnJlbW92ZShwZGV2KTsKQEAgLTE3MjAsNyArMTk0Myw3IEBACiAJICogbm93LCB3ZSdyZSBzaHV0dGluZyBkb3duIHNvIG5vIGltbWluZW50IHJlc3RhcnQuICovCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewogCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gJmNhcmQtPnJ0ZFtpXTsKLQkJcnVuX2RlbGF5ZWRfd29yaygmcnRkLT5kZWxheWVkX3dvcmspOworCQlmbHVzaF9kZWxheWVkX3dvcmtfc3luYygmcnRkLT5kZWxheWVkX3dvcmspOwogCX0KIAogCXNuZF9zb2NfZGFwbV9zaHV0ZG93bihjYXJkKTsKQEAgLTE4NzksNiArMjEwMiwyNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19mcmVlX2FjOTdfY29kZWMpOwogCit1bnNpZ25lZCBpbnQgc25kX3NvY19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJcmV0ID0gY29kZWMtPnJlYWQoY29kZWMsIHJlZyk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAicmVhZCAleCA9PiAleFxuIiwgcmVnLCByZXQpOworCXRyYWNlX3NuZF9zb2NfcmVnX3JlYWQoY29kZWMsIHJlZywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX3JlYWQpOworCit1bnNpZ25lZCBpbnQgc25kX3NvY193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCQkgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWRldl9kYmcoY29kZWMtPmRldiwgIndyaXRlICV4ID0gJXhcbiIsIHJlZywgdmFsKTsKKwl0cmFjZV9zbmRfc29jX3JlZ193cml0ZShjb2RlYywgcmVnLCB2YWwpOworCXJldHVybiBjb2RlYy0+d3JpdGUoY29kZWMsIHJlZywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2Nfd3JpdGUpOworCiAvKioKICAqIHNuZF9zb2NfdXBkYXRlX2JpdHMgLSB1cGRhdGUgY29kZWMgcmVnaXN0ZXIgYml0cwogICogQGNvZGVjOiBhdWRpbyBjb2RlYwpAQCAtMjAxOSwxNCArMjI2MywyMiBAQAogCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9scywgaW50IG51bV9jb250cm9scykKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZC0+c25kX2NhcmQ7CisJY2hhciBwcmVmaXhlZF9uYW1lWzQ0XSwgKm5hbWU7CiAJaW50IGVyciwgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY29udHJvbHM7IGkrKykgewogCQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbCA9ICZjb250cm9sc1tpXTsKLQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX3NvY19jbmV3KGNvbnRyb2wsIGNvZGVjLCBOVUxMKSk7CisJCWlmIChjb2RlYy0+bmFtZV9wcmVmaXgpIHsKKwkJCXNucHJpbnRmKHByZWZpeGVkX25hbWUsIHNpemVvZihwcmVmaXhlZF9uYW1lKSwgIiVzICVzIiwKKwkJCQkgY29kZWMtPm5hbWVfcHJlZml4LCBjb250cm9sLT5uYW1lKTsKKwkJCW5hbWUgPSBwcmVmaXhlZF9uYW1lOworCQl9IGVsc2UgeworCQkJbmFtZSA9IGNvbnRyb2wtPm5hbWU7CisJCX0KKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX3NvY19jbmV3KGNvbnRyb2wsIGNvZGVjLCBuYW1lKSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGFkZCAlczogJWRcbiIsCi0JCQkJY29kZWMtPm5hbWUsIGNvbnRyb2wtPm5hbWUsIGVycik7CisJCQkJY29kZWMtPm5hbWUsIG5hbWUsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMjg2MywxMCArMzExNSwxMiBAQAogCWlmICghY2FyZC0+bmFtZSB8fCAhY2FyZC0+ZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNhcmQtPnJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lKSAqIGNhcmQtPm51bV9saW5rcywKLQkJCUdGUF9LRVJORUwpOworCWNhcmQtPnJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lKSAqCisJCQkgICAgKGNhcmQtPm51bV9saW5rcyArIGNhcmQtPm51bV9hdXhfZGV2cyksCisJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKGNhcmQtPnJ0ZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKKwljYXJkLT5ydGRfYXV4ID0gJmNhcmQtPnJ0ZFtjYXJkLT5udW1fbGlua3NdOwogCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKQogCQljYXJkLT5ydGRbaV0uZGFpX2xpbmsgPSAmY2FyZC0+ZGFpX2xpbmtbaV07CkBAIC0yOTA4LDcgKzMxNjIsNyBAQAogICogU2ltcGxpZnkgREFJIGxpbmsgY29uZmlndXJhdGlvbiBieSByZW1vdmluZyAiLi0xIiBmcm9tIGRldmljZSBuYW1lcwogICogYW5kIHNhbml0aXppbmcgbmFtZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgY2hhciAqZm10X3NpbmdsZV9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICppZCkKK3N0YXRpYyBjaGFyICpmbXRfc2luZ2xlX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgKmlkKQogewogCWNoYXIgKmZvdW5kLCBuYW1lW05BTUVfU0laRV07CiAJaW50IGlkMSwgaWQyOwpAQCAtMjkxNiw3ICszMTcwLDcgQEAKIAlpZiAoZGV2X25hbWUoZGV2KSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXN0cm5jcHkobmFtZSwgZGV2X25hbWUoZGV2KSwgTkFNRV9TSVpFKTsKKwlzdHJsY3B5KG5hbWUsIGRldl9uYW1lKGRldiksIE5BTUVfU0laRSk7CiAKIAkvKiBhcmUgd2UgYSAiJXMuJWQiIG5hbWUgKHBsYXRmb3JtIGFuZCBTUEkgY29tcG9uZW50cykgKi8KIAlmb3VuZCA9IHN0cnN0cihuYW1lLCBkZXYtPmRyaXZlci0+bmFtZSk7CkBAIC0yOTM5LDcgKzMxOTMsNyBAQAogCiAJCQkvKiBzYW5pdGl6ZSBjb21wb25lbnQgbmFtZSBmb3IgREFJIGxpbmsgY3JlYXRpb24gKi8KIAkJCXNucHJpbnRmKHRtcCwgTkFNRV9TSVpFLCAiJXMuJXMiLCBkZXYtPmRyaXZlci0+bmFtZSwgbmFtZSk7Ci0JCQlzdHJuY3B5KG5hbWUsIHRtcCwgTkFNRV9TSVpFKTsKKwkJCXN0cmxjcHkobmFtZSwgdG1wLCBOQU1FX1NJWkUpOwogCQl9IGVsc2UKIAkJCSppZCA9IDA7CiAJfQpAQCAtMzIwNCw5ICszNDU4LDExIEBACiAgKiBAY29kZWM6IGNvZGVjIHRvIHJlZ2lzdGVyCiAgKi8KIGludCBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyICpjb2RlY19kcnYsCi0JCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsIGludCBudW1fZGFpKQorCQkJICAgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyICpjb2RlY19kcnYsCisJCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2LAorCQkJICAgaW50IG51bV9kYWkpCiB7CisJc2l6ZV90IHJlZ19zaXplOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlpbnQgcmV0LCBpOwogCkBAIC0zMjIzLDMwICszNDc5LDM3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIGFsbG9jYXRlIENPREVDIHJlZ2lzdGVyIGNhY2hlICovCi0JaWYgKGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemUgJiYgY29kZWNfZHJ2LT5yZWdfd29yZF9zaXplKSB7CisJaWYgKGNvZGVjX2Rydi0+Y29tcHJlc3NfdHlwZSkKKwkJY29kZWMtPmNvbXByZXNzX3R5cGUgPSBjb2RlY19kcnYtPmNvbXByZXNzX3R5cGU7CisJZWxzZQorCQljb2RlYy0+Y29tcHJlc3NfdHlwZSA9IFNORF9TT0NfRkxBVF9DT01QUkVTU0lPTjsKIAotCQlpZiAoY29kZWNfZHJ2LT5yZWdfY2FjaGVfZGVmYXVsdCkKLQkJCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKGNvZGVjX2Rydi0+cmVnX2NhY2hlX2RlZmF1bHQsCi0JCQkJY29kZWNfZHJ2LT5yZWdfY2FjaGVfc2l6ZSAqIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWVsc2UKLQkJCWNvZGVjLT5yZWdfY2FjaGUgPSBremFsbG9jKGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemUgKgotCQkJCWNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKGNvZGVjLT5yZWdfY2FjaGUgPT0gTlVMTCkgewotCQkJa2ZyZWUoY29kZWMtPm5hbWUpOwotCQkJa2ZyZWUoY29kZWMpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KKwljb2RlYy0+d3JpdGUgPSBjb2RlY19kcnYtPndyaXRlOworCWNvZGVjLT5yZWFkID0gY29kZWNfZHJ2LT5yZWFkOworCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOworCWNvZGVjLT5kYXBtLmRldiA9IGRldjsKKwljb2RlYy0+ZGFwbS5jb2RlYyA9IGNvZGVjOwogCWNvZGVjLT5kZXYgPSBkZXY7CiAJY29kZWMtPmRyaXZlciA9IGNvZGVjX2RydjsKLQljb2RlYy0+Ymlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PRkY7CiAJY29kZWMtPm51bV9kYWkgPSBudW1fZGFpOwogCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5kYXBtX3dpZGdldHMpOwotCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV9wYXRocyk7CisKKwkvKiBhbGxvY2F0ZSBDT0RFQyByZWdpc3RlciBjYWNoZSAqLworCWlmIChjb2RlY19kcnYtPnJlZ19jYWNoZV9zaXplICYmIGNvZGVjX2Rydi0+cmVnX3dvcmRfc2l6ZSkgeworCQlyZWdfc2l6ZSA9IGNvZGVjX2Rydi0+cmVnX2NhY2hlX3NpemUgKiBjb2RlY19kcnYtPnJlZ193b3JkX3NpemU7CisJCS8qIGl0IGlzIG5lY2Vzc2FyeSB0byBtYWtlIGEgY29weSBvZiB0aGUgZGVmYXVsdCByZWdpc3RlciBjYWNoZQorCQkgKiBiZWNhdXNlIGluIHRoZSBjYXNlIG9mIHVzaW5nIGEgY29tcHJlc3Npb24gdHlwZSB0aGF0IHJlcXVpcmVzCisJCSAqIHRoZSBkZWZhdWx0IHJlZ2lzdGVyIGNhY2hlIHRvIGJlIG1hcmtlZCBhcyBfX2RldmluaXRjb25zdCB0aGUKKwkJICoga2VybmVsIG1pZ2h0IGhhdmUgZnJlZWQgdGhlIGFycmF5IGJ5IHRoZSB0aW1lIHdlIGluaXRpYWxpemUKKwkJICogdGhlIGNhY2hlLgorCQkgKi8KKwkJY29kZWMtPnJlZ19kZWZfY29weSA9IGttZW1kdXAoY29kZWNfZHJ2LT5yZWdfY2FjaGVfZGVmYXVsdCwKKwkJCQkJICAgICAgcmVnX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWNvZGVjLT5yZWdfZGVmX2NvcHkpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2RhaTsgaSsrKSB7CiAJCWZpeHVwX2NvZGVjX2Zvcm1hdHMoJmRhaV9kcnZbaV0ucGxheWJhY2spOwpAQCAtMzI1Nyw3ICszNTIwLDcgQEAKIAlpZiAobnVtX2RhaSkgewogCQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoZGV2LCBkYWlfZHJ2LCBudW1fZGFpKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yOworCQkJZ290byBmYWlsOwogCX0KIAogCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CkBAIC0zMjY4LDkgKzM1MzEsOSBAQAogCXByX2RlYnVnKCJSZWdpc3RlcmVkIGNvZGVjICclcydcbiIsIGNvZGVjLT5uYW1lKTsKIAlyZXR1cm4gMDsKIAotZXJyb3I6Ci0JaWYgKGNvZGVjLT5yZWdfY2FjaGUpCi0JCWtmcmVlKGNvZGVjLT5yZWdfY2FjaGUpOworZmFpbDoKKwlrZnJlZShjb2RlYy0+cmVnX2RlZl9jb3B5KTsKKwljb2RlYy0+cmVnX2RlZl9jb3B5ID0gTlVMTDsKIAlrZnJlZShjb2RlYy0+bmFtZSk7CiAJa2ZyZWUoY29kZWMpOwogCXJldHVybiByZXQ7CkBAIC0zMzA0LDggKzM1NjcsOCBAQAogCiAJcHJfZGVidWcoIlVucmVnaXN0ZXJlZCBjb2RlYyAnJXMnXG4iLCBjb2RlYy0+bmFtZSk7CiAKLQlpZiAoY29kZWMtPnJlZ19jYWNoZSkKLQkJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJc25kX3NvY19jYWNoZV9leGl0KGNvZGVjKTsKKwlrZnJlZShjb2RlYy0+cmVnX2RlZl9jb3B5KTsKIAlrZnJlZShjb2RlYy0+bmFtZSk7CiAJa2ZyZWUoY29kZWMpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBjNzIxNTAyLi40OTk3MzBhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtNDIsOSArNDIsMTEgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KKwogLyogZGFwbSBwb3dlciBzZXF1ZW5jZXMgLSBtYWtlIHRoaXMgcGVyIGNvZGVjIGluIHRoZSBmdXR1cmUgKi8KIHN0YXRpYyBpbnQgZGFwbV91cF9zZXFbXSA9IHsKIAlbc25kX3NvY19kYXBtX3ByZV0gPSAwLApAQCAtNTQsMTIgKzU2LDE0IEBACiAJW3NuZF9zb2NfZGFwbV9haWZfb3V0XSA9IDMsCiAJW3NuZF9zb2NfZGFwbV9taWNdID0gNCwKIAlbc25kX3NvY19kYXBtX211eF0gPSA1LAorCVtzbmRfc29jX2RhcG1fdmlydF9tdXhdID0gNSwKIAlbc25kX3NvY19kYXBtX3ZhbHVlX211eF0gPSA1LAogCVtzbmRfc29jX2RhcG1fZGFjXSA9IDYsCiAJW3NuZF9zb2NfZGFwbV9taXhlcl0gPSA3LAogCVtzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsXSA9IDcsCiAJW3NuZF9zb2NfZGFwbV9wZ2FdID0gOCwKIAlbc25kX3NvY19kYXBtX2FkY10gPSA5LAorCVtzbmRfc29jX2RhcG1fb3V0X2Rydl0gPSAxMCwKIAlbc25kX3NvY19kYXBtX2hwXSA9IDEwLAogCVtzbmRfc29jX2RhcG1fc3BrXSA9IDEwLAogCVtzbmRfc29jX2RhcG1fcG9zdF0gPSAxMSwKQEAgLTcwLDYgKzc0LDcgQEAKIAlbc25kX3NvY19kYXBtX2FkY10gPSAxLAogCVtzbmRfc29jX2RhcG1faHBdID0gMiwKIAlbc25kX3NvY19kYXBtX3Nwa10gPSAyLAorCVtzbmRfc29jX2RhcG1fb3V0X2Rydl0gPSAyLAogCVtzbmRfc29jX2RhcG1fcGdhXSA9IDQsCiAJW3NuZF9zb2NfZGFwbV9taXhlcl9uYW1lZF9jdGxdID0gNSwKIAlbc25kX3NvY19kYXBtX21peGVyXSA9IDUsCkBAIC03Nyw2ICs4Miw3IEBACiAJW3NuZF9zb2NfZGFwbV9taWNdID0gNywKIAlbc25kX3NvY19kYXBtX21pY2JpYXNdID0gOCwKIAlbc25kX3NvY19kYXBtX211eF0gPSA5LAorCVtzbmRfc29jX2RhcG1fdmlydF9tdXhdID0gOSwKIAlbc25kX3NvY19kYXBtX3ZhbHVlX211eF0gPSA5LAogCVtzbmRfc29jX2RhcG1fYWlmX2luXSA9IDEwLAogCVtzbmRfc29jX2RhcG1fYWlmX291dF0gPSAxMCwKQEAgLTkwLDE3ICs5NiwyNCBAQAogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKHBvcF90aW1lKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBvcF9kYmcodTMyIHBvcF90aW1lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3N0YXRpYyB2b2lkIHBvcF9kYmcoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcG9wX3RpbWUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKKwljaGFyICpidWY7CisKKwlpZiAoIXBvcF90aW1lKQorCQlyZXR1cm47CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCi0JaWYgKHBvcF90aW1lKSB7Ci0JCXZwcmludGsoZm10LCBhcmdzKTsKLQl9Ci0KKwl2c25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGZtdCwgYXJncyk7CisJZGV2X2luZm8oZGV2LCAiJXMiLCBidWYpOwogCXZhX2VuZChhcmdzKTsKKworCWtmcmVlKGJ1Zik7CiB9CiAKIC8qIGNyZWF0ZSBhIG5ldyBkYXBtIHdpZGdldCAqLwpAQCAtMTIwLDM2ICsxMzMsNDUgQEAKICAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yLgogICovCiBzdGF0aWMgaW50IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJICAgICAgIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogewogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTZXR0aW5nIGZ1bGwgYmlhc1xuIik7CisJCWRldl9kYmcoZGFwbS0+ZGV2LCAiU2V0dGluZyBmdWxsIGJpYXNcbiIpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTZXR0aW5nIGJpYXMgcHJlcGFyZVxuIik7CisJCWRldl9kYmcoZGFwbS0+ZGV2LCAiU2V0dGluZyBiaWFzIHByZXBhcmVcbiIpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJTZXR0aW5nIHN0YW5kYnkgYmlhc1xuIik7CisJCWRldl9kYmcoZGFwbS0+ZGV2LCAiU2V0dGluZyBzdGFuZGJ5IGJpYXNcbiIpOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIlNldHRpbmcgYmlhcyBvZmZcbiIpOworCQlkZXZfZGJnKGRhcG0tPmRldiwgIlNldHRpbmcgYmlhcyBvZmZcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJTZXR0aW5nIGludmFsaWQgYmlhcyAlZFxuIiwgbGV2ZWwpOworCQlkZXZfZXJyKGRhcG0tPmRldiwgIlNldHRpbmcgaW52YWxpZCBiaWFzICVkXG4iLCBsZXZlbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXRyYWNlX3NuZF9zb2NfYmlhc19sZXZlbF9zdGFydChjYXJkLCBsZXZlbCk7CisKIAlpZiAoY2FyZCAmJiBjYXJkLT5zZXRfYmlhc19sZXZlbCkKIAkJcmV0ID0gY2FyZC0+c2V0X2JpYXNfbGV2ZWwoY2FyZCwgbGV2ZWwpOwogCWlmIChyZXQgPT0gMCkgewotCQlpZiAoY29kZWMtPmRyaXZlci0+c2V0X2JpYXNfbGV2ZWwpCi0JCQlyZXQgPSBjb2RlYy0+ZHJpdmVyLT5zZXRfYmlhc19sZXZlbChjb2RlYywgbGV2ZWwpOworCQlpZiAoZGFwbS0+Y29kZWMgJiYgZGFwbS0+Y29kZWMtPmRyaXZlci0+c2V0X2JpYXNfbGV2ZWwpCisJCQlyZXQgPSBkYXBtLT5jb2RlYy0+ZHJpdmVyLT5zZXRfYmlhc19sZXZlbChkYXBtLT5jb2RlYywgbGV2ZWwpOwogCQllbHNlCi0JCQljb2RlYy0+Ymlhc19sZXZlbCA9IGxldmVsOworCQkJZGFwbS0+Ymlhc19sZXZlbCA9IGxldmVsOwogCX0KKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKGNhcmQgJiYgY2FyZC0+c2V0X2JpYXNfbGV2ZWxfcG9zdCkKKwkJCXJldCA9IGNhcmQtPnNldF9iaWFzX2xldmVsX3Bvc3QoY2FyZCwgbGV2ZWwpOworCX0KKworCXRyYWNlX3NuZF9zb2NfYmlhc19sZXZlbF9kb25lKGNhcmQsIGxldmVsKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xOTYsNiArMjE4LDIwIEBACiAJCX0KIAl9CiAJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fdmlydF9tdXg6IHsKKwkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKXctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlOworCisJCXAtPmNvbm5lY3QgPSAwOworCQkvKiBzaW5jZSBhIHZpcnR1YWwgbXV4IGhhcyBubyBiYWNraW5nIHJlZ2lzdGVycyB0bworCQkgKiBkZWNpZGUgd2hpY2ggcGF0aCB0byBjb25uZWN0LCBpdCB3aWxsIHRyeSB0byBtYXRjaAorCQkgKiB3aXRoIHRoZSBmaXJzdCBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgdG8gZW5zdXJlCisJCSAqIHRoYXQgdGhlIGRlZmF1bHQgbXV4IGNob2ljZSAodGhlIGZpcnN0KSB3aWxsIGJlCisJCSAqIGNvcnJlY3RseSBwb3dlcmVkIHVwIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCWlmICghc3RyY21wKHAtPm5hbWUsIGUtPnRleHRzWzBdKSkKKwkJCXAtPmNvbm5lY3QgPSAxOworCX0KKwlicmVhazsKIAljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6IHsKIAkJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKQogCQkJdy0+a2NvbnRyb2xzW2ldLnByaXZhdGVfdmFsdWU7CkBAIC0yMTcsNiArMjUzLDcgQEAKIAlicmVhazsKIAkvKiBkb2VzIG5vdCBlZmZlY3Qgcm91dGluZyAtIGFsd2F5cyBjb25uZWN0ZWQgKi8KIAljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWRjOgogCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgpAQCAtMjQxLDcgKzI3OCw3IEBACiB9CiAKIC8qIGNvbm5lY3QgbXV4IHdpZGdldCB0byBpdHMgaW50ZXJjb25uZWN0aW5nIGF1ZGlvIHBhdGhzICovCi1zdGF0aWMgaW50IGRhcG1fY29ubmVjdF9tdXgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorc3RhdGljIGludCBkYXBtX2Nvbm5lY3RfbXV4KHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSwKIAljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2NvbnRyb2wpCkBAIC0yNTEsNyArMjg4LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBlLT5tYXg7IGkrKykgewogCQlpZiAoIShzdHJjbXAoY29udHJvbF9uYW1lLCBlLT50ZXh0c1tpXSkpKSB7Ci0JCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmNvZGVjLT5kYXBtX3BhdGhzKTsKKwkJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmZGFwbS0+Y2FyZC0+cGF0aHMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CiAJCQlwYXRoLT5uYW1lID0gKGNoYXIqKWUtPnRleHRzW2ldOwpAQCAtMjY0LDcgKzMwMSw3IEBACiB9CiAKIC8qIGNvbm5lY3QgbWl4ZXIgd2lkZ2V0IHRvIGl0cyBpbnRlcmNvbm5lY3RpbmcgYXVkaW8gcGF0aHMgKi8KLXN0YXRpYyBpbnQgZGFwbV9jb25uZWN0X21peGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKK3N0YXRpYyBpbnQgZGFwbV9jb25uZWN0X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSkKIHsKQEAgLTI3Myw3ICszMTAsNyBAQAogCS8qIHNlYXJjaCBmb3IgbWl4ZXIga2NvbnRyb2wgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZGVzdC0+bnVtX2tjb250cm9sczsgaSsrKSB7CiAJCWlmICghc3RyY21wKGNvbnRyb2xfbmFtZSwgZGVzdC0+a2NvbnRyb2xzW2ldLm5hbWUpKSB7Ci0JCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmNvZGVjLT5kYXBtX3BhdGhzKTsKKwkJCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmZGFwbS0+Y2FyZC0+cGF0aHMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJmRlc3QtPnNvdXJjZXMpOwogCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmc3JjLT5zaW5rcyk7CiAJCQlwYXRoLT5uYW1lID0gZGVzdC0+a2NvbnRyb2xzW2ldLm5hbWU7CkBAIC0yOTAsNiArMzI3LDggQEAKIAlpbnQgY2hhbmdlLCBwb3dlcjsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXc7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gd2lkZ2V0LT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3aWRnZXQtPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CiAKIAkvKiBjaGVjayBmb3IgdmFsaWQgd2lkZ2V0cyAqLwogCWlmICh3aWRnZXQtPnJlZyA8IDAgfHwgd2lkZ2V0LT5pZCA9PSBzbmRfc29jX2RhcG1faW5wdXQgfHwKQEAgLTMwOSwyNCArMzQ4LDI2IEBACiAKIAljaGFuZ2UgPSBvbGQgIT0gbmV3OwogCWlmIChjaGFuZ2UpIHsKLQkJcG9wX2RiZyhjb2RlYy0+cG9wX3RpbWUsICJwb3AgdGVzdCAlcyA6ICVzIGluICVkIG1zXG4iLAorCQlwb3BfZGJnKGRhcG0tPmRldiwgY2FyZC0+cG9wX3RpbWUsCisJCQkicG9wIHRlc3QgJXMgOiAlcyBpbiAlZCBtc1xuIiwKIAkJCXdpZGdldC0+bmFtZSwgd2lkZ2V0LT5wb3dlciA/ICJvbiIgOiAib2ZmIiwKLQkJCWNvZGVjLT5wb3BfdGltZSk7Ci0JCXBvcF93YWl0KGNvZGVjLT5wb3BfdGltZSk7CisJCQljYXJkLT5wb3BfdGltZSk7CisJCXBvcF93YWl0KGNhcmQtPnBvcF90aW1lKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgd2lkZ2V0LT5yZWcsIG5ldyk7CiAJfQotCXByX2RlYnVnKCJyZWcgJXggb2xkICV4IG5ldyAleCBjaGFuZ2UgJWRcbiIsIHdpZGdldC0+cmVnLAotCQkgb2xkLCBuZXcsIGNoYW5nZSk7CisJZGV2X2RiZyhkYXBtLT5kZXYsICJyZWcgJXggb2xkICV4IG5ldyAleCBjaGFuZ2UgJWRcbiIsIHdpZGdldC0+cmVnLAorCQlvbGQsIG5ldywgY2hhbmdlKTsKIAlyZXR1cm4gY2hhbmdlOwogfQogCiAvKiBjcmVhdGUgbmV3IGRhcG0gbWl4ZXIgY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19taXhlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCitzdGF0aWMgaW50IGRhcG1fbmV3X21peGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAlzaXplX3QgbmFtZV9sZW47CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRhcG0tPmNvZGVjLT5jYXJkLT5zbmRfY2FyZDsKIAogCS8qIGFkZCBrY29udHJvbCAqLwogCWZvciAoaSA9IDA7IGkgPCB3LT5udW1fa2NvbnRyb2xzOyBpKyspIHsKQEAgLTM2OCwxMSArNDA5LDExIEBACiAKIAkJCXBhdGgtPmtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbaV0sIHcsCiAJCQkJcGF0aC0+bG9uZ19uYW1lKTsKLQkJCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLT5zbmRfY2FyZCwgcGF0aC0+a2NvbnRyb2wpOworCQkJcmV0ID0gc25kX2N0bF9hZGQoY2FyZCwgcGF0aC0+a2NvbnRyb2wpOwogCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImFzb2M6IGZhaWxlZCB0byBhZGQgZGFwbSBrY29udHJvbCAlczogJWRcbiIsCi0JCQkJICAgICAgIHBhdGgtPmxvbmdfbmFtZSwKLQkJCQkgICAgICAgcmV0KTsKKwkJCQlkZXZfZXJyKGRhcG0tPmRldiwKKwkJCQkJImFzb2M6IGZhaWxlZCB0byBhZGQgZGFwbSBrY29udHJvbCAlczogJWRcbiIsCisJCQkJCXBhdGgtPmxvbmdfbmFtZSwgcmV0KTsKIAkJCQlrZnJlZShwYXRoLT5sb25nX25hbWUpOwogCQkJCXBhdGgtPmxvbmdfbmFtZSA9IE5VTEw7CiAJCQkJcmV0dXJuIHJldDsKQEAgLTM4MywyMCArNDI0LDIyIEBACiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSBtdXggY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorc3RhdGljIGludCBkYXBtX25ld19tdXgoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aCA9IE5VTEw7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGFwbS0+Y29kZWMtPmNhcmQtPnNuZF9jYXJkOwogCWludCByZXQgPSAwOwogCiAJaWYgKCF3LT5udW1fa2NvbnRyb2xzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYXNvYzogbXV4ICVzIGhhcyBubyBjb250cm9sc1xuIiwgdy0+bmFtZSk7CisJCWRldl9lcnIoZGFwbS0+ZGV2LCAiYXNvYzogbXV4ICVzIGhhcyBubyBjb250cm9sc1xuIiwgdy0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWtjb250cm9sID0gc25kX3NvY19jbmV3KCZ3LT5rY29udHJvbHNbMF0sIHcsIHctPm5hbWUpOwotCXJldCA9IHNuZF9jdGxfYWRkKGNvZGVjLT5jYXJkLT5zbmRfY2FyZCwga2NvbnRyb2wpOworCXJldCA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjb250cm9sKTsKKwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtNDA2LDI2ICs0NDksMjcgQEAKIAlyZXR1cm4gcmV0OwogCiBlcnI6Ci0JcHJpbnRrKEtFUk5fRVJSICJhc29jOiBmYWlsZWQgdG8gYWRkIGtjb250cm9sICVzXG4iLCB3LT5uYW1lKTsKKwlkZXZfZXJyKGRhcG0tPmRldiwgImFzb2M6IGZhaWxlZCB0byBhZGQga2NvbnRyb2wgJXNcbiIsIHctPm5hbWUpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIGNyZWF0ZSBuZXcgZGFwbSB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorc3RhdGljIGludCBkYXBtX25ld19wZ2Eoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQogewogCWlmICh3LT5udW1fa2NvbnRyb2xzKQotCQlwcl9lcnIoImFzb2M6IFBHQSBjb250cm9scyBub3Qgc3VwcG9ydGVkOiAnJXMnXG4iLCB3LT5uYW1lKTsKKwkJZGV2X2Vycih3LT5kYXBtLT5kZXYsCisJCQkiYXNvYzogUEdBIGNvbnRyb2xzIG5vdCBzdXBwb3J0ZWQ6ICclcydcbiIsIHctPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIHJlc2V0ICd3YWxrZWQnIGJpdCBmb3IgZWFjaCBkYXBtIHBhdGggKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkYXBtX2NsZWFyX3dhbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIGlubGluZSB2b2lkIGRhcG1fY2xlYXJfd2FsayhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmZGFwbS0+Y2FyZC0+cGF0aHMsIGxpc3QpCiAJCXAtPndhbGtlZCA9IDA7CiB9CiAKQEAgLTQzNSwxMyArNDc5LDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgc25kX3NvY19kYXBtX3N1c3BlbmRfY2hlY2soc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCkKIHsKLQlpbnQgbGV2ZWwgPSBzbmRfcG93ZXJfZ2V0X3N0YXRlKHdpZGdldC0+Y29kZWMtPmNhcmQtPnNuZF9jYXJkKTsKKwlpbnQgbGV2ZWwgPSBzbmRfcG93ZXJfZ2V0X3N0YXRlKHdpZGdldC0+ZGFwbS0+Y29kZWMtPmNhcmQtPnNuZF9jYXJkKTsKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2hvdDoKIAljYXNlIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQ6CiAJCWlmICh3aWRnZXQtPmlnbm9yZV9zdXNwZW5kKQotCQkJcHJfZGVidWcoIiVzIGlnbm9yaW5nIHN1c3BlbmRcbiIsIHdpZGdldC0+bmFtZSk7CisJCQlkZXZfZGJnKHdpZGdldC0+ZGFwbS0+ZGV2LCAiJXMgaWdub3Jpbmcgc3VzcGVuZFxuIiwKKwkJCQl3aWRnZXQtPm5hbWUpOwogCQlyZXR1cm4gd2lkZ2V0LT5pZ25vcmVfc3VzcGVuZDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMTsKQEAgLTU3Miw3ICs2MTcsNyBAQAogCiAJLyogY2FsbCBhbnkgcG93ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXJzICovCiAJaWYgKHctPmV2ZW50KQotCQlwcl9kZWJ1ZygicG93ZXIgJXMgZXZlbnQgZm9yICVzIGZsYWdzICV4XG4iLAorCQlkZXZfZGJnKHctPmRhcG0tPmRldiwgInBvd2VyICVzIGV2ZW50IGZvciAlcyBmbGFncyAleFxuIiwKIAkJCSB3LT5wb3dlciA/ICJvbiIgOiAib2ZmIiwKIAkJCSB3LT5uYW1lLCB3LT5ldmVudF9mbGFncyk7CiAKQEAgLTYyMSw5ICs2NjYsOSBAQAogCWludCBpbiwgb3V0OwogCiAJaW4gPSBpc19jb25uZWN0ZWRfaW5wdXRfZXAodyk7Ci0JZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKLQlkYXBtX2NsZWFyX3dhbGsody0+Y29kZWMpOworCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKIAlyZXR1cm4gb3V0ICE9IDAgJiYgaW4gIT0gMDsKIH0KIApAQCAtNjM0LDcgKzY3OSw3IEBACiAKIAlpZiAody0+YWN0aXZlKSB7CiAJCWluID0gaXNfY29ubmVjdGVkX2lucHV0X2VwKHcpOwotCQlkYXBtX2NsZWFyX3dhbGsody0+Y29kZWMpOworCQlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAJCXJldHVybiBpbiAhPSAwOwogCX0gZWxzZSB7CiAJCXJldHVybiBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXIodyk7CkBAIC02NDgsNyArNjkzLDcgQEAKIAogCWlmICh3LT5hY3RpdmUpIHsKIAkJb3V0ID0gaXNfY29ubmVjdGVkX291dHB1dF9lcCh3KTsKLQkJZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwkJZGFwbV9jbGVhcl93YWxrKHctPmRhcG0pOwogCQlyZXR1cm4gb3V0ICE9IDA7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcih3KTsKQEAgLTY3NCw3ICs3MTksNyBAQAogCQl9CiAJfQogCi0JZGFwbV9jbGVhcl93YWxrKHctPmNvZGVjKTsKKwlkYXBtX2NsZWFyX3dhbGsody0+ZGFwbSk7CiAKIAlyZXR1cm4gcG93ZXI7CiB9CkBAIC02ODcsOCArNzMyLDggQEAKIAkJcmV0dXJuIHNvcnRbYS0+aWRdIC0gc29ydFtiLT5pZF07CiAJaWYgKGEtPnJlZyAhPSBiLT5yZWcpCiAJCXJldHVybiBhLT5yZWcgLSBiLT5yZWc7Ci0JaWYgKGEtPmNvZGVjICE9IGItPmNvZGVjKQotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYS0+Y29kZWMgLSAodW5zaWduZWQgbG9uZyliLT5jb2RlYzsKKwlpZiAoYS0+ZGFwbSAhPSBiLT5kYXBtKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYS0+ZGFwbSAtICh1bnNpZ25lZCBsb25nKWItPmRhcG07CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwOSwxMiArNzU0LDU3IEBACiAJbGlzdF9hZGRfdGFpbCgmbmV3X3dpZGdldC0+cG93ZXJfbGlzdCwgbGlzdCk7CiB9CiAKK3N0YXRpYyB2b2lkIGRhcG1fc2VxX2NoZWNrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwljb25zdCBjaGFyICpldl9uYW1lOworCWludCBwb3dlciwgcmV0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CisJCWV2X25hbWUgPSAiUFJFX1BNVSI7CisJCXBvd2VyID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWV2X25hbWUgPSAiUE9TVF9QTVUiOworCQlwb3dlciA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWV2X25hbWUgPSAiUFJFX1BNRCI7CisJCXBvd2VyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCWV2X25hbWUgPSAiUE9TVF9QTUQiOworCQlwb3dlciA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJaWYgKHctPnBvd2VyICE9IHBvd2VyKQorCQlyZXR1cm47CisKKwlpZiAody0+ZXZlbnQgJiYgKHctPmV2ZW50X2ZsYWdzICYgZXZlbnQpKSB7CisJCXBvcF9kYmcoZGFwbS0+ZGV2LCBjYXJkLT5wb3BfdGltZSwgInBvcCB0ZXN0IDogJXMgJXNcbiIsCisJCQl3LT5uYW1lLCBldl9uYW1lKTsKKwkJdHJhY2Vfc25kX3NvY19kYXBtX3dpZGdldF9ldmVudF9zdGFydCh3LCBldmVudCk7CisJCXJldCA9IHctPmV2ZW50KHcsIE5VTEwsIGV2ZW50KTsKKwkJdHJhY2Vfc25kX3NvY19kYXBtX3dpZGdldF9ldmVudF9kb25lKHcsIGV2ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlwcl9lcnIoIiVzOiAlcyBldmVudCBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIGV2X25hbWUsIHctPm5hbWUsIHJldCk7CisJfQorfQorCiAvKiBBcHBseSB0aGUgY29hbGVzY2VkIGNoYW5nZXMgZnJvbSBhIERBUE0gc2VxdWVuY2UgKi8KLXN0YXRpYyB2b2lkIGRhcG1fc2VxX3J1bl9jb2FsZXNjZWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorc3RhdGljIHZvaWQgZGFwbV9zZXFfcnVuX2NvYWxlc2NlZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqcGVuZGluZykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKLQlpbnQgcmVnLCBwb3dlciwgcmV0OworCWludCByZWcsIHBvd2VyOwogCXVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCXVuc2lnbmVkIGludCBjdXJfbWFzazsKQEAgLTczNSw2NCArODI1LDI2IEBACiAJCWlmIChwb3dlcikKIAkJCXZhbHVlIHw9IGN1cl9tYXNrOwogCi0JCXBvcF9kYmcoY29kZWMtPnBvcF90aW1lLAorCQlwb3BfZGJnKGRhcG0tPmRldiwgY2FyZC0+cG9wX3RpbWUsCiAJCQkicG9wIHRlc3QgOiBRdWV1ZSAlczogcmVnPTB4JXgsIDB4JXgvMHgleFxuIiwKIAkJCXctPm5hbWUsIHJlZywgdmFsdWUsIG1hc2spOwogCi0JCS8qIHBvd2VyIHVwIHByZSBldmVudCAqLwotCQlpZiAody0+cG93ZXIgJiYgdy0+ZXZlbnQgJiYKLQkJICAgICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1VKSkgewotCQkJcG9wX2RiZyhjb2RlYy0+cG9wX3RpbWUsICJwb3AgdGVzdCA6ICVzIFBSRV9QTVVcbiIsCi0JCQkJdy0+bmFtZSk7Ci0JCQlyZXQgPSB3LT5ldmVudCh3LCBOVUxMLCBTTkRfU09DX0RBUE1fUFJFX1BNVSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlwcl9lcnIoIiVzOiBwcmUgZXZlbnQgZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgICAgdy0+bmFtZSwgcmV0KTsKLQkJfQotCi0JCS8qIHBvd2VyIGRvd24gcHJlIGV2ZW50ICovCi0JCWlmICghdy0+cG93ZXIgJiYgdy0+ZXZlbnQgJiYKLQkJICAgICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUE1EKSkgewotCQkJcG9wX2RiZyhjb2RlYy0+cG9wX3RpbWUsICJwb3AgdGVzdCA6ICVzIFBSRV9QTURcbiIsCi0JCQkJdy0+bmFtZSk7Ci0JCQlyZXQgPSB3LT5ldmVudCh3LCBOVUxMLCBTTkRfU09DX0RBUE1fUFJFX1BNRCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlwcl9lcnIoIiVzOiBwcmUgZXZlbnQgZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgICAgdy0+bmFtZSwgcmV0KTsKLQkJfQorCQkvKiBDaGVjayBmb3IgZXZlbnRzICovCisJCWRhcG1fc2VxX2NoZWNrX2V2ZW50KGRhcG0sIHcsIFNORF9TT0NfREFQTV9QUkVfUE1VKTsKKwkJZGFwbV9zZXFfY2hlY2tfZXZlbnQoZGFwbSwgdywgU05EX1NPQ19EQVBNX1BSRV9QTUQpOwogCX0KIAogCWlmIChyZWcgPj0gMCkgewotCQlwb3BfZGJnKGNvZGVjLT5wb3BfdGltZSwKKwkJcG9wX2RiZyhkYXBtLT5kZXYsIGNhcmQtPnBvcF90aW1lLAogCQkJInBvcCB0ZXN0IDogQXBwbHlpbmcgMHgleC8weCV4IHRvICV4IGluICVkbXNcbiIsCi0JCQl2YWx1ZSwgbWFzaywgcmVnLCBjb2RlYy0+cG9wX3RpbWUpOwotCQlwb3Bfd2FpdChjb2RlYy0+cG9wX3RpbWUpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIG1hc2ssIHZhbHVlKTsKKwkJCXZhbHVlLCBtYXNrLCByZWcsIGNhcmQtPnBvcF90aW1lKTsKKwkJcG9wX3dhaXQoY2FyZC0+cG9wX3RpbWUpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhcG0tPmNvZGVjLCByZWcsIG1hc2ssIHZhbHVlKTsKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsIHBlbmRpbmcsIHBvd2VyX2xpc3QpIHsKLQkJLyogcG93ZXIgdXAgcG9zdCBldmVudCAqLwotCQlpZiAody0+cG93ZXIgJiYgdy0+ZXZlbnQgJiYKLQkJICAgICh3LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QT1NUX1BNVSkpIHsKLQkJCXBvcF9kYmcoY29kZWMtPnBvcF90aW1lLCAicG9wIHRlc3QgOiAlcyBQT1NUX1BNVVxuIiwKLQkJCQl3LT5uYW1lKTsKLQkJCXJldCA9IHctPmV2ZW50KHcsCi0JCQkJICAgICAgIE5VTEwsIFNORF9TT0NfREFQTV9QT1NUX1BNVSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlwcl9lcnIoIiVzOiBwb3N0IGV2ZW50IGZhaWxlZDogJWRcbiIsCi0JCQkJICAgICAgIHctPm5hbWUsIHJldCk7Ci0JCX0KLQotCQkvKiBwb3dlciBkb3duIHBvc3QgZXZlbnQgKi8KLQkJaWYgKCF3LT5wb3dlciAmJiB3LT5ldmVudCAmJgotCQkgICAgKHctPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSkgewotCQkJcG9wX2RiZyhjb2RlYy0+cG9wX3RpbWUsICJwb3AgdGVzdCA6ICVzIFBPU1RfUE1EXG4iLAotCQkJCXctPm5hbWUpOwotCQkJcmV0ID0gdy0+ZXZlbnQodywgTlVMTCwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXByX2VycigiJXM6IHBvc3QgZXZlbnQgZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgICAgdy0+bmFtZSwgcmV0KTsKLQkJfQorCQlkYXBtX3NlcV9jaGVja19ldmVudChkYXBtLCB3LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpOworCQlkYXBtX3NlcV9jaGVja19ldmVudChkYXBtLCB3LCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOwogCX0KIH0KIApAQCAtODA0LDI2ICs4NTYsMjkgQEAKICAqIEN1cnJlbnRseSBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIG1vcmUgdGhhbiBhIHNpbmdsZSB3cml0ZSBpcyBub3QKICAqIGhhbmRsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGRhcG1fc2VxX3J1bihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCi0JCQkgaW50IGV2ZW50LCBpbnQgc29ydFtdKQorc3RhdGljIHZvaWQgZGFwbV9zZXFfcnVuKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBpbnQgZXZlbnQsIGludCBzb3J0W10pCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsICpuOwogCUxJU1RfSEVBRChwZW5kaW5nKTsKIAlpbnQgY3VyX3NvcnQgPSAtMTsKIAlpbnQgY3VyX3JlZyA9IFNORF9TT0NfTk9QTTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmN1cl9kYXBtID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHcsIG4sIGxpc3QsIHBvd2VyX2xpc3QpIHsKIAkJcmV0ID0gMDsKIAogCQkvKiBEbyB3ZSBuZWVkIHRvIGFwcGx5IGFueSBxdWV1ZWQgY2hhbmdlcz8gKi8KLQkJaWYgKHNvcnRbdy0+aWRdICE9IGN1cl9zb3J0IHx8IHctPnJlZyAhPSBjdXJfcmVnKSB7CisJCWlmIChzb3J0W3ctPmlkXSAhPSBjdXJfc29ydCB8fCB3LT5yZWcgIT0gY3VyX3JlZyB8fAorCQkgICAgdy0+ZGFwbSAhPSBjdXJfZGFwbSkgewogCQkJaWYgKCFsaXN0X2VtcHR5KCZwZW5kaW5nKSkKLQkJCQlkYXBtX3NlcV9ydW5fY29hbGVzY2VkKGNvZGVjLCAmcGVuZGluZyk7CisJCQkJZGFwbV9zZXFfcnVuX2NvYWxlc2NlZChjdXJfZGFwbSwgJnBlbmRpbmcpOwogCiAJCQlJTklUX0xJU1RfSEVBRCgmcGVuZGluZyk7CiAJCQljdXJfc29ydCA9IC0xOwogCQkJY3VyX3JlZyA9IFNORF9TT0NfTk9QTTsKKwkJCWN1cl9kYXBtID0gTlVMTDsKIAkJfQogCiAJCXN3aXRjaCAody0+aWQpIHsKQEAgLTg2NywxOSArOTIyLDU1IEBACiAJCQkvKiBRdWV1ZSBpdCB1cCBmb3IgYXBwbGljYXRpb24gKi8KIAkJCWN1cl9zb3J0ID0gc29ydFt3LT5pZF07CiAJCQljdXJfcmVnID0gdy0+cmVnOworCQkJY3VyX2RhcG0gPSB3LT5kYXBtOwogCQkJbGlzdF9tb3ZlKCZ3LT5wb3dlcl9saXN0LCAmcGVuZGluZyk7CiAJCQlicmVhazsKIAkJfQogCiAJCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCJGYWlsZWQgdG8gYXBwbHkgd2lkZ2V0IHBvd2VyOiAlZFxuIiwKLQkJCSAgICAgICByZXQpOworCQkJZGV2X2Vycih3LT5kYXBtLT5kZXYsCisJCQkJIkZhaWxlZCB0byBhcHBseSB3aWRnZXQgcG93ZXI6ICVkXG4iLCByZXQpOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmcGVuZGluZykpCi0JCWRhcG1fc2VxX3J1bl9jb2FsZXNjZWQoY29kZWMsICZwZW5kaW5nKTsKKwkJZGFwbV9zZXFfcnVuX2NvYWxlc2NlZChkYXBtLCAmcGVuZGluZyk7CiB9CiAKK3N0YXRpYyB2b2lkIGRhcG1fd2lkZ2V0X3VwZGF0ZShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IGRhcG0tPnVwZGF0ZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKwlpbnQgcmV0OworCisJaWYgKCF1cGRhdGUpCisJCXJldHVybjsKKworCXcgPSB1cGRhdGUtPndpZGdldDsKKworCWlmICh3LT5ldmVudCAmJgorCSAgICAody0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUFJFX1JFRykpIHsKKwkJcmV0ID0gdy0+ZXZlbnQodywgdXBkYXRlLT5rY29udHJvbCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpOworCQlpZiAocmV0ICE9IDApCisJCQlwcl9lcnIoIiVzIERBUE0gcHJlLWV2ZW50IGZhaWxlZDogJWRcbiIsCisJCQkgICAgICAgdy0+bmFtZSwgcmV0KTsKKwl9CisKKwlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHctPmNvZGVjLCB1cGRhdGUtPnJlZywgdXBkYXRlLT5tYXNrLAorCQkJCSAgdXBkYXRlLT52YWwpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzIERBUE0gdXBkYXRlIGZhaWxlZDogJWRcbiIsIHctPm5hbWUsIHJldCk7CisKKwlpZiAody0+ZXZlbnQgJiYKKwkgICAgKHctPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BPU1RfUkVHKSkgeworCQlyZXQgPSB3LT5ldmVudCh3LCB1cGRhdGUtPmtjb250cm9sLCBTTkRfU09DX0RBUE1fUE9TVF9SRUcpOworCQlpZiAocmV0ICE9IDApCisJCQlwcl9lcnIoIiVzIERBUE0gcG9zdC1ldmVudCBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIHctPm5hbWUsIHJldCk7CisJfQorfQorCisKKwogLyoKICAqIFNjYW4gZWFjaCBkYXBtIHdpZGdldCBmb3IgY29tcGxldGUgYXVkaW8gcGF0aC4KICAqIEEgY29tcGxldGUgcGF0aCBpcyBhIHJvdXRlIHRoYXQgaGFzIHZhbGlkIGVuZHBvaW50cyBpLmUuOi0KQEAgLTg4OSwyMCArOTgwLDI2IEBACiAgKiAgbyBJbnB1dCBwaW4gdG8gT3V0cHV0IHBpbiAoYnlwYXNzLCBzaWRldG9uZSkKICAqICBvIERBQyB0byBBREMgKGxvb3BiYWNrKS4KICAqLwotc3RhdGljIGludCBkYXBtX3Bvd2VyX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZXZlbnQpCitzdGF0aWMgaW50IGRhcG1fcG93ZXJfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGludCBldmVudCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNvZGVjLT5jYXJkOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZDsKIAlMSVNUX0hFQUQodXBfbGlzdCk7CiAJTElTVF9IRUFEKGRvd25fbGlzdCk7CiAJaW50IHJldCA9IDA7CiAJaW50IHBvd2VyOwotCWludCBzeXNfcG93ZXIgPSAwOworCisJdHJhY2Vfc25kX3NvY19kYXBtX3N0YXJ0KGNhcmQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmY2FyZC0+ZGFwbV9saXN0LCBsaXN0KQorCQlpZiAoZC0+bl93aWRnZXRzKQorCQkJZC0+ZGV2X3Bvd2VyID0gMDsKIAogCS8qIENoZWNrIHdoaWNoIHdpZGdldHMgd2UgbmVlZCB0byBwb3dlciBhbmQgc3RvcmUgdGhlbSBpbgogCSAqIGxpc3RzIGluZGljYXRpbmcgaWYgdGhleSBzaG91bGQgYmUgcG93ZXJlZCB1cCBvciBkb3duLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjYXJkLT53aWRnZXRzLCBsaXN0KSB7CiAJCXN3aXRjaCAody0+aWQpIHsKIAkJY2FzZSBzbmRfc29jX2RhcG1fcHJlOgogCQkJZGFwbV9zZXFfaW5zZXJ0KHcsICZkb3duX2xpc3QsIGRhcG1fZG93bl9zZXEpOwpAQCAtOTIwLDExICsxMDE3LDEzIEBACiAJCQllbHNlCiAJCQkJcG93ZXIgPSAxOwogCQkJaWYgKHBvd2VyKQotCQkJCXN5c19wb3dlciA9IDE7CisJCQkJdy0+ZGFwbS0+ZGV2X3Bvd2VyID0gMTsKIAogCQkJaWYgKHctPnBvd2VyID09IHBvd2VyKQogCQkJCWNvbnRpbnVlOwogCisJCQl0cmFjZV9zbmRfc29jX2RhcG1fd2lkZ2V0X3Bvd2VyKHcsIHBvd2VyKTsKKwogCQkJaWYgKHBvd2VyKQogCQkJCWRhcG1fc2VxX2luc2VydCh3LCAmdXBfbGlzdCwgZGFwbV91cF9zZXEpOwogCQkJZWxzZQpAQCAtOTM4LDI2ICsxMDM3LDI2IEBACiAJLyogSWYgdGhlcmUgYXJlIG5vIERBUE0gd2lkZ2V0cyB0aGVuIHRyeSB0byBmaWd1cmUgb3V0IHBvd2VyIGZyb20gdGhlCiAJICogZXZlbnQgdHlwZS4KIAkgKi8KLQlpZiAobGlzdF9lbXB0eSgmY29kZWMtPmRhcG1fd2lkZ2V0cykpIHsKKwlpZiAoIWRhcG0tPm5fd2lkZ2V0cykgewogCQlzd2l0Y2ggKGV2ZW50KSB7CiAJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVEFSVDoKIAkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1JFU1VNRToKLQkJCXN5c19wb3dlciA9IDE7CisJCQlkYXBtLT5kZXZfcG93ZXIgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVE9QOgotCQkJc3lzX3Bvd2VyID0gISFjb2RlYy0+YWN0aXZlOworCQkJZGFwbS0+ZGV2X3Bvd2VyID0gISFkYXBtLT5jb2RlYy0+YWN0aXZlOwogCQkJYnJlYWs7CiAJCWNhc2UgU05EX1NPQ19EQVBNX1NUUkVBTV9TVVNQRU5EOgotCQkJc3lzX3Bvd2VyID0gMDsKKwkJCWRhcG0tPmRldl9wb3dlciA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX05PUDoKLQkJCXN3aXRjaCAoY29kZWMtPmJpYXNfbGV2ZWwpIHsKKwkJCXN3aXRjaCAoZGFwbS0+Ymlhc19sZXZlbCkgewogCQkJCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CiAJCQkJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQkJCQlzeXNfcG93ZXIgPSAwOworCQkJCQlkYXBtLT5kZXZfcG93ZXIgPSAwOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQlzeXNfcG93ZXIgPSAxOworCQkJCQlkYXBtLT5kZXZfcG93ZXIgPSAxOwogCQkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtOTY2LDUyICsxMDY1LDcxIEBACiAJCX0KIAl9CiAKLQlpZiAoc3lzX3Bvd2VyICYmIGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKLQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGNvZGVjLAotCQkJCQkJICBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXByX2VycigiRmFpbGVkIHRvIHR1cm4gb24gYmlhczogJWRcbiIsIHJldCk7Ci0JfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRhcG0tPmNhcmQtPmRhcG1fbGlzdCwgbGlzdCkgeworCQlpZiAoZC0+ZGV2X3Bvd2VyICYmIGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGQsCisJCQkJCQkJICBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X2VycihkLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gdHVybiBvbiBiaWFzOiAlZFxuIiwgcmV0KTsKKwkJfQogCi0JLyogSWYgd2UncmUgY2hhbmdpbmcgdG8gYWxsIG9uIG9yIGFsbCBvZmYgdGhlbiBwcmVwYXJlICovCi0JaWYgKChzeXNfcG93ZXIgJiYgY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHx8Ci0JICAgICghc3lzX3Bvd2VyICYmIGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PTikpIHsKLQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGNvZGVjLCBTTkRfU09DX0JJQVNfUFJFUEFSRSk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXByX2VycigiRmFpbGVkIHRvIHByZXBhcmUgYmlhczogJWRcbiIsIHJldCk7CisJCS8qIElmIHdlJ3JlIGNoYW5naW5nIHRvIGFsbCBvbiBvciBhbGwgb2ZmIHRoZW4gcHJlcGFyZSAqLworCQlpZiAoKGQtPmRldl9wb3dlciAmJiBkLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZKSB8fAorCQkgICAgKCFkLT5kZXZfcG93ZXIgJiYgZC0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT04pKSB7CisJCQlyZXQgPSBzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoY2FyZCwgZCwKKwkJCQkJCQkgIFNORF9TT0NfQklBU19QUkVQQVJFKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlkZXZfZXJyKGQtPmRldiwKKwkJCQkJIkZhaWxlZCB0byBwcmVwYXJlIGJpYXM6ICVkXG4iLCByZXQpOworCQl9CiAJfQogCiAJLyogUG93ZXIgZG93biB3aWRnZXRzIGZpcnN0OyB0cnkgdG8gYXZvaWQgYW1wbGlmeWluZyBwb3BzLiAqLwotCWRhcG1fc2VxX3J1bihjb2RlYywgJmRvd25fbGlzdCwgZXZlbnQsIGRhcG1fZG93bl9zZXEpOworCWRhcG1fc2VxX3J1bihkYXBtLCAmZG93bl9saXN0LCBldmVudCwgZGFwbV9kb3duX3NlcSk7CisKKwlkYXBtX3dpZGdldF91cGRhdGUoZGFwbSk7CiAKIAkvKiBOb3cgcG93ZXIgdXAuICovCi0JZGFwbV9zZXFfcnVuKGNvZGVjLCAmdXBfbGlzdCwgZXZlbnQsIGRhcG1fdXBfc2VxKTsKKwlkYXBtX3NlcV9ydW4oZGFwbSwgJnVwX2xpc3QsIGV2ZW50LCBkYXBtX3VwX3NlcSk7CiAKLQkvKiBJZiB3ZSBqdXN0IHBvd2VyZWQgdGhlIGxhc3QgdGhpbmcgb2ZmIGRyb3AgdG8gc3RhbmRieSBiaWFzICovCi0JaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19QUkVQQVJFICYmICFzeXNfcG93ZXIpIHsKLQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXByX2VycigiRmFpbGVkIHRvIGFwcGx5IHN0YW5kYnkgYmlhczogJWRcbiIsIHJldCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmZGFwbS0+Y2FyZC0+ZGFwbV9saXN0LCBsaXN0KSB7CisJCS8qIElmIHdlIGp1c3QgcG93ZXJlZCB0aGUgbGFzdCB0aGluZyBvZmYgZHJvcCB0byBzdGFuZGJ5IGJpYXMgKi8KKwkJaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUgJiYgIWQtPmRldl9wb3dlcikgeworCQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGQsCisJCQkJCQkJICBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X2VycihkLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gYXBwbHkgc3RhbmRieSBiaWFzOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJfQorCisJCS8qIElmIHdlJ3JlIGluIHN0YW5kYnkgYW5kIGNhbiBzdXBwb3J0IGJpYXMgb2ZmIHRoZW4gZG8gdGhhdCAqLworCQlpZiAoZC0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSAmJgorCQkgICAgZC0+aWRsZV9iaWFzX29mZikgeworCQkJcmV0ID0gc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKGNhcmQsIGQsCisJCQkJCQkJICBTTkRfU09DX0JJQVNfT0ZGKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlkZXZfZXJyKGQtPmRldiwKKwkJCQkJIkZhaWxlZCB0byB0dXJuIG9mZiBiaWFzOiAlZFxuIiwgcmV0KTsKKwkJfQorCisJCS8qIElmIHdlIGp1c3QgcG93ZXJlZCB1cCB0aGVuIG1vdmUgdG8gYWN0aXZlIGJpYXMgKi8KKwkJaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUgJiYgZC0+ZGV2X3Bvd2VyKSB7CisJCQlyZXQgPSBzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoY2FyZCwgZCwKKwkJCQkJCQkgIFNORF9TT0NfQklBU19PTik7CisJCQlpZiAocmV0ICE9IDApCisJCQkJZGV2X2VycihkLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gYXBwbHkgYWN0aXZlIGJpYXM6ICVkXG4iLAorCQkJCQlyZXQpOworCQl9CiAJfQogCi0JLyogSWYgd2UncmUgaW4gc3RhbmRieSBhbmQgY2FuIHN1cHBvcnQgYmlhcyBvZmYgdGhlbiBkbyB0aGF0ICovCi0JaWYgKGNvZGVjLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19TVEFOREJZICYmCi0JICAgIGNvZGVjLT5pZGxlX2JpYXNfb2ZmKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChjYXJkLCBjb2RlYywgU05EX1NPQ19CSUFTX09GRik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXByX2VycigiRmFpbGVkIHRvIHR1cm4gb2ZmIGJpYXM6ICVkXG4iLCByZXQpOwotCX0KKwlwb3BfZGJnKGRhcG0tPmRldiwgY2FyZC0+cG9wX3RpbWUsCisJCSJEQVBNIHNlcXVlbmNpbmcgZmluaXNoZWQsIHdhaXRpbmcgJWRtc1xuIiwgY2FyZC0+cG9wX3RpbWUpOworCXBvcF93YWl0KGNhcmQtPnBvcF90aW1lKTsKIAotCS8qIElmIHdlIGp1c3QgcG93ZXJlZCB1cCB0aGVuIG1vdmUgdG8gYWN0aXZlIGJpYXMgKi8KLQlpZiAoY29kZWMtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUgJiYgc3lzX3Bvd2VyKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChjYXJkLCBjb2RlYywgU05EX1NPQ19CSUFTX09OKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcHJfZXJyKCJGYWlsZWQgdG8gYXBwbHkgYWN0aXZlIGJpYXM6ICVkXG4iLCByZXQpOwotCX0KLQotCXBvcF9kYmcoY29kZWMtPnBvcF90aW1lLCAiREFQTSBzZXF1ZW5jaW5nIGZpbmlzaGVkLCB3YWl0aW5nICVkbXNcbiIsCi0JCWNvZGVjLT5wb3BfdGltZSk7Ci0JcG9wX3dhaXQoY29kZWMtPnBvcF90aW1lKTsKKwl0cmFjZV9zbmRfc29jX2RhcG1fZG9uZShjYXJkKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAzOCw5ICsxMTU2LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbiA9IGlzX2Nvbm5lY3RlZF9pbnB1dF9lcCh3KTsKLQlkYXBtX2NsZWFyX3dhbGsody0+Y29kZWMpOworCWRhcG1fY2xlYXJfd2Fsayh3LT5kYXBtKTsKIAlvdXQgPSBpc19jb25uZWN0ZWRfb3V0cHV0X2VwKHcpOwotCWRhcG1fY2xlYXJfd2Fsayh3LT5jb2RlYyk7CisJZGFwbV9jbGVhcl93YWxrKHctPmRhcG0pOwogCiAJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlczogJXMgIGluICVkIG91dCAlZCIsCiAJCSAgICAgICB3LT5uYW1lLCB3LT5wb3dlciA/ICJPbiIgOiAiT2ZmIiwgaW4sIG91dCk7CkBAIC0xMDkwLDI5ICsxMjA4LDI5IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAotdm9pZCBzbmRfc29jX2RhcG1fZGVidWdmc19pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3ZvaWQgc25kX3NvY19kYXBtX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAotCWlmICghY29kZWMtPmRlYnVnZnNfZGFwbSkKKwlpZiAoIWRhcG0tPmRlYnVnZnNfZGFwbSkKIAkJcmV0dXJuOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgewotCQlpZiAoIXctPm5hbWUpCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cywgbGlzdCkgeworCQlpZiAoIXctPm5hbWUgfHwgdy0+ZGFwbSAhPSBkYXBtKQogCQkJY29udGludWU7CiAKIAkJZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUody0+bmFtZSwgMDQ0NCwKLQkJCQkJY29kZWMtPmRlYnVnZnNfZGFwbSwgdywKKwkJCQkJZGFwbS0+ZGVidWdmc19kYXBtLCB3LAogCQkJCQkmZGFwbV93aWRnZXRfcG93ZXJfZm9wcyk7CiAJCWlmICghZCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSAlcyBkZWJ1Z2ZzIGZpbGVcbiIsCi0JCQkgICAgICAgdy0+bmFtZSk7CisJCQlkZXZfd2Fybih3LT5kYXBtLT5kZXYsCisJCQkJIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgJXMgZGVidWdmcyBmaWxlXG4iLAorCQkJCXctPm5hbWUpOwogCX0KIH0KICNlbHNlCi12b2lkIHNuZF9zb2NfZGFwbV9kZWJ1Z2ZzX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQordm9pZCBzbmRfc29jX2RhcG1fZGVidWdmc19pbml0KHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKIH0KICNlbmRpZgpAQCAtMTEyNiw2ICsxMjQ0LDcgQEAKIAlpbnQgZm91bmQgPSAwOwogCiAJaWYgKHdpZGdldC0+aWQgIT0gc25kX3NvY19kYXBtX211eCAmJgorCSAgICB3aWRnZXQtPmlkICE9IHNuZF9zb2NfZGFwbV92aXJ0X211eCAmJgogCSAgICB3aWRnZXQtPmlkICE9IHNuZF9zb2NfZGFwbV92YWx1ZV9tdXgpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xMTMzLDcgKzEyNTIsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGZpbmQgZGFwbSB3aWRnZXQgcGF0aCBhc3NvYyB3aXRoIGtjb250cm9sICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5jb2RlYy0+ZGFwbV9wYXRocywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+ZGFwbS0+Y2FyZC0+cGF0aHMsIGxpc3QpIHsKIAkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQogCQkJY29udGludWU7CiAKQEAgLTExNDksNyArMTI2OCw3IEBACiAJfQogCiAJaWYgKGZvdW5kKQotCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5jb2RlYywgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOworCQlkYXBtX3Bvd2VyX3dpZGdldHMod2lkZ2V0LT5kYXBtLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNjcsNyArMTI4Niw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogZmluZCBkYXBtIHdpZGdldCBwYXRoIGFzc29jIHdpdGgga2NvbnRyb2wgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhdGgsICZ3aWRnZXQtPmNvZGVjLT5kYXBtX3BhdGhzLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXRoLCAmd2lkZ2V0LT5kYXBtLT5jYXJkLT5wYXRocywgbGlzdCkgewogCQlpZiAocGF0aC0+a2NvbnRyb2wgIT0ga2NvbnRyb2wpCiAJCQljb250aW51ZTsKIApAQCAtMTE3OCw3ICsxMjk3LDcgQEAKIAl9CiAKIAlpZiAoZm91bmQpCi0JCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmRhcG0sIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE5NCw3ICsxMzEzLDkgQEAKIAlpbnQgY291bnQgPSAwOwogCWNoYXIgKnN0YXRlID0gIm5vdCBzZXQiOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5jYXJkLT53aWRnZXRzLCBsaXN0KSB7CisJCWlmICh3LT5kYXBtICE9ICZjb2RlYy0+ZGFwbSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIG9ubHkgZGlzcGxheSB3aWRnZXRzIHRoYXQgYnVybm0gcG93ZXIgKi8KIAkJc3dpdGNoICh3LT5pZCkgewpAQCAtMTIwNiw2ICsxMzI3LDcgQEAKIAkJY2FzZSBzbmRfc29jX2RhcG1fZGFjOgogCQljYXNlIHNuZF9zb2NfZGFwbV9hZGM6CiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CiAJCWNhc2Ugc25kX3NvY19kYXBtX21peGVyX25hbWVkX2N0bDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fc3VwcGx5OgpAQCAtMTIxOCw3ICsxMzQwLDcgQEAKIAkJfQogCX0KIAotCXN3aXRjaCAoY29kZWMtPmJpYXNfbGV2ZWwpIHsKKwlzd2l0Y2ggKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKIAkJc3RhdGUgPSAiT24iOwogCQlicmVhazsKQEAgLTEyNTAsMzEgKzEzNzIsNTAgQEAKIH0KIAogLyogZnJlZSBhbGwgZGFwbSB3aWRnZXRzIGFuZCByZXNvdXJjZXMgKi8KLXN0YXRpYyB2b2lkIGRhcG1fZnJlZV93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGRhcG1fZnJlZV93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgKm5leHRfdzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnAsICpuZXh0X3A7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodywgbmV4dF93LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3LCBuZXh0X3csICZkYXBtLT5jYXJkLT53aWRnZXRzLCBsaXN0KSB7CisJCWlmICh3LT5kYXBtICE9IGRhcG0pCisJCQljb250aW51ZTsKIAkJbGlzdF9kZWwoJnctPmxpc3QpOworCQkvKgorCQkgKiByZW1vdmUgc291cmNlIGFuZCBzaW5rIHBhdGhzIGFzc29jaWF0ZWQgdG8gdGhpcyB3aWRnZXQuCisJCSAqIFdoaWxlIHJlbW92aW5nIHRoZSBwYXRoLCByZW1vdmUgcmVmZXJlbmNlIHRvIGl0IGZyb20gYm90aAorCQkgKiBzb3VyY2UgYW5kIHNpbmsgd2lkZ2V0cyBzbyB0aGF0IHBhdGggaXMgcmVtb3ZlZCBvbmx5IG9uY2UuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbmV4dF9wLCAmdy0+c291cmNlcywgbGlzdF9zaW5rKSB7CisJCQlsaXN0X2RlbCgmcC0+bGlzdF9zaW5rKTsKKwkJCWxpc3RfZGVsKCZwLT5saXN0X3NvdXJjZSk7CisJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCQlrZnJlZShwLT5sb25nX25hbWUpOworCQkJa2ZyZWUocCk7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG5leHRfcCwgJnctPnNpbmtzLCBsaXN0X3NvdXJjZSkgeworCQkJbGlzdF9kZWwoJnAtPmxpc3Rfc2luayk7CisJCQlsaXN0X2RlbCgmcC0+bGlzdF9zb3VyY2UpOworCQkJbGlzdF9kZWwoJnAtPmxpc3QpOworCQkJa2ZyZWUocC0+bG9uZ19uYW1lKTsKKwkJCWtmcmVlKHApOworCQl9CisJCWtmcmVlKHctPm5hbWUpOwogCQlrZnJlZSh3KTsKIAl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbmV4dF9wLCAmY29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJnAtPmxpc3QpOwotCQlrZnJlZShwLT5sb25nX25hbWUpOwotCQlrZnJlZShwKTsKLQl9CiB9CiAKLXN0YXRpYyBpbnQgc25kX3NvY19kYXBtX3NldF9waW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorc3RhdGljIGludCBzbmRfc29jX2RhcG1fc2V0X3BpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCiAJCQkJY29uc3QgY2hhciAqcGluLCBpbnQgc3RhdHVzKQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRhcG0tPmNhcmQtPndpZGdldHMsIGxpc3QpIHsKKwkJaWYgKHctPmRhcG0gIT0gZGFwbSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoIXN0cmNtcCh3LT5uYW1lLCBwaW4pKSB7Ci0JCQlwcl9kZWJ1ZygiZGFwbTogJXM6IHBpbiAlc1xuIiwgY29kZWMtPm5hbWUsIHBpbik7CisJCQlkZXZfZGJnKHctPmRhcG0tPmRldiwgImRhcG06IHBpbiAlcyA9ICVkXG4iLAorCQkJCXBpbiwgc3RhdHVzKTsKIAkJCXctPmNvbm5lY3RlZCA9IHN0YXR1czsKIAkJCS8qIEFsbG93IGRpc2FibGluZyBvZiBmb3JjZWQgcGlucyAqLwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMTI4Myw0NiArMTQyNCw3MiBAQAogCQl9CiAJfQogCi0JcHJfZXJyKCJkYXBtOiAlczogY29uZmlndXJpbmcgdW5rbm93biBwaW4gJXNcbiIsIGNvZGVjLT5uYW1lLCBwaW4pOworCWRldl9lcnIoZGFwbS0+ZGV2LCAiZGFwbTogdW5rbm93biBwaW4gJXNcbiIsIHBpbik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qKgogICogc25kX3NvY19kYXBtX3N5bmMgLSBzY2FuIGFuZCBwb3dlciBkYXBtIHBhdGhzCi0gKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKgogICogV2Fsa3MgYWxsIGRhcG0gYXVkaW8gcGF0aHMgYW5kIHBvd2VycyB3aWRnZXRzIGFjY29yZGluZyB0byB0aGVpcgogICogc3RyZWFtIG9yIHBhdGggdXNhZ2UuCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgogICovCi1pbnQgc25kX3NvY19kYXBtX3N5bmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoraW50IHNuZF9zb2NfZGFwbV9zeW5jKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKLQlyZXR1cm4gZGFwbV9wb3dlcl93aWRnZXRzKGNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CisJcmV0dXJuIGRhcG1fcG93ZXJfd2lkZ2V0cyhkYXBtLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fc3luYyk7CiAKLXN0YXRpYyBpbnQgc25kX3NvY19kYXBtX2FkZF9yb3V0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCitzdGF0aWMgaW50IHNuZF9zb2NfZGFwbV9hZGRfcm91dGUoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCQkJCSAgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqcm91dGUpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3c291cmNlID0gTlVMTCwgKndzaW5rID0gTlVMTCwgKnc7Ci0JY29uc3QgY2hhciAqc2luayA9IHJvdXRlLT5zaW5rOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3dHNvdXJjZSA9IE5VTEwsICp3dHNpbmsgPSBOVUxMOworCWNvbnN0IGNoYXIgKnNpbms7CiAJY29uc3QgY2hhciAqY29udHJvbCA9IHJvdXRlLT5jb250cm9sOwotCWNvbnN0IGNoYXIgKnNvdXJjZSA9IHJvdXRlLT5zb3VyY2U7CisJY29uc3QgY2hhciAqc291cmNlOworCWNoYXIgcHJlZml4ZWRfc2lua1s4MF07CisJY2hhciBwcmVmaXhlZF9zb3VyY2VbODBdOwogCWludCByZXQgPSAwOwogCi0JLyogZmluZCBzcmMgYW5kIGRlc3Qgd2lkZ2V0cyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpIHsKKwlpZiAoZGFwbS0+Y29kZWMtPm5hbWVfcHJlZml4KSB7CisJCXNucHJpbnRmKHByZWZpeGVkX3NpbmssIHNpemVvZihwcmVmaXhlZF9zaW5rKSwgIiVzICVzIiwKKwkJCSBkYXBtLT5jb2RlYy0+bmFtZV9wcmVmaXgsIHJvdXRlLT5zaW5rKTsKKwkJc2luayA9IHByZWZpeGVkX3Npbms7CisJCXNucHJpbnRmKHByZWZpeGVkX3NvdXJjZSwgc2l6ZW9mKHByZWZpeGVkX3NvdXJjZSksICIlcyAlcyIsCisJCQkgZGFwbS0+Y29kZWMtPm5hbWVfcHJlZml4LCByb3V0ZS0+c291cmNlKTsKKwkJc291cmNlID0gcHJlZml4ZWRfc291cmNlOworCX0gZWxzZSB7CisJCXNpbmsgPSByb3V0ZS0+c2luazsKKwkJc291cmNlID0gcm91dGUtPnNvdXJjZTsKKwl9CiAKKwkvKgorCSAqIGZpbmQgc3JjIGFuZCBkZXN0IHdpZGdldHMgb3ZlciBhbGwgd2lkZ2V0cyBidXQgZmF2b3IgYSB3aWRnZXQgZnJvbQorCSAqIGN1cnJlbnQgREFQTSBjb250ZXh0CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cywgbGlzdCkgewogCQlpZiAoIXdzaW5rICYmICEoc3RyY21wKHctPm5hbWUsIHNpbmspKSkgewotCQkJd3NpbmsgPSB3OworCQkJd3RzaW5rID0gdzsKKwkJCWlmICh3LT5kYXBtID09IGRhcG0pCisJCQkJd3NpbmsgPSB3OwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCF3c291cmNlICYmICEoc3RyY21wKHctPm5hbWUsIHNvdXJjZSkpKSB7Ci0JCQl3c291cmNlID0gdzsKKwkJCXd0c291cmNlID0gdzsKKwkJCWlmICh3LT5kYXBtID09IGRhcG0pCisJCQkJd3NvdXJjZSA9IHc7CiAJCX0KIAl9CisJLyogdXNlIHdpZGdldCBmcm9tIGFub3RoZXIgREFQTSBjb250ZXh0IGlmIG5vdCBmb3VuZCBmcm9tIHRoaXMgKi8KKwlpZiAoIXdzaW5rKQorCQl3c2luayA9IHd0c2luazsKKwlpZiAoIXdzb3VyY2UpCisJCXdzb3VyY2UgPSB3dHNvdXJjZTsKIAogCWlmICh3c291cmNlID09IE5VTEwgfHwgd3NpbmsgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMzU2LDcgKzE1MjMsNyBAQAogCiAJLyogY29ubmVjdCBzdGF0aWMgcGF0aHMgKi8KIAlpZiAoY29udHJvbCA9PSBOVUxMKSB7Ci0JCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmRhcG0tPmNhcmQtPnBhdGhzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJndzaW5rLT5zb3VyY2VzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmd3NvdXJjZS0+c2lua3MpOwogCQlwYXRoLT5jb25uZWN0ID0gMTsKQEAgLTEzNjgsNiArMTUzNSw3IEBACiAJY2FzZSBzbmRfc29jX2RhcG1fYWRjOgogCWNhc2Ugc25kX3NvY19kYXBtX2RhYzoKIAljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKIAljYXNlIHNuZF9zb2NfZGFwbV9vdXRwdXQ6CiAJY2FzZSBzbmRfc29jX2RhcG1fbWljYmlhczoKQEAgLTEzNzcsMTQgKzE1NDUsMTUgQEAKIAljYXNlIHNuZF9zb2NfZGFwbV9zdXBwbHk6CiAJY2FzZSBzbmRfc29jX2RhcG1fYWlmX2luOgogCWNhc2Ugc25kX3NvY19kYXBtX2FpZl9vdXQ6Ci0JCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmRhcG0tPmNhcmQtPnBhdGhzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJndzaW5rLT5zb3VyY2VzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmd3NvdXJjZS0+c2lua3MpOwogCQlwYXRoLT5jb25uZWN0ID0gMTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZpcnRfbXV4OgogCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKLQkJcmV0ID0gZGFwbV9jb25uZWN0X211eChjb2RlYywgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wsCisJCXJldCA9IGRhcG1fY29ubmVjdF9tdXgoZGFwbSwgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wsCiAJCQkmd3NpbmstPmtjb250cm9sc1swXSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gZXJyOwpAQCAtMTM5Miw3ICsxNTYxLDcgQEAKIAljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CiAJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CiAJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXJfbmFtZWRfY3RsOgotCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbWl4ZXIoY29kZWMsIHdzb3VyY2UsIHdzaW5rLCBwYXRoLCBjb250cm9sKTsKKwkJcmV0ID0gZGFwbV9jb25uZWN0X21peGVyKGRhcG0sIHdzb3VyY2UsIHdzaW5rLCBwYXRoLCBjb250cm9sKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnI7CiAJCWJyZWFrOwpAQCAtMTQwMCw3ICsxNTY5LDcgQEAKIAljYXNlIHNuZF9zb2NfZGFwbV9taWM6CiAJY2FzZSBzbmRfc29jX2RhcG1fbGluZToKIAljYXNlIHNuZF9zb2NfZGFwbV9zcGs6Ci0JCWxpc3RfYWRkKCZwYXRoLT5saXN0LCAmY29kZWMtPmRhcG1fcGF0aHMpOworCQlsaXN0X2FkZCgmcGF0aC0+bGlzdCwgJmRhcG0tPmNhcmQtPnBhdGhzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc2luaywgJndzaW5rLT5zb3VyY2VzKTsKIAkJbGlzdF9hZGQoJnBhdGgtPmxpc3Rfc291cmNlLCAmd3NvdXJjZS0+c2lua3MpOwogCQlwYXRoLT5jb25uZWN0ID0gMDsKQEAgLTE0MDksMTUgKzE1NzgsMTUgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXByaW50ayhLRVJOX1dBUk5JTkcgImFzb2M6IG5vIGRhcG0gbWF0Y2ggZm9yICVzIC0tPiAlcyAtLT4gJXNcbiIsIHNvdXJjZSwKLQkJY29udHJvbCwgc2luayk7CisJZGV2X3dhcm4oZGFwbS0+ZGV2LCAiYXNvYzogbm8gZGFwbSBtYXRjaCBmb3IgJXMgLS0+ICVzIC0tPiAlc1xuIiwKKwkJIHNvdXJjZSwgY29udHJvbCwgc2luayk7CiAJa2ZyZWUocGF0aCk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCiAgKiBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyAtIEFkZCByb3V0ZXMgYmV0d2VlbiBEQVBNIHdpZGdldHMKLSAqIEBjb2RlYzogY29kZWMKKyAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqIEByb3V0ZTogYXVkaW8gcm91dGVzCiAgKiBAbnVtOiBudW1iZXIgb2Ygcm91dGVzCiAgKgpAQCAtMTQyOCwxNyArMTU5NywxNiBAQAogICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuIE9uIGVycm9yIGFsbCByZXNvdXJjZXMgY2FuIGJlIGZyZWVkCiAgKiB3aXRoIGEgY2FsbCB0byBzbmRfc29jX2NhcmRfZnJlZSgpLgogICovCi1pbnQgc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAoraW50IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAkJCSAgICBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpyb3V0ZSwgaW50IG51bSkKIHsKIAlpbnQgaSwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGUoY29kZWMsIHJvdXRlKTsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZShkYXBtLCByb3V0ZSk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhZGQgcm91dGUgJXMtPiVzXG4iLAotCQkJICAgICAgIHJvdXRlLT5zb3VyY2UsCi0JCQkgICAgICAgcm91dGUtPnNpbmspOworCQkJZGV2X2VycihkYXBtLT5kZXYsICJGYWlsZWQgdG8gYWRkIHJvdXRlICVzLT4lc1xuIiwKKwkJCQlyb3V0ZS0+c291cmNlLCByb3V0ZS0+c2luayk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCXJvdXRlKys7CkBAIC0xNDUwLDE3ICsxNjE4LDE3IEBACiAKIC8qKgogICogc25kX3NvY19kYXBtX25ld193aWRnZXRzIC0gYWRkIG5ldyBkYXBtIHdpZGdldHMKLSAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqCiAgKiBDaGVja3MgdGhlIGNvZGVjIGZvciBhbnkgbmV3IGRhcG0gd2lkZ2V0cyBhbmQgY3JlYXRlcyB0aGVtIGlmIGZvdW5kLgogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4KICAqLwotaW50IHNuZF9zb2NfZGFwbV9uZXdfd2lkZ2V0cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitpbnQgc25kX3NvY19kYXBtX25ld193aWRnZXRzKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cywgbGlzdCkKIAl7CiAJCWlmICh3LT5uZXcpCiAJCQljb250aW51ZTsKQEAgLTE0NzAsMTIgKzE2MzgsMTMgQEAKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWl4ZXI6CiAJCWNhc2Ugc25kX3NvY19kYXBtX21peGVyX25hbWVkX2N0bDoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfbWl4ZXIoY29kZWMsIHcpOworCQkJZGFwbV9uZXdfbWl4ZXIoZGFwbSwgdyk7CiAJCQlicmVhazsKIAkJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCQljYXNlIHNuZF9zb2NfZGFwbV92aXJ0X211eDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4OgogCQkJdy0+cG93ZXJfY2hlY2sgPSBkYXBtX2dlbmVyaWNfY2hlY2tfcG93ZXI7Ci0JCQlkYXBtX25ld19tdXgoY29kZWMsIHcpOworCQkJZGFwbV9uZXdfbXV4KGRhcG0sIHcpOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2FkYzoKIAkJY2FzZSBzbmRfc29jX2RhcG1fYWlmX291dDoKQEAgLTE0ODYsOCArMTY1NSw5IEBACiAJCQl3LT5wb3dlcl9jaGVjayA9IGRhcG1fZGFjX2NoZWNrX3Bvd2VyOwogCQkJYnJlYWs7CiAJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJCXctPnBvd2VyX2NoZWNrID0gZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyOwotCQkJZGFwbV9uZXdfcGdhKGNvZGVjLCB3KTsKKwkJCWRhcG1fbmV3X3BnYShkYXBtLCB3KTsKIAkJCWJyZWFrOwogCQljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgpAQCAtMTUwOCw3ICsxNjc4LDcgQEAKIAkJdy0+bmV3ID0gMTsKIAl9CiAKLQlkYXBtX3Bvd2VyX3dpZGdldHMoY29kZWMsIFNORF9TT0NfREFQTV9TVFJFQU1fTk9QKTsKKwlkYXBtX3Bvd2VyX3dpZGdldHMoZGFwbSwgU05EX1NPQ19EQVBNX1NUUkVBTV9OT1ApOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX25ld193aWRnZXRzKTsKQEAgLTE1NjksMTMgKzE3MzksMTIgQEAKIAkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIGludCByZWcgPSBtYy0+cmVnOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IG1jLT5zaGlmdDsKLQl1bnNpZ25lZCBpbnQgcnNoaWZ0ID0gbWMtPnJzaGlmdDsKIAlpbnQgbWF4ID0gbWMtPm1heDsKIAl1bnNpZ25lZCBpbnQgbWFzayA9ICgxIDw8IGZscyhtYXgpKSAtIDE7CiAJdW5zaWduZWQgaW50IGludmVydCA9IG1jLT5pbnZlcnQ7Ci0JdW5zaWduZWQgaW50IHZhbCwgdmFsMiwgdmFsX21hc2s7Ci0JaW50IGNvbm5lY3Q7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsLCB2YWxfbWFzazsKKwlpbnQgY29ubmVjdCwgY2hhbmdlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlIHVwZGF0ZTsKIAogCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2spOwogCkBAIC0xNTgzLDE4ICsxNzUyLDEyIEBACiAJCXZhbCA9IG1heCAtIHZhbDsKIAl2YWxfbWFzayA9IG1hc2sgPDwgc2hpZnQ7CiAJdmFsID0gdmFsIDw8IHNoaWZ0OwotCWlmIChzaGlmdCAhPSByc2hpZnQpIHsKLQkJdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOwotCQlpZiAoaW52ZXJ0KQotCQkJdmFsMiA9IG1heCAtIHZhbDI7Ci0JCXZhbF9tYXNrIHw9IG1hc2sgPDwgcnNoaWZ0OwotCQl2YWwgfD0gdmFsMiA8PCByc2hpZnQ7Ci0JfQogCiAJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOwogCXdpZGdldC0+dmFsdWUgPSB2YWw7CiAKLQlpZiAoc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgcmVnLCB2YWxfbWFzaywgdmFsKSkgeworCWNoYW5nZSA9IHNuZF9zb2NfdGVzdF9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7CisJaWYgKGNoYW5nZSkgewogCQlpZiAodmFsKQogCQkJLyogbmV3IGNvbm5lY3Rpb24gKi8KIAkJCWNvbm5lY3QgPSBpbnZlcnQgPyAwOjE7CkBAIC0xNjAyLDI4ICsxNzY1LDIwIEBACiAJCQkvKiBvbGQgY29ubmVjdGlvbiBtdXN0IGJlIHBvd2VyZWQgZG93biAqLwogCQkJY29ubmVjdCA9IGludmVydCA/IDE6MDsKIAorCQl1cGRhdGUua2NvbnRyb2wgPSBrY29udHJvbDsKKwkJdXBkYXRlLndpZGdldCA9IHdpZGdldDsKKwkJdXBkYXRlLnJlZyA9IHJlZzsKKwkJdXBkYXRlLm1hc2sgPSBtYXNrOworCQl1cGRhdGUudmFsID0gdmFsOworCQl3aWRnZXQtPmRhcG0tPnVwZGF0ZSA9ICZ1cGRhdGU7CisKIAkJZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LCBrY29udHJvbCwgY29ubmVjdCk7CisKKwkJd2lkZ2V0LT5kYXBtLT51cGRhdGUgPSBOVUxMOwogCX0KIAotCWlmICh3aWRnZXQtPmV2ZW50KSB7Ci0JCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKLQkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LCBrY29udHJvbCwKLQkJCQkJCVNORF9TT0NfREFQTV9QUkVfUkVHKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcmV0ID0gMTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIHJlZywgdmFsX21hc2ssIHZhbCk7Ci0JCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BPU1RfUkVHKQotCQkJcmV0ID0gd2lkZ2V0LT5ldmVudCh3aWRnZXQsIGtjb250cm9sLAotCQkJCQkJU05EX1NPQ19EQVBNX1BPU1RfUkVHKTsKLQl9IGVsc2UKLQkJcmV0ID0gc25kX3NvY191cGRhdGVfYml0cyh3aWRnZXQtPmNvZGVjLCByZWcsIHZhbF9tYXNrLCB2YWwpOwotCi1vdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfdm9sc3cpOwogCkBAIC0xNjcxLDcgKzE4MjYsNyBAQAogCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAl1bnNpZ25lZCBpbnQgdmFsLCBtdXgsIGNoYW5nZTsKIAl1bnNpZ25lZCBpbnQgbWFzaywgYml0bWFzazsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSB1cGRhdGU7CiAKIAlmb3IgKGJpdG1hc2sgPSAxOyBiaXRtYXNrIDwgZS0+bWF4OyBiaXRtYXNrIDw8PSAxKQogCQk7CkBAIC0xNjkwLDI0ICsxODQ1LDIwIEBACiAJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOwogCXdpZGdldC0+dmFsdWUgPSB2YWw7CiAJY2hhbmdlID0gc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCisJdXBkYXRlLmtjb250cm9sID0ga2NvbnRyb2w7CisJdXBkYXRlLndpZGdldCA9IHdpZGdldDsKKwl1cGRhdGUucmVnID0gZS0+cmVnOworCXVwZGF0ZS5tYXNrID0gbWFzazsKKwl1cGRhdGUudmFsID0gdmFsOworCXdpZGdldC0+ZGFwbS0+dXBkYXRlID0gJnVwZGF0ZTsKKwogCWRhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQsIGtjb250cm9sLCBjaGFuZ2UsIG11eCwgZSk7CiAKLQlpZiAod2lkZ2V0LT5ldmVudF9mbGFncyAmIFNORF9TT0NfREFQTV9QUkVfUkVHKSB7Ci0JCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LAotCQkJCSAgICBrY29udHJvbCwgU05EX1NPQ19EQVBNX1BSRV9SRUcpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCX0KKwl3aWRnZXQtPmRhcG0tPnVwZGF0ZSA9IE5VTEw7CiAKLQlyZXQgPSBzbmRfc29jX3VwZGF0ZV9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKTsKLQotCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BPU1RfUkVHKQotCQlyZXQgPSB3aWRnZXQtPmV2ZW50KHdpZGdldCwKLQkJCQkgICAga2NvbnRyb2wsIFNORF9TT0NfREFQTV9QT1NUX1JFRyk7Ci0KLW91dDoKIAltdXRleF91bmxvY2soJndpZGdldC0+Y29kZWMtPm11dGV4KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBjaGFuZ2U7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKTsKIApAQCAtMTgxOSw3ICsxOTcwLDcgQEAKIAlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJdW5zaWduZWQgaW50IHZhbCwgbXV4LCBjaGFuZ2U7CiAJdW5zaWduZWQgaW50IG1hc2s7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgdXBkYXRlOwogCiAJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4MzYsMjQgKzE5ODcsMjAgQEAKIAltdXRleF9sb2NrKCZ3aWRnZXQtPmNvZGVjLT5tdXRleCk7CiAJd2lkZ2V0LT52YWx1ZSA9IHZhbDsKIAljaGFuZ2UgPSBzbmRfc29jX3Rlc3RfYml0cyh3aWRnZXQtPmNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCk7CisKKwl1cGRhdGUua2NvbnRyb2wgPSBrY29udHJvbDsKKwl1cGRhdGUud2lkZ2V0ID0gd2lkZ2V0OworCXVwZGF0ZS5yZWcgPSBlLT5yZWc7CisJdXBkYXRlLm1hc2sgPSBtYXNrOworCXVwZGF0ZS52YWwgPSB2YWw7CisJd2lkZ2V0LT5kYXBtLT51cGRhdGUgPSAmdXBkYXRlOworCiAJZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsIGNoYW5nZSwgbXV4LCBlKTsKIAotCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKLQkJcmV0ID0gd2lkZ2V0LT5ldmVudCh3aWRnZXQsCi0JCQkJICAgIGtjb250cm9sLCBTTkRfU09DX0RBUE1fUFJFX1JFRyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQorCXdpZGdldC0+ZGFwbS0+dXBkYXRlID0gTlVMTDsKIAotCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOwotCi0JaWYgKHdpZGdldC0+ZXZlbnRfZmxhZ3MgJiBTTkRfU09DX0RBUE1fUE9TVF9SRUcpCi0JCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LAotCQkJCSAgICBrY29udHJvbCwgU05EX1NPQ19EQVBNX1BPU1RfUkVHKTsKLQotb3V0OgogCW11dGV4X3VubG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGNoYW5nZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUpOwogCkBAIC0xODkyLDcgKzIwMzksNyBAQAogCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKIAl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCXNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyhjb2RlYywgcGluKTsKKwkJc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKCZjb2RlYy0+ZGFwbSwgcGluKTsKIAogCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKIApAQCAtMTkxNSwxMSArMjA2MiwxMSBAQAogCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKIAlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCi0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGNvZGVjLCBwaW4pOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sIHBpbik7CiAJZWxzZQotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsIHBpbik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sIHBpbik7CiAKLQlzbmRfc29jX2RhcG1fc3luYyhjb2RlYyk7CisJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKIAogCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKIApAQCAtMTkyOSwyNiArMjA3Niw0MyBAQAogCiAvKioKICAqIHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbCAtIGNyZWF0ZSBuZXcgZGFwbSBjb250cm9sCi0gKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKiBAd2lkZ2V0OiB3aWRnZXQgdGVtcGxhdGUKICAqCiAgKiBDcmVhdGVzIGEgbmV3IGRhcG0gY29udHJvbCBiYXNlZCB1cG9uIHRoZSB0ZW1wbGF0ZS4KICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MgZWxzZSBlcnJvci4KICAqLwotaW50IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCitpbnQgc25kX3NvY19kYXBtX25ld19jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0KQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCXNpemVfdCBuYW1lX2xlbjsKIAogCWlmICgodyA9IGRhcG1fY25ld193aWRnZXQod2lkZ2V0KSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl3LT5jb2RlYyA9IGNvZGVjOworCW5hbWVfbGVuID0gc3RybGVuKHdpZGdldC0+bmFtZSkgKyAxOworCWlmIChkYXBtLT5jb2RlYy0+bmFtZV9wcmVmaXgpCisJCW5hbWVfbGVuICs9IDEgKyBzdHJsZW4oZGFwbS0+Y29kZWMtPm5hbWVfcHJlZml4KTsKKwl3LT5uYW1lID0ga21hbGxvYyhuYW1lX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKHctPm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZSh3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChkYXBtLT5jb2RlYy0+bmFtZV9wcmVmaXgpCisJCXNucHJpbnRmKHctPm5hbWUsIG5hbWVfbGVuLCAiJXMgJXMiLAorCQkJZGFwbS0+Y29kZWMtPm5hbWVfcHJlZml4LCB3aWRnZXQtPm5hbWUpOworCWVsc2UKKwkJc25wcmludGYody0+bmFtZSwgbmFtZV9sZW4sICIlcyIsIHdpZGdldC0+bmFtZSk7CisKKwlkYXBtLT5uX3dpZGdldHMrKzsKKwl3LT5kYXBtID0gZGFwbTsKKwl3LT5jb2RlYyA9IGRhcG0tPmNvZGVjOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5zb3VyY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmdy0+c2lua3MpOwogCUlOSVRfTElTVF9IRUFEKCZ3LT5saXN0KTsKLQlsaXN0X2FkZCgmdy0+bGlzdCwgJmNvZGVjLT5kYXBtX3dpZGdldHMpOworCWxpc3RfYWRkKCZ3LT5saXN0LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cyk7CiAKIAkvKiBtYWNoaW5lIGxheWVyIHNldCB1cHMgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLwogCXctPmNvbm5lY3RlZCA9IDE7CkBAIC0xOTU4LDcgKzIxMjIsNyBAQAogCiAvKioKICAqIHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMgLSBjcmVhdGUgbmV3IGRhcG0gY29udHJvbHMKLSAqIEBjb2RlYzogYXVkaW8gY29kZWMKKyAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqIEB3aWRnZXQ6IHdpZGdldCBhcnJheQogICogQG51bTogbnVtYmVyIG9mIHdpZGdldHMKICAqCkBAIC0xOTY2LDE4ICsyMTMwLDE4IEBACiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuCiAgKi8KLWludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKK2ludCBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0LAogCWludCBudW0pCiB7CiAJaW50IGksIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2woY29kZWMsIHdpZGdldCk7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChkYXBtLCB3aWRnZXQpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgREFQTSBjb250cm9sICVzOiAlZFxuIiwKLQkJCSAgICAgICB3aWRnZXQtPm5hbWUsIHJldCk7CisJCQlkZXZfZXJyKGRhcG0tPmRldiwKKwkJCQkiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSBEQVBNIGNvbnRyb2wgJXM6ICVkXG4iLAorCQkJCXdpZGdldC0+bmFtZSwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJd2lkZ2V0Kys7CkBAIC0xOTg2LDM0ICsyMTUwLDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKTsKIAotCi0vKioKLSAqIHNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQgLSBzZW5kIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUKLSAqIEBjb2RlYzogYXVkaW8gY29kZWMKLSAqIEBzdHJlYW06IHN0cmVhbSBuYW1lCi0gKiBAZXZlbnQ6IHN0cmVhbSBldmVudAotICoKLSAqIFNlbmRzIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUuIFRoZSBjb3JlIHRoZW4gbWFrZXMgYW55Ci0gKiBuZWNlc3Nhcnkgd2lkZ2V0IHBvd2VyIGNoYW5nZXMuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuCi0gKi8KLWludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCitzdGF0aWMgdm9pZCBzb2NfZGFwbV9zdHJlYW1fZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAogCWNvbnN0IGNoYXIgKnN0cmVhbSwgaW50IGV2ZW50KQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAKLQlpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPm11dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRhcG0tPmNhcmQtPndpZGdldHMsIGxpc3QpCiAJewotCQlpZiAoIXctPnNuYW1lKQorCQlpZiAoIXctPnNuYW1lIHx8IHctPmRhcG0gIT0gZGFwbSkKIAkJCWNvbnRpbnVlOwotCQlwcl9kZWJ1Zygid2lkZ2V0ICVzXG4gJXMgc3RyZWFtICVzIGV2ZW50ICVkXG4iLAotCQkJIHctPm5hbWUsIHctPnNuYW1lLCBzdHJlYW0sIGV2ZW50KTsKKwkJZGV2X2RiZyh3LT5kYXBtLT5kZXYsICJ3aWRnZXQgJXNcbiAlcyBzdHJlYW0gJXMgZXZlbnQgJWRcbiIsCisJCQl3LT5uYW1lLCB3LT5zbmFtZSwgc3RyZWFtLCBldmVudCk7CiAJCWlmIChzdHJzdHIody0+c25hbWUsIHN0cmVhbSkpIHsKIAkJCXN3aXRjaChldmVudCkgewogCQkJY2FzZSBTTkRfU09DX0RBUE1fU1RSRUFNX1NUQVJUOgpAQCAtMjAzMSw3ICsyMTc4LDMwIEBACiAJCX0KIAl9CiAKLQlkYXBtX3Bvd2VyX3dpZGdldHMoY29kZWMsIGV2ZW50KTsKKwlkYXBtX3Bvd2VyX3dpZGdldHMoZGFwbSwgZXZlbnQpOworfQorCisvKioKKyAqIHNuZF9zb2NfZGFwbV9zdHJlYW1fZXZlbnQgLSBzZW5kIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUKKyAqIEBydGQ6IFBDTSBydW50aW1lIGRhdGEKKyAqIEBzdHJlYW06IHN0cmVhbSBuYW1lCisgKiBAZXZlbnQ6IHN0cmVhbSBldmVudAorICoKKyAqIFNlbmRzIGEgc3RyZWFtIGV2ZW50IHRvIHRoZSBkYXBtIGNvcmUuIFRoZSBjb3JlIHRoZW4gbWFrZXMgYW55CisgKiBuZWNlc3Nhcnkgd2lkZ2V0IHBvd2VyIGNoYW5nZXMuCisgKgorICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGVsc2UgZXJyb3IuCisgKi8KK2ludCBzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJY29uc3QgY2hhciAqc3RyZWFtLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bXV0ZXgpOworCXNvY19kYXBtX3N0cmVhbV9ldmVudCgmY29kZWMtPmRhcG0sIHN0cmVhbSwgZXZlbnQpOwogCW11dGV4X3VubG9jaygmY29kZWMtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMzksNyArMjIwOSw3IEBACiAKIC8qKgogICogc25kX3NvY19kYXBtX2VuYWJsZV9waW4gLSBlbmFibGUgcGluLgotICogQGNvZGVjOiBTb0MgY29kZWMKKyAqIEBkYXBtOiBEQVBNIGNvbnRleHQKICAqIEBwaW46IHBpbiBuYW1lCiAgKgogICogRW5hYmxlcyBpbnB1dC9vdXRwdXQgcGluIGFuZCBpdHMgcGFyZW50cyBvciBjaGlsZHJlbiB3aWRnZXRzIGlmZiB0aGVyZSBpcwpAQCAtMjA0NywxNSArMjIxNywxNSBAQAogICogTk9URTogc25kX3NvY19kYXBtX3N5bmMoKSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmb3IgREFQTSB0bwogICogZG8gYW55IHdpZGdldCBwb3dlciBzd2l0Y2hpbmcuCiAgKi8KLWludCBzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBpbikKK2ludCBzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sIGNvbnN0IGNoYXIgKnBpbikKIHsKLQlyZXR1cm4gc25kX3NvY19kYXBtX3NldF9waW4oY29kZWMsIHBpbiwgMSk7CisJcmV0dXJuIHNuZF9zb2NfZGFwbV9zZXRfcGluKGRhcG0sIHBpbiwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbik7CiAKIC8qKgogICogc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4gLSBmb3JjZSBhIHBpbiB0byBiZSBlbmFibGVkCi0gKiBAY29kZWM6IFNvQyBjb2RlYworICogQGRhcG06IERBUE0gY29udGV4dAogICogQHBpbjogcGluIG5hbWUKICAqCiAgKiBFbmFibGVzIGlucHV0L291dHB1dCBwaW4gcmVnYXJkbGVzcyBvZiBhbnkgb3RoZXIgc3RhdGUuICBUaGlzIGlzCkBAIC0yMDY1LDQyICsyMjM1LDQ3IEBACiAgKiBOT1RFOiBzbmRfc29jX2RhcG1fc3luYygpIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGlzIGZvciBEQVBNIHRvCiAgKiBkbyBhbnkgd2lkZ2V0IHBvd2VyIHN3aXRjaGluZy4KICAqLwotaW50IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqcGluKQoraW50IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCQkgIGNvbnN0IGNoYXIgKnBpbikKIHsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmNvZGVjLT5kYXBtX3dpZGdldHMsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZkYXBtLT5jYXJkLT53aWRnZXRzLCBsaXN0KSB7CisJCWlmICh3LT5kYXBtICE9IGRhcG0pCisJCQljb250aW51ZTsKIAkJaWYgKCFzdHJjbXAody0+bmFtZSwgcGluKSkgewotCQkJcHJfZGVidWcoImRhcG06ICVzOiBwaW4gJXNcbiIsIGNvZGVjLT5uYW1lLCBwaW4pOworCQkJZGV2X2RiZyh3LT5kYXBtLT5kZXYsCisJCQkJImRhcG06IGZvcmNlIGVuYWJsZSBwaW4gJXNcbiIsIHBpbik7CiAJCQl3LT5jb25uZWN0ZWQgPSAxOwogCQkJdy0+Zm9yY2UgPSAxOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQlwcl9lcnIoImRhcG06ICVzOiBjb25maWd1cmluZyB1bmtub3duIHBpbiAlc1xuIiwgY29kZWMtPm5hbWUsIHBpbik7CisJZGV2X2VycihkYXBtLT5kZXYsICJkYXBtOiB1bmtub3duIHBpbiAlc1xuIiwgcGluKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKTsKIAogLyoqCiAgKiBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4gLSBkaXNhYmxlIHBpbi4KLSAqIEBjb2RlYzogU29DIGNvZGVjCisgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKiBAcGluOiBwaW4gbmFtZQogICoKICAqIERpc2FibGVzIGlucHV0L291dHB1dCBwaW4gYW5kIGl0cyBwYXJlbnRzIG9yIGNoaWxkcmVuIHdpZGdldHMuCiAgKiBOT1RFOiBzbmRfc29jX2RhcG1fc3luYygpIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGlzIGZvciBEQVBNIHRvCiAgKiBkbyBhbnkgd2lkZ2V0IHBvd2VyIHN3aXRjaGluZy4KICAqLwotaW50IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBpbikKK2ludCBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLAorCQkJICAgICBjb25zdCBjaGFyICpwaW4pCiB7Ci0JcmV0dXJuIHNuZF9zb2NfZGFwbV9zZXRfcGluKGNvZGVjLCBwaW4sIDApOworCXJldHVybiBzbmRfc29jX2RhcG1fc2V0X3BpbihkYXBtLCBwaW4sIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKTsKIAogLyoqCiAgKiBzbmRfc29jX2RhcG1fbmNfcGluIC0gcGVybWFuZW50bHkgZGlzYWJsZSBwaW4uCi0gKiBAY29kZWM6IFNvQyBjb2RlYworICogQGRhcG06IERBUE0gY29udGV4dAogICogQHBpbjogcGluIG5hbWUKICAqCiAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIHBpbiBhcyBiZWluZyBub3QgY29ubmVjdGVkLCBkaXNhYmxpbmcgaXQgYWxvbmcKQEAgLTIxMTIsMjYgKzIyODcsMjkgQEAKICAqIE5PVEU6IHNuZF9zb2NfZGFwbV9zeW5jKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIHRoaXMgZm9yIERBUE0gdG8KICAqIGRvIGFueSB3aWRnZXQgcG93ZXIgc3dpdGNoaW5nLgogICovCi1pbnQgc25kX3NvY19kYXBtX25jX3BpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKnBpbikKK2ludCBzbmRfc29jX2RhcG1fbmNfcGluKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwgY29uc3QgY2hhciAqcGluKQogewotCXJldHVybiBzbmRfc29jX2RhcG1fc2V0X3Bpbihjb2RlYywgcGluLCAwKTsKKwlyZXR1cm4gc25kX3NvY19kYXBtX3NldF9waW4oZGFwbSwgcGluLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9uY19waW4pOwogCiAvKioKICAqIHNuZF9zb2NfZGFwbV9nZXRfcGluX3N0YXR1cyAtIGdldCBhdWRpbyBwaW4gc3RhdHVzCi0gKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKiBAcGluOiBhdWRpbyBzaWduYWwgcGluIGVuZHBvaW50IChvciBzdGFydCBwb2ludCkKICAqCiAgKiBHZXQgYXVkaW8gcGluIHN0YXR1cyAtIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQuCiAgKgogICogUmV0dXJucyAxIGZvciBjb25uZWN0ZWQgb3RoZXJ3aXNlIDAuCiAgKi8KLWludCBzbmRfc29jX2RhcG1fZ2V0X3Bpbl9zdGF0dXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpwaW4pCitpbnQgc25kX3NvY19kYXBtX2dldF9waW5fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSwKKwkJCQljb25zdCBjaGFyICpwaW4pCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cywgbGlzdCkgeworCQlpZiAody0+ZGFwbSAhPSBkYXBtKQorCQkJY29udGludWU7CiAJCWlmICghc3RyY21wKHctPm5hbWUsIHBpbikpCiAJCQlyZXR1cm4gdy0+Y29ubmVjdGVkOwogCX0KQEAgLTIxNDIsNyArMjMyMCw3IEBACiAKIC8qKgogICogc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kIC0gaWdub3JlIHN1c3BlbmQgc3RhdHVzIGZvciBEQVBNIGVuZHBvaW50Ci0gKiBAY29kZWM6IGF1ZGlvIGNvZGVjCisgKiBAZGFwbTogREFQTSBjb250ZXh0CiAgKiBAcGluOiBhdWRpbyBzaWduYWwgcGluIGVuZHBvaW50IChvciBzdGFydCBwb2ludCkKICAqCiAgKiBNYXJrIHRoZSBnaXZlbiBlbmRwb2ludCBvciBwaW4gYXMgaWdub3Jpbmcgc3VzcGVuZC4gIFdoZW4gdGhlCkBAIC0yMTUxLDE4ICsyMzI5LDIxIEBACiAgKiBub3JtYWwgbWVhbnMgYXQgc3VzcGVuZCB0aW1lLCBpdCB3aWxsIG5vdCBiZSB0dXJuZWQgb24gaWYgaXQgd2FzIG5vdAogICogYWxyZWFkeSBlbmFibGVkLgogICovCi1pbnQgc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqcGluKQoraW50IHNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0sCisJCQkJY29uc3QgY2hhciAqcGluKQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmY29kZWMtPmRhcG1fd2lkZ2V0cywgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJmRhcG0tPmNhcmQtPndpZGdldHMsIGxpc3QpIHsKKwkJaWYgKHctPmRhcG0gIT0gZGFwbSkKKwkJCWNvbnRpbnVlOwogCQlpZiAoIXN0cmNtcCh3LT5uYW1lLCBwaW4pKSB7CiAJCQl3LT5pZ25vcmVfc3VzcGVuZCA9IDE7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXByX2VycigiVW5rbm93biBEQVBNIHBpbjogJXNcbiIsIHBpbik7CisJZGV2X2VycihkYXBtLT5kZXYsICJkYXBtOiB1bmtub3duIHBpbiAlc1xuIiwgcGluKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCk7CkBAIC0yMTczLDIwICsyMzU0LDIzIEBACiAgKgogICogRnJlZSBhbGwgZGFwbSB3aWRnZXRzIGFuZCByZXNvdXJjZXMuCiAgKi8KLXZvaWQgc25kX3NvY19kYXBtX2ZyZWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQordm9pZCBzbmRfc29jX2RhcG1fZnJlZShzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7Ci0Jc25kX3NvY19kYXBtX3N5c19yZW1vdmUoY29kZWMtPmRldik7Ci0JZGFwbV9mcmVlX3dpZGdldHMoY29kZWMpOworCXNuZF9zb2NfZGFwbV9zeXNfcmVtb3ZlKGRhcG0tPmRldik7CisJZGFwbV9mcmVlX3dpZGdldHMoZGFwbSk7CisJbGlzdF9kZWwoJmRhcG0tPmxpc3QpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19kYXBtX2ZyZWUpOwogCi1zdGF0aWMgdm9pZCBzb2NfZGFwbV9zaHV0ZG93bl9jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBzb2NfZGFwbV9zaHV0ZG93bl9jb2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CiAJTElTVF9IRUFEKGRvd25fbGlzdCk7CiAJaW50IHBvd2VyZG93biA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZjb2RlYy0+ZGFwbV93aWRnZXRzLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmZGFwbS0+Y2FyZC0+d2lkZ2V0cywgbGlzdCkgeworCQlpZiAody0+ZGFwbSAhPSBkYXBtKQorCQkJY29udGludWU7CiAJCWlmICh3LT5wb3dlcikgewogCQkJZGFwbV9zZXFfaW5zZXJ0KHcsICZkb3duX2xpc3QsIGRhcG1fZG93bl9zZXEpOwogCQkJdy0+cG93ZXIgPSAwOwpAQCAtMjE5OCw5ICsyMzgyLDkgQEAKIAkgKiBzdGFuZGJ5LgogCSAqLwogCWlmIChwb3dlcmRvd24pIHsKLQkJc25kX3NvY19kYXBtX3NldF9iaWFzX2xldmVsKE5VTEwsIGNvZGVjLCBTTkRfU09DX0JJQVNfUFJFUEFSRSk7Ci0JCWRhcG1fc2VxX3J1bihjb2RlYywgJmRvd25fbGlzdCwgMCwgZGFwbV9kb3duX3NlcSk7Ci0JCXNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChOVUxMLCBjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOworCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoTlVMTCwgZGFwbSwgU05EX1NPQ19CSUFTX1BSRVBBUkUpOworCQlkYXBtX3NlcV9ydW4oZGFwbSwgJmRvd25fbGlzdCwgMCwgZGFwbV9kb3duX3NlcSk7CisJCXNuZF9zb2NfZGFwbV9zZXRfYmlhc19sZXZlbChOVUxMLCBkYXBtLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAJfQogfQogCkBAIC0yMjExLDEwICsyMzk1LDEwIEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNhcmQtPmNvZGVjX2Rldl9saXN0LCBsaXN0KQotCQlzb2NfZGFwbV9zaHV0ZG93bl9jb2RlYyhjb2RlYyk7Ci0KLQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoY2FyZCwgY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgbGlzdCkgeworCQlzb2NfZGFwbV9zaHV0ZG93bl9jb2RlYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX2RhcG1fc2V0X2JpYXNfbGV2ZWwoY2FyZCwgJmNvZGVjLT5kYXBtLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwl9CiB9CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1qYWNrLmMgYi9zb3VuZC9zb2Mvc29jLWphY2suYwppbmRleCA4YTBhOTIwLi5hYzVhNWJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWphY2suYworKysgYi9zb3VuZC9zb2Mvc29jLWphY2suYwpAQCAtMTMsMTEgKzEzLDExIEBACiAKICNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYXNvYy5oPgogCiAvKioKICAqIHNuZF9zb2NfamFja19uZXcgLSBDcmVhdGUgYSBuZXcgamFjawpAQCAtNjAsMTQgKzYwLDE4IEBACiB2b2lkIHNuZF9zb2NfamFja19yZXBvcnQoc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywgaW50IHN0YXR1cywgaW50IG1hc2spCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKIAlzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiAqcGluOwogCWludCBlbmFibGU7CiAJaW50IG9sZHN0YXR1czsKIAorCXRyYWNlX3NuZF9zb2NfamFja19yZXBvcnQoamFjaywgbWFzaywgc3RhdHVzKTsKKwogCWlmICghamFjaykKIAkJcmV0dXJuOwogCiAJY29kZWMgPSBqYWNrLT5jb2RlYzsKKwlkYXBtID0gICZjb2RlYy0+ZGFwbTsKIAogCW11dGV4X2xvY2soJmNvZGVjLT5tdXRleCk7CiAKQEAgLTgxLDYgKzg1LDggQEAKIAlpZiAobWFzayAmJiAoamFjay0+c3RhdHVzID09IG9sZHN0YXR1cykpCiAJCWdvdG8gb3V0OwogCisJdHJhY2Vfc25kX3NvY19qYWNrX25vdGlmeShqYWNrLCBzdGF0dXMpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwaW4sICZqYWNrLT5waW5zLCBsaXN0KSB7CiAJCWVuYWJsZSA9IHBpbi0+bWFzayAmIGphY2stPnN0YXR1czsKIApAQCAtODgsMTUgKzk0LDE1IEBACiAJCQllbmFibGUgPSAhZW5hYmxlOwogCiAJCWlmIChlbmFibGUpCi0JCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbihjb2RlYywgcGluLT5waW4pOworCQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgcGluLT5waW4pOwogCQllbHNlCi0JCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oY29kZWMsIHBpbi0+cGluKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCBwaW4tPnBpbik7CiAJfQogCiAJLyogUmVwb3J0IGJlZm9yZSB0aGUgREFQTSBzeW5jIHRvIGhlbHAgdXNlcnMgdXBkYXRpbmcgbWljYmlhcyBzdGF0dXMgKi8KIAlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZqYWNrLT5ub3RpZmllciwgc3RhdHVzLCBOVUxMKTsKIAotCXNuZF9zb2NfZGFwbV9zeW5jKGNvZGVjKTsKKwlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKIAogCXNuZF9qYWNrX3JlcG9ydChqYWNrLT5qYWNrLCBzdGF0dXMpOwogCkBAIC0yMDcsNiArMjEzLDEyIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgZ3Bpb19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHNuZF9zb2NfamFja19ncGlvICpncGlvID0gZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBncGlvLT5qYWNrLT5jb2RlYy0+Y2FyZC0+ZGV2OworCisJdHJhY2Vfc25kX3NvY19qYWNrX2lycShncGlvLT5uYW1lKTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlwbV93YWtldXBfZXZlbnQoZGV2LCBncGlvLT5kZWJvdW5jZV90aW1lICsgNTApOwogCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZncGlvLT53b3JrLAogCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhncGlvLT5kZWJvdW5jZV90aW1lKSk7CkBAIC0yNjMsMTEgKzI3NSwxMiBAQAogCQlJTklUX0RFTEFZRURfV09SSygmZ3Bpb3NbaV0ud29yaywgZ3Bpb193b3JrKTsKIAkJZ3Bpb3NbaV0uamFjayA9IGphY2s7CiAKLQkJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoZ3Bpb3NbaV0uZ3BpbyksCi0JCQkJZ3Bpb19oYW5kbGVyLAotCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQlqYWNrLT5jb2RlYy0+ZGV2LT5kcml2ZXItPm5hbWUsCi0JCQkJJmdwaW9zW2ldKTsKKwkJcmV0ID0gcmVxdWVzdF9hbnlfY29udGV4dF9pcnEoZ3Bpb190b19pcnEoZ3Bpb3NbaV0uZ3BpbyksCisJCQkJCSAgICAgIGdwaW9faGFuZGxlciwKKwkJCQkJICAgICAgSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJCSAgICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCQkgICAgICBqYWNrLT5jb2RlYy0+ZGV2LT5kcml2ZXItPm5hbWUsCisJCQkJCSAgICAgICZncGlvc1tpXSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2Zvcm1hdC5jIGIvc291bmQvdXNiL2Zvcm1hdC5jCmluZGV4IDY5MTQ4MjEuLjViNzkyZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9mb3JtYXQuYworKysgYi9zb3VuZC91c2IvZm9ybWF0LmMKQEAgLTc2LDcgKzc2LDEwIEBACiAJCWZvcm1hdCA9IDEgPDwgVUFDX0ZPUk1BVF9UWVBFX0lfUENNOwogCX0KIAlpZiAoZm9ybWF0ICYgKDEgPDwgVUFDX0ZPUk1BVF9UWVBFX0lfUENNKSkgewotCQlpZiAoc2FtcGxlX3dpZHRoID4gc2FtcGxlX2J5dGVzICogOCkgeworCQlpZiAoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA1ODIsIDB4MDAxNikgLyogRWRpcm9sIFNELTkwICovICYmCisJCSAgICBzYW1wbGVfd2lkdGggPT0gMjQgJiYgc2FtcGxlX2J5dGVzID09IDIpCisJCQlzYW1wbGVfYnl0ZXMgPSAzOworCQllbHNlIGlmIChzYW1wbGVfd2lkdGggPiBzYW1wbGVfYnl0ZXMgKiA4KSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiJWQ6JXU6JWQgOiBzYW1wbGUgYml0d2lkdGggJWQgaW4gb3ZlciBzYW1wbGUgYnl0ZXMgJWRcbiIsCiAJCQkJICAgY2hpcC0+ZGV2LT5kZXZudW0sIGZwLT5pZmFjZSwgZnAtPmFsdHNldHRpbmcsCiAJCQkJICAgc2FtcGxlX3dpZHRoLCBzYW1wbGVfYnl0ZXMpOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21pZGkuYyBiL3NvdW5kL3VzYi9taWRpLmMKaW5kZXggMjViY2U3ZS4uZGIyZGM1ZiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21pZGkuYworKysgYi9zb3VuZC91c2IvbWlkaS5jCkBAIC04NTAsOCArODUwLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciArIGNvdW50LCAweEZELCA5IC0gY291bnQpOwotCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGNvdW50OworCW1lbXNldCh1cmItPnRyYW5zZmVyX2J1ZmZlciArIGNvdW50LCAweEZELCBlcC0+bWF4X3RyYW5zZmVyIC0gY291bnQpOworCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGVwLT5tYXhfdHJhbnNmZXI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3Byb3RvY29sX29wcyBzbmRfdXNibWlkaV8xMjJsX29wcyA9IHsKQEAgLTEyOTUsNiArMTI5NSwxMyBAQAogCWNhc2UgVVNCX0lEKDB4MWE4NiwgMHg3NTJkKTogLyogUWluSGVuZyBDSDM0NSAiVVNCMi4wLU1JREkiICovCiAJCWVwLT5tYXhfdHJhbnNmZXIgPSA0OwogCQlicmVhazsKKwkJLyoKKwkJICogU29tZSBkZXZpY2VzIG9ubHkgd29yayB3aXRoIDkgYnl0ZXMgcGFja2V0IHNpemU6CisJCSAqLworCWNhc2UgVVNCX0lEKDB4MDY0NCwgMHg4MDBFKTogLyogVGFzY2FtIFVTLTEyMkwgKi8KKwljYXNlIFVTQl9JRCgweDA2NDQsIDB4ODAwRik6IC8qIFRhc2NhbSBVUy0xNDQgKi8KKwkJZXAtPm1heF90cmFuc2ZlciA9IDk7CisJCWJyZWFrOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgT1VUUFVUX1VSQlM7ICsraSkgewogCQlidWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQodW1pZGktPmRldiwKQEAgLTE3MjksMTMgKzE3MzYsNyBAQAogewogCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBuYW1lc1tdID0geyAiSGlnaCBMb2FkIiwgIkxpZ2h0IExvYWQiIH07CiAKLQlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCWluZm8tPmNvdW50ID0gMTsKLQlpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKLQlpZiAoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMSkKLQkJaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKLQlzdHJjcHkoaW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCBuYW1lc1tpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8oaW5mbywgMSwgMiwgbmFtZXMpOwogfQogCiBzdGF0aWMgaW50IHJvbGFuZF9sb2FkX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlci5jIGIvc291bmQvdXNiL21peGVyLmMKaW5kZXggZjJkNzRkNi4uN2RmODliMyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyLmMKKysrIGIvc291bmQvdXNiL21peGVyLmMKQEAgLTE2MzMsMTggKzE2MzMsMTEgQEAKIHN0YXRpYyBpbnQgbWl4ZXJfY3RsX3NlbGVjdG9yX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmN2YWwgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKippdGVtbGlzdCA9IChjaGFyICoqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWNvbnN0IGNoYXIgKippdGVtbGlzdCA9IChjb25zdCBjaGFyICoqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCiAJaWYgKHNuZF9CVUdfT04oIWl0ZW1saXN0KSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGN2YWwtPm1heDsKLQlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSBjdmFsLT5tYXgpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBjdmFsLT5tYXggLSAxOwotCXN0cmxjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgaXRlbWxpc3RbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0sCi0JCXNpemVvZih1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lKSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9jdGxfZW51bV9pbmZvKHVpbmZvLCAxLCBjdmFsLT5tYXgsIGl0ZW1saXN0KTsKIH0KIAogLyogZ2V0IGNhbGxiYWNrIGZvciBzZWxlY3RvciB1bml0ICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmggYi9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmgKaW5kZXggYWQ3MDc5ZC4uMzU5OTk4NyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oCisrKyBiL3NvdW5kL3VzYi9xdWlya3MtdGFibGUuaApAQCAtNzA1LDExICs3MDUsMTEgQEAKIAkJLmRhdGEgPSAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmtbXSkgewogCQkJewogCQkJCS5pZm51bSA9IDAsCi0JCQkJLnR5cGUgPSBRVUlSS19JR05PUkVfSU5URVJGQUNFCisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19TVEFOREFSRF9JTlRFUkZBQ0UKIAkJCX0sCiAJCQl7CiAJCQkJLmlmbnVtID0gMSwKLQkJCQkudHlwZSA9IFFVSVJLX0lHTk9SRV9JTlRFUkZBQ0UKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX1NUQU5EQVJEX0lOVEVSRkFDRQogCQkJfSwKIAkJCXsKIAkJCQkuaWZudW0gPSAyLApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jIGIvc291bmQvdXNiL3VzeDJ5L3VzMTIybC5jCmluZGV4IDZlZjY4ZTQuLjA4NGU2ZmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c3gyeS91czEyMmwuYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXMxMjJsLmMKQEAgLTI3MywyOSArMjczLDI2IEBACiAJCQkJCSAgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IHVzMTIybAkqdXMxMjJsID0gaHctPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdXNiX3N0cmVhbSAqcyA9IHVzMTIybC0+c2suczsKIAl1bnNpZ25lZAkqcG9sbGVkOwogCXVuc2lnbmVkIGludAltYXNrOwogCiAJcG9sbF93YWl0KGZpbGUsICZ1czEyMmwtPnNrLnNsZWVwLCB3YWl0KTsKIAotCXN3aXRjaCAocy0+c3RhdGUpIHsKLQljYXNlIHVzYl9zdHJlYW1fcmVhZHk6Ci0JCWlmICh1czEyMmwtPmZpcnN0ID09IGZpbGUpCi0JCQlwb2xsZWQgPSAmcy0+cGVyaW9kc19wb2xsZWQ7Ci0JCWVsc2UKLQkJCXBvbGxlZCA9ICZ1czEyMmwtPnNlY29uZF9wZXJpb2RzX3BvbGxlZDsKLQkJaWYgKCpwb2xsZWQgIT0gcy0+cGVyaW9kc19kb25lKSB7Ci0JCQkqcG9sbGVkID0gcy0+cGVyaW9kc19kb25lOwotCQkJbWFzayA9IFBPTExJTiB8IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQkJYnJlYWs7CisJbWFzayA9IFBPTExJTiB8IFBPTExPVVQgfCBQT0xMV1JOT1JNIHwgUE9MTEVSUjsKKwlpZiAobXV0ZXhfdHJ5bG9jaygmdXMxMjJsLT5tdXRleCkpIHsKKwkJc3RydWN0IHVzYl9zdHJlYW0gKnMgPSB1czEyMmwtPnNrLnM7CisJCWlmIChzICYmIHMtPnN0YXRlID09IHVzYl9zdHJlYW1fcmVhZHkpIHsKKwkJCWlmICh1czEyMmwtPmZpcnN0ID09IGZpbGUpCisJCQkJcG9sbGVkID0gJnMtPnBlcmlvZHNfcG9sbGVkOworCQkJZWxzZQorCQkJCXBvbGxlZCA9ICZ1czEyMmwtPnNlY29uZF9wZXJpb2RzX3BvbGxlZDsKKwkJCWlmICgqcG9sbGVkICE9IHMtPnBlcmlvZHNfZG9uZSkgeworCQkJCSpwb2xsZWQgPSBzLT5wZXJpb2RzX2RvbmU7CisJCQkJbWFzayA9IFBPTExJTiB8IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQkJfSBlbHNlCisJCQkJbWFzayA9IDA7CiAJCX0KLQkJLyogRmFsbCB0aHJvdWdoICovCi0JCW1hc2sgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltYXNrID0gUE9MTElOIHwgUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMRVJSOwotCQlicmVhazsKKwkJbXV0ZXhfdW5sb2NrKCZ1czEyMmwtPm11dGV4KTsKIAl9CiAJcmV0dXJuIG1hc2s7CiB9CkBAIC0zODEsNiArMzc4LDcgQEAKIHsKIAlzdHJ1Y3QgdXNiX3N0cmVhbV9jb25maWcgKmNmZzsKIAlzdHJ1Y3QgdXMxMjJsICp1czEyMmwgPSBody0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2Jfc3RyZWFtICpzOwogCXVuc2lnbmVkIG1pbl9wZXJpb2RfZnJhbWVzOwogCWludCBlcnIgPSAwOwogCWJvb2wgaGlnaF9zcGVlZDsKQEAgLTQyNiwxOCArNDI0LDE4IEBACiAJc25kX3Bvd2VyX3dhaXQoaHctPmNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CiAKIAltdXRleF9sb2NrKCZ1czEyMmwtPm11dGV4KTsKKwlzID0gdXMxMjJsLT5zay5zOwogCWlmICghdXMxMjJsLT5tYXN0ZXIpCiAJCXVzMTIybC0+bWFzdGVyID0gZmlsZTsKIAllbHNlIGlmICh1czEyMmwtPm1hc3RlciAhPSBmaWxlKSB7Ci0JCWlmIChtZW1jbXAoY2ZnLCAmdXMxMjJsLT5zay5zLT5jZmcsIHNpemVvZigqY2ZnKSkpIHsKKwkJaWYgKCFzIHx8IG1lbWNtcChjZmcsICZzLT5jZmcsIHNpemVvZigqY2ZnKSkpIHsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIHVubG9jazsKIAkJfQogCQl1czEyMmwtPnNsYXZlID0gZmlsZTsKIAl9Ci0JaWYgKCF1czEyMmwtPnNrLnMgfHwKLQkgICAgbWVtY21wKGNmZywgJnVzMTIybC0+c2sucy0+Y2ZnLCBzaXplb2YoKmNmZykpIHx8Ci0JICAgIHVzMTIybC0+c2sucy0+c3RhdGUgPT0gdXNiX3N0cmVhbV94cnVuKSB7CisJaWYgKCFzIHx8IG1lbWNtcChjZmcsICZzLT5jZmcsIHNpemVvZigqY2ZnKSkgfHwKKwkgICAgcy0+c3RhdGUgPT0gdXNiX3N0cmVhbV94cnVuKSB7CiAJCXVzMTIybF9zdG9wKHVzMTIybCk7CiAJCWlmICghdXMxMjJsX3N0YXJ0KHVzMTIybCwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5wZXJpb2RfZnJhbWVzKSkKIAkJCWVyciA9IC1FSU87CkBAIC00NDgsNiArNDQ2LDcgQEAKIAltdXRleF91bmxvY2soJnVzMTIybC0+bXV0ZXgpOwogZnJlZToKIAlrZnJlZShjZmcpOworCXdha2VfdXBfYWxsKCZ1czEyMmwtPnNrLnNsZWVwKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCAxYjliMTNlLi4yYjUzODdkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTIyNyw3ICsyMjcsNyBAQAogICBDRkxBR1NfT1BUSU1JWkUgPSAtTzYKIGVuZGlmCiAKLUNGTEFHUyA9IC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1zdGQ9Z251OTkgLVdlcnJvciAkKENGTEFHU19PUFRJTUlaRSkgLURfRk9SVElGWV9TT1VSQ0U9MiAkKEVYVFJBX1dBUk5JTkdTKSAkKEVYVFJBX0NGTEFHUykKK0NGTEFHUyA9IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1nZ2RiMyAtV2FsbCAtV2V4dHJhIC1zdGQ9Z251OTkgLVdlcnJvciAkKENGTEFHU19PUFRJTUlaRSkgLURfRk9SVElGWV9TT1VSQ0U9MiAkKEVYVFJBX1dBUk5JTkdTKSAkKEVYVFJBX0NGTEFHUykKIEVYVExJQlMgPSAtbHB0aHJlYWQgLWxydCAtbGVsZiAtbG0KIEFMTF9DRkxBR1MgPSAkKENGTEFHUykgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKIEFMTF9MREZMQUdTID0gJChMREZMQUdTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCmluZGV4IDdiYzA0OTAuLjcwNjliZDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTMzMSw2ICszMzEsOSBAQAogCQkJZWxzZSBpZiAoZXJyID09ICBFTk9ERVYgJiYgY3B1X2xpc3QpIHsKIAkJCQlkaWUoIk5vIHN1Y2ggZGV2aWNlIC0gZGlkIHlvdSBzcGVjaWZ5IgogCQkJCQkiIGFuIG91dC1vZi1yYW5nZSBwcm9maWxlIENQVT9cbiIpOworCQkJfSBlbHNlIGlmIChlcnIgPT0gRU5PRU5UKSB7CisJCQkJZGllKCIlcyBldmVudCBpcyBub3Qgc3VwcG9ydGVkLiAiLAorCQkJCSAgICAgZXZlbnRfbmFtZShldnNlbCkpOwogCQkJfSBlbHNlIGlmIChlcnIgPT0gRUlOVkFMICYmIHNhbXBsZV9pZF9hbGxfYXZhaWwpIHsKIAkJCQkvKgogCQkJCSAqIE9sZCBrZXJuZWwsIG5vIGF0dHItPnNhbXBsZV9pZF90eXBlX2FsbCBmaWVsZApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwppbmRleCA3YTRlYmViLi5hYmQ0Yjg0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwpAQCAtNDg5LDcgKzQ4OSw4IEBACiAKIAllcnIgPSBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CiAJQlVHX09OKGVycik7Ci0JZXJyID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0ciwgKHNpemVfdCkoMTYqMTAyNCkpOworCWVyciA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHIsCisJCQkoc2l6ZV90KSBtYXgoMTYgKiAxMDI0LCBQVEhSRUFEX1NUQUNLX01JTikpOwogCUJVR19PTihlcnIpOwogCWVyciA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmc3RhcnRfd29ya19tdXRleCk7CiAJQlVHX09OKGVycik7CkBAIC0xODYxLDcgKzE4NjIsNyBAQAogCXJlY19hcmdjID0gQVJSQVlfU0laRShyZWNvcmRfYXJncykgKyBhcmdjIC0gMTsKIAlyZWNfYXJndiA9IGNhbGxvYyhyZWNfYXJnYyArIDEsIHNpemVvZihjaGFyICopKTsKIAotCWlmIChyZWNfYXJndikKKwlpZiAocmVjX2FyZ3YgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWNvcmRfYXJncyk7IGkrKykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IDAyYjJkODAuLmMzODVhNjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtMzE2LDYgKzMxNiw4IEBACiAJCQkJICAgICAgIlx0IENvbnNpZGVyIHR3ZWFraW5nIgogCQkJCSAgICAgICIgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkIG9yIHJ1bm5pbmcgYXMgcm9vdC4iLAogCQkJCSAgICAgIHN5c3RlbV93aWRlID8gInN5c3RlbS13aWRlICIgOiAiIik7CisJCQl9IGVsc2UgaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJCWVycm9yKCIlcyBldmVudCBpcyBub3Qgc3VwcG9ydGVkLiAiLCBldmVudF9uYW1lKGNvdW50ZXIpKTsKIAkJCX0gZWxzZSB7CiAJCQkJZXJyb3IoIm9wZW5fY291bnRlciByZXR1cm5lZCB3aXRoICVkICglcykuICIKIAkJCQkgICAgICAiL2Jpbi9kbWVzZyBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuIiwKQEAgLTY4Myw4ICs2ODUsNyBAQAogCQlucl9jb3VudGVycyA9IEFSUkFZX1NJWkUoZGVmYXVsdF9hdHRycyk7CiAKIAkJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUoZGVmYXVsdF9hdHRycyk7ICsrYykgewotCQkJcG9zID0gcGVyZl9ldnNlbF9fbmV3KGRlZmF1bHRfYXR0cnNbY10udHlwZSwKLQkJCQkJICAgICAgZGVmYXVsdF9hdHRyc1tjXS5jb25maWcsCisJCQlwb3MgPSBwZXJmX2V2c2VsX19uZXcoJmRlZmF1bHRfYXR0cnNbY10sCiAJCQkJCSAgICAgIG5yX2NvdW50ZXJzKTsKIAkJCWlmIChwb3MgPT0gTlVMTCkKIAkJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCmluZGV4IDFjOTg0MzQuLmVkNTY5NjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYwpAQCAtMjM0LDYgKzIzNCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2luY2x1ZGUgInV0aWwvY3B1bWFwLmgiCiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCkBAIC0yNjQsNiArMjY1LDcgQEAKIAlpbnQgZXJyID0gLTEsIGZkOwogCXN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CiAJdW5zaWduZWQgaW50IG5yX29wZW5fY2FsbHMgPSAxMTEsIGk7CiAJaW50IGlkID0gdHJhY2VfZXZlbnRfX2lkKCJzeXNfZW50ZXJfb3BlbiIpOwogCkBAIC0yNzgsNyArMjgwLDEwIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlldnNlbCA9IHBlcmZfZXZzZWxfX25ldyhQRVJGX1RZUEVfVFJBQ0VQT0lOVCwgaWQsIDApOworCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKKwlhdHRyLnR5cGUgPSBQRVJGX1RZUEVfVFJBQ0VQT0lOVDsKKwlhdHRyLmNvbmZpZyA9IGlkOworCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KCZhdHRyLCAwKTsKIAlpZiAoZXZzZWwgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygicGVyZl9ldnNlbF9fbmV3XG4iKTsKIAkJZ290byBvdXRfdGhyZWFkX21hcF9kZWxldGU7CkBAIC0zMTcsNiArMzIyLDExMSBAQAogCXJldHVybiBlcnI7CiB9CiAKKyNpbmNsdWRlIDxzY2hlZC5oPgorCitzdGF0aWMgaW50IHRlc3RfX29wZW5fc3lzY2FsbF9ldmVudF9vbl9hbGxfY3B1cyh2b2lkKQoreworCWludCBlcnIgPSAtMSwgZmQsIGNwdTsKKwlzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkczsKKwlzdHJ1Y3QgY3B1X21hcCAqY3B1czsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOworCXVuc2lnbmVkIGludCBucl9vcGVuX2NhbGxzID0gMTExLCBpOworCWNwdV9zZXRfdCAqY3B1X3NldDsKKwlzaXplX3QgY3B1X3NldF9zaXplOworCWludCBpZCA9IHRyYWNlX2V2ZW50X19pZCgic3lzX2VudGVyX29wZW4iKTsKKworCWlmIChpZCA8IDApIHsKKwkJcHJfZGVidWcoImlzIGRlYnVnZnMgbW91bnRlZCBvbiAvc3lzL2tlcm5lbC9kZWJ1Zz9cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGhyZWFkcyA9IHRocmVhZF9tYXBfX25ldygtMSwgZ2V0cGlkKCkpOworCWlmICh0aHJlYWRzID09IE5VTEwpIHsKKwkJcHJfZGVidWcoInRocmVhZF9tYXBfX25ld1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljcHVzID0gY3B1X21hcF9fbmV3KE5VTEwpOworCWlmICh0aHJlYWRzID09IE5VTEwpIHsKKwkJcHJfZGVidWcoInRocmVhZF9tYXBfX25ld1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwljcHVfc2V0ID0gQ1BVX0FMTE9DKGNwdXMtPm5yKTsKKworCWlmIChjcHVfc2V0ID09IE5VTEwpCisJCWdvdG8gb3V0X3RocmVhZF9tYXBfZGVsZXRlOworCisJY3B1X3NldF9zaXplID0gQ1BVX0FMTE9DX1NJWkUoY3B1cy0+bnIpOworCUNQVV9aRVJPX1MoY3B1X3NldF9zaXplLCBjcHVfc2V0KTsKKworCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKKwlhdHRyLnR5cGUgPSBQRVJGX1RZUEVfVFJBQ0VQT0lOVDsKKwlhdHRyLmNvbmZpZyA9IGlkOworCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KCZhdHRyLCAwKTsKKwlpZiAoZXZzZWwgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygicGVyZl9ldnNlbF9fbmV3XG4iKTsKKwkJZ290byBvdXRfY3B1X2ZyZWU7CisJfQorCisJaWYgKHBlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMpIDwgMCkgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIG9wZW4gY291bnRlcjogJXMsICIKKwkJCSAidHdlYWsgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkP1xuIiwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dF9ldnNlbF9kZWxldGU7CisJfQorCisJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVzLT5ucjsgKytjcHUpIHsKKwkJdW5zaWduZWQgaW50IG5jYWxscyA9IG5yX29wZW5fY2FsbHMgKyBjcHU7CisKKwkJQ1BVX1NFVChjcHUsIGNwdV9zZXQpOworCQlzY2hlZF9zZXRhZmZpbml0eSgwLCBjcHVfc2V0X3NpemUsIGNwdV9zZXQpOworCQlmb3IgKGkgPSAwOyBpIDwgbmNhbGxzOyArK2kpIHsKKwkJCWZkID0gb3BlbigiL2V0Yy9wYXNzd2QiLCBPX1JET05MWSk7CisJCQljbG9zZShmZCk7CisJCX0KKwkJQ1BVX0NMUihjcHUsIGNwdV9zZXQpOworCX0KKworCS8qCisJICogSGVyZSB3ZSBuZWVkIHRvIGV4cGxpY2l0ZWx5IHByZWFsbG9jYXRlIHRoZSBjb3VudHMsIGFzIGlmCisJICogd2UgdXNlIHRoZSBhdXRvIGFsbG9jYXRpb24gaXQgd2lsbCBhbGxvY2F0ZSBqdXN0IGZvciAxIGNwdSwKKwkgKiBhcyB3ZSBzdGFydCBieSBjcHUgMC4KKwkgKi8KKwlpZiAocGVyZl9ldnNlbF9fYWxsb2NfY291bnRzKGV2c2VsLCBjcHVzLT5ucikgPCAwKSB7CisJCXByX2RlYnVnKCJwZXJmX2V2c2VsX19hbGxvY19jb3VudHMobmNwdXM9JWQpXG4iLCBjcHVzLT5ucik7CisJCWdvdG8gb3V0X2Nsb3NlX2ZkOworCX0KKworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1cy0+bnI7ICsrY3B1KSB7CisJCXVuc2lnbmVkIGludCBleHBlY3RlZDsKKworCQlpZiAocGVyZl9ldnNlbF9fcmVhZF9vbl9jcHUoZXZzZWwsIGNwdSwgMCkgPCAwKSB7CisJCQlwcl9kZWJ1ZygicGVyZl9ldnNlbF9fb3Blbl9yZWFkX29uX2NwdVxuIik7CisJCQlnb3RvIG91dF9jbG9zZV9mZDsKKwkJfQorCisJCWV4cGVjdGVkID0gbnJfb3Blbl9jYWxscyArIGNwdTsKKwkJaWYgKGV2c2VsLT5jb3VudHMtPmNwdVtjcHVdLnZhbCAhPSBleHBlY3RlZCkgeworCQkJcHJfZGVidWcoInBlcmZfZXZzZWxfX3JlYWRfb25fY3B1OiBleHBlY3RlZCB0byBpbnRlcmNlcHQgJWQgY2FsbHMgb24gY3B1ICVkLCBnb3QgJUxkXG4iLAorCQkJCSBleHBlY3RlZCwgY3B1LCBldnNlbC0+Y291bnRzLT5jcHVbY3B1XS52YWwpOworCQkJZ290byBvdXRfY2xvc2VfZmQ7CisJCX0KKwl9CisKKwllcnIgPSAwOworb3V0X2Nsb3NlX2ZkOgorCXBlcmZfZXZzZWxfX2Nsb3NlX2ZkKGV2c2VsLCAxLCB0aHJlYWRzLT5ucik7CitvdXRfZXZzZWxfZGVsZXRlOgorCXBlcmZfZXZzZWxfX2RlbGV0ZShldnNlbCk7CitvdXRfY3B1X2ZyZWU6CisJQ1BVX0ZSRUUoY3B1X3NldCk7CitvdXRfdGhyZWFkX21hcF9kZWxldGU6CisJdGhyZWFkX21hcF9fZGVsZXRlKHRocmVhZHMpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdGVzdCB7CiAJY29uc3QgY2hhciAqZGVzYzsKIAlpbnQgKCpmdW5jKSh2b2lkKTsKQEAgLTMzMCw2ICs0NDAsMTAgQEAKIAkJLmZ1bmMgPSB0ZXN0X19vcGVuX3N5c2NhbGxfZXZlbnQsCiAJfSwKIAl7CisJCS5kZXNjID0gImRldGVjdCBvcGVuIHN5c2NhbGwgZXZlbnQgb24gYWxsIGNwdXMiLAorCQkuZnVuYyA9IHRlc3RfX29wZW5fc3lzY2FsbF9ldmVudF9vbl9hbGxfY3B1cywKKwl9LAorCXsKIAkJLmZ1bmMgPSBOVUxMLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IDFlNjdhYjkuLjZjZTQwNDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTEyNDcsNiArMTI0Nyw4IEBACiAJCQkJZGllKCJQZXJtaXNzaW9uIGVycm9yIC0gYXJlIHlvdSByb290P1xuIgogCQkJCQkiXHQgQ29uc2lkZXIgdHdlYWtpbmciCiAJCQkJCSIgL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X3BhcmFub2lkLlxuIik7CisJCQlpZiAoZXJyID09IEVOT0VOVCkKKwkJCQlkaWUoIiVzIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQuICIsIGV2ZW50X25hbWUoZXZzZWwpKTsKIAkJCS8qCiAJCQkgKiBJZiBpdCdzIGN5Y2xlcyB0aGVuIGZhbGwgYmFjayB0byBocnRpbWVyCiAJCQkgKiBiYXNlZCBjcHUtY2xvY2stdGljayBzdyBjb3VudGVyLCB3aGljaApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwppbmRleCBjOTUyNjdlLi5mNWNmZWQ2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwpAQCAtNiwxNCArNiwxMyBAQAogCiAjZGVmaW5lIEZEKGUsIHgsIHkpICgqKGludCAqKXh5YXJyYXlfX2VudHJ5KGUtPmZkLCB4LCB5KSkKIAotc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfZXZzZWxfX25ldyh1MzIgdHlwZSwgdTY0IGNvbmZpZywgaW50IGlkeCkKK3N0cnVjdCBwZXJmX2V2c2VsICpwZXJmX2V2c2VsX19uZXcoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSB6YWxsb2Moc2l6ZW9mKCpldnNlbCkpOwogCiAJaWYgKGV2c2VsICE9IE5VTEwpIHsKIAkJZXZzZWwtPmlkeAkgICA9IGlkeDsKLQkJZXZzZWwtPmF0dHIudHlwZSAgID0gdHlwZTsKLQkJZXZzZWwtPmF0dHIuY29uZmlnID0gY29uZmlnOworCQlldnNlbC0+YXR0cgkgICA9ICphdHRyOwogCQlJTklUX0xJU1RfSEVBRCgmZXZzZWwtPm5vZGUpOwogCX0KIApAQCAtMTI4LDU5ICsxMjcsNzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzKQorc3RhdGljIGludCBfX3BlcmZfZXZzZWxfX29wZW4oc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgY3B1X21hcCAqY3B1cywKKwkJCSAgICAgIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzKQogewotCWludCBjcHU7CisJaW50IGNwdSwgdGhyZWFkOwogCi0JaWYgKGV2c2VsLT5mZCA9PSBOVUxMICYmIHBlcmZfZXZzZWxfX2FsbG9jX2ZkKGV2c2VsLCBjcHVzLT5uciwgMSkgPCAwKQorCWlmIChldnNlbC0+ZmQgPT0gTlVMTCAmJgorCSAgICBwZXJmX2V2c2VsX19hbGxvY19mZChldnNlbCwgY3B1cy0+bnIsIHRocmVhZHMtPm5yKSA8IDApCiAJCXJldHVybiAtMTsKIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1cy0+bnI7IGNwdSsrKSB7Ci0JCUZEKGV2c2VsLCBjcHUsIDApID0gc3lzX3BlcmZfZXZlbnRfb3BlbigmZXZzZWwtPmF0dHIsIC0xLAotCQkJCQkJCWNwdXMtPm1hcFtjcHVdLCAtMSwgMCk7Ci0JCWlmIChGRChldnNlbCwgY3B1LCAwKSA8IDApCi0JCQlnb3RvIG91dF9jbG9zZTsKKwkJZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCB0aHJlYWRzLT5ucjsgdGhyZWFkKyspIHsKKwkJCUZEKGV2c2VsLCBjcHUsIHRocmVhZCkgPSBzeXNfcGVyZl9ldmVudF9vcGVuKCZldnNlbC0+YXR0ciwKKwkJCQkJCQkJICAgICB0aHJlYWRzLT5tYXBbdGhyZWFkXSwKKwkJCQkJCQkJICAgICBjcHVzLT5tYXBbY3B1XSwgLTEsIDApOworCQkJaWYgKEZEKGV2c2VsLCBjcHUsIHRocmVhZCkgPCAwKQorCQkJCWdvdG8gb3V0X2Nsb3NlOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CiAKIG91dF9jbG9zZToKLQl3aGlsZSAoLS1jcHUgPj0gMCkgewotCQljbG9zZShGRChldnNlbCwgY3B1LCAwKSk7Ci0JCUZEKGV2c2VsLCBjcHUsIDApID0gLTE7Ci0JfQorCWRvIHsKKwkJd2hpbGUgKC0tdGhyZWFkID49IDApIHsKKwkJCWNsb3NlKEZEKGV2c2VsLCBjcHUsIHRocmVhZCkpOworCQkJRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA9IC0xOworCQl9CisJCXRocmVhZCA9IHRocmVhZHMtPm5yOworCX0gd2hpbGUgKC0tY3B1ID49IDApOwogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IGNwdV9tYXAgbWFwOworCWludCBjcHVzWzFdOworfSBlbXB0eV9jcHVfbWFwID0geworCS5tYXAubnIJPSAxLAorCS5jcHVzCT0geyAtMSwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCB0aHJlYWRfbWFwIG1hcDsKKwlpbnQgdGhyZWFkc1sxXTsKK30gZW1wdHlfdGhyZWFkX21hcCA9IHsKKwkubWFwLm5yCSA9IDEsCisJLnRocmVhZHMgPSB7IC0xLCB9LAorfTsKKworaW50IHBlcmZfZXZzZWxfX29wZW4oc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcykKK3sKKworCWlmIChjcHVzID09IE5VTEwpIHsKKwkJLyogV29yayBhcm91bmQgb2xkIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmljdCBhbGlhc2luZyAqLworCQljcHVzID0gJmVtcHR5X2NwdV9tYXAubWFwOworCX0KKworCWlmICh0aHJlYWRzID09IE5VTEwpCisJCXRocmVhZHMgPSAmZW1wdHlfdGhyZWFkX21hcC5tYXA7CisKKwlyZXR1cm4gX19wZXJmX2V2c2VsX19vcGVuKGV2c2VsLCBjcHVzLCB0aHJlYWRzKTsKK30KKworaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX2NwdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzKQoreworCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsICZlbXB0eV90aHJlYWRfbWFwLm1hcCk7Cit9CisKIGludCBwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcykKIHsKLQlpbnQgdGhyZWFkOwotCi0JaWYgKGV2c2VsLT5mZCA9PSBOVUxMICYmIHBlcmZfZXZzZWxfX2FsbG9jX2ZkKGV2c2VsLCAxLCB0aHJlYWRzLT5ucikpCi0JCXJldHVybiAtMTsKLQotCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdGhyZWFkcy0+bnI7IHRocmVhZCsrKSB7Ci0JCUZEKGV2c2VsLCAwLCB0aHJlYWQpID0gc3lzX3BlcmZfZXZlbnRfb3BlbigmZXZzZWwtPmF0dHIsCi0JCQkJCQkJICAgdGhyZWFkcy0+bWFwW3RocmVhZF0sIC0xLCAtMSwgMCk7Ci0JCWlmIChGRChldnNlbCwgMCwgdGhyZWFkKSA8IDApCi0JCQlnb3RvIG91dF9jbG9zZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotb3V0X2Nsb3NlOgotCXdoaWxlICgtLXRocmVhZCA+PSAwKSB7Ci0JCWNsb3NlKEZEKGV2c2VsLCAwLCB0aHJlYWQpKTsKLQkJRkQoZXZzZWwsIDAsIHRocmVhZCkgPSAtMTsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1pbnQgcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIAotCQkgICAgIHN0cnVjdCBjcHVfbWFwICpjcHVzLCBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcykKLXsKLQlpZiAodGhyZWFkcyA9PSBOVUxMKQotCQlyZXR1cm4gcGVyZl9ldnNlbF9fb3Blbl9wZXJfY3B1KGV2c2VsLCBjcHVzKTsKLQotCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl90aHJlYWQoZXZzZWwsIHRocmVhZHMpOworCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsICZlbXB0eV9jcHVfbWFwLm1hcCwgdGhyZWFkcyk7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IGEwY2NkNjkuLmIyZDc1NWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC0zNyw3ICszNyw3IEBACiBzdHJ1Y3QgY3B1X21hcDsKIHN0cnVjdCB0aHJlYWRfbWFwOwogCi1zdHJ1Y3QgcGVyZl9ldnNlbCAqcGVyZl9ldnNlbF9fbmV3KHUzMiB0eXBlLCB1NjQgY29uZmlnLCBpbnQgaWR4KTsKK3N0cnVjdCBwZXJmX2V2c2VsICpwZXJmX2V2c2VsX19uZXcoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgaW50IGlkeCk7CiB2b2lkIHBlcmZfZXZzZWxfX2RlbGV0ZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpOwogCiBpbnQgcGVyZl9ldnNlbF9fYWxsb2NfZmQoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBpbnQgbmNwdXMsIGludCBudGhyZWFkcyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKaW5kZXggNjQ5MDgzZi4uNWNiNmY0YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpAQCAtNDkwLDYgKzQ5MCwzMSBAQAogCXJldHVybiBFVlRfSEFORExFRF9BTEw7CiB9CiAKK3N0YXRpYyBpbnQgc3RvcmVfZXZlbnRfdHlwZShjb25zdCBjaGFyICpvcmduYW1lKQoreworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdLCAqYzsKKwlGSUxFICpmaWxlOworCWludCBpZCwgbjsKKworCXNwcmludGYoZmlsZW5hbWUsICIlcy8iLCBkZWJ1Z2ZzX3BhdGgpOworCXN0cm5jYXQoZmlsZW5hbWUsIG9yZ25hbWUsIHN0cmxlbihvcmduYW1lKSk7CisJc3RyY2F0KGZpbGVuYW1lLCAiL2lkIik7CisKKwljID0gc3RyY2hyKGZpbGVuYW1lLCAnOicpOworCWlmIChjKQorCQkqYyA9ICcvJzsKKworCWZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAwOworCW4gPSBmc2NhbmYoZmlsZSwgIiVpIiwgJmlkKTsKKwlmY2xvc2UoZmlsZSk7CisJaWYgKG4gPCAxKSB7CisJCXByX2VycigiY2Fubm90IHN0b3JlIGV2ZW50IElEXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBwZXJmX2hlYWRlcl9fcHVzaF9ldmVudChpZCwgb3JnbmFtZSk7Cit9CiAKIHN0YXRpYyBlbnVtIGV2ZW50X3Jlc3VsdCBwYXJzZV90cmFjZXBvaW50X2V2ZW50KGNvbnN0IGNoYXIgKipzdHJwLAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQpAQCAtNTMzLDkgKzU1OCwxMyBAQAogCQkqc3RycCArPSBzdHJsZW4oc3lzX25hbWUpICsgZXZ0X2xlbmd0aDsKIAkJcmV0dXJuIHBhcnNlX211bHRpcGxlX3RyYWNlcG9pbnRfZXZlbnQoc3lzX25hbWUsIGV2dF9uYW1lLAogCQkJCQkJICAgICAgIGZsYWdzKTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQlpZiAoc3RvcmVfZXZlbnRfdHlwZShldnRfbmFtZSkgPCAwKQorCQkJcmV0dXJuIEVWVF9GQUlMRUQ7CisKIAkJcmV0dXJuIHBhcnNlX3NpbmdsZV90cmFjZXBvaW50X2V2ZW50KHN5c19uYW1lLCBldnRfbmFtZSwKIAkJCQkJCSAgICAgZXZ0X2xlbmd0aCwgYXR0ciwgc3RycCk7CisJfQogfQogCiBzdGF0aWMgZW51bSBldmVudF9yZXN1bHQKQEAgLTc3OCw0MSArODA3LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzdG9yZV9ldmVudF90eXBlKGNvbnN0IGNoYXIgKm9yZ25hbWUpCi17Ci0JY2hhciBmaWxlbmFtZVtQQVRIX01BWF0sICpjOwotCUZJTEUgKmZpbGU7Ci0JaW50IGlkLCBuOwotCi0Jc3ByaW50ZihmaWxlbmFtZSwgIiVzLyIsIGRlYnVnZnNfcGF0aCk7Ci0Jc3RybmNhdChmaWxlbmFtZSwgb3JnbmFtZSwgc3RybGVuKG9yZ25hbWUpKTsKLQlzdHJjYXQoZmlsZW5hbWUsICIvaWQiKTsKLQotCWMgPSBzdHJjaHIoZmlsZW5hbWUsICc6Jyk7Ci0JaWYgKGMpCi0JCSpjID0gJy8nOwotCi0JZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotCWlmICghZmlsZSkKLQkJcmV0dXJuIDA7Ci0JbiA9IGZzY2FuZihmaWxlLCAiJWkiLCAmaWQpOwotCWZjbG9zZShmaWxlKTsKLQlpZiAobiA8IDEpIHsKLQkJcHJfZXJyKCJjYW5ub3Qgc3RvcmUgZXZlbnQgSURcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHBlcmZfaGVhZGVyX19wdXNoX2V2ZW50KGlkLCBvcmduYW1lKTsKLX0KLQogaW50IHBhcnNlX2V2ZW50cyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQgX191c2VkLCBjb25zdCBjaGFyICpzdHIsIGludCB1bnNldCBfX3VzZWQpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOwogCWVudW0gZXZlbnRfcmVzdWx0IHJldDsKIAotCWlmIChzdHJjaHIoc3RyLCAnOicpKQotCQlpZiAoc3RvcmVfZXZlbnRfdHlwZShzdHIpIDwgMCkKLQkJCXJldHVybiAtMTsKLQogCWZvciAoOzspIHsKIAkJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOwogCQlyZXQgPSBwYXJzZV9ldmVudF9zeW1ib2xzKCZzdHIsICZhdHRyKTsKQEAgLTgyNCw3ICs4MjMsNyBAQAogCiAJCWlmIChyZXQgIT0gRVZUX0hBTkRMRURfQUxMKSB7CiAJCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7Ci0JCQlldnNlbCA9IHBlcmZfZXZzZWxfX25ldyhhdHRyLnR5cGUsIGF0dHIuY29uZmlnLAorCQkJZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoJmF0dHIsCiAJCQkJCQlucl9jb3VudGVycyk7CiAJCQlpZiAoZXZzZWwgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLTE7CkBAIC0xMDE0LDggKzEwMTMsMTUgQEAKIAogaW50IHBlcmZfZXZzZWxfbGlzdF9fY3JlYXRlX2RlZmF1bHQodm9pZCkKIHsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoUEVSRl9UWVBFX0hBUkRXQVJFLAotCQkJCQkJICAgUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLCAwKTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyOworCisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOworCWF0dHIudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRTsKKwlhdHRyLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUzsKKworCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KCZhdHRyLCAwKTsKKwogCWlmIChldnNlbCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKaW5kZXggNmZiNDY5NC4uMzEzZGFjMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYworKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogCWlmIChzaXplID09IDApCiAJCXNpemUgPSA4OwogCi0JaWYgKGhlYWQgKyBldmVudC0+aGVhZGVyLnNpemUgPj0gbW1hcF9zaXplKSB7CisJaWYgKGhlYWQgKyBldmVudC0+aGVhZGVyLnNpemUgPiBtbWFwX3NpemUpIHsKIAkJaWYgKG1tYXBzW21hcF9pZHhdKSB7CiAJCQltdW5tYXAobW1hcHNbbWFwX2lkeF0sIG1tYXBfc2l6ZSk7CiAJCQltbWFwc1ttYXBfaWR4XSA9IE5VTEw7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L01ha2VmaWxlIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhlMWYxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKK3R1cmJvc3RhdCA6IHR1cmJvc3RhdC5jCisKK2NsZWFuIDoKKwlybSAtZiB0dXJib3N0YXQKKworaW5zdGFsbCA6CisJaW5zdGFsbCB0dXJib3N0YXQgL3Vzci9iaW4vdHVyYm9zdGF0CisJaW5zdGFsbCB0dXJib3N0YXQuOCAvdXNyL3NoYXJlL21hbi9tYW44CmRpZmYgLS1naXQgYS90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC44IGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc1MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuOApAQCAtMCwwICsxLDE3MiBAQAorLlRIIFRVUkJPU1RBVCA4CisuU0ggTkFNRQordHVyYm9zdGF0IFwtIFJlcG9ydCBwcm9jZXNzb3IgZnJlcXVlbmN5IGFuZCBpZGxlIHN0YXRpc3RpY3MKKy5TSCBTWU5PUFNJUworLmZ0IEIKKy5CIHR1cmJvc3RhdAorLlJCIFsgIlwtdiIgXQorLlJCIFsgIlwtTSBNU1IjIiBdCisuUkIgY29tbWFuZAorLmJyCisuQiB0dXJib3N0YXQKKy5SQiBbICJcLXYiIF0KKy5SQiBbICJcLU0gTVNSIyIgXQorLlJCIFsgIlwtaSBpbnRlcnZhbF9zZWMiIF0KKy5TSCBERVNDUklQVElPTgorXGZCdHVyYm9zdGF0IFxmUCByZXBvcnRzIHByb2Nlc3NvciB0b3BvbG9neSwgZnJlcXVlbmN5CithbmQgaWRsZSBwb3dlciBzdGF0ZSBzdGF0aXN0aWNzIG9uIG1vZGVybiBYODYgcHJvY2Vzc29ycy4KK0VpdGhlciBcZkJjb21tYW5kXGZQIGlzIGZvcmtlZCBhbmQgc3RhdGlzdGljcyBhcmUgcHJpbnRlZAordXBvbiBpdHMgY29tcGxldGlvbiwgb3Igc3RhdGlzdGljcyBhcmUgcHJpbnRlZCBwZXJpb2RpY2FsbHkuCisKK1xmQnR1cmJvc3RhdCBcZlAKK3JlcXVpcmVzIHRoYXQgdGhlIHByb2Nlc3Nvcgorc3VwcG9ydHMgYW4gImludmFyaWFudCIgVFNDLCBwbHVzIHRoZSBBUEVSRiBhbmQgTVBFUkYgTVNScy4KK1xmQnR1cmJvc3RhdCBcZlAgd2lsbCByZXBvcnQgaWRsZSBjcHUgcG93ZXIgc3RhdGUgcmVzaWRlbmN5CitvbiBwcm9jZXNzb3JzIHRoYXQgYWRkaXRpb25hbGx5IHN1cHBvcnQgQy1zdGF0ZSByZXNpZGVuY3kgY291bnRlcnMuCisKKy5TUyBPcHRpb25zCitUaGUgXGZCLXZcZlAgb3B0aW9uIGluY3JlYXNlcyB2ZXJib3NpdHkuCisuUFAKK1RoZSBcZkItTSBNU1IjXGZQIG9wdGlvbiBkdW1wcyB0aGUgc3BlY2lmaWVkIE1TUiwKK2luIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBmcmVxdWVuY3kgYW5kIGlkbGUgc3RhdGlzdGljcy4KKy5QUAorVGhlIFxmQi1pIGludGVydmFsX3NlY1xmUCBvcHRpb24gcHJpbnRzIHN0YXRpc3RpY3MgZXZlcnkgXGZpaW50ZXJ2YWxfc2VjXGZQIHNlY29uZHMuCitUaGUgZGVmYXVsdCBpcyA1IHNlY29uZHMuCisuUFAKK1RoZSBcZkJjb21tYW5kXGZQIHBhcmFtZXRlciBmb3JrcyBcZkJjb21tYW5kXGZQIGFuZCB1cG9uIGl0cyBleGl0LAorZGlzcGxheXMgdGhlIHN0YXRpc3RpY3MgZ2F0aGVyZWQgc2luY2UgaXQgd2FzIGZvcmtlZC4KKy5QUAorLlNIIEZJRUxEIERFU0NSSVBUSU9OUworLm5mCitcZkJwa2dcZlAgcHJvY2Vzc29yIHBhY2thZ2UgbnVtYmVyLgorXGZCY29yZVxmUCBwcm9jZXNzb3IgY29yZSBudW1iZXIuCitcZkJDUFVcZlAgTGludXggQ1BVIChsb2dpY2FsIHByb2Nlc3NvcikgbnVtYmVyLgorXGZCJWMwXGZQIHBlcmNlbnQgb2YgdGhlIGludGVydmFsIHRoYXQgdGhlIENQVSByZXRpcmVkIGluc3RydWN0aW9ucy4KK1xmQkdIelxmUCBhdmVyYWdlIGNsb2NrIHJhdGUgd2hpbGUgdGhlIENQVSB3YXMgaW4gYzAgc3RhdGUuCitcZkJUU0NcZlAgYXZlcmFnZSBHSHogdGhhdCB0aGUgVFNDIHJhbiBkdXJpbmcgdGhlIGVudGlyZSBpbnRlcnZhbC4KK1xmQiVjMSwgJWMzLCAlYzZcZlAgc2hvdyB0aGUgcGVyY2VudGFnZSByZXNpZGVuY3kgaW4gaGFyZHdhcmUgY29yZSBpZGxlIHN0YXRlcy4KK1xmQiVwYzMsICVwYzZcZlAgcGVyY2VudGFnZSByZXNpZGVuY3kgaW4gaGFyZHdhcmUgcGFja2FnZSBpZGxlIHN0YXRlcy4KKy5maQorLlBQCisuU0ggRVhBTVBMRQorV2l0aG91dCBhbnkgcGFyYW1ldGVycywgdHVyYm9zdGF0IHByaW50cyBvdXQgY291bnRlcnMgZXZlciA1IHNlY29uZHMuCisob3ZlcnJpZGUgaW50ZXJ2YWwgd2l0aCAiLWkgc2VjIiBvcHRpb24sIG9yIHNwZWNpZnkgYSBjb21tYW5kCitmb3IgdHVyYm9zdGF0IHRvIGZvcmspLgorCitUaGUgZmlyc3Qgcm93IG9mIHN0YXRpc3RpY3MgcmVmbGVjdCB0aGUgYXZlcmFnZSBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uCitTdWJzZXF1ZW50IHJvd3Mgc2hvdyBwZXItQ1BVIHN0YXRpc3RpY3MuCisKKy5uZgorW3Jvb3RAeDk4MF0jIC4vdHVyYm9zdGF0Citjb3JlIENQVSAgICVjMCAgIEdIeiAgVFNDICAgJWMxICAgICVjMyAgICAlYzYgICAlcGMzICAgJXBjNgorICAgICAgICAgIDAuMDQgMS42MiAzLjM4ICAgMC4xMSAgIDAuMDAgIDk5Ljg1ICAgMC4wMCAgOTUuMDcKKyAgMCAgIDAgICAwLjA0IDEuNjIgMy4zOCAgIDAuMDYgICAwLjAwICA5OS45MCAgIDAuMDAgIDk1LjA3CisgIDAgICA2ICAgMC4wMiAxLjYyIDMuMzggICAwLjA4ICAgMC4wMCAgOTkuOTAgICAwLjAwICA5NS4wNworICAxICAgMiAgIDAuMTAgMS42MiAzLjM4ICAgMC4yOSAgIDAuMDAgIDk5LjYxICAgMC4wMCAgOTUuMDcKKyAgMSAgIDggICAwLjExIDEuNjIgMy4zOCAgIDAuMjggICAwLjAwICA5OS42MSAgIDAuMDAgIDk1LjA3CisgIDIgICA0ICAgMC4wMSAxLjYyIDMuMzggICAwLjAxICAgMC4wMCAgOTkuOTggICAwLjAwICA5NS4wNworICAyICAxMCAgIDAuMDEgMS42MSAzLjM4ICAgMC4wMiAgIDAuMDAgIDk5Ljk4ICAgMC4wMCAgOTUuMDcKKyAgOCAgIDEgICAwLjA3IDEuNjIgMy4zOCAgIDAuMTUgICAwLjAwICA5OS43OCAgIDAuMDAgIDk1LjA3CisgIDggICA3ICAgMC4wMyAxLjYyIDMuMzggICAwLjE5ICAgMC4wMCAgOTkuNzggICAwLjAwICA5NS4wNworICA5ICAgMyAgIDAuMDEgMS42MiAzLjM4ICAgMC4wMiAgIDAuMDAgIDk5Ljk4ICAgMC4wMCAgOTUuMDcKKyAgOSAgIDkgICAwLjAxIDEuNjIgMy4zOCAgIDAuMDIgICAwLjAwICA5OS45OCAgIDAuMDAgIDk1LjA3CisgMTAgICA1ICAgMC4wMSAxLjYyIDMuMzggICAwLjEzICAgMC4wMCAgOTkuODYgICAwLjAwICA5NS4wNworIDEwICAxMSAgIDAuMDggMS42MiAzLjM4ICAgMC4wNSAgIDAuMDAgIDk5Ljg2ICAgMC4wMCAgOTUuMDcKKy5maQorLlNIIFZFUkJPU0UgRVhBTVBMRQorVGhlICItdiIgb3B0aW9uIGFkZHMgdmVyYm9zaXR5IHRvIHRoZSBvdXRwdXQ6CisKKy5uZgorR2VudWluZUludGVsIDExIENQVUlEIGxldmVsczsgZmFtaWx5Om1vZGVsOnN0ZXBwaW5nIDB4NjoyYzoyICg2OjQ0OjIpCisxMiAqIDEzMyA9IDE2MDAgTUh6IG1heCBlZmZpY2llbmN5CisyNSAqIDEzMyA9IDMzMzMgTUh6IFRTQyBmcmVxdWVuY3kKKzI2ICogMTMzID0gMzQ2NyBNSHogbWF4IHR1cmJvIDQgYWN0aXZlIGNvcmVzCisyNiAqIDEzMyA9IDM0NjcgTUh6IG1heCB0dXJibyAzIGFjdGl2ZSBjb3JlcworMjcgKiAxMzMgPSAzNjAwIE1IeiBtYXggdHVyYm8gMiBhY3RpdmUgY29yZXMKKzI3ICogMTMzID0gMzYwMCBNSHogbWF4IHR1cmJvIDEgYWN0aXZlIGNvcmVzCisKKy5maQorVGhlIFxmQm1heCBlZmZpY2llbmN5XGZQIGZyZXF1ZW5jeSwgYS5rLmEuIExvdyBGcmVxdWVuY3kgTW9kZSwgaXMgdGhlIGZyZXF1ZW5jeQorYXZhaWxhYmxlIGF0IHRoZSBtaW5pbXVtIHBhY2thZ2Ugdm9sdGFnZS4gIFRoZSBcZkJUU0MgZnJlcXVlbmN5XGZQIGlzIHRoZSBub21pbmFsCittYXhpbXVtIGZyZXF1ZW5jeSBvZiB0aGUgcHJvY2Vzc29yIGlmIHR1cmJvLW1vZGUgd2VyZSBub3QgYXZhaWxhYmxlLiAgVGhpcyBmcmVxdWVuY3kKK3Nob3VsZCBiZSBzdXN0YWluYWJsZSBvbiBhbGwgQ1BVcyBpbmRlZmluaXRlbHksIGdpdmVuIG5vbWluYWwgcG93ZXIgYW5kIGNvb2xpbmcuCitUaGUgcmVtYWluaW5nIHJvd3Mgc2hvdyB3aGF0IG1heGltdW0gdHVyYm8gZnJlcXVlbmN5IGlzIHBvc3NpYmxlCitkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBpZGxlIGNvcmVzLiAgTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMKK25vdCBhdmFpbGFibGUgb24gYWxsIHByb2Nlc3NvcnMuCisuU0ggRk9SSyBFWEFNUExFCitJZiB0dXJib3N0YXQgaXMgaW52b2tlZCB3aXRoIGEgY29tbWFuZCwgaXQgd2lsbCBmb3JrIHRoYXQgY29tbWFuZAorYW5kIG91dHB1dCB0aGUgc3RhdGlzdGljcyBnYXRoZXJlZCB3aGVuIHRoZSBjb21tYW5kIGV4aXRzLgorZWcuIEhlcmUgYSBjeWNsZSBzb2FrZXIgaXMgcnVuIG9uIDEgQ1BVIChzZWUgJWMwKSBmb3IgYSBmZXcgc2Vjb25kcwordW50aWwgXkMgd2hpbGUgdGhlIG90aGVyIENQVXMgYXJlIG1vc3RseSBpZGxlOgorCisubmYKK1tyb290QHg5ODAgbGVuYl0jIC4vdHVyYm9zdGF0IGNhdCAvZGV2L3plcm8gPiAvZGV2L251bGwKKworXkNjb3JlIENQVSAgICVjMCAgIEdIeiAgVFNDICAgJWMxICAgICVjMyAgICAlYzYgICAlcGMzICAgJXBjNgorICAgICAgICAgICA4LjQ5IDMuNjMgMy4zOCAgMTYuMjMgICAwLjY2ICA3NC42MyAgIDAuMDAgICAwLjAwCisgICAwICAgMCAgIDEuMjIgMy42MiAzLjM4ICAzMi4xOCAgIDAuMDAgIDY2LjYwICAgMC4wMCAgIDAuMDAKKyAgIDAgICA2ICAgMC40MCAzLjYxIDMuMzggIDMzLjAwICAgMC4wMCAgNjYuNjAgICAwLjAwICAgMC4wMAorICAgMSAgIDIgICAwLjExIDMuMTQgMy4zOCAgIDAuMTkgICAzLjk1ICA5NS43NSAgIDAuMDAgICAwLjAwCisgICAxICAgOCAgIDAuMDUgMi44OCAzLjM4ICAgMC4yNSAgIDMuOTUgIDk1Ljc1ICAgMC4wMCAgIDAuMDAKKyAgIDIgICA0ICAgMC4wMCAzLjEzIDMuMzggICAwLjAyICAgMC4wMCAgOTkuOTggICAwLjAwICAgMC4wMAorICAgMiAgMTAgICAwLjAwIDMuMDkgMy4zOCAgIDAuMDIgICAwLjAwICA5OS45OCAgIDAuMDAgICAwLjAwCisgICA4ICAgMSAgIDAuMDQgMy41MCAzLjM4ICAxNC40MyAgIDAuMDAgIDg1LjU0ICAgMC4wMCAgIDAuMDAKKyAgIDggICA3ICAgMC4wMyAyLjk4IDMuMzggIDE0LjQzICAgMC4wMCAgODUuNTQgICAwLjAwICAgMC4wMAorICAgOSAgIDMgICAwLjAwIDMuMTYgMy4zOCAxMDAuMDAgICAwLjAwICAgMC4wMCAgIDAuMDAgICAwLjAwCisgICA5ICAgOSAgOTkuOTMgMy42MyAzLjM4ICAgMC4wNiAgIDAuMDAgICAwLjAwICAgMC4wMCAgIDAuMDAKKyAgMTAgICA1ICAgMC4wMSAyLjgyIDMuMzggICAwLjA4ICAgMC4wMCAgOTkuOTEgICAwLjAwICAgMC4wMAorICAxMCAgMTEgICAwLjAyIDMuMzYgMy4zOCAgIDAuMDYgICAwLjAwICA5OS45MSAgIDAuMDAgICAwLjAwCis2Ljk1MDg2NiBzZWMKKworLmZpCitBYm92ZSB0aGUgY3ljbGUgc29ha2VyIGRyaXZlcyBjcHU5IHVwIDMuNiBHaHogdHVyYm8gbGltaXQKK3doaWxlIHRoZSBvdGhlciBwcm9jZXNzb3JzIGFyZSBnZW5lcmFsbHkgaW4gdmFyaW91cyBzdGF0ZXMgb2YgaWRsZS4KKworTm90ZSB0aGF0IGNwdTMgaXMgYW4gSFQgc2libGluZyBzaGFyaW5nIGNvcmU5Cit3aXRoIGNwdTksIGFuZCB0aHVzIGl0IGlzIHVuYWJsZSB0byBnZXQgdG8gYW4gaWRsZSBzdGF0ZQorZGVlcGVyIHRoYW4gYzEgd2hpbGUgY3B1OSBpcyBidXN5LgorCitOb3RlIHRoYXQgdHVyYm9zdGF0IHJlcG9ydHMgYXZlcmFnZSBHSHogb2YgMy42MSwgd2hpbGUKK3RoZSBhcml0aG1ldGljIGF2ZXJhZ2Ugb2YgdGhlIEdIeiBjb2x1bW4gYWJvdmUgaXMgMy4yNC4KK1RoaXMgaXMgYSB3ZWlnaHRlZCBhdmVyYWdlLCB3aGVyZSB0aGUgd2VpZ2h0IGlzICVjMC4gIGllLiBpdCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mCit1bi1oYWx0ZWQgY3ljbGVzIGVsYXBzZWQgcGVyIHRpbWUgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIENQVXMuCisuU0ggTk9URVMKKworLkIgInR1cmJvc3RhdCAiCittdXN0IGJlIHJ1biBhcyByb290LgorCisuQiAidHVyYm9zdGF0ICIKK3JlYWRzIGhhcmR3YXJlIGNvdW50ZXJzLCBidXQgZG9lc24ndCB3cml0ZSB0aGVtLgorU28gaXQgd2lsbCBub3QgaW50ZXJmZXJlIHdpdGggdGhlIE9TIG9yIG90aGVyIHByb2dyYW1zLCBpbmNsdWRpbmcKK211bHRpcGxlIGludm9jYXRpb25zIG9mIGl0c2VsZi4KKworXGZCdHVyYm9zdGF0IFxmUAorbWF5IHdvcmsgcG9vcmx5IG9uIExpbnV4LTIuNi4yMCB0aHJvdWdoIDIuNi4yOSwKK2FzIFxmQmFjcGktY3B1ZnJlcSBcZlBwZXJpb2RpY2FsbHkgY2xlYXJlZCB0aGUgQVBFUkYgYW5kIE1QRVJGCitpbiB0aG9zZSBrZXJuZWxzLgorCitUaGUgQVBFUkYsIE1QRVJGIE1TUnMgYXJlIGRlZmluZWQgdG8gY291bnQgbm9uLWhhbHRlZCBjeWNsZXMuCitBbHRob3VnaCBpdCBpcyBub3QgZ3VhcmFudGVlZCBieSB0aGUgYXJjaGl0ZWN0dXJlLCB0dXJib3N0YXQgYXNzdW1lcwordGhhdCB0aGV5IGNvdW50IGF0IFRTQyByYXRlLCB3aGljaCBpcyB0cnVlIG9uIGFsbCBwcm9jZXNzb3JzIHRlc3RlZCB0byBkYXRlLgorCisuU0ggUkVGRVJFTkNFUworIkludGVswq4gVHVyYm8gQm9vc3QgVGVjaG5vbG9neQoraW4gSW50ZWzCriBDb3Jl4oSiIE1pY3JvYXJjaGl0ZWN0dXJlIChOZWhhbGVtKSBCYXNlZCBQcm9jZXNzb3JzIgoraHR0cDovL2Rvd25sb2FkLmludGVsLmNvbS9kZXNpZ24vcHJvY2Vzc29yL2FwcGxub3RzLzMyMDM1NC5wZGYKKworIkludGVswq4gNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsCitWb2x1bWUgM0I6IFN5c3RlbSBQcm9ncmFtbWluZyBHdWlkZSIKK2h0dHA6Ly93d3cuaW50ZWwuY29tL3Byb2R1Y3RzL3Byb2Nlc3Nvci9tYW51YWxzLworCisuU0ggRklMRVMKKy50YQorLm5mCisvZGV2L2NwdS8qL21zcgorLmZpCisKKy5TSCAiU0VFIEFMU08iCittc3IoNCksIHZtc3RhdCg4KQorLlBQCisuU0ggQVVUSE9SUworLm5mCitXcml0dGVuIGJ5IExlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjk4M2QKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyoKKyAqIHR1cmJvc3RhdCAtLSBzaG93IENQVSBmcmVxdWVuY3kgYW5kIEMtc3RhdGUgcmVzaWRlbmN5CisgKiBvbiBtb2Rlcm4gSW50ZWwgdHVyYm8tY2FwYWJsZSBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNkZWZpbmUgTVNSX1RTQwkweDEwCisjZGVmaW5lIE1TUl9ORUhBTEVNX1BMQVRGT1JNX0lORk8JMHhDRQorI2RlZmluZSBNU1JfTkVIQUxFTV9UVVJCT19SQVRJT19MSU1JVAkweDFBRAorI2RlZmluZSBNU1JfQVBFUkYJMHhFOAorI2RlZmluZSBNU1JfTVBFUkYJMHhFNworI2RlZmluZSBNU1JfUEtHX0MyX1JFU0lERU5DWQkweDYwRAkvKiBTTkIgb25seSAqLworI2RlZmluZSBNU1JfUEtHX0MzX1JFU0lERU5DWQkweDNGOAorI2RlZmluZSBNU1JfUEtHX0M2X1JFU0lERU5DWQkweDNGOQorI2RlZmluZSBNU1JfUEtHX0M3X1JFU0lERU5DWQkweDNGQQkvKiBTTkIgb25seSAqLworI2RlZmluZSBNU1JfQ09SRV9DM19SRVNJREVOQ1kJMHgzRkMKKyNkZWZpbmUgTVNSX0NPUkVfQzZfUkVTSURFTkNZCTB4M0ZECisjZGVmaW5lIE1TUl9DT1JFX0M3X1JFU0lERU5DWQkweDNGRQkvKiBTTkIgb25seSAqLworCitjaGFyICpwcm9jX3N0YXQgPSAiL3Byb2Mvc3RhdCI7Cit1bnNpZ25lZCBpbnQgaW50ZXJ2YWxfc2VjID0gNTsJLyogc2V0IHdpdGggLWkgaW50ZXJ2YWxfc2VjICovCit1bnNpZ25lZCBpbnQgdmVyYm9zZTsJCS8qIHNldCB3aXRoIC12ICovCit1bnNpZ25lZCBpbnQgc2tpcF9jMDsKK3Vuc2lnbmVkIGludCBza2lwX2MxOwordW5zaWduZWQgaW50IGRvX25obV9jc3RhdGVzOwordW5zaWduZWQgaW50IGRvX3NuYl9jc3RhdGVzOwordW5zaWduZWQgaW50IGhhc19hcGVyZjsKK3Vuc2lnbmVkIGludCB1bml0cyA9IDEwMDAwMDAwMDA7CS8qIEdoeiBldGMgKi8KK3Vuc2lnbmVkIGludCBnZW51aW5lX2ludGVsOwordW5zaWduZWQgaW50IGhhc19pbnZhcmlhbnRfdHNjOwordW5zaWduZWQgaW50IGRvX25laGFsZW1fcGxhdGZvcm1faW5mbzsKK3Vuc2lnbmVkIGludCBkb19uZWhhbGVtX3R1cmJvX3JhdGlvX2xpbWl0OwordW5zaWduZWQgaW50IGV4dHJhX21zcl9vZmZzZXQ7Citkb3VibGUgYmNsazsKK3Vuc2lnbmVkIGludCBzaG93X3BrZzsKK3Vuc2lnbmVkIGludCBzaG93X2NvcmU7Cit1bnNpZ25lZCBpbnQgc2hvd19jcHU7CisKK2ludCBhcGVyZl9tcGVyZl91bnN0YWJsZTsKK2ludCBiYWNrd2FyZHNfY291bnQ7CitjaGFyICpwcm9nbmFtZTsKK2ludCBuZWVkX3JlaW5pdGlhbGl6ZTsKKworaW50IG51bV9jcHVzOworCit0eXBlZGVmIHN0cnVjdCBwZXJfY3B1X2NvdW50ZXJzIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHNjOwkJLyogcGVyIHRocmVhZCAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBhcGVyZjsJLyogcGVyIHRocmVhZCAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBtcGVyZjsJLyogcGVyIHRocmVhZCAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBjMTsJLyogcGVyIHRocmVhZCAoY2FsY3VsYXRlZCkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgYzM7CS8qIHBlciBjb3JlICovCisJdW5zaWduZWQgbG9uZyBsb25nIGM2OwkvKiBwZXIgY29yZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBjNzsJLyogcGVyIGNvcmUgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgcGMyOwkvKiBwZXIgcGFja2FnZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBwYzM7CS8qIHBlciBwYWNrYWdlICovCisJdW5zaWduZWQgbG9uZyBsb25nIHBjNjsJLyogcGVyIHBhY2thZ2UgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgcGM3OwkvKiBwZXIgcGFja2FnZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBleHRyYV9tc3I7CS8qIHBlciB0aHJlYWQgKi8KKwlpbnQgcGtnOworCWludCBjb3JlOworCWludCBjcHU7CisJc3RydWN0IHBlcl9jcHVfY291bnRlcnMgKm5leHQ7Cit9IFBDQzsKKworUENDICpwY2NfZXZlbjsKK1BDQyAqcGNjX29kZDsKK1BDQyAqcGNjX2RlbHRhOworUENDICpwY2NfYXZlcmFnZTsKK3N0cnVjdCB0aW1ldmFsIHR2X2V2ZW47CitzdHJ1Y3QgdGltZXZhbCB0dl9vZGQ7CitzdHJ1Y3QgdGltZXZhbCB0dl9kZWx0YTsKKwordW5zaWduZWQgbG9uZyBsb25nIGdldF9tc3IoaW50IGNwdSwgb2ZmX3Qgb2Zmc2V0KQoreworCXNzaXplX3QgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtc3I7CisJY2hhciBwYXRobmFtZVszMl07CisJaW50IGZkOworCisJc3ByaW50ZihwYXRobmFtZSwgIi9kZXYvY3B1LyVkL21zciIsIGNwdSk7CisJZmQgPSBvcGVuKHBhdGhuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlwZXJyb3IocGF0aG5hbWUpOworCQluZWVkX3JlaW5pdGlhbGl6ZSA9IDE7CisJCXJldHVybiAwOworCX0KKworCXJldHZhbCA9IHByZWFkKGZkLCAmbXNyLCBzaXplb2YgbXNyLCBvZmZzZXQpOworCWlmIChyZXR2YWwgIT0gc2l6ZW9mIG1zcikgeworCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIHByZWFkKC4uLiwgMHglengpID0gJWpkXG4iLAorCQkJY3B1LCBvZmZzZXQsIHJldHZhbCk7CisJCWV4aXQoLTIpOworCX0KKworCWNsb3NlKGZkKTsKKwlyZXR1cm4gbXNyOworfQorCit2b2lkIHByaW50X2hlYWRlcigpCit7CisJaWYgKHNob3dfcGtnKQorCQlmcHJpbnRmKHN0ZGVyciwgInBrZyAiKTsKKwlpZiAoc2hvd19jb3JlKQorCQlmcHJpbnRmKHN0ZGVyciwgImNvcmUiKTsKKwlpZiAoc2hvd19jcHUpCisJCWZwcmludGYoc3RkZXJyLCAiIENQVSIpOworCWlmIChkb19uaG1fY3N0YXRlcykKKwkJZnByaW50ZihzdGRlcnIsICIgICAlJWMwICIpOworCWlmIChoYXNfYXBlcmYpCisJCWZwcmludGYoc3RkZXJyLCAiICBHSHoiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgVFNDIik7CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzEgIik7CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzMgIik7CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzYgIik7CisJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzcgIik7CisJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzIgIik7CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzMgIik7CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzYgIik7CisJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzcgIik7CisJaWYgKGV4dHJhX21zcl9vZmZzZXQpCisJCWZwcmludGYoc3RkZXJyLCAiICAgICAgIE1TUiAweCV4ICIsIGV4dHJhX21zcl9vZmZzZXQpOworCisJcHV0YygnXG4nLCBzdGRlcnIpOworfQorCit2b2lkIGR1bXBfcGNjKFBDQyAqcGNjKQoreworCWZwcmludGYoc3RkZXJyLCAicGFja2FnZTogJWQgIiwgcGNjLT5wa2cpOworCWZwcmludGYoc3RkZXJyLCAiY29yZTo6ICVkICIsIHBjYy0+Y29yZSk7CisJZnByaW50ZihzdGRlcnIsICJDUFU6ICVkICIsIHBjYy0+Y3B1KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRTQzogJTAxNmxsWFxuIiwgcGNjLT50c2MpOworCWZwcmludGYoc3RkZXJyLCAiYzM6ICUwMTZsbFhcbiIsIHBjYy0+YzMpOworCWZwcmludGYoc3RkZXJyLCAiYzY6ICUwMTZsbFhcbiIsIHBjYy0+YzYpOworCWZwcmludGYoc3RkZXJyLCAiYzc6ICUwMTZsbFhcbiIsIHBjYy0+YzcpOworCWZwcmludGYoc3RkZXJyLCAiYXBlcmY6ICUwMTZsbFhcbiIsIHBjYy0+YXBlcmYpOworCWZwcmludGYoc3RkZXJyLCAicGMyOiAlMDE2bGxYXG4iLCBwY2MtPnBjMik7CisJZnByaW50ZihzdGRlcnIsICJwYzM6ICUwMTZsbFhcbiIsIHBjYy0+cGMzKTsKKwlmcHJpbnRmKHN0ZGVyciwgInBjNjogJTAxNmxsWFxuIiwgcGNjLT5wYzYpOworCWZwcmludGYoc3RkZXJyLCAicGM3OiAlMDE2bGxYXG4iLCBwY2MtPnBjNyk7CisJZnByaW50ZihzdGRlcnIsICJtc3IweCV4OiAlMDE2bGxYXG4iLCBleHRyYV9tc3Jfb2Zmc2V0LCBwY2MtPmV4dHJhX21zcik7Cit9CisKK3ZvaWQgZHVtcF9saXN0KFBDQyAqcGNjKQoreworCXByaW50ZigiZHVtcF9saXN0IDB4JXBcbiIsIHBjYyk7CisKKwlmb3IgKDsgcGNjOyBwY2MgPSBwY2MtPm5leHQpCisJCWR1bXBfcGNjKHBjYyk7Cit9CisKK3ZvaWQgcHJpbnRfcGNjKFBDQyAqcCkKK3sKKwlkb3VibGUgaW50ZXJ2YWxfZmxvYXQ7CisKKwlpbnRlcnZhbF9mbG9hdCA9IHR2X2RlbHRhLnR2X3NlYyArIHR2X2RlbHRhLnR2X3VzZWMvMTAwMDAwMC4wOworCisJLyogdG9wb2xvZ3kgY29sdW1ucywgcHJpbnQgYmxhbmtzIG9uIDFzdCAoYXZlcmFnZSkgbGluZSAqLworCWlmIChwID09IHBjY19hdmVyYWdlKSB7CisJCWlmIChzaG93X3BrZykKKwkJCWZwcmludGYoc3RkZXJyLCAiICAgICIpOworCQlpZiAoc2hvd19jb3JlKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgIik7CisJCWlmIChzaG93X2NwdSkKKwkJCWZwcmludGYoc3RkZXJyLCAiICAgICIpOworCX0gZWxzZSB7CisJCWlmIChzaG93X3BrZykKKwkJCWZwcmludGYoc3RkZXJyLCAiJTRkIiwgcC0+cGtnKTsKKwkJaWYgKHNob3dfY29yZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJTRkIiwgcC0+Y29yZSk7CisJCWlmIChzaG93X2NwdSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJTRkIiwgcC0+Y3B1KTsKKwl9CisKKwkvKiAlYzAgKi8KKwlpZiAoZG9fbmhtX2NzdGF0ZXMpIHsKKwkJaWYgKCFza2lwX2MwKQorCQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+bXBlcmYvcC0+dHNjKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICIgICAqKioqIik7CisJfQorCisJLyogR0h6ICovCisJaWYgKGhhc19hcGVyZikgeworCQlpZiAoIWFwZXJmX21wZXJmX3Vuc3RhYmxlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiU1LjJmIiwKKwkJCQkxLjAgKiBwLT50c2MgLyB1bml0cyAqIHAtPmFwZXJmIC8KKwkJCQlwLT5tcGVyZiAvIGludGVydmFsX2Zsb2F0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwLT5hcGVyZiA+IHAtPnRzYyB8fCBwLT5tcGVyZiA+IHAtPnRzYykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiICoqKioiKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlNC4xZioiLAorCQkJCQkxLjAgKiBwLT50c2MgLworCQkJCQl1bml0cyAqIHAtPmFwZXJmIC8KKwkJCQkJcC0+bXBlcmYgLyBpbnRlcnZhbF9mbG9hdCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBUU0MgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIiU1LjJmIiwgMS4wICogcC0+dHNjL3VuaXRzL2ludGVydmFsX2Zsb2F0KTsKKworCWlmIChkb19uaG1fY3N0YXRlcykgeworCQlpZiAoIXNraXBfYzEpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5jMS9wLT50c2MpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICoqKioiKTsKKwl9CisJaWYgKGRvX25obV9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5jMy9wLT50c2MpOworCWlmIChkb19uaG1fY3N0YXRlcykKKwkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+YzYvcC0+dHNjKTsKKwlpZiAoZG9fc25iX2NzdGF0ZXMpCisJCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPmM3L3AtPnRzYyk7CisJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5wYzIvcC0+dHNjKTsKKwlpZiAoZG9fbmhtX2NzdGF0ZXMpCisJCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPnBjMy9wLT50c2MpOworCWlmIChkb19uaG1fY3N0YXRlcykKKwkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+cGM2L3AtPnRzYyk7CisJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5wYzcvcC0+dHNjKTsKKwlpZiAoZXh0cmFfbXNyX29mZnNldCkKKwkJZnByaW50ZihzdGRlcnIsICIgIDB4JTAxNmxseCIsIHAtPmV4dHJhX21zcik7CisJcHV0YygnXG4nLCBzdGRlcnIpOworfQorCit2b2lkIHByaW50X2NvdW50ZXJzKFBDQyAqY250KQoreworCVBDQyAqcGNjOworCisJcHJpbnRfaGVhZGVyKCk7CisKKwlpZiAobnVtX2NwdXMgPiAxKQorCQlwcmludF9wY2MocGNjX2F2ZXJhZ2UpOworCisJZm9yIChwY2MgPSBjbnQ7IHBjYyAhPSBOVUxMOyBwY2MgPSBwY2MtPm5leHQpCisJCXByaW50X3BjYyhwY2MpOworCit9CisKKyNkZWZpbmUgU1VCVFJBQ1RfQ09VTlRFUihhZnRlciwgYmVmb3JlLCBkZWx0YSkgKGRlbHRhID0gKGFmdGVyIC0gYmVmb3JlKSwgKGJlZm9yZSA+IGFmdGVyKSkKKworCitpbnQgY29tcHV0ZV9kZWx0YShQQ0MgKmFmdGVyLCBQQ0MgKmJlZm9yZSwgUENDICpkZWx0YSkKK3sKKwlpbnQgZXJyb3JzID0gMDsKKwlpbnQgcGVyZl9lcnIgPSAwOworCisJc2tpcF9jMCA9IHNraXBfYzEgPSAwOworCisJZm9yICggOyBhZnRlciAmJiBiZWZvcmUgJiYgZGVsdGE7CisJCWFmdGVyID0gYWZ0ZXItPm5leHQsIGJlZm9yZSA9IGJlZm9yZS0+bmV4dCwgZGVsdGEgPSBkZWx0YS0+bmV4dCkgeworCQlpZiAoYmVmb3JlLT5jcHUgIT0gYWZ0ZXItPmNwdSkgeworCQkJcHJpbnRmKCJjcHUgY29uZmlndXJhdGlvbiBjaGFuZ2VkOiAlZCAhPSAlZFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYWZ0ZXItPmNwdSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoU1VCVFJBQ1RfQ09VTlRFUihhZnRlci0+dHNjLCBiZWZvcmUtPnRzYywgZGVsdGEtPnRzYykpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY3B1JWQgVFNDIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT50c2MsIGFmdGVyLT50c2MpOworCQkJZXJyb3JzKys7CisJCX0KKwkJLyogY2hlY2sgZm9yIFRTQyA8IDEgTWN5Y2xlcyBvdmVyIGludGVydmFsICovCisJCWlmIChkZWx0YS0+dHNjIDwgKDEwMDAgKiAxMDAwKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnNhbmVseSBzbG93IFRTQyByYXRlLCIKKwkJCQkiIFRTQyBzdG9wcyBpbiBpZGxlP1xuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gZGlzYWJsZSBhbGwgYy1zdGF0ZXMiCisJCQkJIiBieSBib290aW5nIHdpdGggXCJpZGxlPXBvbGxcIlxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm9yIGp1c3QgdGhlIGRlZXAgb25lcyB3aXRoIgorCQkJCSIgXCJwcm9jZXNzb3IubWF4X2NzdGF0ZT0xXCJcbiIpOworCQkJZXhpdCgtMyk7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPmMzLCBiZWZvcmUtPmMzLCBkZWx0YS0+YzMpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIGMzIGNvdW50ZXIgd2VudCBiYWNrd2FyZHMgJWxsWCB0byAlbGxYXG4iLAorCQkJCWJlZm9yZS0+Y3B1LCBiZWZvcmUtPmMzLCBhZnRlci0+YzMpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPmM2LCBiZWZvcmUtPmM2LCBkZWx0YS0+YzYpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIGM2IGNvdW50ZXIgd2VudCBiYWNrd2FyZHMgJWxsWCB0byAlbGxYXG4iLAorCQkJCWJlZm9yZS0+Y3B1LCBiZWZvcmUtPmM2LCBhZnRlci0+YzYpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPmM3LCBiZWZvcmUtPmM3LCBkZWx0YS0+YzcpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIGM3IGNvdW50ZXIgd2VudCBiYWNrd2FyZHMgJWxsWCB0byAlbGxYXG4iLAorCQkJCWJlZm9yZS0+Y3B1LCBiZWZvcmUtPmM3LCBhZnRlci0+YzcpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPnBjMiwgYmVmb3JlLT5wYzIsIGRlbHRhLT5wYzIpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIHBjMiBjb3VudGVyIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT5wYzIsIGFmdGVyLT5wYzIpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPnBjMywgYmVmb3JlLT5wYzMsIGRlbHRhLT5wYzMpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIHBjMyBjb3VudGVyIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT5wYzMsIGFmdGVyLT5wYzMpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPnBjNiwgYmVmb3JlLT5wYzYsIGRlbHRhLT5wYzYpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIHBjNiBjb3VudGVyIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT5wYzYsIGFmdGVyLT5wYzYpOworCQkJZXJyb3JzKys7CisJCX0KKwkJaWYgKFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPnBjNywgYmVmb3JlLT5wYzcsIGRlbHRhLT5wYzcpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNwdSVkIHBjNyBjb3VudGVyIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT5wYzcsIGFmdGVyLT5wYzcpOworCQkJZXJyb3JzKys7CisJCX0KKworCQlwZXJmX2VyciA9IFNVQlRSQUNUX0NPVU5URVIoYWZ0ZXItPmFwZXJmLCBiZWZvcmUtPmFwZXJmLCBkZWx0YS0+YXBlcmYpOworCQlpZiAocGVyZl9lcnIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY3B1JWQgYXBlcmYgY291bnRlciB3ZW50IGJhY2t3YXJkcyAlbGxYIHRvICVsbFhcbiIsCisJCQkJYmVmb3JlLT5jcHUsIGJlZm9yZS0+YXBlcmYsIGFmdGVyLT5hcGVyZik7CisJCX0KKwkJcGVyZl9lcnIgfD0gU1VCVFJBQ1RfQ09VTlRFUihhZnRlci0+bXBlcmYsIGJlZm9yZS0+bXBlcmYsIGRlbHRhLT5tcGVyZik7CisJCWlmIChwZXJmX2VycikgeworCQkJZnByaW50ZihzdGRlcnIsICJjcHUlZCBtcGVyZiBjb3VudGVyIHdlbnQgYmFja3dhcmRzICVsbFggdG8gJWxsWFxuIiwKKwkJCQliZWZvcmUtPmNwdSwgYmVmb3JlLT5tcGVyZiwgYWZ0ZXItPm1wZXJmKTsKKwkJfQorCQlpZiAocGVyZl9lcnIpIHsKKwkJCWlmICghYXBlcmZfbXBlcmZfdW5zdGFibGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBBUEVSRiBvciBNUEVSRiB3ZW50IGJhY2t3YXJkcyAqXG4iLCBwcm9nbmFtZSk7CisJCQkJZnByaW50ZihzdGRlcnIsICIqIEZyZXF1ZW5jeSByZXN1bHRzIGRvIG5vdCBjb3ZlciBlbnRpcmUgaW50ZXJ2YWwgKlxuIik7CisJCQkJZnByaW50ZihzdGRlcnIsICIqIGZpeCB0aGlzIGJ5IHJ1bm5pbmcgTGludXgtMi42LjMwIG9yIGxhdGVyICpcbiIpOworCisJCQkJYXBlcmZfbXBlcmZfdW5zdGFibGUgPSAxOworCQkJfQorCQkJLyoKKwkJCSAqIG1wZXJmIGRlbHRhIGlzIGxpa2VseSBhIGh1Z2UgInBvc2l0aXZlIiBudW1iZXIKKwkJCSAqIGNhbiBub3QgdXNlIGl0IGZvciBjYWxjdWxhdGluZyBjMCB0aW1lCisJCQkgKi8KKwkJCXNraXBfYzAgPSAxOworCQkJc2tpcF9jMSA9IDE7CisJCX0KKworCQkvKgorCQkgKiBBcyBtcGVyZiBhbmQgdHNjIGNvbGxlY3Rpb24gYXJlIG5vdCBhdG9taWMsCisJCSAqIGl0IGlzIHBvc3NpYmxlIGZvciBtcGVyZidzIG5vbi1oYWx0ZWQgY3ljbGVzCisJCSAqIHRvIGV4Y2VlZCBUU0MncyBhbGwgY3ljbGVzOiBzaG93IGMxID0gMCUgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJaWYgKGRlbHRhLT5tcGVyZiA+IGRlbHRhLT50c2MpCisJCQlkZWx0YS0+YzEgPSAwOworCQllbHNlIC8qIG5vcm1hbCBjYXNlLCBkZXJpdmUgYzEgKi8KKwkJCWRlbHRhLT5jMSA9IGRlbHRhLT50c2MgLSBkZWx0YS0+bXBlcmYKKwkJCQktIGRlbHRhLT5jMyAtIGRlbHRhLT5jNiAtIGRlbHRhLT5jNzsKKworCQlpZiAoZGVsdGEtPm1wZXJmID09IDApCisJCQlkZWx0YS0+bXBlcmYgPSAxOwkvKiBkaXZpZGUgYnkgMCBwcm90ZWN0aW9uICovCisKKwkJLyoKKwkJICogZm9yICJleHRyYSBtc3IiLCBqdXN0IGNvcHkgdGhlIGxhdGVzdCB3L28gc3VidHJhY3RpbmcKKwkJICovCisJCWRlbHRhLT5leHRyYV9tc3IgPSBhZnRlci0+ZXh0cmFfbXNyOworCQlpZiAoZXJyb3JzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGNwdSVkIGJlZm9yZTpcbiIsIGJlZm9yZS0+Y3B1KTsKKwkJCWR1bXBfcGNjKGJlZm9yZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGNwdSVkIGFmdGVyOlxuIiwgYmVmb3JlLT5jcHUpOworCQkJZHVtcF9wY2MoYWZ0ZXIpOworCQkJZXJyb3JzID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb21wdXRlX2F2ZXJhZ2UoUENDICpkZWx0YSwgUENDICphdmcpCit7CisJUENDICpzdW07CisKKwlzdW0gPSBjYWxsb2MoMSwgc2l6ZW9mKFBDQykpOworCWlmIChzdW0gPT0gTlVMTCkgeworCQlwZXJyb3IoImNhbGxvYyBzdW0iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlmb3IgKDsgZGVsdGE7IGRlbHRhID0gZGVsdGEtPm5leHQpIHsKKwkJc3VtLT50c2MgKz0gZGVsdGEtPnRzYzsKKwkJc3VtLT5jMSArPSBkZWx0YS0+YzE7CisJCXN1bS0+YzMgKz0gZGVsdGEtPmMzOworCQlzdW0tPmM2ICs9IGRlbHRhLT5jNjsKKwkJc3VtLT5jNyArPSBkZWx0YS0+Yzc7CisJCXN1bS0+YXBlcmYgKz0gZGVsdGEtPmFwZXJmOworCQlzdW0tPm1wZXJmICs9IGRlbHRhLT5tcGVyZjsKKwkJc3VtLT5wYzIgKz0gZGVsdGEtPnBjMjsKKwkJc3VtLT5wYzMgKz0gZGVsdGEtPnBjMzsKKwkJc3VtLT5wYzYgKz0gZGVsdGEtPnBjNjsKKwkJc3VtLT5wYzcgKz0gZGVsdGEtPnBjNzsKKwl9CisJYXZnLT50c2MgPSBzdW0tPnRzYy9udW1fY3B1czsKKwlhdmctPmMxID0gc3VtLT5jMS9udW1fY3B1czsKKwlhdmctPmMzID0gc3VtLT5jMy9udW1fY3B1czsKKwlhdmctPmM2ID0gc3VtLT5jNi9udW1fY3B1czsKKwlhdmctPmM3ID0gc3VtLT5jNy9udW1fY3B1czsKKwlhdmctPmFwZXJmID0gc3VtLT5hcGVyZi9udW1fY3B1czsKKwlhdmctPm1wZXJmID0gc3VtLT5tcGVyZi9udW1fY3B1czsKKwlhdmctPnBjMiA9IHN1bS0+cGMyL251bV9jcHVzOworCWF2Zy0+cGMzID0gc3VtLT5wYzMvbnVtX2NwdXM7CisJYXZnLT5wYzYgPSBzdW0tPnBjNi9udW1fY3B1czsKKwlhdmctPnBjNyA9IHN1bS0+cGM3L251bV9jcHVzOworCisJZnJlZShzdW0pOworfQorCit2b2lkIGdldF9jb3VudGVycyhQQ0MgKnBjYykKK3sKKwlmb3IgKCA7IHBjYzsgcGNjID0gcGNjLT5uZXh0KSB7CisJCXBjYy0+dHNjID0gZ2V0X21zcihwY2MtPmNwdSwgTVNSX1RTQyk7CisJCWlmIChkb19uaG1fY3N0YXRlcykKKwkJCXBjYy0+YzMgPSBnZXRfbXNyKHBjYy0+Y3B1LCBNU1JfQ09SRV9DM19SRVNJREVOQ1kpOworCQlpZiAoZG9fbmhtX2NzdGF0ZXMpCisJCQlwY2MtPmM2ID0gZ2V0X21zcihwY2MtPmNwdSwgTVNSX0NPUkVfQzZfUkVTSURFTkNZKTsKKwkJaWYgKGRvX3NuYl9jc3RhdGVzKQorCQkJcGNjLT5jNyA9IGdldF9tc3IocGNjLT5jcHUsIE1TUl9DT1JFX0M3X1JFU0lERU5DWSk7CisJCWlmIChoYXNfYXBlcmYpCisJCQlwY2MtPmFwZXJmID0gZ2V0X21zcihwY2MtPmNwdSwgTVNSX0FQRVJGKTsKKwkJaWYgKGhhc19hcGVyZikKKwkJCXBjYy0+bXBlcmYgPSBnZXRfbXNyKHBjYy0+Y3B1LCBNU1JfTVBFUkYpOworCQlpZiAoZG9fc25iX2NzdGF0ZXMpCisJCQlwY2MtPnBjMiA9IGdldF9tc3IocGNjLT5jcHUsIE1TUl9QS0dfQzJfUkVTSURFTkNZKTsKKwkJaWYgKGRvX25obV9jc3RhdGVzKQorCQkJcGNjLT5wYzMgPSBnZXRfbXNyKHBjYy0+Y3B1LCBNU1JfUEtHX0MzX1JFU0lERU5DWSk7CisJCWlmIChkb19uaG1fY3N0YXRlcykKKwkJCXBjYy0+cGM2ID0gZ2V0X21zcihwY2MtPmNwdSwgTVNSX1BLR19DNl9SRVNJREVOQ1kpOworCQlpZiAoZG9fc25iX2NzdGF0ZXMpCisJCQlwY2MtPnBjNyA9IGdldF9tc3IocGNjLT5jcHUsIE1TUl9QS0dfQzdfUkVTSURFTkNZKTsKKwkJaWYgKGV4dHJhX21zcl9vZmZzZXQpCisJCQlwY2MtPmV4dHJhX21zciA9IGdldF9tc3IocGNjLT5jcHUsIGV4dHJhX21zcl9vZmZzZXQpOworCX0KK30KKworCit2b2lkIHByaW50X25laGFsZW1faW5mbygpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG1zcjsKKwl1bnNpZ25lZCBpbnQgcmF0aW87CisKKwlpZiAoIWRvX25laGFsZW1fcGxhdGZvcm1faW5mbykKKwkJcmV0dXJuOworCisJbXNyID0gZ2V0X21zcigwLCBNU1JfTkVIQUxFTV9QTEFURk9STV9JTkZPKTsKKworCXJhdGlvID0gKG1zciA+PiA0MCkgJiAweEZGOworCWZwcmludGYoc3RkZXJyLCAiJWQgKiAlLjBmID0gJS4wZiBNSHogbWF4IGVmZmljaWVuY3lcbiIsCisJCXJhdGlvLCBiY2xrLCByYXRpbyAqIGJjbGspOworCisJcmF0aW8gPSAobXNyID4+IDgpICYgMHhGRjsKKwlmcHJpbnRmKHN0ZGVyciwgIiVkICogJS4wZiA9ICUuMGYgTUh6IFRTQyBmcmVxdWVuY3lcbiIsCisJCXJhdGlvLCBiY2xrLCByYXRpbyAqIGJjbGspOworCisJaWYgKHZlcmJvc2UgPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgIk1TUl9ORUhBTEVNX1BMQVRGT1JNX0lORk86IDB4JWxseFxuIiwgbXNyKTsKKworCWlmICghZG9fbmVoYWxlbV90dXJib19yYXRpb19saW1pdCkKKwkJcmV0dXJuOworCisJbXNyID0gZ2V0X21zcigwLCBNU1JfTkVIQUxFTV9UVVJCT19SQVRJT19MSU1JVCk7CisKKwlyYXRpbyA9IChtc3IgPj4gMjQpICYgMHhGRjsKKwlpZiAocmF0aW8pCisJCWZwcmludGYoc3RkZXJyLCAiJWQgKiAlLjBmID0gJS4wZiBNSHogbWF4IHR1cmJvIDQgYWN0aXZlIGNvcmVzXG4iLAorCQkJcmF0aW8sIGJjbGssIHJhdGlvICogYmNsayk7CisKKwlyYXRpbyA9IChtc3IgPj4gMTYpICYgMHhGRjsKKwlpZiAocmF0aW8pCisJCWZwcmludGYoc3RkZXJyLCAiJWQgKiAlLjBmID0gJS4wZiBNSHogbWF4IHR1cmJvIDMgYWN0aXZlIGNvcmVzXG4iLAorCQkJcmF0aW8sIGJjbGssIHJhdGlvICogYmNsayk7CisKKwlyYXRpbyA9IChtc3IgPj4gOCkgJiAweEZGOworCWlmIChyYXRpbykKKwkJZnByaW50ZihzdGRlcnIsICIlZCAqICUuMGYgPSAlLjBmIE1IeiBtYXggdHVyYm8gMiBhY3RpdmUgY29yZXNcbiIsCisJCQlyYXRpbywgYmNsaywgcmF0aW8gKiBiY2xrKTsKKworCXJhdGlvID0gKG1zciA+PiAwKSAmIDB4RkY7CisJaWYgKHJhdGlvKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVkICogJS4wZiA9ICUuMGYgTUh6IG1heCB0dXJibyAxIGFjdGl2ZSBjb3Jlc1xuIiwKKwkJCXJhdGlvLCBiY2xrLCByYXRpbyAqIGJjbGspOworCit9CisKK3ZvaWQgZnJlZV9jb3VudGVyX2xpc3QoUENDICpsaXN0KQoreworCVBDQyAqcDsKKworCWZvciAocCA9IGxpc3Q7IHA7ICkgeworCQlQQ0MgKmZyZWVfbWU7CisKKwkJZnJlZV9tZSA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlmcmVlKGZyZWVfbWUpOworCX0KKwlyZXR1cm47Cit9CisKK3ZvaWQgZnJlZV9hbGxfY291bnRlcnModm9pZCkKK3sKKwlmcmVlX2NvdW50ZXJfbGlzdChwY2NfZXZlbik7CisJcGNjX2V2ZW4gPSBOVUxMOworCisJZnJlZV9jb3VudGVyX2xpc3QocGNjX29kZCk7CisJcGNjX29kZCA9IE5VTEw7CisKKwlmcmVlX2NvdW50ZXJfbGlzdChwY2NfZGVsdGEpOworCXBjY19kZWx0YSA9IE5VTEw7CisKKwlmcmVlX2NvdW50ZXJfbGlzdChwY2NfYXZlcmFnZSk7CisJcGNjX2F2ZXJhZ2UgPSBOVUxMOworfQorCit2b2lkIGluc2VydF9jcHVfY291bnRlcnMoUENDICoqbGlzdCwgUENDICpuZXcpCit7CisJUENDICpwcmV2OworCisJLyoKKwkgKiBsaXN0IHdhcyBlbXB0eQorCSAqLworCWlmICgqbGlzdCA9PSBOVUxMKSB7CisJCW5ldy0+bmV4dCA9ICpsaXN0OworCQkqbGlzdCA9IG5ldzsKKwkJcmV0dXJuOworCX0KKworCXNob3dfY3B1ID0gMTsJLyogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBDUFUgKi8KKworCS8qCisJICogaW5zZXJ0IG9uIGZyb250IG9mIGxpc3QuCisJICogSXQgaXMgc29ydGVkIGJ5IGFzY2VuZGluZyBwYWNrYWdlIywgY29yZSMsIGNwdSMKKwkgKi8KKwlpZiAoKCgqbGlzdCktPnBrZyA+IG5ldy0+cGtnKSB8fAorCSAgICAoKCgqbGlzdCktPnBrZyA9PSBuZXctPnBrZykgJiYgKCgqbGlzdCktPmNvcmUgPiBuZXctPmNvcmUpKSB8fAorCSAgICAoKCgqbGlzdCktPnBrZyA9PSBuZXctPnBrZykgJiYgKCgqbGlzdCktPmNvcmUgPT0gbmV3LT5jb3JlKSAmJiAoKCpsaXN0KS0+Y3B1ID4gbmV3LT5jcHUpKSkgeworCQluZXctPm5leHQgPSAqbGlzdDsKKwkJKmxpc3QgPSBuZXc7CisJCXJldHVybjsKKwl9CisKKwlwcmV2ID0gKmxpc3Q7CisKKwl3aGlsZSAocHJldi0+bmV4dCAmJiAocHJldi0+bmV4dC0+cGtnIDwgbmV3LT5wa2cpKSB7CisJCXByZXYgPSBwcmV2LT5uZXh0OworCQlzaG93X3BrZyA9IDE7CS8qIHRoZXJlIGlzIG1vcmUgdGhhbiAxIHBhY2thZ2UgKi8KKwl9CisKKwl3aGlsZSAocHJldi0+bmV4dCAmJiAocHJldi0+bmV4dC0+cGtnID09IG5ldy0+cGtnKQorCQkmJiAocHJldi0+bmV4dC0+Y29yZSA8IG5ldy0+Y29yZSkpIHsKKwkJcHJldiA9IHByZXYtPm5leHQ7CisJCXNob3dfY29yZSA9IDE7CS8qIHRoZXJlIGlzIG1vcmUgdGhhbiAxIGNvcmUgKi8KKwl9CisKKwl3aGlsZSAocHJldi0+bmV4dCAmJiAocHJldi0+bmV4dC0+cGtnID09IG5ldy0+cGtnKQorCQkmJiAocHJldi0+bmV4dC0+Y29yZSA9PSBuZXctPmNvcmUpCisJCSYmIChwcmV2LT5uZXh0LT5jcHUgPCBuZXctPmNwdSkpIHsKKwkJcHJldiA9IHByZXYtPm5leHQ7CisJfQorCisJLyoKKwkgKiBpbnNlcnQgYWZ0ZXIgInByZXYiCisJICovCisJbmV3LT5uZXh0ID0gcHJldi0+bmV4dDsKKwlwcmV2LT5uZXh0ID0gbmV3OworCisJcmV0dXJuOworfQorCit2b2lkIGFsbG9jX25ld19jcHVfY291bnRlcnMoaW50IHBrZywgaW50IGNvcmUsIGludCBjcHUpCit7CisJUENDICpuZXc7CisKKwlpZiAodmVyYm9zZSA+IDEpCisJCXByaW50ZigicGtnJWQgY29yZSVkLCBjcHUlZFxuIiwgcGtnLCBjb3JlLCBjcHUpOworCisJbmV3ID0gKFBDQyAqKWNhbGxvYygxLCBzaXplb2YoUENDKSk7CisJaWYgKG5ldyA9PSBOVUxMKSB7CisJCXBlcnJvcigiY2FsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCW5ldy0+cGtnID0gcGtnOworCW5ldy0+Y29yZSA9IGNvcmU7CisJbmV3LT5jcHUgPSBjcHU7CisJaW5zZXJ0X2NwdV9jb3VudGVycygmcGNjX29kZCwgbmV3KTsKKworCW5ldyA9IChQQ0MgKiljYWxsb2MoMSwgc2l6ZW9mKFBDQykpOworCWlmIChuZXcgPT0gTlVMTCkgeworCQlwZXJyb3IoImNhbGxvYyIpOworCQlleGl0KDEpOworCX0KKwluZXctPnBrZyA9IHBrZzsKKwluZXctPmNvcmUgPSBjb3JlOworCW5ldy0+Y3B1ID0gY3B1OworCWluc2VydF9jcHVfY291bnRlcnMoJnBjY19ldmVuLCBuZXcpOworCisJbmV3ID0gKFBDQyAqKWNhbGxvYygxLCBzaXplb2YoUENDKSk7CisJaWYgKG5ldyA9PSBOVUxMKSB7CisJCXBlcnJvcigiY2FsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCW5ldy0+cGtnID0gcGtnOworCW5ldy0+Y29yZSA9IGNvcmU7CisJbmV3LT5jcHUgPSBjcHU7CisJaW5zZXJ0X2NwdV9jb3VudGVycygmcGNjX2RlbHRhLCBuZXcpOworCisJbmV3ID0gKFBDQyAqKWNhbGxvYygxLCBzaXplb2YoUENDKSk7CisJaWYgKG5ldyA9PSBOVUxMKSB7CisJCXBlcnJvcigiY2FsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCW5ldy0+cGtnID0gcGtnOworCW5ldy0+Y29yZSA9IGNvcmU7CisJbmV3LT5jcHUgPSBjcHU7CisJcGNjX2F2ZXJhZ2UgPSBuZXc7Cit9CisKK2ludCBnZXRfcGh5c2ljYWxfcGFja2FnZV9pZChpbnQgY3B1KQoreworCWNoYXIgcGF0aFs2NF07CisJRklMRSAqZmlsZXA7CisJaW50IHBrZzsKKworCXNwcmludGYocGF0aCwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSVkL3RvcG9sb2d5L3BoeXNpY2FsX3BhY2thZ2VfaWQiLCBjcHUpOworCWZpbGVwID0gZm9wZW4ocGF0aCwgInIiKTsKKwlpZiAoZmlsZXAgPT0gTlVMTCkgeworCQlwZXJyb3IocGF0aCk7CisJCWV4aXQoMSk7CisJfQorCWZzY2FuZihmaWxlcCwgIiVkIiwgJnBrZyk7CisJZmNsb3NlKGZpbGVwKTsKKwlyZXR1cm4gcGtnOworfQorCitpbnQgZ2V0X2NvcmVfaWQoaW50IGNwdSkKK3sKKwljaGFyIHBhdGhbNjRdOworCUZJTEUgKmZpbGVwOworCWludCBjb3JlOworCisJc3ByaW50ZihwYXRoLCAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JWQvdG9wb2xvZ3kvY29yZV9pZCIsIGNwdSk7CisJZmlsZXAgPSBmb3BlbihwYXRoLCAiciIpOworCWlmIChmaWxlcCA9PSBOVUxMKSB7CisJCXBlcnJvcihwYXRoKTsKKwkJZXhpdCgxKTsKKwl9CisJZnNjYW5mKGZpbGVwLCAiJWQiLCAmY29yZSk7CisJZmNsb3NlKGZpbGVwKTsKKwlyZXR1cm4gY29yZTsKK30KKworLyoKKyAqIHJ1biBmdW5jKGluZGV4LCBjcHUpIG9uIGV2ZXJ5IGNwdSBpbiAvcHJvYy9zdGF0CisgKi8KKworaW50IGZvcl9hbGxfY3B1cyh2b2lkIChmdW5jKShpbnQsIGludCwgaW50KSkKK3sKKwlGSUxFICpmcDsKKwlpbnQgY3B1X2NvdW50OworCWludCByZXR2YWw7CisKKwlmcCA9IGZvcGVuKHByb2Nfc3RhdCwgInIiKTsKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlwZXJyb3IocHJvY19zdGF0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR2YWwgPSBmc2NhbmYoZnAsICJjcHUgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkXG4iKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJcGVycm9yKCIvcHJvYy9zdGF0IGZvcm1hdCIpOworCQlleGl0KDEpOworCX0KKworCWZvciAoY3B1X2NvdW50ID0gMDsgOyBjcHVfY291bnQrKykgeworCQlpbnQgY3B1OworCisJCXJldHZhbCA9IGZzY2FuZihmcCwgImNwdSV1ICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZFxuIiwgJmNwdSk7CisJCWlmIChyZXR2YWwgIT0gMSkKKwkJCWJyZWFrOworCisJCWZ1bmMoZ2V0X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KSwgZ2V0X2NvcmVfaWQoY3B1KSwgY3B1KTsKKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gY3B1X2NvdW50OworfQorCit2b2lkIHJlX2luaXRpYWxpemUodm9pZCkKK3sKKwlwcmludGYoInR1cmJvc3RhdDogdG9wb2xvZ3kgY2hhbmdlZCwgcmUtaW5pdGlhbGl6aW5nLlxuIik7CisJZnJlZV9hbGxfY291bnRlcnMoKTsKKwludW1fY3B1cyA9IGZvcl9hbGxfY3B1cyhhbGxvY19uZXdfY3B1X2NvdW50ZXJzKTsKKwluZWVkX3JlaW5pdGlhbGl6ZSA9IDA7CisJcHJpbnRmKCJudW1fY3B1cyBpcyBub3cgJWRcbiIsIG51bV9jcHVzKTsKK30KKwordm9pZCBkdW1teShpbnQgcGtnLCBpbnQgY29yZSwgaW50IGNwdSkgeyByZXR1cm47IH0KKy8qCisgKiBjaGVjayB0byBzZWUgaWYgYSBjcHUgY2FtZSBvbi1saW5lCisgKi8KK3ZvaWQgdmVyaWZ5X251bV9jcHVzKCkKK3sKKwlpbnQgbmV3X251bV9jcHVzOworCisJbmV3X251bV9jcHVzID0gZm9yX2FsbF9jcHVzKGR1bW15KTsKKworCWlmIChuZXdfbnVtX2NwdXMgIT0gbnVtX2NwdXMpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIm51bV9jcHVzIHdhcyAlZCwgaXMgbm93ICAlZFxuIiwKKwkJCQludW1fY3B1cywgbmV3X251bV9jcHVzKTsKKwkJbmVlZF9yZWluaXRpYWxpemUgPSAxOworCX0KKworCXJldHVybjsKK30KKwordm9pZCB0dXJib3N0YXRfbG9vcCgpCit7CityZXN0YXJ0OgorCWdldF9jb3VudGVycyhwY2NfZXZlbik7CisJZ2V0dGltZW9mZGF5KCZ0dl9ldmVuLCAoc3RydWN0IHRpbWV6b25lICopTlVMTCk7CisKKwl3aGlsZSAoMSkgeworCQl2ZXJpZnlfbnVtX2NwdXMoKTsKKwkJaWYgKG5lZWRfcmVpbml0aWFsaXplKSB7CisJCQlyZV9pbml0aWFsaXplKCk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJc2xlZXAoaW50ZXJ2YWxfc2VjKTsKKwkJZ2V0X2NvdW50ZXJzKHBjY19vZGQpOworCQlnZXR0aW1lb2ZkYXkoJnR2X29kZCwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOworCisJCWNvbXB1dGVfZGVsdGEocGNjX29kZCwgcGNjX2V2ZW4sIHBjY19kZWx0YSk7CisJCXRpbWVyc3ViKCZ0dl9vZGQsICZ0dl9ldmVuLCAmdHZfZGVsdGEpOworCQljb21wdXRlX2F2ZXJhZ2UocGNjX2RlbHRhLCBwY2NfYXZlcmFnZSk7CisJCXByaW50X2NvdW50ZXJzKHBjY19kZWx0YSk7CisJCWlmIChuZWVkX3JlaW5pdGlhbGl6ZSkgeworCQkJcmVfaW5pdGlhbGl6ZSgpOworCQkJZ290byByZXN0YXJ0OworCQl9CisJCXNsZWVwKGludGVydmFsX3NlYyk7CisJCWdldF9jb3VudGVycyhwY2NfZXZlbik7CisJCWdldHRpbWVvZmRheSgmdHZfZXZlbiwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOworCQljb21wdXRlX2RlbHRhKHBjY19ldmVuLCBwY2Nfb2RkLCBwY2NfZGVsdGEpOworCQl0aW1lcnN1YigmdHZfZXZlbiwgJnR2X29kZCwgJnR2X2RlbHRhKTsKKwkJY29tcHV0ZV9hdmVyYWdlKHBjY19kZWx0YSwgcGNjX2F2ZXJhZ2UpOworCQlwcmludF9jb3VudGVycyhwY2NfZGVsdGEpOworCX0KK30KKwordm9pZCBjaGVja19kZXZfbXNyKCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworCWlmIChzdGF0KCIvZGV2L2NwdS8wL21zciIsICZzYikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJubyAvZGV2L2NwdS8wL21zclxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiVHJ5IFwiIyBtb2Rwcm9iZSBtc3JcIlxuIik7CisJCWV4aXQoLTUpOworCX0KK30KKwordm9pZCBjaGVja19zdXBlcl91c2VyKCkKK3sKKwlpZiAoZ2V0dWlkKCkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm11c3QgYmUgcm9vdFxuIik7CisJCWV4aXQoLTYpOworCX0KK30KKworaW50IGhhc19uZWhhbGVtX3R1cmJvX3JhdGlvX2xpbWl0KHVuc2lnbmVkIGludCBmYW1pbHksIHVuc2lnbmVkIGludCBtb2RlbCkKK3sKKwlpZiAoIWdlbnVpbmVfaW50ZWwpCisJCXJldHVybiAwOworCisJaWYgKGZhbWlseSAhPSA2KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobW9kZWwpIHsKKwljYXNlIDB4MUE6CS8qIENvcmUgaTcsIFhlb24gNTUwMCBzZXJpZXMgLSBCbG9vbWZpZWxkLCBHYWluc3Rvd24gTkhNLUVQICovCisJY2FzZSAweDFFOgkvKiBDb3JlIGk3IGFuZCBpNSBQcm9jZXNzb3IgLSBDbGFya3NmaWVsZCwgTHlubmZpZWxkLCBKYXNwZXIgRm9yZXN0ICovCisJY2FzZSAweDFGOgkvKiBDb3JlIGk3IGFuZCBpNSBQcm9jZXNzb3IgLSBOZWhhbGVtICovCisJY2FzZSAweDI1OgkvKiBXZXN0bWVyZSBDbGllbnQgLSBDbGFya2RhbGUsIEFycmFuZGFsZSAqLworCWNhc2UgMHgyQzoJLyogV2VzdG1lcmUgRVAgLSBHdWxmdG93biAqLworCWNhc2UgMHgyQToJLyogU05CICovCisJY2FzZSAweDJEOgkvKiBTTkIgWGVvbiAqLworCQlyZXR1cm4gMTsKKwljYXNlIDB4MkU6CS8qIE5laGFsZW0tRVggWGVvbiAtIEJlY2t0b24gKi8KKwljYXNlIDB4MkY6CS8qIFdlc3RtZXJlLUVYIFhlb24gLSBFYWdsZXRvbiAqLworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworaW50IGlzX3NuYih1bnNpZ25lZCBpbnQgZmFtaWx5LCB1bnNpZ25lZCBpbnQgbW9kZWwpCit7CisJaWYgKCFnZW51aW5lX2ludGVsKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAobW9kZWwpIHsKKwljYXNlIDB4MkE6CisJY2FzZSAweDJEOgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2RvdWJsZSBkaXNjb3Zlcl9iY2xrKHVuc2lnbmVkIGludCBmYW1pbHksIHVuc2lnbmVkIGludCBtb2RlbCkKK3sKKwlpZiAoaXNfc25iKGZhbWlseSwgbW9kZWwpKQorCQlyZXR1cm4gMTAwLjAwOworCWVsc2UKKwkJcmV0dXJuIDEzMy4zMzsKK30KKwordm9pZCBjaGVja19jcHVpZCgpCit7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeCwgbWF4X2xldmVsOworCXVuc2lnbmVkIGludCBmbXMsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nOworCisJZWF4ID0gZWJ4ID0gZWN4ID0gZWR4ID0gMDsKKworCWFzbSgiY3B1aWQiIDogIj1hIiAobWF4X2xldmVsKSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KSA6ICJhIiAoMCkpOworCisJaWYgKGVieCA9PSAweDc1NmU2NTQ3ICYmIGVkeCA9PSAweDQ5NjU2ZTY5ICYmIGVjeCA9PSAweDZjNjU3NDZlKQorCQlnZW51aW5lX2ludGVsID0gMTsKKworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIiUuNHMlLjRzJS40cyAiLAorCQkJKGNoYXIgKikmZWJ4LCAoY2hhciAqKSZlZHgsIChjaGFyICopJmVjeCk7CisKKwlhc20oImNwdWlkIiA6ICI9YSIgKGZtcyksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkgOiAiYSIgKDEpIDogImVieCIpOworCWZhbWlseSA9IChmbXMgPj4gOCkgJiAweGY7CisJbW9kZWwgPSAoZm1zID4+IDQpICYgMHhmOworCXN0ZXBwaW5nID0gZm1zICYgMHhmOworCWlmIChmYW1pbHkgPT0gNiB8fCBmYW1pbHkgPT0gMHhmKQorCQltb2RlbCArPSAoKGZtcyA+PiAxNikgJiAweGYpIDw8IDQ7CisKKwlpZiAodmVyYm9zZSkKKwkJZnByaW50ZihzdGRlcnIsICIlZCBDUFVJRCBsZXZlbHM7IGZhbWlseTptb2RlbDpzdGVwcGluZyAweCV4OiV4OiV4ICglZDolZDolZClcbiIsCisJCQltYXhfbGV2ZWwsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nLCBmYW1pbHksIG1vZGVsLCBzdGVwcGluZyk7CisKKwlpZiAoIShlZHggJiAoMSA8PCA1KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDUFVJRDogbm8gTVNSXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIGNoZWNrIG1heCBleHRlbmRlZCBmdW5jdGlvbiBsZXZlbHMgb2YgQ1BVSUQuCisJICogVGhpcyBpcyBuZWVkZWQgdG8gY2hlY2sgZm9yIGludmFyaWFudCBUU0MuCisJICogVGhpcyBjaGVjayBpcyB2YWxpZCBmb3IgYm90aCBJbnRlbCBhbmQgQU1ELgorCSAqLworCWVieCA9IGVjeCA9IGVkeCA9IDA7CisJYXNtKCJjcHVpZCIgOiAiPWEiIChtYXhfbGV2ZWwpLCAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpIDogImEiICgweDgwMDAwMDAwKSk7CisKKwlpZiAobWF4X2xldmVsIDwgMHg4MDAwMDAwNykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNQVUlEOiBubyBpbnZhcmlhbnQgVFNDIChtYXhfbGV2ZWwgMHgleClcbiIsIG1heF9sZXZlbCk7CisJCWV4aXQoMSk7CisJfQorCisJLyoKKwkgKiBOb24tU3RvcCBUU0MgaXMgYWR2ZXJ0aXNlZCBieSBDUFVJRC5FQVg9MHg4MDAwMDAwNzogRURYLmJpdDgKKwkgKiB0aGlzIGNoZWNrIGlzIHZhbGlkIGZvciBib3RoIEludGVsIGFuZCBBTUQKKwkgKi8KKwlhc20oImNwdWlkIiA6ICI9YSIgKGVheCksICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkgOiAiYSIgKDB4ODAwMDAwMDcpKTsKKwloYXNfaW52YXJpYW50X3RzYyA9IGVkeCAmJiAoMSA8PCA4KTsKKworCWlmICghaGFzX2ludmFyaWFudF90c2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBpbnZhcmlhbnQgVFNDXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIEFQRVJGL01QRVJGIGlzIGFkdmVydGlzZWQgYnkgQ1BVSUQuRUFYPTB4NjogRUNYLmJpdDAKKwkgKiB0aGlzIGNoZWNrIGlzIHZhbGlkIGZvciBib3RoIEludGVsIGFuZCBBTUQKKwkgKi8KKworCWFzbSgiY3B1aWQiIDogIj1hIiAoZWF4KSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KSA6ICJhIiAoMHg2KSk7CisJaGFzX2FwZXJmID0gZWN4ICYmICgxIDw8IDApOworCWlmICghaGFzX2FwZXJmKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gQVBFUkYgTVNSXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkb19uZWhhbGVtX3BsYXRmb3JtX2luZm8gPSBnZW51aW5lX2ludGVsICYmIGhhc19pbnZhcmlhbnRfdHNjOworCWRvX25obV9jc3RhdGVzID0gZ2VudWluZV9pbnRlbDsJLyogYWxsIEludGVsIHcvIG5vbi1zdG9wIFRTQyBoYXZlIE5ITSBjb3VudGVycyAqLworCWRvX3NuYl9jc3RhdGVzID0gaXNfc25iKGZhbWlseSwgbW9kZWwpOworCWJjbGsgPSBkaXNjb3Zlcl9iY2xrKGZhbWlseSwgbW9kZWwpOworCisJZG9fbmVoYWxlbV90dXJib19yYXRpb19saW1pdCA9IGhhc19uZWhhbGVtX3R1cmJvX3JhdGlvX2xpbWl0KGZhbWlseSwgbW9kZWwpOworfQorCisKK3ZvaWQgdXNhZ2UoKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6IFstdl0gWy1NIE1TUiNdIFstaSBpbnRlcnZhbF9zZWMgfCBjb21tYW5kIC4uLl1cbiIsCisJCXByb2duYW1lKTsKKwlleGl0KDEpOworfQorCisKKy8qCisgKiBpbiAvZGV2L2NwdS8gcmV0dXJuIHN1Y2Nlc3MgZm9yIG5hbWVzIHRoYXQgYXJlIG51bWJlcnMKKyAqIGllLiBmaWx0ZXIgb3V0ICIuIiwgIi4uIiwgIm1pY3JvY29kZSIuCisgKi8KK2ludCBkaXJfZmlsdGVyKGNvbnN0IHN0cnVjdCBkaXJlbnQgKmRpcnApCit7CisJaWYgKGlzZGlnaXQoZGlycC0+ZF9uYW1lWzBdKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworaW50IG9wZW5fZGV2X2NwdV9tc3IoaW50IGR1bW15MSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0dXJib3N0YXRfaW5pdCgpCit7CisJY2hlY2tfY3B1aWQoKTsKKworCWNoZWNrX2Rldl9tc3IoKTsKKwljaGVja19zdXBlcl91c2VyKCk7CisKKwludW1fY3B1cyA9IGZvcl9hbGxfY3B1cyhhbGxvY19uZXdfY3B1X2NvdW50ZXJzKTsKKworCWlmICh2ZXJib3NlKQorCQlwcmludF9uZWhhbGVtX2luZm8oKTsKK30KKworaW50IGZvcmtfaXQoY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbDsKKwlwaWRfdCBjaGlsZF9waWQ7CisJZ2V0X2NvdW50ZXJzKHBjY19ldmVuKTsKKwlnZXR0aW1lb2ZkYXkoJnR2X2V2ZW4sIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKKworCWNoaWxkX3BpZCA9IGZvcmsoKTsKKwlpZiAoIWNoaWxkX3BpZCkgeworCQkvKiBjaGlsZCAqLworCQlleGVjdnAoYXJndlswXSwgYXJndik7CisJfSBlbHNlIHsKKwkJaW50IHN0YXR1czsKKworCQkvKiBwYXJlbnQgKi8KKwkJaWYgKGNoaWxkX3BpZCA9PSAtMSkgeworCQkJcGVycm9yKCJmb3JrIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKwkJaWYgKHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkgeworCQkJcGVycm9yKCJ3YWl0Iik7CisJCQlleGl0KDEpOworCQl9CisJfQorCWdldF9jb3VudGVycyhwY2Nfb2RkKTsKKwlnZXR0aW1lb2ZkYXkoJnR2X29kZCwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOworCXJldHZhbCA9IGNvbXB1dGVfZGVsdGEocGNjX29kZCwgcGNjX2V2ZW4sIHBjY19kZWx0YSk7CisKKwl0aW1lcnN1YigmdHZfb2RkLCAmdHZfZXZlbiwgJnR2X2RlbHRhKTsKKwljb21wdXRlX2F2ZXJhZ2UocGNjX2RlbHRhLCBwY2NfYXZlcmFnZSk7CisJaWYgKCFyZXR2YWwpCisJCXByaW50X2NvdW50ZXJzKHBjY19kZWx0YSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiUuNmYgc2VjXG4iLCB0dl9kZWx0YS50dl9zZWMgKyB0dl9kZWx0YS50dl91c2VjLzEwMDAwMDAuMCk7OworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY21kbGluZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdDsKKworCXByb2duYW1lID0gYXJndlswXTsKKworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIrdmk6TToiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAndic6CisJCQl2ZXJib3NlKys7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpbnRlcnZhbF9zZWMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQlzc2NhbmYob3B0YXJnLCAiJXgiLCAmZXh0cmFfbXNyX29mZnNldCk7CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJZnByaW50ZihzdGRlcnIsICJNU1IgMHglWFxuIiwgZXh0cmFfbXNyX29mZnNldCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljbWRsaW5lKGFyZ2MsIGFyZ3YpOworCisJaWYgKHZlcmJvc2UgPiAxKQorCQlmcHJpbnRmKHN0ZGVyciwgInR1cmJvc3RhdCBEZWMgNiwgMjAxMCIKKwkJCSIgLSBMZW4gQnJvd24gPGxlbmJAa2VybmVsLm9yZz5cbiIpOworCWlmICh2ZXJib3NlID4gMSkKKwkJZnByaW50ZihzdGRlcnIsICJodHRwOi8vdXNlcndlYi5rZXJuZWwub3JnL35sZW5iL2FjcGkvdXRpbHMvcG10b29scy90dXJib3N0YXQvXG4iKTsKKworCXR1cmJvc3RhdF9pbml0KCk7CisKKwkvKgorCSAqIGlmIGFueSBwYXJhbXMgbGVmdCwgaXQgbXVzdCBiZSBhIGNvbW1hbmQgdG8gZm9yaworCSAqLworCWlmIChhcmdjIC0gb3B0aW5kKQorCQlyZXR1cm4gZm9ya19pdChhcmd2ICsgb3B0aW5kKTsKKwllbHNlCisJCXR1cmJvc3RhdF9sb29wKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L01ha2VmaWxlIGIvdG9vbHMvcG93ZXIveDg2L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1ODIzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAoreDg2X2VuZXJneV9wZXJmX3BvbGljeSA6IHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYworCitjbGVhbiA6CisJcm0gLWYgeDg2X2VuZXJneV9wZXJmX3BvbGljeQorCitpbnN0YWxsIDoKKwlpbnN0YWxsIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgL3Vzci9iaW4vCisJaW5zdGFsbCB4ODZfZW5lcmd5X3BlcmZfcG9saWN5LjggL3Vzci9zaGFyZS9tYW4vbWFuOC8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuOCBiL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFhYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIveDg2L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kveDg2X2VuZXJneV9wZXJmX3BvbGljeS44CkBAIC0wLDAgKzEsMTA0IEBACisuXCIgIFRoaXMgcGFnZSBDb3B5cmlnaHQgKEMpIDIwMTAgTGVuIEJyb3duIDxsZW4uYnJvd25AaW50ZWwuY29tPgorLlwiICBEaXN0cmlidXRlZCB1bmRlciB0aGUgR1BMLCBDb3B5bGVmdCAxOTk0LgorLlRIIFg4Nl9FTkVSR1lfUEVSRl9QT0xJQ1kgOAorLlNIIE5BTUUKK3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgXC0gcmVhZCBvciB3cml0ZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCisuU0ggU1lOT1BTSVMKKy5mdCBCCisuQiB4ODZfZW5lcmd5X3BlcmZfcG9saWN5CisuUkIgWyAiXC1jIGNwdSIgXQorLlJCIFsgIlwtdiIgXQorLlJCICJcLXIiCisuYnIKKy5CIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kKKy5SQiBbICJcLWMgY3B1IiBdCisuUkIgWyAiXC12IiBdCisuUkIgJ3BlcmZvcm1hbmNlJworLmJyCisuQiB4ODZfZW5lcmd5X3BlcmZfcG9saWN5CisuUkIgWyAiXC1jIGNwdSIgXQorLlJCIFsgIlwtdiIgXQorLlJCICdub3JtYWwnCisuYnIKKy5CIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kKKy5SQiBbICJcLWMgY3B1IiBdCisuUkIgWyAiXC12IiBdCisuUkIgJ3Bvd2Vyc2F2ZScKKy5icgorLkIgeDg2X2VuZXJneV9wZXJmX3BvbGljeQorLlJCIFsgIlwtYyBjcHUiIF0KKy5SQiBbICJcLXYiIF0KKy5SQiBuCisuYnIKKy5TSCBERVNDUklQVElPTgorXGZCeDg2X2VuZXJneV9wZXJmX3BvbGljeVxmUAorYWxsb3dzIHNvZnR3YXJlIHRvIGNvbnZleQoraXRzIHBvbGljeSBmb3IgdGhlIHJlbGF0aXZlIGltcG9ydGFuY2Ugb2YgcGVyZm9ybWFuY2UKK3ZlcnN1cyBlbmVyZ3kgc2F2aW5ncyB0byB0aGUgcHJvY2Vzc29yLgorCitUaGUgcHJvY2Vzc29yIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiBpbiBtb2RlbC1zcGVjaWZpYyB3YXlzCit3aGVuIGl0IG11c3Qgc2VsZWN0IHRyYWRlLW9mZnMgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQKK2VuZXJneSBlZmZpY2llbmN5LgorCitUaGlzIHBvbGljeSBoaW50IGRvZXMgbm90IHN1cGVyc2VkZSBQcm9jZXNzb3IgUGVyZm9ybWFuY2Ugc3RhdGVzCisoUC1zdGF0ZXMpIG9yIENQVSBJZGxlIHBvd2VyIHN0YXRlcyAoQy1zdGF0ZXMpLCBidXQgYWxsb3dzCitzb2Z0d2FyZSB0byBoYXZlIGluZmx1ZW5jZSB3aGVyZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgdW5hYmxlCit0byBleHByZXNzIGEgcHJlZmVyZW5jZS4KKworRm9yIGV4YW1wbGUsIHRoaXMgc2V0dGluZyBtYXkgdGVsbCB0aGUgaGFyZHdhcmUgaG93CithZ2dyZXNzaXZlbHkgb3IgY29uc2VydmF0aXZlbHkgdG8gY29udHJvbCBmcmVxdWVuY3kKK2luIHRoZSAidHVyYm8gcmFuZ2UiIGFib3ZlIHRoZSBleHBsaWNpdGx5IE9TLWNvbnRyb2xsZWQKK1Atc3RhdGUgZnJlcXVlbmN5IHJhbmdlLiAgSXQgbWF5IGFsc28gdGVsbCB0aGUgaGFyZHdhcmUKK2hvdyBhZ2dyZXNzaXZlbHkgaXMgc2hvdWxkIGVudGVyIHRoZSBPUyByZXF1ZXN0ZWQgQy1zdGF0ZXMuCisKK1N1cHBvcnQgZm9yIHRoaXMgZmVhdHVyZSBpcyBpbmRpY2F0ZWQgYnkgQ1BVSUQuMDZILkVDWC5iaXQzCitwZXIgdGhlIEludGVsIEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsLgorCisuU1MgT3B0aW9ucworXGZCLWNcZlAgbGltaXRzIG9wZXJhdGlvbiB0byBhIHNpbmdsZSBDUFUuCitUaGUgZGVmYXVsdCBpcyB0byBvcGVyYXRlIG9uIGFsbCBDUFVzLgorTm90ZSB0aGF0IE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVMgaXMgZGVmaW5lZCBwZXIKK2xvZ2ljYWwgcHJvY2Vzc29yLCBidXQgdGhhdCB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbnMKK29mIHRoZSBNU1Igd2VyZSBzaGFyZWQgYW1vbmcgYWxsIHByb2Nlc3NvcnMgaW4gZWFjaCBwYWNrYWdlLgorLlBQCitcZkItdlxmUCBpbmNyZWFzZXMgdmVyYm9zaXR5LiAgQnkgZGVmYXVsdAoreDg2X2VuZXJneV9wZXJmX3BvbGljeSBpcyBzaWxlbnQuCisuUFAKK1xmQi1yXGZQIGlzIGZvciAicmVhZC1vbmx5IiBtb2RlIC0gdGhlIHVuY2hhbmdlZCBzdGF0ZQoraXMgcmVhZCBhbmQgZGlzcGxheWVkLgorLlBQCisuSSBwZXJmb3JtYW5jZQorU2V0IGEgcG9saWN5IHdoZXJlIHBlcmZvcm1hbmNlIGlzIHBhcmFtb3VudC4KK1RoZSBwcm9jZXNzb3Igd2lsbCBiZSB1bndpbGxpbmcgdG8gc2FjcmlmaWNlIGFueSBwZXJmb3JtYW5jZQorZm9yIHRoZSBzYWtlIG9mIGVuZXJneSBzYXZpbmcuIFRoaXMgaXMgdGhlIGhhcmR3YXJlIGRlZmF1bHQuCisuUFAKKy5JIG5vcm1hbAorU2V0IGEgcG9saWN5IHdpdGggYSBub3JtYWwgYmFsYW5jZSBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBlbmVyZ3kgZWZmaWNpZW5jeS4KK1RoZSBwcm9jZXNzb3Igd2lsbCB0b2xlcmF0ZSBtaW5vciBwZXJmb3JtYW5jZSBjb21wcm9taXNlCitmb3IgcG90ZW50aWFsbHkgc2lnbmlmaWNhbnQgZW5lcmd5IHNhdmluZ3MuCitUaGlzIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgbW9zdCBkZXNrdG9wcyBhbmQgc2VydmVycy4KKy5QUAorLkkgcG93ZXJzYXZlCitTZXQgYSBwb2xpY3kgd2hlcmUgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXB0CithIG1lYXN1cmFibGUgcGVyZm9ybWFuY2UgaGl0IHRvIG1heGltaXplIGVuZXJneSBlZmZpY2llbmN5LgorLlBQCisuSSBuCitTZXQgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUyB0byB0aGUgc3BlY2lmaWVkIG51bWJlci4KK1RoZSByYW5nZSBvZiB2YWxpZCBudW1iZXJzIGlzIDAtMTUsIHdoZXJlIDAgaXMgbWF4aW11bQorcGVyZm9ybWFuY2UgYW5kIDE1IGlzIG1heGltdW0gZW5lcmd5IGVmZmljaWVuY3kuCisKKy5TSCBOT1RFUworLkIgIng4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgIgorcnVucyBvbmx5IGFzIHJvb3QuCisuU0ggRklMRVMKKy50YQorLm5mCisvZGV2L2NwdS8qL21zcgorLmZpCisKKy5TSCAiU0VFIEFMU08iCittc3IoNCkKKy5QUAorLlNIIEFVVEhPUlMKKy5uZgorV3JpdHRlbiBieSBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CmRpZmYgLS1naXQgYS90b29scy9wb3dlci94ODYveDg2X2VuZXJneV9wZXJmX3BvbGljeS94ODZfZW5lcmd5X3BlcmZfcG9saWN5LmMgYi90b29scy9wb3dlci94ODYveDg2X2VuZXJneV9wZXJmX3BvbGljeS94ODZfZW5lcmd5X3BlcmZfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2NzhhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIHg4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kgLS0gc2V0IHRoZSBlbmVyZ3kgdmVyc3VzIHBlcmZvcm1hbmNlCisgKiBwb2xpY3kgcHJlZmVyZW5jZSBiaWFzIG9uIHJlY2VudCBYODYgcHJvY2Vzc29ycy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordW5zaWduZWQgaW50IHZlcmJvc2U7CQkvKiBzZXQgd2l0aCAtdiAqLwordW5zaWduZWQgaW50IHJlYWRfb25seTsJCS8qIHNldCB3aXRoIC1yICovCitjaGFyICpwcm9nbmFtZTsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBuZXdfYmlhczsKK2ludCBjcHUgPSAtMTsKKworLyoKKyAqIFVzYWdlOgorICoKKyAqIC1jIGNwdTogbGltaXQgYWN0aW9uIHRvIGEgc2luZ2xlIENQVSAoZGVmYXVsdCBpcyBhbGwgQ1BVcykKKyAqIC12OiB2ZXJib3NlIG91dHB1dCAoY2FuIGludm9rZSBtb3JlIHRoYW4gb25jZSkKKyAqIC1yOiByZWFkLW9ubHksIGRvbid0IGNoYW5nZSBhbnkgc2V0dGluZ3MKKyAqCisgKiAgcGVyZm9ybWFuY2UKKyAqCVBlcmZvcm1hbmNlIGlzIHBhcmFtb3VudC4KKyAqCVVud2lsbGluZyB0byBzYWNyYWZpY2UgYW55IHBlcmZvcm1hbmNlCisgKglmb3IgdGhlIHNha2Ugb2YgZW5lcmd5IHNhdmluZy4gKGhhcmR3YXJlIGRlZmF1bHQpCisgKgorICogIG5vcm1hbAorICoJQ2FuIHRvbGVyYXRlIG1pbm9yIHBlcmZvcm1hbmNlIGNvbXByb21pc2UKKyAqCWZvciBwb3RlbnRpYWxseSBzaWduaWZpY2FudCBlbmVyZ3kgc2F2aW5ncy4KKyAqCShyZWFzb25hYmxlIGRlZmF1bHQgZm9yIG1vc3QgZGVza3RvcHMgYW5kIHNlcnZlcnMpCisgKgorICogIHBvd2Vyc2F2ZQorICoJQ2FuIHRvbGVyYXRlIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGhpdAorICoJdG8gbWF4aW1pemUgZW5lcmd5IHNhdmluZ3MuCisgKgorICogbgorICoJYSBudW1lcmljYWwgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgTVNSLgorICovCit2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCIlczogWy1jIGNwdV0gWy12XSAiCisJCSIoLXIgfCAncGVyZm9ybWFuY2UnIHwgJ25vcm1hbCcgfCAncG93ZXJzYXZlJyB8IG4pXG4iLAorCQlwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworI2RlZmluZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCTB4MDAwMDAxYjAKKworI2RlZmluZQlCSUFTX1BFUkZPUk1BTkNFCQkwCisjZGVmaW5lIEJJQVNfQkFMQU5DRQkJCTYKKyNkZWZpbmUJQklBU19QT1dFUlNBVkUJCQkxNQorCit2b2lkIGNtZGxpbmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK3J2YzoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnYyc6CisJCQljcHUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZWFkX29ubHkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQl9CisJfQorCS8qIGlmIC1yLCB0aGVuIHNob3VsZCBiZSBubyBhZGRpdGlvbmFsIG9wdGluZCAqLworCWlmIChyZWFkX29ubHkgJiYgKGFyZ2MgPiBvcHRpbmQpKQorCQl1c2FnZSgpOworCisJLyoKKwkgKiBpZiBubyAtciAsIHRoZW4gbXVzdCBiZSBvbmUgYWRkaXRpb25hbCBvcHRpbmQKKwkgKi8KKwlpZiAoIXJlYWRfb25seSkgeworCisJCWlmIChhcmdjICE9IG9wdGluZCArIDEpIHsKKwkJCXByaW50ZigibXVzdCBzdXBwbHkgLXIgb3IgcG9saWN5IHBhcmFtXG4iKTsKKwkJCXVzYWdlKCk7CisJCQl9CisKKwkJaWYgKCFzdHJjbXAoInBlcmZvcm1hbmNlIiwgYXJndltvcHRpbmRdKSkgeworCQkJbmV3X2JpYXMgPSBCSUFTX1BFUkZPUk1BTkNFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoIm5vcm1hbCIsIGFyZ3Zbb3B0aW5kXSkpIHsKKwkJCW5ld19iaWFzID0gQklBU19CQUxBTkNFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoInBvd2Vyc2F2ZSIsIGFyZ3Zbb3B0aW5kXSkpIHsKKwkJCW5ld19iaWFzID0gQklBU19QT1dFUlNBVkU7CisJCX0gZWxzZSB7CisJCQljaGFyICplbmRwdHI7CisKKwkJCW5ld19iaWFzID0gc3RydG91bGwoYXJndltvcHRpbmRdLCAmZW5kcHRyLCAwKTsKKwkJCWlmIChlbmRwdHIgPT0gYXJndltvcHRpbmRdIHx8CisJCQkJbmV3X2JpYXMgPiBCSUFTX1BPV0VSU0FWRSkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgdmFsdWU6ICVzXG4iLAorCQkJCQkJYXJndltvcHRpbmRdKTsKKwkJCQl1c2FnZSgpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogdmFsaWRhdGVfY3B1aWQoKQorICogcmV0dXJucyBvbiBzdWNjZXNzLCBxdWlldGx5IGV4aXRzIG9uIGZhaWx1cmUgKG1ha2UgdmVyYm9zZSB3aXRoIC12KQorICovCit2b2lkIHZhbGlkYXRlX2NwdWlkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeCwgbWF4X2xldmVsOworCWNoYXIgYnJhbmRbMTZdOworCXVuc2lnbmVkIGludCBmbXMsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nOworCisJZWF4ID0gZWJ4ID0gZWN4ID0gZWR4ID0gMDsKKworCWFzbSgiY3B1aWQiIDogIj1hIiAobWF4X2xldmVsKSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwKKwkJIj1kIiAoZWR4KSA6ICJhIiAoMCkpOworCisJaWYgKGVieCAhPSAweDc1NmU2NTQ3IHx8IGVkeCAhPSAweDQ5NjU2ZTY5IHx8IGVjeCAhPSAweDZjNjU3NDZlKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICIlLjRzJS40cyUuNHMgIT0gR2VudWluZUludGVsIiwKKwkJCQkoY2hhciAqKSZlYngsIChjaGFyICopJmVkeCwgKGNoYXIgKikmZWN4KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlhc20oImNwdWlkIiA6ICI9YSIgKGZtcyksICI9YyIgKGVjeCksICI9ZCIgKGVkeCkgOiAiYSIgKDEpIDogImVieCIpOworCWZhbWlseSA9IChmbXMgPj4gOCkgJiAweGY7CisJbW9kZWwgPSAoZm1zID4+IDQpICYgMHhmOworCXN0ZXBwaW5nID0gZm1zICYgMHhmOworCWlmIChmYW1pbHkgPT0gNiB8fCBmYW1pbHkgPT0gMHhmKQorCQltb2RlbCArPSAoKGZtcyA+PiAxNikgJiAweGYpIDw8IDQ7CisKKwlpZiAodmVyYm9zZSA+IDEpCisJCXByaW50ZigiQ1BVSUQgJXMgJWQgbGV2ZWxzIGZhbWlseTptb2RlbDpzdGVwcGluZyAiCisJCQkiMHgleDoleDoleCAoJWQ6JWQ6JWQpXG4iLCBicmFuZCwgbWF4X2xldmVsLAorCQkJZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmcsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nKTsKKworCWlmICghKGVkeCAmICgxIDw8IDUpKSkgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigiQ1BVSUQ6IG5vIE1TUlxuIik7CisJCWV4aXQoMSk7CisJfQorCisJLyoKKwkgKiBTdXBwb3J0IGZvciBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCisJICogaXMgaW5kaWNhdGVkIGJ5IENQVUlELjA2SC5FQ1guYml0MworCSAqLworCWFzbSgiY3B1aWQiIDogIj1hIiAoZWF4KSwgIj1iIiAoZWJ4KSwgIj1jIiAoZWN4KSwgIj1kIiAoZWR4KSA6ICJhIiAoNikpOworCWlmICh2ZXJib3NlKQorCQlwcmludGYoIkNQVUlELjA2SC5FQ1g6IDB4JXhcbiIsIGVjeCk7CisJaWYgKCEoZWN4ICYgKDEgPDwgMykpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRmKCJDUFVJRDogTm8gTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBU1xuIik7CisJCWV4aXQoMSk7CisJfQorCXJldHVybjsJLyogc3VjY2VzcyAqLworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X21zcihpbnQgY3B1LCBpbnQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBtc3I7CisJY2hhciBtc3JfcGF0aFszMl07CisJaW50IHJldHZhbDsKKwlpbnQgZmQ7CisKKwlzcHJpbnRmKG1zcl9wYXRoLCAiL2Rldi9jcHUvJWQvbXNyIiwgY3B1KTsKKwlmZCA9IG9wZW4obXNyX3BhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCXByaW50ZigiVHJ5IFwiIyBtb2Rwcm9iZSBtc3JcIlxuIik7CisJCXBlcnJvcihtc3JfcGF0aCk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dmFsID0gcHJlYWQoZmQsICZtc3IsIHNpemVvZiBtc3IsIG9mZnNldCk7CisKKwlpZiAocmV0dmFsICE9IHNpemVvZiBtc3IpIHsKKwkJcHJpbnRmKCJwcmVhZCBjcHUlZCAweCV4ID0gJWRcbiIsIGNwdSwgb2Zmc2V0LCByZXR2YWwpOworCQlleGl0KC0yKTsKKwl9CisJY2xvc2UoZmQpOworCXJldHVybiBtc3I7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyAgcHV0X21zcihpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGxvbmcgbmV3X21zciwgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2xkX21zcjsKKwljaGFyIG1zcl9wYXRoWzMyXTsKKwlpbnQgcmV0dmFsOworCWludCBmZDsKKworCXNwcmludGYobXNyX3BhdGgsICIvZGV2L2NwdS8lZC9tc3IiLCBjcHUpOworCWZkID0gb3Blbihtc3JfcGF0aCwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcihtc3JfcGF0aCk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dmFsID0gcHJlYWQoZmQsICZvbGRfbXNyLCBzaXplb2Ygb2xkX21zciwgb2Zmc2V0KTsKKwlpZiAocmV0dmFsICE9IHNpemVvZiBvbGRfbXNyKSB7CisJCXBlcnJvcigicHdyaXRlIik7CisJCXByaW50ZigicHJlYWQgY3B1JWQgMHgleCA9ICVkXG4iLCBjcHUsIG9mZnNldCwgcmV0dmFsKTsKKwkJZXhpdCgtMik7CisJfQorCisJcmV0dmFsID0gcHdyaXRlKGZkLCAmbmV3X21zciwgc2l6ZW9mIG5ld19tc3IsIG9mZnNldCk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YgbmV3X21zcikgeworCQlwZXJyb3IoInB3cml0ZSIpOworCQlwcmludGYoInB3cml0ZSBjcHUlZCAweCV4ID0gJWRcbiIsIGNwdSwgb2Zmc2V0LCByZXR2YWwpOworCQlleGl0KC0yKTsKKwl9CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gb2xkX21zcjsKK30KKwordm9pZCBwcmludF9tc3IoaW50IGNwdSkKK3sKKwlwcmludGYoImNwdSVkOiAweCUwMTZsbHhcbiIsCisJCWNwdSwgZ2V0X21zcihjcHUsIE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVMpKTsKK30KKwordm9pZCB1cGRhdGVfbXNyKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHByZXZpb3VzX21zcjsKKworCXByZXZpb3VzX21zciA9IHB1dF9tc3IoY3B1LCBuZXdfYmlhcywgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUyk7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJjcHUlZCAgbXNyMHgleCAweCUwMTZsbHggLT4gMHglMDE2bGx4XG4iLAorCQkJY3B1LCBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTLCBwcmV2aW91c19tc3IsIG5ld19iaWFzKTsKKworCXJldHVybjsKK30KKworY2hhciAqcHJvY19zdGF0ID0gIi9wcm9jL3N0YXQiOworLyoKKyAqIHJ1biBmdW5jKCkgb24gZXZlcnkgY3B1IGluIC9kZXYvY3B1CisgKi8KK3ZvaWQgZm9yX2V2ZXJ5X2NwdSh2b2lkIChmdW5jKShpbnQpKQoreworCUZJTEUgKmZwOworCWludCByZXR2YWw7CisKKwlmcCA9IGZvcGVuKHByb2Nfc3RhdCwgInIiKTsKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlwZXJyb3IocHJvY19zdGF0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR2YWwgPSBmc2NhbmYoZnAsICJjcHUgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkXG4iKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJcGVycm9yKCIvcHJvYy9zdGF0IGZvcm1hdCIpOworCQlleGl0KDEpOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCBjcHU7CisKKwkJcmV0dmFsID0gZnNjYW5mKGZwLAorCQkJImNwdSV1ICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZCAlKmQgJSpkICUqZFxuIiwKKwkJCSZjcHUpOworCQlpZiAocmV0dmFsICE9IDEpCisJCQlyZXR1cm47CisKKwkJZnVuYyhjcHUpOworCX0KKwlmY2xvc2UoZnApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY21kbGluZShhcmdjLCBhcmd2KTsKKworCWlmICh2ZXJib3NlID4gMSkKKwkJcHJpbnRmKCJ4ODZfZW5lcmd5X3BlcmZfcG9saWN5IE5vdiAyNCwgMjAxMCIKKwkJCQkiIC0gTGVuIEJyb3duIDxsZW5iQGtlcm5lbC5vcmc+XG4iKTsKKwlpZiAodmVyYm9zZSA+IDEgJiYgIXJlYWRfb25seSkKKwkJcHJpbnRmKCJuZXdfYmlhcyAlbGxkXG4iLCBuZXdfYmlhcyk7CisKKwl2YWxpZGF0ZV9jcHVpZCgpOworCisJaWYgKGNwdSAhPSAtMSkgeworCQlpZiAocmVhZF9vbmx5KQorCQkJcHJpbnRfbXNyKGNwdSk7CisJCWVsc2UKKwkJCXVwZGF0ZV9tc3IoY3B1KTsKKwl9IGVsc2UgeworCQlpZiAocmVhZF9vbmx5KQorCQkJZm9yX2V2ZXJ5X2NwdShwcmludF9tc3IpOworCQllbHNlCisJCQlmb3JfZXZlcnlfY3B1KHVwZGF0ZV9tc3IpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9zbGFiaW5mby5jIGIvdG9vbHMvc2x1Yi9zbGFiaW5mby5jCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYwpyZW5hbWUgdG8gdG9vbHMvc2x1Yi9zbGFiaW5mby5jCmluZGV4IDkyZTcyOWYuLjUxNjU1MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYworKysgYi90b29scy9zbHViL3NsYWJpbmZvLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogCX0KIAogCWZvciAoIDsgKm9wdDsgb3B0KyspCi0JIAlzd2l0Y2ggKCpvcHQpIHsKKwkJc3dpdGNoICgqb3B0KSB7CiAJCWNhc2UgJ0YnIDogY2FzZSAnZic6CiAJCQlpZiAoc2FuaXR5KQogCQkJCXJldHVybiAwOwpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCQljb250aW51ZTsKIAkJc3dpdGNoIChkZS0+ZF90eXBlKSB7CiAJCSAgIGNhc2UgRFRfTE5LOgotCQkgICAJYWxpYXMtPm5hbWUgPSBzdHJkdXAoZGUtPmRfbmFtZSk7CisJCQlhbGlhcy0+bmFtZSA9IHN0cmR1cChkZS0+ZF9uYW1lKTsKIAkJCWNvdW50ID0gcmVhZGxpbmsoZGUtPmRfbmFtZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAKIAkJCWlmIChjb3VudCA8IDApCkBAIC0xMTQzLDcgKzExNDMsNyBAQAogCQkgICBjYXNlIERUX0RJUjoKIAkJCWlmIChjaGRpcihkZS0+ZF9uYW1lKSkKIAkJCQlmYXRhbCgiVW5hYmxlIHRvIGFjY2VzcyBzbGFiICVzXG4iLCBzbGFiLT5uYW1lKTsKLQkJICAgCXNsYWItPm5hbWUgPSBzdHJkdXAoZGUtPmRfbmFtZSk7CisJCQlzbGFiLT5uYW1lID0gc3RyZHVwKGRlLT5kX25hbWUpOwogCQkJc2xhYi0+YWxpYXMgPSAwOwogCQkJc2xhYi0+cmVmcyA9IDA7CiAJCQlzbGFiLT5hbGlhc2VzID0gZ2V0X29iaigiYWxpYXNlcyIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9jb21wYXJlLWt0ZXN0LXNhbXBsZS5wbCBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3QvY29tcGFyZS1rdGVzdC1zYW1wbGUucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE1NzFlNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9rdGVzdC9jb21wYXJlLWt0ZXN0LXNhbXBsZS5wbApAQCAtMCwwICsxLDMwIEBACisjIS91c3IvYmluL3BlcmwKKworb3BlbiAoSU4sImt0ZXN0LnBsIik7Cit3aGlsZSAoPElOPikgeworICAgIGlmICgvXCRvcHRceyI/KFtBLVpdLio/KShcWy4qXF0pPyI/XH0vIHx8CisJL3NldF90ZXN0X29wdGlvblwoIiguKj8pIi8pIHsKKwkkb3B0eyQxfSA9IDE7CisgICAgfQorfQorY2xvc2UgSU47CisKK29wZW4gKElOLCAic2FtcGxlLmNvbmYiKTsKK3doaWxlICg8SU4+KSB7CisgICAgaWYgKC9eXHMqIz9ccyooXFMrKVxzKj0vKSB7CisJJHNhbXB7JDF9ID0gMTsKKyAgICB9Cit9CitjbG9zZSBJTjsKKworZm9yZWFjaCAkb3B0IChrZXlzICVvcHQpIHsKKyAgICBpZiAoIWRlZmluZWQoJHNhbXB7JG9wdH0pKSB7CisJcHJpbnQgIm9wdCA9ICRvcHRcbiI7CisgICAgfQorfQorCitmb3JlYWNoICRzYW1wIChrZXlzICVzYW1wKSB7CisgICAgaWYgKCFkZWZpbmVkKCRvcHR7JHNhbXB9KSkgeworCXByaW50ICJzYW1wID0gJHNhbXBcbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9rdGVzdC9rdGVzdC5wbCBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTFjNjJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qva3Rlc3QucGwKQEAgLTAsMCArMSwyMDIzIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQ29weXdyaXRlIDIwMTAgLSBTdGV2ZW4gUm9zdGVkdCA8c3Jvc3RlZHRAcmVkaGF0LmNvbT4sIFJlZCBIYXQgSW5jLgorIyBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIKKyMKKwordXNlIHN0cmljdDsKK3VzZSBJUEM6Ok9wZW4yOwordXNlIEZjbnRsIHF3KEZfR0VURkwgRl9TRVRGTCBPX05PTkJMT0NLKTsKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCk7Cit1c2UgRmlsZTo6Q29weSBxdyhjcCk7Cit1c2UgRmlsZUhhbmRsZTsKKworbXkgJFZFUlNJT04gPSAiMC4yIjsKKworJHwgPSAxOworCitteSAlb3B0OworbXkgJXJlcGVhdF90ZXN0czsKK215ICVyZXBlYXRzOworbXkgJWRlZmF1bHQ7CisKKyNkZWZhdWx0IG9wdHMKKyRkZWZhdWx0eyJOVU1fVEVTVFMifQkJPSAxOworJGRlZmF1bHR7IlJFQk9PVF9UWVBFIn0JCT0gImdydWIiOworJGRlZmF1bHR7IlRFU1RfVFlQRSJ9CQk9ICJ0ZXN0IjsKKyRkZWZhdWx0eyJCVUlMRF9UWVBFIn0JCT0gInJhbmRjb25maWciOworJGRlZmF1bHR7Ik1BS0VfQ01EIn0JCT0gIm1ha2UiOworJGRlZmF1bHR7IlRJTUVPVVQifQkJPSAxMjA7CiskZGVmYXVsdHsiVE1QX0RJUiJ9CQk9ICIvdG1wL2t0ZXN0IjsKKyRkZWZhdWx0eyJTTEVFUF9USU1FIn0JCT0gNjA7CSMgc2xlZXAgdGltZSBiZXR3ZWVuIHRlc3RzCiskZGVmYXVsdHsiQlVJTERfTk9DTEVBTiJ9CT0gMDsKKyRkZWZhdWx0eyJSRUJPT1RfT05fRVJST1IifQk9IDA7CiskZGVmYXVsdHsiUE9XRVJPRkZfT05fRVJST1IifQk9IDA7CiskZGVmYXVsdHsiUkVCT09UX09OX1NVQ0NFU1MifQk9IDE7CiskZGVmYXVsdHsiUE9XRVJPRkZfT05fU1VDQ0VTUyJ9CT0gMDsKKyRkZWZhdWx0eyJCVUlMRF9PUFRJT05TIn0JPSAiIjsKKyRkZWZhdWx0eyJCSVNFQ1RfU0xFRVBfVElNRSJ9CT0gNjA7ICAgIyBzbGVlcCB0aW1lIGJldHdlZW4gYmlzZWN0cworJGRlZmF1bHR7IkNMRUFSX0xPRyJ9CQk9IDA7CiskZGVmYXVsdHsiU1VDQ0VTU19MSU5FIn0JPSAibG9naW46IjsKKyRkZWZhdWx0eyJCT09URURfVElNRU9VVCJ9CT0gMTsKKyRkZWZhdWx0eyJESUVfT05fRkFJTFVSRSJ9CT0gMTsKKyRkZWZhdWx0eyJTU0hfRVhFQyJ9CQk9ICJzc2ggXCRTU0hfVVNFUlxAXCRNQUNISU5FIFwkU1NIX0NPTU1BTkQiOworJGRlZmF1bHR7IlNDUF9UT19UQVJHRVQifQk9ICJzY3AgXCRTUkNfRklMRSBcJFNTSF9VU0VSXEBcJE1BQ0hJTkU6XCREU1RfRklMRSI7CiskZGVmYXVsdHsiUkVCT09UIn0JCT0gInNzaCBcJFNTSF9VU0VSXEBcJE1BQ0hJTkUgcmVib290IjsKKyRkZWZhdWx0eyJTVE9QX0FGVEVSX1NVQ0NFU1MifQk9IDEwOworJGRlZmF1bHR7IlNUT1BfQUZURVJfRkFJTFVSRSJ9CT0gNjA7CiskZGVmYXVsdHsiTE9DQUxWRVJTSU9OIn0JPSAiLXRlc3QiOworCitteSAka3Rlc3RfY29uZmlnOworbXkgJHZlcnNpb247CitteSAkbWFjaGluZTsKK215ICRzc2hfdXNlcjsKK215ICR0bXBkaXI7CitteSAkYnVpbGRkaXI7CitteSAkb3V0cHV0ZGlyOworbXkgJG91dHB1dF9jb25maWc7CitteSAkdGVzdF90eXBlOworbXkgJGJ1aWxkX3R5cGU7CitteSAkYnVpbGRfb3B0aW9uczsKK215ICRyZWJvb3RfdHlwZTsKK215ICRyZWJvb3Rfc2NyaXB0OworbXkgJHBvd2VyX2N5Y2xlOworbXkgJHJlYm9vdDsKK215ICRyZWJvb3Rfb25fZXJyb3I7CitteSAkcG93ZXJvZmZfb25fZXJyb3I7CitteSAkZGllX29uX2ZhaWx1cmU7CitteSAkcG93ZXJjeWNsZV9hZnRlcl9yZWJvb3Q7CitteSAkcG93ZXJvZmZfYWZ0ZXJfaGFsdDsKK215ICRzc2hfZXhlYzsKK215ICRzY3BfdG9fdGFyZ2V0OworbXkgJHBvd2VyX29mZjsKK215ICRncnViX21lbnU7CitteSAkZ3J1Yl9udW1iZXI7CitteSAkdGFyZ2V0OworbXkgJG1ha2U7CitteSAkcG9zdF9pbnN0YWxsOworbXkgJG5vY2xlYW47CitteSAkbWluY29uZmlnOworbXkgJGFkZGNvbmZpZzsKK215ICRpbl9iaXNlY3QgPSAwOworbXkgJGJpc2VjdF9iYWQgPSAiIjsKK215ICRyZXZlcnNlX2Jpc2VjdDsKK215ICRpbl9wYXRjaGNoZWNrID0gMDsKK215ICRydW5fdGVzdDsKK215ICRyZWRpcmVjdDsKK215ICRidWlsZGxvZzsKK215ICRkbWVzZzsKK215ICRtb25pdG9yX2ZwOworbXkgJG1vbml0b3JfcGlkOworbXkgJG1vbml0b3JfY250ID0gMDsKK215ICRzbGVlcF90aW1lOworbXkgJGJpc2VjdF9zbGVlcF90aW1lOworbXkgJHN0b3JlX2ZhaWx1cmVzOworbXkgJHRpbWVvdXQ7CitteSAkYm9vdGVkX3RpbWVvdXQ7CitteSAkY29uc29sZTsKK215ICRzdWNjZXNzX2xpbmU7CitteSAkc3RvcF9hZnRlcl9zdWNjZXNzOworbXkgJHN0b3BfYWZ0ZXJfZmFpbHVyZTsKK215ICRidWlsZF90YXJnZXQ7CitteSAkdGFyZ2V0X2ltYWdlOworbXkgJGxvY2FsdmVyc2lvbjsKK215ICRpdGVyYXRpb24gPSAwOworbXkgJHN1Y2Nlc3NlcyA9IDA7CisKK215ICVlbnRlcmVkX2NvbmZpZ3M7CitteSAlY29uZmlnX2hlbHA7CisKKyRjb25maWdfaGVscHsiTUFDSElORSJ9ID0gPDwgIkVPRiIKKyBUaGUgbWFjaGluZSBob3N0bmFtZSB0aGF0IHlvdSB3aWxsIHRlc3QuCitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IlNTSF9VU0VSIn0gPSA8PCAiRU9GIgorIFRoZSBib3ggaXMgZXhwZWN0ZWQgdG8gaGF2ZSBzc2ggb24gbm9ybWFsIGJvb3R1cCwgcHJvdmlkZSB0aGUgdXNlcgorICAobW9zdCBsaWtlbHkgcm9vdCwgc2luY2UgeW91IG5lZWQgcHJpdmlsZWdlZCBvcGVyYXRpb25zKQorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJCVUlMRF9ESVIifSA9IDw8ICJFT0YiCisgVGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBMaW51eCBzb3VyY2UgY29kZSAoZnVsbCBwYXRoKS4KK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiT1VUUFVUX0RJUiJ9ID0gPDwgIkVPRiIKKyBUaGUgZGlyZWN0b3J5IHRoYXQgdGhlIG9iamVjdHMgd2lsbCBiZSBidWlsdCAoZnVsbCBwYXRoKS4KKyAoY2FuIG5vdCBiZSBzYW1lIGFzIEJVSUxEX0RJUikKK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiQlVJTERfVEFSR0VUIn0gPSA8PCAiRU9GIgorIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZWQgZmlsZSB0byBjb3B5IHRvIHRoZSB0YXJnZXQuCisgKHJlbGF0aXZlIHRvIE9VVFBVVF9ESVIpCitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IlRBUkdFVF9JTUFHRSJ9ID0gPDwgIkVPRiIKKyBUaGUgcGxhY2UgdG8gcHV0IHlvdXIgaW1hZ2Ugb24gdGhlIHRlc3QgbWFjaGluZS4KK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiUE9XRVJfQ1lDTEUifSA9IDw8ICJFT0YiCisgQSBzY3JpcHQgb3IgY29tbWFuZCB0byByZWJvb3QgdGhlIGJveC4KKworIEhlcmUgaXMgYSBkaWdpdGFsIGxvZ2dlcnMgcG93ZXIgc3dpdGNoIGV4YW1wbGUKKyBQT1dFUl9DWUNMRSA9IHdnZXQgLS1uby1wcm94eSAtTyAvZGV2L251bGwgLXEgIC0tYXV0aC1uby1jaGFsbGVuZ2UgJ2h0dHA6Ly9hZG1pbjphZG1pblxAcG93ZXIvb3V0bGV0PzU9Q0NMJworCisgSGVyZSBpcyBhbiBleGFtcGxlIHRvIHJlYm9vdCBhIHZpcnR1YWwgYm94IG9uIHRoZSBjdXJyZW50IGhvc3QKKyB3aXRoIHRoZSBuYW1lICJHdWVzdCIuCisgUE9XRVJfQ1lDTEUgPSB2aXJzaCBkZXN0cm95IEd1ZXN0OyBzbGVlcCA1OyB2aXJzaCBzdGFydCBHdWVzdAorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJDT05TT0xFIn0gPSA8PCAiRU9GIgorIFRoZSBzY3JpcHQgb3IgY29tbWFuZCB0aGF0IHJlYWRzIHRoZSBjb25zb2xlCisKKyAgSWYgeW91IHVzZSB0dHl3YXRjaCBzZXJ2ZXIsIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgd291bGQgd29yay4KK0NPTlNPTEUgPSBuYyAtZCBsb2NhbGhvc3QgMzAwMQorCisgRm9yIGEgdmlydHVhbCBtYWNoaW5lIHdpdGggZ3Vlc3QgbmFtZSAiR3Vlc3QiLgorQ09OU09MRSA9ICB2aXJzaCBjb25zb2xlIEd1ZXN0CitFT0YKKyAgICA7CiskY29uZmlnX2hlbHB7IkxPQ0FMVkVSU0lPTiJ9ID0gPDwgIkVPRiIKKyBSZXF1aXJlZCB2ZXJzaW9uIGVuZGluZyB0byBkaWZmZXJlbnRpYXRlIHRoZSB0ZXN0CisgZnJvbSBvdGhlciBsaW51eCBidWlsZHMgb24gdGhlIHN5c3RlbS4KK0VPRgorICAgIDsKKyRjb25maWdfaGVscHsiUkVCT09UX1RZUEUifSA9IDw8ICJFT0YiCisgV2F5IHRvIHJlYm9vdCB0aGUgYm94IHRvIHRoZSB0ZXN0IGtlcm5lbC4KKyBPbmx5IHZhbGlkIG9wdGlvbnMgc28gZmFyIGFyZSAiZ3J1YiIgYW5kICJzY3JpcHQiLgorCisgSWYgeW91IHNwZWNpZnkgZ3J1YiwgaXQgd2lsbCBhc3N1bWUgZ3J1YiB2ZXJzaW9uIDEKKyBhbmQgd2lsbCBzZWFyY2ggaW4gL2Jvb3QvZ3J1Yi9tZW51LmxzdCBmb3IgdGhlIHRpdGxlIFwkR1JVQl9NRU5VCisgYW5kIHNlbGVjdCB0aGF0IHRhcmdldCB0byByZWJvb3QgdG8gdGhlIGtlcm5lbC4gSWYgdGhpcyBpcyBub3QKKyB5b3VyIHNldHVwLCB0aGVuIHNwZWNpZnkgInNjcmlwdCIgYW5kIGhhdmUgYSBjb21tYW5kIG9yIHNjcmlwdAorIHNwZWNpZmllZCBpbiBSRUJPT1RfU0NSSVBUIHRvIGJvb3QgdG8gdGhlIHRhcmdldC4KKworIFRoZSBlbnRyeSBpbiAvYm9vdC9ncnViL21lbnUubHN0IG11c3QgYmUgZW50ZXJlZCBpbiBtYW51YWxseS4KKyBUaGUgdGVzdCB3aWxsIG5vdCBtb2RpZnkgdGhhdCBmaWxlLgorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJHUlVCX01FTlUifSA9IDw8ICJFT0YiCisgVGhlIGdydWIgdGl0bGUgbmFtZSBmb3IgdGhlIHRlc3Qga2VybmVsIHRvIGJvb3QKKyAoT25seSBtYW5kYXRvcnkgaWYgUkVCT09UX1RZUEUgPSBncnViKQorCisgTm90ZSwga3Rlc3QucGwgd2lsbCBub3QgdXBkYXRlIHRoZSBncnViIG1lbnUubHN0LCB5b3UgbmVlZCB0bworIG1hbnVhbGx5IGFkZCBhbiBvcHRpb24gZm9yIHRoZSB0ZXN0LiBrdGVzdC5wbCB3aWxsIHNlYXJjaAorIHRoZSBncnViIG1lbnUubHN0IGZvciB0aGlzIG9wdGlvbiB0byBmaW5kIHdoYXQga2VybmVsIHRvCisgcmVib290IGludG8uCisKKyBGb3IgZXhhbXBsZSwgaWYgaW4gdGhlIC9ib290L2dydWIvbWVudS5sc3QgdGhlIHRlc3Qga2VybmVsIHRpdGxlIGhhczoKKyB0aXRsZSBUZXN0IEtlcm5lbAorIGtlcm5lbCB2bWxpbnV6LXRlc3QKKyBHUlVCX01FTlUgPSBUZXN0IEtlcm5lbAorRU9GCisgICAgOworJGNvbmZpZ19oZWxweyJSRUJPT1RfU0NSSVBUIn0gPSA8PCAiRU9GIgorIEEgc2NyaXB0IHRvIHJlYm9vdCB0aGUgdGFyZ2V0IGludG8gdGhlIHRlc3Qga2VybmVsCisgKE9ubHkgbWFuZGF0b3J5IGlmIFJFQk9PVF9UWVBFID0gc2NyaXB0KQorRU9GCisgICAgOworCisKK3N1YiBnZXRfa3Rlc3RfY29uZmlnIHsKKyAgICBteSAoJGNvbmZpZykgPSBAXzsKKworICAgIHJldHVybiBpZiAoZGVmaW5lZCgkb3B0eyRjb25maWd9KSk7CisKKyAgICBpZiAoZGVmaW5lZCgkY29uZmlnX2hlbHB7JGNvbmZpZ30pKSB7CisJcHJpbnQgIlxuIjsKKwlwcmludCAkY29uZmlnX2hlbHB7JGNvbmZpZ307CisgICAgfQorCisgICAgZm9yICg7OykgeworCXByaW50ICIkY29uZmlnID0gIjsKKwlpZiAoZGVmaW5lZCgkZGVmYXVsdHskY29uZmlnfSkpIHsKKwkgICAgcHJpbnQgIlxbJGRlZmF1bHR7JGNvbmZpZ31cXSAiOworCX0KKwkkZW50ZXJlZF9jb25maWdzeyRjb25maWd9ID0gPFNURElOPjsKKwkkZW50ZXJlZF9jb25maWdzeyRjb25maWd9ID1+IHMvXlxzKiguKlxTKVxzKiQvJDEvOworCWlmICgkZW50ZXJlZF9jb25maWdzeyRjb25maWd9ID1+IC9eXHMqJC8pIHsKKwkgICAgaWYgKCRkZWZhdWx0eyRjb25maWd9KSB7CisJCSRlbnRlcmVkX2NvbmZpZ3N7JGNvbmZpZ30gPSAkZGVmYXVsdHskY29uZmlnfTsKKwkgICAgfSBlbHNlIHsKKwkJcHJpbnQgIllvdXIgYW5zd2VyIGNhbiBub3QgYmUgYmxhbmtcbiI7CisJCW5leHQ7CisJICAgIH0KKwl9CisJbGFzdDsKKyAgICB9Cit9CisKK3N1YiBnZXRfa3Rlc3RfY29uZmlncyB7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiTUFDSElORSIpOworICAgIGdldF9rdGVzdF9jb25maWcoIlNTSF9VU0VSIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiQlVJTERfRElSIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiT1VUUFVUX0RJUiIpOworICAgIGdldF9rdGVzdF9jb25maWcoIkJVSUxEX1RBUkdFVCIpOworICAgIGdldF9rdGVzdF9jb25maWcoIlRBUkdFVF9JTUFHRSIpOworICAgIGdldF9rdGVzdF9jb25maWcoIlBPV0VSX0NZQ0xFIik7CisgICAgZ2V0X2t0ZXN0X2NvbmZpZygiQ09OU09MRSIpOworICAgIGdldF9rdGVzdF9jb25maWcoIkxPQ0FMVkVSU0lPTiIpOworCisgICAgbXkgJHJ0eXBlID0gJG9wdHsiUkVCT09UX1RZUEUifTsKKworICAgIGlmICghZGVmaW5lZCgkcnR5cGUpKSB7CisJaWYgKCFkZWZpbmVkKCRvcHR7IkdSVUJfTUVOVSJ9KSkgeworCSAgICBnZXRfa3Rlc3RfY29uZmlnKCJSRUJPT1RfVFlQRSIpOworCSAgICAkcnR5cGUgPSAkZW50ZXJlZF9jb25maWdzeyJSRUJPT1RfVFlQRSJ9OworCX0gZWxzZSB7CisJICAgICRydHlwZSA9ICJncnViIjsKKwl9CisgICAgfQorCisgICAgaWYgKCRydHlwZSBlcSAiZ3J1YiIpIHsKKwlnZXRfa3Rlc3RfY29uZmlnKCJHUlVCX01FTlUiKTsKKyAgICB9IGVsc2UgeworCWdldF9rdGVzdF9jb25maWcoIlJFQk9PVF9TQ1JJUFQiKTsKKyAgICB9Cit9CisKK3N1YiBzZXRfdmFsdWUgeworICAgIG15ICgkbHZhbHVlLCAkcnZhbHVlKSA9IEBfOworCisgICAgaWYgKGRlZmluZWQoJG9wdHskbHZhbHVlfSkpIHsKKwlkaWUgIkVycm9yOiBPcHRpb24gJGx2YWx1ZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIVxuIjsKKyAgICB9CisgICAgaWYgKCRydmFsdWUgPX4gL15ccyokLykgeworCWRlbGV0ZSAkb3B0eyRsdmFsdWV9OworICAgIH0gZWxzZSB7CisJJG9wdHskbHZhbHVlfSA9ICRydmFsdWU7CisgICAgfQorfQorCitzdWIgcmVhZF9jb25maWcgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgb3BlbihJTiwgJGNvbmZpZykgfHwgZGllICJjYW4ndCByZWFkIGZpbGUgJGNvbmZpZyI7CisKKyAgICBteSAkbmFtZSA9ICRjb25maWc7CisgICAgJG5hbWUgPX4gcywuKi8oLiopLCQxLDsKKworICAgIG15ICR0ZXN0X251bSA9IDA7CisgICAgbXkgJGRlZmF1bHQgPSAxOworICAgIG15ICRyZXBlYXQgPSAxOworICAgIG15ICRudW1fdGVzdHNfc2V0ID0gMDsKKyAgICBteSAkc2tpcCA9IDA7CisgICAgbXkgJHJlc3Q7CisKKyAgICB3aGlsZSAoPElOPikgeworCisJIyBpZ25vcmUgYmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzCisJbmV4dCBpZiAoL15ccyokLyB8fCAvXHMqXCMvKTsKKworCWlmICgvXlxzKlRFU1RfU1RBUlQoLiopLykgeworCisJICAgICRyZXN0ID0gJDE7CisKKwkgICAgaWYgKCRudW1fdGVzdHNfc2V0KSB7CisJCWRpZSAiJG5hbWU6ICQuOiBDYW4gbm90IHNwZWNpZnkgYm90aCBOVU1fVEVTVFMgYW5kIFRFU1RfU1RBUlRcbiI7CisJICAgIH0KKworCSAgICBteSAkb2xkX3Rlc3RfbnVtID0gJHRlc3RfbnVtOworCSAgICBteSAkb2xkX3JlcGVhdCA9ICRyZXBlYXQ7CisKKwkgICAgJHRlc3RfbnVtICs9ICRyZXBlYXQ7CisJICAgICRkZWZhdWx0ID0gMDsKKwkgICAgJHJlcGVhdCA9IDE7CisKKwkgICAgaWYgKCRyZXN0ID1+IC9ccytTS0lQKC4qKS8pIHsKKwkJJHJlc3QgPSAkMTsKKwkJJHNraXAgPSAxOworCSAgICB9IGVsc2UgeworCQkkc2tpcCA9IDA7CisJICAgIH0KKworCSAgICBpZiAoJHJlc3QgPX4gL1xzK0lURVJBVEVccysoXGQrKSguKikkLykgeworCQkkcmVwZWF0ID0gJDE7CisJCSRyZXN0ID0gJDI7CisJCSRyZXBlYXRfdGVzdHN7IiR0ZXN0X251bSJ9ID0gJHJlcGVhdDsKKwkgICAgfQorCisJICAgIGlmICgkcmVzdCA9fiAvXHMrU0tJUCguKikvKSB7CisJCSRyZXN0ID0gJDE7CisJCSRza2lwID0gMTsKKwkgICAgfQorCisJICAgIGlmICgkcmVzdCAhfiAvXlxzKiQvKSB7CisJCWRpZSAiJG5hbWU6ICQuOiBHYXJnYmFnZSBmb3VuZCBhZnRlciBURVNUX1NUQVJUXG4kXyI7CisJICAgIH0KKworCSAgICBpZiAoJHNraXApIHsKKwkJJHRlc3RfbnVtID0gJG9sZF90ZXN0X251bTsKKwkJJHJlcGVhdCA9ICRvbGRfcmVwZWF0OworCSAgICB9CisKKwl9IGVsc2lmICgvXlxzKkRFRkFVTFRTKC4qKSQvKSB7CisJICAgICRkZWZhdWx0ID0gMTsKKworCSAgICAkcmVzdCA9ICQxOworCisJICAgIGlmICgkcmVzdCA9fiAvXHMrU0tJUCguKikvKSB7CisJCSRyZXN0ID0gJDE7CisJCSRza2lwID0gMTsKKwkgICAgfSBlbHNlIHsKKwkJJHNraXAgPSAwOworCSAgICB9CisKKwkgICAgaWYgKCRyZXN0ICF+IC9eXHMqJC8pIHsKKwkJZGllICIkbmFtZTogJC46IEdhcmdiYWdlIGZvdW5kIGFmdGVyIERFRkFVTFRTXG4kXyI7CisJICAgIH0KKworCX0gZWxzaWYgKC9eXHMqKFtBLVpfXFtcXVxkXSspXHMqPVxzKiguKj8pXHMqJC8pIHsKKworCSAgICBuZXh0IGlmICgkc2tpcCk7CisKKwkgICAgbXkgJGx2YWx1ZSA9ICQxOworCSAgICBteSAkcnZhbHVlID0gJDI7CisKKwkgICAgaWYgKCEkZGVmYXVsdCAmJgorCQkoJGx2YWx1ZSBlcSAiTlVNX1RFU1RTIiB8fAorCQkgJGx2YWx1ZSBlcSAiTE9HX0ZJTEUiIHx8CisJCSAkbHZhbHVlIGVxICJDTEVBUl9MT0ciKSkgeworCQlkaWUgIiRuYW1lOiAkLjogJGx2YWx1ZSBtdXN0IGJlIHNldCBpbiBERUZBVUxUUyBzZWN0aW9uXG4iOworCSAgICB9CisKKwkgICAgaWYgKCRsdmFsdWUgZXEgIk5VTV9URVNUUyIpIHsKKwkJaWYgKCR0ZXN0X251bSkgeworCQkgICAgZGllICIkbmFtZTogJC46IENhbiBub3Qgc3BlY2lmeSBib3RoIE5VTV9URVNUUyBhbmQgVEVTVF9TVEFSVFxuIjsKKwkJfQorCQlpZiAoISRkZWZhdWx0KSB7CisJCSAgICBkaWUgIiRuYW1lOiAkLjogTlVNX1RFU1RTIG11c3QgYmUgc2V0IGluIGRlZmF1bHQgc2VjdGlvblxuIjsKKwkJfQorCQkkbnVtX3Rlc3RzX3NldCA9IDE7CisJICAgIH0KKworCSAgICBpZiAoJGRlZmF1bHQgfHwgJGx2YWx1ZSA9fiAvXFtcZCtcXSQvKSB7CisJCXNldF92YWx1ZSgkbHZhbHVlLCAkcnZhbHVlKTsKKwkgICAgfSBlbHNlIHsKKwkJbXkgJHZhbCA9ICIkbHZhbHVlXFskdGVzdF9udW1cXSI7CisJCXNldF92YWx1ZSgkdmFsLCAkcnZhbHVlKTsKKworCQlpZiAoJHJlcGVhdCA+IDEpIHsKKwkJICAgICRyZXBlYXRzeyR2YWx9ID0gJHJlcGVhdDsKKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgZGllICIkbmFtZTogJC46IEdhcmJhZ2UgZm91bmQgaW4gY29uZmlnXG4kXyI7CisJfQorICAgIH0KKworICAgIGNsb3NlKElOKTsKKworICAgIGlmICgkdGVzdF9udW0pIHsKKwkkdGVzdF9udW0gKz0gJHJlcGVhdCAtIDE7CisJJG9wdHsiTlVNX1RFU1RTIn0gPSAkdGVzdF9udW07CisgICAgfQorCisgICAgIyBtYWtlIHN1cmUgd2UgaGF2ZSBhbGwgbWFuZGF0b3J5IGNvbmZpZ3MKKyAgICBnZXRfa3Rlc3RfY29uZmlnczsKKworICAgICMgc2V0IGFueSBkZWZhdWx0cworCisgICAgZm9yZWFjaCBteSAkZGVmYXVsdCAoa2V5cyAlZGVmYXVsdCkgeworCWlmICghZGVmaW5lZCgkb3B0eyRkZWZhdWx0fSkpIHsKKwkgICAgJG9wdHskZGVmYXVsdH0gPSAkZGVmYXVsdHskZGVmYXVsdH07CisJfQorICAgIH0KK30KKworc3ViIF9sb2dpdCB7CisgICAgaWYgKGRlZmluZWQoJG9wdHsiTE9HX0ZJTEUifSkpIHsKKwlvcGVuKE9VVCwgIj4+ICRvcHR7TE9HX0ZJTEV9Iikgb3IgZGllICJDYW4ndCB3cml0ZSB0byAkb3B0e0xPR19GSUxFfSI7CisJcHJpbnQgT1VUIEBfOworCWNsb3NlKE9VVCk7CisgICAgfQorfQorCitzdWIgbG9naXQgeworICAgIGlmIChkZWZpbmVkKCRvcHR7IkxPR19GSUxFIn0pKSB7CisJX2xvZ2l0IEBfOworICAgIH0gZWxzZSB7CisJcHJpbnQgQF87CisgICAgfQorfQorCitzdWIgZG9wcmludCB7CisgICAgcHJpbnQgQF87CisgICAgX2xvZ2l0IEBfOworfQorCitzdWIgcnVuX2NvbW1hbmQ7CisKK3N1YiByZWJvb3QgeworICAgICMgdHJ5IHRvIHJlYm9vdCBub3JtYWxseQorICAgIGlmIChydW5fY29tbWFuZCAkcmVib290KSB7CisJaWYgKGRlZmluZWQoJHBvd2VyY3ljbGVfYWZ0ZXJfcmVib290KSkgeworCSAgICBzbGVlcCAkcG93ZXJjeWNsZV9hZnRlcl9yZWJvb3Q7CisJICAgIHJ1bl9jb21tYW5kICIkcG93ZXJfY3ljbGUiOworCX0KKyAgICB9IGVsc2UgeworCSMgbm9wZT8gcG93ZXIgY3ljbGUgaXQuCisJcnVuX2NvbW1hbmQgIiRwb3dlcl9jeWNsZSI7CisgICAgfQorfQorCitzdWIgZG9fbm90X3JlYm9vdCB7CisgICAgbXkgJGkgPSAkaXRlcmF0aW9uOworCisgICAgcmV0dXJuICR0ZXN0X3R5cGUgZXEgImJ1aWxkIiB8fAorCSgkdGVzdF90eXBlIGVxICJwYXRjaGNoZWNrIiAmJiAkb3B0eyJQQVRDSENIRUNLX1RZUEVbJGldIn0gZXEgImJ1aWxkIikgfHwKKwkoJHRlc3RfdHlwZSBlcSAiYmlzZWN0IiAmJiAkb3B0eyJCSVNFQ1RfVFlQRVskaV0ifSBlcSAiYnVpbGQiKTsKK30KKworc3ViIGRvZGllIHsKKyAgICBkb3ByaW50ICJDUklUSUNBTCBGQUlMVVJFLi4uICIsIEBfLCAiXG4iOworCisgICAgbXkgJGkgPSAkaXRlcmF0aW9uOworCisgICAgaWYgKCRyZWJvb3Rfb25fZXJyb3IgJiYgIWRvX25vdF9yZWJvb3QpIHsKKworCWRvcHJpbnQgIlJFQk9PVElOR1xuIjsKKwlyZWJvb3Q7CisKKyAgICB9IGVsc2lmICgkcG93ZXJvZmZfb25fZXJyb3IgJiYgZGVmaW5lZCgkcG93ZXJfb2ZmKSkgeworCWRvcHJpbnQgIlBPV0VSSU5HIE9GRlxuIjsKKwlgJHBvd2VyX29mZmA7CisgICAgfQorCisgICAgZGllIEBfLCAiXG4iOworfQorCitzdWIgb3Blbl9jb25zb2xlIHsKKyAgICBteSAoJGZwKSA9IEBfOworCisgICAgbXkgJGZsYWdzOworCisgICAgbXkgJHBpZCA9IG9wZW4oJGZwLCAiJGNvbnNvbGV8Iikgb3IKKwlkb2RpZSAiQ2FuJ3Qgb3BlbiBjb25zb2xlICRjb25zb2xlIjsKKworICAgICRmbGFncyA9IGZjbnRsKCRmcCwgRl9HRVRGTCwgMCkgb3IKKwlkb2RpZSAiQ2FuJ3QgZ2V0IGZsYWdzIGZvciB0aGUgc29ja2V0OiAkISI7CisgICAgJGZsYWdzID0gZmNudGwoJGZwLCBGX1NFVEZMLCAkZmxhZ3MgfCBPX05PTkJMT0NLKSBvcgorCWRvZGllICJDYW4ndCBzZXQgZmxhZ3MgZm9yIHRoZSBzb2NrZXQ6ICQhIjsKKworICAgIHJldHVybiAkcGlkOworfQorCitzdWIgY2xvc2VfY29uc29sZSB7CisgICAgbXkgKCRmcCwgJHBpZCkgPSBAXzsKKworICAgIGRvcHJpbnQgImtpbGwgY2hpbGQgcHJvY2VzcyAkcGlkXG4iOworICAgIGtpbGwgMiwgJHBpZDsKKworICAgIHByaW50ICJjbG9zaW5nIVxuIjsKKyAgICBjbG9zZSgkZnApOworfQorCitzdWIgc3RhcnRfbW9uaXRvciB7CisgICAgaWYgKCRtb25pdG9yX2NudCsrKSB7CisJcmV0dXJuOworICAgIH0KKyAgICAkbW9uaXRvcl9mcCA9IFwqTU9ORkQ7CisgICAgJG1vbml0b3JfcGlkID0gb3Blbl9jb25zb2xlICRtb25pdG9yX2ZwOworCisgICAgcmV0dXJuOworCisgICAgb3BlbihNT05GRCwgIlN0b3AgcGVybCBmcm9tIHdhcm5pbmcgYWJvdXQgc2luZ2xlIHVzZSBvZiBNT05GRCIpOworfQorCitzdWIgZW5kX21vbml0b3IgeworICAgIGlmICgtLSRtb25pdG9yX2NudCkgeworCXJldHVybjsKKyAgICB9CisgICAgY2xvc2VfY29uc29sZSgkbW9uaXRvcl9mcCwgJG1vbml0b3JfcGlkKTsKK30KKworc3ViIHdhaXRfZm9yX21vbml0b3IgeworICAgIG15ICgkdGltZSkgPSBAXzsKKyAgICBteSAkbGluZTsKKworICAgIGRvcHJpbnQgIioqIFdhaXQgZm9yIG1vbml0b3IgdG8gc2V0dGxlIGRvd24gKipcbiI7CisKKyAgICAjIHJlYWQgdGhlIG1vbml0b3IgYW5kIHdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gY2FsbSBkb3duCisgICAgZG8geworCSRsaW5lID0gd2FpdF9mb3JfaW5wdXQoJG1vbml0b3JfZnAsICR0aW1lKTsKKwlwcmludCAiJGxpbmUiIGlmIChkZWZpbmVkKCRsaW5lKSk7CisgICAgfSB3aGlsZSAoZGVmaW5lZCgkbGluZSkpOworICAgIHByaW50ICIqKiBNb25pdG9yIGZsdXNoZWQgKipcbiI7Cit9CisKK3N1YiBmYWlsIHsKKworCWlmICgkZGllX29uX2ZhaWx1cmUpIHsKKwkJZG9kaWUgQF87CisJfQorCisJZG9wcmludCAiRkFJTEVEXG4iOworCisJbXkgJGkgPSAkaXRlcmF0aW9uOworCisJIyBubyBuZWVkIHRvIHJlYm9vdCBmb3IganVzdCBidWlsZGluZy4KKwlpZiAoIWRvX25vdF9yZWJvb3QpIHsKKwkgICAgZG9wcmludCAiUkVCT09USU5HXG4iOworCSAgICByZWJvb3Q7CisJICAgIHN0YXJ0X21vbml0b3I7CisJICAgIHdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7CisJICAgIGVuZF9tb25pdG9yOworCX0KKworCWRvcHJpbnQgIiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSVcbiI7CisJZG9wcmludCAiJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJVxuIjsKKwlkb3ByaW50ICJLVEVTVCBSRVNVTFQ6IFRFU1QgJGkgRmFpbGVkOiAiLCBAXywgIlxuIjsKKwlkb3ByaW50ICIlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlXG4iOworCWRvcHJpbnQgIiUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSVcbiI7CisKKwlyZXR1cm4gMSBpZiAoIWRlZmluZWQoJHN0b3JlX2ZhaWx1cmVzKSk7CisKKwlteSBAdCA9IGxvY2FsdGltZTsKKwlteSAkZGF0ZSA9IHNwcmludGYgIiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsCisJCTE5MDArJHRbNV0sJHRbNF0sJHRbM10sJHRbMl0sJHRbMV0sJHRbMF07CisKKwlteSAkdHlwZSA9ICRidWlsZF90eXBlOworCWlmICgkdHlwZSA9fiAvdXNlY29uZmlnLykgeworCSAgICAkdHlwZSA9ICJ1c2Vjb25maWciOworCX0KKworCW15ICRkaXIgPSAiJG1hY2hpbmUtJHRlc3RfdHlwZS0kdHlwZS1mYWlsLSRkYXRlIjsKKwlteSAkZmFpbGRpciA9ICIkc3RvcmVfZmFpbHVyZXMvJGRpciI7CisKKwlpZiAoIS1kICRmYWlsZGlyKSB7CisJICAgIG1rcGF0aCgkZmFpbGRpcikgb3IKKwkJZGllICJjYW4ndCBjcmVhdGUgJGZhaWxkaXIiOworCX0KKwlpZiAoLWYgIiRvdXRwdXRfY29uZmlnIikgeworCSAgICBjcCAiJG91dHB1dF9jb25maWciLCAiJGZhaWxkaXIvY29uZmlnIiBvcgorCQlkaWUgImZhaWxlZCB0byBjb3B5IC5jb25maWciOworCX0KKwlpZiAoLWYgJGJ1aWxkbG9nKSB7CisJICAgIGNwICRidWlsZGxvZywgIiRmYWlsZGlyL2J1aWxkbG9nIiBvcgorCQlkaWUgImZhaWxlZCB0byBtb3ZlICRidWlsZGxvZyI7CisJfQorCWlmICgtZiAkZG1lc2cpIHsKKwkgICAgY3AgJGRtZXNnLCAiJGZhaWxkaXIvZG1lc2ciIG9yCisJCWRpZSAiZmFpbGVkIHRvIG1vdmUgJGRtZXNnIjsKKwl9CisKKwlkb3ByaW50ICIqKiogU2F2ZWQgaW5mbyB0byAkZmFpbGRpciAqKipcbiI7CisKKwlyZXR1cm4gMTsKK30KKworc3ViIHJ1bl9jb21tYW5kIHsKKyAgICBteSAoJGNvbW1hbmQpID0gQF87CisgICAgbXkgJGRvbG9nID0gMDsKKyAgICBteSAkZG9yZCA9IDA7CisgICAgbXkgJHBpZDsKKworICAgICRjb21tYW5kID1+IHMvXCRTU0hfVVNFUi8kc3NoX3VzZXIvZzsKKyAgICAkY29tbWFuZCA9fiBzL1wkTUFDSElORS8kbWFjaGluZS9nOworCisgICAgZG9wcmludCgiJGNvbW1hbmQgLi4uICIpOworCisgICAgJHBpZCA9IG9wZW4oQ01ELCAiJGNvbW1hbmQgMj4mMSB8Iikgb3IKKwkoZmFpbCAidW5hYmxlIHRvIGV4ZWMgJGNvbW1hbmQiIGFuZCByZXR1cm4gMCk7CisKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyJMT0dfRklMRSJ9KSkgeworCW9wZW4oTE9HLCAiPj4kb3B0e0xPR19GSUxFfSIpIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gd3JpdGUgdG8gbG9nIjsKKwkkZG9sb2cgPSAxOworICAgIH0KKworICAgIGlmIChkZWZpbmVkKCRyZWRpcmVjdCkpIHsKKwlvcGVuIChSRCwgIj4kcmVkaXJlY3QiKSBvcgorCSAgICBkb2RpZSAiZmFpbGVkIHRvIHdyaXRlIHRvIHJlZGlyZWN0ICRyZWRpcmVjdCI7CisJJGRvcmQgPSAxOworICAgIH0KKworICAgIHdoaWxlICg8Q01EPikgeworCXByaW50IExPRyBpZiAoJGRvbG9nKTsKKwlwcmludCBSRCAgaWYgKCRkb3JkKTsKKyAgICB9CisKKyAgICB3YWl0cGlkKCRwaWQsIDApOworICAgIG15ICRmYWlsZWQgPSAkPzsKKworICAgIGNsb3NlKENNRCk7CisgICAgY2xvc2UoTE9HKSBpZiAoJGRvbG9nKTsKKyAgICBjbG9zZShSRCkgIGlmICgkZG9yZCk7CisKKyAgICBpZiAoJGZhaWxlZCkgeworCWRvcHJpbnQgIkZBSUxFRCFcbiI7CisgICAgfSBlbHNlIHsKKwlkb3ByaW50ICJTVUNDRVNTXG4iOworICAgIH0KKworICAgIHJldHVybiAhJGZhaWxlZDsKK30KKworc3ViIHJ1bl9zc2ggeworICAgIG15ICgkY21kKSA9IEBfOworICAgIG15ICRjcF9leGVjID0gJHNzaF9leGVjOworCisgICAgJGNwX2V4ZWMgPX4gcy9cJFNTSF9DT01NQU5ELyRjbWQvZzsKKyAgICByZXR1cm4gcnVuX2NvbW1hbmQgIiRjcF9leGVjIjsKK30KKworc3ViIHJ1bl9zY3AgeworICAgIG15ICgkc3JjLCAkZHN0KSA9IEBfOworICAgIG15ICRjcF9zY3AgPSAkc2NwX3RvX3RhcmdldDsKKworICAgICRjcF9zY3AgPX4gcy9cJFNSQ19GSUxFLyRzcmMvZzsKKyAgICAkY3Bfc2NwID1+IHMvXCREU1RfRklMRS8kZHN0L2c7CisKKyAgICByZXR1cm4gcnVuX2NvbW1hbmQgIiRjcF9zY3AiOworfQorCitzdWIgZ2V0X2dydWJfaW5kZXggeworCisgICAgaWYgKCRyZWJvb3RfdHlwZSBuZSAiZ3J1YiIpIHsKKwlyZXR1cm47CisgICAgfQorICAgIHJldHVybiBpZiAoZGVmaW5lZCgkZ3J1Yl9udW1iZXIpKTsKKworICAgIGRvcHJpbnQgIkZpbmQgZ3J1YiBtZW51IC4uLiAiOworICAgICRncnViX251bWJlciA9IC0xOworCisgICAgbXkgJHNzaF9ncnViID0gJHNzaF9leGVjOworICAgICRzc2hfZ3J1YiA9fiBzLFwkU1NIX0NPTU1BTkQsY2F0IC9ib290L2dydWIvbWVudS5sc3QsZzsKKworICAgIG9wZW4oSU4sICIkc3NoX2dydWIgfCIpCisJb3IgZGllICJ1bmFibGUgdG8gZ2V0IG1lbnUubHN0IjsKKworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKC9eXHMqdGl0bGVccyskZ3J1Yl9tZW51XHMqJC8pIHsKKwkgICAgJGdydWJfbnVtYmVyKys7CisJICAgIGxhc3Q7CisJfSBlbHNpZiAoL15ccyp0aXRsZVxzLykgeworCSAgICAkZ3J1Yl9udW1iZXIrKzsKKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIGRpZSAiQ291bGQgbm90IGZpbmQgJyRncnViX21lbnUnIGluIC9ib290L2dydWIvbWVudSBvbiAkbWFjaGluZSIKKwlpZiAoJGdydWJfbnVtYmVyIDwgMCk7CisgICAgZG9wcmludCAiJGdydWJfbnVtYmVyXG4iOworfQorCitzdWIgd2FpdF9mb3JfaW5wdXQKK3sKKyAgICBteSAoJGZwLCAkdGltZSkgPSBAXzsKKyAgICBteSAkcmluOworICAgIG15ICRyZWFkeTsKKyAgICBteSAkbGluZTsKKyAgICBteSAkY2g7CisKKyAgICBpZiAoIWRlZmluZWQoJHRpbWUpKSB7CisJJHRpbWUgPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAkcmluID0gJyc7CisgICAgdmVjKCRyaW4sIGZpbGVubygkZnApLCAxKSA9IDE7CisgICAgJHJlYWR5ID0gc2VsZWN0KCRyaW4sIHVuZGVmLCB1bmRlZiwgJHRpbWUpOworCisgICAgJGxpbmUgPSAiIjsKKworICAgICMgdHJ5IHRvIHJlYWQgb25lIGNoYXIgYXQgYSB0aW1lCisgICAgd2hpbGUgKHN5c3JlYWQgJGZwLCAkY2gsIDEpIHsKKwkkbGluZSAuPSAkY2g7CisJbGFzdCBpZiAoJGNoIGVxICJcbiIpOworICAgIH0KKworICAgIGlmICghbGVuZ3RoKCRsaW5lKSkgeworCXJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICByZXR1cm4gJGxpbmU7Cit9CisKK3N1YiByZWJvb3RfdG8geworICAgIGlmICgkcmVib290X3R5cGUgZXEgImdydWIiKSB7CisJcnVuX3NzaCAiJyhlY2hvIFwic2F2ZWRlZmF1bHQgLS1kZWZhdWx0PSRncnViX251bWJlciAtLW9uY2VcIiB8IGdydWIgLS1iYXRjaDsgcmVib290KSciOworCXJldHVybjsKKyAgICB9CisKKyAgICBydW5fY29tbWFuZCAiJHJlYm9vdF9zY3JpcHQiOworfQorCitzdWIgZ2V0X3NoYTEgeworICAgIG15ICgkY29tbWl0KSA9IEBfOworCisgICAgZG9wcmludCAiZ2l0IHJldi1saXN0IC0tbWF4LWNvdW50PTEgJGNvbW1pdCAuLi4gIjsKKyAgICBteSAkc2hhMSA9IGBnaXQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MSAkY29tbWl0YDsKKyAgICBteSAkcmV0ID0gJD87CisKKyAgICBsb2dpdCAkc2hhMTsKKworICAgIGlmICgkcmV0KSB7CisJZG9wcmludCAiRkFJTEVEXG4iOworCWRvZGllICJGYWlsZWQgdG8gZ2V0IGdpdCAkY29tbWl0IjsKKyAgICB9CisKKyAgICBwcmludCAiU1VDQ0VTU1xuIjsKKworICAgIGNob21wICRzaGExOworCisgICAgcmV0dXJuICRzaGExOworfQorCitzdWIgbW9uaXRvciB7CisgICAgbXkgJGJvb3RlZCA9IDA7CisgICAgbXkgJGJ1ZyA9IDA7CisgICAgbXkgJHNraXBfY2FsbF90cmFjZSA9IDA7CisgICAgbXkgJGxvb3BzOworCisgICAgd2FpdF9mb3JfbW9uaXRvciA1OworCisgICAgbXkgJGxpbmU7CisgICAgbXkgJGZ1bGxfbGluZSA9ICIiOworCisgICAgb3BlbihETUVTRywgIj4gJGRtZXNnIikgb3IKKwlkaWUgInVuYWJsZSB0byB3cml0ZSB0byAkZG1lc2ciOworCisgICAgcmVib290X3RvOworCisgICAgbXkgJHN1Y2Nlc3Nfc3RhcnQ7CisgICAgbXkgJGZhaWx1cmVfc3RhcnQ7CisKKyAgICBmb3IgKDs7KSB7CisKKwlpZiAoJGJvb3RlZCkgeworCSAgICAkbGluZSA9IHdhaXRfZm9yX2lucHV0KCRtb25pdG9yX2ZwLCAkYm9vdGVkX3RpbWVvdXQpOworCX0gZWxzZSB7CisJICAgICRsaW5lID0gd2FpdF9mb3JfaW5wdXQoJG1vbml0b3JfZnApOworCX0KKworCWxhc3QgaWYgKCFkZWZpbmVkKCRsaW5lKSk7CisKKwlkb3ByaW50ICRsaW5lOworCXByaW50IERNRVNHICRsaW5lOworCisJIyB3ZSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gZ2V0IGEgZnVsbCBsaW5lCisJJGZ1bGxfbGluZSAuPSAkbGluZTsKKworCWlmICgkZnVsbF9saW5lID1+IC8kc3VjY2Vzc19saW5lLykgeworCSAgICAkYm9vdGVkID0gMTsKKwkgICAgJHN1Y2Nlc3Nfc3RhcnQgPSB0aW1lOworCX0KKworCWlmICgkYm9vdGVkICYmIGRlZmluZWQoJHN0b3BfYWZ0ZXJfc3VjY2VzcykgJiYKKwkgICAgJHN0b3BfYWZ0ZXJfc3VjY2VzcyA+PSAwKSB7CisJICAgIG15ICRub3cgPSB0aW1lOworCSAgICBpZiAoJG5vdyAtICRzdWNjZXNzX3N0YXJ0ID49ICRzdG9wX2FmdGVyX3N1Y2Nlc3MpIHsKKwkJZG9wcmludCAiVGVzdCBmb3JjZWQgdG8gc3RvcCBhZnRlciAkc3RvcF9hZnRlcl9zdWNjZXNzIHNlY29uZHMgYWZ0ZXIgc3VjY2Vzc1xuIjsKKwkJbGFzdDsKKwkgICAgfQorCX0KKworCWlmICgkZnVsbF9saW5lID1+IC9cWyBiYWNrdHJhY2UgdGVzdGluZyBcXS8pIHsKKwkgICAgJHNraXBfY2FsbF90cmFjZSA9IDE7CisJfQorCisJaWYgKCRmdWxsX2xpbmUgPX4gL2NhbGwgdHJhY2U6L2kpIHsKKwkgICAgaWYgKCEkc2tpcF9jYWxsX3RyYWNlKSB7CisJCSRidWcgPSAxOworCQkkZmFpbHVyZV9zdGFydCA9IHRpbWU7CisJICAgIH0KKwl9CisKKwlpZiAoJGJ1ZyAmJiBkZWZpbmVkKCRzdG9wX2FmdGVyX2ZhaWx1cmUpICYmCisJICAgICRzdG9wX2FmdGVyX2ZhaWx1cmUgPj0gMCkgeworCSAgICBteSAkbm93ID0gdGltZTsKKwkgICAgaWYgKCRub3cgLSAkZmFpbHVyZV9zdGFydCA+PSAkc3RvcF9hZnRlcl9mYWlsdXJlKSB7CisJCWRvcHJpbnQgIlRlc3QgZm9yY2VkIHRvIHN0b3AgYWZ0ZXIgJHN0b3BfYWZ0ZXJfZmFpbHVyZSBzZWNvbmRzIGFmdGVyIGZhaWx1cmVcbiI7CisJCWxhc3Q7CisJICAgIH0KKwl9CisKKwlpZiAoJGZ1bGxfbGluZSA9fiAvXFsgZW5kIG9mIGJhY2t0cmFjZSB0ZXN0aW5nIFxdLykgeworCSAgICAkc2tpcF9jYWxsX3RyYWNlID0gMDsKKwl9CisKKwlpZiAoJGZ1bGxfbGluZSA9fiAvS2VybmVsIHBhbmljIC0vKSB7CisJICAgICRidWcgPSAxOworCX0KKworCWlmICgkbGluZSA9fiAvXG4vKSB7CisJICAgICRmdWxsX2xpbmUgPSAiIjsKKwl9CisgICAgfQorCisgICAgY2xvc2UoRE1FU0cpOworCisgICAgaWYgKCRidWcpIHsKKwlyZXR1cm4gMCBpZiAoJGluX2Jpc2VjdCk7CisJZmFpbCAiZmFpbGVkIC0gZ290IGEgYnVnIHJlcG9ydCIgYW5kIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghJGJvb3RlZCkgeworCXJldHVybiAwIGlmICgkaW5fYmlzZWN0KTsKKwlmYWlsICJmYWlsZWQgLSBuZXZlciBnb3QgYSBib290IHByb21wdC4iIGFuZCByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGluc3RhbGwgeworCisgICAgcnVuX3NjcCAiJG91dHB1dGRpci8kYnVpbGRfdGFyZ2V0IiwgIiR0YXJnZXRfaW1hZ2UiIG9yCisJZG9kaWUgImZhaWxlZCB0byBjb3B5IGltYWdlIjsKKworICAgIG15ICRpbnN0YWxsX21vZHMgPSAwOworCisgICAgIyBzaG91bGQgd2UgcHJvY2VzcyBtb2R1bGVzPworICAgICRpbnN0YWxsX21vZHMgPSAwOworICAgIG9wZW4oSU4sICIkb3V0cHV0X2NvbmZpZyIpIG9yIGRvZGllKCJDYW4ndCByZWFkIGNvbmZpZyBmaWxlIik7CisgICAgd2hpbGUgKDxJTj4pIHsKKwlpZiAoL0NPTkZJR19NT0RVTEVTKD15KT8vKSB7CisJICAgICRpbnN0YWxsX21vZHMgPSAxIGlmIChkZWZpbmVkKCQxKSk7CisJICAgIGxhc3Q7CisJfQorICAgIH0KKyAgICBjbG9zZShJTik7CisKKyAgICBpZiAoISRpbnN0YWxsX21vZHMpIHsKKwlkb3ByaW50ICJObyBtb2R1bGVzIG5lZWRlZFxuIjsKKwlyZXR1cm47CisgICAgfQorCisgICAgcnVuX2NvbW1hbmQgIiRtYWtlIElOU1RBTExfTU9EX1BBVEg9JHRtcGRpciBtb2R1bGVzX2luc3RhbGwiIG9yCisJZG9kaWUgIkZhaWxlZCB0byBpbnN0YWxsIG1vZHVsZXMiOworCisgICAgbXkgJG1vZGxpYiA9ICIvbGliL21vZHVsZXMvJHZlcnNpb24iOworICAgIG15ICRtb2R0YXIgPSAia3Rlc3QtbW9kcy50YXIuYnoyIjsKKworICAgIHJ1bl9zc2ggInJtIC1yZiAkbW9kbGliIiBvcgorCWRvZGllICJmYWlsZWQgdG8gcmVtb3ZlIG9sZCBtb2RzOiAkbW9kbGliIjsKKworICAgICMgd291bGQgYmUgbmljZSBpZiBzY3AgLXIgZGlkIG5vdCBmb2xsb3cgc3ltYm9saWMgbGlua3MKKyAgICBydW5fY29tbWFuZCAiY2QgJHRtcGRpciAmJiB0YXIgLWNqZiAkbW9kdGFyIGxpYi9tb2R1bGVzLyR2ZXJzaW9uIiBvcgorCWRvZGllICJtYWtpbmcgdGFyYmFsbCI7CisKKyAgICBydW5fc2NwICIkdG1wZGlyLyRtb2R0YXIiLCAiL3RtcCIgb3IKKwlkb2RpZSAiZmFpbGVkIHRvIGNvcHkgbW9kdWxlcyI7CisKKyAgICB1bmxpbmsgIiR0bXBkaXIvJG1vZHRhciI7CisKKyAgICBydW5fc3NoICInKGNkIC8gJiYgdGFyIHhmIC90bXAvJG1vZHRhciknIiBvcgorCWRvZGllICJmYWlsZWQgdG8gdGFyIG1vZHVsZXMiOworCisgICAgcnVuX3NzaCAicm0gLWYgL3RtcC8kbW9kdGFyIjsKKworICAgIHJldHVybiBpZiAoIWRlZmluZWQoJHBvc3RfaW5zdGFsbCkpOworCisgICAgbXkgJGNwX3Bvc3RfaW5zdGFsbCA9ICRwb3N0X2luc3RhbGw7CisgICAgJGNwX3Bvc3RfaW5zdGFsbCA9IHMvXCRLRVJORUxfVkVSU0lPTi8kdmVyc2lvbi9nOworICAgIHJ1bl9jb21tYW5kICIkY3BfcG9zdF9pbnN0YWxsIiBvcgorCWRvZGllICJGYWlsZWQgdG8gcnVuIHBvc3QgaW5zdGFsbCI7Cit9CisKK3N1YiBjaGVja19idWlsZGxvZyB7CisgICAgbXkgKCRwYXRjaCkgPSBAXzsKKworICAgIG15IEBmaWxlcyA9IGBnaXQgc2hvdyAkcGF0Y2ggfCBkaWZmc3RhdCAtbGA7CisKKyAgICBvcGVuKElOLCAiZ2l0IHNob3cgJHBhdGNoIHwiKSBvcgorCWRvZGllICJmYWlsZWQgdG8gc2hvdyAkcGF0Y2giOworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKG0sXi0tLSBhLyguKiksKSB7CisJICAgIGNob21wICQxOworCSAgICAkZmlsZXNbJCNmaWxlc10gPSAkMTsKKwl9CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIG9wZW4oSU4sICRidWlsZGxvZykgb3IgZG9kaWUgIkNhbid0IG9wZW4gJGJ1aWxkbG9nIjsKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgvXlxzKiguKj8pOi4qKHdhcm5pbmd8ZXJyb3IpLykgeworCSAgICBteSAkZXJyID0gJDE7CisJICAgIGZvcmVhY2ggbXkgJGZpbGUgKEBmaWxlcykgeworCQlteSAkZnVsbHBhdGggPSAiJGJ1aWxkZGlyLyRmaWxlIjsKKwkJaWYgKCRmaWxlIGVxICRlcnIgfHwgJGZ1bGxwYXRoIGVxICRlcnIpIHsKKwkJICAgIGZhaWwgIiRmaWxlIGJ1aWx0IHdpdGggd2FybmluZ3MiIGFuZCByZXR1cm4gMDsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICBjbG9zZShJTik7CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGJ1aWxkIHsKKyAgICBteSAoJHR5cGUpID0gQF87CisgICAgbXkgJGRlZmNvbmZpZyA9ICIiOworCisgICAgdW5saW5rICRidWlsZGxvZzsKKworICAgIGlmICgkdHlwZSA9fiAvXnVzZWNvbmZpZzooLiopLykgeworCXJ1bl9jb21tYW5kICJjcCAkMSAkb3V0cHV0X2NvbmZpZyIgb3IKKwkgICAgZG9kaWUgImNvdWxkIG5vdCBjb3B5ICQxIHRvIC5jb25maWciOworCisJJHR5cGUgPSAib2xkY29uZmlnIjsKKyAgICB9CisKKyAgICAjIG9sZCBjb25maWcgY2FuIGFzayBxdWVzdGlvbnMKKyAgICBpZiAoJHR5cGUgZXEgIm9sZGNvbmZpZyIpIHsKKwkkdHlwZSA9ICJvbGRub2NvbmZpZyI7CisKKwkjIGFsbG93IGZvciBlbXB0eSBjb25maWdzCisJcnVuX2NvbW1hbmQgInRvdWNoICRvdXRwdXRfY29uZmlnIjsKKworCXJ1bl9jb21tYW5kICJtdiAkb3V0cHV0X2NvbmZpZyAkb3V0cHV0ZGlyL2NvbmZpZ190ZW1wIiBvcgorCSAgICBkb2RpZSAibW92aW5nIC5jb25maWciOworCisJaWYgKCEkbm9jbGVhbiAmJiAhcnVuX2NvbW1hbmQgIiRtYWtlIG1ycHJvcGVyIikgeworCSAgICBkb2RpZSAibWFrZSBtcnByb3BlciI7CisJfQorCisJcnVuX2NvbW1hbmQgIm12ICRvdXRwdXRkaXIvY29uZmlnX3RlbXAgJG91dHB1dF9jb25maWciIG9yCisJICAgIGRvZGllICJtb3ZpbmcgY29uZmlnX3RlbXAiOworCisgICAgfSBlbHNpZiAoISRub2NsZWFuKSB7CisJdW5saW5rICIkb3V0cHV0X2NvbmZpZyI7CisJcnVuX2NvbW1hbmQgIiRtYWtlIG1ycHJvcGVyIiBvcgorCSAgICBkb2RpZSAibWFrZSBtcnByb3BlciI7CisgICAgfQorCisgICAgIyBhZGQgc29tZXRoaW5nIHRvIGRpc3Rpbmd1aXNoIHRoaXMgYnVpbGQKKyAgICBvcGVuKE9VVCwgIj4gJG91dHB1dGRpci9sb2NhbHZlcnNpb24iKSBvciBkb2RpZSgiQ2FuJ3QgbWFrZSBsb2NhbHZlcnNpb24gZmlsZSIpOworICAgIHByaW50IE9VVCAiJGxvY2FsdmVyc2lvblxuIjsKKyAgICBjbG9zZShPVVQpOworCisgICAgaWYgKGRlZmluZWQoJG1pbmNvbmZpZykpIHsKKwkkZGVmY29uZmlnID0gIktDT05GSUdfQUxMQ09ORklHPSRtaW5jb25maWciOworICAgIH0KKworICAgIHJ1bl9jb21tYW5kICIkZGVmY29uZmlnICRtYWtlICR0eXBlIiBvcgorCWRvZGllICJmYWlsZWQgbWFrZSBjb25maWciOworCisgICAgJHJlZGlyZWN0ID0gIiRidWlsZGxvZyI7CisgICAgaWYgKCFydW5fY29tbWFuZCAiJG1ha2UgJGJ1aWxkX29wdGlvbnMiKSB7CisJdW5kZWYgJHJlZGlyZWN0OworCSMgYmlzZWN0IG1heSBuZWVkIHRoaXMgdG8gcGFzcworCXJldHVybiAwIGlmICgkaW5fYmlzZWN0KTsKKwlmYWlsICJmYWlsZWQgYnVpbGQiIGFuZCByZXR1cm4gMDsKKyAgICB9CisgICAgdW5kZWYgJHJlZGlyZWN0OworCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBoYWx0IHsKKyAgICBpZiAoIXJ1bl9zc2ggImhhbHQiIG9yIGRlZmluZWQoJHBvd2VyX29mZikpIHsKKwlpZiAoZGVmaW5lZCgkcG93ZXJvZmZfYWZ0ZXJfaGFsdCkpIHsKKwkgICAgc2xlZXAgJHBvd2Vyb2ZmX2FmdGVyX2hhbHQ7CisJICAgIHJ1bl9jb21tYW5kICIkcG93ZXJfb2ZmIjsKKwl9CisgICAgfSBlbHNlIHsKKwkjIG5vcGU/IHRoZSB6YXAgaXQhCisJcnVuX2NvbW1hbmQgIiRwb3dlcl9vZmYiOworICAgIH0KK30KKworc3ViIHN1Y2Nlc3MgeworICAgIG15ICgkaSkgPSBAXzsKKworICAgICRzdWNjZXNzZXMrKzsKKworICAgIGRvcHJpbnQgIlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworICAgIGRvcHJpbnQgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworICAgIGRvcHJpbnQgICAgICJLVEVTVCBSRVNVTFQ6IFRFU1QgJGkgU1VDQ0VTUyEhISEgICAgICAgICAqKlxuIjsKKyAgICBkb3ByaW50ICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKKyAgICBkb3ByaW50ICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKKworICAgIGlmICgkaSAhPSAkb3B0eyJOVU1fVEVTVFMifSAmJiAhZG9fbm90X3JlYm9vdCkgeworCWRvcHJpbnQgIlJlYm9vdCBhbmQgd2FpdCAkc2xlZXBfdGltZSBzZWNvbmRzXG4iOworCXJlYm9vdDsKKwlzdGFydF9tb25pdG9yOworCXdhaXRfZm9yX21vbml0b3IgJHNsZWVwX3RpbWU7CisJZW5kX21vbml0b3I7CisgICAgfQorfQorCitzdWIgZ2V0X3ZlcnNpb24geworICAgICMgZ2V0IHRoZSByZWxlYXNlIG5hbWUKKyAgICBkb3ByaW50ICIkbWFrZSBrZXJuZWxyZWxlYXNlIC4uLiAiOworICAgICR2ZXJzaW9uID0gYCRtYWtlIGtlcm5lbHJlbGVhc2UgfCB0YWlsIC0xYDsKKyAgICBjaG9tcCgkdmVyc2lvbik7CisgICAgZG9wcmludCAiJHZlcnNpb25cbiI7Cit9CisKK3N1YiBjaGlsZF9ydW5fdGVzdCB7CisgICAgbXkgJGZhaWxlZCA9IDA7CisKKyAgICAjIGNoaWxkIHNob3VsZCBoYXZlIG5vIHBvd2VyCisgICAgJHJlYm9vdF9vbl9lcnJvciA9IDA7CisgICAgJHBvd2Vyb2ZmX29uX2Vycm9yID0gMDsKKyAgICAkZGllX29uX2ZhaWx1cmUgPSAxOworCisgICAgcnVuX2NvbW1hbmQgJHJ1bl90ZXN0IG9yICRmYWlsZWQgPSAxOworICAgIGV4aXQgJGZhaWxlZDsKK30KKworbXkgJGNoaWxkX2RvbmU7CisKK3N1YiBjaGlsZF9maW5pc2hlZCB7CisgICAgJGNoaWxkX2RvbmUgPSAxOworfQorCitzdWIgZG9fcnVuX3Rlc3QgeworICAgIG15ICRjaGlsZF9waWQ7CisgICAgbXkgJGNoaWxkX2V4aXQ7CisgICAgbXkgJGxpbmU7CisgICAgbXkgJGZ1bGxfbGluZTsKKyAgICBteSAkYnVnID0gMDsKKworICAgIHdhaXRfZm9yX21vbml0b3IgMTsKKworICAgIGRvcHJpbnQgInJ1biB0ZXN0ICRydW5fdGVzdFxuIjsKKworICAgICRjaGlsZF9kb25lID0gMDsKKworICAgICRTSUd7Q0hMRH0gPSBxdyhjaGlsZF9maW5pc2hlZCk7CisKKyAgICAkY2hpbGRfcGlkID0gZm9yazsKKworICAgIGNoaWxkX3J1bl90ZXN0IGlmICghJGNoaWxkX3BpZCk7CisKKyAgICAkZnVsbF9saW5lID0gIiI7CisKKyAgICBkbyB7CisJJGxpbmUgPSB3YWl0X2Zvcl9pbnB1dCgkbW9uaXRvcl9mcCwgMSk7CisJaWYgKGRlZmluZWQoJGxpbmUpKSB7CisKKwkgICAgIyB3ZSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gZ2V0IGEgZnVsbCBsaW5lCisJICAgICRmdWxsX2xpbmUgLj0gJGxpbmU7CisKKwkgICAgaWYgKCRmdWxsX2xpbmUgPX4gL2NhbGwgdHJhY2U6L2kpIHsKKwkJJGJ1ZyA9IDE7CisJICAgIH0KKworCSAgICBpZiAoJGZ1bGxfbGluZSA9fiAvS2VybmVsIHBhbmljIC0vKSB7CisJCSRidWcgPSAxOworCSAgICB9CisKKwkgICAgaWYgKCRsaW5lID1+IC9cbi8pIHsKKwkJJGZ1bGxfbGluZSA9ICIiOworCSAgICB9CisJfQorICAgIH0gd2hpbGUgKCEkY2hpbGRfZG9uZSAmJiAhJGJ1Zyk7CisKKyAgICBpZiAoJGJ1ZykgeworCWRvcHJpbnQgIkRldGVjdGVkIGtlcm5lbCBjcmFzaCFcbiI7CisJIyBraWxsIHRoZSBjaGlsZCB3aXRoIGV4dHJlbWUgcHJlanVkaWNlCisJa2lsbCA5LCAkY2hpbGRfcGlkOworICAgIH0KKworICAgIHdhaXRwaWQgJGNoaWxkX3BpZCwgMDsKKyAgICAkY2hpbGRfZXhpdCA9ICQ/OworCisgICAgaWYgKCRidWcgfHwgJGNoaWxkX2V4aXQpIHsKKwlyZXR1cm4gMCBpZiAkaW5fYmlzZWN0OworCWZhaWwgInRlc3QgZmFpbGVkIiBhbmQgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdWIgcnVuX2dpdF9iaXNlY3QgeworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKworICAgIGRvcHJpbnQgIiRjb21tYW5kIC4uLiAiOworCisgICAgbXkgJG91dHB1dCA9IGAkY29tbWFuZCAyPiYxYDsKKyAgICBteSAkcmV0ID0gJD87CisKKyAgICBsb2dpdCAkb3V0cHV0OworCisgICAgaWYgKCRyZXQpIHsKKwlkb3ByaW50ICJGQUlMRURcbiI7CisJZG9kaWUgIkZhaWxlZCB0byBnaXQgYmlzZWN0IjsKKyAgICB9CisKKyAgICBkb3ByaW50ICJTVUNDRVNTXG4iOworICAgIGlmICgkb3V0cHV0ID1+IG0vXihCaXNlY3Rpbmc6IC4qXChyb3VnaGx5IFxkKyBzdGVwcz9cKSlccytcWyhbWzp4ZGlnaXQ6XV0rKVxdLykgeworCWRvcHJpbnQgIiQxIFskMl1cbiI7CisgICAgfSBlbHNpZiAoJG91dHB1dCA9fiBtL14oW1s6eGRpZ2l0Ol1dKykgaXMgdGhlIGZpcnN0IGJhZCBjb21taXQvKSB7CisJJGJpc2VjdF9iYWQgPSAkMTsKKwlkb3ByaW50ICJGb3VuZCBiYWQgY29tbWl0Li4uICQxXG4iOworCXJldHVybiAwOworICAgIH0gZWxzZSB7CisJIyB3ZSBhbHJlYWR5IGxvZ2dlZCBpdCwganVzdCBwcmludCBpdCBub3cuCisJcHJpbnQgJG91dHB1dDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworIyByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlCitzdWIgcnVuX2Jpc2VjdF90ZXN0IHsKKyAgICBteSAoJHR5cGUsICRidWlsZHR5cGUpID0gQF87CisKKyAgICBteSAkZmFpbGVkID0gMDsKKyAgICBteSAkcmVzdWx0OworICAgIG15ICRvdXRwdXQ7CisgICAgbXkgJHJldDsKKworICAgICRpbl9iaXNlY3QgPSAxOworCisgICAgYnVpbGQgJGJ1aWxkdHlwZSBvciAkZmFpbGVkID0gMTsKKworICAgIGlmICgkdHlwZSBuZSAiYnVpbGQiKSB7CisJZG9kaWUgIkZhaWxlZCBvbiBidWlsZCIgaWYgJGZhaWxlZDsKKworCSMgTm93IGJvb3QgdGhlIGJveAorCWdldF9ncnViX2luZGV4OworCWdldF92ZXJzaW9uOworCWluc3RhbGw7CisKKwlzdGFydF9tb25pdG9yOworCW1vbml0b3Igb3IgJGZhaWxlZCA9IDE7CisKKwlpZiAoJHR5cGUgbmUgImJvb3QiKSB7CisJICAgIGRvZGllICJGYWlsZWQgb24gYm9vdCIgaWYgJGZhaWxlZDsKKworCSAgICBkb19ydW5fdGVzdCBvciAkZmFpbGVkID0gMTsKKwl9CisJZW5kX21vbml0b3I7CisgICAgfQorCisgICAgaWYgKCRmYWlsZWQpIHsKKwkkcmVzdWx0ID0gMDsKKworCSMgcmVib290IHRoZSBib3ggdG8gYSBnb29kIGtlcm5lbAorCWlmICgkdHlwZSBuZSAiYnVpbGQiKSB7CisJICAgIGRvcHJpbnQgIlJlYm9vdCBhbmQgc2xlZXAgJGJpc2VjdF9zbGVlcF90aW1lIHNlY29uZHNcbiI7CisJICAgIHJlYm9vdDsKKwkgICAgc3RhcnRfbW9uaXRvcjsKKwkgICAgd2FpdF9mb3JfbW9uaXRvciAkYmlzZWN0X3NsZWVwX3RpbWU7CisJICAgIGVuZF9tb25pdG9yOworCX0KKyAgICB9IGVsc2UgeworCSRyZXN1bHQgPSAxOworICAgIH0KKyAgICAkaW5fYmlzZWN0ID0gMDsKKworICAgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgcnVuX2Jpc2VjdCB7CisgICAgbXkgKCR0eXBlKSA9IEBfOworICAgIG15ICRidWlsZHR5cGUgPSAib2xkY29uZmlnIjsKKworICAgICMgV2Ugc2hvdWxkIGhhdmUgYSBtaW5jb25maWcgdG8gdXNlPworICAgIGlmIChkZWZpbmVkKCRtaW5jb25maWcpKSB7CisJJGJ1aWxkdHlwZSA9ICJ1c2Vjb25maWc6JG1pbmNvbmZpZyI7CisgICAgfQorCisgICAgbXkgJHJldCA9IHJ1bl9iaXNlY3RfdGVzdCAkdHlwZSwgJGJ1aWxkdHlwZTsKKworCisgICAgIyBBcmUgd2UgbG9va2luZyBmb3Igd2hlcmUgaXQgd29ya2VkLCBub3QgZmFpbGVkPworICAgIGlmICgkcmV2ZXJzZV9iaXNlY3QpIHsKKwkkcmV0ID0gISRyZXQ7CisgICAgfQorCisgICAgaWYgKCRyZXQpIHsKKwlyZXR1cm4gImdvb2QiOworICAgIH0gZWxzZSB7CisJcmV0dXJuICAiYmFkIjsKKyAgICB9Cit9CisKK3N1YiBiaXNlY3QgeworICAgIG15ICgkaSkgPSBAXzsKKworICAgIG15ICRyZXN1bHQ7CisKKyAgICBkaWUgIkJJU0VDVF9HT09EWyRpXSBub3QgZGVmaW5lZFxuIglpZiAoIWRlZmluZWQoJG9wdHsiQklTRUNUX0dPT0RbJGldIn0pKTsKKyAgICBkaWUgIkJJU0VDVF9CQURbJGldIG5vdCBkZWZpbmVkXG4iCWlmICghZGVmaW5lZCgkb3B0eyJCSVNFQ1RfQkFEWyRpXSJ9KSk7CisgICAgZGllICJCSVNFQ1RfVFlQRVskaV0gbm90IGRlZmluZWRcbiIJaWYgKCFkZWZpbmVkKCRvcHR7IkJJU0VDVF9UWVBFWyRpXSJ9KSk7CisKKyAgICBteSAkZ29vZCA9ICRvcHR7IkJJU0VDVF9HT09EWyRpXSJ9OworICAgIG15ICRiYWQgPSAkb3B0eyJCSVNFQ1RfQkFEWyRpXSJ9OworICAgIG15ICR0eXBlID0gJG9wdHsiQklTRUNUX1RZUEVbJGldIn07CisgICAgbXkgJHN0YXJ0ID0gJG9wdHsiQklTRUNUX1NUQVJUWyRpXSJ9OworICAgIG15ICRyZXBsYXkgPSAkb3B0eyJCSVNFQ1RfUkVQTEFZWyRpXSJ9OworCisgICAgIyBjb252ZXJ0IHRvIHRydWUgc2hhMSdzCisgICAgJGdvb2QgPSBnZXRfc2hhMSgkZ29vZCk7CisgICAgJGJhZCA9IGdldF9zaGExKCRiYWQpOworCisgICAgaWYgKGRlZmluZWQoJG9wdHsiQklTRUNUX1JFVkVSU0VbJGldIn0pICYmCisJJG9wdHsiQklTRUNUX1JFVkVSU0VbJGldIn0gPT0gMSkgeworCWRvcHJpbnQgIlBlcmZvcm1pbmcgYSByZXZlcnNlIGJpc2VjdCAoYmFkIGlzIGdvb2QsIGdvb2QgaXMgYmFkISlcbiI7CisJJHJldmVyc2VfYmlzZWN0ID0gMTsKKyAgICB9IGVsc2UgeworCSRyZXZlcnNlX2Jpc2VjdCA9IDA7CisgICAgfQorCisgICAgIyBDYW4ndCBoYXZlIGEgdGVzdCB3aXRob3V0IGhhdmluZyBhIHRlc3QgdG8gcnVuCisgICAgaWYgKCR0eXBlIGVxICJ0ZXN0IiAmJiAhZGVmaW5lZCgkcnVuX3Rlc3QpKSB7CisJJHR5cGUgPSAiYm9vdCI7CisgICAgfQorCisgICAgbXkgJGNoZWNrID0gJG9wdHsiQklTRUNUX0NIRUNLWyRpXSJ9OworICAgIGlmIChkZWZpbmVkKCRjaGVjaykgJiYgJGNoZWNrIG5lICIwIikgeworCisJIyBnZXQgY3VycmVudCBIRUFECisJbXkgJGhlYWQgPSBnZXRfc2hhMSgiSEVBRCIpOworCisJaWYgKCRjaGVjayBuZSAiZ29vZCIpIHsKKwkgICAgZG9wcmludCAiVEVTVElORyBCSVNFQ1QgQkFEIFskYmFkXVxuIjsKKwkgICAgcnVuX2NvbW1hbmQgImdpdCBjaGVja291dCAkYmFkIiBvcgorCQlkaWUgIkZhaWxlZCB0byBjaGVja291dCAkYmFkIjsKKworCSAgICAkcmVzdWx0ID0gcnVuX2Jpc2VjdCAkdHlwZTsKKworCSAgICBpZiAoJHJlc3VsdCBuZSAiYmFkIikgeworCQlmYWlsICJUZXN0ZWQgQklTRUNUX0JBRCBbJGJhZF0gYW5kIGl0IHN1Y2NlZWRlZCIgYW5kIHJldHVybiAwOworCSAgICB9CisJfQorCisJaWYgKCRjaGVjayBuZSAiYmFkIikgeworCSAgICBkb3ByaW50ICJURVNUSU5HIEJJU0VDVCBHT09EIFskZ29vZF1cbiI7CisJICAgIHJ1bl9jb21tYW5kICJnaXQgY2hlY2tvdXQgJGdvb2QiIG9yCisJCWRpZSAiRmFpbGVkIHRvIGNoZWNrb3V0ICRnb29kIjsKKworCSAgICAkcmVzdWx0ID0gcnVuX2Jpc2VjdCAkdHlwZTsKKworCSAgICBpZiAoJHJlc3VsdCBuZSAiZ29vZCIpIHsKKwkJZmFpbCAiVGVzdGVkIEJJU0VDVF9HT09EIFskZ29vZF0gYW5kIGl0IGZhaWxlZCIgYW5kIHJldHVybiAwOworCSAgICB9CisJfQorCisJIyBjaGVja291dCB3aGVyZSB3ZSBzdGFydGVkCisJcnVuX2NvbW1hbmQgImdpdCBjaGVja291dCAkaGVhZCIgb3IKKwkgICAgZGllICJGYWlsZWQgdG8gY2hlY2tvdXQgJGhlYWQiOworICAgIH0KKworICAgIHJ1bl9jb21tYW5kICJnaXQgYmlzZWN0IHN0YXJ0IiBvcgorCWRvZGllICJjb3VsZCBub3Qgc3RhcnQgYmlzZWN0IjsKKworICAgIHJ1bl9jb21tYW5kICJnaXQgYmlzZWN0IGdvb2QgJGdvb2QiIG9yCisJZG9kaWUgImNvdWxkIG5vdCBzZXQgYmlzZWN0IGdvb2QgdG8gJGdvb2QiOworCisgICAgcnVuX2dpdF9iaXNlY3QgImdpdCBiaXNlY3QgYmFkICRiYWQiIG9yCisJZG9kaWUgImNvdWxkIG5vdCBzZXQgYmlzZWN0IGJhZCB0byAkYmFkIjsKKworICAgIGlmIChkZWZpbmVkKCRyZXBsYXkpKSB7CisJcnVuX2NvbW1hbmQgImdpdCBiaXNlY3QgcmVwbGF5ICRyZXBsYXkiIG9yCisJICAgIGRvZGllICJmYWlsZWQgdG8gcnVuIHJlcGxheSI7CisgICAgfQorCisgICAgaWYgKGRlZmluZWQoJHN0YXJ0KSkgeworCXJ1bl9jb21tYW5kICJnaXQgY2hlY2tvdXQgJHN0YXJ0IiBvcgorCSAgICBkb2RpZSAiZmFpbGVkIHRvIGNoZWNrb3V0ICRzdGFydCI7CisgICAgfQorCisgICAgbXkgJHRlc3Q7CisgICAgZG8geworCSRyZXN1bHQgPSBydW5fYmlzZWN0ICR0eXBlOworCSR0ZXN0ID0gcnVuX2dpdF9iaXNlY3QgImdpdCBiaXNlY3QgJHJlc3VsdCI7CisgICAgfSB3aGlsZSAoJHRlc3QpOworCisgICAgcnVuX2NvbW1hbmQgImdpdCBiaXNlY3QgbG9nIiBvcgorCWRvZGllICJjb3VsZCBub3QgY2FwdHVyZSBnaXQgYmlzZWN0IGxvZyI7CisKKyAgICBydW5fY29tbWFuZCAiZ2l0IGJpc2VjdCByZXNldCIgb3IKKwlkb2RpZSAiY291bGQgbm90IHJlc2V0IGdpdCBiaXNlY3QiOworCisgICAgZG9wcmludCAiQmFkIGNvbW1pdCB3YXMgWyRiaXNlY3RfYmFkXVxuIjsKKworICAgIHN1Y2Nlc3MgJGk7Cit9CisKK215ICVjb25maWdfaWdub3JlOworbXkgJWNvbmZpZ19zZXQ7CisKK215ICVjb25maWdfbGlzdDsKK215ICVudWxsX2NvbmZpZzsKKworbXkgJWRlcGVuZGVuY3k7CisKK3N1YiBwcm9jZXNzX2NvbmZpZ19pZ25vcmUgeworICAgIG15ICgkY29uZmlnKSA9IEBfOworCisgICAgb3BlbiAoSU4sICRjb25maWcpCisJb3IgZG9kaWUgIkZhaWxlZCB0byByZWFkICRjb25maWciOworCisgICAgd2hpbGUgKDxJTj4pIHsKKwlpZiAoL14oLio/KENPTkZJR1xTKikoPS4qfCBpcyBub3Qgc2V0KSkvKSB7CisJICAgICRjb25maWdfaWdub3JleyQyfSA9ICQxOworCX0KKyAgICB9CisKKyAgICBjbG9zZShJTik7Cit9CisKK3N1YiByZWFkX2N1cnJlbnRfY29uZmlnIHsKKyAgICBteSAoJGNvbmZpZ19yZWYpID0gQF87CisKKyAgICAleyRjb25maWdfcmVmfSA9ICgpOworICAgIHVuZGVmICV7JGNvbmZpZ19yZWZ9OworCisgICAgbXkgQGtleSA9IGtleXMgJXskY29uZmlnX3JlZn07CisgICAgaWYgKCQja2V5ID49IDApIHsKKwlwcmludCAiZGlkIG5vdCBkZWxldGUhXG4iOworCWV4aXQ7CisgICAgfQorICAgIG9wZW4gKElOLCAiJG91dHB1dF9jb25maWciKTsKKworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKC9eKENPTkZJR1xTKyk9KC4qKS8pIHsKKwkgICAgJHskY29uZmlnX3JlZn17JDF9ID0gJDI7CisJfQorICAgIH0KKyAgICBjbG9zZShJTik7Cit9CisKK3N1YiBnZXRfZGVwZW5kZW5jaWVzIHsKKyAgICBteSAoJGNvbmZpZykgPSBAXzsKKworICAgIG15ICRhcnIgPSAkZGVwZW5kZW5jeXskY29uZmlnfTsKKyAgICBpZiAoIWRlZmluZWQoJGFycikpIHsKKwlyZXR1cm4gKCk7CisgICAgfQorCisgICAgbXkgQGRlcHMgPSBAeyRhcnJ9OworCisgICAgZm9yZWFjaCBteSAkZGVwIChAeyRhcnJ9KSB7CisJcHJpbnQgIkFERCBERVAgJGRlcFxuIjsKKwlAZGVwcyA9IChAZGVwcywgZ2V0X2RlcGVuZGVuY2llcyAkZGVwKTsKKyAgICB9CisKKyAgICByZXR1cm4gQGRlcHM7Cit9CisKK3N1YiBjcmVhdGVfY29uZmlnIHsKKyAgICBteSBAY29uZmlncyA9IEBfOworCisgICAgb3BlbihPVVQsICI+JG91dHB1dF9jb25maWciKSBvciBkb2RpZSAiQ2FuIG5vdCB3cml0ZSB0byAkb3V0cHV0X2NvbmZpZyI7CisKKyAgICBmb3JlYWNoIG15ICRjb25maWcgKEBjb25maWdzKSB7CisJcHJpbnQgT1VUICIkY29uZmlnX3NldHskY29uZmlnfVxuIjsKKwlteSBAZGVwcyA9IGdldF9kZXBlbmRlbmNpZXMgJGNvbmZpZzsKKwlmb3JlYWNoIG15ICRkZXAgKEBkZXBzKSB7CisJICAgIHByaW50IE9VVCAiJGNvbmZpZ19zZXR7JGRlcH1cbiI7CisJfQorICAgIH0KKworICAgIGZvcmVhY2ggbXkgJGNvbmZpZyAoa2V5cyAlY29uZmlnX2lnbm9yZSkgeworCXByaW50IE9VVCAiJGNvbmZpZ19pZ25vcmV7JGNvbmZpZ31cbiI7CisgICAgfQorICAgIGNsb3NlKE9VVCk7CisKKyMgICAgZXhpdDsKKyAgICBydW5fY29tbWFuZCAiJG1ha2Ugb2xkbm9jb25maWciIG9yCisJZG9kaWUgImZhaWxlZCBtYWtlIGNvbmZpZyBvbGRjb25maWciOworCit9CisKK3N1YiBjb21wYXJlX2NvbmZpZ3MgeworICAgIG15ICglYSwgJWIpID0gQF87CisKKyAgICBmb3JlYWNoIG15ICRpdGVtIChrZXlzICVhKSB7CisJaWYgKCFkZWZpbmVkKCRieyRpdGVtfSkpIHsKKwkgICAgcHJpbnQgImRpZmYgJGl0ZW1cbiI7CisJICAgIHJldHVybiAxOworCX0KKwlkZWxldGUgJGJ7JGl0ZW19OworICAgIH0KKworICAgIG15IEBrZXlzID0ga2V5cyAlYjsKKyAgICBpZiAoJCNrZXlzKSB7CisJcHJpbnQgImRpZmYyICRrZXlzWzBdXG4iOworICAgIH0KKyAgICByZXR1cm4gLTEgaWYgKCQja2V5cyA+PSAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdWIgcnVuX2NvbmZpZ19iaXNlY3RfdGVzdCB7CisgICAgbXkgKCR0eXBlKSA9IEBfOworCisgICAgcmV0dXJuIHJ1bl9iaXNlY3RfdGVzdCAkdHlwZSwgIm9sZGNvbmZpZyI7Cit9CisKK3N1YiBwcm9jZXNzX3Bhc3NlZCB7CisgICAgbXkgKCVjb25maWdzKSA9IEBfOworCisgICAgZG9wcmludCAiVGhlc2UgY29uZmlncyBoYWQgbm8gZmFpbHVyZTogKEVuYWJsaW5nIHRoZW0gZm9yIGZ1cnRoZXIgY29tcGlsZXMpXG4iOworICAgICMgUGFzc2VkISBBbGwgdGhlc2UgY29uZmlncyBhcmUgcGFydCBvZiBhIGdvb2QgY29tcGlsZS4KKyAgICAjIEFkZCB0aGVtIHRvIHRoZSBtaW4gb3B0aW9ucy4KKyAgICBmb3JlYWNoIG15ICRjb25maWcgKGtleXMgJWNvbmZpZ3MpIHsKKwlpZiAoZGVmaW5lZCgkY29uZmlnX2xpc3R7JGNvbmZpZ30pKSB7CisJICAgIGRvcHJpbnQgIiByZW1vdmluZyAkY29uZmlnXG4iOworCSAgICAkY29uZmlnX2lnbm9yZXskY29uZmlnfSA9ICRjb25maWdfbGlzdHskY29uZmlnfTsKKwkgICAgZGVsZXRlICRjb25maWdfbGlzdHskY29uZmlnfTsKKwl9CisgICAgfQorICAgIGRvcHJpbnQgImNvbmZpZyBjb3BpZWQgdG8gJG91dHB1dGRpci9jb25maWdfZ29vZFxuIjsKKyAgICBydW5fY29tbWFuZCAiY3AgLWYgJG91dHB1dF9jb25maWcgJG91dHB1dGRpci9jb25maWdfZ29vZCI7Cit9CisKK3N1YiBwcm9jZXNzX2ZhaWxlZCB7CisgICAgbXkgKCRjb25maWcpID0gQF87CisKKyAgICBkb3ByaW50ICJcblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iOworICAgIGRvcHJpbnQgIkZvdW5kIGJhZCBjb25maWc6ICRjb25maWdcbiI7CisgICAgZG9wcmludCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiI7Cit9CisKK3N1YiBydW5fY29uZmlnX2Jpc2VjdCB7CisKKyAgICBteSBAc3RhcnRfbGlzdCA9IGtleXMgJWNvbmZpZ19saXN0OworCisgICAgaWYgKCQjc3RhcnRfbGlzdCA8IDApIHsKKwlkb3ByaW50ICJObyBtb3JlIGNvbmZpZ3MgdG8gdGVzdCEhIVxuIjsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgZG9wcmludCAiKioqKiogUlVOIFRFU1QgKioqXG4iOworICAgIG15ICR0eXBlID0gJG9wdHsiQ09ORklHX0JJU0VDVF9UWVBFWyRpdGVyYXRpb25dIn07CisgICAgbXkgJHJldDsKKyAgICBteSAlY3VycmVudF9jb25maWc7CisKKyAgICBteSAkY291bnQgPSAkI3N0YXJ0X2xpc3QgKyAxOworICAgIGRvcHJpbnQgIiAgJGNvdW50IGNvbmZpZ3MgdG8gdGVzdFxuIjsKKworICAgIG15ICRoYWxmID0gaW50KCQjc3RhcnRfbGlzdCAvIDIpOworCisgICAgZG8geworCW15IEB0b3BoYWxmID0gQHN0YXJ0X2xpc3RbMCAuLiAkaGFsZl07CisKKwljcmVhdGVfY29uZmlnIEB0b3BoYWxmOworCXJlYWRfY3VycmVudF9jb25maWcgXCVjdXJyZW50X2NvbmZpZzsKKworCSRjb3VudCA9ICQjdG9waGFsZiArIDE7CisJZG9wcmludCAiVGVzdGluZyAkY291bnQgY29uZmlnc1xuIjsKKwlteSAkZm91bmQgPSAwOworCSMgbWFrZSBzdXJlIHdlIHRlc3Qgc29tZXRoaW5nCisJZm9yZWFjaCBteSAkY29uZmlnIChAdG9waGFsZikgeworCSAgICBpZiAoZGVmaW5lZCgkY3VycmVudF9jb25maWd7JGNvbmZpZ30pKSB7CisJCWxvZ2l0ICIgJGNvbmZpZ1xuIjsKKwkJJGZvdW5kID0gMTsKKwkgICAgfQorCX0KKwlpZiAoISRmb3VuZCkgeworCSAgICAjIHRyeSB0aGUgb3RoZXIgaGFsZgorCSAgICBkb3ByaW50ICJUb3AgaGFsZiBwcm9kdWNlZCBubyBzZXQgY29uZmlncywgdHJ5aW5nIGJvdHRvbSBoYWxmXG4iOworCSAgICBAdG9waGFsZiA9IEBzdGFydF9saXN0WyRoYWxmIC4uICQjc3RhcnRfbGlzdF07CisJICAgIGNyZWF0ZV9jb25maWcgQHRvcGhhbGY7CisJICAgIHJlYWRfY3VycmVudF9jb25maWcgXCVjdXJyZW50X2NvbmZpZzsKKwkgICAgZm9yZWFjaCBteSAkY29uZmlnIChAdG9waGFsZikgeworCQlpZiAoZGVmaW5lZCgkY3VycmVudF9jb25maWd7JGNvbmZpZ30pKSB7CisJCSAgICBsb2dpdCAiICRjb25maWdcbiI7CisJCSAgICAkZm91bmQgPSAxOworCQl9CisJICAgIH0KKwkgICAgaWYgKCEkZm91bmQpIHsKKwkJZG9wcmludCAiRmFpbGVkOiBDYW4ndCBtYWtlIG5ldyBjb25maWcgd2l0aCBjdXJyZW50IGNvbmZpZ3NcbiI7CisJCWZvcmVhY2ggbXkgJGNvbmZpZyAoQHN0YXJ0X2xpc3QpIHsKKwkJICAgIGRvcHJpbnQgIiAgQ09ORklHOiAkY29uZmlnXG4iOworCQl9CisJCXJldHVybiAtMTsKKwkgICAgfQorCSAgICAkY291bnQgPSAkI3RvcGhhbGYgKyAxOworCSAgICBkb3ByaW50ICJUZXN0aW5nICRjb3VudCBjb25maWdzXG4iOworCX0KKworCSRyZXQgPSBydW5fY29uZmlnX2Jpc2VjdF90ZXN0ICR0eXBlOworCisJaWYgKCRyZXQpIHsKKwkgICAgcHJvY2Vzc19wYXNzZWQgJWN1cnJlbnRfY29uZmlnOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlkb3ByaW50ICJUaGlzIGNvbmZpZyBoYWQgYSBmYWlsdXJlLlxuIjsKKwlkb3ByaW50ICJSZW1vdmluZyB0aGVzZSBjb25maWdzIHRoYXQgd2VyZSBub3Qgc2V0IGluIHRoaXMgY29uZmlnOlxuIjsKKwlkb3ByaW50ICJjb25maWcgY29waWVkIHRvICRvdXRwdXRkaXIvY29uZmlnX2JhZFxuIjsKKwlydW5fY29tbWFuZCAiY3AgLWYgJG91dHB1dF9jb25maWcgJG91dHB1dGRpci9jb25maWdfYmFkIjsKKworCSMgQSBjb25maWcgZXhpc3RzIGluIHRoaXMgZ3JvdXAgdGhhdCB3YXMgYmFkLgorCWZvcmVhY2ggbXkgJGNvbmZpZyAoa2V5cyAlY29uZmlnX2xpc3QpIHsKKwkgICAgaWYgKCFkZWZpbmVkKCRjdXJyZW50X2NvbmZpZ3skY29uZmlnfSkpIHsKKwkJZG9wcmludCAiIHJlbW92aW5nICRjb25maWdcbiI7CisJCWRlbGV0ZSAkY29uZmlnX2xpc3R7JGNvbmZpZ307CisJICAgIH0KKwl9CisKKwlAc3RhcnRfbGlzdCA9IEB0b3BoYWxmOworCisJaWYgKCQjc3RhcnRfbGlzdCA9PSAwKSB7CisJICAgIHByb2Nlc3NfZmFpbGVkICRzdGFydF9saXN0WzBdOworCSAgICByZXR1cm4gMTsKKwl9CisKKwkjIHJlbW92ZSBoYWxmIHRoZSBjb25maWdzIHdlIGFyZSBsb29raW5nIGF0IGFuZCBzZWUgaWYKKwkjIHRoZXkgYXJlIGdvb2QuCisJJGhhbGYgPSBpbnQoJCNzdGFydF9saXN0IC8gMik7CisgICAgfSB3aGlsZSAoJGhhbGYgPiAwKTsKKworICAgICMgd2UgZm91bmQgYSBzaW5nbGUgY29uZmlnLCB0cnkgaXQgYWdhaW4KKyAgICBteSBAdG9waGFsZiA9IEBzdGFydF9saXN0WzAgLi4gMF07CisKKyAgICAkcmV0ID0gcnVuX2NvbmZpZ19iaXNlY3RfdGVzdCAkdHlwZTsKKyAgICBpZiAoJHJldCkgeworCXByb2Nlc3NfcGFzc2VkICVjdXJyZW50X2NvbmZpZzsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcm9jZXNzX2ZhaWxlZCAkc3RhcnRfbGlzdFswXTsKKyAgICByZXR1cm4gMTsKK30KKworc3ViIGNvbmZpZ19iaXNlY3QgeworICAgIG15ICgkaSkgPSBAXzsKKworICAgIG15ICRzdGFydF9jb25maWcgPSAkb3B0eyJDT05GSUdfQklTRUNUWyRpXSJ9OworCisgICAgbXkgJHRtcGNvbmZpZyA9ICIkdG1wZGlyL3VzZV9jb25maWciOworCisgICAgIyBNYWtlIHRoZSBmaWxlIHdpdGggdGhlIGJhZCBjb25maWcgYW5kIHRoZSBtaW4gY29uZmlnCisgICAgaWYgKGRlZmluZWQoJG1pbmNvbmZpZykpIHsKKwkjIHJlYWQgdGhlIG1pbiBjb25maWcgZm9yIHRoaW5ncyB0byBpZ25vcmUKKwlydW5fY29tbWFuZCAiY3AgJG1pbmNvbmZpZyAkdG1wY29uZmlnIiBvcgorCSAgICBkb2RpZSAiZmFpbGVkIHRvIGNvcHkgJG1pbmNvbmZpZyB0byAkdG1wY29uZmlnIjsKKyAgICB9IGVsc2UgeworCXVubGluayAkdG1wY29uZmlnOworICAgIH0KKworICAgICMgQWRkIG90aGVyIGNvbmZpZ3MKKyAgICBpZiAoZGVmaW5lZCgkYWRkY29uZmlnKSkgeworCXJ1bl9jb21tYW5kICJjYXQgJGFkZGNvbmZpZyA+PiAkdG1wY29uZmlnIiBvcgorCSAgICBkb2RpZSAiZmFpbGVkIHRvIGFwcGVuZCAkYWRkY29uZmlnIjsKKyAgICB9CisKKyAgICBteSAkZGVmY29uZmlnID0gIiI7CisgICAgaWYgKC1mICR0bXBjb25maWcpIHsKKwkkZGVmY29uZmlnID0gIktDT05GSUdfQUxMQ09ORklHPSR0bXBjb25maWciOworCXByb2Nlc3NfY29uZmlnX2lnbm9yZSAkdG1wY29uZmlnOworICAgIH0KKworICAgICMgbm93IHByb2Nlc3MgdGhlIHN0YXJ0IGNvbmZpZworICAgIHJ1bl9jb21tYW5kICJjcCAkc3RhcnRfY29uZmlnICRvdXRwdXRfY29uZmlnIiBvcgorCWRvZGllICJmYWlsZWQgdG8gY29weSAkc3RhcnRfY29uZmlnIHRvICRvdXRwdXRfY29uZmlnIjsKKworICAgICMgcmVhZCBkaXJlY3RseSB3aGF0IHdlIHdhbnQgdG8gY2hlY2sKKyAgICBteSAlY29uZmlnX2NoZWNrOworICAgIG9wZW4gKElOLCAkb3V0cHV0X2NvbmZpZykKKwlvciBkb2RpZSAiZmFpZWQgdG8gb3BlbiAkb3V0cHV0X2NvbmZpZyI7CisKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgvXigoQ09ORklHXFMqKT0uKikvKSB7CisJICAgICRjb25maWdfY2hlY2t7JDJ9ID0gJDE7CisJfQorICAgIH0KKyAgICBjbG9zZShJTik7CisKKyAgICAjIE5vdyBydW4gb2xkY29uZmlnIHdpdGggdGhlIG1pbmNvbmZpZyAoYW5kIGFkZGNvbmZpZ3MpCisgICAgcnVuX2NvbW1hbmQgIiRkZWZjb25maWcgJG1ha2Ugb2xkbm9jb25maWciIG9yCisJZG9kaWUgImZhaWxlZCBtYWtlIGNvbmZpZyBvbGRjb25maWciOworCisgICAgIyBjaGVjayB0byBzZWUgd2hhdCB3ZSBsb3N0IChvciBnYWluZWQpCisgICAgb3BlbiAoSU4sICRvdXRwdXRfY29uZmlnKQorCW9yIGRvZGllICJGYWlsZWQgdG8gcmVhZCAkc3RhcnRfY29uZmlnIjsKKworICAgIG15ICVyZW1vdmVkX2NvbmZpZ3M7CisgICAgbXkgJWFkZGVkX2NvbmZpZ3M7CisKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgvXigoQ09ORklHXFMqKT0uKikvKSB7CisJICAgICMgc2F2ZSBvZmYgYWxsIG9wdGlvbnMKKwkgICAgJGNvbmZpZ19zZXR7JDJ9ID0gJDE7CisJICAgIGlmIChkZWZpbmVkKCRjb25maWdfY2hlY2t7JDJ9KSkgeworCQlpZiAoZGVmaW5lZCgkY29uZmlnX2lnbm9yZXskMn0pKSB7CisJCSAgICAkcmVtb3ZlZF9jb25maWdzeyQyfSA9ICQxOworCQl9IGVsc2UgeworCQkgICAgJGNvbmZpZ19saXN0eyQyfSA9ICQxOworCQl9CisJICAgIH0gZWxzaWYgKCFkZWZpbmVkKCRjb25maWdfaWdub3JleyQyfSkpIHsKKwkJJGFkZGVkX2NvbmZpZ3N7JDJ9ID0gJDE7CisJCSRjb25maWdfbGlzdHskMn0gPSAkMTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgY2xvc2UoSU4pOworCisgICAgbXkgQGNvbmZzID0ga2V5cyAlcmVtb3ZlZF9jb25maWdzOworICAgIGlmICgkI2NvbmZzID49IDApIHsKKwlkb3ByaW50ICJDb25maWdzIG92ZXJyaWRkZW4gYnkgZGVmYXVsdCBjb25maWdzIGFuZCByZW1vdmVkIGZyb20gY2hlY2s6XG4iOworCWZvcmVhY2ggbXkgJGNvbmZpZyAoQGNvbmZzKSB7CisJICAgIGRvcHJpbnQgIiAkY29uZmlnXG4iOworCX0KKyAgICB9CisgICAgQGNvbmZzID0ga2V5cyAlYWRkZWRfY29uZmlnczsKKyAgICBpZiAoJCNjb25mcyA+PSAwKSB7CisJZG9wcmludCAiQ29uZmlncyBhcHBlYXJpbmcgaW4gbWFrZSBvbGRjb25maWcgYW5kIGFkZGVkOlxuIjsKKwlmb3JlYWNoIG15ICRjb25maWcgKEBjb25mcykgeworCSAgICBkb3ByaW50ICIgJGNvbmZpZ1xuIjsKKwl9CisgICAgfQorCisgICAgbXkgJWNvbmZpZ190ZXN0OworICAgIG15ICRvbmNlID0gMDsKKworICAgICMgU29tZXRpbWVzIGtjb25maWcgZG9lcyB3ZWlyZCB0aGluZ3MuIFdlIG11c3QgbWFrZSBzdXJlCisgICAgIyB0aGF0IHRoZSBjb25maWcgd2UgYXV0b2NyZWF0ZSBoYXMgZXZlcnl0aGluZyB3ZSBuZWVkCisgICAgIyB0byB0ZXN0LCBvdGhlcndpc2Ugd2UgbWF5IG1pc3MgdGVzdGluZyBjb25maWdzLCBvcgorICAgICMgbWF5IG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBhIG5ldyBjb25maWcuCisgICAgIyBIZXJlIHdlIGNyZWF0ZSBhIGNvbmZpZyB3aXRoIGV2ZXJ5dGhpbmcgc2V0LgorICAgIGNyZWF0ZV9jb25maWcgKGtleXMgJWNvbmZpZ19saXN0KTsKKyAgICByZWFkX2N1cnJlbnRfY29uZmlnIFwlY29uZmlnX3Rlc3Q7CisgICAgZm9yZWFjaCBteSAkY29uZmlnIChrZXlzICVjb25maWdfbGlzdCkgeworCWlmICghZGVmaW5lZCgkY29uZmlnX3Rlc3R7JGNvbmZpZ30pKSB7CisJICAgIGlmICghJG9uY2UpIHsKKwkJJG9uY2UgPSAxOworCQlkb3ByaW50ICJDb25maWdzIG5vdCBwcm9kdWNlZCBieSBrY29uZmlnICh3aWxsIG5vdCBiZSBjaGVja2VkKTpcbiI7CisJICAgIH0KKwkgICAgZG9wcmludCAiICAkY29uZmlnXG4iOworCSAgICBkZWxldGUgJGNvbmZpZ19saXN0eyRjb25maWd9OworCX0KKyAgICB9CisgICAgbXkgJHJldDsKKyAgICBkbyB7CisJJHJldCA9IHJ1bl9jb25maWdfYmlzZWN0OworICAgIH0gd2hpbGUgKCEkcmV0KTsKKworICAgIHJldHVybiAkcmV0IGlmICgkcmV0IDwgMCk7CisKKyAgICBzdWNjZXNzICRpOworfQorCitzdWIgcGF0Y2hjaGVjayB7CisgICAgbXkgKCRpKSA9IEBfOworCisgICAgZGllICJQQVRDSENIRUNLX1NUQVJUWyRpXSBub3QgZGVmaW5lZFxuIgorCWlmICghZGVmaW5lZCgkb3B0eyJQQVRDSENIRUNLX1NUQVJUWyRpXSJ9KSk7CisgICAgZGllICJQQVRDSENIRUNLX1RZUEVbJGldIG5vdCBkZWZpbmVkXG4iCisJaWYgKCFkZWZpbmVkKCRvcHR7IlBBVENIQ0hFQ0tfVFlQRVskaV0ifSkpOworCisgICAgbXkgJHN0YXJ0ID0gJG9wdHsiUEFUQ0hDSEVDS19TVEFSVFskaV0ifTsKKworICAgIG15ICRlbmQgPSAiSEVBRCI7CisgICAgaWYgKGRlZmluZWQoJG9wdHsiUEFUQ0hDSEVDS19FTkRbJGldIn0pKSB7CisJJGVuZCA9ICRvcHR7IlBBVENIQ0hFQ0tfRU5EWyRpXSJ9OworICAgIH0KKworICAgICMgR2V0IHRoZSB0cnVlIHNoYTEncyBzaW5jZSB3ZSBjYW4gdXNlIHRoaW5ncyBsaWtlIEhFQUR+MworICAgICRzdGFydCA9IGdldF9zaGExKCRzdGFydCk7CisgICAgJGVuZCA9IGdldF9zaGExKCRlbmQpOworCisgICAgbXkgJHR5cGUgPSAkb3B0eyJQQVRDSENIRUNLX1RZUEVbJGldIn07CisKKyAgICAjIENhbid0IGhhdmUgYSB0ZXN0IHdpdGhvdXQgaGF2aW5nIGEgdGVzdCB0byBydW4KKyAgICBpZiAoJHR5cGUgZXEgInRlc3QiICYmICFkZWZpbmVkKCRydW5fdGVzdCkpIHsKKwkkdHlwZSA9ICJib290IjsKKyAgICB9CisKKyAgICBvcGVuIChJTiwgImdpdCBsb2cgLS1wcmV0dHk9b25lbGluZSAkZW5kfCIpIG9yCisJZG9kaWUgImNvdWxkIG5vdCBnZXQgZ2l0IGxpc3QiOworCisgICAgbXkgQGxpc3Q7CisKKyAgICB3aGlsZSAoPElOPikgeworCWNob21wOworCSRsaXN0WyQjbGlzdCsxXSA9ICRfOworCWxhc3QgaWYgKC9eJHN0YXJ0Lyk7CisgICAgfQorICAgIGNsb3NlKElOKTsKKworICAgIGlmICgkbGlzdFskI2xpc3RdICF+IC9eJHN0YXJ0LykgeworCWZhaWwgIlNIQTEgJHN0YXJ0IG5vdCBmb3VuZCI7CisgICAgfQorCisgICAgIyBnbyBiYWNrd2FyZHMgaW4gdGhlIGxpc3QKKyAgICBAbGlzdCA9IHJldmVyc2UgQGxpc3Q7CisKKyAgICBteSAkc2F2ZV9jbGVhbiA9ICRub2NsZWFuOworCisgICAgJGluX3BhdGNoY2hlY2sgPSAxOworICAgIGZvcmVhY2ggbXkgJGl0ZW0gKEBsaXN0KSB7CisJbXkgJHNoYTEgPSAkaXRlbTsKKwkkc2hhMSA9fiBzL14oW1s6eGRpZ2l0Ol1dKykuKi8kMS87CisKKwlkb3ByaW50ICJcblByb2Nlc3NpbmcgY29tbWl0ICRpdGVtXG5cbiI7CisKKwlydW5fY29tbWFuZCAiZ2l0IGNoZWNrb3V0ICRzaGExIiBvcgorCSAgICBkaWUgIkZhaWxlZCB0byBjaGVja291dCAkc2hhMSI7CisKKwkjIG9ubHkgY2xlYW4gb24gdGhlIGZpcnN0IGFuZCBsYXN0IHBhdGNoCisJaWYgKCRpdGVtIGVxICRsaXN0WzBdIHx8CisJICAgICRpdGVtIGVxICRsaXN0WyQjbGlzdF0pIHsKKwkgICAgJG5vY2xlYW4gPSAkc2F2ZV9jbGVhbjsKKwl9IGVsc2UgeworCSAgICAkbm9jbGVhbiA9IDE7CisJfQorCisJaWYgKGRlZmluZWQoJG1pbmNvbmZpZykpIHsKKwkgICAgYnVpbGQgInVzZWNvbmZpZzokbWluY29uZmlnIiBvciByZXR1cm4gMDsKKwl9IGVsc2UgeworCSAgICAjID8/IG5vIGNvbmZpZyB0byB1c2U/CisJICAgIGJ1aWxkICJvbGRjb25maWciIG9yIHJldHVybiAwOworCX0KKworCWNoZWNrX2J1aWxkbG9nICRzaGExIG9yIHJldHVybiAwOworCisJbmV4dCBpZiAoJHR5cGUgZXEgImJ1aWxkIik7CisKKwlnZXRfZ3J1Yl9pbmRleDsKKwlnZXRfdmVyc2lvbjsKKwlpbnN0YWxsOworCisJbXkgJGZhaWxlZCA9IDA7CisKKwlzdGFydF9tb25pdG9yOworCW1vbml0b3Igb3IgJGZhaWxlZCA9IDE7CisKKwlpZiAoISRmYWlsZWQgJiYgJHR5cGUgbmUgImJvb3QiKXsKKwkgICAgZG9fcnVuX3Rlc3Qgb3IgJGZhaWxlZCA9IDE7CisJfQorCWVuZF9tb25pdG9yOworCXJldHVybiAwIGlmICgkZmFpbGVkKTsKKworICAgIH0KKyAgICAkaW5fcGF0Y2hjaGVjayA9IDA7CisgICAgc3VjY2VzcyAkaTsKKworICAgIHJldHVybiAxOworfQorCiskI0FSR1YgPCAxIG9yIGRpZSAia3Rlc3QucGwgdmVyc2lvbjogJFZFUlNJT05cbiAgIHVzYWdlOiBrdGVzdC5wbCBjb25maWctZmlsZVxuIjsKKworaWYgKCQjQVJHViA9PSAwKSB7CisgICAgJGt0ZXN0X2NvbmZpZyA9ICRBUkdWWzBdOworICAgIGlmICghIC1mICRrdGVzdF9jb25maWcpIHsKKwlwcmludCAiJGt0ZXN0X2NvbmZpZyBkb2VzIG5vdCBleGlzdC5cbiI7CisJbXkgJGFuczsKKyAgICAgICAgZm9yICg7OykgeworCSAgICBwcmludCAiQ3JlYXRlIGl0PyBbWS9uXSAiOworCSAgICAkYW5zID0gPFNURElOPjsKKwkgICAgY2hvbXAgJGFuczsKKwkgICAgaWYgKCRhbnMgPX4gL15ccyokLykgeworCQkkYW5zID0gInkiOworCSAgICB9CisJICAgIGxhc3QgaWYgKCRhbnMgPX4gL155JC9pIHx8ICRhbnMgPX4gL15uJC9pKTsKKwkgICAgcHJpbnQgIlBsZWFzZSBhbnN3ZXIgZWl0aGVyICd5JyBvciAnbicuXG4iOworCX0KKwlpZiAoJGFucyAhfiAvXnkkL2kpIHsKKwkgICAgZXhpdCAwOworCX0KKyAgICB9Cit9IGVsc2UgeworICAgICRrdGVzdF9jb25maWcgPSAia3Rlc3QuY29uZiI7Cit9CisKK2lmICghIC1mICRrdGVzdF9jb25maWcpIHsKKyAgICBvcGVuKE9VVCwgIj4ka3Rlc3RfY29uZmlnIikgb3IgZGllICJDYW4gbm90IGNyZWF0ZSAka3Rlc3RfY29uZmlnIjsKKyAgICBwcmludCBPVVQgPDwgIkVPRiIKKyMgR2VuZXJhdGVkIGJ5IGt0ZXN0LnBsCisjCisjIERlZmluZSBlYWNoIHRlc3Qgd2l0aCBURVNUX1NUQVJUCisjIFRoZSBjb25maWcgb3B0aW9ucyBiZWxvdyBpdCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cworVEVTVF9TVEFSVAorCitERUZBVUxUUworRU9GCis7CisgICAgY2xvc2UoT1VUKTsKK30KK3JlYWRfY29uZmlnICRrdGVzdF9jb25maWc7CisKKyMgQXBwZW5kIGFueSBjb25maWdzIGVudGVyZWQgaW4gbWFudWFsbHkgdG8gdGhlIGNvbmZpZyBmaWxlLgorbXkgQG5ld19jb25maWdzID0ga2V5cyAlZW50ZXJlZF9jb25maWdzOworaWYgKCQjbmV3X2NvbmZpZ3MgPj0gMCkgeworICAgIHByaW50ICJcbkFwcGVuZGluZyBlbnRlcmVkIGluIGNvbmZpZ3MgdG8gJGt0ZXN0X2NvbmZpZ1xuIjsKKyAgICBvcGVuKE9VVCwgIj4+JGt0ZXN0X2NvbmZpZyIpIG9yIGRpZSAiQ2FuIG5vdCBhcHBlbmQgdG8gJGt0ZXN0X2NvbmZpZyI7CisgICAgZm9yZWFjaCBteSAkY29uZmlnIChAbmV3X2NvbmZpZ3MpIHsKKwlwcmludCBPVVQgIiRjb25maWcgPSAkZW50ZXJlZF9jb25maWdzeyRjb25maWd9XG4iOworCSRvcHR7JGNvbmZpZ30gPSAkZW50ZXJlZF9jb25maWdzeyRjb25maWd9OworICAgIH0KK30KKworaWYgKCRvcHR7IkNMRUFSX0xPRyJ9ICYmIGRlZmluZWQoJG9wdHsiTE9HX0ZJTEUifSkpIHsKKyAgICB1bmxpbmsgJG9wdHsiTE9HX0ZJTEUifTsKK30KKworZG9wcmludCAiXG5cblNUQVJUSU5HIEFVVE9NQVRFRCBURVNUU1xuXG4iOworCitmb3IgKG15ICRpID0gMCwgbXkgJHJlcGVhdCA9IDE7ICRpIDw9ICRvcHR7Ik5VTV9URVNUUyJ9OyAkaSArPSAkcmVwZWF0KSB7CisKKyAgICBpZiAoISRpKSB7CisJZG9wcmludCAiREVGQVVMVCBPUFRJT05TOlxuIjsKKyAgICB9IGVsc2UgeworCWRvcHJpbnQgIlxuVEVTVCAkaSBPUFRJT05TIjsKKwlpZiAoZGVmaW5lZCgkcmVwZWF0X3Rlc3RzeyRpfSkpIHsKKwkgICAgJHJlcGVhdCA9ICRyZXBlYXRfdGVzdHN7JGl9OworCSAgICBkb3ByaW50ICIgSVRFUkFURSAkcmVwZWF0IjsKKwl9CisJZG9wcmludCAiXG4iOworICAgIH0KKworICAgIGZvcmVhY2ggbXkgJG9wdGlvbiAoc29ydCBrZXlzICVvcHQpIHsKKworCWlmICgkb3B0aW9uID1+IC9cWyhcZCspXF0kLykgeworCSAgICBuZXh0IGlmICgkaSAhPSAkMSk7CisJfSBlbHNlIHsKKwkgICAgbmV4dCBpZiAoJGkpOworCX0KKworCWRvcHJpbnQgIiRvcHRpb24gPSAkb3B0eyRvcHRpb259XG4iOworICAgIH0KK30KKworc3ViIHNldF90ZXN0X29wdGlvbiB7CisgICAgbXkgKCRuYW1lLCAkaSkgPSBAXzsKKworICAgIG15ICRvcHRpb24gPSAiJG5hbWVcWyRpXF0iOworCisgICAgaWYgKGRlZmluZWQoJG9wdHskb3B0aW9ufSkpIHsKKwlyZXR1cm4gJG9wdHskb3B0aW9ufTsKKyAgICB9CisKKyAgICBmb3JlYWNoIG15ICR0ZXN0IChrZXlzICVyZXBlYXRfdGVzdHMpIHsKKwlpZiAoJGkgPj0gJHRlc3QgJiYKKwkgICAgJGkgPCAkdGVzdCArICRyZXBlYXRfdGVzdHN7JHRlc3R9KSB7CisJICAgICRvcHRpb24gPSAiJG5hbWVcWyR0ZXN0XF0iOworCSAgICBpZiAoZGVmaW5lZCgkb3B0eyRvcHRpb259KSkgeworCQlyZXR1cm4gJG9wdHskb3B0aW9ufTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAoZGVmaW5lZCgkb3B0eyRuYW1lfSkpIHsKKwlyZXR1cm4gJG9wdHskbmFtZX07CisgICAgfQorCisgICAgcmV0dXJuIHVuZGVmOworfQorCisjIEZpcnN0IHdlIG5lZWQgdG8gZG8gaXMgdGhlIGJ1aWxkcworZm9yIChteSAkaSA9IDE7ICRpIDw9ICRvcHR7Ik5VTV9URVNUUyJ9OyAkaSsrKSB7CisKKyAgICAkaXRlcmF0aW9uID0gJGk7CisKKyAgICBteSAkbWFrZWNtZCA9IHNldF90ZXN0X29wdGlvbigiTUFLRV9DTUQiLCAkaSk7CisKKyAgICAkbWFjaGluZSA9IHNldF90ZXN0X29wdGlvbigiTUFDSElORSIsICRpKTsKKyAgICAkc3NoX3VzZXIgPSBzZXRfdGVzdF9vcHRpb24oIlNTSF9VU0VSIiwgJGkpOworICAgICR0bXBkaXIgPSBzZXRfdGVzdF9vcHRpb24oIlRNUF9ESVIiLCAkaSk7CisgICAgJG91dHB1dGRpciA9IHNldF90ZXN0X29wdGlvbigiT1VUUFVUX0RJUiIsICRpKTsKKyAgICAkYnVpbGRkaXIgPSBzZXRfdGVzdF9vcHRpb24oIkJVSUxEX0RJUiIsICRpKTsKKyAgICAkdGVzdF90eXBlID0gc2V0X3Rlc3Rfb3B0aW9uKCJURVNUX1RZUEUiLCAkaSk7CisgICAgJGJ1aWxkX3R5cGUgPSBzZXRfdGVzdF9vcHRpb24oIkJVSUxEX1RZUEUiLCAkaSk7CisgICAgJGJ1aWxkX29wdGlvbnMgPSBzZXRfdGVzdF9vcHRpb24oIkJVSUxEX09QVElPTlMiLCAkaSk7CisgICAgJHBvd2VyX2N5Y2xlID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUl9DWUNMRSIsICRpKTsKKyAgICAkcmVib290ID0gc2V0X3Rlc3Rfb3B0aW9uKCJSRUJPT1QiLCAkaSk7CisgICAgJG5vY2xlYW4gPSBzZXRfdGVzdF9vcHRpb24oIkJVSUxEX05PQ0xFQU4iLCAkaSk7CisgICAgJG1pbmNvbmZpZyA9IHNldF90ZXN0X29wdGlvbigiTUlOX0NPTkZJRyIsICRpKTsKKyAgICAkcnVuX3Rlc3QgPSBzZXRfdGVzdF9vcHRpb24oIlRFU1QiLCAkaSk7CisgICAgJGFkZGNvbmZpZyA9IHNldF90ZXN0X29wdGlvbigiQUREX0NPTkZJRyIsICRpKTsKKyAgICAkcmVib290X3R5cGUgPSBzZXRfdGVzdF9vcHRpb24oIlJFQk9PVF9UWVBFIiwgJGkpOworICAgICRncnViX21lbnUgPSBzZXRfdGVzdF9vcHRpb24oIkdSVUJfTUVOVSIsICRpKTsKKyAgICAkcG9zdF9pbnN0YWxsID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1NUX0lOU1RBTEwiLCAkaSk7CisgICAgJHJlYm9vdF9zY3JpcHQgPSBzZXRfdGVzdF9vcHRpb24oIlJFQk9PVF9TQ1JJUFQiLCAkaSk7CisgICAgJHJlYm9vdF9vbl9lcnJvciA9IHNldF90ZXN0X29wdGlvbigiUkVCT09UX09OX0VSUk9SIiwgJGkpOworICAgICRwb3dlcm9mZl9vbl9lcnJvciA9IHNldF90ZXN0X29wdGlvbigiUE9XRVJPRkZfT05fRVJST1IiLCAkaSk7CisgICAgJGRpZV9vbl9mYWlsdXJlID0gc2V0X3Rlc3Rfb3B0aW9uKCJESUVfT05fRkFJTFVSRSIsICRpKTsKKyAgICAkcG93ZXJfb2ZmID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUl9PRkYiLCAkaSk7CisgICAgJHBvd2VyY3ljbGVfYWZ0ZXJfcmVib290ID0gc2V0X3Rlc3Rfb3B0aW9uKCJQT1dFUkNZQ0xFX0FGVEVSX1JFQk9PVCIsICRpKTsKKyAgICAkcG93ZXJvZmZfYWZ0ZXJfaGFsdCA9IHNldF90ZXN0X29wdGlvbigiUE9XRVJPRkZfQUZURVJfSEFMVCIsICRpKTsKKyAgICAkc2xlZXBfdGltZSA9IHNldF90ZXN0X29wdGlvbigiU0xFRVBfVElNRSIsICRpKTsKKyAgICAkYmlzZWN0X3NsZWVwX3RpbWUgPSBzZXRfdGVzdF9vcHRpb24oIkJJU0VDVF9TTEVFUF9USU1FIiwgJGkpOworICAgICRzdG9yZV9mYWlsdXJlcyA9IHNldF90ZXN0X29wdGlvbigiU1RPUkVfRkFJTFVSRVMiLCAkaSk7CisgICAgJHRpbWVvdXQgPSBzZXRfdGVzdF9vcHRpb24oIlRJTUVPVVQiLCAkaSk7CisgICAgJGJvb3RlZF90aW1lb3V0ID0gc2V0X3Rlc3Rfb3B0aW9uKCJCT09URURfVElNRU9VVCIsICRpKTsKKyAgICAkY29uc29sZSA9IHNldF90ZXN0X29wdGlvbigiQ09OU09MRSIsICRpKTsKKyAgICAkc3VjY2Vzc19saW5lID0gc2V0X3Rlc3Rfb3B0aW9uKCJTVUNDRVNTX0xJTkUiLCAkaSk7CisgICAgJHN0b3BfYWZ0ZXJfc3VjY2VzcyA9IHNldF90ZXN0X29wdGlvbigiU1RPUF9BRlRFUl9TVUNDRVNTIiwgJGkpOworICAgICRzdG9wX2FmdGVyX2ZhaWx1cmUgPSBzZXRfdGVzdF9vcHRpb24oIlNUT1BfQUZURVJfRkFJTFVSRSIsICRpKTsKKyAgICAkYnVpbGRfdGFyZ2V0ID0gc2V0X3Rlc3Rfb3B0aW9uKCJCVUlMRF9UQVJHRVQiLCAkaSk7CisgICAgJHNzaF9leGVjID0gc2V0X3Rlc3Rfb3B0aW9uKCJTU0hfRVhFQyIsICRpKTsKKyAgICAkc2NwX3RvX3RhcmdldCA9IHNldF90ZXN0X29wdGlvbigiU0NQX1RPX1RBUkdFVCIsICRpKTsKKyAgICAkdGFyZ2V0X2ltYWdlID0gc2V0X3Rlc3Rfb3B0aW9uKCJUQVJHRVRfSU1BR0UiLCAkaSk7CisgICAgJGxvY2FsdmVyc2lvbiA9IHNldF90ZXN0X29wdGlvbigiTE9DQUxWRVJTSU9OIiwgJGkpOworCisgICAgY2hkaXIgJGJ1aWxkZGlyIHx8IGRpZSAiY2FuJ3QgY2hhbmdlIGRpcmVjdG9yeSB0byAkYnVpbGRkaXIiOworCisgICAgaWYgKCEtZCAkdG1wZGlyKSB7CisJbWtwYXRoKCR0bXBkaXIpIG9yCisJICAgIGRpZSAiY2FuJ3QgY3JlYXRlICR0bXBkaXIiOworICAgIH0KKworICAgICRFTlZ7IlNTSF9VU0VSIn0gPSAkc3NoX3VzZXI7CisgICAgJEVOVnsiTUFDSElORSJ9ID0gJG1hY2hpbmU7CisKKyAgICAkdGFyZ2V0ID0gIiRzc2hfdXNlclxAJG1hY2hpbmUiOworCisgICAgJGJ1aWxkbG9nID0gIiR0bXBkaXIvYnVpbGRsb2ctJG1hY2hpbmUiOworICAgICRkbWVzZyA9ICIkdG1wZGlyL2RtZXNnLSRtYWNoaW5lIjsKKyAgICAkbWFrZSA9ICIkbWFrZWNtZCBPPSRvdXRwdXRkaXIiOworICAgICRvdXRwdXRfY29uZmlnID0gIiRvdXRwdXRkaXIvLmNvbmZpZyI7CisKKyAgICBpZiAoJHJlYm9vdF90eXBlIGVxICJncnViIikgeworCWRvZGllICJHUlVCX01FTlUgbm90IGRlZmluZWQiIGlmICghZGVmaW5lZCgkZ3J1Yl9tZW51KSk7CisgICAgfSBlbHNpZiAoIWRlZmluZWQoJHJlYm9vdF9zY3JpcHQpKSB7CisJZG9kaWUgIlJFQk9PVF9TQ1JJUFQgbm90IGRlZmluZWQiCisgICAgfQorCisgICAgbXkgJHJ1bl90eXBlID0gJGJ1aWxkX3R5cGU7CisgICAgaWYgKCR0ZXN0X3R5cGUgZXEgInBhdGNoY2hlY2siKSB7CisJJHJ1bl90eXBlID0gJG9wdHsiUEFUQ0hDSEVDS19UWVBFWyRpXSJ9OworICAgIH0gZWxzaWYgKCR0ZXN0X3R5cGUgZXEgImJpc2VjdCIpIHsKKwkkcnVuX3R5cGUgPSAkb3B0eyJCSVNFQ1RfVFlQRVskaV0ifTsKKyAgICB9IGVsc2lmICgkdGVzdF90eXBlIGVxICJjb25maWdfYmlzZWN0IikgeworCSRydW5fdHlwZSA9ICRvcHR7IkNPTkZJR19CSVNFQ1RfVFlQRVskaV0ifTsKKyAgICB9CisKKyAgICAjIG1pc3Rha2UgaW4gY29uZmlnIGZpbGU/CisgICAgaWYgKCFkZWZpbmVkKCRydW5fdHlwZSkpIHsKKwkkcnVuX3R5cGUgPSAiRVJST1IiOworICAgIH0KKworICAgIGRvcHJpbnQgIlxuXG4iOworICAgIGRvcHJpbnQgIlJVTk5JTkcgVEVTVCAkaSBvZiAkb3B0e05VTV9URVNUU30gd2l0aCBvcHRpb24gJHRlc3RfdHlwZSAkcnVuX3R5cGVcblxuIjsKKworICAgIHVubGluayAkZG1lc2c7CisgICAgdW5saW5rICRidWlsZGxvZzsKKworICAgIGlmICghZGVmaW5lZCgkbWluY29uZmlnKSkgeworCSRtaW5jb25maWcgPSAkYWRkY29uZmlnOworCisgICAgfSBlbHNpZiAoZGVmaW5lZCgkYWRkY29uZmlnKSkgeworCXJ1bl9jb21tYW5kICJjYXQgJGFkZGNvbmZpZyAkbWluY29uZmlnID4gJHRtcGRpci9hZGRfY29uZmlnIiBvcgorCSAgICBkb2RpZSAiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGNvbmZpZyI7CisJJG1pbmNvbmZpZyA9ICIkdG1wZGlyL2FkZF9jb25maWciOworICAgIH0KKworICAgIG15ICRjaGVja291dCA9ICRvcHR7IkNIRUNLT1VUWyRpXSJ9OworICAgIGlmIChkZWZpbmVkKCRjaGVja291dCkpIHsKKwlydW5fY29tbWFuZCAiZ2l0IGNoZWNrb3V0ICRjaGVja291dCIgb3IKKwkgICAgZGllICJmYWlsZWQgdG8gY2hlY2tvdXQgJGNoZWNrb3V0IjsKKyAgICB9CisKKyAgICBpZiAoJHRlc3RfdHlwZSBlcSAiYmlzZWN0IikgeworCWJpc2VjdCAkaTsKKwluZXh0OworICAgIH0gZWxzaWYgKCR0ZXN0X3R5cGUgZXEgImNvbmZpZ19iaXNlY3QiKSB7CisJY29uZmlnX2Jpc2VjdCAkaTsKKwluZXh0OworICAgIH0gZWxzaWYgKCR0ZXN0X3R5cGUgZXEgInBhdGNoY2hlY2siKSB7CisJcGF0Y2hjaGVjayAkaTsKKwluZXh0OworICAgIH0KKworICAgIGlmICgkYnVpbGRfdHlwZSBuZSAibm9idWlsZCIpIHsKKwlidWlsZCAkYnVpbGRfdHlwZSBvciBuZXh0OworICAgIH0KKworICAgIGlmICgkdGVzdF90eXBlIG5lICJidWlsZCIpIHsKKwlnZXRfZ3J1Yl9pbmRleDsKKwlnZXRfdmVyc2lvbjsKKwlpbnN0YWxsOworCisJbXkgJGZhaWxlZCA9IDA7CisJc3RhcnRfbW9uaXRvcjsKKwltb25pdG9yIG9yICRmYWlsZWQgPSAxOzsKKworCWlmICghJGZhaWxlZCAmJiAkdGVzdF90eXBlIG5lICJib290IiAmJiBkZWZpbmVkKCRydW5fdGVzdCkpIHsKKwkgICAgZG9fcnVuX3Rlc3Qgb3IgJGZhaWxlZCA9IDE7CisJfQorCWVuZF9tb25pdG9yOworCW5leHQgaWYgKCRmYWlsZWQpOworICAgIH0KKworICAgIHN1Y2Nlc3MgJGk7Cit9CisKK2lmICgkb3B0eyJQT1dFUk9GRl9PTl9TVUNDRVNTIn0pIHsKKyAgICBoYWx0OworfSBlbHNpZiAoJG9wdHsiUkVCT09UX09OX1NVQ0NFU1MifSAmJiAhZG9fbm90X3JlYm9vdCkgeworICAgIHJlYm9vdDsKK30KKworZG9wcmludCAiXG4gICAgJHN1Y2Nlc3NlcyBvZiAkb3B0e05VTV9URVNUU30gdGVzdHMgd2VyZSBzdWNjZXNzZnVsXG5cbiI7CisKK2V4aXQgMDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcva3Rlc3Qvc2FtcGxlLmNvbmYgYi90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDhjNTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL2t0ZXN0L3NhbXBsZS5jb25mCkBAIC0wLDAgKzEsNjIyIEBACisjCisjIENvbmZpZyBmaWxlIGZvciBrdGVzdC5wbAorIworIyBOb3RlLCBhbGwgcGF0aHMgbXVzdCBiZSBhYnNvbHV0ZQorIworCisjIE9wdGlvbnMgc2V0IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYXJlIGNvbnNpZGVyZWQgdG8gYmUKKyMgZGVmYXVsdCBvcHRpb25zLiBUaGVzZSBvcHRpb25zIGNhbiBiZSBvdmVycmlkZW4gYnkgdGVzdCBzcGVjaWZpYworIyBvcHRpb25zLCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKyMKKyMgIExPR19GSUxFCisjICBDTEVBUl9MT0cKKyMgIFBPV0VST0ZGX09OX1NVQ0NFU1MKKyMgIFJFQk9PVF9PTl9TVUNDRVNTCisjCisjIFRlc3Qgc3BlY2lmaWMgb3B0aW9ucyBhcmUgc2V0IGFmdGVyIHRoZSBsYWJlbDoKKyMKKyMgVEVTVF9TVEFSVAorIworIyBUaGUgb3B0aW9ucyBhZnRlciBhIFRFU1RfU1RBUlQgbGFiZWwgYXJlIHNwZWNpZmljIHRvIHRoYXQgdGVzdC4KKyMgRWFjaCBURVNUX1NUQVJUIGxhYmVsIHdpbGwgc2V0IHVwIGEgbmV3IHRlc3QuIElmIHlvdSB3YW50IHRvCisjIHBlcmZvcm0gYSB0ZXN0IG1vcmUgdGhhbiBvbmNlLCB5b3UgY2FuIGFkZCB0aGUgSVRFUkFURSBsYWJlbAorIyB0byBpdCBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIHRpbWVzIHlvdSB3YW50IHRoYXQgdGVzdAorIyB0byBpdGVyYXRlLiBJZiB0aGUgSVRFUkFURSBpcyBsZWZ0IG9mZiwgdGhlIHRlc3Qgd2lsbCBvbmx5CisjIGJlIHBlcmZvcm1lZCBvbmNlLgorIworIyBURVNUX1NUQVJUIElURVJBVEUgMTAKKyMKKyMgWW91IGNhbiBza2lwIGEgdGVzdCBieSBhZGRpbmcgU0tJUCAoYmVmb3JlIG9yIGFmdGVyIHRoZSBJVEVSQVRFCisjIGFuZCBudW1iZXIpCisjCisjIFRFU1RfU1RBUlQgU0tJUAorIworIyBURVNUX1NUQVJUIFNLSVAgSVRFUkFURSAxMAorIworIyBURVNUX1NUQVJUIElURVJBVEUgMTAgU0tJUAorIworIyBUaGUgU0tJUCBsYWJlbCBjYXVzZXMgdGhlIG9wdGlvbnMgYW5kIHRoZSB0ZXN0IGl0c2VsZiB0byBiZSBpZ25vcmVkLgorIyBUaGlzIGlzIHVzZWZ1bCB0byBzZXQgdXAgc2V2ZXJhbCBkaWZmZXJlbnQgdGVzdHMgaW4gb25lIGNvbmZpZyBmaWxlLCBhbmQKKyMgb25seSBlbmFibGluZyB0aGUgb25lcyB5b3Ugd2FudCB0byB1c2UgZm9yIGEgY3VycmVudCB0ZXN0IHJ1bi4KKyMKKyMgWW91IGNhbiBhZGQgZGVmYXVsdCBvcHRpb25zIGFueXdoZXJlIGluIHRoZSBmaWxlIGFzIHdlbGwKKyMgd2l0aCB0aGUgREVGQVVMVFMgdGFnLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSBkZWZhdWx0IG9wdGlvbnMKKyMgYWZ0ZXIgdGhlIHRlc3Qgb3B0aW9ucyB0byBrZWVwIHRoZSB0ZXN0IG9wdGlvbnMgYXQgdGhlIHRvcAorIyBvZiB0aGUgZmlsZS4gWW91IGNhbiBldmVuIHBsYWNlIHRoZSBERUZBVUxUUyB0YWcgYmV0d2VlbgorIyB0ZXN0IGNhc2VzIChidXQgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBzaW5nbGUgdGVzdCBjYXNlKQorIworIyBURVNUX1NUQVJUCisjIE1JTl9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy10ZXN0MQorIworIyBERUZBVUxUUworIyBNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctZGVmYXVsdAorIworIyBURVNUX1NUQVJUIElURVJBVEUgMTAKKyMKKyMgVGhlIGFib3ZlIHdpbGwgcnVuIHRoZSBmaXJzdCB0ZXN0IHdpdGggTUlOX0NPTkZJRyBzZXQgdG8KKyMgL2hvbWUvdGVzdC9jb25maWctdGVzdC0xLiBUaGVuIDEwIHRlc3RzIHdpbGwgYmUgZXhlY3V0ZWQKKyMgd2l0aCBNSU5fQ09ORklHIHdpdGggL2hvbWUvdGVzdC9jb25maWctZGVmYXVsdC4KKyMKKyMgWW91IGNhbiBhbHNvIGRpc2FibGUgZGVmYXVsdHMgd2l0aCB0aGUgU0tJUCBvcHRpb24KKyMKKyMgREVGQVVMVFMgU0tJUAorIyBNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctdXNlLXNvbWV0aW1lcworIworIyBERUZBVUxUUworIyBNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctbW9zdC10aW1lcworIworIyBUaGUgYWJvdmUgd2lsbCBpZ25vcmUgdGhlIGZpcnN0IE1JTl9DT05GSUcuIElmIHlvdSB3YW50IHRvCisjIHVzZSB0aGUgZmlyc3QgTUlOX0NPTkZJRywgcmVtb3ZlIHRoZSBTS0lQIGZyb20gdGhlIGZpcnN0CisjIERFRkFVTFRTIHRhZyBhbmQgYWRkIGl0IHRvIHRoZSBzZWNvbmQuIEJlIGNhcmVmdWwsIG9wdGlvbnMKKyMgbWF5IG9ubHkgYmUgZGVjbGFyZWQgb25jZSBwZXIgdGVzdCBvciBkZWZhdWx0LiBJZiB5b3UgaGF2ZQorIyB0aGUgc2FtZSBvcHRpb24gbmFtZSB1bmRlciB0aGUgc2FtZSB0ZXN0IG9yIGFzIGRlZmF1bHQKKyMga3Rlc3Qgd2lsbCBmYWlsIHRvIGV4ZWN1dGUsIGFuZCBubyB0ZXN0cyB3aWxsIHJ1bi4KKyMKKworCisjIyMjIE1hbmRhdG9yeSBEZWZhdWx0IE9wdGlvbnMgIyMjIworCisjIFRoZXNlIG9wdGlvbnMgbXVzdCBiZSBpbiB0aGUgZGVmYXVsdCBzZWN0aW9uLCBhbHRob3VnaCBtb3N0CisjIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRlc3Qgb3B0aW9ucy4KKworIyBUaGUgbWFjaGluZSBob3N0bmFtZSB0aGF0IHlvdSB3aWxsIHRlc3QKKyNNQUNISU5FID0gdGFyZ2V0CisKKyMgVGhlIGJveCBpcyBleHBlY3RlZCB0byBoYXZlIHNzaCBvbiBub3JtYWwgYm9vdHVwLCBwcm92aWRlIHRoZSB1c2VyCisjICAobW9zdCBsaWtlbHkgcm9vdCwgc2luY2UgeW91IG5lZWQgcHJpdmlsZWdlZCBvcGVyYXRpb25zKQorI1NTSF9VU0VSID0gcm9vdAorCisjIFRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgTGludXggc291cmNlIGNvZGUKKyNCVUlMRF9ESVIgPSAvaG9tZS90ZXN0L2xpbnV4LmdpdAorCisjIFRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgb2JqZWN0cyB3aWxsIGJlIGJ1aWx0CisjIChjYW4gbm90IGJlIHNhbWUgYXMgQlVJTERfRElSKQorI09VVFBVVF9ESVIgPSAvaG9tZS90ZXN0L2J1aWxkL3RhcmdldAorCisjIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZWQgZmlsZSB0byBjb3B5IHRvIHRoZSB0YXJnZXQKKyMgKHJlbGF0aXZlIHRvIE9VVFBVVF9ESVIpCisjQlVJTERfVEFSR0VUID0gYXJjaC94ODYvYm9vdC9iekltYWdlCisKKyMgVGhlIHBsYWNlIHRvIHB1dCB5b3VyIGltYWdlIG9uIHRoZSB0ZXN0IG1hY2hpbmUKKyNUQVJHRVRfSU1BR0UgPSAvYm9vdC92bWxpbnV6LXRlc3QKKworIyBBIHNjcmlwdCBvciBjb21tYW5kIHRvIHJlYm9vdCB0aGUgYm94CisjCisjIEhlcmUgaXMgYSBkaWdpdGFsIGxvZ2dlcnMgcG93ZXIgc3dpdGNoIGV4YW1wbGUKKyNQT1dFUl9DWUNMRSA9IHdnZXQgLS1uby1wcm94eSAtTyAvZGV2L251bGwgLXEgIC0tYXV0aC1uby1jaGFsbGVuZ2UgJ2h0dHA6Ly9hZG1pbjphZG1pbkBwb3dlci9vdXRsZXQ/NT1DQ0wnCisjCisjIEhlcmUgaXMgYW4gZXhhbXBsZSB0byByZWJvb3QgYSB2aXJ0dWFsIGJveCBvbiB0aGUgY3VycmVudCBob3N0CisjIHdpdGggdGhlIG5hbWUgIkd1ZXN0Ii4KKyNQT1dFUl9DWUNMRSA9IHZpcnNoIGRlc3Ryb3kgR3Vlc3Q7IHNsZWVwIDU7IHZpcnNoIHN0YXJ0IEd1ZXN0CisKKyMgVGhlIHNjcmlwdCBvciBjb21tYW5kIHRoYXQgcmVhZHMgdGhlIGNvbnNvbGUKKyMKKyMgIElmIHlvdSB1c2UgdHR5d2F0Y2ggc2VydmVyLCBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHdvdWxkIHdvcmsuCisjQ09OU09MRSA9IG5jIC1kIGxvY2FsaG9zdCAzMDAxCisjCisjIEZvciBhIHZpcnR1YWwgbWFjaGluZSB3aXRoIGd1ZXN0IG5hbWUgIkd1ZXN0Ii4KKyNDT05TT0xFID0gIHZpcnNoIGNvbnNvbGUgR3Vlc3QKKworIyBSZXF1aXJlZCB2ZXJzaW9uIGVuZGluZyB0byBkaWZmZXJlbnRpYXRlIHRoZSB0ZXN0CisjIGZyb20gb3RoZXIgbGludXggYnVpbGRzIG9uIHRoZSBzeXN0ZW0uCisjTE9DQUxWRVJTSU9OID0gLXRlc3QKKworIyBUaGUgZ3J1YiB0aXRsZSBuYW1lIGZvciB0aGUgdGVzdCBrZXJuZWwgdG8gYm9vdAorIyAoT25seSBtYW5kYXRvcnkgaWYgUkVCT09UX1RZUEUgPSBncnViKQorIworIyBOb3RlLCBrdGVzdC5wbCB3aWxsIG5vdCB1cGRhdGUgdGhlIGdydWIgbWVudS5sc3QsIHlvdSBuZWVkIHRvCisjIG1hbnVhbGx5IGFkZCBhbiBvcHRpb24gZm9yIHRoZSB0ZXN0LiBrdGVzdC5wbCB3aWxsIHNlYXJjaAorIyB0aGUgZ3J1YiBtZW51LmxzdCBmb3IgdGhpcyBvcHRpb24gdG8gZmluZCB3aGF0IGtlcm5lbCB0bworIyByZWJvb3QgaW50by4KKyMKKyMgRm9yIGV4YW1wbGUsIGlmIGluIHRoZSAvYm9vdC9ncnViL21lbnUubHN0IHRoZSB0ZXN0IGtlcm5lbCB0aXRsZSBoYXM6CisjIHRpdGxlIFRlc3QgS2VybmVsCisjIGtlcm5lbCB2bWxpbnV6LXRlc3QKKyNHUlVCX01FTlUgPSBUZXN0IEtlcm5lbAorCisjIEEgc2NyaXB0IHRvIHJlYm9vdCB0aGUgdGFyZ2V0IGludG8gdGhlIHRlc3Qga2VybmVsCisjIChPbmx5IG1hbmRhdG9yeSBpZiBSRUJPT1RfVFlQRSA9IHNjcmlwdCkKKyNSRUJPT1RfU0NSSVBUID0KKworIyMjIyBPcHRpb25hbCBDb25maWcgT3B0aW9ucyAoYWxsIGhhdmUgZGVmYXVsdHMpICMjIyMKKworIyBTdGFydCBhIHRlc3Qgc2V0dXAuIElmIHlvdSBsZWF2ZSB0aGlzIG9mZiwgYWxsIG9wdGlvbnMKKyMgd2lsbCBiZSBkZWZhdWx0IGFuZCB0aGUgdGVzdCB3aWxsIHJ1biBvbmNlLgorIyBUaGlzIGlzIGEgbGFiZWwgYW5kIG5vdCByZWFsbHkgYW4gb3B0aW9uIChpdCB0YWtlcyBubyB2YWx1ZSkuCisjIFlvdSBjYW4gYXBwZW5kIElURVJBVEUgYW5kIGEgbnVtYmVyIGFmdGVyIGl0IHRvIGl0ZXJhdGUgdGhlCisjIHRlc3QgYSBudW1iZXIgb2YgdGltZXMsIG9yIFNLSVAgdG8gaWdub3JlIHRoaXMgdGVzdC4KKyMKKyNURVNUX1NUQVJUCisjVEVTVF9TVEFSVCBJVEVSQVRFIDUKKyNURVNUX1NUQVJUIFNLSVAKKworIyBIYXZlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcyBkZWZhdWx0IGFnYWluLiBVc2VkIGFmdGVyIHRlc3RzCisjIGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQgYnkgVEVTVF9TVEFSVC4gT3B0aW9uYWxseSwgeW91IGNhbgorIyBqdXN0IGRlZmluZSBhbGwgZGVmYXVsdCBvcHRpb25zIGJlZm9yZSB0aGUgZmlyc3QgVEVTVF9TVEFSVAorIyBhbmQgeW91IGRvIG5vdCBuZWVkIHRoaXMgb3B0aW9uLgorIworIyBUaGlzIGlzIGEgbGFiZWwgYW5kIG5vdCByZWFsbHkgYW4gb3B0aW9uIChpdCB0YWtlcyBubyB2YWx1ZSkuCisjIFlvdSBjYW4gYXBwZW5kIFNLSVAgdG8gdGhpcyBsYWJlbCBhbmQgdGhlIG9wdGlvbnMgd2l0aGluIHRoaXMKKyMgc2VjdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisjCisjIERFRkFVTFRTCisjIERFRkFVTFRTIFNLSVAKKworIyBUaGUgZGVmYXVsdCB0ZXN0IHR5cGUgKGRlZmF1bHQgdGVzdCkKKyMgVGhlIHRlc3QgdHlwZXMgbWF5IGJlOgorIyAgIGJ1aWxkIC0gb25seSBidWlsZCB0aGUga2VybmVsLCBkbyBub3RoaW5nIGVsc2UKKyMgICBib290IC0gYnVpbGQgYW5kIGJvb3QgdGhlIGtlcm5lbAorIyAgIHRlc3QgLSBidWlsZCwgYm9vdCBhbmQgaWYgVEVTVCBpcyBzZXQsIHJ1biB0aGUgdGVzdCBzY3JpcHQKKyMgICAgICAgICAgKElmIFRFU1QgaXMgbm90IHNldCwgaXQgZGVmYXVsdHMgYmFjayB0byBib290KQorIyAgIGJpc2VjdCAtIFBlcmZvcm0gYSBiaXNlY3Qgb24gdGhlIGtlcm5lbCAoc2VlIEJJU0VDVF9UWVBFIGJlbG93KQorIyAgIHBhdGNoY2hlY2sgLSBEbyBhIHRlc3Qgb24gYSBzZXJpZXMgb2YgY29tbWl0cyBpbiBnaXQgKHNlZSBQQVRDSENIRUNLIGJlbG93KQorI1RFU1RfVFlQRSA9IHRlc3QKKworIyBUZXN0IHRvIHJ1biBpZiB0aGVyZSBpcyBhIHN1Y2Nlc3NmdWwgYm9vdCBhbmQgVEVTVF9UWVBFIGlzIHRlc3QuCisjIE11c3QgZXhpdCB3aXRoIDAgb24gc3VjY2VzcyBhbmQgbm9uIHplcm8gb24gZXJyb3IKKyMgZGVmYXVsdCAodW5kZWZpbmVkKQorI1RFU1QgPSBzc2ggdXNlckBtYWNoaW5lIC9yb290L3J1bl90ZXN0CisKKyMgVGhlIGJ1aWxkIHR5cGUgaXMgYW55IG1ha2UgY29uZmlnIHR5cGUgb3Igc3BlY2lhbCBjb21tYW5kCisjICAoZGVmYXVsdCByYW5kY29uZmlnKQorIyAgIG5vYnVpbGQgLSBza2lwIHRoZSBjbGVhbiBhbmQgYnVpbGQgc3RlcAorIyAgIHVzZWNvbmZpZzovcGF0aC90by9jb25maWcgLSB1c2UgdGhlIGdpdmVuIGNvbmZpZyBhbmQgcnVuCisjICAgICAgICAgICAgICBvbGRjb25maWcgb24gaXQuCisjIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgVEVTVF9UWVBFIGlzIHBhdGNoY2hlY2sgb3IgYmlzZWN0CisjQlVJTERfVFlQRSA9IHJhbmRjb25maWcKKworIyBUaGUgbWFrZSBjb21tYW5kIChkZWZhdWx0IG1ha2UpCisjIElmIHlvdSBhcmUgYnVpbGRpbmcgYSAzMmJpdCB4ODYgb24gYSA2NCBiaXQgaG9zdAorI01BS0VfQ01EID0gQ0M9aTM4Ni1nY2MgQVM9aTM4Ni1hcyBtYWtlIEFSQ0g9aTM4NgorCisjIEFueSBidWlsZCBvcHRpb25zIGZvciB0aGUgbWFrZSBvZiB0aGUga2VybmVsIChub3QgZm9yIG90aGVyIG1ha2VzLCBsaWtlIGNvbmZpZ3MpCisjIChkZWZhdWx0ICIiKQorI0JVSUxEX09QVElPTlMgPSAtajIwCisKKyMgSWYgeW91IG5lZWQgYW4gaW5pdHJkLCB5b3UgY2FuIGFkZCBhIHNjcmlwdCBvciBjb2RlIGhlcmUgdG8gaW5zdGFsbAorIyBpdC4gVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtFUk5FTF9WRVJTSU9OIHdpbGwgYmUgc2V0IHRvIHRoZQorIyBrZXJuZWwgdmVyc2lvbiB0aGF0IGlzIHVzZWQuIFJlbWVtYmVyIHRvIGFkZCB0aGUgaW5pdHJkIGxpbmUKKyMgdG8geW91ciBncnViIG1lbnUubHN0IGZpbGUuCisjCisjIEhlcmUncyBhIGNvdXBsZSBvZiBleGFtcGxlcyB0byB1c2U6CisjUE9TVF9JTlNUQUxMID0gc3NoIHVzZXJAdGFyZ2V0IC9zYmluL21raW5pdHJkIC0tYWxsb3ctbWlzc2luZyAtZiAvYm9vdC9pbml0cmFtZnMtdGVzdC5pbWcgJEtFUk5FTF9WRVJTSU9OCisjCisjIG9yIG9uIHNvbWUgc3lzdGVtczoKKyNQT1NUX0lOU1RBTEwgPSBzc2ggdXNlckB0YXJnZXQgL3NiaW4vZHJhY3V0IC1mIC9ib290L2luaXRyYW1mcy10ZXN0LmltZyAkS0VSTkVMX1ZFUlNJT04KKworIyBXYXkgdG8gcmVib290IHRoZSBib3ggdG8gdGhlIHRlc3Qga2VybmVsLgorIyBPbmx5IHZhbGlkIG9wdGlvbnMgc28gZmFyIGFyZSAiZ3J1YiIgYW5kICJzY3JpcHQiCisjIChkZWZhdWx0IGdydWIpCisjIElmIHlvdSBzcGVjaWZ5IGdydWIsIGl0IHdpbGwgYXNzdW1lIGdydWIgdmVyc2lvbiAxCisjIGFuZCB3aWxsIHNlYXJjaCBpbiAvYm9vdC9ncnViL21lbnUubHN0IGZvciB0aGUgdGl0bGUgJEdSVUJfTUVOVQorIyBhbmQgc2VsZWN0IHRoYXQgdGFyZ2V0IHRvIHJlYm9vdCB0byB0aGUga2VybmVsLiBJZiB0aGlzIGlzIG5vdAorIyB5b3VyIHNldHVwLCB0aGVuIHNwZWNpZnkgInNjcmlwdCIgYW5kIGhhdmUgYSBjb21tYW5kIG9yIHNjcmlwdAorIyBzcGVjaWZpZWQgaW4gUkVCT09UX1NDUklQVCB0byBib290IHRvIHRoZSB0YXJnZXQuCisjCisjIFRoZSBlbnRyeSBpbiAvYm9vdC9ncnViL21lbnUubHN0IG11c3QgYmUgZW50ZXJlZCBpbiBtYW51YWxseS4KKyMgVGhlIHRlc3Qgd2lsbCBub3QgbW9kaWZ5IHRoYXQgZmlsZS4KKyNSRUJPT1RfVFlQRSA9IGdydWIKKworIyBUaGUgbWluIGNvbmZpZyB0aGF0IGlzIG5lZWRlZCB0byBidWlsZCBmb3IgdGhlIG1hY2hpbmUKKyMgQSBuaWNlIHdheSB0byBjcmVhdGUgdGhpcyBpcyB3aXRoIHRoZSBmb2xsb3dpbmc6CisjCisjICAgJCBzc2ggdGFyZ2V0CisjICAgJCBsc21vZCA+IG15bW9kcworIyAgICQgc2NwIG15bW9kcyBob3N0Oi90bXAKKyMgICAkIGV4aXQKKyMgICAkIGNkIGxpbnV4LmdpdAorIyAgICQgcm0gLmNvbmZpZworIyAgICQgbWFrZSBMU01PRD1teW1vZHMgbG9jYWx5ZXNjb25maWcKKyMgICAkIGdyZXAgJ15DT05GSUcnIC5jb25maWcgPiAvaG9tZS90ZXN0L2NvbmZpZy1taW4KKyMKKyMgSWYgeW91IHdhbnQgZXZlbiBsZXNzIGNvbmZpZ3M6CisjCisjICAgbG9nIGluIGRpcmVjdGx5IHRvIHRhcmdldCAoZG8gbm90IHNzaCkKKyMKKyMgICAkIHN1CisjICAgIyBsc21vZCB8IGN1dCAtZCcgJyAtZjEgfCB4YXJncyBybW1vZAorIworIyAgIHJlcGVhdCB0aGUgYWJvdmUgc2V2ZXJhbCB0aW1lcworIworIyAgICMgbHNtb2QgPiBteW1vZHMKKyMgICAjIHJlYm9vdAorIworIyBNYXkgbmVlZCB0byByZWJvb3QgdG8gZ2V0IHlvdXIgbmV0d29yayBiYWNrIHRvIGNvcHkgdGhlIG15bW9kcworIyB0byB0aGUgaG9zdCwgYW5kIHRoZW4gcmVtb3ZlIHRoZSBwcmV2aW91cyAuY29uZmlnIGFuZCBydW4gdGhlCisjIGxvY2FseWVzY29uZmlnIGFnYWluLiBUaGUgQ09ORklHX01JTiBnZW5lcmF0ZWQgbGlrZSB0aGlzIHdpbGwKKyMgbm90IGd1YXJhbnRlZSBuZXR3b3JrIGFjdGl2aXR5IHRvIHRoZSBib3ggc28gdGhlIFRFU1RfVFlQRSBvZgorIyB0ZXN0IG1heSBmYWlsLgorIworIyBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIHNldDoKKyMgICBDT05GSUdfQ01ETElORT0iPHlvdXIgb3B0aW9ucyBoZXJlPiIKKyMgIHJhbmRjb25maWcgbWF5IHNldCB0aGUgYWJvdmUgYW5kIG92ZXJyaWRlIHlvdXIgcmVhbCBjb21tYW5kCisjICBsaW5lIG9wdGlvbnMuCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctbWluCisKKyMgU29tZXRpbWVzIHRoZXJlJ3Mgb3B0aW9ucyB0aGF0IGp1c3QgYnJlYWsgdGhlIGJvb3QgYW5kCisjIHlvdSBkbyBub3QgY2FyZSBhYm91dC4gSGVyZSBhcmUgYSBmZXc6CisjICAgIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisjICBTdGFnaW5nIGRyaXZlcnMgYXJlIGhvcnJpYmxlLCBhbmQgY2FuIGJyZWFrIHRoZSBidWlsZC4KKyMgICAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgIFNDU0lfREVCVUcgbWF5IGNoYW5nZSB5b3VyIHJvb3QgcGFydGl0aW9uCisjICAgIyBDT05GSUdfS0dEQl9TRVJJQUxfQ09OU09MRSBpcyBub3Qgc2V0CisjICBLR0RCIG1heSBjYXVzZSBvb3BzIHdhaXRpbmcgZm9yIGEgY29ubmVjdGlvbiB0aGF0J3Mgbm90IHRoZXJlLgorIyBUaGlzIG9wdGlvbiBwb2ludHMgdG8gdGhlIGZpbGUgY29udGFpbmluZyBjb25maWcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkCisjIHRvIHRoZSBNSU5fQ09ORklHIChvciBiZSB0aGUgTUlOX0NPTkZJRyBpZiBpdCBpcyBub3Qgc2V0KQorIworIyBOb3RlLCBjb25maWcgb3B0aW9ucyBpbiBNSU5fQ09ORklHIHdpbGwgb3ZlcnJpZGUgdGhlc2Ugb3B0aW9ucy4KKyMKKyMgKGRlZmF1bHQgdW5kZWZpbmVkKQorI0FERF9DT05GSUcgPSAvaG9tZS90ZXN0L2NvbmZpZy1icm9rZW4KKworIyBUaGUgbG9jYXRpb24gb24gdGhlIGhvc3Qgd2hlcmUgdG8gd3JpdGUgdGVtcCBmaWxlcworIyAoZGVmYXVsdCAvdG1wL2t0ZXN0KQorI1RNUF9ESVIgPSAvdG1wL2t0ZXN0CisKKyMgT3B0aW9uYWwgbG9nIGZpbGUgdG8gd3JpdGUgdGhlIHN0YXR1cyAocmVjb21tZW5kZWQpCisjICBOb3RlLCB0aGlzIGlzIGEgREVGQVVMVCBzZWN0aW9uIG9ubHkgb3B0aW9uLgorIyAoZGVmYXVsdCB1bmRlZmluZWQpCisjTE9HX0ZJTEUgPSAvaG9tZS90ZXN0L2xvZ2ZpbGVzL3RhcmdldC5sb2cKKworIyBSZW1vdmUgb2xkIGxvZ2ZpbGUgaWYgaXQgZXhpc3RzIGJlZm9yZSBzdGFydGluZyBhbGwgdGVzdHMuCisjICBOb3RlLCB0aGlzIGlzIGEgREVGQVVMVCBzZWN0aW9uIG9ubHkgb3B0aW9uLgorIyAoZGVmYXVsdCAwKQorI0NMRUFSX0xPRyA9IDAKKworIyBMaW5lIHRvIGRlZmluZSBhIHN1Y2Nlc3NmdWwgYm9vdCB1cCBpbiBjb25zb2xlIG91dHB1dC4KKyMgVGhpcyBpcyB3aGF0IHRoZSBsaW5lIGNvbnRhaW5zLCBub3QgdGhlIGVudGlyZSBsaW5lLiBJZiB5b3UgbmVlZAorIyB0aGUgZW50aXJlIGxpbmUgdG8gbWF0Y2gsIHRoZW4gdXNlIHJlZ3VyYWwgZXhwcmVzc2lvbiBzeW50YXggbGlrZToKKyMgIChkbyBub3QgYWRkIGFueSBxdW90ZXMgYXJvdW5kIGl0KQorIworIyAgU1VDQ0VTU19MSU5FID0gXk15Qm94IExvZ2luOiQKKyMKKyMgKGRlZmF1bHQgImxvZ2luOiIpCisjU1VDQ0VTU19MSU5FID0gbG9naW46CisKKyMgSW4gY2FzZSB0aGUgY29uc29sZSBjb25zdGFudGx5IGZpbGxzIHRoZSBzY3JlZW4sIGhhdmluZworIyBhIHNwZWNpZmllZCB0aW1lIHRvIHN0b3AgdGhlIHRlc3QgYWZ0ZXIgc3VjY2VzcyBpcyByZWNvbW1lbmRlZC4KKyMgKGluIHNlY29uZHMpCisjIChkZWZhdWx0IDEwKQorI1NUT1BfQUZURVJfU1VDQ0VTUyA9IDEwCisKKyMgSW4gY2FzZSB0aGUgY29uc29sZSBjb25zdGFudGx5IGZpbGxzIHRoZSBzY3JlZW4sIGhhdmluZworIyBhIHNwZWNpZmllZCB0aW1lIHRvIHN0b3AgdGhlIHRlc3QgYWZ0ZXIgZmFpbHVyZSBpcyByZWNvbW1lbmRlZC4KKyMgKGluIHNlY29uZHMpCisjIChkZWZhdWx0IDYwKQorI1NUT1BfQUZURVJfRkFJTFVSRSA9IDYwCisKKyMgU3RvcCB0ZXN0aW5nIGlmIGEgYnVpbGQgZmFpbHMuIElmIHNldCwgdGhlIHNjcmlwdCB3aWxsIGVuZCBpZgorIyBhIGZhaWx1cmUgaXMgZGV0ZWN0ZWQsIG90aGVyd2lzZSBpdCB3aWxsIHNhdmUgb2ZmIHRoZSAuY29uZmlnLAorIyBkbWVzZyBhbmQgYm9vdGxvZyBpbiBhIGRpcmVjdG9yeSBjYWxsZWQKKyMgTUFDSElORS1URVNUX1RZUEVfQlVJTERfVFlQRS1mYWlsLXl5eXltbWRkaGhtbXNzCisjIGlmIHRoZSBTVE9SRV9GQUlMVVJFUyBkaXJlY3RvcnkgaXMgc2V0LgorIyAoZGVmYXVsdCAxKQorIyBOb3RlLCBldmVuIGlmIHRoaXMgaXMgc2V0IHRvIHplcm8sIHRoZXJlIGFyZSBzb21lIGVycm9ycyB0aGF0IHN0aWxsCisjIHN0b3AgdGhlIHRlc3RzLgorI0RJRV9PTl9GQUlMVVJFID0gMQorCisjIERpcmVjdG9yeSB0byBzdG9yZSBmYWlsdXJlIGRpcmVjdG9yaWVzIG9uIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90CisjIHNldCwgRElFX09OX0ZBSUxVUkU9MCB3aWxsIG5vdCBzYXZlIG9mZiB0aGUgLmNvbmZpZywgZG1lc2cgYW5kCisjIGJvb3Rsb2cuIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgRElFX09OX0ZBSUxVUkUgaXMgbm90IHNldC4KKyMgKGRlZmF1bHQgdW5kZWZpbmVkKQorI1NUT1JFX0ZBSUxVUkVTID0gL2hvbWUvdGVzdC9mYWlsdXJlcworCisjIEJ1aWxkIHdpdGhvdXQgZG9pbmcgYSBtYWtlIG1ycHJvcGVyLCBvciByZW1vdmluZyAuY29uZmlnCisjIChkZWZhdWx0IDApCisjQlVJTERfTk9DTEVBTiA9IDAKKworIyBBcyB0aGUgdGVzdCByZWFkcyB0aGUgY29uc29sZSwgYWZ0ZXIgaXQgaGl0cyB0aGUgU1VDQ0VTU19MSU5FCisjIHRoZSB0aW1lIGl0IHdhaXRzIGZvciB0aGUgbW9uaXRvciB0byBzZXR0bGUgZG93biBiZXR3ZWVuIHJlYWRzCisjIGNhbiB1c3VhbGx5IGJlIGxvd2VyZWQuCisjIChpbiBzZWNvbmRzKSAoZGVmYXVsdCAxKQorI0JPT1RFRF9USU1FT1VUID0gMQorCisjIFRoZSB0aW1lb3V0IGluIHNlY29uZHMgd2hlbiB3ZSBjb25zaWRlciB0aGUgYm94IGh1bmcgYWZ0ZXIKKyMgdGhlIGNvbnNvbGUgc3RvcCBwcm9kdWNpbmcgb3V0cHV0LiBCZSBzdXJlIHRvIGxlYXZlIGVub3VnaAorIyB0aW1lIGhlcmUgdG8gZ2V0IHBhc3MgYSByZWJvb3QuIFNvbWUgbWFjaGluZXMgbWF5IG5vdCBwcm9kdWNlCisjIGFueSBjb25zb2xlIG91dHB1dCBmb3IgYSBsb25nIHRpbWUgZHVyaW5nIGEgcmVib290LiBZb3UgZG8KKyMgbm90IHdhbnQgdGhlIHRlc3QgdG8gZmFpbCBqdXN0IGJlY2F1c2UgdGhlIHN5c3RlbSB3YXMgaW4KKyMgdGhlIHByb2Nlc3Mgb2YgcmVib290aW5nIHRvIHRoZSB0ZXN0IGtlcm5lbC4KKyMgKGRlZmF1bHQgMTIwKQorI1RJTUVPVVQgPSAxMjAKKworIyBJbiBiZXR3ZWVuIHRlc3RzLCBhIHJlYm9vdCBvZiB0aGUgYm94IG1heSBvY2N1ciwgYW5kIHRoaXMKKyMgaXMgdGhlIHRpbWUgdG8gd2FpdCBmb3IgdGhlIGNvbnNvbGUgYWZ0ZXIgaXQgc3RvcHMgcHJvZHVjaW5nCisjIG91dHB1dC4gU29tZSBtYWNoaW5lcyBtYXkgbm90IHByb2R1Y2UgYSBsYXJnZSBsYWcgb24gcmVib290CisjIHNvIHRoaXMgc2hvdWxkIGFjY29tbW9kYXRlIGl0LgorIyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIFRJTUVPVVQsIGlzIHRoYXQgVElNRU9VVCBoYXBwZW5zCisjIHdoZW4gcmVib290aW5nIHRvIHRoZSB0ZXN0IGtlcm5lbC4gVGhpcyBzbGVlcCB0aW1lIGhhcHBlbnMKKyMgYWZ0ZXIgYSB0ZXN0IGhhcyBjb21wbGV0ZWQgYW5kIHdlIGFyZSBhYm91dCB0byBzdGFydCBydW5uaW5nCisjIGFub3RoZXIgdGVzdC4gSWYgYSByZWJvb3QgdG8gdGhlIHJlbGlhYmxlIGtlcm5lbCBoYXBwZW5zLAorIyB3ZSB3YWl0IFNMRUVQX1RJTUUgZm9yIHRoZSBjb25zb2xlIHRvIHN0b3AgcHJvZHVjaW5nIG91dHB1dAorIyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgdGVzdC4KKyMgKGRlZmF1bHQgNjApCisjU0xFRVBfVElNRSA9IDYwCisKKyMgVGhlIHRpbWUgaW4gYmV0d2VlbiBiaXNlY3RzIHRvIHNsZWVwIChpbiBzZWNvbmRzKQorIyAoZGVmYXVsdCA2MCkKKyNCSVNFQ1RfU0xFRVBfVElNRSA9IDYwCisKKyMgUmVib290IHRoZSB0YXJnZXQgYm94IG9uIGVycm9yIChkZWZhdWx0IDApCisjUkVCT09UX09OX0VSUk9SID0gMAorCisjIFBvd2VyIG9mZiB0aGUgdGFyZ2V0IG9uIGVycm9yIChpZ25vcmVkIGlmIFJFQk9PVF9PTl9FUlJPUiBpcyBzZXQpCisjICBOb3RlLCB0aGlzIGlzIGEgREVGQVVMVCBzZWN0aW9uIG9ubHkgb3B0aW9uLgorIyAoZGVmYXVsdCAwKQorI1BPV0VST0ZGX09OX0VSUk9SID0gMAorCisjIFBvd2VyIG9mZiB0aGUgdGFyZ2V0IGFmdGVyIGFsbCB0ZXN0cyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyMgIE5vdGUsIHRoaXMgaXMgYSBERUZBVUxUIHNlY3Rpb24gb25seSBvcHRpb24uCisjIChkZWZhdWx0IDApCisjUE9XRVJPRkZfT05fU1VDQ0VTUyA9IDAKKworIyBSZWJvb3QgdGhlIHRhcmdldCBhZnRlciBhbGwgdGVzdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IChkZWZhdWx0IDEpCisjIChpZ25vcmVkIGlmIFBPV0VST0ZGX09OX1NVQ0NFU1MgaXMgc2V0KQorI1JFQk9PVF9PTl9TVUNDRVNTID0gMQorCisjIEluIGNhc2UgdGhlcmUgYXJlIGlzc2VzIHdpdGggcmVib290aW5nLCB5b3UgY2FuIHNwZWNpZnkgdGhpcworIyB0byBhbHdheXMgcG93ZXJjeWNsZSBhZnRlciB0aGlzIGFtb3VudCBvZiB0aW1lIGFmdGVyIGNhbGxpbmcKKyMgcmVib290LgorIyBOb3RlLCBQT1dFUkNZQ0xFX0FGVEVSX1JFQk9PVCA9IDAgZG9lcyBOT1QgZGlzYWJsZSBpdC4gSXQganVzdAorIyBtYWtlcyBpdCBwb3dlcmN5Y2xlIGltbWVkaWF0ZWx5IGFmdGVyIHJlYm9vdGluZy4gRG8gbm90IGRlZmluZQorIyBpdCBpZiB5b3UgZG8gbm90IHdhbnQgaXQuCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNQT1dFUkNZQ0xFX0FGVEVSX1JFQk9PVCA9IDUKKworIyBJbiBjYXNlIHRoZXJlJ3MgaXNzZXMgd2l0aCBoYWx0aW5nLCB5b3UgY2FuIHNwZWNpZnkgdGhpcworIyB0byBhbHdheXMgcG93ZXJvZmYgYWZ0ZXIgdGhpcyBhbW91bnQgb2YgdGltZSBhZnRlciBjYWxsaW5nCisjIGhhbHQuCisjIE5vdGUsIFBPV0VST0ZGX0FGVEVSX0hBTFQgPSAwIGRvZXMgTk9UIGRpc2FibGUgaXQuIEl0IGp1c3QKKyMgbWFrZXMgaXQgcG93ZXJvZmYgaW1tZWRpYXRlbHkgYWZ0ZXIgaGFsdGluZy4gRG8gbm90IGRlZmluZQorIyBpdCBpZiB5b3UgZG8gbm90IHdhbnQgaXQuCisjIChkZWZhdWx0IHVuZGVmaW5lZCkKKyNQT1dFUk9GRl9BRlRFUl9IQUxUID0gMjAKKworIyBBIHNjcmlwdCBvciBjb21tYW5kIHRvIHBvd2VyIG9mZiB0aGUgYm94IChkZWZhdWx0IHVuZGVmaW5lZCkKKyMgTmVlZGVkIGZvciBQT1dFUk9GRl9PTl9FUlJPUiBhbmQgU1VDQ0VTUworIworIyBFeGFtcGxlIGZvciBkaWdpdGFsIGxvZ2dlcnMgcG93ZXIgc3dpdGNoOgorI1BPV0VSX09GRiA9IHdnZXQgLS1uby1wcm94eSAtTyAvZGV2L251bGwgLXEgIC0tYXV0aC1uby1jaGFsbGVuZ2UgJ2h0dHA6Ly9hZG1pbjphZG1pbkBwb3dlci9vdXRsZXQ/NT1PRkYnCisjCisjIEV4YW1wbGUgZm9yIGEgdmlydHVhbCBndWVzdCBjYWxsICJHdWVzdCIuCisjUE9XRVJfT0ZGID0gdmlyc2ggZGVzdHJveSBHdWVzdAorCisjIFRoZSB3YXkgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgb24gdGhlIHRhcmdldAorIyAoZGVmYXVsdCBzc2ggJFNTSF9VU0VSQCRNQUNISU5FICRTU0hfQ09NTUFORCI7KQorIyBUaGUgdmFyaWFibGVzIFNTSF9VU0VSLCBNQUNISU5FIGFuZCBTU0hfQ09NTUFORCBhcmUgZGVmaW5lZAorI1NTSF9FWEVDID0gc3NoICRTU0hfVVNFUkAkTUFDSElORSAkU1NIX0NPTU1BTkQiOworCisjIFRoZSB3YXkgdG8gY29weSBhIGZpbGUgdG8gdGhlIHRhcmdldAorIyAoZGVmYXVsdCBzY3AgJFNSQ19GSUxFICRTU0hfVVNFUkAkTUFDSElORTokRFNUX0ZJTEUpCisjIFRoZSB2YXJpYWJsZXMgU1NIX1VTRVIsIE1BQ0hJTkUsIFNSQ19GSUxFIGFuZCBEU1RfRklMRSBhcmUgZGVmaW5lZC4KKyNTQ1BfVE9fVEFSR0VUID0gc2NwICRTUkNfRklMRSAkU1NIX1VTRVJAJE1BQ0hJTkU6JERTVF9GSUxFCisKKyMgVGhlIG5pY2Ugd2F5IHRvIHJlYm9vdCB0aGUgdGFyZ2V0CisjIChkZWZhdWx0IHNzaCAkU1NIX1VTRVJAJE1BQ0hJTkUgcmVib290KQorIyBUaGUgdmFyaWFibGVzIFNTSF9VU0VSIGFuZCBNQUNISU5FIGFyZSBkZWZpbmVkLgorI1JFQk9PVCA9IHNzaCAkU1NIX1VTRVJAJE1BQ0hJTkUgcmVib290CisKKyMjIyMgUGVyIHRlc3QgcnVuIG9wdGlvbnMgIyMjIworIyBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIG9ubHkgYWxsb3dlZCBpbiBURVNUX1NUQVJUIHNlY3Rpb25zLgorIyBUaGV5IGFyZSBpZ25vcmVkIGluIHRoZSBERUZBVUxUUyBzZWN0aW9ucy4KKyMKKyMgQWxsIG9mIHRoZXNlIGFyZSBvcHRpb25hbCBhbmQgdW5kZWZpbmVkIGJ5IGRlZmF1bHQsIGFsdGhvdWdoCisjICBzb21lIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvciBURVNUX1RZUEUgb2YgcGF0Y2hjaGVjaworIyAgYW5kIGJpc2VjdC4KKyMKKyMKKyMgQ0hFQ0tPVVQgPSBicmFuY2gKKyMKKyMgIElmIHRoZSBCVUlMRF9ESVIgaXMgYSBnaXQgcmVwb3NpdG9yeSwgdGhlbiB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbgorIyAgdG8gY2hlY2tvdXQgdGhlIGdpdmVuIGJyYW5jaCBiZWZvcmUgcnVubmluZyB0aGUgVEVTVC4gSWYgeW91CisjICBzcGVjaWZ5IHRoaXMgZm9yIHRoZSBmaXJzdCBydW4sIHRoYXQgYnJhbmNoIHdpbGwgYmUgdXNlZCBmb3IKKyMgIGFsbCBwcmVjZWRpbmcgdGVzdHMgdW50aWwgYSBuZXcgQ0hFQ0tPVVQgaXMgc2V0LgorIworIworIworIyBGb3IgVEVTVF9UWVBFID0gcGF0Y2hjaGVjaworIworIyAgVGhpcyBleHBlY3RzIHRoZSBCVUlMRF9ESVIgdG8gYmUgYSBnaXQgcmVwb3NpdG9yeSwgYW5kCisjICB3aWxsIGNoZWNrb3V0IHRoZSBQQVRDSENIRUNLX1NUQVJUIGNvbW1pdC4KKyMKKyMgIFRoZSBvcHRpb24gQlVJTERfVFlQRSB3aWxsIGJlIGlnbm9yZWQuCisjCisjICBUaGUgTUlOX0NPTkZJRyB3aWxsIGJlIHVzZWQgZm9yIGFsbCBidWlsZHMgb2YgdGhlIHBhdGNoY2hlY2suIFRoZSBidWlsZCB0eXBlCisjICB1c2VkIGZvciBwYXRjaGNoZWNrIGlzIG9sZGNvbmZpZy4KKyMKKyMgIFBBVENIQ0hFQ0tfU1RBUlQgaXMgcmVxdWlyZWQgYW5kIGlzIHRoZSBmaXJzdCBwYXRjaCB0bworIyAgIHRlc3QgKHRoZSBTSEExIG9mIHRoZSBjb21taXQpLiBZb3UgbWF5IGFsc28gc3BlY2lmeSBhbnl0aGluZworIyAgIHRoYXQgZ2l0IGNoZWNrb3V0IGFsbG93cyAoYnJhbmNoIG5hbWUsIHRhZ2UsIEhFQUR+MykuCisjCisjICBQQVRDSENIRUNLX0VORCBpcyB0aGUgbGFzdCBwYXRjaCB0byBjaGVjayAoZGVmYXVsdCBIRUFEKQorIworIyAgUEFUQ0hDSEVDS19UWVBFIGlzIHJlcXVpcmVkIGFuZCBpcyB0aGUgdHlwZSBvZiB0ZXN0IHRvIHJ1bjoKKyMgICAgICBidWlsZCwgYm9vdCwgdGVzdC4KKyMKKyMgICBOb3RlLCB0aGUgYnVpbGQgdGVzdCB3aWxsIGxvb2sgZm9yIHdhcm5pbmdzLCBpZiBhIHdhcm5pbmcgb2NjdXJyZWQKKyMgICAgIGluIGEgZmlsZSB0aGF0IGEgY29tbWl0IHRvdWNoZXMsIHRoZSBidWlsZCB3aWxsIGZhaWwuCisjCisjICAgSWYgQlVJTERfTk9DTEVBTiBpcyBzZXQsIHRoZW4gbWFrZSBtcnByb3BlciB3aWxsIG5vdCBiZSBydW4gb24KKyMgICBhbnkgb2YgdGhlIGJ1aWxkcywganVzdCBsaWtlIGFsbCBvdGhlciBURVNUX1RZUEUgdGVzdHMuIEJ1dAorIyAgIHdoYXQgbWFrZXMgcGF0Y2hjaGVjayBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgdGVzdHMsIGlzIGlmCisjICAgQlVJTERfTk9DTEVBTiBpcyBub3Qgc2V0LCBvbmx5IHRoZSBmaXJzdCBhbmQgbGFzdCBwYXRjaCBydW4KKyMgICBtYWtlIG1ycHJvcGVyLiBUaGlzIGhlbHBzIHNwZWVkIHVwIHRoZSB0ZXN0LgorIworIyBFeGFtcGxlOgorIyAgIFRFU1RfU1RBUlQKKyMgICBURVNUX1RZUEUgPSBwYXRjaGNoZWNrCisjICAgQ0hFQ0tPVVQgPSBteWJyYW5jaAorIyAgIFBBVENIQ0hFQ0tfVFlQRSA9IGJvb3QKKyMgICBQQVRDSENIRUNLX1NUQVJUID0gNzQ3ZTk0YWUzZDFiNGM5YmY1MzgwZTU2OWY2MTRlYjkwNDBiNzllNworIyAgIFBBVENIQ0hFQ0tfRU5EID0gSEVBRH4yCisjCisjCisjCisjIEZvciBURVNUX1RZUEUgPSBiaXNlY3QKKyMKKyMgIFlvdSBjYW4gc3BlY2lmeSBhIGdpdCBiaXNlY3QgaWYgdGhlIEJVSUxEX0RJUiBpcyBhIGdpdCByZXBvc2l0b3J5LgorIyAgVGhlIE1JTl9DT05GSUcgd2lsbCBiZSB1c2VkIGZvciBhbGwgYnVpbGRzIG9mIHRoZSBiaXNlY3QuIFRoZSBidWlsZCB0eXBlCisjICB1c2VkIGZvciBiaXNlY3RpbmcgaXMgb2xkY29uZmlnLgorIworIyAgVGhlIG9wdGlvbiBCVUlMRF9UWVBFIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgIEJJU0VDVF9UWVBFIGlzIHRoZSB0eXBlIG9mIHRlc3QgdG8gcGVyZm9ybToKKyMJYnVpbGQJLSBiYWQgZmFpbHMgdG8gYnVpbGQKKyMJYm9vdAktIGJhZCBidWlsZHMgYnV0IGZhaWxzIHRvIGJvb3QKKyMJdGVzdAktIGJhZCBib290cyBidXQgZmFpbHMgYSB0ZXN0CisjCisjIEJJU0VDVF9HT09EIGlzIHRoZSBjb21taXQgKFNIQTEpIHRvIGxhYmVsIGFzIGdvb2QgKGFjY2VwdHMgYWxsIGdpdCBnb29kIGNvbW1pdCB0eXBlcykKKyMgQklTRUNUX0JBRCBpcyB0aGUgY29tbWl0IHRvIGxhYmVsIGFzIGJhZCAoYWNjZXB0cyBhbGwgZ2l0IGJhZCBjb21taXQgdHlwZXMpCisjCisjIFRoZSBhYm92ZSB0aHJlZSBvcHRpb25zIGFyZSByZXF1aXJlZCBmb3IgYSBiaXNlY3Qgb3BlcmF0aW9uLgorIworIyBCSVNFQ1RfUkVQTEFZID0gL3BhdGgvdG8vcmVwbGF5L2ZpbGUgKG9wdGlvbmFsLCBkZWZhdWx0IHVuZGVmaW5lZCkKKyMKKyMgICBJZiBhbiBvcGVyYXRpb24gZmFpbGVkIGluIHRoZSBiaXNlY3QgdGhhdCB3YXMgbm90IGV4cGVjdGVkIHRvCisjICAgZmFpbC4gVGhlbiB0aGUgdGVzdCBlbmRzLiBUaGUgc3RhdGUgb2YgdGhlIEJVSUxEX0RJUiB3aWxsIGJlCisjICAgbGVmdCBvZmYgYXQgd2hlcmUgdGhlIGZhaWx1cmUgb2NjdXJyZWQuIFlvdSBjYW4gZXhhbWluZSB0aGUKKyMgICByZWFzb24gZm9yIHRoZSBmYWlsdXJlLCBhbmQgcGVyaGFwcyBldmVuIGZpbmQgYSBnaXQgY29tbWl0CisjICAgdGhhdCB3b3VsZCB3b3JrIHRvIGNvbnRpbnVlIHdpdGguIFlvdSBjYW4gcnVuOgorIworIyAgIGdpdCBiaXNlY3QgbG9nID4gL3BhdGgvdG8vcmVwbGF5L2ZpbGUKKyMKKyMgICBUaGUgYWRkaW5nOgorIworIyAgICBCSVNFQ1RfUkVQTEFZPSAvcGF0aC90by9yZXBsYXkvZmlsZQorIworIyAgIEFuZCBydW5uaW5nIHRoZSB0ZXN0IGFnYWluLiBUaGUgdGVzdCB3aWxsIHBlcmZvcm0gdGhlIGluaXRpYWwKKyMgICAgZ2l0IGJpc2VjdCBzdGFydCwgZ2l0IGJpc2VjdCBnb29kLCBhbmQgZ2l0IGJpc2VjdCBiYWQsIGFuZAorIyAgICB0aGVuIGl0IHdpbGwgcnVuIGdpdCBiaXNlY3QgcmVwbGF5IG9uIHRoaXMgZmlsZSwgYmVmb3JlCisjICAgIGNvbnRpbnVpbmcgd2l0aCB0aGUgYmlzZWN0LgorIworIyBCSVNFQ1RfU1RBUlQgPSBjb21taXQgKG9wdGlvbmFsLCBkZWZhdWx0IHVuZGVmaW5lZCkKKyMKKyMgICBBcyB3aXRoIEJJU0VDVF9SRVBMQVksIGlmIHRoZSB0ZXN0IGZhaWxlZCBvbiBhIGNvbW1pdCB0aGF0CisjICAganVzdCBoYXBwZW4gdG8gaGF2ZSBhIGJhZCBjb21taXQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYmlzZWN0LAorIyAgIGFuZCB5b3UgbmVlZCB0byBza2lwIGl0LiBJZiBCSVNFQ1RfU1RBUlQgaXMgZGVmaW5lZCwgaXQKKyMgICB3aWxsIGNoZWNrb3V0IHRoYXQgY29tbWl0IGFmdGVyIGRvaW5nIHRoZSBpbml0aWFsIGdpdCBiaXNlY3Qgc3RhcnQsCisjICAgZ2l0IGJpc2VjdCBnb29kLCBnaXQgYmlzZWN0IGJhZCwgYW5kIHJ1bm5pbmcgdGhlIGdpdCBiaXNlY3QgcmVwbGF5CisjICAgaWYgdGhlIEJJU0VDVF9SRVBMQVkgaXMgc2V0LgorIworIyBCSVNFQ1RfUkVWRVJTRSA9IDEgKG9wdGlvbmFsLCBkZWZhdWx0IDApCisjCisjICAgSW4gdGhvc2Ugc3RyYW5nZSBpbnN0YW5jZXMgd2hlcmUgaXQgd2FzIGJyb2tlbiBmb3JldmVyCisjICAgYW5kIHlvdSBhcmUgdHJ5aW5nIHRvIGZpbmQgd2hlcmUgaXQgc3RhcnRlZCB0byB3b3JrIQorIyAgIFNldCBCSVNFQ1RfR09PRCB0byB0aGUgY29tbWl0IHRoYXQgd2FzIGxhc3Qga25vd24gdG8gZmFpbAorIyAgIFNldCBCSVNFQ1RfQkFEIHRvIHRoZSBjb21taXQgdGhhdCBpcyBrbm93biB0byBzdGFydCB3b3JraW5nLgorIyAgIFdpdGggQklTRUNUX1JFVkVSU0UgPSAxLCBUaGUgdGVzdCB3aWxsIGNvbnNpZGVyIGZhaWx1cmVzIGFzCisjICAgZ29vZCwgYW5kIHN1Y2Nlc3MgYXMgYmFkLgorIworIyBCSVNFQ1RfQ0hFQ0sgPSAxIChvcHRpb25hbCwgZGVmYXVsdCAwKQorIworIyAgIEp1c3QgdG8gYmUgc3VyZSB0aGUgZ29vZCBpcyBnb29kIGFuZCBiYWQgaXMgYmFkLCBzZXR0aW5nCisjICAgQklTRUNUX0NIRUNLIHRvIDEgd2lsbCBzdGFydCB0aGUgYmlzZWN0IGJ5IGZpcnN0IGNoZWNraW5nCisjICAgb3V0IEJJU0VDVF9CQUQgYW5kIG1ha2VzIHN1cmUgaXQgZmFpbHMsIHRoZW4gaXQgd2lsbCBjaGVjaworIyAgIG91dCBCSVNFQ1RfR09PRCBhbmQgbWFrZXMgc3VyZSBpdCBzdWNjZWVkcyBiZWZvcmUgc3RhcnRpbmcKKyMgICB0aGUgYmlzZWN0IChpdCB3b3JrcyBmb3IgQklTRUNUX1JFVkVSU0UgdG9vKS4KKyMKKyMgICBZb3UgY2FuIGxpbWl0IHRoZSB0ZXN0IHRvIGp1c3QgY2hlY2sgQklTRUNUX0dPT0Qgb3IKKyMgICBCSVNFQ1RfQkFEIHdpdGggQklTRUNUX0NIRUNLID0gZ29vZCBvcgorIyAgIEJJU0VDVF9DSEVDSyA9IGJhZCwgcmVzcGVjdGl2ZWx5LgorIworIyBFeGFtcGxlOgorIyAgIFRFU1RfU1RBUlQKKyMgICBURVNUX1RZUEUgPSBiaXNlY3QKKyMgICBCSVNFQ1RfR09PRCA9IHYyLjYuMzYKKyMgICBCSVNFQ1RfQkFEID0gYjUxNTMxNjNlZDU4MGUwMGM2N2JkZmVjYjAyYjJlMzg0MzgxN2IzZQorIyAgIEJJU0VDVF9UWVBFID0gYnVpbGQKKyMgICBNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctYmlzZWN0CisjCisjCisjCisjIEZvciBURVNUX1RZUEUgPSBjb25maWdfYmlzZWN0CisjCisjICBJbiB0aG9zZSBjYXNlcyB0aGF0IHlvdSBoYXZlIHR3byBkaWZmZXJlbnQgY29uZmlncy4gT25lIG9mIHRoZW0KKyMgIHdvcmssIHRoZSBvdGhlciBkb2VzIG5vdCwgYW5kIHlvdSBkbyBub3Qga25vdyB3aGF0IGNvbmZpZyBjYXVzZXMKKyMgIHRoZSBwcm9ibGVtLgorIyAgVGhlIFRFU1RfVFlQRSBjb25maWdfYmlzZWN0IHdpbGwgYmlzZWN0IHRoZSBiYWQgY29uZmlnIGxvb2tpbmcgZm9yCisjICB3aGF0IGNvbmZpZyBjYXVzZXMgdGhlIGZhaWx1cmUuCisjCisjICBUaGUgd2F5IGl0IHdvcmtzIGlzIHRoaXM6CisjCisjICAgRmlyc3QgaXQgZmluZHMgYSBjb25maWcgdG8gd29yayB3aXRoLiBTaW5jZSBhIGRpZmZlcmVudCB2ZXJzaW9uLCBvcgorIyAgIE1JTl9DT05GSUcgbWF5IGNhdXNlIGRpZmZlcmVudCBkZXBlbmRlY2llcywgaXQgbXVzdCBydW4gdGhyb3VnaCB0aGlzCisjICAgcHJlcGFyYXRpb24uCisjCisjICAgT3ZlcndyaXRlcyBhbnkgY29uZmlnIHNldCBpbiB0aGUgYmFkIGNvbmZpZyB3aXRoIGEgY29uZmlnIHNldCBpbgorIyAgIGVpdGhlciB0aGUgTUlOX0NPTkZJRyBvciBBRERfQ09ORklHLiBUaHVzLCBtYWtlIHN1cmUgdGhlc2UgY29uZmlncworIyAgIGFyZSBtaW5pbWFsIGFuZCBkbyBub3QgZGlzYWJsZSBjb25maWdzIHlvdSB3YW50IHRvIHRlc3Q6CisjICAgKGllLiAgIyBDT05GSUdfRk9PIGlzIG5vdCBzZXQpLgorIworIyAgIEFuIG9sZGNvbmZpZyBpcyBydW4gb24gdGhlIGJhZCBjb25maWcgYW5kIGFueSBuZXcgY29uZmlnIHRoYXQKKyMgICBhcHBlYXJzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgdG8gdGVzdC4KKyMKKyMgICBGaW5hbGx5LCBpdCBnZW5lcmF0ZXMgYSBjb25maWcgd2l0aCB0aGUgYWJvdmUgcmVzdWx0IGFuZCBydW5zIGl0CisjICAgYWdhaW4gdGhyb3VnaCBtYWtlIG9sZGNvbmZpZyB0byBwcm9kdWNlIGEgY29uZmlnIHRoYXQgc2hvdWxkIGJlCisjICAgc2F0aXNmaWVkIGJ5IGtjb25maWcuCisjCisjICAgVGhlbiBpdCBzdGFydHMgdGhlIGJpc2VjdC4KKyMKKyMgICBUaGUgY29uZmlncyB0byB0ZXN0IGFyZSBjdXQgaW4gaGFsZi4gSWYgYWxsIHRoZSBjb25maWdzIGluIHRoaXMKKyMgICBoYWxmIGRlcGVuZCBvbiBhIGNvbmZpZyBpbiB0aGUgb3RoZXIgaGFsZiwgdGhlbiB0aGUgb3RoZXIgaGFsZgorIyAgIGlzIHRlc3RlZCBpbnN0ZWFkLiBJZiBubyBjb25maWdzIGFyZSBlbmFibGVkIGJ5IGVpdGhlciBoYWxmLCB0aGVuCisjICAgdGhpcyBtZWFucyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgZXhpc3RzIGFuZCB0aGUgdGVzdCBmYWlscy4KKyMKKyMgICBBIGNvbmZpZyBpcyBjcmVhdGVkIHdpdGggdGhlIHRlc3QgaGFsZiwgYW5kIHRoZSBiaXNlY3QgdGVzdCBpcyBydW4uCisjCisjICAgSWYgdGhlIGJpc2VjdCBzdWNjZWVkcywgdGhlbiBhbGwgY29uZmlncyBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZworIyAgIGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbmZpZ3MgdG8gdGVzdCBhbmQgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgdGhhdAorIyAgIHdpbGwgYmUgZW5hYmxlZCBmb3IgYWxsIGJ1aWxkcyAodGhleSB3aWxsIGJlIGVuYWJsZWQsIGJ1dCBub3QgYmUgcGFydAorIyAgIG9mIHRoZSBjb25maWdzIHRvIGV4YW1pbmUpLgorIworIyAgIElmIHRoZSBiaXNlY3QgZmFpbHMsIHRoZW4gYWxsIHRlc3QgY29uZmlncyB0aGF0IHdlcmUgbm90IGVuYWJsZWQgYnkKKyMgICB0aGUgY29uZmlnIGZpbGUgYXJlIHJlbW92ZWQgZnJvbSB0aGUgdGVzdC4gVGhlc2UgY29uZmlncyB3aWxsIG5vdAorIyAgIGJlIGVuYWJsZWQgaW4gZnV0dXJlIHRlc3RzLiBTaW5jZSBjdXJyZW50IGNvbmZpZyBmYWlsZWQsIHdlIGNvbnNpZGVyCisjICAgdGhpcyB0byBiZSBhIHN1YnNldCBvZiB0aGUgY29uZmlnIHRoYXQgd2Ugc3RhcnRlZCB3aXRoLgorIworIyAgIFdoZW4gd2UgYXJlIGRvd24gdG8gb25lIGNvbmZpZywgaXQgaXMgY29uc2lkZXJlZCB0aGUgYmFkIGNvbmZpZy4KKyMKKyMgICBOb3RlLCB0aGUgY29uZmlnIGNob3NlbiBtYXkgbm90IGJlIHRoZSB0cnVlIGJhZCBjb25maWcuIER1ZSB0bworIyAgIGRlcGVuZGVuY2llcyBhbmQgc2VsZWN0aW9ucyBvZiB0aGUga2J1aWxkIHN5c3RlbSwgbXVsaXRwbGUKKyMgICBjb25maWdzIG1heSBiZSBuZWVkZWQgdG8gY2F1c2UgYSBmYWlsdXJlLiBJZiB5b3UgZGlzYWJsZSB0aGUKKyMgICBjb25maWcgdGhhdCB3YXMgZm91bmQgYW5kIHJlc3RhcnQgdGhlIHRlc3QsIGlmIHRoZSB0ZXN0IGZhaWxzCisjICAgYWdhaW4sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHJlcnVuIHRoZSBjb25maWdfYmlzZWN0IHdpdGggYSBuZXcKKyMgICBiYWQgY29uZmlnIHdpdGhvdXQgdGhlIGZvdW5kIGNvbmZpZyBlbmFibGVkLgorIworIyAgVGhlIG9wdGlvbiBCVUlMRF9UWVBFIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgIENPTkZJR19CSVNFQ1RfVFlQRSBpcyB0aGUgdHlwZSBvZiB0ZXN0IHRvIHBlcmZvcm06CisjCWJ1aWxkCS0gYmFkIGZhaWxzIHRvIGJ1aWxkCisjCWJvb3QJLSBiYWQgYnVpbGRzIGJ1dCBmYWlscyB0byBib290CisjCXRlc3QJLSBiYWQgYm9vdHMgYnV0IGZhaWxzIGEgdGVzdAorIworIyAgIENPTkZJR19CSVNFQ1QgaXMgdGhlIGNvbmZpZyB0aGF0IGZhaWxlZCB0byBib290CisjCisjIEV4YW1wbGU6CisjICAgVEVTVF9TVEFSVAorIyAgIFRFU1RfVFlQRSA9IGNvbmZpZ19iaXNlY3QKKyMgICBDT05GSUdfQklTRUNUX1RZUEUgPSBidWlsZAorIyAgIENPTkZJR19CSVNFQ1QgPSAvaG9tZS90ZXN0L6JvbmZpZy1iYWQKKyMgICBNSU5fQ09ORklHID0gL2hvbWUvdGVzdC9jb25maWctbWluCisjCmRpZmYgLS1naXQgYS91c3IvS2NvbmZpZyBiL3Vzci9LY29uZmlnCmluZGV4IGMyYzdmZTIuLjQ3ODBkZWEgMTAwNjQ0Ci0tLSBhL3Vzci9LY29uZmlnCisrKyBiL3Vzci9LY29uZmlnCkBAIC03Miw2ICs3MiwxNSBAQAogCSAgU3VwcG9ydCBsb2FkaW5nIG9mIGEgTFpNQSBlbmNvZGVkIGluaXRpYWwgcmFtZGlzayBvciBjcGlvIGJ1ZmZlcgogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFJEX1haCisJYm9vbCAiU3VwcG9ydCBpbml0aWFsIHJhbWRpc2tzIGNvbXByZXNzZWQgdXNpbmcgWFoiIGlmIEVNQkVEREVECisJZGVmYXVsdCAhRU1CRURERUQKKwlkZXBlbmRzIG9uIEJMS19ERVZfSU5JVFJECisJc2VsZWN0IERFQ09NUFJFU1NfWFoKKwloZWxwCisJICBTdXBwb3J0IGxvYWRpbmcgb2YgYSBYWiBlbmNvZGVkIGluaXRpYWwgcmFtZGlzayBvciBjcGlvIGJ1ZmZlci4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBSRF9MWk8KIAlib29sICJTdXBwb3J0IGluaXRpYWwgcmFtZGlza3MgY29tcHJlc3NlZCB1c2luZyBMWk8iIGlmIEVNQkVEREVECiAJZGVmYXVsdCAhRU1CRURERUQKQEAgLTEzOSw2ICsxNDgsMTUgQEAKIAkgIHRocmVlLiBDb21wcmVzc2lvbiBpcyBzbG93ZXN0LiBUaGUgaW5pdHJhbWZzIHNpemUgaXMgYWJvdXQgMzMlCiAJICBzbWFsbGVyIHdpdGggTFpNQSBpbiBjb21wYXJpc29uIHRvIGd6aXAuCiAKK2NvbmZpZyBJTklUUkFNRlNfQ09NUFJFU1NJT05fWFoKKwlib29sICJYWiIKKwlkZXBlbmRzIG9uIFJEX1haCisJaGVscAorCSAgWFogdXNlcyB0aGUgTFpNQTIgYWxnb3JpdGhtLiBUaGUgaW5pdHJhbWZzIHNpemUgaXMgYWJvdXQgMzAlCisJICBzbWFsbGVyIHdpdGggWFogaW4gY29tcGFyaXNvbiB0byBnemlwLiBEZWNvbXByZXNzaW9uIHNwZWVkCisJICBpcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIGJ6aXAyIGJ1dCB3b3JzZSB0aGFuIGd6aXAgYW5kIExaTy4KKwkgIENvbXByZXNzaW9uIGlzIHNsb3cuCisKIGNvbmZpZyBJTklUUkFNRlNfQ09NUFJFU1NJT05fTFpPCiAJYm9vbCAiTFpPIgogCWRlcGVuZHMgb24gUkRfTFpPCmRpZmYgLS1naXQgYS91c3IvTWFrZWZpbGUgYi91c3IvTWFrZWZpbGUKaW5kZXggNmZhYTQ0NC4uMDI5ZmZlNiAxMDA2NDQKLS0tIGEvdXNyL01ha2VmaWxlCisrKyBiL3Vzci9NYWtlZmlsZQpAQCAtMTUsNiArMTUsOSBAQAogIyBMem1hCiBzdWZmaXhfJChDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX0xaTUEpICAgPSAubHptYQogCisjIFhaCitzdWZmaXhfJChDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX1haKSAgICAgPSAueHoKKwogIyBMem8KIHN1ZmZpeF8kKENPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTFpPKSAgID0gLmx6bwogCkBAIC01MCw3ICs1Myw3IEBACiBxdWlldF9jbWRfaW5pdGZzID0gR0VOICAgICAkQAogICAgICAgY21kX2luaXRmcyA9ICQoaW5pdHJhbWZzKSAtbyAkQCAkKHJhbWZzLWFyZ3MpICQocmFtZnMtaW5wdXQpCiAKLXRhcmdldHMgOj0gaW5pdHJhbWZzX2RhdGEuY3Bpby5neiBpbml0cmFtZnNfZGF0YS5jcGlvLmJ6MiBpbml0cmFtZnNfZGF0YS5jcGlvLmx6bWEgaW5pdHJhbWZzX2RhdGEuY3Bpby5sem8gaW5pdHJhbWZzX2RhdGEuY3BpbwordGFyZ2V0cyA6PSBpbml0cmFtZnNfZGF0YS5jcGlvLmd6IGluaXRyYW1mc19kYXRhLmNwaW8uYnoyIGluaXRyYW1mc19kYXRhLmNwaW8ubHptYSBpbml0cmFtZnNfZGF0YS5jcGlvLnh6IGluaXRyYW1mc19kYXRhLmNwaW8ubHpvIGluaXRyYW1mc19kYXRhLmNwaW8KICMgZG8gbm90IHRyeSB0byB1cGRhdGUgZmlsZXMgaW5jbHVkZWQgaW4gaW5pdHJhbWZzCiAkKGRlcHNfaW5pdHJhbWZzKTogOwogCmRpZmYgLS1naXQgYS91c3IvZ2VuX2luaXRfY3Bpby5jIGIvdXNyL2dlbl9pbml0X2NwaW8uYwppbmRleCBiMmIzYzJkLi43ZjA2ODg0IDEwMDY0NAotLS0gYS91c3IvZ2VuX2luaXRfY3Bpby5jCisrKyBiL3Vzci9nZW5faW5pdF9jcGlvLmMKQEAgLTEwNCw2ICsxMDQsOCBAQAogCWNoYXIgc1syNTZdOwogCXRpbWVfdCBtdGltZSA9IHRpbWUoTlVMTCk7CiAKKwlpZiAobmFtZVswXSA9PSAnLycpCisJCW5hbWUrKzsKIAlzcHJpbnRmKHMsIiVzJTA4WCUwOFglMDhsWCUwOGxYJTA4WCUwOGxYIgogCSAgICAgICAiJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCIsCiAJCSIwNzA3MDEiLAkJLyogbWFnaWMgKi8KQEAgLTE1Miw2ICsxNTQsOCBAQAogCWNoYXIgc1syNTZdOwogCXRpbWVfdCBtdGltZSA9IHRpbWUoTlVMTCk7CiAKKwlpZiAobmFtZVswXSA9PSAnLycpCisJCW5hbWUrKzsKIAlzcHJpbnRmKHMsIiVzJTA4WCUwOFglMDhsWCUwOGxYJTA4WCUwOGxYIgogCSAgICAgICAiJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCIsCiAJCSIwNzA3MDEiLAkJLyogbWFnaWMgKi8KQEAgLTI0NSw2ICsyNDksOCBAQAogCWVsc2UKIAkJbW9kZSB8PSBTX0lGQ0hSOwogCisJaWYgKG5hbWVbMF0gPT0gJy8nKQorCQluYW1lKys7CiAJc3ByaW50ZihzLCIlcyUwOFglMDhYJTA4bFglMDhsWCUwOFglMDhsWCIKIAkgICAgICAgIiUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiLAogCQkiMDcwNzAxIiwJCS8qIG1hZ2ljICovCkBAIC0zMDMsMTggKzMwOSwxOCBAQAogCiAJbW9kZSB8PSBTX0lGUkVHOwogCi0JcmV0dmFsID0gc3RhdCAobG9jYXRpb24sICZidWYpOwotCWlmIChyZXR2YWwpIHsKLQkJZnByaW50ZiAoc3RkZXJyLCAiRmlsZSAlcyBjb3VsZCBub3QgYmUgbG9jYXRlZFxuIiwgbG9jYXRpb24pOwotCQlnb3RvIGVycm9yOwotCX0KLQogCWZpbGUgPSBvcGVuIChsb2NhdGlvbiwgT19SRE9OTFkpOwogCWlmIChmaWxlIDwgMCkgewogCQlmcHJpbnRmIChzdGRlcnIsICJGaWxlICVzIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmdcbiIsIGxvY2F0aW9uKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlyZXR2YWwgPSBmc3RhdChmaWxlLCAmYnVmKTsKKwlpZiAocmV0dmFsKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBjb3VsZCBub3QgYmUgc3RhdCgpJ2VkXG4iLCBsb2NhdGlvbik7CisJCWdvdG8gZXJyb3I7CisJfQorCiAJZmlsZWJ1ZiA9IG1hbGxvYyhidWYuc3Rfc2l6ZSk7CiAJaWYgKCFmaWxlYnVmKSB7CiAJCWZwcmludGYgKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOwpAQCAtMzMyLDYgKzMzOCw4IEBACiAJCS8qIGRhdGEgZ29lcyBvbiBsYXN0IGxpbmsgKi8KIAkJaWYgKGkgPT0gbmxpbmtzKSBzaXplID0gYnVmLnN0X3NpemU7CiAKKwkJaWYgKG5hbWVbMF0gPT0gJy8nKQorCQkJbmFtZSsrOwogCQluYW1lc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7CiAJCXNwcmludGYocywiJXMlMDhYJTA4WCUwOGxYJTA4bFglMDhYJTA4bFgiCiAJCSAgICAgICAiJTA4bFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiLApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vS2NvbmZpZyBiL3ZpcnQva3ZtL0tjb25maWcKaW5kZXggN2YxMTc4Zi4uZjYzY2NiMCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vS2NvbmZpZworKysgYi92aXJ0L2t2bS9LY29uZmlnCkBAIC0xNSwzICsxNSw2IEBACiAKIGNvbmZpZyBLVk1fTU1JTwogICAgICAgIGJvb2wKKworY29uZmlnIEtWTV9BU1lOQ19QRgorICAgICAgIGJvb2wKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jIGIvdmlydC9rdm0vYXNzaWduZWQtZGV2LmMKaW5kZXggN2M5ODkyOC4uYWU3MmFlNjAgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCisrKyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCkBAIC01NSw1OCArNTUsMzEgQEAKIAlyZXR1cm4gaW5kZXg7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bV9hc3NpZ25lZF9kZXZfaW50ZXJydXB0X3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgaXJxcmV0dXJuX3Qga3ZtX2Fzc2lnbmVkX2Rldl90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYXNzaWduZWRfZGV2OwotCWludCBpOworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYXNzaWduZWRfZGV2ID0gZGV2X2lkOworCXUzMiB2ZWN0b3I7CisJaW50IGluZGV4OwogCi0JYXNzaWduZWRfZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCwKLQkJCQkgICAgaW50ZXJydXB0X3dvcmspOworCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCkgeworCQlzcGluX2xvY2soJmFzc2lnbmVkX2Rldi0+aW50eF9sb2NrKTsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJCWFzc2lnbmVkX2Rldi0+aG9zdF9pcnFfZGlzYWJsZWQgPSB0cnVlOworCQlzcGluX3VubG9jaygmYXNzaWduZWRfZGV2LT5pbnR4X2xvY2spOworCX0KIAotCXNwaW5fbG9ja19pcnEoJmFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2xvY2spOwogCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfTVNJWCkgewotCQlzdHJ1Y3Qga3ZtX2d1ZXN0X21zaXhfZW50cnkgKmd1ZXN0X2VudHJpZXMgPQotCQkJYXNzaWduZWRfZGV2LT5ndWVzdF9tc2l4X2VudHJpZXM7Ci0JCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykgewotCQkJaWYgKCEoZ3Vlc3RfZW50cmllc1tpXS5mbGFncyAmCi0JCQkJCUtWTV9BU1NJR05FRF9NU0lYX1BFTkRJTkcpKQotCQkJCWNvbnRpbnVlOwotCQkJZ3Vlc3RfZW50cmllc1tpXS5mbGFncyAmPSB+S1ZNX0FTU0lHTkVEX01TSVhfUEVORElORzsKKwkJaW5kZXggPSBmaW5kX2luZGV4X2Zyb21faG9zdF9pcnEoYXNzaWduZWRfZGV2LCBpcnEpOworCQlpZiAoaW5kZXggPj0gMCkgeworCQkJdmVjdG9yID0gYXNzaWduZWRfZGV2LT4KKwkJCQkJZ3Vlc3RfbXNpeF9lbnRyaWVzW2luZGV4XS52ZWN0b3I7CiAJCQlrdm1fc2V0X2lycShhc3NpZ25lZF9kZXYtPmt2bSwKLQkJCQkgICAgYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkLAotCQkJCSAgICBndWVzdF9lbnRyaWVzW2ldLnZlY3RvciwgMSk7CisJCQkJICAgIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwgdmVjdG9yLCAxKTsKIAkJfQogCX0gZWxzZQogCQlrdm1fc2V0X2lycShhc3NpZ25lZF9kZXYtPmt2bSwgYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkLAogCQkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAxKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmYXNzaWduZWRfZGV2LT5hc3NpZ25lZF9kZXZfbG9jayk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBrdm1fYXNzaWduZWRfZGV2X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYgPQotCQkoc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICopIGRldl9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhc3NpZ25lZF9kZXYtPmFzc2lnbmVkX2Rldl9sb2NrLCBmbGFncyk7Ci0JaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYKSB7Ci0JCWludCBpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlnb3RvIG91dDsKLQkJYXNzaWduZWRfZGV2LT5ndWVzdF9tc2l4X2VudHJpZXNbaW5kZXhdLmZsYWdzIHw9Ci0JCQlLVk1fQVNTSUdORURfTVNJWF9QRU5ESU5HOwotCX0KLQotCXNjaGVkdWxlX3dvcmsoJmFzc2lnbmVkX2Rldi0+aW50ZXJydXB0X3dvcmspOwotCi0JaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfR1VFU1RfSU5UWCkgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJYXNzaWduZWRfZGV2LT5ob3N0X2lycV9kaXNhYmxlZCA9IHRydWU7Ci0JfQotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNzaWduZWRfZGV2LT5hc3NpZ25lZF9kZXZfbG9jaywgZmxhZ3MpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTE0LDcgKzg3LDYgQEAKIHN0YXRpYyB2b2lkIGt2bV9hc3NpZ25lZF9kZXZfYWNrX2lycShzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW4pCiB7CiAJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChraWFuLT5nc2kgPT0gLTEpCiAJCXJldHVybjsKQEAgLTEyNywxMiArOTksMTIgQEAKIAkvKiBUaGUgZ3Vlc3QgaXJxIG1heSBiZSBzaGFyZWQgc28gdGhpcyBhY2sgbWF5IGJlCiAJICogZnJvbSBhbm90aGVyIGRldmljZS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5hc3NpZ25lZF9kZXZfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZGV2LT5pbnR4X2xvY2spOwogCWlmIChkZXYtPmhvc3RfaXJxX2Rpc2FibGVkKSB7CiAJCWVuYWJsZV9pcnEoZGV2LT5ob3N0X2lycSk7CiAJCWRldi0+aG9zdF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5hc3NpZ25lZF9kZXZfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZkZXYtPmludHhfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlYXNzaWduX2d1ZXN0X2lycShzdHJ1Y3Qga3ZtICprdm0sCkBAIC0xNDEsNiArMTEzLDkgQEAKIAlrdm1fdW5yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKGt2bSwgJmFzc2lnbmVkX2Rldi0+YWNrX25vdGlmaWVyKTsKIAlhc3NpZ25lZF9kZXYtPmFja19ub3RpZmllci5nc2kgPSAtMTsKIAorCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLCBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsCisJCSAgICBhc3NpZ25lZF9kZXYtPmd1ZXN0X2lycSwgMCk7CisKIAlpZiAoYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkICE9IC0xKQogCQlrdm1fZnJlZV9pcnFfc291cmNlX2lkKGt2bSwgYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkKTsKIAlhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQgPSAtMTsKQEAgLTE1MiwyOCArMTI3LDE5IEBACiAJCQkgICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldikKIHsKIAkvKgotCSAqIEluIGt2bV9mcmVlX2RldmljZV9pcnEsIGNhbmNlbF93b3JrX3N5bmMgcmV0dXJuIHRydWUgaWY6Ci0JICogMS4gd29yayBpcyBzY2hlZHVsZWQsIGFuZCB0aGVuIGNhbmNlbGxlZC4KLQkgKiAyLiB3b3JrIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgotCSAqCi0JICogVGhlIGZpcnN0IG9uZSBlbnN1cmVkIHRoYXQgdGhlIGlycSBpcyBkaXNhYmxlZCBhbmQgbm8gbW9yZSBldmVudHMKLQkgKiB3b3VsZCBoYXBwZW4uIEJ1dCBmb3IgdGhlIHNlY29uZCBvbmUsIHRoZSBpcnEgbWF5IGJlIGVuYWJsZWQgKGUuZy4KLQkgKiBmb3IgTVNJKS4gU28gd2UgZGlzYWJsZSBpcnEgaGVyZSB0byBwcmV2ZW50IGZ1cnRoZXIgZXZlbnRzLgorCSAqIFdlIGRpc2FibGUgaXJxIGhlcmUgdG8gcHJldmVudCBmdXJ0aGVyIGV2ZW50cy4KIAkgKgogCSAqIE5vdGljZSB0aGlzIG1heWJlIHJlc3VsdCBpbiBuZXN0ZWQgZGlzYWJsZSBpZiB0aGUgaW50ZXJydXB0IHR5cGUgaXMKIAkgKiBJTlR4LCBidXQgaXQncyBPSyBmb3Igd2UgYXJlIGdvaW5nIHRvIGZyZWUgaXQuCiAJICoKIAkgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGEgcGFydCBvZiBWTSBkZXN0cm95LCBwbGVhc2UgZW5zdXJlIHRoYXQgdGlsbAogCSAqIG5vdywgdGhlIGt2bSBzdGF0ZSBpcyBzdGlsbCBsZWdhbCBmb3IgcHJvYmFibHkgd2UgYWxzbyBoYXZlIHRvIHdhaXQKLQkgKiBpbnRlcnJ1cHRfd29yayBkb25lLgorCSAqIG9uIGEgY3VycmVudGx5IHJ1bm5pbmcgSVJRIGhhbmRsZXIuCiAJICovCiAJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYKSB7CiAJCWludCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgYXNzaWduZWRfZGV2LT5lbnRyaWVzX25yOyBpKyspCi0JCQlkaXNhYmxlX2lycV9ub3N5bmMoYXNzaWduZWRfZGV2LT4KLQkJCQkJICAgaG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKLQotCQljYW5jZWxfd29ya19zeW5jKCZhc3NpZ25lZF9kZXYtPmludGVycnVwdF93b3JrKTsKKwkJCWRpc2FibGVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgYXNzaWduZWRfZGV2LT5lbnRyaWVzX25yOyBpKyspCiAJCQlmcmVlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfbXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKQEAgLTE4NSw4ICsxNTEsNyBAQAogCQlwY2lfZGlzYWJsZV9tc2l4KGFzc2lnbmVkX2Rldi0+ZGV2KTsKIAl9IGVsc2UgewogCQkvKiBEZWFsIHdpdGggTVNJIGFuZCBJTlR4ICovCi0JCWRpc2FibGVfaXJxX25vc3luYyhhc3NpZ25lZF9kZXYtPmhvc3RfaXJxKTsKLQkJY2FuY2VsX3dvcmtfc3luYygmYXNzaWduZWRfZGV2LT5pbnRlcnJ1cHRfd29yayk7CisJCWRpc2FibGVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9pcnEpOwogCiAJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9pcnEsICh2b2lkICopYXNzaWduZWRfZGV2KTsKIApAQCAtMjMyLDcgKzE5Nyw4IEBACiB7CiAJa3ZtX2ZyZWVfYXNzaWduZWRfaXJxKGt2bSwgYXNzaWduZWRfZGV2KTsKIAotCXBjaV9yZXNldF9mdW5jdGlvbihhc3NpZ25lZF9kZXYtPmRldik7CisJX19wY2lfcmVzZXRfZnVuY3Rpb24oYXNzaWduZWRfZGV2LT5kZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlKGFzc2lnbmVkX2Rldi0+ZGV2KTsKIAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoYXNzaWduZWRfZGV2LT5kZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShhc3NpZ25lZF9kZXYtPmRldik7CkBAIC0yNjUsOCArMjMxLDggQEAKIAkgKiBvbiB0aGUgc2FtZSBpbnRlcnJ1cHQgbGluZSBpcyBub3QgYSBoYXBweSBzaXR1YXRpb246IHRoZXJlCiAJICogYXJlIGdvaW5nIHRvIGJlIGxvbmcgZGVsYXlzIGluIGFjY2VwdGluZywgYWNraW5nLCBldGMuCiAJICovCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aG9zdF9pcnEsIGt2bV9hc3NpZ25lZF9kZXZfaW50ciwKLQkJCTAsICJrdm1fYXNzaWduZWRfaW50eF9kZXZpY2UiLCAodm9pZCAqKWRldikpCisJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAorCQkJCSBJUlFGX09ORVNIT1QsIGRldi0+aXJxX25hbWUsICh2b2lkICopZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC0yODQsOCArMjUwLDggQEAKIAl9CiAKIAlkZXYtPmhvc3RfaXJxID0gZGV2LT5kZXYtPmlycTsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5ob3N0X2lycSwga3ZtX2Fzc2lnbmVkX2Rldl9pbnRyLCAwLAotCQkJImt2bV9hc3NpZ25lZF9tc2lfZGV2aWNlIiwgKHZvaWQgKilkZXYpKSB7CisJaWYgKHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9pcnEsIE5VTEwsIGt2bV9hc3NpZ25lZF9kZXZfdGhyZWFkLAorCQkJCSAwLCBkZXYtPmlycV9uYW1lLCAodm9pZCAqKWRldikpIHsKIAkJcGNpX2Rpc2FibGVfbXNpKGRldi0+ZGV2KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzEwLDEwICsyNzYsOSBAQAogCQlyZXR1cm4gcjsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmVudHJpZXNfbnI7IGkrKykgewotCQlyID0gcmVxdWVzdF9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJa3ZtX2Fzc2lnbmVkX2Rldl9pbnRyLCAwLAotCQkJCSJrdm1fYXNzaWduZWRfbXNpeF9kZXZpY2UiLAotCQkJCSh2b2lkICopZGV2KTsKKwkJciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGRldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkgTlVMTCwga3ZtX2Fzc2lnbmVkX2Rldl90aHJlYWQsCisJCQkJCSAwLCBkZXYtPmlycV9uYW1lLCAodm9pZCAqKWRldik7CiAJCWlmIChyKQogCQkJZ290byBlcnI7CiAJfQpAQCAtMzcwLDYgKzMzNSw5IEBACiAJaWYgKGRldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NQVNLKQogCQlyZXR1cm4gcjsKIAorCXNucHJpbnRmKGRldi0+aXJxX25hbWUsIHNpemVvZihkZXYtPmlycV9uYW1lKSwgImt2bTolcyIsCisJCSBwY2lfbmFtZShkZXYtPmRldikpOworCiAJc3dpdGNoIChob3N0X2lycV90eXBlKSB7CiAJY2FzZSBLVk1fREVWX0lSUV9IT1NUX0lOVFg6CiAJCXIgPSBhc3NpZ25lZF9kZXZpY2VfZW5hYmxlX2hvc3RfaW50eChrdm0sIGRldik7CkBAIC01NDcsNiArNTE1LDcgQEAKIAl9CiAKIAlwY2lfcmVzZXRfZnVuY3Rpb24oZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCiAJbWF0Y2gtPmFzc2lnbmVkX2Rldl9pZCA9IGFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2lkOwogCW1hdGNoLT5ob3N0X3NlZ25yID0gYXNzaWduZWRfZGV2LT5zZWducjsKQEAgLTU1NCwxMiArNTIzLDEwIEBACiAJbWF0Y2gtPmhvc3RfZGV2Zm4gPSBhc3NpZ25lZF9kZXYtPmRldmZuOwogCW1hdGNoLT5mbGFncyA9IGFzc2lnbmVkX2Rldi0+ZmxhZ3M7CiAJbWF0Y2gtPmRldiA9IGRldjsKLQlzcGluX2xvY2tfaW5pdCgmbWF0Y2gtPmFzc2lnbmVkX2Rldl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbWF0Y2gtPmludHhfbG9jayk7CiAJbWF0Y2gtPmlycV9zb3VyY2VfaWQgPSAtMTsKIAltYXRjaC0+a3ZtID0ga3ZtOwogCW1hdGNoLT5hY2tfbm90aWZpZXIuaXJxX2Fja2VkID0ga3ZtX2Fzc2lnbmVkX2Rldl9hY2tfaXJxOwotCUlOSVRfV09SSygmbWF0Y2gtPmludGVycnVwdF93b3JrLAotCQkgIGt2bV9hc3NpZ25lZF9kZXZfaW50ZXJydXB0X3dvcmtfaGFuZGxlcik7CiAKIAlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQpOwogCkBAIC01NzksNiArNTQ2LDcgQEAKIAltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiAJcmV0dXJuIHI7CiBvdXRfbGlzdF9kZWw6CisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAlsaXN0X2RlbCgmbWF0Y2gtPmxpc3QpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKIG91dF9kaXNhYmxlOgpAQCAtNjUxLDkgKzYxOSw5IEBACiAJCQlyID0gLUVOT01FTTsKIAkJCWdvdG8gbXNpeF9ucl9vdXQ7CiAJCX0KLQkJYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzID0ga3phbGxvYygKLQkJCQlzaXplb2Yoc3RydWN0IGt2bV9ndWVzdF9tc2l4X2VudHJ5KSAqCi0JCQkJZW50cnlfbnItPmVudHJ5X25yLCBHRlBfS0VSTkVMKTsKKwkJYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzID0KKwkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSAqIGVudHJ5X25yLT5lbnRyeV9uciwKKwkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKCFhZGV2LT5ndWVzdF9tc2l4X2VudHJpZXMpIHsKIAkJCWtmcmVlKGFkZXYtPmhvc3RfbXNpeF9lbnRyaWVzKTsKIAkJCXIgPSAtRU5PTUVNOwpAQCAtNzA2LDcgKzY3NCw3IEBACiAJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgciA9IC1FTk9UVFk7CisJaW50IHI7CiAKIAlzd2l0Y2ggKGlvY3RsKSB7CiAJY2FzZSBLVk1fQVNTSUdOX1BDSV9ERVZJQ0U6IHsKQEAgLTcyNCw3ICs2OTIsNiBAQAogCQlyID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwogCX0KLSNpZmRlZiBLVk1fQ0FQX0FTU0lHTl9ERVZfSVJRCiAJY2FzZSBLVk1fQVNTSUdOX0RFVl9JUlE6IHsKIAkJc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgYXNzaWduZWRfaXJxOwogCkBAIC03NDcsOCArNzE0LDYgQEAKIAkJCWdvdG8gb3V0OwogCQlicmVhazsKIAl9Ci0jZW5kaWYKLSNpZmRlZiBLVk1fQ0FQX0RFVklDRV9ERUFTU0lHTk1FTlQKIAljYXNlIEtWTV9ERUFTU0lHTl9QQ0lfREVWSUNFOiB7CiAJCXN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiBhc3NpZ25lZF9kZXY7CiAKQEAgLTc2MCw3ICs3MjUsNiBAQAogCQkJZ290byBvdXQ7CiAJCWJyZWFrOwogCX0KLSNlbmRpZgogI2lmZGVmIEtWTV9DQVBfSVJRX1JPVVRJTkcKIAljYXNlIEtWTV9TRVRfR1NJX1JPVVRJTkc6IHsKIAkJc3RydWN0IGt2bV9pcnFfcm91dGluZyByb3V0aW5nOwpAQCAtODEzLDYgKzc3Nyw5IEBACiAJCWJyZWFrOwogCX0KICNlbmRpZgorCWRlZmF1bHQ6CisJCXIgPSAtRU5PVFRZOworCQlicmVhazsKIAl9CiBvdXQ6CiAJcmV0dXJuIHI7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hc3luY19wZi5jIGIvdmlydC9rdm0vYXN5bmNfcGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI2OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdmlydC9rdm0vYXN5bmNfcGYuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIGt2bSBhc3luY2hyb25vdXMgZmF1bHQgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6CisgKiAgICAgIEdsZWIgTmF0YXBvdiA8Z2xlYkByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tdV9jb250ZXh0Lmg+CisKKyNpbmNsdWRlICJhc3luY19wZi5oIgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rdm0uaD4KKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICphc3luY19wZl9jYWNoZTsKKworaW50IGt2bV9hc3luY19wZl9pbml0KHZvaWQpCit7CisJYXN5bmNfcGZfY2FjaGUgPSBLTUVNX0NBQ0hFKGt2bV9hc3luY19wZiwgMCk7CisKKwlpZiAoIWFzeW5jX3BmX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCit2b2lkIGt2bV9hc3luY19wZl9kZWluaXQodm9pZCkKK3sKKwlpZiAoYXN5bmNfcGZfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShhc3luY19wZl9jYWNoZSk7CisJYXN5bmNfcGZfY2FjaGUgPSBOVUxMOworfQorCit2b2lkIGt2bV9hc3luY19wZl92Y3B1X2luaXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCUlOSVRfTElTVF9IRUFEKCZ2Y3B1LT5hc3luY19wZi5kb25lKTsKKwlJTklUX0xJU1RfSEVBRCgmdmNwdS0+YXN5bmNfcGYucXVldWUpOworCXNwaW5fbG9ja19pbml0KCZ2Y3B1LT5hc3luY19wZi5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYXN5bmNfcGZfZXhlY3V0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCBrdm1fYXN5bmNfcGYgKmFwZiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3ZtX2FzeW5jX3BmLCB3b3JrKTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGFwZi0+bW07CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gYXBmLT52Y3B1OworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGFwZi0+YWRkcjsKKwlndmFfdCBndmEgPSBhcGYtPmd2YTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwl1c2VfbW0obW0pOworCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBtbSwgYWRkciwgMSwgMSwgMCwgJnBhZ2UsIE5VTEwpOworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdW51c2VfbW0obW0pOworCisJc3Bpbl9sb2NrKCZ2Y3B1LT5hc3luY19wZi5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZhcGYtPmxpbmssICZ2Y3B1LT5hc3luY19wZi5kb25lKTsKKwlhcGYtPnBhZ2UgPSBwYWdlOworCWFwZi0+ZG9uZSA9IHRydWU7CisJc3Bpbl91bmxvY2soJnZjcHUtPmFzeW5jX3BmLmxvY2spOworCisJLyoKKwkgKiBhcGYgbWF5IGJlIGZyZWVkIGJ5IGt2bV9jaGVja19hc3luY19wZl9jb21wbGV0aW9uKCkgYWZ0ZXIKKwkgKiB0aGlzIHBvaW50CisJICovCisKKwl0cmFjZV9rdm1fYXN5bmNfcGZfY29tcGxldGVkKGFkZHIsIHBhZ2UsIGd2YSk7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdS0+d3EpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZjcHUtPndxKTsKKworCW1tZHJvcChtbSk7CisJa3ZtX3B1dF9rdm0odmNwdS0+a3ZtKTsKK30KKwordm9pZCBrdm1fY2xlYXJfYXN5bmNfcGZfY29tcGxldGlvbl9xdWV1ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogY2FuY2VsIG91dHN0YW5kaW5nIHdvcmsgcXVldWUgaXRlbSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmdmNwdS0+YXN5bmNfcGYucXVldWUpKSB7CisJCXN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmsgPQorCQkJbGlzdF9lbnRyeSh2Y3B1LT5hc3luY19wZi5xdWV1ZS5uZXh0LAorCQkJCSAgIHR5cGVvZigqd29yayksIHF1ZXVlKTsKKwkJY2FuY2VsX3dvcmtfc3luYygmd29yay0+d29yayk7CisJCWxpc3RfZGVsKCZ3b3JrLT5xdWV1ZSk7CisJCWlmICghd29yay0+ZG9uZSkgLyogd29yayB3YXMgY2FuY2VsZWQgKi8KKwkJCWttZW1fY2FjaGVfZnJlZShhc3luY19wZl9jYWNoZSwgd29yayk7CisJfQorCisJc3Bpbl9sb2NrKCZ2Y3B1LT5hc3luY19wZi5sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnZjcHUtPmFzeW5jX3BmLmRvbmUpKSB7CisJCXN0cnVjdCBrdm1fYXN5bmNfcGYgKndvcmsgPQorCQkJbGlzdF9lbnRyeSh2Y3B1LT5hc3luY19wZi5kb25lLm5leHQsCisJCQkJICAgdHlwZW9mKCp3b3JrKSwgbGluayk7CisJCWxpc3RfZGVsKCZ3b3JrLT5saW5rKTsKKwkJaWYgKHdvcmstPnBhZ2UpCisJCQlwdXRfcGFnZSh3b3JrLT5wYWdlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGFzeW5jX3BmX2NhY2hlLCB3b3JrKTsKKwl9CisJc3Bpbl91bmxvY2soJnZjcHUtPmFzeW5jX3BmLmxvY2spOworCisJdmNwdS0+YXN5bmNfcGYucXVldWVkID0gMDsKK30KKwordm9pZCBrdm1fY2hlY2tfYXN5bmNfcGZfY29tcGxldGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9hc3luY19wZiAqd29yazsKKworCXdoaWxlICghbGlzdF9lbXB0eV9jYXJlZnVsKCZ2Y3B1LT5hc3luY19wZi5kb25lKSAmJgorCSAgICAgIGt2bV9hcmNoX2Nhbl9pbmplY3RfYXN5bmNfcGFnZV9wcmVzZW50KHZjcHUpKSB7CisJCXNwaW5fbG9jaygmdmNwdS0+YXN5bmNfcGYubG9jayk7CisJCXdvcmsgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2Y3B1LT5hc3luY19wZi5kb25lLCB0eXBlb2YoKndvcmspLAorCQkJCQkgICAgICBsaW5rKTsKKwkJbGlzdF9kZWwoJndvcmstPmxpbmspOworCQlzcGluX3VubG9jaygmdmNwdS0+YXN5bmNfcGYubG9jayk7CisKKwkJaWYgKHdvcmstPnBhZ2UpCisJCQlrdm1fYXJjaF9hc3luY19wYWdlX3JlYWR5KHZjcHUsIHdvcmspOworCQlrdm1fYXJjaF9hc3luY19wYWdlX3ByZXNlbnQodmNwdSwgd29yayk7CisKKwkJbGlzdF9kZWwoJndvcmstPnF1ZXVlKTsKKwkJdmNwdS0+YXN5bmNfcGYucXVldWVkLS07CisJCWlmICh3b3JrLT5wYWdlKQorCQkJcHV0X3BhZ2Uod29yay0+cGFnZSk7CisJCWttZW1fY2FjaGVfZnJlZShhc3luY19wZl9jYWNoZSwgd29yayk7CisJfQorfQorCitpbnQga3ZtX3NldHVwX2FzeW5jX3BmKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgZ3ZhLCBnZm5fdCBnZm4sCisJCSAgICAgICBzdHJ1Y3Qga3ZtX2FyY2hfYXN5bmNfcGYgKmFyY2gpCit7CisJc3RydWN0IGt2bV9hc3luY19wZiAqd29yazsKKworCWlmICh2Y3B1LT5hc3luY19wZi5xdWV1ZWQgPj0gQVNZTkNfUEZfUEVSX1ZDUFUpCisJCXJldHVybiAwOworCisJLyogc2V0dXAgZGVsYXllZCB3b3JrICovCisKKwkvKgorCSAqIGRvIGFsbG9jIG5vd2FpdCBzaW5jZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc2xlZXAgYW55d2F5IHdlCisJICogbWF5IGFzIHdlbGwgc2xlZXAgZmF1bHRpbmcgaW4gcGFnZQorCSAqLworCXdvcmsgPSBrbWVtX2NhY2hlX3phbGxvYyhhc3luY19wZl9jYWNoZSwgR0ZQX05PV0FJVCk7CisJaWYgKCF3b3JrKQorCQlyZXR1cm4gMDsKKworCXdvcmstPnBhZ2UgPSBOVUxMOworCXdvcmstPmRvbmUgPSBmYWxzZTsKKwl3b3JrLT52Y3B1ID0gdmNwdTsKKwl3b3JrLT5ndmEgPSBndmE7CisJd29yay0+YWRkciA9IGdmbl90b19odmEodmNwdS0+a3ZtLCBnZm4pOworCXdvcmstPmFyY2ggPSAqYXJjaDsKKwl3b3JrLT5tbSA9IGN1cnJlbnQtPm1tOworCWF0b21pY19pbmMoJndvcmstPm1tLT5tbV9jb3VudCk7CisJa3ZtX2dldF9rdm0od29yay0+dmNwdS0+a3ZtKTsKKworCS8qIHRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiBvdGhlcndpc2UgZ2ZuX3RvX3Bmbl9hc3luYworCSAgIHdvdWxkIHN1Y2NlZWQgKi8KKwlpZiAodW5saWtlbHkoa3ZtX2lzX2Vycm9yX2h2YSh3b3JrLT5hZGRyKSkpCisJCWdvdG8gcmV0cnlfc3luYzsKKworCUlOSVRfV09SSygmd29yay0+d29yaywgYXN5bmNfcGZfZXhlY3V0ZSk7CisJaWYgKCFzY2hlZHVsZV93b3JrKCZ3b3JrLT53b3JrKSkKKwkJZ290byByZXRyeV9zeW5jOworCisJbGlzdF9hZGRfdGFpbCgmd29yay0+cXVldWUsICZ2Y3B1LT5hc3luY19wZi5xdWV1ZSk7CisJdmNwdS0+YXN5bmNfcGYucXVldWVkKys7CisJa3ZtX2FyY2hfYXN5bmNfcGFnZV9ub3RfcHJlc2VudCh2Y3B1LCB3b3JrKTsKKwlyZXR1cm4gMTsKK3JldHJ5X3N5bmM6CisJa3ZtX3B1dF9rdm0od29yay0+dmNwdS0+a3ZtKTsKKwltbWRyb3Aod29yay0+bW0pOworCWttZW1fY2FjaGVfZnJlZShhc3luY19wZl9jYWNoZSwgd29yayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXN5bmNfcGZfd2FrZXVwX2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9hc3luY19wZiAqd29yazsKKworCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZ2Y3B1LT5hc3luY19wZi5kb25lKSkKKwkJcmV0dXJuIDA7CisKKwl3b3JrID0ga21lbV9jYWNoZV96YWxsb2MoYXN5bmNfcGZfY2FjaGUsIEdGUF9BVE9NSUMpOworCWlmICghd29yaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3b3JrLT5wYWdlID0gYmFkX3BhZ2U7CisJZ2V0X3BhZ2UoYmFkX3BhZ2UpOworCUlOSVRfTElTVF9IRUFEKCZ3b3JrLT5xdWV1ZSk7IC8qIGZvciBsaXN0X2RlbCB0byB3b3JrICovCisKKwlzcGluX2xvY2soJnZjcHUtPmFzeW5jX3BmLmxvY2spOworCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpbmssICZ2Y3B1LT5hc3luY19wZi5kb25lKTsKKwlzcGluX3VubG9jaygmdmNwdS0+YXN5bmNfcGYubG9jayk7CisKKwl2Y3B1LT5hc3luY19wZi5xdWV1ZWQrKzsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FzeW5jX3BmLmggYi92aXJ0L2t2bS9hc3luY19wZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWY2NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdmlydC9rdm0vYXN5bmNfcGYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICoga3ZtIGFzeW5jaHJvbm91cyBmYXVsdCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqICAgICAgR2xlYiBOYXRhcG92IDxnbGViQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fS1ZNX0FTWU5DX1BGX0hfXworI2RlZmluZSBfX0tWTV9BU1lOQ19QRl9IX18KKworI2lmZGVmIENPTkZJR19LVk1fQVNZTkNfUEYKK2ludCBrdm1fYXN5bmNfcGZfaW5pdCh2b2lkKTsKK3ZvaWQga3ZtX2FzeW5jX3BmX2RlaW5pdCh2b2lkKTsKK3ZvaWQga3ZtX2FzeW5jX3BmX3ZjcHVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworI2Vsc2UKKyNkZWZpbmUga3ZtX2FzeW5jX3BmX2luaXQoKSAoMCkKKyNkZWZpbmUga3ZtX2FzeW5jX3BmX2RlaW5pdCgpIGRve313aGlsZSgwKQorI2RlZmluZSBrdm1fYXN5bmNfcGZfdmNwdV9pbml0KEMpIGRve313aGlsZSgwKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZXZlbnRmZC5jIGIvdmlydC9rdm0vZXZlbnRmZC5jCmluZGV4IGMxZjFlM2MuLjJjYTQ1MzUgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2V2ZW50ZmQuYworKysgYi92aXJ0L2t2bS9ldmVudGZkLmMKQEAgLTQ0LDE0ICs0NCwxOSBAQAogICovCiAKIHN0cnVjdCBfaXJxZmQgewotCXN0cnVjdCBrdm0gICAgICAgICAgICAgICAqa3ZtOwotCXN0cnVjdCBldmVudGZkX2N0eCAgICAgICAqZXZlbnRmZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgIGdzaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgIGxpc3Q7Ci0JcG9sbF90YWJsZSAgICAgICAgICAgICAgICBwdDsKLQl3YWl0X3F1ZXVlX3QgICAgICAgICAgICAgIHdhaXQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICBpbmplY3Q7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgICBzaHV0ZG93bjsKKwkvKiBVc2VkIGZvciBNU0kgZmFzdC1wYXRoICovCisJc3RydWN0IGt2bSAqa3ZtOworCXdhaXRfcXVldWVfdCB3YWl0OworCS8qIFVwZGF0ZSBzaWRlIGlzIHByb3RlY3RlZCBieSBpcnFmZHMubG9jayAqLworCXN0cnVjdCBrdm1fa2VybmVsX2lycV9yb3V0aW5nX2VudHJ5IF9fcmN1ICppcnFfZW50cnk7CisJLyogVXNlZCBmb3IgbGV2ZWwgSVJRIGZhc3QtcGF0aCAqLworCWludCBnc2k7CisJc3RydWN0IHdvcmtfc3RydWN0IGluamVjdDsKKwkvKiBVc2VkIGZvciBzZXR1cC9zaHV0ZG93biAqLworCXN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJcG9sbF90YWJsZSBwdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2h1dGRvd247CiB9OwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmlycWZkX2NsZWFudXBfd3E7CkBAIC0xMjUsMTQgKzEzMCwyMiBAQAogewogCXN0cnVjdCBfaXJxZmQgKmlycWZkID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCBfaXJxZmQsIHdhaXQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAodW5zaWduZWQgbG9uZylrZXk7CisJc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmlycTsKKwlzdHJ1Y3Qga3ZtICprdm0gPSBpcnFmZC0+a3ZtOwogCi0JaWYgKGZsYWdzICYgUE9MTElOKQorCWlmIChmbGFncyAmIFBPTExJTikgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCWlycSA9IHJjdV9kZXJlZmVyZW5jZShpcnFmZC0+aXJxX2VudHJ5KTsKIAkJLyogQW4gZXZlbnQgaGFzIGJlZW4gc2lnbmFsZWQsIGluamVjdCBhbiBpbnRlcnJ1cHQgKi8KLQkJc2NoZWR1bGVfd29yaygmaXJxZmQtPmluamVjdCk7CisJCWlmIChpcnEpCisJCQlrdm1fc2V0X21zaShpcnEsIGt2bSwgS1ZNX1VTRVJTUEFDRV9JUlFfU09VUkNFX0lELCAxKTsKKwkJZWxzZQorCQkJc2NoZWR1bGVfd29yaygmaXJxZmQtPmluamVjdCk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KIAogCWlmIChmbGFncyAmIFBPTExIVVApIHsKIAkJLyogVGhlIGV2ZW50ZmQgaXMgY2xvc2luZywgZGV0YWNoIGZyb20gS1ZNICovCi0JCXN0cnVjdCBrdm0gKmt2bSA9IGlycWZkLT5rdm07CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmt2bS0+aXJxZmRzLmxvY2ssIGZsYWdzKTsKQEAgLTE2Myw5ICsxNzYsMzEgQEAKIAlhZGRfd2FpdF9xdWV1ZSh3cWgsICZpcnFmZC0+d2FpdCk7CiB9CiAKKy8qIE11c3QgYmUgY2FsbGVkIHVuZGVyIGlycWZkcy5sb2NrICovCitzdGF0aWMgdm9pZCBpcnFmZF91cGRhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgX2lycWZkICppcnFmZCwKKwkJCSBzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX3RhYmxlICppcnFfcnQpCit7CisJc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmU7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlpZiAoaXJxZmQtPmdzaSA+PSBpcnFfcnQtPm5yX3J0X2VudHJpZXMpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlycWZkLT5pcnFfZW50cnksIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZSwgbiwgJmlycV9ydC0+bWFwW2lycWZkLT5nc2ldLCBsaW5rKSB7CisJCS8qIE9ubHkgZmFzdC1wYXRoIE1TSS4gKi8KKwkJaWYgKGUtPnR5cGUgPT0gS1ZNX0lSUV9ST1VUSU5HX01TSSkKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihpcnFmZC0+aXJxX2VudHJ5LCBlKTsKKwkJZWxzZQorCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGlycWZkLT5pcnFfZW50cnksIE5VTEwpOworCX0KK30KKwogc3RhdGljIGludAoga3ZtX2lycWZkX2Fzc2lnbihzdHJ1Y3Qga3ZtICprdm0sIGludCBmZCwgaW50IGdzaSkKIHsKKwlzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX3RhYmxlICppcnFfcnQ7CiAJc3RydWN0IF9pcnFmZCAqaXJxZmQsICp0bXA7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBOVUxMOwogCXN0cnVjdCBldmVudGZkX2N0eCAqZXZlbnRmZCA9IE5VTEw7CkBAIC0yMTUsNiArMjUwLDEwIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwlpcnFfcnQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGt2bS0+aXJxX3JvdXRpbmcsCisJCQkJCSAgIGxvY2tkZXBfaXNfaGVsZCgma3ZtLT5pcnFmZHMubG9jaykpOworCWlycWZkX3VwZGF0ZShrdm0sIGlycWZkLCBpcnFfcnQpOworCiAJZXZlbnRzID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCAmaXJxZmQtPnB0KTsKIAogCWxpc3RfYWRkX3RhaWwoJmlycWZkLT5saXN0LCAma3ZtLT5pcnFmZHMuaXRlbXMpOwpAQCAtMjcxLDggKzMxMCwxNyBAQAogCXNwaW5fbG9ja19pcnEoJmt2bS0+aXJxZmRzLmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlycWZkLCB0bXAsICZrdm0tPmlycWZkcy5pdGVtcywgbGlzdCkgewotCQlpZiAoaXJxZmQtPmV2ZW50ZmQgPT0gZXZlbnRmZCAmJiBpcnFmZC0+Z3NpID09IGdzaSkKKwkJaWYgKGlycWZkLT5ldmVudGZkID09IGV2ZW50ZmQgJiYgaXJxZmQtPmdzaSA9PSBnc2kpIHsKKwkJCS8qCisJCQkgKiBUaGlzIHJjdV9hc3NpZ25fcG9pbnRlciBpcyBuZWVkZWQgZm9yIHdoZW4KKwkJCSAqIGFub3RoZXIgdGhyZWFkIGNhbGxzIGt2bV9pcnFmZF91cGRhdGUgYmVmb3JlCisJCQkgKiB3ZSBmbHVzaCB3b3JrcXVldWUgYmVsb3cuCisJCQkgKiBJdCBpcyBwYWlyZWQgd2l0aCBzeW5jaHJvbml6ZV9yY3UgZG9uZSBieSBjYWxsZXIKKwkJCSAqIG9mIHRoYXQgZnVuY3Rpb24uCisJCQkgKi8KKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihpcnFmZC0+aXJxX2VudHJ5LCBOVUxMKTsKIAkJCWlycWZkX2RlYWN0aXZhdGUoaXJxZmQpOworCQl9CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZrdm0tPmlycWZkcy5sb2NrKTsKQEAgLTMyMiw2ICszNzAsMjUgQEAKIH0KIAogLyoKKyAqIENoYW5nZSBpcnFfcm91dGluZyBhbmQgaXJxZmQuCisgKiBDYWxsZXIgbXVzdCBpbnZva2Ugc3luY2hyb25pemVfcmN1IGFmdGVyd2FyZHMuCisgKi8KK3ZvaWQga3ZtX2lycV9yb3V0aW5nX3VwZGF0ZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgc3RydWN0IGt2bV9pcnFfcm91dGluZ190YWJsZSAqaXJxX3J0KQoreworCXN0cnVjdCBfaXJxZmQgKmlycWZkOworCisJc3Bpbl9sb2NrX2lycSgma3ZtLT5pcnFmZHMubG9jayk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoa3ZtLT5pcnFfcm91dGluZywgaXJxX3J0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXJxZmQsICZrdm0tPmlycWZkcy5pdGVtcywgbGlzdCkKKwkJaXJxZmRfdXBkYXRlKGt2bSwgaXJxZmQsIGlycV9ydCk7CisKKwlzcGluX3VubG9ja19pcnEoJmt2bS0+aXJxZmRzLmxvY2spOworfQorCisvKgogICogY3JlYXRlIGEgaG9zdC13aWRlIHdvcmtxdWV1ZSBmb3IgaXNzdWluZyBkZWZlcnJlZCBzaHV0ZG93biByZXF1ZXN0cwogICogYWdncmVnYXRlZCBmcm9tIGFsbCB2bSogaW5zdGFuY2VzLiBXZSBuZWVkIG91ciBvd24gaXNvbGF0ZWQgc2luZ2xlLXRocmVhZAogICogcXVldWUgdG8gcHJldmVudCBkZWFkbG9jayBhZ2FpbnN0IGZsdXNoaW5nIHRoZSBub3JtYWwgd29yay1xdWV1ZS4KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2lycV9jb21tLmMgYi92aXJ0L2t2bS9pcnFfY29tbS5jCmluZGV4IDhlZGNhOTEuLjlmNjE0YjQgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lycV9jb21tLmMKKysrIGIvdmlydC9rdm0vaXJxX2NvbW0uYwpAQCAtMTE0LDggKzExNCw4IEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX3NldF9tc2koc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmUsCi0JCSAgICAgICBzdHJ1Y3Qga3ZtICprdm0sIGludCBpcnFfc291cmNlX2lkLCBpbnQgbGV2ZWwpCitpbnQga3ZtX3NldF9tc2koc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmUsCisJCXN0cnVjdCBrdm0gKmt2bSwgaW50IGlycV9zb3VyY2VfaWQsIGludCBsZXZlbCkKIHsKIAlzdHJ1Y3Qga3ZtX2xhcGljX2lycSBpcnE7CiAKQEAgLTQwOSw4ICs0MDksOSBAQAogCiAJbXV0ZXhfbG9jaygma3ZtLT5pcnFfbG9jayk7CiAJb2xkID0ga3ZtLT5pcnFfcm91dGluZzsKLQlyY3VfYXNzaWduX3BvaW50ZXIoa3ZtLT5pcnFfcm91dGluZywgbmV3KTsKKwlrdm1faXJxX3JvdXRpbmdfdXBkYXRlKGt2bSwgbmV3KTsKIAltdXRleF91bmxvY2soJmt2bS0+aXJxX2xvY2spOworCiAJc3luY2hyb25pemVfcmN1KCk7CiAKIAluZXcgPSBvbGQ7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCA1MjI1MDUyLi5mMjlhYmViIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbGUuaD4KIAogI2luY2x1ZGUgImNvYWxlc2NlZF9tbWlvLmgiCisjaW5jbHVkZSAiYXN5bmNfcGYuaCIKIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2t2bS5oPgpAQCAtODksNyArOTAsOCBAQAogCiBzdGF0aWMgdm9pZCBrdm1faW9fYnVzX2Rlc3Ryb3koc3RydWN0IGt2bV9pb19idXMgKmJ1cyk7CiAKLXN0YXRpYyBib29sIGt2bV9yZWJvb3Rpbmc7Citib29sIGt2bV9yZWJvb3Rpbmc7CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fcmVib290aW5nKTsKIAogc3RhdGljIGJvb2wgbGFyZ2VwYWdlc19lbmFibGVkID0gdHJ1ZTsKIApAQCAtMTAyLDggKzEwNCwyNiBAQAogaW5saW5lIGludCBrdm1faXNfbW1pb19wZm4ocGZuX3QgcGZuKQogewogCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGNvbXBvdW5kX2hlYWQocGZuX3RvX3BhZ2UocGZuKSk7Ci0JCXJldHVybiBQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCWludCByZXNlcnZlZDsKKwkJc3RydWN0IHBhZ2UgKnRhaWwgPSBwZm5fdG9fcGFnZShwZm4pOworCQlzdHJ1Y3QgcGFnZSAqaGVhZCA9IGNvbXBvdW5kX3RyYW5zX2hlYWQodGFpbCk7CisJCXJlc2VydmVkID0gUGFnZVJlc2VydmVkKGhlYWQpOworCQlpZiAoaGVhZCAhPSB0YWlsKSB7CisJCQkvKgorCQkJICogImhlYWQiIGlzIG5vdCBhIGRhbmdsaW5nIHBvaW50ZXIKKwkJCSAqIChjb21wb3VuZF90cmFuc19oZWFkIHRha2VzIGNhcmUgb2YgdGhhdCkKKwkJCSAqIGJ1dCB0aGUgaHVnZXBhZ2UgbWF5IGhhdmUgYmVlbiBzcGxpdHRlZAorCQkJICogZnJvbSB1bmRlciB1cyAoYW5kIHdlIG1heSBub3QgaG9sZCBhCisJCQkgKiByZWZlcmVuY2UgY291bnQgb24gdGhlIGhlYWQgcGFnZSBzbyBpdCBjYW4KKwkJCSAqIGJlIHJldXNlZCBiZWZvcmUgd2UgcnVuIFBhZ2VSZWZlcmVuY2VkKSwgc28KKwkJCSAqIHdlJ3ZlIHRvIGNoZWNrIFBhZ2VUYWlsIGJlZm9yZSByZXR1cm5pbmcKKwkJCSAqIHdoYXQgd2UganVzdCByZWFkLgorCQkJICovCisJCQlzbXBfcm1iKCk7CisJCQlpZiAoUGFnZVRhaWwodGFpbCkpCisJCQkJcmV0dXJuIHJlc2VydmVkOworCQl9CisJCXJldHVybiBQYWdlUmVzZXJ2ZWQodGFpbCk7CiAJfQogCiAJcmV0dXJuIHRydWU7CkBAIC0xNjcsOCArMTg3LDEyIEBACiAKIHZvaWQga3ZtX2ZsdXNoX3JlbW90ZV90bGJzKHN0cnVjdCBrdm0gKmt2bSkKIHsKKwlpbnQgZGlydHlfY291bnQgPSBrdm0tPnRsYnNfZGlydHk7CisKKwlzbXBfbWIoKTsKIAlpZiAobWFrZV9hbGxfY3B1c19yZXF1ZXN0KGt2bSwgS1ZNX1JFUV9UTEJfRkxVU0gpKQogCQkrK2t2bS0+c3RhdC5yZW1vdGVfdGxiX2ZsdXNoOworCWNtcHhjaGcoJmt2bS0+dGxic19kaXJ0eSwgZGlydHlfY291bnQsIDApOwogfQogCiB2b2lkIGt2bV9yZWxvYWRfcmVtb3RlX21tdXMoc3RydWN0IGt2bSAqa3ZtKQpAQCAtMTg2LDYgKzIxMCw3IEBACiAJdmNwdS0+a3ZtID0ga3ZtOwogCXZjcHUtPnZjcHVfaWQgPSBpZDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2Y3B1LT53cSk7CisJa3ZtX2FzeW5jX3BmX3ZjcHVfaW5pdCh2Y3B1KTsKIAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKIAlpZiAoIXBhZ2UpIHsKQEAgLTI0Nyw3ICsyNzIsNyBAQAogCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwogCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJa3ZtLT5tbXVfbm90aWZpZXJfc2VxKys7Ci0JbmVlZF90bGJfZmx1c2ggPSBrdm1fdW5tYXBfaHZhKGt2bSwgYWRkcmVzcyk7CisJbmVlZF90bGJfZmx1c2ggPSBrdm1fdW5tYXBfaHZhKGt2bSwgYWRkcmVzcykgfCBrdm0tPnRsYnNfZGlydHk7CiAJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgaWR4KTsKIApAQCAtMjkxLDYgKzMxNiw3IEBACiAJa3ZtLT5tbXVfbm90aWZpZXJfY291bnQrKzsKIAlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSkKIAkJbmVlZF90bGJfZmx1c2ggfD0ga3ZtX3VubWFwX2h2YShrdm0sIHN0YXJ0KTsKKwluZWVkX3RsYl9mbHVzaCB8PSBrdm0tPnRsYnNfZGlydHk7CiAJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+c3JjdSwgaWR4KTsKIApAQCAtMzQ0LDYgKzM3MCwyMiBAQAogCXJldHVybiB5b3VuZzsKIH0KIAorc3RhdGljIGludCBrdm1fbW11X25vdGlmaWVyX3Rlc3RfeW91bmcoc3RydWN0IG1tdV9ub3RpZmllciAqbW4sCisJCQkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJc3RydWN0IGt2bSAqa3ZtID0gbW11X25vdGlmaWVyX3RvX2t2bShtbik7CisJaW50IHlvdW5nLCBpZHg7CisKKwlpZHggPSBzcmN1X3JlYWRfbG9jaygma3ZtLT5zcmN1KTsKKwlzcGluX2xvY2soJmt2bS0+bW11X2xvY2spOworCXlvdW5nID0ga3ZtX3Rlc3RfYWdlX2h2YShrdm0sIGFkZHJlc3MpOworCXNwaW5fdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKKwlzcmN1X3JlYWRfdW5sb2NrKCZrdm0tPnNyY3UsIGlkeCk7CisKKwlyZXR1cm4geW91bmc7Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9tbXVfbm90aWZpZXJfcmVsZWFzZShzdHJ1Y3QgbW11X25vdGlmaWVyICptbiwKIAkJCQkgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewpAQCAtMzYwLDYgKzQwMiw3IEBACiAJLmludmFsaWRhdGVfcmFuZ2Vfc3RhcnQJPSBrdm1fbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQsCiAJLmludmFsaWRhdGVfcmFuZ2VfZW5kCT0ga3ZtX21tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZCwKIAkuY2xlYXJfZmx1c2hfeW91bmcJPSBrdm1fbW11X25vdGlmaWVyX2NsZWFyX2ZsdXNoX3lvdW5nLAorCS50ZXN0X3lvdW5nCQk9IGt2bV9tbXVfbm90aWZpZXJfdGVzdF95b3VuZywKIAkuY2hhbmdlX3B0ZQkJPSBrdm1fbW11X25vdGlmaWVyX2NoYW5nZV9wdGUsCiAJLnJlbGVhc2UJCT0ga3ZtX21tdV9ub3RpZmllcl9yZWxlYXNlLAogfTsKQEAgLTM4MSwxMSArNDI0LDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga3ZtICprdm1fY3JlYXRlX3ZtKHZvaWQpCiB7Ci0JaW50IHIgPSAwLCBpOwotCXN0cnVjdCBrdm0gKmt2bSA9IGt2bV9hcmNoX2NyZWF0ZV92bSgpOworCWludCByLCBpOworCXN0cnVjdCBrdm0gKmt2bSA9IGt2bV9hcmNoX2FsbG9jX3ZtKCk7CiAKLQlpZiAoSVNfRVJSKGt2bSkpCi0JCWdvdG8gb3V0OworCWlmICgha3ZtKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXIgPSBrdm1fYXJjaF9pbml0X3ZtKGt2bSk7CisJaWYgKHIpCisJCWdvdG8gb3V0X2Vycl9ub2Rpc2FibGU7CiAKIAlyID0gaGFyZHdhcmVfZW5hYmxlX2FsbCgpOwogCWlmIChyKQpAQCAtMzk5LDIzICs0NDYsMTkgQEAKIAlyID0gLUVOT01FTTsKIAlrdm0tPm1lbXNsb3RzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9tZW1zbG90cyksIEdGUF9LRVJORUwpOwogCWlmICgha3ZtLT5tZW1zbG90cykKLQkJZ290byBvdXRfZXJyOworCQlnb3RvIG91dF9lcnJfbm9zcmN1OwogCWlmIChpbml0X3NyY3Vfc3RydWN0KCZrdm0tPnNyY3UpKQotCQlnb3RvIG91dF9lcnI7CisJCWdvdG8gb3V0X2Vycl9ub3NyY3U7CiAJZm9yIChpID0gMDsgaSA8IEtWTV9OUl9CVVNFUzsgaSsrKSB7CiAJCWt2bS0+YnVzZXNbaV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX2lvX2J1cyksCiAJCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIWt2bS0+YnVzZXNbaV0pIHsKLQkJCWNsZWFudXBfc3JjdV9zdHJ1Y3QoJmt2bS0+c3JjdSk7CisJCWlmICgha3ZtLT5idXNlc1tpXSkKIAkJCWdvdG8gb3V0X2VycjsKLQkJfQogCX0KIAogCXIgPSBrdm1faW5pdF9tbXVfbm90aWZpZXIoa3ZtKTsKLQlpZiAocikgewotCQljbGVhbnVwX3NyY3Vfc3RydWN0KCZrdm0tPnNyY3UpOworCWlmIChyKQogCQlnb3RvIG91dF9lcnI7Ci0JfQogCiAJa3ZtLT5tbSA9IGN1cnJlbnQtPm1tOwogCWF0b21pY19pbmMoJmt2bS0+bW0tPm1tX2NvdW50KTsKQEAgLTQyOSwxOSArNDcyLDM1IEBACiAJc3Bpbl9sb2NrKCZrdm1fbG9jayk7CiAJbGlzdF9hZGQoJmt2bS0+dm1fbGlzdCwgJnZtX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZrdm1fbG9jayk7Ci1vdXQ6CisKIAlyZXR1cm4ga3ZtOwogCiBvdXRfZXJyOgorCWNsZWFudXBfc3JjdV9zdHJ1Y3QoJmt2bS0+c3JjdSk7CitvdXRfZXJyX25vc3JjdToKIAloYXJkd2FyZV9kaXNhYmxlX2FsbCgpOwogb3V0X2Vycl9ub2Rpc2FibGU6CiAJZm9yIChpID0gMDsgaSA8IEtWTV9OUl9CVVNFUzsgaSsrKQogCQlrZnJlZShrdm0tPmJ1c2VzW2ldKTsKIAlrZnJlZShrdm0tPm1lbXNsb3RzKTsKLQlrZnJlZShrdm0pOworCWt2bV9hcmNoX2ZyZWVfdm0oa3ZtKTsKIAlyZXR1cm4gRVJSX1BUUihyKTsKIH0KIAorc3RhdGljIHZvaWQga3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpCit7CisJaWYgKCFtZW1zbG90LT5kaXJ0eV9iaXRtYXApCisJCXJldHVybjsKKworCWlmICgyICoga3ZtX2RpcnR5X2JpdG1hcF9ieXRlcyhtZW1zbG90KSA+IFBBR0VfU0laRSkKKwkJdmZyZWUobWVtc2xvdC0+ZGlydHlfYml0bWFwX2hlYWQpOworCWVsc2UKKwkJa2ZyZWUobWVtc2xvdC0+ZGlydHlfYml0bWFwX2hlYWQpOworCisJbWVtc2xvdC0+ZGlydHlfYml0bWFwID0gTlVMTDsKKwltZW1zbG90LT5kaXJ0eV9iaXRtYXBfaGVhZCA9IE5VTEw7Cit9CisKIC8qCiAgKiBGcmVlIGFueSBtZW1vcnkgaW4gQGZyZWUgYnV0IG5vdCBpbiBAZG9udC4KICAqLwpAQCAtNDU0LDcgKzUxMyw3IEBACiAJCXZmcmVlKGZyZWUtPnJtYXApOwogCiAJaWYgKCFkb250IHx8IGZyZWUtPmRpcnR5X2JpdG1hcCAhPSBkb250LT5kaXJ0eV9iaXRtYXApCi0JCXZmcmVlKGZyZWUtPmRpcnR5X2JpdG1hcCk7CisJCWt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChmcmVlKTsKIAogCiAJZm9yIChpID0gMDsgaSA8IEtWTV9OUl9QQUdFX1NJWkVTIC0gMTsgKytpKSB7CkBAIC00NjUsNyArNTI0LDYgQEAKIAl9CiAKIAlmcmVlLT5ucGFnZXMgPSAwOwotCWZyZWUtPmRpcnR5X2JpdG1hcCA9IE5VTEw7CiAJZnJlZS0+cm1hcCA9IE5VTEw7CiB9CiAKQEAgLTQ5OSw2ICs1NTcsOSBAQAogCWt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhrdm0pOwogI2VuZGlmCiAJa3ZtX2FyY2hfZGVzdHJveV92bShrdm0pOworCWt2bV9mcmVlX3BoeXNtZW0oa3ZtKTsKKwljbGVhbnVwX3NyY3Vfc3RydWN0KCZrdm0tPnNyY3UpOworCWt2bV9hcmNoX2ZyZWVfdm0oa3ZtKTsKIAloYXJkd2FyZV9kaXNhYmxlX2FsbCgpOwogCW1tZHJvcChtbSk7CiB9CkBAIC01MjgsNiArNTg5LDI3IEBACiB9CiAKIC8qCisgKiBBbGxvY2F0aW9uIHNpemUgaXMgdHdpY2UgYXMgbGFyZ2UgYXMgdGhlIGFjdHVhbCBkaXJ0eSBiaXRtYXAgc2l6ZS4KKyAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZG8gZG91YmxlIGJ1ZmZlcmluZzogc2VlIHg4NidzCisgKiBrdm1fdm1faW9jdGxfZ2V0X2RpcnR5X2xvZygpLgorICovCitzdGF0aWMgaW50IGt2bV9jcmVhdGVfZGlydHlfYml0bWFwKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpCit7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV9ieXRlcyA9IDIgKiBrdm1fZGlydHlfYml0bWFwX2J5dGVzKG1lbXNsb3QpOworCisJaWYgKGRpcnR5X2J5dGVzID4gUEFHRV9TSVpFKQorCQltZW1zbG90LT5kaXJ0eV9iaXRtYXAgPSB2emFsbG9jKGRpcnR5X2J5dGVzKTsKKwllbHNlCisJCW1lbXNsb3QtPmRpcnR5X2JpdG1hcCA9IGt6YWxsb2MoZGlydHlfYnl0ZXMsIEdGUF9LRVJORUwpOworCisJaWYgKCFtZW1zbG90LT5kaXJ0eV9iaXRtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2xvdC0+ZGlydHlfYml0bWFwX2hlYWQgPSBtZW1zbG90LT5kaXJ0eV9iaXRtYXA7CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSBhbmQgZ2l2ZSBpdCBhbiBhZGRyZXNzIGluIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzCiAgKiBzcGFjZS4KICAqCkBAIC02MDQsMTMgKzY4NiwxMSBAQAogCS8qIEFsbG9jYXRlIGlmIGEgc2xvdCBpcyBiZWluZyBjcmVhdGVkICovCiAjaWZuZGVmIENPTkZJR19TMzkwCiAJaWYgKG5wYWdlcyAmJiAhbmV3LnJtYXApIHsKLQkJbmV3LnJtYXAgPSB2bWFsbG9jKG5wYWdlcyAqIHNpemVvZigqbmV3LnJtYXApKTsKKwkJbmV3LnJtYXAgPSB2emFsbG9jKG5wYWdlcyAqIHNpemVvZigqbmV3LnJtYXApKTsKIAogCQlpZiAoIW5ldy5ybWFwKQogCQkJZ290byBvdXRfZnJlZTsKIAotCQltZW1zZXQobmV3LnJtYXAsIDAsIG5wYWdlcyAqIHNpemVvZigqbmV3LnJtYXApKTsKLQogCQluZXcudXNlcl9hbGxvYyA9IHVzZXJfYWxsb2M7CiAJCW5ldy51c2Vyc3BhY2VfYWRkciA9IG1lbS0+dXNlcnNwYWNlX2FkZHI7CiAJfQpAQCAtNjMzLDE0ICs3MTMsMTEgQEAKIAkJCSAgICAgPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCkpOwogCQlscGFnZXMgLT0gYmFzZV9nZm4gPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCk7CiAKLQkJbmV3LmxwYWdlX2luZm9baV0gPSB2bWFsbG9jKGxwYWdlcyAqIHNpemVvZigqbmV3LmxwYWdlX2luZm9baV0pKTsKKwkJbmV3LmxwYWdlX2luZm9baV0gPSB2emFsbG9jKGxwYWdlcyAqIHNpemVvZigqbmV3LmxwYWdlX2luZm9baV0pKTsKIAogCQlpZiAoIW5ldy5scGFnZV9pbmZvW2ldKQogCQkJZ290byBvdXRfZnJlZTsKIAotCQltZW1zZXQobmV3LmxwYWdlX2luZm9baV0sIDAsCi0JCSAgICAgICBscGFnZXMgKiBzaXplb2YoKm5ldy5scGFnZV9pbmZvW2ldKSk7Ci0KIAkJaWYgKGJhc2VfZ2ZuICYgKEtWTV9QQUdFU19QRVJfSFBBR0UobGV2ZWwpIC0gMSkpCiAJCQluZXcubHBhZ2VfaW5mb1tpXVswXS53cml0ZV9jb3VudCA9IDE7CiAJCWlmICgoYmFzZV9nZm4rbnBhZ2VzKSAmIChLVk1fUEFHRVNfUEVSX0hQQUdFKGxldmVsKSAtIDEpKQpAQCAtNjYxLDEyICs3MzgsOCBAQAogCiAJLyogQWxsb2NhdGUgcGFnZSBkaXJ0eSBiaXRtYXAgaWYgbmVlZGVkICovCiAJaWYgKChuZXcuZmxhZ3MgJiBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUykgJiYgIW5ldy5kaXJ0eV9iaXRtYXApIHsKLQkJdW5zaWduZWQgbG9uZyBkaXJ0eV9ieXRlcyA9IGt2bV9kaXJ0eV9iaXRtYXBfYnl0ZXMoJm5ldyk7Ci0KLQkJbmV3LmRpcnR5X2JpdG1hcCA9IHZtYWxsb2MoZGlydHlfYnl0ZXMpOwotCQlpZiAoIW5ldy5kaXJ0eV9iaXRtYXApCisJCWlmIChrdm1fY3JlYXRlX2RpcnR5X2JpdG1hcCgmbmV3KSA8IDApCiAJCQlnb3RvIG91dF9mcmVlOwotCQltZW1zZXQobmV3LmRpcnR5X2JpdG1hcCwgMCwgZGlydHlfYnl0ZXMpOwogCQkvKiBkZXN0cm95IGFueSBsYXJnZXBhZ2UgbWFwcGluZ3MgZm9yIGRpcnR5IHRyYWNraW5nICovCiAJCWlmIChvbGQubnBhZ2VzKQogCQkJZmx1c2hfc2hhZG93ID0gMTsKQEAgLTY4NSw2ICs3NTgsNyBAQAogCQltZW1jcHkoc2xvdHMsIGt2bS0+bWVtc2xvdHMsIHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSk7CiAJCWlmIChtZW0tPnNsb3QgPj0gc2xvdHMtPm5tZW1zbG90cykKIAkJCXNsb3RzLT5ubWVtc2xvdHMgPSBtZW0tPnNsb3QgKyAxOworCQlzbG90cy0+Z2VuZXJhdGlvbisrOwogCQlzbG90cy0+bWVtc2xvdHNbbWVtLT5zbG90XS5mbGFncyB8PSBLVk1fTUVNU0xPVF9JTlZBTElEOwogCiAJCW9sZF9tZW1zbG90cyA9IGt2bS0+bWVtc2xvdHM7CkBAIC03MTksNiArNzkzLDcgQEAKIAltZW1jcHkoc2xvdHMsIGt2bS0+bWVtc2xvdHMsIHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSk7CiAJaWYgKG1lbS0+c2xvdCA+PSBzbG90cy0+bm1lbXNsb3RzKQogCQlzbG90cy0+bm1lbXNsb3RzID0gbWVtLT5zbG90ICsgMTsKKwlzbG90cy0+Z2VuZXJhdGlvbisrOwogCiAJLyogYWN0dWFsIG1lbW9yeSBpcyBmcmVlZCB2aWEgb2xkIGluIGt2bV9mcmVlX3BoeXNtZW1fc2xvdCBiZWxvdyAqLwogCWlmICghbnBhZ2VzKSB7CkBAIC04NDksMTAgKzkyNCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2lzX2Vycm9yX2h2YSk7CiAKLXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmdmbl90b19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQorc3RhdGljIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKl9fZ2ZuX3RvX21lbXNsb3Qoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsCisJCQkJCQlnZm5fdCBnZm4pCiB7CiAJaW50IGk7Ci0Jc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMgPSBrdm1fbWVtc2xvdHMoa3ZtKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzbG90cy0+bm1lbXNsb3RzOyArK2kpIHsKIAkJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCA9ICZzbG90cy0+bWVtc2xvdHNbaV07CkBAIC04NjMsNiArOTM4LDExIEBACiAJfQogCXJldHVybiBOVUxMOwogfQorCitzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpnZm5fdG9fbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKK3sKKwlyZXR1cm4gX19nZm5fdG9fbWVtc2xvdChrdm1fbWVtc2xvdHMoa3ZtKSwgZ2ZuKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19tZW1zbG90KTsKIAogaW50IGt2bV9pc192aXNpYmxlX2dmbihzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKQEAgLTkyNSwxMiArMTAwNSw5IEBACiAJcmV0dXJuIG1lbXNsb3QgLSBzbG90cy0+bWVtc2xvdHM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdmbl90b19odmFfbWFueShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdmbl90b19odmFfbWFueShzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBnZm5fdCBnZm4sCiAJCQkJICAgICBnZm5fdCAqbnJfcGFnZXMpCiB7Ci0Jc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdDsKLQotCXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CiAJaWYgKCFzbG90IHx8IHNsb3QtPmZsYWdzICYgS1ZNX01FTVNMT1RfSU5WQUxJRCkKIAkJcmV0dXJuIGJhZF9odmEoKTsKIApAQCAtOTQyLDI4ICsxMDE5LDYxIEBACiAKIHVuc2lnbmVkIGxvbmcgZ2ZuX3RvX2h2YShzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbikKIHsKLQlyZXR1cm4gZ2ZuX3RvX2h2YV9tYW55KGt2bSwgZ2ZuLCBOVUxMKTsKKwlyZXR1cm4gZ2ZuX3RvX2h2YV9tYW55KGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKSwgZ2ZuLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19odmEpOwogCi1zdGF0aWMgcGZuX3QgaHZhX3RvX3BmbihzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgYWRkciwgYm9vbCBhdG9taWMpCitzdGF0aWMgcGZuX3QgZ2V0X2ZhdWx0X3Bmbih2b2lkKQoreworCWdldF9wYWdlKGZhdWx0X3BhZ2UpOworCXJldHVybiBmYXVsdF9wZm47Cit9CisKK3N0YXRpYyBwZm5fdCBodmFfdG9fcGZuKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBhZGRyLCBib29sIGF0b21pYywKKwkJCWJvb2wgKmFzeW5jLCBib29sIHdyaXRlX2ZhdWx0LCBib29sICp3cml0YWJsZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZVsxXTsKLQlpbnQgbnBhZ2VzOworCWludCBucGFnZXMgPSAwOwogCXBmbl90IHBmbjsKIAotCWlmIChhdG9taWMpCisJLyogd2UgY2FuIGRvIGl0IGVpdGhlciBhdG9taWNhbGx5IG9yIGFzeW5jaHJvbm91c2x5LCBub3QgYm90aCAqLworCUJVR19PTihhdG9taWMgJiYgYXN5bmMpOworCisJQlVHX09OKCF3cml0ZV9mYXVsdCAmJiAhd3JpdGFibGUpOworCisJaWYgKHdyaXRhYmxlKQorCQkqd3JpdGFibGUgPSB0cnVlOworCisJaWYgKGF0b21pYyB8fCBhc3luYykKIAkJbnBhZ2VzID0gX19nZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIDEsIDEsIHBhZ2UpOwotCWVsc2UgeworCisJaWYgKHVubGlrZWx5KG5wYWdlcyAhPSAxKSAmJiAhYXRvbWljKSB7CiAJCW1pZ2h0X3NsZWVwKCk7Ci0JCW5wYWdlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgMSwgMSwgcGFnZSk7CisKKwkJaWYgKHdyaXRhYmxlKQorCQkJKndyaXRhYmxlID0gd3JpdGVfZmF1bHQ7CisKKwkJbnBhZ2VzID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCAxLCB3cml0ZV9mYXVsdCwgcGFnZSk7CisKKwkJLyogbWFwIHJlYWQgZmF1bHQgYXMgd3JpdGFibGUgaWYgcG9zc2libGUgKi8KKwkJaWYgKHVubGlrZWx5KCF3cml0ZV9mYXVsdCkgJiYgbnBhZ2VzID09IDEpIHsKKwkJCXN0cnVjdCBwYWdlICp3cGFnZVsxXTsKKworCQkJbnBhZ2VzID0gX19nZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIDEsIDEsIHdwYWdlKTsKKwkJCWlmIChucGFnZXMgPT0gMSkgeworCQkJCSp3cml0YWJsZSA9IHRydWU7CisJCQkJcHV0X3BhZ2UocGFnZVswXSk7CisJCQkJcGFnZVswXSA9IHdwYWdlWzBdOworCQkJfQorCQkJbnBhZ2VzID0gMTsKKwkJfQogCX0KIAogCWlmICh1bmxpa2VseShucGFnZXMgIT0gMSkpIHsKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAkJaWYgKGF0b21pYykKLQkJCWdvdG8gcmV0dXJuX2ZhdWx0X3BhZ2U7CisJCQlyZXR1cm4gZ2V0X2ZhdWx0X3BmbigpOwogCiAJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkJaWYgKGlzX2h3cG9pc29uX2FkZHJlc3MoYWRkcikpIHsKQEAgLTk3MiwxOSArMTA4MiwyMCBAQAogCQkJcmV0dXJuIHBhZ2VfdG9fcGZuKGh3cG9pc29uX3BhZ2UpOwogCQl9CiAKLQkJdm1hID0gZmluZF92bWEoY3VycmVudC0+bW0sIGFkZHIpOworCQl2bWEgPSBmaW5kX3ZtYV9pbnRlcnNlY3Rpb24oY3VycmVudC0+bW0sIGFkZHIsIGFkZHIrMSk7CiAKLQkJaWYgKHZtYSA9PSBOVUxMIHx8IGFkZHIgPCB2bWEtPnZtX3N0YXJ0IHx8Ci0JCSAgICAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9QRk5NQVApKSB7Ci0JCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotcmV0dXJuX2ZhdWx0X3BhZ2U6Ci0JCQlnZXRfcGFnZShmYXVsdF9wYWdlKTsKLQkJCXJldHVybiBwYWdlX3RvX3BmbihmYXVsdF9wYWdlKTsKKwkJaWYgKHZtYSA9PSBOVUxMKQorCQkJcGZuID0gZ2V0X2ZhdWx0X3BmbigpOworCQllbHNlIGlmICgodm1hLT52bV9mbGFncyAmIFZNX1BGTk1BUCkpIHsKKwkJCXBmbiA9ICgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsKKwkJCQl2bWEtPnZtX3Bnb2ZmOworCQkJQlVHX09OKCFrdm1faXNfbW1pb19wZm4ocGZuKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYXN5bmMgJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQkJKmFzeW5jID0gdHJ1ZTsKKwkJCXBmbiA9IGdldF9mYXVsdF9wZm4oKTsKIAkJfQotCi0JCXBmbiA9ICgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgdm1hLT52bV9wZ29mZjsKIAkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJQlVHX09OKCFrdm1faXNfbW1pb19wZm4ocGZuKSk7CiAJfSBlbHNlCiAJCXBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2VbMF0pOwogCkBAIC05OTMsNDAgKzExMDQsNTggQEAKIAogcGZuX3QgaHZhX3RvX3Bmbl9hdG9taWMoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuIGh2YV90b19wZm4oa3ZtLCBhZGRyLCB0cnVlKTsKKwlyZXR1cm4gaHZhX3RvX3Bmbihrdm0sIGFkZHIsIHRydWUsIE5VTEwsIHRydWUsIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaHZhX3RvX3Bmbl9hdG9taWMpOwogCi1zdGF0aWMgcGZuX3QgX19nZm5fdG9fcGZuKHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuLCBib29sIGF0b21pYykKK3N0YXRpYyBwZm5fdCBfX2dmbl90b19wZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGJvb2wgYXRvbWljLCBib29sICphc3luYywKKwkJCSAgYm9vbCB3cml0ZV9mYXVsdCwgYm9vbCAqd3JpdGFibGUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCisJaWYgKGFzeW5jKQorCQkqYXN5bmMgPSBmYWxzZTsKKwogCWFkZHIgPSBnZm5fdG9faHZhKGt2bSwgZ2ZuKTsKIAlpZiAoa3ZtX2lzX2Vycm9yX2h2YShhZGRyKSkgewogCQlnZXRfcGFnZShiYWRfcGFnZSk7CiAJCXJldHVybiBwYWdlX3RvX3BmbihiYWRfcGFnZSk7CiAJfQogCi0JcmV0dXJuIGh2YV90b19wZm4oa3ZtLCBhZGRyLCBhdG9taWMpOworCXJldHVybiBodmFfdG9fcGZuKGt2bSwgYWRkciwgYXRvbWljLCBhc3luYywgd3JpdGVfZmF1bHQsIHdyaXRhYmxlKTsKIH0KIAogcGZuX3QgZ2ZuX3RvX3Bmbl9hdG9taWMoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCiB7Ci0JcmV0dXJuIF9fZ2ZuX3RvX3Bmbihrdm0sIGdmbiwgdHJ1ZSk7CisJcmV0dXJuIF9fZ2ZuX3RvX3Bmbihrdm0sIGdmbiwgdHJ1ZSwgTlVMTCwgdHJ1ZSwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZm5fdG9fcGZuX2F0b21pYyk7CiAKK3Bmbl90IGdmbl90b19wZm5fYXN5bmMoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGJvb2wgKmFzeW5jLAorCQkgICAgICAgYm9vbCB3cml0ZV9mYXVsdCwgYm9vbCAqd3JpdGFibGUpCit7CisJcmV0dXJuIF9fZ2ZuX3RvX3Bmbihrdm0sIGdmbiwgZmFsc2UsIGFzeW5jLCB3cml0ZV9mYXVsdCwgd3JpdGFibGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX3Bmbl9hc3luYyk7CisKIHBmbl90IGdmbl90b19wZm4oc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCiB7Ci0JcmV0dXJuIF9fZ2ZuX3RvX3Bmbihrdm0sIGdmbiwgZmFsc2UpOworCXJldHVybiBfX2dmbl90b19wZm4oa3ZtLCBnZm4sIGZhbHNlLCBOVUxMLCB0cnVlLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGdmbl90b19wZm4pOwogCitwZm5fdCBnZm5fdG9fcGZuX3Byb3Qoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGJvb2wgd3JpdGVfZmF1bHQsCisJCSAgICAgIGJvb2wgKndyaXRhYmxlKQoreworCXJldHVybiBfX2dmbl90b19wZm4oa3ZtLCBnZm4sIGZhbHNlLCBOVUxMLCB3cml0ZV9mYXVsdCwgd3JpdGFibGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX3Bmbl9wcm90KTsKKwogcGZuX3QgZ2ZuX3RvX3Bmbl9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBnZm5fdCBnZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2ZuX3RvX2h2YV9tZW1zbG90KHNsb3QsIGdmbik7Ci0JcmV0dXJuIGh2YV90b19wZm4oa3ZtLCBhZGRyLCBmYWxzZSk7CisJcmV0dXJuIGh2YV90b19wZm4oa3ZtLCBhZGRyLCBmYWxzZSwgTlVMTCwgdHJ1ZSwgTlVMTCk7CiB9CiAKIGludCBnZm5fdG9fcGFnZV9tYW55X2F0b21pYyhzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGdmbiwgc3RydWN0IHBhZ2UgKipwYWdlcywKQEAgLTEwMzUsNyArMTE2NCw3IEBACiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCWdmbl90IGVudHJ5OwogCi0JYWRkciA9IGdmbl90b19odmFfbWFueShrdm0sIGdmbiwgJmVudHJ5KTsKKwlhZGRyID0gZ2ZuX3RvX2h2YV9tYW55KGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKSwgZ2ZuLCAmZW50cnkpOwogCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQlyZXR1cm4gLTE7CiAKQEAgLTEyMTksOSArMTM0OCw1MSBAQAogCXJldHVybiAwOwogfQogCitpbnQga3ZtX2dmbl90b19odmFfY2FjaGVfaW5pdChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBnZm5fdG9faHZhX2NhY2hlICpnaGMsCisJCQkgICAgICBncGFfdCBncGEpCit7CisJc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMgPSBrdm1fbWVtc2xvdHMoa3ZtKTsKKwlpbnQgb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZ3BhKTsKKwlnZm5fdCBnZm4gPSBncGEgPj4gUEFHRV9TSElGVDsKKworCWdoYy0+Z3BhID0gZ3BhOworCWdoYy0+Z2VuZXJhdGlvbiA9IHNsb3RzLT5nZW5lcmF0aW9uOworCWdoYy0+bWVtc2xvdCA9IF9fZ2ZuX3RvX21lbXNsb3Qoc2xvdHMsIGdmbik7CisJZ2hjLT5odmEgPSBnZm5fdG9faHZhX21hbnkoZ2hjLT5tZW1zbG90LCBnZm4sIE5VTEwpOworCWlmICgha3ZtX2lzX2Vycm9yX2h2YShnaGMtPmh2YSkpCisJCWdoYy0+aHZhICs9IG9mZnNldDsKKwllbHNlCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1fZ2ZuX3RvX2h2YV9jYWNoZV9pbml0KTsKKworaW50IGt2bV93cml0ZV9ndWVzdF9jYWNoZWQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgZ2ZuX3RvX2h2YV9jYWNoZSAqZ2hjLAorCQkJICAgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMgPSBrdm1fbWVtc2xvdHMoa3ZtKTsKKwlpbnQgcjsKKworCWlmIChzbG90cy0+Z2VuZXJhdGlvbiAhPSBnaGMtPmdlbmVyYXRpb24pCisJCWt2bV9nZm5fdG9faHZhX2NhY2hlX2luaXQoa3ZtLCBnaGMsIGdoYy0+Z3BhKTsKKworCWlmIChrdm1faXNfZXJyb3JfaHZhKGdoYy0+aHZhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWdoYy0+aHZhLCBkYXRhLCBsZW4pOworCWlmIChyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwltYXJrX3BhZ2VfZGlydHlfaW5fc2xvdChrdm0sIGdoYy0+bWVtc2xvdCwgZ2hjLT5ncGEgPj4gUEFHRV9TSElGVCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV93cml0ZV9ndWVzdF9jYWNoZWQpOworCiBpbnQga3ZtX2NsZWFyX2d1ZXN0X3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4sIGludCBvZmZzZXQsIGludCBsZW4pCiB7Ci0JcmV0dXJuIGt2bV93cml0ZV9ndWVzdF9wYWdlKGt2bSwgZ2ZuLCBlbXB0eV96ZXJvX3BhZ2UsIG9mZnNldCwgbGVuKTsKKwlyZXR1cm4ga3ZtX3dyaXRlX2d1ZXN0X3BhZ2Uoa3ZtLCBnZm4sIChjb25zdCB2b2lkICopIGVtcHR5X3plcm9fcGFnZSwKKwkJCQkgICAgb2Zmc2V0LCBsZW4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2NsZWFyX2d1ZXN0X3BhZ2UpOwogCkBAIC0xMjQ0LDExICsxNDE1LDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9jbGVhcl9ndWVzdCk7CiAKLXZvaWQgbWFya19wYWdlX2RpcnR5KHN0cnVjdCBrdm0gKmt2bSwgZ2ZuX3QgZ2ZuKQordm9pZCBtYXJrX3BhZ2VfZGlydHlfaW5fc2xvdChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QsCisJCQkgICAgIGdmbl90IGdmbikKIHsKLQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90OwotCi0JbWVtc2xvdCA9IGdmbl90b19tZW1zbG90KGt2bSwgZ2ZuKTsKIAlpZiAobWVtc2xvdCAmJiBtZW1zbG90LT5kaXJ0eV9iaXRtYXApIHsKIAkJdW5zaWduZWQgbG9uZyByZWxfZ2ZuID0gZ2ZuIC0gbWVtc2xvdC0+YmFzZV9nZm47CiAKQEAgLTEyNTYsNiArMTQyNSwxNCBAQAogCX0KIH0KIAordm9pZCBtYXJrX3BhZ2VfZGlydHkoc3RydWN0IGt2bSAqa3ZtLCBnZm5fdCBnZm4pCit7CisJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdDsKKworCW1lbXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIGdmbik7CisJbWFya19wYWdlX2RpcnR5X2luX3Nsb3Qoa3ZtLCBtZW1zbG90LCBnZm4pOworfQorCiAvKgogICogVGhlIHZDUFUgaGFzIGV4ZWN1dGVkIGEgSExUIGluc3RydWN0aW9uIHdpdGggaW4ta2VybmVsIG1vZGUgZW5hYmxlZC4KICAqLwpAQCAtMTQ1Nyw2ICsxNjM0LDcgQEAKIAkJaWYgKGFyZykKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2FyY2hfdmNwdV9pb2N0bF9ydW4odmNwdSwgdmNwdS0+cnVuKTsKKwkJdHJhY2Vfa3ZtX3VzZXJzcGFjZV9leGl0KHZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24sIHIpOwogCQlicmVhazsKIAljYXNlIEtWTV9HRVRfUkVHUzogewogCQlzdHJ1Y3Qga3ZtX3JlZ3MgKmt2bV9yZWdzOwpAQCAtMTgyNCw3ICsyMDAyLDcgQEAKIAogc3RhdGljIGludCBrdm1fZGV2X2lvY3RsX2NyZWF0ZV92bSh2b2lkKQogewotCWludCBmZCwgcjsKKwlpbnQgcjsKIAlzdHJ1Y3Qga3ZtICprdm07CiAKIAlrdm0gPSBrdm1fY3JlYXRlX3ZtKCk7CkBAIC0xODM3LDExICsyMDE1LDExIEBACiAJCXJldHVybiByOwogCX0KICNlbmRpZgotCWZkID0gYW5vbl9pbm9kZV9nZXRmZCgia3ZtLXZtIiwgJmt2bV92bV9mb3BzLCBrdm0sIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKKwlyID0gYW5vbl9pbm9kZV9nZXRmZCgia3ZtLXZtIiwgJmt2bV92bV9mb3BzLCBrdm0sIE9fUkRXUik7CisJaWYgKHIgPCAwKQogCQlrdm1fcHV0X2t2bShrdm0pOwogCi0JcmV0dXJuIGZkOworCXJldHVybiByOwogfQogCiBzdGF0aWMgbG9uZyBrdm1fZGV2X2lvY3RsX2NoZWNrX2V4dGVuc2lvbl9nZW5lcmljKGxvbmcgYXJnKQpAQCAtMTkyMiw3ICsyMTAwLDcgQEAKIAkma3ZtX2NoYXJkZXZfb3BzLAogfTsKIAotc3RhdGljIHZvaWQgaGFyZHdhcmVfZW5hYmxlKHZvaWQgKmp1bmspCitzdGF0aWMgdm9pZCBoYXJkd2FyZV9lbmFibGVfbm9sb2NrKHZvaWQgKmp1bmspCiB7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IHI7CkBAIC0xOTQyLDcgKzIxMjAsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGhhcmR3YXJlX2Rpc2FibGUodm9pZCAqanVuaykKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX2VuYWJsZSh2b2lkICpqdW5rKQoreworCXNwaW5fbG9jaygma3ZtX2xvY2spOworCWhhcmR3YXJlX2VuYWJsZV9ub2xvY2soanVuayk7CisJc3Bpbl91bmxvY2soJmt2bV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZV9ub2xvY2sodm9pZCAqanVuaykKIHsKIAlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMTk1MiwxMyArMjEzNywyMCBAQAogCWt2bV9hcmNoX2hhcmR3YXJlX2Rpc2FibGUoTlVMTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX2Rpc2FibGUodm9pZCAqanVuaykKK3sKKwlzcGluX2xvY2soJmt2bV9sb2NrKTsKKwloYXJkd2FyZV9kaXNhYmxlX25vbG9jayhqdW5rKTsKKwlzcGluX3VubG9jaygma3ZtX2xvY2spOworfQorCiBzdGF0aWMgdm9pZCBoYXJkd2FyZV9kaXNhYmxlX2FsbF9ub2xvY2sodm9pZCkKIHsKIAlCVUdfT04oIWt2bV91c2FnZV9jb3VudCk7CiAKIAlrdm1fdXNhZ2VfY291bnQtLTsKIAlpZiAoIWt2bV91c2FnZV9jb3VudCkKLQkJb25fZWFjaF9jcHUoaGFyZHdhcmVfZGlzYWJsZSwgTlVMTCwgMSk7CisJCW9uX2VhY2hfY3B1KGhhcmR3YXJlX2Rpc2FibGVfbm9sb2NrLCBOVUxMLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZV9hbGwodm9pZCkKQEAgLTE5NzcsNyArMjE2OSw3IEBACiAJa3ZtX3VzYWdlX2NvdW50Kys7CiAJaWYgKGt2bV91c2FnZV9jb3VudCA9PSAxKSB7CiAJCWF0b21pY19zZXQoJmhhcmR3YXJlX2VuYWJsZV9mYWlsZWQsIDApOwotCQlvbl9lYWNoX2NwdShoYXJkd2FyZV9lbmFibGUsIE5VTEwsIDEpOworCQlvbl9lYWNoX2NwdShoYXJkd2FyZV9lbmFibGVfbm9sb2NrLCBOVUxMLCAxKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJmhhcmR3YXJlX2VuYWJsZV9mYWlsZWQpKSB7CiAJCQloYXJkd2FyZV9kaXNhYmxlX2FsbF9ub2xvY2soKTsKQEAgLTIwMDgsMjcgKzIyMDAsMTkgQEAKIAljYXNlIENQVV9TVEFSVElORzoKIAkJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBlbmFibGluZyB2aXJ0dWFsaXphdGlvbiBvbiBDUFUlZFxuIiwKIAkJICAgICAgIGNwdSk7Ci0JCXNwaW5fbG9jaygma3ZtX2xvY2spOwogCQloYXJkd2FyZV9lbmFibGUoTlVMTCk7Ci0JCXNwaW5fdW5sb2NrKCZrdm1fbG9jayk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gTk9USUZZX09LOwogfQogCiAKLWFzbWxpbmthZ2Ugdm9pZCBrdm1faGFuZGxlX2ZhdWx0X29uX3JlYm9vdCh2b2lkKQorYXNtbGlua2FnZSB2b2lkIGt2bV9zcHVyaW91c19mYXVsdCh2b2lkKQogewotCWlmIChrdm1fcmVib290aW5nKSB7Ci0JCS8qIHNwaW4gd2hpbGUgcmVzZXQgZ29lcyBvbiAqLwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXdoaWxlICh0cnVlKQotCQkJY3B1X3JlbGF4KCk7Ci0JfQogCS8qIEZhdWx0IHdoaWxlIG5vdCByZWJvb3RpbmcuICBXZSB3YW50IHRoZSB0cmFjZS4gKi8KIAlCVUcoKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGt2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9zcHVyaW91c19mYXVsdCk7CiAKIHN0YXRpYyBpbnQga3ZtX3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLCB1bnNpZ25lZCBsb25nIHZhbCwKIAkJICAgICAgdm9pZCAqdikKQEAgLTIwNDEsNyArMjIyNSw3IEBACiAJICovCiAJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBleGl0aW5nIGhhcmR3YXJlIHZpcnR1YWxpemF0aW9uXG4iKTsKIAlrdm1fcmVib290aW5nID0gdHJ1ZTsKLQlvbl9lYWNoX2NwdShoYXJkd2FyZV9kaXNhYmxlLCBOVUxMLCAxKTsKKwlvbl9lYWNoX2NwdShoYXJkd2FyZV9kaXNhYmxlX25vbG9jaywgTlVMTCwgMSk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIApAQCAtMjIxMSw3ICsyMzk1LDcgQEAKIHN0YXRpYyBpbnQga3ZtX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCWlmIChrdm1fdXNhZ2VfY291bnQpCi0JCWhhcmR3YXJlX2Rpc2FibGUoTlVMTCk7CisJCWhhcmR3YXJlX2Rpc2FibGVfbm9sb2NrKE5VTEwpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjE5LDcgKzI0MDMsNyBAQAogewogCWlmIChrdm1fdXNhZ2VfY291bnQpIHsKIAkJV0FSTl9PTihzcGluX2lzX2xvY2tlZCgma3ZtX2xvY2spKTsKLQkJaGFyZHdhcmVfZW5hYmxlKE5VTEwpOworCQloYXJkd2FyZV9lbmFibGVfbm9sb2NrKE5VTEwpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIzMzYsNiArMjUyMCwxMCBAQAogCQlnb3RvIG91dF9mcmVlXzU7CiAJfQogCisJciA9IGt2bV9hc3luY19wZl9pbml0KCk7CisJaWYgKHIpCisJCWdvdG8gb3V0X2ZyZWU7CisKIAlrdm1fY2hhcmRldl9vcHMub3duZXIgPSBtb2R1bGU7CiAJa3ZtX3ZtX2ZvcHMub3duZXIgPSBtb2R1bGU7CiAJa3ZtX3ZjcHVfZm9wcy5vd25lciA9IG1vZHVsZTsKQEAgLTIzNDMsNyArMjUzMSw3IEBACiAJciA9IG1pc2NfcmVnaXN0ZXIoJmt2bV9kZXYpOwogCWlmIChyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAia3ZtOiBtaXNjIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9mcmVlOworCQlnb3RvIG91dF91bnJlZzsKIAl9CiAKIAlrdm1fcHJlZW1wdF9vcHMuc2NoZWRfaW4gPSBrdm1fc2NoZWRfaW47CkBAIC0yMzUzLDYgKzI1NDEsOCBAQAogCiAJcmV0dXJuIDA7CiAKK291dF91bnJlZzoKKwlrdm1fYXN5bmNfcGZfZGVpbml0KCk7CiBvdXRfZnJlZToKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koa3ZtX3ZjcHVfY2FjaGUpOwogb3V0X2ZyZWVfNToKQEAgLTIzODUsMTEgKzI1NzUsMTIgQEAKIAlrdm1fZXhpdF9kZWJ1ZygpOwogCW1pc2NfZGVyZWdpc3Rlcigma3ZtX2Rldik7CiAJa21lbV9jYWNoZV9kZXN0cm95KGt2bV92Y3B1X2NhY2hlKTsKKwlrdm1fYXN5bmNfcGZfZGVpbml0KCk7CiAJc3lzZGV2X3VucmVnaXN0ZXIoJmt2bV9zeXNkZXYpOwogCXN5c2Rldl9jbGFzc191bnJlZ2lzdGVyKCZrdm1fc3lzZGV2X2NsYXNzKTsKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigma3ZtX3JlYm9vdF9ub3RpZmllcik7CiAJdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmt2bV9jcHVfbm90aWZpZXIpOwotCW9uX2VhY2hfY3B1KGhhcmR3YXJlX2Rpc2FibGUsIE5VTEwsIDEpOworCW9uX2VhY2hfY3B1KGhhcmR3YXJlX2Rpc2FibGVfbm9sb2NrLCBOVUxMLCAxKTsKIAlrdm1fYXJjaF9oYXJkd2FyZV91bnNldHVwKCk7CiAJa3ZtX2FyY2hfZXhpdCgpOwogCWZyZWVfY3B1bWFza192YXIoY3B1c19oYXJkd2FyZV9lbmFibGVkKTsK